[
  {
    "path": ".gitignore",
    "content": ".directory\n*.a\n*.o\n._*\n*.user\nMakefile*\nmoc_*\n*~\n.DS_Store\nbuild\n*.axe\n*.md5\nnode_modules/\nmetadata.desktop\n\n###IntelliJ###\n\n*.iml\n*.ipr\n*.iws\n.idea/"
  },
  {
    "path": "4shared/content/contents/code/4shared.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2011, lasconic <lasconic@gmail.com>\n *   Fixed in 2014 by Lorenz Hübschle-Schneider <lorenz@4z2.de>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU General Public License as published by\n *   the Free Software Foundation, either version 3 of the License, or\n *   (at your option) any later version.\n *\n *   Tomahawk is distributed in the hope that it will be useful,\n *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n *   GNU General Public License for more details.\n *\n *   You should have received a copy of the GNU General Public License\n *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar FSharedResolver = Tomahawk.extend(TomahawkResolver, {\n    settings: {\n        name: '4shared',\n        icon: '4shared-icon.png',\n        weight: 50,\n        timeout: 5\n    },\n    resolve: function (qid, artist, album, title) {\n        // Parse a file detail page\n        var parseFileDetailPage = function (fileXhr) {\n\n            var response = fileXhr.responseText,\n                urlRegex = /<\\!-- file: (https?:\\/\\/.*\\.mp3) -->/gi,\n                durationRegex = /options_[0-9]+\\['duration'\\] = '([0-9]+).0';/gi,\n                bitrateRegex = /<b>Bit Rate:<\\/b>\\n\\s+([0-9]+) kbps \\|/gi,\n                match;\n\n            // Find mp3 URL\n            match = urlRegex.exec(response);\n            if (!match) {\n                return;\n            }\n            var mp3Url = match[1];\n\n            // Find track duration\n            match = durationRegex.exec(response);\n            var duration = match ? parseInt(match[1], 10) : null;\n\n            // Try to find bit rate (only present on some files)\n            match = bitrateRegex.exec(response);\n            var bitrate = match ? parseInt(match[1], 10) : 128;\n\n            var result = {\n                artist: artist,\n                album: album,\n                track: title,\n                source: that.settings.name,\n                url: mp3Url,\n                duration: duration,\n                extension: 'mp3',\n                bitrate: bitrate,\n                score: 0.80\n            };\n\n            // return this result\n            Tomahawk.addTrackResults({\n                qid: qid,\n                results: [result]\n            });\n        };\n\n        // build query to 4shared\n        var request = [title, artist].join(\" \").trim();\n\n        var url = \"http://search.4shared.com/network/searchXml.jsp?q=\";\n        url += encodeURIComponent(request);\n        url += \"&searchExtention=mp3&sortType=1&sortOrder=1&searchmode=3\";\n\n        // send request and parse it into javascript\n        var that = this;\n        Tomahawk.asyncRequest(url, function (xhr) {\n            // parse xml\n            var domParser = new DOMParser(),\n                xmlDoc = domParser.parseFromString(xhr.responseText, \"text/xml\"),\n                results = xmlDoc.getElementsByTagName(\"result-files\");\n\n            // check the response\n            if (results.length > 0 && results[0].childNodes.length > 0) {\n                var links = xmlDoc.getElementsByTagName(\"file\"),\n                    link, fileDetailUrl;\n\n                // walk through the results\n                for (var i = 0; i < links.length; i++) {\n                    link = links[i];\n                    fileDetailUrl = link.getElementsByTagName(\"url\")[0].textContent;\n                    fileDetailUrl = decodeURI(fileDetailUrl);\n                    // process this file detail page\n                    Tomahawk.asyncRequest(fileDetailUrl, parseFileDetailPage);\n                }\n            }\n        });\n    },\n    search: function (qid, searchString) {\n        return {\n            qid: qid,\n            results: []\n        };\n    }\n});\n\nTomahawk.resolver.instance = FSharedResolver;\n"
  },
  {
    "path": "4shared/content/metadata.json",
    "content": "{\n    \"name\": \"4Shared\",\n    \"pluginName\": \"4shared\",\n    \"author\": \"lasconic\",\n    \"email\": \"lasconic@gmail.com\",\n    \"version\": \"0.1.6\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Looks for tracks to play from www.4shared.com.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/4shared.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"resources\": [\n            \"contents/code/4shared-icon.png\"\n        ]\n    }\n}\n"
  },
  {
    "path": "8tracks/content/contents/code/8tracks.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2011, Janez Troha (https://github.com/dz0ny)\n *   Copyright 2011, Leo Franchi <lfranchi@kde.org>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU General Public License as published by\n *   the Free Software Foundation, either version 3 of the License, or\n *   (at your option) any later version.\n *\n *   Tomahawk is distributed in the hope that it will be useful,\n *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n *   GNU General Public License for more details.\n *\n *   You should have received a copy of the GNU General Public License\n *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar EightTracksResolver = Tomahawk.extend(TomahawkResolver, {\n    settings: {\n        name: '8tracks Resolver',\n        weight: 80,\n        timeout: 5,\n        api: \"1442c0d04625c9d959527ae7d4a430afe9d2d1d9\",\n        token: null\n    },\n    init: function() {\n        this.settings.token = window.localStorage[\"play_token\"];\n        if (!this.settings.token) {\n            var that = this;\n            this.get(\"http://8tracks.com/sets/new.json?api_key=\"+this.settings.api, true, function(data) {\n                that.settings.token = data.play_token;\n            });\n        }\n    },\n    get: function (url, force, callback) {\n      var cached = window.sessionStorage[url];\n      if (!cached || force) {\n          Tomahawk.asyncRequest(url, function(xhr){\n              callback.call(window, JSON.parse(xhr.responseText));\n              window.sessionStorage[url] = xhr.responseText;\n           });\n      } else {\n          callback.call(window, JSON.parse(cached));\n      }\n    },\n    resolve: function (qid, artist, album, title) {\n        if(!this.settings.token) // either wait for init fetch to work, or give up\n            return;\n\n        var api = this.settings.api;\n        var token = this.settings.token;\n        var url = \"http://8tracks.com/mixes.json?api_key=\"+api+\"&per_page=1&sort=popular&q=\";\n            \n        if(artist != \"\" )\n            url += artist.replace(\" \",\"+\");\n        \n        var doGet = this.get;\n        if (!window.localStorage[artist+album+title]) {\n            doGet(url, true, function(data) {\n                var res = data.mixes;\n                if (res.length) {\n                    doGet(\"http://8tracks.com/sets/\"+token+\"/play.json?api_key=\"+api+\"&mix_id=\"+res[0].id, false, function(data) {\n                        var track = data.set.track;\n                        var response = { results: [] };\n                        response.qid = qid;\n                        response.results.push({\n                            artist   : track.performer\n                            , track    : track.name \n                            , album    : track.release_name \n                            , year     : track.year \n                            , url      : track.url \n                            , duration : track.play_duration \n                            , source   : \"8tracks\" \n                            , score    : 1.00\n                        });\n                        window.localStorage[artist+album+track] = JSON.stringify(response.results)\n                        Tomahawk.addTrackResults(response);\n                    });\n                }\n            });\n        } else {\n            var response = { results: [] };\n            response.qid = qid;\n            response.results = JSON.parse(window.localStorage[artist+album+title]);\n            return response;\n        } \n    },\n  \n    search: function (qid, searchString) {\n        var return1 = {\n            qid: qid,\n            results: new Array()\n        };\n        return return1;\n    }\n});\n\nTomahawk.resolver.instance = EightTracksResolver;"
  },
  {
    "path": "8tracks/content/metadata.json",
    "content": "{\n    \"name\": \"8tracks\",\n    \"pluginName\": \"8tracks\",\n    \"author\": \"Janez and Leo\",\n    \"email\": \"lfranchi@kde.org\",\n    \"version\": \"0.1\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Looks for tracks to play from 8tracks.com.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/8tracks.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"resources\": [\n            \"contents/code/8tracks-icon.png\"\n        ]\n    }\n}\n"
  },
  {
    "path": "HACKING.md",
    "content": "# Tomahawk Resolvers Developer Documentation\n\n## Developing resolvers\n\nThe best way to get you started with writing your own Resolver is by looking at the [`Example Resolver`](https://github.com/tomahawk-player/tomahawk-resolvers/tree/master/examples/javascript). It's well documented and includes almost every aspect of the Tomahawk Resolver API.\n\nThe API you should develop against is defined in [`tomahawk.js`](https://github.com/tomahawk-player/tomahawk/blob/master/data/js/tomahawk.js) and [`JSResolverHelper`](https://github.com/tomahawk-player/tomahawk/blob/master/src/libtomahawk/resolvers/JSResolverHelper.h) in the Tomahawk main repo. This API is also being used in the [`Tomahawk Android`](https://github.com/tomahawk-player/tomahawk-android) App. Furthermore we also have an implementation in [`NodeJS`](https://github.com/xhochy/node-tomahawkjs). This means that you only have to write one resolver and have it work right away on Desktop, Android and Node!\n\nSince apiVersion 0.9 the resolver API has changed quite a bit.\nPreviously this was the way of returning results to Tomahawk in the \"resolve\"-function:\n```javascript\nresolve: function(qid, artist, album, track) {\n    var results = getResultArray(artist, album, track);\n    Tomahawk.addTrackResults(qid, results);\n}\n```\nNow with the new promise-based API, the same implementation would be like this:  \n```javascript\nresolve: function (params) {\n    return getResultArray(params.artist, params.album, params.track);\n}\n```\nYou can get the function parameters from the params map. Instead of relying on callback functions you are now able to return your results directly. Alternatively you can also return an RSVP.Promise object. But the real power of promises only becomes clear when you look at the way a \"resolve\"-request is normally being implemented in the real world:  \n```javascript\nresolve: function (params) {\n    var q = params.artist + \" \" + params.track;\n    return Tomahawk.get(\"http://someurl.org/search?q=\" + q).then(function (result) {\n        var results = parseResultArray(result);\n        if (!results) {\n            throw new Error(\"Sry, couldn't get results\");\n        } else {\n            return results;\n        }\n    });\n}\n```\nIn one compact code block we are able to make a request. Then we parse the given \"result\" and simply return it without having to care about any request-id(qid) or callback-function. In addition we have a neat way of throwing an Error when something went wrong. Not to mention all the nice magic that comes with promise-functions like \"all\". If you're interested you might want to check out this great tutorial by Jake Archibald http://www.html5rocks.com/en/tutorials/es6/promises/. \n\nIf you have questions, look for us in #tomahawk on irc.freenode.net.\n\n### Licensing\n\nTomahawk resolvers are _not_ considered derivative works of Tomahawk. The resolver API is public, and resolvers could potentially be used without Tomahawk. The previously mentioned `tomahawk.js` file is non-copyleft open source, released under a permissive X11-style license.\n\nDevelopers who create and release a resolver have no further obligation as far as licensing and distribution is concerned.\n\n## Packaging resolvers\n\n### Structure overview\n\nStarting with Tomahawk 0.7, all resolver directories must be structured as follows.\n\nMandatory:\n```\ncontent/\n  + metadata.json\n```\nSuggested:\n```\ncontent/\n  + metadata.json\n  + contents/\n    + code/\n      + <resolver script>.js\n      + config.ui\n      + <everything else>\n    + images/\n      + icon.png\n```\n\nThis structure is commonly referred to as a resolver bundle, i.e. a resolver script with all related files and metadata.\n\nA bundle can be packaged or unpackaged (i.e. as it is in this repo), thus resolvers can be installed manually in two ways:\n* from an unpackaged bundle,\n* from a package (or axe).\n\n### Installing a resolver bundle\n\nTo install a resolver from an unpackaged bundle (the preferred way for testing and development), in Tomahawk's Settings dialog click on \"Install from file\" and select the resolver's main .js file.\n\nKeep in mind that with such a path, Tomahawk expects to find the file `metadata.json` in `../..` from the main script's path. If `metadata.json` is not found, it is likely that your resolver directory is not structured properly. The resolver's main script will still be loaded, but any additional scripts will not and the accounts list in the Settings dialog will not show any metadata for the resolver (e.g. author, version, etc.). This is a **bad thing**. The only reason why a resolver without `metadata.json` is still loaded is backward compatibility. Plain unbundled .js files as resolvers are deprecated. You should update your resolver to a proper bundle structure as soon as possible.\n\nA packaged resolver bundle is a file with file extension `axe`. It is a compressed archive with all the contents of a resolver directory. To install such a bundle (the preferred way for end users who wish to install a resolver manually), in Tomahawk's Settings dialog click on \"Install from file\" and select the package file (`<something>.axe`).\n\n**WARNING** for developers and testers: the installation process for an *unpackaged* bundle loads the resolver in-place. This means that any changed to the resolver script are applied immediately, simply by disabling and re-enabling the \"installed\" resolver with the account's checkbox in the accounts list. There is usually no need to remove and re-install the resolver. This also means that changes to the directory structure may make the resolver stop functioning. On the other hand, packaged bundles (axes) are decompressed and copied to a Tomahawk-managed directory (`<local user data dir>/manualresolvers`) during the installation process, so any change to the axe can only be applied by re-installing.\n\n### Packaging\n\n#### metadata.json\n\nEvery resolver bundle directory must contain a metadata file. This file must be named `metadata.json`, and it must be located in the directory `content` relative to the top-level resolver bundle directory.\n\nFor example, this is a `metadata.json` file for Subsonic:\n```\n{\n    \"name\": \"Subsonic\",\n    \"pluginName\": \"subsonic\",\n    \"author\": \"mack_t and Teo\",\n    \"email\": \"teo@kde.org\",\n    \"version\": \"0.5\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Searches your Subsonic server for music to play\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/subsonic.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"resources\": [\n            \"contents/code/config.ui\",\n            \"contents/code/runnersid-icon.png\",\n            \"contents/code/subsonic-icon.png\",\n            \"contents/code/subsonic.png\"\n        ]\n    }\n}\n```\n\nFor most purposes all the fields are mandatory.\n\n**WARNING**: the manifest object **must** list all the files required by the resolver. Unlisted scripts will not be loaded, and any unlisted files will not be packaged.\n\n#### makeaxe.rb\n\nIf your resolver directory conforms to the previously described structure and your `metadata.json` is complete, the harder part is done. The Tomahawk team provides you with a script to automate the packaging process: [`makeaxe.rb`](admin/makeaxe.rb). You will need [ruby](http://www.ruby-lang.org/en/) 1.9.2 or later and the [zip](https://rubygems.org/gems/zip) gem.\n\nTo create a package from a resolver directory, simply run `makeaxe.rb` with the directory path passed as parameter.\n\nE.g. on Linux and Mac OS X, for Subsonic and from the repository root, you would do the following:\n```\n% ruby admin/makeaxe.rb subsonic\n% ls subsonic\ncontent/  subsonic-0.5.axe  subsonic-0.5.md5\n```\nIn this case, `subsonic-0.5.axe` is the compressed bundle and `subsonic-0.5.md5` is the MD5 checksum file.\n\nPlease note that `makeaxe.rb` does not simply compress the contents of the directory, it also checks the metadata file and adds additional data, including a packaging timestamp and the revision hash, if any.\n\nOptionally, if you pass the `--release` parameter to `makeaxe.rb` it will not include the commit hash in the axe, as would be expected in a release-worthy package.\n\nHappy packaging!\n"
  },
  {
    "path": "README.md",
    "content": "# Tomahawk Resolvers\n\nSupported resolvers are distributed and updated automatically through Tomahawk's Settings dialog.\nTo manually install a resolver either \n* clone this repo, or\n* download the .zip (see .zip button at the top of the repo page at https://github.com/tomahawk-player/tomahawk-resolvers), or \n* download all the files within the individual resolver folder you are installing.\n\nAfter you have the files locally, open Tomahawk's preferences and from the \"Services\" tab click \"Install from File\" and select the .axe or .js file for the resolver you are installing.\n\nSince March 2013 Tomahawk resolvers have switched to a new directory structure for easy packaging. Ideally, you should download [nightly .axe files](http://teom.org/axes/nightly/), if available.\n\nFor developer documentation, see [HACKING.md](HACKING.md).\n\n## Capabilities\n\nNot all resolvers feature the same capabilities, this is either due to the lacking capabilities of the service they connect to or that the capability is not yet implemented.\nSome of the features need authentication (e.g. being a premium subscriber to this service), some can be used without any subscription or authentication at all.\n\n**Available Capabilities:**\n* **Resolving**: Given a tuple of `Artist,Track` (or a triple `Artist,Album,Track`) return a stream URL (and some metadata about it) so that one can play this track.\n* **Search**: (Fuzzily) find tracks, artists and albums on all services matching a query that can be streamed.\n* **Open Artist URL**: Given an URL about an artist of a service, return the information about that. (This opens the artist page in Tomahawk).\n* **Open Album URL**: Given an URL about an album of a service, return the information about that. (This opens the album page in Tomahawk).\n* **Open Playlist**: Given an URL about a playlist of a service, return the information about that. (This imports the playlist in Tomahawk if it was not previously imported)\n* **Open Track URL**: Given an URL about a track of a service, return the information about that. (This opens the track page in Tomahawk and plays it).\n* **Collection**: Browse the collection of music stored by the user in this service.\n\n**Legend:**\n* ✔ - Supports without authentication\n* :key: - Authentication required\n* ? - Unknown\n* ✘ - No support for this capability\n\n**Notes:**\n* Some services can search without being authenticated but only resolve after authentication. At the moment, we do not support this in Tomahawk but this may change in future.\n\n| *Resolver* | Resolving | Search | Open Artist URL | Open Album URL | Open Playlist | Open Track URL | Collection |\n|:----------:|:---------:|:------:|:---------------:|:--------------:|:-------------:|:--------------:|:----------:|\n| 4shared    | ✔         | ✔      | ✘               | ✘              | ✘             | ✘              | ✘          |\n| 8tracks    | ✔         | ✔      | ✘               | ✘              | ✘             | ✘              | ✘          |\n| ampache    | :key:     | :key:  | ✘               | ✘              | ✘             | ✘              | :key:      |\n| bandcamp   | ✔         | ✘      | ✔               | ✔              | ✘             | ✔              | ✘          |\n| beatsmusic | :key:     | ✔      | ✔               | ✔              | :key:         | ✔              | ✘          |\n| beets      | :key:     | :key:  | ✘               | ✘              | ✘             | ✘              | :key:      |\n| deezer-metadata | ✘    | ✘      | ✔               | ✔              | ✔             | ✔              | ✘          |\n| dilandau   | ✔         | ✔      | ✘               | ✘              | ✘             | ✘              | ✘          |\n| exfm       | ✔         | ✔      | ✘               | ✘              | ✔             | ✔              | ✘          |\n| grooveshark | :key:    | :key:  | ✘               | ✘              | ✘             | ✘              | ✘          |\n| jamendo    | ✔         | ✔      | ✘               | ✘              | ✘             | ✘              | ✘          |\n| jazz-on-line | ?       | ?      | ?               | ?              | ?             | ?              | ?          |\n| lastfm     | ✔         | ✘      | ✔               | ✔              | ✘             | ✔              | ✘          |\n| muzebra    | ✔         | ✔      | ✘               | ✘              | ✘             | ✘              | ✘          |\n| officialfm | ✔         | ✔      | ✘               | ✘              | ✘             | ✘              | ✘          |\n| qobuz      | :key:     | :key:  | ✘               | ✘              | ✘             | ✘              | ✘          |\n| rdio-metadata | ✘      | ✘      | ✔               | ✔              | ✔             | ✔              | ✘          |\n| soundcloud | ✔         | ✔      | ✔               | ✔              | ✔             | ✔              | ✘          |\n| spotify-metadata | ✘   | ✘      | ✔               | ✔              | ✔             | ✔              | ✘          |\n| spotify    | :key:     | :key:  | ✘               | ✘              | :key:         | ✘              | ✘          |\n| subsonic   | :key:     | :key:  | ✘               | ✘              | ✘             | ✘              | :key:      |\n| synology-audiostation  | :key:  | :key:           | ✘              | ✘             | ✘              | ✘          | :key:    |\n| tomahk-metadata | ✘    | ✘      | ✔               | ✔              | ✔             | ✔              | ✘          |\n| vibe3      | ✔         | ✔      | ✘               | ✘              | ✘             | ✘              | ✘          |\n| vkontakte  | ✔         | ✔      | ✘               | ✘              | ✘             | ✘              | ✘          |\n| youtube    | ✔         | ✔      | ✘               | ✘              | ✘             | ✘              | ✘          |\n| youtube-metadata    | ✘         | ✘      | ✘               | ✘              | ✔             | ✔              | ✘          |\n"
  },
  {
    "path": "admin/json2desktop.rb",
    "content": "#!/usr/bin/env ruby\n# === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n#\n#   Copyright 2013, Teo Mrnjavac <teo@kde.org>\n#\n#   Tomahawk is free software: you can redistribute it and/or modify\n#   it under the terms of the GNU General Public License as published by\n#   the Free Software Foundation, either version 3 of the License, or\n#   (at your option) any later version.\n#\n#   Tomahawk is distributed in the hope that it will be useful,\n#   but WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n#   GNU General Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License\n#   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.\n\n\n#\n# This script converts a json metadata/manifest file into a desktop file for Synchrotron.\n#\n\nrequire 'json'\n\nif ARGV.length < 1\n    puts \"This script converts a Tomahawk resolver's metadata/manifest JSON file\"\n    puts \"into a desktop file for Synchrotron.\"\n    puts \"Usage: ruby json2desktop.rb path_to_metadata_file.json\"\n    exit\nend\n\ninputPath = File.absolute_path( ARGV[0] )\noutputPath = File.join( File.dirname( inputPath ), \"metadata.desktop\" )\n\nif not File.exists?( inputPath ) or not File.readable?( inputPath )\n    puts \"Cannot read input file.\"\n    exit\nend\n\nif File.exists?( outputPath ) and not File.writable?( outputPath )\n    puts \"Cannot write to output file.\"\n    exit\nend\n\ninputFile = File.open( inputPath, 'r' )\ninputString = inputFile.read\ninput = JSON.parse( inputString )\ninputFile.close unless inputFile == nil\n\n# check if outputPath exists, maybe save stuff and/or overwrite, yes?\nFile.open( outputPath, 'w' ) do |f|\n    f.write \"\\\n############################################################################\n## Desktop file generated from JSON file '#{File.basename( inputPath )}' \n##\n## Created: #{Time.now.utc.to_s}\n##      by: json2desktop.rb, https://github.com/tomahawk-player\n##\n##                         #### WARNING! ####\n##              All changes made to this file will be lost!\n############################################################################\n\n[Desktop Entry]\\n\"\n\n    unless input[\"name\"].nil? || input[\"name\"].empty?\n        f.write \"Name=#{input[\"name\"]}\\n\"\n    end\n\n    unless input[\"description\"].nil? || input[\"description\"].empty?\n        f.write \"Comment=#{input[\"description\"]}\\n\"\n    end\n    \n    f.write \"\\nType=Service\\nX-KDE-ServiceTypes=Tomahawk/Resolver\\n\"\n    \n    unless input[\"manifest\"].nil?\n        unless input[\"manifest\"][\"main\"].nil? || input[\"manifest\"][\"main\"].empty?\n            f.write \"X-Synchrotron-MainScript=#{input[\"manifest\"][\"main\"]}\\n\"\n        end\n    end\n\n    unless input[\"platform\"].nil? || input[\"platform\"].empty? || input[\"platform\"] == \"any\"\n        f.write \"X-Synchrotron-Type=#{input[\"platform\"]}\\n\"\n    end\n\n    unless input[\"tomahawkVersion\"].nil? || input[\"tomahawkVersion\"].empty?\n        f.write \"X-Synchrotron-Requires-Tomahawk-Version=#{input[\"tomahawkVersion\"]}\\n\"\n    end\n    f.write \"\\n\"\n    \n    unless input[\"pluginName\"].nil? || input[\"pluginName\"].empty?\n        f.write \"X-KDE-PluginInfo-Name=#{input[\"pluginName\"]}\\n\"\n    end\n    \n    f.write \"X-KDE-PluginInfo-Category=Resolver\\n\"\n\n    unless input[\"author\"].nil? || input[\"author\"].empty?\n        f.write \"X-KDE-PluginInfo-Author=#{input[\"author\"]}\\n\"\n    end\n\n    unless input[\"email\"].nil? || input[\"email\"].empty?\n        f.write \"X-KDE-PluginInfo-Email=#{input[\"email\"]}\\n\"\n    end\n\n    unless input[\"version\"].nil? || input[\"version\"].empty?\n        f.write \"X-KDE-PluginInfo-Version=#{input[\"version\"]}\\n\"\n    end\n\n    unless input[\"website\"].nil? || input[\"website\"].empty?\n        f.write \"X-KDE-PluginInfo-Website=#{input[\"website\"]}\\n\"\n    end\nend\n"
  },
  {
    "path": "admin/makeaxe.rb",
    "content": "#!/usr/bin/env ruby\n# === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n#\n#   Copyright 2013, Teo Mrnjavac <teo@kde.org>\n#\n#   Tomahawk is free software: you can redistribute it and/or modify\n#   it under the terms of the GNU General Public License as published by\n#   the Free Software Foundation, either version 3 of the License, or\n#   (at your option) any later version.\n#\n#   Tomahawk is distributed in the hope that it will be useful,\n#   but WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n#   GNU General Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License\n#   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.\n\n\n#\n# This script reads a json metadata/manifest file and creates a Tomahawk\n# resolver bundle (axe).\n# The script should be executed with the top-level resolver directory path as\n# parameter, and expects the following structure:\n# Mandatory:\n# content/\n#   + metadata.json\n# Suggested:\n# content/\n#   + metadata.json\n#   + contents/\n#     + code/\n#       + <resolver script>.js\n#       + config.ui\n#       + <everything else>\n#     + images/\n#       + icon.png\n#\n\nrequire 'rubygems'\nrequire 'json'\nrequire 'zipruby'\nrequire 'digest/md5'\n\nBUNDLEVERSION = 1 #might never be used but best to plan ahead\n\ndef usage\n    puts \"This script creates a Tomahawk resolver bundle.\"\n    puts \"\\nMake sure you have the zipruby gem.\"\n    puts \"\\nUsage: ruby makeaxe.rb path_to_resolver_directory [options]\"\n    puts \" --release\\tskip trying to add the git revision hash to the bundle\"\n    puts \" --help\\t\\tthis help message\"\nend\n\nif ARGV.length < 1 or not ARGV.delete( \"--help\" ).nil?\n    usage\n    exit\nend\n\nif not ARGV.delete( \"--release\" ).nil?\n    release = true\nelse\n    release = false\nend\n\ninputPath = File.absolute_path( ARGV[0] )\n\nif not Dir.exists?( inputPath )\n    puts \"Bad input directory path.\"\n    exit\nend\n\nmetadataRelPath = \"content/metadata.json\"\nmetadataPath = File.join( inputPath, metadataRelPath )\n\nif not File.exists?( metadataPath ) or not File.readable?( metadataPath )\n    puts \"Cannot find metadata file.\"\n    puts \"Make sure #{metadataRelPath} exists and is readable.\"\n    exit\nend\n\nmetadataFile = File.open( metadataPath, 'r' )\nmetadataString = metadataFile.read\nmetadata = JSON.parse( metadataString )\nmetadataFile.close unless metadataFile == nil\n\nif not metadata[\"pluginName\"].nil? and\n   not metadata[\"name\"].nil? and\n   not metadata[\"version\"].nil? and\n   not metadata[\"description\"].nil? and\n   not metadata[\"type\"].nil? and\n   not metadata[\"manifest\"].nil? and\n   not metadata[\"manifest\"][\"main\"].nil? and\n   not metadata[\"manifest\"][\"icon\"].nil?\n    outputPath = File.join( inputPath, metadata[\"pluginName\"] + \"-\" + metadata[\"version\"] + \".axe\" )\n    puts \"Bundle metadata looks ok.\"\nelse\n    puts \"Bad metadata file.\"\n    exit\nend\n\n# Let's add some stuff to the metadata file, this is information that's much\n# easier to fill in automatically now than manually whenever.\n#   * Timestamp of right now i.e. packaging time.\n#   * Git revision because it makes sense, especially during development.\n#   * Bundle format version, which might never be used but we add it just in\n#     case we ever need to distinguish one bundle format from another.\n# We save it all as _metadata.json, which then gets added to the archive as\n# metadata.json instead of the original one.\n_metadataPath = File.join( inputPath, \"content/_metadata.json\" )\nif not File.exists?( _metadataPath ) or File.writable?( _metadataPath )\n    File.open( _metadataPath, 'w' ) do |f|\n        metadata[\"timestamp\"] = Time.now.utc.to_i\n        \n        unless release\n            gitCmd = \"git rev-parse --short HEAD 2>&1\"\n            inGit = system( gitCmd + \"&>/dev/null\" ) #will return true only if we're in a repo\n            if inGit\n                revision = %x[ #{gitCmd} ].sub( \"\\n\", \"\" )\n                metadata[\"revision\"] = revision\n            end\n        end\n        \n        metadata[\"bundleVersion\"] = BUNDLEVERSION\n        \n        f.write( JSON.pretty_generate( metadata ) )\n    end\nend\n\n# Let's do some zipping according to the manifest.\nfilesToZip = []\nbegin\n    m = metadata[\"manifest\"]\n    filesToZip << File.join( \"content\", m[\"main\"] )\n    m[\"scripts\"].each do |s|\n        filesToZip << File.join( \"content\", s )\n    end\n    filesToZip << File.join( \"content\", m[\"icon\"] )\n    if not m[\"iconBackground\"].nil?\n        filesToZip << File.join( \"content\", m[\"iconBackground\"] )\n    end\n    if not m[\"iconWhite\"].nil?\n        filesToZip << File.join( \"content\", m[\"iconWhite\"] )\n    end\n    m[\"resources\"].each do |s|\n        filesToZip << File.join( \"content\", s )\n    end\nend\n\nputs \"Creating package for #{metadata[\"name\"]}: '#{File.basename( outputPath )}'.\"\n\nif File.exists?( outputPath )\n    File.delete( outputPath )\nend\n\nZip::Archive.open( outputPath, Zip::CREATE | Zip::TRUNC ) do |z|\n    filesToZip.each do |relPath|\n        z.add_file( relPath, File.join( inputPath, relPath ) )\n    end\n    z.add_file( metadataRelPath, _metadataPath )\nend\n\nputs \"Cleaning up.\"\n\nFile.delete( _metadataPath )\nFile.open( outputPath, 'r' ) do |f|\n    File.open( outputPath.sub( \"axe\", \"md5\" ), 'w' ) do |g|\n        g.write( Digest::MD5.hexdigest( f.read ).to_s + \"\\t\" + File.basename( outputPath ) )\n    end\nend\n\nputs \"All done. Have a nice day.\"\n"
  },
  {
    "path": "admin/spotify-synchrotron/linux/create_synchrotron.rb",
    "content": "#!/usr/bin/env ruby\n#\n#   This takes a binary for 32bit or 64bit linux\n#    the signed zip file + manifest suitable for uploading to Synchrotron\n#\n#\nrequire 'pathname'\n\nLIBSPOTIFY_VERSION = \"libspotify.so.12\"\n\nif ARGV.length < 7\n  puts \"Usage: ruby create_synchrotron.rb [x86|x64] [version 0.0.0] /path/to/static/builddir resolvername_tomahawkresolver metadata.desktop private_key_file /path/to/tomahawk-synchrotron\"\n  puts \"\\n\"\n  puts \"If you don't have the tomahawk private key and you think you should, ask leo :)\"\n  exit\nend\n\nfullPath = File.join(ARGV[2], ARGV[3])\n\nif not File.directory?(ARGV[2]) or not File.exists?(fullPath) or not File.exists?(ARGV[4]) or not File.exists?(ARGV[5]) or not File.directory?(ARGV[6])\n  puts \"One of your arguments didn't exist!\"\n  exit\nend\n\nlibspotify = File.join(ARGV[2], LIBSPOTIFY_VERSION)\nresolver = ARGV[3].split(\"_\")[0]\nplatform = \"linux-#{ARGV[0]}\"\n\nputs \"Creating zipfile for #{resolver} in folder #{fullPath}...\"\n\nfolder = \"#{resolver}-#{platform}\"\n`mkdir #{folder}`\n`cp #{fullPath} #{folder}`\n`cp #{libspotify} #{folder}`\n\ntarball = \"#{resolver}-#{platform}.zip\"\n`pushd #{folder} && zip -r \"#{tarball}\" * && mv \"#{tarball}\" .. && popd`\n`rm -rf #{folder}`\n\nsignature = `openssl dgst -sha1 -binary < \"#{tarball}\" | openssl dgst -dss1 -sign \"#{ARGV[5]}\" | openssl enc -base64`\nputs \"Signature: #{signature}\"\n\nfd = File.open(ARGV[4], 'r')\nmanifest = fd.read\n\nmanifest[\"_SIGNATURE_\"] = signature\nmanifest[\"_ZIPFILE_\"] = tarball\nmanifest[\"_PLATFORM_\"] = platform\nmanifest[\"_TYPE_\"] = platform\nmanifest[\"_VERSION_\"] = ARGV[1]\nmanifest[\"_BINARY_\"] = ARGV[3]\n\nresolverDir = \"#{ARGV[6]}/resolvers/#{resolver}-#{platform}/content\"\n`mkdir -p #{resolverDir}` if not File.directory?(resolverDir)\n\nFile.open(\"#{resolverDir}/metadata.desktop\", \"w\") do |f|\n  f.write(manifest)\nend\n\n`mv #{tarball} #{resolverDir}`\n"
  },
  {
    "path": "admin/spotify-synchrotron/mac/create_synchrotron.rb",
    "content": "#!/usr/bin/env ruby\n#\n#   This takes a binary for osx and creates\n#    the signed zip file + manifest suitable for uploading to Synchrotron\n#\n# Note that this assumes the resolver has been built against a STATIC qt and qjson.\n# See static_notes.txt in spotify/ for the qt configure line to use.\n#\nrequire 'pathname'\n\nLIBSPOTIFY_VERSION = \"#{`brew ls -version libspotify | tr -s \" \" \"\\012\" | tail -n 1`}\".strip\n\nputs \"Using libspotify version: #{LIBSPOTIFY_VERSION}\"\nif ARGV.length < 4\n  puts \"Usage: ruby create_synchrotron.rb spotify_tomahawkresolver metadata.desktop private_key_file /path/to/tomahawk-synchrotron\"\n  puts \"\\n\"\n  puts \"If you don't have the tomahawk private key and you think you should, ask leo :)\"\n  exit\nend\n\nif not File.exists?(ARGV[0]) or not File.exists?(ARGV[1]) or not File.exists?(ARGV[2]) or not File.directory?(ARGV[3])\n  puts \"One of your arguments didn't exist!\"\n  exit\nend\n\nresolver = Pathname.new(ARGV[0]).basename.to_s\nresolvername = resolver.split(\"_\")[0]\nplatform = \"osx\"\n  \n\nputs \"Creating zipfile for #{resolver}...\"\n\n`cp #{ARGV[0]} #{resolver}`\n# Manually install_name_tool the spotify binary to point to relative paths.\n# This will make the resolver look for libspotify in the current directory.\n`install_name_tool -change /usr/local/lib/libspotify.#{LIBSPOTIFY_VERSION}.dylib @executable_path/libspotify.#{LIBSPOTIFY_VERSION}.dylib #{resolver}`\n\nLIBSPOTIFY_LOCAL = \"libspotify.#{LIBSPOTIFY_VERSION}.dylib\"\n`cp /usr/local/lib/libspotify.#{LIBSPOTIFY_VERSION}.dylib #{LIBSPOTIFY_LOCAL}`\n`chmod +rw #{LIBSPOTIFY_LOCAL}`\ntarball = \"#{resolvername}-#{platform}.zip\"\n`zip -r #{tarball} #{resolver} #{LIBSPOTIFY_LOCAL}`\n`rm #{resolver}`\n`rm #{LIBSPOTIFY_LOCAL}`\n\nputs \"Signing...\"\nsignature = `openssl dgst -sha1 -binary < \"#{tarball}\" | openssl dgst -dss1 -sign \"#{ARGV[2]}\" | openssl enc -base64`\nputs \"Signature: #{signature}\"\n\nfd = File.open(ARGV[1], 'r')\nmanifest = fd.read\n\nmanifest[\"_SIGNATURE_\"] = signature\nmanifest[\"_ZIPFILE_\"] = tarball\nmanifest[\"_PLATFORM_\"] = platform\nmanifest[\"_TYPE_\"] = platform\nmanifest[\"_BINARY_\"] = resolver\n\n\nresolverDir = \"#{ARGV[3]}/resolvers/#{resolvername}-#{platform}/content\"\n`mkdir -p #{resolverDir}` if not File.directory?(resolverDir)\n\nFile.open(\"#{resolverDir}/metadata.desktop\", \"w\") do |f|\n  f.write(manifest)\nend\n\n`mv #{tarball} #{resolverDir}`\n"
  },
  {
    "path": "admin/spotify-synchrotron/win/create_synchrotron.rb",
    "content": "#!/usr/bin/env ruby\n#\n#   This takes a binary for windows and creates\n#    the signed zip file + manifest suitable for uploading to Synchrotron\n#\n# This requires 7zip installed in C:\\program files\\7-Zip\\7z.exe, and openssh installed as well.\n#\n# This will createa standalone zip file that bundles qt, libjqon, libqxtweb, and libspotify.\n#  It expects a standalone spotify_tomahawkresolver.exe with the necessarily libs in the same folder\n#\nrequire 'pathname'\n\nzipper = \"C:\\\\Program Files\\\\7-Zip\\\\7z.exe\"\n\nif ARGV.length < 5\n  puts \"Usage: ruby create_synchrotron_win.rb /path/to/resolver_folder resolver_name.exe metadata.desktop private_key_file /path/to/tomahawk-synchrotron\"\n  puts \"\\nCall this from any directory.\"\n  puts \"If you don't have the tomahawk private key and you think you should, ask leo :)\"\n  exit\nend\n\nif not File.directory?(ARGV[0]) or not File.exists?(ARGV[2]) or not File.exists?(ARGV[3]) or not File.directory?(ARGV[4])\n  puts \"One of your arguments didn't exist!\"\n  exit\nend\n\nfullPath = File.join(ARGV[0], ARGV[1])\nresolver = ARGV[1].split(\"_\")[0]\nplatform = \"win\"\n  \nputs \"Creating zipfile for #{resolver} in folder #{fullPath}...\"\n\nfolder = \"#{resolver}-#{platform}\"\n`mkdir #{folder}`\n`copy #{ARGV[0]} #{folder}`\n\ntarball = \"#{resolver}-#{platform}.zip\"\n`pushd #{folder} && \"#{zipper}\" a -tzip \"#{tarball}\" * && move \"#{tarball}\" .. && popd`\n`del /q #{folder}`\n`rd #{folder}`\n\n#puts \"Signing... openssl dgst -sha1 -binary < \\\"#{tarball}\\\" | openssl dgst -dss1 -sign \\\"#{ARGV[3]}\\\" | openssl enc -base64\"\nsignature = `openssl dgst -sha1 -binary < \"#{tarball}\" | openssl dgst -dss1 -sign \"#{ARGV[3]}\" | openssl enc -base64`\nputs \"Signature: #{signature}\"\n\nfd = File.open(ARGV[2], 'r')\nmanifest = fd.read\n\nmanifest[\"_SIGNATURE_\"] = signature\nmanifest[\"_ZIPFILE_\"] = tarball\nmanifest[\"_PLATFORM_\"] = platform\nmanifest[\"_TYPE_\"] = platform\nmanifest[\"_BINARY_\"] = ARGV[1]\n\nresolverDir = \"#{ARGV[4]}\\\\resolvers\\\\#{resolver}-#{platform}\\\\content\"\n`mkdir #{resolverDir}` if not File.directory?(resolverDir)\n\nFile.open(\"#{resolverDir}/metadata.desktop\", \"w\") do |f|\n  f.write(manifest)\nend\n\n`move #{tarball} #{resolverDir}`\n"
  },
  {
    "path": "amazon/content/contents/code/amazon.js",
    "content": "/* Amazon Music resolver for Tomahawk.\n *\n * Written in 2015 by Creepy Guy In The Corner\n *\n * To the extent possible under law, the author(s) have dedicated all\n * copyright and related and neighboring rights to this software to\n * the public domain worldwide. This software is distributed without\n * any warranty.\n *\n * You should have received a copy of the CC0 Public Domain Dedication\n * along with this software. If not, see:\n * http://creativecommons.org/publicdomain/zero/1.0/\n */\n\nvar AmazonResolver = Tomahawk.extend( Tomahawk.Resolver, {\n    apiVersion: 0.9,\n\n    api_location : 'https://www.amazon.com/',\n\n    logged_in: null, // null, = not yet tried, 0 = pending, 1 = success, 2 = failed\n\n    settings: {\n        cacheTime: 300,\n        name: 'Amazon Music',\n        icon: '../images/icon.png',\n        weight: 95,\n        timeout: 8,\n        user_agent: 'Mozilla/6.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0'\n    },\n\n    getConfigUi: function() {\n        return {\n            \"widget\": Tomahawk.readBase64( \"config.ui\" ),\n            fields: [{\n                name: \"email\",\n                widget: \"email_edit\",\n                property: \"text\"\n            }, {\n                name: \"password\",\n                widget: \"password_edit\",\n                property: \"text\"\n            },{\n                name: \"region\",\n                widget: \"region\",\n                property: \"currentIndex\"\n            }]\n        };\n    },\n\n    /**\n     * Defines this Resolver's config dialog UI.\n     */\n    configUi: [\n        {\n            id: \"email\",\n            type: \"textfield\",\n            label: \"E-Mail\"\n        },\n        {\n            id: \"password\",\n            type: \"textfield\",\n            label: \"Password\",\n            isPassword: true\n        },\n        {\n            id: \"region\",\n            type: \"dropdown\",\n            label: \"Region\",\n            items: [\".com\", \".de\", \".co.uk\"],\n            defaultValue: 0\n        }\n    ],\n\n    newConfigSaved: function(config) {\n        var that = this;\n        var changed =\n            this._email !== config.email ||\n            this._password !== config.password ||\n            this._region !== config.region;\n\n        if (changed) {\n            return this._get(this.api_location + \"gp/dmusic/cloudplayer/forceSignOut\").then(function(resp){\n                that.init();\n                amazonCollection.wipe({id: amazonCollection.settings.id}).then(function () {\n                    window.localStorage.removeItem(\"amzn_collection_version_key\");\n                    that.init();\n                });\n            });\n        }\n    },\n\n    testConfig: function (config) {\n        var that = this;\n        return that._get(that.api_location + \"gp/dmusic/cloudplayer/forceSignOut\").then(\n            function () {\n                return that._getLoginPromise(config, true).then(function (resp) {\n                    var appConfigRe = /amznMusic.appConfig *?= *?({.*});/g;\n                    if (appConfigRe.exec(resp) != null) {\n                        return Tomahawk.ConfigTestResultType.Success;\n                    } else {\n                        return Tomahawk.ConfigTestResultType.InvalidCredentials;\n                    }\n                }, function (error) {\n                    return \"Internal error.\";\n                });\n            });\n    },\n\n    _request: function(url, method, options, use_csrf_headers){\n        if (typeof options === 'undefined')\n            options = {};\n        if (!options.hasOwnProperty('headers'))\n            options.headers = {};\n        if (use_csrf_headers) {\n            options.headers['csrf-token'] = this._appConfig['CSRFTokenConfig']['csrf_token'];\n            options.headers['csrf-rnd'] = this._appConfig['CSRFTokenConfig']['csrf_rnd'];\n            options.headers['csrf-ts'] = this._appConfig['CSRFTokenConfig']['csrf_ts'];\n        }\n\n        options.headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0';\n        options.headers['Accept-Language'] = 'en-US,en;q=0.5';\n\n        if (method === 'POST')\n            return Tomahawk.post( url, options);\n        else\n            return Tomahawk.get( url, options);\n    },\n    _post: function (url, options, use_csrf_headers) {\n        return this._request(url, 'POST', options, use_csrf_headers);\n    },\n    _get: function (url, options, use_csrf_headers) {\n        return this._request(url, 'GET', options, use_csrf_headers);\n    },\n\n    _domains : ['.com', '.de', '.co.uk'],\n\n    init: function() {\n        var config = this.getUserConfig();\n\n        this._email = config.email;\n        this._password = config.password;\n        this._region = config.region || 0;\n\n        if (!this._email || !this._password) {\n            Tomahawk.PluginManager.unregisterPlugin(\"collection\", amazonCollection);\n            Tomahawk.log(\"Invalid configuration.\");\n            return;\n        }\n\n\n        this.api_location = 'https://www.amazon' + this._domains[this._region] + '/';\n        var that = this;\n\n        return this._get(this.api_location + \"gp/dmusic/cloudplayer/forceSignOut\").then(function(resp){\n            return that._login(config);\n        });\n    },\n\n    _convertTrack2: function (entry) {\n        var track = {\n            artist:     Tomahawk.htmlDecode(entry.artist.name),\n            album:      Tomahawk.htmlDecode(entry.album.title),\n            track:      Tomahawk.htmlDecode(entry.title),\n            title:      Tomahawk.htmlDecode(entry.title),\n\n            albumpos:   entry.trackNum,\n            discnumber: entry.discNum,\n\n            duration:   entry.duration,\n\n            checked:    true,\n            type:       \"track\",\n            url : 'amzn://track/' + entry.duration + '/COID//ASIN/' + entry.asin + '/IDTYPE/ASIN'\n        };\n        // also has originalReleaseDate with values like 1476921600000\n\n        track.hint = track.url;\n        return track;\n    },\n\n    _convertTrack: function (entry) {\n        if (entry.hasOwnProperty('metadata'))\n            entry = entry.metadata;\n        var track = {\n            artist:     Tomahawk.htmlDecode(entry.artistName),\n            albumArtist:     Tomahawk.htmlDecode(entry.albumArtistName),\n            album:      Tomahawk.htmlDecode(entry.albumName),\n            track:      Tomahawk.htmlDecode(entry.title),\n            title:      Tomahawk.htmlDecode(entry.title),\n\n            albumpos:   entry.trackNum,\n            discnumber: entry.discNum,\n\n            duration:   entry.duration,\n\n            checked:    true,\n            size:       entry.size,\n            bitrate:    entry.bitrate,\n            type:       \"track\"\n        };\n\n        //We request HIGH quality with this resolver which corresponds to\n        //256 VBR kbps, lets set it as default\n        track.bitrate = track.bitrate || 256;\n\n        if(entry.albumReleaseDate)\n        {\n            track['releaseyear'] = entry.albumReleaseDate.split('-')[0];\n            track['year'] = entry.albumReleaseDate.split('-')[0];\n        }\n\n        track.url = 'amzn://track/' + entry.duration + '/COID/' + entry.objectId +\n            '/ASIN/' + entry.asin + '/IDTYPE/';\n        if (entry.purchased === 'true' || entry.uploaded === 'true') {\n            track.url += 'COID';\n        } else {\n            track.url += 'ASIN';\n        }\n\n        track.hint = track.url;\n        return track;\n    },\n\n    search: function (params) {\n        if (!this.logged_in) {\n            return this._defer(this.search, params, this);\n        } else if (this.logged_in === 2) {\n            throw new Error('Failed login, cannot search.');\n        }\n\n        var that = this;\n\n        if (that._appConfig.featureController.hawkfireAccess === 1)\n        {\n            // User has Music Unlimited\n            return that._post(that.api_location + \"clientbuddy/compartments/eeb70a31c77c4ecd/handlers/search\", {\n                data: {\n                    \"keywords\" : params.query,\n                    \"offset\" : 0,\n                    \"count\" : 100,\n                    \"marketplaceId\": that._appConfig['marketplaceId']\n                    || that._appConfig['cirrus']['marketplaceId'],\n                    \"features\" : [\"musicSubscription\"],\n                    \"isMusicSubscription\" : true,\n                    \"primeOnly\" : false,\n                    \"requestUiContentDeliveredMetrics\" : true,\n                    \"sslMedia\" : true,\n                    \"types\" : [\"track\" /* \"album\", \"artist\", \"station\", \"playlist\" */ ]\n                },\n                dataFormat: 'json',\n                headers : {\n                    \"x-amzn-cb-deviceid\" : that._appConfig.deviceId,\n                    \"x-amzn-cb-devicetype\" : that._appConfig.deviceType\n                }\n            }, false).then( function (response) {\n                return response.trackList.map(that._convertTrack2, that);\n            });\n        }\n        else if (that._appConfig.featureController.robin === 1)\n        {\n            // User has Prime\n            return that._post(that.api_location + \"clientbuddy/compartments/32f93572142e8f7c/handlers/search\", {\n                data: {\n                    \"keywords\" : params.query,\n                    \"marketplaceId\": that._appConfig['marketplaceId']\n                    || that._appConfig['cirrus']['marketplaceId']\n                },\n                dataFormat: 'json'\n            }, true).then( function (response) {\n                return response.tracks.filter(function(track) {\n                    return track.isPrime;\n                }).map(that._convertTrack, that);\n            });\n        } else {\n            // User doesn't have Unlimited nor Prime\n            return [];\n        }\n    },\n\n    resolve: function (params) {\n        var query = [ params.artist, params.album, params.track ].join(' ');\n\n        return this.search({query:query});\n    },\n\n    _debugPrint: function (obj, spaces) {\n        spaces = spaces || '';\n\n        var str = '';\n        for (var key in obj) {\n            if (typeof obj[key] === \"object\") {\n                var b = [\"{\", \"}\"];\n                if (obj[key].constructor == Array) {\n                    b = [\"[\", \"]\"];\n                }\n                str += spaces+key+\": \"+b[0]+\"\\n\"+this._debugPrint(obj[key], spaces+'    ')+\"\\n\"+spaces+b[1]+'\\n';\n            } else {\n                str += spaces+key+\": \"+obj[key]+\"\\n\";\n            }\n        }\n        if (spaces != '') {\n            return str;\n        } else {\n            str.split('\\n').map(Tomahawk.log, Tomahawk);\n        }\n    },\n\n    getStreamUrl: function(params) {\n        return this._getStreamUrlPromise(params.url).then(function (streamUrl){\n            return {url: streamUrl};\n        }).catch(Tomahawk.log);\n    },\n\n    _parseUrn: function (urn) {\n        var match = urn.match( /^amzn:\\/\\/([a-z]+)\\/([0-9]+)\\/COID\\/(.*?)\\/ASIN\\/(.+?)\\/IDTYPE\\/(.+)$/ );\n        if (!match) return null;\n\n        var parsed = {\n            type        : match[ 1 ],\n            duraion     : match[ 2 ],\n            cdObjectId  : match[ 3 ],\n            asin        : match[ 4 ],\n            idType      : match[ 5 ]\n        };\n        if (parsed.idType === 'COID') {\n            parsed.id     = parsed.cdObjectId;\n        } else {\n            parsed.id     = parsed.asin;\n        }\n        return parsed;\n    },\n\n    _getStreamUrlPromise: function (urn) {\n        if (!this.logged_in) {\n            return this._defer(this.getStreamUrl, [urn], this);\n        } else if (this.logged_in === 2) {\n            throw new Error('Failed login, cannot getStreamUrl.');\n        }\n\n        var parsedUrn = this._parseUrn( urn );\n\n        if (!parsedUrn || parsedUrn.type != 'track') {\n            Tomahawk.log( \"Failed to get stream. Couldn't parse '\" + urn + \"'\" );\n            return;\n        }\n\n\n        var _headers = {\n            'X-Amz-Target' : 'com.amazon.digitalmusiclocator.DigitalMusicLocatorServiceExternal.getRestrictedStreamingURL',\n            'Content-Encoding': 'amz-1.0'\n        };\n\n\n        var request = {\n            \"appMetadata\": {\n                \"https\": \"true\"\n            },\n            \"bitRate\": \"HIGH\",\n            \"clientMetadata\": {\n                \"clientId\": \"WebCP\"\n            },\n            \"contentDuration\": parsedUrn.duration,\n            \"contentId\": {\n                \"identifier\": parsedUrn.id,\n                \"identifierType\": parsedUrn.idType\n            },\n            \"customerId\": this._appConfig['customerId'],\n            \"deviceToken\": {\n                \"deviceId\": this._appConfig['deviceId'],\n                \"deviceTypeId\": this._appConfig['deviceType']\n            }\n        };\n\n        var that = this;\n\n        var cirrusData = {\n            \"clientActionList\": [{\n                \"actionName\": \"streamingTerminated\",\n                \"additionalDetails\": {\n                    \"trackCount\": \"1\",\n                    \"cacheHitStatus\": \"none\",\n                    \"source\": \"wifi\",\n                    \"terminationReason\": \"userStop\",\n                    \"initiationReason\": \"USERSTART\",\n                    \"durationSeconds\": \"3\",\n                    \"initialPlaybackDelayMilliseconds\": \"1541\",\n                    \"initialPlaybackDelaySeconds\": \"1.541\",\n                    \"transferSpeedBPS\": \"\",\n                    \"selectionSourceType\": \"AUTO_PLAYLIST\",\n                    \"isDirectedPlay\": \"true\",\n                    \"isShufflePlay\": \"false\",\n                    \"pageType\": \"recentlyPlayed\",\n                    \"selectionSourceId\": \"RECENTLY_PLAYED\",\n                    \"resourceType\": \"CLOUD_PLAYER\",\n                    \"rebufferCount\": \"0\",\n                    \"bitrates\": \"AutoMedium\",\n                    \"containerLoadDelayMilliseconds\": \"398\",\n                    \"streamOrDRMTech\": \"DASH\",\n                    \"playerType\": \"HTML5\",\n                    \"specificEventVersion\": \"2\",\n                    \"appVersion\": \"1.0.200025.0\",\n                    \"baseEventVersion\": \"1\",\n                    \"asin\": parsedUrn.asin,\n                    \"cdObjectId\": parsedUrn.cdObjectId,\n                },\n                \"timestamp\": Date.now()\n            }],\n            'customerId' : this._appConfig['customerId'],\n            'deviceId' :   this._appConfig['deviceId'],\n            'deviceType' : this._appConfig['deviceType']\n        };\n\n        return this._post(this.api_location + \"dmls/\", {\n            data: request,\n            dataFormat: 'json',\n            headers: _headers\n        }, true).then( function (response) {\n            Tomahawk.log(JSON.stringify(response));\n            if (! response.contentResponse.urlList)\n                throw new Error( response.contentResponse.statusMessage );\n            //We'll post this just to get this track to \"Recently Played\" on\n            //amazon\n            _headers['X-Amz-Target'] = 'com.amazon.cirrus.libraryservice.v3.CirrusLibraryServiceExternalV3.reportClientActions';\n            that._post(that.api_location + \"cirrus/v3/\", {\n                data: cirrusData,\n                dataFormat: 'json',\n                headers: _headers\n            }, true);\n            return response.contentResponse.urlList[0];\n        });\n    },\n\n    _defer: function (callback, args, scope) {\n        if (typeof this._loginPromise !== 'undefined' && 'then' in this._loginPromise) {\n            args = args || [];\n            scope = scope || this;\n            Tomahawk.log('Deferring action with ' + args.length + ' arguments.');\n            return this._loginPromise.then(function () {\n                Tomahawk.log('Performing deferred action with ' + args.length + ' arguments.');\n                callback.call(scope, args);\n            });\n        }\n    },\n\n    _getLoginPromise: function (config, isTestingConfig) {\n        var that = this;\n        var options = {\n            isTestingConfig: isTestingConfig\n        };\n        return this._get(this.api_location + \"gp/dmusic/cloudplayer/forceSignIn\", options).then(\n            function (resp) {\n                if (resp.indexOf('amznMusic.appConfig') !== -1 )\n                {\n                    //We are already logged in\n                    Tomahawk.log(\"Already logged in\\n\");\n                    return resp;\n                }\n                else\n                {\n                    var myRE = /input type=.*? name=\"([^\"]+)\" value=\"([^\"]+)\"/g;\n\n                    var match = myRE.exec(resp);\n                    var params = {};\n                    while (match != null) {\n                        params[match[1]] = match[2];\n                        match = myRE.exec(resp);\n                    }\n                    params['email'] = config.email.trim();\n                    params['password'] = config.password.trim();\n                    params['create'] = '0';\n                    var actionRe = /action=\"([^\"]+)\"/g ;\n                    var url = Tomahawk.htmlDecode(actionRe.exec(resp)[1]);\n                    var tokenRE = /token...([A-F0-9]+)/g ;\n                    var token = tokenRE.exec(resp)[1];\n                    var options = {\n                        data: params,\n                        headers : { 'Referer' : 'https://www.amazon' + that._domains[that._region] + '/ap/signin?_encoding=UTF8&accountStatusPolicy=P1&openid.assoc_handle=usflex&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.ns.pape=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fpape%2F1.0&openid.pape.max_auth_age=0&openid.return_to=https%3A%2F%2Fwww.amazon' + that._domains[that._region] + '%3A443%2Fgp%2Fredirect.html%3F_encoding%3DUTF8%26location%3Dhttps%253A%252F%252Fmusic.amazon' + that._domains[that._region] + '%253Fref_%253Ddm_wcp_sfso%26source%3Dstandards%26token%3D' + token + '%23&pageId=amzn_cpweb&showRmrMe=1' }\n                    };\n                    if (isTestingConfig) {\n                        options.isTestingConfig = true;\n                    }\n                    return that._post(url, options);\n                }\n            },\n            function (error) {\n                Tomahawk.log(JSON.stringify(error));\n                Tomahawk.log('Error getting login page');\n                that.logged_in = 2;\n            }\n        );\n    },\n\n    _login: function (config) {\n        // If a login is already in progress don't start another!\n        if (this.logged_in === 0) return;\n        this.logged_in = 0;\n\n        var that = this;\n\n        this._loginPromise = this._getLoginPromise(config, false).then(\n            function (resp) {\n                var appConfigRe = /amznMusic.appConfig *?= *?({.*});/g;\n                that._appConfig = JSON.parse(appConfigRe.exec(resp)[1]);\n                that.logged_in = 1;\n                that.api_location = 'https://' + that._appConfig['serverName'] + '/';\n                amazonCollection.settings['description'] = that._appConfig['customerName'];\n                Tomahawk.PluginManager.registerPlugin(\"collection\", amazonCollection);\n                that._checkForLibraryUpdates().then(function(){\n                    amazonCollection.addTracks({\n                        id: amazonCollection.settings.id,\n                        tracks: []\n                    });\n                }, function (error) {\n                    Tomahawk.PluginManager.unregisterPlugin(\"collection\", amazonCollection);\n                    Tomahawk.log(\"Failed updating Library:\" + error);\n                });\n                Tomahawk.log(that.settings.name + \" successfully logged in.\");\n            },\n            function (error) {\n                Tomahawk.log(that.settings.name + \" failed login: \" + JSON.stringify(error));\n\n                delete that._appConfig;\n\n                that.logged_in = 2;\n            }\n        ).catch(function(error) {\n            Tomahawk.log(that.settings.name + \" failed login: \" + JSON.stringify(error));\n            that.logged_in = 2;\n        });\n        return this._loginPromise;\n    },\n    //Collection/Library\n    //\n    _checkForLibraryUpdates: function() {\n        var that = this;\n        //Check for library updates every 15 Minutes\n        setTimeout(function(){that._checkForLibraryUpdates()}, 1000 * 60 * 15);\n        var currentVersion = Tomahawk.localStorage.getItem(\"amzn_collection_version_key\");\n        var _query = {\n            'caller' : 'checkServerChange',\n            'Operation' : 'getGlobalLastUpdatedDate',\n            'ContentType' : 'JSON',\n            'customerInfo.customerId' : this._appConfig['customerId'],\n            'customerInfo.deviceId' :   this._appConfig['deviceId'],\n            'customerInfo.deviceType' : this._appConfig['deviceType']\n        };\n        return this._post(this.api_location + 'cirrus/', {\n            data: _query\n        }, true).then( function (response) {\n            var serverVersion = response.getGlobalLastUpdatedDateResponse.getGlobalLastUpdatedDateResult.date.toString();\n            if( currentVersion != serverVersion ) {\n                Tomahawk.log('Server-side library updated, syncing');\n                amazonCollection.wipe({id: amazonCollection.settings.id}).then(function () {\n                    Tomahawk.localStorage.removeItem(\"amzn_collection_version_key\");\n                    that._getLibraryTracks().then(function(tracks) {\n                        amazonCollection.addTracks({\n                            id: amazonCollection.settings.id,\n                            tracks: tracks\n                        }).then(function () {\n                            Tomahawk.log(\"Updated Library to version with date:\" + serverVersion);\n                            Tomahawk.localStorage.setItem(\"amzn_collection_version_key\", serverVersion);\n                        });\n                    });\n                });\n            } else {\n                Tomahawk.log('Library up-to-date');\n            }\n        });\n    },\n\n    _getLibraryTracks: function(previousResults, nextResultsToken) {\n        var that = this;\n        if (!previousResults)\n            previousResults = [];\n        if (!nextResultsToken)\n            nextResultsToken = '';\n        var _query = {\n            'ContentType' : 'JSON',\n            'Operation' : 'searchLibrary',\n            'albumArtUrlsRedirects' : 'false',\n            'caller' : 'getServerSongs',\n            'countOnly': 'false',\n            'customerInfo.customerId' : this._appConfig['customerId'],\n            'customerInfo.deviceId' :   this._appConfig['deviceId'],\n            'customerInfo.deviceType' : this._appConfig['deviceType'],\n            'distinctOnly' : 'false',\n            'maxResults' : '1000',\n            'nextResultsToken' : nextResultsToken,\n            'searchCriteria.member.1.attributeName' : 'keywords',\n            'searchCriteria.member.1.attributeValue' : '',\n            'searchCriteria.member.1.comparisonType' : 'LIKE',\n            'searchCriteria.member.2.attributeName' : 'assetType',\n            'searchCriteria.member.2.attributeValue' : 'AUDIO',\n            'searchCriteria.member.2.comparisonType' : 'EQUALS',\n            'searchCriteria.member.3.attributeName' : 'status',\n            'searchCriteria.member.3.attributeValue' : 'AVAILABLE',\n            'searchCriteria.member.3.comparisonType' : 'EQUALS',\n            'searchReturnType' : 'TRACKS',\n            'selectedColumns.member.1' : 'albumArtistName',\n            'selectedColumns.member.10' : 'title',\n            'selectedColumns.member.11' : 'status',\n            'selectedColumns.member.12' : 'trackStatus',\n            'selectedColumns.member.13' : 'extension',\n            'selectedColumns.member.14' : 'asin',\n            'selectedColumns.member.15' : 'primeStatus',\n            'selectedColumns.member.2' : 'albumName',\n            'selectedColumns.member.3' : 'artistName',\n            'selectedColumns.member.4' : 'assetType',\n            'selectedColumns.member.5' : 'duration',\n            'selectedColumns.member.6' : 'objectId',\n            'selectedColumns.member.7' : 'sortAlbumArtistName',\n            'selectedColumns.member.8' : 'sortAlbumName',\n            'selectedColumns.member.9' : 'sortArtistName',\n            'sortCriteriaList' : '',\n            'sortCriteriaList.member.1.sortColumn' : 'sortTitle',\n            'sortCriteriaList.member.1.sortType' : 'ASC'\n        };\n        return that._post(this.api_location + 'cirrus/', {\n            data: _query\n        }, true).then(function(response) {\n            previousResults = previousResults.concat(response\n                .searchLibraryResponse\n                .searchLibraryResult\n                .searchReturnItemList\n                .filter(function(track) {\n                    track = track.metadata;\n                    return (\n                        track.purchased === 'true' ||\n                        track.uploaded  === 'true' ||\n                        (track.primeStatus === 'PRIME' && that._appConfig.featureController.robin === 1) ||\n                        (track.isMusicSubscription === 'true' && that._appConfig.featureController.hawkfireAccess === 1));\n                })\n                .map(that._convertTrack, that));\n            nextResultsToken = response.searchLibraryResponse.searchLibraryResult.nextResultsToken;\n            if (null === nextResultsToken)\n                return previousResults;\n            return that._getLibraryTracks(previousResults, nextResultsToken);\n        });\n    }\n});\n\nvar amazonCollection = Tomahawk.extend(Tomahawk.Collection, {\n    resolver: AmazonResolver,\n    settings: {\n        id: \"amazon\",\n        prettyname: \"Amazon Music Library\",\n        iconfile: \"contents/images/icon.png\"\n    }\n});\nTomahawk.resolver.instance = AmazonResolver;\n"
  },
  {
    "path": "amazon/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>390</width>\n    <height>120</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>250</width>\n    <height>120</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::ExpandingFieldsGrow</enum>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Email</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"email_edit\"/>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Password</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"password_edit\">\n       <property name=\"echoMode\">\n        <enum>QLineEdit::Password</enum>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_3\">\n       <property name=\"text\">\n        <string>Region</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"1\">\n      <widget class=\"QComboBox\" name=\"region\">\n       <item>\n        <property name=\"text\">\n         <string>.com</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>.de</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>.co.uk</string>\n        </property>\n       </item>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "amazon/content/metadata.json",
    "content": "{\n    \"name\": \"Amazon Music\",\n    \"pluginName\": \"amazon\",\n    \"author\": \"Creepy Guy In The Corner\",\n    \"email\": \"\",\n    \"version\": \"0.0.13\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Streams music from Amazon Music\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/amazon.js\",\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"scripts\": [],\n        \"resources\": [\n            \"contents/code/config.ui\"\n        ]\n    },\n    \"staticCapabilities\": [\n        \"configTestable\"\n    ]\n}\n"
  },
  {
    "path": "ampache/content/contents/code/ampache.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2011, Dominik Schmidt <domme@tomahawk-player.org>\n *   Copyright 2011, Leo Franchi <lfranchi@kde.org>\n *   Copyright 2013, Teo Mrnjavac <teo@kde.org>\n *   Copyright 2015, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU Lesser General Public License as\n *   published by the Free Software Foundation, version 3.\n *\n *   Tomahawk is distributed in the hope that it will be useful, but\n *   WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n *   Lesser General Public License for more details.\n *\n *   You should have received a copy of the GNU Lesser General Public License\n *   along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar AmpacheResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    _ready: false,\n\n    settings: {\n        name: 'Ampache',\n        icon: 'ampache-icon.png',\n        weight: 85,\n        timeout: 5,\n        limit: 10\n    },\n\n    getConfigUi: function () {\n        var uiData = Tomahawk.readBase64(\"config.ui\");\n        return {\n\n            \"widget\": uiData,\n            fields: [{\n                name: \"server\",\n                widget: \"serverLineEdit\",\n                property: \"text\"\n            }, {\n                name: \"username\",\n                widget: \"usernameLineEdit\",\n                property: \"text\"\n            }, {\n                name: \"password\",\n                widget: \"passwordLineEdit\",\n                property: \"text\"\n            }],\n            images: [{\n                \"owncloud.png\": Tomahawk.readBase64(\"owncloud.png\")\n            }, {\n                \"ampache.png\": Tomahawk.readBase64(\"ampache.png\")\n            }]\n        };\n    },\n\n    /**\n     * Defines this Resolver's config dialog UI.\n     */\n    configUi: [\n        {\n            id: \"server\",\n            type: \"textfield\",\n            label: \"Server URL\",\n            defaultValue: \"http://localhost/ampache\"\n        },\n        {\n            id: \"username\",\n            type: \"textfield\",\n            label: \"Username\"\n        },\n        {\n            id: \"password\",\n            type: \"textfield\",\n            label: \"Password\",\n            isPassword: true\n        }\n    ],\n\n    newConfigSaved: function (newConfig) {\n        if ((newConfig.username != this.username) || (newConfig.password != this.password)\n            || (newConfig.server != this.server)) {\n            Tomahawk.log(\"Invalidating cache\");\n            var that = this;\n            ampacheCollection.wipe({id: ampacheCollection.settings.id}).then(function () {\n                window.localStorage.removeItem(\"ampache_last_cache_update\");\n                that.init();\n            });\n        }\n    },\n\n    init: function () {\n        var that = this;\n\n        this._ready = false;\n\n        if (!this.element) {\n            this.element = document.createElement('div');\n        }\n\n        // check resolver is properly configured\n        var userConfig = this.getUserConfig();\n        if (!userConfig.username || !userConfig.password || !userConfig.server) {\n            Tomahawk.log(\"Ampache Resolver not properly configured!\");\n            return;\n        }\n\n        this._sanitizeConfig(userConfig);\n        this.username = userConfig.username;\n        this.password = userConfig.password;\n        this.server = userConfig.server;\n\n        return this._login(this.username, this.password, this.server).then(function () {\n            if (that.auth) {\n                that._ensureCollection();\n            }\n        });\n    },\n\n    _ensureCollection: function () {\n        var that = this;\n\n        return ampacheCollection.revision({\n            id: ampacheCollection.settings.id\n        }).then(function (result) {\n            var lastCollectionUpdate = window.localStorage[\"ampache_last_collection_update\"];\n            if (lastCollectionUpdate && lastCollectionUpdate == result) {\n                Tomahawk.log(\"Collection database has not been changed since last time.\");\n                var add;\n                if (window.localStorage[\"ampache_last_cache_update\"]) {\n                    var date = new Date(parseInt(window.localStorage[\"ampache_last_cache_update\"]));\n                    add = date.toISOString();\n                }\n                return that._fetchAndStoreCollection(add);\n            } else {\n                Tomahawk.log(\"Collection database has been changed. Wiping and re-fetching...\");\n                return ampacheCollection.wipe({\n                    id: ampacheCollection.settings.id\n                }).then(function () {\n                    return that._fetchAndStoreCollection();\n                });\n            }\n        });\n    },\n\n    _fetchAndStoreCollection: function (add) {\n        var that = this;\n\n        if (!this._requestPromise) {\n            Tomahawk.log(\"Checking if collection needs to be updated\");\n            var time = Date.now();\n\n            var settings = {\n                offset: 0,\n                limit: 1000000 // EHRM.\n            };\n            if (add) {\n                settings.add = add;\n            }\n            this._requestPromise = this._apiCall(\"songs\", settings).then(function (xmlDoc) {\n                var songs;\n                var songElements = xmlDoc.getElementsByTagName(\"song\")[0];\n                if (songElements !== undefined && songElements.childNodes.length > 0) {\n                    songs = xmlDoc.getElementsByTagName(\"song\");\n                }\n                Tomahawk.PluginManager.registerPlugin(\"collection\", ampacheCollection);\n                if (songs && songs.length > 0) {\n                    Tomahawk.log(\"Collection needs to be updated\");\n\n                    var tracks = that._parseSongResponse(xmlDoc);\n                    ampacheCollection.addTracks({\n                        id: ampacheCollection.settings.id,\n                        tracks: tracks\n                    }).then(function (newRevision) {\n                        Tomahawk.log(\"Updated cache in \" + (Date.now() - time) + \"ms\");\n                        window.localStorage[\"ampache_last_cache_update\"] = Date.now();\n                        window.localStorage[\"ampache_last_collection_update\"] = newRevision;\n                    });\n                } else {\n                    Tomahawk.log(\"Collection doesn't need to be updated\");\n\n                    ampacheCollection.addTracks({\n                        id: ampacheCollection.settings.id,\n                        tracks: []\n                    });\n                }\n            }, function (xhr) {\n                Tomahawk.log(\"Tomahawk.get failed: \" + xhr.status + \" - \"\n                    + xhr.statusText + \" - \" + xhr.responseText);\n            }).finally(function () {\n                that._requestPromise = undefined;\n            });\n        }\n        return this._requestPromise;\n    },\n\n    testConfig: function (config) {\n        var that = this;\n\n        this._sanitizeConfig(config);\n\n        return this._login(config.username, config.password, config.server)\n            .then(function (response) {\n                if (!that.auth) {\n                    Tomahawk.log(\"auth failed!\");\n                    var error = response.getElementsByTagName(\"error\")[0];\n                    if (typeof error != 'undefined' && error.getAttribute(\"code\") == \"403\") {\n                        return TomahawkConfigTestResultType.InvalidAccount;\n                    } else {\n                        return TomahawkConfigTestResultType.InvalidCredentials;\n                    }\n                } else {\n                    return TomahawkConfigTestResultType.Success;\n                }\n            }, function () {\n                return TomahawkConfigTestResultType.CommunicationError;\n            });\n    },\n\n    _sanitizeConfig: function (config) {\n        if (!config.server) {\n            config.server = \"http://localhost/ampache\";\n        } else {\n            if (config.server.search(\".*:\\/\\/\") < 0) {\n                // couldn't find a proper protocol, so we default to \"http://\"\n                config.server = \"http://\" + config.server;\n            }\n            config.server = config.server.trim();\n        }\n\n        return config;\n    },\n\n    _handshake: function (username, password, server) {\n        var time = Tomahawk.timestamp();\n        var key, passphrase;\n        if (typeof CryptoJS !== \"undefined\" && typeof CryptoJS.SHA256 == \"function\") {\n            key = CryptoJS.SHA256(password).toString(CryptoJS.enc.Hex);\n            passphrase = CryptoJS.SHA256(time + key).toString(CryptoJS.enc.Hex);\n        } else {\n            key = Tomahawk.sha256(password);\n            passphrase = Tomahawk.sha256(time + key);\n        }\n\n        var params = {};\n        params.user = username;\n        params.timestamp = time;\n        params.version = 350001;\n        params.auth = passphrase;\n\n        return this._apiCallBase(server, 'handshake',\n            params).then(this._parseHandshakeResult);\n    },\n\n    _parseHandshakeResult: function (xmlDoc) {\n        var roots = xmlDoc.getElementsByTagName(\"root\");\n        var auth = roots[0] === undefined ? false : Tomahawk.valueForSubNode(roots[0], \"auth\");\n        if (!auth) {\n            Tomahawk.log(\"INVALID HANDSHAKE RESPONSE!\");\n            return xmlDoc;\n        }\n\n        Tomahawk.log(\"New auth token: \" + auth);\n        var pingInterval = parseInt(roots[0] === undefined ? 0 : Tomahawk.valueForSubNode(roots[0],\n                \"session_length\")) * 1000;\n        var trackCount = roots[0] === undefined ? (-1) : Tomahawk.valueForSubNode(roots[0],\n            \"songs\");\n\n        return {\n            auth: auth,\n            trackCount: trackCount > -1 ? parseInt(trackCount) : trackCount,\n            pingInterval: pingInterval\n        };\n    },\n\n    _login: function (username, password, server) {\n        var that = this;\n        return this._handshake(username, password, server).then(function (result) {\n            that.auth = result.auth;\n            that.trackCount = result.trackCount;\n\n            Tomahawk.log(\"Ampache Resolver properly initialised!\");\n            that._ready = true;\n\n            // FIXME: the old timer should be cancelled ...\n            if (result.pingInterval) {\n                window.setInterval(that._ping, result.pingInterval - 60);\n            }\n            return result;\n        });\n    },\n\n    _apiCallBase: function (serverUrl, action, params) {\n        params = params || {};\n        params.action = action;\n\n        var options = {\n            url: serverUrl.replace(/\\/$/, \"\") + \"/server/xml.server.php\",\n            data: params\n        };\n\n        return Tomahawk.get(options);\n    },\n\n    _apiCall: function (action, params) {\n        if (!this.auth) {\n            throw new Error(\"Not authed, can't do api call\");\n        }\n\n        params = params || {};\n        params.auth = this.auth;\n\n        var that = this;\n        return this._apiCallBase(this.server, action, params).then(function (xmlDoc) {\n            var error = xmlDoc.getElementsByTagName(\"error\")[0];\n            if (typeof error != 'undefined' && error.getAttribute(\"code\") == \"401\") //session expired\n            {\n                Tomahawk.log(\"Let's reauth for: \" + action);\n                return that._login(that.username, that.password, that.server).then(function () {\n                    return that._apiCallBase(action, params);\n                }, function () {\n                    throw new Error(\"Could not renew session.\");\n                });\n            }\n\n            return xmlDoc;\n        });\n    },\n\n    _ping: function () {\n        this._apiCall('ping').then(function () {\n            Tomahawk.log('Ping succeeded.');\n        }, function () {\n            Tomahawk.log('Ping failed.');\n        });\n    },\n\n    _decodeEntity: function (str) {\n        this.element.innerHTML = str;\n        return this.element.textContent;\n    },\n\n    _parseSongResponse: function (xmlDoc) {\n        var results = [];\n        // check the response\n        var songElements = xmlDoc.getElementsByTagName(\"song\")[0];\n        if (songElements !== undefined && songElements.childNodes.length > 0) {\n            var songs = xmlDoc.getElementsByTagName(\"song\");\n\n            // walk through the results and store it in 'results'\n            for (var i = 0; i < songs.length; i++) {\n                var song = songs[i];\n\n                results.push({\n                    artist: this._decodeEntity(Tomahawk.valueForSubNode(song, \"artist\")),\n                    album: this._decodeEntity(Tomahawk.valueForSubNode(song, \"album\")),\n                    track: this._decodeEntity(Tomahawk.valueForSubNode(song, \"title\")),\n                    albumpos: Tomahawk.valueForSubNode(song, \"track\"),\n                    //result.year = 0;//valueForSubNode(song, \"year\");\n                    source: this.settings.name,\n                    url: \"ampache://track/\" + song.getAttribute(\"id\"),\n                    //mimetype: valueForSubNode(song, \"mime\"), //FIXME what's up here? it was there before :\\\n                    //result.bitrate = valueForSubNode(song, \"title\");\n                    size: Tomahawk.valueForSubNode(song, \"size\"),\n                    duration: Tomahawk.valueForSubNode(song, \"time\"),\n                    score: Tomahawk.valueForSubNode(song, \"rating\")\n                });\n            }\n        }\n        return results;\n    },\n\n    getStreamUrl: function (params) {\n        var url = params.url;\n\n        var settings = {\n            filter: url.replace(\"ampache://track/\", \"\")\n        };\n\n        return this._apiCall(\"song\", settings).then(function (xmlDoc) {\n            // check the response\n            var songs = xmlDoc.getElementsByTagName(\"song\");\n            if (songs[0] !== undefined && songs[0].childNodes.length > 0) {\n                return {\n                    url: Tomahawk.valueForSubNode(songs[0], \"url\")\n                }\n            } else {\n                throw new Error(\"Wasn't able to get streaming url for song \" + settings.filter);\n            }\n        });\n    },\n\n    resolve: function (params) {\n        var artist = params.artist;\n        var album = params.album;\n        var track = params.track;\n\n        return this.search({query: artist + \" \" + track});\n    },\n\n    search: function (params) {\n        var query = params.query;\n\n        if (!this._ready) {\n            return;\n        }\n\n        params = {\n            filter: query,\n            limit: this.settings.limit\n        };\n\n        var that = this;\n        return this._apiCall(\"search_songs\", params).then(function (xmlDoc) {\n            return that._parseSongResponse(xmlDoc);\n        });\n    }\n\n});\n\nTomahawk.resolver.instance = AmpacheResolver;\n\nvar ampacheCollection = Tomahawk.extend(Tomahawk.Collection, {\n    resolver:  AmpacheResolver,\n    settings: {\n        id: \"ampache\",\n        prettyname: \"Ampache\",\n        description: AmpacheResolver.getUserConfig()\n            ? AmpacheResolver._sanitizeConfig(AmpacheResolver.getUserConfig()).server\n            .replace(/^http:\\/\\//, \"\")\n            .replace(/^https:\\/\\//, \"\")\n            .replace(/\\/$/, \"\")\n            .replace(/\\/remote.php\\/ampache/, \"\")\n            : \"\",\n        iconfile: \"contents/images/icon.png\",\n        trackcount: AmpacheResolver.trackCount\n    }\n});\n\n/*\n * TEST ENVIRONMENT\n */\n\n/*TomahawkResolver.getUserConfig = function() {\n return {\n username: \"domme\",\n password: \"foo\",\n ampache: \"http://owncloud.lo/ampache\"\n //ampache: \"http://owncloud.lo/apps/media\"\n };\n };*/\n//\n// var resolver = Tomahawk.resolver.instance;\n//\n//\n// // configure tests\n// var search = {\n//     filter: \"I Fell\"\n// };\n//\n// var resolve = {\n//     artist: \"The Aquabats!\",\n//     title: \"I Fell Asleep On My Arm\"\n// };\n// // end configure\n//\n//\n//\n//\n//tests\n//resolver.init();\n//\n// // test search\n// //Tomahawk.log(\"Search for: \" + search.filter );\n// var response1 = resolver.search( 1234, search.filter );\n// //Tomahawk.dumpResult( response1 );\n//\n// // test resolve\n// //Tomahawk.log(\"Resolve: \" + resolve.artist + \" - \" + resolve.album + \" - \" + resolve.title );\n// var response2 = resolver.resolve( 1235, resolve.artist, resolve.album, resolve.title );\n// //Tomahawk.dumpResult( response2 );\n// Tomahawk.log(\"test\");\n// n = 0;\n// var items = resolver.getArtists( n ).results;\n// for(var i=0;i<items.length;i++)\n// {\n//     artist = items[i];\n//     Tomahawk.log(\"Artist: \" + artist);\n//     var albums = resolver.getAlbums( ++n, artist ).results;\n//     for(var j=0;j<albums.length;j++)\n//     {\n//         var album = albums[j];\n//         Tomahawk.dumpResult( resolver.getTracks( ++n, artist, album ) );\n//     }\n// }\n//\n// phantom.exit();\n"
  },
  {
    "path": "ampache/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>447</width>\n    <height>318</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QLabel\" name=\"label_2\">\n     <property name=\"text\">\n      <string/>\n     </property>\n     <property name=\"pixmap\">\n      <pixmap>ampache.png</pixmap>\n     </property>\n     <property name=\"alignment\">\n      <set>Qt::AlignCenter</set>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"label\">\n     <property name=\"text\">\n      <string/>\n     </property>\n     <property name=\"pixmap\">\n      <pixmap>owncloud.png</pixmap>\n     </property>\n     <property name=\"alignment\">\n      <set>Qt::AlignCenter</set>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"label_3\">\n     <property name=\"font\">\n      <font>\n       <italic>false</italic>\n      </font>\n     </property>\n     <property name=\"text\">\n      <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;For ownCloud instances, the Server URL is&lt;br/&gt;http://&lt;span style=&quot; color:#585858;&quot;&gt;ownCloud base url&lt;/span&gt;/remote.php/ampache&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n     </property>\n     <property name=\"alignment\">\n      <set>Qt::AlignCenter</set>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"serverLabel\">\n       <property name=\"text\">\n        <string>Server URL:</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"serverLineEdit\"/>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"usernameLabel\">\n       <property name=\"text\">\n        <string>Username:</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"usernameLineEdit\"/>\n     </item>\n     <item row=\"2\" column=\"0\">\n      <widget class=\"QLabel\" name=\"passwordLabel\">\n       <property name=\"text\">\n        <string>Password:</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"passwordLineEdit\">\n       <property name=\"echoMode\">\n        <enum>QLineEdit::Password</enum>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "ampache/content/metadata.json",
    "content": "{\n    \"name\": \"Ampache\",\n    \"pluginName\": \"ampache\",\n    \"author\": \"Dominik, Leo, Teo and Enno\",\n    \"email\": \"teo@kde.org\",\n    \"version\": \"0.4.3\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Connects to an Ampache or ownCloud server and resolves tracks.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/ampache.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/config.ui\",\n            \"contents/code/ampache-icon.png\",\n            \"contents/code/ampache.png\",\n            \"contents/code/owncloud-icon.png\",\n            \"contents/code/owncloud.png\"\n        ]\n    },\n    \"staticCapabilities\": [\n        \"configTestable\"\n    ]\n}\n"
  },
  {
    "path": "archive/README",
    "content": "Resolvers in this directory are not functional anymore because the used API\nis not available anymore. The resolver may still be helpful as a basis for\ndeveloping new resolvers.\n"
  },
  {
    "path": "archive/dilandau/content/contents/code/dilandau.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2011, lasconic <lasconic@gmail.com>\n *   Copyright 2011, Leo Franchi <lfranchi@kde.org>\n *   Copyright 2012, Thierry Göckel <thierry@strayrayday.lu>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU General Public License as published by\n *   the Free Software Foundation, either version 3 of the License, or\n *   (at your option) any later version.\n *\n *   Tomahawk is distributed in the hope that it will be useful,\n *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n *   GNU General Public License for more details.\n *\n *   You should have received a copy of the GNU General Public License\n *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar DilandauResolver = Tomahawk.extend(TomahawkResolver, {\n\n\tsettings: {\n\t\tname: 'Dilandau',\n\t\ticon: 'dilandau-icon.png',\n\t\tweight: 90,\n\t\ttimeout: 10\n\t},\n\n\thandleResponse: function(qid, artist, album, title) {\n\t\tvar that = this;\n\t\treturn function (xhr) {\n\t\t\tvar matches = [];\n\t\t\tvar xmlString = xhr.responseText;\n\t\t\txmlString.replace(/<a class=\"button tip download_button\" title=\"[^\"]*\"  href=\"([^\"]*)\"/g, function() {\n\t\t\t\tmatches.push(Array.prototype.slice.call(arguments,1,2));\n\t\t\t});\n\t\t\tvar matchesTitle = [];\n\t\t\txmlString.replace(/<h2 class=\"title_song\" title=\"([^\"]*)\"/g, function() {\n\t\t\t\tmatchesTitle.push(Array.prototype.slice.call(arguments,1,2));\n\t\t\t});\n\t\t\tvar results = [];\n\t\t\tvar empty = {\n\t\t\t\tqid: qid,\n\t\t\t\tresults: []\n\t\t\t};\n\t\t\tif (matches.length > 0 && matches.length === matchesTitle.length) {\n\t\t\t\tvar stop = matches.length;\n\t\t\t\tfor (var i = 0; i < matches.length; i++) {\n\t\t\t\t\tvar url = matches[i][0];\n\t\t\t\t\tvar dTitle = matchesTitle[i];\n\t\t\t\t\tvar dTitleLower = dTitle.toString().toLowerCase();\n\t\t\t\t\tif (dTitleLower.indexOf(artist.toLowerCase()) === -1 || dTitleLower.indexOf(title.toLowerCase()) === -1) {\n\t\t\t\t\t\tstop = stop - 1;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t(function(qid, url) {\n\t\t\t\t\t\t\tvar http = new XMLHttpRequest();\n\t\t\t\t\t\t\thttp.open('HEAD', url, true);\n\t\t\t\t\t\t\thttp.onreadystatechange = function() {\n\t\t\t\t\t\t\t\tif (http.readyState === 4){\n\t\t\t\t\t\t\t\t\tif (http.status === 200 && http.getResponseHeader(\"Content-Type\") !== null && (http.getResponseHeader(\"Content-Type\").indexOf(\"audio\") !== -1 || http.getResponseHeader(\"Content-Type\").indexOf(\"video\") !== -1 )){\n\t\t\t\t\t\t\t\t\t\tvar result = {};\n\t\t\t\t\t\t\t\t\t\tresult.artist = artist;\n\t\t\t\t\t\t\t\t\t\tresult.track = title;\n\t\t\t\t\t\t\t\t\t\tresult.source = that.settings.name;\n\t\t\t\t\t\t\t\t\t\tresult.url = url;\n\t\t\t\t\t\t\t\t\t\tresult.mimetype = \"audio/mpeg\";\n\t\t\t\t\t\t\t\t\t\tresult.bitrate = 128;\n\t\t\t\t\t\t\t\t\t\tresult.score = 0.9;\n\t\t\t\t\t\t\t\t\t\tresults.push(result);\n\t\t\t\t\t\t\t\t\t\tstop = stop - 1;\n\t\t\t\t\t\t\t\t\t\tif (stop === 0){\n\t\t\t\t\t\t\t\t\t\t\tvar return1 = {\n\t\t\t\t\t\t\t\t\t\t\t\tqid: qid,\n\t\t\t\t\t\t\t\t\t\t\t\tresults: [results[0]]\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\tTomahawk.addTrackResults(return1);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\t\tstop = stop - 1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\thttp.send(null);\n\t\t\t\t\t\t})(qid, url);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (stop === 0){\n\t\t\t\t\tTomahawk.addTrackResults(empty);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tTomahawk.addTrackResults(empty);\n\t\t\t}\n\t\t};\n\t},\n\n\n\tresolve: function (qid, artist, album, title) {\n\t\t// build query to Dilandau\n\t\tvar url = \"http://www.dilandau.eu/download_music/\";\n\t\tvar request = \"\";\n\t\tif (title !== \"\"){\n\t\t\trequest += title.replace(/ /g, '-');\n\t\t}\n\n\t\tif (artist !== \"\") {\n\t\t\tif (title !== \"\"){\n\t\t\t\trequest += '-';\n\t\t\t}\n\t\t\trequest += artist.replace(/ /g, '-');\n\t\t}\n\n\t\turl += encodeURIComponent(request);\n\n\t\turl += \"-1.html\";\n\n\t\t// send request and parse it into javascript\n\t\tTomahawk.asyncRequest(url, this.handleResponse(qid, artist, album, title));\n\t},\n    \n\tsearch: function (qid, searchString) {\n\t\tvar return1 = {\n\t\t\tqid: qid,\n\t\t\tresults: new Array()\n\t\t};\n\t\treturn return1;\n\t}\n});\n\nTomahawk.resolver.instance = DilandauResolver;\n"
  },
  {
    "path": "archive/dilandau/content/metadata.json",
    "content": "{\n    \"name\": \"Dilandau\",\n    \"pluginName\": \"dilandau\",\n    \"author\": \"lasconic\",\n    \"email\": \"lasconic@gmail.com\",\n    \"version\": \"0.4.1\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Uses mp3 search engine http://www.dilandau.eu/ to find tracks.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/dilandau.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"resources\": [\n            \"contents/code/dilandau-icon.png\"\n        ]\n    }\n}\n"
  },
  {
    "path": "archive/exfm/content/contents/code/exfm.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n * Copyright 2011, lasonic <lasconic@gmail.com>\n * Copyright 2013, Uwe L. Korn <uwelk@xhochy.com>\n *\n * Tomahawk is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Tomahawk is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar ExfmResolver = Tomahawk.extend(TomahawkResolver, {\n    settings: {\n        name: 'Ex.fm',\n        icon: 'exfm-icon.png',\n        weight: 30,\n        timeout: 5\n    },\n\n    init: function () {\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n    },\n\n    cleanTitle: function (title, artist) {\n        // If the title contains a newline character, strip them off and remove additional spacing\n        var newTitle = \"\",\n            stringArray = title.split(\"\\n\");\n        title.split(\"\\n\").forEach(function (split) {\n            newTitle += split.trim() + \" \";\n        });\n        // Remove dash and quotation characters.\n        newTitle = newTitle.replace(\"\\u2013\", \"\").replace(\"  \", \" \").replace(\"\\u201c\", \"\").replace(\"\\u201d\", \"\");\n        // If the artist is included in the song title, cut it\n        if (newTitle.toLowerCase().indexOf(artist.toLowerCase() + \" -\") === 0) {\n            newTitle = newTitle.slice(artist.length + 2).trim();\n        } else if (newTitle.toLowerCase().indexOf(artist.toLowerCase() + \"-\") === 0) {\n            newTitle = newTitle.slice(artist.length + 1).trim();\n        } else if (newTitle.toLowerCase().indexOf(artist.toLowerCase()) === 0) {\n            // FIXME: This might break results where the artist name is a substring of the song title.\n            newTitle = newTitle.slice(artist.length).trim();\n        }\n        return newTitle;\n    },\n\n    resolve: function (qid, artist, album, title) {\n        var that = this,\n        // Build search query for ex.fm\n            url = \"https://ex.fm/api/v3/song/search/\" + encodeURIComponent(title) + \"?start=0&results=20&client_id=tomahawk\";\n\n        // send request and parse it into javascript\n        Tomahawk.asyncRequest(url, function (xhr) {\n            // parse json\n            var response = JSON.parse(xhr.responseText),\n                results = [];\n\n            // check the response\n            if (response.results > 0) {\n                response.songs.forEach(function (song) {\n                    if (typeof(song.url) == 'undefined' || song.url == null) {\n                        return;\n                    }\n\n                    if ((song.url.indexOf(\"http://api.soundcloud\") === 0) || (song.url.indexOf(\"https://api.soundcloud\") === 0)) { // unauthorised, use soundcloud resolver instead\n                        return;\n                    }\n\n                    if (song.artist === null || song.title === null) {\n                        // This track misses relevant information, so we are going to ignore it.\n                        return;\n                    }\n                    var result = {},\n                        dTitle = that.cleanTitle(song.title, song.artist),\n                        dArtist = song.artist,\n                        dAlbum = \"\";\n                    if (song.album !== null) {\n                        dAlbum = song.album;\n                    }\n                    if (typeof(song.sources) != 'undefined' && song.sources != null && song.sources.length > 0) {\n                        result.linkUrl = song.sources[0]\n                    }\n                    if ((dTitle.toLowerCase().indexOf(title.toLowerCase()) !== -1 && dArtist.toLowerCase().indexOf(artist.toLowerCase()) !== -1) || (artist === \"\" && album === \"\")) {\n                        result.artist = ((dArtist !== \"\") ? dArtist : artist);\n                        result.album = ((dAlbum !== \"\") ? dAlbum : album);\n                        result.track = ((dTitle !== \"\") ? dTitle : title);\n                        result.source = that.settings.name;\n                        result.url = song.url;\n                        result.extension = \"mp3\";\n                        result.score = 0.80;\n                        results.push(result);\n                    }\n                });\n            }\n\n            Tomahawk.addTrackResults({qid: qid, results: results});\n        });\n    },\n\n    canParseUrl: function (url, type) {\n        // Ex.fm does not support artists and only lists the album of the week as an album\n        switch (type) {\n        case TomahawkUrlType.Album:\n            return /https?:\\/\\/(www\\.)?ex.fm\\/explore\\/album-of-the-week/.test(url);\n        case TomahawkUrlType.Artist:\n            return false;\n        case TomahawkUrlType.Track:\n            return /https?:\\/\\/(www\\.)?ex.fm\\/song\\//.test(url)\n        // case TomahawkUrlType.Playlist:\n        // case TomahawkUrlType.Any:\n        default:\n            return /https?:\\/\\/(www\\.)?ex.fm\\//.test(url);\n        }\n    },\n\n    track2Result: function (item) {\n        var result = {\n            type: \"track\",\n            title: item.title,\n            artist: item.artist,\n            album: item.album\n        };\n        return result;\n    },\n\n    lookupUrl: function (url) {\n        var urlParts = url.split('/').filter(function (item) { return item !== \"\" });\n        var query = \"https://ex.fm/api/v3\";\n        var that = this;\n        if (urlParts.length === 3) {\n            // Url matches a user, e.g. https://ex.fm/xhochy\n            query +=  \"/user/\" + urlParts[2] + \"/trending\";\n            query += \"?client_id=tomahawk\";\n        } else if (/\\/explore\\/site-of-the-day/.test(url)) {\n            // Site of the day\n            query += \"/sotd?results=1\";\n            query += \"&client_id=tomahawk\";\n        } else if (urlParts[2] == 'explore' && urlParts[3] == 'album-of-the-week') {\n            query += '/atow?results=1';\n            query += \"&client_id=tomahawk\";\n        } else if (urlParts[2] == 'explore' && urlParts[3] == 'mixtape-of-the-month') {\n            query += '/motm?results=1';\n            query += \"&client_id=tomahawk\";\n        } else if (/\\/song\\//.test(url)) {\n            // Just one simple song\n            query += \"/song/\" + urlParts[3];\n            query += \"?client_id=tomahawk\";\n        } else if (/https?:\\/\\/(www\\.)?ex.fm\\/site\\//.test(url)) {\n            query += url.replace(/https?:\\/\\/(www\\.)?ex.fm/, '');\n            query += \"?client_id=tomahawk\";\n        } else if (urlParts[2] == \"search\") {\n            query += \"/song/search/\" + urlParts[3];\n            query += \"?client_id=tomahawk\";\n        } else {\n            query += url.replace(/https?:\\/\\/(www\\.)?ex.fm/, '');\n            query += \"?client_id=tomahawk\";\n        }\n        Tomahawk.asyncRequest(query, function (xhr) {\n            var res = JSON.parse(xhr.responseText);\n            if (res.hasOwnProperty(\"song\")) {\n                // One single song\n                return that.track2Result(res.song);\n            } else if (res.hasOwnProperty(\"site\") && res.site.hasOwnProperty(\"songs\")) {\n                // A site with songs\n                var guid;\n                if (typeof CryptoJS !== \"undefined\" && typeof CryptoJS.SHA256 == \"function\") {\n                    guid = CryptoJS.SHA256(query).toString(CryptoJS.enc.Hex);\n                } else {\n                    guid = Tomahawk.sha256(query);\n                }\n                var result = {\n                    type: \"playlist\",\n                    title: res.site.title,\n                    guid: 'exfm-site-' + guid,\n                    info: \"ex.fm parse of : \" + res.site.url,\n                    creator: \"exfm\",\n                    url: url,\n                    tracks: []\n                };\n                res.site.songs.forEach(function (item) {\n                    result.tracks.push(that.track2Result(item));\n                });\n                Tomahawk.addUrlResult(url, result);\n            } else if (res.hasOwnProperty(\"songs\")) {\n                // A list of songs\n                var guid;\n                if (typeof CryptoJS !== \"undefined\" && typeof CryptoJS.SHA256 == \"function\") {\n                    guid = CryptoJS.SHA256(query).toString(CryptoJS.enc.Hex);\n                } else {\n                    guid = Tomahawk.sha256(query);\n                }\n                var result = {\n                    type: \"playlist\",\n                    title: \"ex.fm\" + url.replace(/https?:\\/\\/(www\\.)?ex.fm/, ''),\n                    guid: 'exfm-playlist-' + guid,\n                    info: \"A playlist imported from ex.fm: \" + url,\n                    creator: \"exfm\",\n                    url: url,\n                    tracks: []\n                };\n                res.songs.forEach(function (item) {\n                    result.tracks.push(that.track2Result(item));\n                });\n                Tomahawk.addUrlResult(url, result);\n            } else {\n                Tomahawk.log(\"Could not parse ex.fm URL: \" + url);\n                Tomahawk.addUrlResult(url, {})\n            };\n        });\n    },\n\n    search: function (qid, searchString) {\n        this.settings.strictMatch = false;\n        this.resolve(qid, \"\", \"\", searchString);\n    }\n});\n\nTomahawk.resolver.instance = ExfmResolver;\n"
  },
  {
    "path": "archive/exfm/content/metadata.json",
    "content": "{\n    \"name\": \"ex.fm\",\n    \"pluginName\": \"ex.fm\",\n    \"author\": \"Nicolas and Uwe\",\n    \"email\": \"uwelk@xhochy.com\",\n    \"version\": \"0.3.3\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Resolves tracks via the ex.fm API\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/exfm.js\",\n    \t\"scripts\": [\n        ],\n\t\"icon\": \"contents/images/icon.png\",\n\t\"resources\": [\n        \"contents/code/exfm-icon.png\"\n\t]\n    }\n}\n"
  },
  {
    "path": "archive/grooveshark/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>447</width>\n    <height>305</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QLabel\" name=\"label_2\">\n     <property name=\"text\">\n      <string/>\n     </property>\n     <property name=\"pixmap\">\n      <pixmap>grooveshark.png</pixmap>\n     </property>\n     <property name=\"alignment\">\n      <set>Qt::AlignCenter</set>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"label\">\n     <property name=\"text\">\n      <string>Tomahawk requires a Grooveshark Anywhere account.</string>\n     </property>\n     <property name=\"alignment\">\n      <set>Qt::AlignCenter</set>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::FieldsStayAtSizeHint</enum>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"usernameLabel\">\n       <property name=\"text\">\n        <string>Username</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"usernameLineEdit\"/>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"passwordLabel\">\n       <property name=\"text\">\n        <string>Password</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"passwordLineEdit\">\n       <property name=\"echoMode\">\n        <enum>QLineEdit::Password</enum>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "archive/grooveshark/content/contents/code/grooveshark.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2011-2012, Leo Franchi <lfranchi@kde.org>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU General Public License as published by\n *   the Free Software Foundation, either version 3 of the License, or\n *   (at your option) any later version.\n *\n *   Tomahawk is distributed in the hope that it will be useful,\n *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n *   GNU General Public License for more details.\n *\n *   You should have received a copy of the GNU General Public License\n *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.\n */\n\nif (Tomahawk.removeDiacritics) {\n    var removeDiacritics = function(str) {\n        return Tomahawk.removeDiacritics(str);\n    };\n} else {\n    // Fallback implementation for 0.7\n    // for removing diacritics [extracted from : http://lehelk.com/2011/05/06/script-to-remove-diacritics/]\n    var defaultDiacriticsRemovalMap = [\n        {'base':'A', 'letters':/[\\u0041\\u24B6\\uFF21\\u00C0\\u00C1\\u00C2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\u00C3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\u00C4\\u01DE\\u1EA2\\u00C5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F]/g},\n        {'base':'AA','letters':/[\\uA732]/g},\n        {'base':'AE','letters':/[\\u00C6\\u01FC\\u01E2]/g},\n        {'base':'AO','letters':/[\\uA734]/g},\n        {'base':'AU','letters':/[\\uA736]/g},\n        {'base':'AV','letters':/[\\uA738\\uA73A]/g},\n        {'base':'AY','letters':/[\\uA73C]/g},\n        {'base':'B', 'letters':/[\\u0042\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181]/g},\n        {'base':'C', 'letters':/[\\u0043\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\u00C7\\u1E08\\u0187\\u023B\\uA73E]/g},\n        {'base':'D', 'letters':/[\\u0044\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779]/g},\n        {'base':'DZ','letters':/[\\u01F1\\u01C4]/g},\n        {'base':'Dz','letters':/[\\u01F2\\u01C5]/g},\n        {'base':'E', 'letters':/[\\u0045\\u24BA\\uFF25\\u00C8\\u00C9\\u00CA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\u00CB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E]/g},\n        {'base':'F', 'letters':/[\\u0046\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B]/g},\n        {'base':'G', 'letters':/[\\u0047\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E]/g},\n        {'base':'H', 'letters':/[\\u0048\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D]/g},\n        {'base':'I', 'letters':/[\\u0049\\u24BE\\uFF29\\u00CC\\u00CD\\u00CE\\u0128\\u012A\\u012C\\u0130\\u00CF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197]/g},\n        {'base':'J', 'letters':/[\\u004A\\u24BF\\uFF2A\\u0134\\u0248]/g},\n        {'base':'K', 'letters':/[\\u004B\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2]/g},\n        {'base':'L', 'letters':/[\\u004C\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780]/g},\n        {'base':'LJ','letters':/[\\u01C7]/g},\n        {'base':'Lj','letters':/[\\u01C8]/g},\n        {'base':'M', 'letters':/[\\u004D\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C]/g},\n        {'base':'N', 'letters':/[\\u004E\\u24C3\\uFF2E\\u01F8\\u0143\\u00D1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4]/g},\n        {'base':'NJ','letters':/[\\u01CA]/g},\n        {'base':'Nj','letters':/[\\u01CB]/g},\n        {'base':'O', 'letters':/[\\u004F\\u24C4\\uFF2F\\u00D2\\u00D3\\u00D4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\u00D5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\u00D6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\u00D8\\u01FE\\u0186\\u019F\\uA74A\\uA74C]/g},\n        {'base':'OI','letters':/[\\u01A2]/g},\n        {'base':'OO','letters':/[\\uA74E]/g},\n        {'base':'OU','letters':/[\\u0222]/g},\n        {'base':'P', 'letters':/[\\u0050\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754]/g},\n        {'base':'Q', 'letters':/[\\u0051\\u24C6\\uFF31\\uA756\\uA758\\u024A]/g},\n        {'base':'R', 'letters':/[\\u0052\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782]/g},\n        {'base':'S', 'letters':/[\\u0053\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784]/g},\n        {'base':'T', 'letters':/[\\u0054\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786]/g},\n        {'base':'TZ','letters':/[\\uA728]/g},\n        {'base':'U', 'letters':/[\\u0055\\u24CA\\uFF35\\u00D9\\u00DA\\u00DB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\u00DC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244]/g},\n        {'base':'V', 'letters':/[\\u0056\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245]/g},\n        {'base':'VY','letters':/[\\uA760]/g},\n        {'base':'W', 'letters':/[\\u0057\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72]/g},\n        {'base':'X', 'letters':/[\\u0058\\u24CD\\uFF38\\u1E8A\\u1E8C]/g},\n        {'base':'Y', 'letters':/[\\u0059\\u24CE\\uFF39\\u1EF2\\u00DD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE]/g},\n        {'base':'Z', 'letters':/[\\u005A\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762]/g},\n        {'base':'a', 'letters':/[\\u0061\\u24D0\\uFF41\\u1E9A\\u00E0\\u00E1\\u00E2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\u00E3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\u00E4\\u01DF\\u1EA3\\u00E5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250]/g},\n        {'base':'aa','letters':/[\\uA733]/g},\n        {'base':'ae','letters':/[\\u00E6\\u01FD\\u01E3]/g},\n        {'base':'ao','letters':/[\\uA735]/g},\n        {'base':'au','letters':/[\\uA737]/g},\n        {'base':'av','letters':/[\\uA739\\uA73B]/g},\n        {'base':'ay','letters':/[\\uA73D]/g},\n        {'base':'b', 'letters':/[\\u0062\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253]/g},\n        {'base':'c', 'letters':/[\\u0063\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\u00E7\\u1E09\\u0188\\u023C\\uA73F\\u2184]/g},\n        {'base':'d', 'letters':/[\\u0064\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A]/g},\n        {'base':'dz','letters':/[\\u01F3\\u01C6]/g},\n        {'base':'e', 'letters':/[\\u0065\\u24D4\\uFF45\\u00E8\\u00E9\\u00EA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\u00EB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD]/g},\n        {'base':'f', 'letters':/[\\u0066\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C]/g},\n        {'base':'g', 'letters':/[\\u0067\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F]/g},\n        {'base':'h', 'letters':/[\\u0068\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265]/g},\n        {'base':'hv','letters':/[\\u0195]/g},\n        {'base':'i', 'letters':/[\\u0069\\u24D8\\uFF49\\u00EC\\u00ED\\u00EE\\u0129\\u012B\\u012D\\u00EF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131]/g},\n        {'base':'j', 'letters':/[\\u006A\\u24D9\\uFF4A\\u0135\\u01F0\\u0249]/g},\n        {'base':'k', 'letters':/[\\u006B\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3]/g},\n        {'base':'l', 'letters':/[\\u006C\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747]/g},\n        {'base':'lj','letters':/[\\u01C9]/g},\n        {'base':'m', 'letters':/[\\u006D\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F]/g},\n        {'base':'n', 'letters':/[\\u006E\\u24DD\\uFF4E\\u01F9\\u0144\\u00F1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5]/g},\n        {'base':'nj','letters':/[\\u01CC]/g},\n        {'base':'o', 'letters':/[\\u006F\\u24DE\\uFF4F\\u00F2\\u00F3\\u00F4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\u00F5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\u00F6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\u00F8\\u01FF\\u0254\\uA74B\\uA74D\\u0275]/g},\n        {'base':'oi','letters':/[\\u01A3]/g},\n        {'base':'ou','letters':/[\\u0223]/g},\n        {'base':'oo','letters':/[\\uA74F]/g},\n        {'base':'p','letters':/[\\u0070\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755]/g},\n        {'base':'q','letters':/[\\u0071\\u24E0\\uFF51\\u024B\\uA757\\uA759]/g},\n        {'base':'r','letters':/[\\u0072\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783]/g},\n        {'base':'s','letters':/[\\u0073\\u24E2\\uFF53\\u00DF\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B]/g},\n        {'base':'t','letters':/[\\u0074\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787]/g},\n        {'base':'tz','letters':/[\\uA729]/g},\n        {'base':'u','letters':/[\\u0075\\u24E4\\uFF55\\u00F9\\u00FA\\u00FB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\u00FC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289]/g},\n        {'base':'v','letters':/[\\u0076\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C]/g},\n        {'base':'vy','letters':/[\\uA761]/g},\n        {'base':'w','letters':/[\\u0077\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73]/g},\n        {'base':'x','letters':/[\\u0078\\u24E7\\uFF58\\u1E8B\\u1E8D]/g},\n        {'base':'y','letters':/[\\u0079\\u24E8\\uFF59\\u1EF3\\u00FD\\u0177\\u1EF9\\u0233\\u1E8F\\u00FF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF]/g},\n        {'base':'z','letters':/[\\u007A\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763]/g}\n    ];\n    var removeDiacritics = function (str) {\n        for(var i=0; i<defaultDiacriticsRemovalMap.length; i++) {\n            str = str.replace(defaultDiacriticsRemovalMap[i].letters, defaultDiacriticsRemovalMap[i].base);\n        }\n        return str;\n    };\n}\n\nvar GroovesharkResolver = Tomahawk.extend(TomahawkResolver, {\n    apiKey: \"tomahawkplayer\",\n    sessionId: \"\",\n    countryId: \"\",\n    ip: \"\",\n\n    spell: function(a){magic=function(b){return(b=(b)?b:this).split(\"\").map(function(d){if(!d.match(/[A-Za-z]/)){return d}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64))}).join(\"\")};return magic(a)},\n\n    settings: {\n        name: 'Grooveshark',\n        icon: 'grooveshark-icon.png',\n        weight: 30,\n        timeout: 20\n    },\n\n    getConfigUi: function () {\n        var uiData = Tomahawk.readBase64(\"config.ui\");\n        return {\n            \"widget\": uiData,\n            fields: [{\n                name: \"username\",\n                widget: \"usernameLineEdit\",\n                property: \"text\"\n            }, {\n                name: \"password\",\n                widget: \"passwordLineEdit\",\n                property: \"text\"\n            }],\n            images: [{\n                \"grooveshark.png\": Tomahawk.readBase64(\"grooveshark.png\")\n            }]\n        };\n    },\n\n    newConfigSaved: function () {\n        var userConfig = this.getUserConfig();\n        if ((userConfig.username != this.username) || (userConfig.password != this.password)) {\n            this.sessionId = \"\";\n            this.countryId = \"\";\n\n            this.username = userConfig.username;\n            this.password = userConfig.password;\n\n            this.init();\n        }\n    },\n\n    init: function () {\n        var userConfig = this.getUserConfig();\n        if (!userConfig.username || !userConfig.password) {\n            Tomahawk.log(\"Grooveshark Resolver not properly configured!\");\n            return;\n        }\n        // Tomahawk.log(\"Doing Grooveshark resolver init, got credentials: \" + userConfig.username );\n        this.secret = this.spell(\"499pn17500pq8r20nso1613p2q264r7r\");\n        this.username = userConfig.username;\n        this.password = userConfig.password;\n\n        this.authenticate();\n\n        Tomahawk.addCustomUrlHandler(\"groove\", \"getStreamUrl\", true);\n\n        // Testing only\n        //Tomahawk.log(\"Getting playlist songs!\");\n        //this._apiCall('getPlaylistSongs', { playlistID: '64641975' }, function (xhr) {\n        //    Tomahawk.log(\"PLAYLIST RESPONSE: \" + xhr.responseText );\n        //});\n        //this._apiCall('getSongsInfo', { songIDs: ['3GBAjY'] }, function(xhr) {\n        //    Tomahawk.log(\"GOT SONG INFO:\" + xhr.responseText );\n        //});\n    },\n\n    configTest: function() {\n        this.authenticate(true);\n    },\n\n    authenticate: function (doConfigTest) {\n        // Tomahawk.log(\"Grooveshark resolver authenticating with username: \" + this.username);\n        var hashString;\n        if (typeof CryptoJS !== \"undefined\" && typeof CryptoJS.MD5 == \"function\") {\n            hashString = CryptoJS.MD5(this.password).toString(CryptoJS.enc.Hex);\n        } else {\n            hashString = Tomahawk.md5(this.password);\n        }\n        var params = {\n            login: this.username,\n            password: hashString\n        };\n        var errorHandler;\n        if (doConfigTest){\n            errorHandler = function () {\n                Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.CommunicationError);\n            };\n        }\n        this.apiCallWithSessionId(\"authenticate\", params, function (xhr) {\n            // Tomahawk.log(\"Got result of authenticate: \" + xhr.responseText);\n            var ret = JSON.parse(xhr.responseText);\n            if (ret.result.success) {\n                if (ret.result.UserID == 0) {\n                    if (doConfigTest) {\n                        Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidCredentials);\n                    }\n                } else if (!ret.result.IsAnywhere) {\n                    if (doConfigTest) {\n                        Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Other,\n                            \"Tomahawk requires a Grooveshark Anywhere account.\");\n                    }\n                    Tomahawk.log(\"Tomahawk requires a Grooveshark Anywhere account!\");\n                } else if (doConfigTest) {\n                    Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Success);\n                }\n            } else if (doConfigTest) {\n                Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidAccount);\n            }\n        }, errorHandler);\n    },\n\n    ensureSessionId: function (callback, errorHandler) {\n        if (this.sessionId) {\n            if (callback) {\n                callback.call(window);\n            }\n        } else {\n            var that = this;\n            this.apiCall(\"startSession\", [], function (xhr) {\n                var res = JSON.parse(xhr.responseText);\n                if (res.result && res.result.success) {\n                    // Tomahawk.log(\"Got grooveshark session id\");\n                    that.sessionId = res.result.sessionID;\n                    if (callback) {\n                        callback.call(window);\n                    }\n                } else {\n                    if (errorHandler) {\n                        errorHandler.call(window);\n                    }\n                    Tomahawk.log(\"Not able to get session id.. \" + xhr.responseText);\n                }\n            }, errorHandler);\n        }\n    },\n\n    ensureClientIP: function (callback) {\n        if (this.ip) {\n            if (callback) {\n                callback.call(window);\n            }\n        } else {\n            var that = this;\n            Tomahawk.asyncRequest(\"http://toma.hk?stat=1\", function (xhr) {\n                var result = JSON.parse(xhr.responseText);\n                if (result.ip) {\n                    that.ip = result.ip;\n                    if (callback) {\n                        callback.call(window);\n                    }\n                }\n            });\n        }\n    },\n\n    ensureCountryId: function (callback) {\n        if (this.countryId) {\n            if (callback) {\n                callback.call(window);\n            }\n        } else {\n            var that = this;\n            // Tomahawk.log(\"Grooveshark resolver Getting country...\");\n            that.ensureClientIP(function () {\n                that.apiCall('getCountry', [], function (xhr) {\n                    var ret = JSON.parse(xhr.responseText);\n                    if (ret.result) {\n                        that.countryId = ret.result;\n                        // Tomahawk.log(\"Got country id: \" + that.countryId);\n                        if (callback) {\n                            callback.call(window);\n                        }\n                    } else {\n                        Tomahawk.log(\"Not able to get country id.. \" + xhr.responseText);\n                    }\n                });\n            });\n        }\n    },\n\n    apiCall: function (methodName, args, callback, errorHandler) {\n        // Tomahawk.log(\"_apiCall - methodName: \" + methodName + \", args: \" + args);\n        var payload = {\n            header: {\n                wsKey: this.apiKey\n            },\n            method: methodName,\n            parameters: args\n        };\n        if (this.sessionId != \"\") {\n            payload.header.sessionID = this.sessionId;\n        }\n\n        var data = JSON.stringify(payload);\n        var sig;\n        if (typeof CryptoJS !== \"undefined\" && typeof CryptoJS.HmacMD5 == \"function\") {\n            sig = CryptoJS.HmacMD5(data, this.secret).toString(CryptoJS.enc.Hex);\n        } else {\n            sig = Tomahawk.hmac(this.secret, data);\n        }\n        var url = \"https://api.grooveshark.com/ws/3.0/?sig=\" + sig;\n\n        var headers = {\n            \"Content-Type\": \"application/json\"\n        };\n        this.asyncRequest(url, callback, headers, {\n            method: 'POST',\n            data: data,\n            errorHandler: errorHandler\n        });\n    },\n\n    /**\n     * We can't use Tomahawk.asyncRequest, because it is only capable of sending body data in a POST\n     * request since Jan 26, 2014 and we need to ensure backwards compatibility.\n     */\n    asyncRequest: function (url, callback, extraHeaders, options) {\n        // unpack options\n        var opt = options || {};\n        var method = opt.method || 'GET';\n        var xmlHttpRequest = new XMLHttpRequest();\n        xmlHttpRequest.open(method, url, true, opt.username, opt.password);\n        if (extraHeaders) {\n            for (var headerName in extraHeaders) {\n                xmlHttpRequest.setRequestHeader(headerName, extraHeaders[headerName]);\n            }\n        }\n        xmlHttpRequest.onreadystatechange = function () {\n            if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {\n                callback.call(window, xmlHttpRequest);\n            } else if (xmlHttpRequest.readyState === 4) {\n                Tomahawk.log(\"Failed to do \" + method + \" request: to: \" + url);\n                Tomahawk.log(\"Status Code was: \" + xmlHttpRequest.status);\n                if (opt.hasOwnProperty('errorHandler')) {\n                    opt.errorHandler.call(window, xmlHttpRequest);\n                }\n            }\n        };\n        xmlHttpRequest.send(opt.data || null);\n    },\n\n    apiCallWithCountryId: function (methodName, args, callback) {\n        var that = this;\n        that.ensureSessionId(function () {\n            that.ensureCountryId(function () {\n                args.country = that.countryId;\n                // Tomahawk.log(\"Setting country id: \" + args.country);\n                that.apiCall(methodName, args, callback);\n            });\n        });\n    },\n\n    apiCallWithSessionId: function (methodName, args, callback, errorHandler) {\n        var that = this;\n        that.ensureSessionId(function () {\n            that.apiCall(methodName, args, callback, errorHandler);\n        }, errorHandler);\n    },\n\n    getStreamUrl: function (qid, url) {\n        var songId = url.replace(\"groove://\", \"\");\n\n        //Tomahawk.log(\"Got factory function called to get grooveshark streaming url from:\" + ourUrl + \" and songId:\" + songId);\n        var params = {\n            songID: songId\n        };\n\n        var that = this;\n        this.apiCallWithCountryId('getSubscriberStreamKey', params, function (request) {\n            // Tomahawk.log(\"Got song stream url: \" + request.responseText);\n            var ret = JSON.parse(request.responseText);\n            if (ret.errors) {\n                Tomahawk.log(\"Error doing getSubscriberStreamKey api call: \"\n                    + request.responseText);\n                Tomahawk.log(\"Deleting old session key!\");\n                that.sessionId = \"\";\n            } else {\n                // ret.result.duration contains the duration of the song, we should update the duration here !\n                // Tomahawk.log(\"Reporting song stream url: \" + ret.result.url);\n                Tomahawk.reportStreamUrl(qid, ret.result.url);\n            }\n        });\n    },\n\n    doSearchOrResolve: function(qid, queryText, limit) {\n        var params = {\n            query: queryText,\n            limit: limit\n        };\n\n        var that = this;\n        this.apiCallWithCountryId(\"getSongSearchResults\", params, function (xhr) {\n            // Tomahawk.log(\"Got song search results: \" + xhr.responseText);\n            var ret = JSON.parse(xhr.responseText);\n            if (!ret || !ret.result || !ret.result.songs) {\n                return;\n            }\n            var songs = ret.result.songs;\n            var results = []\n\n            if (songs.length === 0)\n            // we should try without artist name, just album song name\n            {\n                return;\n            }\n            // Tomahawk.log(\"Got search result with num of songs: \" + songs.length);\n            for (var i = 0; i < songs.length; i++) {\n                var song = songs[i];\n                var songResult = {\n                    artist: song.ArtistName,\n                    album: song.AlbumName,\n                    track: song.SongName,\n                    source: that.settings.name,\n                    url: \"groove://\" + song.SongID,\n                    mimetype: 'audio/mpeg'\n                    //duration: ret.result.uSecs/ 1000000\n                    // score: Tomahawk.valueForSubNode(song, \"rating\")\n                };\n                results.push(songResult);\n            }\n            var toReturn = {\n                results: results,\n                qid: qid\n            };\n            Tomahawk.addTrackResults(toReturn);\n        });\n    },\n\n    resolve: function (qid, artist, album, title) {\n\t    var searchString = \"\";\n\t    if (title != \"\" && title != undefined)\n\t\t    searchString += \" song:\" + title;\n\t    if (artist != \"\" && artist != undefined)\n\t\t    searchString += \" artist:\" + artist;\n\t    if (album != \"\" && album != undefined)\n\t\t    searchString += \" album:\" + album;\n\t    // we use removeDiacritics cause it seems to have some problem in grooveshark resolving\n\t    this.doSearchOrResolve(qid, removeDiacritics(searchString), 1);\n    },\n\n    search: function (qid, searchString) {\n       this.doSearchOrResolve(qid, searchString, 15);\n    }\n});\n\nTomahawk.resolver.instance = GroovesharkResolver;\n"
  },
  {
    "path": "archive/grooveshark/content/metadata.json",
    "content": "{\n    \"name\": \"Grooveshark\",\n    \"pluginName\": \"grooveshark\",\n    \"author\": \"Leo Franchi and Enno\",\n    \"email\": \"lfranchi@kde.org\",\n    \"version\": \"0.8.0\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Searches Grooveshark for playable tracks. Requires a VIP account.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/grooveshark.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/config.ui\",\n            \"contents/code/grooveshark.png\",\n            \"contents/code/grooveshark.svg\",\n            \"contents/code/grooveshark-icon.png\"\n        ]\n    },\n    \"staticCapabilities\": [\n        \"configTestable\"\n    ]\n}\n"
  },
  {
    "path": "archive/rdio/content/contents/code/rdio.js",
    "content": "/*\n *   Copyright 2013,      Uwe L. Korn <uwelk@xhochy.com>\n *   Copyright 2014,      Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n\nvar RdioResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'rdio',\n        icon: 'rdio.png',\n        weight: 95,\n        timeout: 15\n    },\n\n    clientId: \"byjtfyv7k5o7mxjd7xkdfycpnv\",\n\n    clientSecret: \"79es-w4OOB1aHlKST18rLj\",\n\n    redirectUri: \"tomahawkrdioresolver://callback\",\n\n    storageKeyRefreshToken: \"rdio_refresh_token\",\n\n    /**\n     * Get the access token. Refresh when it is expired.\n     */\n    getAccessToken: function () {\n        return this._getAccessToken(true);\n    },\n\n    /**\n     * Get the access token. Refresh when it is expired.\n     */\n    _getAccessToken: function (userAuthRequired) {\n        var that = this;\n        if (!this.getAccessTokenPromise || new Date().getTime() + 60000 > that.accessTokenExpires) {\n            Tomahawk.log(\"Access token is not valid. We need to get a new one.\");\n            this.getAccessTokenPromise = new RSVP.Promise(function (resolve, reject) {\n                var refreshToken = Tomahawk.localStorage.getItem(that.storageKeyRefreshToken);\n                if (!refreshToken && userAuthRequired) {\n                    Tomahawk.log(\"Can't fetch new access token, because there's no stored refresh \"\n                        + \"token. Are you logged in?\");\n                    reject(\"Can't fetch new access token, because there's no stored refresh\"\n                        + \" token. Are you logged in?\");\n                }\n                resolve(refreshToken);\n            }).then(function (refreshToken) {\n                    Tomahawk.log(\"Fetching new access token ...\");\n                    var settings = {\n                        headers: {\n                            \"Authorization\": \"Basic \"\n                            + Tomahawk.base64Encode(that._spell(that.clientId)\n                                + \":\" + that._spell(that.clientSecret)),\n                            \"Content-Type\": \"application/x-www-form-urlencoded\"\n                        },\n                        data: {\n                            \"grant_type\": \"refresh_token\",\n                            \"refresh_token\": refreshToken\n                        }\n                    };\n                    if (refreshToken) {\n                        settings.data = {\n                            \"grant_type\": \"refresh_token\",\n                            \"refresh_token\": refreshToken\n                        };\n                    } else {\n                        settings.data = {\n                            \"grant_type\": \"client_credentials\"\n                        };\n                    }\n                    return Tomahawk.post(\"https://services.rdio.com/oauth2/token\", settings)\n                        .then(function (res) {\n                            that.accessToken = res.access_token;\n                            that.accessTokenExpires =\n                                new Date().getTime() + res.expires_in * 1000;\n                            Tomahawk.log(\"Received new access token!\");\n                            Tomahawk.log(res.access_token);\n                            return {\n                                accessToken: res.access_token,\n                                accessTokenExpires: res.expires_in\n                            };\n                        });\n                });\n        }\n        return this.getAccessTokenPromise;\n    },\n\n    login: function () {\n        Tomahawk.log(\"Starting login\");\n\n        var authUrl = \"https://www.rdio.com/oauth2/authorize\";\n        authUrl += \"?client_id=\" + this._spell(this.clientId);\n        authUrl += \"&response_type=code\";\n        authUrl += \"&redirect_uri=\" + encodeURIComponent(this.redirectUri);\n\n        Tomahawk.showWebView(authUrl);\n    },\n\n    logout: function () {\n        Tomahawk.localStorage.removeItem(this.storageKeyAccessToken);\n        Tomahawk.localStorage.removeItem(this.storageKeyAccessTokenSecret);\n        Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Logout);\n    },\n\n    isLoggedIn: function () {\n        var accessToken = Tomahawk.localStorage.getItem(this.storageKeyAccessToken);\n        var accessTokenSecret = Tomahawk.localStorage.removeItem(this.storageKeyAccessTokenSecret);\n        return accessToken !== null && accessToken.length > 0\n            && accessTokenSecret !== null && accessTokenSecret.length > 0;\n    },\n\n    /**\n     * This function is being called from the native side whenever it has received a redirect\n     * callback. In other words, the WebView shown to the user can call the js side here.\n     */\n    onRedirectCallback: function (params) {\n        var url = params.url;\n\n        var error = this._getParameterByName(url, \"error\");\n        if (error) {\n            Tomahawk.log(\"Authorization failed: \" + error);\n            Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Other, error);\n        } else {\n            Tomahawk.log(\"Authorization successful, fetching new refresh token ...\");\n            var settings = {\n                headers: {\n                    \"Authorization\": \"Basic \" + Tomahawk.base64Encode(this._spell(this.clientId)\n                        + \":\" + this._spell(this.clientSecret)),\n                    \"Content-Type\": \"application/x-www-form-urlencoded\"\n                },\n                data: {\n                    grant_type: \"authorization_code\",\n                    code: this._getParameterByName(url, \"code\"),\n                    redirect_uri: this.redirectUri\n                }\n            };\n\n            var that = this;\n            Tomahawk.post(\"https://services.rdio.com/oauth2/token\", settings)\n                .then(function (response) {\n                    Tomahawk.localStorage.setItem(that.storageKeyRefreshToken,\n                        response.refresh_token);\n                    Tomahawk.log(\"Received new refresh token!\");\n                    Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Success);\n                });\n        }\n    },\n\n    /**\n     * Returns the value of the query parameter with the given name from the given URL.\n     */\n    _getParameterByName: function (url, name) {\n        name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n        var regex = new RegExp(\"[\\\\?&#]\" + name + \"=([^&#]*)\"), results = regex.exec(url);\n        return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n    },\n\n    init: function () {\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n    },\n\n    _spell: function (a) {\n        var magic = function (b) {\n            return (b ? b : this).split(\"\").map(function (d) {\n                if (!d.match(/[A-Za-z]/)) {\n                    return d\n                }\n                c = d.charCodeAt(0) >= 96;\n                k = (d.toLowerCase().charCodeAt(0) - 96 + 12) % 26 + 1;\n                return String.fromCharCode(k + (c ? 96 : 64))\n            }).join(\"\")\n        };\n        return magic(a)\n    },\n\n    resolve: function (params) {\n        var artist = params.artist;\n        var album = params.album;\n        var track = params.track;\n\n        var that = this;\n\n        return this.getAccessToken().then(function (response) {\n            var settings = {\n                data: {\n                    method: \"search\",\n                    query: artist + \" \" + track,\n                    types: \"track\"\n                },\n                headers: {\n                    \"Authorization\": \"Bearer \" + response.accessToken\n                }\n            };\n            return Tomahawk.post(\"https://services.rdio.com/api/1/\", settings)\n                .then(function (response) {\n                    var result = response.result;\n                    if (response.status == 'ok') {\n                        var results = [];\n                        for (var i = 0; i < result.results.length; i++) {\n                            if (result.results[i].type == 't' && result.results[i].canStream) {\n                                results.push({\n                                    source: that.settings.name,\n                                    artist: result.results[i].artist,\n                                    track: result.results[i].name,\n                                    duration: result.results[i].duration,\n                                    url: \"rdio://track/\" + result.results[i].key,\n                                    album: result.results[i].album,\n                                    linkUrl: result.results[i].url\n                                });\n                            }\n                        }\n                        return results;\n                    } else {\n                        throw new Error('Error in resolve: ' + JSON.stringify(result));\n                    }\n                }\n            );\n        });\n    },\n\n    search: function (params) {\n        var query = params.query;\n\n        return this.resolve({track: query});\n    },\n\n    getStreamUrl: function (params) {\n        var url = params.url;\n\n        return {\n            url: url.replace(\"rdio://track/\", \"\")\n        };\n    },\n\n    canParseUrl: function (params) {\n        var url = params.url;\n        var type = params.type;\n\n        if (!url) {\n            throw new Error(\"Provided url was empty or null!\");\n        }\n        switch (type) {\n            case TomahawkUrlType.Album:\n                return /https?:\\/\\/(www\\.)?rdio.com\\/artist\\/([^\\/]*)\\/album\\/([^\\/]*)\\/?$/.test(url);\n            case TomahawkUrlType.Artist:\n                return /https?:\\/\\/(www\\.)?rdio.com\\/artist\\/([^\\/]*)\\/?$/.test(url);\n            case TomahawkUrlType.Playlist:\n                return /https?:\\/\\/(www\\.)?rdio.com\\/people\\/([^\\/]*)\\/playlists\\/(\\d+)\\//.test(url);\n            case TomahawkUrlType.Track:\n                return /https?:\\/\\/(www\\.)?rdio.com\\/artist\\/([^\\/]*)\\/album\\/([^\\/]*)\\/track\\/([^\\/]*)\\/?$/.test(url);\n            default:\n                return /https?:\\/\\/(www\\.)?rdio.com\\/([^\\/]*\\/|)/.test(url);\n        }\n    },\n\n    lookupUrl: function (params) {\n        var url = params.url;\n        Tomahawk.log(\"lookupUrl: \" + url);\n\n        return this._getAccessToken(false).then(function (response) {\n            var settings = {\n                data: {\n                    method: \"getObjectFromUrl\",\n                    extras: \"tracks\",\n                    url: url\n                },\n                headers: {\n                    \"Authorization\": \"Bearer \" + response.accessToken\n                }\n            };\n            return Tomahawk.post(\"https://services.rdio.com/api/1/\", settings)\n                .then(function (response) {\n                    Tomahawk.log(\"lookupUrl result: \" + JSON.stringify(response));\n                    var result = response.result;\n                    if (response.status == 'ok') {\n                        if (result.type == 'p') {\n                            var tracks = result.tracks.map(function (item) {\n                                return {\n                                    type: Tomahawk.UrlType.Track,\n                                    track: item.name,\n                                    artist: item.artist\n                                };\n                            });\n                            return {\n                                type: Tomahawk.UrlType.Playlist,\n                                title: result.name,\n                                guid: \"rdio-playlist-\" + result.key,\n                                info: \"A playlist by \" + result.owner + \" on rdio.\",\n                                creator: result.owner,\n                                linkUrl: result.shortUrl,\n                                tracks: tracks\n                            };\n                        } else if (result.type == 't') {\n                            return {\n                                type: Tomahawk.UrlType.Track,\n                                track: result.name,\n                                artist: result.artist\n                            };\n                        } else if (result.type == 'a') {\n                            return {\n                                type: Tomahawk.UrlType.Album,\n                                album: result.name,\n                                artist: result.artist\n                            };\n                        } else if (result.type == 'r') {\n                            return {\n                                type: Tomahawk.UrlType.Artist,\n                                artist: result.name\n                            };\n                        }\n                    } else {\n                        throw new Error('Error in lookupUrl: ' + JSON.stringify(result));\n                    }\n                }\n            );\n        });\n    }\n});\n\nTomahawk.resolver.instance = RdioResolver;\n\n"
  },
  {
    "path": "archive/rdio/content/metadata.json",
    "content": "{\n    \"name\": \"Rdio\",\n    \"pluginName\": \"rdio\",\n    \"author\": \"Uwe and Enno\",\n    \"email\": \"uwelk@xhochy.com\",\n    \"version\": \"0.3.1\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Stream music with Rdio. Premium Rdio account required.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/rdio.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/rdio.png\"\n        ]\n    }\n}\n"
  },
  {
    "path": "archive/rdio-metadata/content/contents/code/rdio-metadata.js",
    "content": "/*\n *   Copyright 2013,      Uwe L. Korn <uwelk@xhochy.com>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n\nvar RdioMetadataResolver = Tomahawk.extend(TomahawkResolver, {\n    settings: {\n        name: 'rdio Metadata',\n        icon: 'rdio-metadata.png',\n        weight: 0, // We cannot resolve, so use minimum weight\n        timeout: 15\n    },\n\n\tinit: function() {\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n\t},\n\n\n    resolve: function (qid, artist, album, title) {\n        Tomahawk.addTrackResults({ results: [], qid: qid });\n    },\n\n\tsearch: function (qid, searchString) {\n        Tomahawk.addTrackResults({ results: [], qid: qid });\n\t},\n\n    canParseUrl: function (url, type) {\n        switch (type) {\n        case TomahawkUrlType.Album:\n            return /https?:\\/\\/(www\\.)?rdio.com\\/artist\\/([^\\/]*)\\/album\\/([^\\/]*)\\/?$/.test(url);\n        case TomahawkUrlType.Artist:\n            return /https?:\\/\\/(www\\.)?rdio.com\\/artist\\/([^\\/]*)\\/?$/.test(url);\n        case TomahawkUrlType.Playlist:\n            return /https?:\\/\\/(www\\.)?rdio.com\\/people\\/([^\\/]*)\\/playlists\\/(\\d+)\\//.test(url);\n        case TomahawkUrlType.Track:\n            return /https?:\\/\\/(www\\.)?rdio.com\\/artist\\/([^\\/]*)\\/album\\/([^\\/]*)\\/track\\/([^\\/]*)\\/?$/.test(url);\n        // case TomahawkUrlType.Any:\n        default:\n            return /https?:\\/\\/(www\\.)?rdio.com\\/([^\\/]*\\/|)/.test(url);\n        }\n    },\n\n    encodeOAuthComponent: function(url) {\n        return encodeURIComponent(url)\n            .replace(/\\!/g, \"%21\")\n            .replace(/\\*/g, \"%2A\")\n            .replace(/\\'/g, \"%27\")\n            .replace(/\\(/g, \"%28\")\n            .replace(/\\)/g, \"%29\");\n    },\n\n    spell: function(a){magic=function(b){return(b=(b)?b:this).split(\"\").map(function(d){if(!d.match(/[A-Za-z]/)){return d}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64))}).join(\"\")};return magic(a)},\n\n    lookupUrl: function (url) {\n        var that = this;\n        var fetchUrl = 'http://api.rdio.com/1/'\n        var query = 'extras=tracks&method=getObjectFromUrl';\n        query += '&oauth_consumer_key=' + this.spell(\"tdo7m2m8u6r7r76mpod9jqlc\");\n        var nonce = '';\n        for (i = 0; i < 8; i++) nonce += parseInt(Math.random() * 10).toString();\n        query += '&oauth_nonce=' + nonce;\n        query += '&oauth_signature_method=' + this.encodeOAuthComponent('HMAC-SHA1');\n        query += '&oauth_timestamp=' + Math.round((new Date()).getTime() / 1000);;\n        query += '&oauth_version=1.0';\n        query += '&url=' + this.encodeOAuthComponent(url);\n        var toSign = 'POST&' + this.encodeOAuthComponent(fetchUrl) + '&' + this.encodeOAuthComponent(query);\n        var signature = CryptoJS.HmacSHA1(toSign, this.spell(\"oKeSjHrS9d\") + '&').toString(CryptoJS.enc.Base64);\n        query += '&oauth_signature=' + this.encodeOAuthComponent(signature);\n        Tomahawk.log(fetchUrl)\n        Tomahawk.log(query)\n        Tomahawk.asyncRequest(fetchUrl, function (xhr) {\n            var res = JSON.parse(xhr.responseText);\n            if (res.status == 'ok') {\n                if (res.result.type == 'p') {\n                    var result = {\n                        type: \"playlist\",\n                        title: res.result.name,\n                        guid: \"rdio-playlist-\" + res.result.key,\n                        info: \"A playlist by \" + res.result.owner + \" on rdio.\",\n                        creator: res.result.owner,\n                        url: res.result.shortUrl,\n                        tracks: []\n                    };\n                    result.tracks = res.result.tracks.map(function (item) { return { type: \"track\", title: item.name, artist: item.artist }; });\n                    Tomahawk.addUrlResult(url, result);\n                } else if (res.result.type == 't') {\n                    Tomahawk.addUrlResult(url, {\n                        type: \"track\",\n                        title: res.result.name,\n                        artist: res.result.artist,\n                    });\n                } else if (res.result.type == 'a') {\n                    Tomahawk.addUrlResult(url, {\n                        type: \"album\",\n                        name: res.result.name,\n                        artist: res.result.artist,\n                    });\n                } else if (res.result.type == 'r') {\n                    Tomahawk.addUrlResult(url, {\n                        type: \"artist\",\n                        name: res.result.name,\n                    });\n                }\n            }\n        }, {\"Content-type\": \"application/x-www-form-urlencoded\"}, {\n            method: 'post',\n            data: query\n        });\n    }\n});\n\nTomahawk.resolver.instance = RdioMetadataResolver;\n\n"
  },
  {
    "path": "archive/rdio-metadata/content/metadata.json",
    "content": "{\n    \"name\": \"Rdio Metadata\",\n    \"pluginName\": \"rdio-metadata\",\n    \"author\": \"Uwe L. Korn\",\n    \"email\": \"uwelk@xhochy.com\",\n    \"version\": \"0.1.2\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"(0.8+) Supports loading and drag and drop of Rdio URLs.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/rdio-metadata.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/rdio-metadata.png\"\n        ]\n    }\n}\n"
  },
  {
    "path": "archive/spotify/BreakPad.cpp",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU General Public License as published by\n *   the Free Software Foundation, either version 3 of the License, or\n *   (at your option) any later version.\n *\n *   Tomahawk is distributed in the hope that it will be useful,\n *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n *   GNU General Public License for more details.\n *\n *   You should have received a copy of the GNU General Public License\n *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include \"BreakPad.h\"\n\n#include \"logger.h\"\n\n#include <QCoreApplication>\n#include <QString>\n#include <QFileInfo>\n#include <string.h>\n\n#define CRASH_REPORTER_BINARY \"tomahawk_crash_reporter\"\n\nbool s_active = true;\n\n#ifndef WIN32\n#include <unistd.h>\n\n\nstatic bool\nLaunchUploader( const char* dump_dir, const char* minidump_id, void* that, bool succeeded )\n{\n    // DON'T USE THE HEAP!!!\n    // So that indeed means, no QStrings, no qDebug(), no QAnything, seriously!\n\n    if ( !succeeded )\n        return false;\n\n    fprintf( stderr, minidump_id );\n    fprintf( stderr, \"\\n\" );\n\n    const char* crashReporter = static_cast<BreakPad*>(that)->crashReporter();\n    if ( !s_active || strlen( crashReporter ) == 0 )\n        return false;\n\n    pid_t pid = fork();\n    if ( pid == -1 ) // fork failed\n        return false;\n    if ( pid == 0 )\n    {\n        // we are the fork\n        execl( crashReporter,\n               crashReporter,\n               dump_dir,\n               minidump_id,\n               minidump_id,\n               (char*) 0 );\n\n        // execl replaces this process, so no more code will be executed\n        // unless it failed. If it failed, then we should return false.\n        printf( \"Error: Can't launch CrashReporter!\\n\" );\n        return false;\n    }\n\n    // we called fork()\n    return true;\n}\n\n\nBreakPad::BreakPad( const QString& path, bool active )\n#ifdef Q_OS_LINUX\n    : google_breakpad::ExceptionHandler( path.toStdString(), 0, LaunchUploader, this, true )\n#else\n    : google_breakpad::ExceptionHandler( path.toStdString(), 0, LaunchUploader, this, true, 0 )\n#endif\n{\n    s_active = active;\n\n    QString reporter = QString( \"%1/%2\" ).arg( qApp->applicationDirPath() ).arg( CRASH_REPORTER_BINARY );\n\n    char* creporter;\n    std::string sreporter = reporter.toStdString();\n    creporter = new char[ sreporter.size() + 1 ];\n    strcpy( creporter, sreporter.c_str() );\n\n    m_crashReporter = creporter;\n}\n\n\n#else\n\n\nstatic bool\nLaunchUploader( const wchar_t* dump_dir, const wchar_t* minidump_id, void* that, EXCEPTION_POINTERS *exinfo, MDRawAssertionInfo *assertion, bool succeeded )\n{\n    if ( !succeeded )\n        return false;\n\n    // DON'T USE THE HEAP!!!\n    // So that indeed means, no QStrings, no qDebug(), no QAnything, seriously!\n\n// broken in mingw, hardcode it for now\n\n    //     const char* productName = static_cast<BreakPad*>(that)->productName();s\n    // convert productName to widechars, which sadly means the product name must be Latin1\n\n    wchar_t product_name[ 256 ] = L\"tomahawk\";;\n\n//     char* out = (char*)product_name;\n//     const char* in = productName - 1;\n//     do {\n//         *out++ = *++in; //latin1 chars fit in first byte of each wchar\n//         *out++ = '\\0';  //every second byte is NULL\n//     }\n//     while (*in);\n\n    wchar_t command[MAX_PATH * 3 + 6];\n    wcscpy( command, CRASH_REPORTER_BINARY L\" \\\"\" );\n    wcscat( command, dump_dir );\n    wcscat( command, L\"\\\" \\\"\" );\n    wcscat( command, minidump_id );\n    wcscat( command, L\"\\\" \\\"\" );\n    wcscat( command, product_name );\n    wcscat( command, L\"\\\"\" );\n\n    STARTUPINFO si;\n    PROCESS_INFORMATION pi;\n\n    ZeroMemory( &si, sizeof( si ) );\n    si.cb = sizeof(si);\n    si.dwFlags = STARTF_USESHOWWINDOW;\n    si.wShowWindow = SW_SHOWNORMAL;\n    ZeroMemory( &pi, sizeof(pi) );\n\n    if ( CreateProcess( NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) )\n    {\n        CloseHandle( pi.hProcess );\n        CloseHandle( pi.hThread );\n        TerminateProcess( GetCurrentProcess(), 1 );\n    }\n\n    return false;\n}\n\n\nBreakPad::BreakPad( const QString& path, bool active )\n    : google_breakpad::ExceptionHandler( path.toStdWString(), 0, LaunchUploader, this, true )\n{\n    s_active = active;\n}\n\n#endif // WIN32\n\n\nvoid\nBreakPad::setActive( bool enabled )\n{\n    s_active = enabled;\n}\n\n\nbool\nBreakPad::isActive()\n{\n    return s_active;\n}\n"
  },
  {
    "path": "archive/spotify/BreakPad.h",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2010-2011, Christian Muehlhaeuser <muesli@tomahawk-player.org>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU General Public License as published by\n *   the Free Software Foundation, either version 3 of the License, or\n *   (at your option) any later version.\n *\n *   Tomahawk is distributed in the hope that it will be useful,\n *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n *   GNU General Public License for more details.\n *\n *   You should have received a copy of the GNU General Public License\n *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <QString>\n\n#ifdef __APPLE__\n#   include \"client/mac/handler/exception_handler.h\"\n#elif defined WIN32\n#   include \"client/windows/handler/exception_handler.h\"\n#elif defined __linux__\n#   include \"client/linux/handler/exception_handler.h\"\n#endif\n\nclass BreakPad : public google_breakpad::ExceptionHandler\n{\n    const char* m_productName; // yes! It MUST be const char[]\n    const char* m_crashReporter; // again, const char[]\n\npublic:\n    BreakPad( const QString& dump_write_dirpath, bool active );\n\n    ~BreakPad()\n    {}\n\n    static void setActive( bool enabled );\n    static bool isActive();\n\n    void setProductName( const char* s ) { m_productName = s; };\n    const char* productName() const { return m_productName; }\n\n    void setCrashReporter( const char* s ) { m_crashReporter = s; };\n    const char* crashReporter() const { return m_crashReporter; }\n};\n\n#undef char\n"
  },
  {
    "path": "archive/spotify/CMakeLists.txt",
    "content": "project(tomahawkspotify)\ncmake_minimum_required(VERSION 2.8.6)\nadd_definitions(-fexceptions)\nSET( CMAKE_MODULE_PATH \"${CMAKE_MODULE_PATH}\" \"${CMAKE_SOURCE_DIR}/cmake/\" )\n\nfind_package(Qt4 REQUIRED)\nfind_package(QJSON REQUIRED)\nfind_package(libspotify REQUIRED)\n\nfind_package(Boost REQUIRED)\n\nadd_subdirectory(qxtweb-standalone)\n\nIF( WITH_BREAKPAD )  \n    add_subdirectory(breakpad)    \nENDIF()\n\ninclude_directories( qxtweb-standalone/qxtweb kdsingleapplicationguard/ breakpad/\n                                              ${QT_INCLUDES}\n                                              ${LIBSPOTIFY_INCLUDE_DIR}\n                                              ${QJSON_INCLUDE_DIR}\n                                              ${Boost_INCLUDE_DIRS}\n                                              ${CMAKE_CURRENT_BINARY_DIR})\n\nif(NOT EXISTS \"${CMAKE_BINARY_DIR}/spotify-sourceicon.png\")\n    message(\"Copying spotify source icon to binary dir\")\n    file(COPY \"${CMAKE_SOURCE_DIR}/spotify-sourceicon.png\" DESTINATION ${CMAKE_BINARY_DIR})\nelse()\n    message(\"Found existing spotify source icon, not copying\")\nendif()\n\nset( tomahawkspotify_SRCS\n    kdsingleapplicationguard/kdsingleapplicationguard.cpp\n    kdsingleapplicationguard/kdsharedmemorylocker.cpp\n    kdsingleapplicationguard/kdtoolsglobal.cpp\n    kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp\n    PlaylistClosure.cpp\n    spotifyloghandler.cpp\n    spotifyplayback.cpp\n    spotifysearch.cpp\n    spotifyplaylists.cpp\n    spotifysession.cpp\n    spotifyresolver.cpp\n    consolewatcher.cpp\n    audiohttpserver.cpp\n    spotifyiodevice.cpp\n    main.cpp\n)\n\nIF( WITH_BREAKPAD )  \n    message(STATUS \"Build with support for breakpad.\")\n    if( APPLE )\n        FIND_LIBRARY( COREFOUNDATION_LIBRARY CoreFoundation )\n\n    ENDIF( APPLE )\n    LIST( APPEND tomahawkspotify_SRCS BreakPad.cpp )\nENDIF()\n\nset( tomahawkspotify_NOMOC_HDRS\n    kdsingleapplicationguard/kdsharedmemorylocker.h\n    kdsingleapplicationguard/kdtoolsglobal.h\n    kdsingleapplicationguard/kdlockedsharedmemorypointer.h\n)\n\nIF(WITH_BREAKPAD)\n    SET( BREAKPAD_LIBRARIES tomahawk_breakpad )\nENDIF()\n\n\nadd_executable(spotify_tomahawkresolver ${tomahawkspotify_SRCS} ${RC_SRCS} ${tomahawkspotify_NOMOC_HDRS} )\ntarget_link_libraries(spotify_tomahawkresolver qxtweb-standalone ${COREFOUNDATION_LIBRARY} ${BREAKPAD_LIBRARIES} ${QT_QTCORE_LIBRARY} ${LIBSPOTIFY_LIBRARIES} ${QT_QTNETWORK_LIBRARY} ${QJSON_LIBRARIES})\n\nSET_TARGET_PROPERTIES(spotify_tomahawkresolver PROPERTIES AUTOMOC TRUE)\n\ninclude(GNUInstallDirs)\ninstall(TARGETS spotify_tomahawkresolver RUNTIME DESTINATION ${CMAKE_INSTALL_LIBEXECDIR})\n"
  },
  {
    "path": "archive/spotify/PlaylistClosure.cpp",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2010-2012, Leo Franchi <lfranchi@kde.org>\n *\n *   Inspired by Clementine's Closure class\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU General Public License as published by\n *   the Free Software Foundation, either version 3 of the License, or\n *   (at your option) any later version.\n *\n *   Tomahawk is distributed in the hope that it will be useful,\n *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n *   GNU General Public License for more details.\n *\n *   You should have received a copy of the GNU General Public License\n *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include \"PlaylistClosure.h\"\n\n#include <QDebug>\n\nPlaylistClosure::PlaylistClosure(LoadedCondition condition,\n                 QObject* receiver,\n                 const char* slot,\n                 const ClosureArgumentWrapper* val0,\n                 const ClosureArgumentWrapper* val1,\n                 const ClosureArgumentWrapper* val2)\n      : condition_(condition)\n      , receiver_(receiver)\n      , val0_(val0)\n      , val1_(val1)\n      , val2_(val2)\n\n{\n  const QMetaObject* meta_receiver = receiver->metaObject();\n\n  QByteArray normalised_slot = QMetaObject::normalizedSignature(slot + 1);\n  const int index = meta_receiver->indexOfSlot(normalised_slot.constData());\n  Q_ASSERT(index != -1);\n  slot_ = meta_receiver->method(index);\n}\n\nbool\nPlaylistClosure::conditionSatisfied() const\n{\n    return condition_();\n}\n\nvoid\nPlaylistClosure::invoke()\n{\n//     qDebug() << val0_->arg().name() << val0_->arg().data();\n//     qDebug() << val1_->arg().name() << val1_->arg().data();\n//     qDebug() << val2_->arg().name() << val2_->arg().data();\n    slot_.invoke(receiver_,\n        val0_ ? val0_->arg() : QGenericArgument(),\n        val1_ ? val1_->arg() : QGenericArgument(),\n        val2_ ? val2_->arg() : QGenericArgument());\n}\n"
  },
  {
    "path": "archive/spotify/PlaylistClosure.h",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2011, David Sansome <me@davidsansome.com>\n *   Copyright 2012, Leo Franchi <lfranchi@kde.org>\n *\n *   Inspired by Clementine's Closure class\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU General Public License as published by\n *   the Free Software Foundation, either version 3 of the License, or\n *   (at your option) any later version.\n *\n *   Tomahawk is distributed in the hope that it will be useful,\n *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n *   GNU General Public License for more details.\n *\n *   You should have received a copy of the GNU General Public License\n *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#ifndef PLAYLISTCLOSURE_H\n#define PLAYLISTCLOSURE_H\n\n#include <libspotify/api.h>\n\n#include <QObject>\n#include <QList>\n#include <QMetaMethod>\n\n#ifdef Q_OS_WIN\n#include <tr1/functional.hpp>\n#else\n#include <tr1/functional>\n#endif\n\n#include <boost/noncopyable.hpp>\n#include <boost/scoped_ptr.hpp>\n\n/** Use this if the following is true:\n *\n * 1) You are doing an operation on a playlist\n * 2) Some sp_track* that you need to operate on hasn't loaded yet\n * 3) You need to re-do your operation whenever it has been loaded\n */\n\ntypedef std::tr1::function<bool ()> LoadedCondition;\n\nclass ClosureArgumentWrapper {\npublic:\n    virtual ~ClosureArgumentWrapper() {}\n\n    virtual QGenericArgument arg() const = 0;\n};\n\ntemplate<typename T>\nclass ClosureArgument : public ClosureArgumentWrapper {\npublic:\n    explicit ClosureArgument(const T& data) : data_(data) {}\n\n    virtual QGenericArgument arg() const {\n            return QArgument<T>(QMetaType::typeName(qMetaTypeId<T>()), data_);\n    }\n\nprivate:\n    T data_;\n};\n\n\nclass PlaylistClosure : boost::noncopyable\n{\npublic:\n    PlaylistClosure(LoadedCondition condition,\n            QObject* receiver, const char* slot,\n            const ClosureArgumentWrapper* val0 = 0,\n            const ClosureArgumentWrapper* val1 = 0,\n            const ClosureArgumentWrapper* val2 = 0);\n\n    virtual ~PlaylistClosure() {}\n\n    bool conditionSatisfied() const;\n\n    void invoke();\n\nprivate:\n    QObject* receiver_;\n    QMetaMethod slot_;\n    LoadedCondition condition_;\n\n    boost::scoped_ptr<const ClosureArgumentWrapper> val0_;\n    boost::scoped_ptr<const ClosureArgumentWrapper> val1_;\n    boost::scoped_ptr<const ClosureArgumentWrapper> val2_;\n};\n\n\n#define C_ARG(type, data) new ClosureArgument< type >(data)\n\n\ntemplate <typename T>\nPlaylistClosure* NewPlaylistClosure(LoadedCondition checker,\n                                             QObject* receiver,\n                                             const char* slot,\n                                             const T& val0) {\n    return new PlaylistClosure(\n                checker, receiver, slot,\n                C_ARG(T, val0));\n}\n\ntemplate <typename T0, typename T1>\nPlaylistClosure* NewPlaylistClosure(\n        LoadedCondition checker,\n        QObject* receiver,\n        const char* slot,\n        const T0& val0,\n        const T1& val1) {\n    return new PlaylistClosure(\n                checker, receiver, slot,\n                C_ARG(T0, val0), C_ARG(T1, val1));\n}\n\ntemplate <typename T0, typename T1, typename T2>\nPlaylistClosure* NewPlaylistClosure(\n        LoadedCondition checker,\n        QObject* receiver,\n        const char* slot,\n        const T0& val0,\n        const T1& val1,\n        const T2& val2) {\n    return new PlaylistClosure(\n                checker, receiver, slot,\n                C_ARG(T0, val0), C_ARG(T1, val1), C_ARG(T2, val2));\n}\n\n\n#endif // PLAYLISTCLOSURE_H"
  },
  {
    "path": "archive/spotify/appkey.h",
    "content": ""
  },
  {
    "path": "archive/spotify/audiohttpserver.cpp",
    "content": "/*\n    Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n    Copyright (c) 2012,Hugo Lindström <hugolm84@gmail.com>\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n#include \"audiohttpserver.h\"\n#include \"spotifyresolver.h\"\n#include \"QxtWebPageEvent\"\n#include \"spotifyiodevice.h\"\n#include <QString>\n#include <QDebug>\n\nAudioHTTPServer::AudioHTTPServer( QxtAbstractWebSessionManager* sm, int port, QObject* parent )\n    : QxtWebSlotService( sm, parent )\n    , m_port( port )\n    , m_savedDuration( 0 )\n    , m_savedByteRange( 0 )\n{\n//    qDebug() << \"NEW AUDIO HTTP SERVER!\";\n}\n\nAudioHTTPServer::~AudioHTTPServer()\n{\n}\n\nvoid AudioHTTPServer::sid( QxtWebRequestEvent* event, QString a )\n{\n    qDebug() << QThread::currentThreadId() << \"HTTP\" << event->url.toString() << a;\n    // byte range, if seek\n    int m_savedByteRange = QString(event->headers.value( \"Range\" ) ).remove( \"bytes=\" ).remove( \"-\" ).toInt();\n\n    qDebug() << \"Got savedByteRange?\" << m_savedByteRange;\n    qDebug() << \"sid Headers\" << event->headers;\n\n    // the requested track\n    QString uid = a.replace( \".wav\", \"\");\n\n    if( m_savedByteRange != 0 )\n    {\n        if( !m_savedTrackUri.isEmpty() && uid == m_savedTrackUri && m_savedByteRange > 0 && m_savedDuration > 0 )\n        {\n            int seek = convertByteRangeToMsec( m_savedByteRange );\n            if( seek <= 0 )\n            {\n                qDebug() << \"Seekrange was invaild, aborting\" << seek;\n                sendErrorResponse( event );\n                return;\n            }\n\n            performSeek( event, seek, uid );\n            return;\n        }\n    }\n    else\n    {\n\n        if( !SpotifySession::getInstance()->Playback()->trackIsOver() )\n        {\n            SpotifySession::getInstance()->Playback()->endTrack();\n        }\n    //    qDebug() << QThread::currentThreadId() << \"Beginning to stream requested track:\" << uid;\n        if( uid.isEmpty() || !sApp->hasLinkFromTrack( uid ) ) {\n            qWarning() << \"Did not find spotify track UID in our list!\" << uid;\n            sendErrorResponse( event );\n            return;\n        }\n\n        // get the sp_track\n        sp_link* link = sApp->linkFromTrack( uid );\n        sp_track* track = sp_link_as_track( link );\n        m_savedTrackUri = uid;\n\n        if( !track )\n        {\n            qWarning() << QThread::currentThreadId() << \"Uh oh... got null track from link :(\" << sp_link_type( link );\n            sendErrorResponse( event );\n            return;\n        }\n        if( !sp_track_is_loaded( track ) )\n        {\n            qWarning() << QThread::currentThreadId() << \"uh oh... track not loaded yet! Asked for:\" << sp_track_name( track );\n            m_savedEvent = event;\n            m_savedTrack = track;\n            QTimer::singleShot( 250, this, SLOT( checkForLoaded() ) );\n            return;\n\n        } else\n        {\n            startStreamingResponse( event, track );\n        }\n    }\n}\n\n\nvoid AudioHTTPServer::performSeek( QxtWebRequestEvent* event, int seek, QString uid)\n{\n\n    // Perform seek\n    spotifyiodev_ptr iodev = SpotifySession::getInstance()->Playback()->getIODeviceForNewTrack( m_savedDuration-seek );\n    qDebug()  << QThread::currentThreadId() << \"Got iodevice to send:\" << iodev << iodev.isNull() << iodev->isSequential() << iodev->isReadable();\n\n    if( SpotifySession::getInstance()->Playback()->trackIsOver() )\n    {\n        qDebug() << \" Seeking on track thats ended, setting offset\";\n\n        sp_link* link = sApp->linkFromTrack( uid );\n        sp_track* track = sp_link_as_track( link );\n\n        sp_error err = sp_session_player_load( SpotifySession::getInstance()->Session(), track );\n        if( err != SP_ERROR_OK )\n        {\n            qWarning() << QThread::currentThreadId() << \"Failed to restart track with offset from spotify :(\" << sp_error_message( err );\n            sendErrorResponse( event );\n            return;\n        }\n\n        sp_session_player_seek( SpotifySession::getInstance()->Session(), seek );\n        sp_session_player_play( SpotifySession::getInstance()->Session(), true );\n        SpotifySession::getInstance()->Playback()->startPlaying();\n\n    }\n    else\n    {\n        qDebug() << \" Seeking on track thats still playing\";\n        sp_session_player_seek( SpotifySession::getInstance()->Session(), seek );\n    }\n    // Partial Content\n    QxtWebPageEvent* wpe = new QxtWebPageEvent( event->sessionID, event->requestID, iodev );\n    wpe->streaming = true;\n    wpe->status = 206;\n    QString range = QString::number(m_savedByteRange) + \"-\" + QString::number(m_savedDurationInBytes);\n    wpe->headers.insert(\"Content-Range\", \"bytes=\" + range);\n    wpe->contentType = \"audio/basic\";\n    postEvent( wpe );\n\n}\n\nint AudioHTTPServer::convertByteRangeToMsec( int byteRange )\n{\n\n    if( byteRange > 0 )\n    {\n        qDebug() << \" === GOT BYTES \" << byteRange;\n        //The bit rate is then 44100 samples/second x 16 bits/sample x 2 tracks\n        int seek = byteRange / SpotifySession::getInstance()->Playback()->m_currSamples * 16 * SpotifySession::getInstance()->Playback()->m_currChannels * 8;\n\n        /// @magic: magic number to set the seek msec straight! Donno why it works\n        ///         probably a misscalc in byte to msec\n        /// Every minute, we need to remove 1440msec from the seek\n        seek = seek - (seek/1000/60 * 1440);\n\n        // extraDebug\n        int seconds = seek/1000;\n        int hrs  = seconds / 60 / 60;\n        int mins = seconds / 60 % 60;\n        int secs = seconds % 60;\n\n        qDebug() << \" ==== Seeking to : \" << QString( \"%1%2:%3\" ).arg( hrs > 0 ? hrs  < 10 ? \"0\" + QString::number( hrs ) + \":\" : QString::number( hrs ) + \":\" : \"\" )\n                                   .arg( mins < 10 ? \"0\" + QString::number( mins ) : QString::number( mins ) )\n                    .arg( secs < 10 ? \"0\" + QString::number( secs ) : QString::number( secs ) ) << \" ======\";\n        return seek;\n\n    }\n    return -1;\n}\n\n\nvoid AudioHTTPServer::checkForLoaded()\n{\n     qDebug() << \"Checking...\";\n    if( !sp_track_is_loaded( m_savedTrack ) ) {\n         qWarning() << QThread::currentThreadId() << \"uh oh... track not loaded yet! Asked for:\" << sp_track_name( m_savedTrack );\n        QTimer::singleShot( 250, this, SLOT( checkForLoaded() ) );\n    } else {\n        startStreamingResponse( m_savedEvent, m_savedTrack );\n    }\n\n}\n\nvoid AudioHTTPServer::startStreamingResponse( QxtWebRequestEvent* event, sp_track* track )\n{\n    // yay we gots a track\n//    qDebug() << QThread::currentThreadId() << \"We got a track!\" << sp_track_name( track ) << sp_artist_name( sp_track_artist( track, 0 ) ) << sp_track_duration( track );\n    uint duration = sp_track_duration( track );\n\n    sp_error err = sp_session_player_load( SpotifySession::getInstance()->Session(), track );\n    if( err != SP_ERROR_OK ) {\n        qWarning() << QThread::currentThreadId() << \"Failed to start track from spotify :(\" << sp_error_message( err );\n        sendErrorResponse( event );\n        return;\n    }\n\n//    qDebug() << QThread::currentThreadId() << \"Starting to play!\";\n    sp_session_player_play( SpotifySession::getInstance()->Session(), true );\n    SpotifySession::getInstance()->Playback()->startPlaying();\n\n    m_savedDuration = duration;\n    m_savedDurationInBytes = duration * SpotifySession::getInstance()->Playback()->m_currSamples * 16 * SpotifySession::getInstance()->Playback()->m_currChannels / 8;\n\n    qDebug() << \"Getting iodevice...\";\n    qDebug() << \"Setting durationBytes\" << m_savedByteRange;\n\n    spotifyiodev_ptr iodev = SpotifySession::getInstance()->Playback()->getIODeviceForNewTrack( duration );\n//    qDebug()  << QThread::currentThreadId() << \"Got iodevice to send:\" << iodev << iodev.isNull() << iodev->isSequential() << iodev->isReadable();\n    QxtWebPageEvent* wpe = new QxtWebPageEvent( event->sessionID, event->requestID, iodev );\n    wpe->streaming = true;\n    // Partial Content\n    wpe->status = 206;\n    wpe->headers.insert(\"Content-Range\", \"bytes=\" + QString::number(0) + \"-\" + QString::number( m_savedDurationInBytes ) );\n    wpe->contentType = \"audio/basic\";\n    postEvent( wpe );\n}\n\n\n\n\nQString AudioHTTPServer::urlForID( const QString& id )\n{\n    return QString( \"http://localhost:%1/sid/%2.wav\" ).arg( m_port ).arg( id );\n}\n\nvoid\nAudioHTTPServer::sendErrorResponse( QxtWebRequestEvent* event )\n{\n    qDebug() << \"404\" << event->url.toString();\n    QxtWebPageEvent* wpe = new QxtWebPageEvent( event->sessionID, event->requestID, \"<h1>No Such Track</h1>\" );\n    wpe->status = 403;\n    wpe->statusMessage = \"no track found\";\n    postEvent( wpe );\n}\n"
  },
  {
    "path": "archive/spotify/audiohttpserver.h",
    "content": "/*\n    Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n\n#ifndef AUDIOHTTPSERVER_H\n#define AUDIOHTTPSERVER_H\n\n#include <QObject>\n#include \"qxtwebslotservice.h\"\n#include <QxtWebPageEvent>\n#include <libspotify/api.h>\n\nclass QxtWebRequestEvent;\nclass QxtWebPageEvent;\n\nclass AudioHTTPServer : public QxtWebSlotService\n{\n    Q_OBJECT\npublic:\n    explicit AudioHTTPServer( QxtAbstractWebSessionManager* sm, int port, QObject* parent = 0 );\n    virtual ~AudioHTTPServer();\n\n    QString urlForID( const QString& id );\n\npublic slots:\n    void sid( QxtWebRequestEvent* event, QString a );\n\nprivate slots:\n    void checkForLoaded();\n\nprivate:\n    void startStreamingResponse( QxtWebRequestEvent* event, sp_track* );\n    void sendErrorResponse( QxtWebRequestEvent* event );\n    int convertByteRangeToMsec( int byteRange );\n    void performSeek( QxtWebRequestEvent* event, int seek, QString uid);\n    // If we need to wait for them to be loaded. Ugh.\n    QxtWebRequestEvent* m_savedEvent;\n    uint m_savedDuration;\n    int m_savedDurationInBytes;\n    int m_savedByteRange;\n    sp_track* m_savedTrack;\n    QString m_savedTrackUri;\n\n    int m_port;\n};\n\n#endif // AUDIOHTTPSERVER_H\n"
  },
  {
    "path": "archive/spotify/breakpad/CMakeLists.txt",
    "content": "PROJECT(breakpad)\ncmake_minimum_required(VERSION 2.8)\n\nset( CMAKE_MODULE_PATH\n     ${CMAKE_MODULE_PATH}\n     ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules\n)\n\nif( CMAKE_COMPILER_IS_GNUCXX )\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=gnu++98\")\nendif()\n\nif(${CMAKE_BUILD_TYPE} MATCHES \"Release\")\n  add_definitions(-DNDEBUG)\nendif(${CMAKE_BUILD_TYPE} MATCHES \"Release\")\n\nIF(UNIX)\n    IF(APPLE)\n        SET( breakpadSources\n            client/mac/crash_generation/crash_generation_client.cc\n            client/mac/crash_generation/crash_generation_server.cc\n            client/mac/handler/breakpad_nlist_64.cc\n            client/mac/handler/dynamic_images.cc\n            client/mac/handler/exception_handler.cc\n            client/mac/handler/minidump_generator.cc\n            client/mac/handler/protected_memory_allocator.cc\n    #         client/mac/Framework/Breakpad.mm\n    #         client/mac/Framework/OnDemandServer.mm\n            common/mac/file_id.cc\n            common/mac/macho_id.cc\n            common/mac/macho_reader.cc\n            common/mac/macho_utilities.cc\n            common/mac/macho_walker.cc\n            common/mac/string_utilities.cc\n            common/md5.cc\n            common/mac/dump_syms.mm\n            common/mac/MachIPC.mm\n            common/mac/SimpleStringDictionary.mm\n            common/mac/bootstrap_compat.cc\n        )\n    ELSE(APPLE)\n        SET( breakpadSources\n            common/linux/safe_readlink.cc\n            client/linux/crash_generation/crash_generation_client.cc\n            client/linux/crash_generation/crash_generation_server.cc\n            client/linux/minidump_writer/minidump_writer.cc\n            client/linux/minidump_writer/linux_dumper.cc\n            client/linux/handler/exception_handler.cc\n            common/linux/dump_symbols.cc\n            common/linux/file_id.cc\n            common/linux/libcurl_wrapper.cc\n            common/linux/google_crashdump_uploader.cc\n            common/linux/synth_elf.cc\n            common/linux/http_upload.cc\n            common/linux/guid_creator.cc\n            common/linux/elf_symbols_to_module.cc\n            client/minidump_file_writer.cc\n            client/linux/minidump_writer/linux_ptrace_dumper.cc\n            common/linux/memory_mapped_file.cc\n            client/linux/log/log.cc\n        )\n    ENDIF(APPLE)\n\n    LIST(APPEND breakpadSources\n        client/minidump_file_writer.cc\n        common/convert_UTF.c\n        common/string_conversion.cc\n    )\nENDIF(UNIX)\n\nIF(WIN32)\n    ADD_DEFINITIONS( -DUNICODE -fshort-wchar )\n    SET( breakpadSources\n        client/windows/handler/exception_handler.cc\n        client/windows/crash_generation/crash_generation_client.cc\n        common/windows/guid_string.cc\n    )\nENDIF(WIN32)\n\n\nINCLUDE_DIRECTORIES(.)\nADD_DEFINITIONS( -fPIC )\nIF(WIN32)\n    ADD_LIBRARY( tomahawk_breakpad SHARED ${breakpadSources} )\nELSE()\n    ADD_LIBRARY( tomahawk_breakpad STATIC ${breakpadSources} )\nENDIF()\nTARGET_LINK_LIBRARIES( tomahawk_breakpad )\n"
  },
  {
    "path": "archive/spotify/breakpad/client/apple/Framework/BreakpadDefines.h",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Keys for configuration file\n#define kReporterMinidumpDirectoryKey \"MinidumpDir\"\n#define kReporterMinidumpIDKey        \"MinidumpID\"\n\n// Filename for recording uploaded IDs\n#define kReporterLogFilename          \"uploads.log\"\n\n// The default subdirectory of the Library to put crash dumps in\n// The subdirectory is\n//  ~/Library/<kDefaultLibrarySubdirectory>/<GoogleBreakpadProduct>\n#define kDefaultLibrarySubdirectory   \"Breakpad\"\n\n// Specify some special keys to be used in the configuration file that is\n// generated by Breakpad and consumed by the crash_sender.\n#define BREAKPAD_PRODUCT               \"BreakpadProduct\"\n#define BREAKPAD_PRODUCT_DISPLAY       \"BreakpadProductDisplay\"\n#define BREAKPAD_VERSION               \"BreakpadVersion\"\n#define BREAKPAD_VENDOR                \"BreakpadVendor\"\n#define BREAKPAD_URL                   \"BreakpadURL\"\n#define BREAKPAD_REPORT_INTERVAL       \"BreakpadReportInterval\"\n#define BREAKPAD_SKIP_CONFIRM          \"BreakpadSkipConfirm\"\n#define BREAKPAD_CONFIRM_TIMEOUT       \"BreakpadConfirmTimeout\"\n#define BREAKPAD_SEND_AND_EXIT         \"BreakpadSendAndExit\"\n#define BREAKPAD_DUMP_DIRECTORY        \"BreakpadMinidumpLocation\"\n#define BREAKPAD_INSPECTOR_LOCATION    \"BreakpadInspectorLocation\"\n#define BREAKPAD_REPORTER_EXE_LOCATION \\\n  \"BreakpadReporterExeLocation\"\n#define BREAKPAD_LOGFILES              \"BreakpadLogFiles\"\n#define BREAKPAD_LOGFILE_UPLOAD_SIZE   \"BreakpadLogFileTailSize\"\n#define BREAKPAD_REQUEST_COMMENTS      \"BreakpadRequestComments\"\n#define BREAKPAD_COMMENTS              \"BreakpadComments\"\n#define BREAKPAD_REQUEST_EMAIL         \"BreakpadRequestEmail\"\n#define BREAKPAD_EMAIL                 \"BreakpadEmail\"\n#define BREAKPAD_SERVER_TYPE           \"BreakpadServerType\"\n#define BREAKPAD_SERVER_PARAMETER_DICT \"BreakpadServerParameters\"\n\n// The keys below are NOT user supplied, and are used internally.\n#define BREAKPAD_PROCESS_START_TIME       \"BreakpadProcStartTime\"\n#define BREAKPAD_PROCESS_UP_TIME          \"BreakpadProcessUpTime\"\n#define BREAKPAD_PROCESS_CRASH_TIME       \"BreakpadProcessCrashTime\"\n#define BREAKPAD_LOGFILE_KEY_PREFIX       \"BreakpadAppLogFile\"\n#define BREAKPAD_SERVER_PARAMETER_PREFIX  \"BreakpadServerParameterPrefix_\"\n#define BREAKPAD_ON_DEMAND                \"BreakpadOnDemand\"\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/android_link.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// The Android NDK doesn't have link.h. Fortunately, the only thing\n// that Breakpad uses from it is the ElfW macro, so define it here.\n\n#ifndef GOOGLE_BREAKPAD_CLIENT_LINUX_ANDROID_LINK_H_\n#define GOOGLE_BREAKPAD_CLIENT_LINUX_ANDROID_LINK_H_\n\n// TODO(zhenghao): exec_elf.h conflicts with linux/elf.h.\n// But we still need ELFSIZE.\n//#include <sys/exec_elf.h>\n#include <machine/exec.h>\n#define ELFSIZE ARCH_ELFSIZE\n\n#ifndef ElfW\n#define ElfW(type)\t_ElfW (Elf, ELFSIZE, type)\n#define _ElfW(e,w,t)\t_ElfW_1 (e, w, _##t)\n#define _ElfW_1(e,w,t)\te##w##t\n#endif\n\n#endif  // GOOGLE_BREAKPAD_CLIENT_LINUX_ANDROID_LINK_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/android_ucontext.h",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Android runs a fairly new Linux kernel, so signal info is there,\n// but the NDK doesn't have the structs defined, so define\n// them here.\n// Adapted from platform-linux.cc in V8\n\n#ifndef GOOGLE_BREAKPAD_CLIENT_LINUX_ANDROID_UCONTEXT_H_\n#define GOOGLE_BREAKPAD_CLIENT_LINUX_ANDROID_UCONTEXT_H_\n\n#include <signal.h>\n\n#if !defined(__GLIBC__) && (defined(__arm__) || defined(__thumb__))\n\nstruct sigcontext {\n  uint32_t trap_no;\n  uint32_t error_code;\n  uint32_t oldmask;\n  uint32_t arm_r0;\n  uint32_t arm_r1;\n  uint32_t arm_r2;\n  uint32_t arm_r3;\n  uint32_t arm_r4;\n  uint32_t arm_r5;\n  uint32_t arm_r6;\n  uint32_t arm_r7;\n  uint32_t arm_r8;\n  uint32_t arm_r9;\n  uint32_t arm_r10;\n  uint32_t arm_fp;\n  uint32_t arm_ip;\n  uint32_t arm_sp;\n  uint32_t arm_lr;\n  uint32_t arm_pc;\n  uint32_t arm_cpsr;\n  uint32_t fault_address;\n};\ntypedef uint32_t __sigset_t;\ntypedef struct sigcontext mcontext_t;\ntypedef struct ucontext {\n  uint32_t uc_flags;\n  struct ucontext* uc_link;\n  stack_t uc_stack;\n  mcontext_t uc_mcontext;\n  __sigset_t uc_sigmask;\n} ucontext_t;\n\n#endif\n\n#endif  // GOOGLE_BREAKPAD_CLIENT_LINUX_ANDROID_UCONTEXT_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/crash_generation/client_info.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_LINUX_CRASH_GENERATION_CLIENT_INFO_H_\n#define CLIENT_LINUX_CRASH_GENERATION_CLIENT_INFO_H_\n\nnamespace google_breakpad {\n\nclass CrashGenerationServer;\n\nstruct ClientInfo {\n  CrashGenerationServer* crash_server_;\n  pid_t pid_;\n};\n\n}\n\n#endif // CLIENT_LINUX_CRASH_GENERATION_CLIENT_INFO_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/crash_generation/crash_generation_client.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <stdio.h>\n#include <sys/socket.h>\n#include <sys/types.h>\n\n#include <algorithm>\n\n#include \"client/linux/crash_generation/crash_generation_client.h\"\n#include \"common/linux/eintr_wrapper.h\"\n#include \"common/linux/linux_libc_support.h\"\n#include \"third_party/lss/linux_syscall_support.h\"\n\nnamespace google_breakpad {\n\nbool\nCrashGenerationClient::RequestDump(const void* blob, size_t blob_size)\n{\n  int fds[2];\n  sys_socketpair(AF_UNIX, SOCK_STREAM, 0, fds);\n  static const unsigned kControlMsgSize = CMSG_SPACE(sizeof(int));\n\n  struct kernel_msghdr msg;\n  my_memset(&msg, 0, sizeof(struct kernel_msghdr));\n  struct kernel_iovec iov[1];\n  iov[0].iov_base = const_cast<void*>(blob);\n  iov[0].iov_len = blob_size;\n\n  msg.msg_iov = iov;\n  msg.msg_iovlen = sizeof(iov) / sizeof(iov[0]);\n  char cmsg[kControlMsgSize];\n  my_memset(cmsg, 0, kControlMsgSize);\n  msg.msg_control = cmsg;\n  msg.msg_controllen = sizeof(cmsg);\n\n  struct cmsghdr* hdr = CMSG_FIRSTHDR(&msg);\n  hdr->cmsg_level = SOL_SOCKET;\n  hdr->cmsg_type = SCM_RIGHTS;\n  hdr->cmsg_len = CMSG_LEN(sizeof(int));\n  int* p = reinterpret_cast<int*>(CMSG_DATA(hdr));\n  *p = fds[1];\n\n  HANDLE_EINTR(sys_sendmsg(server_fd_, &msg, 0));\n  sys_close(fds[1]);\n\n  // wait for an ACK from the server\n  char b;\n  HANDLE_EINTR(sys_read(fds[0], &b, 1));\n\n  return true;\n}\n\n//static\nCrashGenerationClient*\nCrashGenerationClient::TryCreate(int server_fd)\n{\n  if (0 > server_fd)\n    return NULL;\n  return new CrashGenerationClient(server_fd);\n}\n\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/crash_generation/crash_generation_client.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_\n#define CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_\n\n#include <stddef.h>\n\nnamespace google_breakpad {\n\nclass CrashGenerationClient {\npublic:\n  ~CrashGenerationClient()\n  {\n  }\n\n  // Request the crash server to generate a dump.  |blob| is a hack,\n  // see exception_handler.h and minidump_writer.h\n  //\n  // Return true if the dump was successful; false otherwise.\n  bool RequestDump(const void* blob, size_t blob_size);\n\n  // Return a new CrashGenerationClient if |server_fd| is valid and\n  // connects to a CrashGenerationServer.  Otherwise, return NULL.\n  // The returned CrashGenerationClient* is owned by the caller of\n  // this function.\n  static CrashGenerationClient* TryCreate(int server_fd);\n\nprivate:\n  CrashGenerationClient(int server_fd) : server_fd_(server_fd)\n  {\n  }\n\n  int server_fd_;\n\n  // prevent copy construction and assignment\n  CrashGenerationClient(const CrashGenerationClient&);\n  CrashGenerationClient& operator=(const CrashGenerationClient&);\n};\n\n} // namespace google_breakpad\n\n#endif // CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/crash_generation/crash_generation_server.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <assert.h>\n#include <dirent.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <poll.h>\n#include <stdio.h>\n#include <string.h>\n#include <sys/socket.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <unistd.h>\n\n#include <vector>\n\n#include \"client/linux/crash_generation/crash_generation_server.h\"\n#include \"client/linux/crash_generation/client_info.h\"\n#include \"client/linux/handler/exception_handler.h\"\n#include \"client/linux/minidump_writer/minidump_writer.h\"\n#include \"common/linux/eintr_wrapper.h\"\n#include \"common/linux/guid_creator.h\"\n#include \"common/linux/safe_readlink.h\"\n\nstatic const char kCommandQuit = 'x';\n\nstatic bool\nGetInodeForFileDescriptor(ino_t* inode_out, int fd)\n{\n  assert(inode_out);\n\n  struct stat buf;\n  if (fstat(fd, &buf) < 0)\n    return false;\n\n  if (!S_ISSOCK(buf.st_mode))\n    return false;\n\n  *inode_out = buf.st_ino;\n  return true;\n}\n\n// expected prefix of the target of the /proc/self/fd/%d link for a socket\nstatic const char kSocketLinkPrefix[] = \"socket:[\";\n\n// Parse a symlink in /proc/pid/fd/$x and return the inode number of the\n// socket.\n//   inode_out: (output) set to the inode number on success\n//   path: e.g. /proc/1234/fd/5 (must be a UNIX domain socket descriptor)\nstatic bool\nGetInodeForProcPath(ino_t* inode_out, const char* path)\n{\n  assert(inode_out);\n  assert(path);\n\n  char buf[PATH_MAX];\n  if (!google_breakpad::SafeReadLink(path, buf)) {\n    return false;\n  }\n\n  if (0 != memcmp(kSocketLinkPrefix, buf, sizeof(kSocketLinkPrefix) - 1)) {\n    return false;\n  }\n\n  char* endptr;\n  const u_int64_t inode_ul =\n      strtoull(buf + sizeof(kSocketLinkPrefix) - 1, &endptr, 10);\n  if (*endptr != ']')\n    return false;\n\n  if (inode_ul == ULLONG_MAX) {\n    return false;\n  }\n\n  *inode_out = inode_ul;\n  return true;\n}\n\nstatic bool\nFindProcessHoldingSocket(pid_t* pid_out, ino_t socket_inode)\n{\n  assert(pid_out);\n  bool already_found = false;\n\n  DIR* proc = opendir(\"/proc\");\n  if (!proc) {\n    return false;\n  }\n\n  std::vector<pid_t> pids;\n\n  struct dirent* dent;\n  while ((dent = readdir(proc))) {\n    char* endptr;\n    const unsigned long int pid_ul = strtoul(dent->d_name, &endptr, 10);\n    if (pid_ul == ULONG_MAX || '\\0' != *endptr)\n      continue;\n    pids.push_back(pid_ul);\n  }\n  closedir(proc);\n\n  for (std::vector<pid_t>::const_iterator\n       i = pids.begin(); i != pids.end(); ++i) {\n    const pid_t current_pid = *i;\n    char buf[PATH_MAX];\n    snprintf(buf, sizeof(buf), \"/proc/%d/fd\", current_pid);\n    DIR* fd = opendir(buf);\n    if (!fd)\n      continue;\n\n    while ((dent = readdir(fd))) {\n      if (snprintf(buf, sizeof(buf), \"/proc/%d/fd/%s\", current_pid,\n                   dent->d_name) >= static_cast<int>(sizeof(buf))) {\n        continue;\n      }\n\n      ino_t fd_inode;\n      if (GetInodeForProcPath(&fd_inode, buf)\n          && fd_inode == socket_inode) {\n        if (already_found) {\n          closedir(fd);\n          return false;\n        }\n\n        already_found = true;\n        *pid_out = current_pid;\n        break;\n      }\n    }\n\n    closedir(fd);\n  }\n\n  return already_found;\n}\n\nnamespace google_breakpad {\n\nCrashGenerationServer::CrashGenerationServer(\n  const int listen_fd,\n  OnClientDumpRequestCallback dump_callback,\n  void* dump_context,\n  OnClientExitingCallback exit_callback,\n  void* exit_context,\n  bool generate_dumps,\n  const std::string* dump_path) :\n    server_fd_(listen_fd),\n    dump_callback_(dump_callback),\n    dump_context_(dump_context),\n    exit_callback_(exit_callback),\n    exit_context_(exit_context),\n    generate_dumps_(generate_dumps),\n    started_(false)\n{\n  if (dump_path)\n    dump_dir_ = *dump_path;\n  else\n    dump_dir_ = \"/tmp\";\n}\n\nCrashGenerationServer::~CrashGenerationServer()\n{\n  if (started_)\n    Stop();\n}\n\nbool\nCrashGenerationServer::Start()\n{\n  if (started_ || 0 > server_fd_)\n    return false;\n\n  int control_pipe[2];\n  if (pipe(control_pipe))\n    return false;\n\n  if (fcntl(control_pipe[0], F_SETFD, FD_CLOEXEC))\n    return false;\n  if (fcntl(control_pipe[1], F_SETFD, FD_CLOEXEC))\n    return false;\n\n  if (fcntl(control_pipe[0], F_SETFL, O_NONBLOCK))\n    return false;\n\n  control_pipe_in_ = control_pipe[0];\n  control_pipe_out_ = control_pipe[1];\n\n  if (pthread_create(&thread_, NULL,\n                     ThreadMain, reinterpret_cast<void*>(this)))\n    return false;\n\n  started_ = true;\n  return true;\n}\n\nvoid\nCrashGenerationServer::Stop()\n{\n  assert(pthread_self() != thread_);\n\n  if (!started_)\n    return;\n\n  HANDLE_EINTR(write(control_pipe_out_, &kCommandQuit, 1));\n\n  void* dummy;\n  pthread_join(thread_, &dummy);\n\n  started_ = false;\n}\n\n//static\nbool\nCrashGenerationServer::CreateReportChannel(int* server_fd, int* client_fd)\n{\n  int fds[2];\n\n  if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, fds))\n    return false;\n\n  static const int on = 1;\n  // Enable passcred on the server end of the socket\n  if (setsockopt(fds[1], SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)))\n    return false;\n\n  if (fcntl(fds[1], F_SETFL, O_NONBLOCK))\n    return false;\n  if (fcntl(fds[1], F_SETFD, FD_CLOEXEC))\n    return false;\n\n  *client_fd = fds[0];\n  *server_fd = fds[1];\n  return true;\n}\n\n// The following methods/functions execute on the server thread\n\nvoid\nCrashGenerationServer::Run()\n{\n  struct pollfd pollfds[2];\n  memset(&pollfds, 0, sizeof(pollfds));\n\n  pollfds[0].fd = server_fd_;\n  pollfds[0].events = POLLIN;\n\n  pollfds[1].fd = control_pipe_in_;\n  pollfds[1].events = POLLIN;\n\n  while (true) {\n    // infinite timeout\n    int nevents = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), -1);\n    if (-1 == nevents) {\n      if (EINTR == errno) {\n        continue;\n      } else {\n        return;\n      }\n    }\n\n    if (pollfds[0].revents && !ClientEvent(pollfds[0].revents))\n      return;\n\n    if (pollfds[1].revents && !ControlEvent(pollfds[1].revents))\n      return;\n  }\n}\n\nbool\nCrashGenerationServer::ClientEvent(short revents)\n{\n  if (POLLHUP & revents)\n    return false;\n  assert(POLLIN & revents);\n\n  // A process has crashed and has signaled us by writing a datagram\n  // to the death signal socket. The datagram contains the crash context needed\n  // for writing the minidump as well as a file descriptor and a credentials\n  // block so that they can't lie about their pid.\n\n  // The length of the control message:\n  static const unsigned kControlMsgSize =\n      CMSG_SPACE(sizeof(int)) + CMSG_SPACE(sizeof(struct ucred));\n  // The length of the regular payload:\n  static const unsigned kCrashContextSize =\n      sizeof(google_breakpad::ExceptionHandler::CrashContext);\n\n  struct msghdr msg = {0};\n  struct iovec iov[1];\n  char crash_context[kCrashContextSize];\n  char control[kControlMsgSize];\n  const ssize_t expected_msg_size = sizeof(crash_context);\n\n  iov[0].iov_base = crash_context;\n  iov[0].iov_len = sizeof(crash_context);\n  msg.msg_iov = iov;\n  msg.msg_iovlen = sizeof(iov)/sizeof(iov[0]);\n  msg.msg_control = control;\n  msg.msg_controllen = kControlMsgSize;\n\n  const ssize_t msg_size = HANDLE_EINTR(recvmsg(server_fd_, &msg, 0));\n  if (msg_size != expected_msg_size)\n    return true;\n\n  if (msg.msg_controllen != kControlMsgSize ||\n      msg.msg_flags & ~MSG_TRUNC)\n    return true;\n\n  // Walk the control payload and extract the file descriptor and validated pid.\n  pid_t crashing_pid = -1;\n  int signal_fd = -1;\n  for (struct cmsghdr *hdr = CMSG_FIRSTHDR(&msg); hdr;\n       hdr = CMSG_NXTHDR(&msg, hdr)) {\n    if (hdr->cmsg_level != SOL_SOCKET)\n      continue;\n    if (hdr->cmsg_type == SCM_RIGHTS) {\n      const unsigned len = hdr->cmsg_len -\n          (((uint8_t*)CMSG_DATA(hdr)) - (uint8_t*)hdr);\n      assert(len % sizeof(int) == 0u);\n      const unsigned num_fds = len / sizeof(int);\n      if (num_fds > 1 || num_fds == 0) {\n        // A nasty process could try and send us too many descriptors and\n        // force a leak.\n        for (unsigned i = 0; i < num_fds; ++i)\n          HANDLE_EINTR(close(reinterpret_cast<int*>(CMSG_DATA(hdr))[i]));\n        return true;\n      } else {\n        signal_fd = reinterpret_cast<int*>(CMSG_DATA(hdr))[0];\n      }\n    } else if (hdr->cmsg_type == SCM_CREDENTIALS) {\n      const struct ucred *cred =\n          reinterpret_cast<struct ucred*>(CMSG_DATA(hdr));\n      crashing_pid = cred->pid;\n    }\n  }\n\n  if (crashing_pid == -1 || signal_fd == -1) {\n    if (signal_fd)\n      HANDLE_EINTR(close(signal_fd));\n    return true;\n  }\n\n  // Kernel bug workaround (broken in 2.6.30 at least):\n  // The kernel doesn't translate PIDs in SCM_CREDENTIALS across PID\n  // namespaces. Thus |crashing_pid| might be garbage from our point of view.\n  // In the future we can remove this workaround, but we have to wait a couple\n  // of years to be sure that it's worked its way out into the world.\n\n  ino_t inode_number;\n  if (!GetInodeForFileDescriptor(&inode_number, signal_fd)) {\n    HANDLE_EINTR(close(signal_fd));\n    return true;\n  }\n\n  if (!FindProcessHoldingSocket(&crashing_pid, inode_number - 1)) {\n    HANDLE_EINTR(close(signal_fd));\n    return true;\n  }\n\n  std::string minidump_filename;\n  if (!MakeMinidumpFilename(minidump_filename))\n    return true;\n\n  if (!google_breakpad::WriteMinidump(minidump_filename.c_str(),\n                                      crashing_pid, crash_context,\n                                      kCrashContextSize)) {\n    HANDLE_EINTR(close(signal_fd));\n    return true;\n  }\n\n  if (dump_callback_) {\n    ClientInfo info;\n\n    info.crash_server_ = this;\n    info.pid_ = crashing_pid;\n\n    dump_callback_(dump_context_, &info, &minidump_filename);\n  }\n\n  // Send the done signal to the process: it can exit now.\n  memset(&msg, 0, sizeof(msg));\n  struct iovec done_iov;\n  done_iov.iov_base = const_cast<char*>(\"\\x42\");\n  done_iov.iov_len = 1;\n  msg.msg_iov = &done_iov;\n  msg.msg_iovlen = 1;\n\n  HANDLE_EINTR(sendmsg(signal_fd, &msg, MSG_DONTWAIT | MSG_NOSIGNAL));\n  HANDLE_EINTR(close(signal_fd));\n\n  return true;\n}\n\nbool\nCrashGenerationServer::ControlEvent(short revents)\n{\n  if (POLLHUP & revents)\n    return false;\n  assert(POLLIN & revents);\n\n  char command;\n  if (read(control_pipe_in_, &command, 1))\n    return false;\n\n  switch (command) {\n  case kCommandQuit:\n    return false;\n  default:\n    assert(0);\n  }\n\n  return true;\n}\n\nbool\nCrashGenerationServer::MakeMinidumpFilename(std::string& outFilename)\n{\n  GUID guid;\n  char guidString[kGUIDStringLength+1];\n\n  if (!(CreateGUID(&guid)\n        && GUIDToString(&guid, guidString, sizeof(guidString))))\n    return false;\n\n  char path[PATH_MAX];\n  snprintf(path, sizeof(path), \"%s/%s.dmp\", dump_dir_.c_str(), guidString);\n\n  outFilename = path;\n  return true;\n}\n\n// static\nvoid*\nCrashGenerationServer::ThreadMain(void *arg)\n{\n  reinterpret_cast<CrashGenerationServer*>(arg)->Run();\n  return NULL;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/crash_generation/crash_generation_server.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_\n#define CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_\n\n#include <pthread.h>\n\n#include <string>\n\nnamespace google_breakpad {\n\nclass ClientInfo;\n\nclass CrashGenerationServer {\npublic:\n  // WARNING: callbacks may be invoked on a different thread\n  // than that which creates the CrashGenerationServer.  They must\n  // be thread safe.\n  typedef void (*OnClientDumpRequestCallback)(void* context,\n                                              const ClientInfo* client_info,\n                                              const std::string* file_path);\n\n  typedef void (*OnClientExitingCallback)(void* context,\n                                          const ClientInfo* client_info);\n\n  // Create an instance with the given parameters.\n  //\n  // Parameter listen_fd: The server fd created by CreateReportChannel().\n  // Parameter dump_callback: Callback for a client crash dump request.\n  // Parameter dump_context: Context for client crash dump request callback.\n  // Parameter exit_callback: Callback for client process exit.\n  // Parameter exit_context: Context for client exit callback.\n  // Parameter generate_dumps: Whether to automatically generate dumps.\n  //     Client code of this class might want to generate dumps explicitly\n  //     in the crash dump request callback. In that case, false can be\n  //     passed for this parameter.\n  // Parameter dump_path: Path for generating dumps; required only if true is\n  //     passed for generateDumps parameter; NULL can be passed otherwise.\n  CrashGenerationServer(const int listen_fd,\n                        OnClientDumpRequestCallback dump_callback,\n                        void* dump_context,\n                        OnClientExitingCallback exit_callback,\n                        void* exit_context,\n                        bool generate_dumps,\n                        const std::string* dump_path);\n\n  ~CrashGenerationServer();\n\n  // Perform initialization steps needed to start listening to clients.\n  //\n  // Return true if initialization is successful; false otherwise.\n  bool Start();\n\n  // Stop the server.\n  void Stop();\n\n  // Create a \"channel\" that can be used by clients to report crashes\n  // to a CrashGenerationServer.  |*server_fd| should be passed to\n  // this class's constructor, and |*client_fd| should be passed to\n  // the ExceptionHandler constructor in the client process.\n  static bool CreateReportChannel(int* server_fd, int* client_fd);\n\nprivate:\n  // Run the server's event loop\n  void Run();\n\n  // Invoked when an child process (client) event occurs\n  // Returning true => \"keep running\", false => \"exit loop\"\n  bool ClientEvent(short revents);\n\n  // Invoked when the controlling thread (main) event occurs\n  // Returning true => \"keep running\", false => \"exit loop\"\n  bool ControlEvent(short revents);\n\n  // Return a unique filename at which a minidump can be written\n  bool MakeMinidumpFilename(std::string& outFilename);\n\n  // Trampoline to |Run()|\n  static void* ThreadMain(void* arg);\n\n  int server_fd_;\n\n  OnClientDumpRequestCallback dump_callback_;\n  void* dump_context_;\n\n  OnClientExitingCallback exit_callback_;\n  void* exit_context_;\n\n  bool generate_dumps_;\n\n  std::string dump_dir_;\n\n  bool started_;\n\n  pthread_t thread_;\n  int control_pipe_in_;\n  int control_pipe_out_;\n\n  // disable these\n  CrashGenerationServer(const CrashGenerationServer&);\n  CrashGenerationServer& operator=(const CrashGenerationServer&);\n};\n\n} // namespace google_breakpad\n\n#endif // CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/data/linux-gate-amd.sym",
    "content": "MODULE Linux x86 B8CFDE93002D54DA1900A40AA1BD67690 linux-gate.so\nPUBLIC 400 0 __kernel_vsyscall\nSTACK WIN 4 400 100 1 1 0 0 0 0 0 1\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/data/linux-gate-intel.sym",
    "content": "MODULE Linux x86 4FBDA58B5A1DF5A379E3CF19A235EA090 linux-gate.so\nPUBLIC 400 0 __kernel_vsyscall\nSTACK WIN 4 400 200 3 3 0 0 0 0 0 1"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/handler/exception_handler.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// The ExceptionHandler object installs signal handlers for a number of\n// signals. We rely on the signal handler running on the thread which crashed\n// in order to identify it. This is true of the synchronous signals (SEGV etc),\n// but not true of ABRT. Thus, if you send ABRT to yourself in a program which\n// uses ExceptionHandler, you need to use tgkill to direct it to the current\n// thread.\n//\n// The signal flow looks like this:\n//\n//   SignalHandler (uses a global stack of ExceptionHandler objects to find\n//        |         one to handle the signal. If the first rejects it, try\n//        |         the second etc...)\n//        V\n//   HandleSignal ----------------------------| (clones a new process which\n//        |                                   |  shares an address space with\n//   (wait for cloned                         |  the crashed process. This\n//     process)                               |  allows us to ptrace the crashed\n//        |                                   |  process)\n//        V                                   V\n//   (set signal handler to             ThreadEntry (static function to bounce\n//    SIG_DFL and rethrow,                    |      back into the object)\n//    killing the crashed                     |\n//    process)                                V\n//                                          DoDump  (writes minidump)\n//                                            |\n//                                            V\n//                                         sys_exit\n//\n\n// This code is a little fragmented. Different functions of the ExceptionHandler\n// class run in a number of different contexts. Some of them run in a normal\n// context and are easy to code, others run in a compromised context and the\n// restrictions at the top of minidump_writer.cc apply: no libc and use the\n// alternative malloc. Each function should have comment above it detailing the\n// context which it runs in.\n\n#include \"client/linux/handler/exception_handler.h\"\n\n#include <errno.h>\n#include <fcntl.h>\n#include <linux/limits.h>\n#include <sched.h>\n#include <signal.h>\n#include <stdio.h>\n#include <sys/mman.h>\n#include <sys/prctl.h>\n#include <sys/syscall.h>\n#include <sys/wait.h>\n#include <unistd.h>\n\n#if !defined(__ANDROID__)\n#include <sys/signal.h>\n#include <sys/ucontext.h>\n#include <sys/user.h>\n#include <ucontext.h>\n#endif\n\n#include <algorithm>\n#include <utility>\n#include <vector>\n\n#include \"common/linux/linux_libc_support.h\"\n#include \"common/memory.h\"\n#include \"client/linux/log/log.h\"\n#include \"client/linux/minidump_writer/linux_dumper.h\"\n#include \"client/linux/minidump_writer/minidump_writer.h\"\n#include \"common/linux/guid_creator.h\"\n#include \"common/linux/eintr_wrapper.h\"\n#include \"third_party/lss/linux_syscall_support.h\"\n\n#include \"linux/sched.h\"\n\n#ifndef PR_SET_PTRACER\n#define PR_SET_PTRACER 0x59616d61\n#endif\n\n// A wrapper for the tgkill syscall: send a signal to a specific thread.\nstatic int tgkill(pid_t tgid, pid_t tid, int sig) {\n  return syscall(__NR_tgkill, tgid, tid, sig);\n  return 0;\n}\n\nnamespace google_breakpad {\n\n// The list of signals which we consider to be crashes. The default action for\n// all these signals must be Core (see man 7 signal) because we rethrow the\n// signal after handling it and expect that it'll be fatal.\nstatic const int kExceptionSignals[] = {\n  SIGSEGV, SIGABRT, SIGFPE, SIGILL, SIGBUS, -1\n};\n\n// We can stack multiple exception handlers. In that case, this is the global\n// which holds the stack.\nstd::vector<ExceptionHandler*>* ExceptionHandler::handler_stack_ = NULL;\nunsigned ExceptionHandler::handler_stack_index_ = 0;\npthread_mutex_t ExceptionHandler::handler_stack_mutex_ =\n    PTHREAD_MUTEX_INITIALIZER;\n\n// Runs before crashing: normal context.\nExceptionHandler::ExceptionHandler(const std::string &dump_path,\n                                   FilterCallback filter,\n                                   MinidumpCallback callback,\n                                   void *callback_context,\n                                   bool install_handler)\n  : filter_(filter),\n    callback_(callback),\n    callback_context_(callback_context),\n    handler_installed_(install_handler)\n{\n  Init(dump_path, -1);\n}\n\nExceptionHandler::ExceptionHandler(const std::string &dump_path,\n                                   FilterCallback filter,\n                                   MinidumpCallback callback,\n                                   void* callback_context,\n                                   bool install_handler,\n                                   const int server_fd)\n  : filter_(filter),\n    callback_(callback),\n    callback_context_(callback_context),\n    handler_installed_(install_handler)\n{\n  Init(dump_path, server_fd);\n}\n\n// Runs before crashing: normal context.\nExceptionHandler::~ExceptionHandler() {\n  UninstallHandlers();\n}\n\nvoid ExceptionHandler::Init(const std::string &dump_path,\n                            const int server_fd)\n{\n  crash_handler_ = NULL;\n  if (0 <= server_fd)\n    crash_generation_client_\n      .reset(CrashGenerationClient::TryCreate(server_fd));\n\n  if (handler_installed_)\n    InstallHandlers();\n\n  if (!IsOutOfProcess())\n    set_dump_path(dump_path);\n\n  pthread_mutex_lock(&handler_stack_mutex_);\n  if (handler_stack_ == NULL)\n    handler_stack_ = new std::vector<ExceptionHandler *>;\n  handler_stack_->push_back(this);\n  pthread_mutex_unlock(&handler_stack_mutex_);\n}\n\n// Runs before crashing: normal context.\nbool ExceptionHandler::InstallHandlers() {\n  // We run the signal handlers on an alternative stack because we might have\n  // crashed because of a stack overflow.\n\n  // We use this value rather than SIGSTKSZ because we would end up overrunning\n  // such a small stack.\n  static const unsigned kSigStackSize = 8192;\n\n  stack_t stack;\n  // Only set an alternative stack if there isn't already one, or if the current\n  // one is too small.\n  if (sys_sigaltstack(NULL, &stack) == -1 || !stack.ss_sp ||\n      stack.ss_size < kSigStackSize) {\n    memset(&stack, 0, sizeof(stack));\n    stack.ss_sp = malloc(kSigStackSize);\n    stack.ss_size = kSigStackSize;\n\n    if (sys_sigaltstack(&stack, NULL) == -1)\n      return false;\n  }\n\n  struct sigaction sa;\n  memset(&sa, 0, sizeof(sa));\n  sigemptyset(&sa.sa_mask);\n\n  // mask all exception signals when we're handling one of them.\n  for (unsigned i = 0; kExceptionSignals[i] != -1; ++i)\n    sigaddset(&sa.sa_mask, kExceptionSignals[i]);\n\n  sa.sa_sigaction = SignalHandler;\n  sa.sa_flags = SA_ONSTACK | SA_SIGINFO;\n\n  for (unsigned i = 0; kExceptionSignals[i] != -1; ++i) {\n    struct sigaction* old = new struct sigaction;\n    if (sigaction(kExceptionSignals[i], &sa, old) == -1)\n      return false;\n    old_handlers_.push_back(std::make_pair(kExceptionSignals[i], old));\n  }\n  return true;\n}\n\n// Runs before crashing: normal context.\nvoid ExceptionHandler::UninstallHandlers() {\n  for (unsigned i = 0; i < old_handlers_.size(); ++i) {\n    struct sigaction *action =\n        reinterpret_cast<struct sigaction*>(old_handlers_[i].second);\n    sigaction(old_handlers_[i].first, action, NULL);\n    delete action;\n  }\n  pthread_mutex_lock(&handler_stack_mutex_);\n  std::vector<ExceptionHandler*>::iterator handler =\n      std::find(handler_stack_->begin(), handler_stack_->end(), this);\n  handler_stack_->erase(handler);\n  pthread_mutex_unlock(&handler_stack_mutex_);\n  old_handlers_.clear();\n}\n\n// Runs before crashing: normal context.\nvoid ExceptionHandler::UpdateNextID() {\n  GUID guid;\n  char guid_str[kGUIDStringLength + 1];\n  if (CreateGUID(&guid) && GUIDToString(&guid, guid_str, sizeof(guid_str))) {\n    next_minidump_id_ = guid_str;\n    next_minidump_id_c_ = next_minidump_id_.c_str();\n\n    char minidump_path[PATH_MAX];\n    snprintf(minidump_path, sizeof(minidump_path), \"%s/%s.dmp\",\n             dump_path_c_,\n             guid_str);\n\n    next_minidump_path_ = minidump_path;\n    next_minidump_path_c_ = next_minidump_path_.c_str();\n  }\n}\n\n// void ExceptionHandler::set_crash_handler(HandlerCallback callback) {\n//   crash_handler_ = callback;\n// }\n\n// This function runs in a compromised context: see the top of the file.\n// Runs on the crashing thread.\n// static\nvoid ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) {\n  // All the exception signals are blocked at this point.\n  pthread_mutex_lock(&handler_stack_mutex_);\n\n  if (!handler_stack_->size()) {\n    pthread_mutex_unlock(&handler_stack_mutex_);\n    return;\n  }\n\n  for (int i = handler_stack_->size() - 1; i >= 0; --i) {\n    if ((*handler_stack_)[i]->HandleSignal(sig, info, uc)) {\n      // successfully handled: We are in an invalid state since an exception\n      // signal has been delivered. We don't call the exit handlers because\n      // they could end up corrupting on-disk state.\n      break;\n    }\n  }\n\n  pthread_mutex_unlock(&handler_stack_mutex_);\n\n  if (info->si_pid) {\n    // This signal was triggered by somebody sending us the signal with kill().\n    // In order to retrigger it, we have to queue a new signal by calling\n    // kill() ourselves.\n    if (tgkill(getpid(), syscall(__NR_gettid), sig) < 0) {\n      // If we failed to kill ourselves (e.g. because a sandbox disallows us\n      // to do so), we instead resort to terminating our process. This will\n      // result in an incorrect exit code.\n      _exit(1);\n    }\n  } else {\n    // This was a synchronous signal triggered by a hard fault (e.g. SIGSEGV).\n    // No need to reissue the signal. It will automatically trigger again,\n    // when we return from the signal handler.\n  }\n\n  // As soon as we return from the signal handler, our signal will become\n  // unmasked. At that time, we will  get terminated with the same signal that\n  // was triggered originally. This allows our parent to know that we crashed.\n  // The default action for all the signals which we catch is Core, so\n  // this is the end of us.\n  signal(sig, SIG_DFL);\n}\n\nstruct ThreadArgument {\n  pid_t pid;  // the crashing process\n  ExceptionHandler* handler;\n  const void* context;  // a CrashContext structure\n  size_t context_size;\n};\n\n// This is the entry function for the cloned process. We are in a compromised\n// context here: see the top of the file.\n// static\nint ExceptionHandler::ThreadEntry(void *arg) {\n  const ThreadArgument *thread_arg = reinterpret_cast<ThreadArgument*>(arg);\n\n  // Block here until the crashing process unblocks us when\n  // we're allowed to use ptrace\n  thread_arg->handler->WaitForContinueSignal();\n\n  return thread_arg->handler->DoDump(thread_arg->pid, thread_arg->context,\n                                     thread_arg->context_size) == false;\n}\n\n// This function runs in a compromised context: see the top of the file.\n// Runs on the crashing thread.\nbool ExceptionHandler::HandleSignal(int sig, siginfo_t* info, void* uc) {\n  if (filter_ && !filter_(callback_context_))\n    return false;\n\n  // Allow ourselves to be dumped if the signal is trusted.\n  bool signal_trusted = info->si_code > 0;\n  bool signal_pid_trusted = info->si_code == SI_USER ||\n      info->si_code == SI_TKILL;\n  if (signal_trusted || (signal_pid_trusted && info->si_pid == getpid())) {\n    sys_prctl(PR_SET_DUMPABLE, 1);\n  }\n  CrashContext context;\n  memcpy(&context.siginfo, info, sizeof(siginfo_t));\n  memcpy(&context.context, uc, sizeof(struct ucontext));\n#if !defined(__ARM_EABI__)\n  // FP state is not part of user ABI on ARM Linux.\n  struct ucontext *uc_ptr = (struct ucontext*)uc;\n  if (uc_ptr->uc_mcontext.fpregs) {\n    memcpy(&context.float_state,\n           uc_ptr->uc_mcontext.fpregs,\n           sizeof(context.float_state));\n  }\n#endif\n  context.tid = syscall(__NR_gettid);\n  if (crash_handler_ != NULL) {\n    if (crash_handler_(&context, sizeof(context),\n                       callback_context_)) {\n      return true;\n    }\n  }\n  return GenerateDump(&context);\n}\n\n// This function may run in a compromised context: see the top of the file.\nbool ExceptionHandler::GenerateDump(CrashContext *context) {\n  if (IsOutOfProcess())\n    return crash_generation_client_->RequestDump(context, sizeof(*context));\n\n  static const unsigned kChildStackSize = 8000;\n  PageAllocator allocator;\n  uint8_t* stack = (uint8_t*) allocator.Alloc(kChildStackSize);\n  if (!stack)\n    return false;\n  // clone() needs the top-most address. (scrub just to be safe)\n  stack += kChildStackSize;\n  my_memset(stack - 16, 0, 16);\n\n  ThreadArgument thread_arg;\n  thread_arg.handler = this;\n  thread_arg.pid = getpid();\n  thread_arg.context = context;\n  thread_arg.context_size = sizeof(*context);\n\n  // We need to explicitly enable ptrace of parent processes on some\n  // kernels, but we need to know the PID of the cloned process before we\n  // can do this. Create a pipe here which we can use to block the\n  // cloned process after creating it, until we have explicitly enabled ptrace\n  if(sys_pipe(fdes) == -1) {\n    // Creating the pipe failed. We'll log an error but carry on anyway,\n    // as we'll probably still get a useful crash report. All that will happen\n    // is the write() and read() calls will fail with EBADF\n    static const char no_pipe_msg[] = \"ExceptionHandler::GenerateDump \\\n                                       sys_pipe failed:\";\n    logger::write(no_pipe_msg, sizeof(no_pipe_msg) - 1);\n    logger::write(strerror(errno), strlen(strerror(errno)));\n    logger::write(\"\\n\", 1);\n  }\n\n#if defined(__ANDROID__)\n  const pid_t child = clone(\n      ThreadEntry, stack, CLONE_FILES | CLONE_FS | CLONE_UNTRACED,\n      &thread_arg);\n#else\n  const pid_t child = sys_clone(\n      ThreadEntry, stack, CLONE_FILES | CLONE_FS | CLONE_UNTRACED,\n      &thread_arg, NULL, NULL, NULL);\n#endif\n  int r, status;\n  // Allow the child to ptrace us\n  sys_prctl(PR_SET_PTRACER, child);\n  SendContinueSignalToChild();\n  do {\n    r = sys_waitpid(child, &status, __WALL);\n  } while (r == -1 && errno == EINTR);\n\n  sys_close(fdes[0]);\n  sys_close(fdes[1]);\n\n  if (r == -1) {\n    static const char msg[] = \"ExceptionHandler::GenerateDump waitpid failed:\";\n    logger::write(msg, sizeof(msg) - 1);\n    logger::write(strerror(errno), strlen(strerror(errno)));\n    logger::write(\"\\n\", 1);\n  }\n\n  bool success = r != -1 && WIFEXITED(status) && WEXITSTATUS(status) == 0;\n\n  if (callback_)\n    success = callback_(dump_path_c_, next_minidump_id_c_,\n                        callback_context_, success);\n\n  return success;\n}\n\n// This function runs in a compromised context: see the top of the file.\nvoid ExceptionHandler::SendContinueSignalToChild() {\n  static const char okToContinueMessage = 'a';\n  int r;\n  r = HANDLE_EINTR(sys_write(fdes[1], &okToContinueMessage, sizeof(char)));\n  if(r == -1) {\n    static const char msg[] = \"ExceptionHandler::SendContinueSignalToChild \\\n                               sys_write failed:\";\n    logger::write(msg, sizeof(msg) - 1);\n    logger::write(strerror(errno), strlen(strerror(errno)));\n    logger::write(\"\\n\", 1);\n  }\n}\n\n// This function runs in a compromised context: see the top of the file.\n// Runs on the cloned process.\nvoid ExceptionHandler::WaitForContinueSignal() {\n  int r;\n  char receivedMessage;\n  r = HANDLE_EINTR(sys_read(fdes[0], &receivedMessage, sizeof(char)));\n  if(r == -1) {\n    static const char msg[] = \"ExceptionHandler::WaitForContinueSignal \\\n                               sys_read failed:\";\n    logger::write(msg, sizeof(msg) - 1);\n    logger::write(strerror(errno), strlen(strerror(errno)));\n    logger::write(\"\\n\", 1);\n  }\n}\n\n// This function runs in a compromised context: see the top of the file.\n// Runs on the cloned process.\nbool ExceptionHandler::DoDump(pid_t crashing_process, const void* context,\n                              size_t context_size) {\n  return google_breakpad::WriteMinidump(next_minidump_path_c_,\n                                        crashing_process,\n                                        context,\n                                        context_size,\n                                        mapping_list_);\n}\n\n// static\nbool ExceptionHandler::WriteMinidump(const std::string &dump_path,\n                                     MinidumpCallback callback,\n                                     void* callback_context) {\n  ExceptionHandler eh(dump_path, NULL, callback, callback_context, false);\n  return eh.WriteMinidump();\n}\n\nbool ExceptionHandler::WriteMinidump() {\n#if !defined(__ARM_EABI__)\n  // Allow ourselves to be dumped.\n  sys_prctl(PR_SET_DUMPABLE, 1);\n\n  CrashContext context;\n  int getcontext_result = getcontext(&context.context);\n  if (getcontext_result)\n    return false;\n  memcpy(&context.float_state, context.context.uc_mcontext.fpregs,\n         sizeof(context.float_state));\n  context.tid = sys_gettid();\n\n  bool success = GenerateDump(&context);\n  UpdateNextID();\n  return success;\n#else\n  return false;\n#endif  // !defined(__ARM_EABI__)\n}\n\nvoid ExceptionHandler::AddMappingInfo(const std::string& name,\n                                      const u_int8_t identifier[sizeof(MDGUID)],\n                                      uintptr_t start_address,\n                                      size_t mapping_size,\n                                      size_t file_offset) {\n  MappingInfo info;\n  info.start_addr = start_address;\n  info.size = mapping_size;\n  info.offset = file_offset;\n  strncpy(info.name, name.c_str(), sizeof(info.name) - 1);\n  info.name[sizeof(info.name) - 1] = '\\0';\n\n  MappingEntry mapping;\n  mapping.first = info;\n  memcpy(mapping.second, identifier, sizeof(MDGUID));\n  mapping_list_.push_back(mapping);\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/handler/exception_handler.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_\n#define CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_\n\n#include <string>\n#include <vector>\n\n#include <pthread.h>\n#include <signal.h>\n#include <stdint.h>\n#include <stdio.h>\n\n#if defined(__ANDROID__)\n#include \"client/linux/android_ucontext.h\"\n#endif\n#include \"client/linux/crash_generation/crash_generation_client.h\"\n#include \"client/linux/minidump_writer/minidump_writer.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"processor/scoped_ptr.h\"\n\nstruct sigaction;\n\nnamespace google_breakpad {\n\nclass ExceptionHandler;\n\n// ExceptionHandler\n//\n// ExceptionHandler can write a minidump file when an exception occurs,\n// or when WriteMinidump() is called explicitly by your program.\n//\n// To have the exception handler write minidumps when an uncaught exception\n// (crash) occurs, you should create an instance early in the execution\n// of your program, and keep it around for the entire time you want to\n// have crash handling active (typically, until shutdown).\n// (NOTE): There should be only be one this kind of exception handler\n// object per process.\n//\n// If you want to write minidumps without installing the exception handler,\n// you can create an ExceptionHandler with install_handler set to false,\n// then call WriteMinidump.  You can also use this technique if you want to\n// use different minidump callbacks for different call sites.\n//\n// In either case, a callback function is called when a minidump is written,\n// which receives the unqiue id of the minidump.  The caller can use this\n// id to collect and write additional application state, and to launch an\n// external crash-reporting application.\n//\n// Caller should try to make the callbacks as crash-friendly as possible,\n// it should avoid use heap memory allocation as much as possible.\nclass ExceptionHandler {\n public:\n  // A callback function to run before Breakpad performs any substantial\n  // processing of an exception.  A FilterCallback is called before writing\n  // a minidump.  context is the parameter supplied by the user as\n  // callback_context when the handler was created.\n  //\n  // If a FilterCallback returns true, Breakpad will continue processing,\n  // attempting to write a minidump.  If a FilterCallback returns false,\n  // Breakpad  will immediately report the exception as unhandled without\n  // writing a minidump, allowing another handler the opportunity to handle it.\n  typedef bool (*FilterCallback)(void *context);\n\n  // A callback function to run after the minidump has been written.\n  // minidump_id is a unique id for the dump, so the minidump\n  // file is <dump_path>\\<minidump_id>.dmp.  context is the parameter supplied\n  // by the user as callback_context when the handler was created.  succeeded\n  // indicates whether a minidump file was successfully written.\n  //\n  // If an exception occurred and the callback returns true, Breakpad will\n  // treat the exception as fully-handled, suppressing any other handlers from\n  // being notified of the exception.  If the callback returns false, Breakpad\n  // will treat the exception as unhandled, and allow another handler to handle\n  // it. If there are no other handlers, Breakpad will report the exception to\n  // the system as unhandled, allowing a debugger or native crash dialog the\n  // opportunity to handle the exception.  Most callback implementations\n  // should normally return the value of |succeeded|, or when they wish to\n  // not report an exception of handled, false.  Callbacks will rarely want to\n  // return true directly (unless |succeeded| is true).\n  typedef bool (*MinidumpCallback)(const char *dump_path,\n                                   const char *minidump_id,\n                                   void *context,\n                                   bool succeeded);\n\n  // In certain cases, a user may wish to handle the generation of the minidump\n  // themselves. In this case, they can install a handler callback which is\n  // called when a crash has occurred. If this function returns true, no other\n  // processing of occurs and the process will shortly be crashed. If this\n  // returns false, the normal processing continues.\n  typedef bool (*HandlerCallback)(const void* crash_context,\n                                  size_t crash_context_size,\n                                  void* context);\n\n  // Creates a new ExceptionHandler instance to handle writing minidumps.\n  // Before writing a minidump, the optional filter callback will be called.\n  // Its return value determines whether or not Breakpad should write a\n  // minidump.  Minidump files will be written to dump_path, and the optional\n  // callback is called after writing the dump file, as described above.\n  // If install_handler is true, then a minidump will be written whenever\n  // an unhandled exception occurs.  If it is false, minidumps will only\n  // be written when WriteMinidump is called.\n  ExceptionHandler(const std::string &dump_path,\n                   FilterCallback filter, MinidumpCallback callback,\n                   void *callback_context,\n                   bool install_handler);\n\n  // Creates a new ExceptionHandler instance that can attempt to\n  // perform out-of-process dump generation if server_fd is valid. If\n  // server_fd is invalid, in-process dump generation will be\n  // used. See the above ctor for a description of the other\n  // parameters.\n  ExceptionHandler(const std::string& dump_path,\n                   FilterCallback filter, MinidumpCallback callback,\n                   void* callback_context,\n                   bool install_handler,\n                   const int server_fd);\n\n  ~ExceptionHandler();\n\n  // Get and set the minidump path.\n  std::string dump_path() const { return dump_path_; }\n  void set_dump_path(const std::string &dump_path) {\n    dump_path_ = dump_path;\n    dump_path_c_ = dump_path_.c_str();\n    UpdateNextID();\n  }\n\n  void set_crash_handler(HandlerCallback callback) {\n    crash_handler_ = callback;\n  }\n\n  // Writes a minidump immediately.  This can be used to capture the\n  // execution state independently of a crash.  Returns true on success.\n  bool WriteMinidump();\n\n  // Convenience form of WriteMinidump which does not require an\n  // ExceptionHandler instance.\n  static bool WriteMinidump(const std::string &dump_path,\n                            MinidumpCallback callback,\n                            void *callback_context);\n\n  // This structure is passed to minidump_writer.h:WriteMinidump via an opaque\n  // blob. It shouldn't be needed in any user code.\n  struct CrashContext {\n    siginfo_t siginfo;\n    pid_t tid;  // the crashing thread.\n    struct ucontext context;\n#if !defined(__ARM_EABI__)\n    // #ifdef this out because FP state is not part of user ABI for Linux ARM.\n    struct _libc_fpstate float_state;\n#endif\n  };\n\n  // Returns whether out-of-process dump generation is used or not.\n  bool IsOutOfProcess() const {\n      return crash_generation_client_.get() != NULL;\n  }\n\n  // Add information about a memory mapping. This can be used if\n  // a custom library loader is used that maps things in a way\n  // that the linux dumper can't handle by reading the maps file.\n  void AddMappingInfo(const std::string& name,\n                      const u_int8_t identifier[sizeof(MDGUID)],\n                      uintptr_t start_address,\n                      size_t mapping_size,\n                      size_t file_offset);\n\n private:\n  void Init(const std::string &dump_path,\n            const int server_fd);\n  bool InstallHandlers();\n  void UninstallHandlers();\n  void PreresolveSymbols();\n  bool GenerateDump(CrashContext *context);\n  void SendContinueSignalToChild();\n  void WaitForContinueSignal();\n\n  void UpdateNextID();\n  static void SignalHandler(int sig, siginfo_t* info, void* uc);\n  bool HandleSignal(int sig, siginfo_t* info, void* uc);\n  static int ThreadEntry(void* arg);\n  bool DoDump(pid_t crashing_process, const void* context,\n              size_t context_size);\n\n  const FilterCallback filter_;\n  const MinidumpCallback callback_;\n  void* const callback_context_;\n\n  scoped_ptr<CrashGenerationClient> crash_generation_client_;\n\n  std::string dump_path_;\n  std::string next_minidump_path_;\n  std::string next_minidump_id_;\n\n  // Pointers to C-string representations of the above. These are set\n  // when the above are set so we can avoid calling c_str during\n  // an exception.\n  const char* dump_path_c_;\n  const char* next_minidump_path_c_;\n  const char* next_minidump_id_c_;\n\n  const bool handler_installed_;\n  HandlerCallback crash_handler_;\n\n  // The global exception handler stack. This is need becuase there may exist\n  // multiple ExceptionHandler instances in a process. Each will have itself\n  // registered in this stack.\n  static std::vector<ExceptionHandler*> *handler_stack_;\n  // The index of the handler that should handle the next exception.\n  static unsigned handler_stack_index_;\n  static pthread_mutex_t handler_stack_mutex_;\n\n  // A vector of the old signal handlers.\n  std::vector<std::pair<int, struct sigaction *> > old_handlers_;\n\n  // We need to explicitly enable ptrace of parent processes on some\n  // kernels, but we need to know the PID of the cloned process before we\n  // can do this. We create a pipe which we can use to block the\n  // cloned process after creating it, until we have explicitly enabled \n  // ptrace. This is used to store the file descriptors for the pipe\n  int fdes[2];\n\n  // Callers can add extra info about mappings for cases where the\n  // dumper code cannot extract enough information from /proc/<pid>/maps.\n  MappingList mapping_list_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/handler/exception_handler_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <stdint.h>\n#include <unistd.h>\n#include <signal.h>\n#include <sys/mman.h>\n#include <sys/poll.h>\n#include <sys/socket.h>\n#include <sys/uio.h>\n#include <sys/wait.h>\n\n#include <string>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"client/linux/handler/exception_handler.h\"\n#include \"client/linux/minidump_writer/minidump_writer.h\"\n#include \"common/linux/eintr_wrapper.h\"\n#include \"common/linux/file_id.h\"\n#include \"common/linux/linux_libc_support.h\"\n#include \"common/tests/auto_tempdir.h\"\n#include \"third_party/lss/linux_syscall_support.h\"\n#include \"google_breakpad/processor/minidump.h\"\n\nusing namespace google_breakpad;\n\n// Length of a formatted GUID string =\n// sizeof(MDGUID) * 2 + 4 (for dashes) + 1 (null terminator)\nconst int kGUIDStringSize = 37;\n\nstatic void sigchld_handler(int signo) { }\n\nclass ExceptionHandlerTest : public ::testing::Test {\n protected:\n  void SetUp() {\n    // We need to be able to wait for children, so SIGCHLD cannot be SIG_IGN.\n    struct sigaction sa;\n    memset(&sa, 0, sizeof(sa));\n    sa.sa_handler = sigchld_handler;\n    ASSERT_NE(sigaction(SIGCHLD, &sa, &old_action), -1);\n  }\n\n  void TearDown() {\n    sigaction(SIGCHLD, &old_action, NULL);\n  }\n\n  struct sigaction old_action;\n};\n\nTEST(ExceptionHandlerTest, Simple) {\n  AutoTempDir temp_dir;\n  ExceptionHandler handler(temp_dir.path(), NULL, NULL, NULL, true);\n}\n\nstatic bool DoneCallback(const char* dump_path,\n                         const char* minidump_id,\n                         void* context,\n                         bool succeeded) {\n  if (!succeeded)\n    return succeeded;\n\n  int fd = (intptr_t) context;\n  uint32_t len = my_strlen(minidump_id);\n  HANDLE_EINTR(sys_write(fd, &len, sizeof(len)));\n  HANDLE_EINTR(sys_write(fd, minidump_id, len));\n  sys_close(fd);\n\n  return true;\n}\n\nTEST(ExceptionHandlerTest, ChildCrash) {\n  AutoTempDir temp_dir;\n  int fds[2];\n  ASSERT_NE(pipe(fds), -1);\n\n  const pid_t child = fork();\n  if (child == 0) {\n    close(fds[0]);\n    ExceptionHandler handler(temp_dir.path(), NULL, DoneCallback, (void*) fds[1],\n                             true);\n    *reinterpret_cast<volatile int*>(NULL) = 0;\n  }\n  close(fds[1]);\n\n  int status;\n  ASSERT_NE(HANDLE_EINTR(waitpid(child, &status, 0)), -1);\n  ASSERT_TRUE(WIFSIGNALED(status));\n  ASSERT_EQ(WTERMSIG(status), SIGSEGV);\n\n  struct pollfd pfd;\n  memset(&pfd, 0, sizeof(pfd));\n  pfd.fd = fds[0];\n  pfd.events = POLLIN | POLLERR;\n\n  const int r = HANDLE_EINTR(poll(&pfd, 1, 0));\n  ASSERT_EQ(r, 1);\n  ASSERT_TRUE(pfd.revents & POLLIN);\n\n  uint32_t len;\n  ASSERT_EQ(read(fds[0], &len, sizeof(len)), (ssize_t)sizeof(len));\n  ASSERT_LT(len, (uint32_t)2048);\n  char* filename = reinterpret_cast<char*>(malloc(len + 1));\n  ASSERT_EQ(read(fds[0], filename, len), len);\n  filename[len] = 0;\n  close(fds[0]);\n\n  const std::string minidump_filename = temp_dir.path() + \"/\" + filename +\n                                        \".dmp\";\n\n  struct stat st;\n  ASSERT_EQ(stat(minidump_filename.c_str(), &st), 0);\n  ASSERT_GT(st.st_size, 0u);\n  unlink(minidump_filename.c_str());\n}\n\n// Test that memory around the instruction pointer is written\n// to the dump as a MinidumpMemoryRegion.\nTEST(ExceptionHandlerTest, InstructionPointerMemory) {\n  AutoTempDir temp_dir;\n  int fds[2];\n  ASSERT_NE(pipe(fds), -1);\n\n  // These are defined here so the parent can use them to check the\n  // data from the minidump afterwards.\n  const u_int32_t kMemorySize = 256;  // bytes\n  const int kOffset = kMemorySize / 2;\n  // This crashes with SIGILL on x86/x86-64/arm.\n  const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff };\n\n  const pid_t child = fork();\n  if (child == 0) {\n    close(fds[0]);\n    ExceptionHandler handler(temp_dir.path(), NULL, DoneCallback,\n                             (void*) fds[1], true);\n    // Get some executable memory.\n    char* memory =\n      reinterpret_cast<char*>(mmap(NULL,\n                                   kMemorySize,\n                                   PROT_READ | PROT_WRITE | PROT_EXEC,\n                                   MAP_PRIVATE | MAP_ANON,\n                                   -1,\n                                   0));\n    if (!memory)\n      exit(0);\n\n    // Write some instructions that will crash. Put them in the middle\n    // of the block of memory, because the minidump should contain 128\n    // bytes on either side of the instruction pointer.\n    memcpy(memory + kOffset, instructions, sizeof(instructions));\n\n    // Now execute the instructions, which should crash.\n    typedef void (*void_function)(void);\n    void_function memory_function =\n      reinterpret_cast<void_function>(memory + kOffset);\n    memory_function();\n  }\n  close(fds[1]);\n\n  int status;\n  ASSERT_NE(HANDLE_EINTR(waitpid(child, &status, 0)), -1);\n  ASSERT_TRUE(WIFSIGNALED(status));\n  ASSERT_EQ(WTERMSIG(status), SIGILL);\n\n  struct pollfd pfd;\n  memset(&pfd, 0, sizeof(pfd));\n  pfd.fd = fds[0];\n  pfd.events = POLLIN | POLLERR;\n\n  const int r = HANDLE_EINTR(poll(&pfd, 1, 0));\n  ASSERT_EQ(r, 1);\n  ASSERT_TRUE(pfd.revents & POLLIN);\n\n  uint32_t len;\n  ASSERT_EQ(read(fds[0], &len, sizeof(len)), (ssize_t)sizeof(len));\n  ASSERT_LT(len, (uint32_t)2048);\n  char* filename = reinterpret_cast<char*>(malloc(len + 1));\n  ASSERT_EQ(read(fds[0], filename, len), len);\n  filename[len] = 0;\n  close(fds[0]);\n\n  const std::string minidump_filename = temp_dir.path() + \"/\" + filename +\n                                        \".dmp\";\n\n  struct stat st;\n  ASSERT_EQ(stat(minidump_filename.c_str(), &st), 0);\n  ASSERT_GT(st.st_size, 0u);\n\n  // Read the minidump. Locate the exception record and the\n  // memory list, and then ensure that there is a memory region\n  // in the memory list that covers the instruction pointer from\n  // the exception record.\n  Minidump minidump(minidump_filename);\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpException* exception = minidump.GetException();\n  MinidumpMemoryList* memory_list = minidump.GetMemoryList();\n  ASSERT_TRUE(exception);\n  ASSERT_TRUE(memory_list);\n  ASSERT_LT(0, memory_list->region_count());\n\n  MinidumpContext* context = exception->GetContext();\n  ASSERT_TRUE(context);\n\n  u_int64_t instruction_pointer;\n  switch (context->GetContextCPU()) {\n  case MD_CONTEXT_X86:\n    instruction_pointer = context->GetContextX86()->eip;\n    break;\n  case MD_CONTEXT_AMD64:\n    instruction_pointer = context->GetContextAMD64()->rip;\n    break;\n  case MD_CONTEXT_ARM:\n    instruction_pointer = context->GetContextARM()->iregs[15];\n    break;\n  default:\n    FAIL() << \"Unknown context CPU: \" << context->GetContextCPU();\n    break;\n  }\n\n  MinidumpMemoryRegion* region =\n    memory_list->GetMemoryRegionForAddress(instruction_pointer);\n  ASSERT_TRUE(region);\n\n  EXPECT_EQ(kMemorySize, region->GetSize());\n  const u_int8_t* bytes = region->GetMemory();\n  ASSERT_TRUE(bytes);\n\n  u_int8_t prefix_bytes[kOffset];\n  u_int8_t suffix_bytes[kMemorySize - kOffset - sizeof(instructions)];\n  memset(prefix_bytes, 0, sizeof(prefix_bytes));\n  memset(suffix_bytes, 0, sizeof(suffix_bytes));\n  EXPECT_TRUE(memcmp(bytes, prefix_bytes, sizeof(prefix_bytes)) == 0);\n  EXPECT_TRUE(memcmp(bytes + kOffset, instructions, sizeof(instructions)) == 0);\n  EXPECT_TRUE(memcmp(bytes + kOffset + sizeof(instructions),\n                     suffix_bytes, sizeof(suffix_bytes)) == 0);\n\n  unlink(minidump_filename.c_str());\n  free(filename);\n}\n\n// Test that the memory region around the instruction pointer is\n// bounded correctly on the low end.\nTEST(ExceptionHandlerTest, InstructionPointerMemoryMinBound) {\n  AutoTempDir temp_dir;\n  int fds[2];\n  ASSERT_NE(pipe(fds), -1);\n\n  // These are defined here so the parent can use them to check the\n  // data from the minidump afterwards.\n  const u_int32_t kMemorySize = 256;  // bytes\n  const int kOffset = 0;\n  // This crashes with SIGILL on x86/x86-64/arm.\n  const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff };\n\n  const pid_t child = fork();\n  if (child == 0) {\n    close(fds[0]);\n    ExceptionHandler handler(temp_dir.path(), NULL, DoneCallback,\n                             (void*) fds[1], true);\n    // Get some executable memory.\n    char* memory =\n      reinterpret_cast<char*>(mmap(NULL,\n                                   kMemorySize,\n                                   PROT_READ | PROT_WRITE | PROT_EXEC,\n                                   MAP_PRIVATE | MAP_ANON,\n                                   -1,\n                                   0));\n    if (!memory)\n      exit(0);\n\n    // Write some instructions that will crash. Put them in the middle\n    // of the block of memory, because the minidump should contain 128\n    // bytes on either side of the instruction pointer.\n    memcpy(memory + kOffset, instructions, sizeof(instructions));\n\n    // Now execute the instructions, which should crash.\n    typedef void (*void_function)(void);\n    void_function memory_function =\n      reinterpret_cast<void_function>(memory + kOffset);\n    memory_function();\n  }\n  close(fds[1]);\n\n  int status;\n  ASSERT_NE(HANDLE_EINTR(waitpid(child, &status, 0)), -1);\n  ASSERT_TRUE(WIFSIGNALED(status));\n  ASSERT_EQ(WTERMSIG(status), SIGILL);\n\n  struct pollfd pfd;\n  memset(&pfd, 0, sizeof(pfd));\n  pfd.fd = fds[0];\n  pfd.events = POLLIN | POLLERR;\n\n  const int r = HANDLE_EINTR(poll(&pfd, 1, 0));\n  ASSERT_EQ(r, 1);\n  ASSERT_TRUE(pfd.revents & POLLIN);\n\n  uint32_t len;\n  ASSERT_EQ(read(fds[0], &len, sizeof(len)), (ssize_t)sizeof(len));\n  ASSERT_LT(len, (uint32_t)2048);\n  char* filename = reinterpret_cast<char*>(malloc(len + 1));\n  ASSERT_EQ(read(fds[0], filename, len), len);\n  filename[len] = 0;\n  close(fds[0]);\n\n  const std::string minidump_filename = temp_dir.path() + \"/\" + filename +\n                                        \".dmp\";\n\n  struct stat st;\n  ASSERT_EQ(stat(minidump_filename.c_str(), &st), 0);\n  ASSERT_GT(st.st_size, 0u);\n\n  // Read the minidump. Locate the exception record and the\n  // memory list, and then ensure that there is a memory region\n  // in the memory list that covers the instruction pointer from\n  // the exception record.\n  Minidump minidump(minidump_filename);\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpException* exception = minidump.GetException();\n  MinidumpMemoryList* memory_list = minidump.GetMemoryList();\n  ASSERT_TRUE(exception);\n  ASSERT_TRUE(memory_list);\n  ASSERT_LT(0, memory_list->region_count());\n\n  MinidumpContext* context = exception->GetContext();\n  ASSERT_TRUE(context);\n\n  u_int64_t instruction_pointer;\n  switch (context->GetContextCPU()) {\n  case MD_CONTEXT_X86:\n    instruction_pointer = context->GetContextX86()->eip;\n    break;\n  case MD_CONTEXT_AMD64:\n    instruction_pointer = context->GetContextAMD64()->rip;\n    break;\n  case MD_CONTEXT_ARM:\n    instruction_pointer = context->GetContextARM()->iregs[15];\n    break;\n  default:\n    FAIL() << \"Unknown context CPU: \" << context->GetContextCPU();\n    break;\n  }\n\n  MinidumpMemoryRegion* region =\n    memory_list->GetMemoryRegionForAddress(instruction_pointer);\n  ASSERT_TRUE(region);\n\n  EXPECT_EQ(kMemorySize / 2, region->GetSize());\n  const u_int8_t* bytes = region->GetMemory();\n  ASSERT_TRUE(bytes);\n\n  u_int8_t suffix_bytes[kMemorySize / 2 - sizeof(instructions)];\n  memset(suffix_bytes, 0, sizeof(suffix_bytes));\n  EXPECT_TRUE(memcmp(bytes + kOffset, instructions, sizeof(instructions)) == 0);\n  EXPECT_TRUE(memcmp(bytes + kOffset + sizeof(instructions),\n                     suffix_bytes, sizeof(suffix_bytes)) == 0);\n\n  unlink(minidump_filename.c_str());\n  free(filename);\n}\n\n// Test that the memory region around the instruction pointer is\n// bounded correctly on the high end.\nTEST(ExceptionHandlerTest, InstructionPointerMemoryMaxBound) {\n  AutoTempDir temp_dir;\n  int fds[2];\n  ASSERT_NE(pipe(fds), -1);\n\n  // These are defined here so the parent can use them to check the\n  // data from the minidump afterwards.\n  // Use 4k here because the OS will hand out a single page even\n  // if a smaller size is requested, and this test wants to\n  // test the upper bound of the memory range.\n  const u_int32_t kMemorySize = 4096;  // bytes\n  // This crashes with SIGILL on x86/x86-64/arm.\n  const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff };\n  const int kOffset = kMemorySize - sizeof(instructions);\n\n  const pid_t child = fork();\n  if (child == 0) {\n    close(fds[0]);\n    ExceptionHandler handler(temp_dir.path(), NULL, DoneCallback,\n                             (void*) fds[1], true);\n    // Get some executable memory.\n    char* memory =\n      reinterpret_cast<char*>(mmap(NULL,\n                                   kMemorySize,\n                                   PROT_READ | PROT_WRITE | PROT_EXEC,\n                                   MAP_PRIVATE | MAP_ANON,\n                                   -1,\n                                   0));\n    if (!memory)\n      exit(0);\n\n    // Write some instructions that will crash. Put them in the middle\n    // of the block of memory, because the minidump should contain 128\n    // bytes on either side of the instruction pointer.\n    memcpy(memory + kOffset, instructions, sizeof(instructions));\n\n    // Now execute the instructions, which should crash.\n    typedef void (*void_function)(void);\n    void_function memory_function =\n      reinterpret_cast<void_function>(memory + kOffset);\n    memory_function();\n  }\n  close(fds[1]);\n\n  int status;\n  ASSERT_NE(HANDLE_EINTR(waitpid(child, &status, 0)), -1);\n  ASSERT_TRUE(WIFSIGNALED(status));\n  ASSERT_EQ(WTERMSIG(status), SIGILL);\n\n  struct pollfd pfd;\n  memset(&pfd, 0, sizeof(pfd));\n  pfd.fd = fds[0];\n  pfd.events = POLLIN | POLLERR;\n\n  const int r = HANDLE_EINTR(poll(&pfd, 1, 0));\n  ASSERT_EQ(r, 1);\n  ASSERT_TRUE(pfd.revents & POLLIN);\n\n  uint32_t len;\n  ASSERT_EQ(read(fds[0], &len, sizeof(len)), (ssize_t)sizeof(len));\n  ASSERT_LT(len, (uint32_t)2048);\n  char* filename = reinterpret_cast<char*>(malloc(len + 1));\n  ASSERT_EQ(read(fds[0], filename, len), len);\n  filename[len] = 0;\n  close(fds[0]);\n\n  const std::string minidump_filename = temp_dir.path() + \"/\" + filename +\n                                        \".dmp\";\n\n  struct stat st;\n  ASSERT_EQ(stat(minidump_filename.c_str(), &st), 0);\n  ASSERT_GT(st.st_size, 0u);\n\n  // Read the minidump. Locate the exception record and the\n  // memory list, and then ensure that there is a memory region\n  // in the memory list that covers the instruction pointer from\n  // the exception record.\n  Minidump minidump(minidump_filename);\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpException* exception = minidump.GetException();\n  MinidumpMemoryList* memory_list = minidump.GetMemoryList();\n  ASSERT_TRUE(exception);\n  ASSERT_TRUE(memory_list);\n  ASSERT_LT(0, memory_list->region_count());\n\n  MinidumpContext* context = exception->GetContext();\n  ASSERT_TRUE(context);\n\n  u_int64_t instruction_pointer;\n  switch (context->GetContextCPU()) {\n  case MD_CONTEXT_X86:\n    instruction_pointer = context->GetContextX86()->eip;\n    break;\n  case MD_CONTEXT_AMD64:\n    instruction_pointer = context->GetContextAMD64()->rip;\n    break;\n  case MD_CONTEXT_ARM:\n    instruction_pointer = context->GetContextARM()->iregs[15];\n    break;\n  default:\n    FAIL() << \"Unknown context CPU: \" << context->GetContextCPU();\n    break;\n  }\n\n  MinidumpMemoryRegion* region =\n    memory_list->GetMemoryRegionForAddress(instruction_pointer);\n  ASSERT_TRUE(region);\n\n  const size_t kPrefixSize = 128;  // bytes\n  EXPECT_EQ(kPrefixSize + sizeof(instructions), region->GetSize());\n  const u_int8_t* bytes = region->GetMemory();\n  ASSERT_TRUE(bytes);\n\n  u_int8_t prefix_bytes[kPrefixSize];\n  memset(prefix_bytes, 0, sizeof(prefix_bytes));\n  EXPECT_TRUE(memcmp(bytes, prefix_bytes, sizeof(prefix_bytes)) == 0);\n  EXPECT_TRUE(memcmp(bytes + kPrefixSize,\n                     instructions, sizeof(instructions)) == 0);\n\n  unlink(minidump_filename.c_str());\n  free(filename);\n}\n\n// Ensure that an extra memory block doesn't get added when the\n// instruction pointer is not in mapped memory.\nTEST(ExceptionHandlerTest, InstructionPointerMemoryNullPointer) {\n  AutoTempDir temp_dir;\n  int fds[2];\n  ASSERT_NE(pipe(fds), -1);\n\n\n  const pid_t child = fork();\n  if (child == 0) {\n    close(fds[0]);\n    ExceptionHandler handler(temp_dir.path(), NULL, DoneCallback,\n                             (void*) fds[1], true);\n    // Try calling a NULL pointer.\n    typedef void (*void_function)(void);\n    void_function memory_function =\n      reinterpret_cast<void_function>(NULL);\n    memory_function();\n  }\n  close(fds[1]);\n\n  int status;\n  ASSERT_NE(HANDLE_EINTR(waitpid(child, &status, 0)), -1);\n  ASSERT_TRUE(WIFSIGNALED(status));\n  ASSERT_EQ(WTERMSIG(status), SIGSEGV);\n\n  struct pollfd pfd;\n  memset(&pfd, 0, sizeof(pfd));\n  pfd.fd = fds[0];\n  pfd.events = POLLIN | POLLERR;\n\n  const int r = HANDLE_EINTR(poll(&pfd, 1, 0));\n  ASSERT_EQ(r, 1);\n  ASSERT_TRUE(pfd.revents & POLLIN);\n\n  uint32_t len;\n  ASSERT_EQ(read(fds[0], &len, sizeof(len)), (ssize_t)sizeof(len));\n  ASSERT_LT(len, (uint32_t)2048);\n  char* filename = reinterpret_cast<char*>(malloc(len + 1));\n  ASSERT_EQ(read(fds[0], filename, len), len);\n  filename[len] = 0;\n  close(fds[0]);\n\n  const std::string minidump_filename = temp_dir.path() + \"/\" + filename +\n                                        \".dmp\";\n\n  struct stat st;\n  ASSERT_EQ(stat(minidump_filename.c_str(), &st), 0);\n  ASSERT_GT(st.st_size, 0u);\n\n  // Read the minidump. Locate the exception record and the\n  // memory list, and then ensure that there is a memory region\n  // in the memory list that covers the instruction pointer from\n  // the exception record.\n  Minidump minidump(minidump_filename);\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpException* exception = minidump.GetException();\n  MinidumpMemoryList* memory_list = minidump.GetMemoryList();\n  ASSERT_TRUE(exception);\n  ASSERT_TRUE(memory_list);\n  ASSERT_EQ((unsigned int)1, memory_list->region_count());\n\n  unlink(minidump_filename.c_str());\n  free(filename);\n}\n\nstatic bool SimpleCallback(const char* dump_path,\n                           const char* minidump_id,\n                           void* context,\n                           bool succeeded) {\n  if (!succeeded)\n    return succeeded;\n\n  string* minidump_file = reinterpret_cast<string*>(context);\n  minidump_file->append(dump_path);\n  minidump_file->append(\"/\");\n  minidump_file->append(minidump_id);\n  minidump_file->append(\".dmp\");\n  return true;\n}\n\n// Test that anonymous memory maps can be annotated with names and IDs.\nTEST(ExceptionHandlerTest, ModuleInfo) {\n  // These are defined here so the parent can use them to check the\n  // data from the minidump afterwards.\n  const u_int32_t kMemorySize = sysconf(_SC_PAGESIZE);\n  const char* kMemoryName = \"a fake module\";\n  const u_int8_t kModuleGUID[sizeof(MDGUID)] = {\n    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,\n    0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF\n  };\n  char module_identifier_buffer[kGUIDStringSize];\n  FileID::ConvertIdentifierToString(kModuleGUID,\n                                    module_identifier_buffer,\n                                    sizeof(module_identifier_buffer));\n  string module_identifier(module_identifier_buffer);\n  // Strip out dashes\n  size_t pos;\n  while ((pos = module_identifier.find('-')) != string::npos) {\n    module_identifier.erase(pos, 1);\n  }\n  // And append a zero, because module IDs include an \"age\" field\n  // which is always zero on Linux.\n  module_identifier += \"0\";\n\n  // Get some memory.\n  char* memory =\n    reinterpret_cast<char*>(mmap(NULL,\n                                 kMemorySize,\n                                 PROT_READ | PROT_WRITE,\n                                 MAP_PRIVATE | MAP_ANON,\n                                 -1,\n                                 0));\n  const uintptr_t kMemoryAddress = reinterpret_cast<uintptr_t>(memory);\n  ASSERT_TRUE(memory);\n\n  string minidump_filename;\n  AutoTempDir temp_dir;\n  ExceptionHandler handler(temp_dir.path(), NULL, SimpleCallback,\n                           (void*)&minidump_filename, true);\n  // Add info about the anonymous memory mapping.\n  handler.AddMappingInfo(kMemoryName,\n                         kModuleGUID,\n                         kMemoryAddress,\n                         kMemorySize,\n                         0);\n  handler.WriteMinidump();\n\n  // Read the minidump. Load the module list, and ensure that\n  // the mmap'ed |memory| is listed with the given module name\n  // and debug ID.\n  Minidump minidump(minidump_filename);\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpModuleList* module_list = minidump.GetModuleList();\n  ASSERT_TRUE(module_list);\n  const MinidumpModule* module =\n    module_list->GetModuleForAddress(kMemoryAddress);\n  ASSERT_TRUE(module);\n\n  EXPECT_EQ(kMemoryAddress, module->base_address());\n  EXPECT_EQ(kMemorySize, module->size());\n  EXPECT_EQ(kMemoryName, module->code_file());\n  EXPECT_EQ(module_identifier, module->debug_identifier());\n\n  unlink(minidump_filename.c_str());\n}\n\nstatic const unsigned kControlMsgSize =\n    CMSG_SPACE(sizeof(int)) + CMSG_SPACE(sizeof(struct ucred));\n\nstatic bool\nCrashHandler(const void* crash_context, size_t crash_context_size,\n             void* context) {\n  const int fd = (intptr_t) context;\n  int fds[2];\n  if (pipe(fds) == -1) {\n    // There doesn't seem to be any way to reliably handle\n    // this failure without the parent process hanging\n    // At least make sure that this process doesn't access\n    // unexpected file descriptors\n    fds[0] = -1;\n    fds[1] = -1;\n  }\n  struct kernel_msghdr msg = {0};\n  struct kernel_iovec iov;\n  iov.iov_base = const_cast<void*>(crash_context);\n  iov.iov_len = crash_context_size;\n  msg.msg_iov = &iov;\n  msg.msg_iovlen = 1;\n  char cmsg[kControlMsgSize];\n  memset(cmsg, 0, kControlMsgSize);\n  msg.msg_control = cmsg;\n  msg.msg_controllen = sizeof(cmsg);\n\n  struct cmsghdr *hdr = CMSG_FIRSTHDR(&msg);\n  hdr->cmsg_level = SOL_SOCKET;\n  hdr->cmsg_type = SCM_RIGHTS;\n  hdr->cmsg_len = CMSG_LEN(sizeof(int));\n  *((int*) CMSG_DATA(hdr)) = fds[1];\n  hdr = CMSG_NXTHDR((struct msghdr*) &msg, hdr);\n  hdr->cmsg_level = SOL_SOCKET;\n  hdr->cmsg_type = SCM_CREDENTIALS;\n  hdr->cmsg_len = CMSG_LEN(sizeof(struct ucred));\n  struct ucred *cred = reinterpret_cast<struct ucred*>(CMSG_DATA(hdr));\n  cred->uid = getuid();\n  cred->gid = getgid();\n  cred->pid = getpid();\n\n  HANDLE_EINTR(sys_sendmsg(fd, &msg, 0));\n  sys_close(fds[1]);\n\n  char b;\n  HANDLE_EINTR(sys_read(fds[0], &b, 1));\n\n  return true;\n}\n\nTEST(ExceptionHandlerTest, ExternalDumper) {\n  int fds[2];\n  ASSERT_NE(socketpair(AF_UNIX, SOCK_DGRAM, 0, fds), -1);\n  static const int on = 1;\n  setsockopt(fds[0], SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));\n  setsockopt(fds[1], SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));\n\n  const pid_t child = fork();\n  if (child == 0) {\n    close(fds[0]);\n    ExceptionHandler handler(\"/tmp1\", NULL, NULL, (void*) fds[1], true);\n    handler.set_crash_handler(CrashHandler);\n    *reinterpret_cast<volatile int*>(NULL) = 0;\n  }\n  close(fds[1]);\n  struct msghdr msg = {0};\n  struct iovec iov;\n  static const unsigned kCrashContextSize =\n      sizeof(ExceptionHandler::CrashContext);\n  char context[kCrashContextSize];\n  char control[kControlMsgSize];\n  iov.iov_base = context;\n  iov.iov_len = kCrashContextSize;\n  msg.msg_iov = &iov;\n  msg.msg_iovlen = 1;\n  msg.msg_control = control;\n  msg.msg_controllen = kControlMsgSize;\n\n  const ssize_t n = HANDLE_EINTR(recvmsg(fds[0], &msg, 0));\n  ASSERT_EQ(n, kCrashContextSize);\n  ASSERT_EQ(msg.msg_controllen, kControlMsgSize);\n  ASSERT_EQ(msg.msg_flags, 0);\n  ASSERT_EQ(close(fds[0]), 0);\n\n  pid_t crashing_pid = -1;\n  int signal_fd = -1;\n  for (struct cmsghdr *hdr = CMSG_FIRSTHDR(&msg); hdr;\n       hdr = CMSG_NXTHDR(&msg, hdr)) {\n    if (hdr->cmsg_level != SOL_SOCKET)\n      continue;\n    if (hdr->cmsg_type == SCM_RIGHTS) {\n      const unsigned len = hdr->cmsg_len -\n          (((uint8_t*)CMSG_DATA(hdr)) - (uint8_t*)hdr);\n      ASSERT_EQ(len, sizeof(int));\n      signal_fd = *((int *) CMSG_DATA(hdr));\n    } else if (hdr->cmsg_type == SCM_CREDENTIALS) {\n      const struct ucred *cred =\n          reinterpret_cast<struct ucred*>(CMSG_DATA(hdr));\n      crashing_pid = cred->pid;\n    }\n  }\n\n  ASSERT_NE(crashing_pid, -1);\n  ASSERT_NE(signal_fd, -1);\n\n  AutoTempDir temp_dir;\n  std::string templ = temp_dir.path() + \"/exception-handler-unittest\";\n  ASSERT_TRUE(WriteMinidump(templ.c_str(), crashing_pid, context,\n                            kCrashContextSize));\n  static const char b = 0;\n  HANDLE_EINTR(write(signal_fd, &b, 1));\n  ASSERT_EQ(close(signal_fd), 0);\n\n  int status;\n  ASSERT_NE(HANDLE_EINTR(waitpid(child, &status, 0)), -1);\n  ASSERT_TRUE(WIFSIGNALED(status));\n  ASSERT_EQ(WTERMSIG(status), SIGSEGV);\n\n  struct stat st;\n  ASSERT_EQ(stat(templ.c_str(), &st), 0);\n  ASSERT_GT(st.st_size, 0u);\n  unlink(templ.c_str());\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/log/log.cc",
    "content": "// Copyright (c) 2012 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"client/linux/log/log.h\"\n\n#if defined(__ANDROID__)\n#include <android/log.h>\n#else\n#include \"third_party/lss/linux_syscall_support.h\"\n#endif\n\nnamespace logger {\n\nint write(const char* buf, size_t nbytes) {\n#if defined(__ANDROID__)\n  return __android_log_write(ANDROID_LOG_WARN, \"google-breakpad\", buf);\n#else\n  return sys_write(2, buf, nbytes);\n#endif\n}\n\n}  // namespace logger\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/log/log.h",
    "content": "// Copyright (c) 2012, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_LINUX_LOG_LOG_H_\n#define CLIENT_LINUX_LOG_LOG_H_\n\n#include <stddef.h>\n\nnamespace logger {\n\nint write(const char* buf, size_t nbytes);\n\n}  // namespace logger\n\n#endif  // CLIENT_LINUX_LOG_LOG_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/directory_reader.h",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_\n#define CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_\n\n#include <stdint.h>\n#include <unistd.h>\n#include <limits.h>\n#include <assert.h>\n#include <errno.h>\n#include <string.h>\n\n#include \"third_party/lss/linux_syscall_support.h\"\n\nnamespace google_breakpad {\n\n// A class for enumerating a directory without using diropen/readdir or other\n// functions which may allocate memory.\nclass DirectoryReader {\n public:\n  DirectoryReader(int fd)\n      : fd_(fd),\n        buf_used_(0) {\n  }\n\n  // Return the next entry from the directory\n  //   name: (output) the NUL terminated entry name\n  //\n  // Returns true iff successful (false on EOF).\n  //\n  // After calling this, one must call |PopEntry| otherwise you'll get the same\n  // entry over and over.\n  bool GetNextEntry(const char** name) {\n    struct kernel_dirent* const dent =\n      reinterpret_cast<kernel_dirent*>(buf_);\n\n    if (buf_used_ == 0) {\n      // need to read more entries.\n      const int n = sys_getdents(fd_, dent, sizeof(buf_));\n      if (n < 0) {\n        return false;\n      } else if (n == 0) {\n        hit_eof_ = true;\n      } else {\n        buf_used_ += n;\n      }\n    }\n\n    if (buf_used_ == 0 && hit_eof_)\n      return false;\n\n    assert(buf_used_ > 0);\n\n    *name = dent->d_name;\n    return true;\n  }\n\n  void PopEntry() {\n    if (!buf_used_)\n      return;\n\n    const struct kernel_dirent* const dent =\n      reinterpret_cast<kernel_dirent*>(buf_);\n\n    buf_used_ -= dent->d_reclen;\n    memmove(buf_, buf_ + dent->d_reclen, buf_used_);\n  }\n\n private:\n  const int fd_;\n  bool hit_eof_;\n  unsigned buf_used_;\n  uint8_t buf_[sizeof(struct kernel_dirent) + NAME_MAX + 1];\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/directory_reader_unittest.cc",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <set>\n#include <string>\n\n#include <dirent.h>\n#include <fcntl.h>\n#include <sys/types.h>\n\n#include \"client/linux/minidump_writer/directory_reader.h\"\n#include \"breakpad_googletest_includes.h\"\n\nusing namespace google_breakpad;\n\nnamespace {\ntypedef testing::Test DirectoryReaderTest;\n}\n\nTEST(DirectoryReaderTest, CompareResults) {\n  std::set<std::string> dent_set;\n\n  DIR *const dir = opendir(\"/proc/self\");\n  ASSERT_TRUE(dir != NULL);\n\n  struct dirent* dent;\n  while ((dent = readdir(dir)))\n    dent_set.insert(dent->d_name);\n\n  closedir(dir);\n\n  const int fd = open(\"/proc/self\", O_DIRECTORY | O_RDONLY);\n  ASSERT_GE(fd, 0);\n\n  DirectoryReader dir_reader(fd);\n  unsigned seen = 0;\n\n  const char* name;\n  while (dir_reader.GetNextEntry(&name)) {\n    ASSERT_TRUE(dent_set.find(name) != dent_set.end());\n    seen++;\n    dir_reader.PopEntry();\n  }\n\n  ASSERT_TRUE(dent_set.find(\"status\") != dent_set.end());\n  ASSERT_TRUE(dent_set.find(\"stat\") != dent_set.end());\n  ASSERT_TRUE(dent_set.find(\"cmdline\") != dent_set.end());\n\n  ASSERT_EQ(dent_set.size(), seen);\n  close(fd);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/line_reader.h",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_\n#define CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_\n\n#include <stdint.h>\n#include <assert.h>\n#include <string.h>\n\n#include \"third_party/lss/linux_syscall_support.h\"\n\nnamespace google_breakpad {\n\n// A class for reading a file, line by line, without using fopen/fgets or other\n// functions which may allocate memory.\nclass LineReader {\n public:\n  LineReader(int fd)\n      : fd_(fd),\n        hit_eof_(false),\n        buf_used_(0) {\n  }\n\n  // The maximum length of a line.\n  static const size_t kMaxLineLen = 512;\n\n  // Return the next line from the file.\n  //   line: (output) a pointer to the start of the line. The line is NUL\n  //     terminated.\n  //   len: (output) the length of the line (not inc the NUL byte)\n  //\n  // Returns true iff successful (false on EOF).\n  //\n  // One must call |PopLine| after this function, otherwise you'll continue to\n  // get the same line over and over.\n  bool GetNextLine(const char **line, unsigned *len) {\n    for (;;) {\n      if (buf_used_ == 0 && hit_eof_)\n        return false;\n\n      for (unsigned i = 0; i < buf_used_; ++i) {\n        if (buf_[i] == '\\n' || buf_[i] == 0) {\n          buf_[i] = 0;\n          *len = i;\n          *line = buf_;\n          return true;\n        }\n      }\n\n      if (buf_used_ == sizeof(buf_)) {\n        // we scanned the whole buffer and didn't find an end-of-line marker.\n        // This line is too long to process.\n        return false;\n      }\n\n      // We didn't find any end-of-line terminators in the buffer. However, if\n      // this is the last line in the file it might not have one:\n      if (hit_eof_) {\n        assert(buf_used_);\n        // There's room for the NUL because of the buf_used_ == sizeof(buf_)\n        // check above.\n        buf_[buf_used_] = 0;\n        *len = buf_used_;\n        buf_used_ += 1;  // since we appended the NUL.\n        *line = buf_;\n        return true;\n      }\n\n      // Otherwise, we should pull in more data from the file\n      const ssize_t n = sys_read(fd_, buf_ + buf_used_,\n                                 sizeof(buf_) - buf_used_);\n      if (n < 0) {\n        return false;\n      } else if (n == 0) {\n        hit_eof_ = true;\n      } else {\n        buf_used_ += n;\n      }\n\n      // At this point, we have either set the hit_eof_ flag, or we have more\n      // data to process...\n    }\n  }\n\n  void PopLine(unsigned len) {\n    // len doesn't include the NUL byte at the end.\n\n    assert(buf_used_ >= len + 1);\n    buf_used_ -= len + 1;\n    memmove(buf_, buf_ + len + 1, buf_used_);\n  }\n\n private:\n  const int fd_;\n\n  bool hit_eof_;\n  unsigned buf_used_;\n  char buf_[kMaxLineLen];\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/line_reader_unittest.cc",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <stdlib.h>\n#include <unistd.h>\n#include <sys/types.h>\n\n#include \"client/linux/minidump_writer/line_reader.h\"\n#include \"breakpad_googletest_includes.h\"\n#include \"common/linux/eintr_wrapper.h\"\n\nusing namespace google_breakpad;\n\n#if !defined(__ANDROID__)\n#define TEMPDIR \"/tmp\"\n#else\n#define TEMPDIR \"/data/local/tmp\"\n#endif\n\nstatic int TemporaryFile() {\n  static const char templ[] = TEMPDIR \"/line-reader-unittest-XXXXXX\";\n  char templ_copy[sizeof(templ)];\n  memcpy(templ_copy, templ, sizeof(templ));\n  const int fd = mkstemp(templ_copy);\n  if (fd >= 0)\n    unlink(templ_copy);\n\n  return fd;\n}\n\nnamespace {\ntypedef testing::Test LineReaderTest;\n}\n\nTEST(LineReaderTest, EmptyFile) {\n  const int fd = TemporaryFile();\n  LineReader reader(fd);\n\n  const char *line;\n  unsigned len;\n  ASSERT_FALSE(reader.GetNextLine(&line, &len));\n\n  close(fd);\n}\n\nTEST(LineReaderTest, OneLineTerminated) {\n  const int fd = TemporaryFile();\n  const int r = HANDLE_EINTR(write(fd, \"a\\n\", 2));\n  ASSERT_EQ(2, r);\n  lseek(fd, 0, SEEK_SET);\n  LineReader reader(fd);\n\n  const char *line;\n  unsigned int len;\n  ASSERT_TRUE(reader.GetNextLine(&line, &len));\n  ASSERT_EQ((unsigned int)1, len);\n  ASSERT_EQ('a', line[0]);\n  ASSERT_EQ('\\0', line[1]);\n  reader.PopLine(len);\n\n  ASSERT_FALSE(reader.GetNextLine(&line, &len));\n\n  close(fd);\n}\n\nTEST(LineReaderTest, OneLine) {\n  const int fd = TemporaryFile();\n  const int r = HANDLE_EINTR(write(fd, \"a\", 1));\n  ASSERT_EQ(1, r);\n  lseek(fd, 0, SEEK_SET);\n  LineReader reader(fd);\n\n  const char *line;\n  unsigned len;\n  ASSERT_TRUE(reader.GetNextLine(&line, &len));\n  ASSERT_EQ((unsigned)1, len);\n  ASSERT_EQ('a', line[0]);\n  ASSERT_EQ('\\0', line[1]);\n  reader.PopLine(len);\n\n  ASSERT_FALSE(reader.GetNextLine(&line, &len));\n\n  close(fd);\n}\n\nTEST(LineReaderTest, TwoLinesTerminated) {\n  const int fd = TemporaryFile();\n  const int r = HANDLE_EINTR(write(fd, \"a\\nb\\n\", 4));\n  ASSERT_EQ(4, r);\n  lseek(fd, 0, SEEK_SET);\n  LineReader reader(fd);\n\n  const char *line;\n  unsigned len;\n  ASSERT_TRUE(reader.GetNextLine(&line, &len));\n  ASSERT_EQ((unsigned)1, len);\n  ASSERT_EQ('a', line[0]);\n  ASSERT_EQ('\\0', line[1]);\n  reader.PopLine(len);\n\n  ASSERT_TRUE(reader.GetNextLine(&line, &len));\n  ASSERT_EQ((unsigned)1, len);\n  ASSERT_EQ('b', line[0]);\n  ASSERT_EQ('\\0', line[1]);\n  reader.PopLine(len);\n\n  ASSERT_FALSE(reader.GetNextLine(&line, &len));\n\n  close(fd);\n}\n\nTEST(LineReaderTest, TwoLines) {\n  const int fd = TemporaryFile();\n  const int r = HANDLE_EINTR(write(fd, \"a\\nb\", 3));\n  ASSERT_EQ(3, r);\n  lseek(fd, 0, SEEK_SET);\n  LineReader reader(fd);\n\n  const char *line;\n  unsigned len;\n  ASSERT_TRUE(reader.GetNextLine(&line, &len));\n  ASSERT_EQ((unsigned)1, len);\n  ASSERT_EQ('a', line[0]);\n  ASSERT_EQ('\\0', line[1]);\n  reader.PopLine(len);\n\n  ASSERT_TRUE(reader.GetNextLine(&line, &len));\n  ASSERT_EQ((unsigned)1, len);\n  ASSERT_EQ('b', line[0]);\n  ASSERT_EQ('\\0', line[1]);\n  reader.PopLine(len);\n\n  ASSERT_FALSE(reader.GetNextLine(&line, &len));\n\n  close(fd);\n}\n\nTEST(LineReaderTest, MaxLength) {\n  const int fd = TemporaryFile();\n  char l[LineReader::kMaxLineLen - 1];\n  memset(l, 'a', sizeof(l));\n  const int r = HANDLE_EINTR(write(fd, l, sizeof(l)));\n  ASSERT_EQ(sizeof(l), r);\n  lseek(fd, 0, SEEK_SET);\n  LineReader reader(fd);\n\n  const char *line;\n  unsigned len;\n  ASSERT_TRUE(reader.GetNextLine(&line, &len));\n  ASSERT_EQ(sizeof(l), len);\n  ASSERT_TRUE(memcmp(l, line, sizeof(l)) == 0);\n  ASSERT_EQ('\\0', line[len]);\n\n  close(fd);\n}\n\nTEST(LineReaderTest, TooLong) {\n  const int fd = TemporaryFile();\n  char l[LineReader::kMaxLineLen];\n  memset(l, 'a', sizeof(l));\n  const int r = HANDLE_EINTR(write(fd, l, sizeof(l)));\n  ASSERT_EQ(sizeof(l), r);\n  lseek(fd, 0, SEEK_SET);\n  LineReader reader(fd);\n\n  const char *line;\n  unsigned len;\n  ASSERT_FALSE(reader.GetNextLine(&line, &len));\n\n  close(fd);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/linux_core_dumper.cc",
    "content": "// Copyright (c) 2012, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// linux_core_dumper.cc: Implement google_breakpad::LinuxCoreDumper.\n// See linux_core_dumper.h for details.\n\n#include \"client/linux/minidump_writer/linux_core_dumper.h\"\n\n#include <asm/ptrace.h>\n#include <assert.h>\n#include <elf.h>\n#include <stdio.h>\n#include <string.h>\n#include <sys/procfs.h>\n\n#include \"common/linux/linux_libc_support.h\"\n\nnamespace google_breakpad {\n\nLinuxCoreDumper::LinuxCoreDumper(pid_t pid,\n                                 const char* core_path,\n                                 const char* procfs_path)\n    : LinuxDumper(pid),\n      core_path_(core_path),\n      procfs_path_(procfs_path),\n      thread_infos_(&allocator_, 8) {\n  assert(core_path_);\n}\n\nbool LinuxCoreDumper::BuildProcPath(char* path, pid_t pid,\n                                    const char* node) const {\n  if (!path || !node)\n    return false;\n\n  size_t node_len = my_strlen(node);\n  if (node_len == 0)\n    return false;\n\n  size_t procfs_path_len = my_strlen(procfs_path_);\n  size_t total_length = procfs_path_len + 1 + node_len;\n  if (total_length >= NAME_MAX)\n    return false;\n\n  memcpy(path, procfs_path_, procfs_path_len);\n  path[procfs_path_len] = '/';\n  memcpy(path + procfs_path_len + 1, node, node_len);\n  path[total_length] = '\\0';\n  return true;\n}\n\nvoid LinuxCoreDumper::CopyFromProcess(void* dest, pid_t child,\n                                      const void* src, size_t length) {\n  ElfCoreDump::Addr virtual_address = reinterpret_cast<ElfCoreDump::Addr>(src);\n  // TODO(benchan): Investigate whether the data to be copied could span\n  // across multiple segments in the core dump file. ElfCoreDump::CopyData\n  // and this method do not handle that case yet.\n  if (!core_.CopyData(dest, virtual_address, length)) {\n    // If the data segment is not found in the core dump, fill the result\n    // with marker characters.\n    memset(dest, 0xab, length);\n  }\n}\n\nbool LinuxCoreDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {\n  if (index >= thread_infos_.size())\n    return false;\n\n  *info = thread_infos_[index];\n  const uint8_t* stack_pointer;\n#if defined(__i386)\n  memcpy(&stack_pointer, &info->regs.esp, sizeof(info->regs.esp));\n#elif defined(__x86_64)\n  memcpy(&stack_pointer, &info->regs.rsp, sizeof(info->regs.rsp));\n#elif defined(__ARM_EABI__)\n  memcpy(&stack_pointer, &info->regs.ARM_sp, sizeof(info->regs.ARM_sp));\n#else\n#error \"This code hasn't been ported to your platform yet.\"\n#endif\n\n  return GetStackInfo(&info->stack, &info->stack_len,\n                      reinterpret_cast<uintptr_t>(stack_pointer));\n}\n\nbool LinuxCoreDumper::IsPostMortem() const {\n  return true;\n}\n\nbool LinuxCoreDumper::ThreadsSuspend() {\n  return true;\n}\n\nbool LinuxCoreDumper::ThreadsResume() {\n  return true;\n}\n\nbool LinuxCoreDumper::EnumerateThreads() {\n  if (!mapped_core_file_.Map(core_path_)) {\n    fprintf(stderr, \"Could not map core dump file into memory\\n\");\n    return false;\n  }\n\n  core_.SetContent(mapped_core_file_.content());\n  if (!core_.IsValid()) {\n    fprintf(stderr, \"Invalid core dump file\\n\");\n    return false;\n  }\n\n  ElfCoreDump::Note note = core_.GetFirstNote();\n  if (!note.IsValid()) {\n    fprintf(stderr, \"PT_NOTE section not found\\n\");\n    return false;\n  }\n\n  bool first_thread = true;\n  do {\n    ElfCoreDump::Word type = note.GetType();\n    MemoryRange name = note.GetName();\n    MemoryRange description = note.GetDescription();\n\n    if (type == 0 || name.IsEmpty() || description.IsEmpty()) {\n      fprintf(stderr, \"Could not found a valid PT_NOTE.\\n\");\n      return false;\n    }\n\n    // Based on write_note_info() in linux/kernel/fs/binfmt_elf.c, notes are\n    // ordered as follows (NT_PRXFPREG and NT_386_TLS are i386 specific):\n    //   Thread           Name          Type\n    //   -------------------------------------------------------------------\n    //   1st thread       CORE          NT_PRSTATUS\n    //   process-wide     CORE          NT_PRPSINFO\n    //   process-wide     CORE          NT_AUXV\n    //   1st thread       CORE          NT_FPREGSET\n    //   1st thread       LINUX         NT_PRXFPREG\n    //   1st thread       LINUX         NT_386_TLS\n    //\n    //   2nd thread       CORE          NT_PRSTATUS\n    //   2nd thread       CORE          NT_FPREGSET\n    //   2nd thread       LINUX         NT_PRXFPREG\n    //   2nd thread       LINUX         NT_386_TLS\n    //\n    //   3rd thread       CORE          NT_PRSTATUS\n    //   3rd thread       CORE          NT_FPREGSET\n    //   3rd thread       LINUX         NT_PRXFPREG\n    //   3rd thread       LINUX         NT_386_TLS\n    //\n    // The following code only works if notes are ordered as expected.\n    switch (type) {\n      case NT_PRSTATUS: {\n        if (description.length() != sizeof(elf_prstatus)) {\n          fprintf(stderr, \"Found NT_PRSTATUS descriptor of unexpected size\\n\");\n          return false;\n        }\n\n        const elf_prstatus* status =\n            reinterpret_cast<const elf_prstatus*>(description.data());\n        pid_t pid = status->pr_pid;\n        ThreadInfo info;\n        memset(&info, 0, sizeof(ThreadInfo));\n        info.tgid = status->pr_pgrp;\n        info.ppid = status->pr_ppid;\n        memcpy(&info.regs, status->pr_reg, sizeof(info.regs));\n        if (first_thread) {\n          crash_thread_ = pid;\n          crash_signal_ = status->pr_info.si_signo;\n        }\n        first_thread = false;\n        threads_.push_back(pid);\n        thread_infos_.push_back(info);\n        break;\n      }\n#if defined(__i386) || defined(__x86_64)\n      case NT_FPREGSET: {\n        if (thread_infos_.empty())\n          return false;\n\n        ThreadInfo* info = &thread_infos_.back();\n        if (description.length() != sizeof(info->fpregs)) {\n          fprintf(stderr, \"Found NT_FPREGSET descriptor of unexpected size\\n\");\n          return false;\n        }\n\n        memcpy(&info->fpregs, description.data(), sizeof(info->fpregs));\n        break;\n      }\n#endif\n#if defined(__i386)\n      case NT_PRXFPREG: {\n        if (thread_infos_.empty())\n          return false;\n\n        ThreadInfo* info = &thread_infos_.back();\n        if (description.length() != sizeof(info->fpxregs)) {\n          fprintf(stderr, \"Found NT_PRXFPREG descriptor of unexpected size\\n\");\n          return false;\n        }\n\n        memcpy(&info->fpxregs, description.data(), sizeof(info->fpxregs));\n        break;\n      }\n#endif\n    }\n    note = note.GetNextNote();\n  } while (note.IsValid());\n\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/linux_core_dumper.h",
    "content": "// Copyright (c) 2012, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// linux_core_dumper.h: Define the google_breakpad::LinuxCoreDumper\n// class, which is derived from google_breakpad::LinuxDumper to extract\n// information from a crashed process via its core dump and proc files.\n\n#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_CORE_DUMPER_H_\n#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_CORE_DUMPER_H_\n\n#include \"client/linux/minidump_writer/linux_dumper.h\"\n#include \"common/linux/elf_core_dump.h\"\n#include \"common/linux/memory_mapped_file.h\"\n\nnamespace google_breakpad {\n\nclass LinuxCoreDumper : public LinuxDumper {\n public:\n  // Constructs a dumper for extracting information of a given process\n  // with a process ID of |pid| via its core dump file at |core_path| and\n  // its proc files at |procfs_path|. If |procfs_path| is a copy of\n  // /proc/<pid>, it should contain the following files:\n  //     auxv, cmdline, environ, exe, maps, status\n  LinuxCoreDumper(pid_t pid, const char* core_path, const char* procfs_path);\n\n  // Implements LinuxDumper::BuildProcPath().\n  // Builds a proc path for a certain pid for a node (/proc/<pid>/<node>).\n  // |path| is a character array of at least NAME_MAX bytes to return the\n  // result.|node| is the final node without any slashes. Return true on\n  // success.\n  //\n  // As this dumper performs a post-mortem dump and makes use of a copy\n  // of the proc files of the crashed process, this derived method does\n  // not actually make use of |pid| and always returns a subpath of\n  // |procfs_path_| regardless of whether |pid| corresponds to the main\n  // process or a thread of the process, i.e. assuming both the main process\n  // and its threads have the following proc files with the same content:\n  //     auxv, cmdline, environ, exe, maps, status\n  virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const;\n\n  // Implements LinuxDumper::CopyFromProcess().\n  // Copies content of |length| bytes from a given process |child|,\n  // starting from |src|, into |dest|. This method extracts the content\n  // the core dump and fills |dest| with a sequence of marker bytes\n  // if the expected data is not found in the core dump.\n  virtual void CopyFromProcess(void* dest, pid_t child, const void* src,\n                               size_t length);\n\n  // Implements LinuxDumper::GetThreadInfoByIndex().\n  // Reads information about the |index|-th thread of |threads_|.\n  // Returns true on success. One must have called |ThreadsSuspend| first.\n  virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info);\n\n  // Implements LinuxDumper::IsPostMortem().\n  // Always returns true to indicate that this dumper performs a\n  // post-mortem dump of a crashed process via a core dump file.\n  virtual bool IsPostMortem() const;\n\n  // Implements LinuxDumper::ThreadsSuspend().\n  // As the dumper performs a post-mortem dump via a core dump file,\n  // there is no threads to suspend. This method does nothing and\n  // always returns true.\n  virtual bool ThreadsSuspend();\n\n  // Implements LinuxDumper::ThreadsResume().\n  // As the dumper performs a post-mortem dump via a core dump file,\n  // there is no threads to resume. This method does nothing and\n  // always returns true.\n  virtual bool ThreadsResume();\n\n protected:\n  // Implements LinuxDumper::EnumerateThreads().\n  // Enumerates all threads of the given process into |threads_|.\n  virtual bool EnumerateThreads();\n\n private:\n  // Path of the core dump file.\n  const char* core_path_;\n\n  // Path of the directory containing the proc files of the given process,\n  // which is usually a copy of /proc/<pid>.\n  const char* procfs_path_;\n\n  // Memory-mapped core dump file at |core_path_|.\n  MemoryMappedFile mapped_core_file_;\n\n  // Content of the core dump file.\n  ElfCoreDump core_;\n\n  // Thread info found in the core dump file.\n  wasteful_vector<ThreadInfo> thread_infos_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_LINUX_HANDLER_LINUX_CORE_DUMPER_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/linux_core_dumper_unittest.cc",
    "content": "// Copyright (c) 2012, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// linux_core_dumper_unittest.cc:\n// Unit tests for google_breakpad::LinuxCoreDumoer.\n\n#include \"breakpad_googletest_includes.h\"\n#include \"client/linux/minidump_writer/linux_core_dumper.h\"\n#include \"common/linux/tests/crash_generator.h\"\n\nusing std::string;\nusing namespace google_breakpad;\n\nTEST(LinuxCoreDumperTest, BuildProcPath) {\n  const pid_t pid = getpid();\n  const char procfs_path[] = \"/procfs_copy\";\n  LinuxCoreDumper dumper(getpid(), \"core_file\", procfs_path);\n\n  char maps_path[NAME_MAX] = \"\";\n  char maps_path_expected[NAME_MAX];\n  snprintf(maps_path_expected, sizeof(maps_path_expected),\n           \"%s/maps\", procfs_path);\n  EXPECT_TRUE(dumper.BuildProcPath(maps_path, pid, \"maps\"));\n  EXPECT_STREQ(maps_path_expected, maps_path);\n\n  EXPECT_FALSE(dumper.BuildProcPath(NULL, pid, \"maps\"));\n  EXPECT_FALSE(dumper.BuildProcPath(maps_path, pid, \"\"));\n  EXPECT_FALSE(dumper.BuildProcPath(maps_path, pid, NULL));\n\n  char long_node[NAME_MAX];\n  size_t long_node_len = NAME_MAX - strlen(procfs_path) - 1;\n  memset(long_node, 'a', long_node_len);\n  long_node[long_node_len] = '\\0';\n  EXPECT_FALSE(dumper.BuildProcPath(maps_path, pid, long_node));\n}\n\nTEST(LinuxCoreDumperTest, VerifyDumpWithMultipleThreads) {\n  CrashGenerator crash_generator;\n  if (!crash_generator.HasDefaultCorePattern()) {\n    fprintf(stderr, \"LinuxCoreDumperTest.VerifyDumpWithMultipleThreads test \"\n            \"is skipped due to non-default core pattern\\n\");\n    return;\n  }\n\n  const unsigned kNumOfThreads = 3;\n  const unsigned kCrashThread = 1;\n  const int kCrashSignal = SIGABRT;\n  pid_t child_pid;\n  // TODO(benchan): Revert to use ASSERT_TRUE once the flakiness in\n  // CrashGenerator is identified and fixed.\n  if (!crash_generator.CreateChildCrash(kNumOfThreads, kCrashThread,\n                                        kCrashSignal, &child_pid)) {\n    fprintf(stderr, \"LinuxCoreDumperTest.VerifyDumpWithMultipleThreads test \"\n            \"is skipped due to no core dump generated\\n\");\n    return;\n  }\n\n  pid_t pid = getpid();\n  const string core_file = crash_generator.GetCoreFilePath();\n  const string procfs_path = crash_generator.GetDirectoryOfProcFilesCopy();\n  LinuxCoreDumper dumper(child_pid, core_file.c_str(), procfs_path.c_str());\n  dumper.Init();\n\n  EXPECT_TRUE(dumper.IsPostMortem());\n\n  // These are no-ops and should always return true.\n  EXPECT_TRUE(dumper.ThreadsSuspend());\n  EXPECT_TRUE(dumper.ThreadsResume());\n\n  // LinuxCoreDumper cannot determine the crash address and thus it always\n  // sets the crash address to 0.\n  EXPECT_EQ(0, dumper.crash_address());\n  EXPECT_EQ(kCrashSignal, dumper.crash_signal());\n  EXPECT_EQ(crash_generator.GetThreadId(kCrashThread),\n            dumper.crash_thread());\n\n  EXPECT_EQ(kNumOfThreads, dumper.threads().size());\n  for (unsigned i = 0; i < kNumOfThreads; ++i) {\n    ThreadInfo info;\n    EXPECT_TRUE(dumper.GetThreadInfoByIndex(i, &info));\n    EXPECT_EQ(getpid(), info.ppid);\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/linux_dumper.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// linux_dumper.cc: Implement google_breakpad::LinuxDumper.\n// See linux_dumper.h for details.\n\n// This code deals with the mechanics of getting information about a crashed\n// process. Since this code may run in a compromised address space, the same\n// rules apply as detailed at the top of minidump_writer.h: no libc calls and\n// use the alternative allocator.\n\n#include \"client/linux/minidump_writer/linux_dumper.h\"\n\n#include <assert.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <stddef.h>\n#include <string.h>\n\n#include \"client/linux/minidump_writer/line_reader.h\"\n#include \"common/linux/file_id.h\"\n#include \"common/linux/linux_libc_support.h\"\n#include \"common/linux/memory_mapped_file.h\"\n#include \"common/linux/safe_readlink.h\"\n#include \"third_party/lss/linux_syscall_support.h\"\n\nstatic const char kMappedFileUnsafePrefix[] = \"/dev/\";\nstatic const char kDeletedSuffix[] = \" (deleted)\";\n\ninline static bool IsMappedFileOpenUnsafe(\n    const google_breakpad::MappingInfo& mapping) {\n  // It is unsafe to attempt to open a mapped file that lives under /dev,\n  // because the semantics of the open may be driver-specific so we'd risk\n  // hanging the crash dumper. And a file in /dev/ almost certainly has no\n  // ELF file identifier anyways.\n  return my_strncmp(mapping.name,\n                    kMappedFileUnsafePrefix,\n                    sizeof(kMappedFileUnsafePrefix) - 1) == 0;\n}\n\nnamespace google_breakpad {\n\nLinuxDumper::LinuxDumper(pid_t pid)\n    : pid_(pid),\n      crash_address_(0),\n      crash_signal_(0),\n      crash_thread_(0),\n      threads_(&allocator_, 8),\n      mappings_(&allocator_) {\n}\n\nLinuxDumper::~LinuxDumper() {\n}\n\nbool LinuxDumper::Init() {\n  return EnumerateThreads() && EnumerateMappings();\n}\n\nbool\nLinuxDumper::ElfFileIdentifierForMapping(const MappingInfo& mapping,\n                                         bool member,\n                                         unsigned int mapping_id,\n                                         uint8_t identifier[sizeof(MDGUID)])\n{\n  assert(!member || mapping_id < mappings_.size());\n  my_memset(identifier, 0, sizeof(MDGUID));\n  if (IsMappedFileOpenUnsafe(mapping))\n    return false;\n\n  // Special-case linux-gate because it's not a real file.\n  if (my_strcmp(mapping.name, kLinuxGateLibraryName) == 0) {\n    const uintptr_t kPageSize = getpagesize();\n    void* linux_gate = NULL;\n    if (pid_ == sys_getpid()) {\n      linux_gate = reinterpret_cast<void*>(mapping.start_addr);\n    } else {\n      linux_gate = allocator_.Alloc(kPageSize);\n      CopyFromProcess(linux_gate, pid_,\n                      reinterpret_cast<const void*>(mapping.start_addr),\n                      kPageSize);\n    }\n    return FileID::ElfFileIdentifierFromMappedFile(linux_gate, identifier);\n  }\n\n  char filename[NAME_MAX];\n  size_t filename_len = my_strlen(mapping.name);\n  assert(filename_len < NAME_MAX);\n  if (filename_len >= NAME_MAX)\n    return false;\n  memcpy(filename, mapping.name, filename_len);\n  filename[filename_len] = '\\0';\n  bool filename_modified = HandleDeletedFileInMapping(filename);\n\n  MemoryMappedFile mapped_file(filename);\n  if (!mapped_file.data())  // Should probably check if size >= ElfW(Ehdr)?\n    return false;\n\n  bool success =\n      FileID::ElfFileIdentifierFromMappedFile(mapped_file.data(), identifier);\n  if (success && member && filename_modified) {\n    mappings_[mapping_id]->name[filename_len -\n                                sizeof(kDeletedSuffix) + 1] = '\\0';\n  }\n\n  return success;\n}\n\nvoid*\nLinuxDumper::FindBeginningOfLinuxGateSharedLibrary(pid_t pid) const {\n  char auxv_path[NAME_MAX];\n  if (!BuildProcPath(auxv_path, pid, \"auxv\"))\n    return NULL;\n\n  // Find the AT_SYSINFO_EHDR entry for linux-gate.so\n  // See http://www.trilithium.com/johan/2005/08/linux-gate/ for more\n  // information.\n  int fd = sys_open(auxv_path, O_RDONLY, 0);\n  if (fd < 0) {\n    return NULL;\n  }\n\n  elf_aux_entry one_aux_entry;\n  while (sys_read(fd,\n                  &one_aux_entry,\n                  sizeof(elf_aux_entry)) == sizeof(elf_aux_entry) &&\n         one_aux_entry.a_type != AT_NULL) {\n    if (one_aux_entry.a_type == AT_SYSINFO_EHDR) {\n      close(fd);\n      return reinterpret_cast<void*>(one_aux_entry.a_un.a_val);\n    }\n  }\n  close(fd);\n  return NULL;\n}\n\nvoid*\nLinuxDumper::FindEntryPoint(pid_t pid) const {\n  char auxv_path[NAME_MAX];\n  if (!BuildProcPath(auxv_path, pid, \"auxv\"))\n    return NULL;\n\n  int fd = sys_open(auxv_path, O_RDONLY, 0);\n  if (fd < 0) {\n    return NULL;\n  }\n\n  // Find the AT_ENTRY entry\n  elf_aux_entry one_aux_entry;\n  while (sys_read(fd,\n                  &one_aux_entry,\n                  sizeof(elf_aux_entry)) == sizeof(elf_aux_entry) &&\n         one_aux_entry.a_type != AT_NULL) {\n    if (one_aux_entry.a_type == AT_ENTRY) {\n      close(fd);\n      return reinterpret_cast<void*>(one_aux_entry.a_un.a_val);\n    }\n  }\n  close(fd);\n  return NULL;\n}\n\nbool LinuxDumper::EnumerateMappings() {\n  char maps_path[NAME_MAX];\n  if (!BuildProcPath(maps_path, pid_, \"maps\"))\n    return false;\n\n  // linux_gate_loc is the beginning of the kernel's mapping of\n  // linux-gate.so in the process.  It doesn't actually show up in the\n  // maps list as a filename, so we use the aux vector to find it's\n  // load location and special case it's entry when creating the list\n  // of mappings.\n  const void* linux_gate_loc;\n  linux_gate_loc = FindBeginningOfLinuxGateSharedLibrary(pid_);\n  // Although the initial executable is usually the first mapping, it's not\n  // guaranteed (see http://crosbug.com/25355); therefore, try to use the\n  // actual entry point to find the mapping.\n  const void* entry_point_loc = FindEntryPoint(pid_);\n\n  const int fd = sys_open(maps_path, O_RDONLY, 0);\n  if (fd < 0)\n    return false;\n  LineReader* const line_reader = new(allocator_) LineReader(fd);\n\n  const char* line;\n  unsigned line_len;\n  while (line_reader->GetNextLine(&line, &line_len)) {\n    uintptr_t start_addr, end_addr, offset;\n\n    const char* i1 = my_read_hex_ptr(&start_addr, line);\n    if (*i1 == '-') {\n      const char* i2 = my_read_hex_ptr(&end_addr, i1 + 1);\n      if (*i2 == ' ') {\n        const char* i3 = my_read_hex_ptr(&offset, i2 + 6 /* skip ' rwxp ' */);\n        if (*i3 == ' ') {\n          const char* name = NULL;\n          // Only copy name if the name is a valid path name, or if\n          // it's the VDSO image.\n          if (((name = my_strchr(line, '/')) == NULL) &&\n              linux_gate_loc &&\n              reinterpret_cast<void*>(start_addr) == linux_gate_loc) {\n            name = kLinuxGateLibraryName;\n            offset = 0;\n          }\n          // Merge adjacent mappings with the same name into one module,\n          // assuming they're a single library mapped by the dynamic linker\n          if (name && !mappings_.empty()) {\n            MappingInfo* module = mappings_.back();\n            if ((start_addr == module->start_addr + module->size) &&\n                (my_strlen(name) == my_strlen(module->name)) &&\n                (my_strncmp(name, module->name, my_strlen(name)) == 0)) {\n              module->size = end_addr - module->start_addr;\n              line_reader->PopLine(line_len);\n              continue;\n            }\n          }\n          MappingInfo* const module = new(allocator_) MappingInfo;\n          memset(module, 0, sizeof(MappingInfo));\n          module->start_addr = start_addr;\n          module->size = end_addr - start_addr;\n          module->offset = offset;\n          if (name != NULL) {\n            const unsigned l = my_strlen(name);\n            if (l < sizeof(module->name))\n              memcpy(module->name, name, l);\n          }\n          // If this is the entry-point mapping, and it's not already the\n          // first one, then we need to make it be first.  This is because\n          // the minidump format assumes the first module is the one that\n          // corresponds to the main executable (as codified in\n          // processor/minidump.cc:MinidumpModuleList::GetMainModule()).\n          if (entry_point_loc &&\n              (entry_point_loc >=\n                  reinterpret_cast<void*>(module->start_addr)) &&\n              (entry_point_loc <\n                  reinterpret_cast<void*>(module->start_addr+module->size)) &&\n              !mappings_.empty()) {\n            // push the module onto the front of the list.\n            mappings_.resize(mappings_.size() + 1);\n            for (size_t idx = mappings_.size() - 1; idx > 0; idx--)\n              mappings_[idx] = mappings_[idx - 1];\n            mappings_[0] = module;\n          } else {\n            mappings_.push_back(module);\n          }\n        }\n      }\n    }\n    line_reader->PopLine(line_len);\n  }\n\n  sys_close(fd);\n\n  return !mappings_.empty();\n}\n\n// Get information about the stack, given the stack pointer. We don't try to\n// walk the stack since we might not have all the information needed to do\n// unwind. So we just grab, up to, 32k of stack.\nbool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len,\n                               uintptr_t int_stack_pointer) {\n  // Move the stack pointer to the bottom of the page that it's in.\n  const uintptr_t page_size = getpagesize();\n\n  uint8_t* const stack_pointer =\n      reinterpret_cast<uint8_t*>(int_stack_pointer & ~(page_size - 1));\n\n  // The number of bytes of stack which we try to capture.\n  static const ptrdiff_t kStackToCapture = 32 * 1024;\n\n  const MappingInfo* mapping = FindMapping(stack_pointer);\n  if (!mapping)\n    return false;\n  const ptrdiff_t offset = stack_pointer - (uint8_t*) mapping->start_addr;\n  const ptrdiff_t distance_to_end =\n      static_cast<ptrdiff_t>(mapping->size) - offset;\n  *stack_len = distance_to_end > kStackToCapture ?\n      kStackToCapture : distance_to_end;\n  *stack = stack_pointer;\n  return true;\n}\n\n// Find the mapping which the given memory address falls in.\nconst MappingInfo* LinuxDumper::FindMapping(const void* address) const {\n  const uintptr_t addr = (uintptr_t) address;\n\n  for (size_t i = 0; i < mappings_.size(); ++i) {\n    const uintptr_t start = static_cast<uintptr_t>(mappings_[i]->start_addr);\n    if (addr >= start && addr - start < mappings_[i]->size)\n      return mappings_[i];\n  }\n\n  return NULL;\n}\n\nbool LinuxDumper::HandleDeletedFileInMapping(char* path) const {\n  static const size_t kDeletedSuffixLen = sizeof(kDeletedSuffix) - 1;\n\n  // Check for ' (deleted)' in |path|.\n  // |path| has to be at least as long as \"/x (deleted)\".\n  const size_t path_len = my_strlen(path);\n  if (path_len < kDeletedSuffixLen + 2)\n    return false;\n  if (my_strncmp(path + path_len - kDeletedSuffixLen, kDeletedSuffix,\n                 kDeletedSuffixLen) != 0) {\n    return false;\n  }\n\n  // Check |path| against the /proc/pid/exe 'symlink'.\n  char exe_link[NAME_MAX];\n  char new_path[NAME_MAX];\n  if (!BuildProcPath(exe_link, pid_, \"exe\"))\n    return false;\n  if (!SafeReadLink(exe_link, new_path))\n    return false;\n  if (my_strcmp(path, new_path) != 0)\n    return false;\n\n  // Check to see if someone actually named their executable 'foo (deleted)'.\n  struct kernel_stat exe_stat;\n  struct kernel_stat new_path_stat;\n  if (sys_stat(exe_link, &exe_stat) == 0 &&\n      sys_stat(new_path, &new_path_stat) == 0 &&\n      exe_stat.st_dev == new_path_stat.st_dev &&\n      exe_stat.st_ino == new_path_stat.st_ino) {\n    return false;\n  }\n\n  memcpy(path, exe_link, NAME_MAX);\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/linux_dumper.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// linux_dumper.h: Define the google_breakpad::LinuxDumper class, which\n// is a base class for extracting information of a crashed process. It\n// was originally a complete implementation using the ptrace API, but\n// has been refactored to allow derived implementations supporting both\n// ptrace and core dump. A portion of the original implementation is now\n// in google_breakpad::LinuxPtraceDumper (see linux_ptrace_dumper.h for\n// details).\n\n#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_\n#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_\n\n#include <elf.h>\n#include <linux/limits.h>\n#include <stdint.h>\n#include <sys/types.h>\n#if !defined(__ANDROID__)\n#include <sys/user.h>\n#endif\n\n#include \"common/memory.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n\nnamespace google_breakpad {\n\n#if defined(__i386) || defined(__x86_64)\ntypedef typeof(((struct user*) 0)->u_debugreg[0]) debugreg_t;\n#endif\n\n// Typedef for our parsing of the auxv variables in /proc/pid/auxv.\n#if defined(__i386) || defined(__ARM_EABI__)\n#if !defined(__ANDROID__)\ntypedef Elf32_auxv_t elf_aux_entry;\n#else\n// Android is missing this structure definition\ntypedef struct\n{\n  uint32_t a_type;              /* Entry type */\n  union\n    {\n      uint32_t a_val;           /* Integer value */\n    } a_un;\n} elf_aux_entry;\n\n#if !defined(AT_SYSINFO_EHDR)\n#define AT_SYSINFO_EHDR 33\n#endif\n#endif  // __ANDROID__\n#elif defined(__x86_64)\ntypedef Elf64_auxv_t elf_aux_entry;\n#endif\n// When we find the VDSO mapping in the process's address space, this\n// is the name we use for it when writing it to the minidump.\n// This should always be less than NAME_MAX!\nconst char kLinuxGateLibraryName[] = \"linux-gate.so\";\n\n// We produce one of these structures for each thread in the crashed process.\nstruct ThreadInfo {\n  pid_t tgid;   // thread group id\n  pid_t ppid;   // parent process\n\n  // Even on platforms where the stack grows down, the following will point to\n  // the smallest address in the stack.\n  const void* stack;  // pointer to the stack area\n  size_t stack_len;  // length of the stack to copy\n\n\n#if defined(__i386) || defined(__x86_64)\n  user_regs_struct regs;\n  user_fpregs_struct fpregs;\n  static const unsigned kNumDebugRegisters = 8;\n  debugreg_t dregs[8];\n#if defined(__i386)\n  user_fpxregs_struct fpxregs;\n#endif  // defined(__i386)\n\n#elif defined(__ARM_EABI__)\n  // Mimicking how strace does this(see syscall.c, search for GETREGS)\n#if defined(__ANDROID__)\n  struct pt_regs regs;\n#else\n  struct user_regs regs;\n  struct user_fpregs fpregs;\n#endif  // __ANDROID__\n#endif\n};\n\n// One of these is produced for each mapping in the process (i.e. line in\n// /proc/$x/maps).\nstruct MappingInfo {\n  uintptr_t start_addr;\n  size_t size;\n  size_t offset;  // offset into the backed file.\n  char name[NAME_MAX];\n};\n\nclass LinuxDumper {\n public:\n  explicit LinuxDumper(pid_t pid);\n\n  virtual ~LinuxDumper();\n\n  // Parse the data for |threads| and |mappings|.\n  virtual bool Init();\n\n  // Return true if the dumper performs a post-mortem dump.\n  virtual bool IsPostMortem() const = 0;\n\n  // Suspend/resume all threads in the given process.\n  virtual bool ThreadsSuspend() = 0;\n  virtual bool ThreadsResume() = 0;\n\n  // Read information about the |index|-th thread of |threads_|.\n  // Returns true on success. One must have called |ThreadsSuspend| first.\n  virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info) = 0;\n\n  // These are only valid after a call to |Init|.\n  const wasteful_vector<pid_t> &threads() { return threads_; }\n  const wasteful_vector<MappingInfo*> &mappings() { return mappings_; }\n  const MappingInfo* FindMapping(const void* address) const;\n\n  // Find a block of memory to take as the stack given the top of stack pointer.\n  //   stack: (output) the lowest address in the memory area\n  //   stack_len: (output) the length of the memory area\n  //   stack_top: the current top of the stack\n  bool GetStackInfo(const void** stack, size_t* stack_len, uintptr_t stack_top);\n\n  PageAllocator* allocator() { return &allocator_; }\n\n  // Copy content of |length| bytes from a given process |child|,\n  // starting from |src|, into |dest|.\n  virtual void CopyFromProcess(void* dest, pid_t child, const void* src,\n                               size_t length) = 0;\n\n  // Builds a proc path for a certain pid for a node (/proc/<pid>/<node>).\n  // |path| is a character array of at least NAME_MAX bytes to return the\n  // result.|node| is the final node without any slashes. Returns true on\n  // success.\n  virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const = 0;\n\n  // Generate a File ID from the .text section of a mapped entry.\n  // If not a member, mapping_id is ignored.\n  bool ElfFileIdentifierForMapping(const MappingInfo& mapping,\n                                   bool member,\n                                   unsigned int mapping_id,\n                                   uint8_t identifier[sizeof(MDGUID)]);\n\n  // Utility method to find the location of where the kernel has\n  // mapped linux-gate.so in memory(shows up in /proc/pid/maps as\n  // [vdso], but we can't guarantee that it's the only virtual dynamic\n  // shared object.  Parsing the auxilary vector for AT_SYSINFO_EHDR\n  // is the safest way to go.)\n  void* FindBeginningOfLinuxGateSharedLibrary(pid_t pid) const;\n  // Utility method to find the entry point location.\n  void* FindEntryPoint(pid_t pid) const;\n\n  uintptr_t crash_address() const { return crash_address_; }\n  void set_crash_address(uintptr_t crash_address) {\n    crash_address_ = crash_address;\n  }\n\n  int crash_signal() const { return crash_signal_; }\n  void set_crash_signal(int crash_signal) { crash_signal_ = crash_signal; }\n\n  pid_t crash_thread() const { return crash_thread_; }\n  void set_crash_thread(pid_t crash_thread) { crash_thread_ = crash_thread; }\n\n protected:\n  virtual bool EnumerateMappings();\n\n  virtual bool EnumerateThreads() = 0;\n\n  // For the case where a running program has been deleted, it'll show up in\n  // /proc/pid/maps as \"/path/to/program (deleted)\". If this is the case, then\n  // see if '/path/to/program (deleted)' matches /proc/pid/exe and return\n  // /proc/pid/exe in |path| so ELF identifier generation works correctly. This\n  // also checks to see if '/path/to/program (deleted)' exists, so it does not\n  // get fooled by a poorly named binary.\n  // For programs that don't end with ' (deleted)', this is a no-op.\n  // This assumes |path| is a buffer with length NAME_MAX.\n  // Returns true if |path| is modified.\n  bool HandleDeletedFileInMapping(char* path) const;\n\n   // ID of the crashed process.\n  const pid_t pid_;\n\n  // Virtual address at which the process crashed.\n  uintptr_t crash_address_;\n\n  // Signal that terminated the crashed process.\n  int crash_signal_;\n\n  // ID of the crashed thread.\n  pid_t crash_thread_;\n\n  mutable PageAllocator allocator_;\n\n  // IDs of all the threads.\n  wasteful_vector<pid_t> threads_;\n\n  // Info from /proc/<pid>/maps.\n  wasteful_vector<MappingInfo*> mappings_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_LINUX_HANDLER_LINUX_DUMPER_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/linux_dumper_unittest_helper.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Helper program for the linux_dumper class, which creates a bunch of\n// threads. The first word of each thread's stack is set to the thread\n// id.\n\n#include <pthread.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/syscall.h>\n#include <unistd.h>\n\n#include \"third_party/lss/linux_syscall_support.h\"\n\n#if defined(__ARM_EABI__)\n#define TID_PTR_REGISTER \"r3\"\n#elif defined(__i386)\n#define TID_PTR_REGISTER \"ecx\"\n#elif defined(__x86_64)\n#define TID_PTR_REGISTER \"rcx\"\n#else\n#error This test has not been ported to this platform.\n#endif\n\nvoid *thread_function(void *data) {\n  int pipefd = *static_cast<int *>(data);\n  volatile pid_t thread_id = syscall(__NR_gettid);\n  // Signal parent that a thread has started.\n  uint8_t byte = 1;\n  if (write(pipefd, &byte, sizeof(byte)) != sizeof(byte)) {\n    perror(\"ERROR: parent notification failed\");\n    return NULL;\n  }\n  register volatile pid_t *thread_id_ptr asm(TID_PTR_REGISTER) = &thread_id;\n  while (true)\n    asm volatile (\"\" : : \"r\" (thread_id_ptr));\n  return NULL;\n}\n\nint main(int argc, char *argv[]) {\n  if (argc < 3) {\n    fprintf(stderr,\n            \"usage: linux_dumper_unittest_helper <pipe fd> <# of threads>\\n\");\n    return 1;\n  }\n  int pipefd = atoi(argv[1]);\n  int num_threads = atoi(argv[2]);\n  if (num_threads < 1) {\n    fprintf(stderr, \"ERROR: number of threads is 0\");\n    return 1;\n  }\n  pthread_t threads[num_threads];\n  pthread_attr_t thread_attributes;\n  pthread_attr_init(&thread_attributes);\n  pthread_attr_setdetachstate(&thread_attributes, PTHREAD_CREATE_DETACHED);\n  for (int i = 1; i < num_threads; i++) {\n    pthread_create(&threads[i], &thread_attributes, &thread_function, &pipefd);\n  }\n  thread_function(&pipefd);\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper.cc",
    "content": "// Copyright (c) 2012, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// linux_ptrace_dumper.cc: Implement google_breakpad::LinuxPtraceDumper.\n// See linux_ptrace_dumper.h for detals.\n// This class was originally splitted from google_breakpad::LinuxDumper.\n\n// This code deals with the mechanics of getting information about a crashed\n// process. Since this code may run in a compromised address space, the same\n// rules apply as detailed at the top of minidump_writer.h: no libc calls and\n// use the alternative allocator.\n\n#include \"client/linux/minidump_writer/linux_ptrace_dumper.h\"\n\n#include <asm/ptrace.h>\n#include <assert.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <stddef.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/ptrace.h>\n#include <sys/wait.h>\n\n#include \"client/linux/minidump_writer/directory_reader.h\"\n#include \"client/linux/minidump_writer/line_reader.h\"\n#include \"common/linux/linux_libc_support.h\"\n#include \"third_party/lss/linux_syscall_support.h\"\n\n// Suspends a thread by attaching to it.\nstatic bool SuspendThread(pid_t pid) {\n  // This may fail if the thread has just died or debugged.\n  errno = 0;\n  if (sys_ptrace(PTRACE_ATTACH, pid, NULL, NULL) != 0 &&\n      errno != 0) {\n    return false;\n  }\n  while (sys_waitpid(pid, NULL, __WALL) < 0) {\n    if (errno != EINTR) {\n      sys_ptrace(PTRACE_DETACH, pid, NULL, NULL);\n      return false;\n    }\n  }\n#if defined(__i386) || defined(__x86_64)\n  // On x86, the stack pointer is NULL or -1, when executing trusted code in\n  // the seccomp sandbox. Not only does this cause difficulties down the line\n  // when trying to dump the thread's stack, it also results in the minidumps\n  // containing information about the trusted threads. This information is\n  // generally completely meaningless and just pollutes the minidumps.\n  // We thus test the stack pointer and exclude any threads that are part of\n  // the seccomp sandbox's trusted code.\n  user_regs_struct regs;\n  if (sys_ptrace(PTRACE_GETREGS, pid, NULL, &regs) == -1 ||\n#if defined(__i386)\n      !regs.esp\n#elif defined(__x86_64)\n      !regs.rsp\n#endif\n      ) {\n    sys_ptrace(PTRACE_DETACH, pid, NULL, NULL);\n    return false;\n  }\n#endif\n  return true;\n}\n\n// Resumes a thread by detaching from it.\nstatic bool ResumeThread(pid_t pid) {\n  return sys_ptrace(PTRACE_DETACH, pid, NULL, NULL) >= 0;\n}\n\nnamespace google_breakpad {\n\nLinuxPtraceDumper::LinuxPtraceDumper(pid_t pid)\n    : LinuxDumper(pid),\n      threads_suspended_(false) {\n}\n\nbool LinuxPtraceDumper::BuildProcPath(char* path, pid_t pid,\n                                      const char* node) const {\n  if (!path || !node || pid <= 0)\n    return false;\n\n  size_t node_len = my_strlen(node);\n  if (node_len == 0)\n    return false;\n\n  const unsigned pid_len = my_int_len(pid);\n  const size_t total_length = 6 + pid_len + 1 + node_len;\n  if (total_length >= NAME_MAX)\n    return false;\n\n  memcpy(path, \"/proc/\", 6);\n  my_itos(path + 6, pid, pid_len);\n  path[6 + pid_len] = '/';\n  memcpy(path + 6 + pid_len + 1, node, node_len);\n  path[total_length] = '\\0';\n  return true;\n}\n\nvoid LinuxPtraceDumper::CopyFromProcess(void* dest, pid_t child,\n                                        const void* src, size_t length) {\n  unsigned long tmp = 55;\n  size_t done = 0;\n  static const size_t word_size = sizeof(tmp);\n  uint8_t* const local = (uint8_t*) dest;\n  uint8_t* const remote = (uint8_t*) src;\n\n  while (done < length) {\n    const size_t l = (length - done > word_size) ? word_size : (length - done);\n    if (sys_ptrace(PTRACE_PEEKDATA, child, remote + done, &tmp) == -1) {\n      tmp = 0;\n    }\n    memcpy(local + done, &tmp, l);\n    done += l;\n  }\n}\n\n// Read thread info from /proc/$pid/status.\n// Fill out the |tgid|, |ppid| and |pid| members of |info|. If unavailable,\n// these members are set to -1. Returns true iff all three members are\n// available.\nbool LinuxPtraceDumper::GetThreadInfoByIndex(size_t index, ThreadInfo* info) {\n  if (index >= threads_.size())\n    return false;\n\n  pid_t tid = threads_[index];\n\n  assert(info != NULL);\n  char status_path[NAME_MAX];\n  if (!BuildProcPath(status_path, tid, \"status\"))\n    return false;\n\n  const int fd = sys_open(status_path, O_RDONLY, 0);\n  if (fd < 0)\n    return false;\n\n  LineReader* const line_reader = new(allocator_) LineReader(fd);\n  const char* line;\n  unsigned line_len;\n\n  info->ppid = info->tgid = -1;\n\n  while (line_reader->GetNextLine(&line, &line_len)) {\n    if (my_strncmp(\"Tgid:\\t\", line, 6) == 0) {\n      my_strtoui(&info->tgid, line + 6);\n    } else if (my_strncmp(\"PPid:\\t\", line, 6) == 0) {\n      my_strtoui(&info->ppid, line + 6);\n    }\n\n    line_reader->PopLine(line_len);\n  }\n  sys_close(fd);\n\n  if (info->ppid == -1 || info->tgid == -1)\n    return false;\n\n  if (sys_ptrace(PTRACE_GETREGS, tid, NULL, &info->regs) == -1) {\n    return false;\n  }\n\n#if !defined(__ANDROID__)\n  if (sys_ptrace(PTRACE_GETFPREGS, tid, NULL, &info->fpregs) == -1) {\n    return false;\n  }\n#endif\n\n#if defined(__i386)\n  if (sys_ptrace(PTRACE_GETFPXREGS, tid, NULL, &info->fpxregs) == -1)\n    return false;\n#endif\n\n#if defined(__i386) || defined(__x86_64)\n  for (unsigned i = 0; i < ThreadInfo::kNumDebugRegisters; ++i) {\n    if (sys_ptrace(\n        PTRACE_PEEKUSER, tid,\n        reinterpret_cast<void*> (offsetof(struct user,\n                                          u_debugreg[0]) + i *\n                                 sizeof(debugreg_t)),\n        &info->dregs[i]) == -1) {\n      return false;\n    }\n  }\n#endif\n\n  const uint8_t* stack_pointer;\n#if defined(__i386)\n  memcpy(&stack_pointer, &info->regs.esp, sizeof(info->regs.esp));\n#elif defined(__x86_64)\n  memcpy(&stack_pointer, &info->regs.rsp, sizeof(info->regs.rsp));\n#elif defined(__ARM_EABI__)\n  memcpy(&stack_pointer, &info->regs.ARM_sp, sizeof(info->regs.ARM_sp));\n#else\n#error \"This code hasn't been ported to your platform yet.\"\n#endif\n\n  return GetStackInfo(&info->stack, &info->stack_len,\n                      (uintptr_t) stack_pointer);\n}\n\nbool LinuxPtraceDumper::IsPostMortem() const {\n  return false;\n}\n\nbool LinuxPtraceDumper::ThreadsSuspend() {\n  if (threads_suspended_)\n    return true;\n  for (size_t i = 0; i < threads_.size(); ++i) {\n    if (!SuspendThread(threads_[i])) {\n      // If the thread either disappeared before we could attach to it, or if\n      // it was part of the seccomp sandbox's trusted code, it is OK to\n      // silently drop it from the minidump.\n      memmove(&threads_[i], &threads_[i+1],\n              (threads_.size() - i - 1) * sizeof(threads_[i]));\n      threads_.resize(threads_.size() - 1);\n      --i;\n    }\n  }\n  threads_suspended_ = true;\n  return threads_.size() > 0;\n}\n\nbool LinuxPtraceDumper::ThreadsResume() {\n  if (!threads_suspended_)\n    return false;\n  bool good = true;\n  for (size_t i = 0; i < threads_.size(); ++i)\n    good &= ResumeThread(threads_[i]);\n  threads_suspended_ = false;\n  return good;\n}\n\n// Parse /proc/$pid/task to list all the threads of the process identified by\n// pid.\nbool LinuxPtraceDumper::EnumerateThreads() {\n  char task_path[NAME_MAX];\n  if (!BuildProcPath(task_path, pid_, \"task\"))\n    return false;\n\n  const int fd = sys_open(task_path, O_RDONLY | O_DIRECTORY, 0);\n  if (fd < 0)\n    return false;\n  DirectoryReader* dir_reader = new(allocator_) DirectoryReader(fd);\n\n  // The directory may contain duplicate entries which we filter by assuming\n  // that they are consecutive.\n  int last_tid = -1;\n  const char* dent_name;\n  while (dir_reader->GetNextEntry(&dent_name)) {\n    if (my_strcmp(dent_name, \".\") &&\n        my_strcmp(dent_name, \"..\")) {\n      int tid = 0;\n      if (my_strtoui(&tid, dent_name) &&\n          last_tid != tid) {\n        last_tid = tid;\n        threads_.push_back(tid);\n      }\n    }\n    dir_reader->PopEntry();\n  }\n\n  sys_close(fd);\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper.h",
    "content": "// Copyright (c) 2012, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// linux_ptrace_dumper.h: Define the google_breakpad::LinuxPtraceDumper\n// class, which is derived from google_breakpad::LinuxDumper to extract\n// information from a crashed process via ptrace.\n// This class was originally splitted from google_breakpad::LinuxDumper.\n\n#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_PTRACE_DUMPER_H_\n#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_PTRACE_DUMPER_H_\n\n#include \"client/linux/minidump_writer/linux_dumper.h\"\n\nnamespace google_breakpad {\n\nclass LinuxPtraceDumper : public LinuxDumper {\n public:\n  // Constructs a dumper for extracting information of a given process\n  // with a process ID of |pid|.\n  explicit LinuxPtraceDumper(pid_t pid);\n\n  // Implements LinuxDumper::BuildProcPath().\n  // Builds a proc path for a certain pid for a node (/proc/<pid>/<node>).\n  // |path| is a character array of at least NAME_MAX bytes to return the\n  // result. |node| is the final node without any slashes. Returns true on\n  // success.\n  virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const;\n\n  // Implements LinuxDumper::CopyFromProcess().\n  // Copies content of |length| bytes from a given process |child|,\n  // starting from |src|, into |dest|. This method uses ptrace to extract\n  // the content from the target process.\n  virtual void CopyFromProcess(void* dest, pid_t child, const void* src,\n                               size_t length);\n\n  // Implements LinuxDumper::GetThreadInfoByIndex().\n  // Reads information about the |index|-th thread of |threads_|.\n  // Returns true on success. One must have called |ThreadsSuspend| first.\n  virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info);\n\n  // Implements LinuxDumper::IsPostMortem().\n  // Always returns false to indicate this dumper performs a dump of\n  // a crashed process via ptrace.\n  virtual bool IsPostMortem() const;\n\n  // Implements LinuxDumper::ThreadsSuspend().\n  // Suspends all threads in the given process. Returns true on success.\n  virtual bool ThreadsSuspend();\n\n  // Implements LinuxDumper::ThreadsResume().\n  // Resumes all threads in the given process. Returns true on success.\n  virtual bool ThreadsResume();\n\n protected:\n  // Implements LinuxDumper::EnumerateThreads().\n  // Enumerates all threads of the given process into |threads_|.\n  virtual bool EnumerateThreads();\n\n private:\n  // Set to true if all threads of the crashed process are suspended.\n  bool threads_suspended_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_LINUX_HANDLER_LINUX_PTRACE_DUMPER_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// linux_ptrace_dumper_unittest.cc:\n// Unit tests for google_breakpad::LinuxPtraceDumoer.\n//\n// This file was renamed from linux_dumper_unittest.cc and modified due\n// to LinuxDumper being splitted into two classes.\n\n#include <fcntl.h>\n#include <limits.h>\n#include <unistd.h>\n#include <signal.h>\n#include <stdint.h>\n#include <sys/mman.h>\n#include <sys/poll.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n\n#include <string>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"client/linux/minidump_writer/linux_ptrace_dumper.h\"\n#include \"common/linux/eintr_wrapper.h\"\n#include \"common/linux/file_id.h\"\n#include \"common/linux/safe_readlink.h\"\n#include \"common/memory.h\"\n\nusing std::string;\nusing namespace google_breakpad;\n\nnamespace {\n\ntypedef testing::Test LinuxPtraceDumperTest;\n\nstring GetHelperBinary() {\n  // Locate helper binary next to the current binary.\n  char self_path[PATH_MAX];\n  if (!SafeReadLink(\"/proc/self/exe\", self_path)) {\n    return \"\";\n  }\n  string helper_path(self_path);\n  size_t pos = helper_path.rfind('/');\n  if (pos == string::npos) {\n    return \"\";\n  }\n  helper_path.erase(pos + 1);\n  helper_path += \"linux_dumper_unittest_helper\";\n\n  return helper_path;\n}\n\n}  // namespace\n\nTEST(LinuxPtraceDumperTest, Setup) {\n  LinuxPtraceDumper dumper(getpid());\n}\n\nTEST(LinuxPtraceDumperTest, FindMappings) {\n  LinuxPtraceDumper dumper(getpid());\n  ASSERT_TRUE(dumper.Init());\n\n  ASSERT_TRUE(dumper.FindMapping(reinterpret_cast<void*>(getpid)));\n  ASSERT_TRUE(dumper.FindMapping(reinterpret_cast<void*>(printf)));\n  ASSERT_FALSE(dumper.FindMapping(NULL));\n}\n\nTEST(LinuxPtraceDumperTest, ThreadList) {\n  LinuxPtraceDumper dumper(getpid());\n  ASSERT_TRUE(dumper.Init());\n\n  ASSERT_GE(dumper.threads().size(), (size_t)1);\n  bool found = false;\n  for (size_t i = 0; i < dumper.threads().size(); ++i) {\n    if (dumper.threads()[i] == getpid()) {\n      found = true;\n      break;\n    }\n  }\n}\n\n// Helper stack class to close a file descriptor and unmap\n// a mmap'ed mapping.\nclass StackHelper {\n public:\n  StackHelper(int fd, char* mapping, size_t size)\n    : fd_(fd), mapping_(mapping), size_(size) {}\n  ~StackHelper() {\n    munmap(mapping_, size_);\n    close(fd_);\n  }\n\n private:\n  int fd_;\n  char* mapping_;\n  size_t size_;\n};\n\nTEST(LinuxPtraceDumperTest, MergedMappings) {\n  string helper_path(GetHelperBinary());\n  if (helper_path.empty()) {\n    FAIL() << \"Couldn't find helper binary\";\n    exit(1);\n  }\n\n  // mmap two segments out of the helper binary, one\n  // enclosed in the other, but with different protections.\n  const size_t kPageSize = sysconf(_SC_PAGESIZE);\n  const size_t kMappingSize = 3 * kPageSize;\n  int fd = open(helper_path.c_str(), O_RDONLY);\n  ASSERT_NE(-1, fd);\n  char* mapping =\n    reinterpret_cast<char*>(mmap(NULL,\n                                 kMappingSize,\n                                 PROT_READ,\n                                 MAP_SHARED,\n                                 fd,\n                                 0));\n  ASSERT_TRUE(mapping);\n\n  const uintptr_t kMappingAddress = reinterpret_cast<uintptr_t>(mapping);\n\n  // Ensure that things get cleaned up.\n  StackHelper helper(fd, mapping, kMappingSize);\n\n  // Carve a page out of the first mapping with different permissions.\n  char* inside_mapping =  reinterpret_cast<char*>(\n      mmap(mapping + 2 *kPageSize,\n           kPageSize,\n           PROT_NONE,\n           MAP_SHARED | MAP_FIXED,\n           fd,\n           // Map a different offset just to\n           // better test real-world conditions.\n           kPageSize));\n  ASSERT_TRUE(inside_mapping);\n\n  // Now check that LinuxPtraceDumper interpreted the mappings properly.\n  LinuxPtraceDumper dumper(getpid());\n  ASSERT_TRUE(dumper.Init());\n  int mapping_count = 0;\n  for (unsigned i = 0; i < dumper.mappings().size(); ++i) {\n    const MappingInfo& mapping = *dumper.mappings()[i];\n    if (strcmp(mapping.name, helper_path.c_str()) == 0) {\n      // This mapping should encompass the entire original mapped\n      // range.\n      EXPECT_EQ(kMappingAddress, mapping.start_addr);\n      EXPECT_EQ(kMappingSize, mapping.size);\n      EXPECT_EQ(0, mapping.offset);\n      mapping_count++;\n    }\n  }\n  EXPECT_EQ(1, mapping_count);\n}\n\nTEST(LinuxPtraceDumperTest, VerifyStackReadWithMultipleThreads) {\n  static const int kNumberOfThreadsInHelperProgram = 5;\n  char kNumberOfThreadsArgument[2];\n  sprintf(kNumberOfThreadsArgument, \"%d\", kNumberOfThreadsInHelperProgram);\n\n  int fds[2];\n  ASSERT_NE(-1, pipe(fds));\n\n  pid_t child_pid = fork();\n  if (child_pid == 0) {\n    // In child process.\n    close(fds[0]);\n\n    string helper_path(GetHelperBinary());\n    if (helper_path.empty()) {\n      FAIL() << \"Couldn't find helper binary\";\n      exit(1);\n    }\n\n    // Pass the pipe fd and the number of threads as arguments.\n    char pipe_fd_string[8];\n    sprintf(pipe_fd_string, \"%d\", fds[1]);\n    execl(helper_path.c_str(),\n          \"linux_dumper_unittest_helper\",\n          pipe_fd_string,\n          kNumberOfThreadsArgument,\n          NULL);\n    // Kill if we get here.\n    printf(\"Errno from exec: %d\", errno);\n    FAIL() << \"Exec of \" << helper_path << \" failed: \" << strerror(errno);\n    exit(0);\n  }\n  close(fds[1]);\n\n  // Wait for all child threads to indicate that they have started\n  for (int threads = 0; threads < kNumberOfThreadsInHelperProgram; threads++) {\n    struct pollfd pfd;\n    memset(&pfd, 0, sizeof(pfd));\n    pfd.fd = fds[0];\n    pfd.events = POLLIN | POLLERR;\n\n    const int r = HANDLE_EINTR(poll(&pfd, 1, 1000));\n    ASSERT_EQ(1, r);\n    ASSERT_TRUE(pfd.revents & POLLIN);\n    uint8_t junk;\n    ASSERT_EQ(read(fds[0], &junk, sizeof(junk)), sizeof(junk));\n  }\n  close(fds[0]);\n\n  // There is a race here because we may stop a child thread before\n  // it is actually running the busy loop. Empirically this sleep\n  // is sufficient to avoid the race.\n  usleep(100000);\n\n  // Children are ready now.\n  LinuxPtraceDumper dumper(child_pid);\n  ASSERT_TRUE(dumper.Init());\n  EXPECT_EQ((size_t)kNumberOfThreadsInHelperProgram, dumper.threads().size());\n  EXPECT_TRUE(dumper.ThreadsSuspend());\n\n  ThreadInfo one_thread;\n  for (size_t i = 0; i < dumper.threads().size(); ++i) {\n    EXPECT_TRUE(dumper.GetThreadInfoByIndex(i, &one_thread));\n    // In the helper program, we stored a pointer to the thread id in a\n    // specific register. Check that we can recover its value.\n#if defined(__ARM_EABI__)\n    pid_t *process_tid_location = (pid_t *)(one_thread.regs.uregs[3]);\n#elif defined(__i386)\n    pid_t *process_tid_location = (pid_t *)(one_thread.regs.ecx);\n#elif defined(__x86_64)\n    pid_t *process_tid_location = (pid_t *)(one_thread.regs.rcx);\n#else\n#error This test has not been ported to this platform.\n#endif\n    pid_t one_thread_id;\n    dumper.CopyFromProcess(&one_thread_id,\n                           dumper.threads()[i],\n                           process_tid_location,\n                           4);\n    EXPECT_EQ(dumper.threads()[i], one_thread_id);\n  }\n  EXPECT_TRUE(dumper.ThreadsResume());\n  kill(child_pid, SIGKILL);\n\n  // Reap child\n  int status;\n  ASSERT_NE(-1, HANDLE_EINTR(waitpid(child_pid, &status, 0)));\n  ASSERT_TRUE(WIFSIGNALED(status));\n  ASSERT_EQ(SIGKILL, WTERMSIG(status));\n}\n\nTEST(LinuxPtraceDumperTest, BuildProcPath) {\n  const pid_t pid = getpid();\n  LinuxPtraceDumper dumper(pid);\n\n  char maps_path[NAME_MAX] = \"\";\n  char maps_path_expected[NAME_MAX];\n  snprintf(maps_path_expected, sizeof(maps_path_expected),\n           \"/proc/%d/maps\", pid);\n  EXPECT_TRUE(dumper.BuildProcPath(maps_path, pid, \"maps\"));\n  EXPECT_STREQ(maps_path_expected, maps_path);\n\n  EXPECT_FALSE(dumper.BuildProcPath(NULL, pid, \"maps\"));\n  EXPECT_FALSE(dumper.BuildProcPath(maps_path, 0, \"maps\"));\n  EXPECT_FALSE(dumper.BuildProcPath(maps_path, pid, \"\"));\n  EXPECT_FALSE(dumper.BuildProcPath(maps_path, pid, NULL));\n\n  char long_node[NAME_MAX];\n  size_t long_node_len = NAME_MAX - strlen(\"/proc/123\") - 1;\n  memset(long_node, 'a', long_node_len);\n  long_node[long_node_len] = '\\0';\n  EXPECT_FALSE(dumper.BuildProcPath(maps_path, 123, long_node));\n}\n\n#if !defined(__ARM_EABI__)\n// Ensure that the linux-gate VDSO is included in the mapping list.\nTEST(LinuxPtraceDumperTest, MappingsIncludeLinuxGate) {\n  LinuxPtraceDumper dumper(getpid());\n  ASSERT_TRUE(dumper.Init());\n\n  void* linux_gate_loc = dumper.FindBeginningOfLinuxGateSharedLibrary(getpid());\n  ASSERT_TRUE(linux_gate_loc);\n  bool found_linux_gate = false;\n\n  const wasteful_vector<MappingInfo*> mappings = dumper.mappings();\n  const MappingInfo* mapping;\n  for (unsigned i = 0; i < mappings.size(); ++i) {\n    mapping = mappings[i];\n    if (!strcmp(mapping->name, kLinuxGateLibraryName)) {\n      found_linux_gate = true;\n      break;\n    }\n  }\n  EXPECT_TRUE(found_linux_gate);\n  EXPECT_EQ(linux_gate_loc, reinterpret_cast<void*>(mapping->start_addr));\n  EXPECT_EQ(0, memcmp(linux_gate_loc, ELFMAG, SELFMAG));\n}\n\n// Ensure that the linux-gate VDSO can generate a non-zeroed File ID.\nTEST(LinuxPtraceDumperTest, LinuxGateMappingID) {\n  LinuxPtraceDumper dumper(getpid());\n  ASSERT_TRUE(dumper.Init());\n\n  bool found_linux_gate = false;\n  const wasteful_vector<MappingInfo*> mappings = dumper.mappings();\n  unsigned index = 0;\n  for (unsigned i = 0; i < mappings.size(); ++i) {\n    if (!strcmp(mappings[i]->name, kLinuxGateLibraryName)) {\n      found_linux_gate = true;\n      index = i;\n      break;\n    }\n  }\n  ASSERT_TRUE(found_linux_gate);\n\n  uint8_t identifier[sizeof(MDGUID)];\n  ASSERT_TRUE(dumper.ElfFileIdentifierForMapping(*mappings[index],\n                                                 true,\n                                                 index,\n                                                 identifier));\n  uint8_t empty_identifier[sizeof(MDGUID)];\n  memset(empty_identifier, 0, sizeof(empty_identifier));\n  EXPECT_NE(0, memcmp(empty_identifier, identifier, sizeof(identifier)));\n}\n\n// Ensure that the linux-gate VDSO can generate a non-zeroed File ID\n// from a child process.\nTEST(LinuxPtraceDumperTest, LinuxGateMappingIDChild) {\n  int fds[2];\n  ASSERT_NE(-1, pipe(fds));\n\n  // Fork a child so ptrace works.\n  const pid_t child = fork();\n  if (child == 0) {\n    close(fds[1]);\n    // Now wait forever for the parent.\n    char b;\n    HANDLE_EINTR(read(fds[0], &b, sizeof(b)));\n    close(fds[0]);\n    syscall(__NR_exit);\n  }\n  close(fds[0]);\n\n  LinuxPtraceDumper dumper(child);\n  ASSERT_TRUE(dumper.Init());\n\n  bool found_linux_gate = false;\n  const wasteful_vector<MappingInfo*> mappings = dumper.mappings();\n  unsigned index = 0;\n  for (unsigned i = 0; i < mappings.size(); ++i) {\n    if (!strcmp(mappings[i]->name, kLinuxGateLibraryName)) {\n      found_linux_gate = true;\n      index = i;\n      break;\n    }\n  }\n  ASSERT_TRUE(found_linux_gate);\n\n  // Need to suspend the child so ptrace actually works.\n  ASSERT_TRUE(dumper.ThreadsSuspend());\n  uint8_t identifier[sizeof(MDGUID)];\n  ASSERT_TRUE(dumper.ElfFileIdentifierForMapping(*mappings[index],\n                                                 true,\n                                                 index,\n                                                 identifier));\n  uint8_t empty_identifier[sizeof(MDGUID)];\n  memset(empty_identifier, 0, sizeof(empty_identifier));\n  EXPECT_NE(0, memcmp(empty_identifier, identifier, sizeof(identifier)));\n  EXPECT_TRUE(dumper.ThreadsResume());\n  close(fds[1]);\n}\n#endif\n\nTEST(LinuxPtraceDumperTest, FileIDsMatch) {\n  // Calculate the File ID of our binary using both\n  // FileID::ElfFileIdentifier and LinuxDumper::ElfFileIdentifierForMapping\n  // and ensure that we get the same result from both.\n  char exe_name[PATH_MAX];\n  ASSERT_TRUE(SafeReadLink(\"/proc/self/exe\", exe_name));\n\n  int fds[2];\n  ASSERT_NE(-1, pipe(fds));\n\n  // Fork a child so ptrace works.\n  const pid_t child = fork();\n  if (child == 0) {\n    close(fds[1]);\n    // Now wait forever for the parent.\n    char b;\n    HANDLE_EINTR(read(fds[0], &b, sizeof(b)));\n    close(fds[0]);\n    syscall(__NR_exit);\n  }\n  close(fds[0]);\n\n  LinuxPtraceDumper dumper(child);\n  ASSERT_TRUE(dumper.Init());\n  const wasteful_vector<MappingInfo*> mappings = dumper.mappings();\n  bool found_exe = false;\n  unsigned i;\n  for (i = 0; i < mappings.size(); ++i) {\n    const MappingInfo* mapping = mappings[i];\n    if (!strcmp(mapping->name, exe_name)) {\n      found_exe = true;\n      break;\n    }\n  }\n  ASSERT_TRUE(found_exe);\n\n  uint8_t identifier1[sizeof(MDGUID)];\n  uint8_t identifier2[sizeof(MDGUID)];\n  EXPECT_TRUE(dumper.ElfFileIdentifierForMapping(*mappings[i], true, i,\n                                                 identifier1));\n  FileID fileid(exe_name);\n  EXPECT_TRUE(fileid.ElfFileIdentifier(identifier2));\n  char identifier_string1[37];\n  char identifier_string2[37];\n  FileID::ConvertIdentifierToString(identifier1, identifier_string1,\n                                    37);\n  FileID::ConvertIdentifierToString(identifier2, identifier_string2,\n                                    37);\n  EXPECT_STREQ(identifier_string1, identifier_string2);\n  close(fds[1]);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/minidump_extension_linux.h",
    "content": "/* Copyright (c) 2010, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/* minidump_extension_linux.h: A definition of exception codes for\n * Linux\n *\n * (This is C99 source, please don't corrupt it with C++.)\n *\n * Author: Adam Langley\n * Split into its own file: Markus Gutschke */\n\n\n#ifndef SRC_CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_EXTENSION_LINUX_H_\n#define SRC_CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_EXTENSION_LINUX_H_\n\n#include <stddef.h>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n\n// These are additional minidump stream values which are specific to the linux\n// breakpad implementation.\nenum {\n  MD_LINUX_CPU_INFO              = 0x47670003,    /* /proc/cpuinfo    */\n  MD_LINUX_PROC_STATUS           = 0x47670004,    /* /proc/$x/status  */\n  MD_LINUX_LSB_RELEASE           = 0x47670005,    /* /etc/lsb-release */\n  MD_LINUX_CMD_LINE              = 0x47670006,    /* /proc/$x/cmdline */\n  MD_LINUX_ENVIRON               = 0x47670007,    /* /proc/$x/environ */\n  MD_LINUX_AUXV                  = 0x47670008,    /* /proc/$x/auxv    */\n  MD_LINUX_MAPS                  = 0x47670009,    /* /proc/$x/maps    */\n  MD_LINUX_DSO_DEBUG             = 0x4767000A     /* DSO data         */\n};\n\ntypedef struct {\n  void*     addr;\n  MDRVA     name;\n  void*     ld;\n} MDRawLinkMap;\n\ntypedef struct {\n  u_int32_t version;\n  MDRVA     map;\n  u_int32_t dso_count;\n  void*     brk;\n  void*     ldbase;\n  void*     dynamic;\n} MDRawDebug;\n\n#endif  // SRC_CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_EXTENSION_LINUX_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/minidump_writer.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This code writes out minidump files:\n//   http://msdn.microsoft.com/en-us/library/ms680378(VS.85,loband).aspx\n//\n// Minidumps are a Microsoft format which Breakpad uses for recording crash\n// dumps. This code has to run in a compromised environment (the address space\n// may have received SIGSEGV), thus the following rules apply:\n//   * You may not enter the dynamic linker. This means that we cannot call\n//     any symbols in a shared library (inc libc). Because of this we replace\n//     libc functions in linux_libc_support.h.\n//   * You may not call syscalls via the libc wrappers. This rule is a subset\n//     of the first rule but it bears repeating. We have direct wrappers\n//     around the system calls in linux_syscall_support.h.\n//   * You may not malloc. There's an alternative allocator in memory.h and\n//     a canonical instance in the LinuxDumper object. We use the placement\n//     new form to allocate objects and we don't delete them.\n\n#include \"client/linux/minidump_writer/minidump_writer.h\"\n#include \"client/minidump_file_writer-inl.h\"\n\n#include <ctype.h>\n#include <errno.h>\n#include <fcntl.h>\n#if !defined(__ANDROID__)\n#include <link.h>\n#endif\n#include <stdio.h>\n#if !defined(__ANDROID__)\n#include <sys/ucontext.h>\n#include <sys/user.h>\n#endif\n#include <sys/utsname.h>\n#include <unistd.h>\n\n#include <algorithm>\n\n#include \"client/minidump_file_writer.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n\n#if defined(__ANDROID__)\n#include \"client/linux/android_link.h\"\n#include \"client/linux/android_ucontext.h\"\n#endif\n#include \"client/linux/handler/exception_handler.h\"\n#include \"client/linux/minidump_writer/line_reader.h\"\n#include \"client/linux/minidump_writer/linux_dumper.h\"\n#include \"client/linux/minidump_writer/linux_ptrace_dumper.h\"\n#include \"client/linux/minidump_writer/minidump_extension_linux.h\"\n#include \"client/minidump_file_writer.h\"\n#include \"common/linux/linux_libc_support.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"third_party/lss/linux_syscall_support.h\"\n\n// Minidump defines register structures which are different from the raw\n// structures which we get from the kernel. These are platform specific\n// functions to juggle the ucontext and user structures into minidump format.\n#if defined(__i386)\ntypedef MDRawContextX86 RawContextCPU;\n\n// Write a uint16_t to memory\n//   out: memory location to write to\n//   v: value to write.\nstatic void U16(void* out, uint16_t v) {\n  memcpy(out, &v, sizeof(v));\n}\n\n// Write a uint32_t to memory\n//   out: memory location to write to\n//   v: value to write.\nstatic void U32(void* out, uint32_t v) {\n  memcpy(out, &v, sizeof(v));\n}\n\n// Juggle an x86 user_(fp|fpx|)regs_struct into minidump format\n//   out: the minidump structure\n//   info: the collection of register structures.\nstatic void CPUFillFromThreadInfo(MDRawContextX86 *out,\n                                  const google_breakpad::ThreadInfo &info) {\n  out->context_flags = MD_CONTEXT_X86_ALL;\n\n  out->dr0 = info.dregs[0];\n  out->dr1 = info.dregs[1];\n  out->dr2 = info.dregs[2];\n  out->dr3 = info.dregs[3];\n  // 4 and 5 deliberatly omitted because they aren't included in the minidump\n  // format.\n  out->dr6 = info.dregs[6];\n  out->dr7 = info.dregs[7];\n\n  out->gs = info.regs.xgs;\n  out->fs = info.regs.xfs;\n  out->es = info.regs.xes;\n  out->ds = info.regs.xds;\n\n  out->edi = info.regs.edi;\n  out->esi = info.regs.esi;\n  out->ebx = info.regs.ebx;\n  out->edx = info.regs.edx;\n  out->ecx = info.regs.ecx;\n  out->eax = info.regs.eax;\n\n  out->ebp = info.regs.ebp;\n  out->eip = info.regs.eip;\n  out->cs = info.regs.xcs;\n  out->eflags = info.regs.eflags;\n  out->esp = info.regs.esp;\n  out->ss = info.regs.xss;\n\n  out->float_save.control_word = info.fpregs.cwd;\n  out->float_save.status_word = info.fpregs.swd;\n  out->float_save.tag_word = info.fpregs.twd;\n  out->float_save.error_offset = info.fpregs.fip;\n  out->float_save.error_selector = info.fpregs.fcs;\n  out->float_save.data_offset = info.fpregs.foo;\n  out->float_save.data_selector = info.fpregs.fos;\n\n  // 8 registers * 10 bytes per register.\n  memcpy(out->float_save.register_area, info.fpregs.st_space, 10 * 8);\n\n  // This matches the Intel fpsave format.\n  U16(out->extended_registers + 0, info.fpregs.cwd);\n  U16(out->extended_registers + 2, info.fpregs.swd);\n  U16(out->extended_registers + 4, info.fpregs.twd);\n  U16(out->extended_registers + 6, info.fpxregs.fop);\n  U32(out->extended_registers + 8, info.fpxregs.fip);\n  U16(out->extended_registers + 12, info.fpxregs.fcs);\n  U32(out->extended_registers + 16, info.fpregs.foo);\n  U16(out->extended_registers + 20, info.fpregs.fos);\n  U32(out->extended_registers + 24, info.fpxregs.mxcsr);\n\n  memcpy(out->extended_registers + 32, &info.fpxregs.st_space, 128);\n  memcpy(out->extended_registers + 160, &info.fpxregs.xmm_space, 128);\n}\n\n// Juggle an x86 ucontext into minidump format\n//   out: the minidump structure\n//   info: the collection of register structures.\nstatic void CPUFillFromUContext(MDRawContextX86 *out, const ucontext *uc,\n                                const struct _libc_fpstate* fp) {\n  const greg_t* regs = uc->uc_mcontext.gregs;\n\n  out->context_flags = MD_CONTEXT_X86_FULL |\n                       MD_CONTEXT_X86_FLOATING_POINT;\n\n  out->gs = regs[REG_GS];\n  out->fs = regs[REG_FS];\n  out->es = regs[REG_ES];\n  out->ds = regs[REG_DS];\n\n  out->edi = regs[REG_EDI];\n  out->esi = regs[REG_ESI];\n  out->ebx = regs[REG_EBX];\n  out->edx = regs[REG_EDX];\n  out->ecx = regs[REG_ECX];\n  out->eax = regs[REG_EAX];\n\n  out->ebp = regs[REG_EBP];\n  out->eip = regs[REG_EIP];\n  out->cs = regs[REG_CS];\n  out->eflags = regs[REG_EFL];\n  out->esp = regs[REG_UESP];\n  out->ss = regs[REG_SS];\n\n  out->float_save.control_word = fp->cw;\n  out->float_save.status_word = fp->sw;\n  out->float_save.tag_word = fp->tag;\n  out->float_save.error_offset = fp->ipoff;\n  out->float_save.error_selector = fp->cssel;\n  out->float_save.data_offset = fp->dataoff;\n  out->float_save.data_selector = fp->datasel;\n\n  // 8 registers * 10 bytes per register.\n  memcpy(out->float_save.register_area, fp->_st, 10 * 8);\n}\n\n#elif defined(__x86_64)\ntypedef MDRawContextAMD64 RawContextCPU;\n\nstatic void CPUFillFromThreadInfo(MDRawContextAMD64 *out,\n                                  const google_breakpad::ThreadInfo &info) {\n  out->context_flags = MD_CONTEXT_AMD64_FULL |\n                       MD_CONTEXT_AMD64_SEGMENTS;\n\n  out->cs = info.regs.cs;\n\n  out->ds = info.regs.ds;\n  out->es = info.regs.es;\n  out->fs = info.regs.fs;\n  out->gs = info.regs.gs;\n\n  out->ss = info.regs.ss;\n  out->eflags = info.regs.eflags;\n\n  out->dr0 = info.dregs[0];\n  out->dr1 = info.dregs[1];\n  out->dr2 = info.dregs[2];\n  out->dr3 = info.dregs[3];\n  // 4 and 5 deliberatly omitted because they aren't included in the minidump\n  // format.\n  out->dr6 = info.dregs[6];\n  out->dr7 = info.dregs[7];\n\n  out->rax = info.regs.rax;\n  out->rcx = info.regs.rcx;\n  out->rdx = info.regs.rdx;\n  out->rbx = info.regs.rbx;\n\n  out->rsp = info.regs.rsp;\n\n  out->rbp = info.regs.rbp;\n  out->rsi = info.regs.rsi;\n  out->rdi = info.regs.rdi;\n  out->r8 = info.regs.r8;\n  out->r9 = info.regs.r9;\n  out->r10 = info.regs.r10;\n  out->r11 = info.regs.r11;\n  out->r12 = info.regs.r12;\n  out->r13 = info.regs.r13;\n  out->r14 = info.regs.r14;\n  out->r15 = info.regs.r15;\n\n  out->rip = info.regs.rip;\n\n  out->flt_save.control_word = info.fpregs.cwd;\n  out->flt_save.status_word = info.fpregs.swd;\n  out->flt_save.tag_word = info.fpregs.ftw;\n  out->flt_save.error_opcode = info.fpregs.fop;\n  out->flt_save.error_offset = info.fpregs.rip;\n  out->flt_save.error_selector = 0;  // We don't have this.\n  out->flt_save.data_offset = info.fpregs.rdp;\n  out->flt_save.data_selector = 0;   // We don't have this.\n  out->flt_save.mx_csr = info.fpregs.mxcsr;\n  out->flt_save.mx_csr_mask = info.fpregs.mxcr_mask;\n  memcpy(&out->flt_save.float_registers, &info.fpregs.st_space, 8 * 16);\n  memcpy(&out->flt_save.xmm_registers, &info.fpregs.xmm_space, 16 * 16);\n}\n\nstatic void CPUFillFromUContext(MDRawContextAMD64 *out, const ucontext *uc,\n                                const struct _libc_fpstate* fpregs) {\n  const greg_t* regs = uc->uc_mcontext.gregs;\n\n  out->context_flags = MD_CONTEXT_AMD64_FULL;\n\n  out->cs = regs[REG_CSGSFS] & 0xffff;\n\n  out->fs = (regs[REG_CSGSFS] >> 32) & 0xffff;\n  out->gs = (regs[REG_CSGSFS] >> 16) & 0xffff;\n\n  out->eflags = regs[REG_EFL];\n\n  out->rax = regs[REG_RAX];\n  out->rcx = regs[REG_RCX];\n  out->rdx = regs[REG_RDX];\n  out->rbx = regs[REG_RBX];\n\n  out->rsp = regs[REG_RSP];\n  out->rbp = regs[REG_RBP];\n  out->rsi = regs[REG_RSI];\n  out->rdi = regs[REG_RDI];\n  out->r8 = regs[REG_R8];\n  out->r9 = regs[REG_R9];\n  out->r10 = regs[REG_R10];\n  out->r11 = regs[REG_R11];\n  out->r12 = regs[REG_R12];\n  out->r13 = regs[REG_R13];\n  out->r14 = regs[REG_R14];\n  out->r15 = regs[REG_R15];\n\n  out->rip = regs[REG_RIP];\n\n  out->flt_save.control_word = fpregs->cwd;\n  out->flt_save.status_word = fpregs->swd;\n  out->flt_save.tag_word = fpregs->ftw;\n  out->flt_save.error_opcode = fpregs->fop;\n  out->flt_save.error_offset = fpregs->rip;\n  out->flt_save.data_offset = fpregs->rdp;\n  out->flt_save.error_selector = 0;  // We don't have this.\n  out->flt_save.data_selector = 0;  // We don't have this.\n  out->flt_save.mx_csr = fpregs->mxcsr;\n  out->flt_save.mx_csr_mask = fpregs->mxcr_mask;\n  memcpy(&out->flt_save.float_registers, &fpregs->_st, 8 * 16);\n  memcpy(&out->flt_save.xmm_registers, &fpregs->_xmm, 16 * 16);\n}\n\n#elif defined(__ARMEL__)\ntypedef MDRawContextARM RawContextCPU;\n\nstatic void CPUFillFromThreadInfo(MDRawContextARM *out,\n                                  const google_breakpad::ThreadInfo &info) {\n  out->context_flags = MD_CONTEXT_ARM_FULL;\n\n  for (int i = 0; i < MD_CONTEXT_ARM_GPR_COUNT; ++i)\n    out->iregs[i] = info.regs.uregs[i];\n  // No CPSR register in ThreadInfo(it's not accessible via ptrace)\n  out->cpsr = 0;\n#if !defined(__ANDROID__)\n  out->float_save.fpscr = info.fpregs.fpsr |\n    (static_cast<u_int64_t>(info.fpregs.fpcr) << 32);\n  // TODO: sort this out, actually collect floating point registers\n  memset(&out->float_save.regs, 0, sizeof(out->float_save.regs));\n  memset(&out->float_save.extra, 0, sizeof(out->float_save.extra));\n#endif\n}\n\nstatic void CPUFillFromUContext(MDRawContextARM *out, const ucontext *uc,\n                                const struct _libc_fpstate* fpregs) {\n  out->context_flags = MD_CONTEXT_ARM_FULL;\n\n  out->iregs[0] = uc->uc_mcontext.arm_r0;\n  out->iregs[1] = uc->uc_mcontext.arm_r1;\n  out->iregs[2] = uc->uc_mcontext.arm_r2;\n  out->iregs[3] = uc->uc_mcontext.arm_r3;\n  out->iregs[4] = uc->uc_mcontext.arm_r4;\n  out->iregs[5] = uc->uc_mcontext.arm_r5;\n  out->iregs[6] = uc->uc_mcontext.arm_r6;\n  out->iregs[7] = uc->uc_mcontext.arm_r7;\n  out->iregs[8] = uc->uc_mcontext.arm_r8;\n  out->iregs[9] = uc->uc_mcontext.arm_r9;\n  out->iregs[10] = uc->uc_mcontext.arm_r10;\n\n  out->iregs[11] = uc->uc_mcontext.arm_fp;\n  out->iregs[12] = uc->uc_mcontext.arm_ip;\n  out->iregs[13] = uc->uc_mcontext.arm_sp;\n  out->iregs[14] = uc->uc_mcontext.arm_lr;\n  out->iregs[15] = uc->uc_mcontext.arm_pc;\n\n  out->cpsr = uc->uc_mcontext.arm_cpsr;\n\n  // TODO: fix this after fixing ExceptionHandler\n  out->float_save.fpscr = 0;\n  memset(&out->float_save.regs, 0, sizeof(out->float_save.regs));\n  memset(&out->float_save.extra, 0, sizeof(out->float_save.extra));\n}\n\n#else\n#error \"This code has not been ported to your platform yet.\"\n#endif\n\nnamespace google_breakpad {\n\nclass MinidumpWriter {\n public:\n  MinidumpWriter(const char* filename,\n                 const ExceptionHandler::CrashContext* context,\n                 const MappingList& mappings,\n                 LinuxDumper* dumper)\n      : filename_(filename),\n        ucontext_(context ? &context->context : NULL),\n#if !defined(__ARM_EABI__)\n        float_state_(context ? &context->float_state : NULL),\n#else\n        // TODO: fix this after fixing ExceptionHandler\n        float_state_(NULL),\n#endif\n        dumper_(dumper),\n        memory_blocks_(dumper_->allocator()),\n        mapping_list_(mappings) {\n  }\n\n  bool Init() {\n    return dumper_->Init() && minidump_writer_.Open(filename_) &&\n           dumper_->ThreadsSuspend();\n  }\n\n  ~MinidumpWriter() {\n    minidump_writer_.Close();\n    dumper_->ThreadsResume();\n  }\n\n  bool Dump() {\n    // The dynamic linker makes information available that helps gdb find all\n    // DSOs loaded into the program. If we can access this information, we dump\n    // it to a MD_LINUX_DSO_DEBUG stream.\n    struct r_debug* r_debug = NULL;\n    uint32_t dynamic_length = 0;\n#if !defined(__ANDROID__)\n    // This code assumes the crashing process is the same as this process and\n    // may hang or take a long time to complete if not so.\n    // Thus, we skip this code for a post-mortem based dump.\n    if (!dumper_->IsPostMortem()) {\n      // The Android NDK is missing structure definitions for most of this.\n      // For now, it's simpler just to skip it.\n      for (int i = 0;;) {\n        ElfW(Dyn) dyn;\n        dynamic_length += sizeof(dyn);\n        // NOTE: Use of _DYNAMIC assumes this is the same process as the\n        // crashing process. This loop will go forever if it's out of bounds.\n        dumper_->CopyFromProcess(&dyn, GetCrashThread(), _DYNAMIC+i++,\n                                 sizeof(dyn));\n        if (dyn.d_tag == DT_DEBUG) {\n          r_debug = (struct r_debug*)dyn.d_un.d_ptr;\n          continue;\n        } else if (dyn.d_tag == DT_NULL) {\n          break;\n        }\n      }\n    }\n#endif\n\n    // A minidump file contains a number of tagged streams. This is the number\n    // of stream which we write.\n    unsigned kNumWriters = 12;\n    if (r_debug)\n      ++kNumWriters;\n\n    TypedMDRVA<MDRawHeader> header(&minidump_writer_);\n    TypedMDRVA<MDRawDirectory> dir(&minidump_writer_);\n    if (!header.Allocate())\n      return false;\n    if (!dir.AllocateArray(kNumWriters))\n      return false;\n    memset(header.get(), 0, sizeof(MDRawHeader));\n\n    header.get()->signature = MD_HEADER_SIGNATURE;\n    header.get()->version = MD_HEADER_VERSION;\n    header.get()->time_date_stamp = time(NULL);\n    header.get()->stream_count = kNumWriters;\n    header.get()->stream_directory_rva = dir.position();\n\n    unsigned dir_index = 0;\n    MDRawDirectory dirent;\n\n    if (!WriteThreadListStream(&dirent))\n      return false;\n    dir.CopyIndex(dir_index++, &dirent);\n\n    if (!WriteMappings(&dirent))\n      return false;\n    dir.CopyIndex(dir_index++, &dirent);\n\n    if (!WriteMemoryListStream(&dirent))\n      return false;\n    dir.CopyIndex(dir_index++, &dirent);\n\n    if (!WriteExceptionStream(&dirent))\n      return false;\n    dir.CopyIndex(dir_index++, &dirent);\n\n    if (!WriteSystemInfoStream(&dirent))\n      return false;\n    dir.CopyIndex(dir_index++, &dirent);\n\n    dirent.stream_type = MD_LINUX_CPU_INFO;\n    if (!WriteFile(&dirent.location, \"/proc/cpuinfo\"))\n      NullifyDirectoryEntry(&dirent);\n    dir.CopyIndex(dir_index++, &dirent);\n\n    dirent.stream_type = MD_LINUX_PROC_STATUS;\n    if (!WriteProcFile(&dirent.location, GetCrashThread(), \"status\"))\n      NullifyDirectoryEntry(&dirent);\n    dir.CopyIndex(dir_index++, &dirent);\n\n    dirent.stream_type = MD_LINUX_LSB_RELEASE;\n    if (!WriteFile(&dirent.location, \"/etc/lsb-release\"))\n      NullifyDirectoryEntry(&dirent);\n    dir.CopyIndex(dir_index++, &dirent);\n\n    dirent.stream_type = MD_LINUX_CMD_LINE;\n    if (!WriteProcFile(&dirent.location, GetCrashThread(), \"cmdline\"))\n      NullifyDirectoryEntry(&dirent);\n    dir.CopyIndex(dir_index++, &dirent);\n\n    dirent.stream_type = MD_LINUX_ENVIRON;\n    if (!WriteProcFile(&dirent.location, GetCrashThread(), \"environ\"))\n      NullifyDirectoryEntry(&dirent);\n    dir.CopyIndex(dir_index++, &dirent);\n\n    dirent.stream_type = MD_LINUX_AUXV;\n    if (!WriteProcFile(&dirent.location, GetCrashThread(), \"auxv\"))\n      NullifyDirectoryEntry(&dirent);\n    dir.CopyIndex(dir_index++, &dirent);\n\n    dirent.stream_type = MD_LINUX_MAPS;\n    if (!WriteProcFile(&dirent.location, GetCrashThread(), \"maps\"))\n      NullifyDirectoryEntry(&dirent);\n    dir.CopyIndex(dir_index++, &dirent);\n\n    if (r_debug) {\n      dirent.stream_type = MD_LINUX_DSO_DEBUG;\n      if (!WriteDSODebugStream(&dirent, r_debug, dynamic_length))\n        NullifyDirectoryEntry(&dirent);\n      dir.CopyIndex(dir_index++, &dirent);\n    }\n\n    // If you add more directory entries, don't forget to update kNumWriters,\n    // above.\n\n    dumper_->ThreadsResume();\n    return true;\n  }\n\n  // Check if the top of the stack is part of a system call that has been\n  // redirected by the seccomp sandbox. If so, try to pop the stack frames\n  // all the way back to the point where the interception happened.\n  void PopSeccompStackFrame(RawContextCPU* cpu, const MDRawThread& thread,\n                            uint8_t* stack_copy) {\n#if defined(__x86_64)\n    u_int64_t bp = cpu->rbp;\n    u_int64_t top = thread.stack.start_of_memory_range;\n    for (int i = 4; i--; ) {\n      if (bp < top ||\n          bp + sizeof(bp) > thread.stack.start_of_memory_range +\n          thread.stack.memory.data_size ||\n          bp & 1) {\n        break;\n      }\n      uint64_t old_top = top;\n      top = bp;\n      u_int8_t* bp_addr = stack_copy + bp - thread.stack.start_of_memory_range;\n      memcpy(&bp, bp_addr, sizeof(bp));\n      if (bp == 0xDEADBEEFDEADBEEFull) {\n        struct {\n          uint64_t r15;\n          uint64_t r14;\n          uint64_t r13;\n          uint64_t r12;\n          uint64_t r11;\n          uint64_t r10;\n          uint64_t r9;\n          uint64_t r8;\n          uint64_t rdi;\n          uint64_t rsi;\n          uint64_t rdx;\n          uint64_t rcx;\n          uint64_t rbx;\n          uint64_t deadbeef;\n          uint64_t rbp;\n          uint64_t fakeret;\n          uint64_t ret;\n          /* char redzone[128]; */\n        } seccomp_stackframe;\n        if (top - offsetof(typeof(seccomp_stackframe), deadbeef) < old_top ||\n            top - offsetof(typeof(seccomp_stackframe), deadbeef) +\n            sizeof(seccomp_stackframe) >\n            thread.stack.start_of_memory_range+thread.stack.memory.data_size) {\n          break;\n        }\n        memcpy(&seccomp_stackframe,\n               bp_addr - offsetof(typeof(seccomp_stackframe), deadbeef),\n               sizeof(seccomp_stackframe));\n        cpu->rbx = seccomp_stackframe.rbx;\n        cpu->rcx = seccomp_stackframe.rcx;\n        cpu->rdx = seccomp_stackframe.rdx;\n        cpu->rsi = seccomp_stackframe.rsi;\n        cpu->rdi = seccomp_stackframe.rdi;\n        cpu->rbp = seccomp_stackframe.rbp;\n        cpu->rsp = top + 4*sizeof(uint64_t) + 128;\n        cpu->r8  = seccomp_stackframe.r8;\n        cpu->r9  = seccomp_stackframe.r9;\n        cpu->r10 = seccomp_stackframe.r10;\n        cpu->r11 = seccomp_stackframe.r11;\n        cpu->r12 = seccomp_stackframe.r12;\n        cpu->r13 = seccomp_stackframe.r13;\n        cpu->r14 = seccomp_stackframe.r14;\n        cpu->r15 = seccomp_stackframe.r15;\n        cpu->rip = seccomp_stackframe.fakeret;\n        return;\n      }\n    }\n#elif defined(__i386)\n    u_int32_t bp = cpu->ebp;\n    u_int32_t top = thread.stack.start_of_memory_range;\n    for (int i = 4; i--; ) {\n      if (bp < top ||\n          bp + sizeof(bp) > thread.stack.start_of_memory_range +\n          thread.stack.memory.data_size ||\n          bp & 1) {\n        break;\n      }\n      uint32_t old_top = top;\n      top = bp;\n      u_int8_t* bp_addr = stack_copy + bp - thread.stack.start_of_memory_range;\n      memcpy(&bp, bp_addr, sizeof(bp));\n      if (bp == 0xDEADBEEFu) {\n        struct {\n          uint32_t edi;\n          uint32_t esi;\n          uint32_t edx;\n          uint32_t ecx;\n          uint32_t ebx;\n          uint32_t deadbeef;\n          uint32_t ebp;\n          uint32_t fakeret;\n          uint32_t ret;\n        } seccomp_stackframe;\n        if (top - offsetof(typeof(seccomp_stackframe), deadbeef) < old_top ||\n            top - offsetof(typeof(seccomp_stackframe), deadbeef) +\n            sizeof(seccomp_stackframe) >\n            thread.stack.start_of_memory_range+thread.stack.memory.data_size) {\n          break;\n        }\n        memcpy(&seccomp_stackframe,\n               bp_addr - offsetof(typeof(seccomp_stackframe), deadbeef),\n               sizeof(seccomp_stackframe));\n        cpu->ebx = seccomp_stackframe.ebx;\n        cpu->ecx = seccomp_stackframe.ecx;\n        cpu->edx = seccomp_stackframe.edx;\n        cpu->esi = seccomp_stackframe.esi;\n        cpu->edi = seccomp_stackframe.edi;\n        cpu->ebp = seccomp_stackframe.ebp;\n        cpu->esp = top + 4*sizeof(void*);\n        cpu->eip = seccomp_stackframe.fakeret;\n        return;\n      }\n    }\n#endif\n  }\n\n  // Write information about the threads.\n  bool WriteThreadListStream(MDRawDirectory* dirent) {\n    const unsigned num_threads = dumper_->threads().size();\n\n    TypedMDRVA<uint32_t> list(&minidump_writer_);\n    if (!list.AllocateObjectAndArray(num_threads, sizeof(MDRawThread)))\n      return false;\n\n    dirent->stream_type = MD_THREAD_LIST_STREAM;\n    dirent->location = list.location();\n\n    *list.get() = num_threads;\n\n    for (unsigned i = 0; i < num_threads; ++i) {\n      MDRawThread thread;\n      my_memset(&thread, 0, sizeof(thread));\n      thread.thread_id = dumper_->threads()[i];\n      // We have a different source of information for the crashing thread. If\n      // we used the actual state of the thread we would find it running in the\n      // signal handler with the alternative stack, which would be deeply\n      // unhelpful.\n      if (static_cast<pid_t>(thread.thread_id) == GetCrashThread() &&\n          !dumper_->IsPostMortem()) {\n        const void* stack;\n        size_t stack_len;\n        if (!dumper_->GetStackInfo(&stack, &stack_len, GetStackPointer()))\n          return false;\n        UntypedMDRVA memory(&minidump_writer_);\n        if (!memory.Allocate(stack_len))\n          return false;\n        uint8_t* stack_copy = reinterpret_cast<uint8_t*>(Alloc(stack_len));\n        dumper_->CopyFromProcess(stack_copy, thread.thread_id, stack,\n                                 stack_len);\n        memory.Copy(stack_copy, stack_len);\n        thread.stack.start_of_memory_range = (uintptr_t) (stack);\n        thread.stack.memory = memory.location();\n        memory_blocks_.push_back(thread.stack);\n\n        // Copy 256 bytes around crashing instruction pointer to minidump.\n        const size_t kIPMemorySize = 256;\n        u_int64_t ip = GetInstructionPointer();\n        // Bound it to the upper and lower bounds of the memory map\n        // it's contained within. If it's not in mapped memory,\n        // don't bother trying to write it.\n        bool ip_is_mapped = false;\n        MDMemoryDescriptor ip_memory_d;\n        for (unsigned j = 0; j < dumper_->mappings().size(); ++j) {\n          const MappingInfo& mapping = *dumper_->mappings()[j];\n          if (ip >= mapping.start_addr &&\n              ip < mapping.start_addr + mapping.size) {\n            ip_is_mapped = true;\n            // Try to get 128 bytes before and after the IP, but\n            // settle for whatever's available.\n            ip_memory_d.start_of_memory_range =\n              std::max(mapping.start_addr,\n                       uintptr_t(ip - (kIPMemorySize / 2)));\n            uintptr_t end_of_range =\n              std::min(uintptr_t(ip + (kIPMemorySize / 2)),\n                       uintptr_t(mapping.start_addr + mapping.size));\n            ip_memory_d.memory.data_size =\n              end_of_range - ip_memory_d.start_of_memory_range;\n            break;\n          }\n        }\n\n        if (ip_is_mapped) {\n          UntypedMDRVA ip_memory(&minidump_writer_);\n          if (!ip_memory.Allocate(ip_memory_d.memory.data_size))\n            return false;\n          uint8_t* memory_copy =\n              reinterpret_cast<uint8_t*>(Alloc(ip_memory_d.memory.data_size));\n          dumper_->CopyFromProcess(\n              memory_copy,\n              thread.thread_id,\n              reinterpret_cast<void*>(ip_memory_d.start_of_memory_range),\n              ip_memory_d.memory.data_size);\n          ip_memory.Copy(memory_copy, ip_memory_d.memory.data_size);\n          ip_memory_d.memory = ip_memory.location();\n          memory_blocks_.push_back(ip_memory_d);\n        }\n\n        TypedMDRVA<RawContextCPU> cpu(&minidump_writer_);\n        if (!cpu.Allocate())\n          return false;\n        my_memset(cpu.get(), 0, sizeof(RawContextCPU));\n        CPUFillFromUContext(cpu.get(), ucontext_, float_state_);\n        PopSeccompStackFrame(cpu.get(), thread, stack_copy);\n        thread.thread_context = cpu.location();\n        crashing_thread_context_ = cpu.location();\n      } else {\n        ThreadInfo info;\n        if (!dumper_->GetThreadInfoByIndex(i, &info))\n          return false;\n        UntypedMDRVA memory(&minidump_writer_);\n        if (!memory.Allocate(info.stack_len))\n          return false;\n        uint8_t* stack_copy = reinterpret_cast<uint8_t*>(Alloc(info.stack_len));\n        dumper_->CopyFromProcess(stack_copy, thread.thread_id, info.stack,\n                                 info.stack_len);\n        memory.Copy(stack_copy, info.stack_len);\n        thread.stack.start_of_memory_range = (uintptr_t)(info.stack);\n        thread.stack.memory = memory.location();\n        memory_blocks_.push_back(thread.stack);\n\n        TypedMDRVA<RawContextCPU> cpu(&minidump_writer_);\n        if (!cpu.Allocate())\n          return false;\n        my_memset(cpu.get(), 0, sizeof(RawContextCPU));\n        CPUFillFromThreadInfo(cpu.get(), info);\n        PopSeccompStackFrame(cpu.get(), thread, stack_copy);\n        thread.thread_context = cpu.location();\n        if (dumper_->threads()[i] == GetCrashThread()) {\n          assert(dumper_->IsPostMortem());\n          crashing_thread_context_ = cpu.location();\n        }\n      }\n\n      list.CopyIndexAfterObject(i, &thread, sizeof(thread));\n    }\n\n    return true;\n  }\n\n  static bool ShouldIncludeMapping(const MappingInfo& mapping) {\n    if (mapping.name[0] == 0 ||  // only want modules with filenames.\n        mapping.offset ||  // only want to include one mapping per shared lib.\n        mapping.size < 4096) {  // too small to get a signature for.\n      return false;\n    }\n\n    return true;\n  }\n\n  // If there is caller-provided information about this mapping\n  // in the mapping_list_ list, return true. Otherwise, return false.\n  bool HaveMappingInfo(const MappingInfo& mapping) {\n    for (MappingList::const_iterator iter = mapping_list_.begin();\n         iter != mapping_list_.end();\n         ++iter) {\n      // Ignore any mappings that are wholly contained within\n      // mappings in the mapping_info_ list.\n      if (mapping.start_addr >= iter->first.start_addr &&\n          (mapping.start_addr + mapping.size) <=\n          (iter->first.start_addr + iter->first.size)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  // Write information about the mappings in effect. Because we are using the\n  // minidump format, the information about the mappings is pretty limited.\n  // Because of this, we also include the full, unparsed, /proc/$x/maps file in\n  // another stream in the file.\n  bool WriteMappings(MDRawDirectory* dirent) {\n    const unsigned num_mappings = dumper_->mappings().size();\n    unsigned num_output_mappings = mapping_list_.size();\n\n    for (unsigned i = 0; i < dumper_->mappings().size(); ++i) {\n      const MappingInfo& mapping = *dumper_->mappings()[i];\n      if (ShouldIncludeMapping(mapping) && !HaveMappingInfo(mapping))\n        num_output_mappings++;\n    }\n\n    TypedMDRVA<uint32_t> list(&minidump_writer_);\n    if (!list.AllocateObjectAndArray(num_output_mappings, MD_MODULE_SIZE))\n      return false;\n\n    dirent->stream_type = MD_MODULE_LIST_STREAM;\n    dirent->location = list.location();\n    *list.get() = num_output_mappings;\n\n    // First write all the mappings from the dumper\n    unsigned int j = 0;\n    for (unsigned i = 0; i < num_mappings; ++i) {\n      const MappingInfo& mapping = *dumper_->mappings()[i];\n      if (!ShouldIncludeMapping(mapping) || HaveMappingInfo(mapping))\n        continue;\n\n      MDRawModule mod;\n      if (!FillRawModule(mapping, true, i, mod, NULL))\n        return false;\n      list.CopyIndexAfterObject(j++, &mod, MD_MODULE_SIZE);\n    }\n    // Next write all the mappings provided by the caller\n    for (MappingList::const_iterator iter = mapping_list_.begin();\n         iter != mapping_list_.end();\n         ++iter) {\n      MDRawModule mod;\n      if (!FillRawModule(iter->first, false, 0, mod, iter->second))\n        return false;\n      list.CopyIndexAfterObject(j++, &mod, MD_MODULE_SIZE);\n    }\n\n    return true;\n  }\n\n  // Fill the MDRawModule |mod| with information about the provided\n  // |mapping|. If |identifier| is non-NULL, use it instead of calculating\n  // a file ID from the mapping.\n  bool FillRawModule(const MappingInfo& mapping,\n                     bool member,\n                     unsigned int mapping_id,\n                     MDRawModule& mod,\n                     const u_int8_t* identifier) {\n    my_memset(&mod, 0, MD_MODULE_SIZE);\n\n    mod.base_of_image = mapping.start_addr;\n    mod.size_of_image = mapping.size;\n    const size_t filepath_len = my_strlen(mapping.name);\n\n    // Figure out file name from path\n    const char* filename_ptr = mapping.name + filepath_len - 1;\n    while (filename_ptr >= mapping.name) {\n      if (*filename_ptr == '/')\n        break;\n      filename_ptr--;\n    }\n    filename_ptr++;\n\n    const size_t filename_len = mapping.name + filepath_len - filename_ptr;\n\n    uint8_t cv_buf[MDCVInfoPDB70_minsize + NAME_MAX];\n    uint8_t* cv_ptr = cv_buf;\n    UntypedMDRVA cv(&minidump_writer_);\n    if (!cv.Allocate(MDCVInfoPDB70_minsize + filename_len + 1))\n      return false;\n\n    const uint32_t cv_signature = MD_CVINFOPDB70_SIGNATURE;\n    memcpy(cv_ptr, &cv_signature, sizeof(cv_signature));\n    cv_ptr += sizeof(cv_signature);\n    uint8_t* signature = cv_ptr;\n    cv_ptr += sizeof(MDGUID);\n    if (identifier) {\n      // GUID was provided by caller.\n      memcpy(signature, identifier, sizeof(MDGUID));\n    } else {\n      dumper_->ElfFileIdentifierForMapping(mapping, member,\n                                           mapping_id, signature);\n    }\n    my_memset(cv_ptr, 0, sizeof(uint32_t));  // Set age to 0 on Linux.\n    cv_ptr += sizeof(uint32_t);\n\n    // Write pdb_file_name\n    memcpy(cv_ptr, filename_ptr, filename_len + 1);\n    cv.Copy(cv_buf, MDCVInfoPDB70_minsize + filename_len + 1);\n\n    mod.cv_record = cv.location();\n\n    MDLocationDescriptor ld;\n    if (!minidump_writer_.WriteString(mapping.name, filepath_len, &ld))\n      return false;\n    mod.module_name_rva = ld.rva;\n    return true;\n  }\n\n  bool WriteMemoryListStream(MDRawDirectory* dirent) {\n    TypedMDRVA<uint32_t> list(&minidump_writer_);\n    if (!list.AllocateObjectAndArray(memory_blocks_.size(),\n                                     sizeof(MDMemoryDescriptor)))\n      return false;\n\n    dirent->stream_type = MD_MEMORY_LIST_STREAM;\n    dirent->location = list.location();\n\n    *list.get() = memory_blocks_.size();\n\n    for (size_t i = 0; i < memory_blocks_.size(); ++i) {\n      list.CopyIndexAfterObject(i, &memory_blocks_[i],\n                                sizeof(MDMemoryDescriptor));\n    }\n    return true;\n  }\n\n  bool WriteExceptionStream(MDRawDirectory* dirent) {\n    TypedMDRVA<MDRawExceptionStream> exc(&minidump_writer_);\n    if (!exc.Allocate())\n      return false;\n    my_memset(exc.get(), 0, sizeof(MDRawExceptionStream));\n\n    dirent->stream_type = MD_EXCEPTION_STREAM;\n    dirent->location = exc.location();\n\n    exc.get()->thread_id = GetCrashThread();\n    exc.get()->exception_record.exception_code = dumper_->crash_signal();\n    exc.get()->exception_record.exception_address = dumper_->crash_address();\n    exc.get()->thread_context = crashing_thread_context_;\n\n    return true;\n  }\n\n  bool WriteSystemInfoStream(MDRawDirectory* dirent) {\n    TypedMDRVA<MDRawSystemInfo> si(&minidump_writer_);\n    if (!si.Allocate())\n      return false;\n    my_memset(si.get(), 0, sizeof(MDRawSystemInfo));\n\n    dirent->stream_type = MD_SYSTEM_INFO_STREAM;\n    dirent->location = si.location();\n\n    WriteCPUInformation(si.get());\n    WriteOSInformation(si.get());\n\n    return true;\n  }\n\n  bool WriteDSODebugStream(MDRawDirectory* dirent, struct r_debug* r_debug,\n                           uint32_t dynamic_length) {\n#if defined(__ANDROID__)\n    return false;\n#else\n    // The caller provided us with a pointer to \"struct r_debug\". We can\n    // look up the \"r_map\" field to get a linked list of all loaded DSOs.\n    // Our list of DSOs potentially is different from the ones in the crashing\n    // process. So, we have to be careful to never dereference pointers\n    // directly. Instead, we use CopyFromProcess() everywhere.\n    // See <link.h> for a more detailed discussion of the how the dynamic\n    // loader communicates with debuggers.\n\n    // Count the number of loaded DSOs\n    int dso_count = 0;\n    struct r_debug debug_entry;\n    dumper_->CopyFromProcess(&debug_entry, GetCrashThread(), r_debug,\n                             sizeof(debug_entry));\n    for (struct link_map* ptr = debug_entry.r_map; ptr; ) {\n      struct link_map map;\n      dumper_->CopyFromProcess(&map, GetCrashThread(), ptr, sizeof(map));\n      ptr = map.l_next;\n      dso_count++;\n    }\n\n    MDRVA linkmap_rva = minidump_writer_.kInvalidMDRVA;\n    if (dso_count > 0) {\n      // If we have at least one DSO, create an array of MDRawLinkMap\n      // entries in the minidump file.\n      TypedMDRVA<MDRawLinkMap> linkmap(&minidump_writer_);\n      if (!linkmap.AllocateArray(dso_count))\n        return false;\n      linkmap_rva = linkmap.location().rva;\n      int idx = 0;\n\n      // Iterate over DSOs and write their information to mini dump\n      for (struct link_map* ptr = debug_entry.r_map; ptr; ) {\n        struct link_map map;\n        dumper_->CopyFromProcess(&map, GetCrashThread(), ptr, sizeof(map));\n        ptr = map.l_next;\n        char filename[257] = { 0 };\n        if (map.l_name) {\n          dumper_->CopyFromProcess(filename, GetCrashThread(), map.l_name,\n                                   sizeof(filename) - 1);\n        }\n        MDLocationDescriptor location;\n        if (!minidump_writer_.WriteString(filename, 0, &location))\n          return false;\n        MDRawLinkMap entry;\n        entry.name = location.rva;\n        entry.addr = (void*)map.l_addr;\n        entry.ld = (void*)map.l_ld;\n        linkmap.CopyIndex(idx++, &entry);\n      }\n    }\n\n    // Write MD_LINUX_DSO_DEBUG record\n    TypedMDRVA<MDRawDebug> debug(&minidump_writer_);\n    if (!debug.AllocateObjectAndArray(1, dynamic_length))\n      return false;\n    my_memset(debug.get(), 0, sizeof(MDRawDebug));\n    dirent->stream_type = MD_LINUX_DSO_DEBUG;\n    dirent->location = debug.location();\n\n    debug.get()->version = debug_entry.r_version;\n    debug.get()->map = linkmap_rva;\n    debug.get()->dso_count = dso_count;\n    debug.get()->brk = (void*)debug_entry.r_brk;\n    debug.get()->ldbase = (void*)debug_entry.r_ldbase;\n    debug.get()->dynamic = (void*)&_DYNAMIC;\n\n    char *dso_debug_data = new char[dynamic_length];\n    dumper_->CopyFromProcess(dso_debug_data, GetCrashThread(), &_DYNAMIC,\n                             dynamic_length);\n    debug.CopyIndexAfterObject(0, dso_debug_data, dynamic_length);\n    delete[] dso_debug_data;\n\n    return true;\n#endif\n  }\n\n private:\n  void* Alloc(unsigned bytes) {\n    return dumper_->allocator()->Alloc(bytes);\n  }\n\n  pid_t GetCrashThread() const {\n    return dumper_->crash_thread();\n  }\n\n#if defined(__i386)\n  uintptr_t GetStackPointer() {\n    return ucontext_->uc_mcontext.gregs[REG_ESP];\n  }\n\n  uintptr_t GetInstructionPointer() {\n    return ucontext_->uc_mcontext.gregs[REG_EIP];\n  }\n#elif defined(__x86_64)\n  uintptr_t GetStackPointer() {\n    return ucontext_->uc_mcontext.gregs[REG_RSP];\n  }\n\n  uintptr_t GetInstructionPointer() {\n    return ucontext_->uc_mcontext.gregs[REG_RIP];\n  }\n#elif defined(__ARM_EABI__)\n  uintptr_t GetStackPointer() {\n    return ucontext_->uc_mcontext.arm_sp;\n  }\n\n  uintptr_t GetInstructionPointer() {\n    return ucontext_->uc_mcontext.arm_ip;\n  }\n#else\n#error \"This code has not been ported to your platform yet.\"\n#endif\n\n  void NullifyDirectoryEntry(MDRawDirectory* dirent) {\n    dirent->stream_type = 0;\n    dirent->location.data_size = 0;\n    dirent->location.rva = 0;\n  }\n\n  bool WriteCPUInformation(MDRawSystemInfo* sys_info) {\n    char vendor_id[sizeof(sys_info->cpu.x86_cpu_info.vendor_id) + 1] = {0};\n    static const char vendor_id_name[] = \"vendor_id\";\n    static const size_t vendor_id_name_length = sizeof(vendor_id_name) - 1;\n\n    struct CpuInfoEntry {\n      const char* info_name;\n      int value;\n      bool found;\n    } cpu_info_table[] = {\n      { \"processor\", -1, false },\n      { \"model\", 0, false },\n      { \"stepping\",  0, false },\n      { \"cpu family\", 0, false },\n    };\n\n    // processor_architecture should always be set, do this first\n    sys_info->processor_architecture =\n#if defined(__i386)\n        MD_CPU_ARCHITECTURE_X86;\n#elif defined(__x86_64)\n        MD_CPU_ARCHITECTURE_AMD64;\n#elif defined(__arm__)\n        MD_CPU_ARCHITECTURE_ARM;\n#else\n#error \"Unknown CPU arch\"\n#endif\n\n    const int fd = sys_open(\"/proc/cpuinfo\", O_RDONLY, 0);\n    if (fd < 0)\n      return false;\n\n    {\n      PageAllocator allocator;\n      LineReader* const line_reader = new(allocator) LineReader(fd);\n      const char* line;\n      unsigned line_len;\n      while (line_reader->GetNextLine(&line, &line_len)) {\n        for (size_t i = 0;\n             i < sizeof(cpu_info_table) / sizeof(cpu_info_table[0]);\n             i++) {\n          CpuInfoEntry* entry = &cpu_info_table[i];\n          if (entry->found && i)\n            continue;\n          if (!strncmp(line, entry->info_name, strlen(entry->info_name))) {\n            const char* value = strchr(line, ':');\n            if (!value)\n              continue;\n\n            // the above strncmp only matches the prefix, it might be the wrong\n            // line. i.e. we matched \"model name\" instead of \"model\".\n            // check and make sure there is only spaces between the prefix and\n            // the colon.\n            const char* space_ptr = line + strlen(entry->info_name);\n            for (; space_ptr < value; space_ptr++) {\n              if (!isspace(*space_ptr)) {\n                break;\n              }\n            }\n            if (space_ptr != value)\n              continue;\n\n            sscanf(++value, \" %d\", &(entry->value));\n            entry->found = true;\n          }\n        }\n\n        // special case for vendor_id\n        if (!strncmp(line, vendor_id_name, vendor_id_name_length)) {\n          const char* value = strchr(line, ':');\n          if (!value)\n            goto popline;\n\n          // skip ':\" and all the spaces that follows\n          do {\n            value++;\n          } while (isspace(*value));\n\n          if (*value) {\n            size_t length = strlen(value);\n            if (length == 0)\n              goto popline;\n            // we don't want the trailing newline\n            if (value[length - 1] == '\\n')\n              length--;\n            // ensure we have space for the value\n            if (length < sizeof(vendor_id))\n              strncpy(vendor_id, value, length);\n          }\n        }\n\n popline:\n        line_reader->PopLine(line_len);\n      }\n      sys_close(fd);\n    }\n\n    // make sure we got everything we wanted\n    for (size_t i = 0;\n         i < sizeof(cpu_info_table) / sizeof(cpu_info_table[0]);\n         i++) {\n      if (!cpu_info_table[i].found) {\n        return false;\n      }\n    }\n    // /proc/cpuinfo contains cpu id, change it into number by adding one.\n    cpu_info_table[0].value++;\n\n    sys_info->number_of_processors = cpu_info_table[0].value;\n    sys_info->processor_level      = cpu_info_table[3].value;\n    sys_info->processor_revision   = cpu_info_table[1].value << 8 |\n                                     cpu_info_table[2].value;\n\n    if (vendor_id[0] != '\\0') {\n      memcpy(sys_info->cpu.x86_cpu_info.vendor_id, vendor_id,\n             sizeof(sys_info->cpu.x86_cpu_info.vendor_id));\n    }\n    return true;\n  }\n\n  bool WriteFile(MDLocationDescriptor* result, const char* filename) {\n    const int fd = sys_open(filename, O_RDONLY, 0);\n    if (fd < 0)\n      return false;\n\n    // We can't stat the files because several of the files that we want to\n    // read are kernel seqfiles, which always have a length of zero. So we have\n    // to read as much as we can into a buffer.\n    static const unsigned kBufSize = 1024 - 2*sizeof(void*);\n    struct Buffers {\n      Buffers* next;\n      size_t len;\n      uint8_t data[kBufSize];\n    } *buffers = reinterpret_cast<Buffers*>(Alloc(sizeof(Buffers)));\n    buffers->next = NULL;\n    buffers->len = 0;\n\n    size_t total = 0;\n    for (Buffers* bufptr = buffers;;) {\n      ssize_t r;\n      do {\n        r = sys_read(fd, &bufptr->data[bufptr->len], kBufSize - bufptr->len);\n      } while (r == -1 && errno == EINTR);\n\n      if (r < 1)\n        break;\n\n      total += r;\n      bufptr->len += r;\n      if (bufptr->len == kBufSize) {\n        bufptr->next = reinterpret_cast<Buffers*>(Alloc(sizeof(Buffers)));\n        bufptr = bufptr->next;\n        bufptr->next = NULL;\n        bufptr->len = 0;\n      }\n    }\n    sys_close(fd);\n\n    if (!total)\n      return false;\n\n    UntypedMDRVA memory(&minidump_writer_);\n    if (!memory.Allocate(total))\n      return false;\n    for (MDRVA pos = memory.position(); buffers; buffers = buffers->next) {\n      // Check for special case of a zero-length buffer.  This should only\n      // occur if a file's size happens to be a multiple of the buffer's\n      // size, in which case the final sys_read() will have resulted in\n      // zero bytes being read after the final buffer was just allocated.\n      if (buffers->len == 0) {\n        // This can only occur with final buffer.\n        assert(buffers->next == NULL);\n        continue;\n      }\n      memory.Copy(pos, &buffers->data, buffers->len);\n      pos += buffers->len;\n    }\n    *result = memory.location();\n    return true;\n  }\n\n  bool WriteOSInformation(MDRawSystemInfo* sys_info) {\n    sys_info->platform_id = MD_OS_LINUX;\n\n    struct utsname uts;\n    if (uname(&uts))\n      return false;\n\n    static const size_t buf_len = 512;\n    char buf[buf_len] = {0};\n    size_t space_left = buf_len - 1;\n    const char* info_table[] = {\n      uts.sysname,\n      uts.release,\n      uts.version,\n      uts.machine,\n      NULL\n    };\n    bool first_item = true;\n    for (const char** cur_info = info_table; *cur_info; cur_info++) {\n      static const char* separator = \" \";\n      size_t separator_len = strlen(separator);\n      size_t info_len = strlen(*cur_info);\n      if (info_len == 0)\n        continue;\n\n      if (space_left < info_len + (first_item ? 0 : separator_len))\n        break;\n\n      if (!first_item) {\n        strcat(buf, separator);\n        space_left -= separator_len;\n      }\n\n      first_item = false;\n      strcat(buf, *cur_info);\n      space_left -= info_len;\n    }\n\n    MDLocationDescriptor location;\n    if (!minidump_writer_.WriteString(buf, 0, &location))\n      return false;\n    sys_info->csd_version_rva = location.rva;\n\n    return true;\n  }\n\n  bool WriteProcFile(MDLocationDescriptor* result, pid_t pid,\n                     const char* filename) {\n    char buf[NAME_MAX];\n    if (!dumper_->BuildProcPath(buf, pid, filename))\n      return false;\n    return WriteFile(result, buf);\n  }\n\n  const char* const filename_;  // output filename\n  const struct ucontext* const ucontext_;  // also from the signal handler\n  const struct _libc_fpstate* const float_state_;  // ditto\n  LinuxDumper* dumper_;\n  MinidumpFileWriter minidump_writer_;\n  MDLocationDescriptor crashing_thread_context_;\n  // Blocks of memory written to the dump. These are all currently\n  // written while writing the thread list stream, but saved here\n  // so a memory list stream can be written afterwards.\n  wasteful_vector<MDMemoryDescriptor> memory_blocks_;\n  // Additional information about some mappings provided by the caller.\n  const MappingList& mapping_list_;\n};\n\nbool WriteMinidump(const char* filename, pid_t crashing_process,\n                   const void* blob, size_t blob_size) {\n  MappingList m;\n  return WriteMinidump(filename, crashing_process, blob, blob_size, m);\n}\n\nbool WriteMinidump(const char* filename, pid_t crashing_process,\n                   const void* blob, size_t blob_size,\n                   const MappingList& mappings) {\n  if (blob_size != sizeof(ExceptionHandler::CrashContext))\n    return false;\n  const ExceptionHandler::CrashContext* context =\n      reinterpret_cast<const ExceptionHandler::CrashContext*>(blob);\n  LinuxPtraceDumper dumper(crashing_process);\n  dumper.set_crash_address(\n      reinterpret_cast<uintptr_t>(context->siginfo.si_addr));\n  dumper.set_crash_signal(context->siginfo.si_signo);\n  dumper.set_crash_thread(context->tid);\n  MinidumpWriter writer(filename, context, mappings, &dumper);\n  if (!writer.Init())\n    return false;\n  return writer.Dump();\n}\n\nbool WriteMinidump(const char* filename,\n                   const MappingList& mappings,\n                   LinuxDumper* dumper) {\n  MinidumpWriter writer(filename, NULL, mappings, dumper);\n  if (!writer.Init())\n    return false;\n  return writer.Dump();\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/minidump_writer.h",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_\n#define CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_\n\n#include <stdint.h>\n#include <unistd.h>\n\n#include <list>\n#include <utility>\n\n#include \"client/linux/minidump_writer/linux_dumper.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n\nnamespace google_breakpad {\n\nclass ExceptionHandler;\n\nstruct MappingEntry {\n  MappingInfo first;\n  u_int8_t second[sizeof(MDGUID)];\n};\n\n// A list of <MappingInfo, GUID>\ntypedef std::list<MappingEntry> MappingList;\n\n// Write a minidump to the filesystem. This function does not malloc nor use\n// libc functions which may. Thus, it can be used in contexts where the state\n// of the heap may be corrupt.\n//   filename: the filename to write to. This is opened O_EXCL and fails if\n//     open fails.\n//   crashing_process: the pid of the crashing process. This must be trusted.\n//   blob: a blob of data from the crashing process. See exception_handler.h\n//   blob_size: the length of |blob|, in bytes\n//\n// Returns true iff successful.\nbool WriteMinidump(const char* filename, pid_t crashing_process,\n                   const void* blob, size_t blob_size);\n\n// This overload also allows passing a list of known mappings.\nbool WriteMinidump(const char* filename, pid_t crashing_process,\n                   const void* blob, size_t blob_size,\n                   const MappingList& mappings);\n\nbool WriteMinidump(const char* filename,\n                   const MappingList& mappings,\n                   LinuxDumper* dumper);\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/minidump_writer/minidump_writer_unittest.cc",
    "content": "// Copyright (c) 2011 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <fcntl.h>\n#include <sys/poll.h>\n#include <sys/stat.h>\n#include <sys/syscall.h>\n#include <sys/types.h>\n#include <unistd.h>\n\n#include <string>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"client/linux/handler/exception_handler.h\"\n#include \"client/linux/minidump_writer/linux_dumper.h\"\n#include \"client/linux/minidump_writer/minidump_writer.h\"\n#include \"common/linux/eintr_wrapper.h\"\n#include \"common/linux/file_id.h\"\n#include \"common/linux/safe_readlink.h\"\n#include \"common/tests/auto_tempdir.h\"\n#include \"google_breakpad/processor/minidump.h\"\n\nusing namespace google_breakpad;\n\n// Length of a formatted GUID string =\n// sizeof(MDGUID) * 2 + 4 (for dashes) + 1 (null terminator)\nconst int kGUIDStringSize = 37;\n\nnamespace {\ntypedef testing::Test MinidumpWriterTest;\n}\n\nTEST(MinidumpWriterTest, Setup) {\n  int fds[2];\n  ASSERT_NE(-1, pipe(fds));\n\n  const pid_t child = fork();\n  if (child == 0) {\n    close(fds[1]);\n    char b;\n    HANDLE_EINTR(read(fds[0], &b, sizeof(b)));\n    close(fds[0]);\n    syscall(__NR_exit);\n  }\n  close(fds[0]);\n\n  ExceptionHandler::CrashContext context;\n  memset(&context, 0, sizeof(context));\n\n  AutoTempDir temp_dir;\n  std::string templ = temp_dir.path() + \"/minidump-writer-unittest\";\n  // Set a non-zero tid to avoid tripping asserts.\n  context.tid = 1;\n  ASSERT_TRUE(WriteMinidump(templ.c_str(), child, &context, sizeof(context)));\n  struct stat st;\n  ASSERT_EQ(stat(templ.c_str(), &st), 0);\n  ASSERT_GT(st.st_size, 0u);\n\n  close(fds[1]);\n}\n\n// Test that mapping info can be specified when writing a minidump,\n// and that it ends up in the module list of the minidump.\nTEST(MinidumpWriterTest, MappingInfo) {\n  int fds[2];\n  ASSERT_NE(-1, pipe(fds));\n\n  // These are defined here so the parent can use them to check the\n  // data from the minidump afterwards.\n  const u_int32_t kMemorySize = sysconf(_SC_PAGESIZE);\n  const char* kMemoryName = \"a fake module\";\n  const u_int8_t kModuleGUID[sizeof(MDGUID)] = {\n    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,\n    0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF\n  };\n  char module_identifier_buffer[kGUIDStringSize];\n  FileID::ConvertIdentifierToString(kModuleGUID,\n                                    module_identifier_buffer,\n                                    sizeof(module_identifier_buffer));\n  string module_identifier(module_identifier_buffer);\n  // Strip out dashes\n  size_t pos;\n  while ((pos = module_identifier.find('-')) != string::npos) {\n    module_identifier.erase(pos, 1);\n  }\n  // And append a zero, because module IDs include an \"age\" field\n  // which is always zero on Linux.\n  module_identifier += \"0\";\n\n  // Get some memory.\n  char* memory =\n    reinterpret_cast<char*>(mmap(NULL,\n                                 kMemorySize,\n                                 PROT_READ | PROT_WRITE,\n                                 MAP_PRIVATE | MAP_ANON,\n                                 -1,\n                                 0));\n  const uintptr_t kMemoryAddress = reinterpret_cast<uintptr_t>(memory);\n  ASSERT_TRUE(memory);\n\n  const pid_t child = fork();\n  if (child == 0) {\n    close(fds[1]);\n    char b;\n    HANDLE_EINTR(read(fds[0], &b, sizeof(b)));\n    close(fds[0]);\n    syscall(__NR_exit);\n  }\n  close(fds[0]);\n\n  ExceptionHandler::CrashContext context;\n  memset(&context, 0, sizeof(context));\n  context.tid = 1;\n\n  AutoTempDir temp_dir;\n  std::string templ = temp_dir.path() + \"/minidump-writer-unittest\";\n\n  // Add information about the mapped memory.\n  MappingInfo info;\n  info.start_addr = kMemoryAddress;\n  info.size = kMemorySize;\n  info.offset = 0;\n  strcpy(info.name, kMemoryName);\n\n  MappingList mappings;\n  MappingEntry mapping;\n  mapping.first = info;\n  memcpy(mapping.second, kModuleGUID, sizeof(MDGUID));\n  mappings.push_back(mapping);\n  ASSERT_TRUE(WriteMinidump(templ.c_str(), child, &context, sizeof(context),\n                            mappings));\n\n  // Read the minidump. Load the module list, and ensure that\n  // the mmap'ed |memory| is listed with the given module name\n  // and debug ID.\n  Minidump minidump(templ.c_str());\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpModuleList* module_list = minidump.GetModuleList();\n  ASSERT_TRUE(module_list);\n  const MinidumpModule* module =\n    module_list->GetModuleForAddress(kMemoryAddress);\n  ASSERT_TRUE(module);\n\n  EXPECT_EQ(kMemoryAddress, module->base_address());\n  EXPECT_EQ(kMemorySize, module->size());\n  EXPECT_EQ(kMemoryName, module->code_file());\n  EXPECT_EQ(module_identifier, module->debug_identifier());\n\n  close(fds[1]);\n}\n\n// Test that mapping info can be specified, and that it overrides\n// existing mappings that are wholly contained within the specified\n// range.\nTEST(MinidumpWriterTest, MappingInfoContained) {\n  int fds[2];\n  ASSERT_NE(-1, pipe(fds));\n\n  // These are defined here so the parent can use them to check the\n  // data from the minidump afterwards.\n  const u_int32_t kMemorySize = sysconf(_SC_PAGESIZE);\n  const char* kMemoryName = \"a fake module\";\n  const u_int8_t kModuleGUID[sizeof(MDGUID)] = {\n    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,\n    0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF\n  };\n  char module_identifier_buffer[kGUIDStringSize];\n  FileID::ConvertIdentifierToString(kModuleGUID,\n                                    module_identifier_buffer,\n                                    sizeof(module_identifier_buffer));\n  string module_identifier(module_identifier_buffer);\n  // Strip out dashes\n  size_t pos;\n  while ((pos = module_identifier.find('-')) != string::npos) {\n    module_identifier.erase(pos, 1);\n  }\n  // And append a zero, because module IDs include an \"age\" field\n  // which is always zero on Linux.\n  module_identifier += \"0\";\n\n  // mmap a file\n  AutoTempDir temp_dir;\n  std::string tempfile = temp_dir.path() + \"/minidump-writer-unittest-temp\";\n  int fd = open(tempfile.c_str(), O_RDWR | O_CREAT, 0);\n  ASSERT_NE(-1, fd);\n  unlink(tempfile.c_str());\n  // fill with zeros\n  char buffer[kMemorySize];\n  memset(buffer, 0, kMemorySize);\n  ASSERT_EQ(kMemorySize, write(fd, buffer, kMemorySize));\n  lseek(fd, 0, SEEK_SET);\n\n  char* memory =\n    reinterpret_cast<char*>(mmap(NULL,\n                                 kMemorySize,\n                                 PROT_READ | PROT_WRITE,\n                                 MAP_PRIVATE,\n                                 fd,\n                                 0));\n  const uintptr_t kMemoryAddress = reinterpret_cast<uintptr_t>(memory);\n  ASSERT_TRUE(memory);\n  close(fd);\n\n  const pid_t child = fork();\n  if (child == 0) {\n    close(fds[1]);\n    char b;\n    HANDLE_EINTR(read(fds[0], &b, sizeof(b)));\n    close(fds[0]);\n    syscall(__NR_exit);\n  }\n  close(fds[0]);\n\n  ExceptionHandler::CrashContext context;\n  memset(&context, 0, sizeof(context));\n  context.tid = 1;\n\n  std::string dumpfile = temp_dir.path() + \"/minidump-writer-unittest\";\n\n  // Add information about the mapped memory. Report it as being larger than\n  // it actually is.\n  MappingInfo info;\n  info.start_addr = kMemoryAddress - kMemorySize;\n  info.size = kMemorySize * 3;\n  info.offset = 0;\n  strcpy(info.name, kMemoryName);\n\n  MappingList mappings;\n  MappingEntry mapping;\n  mapping.first = info;\n  memcpy(mapping.second, kModuleGUID, sizeof(MDGUID));\n  mappings.push_back(mapping);\n  ASSERT_TRUE(\n      WriteMinidump(dumpfile.c_str(), child, &context, sizeof(context),\n                    mappings));\n\n  // Read the minidump. Load the module list, and ensure that\n  // the mmap'ed |memory| is listed with the given module name\n  // and debug ID.\n  Minidump minidump(dumpfile.c_str());\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpModuleList* module_list = minidump.GetModuleList();\n  ASSERT_TRUE(module_list);\n  const MinidumpModule* module =\n    module_list->GetModuleForAddress(kMemoryAddress);\n  ASSERT_TRUE(module);\n\n  EXPECT_EQ(info.start_addr, module->base_address());\n  EXPECT_EQ(info.size, module->size());\n  EXPECT_EQ(kMemoryName, module->code_file());\n  EXPECT_EQ(module_identifier, module->debug_identifier());\n\n  close(fds[1]);\n}\n\nTEST(MinidumpWriterTest, DeletedBinary) {\n  static const int kNumberOfThreadsInHelperProgram = 1;\n  char kNumberOfThreadsArgument[2];\n  sprintf(kNumberOfThreadsArgument, \"%d\", kNumberOfThreadsInHelperProgram);\n\n  // Locate helper binary next to the current binary.\n  char self_path[PATH_MAX];\n  if (!SafeReadLink(\"/proc/self/exe\", self_path)) {\n    FAIL() << \"readlink failed\";\n    exit(1);\n  }\n  string helper_path(self_path);\n  size_t pos = helper_path.rfind('/');\n  if (pos == string::npos) {\n    FAIL() << \"no trailing slash in path: \" << helper_path;\n    exit(1);\n  }\n  helper_path.erase(pos + 1);\n  helper_path += \"linux_dumper_unittest_helper\";\n\n  // Copy binary to a temp file.\n  AutoTempDir temp_dir;\n  std::string binpath = temp_dir.path() + \"/linux-dumper-unittest-helper\";\n  char cmdline[2 * PATH_MAX];\n  sprintf(cmdline, \"/bin/cp \\\"%s\\\" \\\"%s\\\"\", helper_path.c_str(),\n          binpath.c_str());\n  ASSERT_EQ(0, system(cmdline));\n  ASSERT_EQ(0, chmod(binpath.c_str(), 0755));\n\n  int fds[2];\n  ASSERT_NE(-1, pipe(fds));\n\n  pid_t child_pid = fork();\n  if (child_pid == 0) {\n    // In child process.\n    close(fds[0]);\n\n    // Pass the pipe fd and the number of threads as arguments.\n    char pipe_fd_string[8];\n    sprintf(pipe_fd_string, \"%d\", fds[1]);\n    execl(binpath.c_str(),\n          binpath.c_str(),\n          pipe_fd_string,\n          kNumberOfThreadsArgument,\n          NULL);\n  }\n  close(fds[1]);\n  // Wait for the child process to signal that it's ready.\n  struct pollfd pfd;\n  memset(&pfd, 0, sizeof(pfd));\n  pfd.fd = fds[0];\n  pfd.events = POLLIN | POLLERR;\n\n  const int r = HANDLE_EINTR(poll(&pfd, 1, 1000));\n  ASSERT_EQ(1, r);\n  ASSERT_TRUE(pfd.revents & POLLIN);\n  uint8_t junk;\n  const int nr = HANDLE_EINTR(read(fds[0], &junk, sizeof(junk)));\n  ASSERT_EQ(sizeof(junk), nr);\n  close(fds[0]);\n\n  // Child is ready now.\n  // Unlink the test binary.\n  unlink(binpath.c_str());\n\n  ExceptionHandler::CrashContext context;\n  memset(&context, 0, sizeof(context));\n\n  std::string templ = temp_dir.path() + \"/minidump-writer-unittest\";\n  // Set a non-zero tid to avoid tripping asserts.\n  context.tid = 1;\n  ASSERT_TRUE(WriteMinidump(templ.c_str(), child_pid, &context,\n                            sizeof(context)));\n  kill(child_pid, SIGKILL);\n\n  struct stat st;\n  ASSERT_EQ(stat(templ.c_str(), &st), 0);\n  ASSERT_GT(st.st_size, 0u);\n\n\n\n  Minidump minidump(templ.c_str());\n  ASSERT_TRUE(minidump.Read());\n\n  // Check that the main module filename is correct.\n  MinidumpModuleList* module_list = minidump.GetModuleList();\n  ASSERT_TRUE(module_list);\n  const MinidumpModule* module = module_list->GetMainModule();\n  EXPECT_STREQ(binpath.c_str(), module->code_file().c_str());\n  // Check that the file ID is correct.\n  FileID fileid(helper_path.c_str());\n  uint8_t identifier[sizeof(MDGUID)];\n  EXPECT_TRUE(fileid.ElfFileIdentifier(identifier));\n  char identifier_string[kGUIDStringSize];\n  FileID::ConvertIdentifierToString(identifier,\n                                    identifier_string,\n                                    kGUIDStringSize);\n  string module_identifier(identifier_string);\n  // Strip out dashes\n  while ((pos = module_identifier.find('-')) != string::npos) {\n    module_identifier.erase(pos, 1);\n  }\n  // And append a zero, because module IDs include an \"age\" field\n  // which is always zero on Linux.\n  module_identifier += \"0\";\n  EXPECT_EQ(module_identifier, module->debug_identifier());\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/linux/sender/google_crash_report_sender.cc",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"common/linux/google_crashdump_uploader.h\"\n#include \"third_party/linux/include/gflags/gflags.h\"\n#include <string>\n#include <iostream>\n\nusing std::string;\n\nDEFINE_string(crash_server, \"https://clients2.google.com/cr\",\n              \"The crash server to upload minidumps to.\");\nDEFINE_string(product_name, \"\",\n              \"The product name that the minidump corresponds to.\");\nDEFINE_string(product_version, \"\",\n              \"The version of the product that produced the minidump.\");\nDEFINE_string(client_id, \"\",\n              \"The client GUID\");\nDEFINE_string(minidump_path, \"\",\n              \"The path of the minidump file.\");\nDEFINE_string(ptime, \"\",\n              \"The process uptime in milliseconds.\");\nDEFINE_string(ctime, \"\",\n              \"The cumulative process uptime in milliseconds.\");\nDEFINE_string(email, \"\",\n              \"The user's email address.\");\nDEFINE_string(comments, \"\",\n              \"Extra user comments\");\nDEFINE_string(proxy_host, \"\",\n              \"Proxy host\");\nDEFINE_string(proxy_userpasswd, \"\",\n              \"Proxy username/password in user:pass format.\");\n\n\nbool CheckForRequiredFlagsOrDie() {\n  std::string error_text = \"\";\n  if (FLAGS_product_name.empty()) {\n    error_text.append(\"\\nProduct name must be specified.\");\n  }\n\n  if (FLAGS_product_version.empty()) {\n    error_text.append(\"\\nProduct version must be specified.\");\n  }\n\n  if (FLAGS_client_id.empty()) {\n    error_text.append(\"\\nClient ID must be specified.\");\n  }\n\n  if (FLAGS_minidump_path.empty()) {\n    error_text.append(\"\\nMinidump pathname must be specified.\");\n  }\n\n  if (!error_text.empty()) {\n    std::cout << error_text;\n    return false;\n  }\n  return true;\n}\n\nint main(int argc, char *argv[]) {\n  google::InitGoogleLogging(argv[0]);\n  google::ParseCommandLineFlags(&argc, &argv, true);\n  if (!CheckForRequiredFlagsOrDie()) {\n    return 1;\n  }\n  google_breakpad::GoogleCrashdumpUploader g(FLAGS_product_name,\n                                             FLAGS_product_version,\n                                             FLAGS_client_id,\n                                             FLAGS_ptime,\n                                             FLAGS_ctime,\n                                             FLAGS_email,\n                                             FLAGS_comments,\n                                             FLAGS_minidump_path,\n                                             FLAGS_crash_server,\n                                             FLAGS_proxy_host,\n                                             FLAGS_proxy_userpasswd);\n  g.Upload();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/Breakpad.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 45;\n\tobjects = {\n\n/* Begin PBXAggregateTarget section */\n\t\tF94585840F782326009A47BF /* All */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = F94585930F78235C009A47BF /* Build configuration list for PBXAggregateTarget \"All\" */;\n\t\t\tbuildPhases = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tF94585880F78232B009A47BF /* PBXTargetDependency */,\n\t\t\t\tF945858A0F78232E009A47BF /* PBXTargetDependency */,\n\t\t\t\tF945858C0F782330009A47BF /* PBXTargetDependency */,\n\t\t\t\tF945858E0F782333009A47BF /* PBXTargetDependency */,\n\t\t\t\tF94585900F782336009A47BF /* PBXTargetDependency */,\n\t\t\t\tF93DE3A70F830D1D00608B94 /* PBXTargetDependency */,\n\t\t\t\tF95BB8B3101F94D300AA053B /* PBXTargetDependency */,\n\t\t\t\tF95BB8B5101F94D300AA053B /* PBXTargetDependency */,\n\t\t\t\tF95BB8B7101F94D300AA053B /* PBXTargetDependency */,\n\t\t\t\t8B31023911F0CF0600FCF3E4 /* PBXTargetDependency */,\n\t\t\t\t8B31051711F1010E00FCF3E4 /* PBXTargetDependency */,\n\t\t\t\t8B31051911F1010E00FCF3E4 /* PBXTargetDependency */,\n\t\t\t\t8B31051B11F1010E00FCF3E4 /* PBXTargetDependency */,\n\t\t\t\t8B31051D11F1010E00FCF3E4 /* PBXTargetDependency */,\n\t\t\t\t8B31051F11F1010E00FCF3E4 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = All;\n\t\t\tproductName = All;\n\t\t};\n/* End PBXAggregateTarget section */\n\n/* Begin PBXBuildFile section */\n\t\t163201D61443019E00C4DBF5 /* ConfigFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 163201D41443019E00C4DBF5 /* ConfigFile.h */; };\n\t\t163201D71443019E00C4DBF5 /* ConfigFile.mm in Sources */ = {isa = PBXBuildFile; fileRef = 163201D51443019E00C4DBF5 /* ConfigFile.mm */; };\n\t\t163201E31443029300C4DBF5 /* ConfigFile.mm in Sources */ = {isa = PBXBuildFile; fileRef = 163201D51443019E00C4DBF5 /* ConfigFile.mm */; };\n\t\t16C7C918147D45AE00776EAD /* BreakpadDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 16C7C917147D45AE00776EAD /* BreakpadDefines.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t16E02DB8147410F0008C604D /* uploader.mm in Sources */ = {isa = PBXBuildFile; fileRef = 16E02DB4147410D4008C604D /* uploader.mm */; };\n\t\t3329D4ED0FA16D820007BBC5 /* Breakpad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3329D4EC0FA16D820007BBC5 /* Breakpad.xib */; };\n\t\t33880C800F9E097100817F82 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 33880C7E0F9E097100817F82 /* InfoPlist.strings */; };\n\t\t4084699D0F5D9CF900FDCA37 /* crash_report_sender.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4084699C0F5D9CF900FDCA37 /* crash_report_sender.icns */; };\n\t\t4D61A25F14F43CFC002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; };\n\t\t4D61A26B14F43D3C002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; };\n\t\t4D61A26C14F43D42002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; };\n\t\t4D61A26D14F43D43002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; };\n\t\t4D61A26E14F43D45002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; };\n\t\t4D61A26F14F43D48002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; };\n\t\t4D72CA0E13DFAD5C006CABE3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CA0D13DFAD5C006CABE3 /* md5.cc */; };\n\t\t4D72CA2513DFAE1C006CABE3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CA0D13DFAD5C006CABE3 /* md5.cc */; };\n\t\t4D72CA2F13DFAE65006CABE3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CA0D13DFAD5C006CABE3 /* md5.cc */; };\n\t\t4D72CA3813DFAE91006CABE3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CA0D13DFAD5C006CABE3 /* md5.cc */; };\n\t\t4D72CA3913DFAE92006CABE3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CA0D13DFAD5C006CABE3 /* md5.cc */; };\n\t\t4DBE49A6134A4F200072546A /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DBE4769134A4F080072546A /* CoreServices.framework */; };\n\t\t4DBE49A7134A4F280072546A /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DBE4769134A4F080072546A /* CoreServices.framework */; };\n\t\t4DBE49A8134A4F380072546A /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DBE4769134A4F080072546A /* CoreServices.framework */; };\n\t\t4DBE49A9134A4F460072546A /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DBE4769134A4F080072546A /* CoreServices.framework */; };\n\t\t8B3101C611F0CD9F00FCF3E4 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; };\n\t\t8B3101C711F0CD9F00FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };\n\t\t8B3101CA11F0CDB000FCF3E4 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D6A5FE840307C02AAC07 /* AppKit.framework */; };\n\t\t8B3101CB11F0CDB000FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };\n\t\t8B3101EA11F0CDE300FCF3E4 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B3101E911F0CDE300FCF3E4 /* SenTestingKit.framework */; };\n\t\t8B31029411F0D54300FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };\n\t\t8B3102E611F0D74C00FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };\n\t\t8B3102EB11F0D78000FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };\n\t\t8B31FC8211EFD2B800FCF3E4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };\n\t\t8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; };\n\t\tD23F4B2E12A7E13200686C8D /* minidump_generator_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = D23F4B2C12A7E13200686C8D /* minidump_generator_test.cc */; };\n\t\tD23F4B3312A7E17700686C8D /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D2F9A41512131EF0002747C1 /* libgtest.a */; };\n\t\tD23F4BB112A868CB00686C8D /* minidump_generator_test_helper.cc in Sources */ = {isa = PBXBuildFile; fileRef = D23F4B9A12A8688800686C8D /* minidump_generator_test_helper.cc */; };\n\t\tD23F4BB812A868F700686C8D /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; };\n\t\tD244536A12426F00009BBCE0 /* logging.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535112426EBB009BBCE0 /* logging.cc */; };\n\t\tD244536B12426F00009BBCE0 /* minidump.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535212426EBB009BBCE0 /* minidump.cc */; };\n\t\tD244536C12426F00009BBCE0 /* pathname_stripper.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535312426EBB009BBCE0 /* pathname_stripper.cc */; };\n\t\tD244536D12426F00009BBCE0 /* basic_code_modules.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244534F12426E98009BBCE0 /* basic_code_modules.cc */; };\n\t\tD244540B12439BA0009BBCE0 /* memory_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244540A12439BA0009BBCE0 /* memory_unittest.cc */; };\n\t\tD246417012BAA40E005170D0 /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; };\n\t\tD246417112BAA41C005170D0 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; };\n\t\tD246417512BAA438005170D0 /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; };\n\t\tD246417612BAA43F005170D0 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; };\n\t\tD246417712BAA444005170D0 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; };\n\t\tD246418412BAA4BA005170D0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };\n\t\tD246418812BAA4E3005170D0 /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; };\n\t\tD246418C12BAA508005170D0 /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; };\n\t\tD246419012BAA52A005170D0 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; };\n\t\tD246419112BAA52F005170D0 /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.c */; };\n\t\tD246419512BAA54C005170D0 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; };\n\t\tD246419612BAA55A005170D0 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; };\n\t\tD24641A012BAA67F005170D0 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; };\n\t\tD24641AF12BAA82D005170D0 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; };\n\t\tD24641EC12BAC6FB005170D0 /* logging.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535112426EBB009BBCE0 /* logging.cc */; };\n\t\tD24641ED12BAC6FB005170D0 /* minidump.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535212426EBB009BBCE0 /* minidump.cc */; };\n\t\tD24641EE12BAC6FB005170D0 /* pathname_stripper.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535312426EBB009BBCE0 /* pathname_stripper.cc */; };\n\t\tD24641EF12BAC6FB005170D0 /* basic_code_modules.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244534F12426E98009BBCE0 /* basic_code_modules.cc */; };\n\t\tD24BBBFD121050F000F3D417 /* breakpadUtilities.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; };\n\t\tD24BBD291211EDB100F3D417 /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; };\n\t\tD24BBD321212CACF00F3D417 /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; };\n\t\tD2A5DD301188633800081F03 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; };\n\t\tD2A5DD401188640400081F03 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; };\n\t\tD2A5DD411188642E00081F03 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; };\n\t\tD2C1DBE412AFC270006917BD /* logging.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535112426EBB009BBCE0 /* logging.cc */; };\n\t\tD2C1DBE512AFC270006917BD /* minidump.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535212426EBB009BBCE0 /* minidump.cc */; };\n\t\tD2C1DBE612AFC270006917BD /* pathname_stripper.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535312426EBB009BBCE0 /* pathname_stripper.cc */; };\n\t\tD2C1DBE712AFC270006917BD /* basic_code_modules.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244534F12426E98009BBCE0 /* basic_code_modules.cc */; };\n\t\tD2F9A3D51212F87C002747C1 /* exception_handler_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A3D41212F87C002747C1 /* exception_handler_test.cc */; };\n\t\tD2F9A43D12131F55002747C1 /* gmock-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A43C12131F55002747C1 /* gmock-all.cc */; };\n\t\tD2F9A44012131F65002747C1 /* gtest_main.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A43E12131F65002747C1 /* gtest_main.cc */; };\n\t\tD2F9A44112131F65002747C1 /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A43F12131F65002747C1 /* gtest-all.cc */; };\n\t\tD2F9A44412131F84002747C1 /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D2F9A41512131EF0002747C1 /* libgtest.a */; };\n\t\tD2F9A4C9121336C7002747C1 /* client_info.h in Headers */ = {isa = PBXBuildFile; fileRef = D2F9A4C4121336C7002747C1 /* client_info.h */; };\n\t\tD2F9A4CA121336C7002747C1 /* crash_generation_client.h in Headers */ = {isa = PBXBuildFile; fileRef = D2F9A4C5121336C7002747C1 /* crash_generation_client.h */; };\n\t\tD2F9A4CB121336C7002747C1 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; };\n\t\tD2F9A4CC121336C7002747C1 /* crash_generation_server.h in Headers */ = {isa = PBXBuildFile; fileRef = D2F9A4C7121336C7002747C1 /* crash_generation_server.h */; };\n\t\tD2F9A4CD121336C7002747C1 /* crash_generation_server.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */; };\n\t\tD2F9A4DF12133AD9002747C1 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; };\n\t\tD2F9A4E012133AD9002747C1 /* crash_generation_server.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */; };\n\t\tD2F9A4E112133AE2002747C1 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; };\n\t\tD2F9A4E212133AE2002747C1 /* crash_generation_server.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */; };\n\t\tD2F9A52E121383A1002747C1 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; };\n\t\tD2F9A52F121383A1002747C1 /* crash_generation_server.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C8121336C7002747C1 /* crash_generation_server.cc */; };\n\t\tD2F9A530121383A1002747C1 /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; };\n\t\tD2F9A531121383A1002747C1 /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */; };\n\t\tD2F9A532121383A1002747C1 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; };\n\t\tD2F9A533121383A1002747C1 /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; };\n\t\tD2F9A534121383A1002747C1 /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; };\n\t\tD2F9A535121383A1002747C1 /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; };\n\t\tD2F9A536121383A1002747C1 /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.c */; };\n\t\tD2F9A537121383A1002747C1 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; };\n\t\tD2F9A538121383A1002747C1 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; };\n\t\tD2F9A539121383A1002747C1 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; };\n\t\tD2F9A53A121383A1002747C1 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; };\n\t\tD2F9A53B121383A1002747C1 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; };\n\t\tD2F9A53C121383A1002747C1 /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; };\n\t\tD2F9A53F121383A1002747C1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };\n\t\tD2F9A541121383A1002747C1 /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D2F9A41512131EF0002747C1 /* libgtest.a */; };\n\t\tD2F9A553121383DC002747C1 /* crash_generation_server_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4CE121336F7002747C1 /* crash_generation_server_test.cc */; };\n\t\tF91AF5D00FD60393009D8BE2 /* BreakpadFramework_Test.mm in Sources */ = {isa = PBXBuildFile; fileRef = F91AF5CF0FD60393009D8BE2 /* BreakpadFramework_Test.mm */; };\n\t\tF91AF6210FD60784009D8BE2 /* Breakpad.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */; };\n\t\tF9286B3A0F7EB25800A4DCC8 /* InspectorMain.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9286B390F7EB25800A4DCC8 /* InspectorMain.mm */; };\n\t\tF92C53B80ECCE7B3009BE4BA /* Inspector.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53B70ECCE7B3009BE4BA /* Inspector.mm */; };\n\t\tF92C554C0ECCF534009BE4BA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };\n\t\tF92C55D00ECD0064009BE4BA /* Breakpad.h in Headers */ = {isa = PBXBuildFile; fileRef = F92C55CE0ECD0064009BE4BA /* Breakpad.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tF92C55D10ECD0064009BE4BA /* Breakpad.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C55CF0ECD0064009BE4BA /* Breakpad.mm */; };\n\t\tF92C56330ECD0DF1009BE4BA /* OnDemandServer.h in Headers */ = {isa = PBXBuildFile; fileRef = F92C56310ECD0DF1009BE4BA /* OnDemandServer.h */; };\n\t\tF92C56340ECD0DF1009BE4BA /* OnDemandServer.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C56320ECD0DF1009BE4BA /* OnDemandServer.mm */; };\n\t\tF92C563F0ECD10CA009BE4BA /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.c */; };\n\t\tF92C56400ECD10CA009BE4BA /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; };\n\t\tF92C56410ECD10CA009BE4BA /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; };\n\t\tF92C56420ECD10CA009BE4BA /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; };\n\t\tF92C56430ECD10CA009BE4BA /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; };\n\t\tF92C56440ECD10CA009BE4BA /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; };\n\t\tF92C56450ECD10CA009BE4BA /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; };\n\t\tF92C56460ECD10CA009BE4BA /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; };\n\t\tF92C56470ECD10CA009BE4BA /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; };\n\t\tF92C56480ECD10CA009BE4BA /* SimpleStringDictionary.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53810ECCE635009BE4BA /* SimpleStringDictionary.mm */; };\n\t\tF92C56490ECD10CA009BE4BA /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; };\n\t\tF92C564A0ECD10CA009BE4BA /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; };\n\t\tF92C564C0ECD10DD009BE4BA /* breakpadUtilities.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; };\n\t\tF92C56570ECD113E009BE4BA /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C554A0ECCF530009BE4BA /* Carbon.framework */; };\n\t\tF92C565C0ECD1158009BE4BA /* breakpadUtilities.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; };\n\t\tF92C565F0ECD116B009BE4BA /* protected_memory_allocator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53720ECCE3FD009BE4BA /* protected_memory_allocator.cc */; };\n\t\tF92C56630ECD1179009BE4BA /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; };\n\t\tF92C56650ECD1185009BE4BA /* breakpadUtilities.dylib in Resources */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; };\n\t\tF92C568A0ECD15F9009BE4BA /* Inspector in Resources */ = {isa = PBXBuildFile; fileRef = F92C53540ECCE349009BE4BA /* Inspector */; };\n\t\tF92C56A90ECE04C5009BE4BA /* crash_report_sender.m in Sources */ = {isa = PBXBuildFile; fileRef = F92C56A80ECE04C5009BE4BA /* crash_report_sender.m */; };\n\t\tF93803CD0F8083B7004D428B /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; };\n\t\tF93803CE0F8083B7004D428B /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; };\n\t\tF93803CF0F8083B7004D428B /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; };\n\t\tF93803D00F8083B7004D428B /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; };\n\t\tF93803D10F8083B7004D428B /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.c */; };\n\t\tF93803D20F8083B7004D428B /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; };\n\t\tF93803D30F8083B7004D428B /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; };\n\t\tF93803D40F8083B7004D428B /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; };\n\t\tF93803D50F8083B7004D428B /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; };\n\t\tF93803D60F8083B7004D428B /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; };\n\t\tF93803D70F8083B7004D428B /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; };\n\t\tF93DE2D80F82A70E00608B94 /* minidump_file_writer_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = F93DE2D70F82A70E00608B94 /* minidump_file_writer_unittest.cc */; };\n\t\tF93DE2D90F82A73500608B94 /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; };\n\t\tF93DE2DA0F82A73500608B94 /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.c */; };\n\t\tF93DE2DB0F82A73500608B94 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; };\n\t\tF93DE3350F82C66B00608B94 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; };\n\t\tF93DE3360F82C66B00608B94 /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; };\n\t\tF93DE3370F82C66B00608B94 /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; };\n\t\tF93DE3380F82C66B00608B94 /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; };\n\t\tF93DE3390F82C66B00608B94 /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.c */; };\n\t\tF93DE33A0F82C66B00608B94 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; };\n\t\tF93DE33B0F82C66B00608B94 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; };\n\t\tF93DE33C0F82C66B00608B94 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; };\n\t\tF93DE33D0F82C66B00608B94 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; };\n\t\tF93DE33E0F82C66B00608B94 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; };\n\t\tF93DE33F0F82C66B00608B94 /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; };\n\t\tF945849E0F280E3C009A47BF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F945849C0F280E3C009A47BF /* Localizable.strings */; };\n\t\tF9B630A0100FF96B00D0F4AC /* goArrow.png in Resources */ = {isa = PBXBuildFile; fileRef = F9B6309F100FF96B00D0F4AC /* goArrow.png */; };\n\t\tF9C44DB20EF07288003AEBAA /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C44DAC0EF07288003AEBAA /* Controller.m */; };\n\t\tF9C44DB30EF07288003AEBAA /* crashduringload in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DAD0EF07288003AEBAA /* crashduringload */; };\n\t\tF9C44DB40EF07288003AEBAA /* crashInMain in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DAE0EF07288003AEBAA /* crashInMain */; };\n\t\tF9C44DB60EF07288003AEBAA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C44DB00EF07288003AEBAA /* main.m */; };\n\t\tF9C44DB70EF07288003AEBAA /* TestClass.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9C44DB10EF07288003AEBAA /* TestClass.mm */; };\n\t\tF9C44DBC0EF072A0003AEBAA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DB80EF072A0003AEBAA /* InfoPlist.strings */; };\n\t\tF9C44DBD0EF072A0003AEBAA /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DBA0EF072A0003AEBAA /* MainMenu.xib */; };\n\t\tF9C44E000EF077CD003AEBAA /* Breakpad.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */; };\n\t\tF9C44E3C0EF08B12003AEBAA /* Breakpad.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */; };\n\t\tF9C44E980EF09F56003AEBAA /* crash_report_sender.app in Resources */ = {isa = PBXBuildFile; fileRef = F92C56A00ECE04A7009BE4BA /* crash_report_sender.app */; };\n\t\tF9C44EA20EF09F93003AEBAA /* HTTPMultipartUpload.m in Sources */ = {isa = PBXBuildFile; fileRef = F92C53770ECCE635009BE4BA /* HTTPMultipartUpload.m */; };\n\t\tF9C44EE50EF0A006003AEBAA /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */; };\n\t\tF9C44EE90EF0A3C1003AEBAA /* GTMLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C44EE80EF0A3C1003AEBAA /* GTMLogger.m */; };\n\t\tF9C77DE20F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9C77DE10F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm */; };\n\t\tF9C77DE40F7DD82F0045F7DB /* SimpleStringDictionary.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53810ECCE635009BE4BA /* SimpleStringDictionary.mm */; };\n\t\tF9C77E130F7DDF810045F7DB /* GTMSenTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C77E120F7DDF810045F7DB /* GTMSenTestCase.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t8B31023811F0CF0600FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = B88FAFC9116BDCAD00407530;\n\t\t\tremoteInfo = all_unittests;\n\t\t};\n\t\t8B31051611F1010E00FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F93803BD0F80820F004D428B;\n\t\t\tremoteInfo = generator_test;\n\t\t};\n\t\t8B31051811F1010E00FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F93DE2D00F82A67300608B94;\n\t\t\tremoteInfo = minidump_file_writer_unittest;\n\t\t};\n\t\t8B31051A11F1010E00FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F93DE32B0F82C55600608B94;\n\t\t\tremoteInfo = handler_test;\n\t\t};\n\t\t8B31051C11F1010E00FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = B89E0E731166575200DD08C9;\n\t\t\tremoteInfo = macho_dump;\n\t\t};\n\t\t8B31051E11F1010E00FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB894101F94C000AA053B /* symupload.xcodeproj */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 9BD835FA0B0544950055103E;\n\t\t\tremoteInfo = minidump_upload;\n\t\t};\n\t\t8B31F7A011EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B89E0E741166575200DD08C9;\n\t\t\tremoteInfo = macho_dump;\n\t\t};\n\t\t8B31F7A211EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B88FB024116BDFFF00407530;\n\t\t\tremoteInfo = gtestmockall;\n\t\t};\n\t\t8B31F7A411EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B88FB14B116CF4A700407530;\n\t\t\tremoteInfo = byte_cursor_unittest;\n\t\t};\n\t\t8B31F7A611EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B89E0E9511665A6400DD08C9;\n\t\t\tremoteInfo = macho_reader_unittest;\n\t\t};\n\t\t8B31F7A811EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B88FB007116BDE8300407530;\n\t\t\tremoteInfo = stabs_reader_unittest;\n\t\t};\n\t\t8B31F7AA11EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B88FB135116CF30F00407530;\n\t\t\tremoteInfo = bytereader_unittest;\n\t\t};\n\t\t8B31F7AC11EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B88FAF2F116A591E00407530;\n\t\t\tremoteInfo = dwarf2reader_cfi_unittest;\n\t\t};\n\t\t8B31F7AE11EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B88FB0DF116CEEA800407530;\n\t\t\tremoteInfo = dwarf2diehandler_unittest;\n\t\t};\n\t\t8B31F7B011EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B88FB10A116CF07900407530;\n\t\t\tremoteInfo = dwarf_cu_to_module_unittest;\n\t\t};\n\t\t8B31F7B211EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B88FB0F2116CEF1900407530;\n\t\t\tremoteInfo = dwarf_line_to_module_unittest;\n\t\t};\n\t\t8B31F7B411EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B88FB11F116CF27F00407530;\n\t\t\tremoteInfo = dwarf_cfi_to_module_unittest;\n\t\t};\n\t\t8B31F7B611EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B84A91F4116CF784006C210E;\n\t\t\tremoteInfo = stabs_to_module_unittest;\n\t\t};\n\t\t8B31F7B811EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = B88FB0B9116CEABF00407530;\n\t\t\tremoteInfo = module_unittest;\n\t\t};\n\t\t8B31F7BA11EF9A8700FCF3E4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = D21F97D211CBA0F200239E38;\n\t\t\tremoteInfo = test_assembler_unittest;\n\t\t};\n\t\tD23F4B2F12A7E16200686C8D /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = D2F9A41412131EF0002747C1;\n\t\t\tremoteInfo = gtest;\n\t\t};\n\t\tD23F4BB912A8694C00686C8D /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = D23F4BAA12A868A500686C8D;\n\t\t\tremoteInfo = minidump_generator_test_helper;\n\t\t};\n\t\tD2F9A44212131F80002747C1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = D2F9A41412131EF0002747C1;\n\t\t\tremoteInfo = gtest;\n\t\t};\n\t\tD2F9A52C121383A1002747C1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = D2F9A41412131EF0002747C1;\n\t\t\tremoteInfo = gtest;\n\t\t};\n\t\tD2F9A5DE12142A6A002747C1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = D2F9A52A121383A1002747C1;\n\t\t\tremoteInfo = crash_generation_server_test;\n\t\t};\n\t\tF91AF6370FD60A74009D8BE2 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8DC2EF4F0486A6940098B216;\n\t\t\tremoteInfo = Breakpad;\n\t\t};\n\t\tF92C564D0ECD10E5009BE4BA /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F92C563B0ECD10B3009BE4BA;\n\t\t\tremoteInfo = breakpadUtilities;\n\t\t};\n\t\tF92C56850ECD15EF009BE4BA /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F92C563B0ECD10B3009BE4BA;\n\t\t\tremoteInfo = breakpadUtilities;\n\t\t};\n\t\tF92C56870ECD15F1009BE4BA /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F92C53530ECCE349009BE4BA;\n\t\t\tremoteInfo = Inspector;\n\t\t};\n\t\tF93DE2FB0F82C3C600608B94 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F93803BD0F80820F004D428B;\n\t\t\tremoteInfo = generator_test;\n\t\t};\n\t\tF93DE36F0F82CC1300608B94 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F93DE32B0F82C55600608B94;\n\t\t\tremoteInfo = handler_test;\n\t\t};\n\t\tF93DE3A60F830D1D00608B94 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F9C77DD90F7DD5CF0045F7DB;\n\t\t\tremoteInfo = UnitTests;\n\t\t};\n\t\tF94585870F78232B009A47BF /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8DC2EF4F0486A6940098B216;\n\t\t\tremoteInfo = Breakpad;\n\t\t};\n\t\tF94585890F78232E009A47BF /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F92C53530ECCE349009BE4BA;\n\t\t\tremoteInfo = Inspector;\n\t\t};\n\t\tF945858B0F782330009A47BF /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F92C563B0ECD10B3009BE4BA;\n\t\t\tremoteInfo = breakpadUtilities;\n\t\t};\n\t\tF945858D0F782333009A47BF /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F92C569F0ECE04A7009BE4BA;\n\t\t\tremoteInfo = crash_report_sender;\n\t\t};\n\t\tF945858F0F782336009A47BF /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F9C44DA40EF060A8003AEBAA;\n\t\t\tremoteInfo = BreakpadTest;\n\t\t};\n\t\tF95BB884101F949F00AA053B /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB87C101F949F00AA053B /* crash_report.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 8DD76FA10486AA7600D96B5E;\n\t\t\tremoteInfo = crash_report;\n\t\t};\n\t\tF95BB891101F94AC00AA053B /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 8DD76FA10486AA7600D96B5E;\n\t\t\tremoteInfo = dump_syms;\n\t\t};\n\t\tF95BB89E101F94C000AA053B /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB894101F94C000AA053B /* symupload.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 8DD76FA10486AA7600D96B5E;\n\t\t\tremoteInfo = symupload;\n\t\t};\n\t\tF95BB8A0101F94C000AA053B /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB894101F94C000AA053B /* symupload.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 9BD835FB0B0544950055103E;\n\t\t\tremoteInfo = minidump_upload;\n\t\t};\n\t\tF95BB8B2101F94D300AA053B /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = B8C5B5101166531A00D34F4E;\n\t\t\tremoteInfo = dump_syms;\n\t\t};\n\t\tF95BB8B4101F94D300AA053B /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB894101F94C000AA053B /* symupload.xcodeproj */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8DD76F960486AA7600D96B5E;\n\t\t\tremoteInfo = symupload;\n\t\t};\n\t\tF95BB8B6101F94D300AA053B /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = F95BB87C101F949F00AA053B /* crash_report.xcodeproj */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8DD76F960486AA7600D96B5E;\n\t\t\tremoteInfo = crash_report;\n\t\t};\n\t\tF9C44E190EF0790F003AEBAA /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8DC2EF4F0486A6940098B216;\n\t\t\tremoteInfo = Breakpad;\n\t\t};\n\t\tF9C44E960EF09F4B003AEBAA /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F92C569F0ECE04A7009BE4BA;\n\t\t\tremoteInfo = crash_report_sender;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\tF9C44E410EF08B17003AEBAA /* Copy Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\tF9C44E3C0EF08B12003AEBAA /* Breakpad.framework in Copy Frameworks */,\n\t\t\t);\n\t\t\tname = \"Copy Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };\n\t\t1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };\n\t\t163201D41443019E00C4DBF5 /* ConfigFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ConfigFile.h; path = crash_generation/ConfigFile.h; sourceTree = \"<group>\"; };\n\t\t163201D51443019E00C4DBF5 /* ConfigFile.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = ConfigFile.mm; path = crash_generation/ConfigFile.mm; sourceTree = \"<group>\"; };\n\t\t163202431443201300C4DBF5 /* uploader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = uploader.h; path = sender/uploader.h; sourceTree = \"<group>\"; };\n\t\t16C7C917147D45AE00776EAD /* BreakpadDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BreakpadDefines.h; sourceTree = \"<group>\"; };\n\t\t16E02DB4147410D4008C604D /* uploader.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = uploader.mm; path = sender/uploader.mm; sourceTree = \"<group>\"; };\n\t\t32DBCF5E0370ADEE00C91783 /* Breakpad_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Breakpad_Prefix.pch; path = Framework/Breakpad_Prefix.pch; sourceTree = \"<group>\"; };\n\t\t3329D4EC0FA16D820007BBC5 /* Breakpad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Breakpad.xib; path = sender/Breakpad.xib; sourceTree = \"<group>\"; };\n\t\t33880C7F0F9E097100817F82 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = sender/English.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t4084699C0F5D9CF900FDCA37 /* crash_report_sender.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = crash_report_sender.icns; path = sender/crash_report_sender.icns; sourceTree = \"<group>\"; };\n\t\t4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bootstrap_compat.cc; path = ../../common/mac/bootstrap_compat.cc; sourceTree = SOURCE_ROOT; };\n\t\t4D61A25E14F43CFC002D5862 /* bootstrap_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bootstrap_compat.h; path = ../../common/mac/bootstrap_compat.h; sourceTree = SOURCE_ROOT; };\n\t\t4D72CA0D13DFAD5C006CABE3 /* md5.cc */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = md5.cc; path = ../../common/md5.cc; sourceTree = SOURCE_ROOT; };\n\t\t4DBE4769134A4F080072546A /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; };\n\t\t8B31007011F0CD3C00FCF3E4 /* GTMDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMDefines.h; path = ../../common/mac/GTMDefines.h; sourceTree = SOURCE_ROOT; };\n\t\t8B3101E911F0CDE300FCF3E4 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };\n\t\t8B31022211F0CE1000FCF3E4 /* GTMGarbageCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMGarbageCollection.h; path = ../../common/mac/GTMGarbageCollection.h; sourceTree = SOURCE_ROOT; };\n\t\t8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadDebug.xcconfig; path = ../../common/mac/BreakpadDebug.xcconfig; sourceTree = SOURCE_ROOT; };\n\t\t8B31027811F0D3AF00FCF3E4 /* BreakpadRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadRelease.xcconfig; path = ../../common/mac/BreakpadRelease.xcconfig; sourceTree = SOURCE_ROOT; };\n\t\t8B31FFF611F0C90500FCF3E4 /* Breakpad.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Breakpad.xcconfig; path = ../../common/mac/Breakpad.xcconfig; sourceTree = SOURCE_ROOT; };\n\t\t8DC2EF5B0486A6940098B216 /* Breakpad.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Breakpad.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD23F4B2C12A7E13200686C8D /* minidump_generator_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_generator_test.cc; path = tests/minidump_generator_test.cc; sourceTree = \"<group>\"; };\n\t\tD23F4B9A12A8688800686C8D /* minidump_generator_test_helper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_generator_test_helper.cc; path = tests/minidump_generator_test_helper.cc; sourceTree = \"<group>\"; };\n\t\tD23F4BAB12A868A500686C8D /* minidump_generator_test_helper */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = minidump_generator_test_helper; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD244534F12426E98009BBCE0 /* basic_code_modules.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = basic_code_modules.cc; path = ../../processor/basic_code_modules.cc; sourceTree = SOURCE_ROOT; };\n\t\tD244535112426EBB009BBCE0 /* logging.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = logging.cc; path = ../../processor/logging.cc; sourceTree = SOURCE_ROOT; };\n\t\tD244535212426EBB009BBCE0 /* minidump.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump.cc; path = ../../processor/minidump.cc; sourceTree = SOURCE_ROOT; };\n\t\tD244535312426EBB009BBCE0 /* pathname_stripper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pathname_stripper.cc; path = ../../processor/pathname_stripper.cc; sourceTree = SOURCE_ROOT; };\n\t\tD244540A12439BA0009BBCE0 /* memory_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = memory_unittest.cc; path = ../../common/memory_unittest.cc; sourceTree = SOURCE_ROOT; };\n\t\tD2F9A3D41212F87C002747C1 /* exception_handler_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = exception_handler_test.cc; path = tests/exception_handler_test.cc; sourceTree = \"<group>\"; };\n\t\tD2F9A41512131EF0002747C1 /* libgtest.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD2F9A43C12131F55002747C1 /* gmock-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = \"gmock-all.cc\"; path = \"../../testing/src/gmock-all.cc\"; sourceTree = SOURCE_ROOT; };\n\t\tD2F9A43E12131F65002747C1 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gtest_main.cc; path = ../../testing/gtest/src/gtest_main.cc; sourceTree = \"<group>\"; };\n\t\tD2F9A43F12131F65002747C1 /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = \"gtest-all.cc\"; path = \"../../testing/gtest/src/gtest-all.cc\"; sourceTree = \"<group>\"; };\n\t\tD2F9A4C4121336C7002747C1 /* client_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = client_info.h; path = crash_generation/client_info.h; sourceTree = \"<group>\"; };\n\t\tD2F9A4C5121336C7002747C1 /* crash_generation_client.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crash_generation_client.h; path = crash_generation/crash_generation_client.h; sourceTree = \"<group>\"; };\n\t\tD2F9A4C6121336C7002747C1 /* crash_generation_client.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = crash_generation_client.cc; path = crash_generation/crash_generation_client.cc; sourceTree = \"<group>\"; };\n\t\tD2F9A4C7121336C7002747C1 /* crash_generation_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crash_generation_server.h; path = crash_generation/crash_generation_server.h; sourceTree = \"<group>\"; };\n\t\tD2F9A4C8121336C7002747C1 /* crash_generation_server.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = crash_generation_server.cc; path = crash_generation/crash_generation_server.cc; sourceTree = \"<group>\"; };\n\t\tD2F9A4CE121336F7002747C1 /* crash_generation_server_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = crash_generation_server_test.cc; path = tests/crash_generation_server_test.cc; sourceTree = \"<group>\"; };\n\t\tD2F9A546121383A1002747C1 /* crash_generation_server_test */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = crash_generation_server_test; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tDE43467411C72855004F095F /* da */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = da; path = sender/da.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\tDE43467511C72857004F095F /* de */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = de; path = sender/de.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\tDE43467611C7285B004F095F /* es */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = es; path = sender/es.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\tDE43467711C72862004F095F /* fr */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = fr; path = sender/fr.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\tDE43467811C72869004F095F /* it */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = it; path = sender/it.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\tDE43467911C7286D004F095F /* nl */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = nl; path = sender/nl.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\tDE43467A11C72873004F095F /* no */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = no; path = sender/no.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\tDE43467B11C72877004F095F /* sl */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = sl; path = sender/sl.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\tDE43467C11C7287A004F095F /* sv */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = sv; path = sender/sv.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\tDE43467E11C728DC004F095F /* ja */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = ja; path = sender/ja.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\tDE43467F11C728E1004F095F /* tr */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = tr; path = sender/tr.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\tDE43468611C72958004F095F /* de */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = de; path = sender/de.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tDE43468711C7295D004F095F /* da */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = da; path = sender/da.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tDE43468811C7295F004F095F /* es */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = es; path = sender/es.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tDE43468911C72964004F095F /* fr */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = fr; path = sender/fr.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tDE43468A11C72967004F095F /* it */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = it; path = sender/it.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tDE43468B11C7296B004F095F /* ja */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = ja; path = sender/ja.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tDE43468C11C7296D004F095F /* nl */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = nl; path = sender/nl.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tDE43468D11C7296F004F095F /* no */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = no; path = sender/no.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tDE43468E11C72971004F095F /* sl */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = sl; path = sender/sl.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tDE43468F11C72973004F095F /* sv */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = sv; path = sender/sv.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tDE43469011C72976004F095F /* tr */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = tr; path = sender/tr.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tF91AF5CF0FD60393009D8BE2 /* BreakpadFramework_Test.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = BreakpadFramework_Test.mm; path = tests/BreakpadFramework_Test.mm; sourceTree = \"<group>\"; };\n\t\tF9286B380F7EB25800A4DCC8 /* Inspector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Inspector.h; path = crash_generation/Inspector.h; sourceTree = \"<group>\"; };\n\t\tF9286B390F7EB25800A4DCC8 /* InspectorMain.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = InspectorMain.mm; path = crash_generation/InspectorMain.mm; sourceTree = \"<group>\"; };\n\t\tF92C53540ECCE349009BE4BA /* Inspector */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = Inspector; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF92C53670ECCE3FD009BE4BA /* breakpad_exc_server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = breakpad_exc_server.c; path = handler/breakpad_exc_server.c; sourceTree = SOURCE_ROOT; };\n\t\tF92C53680ECCE3FD009BE4BA /* breakpad_exc_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = breakpad_exc_server.h; path = handler/breakpad_exc_server.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = breakpad_nlist_64.cc; path = handler/breakpad_nlist_64.cc; sourceTree = SOURCE_ROOT; };\n\t\tF92C536A0ECCE3FD009BE4BA /* breakpad_nlist_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = breakpad_nlist_64.h; path = handler/breakpad_nlist_64.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dynamic_images.cc; path = handler/dynamic_images.cc; sourceTree = SOURCE_ROOT; };\n\t\tF92C536C0ECCE3FD009BE4BA /* dynamic_images.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dynamic_images.h; path = handler/dynamic_images.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C536D0ECCE3FD009BE4BA /* exception_handler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = exception_handler.cc; path = handler/exception_handler.cc; sourceTree = SOURCE_ROOT; };\n\t\tF92C536E0ECCE3FD009BE4BA /* exception_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = exception_handler.h; path = handler/exception_handler.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_generator.cc; path = handler/minidump_generator.cc; sourceTree = SOURCE_ROOT; };\n\t\tF92C53700ECCE3FD009BE4BA /* minidump_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = minidump_generator.h; path = handler/minidump_generator.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C53720ECCE3FD009BE4BA /* protected_memory_allocator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = protected_memory_allocator.cc; path = handler/protected_memory_allocator.cc; sourceTree = SOURCE_ROOT; };\n\t\tF92C53730ECCE3FD009BE4BA /* protected_memory_allocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = protected_memory_allocator.h; path = handler/protected_memory_allocator.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C53740ECCE635009BE4BA /* file_id.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = file_id.cc; path = ../../common/mac/file_id.cc; sourceTree = SOURCE_ROOT; };\n\t\tF92C53750ECCE635009BE4BA /* file_id.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = file_id.h; path = ../../common/mac/file_id.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C53760ECCE635009BE4BA /* HTTPMultipartUpload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTTPMultipartUpload.h; path = ../../common/mac/HTTPMultipartUpload.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C53770ECCE635009BE4BA /* HTTPMultipartUpload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTTPMultipartUpload.m; path = ../../common/mac/HTTPMultipartUpload.m; sourceTree = SOURCE_ROOT; };\n\t\tF92C53780ECCE635009BE4BA /* MachIPC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MachIPC.h; path = ../../common/mac/MachIPC.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C53790ECCE635009BE4BA /* MachIPC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MachIPC.mm; path = ../../common/mac/MachIPC.mm; sourceTree = SOURCE_ROOT; };\n\t\tF92C537A0ECCE635009BE4BA /* macho_id.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_id.cc; path = ../../common/mac/macho_id.cc; sourceTree = SOURCE_ROOT; };\n\t\tF92C537B0ECCE635009BE4BA /* macho_id.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_id.h; path = ../../common/mac/macho_id.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C537C0ECCE635009BE4BA /* macho_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_utilities.cc; path = ../../common/mac/macho_utilities.cc; sourceTree = SOURCE_ROOT; };\n\t\tF92C537D0ECCE635009BE4BA /* macho_utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_utilities.h; path = ../../common/mac/macho_utilities.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C537E0ECCE635009BE4BA /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_walker.cc; path = ../../common/mac/macho_walker.cc; sourceTree = SOURCE_ROOT; };\n\t\tF92C537F0ECCE635009BE4BA /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../common/mac/macho_walker.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C53800ECCE635009BE4BA /* SimpleStringDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleStringDictionary.h; path = ../../common/mac/SimpleStringDictionary.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C53810ECCE635009BE4BA /* SimpleStringDictionary.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SimpleStringDictionary.mm; path = ../../common/mac/SimpleStringDictionary.mm; sourceTree = SOURCE_ROOT; };\n\t\tF92C53820ECCE635009BE4BA /* string_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = string_utilities.cc; path = ../../common/mac/string_utilities.cc; sourceTree = SOURCE_ROOT; };\n\t\tF92C53830ECCE635009BE4BA /* string_utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = string_utilities.h; path = ../../common/mac/string_utilities.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C53850ECCE6AD009BE4BA /* string_conversion.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = string_conversion.cc; path = ../../common/string_conversion.cc; sourceTree = SOURCE_ROOT; };\n\t\tF92C53860ECCE6AD009BE4BA /* string_conversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = string_conversion.h; path = ../../common/string_conversion.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C53870ECCE6C0009BE4BA /* convert_UTF.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = convert_UTF.c; path = ../../common/convert_UTF.c; sourceTree = SOURCE_ROOT; };\n\t\tF92C53880ECCE6C0009BE4BA /* convert_UTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = convert_UTF.h; path = ../../common/convert_UTF.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C538E0ECCE70A009BE4BA /* minidump_file_writer-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"minidump_file_writer-inl.h\"; path = \"../minidump_file_writer-inl.h\"; sourceTree = SOURCE_ROOT; };\n\t\tF92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_file_writer.cc; path = ../minidump_file_writer.cc; sourceTree = SOURCE_ROOT; };\n\t\tF92C53900ECCE70A009BE4BA /* minidump_file_writer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = minidump_file_writer.h; path = ../minidump_file_writer.h; sourceTree = SOURCE_ROOT; };\n\t\tF92C53B70ECCE7B3009BE4BA /* Inspector.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Inspector.mm; path = crash_generation/Inspector.mm; sourceTree = SOURCE_ROOT; };\n\t\tF92C554A0ECCF530009BE4BA /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };\n\t\tF92C55CE0ECD0064009BE4BA /* Breakpad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Breakpad.h; path = Framework/Breakpad.h; sourceTree = \"<group>\"; };\n\t\tF92C55CF0ECD0064009BE4BA /* Breakpad.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Breakpad.mm; path = Framework/Breakpad.mm; sourceTree = \"<group>\"; };\n\t\tF92C56310ECD0DF1009BE4BA /* OnDemandServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OnDemandServer.h; path = Framework/OnDemandServer.h; sourceTree = \"<group>\"; };\n\t\tF92C56320ECD0DF1009BE4BA /* OnDemandServer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = OnDemandServer.mm; path = Framework/OnDemandServer.mm; sourceTree = \"<group>\"; };\n\t\tF92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.dylib\"; includeInIndex = 0; path = breakpadUtilities.dylib; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF92C56A00ECE04A7009BE4BA /* crash_report_sender.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = crash_report_sender.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF92C56A20ECE04A7009BE4BA /* crash_report_sender-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = \"crash_report_sender-Info.plist\"; path = \"sender/crash_report_sender-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tF92C56A70ECE04C5009BE4BA /* crash_report_sender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crash_report_sender.h; path = sender/crash_report_sender.h; sourceTree = \"<group>\"; };\n\t\tF92C56A80ECE04C5009BE4BA /* crash_report_sender.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = crash_report_sender.m; path = sender/crash_report_sender.m; sourceTree = \"<group>\"; };\n\t\tF93803BE0F80820F004D428B /* generator_test */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = generator_test; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF93DE2D10F82A67300608B94 /* minidump_file_writer_unittest */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = minidump_file_writer_unittest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF93DE2D70F82A70E00608B94 /* minidump_file_writer_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_file_writer_unittest.cc; path = ../minidump_file_writer_unittest.cc; sourceTree = SOURCE_ROOT; };\n\t\tF93DE32C0F82C55600608B94 /* handler_test */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = handler_test; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF945849D0F280E3C009A47BF /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = sender/English.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\tF945859D0F78241E009A47BF /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Framework/Info.plist; sourceTree = \"<group>\"; };\n\t\tF95BB87C101F949F00AA053B /* crash_report.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = crash_report.xcodeproj; path = ../../tools/mac/crash_report/crash_report.xcodeproj; sourceTree = SOURCE_ROOT; };\n\t\tF95BB889101F94AC00AA053B /* dump_syms.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = dump_syms.xcodeproj; path = ../../tools/mac/dump_syms/dump_syms.xcodeproj; sourceTree = SOURCE_ROOT; };\n\t\tF95BB894101F94C000AA053B /* symupload.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = symupload.xcodeproj; path = ../../tools/mac/symupload/symupload.xcodeproj; sourceTree = SOURCE_ROOT; };\n\t\tF9B6309F100FF96B00D0F4AC /* goArrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = goArrow.png; path = sender/goArrow.png; sourceTree = \"<group>\"; };\n\t\tF9C44DA50EF060A8003AEBAA /* BreakpadTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BreakpadTest.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF9C44DAC0EF07288003AEBAA /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Controller.m; path = testapp/Controller.m; sourceTree = \"<group>\"; };\n\t\tF9C44DAD0EF07288003AEBAA /* crashduringload */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.executable\"; name = crashduringload; path = testapp/crashduringload; sourceTree = \"<group>\"; };\n\t\tF9C44DAE0EF07288003AEBAA /* crashInMain */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.executable\"; name = crashInMain; path = testapp/crashInMain; sourceTree = \"<group>\"; };\n\t\tF9C44DAF0EF07288003AEBAA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = testapp/Info.plist; sourceTree = \"<group>\"; };\n\t\tF9C44DB00EF07288003AEBAA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = testapp/main.m; sourceTree = \"<group>\"; };\n\t\tF9C44DB10EF07288003AEBAA /* TestClass.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = TestClass.mm; path = testapp/TestClass.mm; sourceTree = \"<group>\"; };\n\t\tF9C44DB90EF072A0003AEBAA /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = testapp/English.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tF9C44DBB0EF072A0003AEBAA /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = testapp/English.lproj/MainMenu.xib; sourceTree = \"<group>\"; };\n\t\tF9C44DBF0EF0778F003AEBAA /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Controller.h; path = testapp/Controller.h; sourceTree = \"<group>\"; };\n\t\tF9C44DC00EF0778F003AEBAA /* TestClass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestClass.h; path = testapp/TestClass.h; sourceTree = \"<group>\"; };\n\t\tF9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };\n\t\tF9C44EE70EF0A3C1003AEBAA /* GTMLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMLogger.h; path = ../../common/mac/GTMLogger.h; sourceTree = SOURCE_ROOT; };\n\t\tF9C44EE80EF0A3C1003AEBAA /* GTMLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMLogger.m; path = ../../common/mac/GTMLogger.m; sourceTree = SOURCE_ROOT; };\n\t\tF9C77DDA0F7DD5CF0045F7DB /* UnitTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF9C77DDB0F7DD5CF0045F7DB /* UnitTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"UnitTests-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tF9C77DE00F7DD7E30045F7DB /* SimpleStringDictionaryTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleStringDictionaryTest.h; path = tests/SimpleStringDictionaryTest.h; sourceTree = \"<group>\"; };\n\t\tF9C77DE10F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SimpleStringDictionaryTest.mm; path = tests/SimpleStringDictionaryTest.mm; sourceTree = \"<group>\"; };\n\t\tF9C77E110F7DDF810045F7DB /* GTMSenTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMSenTestCase.h; path = ../../common/mac/testing/GTMSenTestCase.h; sourceTree = SOURCE_ROOT; };\n\t\tF9C77E120F7DDF810045F7DB /* GTMSenTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMSenTestCase.m; path = ../../common/mac/testing/GTMSenTestCase.m; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t8DC2EF560486A6940098B216 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF92C565C0ECD1158009BE4BA /* breakpadUtilities.dylib in Frameworks */,\n\t\t\t\t8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD23F4BA912A868A500686C8D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD246418412BAA4BA005170D0 /* Foundation.framework in Frameworks */,\n\t\t\t\t4DBE49A6134A4F200072546A /* CoreServices.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD2F9A41312131EF0002747C1 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD2F9A53E121383A1002747C1 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD2F9A53F121383A1002747C1 /* Foundation.framework in Frameworks */,\n\t\t\t\tD2F9A541121383A1002747C1 /* libgtest.a in Frameworks */,\n\t\t\t\t4DBE49A9134A4F460072546A /* CoreServices.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF92C53520ECCE349009BE4BA /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF92C564C0ECD10DD009BE4BA /* breakpadUtilities.dylib in Frameworks */,\n\t\t\t\tF92C554C0ECCF534009BE4BA /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF92C563A0ECD10B3009BE4BA /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8B31FC8211EFD2B800FCF3E4 /* Foundation.framework in Frameworks */,\n\t\t\t\tF92C56570ECD113E009BE4BA /* Carbon.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF92C569E0ECE04A7009BE4BA /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF9C44EE50EF0A006003AEBAA /* SystemConfiguration.framework in Frameworks */,\n\t\t\t\t8B3101C611F0CD9F00FCF3E4 /* AppKit.framework in Frameworks */,\n\t\t\t\t8B3101C711F0CD9F00FCF3E4 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF93803BC0F80820F004D428B /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8B31029411F0D54300FCF3E4 /* Foundation.framework in Frameworks */,\n\t\t\t\tD23F4B3312A7E17700686C8D /* libgtest.a in Frameworks */,\n\t\t\t\t4DBE49A7134A4F280072546A /* CoreServices.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF93DE2CF0F82A67300608B94 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF93DE32A0F82C55600608B94 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8B3102E611F0D74C00FCF3E4 /* Foundation.framework in Frameworks */,\n\t\t\t\tD2F9A44412131F84002747C1 /* libgtest.a in Frameworks */,\n\t\t\t\t4DBE49A8134A4F380072546A /* CoreServices.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF9C44DA30EF060A8003AEBAA /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF9C44E000EF077CD003AEBAA /* Breakpad.framework in Frameworks */,\n\t\t\t\t8B3101CA11F0CDB000FCF3E4 /* AppKit.framework in Frameworks */,\n\t\t\t\t8B3101CB11F0CDB000FCF3E4 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF9C77DD70F7DD5CF0045F7DB /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF91AF6210FD60784009D8BE2 /* Breakpad.framework in Frameworks */,\n\t\t\t\t8B3101EA11F0CDE300FCF3E4 /* SenTestingKit.framework in Frameworks */,\n\t\t\t\t8B3102EB11F0D78000FCF3E4 /* Foundation.framework in Frameworks */,\n\t\t\t\tD24BBBFD121050F000F3D417 /* breakpadUtilities.dylib in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t034768DFFF38A50411DB9C8B /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8DC2EF5B0486A6940098B216 /* Breakpad.framework */,\n\t\t\t\tF92C53540ECCE349009BE4BA /* Inspector */,\n\t\t\t\tF92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */,\n\t\t\t\tF92C56A00ECE04A7009BE4BA /* crash_report_sender.app */,\n\t\t\t\tF9C44DA50EF060A8003AEBAA /* BreakpadTest.app */,\n\t\t\t\tF9C77DDA0F7DD5CF0045F7DB /* UnitTests.octest */,\n\t\t\t\tF93803BE0F80820F004D428B /* generator_test */,\n\t\t\t\tF93DE2D10F82A67300608B94 /* minidump_file_writer_unittest */,\n\t\t\t\tF93DE32C0F82C55600608B94 /* handler_test */,\n\t\t\t\tD2F9A41512131EF0002747C1 /* libgtest.a */,\n\t\t\t\tD2F9A546121383A1002747C1 /* crash_generation_server_test */,\n\t\t\t\tD23F4BAB12A868A500686C8D /* minidump_generator_test_helper */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0867D691FE84028FC02AAC07 /* Breakpad */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD2F9A43812131F3B002747C1 /* gtest */,\n\t\t\t\t8B31FFF611F0C90500FCF3E4 /* Breakpad.xcconfig */,\n\t\t\t\t8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */,\n\t\t\t\t8B31027811F0D3AF00FCF3E4 /* BreakpadRelease.xcconfig */,\n\t\t\t\tF95BB8A3101F94C300AA053B /* Tools */,\n\t\t\t\t32DBCF5E0370ADEE00C91783 /* Breakpad_Prefix.pch */,\n\t\t\t\tF92C538D0ECCE6F2009BE4BA /* client */,\n\t\t\t\tF92C53600ECCE3D6009BE4BA /* common */,\n\t\t\t\tD244536912426EE7009BBCE0 /* processor */,\n\t\t\t\t0867D69AFE84028FC02AAC07 /* Frameworks */,\n\t\t\t\t034768DFFF38A50411DB9C8B /* Products */,\n\t\t\t\tF9C77DDB0F7DD5CF0045F7DB /* UnitTests-Info.plist */,\n\t\t\t);\n\t\t\tname = Breakpad;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0867D69AFE84028FC02AAC07 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8B3101E911F0CDE300FCF3E4 /* SenTestingKit.framework */,\n\t\t\t\tF9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */,\n\t\t\t\tF92C554A0ECCF530009BE4BA /* Carbon.framework */,\n\t\t\t\t1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */,\n\t\t\t\t0867D6A5FE840307C02AAC07 /* AppKit.framework */,\n\t\t\t\t0867D69BFE84028FC02AAC07 /* Foundation.framework */,\n\t\t\t\t4DBE4769134A4F080072546A /* CoreServices.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t16C7C915147D45AE00776EAD /* apple */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t16C7C916147D45AE00776EAD /* Framework */,\n\t\t\t);\n\t\t\tname = apple;\n\t\t\tpath = ../apple;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t16C7C916147D45AE00776EAD /* Framework */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t16C7C917147D45AE00776EAD /* BreakpadDefines.h */,\n\t\t\t);\n\t\t\tpath = Framework;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD244536912426EE7009BBCE0 /* processor */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD244535112426EBB009BBCE0 /* logging.cc */,\n\t\t\t\tD244535212426EBB009BBCE0 /* minidump.cc */,\n\t\t\t\tD244535312426EBB009BBCE0 /* pathname_stripper.cc */,\n\t\t\t\tD244534F12426E98009BBCE0 /* basic_code_modules.cc */,\n\t\t\t);\n\t\t\tname = processor;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD2F9A43812131F3B002747C1 /* gtest */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD2F9A43E12131F65002747C1 /* gtest_main.cc */,\n\t\t\t\tD2F9A43F12131F65002747C1 /* gtest-all.cc */,\n\t\t\t\tD2F9A43C12131F55002747C1 /* gmock-all.cc */,\n\t\t\t);\n\t\t\tname = gtest;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF92C53590ECCE3BB009BE4BA /* handler */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF92C53670ECCE3FD009BE4BA /* breakpad_exc_server.c */,\n\t\t\t\tF92C53680ECCE3FD009BE4BA /* breakpad_exc_server.h */,\n\t\t\t\tF92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */,\n\t\t\t\tF92C536A0ECCE3FD009BE4BA /* breakpad_nlist_64.h */,\n\t\t\t\tF92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */,\n\t\t\t\tF92C536C0ECCE3FD009BE4BA /* dynamic_images.h */,\n\t\t\t\tF92C536D0ECCE3FD009BE4BA /* exception_handler.cc */,\n\t\t\t\tF92C536E0ECCE3FD009BE4BA /* exception_handler.h */,\n\t\t\t\tF92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */,\n\t\t\t\tF92C53700ECCE3FD009BE4BA /* minidump_generator.h */,\n\t\t\t\tF92C53720ECCE3FD009BE4BA /* protected_memory_allocator.cc */,\n\t\t\t\tF92C53730ECCE3FD009BE4BA /* protected_memory_allocator.h */,\n\t\t\t);\n\t\t\tname = handler;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF92C53600ECCE3D6009BE4BA /* common */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD244540A12439BA0009BBCE0 /* memory_unittest.cc */,\n\t\t\t\tF92C53870ECCE6C0009BE4BA /* convert_UTF.c */,\n\t\t\t\tF92C53880ECCE6C0009BE4BA /* convert_UTF.h */,\n\t\t\t\t4D72CA0D13DFAD5C006CABE3 /* md5.cc */,\n\t\t\t\tF92C53850ECCE6AD009BE4BA /* string_conversion.cc */,\n\t\t\t\tF92C53860ECCE6AD009BE4BA /* string_conversion.h */,\n\t\t\t\tF92C53840ECCE68D009BE4BA /* mac */,\n\t\t\t);\n\t\t\tname = common;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF92C53840ECCE68D009BE4BA /* mac */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8B31022211F0CE1000FCF3E4 /* GTMGarbageCollection.h */,\n\t\t\t\t8B31007011F0CD3C00FCF3E4 /* GTMDefines.h */,\n\t\t\t\tF9C77E0F0F7DDF650045F7DB /* testing */,\n\t\t\t\tF9C44EE70EF0A3C1003AEBAA /* GTMLogger.h */,\n\t\t\t\tF9C44EE80EF0A3C1003AEBAA /* GTMLogger.m */,\n\t\t\t\tF92C53740ECCE635009BE4BA /* file_id.cc */,\n\t\t\t\tF92C53750ECCE635009BE4BA /* file_id.h */,\n\t\t\t\tF92C53760ECCE635009BE4BA /* HTTPMultipartUpload.h */,\n\t\t\t\tF92C53770ECCE635009BE4BA /* HTTPMultipartUpload.m */,\n\t\t\t\tF92C53780ECCE635009BE4BA /* MachIPC.h */,\n\t\t\t\tF92C53790ECCE635009BE4BA /* MachIPC.mm */,\n\t\t\t\t4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */,\n\t\t\t\t4D61A25E14F43CFC002D5862 /* bootstrap_compat.h */,\n\t\t\t\tF92C537A0ECCE635009BE4BA /* macho_id.cc */,\n\t\t\t\tF92C537B0ECCE635009BE4BA /* macho_id.h */,\n\t\t\t\tF92C537C0ECCE635009BE4BA /* macho_utilities.cc */,\n\t\t\t\tF92C537D0ECCE635009BE4BA /* macho_utilities.h */,\n\t\t\t\tF92C537E0ECCE635009BE4BA /* macho_walker.cc */,\n\t\t\t\tF92C537F0ECCE635009BE4BA /* macho_walker.h */,\n\t\t\t\tF92C53800ECCE635009BE4BA /* SimpleStringDictionary.h */,\n\t\t\t\tF92C53810ECCE635009BE4BA /* SimpleStringDictionary.mm */,\n\t\t\t\tF92C53820ECCE635009BE4BA /* string_utilities.cc */,\n\t\t\t\tF92C53830ECCE635009BE4BA /* string_utilities.h */,\n\t\t\t);\n\t\t\tname = mac;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF92C538D0ECCE6F2009BE4BA /* client */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t16C7C915147D45AE00776EAD /* apple */,\n\t\t\t\tF92C53990ECCE78E009BE4BA /* mac */,\n\t\t\t\tF92C538E0ECCE70A009BE4BA /* minidump_file_writer-inl.h */,\n\t\t\t\tF92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */,\n\t\t\t\tF92C53900ECCE70A009BE4BA /* minidump_file_writer.h */,\n\t\t\t\tF93DE2D70F82A70E00608B94 /* minidump_file_writer_unittest.cc */,\n\t\t\t);\n\t\t\tname = client;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF92C53990ECCE78E009BE4BA /* mac */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF9C77DDF0F7DD7CF0045F7DB /* tests */,\n\t\t\t\tF9C44DAB0EF0726F003AEBAA /* testapp */,\n\t\t\t\tF92C56A60ECE04B6009BE4BA /* sender */,\n\t\t\t\tF92C55CD0ECD0053009BE4BA /* Framework */,\n\t\t\t\tF92C53B50ECCE799009BE4BA /* crash_generation */,\n\t\t\t\tF92C53590ECCE3BB009BE4BA /* handler */,\n\t\t\t);\n\t\t\tname = mac;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF92C53B50ECCE799009BE4BA /* crash_generation */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t163201D41443019E00C4DBF5 /* ConfigFile.h */,\n\t\t\t\t163201D51443019E00C4DBF5 /* ConfigFile.mm */,\n\t\t\t\tD2F9A4C4121336C7002747C1 /* client_info.h */,\n\t\t\t\tD2F9A4C5121336C7002747C1 /* crash_generation_client.h */,\n\t\t\t\tD2F9A4C6121336C7002747C1 /* crash_generation_client.cc */,\n\t\t\t\tD2F9A4C7121336C7002747C1 /* crash_generation_server.h */,\n\t\t\t\tD2F9A4C8121336C7002747C1 /* crash_generation_server.cc */,\n\t\t\t\tF9286B380F7EB25800A4DCC8 /* Inspector.h */,\n\t\t\t\tF9286B390F7EB25800A4DCC8 /* InspectorMain.mm */,\n\t\t\t\tF92C53B70ECCE7B3009BE4BA /* Inspector.mm */,\n\t\t\t);\n\t\t\tname = crash_generation;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF92C55CD0ECD0053009BE4BA /* Framework */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF945859D0F78241E009A47BF /* Info.plist */,\n\t\t\t\tF92C56310ECD0DF1009BE4BA /* OnDemandServer.h */,\n\t\t\t\tF92C56320ECD0DF1009BE4BA /* OnDemandServer.mm */,\n\t\t\t\tF92C55CE0ECD0064009BE4BA /* Breakpad.h */,\n\t\t\t\tF92C55CF0ECD0064009BE4BA /* Breakpad.mm */,\n\t\t\t);\n\t\t\tname = Framework;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF92C56A60ECE04B6009BE4BA /* sender */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t16E02DB4147410D4008C604D /* uploader.mm */,\n\t\t\t\t163202431443201300C4DBF5 /* uploader.h */,\n\t\t\t\tF9B6309F100FF96B00D0F4AC /* goArrow.png */,\n\t\t\t\tF92C56A70ECE04C5009BE4BA /* crash_report_sender.h */,\n\t\t\t\tF92C56A80ECE04C5009BE4BA /* crash_report_sender.m */,\n\t\t\t\tF945849C0F280E3C009A47BF /* Localizable.strings */,\n\t\t\t\t33880C7E0F9E097100817F82 /* InfoPlist.strings */,\n\t\t\t\t3329D4EC0FA16D820007BBC5 /* Breakpad.xib */,\n\t\t\t\t4084699C0F5D9CF900FDCA37 /* crash_report_sender.icns */,\n\t\t\t\tF92C56A20ECE04A7009BE4BA /* crash_report_sender-Info.plist */,\n\t\t\t);\n\t\t\tname = sender;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF95BB87D101F949F00AA053B /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF95BB885101F949F00AA053B /* crash_report */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF95BB88A101F94AC00AA053B /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF95BB892101F94AC00AA053B /* dump_syms */,\n\t\t\t\t8B31F7A111EF9A8700FCF3E4 /* macho_dump */,\n\t\t\t\t8B31F7A311EF9A8700FCF3E4 /* libgtestmockall.a */,\n\t\t\t\t8B31F7A511EF9A8700FCF3E4 /* byte_cursor_unittest */,\n\t\t\t\t8B31F7A711EF9A8700FCF3E4 /* macho_reader_unittest */,\n\t\t\t\t8B31F7A911EF9A8700FCF3E4 /* stabs_reader_unittest */,\n\t\t\t\t8B31F7AB11EF9A8700FCF3E4 /* bytereader_unittest */,\n\t\t\t\t8B31F7AD11EF9A8700FCF3E4 /* dwarf2reader_cfi_unittest */,\n\t\t\t\t8B31F7AF11EF9A8700FCF3E4 /* dwarf2diehandler_unittest */,\n\t\t\t\t8B31F7B111EF9A8700FCF3E4 /* dwarf_cu_to_module_unittest */,\n\t\t\t\t8B31F7B311EF9A8700FCF3E4 /* dwarf_line_to_module_unittest */,\n\t\t\t\t8B31F7B511EF9A8700FCF3E4 /* dwarf_cfi_to_module_unittest */,\n\t\t\t\t8B31F7B711EF9A8700FCF3E4 /* stabs_to_module_unittest */,\n\t\t\t\t8B31F7B911EF9A8700FCF3E4 /* module_unittest */,\n\t\t\t\t8B31F7BB11EF9A8700FCF3E4 /* test_assembler_unittest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF95BB895101F94C000AA053B /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF95BB89F101F94C000AA053B /* symupload */,\n\t\t\t\tF95BB8A1101F94C000AA053B /* minidump_upload */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF95BB8A3101F94C300AA053B /* Tools */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF95BB894101F94C000AA053B /* symupload.xcodeproj */,\n\t\t\t\tF95BB889101F94AC00AA053B /* dump_syms.xcodeproj */,\n\t\t\t\tF95BB87C101F949F00AA053B /* crash_report.xcodeproj */,\n\t\t\t);\n\t\t\tname = Tools;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF9C44DAB0EF0726F003AEBAA /* testapp */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF9C44DBF0EF0778F003AEBAA /* Controller.h */,\n\t\t\t\tF9C44DC00EF0778F003AEBAA /* TestClass.h */,\n\t\t\t\tF9C44DB80EF072A0003AEBAA /* InfoPlist.strings */,\n\t\t\t\tF9C44DBA0EF072A0003AEBAA /* MainMenu.xib */,\n\t\t\t\tF9C44DAC0EF07288003AEBAA /* Controller.m */,\n\t\t\t\tF9C44DAD0EF07288003AEBAA /* crashduringload */,\n\t\t\t\tF9C44DAE0EF07288003AEBAA /* crashInMain */,\n\t\t\t\tF9C44DAF0EF07288003AEBAA /* Info.plist */,\n\t\t\t\tF9C44DB00EF07288003AEBAA /* main.m */,\n\t\t\t\tF9C44DB10EF07288003AEBAA /* TestClass.mm */,\n\t\t\t);\n\t\t\tname = testapp;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF9C77DDF0F7DD7CF0045F7DB /* tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD23F4B9A12A8688800686C8D /* minidump_generator_test_helper.cc */,\n\t\t\t\tD23F4B2C12A7E13200686C8D /* minidump_generator_test.cc */,\n\t\t\t\tD2F9A4CE121336F7002747C1 /* crash_generation_server_test.cc */,\n\t\t\t\tD2F9A3D41212F87C002747C1 /* exception_handler_test.cc */,\n\t\t\t\tF9C77DE00F7DD7E30045F7DB /* SimpleStringDictionaryTest.h */,\n\t\t\t\tF9C77DE10F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm */,\n\t\t\t\tF91AF5CF0FD60393009D8BE2 /* BreakpadFramework_Test.mm */,\n\t\t\t);\n\t\t\tname = tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF9C77E0F0F7DDF650045F7DB /* testing */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF9C77E110F7DDF810045F7DB /* GTMSenTestCase.h */,\n\t\t\t\tF9C77E120F7DDF810045F7DB /* GTMSenTestCase.m */,\n\t\t\t);\n\t\t\tname = testing;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t8DC2EF500486A6940098B216 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF92C55D00ECD0064009BE4BA /* Breakpad.h in Headers */,\n\t\t\t\tF92C56330ECD0DF1009BE4BA /* OnDemandServer.h in Headers */,\n\t\t\t\tD2F9A4C9121336C7002747C1 /* client_info.h in Headers */,\n\t\t\t\tD2F9A4CA121336C7002747C1 /* crash_generation_client.h in Headers */,\n\t\t\t\tD2F9A4CC121336C7002747C1 /* crash_generation_server.h in Headers */,\n\t\t\t\t163201D61443019E00C4DBF5 /* ConfigFile.h in Headers */,\n\t\t\t\t16C7C918147D45AE00776EAD /* BreakpadDefines.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD2F9A41112131EF0002747C1 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF92C56380ECD10B3009BE4BA /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t8DC2EF4F0486A6940098B216 /* Breakpad */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget \"Breakpad\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF97A0E850ED4EC15008784D3 /* Change install name of breakpadUtilities */,\n\t\t\t\t8DC2EF500486A6940098B216 /* Headers */,\n\t\t\t\t8DC2EF520486A6940098B216 /* Resources */,\n\t\t\t\t8DC2EF540486A6940098B216 /* Sources */,\n\t\t\t\t8DC2EF560486A6940098B216 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tF92C56860ECD15EF009BE4BA /* PBXTargetDependency */,\n\t\t\t\tF92C56880ECD15F1009BE4BA /* PBXTargetDependency */,\n\t\t\t\tF9C44E970EF09F4B003AEBAA /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Breakpad;\n\t\t\tproductInstallPath = \"$(HOME)/Library/Frameworks\";\n\t\t\tproductName = Breakpad;\n\t\t\tproductReference = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tD23F4BAA12A868A500686C8D /* minidump_generator_test_helper */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D23F4BB012A868C400686C8D /* Build configuration list for PBXNativeTarget \"minidump_generator_test_helper\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD23F4BA812A868A500686C8D /* Sources */,\n\t\t\t\tD23F4BA912A868A500686C8D /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = minidump_generator_test_helper;\n\t\t\tproductName = minidump_generator_test_helper;\n\t\t\tproductReference = D23F4BAB12A868A500686C8D /* minidump_generator_test_helper */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\tD2F9A41412131EF0002747C1 /* gtest */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D2F9A42D12131F0E002747C1 /* Build configuration list for PBXNativeTarget \"gtest\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD2F9A41112131EF0002747C1 /* Headers */,\n\t\t\t\tD2F9A41212131EF0002747C1 /* Sources */,\n\t\t\t\tD2F9A41312131EF0002747C1 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = gtest;\n\t\t\tproductName = gtest;\n\t\t\tproductReference = D2F9A41512131EF0002747C1 /* libgtest.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\tD2F9A52A121383A1002747C1 /* crash_generation_server_test */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D2F9A542121383A1002747C1 /* Build configuration list for PBXNativeTarget \"crash_generation_server_test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD2F9A52D121383A1002747C1 /* Sources */,\n\t\t\t\tD2F9A53E121383A1002747C1 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tD2F9A52B121383A1002747C1 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = crash_generation_server_test;\n\t\t\tproductName = handler_test;\n\t\t\tproductReference = D2F9A546121383A1002747C1 /* crash_generation_server_test */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\tF92C53530ECCE349009BE4BA /* Inspector */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F92C53580ECCE36D009BE4BA /* Build configuration list for PBXNativeTarget \"Inspector\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF94584840F27FB40009A47BF /* Change install name of breakpadUtilities */,\n\t\t\t\tF92C53510ECCE349009BE4BA /* Sources */,\n\t\t\t\tF92C53520ECCE349009BE4BA /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tF92C564E0ECD10E5009BE4BA /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Inspector;\n\t\t\tproductName = Inspector;\n\t\t\tproductReference = F92C53540ECCE349009BE4BA /* Inspector */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\tF92C563B0ECD10B3009BE4BA /* breakpadUtilities */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F92C56670ECD11A3009BE4BA /* Build configuration list for PBXNativeTarget \"breakpadUtilities\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF92C56380ECD10B3009BE4BA /* Headers */,\n\t\t\t\tF92C56390ECD10B3009BE4BA /* Sources */,\n\t\t\t\tF92C563A0ECD10B3009BE4BA /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = breakpadUtilities;\n\t\t\tproductName = breakpadUtilities;\n\t\t\tproductReference = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */;\n\t\t\tproductType = \"com.apple.product-type.library.dynamic\";\n\t\t};\n\t\tF92C569F0ECE04A7009BE4BA /* crash_report_sender */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F92C56A50ECE04A8009BE4BA /* Build configuration list for PBXNativeTarget \"crash_report_sender\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF92C569C0ECE04A7009BE4BA /* Resources */,\n\t\t\t\tF92C569D0ECE04A7009BE4BA /* Sources */,\n\t\t\t\tF92C569E0ECE04A7009BE4BA /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = crash_report_sender;\n\t\t\tproductName = crash_report_sender;\n\t\t\tproductReference = F92C56A00ECE04A7009BE4BA /* crash_report_sender.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\tF93803BD0F80820F004D428B /* generator_test */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F93803C40F80822E004D428B /* Build configuration list for PBXNativeTarget \"generator_test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF93803BB0F80820F004D428B /* Sources */,\n\t\t\t\tF93803BC0F80820F004D428B /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tD23F4B3012A7E16200686C8D /* PBXTargetDependency */,\n\t\t\t\tD23F4BBA12A8694C00686C8D /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = generator_test;\n\t\t\tproductName = generator_test;\n\t\t\tproductReference = F93803BE0F80820F004D428B /* generator_test */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\tF93DE2D00F82A67300608B94 /* minidump_file_writer_unittest */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F93DE2D60F82A67700608B94 /* Build configuration list for PBXNativeTarget \"minidump_file_writer_unittest\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF93DE2CE0F82A67300608B94 /* Sources */,\n\t\t\t\tF93DE2CF0F82A67300608B94 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = minidump_file_writer_unittest;\n\t\t\tproductName = minidump_file_writer_unittest;\n\t\t\tproductReference = F93DE2D10F82A67300608B94 /* minidump_file_writer_unittest */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\tF93DE32B0F82C55600608B94 /* handler_test */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F93DE3320F82C5D800608B94 /* Build configuration list for PBXNativeTarget \"handler_test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF93DE3290F82C55600608B94 /* Sources */,\n\t\t\t\tF93DE32A0F82C55600608B94 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tD2F9A44312131F80002747C1 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = handler_test;\n\t\t\tproductName = handler_test;\n\t\t\tproductReference = F93DE32C0F82C55600608B94 /* handler_test */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\tF9C44DA40EF060A8003AEBAA /* BreakpadTest */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F9C44DAA0EF060A9003AEBAA /* Build configuration list for PBXNativeTarget \"BreakpadTest\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF9C44DA10EF060A8003AEBAA /* Resources */,\n\t\t\t\tF9C44DA20EF060A8003AEBAA /* Sources */,\n\t\t\t\tF9C44DA30EF060A8003AEBAA /* Frameworks */,\n\t\t\t\tF9C44E410EF08B17003AEBAA /* Copy Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tF9C44E1A0EF0790F003AEBAA /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = BreakpadTest;\n\t\t\tproductName = BreakpadTest;\n\t\t\tproductReference = F9C44DA50EF060A8003AEBAA /* BreakpadTest.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\tF9C77DD90F7DD5CF0045F7DB /* UnitTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F9C77DDE0F7DD5D00045F7DB /* Build configuration list for PBXNativeTarget \"UnitTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF9C77DD50F7DD5CF0045F7DB /* Resources */,\n\t\t\t\tF9C77DD60F7DD5CF0045F7DB /* Sources */,\n\t\t\t\tF9C77DD70F7DD5CF0045F7DB /* Frameworks */,\n\t\t\t\tF9C77DD80F7DD5CF0045F7DB /* ShellScript */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tF93DE2FC0F82C3C600608B94 /* PBXTargetDependency */,\n\t\t\t\tF93DE3700F82CC1300608B94 /* PBXTargetDependency */,\n\t\t\t\tF91AF6380FD60A74009D8BE2 /* PBXTargetDependency */,\n\t\t\t\tD2F9A5DF12142A6A002747C1 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = UnitTests;\n\t\t\tproductName = UnitTests;\n\t\t\tproductReference = F9C77DDA0F7DD5CF0045F7DB /* UnitTests.octest */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t0867D690FE84028FC02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tbuildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject \"Breakpad\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.1\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\tda,\n\t\t\t\tde,\n\t\t\t\tes,\n\t\t\t\tfr,\n\t\t\t\tit,\n\t\t\t\tja,\n\t\t\t\tnl,\n\t\t\t\tno,\n\t\t\t\tsl,\n\t\t\t\tsv,\n\t\t\t\ttr,\n\t\t\t);\n\t\t\tmainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */;\n\t\t\tproductRefGroup = 034768DFFF38A50411DB9C8B /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t\t{\n\t\t\t\t\tProductGroup = F95BB87D101F949F00AA053B /* Products */;\n\t\t\t\t\tProjectRef = F95BB87C101F949F00AA053B /* crash_report.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = F95BB88A101F94AC00AA053B /* Products */;\n\t\t\t\t\tProjectRef = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tProductGroup = F95BB895101F94C000AA053B /* Products */;\n\t\t\t\t\tProjectRef = F95BB894101F94C000AA053B /* symupload.xcodeproj */;\n\t\t\t\t},\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8DC2EF4F0486A6940098B216 /* Breakpad */,\n\t\t\t\tF92C53530ECCE349009BE4BA /* Inspector */,\n\t\t\t\tF92C563B0ECD10B3009BE4BA /* breakpadUtilities */,\n\t\t\t\tF92C569F0ECE04A7009BE4BA /* crash_report_sender */,\n\t\t\t\tF9C44DA40EF060A8003AEBAA /* BreakpadTest */,\n\t\t\t\tF94585840F782326009A47BF /* All */,\n\t\t\t\tF9C77DD90F7DD5CF0045F7DB /* UnitTests */,\n\t\t\t\tF93803BD0F80820F004D428B /* generator_test */,\n\t\t\t\tF93DE2D00F82A67300608B94 /* minidump_file_writer_unittest */,\n\t\t\t\tF93DE32B0F82C55600608B94 /* handler_test */,\n\t\t\t\tD2F9A41412131EF0002747C1 /* gtest */,\n\t\t\t\tD2F9A52A121383A1002747C1 /* crash_generation_server_test */,\n\t\t\t\tD23F4BAA12A868A500686C8D /* minidump_generator_test_helper */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXReferenceProxy section */\n\t\t8B31F7A111EF9A8700FCF3E4 /* macho_dump */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = macho_dump;\n\t\t\tremoteRef = 8B31F7A011EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8B31F7A311EF9A8700FCF3E4 /* libgtestmockall.a */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = archive.ar;\n\t\t\tpath = libgtestmockall.a;\n\t\t\tremoteRef = 8B31F7A211EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8B31F7A511EF9A8700FCF3E4 /* byte_cursor_unittest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = byte_cursor_unittest;\n\t\t\tremoteRef = 8B31F7A411EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8B31F7A711EF9A8700FCF3E4 /* macho_reader_unittest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = macho_reader_unittest;\n\t\t\tremoteRef = 8B31F7A611EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8B31F7A911EF9A8700FCF3E4 /* stabs_reader_unittest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = stabs_reader_unittest;\n\t\t\tremoteRef = 8B31F7A811EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8B31F7AB11EF9A8700FCF3E4 /* bytereader_unittest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = bytereader_unittest;\n\t\t\tremoteRef = 8B31F7AA11EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8B31F7AD11EF9A8700FCF3E4 /* dwarf2reader_cfi_unittest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = dwarf2reader_cfi_unittest;\n\t\t\tremoteRef = 8B31F7AC11EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8B31F7AF11EF9A8700FCF3E4 /* dwarf2diehandler_unittest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = dwarf2diehandler_unittest;\n\t\t\tremoteRef = 8B31F7AE11EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8B31F7B111EF9A8700FCF3E4 /* dwarf_cu_to_module_unittest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = dwarf_cu_to_module_unittest;\n\t\t\tremoteRef = 8B31F7B011EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8B31F7B311EF9A8700FCF3E4 /* dwarf_line_to_module_unittest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = dwarf_line_to_module_unittest;\n\t\t\tremoteRef = 8B31F7B211EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8B31F7B511EF9A8700FCF3E4 /* dwarf_cfi_to_module_unittest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = dwarf_cfi_to_module_unittest;\n\t\t\tremoteRef = 8B31F7B411EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8B31F7B711EF9A8700FCF3E4 /* stabs_to_module_unittest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = stabs_to_module_unittest;\n\t\t\tremoteRef = 8B31F7B611EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8B31F7B911EF9A8700FCF3E4 /* module_unittest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = module_unittest;\n\t\t\tremoteRef = 8B31F7B811EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t8B31F7BB11EF9A8700FCF3E4 /* test_assembler_unittest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = test_assembler_unittest;\n\t\t\tremoteRef = 8B31F7BA11EF9A8700FCF3E4 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tF95BB885101F949F00AA053B /* crash_report */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = crash_report;\n\t\t\tremoteRef = F95BB884101F949F00AA053B /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tF95BB892101F94AC00AA053B /* dump_syms */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = dump_syms;\n\t\t\tremoteRef = F95BB891101F94AC00AA053B /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tF95BB89F101F94C000AA053B /* symupload */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = symupload;\n\t\t\tremoteRef = F95BB89E101F94C000AA053B /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tF95BB8A1101F94C000AA053B /* minidump_upload */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = \"compiled.mach-o.executable\";\n\t\t\tpath = minidump_upload;\n\t\t\tremoteRef = F95BB8A0101F94C000AA053B /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n/* End PBXReferenceProxy section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t8DC2EF520486A6940098B216 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF9C44E980EF09F56003AEBAA /* crash_report_sender.app in Resources */,\n\t\t\t\tF92C568A0ECD15F9009BE4BA /* Inspector in Resources */,\n\t\t\t\tF92C56650ECD1185009BE4BA /* breakpadUtilities.dylib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF92C569C0ECE04A7009BE4BA /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF945849E0F280E3C009A47BF /* Localizable.strings in Resources */,\n\t\t\t\t4084699D0F5D9CF900FDCA37 /* crash_report_sender.icns in Resources */,\n\t\t\t\t33880C800F9E097100817F82 /* InfoPlist.strings in Resources */,\n\t\t\t\t3329D4ED0FA16D820007BBC5 /* Breakpad.xib in Resources */,\n\t\t\t\tF9B630A0100FF96B00D0F4AC /* goArrow.png in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF9C44DA10EF060A8003AEBAA /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF9C44DB30EF07288003AEBAA /* crashduringload in Resources */,\n\t\t\t\tF9C44DB40EF07288003AEBAA /* crashInMain in Resources */,\n\t\t\t\tF9C44DBC0EF072A0003AEBAA /* InfoPlist.strings in Resources */,\n\t\t\t\tF9C44DBD0EF072A0003AEBAA /* MainMenu.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF9C77DD50F7DD5CF0045F7DB /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\tF94584840F27FB40009A47BF /* Change install name of breakpadUtilities */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Change install name of breakpadUtilities\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"install_name_tool -id \\\"@executable_path/../Resources/breakpadUtilities.dylib\\\" \\\"${BUILT_PRODUCTS_DIR}/breakpadUtilities.dylib\\\"\\n\";\n\t\t};\n\t\tF97A0E850ED4EC15008784D3 /* Change install name of breakpadUtilities */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Change install name of breakpadUtilities\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"#!/bin/bash\\ninstall_name_tool -id \\\"@executable_path/../Frameworks/Breakpad.framework/Resources/breakpadUtilities.dylib\\\" \\\"${BUILT_PRODUCTS_DIR}/breakpadUtilities.dylib\\\"\\n\";\n\t\t};\n\t\tF9C77DD80F7DD5CF0045F7DB /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"# Run the unit tests in this test bundle.\\n\\\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\\\"\\n\\necho running minidump generator tests...\\n\\\"${BUILT_PRODUCTS_DIR}/generator_test\\\"\\necho Running exception handler tests...\\n\\\"${BUILT_PRODUCTS_DIR}/handler_test\\\"\\necho Running crash generation server tests...\\n\\\"${BUILT_PRODUCTS_DIR}/crash_generation_server_test\\\"\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t8DC2EF540486A6940098B216 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF92C565F0ECD116B009BE4BA /* protected_memory_allocator.cc in Sources */,\n\t\t\t\tF92C56630ECD1179009BE4BA /* exception_handler.cc in Sources */,\n\t\t\t\tF92C55D10ECD0064009BE4BA /* Breakpad.mm in Sources */,\n\t\t\t\tF92C56340ECD0DF1009BE4BA /* OnDemandServer.mm in Sources */,\n\t\t\t\tD2F9A4CB121336C7002747C1 /* crash_generation_client.cc in Sources */,\n\t\t\t\tD2F9A4CD121336C7002747C1 /* crash_generation_server.cc in Sources */,\n\t\t\t\t163201D71443019E00C4DBF5 /* ConfigFile.mm in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD23F4BA812A868A500686C8D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD23F4BB112A868CB00686C8D /* minidump_generator_test_helper.cc in Sources */,\n\t\t\t\tD23F4BB812A868F700686C8D /* MachIPC.mm in Sources */,\n\t\t\t\tD246417012BAA40E005170D0 /* exception_handler.cc in Sources */,\n\t\t\t\tD246417112BAA41C005170D0 /* crash_generation_client.cc in Sources */,\n\t\t\t\tD246417512BAA438005170D0 /* minidump_generator.cc in Sources */,\n\t\t\t\tD246417612BAA43F005170D0 /* dynamic_images.cc in Sources */,\n\t\t\t\tD246417712BAA444005170D0 /* breakpad_nlist_64.cc in Sources */,\n\t\t\t\tD246418812BAA4E3005170D0 /* string_utilities.cc in Sources */,\n\t\t\t\tD246418C12BAA508005170D0 /* minidump_file_writer.cc in Sources */,\n\t\t\t\tD246419012BAA52A005170D0 /* string_conversion.cc in Sources */,\n\t\t\t\tD246419112BAA52F005170D0 /* convert_UTF.c in Sources */,\n\t\t\t\tD246419512BAA54C005170D0 /* file_id.cc in Sources */,\n\t\t\t\tD246419612BAA55A005170D0 /* macho_id.cc in Sources */,\n\t\t\t\tD24641A012BAA67F005170D0 /* macho_walker.cc in Sources */,\n\t\t\t\tD24641AF12BAA82D005170D0 /* macho_utilities.cc in Sources */,\n\t\t\t\t4D72CA2513DFAE1C006CABE3 /* md5.cc in Sources */,\n\t\t\t\t4D61A26C14F43D42002D5862 /* bootstrap_compat.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD2F9A41212131EF0002747C1 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD2F9A43D12131F55002747C1 /* gmock-all.cc in Sources */,\n\t\t\t\tD2F9A44012131F65002747C1 /* gtest_main.cc in Sources */,\n\t\t\t\tD2F9A44112131F65002747C1 /* gtest-all.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD2F9A52D121383A1002747C1 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD2F9A553121383DC002747C1 /* crash_generation_server_test.cc in Sources */,\n\t\t\t\tD2F9A52E121383A1002747C1 /* crash_generation_client.cc in Sources */,\n\t\t\t\tD2F9A52F121383A1002747C1 /* crash_generation_server.cc in Sources */,\n\t\t\t\tD2F9A530121383A1002747C1 /* MachIPC.mm in Sources */,\n\t\t\t\tD2F9A531121383A1002747C1 /* breakpad_nlist_64.cc in Sources */,\n\t\t\t\tD2F9A532121383A1002747C1 /* dynamic_images.cc in Sources */,\n\t\t\t\tD2F9A533121383A1002747C1 /* exception_handler.cc in Sources */,\n\t\t\t\tD2F9A534121383A1002747C1 /* minidump_generator.cc in Sources */,\n\t\t\t\tD2F9A535121383A1002747C1 /* minidump_file_writer.cc in Sources */,\n\t\t\t\tD2F9A536121383A1002747C1 /* convert_UTF.c in Sources */,\n\t\t\t\tD2F9A537121383A1002747C1 /* string_conversion.cc in Sources */,\n\t\t\t\tD2F9A538121383A1002747C1 /* file_id.cc in Sources */,\n\t\t\t\tD2F9A539121383A1002747C1 /* macho_id.cc in Sources */,\n\t\t\t\tD2F9A53A121383A1002747C1 /* macho_utilities.cc in Sources */,\n\t\t\t\tD2F9A53B121383A1002747C1 /* macho_walker.cc in Sources */,\n\t\t\t\tD2F9A53C121383A1002747C1 /* string_utilities.cc in Sources */,\n\t\t\t\tD24641EC12BAC6FB005170D0 /* logging.cc in Sources */,\n\t\t\t\tD24641ED12BAC6FB005170D0 /* minidump.cc in Sources */,\n\t\t\t\tD24641EE12BAC6FB005170D0 /* pathname_stripper.cc in Sources */,\n\t\t\t\tD24641EF12BAC6FB005170D0 /* basic_code_modules.cc in Sources */,\n\t\t\t\t4D72CA3913DFAE92006CABE3 /* md5.cc in Sources */,\n\t\t\t\t4D61A26F14F43D48002D5862 /* bootstrap_compat.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF92C53510ECCE349009BE4BA /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF92C53B80ECCE7B3009BE4BA /* Inspector.mm in Sources */,\n\t\t\t\tF9286B3A0F7EB25800A4DCC8 /* InspectorMain.mm in Sources */,\n\t\t\t\t163201E31443029300C4DBF5 /* ConfigFile.mm in Sources */,\n\t\t\t\t4D61A26B14F43D3C002D5862 /* bootstrap_compat.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF92C56390ECD10B3009BE4BA /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD2A5DD301188633800081F03 /* breakpad_nlist_64.cc in Sources */,\n\t\t\t\tF92C563F0ECD10CA009BE4BA /* convert_UTF.c in Sources */,\n\t\t\t\tF92C56400ECD10CA009BE4BA /* dynamic_images.cc in Sources */,\n\t\t\t\tF92C56410ECD10CA009BE4BA /* file_id.cc in Sources */,\n\t\t\t\tF92C56420ECD10CA009BE4BA /* macho_id.cc in Sources */,\n\t\t\t\tF92C56430ECD10CA009BE4BA /* macho_utilities.cc in Sources */,\n\t\t\t\tF92C56440ECD10CA009BE4BA /* macho_walker.cc in Sources */,\n\t\t\t\tF92C56450ECD10CA009BE4BA /* MachIPC.mm in Sources */,\n\t\t\t\t4D72CA0E13DFAD5C006CABE3 /* md5.cc in Sources */,\n\t\t\t\tF92C56460ECD10CA009BE4BA /* minidump_file_writer.cc in Sources */,\n\t\t\t\tF92C56470ECD10CA009BE4BA /* minidump_generator.cc in Sources */,\n\t\t\t\tF92C56480ECD10CA009BE4BA /* SimpleStringDictionary.mm in Sources */,\n\t\t\t\tF92C56490ECD10CA009BE4BA /* string_utilities.cc in Sources */,\n\t\t\t\tF92C564A0ECD10CA009BE4BA /* string_conversion.cc in Sources */,\n\t\t\t\t4D61A25F14F43CFC002D5862 /* bootstrap_compat.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF92C569D0ECE04A7009BE4BA /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF9C44EA20EF09F93003AEBAA /* HTTPMultipartUpload.m in Sources */,\n\t\t\t\tF92C56A90ECE04C5009BE4BA /* crash_report_sender.m in Sources */,\n\t\t\t\tF9C44EE90EF0A3C1003AEBAA /* GTMLogger.m in Sources */,\n\t\t\t\t16E02DB8147410F0008C604D /* uploader.mm in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF93803BB0F80820F004D428B /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD2C1DBE412AFC270006917BD /* logging.cc in Sources */,\n\t\t\t\tD2C1DBE512AFC270006917BD /* minidump.cc in Sources */,\n\t\t\t\tD2C1DBE612AFC270006917BD /* pathname_stripper.cc in Sources */,\n\t\t\t\tD2C1DBE712AFC270006917BD /* basic_code_modules.cc in Sources */,\n\t\t\t\tD2F9A4DF12133AD9002747C1 /* crash_generation_client.cc in Sources */,\n\t\t\t\tD2F9A4E012133AD9002747C1 /* crash_generation_server.cc in Sources */,\n\t\t\t\tD24BBD291211EDB100F3D417 /* MachIPC.mm in Sources */,\n\t\t\t\tD2A5DD401188640400081F03 /* breakpad_nlist_64.cc in Sources */,\n\t\t\t\tF93803CD0F8083B7004D428B /* dynamic_images.cc in Sources */,\n\t\t\t\tF93803CE0F8083B7004D428B /* exception_handler.cc in Sources */,\n\t\t\t\tF93803CF0F8083B7004D428B /* minidump_generator.cc in Sources */,\n\t\t\t\tF93803D00F8083B7004D428B /* minidump_file_writer.cc in Sources */,\n\t\t\t\tF93803D10F8083B7004D428B /* convert_UTF.c in Sources */,\n\t\t\t\tF93803D20F8083B7004D428B /* string_conversion.cc in Sources */,\n\t\t\t\tF93803D30F8083B7004D428B /* file_id.cc in Sources */,\n\t\t\t\tF93803D40F8083B7004D428B /* macho_id.cc in Sources */,\n\t\t\t\tF93803D50F8083B7004D428B /* macho_utilities.cc in Sources */,\n\t\t\t\tF93803D60F8083B7004D428B /* macho_walker.cc in Sources */,\n\t\t\t\tF93803D70F8083B7004D428B /* string_utilities.cc in Sources */,\n\t\t\t\tD23F4B2E12A7E13200686C8D /* minidump_generator_test.cc in Sources */,\n\t\t\t\t4D72CA2F13DFAE65006CABE3 /* md5.cc in Sources */,\n\t\t\t\t4D61A26D14F43D43002D5862 /* bootstrap_compat.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF93DE2CE0F82A67300608B94 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF93DE2D90F82A73500608B94 /* minidump_file_writer.cc in Sources */,\n\t\t\t\tF93DE2DA0F82A73500608B94 /* convert_UTF.c in Sources */,\n\t\t\t\tF93DE2DB0F82A73500608B94 /* string_conversion.cc in Sources */,\n\t\t\t\tF93DE2D80F82A70E00608B94 /* minidump_file_writer_unittest.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF93DE3290F82C55600608B94 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD244536A12426F00009BBCE0 /* logging.cc in Sources */,\n\t\t\t\tD244536B12426F00009BBCE0 /* minidump.cc in Sources */,\n\t\t\t\tD244536C12426F00009BBCE0 /* pathname_stripper.cc in Sources */,\n\t\t\t\tD244536D12426F00009BBCE0 /* basic_code_modules.cc in Sources */,\n\t\t\t\tD2F9A4E112133AE2002747C1 /* crash_generation_client.cc in Sources */,\n\t\t\t\tD2F9A4E212133AE2002747C1 /* crash_generation_server.cc in Sources */,\n\t\t\t\tD24BBD321212CACF00F3D417 /* MachIPC.mm in Sources */,\n\t\t\t\tD2A5DD411188642E00081F03 /* breakpad_nlist_64.cc in Sources */,\n\t\t\t\tF93DE3350F82C66B00608B94 /* dynamic_images.cc in Sources */,\n\t\t\t\tF93DE3360F82C66B00608B94 /* exception_handler.cc in Sources */,\n\t\t\t\tF93DE3370F82C66B00608B94 /* minidump_generator.cc in Sources */,\n\t\t\t\tF93DE3380F82C66B00608B94 /* minidump_file_writer.cc in Sources */,\n\t\t\t\tF93DE3390F82C66B00608B94 /* convert_UTF.c in Sources */,\n\t\t\t\tF93DE33A0F82C66B00608B94 /* string_conversion.cc in Sources */,\n\t\t\t\tF93DE33B0F82C66B00608B94 /* file_id.cc in Sources */,\n\t\t\t\tF93DE33C0F82C66B00608B94 /* macho_id.cc in Sources */,\n\t\t\t\tF93DE33D0F82C66B00608B94 /* macho_utilities.cc in Sources */,\n\t\t\t\tF93DE33E0F82C66B00608B94 /* macho_walker.cc in Sources */,\n\t\t\t\tF93DE33F0F82C66B00608B94 /* string_utilities.cc in Sources */,\n\t\t\t\tD2F9A3D51212F87C002747C1 /* exception_handler_test.cc in Sources */,\n\t\t\t\tD244540B12439BA0009BBCE0 /* memory_unittest.cc in Sources */,\n\t\t\t\t4D72CA3813DFAE91006CABE3 /* md5.cc in Sources */,\n\t\t\t\t4D61A26E14F43D45002D5862 /* bootstrap_compat.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF9C44DA20EF060A8003AEBAA /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF9C44DB20EF07288003AEBAA /* Controller.m in Sources */,\n\t\t\t\tF9C44DB60EF07288003AEBAA /* main.m in Sources */,\n\t\t\t\tF9C44DB70EF07288003AEBAA /* TestClass.mm in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF9C77DD60F7DD5CF0045F7DB /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF9C77DE40F7DD82F0045F7DB /* SimpleStringDictionary.mm in Sources */,\n\t\t\t\tF9C77DE20F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm in Sources */,\n\t\t\t\tF9C77E130F7DDF810045F7DB /* GTMSenTestCase.m in Sources */,\n\t\t\t\tF91AF5D00FD60393009D8BE2 /* BreakpadFramework_Test.mm in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t8B31023911F0CF0600FCF3E4 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = all_unittests;\n\t\t\ttargetProxy = 8B31023811F0CF0600FCF3E4 /* PBXContainerItemProxy */;\n\t\t};\n\t\t8B31051711F1010E00FCF3E4 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F93803BD0F80820F004D428B /* generator_test */;\n\t\t\ttargetProxy = 8B31051611F1010E00FCF3E4 /* PBXContainerItemProxy */;\n\t\t};\n\t\t8B31051911F1010E00FCF3E4 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F93DE2D00F82A67300608B94 /* minidump_file_writer_unittest */;\n\t\t\ttargetProxy = 8B31051811F1010E00FCF3E4 /* PBXContainerItemProxy */;\n\t\t};\n\t\t8B31051B11F1010E00FCF3E4 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F93DE32B0F82C55600608B94 /* handler_test */;\n\t\t\ttargetProxy = 8B31051A11F1010E00FCF3E4 /* PBXContainerItemProxy */;\n\t\t};\n\t\t8B31051D11F1010E00FCF3E4 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = macho_dump;\n\t\t\ttargetProxy = 8B31051C11F1010E00FCF3E4 /* PBXContainerItemProxy */;\n\t\t};\n\t\t8B31051F11F1010E00FCF3E4 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = minidump_upload;\n\t\t\ttargetProxy = 8B31051E11F1010E00FCF3E4 /* PBXContainerItemProxy */;\n\t\t};\n\t\tD23F4B3012A7E16200686C8D /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = D2F9A41412131EF0002747C1 /* gtest */;\n\t\t\ttargetProxy = D23F4B2F12A7E16200686C8D /* PBXContainerItemProxy */;\n\t\t};\n\t\tD23F4BBA12A8694C00686C8D /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = D23F4BAA12A868A500686C8D /* minidump_generator_test_helper */;\n\t\t\ttargetProxy = D23F4BB912A8694C00686C8D /* PBXContainerItemProxy */;\n\t\t};\n\t\tD2F9A44312131F80002747C1 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = D2F9A41412131EF0002747C1 /* gtest */;\n\t\t\ttargetProxy = D2F9A44212131F80002747C1 /* PBXContainerItemProxy */;\n\t\t};\n\t\tD2F9A52B121383A1002747C1 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = D2F9A41412131EF0002747C1 /* gtest */;\n\t\t\ttargetProxy = D2F9A52C121383A1002747C1 /* PBXContainerItemProxy */;\n\t\t};\n\t\tD2F9A5DF12142A6A002747C1 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = D2F9A52A121383A1002747C1 /* crash_generation_server_test */;\n\t\t\ttargetProxy = D2F9A5DE12142A6A002747C1 /* PBXContainerItemProxy */;\n\t\t};\n\t\tF91AF6380FD60A74009D8BE2 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8DC2EF4F0486A6940098B216 /* Breakpad */;\n\t\t\ttargetProxy = F91AF6370FD60A74009D8BE2 /* PBXContainerItemProxy */;\n\t\t};\n\t\tF92C564E0ECD10E5009BE4BA /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F92C563B0ECD10B3009BE4BA /* breakpadUtilities */;\n\t\t\ttargetProxy = F92C564D0ECD10E5009BE4BA /* PBXContainerItemProxy */;\n\t\t};\n\t\tF92C56860ECD15EF009BE4BA /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F92C563B0ECD10B3009BE4BA /* breakpadUtilities */;\n\t\t\ttargetProxy = F92C56850ECD15EF009BE4BA /* PBXContainerItemProxy */;\n\t\t};\n\t\tF92C56880ECD15F1009BE4BA /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F92C53530ECCE349009BE4BA /* Inspector */;\n\t\t\ttargetProxy = F92C56870ECD15F1009BE4BA /* PBXContainerItemProxy */;\n\t\t};\n\t\tF93DE2FC0F82C3C600608B94 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F93803BD0F80820F004D428B /* generator_test */;\n\t\t\ttargetProxy = F93DE2FB0F82C3C600608B94 /* PBXContainerItemProxy */;\n\t\t};\n\t\tF93DE3700F82CC1300608B94 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F93DE32B0F82C55600608B94 /* handler_test */;\n\t\t\ttargetProxy = F93DE36F0F82CC1300608B94 /* PBXContainerItemProxy */;\n\t\t};\n\t\tF93DE3A70F830D1D00608B94 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F9C77DD90F7DD5CF0045F7DB /* UnitTests */;\n\t\t\ttargetProxy = F93DE3A60F830D1D00608B94 /* PBXContainerItemProxy */;\n\t\t};\n\t\tF94585880F78232B009A47BF /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8DC2EF4F0486A6940098B216 /* Breakpad */;\n\t\t\ttargetProxy = F94585870F78232B009A47BF /* PBXContainerItemProxy */;\n\t\t};\n\t\tF945858A0F78232E009A47BF /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F92C53530ECCE349009BE4BA /* Inspector */;\n\t\t\ttargetProxy = F94585890F78232E009A47BF /* PBXContainerItemProxy */;\n\t\t};\n\t\tF945858C0F782330009A47BF /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F92C563B0ECD10B3009BE4BA /* breakpadUtilities */;\n\t\t\ttargetProxy = F945858B0F782330009A47BF /* PBXContainerItemProxy */;\n\t\t};\n\t\tF945858E0F782333009A47BF /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F92C569F0ECE04A7009BE4BA /* crash_report_sender */;\n\t\t\ttargetProxy = F945858D0F782333009A47BF /* PBXContainerItemProxy */;\n\t\t};\n\t\tF94585900F782336009A47BF /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F9C44DA40EF060A8003AEBAA /* BreakpadTest */;\n\t\t\ttargetProxy = F945858F0F782336009A47BF /* PBXContainerItemProxy */;\n\t\t};\n\t\tF95BB8B3101F94D300AA053B /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = dump_syms;\n\t\t\ttargetProxy = F95BB8B2101F94D300AA053B /* PBXContainerItemProxy */;\n\t\t};\n\t\tF95BB8B5101F94D300AA053B /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = symupload;\n\t\t\ttargetProxy = F95BB8B4101F94D300AA053B /* PBXContainerItemProxy */;\n\t\t};\n\t\tF95BB8B7101F94D300AA053B /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = crash_report;\n\t\t\ttargetProxy = F95BB8B6101F94D300AA053B /* PBXContainerItemProxy */;\n\t\t};\n\t\tF9C44E1A0EF0790F003AEBAA /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8DC2EF4F0486A6940098B216 /* Breakpad */;\n\t\t\ttargetProxy = F9C44E190EF0790F003AEBAA /* PBXContainerItemProxy */;\n\t\t};\n\t\tF9C44E970EF09F4B003AEBAA /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = F92C569F0ECE04A7009BE4BA /* crash_report_sender */;\n\t\t\ttargetProxy = F9C44E960EF09F4B003AEBAA /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t33880C7E0F9E097100817F82 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t33880C7F0F9E097100817F82 /* English */,\n\t\t\t\tDE43468711C7295D004F095F /* da */,\n\t\t\t\tDE43468611C72958004F095F /* de */,\n\t\t\t\tDE43468811C7295F004F095F /* es */,\n\t\t\t\tDE43468911C72964004F095F /* fr */,\n\t\t\t\tDE43468A11C72967004F095F /* it */,\n\t\t\t\tDE43468B11C7296B004F095F /* ja */,\n\t\t\t\tDE43468C11C7296D004F095F /* nl */,\n\t\t\t\tDE43468D11C7296F004F095F /* no */,\n\t\t\t\tDE43468E11C72971004F095F /* sl */,\n\t\t\t\tDE43468F11C72973004F095F /* sv */,\n\t\t\t\tDE43469011C72976004F095F /* tr */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF945849C0F280E3C009A47BF /* Localizable.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tF945849D0F280E3C009A47BF /* English */,\n\t\t\t\tDE43467411C72855004F095F /* da */,\n\t\t\t\tDE43467511C72857004F095F /* de */,\n\t\t\t\tDE43467611C7285B004F095F /* es */,\n\t\t\t\tDE43467711C72862004F095F /* fr */,\n\t\t\t\tDE43467811C72869004F095F /* it */,\n\t\t\t\tDE43467E11C728DC004F095F /* ja */,\n\t\t\t\tDE43467911C7286D004F095F /* nl */,\n\t\t\t\tDE43467A11C72873004F095F /* no */,\n\t\t\t\tDE43467B11C72877004F095F /* sl */,\n\t\t\t\tDE43467C11C7287A004F095F /* sv */,\n\t\t\t\tDE43467F11C728E1004F095F /* tr */,\n\t\t\t);\n\t\t\tname = Localizable.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF9C44DB80EF072A0003AEBAA /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tF9C44DB90EF072A0003AEBAA /* English */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF9C44DBA0EF072A0003AEBAA /* MainMenu.xib */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tF9C44DBB0EF072A0003AEBAA /* English */,\n\t\t\t);\n\t\t\tname = MainMenu.xib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1DEB91AE08733DA50010E9CD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = Framework/Breakpad_Prefix.pch;\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tINFOPLIST_FILE = Framework/Info.plist;\n\t\t\t\tINSTALL_PATH = \"@executable_path/../Frameworks\";\n\t\t\t\tPRODUCT_NAME = Breakpad;\n\t\t\t\tWRAPPER_EXTENSION = framework;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1DEB91AF08733DA50010E9CD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = Framework/Breakpad_Prefix.pch;\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tINFOPLIST_FILE = Framework/Info.plist;\n\t\t\t\tINSTALL_PATH = \"@executable_path/../Frameworks\";\n\t\t\t\tPRODUCT_NAME = Breakpad;\n\t\t\t\tWRAPPER_EXTENSION = framework;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1DEB91B208733DA50010E9CD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = NO;\n\t\t\t\tSDKROOT = macosx10.5;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1DEB91B308733DA50010E9CD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 8B31027811F0D3AF00FCF3E4 /* BreakpadRelease.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = NO;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD23F4BAD12A868A600686C8D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tINSTALL_PATH = /usr/local/bin;\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPRODUCT_NAME = minidump_generator_test_helper;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD23F4BAE12A868A600686C8D /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = YES;\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tINSTALL_PATH = /usr/local/bin;\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPRODUCT_NAME = minidump_generator_test_helper;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tD23F4BAF12A868A600686C8D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = NO;\n\t\t\t\tGCC_MODEL_TUNING = G5;\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tINSTALL_PATH = /usr/local/bin;\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPRODUCT_NAME = minidump_generator_test_helper;\n\t\t\t\tZERO_LINK = NO;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD2F9A41612131EF0002747C1 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t../../testing,\n\t\t\t\t\t../../testing/include,\n\t\t\t\t\t../../testing/gtest,\n\t\t\t\t\t../../testing/gtest/include,\n\t\t\t\t);\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD2F9A41712131EF0002747C1 /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t../../testing,\n\t\t\t\t\t../../testing/include,\n\t\t\t\t\t../../testing/gtest,\n\t\t\t\t\t../../testing/gtest/include,\n\t\t\t\t);\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tD2F9A41812131EF0002747C1 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = NO;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t../../testing,\n\t\t\t\t\t../../testing/include,\n\t\t\t\t\t../../testing/gtest,\n\t\t\t\t\t../../testing/gtest/include,\n\t\t\t\t);\n\t\t\t\tPREBINDING = NO;\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t\tZERO_LINK = NO;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD2F9A543121383A1002747C1 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tGCC_INLINES_ARE_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"BP_LOGGING_INCLUDE=\\\\\\\"client/mac/tests/testlogging.h\\\\\\\"\";\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../..,\n\t\t\t\t\t../../testing,\n\t\t\t\t\t../../testing/include,\n\t\t\t\t\t../../testing/gtest,\n\t\t\t\t\t../../testing/gtest/include,\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/build/Debug\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = crash_generation_server_test;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD2F9A544121383A1002747C1 /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../..,\n\t\t\t\t\t../../testing,\n\t\t\t\t\t../../testing/include,\n\t\t\t\t\t../../testing/gtest,\n\t\t\t\t\t../../testing/gtest/include,\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\\\\\"$(SRCROOT)/build/Debug\\\\\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = crash_generation_server_test;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tD2F9A545121383A1002747C1 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../..,\n\t\t\t\t\t../../testing,\n\t\t\t\t\t../../testing/include,\n\t\t\t\t\t../../testing/gtest,\n\t\t\t\t\t../../testing/gtest/include,\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\\\\\"$(SRCROOT)/build/Debug\\\\\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = crash_generation_server_test;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF92C53560ECCE34A009BE4BA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tPRODUCT_NAME = Inspector;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF92C53570ECCE34A009BE4BA /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tPRODUCT_NAME = Inspector;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF92C563D0ECD10B3009BE4BA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tLD_DYLIB_INSTALL_NAME = \"@executable_path/../Resources/$(EXECUTABLE_PATH)\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-headerpad_max_install_names\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = breakpadUtilities;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF92C563E0ECD10B3009BE4BA /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tLD_DYLIB_INSTALL_NAME = \"@executable_path/../Resources/$(EXECUTABLE_PATH)\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-headerpad_max_install_names\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = breakpadUtilities;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF92C56A30ECE04A8009BE4BA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tINFOPLIST_FILE = \"sender/crash_report_sender-Info.plist\";\n\t\t\t\tPRODUCT_NAME = crash_report_sender;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF92C56A40ECE04A8009BE4BA /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tINFOPLIST_FILE = \"sender/crash_report_sender-Info.plist\";\n\t\t\t\tPRODUCT_NAME = crash_report_sender;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF93803C00F808210004D428B /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"BP_LOGGING_INCLUDE=\\\\\\\"client/mac/tests/testlogging.h\\\\\\\"\";\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../..,\n\t\t\t\t\t../../..,\n\t\t\t\t\t../../testing,\n\t\t\t\t\t../../testing/include,\n\t\t\t\t\t../../testing/gtest,\n\t\t\t\t\t../../testing/gtest/include,\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = generator_test;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF93803C10F808210004D428B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../..,\n\t\t\t\t\t../../..,\n\t\t\t\t\t../../testing,\n\t\t\t\t\t../../testing/include,\n\t\t\t\t\t../../testing/gtest,\n\t\t\t\t\t../../testing/gtest/include,\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = generator_test;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF93DE2D30F82A67400608B94 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tPRODUCT_NAME = minidump_file_writer_unittest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF93DE2D40F82A67400608B94 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tPRODUCT_NAME = minidump_file_writer_unittest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF93DE32E0F82C55700608B94 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tGCC_INLINES_ARE_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"BP_LOGGING_INCLUDE=\\\\\\\"client/mac/tests/testlogging.h\\\\\\\"\";\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../../..,\n\t\t\t\t\t../..,\n\t\t\t\t\t../../testing,\n\t\t\t\t\t../../testing/include,\n\t\t\t\t\t../../testing/gtest,\n\t\t\t\t\t../../testing/gtest/include,\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/build/Debug\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = handler_test;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF93DE32F0F82C55700608B94 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../../..,\n\t\t\t\t\t../..,\n\t\t\t\t\t../../testing,\n\t\t\t\t\t../../testing/include,\n\t\t\t\t\t../../testing/gtest,\n\t\t\t\t\t../../testing/gtest/include,\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/build/Debug\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = handler_test;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF93DE3B90F830E7000608B94 /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 8B31027711F0D3AF00FCF3E4 /* BreakpadDebug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = NO;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tF93DE3BA0F830E7000608B94 /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = Framework/Breakpad_Prefix.pch;\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tINFOPLIST_FILE = Framework/Info.plist;\n\t\t\t\tINSTALL_PATH = \"@executable_path/../Frameworks\";\n\t\t\t\tPRODUCT_NAME = Breakpad;\n\t\t\t\tWRAPPER_EXTENSION = framework;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tF93DE3BB0F830E7000608B94 /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tPRODUCT_NAME = Inspector;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tF93DE3BC0F830E7000608B94 /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tLD_DYLIB_INSTALL_NAME = \"@executable_path/../Resources/$(EXECUTABLE_PATH)\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-headerpad_max_install_names\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = breakpadUtilities;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tF93DE3BD0F830E7000608B94 /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tINFOPLIST_FILE = \"sender/crash_report_sender-Info.plist\";\n\t\t\t\tPRODUCT_NAME = crash_report_sender;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tF93DE3BE0F830E7000608B94 /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(SRCROOT)/build/$(CONFIGURATION)\";\n\t\t\t\tINFOPLIST_FILE = testapp/Info.plist;\n\t\t\t\tPRODUCT_NAME = BreakpadTest;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tF93DE3BF0F830E7000608B94 /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = All;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tF93DE3C00F830E7000608B94 /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(DEVELOPER_FRAMEWORKS_DIR)\\\"\",\n\t\t\t\t);\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tINFOPLIST_FILE = \"UnitTests-Info.plist\";\n\t\t\t\tPRODUCT_NAME = UnitTests;\n\t\t\t\tWRAPPER_EXTENSION = octest;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tF93DE3C10F830E7000608B94 /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../..,\n\t\t\t\t\t../../..,\n\t\t\t\t\t../../testing,\n\t\t\t\t\t../../testing/include,\n\t\t\t\t\t../../testing/gtest,\n\t\t\t\t\t../../testing/gtest/include,\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = generator_test;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tF93DE3C20F830E7000608B94 /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = ../..;\n\t\t\t\tPRODUCT_NAME = minidump_file_writer_unittest;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tF93DE3C30F830E7000608B94 /* Debug With Code Coverage */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../../..,\n\t\t\t\t\t../..,\n\t\t\t\t\t../../testing,\n\t\t\t\t\t../../testing/include,\n\t\t\t\t\t../../testing/gtest,\n\t\t\t\t\t../../testing/gtest/include,\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/build/Debug\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = handler_test;\n\t\t\t};\n\t\t\tname = \"Debug With Code Coverage\";\n\t\t};\n\t\tF94585850F782326009A47BF /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = All;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF94585860F782326009A47BF /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = All;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF9C44DA80EF060A8003AEBAA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(SRCROOT)/build/$(CONFIGURATION)\";\n\t\t\t\tINFOPLIST_FILE = testapp/Info.plist;\n\t\t\t\tPRODUCT_NAME = BreakpadTest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF9C44DA90EF060A8003AEBAA /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(SRCROOT)/build/$(CONFIGURATION)\";\n\t\t\t\tINFOPLIST_FILE = testapp/Info.plist;\n\t\t\t\tPRODUCT_NAME = BreakpadTest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF9C77DDC0F7DD5D00045F7DB /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(DEVELOPER_FRAMEWORKS_DIR)\\\"\",\n\t\t\t\t);\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tINFOPLIST_FILE = \"UnitTests-Info.plist\";\n\t\t\t\tPRODUCT_NAME = UnitTests;\n\t\t\t\tWRAPPER_EXTENSION = octest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF9C77DDD0F7DD5D00045F7DB /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(DEVELOPER_FRAMEWORKS_DIR)\\\"\",\n\t\t\t\t);\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tINFOPLIST_FILE = \"UnitTests-Info.plist\";\n\t\t\t\tPRODUCT_NAME = UnitTests;\n\t\t\t\tWRAPPER_EXTENSION = octest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget \"Breakpad\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1DEB91AE08733DA50010E9CD /* Debug */,\n\t\t\t\tF93DE3BA0F830E7000608B94 /* Debug With Code Coverage */,\n\t\t\t\t1DEB91AF08733DA50010E9CD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject \"Breakpad\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1DEB91B208733DA50010E9CD /* Debug */,\n\t\t\t\tF93DE3B90F830E7000608B94 /* Debug With Code Coverage */,\n\t\t\t\t1DEB91B308733DA50010E9CD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD23F4BB012A868C400686C8D /* Build configuration list for PBXNativeTarget \"minidump_generator_test_helper\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD23F4BAD12A868A600686C8D /* Debug */,\n\t\t\t\tD23F4BAE12A868A600686C8D /* Debug With Code Coverage */,\n\t\t\t\tD23F4BAF12A868A600686C8D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD2F9A42D12131F0E002747C1 /* Build configuration list for PBXNativeTarget \"gtest\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD2F9A41612131EF0002747C1 /* Debug */,\n\t\t\t\tD2F9A41712131EF0002747C1 /* Debug With Code Coverage */,\n\t\t\t\tD2F9A41812131EF0002747C1 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD2F9A542121383A1002747C1 /* Build configuration list for PBXNativeTarget \"crash_generation_server_test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD2F9A543121383A1002747C1 /* Debug */,\n\t\t\t\tD2F9A544121383A1002747C1 /* Debug With Code Coverage */,\n\t\t\t\tD2F9A545121383A1002747C1 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF92C53580ECCE36D009BE4BA /* Build configuration list for PBXNativeTarget \"Inspector\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF92C53560ECCE34A009BE4BA /* Debug */,\n\t\t\t\tF93DE3BB0F830E7000608B94 /* Debug With Code Coverage */,\n\t\t\t\tF92C53570ECCE34A009BE4BA /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF92C56670ECD11A3009BE4BA /* Build configuration list for PBXNativeTarget \"breakpadUtilities\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF92C563D0ECD10B3009BE4BA /* Debug */,\n\t\t\t\tF93DE3BC0F830E7000608B94 /* Debug With Code Coverage */,\n\t\t\t\tF92C563E0ECD10B3009BE4BA /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF92C56A50ECE04A8009BE4BA /* Build configuration list for PBXNativeTarget \"crash_report_sender\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF92C56A30ECE04A8009BE4BA /* Debug */,\n\t\t\t\tF93DE3BD0F830E7000608B94 /* Debug With Code Coverage */,\n\t\t\t\tF92C56A40ECE04A8009BE4BA /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF93803C40F80822E004D428B /* Build configuration list for PBXNativeTarget \"generator_test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF93803C00F808210004D428B /* Debug */,\n\t\t\t\tF93DE3C10F830E7000608B94 /* Debug With Code Coverage */,\n\t\t\t\tF93803C10F808210004D428B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF93DE2D60F82A67700608B94 /* Build configuration list for PBXNativeTarget \"minidump_file_writer_unittest\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF93DE2D30F82A67400608B94 /* Debug */,\n\t\t\t\tF93DE3C20F830E7000608B94 /* Debug With Code Coverage */,\n\t\t\t\tF93DE2D40F82A67400608B94 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF93DE3320F82C5D800608B94 /* Build configuration list for PBXNativeTarget \"handler_test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF93DE32E0F82C55700608B94 /* Debug */,\n\t\t\t\tF93DE3C30F830E7000608B94 /* Debug With Code Coverage */,\n\t\t\t\tF93DE32F0F82C55700608B94 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF94585930F78235C009A47BF /* Build configuration list for PBXAggregateTarget \"All\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF94585850F782326009A47BF /* Debug */,\n\t\t\t\tF93DE3BF0F830E7000608B94 /* Debug With Code Coverage */,\n\t\t\t\tF94585860F782326009A47BF /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF9C44DAA0EF060A9003AEBAA /* Build configuration list for PBXNativeTarget \"BreakpadTest\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF9C44DA80EF060A8003AEBAA /* Debug */,\n\t\t\t\tF93DE3BE0F830E7000608B94 /* Debug With Code Coverage */,\n\t\t\t\tF9C44DA90EF060A8003AEBAA /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF9C77DDE0F7DD5D00045F7DB /* Build configuration list for PBXNativeTarget \"UnitTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF9C77DDC0F7DD5D00045F7DB /* Debug */,\n\t\t\t\tF93DE3C00F830E7000608B94 /* Debug With Code Coverage */,\n\t\t\t\tF9C77DDD0F7DD5D00045F7DB /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 0867D690FE84028FC02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/Framework/Breakpad.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Framework to provide a simple C API to crash reporting for\n// applications.  By default, if any machine-level exception (e.g.,\n// EXC_BAD_ACCESS) occurs, it will be handled by the BreakpadRef\n// object as follows:\n//\n// 1. Create a minidump file (see Breakpad for details)\n// 2. Prompt the user (using CFUserNotification)\n// 3. Invoke a command line reporting tool to send the minidump to a\n//    server\n//\n// By specifying parameters to the BreakpadCreate function, you can\n// modify the default behavior to suit your needs and wants and\n// desires.\n\n// A service name associated with the original bootstrap parent port, saved in\n// OnDemandServer and restored in Inspector.\n#define BREAKPAD_BOOTSTRAP_PARENT_PORT    \"com.Breakpad.BootstrapParent\"\n\ntypedef void *BreakpadRef;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <CoreFoundation/CoreFoundation.h>\n#include <Foundation/Foundation.h>\n\n#include \"BreakpadDefines.h\"\n\n// Optional user-defined function to dec to decide if we should handle\n// this crash or forward it along.\n// Return true if you want Breakpad to handle it.\n// Return false if you want Breakpad to skip it\n// The exception handler always returns false, as if SEND_AND_EXIT were false\n// (which means the next exception handler will take the exception)\ntypedef bool (*BreakpadFilterCallback)(int exception_type,\n                                       int exception_code,\n                                       mach_port_t crashing_thread,\n                                       void *context);\n\n// Create a new BreakpadRef object and install it as an exception\n// handler.  The |parameters| will typically be the contents of your\n// bundle's Info.plist.\n//\n// You can also specify these additional keys for customizable behavior:\n// Key:                           Value:\n// BREAKPAD_PRODUCT               Product name (e.g., \"MyAwesomeProduct\")\n//                                This one is used as the key to identify\n//                                the product when uploading. Falls back to\n//                                CFBundleName if not specified.\n//                                REQUIRED\n//\n// BREAKPAD_PRODUCT_DISPLAY       This is the display name, e.g. a pretty\n//                                name for the product when the crash_sender\n//                                pops up UI for the user. Falls back first to\n//                                CFBundleDisplayName and then to\n//                                BREAKPAD_PRODUCT if not specified.\n//\n// BREAKPAD_VERSION               Product version (e.g., 1.2.3), used\n//                                as metadata for crash report. Falls back to\n//                                CFBundleVersion if not specified.\n//                                REQUIRED\n//\n// BREAKPAD_VENDOR                Vendor name, used in UI (e.g. \"A report has\n//                                been created that you can send to <vendor>\")\n//\n// BREAKPAD_URL                   URL destination for reporting\n//                                REQUIRED\n//\n// BREAKPAD_REPORT_INTERVAL       # of seconds between sending\n//                                reports.  If an additional report is\n//                                generated within this time, it will\n//                                be ignored.  Default: 3600sec.\n//                                Specify 0 to send all reports.\n//\n// BREAKPAD_SKIP_CONFIRM          If true, the reporter will send the report\n//                                without any user intervention.\n//                                Defaults to NO\n//\n// BREAKPAD_CONFIRM_TIMEOUT       Number of seconds before the upload\n//                                confirmation dialog will be automatically\n//                                dismissed (cancelling the upload).\n//                                Default: 300 seconds (min of 60).\n//                                Specify 0 to prevent timeout.\n//\n// BREAKPAD_SEND_AND_EXIT         If true, the handler will exit after sending.\n//                                This will prevent any other handler (e.g.,\n//                                CrashReporter) from getting the crash.\n//                                Defaults TO YES\n//\n// BREAKPAD_DUMP_DIRECTORY        The directory to store crash-dumps\n//                                in. By default, we use\n//                                ~/Library/Breakpad/<BREAKPAD_PRODUCT>\n//                                The path you specify here is tilde-expanded.\n//\n// BREAKPAD_INSPECTOR_LOCATION    The full path to the Inspector executable.\n//                                Defaults to <Framework resources>/Inspector\n//\n// BREAKPAD_REPORTER_EXE_LOCATION The full path to the Reporter/sender\n//                                executable.\n//                                Default:\n//                                <Framework Resources>/crash_report_sender.app\n//\n// BREAKPAD_LOGFILES              Indicates an array of log file paths that\n//                                should be uploaded at crash time.\n//\n// BREAKPAD_REQUEST_COMMENTS      If true, the message dialog will have a\n//                                text box for the user to enter comments.\n//                                Default: NO\n//\n// BREAKPAD_REQUEST_EMAIL         If true and BREAKPAD_REQUEST_COMMENTS is also\n//                                true, the message dialog will have a text\n//                                box for the user to enter their email address.\n//                                Default: NO\n//\n// BREAKPAD_SERVER_TYPE           A parameter that tells Breakpad how to\n//                                rewrite the upload parameters for a specific\n//                                server type.  The currently valid values are\n//                                'socorro' or 'google'.  If you want to add\n//                                other types, see the function in\n//                                crash_report_sender.m that maps parameters to\n//                                URL parameters.  Defaults to 'google'.\n//\n// BREAKPAD_SERVER_PARAMETER_DICT A plist dictionary of static\n//                                parameters that are uploaded to the\n//                                server.  The parameters are sent as\n//                                is to the crash server.  Their\n//                                content isn't added to the minidump\n//                                but pass as URL parameters when\n//                                uploading theminidump to the crash\n//                                server.\n//=============================================================================\n// The BREAKPAD_PRODUCT, BREAKPAD_VERSION and BREAKPAD_URL are\n// required to have non-NULL values.  By default, the BREAKPAD_PRODUCT\n// will be the CFBundleName and the BREAKPAD_VERSION will be the\n// CFBundleVersion when these keys are present in the bundle's\n// Info.plist, which is usually passed in to BreakpadCreate() as an\n// NSDictionary (you could also pass in another dictionary that had\n// the same keys configured).  If the BREAKPAD_PRODUCT or\n// BREAKPAD_VERSION are ultimately undefined, BreakpadCreate() will\n// fail.  You have been warned.\n//\n// If you are running in a debugger, Breakpad will not install, unless the\n// BREAKPAD_IGNORE_DEBUGGER envionment variable is set and/or non-zero.\n//\n// The BREAKPAD_SKIP_CONFIRM and BREAKPAD_SEND_AND_EXIT default\n// values are NO and YES.  However, they can be controlled by setting their\n// values in a user or global plist.\n//\n// It's easiest to use Breakpad via the Framework, but if you're compiling the\n// code in directly, BREAKPAD_INSPECTOR_LOCATION and\n// BREAKPAD_REPORTER_EXE_LOCATION allow you to specify custom paths\n// to the helper executables.\n//\n//=============================================================================\n// The following are NOT user-supplied but are documented here for\n// completeness.  They are calculated by Breakpad during initialization &\n// crash-dump generation, or entered in by the user.\n//\n// BREAKPAD_PROCESS_START_TIME       The time, in seconds since the Epoch, the\n//                                   process started\n//\n// BREAKPAD_PROCESS_CRASH_TIME       The time, in seconds since the Epoch, the\n//                                   process crashed.\n//\n// BREAKPAD_PROCESS_UP_TIME          The total time in milliseconds the process\n//                                   has been running.  This parameter is not\n//                                   set until the crash-dump-generation phase.\n//\n// BREAKPAD_LOGFILE_KEY_PREFIX       Used to find out which parameters in the\n//                                   parameter dictionary correspond to log\n//                                   file paths.\n//\n// BREAKPAD_SERVER_PARAMETER_PREFIX  This prefix is used by Breakpad\n//                                   internally, because Breakpad uses\n//                                   the same dictionary internally to\n//                                   track both its internal\n//                                   configuration parameters and\n//                                   parameters meant to be uploaded\n//                                   to the server.  This string is\n//                                   used internally by Breakpad to\n//                                   prefix user-supplied parameter\n//                                   names so those can be sent to the\n//                                   server without leaking Breakpad's\n//                                   internal values.\n//\n// BREAKPAD_ON_DEMAND                Used internally to indicate to the\n//                                   Reporter that we're sending on-demand,\n//                                   not as result of a crash.\n//\n// BREAKPAD_COMMENTS                 The text the user provided as comments.\n//                                   Only used in crash_report_sender.\n\n// Returns a new BreakpadRef object on success, NULL otherwise.\nBreakpadRef BreakpadCreate(NSDictionary *parameters);\n\n// Uninstall and release the data associated with |ref|.\nvoid BreakpadRelease(BreakpadRef ref);\n\n// Clients may set an optional callback which gets called when a crash\n// occurs.  The callback function should return |true| if we should\n// handle the crash, generate a crash report, etc. or |false| if we\n// should ignore it and forward the crash (normally to CrashReporter).\n// Context is a pointer to arbitrary data to make the callback with.\nvoid BreakpadSetFilterCallback(BreakpadRef ref,\n                               BreakpadFilterCallback callback,\n                               void *context);\n\n// User defined key and value string storage.  Generally this is used\n// to configure Breakpad's internal operation, such as whether the\n// crash_sender should prompt the user, or the filesystem location for\n// the minidump file.  See Breakpad.h for some parameters that can be\n// set.  Anything longer than 255 bytes will be truncated. Note that\n// the string is converted to UTF8 before truncation, so any multibyte\n// character that straddles the 255(256 - 1 for terminator) byte limit\n// will be mangled.\n//\n// A maximum number of 64 key/value pairs are supported.  An assert()\n// will fire if more than this number are set.  Unfortunately, right\n// now, the same dictionary is used for both Breakpad's parameters AND\n// the Upload parameters.\n//\n// TODO (nealsid): Investigate how necessary this is if we don't\n// automatically upload parameters to the server anymore.\n// TODO (nealsid): separate server parameter dictionary from the\n// dictionary used to configure Breakpad, and document limits for each\n// independently.\nvoid BreakpadSetKeyValue(BreakpadRef ref, NSString *key, NSString *value);\nNSString *BreakpadKeyValue(BreakpadRef ref, NSString *key);\nvoid BreakpadRemoveKeyValue(BreakpadRef ref, NSString *key);\n\n// You can use this method to specify parameters that will be uploaded\n// to the crash server.  They will be automatically encoded as\n// necessary.  Note that as mentioned above there are limits on both\n// the number of keys and their length.\nvoid BreakpadAddUploadParameter(BreakpadRef ref, NSString *key,\n                                NSString *value);\n\n// This method will remove a previously-added parameter from the\n// upload parameter set.\nvoid BreakpadRemoveUploadParameter(BreakpadRef ref, NSString *key);\n\n// Add a log file for Breakpad to read and send upon crash dump\nvoid BreakpadAddLogFile(BreakpadRef ref, NSString *logPathname);\n\n// Generate a minidump and send\nvoid BreakpadGenerateAndSendReport(BreakpadRef ref);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/Framework/Breakpad.mm",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n\n#define VERBOSE 0\n\n#if VERBOSE\n  static bool gDebugLog = true;\n#else\n  static bool gDebugLog = false;\n#endif\n\n#define DEBUGLOG if (gDebugLog) fprintf\n#define IGNORE_DEBUGGER \"BREAKPAD_IGNORE_DEBUGGER\"\n\n#import \"client/mac/Framework/Breakpad.h\"\n\n#import <Foundation/Foundation.h>\n#import <sys/stat.h>\n#import <sys/sysctl.h>\n\n#import \"client/mac/crash_generation/Inspector.h\"\n#import \"client/mac/handler/exception_handler.h\"\n#import \"client/mac/Framework/Breakpad.h\"\n#import \"client/mac/Framework/OnDemandServer.h\"\n#import \"client/mac/handler/protected_memory_allocator.h\"\n#import \"common/mac/MachIPC.h\"\n#import \"common/mac/SimpleStringDictionary.h\"\n\nusing google_breakpad::KeyValueEntry;\nusing google_breakpad::MachPortSender;\nusing google_breakpad::MachReceiveMessage;\nusing google_breakpad::MachSendMessage;\nusing google_breakpad::ReceivePort;\nusing google_breakpad::SimpleStringDictionary;\nusing google_breakpad::SimpleStringDictionaryIterator;\n\n//=============================================================================\n// We want any memory allocations which are used by breakpad during the\n// exception handling process (after a crash has happened) to be read-only\n// to prevent them from being smashed before a crash occurs.  Unfortunately\n// we cannot protect against smashes to our exception handling thread's\n// stack.\n//\n// NOTE: Any memory allocations which are not used during the exception\n// handling process may be allocated in the normal ways.\n//\n// The ProtectedMemoryAllocator class provides an Allocate() method which\n// we'll using in conjunction with placement operator new() to control\n// allocation of C++ objects.  Note that we don't use operator delete()\n// but instead call the objects destructor directly:  object->~ClassName();\n//\nProtectedMemoryAllocator *gMasterAllocator = NULL;\nProtectedMemoryAllocator *gKeyValueAllocator = NULL;\nProtectedMemoryAllocator *gBreakpadAllocator = NULL;\n\n// Mutex for thread-safe access to the key/value dictionary used by breakpad.\n// It's a global instead of an instance variable of Breakpad\n// since it can't live in a protected memory area.\npthread_mutex_t gDictionaryMutex;\n\n//=============================================================================\n// Stack-based object for thread-safe access to a memory-protected region.\n// It's assumed that normally the memory block (allocated by the allocator)\n// is protected (read-only).  Creating a stack-based instance of\n// ProtectedMemoryLocker will unprotect this block after taking the lock.\n// Its destructor will first re-protect the memory then release the lock.\nclass ProtectedMemoryLocker {\npublic:\n  // allocator may be NULL, in which case no Protect() or Unprotect() calls\n  // will be made, but a lock will still be taken\n  ProtectedMemoryLocker(pthread_mutex_t *mutex,\n                        ProtectedMemoryAllocator *allocator)\n  : mutex_(mutex), allocator_(allocator) {\n    // Lock the mutex\n    assert(pthread_mutex_lock(mutex_) == 0);\n\n    // Unprotect the memory\n    if (allocator_ ) {\n      allocator_->Unprotect();\n    }\n  }\n\n  ~ProtectedMemoryLocker() {\n    // First protect the memory\n    if (allocator_) {\n      allocator_->Protect();\n    }\n\n    // Then unlock the mutex\n    assert(pthread_mutex_unlock(mutex_) == 0);\n  };\n\nprivate:\n  //  Keep anybody from ever creating one of these things not on the stack.\n  ProtectedMemoryLocker() { }\n  ProtectedMemoryLocker(const ProtectedMemoryLocker&);\n  ProtectedMemoryLocker & operator=(ProtectedMemoryLocker&);\n\n  pthread_mutex_t           *mutex_;\n  ProtectedMemoryAllocator  *allocator_;\n};\n\n//=============================================================================\nclass Breakpad {\n public:\n  // factory method\n  static Breakpad *Create(NSDictionary *parameters) {\n    // Allocate from our special allocation pool\n    Breakpad *breakpad =\n      new (gBreakpadAllocator->Allocate(sizeof(Breakpad)))\n        Breakpad();\n\n    if (!breakpad)\n      return NULL;\n\n    if (!breakpad->Initialize(parameters)) {\n      // Don't use operator delete() here since we allocated from special pool\n      breakpad->~Breakpad();\n      return NULL;\n    }\n\n    return breakpad;\n  }\n\n  ~Breakpad();\n\n  void SetKeyValue(NSString *key, NSString *value);\n  NSString *KeyValue(NSString *key);\n  void RemoveKeyValue(NSString *key);\n\n  void GenerateAndSendReport();\n\n  void SetFilterCallback(BreakpadFilterCallback callback, void *context) {\n    filter_callback_ = callback;\n    filter_callback_context_ = context;\n  }\n\n private:\n  Breakpad()\n    : handler_(NULL),\n      config_params_(NULL),\n      send_and_exit_(true),\n      filter_callback_(NULL),\n      filter_callback_context_(NULL) {\n    inspector_path_[0] = 0;\n  }\n\n  bool Initialize(NSDictionary *parameters);\n\n  bool ExtractParameters(NSDictionary *parameters);\n\n  // Dispatches to HandleException()\n  static bool ExceptionHandlerDirectCallback(void *context,\n                                             int exception_type,\n                                             int exception_code,\n                                             int exception_subcode,\n                                             mach_port_t crashing_thread);\n\n  bool HandleException(int exception_type,\n                       int exception_code,\n                       int exception_subcode,\n                       mach_port_t crashing_thread);\n\n  // Since ExceptionHandler (w/o namespace) is defined as typedef in OSX's\n  // MachineExceptions.h, we have to explicitly name the handler.\n  google_breakpad::ExceptionHandler *handler_; // The actual handler (STRONG)\n\n  char                    inspector_path_[PATH_MAX];  // Path to inspector tool\n\n  SimpleStringDictionary  *config_params_; // Create parameters (STRONG)\n\n  OnDemandServer          inspector_;\n\n  bool                    send_and_exit_;  // Exit after sending, if true\n\n  BreakpadFilterCallback  filter_callback_;\n  void                    *filter_callback_context_;\n};\n\n#pragma mark -\n#pragma mark Helper functions\n\n//=============================================================================\n// Helper functions\n\n//=============================================================================\nstatic BOOL IsDebuggerActive() {\n  BOOL result = NO;\n  NSUserDefaults *stdDefaults = [NSUserDefaults standardUserDefaults];\n\n  // We check both defaults and the environment variable here\n\n  BOOL ignoreDebugger = [stdDefaults boolForKey:@IGNORE_DEBUGGER];\n\n  if (!ignoreDebugger) {\n    char *ignoreDebuggerStr = getenv(IGNORE_DEBUGGER);\n    ignoreDebugger = (ignoreDebuggerStr ? strtol(ignoreDebuggerStr, NULL, 10) : 0) != 0;\n  }\n\n  if (!ignoreDebugger) {\n    pid_t pid = getpid();\n    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid};\n    int mibSize = sizeof(mib) / sizeof(int);\n    size_t actualSize;\n\n    if (sysctl(mib, mibSize, NULL, &actualSize, NULL, 0) == 0) {\n      struct kinfo_proc *info = (struct kinfo_proc *)malloc(actualSize);\n\n      if (info) {\n        // This comes from looking at the Darwin xnu Kernel\n        if (sysctl(mib, mibSize, info, &actualSize, NULL, 0) == 0)\n          result = (info->kp_proc.p_flag & P_TRACED) ? YES : NO;\n\n        free(info);\n      }\n    }\n  }\n\n  return result;\n}\n\n//=============================================================================\nbool Breakpad::ExceptionHandlerDirectCallback(void *context,\n                                                    int exception_type,\n                                                    int exception_code,\n                                                    int exception_subcode,\n                                                    mach_port_t crashing_thread) {\n  Breakpad *breakpad = (Breakpad *)context;\n\n  // If our context is damaged or something, just return false to indicate that\n  // the handler should continue without us.\n  if (!breakpad)\n    return false;\n\n  return breakpad->HandleException( exception_type,\n                                    exception_code,\n                                    exception_subcode,\n                                    crashing_thread);\n}\n\n//=============================================================================\n#pragma mark -\n\n#include <dlfcn.h>\n\n//=============================================================================\n// Returns the pathname to the Resources directory for this version of\n// Breakpad which we are now running.\n//\n// Don't make the function static, since _dyld_lookup_and_bind_fully needs a\n// simple non-static C name\n//\nextern \"C\" {\nNSString * GetResourcePath();\nNSString * GetResourcePath() {\n  NSString *resourcePath = nil;\n\n  // If there are multiple breakpads installed then calling bundleWithIdentifier\n  // will not work properly, so only use that as a backup plan.\n  // We want to find the bundle containing the code where this function lives\n  // and work from there\n  //\n\n  // Get the pathname to the code which contains this function\n  Dl_info info;\n  if (dladdr((const void*)GetResourcePath, &info) != 0) {\n    NSFileManager *filemgr = [NSFileManager defaultManager];\n    NSString *filePath =\n        [filemgr stringWithFileSystemRepresentation:info.dli_fname\n                                             length:strlen(info.dli_fname)];\n    NSString *bundlePath = [filePath stringByDeletingLastPathComponent];\n    // The \"Resources\" directory should be in the same directory as the\n    // executable code, since that's how the Breakpad framework is built.\n    resourcePath = [bundlePath stringByAppendingPathComponent:@\"Resources/\"];\n  } else {\n    DEBUGLOG(stderr, \"Could not find GetResourcePath\\n\");\n    // fallback plan\n    NSBundle *bundle =\n        [NSBundle bundleWithIdentifier:@\"com.Google.BreakpadFramework\"];\n    resourcePath = [bundle resourcePath];\n  }\n\n  return resourcePath;\n}\n}  // extern \"C\"\n\n//=============================================================================\nbool Breakpad::Initialize(NSDictionary *parameters) {\n  // Initialize\n  config_params_ = NULL;\n  handler_ = NULL;\n\n  // Check for debugger\n  if (IsDebuggerActive()) {\n    DEBUGLOG(stderr, \"Debugger is active:  Not installing handler\\n\");\n    return true;\n  }\n\n  // Gather any user specified parameters\n  if (!ExtractParameters(parameters)) {\n    return false;\n  }\n\n  // Get path to Inspector executable.\n  NSString *inspectorPathString = KeyValue(@BREAKPAD_INSPECTOR_LOCATION);\n\n  // Standardize path (resolve symlinkes, etc.)  and escape spaces\n  inspectorPathString = [inspectorPathString stringByStandardizingPath];\n  inspectorPathString = [[inspectorPathString componentsSeparatedByString:@\" \"]\n                                              componentsJoinedByString:@\"\\\\ \"];\n\n  // Create an on-demand server object representing the Inspector.\n  // In case of a crash, we simply need to call the LaunchOnDemand()\n  // method on it, then send a mach message to its service port.\n  // It will then launch and perform a process inspection of our crashed state.\n  // See the HandleException() method for the details.\n#define RECEIVE_PORT_NAME \"com.Breakpad.Inspector\"\n\n  name_t portName;\n  snprintf(portName, sizeof(name_t),  \"%s%d\", RECEIVE_PORT_NAME, getpid());\n\n  // Save the location of the Inspector\n  strlcpy(inspector_path_, [inspectorPathString fileSystemRepresentation],\n          sizeof(inspector_path_));\n\n  // Append a single command-line argument to the Inspector path\n  // representing the bootstrap name of the launch-on-demand receive port.\n  // When the Inspector is launched, it can use this to lookup the port\n  // by calling bootstrap_check_in().\n  strlcat(inspector_path_, \" \", sizeof(inspector_path_));\n  strlcat(inspector_path_, portName, sizeof(inspector_path_));\n\n  kern_return_t kr = inspector_.Initialize(inspector_path_,\n                                           portName,\n                                           true);        // shutdown on exit\n\n  if (kr != KERN_SUCCESS) {\n    return false;\n  }\n\n  // Create the handler (allocating it in our special protected pool)\n  handler_ =\n      new (gBreakpadAllocator->Allocate(\n          sizeof(google_breakpad::ExceptionHandler)))\n          google_breakpad::ExceptionHandler(\n              Breakpad::ExceptionHandlerDirectCallback, this, true);\n  return true;\n}\n\n//=============================================================================\nBreakpad::~Breakpad() {\n  // Note that we don't use operator delete() on these pointers,\n  // since they were allocated by ProtectedMemoryAllocator objects.\n  //\n  if (config_params_) {\n    config_params_->~SimpleStringDictionary();\n  }\n\n  if (handler_)\n    handler_->~ExceptionHandler();\n}\n\n//=============================================================================\nbool Breakpad::ExtractParameters(NSDictionary *parameters) {\n  NSUserDefaults *stdDefaults = [NSUserDefaults standardUserDefaults];\n  NSString *skipConfirm = [stdDefaults stringForKey:@BREAKPAD_SKIP_CONFIRM];\n  NSString *sendAndExit = [stdDefaults stringForKey:@BREAKPAD_SEND_AND_EXIT];\n\n  NSString *serverType = [parameters objectForKey:@BREAKPAD_SERVER_TYPE];\n  NSString *display = [parameters objectForKey:@BREAKPAD_PRODUCT_DISPLAY];\n  NSString *product = [parameters objectForKey:@BREAKPAD_PRODUCT];\n  NSString *version = [parameters objectForKey:@BREAKPAD_VERSION];\n  NSString *urlStr = [parameters objectForKey:@BREAKPAD_URL];\n  NSString *interval = [parameters objectForKey:@BREAKPAD_REPORT_INTERVAL];\n  NSString *inspectorPathString =\n      [parameters objectForKey:@BREAKPAD_INSPECTOR_LOCATION];\n  NSString *reporterPathString =\n      [parameters objectForKey:@BREAKPAD_REPORTER_EXE_LOCATION];\n  NSString *timeout = [parameters objectForKey:@BREAKPAD_CONFIRM_TIMEOUT];\n  NSArray  *logFilePaths = [parameters objectForKey:@BREAKPAD_LOGFILES];\n  NSString *logFileTailSize =\n      [parameters objectForKey:@BREAKPAD_LOGFILE_UPLOAD_SIZE];\n  NSString *requestUserText =\n      [parameters objectForKey:@BREAKPAD_REQUEST_COMMENTS];\n  NSString *requestEmail = [parameters objectForKey:@BREAKPAD_REQUEST_EMAIL];\n  NSString *vendor =\n      [parameters objectForKey:@BREAKPAD_VENDOR];\n  NSString *dumpSubdirectory =\n      [parameters objectForKey:@BREAKPAD_DUMP_DIRECTORY];\n\n  NSDictionary *serverParameters =\n      [parameters objectForKey:@BREAKPAD_SERVER_PARAMETER_DICT];\n\n  // These may have been set above as user prefs, which take priority.\n  if (!skipConfirm) {\n    skipConfirm = [parameters objectForKey:@BREAKPAD_SKIP_CONFIRM];\n  }\n  if (!sendAndExit) {\n    sendAndExit = [parameters objectForKey:@BREAKPAD_SEND_AND_EXIT];\n  }\n\n  if (!product)\n    product = [parameters objectForKey:@\"CFBundleName\"];\n\n  if (!display) {\n    display = [parameters objectForKey:@\"CFBundleDisplayName\"];\n    if (!display) {\n      display = product;\n    }\n  }\n\n  if (!version)\n    version = [parameters objectForKey:@\"CFBundleVersion\"];\n\n  if (!interval)\n    interval = @\"3600\";\n\n  if (!timeout)\n    timeout = @\"300\";\n\n  if (!logFileTailSize)\n    logFileTailSize = @\"200000\";\n\n  if (!vendor) {\n    vendor = @\"Vendor not specified\";\n  }\n\n  // Normalize the values.\n  if (skipConfirm) {\n    skipConfirm = [skipConfirm uppercaseString];\n\n    if ([skipConfirm isEqualToString:@\"YES\"] ||\n        [skipConfirm isEqualToString:@\"TRUE\"] ||\n        [skipConfirm isEqualToString:@\"1\"])\n      skipConfirm = @\"YES\";\n    else\n      skipConfirm = @\"NO\";\n  } else {\n    skipConfirm = @\"NO\";\n  }\n\n  send_and_exit_ = true;\n  if (sendAndExit) {\n    sendAndExit = [sendAndExit uppercaseString];\n\n    if ([sendAndExit isEqualToString:@\"NO\"] ||\n        [sendAndExit isEqualToString:@\"FALSE\"] ||\n        [sendAndExit isEqualToString:@\"0\"])\n      send_and_exit_ = false;\n  }\n\n  if (requestUserText) {\n    requestUserText = [requestUserText uppercaseString];\n\n    if ([requestUserText isEqualToString:@\"YES\"] ||\n        [requestUserText isEqualToString:@\"TRUE\"] ||\n        [requestUserText isEqualToString:@\"1\"])\n      requestUserText = @\"YES\";\n    else\n      requestUserText = @\"NO\";\n  } else {\n    requestUserText = @\"NO\";\n  }\n\n  // Find the helper applications if not specified in user config.\n  NSString *resourcePath = nil;\n  if (!inspectorPathString || !reporterPathString) {\n    resourcePath = GetResourcePath();\n    if (!resourcePath) {\n      DEBUGLOG(stderr, \"Could not get resource path\\n\");\n      return false;\n    }\n  }\n\n  // Find Inspector.\n  if (!inspectorPathString) {\n    inspectorPathString =\n        [resourcePath stringByAppendingPathComponent:@\"Inspector\"];\n  }\n\n  // Verify that there is an Inspector tool.\n  if (![[NSFileManager defaultManager] fileExistsAtPath:inspectorPathString]) {\n    DEBUGLOG(stderr, \"Cannot find Inspector tool\\n\");\n    return false;\n  }\n\n  // Find Reporter.\n  if (!reporterPathString) {\n    reporterPathString =\n        [resourcePath\n         stringByAppendingPathComponent:@\"crash_report_sender.app\"];\n    reporterPathString =\n        [[NSBundle bundleWithPath:reporterPathString] executablePath];\n  }\n\n  // Verify that there is a Reporter application.\n  if (![[NSFileManager defaultManager]\n             fileExistsAtPath:reporterPathString]) {\n    DEBUGLOG(stderr, \"Cannot find Reporter tool\\n\");\n    return false;\n  }\n\n  if (!dumpSubdirectory) {\n    dumpSubdirectory = @\"\";\n  }\n\n  // The product, version, and URL are required values.\n  if (![product length]) {\n    DEBUGLOG(stderr, \"Missing required product key.\\n\");\n    return false;\n  }\n\n  if (![version length]) {\n    DEBUGLOG(stderr, \"Missing required version key.\\n\");\n    return false;\n  }\n\n  if (![urlStr length]) {\n    DEBUGLOG(stderr, \"Missing required URL key.\\n\");\n    return false;\n  }\n\n  config_params_ =\n      new (gKeyValueAllocator->Allocate(sizeof(SimpleStringDictionary)) )\n        SimpleStringDictionary();\n\n  SimpleStringDictionary &dictionary = *config_params_;\n\n  dictionary.SetKeyValue(BREAKPAD_SERVER_TYPE,     [serverType UTF8String]);\n  dictionary.SetKeyValue(BREAKPAD_PRODUCT_DISPLAY, [display UTF8String]);\n  dictionary.SetKeyValue(BREAKPAD_PRODUCT,         [product UTF8String]);\n  dictionary.SetKeyValue(BREAKPAD_VERSION,         [version UTF8String]);\n  dictionary.SetKeyValue(BREAKPAD_URL,             [urlStr UTF8String]);\n  dictionary.SetKeyValue(BREAKPAD_REPORT_INTERVAL, [interval UTF8String]);\n  dictionary.SetKeyValue(BREAKPAD_SKIP_CONFIRM,    [skipConfirm UTF8String]);\n  dictionary.SetKeyValue(BREAKPAD_CONFIRM_TIMEOUT, [timeout UTF8String]);\n  dictionary.SetKeyValue(BREAKPAD_INSPECTOR_LOCATION,\n                         [inspectorPathString fileSystemRepresentation]);\n  dictionary.SetKeyValue(BREAKPAD_REPORTER_EXE_LOCATION,\n                         [reporterPathString fileSystemRepresentation]);\n  dictionary.SetKeyValue(BREAKPAD_LOGFILE_UPLOAD_SIZE,\n                         [logFileTailSize UTF8String]);\n  dictionary.SetKeyValue(BREAKPAD_REQUEST_COMMENTS,\n                         [requestUserText UTF8String]);\n  dictionary.SetKeyValue(BREAKPAD_REQUEST_EMAIL, [requestEmail UTF8String]);\n  dictionary.SetKeyValue(BREAKPAD_VENDOR, [vendor UTF8String]);\n  dictionary.SetKeyValue(BREAKPAD_DUMP_DIRECTORY,\n                         [dumpSubdirectory UTF8String]);\n\n  struct timeval tv;\n  gettimeofday(&tv, NULL);\n  char timeStartedString[32];\n  sprintf(timeStartedString, \"%zd\", tv.tv_sec);\n  dictionary.SetKeyValue(BREAKPAD_PROCESS_START_TIME,\n                         timeStartedString);\n\n  if (logFilePaths) {\n    char logFileKey[255];\n    for(unsigned int i = 0; i < [logFilePaths count]; i++) {\n      sprintf(logFileKey,\"%s%d\", BREAKPAD_LOGFILE_KEY_PREFIX, i);\n      dictionary.SetKeyValue(logFileKey,\n                             [[logFilePaths objectAtIndex:i]\n                               fileSystemRepresentation]);\n    }\n  }\n\n  if (serverParameters) {\n    // For each key-value pair, call BreakpadAddUploadParameter()\n    NSEnumerator *keyEnumerator = [serverParameters keyEnumerator];\n    NSString *aParameter;\n    while ((aParameter = [keyEnumerator nextObject])) {\n      BreakpadAddUploadParameter(this, aParameter,\n\t\t\t\t [serverParameters objectForKey:aParameter]);\n    }\n  }\n  return true;\n}\n\n//=============================================================================\nvoid Breakpad::SetKeyValue(NSString *key, NSString *value) {\n  // We allow nil values. This is the same as removing the keyvalue.\n  if (!config_params_ || !key)\n    return;\n\n  config_params_->SetKeyValue([key UTF8String], [value UTF8String]);\n}\n\n//=============================================================================\nNSString *Breakpad::KeyValue(NSString *key) {\n  if (!config_params_ || !key)\n    return nil;\n\n  const char *value = config_params_->GetValueForKey([key UTF8String]);\n  return value ? [NSString stringWithUTF8String:value] : nil;\n}\n\n//=============================================================================\nvoid Breakpad::RemoveKeyValue(NSString *key) {\n  if (!config_params_ || !key) return;\n\n  config_params_->RemoveKey([key UTF8String]);\n}\n\n//=============================================================================\nvoid Breakpad::GenerateAndSendReport() {\n  config_params_->SetKeyValue(BREAKPAD_ON_DEMAND, \"YES\");\n  HandleException(0, 0, 0, mach_thread_self());\n  config_params_->SetKeyValue(BREAKPAD_ON_DEMAND, \"NO\");\n}\n\n//=============================================================================\nbool Breakpad::HandleException(int exception_type,\n                               int exception_code,\n                               int exception_subcode,\n                               mach_port_t crashing_thread) {\n  DEBUGLOG(stderr, \"Breakpad: an exception occurred\\n\");\n\n  if (filter_callback_) {\n    bool should_handle = filter_callback_(exception_type,\n                                          exception_code,\n                                          crashing_thread,\n                                          filter_callback_context_);\n    if (!should_handle) return false;\n  }\n\n  // We need to reset the memory protections to be read/write,\n  // since LaunchOnDemand() requires changing state.\n  gBreakpadAllocator->Unprotect();\n  // Configure the server to launch when we message the service port.\n  // The reason we do this here, rather than at startup, is that we\n  // can leak a bootstrap service entry if this method is called and\n  // there never ends up being a crash.\n  inspector_.LaunchOnDemand();\n  gBreakpadAllocator->Protect();\n\n  // The Inspector should send a message to this port to verify it\n  // received our information and has finished the inspection.\n  ReceivePort acknowledge_port;\n\n  // Send initial information to the Inspector.\n  MachSendMessage message(kMsgType_InspectorInitialInfo);\n  message.AddDescriptor(mach_task_self());          // our task\n  message.AddDescriptor(crashing_thread);           // crashing thread\n  message.AddDescriptor(mach_thread_self());        // exception-handling thread\n  message.AddDescriptor(acknowledge_port.GetPort());// message receive port\n\n  InspectorInfo info;\n  info.exception_type = exception_type;\n  info.exception_code = exception_code;\n  info.exception_subcode = exception_subcode;\n  info.parameter_count = config_params_->GetCount();\n  message.SetData(&info, sizeof(info));\n\n  MachPortSender sender(inspector_.GetServicePort());\n\n  kern_return_t result = sender.SendMessage(message, 2000);\n\n  if (result == KERN_SUCCESS) {\n    // Now, send a series of key-value pairs to the Inspector.\n    const KeyValueEntry *entry = NULL;\n    SimpleStringDictionaryIterator iter(*config_params_);\n\n    while ( (entry = iter.Next()) ) {\n      KeyValueMessageData keyvalue_data(*entry);\n\n      MachSendMessage keyvalue_message(kMsgType_InspectorKeyValuePair);\n      keyvalue_message.SetData(&keyvalue_data, sizeof(keyvalue_data));\n\n      result = sender.SendMessage(keyvalue_message, 2000);\n\n      if (result != KERN_SUCCESS) {\n        break;\n      }\n    }\n\n    if (result == KERN_SUCCESS) {\n      // Wait for acknowledgement that the inspection has finished.\n      MachReceiveMessage acknowledge_messsage;\n      result = acknowledge_port.WaitForMessage(&acknowledge_messsage, 5000);\n    }\n  }\n\n#if VERBOSE\n  PRINT_MACH_RESULT(result, \"Breakpad: SendMessage \");\n  printf(\"Breakpad: Inspector service port = %#x\\n\",\n    inspector_.GetServicePort());\n#endif\n\n  // If we don't want any forwarding, return true here to indicate that we've\n  // processed things as much as we want.\n  if (send_and_exit_) return true;\n\n  return false;\n}\n\n//=============================================================================\n//=============================================================================\n\n#pragma mark -\n#pragma mark Public API\n\n//=============================================================================\nBreakpadRef BreakpadCreate(NSDictionary *parameters) {\n  try {\n    // This is confusing.  Our two main allocators for breakpad memory are:\n    //    - gKeyValueAllocator for the key/value memory\n    //    - gBreakpadAllocator for the Breakpad, ExceptionHandler, and other\n    //      breakpad allocations which are accessed at exception handling time.\n    //\n    // But in order to avoid these two allocators themselves from being smashed,\n    // we'll protect them as well by allocating them with gMasterAllocator.\n    //\n    // gMasterAllocator itself will NOT be protected, but this doesn't matter,\n    // since once it does its allocations and locks the memory, smashes to itself\n    // don't affect anything we care about.\n    gMasterAllocator =\n        new ProtectedMemoryAllocator(sizeof(ProtectedMemoryAllocator) * 2);\n\n    gKeyValueAllocator =\n        new (gMasterAllocator->Allocate(sizeof(ProtectedMemoryAllocator)))\n            ProtectedMemoryAllocator(sizeof(SimpleStringDictionary));\n\n    // Create a mutex for use in accessing the SimpleStringDictionary\n    int mutexResult = pthread_mutex_init(&gDictionaryMutex, NULL);\n    if (mutexResult == 0) {\n\n      // With the current compiler, gBreakpadAllocator is allocating 1444 bytes.\n      // Let's round up to the nearest page size.\n      //\n      int breakpad_pool_size = 4096;\n\n      /*\n       sizeof(Breakpad)\n       + sizeof(google_breakpad::ExceptionHandler)\n       + sizeof( STUFF ALLOCATED INSIDE ExceptionHandler )\n       */\n\n      gBreakpadAllocator =\n          new (gMasterAllocator->Allocate(sizeof(ProtectedMemoryAllocator)))\n              ProtectedMemoryAllocator(breakpad_pool_size);\n\n      // Stack-based autorelease pool for Breakpad::Create() obj-c code.\n      NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n      Breakpad *breakpad = Breakpad::Create(parameters);\n\n      if (breakpad) {\n        // Make read-only to protect against memory smashers\n        gMasterAllocator->Protect();\n        gKeyValueAllocator->Protect();\n        gBreakpadAllocator->Protect();\n        // Can uncomment this line to figure out how much space was actually\n        // allocated using this allocator\n        //     printf(\"gBreakpadAllocator allocated size = %d\\n\",\n        //         gBreakpadAllocator->GetAllocatedSize() );\n        [pool release];\n        return (BreakpadRef)breakpad;\n      }\n\n      [pool release];\n    }\n  } catch(...) {    // don't let exceptions leave this C API\n    fprintf(stderr, \"BreakpadCreate() : error\\n\");\n  }\n\n  if (gKeyValueAllocator) {\n    gKeyValueAllocator->~ProtectedMemoryAllocator();\n    gKeyValueAllocator = NULL;\n  }\n\n  if (gBreakpadAllocator) {\n    gBreakpadAllocator->~ProtectedMemoryAllocator();\n    gBreakpadAllocator = NULL;\n  }\n\n  delete gMasterAllocator;\n  gMasterAllocator = NULL;\n\n  return NULL;\n}\n\n//=============================================================================\nvoid BreakpadRelease(BreakpadRef ref) {\n  try {\n    Breakpad *breakpad = (Breakpad *)ref;\n\n    if (gMasterAllocator) {\n      gMasterAllocator->Unprotect();\n      gKeyValueAllocator->Unprotect();\n      gBreakpadAllocator->Unprotect();\n\n      breakpad->~Breakpad();\n\n      // Unfortunately, it's not possible to deallocate this stuff\n      // because the exception handling thread is still finishing up\n      // asynchronously at this point...  OK, it could be done with\n      // locks, etc.  But since BreakpadRelease() should usually only\n      // be called right before the process exits, it's not worth\n      // deallocating this stuff.\n#if 0\n      gKeyValueAllocator->~ProtectedMemoryAllocator();\n      gBreakpadAllocator->~ProtectedMemoryAllocator();\n      delete gMasterAllocator;\n\n      gMasterAllocator = NULL;\n      gKeyValueAllocator = NULL;\n      gBreakpadAllocator = NULL;\n#endif\n\n      pthread_mutex_destroy(&gDictionaryMutex);\n    }\n  } catch(...) {    // don't let exceptions leave this C API\n    fprintf(stderr, \"BreakpadRelease() : error\\n\");\n  }\n}\n\n//=============================================================================\nvoid BreakpadSetKeyValue(BreakpadRef ref, NSString *key, NSString *value) {\n  try {\n    // Not called at exception time\n    Breakpad *breakpad = (Breakpad *)ref;\n\n    if (breakpad && key && gKeyValueAllocator) {\n      ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator);\n\n      breakpad->SetKeyValue(key, value);\n    }\n  } catch(...) {    // don't let exceptions leave this C API\n    fprintf(stderr, \"BreakpadSetKeyValue() : error\\n\");\n  }\n}\n\nvoid BreakpadAddUploadParameter(BreakpadRef ref,\n                                NSString *key,\n                                NSString *value) {\n  // The only difference, internally, between an upload parameter and\n  // a key value one that is set with BreakpadSetKeyValue is that we\n  // prepend the keyname with a special prefix.  This informs the\n  // crash sender that the parameter should be sent along with the\n  // POST of the crash dump upload.\n  try {\n    Breakpad *breakpad = (Breakpad *)ref;\n\n    if (breakpad && key && gKeyValueAllocator) {\n      ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator);\n\n      NSString *prefixedKey = [@BREAKPAD_SERVER_PARAMETER_PREFIX\n\t\t\t\tstringByAppendingString:key];\n      breakpad->SetKeyValue(prefixedKey, value);\n    }\n  } catch(...) {    // don't let exceptions leave this C API\n    fprintf(stderr, \"BreakpadSetKeyValue() : error\\n\");\n  }\n}\n\nvoid BreakpadRemoveUploadParameter(BreakpadRef ref,\n                                   NSString *key) {\n  try {\n    // Not called at exception time\n    Breakpad *breakpad = (Breakpad *)ref;\n\n    if (breakpad && key && gKeyValueAllocator) {\n      ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator);\n\n      NSString *prefixedKey = [NSString stringWithFormat:@\"%@%@\",\n                                        @BREAKPAD_SERVER_PARAMETER_PREFIX, key];\n      breakpad->RemoveKeyValue(prefixedKey);\n    }\n  } catch(...) {    // don't let exceptions leave this C API\n    fprintf(stderr, \"BreakpadRemoveKeyValue() : error\\n\");\n  }\n}\n//=============================================================================\nNSString *BreakpadKeyValue(BreakpadRef ref, NSString *key) {\n  NSString *value = nil;\n\n  try {\n    // Not called at exception time\n    Breakpad *breakpad = (Breakpad *)ref;\n\n    if (!breakpad || !key || !gKeyValueAllocator)\n      return nil;\n\n    ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator);\n\n    value = breakpad->KeyValue(key);\n  } catch(...) {    // don't let exceptions leave this C API\n    fprintf(stderr, \"BreakpadKeyValue() : error\\n\");\n  }\n\n  return value;\n}\n\n//=============================================================================\nvoid BreakpadRemoveKeyValue(BreakpadRef ref, NSString *key) {\n  try {\n    // Not called at exception time\n    Breakpad *breakpad = (Breakpad *)ref;\n\n    if (breakpad && key && gKeyValueAllocator) {\n      ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator);\n\n      breakpad->RemoveKeyValue(key);\n    }\n  } catch(...) {    // don't let exceptions leave this C API\n    fprintf(stderr, \"BreakpadRemoveKeyValue() : error\\n\");\n  }\n}\n\n//=============================================================================\nvoid BreakpadGenerateAndSendReport(BreakpadRef ref) {\n  try {\n    Breakpad *breakpad = (Breakpad *)ref;\n\n    if (breakpad && gKeyValueAllocator) {\n      ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator);\n\n      gBreakpadAllocator->Unprotect();\n      breakpad->GenerateAndSendReport();\n      gBreakpadAllocator->Protect();\n    }\n  } catch(...) {    // don't let exceptions leave this C API\n    fprintf(stderr, \"BreakpadGenerateAndSendReport() : error\\n\");\n  }\n}\n\n//=============================================================================\nvoid BreakpadSetFilterCallback(BreakpadRef ref,\n                               BreakpadFilterCallback callback,\n                               void *context) {\n\n  try {\n    Breakpad *breakpad = (Breakpad *)ref;\n\n    if (breakpad && gBreakpadAllocator) {\n      // share the dictionary mutex here (we really don't need a mutex)\n      ProtectedMemoryLocker locker(&gDictionaryMutex, gBreakpadAllocator);\n\n      breakpad->SetFilterCallback(callback, context);\n    }\n  } catch(...) {    // don't let exceptions leave this C API\n    fprintf(stderr, \"BreakpadSetFilterCallback() : error\\n\");\n  }\n}\n\n//============================================================================\nvoid BreakpadAddLogFile(BreakpadRef ref, NSString *logPathname) {\n  int logFileCounter = 0;\n\n  NSString *logFileKey = [NSString stringWithFormat:@\"%@%d\",\n                                   @BREAKPAD_LOGFILE_KEY_PREFIX,\n                                   logFileCounter];\n\n  NSString *existingLogFilename = nil;\n  existingLogFilename = BreakpadKeyValue(ref, logFileKey);\n  // Find the first log file key that we can use by testing for existence\n  while (existingLogFilename) {\n    if ([existingLogFilename isEqualToString:logPathname]) {\n      return;\n    }\n    logFileCounter++;\n    logFileKey = [NSString stringWithFormat:@\"%@%d\",\n                           @BREAKPAD_LOGFILE_KEY_PREFIX,\n                           logFileCounter];\n    existingLogFilename = BreakpadKeyValue(ref, logFileKey);\n  }\n\n  BreakpadSetKeyValue(ref, logFileKey, logPathname);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/Framework/Breakpad_Prefix.pch",
    "content": "//\n// Prefix header for all source files of the 'Breakpad' target in the\n// 'Breakpad' project.\n//\n\n#ifdef __OBJC__\n    #import <Cocoa/Cocoa.h>\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/Framework/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.googlecode.google-breakpad</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/Framework/OnDemandServer.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#import <iostream>\n#import <mach/mach.h>\n#import <servers/bootstrap.h>\n#import <stdio.h>\n#import <stdlib.h>\n#import <sys/stat.h>\n#import <unistd.h>\n\n//==============================================================================\n// class OnDemandServer :\n//    A basic on-demand server launcher supporting a single named service port\n//\n// Example Usage :\n//\n//  kern_return_t result;\n//  OnDemandServer *server = OnDemandServer::Create(\"/tmp/myserver\",\n//                                                  \"com.MyCompany.MyServiceName\",\n//                                                  true,\n//                                                  &result);\n//\n//  if (server) {\n//    server->LaunchOnDemand();\n//    mach_port_t service_port = GetServicePort();\n//\n//    // Send a mach message to service_port and \"myserver\" will be launched\n//  }\n//\n//\n//                  ---- Now in the server code ----\n//\n//  // \"myserver\" should get the service port and read the message which\n//  // launched it:\n//  mach_port_t service_rcv_port_;\n//  kern_return_t kr = bootstrap_check_in(bootstrap_port,\n//                                      \"com.MyCompany.MyServiceName\",\n//                                      &service_rcv_port_);\n//  // mach_msg() read service_rcv_port_ ....\n//\n//  ....\n//\n//  // Later \"myserver\" may want to unregister the service if it doesn't\n//  // want its bootstrap service to stick around after it exits.\n//\n//  // DO NOT use mach_port_deallocate() here -- it will fail and the\n//  // following bootstrap_register() will also fail leaving our service\n//  // name hanging around forever (until reboot)\n//  kern_return_t kr = mach_port_destroy(mach_task_self(), service_rcv_port_);\n//\n//  kr = bootstrap_register(bootstrap_port,\n//                          \"com.MyCompany.MyServiceName\",\n//                          MACH_PORT_NULL);\n\nclass OnDemandServer {\n public:\n  // must call Initialize() to be useful\n  OnDemandServer()\n    : server_port_(MACH_PORT_NULL),\n      service_port_(MACH_PORT_NULL),\n      unregister_on_cleanup_(true) {\n  }\n\n  // Creates the bootstrap server and service\n  kern_return_t Initialize(const char *server_command,\n                           const char *service_name,\n                           bool unregister_on_cleanup);\n\n  // Returns an OnDemandServer object if successful, or NULL if there's\n  // an error.  The error result will be returned in out_result.\n  //\n  //    server_command : the full path name including optional command-line\n  //      arguments to the executable representing the server\n  //\n  //    service_name : represents service name\n  //      something like \"com.company.ServiceName\"\n  //\n  //    unregister_on_cleanup : if true, unregisters the service name\n  //      when the OnDemandServer is deleted -- unregistering will\n  //      ONLY be possible if LaunchOnDemand() has NOT been called.\n  //      If false, then the service will continue to be registered\n  //      even after the current process quits.\n  //\n  //    out_result : if non-NULL, returns the result\n  //      this value will be KERN_SUCCESS if Create() returns non-NULL\n  //\n  static OnDemandServer *Create(const char *server_command,\n                                const char *service_name,\n                                bool unregister_on_cleanup,\n                                kern_return_t *out_result);\n\n  // Cleans up and if LaunchOnDemand() has not yet been called then\n  // the bootstrap service will be unregistered.\n  ~OnDemandServer();\n\n  // This must be called if we intend to commit to launching the server\n  // by sending a mach message to our service port.  Do not call it otherwise\n  // or it will be difficult (impossible?) to unregister the service name.\n  void LaunchOnDemand();\n\n  // This is the port we need to send a mach message to after calling\n  // LaunchOnDemand().  Sending a message causing an immediate launch\n  // of the server\n  mach_port_t GetServicePort() { return service_port_; };\n\n private:\n  // Disallow copy constructor\n  OnDemandServer(const OnDemandServer&);\n\n  // Cleans up and if LaunchOnDemand() has not yet been called then\n  // the bootstrap service will be unregistered.\n  void Unregister();\n\n  name_t      service_name_;\n\n  mach_port_t server_port_;\n  mach_port_t service_port_;\n  bool        unregister_on_cleanup_;\n};\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/Framework/OnDemandServer.mm",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#import \"OnDemandServer.h\"\n\n#import \"Breakpad.h\"\n#include \"common/mac/bootstrap_compat.h\"\n\n#if DEBUG\n  #define PRINT_MACH_RESULT(result_, message_) \\\n    printf(message_\"%s (%d)\\n\", mach_error_string(result_), result_ );\n#if defined(MAC_OS_X_VERSION_10_5) && \\\n    MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5\n  #define PRINT_BOOTSTRAP_RESULT(result_, message_) \\\n    printf(message_\"%s (%d)\\n\", bootstrap_strerror(result_), result_ );\n#else\n  #define PRINT_BOOTSTRAP_RESULT(result_, message_) \\\n    PRINT_MACH_RESULT(result_, message_)\n#endif\n#else\n  #define PRINT_MACH_RESULT(result_, message_)\n  #define PRINT_BOOTSTRAP_RESULT(result_, message_)\n#endif\n\n//==============================================================================\nOnDemandServer *OnDemandServer::Create(const char *server_command,\n                                       const char *service_name,\n                                       bool unregister_on_cleanup,\n                                       kern_return_t *out_result) {\n  OnDemandServer *server = new OnDemandServer();\n\n  if (!server) return NULL;\n\n  kern_return_t result = server->Initialize(server_command,\n                                            service_name,\n                                            unregister_on_cleanup);\n\n  if (out_result) {\n    *out_result = result;\n  }\n\n  if (result == KERN_SUCCESS) {\n    return server;\n  }\n\n  delete server;\n  return NULL;\n};\n\n//==============================================================================\nkern_return_t OnDemandServer::Initialize(const char *server_command,\n                                         const char *service_name,\n                                         bool unregister_on_cleanup) {\n  unregister_on_cleanup_ = unregister_on_cleanup;\n\n  mach_port_t self_task = mach_task_self();\n\n  mach_port_t bootstrap_port;\n  kern_return_t kr = task_get_bootstrap_port(self_task, &bootstrap_port);\n  if (kr != KERN_SUCCESS) {\n    PRINT_MACH_RESULT(kr, \"task_get_bootstrap_port(): \");\n    return kr;\n  }\n\n  mach_port_t bootstrap_subset_port;\n  kr = bootstrap_subset(bootstrap_port, self_task, &bootstrap_subset_port);\n  if (kr != BOOTSTRAP_SUCCESS) {\n    PRINT_BOOTSTRAP_RESULT(kr, \"bootstrap_subset(): \");\n    return kr;\n  }\n\n  // The inspector will be invoked with its bootstrap port set to the subset,\n  // but the sender will need access to the original bootstrap port. Although\n  // the original port is the subset's parent, bootstrap_parent can't be used\n  // because it requires extra privileges. Stash the original bootstrap port\n  // in the subset by registering it under a known name. The inspector will\n  // recover this port and set it as its own bootstrap port in Inspector.mm\n  // Inspector::ResetBootstrapPort.\n  kr = breakpad::BootstrapRegister(\n      bootstrap_subset_port,\n      const_cast<char*>(BREAKPAD_BOOTSTRAP_PARENT_PORT),\n      bootstrap_port);\n  if (kr != BOOTSTRAP_SUCCESS) {\n    PRINT_BOOTSTRAP_RESULT(kr, \"bootstrap_register(): \");\n    return kr;\n  }\n\n  kr = bootstrap_create_server(bootstrap_subset_port,\n                               const_cast<char*>(server_command),\n                               geteuid(),       // server uid\n                               true,\n                               &server_port_);\n  if (kr != BOOTSTRAP_SUCCESS) {\n    PRINT_BOOTSTRAP_RESULT(kr, \"bootstrap_create_server(): \");\n    return kr;\n  }\n\n  strlcpy(service_name_, service_name, sizeof(service_name_));\n\n  // Create a service called service_name, and return send rights to\n  // that port in service_port_.\n  kr = bootstrap_create_service(server_port_,\n                                const_cast<char*>(service_name),\n                                &service_port_);\n  if (kr != BOOTSTRAP_SUCCESS) {\n    PRINT_BOOTSTRAP_RESULT(kr, \"bootstrap_create_service(): \");\n\n    // perhaps the service has already been created - try to look it up\n    kr = bootstrap_look_up(bootstrap_port, (char*)service_name, &service_port_);\n\n    if (kr != BOOTSTRAP_SUCCESS) {\n      PRINT_BOOTSTRAP_RESULT(kr, \"bootstrap_look_up(): \");\n      Unregister();  // clean up server port\n      return kr;\n    }\n  }\n\n  return KERN_SUCCESS;\n}\n\n//==============================================================================\nOnDemandServer::~OnDemandServer() {\n  if (unregister_on_cleanup_) {\n    Unregister();\n  }\n}\n\n//==============================================================================\nvoid OnDemandServer::LaunchOnDemand() {\n  // We need to do this, since the launched server is another process\n  // and holding on to this port delays launching until the current process\n  // exits!\n  mach_port_deallocate(mach_task_self(), server_port_);\n  server_port_ = MACH_PORT_DEAD;\n\n  // Now, the service is still registered and all we need to do is send\n  // a mach message to the service port in order to launch the server.\n}\n\n//==============================================================================\nvoid OnDemandServer::Unregister() {\n  if (service_port_ != MACH_PORT_NULL) {\n    mach_port_deallocate(mach_task_self(), service_port_);\n    service_port_ = MACH_PORT_NULL;\n  }\n\n  if (server_port_ != MACH_PORT_NULL) {\n    // unregister the service\n    kern_return_t kr = breakpad::BootstrapRegister(server_port_,\n                                                   service_name_,\n                                                   MACH_PORT_NULL);\n\n    if (kr != KERN_SUCCESS) {\n      PRINT_MACH_RESULT(kr, \"Breakpad UNREGISTER : bootstrap_register() : \");\n    }\n\n    mach_port_deallocate(mach_task_self(), server_port_);\n    server_port_ = MACH_PORT_NULL;\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/UnitTests-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.yourcompany.${PRODUCT_NAME:identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/crash_generation/ConfigFile.h",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Utility class that can persist a SimpleStringDictionary to disk.\n\n#import <Foundation/Foundation.h>\n\n#import \"common/mac/SimpleStringDictionary.h\"\n\nnamespace google_breakpad {\n\nBOOL EnsureDirectoryPathExists(NSString *dirPath);\n\n//=============================================================================\nclass ConfigFile {\n public:\n  ConfigFile() {\n    config_file_ = -1;\n    config_file_path_[0] = 0;\n    has_created_file_ = false;\n  };\n\n  ~ConfigFile() {\n  };\n\n  void WriteFile(const char* directory,\n                 const SimpleStringDictionary *configurationParameters,\n                 const char *dump_dir,\n                 const char *minidump_id);\n\n  const char *GetFilePath() { return config_file_path_; }\n\n  void Unlink() {\n    if (config_file_ != -1)\n      unlink(config_file_path_);\n\n    config_file_ = -1;\n  }\n\n private:\n  BOOL WriteData(const void *data, size_t length);\n\n  BOOL AppendConfigData(const char *key,\n                        const void *data,\n                        size_t length);\n\n  BOOL AppendConfigString(const char *key,\n                          const char *value);\n\n  BOOL AppendCrashTimeParameters(const char *processStartTimeString);\n\n  int   config_file_;                    // descriptor for config file\n  char  config_file_path_[PATH_MAX];     // Path to configuration file\n  bool  has_created_file_;\n};\n\n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/crash_generation/ConfigFile.mm",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Utility class that can persist a SimpleStringDictionary to disk.\n\n#import \"client/mac/crash_generation/ConfigFile.h\"\n\n#import <Foundation/Foundation.h>\n#include <stdio.h>\n#include <sys/time.h>\n\n#import \"client/apple/Framework/BreakpadDefines.h\"\n#import \"common/mac/SimpleStringDictionary.h\"\n#import \"GTMDefines.h\"\n\n#define VERBOSE 0\n\n#if VERBOSE\n  bool gDebugLog = true;\n#else\n  bool gDebugLog = false;\n#endif\n\n#define DEBUGLOG if (gDebugLog) fprintf\n\nnamespace google_breakpad {\n\n//=============================================================================\nBOOL EnsureDirectoryPathExists(NSString *dirPath) {\n  NSFileManager *mgr = [NSFileManager defaultManager];\n\n  NSDictionary *attrs =\n    [NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedLong:0750]\n                                forKey:NSFilePosixPermissions];\n\n  return [mgr createDirectoryAtPath:dirPath\n        withIntermediateDirectories:YES\n                         attributes:attrs\n                              error:nil];\n}\n\n//=============================================================================\nBOOL ConfigFile::WriteData(const void *data, size_t length) {\n  size_t result = write(config_file_, data, length);\n\n  return result == length;\n}\n\n//=============================================================================\nBOOL ConfigFile::AppendConfigData(const char *key,\n                                  const void *data, size_t length) {\n  assert(config_file_ != -1);\n\n  if (!key) {\n    DEBUGLOG(stderr, \"Breakpad: Missing Key\\n\");\n    return NO;\n  }\n\n  if (!data) {\n    DEBUGLOG(stderr, \"Breakpad: Missing data for key: %s\\n\", key ? key :\n            \"<Unknown Key>\");\n    return NO;\n  }\n\n  // Write the key, \\n, length of data (ascii integer), \\n, data\n  char buffer[16];\n  char nl = '\\n';\n  BOOL result = WriteData(key, strlen(key));\n\n  snprintf(buffer, sizeof(buffer) - 1, \"\\n%lu\\n\", length);\n  result &= WriteData(buffer, strlen(buffer));\n  result &= WriteData(data, length);\n  result &= WriteData(&nl, 1);\n  return result;\n}\n\n//=============================================================================\nBOOL ConfigFile::AppendConfigString(const char *key,\n                                    const char *value) {\n  return AppendConfigData(key, value, strlen(value));\n}\n\n//=============================================================================\nBOOL ConfigFile::AppendCrashTimeParameters(const char *processStartTimeString) {\n  // Set process uptime parameter\n  struct timeval tv;\n  gettimeofday(&tv, NULL);\n\n  char processUptimeString[32], processCrashtimeString[32];\n  // Set up time if we've received the start time.\n  if (processStartTimeString) {\n    time_t processStartTime = strtol(processStartTimeString, NULL, 10);\n    time_t processUptime = tv.tv_sec - processStartTime;\n    // Store the uptime in milliseconds.\n    sprintf(processUptimeString, \"%llu\",\n        static_cast<unsigned long long int>(processUptime) * 1000);\n    if (!AppendConfigString(BREAKPAD_PROCESS_UP_TIME, processUptimeString))\n      return false;\n  }\n\n  sprintf(processCrashtimeString, \"%zd\", tv.tv_sec);\n  return AppendConfigString(BREAKPAD_PROCESS_CRASH_TIME,\n                            processCrashtimeString);\n}\n\n//=============================================================================\nvoid ConfigFile::WriteFile(const char* directory,\n                           const SimpleStringDictionary *configurationParameters,\n                           const char *dump_dir,\n                           const char *minidump_id) {\n\n  assert(config_file_ == -1);\n\n  // Open and write out configuration file preamble\n  if (directory) {\n    snprintf(config_file_path_, sizeof(config_file_path_), \"%s/Config-XXXXXX\",\n             directory);\n  } else {\n    strlcpy(config_file_path_, \"/tmp/Config-XXXXXX\",\n            sizeof(config_file_path_));\n  }\n  config_file_ = mkstemp(config_file_path_);\n\n  if (config_file_ == -1) {\n    DEBUGLOG(stderr,\n             \"mkstemp(config_file_path_) == -1 (%s)\\n\",\n             strerror(errno));\n    return;\n  }\n  else {\n    DEBUGLOG(stderr, \"Writing config file to (%s)\\n\", config_file_path_);\n  }\n\n  has_created_file_ = true;\n\n  // Add the minidump dir\n  AppendConfigString(kReporterMinidumpDirectoryKey, dump_dir);\n  AppendConfigString(kReporterMinidumpIDKey, minidump_id);\n\n  // Write out the configuration parameters\n  BOOL result = YES;\n  const SimpleStringDictionary &dictionary = *configurationParameters;\n\n  const KeyValueEntry *entry = NULL;\n  SimpleStringDictionaryIterator iter(dictionary);\n\n  while ((entry = iter.Next())) {\n    DEBUGLOG(stderr,\n             \"config: (%s) -> (%s)\\n\",\n             entry->GetKey(),\n             entry->GetValue());\n    result = AppendConfigString(entry->GetKey(), entry->GetValue());\n\n    if (!result)\n      break;\n  }\n  AppendCrashTimeParameters(\n      configurationParameters->GetValueForKey(BREAKPAD_PROCESS_START_TIME));\n\n  close(config_file_);\n  config_file_ = -1;\n}\n\n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/crash_generation/Inspector.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Interface file between the Breakpad.framework and\n// the Inspector process.\n\n#import \"common/mac/SimpleStringDictionary.h\"\n\n#import <Foundation/Foundation.h>\n#include <mach/mach.h>\n\n#import \"client/mac/crash_generation/ConfigFile.h\"\n#import \"client/mac/handler/minidump_generator.h\"\n\nextern bool gDebugLog;\n\n#define DEBUGLOG if (gDebugLog) fprintf\n\n// Types of mach messsages (message IDs)\nenum {\n  kMsgType_InspectorInitialInfo = 0,    // data is InspectorInfo\n  kMsgType_InspectorKeyValuePair = 1,   // data is KeyValueMessageData\n  kMsgType_InspectorAcknowledgement = 2 // no data sent\n};\n\n// Initial information sent from the crashed process by\n// Breakpad.framework to the Inspector process\n// The mach message with this struct as data will also include\n// several descriptors for sending mach port rights to the crashed\n// task, etc.\nstruct InspectorInfo {\n  int           exception_type;\n  int           exception_code;\n  int           exception_subcode;\n  unsigned int  parameter_count;  // key-value pairs\n};\n\n// Key/value message data to be sent to the Inspector\nstruct KeyValueMessageData {\n public:\n  KeyValueMessageData() {}\n  KeyValueMessageData(const google_breakpad::KeyValueEntry &inEntry) {\n    strlcpy(key, inEntry.GetKey(), sizeof(key) );\n    strlcpy(value, inEntry.GetValue(), sizeof(value) );\n  }\n\n  char key[google_breakpad::KeyValueEntry::MAX_STRING_STORAGE_SIZE];\n  char value[google_breakpad::KeyValueEntry::MAX_STRING_STORAGE_SIZE];\n};\n\nusing std::string;\nusing google_breakpad::MinidumpGenerator;\n\nnamespace google_breakpad {\n\n//=============================================================================\nclass MinidumpLocation {\n public:\n  MinidumpLocation(NSString *minidumpDir) {\n    // Ensure that the path exists.  Fallback to /tmp if unable to locate path.\n    assert(minidumpDir);\n    if (!EnsureDirectoryPathExists(minidumpDir)) {\n      DEBUGLOG(stderr, \"Unable to create: %s\\n\", [minidumpDir UTF8String]);\n      minidumpDir = @\"/tmp\";\n    }\n\n    strlcpy(minidump_dir_path_, [minidumpDir fileSystemRepresentation],\n            sizeof(minidump_dir_path_));\n\n    // now generate a unique ID\n    string dump_path(minidump_dir_path_);\n    string next_minidump_id;\n\n    string next_minidump_path_ =\n      (MinidumpGenerator::UniqueNameInDirectory(dump_path, &next_minidump_id));\n\n    strlcpy(minidump_id_, next_minidump_id.c_str(), sizeof(minidump_id_));\n  };\n\n  const char *GetPath() { return minidump_dir_path_; }\n  const char *GetID() { return minidump_id_; }\n\n private:\n  char minidump_dir_path_[PATH_MAX];             // Path to minidump directory\n  char minidump_id_[128];\n};\n\n//=============================================================================\nclass Inspector {\n public:\n  Inspector() {};\n\n  // given a bootstrap service name, receives mach messages\n  // from a crashed process, then inspects it, creates a minidump file\n  // and asks the user if he wants to upload it to a server.\n  void            Inspect(const char *receive_port_name);\n\n private:\n  // The Inspector is invoked with its bootstrap port set to the bootstrap\n  // subset established in OnDemandServer.mm OnDemandServer::Initialize.\n  // For proper communication with the system, the sender (which will inherit\n  // the Inspector's bootstrap port) needs the per-session bootstrap namespace\n  // available directly in its bootstrap port. OnDemandServer stashed this\n  // port into the subset namespace under a special name. ResetBootstrapPort\n  // recovers this port and switches this task to use it as its own bootstrap\n  // (ensuring that children like the sender will inherit it), and saves the\n  // subset in bootstrap_subset_port_ for use by ServiceCheckIn and\n  // ServiceCheckOut.\n  kern_return_t   ResetBootstrapPort();\n\n  kern_return_t   ServiceCheckIn(const char *receive_port_name);\n  kern_return_t   ServiceCheckOut(const char *receive_port_name);\n\n  kern_return_t   ReadMessages();\n\n  bool            InspectTask();\n  kern_return_t   SendAcknowledgement();\n  void            LaunchReporter(const char *inConfigFilePath);\n\n  // The bootstrap port in which the inspector is registered and into which it\n  // must check in.\n  mach_port_t     bootstrap_subset_port_;\n\n  mach_port_t     service_rcv_port_;\n\n  int             exception_type_;\n  int             exception_code_;\n  int             exception_subcode_;\n  mach_port_t     remote_task_;\n  mach_port_t     crashing_thread_;\n  mach_port_t     handler_thread_;\n  mach_port_t     ack_port_;\n\n  SimpleStringDictionary config_params_;\n\n  ConfigFile      config_file_;\n};\n\n\n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/crash_generation/Inspector.mm",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Utility that can inspect another process and write a crash dump\n\n#include <cstdio>\n#include <iostream>\n#include <servers/bootstrap.h>\n#include <stdio.h>\n#include <string.h>\n#include <string>\n\n#import \"client/mac/crash_generation/Inspector.h\"\n\n#import \"client/mac/Framework/Breakpad.h\"\n#import \"client/mac/handler/minidump_generator.h\"\n\n#import \"common/mac/SimpleStringDictionary.h\"\n#import \"common/mac/MachIPC.h\"\n#include \"common/mac/bootstrap_compat.h\"\n\n#import \"GTMDefines.h\"\n\n#import <Foundation/Foundation.h>\n\nnamespace google_breakpad {\n\n//=============================================================================\nvoid Inspector::Inspect(const char *receive_port_name) {\n  kern_return_t result = ResetBootstrapPort();\n  if (result != KERN_SUCCESS) {\n    return;\n  }\n\n  result = ServiceCheckIn(receive_port_name);\n\n  if (result == KERN_SUCCESS) {\n    result = ReadMessages();\n\n    if (result == KERN_SUCCESS) {\n      // Inspect the task and write a minidump file.\n      bool wrote_minidump = InspectTask();\n\n      // Send acknowledgement to the crashed process that the inspection\n      // has finished.  It will then be able to cleanly exit.\n      // The return value is ignored because failure isn't fatal. If the process\n      // didn't get the message there's nothing we can do, and we still want to\n      // send the report.\n      SendAcknowledgement();\n\n      if (wrote_minidump) {\n        // Ask the user if he wants to upload the crash report to a server,\n        // and do so if he agrees.\n        LaunchReporter(config_file_.GetFilePath());\n      } else {\n        fprintf(stderr, \"Inspection of crashed process failed\\n\");\n      }\n\n      // Now that we're done reading messages, cleanup the service, but only\n      // if there was an actual exception\n      // Otherwise, it means the dump was generated on demand and the process\n      // lives on, and we might be needed again in the future.\n      if (exception_code_) {\n        ServiceCheckOut(receive_port_name);\n      }\n    } else {\n        PRINT_MACH_RESULT(result, \"Inspector: WaitForMessage()\");\n    }\n  }\n}\n\n//=============================================================================\nkern_return_t Inspector::ResetBootstrapPort() {\n  // A reasonable default, in case anything fails.\n  bootstrap_subset_port_ = bootstrap_port;\n\n  mach_port_t self_task = mach_task_self();\n\n  kern_return_t kr = task_get_bootstrap_port(self_task,\n                                             &bootstrap_subset_port_);\n  if (kr != KERN_SUCCESS) {\n    NSLog(@\"ResetBootstrapPort: task_get_bootstrap_port failed: %s (%d)\",\n          mach_error_string(kr), kr);\n    return kr;\n  }\n\n  mach_port_t bootstrap_parent_port;\n  kr = bootstrap_look_up(bootstrap_subset_port_,\n                         const_cast<char*>(BREAKPAD_BOOTSTRAP_PARENT_PORT),\n                         &bootstrap_parent_port);\n  if (kr != BOOTSTRAP_SUCCESS) {\n    NSLog(@\"ResetBootstrapPort: bootstrap_look_up failed: %s (%d)\",\n#if defined(MAC_OS_X_VERSION_10_5) && \\\n    MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5\n          bootstrap_strerror(kr),\n#else\n          mach_error_string(kr),\n#endif\n          kr);\n    return kr;\n  }\n\n  kr = task_set_bootstrap_port(self_task, bootstrap_parent_port);\n  if (kr != KERN_SUCCESS) {\n    NSLog(@\"ResetBootstrapPort: task_set_bootstrap_port failed: %s (%d)\",\n          mach_error_string(kr), kr);\n    return kr;\n  }\n\n  // Some things access the bootstrap port through this global variable\n  // instead of calling task_get_bootstrap_port.\n  bootstrap_port = bootstrap_parent_port;\n\n  return KERN_SUCCESS;\n}\n\n//=============================================================================\nkern_return_t Inspector::ServiceCheckIn(const char *receive_port_name) {\n  // We need to get the mach port representing this service, so we can\n  // get information from the crashed process.\n  kern_return_t kr = bootstrap_check_in(bootstrap_subset_port_,\n                                        (char*)receive_port_name,\n                                        &service_rcv_port_);\n\n  if (kr != KERN_SUCCESS) {\n#if VERBOSE\n    PRINT_MACH_RESULT(kr, \"Inspector: bootstrap_check_in()\");\n#endif\n  }\n\n  return kr;\n}\n\n//=============================================================================\nkern_return_t Inspector::ServiceCheckOut(const char *receive_port_name) {\n  // We're done receiving mach messages from the crashed process,\n  // so clean up a bit.\n  kern_return_t kr;\n\n  // DO NOT use mach_port_deallocate() here -- it will fail and the\n  // following bootstrap_register() will also fail leaving our service\n  // name hanging around forever (until reboot)\n  kr = mach_port_destroy(mach_task_self(), service_rcv_port_);\n\n  if (kr != KERN_SUCCESS) {\n    PRINT_MACH_RESULT(kr,\n      \"Inspector: UNREGISTERING: service_rcv_port mach_port_deallocate()\");\n    return kr;\n  }\n\n  // Unregister the service associated with the receive port.\n  kr = breakpad::BootstrapRegister(bootstrap_subset_port_,\n                                   (char*)receive_port_name,\n                                   MACH_PORT_NULL);\n\n  if (kr != KERN_SUCCESS) {\n    PRINT_MACH_RESULT(kr, \"Inspector: UNREGISTERING: bootstrap_register()\");\n  }\n\n  return kr;\n}\n\n//=============================================================================\nkern_return_t Inspector::ReadMessages() {\n  // Wait for an initial message from the crashed process containing basic\n  // information about the crash.\n  ReceivePort receive_port(service_rcv_port_);\n\n  MachReceiveMessage message;\n  kern_return_t result = receive_port.WaitForMessage(&message, 1000);\n\n  if (result == KERN_SUCCESS) {\n    InspectorInfo &info = (InspectorInfo &)*message.GetData();\n    exception_type_ = info.exception_type;\n    exception_code_ = info.exception_code;\n    exception_subcode_ = info.exception_subcode;\n\n#if VERBOSE\n    printf(\"message ID = %d\\n\", message.GetMessageID());\n#endif\n\n    remote_task_ = message.GetTranslatedPort(0);\n    crashing_thread_ = message.GetTranslatedPort(1);\n    handler_thread_ = message.GetTranslatedPort(2);\n    ack_port_ = message.GetTranslatedPort(3);\n\n#if VERBOSE\n    printf(\"exception_type = %d\\n\", exception_type_);\n    printf(\"exception_code = %d\\n\", exception_code_);\n    printf(\"exception_subcode = %d\\n\", exception_subcode_);\n    printf(\"remote_task = %d\\n\", remote_task_);\n    printf(\"crashing_thread = %d\\n\", crashing_thread_);\n    printf(\"handler_thread = %d\\n\", handler_thread_);\n    printf(\"ack_port_ = %d\\n\", ack_port_);\n    printf(\"parameter count = %d\\n\", info.parameter_count);\n#endif\n\n    // In certain situations where multiple crash requests come\n    // through quickly, we can end up with the mach IPC messages not\n    // coming through correctly.  Since we don't know what parameters\n    // we've missed, we can't do much besides abort the crash dump\n    // situation in this case.\n    unsigned int parameters_read = 0;\n    // The initial message contains the number of key value pairs that\n    // we are expected to read.\n    // Read each key/value pair, one mach message per key/value pair.\n    for (unsigned int i = 0; i < info.parameter_count; ++i) {\n      MachReceiveMessage parameter_message;\n      result = receive_port.WaitForMessage(&parameter_message, 1000);\n\n      if(result == KERN_SUCCESS) {\n        KeyValueMessageData &key_value_data =\n          (KeyValueMessageData&)*parameter_message.GetData();\n        // If we get a blank key, make sure we don't increment the\n        // parameter count; in some cases (notably on-demand generation\n        // many times in a short period of time) caused the Mach IPC\n        // messages to not come through correctly.\n        if (strlen(key_value_data.key) == 0) {\n          continue;\n        }\n        parameters_read++;\n\n        config_params_.SetKeyValue(key_value_data.key, key_value_data.value);\n      } else {\n        PRINT_MACH_RESULT(result, \"Inspector: key/value message\");\n        break;\n      }\n    }\n    if (parameters_read != info.parameter_count) {\n      DEBUGLOG(stderr, \"Only read %d parameters instead of %d, aborting crash \"\n               \"dump generation.\", parameters_read, info.parameter_count);\n      return KERN_FAILURE;\n    }\n  }\n\n  return result;\n}\n\n//=============================================================================\nbool Inspector::InspectTask() {\n  // keep the task quiet while we're looking at it\n  task_suspend(remote_task_);\n  DEBUGLOG(stderr, \"Suspended Remote task\\n\");\n\n  NSString *minidumpDir;\n\n  const char *minidumpDirectory =\n    config_params_.GetValueForKey(BREAKPAD_DUMP_DIRECTORY);\n\n  // If the client app has not specified a minidump directory,\n  // use a default of Library/<kDefaultLibrarySubdirectory>/<Product Name>\n  if (!minidumpDirectory || 0 == strlen(minidumpDirectory)) {\n    NSArray *libraryDirectories =\n      NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,\n                                          NSUserDomainMask,\n                                          YES);\n\n    NSString *applicationSupportDirectory =\n        [libraryDirectories objectAtIndex:0];\n    NSString *library_subdirectory = [NSString \n        stringWithUTF8String:kDefaultLibrarySubdirectory];\n    NSString *breakpad_product = [NSString \n        stringWithUTF8String:config_params_.GetValueForKey(BREAKPAD_PRODUCT)];\n        \n    NSArray *path_components = [NSArray\n        arrayWithObjects:applicationSupportDirectory,\n                         library_subdirectory,\n                         breakpad_product,\n                         nil];\n\n    minidumpDir = [NSString pathWithComponents:path_components];\n  } else {\n    minidumpDir = [[NSString stringWithUTF8String:minidumpDirectory]\n                    stringByExpandingTildeInPath];\n  }\n  DEBUGLOG(stderr, \n           \"Writing minidump to directory (%s)\\n\",\n           [minidumpDir UTF8String]);\n\n  MinidumpLocation minidumpLocation(minidumpDir);\n\n  // Obscure bug alert:\n  // Don't use [NSString stringWithFormat] to build up the path here since it\n  // assumes system encoding and in RTL locales will prepend an LTR override\n  // character for paths beginning with '/' which fileSystemRepresentation does\n  // not remove. Filed as rdar://6889706 .\n  NSString *path_ns = [NSString\n      stringWithUTF8String:minidumpLocation.GetPath()];\n  NSString *pathid_ns = [NSString\n      stringWithUTF8String:minidumpLocation.GetID()];\n  NSString *minidumpPath = [path_ns stringByAppendingPathComponent:pathid_ns];\n  minidumpPath = [minidumpPath \n      stringByAppendingPathExtension:@\"dmp\"];\n  \n  DEBUGLOG(stderr, \n           \"minidump path (%s)\\n\",\n           [minidumpPath UTF8String]);\n\n\n  config_file_.WriteFile( 0,\n                          &config_params_,\n                          minidumpLocation.GetPath(),\n                          minidumpLocation.GetID());\n\n\n  MinidumpGenerator generator(remote_task_, handler_thread_);\n\n  if (exception_type_ && exception_code_) {\n    generator.SetExceptionInformation(exception_type_,\n                                      exception_code_,\n                                      exception_subcode_,\n                                      crashing_thread_);\n  }\n\n\n  bool result = generator.Write([minidumpPath fileSystemRepresentation]);\n\n  if (result) {\n    DEBUGLOG(stderr, \"Wrote minidump - OK\\n\");\n  } else {\n    DEBUGLOG(stderr, \"Error writing minidump - errno=%s\\n\",  strerror(errno));\n  }\n\n  // let the task continue\n  task_resume(remote_task_);\n  DEBUGLOG(stderr, \"Resumed remote task\\n\");\n\n  return result;\n}\n\n//=============================================================================\n// The crashed task needs to be told that the inspection has finished.\n// It will wait on a mach port (with timeout) until we send acknowledgement.\nkern_return_t Inspector::SendAcknowledgement() {\n  if (ack_port_ != MACH_PORT_DEAD) {\n    MachPortSender sender(ack_port_);\n    MachSendMessage ack_message(kMsgType_InspectorAcknowledgement);\n\n    DEBUGLOG(stderr, \"Inspector: trying to send acknowledgement to port %d\\n\",\n      ack_port_);\n\n    kern_return_t result = sender.SendMessage(ack_message, 2000);\n\n#if VERBOSE\n    PRINT_MACH_RESULT(result, \"Inspector: sent acknowledgement\");\n#endif\n\n    return result;\n  }\n\n  DEBUGLOG(stderr, \"Inspector: port translation failure!\\n\");\n  return KERN_INVALID_NAME;\n}\n\n//=============================================================================\nvoid Inspector::LaunchReporter(const char *inConfigFilePath) {\n  // Extract the path to the reporter executable.\n  const char *reporterExecutablePath =\n          config_params_.GetValueForKey(BREAKPAD_REPORTER_EXE_LOCATION);\n  DEBUGLOG(stderr, \"reporter path = %s\\n\", reporterExecutablePath);\n\n  // Setup and launch the crash dump sender.\n  const char *argv[3];\n  argv[0] = reporterExecutablePath;\n  argv[1] = inConfigFilePath;\n  argv[2] = NULL;\n\n  // Launch the reporter\n  pid_t pid = fork();\n\n  // If we're in the child, load in our new executable and run.\n  // The parent will not wait for the child to complete.\n  if (pid == 0) {\n    execv(argv[0], (char * const *)argv);\n    config_file_.Unlink();  // launch failed - get rid of config file\n    DEBUGLOG(stderr, \"Inspector: unable to launch reporter app\\n\");\n    _exit(1);\n  }\n\n  // Wait until the Reporter child process exits.\n  //\n\n  // We'll use a timeout of one minute.\n  int timeoutCount = 60;   // 60 seconds\n\n  while (timeoutCount-- > 0) {\n    int status;\n    pid_t result = waitpid(pid, &status, WNOHANG);\n\n    if (result == 0) {\n      // The child has not yet finished.\n      sleep(1);\n    } else if (result == -1) {\n      DEBUGLOG(stderr, \"Inspector: waitpid error (%d) waiting for reporter app\\n\",\n        errno);\n      break;\n    } else {\n      // child has finished\n      break;\n    }\n  }\n}\n\n} // namespace google_breakpad\n\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/crash_generation/InspectorMain.mm",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Main driver for Inspector\n\n#import \"client/mac/crash_generation/Inspector.h\"\n#import <Cocoa/Cocoa.h>\n\nnamespace google_breakpad {\n\n//=============================================================================\nextern \"C\" {\n\nint main(int argc, char *const argv[]) {\n#if DEBUG\n  // Since we're launched on-demand, this is necessary to see debugging\n  // output in the console window.\n  freopen(\"/dev/console\", \"w\", stdout);\n  freopen(\"/dev/console\", \"w\", stderr);\n#endif\n\n  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n\n  if (argc != 2) {\n    exit(0);\n  }\n  // Our first command-line argument contains the name of the service\n  // that we're providing.\n  google_breakpad::Inspector inspector;\n  inspector.Inspect(argv[1]);\n\n  [pool release];\n\n  return 0;\n}\n\n} // extern \"C\"\n\n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/crash_generation/client_info.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_MAC_CRASH_GENERATION_CLIENT_INFO_H_\n#define CLIENT_MAC_CRASH_GENERATION_CLIENT_INFO_H_\n\nnamespace google_breakpad {\n\nclass ClientInfo {\n public:\n  explicit ClientInfo(pid_t pid) : pid_(pid) {}\n\n  pid_t pid() const { return pid_; }\n\n private:\n  pid_t pid_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_MAC_CRASH_GENERATION_CLIENT_INFO_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/crash_generation/crash_generation_client.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"client/mac/crash_generation/crash_generation_client.h\"\n\n#include \"client/mac/crash_generation/crash_generation_server.h\"\n#include \"common/mac/MachIPC.h\"\n\nnamespace google_breakpad {\n\nbool CrashGenerationClient::RequestDumpForException(\n    int exception_type,\n    int exception_code,\n    int exception_subcode,\n    mach_port_t crashing_thread) {\n  // The server will send a message to this port indicating that it\n  // has finished its work.\n  ReceivePort acknowledge_port;\n\n  MachSendMessage message(kDumpRequestMessage);\n  message.AddDescriptor(mach_task_self());            // this task\n  message.AddDescriptor(crashing_thread);             // crashing thread\n  message.AddDescriptor(mach_thread_self());          // handler thread\n  message.AddDescriptor(acknowledge_port.GetPort());  // message receive port\n\n  ExceptionInfo info;\n  info.exception_type = exception_type;\n  info.exception_code = exception_code;\n  info.exception_subcode = exception_subcode;\n  message.SetData(&info, sizeof(info));\n\n  const mach_msg_timeout_t kSendTimeoutMs = 2 * 1000;\n  kern_return_t result = sender_.SendMessage(message, kSendTimeoutMs);\n  if (result != KERN_SUCCESS)\n    return false;\n\n  // Give the server slightly longer to reply since it has to\n  // inspect this task and write the minidump.\n  const mach_msg_timeout_t kReceiveTimeoutMs = 5 * 1000;\n  MachReceiveMessage acknowledge_message;\n  result = acknowledge_port.WaitForMessage(&acknowledge_message,\n\t\t\t\t\t   kReceiveTimeoutMs);\n  return result == KERN_SUCCESS;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/crash_generation/crash_generation_client.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_\n#define GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_\n\n#include \"common/mac/MachIPC.h\"\n\nnamespace google_breakpad {\n\nclass CrashGenerationClient {\n public:\n  explicit CrashGenerationClient(const char* mach_port_name)\n    : sender_(mach_port_name) {\n  }\n\n  // Request the crash server to generate a dump.\n  //\n  // Return true if the dump was successful; false otherwise.\n  bool RequestDumpForException(int exception_type,\n\t\t\t       int exception_code,\n\t\t\t       int exception_subcode,\n\t\t\t       mach_port_t crashing_thread);\n\n  bool RequestDump() {\n    return RequestDumpForException(0, 0, 0, MACH_PORT_NULL);\n  }\n\n private:\n  MachPortSender sender_;\n\n  // Prevent copy construction and assignment.\n  CrashGenerationClient(const CrashGenerationClient&);\n  CrashGenerationClient& operator=(const CrashGenerationClient&);\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/crash_generation/crash_generation_server.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"client/mac/crash_generation/crash_generation_server.h\"\n\n#include \"client/mac/crash_generation/client_info.h\"\n#include \"client/mac/handler/minidump_generator.h\"\n#include \"common/mac/scoped_task_suspend-inl.h\"\n\nnamespace google_breakpad {\n\nCrashGenerationServer::CrashGenerationServer(\n    const char *mach_port_name,\n    OnClientDumpRequestCallback dump_callback,\n    void *dump_context,\n    OnClientExitingCallback exit_callback,\n    void *exit_context,\n    bool generate_dumps,\n    const std::string &dump_path)\n    : dump_callback_(dump_callback),\n      dump_context_(dump_context),\n      exit_callback_(exit_callback),\n      exit_context_(exit_context),\n      generate_dumps_(generate_dumps),\n      dump_dir_(dump_path.empty() ? \"/tmp\" : dump_path),\n      started_(false),\n      receive_port_(mach_port_name),\n      mach_port_name_(mach_port_name) {\n}\n\nCrashGenerationServer::~CrashGenerationServer() {\n  if (started_)\n    Stop();\n}\n\nbool CrashGenerationServer::Start() {\n  int thread_create_result = pthread_create(&server_thread_, NULL,\n                                            &WaitForMessages, this);\n  started_ = thread_create_result == 0;\n  return started_;\n}\n\nbool CrashGenerationServer::Stop() {\n  if (!started_)\n    return false;\n\n  // Send a quit message to the background thread, and then join it.\n  MachPortSender sender(mach_port_name_.c_str());\n  MachSendMessage quit_message(kQuitMessage);\n  const mach_msg_timeout_t kSendTimeoutMs = 2 * 1000;\n  kern_return_t result = sender.SendMessage(quit_message, kSendTimeoutMs);\n  if (result == KERN_SUCCESS) {\n    int thread_join_result = pthread_join(server_thread_, NULL);\n    started_ = thread_join_result != 0;\n  }\n\n  return !started_;\n}\n\n// static\nvoid *CrashGenerationServer::WaitForMessages(void *server) {\n  CrashGenerationServer *self =\n      reinterpret_cast<CrashGenerationServer*>(server);\n  while (self->WaitForOneMessage()) {}\n  return NULL;\n}\n\nbool CrashGenerationServer::WaitForOneMessage() {\n  MachReceiveMessage message;\n  kern_return_t result = receive_port_.WaitForMessage(&message,\n                                                      MACH_MSG_TIMEOUT_NONE);\n  if (result == KERN_SUCCESS) {\n    switch (message.GetMessageID()) {\n      case kDumpRequestMessage: {\n        ExceptionInfo &info = (ExceptionInfo &)*message.GetData();\n      \n        mach_port_t remote_task = message.GetTranslatedPort(0);\n        mach_port_t crashing_thread = message.GetTranslatedPort(1);\n        mach_port_t handler_thread = message.GetTranslatedPort(2);\n        mach_port_t ack_port = message.GetTranslatedPort(3);\n        pid_t remote_pid = -1;\n        pid_for_task(remote_task, &remote_pid);\n        ClientInfo client(remote_pid);\n\n        bool result;\n        std::string dump_path;\n        if (generate_dumps_) {\n          ScopedTaskSuspend suspend(remote_task);\n\n          MinidumpGenerator generator(remote_task, handler_thread);\n          dump_path = generator.UniqueNameInDirectory(dump_dir_, NULL);\n        \n          if (info.exception_type && info.exception_code) {\n            generator.SetExceptionInformation(info.exception_type,\n                                              info.exception_code,\n                                              info.exception_subcode,\n                                              crashing_thread);\n          }\n          result = generator.Write(dump_path.c_str());\n        } else {\n          result = true;\n        }\n\n        if (result && dump_callback_) {\n          dump_callback_(dump_context_, client, dump_path);\n        }\n\n        // TODO(ted): support a way for the client to send additional data,\n        // perhaps with a callback so users of the server can read the data\n        // themselves?\n      \n        if (ack_port != MACH_PORT_DEAD && ack_port != MACH_PORT_NULL) {\n          MachPortSender sender(ack_port);\n          MachSendMessage ack_message(kAcknowledgementMessage);\n          const mach_msg_timeout_t kSendTimeoutMs = 2 * 1000;\n\n          sender.SendMessage(ack_message, kSendTimeoutMs);\n        }\n\n        if (exit_callback_) {\n          exit_callback_(exit_context_, client);\n        }\n        break;\n      }\n      case kQuitMessage:\n        return false;\n    }\n  } else {  // result != KERN_SUCCESS\n    return false;\n  }\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/crash_generation/crash_generation_server.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_\n#define GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_\n\n#include <stdint.h>\n\n#include <string>\n\n#include \"common/mac/MachIPC.h\"\n\nnamespace google_breakpad {\n\nclass ClientInfo;\n\n// Messages the server can read via its mach port\nenum {\n  kDumpRequestMessage     = 1,\n  kAcknowledgementMessage = 2,\n  kQuitMessage            = 3\n};\n\n// Exception details sent by the client when requesting a dump.\nstruct ExceptionInfo {\n  int32_t exception_type;\n  int32_t exception_code;\n  int32_t exception_subcode;\n};\n\nclass CrashGenerationServer {\n public:\n  // WARNING: callbacks may be invoked on a different thread\n  // than that which creates the CrashGenerationServer.  They must\n  // be thread safe.\n  typedef void (*OnClientDumpRequestCallback)(void *context,\n                                              const ClientInfo &client_info,\n                                              const std::string &file_path);\n\n  typedef void (*OnClientExitingCallback)(void *context,\n                                          const ClientInfo &client_info);\n\n  // Create an instance with the given parameters.\n  //\n  // mach_port_name: Named server port to listen on.\n  // dump_callback: Callback for a client crash dump request.\n  // dump_context: Context for client crash dump request callback.\n  // exit_callback: Callback for client process exit.\n  // exit_context: Context for client exit callback.\n  // generate_dumps: Whether to automatically generate dumps.\n  //     Client code of this class might want to generate dumps explicitly\n  //     in the crash dump request callback. In that case, false can be\n  //     passed for this parameter.\n  // dump_path: Path for generating dumps; required only if true is\n  //     passed for generateDumps parameter; NULL can be passed otherwise.\n  CrashGenerationServer(const char *mach_port_name,\n                        OnClientDumpRequestCallback dump_callback,\n                        void *dump_context,\n                        OnClientExitingCallback exit_callback,\n                        void *exit_context,\n                        bool generate_dumps,\n                        const std::string &dump_path);\n\n  ~CrashGenerationServer();\n\n  // Perform initialization steps needed to start listening to clients.\n  //\n  // Return true if initialization is successful; false otherwise.\n  bool Start();\n\n  // Stop the server.\n  bool Stop();\n\n private:\n  // Return a unique filename at which a minidump can be written.\n  bool MakeMinidumpFilename(std::string &outFilename);\n\n  // Loop reading client messages and responding to them until\n  // a quit message is received.\n  static void *WaitForMessages(void *server);\n\n  // Wait for a single client message and respond to it. Returns false\n  // if a quit message was received or if an error occurred.\n  bool WaitForOneMessage();\n\n  OnClientDumpRequestCallback dump_callback_;\n  void *dump_context_;\n\n  OnClientExitingCallback exit_callback_;\n  void *exit_context_;\n\n  bool generate_dumps_;\n\n  std::string dump_dir_;\n\n  bool started_;\n\n  // The mach port that receives requests to dump from child processes.\n  ReceivePort receive_port_;\n\n  // The name of the mach port. Stored so the Stop method can message\n  // the background thread to shut it down.\n  std::string mach_port_name_;\n\n  // The thread that waits on the receive port.\n  pthread_t server_thread_;\n\n  // Disable copy constructor and operator=.\n  CrashGenerationServer(const CrashGenerationServer&);\n  CrashGenerationServer& operator=(const CrashGenerationServer&);\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_CLIENT_MAC_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/breakpad_nlist_64.cc",
    "content": "/*\n * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.\n *\n * @APPLE_LICENSE_HEADER_START@\n * \n * This file contains Original Code and/or Modifications of Original Code\n * as defined in and that are subject to the Apple Public Source License\n * Version 2.0 (the 'License'). You may not use this file except in\n * compliance with the License. Please obtain a copy of the License at\n * http://www.opensource.apple.com/apsl/ and read it before using this\n * file.\n * \n * The Original Code and all software distributed under the License are\n * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER\n * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,\n * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.\n * Please see the License for the specific language governing rights and\n * limitations under the License.\n * \n * @APPLE_LICENSE_HEADER_END@\n */\n/*\n * Copyright (c) 1989, 1993\n * The Regents of the University of California.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. All advertising materials mentioning features or use of this software\n *    must display the following acknowledgement:\n *      This product includes software developed by the University of\n *      California, Berkeley and its contributors.\n * 4. Neither the name of the University nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n\n/*\n * This file was copied from libc/gen/nlist.c from Darwin's source code       \n * The version of nlist used as a base is from 10.5.2, libc-498               \n * http://www.opensource.apple.com/darwinsource/10.5.2/Libc-498/gen/nlist.c   \n *                                                                            \n * The full tarball is at:                                                    \n * http://www.opensource.apple.com/darwinsource/tarballs/apsl/Libc-498.tar.gz \n *                                                                            \n * I've modified it to be compatible with 64-bit images.\n*/\n\n#include \"breakpad_nlist_64.h\"\n\n#include <CoreFoundation/CoreFoundation.h>\n#include <fcntl.h>\n#include <mach-o/nlist.h>\n#include <mach-o/loader.h>\n#include <mach-o/fat.h>\n#include <mach/mach.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/types.h>\n#include <sys/uio.h>\n#include <TargetConditionals.h>\n#include <unistd.h>\n\n/* Stuff lifted from <a.out.h> and <sys/exec.h> since they are gone */\n/*\n * Header prepended to each a.out file.\n */\nstruct exec {\n  unsigned short  a_machtype;     /* machine type */\n  unsigned short  a_magic;        /* magic number */\n  unsigned long a_text;         /* size of text segment */\n  unsigned long a_data;         /* size of initialized data */\n  unsigned long a_bss;          /* size of uninitialized data */\n  unsigned long a_syms;         /* size of symbol table */\n  unsigned long a_entry;        /* entry point */\n  unsigned long a_trsize;       /* size of text relocation */\n  unsigned long a_drsize;       /* size of data relocation */\n};\n\n#define OMAGIC  0407            /* old impure format */\n#define NMAGIC  0410            /* read-only text */\n#define ZMAGIC  0413            /* demand load format */\n\n#define N_BADMAG(x)                                                     \\\n  (((x).a_magic)!=OMAGIC && ((x).a_magic)!=NMAGIC && ((x).a_magic)!=ZMAGIC)\n#define N_TXTOFF(x)                                     \\\n  ((x).a_magic==ZMAGIC ? 0 : sizeof (struct exec))\n#define N_SYMOFF(x)                                                     \\\n  (N_TXTOFF(x) + (x).a_text+(x).a_data + (x).a_trsize+(x).a_drsize)\n\n// Traits structs for specializing function templates to handle\n// 32-bit/64-bit Mach-O files.\ntemplate<typename T>\nstruct MachBits {};\n\ntypedef struct nlist nlist32;\ntypedef struct nlist_64 nlist64;\n\ntemplate<>\nstruct MachBits<nlist32> {\n  typedef mach_header mach_header_type;\n  typedef uint32_t word_type;\n  static const uint32_t magic = MH_MAGIC;\n};\n\ntemplate<>\nstruct MachBits<nlist64> {\n  typedef mach_header_64 mach_header_type;\n  typedef uint64_t word_type;\n  static const uint32_t magic = MH_MAGIC_64;\n};\n\ntemplate<typename nlist_type>\nint\n__breakpad_fdnlist(int fd, nlist_type *list, const char **symbolNames,\n                   cpu_type_t cpu_type);\n\n/*\n * nlist - retreive attributes from name list (string table version)\n */\n\ntemplate <typename nlist_type>\nint breakpad_nlist_common(const char *name,\n                          nlist_type *list,\n                          const char **symbolNames,\n                          cpu_type_t cpu_type) {\n  int fd = open(name, O_RDONLY, 0);\n  if (fd < 0)\n    return -1;\n  int n = __breakpad_fdnlist(fd, list, symbolNames, cpu_type);\n  close(fd);\n  return n;\n}\n\nint breakpad_nlist(const char *name,\n                   struct nlist *list,\n                   const char **symbolNames,\n                   cpu_type_t cpu_type) {\n  return breakpad_nlist_common(name, list, symbolNames, cpu_type);\n}\n\nint breakpad_nlist(const char *name,\n                   struct nlist_64 *list,\n                   const char **symbolNames,\n                   cpu_type_t cpu_type) {\n  return breakpad_nlist_common(name, list, symbolNames, cpu_type);\n}\n\n/* Note: __fdnlist() is called from kvm_nlist in libkvm's kvm.c */\n\ntemplate<typename nlist_type>\nint __breakpad_fdnlist(int fd, nlist_type *list, const char **symbolNames,\n                       cpu_type_t cpu_type) {\n  typedef typename MachBits<nlist_type>::mach_header_type mach_header_type;\n  typedef typename MachBits<nlist_type>::word_type word_type;\n\n  const uint32_t magic = MachBits<nlist_type>::magic;\n\n  int maxlen = 500;\n  int nreq = 0;\n  for (nlist_type* q = list;\n       symbolNames[q-list] && symbolNames[q-list][0];\n       q++, nreq++) {\n\n    q->n_type = 0;\n    q->n_value = 0;\n    q->n_desc = 0;\n    q->n_sect = 0;\n    q->n_un.n_strx = 0;\n  }\n\n  struct exec buf;\n  if (read(fd, (char *)&buf, sizeof(buf)) != sizeof(buf) ||\n      (N_BADMAG(buf) && *((uint32_t *)&buf) != magic &&\n        CFSwapInt32BigToHost(*((uint32_t *)&buf)) != FAT_MAGIC &&\n       /* The following is the big-endian ppc64 check */\n       (*((uint32_t*)&buf)) != FAT_MAGIC)) {\n    return -1;\n  }\n\n  /* Deal with fat file if necessary */\n  unsigned arch_offset = 0;\n  if (CFSwapInt32BigToHost(*((uint32_t *)&buf)) == FAT_MAGIC ||\n      /* The following is the big-endian ppc64 check */\n      *((unsigned int *)&buf) == FAT_MAGIC) {\n    /* Get host info */\n    host_t host = mach_host_self();\n    unsigned i = HOST_BASIC_INFO_COUNT;\n    struct host_basic_info hbi;\n    kern_return_t kr;\n    if ((kr = host_info(host, HOST_BASIC_INFO,\n                        (host_info_t)(&hbi), &i)) != KERN_SUCCESS) {\n      return -1;\n    }\n    mach_port_deallocate(mach_task_self(), host);\n\n    /* Read in the fat header */\n    struct fat_header fh;\n    if (lseek(fd, 0, SEEK_SET) == -1) {\n      return -1;\n    }\n    if (read(fd, (char *)&fh, sizeof(fh)) != sizeof(fh)) {\n      return -1;\n    }\n\n    /* Convert fat_narchs to host byte order */\n    fh.nfat_arch = CFSwapInt32BigToHost(fh.nfat_arch);\n\n    /* Read in the fat archs */\n    struct fat_arch *fat_archs =\n        (struct fat_arch *)malloc(fh.nfat_arch * sizeof(struct fat_arch));\n    if (fat_archs == NULL) {\n      return -1;\n    }\n    if (read(fd, (char *)fat_archs,\n             sizeof(struct fat_arch) * fh.nfat_arch) !=\n        (ssize_t)(sizeof(struct fat_arch) * fh.nfat_arch)) {\n      free(fat_archs);\n      return -1;\n    }\n\n    /*\n     * Convert archs to host byte ordering (a constraint of\n     * cpusubtype_getbestarch()\n     */\n    for (unsigned i = 0; i < fh.nfat_arch; i++) {\n      fat_archs[i].cputype =\n        CFSwapInt32BigToHost(fat_archs[i].cputype);\n      fat_archs[i].cpusubtype =\n        CFSwapInt32BigToHost(fat_archs[i].cpusubtype);\n      fat_archs[i].offset =\n        CFSwapInt32BigToHost(fat_archs[i].offset);\n      fat_archs[i].size =\n        CFSwapInt32BigToHost(fat_archs[i].size);\n      fat_archs[i].align =\n        CFSwapInt32BigToHost(fat_archs[i].align);\n    }\n\n    struct fat_arch *fap = NULL;\n    for (unsigned i = 0; i < fh.nfat_arch; i++) {\n      if (fat_archs[i].cputype == cpu_type) {\n        fap = &fat_archs[i];\n        break;\n      }\n    }\n\n    if (!fap) {\n      free(fat_archs);\n      return -1;\n    }\n    arch_offset = fap->offset;\n    free(fat_archs);\n\n    /* Read in the beginning of the architecture-specific file */\n    if (lseek(fd, arch_offset, SEEK_SET) == -1) {\n      return -1;\n    }\n    if (read(fd, (char *)&buf, sizeof(buf)) != sizeof(buf)) {\n      return -1;\n    }\n  }\n\n  off_t sa;  /* symbol address */\n  off_t ss;  /* start of strings */\n  register register_t n;\n  if (*((unsigned int *)&buf) == magic) {\n    if (lseek(fd, arch_offset, SEEK_SET) == -1) {\n      return -1;\n    }\n    mach_header_type mh;\n    if (read(fd, (char *)&mh, sizeof(mh)) != sizeof(mh)) {\n      return -1;\n    }\n\n    struct load_command *load_commands =\n        (struct load_command *)malloc(mh.sizeofcmds);\n    if (load_commands == NULL) {\n      return -1;\n    }\n    if (read(fd, (char *)load_commands, mh.sizeofcmds) !=\n        (ssize_t)mh.sizeofcmds) {\n      free(load_commands);\n      return -1;\n    }\n    struct symtab_command *stp = NULL;\n    struct load_command *lcp = load_commands;\n    // iterate through all load commands, looking for\n    // LC_SYMTAB load command\n    for (uint32_t i = 0; i < mh.ncmds; i++) {\n      if (lcp->cmdsize % sizeof(word_type) != 0 ||\n          lcp->cmdsize <= 0 ||\n          (char *)lcp + lcp->cmdsize >\n          (char *)load_commands + mh.sizeofcmds) {\n        free(load_commands);\n        return -1;\n      }\n      if (lcp->cmd == LC_SYMTAB) {\n        if (lcp->cmdsize !=\n            sizeof(struct symtab_command)) {\n          free(load_commands);\n          return -1;\n        }\n        stp = (struct symtab_command *)lcp;\n        break;\n      }\n      lcp = (struct load_command *)\n        ((char *)lcp + lcp->cmdsize);\n    }\n    if (stp == NULL) {\n      free(load_commands);\n      return -1;\n    }\n    // sa points to the beginning of the symbol table\n    sa = stp->symoff + arch_offset;\n    // ss points to the beginning of the string table\n    ss = stp->stroff + arch_offset;\n    // n is the number of bytes in the symbol table\n    // each symbol table entry is an nlist structure\n    n = stp->nsyms * sizeof(nlist_type);\n    free(load_commands);\n  } else {\n    sa = N_SYMOFF(buf) + arch_offset;\n    ss = sa + buf.a_syms + arch_offset;\n    n = buf.a_syms;\n  }\n\n  if (lseek(fd, sa, SEEK_SET) == -1) {\n    return -1;\n  }\n\n  // the algorithm here is to read the nlist entries in m-sized\n  // chunks into q.  q is then iterated over. for each entry in q,\n  // use the string table index(q->n_un.n_strx) to read the symbol \n  // name, then scan the nlist entries passed in by the user(via p),\n  // and look for a match\n  while (n) {\n    nlist_type space[BUFSIZ/sizeof (nlist_type)];\n    register register_t m = sizeof (space);\n\n    if (n < m)\n      m = n;\n    if (read(fd, (char *)space, m) != m)\n      break;\n    n -= m;\n    long savpos = lseek(fd, 0, SEEK_CUR);\n    if (savpos == -1) {\n      return -1;\n    }\n    for (nlist_type* q = space; (m -= sizeof(nlist_type)) >= 0; q++) {\n      char nambuf[BUFSIZ];\n\n      if (q->n_un.n_strx == 0 || q->n_type & N_STAB)\n        continue;\n\n      // seek to the location in the binary where the symbol\n      // name is stored & read it into memory\n      if (lseek(fd, ss+q->n_un.n_strx, SEEK_SET) == -1) {\n        return -1;\n      }\n      if (read(fd, nambuf, maxlen+1) == -1) {\n        return -1;\n      }\n      const char *s2 = nambuf;\n      for (nlist_type *p = list; \n           symbolNames[p-list] && symbolNames[p-list][0];\n           p++) {\n        // get the symbol name the user has passed in that \n        // corresponds to the nlist entry that we're looking at\n        const char *s1 = symbolNames[p - list];\n        while (*s1) {\n          if (*s1++ != *s2++)\n            goto cont;\n        }\n        if (*s2)\n          goto cont;\n\n        p->n_value = q->n_value;\n        p->n_type = q->n_type;\n        p->n_desc = q->n_desc;\n        p->n_sect = q->n_sect;\n        p->n_un.n_strx = q->n_un.n_strx;\n        if (--nreq == 0)\n          return nreq;\n\n        break;\n      cont:           ;\n      }\n    }\n    if (lseek(fd, savpos, SEEK_SET) == -1) {\n      return -1;\n    }\n  }\n  return nreq;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/breakpad_nlist_64.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// breakpad_nlist.h\n//\n// This file is meant to provide a header for clients of the modified\n// nlist function implemented to work on 64-bit.\n\n#ifndef CLIENT_MAC_HANDLER_BREAKPAD_NLIST_H__\n\n#include <mach/machine.h>\n\nint breakpad_nlist(const char *name,\n                   struct nlist *list,\n                   const char **symbolNames,\n                   cpu_type_t cpu_type);\nint breakpad_nlist(const char *name,\n                   struct nlist_64 *list,\n                   const char **symbolNames,\n                   cpu_type_t cpu_type);\n\n#endif  /* CLIENT_MAC_HANDLER_BREAKPAD_NLIST_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/dynamic_images.cc",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"client/mac/handler/dynamic_images.h\"\n\nextern \"C\" { // needed to compile on Leopard\n  #include <mach-o/nlist.h>\n  #include <stdlib.h>\n  #include <stdio.h>\n}\n\n#include <assert.h>\n#include <AvailabilityMacros.h>\n#include <dlfcn.h>\n#include <mach/task_info.h>\n#include <sys/sysctl.h>\n#include <TargetConditionals.h>\n\n#include <algorithm>\n#include <string>\n#include <vector>\n\n#include \"breakpad_nlist_64.h\"\n\n#if !TARGET_OS_IPHONE\n#include <CoreServices/CoreServices.h>\n\n#ifndef MAC_OS_X_VERSION_10_6\n#define MAC_OS_X_VERSION_10_6 1060\n#endif\n\n#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6\n\n// Fallback declarations for TASK_DYLD_INFO and friends, introduced in\n// <mach/task_info.h> in the Mac OS X 10.6 SDK.\n#define TASK_DYLD_INFO 17\nstruct task_dyld_info {\n  mach_vm_address_t all_image_info_addr;\n  mach_vm_size_t all_image_info_size;\n};\ntypedef struct task_dyld_info task_dyld_info_data_t;\ntypedef struct task_dyld_info *task_dyld_info_t;\n#define TASK_DYLD_INFO_COUNT (sizeof(task_dyld_info_data_t) / sizeof(natural_t))\n\n#endif\n\n#endif  // !TARGET_OS_IPHONE\n\nnamespace google_breakpad {\n\nusing std::string;\nusing std::vector;\n\n//==============================================================================\n// Returns the size of the memory region containing |address| and the\n// number of bytes from |address| to the end of the region.\n// We potentially, will extend the size of the original\n// region by the size of the following region if it's contiguous with the\n// first in order to handle cases when we're reading strings and they\n// straddle two vm regions.\n//\nstatic mach_vm_size_t GetMemoryRegionSize(task_port_t target_task,\n                                          const uint64_t address,\n                                          mach_vm_size_t *size_to_end) {\n  mach_vm_address_t region_base = (mach_vm_address_t)address;\n  mach_vm_size_t region_size;\n  natural_t nesting_level = 0;\n  vm_region_submap_info_64 submap_info;\n  mach_msg_type_number_t info_count = VM_REGION_SUBMAP_INFO_COUNT_64;\n\n  // Get information about the vm region containing |address|\n  vm_region_recurse_info_t region_info;\n  region_info = reinterpret_cast<vm_region_recurse_info_t>(&submap_info);\n\n  kern_return_t result =\n    mach_vm_region_recurse(target_task,\n                           &region_base,\n                           &region_size,\n                           &nesting_level,\n                           region_info,\n                           &info_count);\n\n  if (result == KERN_SUCCESS) {\n    // Get distance from |address| to the end of this region\n    *size_to_end = region_base + region_size -(mach_vm_address_t)address;\n\n    // If we want to handle strings as long as 4096 characters we may need\n    // to check if there's a vm region immediately following the first one.\n    // If so, we need to extend |*size_to_end| to go all the way to the end\n    // of the second region.\n    if (*size_to_end < 4096) {\n      // Second region starts where the first one ends\n      mach_vm_address_t region_base2 =\n        (mach_vm_address_t)(region_base + region_size);\n      mach_vm_size_t region_size2;\n\n      // Get information about the following vm region\n      result =\n        mach_vm_region_recurse(target_task,\n                               &region_base2,\n                               &region_size2,\n                               &nesting_level,\n                               region_info,\n                               &info_count);\n\n      // Extend region_size to go all the way to the end of the 2nd region\n      if (result == KERN_SUCCESS\n          && region_base2 == region_base + region_size) {\n        region_size += region_size2;\n      }\n    }\n\n    *size_to_end = region_base + region_size -(mach_vm_address_t)address;\n  } else {\n    region_size = 0;\n    *size_to_end = 0;\n  }\n\n  return region_size;\n}\n\n#define kMaxStringLength 8192\n//==============================================================================\n// Reads a NULL-terminated string from another task.\n//\n// Warning!  This will not read any strings longer than kMaxStringLength-1\n//\nstatic string ReadTaskString(task_port_t target_task,\n                             const uint64_t address) {\n  // The problem is we don't know how much to read until we know how long\n  // the string is. And we don't know how long the string is, until we've read\n  // the memory!  So, we'll try to read kMaxStringLength bytes\n  // (or as many bytes as we can until we reach the end of the vm region).\n  mach_vm_size_t size_to_end;\n  GetMemoryRegionSize(target_task, address, &size_to_end);\n\n  if (size_to_end > 0) {\n    mach_vm_size_t size_to_read =\n      size_to_end > kMaxStringLength ? kMaxStringLength : size_to_end;\n\n    vector<uint8_t> bytes;\n    if (ReadTaskMemory(target_task, address, (size_t)size_to_read, bytes) !=\n        KERN_SUCCESS)\n      return string();\n\n    return string(reinterpret_cast<const char*>(&bytes[0]));\n  }\n\n  return string();\n}\n\n//==============================================================================\n// Reads an address range from another task. The bytes read will be returned\n// in bytes, which will be resized as necessary.\nkern_return_t ReadTaskMemory(task_port_t target_task,\n                             const uint64_t address,\n                             size_t length,\n                             vector<uint8_t> &bytes) {\n  int systemPageSize = getpagesize();\n\n  // use the negative of the page size for the mask to find the page address\n  mach_vm_address_t page_address = address & (-systemPageSize);\n\n  mach_vm_address_t last_page_address =\n      (address + length + (systemPageSize - 1)) & (-systemPageSize);\n\n  mach_vm_size_t page_size = last_page_address - page_address;\n  uint8_t* local_start;\n  uint32_t local_length;\n\n  kern_return_t r = mach_vm_read(target_task,\n                                 page_address,\n                                 page_size,\n                                 reinterpret_cast<vm_offset_t*>(&local_start),\n                                 &local_length);\n\n  if (r != KERN_SUCCESS)\n    return r;\n\n  bytes.resize(length);\n  memcpy(&bytes[0],\n         &local_start[(mach_vm_address_t)address - page_address],\n         length);\n  mach_vm_deallocate(mach_task_self(), (uintptr_t)local_start, local_length);\n  return KERN_SUCCESS;\n}\n\n#pragma mark -\n\n//==============================================================================\n// Traits structs for specializing function templates to handle\n// 32-bit/64-bit Mach-O files.\nstruct MachO32 {\n  typedef mach_header mach_header_type;\n  typedef segment_command mach_segment_command_type;\n  typedef dyld_image_info32 dyld_image_info;\n  typedef dyld_all_image_infos32 dyld_all_image_infos;\n  typedef struct nlist nlist_type;\n  static const uint32_t magic = MH_MAGIC;\n  static const uint32_t segment_load_command = LC_SEGMENT;\n};\n\nstruct MachO64 {\n  typedef mach_header_64 mach_header_type;\n  typedef segment_command_64 mach_segment_command_type;\n  typedef dyld_image_info64 dyld_image_info;\n  typedef dyld_all_image_infos64 dyld_all_image_infos;\n  typedef struct nlist_64 nlist_type;\n  static const uint32_t magic = MH_MAGIC_64;\n  static const uint32_t segment_load_command = LC_SEGMENT_64;\n};\n\ntemplate<typename MachBits>\nbool FindTextSection(DynamicImage& image) {\n  typedef typename MachBits::mach_header_type mach_header_type;\n  typedef typename MachBits::mach_segment_command_type\n      mach_segment_command_type;\n  \n  const mach_header_type* header =\n      reinterpret_cast<const mach_header_type*>(&image.header_[0]);\n\n  if(header->magic != MachBits::magic) {\n    return false;\n  }\n\n  const struct load_command *cmd =\n      reinterpret_cast<const struct load_command *>(header + 1);\n\n  bool found_text_section = false;\n  bool found_dylib_id_command = false;\n  for (unsigned int i = 0; cmd && (i < header->ncmds); ++i) {\n    if (!found_text_section) {\n      if (cmd->cmd == MachBits::segment_load_command) {\n        const mach_segment_command_type *seg =\n            reinterpret_cast<const mach_segment_command_type *>(cmd);\n\n        if (!strcmp(seg->segname, \"__TEXT\")) {\n          image.vmaddr_ = seg->vmaddr;\n          image.vmsize_ = seg->vmsize;\n          image.slide_ = 0;\n\n          if (seg->fileoff == 0 && seg->filesize != 0) {\n            image.slide_ =\n                (uintptr_t)image.GetLoadAddress() - (uintptr_t)seg->vmaddr;\n          }\n          found_text_section = true;\n        }\n      }\n    }\n\n    if (!found_dylib_id_command) {\n      if (cmd->cmd == LC_ID_DYLIB) {\n        const struct dylib_command *dc =\n            reinterpret_cast<const struct dylib_command *>(cmd);\n\n        image.version_ = dc->dylib.current_version;\n        found_dylib_id_command = true;\n      }\n    }\n\n    if (found_dylib_id_command && found_text_section) {\n      return true;\n    }\n\n    cmd = reinterpret_cast<const struct load_command *>\n        (reinterpret_cast<const char *>(cmd) + cmd->cmdsize);\n  }\n\n  return false;\n}\n\n//==============================================================================\n// Initializes vmaddr_, vmsize_, and slide_\nvoid DynamicImage::CalculateMemoryAndVersionInfo() {\n  // unless we can process the header, ensure that calls to\n  // IsValid() will return false\n  vmaddr_ = 0;\n  vmsize_ = 0;\n  slide_ = 0;\n  version_ = 0;\n\n  // The function template above does all the real work.\n  if (Is64Bit())\n    FindTextSection<MachO64>(*this);\n  else\n    FindTextSection<MachO32>(*this);\n}\n\n//==============================================================================\n// The helper function template abstracts the 32/64-bit differences.\ntemplate<typename MachBits>\nuint32_t GetFileTypeFromHeader(DynamicImage& image) {\n  typedef typename MachBits::mach_header_type mach_header_type;\n\n  const mach_header_type* header =\n      reinterpret_cast<const mach_header_type*>(&image.header_[0]);\n  return header->filetype;\n}\n\nuint32_t DynamicImage::GetFileType() {\n  if (Is64Bit())\n    return GetFileTypeFromHeader<MachO64>(*this);\n\n  return GetFileTypeFromHeader<MachO32>(*this);\n}\n\n#pragma mark -\n\n//==============================================================================\n// Loads information about dynamically loaded code in the given task.\nDynamicImages::DynamicImages(mach_port_t task)\n    : task_(task),\n      cpu_type_(DetermineTaskCPUType(task)),\n      image_list_() {\n  ReadImageInfoForTask();\n}\n\ntemplate<typename MachBits>\nstatic uint64_t LookupSymbol(const char* symbol_name,\n                             const char* filename,\n                             cpu_type_t cpu_type) {\n  typedef typename MachBits::nlist_type nlist_type;\n\n  nlist_type symbol_info[8] = {};\n  const char *symbolNames[2] = { symbol_name, \"\\0\" };\n  nlist_type &list = symbol_info[0];\n  int invalidEntriesCount = breakpad_nlist(filename,\n                                           &list,\n                                           symbolNames,\n                                           cpu_type);\n\n  if(invalidEntriesCount != 0) {\n    return 0;\n  }\n\n  assert(list.n_value);\n  return list.n_value;\n}\n\n#if TARGET_OS_IPHONE\nstatic bool HasTaskDyldInfo() {\n  return true;\n}\n#else\nstatic SInt32 GetOSVersionInternal() {\n  SInt32 os_version = 0;\n  Gestalt(gestaltSystemVersion, &os_version);\n  return os_version;\n}\n\nstatic SInt32 GetOSVersion() {\n  static SInt32 os_version = GetOSVersionInternal();\n  return os_version;\n}\n\nstatic bool HasTaskDyldInfo() {\n#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6\n  return true;\n#else\n  return GetOSVersion() >= 0x1060;\n#endif\n}\n#endif  // TARGET_OS_IPHONE\n\nuint64_t DynamicImages::GetDyldAllImageInfosPointer() {\n  if (HasTaskDyldInfo()) {\n    task_dyld_info_data_t task_dyld_info;\n    mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT;\n    if (task_info(task_, TASK_DYLD_INFO, (task_info_t)&task_dyld_info,\n                  &count) != KERN_SUCCESS) {\n      return 0;\n    }\n\n    return (uint64_t)task_dyld_info.all_image_info_addr;\n  } else {\n    const char *imageSymbolName = \"_dyld_all_image_infos\";\n    const char *dyldPath = \"/usr/lib/dyld\";\n\n    if (Is64Bit())\n      return LookupSymbol<MachO64>(imageSymbolName, dyldPath, cpu_type_);\n    return LookupSymbol<MachO32>(imageSymbolName, dyldPath, cpu_type_);\n  }\n}\n\n//==============================================================================\n// This code was written using dyld_debug.c (from Darwin) as a guide.\n\ntemplate<typename MachBits>\nvoid ReadImageInfo(DynamicImages& images,\n                   uint64_t image_list_address) {\n  typedef typename MachBits::dyld_image_info dyld_image_info;\n  typedef typename MachBits::dyld_all_image_infos dyld_all_image_infos;\n  typedef typename MachBits::mach_header_type mach_header_type;\n\n  // Read the structure inside of dyld that contains information about\n  // loaded images.  We're reading from the desired task's address space.\n\n  // Here we make the assumption that dyld loaded at the same address in\n  // the crashed process vs. this one.  This is an assumption made in\n  // \"dyld_debug.c\" and is said to be nearly always valid.\n  vector<uint8_t> dyld_all_info_bytes;\n  if (ReadTaskMemory(images.task_,\n                     image_list_address,\n                     sizeof(dyld_all_image_infos),\n                     dyld_all_info_bytes) != KERN_SUCCESS)\n    return;\n\n  dyld_all_image_infos *dyldInfo =\n    reinterpret_cast<dyld_all_image_infos*>(&dyld_all_info_bytes[0]);\n\n  // number of loaded images\n  int count = dyldInfo->infoArrayCount;\n\n  // Read an array of dyld_image_info structures each containing\n  // information about a loaded image.\n  vector<uint8_t> dyld_info_array_bytes;\n    if (ReadTaskMemory(images.task_,\n                       dyldInfo->infoArray,\n                       count * sizeof(dyld_image_info),\n                       dyld_info_array_bytes) != KERN_SUCCESS)\n      return;\n\n    dyld_image_info *infoArray =\n        reinterpret_cast<dyld_image_info*>(&dyld_info_array_bytes[0]);\n    images.image_list_.reserve(count);\n\n    for (int i = 0; i < count; ++i) {\n      dyld_image_info &info = infoArray[i];\n\n      // First read just the mach_header from the image in the task.\n      vector<uint8_t> mach_header_bytes;\n      if (ReadTaskMemory(images.task_,\n                         info.load_address_,\n                         sizeof(mach_header_type),\n                         mach_header_bytes) != KERN_SUCCESS)\n        continue;  // bail on this dynamic image\n\n      mach_header_type *header =\n          reinterpret_cast<mach_header_type*>(&mach_header_bytes[0]);\n\n      // Now determine the total amount necessary to read the header\n      // plus all of the load commands.\n      size_t header_size =\n          sizeof(mach_header_type) + header->sizeofcmds;\n\n      if (ReadTaskMemory(images.task_,\n                         info.load_address_,\n                         header_size,\n                         mach_header_bytes) != KERN_SUCCESS)\n        continue;\n\n      header = reinterpret_cast<mach_header_type*>(&mach_header_bytes[0]);\n\n      // Read the file name from the task's memory space.\n      string file_path;\n      if (info.file_path_) {\n        // Although we're reading kMaxStringLength bytes, it's copied in the\n        // the DynamicImage constructor below with the correct string length,\n        // so it's not really wasting memory.\n        file_path = ReadTaskString(images.task_, info.file_path_);\n      }\n\n      // Create an object representing this image and add it to our list.\n      DynamicImage *new_image;\n      new_image = new DynamicImage(&mach_header_bytes[0],\n                                   header_size,\n                                   info.load_address_,\n                                   file_path,\n                                   info.file_mod_date_,\n                                   images.task_,\n                                   images.cpu_type_);\n\n      if (new_image->IsValid()) {\n        images.image_list_.push_back(DynamicImageRef(new_image));\n      } else {\n        delete new_image;\n      }\n    }\n\n    // sorts based on loading address\n    sort(images.image_list_.begin(), images.image_list_.end());\n    // remove duplicates - this happens in certain strange cases\n    // You can see it in DashboardClient when Google Gadgets plugin\n    // is installed.  Apple's crash reporter log and gdb \"info shared\"\n    // both show the same library multiple times at the same address\n\n    vector<DynamicImageRef>::iterator it = unique(images.image_list_.begin(),\n                                                  images.image_list_.end());\n    images.image_list_.erase(it, images.image_list_.end());\n}\n\nvoid DynamicImages::ReadImageInfoForTask() {\n  uint64_t imageList = GetDyldAllImageInfosPointer();\n\n  if (imageList) {\n    if (Is64Bit())\n      ReadImageInfo<MachO64>(*this, imageList);\n    else\n      ReadImageInfo<MachO32>(*this, imageList);\n  }\n}\n\n//==============================================================================\nDynamicImage  *DynamicImages::GetExecutableImage() {\n  int executable_index = GetExecutableImageIndex();\n\n  if (executable_index >= 0) {\n    return GetImage(executable_index);\n  }\n\n  return NULL;\n}\n\n//==============================================================================\n// returns -1 if failure to find executable\nint DynamicImages::GetExecutableImageIndex() {\n  int image_count = GetImageCount();\n\n  for (int i = 0; i < image_count; ++i) {\n    DynamicImage  *image = GetImage(i);\n    if (image->GetFileType() == MH_EXECUTE) {\n      return i;\n    }\n  }\n\n  return -1;\n}\n\n//==============================================================================\n// static\ncpu_type_t DynamicImages::DetermineTaskCPUType(task_t task) {\n  if (task == mach_task_self())\n    return GetNativeCPUType();\n\n  int mib[CTL_MAXNAME];\n  size_t mibLen = CTL_MAXNAME;\n  int err = sysctlnametomib(\"sysctl.proc_cputype\", mib, &mibLen);\n  if (err == 0) {\n    assert(mibLen < CTL_MAXNAME);\n    pid_for_task(task, &mib[mibLen]);\n    mibLen += 1;\n\n    cpu_type_t cpu_type;\n    size_t cpuTypeSize = sizeof(cpu_type);\n    sysctl(mib, mibLen, &cpu_type, &cpuTypeSize, 0, 0);\n    return cpu_type;\n  }\n\n  return GetNativeCPUType();\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/dynamic_images.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//  dynamic_images.h\n//\n//    Implements most of the function of the dyld API, but allowing an\n//    arbitrary task to be introspected, unlike the dyld API which\n//    only allows operation on the current task.  The current implementation\n//    is limited to use by 32-bit tasks.\n\n#ifndef CLIENT_MAC_HANDLER_DYNAMIC_IMAGES_H__\n#define CLIENT_MAC_HANDLER_DYNAMIC_IMAGES_H__\n\n#include <mach/mach.h>\n#include <mach-o/dyld.h>\n#include <mach-o/loader.h>\n#include <sys/types.h>\n\n#include <string>\n#include <vector>\n\n#include \"mach_vm_compat.h\"\n\nnamespace google_breakpad {\n\nusing std::string;\nusing std::vector;\n\n//==============================================================================\n// The memory layout of this struct matches the dyld_image_info struct\n// defined in \"dyld_gdb.h\" in the darwin source.\ntypedef struct dyld_image_info32 {\n  uint32_t                   load_address_;  // struct mach_header*\n  uint32_t                   file_path_;     // char*\n  uint32_t                   file_mod_date_;\n} dyld_image_info32;\n\ntypedef struct dyld_image_info64 {\n  uint64_t                   load_address_;  // struct mach_header*\n  uint64_t                   file_path_;     // char*\n  uint64_t                   file_mod_date_;\n} dyld_image_info64;\n\n//==============================================================================\n// This is as defined in \"dyld_gdb.h\" in the darwin source.\n// _dyld_all_image_infos (in dyld) is a structure of this type\n// which will be used to determine which dynamic code has been loaded.\ntypedef struct dyld_all_image_infos32 {\n  uint32_t                      version;  // == 1 in Mac OS X 10.4\n  uint32_t                      infoArrayCount;\n  uint32_t                      infoArray;  // const struct dyld_image_info*\n  uint32_t                      notification;\n  bool                          processDetachedFromSharedRegion;\n} dyld_all_image_infos32;\n\ntypedef struct dyld_all_image_infos64 {\n  uint32_t                      version;  // == 1 in Mac OS X 10.4\n  uint32_t                      infoArrayCount;\n  uint64_t                      infoArray;  // const struct dyld_image_info*\n  uint64_t                      notification;\n  bool                          processDetachedFromSharedRegion;\n} dyld_all_image_infos64;\n\n// some typedefs to isolate 64/32 bit differences\n#ifdef __LP64__\ntypedef mach_header_64 breakpad_mach_header;\ntypedef segment_command_64 breakpad_mach_segment_command;\n#else\ntypedef mach_header breakpad_mach_header;\ntypedef segment_command breakpad_mach_segment_command;\n#endif\n\n// Helper functions to deal with 32-bit/64-bit Mach-O differences.\nclass DynamicImage;\ntemplate<typename MachBits>\nbool FindTextSection(DynamicImage& image);\n\ntemplate<typename MachBits>\nuint32_t GetFileTypeFromHeader(DynamicImage& image);\n\n//==============================================================================\n// Represents a single dynamically loaded mach-o image\nclass DynamicImage {\n public:\n  DynamicImage(uint8_t *header,     // data is copied\n               size_t header_size,  // includes load commands\n               uint64_t load_address,\n               string file_path,\n               uintptr_t image_mod_date,\n               mach_port_t task,\n               cpu_type_t cpu_type)\n    : header_(header, header + header_size),\n      header_size_(header_size),\n      load_address_(load_address),\n      vmaddr_(0),\n      vmsize_(0),\n      slide_(0),\n      version_(0),\n      file_path_(file_path),\n      file_mod_date_(image_mod_date),\n      task_(task),\n      cpu_type_(cpu_type) {\n    CalculateMemoryAndVersionInfo();\n  }\n\n  // Size of mach_header plus load commands\n  size_t GetHeaderSize() const {return header_.size();}\n\n  // Full path to mach-o binary\n  string GetFilePath() {return file_path_;}\n\n  uint64_t GetModDate() const {return file_mod_date_;}\n\n  // Actual address where the image was loaded\n  uint64_t GetLoadAddress() const {return load_address_;}\n\n  // Address where the image should be loaded\n  mach_vm_address_t GetVMAddr() const {return vmaddr_;}\n\n  // Difference between GetLoadAddress() and GetVMAddr()\n  ptrdiff_t GetVMAddrSlide() const {return slide_;}\n\n  // Size of the image\n  mach_vm_size_t GetVMSize() const {return vmsize_;}\n\n  // Task owning this loaded image\n  mach_port_t GetTask() {return task_;}\n\n  // CPU type of the task\n  cpu_type_t GetCPUType() {return cpu_type_;}\n\n  // filetype from the Mach-O header.\n  uint32_t GetFileType();\n\n  // Return true if the task is a 64-bit architecture.\n  bool Is64Bit() { return (GetCPUType() & CPU_ARCH_ABI64) == CPU_ARCH_ABI64; }\n\n  uint32_t GetVersion() {return version_;}\n  // For sorting\n  bool operator<(const DynamicImage &inInfo) {\n    return GetLoadAddress() < inInfo.GetLoadAddress();\n  }\n\n  // Sanity checking\n  bool IsValid() {return GetVMSize() != 0;}\n\n private:\n  DynamicImage(const DynamicImage &);\n  DynamicImage &operator=(const DynamicImage &);\n\n  friend class DynamicImages;\n  template<typename MachBits>\n  friend bool FindTextSection(DynamicImage& image);\n  template<typename MachBits>\n  friend uint32_t GetFileTypeFromHeader(DynamicImage& image);\n\n  // Initializes vmaddr_, vmsize_, and slide_\n  void CalculateMemoryAndVersionInfo();\n\n  const vector<uint8_t>   header_;        // our local copy of the header\n  size_t                  header_size_;    // mach_header plus load commands\n  uint64_t                load_address_;   // base address image is mapped into\n  mach_vm_address_t       vmaddr_;\n  mach_vm_size_t          vmsize_;\n  ptrdiff_t               slide_;\n  uint32_t                version_;        // Dylib version\n  string                  file_path_;     // path dyld used to load the image\n  uintptr_t               file_mod_date_;  // time_t of image file\n\n  mach_port_t             task_;\n  cpu_type_t              cpu_type_;        // CPU type of task_\n};\n\n//==============================================================================\n// DynamicImageRef is just a simple wrapper for a pointer to\n// DynamicImage.  The reason we use it instead of a simple typedef is so\n// that we can use stl::sort() on a vector of DynamicImageRefs\n// and simple class pointers can't implement operator<().\n//\nclass DynamicImageRef {\n public:\n  explicit DynamicImageRef(DynamicImage *inP) : p(inP) {}\n  // The copy constructor is required by STL\n  DynamicImageRef(const DynamicImageRef &inRef) : p(inRef.p) {}\n\n  bool operator<(const DynamicImageRef &inRef) const {\n    return (*const_cast<DynamicImageRef*>(this)->p)\n      < (*const_cast<DynamicImageRef&>(inRef).p);\n  }\n\n  bool operator==(const DynamicImageRef &inInfo) const {\n    return (*const_cast<DynamicImageRef*>(this)->p).GetLoadAddress() ==\n        (*const_cast<DynamicImageRef&>(inInfo)).GetLoadAddress();\n  }\n\n  // Be just like DynamicImage*\n  DynamicImage  *operator->() {return p;}\n  operator DynamicImage*() {return p;}\n\n private:\n  DynamicImage  *p;\n};\n\n// Helper function to deal with 32-bit/64-bit Mach-O differences.\nclass DynamicImages;\ntemplate<typename MachBits>\nvoid ReadImageInfo(DynamicImages& images, uint64_t image_list_address);\n\n//==============================================================================\n// An object of type DynamicImages may be created to allow introspection of\n// an arbitrary task's dynamically loaded mach-o binaries.  This makes the\n// assumption that the current task has send rights to the target task.\nclass DynamicImages {\n public:\n  explicit DynamicImages(mach_port_t task);\n\n  ~DynamicImages() {\n    for (int i = 0; i < GetImageCount(); ++i) {\n      delete image_list_[i];\n    }\n  }\n\n  // Returns the number of dynamically loaded mach-o images.\n  int GetImageCount() const {return static_cast<int>(image_list_.size());}\n\n  // Returns an individual image.\n  DynamicImage *GetImage(int i) {\n    if (i < (int)image_list_.size()) {\n      return image_list_[i];\n    }\n    return NULL;\n  }\n\n  // Returns the image corresponding to the main executable.\n  DynamicImage *GetExecutableImage();\n  int GetExecutableImageIndex();\n\n  // Returns the task which we're looking at.\n  mach_port_t GetTask() const {return task_;}\n\n  // CPU type of the task\n  cpu_type_t GetCPUType() {return cpu_type_;}\n\n  // Return true if the task is a 64-bit architecture.\n  bool Is64Bit() { return (GetCPUType() & CPU_ARCH_ABI64) == CPU_ARCH_ABI64; }\n\n  // Determine the CPU type of the task being dumped.\n  static cpu_type_t DetermineTaskCPUType(task_t task);\n\n  // Get the native CPU type of this task.\n  static cpu_type_t GetNativeCPUType() {\n#if defined(__i386__)\n    return CPU_TYPE_I386;\n#elif defined(__x86_64__)\n    return CPU_TYPE_X86_64;\n#elif defined(__ppc__)\n    return CPU_TYPE_POWERPC;\n#elif defined(__ppc64__)\n    return CPU_TYPE_POWERPC64;\n#elif defined(__arm__)\n    return CPU_TYPE_ARM;\n#else\n#error \"GetNativeCPUType not implemented for this architecture\"\n#endif\n  }\n\n private:\n  template<typename MachBits>\n  friend void ReadImageInfo(DynamicImages& images, uint64_t image_list_address);\n\n  bool IsOurTask() {return task_ == mach_task_self();}\n\n  // Initialization\n  void ReadImageInfoForTask();\n  uint64_t GetDyldAllImageInfosPointer();\n\n  mach_port_t              task_;\n  cpu_type_t               cpu_type_;  // CPU type of task_\n  vector<DynamicImageRef>  image_list_;\n};\n\n// Fill bytes with the contents of memory at a particular\n// location in another task.\nkern_return_t ReadTaskMemory(task_port_t target_task,\n                             const uint64_t address,\n                             size_t length,\n                             vector<uint8_t> &bytes);\n\n}   // namespace google_breakpad\n\n#endif // CLIENT_MAC_HANDLER_DYNAMIC_IMAGES_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/exception_handler.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <map>\n#include <mach/exc.h>\n#include <mach/mig.h>\n#include <pthread.h>\n#include <signal.h>\n#include <TargetConditionals.h>\n\n#include \"client/mac/handler/exception_handler.h\"\n#include \"client/mac/handler/minidump_generator.h\"\n#include \"common/mac/macho_utilities.h\"\n#include \"common/mac/scoped_task_suspend-inl.h\"\n#include \"google_breakpad/common/minidump_exception_mac.h\"\n\n#ifndef USE_PROTECTED_ALLOCATIONS\n#if TARGET_OS_IPHONE\n#define USE_PROTECTED_ALLOCATIONS 1\n#else\n#define USE_PROTECTED_ALLOCATIONS 0\n#endif\n#endif\n\n// If USE_PROTECTED_ALLOCATIONS is activated then the\n// gBreakpadAllocator needs to be setup in other code\n// ahead of time.  Please see ProtectedMemoryAllocator.h\n// for more details.\n#if USE_PROTECTED_ALLOCATIONS\n  #include \"protected_memory_allocator.h\"\n  extern ProtectedMemoryAllocator *gBreakpadAllocator;\n#endif\n\nnamespace google_breakpad {\n\nstatic union {\n#if USE_PROTECTED_ALLOCATIONS\n  char protected_buffer[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));\n#endif\n  google_breakpad::ExceptionHandler *handler;\n} gProtectedData;\n\nusing std::map;\n\n// These structures and techniques are illustrated in\n// Mac OS X Internals, Amit Singh, ch 9.7\nstruct ExceptionMessage {\n  mach_msg_header_t           header;\n  mach_msg_body_t             body;\n  mach_msg_port_descriptor_t  thread;\n  mach_msg_port_descriptor_t  task;\n  NDR_record_t                ndr;\n  exception_type_t            exception;\n  mach_msg_type_number_t      code_count;\n  integer_t                   code[EXCEPTION_CODE_MAX];\n  char                        padding[512];\n};\n\nstruct ExceptionParameters {\n  ExceptionParameters() : count(0) {}\n  mach_msg_type_number_t count;\n  exception_mask_t masks[EXC_TYPES_COUNT];\n  mach_port_t ports[EXC_TYPES_COUNT];\n  exception_behavior_t behaviors[EXC_TYPES_COUNT];\n  thread_state_flavor_t flavors[EXC_TYPES_COUNT];\n};\n\nstruct ExceptionReplyMessage {\n  mach_msg_header_t  header;\n  NDR_record_t       ndr;\n  kern_return_t      return_code;\n};\n\n// Only catch these three exceptions.  The other ones are nebulously defined\n// and may result in treating a non-fatal exception as fatal.\nexception_mask_t s_exception_mask = EXC_MASK_BAD_ACCESS |\nEXC_MASK_BAD_INSTRUCTION | EXC_MASK_ARITHMETIC | EXC_MASK_BREAKPOINT;\n\n#if !TARGET_OS_IPHONE\nextern \"C\"\n{\n  // Forward declarations for functions that need \"C\" style compilation\n  boolean_t exc_server(mach_msg_header_t *request,\n                       mach_msg_header_t *reply);\n\n  // This symbol must be visible to dlsym() - see\n  // http://code.google.com/p/google-breakpad/issues/detail?id=345 for details.\n  kern_return_t catch_exception_raise(mach_port_t target_port,\n                                      mach_port_t failed_thread,\n                                      mach_port_t task,\n                                      exception_type_t exception,\n                                      exception_data_t code,\n                                      mach_msg_type_number_t code_count)\n      __attribute__((visibility(\"default\")));\n}\n#endif\n\nkern_return_t ForwardException(mach_port_t task,\n                               mach_port_t failed_thread,\n                               exception_type_t exception,\n                               exception_data_t code,\n                               mach_msg_type_number_t code_count);\n\n#if TARGET_OS_IPHONE\n// Implementation is based on the implementation generated by mig.\nboolean_t breakpad_exc_server(mach_msg_header_t *InHeadP,\n                              mach_msg_header_t *OutHeadP) {\n   OutHeadP->msgh_bits =\n       MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(InHeadP->msgh_bits), 0);\n   OutHeadP->msgh_remote_port = InHeadP->msgh_remote_port;\n   /* Minimal size: routine() will update it if different */\n   OutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t);\n   OutHeadP->msgh_local_port = MACH_PORT_NULL;\n   OutHeadP->msgh_id = InHeadP->msgh_id + 100;\n\n  if (InHeadP->msgh_id != 2401) {\n    ((mig_reply_error_t *)OutHeadP)->NDR = NDR_record;\n    ((mig_reply_error_t *)OutHeadP)->RetCode = MIG_BAD_ID;\n    return FALSE;\n  }\n\n#ifdef  __MigPackStructs\n#pragma pack(4)\n#endif\n  typedef struct {\n    mach_msg_header_t Head;\n    /* start of the kernel processed data */\n    mach_msg_body_t msgh_body;\n    mach_msg_port_descriptor_t thread;\n    mach_msg_port_descriptor_t task;\n    /* end of the kernel processed data */\n    NDR_record_t NDR;\n    exception_type_t exception;\n    mach_msg_type_number_t codeCnt;\n    integer_t code[2];\n    mach_msg_trailer_t trailer;\n  } Request;\n\n  typedef struct {\n    mach_msg_header_t Head;\n    NDR_record_t NDR;\n    kern_return_t RetCode;\n  } Reply;\n#ifdef  __MigPackStructs\n#pragma pack()\n#endif\n\n  Request *In0P = (Request *)InHeadP;\n  Reply *OutP = (Reply *)OutHeadP;\n\n  if (In0P->task.name != mach_task_self()) {\n    return FALSE;\n  }\n  OutP->RetCode = ForwardException(In0P->task.name,\n                                   In0P->thread.name,\n                                   In0P->exception,\n                                   In0P->code,\n                                   In0P->codeCnt);\n  OutP->NDR = NDR_record;\n  return TRUE;\n}\n#else\nboolean_t breakpad_exc_server(mach_msg_header_t *request,\n                              mach_msg_header_t *reply) {\n  return exc_server(request, reply);\n}\n\n// Callback from exc_server()\nkern_return_t catch_exception_raise(mach_port_t port, mach_port_t failed_thread,\n                                    mach_port_t task,\n                                    exception_type_t exception,\n                                    exception_data_t code,\n                                    mach_msg_type_number_t code_count) {\n  if (task != mach_task_self()) {\n    return KERN_FAILURE;\n  }\n  return ForwardException(task, failed_thread, exception, code, code_count);\n}\n#endif\n\nExceptionHandler::ExceptionHandler(const string &dump_path,\n                                   FilterCallback filter,\n                                   MinidumpCallback callback,\n                                   void *callback_context,\n                                   bool install_handler,\n                                   const char *port_name)\n    : dump_path_(),\n      filter_(filter),\n      callback_(callback),\n      callback_context_(callback_context),\n      directCallback_(NULL),\n      handler_thread_(NULL),\n      handler_port_(MACH_PORT_NULL),\n      previous_(NULL),\n      installed_exception_handler_(false),\n      is_in_teardown_(false),\n      last_minidump_write_result_(false),\n      use_minidump_write_mutex_(false) {\n  // This will update to the ID and C-string pointers\n  set_dump_path(dump_path);\n  MinidumpGenerator::GatherSystemInformation();\n#if !TARGET_OS_IPHONE\n  if (port_name)\n    crash_generation_client_.reset(new CrashGenerationClient(port_name));\n#endif\n  Setup(install_handler);\n}\n\n// special constructor if we want to bypass minidump writing and\n// simply get a callback with the exception information\nExceptionHandler::ExceptionHandler(DirectCallback callback,\n                                   void *callback_context,\n                                   bool install_handler)\n    : dump_path_(),\n      filter_(NULL),\n      callback_(NULL),\n      callback_context_(callback_context),\n      directCallback_(callback),\n      handler_thread_(NULL),\n      handler_port_(MACH_PORT_NULL),\n      previous_(NULL),\n      installed_exception_handler_(false),\n      is_in_teardown_(false),\n      last_minidump_write_result_(false),\n      use_minidump_write_mutex_(false) {\n  MinidumpGenerator::GatherSystemInformation();\n  Setup(install_handler);\n}\n\nExceptionHandler::~ExceptionHandler() {\n  Teardown();\n}\n\nbool ExceptionHandler::WriteMinidump(bool write_exception_stream) {\n  // If we're currently writing, just return\n  if (use_minidump_write_mutex_)\n    return false;\n\n  use_minidump_write_mutex_ = true;\n  last_minidump_write_result_ = false;\n\n  // Lock the mutex.  Since we just created it, this will return immediately.\n  if (pthread_mutex_lock(&minidump_write_mutex_) == 0) {\n    // Send an empty message to the handle port so that a minidump will\n    // be written\n    SendMessageToHandlerThread(write_exception_stream ?\n                                   kWriteDumpWithExceptionMessage :\n                                   kWriteDumpMessage);\n\n    // Wait for the minidump writer to complete its writing.  It will unlock\n    // the mutex when completed\n    pthread_mutex_lock(&minidump_write_mutex_);\n  }\n\n  use_minidump_write_mutex_ = false;\n  UpdateNextID();\n  return last_minidump_write_result_;\n}\n\n// static\nbool ExceptionHandler::WriteMinidump(const string &dump_path,\n                                     bool write_exception_stream,\n                                     MinidumpCallback callback,\n                                     void *callback_context) {\n  ExceptionHandler handler(dump_path, NULL, callback, callback_context, false,\n\t\t\t   NULL);\n  return handler.WriteMinidump(write_exception_stream);\n}\n\n// static\nbool ExceptionHandler::WriteMinidumpForChild(mach_port_t child,\n\t\t\t\t\t     mach_port_t child_blamed_thread,\n\t\t\t\t\t     const string &dump_path,\n\t\t\t\t\t     MinidumpCallback callback,\n\t\t\t\t\t     void *callback_context) {\n  ScopedTaskSuspend suspend(child);\n\n  MinidumpGenerator generator(child, MACH_PORT_NULL);\n  string dump_id;\n  string dump_filename = generator.UniqueNameInDirectory(dump_path, &dump_id);\n\n  generator.SetExceptionInformation(EXC_BREAKPOINT,\n#if defined (__i386__) || defined(__x86_64__)\n\t\t\t\t    EXC_I386_BPT,\n#elif defined (__ppc__) || defined (__ppc64__)\n\t\t\t\t    EXC_PPC_BREAKPOINT,\n#elif defined (__arm__)\n\t\t\t\t    EXC_ARM_BREAKPOINT,\n#else\n#error architecture not supported\n#endif\n\t\t\t\t    0,\n\t\t\t\t    child_blamed_thread);\n  bool result = generator.Write(dump_filename.c_str());\n\n  if (callback) {\n    return callback(dump_path.c_str(), dump_id.c_str(),\n\t\t    callback_context, result);\n  }\n  return result;\n}\n\nbool ExceptionHandler::WriteMinidumpWithException(int exception_type,\n                                                  int exception_code,\n                                                  int exception_subcode,\n                                                  mach_port_t thread_name,\n                                                  bool exit_after_write,\n                                                  bool report_current_thread) {\n  bool result = false;\n\n  if (directCallback_) {\n    if (directCallback_(callback_context_,\n                        exception_type,\n                        exception_code,\n                        exception_subcode,\n                        thread_name) ) {\n      if (exit_after_write)\n        _exit(exception_type);\n    }\n#if !TARGET_OS_IPHONE\n  } else if (IsOutOfProcess()) {\n    if (exception_type && exception_code) {\n      // If this is a real exception, give the filter (if any) a chance to\n      // decide if this should be sent.\n      if (filter_ && !filter_(callback_context_))\n\treturn false;\n      return crash_generation_client_->RequestDumpForException(\n\t         exception_type,\n\t\t exception_code,\n\t\t exception_subcode,\n\t\t thread_name);\n    }\n#endif\n  } else {\n    string minidump_id;\n\n    // Putting the MinidumpGenerator in its own context will ensure that the\n    // destructor is executed, closing the newly created minidump file.\n    if (!dump_path_.empty()) {\n      MinidumpGenerator md(mach_task_self(),\n                           report_current_thread ? MACH_PORT_NULL :\n                                                   mach_thread_self());\n      if (exception_type && exception_code) {\n        // If this is a real exception, give the filter (if any) a chance to\n        // decide if this should be sent.\n        if (filter_ && !filter_(callback_context_))\n          return false;\n\n        md.SetExceptionInformation(exception_type, exception_code,\n                                   exception_subcode, thread_name);\n      }\n\n      result = md.Write(next_minidump_path_c_);\n    }\n\n    // Call user specified callback (if any)\n    if (callback_) {\n      // If the user callback returned true and we're handling an exception\n      // (rather than just writing out the file), then we should exit without\n      // forwarding the exception to the next handler.\n      if (callback_(dump_path_c_, next_minidump_id_c_, callback_context_,\n                    result)) {\n        if (exit_after_write)\n          _exit(exception_type);\n      }\n    }\n  }\n\n  return result;\n}\n\nkern_return_t ForwardException(mach_port_t task, mach_port_t failed_thread,\n                               exception_type_t exception,\n                               exception_data_t code,\n                               mach_msg_type_number_t code_count) {\n  // At this time, we should have called Uninstall() on the exception handler\n  // so that the current exception ports are the ones that we should be\n  // forwarding to.\n  ExceptionParameters current;\n\n  current.count = EXC_TYPES_COUNT;\n  mach_port_t current_task = mach_task_self();\n  task_get_exception_ports(current_task,\n                           s_exception_mask,\n                           current.masks,\n                           &current.count,\n                           current.ports,\n                           current.behaviors,\n                           current.flavors);\n\n  // Find the first exception handler that matches the exception\n  unsigned int found;\n  for (found = 0; found < current.count; ++found) {\n    if (current.masks[found] & (1 << exception)) {\n      break;\n    }\n  }\n\n  // Nothing to forward\n  if (found == current.count) {\n    fprintf(stderr, \"** No previous ports for forwarding!! \\n\");\n    exit(KERN_FAILURE);\n  }\n\n  mach_port_t target_port = current.ports[found];\n  exception_behavior_t target_behavior = current.behaviors[found];\n\n  kern_return_t result;\n  switch (target_behavior) {\n    case EXCEPTION_DEFAULT:\n      result = exception_raise(target_port, failed_thread, task, exception,\n                               code, code_count);\n      break;\n\n    default:\n      fprintf(stderr, \"** Unknown exception behavior: %d\\n\", target_behavior);\n      result = KERN_FAILURE;\n      break;\n  }\n\n  return result;\n}\n\n// static\nvoid *ExceptionHandler::WaitForMessage(void *exception_handler_class) {\n  ExceptionHandler *self =\n    reinterpret_cast<ExceptionHandler *>(exception_handler_class);\n  ExceptionMessage receive;\n\n  // Wait for the exception info\n  while (1) {\n    receive.header.msgh_local_port = self->handler_port_;\n    receive.header.msgh_size = static_cast<mach_msg_size_t>(sizeof(receive));\n    kern_return_t result = mach_msg(&(receive.header),\n                                    MACH_RCV_MSG | MACH_RCV_LARGE, 0,\n                                    receive.header.msgh_size,\n                                    self->handler_port_,\n                                    MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);\n\n\n    if (result == KERN_SUCCESS) {\n      // Uninstall our handler so that we don't get in a loop if the process of\n      // writing out a minidump causes an exception.  However, if the exception\n      // was caused by a fork'd process, don't uninstall things\n\n      // If the actual exception code is zero, then we're calling this handler\n      // in a way that indicates that we want to either exit this thread or\n      // generate a minidump\n      //\n      // While reporting, all threads (except this one) must be suspended\n      // to avoid misleading stacks.  If appropriate they will be resumed\n      // afterwards.\n      if (!receive.exception) {\n        // Don't touch self, since this message could have been sent\n        // from its destructor.\n        if (receive.header.msgh_id == kShutdownMessage)\n          return NULL;\n\n        self->SuspendThreads();\n\n#if USE_PROTECTED_ALLOCATIONS\n        if (gBreakpadAllocator)\n          gBreakpadAllocator->Unprotect();\n#endif\n\n        mach_port_t thread = MACH_PORT_NULL;\n        int exception_type = 0;\n        int exception_code = 0;\n        if (receive.header.msgh_id == kWriteDumpWithExceptionMessage) {\n          thread = receive.thread.name;\n          exception_type = EXC_BREAKPOINT;\n#if defined (__i386__) || defined(__x86_64__)\n          exception_code = EXC_I386_BPT;\n#elif defined (__ppc__) || defined (__ppc64__)\n          exception_code = EXC_PPC_BREAKPOINT;\n#elif defined (__arm__)\n          exception_code = EXC_ARM_BREAKPOINT;\n#else\n#error architecture not supported\n#endif\n        }\n\n        // Write out the dump and save the result for later retrieval\n        self->last_minidump_write_result_ =\n          self->WriteMinidumpWithException(exception_type, exception_code,\n                                           0, thread,\n                                           false, false);\n\n#if USE_PROTECTED_ALLOCATIONS\n        if (gBreakpadAllocator)\n          gBreakpadAllocator->Protect();\n#endif\n\n        self->ResumeThreads();\n\n        if (self->use_minidump_write_mutex_)\n          pthread_mutex_unlock(&self->minidump_write_mutex_);\n      } else {\n        // When forking a child process with the exception handler installed,\n        // if the child crashes, it will send the exception back to the parent\n        // process.  The check for task == self_task() ensures that only\n        // exceptions that occur in the parent process are caught and\n        // processed.  If the exception was not caused by this task, we\n        // still need to call into the exception server and have it return\n        // KERN_FAILURE (see catch_exception_raise) in order for the kernel\n        // to move onto the host exception handler for the child task\n        if (receive.task.name == mach_task_self()) {\n          self->SuspendThreads();\n\n#if USE_PROTECTED_ALLOCATIONS\n        if (gBreakpadAllocator)\n          gBreakpadAllocator->Unprotect();\n#endif\n\n        int subcode = 0;\n        if (receive.exception == EXC_BAD_ACCESS && receive.code_count > 1)\n          subcode = receive.code[1];\n\n        // Generate the minidump with the exception data.\n        self->WriteMinidumpWithException(receive.exception, receive.code[0],\n                                         subcode, receive.thread.name, true,\n                                         false);\n\n#if USE_PROTECTED_ALLOCATIONS\n        // This may have become protected again within\n        // WriteMinidumpWithException, but it needs to be unprotected for\n        // UninstallHandler.\n        if (gBreakpadAllocator)\n          gBreakpadAllocator->Unprotect();\n#endif\n\n        self->UninstallHandler(true);\n\n#if USE_PROTECTED_ALLOCATIONS\n        if (gBreakpadAllocator)\n          gBreakpadAllocator->Protect();\n#endif\n        }\n        // Pass along the exception to the server, which will setup the\n        // message and call catch_exception_raise() and put the return\n        // code into the reply.\n        ExceptionReplyMessage reply;\n        if (!breakpad_exc_server(&receive.header, &reply.header))\n          exit(1);\n\n        // Send a reply and exit\n        mach_msg(&(reply.header), MACH_SEND_MSG,\n                 reply.header.msgh_size, 0, MACH_PORT_NULL,\n                 MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);\n      }\n    }\n  }\n\n  return NULL;\n}\n\n//static\nvoid ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) {\n#if USE_PROTECTED_ALLOCATIONS\n  if (gBreakpadAllocator)\n    gBreakpadAllocator->Unprotect();\n#endif\n  gProtectedData.handler->WriteMinidumpWithException(\n      EXC_SOFTWARE,\n      MD_EXCEPTION_CODE_MAC_ABORT,\n      0,\n      mach_thread_self(),\n      true,\n      true);\n#if USE_PROTECTED_ALLOCATIONS\n  if (gBreakpadAllocator)\n    gBreakpadAllocator->Protect();\n#endif\n}\n\nbool ExceptionHandler::InstallHandler() {\n  // If a handler is already installed, something is really wrong.\n  if (gProtectedData.handler != NULL) {\n    return false;\n  }\n#if TARGET_OS_IPHONE\n  if (!IsOutOfProcess()) {\n    struct sigaction sa;\n    memset(&sa, 0, sizeof(sa));\n    sigemptyset(&sa.sa_mask);\n    sigaddset(&sa.sa_mask, SIGABRT);\n    sa.sa_sigaction = ExceptionHandler::SignalHandler;\n    sa.sa_flags = SA_SIGINFO;\n\n    scoped_ptr<struct sigaction> old(new struct sigaction);\n    if (sigaction(SIGABRT, &sa, old.get()) == -1) {\n      return false;\n    }\n    old_handler_.swap(old);\n    gProtectedData.handler = this;\n#if USE_PROTECTED_ALLOCATIONS\n    assert(((size_t)(gProtectedData.protected_buffer) & PAGE_MASK) == 0);\n    mprotect(gProtectedData.protected_buffer, PAGE_SIZE, PROT_READ);\n#endif\n  }\n#endif\n\n  try {\n#if USE_PROTECTED_ALLOCATIONS\n    previous_ = new (gBreakpadAllocator->Allocate(sizeof(ExceptionParameters)) )\n      ExceptionParameters();\n#else\n    previous_ = new ExceptionParameters();\n#endif\n\n  }\n  catch (std::bad_alloc) {\n    return false;\n  }\n\n  // Save the current exception ports so that we can forward to them\n  previous_->count = EXC_TYPES_COUNT;\n  mach_port_t current_task = mach_task_self();\n  kern_return_t result = task_get_exception_ports(current_task,\n                                                  s_exception_mask,\n                                                  previous_->masks,\n                                                  &previous_->count,\n                                                  previous_->ports,\n                                                  previous_->behaviors,\n                                                  previous_->flavors);\n\n  // Setup the exception ports on this task\n  if (result == KERN_SUCCESS)\n    result = task_set_exception_ports(current_task, s_exception_mask,\n                                      handler_port_, EXCEPTION_DEFAULT,\n                                      THREAD_STATE_NONE);\n\n  installed_exception_handler_ = (result == KERN_SUCCESS);\n\n  return installed_exception_handler_;\n}\n\nbool ExceptionHandler::UninstallHandler(bool in_exception) {\n  kern_return_t result = KERN_SUCCESS;\n\n  if (old_handler_.get()) {\n    sigaction(SIGABRT, old_handler_.get(), NULL);\n#if USE_PROTECTED_ALLOCATIONS\n    mprotect(gProtectedData.protected_buffer, PAGE_SIZE,\n        PROT_READ | PROT_WRITE);\n#endif\n    old_handler_.reset();\n    gProtectedData.handler = NULL;\n  }\n\n  if (installed_exception_handler_) {\n    mach_port_t current_task = mach_task_self();\n\n    // Restore the previous ports\n    for (unsigned int i = 0; i < previous_->count; ++i) {\n       result = task_set_exception_ports(current_task, previous_->masks[i],\n                                        previous_->ports[i],\n                                        previous_->behaviors[i],\n                                        previous_->flavors[i]);\n      if (result != KERN_SUCCESS)\n        return false;\n    }\n\n    // this delete should NOT happen if an exception just occurred!\n    if (!in_exception) {\n#if USE_PROTECTED_ALLOCATIONS\n      previous_->~ExceptionParameters();\n#else\n      delete previous_;\n#endif\n    }\n\n    previous_ = NULL;\n    installed_exception_handler_ = false;\n  }\n\n  return result == KERN_SUCCESS;\n}\n\nbool ExceptionHandler::Setup(bool install_handler) {\n  if (pthread_mutex_init(&minidump_write_mutex_, NULL))\n    return false;\n\n  // Create a receive right\n  mach_port_t current_task = mach_task_self();\n  kern_return_t result = mach_port_allocate(current_task,\n                                            MACH_PORT_RIGHT_RECEIVE,\n                                            &handler_port_);\n  // Add send right\n  if (result == KERN_SUCCESS)\n    result = mach_port_insert_right(current_task, handler_port_, handler_port_,\n                                    MACH_MSG_TYPE_MAKE_SEND);\n\n  if (install_handler && result == KERN_SUCCESS)\n    if (!InstallHandler())\n      return false;\n\n  if (result == KERN_SUCCESS) {\n    // Install the handler in its own thread, detached as we won't be joining.\n    pthread_attr_t attr;\n    pthread_attr_init(&attr);\n    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n    int thread_create_result = pthread_create(&handler_thread_, &attr,\n                                              &WaitForMessage, this);\n    pthread_attr_destroy(&attr);\n    result = thread_create_result ? KERN_FAILURE : KERN_SUCCESS;\n  }\n\n  return result == KERN_SUCCESS ? true : false;\n}\n\nbool ExceptionHandler::Teardown() {\n  kern_return_t result = KERN_SUCCESS;\n  is_in_teardown_ = true;\n\n  if (!UninstallHandler(false))\n    return false;\n\n  // Send an empty message so that the handler_thread exits\n  if (SendMessageToHandlerThread(kShutdownMessage)) {\n    mach_port_t current_task = mach_task_self();\n    result = mach_port_deallocate(current_task, handler_port_);\n    if (result != KERN_SUCCESS)\n      return false;\n  } else {\n    return false;\n  }\n\n  handler_thread_ = NULL;\n  handler_port_ = MACH_PORT_NULL;\n  pthread_mutex_destroy(&minidump_write_mutex_);\n\n  return result == KERN_SUCCESS;\n}\n\nbool ExceptionHandler::SendMessageToHandlerThread(\n    HandlerThreadMessage message_id) {\n  ExceptionMessage msg;\n  memset(&msg, 0, sizeof(msg));\n  msg.header.msgh_id = message_id;\n  if (message_id == kWriteDumpMessage ||\n      message_id == kWriteDumpWithExceptionMessage) {\n    // Include this thread's port.\n    msg.thread.name = mach_thread_self();\n    msg.thread.disposition = MACH_MSG_TYPE_PORT_SEND;\n    msg.thread.type = MACH_MSG_PORT_DESCRIPTOR;\n  }\n  msg.header.msgh_size = sizeof(msg) - sizeof(msg.padding);\n  msg.header.msgh_remote_port = handler_port_;\n  msg.header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND,\n                                          MACH_MSG_TYPE_MAKE_SEND_ONCE);\n  kern_return_t result = mach_msg(&(msg.header),\n                                  MACH_SEND_MSG | MACH_SEND_TIMEOUT,\n                                  msg.header.msgh_size, 0, 0,\n                                  MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);\n\n  return result == KERN_SUCCESS;\n}\n\nvoid ExceptionHandler::UpdateNextID() {\n  next_minidump_path_ =\n    (MinidumpGenerator::UniqueNameInDirectory(dump_path_, &next_minidump_id_));\n\n  next_minidump_path_c_ = next_minidump_path_.c_str();\n  next_minidump_id_c_ = next_minidump_id_.c_str();\n}\n\nbool ExceptionHandler::SuspendThreads() {\n  thread_act_port_array_t   threads_for_task;\n  mach_msg_type_number_t    thread_count;\n\n  if (task_threads(mach_task_self(), &threads_for_task, &thread_count))\n    return false;\n\n  // suspend all of the threads except for this one\n  for (unsigned int i = 0; i < thread_count; ++i) {\n    if (threads_for_task[i] != mach_thread_self()) {\n      if (thread_suspend(threads_for_task[i]))\n        return false;\n    }\n  }\n\n  return true;\n}\n\nbool ExceptionHandler::ResumeThreads() {\n  thread_act_port_array_t   threads_for_task;\n  mach_msg_type_number_t    thread_count;\n\n  if (task_threads(mach_task_self(), &threads_for_task, &thread_count))\n    return false;\n\n  // resume all of the threads except for this one\n  for (unsigned int i = 0; i < thread_count; ++i) {\n    if (threads_for_task[i] != mach_thread_self()) {\n      if (thread_resume(threads_for_task[i]))\n        return false;\n    }\n  }\n\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/exception_handler.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// exception_handler.h:  MacOS exception handler\n// This class can install a Mach exception port handler to trap most common\n// programming errors.  If an exception occurs, a minidump file will be\n// generated which contains detailed information about the process and the\n// exception.\n\n#ifndef CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__\n#define CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__\n\n#include <mach/mach.h>\n#include <TargetConditionals.h>\n\n#include <string>\n\n#include \"processor/scoped_ptr.h\"\n\n#if !TARGET_OS_IPHONE\n#include \"client/mac/crash_generation/crash_generation_client.h\"\n#endif\n\nnamespace google_breakpad {\n\nusing std::string;\n\nstruct ExceptionParameters;\n\nenum HandlerThreadMessage {\n  // Message ID telling the handler thread to write a dump.\n  kWriteDumpMessage = 0,\n  // Message ID telling the handler thread to write a dump and include\n  // an exception stream.\n  kWriteDumpWithExceptionMessage = 1,\n  // Message ID telling the handler thread to quit.\n  kShutdownMessage = 2\n};\n\nclass ExceptionHandler {\n public:\n  // A callback function to run before Breakpad performs any substantial\n  // processing of an exception.  A FilterCallback is called before writing\n  // a minidump.  context is the parameter supplied by the user as\n  // callback_context when the handler was created.\n  //\n  // If a FilterCallback returns true, Breakpad will continue processing,\n  // attempting to write a minidump.  If a FilterCallback returns false, Breakpad\n  // will immediately report the exception as unhandled without writing a\n  // minidump, allowing another handler the opportunity to handle it.\n  typedef bool (*FilterCallback)(void *context);\n\n  // A callback function to run after the minidump has been written.\n  // |minidump_id| is a unique id for the dump, so the minidump\n  // file is <dump_dir>/<minidump_id>.dmp.\n  // |context| is the value passed into the constructor.\n  // |succeeded| indicates whether a minidump file was successfully written.\n  // Return true if the exception was fully handled and breakpad should exit.\n  // Return false to allow any other exception handlers to process the\n  // exception.\n  typedef bool (*MinidumpCallback)(const char *dump_dir,\n                                   const char *minidump_id,\n                                   void *context, bool succeeded);\n\n  // A callback function which will be called directly if an exception occurs.\n  // This bypasses the minidump file writing and simply gives the client\n  // the exception information.\n  typedef bool (*DirectCallback)( void *context,\n                                  int exception_type,\n                                  int exception_code,\n                                  int exception_subcode,\n                                  mach_port_t thread_name);\n\n  // Creates a new ExceptionHandler instance to handle writing minidumps.\n  // Minidump files will be written to dump_path, and the optional callback\n  // is called after writing the dump file, as described above.\n  // If install_handler is true, then a minidump will be written whenever\n  // an unhandled exception occurs.  If it is false, minidumps will only\n  // be written when WriteMinidump is called.\n  // If port_name is non-NULL, attempt to perform out-of-process dump generation\n  // If port_name is NULL, in-process dump generation will be used.\n  ExceptionHandler(const string &dump_path,\n                   FilterCallback filter, MinidumpCallback callback,\n                   void *callback_context, bool install_handler,\n\t\t   const char *port_name);\n\n  // A special constructor if we want to bypass minidump writing and\n  // simply get a callback with the exception information.\n  ExceptionHandler(DirectCallback callback,\n                   void *callback_context,\n                   bool install_handler);\n\n  ~ExceptionHandler();\n\n  // Get and set the minidump path.\n  string dump_path() const { return dump_path_; }\n  void set_dump_path(const string &dump_path) {\n    dump_path_ = dump_path;\n    dump_path_c_ = dump_path_.c_str();\n    UpdateNextID();  // Necessary to put dump_path_ in next_minidump_path_.\n  }\n\n  // Writes a minidump immediately.  This can be used to capture the\n  // execution state independently of a crash.  Returns true on success.\n  bool WriteMinidump() {\n    return WriteMinidump(false);\n  }\n\n  bool WriteMinidump(bool write_exception_stream);\n\n  // Convenience form of WriteMinidump which does not require an\n  // ExceptionHandler instance.\n  static bool WriteMinidump(const string &dump_path, MinidumpCallback callback,\n                            void *callback_context) {\n    return WriteMinidump(dump_path, false, callback, callback_context);\n  }\n\n  static bool WriteMinidump(const string &dump_path,\n                            bool write_exception_stream,\n                            MinidumpCallback callback,\n                            void *callback_context);\n\n  // Write a minidump of child immediately. This can be used to capture\n  // the execution state of a child process independently of a crash.\n  static bool WriteMinidumpForChild(mach_port_t child,\n\t\t\t\t    mach_port_t child_blamed_thread,\n\t\t\t\t    const std::string &dump_path,\n\t\t\t\t    MinidumpCallback callback,\n\t\t\t\t    void *callback_context);\n\n  // Returns whether out-of-process dump generation is used or not.\n  bool IsOutOfProcess() const {\n#if TARGET_OS_IPHONE\n    return false;\n#else\n    return crash_generation_client_.get() != NULL;\n#endif\n  }\n\n private:\n  // Install the mach exception handler\n  bool InstallHandler();\n\n  // Uninstall the mach exception handler (if any)\n  bool UninstallHandler(bool in_exception);\n\n  // Setup the handler thread, and if |install_handler| is true, install the\n  // mach exception port handler\n  bool Setup(bool install_handler);\n\n  // Uninstall the mach exception handler (if any) and terminate the helper\n  // thread\n  bool Teardown();\n\n  // Send a mach message to the exception handler.  Return true on\n  // success, false otherwise.\n  bool SendMessageToHandlerThread(HandlerThreadMessage message_id);\n\n  // All minidump writing goes through this one routine\n  bool WriteMinidumpWithException(int exception_type,\n                                  int exception_code,\n                                  int exception_subcode,\n                                  mach_port_t thread_name,\n                                  bool exit_after_write,\n                                  bool report_current_thread);\n\n  // When installed, this static function will be call from a newly created\n  // pthread with |this| as the argument\n  static void *WaitForMessage(void *exception_handler_class);\n\n  // Signal handler for SIGABRT.\n  static void SignalHandler(int sig, siginfo_t* info, void* uc);\n\n  // disallow copy ctor and operator=\n  explicit ExceptionHandler(const ExceptionHandler &);\n  void operator=(const ExceptionHandler &);\n\n  // Generates a new ID and stores it in next_minidump_id_, and stores the\n  // path of the next minidump to be written in next_minidump_path_.\n  void UpdateNextID();\n\n  // These functions will suspend/resume all threads except for the\n  // reporting thread\n  bool SuspendThreads();\n  bool ResumeThreads();\n\n  // The destination directory for the minidump\n  string dump_path_;\n\n  // The basename of the next minidump w/o extension\n  string next_minidump_id_;\n\n  // The full path to the next minidump to be written, including extension\n  string next_minidump_path_;\n\n  // Pointers to the UTF-8 versions of above\n  const char *dump_path_c_;\n  const char *next_minidump_id_c_;\n  const char *next_minidump_path_c_;\n\n  // The callback function and pointer to be passed back after the minidump\n  // has been written\n  FilterCallback filter_;\n  MinidumpCallback callback_;\n  void *callback_context_;\n\n  // The callback function to be passed back when we don't want a minidump\n  // file to be written\n  DirectCallback directCallback_;\n\n  // The thread that is created for the handler\n  pthread_t handler_thread_;\n\n  // The port that is waiting on an exception message to be sent, if the\n  // handler is installed\n  mach_port_t handler_port_;\n\n  // These variables save the previous exception handler's data so that it\n  // can be re-installed when this handler is uninstalled\n  ExceptionParameters *previous_;\n\n  // True, if we've installed the exception handler\n  bool installed_exception_handler_;\n\n  // True, if we're in the process of uninstalling the exception handler and\n  // the thread.\n  bool is_in_teardown_;\n\n  // Save the last result of the last minidump\n  bool last_minidump_write_result_;\n\n  // A mutex for use when writing out a minidump that was requested on a\n  // thread other than the exception handler.\n  pthread_mutex_t minidump_write_mutex_;\n\n  // True, if we're using the mutext to indicate when mindump writing occurs\n  bool use_minidump_write_mutex_;\n\n  // Old signal handler for SIGABRT. Used to be able to restore it when\n  // uninstalling.\n  scoped_ptr<struct sigaction> old_handler_;\n\n#if !TARGET_OS_IPHONE\n  // Client for out-of-process dump generation.\n  scoped_ptr<CrashGenerationClient> crash_generation_client_;\n#endif\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_MAC_HANDLER_EXCEPTION_HANDLER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/mach_vm_compat.h",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_MAC_GENERATOR_MACH_VM_COMPAT_H_\n#define CLIENT_MAC_GENERATOR_MACH_VM_COMPAT_H_\n\n#include <TargetConditionals.h>\n\n// On iOS 5, mach/mach_vm.h is not supported anymore. As the architecture is 32\n// bits, we can use the simple vm_ functions instead of the mach_vm_ ones.\n#if TARGET_OS_IPHONE\n#include <mach/vm_map.h>\n#define mach_vm_address_t vm_address_t\n#define mach_vm_deallocate vm_deallocate\n#define mach_vm_read vm_read\n#define mach_vm_region vm_region\n#define mach_vm_region_recurse vm_region_recurse\n#define mach_vm_size_t vm_size_t\n#else\n#include <mach/mach_vm.h>\n#endif  // TARGET_OS_IPHONE\n\n#endif  // CLIENT_MAC_GENERATOR_MACH_VM_COMPAT_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/minidump_generator.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <algorithm>\n#include <cstdio>\n\n#include <mach/host_info.h>\n#include <mach/vm_statistics.h>\n#include <mach-o/dyld.h>\n#include <mach-o/loader.h>\n#include <sys/sysctl.h>\n#include <sys/resource.h>\n\n#include <CoreFoundation/CoreFoundation.h>\n\n#include \"client/mac/handler/minidump_generator.h\"\n\n#ifdef HAS_ARM_SUPPORT\n#include <mach/arm/thread_status.h>\n#endif\n#ifdef HAS_PPC_SUPPORT\n#include <mach/ppc/thread_status.h>\n#endif\n#ifdef HAS_X86_SUPPORT\n#include <mach/i386/thread_status.h>\n#endif\n\n#include \"client/minidump_file_writer-inl.h\"\n#include \"common/mac/file_id.h\"\n#include \"common/mac/macho_id.h\"\n#include \"common/mac/string_utilities.h\"\n\nusing MacStringUtils::ConvertToString;\nusing MacStringUtils::IntegerValueAtIndex;\n\nnamespace google_breakpad {\n\n#if __LP64__\n#define LC_SEGMENT_ARCH LC_SEGMENT_64\n#else\n#define LC_SEGMENT_ARCH LC_SEGMENT\n#endif\n\n// constructor when generating from within the crashed process\nMinidumpGenerator::MinidumpGenerator()\n    : writer_(),\n      exception_type_(0),\n      exception_code_(0),\n      exception_subcode_(0),\n      exception_thread_(0),\n      crashing_task_(mach_task_self()),\n      handler_thread_(mach_thread_self()),\n      cpu_type_(DynamicImages::GetNativeCPUType()),\n      dynamic_images_(NULL),\n      memory_blocks_(&allocator_) {\n  GatherSystemInformation();\n}\n\n// constructor when generating from a different process than the\n// crashed process\nMinidumpGenerator::MinidumpGenerator(mach_port_t crashing_task,\n                                     mach_port_t handler_thread)\n    : writer_(),\n      exception_type_(0),\n      exception_code_(0),\n      exception_subcode_(0),\n      exception_thread_(0),\n      crashing_task_(crashing_task),\n      handler_thread_(handler_thread),\n      cpu_type_(DynamicImages::GetNativeCPUType()),\n      dynamic_images_(NULL),\n      memory_blocks_(&allocator_) {\n  if (crashing_task != mach_task_self()) {\n    dynamic_images_ = new DynamicImages(crashing_task_);\n    cpu_type_ = dynamic_images_->GetCPUType();\n  } else {\n    dynamic_images_ = NULL;\n    cpu_type_ = DynamicImages::GetNativeCPUType();\n  }\n\n  GatherSystemInformation();\n}\n\nMinidumpGenerator::~MinidumpGenerator() {\n  delete dynamic_images_;\n}\n\nchar MinidumpGenerator::build_string_[16];\nint MinidumpGenerator::os_major_version_ = 0;\nint MinidumpGenerator::os_minor_version_ = 0;\nint MinidumpGenerator::os_build_number_ = 0;\n\n// static\nvoid MinidumpGenerator::GatherSystemInformation() {\n  // If this is non-zero, then we've already gathered the information\n  if (os_major_version_)\n    return;\n\n  // This code extracts the version and build information from the OS\n  CFStringRef vers_path =\n    CFSTR(\"/System/Library/CoreServices/SystemVersion.plist\");\n  CFURLRef sys_vers =\n    CFURLCreateWithFileSystemPath(NULL,\n                                  vers_path,\n                                  kCFURLPOSIXPathStyle,\n                                  false);\n  CFDataRef data;\n  SInt32 error;\n  CFURLCreateDataAndPropertiesFromResource(NULL, sys_vers, &data, NULL, NULL,\n                                           &error);\n\n  if (!data) {\n    CFRelease(sys_vers);\n    return;\n  }\n\n  CFDictionaryRef list = static_cast<CFDictionaryRef>\n    (CFPropertyListCreateFromXMLData(NULL, data, kCFPropertyListImmutable,\n                                     NULL));\n  if (!list) {\n    CFRelease(sys_vers);\n    CFRelease(data);\n    return;\n  }\n\n  CFStringRef build_version = static_cast<CFStringRef>\n    (CFDictionaryGetValue(list, CFSTR(\"ProductBuildVersion\")));\n  CFStringRef product_version = static_cast<CFStringRef>\n    (CFDictionaryGetValue(list, CFSTR(\"ProductVersion\")));\n  string build_str = ConvertToString(build_version);\n  string product_str = ConvertToString(product_version);\n\n  CFRelease(list);\n  CFRelease(sys_vers);\n  CFRelease(data);\n\n  strlcpy(build_string_, build_str.c_str(), sizeof(build_string_));\n\n  // Parse the string that looks like \"10.4.8\"\n  os_major_version_ = IntegerValueAtIndex(product_str, 0);\n  os_minor_version_ = IntegerValueAtIndex(product_str, 1);\n  os_build_number_ = IntegerValueAtIndex(product_str, 2);\n}\n\nstring MinidumpGenerator::UniqueNameInDirectory(const string &dir,\n                                                string *unique_name) {\n  CFUUIDRef uuid = CFUUIDCreate(NULL);\n  CFStringRef uuid_cfstr = CFUUIDCreateString(NULL, uuid);\n  CFRelease(uuid);\n  string file_name(ConvertToString(uuid_cfstr));\n  CFRelease(uuid_cfstr);\n  string path(dir);\n\n  // Ensure that the directory (if non-empty) has a trailing slash so that\n  // we can append the file name and have a valid pathname.\n  if (!dir.empty()) {\n    if (dir.at(dir.size() - 1) != '/')\n      path.append(1, '/');\n  }\n\n  path.append(file_name);\n  path.append(\".dmp\");\n\n  if (unique_name)\n    *unique_name = file_name;\n\n  return path;\n}\n\nbool MinidumpGenerator::Write(const char *path) {\n  WriteStreamFN writers[] = {\n    &MinidumpGenerator::WriteThreadListStream,\n    &MinidumpGenerator::WriteMemoryListStream,\n    &MinidumpGenerator::WriteSystemInfoStream,\n    &MinidumpGenerator::WriteModuleListStream,\n    &MinidumpGenerator::WriteMiscInfoStream,\n    &MinidumpGenerator::WriteBreakpadInfoStream,\n    // Exception stream needs to be the last entry in this array as it may\n    // be omitted in the case where the minidump is written without an\n    // exception.\n    &MinidumpGenerator::WriteExceptionStream,\n  };\n  bool result = false;\n\n  // If opening was successful, create the header, directory, and call each\n  // writer.  The destructor for the TypedMDRVAs will cause the data to be\n  // flushed.  The destructor for the MinidumpFileWriter will close the file.\n  if (writer_.Open(path)) {\n    TypedMDRVA<MDRawHeader> header(&writer_);\n    TypedMDRVA<MDRawDirectory> dir(&writer_);\n\n    if (!header.Allocate())\n      return false;\n\n    int writer_count = static_cast<int>(sizeof(writers) / sizeof(writers[0]));\n\n    // If we don't have exception information, don't write out the\n    // exception stream\n    if (!exception_thread_ && !exception_type_)\n      --writer_count;\n\n    // Add space for all writers\n    if (!dir.AllocateArray(writer_count))\n      return false;\n\n    MDRawHeader *header_ptr = header.get();\n    header_ptr->signature = MD_HEADER_SIGNATURE;\n    header_ptr->version = MD_HEADER_VERSION;\n    time(reinterpret_cast<time_t *>(&(header_ptr->time_date_stamp)));\n    header_ptr->stream_count = writer_count;\n    header_ptr->stream_directory_rva = dir.position();\n\n    MDRawDirectory local_dir;\n    result = true;\n    for (int i = 0; (result) && (i < writer_count); ++i) {\n      result = (this->*writers[i])(&local_dir);\n\n      if (result)\n        dir.CopyIndex(i, &local_dir);\n    }\n  }\n  return result;\n}\n\nsize_t MinidumpGenerator::CalculateStackSize(mach_vm_address_t start_addr) {\n  mach_vm_address_t stack_region_base = start_addr;\n  mach_vm_size_t stack_region_size;\n  natural_t nesting_level = 0;\n  vm_region_submap_info_64 submap_info;\n  mach_msg_type_number_t info_count = VM_REGION_SUBMAP_INFO_COUNT_64;\n\n  vm_region_recurse_info_t region_info;\n  region_info = reinterpret_cast<vm_region_recurse_info_t>(&submap_info);\n\n  if (start_addr == 0) {\n    return 0;\n  }\n\n  kern_return_t result =\n    mach_vm_region_recurse(crashing_task_, &stack_region_base,\n                           &stack_region_size, &nesting_level,\n                           region_info, &info_count);\n\n  if (result != KERN_SUCCESS || start_addr < stack_region_base) {\n    // Failure or stack corruption, since mach_vm_region had to go\n    // higher in the process address space to find a valid region.\n    return 0;\n  }\n\n  unsigned int tag = submap_info.user_tag;\n\n  // If the user tag is VM_MEMORY_STACK, look for more readable regions with\n  // the same tag placed immediately above the computed stack region. Under\n  // some circumstances, the stack for thread 0 winds up broken up into\n  // multiple distinct abutting regions. This can happen for several reasons,\n  // including user code that calls setrlimit(RLIMIT_STACK, ...) or changes\n  // the access on stack pages by calling mprotect.\n  if (tag == VM_MEMORY_STACK) {\n    while (true) {\n      mach_vm_address_t next_region_base = stack_region_base +\n                                           stack_region_size;\n      mach_vm_address_t proposed_next_region_base = next_region_base;\n      mach_vm_size_t next_region_size;\n      nesting_level = 0;\n      mach_msg_type_number_t info_count = VM_REGION_SUBMAP_INFO_COUNT_64;\n      result = mach_vm_region_recurse(crashing_task_, &next_region_base,\n                                      &next_region_size, &nesting_level,\n                                      region_info, &info_count);\n      if (result != KERN_SUCCESS ||\n          next_region_base != proposed_next_region_base ||\n          submap_info.user_tag != tag ||\n          (submap_info.protection & VM_PROT_READ) == 0) {\n        break;\n      }\n\n      stack_region_size += next_region_size;\n    }\n  }\n\n  return stack_region_base + stack_region_size - start_addr;\n}\n\nbool MinidumpGenerator::WriteStackFromStartAddress(\n    mach_vm_address_t start_addr,\n    MDMemoryDescriptor *stack_location) {\n  UntypedMDRVA memory(&writer_);\n\n  bool result = false;\n  size_t size = CalculateStackSize(start_addr);\n\n  if (size == 0) {\n      // In some situations the stack address for the thread can come back 0.\n      // In these cases we skip over the threads in question and stuff the\n      // stack with a clearly borked value.\n      start_addr = 0xDEADBEEF;\n      size = 16;\n      if (!memory.Allocate(size))\n        return false;\n\n      unsigned long long dummy_stack[2];  // Fill dummy stack with 16 bytes of\n                                          // junk.\n      dummy_stack[0] = 0xDEADBEEF;\n      dummy_stack[1] = 0xDEADBEEF;\n\n      result = memory.Copy(dummy_stack, size);\n  } else {\n\n    if (!memory.Allocate(size))\n      return false;\n\n    if (dynamic_images_) {\n      vector<uint8_t> stack_memory;\n      if (ReadTaskMemory(crashing_task_,\n                         start_addr,\n                         size,\n                         stack_memory) != KERN_SUCCESS) {\n        return false;\n      }\n\n      result = memory.Copy(&stack_memory[0], size);\n    } else {\n      result = memory.Copy(reinterpret_cast<const void *>(start_addr), size);\n    }\n  }\n\n  stack_location->start_of_memory_range = start_addr;\n  stack_location->memory = memory.location();\n\n  return result;\n}\n\nbool MinidumpGenerator::WriteStack(breakpad_thread_state_data_t state,\n                                   MDMemoryDescriptor *stack_location) {\n  switch (cpu_type_) {\n#ifdef HAS_ARM_SUPPORT\n    case CPU_TYPE_ARM:\n      return WriteStackARM(state, stack_location);\n#endif\n#ifdef HAS_PPC_SUPPORT\n    case CPU_TYPE_POWERPC:\n      return WriteStackPPC(state, stack_location);\n    case CPU_TYPE_POWERPC64:\n      return WriteStackPPC64(state, stack_location);\n#endif\n#ifdef HAS_X86_SUPPORT\n    case CPU_TYPE_I386:\n      return WriteStackX86(state, stack_location);\n    case CPU_TYPE_X86_64:\n      return WriteStackX86_64(state, stack_location);\n#endif\n    default:\n      return false;\n  }\n}\n\nbool MinidumpGenerator::WriteContext(breakpad_thread_state_data_t state,\n                                     MDLocationDescriptor *register_location) {\n  switch (cpu_type_) {\n#ifdef HAS_ARM_SUPPORT\n    case CPU_TYPE_ARM:\n      return WriteContextARM(state, register_location);\n#endif\n#ifdef HAS_PPC_SUPPORT\n    case CPU_TYPE_POWERPC:\n      return WriteContextPPC(state, register_location);\n    case CPU_TYPE_POWERPC64:\n      return WriteContextPPC64(state, register_location);\n#endif\n#ifdef HAS_X86_SUPPORT\n    case CPU_TYPE_I386:\n      return WriteContextX86(state, register_location);\n    case CPU_TYPE_X86_64:\n      return WriteContextX86_64(state, register_location);\n#endif\n    default:\n      return false;\n  }\n}\n\nu_int64_t MinidumpGenerator::CurrentPCForStack(\n    breakpad_thread_state_data_t state) {\n  switch (cpu_type_) {\n#ifdef HAS_ARM_SUPPORT\n    case CPU_TYPE_ARM:\n      return CurrentPCForStackARM(state);\n#endif\n#ifdef HAS_PPC_SUPPORT\n    case CPU_TYPE_POWERPC:\n      return CurrentPCForStackPPC(state);\n    case CPU_TYPE_POWERPC64:\n      return CurrentPCForStackPPC64(state);\n#endif\n#ifdef HAS_X86_SUPPORT\n    case CPU_TYPE_I386:\n      return CurrentPCForStackX86(state);\n    case CPU_TYPE_X86_64:\n      return CurrentPCForStackX86_64(state);\n#endif\n    default:\n      assert(\"Unknown CPU type!\");\n      return 0;\n  }\n}\n\n#ifdef HAS_ARM_SUPPORT\nbool MinidumpGenerator::WriteStackARM(breakpad_thread_state_data_t state,\n                                      MDMemoryDescriptor *stack_location) {\n  arm_thread_state_t *machine_state =\n      reinterpret_cast<arm_thread_state_t *>(state);\n  mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, sp);\n  return WriteStackFromStartAddress(start_addr, stack_location);\n}\n\nu_int64_t\nMinidumpGenerator::CurrentPCForStackARM(breakpad_thread_state_data_t state) {\n  arm_thread_state_t *machine_state =\n      reinterpret_cast<arm_thread_state_t *>(state);\n\n  return REGISTER_FROM_THREADSTATE(machine_state, pc);\n}\n\nbool MinidumpGenerator::WriteContextARM(breakpad_thread_state_data_t state,\n                                        MDLocationDescriptor *register_location)\n{\n  TypedMDRVA<MDRawContextARM> context(&writer_);\n  arm_thread_state_t *machine_state =\n      reinterpret_cast<arm_thread_state_t *>(state);\n\n  if (!context.Allocate())\n    return false;\n\n  *register_location = context.location();\n  MDRawContextARM *context_ptr = context.get();\n  context_ptr->context_flags = MD_CONTEXT_ARM_FULL;\n\n#define AddGPR(a) context_ptr->iregs[a] = REGISTER_FROM_THREADSTATE(machine_state, r[a])\n\n  context_ptr->iregs[13] = REGISTER_FROM_THREADSTATE(machine_state, sp);\n  context_ptr->iregs[14] = REGISTER_FROM_THREADSTATE(machine_state, lr);\n  context_ptr->iregs[15] = REGISTER_FROM_THREADSTATE(machine_state, pc);\n  context_ptr->cpsr = REGISTER_FROM_THREADSTATE(machine_state, cpsr);\n\n  AddGPR(0);\n  AddGPR(1);\n  AddGPR(2);\n  AddGPR(3);\n  AddGPR(4);\n  AddGPR(5);\n  AddGPR(6);\n  AddGPR(7);\n  AddGPR(8);\n  AddGPR(9);\n  AddGPR(10);\n  AddGPR(11);\n  AddGPR(12);\n#undef AddReg\n#undef AddGPR\n\n  return true;\n}\n#endif\n\n#ifdef HAS_PCC_SUPPORT\nbool MinidumpGenerator::WriteStackPPC(breakpad_thread_state_data_t state,\n                                      MDMemoryDescriptor *stack_location) {\n  ppc_thread_state_t *machine_state =\n      reinterpret_cast<ppc_thread_state_t *>(state);\n  mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, r1);\n  return WriteStackFromStartAddress(start_addr, stack_location);\n}\n\nbool MinidumpGenerator::WriteStackPPC64(breakpad_thread_state_data_t state,\n                                        MDMemoryDescriptor *stack_location) {\n  ppc_thread_state64_t *machine_state =\n      reinterpret_cast<ppc_thread_state64_t *>(state);\n  mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, r1);\n  return WriteStackFromStartAddress(start_addr, stack_location);\n}\n\nu_int64_t\nMinidumpGenerator::CurrentPCForStackPPC(breakpad_thread_state_data_t state) {\n  ppc_thread_state_t *machine_state =\n      reinterpret_cast<ppc_thread_state_t *>(state);\n\n  return REGISTER_FROM_THREADSTATE(machine_state, srr0);\n}\n\nu_int64_t\nMinidumpGenerator::CurrentPCForStackPPC64(breakpad_thread_state_data_t state) {\n  ppc_thread_state64_t *machine_state =\n      reinterpret_cast<ppc_thread_state64_t *>(state);\n\n  return REGISTER_FROM_THREADSTATE(machine_state, srr0);\n}\n\nbool MinidumpGenerator::WriteContextPPC(breakpad_thread_state_data_t state,\n                                        MDLocationDescriptor *register_location)\n{\n  TypedMDRVA<MDRawContextPPC> context(&writer_);\n  ppc_thread_state_t *machine_state =\n      reinterpret_cast<ppc_thread_state_t *>(state);\n\n  if (!context.Allocate())\n    return false;\n\n  *register_location = context.location();\n  MDRawContextPPC *context_ptr = context.get();\n  context_ptr->context_flags = MD_CONTEXT_PPC_BASE;\n\n#define AddReg(a) context_ptr->a = REGISTER_FROM_THREADSTATE(machine_state, a)\n#define AddGPR(a) context_ptr->gpr[a] = REGISTER_FROM_THREADSTATE(machine_state, r ## a)\n\n  AddReg(srr0);\n  AddReg(cr);\n  AddReg(xer);\n  AddReg(ctr);\n  AddReg(lr);\n  AddReg(vrsave);\n\n  AddGPR(0);\n  AddGPR(1);\n  AddGPR(2);\n  AddGPR(3);\n  AddGPR(4);\n  AddGPR(5);\n  AddGPR(6);\n  AddGPR(7);\n  AddGPR(8);\n  AddGPR(9);\n  AddGPR(10);\n  AddGPR(11);\n  AddGPR(12);\n  AddGPR(13);\n  AddGPR(14);\n  AddGPR(15);\n  AddGPR(16);\n  AddGPR(17);\n  AddGPR(18);\n  AddGPR(19);\n  AddGPR(20);\n  AddGPR(21);\n  AddGPR(22);\n  AddGPR(23);\n  AddGPR(24);\n  AddGPR(25);\n  AddGPR(26);\n  AddGPR(27);\n  AddGPR(28);\n  AddGPR(29);\n  AddGPR(30);\n  AddGPR(31);\n  AddReg(mq);\n#undef AddReg\n#undef AddGPR\n\n  return true;\n}\n\nbool MinidumpGenerator::WriteContextPPC64(\n    breakpad_thread_state_data_t state,\n    MDLocationDescriptor *register_location) {\n  TypedMDRVA<MDRawContextPPC64> context(&writer_);\n  ppc_thread_state64_t *machine_state =\n      reinterpret_cast<ppc_thread_state64_t *>(state);\n\n  if (!context.Allocate())\n    return false;\n\n  *register_location = context.location();\n  MDRawContextPPC64 *context_ptr = context.get();\n  context_ptr->context_flags = MD_CONTEXT_PPC_BASE;\n\n#define AddReg(a) context_ptr->a = REGISTER_FROM_THREADSTATE(machine_state, a)\n#define AddGPR(a) context_ptr->gpr[a] = REGISTER_FROM_THREADSTATE(machine_state, r ## a)\n\n  AddReg(srr0);\n  AddReg(cr);\n  AddReg(xer);\n  AddReg(ctr);\n  AddReg(lr);\n  AddReg(vrsave);\n\n  AddGPR(0);\n  AddGPR(1);\n  AddGPR(2);\n  AddGPR(3);\n  AddGPR(4);\n  AddGPR(5);\n  AddGPR(6);\n  AddGPR(7);\n  AddGPR(8);\n  AddGPR(9);\n  AddGPR(10);\n  AddGPR(11);\n  AddGPR(12);\n  AddGPR(13);\n  AddGPR(14);\n  AddGPR(15);\n  AddGPR(16);\n  AddGPR(17);\n  AddGPR(18);\n  AddGPR(19);\n  AddGPR(20);\n  AddGPR(21);\n  AddGPR(22);\n  AddGPR(23);\n  AddGPR(24);\n  AddGPR(25);\n  AddGPR(26);\n  AddGPR(27);\n  AddGPR(28);\n  AddGPR(29);\n  AddGPR(30);\n  AddGPR(31);\n#undef AddReg\n#undef AddGPR\n\n  return true;\n}\n\n#endif\n\n#ifdef HAS_X86_SUPPORT\nbool MinidumpGenerator::WriteStackX86(breakpad_thread_state_data_t state,\n                                   MDMemoryDescriptor *stack_location) {\n  i386_thread_state_t *machine_state =\n      reinterpret_cast<i386_thread_state_t *>(state);\n\n  mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, esp);\n  return WriteStackFromStartAddress(start_addr, stack_location);\n}\n\nbool MinidumpGenerator::WriteStackX86_64(breakpad_thread_state_data_t state,\n                                         MDMemoryDescriptor *stack_location) {\n  x86_thread_state64_t *machine_state =\n      reinterpret_cast<x86_thread_state64_t *>(state);\n\n  mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, rsp);\n  return WriteStackFromStartAddress(start_addr, stack_location);\n}\n\nu_int64_t\nMinidumpGenerator::CurrentPCForStackX86(breakpad_thread_state_data_t state) {\n  i386_thread_state_t *machine_state =\n      reinterpret_cast<i386_thread_state_t *>(state);\n\n  return REGISTER_FROM_THREADSTATE(machine_state, eip);\n}\n\nu_int64_t\nMinidumpGenerator::CurrentPCForStackX86_64(breakpad_thread_state_data_t state) {\n  x86_thread_state64_t *machine_state =\n      reinterpret_cast<x86_thread_state64_t *>(state);\n\n  return REGISTER_FROM_THREADSTATE(machine_state, rip);\n}\n\nbool MinidumpGenerator::WriteContextX86(breakpad_thread_state_data_t state,\n                                        MDLocationDescriptor *register_location)\n{\n  TypedMDRVA<MDRawContextX86> context(&writer_);\n  i386_thread_state_t *machine_state =\n      reinterpret_cast<i386_thread_state_t *>(state);\n\n  if (!context.Allocate())\n    return false;\n\n  *register_location = context.location();\n  MDRawContextX86 *context_ptr = context.get();\n\n#define AddReg(a) context_ptr->a = REGISTER_FROM_THREADSTATE(machine_state, a)\n\n  context_ptr->context_flags = MD_CONTEXT_X86;\n  AddReg(eax);\n  AddReg(ebx);\n  AddReg(ecx);\n  AddReg(edx);\n  AddReg(esi);\n  AddReg(edi);\n  AddReg(ebp);\n  AddReg(esp);\n\n  AddReg(cs);\n  AddReg(ds);\n  AddReg(ss);\n  AddReg(es);\n  AddReg(fs);\n  AddReg(gs);\n  AddReg(eflags);\n\n  AddReg(eip);\n#undef AddReg\n\n  return true;\n}\n\nbool MinidumpGenerator::WriteContextX86_64(\n    breakpad_thread_state_data_t state,\n    MDLocationDescriptor *register_location) {\n  TypedMDRVA<MDRawContextAMD64> context(&writer_);\n  x86_thread_state64_t *machine_state =\n      reinterpret_cast<x86_thread_state64_t *>(state);\n\n  if (!context.Allocate())\n    return false;\n\n  *register_location = context.location();\n  MDRawContextAMD64 *context_ptr = context.get();\n\n#define AddReg(a) context_ptr->a = REGISTER_FROM_THREADSTATE(machine_state, a)\n\n  context_ptr->context_flags = MD_CONTEXT_AMD64;\n  AddReg(rax);\n  AddReg(rbx);\n  AddReg(rcx);\n  AddReg(rdx);\n  AddReg(rdi);\n  AddReg(rsi);\n  AddReg(rbp);\n  AddReg(rsp);\n  AddReg(r8);\n  AddReg(r9);\n  AddReg(r10);\n  AddReg(r11);\n  AddReg(r12);\n  AddReg(r13);\n  AddReg(r14);\n  AddReg(r15);\n  AddReg(rip);\n  // according to AMD's software developer guide, bits above 18 are\n  // not used in the flags register.  Since the minidump format\n  // specifies 32 bits for the flags register, we can truncate safely\n  // with no loss.\n  context_ptr->eflags = static_cast<u_int32_t>(REGISTER_FROM_THREADSTATE(machine_state, rflags));\n  AddReg(cs);\n  AddReg(fs);\n  AddReg(gs);\n#undef AddReg\n\n  return true;\n}\n#endif\n\nbool MinidumpGenerator::GetThreadState(thread_act_t target_thread,\n                                       thread_state_t state,\n                                       mach_msg_type_number_t *count) {\n  thread_state_flavor_t flavor;\n  switch (cpu_type_) {\n#ifdef HAS_ARM_SUPPORT\n    case CPU_TYPE_ARM:\n      flavor = ARM_THREAD_STATE;\n      break;\n#endif\n#ifdef HAS_PPC_SUPPORT\n    case CPU_TYPE_POWERPC:\n      flavor = PPC_THREAD_STATE;\n      break;\n    case CPU_TYPE_POWERPC64:\n      flavor = PPC_THREAD_STATE64;\n      break;\n#endif\n#ifdef HAS_X86_SUPPORT\n    case CPU_TYPE_I386:\n      flavor = i386_THREAD_STATE;\n      break;\n    case CPU_TYPE_X86_64:\n      flavor = x86_THREAD_STATE64;\n      break;\n#endif\n    default:\n      return false;\n  }\n  return thread_get_state(target_thread, flavor,\n                          state, count) == KERN_SUCCESS;\n}\n\nbool MinidumpGenerator::WriteThreadStream(mach_port_t thread_id,\n                                          MDRawThread *thread) {\n  breakpad_thread_state_data_t state;\n  mach_msg_type_number_t state_count\n      = static_cast<mach_msg_type_number_t>(sizeof(state));\n\n  if (GetThreadState(thread_id, state, &state_count)) {\n    if (!WriteStack(state, &thread->stack))\n      return false;\n\n    memory_blocks_.push_back(thread->stack);\n\n    if (!WriteContext(state, &thread->thread_context))\n      return false;\n\n    thread->thread_id = thread_id;\n  } else {\n    return false;\n  }\n\n  return true;\n}\n\nbool MinidumpGenerator::WriteThreadListStream(\n    MDRawDirectory *thread_list_stream) {\n  TypedMDRVA<MDRawThreadList> list(&writer_);\n  thread_act_port_array_t threads_for_task;\n  mach_msg_type_number_t thread_count;\n  int non_generator_thread_count;\n\n  if (task_threads(crashing_task_, &threads_for_task, &thread_count))\n    return false;\n\n  // Don't include the generator thread\n  if (handler_thread_ != MACH_PORT_NULL)\n    non_generator_thread_count = thread_count - 1;\n  else\n    non_generator_thread_count = thread_count;\n  if (!list.AllocateObjectAndArray(non_generator_thread_count,\n                                   sizeof(MDRawThread)))\n    return false;\n\n  thread_list_stream->stream_type = MD_THREAD_LIST_STREAM;\n  thread_list_stream->location = list.location();\n\n  list.get()->number_of_threads = non_generator_thread_count;\n\n  MDRawThread thread;\n  int thread_idx = 0;\n\n  for (unsigned int i = 0; i < thread_count; ++i) {\n    memset(&thread, 0, sizeof(MDRawThread));\n\n    if (threads_for_task[i] != handler_thread_) {\n      if (!WriteThreadStream(threads_for_task[i], &thread))\n        return false;\n\n      list.CopyIndexAfterObject(thread_idx++, &thread, sizeof(MDRawThread));\n    }\n  }\n\n  return true;\n}\n\nbool MinidumpGenerator::WriteMemoryListStream(\n    MDRawDirectory *memory_list_stream) {\n  TypedMDRVA<MDRawMemoryList> list(&writer_);\n\n  // If the dump has an exception, include some memory around the\n  // instruction pointer.\n  const size_t kIPMemorySize = 256;  // bytes\n  bool have_ip_memory = false;\n  MDMemoryDescriptor ip_memory_d;\n  if (exception_thread_ && exception_type_) {\n    breakpad_thread_state_data_t state;\n    mach_msg_type_number_t stateCount\n      = static_cast<mach_msg_type_number_t>(sizeof(state));\n\n    if (thread_get_state(exception_thread_,\n                         BREAKPAD_MACHINE_THREAD_STATE,\n                         state,\n                         &stateCount) == KERN_SUCCESS) {\n      u_int64_t ip = CurrentPCForStack(state);\n      // Bound it to the upper and lower bounds of the region\n      // it's contained within. If it's not in a known memory region,\n      // don't bother trying to write it.\n      mach_vm_address_t addr = ip;\n      mach_vm_size_t size;\n      natural_t nesting_level = 0;\n      vm_region_submap_info_64 info;\n      mach_msg_type_number_t info_count = VM_REGION_SUBMAP_INFO_COUNT_64;\n\n      kern_return_t ret =\n        mach_vm_region_recurse(crashing_task_,\n                               &addr,\n                               &size,\n                               &nesting_level,\n                               (vm_region_recurse_info_t)&info,\n                               &info_count);\n      if (ret == KERN_SUCCESS && ip >= addr && ip < (addr + size)) {\n        // Try to get 128 bytes before and after the IP, but\n        // settle for whatever's available.\n        ip_memory_d.start_of_memory_range =\n          std::max(uintptr_t(addr),\n                   uintptr_t(ip - (kIPMemorySize / 2)));\n        uintptr_t end_of_range = \n          std::min(uintptr_t(ip + (kIPMemorySize / 2)),\n                   uintptr_t(addr + size));\n        ip_memory_d.memory.data_size =\n          end_of_range - ip_memory_d.start_of_memory_range;\n        have_ip_memory = true;\n        // This needs to get appended to the list even though\n        // the memory bytes aren't filled in yet so the entire\n        // list can be written first. The memory bytes will get filled\n        // in after the memory list is written.\n        memory_blocks_.push_back(ip_memory_d);\n      }\n    }\n  }\n\n  // Now fill in the memory list and write it.\n  unsigned memory_count = memory_blocks_.size();\n  if (!list.AllocateObjectAndArray(memory_count,\n                                   sizeof(MDMemoryDescriptor)))\n    return false;\n\n  memory_list_stream->stream_type = MD_MEMORY_LIST_STREAM;\n  memory_list_stream->location = list.location();\n\n  list.get()->number_of_memory_ranges = memory_count;\n\n  unsigned int i;\n  for (i = 0; i < memory_count; ++i) {\n    list.CopyIndexAfterObject(i, &memory_blocks_[i],\n                              sizeof(MDMemoryDescriptor));\n  }\n\n  if (have_ip_memory) {\n    // Now read the memory around the instruction pointer.\n    UntypedMDRVA ip_memory(&writer_);\n    if (!ip_memory.Allocate(ip_memory_d.memory.data_size))\n      return false;\n\n    if (dynamic_images_) {\n      // Out-of-process.\n      vector<uint8_t> memory;\n      if (ReadTaskMemory(crashing_task_,\n                         ip_memory_d.start_of_memory_range,\n                         ip_memory_d.memory.data_size,\n                         memory) != KERN_SUCCESS) {\n        return false;\n      }\n\n      ip_memory.Copy(&memory[0], ip_memory_d.memory.data_size);\n    } else {\n      // In-process, just copy from local memory.\n      ip_memory.Copy(\n        reinterpret_cast<const void *>(ip_memory_d.start_of_memory_range),\n        ip_memory_d.memory.data_size);\n    }\n\n    ip_memory_d.memory = ip_memory.location();\n    // Write this again now that the data location is filled in.\n    list.CopyIndexAfterObject(i - 1, &ip_memory_d,\n                              sizeof(MDMemoryDescriptor));\n  }\n\n  return true;\n}\n\nbool\nMinidumpGenerator::WriteExceptionStream(MDRawDirectory *exception_stream) {\n  TypedMDRVA<MDRawExceptionStream> exception(&writer_);\n\n  if (!exception.Allocate())\n    return false;\n\n  exception_stream->stream_type = MD_EXCEPTION_STREAM;\n  exception_stream->location = exception.location();\n  MDRawExceptionStream *exception_ptr = exception.get();\n  exception_ptr->thread_id = exception_thread_;\n\n  // This naming is confusing, but it is the proper translation from\n  // mach naming to minidump naming.\n  exception_ptr->exception_record.exception_code = exception_type_;\n  exception_ptr->exception_record.exception_flags = exception_code_;\n\n  breakpad_thread_state_data_t state;\n  mach_msg_type_number_t state_count\n      = static_cast<mach_msg_type_number_t>(sizeof(state));\n\n  if (!GetThreadState(exception_thread_, state, &state_count))\n    return false;\n\n  if (!WriteContext(state, &exception_ptr->thread_context))\n    return false;\n\n  if (exception_type_ == EXC_BAD_ACCESS)\n    exception_ptr->exception_record.exception_address = exception_subcode_;\n  else\n    exception_ptr->exception_record.exception_address = CurrentPCForStack(state);\n\n  return true;\n}\n\nbool MinidumpGenerator::WriteSystemInfoStream(\n    MDRawDirectory *system_info_stream) {\n  TypedMDRVA<MDRawSystemInfo> info(&writer_);\n\n  if (!info.Allocate())\n    return false;\n\n  system_info_stream->stream_type = MD_SYSTEM_INFO_STREAM;\n  system_info_stream->location = info.location();\n\n  // CPU Information\n  uint32_t number_of_processors;\n  size_t len = sizeof(number_of_processors);\n  sysctlbyname(\"hw.ncpu\", &number_of_processors, &len, NULL, 0);\n  MDRawSystemInfo *info_ptr = info.get();\n\n  switch (cpu_type_) {\n#ifdef HAS_ARM_SUPPORT\n    case CPU_TYPE_ARM:\n      info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_ARM;\n      break;\n#endif\n#ifdef HAS_PPC_SUPPORT\n    case CPU_TYPE_POWERPC:\n    case CPU_TYPE_POWERPC64:\n      info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_PPC;\n      break;\n#endif\n#ifdef HAS_X86_SUPPORT\n    case CPU_TYPE_I386:\n    case CPU_TYPE_X86_64:\n      if (cpu_type_ == CPU_TYPE_I386)\n        info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_X86;\n      else\n        info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_AMD64;\n#ifdef __i386__\n      // ebx is used for PIC code, so we need\n      // to preserve it.\n#define cpuid(op,eax,ebx,ecx,edx)      \\\n  asm (\"pushl %%ebx   \\n\\t\"            \\\n       \"cpuid         \\n\\t\"            \\\n       \"movl %%ebx,%1 \\n\\t\"            \\\n       \"popl %%ebx\"                    \\\n       : \"=a\" (eax),                   \\\n         \"=g\" (ebx),                   \\\n         \"=c\" (ecx),                   \\\n         \"=d\" (edx)                    \\\n       : \"0\" (op))\n#elif defined(__x86_64__)\n\n#define cpuid(op,eax,ebx,ecx,edx)      \\\n  asm (\"cpuid         \\n\\t\"            \\\n       : \"=a\" (eax),                   \\\n         \"=b\" (ebx),                   \\\n         \"=c\" (ecx),                   \\\n         \"=d\" (edx)                    \\\n       : \"0\" (op))\n#endif\n\n#if defined(__i386__) || defined(__x86_64__)\n      int unused, unused2;\n      // get vendor id\n      cpuid(0, unused, info_ptr->cpu.x86_cpu_info.vendor_id[0],\n            info_ptr->cpu.x86_cpu_info.vendor_id[2],\n            info_ptr->cpu.x86_cpu_info.vendor_id[1]);\n      // get version and feature info\n      cpuid(1, info_ptr->cpu.x86_cpu_info.version_information, unused, unused2,\n            info_ptr->cpu.x86_cpu_info.feature_information);\n\n      // family\n      info_ptr->processor_level =\n        (info_ptr->cpu.x86_cpu_info.version_information & 0xF00) >> 8;\n      // 0xMMSS (Model, Stepping)\n      info_ptr->processor_revision =\n        (info_ptr->cpu.x86_cpu_info.version_information & 0xF) |\n        ((info_ptr->cpu.x86_cpu_info.version_information & 0xF0) << 4);\n\n      // decode extended model info\n      if (info_ptr->processor_level == 0xF ||\n          info_ptr->processor_level == 0x6) {\n        info_ptr->processor_revision |=\n          ((info_ptr->cpu.x86_cpu_info.version_information & 0xF0000) >> 4);\n      }\n\n      // decode extended family info\n      if (info_ptr->processor_level == 0xF) {\n        info_ptr->processor_level +=\n          ((info_ptr->cpu.x86_cpu_info.version_information & 0xFF00000) >> 20);\n      }\n\n#endif  // __i386__ || __x86_64_\n      break;\n#endif  // HAS_X86_SUPPORT\n    default:\n      info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_UNKNOWN;\n      break;\n  }\n\n  info_ptr->number_of_processors = number_of_processors;\n#if TARGET_OS_IPHONE\n  info_ptr->platform_id = MD_OS_IOS;\n#else\n  info_ptr->platform_id = MD_OS_MAC_OS_X;\n#endif  // TARGET_OS_IPHONE\n\n  MDLocationDescriptor build_string_loc;\n\n  if (!writer_.WriteString(build_string_, 0,\n                           &build_string_loc))\n    return false;\n\n  info_ptr->csd_version_rva = build_string_loc.rva;\n  info_ptr->major_version = os_major_version_;\n  info_ptr->minor_version = os_minor_version_;\n  info_ptr->build_number = os_build_number_;\n\n  return true;\n}\n\nbool MinidumpGenerator::WriteModuleStream(unsigned int index,\n                                          MDRawModule *module) {\n  if (dynamic_images_) {\n    // we're in a different process than the crashed process\n    DynamicImage *image = dynamic_images_->GetImage(index);\n\n    if (!image)\n      return false;\n\n    memset(module, 0, sizeof(MDRawModule));\n\n    MDLocationDescriptor string_location;\n\n    string name = image->GetFilePath();\n    if (!writer_.WriteString(name.c_str(), 0, &string_location))\n      return false;\n\n    module->base_of_image = image->GetVMAddr() + image->GetVMAddrSlide();\n    module->size_of_image = static_cast<u_int32_t>(image->GetVMSize());\n    module->module_name_rva = string_location.rva;\n\n    // We'll skip the executable module, because they don't have\n    // LC_ID_DYLIB load commands, and the crash processing server gets\n    // version information from the Plist file, anyway.\n    if (index != (uint32_t)FindExecutableModule()) {\n      module->version_info.signature = MD_VSFIXEDFILEINFO_SIGNATURE;\n      module->version_info.struct_version |= MD_VSFIXEDFILEINFO_VERSION;\n      // Convert MAC dylib version format, which is a 32 bit number, to the\n      // format used by minidump.  The mac format is <16 bits>.<8 bits>.<8 bits>\n      // so it fits nicely into the windows version with some massaging\n      // The mapping is:\n      //    1) upper 16 bits of MAC version go to lower 16 bits of product HI\n      //    2) Next most significant 8 bits go to upper 16 bits of product LO\n      //    3) Least significant 8 bits go to lower 16 bits of product LO\n      uint32_t modVersion = image->GetVersion();\n      module->version_info.file_version_hi = 0;\n      module->version_info.file_version_hi = modVersion >> 16;\n      module->version_info.file_version_lo |= (modVersion & 0xff00)  << 8;\n      module->version_info.file_version_lo |= (modVersion & 0xff);\n    }\n\n    if (!WriteCVRecord(module, image->GetCPUType(), name.c_str(), false)) {\n      return false;\n    }\n  } else {\n    // Getting module info in the crashed process\n    const breakpad_mach_header *header;\n    header = (breakpad_mach_header*)_dyld_get_image_header(index);\n    if (!header)\n      return false;\n\n#ifdef __LP64__\n    assert(header->magic == MH_MAGIC_64);\n\n    if(header->magic != MH_MAGIC_64)\n      return false;\n#else\n    assert(header->magic == MH_MAGIC);\n\n    if(header->magic != MH_MAGIC)\n      return false;\n#endif\n\n    int cpu_type = header->cputype;\n    unsigned long slide = _dyld_get_image_vmaddr_slide(index);\n    const char* name = _dyld_get_image_name(index);\n    const struct load_command *cmd =\n        reinterpret_cast<const struct load_command *>(header + 1);\n\n    memset(module, 0, sizeof(MDRawModule));\n\n    for (unsigned int i = 0; cmd && (i < header->ncmds); i++) {\n      if (cmd->cmd == LC_SEGMENT_ARCH) {\n\n        const breakpad_mach_segment_command *seg =\n            reinterpret_cast<const breakpad_mach_segment_command *>(cmd);\n\n        if (!strcmp(seg->segname, \"__TEXT\")) {\n          MDLocationDescriptor string_location;\n\n          if (!writer_.WriteString(name, 0, &string_location))\n            return false;\n\n          module->base_of_image = seg->vmaddr + slide;\n          module->size_of_image = static_cast<u_int32_t>(seg->vmsize);\n          module->module_name_rva = string_location.rva;\n\n          bool in_memory = false;\n#if TARGET_OS_IPHONE\n          in_memory = true;\n#endif\n          if (!WriteCVRecord(module, cpu_type, name, in_memory))\n            return false;\n\n          return true;\n        }\n      }\n\n      cmd = reinterpret_cast<struct load_command*>((char *)cmd + cmd->cmdsize);\n    }\n  }\n\n  return true;\n}\n\nint MinidumpGenerator::FindExecutableModule() {\n  if (dynamic_images_) {\n    int index = dynamic_images_->GetExecutableImageIndex();\n\n    if (index >= 0) {\n      return index;\n    }\n  } else {\n    int image_count = _dyld_image_count();\n    const struct mach_header *header;\n\n    for (int index = 0; index < image_count; ++index) {\n      header = _dyld_get_image_header(index);\n\n      if (header->filetype == MH_EXECUTE)\n        return index;\n    }\n  }\n\n  // failed - just use the first image\n  return 0;\n}\n\nbool MinidumpGenerator::WriteCVRecord(MDRawModule *module, int cpu_type,\n                                      const char *module_path, bool in_memory) {\n  TypedMDRVA<MDCVInfoPDB70> cv(&writer_);\n\n  // Only return the last path component of the full module path\n  const char *module_name = strrchr(module_path, '/');\n\n  // Increment past the slash\n  if (module_name)\n    ++module_name;\n  else\n    module_name = \"<Unknown>\";\n\n  size_t module_name_length = strlen(module_name);\n\n  if (!cv.AllocateObjectAndArray(module_name_length + 1, sizeof(u_int8_t)))\n    return false;\n\n  if (!cv.CopyIndexAfterObject(0, module_name, module_name_length))\n    return false;\n\n  module->cv_record = cv.location();\n  MDCVInfoPDB70 *cv_ptr = cv.get();\n  cv_ptr->cv_signature = MD_CVINFOPDB70_SIGNATURE;\n  cv_ptr->age = 0;\n\n  // Get the module identifier\n  unsigned char identifier[16];\n  bool result = false;\n  if (in_memory) {\n    MacFileUtilities::MachoID macho(module_path,\n        reinterpret_cast<void *>(module->base_of_image),\n        static_cast<size_t>(module->size_of_image));\n    result = macho.UUIDCommand(cpu_type, identifier);\n    if (!result)\n      result = macho.MD5(cpu_type, identifier);\n  }\n\n  if (!result) {\n     FileID file_id(module_path);\n     result = file_id.MachoIdentifier(cpu_type, identifier);\n  }\n\n  if (result) {\n    cv_ptr->signature.data1 = (uint32_t)identifier[0] << 24 |\n      (uint32_t)identifier[1] << 16 | (uint32_t)identifier[2] << 8 |\n      (uint32_t)identifier[3];\n    cv_ptr->signature.data2 = (uint32_t)identifier[4] << 8 | identifier[5];\n    cv_ptr->signature.data3 = (uint32_t)identifier[6] << 8 | identifier[7];\n    cv_ptr->signature.data4[0] = identifier[8];\n    cv_ptr->signature.data4[1] = identifier[9];\n    cv_ptr->signature.data4[2] = identifier[10];\n    cv_ptr->signature.data4[3] = identifier[11];\n    cv_ptr->signature.data4[4] = identifier[12];\n    cv_ptr->signature.data4[5] = identifier[13];\n    cv_ptr->signature.data4[6] = identifier[14];\n    cv_ptr->signature.data4[7] = identifier[15];\n  }\n\n  return true;\n}\n\nbool MinidumpGenerator::WriteModuleListStream(\n    MDRawDirectory *module_list_stream) {\n  TypedMDRVA<MDRawModuleList> list(&writer_);\n\n  size_t image_count = dynamic_images_ ?\n      static_cast<size_t>(dynamic_images_->GetImageCount()) :\n      _dyld_image_count();\n\n  if (!list.AllocateObjectAndArray(image_count, MD_MODULE_SIZE))\n    return false;\n\n  module_list_stream->stream_type = MD_MODULE_LIST_STREAM;\n  module_list_stream->location = list.location();\n  list.get()->number_of_modules = image_count;\n\n  // Write out the executable module as the first one\n  MDRawModule module;\n  size_t executableIndex = FindExecutableModule();\n\n  if (!WriteModuleStream(executableIndex, &module)) {\n    return false;\n  }\n\n  list.CopyIndexAfterObject(0, &module, MD_MODULE_SIZE);\n  int destinationIndex = 1;  // Write all other modules after this one\n\n  for (size_t i = 0; i < image_count; ++i) {\n    if (i != executableIndex) {\n      if (!WriteModuleStream(i, &module)) {\n        return false;\n      }\n\n      list.CopyIndexAfterObject(destinationIndex++, &module, MD_MODULE_SIZE);\n    }\n  }\n\n  return true;\n}\n\nbool MinidumpGenerator::WriteMiscInfoStream(MDRawDirectory *misc_info_stream) {\n  TypedMDRVA<MDRawMiscInfo> info(&writer_);\n\n  if (!info.Allocate())\n    return false;\n\n  misc_info_stream->stream_type = MD_MISC_INFO_STREAM;\n  misc_info_stream->location = info.location();\n\n  MDRawMiscInfo *info_ptr = info.get();\n  info_ptr->size_of_info = static_cast<u_int32_t>(sizeof(MDRawMiscInfo));\n  info_ptr->flags1 = MD_MISCINFO_FLAGS1_PROCESS_ID |\n    MD_MISCINFO_FLAGS1_PROCESS_TIMES |\n    MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO;\n\n  // Process ID\n  info_ptr->process_id = getpid();\n\n  // Times\n  struct rusage usage;\n  if (getrusage(RUSAGE_SELF, &usage) != -1) {\n    // Omit the fractional time since the MDRawMiscInfo only wants seconds\n    info_ptr->process_user_time =\n        static_cast<u_int32_t>(usage.ru_utime.tv_sec);\n    info_ptr->process_kernel_time =\n        static_cast<u_int32_t>(usage.ru_stime.tv_sec);\n  }\n  int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID,\n                 static_cast<int>(info_ptr->process_id) };\n  u_int mibsize = static_cast<u_int>(sizeof(mib) / sizeof(mib[0]));\n  struct kinfo_proc proc;\n  size_t size = sizeof(proc);\n  if (sysctl(mib, mibsize, &proc, &size, NULL, 0) == 0) {\n    info_ptr->process_create_time =\n        static_cast<u_int32_t>(proc.kp_proc.p_starttime.tv_sec);\n  }\n\n  // Speed\n  uint64_t speed;\n  const uint64_t kOneMillion = 1000 * 1000;\n  size = sizeof(speed);\n  sysctlbyname(\"hw.cpufrequency_max\", &speed, &size, NULL, 0);\n  info_ptr->processor_max_mhz = static_cast<u_int32_t>(speed / kOneMillion);\n  info_ptr->processor_mhz_limit = static_cast<u_int32_t>(speed / kOneMillion);\n  size = sizeof(speed);\n  sysctlbyname(\"hw.cpufrequency\", &speed, &size, NULL, 0);\n  info_ptr->processor_current_mhz = static_cast<u_int32_t>(speed / kOneMillion);\n\n  return true;\n}\n\nbool MinidumpGenerator::WriteBreakpadInfoStream(\n    MDRawDirectory *breakpad_info_stream) {\n  TypedMDRVA<MDRawBreakpadInfo> info(&writer_);\n\n  if (!info.Allocate())\n    return false;\n\n  breakpad_info_stream->stream_type = MD_BREAKPAD_INFO_STREAM;\n  breakpad_info_stream->location = info.location();\n  MDRawBreakpadInfo *info_ptr = info.get();\n\n  if (exception_thread_ && exception_type_) {\n    info_ptr->validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID |\n                         MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID;\n    info_ptr->dump_thread_id = handler_thread_;\n    info_ptr->requesting_thread_id = exception_thread_;\n  } else {\n    info_ptr->validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID;\n    info_ptr->dump_thread_id = handler_thread_;\n    info_ptr->requesting_thread_id = 0;\n  }\n\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/minidump_generator.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// minidump_generator.h:  Create a minidump of the current MacOS process.\n\n#ifndef CLIENT_MAC_GENERATOR_MINIDUMP_GENERATOR_H__\n#define CLIENT_MAC_GENERATOR_MINIDUMP_GENERATOR_H__\n\n#include <mach/mach.h>\n#include <TargetConditionals.h>\n\n#include <string>\n\n#include \"client/minidump_file_writer.h\"\n#include \"common/memory.h\"\n#include \"common/mac/macho_utilities.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n\n#include \"dynamic_images.h\"\n#include \"mach_vm_compat.h\"\n\n#if !TARGET_OS_IPHONE && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7)\n  #define HAS_PPC_SUPPORT\n#endif\n#if defined(__arm__)\n  #define HAS_ARM_SUPPORT\n#elif defined(__i386__) || defined(__x86_64__)\n  #define HAS_X86_SUPPORT\n#endif\n\nnamespace google_breakpad {\n\nusing std::string;\n\n// Use the REGISTER_FROM_THREADSTATE to access a register name from the\n// breakpad_thread_state_t structure.\n#if __DARWIN_UNIX03 || TARGET_CPU_X86_64 || TARGET_CPU_PPC64 || TARGET_CPU_ARM\n// In The 10.5 SDK Headers Apple prepended __ to the variable names in the\n// i386_thread_state_t structure.  There's no good way to tell what version of\n// the SDK we're compiling against so we just toggle on the same preprocessor\n// symbol Apple's headers use.\n#define REGISTER_FROM_THREADSTATE(a, b) ((a)->__ ## b)\n#else\n#define REGISTER_FROM_THREADSTATE(a, b) (a->b)\n#endif\n\n// Creates a minidump file of the current process.  If there is exception data,\n// use SetExceptionInformation() to add this to the minidump.  The minidump\n// file is generated by the Write() function.\n// Usage:\n// MinidumpGenerator minidump();\n// minidump.Write(\"/tmp/minidump\");\n//\nclass MinidumpGenerator {\n public:\n  MinidumpGenerator();\n  MinidumpGenerator(mach_port_t crashing_task, mach_port_t handler_thread);\n\n  virtual ~MinidumpGenerator();\n\n  // Return <dir>/<unique_name>.dmp\n  // Sets |unique_name| (if requested) to the unique name for the minidump\n  static string UniqueNameInDirectory(const string &dir, string *unique_name);\n\n  // Write out the minidump into |path|\n  // All of the components of |path| must exist and be writable\n  // Return true if successful, false otherwise\n  bool Write(const char *path);\n\n  // Specify some exception information, if applicable\n  void SetExceptionInformation(int type, int code, int subcode,\n                               mach_port_t thread_name) {\n    exception_type_ = type;\n    exception_code_ = code;\n    exception_subcode_ = subcode;\n    exception_thread_ = thread_name;\n  }\n\n  // Gather system information.  This should be call at least once before using\n  // the MinidumpGenerator class.\n  static void GatherSystemInformation();\n\n protected:\n  // Overridable Stream writers\n  virtual bool WriteExceptionStream(MDRawDirectory *exception_stream);\n\n  // Overridable Helper\n  virtual bool WriteThreadStream(mach_port_t thread_id, MDRawThread *thread);\n\n private:\n  typedef bool (MinidumpGenerator::*WriteStreamFN)(MDRawDirectory *);\n\n  // Stream writers\n  bool WriteThreadListStream(MDRawDirectory *thread_list_stream);\n  bool WriteMemoryListStream(MDRawDirectory *memory_list_stream);\n  bool WriteSystemInfoStream(MDRawDirectory *system_info_stream);\n  bool WriteModuleListStream(MDRawDirectory *module_list_stream);\n  bool WriteMiscInfoStream(MDRawDirectory *misc_info_stream);\n  bool WriteBreakpadInfoStream(MDRawDirectory *breakpad_info_stream);\n\n  // Helpers\n  u_int64_t CurrentPCForStack(breakpad_thread_state_data_t state);\n  bool GetThreadState(thread_act_t target_thread, thread_state_t state,\n                      mach_msg_type_number_t *count);\n  bool WriteStackFromStartAddress(mach_vm_address_t start_addr,\n                                  MDMemoryDescriptor *stack_location);\n  bool WriteStack(breakpad_thread_state_data_t state,\n                  MDMemoryDescriptor *stack_location);\n  bool WriteContext(breakpad_thread_state_data_t state,\n                    MDLocationDescriptor *register_location);\n  bool WriteCVRecord(MDRawModule *module, int cpu_type,\n                     const char *module_path, bool in_memory);\n  bool WriteModuleStream(unsigned int index, MDRawModule *module);\n  size_t CalculateStackSize(mach_vm_address_t start_addr);\n  int  FindExecutableModule();\n\n  // Per-CPU implementations of these methods\n#ifdef HAS_ARM_SUPPORT\n  bool WriteStackARM(breakpad_thread_state_data_t state,\n                     MDMemoryDescriptor *stack_location);\n  bool WriteContextARM(breakpad_thread_state_data_t state,\n                       MDLocationDescriptor *register_location);\n  u_int64_t CurrentPCForStackARM(breakpad_thread_state_data_t state);\n#endif\n#ifdef HAS_PPC_SUPPORT\n  bool WriteStackPPC(breakpad_thread_state_data_t state,\n                     MDMemoryDescriptor *stack_location);\n  bool WriteContextPPC(breakpad_thread_state_data_t state,\n                       MDLocationDescriptor *register_location);\n  u_int64_t CurrentPCForStackPPC(breakpad_thread_state_data_t state);\n  bool WriteStackPPC64(breakpad_thread_state_data_t state,\n                       MDMemoryDescriptor *stack_location);\n  bool WriteContextPPC64(breakpad_thread_state_data_t state,\n                       MDLocationDescriptor *register_location);\n  u_int64_t CurrentPCForStackPPC64(breakpad_thread_state_data_t state);\n#endif\n#ifdef HAS_X86_SUPPORT\n  bool WriteStackX86(breakpad_thread_state_data_t state,\n                       MDMemoryDescriptor *stack_location);\n  bool WriteContextX86(breakpad_thread_state_data_t state,\n                       MDLocationDescriptor *register_location);\n  u_int64_t CurrentPCForStackX86(breakpad_thread_state_data_t state);\n  bool WriteStackX86_64(breakpad_thread_state_data_t state,\n                        MDMemoryDescriptor *stack_location);\n  bool WriteContextX86_64(breakpad_thread_state_data_t state,\n                          MDLocationDescriptor *register_location);\n  u_int64_t CurrentPCForStackX86_64(breakpad_thread_state_data_t state);\n#endif\n\n  // disallow copy ctor and operator=\n  explicit MinidumpGenerator(const MinidumpGenerator &);\n  void operator=(const MinidumpGenerator &);\n\n protected:\n  // Use this writer to put the data to disk\n  MinidumpFileWriter writer_;\n\n private:\n  // Exception information\n  int exception_type_;\n  int exception_code_;\n  int exception_subcode_;\n  mach_port_t exception_thread_;\n  mach_port_t crashing_task_;\n  mach_port_t handler_thread_;\n\n  // CPU type of the task being dumped.\n  cpu_type_t cpu_type_;\n  \n  // System information\n  static char build_string_[16];\n  static int os_major_version_;\n  static int os_minor_version_;\n  static int os_build_number_;\n  \n  // Information about dynamically loaded code\n  DynamicImages *dynamic_images_;\n\n  // PageAllocator makes it possible to allocate memory\n  // directly from the system, even while handling an exception.\n  mutable PageAllocator allocator_;\n\n protected:\n  // Blocks of memory written to the dump. These are all currently\n  // written while writing the thread list stream, but saved here\n  // so a memory list stream can be written afterwards.\n  wasteful_vector<MDMemoryDescriptor> memory_blocks_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_MAC_GENERATOR_MINIDUMP_GENERATOR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/minidump_test.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t8BFC813F11FF9A58002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; };\n\t\t8BFC814411FF9A9C002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; };\n\t\t8BFC814511FF9A9D002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; };\n\t\t8BFC814811FF9B13002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; };\n\t\t8BFC814911FF9B13002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; };\n\t\t8BFC814A11FF9B13002CB4DC /* libcrypto.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */; };\n\t\t8BFC814B11FF9B3F002CB4DC /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */; };\n\t\t8BFC814C11FF9B3F002CB4DC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */; };\n\t\t8BFC81A211FF9C2E002CB4DC /* CPlusTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC819211FF9C23002CB4DC /* CPlusTest.framework */; };\n\t\t8BFC81A311FF9C2F002CB4DC /* CPlusTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BFC819211FF9C23002CB4DC /* CPlusTest.framework */; };\n\t\t8BFC81AD11FF9C8A002CB4DC /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; };\n\t\t8BFC81AE11FF9C8C002CB4DC /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; };\n\t\t8BFC81AF11FF9C8C002CB4DC /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; };\n\t\t8BFC81B011FF9C8D002CB4DC /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; };\n\t\t9B35FF5A0B267D5F008DE8C7 /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF560B267D5F008DE8C7 /* convert_UTF.c */; };\n\t\t9B35FF5B0B267D5F008DE8C7 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF580B267D5F008DE8C7 /* string_conversion.cc */; };\n\t\t9B37CEEC0AF98ECD00FA4BD4 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B37CEEB0AF98ECD00FA4BD4 /* CoreFoundation.framework */; };\n\t\t9B7CA7700B12873A00CD3A1D /* minidump_file_writer-inl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BE3C01E0B0CE329009892DF /* minidump_file_writer-inl.h */; };\n\t\t9B7CA8540B12989000CD3A1D /* minidump_file_writer_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B7CA8530B12989000CD3A1D /* minidump_file_writer_unittest.cc */; };\n\t\t9B7CA8550B1298A100CD3A1D /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C230B01344C0055103E /* minidump_file_writer.cc */; };\n\t\t9BC1D2940B336F2300F2A2B4 /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF560B267D5F008DE8C7 /* convert_UTF.c */; };\n\t\t9BC1D2950B336F2500F2A2B4 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF580B267D5F008DE8C7 /* string_conversion.cc */; };\n\t\t9BD82AC10B0029DF0055103E /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9B37CEEB0AF98ECD00FA4BD4 /* CoreFoundation.framework */; };\n\t\t9BD82BFF0B01333D0055103E /* exception_handler_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82BFD0B01333D0055103E /* exception_handler_test.cc */; };\n\t\t9BD82C020B01333D0055103E /* minidump_generator_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82BFE0B01333D0055103E /* minidump_generator_test.cc */; };\n\t\t9BD82C0D0B0133520055103E /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C090B0133520055103E /* exception_handler.cc */; };\n\t\t9BD82C0E0B0133520055103E /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C0B0B0133520055103E /* minidump_generator.cc */; };\n\t\t9BD82C0F0B0133520055103E /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C090B0133520055103E /* exception_handler.cc */; };\n\t\t9BD82C100B0133520055103E /* exception_handler.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BD82C0A0B0133520055103E /* exception_handler.h */; };\n\t\t9BD82C110B0133520055103E /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C0B0B0133520055103E /* minidump_generator.cc */; };\n\t\t9BD82C120B0133520055103E /* minidump_generator.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BD82C0C0B0133520055103E /* minidump_generator.h */; };\n\t\t9BD82C250B01344C0055103E /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C230B01344C0055103E /* minidump_file_writer.cc */; };\n\t\t9BD82C260B01344C0055103E /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C230B01344C0055103E /* minidump_file_writer.cc */; };\n\t\t9BD82C270B01344C0055103E /* minidump_file_writer.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BD82C240B01344C0055103E /* minidump_file_writer.h */; };\n\t\t9BD82C2D0B01345E0055103E /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C2B0B01345E0055103E /* string_utilities.cc */; };\n\t\t9BD82C2E0B01345E0055103E /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9BD82C2B0B01345E0055103E /* string_utilities.cc */; };\n\t\t9BD82C2F0B01345E0055103E /* string_utilities.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9BD82C2C0B01345E0055103E /* string_utilities.h */; };\n\t\tD2F651000BEF947200920385 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FA0BEF947200920385 /* file_id.cc */; };\n\t\tD2F651010BEF947200920385 /* file_id.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = D2F650FB0BEF947200920385 /* file_id.h */; };\n\t\tD2F651020BEF947200920385 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FC0BEF947200920385 /* macho_id.cc */; };\n\t\tD2F651030BEF947200920385 /* macho_id.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = D2F650FD0BEF947200920385 /* macho_id.h */; };\n\t\tD2F651040BEF947200920385 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FE0BEF947200920385 /* macho_utilities.cc */; };\n\t\tD2F651050BEF947200920385 /* macho_utilities.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = D2F650FF0BEF947200920385 /* macho_utilities.h */; };\n\t\tD2F651090BEF949A00920385 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F651070BEF949A00920385 /* dynamic_images.cc */; };\n\t\tD2F6510A0BEF949A00920385 /* dynamic_images.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = D2F651080BEF949A00920385 /* dynamic_images.h */; };\n\t\tD2F6510E0BEF94EB00920385 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F6510C0BEF94EB00920385 /* macho_walker.cc */; };\n\t\tD2F6510F0BEF94EB00920385 /* macho_walker.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = D2F6510D0BEF94EB00920385 /* macho_walker.h */; };\n\t\tD2F651110BEF951700920385 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF580B267D5F008DE8C7 /* string_conversion.cc */; };\n\t\tD2F651130BEF951C00920385 /* string_conversion.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9B35FF590B267D5F008DE8C7 /* string_conversion.h */; };\n\t\tD2F651150BEF953000920385 /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = 9B35FF560B267D5F008DE8C7 /* convert_UTF.c */; };\n\t\tD2F651160BEF953100920385 /* convert_UTF.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9B35FF570B267D5F008DE8C7 /* convert_UTF.h */; };\n\t\tD2F6511B0BEF970E00920385 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F651070BEF949A00920385 /* dynamic_images.cc */; };\n\t\tD2F6511D0BEF973500920385 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FA0BEF947200920385 /* file_id.cc */; };\n\t\tD2F6511E0BEF973600920385 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FC0BEF947200920385 /* macho_id.cc */; };\n\t\tD2F6511F0BEF973900920385 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FE0BEF947200920385 /* macho_utilities.cc */; };\n\t\tD2F651210BEF975400920385 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F6510C0BEF94EB00920385 /* macho_walker.cc */; };\n\t\tF93A887D0E8B4C8C0026AF89 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F6510C0BEF94EB00920385 /* macho_walker.cc */; };\n\t\tF93A887E0E8B4C8C0026AF89 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FC0BEF947200920385 /* macho_id.cc */; };\n\t\tF93A887F0E8B4C8C0026AF89 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FE0BEF947200920385 /* macho_utilities.cc */; };\n\t\tF93A88800E8B4C8C0026AF89 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F650FA0BEF947200920385 /* file_id.cc */; };\n\t\tF93A88860E8B4C9A0026AF89 /* dwarftests.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9721F310E8B07E800D7E813 /* dwarftests.mm */; };\n\t\tF93A88870E8B4C9A0026AF89 /* dump_syms.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9721F390E8B0D0D00D7E813 /* dump_syms.mm */; };\n\t\tF93A88880E8B4C9A0026AF89 /* bytereader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9721F760E8B0DC700D7E813 /* bytereader.cc */; };\n\t\tF93A88890E8B4C9A0026AF89 /* dwarf2reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9721F770E8B0DC700D7E813 /* dwarf2reader.cc */; };\n\t\tF93A888A0E8B4C9A0026AF89 /* functioninfo.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9721F780E8B0DC700D7E813 /* functioninfo.cc */; };\n\t\tF93A888B0E8B4C9A0026AF89 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9721FA80E8B0E4800D7E813 /* md5.cc */; };\n\t\tF9721F6C0E8B0D7000D7E813 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */; };\n\t\tF9721FA20E8B0E2300D7E813 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */; };\n\t\tF982089C0DB3280D0017AECA /* breakpad_nlist_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = F982089B0DB3280D0017AECA /* breakpad_nlist_test.cc */; };\n\t\tF98208A30DB32CAE0017AECA /* breakpad_nlist_64.cc in Sources */ = {isa = PBXBuildFile; fileRef = F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */; };\n\t\tF9AE5B390DBFDBDB00505983 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F651070BEF949A00920385 /* dynamic_images.cc */; };\n\t\tF9AE5B3A0DBFDBDB00505983 /* DynamicImagesTests.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9C5A4210DB82DD800209C76 /* DynamicImagesTests.cc */; };\n\t\tF9B34E870DBC1E1600306484 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F651070BEF949A00920385 /* dynamic_images.cc */; };\n\t\tF9C5A4220DB82DD800209C76 /* DynamicImagesTests.cc in Sources */ = {isa = PBXBuildFile; fileRef = F9C5A4210DB82DD800209C76 /* DynamicImagesTests.cc */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t8DD76F690486A84900D96B5E /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 8;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t\t9BD82C100B0133520055103E /* exception_handler.h in CopyFiles */,\n\t\t\t\t9BD82C120B0133520055103E /* minidump_generator.h in CopyFiles */,\n\t\t\t\t9BD82C270B01344C0055103E /* minidump_file_writer.h in CopyFiles */,\n\t\t\t\t9BD82C2F0B01345E0055103E /* string_utilities.h in CopyFiles */,\n\t\t\t\t9B7CA7700B12873A00CD3A1D /* minidump_file_writer-inl.h in CopyFiles */,\n\t\t\t\tD2F651010BEF947200920385 /* file_id.h in CopyFiles */,\n\t\t\t\tD2F651030BEF947200920385 /* macho_id.h in CopyFiles */,\n\t\t\t\tD2F651050BEF947200920385 /* macho_utilities.h in CopyFiles */,\n\t\t\t\tD2F6510A0BEF949A00920385 /* dynamic_images.h in CopyFiles */,\n\t\t\t\tD2F6510F0BEF94EB00920385 /* macho_walker.h in CopyFiles */,\n\t\t\t\tD2F651130BEF951C00920385 /* string_conversion.h in CopyFiles */,\n\t\t\t\tD2F651160BEF953100920385 /* convert_UTF.h in CopyFiles */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t8BFC812011FF99D5002CB4DC /* Breakpad.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Breakpad.xcconfig; path = ../../../common/mac/Breakpad.xcconfig; sourceTree = SOURCE_ROOT; };\n\t\t8BFC812111FF99D5002CB4DC /* BreakpadDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadDebug.xcconfig; path = ../../../common/mac/BreakpadDebug.xcconfig; sourceTree = SOURCE_ROOT; };\n\t\t8BFC812211FF99D5002CB4DC /* BreakpadRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadRelease.xcconfig; path = ../../../common/mac/BreakpadRelease.xcconfig; sourceTree = SOURCE_ROOT; };\n\t\t8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.dylib\"; name = libcrypto.dylib; path = usr/lib/libcrypto.dylib; sourceTree = SDKROOT; };\n\t\t8BFC815411FF9B7F002CB4DC /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };\n\t\t8BFC819211FF9C23002CB4DC /* CPlusTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CPlusTest.framework; path = Library/Frameworks/CPlusTest.framework; sourceTree = DEVELOPER_DIR; };\n\t\t8DD76F6C0486A84900D96B5E /* generator_test */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = generator_test; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9B35FF560B267D5F008DE8C7 /* convert_UTF.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = convert_UTF.c; path = ../../../common/convert_UTF.c; sourceTree = SOURCE_ROOT; };\n\t\t9B35FF570B267D5F008DE8C7 /* convert_UTF.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = convert_UTF.h; path = ../../../common/convert_UTF.h; sourceTree = SOURCE_ROOT; };\n\t\t9B35FF580B267D5F008DE8C7 /* string_conversion.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = string_conversion.cc; path = ../../../common/string_conversion.cc; sourceTree = SOURCE_ROOT; };\n\t\t9B35FF590B267D5F008DE8C7 /* string_conversion.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = string_conversion.h; path = ../../../common/string_conversion.h; sourceTree = SOURCE_ROOT; };\n\t\t9B37CEEB0AF98ECD00FA4BD4 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };\n\t\t9B7CA84E0B1297F200CD3A1D /* unit_test */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = unit_test; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9B7CA8530B12989000CD3A1D /* minidump_file_writer_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_file_writer_unittest.cc; path = ../../minidump_file_writer_unittest.cc; sourceTree = \"<group>\"; };\n\t\t9BD82A9B0B00267E0055103E /* handler_test */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = handler_test; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9BD82BFD0B01333D0055103E /* exception_handler_test.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = exception_handler_test.cc; sourceTree = SOURCE_ROOT; };\n\t\t9BD82BFE0B01333D0055103E /* minidump_generator_test.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = minidump_generator_test.cc; sourceTree = SOURCE_ROOT; };\n\t\t9BD82C090B0133520055103E /* exception_handler.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = exception_handler.cc; sourceTree = SOURCE_ROOT; };\n\t\t9BD82C0A0B0133520055103E /* exception_handler.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = exception_handler.h; sourceTree = SOURCE_ROOT; };\n\t\t9BD82C0B0B0133520055103E /* minidump_generator.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = minidump_generator.cc; sourceTree = SOURCE_ROOT; };\n\t\t9BD82C0C0B0133520055103E /* minidump_generator.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = minidump_generator.h; sourceTree = SOURCE_ROOT; };\n\t\t9BD82C230B01344C0055103E /* minidump_file_writer.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_file_writer.cc; path = ../../minidump_file_writer.cc; sourceTree = SOURCE_ROOT; };\n\t\t9BD82C240B01344C0055103E /* minidump_file_writer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = minidump_file_writer.h; path = ../../minidump_file_writer.h; sourceTree = SOURCE_ROOT; };\n\t\t9BD82C2B0B01345E0055103E /* string_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = string_utilities.cc; path = ../../../common/mac/string_utilities.cc; sourceTree = SOURCE_ROOT; };\n\t\t9BD82C2C0B01345E0055103E /* string_utilities.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = string_utilities.h; path = ../../../common/mac/string_utilities.h; sourceTree = SOURCE_ROOT; };\n\t\t9BE3C01E0B0CE329009892DF /* minidump_file_writer-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = \"minidump_file_writer-inl.h\"; path = \"../../minidump_file_writer-inl.h\"; sourceTree = SOURCE_ROOT; };\n\t\tD2F650FA0BEF947200920385 /* file_id.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = file_id.cc; path = ../../../common/mac/file_id.cc; sourceTree = SOURCE_ROOT; };\n\t\tD2F650FB0BEF947200920385 /* file_id.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = file_id.h; path = ../../../common/mac/file_id.h; sourceTree = SOURCE_ROOT; };\n\t\tD2F650FC0BEF947200920385 /* macho_id.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_id.cc; path = ../../../common/mac/macho_id.cc; sourceTree = SOURCE_ROOT; };\n\t\tD2F650FD0BEF947200920385 /* macho_id.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_id.h; path = ../../../common/mac/macho_id.h; sourceTree = SOURCE_ROOT; };\n\t\tD2F650FE0BEF947200920385 /* macho_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_utilities.cc; path = ../../../common/mac/macho_utilities.cc; sourceTree = SOURCE_ROOT; };\n\t\tD2F650FF0BEF947200920385 /* macho_utilities.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_utilities.h; path = ../../../common/mac/macho_utilities.h; sourceTree = SOURCE_ROOT; };\n\t\tD2F651070BEF949A00920385 /* dynamic_images.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = dynamic_images.cc; sourceTree = \"<group>\"; };\n\t\tD2F651080BEF949A00920385 /* dynamic_images.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = dynamic_images.h; sourceTree = \"<group>\"; };\n\t\tD2F6510C0BEF94EB00920385 /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_walker.cc; path = ../../../common/mac/macho_walker.cc; sourceTree = SOURCE_ROOT; };\n\t\tD2F6510D0BEF94EB00920385 /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../../common/mac/macho_walker.h; sourceTree = SOURCE_ROOT; };\n\t\tF917C4F70E03265A00F86017 /* breakpad_exc_server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = breakpad_exc_server.c; sourceTree = \"<group>\"; };\n\t\tF917C4F80E03265A00F86017 /* breakpad_exc_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_exc_server.h; sourceTree = \"<group>\"; };\n\t\tF93A88750E8B4C700026AF89 /* octestcases.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = octestcases.octest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF93A88760E8B4C700026AF89 /* obj-cTestCases-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"obj-cTestCases-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tF9721F300E8B07E800D7E813 /* dwarftests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dwarftests.h; sourceTree = \"<group>\"; };\n\t\tF9721F310E8B07E800D7E813 /* dwarftests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = dwarftests.mm; sourceTree = \"<group>\"; };\n\t\tF9721F380E8B0CFC00D7E813 /* dump_syms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dump_syms.h; path = ../../../common/mac/dump_syms.h; sourceTree = SOURCE_ROOT; };\n\t\tF9721F390E8B0D0D00D7E813 /* dump_syms.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = dump_syms.mm; path = ../../../common/mac/dump_syms.mm; sourceTree = SOURCE_ROOT; };\n\t\tF9721F6B0E8B0D7000D7E813 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };\n\t\tF9721F760E8B0DC700D7E813 /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; };\n\t\tF9721F770E8B0DC700D7E813 /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/dwarf/dwarf2reader.cc; sourceTree = SOURCE_ROOT; };\n\t\tF9721F780E8B0DC700D7E813 /* functioninfo.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = functioninfo.cc; path = ../../../common/dwarf/functioninfo.cc; sourceTree = SOURCE_ROOT; };\n\t\tF9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; };\n\t\tF9721FA80E8B0E4800D7E813 /* md5.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = md5.cc; path = ../../../common/md5.cc; sourceTree = SOURCE_ROOT; };\n\t\tF982089A0DB3280D0017AECA /* breakpad_nlist_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_nlist_test.h; sourceTree = \"<group>\"; };\n\t\tF982089B0DB3280D0017AECA /* breakpad_nlist_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_test.cc; sourceTree = \"<group>\"; };\n\t\tF98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_64.cc; sourceTree = \"<group>\"; };\n\t\tF98208A20DB32CAE0017AECA /* breakpad_nlist_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_nlist_64.h; sourceTree = \"<group>\"; };\n\t\tF9AE19B50DB040E300C98454 /* minidump_tests32-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"minidump_tests32-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tF9AE19C30DB04A9500C98454 /* minidump_tests64.cptest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = minidump_tests64.cptest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF9AE5B330DBFDBA300505983 /* minidump_tests32.cptest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = minidump_tests32.cptest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF9AE5B340DBFDBA300505983 /* minidump_tests64-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"minidump_tests64-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tF9C5A4200DB82DD800209C76 /* DynamicImagesTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicImagesTests.h; sourceTree = \"<group>\"; };\n\t\tF9C5A4210DB82DD800209C76 /* DynamicImagesTests.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DynamicImagesTests.cc; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t8DD76F660486A84900D96B5E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9B37CEEC0AF98ECD00FA4BD4 /* CoreFoundation.framework in Frameworks */,\n\t\t\t\t8BFC813F11FF9A58002CB4DC /* libcrypto.dylib in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9B7CA84C0B1297F200CD3A1D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8BFC814511FF9A9D002CB4DC /* libcrypto.dylib in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9BD82A990B00267E0055103E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9BD82AC10B0029DF0055103E /* CoreFoundation.framework in Frameworks */,\n\t\t\t\t8BFC814411FF9A9C002CB4DC /* libcrypto.dylib in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF93A88720E8B4C700026AF89 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8BFC814A11FF9B13002CB4DC /* libcrypto.dylib in Frameworks */,\n\t\t\t\t8BFC814B11FF9B3F002CB4DC /* SenTestingKit.framework in Frameworks */,\n\t\t\t\t8BFC814C11FF9B3F002CB4DC /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF9AE19C00DB04A9500C98454 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8BFC814811FF9B13002CB4DC /* libcrypto.dylib in Frameworks */,\n\t\t\t\t8BFC81A211FF9C2E002CB4DC /* CPlusTest.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF9AE5B300DBFDBA300505983 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF9721F6C0E8B0D7000D7E813 /* Cocoa.framework in Frameworks */,\n\t\t\t\tF9721FA20E8B0E2300D7E813 /* SenTestingKit.framework in Frameworks */,\n\t\t\t\t8BFC814911FF9B13002CB4DC /* libcrypto.dylib in Frameworks */,\n\t\t\t\t8BFC81A311FF9C2F002CB4DC /* CPlusTest.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t08FB7794FE84155DC02AAC07 /* MinidumpWriter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8BFC812011FF99D5002CB4DC /* Breakpad.xcconfig */,\n\t\t\t\t8BFC812111FF99D5002CB4DC /* BreakpadDebug.xcconfig */,\n\t\t\t\t8BFC812211FF99D5002CB4DC /* BreakpadRelease.xcconfig */,\n\t\t\t\tF9721FA80E8B0E4800D7E813 /* md5.cc */,\n\t\t\t\tF9721F760E8B0DC700D7E813 /* bytereader.cc */,\n\t\t\t\tF9721F770E8B0DC700D7E813 /* dwarf2reader.cc */,\n\t\t\t\tF9721F780E8B0DC700D7E813 /* functioninfo.cc */,\n\t\t\t\tF9721F390E8B0D0D00D7E813 /* dump_syms.mm */,\n\t\t\t\tF9721F380E8B0CFC00D7E813 /* dump_syms.h */,\n\t\t\t\tF917C4F70E03265A00F86017 /* breakpad_exc_server.c */,\n\t\t\t\tF917C4F80E03265A00F86017 /* breakpad_exc_server.h */,\n\t\t\t\tF98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */,\n\t\t\t\tF98208A20DB32CAE0017AECA /* breakpad_nlist_64.h */,\n\t\t\t\tD2F6510C0BEF94EB00920385 /* macho_walker.cc */,\n\t\t\t\tD2F6510D0BEF94EB00920385 /* macho_walker.h */,\n\t\t\t\tD2F651070BEF949A00920385 /* dynamic_images.cc */,\n\t\t\t\tD2F651080BEF949A00920385 /* dynamic_images.h */,\n\t\t\t\tD2F650FA0BEF947200920385 /* file_id.cc */,\n\t\t\t\tD2F650FB0BEF947200920385 /* file_id.h */,\n\t\t\t\tD2F650FC0BEF947200920385 /* macho_id.cc */,\n\t\t\t\tD2F650FD0BEF947200920385 /* macho_id.h */,\n\t\t\t\tD2F650FE0BEF947200920385 /* macho_utilities.cc */,\n\t\t\t\tD2F650FF0BEF947200920385 /* macho_utilities.h */,\n\t\t\t\tF9C5A41F0DB82DB000209C76 /* testcases */,\n\t\t\t\t9BD82C040B0133420055103E /* Breakpad */,\n\t\t\t\t08FB7795FE84155DC02AAC07 /* Source */,\n\t\t\t\t9B37CEEA0AF98EB600FA4BD4 /* Frameworks */,\n\t\t\t\t1AB674ADFE9D54B511CA2CBB /* Products */,\n\t\t\t\tF9AE19B50DB040E300C98454 /* minidump_tests32-Info.plist */,\n\t\t\t\tF9AE5B340DBFDBA300505983 /* minidump_tests64-Info.plist */,\n\t\t\t\tF93A88760E8B4C700026AF89 /* obj-cTestCases-Info.plist */,\n\t\t\t);\n\t\t\tname = MinidumpWriter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB7795FE84155DC02AAC07 /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9BD82BFD0B01333D0055103E /* exception_handler_test.cc */,\n\t\t\t\t9BD82BFE0B01333D0055103E /* minidump_generator_test.cc */,\n\t\t\t\t9B7CA8530B12989000CD3A1D /* minidump_file_writer_unittest.cc */,\n\t\t\t);\n\t\t\tname = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1AB674ADFE9D54B511CA2CBB /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8DD76F6C0486A84900D96B5E /* generator_test */,\n\t\t\t\t9BD82A9B0B00267E0055103E /* handler_test */,\n\t\t\t\t9B7CA84E0B1297F200CD3A1D /* unit_test */,\n\t\t\t\tF9AE19C30DB04A9500C98454 /* minidump_tests64.cptest */,\n\t\t\t\tF9AE5B330DBFDBA300505983 /* minidump_tests32.cptest */,\n\t\t\t\tF93A88750E8B4C700026AF89 /* octestcases.octest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9B37CEEA0AF98EB600FA4BD4 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8BFC813E11FF9A58002CB4DC /* libcrypto.dylib */,\n\t\t\t\t8BFC815411FF9B7F002CB4DC /* Carbon.framework */,\n\t\t\t\tF9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */,\n\t\t\t\tF9721F6B0E8B0D7000D7E813 /* Cocoa.framework */,\n\t\t\t\t9B37CEEB0AF98ECD00FA4BD4 /* CoreFoundation.framework */,\n\t\t\t\t8BFC819211FF9C23002CB4DC /* CPlusTest.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9BD82C040B0133420055103E /* Breakpad */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B35FF560B267D5F008DE8C7 /* convert_UTF.c */,\n\t\t\t\t9B35FF570B267D5F008DE8C7 /* convert_UTF.h */,\n\t\t\t\t9B35FF580B267D5F008DE8C7 /* string_conversion.cc */,\n\t\t\t\t9B35FF590B267D5F008DE8C7 /* string_conversion.h */,\n\t\t\t\t9BD82C090B0133520055103E /* exception_handler.cc */,\n\t\t\t\t9BD82C0A0B0133520055103E /* exception_handler.h */,\n\t\t\t\t9BD82C0B0B0133520055103E /* minidump_generator.cc */,\n\t\t\t\t9BD82C0C0B0133520055103E /* minidump_generator.h */,\n\t\t\t\t9BD82C230B01344C0055103E /* minidump_file_writer.cc */,\n\t\t\t\t9BE3C01E0B0CE329009892DF /* minidump_file_writer-inl.h */,\n\t\t\t\t9BD82C240B01344C0055103E /* minidump_file_writer.h */,\n\t\t\t\t9BD82C2B0B01345E0055103E /* string_utilities.cc */,\n\t\t\t\t9BD82C2C0B01345E0055103E /* string_utilities.h */,\n\t\t\t);\n\t\t\tname = Breakpad;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF9C5A41F0DB82DB000209C76 /* testcases */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF982089A0DB3280D0017AECA /* breakpad_nlist_test.h */,\n\t\t\t\tF982089B0DB3280D0017AECA /* breakpad_nlist_test.cc */,\n\t\t\t\tF9C5A4200DB82DD800209C76 /* DynamicImagesTests.h */,\n\t\t\t\tF9C5A4210DB82DD800209C76 /* DynamicImagesTests.cc */,\n\t\t\t\tF9721F300E8B07E800D7E813 /* dwarftests.h */,\n\t\t\t\tF9721F310E8B07E800D7E813 /* dwarftests.mm */,\n\t\t\t);\n\t\t\tpath = testcases;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t8DD76F620486A84900D96B5E /* generator_test */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget \"generator_test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8DD76F640486A84900D96B5E /* Sources */,\n\t\t\t\t8DD76F660486A84900D96B5E /* Frameworks */,\n\t\t\t\t8DD76F690486A84900D96B5E /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = generator_test;\n\t\t\tproductInstallPath = \"$(HOME)/bin\";\n\t\t\tproductName = MinidumpWriter;\n\t\t\tproductReference = 8DD76F6C0486A84900D96B5E /* generator_test */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t9B7CA84D0B1297F200CD3A1D /* unit_test */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 9B7CA8500B12984300CD3A1D /* Build configuration list for PBXNativeTarget \"unit_test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9B7CA84B0B1297F200CD3A1D /* Sources */,\n\t\t\t\t9B7CA84C0B1297F200CD3A1D /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = unit_test;\n\t\t\tproductName = \"filewriter unit test\";\n\t\t\tproductReference = 9B7CA84E0B1297F200CD3A1D /* unit_test */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t9BD82A9A0B00267E0055103E /* handler_test */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 9BD82AA60B0026BF0055103E /* Build configuration list for PBXNativeTarget \"handler_test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9BD82A980B00267E0055103E /* Sources */,\n\t\t\t\t9BD82A990B00267E0055103E /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = handler_test;\n\t\t\tproductName = ExceptionTester;\n\t\t\tproductReference = 9BD82A9B0B00267E0055103E /* handler_test */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\tF93A88740E8B4C700026AF89 /* obj-c_TestCases */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F93A88790E8B4C700026AF89 /* Build configuration list for PBXNativeTarget \"obj-c_TestCases\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF93A88700E8B4C700026AF89 /* Resources */,\n\t\t\t\tF93A88710E8B4C700026AF89 /* Sources */,\n\t\t\t\tF93A88720E8B4C700026AF89 /* Frameworks */,\n\t\t\t\tF93A88730E8B4C700026AF89 /* ShellScript */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"obj-c_TestCases\";\n\t\t\tproductName = octestcases;\n\t\t\tproductReference = F93A88750E8B4C700026AF89 /* octestcases.octest */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n\t\tF9AE19C20DB04A9500C98454 /* minidump_tests64 */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F9AE19C70DB04AA200C98454 /* Build configuration list for PBXNativeTarget \"minidump_tests64\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF9AE19BE0DB04A9500C98454 /* Resources */,\n\t\t\t\tF9AE19BF0DB04A9500C98454 /* Sources */,\n\t\t\t\tF9AE19C00DB04A9500C98454 /* Frameworks */,\n\t\t\t\tF9AE19C10DB04A9500C98454 /* ShellScript */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = minidump_tests64;\n\t\t\tproductName = minidump_tests;\n\t\t\tproductReference = F9AE19C30DB04A9500C98454 /* minidump_tests64.cptest */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n\t\tF9AE5B320DBFDBA300505983 /* minidump_tests32 */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = F9AE5B380DBFDBA300505983 /* Build configuration list for PBXNativeTarget \"minidump_tests32\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF9AE5B2E0DBFDBA300505983 /* Resources */,\n\t\t\t\tF9AE5B2F0DBFDBA300505983 /* Sources */,\n\t\t\t\tF9AE5B300DBFDBA300505983 /* Frameworks */,\n\t\t\t\tF9AE5B310DBFDBA300505983 /* ShellScript */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = minidump_tests32;\n\t\t\tproductName = Untitled;\n\t\t\tproductReference = F9AE5B330DBFDBA300505983 /* minidump_tests32.cptest */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t08FB7793FE84155DC02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tbuildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject \"minidump_test\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\tJapanese,\n\t\t\t\tFrench,\n\t\t\t\tGerman,\n\t\t\t);\n\t\t\tmainGroup = 08FB7794FE84155DC02AAC07 /* MinidumpWriter */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8DD76F620486A84900D96B5E /* generator_test */,\n\t\t\t\t9BD82A9A0B00267E0055103E /* handler_test */,\n\t\t\t\t9B7CA84D0B1297F200CD3A1D /* unit_test */,\n\t\t\t\tF9AE19C20DB04A9500C98454 /* minidump_tests64 */,\n\t\t\t\tF9AE5B320DBFDBA300505983 /* minidump_tests32 */,\n\t\t\t\tF93A88740E8B4C700026AF89 /* obj-c_TestCases */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tF93A88700E8B4C700026AF89 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF9AE19BE0DB04A9500C98454 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF9AE5B2E0DBFDBA300505983 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\tF93A88730E8B4C700026AF89 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"# Run the unit tests in this test bundle.\\n\\\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\\\"\\n\";\n\t\t};\n\t\tF9AE19C10DB04A9500C98454 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"# Run the unit tests in this test bundle.\\n\\\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\\\"\\n# Run gcov on the framework getting tested\\nif [ \\\"${CONFIGURATION}\\\" = 'Coverage' ];\\nthen\\n     FRAMEWORK_NAME=minidump_tests64\\n     FRAMEWORK_OBJ_DIR=${OBJROOT}/${PROJECT_NAME}.build/${CONFIGURATION}/${FRAMEWORK_NAME}.build/Objects-normal/${NATIVE_ARCH_ACTUAL}\\n     mkdir -p coverage\\n     pushd coverage\\n     echo find ${OBJROOT} -name *.gcda -exec gcov -o ${FRAMEWORK_OBJ_DIR} {} \\\\;\\n     find ${OBJROOT} -name *.gcda -exec gcov -o ${FRAMEWORK_OBJ_DIR} {} \\\\;\\n     popd\\nfi \";\n\t\t};\n\t\tF9AE5B310DBFDBA300505983 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"# Run the unit tests in this test bundle.\\n\\\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\\\"\\n\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t8DD76F640486A84900D96B5E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9BD82C020B01333D0055103E /* minidump_generator_test.cc in Sources */,\n\t\t\t\t9BD82C0F0B0133520055103E /* exception_handler.cc in Sources */,\n\t\t\t\t9BD82C110B0133520055103E /* minidump_generator.cc in Sources */,\n\t\t\t\t9BD82C260B01344C0055103E /* minidump_file_writer.cc in Sources */,\n\t\t\t\t9BD82C2E0B01345E0055103E /* string_utilities.cc in Sources */,\n\t\t\t\tD2F651000BEF947200920385 /* file_id.cc in Sources */,\n\t\t\t\tD2F651020BEF947200920385 /* macho_id.cc in Sources */,\n\t\t\t\tD2F651040BEF947200920385 /* macho_utilities.cc in Sources */,\n\t\t\t\tD2F651090BEF949A00920385 /* dynamic_images.cc in Sources */,\n\t\t\t\tD2F6510E0BEF94EB00920385 /* macho_walker.cc in Sources */,\n\t\t\t\tD2F651110BEF951700920385 /* string_conversion.cc in Sources */,\n\t\t\t\tD2F651150BEF953000920385 /* convert_UTF.c in Sources */,\n\t\t\t\t8BFC81B011FF9C8D002CB4DC /* breakpad_nlist_64.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9B7CA84B0B1297F200CD3A1D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9B7CA8540B12989000CD3A1D /* minidump_file_writer_unittest.cc in Sources */,\n\t\t\t\t9B7CA8550B1298A100CD3A1D /* minidump_file_writer.cc in Sources */,\n\t\t\t\t9BC1D2940B336F2300F2A2B4 /* convert_UTF.c in Sources */,\n\t\t\t\t9BC1D2950B336F2500F2A2B4 /* string_conversion.cc in Sources */,\n\t\t\t\t8BFC81AE11FF9C8C002CB4DC /* breakpad_nlist_64.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9BD82A980B00267E0055103E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9BD82BFF0B01333D0055103E /* exception_handler_test.cc in Sources */,\n\t\t\t\t9BD82C0D0B0133520055103E /* exception_handler.cc in Sources */,\n\t\t\t\t9BD82C0E0B0133520055103E /* minidump_generator.cc in Sources */,\n\t\t\t\t9BD82C250B01344C0055103E /* minidump_file_writer.cc in Sources */,\n\t\t\t\t9BD82C2D0B01345E0055103E /* string_utilities.cc in Sources */,\n\t\t\t\t9B35FF5A0B267D5F008DE8C7 /* convert_UTF.c in Sources */,\n\t\t\t\t9B35FF5B0B267D5F008DE8C7 /* string_conversion.cc in Sources */,\n\t\t\t\tD2F6511B0BEF970E00920385 /* dynamic_images.cc in Sources */,\n\t\t\t\tD2F6511D0BEF973500920385 /* file_id.cc in Sources */,\n\t\t\t\tD2F6511E0BEF973600920385 /* macho_id.cc in Sources */,\n\t\t\t\tD2F6511F0BEF973900920385 /* macho_utilities.cc in Sources */,\n\t\t\t\tD2F651210BEF975400920385 /* macho_walker.cc in Sources */,\n\t\t\t\t8BFC81AF11FF9C8C002CB4DC /* breakpad_nlist_64.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF93A88710E8B4C700026AF89 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF93A88860E8B4C9A0026AF89 /* dwarftests.mm in Sources */,\n\t\t\t\tF93A88870E8B4C9A0026AF89 /* dump_syms.mm in Sources */,\n\t\t\t\tF93A88880E8B4C9A0026AF89 /* bytereader.cc in Sources */,\n\t\t\t\tF93A88890E8B4C9A0026AF89 /* dwarf2reader.cc in Sources */,\n\t\t\t\tF93A888A0E8B4C9A0026AF89 /* functioninfo.cc in Sources */,\n\t\t\t\tF93A888B0E8B4C9A0026AF89 /* md5.cc in Sources */,\n\t\t\t\tF93A887D0E8B4C8C0026AF89 /* macho_walker.cc in Sources */,\n\t\t\t\tF93A887E0E8B4C8C0026AF89 /* macho_id.cc in Sources */,\n\t\t\t\tF93A887F0E8B4C8C0026AF89 /* macho_utilities.cc in Sources */,\n\t\t\t\tF93A88800E8B4C8C0026AF89 /* file_id.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF9AE19BF0DB04A9500C98454 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF9B34E870DBC1E1600306484 /* dynamic_images.cc in Sources */,\n\t\t\t\tF982089C0DB3280D0017AECA /* breakpad_nlist_test.cc in Sources */,\n\t\t\t\tF98208A30DB32CAE0017AECA /* breakpad_nlist_64.cc in Sources */,\n\t\t\t\tF9C5A4220DB82DD800209C76 /* DynamicImagesTests.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF9AE5B2F0DBFDBA300505983 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF9AE5B390DBFDBDB00505983 /* dynamic_images.cc in Sources */,\n\t\t\t\tF9AE5B3A0DBFDBDB00505983 /* DynamicImagesTests.cc in Sources */,\n\t\t\t\t8BFC81AD11FF9C8A002CB4DC /* breakpad_nlist_64.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1DEB923208733DC60010E9CD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(DEVELOPER_FRAMEWORKS_DIR)\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = generator_test;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"../../../** $(inherited)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1DEB923308733DC60010E9CD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"$(DEVELOPER_FRAMEWORKS_DIR)\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = generator_test;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"../../../** $(inherited)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1DEB923608733DC60010E9CD /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 8BFC812111FF99D5002CB4DC /* BreakpadDebug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1DEB923708733DC60010E9CD /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 8BFC812211FF99D5002CB4DC /* BreakpadRelease.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t9B7CA8510B12984300CD3A1D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = unit_test;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"../../../** $(inherited)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t9B7CA8520B12984300CD3A1D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = unit_test;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"../../../** $(inherited)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t9BD82AA70B0026BF0055103E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = handler_test;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"../../.. $(inherited)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t9BD82AA80B0026BF0055103E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = handler_test;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"../../.. $(inherited)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF93A88770E8B4C700026AF89 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(DEVELOPER_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tINFOPLIST_FILE = \"obj-cTestCases-Info.plist\";\n\t\t\t\tPRODUCT_NAME = octestcases;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"../../../..//**\";\n\t\t\t\tWRAPPER_EXTENSION = octest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF93A88780E8B4C700026AF89 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(DEVELOPER_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tINFOPLIST_FILE = \"obj-cTestCases-Info.plist\";\n\t\t\t\tPRODUCT_NAME = octestcases;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"../../../..//**\";\n\t\t\t\tWRAPPER_EXTENSION = octest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF9AE19C40DB04A9500C98454 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(DEVELOPER_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tINFOPLIST_FILE = \"minidump_tests64-Info.plist\";\n\t\t\t\tPRODUCT_NAME = minidump_tests64;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"../../../**\";\n\t\t\t\tWRAPPER_EXTENSION = cptest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF9AE19C50DB04A9500C98454 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(DEVELOPER_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tINFOPLIST_FILE = \"minidump_tests64-Info.plist\";\n\t\t\t\tPRODUCT_NAME = minidump_tests64;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"../../../**\";\n\t\t\t\tWRAPPER_EXTENSION = cptest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF9AE5B350DBFDBA300505983 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(DEVELOPER_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tINFOPLIST_FILE = \"minidump_tests32-Info.plist\";\n\t\t\t\tPRODUCT_NAME = minidump_tests32;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"../../../**\";\n\t\t\t\tWRAPPER_EXTENSION = cptest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF9AE5B370DBFDBA300505983 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(DEVELOPER_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tINFOPLIST_FILE = \"minidump_tests32-Info.plist\";\n\t\t\t\tPRODUCT_NAME = minidump_tests32;\n\t\t\t\tUSER_HEADER_SEARCH_PATHS = \"../../../**\";\n\t\t\t\tWRAPPER_EXTENSION = cptest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1DEB923108733DC60010E9CD /* Build configuration list for PBXNativeTarget \"generator_test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1DEB923208733DC60010E9CD /* Debug */,\n\t\t\t\t1DEB923308733DC60010E9CD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1DEB923508733DC60010E9CD /* Build configuration list for PBXProject \"minidump_test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1DEB923608733DC60010E9CD /* Debug */,\n\t\t\t\t1DEB923708733DC60010E9CD /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t9B7CA8500B12984300CD3A1D /* Build configuration list for PBXNativeTarget \"unit_test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9B7CA8510B12984300CD3A1D /* Debug */,\n\t\t\t\t9B7CA8520B12984300CD3A1D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t9BD82AA60B0026BF0055103E /* Build configuration list for PBXNativeTarget \"handler_test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9BD82AA70B0026BF0055103E /* Debug */,\n\t\t\t\t9BD82AA80B0026BF0055103E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF93A88790E8B4C700026AF89 /* Build configuration list for PBXNativeTarget \"obj-c_TestCases\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF93A88770E8B4C700026AF89 /* Debug */,\n\t\t\t\tF93A88780E8B4C700026AF89 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF9AE19C70DB04AA200C98454 /* Build configuration list for PBXNativeTarget \"minidump_tests64\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF9AE19C40DB04A9500C98454 /* Debug */,\n\t\t\t\tF9AE19C50DB04A9500C98454 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tF9AE5B380DBFDBA300505983 /* Build configuration list for PBXNativeTarget \"minidump_tests32\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF9AE5B350DBFDBA300505983 /* Debug */,\n\t\t\t\tF9AE5B370DBFDBA300505983 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 08FB7793FE84155DC02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/minidump_tests32-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.google.breakpad.minidump_tests32</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/minidump_tests64-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.google.breakpad.minidump_tests64</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>CSResourcesFileMapped</key>\n\t<string>yes</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/obj-cTestCases-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.yourcompany.${PRODUCT_NAME:identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/protected_memory_allocator.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// ProtectedMemoryAllocator\n//\n// See the header file for documentation\n\n#include \"protected_memory_allocator.h\"\n#include <assert.h>\n\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nProtectedMemoryAllocator::ProtectedMemoryAllocator(vm_size_t pool_size) \n  : pool_size_(pool_size),\n    next_alloc_offset_(0),\n    valid_(false) {\n  \n  kern_return_t result = vm_allocate(mach_task_self(),\n                                     &base_address_,\n                                     pool_size,\n                                     TRUE\n                                     );\n  \n  valid_ = (result == KERN_SUCCESS);\n  assert(valid_);\n}\n\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nProtectedMemoryAllocator::~ProtectedMemoryAllocator() {\n  vm_deallocate(mach_task_self(),\n                base_address_,\n                pool_size_\n                );\n}\n\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nchar *ProtectedMemoryAllocator::Allocate(vm_size_t bytes) {\n  if (valid_ && next_alloc_offset_ + bytes <= pool_size_) {\n    char *p = (char*)base_address_ + next_alloc_offset_;\n    next_alloc_offset_ += bytes;\n    return p;\n  }\n  \n  return NULL;  // ran out of memory in our allocation block\n}\n\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nkern_return_t  ProtectedMemoryAllocator::Protect() {\n  kern_return_t result = vm_protect(mach_task_self(),\n                                    base_address_,\n                                    pool_size_,\n                                    FALSE,\n                                    VM_PROT_READ);\n  \n  return result;\n}\n\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nkern_return_t  ProtectedMemoryAllocator::Unprotect() {\n  kern_return_t result = vm_protect(mach_task_self(),\n                                    base_address_,\n                                    pool_size_,\n                                    FALSE,\n                                    VM_PROT_READ | VM_PROT_WRITE);\n  \n  return result;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/protected_memory_allocator.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// ProtectedMemoryAllocator\n//\n// A very simple allocator class which allows allocation, but not deallocation.\n// The allocations can be made read-only with the Protect() method.\n// This class is NOT useful as a general-purpose memory allocation system,\n// since it does not allow deallocation.  It is useful to use for a group\n// of allocations which are created in the same time-frame and destroyed\n// in the same time-frame.  It is useful for making allocations of memory\n// which will not need to change often once initialized.  This memory can then\n// be protected from memory smashers by calling the Protect() method.\n\n#ifndef PROTECTED_MEMORY_ALLOCATOR_H__\n#define PROTECTED_MEMORY_ALLOCATOR_H__\n\n#include <mach/mach.h>\n\n//\nclass ProtectedMemoryAllocator {\n public:\n  ProtectedMemoryAllocator(vm_size_t pool_size);  \n  ~ProtectedMemoryAllocator();\n  \n  // Returns a pointer to an allocation of size n within the pool.\n  // Fails by returning NULL is no more space is available.\n  // Please note that the pointers returned from this method should not\n  // be freed in any way (for example by calling free() on them ).\n  char *         Allocate(vm_size_t n);\n  \n  // Returns the base address of the allocation pool.\n  char *         GetBaseAddress() { return (char*)base_address_; }\n\n  // Returns the size of the allocation pool, including allocated\n  // plus free space.\n  vm_size_t      GetTotalSize() { return pool_size_; }\n\n  // Returns the number of bytes already allocated in the pool.\n  vm_size_t      GetAllocatedSize() { return next_alloc_offset_; }\n\n  // Returns the number of bytes available for allocation.\n  vm_size_t      GetFreeSize() { return pool_size_ - next_alloc_offset_; }\n  \n  // Makes the entire allocation pool read-only including, of course,\n  // all allocations made from the pool.\n  kern_return_t  Protect();  \n\n  // Makes the entire allocation pool read/write.\n  kern_return_t  Unprotect();  \n  \n private:\n  vm_size_t      pool_size_;\n  vm_address_t   base_address_;\n  vm_size_t      next_alloc_offset_;\n  bool           valid_;\n};\n\n#endif // PROTECTED_MEMORY_ALLOCATOR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/testcases/DynamicImagesTests.cc",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n//  DynamicImagesTests.cpp\n//  minidump_test\n//\n//  Created by Neal Sidhwaney on 4/17/08.\n//  Copyright 2008 Google Inc. All rights reserved.\n//\n\n#include \"client/mac/handler/testcases/DynamicImagesTests.h\"\n#include \"client/mac/handler/dynamic_images.h\"\n\nDynamicImagesTests test2(TEST_INVOCATION(DynamicImagesTests,\n                                         ReadTaskMemoryTest));\nDynamicImagesTests test3(TEST_INVOCATION(DynamicImagesTests,\n                                         ReadLibrariesFromLocalTaskTest));\n\nDynamicImagesTests::DynamicImagesTests(TestInvocation *invocation)\n    : TestCase(invocation) {\n}\n\nDynamicImagesTests::~DynamicImagesTests() {\n}\n\nvoid DynamicImagesTests::ReadTaskMemoryTest() {\n  kern_return_t kr;\n\n  // pick test2 as a symbol we know to be valid to read\n  // anything will work, really\n  void *addr = reinterpret_cast<void*>(&test2);\n  std::vector<uint8_t> buf(getpagesize());\n\n  fprintf(stderr, \"reading 0x%p\\n\", addr);\n  kr = google_breakpad::ReadTaskMemory(mach_task_self(),\n                                       (uint64_t)addr,\n                                       getpagesize(),\n                                       buf);\n\n  CPTAssert(kr == KERN_SUCCESS);\n\n  CPTAssert(0 == memcmp(&buf[0], (const void*)addr, getpagesize()));\n}\n\nvoid DynamicImagesTests::ReadLibrariesFromLocalTaskTest() {\n\n  mach_port_t me = mach_task_self();\n  google_breakpad::DynamicImages *d = new google_breakpad::DynamicImages(me);\n\n  fprintf(stderr,\"Local task image count: %d\\n\", d->GetImageCount());\n\n  CPTAssert(d->GetImageCount() > 0);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/testcases/DynamicImagesTests.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n//  DynamicImagesTests.h\n//  minidump_test\n//\n//  Created by Neal Sidhwaney on 4/17/08.\n//  Copyright 2008 Google Inc. All rights reserved.\n//\n//\n\n#ifndef _CLIENT_MAC_HANDLER_TESTCASES_DYNAMICIMAGESTESTS_H__\n#define _CLIENT_MAC_HANDLER_TESTCASES_DYNAMICIMAGESTESTS_H__\n\n#include <CPlusTest/CPlusTest.h>\n\nclass DynamicImagesTests : public TestCase {\n public:\n  explicit DynamicImagesTests(TestInvocation* invocation);\n  virtual ~DynamicImagesTests();\n\n  void ReadTaskMemoryTest();\n  void ReadLibrariesFromLocalTaskTest();\n};\n\n#endif /* _CLIENT_MAC_HANDLER_TESTCASES_DYNAMICIMAGESTESTS_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/testcases/breakpad_nlist_test.cc",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n//  breakpad_nlist_test.cc\n//  minidump_test\n//\n//  Created by Neal Sidhwaney on 4/13/08.\n//  Copyright 2008 Google Inc. All rights reserved.\n//\n\n#include \"client/mac/handler/testcases/breakpad_nlist_test.h\"\n#include <mach-o/nlist.h>\n#include \"client/mac/handler/breakpad_nlist_64.h\"\n\nBreakpadNlistTest test1(TEST_INVOCATION(BreakpadNlistTest, CompareToNM));\n\nBreakpadNlistTest::BreakpadNlistTest(TestInvocation *invocation)\n    : TestCase(invocation) {\n}\n\n\nBreakpadNlistTest::~BreakpadNlistTest() {\n}\n\nvoid BreakpadNlistTest::CompareToNM() {\n#if TARGET_CPU_X86_64\n  system(\"/usr/bin/nm -arch x86_64 /usr/lib/dyld > /tmp/dyld-namelist.txt\");\n#elif TARGET_CPU_PPC64\n  system(\"/usr/bin/nm -arch ppc64 /usr/lib/dyld > /tmp/dyld-namelist.txt\");\n#endif\n\n  FILE *fd = fopen(\"/tmp/dyld-namelist.txt\", \"rt\");\n\n  char oneNMAddr[30];\n  char symbolType;\n  char symbolName[500];\n  while (!feof(fd)) {\n    fscanf(fd, \"%s %c %s\", oneNMAddr, &symbolType, symbolName);\n    breakpad_nlist symbolList[2];\n    breakpad_nlist &list = symbolList[0];\n\n    memset(symbolList, 0, sizeof(breakpad_nlist)*2);\n    const char *symbolNames[2];\n    symbolNames[0] = (const char*)symbolName;\n    symbolNames[1] = \"\\0\";\n    breakpad_nlist_64(\"/usr/lib/dyld\", &list, symbolNames);\n    uint64_t nmAddr = strtol(oneNMAddr, NULL, 16);\n    if (!IsSymbolMoreThanOnceInDyld(symbolName)) {\n      CPTAssert(nmAddr == symbolList[0].n_value);\n    }\n  }\n\n  fclose(fd);\n}\n\nbool BreakpadNlistTest::IsSymbolMoreThanOnceInDyld(const char *symbolName) {\n  // These are the symbols that occur more than once when nm dumps\n  // the symbol table of /usr/lib/dyld.  Our nlist program returns\n  // the first address because it's doing a search so we need to exclude\n  // these from causing the test to fail\n  const char *multipleSymbols[] = {\n    \"__Z41__static_initialization_and_destruction_0ii\",\n    \"___tcf_0\",\n    \"___tcf_1\",\n    \"_read_encoded_value_with_base\",\n    \"_read_sleb128\",\n    \"_read_uleb128\",\n    \"\\0\"};\n\n  bool found = false;\n\n  for (int i = 0; multipleSymbols[i][0]; i++) {\n    if (!strcmp(multipleSymbols[i], symbolName)) {\n      found = true;\n      break;\n    }\n  }\n\n  return found;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/testcases/breakpad_nlist_test.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n//  breakpad_nlist_test.h\n//  minidump_test\n//\n//  Created by Neal Sidhwaney on 4/13/08.\n//  Copyright 2008 Google Inc. All rights reserved.\n//\n//\n\n#ifndef CLIENT_MAC_HANDLER_TESTCASES_BREAKPAD_NLIST_TEST_H__\n#define CLIENT_MAC_HANDLER_TESTCASES_BREAKPAD_NLIST_TEST_H__\n\n#include <CPlusTest/CPlusTest.h>\n\nclass BreakpadNlistTest : public TestCase {\n private:\n\n  // nm dumps multiple addresses for the same symbol in\n  // /usr/lib/dyld. So we track those so we don't report failures\n  // in mismatches between what our nlist returns and what nm has\n  // for the duplicate symbols.\n  bool IsSymbolMoreThanOnceInDyld(const char *symbolName);\n\n public:\n  explicit BreakpadNlistTest(TestInvocation* invocation);\n  virtual ~BreakpadNlistTest();\n\n\n  /* This test case runs nm on /usr/lib/dyld and then compares the\n     output of every symbol to what our nlist implementation returns */\n  void CompareToNM();\n};\n\n#endif /* CLIENT_MAC_HANDLER_TESTCASES_BREAKPAD_NLIST_TEST_H__*/\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/testcases/dwarftests.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n//  dwarftests.h\n//  minidump_test\n//\n//  Created by Neal Sidhwaney on 9/24/08.\n//  Copyright 2008 Google Inc. All rights reserved.\n//\n\n#import <SenTestingKit/SenTestingKit.h>\n\n\n@interface dwarftests : SenTestCase {\n\n}\n\n- (void) testDWARFSymbolFileGeneration;\n\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/testcases/dwarftests.mm",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n//  dwarftests.m\n//  minidump_test\n//\n//  Created by Neal Sidhwaney on 9/24/08.\n//  Copyright 2008 Google Inc. All rights reserved.\n//\n\n#import \"dwarftests.h\"\n#import \"dump_syms.h\"\n\n@implementation dwarftests\n- (void) testDWARFSymbolFileGeneration {\n  NSString *inputBreakpadSymbolFile = @\"testcases/testdata/dump_syms_i386_breakpad.sym\";\n  NSString *outputBreakpadSymbolFile = @\"/tmp/dump_syms_i386.breakpad\";\n\n  DumpSymbols *dump = [[DumpSymbols alloc] initWithContentsOfFile:@\"testcases/testdata/dump_syms_dwarf_data\"];\n\n  STAssertNotNil(dump, @\"DumpSymbols is nil\");\n  [dump setArchitecture:@\"i386\"];\n  [dump writeSymbolFile:outputBreakpadSymbolFile];\n  \n  NSData *d = [[NSData alloc] initWithContentsOfFile:inputBreakpadSymbolFile];\n  STAssertNotNil(d, @\"Input breakpad symbol file not found\");\n  \n  NSData *d1 = [[NSData alloc] initWithContentsOfFile:outputBreakpadSymbolFile]; \n  STAssertNotNil(d1, @\"Output breakpad symbol file not found\");\n\n  STAssertTrue([d isEqualToData:d1],\n  @\"Symbol files were not equal!\",nil);\n}\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym",
    "content": "MODULE mac x86 94BF873C47A73BC07125291390B4C5F10 dump_syms_dwarf_data\nFILE 1 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/libkern/i386/OSByteOrder.h\nFILE 2 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/architecture/byte_order.h\nFILE 3 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/dump_syms.mm\nFILE 4 /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSRange.h\nFILE 5 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/new\nFILE 6 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/hash_fun.h\nFILE 7 ../../../common/mac/dwarf/dwarf2reader.h\nFILE 8 ../../../common/mac/file_id.h\nFILE 9 ../../../common/mac/dwarf/functioninfo.h\nFILE 10 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_tree.h\nFILE 11 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_iterator.h\nFILE 12 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/hashtable.h\nFILE 13 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_pair.h\nFILE 14 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/new_allocator.h\nFILE 15 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/allocator.h\nFILE 16 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_vector.h\nFILE 17 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h\nFILE 18 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_iterator_base_funcs.h\nFILE 19 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_algo.h\nFILE 20 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_map.h\nFILE 21 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_construct.h\nFILE 22 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_function.h\nFILE 23 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/hash_map\nFILE 24 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/basic_string.h\nFILE 25 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_algobase.h\nFILE 26 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_list.h\nFILE 27 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/list.tcc\nFILE 28 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_uninitialized.h\nFILE 29 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/vector.tcc\nFILE 30 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/dwarf/functioninfo.cc\nFILE 31 ../../../common/mac/dwarf/dwarf2reader.h\nFILE 32 ../../../common/mac/dwarf/functioninfo.h\nFILE 33 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_pair.h\nFILE 34 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/hashtable.h\nFILE 35 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/memory\nFILE 36 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/new_allocator.h\nFILE 37 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/basic_string.h\nFILE 38 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_iterator.h\nFILE 39 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_vector.h\nFILE 40 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_tree.h\nFILE 41 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_function.h\nFILE 42 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/hash_map\nFILE 43 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_construct.h\nFILE 44 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_algobase.h\nFILE 45 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_map.h\nFILE 46 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_uninitialized.h\nFILE 47 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/vector.tcc\nFILE 48 /g/code/breakpad-staging/src/tools/mac/dump_syms/dump_syms_tool.mm\nFILE 49 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/file_id.cc\nFILE 50 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/architecture/byte_order.h\nFILE 51 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/macho_id.cc\nFILE 52 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/libkern/i386/OSByteOrder.h\nFILE 53 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/architecture/byte_order.h\nFILE 54 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/macho_walker.cc\nFILE 55 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/libkern/i386/OSByteOrder.h\nFILE 56 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/architecture/byte_order.h\nFILE 57 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/macho_utilities.cc\nFILE 58 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/dwarf/bytereader.cc\nFILE 59 ../../../common/mac/dwarf/bytereader-inl.h\nFILE 60 /g/code/breakpad-staging/src/tools/mac/dump_syms/../../../common/mac/dwarf/dwarf2reader.cc\nFILE 61 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_algobase.h\nFILE 62 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_deque.h\nFILE 63 ../../../common/mac/dwarf/bytereader.h\nFILE 64 ../../../common/mac/dwarf/bytereader-inl.h\nFILE 65 ../../../common/mac/dwarf/line_state_machine.h\nFILE 66 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_list.h\nFILE 67 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/memory\nFILE 68 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/ext/new_allocator.h\nFILE 69 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/allocator.h\nFILE 70 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_pair.h\nFILE 71 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_vector.h\nFILE 72 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_iterator.h\nFILE 73 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_construct.h\nFILE 74 ../../../common/mac/dwarf/dwarf2reader.h\nFILE 75 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_stack.h\nFILE 76 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/deque.tcc\nFILE 77 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/list.tcc\nFILE 78 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/vector.tcc\nFILE 79 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_uninitialized.h\nFILE 80 /var/tmp/gcc/gcc-5484~1/src/gcc/libgcc2.c\nFUNC 162a 28 0 _OSSwapInt16\n162a 10 44 55\n163a 16 46 55\n1650 2 47 55\nFUNC 1652 1c 0 _OSSwapInt32\n1652 f 53 55\n1661 8 55 55\n1669 3 56 55\n166c 2 57 55\nFUNC 166e 2b 0 _OSSwapInt64\n166e 12 64 55\n1680 11 69 55\n1691 6 70 55\n1697 2 71 55\n1699 1 71 55\nFUNC 169a 1e 0 NXSwapShort\n169a 10 43 56\n16aa c 45 56\n16b6 2 46 56\nFUNC 16b8 19 0 NXSwapInt\n16b8 f 52 56\n16c7 8 54 56\n16cf 2 55 56\n16d1 1 55 56\nFUNC 16d2 19 0 NXSwapLong\n16d2 f 61 56\n16e1 8 63 56\n16e9 2 64 56\n16eb 1 64 56\nFUNC 16ec 1f 0 NXSwapLongLong\n16ec 12 70 56\n16fe b 72 56\n1709 2 73 56\n170b 1 73 56\nFUNC 170c 181 0 -[DumpSymbols convertCPlusPlusSymbols:]\n170c 14 128 3\n1720 54 130 3\n1774 f 132 3\n1783 7 133 3\n178a 1a 136 3\n17a4 5 138 3\n17a9 1a 139 3\n17c3 23 140 3\n17e6 7 141 3\n17ed 44 142 3\n1831 1e 145 3\n184f 29 138 3\n1878 b 148 3\n1883 3 150 3\n1886 7 151 3\n188d 1 151 3\nFUNC 188e 323 0 -[DumpSymbols convertSymbols]\n188e 14 154 3\n18a2 1f 155 3\n18c1 3e 156 3\n18ff 2b 160 3\n192a c 162 3\n1936 43 164 3\n1979 2a 165 3\n19a3 20 168 3\n19c3 d 169 3\n19d0 1e 171 3\n19ee 11 162 3\n19ff 7 181 3\n1a06 6 182 3\n1a0c 5 184 3\n1a11 15 185 3\n1a26 6 18 4\n1a2c 6 19 4\n1a32 6 20 4\n1a38 6 185 3\n1a3e 28 186 3\n1a66 21 187 3\n1a87 1a 188 3\n1aa1 a 190 3\n1aab c 194 3\n1ab7 43 198 3\n1afa 21 199 3\n1b1b 20 202 3\n1b3b 2e 203 3\n1b69 1e 194 3\n1b87 c 184 3\n1b93 17 207 3\n1baa 7 208 3\n1bb1 1 208 3\nFUNC 1bb2 4a2 0 -[DumpSymbols addFunction:line:address:section:]\n1bb2 21 211 3\n1bd3 2f 212 3\n1c02 e 214 3\n1c10 4 219 3\n1c14 2a 221 3\n1c3e 22 223 3\n1c60 6 224 3\n1c66 2a 225 3\n1c90 4 226 3\n1c94 2e 230 3\n1cc2 2e 233 3\n1cf0 2e 236 3\n1d1e a 239 3\n1d28 2b 253 3\n1d53 e 254 3\n1d61 3c 255 3\n1d9d 22 32 4\n1dbf 3 256 3\n1dc2 6 259 3\n1dc8 a 260 3\n1dd2 3c 261 3\n1e0e 25 262 3\n1e33 2a 263 3\n1e5d 22 265 3\n1e7f 26 270 3\n1ea5 6 272 3\n1eab 37 273 3\n1ee2 2a 274 3\n1f0c 17 275 3\n1f23 43 278 3\n1f66 2e 279 3\n1f94 23 282 3\n1fb7 43 285 3\n1ffa 52 287 3\n204c 8 289 3\nFUNC 2054 5a4 0 -[DumpSymbols processSymbolItem:stringTable:]\n2054 18 292 3\n206c 8 293 3\n2074 4 294 3\n2078 16 297 3\n208e c 298 3\n209a f 300 3\n20a9 b 301 3\n20b4 16 303 3\n20ca 4d 309 3\n2117 38 311 3\n214f 30 315 3\n217f 60 317 3\n21df d 322 3\n21ec 2b 325 3\n2217 3a 327 3\n2251 f 332 3\n2260 2d 333 3\n228d 1a 334 3\n22a7 32 335 3\n22d9 20 342 3\n22f9 c 343 3\n2305 24 348 3\n2329 a 349 3\n2333 3c 350 3\n236f 2a 352 3\n2399 1c 353 3\n23b5 9 354 3\n23be f 356 3\n23cd 2d 357 3\n23fa 2f 358 3\n2429 20 360 3\n2449 c 361 3\n2455 7 363 3\n245c 21 365 3\n247d 4a 368 3\n24c7 9 370 3\n24d0 1a 371 3\n24ea 4b 372 3\n2535 4 373 3\n2539 5 371 3\n253e 29 374 3\n2567 2d 376 3\n2594 4b 378 3\n25df 4 379 3\n25e3 a 382 3\n25ed b 383 3\nFUNC 25f8 c9 0 -[DumpSymbols loadSymbolInfo:offset:]\n25f8 13 391 3\n260b 2b 392 3\n2636 2a 393 3\n2660 2d 395 3\n268d 2e 398 3\n26bb 6 399 3\n26c1 1 399 3\nFUNC 26c2 2be 0 -[DumpSymbols loadSTABSSymbolInfo:offset:]\n26c2 16 537 3\n26d8 9 538 3\n26e1 10 539 3\n26f1 2e 540 3\n271f 9 542 3\n2728 22 543 3\n274a 4 544 3\n274e a 546 3\n2758 3c 547 3\n2794 c 549 3\n27a0 e 550 3\n27ae 6 551 3\n27b4 25 552 3\n27d9 25 553 3\n27fe 25 554 3\n2823 c 555 3\n282f c 556 3\n283b c 559 3\n2847 23 562 3\n286a a 563 3\n2874 a 564 3\n287e 2e 565 3\n28ac 39 566 3\n28e5 2e 570 3\n2913 4 571 3\n2917 17 559 3\n292e 25 575 3\n2953 9 576 3\n295c 17 549 3\n2973 4 579 3\n2977 9 580 3\nFUNC 2980 28a 0 -[DumpSymbols loadSymbolInfo64:offset:]\n2980 16 583 3\n2996 9 585 3\n299f 10 586 3\n29af 2e 587 3\n29dd 9 589 3\n29e6 22 590 3\n2a08 4 591 3\n2a0c c 593 3\n2a18 e 594 3\n2a26 6 595 3\n2a2c 25 596 3\n2a51 25 597 3\n2a76 25 598 3\n2a9b 9 599 3\n2aa4 c 600 3\n2ab0 c 603 3\n2abc 17 604 3\n2ad3 23 609 3\n2af6 a 610 3\n2b00 a 611 3\n2b0a 2e 612 3\n2b38 37 613 3\n2b6f 2e 615 3\n2b9d 4 616 3\n2ba1 17 603 3\n2bb8 25 620 3\n2bdd 9 621 3\n2be6 17 593 3\n2bfd 4 624 3\n2c01 9 625 3\nFUNC 2c0a 199 0 -[DumpSymbols loadSymbolInfoForArchitecture]\n2c0a 13 628 3\n2c1d 41 630 3\n2c5e 2b 631 3\n2c89 1a 632 3\n2ca3 40 634 3\n2ce3 40 635 3\n2d23 5f 637 3\n2d82 17 639 3\n2d99 4 640 3\n2d9d 6 641 3\n2da3 1 641 3\nFUNC 2da4 3e5 0 -[DumpSymbols loadHeader:offset:]\n2da4 18 728 3\n2dbc 9 729 3\n2dc5 10 730 3\n2dd5 2e 731 3\n2e03 9 733 3\n2e0c 2b 734 3\n2e37 1e 736 3\n2e55 c 738 3\n2e61 e 739 3\n2e6f 6 740 3\n2e75 50 742 3\n2ec5 2e 743 3\n2ef3 2e 744 3\n2f21 2e 745 3\n2f4f 20 746 3\n2f6f 1b7 755 3\n3126 9 757 3\n312f 25 761 3\n3154 9 762 3\n315d 17 738 3\n3174 a 765 3\n317e b 766 3\n3189 1 766 3\nFUNC 318a 41d 0 -[DumpSymbols loadHeader64:offset:]\n318a 18 769 3\n31a2 9 771 3\n31ab 10 772 3\n31bb 2e 773 3\n31e9 9 775 3\n31f2 c 777 3\n31fe 2b 778 3\n3229 e 779 3\n3237 6 780 3\n323d 50 781 3\n328d 49 782 3\n32d6 49 783 3\n331f 2e 784 3\n334d 9 785 3\n3356 29 786 3\n337f 1c5 794 3\n3544 9 795 3\n354d 25 799 3\n3572 9 800 3\n357b 17 777 3\n3592 a 803 3\n359c b 804 3\n35a7 1 804 3\nFUNC 35a8 52a 0 -[DumpSymbols loadModuleInfo]\n35a8 14 807 3\n35bc e 808 3\n35ca 41 810 3\n360b 1a 811 3\n3625 6 812 3\n362b 6 814 3\n3631 17 815 3\n3648 c 816 3\n3654 29 820 3\n367d 29 821 3\n36a6 29 822 3\n36cf 35 824 3\n3704 12 826 3\n3716 17 827 3\n372d c 828 3\n3739 3c 832 3\n3775 a 834 3\n377f 9 836 3\n3788 25 837 3\n37ad c 839 3\n37b9 54 840 3\n380d 57 841 3\n3864 57 842 3\n38bb 57 843 3\n3912 57 844 3\n3969 1c 846 3\n3985 4b 847 3\n39d0 49 849 3\n3a19 13 839 3\n3a2c 6 851 3\n3a32 3c 852 3\n3a6e 3a 854 3\n3aa8 17 857 3\n3abf c 858 3\n3acb 7 859 3\nFUNC 3ad2 b6 0 WriteFormat\n3ad2 10 862 3\n3ae2 6 867 3\n3ae8 24 868 3\n3b0c 27 869 3\n3b33 40 870 3\n3b73 c 873 3\n3b7f 9 874 3\nFUNC 3b88 35 0 -[DumpSymbols availableArchitectures]\n3b88 13 1140 3\n3b9b 1c 1141 3\n3bb7 6 1142 3\n3bbd 1 1142 3\nFUNC 3bbe 1b4 0 -[DumpSymbols setArchitecture:]\n3bbe 13 1158 3\n3bd1 1a 1159 3\n3beb 4 1160 3\n3bef 2a 1162 3\n3c19 9 1163 3\n3c22 2a 1165 3\n3c4c 9 1166 3\n3c55 9 1167 3\n3c5e 2a 1169 3\n3c88 6 1170 3\n3c8e 2a 1172 3\n3cb8 6 1173 3\n3cbe 2a 1175 3\n3ce8 4 1176 3\n3cec 6 1179 3\n3cf2 2c 1180 3\n3d1e 9 1181 3\n3d27 1c 1183 3\n3d43 1f 1184 3\n3d62 a 1187 3\n3d6c 6 1188 3\nFUNC 3d72 14 0 -[DumpSymbols architecture]\n3d72 c 1191 3\n3d7e 6 1192 3\n3d84 2 1193 3\nFUNC 3d86 e7 0 -[DumpSymbols writeSymbolFile:]\n3d86 13 1196 3\n3d99 1a 1197 3\n3db3 48 1200 3\n3dfb 9 1201 3\n3e04 1e 1203 3\n3e22 6 1205 3\n3e28 9 1206 3\n3e31 21 1208 3\n3e52 b 1210 3\n3e5d a 1212 3\n3e67 6 1213 3\n3e6d 1 1213 3\nFUNC 3e6e 65 0 -[MachSection initWithMachSection:andNumber:]\n3e6e 13 1219 3\n3e81 37 1220 3\n3eb8 9 1221 3\n3ec1 9 1222 3\n3eca 3 1225 3\n3ecd 6 1226 3\n3ed3 1 1226 3\nFUNC 3ed4 14 0 -[MachSection sectionPointer]\n3ed4 c 1228 3\n3ee0 6 1229 3\n3ee6 2 1230 3\nFUNC 3ee8 14 0 -[MachSection sectionNumber]\n3ee8 c 1232 3\n3ef4 6 1233 3\n3efa 2 1234 3\nFUNC 3efc 17c 0 -[DumpSymbols processDWARFSourceFileInfo:]\n3efc 14 459 3\n3f10 a 460 3\n3f1a 3c 461 3\n3f56 20 463 3\n3f76 5 464 3\n3f7b 3a 465 3\n3fb5 1d 466 3\n3fd2 3a 467 3\n400c 2a 468 3\n4036 3b 464 3\n4071 7 471 3\nFUNC 4078 1d7 0 DumpFunctionMap(std::map<unsigned long long, dwarf2reader::FunctionInfo*, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >)\n4078 15 82 3\n408d 13 83 3\n40a0 1e 85 3\n40be 42 89 3\n4100 20 90 3\n4120 2b 91 3\n414b 1a 92 3\n4165 23 93 3\n4188 46 96 3\n41ce 46 99 3\n4214 33 83 3\n4247 8 102 3\n424f 1 102 3\nFUNC 4250 3ef 0 -[DumpSymbols processDWARFFunctionInfo:]\n4250 15 473 3\n4265 25 474 3\n428a 1e 476 3\n42a8 a 480 3\n42b2 3c 481 3\n42ee 3d 483 3\n432b 23 485 3\n434e 26 487 3\n4374 6 489 3\n437a 37 490 3\n43b1 2a 491 3\n43db 17 492 3\n43f2 30 496 3\n4422 3d 497 3\n445f 2e 498 3\n448d 30 502 3\n44bd 64 504 3\n4521 34 507 3\n4555 9d 509 3\n45f2 45 474 3\n4637 8 513 3\n463f 1 513 3\nFUNC 4640 1f5 0 -[DumpSymbols processDWARFLineNumberInfo:]\n4640 15 515 3\n4655 25 516 3\n467a 39 520 3\n46b3 26 521 3\n46d9 6 523 3\n46df 37 524 3\n4716 2a 525 3\n4740 17 526 3\n4757 30 529 3\n4787 61 531 3\n47e8 45 516 3\n482d 8 534 3\n4835 1 534 3\nFUNC 4836 10f 0 -[DumpSymbols dealloc]\n4836 13 1145 3\n4849 1c 1146 3\n4865 1c 1147 3\n4881 1c 1148 3\n489d 1c 1149 3\n48b9 1c 1150 3\n48d5 1c 1151 3\n48f1 25 1152 3\n4916 29 1154 3\n493f 6 1155 3\n4945 1 1155 3\nFUNC 4946 512 0 -[DumpSymbols loadDWARFSymbolInfo:offset:]\n4946 17 402 3\n495d 9 405 3\n4966 10 406 3\n4976 2b 408 3\n49a1 38 409 3\n49d9 3a 410 3\n4a13 2e 411 3\n4a41 31 416 3\n4a72 e 418 3\n4a80 24 420 3\n4aa4 5 422 3\n4aa9 b 424 3\n4ab4 b 425 3\n4abf e 426 3\n4acd 2b 427 3\n4af8 2b 428 3\n4b23 2c 431 3\n4b4f 52 439 3\n4ba1 34 444 3\n4bd5 1a 446 3\n4bef 21 451 3\n4c10 1e 452 3\n4c2e 21 453 3\n4c4f 40 422 3\n4c8f 6 453 3\n4c95 170 422 3\n4e05 43 456 3\n4e48 10 457 3\nFUNC 4e58 4fd 0 -[DumpSymbols generateSectionDictionary:]\n4e58 18 663 3\n4e70 10 665 3\n4e80 2e 666 3\n4eae 9 668 3\n4eb7 2b 669 3\n4ee2 7 670 3\n4ee9 2e 672 3\n4f17 d 676 3\n4f24 32 678 3\n4f56 29 680 3\n4f7f a 684 3\n4f89 3c 685 3\n4fc5 31 688 3\n4ff6 5d 689 3\n5053 26 692 3\n5079 21 694 3\n509a c 698 3\n50a6 e 699 3\n50b4 6 700 3\n50ba 9 701 3\n50c3 2e 702 3\n50f1 c 704 3\n50fd 3c 706 3\n5139 66 709 3\n519f 1c 712 3\n51bb fb 714 3\n52b6 6 717 3\n52bc 5 718 3\n52c1 19 704 3\n52da 25 714 3\n52ff 2e 722 3\n532d 9 723 3\n5336 17 698 3\n534d 8 725 3\n5355 1 725 3\nFUNC 5356 24a 0 -[DumpSymbols getSectionMapForArchitecture:]\n5356 14 643 3\n536a 43 645 3\n53ad 1a 648 3\n53c7 1c 645 3\n53e3 18 648 3\n53fb 40 650 3\n543b 20 651 3\n545b 17 652 3\n5472 16 651 3\n5488 cb 652 3\n5553 11 654 3\n5564 32 657 3\n5596 a 658 3\nFUNC 55a0 3fe 0 -[DumpSymbols initWithContentsOfFile:]\n55a0 14 1056 3\n55b4 3b 1057 3\n55ef 44 1059 3\n5633 17 1060 3\n564a c 1061 3\n5656 1f 1064 3\n5675 2b 1067 3\n56a0 a 1069 3\n56aa 35 1083 3\n56df 2 1087 3\n56e1 1a 1088 3\n56fb 3d 1087 3\n5738 33 1092 3\n576b 6 1094 3\n5771 e 1095 3\n577f 17 1096 3\n5796 c 1097 3\n57a2 1c 1101 3\n57be 1f 1103 3\n57dd 18 1104 3\n57f5 23 1107 3\n5818 25 1109 3\n583d 1c 1107 3\n5859 17 1110 3\n5870 c 1111 3\n587c 2a 1115 3\n58a6 8 1116 3\n58ae a 1118 3\n58b8 9 1119 3\n58c1 d 1122 3\n58ce 29 1124 3\n58f7 20 1126 3\n5917 20 1128 3\n5937 57 1132 3\n598e 9 1136 3\n5997 7 1137 3\nFUNC 599e d74 0 -[DumpSymbols outputSymbolFile:]\n599e 18 877 3\n59b6 2e 879 3\n59e4 30 880 3\n5a14 5d 882 3\n5a71 30 883 3\n5aa1 5d 885 3\n5afe 2e 888 3\n5b2c 38 891 3\n5b64 46 892 3\n5baa 26 893 3\n5bd0 20 895 3\n5bf0 20 904 3\n5c10 30 898 3\n5c40 f 899 3\n5c4f 1e 904 3\n5c6d 17 907 3\n5c84 17 908 3\n5c9b 44 911 3\n5cdf 44 914 3\n5d23 a 917 3\n5d2d 36 921 3\n5d63 30 923 3\n5d93 9 18 4\n5d9c 9 19 4\n5da5 c 20 4\n5db1 56 923 3\n5e07 74 925 3\n5e7b f 927 3\n5e8a 44 932 3\n5ece 20 933 3\n5eee c 934 3\n5efa 4e 935 3\n5f48 41 936 3\n5f89 f 937 3\n5f98 14 934 3\n5fac 7 941 3\n5fb3 14 942 3\n5fc7 14 943 3\n5fdb 1d 946 3\n5ff8 c 948 3\n6004 24 949 3\n6028 29 950 3\n6051 9 953 3\n605a 28 954 3\n6082 2e 955 3\n60b0 1e 957 3\n60ce 7 959 3\n60d5 26 962 3\n60fb 2a 963 3\n6125 2a 964 3\n614f 6 966 3\n6155 2a 967 3\n617f e 971 3\n618d 43 972 3\n61d0 4c 974 3\n621c 8 975 3\n6224 2e 979 3\n6252 2e 982 3\n6280 2e 985 3\n62ae 2e 988 3\n62dc 2e 991 3\n630a 2e 994 3\n6338 2e 997 3\n6366 2e 1000 3\n6394 54 1004 3\n63e8 c 1005 3\n63f4 e 1007 3\n6402 27 1008 3\n6429 8 1009 3\n6431 34 1010 3\n6465 24 1012 3\n6489 2 1013 3\n648b 2a 1017 3\n64b5 a 1019 3\n64bf 14 1020 3\n64d3 1d 1021 3\n64f0 a 1025 3\n64fa 32 1026 3\n652c 33 1028 3\n655f c 1029 3\n656b 55 1034 3\n65c0 f 1036 3\n65cf 16 1040 3\n65e5 61 1041 3\n6646 f 1043 3\n6655 47 1046 3\n669c c 1048 3\n66a8 11 948 3\n66b9 4e 1052 3\n6707 b 1053 3\nFUNC 6712 11 0 operator new(unsigned long, void*)\n6712 c 94 5\n671e 5 94 5\n6723 1 94 5\nFUNC 6724 e 0 operator delete(void*, void*)\n6724 c 98 5\n6730 2 98 5\n673e 7 76 6\n6745 2 77 6\n6747 1a 78 6\n6761 d 77 6\n676e 3 79 6\n6771 2 80 6\n6773 1 80 6\n6780 d 95 6\n678d 1 95 6\n678e 13 127 74\n67a1 2a 127 74\n67cb 1 127 74\n67cc 13 127 74\n67df 2a 127 74\n6809 1 127 74\n680a 13 127 74\n681d 2a 127 74\n6847 1 127 74\nFUNC 6848 e 0 dwarf2reader::LineInfoHandler::DefineDir(std::string const&, unsigned int)\n6848 c 131 7\n6854 2 131 74\nFUNC 6856 26 0 dwarf2reader::LineInfoHandler::DefineFile(std::string const&, int, unsigned int, unsigned long long, unsigned long long)\n6856 24 142 7\n687a 2 142 74\nFUNC 687c 1a 0 dwarf2reader::LineInfoHandler::AddLine(unsigned long long, unsigned int, unsigned int, unsigned int)\n687c 18 150 7\n6894 2 150 74\n6896 12 299 74\n68a8 12 299 74\n68ba 13 301 74\n68cd 2a 301 74\n68f7 1 301 74\n68f8 13 301 74\n690b 2a 301 74\n6935 1 301 74\n6936 13 301 74\n6949 2a 301 74\n6973 1 301 74\nFUNC 6974 44 0 dwarf2reader::Dwarf2Handler::StartCompilationUnit(unsigned long long, unsigned char, unsigned char, unsigned long long, unsigned char)\n6974 39 308 7\n69ad b 308 74\nFUNC 69b8 1f 0 dwarf2reader::Dwarf2Handler::StartDIE(unsigned long long, dwarf2reader::DwarfTag, std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > > const&)\n69b8 18 314 7\n69d0 7 314 74\n69d7 1 314 74\nFUNC 69d8 26 0 dwarf2reader::Dwarf2Handler::ProcessAttributeUnsigned(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, unsigned long long)\n69d8 24 323 7\n69fc 2 323 74\nFUNC 69fe 26 0 dwarf2reader::Dwarf2Handler::ProcessAttributeSigned(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, long long)\n69fe 24 332 7\n6a22 2 332 74\nFUNC 6a24 26 0 dwarf2reader::Dwarf2Handler::ProcessAttributeBuffer(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, char const*, unsigned long long)\n6a24 24 345 7\n6a48 2 345 74\nFUNC 6a4a 1a 0 dwarf2reader::Dwarf2Handler::ProcessAttributeString(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, std::string const&)\n6a4a 18 354 7\n6a62 2 354 74\nFUNC 6a64 1a 0 dwarf2reader::Dwarf2Handler::EndDIE(unsigned long long)\n6a64 18 360 7\n6a7c 2 360 74\n6a7e c 44 8\n6a8a 2 44 8\n6a8c 13 55 32\n6a9f 35 55 32\n6ad4 13 91 32\n6ae7 73 96 32\n6b5a 13 98 32\n6b6d 35 98 32\n6bae 1a 75 3\n6bc8 2 76 3\nFUNC 6bca 20 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator!=(std::_Rb_tree_const_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > const&) const\n6bca c 287 10\n6bd6 14 288 40\nFUNC 6bea 16 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator->() const\n6bea c 249 10\n6bf6 a 250 40\n6c0c 7 614 72\n6c13 1 614 72\n6c14 c 241 40\n6c20 c 242 40\nFUNC 6c2c 16 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator*() const\n6c2c c 245 11\n6c38 a 246 40\n6c42 c 241 40\n6c4e c 242 40\nFUNC 6c5a 20 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >::operator!=(std::_Rb_tree_const_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > const&) const\n6c5a c 287 11\n6c66 14 288 40\nFUNC 6c7a 16 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >::operator->() const\n6c7a c 249 11\n6c86 a 250 40\n6c90 c 185 34\n6c9c 18 186 34\n6cc0 14 204 34\n6cd4 c 69 70\n6ce0 d 69 70\n6ced 1 69 70\n6cee c 89 70\n6cfa 20 90 70\n6d1a c 69 70\n6d26 d 69 70\n6d33 1 69 70\n6d34 c 69 70\n6d40 d 69 70\n6d4d 1 69 70\nFUNC 6d4e 25 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator++()\n6d4e c 253 13\n6d5a 14 255 40\n6d6e 5 256 40\n6d73 1 256 40\nFUNC 6d74 25 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >::operator++()\n6d74 c 253 13\n6d80 14 255 40\n6d94 5 256 40\n6d99 1 256 40\nFUNC 6d9a 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_begin()\n6d9a c 461 13\n6da6 8 462 40\nFUNC 6dae 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_begin()\n6dae c 461 13\n6dba 8 462 40\n6dc2 c 65 68\n6dce 2 65 68\n6dd0 c 72 68\n6ddc 2 72 68\n6dde c 97 69\n6dea d 97 69\n6df7 1 97 69\n6df8 c 105 69\n6e04 d 105 69\n6e11 1 105 69\n6e12 c 105 69\n6e1e d 105 69\n6e2b 1 105 69\n6e2c c 67 68\n6e38 2 67 68\n6e3a c 99 69\n6e46 14 100 69\n6e5a c 99 69\n6e66 14 100 69\nFUNC 6e7a 2b 0 std::_Vector_base<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::get_allocator() const\n6e7a 10 93 16\n6e8a 1b 94 71\n6ea5 1 94 71\n6ea6 c 65 68\n6eb2 2 65 68\n6eb4 c 72 68\n6ec0 2 72 68\n6ec2 c 97 69\n6ece d 97 69\n6edb 1 97 69\n6edc c 105 69\n6ee8 d 105 69\n6ef5 1 105 69\n6ef6 c 105 69\n6f02 d 105 69\n6f0f 1 105 69\n6f10 c 67 68\n6f1c 2 67 68\n6f1e c 99 69\n6f2a 14 100 69\n6f3e c 99 69\n6f4a 14 100 69\nFUNC 6f5e 2b 0 std::_Vector_base<std::string, std::allocator<std::string> >::get_allocator() const\n6f5e 10 93 16\n6f6e 1b 94 71\n6f89 1 94 71\n6f8a c 603 72\n6f96 c 603 72\nFUNC 6fa2 23 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::begin()\n6fa2 c 333 16\n6fae 17 334 71\n6fc5 1 334 71\nFUNC 6fc6 26 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::end()\n6fc6 c 351 16\n6fd2 1a 352 71\n6ff8 5 666 72\n6ffd 1 666 72\n6ffe c 608 72\n700a 14 609 72\n702a 5 666 72\n702f 1 666 72\nFUNC 7030 35 0 bool __gnu_cxx::operator!=<dwarf2reader::SourceFileInfo const*, dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >(__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo const*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > const&, __gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > const&)\n7030 d 693 16\n703d 28 694 72\n7065 1 694 72\n7066 c 603 72\n7072 c 603 72\n708a 27 629 72\n70b1 1 629 72\n70b2 c 84 70\n70be 1f 85 70\n70dd 1 85 70\nFUNC 70de 32 0 std::pair<std::string, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> std::make_pair<std::string, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*>(std::string, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*)\n70de 10 144 16\n70ee 22 145 70\n711c a 190 34\n7132 d 194 34\n713f 1 194 34\n7140 c 84 70\n714c 17 85 70\n7163 1 85 70\nFUNC 7164 2d 0 std::pair<char const*, unsigned long> std::make_pair<char const*, unsigned long>(char const*, unsigned long)\n7164 c 144 16\n7170 21 145 70\n7191 1 145 70\n7192 c 84 70\n719e 1d 85 70\n71bb 1 85 70\nFUNC 71bc 30 0 std::pair<char*, std::pair<char const*, unsigned long> > std::make_pair<char*, std::pair<char const*, unsigned long> >(char*, std::pair<char const*, unsigned long>)\n71bc 10 144 16\n71cc 20 145 70\n71ec c 89 70\n71f8 20 90 70\n7218 d 89 70\n7225 70 90 70\n7295 1 90 70\nFUNC 7296 12 0 std::iterator_traits<unsigned long const*>::iterator_category std::__iterator_category<unsigned long const*>(unsigned long const* const&)\n7296 c 164 17\n72a2 6 165 17\nFUNC 72a8 1d 0 std::iterator_traits<unsigned long const*>::difference_type std::__distance<unsigned long const*>(unsigned long const*, unsigned long const*, std::random_access_iterator_tag)\n72a8 c 92 18\n72b4 11 97 18\n72c5 1 97 18\nFUNC 72c6 33 0 std::iterator_traits<unsigned long const*>::difference_type std::distance<unsigned long const*>(unsigned long const*, unsigned long const*)\n72c6 c 114 18\n72d2 27 118 18\n72f9 1 118 18\nFUNC 72fa 20 0 void std::__advance<unsigned long const*, int>(unsigned long const*&, int, std::random_access_iterator_tag)\n72fa c 150 18\n7306 14 155 18\nFUNC 731a 33 0 void std::advance<unsigned long const*, int>(unsigned long const*&, int)\n731a c 172 18\n7326 27 175 18\n734d 1 175 18\nFUNC 734e 7a 0 unsigned long const* std::lower_bound<unsigned long const*, unsigned long>(unsigned long const*, unsigned long const*, unsigned long const&)\n734e c 2625 19\n735a 15 2642 19\n736f 2 2646 19\n7371 8 2648 19\n7379 6 2649 19\n737f 12 2650 19\n7391 e 2651 19\n739f 6 2653 19\n73a5 4 2654 19\n73a9 e 2655 19\n73b7 6 2658 19\n73bd 6 2646 19\n73c3 5 2660 19\n73db b 227 34\n73e6 e 228 34\n73f4 1c 229 34\n7410 20 230 34\n7430 6 231 34\n7436 c 72 68\n7442 2 72 68\n7444 c 105 69\n7450 d 105 69\n745d 1 105 69\n745e c 105 69\n746a d 105 69\n7477 1 105 69\n7478 c 80 71\n7484 d 80 71\n7491 1 80 71\n7492 c 67 68\n749e 2 67 68\n74a0 c 99 69\n74ac 14 100 69\nFUNC 74c0 2b 0 std::_Vector_base<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::get_allocator() const\n74c0 10 93 19\n74d0 1b 94 71\n74eb 1 94 71\n74ec c 238 40\n74f8 a 239 40\nFUNC 7502 26 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::begin() const\n7502 c 585 19\n750e 1a 588 40\nFUNC 7528 19 0 std::map<unsigned long long, dwarf2reader::FunctionInfo*, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::begin() const\n7528 c 243 20\n7534 d 244 45\n7541 1 244 45\nFUNC 7542 26 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::end() const\n7542 c 596 20\n754e 1a 597 40\nFUNC 7568 19 0 std::map<unsigned long long, dwarf2reader::FunctionInfo*, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::end() const\n7568 c 260 20\n7574 d 261 45\n7581 1 261 45\n7582 c 65 68\n758e 2 65 68\n7590 c 72 68\n759c 2 72 68\n759e c 97 69\n75aa d 97 69\n75b7 1 97 69\n75b8 c 105 69\n75c4 d 105 69\n75d1 1 105 69\n75d2 c 72 68\n75de 2 72 68\n75e0 c 105 69\n75ec d 105 69\n75f9 1 105 69\n75fa c 397 40\n7606 d 397 40\n7613 1 397 40\n7614 c 105 69\n7620 d 105 69\n762d 1 105 69\nFUNC 762e 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_S_right(std::_Rb_tree_node_base*)\n762e c 496 20\n763a 8 497 40\nFUNC 7642 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_S_left(std::_Rb_tree_node_base*)\n7642 c 488 20\n764e 8 489 40\n7656 c 65 68\n7662 2 65 68\n7664 c 72 68\n7670 2 72 68\n7672 c 97 69\n767e d 97 69\n768b 1 97 69\n768c c 105 69\n7698 d 105 69\n76a5 1 105 69\n76a6 c 72 68\n76b2 2 72 68\n76b4 c 105 69\n76c0 d 105 69\n76cd 1 105 69\n76ce c 397 40\n76da d 397 40\n76e7 1 397 40\n76e8 c 105 69\n76f4 d 105 69\n7701 1 105 69\nFUNC 7702 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_S_right(std::_Rb_tree_node_base*)\n7702 c 496 20\n770e 8 497 40\nFUNC 7716 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_S_left(std::_Rb_tree_node_base*)\n7716 c 488 20\n7722 8 489 40\n772a c 84 71\n7736 2f 85 71\n7765 2 86 71\n7767 1 86 71\n7768 c 80 71\n7774 d 80 71\n7781 1 80 71\n7782 c 96 71\n778e 12 97 71\n77a0 2 98 71\n77a2 c 84 71\n77ae 2f 85 71\n77dd 2 86 71\n77df 1 86 71\n77e0 c 80 71\n77ec d 80 71\n77f9 1 80 71\n77fa c 96 71\n7806 12 97 71\n7818 2 98 71\n7826 d 107 68\n7833 1 107 68\nFUNC 7834 2e 0 void std::_Destroy<std::string*, std::allocator<std::string> >(std::string*, std::string*, std::allocator<std::string>)\n7834 c 171 21\n7840 2 173 73\n7842 12 174 73\n7854 c 173 73\n7860 2 174 73\n7862 c 167 40\n786e a 168 40\nFUNC 7878 26 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::begin()\n7878 c 581 21\n7884 1a 582 40\nFUNC 789e 19 0 std::map<unsigned long long, dwarf2reader::FunctionInfo*, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::begin()\n789e c 234 21\n78aa d 235 45\n78b7 1 235 45\nFUNC 78b8 26 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::end()\n78b8 c 592 21\n78c4 1a 593 40\nFUNC 78de 19 0 std::map<unsigned long long, dwarf2reader::FunctionInfo*, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::end()\n78de c 251 21\n78ea d 252 45\n78f7 1 252 45\n78f8 c 167 40\n7904 a 168 40\nFUNC 790e 26 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::begin()\n790e c 581 21\n791a 1a 582 40\nFUNC 7934 19 0 std::map<unsigned long long, std::pair<std::string, unsigned int>, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::begin()\n7934 c 234 21\n7940 d 235 45\n794d 1 235 45\nFUNC 794e 26 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::end()\n794e c 592 21\n795a 1a 593 40\nFUNC 7974 19 0 std::map<unsigned long long, std::pair<std::string, unsigned int>, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::end()\n7974 c 251 21\n7980 d 252 45\n798d 1 252 45\nFUNC 798e 11 0 std::_Select1st<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >::operator()(std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*>&) const\n798e c 546 22\n799a 5 547 41\n799f 1 547 41\n79a0 c 128 34\n79ac 13 129 34\n79bf 1 129 34\n79cc 22 396 34\n79fa d 199 42\n7a07 1 199 42\n7a08 c 65 68\n7a14 2 65 68\n7a16 c 72 68\n7a22 2 72 68\n7a24 c 97 69\n7a30 d 97 69\n7a3d 1 97 69\n7a3e c 105 69\n7a4a d 105 69\n7a57 1 105 69\n7a58 c 65 68\n7a64 2 65 68\n7a66 c 72 68\n7a72 2 72 68\n7a74 c 105 69\n7a80 d 105 69\n7a8d 1 105 69\n7a8e c 97 69\n7a9a d 97 69\n7aa7 1 97 69\n7aa8 c 72 68\n7ab4 2 72 68\n7ab6 c 105 69\n7ac2 d 105 69\n7acf 1 105 69\n7adc d 94 68\n7ae9 1 94 68\nFUNC 7aea 2f 0 std::_Vector_base<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::_M_deallocate(dwarf2reader::CompilationUnit::Abbrev*, unsigned long)\n7aea c 120 23\n7af6 6 122 71\n7afc 1d 123 71\n7b19 1 123 71\n7b1a c 108 71\n7b26 43 109 71\n7b69 1 109 71\n7b6a c 65 68\n7b76 2 65 68\n7b78 c 103 69\n7b84 d 103 69\n7b91 1 103 69\n7b92 c 65 68\n7b9e 2 65 68\n7ba0 c 103 69\n7bac d 103 69\n7bb9 1 103 69\n7bc6 d 94 68\n7bd3 1 94 68\nFUNC 7bd4 2f 0 std::_Vector_base<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::_M_deallocate(dwarf2reader::SourceFileInfo*, unsigned long)\n7bd4 c 120 23\n7be0 6 122 71\n7be6 1d 123 71\n7c03 1 123 71\n7c04 c 108 71\n7c10 43 109 71\n7c53 1 109 71\n7c54 c 188 71\n7c60 12 189 71\n7c72 2 190 71\n7c74 c 35 32\n7c80 d 35 32\n7c8d 1 35 32\n7c9a d 107 68\n7ca7 1 107 68\nFUNC 7ca8 2e 0 void std::_Destroy<dwarf2reader::SourceFileInfo*, std::allocator<dwarf2reader::SourceFileInfo> >(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*, std::allocator<dwarf2reader::SourceFileInfo>)\n7ca8 c 171 23\n7cb4 2 173 73\n7cb6 12 174 73\n7cc8 c 173 73\n7cd4 2 174 73\n7cd6 d 272 71\n7ce3 8c 273 71\n7d6f 1 273 71\n7d7c d 94 68\n7d89 1 94 68\nFUNC 7d8a 2f 0 std::_Vector_base<std::string, std::allocator<std::string> >::_M_deallocate(std::string*, unsigned long)\n7d8a c 120 23\n7d96 6 122 71\n7d9c 1d 123 71\n7db9 1 123 71\n7dba c 108 71\n7dc6 3d 109 71\n7e03 1 109 71\n7e04 c 188 71\n7e10 12 189 71\n7e22 2 190 71\n7e24 d 272 71\n7e31 8c 273 71\n7ebd 1 273 71\n7eca 2b 596 34\n7ef5 1 596 34\n7f02 7 614 72\n7f09 1 614 72\n7f0a c 65 68\n7f16 2 65 68\n7f18 c 72 68\n7f24 2 72 68\n7f26 c 103 69\n7f32 d 103 69\n7f3f 1 103 69\n7f40 c 105 69\n7f4c d 105 69\n7f59 1 105 69\n7f5a c 65 68\n7f66 2 65 68\n7f68 c 72 68\n7f74 2 72 68\n7f76 c 103 69\n7f82 d 103 69\n7f8f 1 103 69\n7f90 c 105 69\n7f9c d 105 69\n7fa9 1 105 69\n7faa c 105 69\n7fb6 d 105 69\n7fc3 1 105 69\n7fd0 d 575 34\n7fdd 1 575 34\n7fea d 575 34\n7ff7 1 575 34\nFUNC 7ff8 11 0 std::_Select1st<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >::operator()(std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> const&) const\n7ff8 c 550 23\n8004 5 551 41\n8009 1 551 41\n8016 2f 600 34\n8045 1 600 34\n8046 c 84 70\n8052 1e 85 70\nFUNC 8070 11 0 std::_Select1st<std::pair<std::string const, std::pair<char const*, unsigned long long> > >::operator()(std::pair<std::string const, std::pair<char const*, unsigned long long> >&) const\n8070 c 546 23\n807c 5 547 41\n8081 1 547 41\nFUNC 8082 11 0 std::_Select1st<std::pair<std::string const, std::pair<char const*, unsigned long long> > >::operator()(std::pair<std::string const, std::pair<char const*, unsigned long long> > const&) const\n8082 c 550 23\n808e 5 551 41\n8093 1 551 41\n8094 c 128 34\n80a0 13 129 34\n80b3 1 129 34\n80b4 c 84 70\n80c0 1e 85 70\n80de c 65 68\n80ea 2 65 68\n80ec c 103 69\n80f8 d 103 69\n8105 1 103 69\n8106 c 65 68\n8112 2 65 68\n8114 c 72 68\n8120 2 72 68\n8122 c 105 69\n812e d 105 69\n813b 1 105 69\n813c c 103 69\n8148 d 103 69\n8155 1 103 69\n8156 c 105 69\n8162 d 105 69\n816f 1 105 69\n8170 c 80 71\n817c d 80 71\n8189 1 80 71\n818a c 67 68\n8196 2 67 68\n8198 c 99 69\n81a4 14 100 69\nFUNC 81b8 2b 0 std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::get_allocator() const\n81b8 10 93 23\n81c8 1b 94 71\n81e3 1 94 71\n81e4 c 99 69\n81f0 14 100 69\n8210 2 107 68\nFUNC 8212 2e 0 void std::_Destroy<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >(__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>)\n8212 c 171 23\n821e 2 173 73\n8220 12 174 73\n8232 c 173 73\n823e 2 174 73\n824c d 107 68\n8259 1 107 68\n825a c 67 68\n8266 2 67 68\n8268 c 99 69\n8274 14 100 69\n8288 c 403 40\n8294 1c 404 40\n82b0 a 406 40\n82ba a 407 40\n82c4 c 408 40\n82d0 e 409 40\n82de c 553 40\n82ea 36 554 40\n8320 2 555 40\n8322 c 103 69\n832e d 103 69\n833b 1 103 69\nFUNC 833c 2b 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::get_allocator() const\n833c 10 350 23\n834c 1b 351 40\n8367 1 351 40\n8368 c 69 70\n8374 2 69 70\n8382 d 107 68\n838f 1 107 68\n839c d 94 68\n83a9 1 94 68\nFUNC 83aa 2a 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_put_node(std::_Rb_tree_node<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >*)\n83aa c 359 23\n83b6 1e 360 40\nFUNC 83d4 59 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::destroy_node(std::_Rb_tree_node<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >*)\n83d4 d 387 23\n83e1 35 389 40\n8416 17 390 40\n842d 1 390 40\nFUNC 842e 56 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_erase(std::_Rb_tree_node<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >*)\n842e c 1051 23\n843a 2 1054 40\n843c 1a 1056 40\n8456 e 1057 40\n8464 12 1058 40\n8476 6 1059 40\n847c 6 1054 40\n8482 2 1059 40\n8484 d 569 40\n8491 58 570 40\n84e9 1 570 40\n84ea c 147 45\n84f6 31 148 45\n8527 1 148 45\n8528 c 92 45\n8534 d 92 45\n8541 1 92 45\n8542 c 67 68\n854e 2 67 68\n8550 c 99 69\n855c 14 100 69\n8570 c 403 40\n857c 1c 404 40\n8598 a 406 40\n85a2 a 407 40\n85ac c 408 40\n85b8 e 409 40\n85c6 c 553 40\n85d2 36 554 40\n8608 2 555 40\n860a c 103 69\n8616 d 103 69\n8623 1 103 69\nFUNC 8624 2b 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::get_allocator() const\n8624 10 350 23\n8634 1b 351 40\n864f 1 351 40\n8650 c 69 70\n865c d 69 70\n8669 1 69 70\n866a c 69 70\n8676 30 69 70\n86b2 d 107 68\n86bf 1 107 68\n86cc d 94 68\n86d9 1 94 68\nFUNC 86da 2a 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_put_node(std::_Rb_tree_node<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >*)\n86da c 359 23\n86e6 1e 360 40\nFUNC 8704 59 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::destroy_node(std::_Rb_tree_node<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >*)\n8704 d 387 23\n8711 35 389 40\n8746 17 390 40\n875d 1 390 40\nFUNC 875e 56 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_erase(std::_Rb_tree_node<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >*)\n875e c 1051 23\n876a 2 1054 40\n876c 1a 1056 40\n8786 e 1057 40\n8794 12 1058 40\n87a6 6 1059 40\n87ac 6 1054 40\n87b2 2 1059 40\n87b4 d 569 40\n87c1 58 570 40\n8819 1 570 40\n881a c 147 45\n8826 31 148 45\n8857 1 148 45\n8858 c 92 45\n8864 d 92 45\n8871 1 92 45\n8872 c 603 72\n887e c 603 72\nFUNC 888a 23 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::begin()\n888a c 333 23\n8896 17 334 71\n88ad 1 334 71\n88ba 2a 654 72\nFUNC 88e4 42 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::operator[](unsigned long)\n88e4 c 494 23\n88f0 36 495 71\nFUNC 8926 26 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::end()\n8926 c 351 23\n8932 1a 352 71\nFUNC 894c 28 0 bool std::operator==<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)\n894c c 2115 24\n8958 1c 2116 37\nFUNC 8974 23 0 std::equal_to<std::string>::operator()(std::string const&, std::string const&) const\n8974 c 199 24\n8980 17 200 41\n8997 1 200 41\n8998 c 80 71\n89a4 d 80 71\n89b1 1 80 71\n89b2 c 67 68\n89be 2 67 68\n89c0 c 99 69\n89cc 14 100 69\nFUNC 89e0 2b 0 std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::get_allocator() const\n89e0 10 93 24\n89f0 1b 94 71\n8a0b 1 94 71\n8a0c c 99 69\n8a18 14 100 69\n8a2c c 84 71\n8a38 2f 85 71\n8a67 2 86 71\n8a69 1 86 71\n8a6a c 96 71\n8a76 12 97 71\n8a88 2 98 71\n8a96 2 107 68\nFUNC 8a98 2e 0 void std::_Destroy<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >(__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>)\n8a98 c 171 24\n8aa4 2 173 73\n8aa6 12 174 73\n8ab8 c 173 73\n8ac4 2 174 73\nFUNC 8ac6 13 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::max_size() const\n8ac6 c 407 24\n8ad2 7 408 71\n8ad9 1 408 71\n8ada c 603 72\n8ae6 c 603 72\nFUNC 8af2 26 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::end()\n8af2 c 351 24\n8afe 1a 352 71\nFUNC 8b18 23 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::begin()\n8b18 c 333 24\n8b24 17 334 71\n8b3b 1 334 71\n8b48 2a 654 72\n8b7e 7 614 72\n8b85 1 614 72\nFUNC 8b86 42 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::operator[](unsigned long)\n8b86 c 494 24\n8b92 36 495 71\n8bd4 d 107 68\n8be1 1 107 68\nFUNC 8be2 28 0 void std::swap<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**&, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**&)\n8be2 c 92 25\n8bee 8 97 61\n8bf6 a 98 61\n8c00 a 99 61\nFUNC 8c0a 50 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::swap(std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >&)\n8c0a c 733 25\n8c16 12 735 71\n8c28 18 736 71\n8c40 1a 737 71\n8c66 2b 596 34\n8c91 1 596 34\n8c9e 2f 600 34\n8ccd 1 600 34\nFUNC 8cce 28 0 void std::swap<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**&, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**&)\n8cce c 92 25\n8cda 8 97 61\n8ce2 a 98 61\n8cec a 99 61\nFUNC 8cf6 50 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::swap(std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >&)\n8cf6 c 733 25\n8d02 12 735 71\n8d14 18 736 71\n8d2c 1a 737 71\n8d46 c 84 71\n8d52 2f 85 71\n8d81 2 86 71\n8d83 1 86 71\n8d84 c 96 71\n8d90 12 97 71\n8da2 2 98 71\nFUNC 8da4 13 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::max_size() const\n8da4 c 407 25\n8db0 7 408 71\n8db7 1 408 71\n8dc4 d 94 68\n8dd1 1 94 68\nFUNC 8dd2 2f 0 std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::_M_deallocate(__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long)\n8dd2 c 120 25\n8dde 6 122 71\n8de4 1d 123 71\n8e01 1 123 71\n8e02 c 108 71\n8e0e 3d 109 71\n8e4b 1 109 71\n8e4c c 272 71\n8e58 4b 273 71\n8ea3 1 273 71\n8ea4 c 188 71\n8eb0 12 189 71\n8ec2 2 190 71\n8ec4 c 603 72\n8ed0 c 603 72\nFUNC 8edc 2b 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::begin() const\n8edc c 342 25\n8ee8 1f 343 71\n8f07 1 343 71\nFUNC 8f08 2c 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::end() const\n8f08 c 360 25\n8f14 20 361 71\n8f40 5 666 72\n8f45 1 666 72\n8f53 2b 759 72\nFUNC 8f7e 3c 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::size() const\n8f7e c 402 25\n8f8a 30 403 71\n8fc6 26 588 34\n8ff8 15 511 34\n900d 79 513 34\n9086 21 517 34\n90a7 1 517 34\n90b4 14 225 42\n90d4 26 592 34\nFUNC 90fa 49 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::capacity() const\n90fa c 449 25\n9106 3d 451 71\n9143 1 451 71\n9144 c 103 69\n9150 d 103 69\n915d 1 103 69\n916e 1b 286 34\n9189 1 286 34\n9196 d 94 68\n91a3 1 94 68\n91b0 1e 301 34\n91db 56 622 34\n9231 17 623 34\n9254 9 1080 34\n925d 1a 1082 34\n9277 2 1083 34\n9279 8 1085 34\n9281 12 1086 34\n9293 6 1087 34\n9299 6 1083 34\n929f 1b 1089 34\n92ba 1d 1080 34\n92d7 c 1091 34\n92e3 1 1091 34\n92e4 d 360 34\n92f1 77 361 34\n9368 c 93 42\n9374 d 93 42\n9381 1 93 42\n9382 c 72 68\n938e 2 72 68\n9390 c 105 69\n939c d 105 69\n93a9 1 105 69\n93aa c 301 66\n93b6 d 301 66\n93c3 1 301 66\n93d0 d 94 68\n93dd 1 94 68\nFUNC 93de 2f 0 std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::_M_deallocate(__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long)\n93de c 120 26\n93ea 6 122 71\n93f0 1d 123 71\n940d 1 123 71\n940e c 108 71\n941a 3d 109 71\n9457 1 109 71\n9458 c 188 71\n9464 12 189 71\n9476 2 190 71\n9478 c 272 71\n9484 4b 273 71\n94cf 1 273 71\n94d0 c 603 72\n94dc c 603 72\nFUNC 94e8 2b 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::begin() const\n94e8 c 342 26\n94f4 1f 343 71\n9513 1 343 71\nFUNC 9514 2c 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::end() const\n9514 c 360 26\n9520 20 361 71\n954c 2d 662 72\n9579 1 662 72\nFUNC 957a 2d 0 unsigned long const& std::max<unsigned long>(unsigned long const&, unsigned long const&)\n957a c 206 26\n9586 e 211 61\n9594 8 212 61\n959c b 213 61\n95a7 1 213 61\n95b4 19 650 72\n95cd 1 650 72\n95da 5 666 72\n95df 1 666 72\n95ed 2b 759 72\n9624 5 666 72\n9629 1 666 72\n9637 2b 759 72\nFUNC 9662 49 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::capacity() const\n9662 c 449 26\n966e 3d 451 71\n96ab 1 451 71\nFUNC 96ac 3c 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::size() const\n96ac c 402 26\n96b8 30 403 71\n96f4 26 588 34\n9726 26 592 34\n974c c 103 69\n9758 d 103 69\n9765 1 103 69\n9776 1b 286 34\n9791 1 286 34\n979e d 94 68\n97ab 1 94 68\n97b8 1e 301 34\n97e3 56 622 34\n9839 17 623 34\n985c 9 1080 34\n9865 1a 1082 34\n987f 2 1083 34\n9881 8 1085 34\n9889 12 1086 34\n989b 6 1087 34\n98a1 6 1083 34\n98a7 1b 1089 34\n98c2 1d 1080 34\n98df c 1091 34\n98eb 1 1091 34\n98ec d 360 34\n98f9 77 361 34\n9970 c 69 70\n997c 20 69 70\n99a9 5c 104 68\n9a05 1 104 68\n9a06 c 69 70\n9a12 2c 69 70\n9a4b 5c 104 68\n9aa7 1 104 68\n9ab4 2d 662 72\n9ae1 1 662 72\n9aee 19 650 72\n9b07 1 650 72\n9b14 5 666 72\n9b19 1 666 72\n9b27 2b 759 72\n9b52 c 72 68\n9b5e 2 72 68\n9b60 c 105 69\n9b6c d 105 69\n9b79 1 105 69\n9b7a c 69 70\n9b86 2 69 70\n9b94 d 107 68\n9ba1 1 107 68\n9bae d 94 68\n9bbb 1 94 68\nFUNC 9bbc 2a 0 std::_List_base<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_put_node(std::_List_node<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >*)\n9bbc c 315 26\n9bc8 1e 316 66\nFUNC 9be6 35 0 bool __gnu_cxx::operator!=<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > > const&, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > > const&)\n9be6 d 699 26\n9bf3 28 700 72\n9c1b 1 700 72\n9c28 d 623 72\n9c35 5 624 72\nFUNC 9c3a 4b 0 void std::__fill<true>::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&)\n9c3a c 539 61\n9c46 8 541 61\n9c4e 2 542 61\n9c50 12 543 61\n9c62 21 542 61\n9c83 2 543 61\n9c85 1 543 61\nFUNC 9c86 2b 0 void std::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&)\n9c86 c 560 26\n9c92 4 567 61\n9c96 1b 568 61\n9cb1 1 568 61\nFUNC 9cb2 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>)\n9cb2 c 171 26\n9cbe 2 173 73\n9cc0 1a 174 73\n9cda 21 173 73\n9cfb 2 174 73\n9cfd 1 174 73\n9d0a 7 98 68\n9d11 1 98 68\n9d1e 1d 85 68\n9d3b 5 86 68\n9d40 16 88 68\n9d62 1d 297 34\n9d7f 1 297 34\n9d8d e 605 34\n9d9b 9 606 34\n9da4 3c 609 34\n9de0 b 610 34\n9deb 11 609 34\n9dfc b 612 34\n9e07 12 614 34\n9e19 b 615 34\n9e24 13 612 34\n9e37 8 615 34\n9e3f 1 615 34\n9e4d 15 751 34\n9e62 1a 752 34\n9e7c b 754 34\n9e87 49 755 34\n9ed0 3b 756 34\n9f0b 12 754 34\n9f1d 15 758 34\n9f32 8 759 34\n9f3a 1c 760 34\n9f56 f 761 34\n9f65 41 762 34\n9fb2 7 98 68\n9fb9 1 98 68\n9fc6 1d 85 68\n9fe3 5 86 68\n9fe8 17 88 68\n9fff 1 88 68\na00c 1d 297 34\na029 1 297 34\na037 e 605 34\na045 9 606 34\na04e 3c 609 34\na08a b 610 34\na095 11 609 34\na0a6 b 612 34\na0b1 12 614 34\na0c3 b 615 34\na0ce 13 612 34\na0e1 8 615 34\na0e9 1 615 34\na0f7 15 751 34\na10c 1a 752 34\na126 b 754 34\na131 49 755 34\na17a 3b 756 34\na1b5 12 754 34\na1c7 15 758 34\na1dc 8 759 34\na1e4 1c 760 34\na200 f 761 34\na20f 41 762 34\nFUNC a250 35 0 bool __gnu_cxx::operator!=<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > > const&, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > > const&)\na250 d 699 26\na25d 28 700 72\na285 1 700 72\na292 d 623 72\na29f 5 624 72\nFUNC a2a4 4b 0 void std::__fill<true>::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&)\na2a4 c 539 61\na2b0 8 541 61\na2b8 2 542 61\na2ba 12 543 61\na2cc 21 542 61\na2ed 2 543 61\na2ef 1 543 61\nFUNC a2f0 2b 0 void std::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&)\na2f0 c 560 26\na2fc 4 567 61\na300 1b 568 61\na31b 1 568 61\nFUNC a31c 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>)\na31c c 171 26\na328 2 173 73\na32a 1a 174 73\na344 21 173 73\na365 2 174 73\na367 1 174 73\na368 c 65 68\na374 2 65 68\na376 c 103 69\na382 d 103 69\na38f 1 103 69\nFUNC a390 2b 0 std::_List_base<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::get_allocator() const\na390 10 322 26\na3a0 1b 324 66\na3bb 1 324 66\nFUNC a3bc 7b 0 std::_List_base<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_clear()\na3bc d 69 27\na3c9 8 72 77\na3d1 2 73 77\na3d3 6 75 77\na3d9 8 76 77\na3e1 35 77 77\na416 12 78 77\na428 a 73 77\na432 5 78 77\na437 1 78 77\na438 c 331 66\na444 18 332 66\na45c c 392 66\na468 d 392 66\na475 1 392 66\na476 c 211 74\na482 10 211 74\na49e d 107 68\na4ab 1 107 68\nFUNC a4ac 2e 0 void std::_Destroy<dwarf2reader::CompilationUnit::Abbrev*, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, std::allocator<dwarf2reader::CompilationUnit::Abbrev>)\na4ac c 171 27\na4b8 2 173 73\na4ba 12 174 73\na4cc c 173 73\na4d8 2 174 73\na4da c 272 71\na4e6 4b 273 71\na531 1 273 71\na532 13 196 74\na545 10 196 74\na555 2f 197 74\na584 1a 198 74\na59e 13 196 74\na5b1 10 196 74\na5c1 2f 197 74\na5f0 1a 198 74\na616 7 98 68\na61d 1 98 68\na62a 1d 85 68\na647 5 86 68\na64c 10 88 68\nFUNC a65c 2a 0 std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::_M_allocate(unsigned long)\na65c c 116 27\na668 1e 117 71\na686 d 100 71\na693 12 101 71\na6a5 19 103 71\na6be b 104 71\na6c9 3a 105 71\na703 1 105 71\na710 7 98 68\na717 1 98 68\na724 1d 85 68\na741 5 86 68\na746 10 88 68\nFUNC a756 2a 0 std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::_M_allocate(unsigned long)\na756 c 116 27\na762 1e 117 71\na780 d 100 71\na78d 12 101 71\na79f 19 103 71\na7b8 b 104 71\na7c3 3a 105 71\na7fd 1 105 71\na80b 12 424 61\na81d 2e 425 61\na84b 13 426 61\na86a 4 440 61\na86e 1b 443 61\na889 1 443 61\na898 56 482 61\na8fa 4 514 61\na8fe 4 515 61\na902 1b 517 61\na91d 1 517 61\na92a 8 616 61\na932 2 617 61\na934 8 618 61\na93c f 617 61\na94b 5 619 61\na95c 4 641 61\na960 1b 642 61\na97b 1 642 61\nFUNC a97c 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&, __true_type)\na97c c 182 28\na988 1b 183 79\na9a3 1 183 79\nFUNC a9a4 2f 0 void std::uninitialized_fill_n<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&)\na9a4 c 214 28\na9b0 23 218 79\na9d3 1 218 79\nFUNC a9d4 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>)\na9d4 c 308 28\na9e0 1b 310 79\na9fb 1 310 79\na9fc c 200 71\naa08 19 201 71\naa21 42 203 71\naa63 15 205 71\naa85 11 992 34\naa96 c 993 34\naaa2 15 995 34\naab7 c 996 34\naac3 4a 998 34\nab0d f 1001 34\nab1c 1c 998 34\nab38 1a 1003 34\nab52 5 1004 34\nab57 1f 1007 34\nab76 1c 1008 34\nab92 19 1009 34\nabab 19 1010 34\nabc4 1a 1011 34\nabde a 1004 34\nabe8 11 1001 34\nabf9 15 1014 34\nac0e 13 1028 34\nac21 b 1016 34\nac2c 9 1018 34\nac35 19 1023 34\nac4e 23 1024 34\nac71 19 1025 34\nac8a 1d 1021 34\naca7 1a 1018 34\nacc1 b 1028 34\naccc b 1016 34\nacd7 1e 1028 34\nacf5 1 1028 34\nad06 16 438 34\nad1c 37 439 34\nad53 1 439 34\nad64 37 212 42\nad9b 1 212 42\nada8 8 616 61\nadb0 2 617 61\nadb2 8 618 61\nadba f 617 61\nadc9 5 619 61\nadda 4 641 61\nadde 1b 642 61\nadf9 1 642 61\nFUNC adfa 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&, __true_type)\nadfa c 182 28\nae06 1b 183 79\nae21 1 183 79\nFUNC ae22 2f 0 void std::uninitialized_fill_n<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&)\nae22 c 214 28\nae2e 23 218 79\nae51 1 218 79\nFUNC ae52 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>)\nae52 c 308 28\nae5e 1b 310 79\nae79 1 310 79\nae7a c 200 71\nae86 19 201 71\nae9f 42 203 71\naee1 15 205 71\naf03 11 992 34\naf14 c 993 34\naf20 15 995 34\naf35 c 996 34\naf41 4a 998 34\naf8b f 1001 34\naf9a 1c 998 34\nafb6 1a 1003 34\nafd0 5 1004 34\nafd5 1f 1007 34\naff4 1c 1008 34\nb010 19 1009 34\nb029 19 1010 34\nb042 1a 1011 34\nb05c a 1004 34\nb066 11 1001 34\nb077 15 1014 34\nb08c 13 1028 34\nb09f b 1016 34\nb0aa 9 1018 34\nb0b3 19 1023 34\nb0cc 23 1024 34\nb0ef 19 1025 34\nb108 1d 1021 34\nb125 1a 1018 34\nb13f b 1028 34\nb14a b 1016 34\nb155 1e 1028 34\nb173 1 1028 34\nb184 16 438 34\nb19a 37 439 34\nb1d1 1 439 34\nb1e2 37 212 42\nb219 1 212 42\nb227 12 424 61\nb239 2e 425 61\nb267 13 426 61\nb286 4 440 61\nb28a 1b 443 61\nb2a5 1 443 61\nb2b4 56 482 61\nb316 4 514 61\nb31a 4 515 61\nb31e 1b 517 61\nb339 1 517 61\nb346 8 616 61\nb34e 2 617 61\nb350 12 618 61\nb362 16 617 61\nb378 5 619 61\nb37d 1 619 61\nb38a 4 641 61\nb38e 1b 642 61\nb3a9 1 642 61\nFUNC b3aa 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&, __true_type)\nb3aa c 182 28\nb3b6 1b 183 79\nb3d1 1 183 79\nFUNC b3d2 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&)\nb3d2 c 214 28\nb3de 23 218 79\nb401 1 218 79\nFUNC b402 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>)\nb402 c 308 28\nb40e 1b 310 79\nb429 1 310 79\nb436 8 616 61\nb43e 2 617 61\nb440 12 618 61\nb452 16 617 61\nb468 5 619 61\nb46d 1 619 61\nb47a 4 641 61\nb47e 1b 642 61\nb499 1 642 61\nFUNC b49a 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&, __true_type)\nb49a c 182 28\nb4a6 1b 183 79\nb4c1 1 183 79\nFUNC b4c2 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&)\nb4c2 c 214 28\nb4ce 23 218 79\nb4f1 1 218 79\nFUNC b4f2 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>)\nb4f2 c 308 28\nb4fe 1b 310 79\nb519 1 310 79\nb526 22 300 61\nb548 11 301 61\nb559 1 301 61\nb566 4 315 61\nb56a 1b 317 61\nb585 1 317 61\nb592 1b 326 61\nb5ad 1 326 61\nb5ba 4 384 61\nb5be 4 385 61\nb5c2 1b 387 61\nb5dd 1 387 61\nb5ea 1b 74 79\nb605 1 74 79\nb612 23 113 79\nb635 1 113 79\nb642 1b 254 79\nb65d 1 254 79\nb66a 15 763 71\nb67f 40 766 71\nb6bf 3 768 71\nb6c2 2 773 71\nFUNC b6c4 124 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::reserve(unsigned long)\nb6c4 13 69 29\nb6d7 15 71 78\nb6ec e 72 78\nb6fa 19 73 78\nb713 e 75 78\nb721 28 78 78\nb749 3e 79 78\nb787 30 81 78\nb7b7 8 84 78\nb7bf 11 85 78\nb7d0 18 86 78\nb7f5 33 335 61\nb834 4 384 61\nb838 4 385 61\nb83c 1b 387 61\nb857 1 387 61\nb864 1b 74 79\nb87f 1 74 79\nb88c 23 113 79\nb8af 1 113 79\nb8bc 1b 254 79\nb8d7 1 254 79\nb8e6 56 354 61\nb948 4 384 61\nb94c 4 385 61\nb950 1b 387 61\nb96b 1 387 61\nb978 1b 74 79\nb993 1 74 79\nb9a0 23 113 79\nb9c3 1 113 79\nb9d0 1b 254 79\nb9eb 1 254 79\nFUNC b9ec 46e 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::_M_fill_insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&)\nb9ec 14 311 29\nba00 b 313 78\nba0b 24 315 78\nba2f 8 318 78\nba37 23 319 78\nba5a 15 320 78\nba6f c 321 78\nba7b 51 323 78\nbacc 14 327 78\nbae0 30 328 78\nbb10 35 330 78\nbb45 48 334 78\nbb8d 17 338 78\nbba4 43 339 78\nbbe7 14 342 78\nbbfb 1e 343 78\nbc19 e 348 78\nbc27 1e 349 78\nbc45 e 350 78\nbc53 1d 353 78\nbc70 8 354 78\nbc78 e 355 78\nbc86 27 357 78\nbcad 6 358 78\nbcb3 4d 361 78\nbd00 40 365 78\nbd40 18 367 78\nbd58 4d 368 78\nbda5 3e 379 78\nbde3 30 381 78\nbe13 12 384 78\nbe25 13 385 78\nbe38 22 386 78\nFUNC be5a 2e 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&)\nbe5a c 657 29\nbe66 22 658 71\nbe94 15 580 34\nbea9 15 581 34\nbebe 37 582 34\nbef5 c 583 34\nbf01 1 583 34\nbf02 d 335 34\nbf0f 4e 337 34\nbf5d 4d 338 34\nbfaa d 134 42\nbfb7 65 135 42\nc028 22 300 61\nc04a 11 301 61\nc05b 1 301 61\nc068 4 315 61\nc06c 1b 317 61\nc087 1 317 61\nc094 1b 326 61\nc0af 1 326 61\nc0bc 4 384 61\nc0c0 4 385 61\nc0c4 1b 387 61\nc0df 1 387 61\nc0ec 1b 74 79\nc107 1 74 79\nc114 23 113 79\nc137 1 113 79\nc144 1b 254 79\nc15f 1 254 79\nc16c 15 763 71\nc181 40 766 71\nc1c1 3 768 71\nc1c4 2 773 71\nFUNC c1c6 124 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::reserve(unsigned long)\nc1c6 13 69 29\nc1d9 15 71 78\nc1ee e 72 78\nc1fc 19 73 78\nc215 e 75 78\nc223 28 78 78\nc24b 3e 79 78\nc289 30 81 78\nc2b9 8 84 78\nc2c1 11 85 78\nc2d2 18 86 78\nc2f7 33 335 61\nc336 4 384 61\nc33a 4 385 61\nc33e 1b 387 61\nc359 1 387 61\nc366 1b 74 79\nc381 1 74 79\nc38e 23 113 79\nc3b1 1 113 79\nc3be 1b 254 79\nc3d9 1 254 79\nc3e8 56 354 61\nc44a 4 384 61\nc44e 4 385 61\nc452 1b 387 61\nc46d 1 387 61\nc47a 1b 74 79\nc495 1 74 79\nc4a2 23 113 79\nc4c5 1 113 79\nc4d2 1b 254 79\nc4ed 1 254 79\nFUNC c4ee 46e 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::_M_fill_insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&)\nc4ee 14 311 29\nc502 b 313 78\nc50d 24 315 78\nc531 8 318 78\nc539 23 319 78\nc55c 15 320 78\nc571 c 321 78\nc57d 51 323 78\nc5ce 14 327 78\nc5e2 30 328 78\nc612 35 330 78\nc647 48 334 78\nc68f 17 338 78\nc6a6 43 339 78\nc6e9 14 342 78\nc6fd 1e 343 78\nc71b e 348 78\nc729 1e 349 78\nc747 e 350 78\nc755 1d 353 78\nc772 8 354 78\nc77a e 355 78\nc788 27 357 78\nc7af 6 358 78\nc7b5 4d 361 78\nc802 40 365 78\nc842 18 367 78\nc85a 4d 368 78\nc8a7 3e 379 78\nc8e5 30 381 78\nc915 12 384 78\nc927 13 385 78\nc93a 22 386 78\nFUNC c95c 2e 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&)\nc95c c 657 29\nc968 22 658 71\nc996 15 580 34\nc9ab 15 581 34\nc9c0 37 582 34\nc9f7 c 583 34\nca03 1 583 34\nca04 d 335 34\nca11 4e 337 34\nca5f 4d 338 34\ncaac d 134 42\ncab9 65 135 42\nFUNC cb1e 44 0 dwarf2reader::CUFunctionInfoHandler::StartCompilationUnit(unsigned long long, unsigned char, unsigned char, unsigned long long, unsigned char)\ncb1e 39 135 42\ncb57 5 102 30\ncb5c 6 103 30\nFUNC cb62 41 0 dwarf2reader::CUFunctionInfoHandler::ProcessAttributeString(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, std::string const&)\ncb62 18 136 30\ncb7a 10 137 30\ncb8a 17 138 30\ncba1 2 139 30\ncba3 1 139 30\nFUNC cba4 2a5 0 dwarf2reader::CUFunctionInfoHandler::ProcessAttributeUnsigned(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, unsigned long long)\ncba4 2d 144 30\ncbd1 a 145 30\ncbdb 58 146 30\ncc33 35 147 30\ncc68 32 146 30\ncc9a 2a 147 30\nccc4 82 152 30\ncd46 18 153 30\ncd5e 1c 152 30\ncd7a 2f 153 30\ncda9 e 154 30\ncdb7 28 155 30\ncddf 12 157 30\ncdf1 2 158 30\ncdf3 12 160 30\nce05 2 161 30\nce07 c 163 30\nce13 2 164 30\nce15 2c 166 30\nce41 8 172 30\nce49 1 172 30\nFUNC ce4a 19c 0 dwarf2reader::CULineInfoHandler::AddLine(unsigned long long, unsigned int, unsigned int, unsigned int)\nce4a 20 84 30\nce6a 1c 85 30\nce86 9c 87 30\ncf22 4f 89 30\ncf71 19 87 30\ncf8a 25 90 30\ncfaf 30 93 30\ncfdf 7 95 30\nFUNC cfe6 9f 0 dwarf2reader::CUFunctionInfoHandler::EndDIE(unsigned long long)\ncfe6 19 174 30\ncfff 1c 175 30\nd01b 65 177 30\nd080 5 178 30\nd085 1 178 30\nFUNC d086 164 0 dwarf2reader::CUFunctionInfoHandler::StartDIE(unsigned long long, dwarf2reader::DwarfTag, std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > > const&)\nd086 20 111 30\nd0a6 1c 112 30\nd0c2 c 126 30\nd0ce 23 115 30\nd0f1 26 116 30\nd117 1a 117 30\nd131 d 118 30\nd13e 1b 119 30\nd159 5f 120 30\nd1b8 c 124 30\nd1c4 1c 115 30\nd1e0 3 126 30\nd1e3 7 129 30\nFUNC d1ea 73 0 dwarf2reader::CULineInfoHandler::DefineDir(std::string const&, unsigned int)\nd1ea 13 52 30\nd1fd 45 54 30\nd242 15 55 30\nd257 6 56 30\nd25d 1 56 30\nFUNC d25e 23b 0 dwarf2reader::CULineInfoHandler::DefineFile(std::string const&, int, unsigned int, unsigned long long, unsigned long long)\nd25e 2c 60 30\nd28a 45 62 30\nd2cf 2f 65 30\nd2fe 24 66 30\nd322 b 68 30\nd32d e 69 30\nd33b 19 71 30\nd354 17 72 30\nd36b 93 74 30\nd3fe 64 77 30\nd462 30 79 30\nd492 7 81 30\nd499 1 81 30\nd49a 14 38 30\nd4ae 36 40 30\nd4e4 41 43 30\nd525 41 44 30\nd566 67 45 30\nd5cd 10 46 30\nd5dd 13 45 30\nd5f0 15 47 30\nd605 e 48 30\nd613 3d 49 30\nd650 20 50 30\nd670 14 38 30\nd684 36 40 30\nd6ba 41 43 30\nd6fb 41 44 30\nd73c 67 45 30\nd7a3 10 46 30\nd7b3 13 45 30\nd7c6 15 47 30\nd7db e 48 30\nd7e9 3d 49 30\nd826 20 50 30\nd846 12 125 74\nd858 12 125 74\nd86a 13 55 32\nd87d 35 55 32\nd8b2 13 98 32\nd8c5 35 98 32\nd8fa c 35 32\nd906 d 35 32\nd913 1 35 32\nd914 d 22 32\nd921 40 22 32\nd961 1 22 32\nd962 c 89 70\nd96e 1e 90 70\nd998 14 208 34\nd9ac c 190 67\nd9b8 a 190 67\nd9c2 c 259 67\nd9ce 21 259 67\nd9ef 1 259 67\nFUNC d9f0 13 0 std::auto_ptr<dwarf2reader::LineInfo>::operator->() const\nd9f0 c 283 35\nd9fc 7 286 67\nda03 1 286 67\nda11 5c 104 68\nda6d 1 104 68\nFUNC da6e 28 0 bool std::operator==<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)\nda6e c 2139 37\nda7a 1c 2140 37\nFUNC da96 5d 0 std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)\nda96 d 2081 37\ndaa3 12 2083 37\ndab5 1a 2084 37\ndacf 24 2085 37\ndaf3 1 2085 37\nFUNC daf4 5d 0 std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)\ndaf4 d 2044 37\ndb01 12 2046 37\ndb13 1a 2047 37\ndb2d 24 2048 37\ndb51 1 2048 37\ndb52 c 84 70\ndb5e 17 85 70\ndb75 1 85 70\nFUNC db76 2d 0 std::pair<char const*, unsigned int> std::make_pair<char const*, unsigned int>(char const*, unsigned int)\ndb76 c 144 37\ndb82 21 145 70\ndba3 1 145 70\ndba4 c 84 70\ndbb0 23 85 70\ndbd3 1 85 70\nFUNC dbd4 3c 0 std::pair<unsigned long long, std::pair<char const*, unsigned int> > std::make_pair<unsigned long long, std::pair<char const*, unsigned int> >(unsigned long long, std::pair<char const*, unsigned int>)\ndbd4 1c 144 37\ndbf0 20 145 70\ndc10 d 89 70\ndc1d 64 90 70\ndc81 1 90 70\ndc82 c 89 70\ndc8e 2a 90 70\ndcb8 c 84 70\ndcc4 1d 85 70\ndce1 1 85 70\nFUNC dce2 3c 0 std::pair<unsigned long long, dwarf2reader::FunctionInfo*> std::make_pair<unsigned long long, dwarf2reader::FunctionInfo*>(unsigned long long, dwarf2reader::FunctionInfo*)\ndce2 1c 144 37\ndcfe 20 145 70\ndd2a a 190 34\ndd40 d 194 34\ndd4d 1 194 34\ndd4e c 603 72\ndd5a c 603 72\nFUNC dd66 2b 0 std::vector<std::string, std::allocator<std::string> >::begin() const\ndd66 c 342 39\ndd72 1f 343 71\ndd91 1 343 71\nFUNC dd92 2c 0 std::vector<std::string, std::allocator<std::string> >::end() const\ndd92 c 360 39\ndd9e 20 361 71\nddca 5 666 72\nddcf 1 666 72\ndddd 2b 759 72\nFUNC de08 3c 0 std::vector<std::string, std::allocator<std::string> >::size() const\nde08 c 402 39\nde14 30 403 71\nFUNC de44 2b 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::begin() const\nde44 c 342 39\nde50 1f 343 71\nde6f 1 343 71\nFUNC de70 2c 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::end() const\nde70 c 360 39\nde7c 20 361 71\ndea9 31 759 72\nFUNC deda 3c 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::size() const\ndeda c 402 39\ndee6 30 403 71\ndf16 c 603 72\ndf22 c 603 72\nFUNC df2e 26 0 std::vector<std::string, std::allocator<std::string> >::end()\ndf2e c 351 39\ndf3a 1a 352 71\ndf60 7 614 72\ndf67 1 614 72\nFUNC df68 13 0 std::vector<std::string, std::allocator<std::string> >::max_size() const\ndf68 c 407 39\ndf74 7 408 71\ndf7b 1 408 71\ndf88 5 666 72\ndf8d 1 666 72\ndf9a d 623 72\ndfa7 5 624 72\nFUNC dfac 23 0 std::vector<std::string, std::allocator<std::string> >::begin()\ndfac c 333 39\ndfb8 17 334 71\ndfcf 1 334 71\ndfd0 c 35 32\ndfdc 26 35 32\ne00f 5c 104 68\ne06b 1 104 68\ne078 7 614 72\ne07f 1 614 72\nFUNC e080 35 0 dwarf2reader::SourceFileInfo::operator=(dwarf2reader::SourceFileInfo const&)\ne080 c 35 39\ne08c 29 35 32\ne0b5 1 35 32\nFUNC e0b6 13 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::max_size() const\ne0b6 c 407 39\ne0c2 7 408 71\ne0c9 1 408 71\ne0d6 d 623 72\ne0e3 5 624 72\nFUNC e0e8 3c 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::_M_range_check(unsigned long) const\ne0e8 13 515 39\ne0fb 15 517 71\ne110 14 518 71\nFUNC e124 3c 0 std::vector<std::string, std::allocator<std::string> >::_M_range_check(unsigned long) const\ne124 13 515 39\ne137 15 517 71\ne14c 14 518 71\ne16c 2a 654 72\nFUNC e196 42 0 std::vector<std::string, std::allocator<std::string> >::operator[](unsigned long)\ne196 c 494 39\ne1a2 36 495 71\nFUNC e1d8 32 0 std::vector<std::string, std::allocator<std::string> >::at(unsigned long)\ne1d8 c 534 39\ne1e4 12 536 71\ne1f6 14 537 71\ne216 32 654 72\nFUNC e248 42 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::operator[](unsigned long)\ne248 c 494 39\ne254 36 495 71\nFUNC e28a 32 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::at(unsigned long)\ne28a c 534 39\ne296 12 536 71\ne2a8 14 537 71\nFUNC e2bc 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_end()\ne2bc c 472 40\ne2c8 8 473 40\nFUNC e2d0 11 0 std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >::operator()(std::pair<unsigned long long const, std::pair<std::string, unsigned int> > const&) const\ne2d0 c 550 41\ne2dc 5 551 41\ne2e1 1 551 41\nFUNC e2e2 53 0 std::less<unsigned long long>::operator()(unsigned long long const&, unsigned long long const&) const\ne2e2 c 226 41\ne2ee 47 227 41\ne335 1 227 41\nFUNC e336 20 0 std::_Rb_tree_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >::operator==(std::_Rb_tree_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > const&) const\ne336 c 209 41\ne342 14 210 40\ne356 c 84 70\ne362 18 85 70\nFUNC e37a 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_end()\ne37a c 472 41\ne386 8 473 40\nFUNC e38e 11 0 std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator()(std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> const&) const\ne38e c 550 41\ne39a 5 551 41\ne39f 1 551 41\nFUNC e3a0 20 0 std::_Rb_tree_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator==(std::_Rb_tree_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > const&) const\ne3a0 c 209 41\ne3ac 14 210 40\ne3c0 c 84 70\ne3cc 18 85 70\ne3e4 c 180 34\ne3f0 13 181 34\ne403 1 181 34\ne410 22 409 34\ne43e d 207 42\ne44b 1 207 42\nFUNC e44c 35 0 bool __gnu_cxx::operator!=<std::string*, std::vector<std::string, std::allocator<std::string> > >(__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > > const&, __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > > const&)\ne44c d 699 42\ne459 28 700 72\ne481 1 700 72\nFUNC e482 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, std::allocator<std::string> >(__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, std::allocator<std::string>)\ne482 c 171 43\ne48e 2 173 73\ne490 1a 174 73\ne4aa 21 173 73\ne4cb 2 174 73\ne4cd 1 174 73\nFUNC e4ce 35 0 bool __gnu_cxx::operator!=<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >(__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > const&, __gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > const&)\ne4ce d 699 43\ne4db 28 700 72\ne503 1 700 72\nFUNC e504 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, std::allocator<dwarf2reader::SourceFileInfo> >(__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, __gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, std::allocator<dwarf2reader::SourceFileInfo>)\ne504 c 171 43\ne510 2 173 73\ne512 1a 174 73\ne52c 21 173 73\ne54d 2 174 73\ne54f 1 174 73\nFUNC e550 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_S_value(std::_Rb_tree_node<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > const*)\ne550 c 480 43\ne55c 8 481 40\nFUNC e564 28 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_S_key(std::_Rb_tree_node<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > const*)\ne564 c 484 43\ne570 1c 485 40\nFUNC e58c 25 0 std::_Rb_tree_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator--()\ne58c c 194 43\ne598 14 196 40\ne5ac 5 197 40\ne5b1 1 197 40\nFUNC e5b2 25 0 std::_Rb_tree_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >::operator--()\ne5b2 c 194 43\ne5be 14 196 40\ne5d2 5 197 40\ne5d7 1 197 40\nFUNC e5d8 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_S_value(std::_Rb_tree_node_base const*)\ne5d8 c 504 43\ne5e4 8 505 40\nFUNC e5ec 28 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_S_key(std::_Rb_tree_node_base const*)\ne5ec c 508 43\ne5f8 1c 509 40\nFUNC e614 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_S_value(std::_Rb_tree_node<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > const*)\ne614 c 480 43\ne620 8 481 40\nFUNC e628 28 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_S_key(std::_Rb_tree_node<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > const*)\ne628 c 484 43\ne634 1c 485 40\nFUNC e650 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_S_value(std::_Rb_tree_node_base const*)\ne650 c 504 43\ne65c 8 505 40\nFUNC e664 28 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_S_key(std::_Rb_tree_node_base const*)\ne664 c 508 43\ne670 1c 509 40\ne698 7 614 72\ne69f 1 614 72\ne6ac 7 98 68\ne6b3 1 98 68\ne6c0 1d 85 68\ne6dd 5 86 68\ne6e2 10 88 68\nFUNC e6f2 2a 0 std::_Vector_base<std::string, std::allocator<std::string> >::_M_allocate(unsigned long)\ne6f2 c 116 43\ne6fe 1e 117 71\ne728 7 98 68\ne72f 1 98 68\ne73c 1d 85 68\ne759 5 86 68\ne75e 16 88 68\nFUNC e774 2a 0 std::_Vector_base<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::_M_allocate(unsigned long)\ne774 c 116 43\ne780 1e 117 71\ne7aa 3a 104 68\ne7f0 2a 654 72\nFUNC e81a 42 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::operator[](unsigned long) const\ne81a c 509 43\ne826 36 510 71\nFUNC e85c 4e 0 std::string* std::__copy_backward<false, std::random_access_iterator_tag>::copy_b<std::string*, std::string*>(std::string*, std::string*, std::string*)\ne85c c 408 61\ne868 14 411 61\ne87c 1e 412 61\ne89a b 411 61\ne8a5 5 413 61\nFUNC e8aa 2b 0 std::string* std::__copy_backward_aux<std::string*, std::string*>(std::string*, std::string*, std::string*)\ne8aa c 432 44\ne8b6 4 440 61\ne8ba 1b 443 61\ne8d5 1 443 61\ne8e4 56 482 61\ne946 4 514 61\ne94a 4 515 61\ne94e 1b 517 61\ne969 1 517 61\nFUNC e96a 69 0 void std::_Construct<std::string, std::string>(std::string*, std::string const&)\ne96a d 77 44\ne977 5c 81 73\ne9d3 1 81 73\nFUNC e9d4 54 0 dwarf2reader::SourceFileInfo* std::__copy_backward<false, std::random_access_iterator_tag>::copy_b<dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*>(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*)\ne9d4 c 408 61\ne9e0 1a 411 61\ne9fa 1e 412 61\nea18 b 411 61\nea23 5 413 61\nFUNC ea28 2b 0 dwarf2reader::SourceFileInfo* std::__copy_backward_aux<dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*>(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*)\nea28 c 432 44\nea34 4 440 61\nea38 1b 443 61\nea53 1 443 61\nea62 56 482 61\neac4 4 514 61\neac8 4 515 61\neacc 1b 517 61\neae7 1 517 61\nFUNC eae8 69 0 void std::_Construct<dwarf2reader::SourceFileInfo, dwarf2reader::SourceFileInfo>(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo const&)\neae8 d 77 44\neaf5 5c 81 73\neb51 1 81 73\neb52 c 69 70\neb5e 20 69 70\neb7e c 69 70\neb8a 2a 69 70\nebc1 5c 104 68\nec1d 1 104 68\nec2a 15 523 34\nec3f 79 525 34\necb8 21 529 34\necd9 1 529 34\nece6 14 229 42\ned06 7 98 68\ned0d 1 98 68\ned1a 1d 85 68\ned37 5 86 68\ned3c 10 88 68\nFUNC ed4c 29 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_get_node()\ned4c c 355 44\ned58 1d 356 40\ned75 1 356 40\nFUNC ed76 b6 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_create_node(std::pair<unsigned long long const, std::pair<std::string, unsigned int> > const&)\ned76 d 363 44\ned83 e 365 40\ned91 3c 367 40\nedcd b 373 40\nedd8 11 367 40\nede9 b 368 40\nedf4 12 370 40\nee06 b 371 40\nee11 13 368 40\nee24 8 373 40\nFUNC ee2c cd 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair<unsigned long long const, std::pair<std::string, unsigned int> > const&)\nee2c d 787 44\nee39 15 789 40\nee4e 5d 792 40\neeab 24 796 40\neecf f 798 40\neede 1b 799 40\neef9 1 799 40\nFUNC eefa 1ef 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::insert_unique(std::pair<unsigned long long const, std::pair<std::string, unsigned int> > const&)\neefa d 869 44\nef07 e 871 40\nef15 e 872 40\nef23 4 873 40\nef27 2 874 40\nef29 6 876 40\nef2f 35 877 40\nef64 2a 878 40\nef8e 6 874 40\nef94 12 880 40\nefa6 a 881 40\nefb0 24 882 40\nefd4 51 883 40\nf025 b 885 40\nf030 36 886 40\nf066 4e 887 40\nf0b4 35 888 40\nf0e9 1 888 40\nFUNC f0ea 20 0 std::map<unsigned long long, std::pair<std::string, unsigned int>, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::insert(std::pair<unsigned long long const, std::pair<std::string, unsigned int> > const&)\nf0ea c 359 45\nf0f6 14 360 45\nf116 7 98 68\nf11d 1 98 68\nf12a 1d 85 68\nf147 5 86 68\nf14c 1d 88 68\nf169 1 88 68\nFUNC f16a 29 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_get_node()\nf16a c 355 45\nf176 1d 356 40\nf193 1 356 40\nFUNC f194 5f 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_create_node(std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> const&)\nf194 d 363 45\nf1a1 e 365 40\nf1af 3c 367 40\nf1eb 8 373 40\nf1f3 1 373 40\nFUNC f1f4 cd 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> const&)\nf1f4 d 787 45\nf201 15 789 40\nf216 5d 792 40\nf273 24 796 40\nf297 f 798 40\nf2a6 1b 799 40\nf2c1 1 799 40\nFUNC f2c2 1ef 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::insert_unique(std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> const&)\nf2c2 d 869 45\nf2cf e 871 40\nf2dd e 872 40\nf2eb 4 873 40\nf2ef 2 874 40\nf2f1 6 876 40\nf2f7 35 877 40\nf32c 2a 878 40\nf356 6 874 40\nf35c 12 880 40\nf36e a 881 40\nf378 24 882 40\nf39c 51 883 40\nf3ed b 885 40\nf3f8 36 886 40\nf42e 4e 887 40\nf47c 35 888 40\nf4b1 1 888 40\nFUNC f4b2 20 0 std::map<unsigned long long, dwarf2reader::FunctionInfo*, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::insert(std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> const&)\nf4b2 c 359 45\nf4be 14 360 45\nFUNC f4d2 19 0 void std::_Destroy<std::string>(std::string*)\nf4d2 c 106 45\nf4de d 107 73\nf4eb 1 107 73\nFUNC f4ec 44 0 void std::__destroy_aux<__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > > >(__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, __false_type)\nf4ec c 119 45\nf4f8 2 121 73\nf4fa 13 122 73\nf50d 21 121 73\nf52e 2 122 73\nFUNC f530 28 0 void std::_Destroy<__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > > >(__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >)\nf530 c 148 45\nf53c 1c 155 73\nf565 6 82 79\nf56b 2 85 79\nf56d 24 86 79\nf591 2c 85 79\nf5bd b 87 79\nf5c8 b 89 79\nf5d3 12 91 79\nf5e5 b 92 79\nf5f0 13 89 79\nf603 9 92 79\nf618 23 113 79\nf63b 1 113 79\nf648 1b 254 79\nf663 1 254 79\nFUNC f664 430 0 std::vector<std::string, std::allocator<std::string> >::_M_insert_aux(__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, std::string const&)\nf664 14 249 47\nf678 14 251 78\nf68c 22 253 78\nf6ae f 255 78\nf6bd 12 256 78\nf6cf 55 257 78\nf724 4b 260 78\nf76f e 264 78\nf77d 15 265 78\nf792 e 266 78\nf7a0 1d 271 78\nf7bd 8 272 78\nf7c5 e 273 78\nf7d3 27 275 78\nf7fa 6 276 78\nf800 55 279 78\nf855 25 284 78\nf87a b 285 78\nf885 4f 286 78\nf8d4 3 284 78\nf8d7 13 279 78\nf8ea e 286 78\nf8f8 4d 298 78\nf945 30 299 78\nf975 12 302 78\nf987 13 303 78\nf99a 23 304 78\nf9bd 3 298 78\nf9c0 13 286 78\nf9d3 b 292 78\nf9de 39 294 78\nfa17 23 295 78\nfa3a 8 296 78\nfa42 16 294 78\nfa58 3 296 78\nfa5b 19 292 78\nfa74 19 298 78\nfa8d 7 304 78\nFUNC fa94 70 0 std::vector<std::string, std::allocator<std::string> >::push_back(std::string const&)\nfa94 c 602 47\nfaa0 10 604 71\nfab0 1e 606 71\nface 11 607 71\nfadf 25 610 71\nFUNC fb04 19 0 void std::_Destroy<dwarf2reader::SourceFileInfo>(dwarf2reader::SourceFileInfo*)\nfb04 c 106 47\nfb10 d 107 73\nfb1d 1 107 73\nFUNC fb1e 44 0 void std::__destroy_aux<__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > >(__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, __gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, __false_type)\nfb1e c 119 47\nfb2a 2 121 73\nfb2c 13 122 73\nfb3f 21 121 73\nfb60 2 122 73\nFUNC fb62 28 0 void std::_Destroy<__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > >(__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, __gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >)\nfb62 c 148 47\nfb6e 1c 155 73\nfb97 6 82 79\nfb9d 2 85 79\nfb9f 24 86 79\nfbc3 2c 85 79\nfbef b 87 79\nfbfa b 89 79\nfc05 12 91 79\nfc17 b 92 79\nfc22 13 89 79\nfc35 9 92 79\nfc4a 23 113 79\nfc6d 1 113 79\nfc7a 1b 254 79\nfc95 1 254 79\nFUNC fc96 43d 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::_M_insert_aux(__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, dwarf2reader::SourceFileInfo const&)\nfc96 14 249 47\nfcaa 14 251 78\nfcbe 22 253 78\nfce0 f 255 78\nfcef 12 256 78\nfd01 55 257 78\nfd56 4b 260 78\nfda1 e 264 78\nfdaf 15 265 78\nfdc4 e 266 78\nfdd2 1d 271 78\nfdef 8 272 78\nfdf7 e 273 78\nfe05 27 275 78\nfe2c 6 276 78\nfe32 55 279 78\nfe87 25 284 78\nfeac b 285 78\nfeb7 4f 286 78\nff06 3 284 78\nff09 13 279 78\nff1c e 286 78\nff2a 4d 298 78\nff77 36 299 78\nffad 12 302 78\nffbf 13 303 78\nffd2 2a 304 78\nfffc 3 298 78\nffff 13 286 78\n10012 b 292 78\n1001d 39 294 78\n10056 23 295 78\n10079 8 296 78\n10081 16 294 78\n10097 3 296 78\n1009a 19 292 78\n100b3 19 298 78\n100cc 7 304 78\n100d3 1 304 78\nFUNC 100d4 70 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::push_back(dwarf2reader::SourceFileInfo const&)\n100d4 c 602 47\n100e0 10 604 71\n100f0 1e 606 71\n1010e 11 607 71\n1011f 25 610 71\nFUNC 10144 16c 0 Start\n10144 17 610 71\n1015b 40 49 48\n1019b 6 51 48\n101a1 3f 53 48\n101e0 7 54 48\n101e7 5 55 48\n101ec 2a 58 48\n10216 61 61 48\n10277 7 62 48\n1027e 2 63 48\n10280 29 66 48\n102a9 7 67 48\nFUNC 102b0 108 0 Usage\n102b0 19 70 48\n102c9 30 71 48\n102f9 29 73 48\n10322 30 74 48\n10352 30 75 48\n10382 30 76 48\n103b2 6 77 48\nFUNC 103b8 3af 0 SetupOptions\n103b8 21 80 48\n103d9 8 82 48\n103e1 6 85 48\n103e7 10 86 48\n103f7 2e 88 48\n10425 2f 94 48\n10454 2a 91 48\n1047e 23 95 48\n104a1 3e 97 48\n104df 11 98 48\n104f0 7c 99 48\n1056c c 100 48\n10578 5 99 48\n1057d 3e 101 48\n105bb 11 102 48\n105cc 3e 103 48\n1060a 11 104 48\n1061b 37 106 48\n10652 b 107 48\n1065d c 108 48\n10669 b 113 48\n10674 c 114 48\n10680 14 119 48\n10694 30 120 48\n106c4 b 121 48\n106cf c 122 48\n106db 81 127 48\n1075c b 128 48\n10767 1 128 48\nFUNC 10768 a7 0 main\n10768 13 131 48\n1077b 37 132 48\n107b2 1e 135 48\n107d0 e 136 48\n107de 8 137 48\n107e6 17 139 48\n107fd c 141 48\n10809 6 142 48\n1080f 1 142 48\n10810 c 47 49\n1081c 1a 48 49\n10836 2 49 49\n10838 c 47 49\n10844 1a 48 49\n1085e 2 49 49\nFUNC 10860 cb 0 google_breakpad::FileID::FileIdentifier(unsigned char*)\n10860 f 51 49\n1086f 16 52 49\n10885 6 53 49\n1088b f 54 49\n1089a b 57 49\n108a5 7 62 49\n108ac 2 63 49\n108ae 1c 64 49\n108ca 32 63 49\n108fc b 67 49\n10907 12 68 49\n10919 10 70 49\n10929 2 71 49\n1092b 1 71 49\nFUNC 1092c f2 0 google_breakpad::FileID::MachoIdentifier(int, unsigned char*)\n1092c 10 73 49\n1093c 15 74 49\n10951 20 76 49\n10971 f 77 49\n10980 20 79 49\n109a0 c 80 49\n109ac 69 82 49\n10a15 9 83 49\nFUNC 10a1e fb 0 google_breakpad::FileID::ConvertIdentifierToString(unsigned char const*, char*, int)\n10a1e c 87 49\n10a2a 7 88 49\n10a31 c 89 49\n10a3d 15 90 49\n10a52 12 91 49\n10a64 18 93 49\n10a7c e 94 49\n10a8a 2b 96 49\n10ab5 2b 97 49\n10ae0 17 89 49\n10af7 20 101 49\n10b17 2 102 49\n10b19 1 102 49\nFUNC 10b1a 13 0 NXHostByteOrder\n10b1a c 144 56\n10b26 5 147 56\n10b2b 2 153 56\n10b2d 1 153 56\n10b2e c 56 51\n10b3a 1a 57 51\n10b54 1e 58 51\n10b72 2 59 51\n10b74 c 56 51\n10b80 1a 57 51\n10b9a 1e 58 51\n10bb8 2 59 51\n10bba c 61 51\n10bc6 e 62 51\n10bd4 11 63 51\n10be5 2 64 51\n10be7 1 64 51\n10be8 c 61 51\n10bf4 e 62 51\n10c02 11 63 51\n10c13 2 64 51\n10c15 1 64 51\nFUNC 10c16 477 0 MacFileUtilities::MachoID::UpdateCRC(unsigned char*, unsigned long)\n10c16 c 74 51\n10c22 11 82 51\n10c33 14 83 51\n10c47 5 86 51\n10c4c 9 87 51\n10c55 7 88 51\n10c5c 18b 90 51\n10de7 6 91 51\n10ded 14 89 51\n10e01 23 93 51\n10e24 23 94 51\n10e47 d 86 51\n10e54 f 98 51\n10e63 6 100 51\n10e69 18b 101 51\n10ff4 6 102 51\n10ffa c 99 51\n11006 13 105 51\n11019 8 106 51\n11021 10 104 51\n11031 23 108 51\n11054 23 109 51\n11077 14 110 51\n1108b 2 112 51\n1108d 1 112 51\nFUNC 1108e 2c 0 MacFileUtilities::MachoID::UpdateMD5(unsigned char*, unsigned long)\n1108e c 114 51\n1109a 1e 115 51\n110b8 2 116 51\nFUNC 110ba 2c 0 MacFileUtilities::MachoID::UpdateSHA1(unsigned char*, unsigned long)\n110ba c 118 51\n110c6 1e 119 51\n110e4 2 120 51\nFUNC 110e6 121 0 MacFileUtilities::MachoID::Update(MacFileUtilities::MachoWalker*, unsigned long, unsigned long)\n110e6 f 122 51\n110f5 1b 123 51\n11110 e 129 51\n1111e 5 130 51\n11123 9 131 51\n1112c 7 132 51\n11133 a 133 51\n1113d 6 135 51\n11143 7 136 51\n1114a 35 139 51\n1117f 6c 142 51\n111eb 10 143 51\n111fb a 130 51\n11205 2 145 51\n11207 1 145 51\nFUNC 11208 cf 0 MacFileUtilities::MachoID::UUIDCommand(int, unsigned char*)\n11208 14 147 51\n1121c 25 149 51\n11241 7 151 51\n11248 19 152 51\n11261 9 153 51\n1126a 8 157 51\n11272 1f 158 51\n11291 9 159 51\n1129a 36 162 51\n112d0 7 163 51\n112d7 1 163 51\nFUNC 112d8 224 0 MacFileUtilities::MachoID::IDCommand(int, unsigned char*)\n112d8 15 165 51\n112ed 25 167 51\n11312 7 169 51\n11319 19 170 51\n11332 c 171 51\n1133e c 175 51\n1134a 6 180 51\n11350 7 181 51\n11357 9 182 51\n11360 9 183 51\n11369 28 185 51\n11391 33 186 51\n113c4 1e 185 51\n113e2 10 189 51\n113f2 10 190 51\n11402 10 191 51\n11412 d 192 51\n1141f 10 193 51\n1142f 10 194 51\n1143f 10 195 51\n1144f d 196 51\n1145c 17 197 51\n11473 17 198 51\n1148a 17 199 51\n114a1 14 200 51\n114b5 9 202 51\n114be 36 205 51\n114f4 8 206 51\nFUNC 114fc d1 0 MacFileUtilities::MachoID::Adler32(int)\n114fc 14 208 51\n11510 25 209 51\n11535 27 210 51\n1155c d 211 51\n11569 19 213 51\n11582 9 214 51\n1158b 3b 216 51\n115c6 7 217 51\n115cd 1 217 51\nFUNC 115ce f8 0 MacFileUtilities::MachoID::MD5(int, unsigned char*)\n115ce 14 219 51\n115e2 25 220 51\n11607 27 221 51\n1162e 19 223 51\n11647 19 224 51\n11660 9 225 51\n11669 17 227 51\n11680 9 228 51\n11689 36 231 51\n116bf 7 232 51\nFUNC 116c6 f8 0 MacFileUtilities::MachoID::SHA1(int, unsigned char*)\n116c6 14 234 51\n116da 25 235 51\n116ff 27 236 51\n11726 19 238 51\n1173f 19 239 51\n11758 9 240 51\n11761 17 242 51\n11778 9 243 51\n11781 36 246 51\n117b7 7 247 51\nFUNC 117be 378 0 MacFileUtilities::MachoID::WalkerCB(MacFileUtilities::MachoWalker*, load_command*, long long, bool, void*)\n117be 2b 251 51\n117e9 6 252 51\n117ef e 254 51\n117fd 38 257 51\n11835 f 258 51\n11844 9 260 51\n1184d 17 261 51\n11864 20 266 51\n11884 f 267 51\n11893 d 271 51\n118a0 c 273 51\n118ac 38 274 51\n118e4 f 275 51\n118f3 9 277 51\n118fc 1f 278 51\n1191b 14 282 51\n1192f 2b 283 51\n1195a d 285 51\n11967 19 273 51\n11980 e 287 51\n1198e 38 290 51\n119c6 f 291 51\n119d5 9 293 51\n119de 17 294 51\n119f5 20 299 51\n11a15 f 300 51\n11a24 d 304 51\n11a31 c 306 51\n11a3d 38 307 51\n11a75 f 308 51\n11a84 9 310 51\n11a8d 1f 311 51\n11aac 1a 315 51\n11ac6 39 316 51\n11aff d 318 51\n11b0c 11 306 51\n11b1d 10 323 51\n11b2d 9 324 51\nFUNC 11b36 95 0 MacFileUtilities::MachoID::UUIDWalkerCB(MacFileUtilities::MachoWalker*, load_command*, long long, bool, void*)\n11b36 1e 328 51\n11b54 a 329 51\n11b5e 6 331 51\n11b64 2f 333 51\n11b93 9 335 51\n11b9c 6 337 51\n11ba2 14 338 51\n11bb6 9 340 51\n11bbf a 344 51\n11bc9 2 345 51\n11bcb 1 345 51\nFUNC 11bcc 95 0 MacFileUtilities::MachoID::IDWalkerCB(MacFileUtilities::MachoWalker*, load_command*, long long, bool, void*)\n11bcc 1e 349 51\n11bea a 350 51\n11bf4 6 351 51\n11bfa 2f 353 51\n11c29 9 354 51\n11c32 6 356 51\n11c38 14 357 51\n11c4c 9 359 51\n11c55 a 363 51\n11c5f 2 364 51\n11c61 1 364 51\nFUNC 11c62 1c 0 _OSSwapInt32\n11c62 f 53 55\n11c71 8 55 55\n11c79 3 56 55\n11c7c 2 57 55\nFUNC 11c7e 19 0 NXSwapInt\n11c7e f 52 56\n11c8d 8 54 56\n11c95 2 55 56\n11c97 1 55 56\nFUNC 11c98 13 0 NXHostByteOrder\n11c98 c 144 56\n11ca4 5 147 56\n11ca9 2 153 56\n11cab 1 153 56\n11cac c 52 54\n11cb8 12 54 54\n11cca 1a 55 54\n11ce4 2 56 54\n11ce6 c 52 54\n11cf2 12 54 54\n11d04 1a 55 54\n11d1e 2 56 54\n11d20 c 58 54\n11d2c a 59 54\n11d36 d 60 54\n11d43 2 61 54\n11d45 1 61 54\n11d46 c 58 54\n11d52 a 59 54\n11d5c d 60 54\n11d69 2 61 54\n11d6b 1 61 54\nFUNC 11d6c 37 0 MacFileUtilities::MachoWalker::ValidateCPUType(int)\n11d6c c 63 54\n11d78 6 66 54\n11d7e 8 67 54\n11d86 6 68 54\n11d8c b 69 54\n11d97 7 74 54\n11d9e 3 80 54\n11da1 2 81 54\n11da3 1 81 54\nFUNC 11da4 50 0 MacFileUtilities::MachoWalker::ReadBytes(void*, unsigned long, long long)\n11da4 18 96 54\n11dbc 36 97 54\n11df2 2 98 54\nFUNC 11df4 73 0 MacFileUtilities::MachoWalker::CurrentHeader(mach_header_64*, long long*)\n11df4 c 100 54\n11e00 a 101 54\n11e0a 37 102 54\n11e41 11 103 54\n11e52 9 104 54\n11e5b a 107 54\n11e65 2 108 54\n11e67 1 108 54\nFUNC 11e68 2a6 0 MacFileUtilities::MachoWalker::FindHeader(int, long long&)\n11e68 c 110 54\n11e74 15 111 54\n11e89 31 114 54\n11eba c 115 54\n11ec6 10 117 54\n11ed6 4 120 54\n11eda 14 121 54\n11eee 4 122 54\n11ef2 11 129 54\n11f03 28 124 54\n11f2b c 126 54\n11f37 31 133 54\n11f68 c 134 54\n11f74 14 136 54\n11f88 b 137 54\n11f93 8 139 54\n11f9b c 140 54\n11fa7 10 142 54\n11fb7 c 143 54\n11fc3 10 146 54\n11fd3 31 148 54\n12004 c 149 54\n12010 f 151 54\n1201f 14 152 54\n12033 16 154 54\n12049 c 158 54\n12055 31 159 54\n12086 9 160 54\n1208f f 162 54\n1209e 1c 163 54\n120ba 8 165 54\n120c2 10 166 54\n120d2 9 167 54\n120db 16 170 54\n120f1 11 158 54\n12102 a 174 54\n1210c 2 175 54\nFUNC 1210e 109 0 MacFileUtilities::MachoWalker::WalkHeaderCore(long long, unsigned int, bool)\n1210e 1e 224 54\n1212c c 225 54\n12138 2f 227 54\n12167 c 228 54\n12173 6 230 54\n12179 14 231 54\n1218d 5b 234 54\n121e8 12 237 54\n121fa 11 225 54\n1220b a 240 54\n12215 2 241 54\n12217 1 241 54\nFUNC 12218 10e 0 MacFileUtilities::MachoWalker::WalkHeader64AtOffset(long long)\n12218 18 203 54\n12230 2f 205 54\n1225f c 206 54\n1226b e 208 54\n12279 6 209 54\n1227f 14 210 54\n12293 9 212 54\n1229c a 213 54\n122a6 f 214 54\n122b5 15 215 54\n122ca 2b 216 54\n122f5 a 217 54\n122ff a 218 54\n12309 11 219 54\n1231a a 220 54\n12324 2 221 54\nFUNC 12326 143 0 MacFileUtilities::MachoWalker::WalkHeaderAtOffset(long long)\n12326 18 177 54\n1233e 2f 179 54\n1236d c 180 54\n12379 e 182 54\n12387 6 183 54\n1238d 14 184 54\n123a1 2e 189 54\n123cf 7 190 54\n123d6 9 192 54\n123df a 193 54\n123e9 f 194 54\n123f8 15 195 54\n1240d 2b 196 54\n12438 a 197 54\n12442 a 198 54\n1244c 11 199 54\n1245d a 200 54\n12467 2 201 54\n12469 1 201 54\nFUNC 1246a 99 0 MacFileUtilities::MachoWalker::WalkHeader(int)\n1246a c 83 54\n12476 15 84 54\n1248b 1d 86 54\n124a8 d 87 54\n124b5 21 88 54\n124d6 21 90 54\n124f7 a 93 54\n12501 2 94 54\n12503 1 94 54\nFUNC 12504 1c 0 _OSSwapInt32\n12504 f 53 55\n12513 8 55 55\n1251b 3 56 55\n1251e 2 57 55\nFUNC 12520 2b 0 _OSSwapInt64\n12520 12 64 55\n12532 11 69 55\n12543 6 70 55\n12549 2 71 55\n1254b 1 71 55\nFUNC 1254c 19 0 NXSwapLong\n1254c f 61 56\n1255b 8 63 56\n12563 2 64 56\n12565 1 64 56\nFUNC 12566 1f 0 NXSwapLongLong\n12566 12 70 56\n12578 b 72 56\n12583 2 73 56\n12585 1 73 56\nFUNC 12586 32 0 breakpad_swap_uuid_command(breakpad_uuid_command*, NXByteOrder)\n12586 c 37 57\n12592 11 39 57\n125a3 13 40 57\n125b6 2 41 57\nFUNC 125b8 da 0 breakpad_swap_segment_command_64(segment_command_64*, NXByteOrder)\n125b8 c 44 57\n125c4 11 46 57\n125d5 13 47 57\n125e8 17 49 57\n125ff 17 50 57\n12616 17 51 57\n1262d 17 52 57\n12644 13 54 57\n12657 13 55 57\n1266a 13 56 57\n1267d 13 57 57\n12690 2 58 57\nFUNC 12692 a4 0 breakpad_swap_mach_header_64(mach_header_64*, NXByteOrder)\n12692 c 61 57\n1269e 11 63 57\n126af 13 64 57\n126c2 13 65 57\n126d5 13 66 57\n126e8 13 67 57\n126fb 13 68 57\n1270e 13 69 57\n12721 13 70 57\n12734 2 71 57\nFUNC 12736 1d1 0 breakpad_swap_section_64(section_64*, unsigned int, NXByteOrder)\n12736 d 75 57\n12743 c 77 57\n1274f 33 78 57\n12782 33 79 57\n127b5 2d 81 57\n127e2 2d 82 57\n1280f 2d 83 57\n1283c 2d 84 57\n12869 2d 85 57\n12896 2d 86 57\n128c3 2d 87 57\n128f0 11 77 57\n12901 6 89 57\n12907 1 89 57\n12908 12 9 58\n1291a 4f 11 58\n12969 2 12 58\n1296b 1 12 58\n1296c 12 9 58\n1297e 4f 11 58\n129cd 2 12 58\n129cf 1 12 58\n129d0 13 14 58\n129e3 2a 14 58\n12a0d 1 14 58\n12a0e 13 14 58\n12a21 2a 14 58\n12a4b 1 14 58\n12a4c 13 14 58\n12a5f 2a 14 58\n12a89 1 14 58\nFUNC 12a8a bb 0 dwarf2reader::ByteReader::SetOffsetSize(unsigned char)\n12a8a 19 16 58\n12aa3 a 17 58\n12aad 48 18 58\n12af5 6 19 58\n12afb 23 20 58\n12b1e 21 22 58\n12b3f 6 24 58\n12b45 1 24 58\nFUNC 12b46 bb 0 dwarf2reader::ByteReader::SetAddressSize(unsigned char)\n12b46 19 26 58\n12b5f a 27 58\n12b69 48 28 58\n12bb1 6 29 58\n12bb7 23 30 58\n12bda 21 32 58\n12bfb 6 34 58\n12c01 1 34 58\nFUNC 12c02 a2 0 dwarf2reader::ByteReader::ReadFourBytes(char const*) const\n12c02 c 24 59\n12c0e c 25 64\n12c1a d 26 64\n12c27 f 27 64\n12c36 f 28 64\n12c45 b 29 64\n12c50 27 30 64\n12c77 2b 32 64\n12ca2 2 34 64\nFUNC 12ca4 40e 0 dwarf2reader::ByteReader::ReadEightBytes(char const*) const\n12ca4 11 36 59\n12cb5 1a 37 64\n12ccf 1b 38 64\n12cea 1d 39 64\n12d07 1d 40 64\n12d24 1d 41 64\n12d41 1d 42 64\n12d5e 1d 43 64\n12d7b 1d 44 64\n12d98 f 45 64\n12da7 18f 47 64\n12f36 172 50 64\n130a8 a 52 64\n130b2 2 52 64\nFUNC 130b4 a6 0 ReadInitialLength\n130b4 15 29 60\n130c9 18 30 60\n130e1 6 31 60\n130e7 d 35 60\n130f4 13 36 60\n13107 9 37 60\n13110 1a 38 60\n1312a 13 40 60\n1313d 9 41 60\n13146 12 43 60\n13158 2 44 60\n1315a 1f 47 60\n13179 65 50 60\n131de 1f 47 60\n131fd 65 50 60\nFUNC 13262 393 0 dwarf2reader::CompilationUnit::SkipAttribute(char const*, dwarf2reader::DwarfForm)\n13262 14 133 60\n13276 82 136 60\n132f8 1f 139 60\n13317 a 140 60\n13321 21 141 60\n13342 c 147 60\n1334e e 151 60\n1335c e 155 60\n1336a e 159 60\n13378 27 162 60\n1339f 1c 166 60\n133bb 10 167 60\n133cb 1c 171 60\n133e7 10 172 60\n133f7 1e 175 60\n13415 56 180 60\n1346b d 181 60\n13478 1e 182 60\n13496 11 183 60\n134a7 1e 184 60\n134c5 24 189 60\n134e9 26 192 60\n1350f 23 195 60\n13532 22 198 60\n13554 15 199 60\n13569 1b 203 60\n13584 30 206 60\n135b4 30 208 60\n135e4 a 209 60\n135ee 7 210 60\n135f5 1 210 60\nFUNC 135f6 29b 0 dwarf2reader::CompilationUnit::ReadHeader()\n135f6 14 217 60\n1360a 9 218 60\n13613 4e 221 60\n13661 17 223 60\n13678 a 224 60\n13682 f 225 60\n13691 4e 227 60\n136df 1e 228 60\n136fd 6 229 60\n13703 5e 231 60\n13761 1e 232 60\n1377f 18 233 60\n13797 4c 235 60\n137e3 1d 236 60\n13800 1c 237 60\n1381c 5 238 60\n13821 9 240 60\n1382a 60 245 60\n1388a 7 247 60\n13891 1 247 60\nFUNC 13892 a57 0 dwarf2reader::CompilationUnit::ProcessAttribute(unsigned long long, char const*, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm)\n13892 24 299 60\n138b6 8a 302 60\n13940 1f 307 60\n1395f a 308 60\n13969 36 309 60\n1399f 5b 316 60\n139fa c 317 60\n13a06 5b 322 60\n13a61 e 323 60\n13a6f 55 328 60\n13ac4 e 329 60\n13ad2 55 334 60\n13b27 e 335 60\n13b35 6 338 60\n13b3b 9a 340 60\n13bd5 33 341 60\n13c08 25 340 60\n13c2d 5c 348 60\n13c89 10 349 60\n13c99 5c 354 60\n13cf5 10 355 60\n13d05 55 359 60\n13d5a 1e 360 60\n13d78 56 365 60\n13dce d 366 60\n13ddb 55 368 60\n13e30 1e 369 60\n13e4e 11 370 60\n13e5f 55 372 60\n13eb4 1e 373 60\n13ed2 29 378 60\n13efb 4a 380 60\n13f45 f 381 60\n13f54 29 385 60\n13f7d 4c 387 60\n13fc9 11 388 60\n13fda 1b 392 60\n13ff5 4c 394 60\n14041 11 395 60\n14052 22 399 60\n14074 4e 401 60\n140c2 15 402 60\n140d7 3c 406 60\n14113 1b 408 60\n1412e 54 409 60\n14182 f 411 60\n14191 9a 413 60\n1422b 24 414 60\n1424f 25 413 60\n14274 30 418 60\n142a4 30 420 60\n142d4 a 421 60\n142de b 422 60\n142e9 1 422 60\n142ea 1f 489 60\n14309 3a 491 60\n14343 a 492 60\n1434d 6 493 60\n14353 1 493 60\n14354 1f 489 60\n14373 3a 491 60\n143ad a 492 60\n143b7 6 493 60\n143bd 1 493 60\nFUNC 143be b5 0 dwarf2reader::CompilationUnit::ProcessDIE(unsigned long long, char const*, dwarf2reader::CompilationUnit::Abbrev const&)\n143be 19 426 60\n143d7 13 427 60\n143ea 46 430 60\n14430 3a 427 60\n1446a 3 432 60\n1446d 6 433 60\n14473 1 433 60\nFUNC 14474 85 0 dwarf2reader::CompilationUnit::SkipDIE(char const*, dwarf2reader::CompilationUnit::Abbrev const&)\n14474 c 122 60\n14480 13 123 60\n14493 27 126 60\n144ba 3a 123 60\n144f4 3 128 60\n144f7 2 129 60\n144f9 1 129 60\nFUNC 144fa be4 0 dwarf2reader::LineInfo::ProcessOneOpcode(dwarf2reader::ByteReader*, dwarf2reader::LineInfoHandler*, dwarf2reader::LineInfoHeader const&, char const*, dwarf2reader::LineStateMachine*, unsigned long*, unsigned long, bool*)\n144fa 18 593 60\n14512 a 594 60\n1451c 18 596 60\n14534 8 597 60\n1453c 5 598 60\n14541 19 602 60\n1455a f 603 60\n14569 50 605 60\n145b9 46 607 60\n145ff e0 610 60\n146df 6 612 60\n146e5 22 615 60\n14707 22 616 60\n14729 7 617 60\n14730 b 618 60\n1473b f 619 60\n1474a 5a 623 60\n147a4 7 625 60\n147ab b 626 60\n147b6 f 627 60\n147c5 28 631 60\n147ed e 632 60\n147fb 144 635 60\n1493f 6 637 60\n14945 9e 640 60\n149e3 5 642 60\n149e8 22 644 60\n14a0a e 645 60\n14a18 1c 646 60\n14a34 2b 652 60\n14a5f b 653 60\n14a6a 22 658 60\n14a8c e 659 60\n14a9a 8 660 60\n14aa2 5 662 60\n14aa7 22 664 60\n14ac9 e 665 60\n14ad7 9 666 60\n14ae0 5 668 60\n14ae5 12 670 60\n14af7 5 672 60\n14afc 7 674 60\n14b03 5 676 60\n14b08 16 678 60\n14b1e 9 679 60\n14b27 d9 682 60\n14c00 6 684 60\n14c06 1f 687 60\n14c25 5 689 60\n14c2a 40 693 60\n14c6a d6 696 60\n14d40 6 698 60\n14d46 1c 701 60\n14d62 5 703 60\n14d67 1f 706 60\n14d86 d 707 60\n14d93 13 708 60\n14da6 26 710 60\n14dcc 5 711 60\n14dd1 50 713 60\n14e21 7 715 60\n14e28 b 716 60\n14e33 f 717 60\n14e42 18 725 60\n14e5a f 726 60\n14e69 5 728 60\n14e6e 6 730 60\n14e74 28 732 60\n14e9c d 733 60\n14ea9 22 735 60\n14ecb e 736 60\n14ed9 22 739 60\n14efb e 740 60\n14f09 22 743 60\n14f2b e 744 60\n14f39 a 746 60\n14f43 fd 748 60\n15040 a 758 60\n1504a 9 759 60\n15053 1c 761 60\n1506f d 762 60\n1507c e 763 60\n1508a 2e 759 60\n150b8 b 769 60\n150c3 10 770 60\n150d3 b 771 60\nFUNC 150de 14b 0 dwarf2reader::LineInfo::ReadLines()\n150de e 773 60\n150ec 9 778 60\n150f5 17 782 60\n1510c 8 783 60\n15114 6 785 60\n1511a 9 787 60\n15123 5 788 60\n15128 19 789 60\n15141 5 790 60\n15146 4a 793 60\n15190 6 794 60\n15196 4a 796 60\n151e0 a 797 60\n151ea f 790 60\n151f9 15 788 60\n1520e 14 801 60\n15222 7 802 60\n15229 1 802 60\nFUNC 1522a 4fd 0 dwarf2reader::CompilationUnit::ReadAbbrevs()\n1522a 18 60 60\n15242 e 61 60\n15250 58 65 60\n152a8 38 66 60\n152e0 44 65 60\n15324 2a 66 60\n1534e 45 68 60\n15393 16 69 60\n153a9 1d 75 60\n153c6 6 76 60\n153cc 40 77 60\n1540c b 80 60\n15417 1f 82 60\n15436 e 84 60\n15444 6 77 60\n1544a 1f 68 60\n15469 a 84 60\n15473 1d 79 60\n15490 6 86 60\n15496 a 87 60\n154a0 3d 89 60\n154dd 1f 90 60\n154fc a 91 60\n15506 6 92 60\n1550c 3d 94 60\n15549 1d 95 60\n15566 5 96 60\n1556b 3d 98 60\n155a8 1f 101 60\n155c7 a 102 60\n155d1 3d 104 60\n1560e 1f 105 60\n1562d a 106 60\n15637 c 107 60\n15643 6 111 60\n15649 6 112 60\n1564f 32 113 60\n15681 47 115 60\n156c8 30 116 60\n156f8 24 79 60\n1571c b 118 60\n15727 1 118 60\nFUNC 15728 5dc 0 dwarf2reader::LineInfo::ReadHeader()\n15728 18 503 60\n15740 9 504 60\n15749 17 508 60\n15760 a 510 60\n1576a f 511 60\n15779 60 512 60\n157d9 44 516 60\n1581d 1e 518 60\n1583b 6 519 60\n15841 1e 521 60\n1585f 18 522 60\n15877 1d 524 60\n15894 5 525 60\n15899 20 527 60\n158b9 5 528 60\n158be c 530 60\n158ca 5 531 60\n158cf 1d 533 60\n158ec 5 534 60\n158f1 1d 536 60\n1590e 5 537 60\n15913 45 539 60\n15958 1f 540 60\n15977 19 541 60\n15990 15 542 60\n159a5 1f 539 60\n159c4 30 543 60\n159f4 5 544 60\n159f9 14 542 60\n15a0d e 548 60\n15a1b 7 549 60\n15a22 5 550 60\n15a27 6 551 60\n15a2d 8b 552 60\n15ab8 28 553 60\n15ae0 5 554 60\n15ae5 16 550 60\n15afb 25 552 60\n15b20 5 557 60\n15b25 e 560 60\n15b33 7 561 60\n15b3a 5 563 60\n15b3f 6 564 60\n15b45 28 565 60\n15b6d 22 567 60\n15b8f a 568 60\n15b99 22 570 60\n15bbb a 571 60\n15bc5 22 573 60\n15be7 a 574 60\n15bf1 ba 576 60\n15cab 5 577 60\n15cb0 16 563 60\n15cc6 25 576 60\n15ceb 5 580 60\n15cf0 9 582 60\n15cf9 b 583 60\nFUNC 15d04 3d 0 dwarf2reader::LineInfo::Start()\n15d04 c 495 60\n15d10 b 496 60\n15d1b b 497 60\n15d26 19 498 60\n15d3f 2 499 60\n15d41 1 499 60\nFUNC 15d42 304 0 dwarf2reader::CompilationUnit::ProcessDIEs()\n15d42 11 435 60\n15d53 9 436 60\n15d5c 9 441 60\n15d65 17 445 60\n15d7c 8 446 60\n15d84 6 448 60\n15d8a 6c 453 60\n15df6 8 455 60\n15dfe 16 453 60\n15e14 3 455 60\n15e17 2f 453 60\n15e46 29 458 60\n15e6f 22 460 60\n15e91 a 462 60\n15e9b a 465 60\n15ea5 1e 466 60\n15ec3 13 467 60\n15ed6 2b 468 60\n15f01 18 472 60\n15f19 9 473 60\n15f22 42 474 60\n15f64 1e 475 60\n15f82 2a 477 60\n15fac b 480 60\n15fb7 1e 481 60\n15fd5 26 483 60\n15ffb 1d 455 60\n16018 24 485 60\n1603c a 486 60\nFUNC 16046 35f 0 dwarf2reader::CompilationUnit::Start()\n16046 18 249 60\n1605e 58 251 60\n160b6 35 252 60\n160eb 32 251 60\n1611d 2a 252 60\n16147 20 255 60\n16167 37 256 60\n1619e b 259 60\n161a9 f 264 60\n161b8 17 265 60\n161cf c 266 60\n161db a 268 60\n161e5 95 271 60\n1627a 11 276 60\n1628b b 279 60\n16296 58 282 60\n162ee 2f 283 60\n1631d 32 282 60\n1634f 14 284 60\n16363 1a 285 60\n1637d b 289 60\n16388 12 291 60\n1639a b 292 60\n163a5 1 292 60\nFUNC 163a6 3a 0 std::fill(unsigned char*, unsigned char*, unsigned char const&)\n163a6 c 573 61\n163b2 9 576 61\n163bb 23 577 61\n163de 2 578 61\nFUNC 163e0 33 0 std::__deque_buf_size(unsigned long)\n163e0 c 83 62\n163ec 27 84 62\n16413 1 84 62\nFUNC 16414 18 0 dwarf2reader::ByteReader::OffsetSize() const\n16414 c 38 63\n16420 c 38 63\nFUNC 1642c 18 0 dwarf2reader::ByteReader::AddressSize() const\n1642c c 41 63\n16438 c 41 63\nFUNC 16444 17 0 dwarf2reader::ByteReader::ReadOneByte(char const*) const\n16444 c 10 64\n16450 9 11 64\n16459 2 12 64\n1645b 1 12 64\nFUNC 1645c 63 0 dwarf2reader::ByteReader::ReadTwoBytes(char const*) const\n1645c c 14 64\n16468 d 15 64\n16475 e 16 64\n16483 b 17 64\n1648e 17 18 64\n164a5 18 20 64\n164bd 2 22 64\n164bf 1 22 64\nFUNC 164c0 98 0 dwarf2reader::ByteReader::ReadUnsignedLEB128(char const*, unsigned long*) const\n164c0 e 59 64\n164ce e 60 64\n164dc 7 61 64\n164e3 7 62 64\n164ea e 66 64\n164f8 5 67 64\n164fd 38 69 64\n16535 6 71 64\n1653b 8 65 64\n16543 8 75 64\n1654b 6 77 64\n16551 7 78 64\nFUNC 16558 ee 0 dwarf2reader::ByteReader::ReadSignedLEB128(char const*, unsigned long*) const\n16558 e 84 64\n16566 e 85 64\n16574 7 86 64\n1657b 7 87 64\n16582 e 91 64\n16590 5 92 64\n16595 44 93 64\n165d9 6 94 64\n165df 8 90 64\n165e7 14 97 64\n165fb 36 98 64\n16631 8 99 64\n16639 6 100 64\n1663f 7 101 64\nFUNC 16646 a2 0 dwarf2reader::ByteReader::ReadOffset(char const*) const\n16646 13 103 64\n16659 3f 104 64\n16698 4a 105 64\n166e2 6 106 64\nFUNC 166e8 a2 0 dwarf2reader::ByteReader::ReadAddress(char const*) const\n166e8 13 108 64\n166fb 3f 109 64\n1673a 4a 110 64\n16784 6 111 64\nFUNC 1678a 61 0 dwarf2reader::LineStateMachine::Reset(bool)\n1678a 12 12 65\n1679c 9 13 65\n167a5 11 14 65\n167b6 11 15 65\n167c7 a 16 65\n167d1 a 17 65\n167db 7 18 65\n167e2 7 19 65\n167e9 2 20 65\n167eb 1 20 65\nFUNC 167ec 20 0 std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator!=(std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > const&) const\n167ec c 253 66\n167f8 14 254 66\nFUNC 1680c 25 0 std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator++(int)\n1680c c 226 66\n16818 8 228 66\n16820 c 229 66\n1682c 5 230 66\n16831 1 230 66\nFUNC 16832 16 0 std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator->() const\n16832 c 215 66\n1683e a 216 66\n16848 c 190 67\n16854 a 190 67\nFUNC 1685e 13 0 std::auto_ptr<std::stack<unsigned long long, std::deque<unsigned long long, std::allocator<unsigned long long> > > >::operator->() const\n1685e c 283 67\n1686a 7 286 67\n16871 1 286 67\n16872 c 65 68\n1687e 2 65 68\n16880 c 97 69\n1688c d 97 69\n16899 1 97 69\n1689a c 99 69\n168a6 14 100 69\n168ba c 97 69\n168c6 d 97 69\n168d3 1 97 69\n168d4 c 84 70\n168e0 17 85 70\n168f7 1 85 70\nFUNC 168f8 2d 0 std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> std::make_pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>(dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm)\n168f8 c 144 70\n16904 21 145 70\n16925 1 145 70\n16926 c 202 66\n16932 a 203 66\nFUNC 1693c 25 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::begin() const\n1693c c 588 70\n16948 19 589 66\n16961 1 589 66\nFUNC 16962 23 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::end() const\n16962 c 605 70\n1696e 17 606 66\n16985 1 606 66\n16986 c 65 68\n16992 2 65 68\n16994 c 72 68\n169a0 2 72 68\n169a2 c 97 69\n169ae d 97 69\n169bb 1 97 69\n169bc c 105 69\n169c8 d 105 69\n169d5 1 105 69\n169d6 c 105 69\n169e2 d 105 69\n169ef 1 105 69\n169f0 c 67 68\n169fc 2 67 68\n169fe c 99 69\n16a0a 14 100 69\n16a1e c 99 69\n16a2a 14 100 69\n16a3e c 129 62\n16a4a 30 131 62\n16a7a c 65 68\n16a86 2 65 68\n16a88 c 72 68\n16a94 2 72 68\n16a96 c 97 69\n16aa2 d 97 69\n16aaf 1 97 69\n16ab0 c 105 69\n16abc d 105 69\n16ac9 1 105 69\n16aca c 105 69\n16ad6 d 105 69\n16ae3 1 105 69\n16ae4 c 67 68\n16af0 2 67 68\n16af2 c 99 69\n16afe 14 100 69\n16b12 c 99 69\n16b1e 14 100 69\nFUNC 16b32 2b 0 std::_Vector_base<unsigned char, std::allocator<unsigned char> >::get_allocator() const\n16b32 10 93 71\n16b42 1b 94 71\n16b5d 1 94 71\n16b6a 7 614 72\n16b71 1 614 72\n16b72 c 80 71\n16b7e d 80 71\n16b8b 1 80 71\n16b98 2 107 68\nFUNC 16b9a 2d 0 void std::_Destroy<unsigned char*, std::allocator<unsigned char> >(unsigned char*, unsigned char*, std::allocator<unsigned char>)\n16b9a c 171 73\n16ba6 2 173 73\n16ba8 12 174 73\n16bba b 173 73\n16bc5 2 174 73\n16bc7 1 174 73\n16bc8 c 84 71\n16bd4 2f 85 71\n16c03 2 86 71\n16c05 1 86 71\n16c06 c 96 71\n16c12 12 97 71\n16c24 2 98 71\nFUNC 16c26 1f 0 std::_List_base<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_init()\n16c26 c 338 73\n16c32 8 340 66\n16c3a b 341 66\n16c45 1 341 66\n16c46 c 105 69\n16c52 d 105 69\n16c5f 1 105 69\n16c60 c 125 66\n16c6c a 126 66\nFUNC 16c76 25 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::begin()\n16c76 c 579 73\n16c82 19 580 66\n16c9b 1 580 66\nFUNC 16c9c 23 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::end()\n16c9c c 597 73\n16ca8 17 597 66\n16cbf 1 597 66\n16cc0 c 603 72\n16ccc c 603 72\nFUNC 16cd8 2b 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::begin() const\n16cd8 c 342 73\n16ce4 1f 343 71\n16d03 1 343 71\nFUNC 16d04 2c 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::end() const\n16d04 c 360 73\n16d10 20 361 71\n16d3c 5 666 72\n16d41 1 666 72\n16d4f 31 759 72\nFUNC 16d80 3c 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::size() const\n16d80 c 402 73\n16d8c 30 403 71\n16dbc c 603 72\n16dc8 c 603 72\nFUNC 16dd4 23 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::begin()\n16dd4 c 333 73\n16de0 17 334 71\n16df7 1 334 71\n16e04 33 654 72\n16e37 1 654 72\nFUNC 16e38 26 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::end()\n16e38 c 351 73\n16e44 1a 352 71\n16e6a 7 614 72\n16e71 1 614 72\nFUNC 16e72 42 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::operator[](unsigned long)\n16e72 c 494 73\n16e7e 36 495 71\nFUNC 16eb4 13 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::max_size() const\n16eb4 c 407 73\n16ec0 7 408 71\n16ec7 1 408 71\n16ed4 5 666 72\n16ed9 1 666 72\n16ee6 d 623 72\n16ef3 5 624 72\n16ef8 c 382 62\n16f04 d 382 62\n16f11 1 382 62\nFUNC 16f12 2b 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::get_allocator() const\n16f12 10 360 73\n16f22 1b 361 62\n16f3d 1 361 62\nFUNC 16f3e 2d 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::get_allocator() const\n16f3e 10 764 73\n16f4e 1d 765 62\n16f6b 1 765 62\nFUNC 16f6c 13 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>::operator*() const\n16f6c c 134 73\n16f78 7 135 62\n16f7f 1 135 62\n16f8c 2 107 68\n16f8e c 129 62\n16f9a 30 131 62\nFUNC 16fca 2c 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::end() const\n16fca 10 799 73\n16fda 1c 800 62\nFUNC 16ff6 2c 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::begin() const\n16ff6 10 781 73\n17006 1c 782 62\nFUNC 17022 2e 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::end()\n17022 10 790 73\n17032 1e 791 62\nFUNC 17050 3c 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::_M_range_check(unsigned long) const\n17050 13 515 73\n17063 15 517 71\n17078 14 518 71\nFUNC 1708c 32 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::at(unsigned long)\n1708c c 534 73\n17098 12 536 71\n170aa 14 537 71\n170ca 2e 104 68\n170f8 c 84 71\n17104 2f 85 71\n17133 2 86 71\n17135 1 86 71\n17136 c 96 71\n17142 12 97 71\n17154 2 98 71\n17156 c 603 72\n17162 c 603 72\nFUNC 1716e 23 0 std::vector<unsigned char, std::allocator<unsigned char> >::begin()\n1716e c 333 73\n1717a 17 334 71\n17191 1 334 71\n1719e 27 654 72\n171c5 1 654 72\nFUNC 171c6 42 0 std::vector<unsigned char, std::allocator<unsigned char> >::operator[](unsigned long)\n171c6 c 494 73\n171d2 36 495 71\nFUNC 17208 26 0 std::vector<unsigned char, std::allocator<unsigned char> >::end()\n17208 c 351 73\n17214 1a 352 71\n1723a d 94 68\n17247 1 94 68\nFUNC 17248 2f 0 std::_Vector_base<unsigned char, std::allocator<unsigned char> >::_M_deallocate(unsigned char*, unsigned long)\n17248 c 120 73\n17254 6 122 71\n1725a 1d 123 71\n17277 1 123 71\n17278 c 108 71\n17284 3a 109 71\n172be c 188 71\n172ca 12 189 71\n172dc 2 190 71\n172de c 272 71\n172ea 4b 273 71\n17335 1 273 71\n17336 13 62 74\n17349 10 62 74\n17359 a 63 74\n17363 25 64 74\n17388 1a 66 74\n173a2 13 62 74\n173b5 10 62 74\n173c5 a 63 74\n173cf 25 64 74\n173f4 1a 66 74\n1740e c 188 71\n1741a 12 189 71\n1742c 2 190 71\n1743b 31 759 72\n1746c c 65 68\n17478 2 65 68\n1747a c 103 69\n17486 d 103 69\n17493 1 103 69\nFUNC 17494 2d 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::get_allocator() const\n17494 10 570 74\n174a4 1d 571 66\n174c1 1 571 66\n174ce 2e 104 68\nFUNC 174fc 20 0 std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator!=(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > const&) const\n174fc c 172 74\n17508 14 173 66\nFUNC 1751c 1d 0 std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator++()\n1751c c 219 74\n17528 c 221 66\n17534 5 222 66\n17539 1 222 66\nFUNC 1753a 1d 0 std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator++()\n1753a c 138 74\n17546 c 140 66\n17552 5 141 66\n17557 1 141 66\nFUNC 17558 16 0 std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator*() const\n17558 c 211 74\n17564 a 212 66\nFUNC 1756e 16 0 std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator*() const\n1756e c 130 74\n1757a a 131 66\nFUNC 17584 20 0 std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator==(std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > const&) const\n17584 c 249 74\n17590 14 250 66\nFUNC 175a4 35 0 bool __gnu_cxx::operator!=<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > > const&, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > > const&)\n175a4 d 699 74\n175b1 28 700 72\n175d9 1 700 72\nFUNC 175da 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, std::allocator<dwarf2reader::CompilationUnit::Abbrev>)\n175da c 171 74\n175e6 2 173 73\n175e8 1a 174 73\n17602 21 173 73\n17623 2 174 73\n17625 1 174 73\n17626 c 127 62\n17632 29 127 62\n1765b 1 127 62\n1765c c 388 62\n17668 41 389 62\n176a9 2 390 62\n176ab 1 390 62\n176b8 d 94 68\n176c5 1 94 68\nFUNC 176c6 20 0 bool std::operator==<unsigned long long, unsigned long long&, unsigned long long*>(std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> const&, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> const&)\n176c6 c 243 74\n176d2 14 244 62\nFUNC 176e6 26 0 bool std::operator!=<unsigned long long, unsigned long long&, unsigned long long*>(std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> const&, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> const&)\n176e6 c 256 74\n176f2 1a 257 62\nFUNC 1770c 1a 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>::_S_buffer_size()\n1770c c 106 74\n17718 e 107 62\nFUNC 17726 3e 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>::_M_set_node(unsigned long long**)\n17726 d 229 74\n17733 9 231 62\n1773c b 232 62\n17747 1d 233 62\nFUNC 17764 50 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>::operator++()\n17764 c 142 74\n17770 d 144 62\n1777d f 145 62\n1778c 18 147 62\n177a4 b 148 62\n177af 5 150 62\nFUNC 177b4 4b 0 void std::_Destroy<std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>, std::allocator<unsigned long long> >(std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>, std::allocator<unsigned long long>)\n177b4 c 171 74\n177c0 2 173 73\n177c2 1a 174 73\n177dc 21 173 73\n177fd 2 174 73\n177ff 1 174 73\nFUNC 17800 50 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>::operator--()\n17800 c 162 74\n1780c f 164 62\n1781b 18 166 62\n17833 b 167 62\n1783e d 169 62\n1784b 5 170 62\nFUNC 17850 39 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::back()\n17850 c 988 74\n1785c 15 990 62\n17871 b 991 62\n1787c d 992 62\n17889 1 992 62\nFUNC 1788a 19 0 std::stack<unsigned long long, std::deque<unsigned long long, std::allocator<unsigned long long> > >::top()\n1788a c 163 75\n17896 d 166 75\n178a3 1 166 75\nFUNC 178a4 66 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>::difference_type std::operator-<unsigned long long, unsigned long long&, unsigned long long*, unsigned long long&, unsigned long long*>(std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> const&, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> const&)\n178a4 d 328 75\n178b1 59 333 62\nFUNC 1790a 26 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::size() const\n1790a c 840 75\n17916 1a 841 62\n1793c 36 662 72\n1797e 23 650 72\n179a1 1 650 72\n179a2 c 67 68\n179ae 2 67 68\n179b0 c 99 69\n179bc 14 100 69\n179d0 c 303 66\n179dc 12 304 66\n179ee 2 305 66\n179f0 c 326 66\n179fc 2f 327 66\n17a2b d 328 66\n17a38 c 457 66\n17a44 14 458 66\n17a58 c 211 74\n17a64 2d 211 74\n17a91 1 211 74\n17a9e 7 98 68\n17aa5 1 98 68\n17ab2 1d 85 68\n17acf 5 86 68\n17ad4 17 88 68\n17aeb 1 88 68\nFUNC 17aec 2a 0 std::_Vector_base<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::_M_allocate(unsigned long)\n17aec c 116 75\n17af8 1e 117 71\n17b22 d 94 68\n17b2f 1 94 68\nFUNC 17b30 34 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_deallocate_node(unsigned long long*)\n17b30 c 402 75\n17b3c 28 403 62\nFUNC 17b64 38 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_destroy_nodes(unsigned long long**, unsigned long long**)\n17b64 c 504 75\n17b70 8 506 62\n17b78 14 507 62\n17b8c e 506 62\n17b9a 2 507 62\nFUNC 17b9c 62 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::_M_pop_back_aux()\n17b9c c 391 76\n17ba8 15 393 76\n17bbd 1b 394 76\n17bd8 f 395 76\n17be7 17 396 76\nFUNC 17bfe 4f 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::pop_back()\n17bfe c 1081 76\n17c0a 10 1083 62\n17c1a f 1086 62\n17c29 17 1087 62\n17c40 d 1090 62\n17c4d 1 1090 62\nFUNC 17c4e 19 0 std::stack<unsigned long long, std::deque<unsigned long long, std::allocator<unsigned long long> > >::pop()\n17c4e c 205 76\n17c5a d 208 75\n17c67 1 208 75\n17c68 c 72 68\n17c74 2 72 68\n17c76 c 105 69\n17c82 d 105 69\n17c8f 1 105 69\n17c90 c 603 72\n17c9c c 603 72\nFUNC 17ca8 2b 0 std::vector<unsigned char, std::allocator<unsigned char> >::begin() const\n17ca8 c 342 76\n17cb4 1f 343 71\n17cd3 1 343 71\nFUNC 17cd4 2c 0 std::vector<unsigned char, std::allocator<unsigned char> >::end() const\n17cd4 c 360 76\n17ce0 20 361 71\n17d0c 5 666 72\n17d11 1 666 72\n17d1f 28 759 72\n17d47 1 759 72\nFUNC 17d48 3c 0 std::vector<unsigned char, std::allocator<unsigned char> >::size() const\n17d48 c 402 76\n17d54 30 403 71\n17d90 d 623 72\n17d9d 5 624 72\n17dae 5 666 72\n17db3 1 666 72\nFUNC 17db4 35 0 bool __gnu_cxx::operator!=<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > > const&, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > > const&)\n17db4 d 699 76\n17dc1 28 700 72\n17de9 1 700 72\nFUNC 17dea 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, std::allocator<unsigned char> >(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, std::allocator<unsigned char>)\n17dea c 171 76\n17df6 2 173 73\n17df8 1a 174 73\n17e12 21 173 73\n17e33 2 174 73\n17e35 1 174 73\n17e43 28 759 72\n17e6b 1 759 72\n17e78 2a 662 72\nFUNC 17ea2 13 0 std::vector<unsigned char, std::allocator<unsigned char> >::max_size() const\n17ea2 c 407 76\n17eae 7 408 71\n17eb5 1 408 71\n17ec2 16 650 72\n17ee4 7 98 68\n17eeb 1 98 68\n17ef8 1d 85 68\n17f15 5 86 68\n17f1a 10 88 68\nFUNC 17f2a 29 0 std::_List_base<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_get_node()\n17f2a c 311 76\n17f36 1d 312 66\n17f53 1 312 66\nFUNC 17f54 5f 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_create_node(std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> const&)\n17f54 d 435 76\n17f61 e 437 66\n17f6f 3c 440 66\n17fab 8 447 66\n17fb3 1 447 66\nFUNC 17fb4 35 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_insert(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> const&)\n17fb4 c 1149 76\n17fc0 15 1151 66\n17fd5 14 1152 66\n17fe9 1 1152 66\nFUNC 17fea 52 0 void std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_insert_dispatch<std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, __false_type)\n17fea c 1126 66\n17ff6 2 1128 66\n17ff8 21 1129 66\n18019 21 1128 66\n1803a 2 1129 66\nFUNC 1803c 36 0 void std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::insert<std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >)\n1803c c 838 66\n18048 2a 842 66\n18072 e 491 66\n18080 32 492 66\n180b2 64 493 66\n18116 c 211 74\n18122 3d 211 74\n1815f 1 211 74\n1816d 5c 104 68\n181c9 1 104 68\nFUNC 181ca 31 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::push_back(std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> const&)\n181ca c 772 76\n181d6 25 773 66\n181fb 1 773 66\nFUNC 181fc 69 0 void std::_Construct<dwarf2reader::CompilationUnit::Abbrev, dwarf2reader::CompilationUnit::Abbrev>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev const&)\n181fc d 77 76\n18209 5c 81 73\n18265 1 81 73\n18272 7 98 68\n18279 1 98 68\n18286 1d 85 68\n182a3 5 86 68\n182a8 10 88 68\n182b8 c 65 68\n182c4 2 65 68\n182c6 c 103 69\n182d2 d 103 69\n182df 1 103 69\nFUNC 182e0 4d 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_get_map_allocator() const\n182e0 11 394 76\n182f1 3c 395 62\n1832d 1 395 62\nFUNC 1832e 75 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_allocate_map(unsigned long)\n1832e d 406 76\n1833b 68 407 62\n183a3 1 407 62\nFUNC 183a4 47 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_deallocate_map(unsigned long long**, unsigned long)\n183a4 c 410 76\n183b0 3b 411 62\n183eb 1 411 62\n183ec c 424 62\n183f8 9 426 62\n18401 22 428 62\n18423 2b 430 62\n1844e c 714 62\n1845a 70 715 62\n184ca c 111 75\n184d6 d 111 75\n184e3 1 111 75\n184e4 c 259 67\n184f0 26 259 67\n18522 7 98 68\n18529 1 98 68\n18536 1d 85 68\n18553 5 86 68\n18558 10 88 68\nFUNC 18568 33 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_allocate_node()\n18568 c 398 76\n18574 27 399 62\n1859b 1 399 62\nFUNC 1859c 82 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_create_nodes(unsigned long long**, unsigned long long**)\n1859c d 486 76\n185a9 8 491 62\n185b1 12 492 62\n185c3 13 491 62\n185d6 b 494 62\n185e1 19 496 62\n185fa b 497 62\n18605 13 494 62\n18618 6 497 62\nFUNC 1861e 17b 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_initialize_map(unsigned long)\n1861e d 447 76\n1862b 1e 450 62\n18649 2a 452 62\n18673 1c 454 62\n1868f 19 462 62\n186a8 c 463 62\n186b4 1e 466 62\n186d2 b 467 62\n186dd 1e 469 62\n186fb 9 470 62\n18704 a 471 62\n1870e b 472 62\n18719 13 467 62\n1872c 15 475 62\n18741 18 476 62\n18759 c 477 62\n18765 34 478 62\n18799 1 478 62\n1879a d 366 62\n187a7 12 367 62\n187b9 39 368 62\n187f2 c 645 62\n187fe 1c 646 62\nFUNC 1881a 4d 0 void std::__fill<true>::fill<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char const&)\n1881a c 539 61\n18826 9 541 61\n1882f 2 542 61\n18831 13 543 61\n18844 21 542 61\n18865 2 543 61\n18867 1 543 61\nFUNC 18868 2b 0 void std::fill<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char const&)\n18868 c 560 76\n18874 4 567 61\n18878 1b 568 61\n18893 1 568 61\nFUNC 18894 6a 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_erase(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >)\n18894 d 1157 76\n188a1 b 1159 66\n188ac 6 1160 66\n188b2 35 1161 66\n188e7 17 1162 66\nFUNC 188fe 37 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::erase(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >)\n188fe c 95 77\n1890a 14 97 77\n1891e 12 98 77\n18930 5 99 77\n18935 1 99 77\nFUNC 18936 3e 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::erase(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >)\n18936 c 883 77\n18942 2 885 66\n18944 15 886 66\n18959 16 885 66\n1896f 5 887 66\nFUNC 18974 129 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::operator=(std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > > const&)\n18974 e 120 77\n18982 c 122 77\n1898e e 124 77\n1899c e 125 77\n189aa e 126 77\n189b8 e 127 77\n189c6 2 128 77\n189c8 20 130 77\n189e8 5a 128 77\n18a42 16 131 77\n18a58 1b 132 77\n18a73 20 134 77\n18a93 a 136 77\n18a9d 1 136 77\nFUNC 18a9e 4c 0 dwarf2reader::CompilationUnit::Abbrev::operator=(dwarf2reader::CompilationUnit::Abbrev const&)\n18a9e c 211 77\n18aaa 40 211 74\nFUNC 18aea 52 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy<false, std::random_access_iterator_tag>::copy<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*)\n18aea c 280 61\n18af6 1a 283 61\n18b10 12 285 61\n18b22 4 286 61\n18b26 6 287 61\n18b2c b 283 61\n18b37 5 289 61\nFUNC 18b3c 2b 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy_aux<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*)\n18b3c c 307 77\n18b48 4 315 61\n18b4c 1b 317 61\n18b67 1 317 61\n18b76 56 354 61\n18bd8 4 384 61\n18bdc 4 385 61\n18be0 1b 387 61\n18bfb 1 387 61\nFUNC 18bfc ac 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::erase(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >)\n18bfc d 122 78\n18c09 26 124 78\n18c2f 43 125 78\n18c72 2e 126 78\n18ca0 8 127 78\nFUNC 18ca8 54 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy_backward<false, std::random_access_iterator_tag>::copy_b<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*)\n18ca8 c 408 61\n18cb4 1a 411 61\n18cce 1e 412 61\n18cec b 411 61\n18cf7 5 413 61\nFUNC 18cfc 2b 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy_backward_aux<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*)\n18cfc c 432 78\n18d08 4 440 61\n18d0c 1b 443 61\n18d27 1 443 61\n18d36 56 482 61\n18d98 4 514 61\n18d9c 4 515 61\n18da0 1b 517 61\n18dbb 1 517 61\nFUNC 18dbc 4d 0 void std::__fill<false>::fill<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev const&)\n18dbc c 526 61\n18dc8 2 528 61\n18dca 1c 529 61\n18de6 21 528 61\n18e07 2 529 61\n18e09 1 529 61\nFUNC 18e0a 2b 0 void std::fill<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev const&)\n18e0a c 560 78\n18e16 4 567 61\n18e1a 1b 568 61\n18e35 1 568 61\nFUNC 18e36 3f 0 unsigned char* std::__copy<true, std::random_access_iterator_tag>::copy<unsigned char>(unsigned char const*, unsigned char const*, unsigned char*)\n18e36 c 298 61\n18e42 22 300 61\n18e64 11 301 61\n18e75 1 301 61\nFUNC 18e76 2b 0 unsigned char* std::__copy_aux<unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)\n18e76 c 307 78\n18e82 4 315 61\n18e86 1b 317 61\n18ea1 1 317 61\n18eb0 56 354 61\n18f12 4 384 61\n18f16 4 385 61\n18f1a 1b 387 61\n18f35 1 387 61\nFUNC 18f36 a0 0 std::vector<unsigned char, std::allocator<unsigned char> >::erase(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >)\n18f36 d 122 78\n18f43 26 124 78\n18f69 43 125 78\n18fac 22 126 78\n18fce 8 127 78\n18fe2 7 98 68\n18fe9 1 98 68\n18ff6 1d 85 68\n19013 5 86 68\n19018 d 88 68\n19025 1 88 68\nFUNC 19026 2a 0 std::_Vector_base<unsigned char, std::allocator<unsigned char> >::_M_allocate(unsigned long)\n19026 c 116 78\n19032 1e 117 71\n1905c 1b 74 79\n19077 1 74 79\n19084 23 113 79\n190a7 1 113 79\n190b4 1b 254 79\n190cf 1 254 79\nFUNC 190d0 19 0 void std::_Destroy<dwarf2reader::CompilationUnit::Abbrev>(dwarf2reader::CompilationUnit::Abbrev*)\n190d0 c 106 79\n190dc d 107 73\n190e9 1 107 73\nFUNC 190ea 44 0 void std::__destroy_aux<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > > >(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __false_type)\n190ea c 119 79\n190f6 2 121 73\n190f8 13 122 73\n1910b 21 121 73\n1912c 2 122 73\nFUNC 1912e 28 0 void std::_Destroy<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > > >(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >)\n1912e c 148 79\n1913a 1c 155 73\nFUNC 19156 8d 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, __false_type)\n19156 d 188 79\n19163 6 190 79\n19169 2 193 79\n1916b 1c 194 79\n19187 1b 193 79\n191a2 b 196 79\n191ad 12 198 79\n191bf b 199 79\n191ca 13 196 79\n191dd 6 199 79\n191e3 1 199 79\nFUNC 191e4 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&)\n191e4 c 214 79\n191f0 23 218 79\n19213 1 218 79\nFUNC 19214 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, std::allocator<dwarf2reader::CompilationUnit::Abbrev>)\n19214 c 308 79\n19220 1b 310 79\n1923b 1 310 79\n19249 6 82 79\n1924f 2 85 79\n19251 24 86 79\n19275 2c 85 79\n192a1 b 87 79\n192ac b 89 79\n192b7 12 91 79\n192c9 b 92 79\n192d4 13 89 79\n192e7 9 92 79\n192fc 23 113 79\n1931f 1 113 79\n1932c 1b 254 79\n19347 1 254 79\nFUNC 19348 409 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::_M_insert_aux(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev const&)\n19348 14 249 79\n1935c 14 251 78\n19370 22 253 78\n19392 f 255 78\n193a1 12 256 78\n193b3 55 257 78\n19408 4b 260 78\n19453 e 264 78\n19461 15 265 78\n19476 e 266 78\n19484 1d 271 78\n194a1 8 272 78\n194a9 e 273 78\n194b7 27 275 78\n194de 6 276 78\n194e4 55 279 78\n19539 25 284 78\n1955e b 285 78\n19569 4f 286 78\n195b8 3 284 78\n195bb 13 279 78\n195ce e 286 78\n195dc 4d 298 78\n19629 36 299 78\n1965f 12 302 78\n19671 13 303 78\n19684 2e 304 78\n196b2 13 286 78\n196c5 b 292 78\n196d0 39 294 78\n19709 23 295 78\n1972c b 296 78\n19737 13 292 78\n1974a 7 304 78\n19751 1 304 78\nFUNC 19752 70 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::push_back(dwarf2reader::CompilationUnit::Abbrev const&)\n19752 c 602 79\n1975e 10 604 71\n1976e 1e 606 71\n1978c 11 607 71\n1979d 25 610 71\nFUNC 197c2 50 0 unsigned char* std::__copy_backward<true, std::random_access_iterator_tag>::copy_b<unsigned char>(unsigned char const*, unsigned char const*, unsigned char*)\n197c2 d 422 61\n197cf f 424 61\n197de 24 425 61\n19802 10 426 61\nFUNC 19812 2b 0 unsigned char* std::__copy_backward_aux<unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)\n19812 c 432 79\n1981e 4 440 61\n19822 1b 443 61\n1983d 1 443 61\n1984c 56 482 61\n198ae 4 514 61\n198b2 4 515 61\n198b6 1b 517 61\n198d1 1 517 61\nFUNC 198d2 32 0 unsigned char* std::fill_n<unsigned long>(unsigned char*, unsigned long, unsigned char const&)\n198d2 c 647 79\n198de 1e 649 61\n198fc 8 650 61\nFUNC 19904 27 0 void std::__uninitialized_fill_n_aux<unsigned char*, unsigned long, unsigned char>(unsigned char*, unsigned long, unsigned char const&, __true_type)\n19904 c 182 79\n19910 1b 183 79\n1992b 1 183 79\nFUNC 1992c 2f 0 void std::uninitialized_fill_n<unsigned char*, unsigned long, unsigned char>(unsigned char*, unsigned long, unsigned char const&)\n1992c c 214 79\n19938 23 218 79\n1995b 1 218 79\nFUNC 1995c 27 0 void std::__uninitialized_fill_n_a<unsigned char*, unsigned long, unsigned char, unsigned char>(unsigned char*, unsigned long, unsigned char const&, std::allocator<unsigned char>)\n1995c c 308 79\n19968 1b 310 79\n19983 1 310 79\nFUNC 19984 27 0 void std::__destroy_aux<dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, __false_type)\n19984 c 119 79\n19990 2 121 73\n19992 b 122 73\n1999d c 121 73\n199a9 2 122 73\n199ab 1 122 73\nFUNC 199ac 28 0 void std::_Destroy<dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*)\n199ac c 148 79\n199b8 1c 155 73\nFUNC 199d4 88 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_aux<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, __false_type)\n199d4 d 80 79\n199e1 6 82 79\n199e7 2 85 79\n199e9 12 86 79\n199fb 12 85 79\n19a0d b 87 79\n19a18 b 89 79\n19a23 12 91 79\n19a35 b 92 79\n19a40 13 89 79\n19a53 9 92 79\nFUNC 19a5c 2f 0 dwarf2reader::CompilationUnit::Abbrev* std::uninitialized_copy<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*)\n19a5c c 108 79\n19a68 23 113 79\n19a8b 1 113 79\nFUNC 19a8c 27 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_a<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, std::allocator<dwarf2reader::CompilationUnit::Abbrev>)\n19a8c c 252 79\n19a98 1b 254 79\n19ab3 1 254 79\nFUNC 19ab4 7e 0 void std::__uninitialized_fill_n_aux<dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev>(dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, __false_type)\n19ab4 d 188 79\n19ac1 6 190 79\n19ac7 2 193 79\n19ac9 12 194 79\n19adb 16 193 79\n19af1 b 196 79\n19afc 12 198 79\n19b0e b 199 79\n19b19 13 196 79\n19b2c 6 199 79\nFUNC 19b32 2f 0 void std::uninitialized_fill_n<dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev>(dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&)\n19b32 c 214 79\n19b3e 23 218 79\n19b61 1 218 79\nFUNC 19b62 27 0 void std::__uninitialized_fill_n_a<dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev, dwarf2reader::CompilationUnit::Abbrev>(dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, std::allocator<dwarf2reader::CompilationUnit::Abbrev>)\n19b62 c 308 79\n19b6e 1b 310 79\n19b89 1 310 79\nFUNC 19b8a a5 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_aux<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev*>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev*, __false_type)\n19b8a d 80 79\n19b97 6 82 79\n19b9d 2 85 79\n19b9f 1a 86 79\n19bb9 27 85 79\n19be0 b 87 79\n19beb b 89 79\n19bf6 12 91 79\n19c08 b 92 79\n19c13 13 89 79\n19c26 9 92 79\n19c2f 1 92 79\nFUNC 19c30 2f 0 dwarf2reader::CompilationUnit::Abbrev* std::uninitialized_copy<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev*>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev*)\n19c30 c 108 79\n19c3c 23 113 79\n19c5f 1 113 79\nFUNC 19c60 27 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev*, std::allocator<dwarf2reader::CompilationUnit::Abbrev>)\n19c60 c 252 79\n19c6c 1b 254 79\n19c87 1 254 79\nFUNC 19c88 5f8 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::_M_fill_insert(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&)\n19c88 15 311 79\n19c9d b 313 78\n19ca8 2a 315 78\n19cd2 12 318 78\n19ce4 23 319 78\n19d07 15 320 78\n19d1c c 321 78\n19d28 5a 323 78\n19d82 1c 327 78\n19d9e 35 328 78\n19dd3 16 323 78\n19de9 30 330 78\n19e19 10 343 78\n19e29 48 334 78\n19e71 21 338 78\n19e92 3d 339 78\n19ecf 13 334 78\n19ee2 b 339 78\n19eed 1c 342 78\n19f09 1e 343 78\n19f27 13 339 78\n19f3a 24 343 78\n19f5e e 348 78\n19f6c 1e 349 78\n19f8a e 350 78\n19f98 1d 353 78\n19fb5 8 354 78\n19fbd e 355 78\n19fcb 27 357 78\n19ff2 6 358 78\n19ff8 4d 361 78\n1a045 40 365 78\n1a085 18 367 78\n1a09d 44 368 78\n1a0e1 3 365 78\n1a0e4 19 361 78\n1a0fd 13 365 78\n1a110 e 368 78\n1a11e 3e 379 78\n1a15c 36 381 78\n1a192 12 384 78\n1a1a4 13 385 78\n1a1b7 2e 386 78\n1a1e5 e 368 78\n1a1f3 b 372 78\n1a1fe 39 374 78\n1a237 23 376 78\n1a25a b 377 78\n1a265 13 372 78\n1a278 8 386 78\nFUNC 1a280 2e 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::insert(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&)\n1a280 c 657 79\n1a28c 22 658 71\nFUNC 1a2ae ab 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::resize(unsigned long, dwarf2reader::CompilationUnit::Abbrev const&)\n1a2ae d 422 79\n1a2bb 15 424 71\n1a2d0 48 425 71\n1a318 41 427 71\n1a359 1 427 71\nFUNC 1a35a 63 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::resize(unsigned long)\n1a35a d 441 79\n1a367 56 442 71\n1a3bd 1 442 71\nFUNC 1a3be 13 0 std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>::operator*() const\n1a3be c 134 79\n1a3ca 7 135 62\n1a3d1 1 135 62\nFUNC 1a3d2 3f 0 unsigned long long** std::__copy<true, std::random_access_iterator_tag>::copy<unsigned long long*>(unsigned long long* const*, unsigned long long* const*, unsigned long long**)\n1a3d2 c 298 61\n1a3de 22 300 61\n1a400 11 301 61\n1a411 1 301 61\nFUNC 1a412 2b 0 unsigned long long** std::__copy_aux<unsigned long long**, unsigned long long**>(unsigned long long**, unsigned long long**, unsigned long long**)\n1a412 c 307 79\n1a41e 4 315 61\n1a422 1b 317 61\n1a43d 1 317 61\nFUNC 1a43e 27 0 unsigned long long** std::__copy_normal<false, false>::copy_n<unsigned long long**, unsigned long long**>(unsigned long long**, unsigned long long**, unsigned long long**)\n1a43e c 325 61\n1a44a 1b 326 61\n1a465 1 326 61\nFUNC 1a466 2f 0 unsigned long long** std::copy<unsigned long long**, unsigned long long**>(unsigned long long**, unsigned long long**, unsigned long long**)\n1a466 c 376 79\n1a472 4 384 61\n1a476 4 385 61\n1a47a 1b 387 61\n1a495 1 387 61\nFUNC 1a496 60 0 unsigned long long** std::__copy_backward<true, std::random_access_iterator_tag>::copy_b<unsigned long long*>(unsigned long long* const*, unsigned long long* const*, unsigned long long**)\n1a496 d 422 61\n1a4a3 12 424 61\n1a4b5 2e 425 61\n1a4e3 13 426 61\nFUNC 1a4f6 2b 0 unsigned long long** std::__copy_backward_aux<unsigned long long**, unsigned long long**>(unsigned long long**, unsigned long long**, unsigned long long**)\n1a4f6 c 432 79\n1a502 4 440 61\n1a506 1b 443 61\n1a521 1 443 61\nFUNC 1a522 27 0 unsigned long long** std::__copy_backward_normal<false, false>::copy_b_n<unsigned long long**, unsigned long long**>(unsigned long long**, unsigned long long**, unsigned long long**)\n1a522 c 451 61\n1a52e 1b 452 61\n1a549 1 452 61\nFUNC 1a54a 2f 0 unsigned long long** std::copy_backward<unsigned long long**, unsigned long long**>(unsigned long long**, unsigned long long**, unsigned long long**)\n1a54a c 504 79\n1a556 4 514 61\n1a55a 4 515 61\n1a55e 1b 517 61\n1a579 1 517 61\nFUNC 1a57a 1df 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::_M_reallocate_map(unsigned long, bool)\n1a57a 13 723 79\n1a58d 1b 726 76\n1a5a8 9 727 76\n1a5b1 13 730 76\n1a5c4 39 732 76\n1a5fd b 735 76\n1a608 27 736 76\n1a62f 2f 740 76\n1a65e 26 748 76\n1a684 15 750 76\n1a699 36 751 76\n1a6cf 22 753 76\n1a6f1 1e 756 76\n1a70f 8 758 76\n1a717 9 759 76\n1a720 15 762 76\n1a735 24 763 76\n1a759 1 763 76\nFUNC 1a75a 59 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::_M_reserve_map_at_back(unsigned long)\n1a75a e 1443 79\n1a768 2a 1445 62\n1a792 21 1447 62\n1a7b3 1 1447 62\nFUNC 1a7b4 8c 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::_M_push_back_aux(unsigned long long const&)\n1a7b4 c 345 79\n1a7c0 e 347 76\n1a7ce 13 348 76\n1a7e1 18 349 76\n1a7f9 1e 352 76\n1a817 1b 353 76\n1a832 c 355 76\n1a83e 2 360 76\nFUNC 1a840 62 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::push_back(unsigned long long const&)\n1a840 c 1039 79\n1a84c 13 1041 62\n1a85f 1e 1044 62\n1a87d 11 1045 62\n1a88e 14 1048 62\nFUNC 1a8a2 20 0 std::stack<unsigned long long, std::deque<unsigned long long, std::allocator<unsigned long long> > >::push(unsigned long long const&)\n1a8a2 c 190 79\n1a8ae 14 191 75\nFUNC 1a8c2 27 0 unsigned char* std::__copy_normal<false, false>::copy_n<unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)\n1a8c2 c 325 61\n1a8ce 1b 326 61\n1a8e9 1 326 61\nFUNC 1a8ea 2f 0 unsigned char* std::copy<unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)\n1a8ea c 376 79\n1a8f6 4 384 61\n1a8fa 4 385 61\n1a8fe 1b 387 61\n1a919 1 387 61\nFUNC 1a91a 27 0 unsigned char* std::__uninitialized_copy_aux<unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*, __true_type)\n1a91a c 73 79\n1a926 1b 74 79\n1a941 1 74 79\nFUNC 1a942 2f 0 unsigned char* std::uninitialized_copy<unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)\n1a942 c 108 79\n1a94e 23 113 79\n1a971 1 113 79\nFUNC 1a972 27 0 unsigned char* std::__uninitialized_copy_a<unsigned char*, unsigned char*, unsigned char>(unsigned char*, unsigned char*, unsigned char*, std::allocator<unsigned char>)\n1a972 c 252 79\n1a97e 1b 254 79\n1a999 1 254 79\nFUNC 1a99a 40 0 unsigned char* std::__copy_normal<true, false>::copy_n<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*)\n1a99a d 334 61\n1a9a7 33 335 61\nFUNC 1a9da 2f 0 unsigned char* std::copy<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*)\n1a9da c 376 79\n1a9e6 4 384 61\n1a9ea 4 385 61\n1a9ee 1b 387 61\n1aa09 1 387 61\nFUNC 1aa0a 27 0 unsigned char* std::__uninitialized_copy_aux<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*, __true_type)\n1aa0a c 73 79\n1aa16 1b 74 79\n1aa31 1 74 79\nFUNC 1aa32 2f 0 unsigned char* std::uninitialized_copy<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*)\n1aa32 c 108 79\n1aa3e 23 113 79\n1aa61 1 113 79\nFUNC 1aa62 27 0 unsigned char* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*, unsigned char>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*, std::allocator<unsigned char>)\n1aa62 c 252 79\n1aa6e 1b 254 79\n1aa89 1 254 79\n1aa96 9 616 61\n1aa9f 2 617 61\n1aaa1 13 618 61\n1aab4 16 617 61\n1aaca 5 619 61\n1aacf 1 619 61\n1aadc 4 641 61\n1aae0 1b 642 61\n1aafb 1 642 61\nFUNC 1aafc 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char const&, __true_type)\n1aafc c 182 79\n1ab08 1b 183 79\n1ab23 1 183 79\nFUNC 1ab24 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char const&)\n1ab24 c 214 79\n1ab30 23 218 79\n1ab53 1 218 79\nFUNC 1ab54 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char, unsigned char>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char const&, std::allocator<unsigned char>)\n1ab54 c 308 79\n1ab60 1b 310 79\n1ab7b 1 310 79\nFUNC 1ab7c 45a 0 std::vector<unsigned char, std::allocator<unsigned char> >::_M_fill_insert(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char const&)\n1ab7c 14 311 79\n1ab90 b 313 78\n1ab9b 21 315 78\n1abbc 9 318 78\n1abc5 23 319 78\n1abe8 15 320 78\n1abfd c 321 78\n1ac09 4e 323 78\n1ac57 11 327 78\n1ac68 30 328 78\n1ac98 35 330 78\n1accd 48 334 78\n1ad15 14 338 78\n1ad29 43 339 78\n1ad6c 11 342 78\n1ad7d 1e 343 78\n1ad9b e 348 78\n1ada9 1e 349 78\n1adc7 e 350 78\n1add5 1d 353 78\n1adf2 8 354 78\n1adfa e 355 78\n1ae08 27 357 78\n1ae2f 6 358 78\n1ae35 4d 361 78\n1ae82 40 365 78\n1aec2 18 367 78\n1aeda 4d 368 78\n1af27 3e 379 78\n1af65 2d 381 78\n1af92 12 384 78\n1afa4 13 385 78\n1afb7 1f 386 78\nFUNC 1afd6 2e 0 std::vector<unsigned char, std::allocator<unsigned char> >::insert(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char const&)\n1afd6 c 657 79\n1afe2 22 658 71\nFUNC 1b004 ab 0 std::vector<unsigned char, std::allocator<unsigned char> >::resize(unsigned long, unsigned char const&)\n1b004 d 422 79\n1b011 15 424 71\n1b026 48 425 71\n1b06e 41 427 71\n1b0af 1 427 71\nFUNC 1b0b0 2b 0 std::vector<unsigned char, std::allocator<unsigned char> >::resize(unsigned long)\n1b0b0 c 441 79\n1b0bc 1f 442 71\n1b0db 1 442 71\nFUNC 1b0dc 1a 0 std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>::_S_buffer_size()\n1b0dc c 106 79\n1b0e8 e 107 62\nFUNC 1b0f6 66 0 std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>::difference_type std::operator-<unsigned long long, unsigned long long const&, unsigned long long const*, unsigned long long const&, unsigned long long const*>(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*> const&, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*> const&)\n1b0f6 d 328 79\n1b103 59 333 62\nFUNC 1b15c 3e 0 std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>::_M_set_node(unsigned long long**)\n1b15c d 229 79\n1b169 9 231 62\n1b172 b 232 62\n1b17d 1d 233 62\nFUNC 1b19a 50 0 std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>::operator++()\n1b19a c 142 79\n1b1a6 d 144 62\n1b1b3 f 145 62\n1b1c2 18 147 62\n1b1da b 148 62\n1b1e5 5 150 62\nFUNC 1b1ea 84 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::__copy<false, std::random_access_iterator_tag>::copy<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> >(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>)\n1b1ea e 280 61\n1b1f8 17 283 61\n1b20f 20 285 61\n1b22f b 286 61\n1b23a b 287 61\n1b245 b 283 61\n1b250 1e 289 61\nFUNC 1b26e 7e 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::__copy_aux<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> >(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>)\n1b26e 11 307 79\n1b27f 4 315 61\n1b283 69 317 61\nFUNC 1b2ec 7a 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::__copy_normal<false, false>::copy_n<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> >(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>)\n1b2ec 11 325 61\n1b2fd 69 326 61\nFUNC 1b366 82 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::copy<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> >(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>)\n1b366 11 376 79\n1b377 4 384 61\n1b37b 4 385 61\n1b37f 69 387 61\nFUNC 1b3e8 7a 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::__uninitialized_copy_aux<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> >(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>, __true_type)\n1b3e8 11 73 79\n1b3f9 69 74 79\nFUNC 1b462 82 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::uninitialized_copy<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> >(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>)\n1b462 11 108 79\n1b473 71 113 79\nFUNC 1b4e4 7a 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::__uninitialized_copy_a<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>, unsigned long long>(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>, std::allocator<unsigned long long>)\n1b4e4 11 252 79\n1b4f5 69 254 79\n1b55e 10 679 62\n1b56e 64 680 62\n1b5d2 e8 681 62\n1b6ba c 143 75\n1b6c6 14 144 75\n1b6da 6 144 75\nFUNC 1b6e0 4d 0 __eprintf\n1b6e0 6 1826 80\n1b6e6 3 1832 80\n1b6e9 c 1826 80\n1b6f5 29 1832 80\n1b71e a 1837 80\n1b728 5 1838 80\n1b72d e8d3 1838 80\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/sender/Breakpad.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"7.10\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1050</int>\n\t\t<string key=\"IBDocument.SystemVersion\">10F569</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">762</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1038.29</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">461.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\" id=\"0\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.EditedObjectIDs\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t</object>\n\t\t<reference key=\"IBDocument.PluginDependencies\" ref=\"0\"/>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"504246249\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSCustomObject\" id=\"273934324\">\n\t\t\t\t<string key=\"NSClassName\">Reporter</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSCustomObject\" id=\"388635980\">\n\t\t\t\t<string key=\"NSClassName\">FirstResponder</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSCustomObject\" id=\"220995958\">\n\t\t\t\t<string key=\"NSClassName\">NSApplication</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSWindowTemplate\" id=\"762998835\">\n\t\t\t\t<int key=\"NSWindowStyleMask\">1</int>\n\t\t\t\t<int key=\"NSWindowBacking\">2</int>\n\t\t\t\t<string key=\"NSWindowRect\">{{72, 251}, {490, 489}}</string>\n\t\t\t\t<int key=\"NSWTFlags\">536871936</int>\n\t\t\t\t<string key=\"NSWindowTitle\"/>\n\t\t\t\t<string key=\"NSWindowClass\">NSWindow</string>\n\t\t\t\t<nil key=\"NSViewClass\"/>\n\t\t\t\t<string key=\"NSWindowContentMaxSize\">{1.79769e+308, 1.79769e+308}</string>\n\t\t\t\t<string key=\"NSWindowContentMinSize\">{72, 5}</string>\n\t\t\t\t<object class=\"NSView\" key=\"NSWindowView\" id=\"197525436\">\n\t\t\t\t\t<nil key=\"NSNextResponder\"/>\n\t\t\t\t\t<int key=\"NSvFlags\">264</int>\n\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSBox\" id=\"469837363\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"197525436\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">272</int>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSView\" id=\"966817352\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"469837363\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextField\" id=\"997378142\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"966817352\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{17, 36}, {456, 70}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"966817352\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"509794736\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272760832</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">Providing your email address is optional and will allow us contact you in case we need more details. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed arcu urna, pulvinar sit amet, tincidunt ac, fermentum ut, ligula. Quisque mi. Duis lectus. Vestibulum velit. Morbi turpis. Nunc at diam consectetur turpis volutpat tristique. Donec quis diam. Suspendisse scelerisque.</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"NSSupport\" id=\"26\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSName\">LucidaGrande</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">11</double>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">3100</int>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"997378142\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSBackgroundColor\" id=\"420457920\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">6</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSCatalogName\">System</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSColorName\">controlColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSColor\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC42NjY2NjY2NjY3AA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSTextColor\" id=\"800255527\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">6</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSCatalogName\">System</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSColorName\">controlTextColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSColor\" id=\"908763363\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MAA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextField\" id=\"975305147\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"966817352\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">290</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{87, 9}, {195, 19}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"966817352\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"592393645\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">-1804468671</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272761856</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"26\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSPlaceholderString\">optional</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"975305147\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSDrawsBackground\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSBackgroundColor\" id=\"128478752\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">6</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSCatalogName\">System</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSColorName\">textBackgroundColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSColor\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSTextColor\" id=\"734930533\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">6</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSCatalogName\">System</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSColorName\">textColor</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSColor\" ref=\"908763363\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextField\" id=\"268211031\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"966817352\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">292</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{17, 11}, {65, 14}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"966817352\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"461570326\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">68288064</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">71435264</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">EmailLabel:</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"26\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"268211031\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"420457920\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"800255527\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSButton\" id=\"538303250\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"966817352\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">289</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{456, 10}, {16, 17}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"966817352\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"778004767\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">-2080244224</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">Privacy Policy</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"NSSupport\" id=\"222882491\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSName\">LucidaGrande</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">13</double>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">1044</int>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"538303250\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">-2040250113</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">36</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"NSNormalImage\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSResourceName\">goArrow</string>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">400</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">75</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextField\" id=\"655227981\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"966817352\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">289</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{355, 11}, {100, 14}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"966817352\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"1012850565\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">68288064</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">4326400</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">PrivacyPolicyLabel</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"26\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"655227981\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"420457920\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"800255527\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrameSize\">{490, 114}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"469837363\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{0, 51}, {490, 114}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"197525436\"/>\n\t\t\t\t\t\t\t<string key=\"NSOffsets\">{0, 0}</string>\n\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSTitleCell\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Title</string>\n\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"NSSupport\" id=\"668643277\">\n\t\t\t\t\t\t\t\t\t<string key=\"NSName\">LucidaGrande</string>\n\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">11</double>\n\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"128478752\"/>\n\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSTextColor\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MCAwLjgwMDAwMDAxAA</bytes>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<reference key=\"NSContentView\" ref=\"966817352\"/>\n\t\t\t\t\t\t\t<int key=\"NSBorderType\">0</int>\n\t\t\t\t\t\t\t<int key=\"NSBoxType\">3</int>\n\t\t\t\t\t\t\t<int key=\"NSTitlePosition\">0</int>\n\t\t\t\t\t\t\t<bool key=\"NSTransparent\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"219938755\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"197525436\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">289</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{330, 12}, {146, 32}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"197525436\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"733475259\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">134217728</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">SendReportLabel</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"222882491\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"219938755\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">-2038284033</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">129</int>\n\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"222882491\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"NSKeyEquivalent\">DQ</string>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"409721323\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"197525436\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">289</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{214, 12}, {116, 32}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"197525436\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"586160416\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">134217728</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">CancelLabel</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"222882491\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"409721323\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">-2038284033</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">129</int>\n\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"222882491\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"NSKeyEquivalent\">Gw</string>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSBox\" id=\"468151514\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"197525436\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSView\" id=\"1059038623\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"468151514\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextField\" id=\"375247105\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"1059038623\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">266</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{17, 83}, {456, 154}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"1059038623\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"188082030\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272760832</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string type=\"base64-UTF8\" key=\"NSContents\">VGhlIHN5c3RlbSBhbmQgb3RoZXIgYXBwbGljYXRpb25zIGhhdmUgbm90IGJlZW4gYWZmZWN0ZWQuIEEg\ncmVwb3J0IGhhcyBiZWVuIGNyZWF0ZWQgdGhhdCB5b3UgY2FuIHNlbmQgdG8gPFJlYWxseSBMb25nIENv\nbXBhbnkgTmFtZT4gdG8gaGVscCBpZGVudGlmeSB0aGUgcHJvYmxlbS4gTG9yZW0gaXBzdW0gZG9sb3Ig\nc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gU2VkIGFyY3UgdXJuYSwgcHVsdmlu\nYXIgc2l0IGFtZXQsIHRpbmNpZHVudCBhYywgZmVybWVudHVtIHV0LCBsaWd1bGEuIFF1aXNxdWUgbWku\nIER1aXMgbGVjdHVzLiBWZXN0aWJ1bHVtIHZlbGl0LiBNb3JiaSB0dXJwaXMuIE51bmMgYXQgZGlhbSBj\nb25zZWN0ZXR1ciB0dXJwaXMgdm9sdXRwYXQgdHJpc3RpcXVlLiBEb25lYyBxdWlzIGRpYW0uIFN1c3Bl\nbmRpc3NlIHNjZWxlcmlzcXVlLiBRdWlzcXVlIHB1bHZpbmFyIG1pIGlkIHB1cnVzLiBFdGlhbSB2aXRh\nZSB0dXJwaXMgdml0YWUgbmVxdWUgcG9ydGEgY29uZ3VlLgoKUGxlYXNlIGhlbHAgdXMgZml4IHRoZSBw\ncm9ibGVtIGJ5IGRlc2NyaWJpbmcgd2hhdCBoYXBwZW5lZCBiZWZvcmUgdGhlIGNyYXNoLiBMb3JlbSBp\ncHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LiBTZWQgYXJjdSB1\ncm5hLCBwdWx2aW5hciBzaXQgYW1ldCwgdGluY2lkdW50IGFjLCBmZXJtZW50dW0gdXQsIGxpZ3VsYS4g\nUXVpc3F1ZSBtaS4gRHVpcyBsZWN0dXMuA</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"26\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"375247105\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"420457920\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"800255527\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextField\" id=\"996404163\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"1059038623\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">274</int>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 14}, {450, 61}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"1059038623\"/>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"242564194\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">341966337</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272760832</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 1 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 2 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 3 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 Line 4 </string>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"26\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"996404163\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSDrawsBackground\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"128478752\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"734930533\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSBox\" id=\"667608859\">\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"1059038623\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSView\" id=\"971021844\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"667608859\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextField\" id=\"1032334641\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"971021844\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">266</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{85, 10}, {381, 54}}</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"971021844\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"316557784\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272629760</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">The application &lt;Really Long App Name Here&gt; has quit unexpectedly.</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"NSSupport\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSName\">LucidaGrande-Bold</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">14</double>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"1032334641\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"420457920\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"800255527\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSImageView\" id=\"594334723\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"971021844\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSvFlags\">268</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableSet\" key=\"NSDragTypes\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\" key=\"set.sortedObjects\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Apple PDF pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Apple PICT pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>Apple PNG pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NSFilenamesPboardType</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string>NeXT TIFF v4.0 pasteboard type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{16, 0}, {64, 64}}</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"971021844\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSImageCell\" key=\"NSCell\" id=\"465445685\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">130560</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">33554432</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"NSContents\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSResourceName\">NSApplicationIcon</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSAlign\">0</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSScale\">0</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSStyle\">0</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSAnimates\">NO</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSEditable\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrameSize\">{482, 70}</string>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"667608859\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSFrame\">{{4, 245}, {482, 70}}</string>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"1059038623\"/>\n\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSOffsets\">{0, 0}</string>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSTitleCell\">\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">Title</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"668643277\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"128478752\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSTextColor\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MCAwLjgwMDAwMDAxAA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSContentView\" ref=\"971021844\"/>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSBorderType\">0</int>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSBoxType\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTitlePosition\">0</int>\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"NSTransparent\">NO</bool>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<string key=\"NSFrameSize\">{490, 325}</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"468151514\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{0, 160}, {490, 325}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"197525436\"/>\n\t\t\t\t\t\t\t<string key=\"NSOffsets\">{0, 0}</string>\n\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSTitleCell\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Title</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"668643277\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"128478752\"/>\n\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSTextColor\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MCAwLjgwMDAwMDAxAA</bytes>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<reference key=\"NSContentView\" ref=\"1059038623\"/>\n\t\t\t\t\t\t\t<int key=\"NSBorderType\">0</int>\n\t\t\t\t\t\t\t<int key=\"NSBoxType\">3</int>\n\t\t\t\t\t\t\t<int key=\"NSTitlePosition\">0</int>\n\t\t\t\t\t\t\t<bool key=\"NSTransparent\">NO</bool>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSTextField\" id=\"149448677\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"197525436\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">268</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{17, 20}, {163, 14}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"197525436\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSTextFieldCell\" key=\"NSCell\" id=\"690832321\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">68288064</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">272630784</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">xx seconds.</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"668643277\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"149448677\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"420457920\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSTextColor\" ref=\"800255527\"/>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"NSFrameSize\">{490, 489}</string>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSScreenRect\">{{0, 0}, {2560, 1578}}</string>\n\t\t\t\t<string key=\"NSMinSize\">{72, 27}</string>\n\t\t\t\t<string key=\"NSMaxSize\">{1.79769e+308, 1.79769e+308}</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSUserDefaultsController\" id=\"626548788\">\n\t\t\t\t<bool key=\"NSSharedInstance\">YES</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<object class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sendReport:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"219938755\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">45</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">cancel:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"409721323\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">46</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">showPrivacyPolicy:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"538303250\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">53</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBBindingConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">value: emailValue</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"975305147\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"273934324\"/>\n\t\t\t\t\t\t<object class=\"NSNibBindingConnector\" key=\"connector\">\n\t\t\t\t\t\t\t<reference key=\"NSSource\" ref=\"975305147\"/>\n\t\t\t\t\t\t\t<reference key=\"NSDestination\" ref=\"273934324\"/>\n\t\t\t\t\t\t\t<string key=\"NSLabel\">value: emailValue</string>\n\t\t\t\t\t\t\t<string key=\"NSBinding\">value</string>\n\t\t\t\t\t\t\t<string key=\"NSKeyPath\">emailValue</string>\n\t\t\t\t\t\t\t<object class=\"NSDictionary\" key=\"NSOptions\">\n\t\t\t\t\t\t\t\t<string key=\"NS.key.0\">NSNullPlaceholder</string>\n\t\t\t\t\t\t\t\t<string key=\"NS.object.0\">optional</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<int key=\"NSNibBindingConnectorVersion\">2</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">90</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">initialFirstResponder</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"762998835\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"219938755\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">91</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBBindingConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">value: commentsValue</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"996404163\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"273934324\"/>\n\t\t\t\t\t\t<object class=\"NSNibBindingConnector\" key=\"connector\">\n\t\t\t\t\t\t\t<reference key=\"NSSource\" ref=\"996404163\"/>\n\t\t\t\t\t\t\t<reference key=\"NSDestination\" ref=\"273934324\"/>\n\t\t\t\t\t\t\t<string key=\"NSLabel\">value: commentsValue</string>\n\t\t\t\t\t\t\t<string key=\"NSBinding\">value</string>\n\t\t\t\t\t\t\t<string key=\"NSKeyPath\">commentsValue</string>\n\t\t\t\t\t\t\t<object class=\"NSDictionary\" key=\"NSOptions\">\n\t\t\t\t\t\t\t\t<string key=\"NS.key.0\">NSNullPlaceholder</string>\n\t\t\t\t\t\t\t\t<string key=\"NS.object.0\">optional comments</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<int key=\"NSNibBindingConnectorVersion\">2</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">124</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">nextKeyView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"975305147\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"219938755\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">125</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">nextKeyView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"996404163\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"975305147\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">126</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">nextKeyView</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"219938755\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"996404163\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">127</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">delegate</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"996404163\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"273934324\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">128</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">alertWindow_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"762998835\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">142</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">preEmailBox_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"468151514\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">150</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">headerBox_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"667608859\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">151</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">emailSectionBox_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"469837363\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">152</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">privacyLinkLabel_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"655227981\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">153</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">commentMessage_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"375247105\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">154</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">dialogTitle_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1032334641\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">155</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">emailLabel_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"268211031\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">156</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">cancelButton_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"409721323\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">158</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">sendButton_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"219938755\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">159</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">emailEntryField_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"975305147\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">161</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">privacyLinkArrow_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"538303250\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">162</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">emailMessage_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"997378142\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">163</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">commentsEntryField_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"996404163\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">176</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBBindingConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">value: countdownMessage</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"149448677\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"273934324\"/>\n\t\t\t\t\t\t<object class=\"NSNibBindingConnector\" key=\"connector\">\n\t\t\t\t\t\t\t<reference key=\"NSSource\" ref=\"149448677\"/>\n\t\t\t\t\t\t\t<reference key=\"NSDestination\" ref=\"273934324\"/>\n\t\t\t\t\t\t\t<string key=\"NSLabel\">value: countdownMessage</string>\n\t\t\t\t\t\t\t<string key=\"NSBinding\">value</string>\n\t\t\t\t\t\t\t<string key=\"NSKeyPath\">countdownMessage</string>\n\t\t\t\t\t\t\t<int key=\"NSNibBindingConnectorVersion\">2</int>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">194</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">countdownLabel_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"149448677\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">208</int>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<object class=\"NSArray\" key=\"orderedObjects\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"504246249\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"273934324\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"388635980\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">First Responder</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-3</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"220995958\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">Application</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"762998835\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"197525436\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">Window</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"197525436\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"219938755\"/>\n\t\t\t\t\t\t\t<reference ref=\"409721323\"/>\n\t\t\t\t\t\t\t<reference ref=\"469837363\"/>\n\t\t\t\t\t\t\t<reference ref=\"468151514\"/>\n\t\t\t\t\t\t\t<reference ref=\"149448677\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"762998835\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">12</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"219938755\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"733475259\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"197525436\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">14</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"409721323\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"586160416\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"197525436\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">132</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"469837363\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"997378142\"/>\n\t\t\t\t\t\t\t<reference ref=\"975305147\"/>\n\t\t\t\t\t\t\t<reference ref=\"268211031\"/>\n\t\t\t\t\t\t\t<reference ref=\"538303250\"/>\n\t\t\t\t\t\t\t<reference ref=\"655227981\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"197525436\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">145</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"468151514\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"375247105\"/>\n\t\t\t\t\t\t\t<reference ref=\"996404163\"/>\n\t\t\t\t\t\t\t<reference ref=\"667608859\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"197525436\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">189</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"149448677\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"690832321\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"197525436\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">191</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"626548788\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">Shared User Defaults Controller</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">210</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"733475259\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"219938755\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">211</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"586160416\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"409721323\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">221</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"690832321\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"149448677\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">58</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"997378142\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"509794736\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"469837363\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">215</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"509794736\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"997378142\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">18</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"975305147\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"592393645\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"469837363\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">212</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"592393645\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"975305147\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">20</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"268211031\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"461570326\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"469837363\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">213</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"461570326\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"268211031\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">48</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"538303250\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"778004767\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"469837363\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">214</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"778004767\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"538303250\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">66</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"655227981\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"1012850565\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"469837363\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">216</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1012850565\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"655227981\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">8</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"375247105\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"188082030\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"468151514\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">217</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"188082030\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"375247105\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">116</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"996404163\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"242564194\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"468151514\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">218</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"242564194\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"996404163\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">147</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"667608859\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"1032334641\"/>\n\t\t\t\t\t\t\t<reference ref=\"594334723\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"468151514\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">3</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1032334641\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"316557784\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"667608859\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">219</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"316557784\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1032334641\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">6</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"594334723\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"465445685\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"667608859\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">220</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"465445685\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"594334723\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>-3.ImportedFromIB2</string>\n\t\t\t\t\t<string>1.IBEditorWindowLastContentRect</string>\n\t\t\t\t\t<string>1.IBWindowTemplateEditedContentRect</string>\n\t\t\t\t\t<string>1.ImportedFromIB2</string>\n\t\t\t\t\t<string>1.windowTemplate.hasMinSize</string>\n\t\t\t\t\t<string>1.windowTemplate.minSize</string>\n\t\t\t\t\t<string>116.CustomClassName</string>\n\t\t\t\t\t<string>116.ImportedFromIB2</string>\n\t\t\t\t\t<string>12.ImportedFromIB2</string>\n\t\t\t\t\t<string>132.ImportedFromIB2</string>\n\t\t\t\t\t<string>14.ImportedFromIB2</string>\n\t\t\t\t\t<string>145.ImportedFromIB2</string>\n\t\t\t\t\t<string>147.ImportedFromIB2</string>\n\t\t\t\t\t<string>18.CustomClassName</string>\n\t\t\t\t\t<string>18.ImportedFromIB2</string>\n\t\t\t\t\t<string>189.ImportedFromIB2</string>\n\t\t\t\t\t<string>191.ImportedFromIB2</string>\n\t\t\t\t\t<string>2.ImportedFromIB2</string>\n\t\t\t\t\t<string>20.ImportedFromIB2</string>\n\t\t\t\t\t<string>3.ImportedFromIB2</string>\n\t\t\t\t\t<string>48.ImportedFromIB2</string>\n\t\t\t\t\t<string>58.ImportedFromIB2</string>\n\t\t\t\t\t<string>6.ImportedFromIB2</string>\n\t\t\t\t\t<string>66.ImportedFromIB2</string>\n\t\t\t\t\t<string>8.ImportedFromIB2</string>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>{{0, 656}, {490, 489}}</string>\n\t\t\t\t\t<string>{{0, 656}, {490, 489}}</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>{72, 5}</string>\n\t\t\t\t\t<string>LengthLimitingTextField</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>LengthLimitingTextField</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"unlocalizedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"localizations\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">221</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">LengthLimitingTextField</string>\n\t\t\t\t\t<string key=\"superclassName\">NSTextField</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBUserSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">Reporter</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actions\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>cancel:</string>\n\t\t\t\t\t\t\t<string>sendReport:</string>\n\t\t\t\t\t\t\t<string>showPrivacyPolicy:</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>alertWindow_</string>\n\t\t\t\t\t\t\t<string>cancelButton_</string>\n\t\t\t\t\t\t\t<string>commentMessage_</string>\n\t\t\t\t\t\t\t<string>commentsEntryField_</string>\n\t\t\t\t\t\t\t<string>countdownLabel_</string>\n\t\t\t\t\t\t\t<string>dialogTitle_</string>\n\t\t\t\t\t\t\t<string>emailEntryField_</string>\n\t\t\t\t\t\t\t<string>emailLabel_</string>\n\t\t\t\t\t\t\t<string>emailMessage_</string>\n\t\t\t\t\t\t\t<string>emailSectionBox_</string>\n\t\t\t\t\t\t\t<string>headerBox_</string>\n\t\t\t\t\t\t\t<string>preEmailBox_</string>\n\t\t\t\t\t\t\t<string>privacyLinkArrow_</string>\n\t\t\t\t\t\t\t<string>privacyLinkLabel_</string>\n\t\t\t\t\t\t\t<string>sendButton_</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>NSWindow</string>\n\t\t\t\t\t\t\t<string>NSButton</string>\n\t\t\t\t\t\t\t<string>NSTextField</string>\n\t\t\t\t\t\t\t<string>LengthLimitingTextField</string>\n\t\t\t\t\t\t\t<string>NSTextField</string>\n\t\t\t\t\t\t\t<string>NSTextField</string>\n\t\t\t\t\t\t\t<string>LengthLimitingTextField</string>\n\t\t\t\t\t\t\t<string>NSTextField</string>\n\t\t\t\t\t\t\t<string>NSTextField</string>\n\t\t\t\t\t\t\t<string>NSBox</string>\n\t\t\t\t\t\t\t<string>NSBox</string>\n\t\t\t\t\t\t\t<string>NSBox</string>\n\t\t\t\t\t\t\t<string>NSView</string>\n\t\t\t\t\t\t\t<string>NSTextField</string>\n\t\t\t\t\t\t\t<string>NSButton</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBUserSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>\n\t\t\t<integer value=\"1050\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDevelopmentDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>\n\t\t\t<integer value=\"3000\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<string key=\"IBDocument.LastKnownRelativeProjectPath\">../Breakpad.xcodeproj</string>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.LastKnownImageSizes\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<string>NSApplicationIcon</string>\n\t\t\t\t<string>goArrow</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<string>{128, 128}</string>\n\t\t\t\t<string>{128, 128}</string>\n\t\t\t</object>\n\t\t</object>\n\t</data>\n</archive>\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/sender/ReporterIcon.graffle",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>ActiveLayerIndex</key>\n\t<integer>0</integer>\n\t<key>ApplicationVersion</key>\n\t<array>\n\t\t<string>com.omnigroup.OmniGrafflePro</string>\n\t\t<string>137.6.0.106738</string>\n\t</array>\n\t<key>AutoAdjust</key>\n\t<false/>\n\t<key>BackgroundGraphic</key>\n\t<dict>\n\t\t<key>Bounds</key>\n\t\t<string>{{0, 0}, {512, 512}}</string>\n\t\t<key>Class</key>\n\t\t<string>SolidGraphic</string>\n\t\t<key>FontInfo</key>\n\t\t<dict>\n\t\t\t<key>Font</key>\n\t\t\t<string>CalisMTBol</string>\n\t\t\t<key>Size</key>\n\t\t\t<real>112</real>\n\t\t</dict>\n\t\t<key>ID</key>\n\t\t<integer>2</integer>\n\t\t<key>Style</key>\n\t\t<dict>\n\t\t\t<key>fill</key>\n\t\t\t<dict>\n\t\t\t\t<key>Color</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>a</key>\n\t\t\t\t\t<string>0</string>\n\t\t\t\t\t<key>b</key>\n\t\t\t\t\t<string>0</string>\n\t\t\t\t\t<key>g</key>\n\t\t\t\t\t<string>0.852018</string>\n\t\t\t\t\t<key>r</key>\n\t\t\t\t\t<string>0.998962</string>\n\t\t\t\t</dict>\n\t\t\t</dict>\n\t\t\t<key>shadow</key>\n\t\t\t<dict>\n\t\t\t\t<key>Draws</key>\n\t\t\t\t<string>NO</string>\n\t\t\t</dict>\n\t\t\t<key>stroke</key>\n\t\t\t<dict>\n\t\t\t\t<key>Draws</key>\n\t\t\t\t<string>NO</string>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n\t<key>CanvasOrigin</key>\n\t<string>{0, 0}</string>\n\t<key>CanvasSize</key>\n\t<string>{512, 512}</string>\n\t<key>ColumnAlign</key>\n\t<integer>1</integer>\n\t<key>ColumnSpacing</key>\n\t<real>36</real>\n\t<key>CreationDate</key>\n\t<string>2008-11-14 16:58:15 -0700</string>\n\t<key>Creator</key>\n\t<string>John P. Developer</string>\n\t<key>DisplayScale</key>\n\t<string>1 pt = 1 px</string>\n\t<key>FileType</key>\n\t<string>flat</string>\n\t<key>GraphDocumentVersion</key>\n\t<integer>6</integer>\n\t<key>GraphicsList</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Bounds</key>\n\t\t\t<string>{{33.9443, 35.3885}, {444.111, 437.112}}</string>\n\t\t\t<key>Class</key>\n\t\t\t<string>ShapedGraphic</string>\n\t\t\t<key>FontInfo</key>\n\t\t\t<dict>\n\t\t\t\t<key>Font</key>\n\t\t\t\t<string>CalisMTBol</string>\n\t\t\t\t<key>Size</key>\n\t\t\t\t<real>112</real>\n\t\t\t</dict>\n\t\t\t<key>ID</key>\n\t\t\t<integer>31</integer>\n\t\t\t<key>Rotation</key>\n\t\t\t<real>270</real>\n\t\t\t<key>Shape</key>\n\t\t\t<string>Bezier</string>\n\t\t\t<key>ShapeData</key>\n\t\t\t<dict>\n\t\t\t\t<key>UnitPoints</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>{-0.5, -0.439247}</string>\n\t\t\t\t\t<string>{-0.5, -0.485429}</string>\n\t\t\t\t\t<string>{-0.446294, -0.512626}</string>\n\t\t\t\t\t<string>{-0.409932, -0.494153}</string>\n\t\t\t\t\t<string>{-0.373569, -0.47568}</string>\n\t\t\t\t\t<string>{0.436363, -0.0733799}</string>\n\t\t\t\t\t<string>{0.472729, -0.0549059}</string>\n\t\t\t\t\t<string>{0.50909, -0.0364333}</string>\n\t\t\t\t\t<string>{0.509091, 0.0364345}</string>\n\t\t\t\t\t<string>{0.472729, 0.0549059}</string>\n\t\t\t\t\t<string>{0.436368, 0.0733802}</string>\n\t\t\t\t\t<string>{-0.373569, 0.475681}</string>\n\t\t\t\t\t<string>{-0.409932, 0.494153}</string>\n\t\t\t\t\t<string>{-0.446294, 0.512626}</string>\n\t\t\t\t\t<string>{-0.500001, 0.485429}</string>\n\t\t\t\t\t<string>{-0.5, 0.439247}</string>\n\t\t\t\t\t<string>{-0.49998, 0.393072}</string>\n\t\t\t\t\t<string>{-0.500002, -0.393066}</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t\t<key>Style</key>\n\t\t\t<dict>\n\t\t\t\t<key>fill</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Color</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>0.770962</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>0.997971</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t<key>FillType</key>\n\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t<key>GradientCenter</key>\n\t\t\t\t\t<string>{-0.609524, 0}</string>\n\t\t\t\t\t<key>GradientColor</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>0.911574</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>0.998779</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>MiddleFraction</key>\n\t\t\t\t\t<real>0.6111111044883728</real>\n\t\t\t\t</dict>\n\t\t\t\t<key>shadow</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Color</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>a</key>\n\t\t\t\t\t\t<string>0.43</string>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t<key>Fuzziness</key>\n\t\t\t\t\t<real>7.2213706970214844</real>\n\t\t\t\t\t<key>ShadowVector</key>\n\t\t\t\t\t<string>{0, 6}</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>stroke</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Color</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>0.766903</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>0.997925</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Width</key>\n\t\t\t\t\t<real>7</real>\n\t\t\t\t</dict>\n\t\t\t</dict>\n\t\t\t<key>Text</key>\n\t\t\t<dict>\n\t\t\t\t<key>Pad</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>TextPlacement</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>TextRelativeArea</key>\n\t\t\t<string>{{0.06, 0.17}, {0.88, 0.5}}</string>\n\t\t\t<key>TextRotation</key>\n\t\t\t<real>90</real>\n\t\t\t<key>Wrap</key>\n\t\t\t<string>NO</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Bounds</key>\n\t\t\t<string>{{3.89085, 67.8908}, {404.218, 332}}</string>\n\t\t\t<key>Class</key>\n\t\t\t<string>ShapedGraphic</string>\n\t\t\t<key>FontInfo</key>\n\t\t\t<dict>\n\t\t\t\t<key>Font</key>\n\t\t\t\t<string>CalisMTBol</string>\n\t\t\t\t<key>Size</key>\n\t\t\t\t<real>112</real>\n\t\t\t</dict>\n\t\t\t<key>ID</key>\n\t\t\t<integer>30</integer>\n\t\t\t<key>Rotation</key>\n\t\t\t<real>270</real>\n\t\t\t<key>Shape</key>\n\t\t\t<string>Bezier</string>\n\t\t\t<key>ShapeData</key>\n\t\t\t<dict>\n\t\t\t\t<key>UnitPoints</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>{-0.5, -0.5}</string>\n\t\t\t\t\t<string>{-0.459695, -0.475464}</string>\n\t\t\t\t\t<string>{0.429465, 0.0537758}</string>\n\t\t\t\t\t<string>{0.469773, 0.0783133}</string>\n\t\t\t\t\t<string>{0.510074, 0.102849}</string>\n\t\t\t\t\t<string>{0.510077, 0.198357}</string>\n\t\t\t\t\t<string>{0.469773, 0.222892}</string>\n\t\t\t\t\t<string>{0.429473, 0.247428}</string>\n\t\t\t\t\t<string>{-0.00521517, 0.499998}</string>\n\t\t\t\t\t<string>{-0.00521785, 0.5}</string>\n\t\t\t\t\t<string>{-0.00521713, -0.113381}</string>\n\t\t\t\t\t<string>{-0.44962, -0.458615}</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t\t<key>Style</key>\n\t\t\t<dict>\n\t\t\t\t<key>fill</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Color</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>a</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>FillType</key>\n\t\t\t\t\t<integer>2</integer>\n\t\t\t\t\t<key>GradientAngle</key>\n\t\t\t\t\t<real>180</real>\n\t\t\t\t\t<key>GradientCenter</key>\n\t\t\t\t\t<string>{-0.609524, 0}</string>\n\t\t\t\t\t<key>GradientColor</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>a</key>\n\t\t\t\t\t\t<string>0.5</string>\n\t\t\t\t\t\t<key>w</key>\n\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>MiddleFraction</key>\n\t\t\t\t\t<real>0.6111111044883728</real>\n\t\t\t\t</dict>\n\t\t\t\t<key>shadow</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Color</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>a</key>\n\t\t\t\t\t\t<string>0.51</string>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t<key>Fuzziness</key>\n\t\t\t\t\t<real>3.3371961116790771</real>\n\t\t\t\t\t<key>ShadowVector</key>\n\t\t\t\t\t<string>{0, 2}</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>stroke</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Color</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>0.766903</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>0.997925</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t<key>Width</key>\n\t\t\t\t\t<real>2</real>\n\t\t\t\t</dict>\n\t\t\t</dict>\n\t\t\t<key>Text</key>\n\t\t\t<dict>\n\t\t\t\t<key>Pad</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>TextPlacement</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>TextRelativeArea</key>\n\t\t\t<string>{{0.06, 0.17}, {0.88, 0.5}}</string>\n\t\t\t<key>TextRotation</key>\n\t\t\t<real>90</real>\n\t\t\t<key>Wrap</key>\n\t\t\t<string>NO</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Bounds</key>\n\t\t\t<string>{{33.9443, 35.3886}, {444.112, 437.111}}</string>\n\t\t\t<key>Class</key>\n\t\t\t<string>ShapedGraphic</string>\n\t\t\t<key>FontInfo</key>\n\t\t\t<dict>\n\t\t\t\t<key>Font</key>\n\t\t\t\t<string>CalisMTBol</string>\n\t\t\t\t<key>Size</key>\n\t\t\t\t<real>112</real>\n\t\t\t</dict>\n\t\t\t<key>ID</key>\n\t\t\t<integer>29</integer>\n\t\t\t<key>Rotation</key>\n\t\t\t<real>270</real>\n\t\t\t<key>Shape</key>\n\t\t\t<string>Bezier</string>\n\t\t\t<key>ShapeData</key>\n\t\t\t<dict>\n\t\t\t\t<key>UnitPoints</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>{-0.5, -0.439247}</string>\n\t\t\t\t\t<string>{-0.500001, -0.485429}</string>\n\t\t\t\t\t<string>{-0.446295, -0.512626}</string>\n\t\t\t\t\t<string>{-0.409932, -0.494153}</string>\n\t\t\t\t\t<string>{-0.373568, -0.475681}</string>\n\t\t\t\t\t<string>{0.436363, -0.0733802}</string>\n\t\t\t\t\t<string>{0.472729, -0.0549062}</string>\n\t\t\t\t\t<string>{0.509089, -0.0364334}</string>\n\t\t\t\t\t<string>{0.509092, 0.0364341}</string>\n\t\t\t\t\t<string>{0.472729, 0.0549056}</string>\n\t\t\t\t\t<string>{0.436369, 0.0733803}</string>\n\t\t\t\t\t<string>{-0.373568, 0.475681}</string>\n\t\t\t\t\t<string>{-0.409932, 0.494153}</string>\n\t\t\t\t\t<string>{-0.446294, 0.512626}</string>\n\t\t\t\t\t<string>{-0.500001, 0.485428}</string>\n\t\t\t\t\t<string>{-0.5, 0.439248}</string>\n\t\t\t\t\t<string>{-0.499978, 0.39307}</string>\n\t\t\t\t\t<string>{-0.500003, -0.393066}</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t\t<key>Style</key>\n\t\t\t<dict>\n\t\t\t\t<key>fill</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Color</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>a</key>\n\t\t\t\t\t\t<string>0.2</string>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>FillType</key>\n\t\t\t\t\t<integer>2</integer>\n\t\t\t\t\t<key>GradientAngle</key>\n\t\t\t\t\t<real>90</real>\n\t\t\t\t\t<key>GradientCenter</key>\n\t\t\t\t\t<string>{-0.609524, 0}</string>\n\t\t\t\t\t<key>GradientColor</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>a</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>w</key>\n\t\t\t\t\t\t<string>1</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>MiddleFraction</key>\n\t\t\t\t\t<real>0.6111111044883728</real>\n\t\t\t\t</dict>\n\t\t\t\t<key>shadow</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Color</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>a</key>\n\t\t\t\t\t\t<string>0.51</string>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t<key>Fuzziness</key>\n\t\t\t\t\t<real>3.3371961116790771</real>\n\t\t\t\t\t<key>ShadowVector</key>\n\t\t\t\t\t<string>{0, 2}</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>stroke</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Color</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>0.766903</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>0.997925</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t<key>Width</key>\n\t\t\t\t\t<real>2</real>\n\t\t\t\t</dict>\n\t\t\t</dict>\n\t\t\t<key>Text</key>\n\t\t\t<dict>\n\t\t\t\t<key>Pad</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>TextPlacement</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>TextRelativeArea</key>\n\t\t\t<string>{{0.06, 0.17}, {0.88, 0.5}}</string>\n\t\t\t<key>TextRotation</key>\n\t\t\t<real>90</real>\n\t\t\t<key>Wrap</key>\n\t\t\t<string>NO</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Bounds</key>\n\t\t\t<string>{{176, 102.384}, {158.841, 537.616}}</string>\n\t\t\t<key>Class</key>\n\t\t\t<string>ShapedGraphic</string>\n\t\t\t<key>FontInfo</key>\n\t\t\t<dict>\n\t\t\t\t<key>Font</key>\n\t\t\t\t<string>CalisMTBol</string>\n\t\t\t\t<key>Size</key>\n\t\t\t\t<real>425</real>\n\t\t\t</dict>\n\t\t\t<key>ID</key>\n\t\t\t<integer>26</integer>\n\t\t\t<key>Shape</key>\n\t\t\t<string>Rectangle</string>\n\t\t\t<key>Style</key>\n\t\t\t<dict>\n\t\t\t\t<key>fill</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>shadow</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>stroke</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t</dict>\n\t\t\t</dict>\n\t\t\t<key>Text</key>\n\t\t\t<dict>\n\t\t\t\t<key>Pad</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>Text</key>\n\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf949\\cocoasubrtf350\n{\\fonttbl\\f0\\fnil\\fcharset0 CalistoMT;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\qc\\pardirnatural\n\n\\f0\\b\\fs850 \\cf1 !}</string>\n\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>Wrap</key>\n\t\t\t<string>NO</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Bounds</key>\n\t\t\t<string>{{176, 104}, {158.841, 537.616}}</string>\n\t\t\t<key>Class</key>\n\t\t\t<string>ShapedGraphic</string>\n\t\t\t<key>FontInfo</key>\n\t\t\t<dict>\n\t\t\t\t<key>Color</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>b</key>\n\t\t\t\t\t<string>0</string>\n\t\t\t\t\t<key>g</key>\n\t\t\t\t\t<string>0.749523</string>\n\t\t\t\t\t<key>r</key>\n\t\t\t\t\t<string>0.997726</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>Font</key>\n\t\t\t\t<string>CalisMTBol</string>\n\t\t\t\t<key>Size</key>\n\t\t\t\t<real>425</real>\n\t\t\t</dict>\n\t\t\t<key>ID</key>\n\t\t\t<integer>27</integer>\n\t\t\t<key>Shape</key>\n\t\t\t<string>Rectangle</string>\n\t\t\t<key>Style</key>\n\t\t\t<dict>\n\t\t\t\t<key>fill</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>shadow</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>stroke</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t</dict>\n\t\t\t</dict>\n\t\t\t<key>Text</key>\n\t\t\t<dict>\n\t\t\t\t<key>Pad</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>RTFD</key>\n\t\t\t\t<data>\n\t\t\t\tBAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0\n\t\t\t\tZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp\n\t\t\t\tbmcBlIQBKwEhhoQCaUkBAZKEhIQMTlNEaWN0aW9uYXJ5\n\t\t\t\tAJSEAWkEkoSWlhBOU1BhcmFncmFwaFN0eWxlhpKEhIQQ\n\t\t\t\tTlNQYXJhZ3JhcGhTdHlsZQCUhARDQ0BTAgCEhIQHTlNB\n\t\t\t\tcnJheQCUmQyShISECU5TVGV4dFRhYgCUhAJDZgAchpKE\n\t\t\t\tn54AOIaShJ+eAFSGkoSfngBwhpKEn54AgYwAhpKEn54A\n\t\t\t\tgagAhpKEn54AgcQAhpKEn54AgeAAhpKEn54AgfwAhpKE\n\t\t\t\tn54AgRgBhpKEn54AgTQBhpKEn54AgVABhoYAhpKElpYG\n\t\t\t\tTlNGb250hpKEhIQGTlNGb250HpSZIIQFWzMyY10GAAAA\n\t\t\t\tFgAAAP/+QwBhAGwAaQBzAE0AVABCAG8AbAAAAIQBZoGp\n\t\t\t\tAYQBYwCiAaIAogCGkoSWlg1OU1N0cm9rZVdpZHRohpKE\n\t\t\t\thIQITlNOdW1iZXIAhIQHTlNWYWx1ZQCUhAEqhIQBZKYD\n\t\t\t\thpKElpYHTlNDb2xvcoaShISEB05TQ29sb3IAlKIChARm\n\t\t\t\tZmZmAYN4dz8/AAGGhoY=\n\t\t\t\t</data>\n\t\t\t\t<key>Text</key>\n\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf949\\cocoasubrtf350\n{\\fonttbl\\f0\\fnil\\fcharset0 CalistoMT;}\n{\\colortbl;\\red255\\green255\\blue255;\\red254\\green191\\blue0;}\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\qc\\pardirnatural\n\n\\f0\\b\\fs850 \\cf2 \\outl\\strokewidth60 \\strokec2 !}</string>\n\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>Wrap</key>\n\t\t\t<string>NO</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Bounds</key>\n\t\t\t<string>{{33.9441, 35.3884}, {444.112, 437.111}}</string>\n\t\t\t<key>Class</key>\n\t\t\t<string>ShapedGraphic</string>\n\t\t\t<key>FontInfo</key>\n\t\t\t<dict>\n\t\t\t\t<key>Font</key>\n\t\t\t\t<string>CalisMTBol</string>\n\t\t\t\t<key>Size</key>\n\t\t\t\t<real>112</real>\n\t\t\t</dict>\n\t\t\t<key>ID</key>\n\t\t\t<integer>16</integer>\n\t\t\t<key>Rotation</key>\n\t\t\t<real>270</real>\n\t\t\t<key>Shape</key>\n\t\t\t<string>Bezier</string>\n\t\t\t<key>ShapeData</key>\n\t\t\t<dict>\n\t\t\t\t<key>UnitPoints</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>{-0.5, -0.439247}</string>\n\t\t\t\t\t<string>{-0.5, -0.485429}</string>\n\t\t\t\t\t<string>{-0.446295, -0.512626}</string>\n\t\t\t\t\t<string>{-0.409933, -0.494153}</string>\n\t\t\t\t\t<string>{-0.373569, -0.47568}</string>\n\t\t\t\t\t<string>{0.436363, -0.073379}</string>\n\t\t\t\t\t<string>{0.472729, -0.0549049}</string>\n\t\t\t\t\t<string>{0.50909, -0.0364324}</string>\n\t\t\t\t\t<string>{0.509091, 0.0364344}</string>\n\t\t\t\t\t<string>{0.472729, 0.0549058}</string>\n\t\t\t\t\t<string>{0.436368, 0.0733801}</string>\n\t\t\t\t\t<string>{-0.373569, 0.47568}</string>\n\t\t\t\t\t<string>{-0.409933, 0.494153}</string>\n\t\t\t\t\t<string>{-0.446295, 0.512626}</string>\n\t\t\t\t\t<string>{-0.500001, 0.485429}</string>\n\t\t\t\t\t<string>{-0.5, 0.439247}</string>\n\t\t\t\t\t<string>{-0.49998, 0.393072}</string>\n\t\t\t\t\t<string>{-0.500002, -0.393066}</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t\t<key>Style</key>\n\t\t\t<dict>\n\t\t\t\t<key>fill</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Color</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>0.770962</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>0.997971</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>FillType</key>\n\t\t\t\t\t<integer>3</integer>\n\t\t\t\t\t<key>GradientCenter</key>\n\t\t\t\t\t<string>{-0.609524, 0}</string>\n\t\t\t\t\t<key>GradientColor</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>0.911574</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>0.998779</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>MiddleFraction</key>\n\t\t\t\t\t<real>0.6111111044883728</real>\n\t\t\t\t</dict>\n\t\t\t\t<key>shadow</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Color</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>a</key>\n\t\t\t\t\t\t<string>0.9</string>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Fuzziness</key>\n\t\t\t\t\t<real>8.0632610321044922</real>\n\t\t\t\t\t<key>ShadowVector</key>\n\t\t\t\t\t<string>{0, 9}</string>\n\t\t\t\t</dict>\n\t\t\t\t<key>stroke</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Color</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>b</key>\n\t\t\t\t\t\t<string>0</string>\n\t\t\t\t\t\t<key>g</key>\n\t\t\t\t\t\t<string>0.766903</string>\n\t\t\t\t\t\t<key>r</key>\n\t\t\t\t\t\t<string>0.997925</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t<key>Width</key>\n\t\t\t\t\t<real>2</real>\n\t\t\t\t</dict>\n\t\t\t</dict>\n\t\t\t<key>Text</key>\n\t\t\t<dict>\n\t\t\t\t<key>Pad</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t<integer>0</integer>\n\t\t\t</dict>\n\t\t\t<key>TextPlacement</key>\n\t\t\t<integer>0</integer>\n\t\t\t<key>TextRelativeArea</key>\n\t\t\t<string>{{0.06, 0.17}, {0.88, 0.5}}</string>\n\t\t\t<key>TextRotation</key>\n\t\t\t<real>90</real>\n\t\t\t<key>Wrap</key>\n\t\t\t<string>NO</string>\n\t\t</dict>\n\t</array>\n\t<key>GridInfo</key>\n\t<dict>\n\t\t<key>GridSpacing</key>\n\t\t<real>4</real>\n\t\t<key>ShowsGrid</key>\n\t\t<string>YES</string>\n\t\t<key>SnapsToGrid</key>\n\t\t<string>YES</string>\n\t</dict>\n\t<key>GuidesLocked</key>\n\t<string>NO</string>\n\t<key>GuidesVisible</key>\n\t<string>YES</string>\n\t<key>HPages</key>\n\t<integer>1</integer>\n\t<key>ImageCounter</key>\n\t<integer>2</integer>\n\t<key>KeepToScale</key>\n\t<false/>\n\t<key>Layers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Lock</key>\n\t\t\t<string>NO</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Layer 1</string>\n\t\t\t<key>Print</key>\n\t\t\t<string>YES</string>\n\t\t\t<key>View</key>\n\t\t\t<string>YES</string>\n\t\t</dict>\n\t</array>\n\t<key>LayoutInfo</key>\n\t<dict>\n\t\t<key>Animate</key>\n\t\t<string>NO</string>\n\t\t<key>circoMinDist</key>\n\t\t<real>18</real>\n\t\t<key>circoSeparation</key>\n\t\t<real>0.0</real>\n\t\t<key>layoutEngine</key>\n\t\t<string>dot</string>\n\t\t<key>neatoSeparation</key>\n\t\t<real>0.0</real>\n\t\t<key>twopiSeparation</key>\n\t\t<real>0.0</real>\n\t</dict>\n\t<key>LinksVisible</key>\n\t<string>NO</string>\n\t<key>MagnetsVisible</key>\n\t<string>NO</string>\n\t<key>MasterSheets</key>\n\t<array/>\n\t<key>ModificationDate</key>\n\t<string>2008-11-17 11:41:28 -0700</string>\n\t<key>Modifier</key>\n\t<string>Preston Jackson</string>\n\t<key>NotesVisible</key>\n\t<string>NO</string>\n\t<key>Orientation</key>\n\t<integer>2</integer>\n\t<key>OriginVisible</key>\n\t<string>NO</string>\n\t<key>PageBreaks</key>\n\t<string>YES</string>\n\t<key>PrintInfo</key>\n\t<dict>\n\t\t<key>NSBottomMargin</key>\n\t\t<array>\n\t\t\t<string>float</string>\n\t\t\t<string>41</string>\n\t\t</array>\n\t\t<key>NSLeftMargin</key>\n\t\t<array>\n\t\t\t<string>float</string>\n\t\t\t<string>18</string>\n\t\t</array>\n\t\t<key>NSPaperSize</key>\n\t\t<array>\n\t\t\t<string>size</string>\n\t\t\t<string>{612, 792}</string>\n\t\t</array>\n\t\t<key>NSRightMargin</key>\n\t\t<array>\n\t\t\t<string>float</string>\n\t\t\t<string>18</string>\n\t\t</array>\n\t\t<key>NSTopMargin</key>\n\t\t<array>\n\t\t\t<string>float</string>\n\t\t\t<string>18</string>\n\t\t</array>\n\t</dict>\n\t<key>PrintOnePage</key>\n\t<false/>\n\t<key>QuickLookPreview</key>\n\t<data>\n\tJVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmls\n\tdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGVlktvJEUQhO/9K5IbHFyuR9brioEV\n\tnFh5JM5o5MWsPIA9IP4+X2b12gPrBbHWSt3lzkdFREb6Ud7Ko0R+asr+/+lOfpBfJIYW\n\t/Z/8LNc35yTHsyROh/ZYxyTgfJTrN/zip7NcxVD3r1+e9oQbCd/J9fd3T8e7337/48cH\n\teSLjm3O2wEfR2ry8tiJ5hDJSVEk9pF7jkONJrr89JfnqV/p8uz1KK1YpJynNHlKVk2gJ\n\tJZWqdqZz9iklBc21ZmkxlJoin0/vsEonTo6b9lC79iQzh6azSc7FYjINZWIkk4MCKtrG\n\tejhyRpZeRYcSNIbk7oXmtk5m4mRaD/NvYcOK1bKnpnkuu4qt6jqEVujLmtuOvFgdrXv7\n\tmcjWQxut71ds5LcbAIADIcTkDgpt4TKmyigWoXNzVAYtfYzdUe5fOT25ACxMtZAQiPeX\n\txEVTSCkNeaBLDbXWDhwfnxH1QHJX0sfiulDDhhpMgMnUJZAGDLkCea3T6b+9T3K+N/pf\n\tF6qL8+ZW0hYDjM4ESlFubyTlAFd/kvfwRKilj3IFRdTQHJsk6EwzW5UvDwBY1xf2cNVL\n\tSDWiyTa2AyL8JgXr8fBOPv/sCzm8l68PNERtwm0wGIb4yTrK2LiYt3+rI5+uY1df7JW8\n\tCD9tS/XNGUdxFSUs1e+yiQPuXPUMyVI9lL2qeh2bq16Rjet+qRdVLcWrceySz8+S30+A\n\tzyTPTNiYWMQSe10Z64vY+/OoudZNus9dudwRqE+rVVty97v63bZd7iZHL7PkjnfYe5xw\n\tvvTOAJtW5+gMv3vFB8RetF6yzYQ5x3/L08wKeQZ3t1pin5Fp1GpD0ORKy7AnlLN/kbPS\n\t2ofZwIlqwA1G35aT5d3JyGncLARwMKZb0Tt2gIAHLOBGpTJExgtaxZ/MjxbK+B8mYdQ0\n\t5QuYoSumBgvBBXEsP0n9khlidnI8xrK6LZqBzVm2bFzEhIjMiIwcPyGGeQqjdjrwT7h+\n\tLYHiADxbwGHg6+Uux+3+4u1/I6yj5DSiaKw0CBBXpRSDluldCFM4zgHvPa9zujJygMR3\n\tRXlB+JWt1t0PvmNg35PwHxsOE4mw1Weu0cykNci2JJjJhX+sVUm1pt4BgIOOr6HBGsLd\n\teYUt0uRFYFIEgAl4n6yrBqw6QuzKxtA0wdf4g/OZ2QWMAd4DfUgXOqHaYjtc4/Gjshmh\n\ty/PP/YQ62VDzj4dlZttYGh2ZHAwCzaCeVcoaJty3VGm2b4bnZwuhC2LommlOA9lxF2ub\n\tWDS6QrjdWjcjNZJ3Uzh/OyA6IjK7cIVwj0t8fPwuD05ya6b+F7C1v1cKZW5kc3RyZWFt\n\tCmVuZG9iago1IDAgb2JqCjk4MwplbmRvYmoKMiAwIG9iago8PCAvVHlwZSAvUGFnZSAv\n\tUGFyZW50IDMgMCBSIC9SZXNvdXJjZXMgNiAwIFIgL0NvbnRlbnRzIDQgMCBSIC9NZWRp\n\tYUJveCBbMCAwIDUxMiA1MTJdCj4+CmVuZG9iago2IDAgb2JqCjw8IC9Qcm9jU2V0IFsg\n\tL1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdIC9Db2xvclNwYWNlIDw8\n\tIC9DczIgMTIgMCBSCi9DczEgNyAwIFIgPj4gL0V4dEdTdGF0ZSA8PCAvR3MxIDE3IDAg\n\tUiAvR3MyIDE4IDAgUiA+PiAvRm9udCA8PCAvRjEuMCAxMSAwIFIKPj4gL1hPYmplY3Qg\n\tPDwgL0ltMiAxMyAwIFIgL0ltMSA4IDAgUiAvSW0zIDE1IDAgUiA+PiAvU2hhZGluZyA8\n\tPCAvU2gxIDEwIDAgUgo+PiA+PgplbmRvYmoKMTAgMCBvYmoKPDwgL0NvbG9yU3BhY2Ug\n\tNyAwIFIgL1NoYWRpbmdUeXBlIDMgL0Nvb3JkcyBbIC0yNzEuMzA2MyAwIDAgLTI3MS4z\n\tMDYzIDAgNTQwLjI2NApdIC9Eb21haW4gWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFs\n\tc2UgXSAvRnVuY3Rpb24gMTkgMCBSID4+CmVuZG9iagoxMyAwIG9iago8PCAvTGVuZ3Ro\n\tIDE0IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDI1NiAv\n\tSGVpZ2h0IDI1NiAvQ29sb3JTcGFjZQo3IDAgUiAvU01hc2sgMjAgMCBSIC9CaXRzUGVy\n\tQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dABAQAA\n\tCAKg/p+2Bx4QJpBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB\n\tAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg\n\twIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM\n\tGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB\n\tAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg\n\twIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM\n\tGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB\n\tAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg\n\twIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM\n\tGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB\n\tAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg\n\twIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM\n\tGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB\n\tAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg\n\twIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM\n\tGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB\n\tAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDDQBg4DBgwYMGDA\n\twNjAA65NNU0KZW5kc3RyZWFtCmVuZG9iagoxNCAwIG9iago4ODMKZW5kb2JqCjggMCBv\n\tYmoKPDwgL0xlbmd0aCA5IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2Ug\n\tL1dpZHRoIDkxMiAvSGVpZ2h0IDkyNiAvQ29sb3JTcGFjZQoyMiAwIFIgL1NNYXNrIDIz\n\tIDAgUiAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0\n\tcmVhbQp4Ae3QgQAAAADDoPlTH+SFUGHAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\tgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY\n\tMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED\n\tBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA\n\twMvAAKraAAEKZW5kc3RyZWFtCmVuZG9iago5IDAgb2JqCjExMDcwCmVuZG9iagoxNSAw\n\tIG9iago8PCAvTGVuZ3RoIDE2IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1h\n\tZ2UgL1dpZHRoIDI1NiAvSGVpZ2h0IDI1NiAvQ29sb3JTcGFjZQo3IDAgUiAvU01hc2sg\n\tMjUgMCBSIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4K\n\tc3RyZWFtCngB7dKBDQAgDMMw/n+6SHBGvA+aeXMKFAucd8XlNiuw8U9BuQD/5e/bzj8D\n\t5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+\n\tvu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889A\n\tuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/\n\tbzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQ\n\tLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv\n\t284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyU\n\tC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7\n\ttvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPl\n\tAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+\n\t7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5\n\tAP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79v\n\tO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1Au\n\twH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/b\n\tzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL\n\t8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2\n\t889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC\n\t/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t\n\t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA\n\t/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287\n\t/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7A\n\tf/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vO\n\tPwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvw\n\tX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu3f/wUgwjJ6CmVu\n\tZHN0cmVhbQplbmRvYmoKMTYgMCBvYmoKMTIxNAplbmRvYmoKMjMgMCBvYmoKPDwgL0xl\n\tbmd0aCAyNCAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCA5\n\tMTIgL0hlaWdodCA5MjYgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkgL0JpdHNQZXJDb21w\n\tb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHsnYlfTV37/288\n\tj4xJUVJRGtCEoggliZCxyFQUlUiGNCgJIXOFyFTKlCljmUMlUaZK4XY/N31fv//jd621\n\t9z57n6nxDPvU1ev1PHfts89a61zn+njvz7XW3uuvv/AHI4ARwAhgBDACGAGMQOeIQDfy\n\t0132hx7tHB8QPwVGQCciwOiwR48e//nPf/4r9QMH/gPHQaRwjk58FhwkRkCHI0ClSIT4\n\t3//27Kmn10vuR0+vZ8///peoEjWpw98zDl0HIkAuT0GLIEWqxN59+vTt269ff8lPv379\n\t+vbt07s3iJSoEkSJmtSBrxWHqIsRoGKkWuzVqzcRYn/9AQMMDAwGDhxoyPwMHAh/GgzQ\n\t1+/fD1QJmtQDTTKc1MUPjGPGCIg1AqwYe8IFKmiRSNFgoKHRoEGDjY1NTIbAjyn5PxMT\n\tY+PBg4wMQZcD9PszmmQkiWZSrN8sjkv3IgBqJI6xJxEjaNHAAKRobDLE1HSombmFxbBh\n\tw+nPsGHDLMzNzYaampqAKkGUA/SBk+TSFShJLlx174PjiDECoosAMY0gRj0qRuCi0WDj\n\tIaZDzS2GWVpZjbC2sbG1tWN+bG1trEdYWVkOH2ZuBqIETRoYEEyCJOl1KypSdN8tDkjX\n\tIsCqsVevPn37DwAwDjYBLYIUR9jYjRxlb+/g6OjkDD9j4H9OTo4O9vajR9nZgiyHW5iZ\n\tDjEmmNTvB2aSgSQqUte+fhyvqCLAqJGiUZ+QcYipmYWllbXtyNH2js5jxrm4uI6f4Obu\n\t7j5xIvyfm9uE8a4u48Y6OznYj7KzGWE1zHyoKUjSYED/vqhIUX2vOBhdjAD1jWAbwTXq\n\tGxgOMiFiHGEzcrSD0xgX1wnuEz0mT5nq6TVtmrf39One3t7TvLw8p0yePMndbbzLWGdH\n\t+1G21lbDzU2HDDYayCmS+EhdjASOGSOg9QiQKg4p4vTpBxeqgEbz4VY2I+0dQYtuEydP\n\t8Zw23cd3pt/sOXPn+jM/c+fM9pvlO8PH22vqZA/3CS5jnQCT1pbDzACSAw0oI0llBy9a\n\ttf7N4gB0LwIUjlDFoWwcPGSohaW13WgQ44SJk6dOmz5j1uy5/vMXLgoIDFyydGkQ+Vm6\n\tZElgwOJFC+b5z/Hz9fH2nDzJzXUcSNKGQBIUSRlJa62ISN1LBxyxdiNA4QjGsS9cqYIa\n\thxE0Oo8bP3Gyp/eMWXP8FywOXLpsxargkNWhYWFr165bt27t2rDQNauDg1cuDwoMWDjf\n\tf7avz7QpHm4uYxxH244gijQyGNCvDxR2EJHa/Waxdx2MAJEjgWP/AQMHmQy1sLIZ5TDG\n\txc3Dc7qvH2hxybKVwWvCwiPWb4jeFBOzecuWrVu3btmyOSYmemNUZPja0JBVy5cGLpo3\n\tZ6aP1+SJ4wGSdiOGw1WroYE+FHYAkegidTAlcMhaiwC5ViV1HICjkbGpuaU1qNF14uRp\n\tPn7+CwODVoaEhkdu2LR5a2x8QmJS8s6UXbt2pe7alZKyM2lHQnzcti0xG9eHr10dvHzJ\n\tYpDk9KkeE1yc7G2thg0dAhetBJHURWrtw2HHGAHdigDI8T//Jc4R4DjEbPiIkfagxine\n\tvnPmBwStXL02YkPM1u3xO3bu2r133/709IOHDh0mP4cOpqcf2Je2JzUlKSFu2+bo9eGh\n\twcsDF/r7+Xh6TBjnNNrGyoJctFJEkmtW3YoJjhYjoKUIsNaxT38DQ2NTCytbe2cXUOPM\n\tuQsDV4SsjdgYExuflLI77UD64aPHMzNPnDyVnX0afrKzT508kZWZcezIwfR9e1KTE+O2\n\tbooKX7MqaPG82T5eHhPGOoy0Hm4GiNTvR65ZUZBa+naxWx2LACtHcq1qYjbcepTjOLfJ\n\tRI1LVq4J3wBiTE7de+DQ0Yysk9k5OecuXMzNu3QpH34uXcrLvXjh/NmcM6dOZB47nL5v\n\td8qOuC3RkWHBywLmASMnuY6Bi1Zz08GG5JoVBaljWYHD1VIEmEoOWEe4VjUHOI4Z7+E1\n\tg6gxNCJ6S3xSalr64eNZp86cvZB7Kf/y1WvXC2/cuHETfuA/NwqvX71SkJ938VzO6ROZ\n\tRw/u370zITZm/TqiyFnTp7i5OI4cMYyUdfqjILX07WK3OhaBbt2gsNqrN1jHwXCtOtJh\n\tnNsUH7/5gSvXRERvjd+5+wCIMTvnQl7+lWuFN27dKbp3/wH8PCQ/8N/79+4W3b554/rV\n\tgksXz505mXk0PS11x/aYqLXBQYvm+np5uDqPthk+1MSICFIPL1l1LDVwuFqIAJRyeuox\n\tchw2YpSTyyQvX//Fy0LCN25NSNmbfjQTxHjp8jWQ4r0HDx6VPH7y9NmzZ8+ZH/jt6ZOS\n\t4ocP7hfdvnH9Sn7uuTMnjh/al5q0PWZ92KrA+X7TJ7uNtbe1NBtCBYmXrFr4erFL3YoA\n\traz27jtgoLHpMOvRY8ZP9vabv2TV2qjN8Tv3ph87ceZ8XsG1G7fvghSfPHv+ovTV6zdl\n\tZeXsT1nZm9evSl++ePb0cTFo8lbhlfyLOacyD+9P3RG7KXz1ssVzZ3i6uzjYWZmzgsQq\n\tq24lB45W0xEg8456vcA7GpsOt7EfA9eqcxYtWx2xaXvSblBjzoX8qzdu33tQ/OTZi9LX\n\tb8rL31a+q6p6//4D8/P+fdW7yrcV5WVvXr18/rTk4f2im9cLcs9mZx7atythS9TaVYHz\n\tZnpNcnEUChJnPTT9FWN/uhMBiRwHEzmOdZs6wz9gRVjUloTU/UeyzlzIv3ajiIjx5euy\n\t8rfvqj5UV9d8/Pjp8+fPX+AH/vPp08ea6uoP799VVpS/KX3+rOThvduFl/POnjp+cE/y\n\t9k3hwUsX+Hl7uDqOpISEaQ9YqYOC1J30wJFqOAK0ltNH32AwXKzaj3X39PUPDF4XHZu8\n\t52BG9vn8azfvPighYqyoBC2CEL98ra2rl/qpq6v9+uUzqPL9u7dEkk8e3QdF5uacOLp/\n\tV/zmyDXLFs6ePpkI0swEpj16Y01Hw18wdqdLESDmEZasGgzi5DhvSXB4THzK/iMncvKu\n\t3Lj74PGz0jflle+raz59+QpK/NbQ0Pj9+w/Jz/fvjY0N3+rrQZSfP1Z/qHpb/vrF0+L7\n\tt6/nXzidkb57x9ao0OWL5hBB2lkONTYc0LeX3n96ICB1KUVwrBqMADGPvfsZGA2xGDF6\n\tjJun77ylIRExCanpx7MvFBTeATW+KntbRcRYW18PSvzx8+fff/+S/vn7758/vhNR1hFJ\n\tvq8kinx07+bVvJysw2nJsRvDViyeM93DxcF2+NDBA/VhGhKvWDX4BWNXuhQBMtXRq+8A\n\tQxMzq5HOE6b6zlsSErk5cffBzJzcqzfvFT8rLXv7vvojiPFbA2iRKPGf//3vf/8KfuDP\n\tf/6B43//BE0SSdZ8eAeKfPLgTmH+uZNH9+3cvnHtikWzvSe52NsMMx1k0B+vWHUpQXCs\n\tmowAKebA1erAwUMt7RzHT57hD3LckrjnUFbOpet3Hjx58QbY+AkuU0GMoMV//gEl/v79\n\th/w00R/66+/fv//993+gSSLJb/W1oMjK8lfPiu/duHwh+9j+lO0bw5Yv8ps2cezoERZD\n\tjAb0Q0Bq8ivGvnQoAlDMIVerYB5tHFwm+0ApJ2Jz4p7DJ87l37j76Nmr8ndEjd8af/wk\n\tXAQtskL8P+EPEeafP6BJKskf3xuIIt+/ffPi8YNbV3NPHz9ABLlswSxPN+dRVmbG9IoV\n\tV5brUJLgUDUVAcnVqvmI0eMmes8JWBUeQ+VYcONeyfM3bz/UfCFq/JsTIyhPqET+d4Ek\n\tAZIN9V8/Vb8rL3368Pa13DPH9++M3bAmaN6MKeMdbYebDmauWLGko6kvGfvRmQh0I8Wc\n\t/gaDh4J5dPOctXDFuk3xuw+dOFdw4/7jl2UAx9r6BkaNQEalYmRlSSlJIAmK/Fb3peZ9\n\txetnj+5cA0LuT962PiTQ38fDxd6aXLH2xStWnUkRHKjmIsDg0cCIXK26Tp4xLyh0Y1zq\n\twayzIMcnpeVVBI7ffxI2UjXyNCS//T/mR+ogoSS9bP37RyMg8sNbRpDZR9N2bA5fFTB7\n\tmvsYesXavw9MQiIgNfdFY086EQHAY68++gNNyNXqpOlzA0PWx6akZ+bks3L8SuGoSI2s\n\tGOUlKVEkILL2c3XlGyDk1YunjuxJiFm3fIEvc8U6yABLOjqRHzhIjUaA4pEUcyztnCZ4\n\tzlq0KnxL0r7jZy4V3nv8svz9x6/1jSwcpV2jlBjpH0JIMletcNH6vaGOCvLh7SvnTxxM\n\tjdu4ZilcsY6zH2FuYgiTkAhIjX7X2Jn4I8Dg0XCIhbU91FbnBYVtit9zJDv3+t2SF+VV\n\trBzlLlXl1SgrSeai9dffP4gg4ZL1wc2Cs5kHdm6NDF4828vNeaQllHQQkOJPDxyhZiPA\n\t4pEUc8a4T5sTGBIVu+vgifNX7jx6XlZV87WeWEeQoxQclaiRHOYhSRBJ6jpEkB8qXj25\n\tf+PSmWNpiTFrl8+fMZmWdBCQmv2qsTcdiACHR1LMmeK7cEX45qT9GTn5Nx88e1NZ/YVc\n\trBLrKJRjM2qUU+RvIshvdZ/el78sKbp28eSh1LgNqwPnek+Eks5QBKQO5AcOUaMR4PE4\n\tauzE6f5L1myM330kO6/w3pNXb6s/K5BjC2qURSQI8m8o6nysKnv+8Ba5Yk3eEr5y4cwp\n\trg42w4YgIDX6XWNn4o+ABI+2juOnQjEnYuvO9Cy4Wi1+Uf7+U13DD9mL1ZblKFQkMZH/\n\tg6JO/ZfqytdP4Yr19NE98dGhS/2nTxqLgBR/duAINRwBDo9mVjDX4eO/NGxTwt5jZ/Jv\n\twNXqu5qv32Tl2Co1ygvyZ2P95w/kivXqhRPpKdsiVi2aNXW8IwJSw182dif6CFA8DjAa\n\tMszWEeY6FgdHQjHn5MVrdx+XVhDz+Pev/wm9Y2vlKCjrACH/JRaSXLFCjTU/53hawqaw\n\tIH+fSeNGo4MUfX7gADUaASEePXz8g8JiEvdl5BTcevgcpjrqGkgtR1DKab0cBYgka3XA\n\tQsIV69tXj+9ev3jy4K5YmPPw85zgaIsOUqPfNnYm9ggw7pHgEZYC+C0OXh+beuhU7nUo\n\t5lRWw1TH3zDTIamstkmN0oL836+fDaTGSko6ORn7EmMIID0AkGZYYhV7iuD4NBcBaTzO\n\tC1obs2NfxtnLtx/RYg6Z6oCrVXZGsa1ylFyzMles3799ra589eReYe6pQ6mx6xGQmvuW\n\tsSddiYA0HgOC128HPOYV3n/6upIt5kiuVtsuR16QpMb6s5EA8sWj25fPZuzbEbM2aB4C\n\tUlfSBMepmQjI4HEZwWMmg8cPMPX49y+yEKDdeOQvWdmSztcaMuehAJB4m4dmvm/sRdwR\n\tEMw9gnukeDwsxGOHrlYpUBkxk5LOr79hzgMBKe6EwNFpMwLK8AhLATg8csWc9lytkvew\n\tcKWrAn58EwByu5SDREBqMw+wb3FEAPCo10ffkJl7ZPAo5R55PLZXjpwgm5rInEdj/acP\n\t5S+KJQ4S5yDFkQc4ClFEQBEeSXGVw6NgrqP9emQJKQ9IpsQKj9Khc5AISFGkBA5CixGQ\n\txiPMPcoUV1WBRyEgqYMEQHIlVlyko8UvH7sWWwQ4PA6lK1f5uUd5PHaAjhILqRiQszy5\n\tVawISLHlB45HsxEQ4HE8vzSHn3tUDR45QRIHSQBJHCQAUrJIZ9I4vM1Ds9879ibKCEjj\n\tkaxcZZbmcHiEuUe2uNoxPEquWMmiAGGJla5i5W/zQECKMk1wUBqKgASPNuS+R27lqhrw\n\tyAqSAhLuu2IAya9ixfsgNfSFYzdijgCPx1Fj4b5H9sYOunL1wydmaY6K8MgD8l8OkE/u\n\tXc89eYgHpAV5UAACUsz5gmNTbwRk8Qj3PcKNHWrBIwdIskiHAJIs0oHbPI6nJW4Kg2c/\n\t8oDs0V29nxlbxwiINQJkf7l+ZIcAIR4LmBs7yENzVOYeifvkVs3RG5PhNo/XFJDkPkj6\n\toAAHGwSkWPMEx6WRCHB4tGDdI8HjSXLfI3tjB7kNmVFRR6s59P20KTrlIQ9IwZN0EJAa\n\t+fKxE9FFoHsPHo/TyVNzEtOOw2MB6H2PDB5ZPapEjgoBSR4UsE0CSPKwcr3/dsfdPESX\n\tKjgg9UegW3dm5aqFjQN9qFzkNnhqDoPHauYhVirFI+8gufsgnzMOMmGT5FFzdDcPBKT6\n\tv3vsQXwRYPA4iLpHwGOoEI91wscCqAaP8g4SHhRAn6RDHjU3cyo8i9UCANlb7z8ISPEl\n\tC45I3RGAyQ5yY4eJFB4vsk/Noc94VDEeFQCSPEmHPGqOAHIieRbrIAPYDxIBqe7vHtsX\n\tXwTk8JjAuMfn5BHI6sCjUkDSZ7GSh5VbIyDFlyc4Io1EgOCxN4NH16kz4ZHkxD2qF48K\n\tAQnPYt2bQB9WDrt5WJoiIDXy7WMnYosAwWNfA+oeYccOcI8MHuGZq2rDoxQguUfNXb/I\n\tPqycBeTA/uggxZYrOB61R0CCR2vY0IriMUX9eFQCyGMEkEv8Ybsr2A8SAan27x47EF8E\n\tWDyaWo4cQ/EYnbD3eE4+eSS5GvEoB8i3r57Aw8oBkFsjmO2uwEEiIMWXLTgiNUeA4rH/\n\tQBMLHo/pJy5ev0v2l/v67TvsZ6Xy4iozayJcpMM+rDw/59je+Og1S8h+kBJA4poANWcA\n\tNi+mCAjx6O2/JBTweEwDeJQGZP1XupvHNbLdFQtIewSkmNIEx6KZCEjjceHKiK0pgEfY\n\t0IrgsV6NeJRykLCbB9mgFba7kgPkf3sgIDWTCtiLCCLQjSmuUvfoPXfJmuh4gseb6naP\n\t5JJVcJsHt90VAeTOrbBhsu8UV3trc3SQIsgQHIIGI8Dj0R6KqwtXhhM8XmDw+EW9eJTo\n\tkezm0VBH9oMUAtKdc5AISA3mA3al3QjAjVZk7lEej2VVsDu5cEMrVS1dFbQjC8jSx3d5\n\tQE52QUBqNzewd41HgMOjuTXg0ZfgcafG8MhfsEoB8szRPfEbSYmVAeSAvr0QkBrPC+xQ\n\tOxGgeBxA8ehO3ONGcI9nwD0+K2O3Q5ZsaCXAmup+VQjIrPSdW8JXLPRFQGonJ7BXrUVA\n\tgEeXySwes4h7LH1brW73SFTN6ZEH5IOb+RSQqwPneLs7kzlIBKTW0gM71nAE5PG45yjg\n\t8YGG8MgLEnbXoSXW0sdFVy8wgFxAADkCS6waTgnsTnsRkMbjghXhW3amaxKPvB4FgLwh\n\tAeQ0d2c7S1MjBKT2MgR71mQEeDw6u0+bE7h6Y7yG8cgLUgjI81npyeAgWUAawyrWnvig\n\tAE3mBfallQgAHnv27j/Q2HyEPbhHDo9Xi1j3+LfaVq4KCkJSDrKWzEE+kAbkcASkVpID\n\tO9V4BBg8Gpla2gnxeENz7lFY0mEBWVFaUnSVA+QM6iCNDRCQGs8N7FDjEZDHY3J61nmC\n\txwpSXNUIHvkLVuogOUCePro7fgOUWKe5OdshIDWeGdihNiLA4XG4nbMbcY8bqHtk8Fir\n\t7qU5/CUrd8UqBcjMA8mbwUEiILWRGNinNiLA4NGAcY8ziHtk8FiiUTwqBuSl00ekAdkH\n\tF+loI0ewT81FQB6Pu4+eztc4HnlBygNy+XwKSDN0kJpLC+xJOxGQxuP8FeGbkw9kgnvU\n\tNB55PXIO8g2UWAkg4zaEBM72cnOiDhIBqZ00wV41FAGCxz4DjEwl7jFu95HTlwCPb6o+\n\tatA9SkqsTU1/KCA/V1e8LCm6cp44yHU8IPv1wjlIDWUGdqOFCFA89jMwNiNzjzPmL5fg\n\t8WVF9We2uMrsaMVXXtT1G1fRAUD+aKj9+A4BqYWEwC61GgEej05uXrMDQzZI8PhO03hk\n\tr1ilAHnnyrnMA0kcIK3AQSIgtZov2LlaI0DwCPuvSvC4bnPSgcxzV+6UaAGPUg6SB2T2\n\tkdS4KMZB2pI5SHSQas0IbFybEZDFY5QUHn/8+p9673uUvfKlV6wSQH6oeFnMADIGHKQP\n\tLNJBQGozWbBvdUdAgkcrcI8+85drF4+ygKyhDjIv+zABZMBsrwlOtsMQkOrOCWxfexGQ\n\t4NGWcY9RcalHsmlx9V1NbYPG8ShxkL+ZEisHyP1JMeuWzfPxGDfaymwwOkjt5Qv2rNYI\n\tyOExJmk/cY/FLys+aLq4yly6Ckus32p5QG6PCmYBOcRIHx2kWrMCG9dWBDg8DrN1muA1\n\tOyAkanvq4ew8MveoJTxKAbKx/vOHcsZBAiDXIiC1lSbYr2YiwOJxsJnV6HEePvOWrZPg\n\tsRzw2Ag3dvxu0tTcI1fZkQfk/RvEQRJA+nkSBznEEAGpmfzAXjQbAYpHfaMhBI+efgHB\n\tUniE7ck1XFwVXLE2NREHyQHy8rnM/TsQkJpNDuxN0xGQxePamB2se9QeHqVLrMRBvn7K\n\tAnI9BaQjA0g9fBarptMF+1NzBBg8GgIeHSke1zPu8f7T1+AetYVHeQf5ovj25bMISDUn\n\tAzav7QgoxOPZy1Bc1SYeZQD5lQKyMO8UOMj1wYvBQSIgtZ042L9aIgB41OujL43HU3k3\n\ttI1HJYDM2AcOMoiZgxyKc5BqyQhsVIsRkMFjELjHfZlnL98ufqFdPMoBshIcZGHuqUOp\n\tsRSQ4x1taIkVHaQWkwe7VnkEpPG4OBjc46FTeYWAx8qar9pzj6TIyq5ilZRYqYMkgAwL\n\t8veZBIt0EJAqTwdsULsR4PA4FOYeJ/n4UzxmiAKPzQNy1lQEpHYzB3tXRwQkeLRxHO85\n\tC/AYC3jMFQUeBYD8xcxBvngEJdaMfYkMIMeOQkCqIyWwTe1FQBaPYeAeCR4fse7xlxaW\n\t5nBLdJQCcldsZPBiBKT2sgZ7VlcEhHicCniMFBMehYD82Vj/6X05ALIgJyNNFpA9uqsr\n\tPtguRkCDEeDxOGoscY9hMYn7MnIKKB4/wcpV7eJRASCf3CvMPXmQB6QFWcWKJVYNpgx2\n\tpcYIcHi0APfI4HGXeNwjX2L98/vfXxwgbxXkHE9L3BS21H/6JImDRECqMUmwaY1FoHsP\n\t8tScwUOtWDxuSkxj8fge8PhT23jkAfnvP79+fPtaXfn6yb3rBJDbIlctAgfpYMMCsns3\n\tjcUMO8IIqCkCMnhcFRm76+DJ3Ov3nrBzj5rYYI6v3ij8jZmDZABZRx0kC8hQDpCDyIMC\n\tEJBqShFsVoMREOJxuv/SMMDj8ZyCW1Bc5fD4R9P3PcqKkrsPkgPkKwDkRSlAmhjq99bD\n\t/Vk1mDbYlXoi0K07s3LVwsYB3OOiVZHbAI8XKR6rydIcEeCRK7H+IZsHNBJAPn9EAZmw\n\tiQByInGQgwz6IiDVkyHYqiYjwOBxEHWPgMfQTQkMHp8DHuvAPUruQ5aFlib/VgLIlG0R\n\tqxbNnOoKDhIBqcmkwb7UFQGY7NDrrW9oAnh0JXiM4PD4qlI8eFQAyIe38qHEygJyzCgr\n\tUwSkulIE29VgBAge+xpQPE4ULR7lSqxvWQfJAHKKq4O1hcnA/uggNZg42JU6IkDx2J/B\n\t45SZBI8pjHsUFx6VAPLY3oTo0CX+3hPHjLREQKojP7BNzUaAxaOp5agxFI/RCXuP5+Tf\n\teigq90icqsBBfoc5SADk3esXT6SnbI1YuXAmAlKzWYO9qSkCDB4HmlhYO7iyeEw/QYqr\n\tr96KyT1KBNkkKLESB0kAuWbJXCEgcU2AmnIFm1V/BCR4HDlmorf/klDA4zFR4lEakPVf\n\tAJCP7167wAPSHh2k+tMFe1BvBKTxuHBlxNYUwOO1uxSP9d/FMffIzatwi3SYOciqsucP\n\tbxJAxksDEh/9qN6UwdbVGIFuTHHV1JLgce6SNdHxBI83xeceJRes/0c2MP/1XQDInVvD\n\tVy70neJqb22OJVY15go2rfYIcHg0t7YH97hwZTjB44Vrdx+De/wiNjxKKjpkkU5D3ceq\n\tsmcsIDcSB+nOlVgRkGrPG+xAPRGAleRk7pHg0V0Kj2VVn+oaRLI0h7tclXeQpYyDZAAJ\n\t+7MiINWTJtiqZiIgxONkX4LHnSLGI69HHpAPbuafObonXgDIAX17ISA1kz7Yi4ojQPE4\n\tgMfjRtY9Piur+iiFx//jGaXV34RzkMRBUkBmpe/cEr5igS8CUsXpgc1pNgICPLpweMwi\n\t7rFUjO5RWNGRB+TqwDnT3J3JIh0EpGazCHtTVQR4PDqDewxcszF+z9Ez+TcfiBaP/BUr\n\t3cCcArLo6gUBIEeYG8Mq1p54H6SqcgTb0VgEJHgcYQ94XLAifMvOdMBjEYtH2H+VvQ1Z\n\tLFerQEjuglUAyBuMg2QAaWdpaoSA1FgKYUcqjIAEj3bO7tPmBK7WATzygmQBWVH6uOjq\n\t+az0ZM5BIiBVmCHYlAYjAHjs2bv/QGNzKTxeFTUeeT1SQNaSOcgHDCA3EEC6OdsNR0Bq\n\tMImwK5VFgMGjkelwKTzeoO6xVjj3KKLLVcEVqwSQJTwgZ0CJFQBpgA5SZVmCDWkoAgwe\n\tDRg8ziDuMTk96zzBYwVZmiNK9yhXYuUAefro7ngEpIYyB7tRRwQEeHQj7nFD/G4orooe\n\tj/wVqxQgMw8kbw5fPh8BqY5UwTbVHwE5PG5OPpAJeCwROR55PXIO8g04yEunj+yO2xDC\n\tO8g+uEhH/TmEPaguAgrweOT0JR3AIyvIJnKbx9/kNo+KlyVFV84LAWlmbNAP5yBVlyvY\n\tktojwOHRjBRXZ8xfHq4zeJQD5DshIGd7uTnREisCUu05hB2oLgIEj30G0OKqm9fswJAN\n\tcbsZPL6p+iji4iop6MgA8jMB5J0r5zIPJG1exzpIAsheuEhHdemCLak3AgSPsIOOsTQe\n\trxSVvKyo/swWV7W9RQCjPUX/L1ik86Oh9iMPyKiQQAJIWzIHiYBUbwph6yqMAI9HJxk8\n\tvgM8/uAfSS6uuUdOnMyDO1gHKQNIH5iDtEJAqjBZsCl1R0CCRyvGPa7bnHQg89yVO7qB\n\tRykHCYCsYQCZfSQ1jgJyAgJS3QmE7as0AhI82jJ4jIpLPZJNiqtvdAKPsg7yQ8XLYuIg\n\t9yfFgIP08SCAHIwOUqUpg42pLwJSePSZv3xdDIPHYp1wj+SiVdpBMoDMyz6cuj0qJGC2\n\tFwBymKmRPjpI9aUQtqzCCAjwOMFrdkAI4PFwdh7FY40OuEeJIJuafsMcZGP95w/lPCCX\n\tzfPxGDcaAanCfMGm1BoBFo+DzaxGj/PwmbcM8LifuEfA4wemuPq7SbzFVaamIwTkN9ZB\n\tMoAMDvDzJIAcYoiAVGsaYeMqigDFo77RkGG2TgSPwVHbBXiE/Vcl+z2Ks7gqEKQ8IHfE\n\trEVAqihPsBmNREAWj2sleCwHPDbCjR3ix6O0gySAfP30/g0KyPUUkI4MIPXwUXMaySns\n\tpP0RYPBoSPHo6RcQvJ7B4/1nr9/V1OoKHiUlVqGDvHw2cz8Csv2Zge/UQgTk8bgD3ONl\n\tcI+6hEcZQH6lgCzMOwUlVgSkFrIKu2xvBACPen30CR4dJwjx+FS38CgPyBfFty+fzdgH\n\tgAxiSqxDcQ6yvUmC79NUBBTgcV/m2cu3i1/oFh7lAFkJDrIw99Sh1Nj1wYv9PMc72tAS\n\tKzpITWUW9tOeCEjjcTFxj4dO5RXeJ3j8qjvuUdEcpASQYUH+PpNgDhIB2Z4MwfdoMAIc\n\tHocyc49Ba2N27MvQSTw2D8hZUxGQGkwr7KqdEZDg0cZxvKcf4DEW8JhL8Fipa3gUOMhf\n\tzCKdF4+og0yMoYAcOwoB2c4swbdpKAJCPE7y8Q8K02E8KgXkrtjI4MUISA2lFHbTgQgI\n\t8Th11uLgSF3GowwgP70vB0AW5GSkyQKyR/cOhAzfihFQVwR4PI4ay+AxcV9GzuXbj6C4\n\t+gmW5vzSiaU5zII5SUUHNjCHR839+Pa1pvL1k3uFuScP8oC0IKtYscSqrnzCdjsWAQ6P\n\tFuAeGTzu0l33KBEk6PHfXz8b6zlAHk9L3BS21H/6JImDREB2LG/w3eqJQPce5Kk5g4da\n\tSfCYlpFTQPD4HvD4U9fwyDvIf/8hgKwmgLxOALktctUicJAONiwgu3dTT0CxVYxA+yOg\n\tAI8HT+Zev/dEF4urzFUr8yQdBpB1AMjnj24V5BBAhnKAHEQeFICAbH/W4DvVFQEhHqf7\n\tLw3blJh2PKfglgCP7IaPvEMT+2/cfZAcIF8BIC9KAdLEUL+3Hu7Pqq6cwnbbHYFu3enK\n\tVRMLGwdwj4tWRW7bdfDkRYrHarI0R4z7r7b47wEHyP+BgxQAMoECciJxkIMM+iIg2500\n\t+Ea1RYDB4yDqHgGPoZsSGDw+B/dYB+5Rch9yiyIQ0QlKAJmyLWLVoplTXcFBmhj2R0Cq\n\tLamw4fZGACY79HrrGxI8uhI8RnB4fFWpu3jk5iDJlAcLyIe38sFBsoAcM8rKFAHZ3pTB\n\t96kxAgSPfQ0oHid2GjzKlVjfsg6SAeQUVwdrC5OBCEg15hU23a4IUDz2H2hiYe3gOmUm\n\twWMK4x51G49KAHlsb0J06BJ/74ljRloiINuVMPgmtUaAxaOp5cgxFI/RCXuP5+TfeqjT\n\t7pEYWYGD/A5zkADIu9cvnkhP2RqxcuFMBKRakwobb28EFOAx/QQprr56q8vuUSJIumhO\n\t4CCP7Y2PXrNkrhCQuCagvcmD71N5BIR49PZfEgp4PNYp8CgNSNif9e2rx3evXeABaW9t\n\tjg5S5fmEDXYoAjwe7cE9LlwZsTUF8HjtLsVj/XfdnHvkpl0Ec5ANdZ+qyp4/vJmfIwdI\n\tfPRjhzII36zKCMBSOVJcpe7Re+6SNdHxBI83dd89Si5Y4TYPWKRDNjDnALlza/jKhb5T\n\tXBGQqswkbEsFEeDwaG4NePRduDKc4PHCtbuPwT1+0XU8Sio6ZA6yoe5jVdkzFpAbiYN0\n\tpyXWAX17ISBVkEnYhCoiIMCjuxQey6o+1TXo6NIc7nJV3kGWEgeZlc4AEvZnRQepiiTC\n\tNlQVASEeJ1M87uxEeOT1yAPywc38M0f3xDOAdCZzkAhIVWUTttPRCFA8DqDukeJxY/ye\n\tY2fAPT4rq/oohUcx76DD41D+N+EcJHGQHCC3hK9Y4IuA7Gj+4PtVGgEBHl0AjyvCt+xM\n\tzyLusbQzuEdhRUcekKsD50xzR0CqNJ+wsY5FgMejs7v3nMA1gMejgMcHnQaP/BUr7M9K\n\tS6ylj4uuEgfJAXKEuTGsYu2J90F2LJPw3SqIAOCxZ+/+A43NR9gDHhdweCxi8QgbzLG3\n\tIevq1SoQkrtgpYCsJSXWBzcYB8kA0m64qRE6SBUkEzbR4QgweDQytbRzdp82J3B1J8Qj\n\tL0gWkBUEkOez0pMJIGeAg0RAdjiPsAGVREAxHq92KjzyepQD5AYCSDdnBKRKkgkb6XAE\n\tODwOt3N24/F4g7rHWuHcow5frgquWCWALAFAZkoB0gAdZIezCRvoYAQYPBow7nEGcY/J\n\t6VnnrxaVlFaQpTmdwj3KlVg5B3n6yO54BGQHMwjfrsoIyOJxQ/zuo6fzOx0e+StWaUAe\n\tSN4cvnw+dZBmxghIVWYWttWOCMjhcXPygcxOiEdej5yDfAMl1ksAyLgNIYFzvFgH2QdX\n\tsbYjifAtKosAwWOfAUamnHvcELf7yOlLnRCPrCCbyG0edA6y4mVJ0ZXzmdKA7IdzkCpL\n\tLWyo7RGgeOxnYGxG5h5nzF8ezuHxZedyjwoc5DshIGd7uTnREisCsu1JhO9QWQR4PDq5\n\tec0ODJHg8c27j52ouErkKAPIz9UAyDtXzmUeSNq8jnGQVuAgYfMAXKSjsvTChtoWAYJH\n\t2EFHgsd1BI/nrhSVAB4/s8XVJrq2hclo3f5/wSKdHw21HzlApsZFhQQSQNqSRToIyLal\n\tEJ6twgjI4jGKc48Ujz/4R5Lr9twj988IFSTnIAkgixlAxgAgfWCRDgJShbmFTbU5AhI8\n\tWoF79Jm/fN3mJILHO50Tj1IlVgBkDQPI7MMEkAGzvSYgINucQfgGVUZAgkdbpwnEPUbF\n\tpR7JJsXVN+9qahs6HR4lDvI3LbF+/sACcn9SzLpl83w8xo22MhuMDlKVGYZttSECLB4H\n\tmwEePQgeY5L2EzwWv6z40PncI7loFTrIbywg8wCQ26OCGUAOG2Kkjw6yDTmEp6ouAhSP\n\t+kamwygeA0Kitqcezs7rxHiUAmRj/ecP5YyDBECuRUCqLrGwpfZEgMfj6HEePvOWSeOx\n\tEVau/m7qPMVVpqYjD8j7Nygg1wcH+HmCgxw2xBAB2Z5swvd0NAIMHg2HEDx6+gUES+ER\n\t9l+V7PfYOYqrAkE2NREHyQHy8rnM/TsQkB1NJ3x/xyIgi8e1MTtY91gO7rFz4lHeQb5+\n\tKgVIRwaQevgs1o4lF767zREAPOr10Sd4dKR4XM+4x/tPX0NxtbPiUd5Bvii+ffls5j4E\n\tZJsTCN+gyggoxOPZy1Bc7cx4lAHk15p3AMjCvFOHUrevD14MDhIBqcokw7ZaHQFFeDyV\n\tV9jZ8agEkBkEkEH+dA5yKM5BtjqL8EQVRYDD41ArWlwNAve4L/Ps5dvFLzo3HuUAWUkA\n\tmQuAjKWAHO9oQ0us6CBVlGjYTKsiIMDjeE+/xcHrY1MPncoleKys+dp53aNkUYCgxPri\n\tEThIAsgwAOQkWKSDgGxVCuFJqouAEI+TfPyDwgCPGV0Cj80AMjJ48aypCEjVZRm21NoI\n\tSPBo4zh+6qwuhUeBg/wFc5CfPpQDIAtyMvYlMoAcOwoB2do0wvNUEwEej6PGMnhMpHh8\n\txLrHX51waQ6zHkBywQr7s8KTdH58+1rDOchdsRwgLcgiHXSQqsk1bKXlCMjiMTJ2V1dx\n\tjxJBEgf56ycA8j0LyLTETdRBSgDZo3vLkcQzMAIdj0D3HuSxAIOHWknwmJaRU3Ab8Pj+\n\tEyzN6dx4FDjIf1hAPrl3PffkQQRkxzMLW2hHBDg8WrDuEfB48GRu4b0uUFxlrlqZBwX8\n\toYCso4C8VZBznAByqf/0SQSQg8h9kAjIdiQXvqXNERDicbr/0rBNiWnHeTz+7Ox45AH5\n\tLwVkdeVrAORFAOS2yFWLoMTqYGNhQh1k925tji2+ASPQxgh0686sXLWwcYDi6qJVDB6v\n\t33vyurKazD12hg3m+OqNwt84QP4PHCQB5PNHFJAJm0IRkG3MJjy9oxFg8DiIukfAYyiD\n\tx1vUPdY1EjyyGz4qTOVOcZC7D5ID5CsOkBGrFs2c6soAsrcePvqxo7mG728xAjDZoddb\n\t39BEgsdt4B4vAh5fdRk8cnOQZMpDASAnMg6yLzrIFpMJT+hwBAge+xpQPE6keEwg7vHW\n\to+dQXCV4lNyH3ClIqORDKAFkyjYCyCmuDtYWJrCBOQKyw9mGDbQQAQEeXafOXLQqYltK\n\t18OjAkA+vJWfc3xvQjRxkBPHjLQ0HWSAgGwhl/DljkeAxaOp1agxPB7zbz3sUniUK7G+\n\tpQ7yRDoAciUCsuNZhi20MgIUj/0HmlhYO7hOkcLj265SXGUuYeVKrASQxwggl8z1RkC2\n\tMp3wtA5GgMOj5cgxE739l4RGJ+w9ltP18CgFyO/1X6vfvnp899pFAOTWiJULwUHao4Ps\n\tYKbh21sRAWk8LlwZsTUl/cTF63efvCJ4/N4V5h65Co88IG8SQMZHrxECEp9s1YqswlPa\n\tG4FuTHHVlOJx7pI10fFdFI8ygPzCAPLCifSdW8NXLvQlgDTHEmt70wzf17oI8Hi0B/fI\n\t4vHCtbuPAY9f6rsUHqVKrA11n6rKnj8UANKdK7EiIFuXWnhWOyIAK8nJ3KMMHm8+fF5W\n\t1XXmHqUuWOE+SFik871eFpCTEZDtyC98S5siwOHR3Brw6LtwZfjWneknuioehbvr/Gyo\n\t+1hV9gwAeebYnviNxEEygBzQtxcCsk05hie3PgIUjwMoHt29wT1upO7x5sNnZVUf6xq6\n\tyNIcDo/yDrIUSqwXstJ3bglfsdAX9mdFB9n61MIz2x4BAR5dJrN4zCJ4LO2C7hFkyS2a\n\tI6tYGUA+AEAeBUCuDpzj7e5MFukgINueZ/iO1kVAHo97jp7Jv/lADo+daQcdHofyv3GC\n\tpPuzgoMsfVzEAXIBAeQIc2NYxdoTb/NoXX7hWW2KgDQeF6wI37IzvSvjsQVATnN3trM0\n\tNUJAtinJ8ORWR4DHo7P7tDmBqzfGd3E88oIUAPLqecZBIiBbnVh4YnsiAHjs2bv/QGPz\n\tEfbgHjk8Xi1i3SPsv8rehtxVrlZlHWQtKbE+uCFxkNPcnO2GIyDbk2v4npYjwODRyNTS\n\tTohH2J5ctrjahfQoKemwgKwoLSkigEyGEuuCGYyDNEAH2XJy4RltjYA8HpPTs84TPFaQ\n\tpTldEo/8BSstsXKAPH10d/wGKLEiINuaZHh+qyPA4XG4nbMbcY8bqHtk8FgrnHvsSnjk\n\tBSkFyMwDyZvDV8xHQLY6u/DENkaAwaMB4x5nEPeYnJ4JeCzp0njk9SgE5KXTR3bHCQHZ\n\tBxfptDHd8PQWIiCPx91HTud3eTzyguQA+ZI4SArI5QwgzYwN+uEcZAvphS+3LQIcHs1I\n\tcXXG/OXhm5MPIB7JCgFuTQALyHdvoMTKADIkcLaXmxMtsSIg25ZueHYLESB47DPAyJS4\n\tR685gSEb4gCPlwCPb6o+dmH3KBFkE7nN4+/v9Z+rK16W3LlyjgBynQCQvXCRTgsZhi+3\n\tIQIUj/0MjKXxeKWo5CVfXG2ipCAZ2rV+BID80VD7kQdkFAKyDSmGp7YhAjwendy8Zgvx\n\t+K6r45G9YpUHZBIBpA/MQVoRB4mAbEO64anNR4DgETaYMzazYtzjus1JBzLPXblD8PiZ\n\tnXvsqniUcpAAyBoGkNlHUuMoICc42ZJFOuggm08xfLUNEZDg0ZbBY1RcKuseCR5/8I8k\n\t71pzj9x1Ob1ilQDyQ8XLYuIg9yfFEEB6EEAORkC2Id3w1OYjIIVHn/nL18UweCxGPFJJ\n\tSjtIBpB52YdTt0eFBMz2AkAOMzXSR0A2n2T4aqsjIMDjBK/ZASGAx8PZtLj6rgbxCJJk\n\tAfkbSqyN9Z8/lPOAXDbPx2PcaARkq3MNT2wxAiweB5tZjR7n4TNvGeBxP3GPgMcPjHv8\n\t3dR13SMhpBCQ31gHyQAyOMDPkwByCOzPiot0Wkw1PKEVEaB41DcaMszWieAxOGo74DGP\n\tzD0CHmH/VcmGVl3TPUoE2dQkC8gdMWsRkK3IMDylDRGQxeNaCR7LAY+NcGNHV8ejPCBf\n\tP71/gwJyPQWkIwNIPXzUXBvyDk9VHAEGj4YUj55+AcHrGTzef/Ya8UjYSH8UOMjLZzP3\n\tIyAV5xQebXcE5PG4A9zjZXCPiEdOjTKA/FrzDgBZmHcKSqwIyHZnHr5RUQQAj3p99Ake\n\tHScI8fgU8cjLUb7E+qL49uWzGfsAkEFMiXUozkEqSi881rYIcHgcyhZX18bs2Jd59vLt\n\t4heIRzk9wuYBcJvHj29fayoJIHNPHUqNXR+82M9zvKMNLbGig2xb9uHZshGQxuNi4h4P\n\tncorvE/w+BWLq7wkZR2kBJBhQf4+k2AOEgEpm1v4d5sjII1H/yCCxwzEIy9DyW9Sc5Ay\n\tgJw1FQHZ5tTDNyiIgASPNo7jPf0Aj7GAx1yCx0rEo0SL9BcJIH8xi3RePKIOMjGGAnLs\n\tKASkgvzCQ22KAI/HUeMm+fgHhbF4fITuUVqM8JcSQO6KjQxejIBsU9rhyUoiIMTj1FmL\n\tgyMRj3I6lByQAuSn9+UAyIKcjDRZQPboriTYeBgj0EIEmPseBw+1GjWWwWPivoycgtsE\n\tj59gac4vXJojUaMCQD65V5h78iAPSAuyihVLrC3kHL6sNAIcHi3APTJ43IXuUaBAmV8Z\n\tQP75/e+vn431HCCPpyVuClvqP32SxEEiIJUmHL7QbAS69yCPBWDwOB3c46bENBaP7wGP\n\tPxGP0oLkHCRsYA5zkNWVr5/cu04AuS1y1SJwkA42LCC7d2s26vgiRkBhBLp1Z5bmCPB4\n\t8GTu9XtP2OLqP7+73g460gqU+UsIyDoA5PNHtwpyCCBDOUAOIg8KQEAqTDc82EIEGDwO\n\tou5xuv9SgsfjOQW3wD2+/1RH8cjqUSYtu+yfsoB8BYC8SAAZQQDpCoA0MdTvrYf7s7aQ\n\tePiyogjAZAdZuWpiYeMA7nHRqshtuw6evEjxWE2W5nTFDeZa+KeGAyRsYN4oAGQCBeRE\n\t4iAHGfRFQCrKNjzWUgRk8Bi6KYHB43MWj5L7kFtI0i70shJAphBAzpzCALI/ArKlzMPX\n\tFUSA4LE3g0fXqTMXrYrg8PiqEvGo7N8YOUA+vJWfc3wvC8gxoyxNEZAKcg0PtRwBgse+\n\tBsQ9jpkI7pHD40PEozIxwnEZQL5lHGS6BJDWFiYDEZAtJx+eIRsBisf+A00srB1cp1A8\n\tpjDuEfHYjB7ZR82R265YB0kAeWxvQnToEn/viWNGIiBlEw3/blUEWDyaWo4cM9Eb8Bid\n\tsPd4Tv4txGNzapQC5HeYgwRA3r1+8UR6ytaIlQvBQdojIFuVfXiSTARk8LgyYmtK+glS\n\tXH31Ft1jc5JU6CCP7Y2PXrNkrhCQuCZAJuPwz+Yi0I1xjwwe5y4heDyGeGxOiOxrAgf5\n\tvf4LAPLx3WsXCCDDWUCao4NsLvHwNUUR4PFoD+5xIYvHa3cfEzzWf8e5R+XKFACyoe5T\n\tVdnzhzeJg2QA6c45SHz0o6K0w2NKIgAryUlxlcPjmuh4gsebD5+XMUtzcO5RqSCVAHIn\n\tAaTvZHCQCEglSYeHlUWAw6O5NeDRd+HK8K07009cYPD4BfGoVIvkBU6PdAPzuo9VZc9Y\n\tQG4kDpIB5IC+uHmAstzD4/IREODR3XvuEgken5VVfapr+MlvEdBsZnbRFzlBwm0e1EGW\n\tEgeZlc4C0gUBKZ9veKTZCAjw6DJZiMfSt9WIx5b+meH0yAPywc38M0f3xG9cEzjH292Z\n\tzEEiIJtNQHxRKgIUjwOoe6R43Bi/5+gZcI+Ax49SeOy6O+g0J0pOkLD9HAvIIgrILeEr\n\tFvjCBuYjqIPsibd5SCUd/qEsAjJ4XBG+ZWd6FnGPiMfmZCh5jdOjPCBXB86Z5u5sZwkb\n\tmKODVJZ+eFwmAjwend295wSuZvH4APEokVzzv3CCFADyKnGQPCCNYRUrAlIm7/BPhREA\n\tPPbs3X+gsfkIe3CPC1g8Xi1i8QgbzOFjAVqnRwrIWlJifXCDcZAEkG7OdsMRkApTDw8q\n\tiACDRyNTSztn92kSPML+q+gem5ch/6oMICtKHxddPZ+VnkwAOYM6SGMDBKSC3MNDchGQ\n\tx2NyetZ5gscKUlxFPPKyU/obp0cpQJ4+ujt+AwJSLuHwQLMR4PA43M7ZTRaPtcK5Ryyu\n\tKtWjZFEA6yArSksAkJkHkjcjIJtNPnxRNgIMHg0Y9ziDuEcGjyWIR+Xyk3tFESAvnT6y\n\tO04IyD64SEc2+/Bv2QjI4nFD/O6jp/MZ94h4lBOesgOcIOUBuXw+dZBmxgb9sMQqm334\n\tt0wEpPE4f3n45uQDmeAeEY/KlKf4OKdHzkG+gRIrA8iQwNlebk60xIqAlMk+/FM2AgSP\n\tfQYYmbLuMWRD3O4jpy8BHt9UfUQ8KtaewqNUkE1NfyggP1dXvCwpukId5DoBIHvhHKRs\n\tAuLfwghQPPYzMDYjc48zODxeKSp5icVVhbJTelAAyB8NtR/fISCFeYa/ty4CPB6d3Lxm\n\tBwrw+A7xqFR7Cl+QB+SdK+cyDyRtZgFpRRwkArJ1edlFzyJ4hB10JHhcR9zjuSt3CB4/\n\ts3OPTTTRFKYgHhREQCEgs4+kxkUxDtKWLNJBB9lFlda6jy3Boy2DxyiJeyR4/MHf94hz\n\tjwLlKflVDpDFBJD7k2IAkD4eLvZWZoMRkK3Lyy56lgSPVuAefeYvXxeThHhUoraWD0sD\n\tsoY6yLzsw6nbo0ICZntNcLIdZmqkj4DsolprzccW4HECcY9RcalHsmlx9V0N4rFlBcqc\n\twQLyN5RYG+s/fyh/KQHksnk+HuNGIyBbk5Rd9xwWj4PNrEa7ePjMWwZ43E/cY/HLig/o\n\tHmXE1oo/hYD8VisEZHCAnycBJNnAHBfpdF3FNf/JKR71jUyH2ToBHgOCo7anHs7OI3OP\n\tgEfYYE7yUDl0j61QI5yiBJA7YtYiIJtPRXz1r78EeBwnjcdywGMj3NjxuwmLq61TInOW\n\tLCBfP71/gzrI9RSQjgwg9fBZrCg/BRFg8Gg4hODR0w/x2BblKTlXASAvn83cj4BUkH54\n\tSDoCsnhcG7ODdY+IRyVya/GwFCC/1rwDQBbmnYISKwJSOvnwL7kIAB7J9uSAR0eKx/WM\n\te7z/9DW6xxaFp+wEWUC+KL4NgNwHgAxiSqxDcQ5SLhPxAERAIR7PXr5T/ALxqExtLR+X\n\tAWQlAWTuqUOpseuDF/t5jne0oSVWdJAoQdkISONxcTDB46m8QorHr1hcbVl6is9QCMgM\n\tAGRYkL/PJJiDREDKZiL+DRHg8DjUajQprgaBe9yXcfbybcSjYp219mhzgJw1FQGJ4lMc\n\tAQkebRzHe/oBHmNTD53KJXisrEE8tlZ9Cs6TAPIXs0jnxSNwkBn7EhlAjh2FgFSckF37\n\tqBCPk3z8g8IQjwq01Z5DSgC5KzYyeDECsmurTvmnF+Jx6qzFwZGIx/aIT9F7pAD56X05\n\tALIgJyNNFpA9uiv/dvCVLhYBHo+jxjJ4TKTu8RFbXP2FS3MUSa1Vx+QBea8w9+RBHpAW\n\tZBUrlli7mOSa/bgcHi3APTJ43IXusVVqa8VJPCB/NtZzgDyelrgpbKn/9EkSB4mAbDZF\n\tu9SL3XuQxwIMHmolwWNaRk7BbcDj+0/1jT8Rj62QndJTOEDC/qw/vn2trnz95N51Asht\n\tkasWgYN0sGEB2b1bl8o5/LBKI6AAjwdP5hbee4LFVaUqa8MLDCD//P7318/GOgrIWwU5\n\tBJChHCAHkQcFICCVJmgXe0GIx+n+S8M2JaYdzym4JcAju6NVG5IQT5VEQBaQrwCQFwkg\n\tIzhAmhjq99bD/Vm7mOyUfdxu3enKVRMLGwdwj4tWRW7bdfDkxesEj9Vk7hE3mJNIq32/\n\tcID8HwvI548oIBMoICcSBznIoC8CUll+drXjDB4HUfcIeAzdlMDg8Tm4xzrqHhGP7RMi\n\t+y4lgEwhgJw51RUcpIlhfwRkV9Odks8Lkx16vfUNCR5dp85ctCqCw+MrxGOHZMi/WQ6Q\n\tD2/l5xzfywJyzChLUwSkkuzseocJHvsaUDxOVIRHyWM6+PzC39oWARlAvmUcZDoDyCmu\n\tDtYWJrCBOTrIric++U9M8dh/oImFtYPrFIrHFMY9Ih7bJrrmzlYIyGN7E6JDl/h7Txwz\n\tEgEpn5hd9AiLR1PLkWMoHqMT9h7Pyb/1kHOPiMfmhNbK1wSA/A5zkADIu9cvnkhP2Rqx\n\tcuFMBGQXlZ6ijy2Dx5UR21LST5Di6qu3WFxtpdpacZoSQMZHr1kyVwhIXBOgKEm70DEh\n\tHr3nLgkFPB5DPLZCYW07RQjI+i8AyMd3r10ggAyngLS3NkcH2YVUp/Sj8ni0B/e4cGXE\n\tVoLHa3cfEzzWf8e5x7bJTvnZ0oCsKnv+8GZ+zrG9DCDdOQeJj35Umqld4wVYKkeKq9Q9\n\tAh7XRMcTPN5E96hcWe17RQkgdxJA+k52RUB2Db218Ck5PJpbAx59F64M37oz/cQFBo9f\n\tEI/tk57idwkA2VD3sarsGQvIjcRBMoAc0Bc3D2ghYTv5ywI8ukvhsazqU13DT36LAMU5\n\thkdbHwFZQJYSB5mVzgLSBQHZyaXWmo8nxONkxGPrxdWOMzk9/oZVrAwgH9zMP3N0T/zG\n\tNYEASGcyB4mAbE3Wdt5zKB4HUPdI8bgxfs+xM+Aen5VVfZTCI+6g0w4FyryFEyRsP/ed\n\tlFhLHxdRQG4JX7HAd7KL/QgssXZepbXqkwnw6AJ4XBG+ZWd6FnGPpW+r0T3KyKnDf3J6\n\tlAfk6sA509yd7RCQrcraznsSj0dnd+85gasBj0cBjw8Qjx0Wn6IGOEEKAHmVOEgekMaw\n\tirUn3gfZeRXX7CcDPPbs3X+gsfkI2J7cdwGHxyIWj7DBHHufFV6tKpJXm49xeqSArCUl\n\t1gc3GAfJAnK4qRE6yGZTtlO/yODRyNTSztl9GuKxzfpq8xs4QbKArAAHefV8VnoyAeQM\n\t6iCNDRCQnVpzzXw4eTwmp2edv4p4bLPOWvsGTo8ygNwdv4EA0s3ZDgHZTL529pc4PA63\n\tc3bj8Qjbk0NxtVY494iXq60VXEvncYKUALIEAJmZnrwZAdnZ1dbi52PwaMC4xxnEPTJ4\n\tLCmtIMVVdI8tiasdr3N6FALy0ukj0oDsg4t0WkzeTniCLB43xO8+ejof8dgOmbX+LZwg\n\tpQF5AAC5fD51kGbGBv2wxNoJ5dbSR5LG4/wV4ZuTD2SCe0Q8tl5dbT+T0yMHyDdQYiWA\n\tjNsQEjjbi3WQCMiWkrcTvk7w2GeAkSnnHjfE7T5y+hLg8Q26x7brrNXvoIJsavpDAfm5\n\tuuJlSdGV85kAyHUCQPbCOchOqLhmPxLFYz8DYzMy9zhj/nIJHl+ie2y1uNpxogCQPxpq\n\tP76TAaQTLbEiIJvN3c74Io9HJzev2YEhPB7fYXG1HTpr9VvkAXnnyrnMA0kcIK2Ig0RA\n\tdkbNNfOZCB5hBx0JHtcR93juyp0SwONntrjaRFOn1YmGJ7YqAgoBmX0kNS6KOkgnWzIH\n\tiYBsJnc740uyeIySuEeCxx/8fY8499gqlbXhJDlAFhNA7k+KAQfpA4t0rMwGIyA7o+aa\n\t+UwSPFqBe/SZv3zd5iTEYxs01ZFTpQFZQx1kXvbh1O1RIQGzvSY42Q4zNdJHQDaTvZ3v\n\tJQkebZ0mEPcYFZd6JJsWV9/VIB47orZWvJcF5G8osTbWf/5Q8VICyGXzfDzGjUZAdj7B\n\tNf+JWDwONrMa7eJB8BiTtJ+4x+KXFR/QPbZCUh06RQjIb7VCQAYH+HkSQJINzHGRTvM5\n\t3JlepXjUNzIdRvEYEBK1PfVwdh6ZewQ8wgZzkkeSo3vskPKUvFkGkOUSQK5FQHYmmbX2\n\tswjwOM7DZ94yHo/lgMdGWLn6uwmLq0rEpILDsoB8/fT+Deog11NAOjKA1MNnsbY2oXX8\n\tPAaPhkMIHj39AoIRjyoQWVuaUADIy2cz9++IQUDquLTaM3xZPK6N2cG6R8RjW1TV/nMV\n\tALIw7xSUWBGQ7UloHX8P4FGvjz7BoyPF43rGPd5/+hrdY/s11qZ3ygLyRfFtAOQ+AGQQ\n\tU2IdinOQOq6yVg9fIR7PXr5T/ALx2CZRdeBkKUB+rakEB1mYe+pQauz64MV+nuPRQbY6\n\tm3X/REV4PJVXSPH4FYurHVBZG96qEJAZFJD+PpNgDhIBqftKa9Un4PA41Go0Ka4GgXvc\n\tl3H28m3EYxvk1OFTmwPkrKnjHW3oHCSWWFuV0jp9kgSPNo7jPf0WB6+PTT10KpfgsbIG\n\t8dhhobW2AQkgf9FFOuUvHoGDzNiXGBMWBIAcOwoBqdMqa/XghXic5OMfFIZ4bK2EVHqe\n\tEkDuio0MXoyAbHU66/yJQjxOnYV4VKnI2tKYFCA/vSeALMiRB2SP7jqfcvgBlEeAx+Oo\n\tsQweE6l7fMQWV3/h0py2iKoD58oD8l5h7slDPCAtyCpWdJDKc7kzvMLh0QLcI8FjZOwu\n\tdI8dUFUH3soD8mdjPQfI42mJm8KW+k/nHSQCsjPoTtln6N6DPBZg8FArCR7TMnIKbgMe\n\t33+qb/yJeOyAwNr4Vg6Q//7z68e3r9WVr5/cu5578uCubZGrFoGDdLBhAdm9m7IvE4/r\n\tegQU4PHgydzCe0+wuNpGNangdAaQf37/++tnYx0A8vmjWwU5BJChHCAHkQcFICB1XXXK\n\txy/E43T/pWGbEtOO5xTcEuCR3dFKBemGTbQQAVlAvgJAXpQCpImhfm893H5OeT7r+Cvd\n\tutOVqyYWNg7gHhetity26+DJi9cJHqvJ3CNuMNeChFT7MgdI2MBcCMgECsiJZA5ykEFf\n\tBKSOi66Z4TN4HETdI+AxdFMCg8fn4B7rqHtEPKpWcs22pgSQKdsiVi2aOdUVHKSJYX8E\n\tZDMJrdsvwWSHXm99Q4JHV4LHCA6PrxCPzQpHXS/KAfLhrXxwkCwgx4yyMkVA6rbkmh09\n\twWNfA4rHiYrwKHlMh7ryD9uVjoAMIN+yDpIB5BRXB2sLE9jAHB1ks1mtsy9SPPYfaGJh\n\t7eA6ZSbBYwrjHhGP0jLR3F8KAXlsb0J06BJ/74ljRloiIHVWbi0OnMWjqeXIMRSP0Ql7\n\tj+fk33rIuUfEo+aEyPYkAOR3mIMEQN69fvFEesrWiJULZyIgW0xpXT5BAR7TT5Di6qu3\n\tWFzVuBKFgmz6Q7afY0qsxEEe2xsfvWbJXCEgcU2ALktP4diFePSeuyQU8HgM8agtIQr1\n\t+H9k+7lf3+u/ACAf3712gQAynALS3tocHaTCbNb5gzwe7cE9LlwZsTUF8Hjt7mOCx/rv\n\tOPeoHWUKHGRD3aeqsucPb/KAdOccJD76Uef1J/sBYKkcKa5S9wh4XBMdT/B4E92jdnTI\n\t9Sp0kAJA7iSA9J3iioCUzeNO8jeHR3NrwKPvwpXhBI8XGDx+QTxy8tD8f6UA+bGq7BkL\n\tyI3EQTKAHNAXNw/oJDKUfAwBHt2l8FhW9amu4Se/RYDmM7Jr9ygLyFLiILPSGUDC9nPo\n\tICU53Il+EeJxMsXjTsSjKP4h4PRISqwNdQSQD27mnzm6J37jmkAApDOZg0RAdiIp0o9C\n\t8TiAukeKx43xe46dAff4rKzqoxQecQcdTauUEyRXYuUAuSV8xQJfAOQILLF2NjX+JcCj\n\tC+BxRfiWnelZxD2Wvq1G96hpBUr3x+lRHpCrA+dMc3e2s4QNzNFBdipN8nh0dveeE7gG\n\t8HgU8PgA8SitDa38xQkS9melc5Clj4uuEgfJA9IYVrH2xPsgO40kAY89e/cfaGw+ArYn\n\t913A4bGIxSNsMMfeZ4VXq1pQJKdHCsha6iBvMA6SBeRwBGSnkSL9IAwejUwt7Zzdp80J\n\tXI141ILslHfJCZIFZAUB5Pms9GQCyBnUQSIgO5Mg5fGYnJ51/iriUblENPoKp0cZQO6O\n\t30AA6eZsh4DsTHL8i8PjcDtnNx6PsD05FFdrhXOPeLmqUR1KOuMEKQFkCQAyMz15Mw9I\n\tA3SQnUWTDB4NGPc4g7hHBo8lpRWkuIruUaILbf3C6VEIyEunj0gDsg8u0ukcipTF44b4\n\t3UdP5yMetaU+Bf1ygpQG5AEA5PL51EGaGRv0wxJrp9CjNB7nLw/fnHwgE9wj4lGBMLR0\n\tiNMjB8g3zx7cIICM2xASONvLzYk6SARk59Aj3NjRZ4CRKeseQzbE7T5y+hLg8Q26Ry3J\n\tT75bKsgmch8kzEF+rq54WVJ05XwmAHKdAJC9cA5S9xVJ8djPwNiMzD3O4PB4pajkJbpH\n\teV1o64gMIN8hIHVfeYo/AXGPDB6d3LxmBwrw+A6Lq9qSn3y/8oC8c+Vc5oEkDpBWxEEi\n\tIBXnuA4dJXiEHXQkeFxH3OO5K3cIHj+zxdUmmgzyOYJHNBcBASB/NNR+ZACZfSQ1Lopx\n\tkLZkDhIdpA4pT/FQZfEYJXGPBI8/+Psece5Rc+JT1JMcIIsJIPcnxYCD9PFwsbcyG4yA\n\tVJzjOnRUgkcrcI8+85ev25yEeFQkB60fkwZkDQVkXvbh1O1RIQGzvSY42Q4zNdJHQOqQ\n\t9hQNVYJHW6cJxD1GxaUeyabF1Xc1iEeti1A4ABaQv6HE2lj/+UPFSwkgl83z8Rg3GgGp\n\tKMF16xiLx8FmVqNdPAgeY5L2E/dY/LLiA7pHoRq0/7sQkN9qhYAMDvDzJIAkG5jjIh3d\n\tUqD0aCke9Y1Mh1E8BoREbU89nJ1H5h4Bj7DBnOSR5OgeRSLIpiYOkOUSQK5FQEqnta7+\n\tJcDjOA+fect4PJYDHhth5ervJiyual+JzAhkAfn66f0b1EGup4B0ZACph89i1VU50hs7\n\t+ugbDiF49PQLCEY8ikV7Csch4yAJIC+fzdy/IwYBqbMSFA5cFo9rY3aw7hHxqFAQWj6o\n\tAJCFeaegxIqAFKa1zv4O7lGPwaMjxeN6xj3ef/oa3aOWpae4e1lAvii+DYDcB4AMYkqs\n\tQ3EOUmfVSB4qR5bmkOIqdY8Uj2cv3yl+gXhUrAdtH5UC5NeaSnCQhbmnDhFALvbzHI8O\n\tUnfFCCOXxuPiYILHU3mFFI9fsbiqbfEp6l8hIDMoIP19JsEcJAJSZyXJ4XEog8cgwOO+\n\tjLOXbyMeFSlBHMeUATIWADlr6nhHGzoHiSVWXRSlBI82juM9/QCPsamHTuUSPFbWIB7F\n\toT+5UUgA+Ysu0il/8QgcZMa+xJiwIADk2FEISF2UIhmzEI+TfPyDwhCPctkvvgNKALkr\n\tNhIBqatKZMYtxOPUWYhH8WlP4YikAPnpPQFkQU5Gmiwge3TX7ezscqPn8ThqLIPHROoe\n\tH7HF1V+4NEehHrR9UB6Q96DEepAHpAVZxYoOUtcEzeHRAtwjwWNk7C50j9oWW2v65wH5\n\ts7GeA+TxtMRNYUv9p/MOEgGpW4rs3oPOPQ61kuAxLSOn4Dbg8f2n+safiMfWaEMb53CA\n\thO3nfnz7Wl35+sm967knD+7aFrlqEZRYHWxYQHbvplsJ2bVHqwCPB0/mFt57gsVVbYis\n\tLX0ygPzz+99fPxvrKCBvFeQQQIZygBxEHhSAgNQlhQvxON1/adimxLTjOQW3BHhkd7Rq\n\tS6bguZqIgCwgXwEgLxJARnCANDHU762H28/pkB67dacrV00sbBzAPS5aFbltF+DxOsFj\n\tNZl7xA3mNKGsdvbBARI2MKeAfP6IAjKBAnIimYMcZNAXAalDcvyLweMg6h4Bj6GbEhg8\n\tPgf3WEfdI+KxnWpR/9uUADKFAHLmVFdwkCaG/RGQOqRHmOzQ661vSPDoSvAYQfB4EfD4\n\tCvGofj11uAc5QD68lQ8OkgXkmFFWpghIHVLjXxSPfQ0oHicqwqPkMR0dTh1sQA0RkAHk\n\tW9ZBMoCc4upgbWECG5ijg9QVTVI89h9oYmHt4DplJsFjCuJRDbpRW5MKAXlsb0J06BJ/\n\t74ljRloiIHVFi2ScxD0CHk0tR46heIxO2Hs8J//WQ849Ih7VpiTVNCwA5HeYgwRA3r1+\n\t8UR6ytaIlQtnIiB1SYswVgV4TD9B3eNbLK6qRjDqbkUJIOOj1yyZKwQkrgnQAW0K8eg9\n\td0ko4PEY4lHdElJp+0JA1n8BQD6+e+0CD0h7a3N0kDqgRDpEHo/24B4XrozYmgJ4vHb3\n\t8SvAY/13nHtUqXLU1Jg0IKvKnj+8mZ9zbC8DSHfOQeKjH3VAlLBUTuIeAY9rouMJHm+i\n\te1STdNTSrBJA7twavnKh72RXBKQOCJEZIodHc2vAo+/CleEEjxcYPH5BPKpFPWpoVADI\n\thrqPVWXPWEBuJA6SAeSAvrh5gPhlKcCjuxQey6o+1TX85LcIUEMSYZMqi4AsIEuJg8xK\n\tZwHpgoAUvxLpCIV4nEzxuBPxqDKVaK4hTo+/YRUrA8gHN/PPHN0Tv3FNIADSmcxBIiDF\n\tL0qKxwF07pHicWP8nmNnwD0+K6v6KIVH3EFHc+JqT0+cIGH7ue+kxFr6uIgCckv4igW+\n\tk13sR2CJVfxqlMw9gnt0ATyuCN+yMz2LuMfSt9XoHtujC229h9OjPCBXB86Z5u5sZwkb\n\tmKODFLkmeTw6u3vPCVwDeDwKeHyAeNSWrtrdLydIASCvEgfJA9IYVrH2xPsgRSxJcI89\n\te/cfaGw+guBxAYfHIhaPsMEce58VXq22WyeaeiOnRwrIWlJifXCDcZAsIIcjIEUsRTo0\n\tBo9GppZ2zu7T5gSuRjxqSj1q6IcTJAvICnCQV89npScTQM6gDhIBKW5ByuMxOT3r/FXE\n\toxrUov4mOT3KAHJ3/AYCSDdnOwSkuOVI91/tO8DIdLidsxuPR9ieHIqrtcK5R7xcVb+c\n\tOt4DJ0gJIEsAkJnpyZt5QBqggxSvJhk8GjDucQZxjwweS0orSHEV3WPHJaLRFjg9CgF5\n\t6fQRaUD2wUU6YlUk5x45PG6I3330dD7iUaMiUmVnnCClAXkAALl8PnWQZsYG/bDEKlI9\n\tSuNx/vLwzckHMsE9Ih5VqRFNtsXpkQPkGyixEkDGbQgJnO3l5kQdJAJSrHqEGzv68O4x\n\tZEPc7iOnLwEe36B71KSKVNgXFWRT0x8KyM/VFS9Liq6czwRArhMAshfOQYpRkRSP/QyM\n\tzcjc4wwOj1eKSl6ie1ShRDTalAwg3yEgxag8xWMi7pHBo5Ob1+xAAR7fYXFVoypSYWfy\n\tgLxz5VzmgSQOkFbEQSIgFStCq0cJHnsJ8LiOuMdzV+4QPH5mi6tN9OtVYbpgU2qOgACQ\n\tPxpqPzKAzD6SGhfFOEhbMgeJDlKrylPcuSweoyTukeDxB3/fI849qllDKm1eDpDFBJD7\n\tk2LAQfrAIh0rs8EISMWK0OpRCR6twD36zF++bnMS4lGlytBOY9KArKGAzMs+nLo9KiRg\n\tttcEJ9thpkb6CEitak9R5xI82jpNIO4xKi71SDYtrr6rQTxqR0sq6ZUF5G8osTbWf/5Q\n\t8VICyGXzfDzGjUZAKpKDto+xeBxsZjXaxYPgMSZpP3GPxS8rPqB7VIkwtNSIEJDfaoWA\n\tDA7w8ySAJBuY4yIdbStQun+KR30j02EUjwEhUdtTD2fnkblHwCNsMCd5JDm6Ry3pqt3d\n\tygCynAXkjpi1CEhpEYjnLwEex3n4zFvG47Ec8NgIK1d/N2Fxtd2S0OobZQH5+un9G9RB\n\trqeAdGQAqYfPYhWPHOmNHX30DYcQPHr6BQQjHrUqIdV2rgCQl89m7kdAikiA0kORxePa\n\tmB2se0Q8qlYb2mhNASAL805BiRUBKS0D0fwF7lGPwaMjxeN6xj3ef/oa3aM2FKTiPmUB\n\t+aL4NgByHwAyiCmxDsU5SNFoEQaiEI9nL98pfoF4VLE0tNKcFCC/1lSCgwRAHiKAXOzn\n\tOR4dpJjESPSoAI+n8gopHr9icVUrGlJppwoBmUEB6e8zCeYgEZAikiSHx6FWo0lxNQjc\n\t476Ms5dvIx5VKgotNqYIkLkAyFgA5Kyp4x1t6BwklljFIUoJHm0cx3v6LQ5eH5t66FQu\n\twWNlDeJRizJSXdcSQP6ii3TKXzwCB5mxLzEmLAgAOXYUAlIcUiSjEOJxko9/UBjiUXVC\n\tEElLSgEZiYAUjxKZkQjxOHUW4lEkElLtMKQA+ek9AWRBjjwge3QXW3Z2ufHweBw1lsFj\n\tInWPj9ji6i9cmqNaaWilNXlA3isEB7krlgOkBVnFig5S+/Ln8GgB7pHgMTJ2F7pHrWhG\n\trZ3ygPzZWM8B8nha4qawpf7TeQeJgNS2Irv3II8FGDzUSoLHtIycgtuAx/ef6ht/Ih7V\n\tKhONNc4B8t9/fv349rW68vWTe9dzTx7ctS1y1SIosTrYsIDs3k3bCdm1+1eAx4Mncwvv\n\tPcHiqsa0opGOGED++f3vr5+NdRSQtwpyCCBDOUAOIg8KQEBq998DIR6n+y8N25SYdjyn\n\t4JYAj+yOVhpJGuxEbRGQBeQrAORFAsgIDpAmhvq99XD7Oa3qsVt3unLVxMLGAdzjolWR\n\t23YdPHnxOsFjNZl7xA3m1CYQTTfMARI2MKeAfP6IAjKBAnIimYMcZNAXAalVOf7F4HEQ\n\tdY+Ax9BNCQwen4N7rKPuEfGoaeGoqT8lgEwhgJw51RUcpIlhfwSkVvUIkx16vfUNCR5d\n\tp85ctCqCw+MrxKOaZKG9ZuUA+fBWPjhIFpBjRlmZIiC1qsa/KB77GlA8TlSER8ljOrSX\n\tRdizqiIgA8i3rINkADnF1cHawgQ2MEcHqT1NUjz2H2hiYe3gOoXiMYVxj4hHVYlATO0o\n\tBOSxvQnRoUv8vSeOGWmJgNSeFknPxD0CHk0tR46heIxO2Hs8J//WQ849Ih7FJKcOj0UA\n\tyO8wBwmAvHv94on0lK0RKxfOREBqV4vQuwweV0ZsS0k/QYqrr95icbXD2S/CBpQAMj56\n\tzZK5QkDimgCtaFOIR++5S0IBj8cQjyLUkaqGJARk/RcA5OO71y7wgLS3NkcHqRUl0k55\n\tPNqDe1y4MmIrweO1u48JHuu/49yjqmQgnnakAVlV9vzhzfycY3sZQLpzDhIf/agVUcJS\n\tOYl7BDyuiY4neLyJ7lE8+lH1SJQAcufW8JULfSe7IiC1IkSmUw6P5taAR9+FK8O37kw/\n\tcYHB4xfEo6qlII72BIBsqPtYVfaMBeRG4iAZQA7oi5sHaEOWAjy6S+GxrOpTXcNPfosA\n\tcWQSjkIVEZAFZClxkFnpLCBdEJDaUCLtU4jHyYhHVSS7DrTB6fE3rGJlAPngZv6Zo3vi\n\tN64JBEA6kzlIBKQ2REnxOIDOPVI8bozfc+wMuMdnZVUfpfCIO+jogM5aPUROkLD93HdS\n\tYi19XEQBuSV8xQJf2J91BJZYtaFGydwjuEcXwOOK8C0707OIeyx9W43usdXprXMncnqU\n\tB+TqwDnT3J3tLGEDc3SQGtckj0dnd+85gasBj0cBjw8QjzonsbYNmBOkAJBXiYPkAWkM\n\tq1h74n2QGpUkuMeevfsPNDYfQfC4gMNjEYtH2GCOvc8Kr1bblu6iP5vTIwVkLSmxPrjB\n\tOEgWkMMRkBqVIu2MwaORqaWds/s0xKPoVaTCAXKCZAFZAQ7y6vms9GQCyBnUQRobICA1\n\tK0mFeDx/FfGowrwXa1OcHmUAuTt+AwGkm7MdAlKzYoTeODwOt3N24/EI25NDcbVWOPeI\n\tl6tilVX7x8UJUgLIEgBkZnryZgSkxoXIdMjg0YBxjzOIe0xOzwI8lpRWkOIqusf2J7sO\n\tvJPToxCQl04fkQZkH1ykozlxyuJxQ/zuo6fzEY86ICZVDJETpDQgDwAgl8+nDtLM2KAf\n\tllg1pkdpPM5fEb45+UAm4lEVqa4TbXB65AD5BkqsBJBxG0ICZ3u5OVEHiYDUnB7hxo4+\n\tA4xMOfe4IW73kdOXAI9v0D3qhKA6OkgqyKamPxSQn6srXpYUXTmfCYBcJwBkL5yD1Iwi\n\tKR77GRibkbnHGfOXS/D4Et1jRzNdN94vAOSPhtqP7xCQmlGe4l6Ie2Tw6OTmNTswhMfj\n\tOyyu6oagOjpKeUDeuXIu80ASB0gr4iARkIr1o+KjBI+wg44Ej+uIezx35U4J4PEzW1xt\n\tol9YR791fL9YI6AQkNlHUuOiGAdpS+Yg0UGqWHmKm5PFY5TEPRI8/uDve8S5R7HKqePj\n\tkgNkMQHk/qQYcJA+Hi72VmaDEZCK9aPioxI8WoF79Jm/fN3mJMRjxxNcx1qQBmQNdZB5\n\t2YdTt0eFBMz2muBkO8zUSB8BqWLtKWpOgkdbpwnEPUbFpR7JpsXVdzWIRx2TVfuHywLy\n\tN5RYG+s/f6h4KQHksnk+HuNGIyAViUf1x1g8DjazGu3iQfAYk7SfuMfilxUf0D22P791\n\t7Z1CQH6rFQIyOMDPkwCSbGCOi3RUr0DpFike9Y1Mh1E8BoREbU89nJ1H5h4Bj7DBnOSR\n\t5OgedU1ibRuvDCDLJYBci4CUlow6/xLgcZyHz7xlPB7LAY+NsHL1dxMWV9uW2bp5tiwg\n\tXz+9f4M6yPUUkI4MIPXwWazqlCO9saOPvuEQgkdPv4BgxKNuqkkFo1YAyMtnM/fviEFA\n\tqlWCwsZl8bg2ZgfrHhGPKkhxnWpCASAL805BiRUBKZSMWn8H96jH4NGR4nE94x7vP32N\n\t7lGnxKSKwcoC8kXxbQDkPgBkEFNiHYpzkGpVI3moHFmaQ4qr1D1SPJ69fKf4BeJRFRmu\n\tW21IAfJrTSU4yMLcU4dSY9cHL/bzHI8OUr1ihNYV4fFUXiHF41csruqWnDo+WoWAzKCA\n\t9PeZBHOQCEi1SpLD41AGj0GAx30ZZy/fRjx2PLd1sYXmADlr6nhHGzoHiSVWdYlSgkcb\n\tx/GefouD18emHjqVS/BYWYN41EVFdXDMEkD+oot0yl88AgeZsS8xJiwIADl2FAJSXVIk\n\t7QrxOMnHPygM8djBfNb1tysB5K7YyODFCEh1apHqkSuuAh6nzkI86rqaVDB+KUB+ek8A\n\tWZCTkSYLyB7d1Z2bXbB9Ho+jxjJ4TKTu8RFbXP2FS3NUkOG61YQ8IO8V5p48yAPSgqxi\n\tRQepjn8uOPdoweIxMnYXukfdko/qR8sD8mdjPQfI42mJm8KW+k/nHSQCUvWK7N6Dzj0O\n\ttZLgMS0jp+A24PH9p/rGn4hH1We7+FvkAPnvP79+fPtaXfn6yb3rBJDbIlctAgfpYMMC\n\tsns31Sdk125RAR4PnswtvPcEi6vil436RsgA8s/vf3/9bKwDQD5/dKsghwAylAPkIPKg\n\tAASkqv/1EOJxuv/SsE2JacdzCm4J8MjuaKW+7x5bFl8EZAH5CgB5UQqQJob6vfVw+zkV\n\t67Fbd7py1cTCxgGKq4tWRW7bdfDkxesEj9Vk7hE3mBOfVjQyIg6QsIG5EJAJFJATyRzk\n\tIIO+CEgVy/EvBo+DqHsEPIZuSmDw+BzcYx11j4hHjeS/2DpRAsiUbRGrFs2c6goO0sSw\n\tPwJSxXqEyQ693vqGBI+uBI8RHB5fIR7FphANj0cOkA9v5YODZAE5ZpSVKQJSxWr8i+Kx\n\trwHF40RFeJQ8pkPDyYDdaT0CMoB8yzpIBpBTXB2sLUxgA3N0kKrUJMVj/4EmFtYOrlNm\n\tEjymMO4R8ah1PWh9AAoBeWxvQnToEn/viWNGWiIgValF0hZxj4BHU8uRYygeoxP2Hs/J\n\tv/WQc4+IR62rQnsDEADyO8xBAiDvXr94Ij1la8TKhTMRkKrWIrSnAI/pJ0hx9dVbLK5q\n\tTwhi6VkJIOOj1yyZKwQkrglQkTaFePT2XxIKeDyGeBSLHLQ+DiEg678AIB/fvXaBADKc\n\tAtLe2hwdpIqUSJvh8WgP7nHhyoitKQSPdxk8fse5R60rQssDEACyoe5TVdnzhzfzc47t\n\tZQDpzjlIfPSjikQJS+Uk7tF77pI10fGIRy0rQFzdKwHkTgJI3ymuCEgVCZFphsOjuTXg\n\t0XfhynCCxwvX7j4G9/ilHvEoLm1oZTRSgPxYVfaMBeRG4iAZQA7oi5sHqEaWAjy683i8\n\t+fB5WdWnuoaf/BYBWkkF7FQEEZAFZClxkFnpDCAnuyAgVaNE2ooQj5MpHnciHkWgATEN\n\tgdPjb1jF2lBHAPngZv6Zo3viN64JBEA6kzlIBKRqREnxOIDOPVI8bozfc+xM/s2Hz8qq\n\tPkrhEXfQEZNENDsWTpBwH+R3UmLlALklfMUCXwDkCCyxqkaNkrlHcI8ugMcV4Vt2pmcR\n\t91iK7lGzOS/m3jg9ygNydeCcae7OdpawgTk6SBVoksejs7v3nMA1gMejgMcHiEcx60Pj\n\tY+MECfuzsoAsukocJA9IY1jF2hPvg+ygJME99uzdf6Cx+QiCxwUcHotYPMIGc+x9Vni1\n\tqnENiKlDTo8UkLXUQd5gHCQLyOEIyA5Kkb6dwaORqaWds/u0OYGrEY9iUoGIxsIJkgVk\n\tRenjoqvns9KTCSBnUAeJgOy4IOXxmAzu8SriUURKEMdQOD3KAHJ3/AYCSDdnOwRkx+VI\n\t91/tO8DIdLidsxuPR9ieHIqrtcK5R7xcFYcstDcKTpASQJYAIDPTkzfzgDRAB9kxTTJ4\n\tNGDc4wziHgGP568WlZRWkKU56B61l/6i65nToxCQl04fkQZkH1yk0xFFcu6Rw+OG+N1H\n\tT+cjHkUnBjEMiBOkNCAPACCXz6cO0szYoB+WWDugR2k8zl8Rvjn5QCbiUQzJL8IxcHrk\n\tAPnm2YMbBJBxG0ICZ3u5OVEHiYDsiB7hxo4+Ave4IW73kdOXAI9v0D2KUBDaHhIVZFPT\n\tHwrIz9UVL0uKrpzPBECuEwCyF85BtleRFI/9DIzNyNzjjPnLJXh8ie5R27kvxv5lAPkO\n\tAdle5Sl+H3GPDB6d3LxmB4bweHyHxVUxCkLbY5IH5J0r5zIPJHGAtCIOEgGpWG0tHiV4\n\t7CXA4zriHs9duVMCePzMFleb6Feg7TzA/sURAQEgfzTUfmQAmX0kNS6KcZC2ZA4SHWSL\n\tylN8giweoyTukeDxB3/fI849ikMO2h+FHCCLCSD3J8WAg/TxcLG3MhuMgFSsthaPSvBo\n\tBe7RZ/7ydZuTEI/aT3lRj0AakDUUkHnZh1O3R4UEzPaa4GQ7zNRIHwHZovYUnSDBo63T\n\tBOIeo+JSj2TT4uq7GsSjqGWhvcGxgPwNJdbG+s8fKl5KALlsno/HuNEISEVSa80xFo+D\n\tzaxGu3gQPMYk7SfusfhlxQd0j9rLeHH3LATkt1ohIIMD/DwJIMkG5rhIpzUKlD6H4lHf\n\tyHQYxWNASNT21MPZeWTuEfAIG8xJHkmO7lHcEtHs6GQAWS4B5FoEpLTA2vaXAI/jPHzm\n\tLePxWA54bISVq7+bsLiq2VzXhd5kAfn66f0b1EGup4B0ZACph89ibZsc6Y0dffQNhxA8\n\tevoFBCMedUENIhijAkBePpu5f0cMArKNEhSeLovHtTE7WPeIeBRB0ot4CAoAWZh3Ckqs\n\tCEihwNr4O7hHPQaPjhSP6xn3eP/pa3SPIhaDGIYmC8gXxbcBkPsAkEFMiXUozkG2UY3k\n\toXJkaQ4prlL3SPF49vKd4heIRzHkvJjHIAXIrzWV4CALc08dIoBc7Oc5Hh1kW8UI50vj\n\tcXEwweOpvEKKx69YXBWzHLQ/NoWAzKCA9PeZBHOQCMg2SpLD41AGj0GAx30ZZy/fRjxq\n\tP9vFPwJlgIwFQM6aOt7Rhs5BYom19aKU4NHGcbynH+AxNvXQqVyCx8oaxKP4FaHlEUoA\n\t+Ysu0il/8QgcZMa+xJiwIADk2FEIyNZLkZwpxOMkH/+gMMSjljNct7pXAshdsZEIyLYp\n\tkTlbiMepsxCPuqUGEYxWCpCf3hNAFuRkpMkCskf39mRnl3sPj8dRYxk8JlL3+Igtrv7C\n\tpTkiyHkxD0EekPegxHqQB6QFWcWKDrJ1/7RweLQA90jwGBm7C92jmNNffGPjAfmzsZ4D\n\t5PG0xE1hS/2n8w4SAdkaRXbvQeceh1pJ8JiWkVNwG/D4/lN940/Eo/jyX2wj4gAJ28/9\n\t+Pa1uvL1k3vXc08e3LUtctUiKLE62LCA7N6tNQnZtc9RgMeDJ3ML7z3B4qrY0l6842EA\n\t+ef3v79+NtZRQN4qyCGADOUAOYg8KAAB2fK/NUI8TvdfGrYpMe14TsEtAR7ZHa3Emw04\n\tMm1HQBaQrwCQ/7+9c3+oaev6+ME5HLdEKqko5VYpROVSoVCEKNcuRBclhVRUlFshVC7J\n\traTcKUohSipKN1QKx3OO4/1H3jHnWmvvtXflnEN7t9daY/3wPJ7zPNaec6wxns/8jjnm\n\tHFcIIIM5QOqP0Bo4ANvP/WM89ulLK1f1jc0tQT2u9A3Ztf/omSs3CR4byN4jNpjrbV8X\n\txO9zgIQG5hSQzx5RQMZSQDqQPciR2oMRkP8Yjr8weBxJ1SPgMWB7LIPHZ6AeW6l6RDwK\n\tIiJ6d5DdAHIfAeQiR1tQkPojhiIg/zEeYbNjwECtEQSPto6LVvoGc3h8gXjsXQ8X2K93\n\tAmTx3VxQkCwgbSaZGiAg/zEaf6F4HKxN8ejQFR5l13QIzD1wuGq2gBIgX7EKkgHkXFtL\n\tM2N9aGCOCvL7MUnxOHS4vrGZpe1cisd9jHpEPKrZnwX/c10C8uTB2PCA1R7zHWwmmiAg\n\tvx+L5L8l6hHwaGAy0YbiMTz24Kms3LvFnHpEPAo+TtQ1AR4gP8IeJACy8OaV0yn7dgb7\n\teC5CQP5zLML/ogs8ppwmydUXrzC5qi5HFsvvdAPImPBNq5fyAYk1Ad3GJh+P8z1WBwAe\n\tTyIexRIgap4HH5Bt7wCQjwtvXJYD0sLMCBVkt5FI/ws5Hi1APXr6BO/cB3i8UUjx2PYR\n\t9x7V7NEC/zlFQNZVPSu+k5t18qASIPHqx26DEkrlZOpx/tLVm8JjCB7voHoUeGD00vC7\n\tAWTCziAfz4VzbRGQ3QYi819weDQyAzwu9PQJIni8fKPwMajHd4jHXvJqAf8sD5DtrU11\n\tVWUsILcRBWlPU6zDBmPzgO7CkodHewU8VtU1t7Z/lrcIELCL4NDVaAFlQFYQBZmRwgBy\n\tznQEZHeRSP85H49zKB4TEI9q9F7x/RQXj1+hipUBZNGd3PMnDsRs2+QNgLQme5AIyO6C\n\tkuJxGN17pHjcFnPg5HlQj2VVdU0KeMQOOuILHdXMiAtIOAf5kaRYKx4XUEDuCNqwYiEA\n\tchymWLuLRtneI6jH6YDHDUE7ElIyiHqsQPWoGm8V/1u5eOwMyI3eS+bZW08wgQbmqCC7\n\tjEk5Hq3t5y/x3gh4PAF4LEI8ij9uVDZDLiChPysHyOtEQcoBqQdVrP3xHGSnkAT12H/g\n\t0OF6RuMIHldweCxg8QgN5thzVrhaVZn3iu/FXDxSQLaQFGvRbUZBsoAci4DsFIr0HzB4\n\t1DEwmWBtPw/xKL7Q6J0ZcQHJArIGFOT1Sxkp8QSQrlRBIiC7Csgu8XjpOuKxd9xYNL/K\n\txaMSIJNiwggg7awnICC7Ckfaf3XwMB2DsROs7eR4hPbkkFxt4e894nJVNLGilolwASkD\n\tZCkAMj0lPlIOSG1UkMoxyeBRm1GPrkQ9xqdkAB5LK2pIaQ6qR7X4rhh/hItHPiCvZqYq\n\tAnIQFukoRiSnHjk8hsUkncjMRTyKMULUPCcuIBUBmQyAXL+cKkhDPQSkYjTSDjoDh3J4\n\tXL4hKDI+OR3xqGbPFefPcfHIAfIlpFgJIKPD/L3dne2mUAWJgFSISILHQTz1GBadlJp5\n\tFfEozghR86xoQH779jcF5NuGmvLSgvxL6QDIQDkg4W5k3IOUhSRVj0O09QzJ3qPr8vUy\n\tPJajelSz84rw55QAWYuAlAVeN3+Q43GKnbO7t78Mjy9rMbkqwghR85Q6A/J+/sX05DgO\n\tkKagIBGQ8tgkePydh8dAoh4v5t8vBTy+ZZOr36hR1fwh8edEYQEeID+1tzQxgDyXmhgd\n\tyijI8WQPEhWkLCCV8RjKqUeKx0/yc4+49yiK+FD7JDoBsoQA8khcBChIFyjSMTXURUDK\n\tw5HDoymoR5fl6wMj4xCPavdZMf+gIiAbKSBzzh0ngPRyd545ZfwYBKQsHGlpDk2ujp8y\n\tk6jH0OjE1HMkufqytrGlHfEo5khR09xYQH6FFGtH29v6mnIZINctc5k9bTICkheODB51\n\tDQGPswkeI+KOEPVYUl5Tj+pRTQ4r8p/hA/JDixyQu0P9vNycCCBH6WihgqRBSdWjlo7B\n\tGIpHL//Q3YnHz+UgHkUeIuqdnhIgq2WA3IKAlKOR/IlNrgIeJ0+b7bJsnRyP1YDHDqhc\n\t/foNk6vq9V7x/ZoyICvLHt4mCnL3VhkgR2gNGoB3sTLqUWvEKIJHJzcvPwU8Qv9VWccO\n\tTK6KL0zUN6MuAJl3If3I3ggEpAIflfG4JWIvqx4Rj+rzVvH/UidAPn14K+esDJBWoCAR\n\tkGS52o+2Jwc8WlE8bmXU48OnlZBcRTyKP1DUNUNlQD4vuQeAPAyAXMukWEfjHmRn9Ujx\n\teCEPkquIR3V5qjR+RwGQ7xtrKykgjxEFucrNaQYCki5bu8Lj2ZxbFI/vEY/SCBX1zLJL\n\tQKZRQHq4zII9SASkLLk6mkmurgU8Hk67kHev5DniUT1eKp1fUQLkawLI7LPHEqMAkIsB\n\tkOaoIOXq0dxqhpPbKr+tUYnHzmYTPL5uRDxKJ1bUMtNOgHwECjLt8J6IzWsBkFMnISC5\n\t5CrB4ywXj7WbEY9q8Uxp/ki3gAwBQDoiIHnJVcCj42LEozTjRG2zlgHyC1SxNtdXP390\n\t71pWZ0D266uwIyed/yDH46SpDB73UPX4iFWPX7A0R22+KoUf6gzIB0RB7o/iAGks7T1I\n\tWXKVxWNI1H5Uj1IIjN6aoxyQnwGQbxhAnjq0Z/vmNR4L5ApSqoDs249cC6A72lSGx0Np\n\tWdfuAR7fNLd1fEY89pbfivV3OUBC+7lPH943vK588uBm9pmjAEhfoiAtzVlA9u0jnUWq\n\tfKYcHo3leDx6JvvWgyeYXBVrQPT2vBhA/v31ry+fO1opIO9eyyKADOAAOZJcFCBNQPLx\n\tuMBjzebtew6dUsQj29Gqt78i/r5YLKAMyBcAyCsAyF0hvisZQOqP0Bo4QJJXP/bpSytX\n\t9Y3NLSG5utI3ZNd+wONNgscGsveIDebEEgUaNA8OkNDAnALy2SMKyFg+IAdLE5AMHkdS\n\t9Qh4DGDwePfRM1CPrVQ9Ih41yJPFMZRuALlvV7DvykWOtqAgpQpI2OwYMFBrBMGjLcFj\n\tMMHjFcDjC8SjOHxfI2fRCZDFPEA62EwyNRipLUlAEjwO1qZ4dKB4jCXqUY5H2Tlkjfys\n\tOCiBWkAJkK9YBckAcq6tpZmxPjQwl56CpHgcCng0s7Sdu4jgcR/iUaA+LqhhdwHI3KyT\n\tB2PDA1Z7zHewmWgiTUCyeDQwmWjD4vHgqazcu8WcekQ8CsrLhTNYHiA/wh4kALLw5pXT\n\tKft2Bvt4LpIsIBk8DufjMeU0VY+vMLkqHOcW4ki7BeSm1Uv5gJRUTQAfj/M9VgeExx48\n\tiXgUonsLbsx8QLa9A0A+LrxxWQ5ICykqSDkeLUA9evoE79xH8Fj45AXB40fcexSclwto\n\twIqArKt6VnyHKMiYcAVASurqxz5McpWqx/lLV28Kj0E8CsijhT3UbgCZsDPIx3PhXFsL\n\tMyOppVg5PBqZAR4XevoEETxevlH4GPD4rg3xKGx/1/jR8wDZ3tpUV1XGAnIbAaQ9TbEO\n\tG/y7hAAJleRk75Hg0V6OxzvFz6rqmlvbP8vvQNb4T4sDFKAFlAFZwShIBpDQfk5qgOTj\n\tcQ7FYwLiUYB+LdQhc/H4FapYGUAW3ck9f+JAjEQBSfE4TI7HbTEHILl6p7isqq5JAY/Y\n\tIkCoLq/Z4+YCEs5BfiQpVgrIjJSEHUEbViyUHCB5eJwOeNwQtDMhJYOoxwpUj5rtx2IZ\n\tHRePnQG50XvJPHtrUqQjHQUpx6O1/fwl3psAjyfO594pQjyKxd81fh5cQEJ/VhaQBdcv\n\t8wA5zkgPqlj7S+IcJOCx/8Chw/WMxkF78oUrNgTtoHgsYPEIDebYc1a4WtV4vxbqALl4\n\tpIBsISnWotuMgmQAOcEEGphLJMXK4FHHwGSCtf28Jd4bEY9C9WoBj5sLSBaQNRWPC65f\n\tykiJ5xSkdADZNR6vIx4F7N3CGzoXj50AGUYAaWc9YaxUAMnhcewEazs5HqE9OSRXW/h7\n\tj7hcFZ6bC2fEXEDKAFkKgExnAOkKKVYApLYUFCSDR21GPboS9RifknGJ4LGGlOagehSO\n\tSwt6pFw8KgAyMzUphg/IQeIv0lHGY1hM0onMXMSjoJ1biIPnAlIRkMnxkUHrl1NAGkoB\n\tkJ3wGBmfnA54LEU8CtGpBTxmLh45QL6EFOtVAGR0mL/3EmdWQYoekASPg4bpGHDqEfCY\n\tmnkV8Shgxxbq0GlAfvv2NwfI8tKC/EvpioAcIvI9SIrHIdp6hmTv0XX5+iDEo1DdWfDj\n\tVgJkLR+Q7s52U2iKVeSAlONxip2zu7d/WDSLx5eYXBW8gwttAgqAfNtQU156P/9ienJc\n\tZCCjIE1BQULzABEX6RA8QgcdGR4DCR4v5heUltc0vGWTq9+omYT2bXG8wrMAD5Cf2lua\n\tOEAmRof6exNAjid7kKIGZPd4rIW9x0/yc4+49yg89xbeiDsBsoQBZAQA0gX2IMUOSBke\n\tTUE9uixfHxgZR/B4H/EoPF8Ww4gVAdnIAPLccQJIL3fnmVPGjxE3IGV4HD9lJlGPodGJ\n\tqedIcvUl4lEM/i24ObCA/EpTrG/ra8opII/ERQSuW+Yye9pkU0NdEStIFo+6hoDH2QSP\n\tEXFHCB5LymvqUT0KzplFMGA+ID+0MIDMAUDuDvVjATlKR0u0CpLiUUvHYAzFo5d/6O7E\n\t4+dyKB4bUT2KwL2FNwUeIDva3tZXywC5RfyAlONx8rTZLsvWKeKxAypXv37D5KrwfFrI\n\tI+4MyIe3KSC3+nm5OREFOWqEWAHJ4HHEKIJHJzcvPwU8Qv9VWccOTK4K2cWFNfYuAJl3\n\tMf3I3gjRA1IZj1si9rLqsRrUI+JRWH4sltEqA7LyqQIgrRhADhDhXayAxwGDtAgerSge\n\ttzLq8eHTytrGFsSjWBxcaPNQBuTzknt5F/iAHC3OFGuXeLyQB8lVxKPQfFhM41UA5PvG\n\tWgDkrZyzkGLd6rcKFKRoAdkVHs/m3EI8ism5hTiXLgGZdhgU5FoPugcpSkByeBxtSpOr\n\ta0E9Hk6/kHev5DniUYheLJ4xKwHyNQFk9tljiVEAyMVOM6zMaYpVbAqSh8cZTm6r/LZG\n\tJR47m03w+LrxPapH8bi38GbSCZCPQEESQG4GQM6aNslUhIDk43GWi8fazYDHNMSj8JxX\n\thCPuFpAhAEhHcQJShkdzqxmOixGPInRr4U5JBsgvf3S0NddXPwdAZqUd3sMAcqockL+I\n\t5ZHjcdJUBo97KB4fserxC5bmCNedBT/ybgC5P4oDpDEp0hGTglTGY0jUflSPgvdj0UxA\n\tDsjPAMg3BJDXstIO7dkOCnLBLBkg+/UVCx/7QnvyIdq6o01leDyUlnXtHuDxTTOU5iAe\n\tRePagpyIDJD/+/Lpw/vG15VPHtzMPnO0EyD79hFHQHJ4NGbVI+Dx6JnsWw8wuSpI9xXf\n\toBlA/v31ry+fO1opIO9eyzpFALmGBeRIcg5SLIDk43GBx5rN2/ccOiXH42fEo/g8XFgz\n\t4gAJ/VkBkA0UkFcAkLtCfFdCitXS3FifKEiR3GzVpy9TuWpsbgnJ1ZW+IbsIHm8+eFL5\n\tuoHsPWKDOWF5rwhHywESGphTQD57RAEZuz1AhIBk8DiSqkfAYwCDx7tUPbZ2EDyyDR9F\n\t+KFxSoKwgDIgX4CCBEDu2xXsu3KRoy0DyIHiACRsdgwYqDVCXwGPVwCPLxCPgnBWKQyy\n\tEyCLeYB0sJlkajBSe7A4FCTB42BtikcHisdYoh7vPnoGyVWCR9k5ZCl8d5yjZlrgu4Cc\n\ta2tpZqwPDczFAEiKx6EUj7aOi1b6Bu/ad/QM4lEz3VK6o+oCkLlZJw/GhoOCnO9gM9FE\n\tLIBk8WhgOslGjsfcu8WIR+k6vwbOXAmQr6iCPJ2yb2ewz8pFIgIkg8fh+sZmlrZzFfD4\n\tCpOrGuiXkh1S94BcvZQPSIHXBHB4NJlo4zDfY3VAeOzBk1mIR8m6vcZOnAfIj23vG169\n\teFx44woDSE8ApIU4FKQiHj19gnfuSzl95WbhkxcEjx9x71Fj/VNyA1MEZF31s+I7REHG\n\thG/iA1LgN1v1YZKrBhSPS1dvCo9BPErO04UxYQVAvmMAefl0SsLOIB/PhQSQRsJPsXJ4\n\tNDKzAPXI4vHyjcLHgMd3bYhHYXiqREbJA2R7a1NdVRkfkPZcilXQgIRKcrL3qITHO8XP\n\tqupw71Eibi6YaSoDsgIUpAyQ0H5O+IBUwONCT5+gnQkppxGPgvFQaQ2Ui8evUMUqA+T5\n\tEwdithEFyQBy2ODfBQxIisdhFI/280E9bqPq8U5xWVVdU2s7luZIy981frZcQMIxj49t\n\toCApIDNSEnYEbfBcKAJA8vA4fQ6LxwyCxwpUjxrvnBIcIBePckAW3cmlgNzovWSevTUp\n\t0hEyIOV4tAY8egMeD5w4n3unqBMesYOOBL1fA6fMBSTtz0oBWXD9MgPIFQSQ44z0oIq1\n\tv0DPQcrwOA7aky9csSFoR0IK4lED3RCHxFqAi0ceIG/zATnBBBqYC1ZByvA4wdp+3hLv\n\tjYhHdHwNtwAXkHxAXspIiQcFKXhAAh77Dxw6XM9IAY/XC1j1CP1X2WPIuFrVcC+VzvC4\n\teKSAbCF7kEU8QNpZTxgrXEAyeNQxGKuAR2hPDsnVFn5yFeNROg6v6TPlApIFZE1FacF1\n\tDpCujILUFqaCVMCjK1GP8SkZlwgea0hpDuJR011TkuPj4lEBkJknkmLCSIpVyIDk4dGO\n\tqMewmCRIriIeJenmwpk0F5AKgExPjo8MWr9cyIBk8KjNqEcWj+mAx1LEo3CcU4Ij5eKR\n\tA+RLUJBXM1OTosP85YAcJLwinS7wmJqJeJSghwtsylxAcoAsLy3Iv8QHpKGe9hDB7UFy\n\teDQkyVXX5euDIuOTEY8Cc01JDpeLRxaQtXxAujvbTaEpVsEBkuBx0DCaXLVzdvf2D4tO\n\tSs28CurxJSZXJenmwpk0Dchv3/6mgHzbUFNeej//YnpyXGQgqyAJIH8XVpEOxeMQbT1F\n\tPOYXlJbXNLxlk6vf6MSF851wpNKwAA+Qn9pbmuSADPX3JoAcT/YgBQZIOR6nKOGxFvce\n\tpeHWwp1ld4CMAEC6wB6kqeAASfAIDeb0DE0Z9RgYGZecfjH/PuJRuF4qnZErArKRAeS5\n\t1MRoCsiZAgSkDI/jGTyGRiey6pHg8ZP8SnIszZGOmwtnpoqArK8pLyEK8kgcBeRsAkhd\n\tQSlIBTy6LF8fGMHgsQTVo3CcUsIj7QqQOeeOJ+4O9fdydwZAjjHQ0RKQguThcaazu5c/\n\t4PH4OZpcrW1EPErY0YUydRaQXyHF2tH2tr5aDsh1y1xmT5ssLECyeNQ1NJ08bbbLsnWA\n\txyNEPQIe65nk6tdvmFwVim9KcZx8QH5oYRQkA0g/LzcnAshR0J9VKEU6FI9aOqPGjJ9C\n\t8OgXuhvwmEP2HgGP0H9V1tAK1aMUnV0Ic+4GkHsjtggPkMp43CLDYzXgsQMOdiAeheCT\n\tUh6jMiArnz68TQG5lQLSigHkAEFcNcfgcQTFo5Obl99WBo8PyyoRj1L2cUHNXRmQz0vu\n\t511IPyJAQHbG415Qj3mgHhGPgnJJSQ9WAZDvG2sBkLdyzkKKVXCABDwOGKRF8Gg1k4/H\n\tp4hHSXu4wCbfGZD38i6kHQZArmVSrKOFsQfZBR4Pp1/Iu1fyHPEoMJeU9HCVAPmaADL7\n\t7LHEqK1+q9ycZliZ0xSr5itIRTyuIurx2NmcWw8JHt9jclXSPi6oyXcLyM1rPVxmwR6k\n\tIADJ4XE03Xv0WLslYu/hNMSjoDwRB0ss8D1ALnYUCiBleDS3muHkBniMAjxmEzy+Rjyi\n\towvJAjJAfmGKdJ4/ogpyTwQF5NRJQgAkH4+zXDzWbmbx+AjVo5BcEccKFugGkPujQvxW\n\tCQWQfDw6Ll7lF4J4RN8WqgXkgPzc0db8phoAeS0r7ZAyIPv1/UVjH+bco+5o00lTGTzu\n\tOZyWde0ewWMzlOZ8wdIcoTqnBMfdCZBPHtzKPnNUDkhjUsWqySlWDo/GoB4ZPO5H9ShB\n\tTxbJlBlA/v31ry88QJ46tGf75jUeC2bJFKTmArJvP3ItgByP2/ccYvH4BvD4GfEoEkeV\n\tyDQ4QEJ/1k8f3je8rnzy4CYB5K4Q35WgIC3NWUD27aOZC9Y+fZnSHBaPviFR+4+eyb75\n\t4AmbXMUOOhJxZLFMkw/IVlCQzx7dvZZFABnAAXIkuShAUwHJx+MCjzWbAY+nsq7dBfXI\n\t4ZHtaCWW74XzELcFlAH5AgB5hQAymADSFgCpP0Jr4AAN7c8Kmx2kclXf2NwS1ONK35Bd\n\tgMcrFI8NpDQH8Shu7xXh7DhA/gkKkgfIWApIB6IgR2oP1lRAMngcSZOrgMeA7bEMHp8B\n\tHltBPcrOIYvww+GURGmBbgC5jwBy0VwGkEM1FJAEjwMZPNo6LlrpG8zh8cVrxKMovVUC\n\tk+oEyOK7uVmnDrKAtJlkYqCxgCR4HKxN8eiAeJSAr0phikqAfMUoyBQZIM2M9YdrJiAp\n\tHocO1zc2s7SdS/G4j1GPiEcpOK5Y59glIE8ejA0PWO0x38FmosYCksWjgclEG4rH8NiD\n\tp7Jy7xajehSrq0piXjxAfoQ9SABk4c0rp1P27Qz28SQKUlMB2QUeU06T5OqLV6geJeG5\n\tIp1kN4CMCd+0eikfkBpWE8DH4/ylqwMAjycRjyL1USlNiw/ItncAyMeFNy7LAWlhZqSJ\n\tClKORwtQj54+wTv3AR5vFD4meGz7iHuPUnJhcc2VB8j21ua6qmfFd3KzTh5kAGnPKUgN\n\tu/oRKslJcpWqR8DjpvAYgsc7qB7F5ZtSnE03gEzYGeTjuXCOrUYCksOjkRngcaGnTxDB\n\t42UGj+8Qj1J0Y9HMmYtH2sC8tamuqowF5DaiIBlADhusWc0DeHi0V8BjVV1zazuW5ojG\n\tOaU4ES4g4ZjHR6IgK4iCzEhhATldAwHJx+MciscExKMUXVeUc+biUQ7Ioju5508ciNm2\n\tyRsAaU32IDULkBSPw6h6pHjcFnPg5HlQj2VVdU0KeMQOOqL0WJFPigtIaD/HArKAAnJH\n\t0IYVC6GB+TgNS7Hy8Dgd8LghaEdCSgZRjxWvGlA9itxZJTA9Lh47A3Kj95J59tYTNAyQ\n\tcjxa289f4r0R8HgC8FiEeJSAs0philxA8gB5nShIOSD1oIq1v4acgwQ89h84dLie0TgL\n\twOMKDo8FLB6hwRx7DBlXq1JwXhHOkYtHCsgWkmItus0oSBaQYw10NEdBMnjUMTCZYG0/\n\tD/EoQn+U/JS4gGQBWVPxuOD6pYyUeAJIV6ogNQeQXeLx0nXEo+S9WDwG4OJRCZBJMWEE\n\tkHbWEzQIkBwex06wtpPjEdqTQ3K1hb/3iMtV8Tio1GbCBaQMkKUAyPSU+Eg5ILU1Q0Ey\n\teNRm1KMrUY/xKRmAx9KKGpJcRfUoNdcV5Xy5eFQAZGaqBgJSGY9hMUknMnMRj6J0S+lO\n\tigtIRUAmAyDXL6cK0lBPIwDZCY+R8cnpiEfpOq5IZ87FIwfIl5BivQqAjA7z93Z3ZhXk\n\toN6vYiV4HDRMx4BTj4DH1MyriEeRuqV0p0UD8tu3vykg3zbUlJcW5F9KVwTkkF7fg6R4\n\tHKKtZ0j2Hl2Xrw/i8FiO6lG6vivGmSsBslYJkFNoirXXASnH4xQ7Z3dv/7BoFo8vazG5\n\tKka3lO6cOgPyfv7F9OS4yEBGQZqCgoTmAb1apEPwCB10ZHgMJHi8mF9QCnh8yyZXv9GJ\n\tSPc74szFYQEeID+1tzQxgDyXmhgdShXklPFkD7KXAfl9PH6SX0mOe4/icEopz6ITIEsY\n\tQEYAIF2gSKf3ASnDoymoR5fl6wMj4wge7yMepey3Yp27IiAbWUAeJ4D0cneeqQGAlOFx\n\tPKMeQ6MTU8+R5OrL2saWdsSjWD1TovNiAfmVSbHW15RTQB6Jiwhct8xl9rTJpoa6vaog\n\tO+ExIu4IwWNJeU09qkeJOq2Ip80H5IcWBpA5544n7g71YwA5ZpSOVi8qSIpHLR2DMeOn\n\tzHR29/IP3Z14/FwO4lHELintqfEA2dH2tr5aBsgtmgBIFo+6hqaTp812WbYuUAGPHVC5\n\t+vUbJlel7cHimr0yICvLHt7mAOnmBApyzKgRvQdIBo8jRhE8Orl5+SngEfqvyvo9YnJV\n\tXG4p3dl0Aci8i+lH9kZoACCV8bglYi+rHqtBPSIepeu14p15J0A+ZQG51c8LAGnFAHJA\n\tr1xWDngk7ckBj1YUj1sZ9fjwaSUkVxGP4nVKKc9MGZDPS+7lXUg/rAGA7BKPF/IguYp4\n\tlLLHinvuCoB831hb+fThrZyzxxJ3b/Vb1buA7AqPZ3NuIR7F7ZBSn12XgEwjgFzL7EGO\n\t7p09SA6Po5nk6lpQj4fTL+TdK3mOeJS6z4p5/kqAfE0AmQ2AjKKAnGFlTlOs6leQinhc\n\t5Qfq8RiDx9eN71E9itklpT23bgG5ea2Hyywo0ukVQPLxOMvFg+IxDfEobVeVxOy/B8jF\n\tjr0FSBkeza1mOC0GPEYBHrOJekQ8SsItpTtJGSC//NHR1lxf/fwRpFjTDu+JoICcOqk3\n\tACnH46RpBI+bI/YcJnh8xKrHL1iaI12HFfnMuwHk/qgQv1UUkMakSEe9CpKPR0fAYwji\n\tUeReiNOTWUAOyM8AyDcEkNey0g4pA7Jf31/U9jDXAuiONp00VYbHrGsUj81QmoN4lH08\n\t/IPoLNAJkE8e3Mw+c7QXAcnh0RjUI4PH/ageRed3OKFuLMAA8u+vf33hAHn3WtapQ3u2\n\tb17jsWCWTEGqD5B9+5Fbcxg8LgD1uH3PoTQGj28Aj58Rj918SPzHorAAB0hoYP7pw/uG\n\t15UsIHeF+K4EBWlpzirIvn3Us2Dt05epXGXx6BsStf/omeybD55Uvm4ge4/YYE4UboeT\n\t6M4CHCD/BEC2goJ89ogCMnZ7AAfIkeSiAHUBksHjSKoeF3isIXg8lXXtLiRX3zS3Ujyy\n\tDR+7mw/+c7SAkC2gDMgXAMgroCB3BRNA2gIg9UdoDRygpqsfYbODHOzQNza3BPW40jdk\n\tF+DxCuJRyB6GY/9PFvguIB2IghypPVhdgFTCY8D2WAaPz1g8ys4h/6cp4v8YLSAYC3QD\n\tyH0EkIvmMoAcqiZAEjwOZPBo67hopW/wrn0MHl+gehSMQ+FAf84CnQBZfDc369TB2HCi\n\tIB1sJpkYqA2QBI+DtUcawN6jA6hHDo/FiMef+8T4twVkASVAvqIK8nSKDJBmxvrD1QNI\n\tisehw/WNzSxt5yIeBeRDONQetECXgDxJALnaY76DzUS1AZLDo8lEG4f5gMfw2IOnsnLv\n\tIh578GPjqzTeAjxAfoQ9SABk4c0rAMidwT6eREGqC5BKePQB9ZhymiRXX7zCvUeN9yIc\n\tYI9ZoBtAxoRvWr2UD0gV1wQo4HHpaoLHk4jHHvvK+CKhWIAPyLZ3AMjHhTcuywFpYWak\n\tDgUpx6MFqEdPn+CdBI83Ch8TPLZ9xNIcobgTjvNnLcADZHtrc13Vs+I7uVknDzKAtOcU\n\tpIqvfoRKcppcpepx6epN4TEEj3dQPf7s18W/LzQLdAPIhJ1BPp4L59qqBZAcHo3MAI8L\n\tPX2CCB4vM3h8h3gUmkvheH/CAlw8foUq1vbWprqqMhaQ24iCZAA5bPDvKgUkD4/28/l4\n\trKprbm3/LG8R8BPzxL+KFhCEBbiAhGMeH4mCrCAKMiOFAST0Z1W9guTjcQ7FYwLiURC+\n\tg4PseQtw8SgHZNGd3PMnDsRs2+QNgLQme5CqBSTF47CRBqAeKR63xRw4eR7UY1lVXZMC\n\tHrGDTs9/fnyjplmAC0g5IAsoIHcEbVixEAA5TsUpVh4epwMeNwTtSEjJIOqx4lUDqkdN\n\t8xYcj6otwMVjZ0Bu9F4yz956gooBKcejtf38Jd6bAI8nAI9FiEdVf3l8v0ZagAtI2sCc\n\tKsiC60RBygGpB1Ws/VV0DlKGx3EWgMcVHB4LWDxC/1X2GDKuVjXSe3BQPW0BLh4pIFtI\n\tirXoNqMgZYDUUZ2CZPCoY2Aywdp+3hLvjYjHnv6++D6BWYALSBaQNRWPC65fykiJJ4B0\n\tpQpSdYAEPPYfOHS4npECHq8jHgXmQzjcnrMAF49KgEyKCSOAtLOeMNZAZYDk8DhWAY+3\n\tqXps4e894nK15z44vkmzLcAFpAyQpQDIdAVAaqtGQTJ41Gbw6ErUY3xKxiWCxxqSXEX1\n\tqNmOg6NTiQW4eFQAZGaqGgDJw6MdUY9hMUknMnMRjyr5zPhSoViAC0hFQCbHRwatX04V\n\tpKGeSgDZCY+R8cnpgMdSxKNQXAfHqQILcPHIAfIlpFivAiCjw/y93Z1ZBTmo56tYu8Bj\n\tauZVxKMKPjG+UkgWoAH57dvfFJBvG2rKSwvyL6UrAnJIj+9Bcng0JMlV1+Xrgzg8lqN6\n\tFJL34Fh72gJKgKxVAuQUmmLtcUASPA4apmMwdsIUO2d3b/+w6CQGjy/rmjC52tPfGN8n\n\tIAt0BuT9/IvpyXGRgYyCNAUFCc0DerRIh+AROujocXgMpHjMLygFPL5lk6vf6MAEZEgc\n\tKlqgByzAA+Sn9pYmOSBDqYKcMp7sQfYwILvHYy3g8ZP83CPuPfbAF8ZXCMoC3wOkCxTp\n\t9DwgZXg0ZdRjYGRccvrF/PuIR0E5Dg5WJRZQBGQjA8hzqYnRFJAzVQBIGR7HM+oxNDox\n\t9RxJrr6sbUQ8quQj40uFYwFFQNbXlJcQBXkkLgIUpMtsAkjdHlWQCnh0Wb4+MILBYwmq\n\tR+E4DY5UZRbgA/JDCwPInHPHE3eH+nu5OwMgxxjoaPWgguThcaazu5c/4PH4uRzEo8o+\n\tML5YWBZgAfkV9iA72t7WV8sBuW6Zy+xpk3sWkCwedQ1NJ0+f7bJsHeDxCFGPgMd6Jrn6\n\t9RsmV4XlQTjanrRA94D083JzIoAcNaLnAEnxqKUzasz4KQSPfqG7eXiE9uSyfo+YXO3J\n\tj4zvEo4FugHk3ogtPQ9IHh6nETxukeGxGvDYAQc7EI/C8RwcqSosoAzIyqcPb1MFuZUC\n\t0ooB5IAeuYuVweMIikcnNxkeH9LkKuJRFZ8X3yk0CygD8nnJ/bwL6UdUAMjOeNwL6jEP\n\t1CPiUWheg+NVlQW6AOStnLOQYu1xQAIeBwzSIni0mknwuJVRjw+fVsLeI+JRVR8Y3yss\n\tC3QG5L28C2mHAZBrmRTr6J7Zg+wSjxfy7pU8RzwKy2NwtKq0gAIg3ze+BgV5K/vsscSo\n\trX6r3Jxm9JiC7AqPZ3NuUTy+Rzyq8hPju4Vkge8A0sNlFuxB9gggOTyONp1Mkqtrt0Ts\n\tPZyGeBSSo+BY1WKB7wFyMQDSnO5B/myKlYfHGU5uq/y2RiUeO5tN8Pi6EfGolg+NPyIM\n\tC8gA+YUp0nn+iCrIPRGb1xJATuoJQPLxOMvFY+1mxKMwnANHqXYLdAPI/VEhfqsWO/YM\n\tIGV4NLea4bgY8aj2j4w/KBwLKACyub4aAHktK+0wC8ipckD+8qOPHI+TpjJ43EPV4yM2\n\tufoFS3OE4y44UhVboBMgnzwgKVY5II1JFevPKEhlPIZE7Uf1qOKviq8XrAXkgPzc0db8\n\thgHkqUN7tm9eAwpSBsh+fX+Uj8ytObqjTXl4zLp2D/D4prmt4zPiUbCugwNXgQU4QEJ/\n\t1k8f3je8rnzy4Gb2maMASF9GQbKA7NvnxwKSw6Mxqx4JHs9k33rwBJOrKvia+ErBW4AB\n\t5N9f//rCAfLutSwCyIA1Hgt+HpB9+5FL5Rg8LvBYs3n7nkOnEI+C9xqcgKos0BUgrwAg\n\td4X4roQUq6W5sT5RkD949WOfvkzlqrG5JUmu+gIej57Jvknw2ED2HrH/qqq+K75XoBbg\n\tAPknALIVFOSzRxSQsXJAjiQ36fyYgmTwOJKqR8BjAIPHu1Q9tlL1yPZDFqjxcNhogR62\n\tgDIgX4CCpIAM9l25yNGWAeTAHwMkbHaQgx36DB5X+obsAjxeQTz28CfE14nJAp0AWcwD\n\tpANJsY7UHvxjgOyEx1iiHu8+egbJVYJH2TUdYrInzgUt8DMW6AaQ+3YRQM61tTQjCvKH\n\tAEnwOJDBo63jopW+wRweX6B6/Jkvhn9X1BboApC5WacOxoaTFKuDzSQTgx8EJMHjYG2q\n\tHh2oemTwWIx4FLU/4eR+zgI8QH6EPchXVEGeTuEDcvjQHwCkDI9mlrZzKR73MeoR8fhz\n\tHwz/trgt0CUgTxJArvaY72Az8QcByeLRwGSiDcVjeOzBU1m5dxGP4vYmnN3PWoAPyDYK\n\tyMIbVwCQO4N9PFkF+QOApHgcOlzfmMGjT/CufSmnSXL1xSvYe/yIe48/+9nw74vVAp0B\n\teSc36+TBmPBNq5fyAfmfiub4eJzvsToA8HgS8ShWF8J59aAFFAD5DhTk48Ibl+WAtIAU\n\t638GpCIePX2CdxI83iikeGxDPPbg58NXic0CPEC2tzbXVT0r7gqQ/+lu5D5McpWqx/lL\n\tV28KjyF4vIPqUWy+g/PpeQt0A8iEnUE+ngvn2lqYGf1XQMrxaAHJVRaPl28UPgb1+A7x\n\t2POfEN8oIgtw8fgVqljbW5vqqspYQG4jCtKepliHDf79PwASDlqRvcfOeKyqa25tx9Ic\n\tETkPTqXnLcAFJJyD/NgGCrKCKMiMFAaQ0MD8vwKSw6ORGeBxoadP0M6ElNOIx57/cPhG\n\tUVqAi0c5IIvu5J4/cSDmBwFJ8TiM4tGeqMdtMQdOngf1WFZV16SAR2wwJ0p/wkn9pAW4\n\tgFQG5I6gDZ4L/zMgeXicPofFYwbBYwWqx5/8UPjXJWEBLh67AKT30nn21qRI598ryC7w\n\teALwWIR4lIQz4SR/3gJcQEIDc1ZBFlwnChIAuYIActx/SLEq4XFD0I6EFMTjz38jfIN0\n\tLMDFIw+QtxkFudF7CQBygomBzr8FpByP1vbzlnoT9Yh4lI4r4Ux7wgJcQLKArKl4XHD9\n\tkgIg9aBIp/+/uElHhsdxFqAeV7B4vF7AqkdoT87e0oHJnJ74cPgOUVqAi0cKyBayB1n0\n\tg4Bk8KhjYDIB8LjEeyODx9uoHkXpNzgpFVmAC0gZIEspIOOJgnSlClJP+98AEvDYf+DQ\n\t4XpGMjzGp2RcInisIaU5iEcVfT98rbgswMWjAiAzYQ8yjChIO+sJY/+dgvweHlv4pTm4\n\tXBWXA+FsetYCXED+HCAZPGozeHQl6pHBYynisWc/F75N5Bbg4pEPyKuZJ5L+GyA5PI6d\n\tYG1H1GMYJFczcxn1iHgUuQvh9HrSAjQgv337WwGQ6cnxkUHrl1MFafjPCrIrPKaDekQ8\n\t9uSXwndJwQJKgKx9CSnWq5mpSdFh/nIFOej7xzwIHgcN0zGQ4zHpROZVxKMU/Afn2MMW\n\tUADk24aacpJiJYAM/LeApHgcoq1nSJKrrsvXB0XGJyvj8Rv9mR4eOr4OLSA6C/AA+am9\n\tpUkBkO7OdlNoivW7gJTjcYqds7u3f1h0UirF48vaJlSPonMYnJBqLdAZkPfzL6Ynx3GA\n\tNAUFCd11ui3SIXiEBnN6hqYMHgMj4wCP+QWl5TUNb9m9R8Sjar8hvl08FugGkInRof7e\n\tBJDjx8Ae5HcASfGopWMwZjyDx9DoRB4eP8k7duDeo3icBmeiOgt0DcgjcRGB65a7zJ42\n\t2dRQlwFk1/2S2fbkhqaTp812Wb4uMCLuSPrF/PuIR9V9MXyzmC2gCMhGRkGeO564O9TP\n\ty81pptX4MaNIf9ZubtLh+q+OGW8108nNyy90d+LxcyS5StUj4lHMnoNzU4kFFAFZX1Ne\n\tQhTkkb0RW9Yto4AcTQHZdX9Wcskj2558tsuydVsi9lI8lpTX1KN6VMnnwpeK3AJ8QH5o\n\tIYB8eDuHAHKr3yo3xxlW5gSQ3XTXgWwO12COtCf32wp4PJtz+yHgsbGlHfEoctfB6anC\n\tAiwgv0KRTkfb2/rq8pJ7eRfSDu+N2LzWY8Esrj9rlwtWWirHXvK4wGPt5og9h9Mu5N0r\n\teV6NeFTFp8J3SsACyoCsfPrwVvbZY/ujQmT9WZnmAZ0zOtxBK3LJIzSYg/bkx85m33r4\n\ttBLw+AHxKAHnwSn2vAWUAfn80b1rWacO7dkesIa9G7mbLQ+yXB0Emx1QKgfXdECLALY9\n\tOcVjB5x7/PoN9x57/nvhG8VtAQVAvm98Xfnkwc0rZ46S9nPMzVZMTUC/Tt2uyHIVsjlM\n\tLQActKIddEiDOaY9+Z9f8ZoOcXsOzk4lFlAAZPOb6mfFd2n7uW0boSZgJtQE0C2PX/sq\n\tL1iZ5eooY3Oy2QGlcswtVrSDThviUSWfCl8qAQsoApJtP5eRAlXlsOXRfUYHNh/hZAfT\n\tsgOyOVsiSKkcc4vVe1SPEvAbnKKKLMAHJGk/xxy7olsei+faWpoZwU1zv/dXXrAyy1Xm\n\tZMdCT9+QKKgFyGFvser4/AXVo4q+Fr5W7BbgAxK668CxK1ITcBgyOqvJXeXklAfU6Cgv\n\tWKEYYODQEaOgdHUmnOwg2Ry62QGV5KTBHKpHsXsNzk9lFpABEtrPwbEruuVBMjpBG5gi\n\tVqjRge5zfRUzOiS7CgeRTSZNneXisS4Q7iQ/fQWyOZWvoRYA8aiyb4UvFr8FZIAk7eeg\n\tJoDJ6MBNc36rFjvSBSsUlSuXBIB8HAzZVXrLo6cv1OakwrU5xWXVb5rxkkfxuwzOUJUW\n\tYAD5N9xs9enDe9IOktwTAEWsZMFKjiWTmjklAUlqV4cO14fs6gwnd++NdLnKnOx4R7M5\n\tuPeoyg+G7xa1BThAkqI56JdMLtLJgRqdnUHrmQwrNLtSFpBEPmqNoMUA8z3WbImMp8tV\n\tWpvT/hlbBIjaXXByqraAHJB0wfr8EWxBnjgQvdVv5SJyVTmcgiQCkr8D2YfIx5EGzMnH\n\tDcG72JNWVWS5Ks/mqHrc+H60gBgtIAPkl8/sgpVmWMOhJMAJDnkY6w8HAakQj31/lcnH\n\tRSv9QqEhcta1e3DSqoEuV7E0R4xegnNSmwU4QNIFK8mw3rxyGkoCtpAaVtjxGDUCWnko\n\t7EBCOgcuzqHy0Q3k454jUAxQ+PgFza7KlqtqGz7+EFpAVBZgAQkZHViwvqkmJQFwCnIX\n\tKyChGSQcglSOx6HDye6jHdSSb44g8hGOdsDFAK1QK4eV5KJyDpyM+i3AAvIvyLC+a6h+\n\tXgKHPE6CgPT1hJvKJ5uOpgkd3gYkm84xmWjjsMBjXdDO/cfoRR3Vb+BiAJCPeLBD/V8Q\n\tf1FMFuDi8X+f25kdj/yLaYdiyQ7kXFs2ocOv0IF4JGetTCeRi6w2BO9OhI7Idx/BUat3\n\tbZ++cA1YxWQfnAtaQK0WYALyKwhIUqLz5MGNyxnJe7dv9HajCR1yD6tiPJL06mjTydAS\n\tGaoBYg6eysqj98q9/0B2O+jL1Dp8/DG0gKgswMYjCEioKYdrdG5ln0mJh4oA6AUJZ66U\n\tE6yw3cFW58DVAH5hsYfgnscCLp3zFeNRVK6Bk+kNC5CA/PY3P6FzbN+OLWs9SIIVzkAO\n\tVdjw6EO2O/QM4aoOx8Ve/ttIevVGIRSvknQOKx97Yw74m2gBsViAiUdI6DAlrHdyM0mC\n\tdZ3HAgebiWMNYMPjt37yggCIR9juMDK3pNVy2+OSSTE5VOdgPIrFHXAevWwBumD9+y+o\n\tCCAJVqjQOX8iMYq/4dFfOR5J9So9bAXbHWfgJquyl3W0OoepBujl6eDPowWEbQESkNCc\n\tlVTowL3IZMMjaXcwPXI1yZRsQPLjkZQDQDX5eCs75yWrAyISSDwWlVXx4lHYtsDRowV6\n\t2wJ0wfqVxuOripL7eVmnDkSH+KxwnQN9PAxGag3iF+hw8QjlAEugHCDhKFyEDPHIbD9S\n\tPvb2bPD30QICtwAE5DeIR7oBWXo/78Kpg7x4HNZdPJLyHIV4pNuPAjcFDh8t0OsWYOLx\n\tD148xmwlfGQLdLrhI8Zjr384HIAoLfBj8YjrVVE6A06q1y3wnfUqKWBV4CPsdyjlc+jd\n\tcvL8aq/PBgeAFhC2Bdh4pCcgO+dzFA5c0f3H7+53CNsUOHq0QG9bAMLx/779y/0O5XoA\n\tclsHd9wK63N6+0vi74vBAiQe2XqAGubGju/WA0C9nJGZ5QxHNy9/OI6ccfkGXPaI9Tli\n\tcAScgyZYgOIR4vFT27v66ufFUC+X+r16ObaeHFrNrYJ68sPpF6FXAL0egBxHJu/ShDnh\n\tGNACQrUAE49w5aPsgoBj+3cEMvXk5MIOxXryfsx5KwvZeasLcN6q4lXDe3q7HHkXBqRQ\n\tPQHHrQkW4OLxYxvTwwPOWyVEbKY3sHZx3grOI5Pr5bjzyEknsq7BeWTmOiv2PLImTArH\n\tgBYQpgUo0r59/ZPcwAoXWkETyIzkuO2b4IK5meSCOaXzyL+Q61ehW8BE6BawbF0QXPeY\n\tmXsHes2RTuVf/mSvlxOmIXDUaAENsACNx7/hfoD2lsbXL+gN5Ydjt/mTjgEW0OIKLmDl\n\t3w/wCxSwkm460Bt5/lK4Djnh6Jls+QYk3p+jAR8UhyBkCzB4pOlVeryDlJMfjAn181wI\n\tFyKbQkcduKCcd58ViUdSEMAeuNq+N5lNsEI3HUjoICCF7As49t63ABuPNJ1DOurcyT2f\n\tmhglP24FDQMU73ukFwQYjbOwnbsYEqwx0G0O2neQhM4H6G6F8dj7XxRHIGAL0HCE0x3k\n\tug4mnZNz9ug+kl5lrwdQbqjD9AugF1q5rvAJ2Z3Ev2COu/ARU6wCdgkcei9agFuuMvKR\n\tvV4uLiLAe4nzTHqdleJ2xy+/9Ok3gEno2JD2j0E79x1jTkDWNdMLkRGQvfgx8aeFbgEW\n\tj6QagN4OQE4/ph2KCaPpHNKxnDSAVOjfQS5E5i4oJzcExBEBWfiEaRggW7AiIIXuGTj+\n\tXrAAF45cuwAiH6E6Zze9HYCeftQerNSwvA9J6NCKObhhjghIuIGVbagDNyJju/Je+Ir4\n\tk2KxABePTP9HtmF5SsKOQOZ2OaZ9h0J69ZdfaIMrciPytDkgIIOjuIZzcIUOdPDgMjoI\n\tSLH4CM5DbRbgwlHWH7n0PtNuDqoBnGdajR8zavjQ3/mnH8m9j5DQIQJyLNmB9Fi7hV2w\n\t0hJWyLBCRofp4YEBqbbPiD8kDgsw4Qh3IQMeaXcruttxIknejpXKR4XtDpLQkTcshyMe\n\t22IOQgdI2sKDlOjIAYkBKQ4vwVmoywI8PH4mxTmQXSXdHxN2BK3rtl05xCMISNIywBRK\n\tysmCddf+Y2fhDlbScq6lHbYguZoArCtX13fE3xGFBXh4hM1HOGsFd6/mZUFzq/BNsNtB\n\tmnfQbqxK8pEIyAGkxRWzYF2zOWLvEejhQXvqvGMBiStWUTgITkKdFpCFI6hHwGNT7Uto\n\txpoDzVijQnxpsdw4ZrdDablKF6yw46FvbGZJM6yh0YmpmVdpDWtTKwBSnmLFFas6vyf+\n\tlqAtwIUjUY8Ej3A1Oc3mJMdFQC8dUpxjYjBy2GDYfeRXr9KETj+6YCUZ1tkuy9YHRsan\n\tZFy6XlBaAYeuFAGJASloF8HBq88CbDhCMofisbWpror0Ks9MTYoO8/diej+OGgHNyhUO\n\td9C+On3ognWEAfQsJ008Nm6LOQA1cwwgiYIkgGRXrBiQ6vui+EtCtgCHx7+/0uQq4LGi\n\ttOD6pYyU+B1B65e7zIZWAYa6UJyjvNtBIrIvZFihJMBwHM3obAjakcAHJOxBylM6GJBC\n\tdhIcu7oswIUjrFbhZAenHq+eP3EgZttGms2ZMNZAB852dF6uEgEJC1a4JMAEtiDnLfXe\n\tRABJFeTL2saWD59gzwMDUl0fEn9HBBaQLVaZ1WoHafxYXnI/n8HjBtIpwAKyOcOHDuzf\n\teblKdjygJAAyOkZm9BYdHwJIkmIteV5dD1XlsGKFKh1uxYqEFIHD4BRUaQF+ONLV6vuG\n\t15VPH1L1SPE4z96ay+Z0yq4yGZ3+sAUJgJxoA7cEEAWZlHou59bDJy9ekZTOHwoSEgNS\n\tld8S3y14CyiGI12tvql+9uhe3oX05PjIoA0ryM0AZkb6gEfI5ihnV2k8Mhkd2PIggFyx\n\tISgy7kgaFOkUQyPIppYPHxkJiYQUvKvgBFRvAS4cSWoVxONnWK1CMudx4c0rZ48lRoeB\n\temTxCDfndJXNkWd0CCBBQS7x9g/dnXj0zGXY8yivftPc2s5KSFlAIiJV/1nxF4Rpgc7h\n\t+A5Wq7DXkZt16tDeiMD1y4l6JHjU6jqbwyxYf4ManRGMgnRdvm5LROxBktKhK9a3bbDp\n\tQXM6GJDC9BEctdoswIXjN4aOUEf+vrGuClar+RczUvbtCvHzcne2s54AtQBks6OrbA67\n\tYCVbHiTFOsXOyW2Vb/DO+OT0C9fuFJVVvgYJCTkdDEi1fVP8IaFagIvG/5OF44eWpjfV\n\t5aUFN7LPHk+KCQ9Y4+EymyRXGTx2mc1hAfn7IC1IsY6bPG3WAo/Vm8KiE4+evpR/79Gz\n\tqtrGrgIS16xCdRoct6os0FU4NtfXVDyB3Or5k4f2Rgb5eC5ynGE1fizgEdRj19kcGSAH\n\ta+tAkY7VjLkLV6yHFeuB1HPZNwpg06Ou8T1HSN6+B573UNVnxfcK0gKyaOTRsbW5/tWL\n\tp0V3crPSkxN2bfXzXjLfYeokU0Oy9zjgt27xSGsCYA9SW2+06SQb+3nuq3yDdsQdPnX+\n\t6q1CyOlwAfknKQyQi0hEpCD9BgetCgsoRCOpkvvyx8cPrc0NryCXczfvYsbRxOhtAWuW\n\tuUAyx3zMKB2oJP8OHmlNAOxBDhsxiux5zHbx8PbfuishOS0r9/aDxyQg37W1f4J9SBqQ\n\tGJGq+KD4TgFbQB6NFI5f//zfl88fP7QAHSvLiu/lXz5zPCl2+5b1sFqdOQWSObra/4BH\n\tAkgo0iEpnbHjrWznui5bG7Bt9/6U9Au5tx+SgISkTjsUBvzvz6+KiMRVq4C9CIfeIxbg\n\tBSOJRrrtSPYd2XC8f/3KudSDIB59V7nPc5g62dRIf4TWINh77LIWgKhH8vTpC1WskNLR\n\tMzSdaG3ntNhz/ZbwmMSjGTQgn1fXNrxt+QBpVopIhUUrjKZHZoUvQQsI0QKK0Ui3OWCt\n\t+qm97X3Tm5oXZcUkHE8eitsR4ue9lORWzcYY6MBex4Bfv6MemYD8lVmxQo51qgNISJ/A\n\tiJjEYyQgH5Q+f/m6vvk9XbP+jyxalSMSQ1KIroRj/kkL8GPx/4CNEI1UOX7u+ND6tqGu\n\tuuJp0b3r2ZknD8fv2rpxtYfrHFur8bLV6nfxyACSWbGOMQcJuWCJl29QRGwSDcjCkrLK\n\tmjeN71o/dICK5CKSpyPZgf3k9PCvowWEYgHFUGSCkaxU//cFlCPAsbnhdVX5k6K7+Vcy\n\tTx5JiArdtHb5QseZ1hNJbpWsVrvf66DLVbpi/RVWrEO1dUebgIScAzkdPxKQR9Ozcm8W\n\tFD+tgDVr83smImlIUkrC/ycojwz/M1pAUhaAGADVSNAI0fgHicaWt41val4+K314J+/y\n\tuZOHE6LCAtatWOxkbzN5nBHNrf7japWuWPuRFSsjIafM4AIyEQIy58a9osfPX9bUQUS2\n\tfej4+PmPLyQk//oK2R180AIStwCEwV9//UnQ+McnEo3vmupfV1eUPSq8fe3SmROH40k4\n\tero5O0wj4hEK5cjW4z+sVhkF2e+3Ab8PGQZ1rKaTrGfOdaWEjElMScu8knf7waOyiqpX\n\tbwgj29o7PpGQ/PK///0Jz1/4oAUkawESAf+DUAQyQjB+ADY21ddWVz57XHTvZu6F08cP\n\txe8KC1jv6TZvFuw8jiVbHf9qtSoLSNj00BllPI4XkPuPnDx7MfcmILLsRTVEZNNbCMkP\n\t7R0fP33+/AcJS3zQAhK2wB9/QCh++tjR3gZobG6sr615Wf4U4JiffT796IG9O0MJHSEc\n\tLcePHa07XItUAvxDbpUEI3ngpoD+REKONDAeN9mGEtI3MHx3wqHjGVnZ+bcLi588e1H1\n\tqraehGRLaxsEZXtHx0fyfMIHLSA5C1DX7+joaP/woa2t9T0EY8Ob19Uvy8tKHgIcL507\n\tlZIYGxmyce0KJhxNRuuNgMKcf7daZQKSSEheQLos9fLZHLZrb1JK2rmLuTfuFBY/Lqt4\n\tWf2qrr6hsentu/cQla0Ql/igBSRrgdbWlpb37942NzVAMNZUvXj+tKTo/q287KyM1MP7\n\tYiKC/NesWEzpaGII4fhvxSMNR1oVAAGppa3LEHKOy5KV6zdtjYzZfzg14/zl3Jt3CotK\n\ty55DSNa8rn1T39DQ2NjU1AzPW3zQApKzAPH85qamxgYIxbraV9VVleVlTx49vH87P+fC\n\t2VMpSXFR2wL9vJctcnaAxaqJoT4Tjv+81cEEI/lXUqYzAJKsEJBjQEPOmDPfbcUav6Dw\n\tqLiklJOns67k3rhd8PDR46fPyl+8rKquefX6dW1tXV3dG3zQAlK0APh+be3rVzXVEIsV\n\tz8uelBQV3r2Vl3PxXPoxgGPk1oANXh6uTvbTLGg4Qmr13+w8ysORF5BEQ06cYjtr3qJl\n\t3j6bQyNjEg4ePXUm63Ju/q27BQ+LSx4/LXtWXvHiReXLly+ryFOND1pAQhagTl/18mVl\n\t5YuK8ufPyp6UPip6cO/2jWvZF86lpx5J3LsrPMh/recSl7l2Uy3MTUZTOtJcTld3WPFj\n\tUOHPMkJCQJpOsJru4Oi6dOU6/6BtO2P3Hzp68nTmxezc67fu3Ct8WFT8qPTxkydPn5bh\n\tgxaQqgWePn3yuLTkUVHRg/t3b9/Iu3o562z68eSkuOiIrQE+3ssWz58zw2ay2ViSyqF0\n\t/Dc7j0oB+SuzZB05ysh0vMXUmXMWLF7mvWFT8PZde/YfTElNP5sFIZl3/ebtO3fvFxQ+\n\tePDwYRE+aAFJWuDhw4cPCgvu37t7+9aN/Nycy1mZGaeOHUmMi44MDfRbu3Kpq5PD9CmT\n\txo0x+OFwpLseEJCQZdXRNxxrNtnadpaT6xLP1b6bQ7bviklIOnL0RPqZzKxLV3Jyr+Xl\n\tX79x8+atW7fxQQtI0AK3bt26eePG9fxruVezL1/IOptx6njKwf17oyPDgvzXe3kAHGdO\n\ts5xgamygO/wH6UhQySxZISBH6EFWZ6LlNLs58xd5rFzjGxAcviN6774DR1JST6WfPpuZ\n\tlXXx0uXLV7Kzs3PwQQtIzgLg+FeuXL508ULW+XNnMtJOHEs+lBgfsysiNNB/vfdydxdH\n\th+nWk81NDEeN1NYaTFI5/3mxyqxcSUDCtseQYcN1DYxMzSdbT3eYu2AxRKTPpqDQiJ3R\n\texISDx5OOXr8xKm09PSM02fOnDmLD1pAchYAxz99OiM9Pe1k6rGU5ENJ++NioiK3BW/2\n\tWwfR6Oo8e+ZUy4njxozW14Fw/H3AD4cjJSQUBgwcoqU9Un80INLCxnaWI0Skp/d6v4Cg\n\t0O2RUTF74vYlJh08dPhIcgo8R5nnGD6aaAH26+C/8S3wMx+KfQ/x/OTkI4cOHkjcn7A3\n\tZvfOiG0hWzb6rFm1DKJxjt30KQBHIwPdEaRmdcBvP0pHdsn6a3/YiKRrViMTs0mWU2fM\n\tcpy/cMmyVavX+20KDA4Nj9ixa3d0TOyevXHx8fEJ8OzDBy0gGQsQj0+Ij4+L27snJmZ3\n\t1M6I7WEhQZv9fdZ6e3osdiHRaG0xwRTgOJKRjr9BGcB/2uhglqrcv8KSlaRZyZoVEGls\n\taj7Jaqqtwxxnl8VLl6/0XrvBzz9gS1BwSGjYtvDt2yO4JxIfTbQA93nw33kW+JkPJX/N\n\t9vDwsNCtIUGBmzf5+axb7bXCw33hfMfZNBrHjTWkcOSk40+EIyxZGRE5kCBSd9ToMRCR\n\tljbT7WY7znNZ5O6xfKWX95p1G3z8/Pw3bty0KQCezfigBaRkAeL0mzZt9Pfz8/VZv3a1\n\t96oVy5a6uS5wmuMwY9oUiwnjYKmqp6M9bMjPrlVZRPaRIVJLW0d3lCFE5ESLKdNs7WbP\n\tdV7gsshticey5StWrvLy8oZnNT5oAclZgHi+t9eqlZ4rlnksdV/s6jLPcY7DzOk2lpNp\n\tNJKl6lACR1ir/ovzx9zStNt/pwHZ/3eyaNXW0Rs12tjEbMJkS+tp02c6zJ7j6DzfxcV1\n\t4aLFbm7u7kvgWYoPWkBCFiA+v8Td3c1t8aKFri4L5jnNnTPLbsZ0GyuLieamY40MIBrp\n\tLgeTyPmptSoXoRwiYdEKEak7ysBorCmEpIWVzbTpM+zsZ82eM2euo6OTk7Oz8zx80AIS\n\tswC4vbOTk+PcOXNmz3Kwm2k7faq1pcXE8eNMjA0N9Eg0kqVqf7iboyfgyMRkn75MXodG\n\t5IiRegajjceajhs/cbKF5RRriMrp021nzJg5c6YdPmgByVkAHH/GDFvb6dOnTbWZYmUx\n\tedIEM1OTMYYGo3R1ZNFIdjl6BI4sJGlEwtbHwEGwGzlcR1ffYLTRGIhJs/ETJk6abGFh\n\tYWlpZWU1BR+0gOQsAI5vZWkJMTB50sTx5uMgFoGMo/RGjtCmuhHY2NPRCEEJi1aGkb8P\n\tGjwUQhIoCTFpCEFpYmoKcWlmZm5uPh4ftIDkLACOb25mNm6cqanJ2DHGRqMNRunr6kAw\n\twkJ1IFmpqiAaCSXZiKSQJCEJmBypq6c/ygDC0tDIyMgYnjH4oAUkZgHi98ZGRoaGo0cb\n\tQCjqQSwOBzIOgZQqKcdRUTSSiKS7kb/++huEJFByyFCtYRCUI3QgLHX19PT0uWcUPmgB\n\taViAc3lwf13dkSMhEodr01gEMrJo7FndSMOQ9y8MJJmQBDEJQQlRCWFJn+H4oAWkaAHG\n\t/YcN09ICLA5mYpGsU3s4icOLQ94faUhCGR1gEjj5+8CBgwYNGjx48BD5MxQfTbSA/APh\n\tn2QW+JkPJXvJEIhCiMNBA4GKvw8Y0B9iEZapqiUjLyJh3UqyO/36wdr1t/79IS5JYOKD\n\tFpCyBSAKIBZ+I6FIY7Entzf4wdfdn2lQsmH5Kzy/4YMWkKgFiP+TOCSRCFjs0a3G7uKv\n\tm39Ofh0eGAc+aAHpWoAJA3VDsZugxH+MFkALoAXQAmgBtABaAC2AFkALoAXQAmgBtABa\n\tAC2AFkALoAXQAmgBtABaoFct8P/b5umcCmVuZHN0cmVhbQplbmRvYmoKMjQgMCBvYmoK\n\tNDQ4NjUKZW5kb2JqCjIwIDAgb2JqCjw8IC9MZW5ndGggMjEgMCBSIC9UeXBlIC9YT2Jq\n\tZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjU2IC9IZWlnaHQgMjU2IC9Db2xvclNw\n\tYWNlCi9EZXZpY2VHcmF5IC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVE\n\tZWNvZGUgPj4Kc3RyZWFtCngB7dCFQQIAAABBsTswEAxsBQWD/XdzkL8b4Vartj8MGDBg\n\tIDnwiwEDBgwkB34wYMCAgeTANwYMGDCQHFhiwIABA8mBBQYMGDCQHPjCgAEDBpIDnxgw\n\tYMCAgeDAHAMGDBhIDswwYMCAgeTABwYMGDCQHHjHgAEDBpIDbxgwYMBAcuAVAwYMGEgO\n\tvGDAgAEDBoIDzxgwYMBAcuAJAwYMGEgOPGLAgAEDyYEHDBgwYCA5MMWAAQMGkgP3GDBg\n\twEBy4A4DBgwYSA7cYsCAAQMGggM3GDBgwEByYIIBAwYMJAfGGDBgIDpwjQED2YERBgxk\n\tB64wYCA7cIkBA9mBCwyEB84xYCA7MMSAgezAGQYMZAdOMWAgO3CCAQPZgWMMGMgOHGHA\n\tQHbgEAMGsgMHGDCQHdjHQHhgDwMGsgO7GDCQHdjBgIHswDYGDGQHtjBgIDuwiQED2YEN\n\tDBjIDqxjwEB2YIABA9mBNQyEB/4BLgXylgplbmRzdHJlYW0KZW5kb2JqCjIxIDAgb2Jq\n\tCjM2NgplbmRvYmoKMjUgMCBvYmoKPDwgL0xlbmd0aCAyNiAwIFIgL1R5cGUgL1hPYmpl\n\tY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyNTYgL0hlaWdodCAyNTYgL0NvbG9yU3Bh\n\tY2UKL0RldmljZUdyYXkgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURl\n\tY29kZSA+PgpzdHJlYW0KeAHt3Qs/k2EYB+A5j2HOZpjz+TxzNkQSSSJJJJEkkkgStq/e\n\tB+n6CPtte9/nuQ//K51KPT483N//vbv7c3v7++bm1/X11dXPy8sfFxffz8/Pzr6dnn49\n\tOflyfPz56Ojw8NPBwcf9/Q97e7u773d23m1vv93aerO5ubHxen391dray9XVFysry8vP\n\tl5aeLS4+XViYn38yNzc7OzOTTCanp6empiYnJyYmxsfHxsZGR0dGEonE8HA8Hh8aGhwc\n\tHBjo7+/v6+vt7e3p6e7u6urq7Ozo6Ghvb2tra21taWlpbm5qampsbGiIxWL19XV1dbW1\n\t0Wi0piYSiVRXV1VVVVZWVJSXl5eVlZaWlpSEw+Hi4qKiosLCUChUUJCfHwwG8/Jyc3Nz\n\tcrKzs7OyMjMzMzICgbTP7/v3+/f/9/zz/Pf+8/53/nH+c/51/nf/cf9z/3X/V/9Q/1H/\n\tUv9T/1T/Vf9W/9f/0P/R/9L/0//U/9X/1v83/2D+w/yL+R/zT+a/zL+Z/zP/aP7T/Kv5\n\tX/PP5r/Nv5v/t/9g/8P+i/0f+0/2v+y/2f+z/2j/0/6r/V/7z/a/7b/b/5d/IP9B/oX8\n\tD/kn8l/k38j/kX8k/0n+lfwv+Wfy3+Tfyf+Tfyj/Uf6l/E/5p/Jf5d/K/5V/LP9Z/rX8\n\tb/nn8t/l38v/5x/wH/gX/A/+Cf+Ff8P/4R/xn/hX/C/+Gf+Nf8f/4x/yH/mX/E/+Kf+V\n\tf8v/5R/zn/nX/G/+Of89IxBIp1L8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8\n\td/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/\n\tzn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf\n\t+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47\n\t/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/n\n\tvwfSqdTjw3/sv/8DK6twSQplbmRzdHJlYW0KZW5kb2JqCjI2IDAgb2JqCjgxNwplbmRv\n\tYmoKMTcgMCBvYmoKPDwgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMCA+PgplbmRvYmoKMTgg\n\tMCBvYmoKPDwgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMSA+PgplbmRvYmoKMjcgMCBvYmoK\n\tPDwgL0xlbmd0aCAyOCAwIFIgL04gMSAvQWx0ZXJuYXRlIC9EZXZpY2VHcmF5IC9GaWx0\n\tZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AYVST0gUURz+zTYShIhBhXiIdwoJlSms\n\trKDadnVZlW1bldKiGGffuqOzM9Ob2TXFkwRdojx1D6JjdOzQoZuXosCsS9cgqSAIPHXo\n\t+83s6iiEb3k73/v9/X7fe0RtnabvOylBVHNDlSulp25OTYuDHylFHdROWKYV+OlicYyx\n\t67mSv7vX1mfS2LLex7V2+/Y9tZVlYCHqLba3EPohkWYAH5mfKGWAs8Adlq/YPgE8WA6s\n\tGvAjogMPmrkw09GcdKWyLZFT5qIoKq9iO0mu+/m5xr6LtYmD/lyPZtaOvbPqqtFM1LT3\n\tRKG8D65EGc9fVPZsNRSnDeOcSEMaKfKu1d8rTMcRkSsQSgZSNWS5n2pOnXXgdRi7XbqT\n\t4/j2EKU+yWCoibXpspkdhX0AdirL7BDwBejxsmIP54F7Yf9bUcOTwCdhP2SHedatH/YX\n\trlPge4Q9NeDOFK7F8dqKH14tAUP3VCNojHNNxNPXOXOkiO8x1BmY90Y5pgsxd5aqEzeA\n\tO2EfWapmCrFd+67qJe57AnfT4zvRmzkLXKAcSXKxFdkU0DwJWBR9i7BJDjw+zh5V4Heo\n\tmMAcuYnczSj3HtURG2ejUoFWeo1Xxk/jufHF+GVsGM+Afqx213t8/+njFXXXtj48+Y16\n\t3DmuvZ0bVWFWcWUL3f/HMoSP2Sc5psHToVlYa9h25A+azEywDCjEfwU+l/qSE1Xc1e7t\n\tuEUSzFA+LGwluktUbinU6j2DSqwcK9gAdnCSxCxaHLhTa7o5eHfYInpt+U1XsuuG/vr2\n\tevva8h5tyqgpKBPNs0RmlLFbo+TdeNv9ZpERnzg6vue9ilrJ/klFED+FOVoq8hRV9FZQ\n\t1sRvZw5+G7Z+XD+l5/VB/TwJPa2f0a/ooxG+DHRJz8JzUR+jSfCwaSHiEqCKgzPUTlRj\n\tjQPiKfHytFtkkf0PQBn9ZgplbmRzdHJlYW0KZW5kb2JqCjI4IDAgb2JqCjcwNAplbmRv\n\tYmoKMTIgMCBvYmoKWyAvSUNDQmFzZWQgMjcgMCBSIF0KZW5kb2JqCjI5IDAgb2JqCjw8\n\tIC9MZW5ndGggMzAgMCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIg\n\tL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Aa2TzWsTQRjGn02QCtZQi0jx4oJSPERdkhbb\n\tW9t8SOwSlySlfhw02d1soslm3d1ErR561H+gFEQQPOjBmxc9tSeR4ieC9OBdUU9a6qGU\n\t9Z0Zd4Ng8eK7zMxvH555Z+adXSC+UXWcVgxA2/bd0qkZ+ey58/LAOiQcQgJJyFXdc6Y1\n\tTSXLDrH5gdwU74+xXF9iz7c+fdtz58Li7bXDSw9bO0wK5YRLCwJSkoT9luApxjXBFcbX\n\tfMcnT4Ox3qgaxLeIk26llCF+RJywBD9lXBP8gnFPt9jcdWLFNpo2ENtNPGGYnk48RWwZ\n\tnt4mpjwS2u0O5Y+znEd1x6W58bfER1hdaKS4mgAmv5J+r69dPAE8WQMOaH1tdBkYvgQ8\n\tm+xrP97wWkkjNa+eTvF00uBBYNdqEHwPgAHyb78Ogq3lINheojU2gJWi3nV73EsblF4B\n\t/3oXZxbZgXd0Bgp+R39nURfuUoAHq0BlEVBpvEvj6E9g301AA+lUpnQ6bKKGJAN7szlV\n\tlVNjynhem+fKf+zarS7dFY9h6gftWvEMjSPUPju+RpsS7PXKuZDrzXwhZKOanQ15oZEp\n\thlx386WQL1dPswPynKY9Vw7ZafFv//daM5Hf9HKRZ6FRYWfmHrdbmgv5Smc28htmNtqb\n\t3Sqy/4n7m34h2j+yyEGlR0YKY1AwjjyVfV58kzQDQ4+B+0PKyXR55eNLJvwRvnmd33Wm\n\t49xwm1bDl6fpjzSTcsHWjyfllKJM4BeDarM/CmVuZHN0cmVhbQplbmRvYmoKMzAgMCBv\n\tYmoKNTY1CmVuZG9iagoyMiAwIG9iagpbIC9JQ0NCYXNlZCAyOSAwIFIgXQplbmRvYmoK\n\tMzEgMCBvYmoKPDwgL0xlbmd0aCAzMiAwIFIgL04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VS\n\tR0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBhZRNSBRhGMf/s40EsQbR\n\tlwjF0MEkVCYLUgLT9StTtmXVTAlinX13nRxnp5ndLUUihOiYdYwuVkSHiE7hoUOnOkQE\n\tmXWJoKNFEAVeIrb/O5O7Y1S+MDO/eZ7/+3y9wwBVj1KOY0U0YMrOu8nemHZ6dEzb/BpV\n\tqEYUXCnDczoSiQGfqZXP9Wv1LRRpWWqUsdb7NnyrdpkQUDQqd2QDPix5PODjki/knTw1\n\tZyQbE6k02SE3uEPJTvIt8tZsiMdDnBaeAVS1U5MzHJdxIjvILUUjK2M+IOt22rTJ76U9\n\t7RlT1LDfyDc5C9q48v1A2x5g04uKbcwDHtwDdtdVbPU1wM4RYPFQxfY96c9H2fXKyxxq\n\t9sMp0Rhr+lAqfa8DNt8Afl4vlX7cLpV+3mEO1vHUMgpu0deyMOUlENQb7Gb85Br9i4Oe\n\tfFULsMA5jmwB+q8ANz8C+x8C2x8DiWpgqBWRy2w3uPLiIucCdOacadfMTuS1Zl0/onXw\n\taIXWZxtNDVrKsjTf5Wmu8IRbFOkmTFkFztlf23iPCnt4kE/2F7kkvO7frMylU12cJZrY\n\t1qe06OomN5DvZ8yePnI9r/cZt2c4YOWAme8bCjhyyrbiPBepidTY4/GTZMZXVCcfk/OQ\n\tPOcVB2VM334udSJBrqU9OZnrl5pd3Ns+MzHEM5KsWDMTnfHf/MYtJGXefdTcdSz/m2dt\n\tkWcYhQUBEzbvNjQk0YsYGuHARQ4ZekwqTFqlX9BqwsPkX5UWEuVdFhW9WOGeFX/PeRS4\n\tW8Y/hVgccw3lCJr+Tv+iL+sL+l3983xtob7imXPPmsara18ZV2aW1ci4QY0yvqwpiG+w\n\t2g56LWRpneIV9OSV9Y3h6jL2fG3Zo8kc4mp8NdSlCGVqxDjjya5l90WyxTfh51vL9q/p\n\tUft89klNJdeyunhmKfp8NlwNa/+zq2DSsqvw5I2QLjxroe5VD6p9aovaCk09prarbWoX\n\t346qA+Udw5yViQus22X1KfZgY5reyklXZovg38Ivhv+lXmEL1zQ0+Q9NuLmMaQnfEdw2\n\tcIeU/8NfswMN3gplbmRzdHJlYW0KZW5kb2JqCjMyIDAgb2JqCjc5MgplbmRvYmoKNyAw\n\tIG9iagpbIC9JQ0NCYXNlZCAzMSAwIFIgXQplbmRvYmoKMTkgMCBvYmoKPDwgL0xlbmd0\n\taCAzMyAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUgWyAx\n\tMzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0ZpbHRl\n\tciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBzcLXcQJAEAXByT8vjLDCO4HwIoobfRPA\n\tK7arW4f22V1akT1anX3ae/t85hfWOcAih1jnCIscY50TLHKKdX5jkTMsco51LrDIJda5\n\twiLXWOcGQ7cYusPEPYYeMPEHQ4+YeMLQXww9Y+IFQ6+YeMPQO4Y+MPGJoX+Y+MLAf+tF\n\tvN4KZW5kc3RyZWFtCmVuZG9iagozMyAwIG9iagoxMzAKZW5kb2JqCjMgMCBvYmoKPDwg\n\tL1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBbMCAwIDUxMiA1MTJdIC9Db3VudCAxIC9LaWRz\n\tIFsgMiAwIFIgXSA+PgplbmRvYmoKMzQgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL1Bh\n\tZ2VzIDMgMCBSIC9WZXJzaW9uIC8xLjQgPj4KZW5kb2JqCjM1IDAgb2JqCjw8IC9MZW5n\n\tdGggMzYgMCBSIC9MZW5ndGgxIDUwMzIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3Ry\n\tZWFtCngB7TiNfxNVtufcOzOZNkDT0pbQAJl0aJWm2QIKlEJpaJKWNkILVDepsCb9kADF\n\tFlo+n9Iqq2L4sK7a1d+u6K6rFaw6bZENRZevxdUVfn6ivLfig4X14z0R9Af7VoHOO5Nq\n\tBZd9f8Gbk3vn3nPOveeej3vu3AACwBBoAw7u2mXhJpBhGmEOU7HWrmpR3tm342NqnwaQ\n\tV9zetGhZ6hcziZ4QABDKFzWsvT0yatrbAEN/RzyvR+rDdWeXqscBhjVQf3KEEMPGCEQf\n\tZtDHRpa1rJH3Yxf1X6e+3NBYG4Y6SKc+8YC0LLymiT0q3k39Y9RX7ggvqx+59bl11P8H\n\t9dWmxuYWvQpuB0gaRf3sphX1TWeOuN6jvpfWEyYcEhjPEJCoADgMjNgLILbBGCojeA9k\n\t6hf0v1L5zCj9s4j2NCT31wDwEmpvi4+/qhJP0OyeAZT+L56rBlyzMzAQDE2Ncu2nHMxQ\n\tAltABAsI8Az1zsJxuA8klGEyJEM+vIAfgQcq4R4shJ8TTwaUwQuwGz7ARfolEPSgfgCW\n\tQidOIv0zoAAWwF44T3x/gp9CGNZAK96j30XWSYQxkAk3kDVXwDo4SRwJkAY2yMQsNo0f\n\tgxE0sgHaYAPsFir0Z/XjNCaBoAKeheegH6sxou/STxEmH6aCD+bDHcT7AIqYJo7R/6Kf\n\t18/DRFrnQlhE8yyHx2AXmnA4OvEPrIh3wDjSsxGaIAod8Ev4M2bjm7xS3w4uggkwh+a7\n\tFWpozi3QB2/ANyixGraGvcB28RX8ogDCUfFtyae/ph+hyBXBSmMKaMRtFE+Lad4H4R34\n\tEP4KX8HXmIaZOAEn4wwsw6WsQTJLP9X30BgzjAaFbJADebTSAigmmEe2uBMehS54BV4l\n\tOABfokJwHcE4vBWfwR48xZKYwg6zd9g3PJ/7+aOCVVgo3Ck+Jp6UcnSPvosslQJ2UGEK\n\tzVhOFrsVamlVzWT9X0InwYuwE2LwHvwFTsHfaH0j0Iqj0IOlWI7nGGePs8/5ZL5OkPpH\n\t6xP19fGoTqLVziAoJ7gJZsNcuJk8GoB68vY6+De4C9bDPRQRD0I7gSFnQEof7IPXKeLe\n\tJXv8B/n5FPwXnKOI+BYukz+SSLIDc/AGzMfp6CXwYQVBBFfj/bgZ2/Fh7CKNN7KH2Vc8\n\tkafycl7P7+ab+JN8Lz/IjwjZwiyhR+gVC8RScROBJh4TP5G45JEekj4zbTe9IlvlIrlM\n\tXiz/+tLOfug/2n9On6HP0bfoW/V2/b/j3pPIYjL5YwhFeCpFrRNupIgqp+iZD1UQ/M5+\n\tyyhSmwlWwipYC/fC/bCZYAs8RBH0G3geeuBl2A9/hNdIUwOO0c75mOA07aF/kK4ymnEo\n\taWwhGIVjcCzFnBNzMQ8nYSG6yf5zMIj1uAI34TZ8GV/Ft/AjBuRtG1NZAZvO6sgKz7Od\n\tbC/55zryUD6/iS8iazwpJAluEcQO8TOpU3oV3sPptN+ufh6Br/RUYQucod2zGt7neXod\n\tr8Xl0CLehk74lnbGbtJF5ZSLcRycE75AJ1vN0nAjS2OT2GnxFXykP4qJ5MuPIIdW5hM6\n\t4N+hkM+gvbqW+4WF7PdCNu6kCK3BL9lC9ivmE9ewaijGF9GF5XwcHDFlSZ+wevycZ5pC\n\tcBFXkRaV8Du2AzYyF/4Pm9a/T3KJE2G78BHzwHY4xjJMEkvjF9m77Am4gz1Ee+IRirpv\n\t4Be03qG4gnKOCwvwXYqmg/g+5d8XxDb9vHgnK2TT8R32N4ogEJ4QwgNc/yJx/j86bgF4\n\tiS0zzaKsO0I8IB4w2uwQa+Qu7mImOEJ1IzOxD4Ri+AXXTDoWiptQkd6U3sQlUCciZEOF\n\t8DPswK/xIPQKU+A8fg0opEAFZkvT8AlxGlSII+ExlgkP0Sn3Br7I18DnOJrGLGGHTLMw\n\tX7gICzEffisUC5/wDvYImlkOnsT78O8EDZRdnbgW1ksvwWq+EfJ42PQ+OtjP2R5oYaWU\n\tZeewbKzkb8Eh2CMVsJvpnQ37+TYWoCyXJx+GM9ggbBA24AdQxuZBG2sVEJLwuHAJGqQW\n\tuFP8EO7C1XEpfYYc2vO/IVmT8E902m2gHJNNZ8sewn4IRZBLuXsN5e0dlAOClCmQzsYz\n\tKFFmMHLeKbYTGfweZsHD3Mct0sNwN/sWMyjD1BE2C5bBVlQpSxRS1jyIH9M5GqBT73pe\n\tA3NN24HhcNqhIG6lk0eFE/AqlsNP4EPMoMyoAjKB34htcAmrWEd/jVACiXw53yAuxRLa\n\tTy8C6qnwZz0i0PeGe1L+lBsmjM/7iSvXmTPu+uuys8aqmQ7FPmb0KFvGSOuI9LTU4SnJ\n\tlqRhQ4eYExNkkyQKnCHk+tSSkKJlhzQhW501y2X01TAhwlcgQppCqJKreTTFGBcm0lWc\n\tbuK8/Uec7gFO9yAnWpTpMN2Vq/hURTviVZUYVs8NUHuLVw0q2pl4e3a8LWTHO0Op43DQ\n\tCMVnjXgVDUOKTyvVhCwtsSrg0MqCqyJRX8jrysVuc6JH9dQnunKhO9FMTTO1tBK1qRtL\n\tZmC8wUp8Bd0M5KGkrlauen1amUpDaUae5QvXaZVzAz6vzeEIunI19NSqNRqoxVqSM84C\n\tnrgYTfJoprgYZbFGmsEmpTt3X3RzzAI1IeeQOrUuvCCg8TDN4dOSnVqp6tVK1522unJj\n\t+GxVQEvwxBCqAruhXG/rLmvzeoOGtBRP4P4r2W086rMuVozR0ej9ivbU3MAVk9kcxpTB\n\tIE3qyvXPCzho1apvs2KoMS8Q14AmRWseLdzAGWoOKFyv+gxMaImiJajFaiS6JER+y4hq\n\tMG+toyej3L1bPwHlPiVaFVAdWpFNDYa9o7pTITpvbW+ZWym7muLK7bYkD1i6e1jSd40h\n\tQ69s1JMXBmjxVpzdaNGqvzc1GitSyzQ3hVutQisJqBrLyjeq+nyI1uaTR+gJIll0Mdkv\n\tFLUUkHaamGVRlegFoJhQz3xxNSb8HUbKslwAg2hEzmD0aRj+vq05nVpOjhEpJg+5llY2\n\tI96f5MpdpfnVJoui+clkUBmgQcGCPDK5w2F4eVPMDTXU0drmBgb6CtTYesCd5wxqLGRQ\n\t9n1PSbvZoLR9TxkcHlIpsnfGbxJpmpw9+EuypA/3RQo0TP8/yPUD9BLax9FoiaqUREPR\n\tcExvq1EVixrt9vujTT7afwMrj+l9m2xayeagZglFkMynDfcEuI0ZsUctZuNBF31GUGKg\n\tnERAX0smutQkO5KzqKLTFS4pfN8ltwgXQRH2ERcw6NKPMyvdY0wwHCrciRIKAJQeuRDD\n\tZW6b/PwwM98q3CfhSrO0MjmttLTc/HxyWeqCVVbnHMv52Zfn+Oq9n8y2nCY4fwaKLn9Z\n\thMkpU4HK1AnjcQTjKqNPn4mUwCQ1M3vSjZPx0wlTb1non3ggtTwSKS+LLBK3Zfe/cfkW\n\tthyvL7z4noGKlJVHaG2GGgzgsulXoduSpl8Am2ysGA6VNvQMvmn1pOk24k2I8xsEGiex\n\ty81wWt7f/1j/4/ITgxSDajxMIhTbT9/tQPfJOqoHZC0geQvITIzuU6kwnRgLhR6yokFF\n\t+ko33jQ5fXeCd25xZdktTk+4YXHz7KriRrrC0lqNR7/JuHNe4zHoZNwYf7Rn+Uh7jF/s\n\tpdeUGJrdGWNW22+hspCK0jq+1d3KX37Qa59iWWfpQw6MHd7VNNZ+6ORwewz7e0+OtOfN\n\tTMAHoIgKg5PsIF3F7Oyge/5rqr2pta2VtZofND9pfsm81/yWme5hlgT2dsKJhHMJPInb\n\tOftPfpbrnOcpaM+8LfOsoitCkpKnFCkVSqPSqrykmJIy7ZkVmbxtOVpmOlgTKFTGU3FT\n\taafyFBVpEGtgeJxWSS02iCd9qW9hTe5EtmNdpr1tHW7siumHe63p8bf7emv6U5+a7E99\n\t+owpfUnnnqyBquPp8faOpxPGpz/dmZMwUMVwQs/jZnsfToDH8Ua3xXwFLSVZdsdY/ss3\n\t2xJsCe1/wOcoktvx1/Fachea2i+a2ttM7UtN7YtM7SFT+89M7QHTWDlTVuQx8ig5gy4c\n\t6XKqnCJb5GHyEDlRlmVJFmQmg5wa00+4JxiuT6V/HRDSJYvxkowdAkK8bSElKZTIsxQb\n\tDGVG9xD0a/tqwV+jaH+fr8YwcW61JqrFqKX4wV9VbEVtOPcz//xiLd/pj8kwT5vi9GsJ\n\tlbcGuhG3BgmrsY3x4yWGIw3UvTbjZNlNXy7z7t1iM976vVuCQUhfVWQtSpmRPLXEe40q\n\t9AMy5HX+82P9AYX+yrV7wY5nyWh2VOJ1aq/J/qTJ4PHPJ2J7nNgeJ7YjEdsHiNbRWod/\n\tfkDbMTqoTTQa+uhgb3XfhqM+OqRCqq+eSkjbtCpi1dpqFKV7Q59BoLMiO1RTGzHe4Xqt\n\tT633ahtUr9JdHR/3I/JRg1ytervhqK8q0H3UXe/tqXZX+9SwN9jb2dLYdZWsBwZlNbZc\n\tQ1aLMVmjIaszPu5HsroMcqchq8uQ1WXI6nR3xmWhb/H8YrJVoFuG4qBnwcC7l5kTyT0h\n\tmyNYHPfTNId1va2PXcACMNMpMoQ+PoZSMVzomumaSSQP88RJw4zvku9I1vXTHLY+LGAX\n\t4iQLoZMpaPAHLxmtZmdzc/PKFqpaVkLLSoJm4miOU5zQMsBMwfi/LcjbTgplbmRzdHJl\n\tYW0KZW5kb2JqCjM2IDAgb2JqCjM0NTYKZW5kb2JqCjM3IDAgb2JqCjw8IC9UeXBlIC9G\n\tb250RGVzY3JpcHRvciAvQXNjZW50IDc1MSAvQ2FwSGVpZ2h0IDY5NSAvRGVzY2VudCAt\n\tMzE5IC9GbGFncyAzMgovRm9udEJCb3ggWy0xNzYgLTIyNyAxMDc2IDkxM10gL0ZvbnRO\n\tYW1lIC9EUUJQSVYrQ2FsaXNNVEJvbCAvSXRhbGljQW5nbGUgMAovU3RlbVYgMCAvTGVh\n\tZGluZyAxMTEgL01heFdpZHRoIDEwOTQgL1hIZWlnaHQgNDcxIC9Gb250RmlsZTIgMzUg\n\tMCBSID4+CmVuZG9iagozOCAwIG9iagpbIDM0NCBdCmVuZG9iagoxMSAwIG9iago8PCAv\n\tVHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9EUUJQSVYrQ2Fs\n\taXNNVEJvbCAvRm9udERlc2NyaXB0b3IKMzcgMCBSIC9XaWR0aHMgMzggMCBSIC9GaXJz\n\tdENoYXIgMzMgL0xhc3RDaGFyIDMzIC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+\n\tPgplbmRvYmoKMSAwIG9iago8PCAvVGl0bGUgKFVudGl0bGVkKSAvQXV0aG9yIChQcmVz\n\tdG9uIEphY2tzb24pIC9DcmVhdG9yIChPbW5pR3JhZmZsZSBQcm9mZXNzaW9uYWwpCi9Q\n\tcm9kdWNlciAoTWFjIE9TIFggMTAuNS41IFF1YXJ0eiBQREZDb250ZXh0KSAvQ3JlYXRp\n\tb25EYXRlIChEOjIwMDgxMTE3MTg0NzE0WjAwJzAwJykKL01vZERhdGUgKEQ6MjAwODEx\n\tMTcxODQ3MTRaMDAnMDAnKSA+PgplbmRvYmoKeHJlZgowIDM5CjAwMDAwMDAwMDAgNjU1\n\tMzUgZiAKMDAwMDA2OTExNCAwMDAwMCBuIAowMDAwMDAxMDk4IDAwMDAwIG4gCjAwMDAw\n\tNjQ5NjMgMDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBuIAowMDAwMDAxMDc5IDAwMDAw\n\tIG4gCjAwMDAwMDEyMDIgMDAwMDAgbiAKMDAwMDA2NDYxNCAwMDAwMCBuIAowMDAwMDAy\n\tNjk4IDAwMDAwIG4gCjAwMDAwMTM5NDkgMDAwMDAgbiAKMDAwMDAwMTQ1NSAwMDAwMCBu\n\tIAowMDAwMDY4OTM5IDAwMDAwIG4gCjAwMDAwNjI5MzcgMDAwMDAgbiAKMDAwMDAwMTYx\n\tMyAwMDAwMCBuIAowMDAwMDAyNjc4IDAwMDAwIG4gCjAwMDAwMTM5NzAgMDAwMDAgbiAK\n\tMDAwMDAxNTM2NiAwMDAwMCBuIAowMDAwMDYyMDE5IDAwMDAwIG4gCjAwMDAwNjIwNjQg\n\tMDAwMDAgbiAKMDAwMDA2NDY1MCAwMDAwMCBuIAowMDAwMDYwNDQ4IDAwMDAwIG4gCjAw\n\tMDAwNjA5ODggMDAwMDAgbiAKMDAwMDA2MzY2MiAwMDAwMCBuIAowMDAwMDE1Mzg3IDAw\n\tMDAwIG4gCjAwMDAwNjA0MjYgMDAwMDAgbiAKMDAwMDA2MTAwOCAwMDAwMCBuIAowMDAw\n\tMDYxOTk5IDAwMDAwIG4gCjAwMDAwNjIxMDkgMDAwMDAgbiAKMDAwMDA2MjkxNyAwMDAw\n\tMCBuIAowMDAwMDYyOTc0IDAwMDAwIG4gCjAwMDAwNjM2NDIgMDAwMDAgbiAKMDAwMDA2\n\tMzY5OSAwMDAwMCBuIAowMDAwMDY0NTk0IDAwMDAwIG4gCjAwMDAwNjQ5NDMgMDAwMDAg\n\tbiAKMDAwMDA2NTA0NiAwMDAwMCBuIAowMDAwMDY1MTEwIDAwMDAwIG4gCjAwMDAwNjg2\n\tNTYgMDAwMDAgbiAKMDAwMDA2ODY3NyAwMDAwMCBuIAowMDAwMDY4OTE1IDAwMDAwIG4g\n\tCnRyYWlsZXIKPDwgL1NpemUgMzkgL1Jvb3QgMzQgMCBSIC9JbmZvIDEgMCBSIC9JRCBb\n\tIDw0OWU2MjQzZGUwYzBiMTQ0NmRmMDQzNjRjNzc1ZGNlZj4KPDQ5ZTYyNDNkZTBjMGIx\n\tNDQ2ZGYwNDM2NGM3NzVkY2VmPiBdID4+CnN0YXJ0eHJlZgo2OTMzNgolJUVPRgoxIDAg\n\tb2JqCjw8L0F1dGhvciAoUHJlc3RvbiBKYWNrc29uKS9DcmVhdGlvbkRhdGUgKEQ6MjAw\n\tODExMTQyMzU4MDBaKS9DcmVhdG9yIChPbW5pR3JhZmZsZSBQcm9mZXNzaW9uYWwgNS4x\n\tIHJjIDEpL01vZERhdGUgKEQ6MjAwODExMTcxODQxMDBaKS9Qcm9kdWNlciAoTWFjIE9T\n\tIFggMTAuNS41IFF1YXJ0eiBQREZDb250ZXh0KS9UaXRsZSAoUmVwb3J0ZXJJY29uLmdy\n\tYWZmbGUpPj4KZW5kb2JqCnhyZWYKMSAxCjAwMDAwNzAyNzQgMDAwMDAgbiAKdHJhaWxl\n\tcgo8PC9JRCBbPDQ5ZTYyNDNkZTBjMGIxNDQ2ZGYwNDM2NGM3NzVkY2VmPiA8NDllNjI0\n\tM2RlMGMwYjE0NDZkZjA0MzY0Yzc3NWRjZWY+XSAvSW5mbyAxIDAgUiAvUHJldiA2OTMz\n\tNiAvUm9vdCAzNCAwIFIgL1NpemUgMzk+PgpzdGFydHhyZWYKNzA0OTgKJSVFT0YK\n\t</data>\n\t<key>QuickLookThumbnail</key>\n\t<data>\n\tTU0AKgAALDSAACBQOCQWDQeEQmFQuGQ2HQ+IRGJROKQoViABCsQhoAiEKA8AhR2PF/ux\n\tvuZ/t9quB/NWKy+YTGZTOaTWbTecTmdTucAYCAADHwwUEzlADGcLA8ABaISd/N9PLV9p\n\t5FKZ9op9PwAPqeV2vV+wWGxWOyWWCiAMAEQMRMgtihsJAANAABAKBAoEgB/gYDAAAgO7\n\tP9+v2/Pp9gB/PV7P4BP9/gJpt1+tMnHh8E5wOh/uCzZ3PZ/QaHRaOCT6gN5XA1vhsIv8\n\tNP8HA6BBII366wYAv+BbqB7x/P6BO94QJ4vMAMxsP1mDs0vcd1mt6TpdPqdXrdNIHEEp\n\tI3lIBm0AbGBBQKwfgQjHboA+uB8DHQJ+ul2PwCPZ6gQ9Jl8npDqR9kO68AwFAcCQKh4G\n\tLyBx2FsBp1r4AIDACDoQIEwC9Pe9iDt496/AC3qDH8wh8G2cR8sUf56BAKp6hAeh7gAe\n\tkDRlGcaRqsxGDaBBJjmKwCDYAAIgmvQIAgv0jSO9MOt3DEMve3T1IOfZ2HcfgCnmeICD\n\tuS58juqqrxtMEwzFMaIAUA4AAYdpcAadgEQjM4OhCgTbt2hbeQ/KEPTrPaCRCAB8m6cR\n\t9OKfx4BCKp7BCex8gAe0yUfSFIxkQw0gQRo8i0Ag5H+B64gCCIKIE3ML1FI9R1IgzeSa\n\t872Mc4E9ABKUqAKeksDkSZ8jkR5VH2R9JV/YFgs7NwAAVNQGnaBUIgQAAOBFCqfz4gkn\n\tr1I1YWpKD0NwgZ+K0fRvnCfZ2ngfx2BEK57BEfCuHxYV3XfeCZj+MYDkOQAwAKPAAAhI\n\tR/gi8sPT0f73IG9dryXUsLvVVdq1FgVq1gfR0nafYDHseACjaR58jaShXH2Sl45FkeSI\n\tM0wEHcXIHHaBYDn+BR/g6Eq/AGAeCt288j4bhuGSVVGeYPVFW27WJvm+fZ1Hcfx0hHdA\n\tRugrmS6lqdJDwLwDkAQ4ygKP4AAfIQAAkDE8YhDeISNalYT5D20oLbGdW2fJ0nSfQDnu\n\teIDDQRZ8DQTJZH4TOqcFwcZgLmwDzVlYGgSf4F2aEyBAIAsPz3DiC1hnODyTtW1WnVKB\n\trsgWiH2cBvH4cp1H8cgTCyewTH2wjD8J2faNIOQsgOPRGjUApCn+BshJCudSbTnudSfD\n\tGyc5gWCYd5GHc09+JHVup8bwMZDnwMZPFsfhPdr8HwrFCwC8SdoH8YBtmhRyK+z5O+2M\n\tRuFp/hymd214/6/e+CtH4cI3X/DoH8OEE4Wh7AnH6cAwj4oGQNJoGoKYBg5iVDgAYRgA\n\tHgECAmBxPCqlTtuaE8ZJbCyCNsYGz6EMHXnIfHwOcdA+QED6HkAcLwhB8BeFGLkfgo4H\n\tQ9h8Q8ASHgCDsFwA8dgEQFD9KUBwFRenJPzIUbpV5DU7m9VVFZhL9FssOfsk8fZXB/Dj\n\tG8P0bg5B/DcBUFwewKh/RSh/G+OBAgyBNAMGwTYdgDCTTQv0CgHW0J2Q1Fx+61FRJOZv\n\tId4jZyGJ3iqAAfA5RywwH4PMA4WA/j4CwKkXw/BUxxk8+JPQAx1C2AeOoCgDR+lxA2Cs\n\tgQBX3QgQ4/GFDOWEIdka/dz0UZEPPj+3A3kXwAD9HIN0fw1xwD9GsC4L49wXNmk/M9qg\n\tXAkAFDIKMPYBxNgAAXHwD8KJYwlZxFl+kWXLOeliteQktm1zgaE/pao9xyDiHwAkfo9A\n\tEBTD2PcKYrhhD9FdNCgDJABDoFqA8dIFwHD9VCBsFjkUzv5Z252dMsn7SyQyb8hU6JCu\n\tVkQnVtshx/j6UYP8csxBpGSGkDEMQ9wY0BpcsIKwQwCheFSIAA4oVilxH+BRZ6GZzLWi\n\t6zeNznXMNueS9GEjZFStBlxR9hI9hxjhHwAof09gnB3HuE4WYxh+izpfV9MYAhyiyAgO\n\tYDQER+AXAABmhpQC8wpL0qyir+Jbl+mctKQNEYsPHYLIyQCsV2j+HNMQZpyRmg2DMPcG\n\t1YLGIzCeD0AgVxYCGAQKinJAgKgkkC/Wdzb6JV6kXFGRtTmfSGShaNgsHyBD2HEN+qY/\n\tx6gICQHMe4SBcjKH6LmxtuzrACHCLACA4wPATH4a8DILS/AGAVXmEEunPrai3R6Dz9rm\n\txUupZtgo+kXj/HONwf4xxqD9GODsNRzreXnNEEgG4BAoC3EYAgV4AAEm1H+BYE8UGFTe\n\tivUapLP6O17VHOeLE7rQRanVLijcWTgD1HENwe7jh7gJCGG8e4QxfDOH6L69GGyxgBG8\n\tK0CA4AQgWH4B4AAGLkAAAOAyv8Vb9zfv3f65kuSE1+kdAtdaFTAgML65y67lG1G8Hyo4\n\tAA6RuAAGCM8fowQgBuHuEDDmUSeBBBkAMJIvhIgJFsAABCRQAAXBTfxDrAqJ3Wc+5tVr\n\tya+tuH4YQAI+CtSOdlLQg60WvLMLpc+vipa/D0HCNse4DABYRB8GsewPhhjSH8MPKWjS\n\tZgBGyKoCA3ATAZH4s8DALiBYrrxOSutd8g56nYqhDg+XZZwdEzlO7oQHA5labUAA7KvE\n\tFdDBih4BXQ6huciYgQ6sji7GWPwXYRg5D4CNo7ZBEwdgtAGEEYglgEi+H+AgpQAQL3Ic\n\t3qNs0W7SIfim0FnJ0B/6mMLqpkzwwJhKg0E3TdaiCpqIEOEQxAh/IvIKBSt8QWEPFlqh\n\tkeg3xsD2AYAOqYOQzj2ByMgaw/hkbJ4dRkaopwIjYBUBwfbkAL6avkUq6uNVU11Paed2\n\tBetyABH1nRPYAnHJACEQICIRyBANBhIIiA7xgkCG8HZOZuwJF5YDj+D8tx8HGABr4AAt\n\thjj8FsEsOw+Al8P6gQMGoKABg7GUJsBIxMVcc0zqKkCTIunn3EPkrQAeR3VADQ8B4OuX\n\tBEIEA4HCFaHk1HWLEgQ4t5lA1Znh+GoMbEH3+NXgQBB9AKBoGQewNBmjZH8M3qOyAAjQ\n\tFGBEaYLwQD7lYBbFN8682d5CQIedI8234uT28G5AgIBBIEA8HaFa3lhHEI4gQ6xVF3J+\n\tP8BLk2Db9xpyAgQ9zh6xG8AAWAwh+CwCiHsfAUfH5RBeCQAQNBnifAUMrtIDkPAYpaw2\n\tpzbU9OYN4O7IgArlnh1cvsH3pkK54NGNpH4AB5+Ogw+401EHPRTo9UDeiMBweCAWAGHy\n\tASBgDCHuBgpOH8Gk+at2ACGWFAAiGeBoBGH2BeAAAq2wASeC48qM5oN4Hg3sBKe+vkQo\n\tQMGkCSIEH2Hi5czw30p+5+f2IUPOHwHeIEJMAAFWF+H4FWCsD8HwCtAUq+BSIwBcGqFE\n\tAUGg7SAa+yBoIeeQYWYeWqVeHoUYAAA2EC9Q9aQEH1BmAAGo3YT2AkzwSazWwKWqzQqK\n\tWoHqG8GmHsAUAGH0AQBYC8HsBYGuHCH+GvB+meACGME2AgGUByBQH5CWAo40AUVCwI46\n\tr+HsaiAgC+IEAwC0QGHmGeIEG2DcQqN2AeTPBc28/0VOrqbU5QHsHaIEHaG+AAFMF2H2\n\tFMC2EEHyC3DyjgBKA4ACBUGyFMAWGoQgAYQ8Ay9OT2o0z47BA2wO7IIEAMB+IEA+X0QE\n\tHUFgIEHIEbGOdCAY7m88rw34o42+YSHoG6GeHsASAGH2AOBSjUBSG2HIH+G3FigcGCEu\n\tAgGMB8BYH41dEILu3cwQxpE+unGIowVixMAABMEqQGHGEhBovivkWiAQcmues6VU7+qK\n\tcuIGHqHWIEHdFOFAFsH2FADCEOHyDDHYfABCAyACBOG6FSAXDwAMAWPWAw/OzSv6nGue\n\tSatGjaL86IAABcFkQGG2DiIEHoGcL0AW90AMZsz4bKl2rk36eYYSliPeHoHAGcHsAQAE\n\tH4AMBMgMBMG+HOJTJCcGF2EkAgGCCIBiH4/SAmxSAWAy4+lg/1DKSYc606HiHqIEBQss\n\tKAbAOoGoCnBPFI/mcjKM4826s8Z05QIQHqHQOCHCAAE2FkH2E2DMEWHyDNK8ZKA6AsAC\n\tBGHAFYAYG2AEAKASNyAy9a93ESxmrm/yTy9A3sA+ES5jAoNIH5LoAAGmCYbcAgWYp8Ig\n\thOl8kQMIljBYQ5JtKgGaHsQiPoBICwHsBIHGHUH+HHMqXgFoEaAgF0CWBsH4CKH+AkuQ\n\tACAYeHA0kXH4xcnIIGHsXbAqDWPG6eNIHqGwIEG0DUL1KMACAdDCx+xkeOVZLiME5oly\n\tN8HoHKMeHiHGACEqFcH0EqDYEeH0/fOiUkAyAmACA+HIFeAYG9M+ASLsA1GSz2IAAACA\n\tAA/4NAoJBIPCYS/4IAYHBodA4HCoLDoE+n3BAWTIIGzNDJFI5JJZNJ5E7V3BHGiIIBAF\n\tBAYB4S/oTEYLAoxFpHGIhF4nOYtO5/PIuAHq4GU9wIAH6AhCVnsIXO7X+55RWa1W65Xa\n\t9X7BYbFY7JJFciQetCiOn6SwAEhbBAaHaNJp3DZLO7vN7xPH2/IIAxjBBCgLLh5E5k9B\n\tHUp4IB6aAASBZrYL1KL3dYVPoi83C/wC8XIAUgqn0kDik30ccRrddr9hsdlYgsEACG3O\n\tsgY4gEBARMQ0QYfMYdQbzIoXFZzQeVDOLOYpBH7gAA+wrBBOmdnYnAg4I8GHBMnBchAu\n\tbJH/NqJy4PEPPBPVfPRzou/QA9nAyHuAX8/n+EIqqmdR4H+dTtwPBEEwVBYAFQQgHlcK\n\t4fn6KIAAiuIAAaD75uczjMsyk71vg+R/vsAB5uoFhXuHBiTmyNCCHubyZJoACYIezbjM\n\twvrkR5HaSJsfx5G+fwBHmcwBEUUp9EUO5MH0O8WylKcqSqAAJgcAALnSWYHHKAYCgMAY\n\tAA0ISHzG9cQPons2JGirkqEkp5nsggSk4x4MSshZpiehR8oKBoEIEmLLM3HyHoi9LzR4\n\t5SDxEhTAPwZB8H8flKhAKp6hAdp5AAdsrVBUNRLGUI/AcVAvCKfwrwsFlABFRcOIan04\n\tqyjCFoQzUOome0/gADo/rkGUrHydaCGwLscIIBwFR44r2qLWqjADW9HxNXM3varSHH6e\n\tBtn8AZ6nQARClCfRCj4Th9D5Ud23dd6CAgBkrnWWoHHSAgCALMYNCKwMx2krdqLq56H0\n\tc+WEJtOLlHufSCAoMmHiVKx5mgghvD0l6KgXQSR4UkVGrxNOFx7XWSrynabHub5iHwfZ\n\t9n+fQPioeoPngegAHheGd55BZNDyBxQjKJR/C9CwVrkEllYCrdn0RNc1TVQ1cgAfLqAZ\n\ticyDFKx2FqghykqggDUIBMa6Yvbnujk017PH9HoOfp3GofoBnudwBj+Tp8j+QRQH2QWe\n\t8DwTEAaBIAAgdpcAedYCgIAYCH+DQjUGyNtq/XDj6W57mMq6rqAJYYABBjMqnKTaCHaW\n\tGxMi8aj5BWfNWrzWEzogzAIG6h/9yjcRoK6k4owfs6Huc51HyfB8n+ewPinmp5nvE/B+\n\tl6atEmOgGk0Ngnn+MvD6QAAHBMu2EKH8jl/NtiGPfRWlvUfqbACfgLoIExJSsb/AROZS\n\tCgQygApiR6jooY/noLUV8P8fB0k6EFgSQR3gAGPtvKArEoRBn4HNIGPseY9R+AFH0PoA\n\tgehMj5D0IcUg+xDvUhVCtjj4B3C4AgOwAwBQAgFH+BsJJ5jKNUUeh12ZfVGsjfhDx1x7\n\ty+k7HqiYFRjoKILGyGogg+RyEcAMQQATCh/DxOkPMhQ9SFMOh4rci0F1sk5iGTeMrVCG\n\tH9aWyQgp9h8DpHkPkeg9R/jzUwpoesCYvQrj8zwRobgGCTDkFUAAbAAAPBUvGRcRVDpu\n\tjErJzLJ31NTkoQQej0AAJ2bEBJBRCxor+Oqp8AADIHu8Oax+NLA1lPskuUYzkln0yPOS\n\tTYfcc4Oj7HyAQOolR8h1EYKgfYjI/zFVEAmKoCx3i5AgO4A5lIqgcLcAAAUO4xQCZDG4\n\t5C0D0E+kirFXDBSdMIj2QQD53gAALBSgofA5iCDOBsSMCS8yhrabRGhEUrkQHKWuTibD\n\tsCJEInuoiLEUR1DyH0PAeY/h3oAKmw0AEmpjUTQWIUNIDBGh6C0AAOQ/wHTrACBFV0rW\n\tPldakyVtL61tRoIVSVDg93eAXDSQQCIQEFDwGMQQawVjAkVWY08gtLo1ENPijhtE3FnI\n\t/VzK59Eb04y3ZcAYfg+gChvEiPkN4khWD7ftRSrxspnmSmWBEd0yB/qCA2R4AAA2zI5q\n\tGrapUk2mnQqXUIfR1AHhQIIBaniCR0CmYuHZsTAIWvtkeSVRrCnMVARKwsopyZ8wRJPK\n\twhg/T7D6HYPQfY6x3j+HUCMK49gRj5I2r6r9pyyB+DGAsQwgQwABDy+AFFNAXohlm2wn\n\tFtk2xEcufCWI/2XkCAQDkggHA2oKHAIYgg5hLGPh2AomlASIIguoiGVSPGFLRdhUue0k\n\tnOyVaqO9hoBx/D7AMGoRo+A1CXFgPwS9qL4FeX2AAA47xdARHeAu8jhgNhNMCoJtM3ag\n\tNMlYh+ult2SXSpVUZqY+h0wOk8AAFcTEEDYJCAAdwtiCAKiqACGcbaiNPwVdV11Aq6Uu\n\th6UKbNQcRLQMuTyNg+7Mj7HMOwf45gShYHsCUfZ9oH3xyASMO4XAFB/EQGcARhgGgnII\n\tBIGd37wQVVotOw8r5tWKJItFW7Ch+IGOrg+CEYB7gLIIDMZKChohHIIPUapcmOgDYAtG\n\txVJzmofyxG3EjJbH5zsni8kg+B3j2H0Ah3QBgyCIHwGQTotR+CdyDo+tZMQC32AkO8mY\n\t/AFgBA4n0f4A3DXaiOdCk59IBSXglqVN51MuwOHQQqB5yj1Dxi8AEGo2DA1tNgMmdZTo\n\tuPgcNNRgD5yJ4FpZixkeCsoomxSfPAN27Hn2KIwOyGPh2wcHEOgf44QThaHsCd95TtIW\n\toDgFcBQdxHhsAES4Br4krg1J7qOb7lrcNMrgAAfg7oHDji+iSoRDB5M4AAC4Xh4gRmwH\n\t1vgAAzbauuAes2JsQK3HnMzsSWRD87wUz9LO6RIqhRGghREdzyHDD8AOF8Qg+AviiFyP\n\twUW4aJgCIGAQdwuQJjuAeAkfYDQAAbQqjbhzJ5/Ym3rONN2zrtxrgWPocB8GcYjbXOIA\n\tI9YFgjMWhYH5sB5jPIINQJzBllz0YOojjNSnZMgUSfbj0QbHdlsR2zEh/t7DuHoP0bo5\n\tR/jcBUFwewKu4b95c4EMwUAEBuEyHMAgkZSglYeDqw+BuvQVqaTyb/Ht7EEH1vre2YGA\n\tlEqPqhGMmgNLBAABgLhsB1orAANwNzGiCgK0/Bi7ERc6ocLuiDjqiSgyx8ks/Yca2E2M\n\tuyQMew7R7D4AUAEfoCAsiAHwFkVAvR+Co7+4MioAx2i5AoO0CICh8gP52FMggBZ6LSOT\n\tEaxa294EE1W1UcJCTqbSyn8C7xInkZNDDOa2Jrxx+IAAOSYjDxgBsrp7iBhDtxkR8zsa\n\t3ZqD+JqiyQzTZo6QmxboeofwbAcIfwa4FoLwe4FreL6ZdoMIJYBANITwPAAi5oBhpQf4\n\tCgHyoaCRtbKsBQhqMAfAbaN5nS6bKjULoripXSD48QIZ+i5o14bgOYggdYVS5wggBDDr\n\t87FUDx87LTPL3yH7KxD6e6C7eaWBQwezkL4wAT5IKgPge4KgVoYIfoVsD5d4AQdYW4Cg\n\tdYCgBgfKTwDYKT8L7yuY47UozAjAfiUgfIbrVz+beiAMFzLL9SB7xQAAFoWQ2AaiQxE4\n\tZA8TDpxsQ53qbUBJ4C6yxxRhR7PkKrfr+L8qlqN7aAeIe4fwaQbsVIGIMQe4wcNRUILA\n\tIgA4MAU4P4AoT6dJpQAACw4TZDd4rhqROBEwfMGx3RYziSRz3SpkSzj5NkUY+BEwe5jo\n\tGgZw2AZqeIAAfQrCdJGrOCbSer3qbccaHjvyI8UR8q7Q4ruDUCMyNTtQnjFbj4eodofD\n\tMYAYfwBIJwO4e4JwWYYwfoWcWJKYAQdAWoCodIC4Bwe4ChMgKgx4CK3ZbLUpp0eC7BnR\n\tqobQ+CBplC70YCHzoUeL8wjAeSPoGrNqtbn4sAfyMAZMXgoQBzX6t8kMkbAScbBRkKC0\n\tmh18dEYKNTsalKgC7qCBIIeUVAZobAf0bIMwe8bUghBIKQH4AwLIVoQgAywABZWEXpyb\n\tFi3q3QhgfQcTyzpcGSbcQbycm8eJ8ZE6BYFoXDDbdgsJlYggaEFokSn8PJOBgjPEHccx\n\tNyNJgLArxwgUUMQbEJRYeodge7MYAkfQJIOge4JIXAZIfsuEqA2QAQcoWYCwcwDICAew\n\tC426voAwCcKMnsZ7oZ3SBga4gQfodiH7jbfkcryCR8ebqDFSMptIeqTQEh05CxMwsQeA\n\tYIgga70qagiIBjT81D3joRRjFTZ0tI+C7JqZaLtRtKxbaK68S8LR9j+DizaAeQfAf4Y4\n\tagfwY4HYNQe4HczA14JYHIAwKYWgRQAwVgAABQEAggC6HKcEwiyhRKM4hSTQe4aQ+CBb\n\teUjxWricizykKal5XwDYPoggDBowsQdAUYggb50hxzDbXAuzF825Dkiiobi7jzEkaKCr\n\tjpNJRTLUKi8AegdQe4ewBgAwf4BQIgOAe4IgXoZofoXs9osgAIcQWACwcgDoCYewDRMi\n\tvoA468sy3hkofk2CiIawi4jdFrEE6pZzibo7Ubo1LUn8H4t4L6cwPYsYcAQoggc4TBsS\n\tHZ/sHTjibypTWE2wmqorjAm9E7Ok7c71L4o7ANOgpxEwehhwYIZ4foYIIANwe6m1IAr4\n\tIYGYAoJQXgSAA4Wof4BJDYAIDLrq3SHqb4fIb7y0QNTxEhWkdMHptsPMmtLQjC4M+8II\n\tAAE0IYsIbKmbDAWkJcShytUxg1OUsBtik870wNPL2TeL2ySBacK5WTKYeYdQfAewBtGo\n\tBQHwNYewHwYYaQfw8NRwrIAIbwVoC4cAEICweoD1JcJZ+boskD2oggfDWw6qKddk3Dob\n\td6AUJzKcnJQxka3QfhEwATdgFoWIsYaStQeoaMJbACGghDyj3aVpD0vjojozFEBFZLEr\n\tKkw0nrjYy78rF5SzNZhwXgZgfgXgIoOIfCUVbokgHYFoAgIQYgSwBFH4BNc4AADLnsQj\n\t2UUiiNArezLz872dnKMMBVB1i8Hlo0GDGBhQfLhwGgZgsYZQFw6Qd7DbX4AdhrWETNYp\n\thbF5NUc5NrPcGMLZk1osTUeQgYeYdIfAeoBoA4f4BYHIM4ewHIZAawf0SVlQh4bIVQC4\n\tbgEwDIepWADUSABIDaR0m7yp5TrT5DfFjtXtpKbs2jo4zaIboL2FiLK1yiNSDYggG1eA\n\tAZjorIfjgAZaRooQBbhxQkcNzVhsA5HUCEBrjquU09YVO8HNxycET8mxkVj7qJhwWwY4\n\tfgWwJYOwfCadRwGwFIAgHYZITQBAYgAABADgj6vskLEwiYfyBoe1p6CDgDzb9Ir0vdBU\n\tn9zMtBEL+IebgAF9H4yTgorQeteAaUrooQBjMjojZbEs6VslsUZ9/FVVnNPrxr2kZi7J\n\tqVZwfNtltwBYGgMgewGgZobMpczAAIaoVADAbAFQDYeh8QDKvoBQul/17LNbM6CFA7tj\n\tjViETDKl8F61yZ2MKrilpIeyBYEwUBeMu4rIdwXQggbJiIf5QgAIBTn9VBXV8TzlZUGM\n\tnbtKgCfF/ji9VVEa3LKJRTaL9xEweojYWIYYfgWIKAPQfCvUNQF4EgAQGgZ4T4BQZQAI\n\tBADRagDYLckS7CBIf4erM4/l70tWF1rks8i8Hd3GFsv1EK7lytiwnce4ggDoQk/QLIrY\n\tc7RwAAcAQIl5QgBF0JzdhmF9h0/svtpMZrecBljj3UrzPRN86iSye73LAb31tOBAmdGw\n\tGAMIe4GEVUVLlwAIaAUgDAagF4D4eiRYDMSABYEMHqBCTFvGOlzGF0kGQFKF8uItZdQG\n\tTOZxgIfJXwCU44DJ7orQcoSAxj6QAESq+jDtoUBdo82seU5o91ndBFYNLOUbjTA5zVjM\n\twS7dfwggewwAVYX4fgVYKwPwfF6q+IFQEAAQF4agUYBQZ4AIA4DIgYDlMl3JPyTAYqLs\n\tvlT9E58l/S6mIjYUnmc8tiV6cKoAjSKJP9fmZwA9Xd/lZY4+QmdEBVr8Kzx8K8LMAlpE\n\twYlFr6ygh1tIfQeoBdGoBIFoL4ewFoawcAf9Kq04AIZgUIDAZ4GYEQegF4f4DMiAAIBc\n\tRSNZXweuiiCDXtBOsNP1dsr+sSWjPx9b4NMGPloJt9PSxlEE5+AauKpM1CNk5lrZk+ji\n\toV8Rttebx6x+uLyw6ge4+wUwXYfYUwLYQQfOOCigEoDgAIFQbIU4Bgah/4CwgYDwMYno\n\twAf4el6A/iLSerEFBktePW08cmTEnBbTFdYVL2s+uVswheu46c6eQIitDjSI+WGKNzAs\n\t7Y52tVsYk1ErUKMhkVFgorWGU1/eu25hg9yV2gvFZwfYeoBSGwBAFLvQFIbYcgf8GyP4\n\tY4ToDAZgHAEwegGYf4DGq4Bi2Z3oegY46TL0mswMwh87Bmc+KW2VVmZNMGJUmmjW4ExG\n\t2xqqA92dyAjBfNNqNoistetEn2QY82tNo+I+tjUdEu0zzuOM6rOkxAhYfgjAe4wAUIW4\n\tfYUIMAQwfIMCFQEWNoFAbgVIBgax/4CggYDoM6oAewZaByKbyTBG1GPUJy29L21+Tmsl\n\t1dw9pAfxEwfCBohYhYA1dQBSRoBZ74ATX7Nme4ald0stVQA5ju3V/+PPDk6uUvCi2+nc\n\tTdsFPzKWTOGNoPNoo4eYdm6oBIpoA4EzbgEwb4c4f9URwQYITIDAYwHwFQei4gDD8BDK\n\tkYe5iyBEQNy9P+eJDu4+PmZiAO1sKtYabfSuj98Bascuu+Q51wBYGAggEYRTDerQsAfd\n\tqgAAb70Qdr1D84A5GucOALUliWvXClinBjeMc7ANssUWULsUvpOFOU2T9RhWwoAATYWQ\n\tfYTYMwRYfLC5eAD2zIEgcAVoBkjYAoCYiAD4NbyxGaiLrVD8w8vzUyld8ikxt1FybNFH\n\tIJhXUYf4yIDb1bnZGAgTYI2IdoW5i5KI6rhAhgBLN91XIpXWnCw1VedvAFjOKJ9WE+ur\n\tFaykxG4IAAegdgfgew8oAoEi0IEgcQdQf8sZdoXYSgDAYIIgF4ekFoC7noBVJRE48Ih2\n\tmt8ethH2FmPXS4zG4Qu+4EBMaPJ73R479Q6gEpsJK8/hKge79oAAaSUR4RpfgqK1YmnJ\n\tWVQNBLj2mNFzBHYetdsztuU9o4fXJgmwSwVwfYSwNYR4fPcRUADXb4EAcYWABobyaoB/\n\tG2znjAXw+CVHndBk6G/pNvI9xG2VoHnN82kAoWu9GQggCa/yTb/hd1C5i7/IhgAqHY8r\n\tK+UGJ0sHhXOA9G5nMWusmtemmcTIy4egdfjYAomIAYEQqQEQcwqydxKYWwR4C4XYJIGg\n\teoIkXtToAJT5EpTsKV1ejHTnCXwe+8oGdKx6SayL+SH/iCNIfRXwAMPAFwXL8MiRnoaq\n\tjYAAeIYRpYBV0MecHviqCcHK3GsmttfKulY/YypHSXYvBDrw9M2htHso0B5IgABSKrfS\n\tROCSfRwAELhkNh0PiERhoXCIBDjmWIOcICAoNAQACo2hb7c8PAMMf7/iQAlMLk8Llsrl\n\tUymENmcRmM3l8smYBl8xm0MAM3oMOoFEoUwmb4e0LDJphYdOcrqlVq1XhbwYsLaxXlEL\n\tBIIhYCnc7mc6m9npAAoc0hj+l1mr8spNvmsutcxnd0nkmtUunFzvU7uGAllwejsfj2Ac\n\tnAIhKr2ELpd7/dNYzEOV6LCy1KA4exKAARG8sAdNn0Nn9ph9ou8quGOiFnmsqvdGmW0u\n\tdsoz/2Op1tK3eEusRfz9hb3e8LEqVhYTJGZ6XTiL7eELZYsuYHA0LAgE1uFiXil9m8XF\n\toHB39U3102243mz4XBtlIwes1+1tk/lD5fh/AEfQAAERhTn0Rg6ksfQ6uoqoKAeAAMnS\n\tWYIHIAQCAQj4IhCwz4Pooq7w83a+LlEcTN7D6cMK4D0vlFLhoW47kuWAAYF+hYEA9Bsd\n\tx4ZocIWfJxoWAwCu88D4r5D61tUwqdRHJcVpQnqfvOuazLWtq+yQo8Otc16exA2bkHqd\n\tp/OWuB/BAKp6hAdh4gAdkeIcVRDAqV4qh6e4oAABoQRwBz5xc3jdS3JclylLqiqJMEQr\n\t5Q0wpMlEVyour2odFiZn8wp8uQAAbGsuM5VEzJrC8rJeoWAsjgM7stJtRkYog4irS5JE\n\tSUQ/K8Rc8z2K+nS9vwvVcNuux/HzTUAwGQ5Rn0Q49E0fQ9TkCIGpAdZaggc4B22AYAAm\n\tEzi1wiT7TBR8UKuvNDsFYdiUdSEX1zQr5nupoABkZMhgpUd9qsaAhoWexsVTVoC26w1h\n\tN3dVY0ut9YQ8/D40tYFBRBcj1w63CUvfLElp3TqWntMp7n65B+A+Kh6g+d55gAd7qFIQ\n\tILFULYhHsKoAAYDSwAqwSVSc2csXFRVZUJV+DpavcrxjKdG4q9Dw17S7VuSeqFhMTyFg\n\tiH9+a4hx+nwhZlBOmB+IWA4DoXbcur+u+lP2u1aY5E9eSSAFJp437y0zuWmvpLMW761e\n\tL6+44Bn2AABkET59EEP5PH0P7MAeBYAAkdhbAgdQCW6AZ/gmFK2AEj9XaKwMk7dRdE19\n\tpFMYx0q5vJoEYKNKstqFoufr4fR8qcN6Fg2NWu+EAB5mghZpiZXQAASBUTqBEss6M+qs\n\tbZW75JTvL54nJUQ+jhXvOE+9I7gmy4Hudp/nwfMBHxNU2Hjqs3qoTo+AmUYxCOfIuAAB\n\tYMoWAsCyjXqnsYU3VQLpkwrmgSa13K73pEOdqh5qZd1NFjA+QsFosSxpFeGqIbweyFjo\n\tFCkZIcHCcMQXMix2rbjVLDYUpY+DdDgKObulp6Lpm/wKPQlEr4/B7j/H6ARsoAw+ibHy\n\tH0Qgoh9iEIiA0BIAAIDsFuA4dQBgCABSK58lgAVurtMOuhdT2DeIldOz1UK8YDH0YhGV\n\tL5dYctRjY9InY+EaAYDQQsDxU4OnUHgMQrgWCHgIie9NqRMHYohYgeWCLCYapJkaW9Tp\n\twG/u3RcwgvpsD9m3Z8oN1ZcWmKuh47QAA+B3D/HyPZsCbGUJ+IgH0MACBCCCDGASED/X\n\t/wBaO6s96HyhwFXS2s3MEo0upbrA2Q0Z3AQQUrDWZLPx/tlAA+shYKhWELAaDCPZVR+M\n\tsAANFf80RzJDbQ4h0cLIyF5ke+Q4o/mHENlCYOY7TZNwzfK+OGz33qw6dOAFKrGm3gAM\n\tXM8AhyACBqEaPh4JDwBjeFYA8b4IQLj9A6AACgKyXJHhafOZLsi3TEhPPZwEloHonb6o\n\teRb2lxLtkOpZSw/lqgABEIlrIQJskMHuN8hY3HfPEGcqmDgA4OPbYfMt10657HkjWlZc\n\tUKVJRnUcrAvShHtpZnZUUlcoZhoxHkpoYQ0R+jCIgA4fIvwGjsAMAgA6RQJAoJ5LuSsB\n\tVETzds3WQ6UjYq2edVBRTHWoPjYkiWZrT1zxsmekBsBIJAAAA+Hw7zlEGkxHQJ8hY4RD\n\toxRoAVVoBITVNkIZhiSIFZ0frxPF6JJ65T6bbUs9ytob0odW9lvsyl5MRIYNoao/RxAW\n\tIrS9AZDAMj+GEAwcYAQDALJOBFcDC1Dl/mM0KBjFJKwOudGqBClGMRme68qqtrHyQTsI\n\tp0fjhy2KAT4DMhYCqLP8vSAOQY9RqkLvcQsejxpRjeJc6MAsHABMGnhF+0ZD3apev63Z\n\tdEjT8UqPFO27ryrA2pV22yYhZSlV3koREZozB+DeBgCQAUF1UkMA+PEXQDRpgOAWhhb1\n\t6Y0sRwTGCYOAFKzuXDa5VzpqPLEhhYCT9T1BXek/DCjOQCYKdgqABkmQ25nlYMAN0boo\n\tBEmutCzGc8YY3WozjVLtWLUV/bg61hdc3rOnWCw6qWMl5K/IWOQbw/R3F0sOABVoAAQj\n\tFEwAwXIOqLQXAk6BxGccbVwgPW8t1sWh4MxtaC7Fo1anjsE7kolK5E4LnvUSf6SZnaRk\n\tRMDSuAczX/qwsO1V/56q2tRpbB6gW9aJwroxvxL8itVAALEYY/BcEMowB4KQPgBh8FaI\n\tUBIYQAAIAmSwBoHNRaLP0bKS5dNlYNv7jnQKl2fSPerF5QMzq6pN1Xd5WaXoETDx/BHH\n\t5PVCUiyuTeutUG2JZy9ivb+DJmQontautx+t6xpbcW2MRPrvHFn5Da1o5Bwj9HuBwCQA\n\tgEhTD2PcMRxQLlkAAEQbgqQFiYBABkAICgAgOBAScA6EI1aAyxYPQq8D4Uez/YJiNSVX\n\tRkr2rJhNz5/q1cBCrlTQcAbxqdugla7dFt8ulzrTOm3upQ5uoKvXMcHQ2OMX6UY9TfAH\n\tH6P8AI1hwD+HGC4L49wZEQAYQwGQLAQgCDKM0ToCgtX534AwDZQwDgS5nswqtG9A77RZ\n\ty+5rzoHaO1RzLHi8MvbP6FYTdONJLc25JMjA+iMv6hnpOrTVQ9REoU6uO65u6V6ftXPS\n\tAZdK72mKFv8ho9x6KaAGPwlWRx+g2DKPcMA1Bvj+FeRBgwAANkMCGEIGQAwvivEMAgHm\n\tJouD/AGAfqgBgHEnAHnHa3I0RXZ2j5bd27249HdVdLbHio4cux70qz3fOl95+m9xHdJ+\n\tTfU/HqYiWUldmtH7OweQ8iUgP40AId38h8hUD4PgR4vxnh+hLCGByiqHmjmCGAgAQAMA\n\tAgjg/AwADAbAtgjACAJEiPHqawLwMQMwNQNwOQOwPF9h9B9jfBShdB+BwhBBQB9BQBwB\n\t0B/hYCGBtqbCsLyKYCGLzCFgXlqM5AUgPgBALAQgMgBAGFVPJnhO6QPwkQkwlQlwmQNB\n\t+GShvhzh/B2urB/Brh4B6AABliGKeiFr7CFpuEGwCgAALsQLfCGQaITHRwmw2Q2w3Q3w\n\t4Q2DxLxAAB5CGJwrJiGB1CGF6muPapBgAQxpxrevLw4xDRDxERExFO5nyHeGAQZCFvKx\n\tFxJxKRKxLRLxMRMxNRNxOROxPRPxQRQxRRRxSRSxTRTxURUxVRVxWRWxXRXxYRYxZRZx\n\taRaxbRbxcRcxdRdxeRexfRfxgRgxhRhxiRixjRjxkRkxlRlxmRmxnRnxoRoxpRpxqRqx\n\trRrxsRsxtRtxuRuxvRvxwRwxxRxxyRyxzRzx0R0x1R1x2R2x3R3x4R4x5R5x6R6x7R7x\n\t8R8x9R9x+R+x/R/yASAyBSByCSCyDSDyESEyFSFyGSGyHSHyISIyJSJx4iAgAA8BAAAD\n\tAAAAAQBxAAABAQADAAAAAQCZAAABAgADAAAABAAALO4BAwADAAAAAQAFAAABBgADAAAA\n\tAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAAAQEh\n\tAAABFwAEAAAAAQAALCwBHAADAAAAAQABAAABPQADAAAAAQACAAABUgADAAAAAQABAAAB\n\tUwADAAAABAAALPaHcwAHAAAD9AAALP4AAAAAAAgACAAIAAgAAQABAAEAAQAAA/RhcHBs\n\tAgAAAG1udHJSR0IgWFlaIAfYAAEAHwAOACwAIGFjc3BBUFBMAAAAAAAAAAAAAAAAAAAA\n\tAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbOoCxvvn7AuJW4CIyiOWp2wAAAAAAAAAAAAA\n\tAAAAAAAAAAAAAAAAAAAAAAAAAAAADnJYWVoAAAEsAAAAFGdYWVoAAAFAAAAAFGJYWVoA\n\tAAFUAAAAFHd0cHQAAAFoAAAAFGNoYWQAAAF8AAAALHJUUkMAAAGoAAAADmdUUkMAAAG4\n\tAAAADmJUUkMAAAHIAAAADnZjZ3QAAAHYAAAAMG5kaW4AAAIIAAAAOGRlc2MAAAJAAAAA\n\tZ2RzY20AAAKoAAABAG1tb2QAAAOoAAAAKGNwcnQAAAPQAAAAJFhZWiAAAAAAAABxDgAA\n\tOesAAAOdWFlaIAAAAAAAAF8vAACzygAAFlBYWVogAAAAAAAAJpgAABJgAAC5OVhZWiAA\n\tAAAAAADzzwABAAAAARhic2YzMgAAAAAAAQwaAAAFwP//8v8AAAdgAAD9zv//+5j///2W\n\tAAAD9AAAv05jdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAGN1cnYAAAAAAAAA\n\tAQHNAAB2Y2d0AAAAAAAAAAEAANF0AAAAAAABAAAAANF0AAAAAAABAAAAANF0AAAAAAAB\n\tAABuZGluAAAAAAAAADAAAKPAAABUgAAATMAAAJuAAAAm9wAAEXsAAFAAAABUAAACMzMA\n\tAjMzAAIzM2Rlc2MAAAAAAAAADURFTEwgMjQwNUZQVwAAAAAAAAAAAAAAAAAAAAAAAAAA\n\tAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n\tAAAAAAAAAAAAbWx1YwAAAAAAAAASAAAADG5iTk8AAAAYAAAA6HB0UFQAAAAYAAAA6HN2\n\tU0UAAAAYAAAA6GZpRkkAAAAYAAAA6GRhREsAAAAYAAAA6HpoQ04AAAAYAAAA6GZyRlIA\n\tAAAYAAAA6GphSlAAAAAYAAAA6GVuVVMAAAAYAAAA6HBsUEwAAAAYAAAA6HB0QlIAAAAY\n\tAAAA6GVzRVMAAAAYAAAA6HpoVFcAAAAYAAAA6HJ1UlUAAAAYAAAA6GtvS1IAAAAYAAAA\n\t6GRlREUAAAAYAAAA6G5sTkwAAAAYAAAA6Gl0SVQAAAAYAAAA6ABEAEUATABMACAAMgA0\n\tADAANQBGAFAAV21tb2QAAAAAAAAQrAAAoBAwNzNTv9zMAAAAAAAAAAAAAAAAAAAAAAB0\n\tZXh0AAAAAENvcHlyaWdodCBBcHBsZSwgSW5jLiwgMjAwOAA=\n\t</data>\n\t<key>ReadOnly</key>\n\t<string>NO</string>\n\t<key>RowAlign</key>\n\t<integer>1</integer>\n\t<key>RowSpacing</key>\n\t<real>36</real>\n\t<key>SheetTitle</key>\n\t<string>Canvas 1</string>\n\t<key>SmartAlignmentGuidesActive</key>\n\t<string>NO</string>\n\t<key>SmartDistanceGuidesActive</key>\n\t<string>NO</string>\n\t<key>UniqueID</key>\n\t<integer>1</integer>\n\t<key>UseEntirePage</key>\n\t<false/>\n\t<key>VPages</key>\n\t<integer>1</integer>\n\t<key>WindowInfo</key>\n\t<dict>\n\t\t<key>CurrentSheet</key>\n\t\t<integer>0</integer>\n\t\t<key>ExpandedCanvases</key>\n\t\t<array>\n\t\t\t<dict>\n\t\t\t\t<key>name</key>\n\t\t\t\t<string>Canvas 1</string>\n\t\t\t</dict>\n\t\t</array>\n\t\t<key>Frame</key>\n\t\t<string>{{2002, 20}, {1215, 1180}}</string>\n\t\t<key>ListView</key>\n\t\t<true/>\n\t\t<key>OutlineWidth</key>\n\t\t<integer>142</integer>\n\t\t<key>RightSidebar</key>\n\t\t<false/>\n\t\t<key>Sidebar</key>\n\t\t<true/>\n\t\t<key>SidebarWidth</key>\n\t\t<integer>157</integer>\n\t\t<key>VisibleRegion</key>\n\t\t<string>{{-4.5, 0.5}, {522, 535.5}}</string>\n\t\t<key>Zoom</key>\n\t\t<real>2</real>\n\t\t<key>ZoomValues</key>\n\t\t<array>\n\t\t\t<array>\n\t\t\t\t<string>Canvas 1</string>\n\t\t\t\t<real>2</real>\n\t\t\t\t<real>4</real>\n\t\t\t</array>\n\t\t</array>\n\t</dict>\n\t<key>saveQuickLookFiles</key>\n\t<string>YES</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/sender/crash_report_sender-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string>crash_report_sender</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.Breakpad.${PRODUCT_NAME:identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSHasLocalizedDisplayName</key>\n\t<true/>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/sender/crash_report_sender.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// This component uses the HTTPMultipartUpload of the breakpad project to send\n// the minidump and associated data to the crash reporting servers.\n// It will perform throttling based on the parameters passed to it and will\n// prompt the user to send the minidump.\n\n#import <Cocoa/Cocoa.h>\n\n#include \"client/mac/sender/uploader.h\"\n#import \"GTMDefines.h\"\n\n// We're sublcassing NSTextField in order to override a particular\n// method (see the implementation) that lets us reject changes if they\n// are longer than a particular length.  Bindings would normally solve\n// this problem, but when we implemented a validation method, and\n// returned NO for strings that were too long, the UI was not updated\n// right away, which was a poor user experience.  The UI would be\n// updated as soon as the text field lost first responder status,\n// which isn't soon enough.  It is a known bug that the UI KVO didn't\n// work in the middle of a validation.\n@interface LengthLimitingTextField : NSTextField {\n  @private\n   NSUInteger maximumLength_;\n}\n\n- (void)setMaximumLength:(NSUInteger)maxLength;\n@end\n\n@interface Reporter : NSObject {\n @public\n  IBOutlet NSWindow *alertWindow_;        // The alert window\n\n  // Grouping boxes used for resizing.\n  IBOutlet NSBox *headerBox_;\n  IBOutlet NSBox *preEmailBox_;\n  IBOutlet NSBox *emailSectionBox_;\n  // Localized elements (or things that need to be moved during localization).\n  IBOutlet NSTextField                *dialogTitle_;\n  IBOutlet NSTextField                *commentMessage_;\n  IBOutlet NSTextField                *emailMessage_;\n  IBOutlet NSTextField                *emailLabel_;\n  IBOutlet NSTextField                *privacyLinkLabel_;\n  IBOutlet NSButton                   *sendButton_;\n  IBOutlet NSButton                   *cancelButton_;\n  IBOutlet LengthLimitingTextField    *emailEntryField_;\n  IBOutlet LengthLimitingTextField    *commentsEntryField_;\n  IBOutlet NSTextField                *countdownLabel_;\n  IBOutlet NSView                     *privacyLinkArrow_;\n\n  // Text field bindings, for user input.\n  NSString *commentsValue_;                // Comments from the user\n  NSString *emailValue_;                   // Email from the user\n  NSString *countdownMessage_;             // Message indicating time\n                                           // left for input.\n @private\n  NSTimeInterval remainingDialogTime_;     // Keeps track of how long\n                                           // we have until we cancel\n                                           // the dialog\n  NSTimer *messageTimer_;                  // Timer we use to update\n                                           // the dialog\n  Uploader* uploader_;                     // Uploader we use to send the data.\n}\n\n// Stops the modal panel with an NSAlertDefaultReturn value. This is the action\n// invoked by the \"Send Report\" button.\n- (IBAction)sendReport:(id)sender;\n// Stops the modal panel with an NSAlertAlternateReturn value. This is the\n// action invoked by the \"Cancel\" button.\n- (IBAction)cancel:(id)sender;\n// Opens the Privacy Policy url in the default web browser.\n- (IBAction)showPrivacyPolicy:(id)sender;\n\n// Delegate methods for the NSTextField for comments. We want to capture the\n// Return key and use it to send the message when no text has been entered.\n// Otherwise, we want Return to add a carriage return to the comments field.\n- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView\n                          doCommandBySelector:(SEL)commandSelector;\n\n// Accessors to make bindings work\n- (NSString *)commentsValue;\n- (void)setCommentsValue:(NSString *)value;\n\n- (NSString *)emailValue;\n- (void)setEmailValue:(NSString *)value;\n\n- (NSString *)countdownMessage;\n- (void)setCountdownMessage:(NSString *)value;\n\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/sender/crash_report_sender.m",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#import \"client/mac/sender/crash_report_sender.h\"\n\n#import <Cocoa/Cocoa.h>\n#import <pwd.h>\n#import <sys/stat.h>\n#import <SystemConfiguration/SystemConfiguration.h>\n#import <unistd.h>\n\n#import \"client/apple/Framework/BreakpadDefines.h\"\n#import \"common/mac/GTMLogger.h\"\n#import \"common/mac/HTTPMultipartUpload.h\"\n\n\n#define kLastSubmission @\"LastSubmission\"\nconst int kUserCommentsMaxLength = 1500;\nconst int kEmailMaxLength = 64;\n\n#define kApplePrefsSyncExcludeAllKey \\\n  @\"com.apple.PreferenceSync.ExcludeAllSyncKeys\"\n\n#pragma mark -\n\n@interface NSView (ResizabilityExtentions)\n// Shifts the view vertically by the given amount.\n- (void)breakpad_shiftVertically:(CGFloat)offset;\n\n// Shifts the view horizontally by the given amount.\n- (void)breakpad_shiftHorizontally:(CGFloat)offset;\n@end\n\n@implementation NSView (ResizabilityExtentions)\n- (void)breakpad_shiftVertically:(CGFloat)offset {\n  NSPoint origin = [self frame].origin;\n  origin.y += offset;\n  [self setFrameOrigin:origin];\n}\n\n- (void)breakpad_shiftHorizontally:(CGFloat)offset {\n  NSPoint origin = [self frame].origin;\n  origin.x += offset;\n  [self setFrameOrigin:origin];\n}\n@end\n\n@interface NSWindow (ResizabilityExtentions)\n// Adjusts the window height by heightDelta relative to its current height,\n// keeping all the content at the same size.\n- (void)breakpad_adjustHeight:(CGFloat)heightDelta;\n@end\n\n@implementation NSWindow (ResizabilityExtentions)\n- (void)breakpad_adjustHeight:(CGFloat)heightDelta {\n  [[self contentView] setAutoresizesSubviews:NO];\n\n  NSRect windowFrame = [self frame];\n  windowFrame.size.height += heightDelta;\n  [self setFrame:windowFrame display:YES];\n  // For some reason the content view is resizing, but not adjusting its origin,\n  // so correct it manually.\n  [[self contentView] setFrameOrigin:NSMakePoint(0, 0)];\n\n  [[self contentView] setAutoresizesSubviews:YES];\n}\n@end\n\n@interface NSTextField (ResizabilityExtentions)\n// Grows or shrinks the height of the field to the minimum required to show the\n// current text, preserving the existing width and origin.\n// Returns the change in height.\n- (CGFloat)breakpad_adjustHeightToFit;\n\n// Grows or shrinks the width of the field to the minimum required to show the\n// current text, preserving the existing height and origin.\n// Returns the change in width.\n- (CGFloat)breakpad_adjustWidthToFit;\n@end\n\n@implementation NSTextField (ResizabilityExtentions)\n- (CGFloat)breakpad_adjustHeightToFit {\n  NSRect oldFrame = [self frame];\n  // Starting with the 10.5 SDK, height won't grow, so make it huge to start.\n  NSRect presizeFrame = oldFrame;\n  presizeFrame.size.height = MAXFLOAT;\n  // sizeToFit will blow out the width rather than making the field taller, so\n  // we do it manually.\n  NSSize newSize = [[self cell] cellSizeForBounds:presizeFrame];\n  NSRect newFrame = NSMakeRect(oldFrame.origin.x, oldFrame.origin.y,\n                               NSWidth(oldFrame), newSize.height);\n  [self setFrame:newFrame];\n\n  return newSize.height - NSHeight(oldFrame);\n}\n\n- (CGFloat)breakpad_adjustWidthToFit {\n  NSRect oldFrame = [self frame];\n  [self sizeToFit];\n  return NSWidth([self frame]) - NSWidth(oldFrame);\n}\n@end\n\n@interface NSButton (ResizabilityExtentions)\n// Resizes to fit the label using IB-style size-to-fit metrics and enforcing a\n// minimum width of 70, while preserving the right edge location.\n// Returns the change in width.\n- (CGFloat)breakpad_smartSizeToFit;\n@end\n\n@implementation NSButton (ResizabilityExtentions)\n- (CGFloat)breakpad_smartSizeToFit {\n  NSRect oldFrame = [self frame];\n  [self sizeToFit];\n  NSRect newFrame = [self frame];\n  // sizeToFit gives much worse results that IB's Size to Fit option. This is\n  // the amount of padding IB adds over a sizeToFit, empirically determined.\n  const float kExtraPaddingAmount = 12;\n  const float kMinButtonWidth = 70; // The default button size in IB.\n  newFrame.size.width = NSWidth(newFrame) + kExtraPaddingAmount;\n  if (NSWidth(newFrame) < kMinButtonWidth)\n    newFrame.size.width = kMinButtonWidth;\n  // Preserve the right edge location.\n  newFrame.origin.x = NSMaxX(oldFrame) - NSWidth(newFrame);\n  [self setFrame:newFrame];\n  return NSWidth(newFrame) - NSWidth(oldFrame);\n}\n@end\n\n#pragma mark -\n\n@interface Reporter(PrivateMethods)\n- (id)initWithConfigFile:(const char *)configFile;\n\n// Returns YES if it has been long enough since the last report that we should\n// submit a report for this crash.\n- (BOOL)reportIntervalElapsed;\n\n// Returns YES if we should send the report without asking the user first.\n- (BOOL)shouldSubmitSilently;\n\n// Returns YES if the minidump was generated on demand.\n- (BOOL)isOnDemand;\n\n// Returns YES if we should ask the user to provide comments.\n- (BOOL)shouldRequestComments;\n\n// Returns YES if we should ask the user to provide an email address.\n- (BOOL)shouldRequestEmail;\n\n// Shows UI to the user to ask for permission to send and any extra information\n// we've been instructed to request. Returns YES if the user allows the report\n// to be sent.\n- (BOOL)askUserPermissionToSend;\n\n// Returns the short description of the crash, suitable for use as a dialog\n// title (e.g., \"The application Foo has quit unexpectedly\").\n- (NSString*)shortDialogMessage;\n\n// Return explanatory text about the crash and the reporter, suitable for the\n// body text of a dialog.\n- (NSString*)explanatoryDialogText;\n\n// Returns the amount of time the UI should be shown before timing out.\n- (NSTimeInterval)messageTimeout;\n\n// Preps the comment-prompting alert window for display:\n// * localizes all the elements\n// * resizes and adjusts layout as necessary for localization\n// * removes the email section if includeEmail is NO\n- (void)configureAlertWindowIncludingEmail:(BOOL)includeEmail;\n\n// Rmevoes the email section of the dialog, adjusting the rest of the window\n// as necessary.\n- (void)removeEmailPrompt;\n\n// Run an alert window with the given timeout. Returns\n// NSRunStoppedResponse if the timeout is exceeded. A timeout of 0\n// queues the message immediately in the modal run loop.\n- (NSInteger)runModalWindow:(NSWindow*)window \n                withTimeout:(NSTimeInterval)timeout;\n\n// This method is used to periodically update the UI with how many\n// seconds are left in the dialog display.\n- (void)updateSecondsLeftInDialogDisplay:(NSTimer*)theTimer;\n\n// When we receive this notification, it means that the user has\n// begun editing the email address or comments field, and we disable\n// the timers so that the user has as long as they want to type\n// in their comments/email.\n- (void)controlTextDidBeginEditing:(NSNotification *)aNotification;\n\n- (void)report;\n\n@end\n\n@implementation Reporter\n//=============================================================================\n- (id)initWithConfigFile:(const char *)configFile {\n  if ((self = [super init])) {\n    remainingDialogTime_ = 0;\n    uploader_ = [[Uploader alloc] initWithConfigFile:configFile];\n    if (!uploader_) {\n      [self release];\n      return nil;\n    }\n  }\n  return self;\n}\n\n//=============================================================================\n- (BOOL)askUserPermissionToSend {\n  // Initialize Cocoa, needed to display the alert\n  NSApplicationLoad();\n\n  // Get the timeout value for the notification.\n  NSTimeInterval timeout = [self messageTimeout];\n\n  NSInteger buttonPressed = NSAlertAlternateReturn;\n  // Determine whether we should create a text box for user feedback.\n  if ([self shouldRequestComments]) {\n    BOOL didLoadNib = [NSBundle loadNibNamed:@\"Breakpad\" owner:self];\n    if (!didLoadNib) {\n      return NO;\n    }\n\n    [self configureAlertWindowIncludingEmail:[self shouldRequestEmail]];\n\n    buttonPressed = [self runModalWindow:alertWindow_ withTimeout:timeout];\n\n    // Extract info from the user into the uploader_.\n    if ([self commentsValue]) {\n      [[uploader_ parameters] setObject:[self commentsValue]\n                                 forKey:@BREAKPAD_COMMENTS];\n    }\n    if ([self emailValue]) {\n      [[uploader_ parameters] setObject:[self emailValue]\n                                 forKey:@BREAKPAD_EMAIL];\n    }\n  } else {\n    // Create an alert panel to tell the user something happened\n    NSPanel* alert = NSGetAlertPanel([self shortDialogMessage],\n                                     [self explanatoryDialogText],\n                                     NSLocalizedString(@\"sendReportButton\", @\"\"),\n                                     NSLocalizedString(@\"cancelButton\", @\"\"),\n                                     nil);\n\n    // Pop the alert with an automatic timeout, and wait for the response\n    buttonPressed = [self runModalWindow:alert withTimeout:timeout];\n\n    // Release the panel memory\n    NSReleaseAlertPanel(alert);\n  }\n  return buttonPressed == NSAlertDefaultReturn;\n}\n\n- (void)configureAlertWindowIncludingEmail:(BOOL)includeEmail {\n  // Swap in localized values, making size adjustments to impacted elements as\n  // we go. Remember that the origin is in the bottom left, so elements above\n  // \"fall\" as text areas are shrunk from their overly-large IB sizes.\n\n  // Localize the header. No resizing needed, as it has plenty of room.\n  [dialogTitle_ setStringValue:[self shortDialogMessage]];\n\n  // Localize the explanatory text field.\n  [commentMessage_ setStringValue:[NSString stringWithFormat:@\"%@\\n\\n%@\",\n                                   [self explanatoryDialogText],\n                                   NSLocalizedString(@\"commentsMsg\", @\"\")]];\n  CGFloat commentHeightDelta = [commentMessage_ breakpad_adjustHeightToFit];\n  [headerBox_ breakpad_shiftVertically:commentHeightDelta];\n  [alertWindow_ breakpad_adjustHeight:commentHeightDelta];\n\n  // Either localize the email explanation field or remove the whole email\n  // section depending on whether or not we are asking for email.\n  if (includeEmail) {\n    [emailMessage_ setStringValue:NSLocalizedString(@\"emailMsg\", @\"\")];\n    CGFloat emailHeightDelta = [emailMessage_ breakpad_adjustHeightToFit];\n    [preEmailBox_ breakpad_shiftVertically:emailHeightDelta];\n    [alertWindow_ breakpad_adjustHeight:emailHeightDelta];\n  } else {\n    [self removeEmailPrompt];  // Handles necessary resizing.\n  }\n\n  // Localize the email label, and shift the associated text field.\n  [emailLabel_ setStringValue:NSLocalizedString(@\"emailLabel\", @\"\")];\n  CGFloat emailLabelWidthDelta = [emailLabel_ breakpad_adjustWidthToFit];\n  [emailEntryField_ breakpad_shiftHorizontally:emailLabelWidthDelta];\n\n  // Localize the privacy policy label, and keep it right-aligned to the arrow.\n  [privacyLinkLabel_ setStringValue:NSLocalizedString(@\"privacyLabel\", @\"\")];\n  CGFloat privacyLabelWidthDelta =\n      [privacyLinkLabel_ breakpad_adjustWidthToFit];\n  [privacyLinkLabel_ breakpad_shiftHorizontally:(-privacyLabelWidthDelta)];\n\n  // Ensure that the email field and the privacy policy link don't overlap.\n  CGFloat kMinControlPadding = 8;\n  CGFloat maxEmailFieldWidth = NSMinX([privacyLinkLabel_ frame]) -\n                               NSMinX([emailEntryField_ frame]) -\n                               kMinControlPadding;\n  if (NSWidth([emailEntryField_ bounds]) > maxEmailFieldWidth &&\n      maxEmailFieldWidth > 0) {\n    NSSize emailSize = [emailEntryField_ frame].size;\n    emailSize.width = maxEmailFieldWidth;\n    [emailEntryField_ setFrameSize:emailSize];\n  }\n\n  // Localize the placeholder text.\n  [[commentsEntryField_ cell]\n      setPlaceholderString:NSLocalizedString(@\"commentsPlaceholder\", @\"\")];\n  [[emailEntryField_ cell]\n      setPlaceholderString:NSLocalizedString(@\"emailPlaceholder\", @\"\")];\n\n  // Localize the buttons, and keep the cancel button at the right distance.\n  [sendButton_ setTitle:NSLocalizedString(@\"sendReportButton\", @\"\")];\n  CGFloat sendButtonWidthDelta = [sendButton_ breakpad_smartSizeToFit];\n  [cancelButton_ breakpad_shiftHorizontally:(-sendButtonWidthDelta)];\n  [cancelButton_ setTitle:NSLocalizedString(@\"cancelButton\", @\"\")];\n  [cancelButton_ breakpad_smartSizeToFit];\n}\n\n- (void)removeEmailPrompt {\n  [emailSectionBox_ setHidden:YES];\n  CGFloat emailSectionHeight = NSHeight([emailSectionBox_ frame]);\n  [preEmailBox_ breakpad_shiftVertically:(-emailSectionHeight)];\n  [alertWindow_ breakpad_adjustHeight:(-emailSectionHeight)];\n}\n\n- (NSInteger)runModalWindow:(NSWindow*)window \n                withTimeout:(NSTimeInterval)timeout {\n  // Queue a |stopModal| message to be performed in |timeout| seconds.\n  if (timeout > 0.001) {\n    remainingDialogTime_ = timeout;\n    SEL updateSelector = @selector(updateSecondsLeftInDialogDisplay:);\n    messageTimer_ = [NSTimer scheduledTimerWithTimeInterval:1.0\n                                                     target:self\n                                                   selector:updateSelector\n                                                   userInfo:nil\n                                                    repeats:YES];\n  }\n\n  // Run the window modally and wait for either a |stopModal| message or a\n  // button click.\n  [NSApp activateIgnoringOtherApps:YES];\n  NSInteger returnMethod = [NSApp runModalForWindow:window];\n\n  return returnMethod;\n}\n\n- (IBAction)sendReport:(id)sender {\n  // Force the text fields to end editing so text for the currently focused\n  // field will be commited.\n  [alertWindow_ makeFirstResponder:alertWindow_];\n\n  [alertWindow_ orderOut:self];\n  // Use NSAlertDefaultReturn so that the return value of |runModalWithWindow|\n  // matches the AppKit function NSRunAlertPanel()\n  [NSApp stopModalWithCode:NSAlertDefaultReturn];\n}\n\n// UI Button Actions\n//=============================================================================\n- (IBAction)cancel:(id)sender {\n  [alertWindow_ orderOut:self];\n  // Use NSAlertDefaultReturn so that the return value of |runModalWithWindow|\n  // matches the AppKit function NSRunAlertPanel()\n  [NSApp stopModalWithCode:NSAlertAlternateReturn];\n}\n\n- (IBAction)showPrivacyPolicy:(id)sender {\n  // Get the localized privacy policy URL and open it in the default browser.\n  NSURL* privacyPolicyURL =\n      [NSURL URLWithString:NSLocalizedString(@\"privacyPolicyURL\", @\"\")];\n  [[NSWorkspace sharedWorkspace] openURL:privacyPolicyURL];\n}\n\n// Text Field Delegate Methods\n//=============================================================================\n- (BOOL)    control:(NSControl*)control\n           textView:(NSTextView*)textView\ndoCommandBySelector:(SEL)commandSelector {\n  BOOL result = NO;\n  // If the user has entered text on the comment field, don't end\n  // editing on \"return\".\n  if (control == commentsEntryField_ &&\n      commandSelector == @selector(insertNewline:)\n      && [[textView string] length] > 0) {\n    [textView insertNewlineIgnoringFieldEditor:self];\n    result = YES;\n  }\n  return result;\n}\n\n- (void)controlTextDidBeginEditing:(NSNotification *)aNotification {\n  [messageTimer_ invalidate];\n  [self setCountdownMessage:@\"\"];\n}\n\n- (void)updateSecondsLeftInDialogDisplay:(NSTimer*)theTimer {\n  remainingDialogTime_ -= 1;\n\n  NSString *countdownMessage;\n  NSString *formatString;\n\n  int displayedTimeLeft; // This can be either minutes or seconds.\n  \n  if (remainingDialogTime_ > 59) {\n    // calculate minutes remaining for UI purposes\n    displayedTimeLeft = (int)(remainingDialogTime_ / 60);\n    \n    if (displayedTimeLeft == 1) {\n      formatString = NSLocalizedString(@\"countdownMsgMinuteSingular\", @\"\");\n    } else {\n      formatString = NSLocalizedString(@\"countdownMsgMinutesPlural\", @\"\");\n    }\n  } else {\n    displayedTimeLeft = (int)remainingDialogTime_;\n    if (displayedTimeLeft == 1) {\n      formatString = NSLocalizedString(@\"countdownMsgSecondSingular\", @\"\");\n    } else {\n      formatString = NSLocalizedString(@\"countdownMsgSecondsPlural\", @\"\");\n    }\n  }\n  countdownMessage = [NSString stringWithFormat:formatString,\n                               displayedTimeLeft];\n  if (remainingDialogTime_ <= 30) {\n    [countdownLabel_ setTextColor:[NSColor redColor]];\n  }\n  [self setCountdownMessage:countdownMessage];\n  if (remainingDialogTime_ <= 0) {\n    [messageTimer_ invalidate];\n    [NSApp stopModal];\n  }\n}\n\n\n\n#pragma mark Accessors\n#pragma mark -\n//=============================================================================\n\n- (NSString *)commentsValue {\n  return [[commentsValue_ retain] autorelease];\n}\n\n- (void)setCommentsValue:(NSString *)value {\n  if (commentsValue_ != value) {\n    [commentsValue_ release];\n    commentsValue_ = [value copy];\n  }\n}\n\n- (NSString *)emailValue {\n  return [[emailValue_ retain] autorelease];\n}\n\n- (void)setEmailValue:(NSString *)value {\n  if (emailValue_ != value) {\n    [emailValue_ release];\n    emailValue_ = [value copy];\n  }\n}\n\n- (NSString *)countdownMessage {\n  return [[countdownMessage_ retain] autorelease];\n}\n\n- (void)setCountdownMessage:(NSString *)value {\n  if (countdownMessage_ != value) {\n    [countdownMessage_ release];\n    countdownMessage_ = [value copy];\n  }\n}\n\n#pragma mark -\n//=============================================================================\n- (BOOL)reportIntervalElapsed {\n  float interval = [[[uploader_ parameters]\n      objectForKey:@BREAKPAD_REPORT_INTERVAL] floatValue];\n  NSString *program = [[uploader_ parameters] objectForKey:@BREAKPAD_PRODUCT];\n  NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];\n  NSMutableDictionary *programDict =\n    [NSMutableDictionary dictionaryWithDictionary:[ud dictionaryForKey:program]];\n  NSNumber *lastTimeNum = [programDict objectForKey:kLastSubmission];\n  NSTimeInterval lastTime = lastTimeNum ? [lastTimeNum floatValue] : 0;\n  NSTimeInterval now = CFAbsoluteTimeGetCurrent();\n  NSTimeInterval spanSeconds = (now - lastTime);\n\n  [programDict setObject:[NSNumber numberWithDouble:now] \n                  forKey:kLastSubmission];\n  [ud setObject:programDict forKey:program];\n  [ud synchronize];\n\n  // If we've specified an interval and we're within that time, don't ask the\n  // user if we should report\n  GTMLoggerDebug(@\"Reporter Interval: %f\", interval);\n  if (interval > spanSeconds) {\n    GTMLoggerDebug(@\"Within throttling interval, not sending report\");\n    return NO;\n  }\n  return YES;\n}\n\n- (BOOL)isOnDemand {\n  return [[[uploader_ parameters] objectForKey:@BREAKPAD_ON_DEMAND]\n\t   isEqualToString:@\"YES\"];\n}\n\n- (BOOL)shouldSubmitSilently {\n  return [[[uploader_ parameters] objectForKey:@BREAKPAD_SKIP_CONFIRM]\n            isEqualToString:@\"YES\"];\n}\n\n- (BOOL)shouldRequestComments {\n  return [[[uploader_ parameters] objectForKey:@BREAKPAD_REQUEST_COMMENTS]\n            isEqualToString:@\"YES\"];\n}\n\n- (BOOL)shouldRequestEmail {\n  return [[[uploader_ parameters] objectForKey:@BREAKPAD_REQUEST_EMAIL]\n            isEqualToString:@\"YES\"];\n}\n\n- (NSString*)shortDialogMessage {\n  NSString *displayName =\n      [[uploader_ parameters] objectForKey:@BREAKPAD_PRODUCT_DISPLAY];\n  if (![displayName length])\n    displayName = [[uploader_ parameters] objectForKey:@BREAKPAD_PRODUCT];\n\n  if ([self isOnDemand]) {\n    return [NSString\n             stringWithFormat:NSLocalizedString(@\"noCrashDialogHeader\", @\"\"),\n             displayName];\n  } else {\n    return [NSString \n             stringWithFormat:NSLocalizedString(@\"crashDialogHeader\", @\"\"),\n             displayName];\n  }\n}\n\n- (NSString*)explanatoryDialogText {\n  NSString *displayName =\n      [[uploader_ parameters] objectForKey:@BREAKPAD_PRODUCT_DISPLAY];\n  if (![displayName length])\n    displayName = [[uploader_ parameters] objectForKey:@BREAKPAD_PRODUCT];\n\n  NSString *vendor = [[uploader_ parameters] objectForKey:@BREAKPAD_VENDOR];\n  if (![vendor length])\n    vendor = @\"unknown vendor\";\n\n  if ([self isOnDemand]) {\n    return [NSString\n             stringWithFormat:NSLocalizedString(@\"noCrashDialogMsg\", @\"\"),\n             vendor, displayName];\n  } else {\n    return [NSString\n             stringWithFormat:NSLocalizedString(@\"crashDialogMsg\", @\"\"),\n             vendor];\n  }\n}\n\n- (NSTimeInterval)messageTimeout {\n  // Get the timeout value for the notification.\n  NSTimeInterval timeout = [[[uploader_ parameters]\n      objectForKey:@BREAKPAD_CONFIRM_TIMEOUT] floatValue];\n  // Require a timeout of at least a minute (except 0, which means no timeout).\n  if (timeout > 0.001 && timeout < 60.0) {\n    timeout = 60.0;\n  }\n  return timeout;\n}\n\n- (void)report {\n  [uploader_ report];\n}\n\n//=============================================================================\n- (void)dealloc {\n  [uploader_ release];\n  [super dealloc];\n}\n\n- (void)awakeFromNib {\n  [emailEntryField_ setMaximumLength:kEmailMaxLength];\n  [commentsEntryField_ setMaximumLength:kUserCommentsMaxLength];\n}\n\n@end\n\n//=============================================================================\n@implementation LengthLimitingTextField\n\n- (void)setMaximumLength:(NSUInteger)maxLength {\n  maximumLength_ = maxLength;\n}\n\n// This is the method we're overriding in NSTextField, which lets us\n// limit the user's input if it makes the string too long.\n- (BOOL)       textView:(NSTextView *)textView\nshouldChangeTextInRange:(NSRange)affectedCharRange\n      replacementString:(NSString *)replacementString {\n\n  // Sometimes the range comes in invalid, so reject if we can't\n  // figure out if the replacement text is too long.\n  if (affectedCharRange.location == NSNotFound) {\n    return NO;\n  }\n  // Figure out what the new string length would be, taking into\n  // account user selections.\n  NSUInteger newStringLength =\n    [[textView string] length] - affectedCharRange.length +\n    [replacementString length];\n  if (newStringLength > maximumLength_) {\n    return NO;\n  } else {\n    return YES;\n  }\n}\n\n// Cut, copy, and paste have to be caught specifically since there is no menu.\n- (BOOL)performKeyEquivalent:(NSEvent*)event {\n  // Only handle the key equivalent if |self| is the text field with focus.\n  NSText* fieldEditor = [self currentEditor];\n  if (fieldEditor != nil) {\n    // Check for a single \"Command\" modifier\n    NSUInteger modifiers = [event modifierFlags];\n    modifiers &= NSDeviceIndependentModifierFlagsMask;\n    if (modifiers == NSCommandKeyMask) {\n      // Now, check for Select All, Cut, Copy, or Paste key equivalents.\n      NSString* characters = [event characters];\n      // Select All is Command-A.\n      if ([characters isEqualToString:@\"a\"]) {\n        [fieldEditor selectAll:self];\n        return YES;\n      // Cut is Command-X.\n      } else if ([characters isEqualToString:@\"x\"]) {\n        [fieldEditor cut:self];\n        return YES;\n      // Copy is Command-C.\n      } else if ([characters isEqualToString:@\"c\"]) {\n        [fieldEditor copy:self];\n        return YES;\n      // Paste is Command-V.\n      } else if ([characters isEqualToString:@\"v\"]) {\n        [fieldEditor paste:self];\n        return YES;\n      }\n    }\n  }\n  // Let the super class handle the rest (e.g. Command-Period will cancel).\n  return [super performKeyEquivalent:event];\n}\n\n@end\n\n//=============================================================================\nint main(int argc, const char *argv[]) {\n  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n#if DEBUG\n  // Log to stderr in debug builds.\n  [GTMLogger setSharedLogger:[GTMLogger standardLoggerWithStderr]];\n#endif\n  GTMLoggerDebug(@\"Reporter Launched, argc=%d\", argc);\n  // The expectation is that there will be one argument which is the path\n  // to the configuration file\n  if (argc != 2) {\n    exit(1);\n  }\n\n  Reporter *reporter = [[Reporter alloc] initWithConfigFile:argv[1]];\n  if (!reporter) {\n    GTMLoggerDebug(@\"reporter initialization failed\");\n    exit(1);\n  }\n\n  // only submit a report if we have not recently crashed in the past\n  BOOL shouldSubmitReport = [reporter reportIntervalElapsed];\n  BOOL okayToSend = NO;\n\n  // ask user if we should send\n  if (shouldSubmitReport) {\n    if ([reporter shouldSubmitSilently]) {\n      GTMLoggerDebug(@\"Skipping confirmation and sending report\");\n      okayToSend = YES;\n    } else {\n      okayToSend = [reporter askUserPermissionToSend];\n    }\n  }\n\n  // If we're running as root, switch over to nobody\n  if (getuid() == 0 || geteuid() == 0) {\n    struct passwd *pw = getpwnam(\"nobody\");\n\n    // If we can't get a non-root uid, don't send the report\n    if (!pw) {\n      GTMLoggerDebug(@\"!pw - %s\", strerror(errno));\n      exit(0);\n    }\n\n    if (setgid(pw->pw_gid) == -1) {\n      GTMLoggerDebug(@\"setgid(pw->pw_gid) == -1 - %s\", strerror(errno));\n      exit(0);\n    }\n\n    if (setuid(pw->pw_uid) == -1) {\n      GTMLoggerDebug(@\"setuid(pw->pw_uid) == -1 - %s\", strerror(errno));\n      exit(0);\n    }\n  }\n  else {\n     GTMLoggerDebug(@\"getuid() !=0 || geteuid() != 0\");\n  }\n\n  if (okayToSend && shouldSubmitReport) {\n    GTMLoggerDebug(@\"Sending Report\");\n    [reporter report];\n    GTMLoggerDebug(@\"Report Sent!\");\n  } else {\n    GTMLoggerDebug(@\"Not sending crash report okayToSend=%d, \"\\\n                     \"shouldSubmitReport=%d\", okayToSend, shouldSubmitReport);\n  }\n\n  GTMLoggerDebug(@\"Exiting with no errors\");\n  // Cleanup\n  [reporter release];\n  [pool release];\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/sender/uploader.h",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// This component uses the HTTPMultipartUpload of the breakpad project to send\n// the minidump and associated data to the crash reporting servers.\n// It will perform throttling based on the parameters passed to it and will\n// prompt the user to send the minidump.\n\n#include <Foundation/Foundation.h>\n\n#import \"common/mac/GTMDefines.h\"\n\n#define kClientIdPreferenceKey @\"clientid\"\n\nextern NSString *const kGoogleServerType;\nextern NSString *const kSocorroServerType;\nextern NSString *const kDefaultServerType;\n\n@interface Uploader : NSObject {\n @private\n  NSMutableDictionary *parameters_;        // Key value pairs of data (STRONG)\n  NSData *minidumpContents_;               // The data in the minidump (STRONG)\n  NSData *logFileData_;                    // An NSdata for the tar,\n                                           // bz2'd log file.\n  NSMutableDictionary *serverDictionary_;  // The dictionary mapping a\n                                           // server type name to a\n                                           // dictionary of server\n                                           // parameter names.\n  NSMutableDictionary *socorroDictionary_; // The dictionary for\n                                           // Socorro.\n  NSMutableDictionary *googleDictionary_;  // The dictionary for\n                                           // Google.\n  NSMutableDictionary *extraServerVars_;   // A dictionary containing\n                                           // extra key/value pairs\n                                           // that are uploaded to the\n                                           // crash server with the\n                                           // minidump.\n}\n\n- (id)initWithConfigFile:(const char *)configFile;\n\n- (id)initWithConfig:(NSDictionary *)config;\n\n- (NSMutableDictionary *)parameters;\n\n- (void)report;\n\n// Upload the given data to the crash server.\n- (void)uploadData:(NSData *)data name:(NSString *)name;\n\n// This method adds a key/value pair to the dictionary that\n// will be uploaded to the crash server.\n- (void)addServerParameter:(id)value forKey:(NSString *)key;\n\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/sender/uploader.mm",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#import <fcntl.h>\n#import <pwd.h>\n#import <sys/stat.h>\n#include <TargetConditionals.h>\n#import <unistd.h>\n\n#import <SystemConfiguration/SystemConfiguration.h>\n\n#import \"common/mac/HTTPMultipartUpload.h\"\n\n#import \"client/apple/Framework/BreakpadDefines.h\"\n#import \"client/mac/sender/uploader.h\"\n#import \"common/mac/GTMLogger.h\"\n\nconst int kMinidumpFileLengthLimit = 2 * 1024 * 1024;  // 2MB\n\n#define kApplePrefsSyncExcludeAllKey \\\n  @\"com.apple.PreferenceSync.ExcludeAllSyncKeys\"\n\nNSString *const kGoogleServerType = @\"google\";\nNSString *const kSocorroServerType = @\"socorro\";\nNSString *const kDefaultServerType = @\"google\";\n\n#pragma mark -\n\nnamespace {\n// Read one line from the configuration file.\nNSString *readString(int fileId) {\n  NSMutableString *str = [NSMutableString stringWithCapacity:32];\n  char ch[2] = { 0 };\n\n  while (read(fileId, &ch[0], 1) == 1) {\n    if (ch[0] == '\\n') {\n      // Break if this is the first newline after reading some other string\n      // data.\n      if ([str length])\n        break;\n    } else {\n      [str appendString:[NSString stringWithUTF8String:ch]];\n    }\n  }\n\n  return str;\n}\n\n//=============================================================================\n// Read |length| of binary data from the configuration file. This method will\n// returns |nil| in case of error.\nNSData *readData(int fileId, ssize_t length) {\n  NSMutableData *data = [NSMutableData dataWithLength:length];\n  char *bytes = (char *)[data bytes];\n\n  if (read(fileId, bytes, length) != length)\n    return nil;\n\n  return data;\n}\n\n//=============================================================================\n// Read the configuration from the config file.\nNSDictionary *readConfigurationData(const char *configFile) {\n  int fileId = open(configFile, O_RDONLY, 0600);\n  if (fileId == -1) {\n    GTMLoggerDebug(@\"Couldn't open config file %s - %s\",\n                   configFile,\n                   strerror(errno));\n  }\n\n  // we want to avoid a build-up of old config files even if they\n  // have been incorrectly written by the framework\n  if (unlink(configFile)) {\n    GTMLoggerDebug(@\"Couldn't unlink config file %s - %s\",\n                   configFile,\n                   strerror(errno));\n  }\n\n  if (fileId == -1) {\n    return nil;\n  }\n\n  NSMutableDictionary *config = [NSMutableDictionary dictionary];\n\n  while (1) {\n    NSString *key = readString(fileId);\n\n    if (![key length])\n      break;\n\n    // Read the data.  Try to convert to a UTF-8 string, or just save\n    // the data\n    NSString *lenStr = readString(fileId);\n    ssize_t len = [lenStr intValue];\n    NSData *data = readData(fileId, len);\n    id value = [[NSString alloc] initWithData:data\n                                     encoding:NSUTF8StringEncoding];\n\n    [config setObject:(value ? value : data) forKey:key];\n    [value release];\n  }\n\n  close(fileId);\n  return config;\n}\n}  // namespace\n\n#pragma mark -\n\n@interface Uploader(PrivateMethods)\n\n// Update |parameters_| as well as the server parameters using |config|.\n- (void)translateConfigurationData:(NSDictionary *)config;\n\n// Read the minidump referenced in |parameters_| and update |minidumpContents_|\n// with its content.\n- (BOOL)readMinidumpData;\n\n// Read the log files referenced in |parameters_| and update |logFileData_|\n// with their content.\n- (BOOL)readLogFileData;\n\n// Returns a unique client id (user-specific), creating a persistent\n// one in the user defaults, if necessary.\n- (NSString*)clientID;\n\n// Returns a dictionary that can be used to map Breakpad parameter names to\n// URL parameter names.\n- (NSMutableDictionary *)dictionaryForServerType:(NSString *)serverType;\n\n// Helper method to set HTTP parameters based on server type.  This is\n// called right before the upload - crashParameters will contain, on exit,\n// URL parameters that should be sent with the minidump.\n- (BOOL)populateServerDictionary:(NSMutableDictionary *)crashParameters;\n\n// Initialization helper to create dictionaries mapping Breakpad\n// parameters to URL parameters\n- (void)createServerParameterDictionaries;\n\n// Accessor method for the URL parameter dictionary\n- (NSMutableDictionary *)urlParameterDictionary;\n\n// Records the uploaded crash ID to the log file.\n- (void)logUploadWithID:(const char *)uploadID;\n@end\n\n@implementation Uploader\n\n//=============================================================================\n- (id)initWithConfigFile:(const char *)configFile {\n  NSDictionary *config = readConfigurationData(configFile);\n  if (!config)\n    return nil;\n\n  return [self initWithConfig:config];\n}\n\n//=============================================================================\n- (id)initWithConfig:(NSDictionary *)config {\n  if ((self = [super init])) {\n    // Because the reporter is embedded in the framework (and many copies\n    // of the framework may exist) its not completely certain that the OS\n    // will obey the com.apple.PreferenceSync.ExcludeAllSyncKeys in our\n    // Info.plist. To make sure, also set the key directly if needed.\n    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];\n    if (![ud boolForKey:kApplePrefsSyncExcludeAllKey]) {\n      [ud setBool:YES forKey:kApplePrefsSyncExcludeAllKey];\n    }\n\n    [self createServerParameterDictionaries];\n\n    [self translateConfigurationData:config];\n\n    // Read the minidump into memory.\n    [self readMinidumpData];\n    [self readLogFileData];\n  }\n  return self;\n}\n\n//=============================================================================\n- (void)translateConfigurationData:(NSDictionary *)config {\n  parameters_ = [[NSMutableDictionary alloc] init];\n\n  NSEnumerator *it = [config keyEnumerator];\n  while (NSString *key = [it nextObject]) {\n    // If the keyname is prefixed by BREAKPAD_SERVER_PARAMETER_PREFIX\n    // that indicates that it should be uploaded to the server along\n    // with the minidump, so we treat it specially.\n    if ([key hasPrefix:@BREAKPAD_SERVER_PARAMETER_PREFIX]) {\n      NSString *urlParameterKey =\n        [key substringFromIndex:[@BREAKPAD_SERVER_PARAMETER_PREFIX length]];\n      if ([urlParameterKey length]) {\n        id value = [config objectForKey:key];\n        if ([value isKindOfClass:[NSString class]]) {\n          [self addServerParameter:(NSString *)value\n                            forKey:urlParameterKey];\n        } else {\n          [self addServerParameter:(NSData *)value\n                            forKey:urlParameterKey];\n        }\n      }\n    } else {\n      [parameters_ setObject:[config objectForKey:key] forKey:key];\n    }\n  }\n\n  // generate a unique client ID based on this host's MAC address\n  // then add a key/value pair for it\n  NSString *clientID = [self clientID];\n  [parameters_ setObject:clientID forKey:@\"guid\"];\n}\n\n// Per user per machine\n- (NSString *)clientID {\n  NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];\n  NSString *crashClientID = [ud stringForKey:kClientIdPreferenceKey];\n  if (crashClientID) {\n    return crashClientID;\n  }\n\n  // Otherwise, if we have no client id, generate one!\n  srandom((int)[[NSDate date] timeIntervalSince1970]);\n  long clientId1 = random();\n  long clientId2 = random();\n  long clientId3 = random();\n  crashClientID = [NSString stringWithFormat:@\"%lx%lx%lx\",\n                            clientId1, clientId2, clientId3];\n\n  [ud setObject:crashClientID forKey:kClientIdPreferenceKey];\n  [ud synchronize];\n  return crashClientID;\n}\n\n//=============================================================================\n- (BOOL)readLogFileData {\n#if TARGET_OS_IPHONE\n  return NO;\n#else\n  unsigned int logFileCounter = 0;\n\n  NSString *logPath;\n  size_t logFileTailSize =\n      [[parameters_ objectForKey:@BREAKPAD_LOGFILE_UPLOAD_SIZE] intValue];\n\n  NSMutableArray *logFilenames; // An array of NSString, one per log file\n  logFilenames = [[NSMutableArray alloc] init];\n\n  char tmpDirTemplate[80] = \"/tmp/CrashUpload-XXXXX\";\n  char *tmpDir = mkdtemp(tmpDirTemplate);\n\n  // Construct key names for the keys we expect to contain log file paths\n  for(logFileCounter = 0;; logFileCounter++) {\n    NSString *logFileKey = [NSString stringWithFormat:@\"%@%d\",\n                                     @BREAKPAD_LOGFILE_KEY_PREFIX,\n                                     logFileCounter];\n\n    logPath = [parameters_ objectForKey:logFileKey];\n\n    // They should all be consecutive, so if we don't find one, assume\n    // we're done\n\n    if (!logPath) {\n      break;\n    }\n\n    NSData *entireLogFile = [[NSData alloc] initWithContentsOfFile:logPath];\n\n    if (entireLogFile == nil) {\n      continue;\n    }\n\n    NSRange fileRange;\n\n    // Truncate the log file, only if necessary\n\n    if ([entireLogFile length] <= logFileTailSize) {\n      fileRange = NSMakeRange(0, [entireLogFile length]);\n    } else {\n      fileRange = NSMakeRange([entireLogFile length] - logFileTailSize,\n                              logFileTailSize);\n    }\n\n    char tmpFilenameTemplate[100];\n\n    // Generate a template based on the log filename\n    sprintf(tmpFilenameTemplate,\"%s/%s-XXXX\", tmpDir,\n            [[logPath lastPathComponent] fileSystemRepresentation]);\n\n    char *tmpFile = mktemp(tmpFilenameTemplate);\n\n    NSData *logSubdata = [entireLogFile subdataWithRange:fileRange];\n    NSString *tmpFileString = [NSString stringWithUTF8String:tmpFile];\n    [logSubdata writeToFile:tmpFileString atomically:NO];\n\n    [logFilenames addObject:[tmpFileString lastPathComponent]];\n    [entireLogFile release];\n  }\n\n  if ([logFilenames count] == 0) {\n    [logFilenames release];\n    logFileData_ =  nil;\n    return NO;\n  }\n\n  // now, bzip all files into one\n  NSTask *tarTask = [[NSTask alloc] init];\n\n  [tarTask setCurrentDirectoryPath:[NSString stringWithUTF8String:tmpDir]];\n  [tarTask setLaunchPath:@\"/usr/bin/tar\"];\n\n  NSMutableArray *bzipArgs = [NSMutableArray arrayWithObjects:@\"-cjvf\",\n                                             @\"log.tar.bz2\",nil];\n  [bzipArgs addObjectsFromArray:logFilenames];\n\n  [logFilenames release];\n\n  [tarTask setArguments:bzipArgs];\n  [tarTask launch];\n  [tarTask waitUntilExit];\n  [tarTask release];\n\n  NSString *logTarFile = [NSString stringWithFormat:@\"%s/log.tar.bz2\",tmpDir];\n  logFileData_ = [[NSData alloc] initWithContentsOfFile:logTarFile];\n  if (logFileData_ == nil) {\n    GTMLoggerDebug(@\"Cannot find temp tar log file: %@\", logTarFile);\n    return NO;\n  }\n  return YES;\n#endif  // TARGET_OS_IPHONE\n}\n\n//=============================================================================\n- (BOOL)readMinidumpData {\n  NSString *minidumpDir =\n      [parameters_ objectForKey:@kReporterMinidumpDirectoryKey];\n  NSString *minidumpID = [parameters_ objectForKey:@kReporterMinidumpIDKey];\n\n  if (![minidumpID length])\n    return NO;\n\n  NSString *path = [minidumpDir stringByAppendingPathComponent:minidumpID];\n  path = [path stringByAppendingPathExtension:@\"dmp\"];\n\n  // check the size of the minidump and limit it to a reasonable size\n  // before attempting to load into memory and upload\n  const char *fileName = [path fileSystemRepresentation];\n  struct stat fileStatus;\n\n  BOOL success = YES;\n\n  if (!stat(fileName, &fileStatus)) {\n    if (fileStatus.st_size > kMinidumpFileLengthLimit) {\n      fprintf(stderr, \"Breakpad Uploader: minidump file too large \" \\\n              \"to upload : %d\\n\", (int)fileStatus.st_size);\n      success = NO;\n    }\n  } else {\n      fprintf(stderr, \"Breakpad Uploader: unable to determine minidump \" \\\n              \"file length\\n\");\n      success = NO;\n  }\n\n  if (success) {\n    minidumpContents_ = [[NSData alloc] initWithContentsOfFile:path];\n    success = ([minidumpContents_ length] ? YES : NO);\n  }\n\n  if (!success) {\n    // something wrong with the minidump file -- delete it\n    unlink(fileName);\n  }\n\n  return success;\n}\n\n#pragma mark -\n//=============================================================================\n\n- (void)createServerParameterDictionaries {\n  serverDictionary_ = [[NSMutableDictionary alloc] init];\n  socorroDictionary_ = [[NSMutableDictionary alloc] init];\n  googleDictionary_ = [[NSMutableDictionary alloc] init];\n  extraServerVars_ = [[NSMutableDictionary alloc] init];\n\n  [serverDictionary_ setObject:socorroDictionary_ forKey:kSocorroServerType];\n  [serverDictionary_ setObject:googleDictionary_ forKey:kGoogleServerType];\n\n  [googleDictionary_ setObject:@\"ptime\" forKey:@BREAKPAD_PROCESS_UP_TIME];\n  [googleDictionary_ setObject:@\"email\" forKey:@BREAKPAD_EMAIL];\n  [googleDictionary_ setObject:@\"comments\" forKey:@BREAKPAD_COMMENTS];\n  [googleDictionary_ setObject:@\"prod\" forKey:@BREAKPAD_PRODUCT];\n  [googleDictionary_ setObject:@\"ver\" forKey:@BREAKPAD_VERSION];\n  [googleDictionary_ setObject:@\"guid\" forKey:@\"guid\"];\n\n  [socorroDictionary_ setObject:@\"Comments\" forKey:@BREAKPAD_COMMENTS];\n  [socorroDictionary_ setObject:@\"CrashTime\"\n                         forKey:@BREAKPAD_PROCESS_CRASH_TIME];\n  [socorroDictionary_ setObject:@\"StartupTime\"\n                         forKey:@BREAKPAD_PROCESS_START_TIME];\n  [socorroDictionary_ setObject:@\"Version\"\n                         forKey:@BREAKPAD_VERSION];\n  [socorroDictionary_ setObject:@\"ProductName\"\n                         forKey:@BREAKPAD_PRODUCT];\n  [socorroDictionary_ setObject:@\"Email\"\n                         forKey:@BREAKPAD_EMAIL];\n}\n\n- (NSMutableDictionary *)dictionaryForServerType:(NSString *)serverType {\n  if (serverType == nil || [serverType length] == 0) {\n    return [serverDictionary_ objectForKey:kDefaultServerType];\n  }\n  return [serverDictionary_ objectForKey:serverType];\n}\n\n- (NSMutableDictionary *)urlParameterDictionary {\n  NSString *serverType = [parameters_ objectForKey:@BREAKPAD_SERVER_TYPE];\n  return [self dictionaryForServerType:serverType];\n\n}\n\n- (BOOL)populateServerDictionary:(NSMutableDictionary *)crashParameters {\n  NSDictionary *urlParameterNames = [self urlParameterDictionary];\n\n  id key;\n  NSEnumerator *enumerator = [parameters_ keyEnumerator];\n\n  while ((key = [enumerator nextObject])) {\n    // The key from parameters_ corresponds to a key in\n    // urlParameterNames.  The value in parameters_ gets stored in\n    // crashParameters with a key that is the value in\n    // urlParameterNames.\n\n    // For instance, if parameters_ has [PRODUCT_NAME => \"FOOBAR\"] and\n    // urlParameterNames has [PRODUCT_NAME => \"pname\"] the final HTTP\n    // URL parameter becomes [pname => \"FOOBAR\"].\n    NSString *breakpadParameterName = (NSString *)key;\n    NSString *urlParameter = [urlParameterNames\n                                   objectForKey:breakpadParameterName];\n    if (urlParameter) {\n      [crashParameters setObject:[parameters_ objectForKey:key]\n                          forKey:urlParameter];\n    }\n  }\n\n  // Now, add the parameters that were added by the application.\n  enumerator = [extraServerVars_ keyEnumerator];\n\n  while ((key = [enumerator nextObject])) {\n    NSString *urlParameterName = (NSString *)key;\n    NSString *urlParameterValue =\n      [extraServerVars_ objectForKey:urlParameterName];\n    [crashParameters setObject:urlParameterValue\n                        forKey:urlParameterName];\n  }\n  return YES;\n}\n\n- (void)addServerParameter:(id)value forKey:(NSString *)key {\n  [extraServerVars_ setObject:value forKey:key];\n}\n\n//=============================================================================\n- (void)report {\n  NSURL *url = [NSURL URLWithString:[parameters_ objectForKey:@BREAKPAD_URL]];\n  HTTPMultipartUpload *upload = [[HTTPMultipartUpload alloc] initWithURL:url];\n  NSMutableDictionary *uploadParameters = [NSMutableDictionary dictionary];\n\n  if (![self populateServerDictionary:uploadParameters]) {\n    [upload release];\n    return;\n  }\n\n  [upload setParameters:uploadParameters];\n\n  // Add minidump file\n  if (minidumpContents_) {\n    [upload addFileContents:minidumpContents_ name:@\"upload_file_minidump\"];\n\n    // If there is a log file, upload it together with the minidump.\n    if (logFileData_) {\n      [upload addFileContents:logFileData_ name:@\"log\"];\n    }\n\n    // Send it\n    NSError *error = nil;\n    NSData *data = [upload send:&error];\n    NSString *result = [[NSString alloc] initWithData:data\n                                         encoding:NSUTF8StringEncoding];\n    const char *reportID = \"ERR\";\n\n    if (error) {\n      fprintf(stderr, \"Breakpad Uploader: Send Error: %s\\n\",\n              [[error description] UTF8String]);\n    } else {\n      NSCharacterSet *trimSet =\n          [NSCharacterSet whitespaceAndNewlineCharacterSet];\n      reportID = [[result stringByTrimmingCharactersInSet:trimSet] UTF8String];\n      [self logUploadWithID:reportID];\n    }\n\n    // rename the minidump file according to the id returned from the server\n    NSString *minidumpDir =\n        [parameters_ objectForKey:@kReporterMinidumpDirectoryKey];\n    NSString *minidumpID = [parameters_ objectForKey:@kReporterMinidumpIDKey];\n\n    NSString *srcString = [NSString stringWithFormat:@\"%@/%@.dmp\",\n                                    minidumpDir, minidumpID];\n    NSString *destString = [NSString stringWithFormat:@\"%@/%s.dmp\",\n                                     minidumpDir, reportID];\n\n    const char *src = [srcString fileSystemRepresentation];\n    const char *dest = [destString fileSystemRepresentation];\n\n    if (rename(src, dest) == 0) {\n      GTMLoggerInfo(@\"Breakpad Uploader: Renamed %s to %s after successful \" \\\n                    \"upload\",src, dest);\n    }\n    else {\n      // can't rename - don't worry - it's not important for users\n      GTMLoggerDebug(@\"Breakpad Uploader: successful upload report ID = %s\\n\",\n                     reportID );\n    }\n    [result release];\n  } else {\n    // Minidump is missing -- upload just the log file.\n    if (logFileData_) {\n      [self uploadData:logFileData_ name:@\"log\"];\n    }\n  }\n  [upload release];\n}\n\n- (void)uploadData:(NSData *)data name:(NSString *)name {\n  NSURL *url = [NSURL URLWithString:[parameters_ objectForKey:@BREAKPAD_URL]];\n  NSMutableDictionary *uploadParameters = [NSMutableDictionary dictionary];\n\n  if (![self populateServerDictionary:uploadParameters])\n    return;\n\n  HTTPMultipartUpload *upload =\n      [[HTTPMultipartUpload alloc] initWithURL:url];\n\n  [uploadParameters setObject:name forKey:@\"type\"];\n  [upload setParameters:uploadParameters];\n  [upload addFileContents:data name:name];\n\n  [upload send:nil];\n  [upload release];\n}\n\n- (void)logUploadWithID:(const char *)uploadID {\n  NSString *minidumpDir =\n      [parameters_ objectForKey:@kReporterMinidumpDirectoryKey];\n  NSString *logFilePath = [NSString stringWithFormat:@\"%@/%s\",\n      minidumpDir, kReporterLogFilename];\n  NSString *logLine = [NSString stringWithFormat:@\"%0.f,%s\\n\",\n      [[NSDate date] timeIntervalSince1970], uploadID];\n  NSData *logData = [logLine dataUsingEncoding:NSUTF8StringEncoding];\n\n  NSFileManager *fileManager = [NSFileManager defaultManager];\n  if ([fileManager fileExistsAtPath:logFilePath]) {\n    NSFileHandle *logFileHandle =\n       [NSFileHandle fileHandleForWritingAtPath:logFilePath];\n    [logFileHandle seekToEndOfFile];\n    [logFileHandle writeData:logData];\n    [logFileHandle closeFile];\n  } else {\n    [fileManager createFileAtPath:logFilePath\n                         contents:logData\n                       attributes:nil];\n  }\n}\n\n//=============================================================================\n- (NSMutableDictionary *)parameters {\n  return parameters_;\n}\n\n//=============================================================================\n- (void)dealloc {\n  [parameters_ release];\n  [minidumpContents_ release];\n  [logFileData_ release];\n  [googleDictionary_ release];\n  [socorroDictionary_ release];\n  [serverDictionary_ release];\n  [extraServerVars_ release];\n  [super dealloc];\n}\n\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/testapp/Controller.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#import <Cocoa/Cocoa.h>\n\n#import <Breakpad/Breakpad.h>\n\nenum BreakpadForkBehavior {\n  DONOTHING = 0,\n  UNINSTALL,\n  RESETEXCEPTIONPORT\n};\n\nenum BreakpadForkTestCrashPoint {\n  DURINGLAUNCH = 5,\n  AFTERLAUNCH = 6,\n  BETWEENFORKEXEC = 7\n};\n\n@interface Controller : NSObject {\n  IBOutlet NSWindow *window_;\n  IBOutlet NSWindow *forkTestOptions_;\n\n  BreakpadRef breakpad_;\n\n  enum BreakpadForkBehavior bpForkOption;\n\n  BOOL useVFork;\n  enum BreakpadForkTestCrashPoint progCrashPoint;\n}\n\n- (IBAction)crash:(id)sender;\n- (IBAction)forkTestOptions:(id)sender;\n- (IBAction)forkTestGo:(id)sender;\n- (IBAction)showForkTestWindow:(id) sender;\n- (void)generateReportWithoutCrash:(id)sender;\n- (void)awakeFromNib;\n\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/testapp/Controller.m",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#import <Breakpad/Breakpad.h>\n\n#import \"Controller.h\"\n#import \"TestClass.h\"\n#import \"GTMDefines.h\"\n#include <unistd.h>\n#include <mach/mach.h>\n\n@implementation Controller\n\n- (void)causeCrash {\n  float *aPtr = nil;\n  NSLog(@\"Crash!\");\n  NSLog(@\"Bad programmer: %f\", *aPtr);\n}\n\n- (void)generateReportWithoutCrash:(id)sender {\n  BreakpadGenerateAndSendReport(breakpad_);\n}\n\n- (IBAction)showForkTestWindow:(id) sender {\n  [forkTestOptions_ setIsVisible:YES];\n}\n\n- (IBAction)forkTestOptions:(id)sender {\n  NSInteger tag = [[sender selectedCell] tag];\n  NSLog(@\"sender tag: %d\", tag);\n  if (tag <= 2) {\n    bpForkOption = tag;\n  }\n\n  if (tag == 3) {\n    useVFork = NO;\n  }\n\n  if (tag == 4) {\n    useVFork = YES;\n  }\n\n  if (tag >= 5 && tag <= 7) {\n    progCrashPoint = tag;\n  }\n\n}\n\n- (IBAction)forkTestGo:(id)sender {\n\n  NSString *resourcePath = [[NSBundle bundleForClass:\n                                        [self class]] resourcePath];\n  NSString *execProgname = nil;\n  if (progCrashPoint == DURINGLAUNCH) {\n    execProgname = [resourcePath stringByAppendingString:@\"/crashduringload\"];\n  } else if (progCrashPoint == AFTERLAUNCH) {\n    execProgname = [resourcePath stringByAppendingString:@\"/crashInMain\"];\n  }\n\n  const char *progName = NULL;\n  if (progCrashPoint != BETWEENFORKEXEC) {\n    progName = [execProgname UTF8String];\n  }\n\n  int pid;\n\n  if (bpForkOption == UNINSTALL) {\n    BreakpadRelease(breakpad_);\n  }\n\n  if (useVFork) {\n    pid = vfork();\n  } else {\n    pid = fork();\n  }\n\n  if (pid == 0) {\n    sleep(3);\n    NSLog(@\"Child continuing\");\n    FILE *fd = fopen(\"/tmp/childlog.txt\",\"wt\");\n    kern_return_t kr;\n    if (bpForkOption == RESETEXCEPTIONPORT) {\n      kr = task_set_exception_ports(mach_task_self(),\n                               EXC_MASK_BAD_ACCESS | EXC_MASK_BAD_INSTRUCTION |\n                               EXC_MASK_ARITHMETIC | EXC_MASK_BREAKPOINT,\n                               MACH_PORT_NULL,\n                               EXCEPTION_DEFAULT,\n                               THREAD_STATE_NONE);\n      fprintf(fd,\"task_set_exception_ports returned %d\\n\", kr);\n    }\n\n    if (progCrashPoint == BETWEENFORKEXEC) {\n      fprintf(fd,\"crashing post-fork\\n\");\n      int *a = NULL;\n      printf(\"%d\\n\",*a++);\n    }\n\n    fprintf(fd,\"about to call exec with %s\\n\", progName);\n    fclose(fd);\n    int i = execl(progName, progName, NULL);\n    fprintf(fd, \"exec returned! %d\\n\", i);\n    fclose(fd);\n  }\n}\n\n- (IBAction)crash:(id)sender {\n  NSInteger tag = [sender tag];\n\n  if (tag == 1) {\n    [NSObject cancelPreviousPerformRequestsWithTarget:self];\n    [self performSelector:@selector(causeCrash) withObject:nil afterDelay:10.0];\n    [sender setState:NSOnState];\n    return;\n  }\n\n  if (tag == 2 && breakpad_) {\n    BreakpadRelease(breakpad_);\n    breakpad_ = NULL;\n    return;\n  }\n\n  [self causeCrash];\n}\n\n- (void)anotherThread {\n  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n  TestClass *tc = [[TestClass alloc] init];\n\n  [tc wait];\n\n  [pool release];\n}\n\n- (void)awakeFromNib {\n  NSBundle *bundle = [NSBundle mainBundle];\n  NSDictionary *info = [bundle infoDictionary];\n\n\n  breakpad_ = BreakpadCreate(info);\n\n  // Do some unit tests with keys\n  // first a series of bogus values\n  BreakpadSetKeyValue(breakpad_, nil, @\"bad2\");\n  BreakpadSetKeyValue(nil, @\"bad3\", @\"bad3\");\n\n  // Now some good ones\n  BreakpadSetKeyValue(breakpad_,@\"key1\", @\"value1\");\n  BreakpadSetKeyValue(breakpad_,@\"key2\", @\"value2\");\n  BreakpadSetKeyValue(breakpad_,@\"key3\", @\"value3\");\n\n  // Look for a bogus one that we didn't try to set\n  NSString *test = BreakpadKeyValue(breakpad_, @\"bad4\");\n  if (test) {\n    NSLog(@\"Bad BreakpadKeyValue (bad4)\");\n  }\n\n  // Look for a bogus one we did try to set\n  test = BreakpadKeyValue(breakpad_, @\"bad1\");\n  if (test) {\n    NSLog(@\"Bad BreakpadKeyValue (bad1)\");\n  }\n\n  // Test some bad args for BreakpadKeyValue\n  test = BreakpadKeyValue(nil, @\"bad5\");\n  if (test) {\n    NSLog(@\"Bad BreakpadKeyValue (bad5)\");\n  }\n\n  test = BreakpadKeyValue(breakpad_, nil);\n  if (test) {\n    NSLog(@\"Bad BreakpadKeyValue (nil)\");\n  }\n\n  // Find some we did set\n  test = BreakpadKeyValue(breakpad_, @\"key1\");\n  if (![test isEqualToString:@\"value1\"]) {\n    NSLog(@\"Can't find BreakpadKeyValue (key1)\");\n  }\n  test = BreakpadKeyValue(breakpad_, @\"key2\");\n  if (![test isEqualToString:@\"value2\"]) {\n    NSLog(@\"Can't find BreakpadKeyValue (key2)\");\n  }\n  test = BreakpadKeyValue(breakpad_, @\"key3\");\n  if (![test isEqualToString:@\"value3\"]) {\n    NSLog(@\"Can't find BreakpadKeyValue (key3)\");\n  }\n\n  // Bad args for BreakpadRemoveKeyValue\n  BreakpadRemoveKeyValue(nil, @\"bad6\");\n  BreakpadRemoveKeyValue(breakpad_, nil);\n\n  // Remove one that is valid\n  BreakpadRemoveKeyValue(breakpad_, @\"key3\");\n\n  // Try and find it\n  test = BreakpadKeyValue(breakpad_, @\"key3\");\n  if (test) {\n    NSLog(@\"Shouldn't find BreakpadKeyValue (key3)\");\n  }\n\n  // Try and remove it again\n  BreakpadRemoveKeyValue(breakpad_, @\"key3\");\n\n  // Try removal by setting to nil\n  BreakpadSetKeyValue(breakpad_,@\"key2\", nil);\n  // Try and find it\n  test = BreakpadKeyValue(breakpad_, @\"key2\");\n  if (test) {\n    NSLog(@\"Shouldn't find BreakpadKeyValue (key2)\");\n  }\n\n  BreakpadAddUploadParameter(breakpad_,\n                             @\"MeaningOfLife\",\n                             @\"42\");\n  [NSThread detachNewThreadSelector:@selector(anotherThread)\n                           toTarget:self withObject:nil];\n\n  NSUserDefaults *args = [NSUserDefaults standardUserDefaults];\n\n  // If the user specified autocrash on the command line, toggle\n  // Breakpad to not confirm and crash immediately.  This is for\n  // automated testing.\n  if ([args boolForKey:@\"autocrash\"]) {\n    BreakpadSetKeyValue(breakpad_,\n                        @BREAKPAD_SKIP_CONFIRM,\n                        @\"YES\");\n    [self causeCrash];\n  }\n\n  progCrashPoint = DURINGLAUNCH;\n  [window_ center];\n  [window_ makeKeyAndOrderFront:self];\n}\n\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/testapp/English.lproj/MainMenu.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<archive type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"7.10\">\n\t<data>\n\t\t<int key=\"IBDocument.SystemTarget\">1050</int>\n\t\t<string key=\"IBDocument.SystemVersion\">10F569</string>\n\t\t<string key=\"IBDocument.InterfaceBuilderVersion\">788</string>\n\t\t<string key=\"IBDocument.AppKitVersion\">1038.29</string>\n\t\t<string key=\"IBDocument.HIToolboxVersion\">461.00</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginVersions\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t<string key=\"NS.object.0\">788</string>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.EditedObjectIDs\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<integer value=\"220\"/>\n\t\t</object>\n\t\t<object class=\"NSArray\" key=\"IBDocument.PluginDependencies\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.Metadata\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\" id=\"0\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"NSMutableArray\" key=\"IBDocument.RootObjects\" id=\"925601844\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSCustomObject\" id=\"870565383\">\n\t\t\t\t<object class=\"NSMutableString\" key=\"NSClassName\">\n\t\t\t\t\t<characters key=\"NS.bytes\">NSApplication</characters>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSCustomObject\" id=\"442653439\">\n\t\t\t\t<string key=\"NSClassName\">FirstResponder</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSCustomObject\" id=\"751079937\">\n\t\t\t\t<string key=\"NSClassName\">NSApplication</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSWindowTemplate\" id=\"341270541\">\n\t\t\t\t<int key=\"NSWindowStyleMask\">15</int>\n\t\t\t\t<int key=\"NSWindowBacking\">2</int>\n\t\t\t\t<string key=\"NSWindowRect\">{{945, 874}, {320, 188}}</string>\n\t\t\t\t<int key=\"NSWTFlags\">1886912512</int>\n\t\t\t\t<string key=\"NSWindowTitle\">Window</string>\n\t\t\t\t<string key=\"NSWindowClass\">NSWindow</string>\n\t\t\t\t<object class=\"NSMutableString\" key=\"NSViewClass\">\n\t\t\t\t\t<characters key=\"NS.bytes\">View</characters>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSWindowContentMaxSize\">{1.79769e+308, 1.79769e+308}</string>\n\t\t\t\t<string key=\"NSWindowContentMinSize\">{213, 107}</string>\n\t\t\t\t<object class=\"NSView\" key=\"NSWindowView\" id=\"814272478\">\n\t\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"726278107\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"814272478\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">301</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{14, 140}, {292, 32}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"814272478\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"539552922\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">134217728</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Crash! (Airbag Installed)</string>\n\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"NSSupport\" id=\"933596199\">\n\t\t\t\t\t\t\t\t\t<string key=\"NSName\">LucidaGrande</string>\n\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">13</double>\n\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">1044</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"726278107\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">-2038284033</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">1</int>\n\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSKeyEquivalent\">\n\t\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"799567279\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"814272478\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">301</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{14, 76}, {292, 32}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"814272478\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<int key=\"NSTag\">2</int>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"1010617379\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">134217728</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Crash! (Airbag NOT Installed)</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"799567279\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSTag\">2</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">-2038284033</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">1</int>\n\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSKeyEquivalent\">\n\t\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"27781390\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"814272478\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">301</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{14, 108}, {292, 32}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"814272478\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<int key=\"NSTag\">1</int>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"547901497\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">134217728</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Crash! (Airbag Installed w/10sec delay)</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"27781390\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSTag\">1</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">-2038284033</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">1</int>\n\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSKeyEquivalent\">\n\t\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"856256540\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"814272478\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">268</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{14, 44}, {292, 32}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"814272478\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"353736234\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">134217728</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Fork Test</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"856256540\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">-2038284033</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">129</int>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"460755987\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"814272478\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">268</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{14, 12}, {292, 32}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"814272478\"/>\n\t\t\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"775425649\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">134217728</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Generate report without crash</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"460755987\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">-2038284033</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">129</int>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"NSFrameSize\">{320, 188}</string>\n\t\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t\t<reference key=\"NSWindow\"/>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSScreenRect\">{{0, 0}, {1440, 878}}</string>\n\t\t\t\t<string key=\"NSMinSize\">{213, 129}</string>\n\t\t\t\t<string key=\"NSMaxSize\">{1.79769e+308, 1.79769e+308}</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSMenu\" id=\"695387251\">\n\t\t\t\t<string key=\"NSTitle\">MainMenu</string>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"458207250\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"695387251\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">NewApplication</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"NSOnImage\" id=\"419346806\">\n\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t<string key=\"NSResourceName\">NSMenuCheckmark</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSCustomResource\" key=\"NSMixedImage\" id=\"290286705\">\n\t\t\t\t\t\t\t<string key=\"NSClassName\">NSImage</string>\n\t\t\t\t\t\t\t<string key=\"NSResourceName\">NSMenuMixedState</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"753534561\">\n\t\t\t\t\t\t\t<string key=\"NSTitle\">NewApplication</string>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"838552093\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"753534561\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">About NewApplication</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"758254482\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"753534561\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"443649494\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"753534561\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Preferences…</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">,</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"217746140\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"753534561\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"826764396\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"753534561\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Services</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"276709607\">\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSTitle\">\n\t\t\t\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\">Services</characters>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSName\">_NSServicesMenu</string>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"881859155\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"753534561\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"104472016\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"753534561\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Hide NewApplication</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">h</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"216168366\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"753534561\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Hide Others</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">h</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1572864</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"667790509\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"753534561\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Show All</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"928933982\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"753534561\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"887927135\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"753534561\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Quit NewApplication</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">q</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"NSName\">_NSAppleMenu</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"369472335\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"695387251\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">File</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"902982238\">\n\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSTitle\">\n\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\">File</characters>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"660391032\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"902982238\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">New</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">n</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"367379562\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"902982238\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Open...</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">o</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"84883275\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"902982238\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Open Recent</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"693280130\">\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSTitle\">\n\t\t\t\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\">Open Recent</characters>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"85018532\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"693280130\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Clear Menu</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSName\">_NSRecentDocumentsMenu</string>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"154948703\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"902982238\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"468594275\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"902982238\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Close</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">w</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"479945444\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"902982238\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Save</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">s</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"976375553\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"902982238\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Save As…</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">S</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"885975128\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"902982238\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Revert</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"232609393\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"902982238\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"409810395\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"902982238\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Page Setup…</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">P</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"302505815\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"902982238\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Print…</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">p</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"542216986\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"695387251\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">Edit</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"1053284541\">\n\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSTitle\">\n\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\">Edit</characters>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"284548410\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1053284541\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Undo</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">z</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"1001272176\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1053284541\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Redo</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">Z</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"209744238\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1053284541\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"909447496\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1053284541\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Cut</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">x</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"994487277\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1053284541\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Copy</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">c</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"84012734\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1053284541\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Paste</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">v</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"182251545\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1053284541\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Paste and Match Style</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">V</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1572864</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"512189403\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1053284541\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Delete</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"917620781\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1053284541\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Select All</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">a</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"431895313\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1053284541\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"153501847\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1053284541\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Find</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"333484665\">\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSTitle\">\n\t\t\t\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\">Find</characters>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"203238834\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"333484665\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Find…</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">f</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">1</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"861312964\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"333484665\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Find Next</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">g</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">2</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"743767160\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"333484665\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Find Previous</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">G</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"180446588\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"333484665\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Use Selection for Find</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">e</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">7</int>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"731027425\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"333484665\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Jump to Selection</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">j</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"61602259\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1053284541\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Spelling</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"8174285\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Spelling</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"438210660\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"8174285\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Spelling…</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">:</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"102172584\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"8174285\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Check Spelling</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">;</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"540509341\">\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"8174285\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Check Spelling as You Type</string>\n\t\t\t\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"764068863\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"695387251\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">Window</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"200536676\">\n\t\t\t\t\t\t\t<object class=\"NSMutableString\" key=\"NSTitle\">\n\t\t\t\t\t\t\t\t<characters key=\"NS.bytes\">Window</characters>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"683986939\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"200536676\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Minimize</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">m</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"548098734\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"200536676\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Zoom</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"297002686\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"200536676\"/>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsDisabled\">YES</bool>\n\t\t\t\t\t\t\t\t\t<bool key=\"NSIsSeparator\">YES</bool>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"164762492\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"200536676\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">Bring All to Front</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"NSName\">_NSWindowsMenu</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMenuItem\" id=\"599772536\">\n\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"695387251\"/>\n\t\t\t\t\t\t<string key=\"NSTitle\">Help</string>\n\t\t\t\t\t\t<string key=\"NSKeyEquiv\"/>\n\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t<string key=\"NSAction\">submenuAction:</string>\n\t\t\t\t\t\t<object class=\"NSMenu\" key=\"NSSubmenu\" id=\"1066958924\">\n\t\t\t\t\t\t\t<string key=\"NSTitle\">Help</string>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSMenuItems\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSMenuItem\" id=\"192540884\">\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMenu\" ref=\"1066958924\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSTitle\">NewApplication Help</string>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquiv\">?</string>\n\t\t\t\t\t\t\t\t\t<int key=\"NSKeyEquivModMask\">1048576</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSMnemonicLoc\">2147483647</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSOnImage\" ref=\"419346806\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSMixedImage\" ref=\"290286705\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSName\">_NSMainMenu</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSCustomObject\" id=\"623097029\">\n\t\t\t\t<string key=\"NSClassName\">Controller</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSWindowTemplate\" id=\"347013037\">\n\t\t\t\t<int key=\"NSWindowStyleMask\">15</int>\n\t\t\t\t<int key=\"NSWindowBacking\">2</int>\n\t\t\t\t<string key=\"NSWindowRect\">{{858, 755}, {787, 260}}</string>\n\t\t\t\t<int key=\"NSWTFlags\">603979776</int>\n\t\t\t\t<string key=\"NSWindowTitle\">Window</string>\n\t\t\t\t<string key=\"NSWindowClass\">NSWindow</string>\n\t\t\t\t<nil key=\"NSViewClass\"/>\n\t\t\t\t<string key=\"NSWindowContentMaxSize\">{1.79769e+308, 1.79769e+308}</string>\n\t\t\t\t<object class=\"NSView\" key=\"NSWindowView\" id=\"594333702\">\n\t\t\t\t\t<reference key=\"NSNextResponder\"/>\n\t\t\t\t\t<int key=\"NSvFlags\">256</int>\n\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSSubviews\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSMatrix\" id=\"891367997\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"594333702\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">268</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 7}, {645, 79}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"594333702\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<int key=\"NSNumRows\">3</int>\n\t\t\t\t\t\t\t<int key=\"NSNumCols\">1</int>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSCells\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSButtonCell\" id=\"410017819\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">-2080244224</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">program crashes during launch because of missing dylib</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"891367997\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">5</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912703</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<object class=\"NSButtonImageSource\" key=\"NSAlternateImage\" id=\"619763889\">\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSImageName\">NSRadioButton</string>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSButtonCell\" id=\"904578786\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">program crashes after launch</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"891367997\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">6</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912703</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<object class=\"NSImage\" key=\"NSNormalImage\">\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSImageFlags\">549453824</int>\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSSize\">{18, 18}</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSReps\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\">\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<integer value=\"0\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSBitmapImageRep\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSData\" key=\"NSTIFFRepresentation\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NS.bytes\">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw\nIyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/\n29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5\ndXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA\nAAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG\nAAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/\n0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/\n7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/\n5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/\n3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD\nAAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns\nAAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/\n6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/\n/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/\n///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl\nYmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA\nAAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD\nAAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu\nAAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB\nAAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES\nAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS\nAAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw\ncGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA\nAXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA\nBOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA\nAAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA\nAAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1\ncnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD\nAQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH\nSElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF\nhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8\nvL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt\n7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq\nKy0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo\naWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e\nn6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX\n2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW\nFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O\nTk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6\nent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt\nrq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA\nAAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA\nAAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl\nA5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq\nDIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU\nHC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8\nMtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v\nUI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/\neQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj\nrMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn\n5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh\nAZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK\nCfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY\nGPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95\nMFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S\nUGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2\nd396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV\npVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK\n0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf//\nAAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw\nBcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA\nFBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H\nLqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh\nVv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ\nh2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp\nsvK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb\n1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX\n8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE\nAABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg\nQXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSColor\" id=\"30384615\">\n\t\t\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MCAwAA</bytes>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"619763889\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">400</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">75</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSButtonCell\" id=\"971445237\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">program crashes in between fork() and exec() (3rd option in first group will happen before crash)</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"891367997\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">7</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912703</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<object class=\"NSImage\" key=\"NSNormalImage\">\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSImageFlags\">549453824</int>\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSSize\">{18, 18}</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSReps\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\">\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<integer value=\"0\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSBitmapImageRep\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSData\" key=\"NSTIFFRepresentation\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NS.bytes\">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw\nIyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/\n29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5\ndXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA\nAAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG\nAAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/\n0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/\n7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/\n5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/\n3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD\nAAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns\nAAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/\n6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/\n/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/\n///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl\nYmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA\nAAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD\nAAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu\nAAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB\nAAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES\nAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS\nAAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAv0AAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAL9GFw\ncGwCAAAAbW50clJHQiBYWVogB9gAAgAMAAoAFgAIYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAPbWAAEAAAAA0y1hcHBs625VECyhxeSV9P9A73pKGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAANclhZWgAAASAAAAAUZ1hZWgAAATQAAAAUYlhZWgAAAUgAAAAUd3RwdAAAAVwAAAAUY2hhZAAA\nAXAAAAAsclRSQwAAAZwAAAAOZ1RSQwAAAawAAAAOYlRSQwAAAbwAAAAOdmNndAAAAcwAAAYSbmRpbgAA\nB+AAAAMOZGVzYwAACvAAAACZY3BydAAAC4wAAABAbW1vZAAAC8wAAAAoWFlaIAAAAAAAAJumAABMVQAA\nArBYWVogAAAAAAAANWMAAJ/rAAAZsVhZWiAAAAAAAAAlzQAAE9UAALbFWFlaIAAAAAAAAPPYAAEAAAAB\nFghzZjMyAAAAAAABC7cAAAWW///zVwAABykAAP3X///7t////aYAAAPaAADA9mN1cnYAAAAAAAAAAQHN\nAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAADAQAAAgAAAioENAYA\nB9AJlAtRDQwOshBOEekTgxUVFqMYMRm9GzwcvR4+H7chLiKnJBoliCb3KGIpyCswLJMt9C9WMLIyDjNn\nNL02FTdoOLs6ETtdPKw9+D9DQJBB1kMeRGZFq0bySDRJeEq6S/tNPk59T75Q+lI2U25Uo1XZVwlYOlln\nWpZbwFzsXhdfQWBrYZRiv2PoZRNmPWdqaJhpyGr5bC1tZW6hb+BxLXJ+c9d1OHafeA55gnr5fHR98H9t\ngOuCY4PYhUqGsIgSiWyKuIwBjTqObY+VkLORyJLUk9eU05XFlrWXlZh2mUuaG5rsm6ucbJ0qndqei588\nn9+ghKEqoceiYqL/o5qkLqTDpVml66Z7pwunnKgpqLWpQqnQqlqq5Ktvq/qsg60MrZauIa6qrzOvvbBH\nsNGxXLHnsnKy/7OMtBm0p7U3tci2Wbbrt4C4FrituUa54rqAux27wbxlvQq9rr5Tvvi/ncBAwOXBisIu\nwtPDeMQdxMLFaMYPxrXHXMgEyKzJVcn/yqnLVcwBzK7NXc4Mzr3PcNAk0NnRkdJK0wTTw9SC1UTWCtbR\n153Ybdk+2hfa8dvM3KfdhN5g3zzgGuD34dbiteOV5HblWeY85yHoCOjw6drqxuu27Kbtm+6R74zwivGM\n8pPzn/Sw9cj25/gP+T76e/u//Rr+hP//AAABpANzBRoGsggnCZsLFQx+Dd4PRRCiEf8TYxS0FgoXXRiu\nGgQbTRyZHekfMCB8IcIjCSRSJZUm3SgdKWAqpCvjLSYuZC+lMOIyIDNgNJs12TcTOFA5izrEO/49NT5w\nP6dA30IWQ01Eg0W4Ru9IIElVSoZLt0zmThVPRFBwUZ5SylP5VSRWUVd+WKtZ2lsIXDhdaV6bX89hBWI8\nY3dktGX0ZzhohGnVayxsiW3sb1Vww3I0c6p1I3aeeBl5k3sMfIR99X9kgM6CLYOJhNyGJodriKGJ1Ir5\njBuNL45Aj0WQSJE8kjKTGJP+lNyVspaKl1OYHZjlmaSaZJshm9ecj51EnfSepJ9Vn/+gqqFWofyio6NL\no/CklKU4pdymfacfp8KoYqkDqaWqRarlq4asJ6zHrWiuCq6rr02v77CSsTax27KAsyezzrR3tSG1zLZ5\ntye32LiKuT659rqwu2q8J7zkvaK+YL8ev93AnMFcwhzC3MOdxF7FIMXixqXHaMgryPDJtcp6y0DMB8zO\nzZbOX88oz/PQvtGJ0lbTI9Px1MDVkNZi1zTYB9jb2bDah9te3DjdEt3t3sjfpOB/4VviN+MT4/DkzeWq\n5ojnZuhG6SXqBuro68rsre2S7nfvXvBH8TDyHPMI8/j06fXc9tL3yvjF+cL6w/vG/ND92v7s//8AAAMJ\nBboIZwrCDSsPghG8E/IWHxg5GkgcVB5VIEQiMyQTJeknuimHK00tCy7AMHEyHDO/NV829ziKOhs7pj0s\nPrBALEGmQx9EkkYCR3JI3EpCS6pND05vT89RLVKKU+dVP1aYV+9ZRVqdW/NdSV6hX+thM2JzY61k42YS\nZ0FoZ2mOaq5rz2zsbglvI3A9cVRybHOEdJx1tHbOd+d5A3ofez98Yn2Lfrl/8IEqgmyDsoT8hkuHnYjw\nikSLmYzsjj+PjJDWkh2TW5SXlceW85gWmTOaSJtVnFqdWp5Pn0SgKaEQoeuiwqOYpGClKaXtpqmnZqgf\nqNKph6o5quWrk6xArOatja41rtevebAcsLyxWbH3spWzL7PJtGO0/LWTtiq2wrdWt+q4f7kUuaW6OLrL\nu1277Lx9vQ69nr4tvry/TL/bwGjA98GGwhPCocMvw77ESsTYxWXF9MZ/xwzHmcgkyKXJJ8mpyizKpMsc\ny5XMDsyFzPjNa83fzlPOxc81z6fQGNCK0PvRbNHe0lDSw9M206vUINSV1QvVhtYA1nzW+Nd61//YhNkK\n2ZnaL9rG213cCty63WveI97d35fgUuEO4crih+NE5ALkw+WD5kXnCufP6JbpYOor6vrry+yd7XbuUe8w\n8BXw+/Ht8uDz4PTl9fj3E/hE+X363vxa/gH//wAAbmRpbgAAAAAAAAMGAACogAAAUwAAADRAAACqQAAA\nJpcAABLbAABQQAAAVEAAAj99AAI1egACxUsAAwB4AAIAAAADAAsAGQAsAEUAYwCHALEA4QEWAVEBkgHZ\nAiYCeQLSAzEDlwQDBHYE7wVvBfUGgwcXB7IIUwj8CawKYgsgC+QMrw2BDloPORAfEQ0SBRMGFBEVJBZA\nF2MYjhm/GvYcMh1xHrMf9SE1ImwjnSTJJfAnFig7KWMqjivBLP4uSC+jMRMymzRBNgo3+joWPGY+8EG8\nRNhIQEvvT95UCFhkXOxhlWZYaylv/XTKeYN+GoKOhxGLqJBOlP6Ztp5voyan1Kx0sQG1c7nGvfHB9cX7\nygbOFNIi1izaMN4p4hTl7emv7Vbw3vRC93z6iP1g//8AAAAEAA8AIgA9AF8AiQC7APQBNAF8AcwCIgKB\nAuYDUwPHBEIExAVOBd4GdgcUB7oIZgkaCdQKlQteDC0NAw3gDsQPrxCiEZwSnxOpFLsV0xbyGBcZQRpw\nG6Mc2R4RH0oggyG3IuckEyU8JmQniyiyKd0rDCxBLYAuyTAhMYkzBjSbNkw4HToSPDA+fED8Q7FGmUmx\nTPdQaFQAV7tbll+KY5RnrmvTb/p0H3g6fEOAMoQXiASL+I/yk/KX+JwBoA2kHKgrrDuwS7RYuGK8aMBo\nxGvId8yI0J/UuNjS3OvhAOUQ6RftE/EC9OH4rfxi//8AAAABAAYADQAXACUANQBIAF8AeQCWALcA3AEE\nATABYQGVAc4CDAJOApUC4QMyA4gD5QRGBK4FHAWPBgkGigcQB54IMQjMCW0KFArDC3cMMgzzDbsOiA9a\nEDIRFhIIEwgUFRUvFlYXhxjDGgkbVhyqHgMfYCC8IhIjYSSrJfMnOSiBKc0rHyx7LeQvXTDrMpE0VTY7\nOEg6gjzuP5NCckWCSMJMMk/QU5xXk1u1X/9kcGkGbb5ylneLfJqByoeDjcyUf5t4oo2plLBetru8eMFr\nxirK7c+v1GnZFd2r4iXme+ql7pryUvXD+OT7qv4M//8AAGRlc2MAAAAAAAAAFUhQIExQMzA2NSBDYWxp\nYnJhdGVkAAAAAAAAAAAVAEgAUAAgAEwAUAAzADAANgA1ACAAQwBhAGwAaQBiAHIAYQB0AGUAZAAAAAAV\nSFAgTFAzMDY1IENhbGlicmF0ZWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMDgAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAABtbW9kAAAAAAAAIvAAACaQAAAAAMJtVwAAAAAAAAAAAAAAAAAAAAAAA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<reference key=\"NSColor\" ref=\"30384615\"/>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"619763889\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"NSCellSize\">{645, 25}</string>\n\t\t\t\t\t\t\t<string key=\"NSIntercellSpacing\">{4, 2}</string>\n\t\t\t\t\t\t\t<int key=\"NSMatrixFlags\">1151868928</int>\n\t\t\t\t\t\t\t<string key=\"NSCellClass\">NSActionCell</string>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSProtoCell\" id=\"1072218638\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">-2080244224</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">program crashes after launch</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSTag\">5</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912703</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">0</int>\n\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"619763889\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<reference key=\"NSSelectedCell\" ref=\"410017819\"/>\n\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSBackgroundColor\" id=\"349124561\">\n\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">6</int>\n\t\t\t\t\t\t\t\t<string key=\"NSCatalogName\">System</string>\n\t\t\t\t\t\t\t\t<string key=\"NSColorName\">controlColor</string>\n\t\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSColor\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MC42NjY2NjY2NjY3AA</bytes>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"NSColor\" key=\"NSCellBackgroundColor\" id=\"195671423\">\n\t\t\t\t\t\t\t\t<int key=\"NSColorSpace\">3</int>\n\t\t\t\t\t\t\t\t<bytes key=\"NSWhite\">MQA</bytes>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<reference key=\"NSFont\" ref=\"933596199\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMatrix\" id=\"7590393\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"594333702\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">268</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 170}, {565, 70}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"594333702\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<int key=\"NSNumRows\">3</int>\n\t\t\t\t\t\t\t<int key=\"NSNumCols\">1</int>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSCells\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSButtonCell\" id=\"808388382\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">-2080244224</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">Leave breakpad alone before fork</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"7590393\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912703</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"619763889\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSButtonCell\" id=\"378736460\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">Uninitialize Breakpad before fork</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"7590393\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">1</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912703</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<object class=\"NSImage\" key=\"NSNormalImage\">\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSImageFlags\">549453824</int>\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSSize\">{18, 18}</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSReps\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\">\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<integer value=\"0\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSBitmapImageRep\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSData\" key=\"NSTIFFRepresentation\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NS.bytes\">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw\nIyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/\n29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5\ndXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA\nAAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG\nAAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/\n0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/\n7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/\n5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/\n3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD\nAAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns\nAAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/\n6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/\n/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/\n///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl\nYmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA\nAAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD\nAAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu\nAAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB\nAAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES\nAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS\nAAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw\ncGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA\nAXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA\nBOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA\nAAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA\nAAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1\ncnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD\nAQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH\nSElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF\nhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8\nvL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt\n7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq\nKy0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo\naWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e\nn6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX\n2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW\nFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O\nTk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6\nent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt\nrq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA\nAAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA\nAAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl\nA5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq\nDIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU\nHC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8\nMtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v\nUI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/\neQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj\nrMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn\n5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh\nAZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK\nCfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY\nGPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95\nMFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S\nUGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2\nd396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV\npVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK\n0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf//\nAAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw\nBcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA\nFBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H\nLqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh\nVv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ\nh2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp\nsvK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb\n1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX\n8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE\nAABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg\nQXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<reference key=\"NSColor\" ref=\"30384615\"/>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"619763889\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">400</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">75</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSButtonCell\" id=\"251439646\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">Call task_set_exception_port with null exception port in child process before exec</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"7590393\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">2</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912703</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<object class=\"NSImage\" key=\"NSNormalImage\">\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSImageFlags\">549453824</int>\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSSize\">{18, 18}</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSReps\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\">\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<integer value=\"0\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSBitmapImageRep\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSData\" key=\"NSTIFFRepresentation\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NS.bytes\">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw\nIyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/\n29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5\ndXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA\nAAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG\nAAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/\n0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/\n7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/\n5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/\n3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD\nAAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns\nAAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/\n6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/\n/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/\n///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl\nYmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA\nAAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD\nAAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu\nAAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB\nAAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES\nAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS\nAAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAv0AAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAL9GFw\ncGwCAAAAbW50clJHQiBYWVogB9gAAgAMAAoAFgAIYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAPbWAAEAAAAA0y1hcHBs625VECyhxeSV9P9A73pKGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAANclhZWgAAASAAAAAUZ1hZWgAAATQAAAAUYlhZWgAAAUgAAAAUd3RwdAAAAVwAAAAUY2hhZAAA\nAXAAAAAsclRSQwAAAZwAAAAOZ1RSQwAAAawAAAAOYlRSQwAAAbwAAAAOdmNndAAAAcwAAAYSbmRpbgAA\nB+AAAAMOZGVzYwAACvAAAACZY3BydAAAC4wAAABAbW1vZAAAC8wAAAAoWFlaIAAAAAAAAJumAABMVQAA\nArBYWVogAAAAAAAANWMAAJ/rAAAZsVhZWiAAAAAAAAAlzQAAE9UAALbFWFlaIAAAAAAAAPPYAAEAAAAB\nFghzZjMyAAAAAAABC7cAAAWW///zVwAABykAAP3X///7t////aYAAAPaAADA9mN1cnYAAAAAAAAAAQHN\nAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAADAQAAAgAAAioENAYA\nB9AJlAtRDQwOshBOEekTgxUVFqMYMRm9GzwcvR4+H7chLiKnJBoliCb3KGIpyCswLJMt9C9WMLIyDjNn\nNL02FTdoOLs6ETtdPKw9+D9DQJBB1kMeRGZFq0bySDRJeEq6S/tNPk59T75Q+lI2U25Uo1XZVwlYOlln\nWpZbwFzsXhdfQWBrYZRiv2PoZRNmPWdqaJhpyGr5bC1tZW6hb+BxLXJ+c9d1OHafeA55gnr5fHR98H9t\ngOuCY4PYhUqGsIgSiWyKuIwBjTqObY+VkLORyJLUk9eU05XFlrWXlZh2mUuaG5rsm6ucbJ0qndqei588\nn9+ghKEqoceiYqL/o5qkLqTDpVml66Z7pwunnKgpqLWpQqnQqlqq5Ktvq/qsg60MrZauIa6qrzOvvbBH\nsNGxXLHnsnKy/7OMtBm0p7U3tci2Wbbrt4C4FrituUa54rqAux27wbxlvQq9rr5Tvvi/ncBAwOXBisIu\nwtPDeMQdxMLFaMYPxrXHXMgEyKzJVcn/yqnLVcwBzK7NXc4Mzr3PcNAk0NnRkdJK0wTTw9SC1UTWCtbR\n153Ybdk+2hfa8dvM3KfdhN5g3zzgGuD34dbiteOV5HblWeY85yHoCOjw6drqxuu27Kbtm+6R74zwivGM\n8pPzn/Sw9cj25/gP+T76e/u//Rr+hP//AAABpANzBRoGsggnCZsLFQx+Dd4PRRCiEf8TYxS0FgoXXRiu\nGgQbTRyZHekfMCB8IcIjCSRSJZUm3SgdKWAqpCvjLSYuZC+lMOIyIDNgNJs12TcTOFA5izrEO/49NT5w\nP6dA30IWQ01Eg0W4Ru9IIElVSoZLt0zmThVPRFBwUZ5SylP5VSRWUVd+WKtZ2lsIXDhdaV6bX89hBWI8\nY3dktGX0ZzhohGnVayxsiW3sb1Vww3I0c6p1I3aeeBl5k3sMfIR99X9kgM6CLYOJhNyGJodriKGJ1Ir5\njBuNL45Aj0WQSJE8kjKTGJP+lNyVspaKl1OYHZjlmaSaZJshm9ecj51EnfSepJ9Vn/+gqqFWofyio6NL\no/CklKU4pdymfacfp8KoYqkDqaWqRarlq4asJ6zHrWiuCq6rr02v77CSsTax27KAsyezzrR3tSG1zLZ5\ntye32LiKuT659rqwu2q8J7zkvaK+YL8ev93AnMFcwhzC3MOdxF7FIMXixqXHaMgryPDJtcp6y0DMB8zO\nzZbOX88oz/PQvtGJ0lbTI9Px1MDVkNZi1zTYB9jb2bDah9te3DjdEt3t3sjfpOB/4VviN+MT4/DkzeWq\n5ojnZuhG6SXqBuro68rsre2S7nfvXvBH8TDyHPMI8/j06fXc9tL3yvjF+cL6w/vG/ND92v7s//8AAAMJ\nBboIZwrCDSsPghG8E/IWHxg5GkgcVB5VIEQiMyQTJeknuimHK00tCy7AMHEyHDO/NV829ziKOhs7pj0s\nPrBALEGmQx9EkkYCR3JI3EpCS6pND05vT89RLVKKU+dVP1aYV+9ZRVqdW/NdSV6hX+thM2JzY61k42YS\nZ0FoZ2mOaq5rz2zsbglvI3A9cVRybHOEdJx1tHbOd+d5A3ofez98Yn2Lfrl/8IEqgmyDsoT8hkuHnYjw\nikSLmYzsjj+PjJDWkh2TW5SXlceW85gWmTOaSJtVnFqdWp5Pn0SgKaEQoeuiwqOYpGClKaXtpqmnZqgf\nqNKph6o5quWrk6xArOatja41rtevebAcsLyxWbH3spWzL7PJtGO0/LWTtiq2wrdWt+q4f7kUuaW6OLrL\nu1277Lx9vQ69nr4tvry/TL/bwGjA98GGwhPCocMvw77ESsTYxWXF9MZ/xwzHmcgkyKXJJ8mpyizKpMsc\ny5XMDsyFzPjNa83fzlPOxc81z6fQGNCK0PvRbNHe0lDSw9M206vUINSV1QvVhtYA1nzW+Nd61//YhNkK\n2ZnaL9rG213cCty63WveI97d35fgUuEO4crih+NE5ALkw+WD5kXnCufP6JbpYOor6vrry+yd7XbuUe8w\n8BXw+/Ht8uDz4PTl9fj3E/hE+X363vxa/gH//wAAbmRpbgAAAAAAAAMGAACogAAAUwAAADRAAACqQAAA\nJpcAABLbAABQQAAAVEAAAj99AAI1egACxUsAAwB4AAIAAAADAAsAGQAsAEUAYwCHALEA4QEWAVEBkgHZ\nAiYCeQLSAzEDlwQDBHYE7wVvBfUGgwcXB7IIUwj8CawKYgsgC+QMrw2BDloPORAfEQ0SBRMGFBEVJBZA\nF2MYjhm/GvYcMh1xHrMf9SE1ImwjnSTJJfAnFig7KWMqjivBLP4uSC+jMRMymzRBNgo3+joWPGY+8EG8\nRNhIQEvvT95UCFhkXOxhlWZYaylv/XTKeYN+GoKOhxGLqJBOlP6Ztp5voyan1Kx0sQG1c7nGvfHB9cX7\nygbOFNIi1izaMN4p4hTl7emv7Vbw3vRC93z6iP1g//8AAAAEAA8AIgA9AF8AiQC7APQBNAF8AcwCIgKB\nAuYDUwPHBEIExAVOBd4GdgcUB7oIZgkaCdQKlQteDC0NAw3gDsQPrxCiEZwSnxOpFLsV0xbyGBcZQRpw\nG6Mc2R4RH0oggyG3IuckEyU8JmQniyiyKd0rDCxBLYAuyTAhMYkzBjSbNkw4HToSPDA+fED8Q7FGmUmx\nTPdQaFQAV7tbll+KY5RnrmvTb/p0H3g6fEOAMoQXiASL+I/yk/KX+JwBoA2kHKgrrDuwS7RYuGK8aMBo\nxGvId8yI0J/UuNjS3OvhAOUQ6RftE/EC9OH4rfxi//8AAAABAAYADQAXACUANQBIAF8AeQCWALcA3AEE\nATABYQGVAc4CDAJOApUC4QMyA4gD5QRGBK4FHAWPBgkGigcQB54IMQjMCW0KFArDC3cMMgzzDbsOiA9a\nEDIRFhIIEwgUFRUvFlYXhxjDGgkbVhyqHgMfYCC8IhIjYSSrJfMnOSiBKc0rHyx7LeQvXTDrMpE0VTY7\nOEg6gjzuP5NCckWCSMJMMk/QU5xXk1u1X/9kcGkGbb5ylneLfJqByoeDjcyUf5t4oo2plLBetru8eMFr\nxirK7c+v1GnZFd2r4iXme+ql7pryUvXD+OT7qv4M//8AAGRlc2MAAAAAAAAAFUhQIExQMzA2NSBDYWxp\nYnJhdGVkAAAAAAAAAAAVAEgAUAAgAEwAUAAzADAANgA1ACAAQwBhAGwAaQBiAHIAYQB0AGUAZAAAAAAV\nSFAgTFAzMDY1IENhbGlicmF0ZWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAHRleHQAAAAAQ29weXJpZ2h0IEFwcGxlIEluYy4sIDIwMDgAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAABtbW9kAAAAAAAAIvAAACaQAAAAAMJtVwAAAAAAAAAAAAAAAAAAAAAAA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<reference key=\"NSColor\" ref=\"30384615\"/>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"619763889\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">400</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">75</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"NSCellSize\">{565, 22}</string>\n\t\t\t\t\t\t\t<string key=\"NSIntercellSpacing\">{4, 2}</string>\n\t\t\t\t\t\t\t<int key=\"NSMatrixFlags\">1151868928</int>\n\t\t\t\t\t\t\t<string key=\"NSCellClass\">NSActionCell</string>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSProtoCell\" id=\"773902463\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Radio</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912703</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">0</int>\n\t\t\t\t\t\t\t\t<object class=\"NSImage\" key=\"NSNormalImage\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSImageFlags\">549453824</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSSize\">{18, 18}</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSReps\">\n\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<integer value=\"0\"/>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSBitmapImageRep\">\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSData\" key=\"NSTIFFRepresentation\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NS.bytes\">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw\nIyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/\n29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5\ndXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA\nAAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG\nAAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/\n0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/\n7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/\n5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/\n3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD\nAAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns\nAAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/\n6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/\n/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/\n///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl\nYmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA\nAAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD\nAAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu\nAAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB\nAAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES\nAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS\nAAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSColor\" ref=\"30384615\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"619763889\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">400</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">75</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<reference key=\"NSSelectedCell\" ref=\"808388382\"/>\n\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"349124561\"/>\n\t\t\t\t\t\t\t<reference key=\"NSCellBackgroundColor\" ref=\"195671423\"/>\n\t\t\t\t\t\t\t<reference key=\"NSFont\" ref=\"933596199\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMatrix\" id=\"1050951576\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"594333702\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">268</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{20, 104}, {565, 38}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"594333702\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<int key=\"NSNumRows\">2</int>\n\t\t\t\t\t\t\t<int key=\"NSNumCols\">1</int>\n\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSCells\">\n\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t<object class=\"NSButtonCell\" id=\"943458284\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">-2080244224</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">fork()</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"1050951576\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">3</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912703</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"619763889\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">200</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">25</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<object class=\"NSButtonCell\" id=\"69061500\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSContents\">vfork()</string>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"1050951576\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSTag\">4</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912703</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">0</int>\n\t\t\t\t\t\t\t\t\t<object class=\"NSImage\" key=\"NSNormalImage\">\n\t\t\t\t\t\t\t\t\t\t<int key=\"NSImageFlags\">549453824</int>\n\t\t\t\t\t\t\t\t\t\t<string key=\"NSSize\">{18, 18}</string>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSReps\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\">\n\t\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t\t<integer value=\"0\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSBitmapImageRep\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSData\" key=\"NSTIFFRepresentation\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NS.bytes\">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw\nIyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/\n29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5\ndXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA\nAAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG\nAAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/\n0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/\n7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/\n5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/\n3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD\nAAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns\nAAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/\n6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/\n/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/\n///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl\nYmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA\nAAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD\nAAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu\nAAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB\nAAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES\nAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS\nAAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw\ncGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA\nAXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA\nBOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA\nAAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA\nAAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1\ncnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD\nAQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH\nSElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF\nhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8\nvL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt\n7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq\nKy0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo\naWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e\nn6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX\n2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW\nFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O\nTk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6\nent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt\nrq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA\nAAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA\nAAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl\nA5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq\nDIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU\nHC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8\nMtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v\nUI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/\neQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj\nrMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn\n5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh\nAZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK\nCfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY\nGPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95\nMFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S\nUGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2\nd396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV\npVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK\n0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf//\nAAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw\nBcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA\nFBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H\nLqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh\nVv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ\nh2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp\nsvK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb\n1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX\n8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE\nAABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg\nQXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t<reference key=\"NSColor\" ref=\"30384615\"/>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"619763889\"/>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">400</int>\n\t\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">75</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<string key=\"NSCellSize\">{565, 18}</string>\n\t\t\t\t\t\t\t<string key=\"NSIntercellSpacing\">{4, 2}</string>\n\t\t\t\t\t\t\t<int key=\"NSMatrixFlags\">1151868928</int>\n\t\t\t\t\t\t\t<string key=\"NSCellClass\">NSActionCell</string>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSProtoCell\" id=\"709643899\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">0</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Radio</string>\n\t\t\t\t\t\t\t\t<reference key=\"NSSupport\" ref=\"933596199\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">1211912703</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">0</int>\n\t\t\t\t\t\t\t\t<object class=\"NSImage\" key=\"NSNormalImage\">\n\t\t\t\t\t\t\t\t\t<int key=\"NSImageFlags\">549453824</int>\n\t\t\t\t\t\t\t\t\t<string key=\"NSSize\">{18, 18}</string>\n\t\t\t\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"NSReps\">\n\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t<object class=\"NSArray\">\n\t\t\t\t\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t\t\t\t\t<integer value=\"0\"/>\n\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSBitmapImageRep\">\n\t\t\t\t\t\t\t\t\t\t\t\t<object class=\"NSData\" key=\"NSTIFFRepresentation\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<bytes key=\"NS.bytes\">TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw\nIyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/\n29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5\ndXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA\nAAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG\nAAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/\n0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/\n7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/\n5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/\n3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD\nAAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns\nAAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/\n6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/\n/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/\n///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl\nYmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA\nAAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD\nAAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu\nAAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB\nAAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES\nAAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS\nAAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes>\n\t\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t\t<reference key=\"NSColor\" ref=\"30384615\"/>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<reference key=\"NSAlternateImage\" ref=\"619763889\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">400</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">75</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<reference key=\"NSSelectedCell\" ref=\"943458284\"/>\n\t\t\t\t\t\t\t<reference key=\"NSBackgroundColor\" ref=\"349124561\"/>\n\t\t\t\t\t\t\t<reference key=\"NSCellBackgroundColor\" ref=\"195671423\"/>\n\t\t\t\t\t\t\t<reference key=\"NSFont\" ref=\"933596199\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSButton\" id=\"512228208\">\n\t\t\t\t\t\t\t<reference key=\"NSNextResponder\" ref=\"594333702\"/>\n\t\t\t\t\t\t\t<int key=\"NSvFlags\">268</int>\n\t\t\t\t\t\t\t<string key=\"NSFrame\">{{591, 59}, {178, 161}}</string>\n\t\t\t\t\t\t\t<reference key=\"NSSuperview\" ref=\"594333702\"/>\n\t\t\t\t\t\t\t<bool key=\"NSEnabled\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"NSButtonCell\" key=\"NSCell\" id=\"69630975\">\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags\">67239424</int>\n\t\t\t\t\t\t\t\t<int key=\"NSCellFlags2\">134217728</int>\n\t\t\t\t\t\t\t\t<string key=\"NSContents\">Go!</string>\n\t\t\t\t\t\t\t\t<object class=\"NSFont\" key=\"NSSupport\">\n\t\t\t\t\t\t\t\t\t<string key=\"NSName\">LucidaGrande</string>\n\t\t\t\t\t\t\t\t\t<double key=\"NSSize\">10</double>\n\t\t\t\t\t\t\t\t\t<int key=\"NSfFlags\">16</int>\n\t\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t\t<reference key=\"NSControlView\" ref=\"512228208\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags\">-2033434369</int>\n\t\t\t\t\t\t\t\t<int key=\"NSButtonFlags2\">130</int>\n\t\t\t\t\t\t\t\t<string key=\"NSAlternateContents\"/>\n\t\t\t\t\t\t\t\t<string key=\"NSKeyEquivalent\"/>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicDelay\">400</int>\n\t\t\t\t\t\t\t\t<int key=\"NSPeriodicInterval\">75</int>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<string key=\"NSFrameSize\">{787, 260}</string>\n\t\t\t\t\t<reference key=\"NSSuperview\"/>\n\t\t\t\t</object>\n\t\t\t\t<string key=\"NSScreenRect\">{{0, 0}, {1440, 878}}</string>\n\t\t\t\t<string key=\"NSMaxSize\">{1.79769e+308, 1.79769e+308}</string>\n\t\t\t</object>\n\t\t</object>\n\t\t<object class=\"IBObjectContainer\" key=\"IBDocument.Objects\">\n\t\t\t<object class=\"NSMutableArray\" key=\"connectionRecords\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performMiniaturize:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"683986939\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">37</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">arrangeInFront:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"164762492\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">39</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">print:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"302505815\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">86</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">runPageLayout:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"409810395\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">87</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">showHelp:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"192540884\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">122</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">clearRecentDocuments:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"85018532\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">127</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">terminate:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"870565383\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"887927135\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">139</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">orderFrontStandardAboutPanel:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"870565383\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"838552093\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">142</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">hideOtherApplications:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"870565383\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"216168366\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">146</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">hide:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"870565383\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"104472016\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">152</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">unhideAllApplications:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"870565383\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"667790509\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">153</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">cut:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"909447496\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">175</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">paste:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"84012734\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">176</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">redo:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1001272176\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">178</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">selectAll:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"917620781\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">179</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">undo:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"284548410\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">180</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">copy:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"994487277\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">181</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">showGuessPanel:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"438210660\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">188</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">checkSpelling:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"102172584\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">190</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">toggleContinuousSpellChecking:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"540509341\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">192</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performClose:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"468594275\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">193</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">delete:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"512189403\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">195</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performZoom:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"548098734\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">198</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performFindPanelAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"203238834\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">199</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performFindPanelAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"861312964\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">200</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performFindPanelAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"743767160\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">201</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">performFindPanelAction:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"180446588\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">202</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">centerSelectionInVisibleArea:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"731027425\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">203</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">pasteAsPlainText:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"182251545\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">205</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">crash:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"726278107\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">208</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">window_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"341270541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">209</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">crash:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"799567279\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">211</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">crash:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"27781390\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">213</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBOutletConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">forkTestOptions_</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"347013037\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">241</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">forkTestOptions:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"943458284\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">242</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">forkTestOptions:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"7590393\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">243</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">forkTestOptions:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"410017819\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">244</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">forkTestGo:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"512228208\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">250</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">forkTestOptions:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"1050951576\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">261</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">forkTestOptions:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"891367997\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">262</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">showForkTestWindow:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"856256540\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">283</int>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBConnectionRecord\">\n\t\t\t\t\t<object class=\"IBActionConnection\" key=\"connection\">\n\t\t\t\t\t\t<string key=\"label\">generateReportWithoutCrash:</string>\n\t\t\t\t\t\t<reference key=\"source\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"destination\" ref=\"460755987\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<int key=\"connectionID\">327</int>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"IBMutableOrderedSet\" key=\"objectRecords\">\n\t\t\t\t<object class=\"NSArray\" key=\"orderedObjects\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">0</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"0\"/>\n\t\t\t\t\t\t<reference key=\"children\" ref=\"925601844\"/>\n\t\t\t\t\t\t<nil key=\"parent\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"870565383\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">File's Owner</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-1</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"442653439\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">First Responder</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">-3</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"751079937\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">Application</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">21</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"341270541\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"814272478\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">Window</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">2</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"814272478\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"726278107\"/>\n\t\t\t\t\t\t\t<reference ref=\"799567279\"/>\n\t\t\t\t\t\t\t<reference ref=\"27781390\"/>\n\t\t\t\t\t\t\t<reference ref=\"856256540\"/>\n\t\t\t\t\t\t\t<reference ref=\"460755987\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"341270541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">206</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"726278107\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"539552922\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"814272478\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">210</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"799567279\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"1010617379\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"814272478\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">212</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"27781390\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"547901497\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"814272478\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">218</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"856256540\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"353736234\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"814272478\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">325</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"460755987\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"775425649\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"814272478\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">29</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"695387251\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"764068863\"/>\n\t\t\t\t\t\t\t<reference ref=\"458207250\"/>\n\t\t\t\t\t\t\t<reference ref=\"369472335\"/>\n\t\t\t\t\t\t\t<reference ref=\"599772536\"/>\n\t\t\t\t\t\t\t<reference ref=\"542216986\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">MainMenu</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">19</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"764068863\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"200536676\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"695387251\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">24</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"200536676\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"164762492\"/>\n\t\t\t\t\t\t\t<reference ref=\"683986939\"/>\n\t\t\t\t\t\t\t<reference ref=\"297002686\"/>\n\t\t\t\t\t\t\t<reference ref=\"548098734\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"764068863\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">5</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"164762492\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"200536676\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">23</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"683986939\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"200536676\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">92</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"297002686\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"200536676\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">197</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"548098734\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"200536676\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">56</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"458207250\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"753534561\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"695387251\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">57</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"753534561\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"838552093\"/>\n\t\t\t\t\t\t\t<reference ref=\"443649494\"/>\n\t\t\t\t\t\t\t<reference ref=\"826764396\"/>\n\t\t\t\t\t\t\t<reference ref=\"104472016\"/>\n\t\t\t\t\t\t\t<reference ref=\"887927135\"/>\n\t\t\t\t\t\t\t<reference ref=\"217746140\"/>\n\t\t\t\t\t\t\t<reference ref=\"881859155\"/>\n\t\t\t\t\t\t\t<reference ref=\"216168366\"/>\n\t\t\t\t\t\t\t<reference ref=\"928933982\"/>\n\t\t\t\t\t\t\t<reference ref=\"667790509\"/>\n\t\t\t\t\t\t\t<reference ref=\"758254482\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"458207250\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">58</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"838552093\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"753534561\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">129</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"443649494\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"753534561\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">131</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"826764396\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"276709607\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"753534561\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">130</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"276709607\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"826764396\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">134</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"104472016\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"753534561\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">136</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"887927135\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"753534561\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">143</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"217746140\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"753534561\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">144</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"881859155\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"753534561\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">145</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"216168366\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"753534561\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">149</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"928933982\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"753534561\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">150</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"667790509\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"753534561\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">196</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"758254482\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"753534561\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">83</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"369472335\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"902982238\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"695387251\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">81</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"902982238\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"367379562\"/>\n\t\t\t\t\t\t\t<reference ref=\"468594275\"/>\n\t\t\t\t\t\t\t<reference ref=\"232609393\"/>\n\t\t\t\t\t\t\t<reference ref=\"479945444\"/>\n\t\t\t\t\t\t\t<reference ref=\"409810395\"/>\n\t\t\t\t\t\t\t<reference ref=\"302505815\"/>\n\t\t\t\t\t\t\t<reference ref=\"154948703\"/>\n\t\t\t\t\t\t\t<reference ref=\"976375553\"/>\n\t\t\t\t\t\t\t<reference ref=\"660391032\"/>\n\t\t\t\t\t\t\t<reference ref=\"885975128\"/>\n\t\t\t\t\t\t\t<reference ref=\"84883275\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"369472335\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">72</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"367379562\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"902982238\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">73</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"468594275\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"902982238\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">74</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"232609393\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"902982238\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">75</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"479945444\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"902982238\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">77</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"409810395\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"902982238\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">78</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"302505815\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"902982238\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">79</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"154948703\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"902982238\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">80</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"976375553\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"902982238\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">82</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"660391032\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"902982238\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">112</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"885975128\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"902982238\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">124</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"84883275\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"693280130\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"902982238\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">125</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"693280130\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"85018532\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"84883275\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">126</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"85018532\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"693280130\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">103</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"599772536\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"1066958924\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"695387251\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">106</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1066958924\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"192540884\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"599772536\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">111</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"192540884\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1066958924\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">163</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"542216986\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"1053284541\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"695387251\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">169</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1053284541\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"209744238\"/>\n\t\t\t\t\t\t\t<reference ref=\"994487277\"/>\n\t\t\t\t\t\t\t<reference ref=\"284548410\"/>\n\t\t\t\t\t\t\t<reference ref=\"909447496\"/>\n\t\t\t\t\t\t\t<reference ref=\"512189403\"/>\n\t\t\t\t\t\t\t<reference ref=\"153501847\"/>\n\t\t\t\t\t\t\t<reference ref=\"84012734\"/>\n\t\t\t\t\t\t\t<reference ref=\"917620781\"/>\n\t\t\t\t\t\t\t<reference ref=\"1001272176\"/>\n\t\t\t\t\t\t\t<reference ref=\"431895313\"/>\n\t\t\t\t\t\t\t<reference ref=\"61602259\"/>\n\t\t\t\t\t\t\t<reference ref=\"182251545\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"542216986\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">156</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"209744238\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1053284541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">157</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"994487277\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1053284541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">158</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"284548410\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1053284541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">160</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"909447496\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1053284541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">164</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"512189403\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1053284541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">168</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"153501847\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"333484665\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1053284541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">159</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"333484665\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"203238834\"/>\n\t\t\t\t\t\t\t<reference ref=\"731027425\"/>\n\t\t\t\t\t\t\t<reference ref=\"180446588\"/>\n\t\t\t\t\t\t\t<reference ref=\"743767160\"/>\n\t\t\t\t\t\t\t<reference ref=\"861312964\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"153501847\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">154</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"203238834\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"333484665\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">155</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"731027425\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"333484665\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">161</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"180446588\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"333484665\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">162</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"743767160\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"333484665\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">167</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"861312964\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"333484665\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">171</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"84012734\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1053284541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">172</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"917620781\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1053284541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">173</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1001272176\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1053284541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">174</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"431895313\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1053284541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">184</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"61602259\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"8174285\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1053284541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">185</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"8174285\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"438210660\"/>\n\t\t\t\t\t\t\t<reference ref=\"102172584\"/>\n\t\t\t\t\t\t\t<reference ref=\"540509341\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"61602259\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">187</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"438210660\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"8174285\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">189</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"102172584\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"8174285\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">191</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"540509341\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"8174285\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">204</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"182251545\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1053284541\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">207</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"623097029\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">Controller</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">220</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"347013037\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"594333702\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"0\"/>\n\t\t\t\t\t\t<string key=\"objectName\">Window (Window)</string>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">221</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"594333702\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"891367997\"/>\n\t\t\t\t\t\t\t<reference ref=\"7590393\"/>\n\t\t\t\t\t\t\t<reference ref=\"1050951576\"/>\n\t\t\t\t\t\t\t<reference ref=\"512228208\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"347013037\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">226</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"891367997\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"410017819\"/>\n\t\t\t\t\t\t\t<reference ref=\"904578786\"/>\n\t\t\t\t\t\t\t<reference ref=\"971445237\"/>\n\t\t\t\t\t\t\t<reference ref=\"1072218638\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"594333702\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">227</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"410017819\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"891367997\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">228</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"904578786\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"891367997\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">272</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"971445237\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"891367997\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">232</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"7590393\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"808388382\"/>\n\t\t\t\t\t\t\t<reference ref=\"378736460\"/>\n\t\t\t\t\t\t\t<reference ref=\"251439646\"/>\n\t\t\t\t\t\t\t<reference ref=\"773902463\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"594333702\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">233</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"808388382\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"7590393\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">234</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"378736460\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"7590393\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">236</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"251439646\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"7590393\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">237</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1050951576\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"943458284\"/>\n\t\t\t\t\t\t\t<reference ref=\"69061500\"/>\n\t\t\t\t\t\t\t<reference ref=\"709643899\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"594333702\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">238</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"943458284\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1050951576\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">239</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"69061500\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1050951576\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">248</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"512228208\"/>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"children\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<reference ref=\"69630975\"/>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"594333702\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">329</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"539552922\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"726278107\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">330</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1010617379\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"799567279\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">331</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"547901497\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"27781390\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">332</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"353736234\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"856256540\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">333</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"775425649\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"460755987\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">334</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"69630975\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"512228208\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">335</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"1072218638\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"891367997\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">336</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"773902463\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"7590393\"/>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBObjectRecord\">\n\t\t\t\t\t\t<int key=\"objectID\">337</int>\n\t\t\t\t\t\t<reference key=\"object\" ref=\"709643899\"/>\n\t\t\t\t\t\t<reference key=\"parent\" ref=\"1050951576\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"flattenedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>-3.IBPluginDependency</string>\n\t\t\t\t\t<string>-3.ImportedFromIB2</string>\n\t\t\t\t\t<string>103.IBPluginDependency</string>\n\t\t\t\t\t<string>103.ImportedFromIB2</string>\n\t\t\t\t\t<string>106.IBPluginDependency</string>\n\t\t\t\t\t<string>106.ImportedFromIB2</string>\n\t\t\t\t\t<string>111.IBPluginDependency</string>\n\t\t\t\t\t<string>111.ImportedFromIB2</string>\n\t\t\t\t\t<string>112.IBPluginDependency</string>\n\t\t\t\t\t<string>112.ImportedFromIB2</string>\n\t\t\t\t\t<string>124.IBPluginDependency</string>\n\t\t\t\t\t<string>124.ImportedFromIB2</string>\n\t\t\t\t\t<string>125.IBPluginDependency</string>\n\t\t\t\t\t<string>125.ImportedFromIB2</string>\n\t\t\t\t\t<string>126.IBPluginDependency</string>\n\t\t\t\t\t<string>126.ImportedFromIB2</string>\n\t\t\t\t\t<string>129.IBPluginDependency</string>\n\t\t\t\t\t<string>129.ImportedFromIB2</string>\n\t\t\t\t\t<string>130.IBPluginDependency</string>\n\t\t\t\t\t<string>130.ImportedFromIB2</string>\n\t\t\t\t\t<string>131.IBPluginDependency</string>\n\t\t\t\t\t<string>131.ImportedFromIB2</string>\n\t\t\t\t\t<string>134.IBPluginDependency</string>\n\t\t\t\t\t<string>134.ImportedFromIB2</string>\n\t\t\t\t\t<string>136.IBPluginDependency</string>\n\t\t\t\t\t<string>136.ImportedFromIB2</string>\n\t\t\t\t\t<string>143.IBPluginDependency</string>\n\t\t\t\t\t<string>143.ImportedFromIB2</string>\n\t\t\t\t\t<string>144.IBPluginDependency</string>\n\t\t\t\t\t<string>144.ImportedFromIB2</string>\n\t\t\t\t\t<string>145.IBPluginDependency</string>\n\t\t\t\t\t<string>145.ImportedFromIB2</string>\n\t\t\t\t\t<string>149.IBPluginDependency</string>\n\t\t\t\t\t<string>149.ImportedFromIB2</string>\n\t\t\t\t\t<string>150.IBPluginDependency</string>\n\t\t\t\t\t<string>150.ImportedFromIB2</string>\n\t\t\t\t\t<string>154.IBPluginDependency</string>\n\t\t\t\t\t<string>154.ImportedFromIB2</string>\n\t\t\t\t\t<string>155.IBPluginDependency</string>\n\t\t\t\t\t<string>155.ImportedFromIB2</string>\n\t\t\t\t\t<string>156.IBPluginDependency</string>\n\t\t\t\t\t<string>156.ImportedFromIB2</string>\n\t\t\t\t\t<string>157.IBPluginDependency</string>\n\t\t\t\t\t<string>157.ImportedFromIB2</string>\n\t\t\t\t\t<string>158.IBPluginDependency</string>\n\t\t\t\t\t<string>158.ImportedFromIB2</string>\n\t\t\t\t\t<string>159.IBPluginDependency</string>\n\t\t\t\t\t<string>159.ImportedFromIB2</string>\n\t\t\t\t\t<string>160.IBPluginDependency</string>\n\t\t\t\t\t<string>160.ImportedFromIB2</string>\n\t\t\t\t\t<string>161.IBPluginDependency</string>\n\t\t\t\t\t<string>161.ImportedFromIB2</string>\n\t\t\t\t\t<string>162.IBPluginDependency</string>\n\t\t\t\t\t<string>162.ImportedFromIB2</string>\n\t\t\t\t\t<string>163.IBPluginDependency</string>\n\t\t\t\t\t<string>163.ImportedFromIB2</string>\n\t\t\t\t\t<string>164.IBPluginDependency</string>\n\t\t\t\t\t<string>164.ImportedFromIB2</string>\n\t\t\t\t\t<string>167.IBPluginDependency</string>\n\t\t\t\t\t<string>167.ImportedFromIB2</string>\n\t\t\t\t\t<string>168.IBPluginDependency</string>\n\t\t\t\t\t<string>168.ImportedFromIB2</string>\n\t\t\t\t\t<string>169.IBPluginDependency</string>\n\t\t\t\t\t<string>169.ImportedFromIB2</string>\n\t\t\t\t\t<string>171.IBPluginDependency</string>\n\t\t\t\t\t<string>171.ImportedFromIB2</string>\n\t\t\t\t\t<string>172.IBPluginDependency</string>\n\t\t\t\t\t<string>172.ImportedFromIB2</string>\n\t\t\t\t\t<string>173.IBPluginDependency</string>\n\t\t\t\t\t<string>173.ImportedFromIB2</string>\n\t\t\t\t\t<string>174.IBPluginDependency</string>\n\t\t\t\t\t<string>174.ImportedFromIB2</string>\n\t\t\t\t\t<string>184.IBPluginDependency</string>\n\t\t\t\t\t<string>184.ImportedFromIB2</string>\n\t\t\t\t\t<string>185.IBPluginDependency</string>\n\t\t\t\t\t<string>185.ImportedFromIB2</string>\n\t\t\t\t\t<string>187.IBPluginDependency</string>\n\t\t\t\t\t<string>187.ImportedFromIB2</string>\n\t\t\t\t\t<string>189.IBPluginDependency</string>\n\t\t\t\t\t<string>189.ImportedFromIB2</string>\n\t\t\t\t\t<string>19.IBPluginDependency</string>\n\t\t\t\t\t<string>19.ImportedFromIB2</string>\n\t\t\t\t\t<string>191.IBPluginDependency</string>\n\t\t\t\t\t<string>191.ImportedFromIB2</string>\n\t\t\t\t\t<string>196.IBPluginDependency</string>\n\t\t\t\t\t<string>196.ImportedFromIB2</string>\n\t\t\t\t\t<string>197.IBPluginDependency</string>\n\t\t\t\t\t<string>197.ImportedFromIB2</string>\n\t\t\t\t\t<string>2.IBPluginDependency</string>\n\t\t\t\t\t<string>2.ImportedFromIB2</string>\n\t\t\t\t\t<string>204.IBPluginDependency</string>\n\t\t\t\t\t<string>204.ImportedFromIB2</string>\n\t\t\t\t\t<string>206.IBPluginDependency</string>\n\t\t\t\t\t<string>206.ImportedFromIB2</string>\n\t\t\t\t\t<string>207.ImportedFromIB2</string>\n\t\t\t\t\t<string>21.IBEditorWindowLastContentRect</string>\n\t\t\t\t\t<string>21.IBPluginDependency</string>\n\t\t\t\t\t<string>21.IBWindowTemplateEditedContentRect</string>\n\t\t\t\t\t<string>21.ImportedFromIB2</string>\n\t\t\t\t\t<string>21.windowTemplate.hasMinSize</string>\n\t\t\t\t\t<string>21.windowTemplate.minSize</string>\n\t\t\t\t\t<string>210.IBPluginDependency</string>\n\t\t\t\t\t<string>210.ImportedFromIB2</string>\n\t\t\t\t\t<string>212.IBPluginDependency</string>\n\t\t\t\t\t<string>212.ImportedFromIB2</string>\n\t\t\t\t\t<string>218.IBPluginDependency</string>\n\t\t\t\t\t<string>218.ImportedFromIB2</string>\n\t\t\t\t\t<string>220.IBEditorWindowLastContentRect</string>\n\t\t\t\t\t<string>220.IBPluginDependency</string>\n\t\t\t\t\t<string>220.IBWindowTemplateEditedContentRect</string>\n\t\t\t\t\t<string>220.ImportedFromIB2</string>\n\t\t\t\t\t<string>221.IBPluginDependency</string>\n\t\t\t\t\t<string>221.ImportedFromIB2</string>\n\t\t\t\t\t<string>226.IBPluginDependency</string>\n\t\t\t\t\t<string>226.ImportedFromIB2</string>\n\t\t\t\t\t<string>227.IBPluginDependency</string>\n\t\t\t\t\t<string>227.ImportedFromIB2</string>\n\t\t\t\t\t<string>228.IBPluginDependency</string>\n\t\t\t\t\t<string>228.ImportedFromIB2</string>\n\t\t\t\t\t<string>23.IBPluginDependency</string>\n\t\t\t\t\t<string>23.ImportedFromIB2</string>\n\t\t\t\t\t<string>232.IBPluginDependency</string>\n\t\t\t\t\t<string>232.ImportedFromIB2</string>\n\t\t\t\t\t<string>233.IBPluginDependency</string>\n\t\t\t\t\t<string>233.ImportedFromIB2</string>\n\t\t\t\t\t<string>234.IBPluginDependency</string>\n\t\t\t\t\t<string>234.ImportedFromIB2</string>\n\t\t\t\t\t<string>236.IBPluginDependency</string>\n\t\t\t\t\t<string>236.ImportedFromIB2</string>\n\t\t\t\t\t<string>237.IBPluginDependency</string>\n\t\t\t\t\t<string>237.ImportedFromIB2</string>\n\t\t\t\t\t<string>238.IBPluginDependency</string>\n\t\t\t\t\t<string>238.ImportedFromIB2</string>\n\t\t\t\t\t<string>239.IBPluginDependency</string>\n\t\t\t\t\t<string>239.ImportedFromIB2</string>\n\t\t\t\t\t<string>24.IBPluginDependency</string>\n\t\t\t\t\t<string>24.ImportedFromIB2</string>\n\t\t\t\t\t<string>248.IBPluginDependency</string>\n\t\t\t\t\t<string>248.ImportedFromIB2</string>\n\t\t\t\t\t<string>272.IBPluginDependency</string>\n\t\t\t\t\t<string>272.ImportedFromIB2</string>\n\t\t\t\t\t<string>29.IBEditorWindowLastContentRect</string>\n\t\t\t\t\t<string>29.IBPluginDependency</string>\n\t\t\t\t\t<string>29.ImportedFromIB2</string>\n\t\t\t\t\t<string>325.IBPluginDependency</string>\n\t\t\t\t\t<string>325.ImportedFromIB2</string>\n\t\t\t\t\t<string>329.IBPluginDependency</string>\n\t\t\t\t\t<string>330.IBPluginDependency</string>\n\t\t\t\t\t<string>331.IBPluginDependency</string>\n\t\t\t\t\t<string>332.IBPluginDependency</string>\n\t\t\t\t\t<string>333.IBPluginDependency</string>\n\t\t\t\t\t<string>334.IBPluginDependency</string>\n\t\t\t\t\t<string>335.IBPluginDependency</string>\n\t\t\t\t\t<string>336.IBPluginDependency</string>\n\t\t\t\t\t<string>337.IBPluginDependency</string>\n\t\t\t\t\t<string>5.IBPluginDependency</string>\n\t\t\t\t\t<string>5.ImportedFromIB2</string>\n\t\t\t\t\t<string>56.IBPluginDependency</string>\n\t\t\t\t\t<string>56.ImportedFromIB2</string>\n\t\t\t\t\t<string>57.IBPluginDependency</string>\n\t\t\t\t\t<string>57.ImportedFromIB2</string>\n\t\t\t\t\t<string>58.IBPluginDependency</string>\n\t\t\t\t\t<string>58.ImportedFromIB2</string>\n\t\t\t\t\t<string>72.IBPluginDependency</string>\n\t\t\t\t\t<string>72.ImportedFromIB2</string>\n\t\t\t\t\t<string>73.IBPluginDependency</string>\n\t\t\t\t\t<string>73.ImportedFromIB2</string>\n\t\t\t\t\t<string>74.IBPluginDependency</string>\n\t\t\t\t\t<string>74.ImportedFromIB2</string>\n\t\t\t\t\t<string>75.IBPluginDependency</string>\n\t\t\t\t\t<string>75.ImportedFromIB2</string>\n\t\t\t\t\t<string>77.IBPluginDependency</string>\n\t\t\t\t\t<string>77.ImportedFromIB2</string>\n\t\t\t\t\t<string>78.IBPluginDependency</string>\n\t\t\t\t\t<string>78.ImportedFromIB2</string>\n\t\t\t\t\t<string>79.IBPluginDependency</string>\n\t\t\t\t\t<string>79.ImportedFromIB2</string>\n\t\t\t\t\t<string>80.IBPluginDependency</string>\n\t\t\t\t\t<string>80.ImportedFromIB2</string>\n\t\t\t\t\t<string>81.IBPluginDependency</string>\n\t\t\t\t\t<string>81.ImportedFromIB2</string>\n\t\t\t\t\t<string>82.IBPluginDependency</string>\n\t\t\t\t\t<string>82.ImportedFromIB2</string>\n\t\t\t\t\t<string>83.IBPluginDependency</string>\n\t\t\t\t\t<string>83.ImportedFromIB2</string>\n\t\t\t\t\t<string>92.IBPluginDependency</string>\n\t\t\t\t\t<string>92.ImportedFromIB2</string>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>{{510, 1250}, {320, 188}}</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>{{510, 1250}, {320, 188}}</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>{213, 107}</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>{{-55, 1287}, {787, 260}}</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>{{-55, 1287}, {787, 260}}</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>{{0, 1114}, {362, 20}}</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t\t<string>com.apple.InterfaceBuilder.CocoaPlugin</string>\n\t\t\t\t\t<boolean value=\"YES\"/>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"unlocalizedProperties\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"activeLocalization\"/>\n\t\t\t<object class=\"NSMutableDictionary\" key=\"localizations\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<reference key=\"dict.sortedKeys\" ref=\"0\"/>\n\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<nil key=\"sourceID\"/>\n\t\t\t<int key=\"maxID\">337</int>\n\t\t</object>\n\t\t<object class=\"IBClassDescriber\" key=\"IBDocument.Classes\">\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptions\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">Controller</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actions\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>crash:</string>\n\t\t\t\t\t\t\t<string>forkTestGo:</string>\n\t\t\t\t\t\t\t<string>forkTestOptions:</string>\n\t\t\t\t\t\t\t<string>generateReportWithoutCrash:</string>\n\t\t\t\t\t\t\t<string>showForkTestWindow:</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actionInfosByName\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>crash:</string>\n\t\t\t\t\t\t\t<string>forkTestGo:</string>\n\t\t\t\t\t\t\t<string>forkTestOptions:</string>\n\t\t\t\t\t\t\t<string>generateReportWithoutCrash:</string>\n\t\t\t\t\t\t\t<string>showForkTestWindow:</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">crash:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">forkTestGo:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">forkTestOptions:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">generateReportWithoutCrash:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">showForkTestWindow:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"outlets\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>forkTestOptions_</string>\n\t\t\t\t\t\t\t<string>window_</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>NSWindow</string>\n\t\t\t\t\t\t\t<string>NSWindow</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"toOneOutletInfosByName\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>forkTestOptions_</string>\n\t\t\t\t\t\t\t<string>window_</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">forkTestOptions_</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSWindow</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBToOneOutletInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">window_</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">NSWindow</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBProjectSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">testapp/Controller.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">Controller</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBUserSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">FirstResponder</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBUserSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\"/>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"referencedPartialClassDescriptionsV3.2+\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSActionCell</string>\n\t\t\t\t\t<string key=\"superclassName\">NSCell</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSActionCell.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSApplication</string>\n\t\t\t\t\t<string key=\"superclassName\">NSResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"785325875\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSApplication.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSApplication</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"806686590\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSApplicationScripting.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSApplication</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"301712406\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSColorPanel.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSApplication</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSHelpManager.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSApplication</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSPageLayout.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSApplication</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSUserInterfaceItemSearching.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSBrowser</string>\n\t\t\t\t\t<string key=\"superclassName\">NSControl</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSBrowser.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSButton</string>\n\t\t\t\t\t<string key=\"superclassName\">NSControl</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSButton.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSButtonCell</string>\n\t\t\t\t\t<string key=\"superclassName\">NSActionCell</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSButtonCell.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSCell</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSCell.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSControl</string>\n\t\t\t\t\t<string key=\"superclassName\">NSView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"787388657\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSControl.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSDocument</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actions\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>printDocument:</string>\n\t\t\t\t\t\t\t<string>revertDocumentToSaved:</string>\n\t\t\t\t\t\t\t<string>runPageLayout:</string>\n\t\t\t\t\t\t\t<string>saveDocument:</string>\n\t\t\t\t\t\t\t<string>saveDocumentAs:</string>\n\t\t\t\t\t\t\t<string>saveDocumentTo:</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actionInfosByName\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>printDocument:</string>\n\t\t\t\t\t\t\t<string>revertDocumentToSaved:</string>\n\t\t\t\t\t\t\t<string>runPageLayout:</string>\n\t\t\t\t\t\t\t<string>saveDocument:</string>\n\t\t\t\t\t\t\t<string>saveDocumentAs:</string>\n\t\t\t\t\t\t\t<string>saveDocumentTo:</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">printDocument:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">revertDocumentToSaved:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">runPageLayout:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">saveDocument:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">saveDocumentAs:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">saveDocumentTo:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSDocument.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSDocument</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSDocumentScripting.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSDocumentController</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actions\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>clearRecentDocuments:</string>\n\t\t\t\t\t\t\t<string>newDocument:</string>\n\t\t\t\t\t\t\t<string>openDocument:</string>\n\t\t\t\t\t\t\t<string>saveAllDocuments:</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t\t<string>id</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"NSMutableDictionary\" key=\"actionInfosByName\">\n\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<string>clearRecentDocuments:</string>\n\t\t\t\t\t\t\t<string>newDocument:</string>\n\t\t\t\t\t\t\t<string>openDocument:</string>\n\t\t\t\t\t\t\t<string>saveAllDocuments:</string>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">clearRecentDocuments:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">newDocument:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">openDocument:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t\t<object class=\"IBActionInfo\">\n\t\t\t\t\t\t\t\t<string key=\"name\">saveAllDocuments:</string>\n\t\t\t\t\t\t\t\t<string key=\"candidateClassName\">id</string>\n\t\t\t\t\t\t\t</object>\n\t\t\t\t\t\t</object>\n\t\t\t\t\t</object>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSDocumentController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSFormatter</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSFormatter.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSMatrix</string>\n\t\t\t\t\t<string key=\"superclassName\">NSControl</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSMatrix.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSMenu</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"136824428\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSMenu.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSMenuItem</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"171959132\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSMenuItem.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSMovieView</string>\n\t\t\t\t\t<string key=\"superclassName\">NSView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSMovieView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSAccessibility.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"785325875\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"806686590\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"301712406\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"787388657\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSDictionaryController.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSDragging.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSFontManager.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSFontPanel.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSKeyValueBinding.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"136824428\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSNibLoading.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSOutlineView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSPasteboard.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSSavePanel.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"521965700\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSTableView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSToolbarItem.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\" id=\"104369095\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSArchiver.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSClassDescription.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSError.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSFileManager.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueCoding.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyValueObserving.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSKeyedArchiver.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSObject.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSObjectScripting.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSPortCoder.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSRunLoop.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSScriptClassDescription.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSScriptKeyValueCoding.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSScriptObjectSpecifiers.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSScriptWhoseTests.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSThread.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURL.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURLConnection.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">Foundation.framework/Headers/NSURLDownload.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSInterfaceStyle.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSResponder</string>\n\t\t\t\t\t<string key=\"superclassName\">NSObject</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSResponder.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSTableView</string>\n\t\t\t\t\t<string key=\"superclassName\">NSControl</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"521965700\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSText</string>\n\t\t\t\t\t<string key=\"superclassName\">NSView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSText.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSClipView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSView</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"171959132\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSView</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSRulerView.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSView</string>\n\t\t\t\t\t<string key=\"superclassName\">NSResponder</string>\n\t\t\t\t\t<reference key=\"sourceIdentifier\" ref=\"104369095\"/>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSWindow</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSDrawer.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSWindow</string>\n\t\t\t\t\t<string key=\"superclassName\">NSResponder</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSWindow.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t\t<object class=\"IBPartialClassDescription\">\n\t\t\t\t\t<string key=\"className\">NSWindow</string>\n\t\t\t\t\t<object class=\"IBClassDescriptionSource\" key=\"sourceIdentifier\">\n\t\t\t\t\t\t<string key=\"majorKey\">IBFrameworkSource</string>\n\t\t\t\t\t\t<string key=\"minorKey\">AppKit.framework/Headers/NSWindowScripting.h</string>\n\t\t\t\t\t</object>\n\t\t\t\t</object>\n\t\t\t</object>\n\t\t</object>\n\t\t<int key=\"IBDocument.localizationMode\">0</int>\n\t\t<string key=\"IBDocument.TargetRuntimeIdentifier\">IBCocoaFramework</string>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>\n\t\t\t<integer value=\"1050\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDependencyDefaults\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>\n\t\t\t<integer value=\"1050\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.PluginDeclaredDevelopmentDependencies\">\n\t\t\t<string key=\"NS.key.0\">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>\n\t\t\t<integer value=\"3000\" key=\"NS.object.0\"/>\n\t\t</object>\n\t\t<bool key=\"IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion\">YES</bool>\n\t\t<string key=\"IBDocument.LastKnownRelativeProjectPath\">../../Breakpad.xcodeproj</string>\n\t\t<int key=\"IBDocument.defaultPropertyAccessControl\">3</int>\n\t\t<object class=\"NSMutableDictionary\" key=\"IBDocument.LastKnownImageSizes\">\n\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t<object class=\"NSArray\" key=\"dict.sortedKeys\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<string>NSMenuCheckmark</string>\n\t\t\t\t<string>NSMenuMixedState</string>\n\t\t\t</object>\n\t\t\t<object class=\"NSMutableArray\" key=\"dict.values\">\n\t\t\t\t<bool key=\"EncodedWithXMLCoder\">YES</bool>\n\t\t\t\t<string>{9, 8}</string>\n\t\t\t\t<string>{7, 2}</string>\n\t\t\t</object>\n\t\t</object>\n\t</data>\n</archive>\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/testapp/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string>bomb</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.Google.BreakpadTest</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n\t<key>BreakpadProductDisplay</key>\n\t<string>Breakpad Tester</string>\n\t<key>BreakpadProduct</key>\n\t<string>Breakpad_Tester</string>\n\t<key>BreakpadVersion</key>\n\t<string>1.2.3.4</string>\n\t<key>BreakpadReportInterval</key>\n\t<string>10</string>\n\t<key>BreakpadSkipConfirm</key>\n\t<string>NO</string>\n\t<key>BreakpadSendAndExit</key>\n\t<string>YES</string>\n\t<key>BreakpadRequestEmail</key>\n\t<string>YES</string>\n\t<key>BreakpadRequestComments</key>\n\t<string>YES</string>\n\t<key>BreakpadVendor</key>\n\t<string>Foo Bar Corp, Incorporated, LTD, LLC</string>\n\t<key>BreakpadServerParameters</key>\n\t<dict>\n\t  <key>Param1</key>\n\t  <string>Value1</string>\n\t  <key>Param2</key>\n\t  <string>Value2</string>\n\t</dict>\n\t<key>LSUIElement</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/testapp/TestClass.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#import <Cocoa/Cocoa.h>\n\n@interface TestClass : NSObject {\n}\n\n- (void)wait;\n\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/testapp/TestClass.mm",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <unistd.h>\n\n#import \"TestClass.h\"\n\nstruct AStruct {\n  int x;\n  float y;\n  double z;\n};\n\nclass InternalTestClass {\n public:\n  InternalTestClass(int a) : a_(a) {}\n  ~InternalTestClass() {}\n\n  void snooze(float a);\n  void snooze(int a);\n  int snooze(int a, float b);\n\n protected:\n  int a_;\n  AStruct s_;\n\n  static void InternalFunction(AStruct &s);\n  static float kStaticFloatValue;\n};\n\nvoid InternalTestClass::snooze(float a) {\n  InternalFunction(s_);\n  sleep(a_ * a);\n}\n\nvoid InternalTestClass::snooze(int a) {\n  InternalFunction(s_);\n  sleep(a_ * a);\n}\n\nint InternalTestClass::snooze(int a, float b) {\n  InternalFunction(s_);\n  sleep(a_ * a * b);\n\n  return 33;\n}\n\nvoid InternalTestClass::InternalFunction(AStruct &s) {\n  s.x = InternalTestClass::kStaticFloatValue;\n}\n\nfloat InternalTestClass::kStaticFloatValue = 42;\n\nstatic float PlainOldFunction() {\n  return 3.14145f;\n}\n\n@implementation TestClass\n\n- (void)wait {\n  InternalTestClass t(10);\n  float z = PlainOldFunction();\n\n  while (1) {\n    t.snooze(z);\n  }\n}\n\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/testapp/main.m",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#import <Cocoa/Cocoa.h>\n\nint main(int argc, char *argv[]) {\n  return NSApplicationMain(argc,  (const char **) argv);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/tests/BreakpadFramework_Test.mm",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// BreakpadFramework_Test.mm\n// Test case file for Breakpad.h/mm.\n//\n\n#import \"GTMSenTestCase.h\"\n#import \"Breakpad.h\"\n\n#include <mach/mach.h>\n\n@interface BreakpadFramework_Test : GTMTestCase {\n @private\n  int last_exception_code_;\n  int last_exception_type_;\n  mach_port_t last_exception_thread_;\n  // We're not using Obj-C BOOL because we need to interop with\n  // Breakpad's callback.\n  bool shouldHandleException_;\n}\n\n// This method is used by a callback used by test cases to determine\n// whether to return true or false to Breakpad when handling an\n// exception.\n- (bool)shouldHandleException;\n// This method returns a minimal dictionary that has what\n// Breakpad needs to initialize.\n- (NSMutableDictionary *)breakpadInitializationDictionary;\n// This method is used by the exception handling callback\n// to communicate to test cases the properites of the last\n// exception.\n- (void)setLastExceptionType:(int)type andCode:(int)code\n                   andThread:(mach_port_t)thread;\n@end\n\n// Callback for Breakpad exceptions\nbool myBreakpadCallback(int exception_type,\n                        int exception_code,\n                        mach_port_t crashing_thread,\n                        void *context);\n\nbool myBreakpadCallback(int exception_type,\n                        int exception_code,\n                        mach_port_t crashing_thread,\n                        void *context) {\n  BreakpadFramework_Test *testCaseClass =\n    (BreakpadFramework_Test *)context;\n  [testCaseClass setLastExceptionType:exception_type\n                              andCode:exception_code\n                            andThread:crashing_thread];\n  bool shouldHandleException =\n    [testCaseClass shouldHandleException];\n  NSLog(@\"Callback returning %d\", shouldHandleException);\n  return shouldHandleException;\n}\nconst int kNoLastExceptionCode = -1;\nconst int kNoLastExceptionType = -1;\nconst mach_port_t kNoLastExceptionThread = MACH_PORT_NULL;\n\n@implementation BreakpadFramework_Test\n- (void) initializeExceptionStateVariables {\n  last_exception_code_ = kNoLastExceptionCode;\n  last_exception_type_ = kNoLastExceptionType;\n  last_exception_thread_ = kNoLastExceptionThread;\n}\n\n- (NSMutableDictionary *)breakpadInitializationDictionary {\n  NSMutableDictionary *breakpadParams =\n    [NSMutableDictionary dictionaryWithCapacity:3];\n\n  [breakpadParams setObject:@\"UnitTests\" forKey:@BREAKPAD_PRODUCT];\n  [breakpadParams setObject:@\"1.0\" forKey:@BREAKPAD_VERSION];\n  [breakpadParams setObject:@\"http://staging\" forKey:@BREAKPAD_URL];\n  return breakpadParams;\n}\n\n- (bool)shouldHandleException {\n  return shouldHandleException_;\n}\n\n- (void)setLastExceptionType:(int)type \n\t\t     andCode:(int)code\n                   andThread:(mach_port_t)thread {\n  last_exception_type_ = type;\n  last_exception_code_ = code;\n  last_exception_thread_ = thread;\n}\n\n// Test that the parameters mark required actually enable Breakpad to\n// be initialized.\n- (void)testBreakpadInstantiationWithRequiredParameters {\n  BreakpadRef b = BreakpadCreate([self breakpadInitializationDictionary]);\n  STAssertNotNULL(b, @\"BreakpadCreate failed with required parameters\");\n  BreakpadRelease(b);\n}\n\n// Test that Breakpad fails to initialize cleanly when required\n// parameters are not present.\n- (void)testBreakpadInstantiationWithoutRequiredParameters {\n  NSMutableDictionary *breakpadDictionary =\n    [self breakpadInitializationDictionary];\n\n  // Skip setting version, so that BreakpadCreate fails.\n  [breakpadDictionary removeObjectForKey:@BREAKPAD_VERSION];\n  BreakpadRef b = BreakpadCreate(breakpadDictionary);\n  STAssertNULL(b, @\"BreakpadCreate did not fail when missing a required\"\n               \" parameter!\");\n\n  breakpadDictionary = [self breakpadInitializationDictionary];\n  // Now test with no product\n  [breakpadDictionary removeObjectForKey:@BREAKPAD_PRODUCT];\n  b = BreakpadCreate(breakpadDictionary);\n  STAssertNULL(b, @\"BreakpadCreate did not fail when missing a required\"\n               \" parameter!\");\n\n  breakpadDictionary = [self breakpadInitializationDictionary];\n  // Now test with no URL\n  [breakpadDictionary removeObjectForKey:@BREAKPAD_URL];\n  b = BreakpadCreate(breakpadDictionary);\n  STAssertNULL(b, @\"BreakpadCreate did not fail when missing a required\"\n               \" parameter!\");\n  BreakpadRelease(b);\n}\n\n// Test to ensure that when we call BreakpadAddUploadParameter,\n// it's added to the dictionary correctly(this test depends on\n// some internal details of Breakpad, namely, the special prefix\n// that it uses to figure out which key/value pairs to upload).\n- (void)testAddingBreakpadServerVariable {\n  NSMutableDictionary *breakpadDictionary =\n    [self breakpadInitializationDictionary];\n\n  BreakpadRef b = BreakpadCreate(breakpadDictionary);\n  STAssertNotNULL(b, @\"BreakpadCreate failed with valid dictionary!\");\n\n  BreakpadAddUploadParameter(b,\n                             @\"key\",\n                             @\"value\");\n\n  // Test that it did not add the key/value directly, e.g. without\n  // prepending the key with the prefix.\n  STAssertNil(BreakpadKeyValue(b, @\"key\"),\n              @\"AddUploadParameter added key directly to dictionary\"\n              \" instead of prepending it!\");\n\n  NSString *prependedKeyname =\n    [@BREAKPAD_SERVER_PARAMETER_PREFIX stringByAppendingString:@\"key\"];\n    \n  STAssertEqualStrings(BreakpadKeyValue(b, prependedKeyname),\n                       @\"value\",\n                       @\"Calling BreakpadAddUploadParameter did not prepend \"\n                       \"key name\");\n  BreakpadRelease(b);\n}\n\n// Test that when we do on-demand minidump generation,\n// the exception code/type/thread are set properly.\n- (void)testFilterCallbackReturnsFalse {\n  NSMutableDictionary *breakpadDictionary =\n    [self breakpadInitializationDictionary];\n\n  BreakpadRef b = BreakpadCreate(breakpadDictionary);\n  STAssertNotNULL(b, @\"BreakpadCreate failed with valid dictionary!\");\n  BreakpadSetFilterCallback(b, &myBreakpadCallback, self);\n\n  // This causes the callback to return false, meaning\n  // Breakpad won't take the exception\n  shouldHandleException_ = false;\n\n  [self initializeExceptionStateVariables];\n  STAssertEquals(last_exception_type_, kNoLastExceptionType,\n                 @\"Last exception type not initialized correctly.\");\n  STAssertEquals(last_exception_code_, kNoLastExceptionCode,\n                 @\"Last exception code not initialized correctly.\");\n  STAssertEquals(last_exception_thread_, kNoLastExceptionThread,\n                 @\"Last exception thread is not initialized correctly.\");\n\n  // Cause Breakpad's exception handler to be invoked.\n  BreakpadGenerateAndSendReport(b);\n\n  STAssertEquals(last_exception_type_, 0,\n                 @\"Last exception type is not 0 for on demand\");\n  STAssertEquals(last_exception_code_, 0,\n                 @\"Last exception code is not 0 for on demand\");\n  STAssertEquals(last_exception_thread_, mach_thread_self(),\n                 @\"Last exception thread is not mach_thread_self() \"\n                 \"for on demand\");\n}\n\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/tests/SimpleStringDictionaryTest.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#import \"GTMSenTestCase.h\"\n#import \"SimpleStringDictionary.h\"\n\n@interface SimpleStringDictionaryTest : GTMTestCase {\n\n}\n\n- (void)testKeyValueEntry;\n- (void)testSimpleStringDictionary;\n- (void)testSimpleStringDictionaryIterator;\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/tests/SimpleStringDictionaryTest.mm",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#import \"SimpleStringDictionaryTest.h\"\n#import \"SimpleStringDictionary.h\"\n\nusing google_breakpad::KeyValueEntry;\nusing google_breakpad::SimpleStringDictionary;\nusing google_breakpad::SimpleStringDictionaryIterator;\n\n@implementation SimpleStringDictionaryTest\n\n//==============================================================================\n- (void)testKeyValueEntry {\n  KeyValueEntry entry;\n\n  // Verify that initial state is correct\n  STAssertFalse(entry.IsActive(), @\"Initial key value entry is active!\");\n  STAssertEquals(strlen(entry.GetKey()), (size_t)0, @\"Empty key value did not \"\n                 @\"have length 0\");\n  STAssertEquals(strlen(entry.GetValue()), (size_t)0, @\"Empty key value did not \"\n                 @\"have length 0\");\n\n  // Try setting a key/value and then verify\n  entry.SetKeyValue(\"key1\", \"value1\");\n  STAssertEqualCStrings(entry.GetKey(), \"key1\", @\"key was not equal to key1\");\n  STAssertEqualCStrings(entry.GetValue(), \"value1\", @\"value was not equal\");\n\n  // Try setting a new value\n  entry.SetValue(\"value3\");\n\n  // Make sure the new value took\n  STAssertEqualCStrings(entry.GetValue(), \"value3\", @\"value was not equal\");\n\n  // Make sure the key didn't change\n  STAssertEqualCStrings(entry.GetKey(), \"key1\", @\"key changed after setting \"\n                        @\"value!\");\n\n  // Try setting a new key/value and then verify\n  entry.SetKeyValue(\"key2\", \"value2\");\n  STAssertEqualCStrings(entry.GetKey(), \"key2\", @\"New key was not equal to \"\n                        @\"key2\");\n  STAssertEqualCStrings(entry.GetValue(), \"value2\", @\"New value was not equal \"\n                        @\"to value2\");\n\n  // Clear the entry and verify the key and value are empty strings\n  entry.Clear();\n  STAssertFalse(entry.IsActive(), @\"Key value clear did not clear object\");\n  STAssertEquals(strlen(entry.GetKey()), (size_t)0, @\"Length of cleared key \"\n\t\t @\"was not 0\");\n  STAssertEquals(strlen(entry.GetValue()), (size_t)0, @\"Length of cleared \"\n\t\t @\"value was not 0!\");\n}\n\n- (void)testEmptyKeyValueCombos {\n  KeyValueEntry entry;\n  entry.SetKeyValue(NULL, NULL);\n  STAssertEqualCStrings(entry.GetKey(), \"\", @\"Setting NULL key did not return \"\n\t\t\t@\"empty key!\");\n  STAssertEqualCStrings(entry.GetValue(), \"\", @\"Setting NULL value did not \"\n\t\t\t@\"set empty string value!\");\n}\n\n\n//==============================================================================\n- (void)testSimpleStringDictionary {\n  // Make a new dictionary\n  SimpleStringDictionary *dict = new SimpleStringDictionary();\n  STAssertTrue(dict != NULL, nil);\n\n  // try passing in NULL for key\n  //dict->SetKeyValue(NULL, \"bad\");   // causes assert() to fire\n\n  // Set three distinct values on three keys\n  dict->SetKeyValue(\"key1\", \"value1\");\n  dict->SetKeyValue(\"key2\", \"value2\");\n  dict->SetKeyValue(\"key3\", \"value3\");\n\n  STAssertTrue(!strcmp(dict->GetValueForKey(\"key1\"), \"value1\"), nil);\n  STAssertTrue(!strcmp(dict->GetValueForKey(\"key2\"), \"value2\"), nil);\n  STAssertTrue(!strcmp(dict->GetValueForKey(\"key3\"), \"value3\"), nil);\n  STAssertEquals(dict->GetCount(), 3, @\"GetCount did not return 3\");\n  // try an unknown key\n  STAssertTrue(dict->GetValueForKey(\"key4\") == NULL, nil);\n\n  // try a NULL key\n  //STAssertTrue(dict->GetValueForKey(NULL) == NULL, nil);  // asserts\n\n  // Remove a key\n  dict->RemoveKey(\"key3\");\n\n  // Now make sure it's not there anymore\n  STAssertTrue(dict->GetValueForKey(\"key3\") == NULL, nil);\n\n  // Remove a NULL key\n  //dict->RemoveKey(NULL);  // will cause assert() to fire\n\n  // Remove by setting value to NULL\n  dict->SetKeyValue(\"key2\", NULL);\n\n  // Now make sure it's not there anymore\n  STAssertTrue(dict->GetValueForKey(\"key2\") == NULL, nil);\n}\n\n//==============================================================================\n// The idea behind this test is to add a bunch of values to the dictionary,\n// remove some in the middle, then add a few more in.  We then create a\n// SimpleStringDictionaryIterator and iterate through the dictionary, taking\n// note of the key/value pairs we see.  We then verify that it iterates\n// through exactly the number of key/value pairs we expect, and that they\n// match one-for-one with what we would expect.  In all cases we're setting\n// key value pairs of the form:\n//\n// key<n>/value<n>   (like key0/value0, key17,value17, etc.)\n//\n- (void)testSimpleStringDictionaryIterator {\n  SimpleStringDictionary *dict = new SimpleStringDictionary();\n  STAssertTrue(dict != NULL, nil);\n\n  char key[KeyValueEntry::MAX_STRING_STORAGE_SIZE];\n  char value[KeyValueEntry::MAX_STRING_STORAGE_SIZE];\n\n  const int kDictionaryCapacity = SimpleStringDictionary::MAX_NUM_ENTRIES;\n  const int kPartitionIndex = kDictionaryCapacity - 5;\n\n  // We assume at least this size in the tests below\n  STAssertTrue(kDictionaryCapacity >= 64, nil);\n\n  // We'll keep track of the number of key/value pairs we think should\n  // be in the dictionary\n  int expectedDictionarySize = 0;\n\n  // Set a bunch of key/value pairs like key0/value0, key1/value1, ...\n  for (int i = 0; i < kPartitionIndex; ++i) {\n    sprintf(key, \"key%d\", i);\n    sprintf(value, \"value%d\", i);\n    dict->SetKeyValue(key, value);\n  }\n  expectedDictionarySize = kPartitionIndex;\n\n  // set a couple of the keys twice (with the same value) - should be nop\n  dict->SetKeyValue(\"key2\", \"value2\");\n  dict->SetKeyValue(\"key4\", \"value4\");\n  dict->SetKeyValue(\"key15\", \"value15\");\n\n  // Remove some random elements in the middle\n  dict->RemoveKey(\"key7\");\n  dict->RemoveKey(\"key18\");\n  dict->RemoveKey(\"key23\");\n  dict->RemoveKey(\"key31\");\n  expectedDictionarySize -= 4;  // we just removed four key/value pairs\n\n  // Set some more key/value pairs like key59/value59, key60/value60, ...\n  for (int i = kPartitionIndex; i < kDictionaryCapacity; ++i) {\n    sprintf(key, \"key%d\", i);\n    sprintf(value, \"value%d\", i);\n    dict->SetKeyValue(key, value);\n  }\n  expectedDictionarySize += kDictionaryCapacity - kPartitionIndex;\n\n  // Now create an iterator on the dictionary\n  SimpleStringDictionaryIterator iter(*dict);\n\n  // We then verify that it iterates through exactly the number of\n  // key/value pairs we expect, and that they match one-for-one with what we\n  // would expect.  The ordering of the iteration does not matter...\n\n  // used to keep track of number of occurrences found for key/value pairs\n  int count[kDictionaryCapacity];\n  memset(count, 0, sizeof(count));\n\n  int totalCount = 0;\n\n  const KeyValueEntry *entry;\n\n  while ((entry = iter.Next())) {\n    totalCount++;\n\n    // Extract keyNumber from a string of the form key<keyNumber>\n    int keyNumber;\n    sscanf(entry->GetKey(), \"key%d\", &keyNumber);\n\n    // Extract valueNumber from a string of the form value<valueNumber>\n    int valueNumber;\n    sscanf(entry->GetValue(), \"value%d\", &valueNumber);\n\n    // The value number should equal the key number since that's how we set them\n    STAssertTrue(keyNumber == valueNumber, nil);\n\n    // Key and value numbers should be in proper range:\n    // 0 <= keyNumber < kDictionaryCapacity\n    bool isKeyInGoodRange =\n      (keyNumber >= 0 && keyNumber < kDictionaryCapacity);\n    bool isValueInGoodRange =\n      (valueNumber >= 0 && valueNumber < kDictionaryCapacity);\n    STAssertTrue(isKeyInGoodRange, nil);\n    STAssertTrue(isValueInGoodRange, nil);\n\n    if (isKeyInGoodRange && isValueInGoodRange) {\n      ++count[keyNumber];\n    }\n  }\n\n  // Make sure each of the key/value pairs showed up exactly one time, except\n  // for the ones which we removed.\n  for (int i = 0; i < kDictionaryCapacity; ++i) {\n    // Skip over key7, key18, key23, and key31, since we removed them\n    if (!(i == 7 || i == 18 || i == 23 || i == 31)) {\n      STAssertTrue(count[i] == 1, nil);\n    }\n  }\n\n  // Make sure the number of iterations matches the expected dictionary size.\n  STAssertTrue(totalCount == expectedDictionarySize, nil);\n}\n\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/tests/crash_generation_server_test.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// crash_generation_server_test.cc\n// Unit tests for CrashGenerationServer\n\n#include <dirent.h>\n#include <glob.h>\n#include <stdint.h>\n#include <sys/wait.h>\n#include <unistd.h>\n\n#include <string>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"client/mac/crash_generation/client_info.h\"\n#include \"client/mac/crash_generation/crash_generation_client.h\"\n#include \"client/mac/crash_generation/crash_generation_server.h\"\n#include \"client/mac/handler/exception_handler.h\"\n#include \"client/mac/tests/spawn_child_process.h\"\n#include \"common/tests/auto_tempdir.h\"\n#include \"google_breakpad/processor/minidump.h\"\n\nnamespace google_breakpad {\n// This acts as the log sink for INFO logging from the processor\n// logging code. The logging output confuses XCode and makes it think\n// there are unit test failures. testlogging.h handles the overriding.\nstd::ostringstream info_log;\n}\n\nnamespace {\nusing std::string;\nusing google_breakpad::AutoTempDir;\nusing google_breakpad::ClientInfo;\nusing google_breakpad::CrashGenerationClient;\nusing google_breakpad::CrashGenerationServer;\nusing google_breakpad::ExceptionHandler;\nusing google_breakpad::Minidump;\nusing google_breakpad::MinidumpContext;\nusing google_breakpad::MinidumpException;\nusing google_breakpad::MinidumpModule;\nusing google_breakpad::MinidumpModuleList;\nusing google_breakpad::MinidumpSystemInfo;\nusing google_breakpad::MinidumpThread;\nusing google_breakpad::MinidumpThreadList;\nusing testing::Test;\nusing namespace google_breakpad_test;\n\nclass CrashGenerationServerTest : public Test {\npublic:\n  // The port name to receive messages on\n  char mach_port_name[128];\n  // Filename of the last dump that was generated\n  string last_dump_name;\n  // PID of the child process\n  pid_t child_pid;\n  // A temp dir\n  AutoTempDir temp_dir;\n  // Counter just to ensure that we don't hit the same port again\n  static int i;\n\n  void SetUp() {\n    sprintf(mach_port_name,\n\t    \"com.google.breakpad.ServerTest.%d.%d\", getpid(),\n\t    CrashGenerationServerTest::i++);\n    child_pid = (pid_t)-1;\n  }\n};\nint CrashGenerationServerTest::i = 0;\n\n// Test that starting and stopping a server works\nTEST_F(CrashGenerationServerTest, testStartStopServer) {\n  CrashGenerationServer server(mach_port_name,\n\t\t\t       NULL,  // dump callback\n\t\t\t       NULL,  // dump context\n\t\t\t       NULL,  // exit callback\n\t\t\t       NULL,  // exit context\n\t\t\t       false, // generate dumps\n\t\t\t       \"\"); // dump path\n  ASSERT_TRUE(server.Start());\n  ASSERT_TRUE(server.Stop());\n}\n\n// Test that requesting a dump via CrashGenerationClient works\n// Test without actually dumping\nTEST_F(CrashGenerationServerTest, testRequestDumpNoDump) {\n  CrashGenerationServer server(mach_port_name,\n                               NULL,  // dump callback\n                               NULL,  // dump context\n                               NULL,  // exit callback\n                               NULL,  // exit context\n                               false, // don't generate dumps\n                               temp_dir.path()); // dump path\n  ASSERT_TRUE(server.Start());\n\n  pid_t pid = fork();\n  ASSERT_NE(-1, pid);\n  if (pid == 0) {\n    CrashGenerationClient client(mach_port_name);\n    bool result = client.RequestDump();\n    exit(result ? 0 : 1);\n  }\n\n  int ret;\n  ASSERT_EQ(pid, waitpid(pid, &ret, 0));\n  EXPECT_TRUE(WIFEXITED(ret));\n  EXPECT_EQ(0, WEXITSTATUS(ret));\n  EXPECT_TRUE(server.Stop());\n  // check that no minidump was written\n  string pattern = temp_dir.path() + \"/*\";\n  glob_t dirContents;\n  ret = glob(pattern.c_str(), GLOB_NOSORT, NULL, &dirContents);\n  EXPECT_EQ(GLOB_NOMATCH, ret);\n  if (ret != GLOB_NOMATCH)\n    globfree(&dirContents);\n}\n\nvoid dumpCallback(void *context, const ClientInfo &client_info,\n\t\t  const std::string &file_path) {\n  if (context) {\n    CrashGenerationServerTest* self =\n        reinterpret_cast<CrashGenerationServerTest*>(context);\n    if (!file_path.empty())\n      self->last_dump_name = file_path;\n    self->child_pid = client_info.pid();\n  }\n}\n\nvoid *RequestDump(void *context) {\n  CrashGenerationClient client((const char*)context);\n  bool result = client.RequestDump();\n  return (void*)(result ? 0 : 1);\n}\n\n// Test that actually writing a minidump works\nTEST_F(CrashGenerationServerTest, testRequestDump) {\n  CrashGenerationServer server(mach_port_name,\n                               dumpCallback,  // dump callback\n                               this,  // dump context\n                               NULL,  // exit callback\n                               NULL,  // exit context\n                               true, //  generate dumps\n                               temp_dir.path()); // dump path\n  ASSERT_TRUE(server.Start());\n\n  pid_t pid = fork();\n  ASSERT_NE(-1, pid);\n  if (pid == 0) {\n    // Have to spawn off a separate thread to request the dump,\n    // because MinidumpGenerator assumes the handler thread is not\n    // the only thread\n    pthread_t thread;\n    if (pthread_create(&thread, NULL, RequestDump, (void*)mach_port_name) != 0)\n      exit(1);\n    void* result;\n    pthread_join(thread, &result);\n    exit(reinterpret_cast<intptr_t>(result));\n  }\n\n  int ret;\n  ASSERT_EQ(pid, waitpid(pid, &ret, 0));\n  EXPECT_TRUE(WIFEXITED(ret));\n  EXPECT_EQ(0, WEXITSTATUS(ret));\n  EXPECT_TRUE(server.Stop());\n  // check that minidump was written\n  ASSERT_FALSE(last_dump_name.empty());\n  struct stat st;\n  EXPECT_EQ(0, stat(last_dump_name.c_str(), &st));\n  EXPECT_LT(0, st.st_size);\n  // check client's PID\n  ASSERT_EQ(pid, child_pid);\n}\n\nstatic void Crasher() {\n  int *a = (int*)0x42;\n\n  fprintf(stdout, \"Going to crash...\\n\");\n  fprintf(stdout, \"A = %d\", *a);\n}\n\n// Test that crashing a child process with an OOP ExceptionHandler installed\n// results in a minidump being written by the CrashGenerationServer in\n// the parent.\nTEST_F(CrashGenerationServerTest, testChildProcessCrash) {\n  CrashGenerationServer server(mach_port_name,\n                               dumpCallback,  // dump callback\n                               this,  // dump context\n                               NULL,  // exit callback\n                               NULL,  // exit context\n                               true, //  generate dumps\n                               temp_dir.path()); // dump path\n  ASSERT_TRUE(server.Start());\n\n  pid_t pid = fork();\n  ASSERT_NE(-1, pid);\n  if (pid == 0) {\n    // Instantiate an OOP exception handler.\n    ExceptionHandler eh(\"\", NULL, NULL, NULL, true, mach_port_name);\n    Crasher();\n    // not reached\n    exit(0);\n  }\n\n  int ret;\n  ASSERT_EQ(pid, waitpid(pid, &ret, 0));\n  EXPECT_FALSE(WIFEXITED(ret));\n  EXPECT_TRUE(server.Stop());\n  // check that minidump was written\n  ASSERT_FALSE(last_dump_name.empty());\n  struct stat st;\n  EXPECT_EQ(0, stat(last_dump_name.c_str(), &st));\n  EXPECT_LT(0, st.st_size);\n\n  // Read the minidump, sanity check some data.\n  Minidump minidump(last_dump_name.c_str());\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpSystemInfo* system_info = minidump.GetSystemInfo();\n  ASSERT_TRUE(system_info);\n  const MDRawSystemInfo* raw_info = system_info->system_info();\n  ASSERT_TRUE(raw_info);\n  EXPECT_EQ(kNativeArchitecture, raw_info->processor_architecture);\n\n  MinidumpThreadList* thread_list = minidump.GetThreadList();\n  ASSERT_TRUE(thread_list);\n  ASSERT_EQ((unsigned int)1, thread_list->thread_count());\n\n  MinidumpThread* main_thread = thread_list->GetThreadAtIndex(0);\n  ASSERT_TRUE(main_thread);\n  MinidumpContext* context = main_thread->GetContext();\n  ASSERT_TRUE(context);\n  EXPECT_EQ(kNativeContext, context->GetContextCPU());\n\n  MinidumpModuleList* module_list = minidump.GetModuleList();\n  ASSERT_TRUE(module_list);\n  const MinidumpModule* main_module = module_list->GetMainModule();\n  ASSERT_TRUE(main_module);\n  EXPECT_EQ(GetExecutablePath(), main_module->code_file());\n}\n\n#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6) && \\\n  (defined(__x86_64__) || defined(__i386__))\n// Test that crashing a child process of a different architecture\n// produces a valid minidump.\nTEST_F(CrashGenerationServerTest, testChildProcessCrashCrossArchitecture) {\n  CrashGenerationServer server(mach_port_name,\n                               dumpCallback,  // dump callback\n                               this,  // dump context\n                               NULL,  // exit callback\n                               NULL,  // exit context\n                               true, //  generate dumps\n                               temp_dir.path()); // dump path\n  ASSERT_TRUE(server.Start());\n\n  // Spawn a child process\n  string helper_path = GetHelperPath();\n  const char* argv[] = {\n    helper_path.c_str(),\n    \"crash\",\n    mach_port_name,\n    NULL\n  };\n  pid_t pid = spawn_child_process(argv);\n  ASSERT_NE(-1, pid);\n\n  int ret;\n  ASSERT_EQ(pid, waitpid(pid, &ret, 0));\n  EXPECT_FALSE(WIFEXITED(ret));\n  EXPECT_TRUE(server.Stop());\n  // check that minidump was written\n  ASSERT_FALSE(last_dump_name.empty());\n  struct stat st;\n  EXPECT_EQ(0, stat(last_dump_name.c_str(), &st));\n  EXPECT_LT(0, st.st_size);\n\nconst MDCPUArchitecture kExpectedArchitecture =\n#if defined(__x86_64__)\n  MD_CPU_ARCHITECTURE_X86\n#elif defined(__i386__)\n  MD_CPU_ARCHITECTURE_AMD64\n#endif\n  ;\nconst u_int32_t kExpectedContext =\n#if defined(__i386__)\n  MD_CONTEXT_AMD64\n#elif defined(__x86_64__)\n  MD_CONTEXT_X86\n#endif\n  ;\n\n  // Read the minidump, sanity check some data.\n  Minidump minidump(last_dump_name.c_str());\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpSystemInfo* system_info = minidump.GetSystemInfo();\n  ASSERT_TRUE(system_info);\n  const MDRawSystemInfo* raw_info = system_info->system_info();\n  ASSERT_TRUE(raw_info);\n  EXPECT_EQ(kExpectedArchitecture, raw_info->processor_architecture);\n\n  MinidumpThreadList* thread_list = minidump.GetThreadList();\n  ASSERT_TRUE(thread_list);\n  ASSERT_EQ((unsigned int)1, thread_list->thread_count());\n\n  MinidumpThread* main_thread = thread_list->GetThreadAtIndex(0);\n  ASSERT_TRUE(main_thread);\n  MinidumpContext* context = main_thread->GetContext();\n  ASSERT_TRUE(context);\n  EXPECT_EQ(kExpectedContext, context->GetContextCPU());\n\n  MinidumpModuleList* module_list = minidump.GetModuleList();\n  ASSERT_TRUE(module_list);\n  const MinidumpModule* main_module = module_list->GetMainModule();\n  ASSERT_TRUE(main_module);\n  EXPECT_EQ(helper_path, main_module->code_file());\n}\n#endif\n\n}  // namespace\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/tests/exception_handler_test.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// exception_handler_test.cc: Unit tests for google_breakpad::ExceptionHandler\n\n#include <pthread.h>\n#include <sys/mman.h>\n#include <sys/stat.h>\n#include <unistd.h>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"client/mac/handler/exception_handler.h\"\n#include \"common/mac/MachIPC.h\"\n#include \"common/tests/auto_tempdir.h\"\n#include \"google_breakpad/processor/minidump.h\"\n\nnamespace google_breakpad {\n// This acts as the log sink for INFO logging from the processor\n// logging code. The logging output confuses XCode and makes it think\n// there are unit test failures. testlogging.h handles the overriding.\nstd::ostringstream info_log;\n}\n\nnamespace {\nusing std::string;\nusing google_breakpad::AutoTempDir;\nusing google_breakpad::ExceptionHandler;\nusing google_breakpad::MachPortSender;\nusing google_breakpad::MachReceiveMessage;\nusing google_breakpad::MachSendMessage;\nusing google_breakpad::Minidump;\nusing google_breakpad::MinidumpContext;\nusing google_breakpad::MinidumpException;\nusing google_breakpad::MinidumpMemoryList;\nusing google_breakpad::MinidumpMemoryRegion;\nusing google_breakpad::ReceivePort;\nusing testing::Test;\n\nclass ExceptionHandlerTest : public Test {\n public:\n  void InProcessCrash(bool aborting);\n  AutoTempDir tempDir;\n  string lastDumpName;\n};\n\nstatic void Crasher() {\n  int *a = (int*)0x42;\n\n  fprintf(stdout, \"Going to crash...\\n\");\n  fprintf(stdout, \"A = %d\", *a);\n}\n\nstatic void AbortCrasher() {\n  fprintf(stdout, \"Going to crash...\\n\");\n  abort();\n}\n\nstatic void SoonToCrash(void(*crasher)()) {\n  crasher();\n}\n\nstatic bool MDCallback(const char *dump_dir, const char *file_name,\n                       void *context, bool success) {\n  string path(dump_dir);\n  path.append(\"/\");\n  path.append(file_name);\n  path.append(\".dmp\");\n\n  int fd = *reinterpret_cast<int*>(context);\n  (void)write(fd, path.c_str(), path.length() + 1);\n  close(fd);\n  exit(0);\n  // not reached\n  return true;\n}\n\nvoid ExceptionHandlerTest::InProcessCrash(bool aborting) {\n  // Give the child process a pipe to report back on.\n  int fds[2];\n  ASSERT_EQ(0, pipe(fds));\n  // Fork off a child process so it can crash.\n  pid_t pid = fork();\n  if (pid == 0) {\n    // In the child process.\n    close(fds[0]);\n    ExceptionHandler eh(tempDir.path(), NULL, MDCallback, &fds[1], true, NULL);\n    // crash\n    SoonToCrash(aborting ? &AbortCrasher : &Crasher);\n    // not reached\n    exit(1);\n  }\n  // In the parent process.\n  ASSERT_NE(-1, pid);\n  // Wait for the background process to return the minidump file.\n  close(fds[1]);\n  char minidump_file[PATH_MAX];\n  ssize_t nbytes = read(fds[0], minidump_file, sizeof(minidump_file));\n  ASSERT_NE(0, nbytes);\n  // Ensure that minidump file exists and is > 0 bytes.\n  struct stat st;\n  ASSERT_EQ(0, stat(minidump_file, &st));\n  ASSERT_LT(0, st.st_size);\n\n  // Child process should have exited with a zero status.\n  int ret;\n  ASSERT_EQ(pid, waitpid(pid, &ret, 0));\n  EXPECT_NE(0, WIFEXITED(ret));\n  EXPECT_EQ(0, WEXITSTATUS(ret));\n}\n\nTEST_F(ExceptionHandlerTest, InProcess) {\n  InProcessCrash(false);\n}\n\n#if TARGET_OS_IPHONE\nTEST_F(ExceptionHandlerTest, InProcessAbort) {\n  InProcessCrash(true);\n}\n#endif\n\nstatic bool DumpNameMDCallback(const char *dump_dir, const char *file_name,\n                               void *context, bool success) {\n  ExceptionHandlerTest *self = reinterpret_cast<ExceptionHandlerTest*>(context);\n  if (dump_dir && file_name) {\n    self->lastDumpName = dump_dir;\n    self->lastDumpName += \"/\";\n    self->lastDumpName += file_name;\n    self->lastDumpName += \".dmp\";\n  }\n  return true;\n}\n\nTEST_F(ExceptionHandlerTest, WriteMinidump) {\n  ExceptionHandler eh(tempDir.path(), NULL, DumpNameMDCallback, this, true,\n                      NULL);\n  ASSERT_TRUE(eh.WriteMinidump());\n\n  // Ensure that minidump file exists and is > 0 bytes.\n  ASSERT_FALSE(lastDumpName.empty());\n  struct stat st;\n  ASSERT_EQ(0, stat(lastDumpName.c_str(), &st));\n  ASSERT_LT(0, st.st_size);\n\n  // The minidump should not contain an exception stream.\n  Minidump minidump(lastDumpName);\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpException* exception = minidump.GetException();\n  EXPECT_FALSE(exception);\n}\n\nTEST_F(ExceptionHandlerTest, WriteMinidumpWithException) {\n  ExceptionHandler eh(tempDir.path(), NULL, DumpNameMDCallback, this, true,\n                      NULL);\n  ASSERT_TRUE(eh.WriteMinidump(true));\n\n  // Ensure that minidump file exists and is > 0 bytes.\n  ASSERT_FALSE(lastDumpName.empty());\n  struct stat st;\n  ASSERT_EQ(0, stat(lastDumpName.c_str(), &st));\n  ASSERT_LT(0, st.st_size);\n\n  // The minidump should contain an exception stream.\n  Minidump minidump(lastDumpName);\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpException* exception = minidump.GetException();\n  ASSERT_TRUE(exception);\n  const MDRawExceptionStream* raw_exception = exception->exception();\n  ASSERT_TRUE(raw_exception);\n\n  EXPECT_EQ(MD_EXCEPTION_MAC_BREAKPOINT,\n            raw_exception->exception_record.exception_code);\n}\n\nTEST_F(ExceptionHandlerTest, DumpChildProcess) {\n  const int kTimeoutMs = 2000;\n  // Create a mach port to receive the child task on.\n  char machPortName[128];\n  sprintf(machPortName, \"ExceptionHandlerTest.%d\", getpid());\n  ReceivePort parent_recv_port(machPortName);\n\n  // Give the child process a pipe to block on.\n  int fds[2];\n  ASSERT_EQ(0, pipe(fds));\n\n  // Fork off a child process to dump.\n  pid_t pid = fork();\n  if (pid == 0) {\n    // In the child process\n    close(fds[1]);\n\n    // Send parent process the task and thread ports.\n    MachSendMessage child_message(0);\n    child_message.AddDescriptor(mach_task_self());\n    child_message.AddDescriptor(mach_thread_self());\n\n    MachPortSender child_sender(machPortName);\n    if (child_sender.SendMessage(child_message, kTimeoutMs) != KERN_SUCCESS)\n      exit(1);\n\n    // Wait for the parent process.\n    uint8_t data;\n    read(fds[0], &data, 1);\n    exit(0);\n  }\n  // In the parent process.\n  ASSERT_NE(-1, pid);\n  close(fds[0]);\n\n  // Read the child's task and thread ports.\n  MachReceiveMessage child_message;\n  ASSERT_EQ(KERN_SUCCESS,\n\t    parent_recv_port.WaitForMessage(&child_message, kTimeoutMs));\n  mach_port_t child_task = child_message.GetTranslatedPort(0);\n  mach_port_t child_thread = child_message.GetTranslatedPort(1);\n  ASSERT_NE((mach_port_t)MACH_PORT_NULL, child_task);\n  ASSERT_NE((mach_port_t)MACH_PORT_NULL, child_thread);\n\n  // Write a minidump of the child process.\n  bool result = ExceptionHandler::WriteMinidumpForChild(child_task,\n                                                        child_thread,\n                                                        tempDir.path(),\n                                                        DumpNameMDCallback,\n                                                        this);\n  ASSERT_EQ(true, result);\n\n  // Ensure that minidump file exists and is > 0 bytes.\n  ASSERT_FALSE(lastDumpName.empty());\n  struct stat st;\n  ASSERT_EQ(0, stat(lastDumpName.c_str(), &st));\n  ASSERT_LT(0, st.st_size);\n\n  // Unblock child process\n  uint8_t data = 1;\n  (void)write(fds[1], &data, 1);\n\n  // Child process should have exited with a zero status.\n  int ret;\n  ASSERT_EQ(pid, waitpid(pid, &ret, 0));\n  EXPECT_NE(0, WIFEXITED(ret));\n  EXPECT_EQ(0, WEXITSTATUS(ret));\n}\n\n// Test that memory around the instruction pointer is written\n// to the dump as a MinidumpMemoryRegion.\nTEST_F(ExceptionHandlerTest, InstructionPointerMemory) {\n  // Give the child process a pipe to report back on.\n  int fds[2];\n  ASSERT_EQ(0, pipe(fds));\n\n  // These are defined here so the parent can use them to check the\n  // data from the minidump afterwards.\n  const u_int32_t kMemorySize = 256;  // bytes\n  const int kOffset = kMemorySize / 2;\n  // This crashes with SIGILL on x86/x86-64/arm.\n  const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff };\n\n  pid_t pid = fork();\n  if (pid == 0) {\n    close(fds[0]);\n    ExceptionHandler eh(tempDir.path(), NULL, MDCallback, &fds[1], true, NULL);\n    // Get some executable memory.\n    char* memory =\n      reinterpret_cast<char*>(mmap(NULL,\n                                   kMemorySize,\n                                   PROT_READ | PROT_WRITE | PROT_EXEC,\n                                   MAP_PRIVATE | MAP_ANON,\n                                   -1,\n                                   0));\n    if (!memory)\n      exit(0);\n\n    // Write some instructions that will crash. Put them in the middle\n    // of the block of memory, because the minidump should contain 128\n    // bytes on either side of the instruction pointer.\n    memcpy(memory + kOffset, instructions, sizeof(instructions));\n\n    // Now execute the instructions, which should crash.\n    typedef void (*void_function)(void);\n    void_function memory_function =\n      reinterpret_cast<void_function>(memory + kOffset);\n    memory_function();\n    // not reached\n    exit(1);\n  }\n  // In the parent process.\n  ASSERT_NE(-1, pid);\n  close(fds[1]);\n\n  // Wait for the background process to return the minidump file.\n  close(fds[1]);\n  char minidump_file[PATH_MAX];\n  ssize_t nbytes = read(fds[0], minidump_file, sizeof(minidump_file));\n  ASSERT_NE(0, nbytes);\n  // Ensure that minidump file exists and is > 0 bytes.\n  struct stat st;\n  ASSERT_EQ(0, stat(minidump_file, &st));\n  ASSERT_LT(0, st.st_size);\n\n  // Child process should have exited with a zero status.\n  int ret;\n  ASSERT_EQ(pid, waitpid(pid, &ret, 0));\n  EXPECT_NE(0, WIFEXITED(ret));\n  EXPECT_EQ(0, WEXITSTATUS(ret));\n\n  // Read the minidump. Locate the exception record and the\n  // memory list, and then ensure that there is a memory region\n  // in the memory list that covers the instruction pointer from\n  // the exception record.\n  Minidump minidump(minidump_file);\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpException* exception = minidump.GetException();\n  MinidumpMemoryList* memory_list = minidump.GetMemoryList();\n  ASSERT_TRUE(exception);\n  ASSERT_TRUE(memory_list);\n  ASSERT_NE((unsigned int)0, memory_list->region_count());\n\n  MinidumpContext* context = exception->GetContext();\n  ASSERT_TRUE(context);\n\n  u_int64_t instruction_pointer;\n  switch (context->GetContextCPU()) {\n  case MD_CONTEXT_X86:\n    instruction_pointer = context->GetContextX86()->eip;\n    break;\n  case MD_CONTEXT_AMD64:\n    instruction_pointer = context->GetContextAMD64()->rip;\n    break;\n  case MD_CONTEXT_ARM:\n    instruction_pointer = context->GetContextARM()->iregs[15];\n    break;\n  default:\n    FAIL() << \"Unknown context CPU: \" << context->GetContextCPU();\n    break;\n  }\n\n  MinidumpMemoryRegion* region =\n    memory_list->GetMemoryRegionForAddress(instruction_pointer);\n  EXPECT_TRUE(region);\n\n  EXPECT_EQ(kMemorySize, region->GetSize());\n  const u_int8_t* bytes = region->GetMemory();\n  ASSERT_TRUE(bytes);\n\n  u_int8_t prefix_bytes[kOffset];\n  u_int8_t suffix_bytes[kMemorySize - kOffset - sizeof(instructions)];\n  memset(prefix_bytes, 0, sizeof(prefix_bytes));\n  memset(suffix_bytes, 0, sizeof(suffix_bytes));\n  EXPECT_TRUE(memcmp(bytes, prefix_bytes, sizeof(prefix_bytes)) == 0);\n  EXPECT_TRUE(memcmp(bytes + kOffset, instructions, sizeof(instructions)) == 0);\n  EXPECT_TRUE(memcmp(bytes + kOffset + sizeof(instructions),\n                     suffix_bytes, sizeof(suffix_bytes)) == 0);\n}\n\n// Test that the memory region around the instruction pointer is\n// bounded correctly on the low end.\nTEST_F(ExceptionHandlerTest, InstructionPointerMemoryMinBound) {\n  // Give the child process a pipe to report back on.\n  int fds[2];\n  ASSERT_EQ(0, pipe(fds));\n\n  // These are defined here so the parent can use them to check the\n  // data from the minidump afterwards.\n  const u_int32_t kMemorySize = 256;  // bytes\n  const int kOffset = 0;\n  // This crashes with SIGILL on x86/x86-64/arm.\n  const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff };\n\n  pid_t pid = fork();\n  if (pid == 0) {\n    close(fds[0]);\n    ExceptionHandler eh(tempDir.path(), NULL, MDCallback, &fds[1], true, NULL);\n    // Get some executable memory.\n    char* memory =\n      reinterpret_cast<char*>(mmap(NULL,\n                                   kMemorySize,\n                                   PROT_READ | PROT_WRITE | PROT_EXEC,\n                                   MAP_PRIVATE | MAP_ANON,\n                                   -1,\n                                   0));\n    if (!memory)\n      exit(0);\n\n    // Write some instructions that will crash. Put them at the start\n    // of the block of memory, to ensure that the memory bounding\n    // works properly.\n    memcpy(memory + kOffset, instructions, sizeof(instructions));\n    \n    // Now execute the instructions, which should crash.\n    typedef void (*void_function)(void);\n    void_function memory_function =\n      reinterpret_cast<void_function>(memory + kOffset);\n    memory_function();\n    // not reached\n    exit(1);\n  }\n  // In the parent process.\n  ASSERT_NE(-1, pid);\n  close(fds[1]);\n\n  // Wait for the background process to return the minidump file.\n  close(fds[1]);\n  char minidump_file[PATH_MAX];\n  ssize_t nbytes = read(fds[0], minidump_file, sizeof(minidump_file));\n  ASSERT_NE(0, nbytes);\n  // Ensure that minidump file exists and is > 0 bytes.\n  struct stat st;\n  ASSERT_EQ(0, stat(minidump_file, &st));\n  ASSERT_LT(0, st.st_size);\n\n  // Child process should have exited with a zero status.\n  int ret;\n  ASSERT_EQ(pid, waitpid(pid, &ret, 0));\n  EXPECT_NE(0, WIFEXITED(ret));\n  EXPECT_EQ(0, WEXITSTATUS(ret));\n\n  // Read the minidump. Locate the exception record and the\n  // memory list, and then ensure that there is a memory region\n  // in the memory list that covers the instruction pointer from\n  // the exception record.\n  Minidump minidump(minidump_file);\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpException* exception = minidump.GetException();\n  MinidumpMemoryList* memory_list = minidump.GetMemoryList();\n  ASSERT_TRUE(exception);\n  ASSERT_TRUE(memory_list);\n  ASSERT_NE((unsigned int)0, memory_list->region_count());\n\n  MinidumpContext* context = exception->GetContext();\n  ASSERT_TRUE(context);\n\n  u_int64_t instruction_pointer;\n  switch (context->GetContextCPU()) {\n  case MD_CONTEXT_X86:\n    instruction_pointer = context->GetContextX86()->eip;\n    break;\n  case MD_CONTEXT_AMD64:\n    instruction_pointer = context->GetContextAMD64()->rip;\n    break;\n  case MD_CONTEXT_ARM:\n    instruction_pointer = context->GetContextARM()->iregs[15];\n    break;\n  default:\n    FAIL() << \"Unknown context CPU: \" << context->GetContextCPU();\n    break;\n  }\n\n  MinidumpMemoryRegion* region =\n    memory_list->GetMemoryRegionForAddress(instruction_pointer);\n  EXPECT_TRUE(region);\n\n  EXPECT_EQ(kMemorySize / 2, region->GetSize());\n  const u_int8_t* bytes = region->GetMemory();\n  ASSERT_TRUE(bytes);\n\n  u_int8_t suffix_bytes[kMemorySize / 2 - sizeof(instructions)];\n  memset(suffix_bytes, 0, sizeof(suffix_bytes));\n  EXPECT_TRUE(memcmp(bytes + kOffset, instructions, sizeof(instructions)) == 0);\n  EXPECT_TRUE(memcmp(bytes + kOffset + sizeof(instructions),\n                     suffix_bytes, sizeof(suffix_bytes)) == 0);\n}\n\n// Test that the memory region around the instruction pointer is\n// bounded correctly on the high end.\nTEST_F(ExceptionHandlerTest, InstructionPointerMemoryMaxBound) {\n  // Give the child process a pipe to report back on.\n  int fds[2];\n  ASSERT_EQ(0, pipe(fds));\n\n  // These are defined here so the parent can use them to check the\n  // data from the minidump afterwards.\n  // Use 4k here because the OS will hand out a single page even\n  // if a smaller size is requested, and this test wants to\n  // test the upper bound of the memory range.\n  const u_int32_t kMemorySize = 4096;  // bytes\n  // This crashes with SIGILL on x86/x86-64/arm.\n  const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff };\n  const int kOffset = kMemorySize - sizeof(instructions);\n\n  pid_t pid = fork();\n  if (pid == 0) {\n    close(fds[0]);\n    ExceptionHandler eh(tempDir.path(), NULL, MDCallback, &fds[1], true, NULL);\n    // Get some executable memory.\n    char* memory =\n      reinterpret_cast<char*>(mmap(NULL,\n                                   kMemorySize,\n                                   PROT_READ | PROT_WRITE | PROT_EXEC,\n                                   MAP_PRIVATE | MAP_ANON,\n                                   -1,\n                                   0));\n    if (!memory)\n      exit(0);\n\n    // Write some instructions that will crash. Put them at the start\n    // of the block of memory, to ensure that the memory bounding\n    // works properly.\n    memcpy(memory + kOffset, instructions, sizeof(instructions));\n    \n    // Now execute the instructions, which should crash.\n    typedef void (*void_function)(void);\n    void_function memory_function =\n      reinterpret_cast<void_function>(memory + kOffset);\n    memory_function();\n    // not reached\n    exit(1);\n  }\n  // In the parent process.\n  ASSERT_NE(-1, pid);\n  close(fds[1]);\n\n  // Wait for the background process to return the minidump file.\n  close(fds[1]);\n  char minidump_file[PATH_MAX];\n  ssize_t nbytes = read(fds[0], minidump_file, sizeof(minidump_file));\n  ASSERT_NE(0, nbytes);\n  // Ensure that minidump file exists and is > 0 bytes.\n  struct stat st;\n  ASSERT_EQ(0, stat(minidump_file, &st));\n  ASSERT_LT(0, st.st_size);\n\n  // Child process should have exited with a zero status.\n  int ret;\n  ASSERT_EQ(pid, waitpid(pid, &ret, 0));\n  EXPECT_NE(0, WIFEXITED(ret));\n  EXPECT_EQ(0, WEXITSTATUS(ret));\n\n  // Read the minidump. Locate the exception record and the\n  // memory list, and then ensure that there is a memory region\n  // in the memory list that covers the instruction pointer from\n  // the exception record.\n  Minidump minidump(minidump_file);\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpException* exception = minidump.GetException();\n  MinidumpMemoryList* memory_list = minidump.GetMemoryList();\n  ASSERT_TRUE(exception);\n  ASSERT_TRUE(memory_list);\n  ASSERT_NE((unsigned int)0, memory_list->region_count());\n\n  MinidumpContext* context = exception->GetContext();\n  ASSERT_TRUE(context);\n\n  u_int64_t instruction_pointer;\n  switch (context->GetContextCPU()) {\n  case MD_CONTEXT_X86:\n    instruction_pointer = context->GetContextX86()->eip;\n    break;\n  case MD_CONTEXT_AMD64:\n    instruction_pointer = context->GetContextAMD64()->rip;\n    break;\n  case MD_CONTEXT_ARM:\n    instruction_pointer = context->GetContextARM()->iregs[15];\n    break;\n  default:\n    FAIL() << \"Unknown context CPU: \" << context->GetContextCPU();\n    break;\n  }\n\n  MinidumpMemoryRegion* region =\n    memory_list->GetMemoryRegionForAddress(instruction_pointer);\n  EXPECT_TRUE(region);\n\n  const size_t kPrefixSize = 128;  // bytes\n  EXPECT_EQ(kPrefixSize + sizeof(instructions), region->GetSize());\n  const u_int8_t* bytes = region->GetMemory();\n  ASSERT_TRUE(bytes);\n\n  u_int8_t prefix_bytes[kPrefixSize];\n  memset(prefix_bytes, 0, sizeof(prefix_bytes));\n  EXPECT_TRUE(memcmp(bytes, prefix_bytes, sizeof(prefix_bytes)) == 0);\n  EXPECT_TRUE(memcmp(bytes + kPrefixSize,\n                     instructions, sizeof(instructions)) == 0);\n}\n\n// Ensure that an extra memory block doesn't get added when the\n// instruction pointer is not in mapped memory.\nTEST_F(ExceptionHandlerTest, InstructionPointerMemoryNullPointer) {\n  // Give the child process a pipe to report back on.\n  int fds[2];\n  ASSERT_EQ(0, pipe(fds));\n\n  pid_t pid = fork();\n  if (pid == 0) {\n    close(fds[0]);\n    ExceptionHandler eh(tempDir.path(), NULL, MDCallback, &fds[1], true, NULL);\n    // Try calling a NULL pointer.\n    typedef void (*void_function)(void);\n    void_function memory_function =\n      reinterpret_cast<void_function>(NULL);\n    memory_function();\n    // not reached\n    exit(1);\n  }\n  // In the parent process.\n  ASSERT_NE(-1, pid);\n  close(fds[1]);\n\n  // Wait for the background process to return the minidump file.\n  close(fds[1]);\n  char minidump_file[PATH_MAX];\n  ssize_t nbytes = read(fds[0], minidump_file, sizeof(minidump_file));\n  ASSERT_NE(0, nbytes);\n  // Ensure that minidump file exists and is > 0 bytes.\n  struct stat st;\n  ASSERT_EQ(0, stat(minidump_file, &st));\n  ASSERT_LT(0, st.st_size);\n\n  // Child process should have exited with a zero status.\n  int ret;\n  ASSERT_EQ(pid, waitpid(pid, &ret, 0));\n  EXPECT_NE(0, WIFEXITED(ret));\n  EXPECT_EQ(0, WEXITSTATUS(ret));\n\n  // Read the minidump. Locate the exception record and the\n  // memory list, and then ensure that there is only one memory region\n  // in the memory list (the thread memory from the single thread).\n  Minidump minidump(minidump_file);\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpException* exception = minidump.GetException();\n  MinidumpMemoryList* memory_list = minidump.GetMemoryList();\n  ASSERT_TRUE(exception);\n  ASSERT_TRUE(memory_list);\n  ASSERT_EQ((unsigned int)1, memory_list->region_count());\n}\n\nstatic void *Junk(void *) {\n  sleep(1000000);\n  return NULL;\n}\n\n// Test that the memory list gets written correctly when multiple\n// threads are running.\nTEST_F(ExceptionHandlerTest, MemoryListMultipleThreads) {\n  // Give the child process a pipe to report back on.\n  int fds[2];\n  ASSERT_EQ(0, pipe(fds));\n\n  pid_t pid = fork();\n  if (pid == 0) {\n    close(fds[0]);\n    ExceptionHandler eh(tempDir.path(), NULL, MDCallback, &fds[1], true, NULL);\n\n    // Run an extra thread so >2 memory regions will be written.\n    pthread_t junk_thread;\n    if (pthread_create(&junk_thread, NULL, Junk, NULL) == 0)\n      pthread_detach(junk_thread);\n\n    // Just crash.\n    Crasher();\n\n    // not reached\n    exit(1);\n  }\n  // In the parent process.\n  ASSERT_NE(-1, pid);\n  close(fds[1]);\n\n  // Wait for the background process to return the minidump file.\n  close(fds[1]);\n  char minidump_file[PATH_MAX];\n  ssize_t nbytes = read(fds[0], minidump_file, sizeof(minidump_file));\n  ASSERT_NE(0, nbytes);\n  // Ensure that minidump file exists and is > 0 bytes.\n  struct stat st;\n  ASSERT_EQ(0, stat(minidump_file, &st));\n  ASSERT_LT(0, st.st_size);\n\n  // Child process should have exited with a zero status.\n  int ret;\n  ASSERT_EQ(pid, waitpid(pid, &ret, 0));\n  EXPECT_NE(0, WIFEXITED(ret));\n  EXPECT_EQ(0, WEXITSTATUS(ret));\n\n  // Read the minidump, and verify that the memory list can be read.\n  Minidump minidump(minidump_file);\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpMemoryList* memory_list = minidump.GetMemoryList();\n  ASSERT_TRUE(memory_list);\n  // Verify that there are three memory regions:\n  // one per thread, and one for the instruction pointer memory.\n  ASSERT_EQ((unsigned int)3, memory_list->region_count());\n}\n\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/tests/minidump_generator_test.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// minidump_generator_test.cc: Unit tests for google_breakpad::MinidumpGenerator\n\n#include <AvailabilityMacros.h>\n#ifndef MAC_OS_X_VERSION_10_6\n#define MAC_OS_X_VERSION_10_6 1060\n#endif\n#include <sys/stat.h>\n#include <unistd.h>\n\n#include <string>\n#include <vector>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"client/mac/handler/minidump_generator.h\"\n#include \"client/mac/tests/spawn_child_process.h\"\n#include \"common/mac/MachIPC.h\"\n#include \"common/tests/auto_tempdir.h\"\n#include \"google_breakpad/processor/minidump.h\"\n\nnamespace google_breakpad {\n// This acts as the log sink for INFO logging from the processor\n// logging code. The logging output confuses XCode and makes it think\n// there are unit test failures. testlogging.h handles the overriding.\nstd::ostringstream info_log;\n}\n\nnamespace {\nusing std::string;\nusing std::vector;\nusing google_breakpad::AutoTempDir;\nusing google_breakpad::MinidumpGenerator;\nusing google_breakpad::MachPortSender;\nusing google_breakpad::MachReceiveMessage;\nusing google_breakpad::MachSendMessage;\nusing google_breakpad::Minidump;\nusing google_breakpad::MinidumpContext;\nusing google_breakpad::MinidumpException;\nusing google_breakpad::MinidumpModule;\nusing google_breakpad::MinidumpModuleList;\nusing google_breakpad::MinidumpSystemInfo;\nusing google_breakpad::MinidumpThread;\nusing google_breakpad::MinidumpThreadList;\nusing google_breakpad::ReceivePort;\nusing testing::Test;\nusing namespace google_breakpad_test;\n\nclass MinidumpGeneratorTest : public Test {\n public:\n  AutoTempDir tempDir;\n};\n\nstatic void *Junk(void* data) {\n  bool* wait = reinterpret_cast<bool*>(data);\n  while (!*wait) {\n    usleep(10000);\n  }\n  return NULL;\n}\n\nTEST_F(MinidumpGeneratorTest, InProcess) {\n  MinidumpGenerator generator;\n  string dump_filename =\n      MinidumpGenerator::UniqueNameInDirectory(tempDir.path(), NULL);\n\n  // Run an extra thread since MinidumpGenerator assumes there\n  // are 2 or more threads.\n  pthread_t junk_thread;\n  bool quit = false;\n  ASSERT_EQ(0, pthread_create(&junk_thread, NULL, Junk, &quit));\n\n  ASSERT_TRUE(generator.Write(dump_filename.c_str()));\n  // Ensure that minidump file exists and is > 0 bytes.\n  struct stat st;\n  ASSERT_EQ(0, stat(dump_filename.c_str(), &st));\n  ASSERT_LT(0, st.st_size);\n\n  // join the background thread\n  quit = true;\n  pthread_join(junk_thread, NULL);\n\n  // Read the minidump, sanity check some data.\n  Minidump minidump(dump_filename.c_str());\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpSystemInfo* system_info = minidump.GetSystemInfo();\n  ASSERT_TRUE(system_info);\n  const MDRawSystemInfo* raw_info = system_info->system_info();\n  ASSERT_TRUE(raw_info);\n  EXPECT_EQ(kNativeArchitecture, raw_info->processor_architecture);\n\n  MinidumpThreadList* thread_list = minidump.GetThreadList();\n  ASSERT_TRUE(thread_list);\n  ASSERT_EQ((unsigned int)1, thread_list->thread_count());\n\n  MinidumpThread* main_thread = thread_list->GetThreadAtIndex(0);\n  ASSERT_TRUE(main_thread);\n  MinidumpContext* context = main_thread->GetContext();\n  ASSERT_TRUE(context);\n  EXPECT_EQ(kNativeContext, context->GetContextCPU());\n\n  MinidumpModuleList* module_list = minidump.GetModuleList();\n  ASSERT_TRUE(module_list);\n  const MinidumpModule* main_module = module_list->GetMainModule();\n  ASSERT_TRUE(main_module);\n  EXPECT_EQ(GetExecutablePath(), main_module->code_file());\n}\n\nTEST_F(MinidumpGeneratorTest, OutOfProcess) {\n  const int kTimeoutMs = 2000;\n  // Create a mach port to receive the child task on.\n  char machPortName[128];\n  sprintf(machPortName, \"MinidumpGeneratorTest.OutOfProcess.%d\", getpid());\n  ReceivePort parent_recv_port(machPortName);\n\n  // Give the child process a pipe to block on.\n  int fds[2];\n  ASSERT_EQ(0, pipe(fds));\n\n  // Fork off a child process to dump.\n  pid_t pid = fork();\n  if (pid == 0) {\n    // In the child process\n    close(fds[1]);\n\n    // Send parent process the task port.\n    MachSendMessage child_message(0);\n    child_message.AddDescriptor(mach_task_self());\n\n    MachPortSender child_sender(machPortName);\n    if (child_sender.SendMessage(child_message, kTimeoutMs) != KERN_SUCCESS) {\n      fprintf(stderr, \"Error sending message from child process!\\n\");\n      exit(1);\n    }\n\n    // Wait for the parent process.\n    uint8_t data;\n    read(fds[0], &data, 1);\n    exit(0);\n  }\n  // In the parent process.\n  ASSERT_NE(-1, pid);\n  close(fds[0]);\n\n  // Read the child's task port.\n  MachReceiveMessage child_message;\n  ASSERT_EQ(KERN_SUCCESS,\n\t    parent_recv_port.WaitForMessage(&child_message, kTimeoutMs));\n  mach_port_t child_task = child_message.GetTranslatedPort(0);\n  ASSERT_NE((mach_port_t)MACH_PORT_NULL, child_task);\n\n  // Write a minidump of the child process.\n  MinidumpGenerator generator(child_task, MACH_PORT_NULL);\n  string dump_filename =\n      MinidumpGenerator::UniqueNameInDirectory(tempDir.path(), NULL);\n  ASSERT_TRUE(generator.Write(dump_filename.c_str()));\n\n  // Ensure that minidump file exists and is > 0 bytes.\n  struct stat st;\n  ASSERT_EQ(0, stat(dump_filename.c_str(), &st));\n  ASSERT_LT(0, st.st_size);\n\n  // Unblock child process\n  uint8_t data = 1;\n  (void)write(fds[1], &data, 1);\n\n  // Child process should have exited with a zero status.\n  int ret;\n  ASSERT_EQ(pid, waitpid(pid, &ret, 0));\n  EXPECT_NE(0, WIFEXITED(ret));\n  EXPECT_EQ(0, WEXITSTATUS(ret));\n\n  // Read the minidump, sanity check some data.\n  Minidump minidump(dump_filename.c_str());\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpSystemInfo* system_info = minidump.GetSystemInfo();\n  ASSERT_TRUE(system_info);\n  const MDRawSystemInfo* raw_info = system_info->system_info();\n  ASSERT_TRUE(raw_info);\n  EXPECT_EQ(kNativeArchitecture, raw_info->processor_architecture);\n\n  MinidumpThreadList* thread_list = minidump.GetThreadList();\n  ASSERT_TRUE(thread_list);\n  ASSERT_EQ((unsigned int)1, thread_list->thread_count());\n\n  MinidumpThread* main_thread = thread_list->GetThreadAtIndex(0);\n  ASSERT_TRUE(main_thread);\n  MinidumpContext* context = main_thread->GetContext();\n  ASSERT_TRUE(context);\n  EXPECT_EQ(kNativeContext, context->GetContextCPU());\n\n  MinidumpModuleList* module_list = minidump.GetModuleList();\n  ASSERT_TRUE(module_list);\n  const MinidumpModule* main_module = module_list->GetMainModule();\n  ASSERT_TRUE(main_module);\n  EXPECT_EQ(GetExecutablePath(), main_module->code_file());\n}\n\n// This test fails on 10.5, but I don't have easy access to a 10.5 machine,\n// so it's simpler to just limit it to 10.6 for now.\n#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6) && \\\n  (defined(__x86_64__) || defined(__i386__))\n\nTEST_F(MinidumpGeneratorTest, CrossArchitectureDump) {\n  const int kTimeoutMs = 5000;\n  // Create a mach port to receive the child task on.\n  char machPortName[128];\n  sprintf(machPortName,\n          \"MinidumpGeneratorTest.CrossArchitectureDump.%d\", getpid());\n\n  ReceivePort parent_recv_port(machPortName);\n\n  // Spawn a child process to dump.\n  string helper_path = GetHelperPath();\n  const char* argv[] = {\n    helper_path.c_str(),\n    machPortName,\n    NULL\n  };\n  pid_t pid = spawn_child_process(argv);\n  ASSERT_NE(-1, pid);\n\n  // Read the child's task port.\n  MachReceiveMessage child_message;\n  ASSERT_EQ(KERN_SUCCESS,\n\t    parent_recv_port.WaitForMessage(&child_message, kTimeoutMs));\n  mach_port_t child_task = child_message.GetTranslatedPort(0);\n  ASSERT_NE((mach_port_t)MACH_PORT_NULL, child_task);\n\n  // Write a minidump of the child process.\n  MinidumpGenerator generator(child_task, MACH_PORT_NULL);\n  string dump_filename =\n      MinidumpGenerator::UniqueNameInDirectory(tempDir.path(), NULL);\n  ASSERT_TRUE(generator.Write(dump_filename.c_str()));\n\n  // Ensure that minidump file exists and is > 0 bytes.\n  struct stat st;\n  ASSERT_EQ(0, stat(dump_filename.c_str(), &st));\n  ASSERT_LT(0, st.st_size);\n\n  // Kill child process.\n  kill(pid, SIGKILL);\n\n  int ret;\n  ASSERT_EQ(pid, waitpid(pid, &ret, 0));\n\nconst MDCPUArchitecture kExpectedArchitecture =\n#if defined(__x86_64__)\n  MD_CPU_ARCHITECTURE_X86\n#elif defined(__i386__)\n  MD_CPU_ARCHITECTURE_AMD64\n#endif\n  ;\nconst u_int32_t kExpectedContext =\n#if defined(__i386__)\n  MD_CONTEXT_AMD64\n#elif defined(__x86_64__)\n  MD_CONTEXT_X86\n#endif\n  ;\n\n  // Read the minidump, sanity check some data.\n  Minidump minidump(dump_filename.c_str());\n  ASSERT_TRUE(minidump.Read());\n\n  MinidumpSystemInfo* system_info = minidump.GetSystemInfo();\n  ASSERT_TRUE(system_info);\n  const MDRawSystemInfo* raw_info = system_info->system_info();\n  ASSERT_TRUE(raw_info);\n  EXPECT_EQ(kExpectedArchitecture, raw_info->processor_architecture);\n\n  MinidumpThreadList* thread_list = minidump.GetThreadList();\n  ASSERT_TRUE(thread_list);\n  ASSERT_EQ((unsigned int)1, thread_list->thread_count());\n\n  MinidumpThread* main_thread = thread_list->GetThreadAtIndex(0);\n  ASSERT_TRUE(main_thread);\n  MinidumpContext* context = main_thread->GetContext();\n  ASSERT_TRUE(context);\n  EXPECT_EQ(kExpectedContext, context->GetContextCPU());\n\n  MinidumpModuleList* module_list = minidump.GetModuleList();\n  ASSERT_TRUE(module_list);\n  const MinidumpModule* main_module = module_list->GetMainModule();\n  ASSERT_TRUE(main_module);\n  EXPECT_EQ(helper_path, main_module->code_file());\n}\n#endif  // 10.6 && (x86-64 || i386)\n\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/tests/minidump_generator_test_helper.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// minidump_generator_test_helper.cc: A helper program that\n//   minidump_generator_test.cc can launch to test certain things\n//   that require a separate executable.\n\n#include <unistd.h>\n\n#include \"client/mac/handler/exception_handler.h\"\n#include \"common/mac/MachIPC.h\"\n\nusing google_breakpad::MachPortSender;\nusing google_breakpad::MachReceiveMessage;\nusing google_breakpad::MachSendMessage;\nusing google_breakpad::ReceivePort;\n\nint main(int argc, char** argv) {\n  if (argc < 2)\n    return 1;\n\n  if (strcmp(argv[1], \"crash\") != 0) {\n    const int kTimeoutMs = 2000;\n    // Send parent process the task and thread ports.\n    MachSendMessage child_message(0);\n    child_message.AddDescriptor(mach_task_self());\n    child_message.AddDescriptor(mach_thread_self());\n\n    MachPortSender child_sender(argv[1]);\n    if (child_sender.SendMessage(child_message, kTimeoutMs) != KERN_SUCCESS) {\n      fprintf(stderr, \"Error sending message from child process!\\n\");\n      exit(1);\n    }\n\n    // Loop forever.\n    while (true) {\n      sleep(100);\n    }\n  } else if (argc == 3 && strcmp(argv[1], \"crash\") == 0) {\n    // Instantiate an OOP exception handler\n    google_breakpad::ExceptionHandler eh(\"\", NULL, NULL, NULL, true, argv[2]);\n    // and crash.\n    int *a = (int*)0x42;\n    *a = 1;\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/tests/spawn_child_process.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Utility functions for spawning a helper process using a different\n// CPU architecture.\n\n#ifndef GOOGLE_BREAKPAD_CLIENT_MAC_TESTS_SPAWN_CHILD_PROCESS\n#define GOOGLE_BREAKPAD_CLIENT_MAC_TESTS_SPAWN_CHILD_PROCESS\n\n#include <AvailabilityMacros.h>\n#ifndef MAC_OS_X_VERSION_10_6\n#define MAC_OS_X_VERSION_10_6 1060\n#endif\n#include <crt_externs.h>\n#include <mach-o/dyld.h>\n#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6\n#include <spawn.h>\n#endif\n\n#include <string>\n#include <vector>\n\n#include \"google_breakpad/common/minidump_format.h\"\n\nnamespace google_breakpad_test {\n\nusing std::string;\nusing std::vector;\n\nconst MDCPUArchitecture kNativeArchitecture =\n#if defined(__i386__)\n  MD_CPU_ARCHITECTURE_X86\n#elif defined(__x86_64__)\n  MD_CPU_ARCHITECTURE_AMD64\n#elif defined(__ppc__) || defined(__ppc64__)\n  MD_CPU_ARCHITECTURE_PPC\n#else\n#error \"This file has not been ported to this CPU architecture.\"\n#endif\n  ;\n\nconst u_int32_t kNativeContext =\n#if defined(__i386__)\n  MD_CONTEXT_X86\n#elif defined(__x86_64__)\n  MD_CONTEXT_AMD64\n#elif defined(__ppc__) || defined(__ppc64__)\n  MD_CONTEXT_PPC\n#else\n#error \"This file has not been ported to this CPU architecture.\"\n#endif\n  ;\n\nstring GetExecutablePath() {\n  char self_path[PATH_MAX];\n  uint32_t size = sizeof(self_path);\n  if (_NSGetExecutablePath(self_path, &size) != 0)\n    return \"\";\n  return self_path;\n}\n\nstring GetHelperPath() {\n  string helper_path(GetExecutablePath());\n  size_t pos = helper_path.rfind('/');\n  if (pos == string::npos)\n    return \"\";\n\n  helper_path.erase(pos + 1);\n  helper_path += \"minidump_generator_test_helper\";\n  return helper_path;\n}\n\n#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6\n\npid_t spawn_child_process(const char** argv) {\n  posix_spawnattr_t spawnattr;\n  if (posix_spawnattr_init(&spawnattr) != 0)\n    return (pid_t)-1;\n\n  cpu_type_t pref_cpu_types[2] = {\n#if defined(__x86_64__)\n    CPU_TYPE_X86,\n#elif defined(__i386__)\n    CPU_TYPE_X86_64,\n#endif\n    CPU_TYPE_ANY\n  };\n\n  // Set spawn attributes.\n  size_t attr_count = sizeof(pref_cpu_types) / sizeof(pref_cpu_types[0]);\n  size_t attr_ocount = 0;\n  if (posix_spawnattr_setbinpref_np(&spawnattr,\n                                    attr_count,\n                                    pref_cpu_types,\n                                    &attr_ocount) != 0 ||\n      attr_ocount != attr_count) {\n    posix_spawnattr_destroy(&spawnattr);\n    return (pid_t)-1;\n  }\n\n  // Create an argv array.\n  vector<char*> argv_v;\n  while (*argv) {\n    argv_v.push_back(strdup(*argv));\n    argv++;\n  }\n  argv_v.push_back(NULL);\n  pid_t new_pid = 0;\n  int result = posix_spawnp(&new_pid, argv_v[0], NULL, &spawnattr,\n                            &argv_v[0], *_NSGetEnviron());\n  posix_spawnattr_destroy(&spawnattr);\n  \n  for (unsigned i = 0; i < argv_v.size(); i++) {\n    free(argv_v[i]);\n  }\n\n  return result == 0 ? new_pid : -1;\n}\n#endif\n\n}  // namespace google_breakpad_test\n\n#endif  // GOOGLE_BREAKPAD_CLIENT_MAC_TESTS_SPAWN_CHILD_PROCESS\n"
  },
  {
    "path": "archive/spotify/breakpad/client/mac/tests/testlogging.h",
    "content": "// This file exists to override the processor logging for unit tests,\n// since it confuses XCode into thinking unit tests have failed.\n#include <sstream>\n\nnamespace google_breakpad {\nextern std::ostringstream info_log;\n}\n\n#define BPLOG_INFO_STREAM google_breakpad::info_log\n"
  },
  {
    "path": "archive/spotify/breakpad/client/minidump_file_writer-inl.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// minidump_file_writer-inl.h: Minidump file writer implementation.\n//\n// See minidump_file_writer.h for documentation.\n\n#ifndef CLIENT_MINIDUMP_FILE_WRITER_INL_H__\n#define CLIENT_MINIDUMP_FILE_WRITER_INL_H__\n\n#include <assert.h>\n\n#include \"client/minidump_file_writer.h\"\n#include \"google_breakpad/common/minidump_size.h\"\n\nnamespace google_breakpad {\n\ntemplate<typename MDType>\ninline bool TypedMDRVA<MDType>::Allocate() {\n  allocation_state_ = SINGLE_OBJECT;\n  return UntypedMDRVA::Allocate(minidump_size<MDType>::size());\n}\n\ntemplate<typename MDType>\ninline bool TypedMDRVA<MDType>::Allocate(size_t additional) {\n  allocation_state_ = SINGLE_OBJECT;\n  return UntypedMDRVA::Allocate(minidump_size<MDType>::size() + additional);\n}\n\ntemplate<typename MDType>\ninline bool TypedMDRVA<MDType>::AllocateArray(size_t count) {\n  assert(count);\n  allocation_state_ = ARRAY;\n  return UntypedMDRVA::Allocate(minidump_size<MDType>::size() * count);\n}\n\ntemplate<typename MDType>\ninline bool TypedMDRVA<MDType>::AllocateObjectAndArray(size_t count,\n                                                       size_t length) {\n  assert(count && length);\n  allocation_state_ = SINGLE_OBJECT_WITH_ARRAY;\n  return UntypedMDRVA::Allocate(minidump_size<MDType>::size() + count * length);\n}\n\ntemplate<typename MDType>\ninline bool TypedMDRVA<MDType>::CopyIndex(unsigned int index, MDType *item) {\n  assert(allocation_state_ == ARRAY);\n  return writer_->Copy(\n      static_cast<MDRVA>(position_ + index * minidump_size<MDType>::size()), \n      item, minidump_size<MDType>::size());\n}\n\ntemplate<typename MDType>\ninline bool TypedMDRVA<MDType>::CopyIndexAfterObject(unsigned int index,\n                                                     const void *src, \n                                                     size_t length) {\n  assert(allocation_state_ == SINGLE_OBJECT_WITH_ARRAY);\n  return writer_->Copy(\n      static_cast<MDRVA>(position_ + minidump_size<MDType>::size() \n                         + index * length),\n      src, length);\n}\n\ntemplate<typename MDType>\ninline bool TypedMDRVA<MDType>::Flush() {\n  return writer_->Copy(position_, &data_, minidump_size<MDType>::size());\n}\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_MINIDUMP_FILE_WRITER_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/minidump_file_writer.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// minidump_file_writer.cc: Minidump file writer implementation.\n//\n// See minidump_file_writer.h for documentation.\n\n#include <fcntl.h>\n#include <limits.h>\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n\n#include \"client/minidump_file_writer-inl.h\"\n#include \"common/linux/linux_libc_support.h\"\n#include \"common/string_conversion.h\"\n#if __linux__\n#include \"third_party/lss/linux_syscall_support.h\"\n#endif\n\nnamespace google_breakpad {\n\nconst MDRVA MinidumpFileWriter::kInvalidMDRVA = static_cast<MDRVA>(-1);\n\nMinidumpFileWriter::MinidumpFileWriter() : file_(-1), position_(0), size_(0) {\n}\n\nMinidumpFileWriter::~MinidumpFileWriter() {\n  Close();\n}\n\nbool MinidumpFileWriter::Open(const char *path) {\n  assert(file_ == -1);\n#if __linux__\n  file_ = sys_open(path, O_WRONLY | O_CREAT | O_EXCL, 0600);\n#else\n  file_ = open(path, O_WRONLY | O_CREAT | O_EXCL, 0600);\n#endif\n\n  return file_ != -1;\n}\n\nbool MinidumpFileWriter::Close() {\n  bool result = true;\n\n  if (file_ != -1) {\n    if (-1 == ftruncate(file_, position_)) {\n       return false;\n    }\n#if __linux__\n    result = (sys_close(file_) == 0);\n#else\n    result = (close(file_) == 0);\n#endif\n    file_ = -1;\n  }\n\n  return result;\n}\n\nbool MinidumpFileWriter::CopyStringToMDString(const wchar_t *str,\n                                              unsigned int length,\n                                              TypedMDRVA<MDString> *mdstring) {\n  bool result = true;\n  if (sizeof(wchar_t) == sizeof(u_int16_t)) {\n    // Shortcut if wchar_t is the same size as MDString's buffer\n    result = mdstring->Copy(str, mdstring->get()->length);\n  } else {\n    u_int16_t out[2];\n    int out_idx = 0;\n\n    // Copy the string character by character\n    while (length && result) {\n      UTF32ToUTF16Char(*str, out);\n      if (!out[0])\n        return false;\n\n      // Process one character at a time\n      --length;\n      ++str;\n\n      // Append the one or two UTF-16 characters.  The first one will be non-\n      // zero, but the second one may be zero, depending on the conversion from\n      // UTF-32.\n      int out_count = out[1] ? 2 : 1;\n      size_t out_size = sizeof(u_int16_t) * out_count;\n      result = mdstring->CopyIndexAfterObject(out_idx, out, out_size);\n      out_idx += out_count;\n    }\n  }\n  return result;\n}\n\nbool MinidumpFileWriter::CopyStringToMDString(const char *str,\n                                              unsigned int length,\n                                              TypedMDRVA<MDString> *mdstring) {\n  bool result = true;\n  u_int16_t out[2];\n  int out_idx = 0;\n\n  // Copy the string character by character\n  while (length && result) {\n    int conversion_count = UTF8ToUTF16Char(str, length, out);\n    if (!conversion_count)\n      return false;\n\n    // Move the pointer along based on the nubmer of converted characters\n    length -= conversion_count;\n    str += conversion_count;\n\n    // Append the one or two UTF-16 characters\n    int out_count = out[1] ? 2 : 1;\n    size_t out_size = sizeof(u_int16_t) * out_count;\n    result = mdstring->CopyIndexAfterObject(out_idx, out, out_size);\n    out_idx += out_count;\n  }\n  return result;\n}\n\ntemplate <typename CharType>\nbool MinidumpFileWriter::WriteStringCore(const CharType *str,\n                                         unsigned int length,\n                                         MDLocationDescriptor *location) {\n  assert(str);\n  assert(location);\n  // Calculate the mdstring length by either limiting to |length| as passed in\n  // or by finding the location of the NULL character.\n  unsigned int mdstring_length = 0;\n  if (!length)\n    length = INT_MAX;\n  for (; mdstring_length < length && str[mdstring_length]; ++mdstring_length)\n    ;\n\n  // Allocate the string buffer\n  TypedMDRVA<MDString> mdstring(this);\n  if (!mdstring.AllocateObjectAndArray(mdstring_length + 1, sizeof(u_int16_t)))\n    return false;\n\n  // Set length excluding the NULL and copy the string\n  mdstring.get()->length =\n      static_cast<u_int32_t>(mdstring_length * sizeof(u_int16_t));\n  bool result = CopyStringToMDString(str, mdstring_length, &mdstring);\n\n  // NULL terminate\n  if (result) {\n    u_int16_t ch = 0;\n    result = mdstring.CopyIndexAfterObject(mdstring_length, &ch, sizeof(ch));\n\n    if (result)\n      *location = mdstring.location();\n  }\n\n  return result;\n}\n\nbool MinidumpFileWriter::WriteString(const wchar_t *str, unsigned int length,\n                 MDLocationDescriptor *location) {\n  return WriteStringCore(str, length, location);\n}\n\nbool MinidumpFileWriter::WriteString(const char *str, unsigned int length,\n                 MDLocationDescriptor *location) {\n  return WriteStringCore(str, length, location);\n}\n\nbool MinidumpFileWriter::WriteMemory(const void *src, size_t size,\n                                     MDMemoryDescriptor *output) {\n  assert(src);\n  assert(output);\n  UntypedMDRVA mem(this);\n\n  if (!mem.Allocate(size))\n    return false;\n  if (!mem.Copy(src, mem.size()))\n    return false;\n\n  output->start_of_memory_range = reinterpret_cast<u_int64_t>(src);\n  output->memory = mem.location();\n\n  return true;\n}\n\nMDRVA MinidumpFileWriter::Allocate(size_t size) {\n  assert(size);\n  assert(file_ != -1);\n  size_t aligned_size = (size + 7) & ~7;  // 64-bit alignment\n\n  if (position_ + aligned_size > size_) {\n    size_t growth = aligned_size;\n    size_t minimal_growth = getpagesize();\n\n    // Ensure that the file grows by at least the size of a memory page\n    if (growth < minimal_growth)\n      growth = minimal_growth;\n\n    size_t new_size = size_ + growth;\n    if (ftruncate(file_, new_size) != 0)\n      return kInvalidMDRVA;\n\n    size_ = new_size;\n  }\n\n  MDRVA current_position = position_;\n  position_ += static_cast<MDRVA>(aligned_size);\n\n  return current_position;\n}\n\nbool MinidumpFileWriter::Copy(MDRVA position, const void *src, ssize_t size) {\n  assert(src);\n  assert(size);\n  assert(file_ != -1);\n\n  // Ensure that the data will fit in the allocated space\n  if (static_cast<size_t>(size + position) > size_)\n    return false;\n\n  // Seek and write the data\n#if __linux__\n  if (sys_lseek(file_, position, SEEK_SET) == static_cast<off_t>(position)) {\n    if (sys_write(file_, src, size) == size) {\n#else\n  if (lseek(file_, position, SEEK_SET) == static_cast<off_t>(position)) {\n    if (write(file_, src, size) == size) {\n#endif\n      return true;\n    }\n  }\n\n  return false;\n}\n\nbool UntypedMDRVA::Allocate(size_t size) {\n  assert(size_ == 0);\n  size_ = size;\n  position_ = writer_->Allocate(size_);\n  return position_ != MinidumpFileWriter::kInvalidMDRVA;\n}\n\nbool UntypedMDRVA::Copy(MDRVA pos, const void *src, size_t size) {\n  assert(src);\n  assert(size);\n  assert(pos + size <= position_ + size_);\n  return writer_->Copy(pos, src, size);\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/minidump_file_writer.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// minidump_file_writer.h:  Implements file-based minidump generation.  It's\n// intended to be used with the Google Breakpad open source crash handling\n// project.\n\n#ifndef CLIENT_MINIDUMP_FILE_WRITER_H__\n#define CLIENT_MINIDUMP_FILE_WRITER_H__\n\n#include <string>\n\n#include \"google_breakpad/common/minidump_format.h\"\n\nnamespace google_breakpad {\n\nclass UntypedMDRVA;\ntemplate<typename MDType> class TypedMDRVA;\n\n// The user of this class can Open() a file and add minidump streams, data, and\n// strings using the definitions in minidump_format.h.  Since this class is\n// expected to be used in a situation where the current process may be\n// damaged, it will not allocate heap memory.\n// Sample usage:\n// MinidumpFileWriter writer;\n// writer.Open(\"/tmp/minidump.dmp\");\n// TypedMDRVA<MDRawHeader> header(&writer_);\n// header.Allocate();\n// header->get()->signature = MD_HEADER_SIGNATURE;\n//  :\n// writer.Close();\nclass MinidumpFileWriter {\npublic:\n  // Invalid MDRVA (Minidump Relative Virtual Address)\n  // returned on failed allocation\n  static const MDRVA kInvalidMDRVA;\n\n  MinidumpFileWriter();\n  ~MinidumpFileWriter();\n\n  // Open |path| as the destination of the minidump data.  Any existing file\n  // will be overwritten.\n  // Return true on success, or false on failure\n  bool Open(const char *path);\n\n  // Close the current file\n  // Return true on success, or false on failure\n  bool Close();\n\n  // Copy the contents of |str| to a MDString and write it to the file.\n  // |str| is expected to be either UTF-16 or UTF-32 depending on the size\n  // of wchar_t.\n  // Maximum |length| of characters to copy from |str|, or specify 0 to use the\n  // entire NULL terminated string.  Copying will stop at the first NULL.\n  // |location| the allocated location\n  // Return true on success, or false on failure\n  bool WriteString(const wchar_t *str, unsigned int length,\n                   MDLocationDescriptor *location);\n\n  // Same as above, except with |str| as a UTF-8 string\n  bool WriteString(const char *str, unsigned int length,\n                   MDLocationDescriptor *location);\n\n  // Write |size| bytes starting at |src| into the current position.\n  // Return true on success and set |output| to position, or false on failure\n  bool WriteMemory(const void *src, size_t size, MDMemoryDescriptor *output);\n\n  // Copies |size| bytes from |src| to |position|\n  // Return true on success, or false on failure\n  bool Copy(MDRVA position, const void *src, ssize_t size);\n\n  // Return the current position for writing to the minidump\n  inline MDRVA position() const { return position_; }\n\n private:\n  friend class UntypedMDRVA;\n\n  // Allocates an area of |size| bytes.\n  // Returns the position of the allocation, or kInvalidMDRVA if it was\n  // unable to allocate the bytes.\n  MDRVA Allocate(size_t size);\n\n  // The file descriptor for the output file\n  int file_;\n\n  // Current position in buffer\n  MDRVA position_;\n\n  // Current allocated size\n  size_t size_;\n\n  // Copy |length| characters from |str| to |mdstring|.  These are distinct\n  // because the underlying MDString is a UTF-16 based string.  The wchar_t\n  // variant may need to create a MDString that has more characters than the\n  // source |str|, whereas the UTF-8 variant may coalesce characters to form\n  // a single UTF-16 character.\n  bool CopyStringToMDString(const wchar_t *str, unsigned int length,\n                            TypedMDRVA<MDString> *mdstring);\n  bool CopyStringToMDString(const char *str, unsigned int length,\n                            TypedMDRVA<MDString> *mdstring);\n\n  // The common templated code for writing a string\n  template <typename CharType>\n  bool WriteStringCore(const CharType *str, unsigned int length,\n                       MDLocationDescriptor *location);\n};\n\n// Represents an untyped allocated chunk\nclass UntypedMDRVA {\n public:\n  explicit UntypedMDRVA(MinidumpFileWriter *writer)\n      : writer_(writer),\n        position_(writer->position()),\n        size_(0) {}\n\n  // Allocates |size| bytes.  Must not call more than once.\n  // Return true on success, or false on failure\n  bool Allocate(size_t size);\n\n  // Returns the current position or kInvalidMDRVA if allocation failed\n  inline MDRVA position() const { return position_; }\n\n  // Number of bytes allocated\n  inline size_t size() const { return size_; }\n\n  // Return size and position\n  inline MDLocationDescriptor location() const {\n    MDLocationDescriptor location = { static_cast<u_int32_t>(size_),\n                                      position_ };\n    return location;\n  }\n\n  // Copy |size| bytes starting at |src| into the minidump at |position|\n  // Return true on success, or false on failure\n  bool Copy(MDRVA position, const void *src, size_t size);\n\n  // Copy |size| bytes from |src| to the current position\n  inline bool Copy(const void *src, size_t size) {\n    return Copy(position_, src, size);\n  }\n\n protected:\n  // Writer we associate with\n  MinidumpFileWriter *writer_;\n\n  // Position of the start of the data\n  MDRVA position_;\n\n  // Allocated size\n  size_t size_;\n};\n\n// Represents a Minidump object chunk.  Additional memory can be allocated at\n// the end of the object as a:\n// - single allocation\n// - Array of MDType objects\n// - A MDType object followed by an array\ntemplate<typename MDType>\nclass TypedMDRVA : public UntypedMDRVA {\n public:\n  // Constructs an unallocated MDRVA\n  explicit TypedMDRVA(MinidumpFileWriter *writer)\n      : UntypedMDRVA(writer),\n        data_(),\n        allocation_state_(UNALLOCATED) {}\n\n  inline ~TypedMDRVA() {\n    // Ensure that the data_ object is written out\n    if (allocation_state_ != ARRAY)\n      Flush();\n  }\n\n  // Address of object data_ of MDType.  This is not declared const as the\n  // typical usage will be to access the underlying |data_| object as to\n  // alter its contents.\n  MDType *get() { return &data_; }\n\n  // Allocates minidump_size<MDType>::size() bytes.\n  // Must not call more than once.\n  // Return true on success, or false on failure\n  bool Allocate();\n\n  // Allocates minidump_size<MDType>::size() + |additional| bytes.\n  // Must not call more than once.\n  // Return true on success, or false on failure\n  bool Allocate(size_t additional);\n\n  // Allocate an array of |count| elements of MDType.\n  // Must not call more than once.\n  // Return true on success, or false on failure\n  bool AllocateArray(size_t count);\n\n  // Allocate an array of |count| elements of |size| after object of MDType\n  // Must not call more than once.\n  // Return true on success, or false on failure\n  bool AllocateObjectAndArray(size_t count, size_t size);\n\n  // Copy |item| to |index|\n  // Must have been allocated using AllocateArray().\n  // Return true on success, or false on failure\n  bool CopyIndex(unsigned int index, MDType *item);\n\n  // Copy |size| bytes starting at |str| to |index|\n  // Must have been allocated using AllocateObjectAndArray().\n  // Return true on success, or false on failure\n  bool CopyIndexAfterObject(unsigned int index, const void *src, size_t size);\n\n  // Write data_\n  bool Flush();\n\n private:\n  enum AllocationState {\n    UNALLOCATED = 0,\n    SINGLE_OBJECT,\n    ARRAY,\n    SINGLE_OBJECT_WITH_ARRAY\n  };\n\n  MDType data_;\n  AllocationState allocation_state_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_MINIDUMP_FILE_WRITER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/minidump_file_writer_unittest.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: waylonis@google.com (Dan Waylonis)\n\n/*\n g++ -I../ ../common/convert_UTF.c \\\n ../common/string_conversion.cc \\\n minidump_file_writer.cc \\\n minidump_file_writer_unittest.cc \\\n -o minidump_file_writer_unittest\n */\n\n#include <fcntl.h>\n#include <unistd.h>\n\n#include \"minidump_file_writer-inl.h\"\n\nusing google_breakpad::MinidumpFileWriter;\n\n#define ASSERT_TRUE(cond) \\\nif (!(cond)) { \\\n  fprintf(stderr, \"FAILED: %s at %s:%d\\n\", #cond, __FILE__, __LINE__); \\\n    return false; \\\n}\n\n#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2))\n#define ASSERT_NE(e1, e2) ASSERT_TRUE((e1) != (e2))\n\nstruct StringStructure {\n  unsigned long integer_value;\n  MDLocationDescriptor first_string;\n  MDLocationDescriptor second_string;\n};\n\nstruct ArrayStructure {\n  unsigned char char_value;\n  unsigned short short_value;\n  unsigned long long_value;\n};\n\ntypedef struct {\n  unsigned long count;\n  ArrayStructure array[0];\n} ObjectAndArrayStructure;\n\nstatic bool WriteFile(const char *path) {\n  MinidumpFileWriter writer;\n  if (writer.Open(path)) {\n    // Test a single structure\n    google_breakpad::TypedMDRVA<StringStructure> strings(&writer);\n    ASSERT_TRUE(strings.Allocate());\n    strings.get()->integer_value = 0xBEEF;\n    const char *first = \"First String\";\n    ASSERT_TRUE(writer.WriteString(first, 0, &strings.get()->first_string));\n    const wchar_t *second = L\"Second String\";\n    ASSERT_TRUE(writer.WriteString(second, 0, &strings.get()->second_string));\n\n    // Test an array structure\n    google_breakpad::TypedMDRVA<ArrayStructure> array(&writer);\n    unsigned int count = 10;\n    ASSERT_TRUE(array.AllocateArray(count));\n    for (unsigned int i = 0; i < count; ++i) {\n      ArrayStructure local;\n      local.char_value = i;\n      local.short_value = i + 1;\n      local.long_value = i + 2;\n      ASSERT_TRUE(array.CopyIndex(i, &local));\n    }\n\n    // Test an object followed by an array\n    google_breakpad::TypedMDRVA<ObjectAndArrayStructure> obj_array(&writer);\n    ASSERT_TRUE(obj_array.AllocateObjectAndArray(count,\n                                                 sizeof(ArrayStructure)));\n    obj_array.get()->count = count;\n    for (unsigned int i = 0; i < count; ++i) {\n      ArrayStructure local;\n      local.char_value = i;\n      local.short_value = i + 1;\n      local.long_value = i + 2;\n      ASSERT_TRUE(obj_array.CopyIndexAfterObject(i, &local, sizeof(local)));\n    }\n  }\n\n  return writer.Close();\n}\n\nstatic bool CompareFile(const char *path) {\n  unsigned long expected[] = {\n#if defined(__BIG_ENDIAN__)\n    0x0000beef, 0x0000001e, 0x00000018, 0x00000020, 0x00000038, 0x00000000, \n    0x00000018, 0x00460069, 0x00720073, 0x00740020, 0x00530074, 0x00720069,\n    0x006e0067, 0x00000000, 0x0000001a, 0x00530065, 0x0063006f, 0x006e0064,\n    0x00200053, 0x00740072, 0x0069006e, 0x00670000, 0x00000001, 0x00000002,\n    0x01000002, 0x00000003, 0x02000003, 0x00000004, 0x03000004, 0x00000005,\n    0x04000005, 0x00000006, 0x05000006, 0x00000007, 0x06000007, 0x00000008,\n    0x07000008, 0x00000009, 0x08000009, 0x0000000a, 0x0900000a, 0x0000000b,\n    0x0000000a, 0x00000001, 0x00000002, 0x01000002, 0x00000003, 0x02000003,\n    0x00000004, 0x03000004, 0x00000005, 0x04000005, 0x00000006, 0x05000006,\n    0x00000007, 0x06000007, 0x00000008, 0x07000008, 0x00000009, 0x08000009,\n    0x0000000a, 0x0900000a, 0x0000000b, 0x00000000\n#else\n    0x0000beef, 0x0000001e, 0x00000018, 0x00000020,\n    0x00000038, 0x00000000, 0x00000018, 0x00690046,\n    0x00730072, 0x00200074, 0x00740053, 0x00690072,\n    0x0067006e, 0x00000000, 0x0000001a, 0x00650053,\n    0x006f0063, 0x0064006e, 0x00530020, 0x00720074,\n    0x006e0069, 0x00000067, 0x00011e00, 0x00000002,\n    0x00021e01, 0x00000003, 0x00031e02, 0x00000004,\n    0x00041e03, 0x00000005, 0x00051e04, 0x00000006,\n    0x00061e05, 0x00000007, 0x00071e06, 0x00000008,\n    0x00081e07, 0x00000009, 0x00091e08, 0x0000000a,\n    0x000a1e09, 0x0000000b, 0x0000000a, 0x00011c00,\n    0x00000002, 0x00021c01, 0x00000003, 0x00031c02,\n    0x00000004, 0x00041c03, 0x00000005, 0x00051c04,\n    0x00000006, 0x00061c05, 0x00000007, 0x00071c06,\n    0x00000008, 0x00081c07, 0x00000009, 0x00091c08,\n    0x0000000a, 0x000a1c09, 0x0000000b, 0x00000000,\n#endif\n  };\n  size_t expected_byte_count = sizeof(expected);\n  int fd = open(path, O_RDONLY, 0600);\n  void *buffer = malloc(expected_byte_count);\n  ASSERT_NE(fd, -1);\n  ASSERT_TRUE(buffer);\n  ASSERT_EQ(read(fd, buffer, expected_byte_count), \n            static_cast<ssize_t>(expected_byte_count));\n\n  char *b1, *b2;\n  b1 = reinterpret_cast<char*>(buffer);\n  b2 = reinterpret_cast<char*>(expected);\n  while (*b1 == *b2) {\n    b1++;\n    b2++;\n  }\n\n  printf(\"%p\\n\", reinterpret_cast<void*>(b1 - (char*)buffer));\n\n  ASSERT_EQ(memcmp(buffer, expected, expected_byte_count), 0);\n  return true;\n}\n\nstatic bool RunTests() {\n  const char *path = \"/tmp/minidump_file_writer_unittest.dmp\";\n  ASSERT_TRUE(WriteFile(path));\n  ASSERT_TRUE(CompareFile(path));\n  unlink(path);\n  return true;\n}\n\nextern \"C\" int main(int argc, const char *argv[]) {\n  return RunTests() ? 0 : 1;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/solaris/handler/exception_handler.cc",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Alfred Peng\n\n#include <signal.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <unistd.h>\n\n#include <cassert>\n#include <cstdlib>\n#include <ctime>\n\n#include \"client/solaris/handler/exception_handler.h\"\n#include \"common/solaris/guid_creator.h\"\n#include \"common/solaris/message_output.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n\nnamespace google_breakpad {\n\n// Signals that we are interested.\nstatic const int kSigTable[] = {\n  SIGSEGV,\n  SIGABRT,\n  SIGFPE,\n  SIGILL,\n  SIGBUS\n};\n\nstd::vector<ExceptionHandler*> *ExceptionHandler::handler_stack_ = NULL;\nint ExceptionHandler::handler_stack_index_ = 0;\npthread_mutex_t ExceptionHandler::handler_stack_mutex_ =\n  PTHREAD_MUTEX_INITIALIZER;\n\nExceptionHandler::ExceptionHandler(const string &dump_path,\n                                   FilterCallback filter,\n                                   MinidumpCallback callback,\n                                   void *callback_context,\n                                   bool install_handler)\n    : filter_(filter),\n      callback_(callback),\n      callback_context_(callback_context),\n      dump_path_(),\n      installed_handler_(install_handler) {\n  set_dump_path(dump_path);\n\n  if (install_handler) {\n    SetupHandler();\n  }\n\n  if (install_handler) {\n    pthread_mutex_lock(&handler_stack_mutex_);\n\n    if (handler_stack_ == NULL)\n      handler_stack_ = new std::vector<ExceptionHandler *>;\n    handler_stack_->push_back(this);\n    pthread_mutex_unlock(&handler_stack_mutex_);\n  }\n}\n\nExceptionHandler::~ExceptionHandler() {\n  TeardownAllHandlers();\n  pthread_mutex_lock(&handler_stack_mutex_);\n  if (handler_stack_->back() == this) {\n    handler_stack_->pop_back();\n  } else {\n    print_message1(2, \"warning: removing Breakpad handler out of order\\n\");\n    for (std::vector<ExceptionHandler *>::iterator iterator =\n         handler_stack_->begin();\n         iterator != handler_stack_->end();\n         ++iterator) {\n      if (*iterator == this) {\n        handler_stack_->erase(iterator);\n      }\n    }\n  }\n\n  if (handler_stack_->empty()) {\n    // When destroying the last ExceptionHandler that installed a handler,\n    // clean up the handler stack.\n    delete handler_stack_;\n    handler_stack_ = NULL;\n  }\n  pthread_mutex_unlock(&handler_stack_mutex_);\n}\n\nbool ExceptionHandler::WriteMinidump() {\n  return InternalWriteMinidump(0, 0, NULL);\n}\n\n// static\nbool ExceptionHandler::WriteMinidump(const string &dump_path,\n                                     MinidumpCallback callback,\n                                     void *callback_context) {\n  ExceptionHandler handler(dump_path, NULL, callback,\n                           callback_context, false);\n  return handler.InternalWriteMinidump(0, 0, NULL);\n}\n\nvoid ExceptionHandler::SetupHandler() {\n  // Signal on a different stack to avoid using the stack\n  // of the crashing lwp.\n  struct sigaltstack sig_stack;\n  sig_stack.ss_sp = malloc(MINSIGSTKSZ);\n  if (sig_stack.ss_sp == NULL)\n    return;\n  sig_stack.ss_size = MINSIGSTKSZ;\n  sig_stack.ss_flags = 0;\n\n  if (sigaltstack(&sig_stack, NULL) < 0)\n    return;\n  for (size_t i = 0; i < sizeof(kSigTable) / sizeof(kSigTable[0]); ++i)\n    SetupHandler(kSigTable[i]);\n}\n\nvoid ExceptionHandler::SetupHandler(int signo) {\n  struct sigaction act, old_act;\n  act.sa_handler = HandleException;\n  act.sa_flags = SA_ONSTACK;\n  if (sigaction(signo, &act, &old_act) < 0)\n    return;\n  old_handlers_[signo] = old_act.sa_handler;\n}\n\nvoid ExceptionHandler::TeardownHandler(int signo) {\n  if (old_handlers_.find(signo) != old_handlers_.end()) {\n    struct sigaction act;\n    act.sa_handler = old_handlers_[signo];\n    act.sa_flags = 0;\n    sigaction(signo, &act, 0);\n  }\n}\n\nvoid ExceptionHandler::TeardownAllHandlers() {\n  for (size_t i = 0; i < sizeof(kSigTable) / sizeof(kSigTable[0]); ++i) {\n    TeardownHandler(kSigTable[i]);\n  }\n}\n\n// static\nvoid ExceptionHandler::HandleException(int signo) {\n//void ExceptionHandler::HandleException(int signo, siginfo_t *sip, ucontext_t *sig_ctx) {\n  // The context information about the signal is put on the stack of\n  // the signal handler frame as value parameter. For some reasons, the\n  // prototype of the handler doesn't declare this information as parameter, we\n  // will do it by hand. The stack layout for a signal handler frame is here:\n  // http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libproc/common/Pstack.c#81\n  //\n  // However, if we are being called by another signal handler passing the\n  // signal up the chain, then we may not have this random extra parameter,\n  // so we may have to walk the stack to find it.  We do the actual work\n  // on another thread, where it's a little safer, but we want the ebp\n  // from this frame to find it.\n  uintptr_t current_ebp = (uintptr_t)_getfp();\n\n  pthread_mutex_lock(&handler_stack_mutex_);\n  ExceptionHandler *current_handler =\n    handler_stack_->at(handler_stack_->size() - ++handler_stack_index_);\n  pthread_mutex_unlock(&handler_stack_mutex_);\n\n  // Restore original handler.\n  current_handler->TeardownHandler(signo);\n\n  ucontext_t *sig_ctx = NULL;\n  if (current_handler->InternalWriteMinidump(signo, current_ebp, &sig_ctx)) {\n//  if (current_handler->InternalWriteMinidump(signo, &sig_ctx)) {\n    // Fully handled this exception, safe to exit.\n    exit(EXIT_FAILURE);\n  } else {\n    // Exception not fully handled, will call the next handler in stack to\n    // process it.\n    typedef void (*SignalHandler)(int signo);\n    SignalHandler old_handler =\n      reinterpret_cast<SignalHandler>(current_handler->old_handlers_[signo]);\n    if (old_handler != NULL)\n      old_handler(signo);\n  }\n\n  pthread_mutex_lock(&handler_stack_mutex_);\n  current_handler->SetupHandler(signo);\n  --handler_stack_index_;\n  // All the handlers in stack have been invoked to handle the exception,\n  // normally the process should be terminated and should not reach here.\n  // In case we got here, ask the OS to handle it to avoid endless loop,\n  // normally the OS will generate a core and termiate the process. This\n  // may be desired to debug the program.\n  if (handler_stack_index_ == 0)\n    signal(signo, SIG_DFL);\n  pthread_mutex_unlock(&handler_stack_mutex_);\n}\n\nbool ExceptionHandler::InternalWriteMinidump(int signo,\n                                             uintptr_t sighandler_ebp,\n                                             ucontext_t **sig_ctx) {\n  if (filter_ && !filter_(callback_context_))\n    return false;\n\n  bool success = false;\n  GUID guid;\n  char guid_str[kGUIDStringLength + 1];\n  if (CreateGUID(&guid) && GUIDToString(&guid, guid_str, sizeof(guid_str))) {\n    char minidump_path[PATH_MAX];\n    snprintf(minidump_path, sizeof(minidump_path), \"%s/%s.dmp\",\n             dump_path_c_, guid_str);\n\n    // Block all the signals we want to process when writing minidump.\n    // We don't want it to be interrupted.\n    sigset_t sig_blocked, sig_old;\n    bool blocked = true;\n    sigfillset(&sig_blocked);\n    for (size_t i = 0; i < sizeof(kSigTable) / sizeof(kSigTable[0]); ++i)\n      sigdelset(&sig_blocked, kSigTable[i]);\n    if (sigprocmask(SIG_BLOCK, &sig_blocked, &sig_old) != 0) {\n      blocked = false;\n      print_message1(2, \"HandleException: failed to block signals.\\n\");\n    }\n\n    success = minidump_generator_.WriteMinidumpToFile(\n                       minidump_path, signo, sighandler_ebp, sig_ctx);\n\n    // Unblock the signals.\n    if (blocked)\n      sigprocmask(SIG_SETMASK, &sig_old, &sig_old);\n\n    if (callback_)\n      success = callback_(dump_path_c_, guid_str, callback_context_, success);\n  }\n  return success;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/solaris/handler/exception_handler.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Alfred Peng\n\n#ifndef CLIENT_SOLARIS_HANDLER_EXCEPTION_HANDLER_H__\n#define CLIENT_SOLARIS_HANDLER_EXCEPTION_HANDLER_H__\n\n#include <map>\n#include <string>\n#include <vector>\n\n#include \"client/solaris/handler/minidump_generator.h\"\n\nnamespace google_breakpad {\n\nusing std::string;\n\n//\n// ExceptionHandler\n//\n// ExceptionHandler can write a minidump file when an exception occurs,\n// or when WriteMinidump() is called explicitly by your program.\n//\n// To have the exception handler write minidumps when an uncaught exception\n// (crash) occurs, you should create an instance early in the execution\n// of your program, and keep it around for the entire time you want to\n// have crash handling active (typically, until shutdown).\n// (NOTE): There should be only one this kind of exception handler\n// object per process.\n//\n// If you want to write minidumps without installing the exception handler,\n// you can create an ExceptionHandler with install_handler set to false,\n// then call WriteMinidump.  You can also use this technique if you want to\n// use different minidump callbacks for different call sites.\n//\n// In either case, a callback function is called when a minidump is written,\n// which receives the unqiue id of the minidump.  The caller can use this\n// id to collect and write additional application state, and to launch an\n// external crash-reporting application.\n//\n// Caller should try to make the callbacks as crash-friendly as possible,\n// it should avoid use heap memory allocation as much as possible.\n//\nclass ExceptionHandler {\n public:\n  // A callback function to run before Breakpad performs any substantial\n  // processing of an exception.  A FilterCallback is called before writing\n  // a minidump.  context is the parameter supplied by the user as\n  // callback_context when the handler was created.\n  //\n  // If a FilterCallback returns true, Breakpad will continue processing,\n  // attempting to write a minidump.  If a FilterCallback returns false,\n  // Breakpad  will immediately report the exception as unhandled without\n  // writing a minidump, allowing another handler the opportunity to handle it.\n  typedef bool (*FilterCallback)(void *context);\n\n  // A callback function to run after the minidump has been written.\n  // minidump_id is a unique id for the dump, so the minidump\n  // file is <dump_path>/<minidump_id>.dmp.  context is the parameter supplied\n  // by the user as callback_context when the handler was created.  succeeded\n  // indicates whether a minidump file was successfully written.\n  //\n  // If an exception occurred and the callback returns true, Breakpad will\n  // treat the exception as fully-handled, suppressing any other handlers from\n  // being notified of the exception.  If the callback returns false, Breakpad\n  // will treat the exception as unhandled, and allow another handler to handle\n  // it. If there are no other handlers, Breakpad will report the exception to\n  // the system as unhandled, allowing a debugger or native crash dialog the\n  // opportunity to handle the exception.  Most callback implementations\n  // should normally return the value of |succeeded|, or when they wish to\n  // not report an exception of handled, false.  Callbacks will rarely want to\n  // return true directly (unless |succeeded| is true).\n  typedef bool (*MinidumpCallback)(const char *dump_path,\n                                   const char *minidump_id,\n                                   void *context,\n                                   bool succeeded);\n\n  // Creates a new ExceptionHandler instance to handle writing minidumps.\n  // Before writing a minidump, the optional filter callback will be called.\n  // Its return value determines whether or not Breakpad should write a\n  // minidump.  Minidump files will be written to dump_path, and the optional\n  // callback is called after writing the dump file, as described above.\n  // If install_handler is true, then a minidump will be written whenever\n  // an unhandled exception occurs.  If it is false, minidumps will only\n  // be written when WriteMinidump is called.\n  ExceptionHandler(const string &dump_path,\n                   FilterCallback filter, MinidumpCallback callback,\n                   void *callback_context,\n                   bool install_handler);\n  ~ExceptionHandler();\n\n  // Get and Set the minidump path.\n  string dump_path() const { return dump_path_; }\n  void set_dump_path(const string &dump_path) {\n    dump_path_ = dump_path;\n    dump_path_c_ = dump_path_.c_str();\n  }\n\n  // Writes a minidump immediately.  This can be used to capture the\n  // execution state independently of a crash.  Returns true on success.\n  bool WriteMinidump();\n\n  // Convenience form of WriteMinidump which does not require an\n  // ExceptionHandler instance.\n  static bool WriteMinidump(const string &dump_path,\n                            MinidumpCallback callback,\n                            void *callback_context);\n\n private:\n  // Setup crash handler.\n  void SetupHandler();\n  // Setup signal handler for a signal.\n  void SetupHandler(int signo);\n  // Teardown the handler for a signal.\n  void TeardownHandler(int signo);\n  // Teardown all handlers.\n  void TeardownAllHandlers();\n\n  // Runs the main loop for the exception handler thread.\n  static void* ExceptionHandlerThreadMain(void *lpParameter);\n\n  // Signal handler.\n  static void HandleException(int signo);\n\n  // Write all the information to the dump file.\n  // If called from a signal handler, sighandler_ebp is the ebp of\n  // that signal handler's frame, and sig_ctx is an out parameter\n  // that will be set to point at the ucontext_t that was placed\n  // on the stack by the kernel.  You can pass zero and NULL\n  // for the second and third parameters if you are not calling\n  // this from a signal handler.\n  bool InternalWriteMinidump(int signo, uintptr_t sighandler_ebp,\n                             ucontext_t **sig_ctx);\n\n private:\n  // The callbacks before and after writing the dump file.\n  FilterCallback filter_;\n  MinidumpCallback callback_;\n  void *callback_context_;\n\n  // The directory in which a minidump will be written, set by the dump_path\n  // argument to the constructor, or set_dump_path.\n  string dump_path_;\n  // C style dump path. Keep this when setting dump path, since calling\n  // c_str() of std::string when crashing may not be safe.\n  const char *dump_path_c_;\n\n  // True if the ExceptionHandler installed an unhandled exception filter\n  // when created (with an install_handler parameter set to true).\n  bool installed_handler_;\n\n  // Keep the previous handlers for the signal.\n  typedef void (*sighandler_t)(int);\n  std::map<int, sighandler_t> old_handlers_;\n\n  // The global exception handler stack. This is need becuase there may exist\n  // multiple ExceptionHandler instances in a process. Each will have itself\n  // registered in this stack.\n  static std::vector<ExceptionHandler *> *handler_stack_;\n  // The index of the handler that should handle the next exception.\n  static int handler_stack_index_;\n  static pthread_mutex_t handler_stack_mutex_;\n\n  // The minidump generator.\n  MinidumpGenerator minidump_generator_;\n\n  // disallow copy ctor and operator=\n  explicit ExceptionHandler(const ExceptionHandler &);\n  void operator=(const ExceptionHandler &);\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_SOLARIS_HANDLER_EXCEPTION_HANDLER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/solaris/handler/exception_handler_test.cc",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Alfred Peng\n\n#include <pthread.h>\n#include <unistd.h>\n\n#include <cassert>\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n\n#include \"client/solaris/handler/exception_handler.h\"\n#include \"client/solaris/handler/solaris_lwp.h\"\n\nusing namespace google_breakpad;\n\n// Thread use this to see if it should stop working.\nstatic bool should_exit = false;\n\nstatic int foo2(int arg) {\n  // Stack variable, used for debugging stack dumps.\n  int c = 0xcccccccc;\n  fprintf(stderr, \"Thread trying to crash: %x\\n\", getpid());\n  c = *reinterpret_cast<int *>(0x5);\n  return c;\n}\n\nstatic int foo(int arg) {\n  // Stack variable, used for debugging stack dumps.\n  int b = 0xbbbbbbbb;\n  b = foo2(b);\n  return b;\n}\n\nstatic void *thread_crash(void *) {\n  // Stack variable, used for debugging stack dumps.\n  int a = 0xaaaaaaaa;\n  sleep(3);\n  a = foo(a);\n  printf(\"%x\\n\", a);\n  return NULL;\n}\n\nstatic void *thread_main(void *) {\n  while (!should_exit)\n    sleep(1);\n  return NULL;\n}\n\nstatic void CreateCrashThread() {\n  pthread_t h;\n  pthread_create(&h, NULL, thread_crash, NULL);\n  pthread_detach(h);\n}\n\n// Create working threads.\nstatic void CreateThread(int num) {\n  pthread_t h;\n  for (int i = 0; i < num; ++i) {\n    pthread_create(&h, NULL, thread_main, NULL);\n    pthread_detach(h);\n  }\n}\n\n// Callback when minidump written.\nstatic bool MinidumpCallback(const char *dump_path,\n                             const char *minidump_id,\n                             void *context,\n                             bool succeeded) {\n  int index = reinterpret_cast<int>(context);\n  if (index == 0) {\n    should_exit = true;\n    return true;\n  }\n  // Don't process it.\n  return false;\n}\n\nint main(int argc, char *argv[]) {\n  int handler_index = 1;\n  ExceptionHandler handler_ignore(\".\", NULL, MinidumpCallback,\n                                  (void*)handler_index, true);\n  CreateCrashThread();\n  CreateThread(10);\n\n  while (true)\n    sleep(20);\n  should_exit = true;\n\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/solaris/handler/minidump_generator.cc",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Alfred Peng\n\n#include <fcntl.h>\n#include <sys/frame.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <sys/utsname.h>\n#include <sys/wait.h>\n#include <unistd.h>\n\n#include <cstdlib>\n#include <ctime>\n\n#include \"client/solaris/handler/minidump_generator.h\"\n#include \"client/minidump_file_writer-inl.h\"\n#include \"common/solaris/file_id.h\"\n\nnamespace {\n\nusing namespace google_breakpad;\n\n// Argument for the writer function.\nstruct WriterArgument {\n  MinidumpFileWriter *minidump_writer;\n\n  // Pid of the lwp who called WriteMinidumpToFile\n  int requester_pid;\n\n  // The stack bottom of the lwp which caused the dump.\n  // Mainly used to find the lwp id of the crashed lwp since signal\n  // handler may not be called in the lwp who caused it.\n  uintptr_t crashed_stack_bottom;\n\n  // Id of the crashing lwp.\n  int crashed_lwpid;\n\n  // Signal number when crash happened. Can be 0 if this is a requested dump.\n  int signo;\n\n  // The ebp of the signal handler frame on x86.  Can be 0 if this is a\n  // requested dump.\n  uintptr_t sighandler_ebp;\n\n  // User context when crash happens. Can be NULL if this is a requested dump.\n  // This is actually an out parameter, but it will be filled in at the start\n  // of the writer LWP.\n  ucontext_t *sig_ctx;\n\n  // Used to get information about the lwps.\n  SolarisLwp *lwp_lister;\n};\n\n// Holding context information for the callback of finding the crashing lwp.\nstruct FindCrashLwpContext {\n  const SolarisLwp *lwp_lister;\n  uintptr_t crashing_stack_bottom;\n  int crashing_lwpid;\n\n  FindCrashLwpContext() :\n    lwp_lister(NULL),\n    crashing_stack_bottom(0UL),\n    crashing_lwpid(-1) {\n  }\n};\n\n// Callback for list lwps.\n// It will compare the stack bottom of the provided lwp with the stack\n// bottom of the crashed lwp, it they are eqaul, this lwp is the one\n// who crashed.\nbool IsLwpCrashedCallback(lwpstatus_t *lsp, void *context) {\n  FindCrashLwpContext *crashing_context =\n    static_cast<FindCrashLwpContext *>(context);\n  const SolarisLwp *lwp_lister = crashing_context->lwp_lister;\n  const prgregset_t *gregs = &(lsp->pr_reg);\n#if TARGET_CPU_SPARC\n  uintptr_t last_ebp = (*gregs)[R_FP];\n#elif TARGET_CPU_X86\n  uintptr_t last_ebp = (*gregs)[EBP];\n#endif\n  uintptr_t stack_bottom = lwp_lister->GetLwpStackBottom(last_ebp);\n  if (stack_bottom > last_ebp &&\n      stack_bottom == crashing_context->crashing_stack_bottom) {\n    // Got it. Stop iteration.\n    crashing_context->crashing_lwpid = lsp->pr_lwpid;\n    return false;\n  }\n\n  return true;\n}\n\n// Find the crashing lwpid.\n// This is done based on stack bottom comparing.\nint FindCrashingLwp(uintptr_t crashing_stack_bottom,\n                    int requester_pid,\n                    const SolarisLwp *lwp_lister) {\n  FindCrashLwpContext context;\n  context.lwp_lister = lwp_lister;\n  context.crashing_stack_bottom = crashing_stack_bottom;\n  CallbackParam<LwpCallback> callback_param(IsLwpCrashedCallback,\n                                            &context);\n  lwp_lister->Lwp_iter_all(lwp_lister->getpid(), &callback_param);\n  return context.crashing_lwpid;\n}\n\nbool WriteLwpStack(const SolarisLwp *lwp_lister,\n                   uintptr_t last_esp,\n                   UntypedMDRVA *memory,\n                   MDMemoryDescriptor *loc) {\n  uintptr_t stack_bottom = lwp_lister->GetLwpStackBottom(last_esp);\n  if (stack_bottom >= last_esp) {\n    int size = stack_bottom - last_esp;\n    if (size > 0) {\n      if (!memory->Allocate(size))\n        return false;\n      memory->Copy(reinterpret_cast<void *>(last_esp), size);\n      loc->start_of_memory_range = last_esp;\n      loc->memory = memory->location();\n    }\n    return true;\n  }\n  return false;\n}\n\n#if TARGET_CPU_SPARC\nbool WriteContext(MDRawContextSPARC *context, ucontext_t *sig_ctx) {\n  assert(sig_ctx != NULL);\n  int* regs = sig_ctx->uc_mcontext.gregs;\n  context->context_flags = MD_CONTEXT_SPARC_FULL;\n\n  context->ccr = (unsigned int)(regs[0]);\n  context->pc = (unsigned int)(regs[REG_PC]);\n  context->npc = (unsigned int)(regs[REG_nPC]);\n  context->y = (unsigned int)(regs[REG_Y]);\n  context->asi = (unsigned int)(regs[19]);\n  context->fprs = (unsigned int)(regs[20]);\n\n  for ( int i = 0 ; i < 32; ++i ) {\n    context->g_r[i] = 0;\n  }\n\n  for ( int i = 1 ; i < 16; ++i ) {\n    context->g_r[i] = (uintptr_t)(sig_ctx->uc_mcontext.gregs[i + 3]);\n  }\n  context->g_r[30] = (uintptr_t)(((struct frame *)context->g_r[14])->fr_savfp);\n\n  return true;\n}\n\nbool WriteContext(MDRawContextSPARC *context, prgregset_t regs,\n                  prfpregset_t *fp_regs) {\n  if (!context || !regs)\n    return false;\n\n  context->context_flags = MD_CONTEXT_SPARC_FULL;\n\n  context->ccr = (uintptr_t)(regs[32]);\n  context->pc = (uintptr_t)(regs[R_PC]);\n  context->npc = (uintptr_t)(regs[R_nPC]);\n  context->y = (uintptr_t)(regs[R_Y]);\n  context->asi = (uintptr_t)(regs[36]);\n  context->fprs = (uintptr_t)(regs[37]);\n  for ( int i = 0 ; i < 32 ; ++i ){\n    context->g_r[i] = (uintptr_t)(regs[i]);\n  }\n\n  return true;\n}\n#elif TARGET_CPU_X86\nbool WriteContext(MDRawContextX86 *context, prgregset_t regs,\n                  prfpregset_t *fp_regs) {\n  if (!context || !regs)\n    return false;\n\n  context->context_flags = MD_CONTEXT_X86_FULL;\n\n  context->cs = regs[CS];\n  context->ds = regs[DS];\n  context->es = regs[ES];\n  context->fs = regs[FS];\n  context->gs = regs[GS];\n  context->ss = regs[SS];\n  context->edi = regs[EDI];\n  context->esi = regs[ESI];\n  context->ebx = regs[EBX];\n  context->edx = regs[EDX];\n  context->ecx = regs[ECX];\n  context->eax = regs[EAX];\n  context->ebp = regs[EBP];\n  context->eip = regs[EIP];\n  context->esp = regs[UESP];\n  context->eflags = regs[EFL];\n\n  return true;\n}\n#endif /* TARGET_CPU_XXX */\n\n// Write information about a crashed Lwp.\n// When a lwp crash, kernel will write something on the stack for processing\n// signal. This makes the current stack not reliable, and our stack walker\n// won't figure out the whole call stack for this. So we write the stack at the\n// time of the crash into the minidump file, not the current stack.\nbool WriteCrashedLwpStream(MinidumpFileWriter *minidump_writer,\n                           const WriterArgument *writer_args,\n                           const lwpstatus_t *lsp,\n                           MDRawThread *lwp) {\n  assert(writer_args->sig_ctx != NULL);\n\n  lwp->thread_id = lsp->pr_lwpid;\n\n#if TARGET_CPU_SPARC\n  UntypedMDRVA memory(minidump_writer);\n  if (!WriteLwpStack(writer_args->lwp_lister,\n                     writer_args->sig_ctx->uc_mcontext.gregs[REG_O6],\n                     &memory,\n                     &lwp->stack))\n    return false;\n\n  TypedMDRVA<MDRawContextSPARC> context(minidump_writer);\n  if (!context.Allocate())\n    return false;\n  lwp->thread_context = context.location();\n  memset(context.get(), 0, sizeof(MDRawContextSPARC));\n  return WriteContext(context.get(), writer_args->sig_ctx);\n#elif TARGET_CPU_X86\n  UntypedMDRVA memory(minidump_writer);\n  if (!WriteLwpStack(writer_args->lwp_lister,\n                     writer_args->sig_ctx->uc_mcontext.gregs[UESP],\n                     &memory,\n                     &lwp->stack))\n    return false;\n\n  TypedMDRVA<MDRawContextX86> context(minidump_writer);\n  if (!context.Allocate())\n    return false;\n  lwp->thread_context = context.location();\n  memset(context.get(), 0, sizeof(MDRawContextX86));\n  return WriteContext(context.get(),\n                      (int *)&writer_args->sig_ctx->uc_mcontext.gregs,\n                      &writer_args->sig_ctx->uc_mcontext.fpregs);\n#endif\n}\n\nbool WriteLwpStream(MinidumpFileWriter *minidump_writer,\n                    const SolarisLwp *lwp_lister,\n                    const lwpstatus_t *lsp, MDRawThread *lwp) {\n  prfpregset_t fp_regs = lsp->pr_fpreg;\n  const prgregset_t *gregs = &(lsp->pr_reg);\n  UntypedMDRVA memory(minidump_writer);\n#if TARGET_CPU_SPARC\n  if (!WriteLwpStack(lwp_lister,\n                     (*gregs)[R_SP],\n                     &memory,\n                     &lwp->stack))\n    return false;\n\n  // Write context\n  TypedMDRVA<MDRawContextSPARC> context(minidump_writer);\n  if (!context.Allocate())\n    return false;\n  // should be the thread_id\n  lwp->thread_id = lsp->pr_lwpid;\n  lwp->thread_context = context.location();\n  memset(context.get(), 0, sizeof(MDRawContextSPARC));\n#elif TARGET_CPU_X86\n  if (!WriteLwpStack(lwp_lister,\n                     (*gregs)[UESP],\n                     &memory,\n                     &lwp->stack))\n  return false;\n\n  // Write context\n  TypedMDRVA<MDRawContextX86> context(minidump_writer);\n  if (!context.Allocate())\n    return false;\n  // should be the thread_id\n  lwp->thread_id = lsp->pr_lwpid;\n  lwp->thread_context = context.location();\n  memset(context.get(), 0, sizeof(MDRawContextX86));\n#endif /* TARGET_CPU_XXX */\n  return WriteContext(context.get(), (int *)gregs, &fp_regs);\n}\n\nbool WriteCPUInformation(MDRawSystemInfo *sys_info) {\n  struct utsname uts;\n  char *major, *minor, *build;\n\n  sys_info->number_of_processors = sysconf(_SC_NPROCESSORS_CONF);\n  sys_info->processor_architecture = MD_CPU_ARCHITECTURE_UNKNOWN;\n  if (uname(&uts) != -1) {\n    // Match \"i86pc\" as X86 architecture.\n    if (strcmp(uts.machine, \"i86pc\") == 0)\n      sys_info->processor_architecture = MD_CPU_ARCHITECTURE_X86;\n    else if (strcmp(uts.machine, \"sun4u\") == 0)\n      sys_info->processor_architecture = MD_CPU_ARCHITECTURE_SPARC;\n  }\n\n  major = uts.release;\n  minor = strchr(major, '.');\n  *minor = '\\0';\n  ++minor;\n  sys_info->major_version = atoi(major);\n  sys_info->minor_version = atoi(minor);\n\n  build = strchr(uts.version, '_');\n  ++build;\n  sys_info->build_number = atoi(build);\n  \n  return true;\n}\n\nbool WriteOSInformation(MinidumpFileWriter *minidump_writer,\n                        MDRawSystemInfo *sys_info) {\n  sys_info->platform_id = MD_OS_SOLARIS;\n\n  struct utsname uts;\n  if (uname(&uts) != -1) {\n    char os_version[512];\n    size_t space_left = sizeof(os_version);\n    memset(os_version, 0, space_left);\n    const char *os_info_table[] = {\n      uts.sysname,\n      uts.release,\n      uts.version,\n      uts.machine,\n      \"OpenSolaris\",\n      NULL\n    };\n    for (const char **cur_os_info = os_info_table;\n         *cur_os_info != NULL;\n         ++cur_os_info) {\n      if (cur_os_info != os_info_table && space_left > 1) {\n        strcat(os_version, \" \");\n        --space_left;\n      }\n      if (space_left > strlen(*cur_os_info)) {\n        strcat(os_version, *cur_os_info);\n        space_left -= strlen(*cur_os_info);\n      } else {\n        break;\n      }\n    }\n\n    MDLocationDescriptor location;\n    if (!minidump_writer->WriteString(os_version, 0, &location))\n      return false;\n    sys_info->csd_version_rva = location.rva;\n  }\n  return true;\n}\n\n// Callback context for get writting lwp information.\nstruct LwpInfoCallbackCtx {\n  MinidumpFileWriter *minidump_writer;\n  const WriterArgument *writer_args;\n  TypedMDRVA<MDRawThreadList> *list;\n  int lwp_index;\n};\n\nbool LwpInformationCallback(lwpstatus_t *lsp, void *context) {\n  bool success = true;\n  LwpInfoCallbackCtx *callback_context =\n    static_cast<LwpInfoCallbackCtx *>(context);\n\n  // The current lwp is the one to handle the crash. Ignore it.\n  if (lsp->pr_lwpid != pthread_self()) {\n    LwpInfoCallbackCtx *callback_context =\n      static_cast<LwpInfoCallbackCtx *>(context);\n    MDRawThread lwp;\n    memset(&lwp, 0, sizeof(MDRawThread));\n\n    if (lsp->pr_lwpid != callback_context->writer_args->crashed_lwpid ||\n        callback_context->writer_args->sig_ctx == NULL) {\n      success = WriteLwpStream(callback_context->minidump_writer,\n                               callback_context->writer_args->lwp_lister,\n                               lsp, &lwp);\n    } else {\n      success = WriteCrashedLwpStream(callback_context->minidump_writer,\n                                      callback_context->writer_args,\n                                      lsp, &lwp);\n    }\n    if (success) {\n      callback_context->list->CopyIndexAfterObject(\n          callback_context->lwp_index++,\n          &lwp, sizeof(MDRawThread));\n    }\n  }\n\n  return success;\n}\n\nbool WriteLwpListStream(MinidumpFileWriter *minidump_writer,\n                        const WriterArgument *writer_args,\n                        MDRawDirectory *dir) {\n  // Get the lwp information.\n  const SolarisLwp *lwp_lister = writer_args->lwp_lister;\n  int lwp_count = lwp_lister->GetLwpCount();\n  if (lwp_count < 0)\n    return false;\n  TypedMDRVA<MDRawThreadList> list(minidump_writer);\n  if (!list.AllocateObjectAndArray(lwp_count - 1, sizeof(MDRawThread)))\n    return false;\n  dir->stream_type = MD_THREAD_LIST_STREAM;\n  dir->location = list.location();\n  list.get()->number_of_threads = lwp_count - 1;\n\n  LwpInfoCallbackCtx context;\n  context.minidump_writer = minidump_writer;\n  context.writer_args = writer_args;\n  context.list = &list;\n  context.lwp_index = 0;\n  CallbackParam<LwpCallback> callback_param(LwpInformationCallback,\n                                            &context);\n  int written =\n    lwp_lister->Lwp_iter_all(lwp_lister->getpid(), &callback_param);\n  return written == lwp_count;\n}\n\nbool WriteCVRecord(MinidumpFileWriter *minidump_writer,\n                   MDRawModule *module,\n                   const char *module_path,\n                   char *realname) {\n  TypedMDRVA<MDCVInfoPDB70> cv(minidump_writer);\n\n  char path[PATH_MAX];\n  const char *module_name = module_path ? module_path : \"<Unknown>\";\n  snprintf(path, sizeof(path), \"/proc/self/object/%s\", module_name);\n\n  size_t module_name_length = strlen(realname);\n  if (!cv.AllocateObjectAndArray(module_name_length + 1, sizeof(u_int8_t)))\n    return false;\n  if (!cv.CopyIndexAfterObject(0, realname, module_name_length))\n    return false;\n\n  module->cv_record = cv.location();\n  MDCVInfoPDB70 *cv_ptr = cv.get();\n  memset(cv_ptr, 0, sizeof(MDCVInfoPDB70));\n  cv_ptr->cv_signature = MD_CVINFOPDB70_SIGNATURE;\n  cv_ptr->age = 0;\n\n  // Get the module identifier\n  FileID file_id(path);\n  unsigned char identifier[16];\n\n  if (file_id.ElfFileIdentifier(identifier)) {\n    cv_ptr->signature.data1 = (uint32_t)identifier[0] << 24 |\n      (uint32_t)identifier[1] << 16 | (uint32_t)identifier[2] << 8 |\n      (uint32_t)identifier[3];\n    cv_ptr->signature.data2 = (uint32_t)identifier[4] << 8 | identifier[5];\n    cv_ptr->signature.data3 = (uint32_t)identifier[6] << 8 | identifier[7];\n    cv_ptr->signature.data4[0] = identifier[8];\n    cv_ptr->signature.data4[1] = identifier[9];\n    cv_ptr->signature.data4[2] = identifier[10];\n    cv_ptr->signature.data4[3] = identifier[11];\n    cv_ptr->signature.data4[4] = identifier[12];\n    cv_ptr->signature.data4[5] = identifier[13];\n    cv_ptr->signature.data4[6] = identifier[14];\n    cv_ptr->signature.data4[7] = identifier[15];\n  }\n  return true;\n}\n\nstruct ModuleInfoCallbackCtx {\n  MinidumpFileWriter *minidump_writer;\n  const WriterArgument *writer_args;\n  TypedMDRVA<MDRawModuleList> *list;\n  int module_index;\n};\n\nbool ModuleInfoCallback(const ModuleInfo &module_info, void *context) {\n  ModuleInfoCallbackCtx *callback_context =\n    static_cast<ModuleInfoCallbackCtx *>(context);\n  // Skip those modules without name, or those that are not modules.\n  if (strlen(module_info.name) == 0)\n    return true;\n\n  MDRawModule module;\n  memset(&module, 0, sizeof(module));\n  MDLocationDescriptor loc;\n  char path[PATH_MAX];\n  char buf[PATH_MAX];\n  char *realname;\n  int count;\n\n  snprintf(path, sizeof (path), \"/proc/self/path/%s\", module_info.name);\n  if ((count = readlink(path, buf, PATH_MAX)) < 0)\n    return false;\n  buf[count] = '\\0';\n\n  if ((realname = strrchr(buf, '/')) == NULL)\n    return false;\n  realname++;\n\n  if (!callback_context->minidump_writer->WriteString(realname, 0, &loc))\n    return false;\n\n  module.base_of_image = (u_int64_t)module_info.start_addr;\n  module.size_of_image = module_info.size;\n  module.module_name_rva = loc.rva;\n\n  if (!WriteCVRecord(callback_context->minidump_writer, &module,\n                     module_info.name, realname))\n    return false;\n\n  callback_context->list->CopyIndexAfterObject(\n      callback_context->module_index++, &module, MD_MODULE_SIZE);\n  return true;\n}\n\nbool WriteModuleListStream(MinidumpFileWriter *minidump_writer,\n                           const WriterArgument *writer_args,\n                           MDRawDirectory *dir) {\n  TypedMDRVA<MDRawModuleList> list(minidump_writer);\n  int module_count = writer_args->lwp_lister->GetModuleCount();\n\n  if (module_count <= 0 ||\n      !list.AllocateObjectAndArray(module_count, MD_MODULE_SIZE)) {\n    return false;\n  }\n\n  dir->stream_type = MD_MODULE_LIST_STREAM;\n  dir->location = list.location();\n  list.get()->number_of_modules = module_count;\n  ModuleInfoCallbackCtx context;\n  context.minidump_writer = minidump_writer;\n  context.writer_args = writer_args;\n  context.list = &list;\n  context.module_index = 0;\n  CallbackParam<ModuleCallback> callback(ModuleInfoCallback, &context);\n  return writer_args->lwp_lister->ListModules(&callback) == module_count;\n}\n\nbool WriteSystemInfoStream(MinidumpFileWriter *minidump_writer,\n                           const WriterArgument *writer_args,\n                           MDRawDirectory *dir) {\n  TypedMDRVA<MDRawSystemInfo> sys_info(minidump_writer);\n\n  if (!sys_info.Allocate())\n    return false;\n\n  dir->stream_type = MD_SYSTEM_INFO_STREAM;\n  dir->location = sys_info.location();\n\n  return WriteCPUInformation(sys_info.get()) &&\n         WriteOSInformation(minidump_writer, sys_info.get());\n}\n\nbool WriteExceptionStream(MinidumpFileWriter *minidump_writer,\n                          const WriterArgument *writer_args,\n                          MDRawDirectory *dir) {\n  // This happenes when this is not a crash, but a requested dump.\n  if (writer_args->sig_ctx == NULL)\n    return false;\n\n  TypedMDRVA<MDRawExceptionStream> exception(minidump_writer);\n  if (!exception.Allocate())\n    return false;\n\n  dir->stream_type = MD_EXCEPTION_STREAM;\n  dir->location = exception.location();\n  exception.get()->thread_id = writer_args->crashed_lwpid;\n  exception.get()->exception_record.exception_code = writer_args->signo;\n  exception.get()->exception_record.exception_flags = 0;\n\n#if TARGET_CPU_SPARC\n  if (writer_args->sig_ctx != NULL) {\n    exception.get()->exception_record.exception_address = \n      writer_args->sig_ctx->uc_mcontext.gregs[REG_PC];\n  } else {\n    return true;\n  }\n\n  // Write context of the exception.\n  TypedMDRVA<MDRawContextSPARC> context(minidump_writer);\n  if (!context.Allocate())\n    return false;\n  exception.get()->thread_context = context.location();\n  memset(context.get(), 0, sizeof(MDRawContextSPARC));\n  return WriteContext(context.get(), writer_args->sig_ctx);\n#elif TARGET_CPU_X86\n  if (writer_args->sig_ctx != NULL) {\n    exception.get()->exception_record.exception_address =\n      writer_args->sig_ctx->uc_mcontext.gregs[EIP];\n  } else {\n    return true;\n  }\n\n  // Write context of the exception.\n  TypedMDRVA<MDRawContextX86> context(minidump_writer);\n  if (!context.Allocate())\n    return false;\n  exception.get()->thread_context = context.location();\n  memset(context.get(), 0, sizeof(MDRawContextX86));\n  return WriteContext(context.get(),\n                      (int *)&writer_args->sig_ctx->uc_mcontext.gregs,\n                      NULL);\n#endif\n}\n\nbool WriteMiscInfoStream(MinidumpFileWriter *minidump_writer,\n                         const WriterArgument *writer_args,\n                         MDRawDirectory *dir) {\n  TypedMDRVA<MDRawMiscInfo> info(minidump_writer);\n\n  if (!info.Allocate())\n    return false;\n\n  dir->stream_type = MD_MISC_INFO_STREAM;\n  dir->location = info.location();\n  info.get()->size_of_info = sizeof(MDRawMiscInfo);\n  info.get()->flags1 = MD_MISCINFO_FLAGS1_PROCESS_ID;\n  info.get()->process_id = writer_args->requester_pid;\n\n  return true;\n}\n\nbool WriteBreakpadInfoStream(MinidumpFileWriter *minidump_writer,\n                             const WriterArgument *writer_args,\n                             MDRawDirectory *dir) {\n  TypedMDRVA<MDRawBreakpadInfo> info(minidump_writer);\n\n  if (!info.Allocate())\n    return false;\n\n  dir->stream_type = MD_BREAKPAD_INFO_STREAM;\n  dir->location = info.location();\n\n  info.get()->validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID |\n                         MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID;\n  info.get()->dump_thread_id = getpid();\n  info.get()->requesting_thread_id = writer_args->requester_pid;\n  return true;\n}\n\nclass AutoLwpResumer {\n public:\n  AutoLwpResumer(SolarisLwp *lwp) : lwp_(lwp) {}\n  ~AutoLwpResumer() { lwp_->ControlAllLwps(false); }\n private:\n  SolarisLwp *lwp_;\n};\n\n// Prototype of writer functions.\ntypedef bool (*WriteStreamFN)(MinidumpFileWriter *,\n                              const WriterArgument *,\n                              MDRawDirectory *);\n\n// Function table to writer a full minidump.\nconst WriteStreamFN writers[] = {\n  WriteLwpListStream,\n  WriteModuleListStream,\n  WriteSystemInfoStream,\n  WriteExceptionStream,\n  WriteMiscInfoStream,\n  WriteBreakpadInfoStream,\n};\n\n// Will call each writer function in the writers table.\n//void* MinidumpGenerator::Write(void *argument) {\nvoid* Write(void *argument) {\n  WriterArgument *writer_args = static_cast<WriterArgument *>(argument);\n\n  if (!writer_args->lwp_lister->ControlAllLwps(true))\n    return NULL;\n\n  AutoLwpResumer lwpResumer(writer_args->lwp_lister);\n\n  if (writer_args->sighandler_ebp != 0 &&\n      writer_args->lwp_lister->FindSigContext(writer_args->sighandler_ebp,\n                                              &writer_args->sig_ctx)) {\n    writer_args->crashed_stack_bottom = \n      writer_args->lwp_lister->GetLwpStackBottom(\n#if TARGET_CPU_SPARC\n          writer_args->sig_ctx->uc_mcontext.gregs[REG_O6]\n#elif TARGET_CPU_X86\n          writer_args->sig_ctx->uc_mcontext.gregs[UESP]\n#endif\n      );\n\n    int crashed_lwpid = FindCrashingLwp(writer_args->crashed_stack_bottom,\n                                        writer_args->requester_pid,\n                                        writer_args->lwp_lister);\n    if (crashed_lwpid > 0)\n      writer_args->crashed_lwpid = crashed_lwpid;\n  }\n\n  MinidumpFileWriter *minidump_writer = writer_args->minidump_writer;\n  TypedMDRVA<MDRawHeader> header(minidump_writer);\n  TypedMDRVA<MDRawDirectory> dir(minidump_writer);\n  if (!header.Allocate())\n    return 0;\n\n  int writer_count = sizeof(writers) / sizeof(writers[0]);\n  // Need directory space for all writers.\n  if (!dir.AllocateArray(writer_count))\n    return 0;\n  header.get()->signature = MD_HEADER_SIGNATURE;\n  header.get()->version = MD_HEADER_VERSION;\n  header.get()->time_date_stamp = time(NULL);\n  header.get()->stream_count = writer_count;\n  header.get()->stream_directory_rva = dir.position();\n\n  int dir_index = 0;\n  MDRawDirectory local_dir;\n  for (int i = 0; i < writer_count; ++i) {\n    if ((*writers[i])(minidump_writer, writer_args, &local_dir))\n      dir.CopyIndex(dir_index++, &local_dir);\n  }\n\n  return 0;\n}\n\n}  // namespace\n\nnamespace google_breakpad {\n\nMinidumpGenerator::MinidumpGenerator() {\n}\n\nMinidumpGenerator::~MinidumpGenerator() {\n}\n\n// Write minidump into file.\n// It runs in a different thread from the crashing thread.\nbool MinidumpGenerator::WriteMinidumpToFile(const char *file_pathname,\n                                            int signo,\n                                            uintptr_t sighandler_ebp,\n                                            ucontext_t **sig_ctx) const {\n  // The exception handler thread.\n  pthread_t handler_thread;\n\n  assert(file_pathname != NULL);\n\n  if (file_pathname == NULL)\n    return false;\n\n  MinidumpFileWriter minidump_writer;\n  if (minidump_writer.Open(file_pathname)) {\n    WriterArgument argument;\n    memset(&argument, 0, sizeof(argument));\n    SolarisLwp lwp_lister(getpid());\n    argument.lwp_lister = &lwp_lister;\n    argument.minidump_writer = &minidump_writer;\n    argument.requester_pid = getpid();\n    argument.crashed_lwpid = pthread_self();\n    argument.signo = signo;\n    argument.sighandler_ebp = sighandler_ebp;\n    argument.sig_ctx = NULL;\n\n    pthread_create(&handler_thread, NULL, Write, (void *)&argument);\n    pthread_join(handler_thread, NULL);\n    return true;\n  }\n\n  return false;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/solaris/handler/minidump_generator.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Alfred Peng\n\n#ifndef CLIENT_SOLARIS_HANDLER_MINIDUMP_GENERATOR_H__\n#define CLIENT_SOLARIS_HANDLER_MINIDUMP_GENERATOR_H__\n\n#include <ucontext.h>\n\n#include \"client/minidump_file_writer.h\"\n#include \"client/solaris/handler/solaris_lwp.h\"\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n\nnamespace google_breakpad {\n\n//\n// MinidumpGenerator\n//\n// A minidump generator should be created before any exception happen.\n//\nclass MinidumpGenerator {\n  // Callback run for writing lwp information in the process.\n  friend bool LwpInformationCallback(lwpstatus_t *lsp, void *context);\n\n  // Callback run for writing module information in the process.\n  friend bool ModuleInfoCallback(const ModuleInfo &module_info, void *context);\n\n public:\n  MinidumpGenerator();\n\n  ~MinidumpGenerator();\n\n  // Write minidump.\n  bool WriteMinidumpToFile(const char *file_pathname,\n                           int signo,\n                           uintptr_t sighandler_ebp,\n                           ucontext_t **sig_ctx) const;\n};\n\n}  // namespace google_breakpad\n\n#endif   // CLIENT_SOLARIS_HANDLER_MINIDUMP_GENERATOR_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/solaris/handler/minidump_test.cc",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Alfred Peng\n\n#include <pthread.h>\n#include <unistd.h>\n\n#include \"client/minidump_file_writer.h\"\n#include \"client/solaris/handler/minidump_generator.h\"\n\nusing std::string;\nusing google_breakpad::MinidumpGenerator;\n\nstatic bool doneWritingReport = false;\n\nstatic void *Reporter(void *) {\n  char buffer[PATH_MAX];\n  MinidumpGenerator md;\n\n  // Write it to the desktop\n  snprintf(buffer, sizeof(buffer), \"./minidump_test.out\");\n  fprintf(stdout, \"Writing %s\\n\", buffer);\n\n  md.WriteMinidumpToFile(buffer, 0, 0, NULL);\n  doneWritingReport = true;\n\n  return NULL;\n}\n\nstatic void SleepyFunction() {\n  while (!doneWritingReport) {\n    usleep(100);\n  }\n}\n\nint main(int argc, char * const argv[]) {\n  pthread_t reporter_thread;\n\n  if (pthread_create(&reporter_thread, NULL, Reporter, NULL) == 0) {\n    pthread_detach(reporter_thread);\n  } else {\n    perror(\"pthread_create\");\n  }\n\n  SleepyFunction();\n\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/solaris/handler/solaris_lwp.cc",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Alfred Peng\n\n#include <dirent.h>\n#include <elf.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <sys/frame.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <sys/wait.h>\n#include <unistd.h>\n\n#include <algorithm>\n#include <cassert>\n#include <cstdio>\n#include <cstdlib>\n#include <functional>\n\n#include \"client/solaris/handler/solaris_lwp.h\"\n#include \"common/solaris/message_output.h\"\n\nusing namespace google_breakpad;\n\n// This unamed namespace contains helper function.\nnamespace {\n\nuintptr_t stack_base_address = 0;\nstatic const int HEADER_MAX = 2000;\nstatic const int MAP_MAX = 1000;\n\n// Context information for the callbacks when validating address by listing\n// modules.\nstruct AddressValidatingContext {\n  uintptr_t address;\n  bool is_mapped;\n\n  AddressValidatingContext() : address(0UL), is_mapped(false) {\n  }\n};\n\n// Convert from string to int.\nstatic bool LocalAtoi(char *s, int *r) {\n  assert(s != NULL);\n  assert(r != NULL);\n  char *endptr = NULL;\n  int ret = strtol(s, &endptr, 10);\n  if (endptr == s)\n    return false;\n  *r = ret;\n  return true;\n}\n\n// Callback invoked for each mapped module.\n// It uses the module's adderss range to validate the address.\nstatic bool AddressNotInModuleCallback(const ModuleInfo &module_info,\n                                       void *context) {\n  AddressValidatingContext *addr =\n    reinterpret_cast<AddressValidatingContext *>(context);\n  if (addr->is_mapped = ((module_info.start_addr > 0) &&\n                         (addr->address >= module_info.start_addr) &&\n                         (addr->address <= module_info.start_addr +\n                          module_info.size))) {\n    stack_base_address = module_info.start_addr + module_info.size;\n  }\n\n  return !addr->is_mapped;\n}\n\nstatic int IterateLwpAll(int pid,\n                         CallbackParam<LwpidCallback> *callback_param) {\n  char lwp_path[40];\n  DIR *dir;\n  int count = 0;\n\n  snprintf(lwp_path, sizeof (lwp_path), \"/proc/%d/lwp\", (int)pid);\n  if ((dir = opendir(lwp_path)) == NULL)\n    return -1;\n\n  struct dirent *entry = NULL;\n  while ((entry = readdir(dir)) != NULL) {\n    if ((strcmp(entry->d_name, \".\") != 0) &&\n        (strcmp(entry->d_name, \"..\") != 0)) {\n      int lwpid = 0;\n      int last_pid = 0;\n      if (LocalAtoi(entry->d_name, &lwpid) && last_pid != lwpid) {\n        last_pid = lwpid;\n        ++count;\n        if (callback_param &&\n            !(callback_param->call_back)(lwpid, callback_param->context)) {\n          break;\n        }\n      }\n    }\n  }\n\n  closedir(dir);\n  return count;\n}\n\n#if defined(__i386) && !defined(NO_FRAME_POINTER)\nvoid *GetNextFrame(void **last_ebp) {\n  void *sp = *last_ebp;\n  if ((unsigned long)sp == (unsigned long)last_ebp)\n    return NULL;\n  if ((unsigned long)sp & (sizeof(void *) - 1))\n    return NULL;\n  if ((unsigned long)sp - (unsigned long)last_ebp > 100000)\n    return NULL;\n  return sp;\n}\n#elif defined(__sparc)\nvoid *GetNextFrame(void *last_ebp) {\n  return reinterpret_cast<struct frame *>(last_ebp)->fr_savfp;\n}\n#else\nvoid *GetNextFrame(void **last_ebp) {\n  return reinterpret_cast<void*>(last_ebp);\n}\n#endif\n\n\nclass AutoCloser {\n public:\n  AutoCloser(int fd) : fd_(fd) {}\n  ~AutoCloser() { if (fd_) close(fd_); }\n private:\n  int fd_;\n};\n\n// Control the execution of the lwp.\n// Suspend/Resume lwp based on the value of context.\nstatic bool ControlLwp(int lwpid, void *context) {\n  // The current thread is the one to handle the crash. Ignore it.\n  if (lwpid != pthread_self()) {\n    int ctlfd;\n    char procname[PATH_MAX];\n    bool suspend = *(bool *)context;\n\n    // Open the /proc/$pid/lwp/$lwpid/lwpctl files\n    snprintf(procname, sizeof (procname), \"/proc/self/lwp/%d/lwpctl\", lwpid);\n\n    if ((ctlfd = open(procname, O_WRONLY|O_EXCL)) < 0) {\n      print_message2(2, \"failed to open %s in ControlLwp\\n\", procname);\n      return false;\n    }\n\n    AutoCloser autocloser(ctlfd);\n\n    long ctl[2];\n    ctl[0] = suspend ? PCSTOP : PCRUN;\n    ctl[1] = 0;\n    if (write(ctlfd, ctl, sizeof (ctl)) != sizeof (ctl)) {\n      print_message2(2, \"failed in lwp %d\\n\", lwpid);\n      return false;\n    }\n  }\n\n  return true;\n}\n\n/*\n * Utility function to read the contents of a file that contains a\n * prheader_t at the start (/proc/$pid/lstatus or /proc/$pid/lpsinfo).\n * Return true on success.\n */\nstatic bool read_lfile(int pid, const char *lname, prheader_t *lhp) {\n  char lpath[PATH_MAX];\n  struct stat statb;\n  int fd;\n  size_t size;\n\n  snprintf(lpath, sizeof (lpath), \"/proc/%d/%s\", pid, lname);\n  if ((fd = open(lpath, O_RDONLY)) < 0) {\n    print_message2(2, \"failed to open %s in read_lfile\\n\", lpath);\n    return false;\n  }\n\n  AutoCloser autocloser(fd);\n\n  if (fstat(fd, &statb) != 0)\n    return false;\n\n  size = statb.st_size;\n  if ((size / sizeof (prheader_t)) + 32 > HEADER_MAX) {\n    print_message1(2, \"map size overflow\\n\");\n    return false;\n  }\n\n  if (pread(fd, lhp, size, 0) <= sizeof (prheader_t))\n    return false;\n\n  return true;\n}\n\n}  // namespace\n\nnamespace google_breakpad {\n\nSolarisLwp::SolarisLwp(int pid) : pid_(pid) {\n}\n\nSolarisLwp::~SolarisLwp() {\n}\n\nint SolarisLwp::ControlAllLwps(bool suspend) {\n  CallbackParam<LwpidCallback> callback_param(ControlLwp, &suspend);\n  return IterateLwpAll(pid_, &callback_param);\n}\n\nint SolarisLwp::GetLwpCount() const {\n  return IterateLwpAll(pid_, NULL);\n}\n\nint SolarisLwp::Lwp_iter_all(int pid,\n                             CallbackParam<LwpCallback> *callback_param) const {\n  lwpstatus_t *Lsp;\n  lwpstatus_t *sp;\n  prheader_t lphp[HEADER_MAX];\n  prheader_t lhp[HEADER_MAX];\n  prheader_t *Lphp = lphp;\n  prheader_t *Lhp = lhp;\n  lwpsinfo_t *Lpsp;\n  long nstat;\n  long ninfo;\n  int rv = 0;\n\n  /*\n   * The /proc/pid/lstatus file has the array of lwpstatus_t's and the\n   * /proc/pid/lpsinfo file has the array of lwpsinfo_t's.\n   */\n  if (read_lfile(pid, \"lstatus\", Lhp) == NULL)\n    return -1;\n  if (read_lfile(pid, \"lpsinfo\", Lphp) == NULL) {\n    return -1;\n  }\n\n  Lsp = (lwpstatus_t *)(uintptr_t)(Lhp + 1);\n  Lpsp = (lwpsinfo_t *)(uintptr_t)(Lphp + 1);\n\n  for (ninfo = Lphp->pr_nent; ninfo != 0; --ninfo) {\n    if (Lpsp->pr_sname != 'Z') {\n      sp = Lsp;\n      Lsp = (lwpstatus_t *)((uintptr_t)Lsp + Lhp->pr_entsize);\n    } else {\n      sp = NULL;\n    }\n    if (callback_param &&\n        !(callback_param->call_back)(sp, callback_param->context))\n      break;\n    ++rv;\n    Lpsp = (lwpsinfo_t *)((uintptr_t)Lpsp + Lphp->pr_entsize);\n  }\n\n  return rv;\n}\n\nuintptr_t SolarisLwp::GetLwpStackBottom(uintptr_t current_esp) const {\n  AddressValidatingContext addr;\n  addr.address = current_esp;\n  CallbackParam<ModuleCallback> callback_param(AddressNotInModuleCallback,\n                                               &addr);\n  ListModules(&callback_param);\n  return stack_base_address;\n}\n\nint SolarisLwp::GetModuleCount() const {\n  return ListModules(NULL);\n}\n\nint SolarisLwp::ListModules(\n    CallbackParam<ModuleCallback> *callback_param) const {\n  const char *maps_path = \"/proc/self/map\";\n  struct stat status;\n  int fd = 0, num;\n  prmap_t map_array[MAP_MAX];\n  prmap_t *maps = map_array;\n  size_t size;\n\n  if ((fd = open(maps_path, O_RDONLY)) == -1) {\n    print_message2(2, \"failed to open %s in ListModules\\n\", maps_path);\n    return -1;\n  }\n\n  AutoCloser autocloser(fd);\n\n  if (fstat(fd, &status))\n    return -1;\n\n  /*\n   * Determine number of mappings, this value must be \n   * larger than the actual module count\n   */\n  size = status.st_size;\n  if ((num = (int)(size / sizeof (prmap_t))) > MAP_MAX) {\n    print_message1(2, \"map size overflow\\n\");\n    return -1;\n  }\n\n  if (read(fd, (void *)maps, size) < 0) {\n    print_message2(2, \"failed to read %d\\n\", fd);\n    return -1;\n  }\n\n  prmap_t *_maps;\n  int _num;\n  int module_count = 0;\n  \n  /*\n   * Scan each mapping - note it is assummed that the mappings are\n   * presented in order.  We fill holes between mappings.  On intel\n   * the last mapping is usually the data segment of ld.so.1, after\n   * this comes a red zone into which non-fixed mapping won't get\n   * place.  Thus we can simply bail from the loop after seeing the\n   * last mapping.\n   */\n  for (_num = 0, _maps = maps; _num < num; ++_num, ++_maps) {\n    ModuleInfo module;\n    char *name = _maps->pr_mapname;\n\n    memset(&module, 0, sizeof (module));\n    module.start_addr = _maps->pr_vaddr;\n    module.size = _maps->pr_size;\n    if (strlen(name) > 0) {\n      int objectfd = 0;\n      char path[PATH_MAX];\n      char buf[SELFMAG];\n\n      snprintf(path, sizeof (path), \"/proc/self/object/%s\", name);\n      if ((objectfd = open(path, O_RDONLY)) < 0) {\n        print_message1(2, \"can't open module file\\n\");\n        continue;\n      }\n\n      AutoCloser autocloser(objectfd);\n\n      if (read(objectfd, buf, SELFMAG) != SELFMAG) {\n        print_message1(2, \"can't read module file\\n\");\n        continue;\n      }\n      if (buf[0] != ELFMAG0 || buf[1] != ELFMAG1 ||\n          buf[2] != ELFMAG2 || buf[3] != ELFMAG3) {\n        continue;\n      }\n\n      strncpy(module.name, name, sizeof (module.name) - 1);\n      ++module_count;\n    }\n    if (callback_param &&\n        (!callback_param->call_back(module, callback_param->context))) {\n      break;\n    }\n  }\n\n  return module_count;\n}\n\n// Check if the address is a valid virtual address.\n// If the address is in any of the mapped modules, we take it as valid.\n// Otherwise it is invalid.\nbool SolarisLwp::IsAddressMapped(uintptr_t address) const {\n  AddressValidatingContext addr;\n  addr.address = address;\n  CallbackParam<ModuleCallback> callback_param(AddressNotInModuleCallback,\n                                               &addr);\n  ListModules(&callback_param);\n  return addr.is_mapped;\n}\n\n// We're looking for a ucontext_t as the second parameter\n// to a signal handler function call.  Luckily, the ucontext_t\n// has an ebp(fp on SPARC) member which should match the ebp(fp)\n// pointed to by the ebp(fp) of the signal handler frame.\n// The Solaris stack looks like this:\n// http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libproc/common/Pstack.c#81\nbool SolarisLwp::FindSigContext(uintptr_t sighandler_ebp,\n                                ucontext_t **sig_ctx) {\n  uintptr_t previous_ebp;\n  uintptr_t sig_ebp;\n  const int MAX_STACK_DEPTH = 50;\n  int depth_counter = 0;\n\n  do {\n#if TARGET_CPU_SPARC\n    previous_ebp = reinterpret_cast<uintptr_t>(GetNextFrame(\n                                  reinterpret_cast<void*>(sighandler_ebp)));\n    *sig_ctx = reinterpret_cast<ucontext_t*>(sighandler_ebp + sizeof (struct frame));\n    uintptr_t sig_esp = (*sig_ctx)->uc_mcontext.gregs[REG_O6];\n    if (sig_esp < previous_ebp && sig_esp > sighandler_ebp)\n      sig_ebp = (uintptr_t)(((struct frame *)sig_esp)->fr_savfp);\n\n#elif TARGET_CPU_X86\n    previous_ebp = reinterpret_cast<uintptr_t>(GetNextFrame(\n                                  reinterpret_cast<void**>(sighandler_ebp)));\n    *sig_ctx = reinterpret_cast<ucontext_t*>(sighandler_ebp + sizeof (struct frame) +\n                                             3 * sizeof(uintptr_t));\n    sig_ebp = (*sig_ctx)->uc_mcontext.gregs[EBP];\n#endif\n    sighandler_ebp = previous_ebp;\n    depth_counter++;\n  } while(previous_ebp != sig_ebp && sighandler_ebp != 0 &&\n          IsAddressMapped(sighandler_ebp) && depth_counter < MAX_STACK_DEPTH);\n\n  return previous_ebp == sig_ebp && previous_ebp != 0;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/solaris/handler/solaris_lwp.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Alfred Peng\n\n#ifndef CLIENT_SOLARIS_HANDLER_SOLARIS_LWP_H__\n#define CLIENT_SOLARIS_HANDLER_SOLARIS_LWP_H__\n\n#if defined(sparc) || defined(__sparc)\n#define TARGET_CPU_SPARC 1\n#elif defined(i386) || defined(__i386)\n#define TARGET_CPU_X86 1\n#else\n#error \"cannot determine cpu type\"\n#endif\n\n#include <signal.h>\n#include <stdint.h>\n#include <sys/user.h>\n#include <ucontext.h>\n\n#ifndef _KERNEL\n#define _KERNEL\n#define MUST_UNDEF_KERNEL\n#endif  // _KERNEL\n#include <sys/procfs.h>\n#ifdef MUST_UNDEF_KERNEL\n#undef _KERNEL\n#undef MUST_UNDEF_KERNEL\n#endif  // MUST_UNDEF_KERNEL\n\nnamespace google_breakpad {\n\n// Max module path name length.\nstatic const int kMaxModuleNameLength = 256;\n\n// Holding infomaton about a module in the process.\nstruct ModuleInfo {\n  char name[kMaxModuleNameLength];\n  uintptr_t start_addr;\n  int size;\n};\n\n// A callback to run when getting a lwp in the process.\n// Return true will go on to the next lwp while return false will stop the\n// iteration.\ntypedef bool (*LwpCallback)(lwpstatus_t* lsp, void *context); \n\n// A callback to run when a new module is found in the process.\n// Return true will go on to the next module while return false will stop the\n// iteration.\ntypedef bool (*ModuleCallback)(const ModuleInfo &module_info, void *context);\n\n// A callback to run when getting a lwpid in the process.\n// Return true will go on to the next lwp while return false will stop the\n// iteration.\ntypedef bool (*LwpidCallback)(int lwpid, void *context);\n\n// Holding the callback information.\ntemplate<class CallbackFunc>\nstruct CallbackParam {\n  // Callback function address.\n  CallbackFunc call_back;\n  // Callback context;\n  void *context;\n\n  CallbackParam() : call_back(NULL), context(NULL) {\n  }\n\n  CallbackParam(CallbackFunc func, void *func_context) :\n    call_back(func), context(func_context) {\n  }\n};\n\n///////////////////////////////////////////////////////////////////////////////\n\n//\n// SolarisLwp\n//\n// Provides handy support for operation on Solaris lwps.\n// It uses proc file system to get lwp information.\n//\n// TODO(Alfred): Currently it only supports x86. Add SPARC support.\n//\nclass SolarisLwp {\n public:\n  // Create a SolarisLwp instance to list all the lwps in a process.\n  explicit SolarisLwp(int pid);\n  ~SolarisLwp();\n\n  int getpid() const { return this->pid_; }\n\n  // Control all the lwps in the process.\n  // Return the number of suspended/resumed lwps in the process.\n  // Return -1 means failed to control lwps.\n  int ControlAllLwps(bool suspend);\n\n  // Get the count of lwps in the process.\n  // Return -1 means error.\n  int GetLwpCount() const;\n\n  // Iterate the lwps of process.\n  // Whenever there is a lwp found, the callback will be invoked to process\n  // the information.\n  // Return the callback return value or -1 on error.\n  int Lwp_iter_all(int pid, CallbackParam<LwpCallback> *callback_param) const;\n\n  // Get the module count of the current process.\n  int GetModuleCount() const;\n\n  // Get the mapped modules in the address space.\n  // Whenever a module is found, the callback will be invoked to process the\n  // information.\n  // Return how may modules are found.\n  int ListModules(CallbackParam<ModuleCallback> *callback_param) const;\n\n  // Get the bottom of the stack from esp.\n  uintptr_t GetLwpStackBottom(uintptr_t current_esp) const;\n\n  // Finds a signal context on the stack given the ebp of our signal handler.\n  bool FindSigContext(uintptr_t sighandler_ebp, ucontext_t **sig_ctx);\n\n private:\n  // Check if the address is a valid virtual address.\n  bool IsAddressMapped(uintptr_t address) const;\n\n private:\n  // The pid of the process we are listing lwps.\n  int pid_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_SOLARIS_HANDLER_SOLARIS_LWP_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/breakpad_client.gyp",
    "content": "# Copyright (c) 2010, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n{\n  'includes': [\n    'build/common.gypi',\n  ],\n  'targets': [\n    {\n      'target_name': 'build_all',\n      'type': 'none',\n      'dependencies': [\n        './crash_generation/crash_generation.gyp:*',\n        './handler/exception_handler.gyp:*',\n        './sender/crash_report_sender.gyp:*',\n        './unittests/client_tests.gyp:*',\n        './unittests/testing.gyp:*',\n        './tests/crash_generation_app/crash_generation_app.gyp:*',\n      ]\n    },\n    {\n      'target_name': 'common',\n      'type': 'static_library',\n      'include_dirs': [\n        '<(DEPTH)',\n      ],\n      'direct_dependent_settings': {\n        'include_dirs': [\n          '<(DEPTH)',\n        ]\n      },\n      'sources': [\n        '<(DEPTH)/common/windows/guid_string.cc',\n        '<(DEPTH)/common/windows/guid_string.h',\n        '<(DEPTH)/common/windows/http_upload.cc',\n        '<(DEPTH)/common/windows/http_upload.h',\n        '<(DEPTH)/common/windows/string_utils.cc',\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/common/auto_critical_section.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__\n#define CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__\n\n#include <Windows.h>\n\nnamespace google_breakpad {\n\n// Automatically enters the critical section in the constructor and leaves\n// the critical section in the destructor.\nclass AutoCriticalSection {\n public:\n  // Creates a new instance with the given critical section object\n  // and enters the critical section immediately.\n  explicit AutoCriticalSection(CRITICAL_SECTION* cs) : cs_(cs), taken_(false) {\n    assert(cs_);\n    Acquire();\n  }\n\n  // Destructor: leaves the critical section.\n  ~AutoCriticalSection() {\n    if (taken_) {\n      Release();\n    }\n  }\n\n  // Enters the critical section. Recursive Acquire() calls are not allowed.\n  void Acquire() {\n    assert(!taken_);\n    EnterCriticalSection(cs_);\n    taken_ = true;\n  }\n\n  // Leaves the critical section. The caller should not call Release() unless\n  // the critical seciton has been entered already.\n  void Release() {\n    assert(taken_);\n    taken_ = false;\n    LeaveCriticalSection(cs_);\n  }\n\n private:\n  // Disable copy ctor and operator=.\n  AutoCriticalSection(const AutoCriticalSection&);\n  AutoCriticalSection& operator=(const AutoCriticalSection&);\n\n  CRITICAL_SECTION* cs_;\n  bool taken_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/common/ipc_protocol.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__\n#define CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__\n\n#include <windows.h>\n#include <dbghelp.h>\n#include <string>\n#include <utility>\n#include \"common/windows/string_utils-inl.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n\nnamespace google_breakpad {\n\n// Name/value pair for custom client information.\nstruct CustomInfoEntry {\n  // Maximum length for name and value for client custom info.\n  static const int kNameMaxLength = 64;\n  static const int kValueMaxLength = 64;\n\n  CustomInfoEntry() {\n    // Putting name and value in initializer list makes VC++ show warning 4351.\n    set_name(NULL);\n    set_value(NULL);\n  }\n\n  CustomInfoEntry(const wchar_t* name_arg, const wchar_t* value_arg) {\n    set_name(name_arg);\n    set_value(value_arg);\n  }\n\n  void set_name(const wchar_t* name_arg) {\n    if (!name_arg) {\n      name[0] = L'\\0';\n      return;\n    }\n    WindowsStringUtils::safe_wcscpy(name, kNameMaxLength, name_arg);\n  }\n\n  void set_value(const wchar_t* value_arg) {\n    if (!value_arg) {\n      value[0] = L'\\0';\n      return;\n    }\n\n    WindowsStringUtils::safe_wcscpy(value, kValueMaxLength, value_arg);\n  }\n\n  void set(const wchar_t* name_arg, const wchar_t* value_arg) {\n    set_name(name_arg);\n    set_value(value_arg);\n  }\n\n  wchar_t name[kNameMaxLength];\n  wchar_t value[kValueMaxLength];\n};\n\n// Constants for the protocol between client and the server.\n\n// Tags sent with each message indicating the purpose of\n// the message.\nenum MessageTag {\n  MESSAGE_TAG_NONE = 0,\n  MESSAGE_TAG_REGISTRATION_REQUEST = 1,\n  MESSAGE_TAG_REGISTRATION_RESPONSE = 2,\n  MESSAGE_TAG_REGISTRATION_ACK = 3,\n  MESSAGE_TAG_UPLOAD_REQUEST = 4\n};\n\nstruct CustomClientInfo {\n  const CustomInfoEntry* entries;\n  size_t count;\n};\n\n// Message structure for IPC between crash client and crash server.\nstruct ProtocolMessage {\n  ProtocolMessage()\n      : tag(MESSAGE_TAG_NONE),\n        id(0),\n        dump_type(MiniDumpNormal),\n        thread_id(0),\n        exception_pointers(NULL),\n        assert_info(NULL),\n        custom_client_info(),\n        dump_request_handle(NULL),\n        dump_generated_handle(NULL),\n        server_alive_handle(NULL) {\n  }\n\n  // Creates an instance with the given parameters.\n  ProtocolMessage(MessageTag arg_tag,\n                  DWORD arg_id,\n                  MINIDUMP_TYPE arg_dump_type,\n                  DWORD* arg_thread_id,\n                  EXCEPTION_POINTERS** arg_exception_pointers,\n                  MDRawAssertionInfo* arg_assert_info,\n                  const CustomClientInfo& custom_info,\n                  HANDLE arg_dump_request_handle,\n                  HANDLE arg_dump_generated_handle,\n                  HANDLE arg_server_alive)\n    : tag(arg_tag),\n      id(arg_id),\n      dump_type(arg_dump_type),\n      thread_id(arg_thread_id),\n      exception_pointers(arg_exception_pointers),\n      assert_info(arg_assert_info),\n      custom_client_info(custom_info),\n      dump_request_handle(arg_dump_request_handle),\n      dump_generated_handle(arg_dump_generated_handle),\n      server_alive_handle(arg_server_alive) {\n  }\n\n  // Tag in the message.\n  MessageTag tag;\n\n  // The id for this message. This may be either a process id or a crash id\n  // depending on the type of message.\n  DWORD id;\n\n  // Dump type requested.\n  MINIDUMP_TYPE dump_type;\n\n  // Client thread id pointer.\n  DWORD* thread_id;\n\n  // Exception information.\n  EXCEPTION_POINTERS** exception_pointers;\n\n  // Assert information in case of an invalid parameter or\n  // pure call failure.\n  MDRawAssertionInfo* assert_info;\n\n  // Custom client information.\n  CustomClientInfo custom_client_info;\n\n  // Handle to signal the crash event.\n  HANDLE dump_request_handle;\n\n  // Handle to check if server is done generating crash.\n  HANDLE dump_generated_handle;\n\n  // Handle to a mutex that becomes signaled (WAIT_ABANDONED)\n  // if server process goes down.\n  HANDLE server_alive_handle;\n\n private:\n  // Disable copy ctor and operator=.\n  ProtocolMessage(const ProtocolMessage& msg);\n  ProtocolMessage& operator=(const ProtocolMessage& msg);\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/crash_generation/ReadMe.txt",
    "content": "=========================================================================\n State machine transitions for the Crash Generation Server\n=========================================================================\n\n=========================================================================\n               |\n STATE         | ACTIONS\n               |\n=========================================================================\n ERROR         | Clean up resources used to serve clients.\n               | Always remain in ERROR state.\n-------------------------------------------------------------------------\n INITIAL       | Connect to the pipe asynchronously.\n               | If connection is successfully queued up asynchronously,\n               | go into CONNECTING state.\n               | If connection is done synchronously, go into CONNECTED\n               | state.\n               | For any unexpected problems, go into ERROR state.\n-------------------------------------------------------------------------\n CONNECTING    | Get the result of async connection request.\n               | If I/O is still incomplete, remain in the CONNECTING\n               | state.\n               | If connection is complete, go into CONNECTED state.\n               | For any unexpected problems, go into DISCONNECTING state.\n-------------------------------------------------------------------------\n CONNECTED     | Read from the pipe asynchronously.\n               | If read request is successfully queued up asynchronously,\n               | go into READING state.\n               | For any unexpected problems, go into DISCONNECTING state.\n-------------------------------------------------------------------------\n READING       | Get the result of async read request.\n               | If read is done, go into READ_DONE state.\n               | For any unexpected problems, go into DISCONNECTING state.\n-------------------------------------------------------------------------\n READ_DONE     | Register the client, prepare the reply and write the\n               | reply to the pipe asynchronously.\n               | If write request is successfully queued up asynchronously,\n               | go into WRITING state.\n               | For any unexpected problems, go into DISCONNECTING state.\n-------------------------------------------------------------------------\n WRITING       | Get the result of the async write request.\n               | If write is done, go into WRITE_DONE state.\n               | For any unexpected problems, go into DISCONNECTING state.\n-------------------------------------------------------------------------\n WRITE_DONE    | Read from the pipe asynchronously (for an ACK).\n               | If read request is successfully queued up asynchonously,\n               | go into READING_ACK state.\n               | For any unexpected problems, go into DISCONNECTING state.\n-------------------------------------------------------------------------\n READING_ACK   | Get the result of the async read request.\n               | If read is done, perform action for successful client\n               | connection.\n               | Go into DISCONNECTING state.\n-------------------------------------------------------------------------\n DISCONNECTING | Disconnect from the pipe, reset the event and go into\n               | INITIAL state and signal the event again. If anything\n               | fails, go into ERROR state.\n=========================================================================\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/crash_generation/client_info.cc",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"client/windows/crash_generation/client_info.h\"\n#include \"client/windows/common/ipc_protocol.h\"\n\nstatic const wchar_t kCustomInfoProcessUptimeName[] = L\"ptime\";\nstatic const size_t kMaxCustomInfoEntries = 4096;\n\nnamespace google_breakpad {\n\nClientInfo::ClientInfo(CrashGenerationServer* crash_server,\n                       DWORD pid,\n                       MINIDUMP_TYPE dump_type,\n                       DWORD* thread_id,\n                       EXCEPTION_POINTERS** ex_info,\n                       MDRawAssertionInfo* assert_info,\n                       const CustomClientInfo& custom_client_info)\n    : crash_server_(crash_server),\n      pid_(pid),\n      dump_type_(dump_type),\n      ex_info_(ex_info),\n      assert_info_(assert_info),\n      custom_client_info_(custom_client_info),\n      thread_id_(thread_id),\n      process_handle_(NULL),\n      dump_requested_handle_(NULL),\n      dump_generated_handle_(NULL),\n      dump_request_wait_handle_(NULL),\n      process_exit_wait_handle_(NULL),\n      crash_id_(NULL) {\n  GetSystemTimeAsFileTime(&start_time_);\n}\n\nbool ClientInfo::Initialize() {\n  process_handle_ = OpenProcess(GENERIC_ALL, FALSE, pid_);\n  if (!process_handle_) {\n    return false;\n  }\n\n  // The crash_id will be the low order word of the process creation time.\n  FILETIME creation_time, exit_time, kernel_time, user_time;\n  if (GetProcessTimes(process_handle_, &creation_time, &exit_time,\n                      &kernel_time, &user_time))\n    crash_id_ = creation_time.dwLowDateTime;\n\n  dump_requested_handle_ = CreateEvent(NULL,    // Security attributes.\n                                       TRUE,    // Manual reset.\n                                       FALSE,   // Initial state.\n                                       NULL);   // Name.\n  if (!dump_requested_handle_) {\n    return false;\n  }\n\n  dump_generated_handle_ = CreateEvent(NULL,    // Security attributes.\n                                       TRUE,    // Manual reset.\n                                       FALSE,   // Initial state.\n                                       NULL);   // Name.\n  return dump_generated_handle_ != NULL;\n}\n\nClientInfo::~ClientInfo() {\n  if (dump_request_wait_handle_) {\n    // Wait for callbacks that might already be running to finish.\n    UnregisterWaitEx(dump_request_wait_handle_, INVALID_HANDLE_VALUE);\n  }\n\n  if (process_exit_wait_handle_) {\n    // Wait for the callback that might already be running to finish.\n    UnregisterWaitEx(process_exit_wait_handle_, INVALID_HANDLE_VALUE);\n  }\n\n  if (process_handle_) {\n    CloseHandle(process_handle_);\n  }\n\n  if (dump_requested_handle_) {\n    CloseHandle(dump_requested_handle_);\n  }\n\n  if (dump_generated_handle_) {\n    CloseHandle(dump_generated_handle_);\n  }\n}\n\nvoid ClientInfo::UnregisterWaits() {\n  if (dump_request_wait_handle_) {\n    UnregisterWait(dump_request_wait_handle_);\n    dump_request_wait_handle_ = NULL;\n  }\n\n  if (process_exit_wait_handle_) {\n    UnregisterWait(process_exit_wait_handle_);\n    process_exit_wait_handle_ = NULL;\n  }\n}\n\nbool ClientInfo::GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const {\n  SIZE_T bytes_count = 0;\n  if (!ReadProcessMemory(process_handle_,\n                         ex_info_,\n                         ex_info,\n                         sizeof(*ex_info),\n                         &bytes_count)) {\n    return false;\n  }\n\n  return bytes_count == sizeof(*ex_info);\n}\n\nbool ClientInfo::GetClientThreadId(DWORD* thread_id) const {\n  SIZE_T bytes_count = 0;\n  if (!ReadProcessMemory(process_handle_,\n                         thread_id_,\n                         thread_id,\n                         sizeof(*thread_id),\n                         &bytes_count)) {\n    return false;\n  }\n\n  return bytes_count == sizeof(*thread_id);\n}\n\nvoid ClientInfo::SetProcessUptime() {\n  FILETIME now = {0};\n  GetSystemTimeAsFileTime(&now);\n\n  ULARGE_INTEGER time_start;\n  time_start.HighPart = start_time_.dwHighDateTime;\n  time_start.LowPart = start_time_.dwLowDateTime;\n\n  ULARGE_INTEGER time_now;\n  time_now.HighPart = now.dwHighDateTime;\n  time_now.LowPart = now.dwLowDateTime;\n\n  // Calculate the delay and convert it from 100-nanoseconds to milliseconds.\n  __int64 delay = (time_now.QuadPart - time_start.QuadPart) / 10 / 1000;\n\n  // Convert it to a string.\n  wchar_t* value = custom_info_entries_.get()[custom_client_info_.count].value;\n  _i64tow_s(delay, value, CustomInfoEntry::kValueMaxLength, 10);\n}\n\nbool ClientInfo::PopulateCustomInfo() {\n  if (custom_client_info_.count > kMaxCustomInfoEntries)\n    return false;\n\n  SIZE_T bytes_count = 0;\n  SIZE_T read_count = sizeof(CustomInfoEntry) * custom_client_info_.count;\n\n  // If the scoped array for custom info already has an array, it will be\n  // the same size as what we need. This is because the number of custom info\n  // entries is always the same. So allocate memory only if scoped array has\n  // a NULL pointer.\n  if (!custom_info_entries_.get()) {\n    // Allocate an extra entry for reporting uptime for the client process.\n    custom_info_entries_.reset(\n        new CustomInfoEntry[custom_client_info_.count + 1]);\n    // Use the last element in the array for uptime.\n    custom_info_entries_.get()[custom_client_info_.count].set_name(\n        kCustomInfoProcessUptimeName);\n  }\n\n  if (!ReadProcessMemory(process_handle_,\n                         custom_client_info_.entries,\n                         custom_info_entries_.get(),\n                         read_count,\n                         &bytes_count)) {\n    return false;\n  }\n\n  SetProcessUptime();\n  return (bytes_count != read_count);\n}\n\nCustomClientInfo ClientInfo::GetCustomInfo() const {\n  CustomClientInfo custom_info;\n  custom_info.entries = custom_info_entries_.get();\n  // Add 1 to the count from the client process to account for extra entry for\n  // process uptime.\n  custom_info.count = custom_client_info_.count + 1;\n  return custom_info;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/crash_generation/client_info.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__\n#define CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__\n\n#include <Windows.h>\n#include <DbgHelp.h>\n#include \"client/windows/common/ipc_protocol.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"processor/scoped_ptr.h\"\n\nnamespace google_breakpad {\n\nclass CrashGenerationServer;\n\n// Abstraction for a crash client process.\nclass ClientInfo {\n public:\n  // Creates an instance with the given values. Gets the process\n  // handle for the given process id and creates necessary event\n  // objects.\n  ClientInfo(CrashGenerationServer* crash_server,\n             DWORD pid,\n             MINIDUMP_TYPE dump_type,\n             DWORD* thread_id,\n             EXCEPTION_POINTERS** ex_info,\n             MDRawAssertionInfo* assert_info,\n             const CustomClientInfo& custom_client_info);\n\n  ~ClientInfo();\n\n  CrashGenerationServer* crash_server() const { return crash_server_; }\n  DWORD pid() const { return pid_; }\n  MINIDUMP_TYPE dump_type() const { return dump_type_; }\n  EXCEPTION_POINTERS** ex_info() const { return ex_info_; }\n  MDRawAssertionInfo* assert_info() const { return assert_info_; }\n  DWORD* thread_id() const { return thread_id_; }\n  HANDLE process_handle() const { return process_handle_; }\n  HANDLE dump_requested_handle() const { return dump_requested_handle_; }\n  HANDLE dump_generated_handle() const { return dump_generated_handle_; }\n  DWORD crash_id() const { return crash_id_; }\n\n  HANDLE dump_request_wait_handle() const {\n    return dump_request_wait_handle_;\n  }\n\n  void set_dump_request_wait_handle(HANDLE value) {\n    dump_request_wait_handle_ = value;\n  }\n\n  HANDLE process_exit_wait_handle() const {\n    return process_exit_wait_handle_;\n  }\n\n  void set_process_exit_wait_handle(HANDLE value) {\n    process_exit_wait_handle_ = value;\n  }\n\n  // Unregister all waits for the client.\n  void UnregisterWaits();\n\n  bool Initialize();\n  bool GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const;\n  bool GetClientThreadId(DWORD* thread_id) const;\n\n  // Reads the custom information from the client process address space.\n  bool PopulateCustomInfo();\n\n  // Returns the client custom information.\n  CustomClientInfo GetCustomInfo() const;\n\n private:\n  // Calcualtes the uptime for the client process, converts it to a string and\n  // stores it in the last entry of client custom info.\n  void SetProcessUptime();\n\n  // Crash generation server.\n  CrashGenerationServer* crash_server_;\n\n  // Client process ID.\n  DWORD pid_;\n\n  // Dump type requested by the client.\n  MINIDUMP_TYPE dump_type_;\n\n  // Address of an EXCEPTION_POINTERS* variable in the client\n  // process address space that will point to an instance of\n  // EXCEPTION_POINTERS containing information about crash.\n  //\n  // WARNING: Do not dereference these pointers as they are pointers\n  // in the address space of another process.\n  EXCEPTION_POINTERS** ex_info_;\n\n  // Address of an instance of MDRawAssertionInfo in the client\n  // process address space that will contain information about\n  // non-exception related crashes like invalid parameter assertion\n  // failures and pure calls.\n  //\n  // WARNING: Do not dereference these pointers as they are pointers\n  // in the address space of another process.\n  MDRawAssertionInfo* assert_info_;\n\n  // Custom information about the client.\n  CustomClientInfo custom_client_info_;\n\n  // Contains the custom client info entries read from the client process\n  // memory. This will be populated only if the method GetClientCustomInfo\n  // is called.\n  scoped_array<CustomInfoEntry> custom_info_entries_;\n\n  // Address of a variable in the client process address space that\n  // will contain the thread id of the crashing client thread.\n  //\n  // WARNING: Do not dereference these pointers as they are pointers\n  // in the address space of another process.\n  DWORD* thread_id_;\n\n  // Client process handle.\n  HANDLE process_handle_;\n\n  // Dump request event handle.\n  HANDLE dump_requested_handle_;\n\n  // Dump generated event handle.\n  HANDLE dump_generated_handle_;\n\n  // Wait handle for dump request event.\n  HANDLE dump_request_wait_handle_;\n\n  // Wait handle for process exit event.\n  HANDLE process_exit_wait_handle_;\n\n  // Time when the client process started. It is used to determine the uptime\n  // for the client process when it signals a crash.\n  FILETIME start_time_;\n\n  // The crash id which can be used to request an upload. This will be the\n  // value of the low order dword of the process creation time for the process\n  // being dumped.\n  DWORD crash_id_;\n\n  // Disallow copy ctor and operator=.\n  ClientInfo(const ClientInfo& client_info);\n  ClientInfo& operator=(const ClientInfo& client_info);\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/crash_generation/crash_generation.gyp",
    "content": "# Copyright (c) 2010, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n{\n  'includes': [\n    '../build/common.gypi',\n  ],\n  'targets': [\n    {\n      'target_name': 'crash_generation_server',\n      'type': '<(library)',\n      'sources': [\n        'client_info.cc',\n        'crash_generation_server.cc',\n        'minidump_generator.cc',\n        'client_info.h',\n        'crash_generation_client.h',\n        'crash_generation_server.h',\n        'minidump_generator.h',\n      ],\n      'dependencies': [\n        '../breakpad_client.gyp:common'\n      ],\n    },\n    {\n      'target_name': 'crash_generation_client',\n      'type': '<(library)',\n      'include_dirs': [\n        '<(DEPTH)',\n      ],\n      'sources': [\n        'crash_generation_client.h',\n        'crash_generation_client.cc',\n        'crash_generation_server.h',\n      ],\n    },\n  ],\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/crash_generation/crash_generation_client.cc",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"client/windows/crash_generation/crash_generation_client.h\"\n#include <cassert>\n#include <utility>\n#include \"client/windows/common/ipc_protocol.h\"\n\nnamespace google_breakpad {\n\nconst int kPipeBusyWaitTimeoutMs = 2000;\n\n#ifdef _DEBUG\nconst DWORD kWaitForServerTimeoutMs = INFINITE;\n#else\nconst DWORD kWaitForServerTimeoutMs = 15000;\n#endif\n\nconst int kPipeConnectMaxAttempts = 2;\n\nconst DWORD kPipeDesiredAccess = FILE_READ_DATA |\n                                 FILE_WRITE_DATA |\n                                 FILE_WRITE_ATTRIBUTES;\n\nconst DWORD kPipeFlagsAndAttributes = SECURITY_IDENTIFICATION |\n                                      SECURITY_SQOS_PRESENT;\n\nconst DWORD kPipeMode = PIPE_READMODE_MESSAGE;\n\nconst size_t kWaitEventCount = 2;\n\n// This function is orphan for production code. It can be used\n// for debugging to help repro some scenarios like the client\n// is slow in writing to the pipe after connecting, the client\n// is slow in reading from the pipe after writing, etc. The parameter\n// overlapped below is not used and it is present to match the signature\n// of this function to TransactNamedPipe Win32 API. Uncomment if needed\n// for debugging.\n/**\nstatic bool TransactNamedPipeDebugHelper(HANDLE pipe,\n                                         const void* in_buffer,\n                                         DWORD in_size,\n                                         void* out_buffer,\n                                         DWORD out_size,\n                                         DWORD* bytes_count,\n                                         LPOVERLAPPED) {\n  // Uncomment the next sleep to create a gap before writing\n  // to pipe.\n  // Sleep(5000);\n\n  if (!WriteFile(pipe,\n                 in_buffer,\n                 in_size,\n                 bytes_count,\n                 NULL)) {\n    return false;\n  }\n\n  // Uncomment the next sleep to create a gap between write\n  // and read.\n  // Sleep(5000);\n\n  return ReadFile(pipe, out_buffer, out_size, bytes_count, NULL) != FALSE;\n}\n**/\n\nCrashGenerationClient::CrashGenerationClient(\n    const wchar_t* pipe_name,\n    MINIDUMP_TYPE dump_type,\n    const CustomClientInfo* custom_info)\n        : pipe_name_(pipe_name),\n          dump_type_(dump_type),\n          thread_id_(0),\n          server_process_id_(0),\n          crash_event_(NULL),\n          crash_generated_(NULL),\n          server_alive_(NULL),\n          exception_pointers_(NULL),\n          custom_info_() {\n  memset(&assert_info_, 0, sizeof(assert_info_));\n  if (custom_info) {\n    custom_info_ = *custom_info;\n  }\n}\n\nCrashGenerationClient::~CrashGenerationClient() {\n  if (crash_event_) {\n    CloseHandle(crash_event_);\n  }\n\n  if (crash_generated_) {\n    CloseHandle(crash_generated_);\n  }\n\n  if (server_alive_) {\n    CloseHandle(server_alive_);\n  }\n}\n\n// Performs the registration step with the server process.\n// The registration step involves communicating with the server\n// via a named pipe. The client sends the following pieces of\n// data to the server:\n//\n// * Message tag indicating the client is requesting registration.\n// * Process id of the client process.\n// * Address of a DWORD variable in the client address space\n//   that will contain the thread id of the client thread that\n//   caused the crash.\n// * Address of a EXCEPTION_POINTERS* variable in the client\n//   address space that will point to an instance of EXCEPTION_POINTERS\n//   when the crash happens.\n// * Address of an instance of MDRawAssertionInfo that will contain\n//   relevant information in case of non-exception crashes like assertion\n//   failures and pure calls.\n//\n// In return the client expects the following information from the server:\n//\n// * Message tag indicating successful registration.\n// * Server process id.\n// * Handle to an object that client can signal to request dump\n//   generation from the server.\n// * Handle to an object that client can wait on after requesting\n//   dump generation for the server to finish dump generation.\n// * Handle to a mutex object that client can wait on to make sure\n//   server is still alive.\n//\n// If any step of the expected behavior mentioned above fails, the\n// registration step is not considered successful and hence out-of-process\n// dump generation service is not available.\n//\n// Returns true if the registration is successful; false otherwise.\nbool CrashGenerationClient::Register() {\n  HANDLE pipe = ConnectToServer();\n  if (!pipe) {\n    return false;\n  }\n\n  bool success = RegisterClient(pipe);\n  CloseHandle(pipe);\n  return success;\n}\n\nbool CrashGenerationClient::RequestUpload(DWORD crash_id) {\n  HANDLE pipe = ConnectToServer();\n  if (!pipe) {\n    return false;\n  }\n\n  CustomClientInfo custom_info = {NULL, 0};\n  ProtocolMessage msg(MESSAGE_TAG_UPLOAD_REQUEST, crash_id,\n                      static_cast<MINIDUMP_TYPE>(NULL), NULL, NULL, NULL,\n                      custom_info, NULL, NULL, NULL);\n  DWORD bytes_count = 0;\n  bool success = WriteFile(pipe, &msg, sizeof(msg), &bytes_count, NULL) != 0;\n\n  CloseHandle(pipe);\n  return success;\n}\n\nHANDLE CrashGenerationClient::ConnectToServer() {\n  HANDLE pipe = ConnectToPipe(pipe_name_.c_str(),\n                              kPipeDesiredAccess,\n                              kPipeFlagsAndAttributes);\n  if (!pipe) {\n    return NULL;\n  }\n\n  DWORD mode = kPipeMode;\n  if (!SetNamedPipeHandleState(pipe, &mode, NULL, NULL)) {\n    CloseHandle(pipe);\n    pipe = NULL;\n  }\n\n  return pipe;\n}\n\nbool CrashGenerationClient::RegisterClient(HANDLE pipe) {\n  ProtocolMessage msg(MESSAGE_TAG_REGISTRATION_REQUEST,\n                      GetCurrentProcessId(),\n                      dump_type_,\n                      &thread_id_,\n                      &exception_pointers_,\n                      &assert_info_,\n                      custom_info_,\n                      NULL,\n                      NULL,\n                      NULL);\n  ProtocolMessage reply;\n  DWORD bytes_count = 0;\n  // The call to TransactNamedPipe below can be changed to a call\n  // to TransactNamedPipeDebugHelper to help repro some scenarios.\n  // For details see comments for TransactNamedPipeDebugHelper.\n  if (!TransactNamedPipe(pipe,\n                         &msg,\n                         sizeof(msg),\n                         &reply,\n                         sizeof(ProtocolMessage),\n                         &bytes_count,\n                         NULL)) {\n    return false;\n  }\n\n  if (!ValidateResponse(reply)) {\n    return false;\n  }\n\n  ProtocolMessage ack_msg;\n  ack_msg.tag = MESSAGE_TAG_REGISTRATION_ACK;\n\n  if (!WriteFile(pipe, &ack_msg, sizeof(ack_msg), &bytes_count, NULL)) {\n    return false;\n  }\n  crash_event_ = reply.dump_request_handle;\n  crash_generated_ = reply.dump_generated_handle;\n  server_alive_ = reply.server_alive_handle;\n  server_process_id_ = reply.id;\n\n  return true;\n}\n\nHANDLE CrashGenerationClient::ConnectToPipe(const wchar_t* pipe_name,\n                                            DWORD pipe_access,\n                                            DWORD flags_attrs) {\n  for (int i = 0; i < kPipeConnectMaxAttempts; ++i) {\n    HANDLE pipe = CreateFile(pipe_name,\n                             pipe_access,\n                             0,\n                             NULL,\n                             OPEN_EXISTING,\n                             flags_attrs,\n                             NULL);\n    if (pipe != INVALID_HANDLE_VALUE) {\n      return pipe;\n    }\n\n    // Cannot continue retrying if error is something other than\n    // ERROR_PIPE_BUSY.\n    if (GetLastError() != ERROR_PIPE_BUSY) {\n      break;\n    }\n\n    // Cannot continue retrying if wait on pipe fails.\n    if (!WaitNamedPipe(pipe_name, kPipeBusyWaitTimeoutMs)) {\n      break;\n    }\n  }\n\n  return NULL;\n}\n\nbool CrashGenerationClient::ValidateResponse(\n    const ProtocolMessage& msg) const {\n  return (msg.tag == MESSAGE_TAG_REGISTRATION_RESPONSE) &&\n         (msg.id != 0) &&\n         (msg.dump_request_handle != NULL) &&\n         (msg.dump_generated_handle != NULL) &&\n         (msg.server_alive_handle != NULL);\n}\n\nbool CrashGenerationClient::IsRegistered() const {\n  return crash_event_ != NULL;\n}\n\nbool CrashGenerationClient::RequestDump(EXCEPTION_POINTERS* ex_info,\n                                        MDRawAssertionInfo* assert_info) {\n  if (!IsRegistered()) {\n    return false;\n  }\n\n  exception_pointers_ = ex_info;\n  thread_id_ = GetCurrentThreadId();\n\n  if (assert_info) {\n    memcpy(&assert_info_, assert_info, sizeof(assert_info_));\n  } else {\n    memset(&assert_info_, 0, sizeof(assert_info_));\n  }\n\n  return SignalCrashEventAndWait();\n}\n\nbool CrashGenerationClient::RequestDump(EXCEPTION_POINTERS* ex_info) {\n  return RequestDump(ex_info, NULL);\n}\n\nbool CrashGenerationClient::RequestDump(MDRawAssertionInfo* assert_info) {\n  return RequestDump(NULL, assert_info);\n}\n\nbool CrashGenerationClient::SignalCrashEventAndWait() {\n  assert(crash_event_);\n  assert(crash_generated_);\n  assert(server_alive_);\n\n  // Reset the dump generated event before signaling the crash\n  // event so that the server can set the dump generated event\n  // once it is done generating the event.\n  if (!ResetEvent(crash_generated_)) {\n    return false;\n  }\n\n  if (!SetEvent(crash_event_)) {\n    return false;\n  }\n\n  HANDLE wait_handles[kWaitEventCount] = {crash_generated_, server_alive_};\n\n  DWORD result = WaitForMultipleObjects(kWaitEventCount,\n                                        wait_handles,\n                                        FALSE,\n                                        kWaitForServerTimeoutMs);\n\n  // Crash dump was successfully generated only if the server\n  // signaled the crash generated event.\n  return result == WAIT_OBJECT_0;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/crash_generation/crash_generation_client.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_\n#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_\n\n#include <windows.h>\n#include <dbghelp.h>\n#include <string>\n#include <utility>\n#include \"client/windows/common/ipc_protocol.h\"\n#include \"processor/scoped_ptr.h\"\n\nnamespace google_breakpad {\n\nstruct CustomClientInfo;\n\n// Abstraction of client-side implementation of out of process\n// crash generation.\n//\n// The process that desires to have out-of-process crash dump\n// generation service can use this class in the following way:\n//\n// * Create an instance.\n// * Call Register method so that the client tries to register\n//   with the server process and check the return value. If\n//   registration is not successful, out-of-process crash dump\n//   generation will not be available\n// * Request dump generation by calling either of the two\n//   overloaded RequestDump methods - one in case of exceptions\n//   and the other in case of assertion failures\n//\n// Note that it is the responsibility of the client code of\n// this class to set the unhandled exception filter with the\n// system by calling the SetUnhandledExceptionFilter function\n// and the client code should explicitly request dump generation.\nclass CrashGenerationClient {\n public:\n  CrashGenerationClient(const wchar_t* pipe_name,\n                        MINIDUMP_TYPE dump_type,\n                        const CustomClientInfo* custom_info);\n\n  ~CrashGenerationClient();\n\n  // Registers the client process with the crash server.\n  //\n  // Returns true if the registration is successful; false otherwise.\n  bool Register();\n\n  // Requests the crash server to upload a previous dump with the\n  // given crash id.\n  bool RequestUpload(DWORD crash_id);\n\n  bool RequestDump(EXCEPTION_POINTERS* ex_info,\n                   MDRawAssertionInfo* assert_info);\n\n  // Requests the crash server to generate a dump with the given\n  // exception information.\n  //\n  // Returns true if the dump was successful; false otherwise. Note that\n  // if the registration step was not performed or it was not successful,\n  // false will be returned.\n  bool RequestDump(EXCEPTION_POINTERS* ex_info);\n\n  // Requests the crash server to generate a dump with the given\n  // assertion information.\n  //\n  // Returns true if the dump was successful; false otherwise. Note that\n  // if the registration step was not performed or it was not successful,\n  // false will be returned.\n  bool RequestDump(MDRawAssertionInfo* assert_info);\n\n private:\n  // Connects to the appropriate pipe and sets the pipe handle state.\n  //\n  // Returns the pipe handle if everything goes well; otherwise Returns NULL.\n  HANDLE ConnectToServer();\n\n  // Performs a handshake with the server over the given pipe which should be\n  // already connected to the server.\n  //\n  // Returns true if handshake with the server was successful; false otherwise.\n  bool RegisterClient(HANDLE pipe);\n\n  // Validates the given server response.\n  bool ValidateResponse(const ProtocolMessage& msg) const;\n\n  // Returns true if the registration step succeeded; false otherwise.\n  bool IsRegistered() const;\n\n  // Connects to the given named pipe with given parameters.\n  //\n  // Returns true if the connection is successful; false otherwise.\n  HANDLE ConnectToPipe(const wchar_t* pipe_name,\n                       DWORD pipe_access,\n                       DWORD flags_attrs);\n\n  // Signals the crash event and wait for the server to generate crash.\n  bool SignalCrashEventAndWait();\n\n  // Pipe name to use to talk to server.\n  std::wstring pipe_name_;\n\n  // Custom client information\n  CustomClientInfo custom_info_;\n\n  // Type of dump to generate.\n  MINIDUMP_TYPE dump_type_;\n\n  // Event to signal in case of a crash.\n  HANDLE crash_event_;\n\n  // Handle to wait on after signaling a crash for the server\n  // to finish generating crash dump.\n  HANDLE crash_generated_;\n\n  // Handle to a mutex that will become signaled with WAIT_ABANDONED\n  // if the server process goes down.\n  HANDLE server_alive_;\n\n  // Server process id.\n  DWORD server_process_id_;\n\n  // Id of the thread that caused the crash.\n  DWORD thread_id_;\n\n  // Exception pointers for an exception crash.\n  EXCEPTION_POINTERS* exception_pointers_;\n\n  // Assertion info for an invalid parameter or pure call crash.\n  MDRawAssertionInfo assert_info_;\n\n  // Disable copy ctor and operator=.\n  CrashGenerationClient(const CrashGenerationClient& crash_client);\n  CrashGenerationClient& operator=(const CrashGenerationClient& crash_client);\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/crash_generation/crash_generation_server.cc",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"client/windows/crash_generation/crash_generation_server.h\"\n#include <windows.h>\n#include <cassert>\n#include <list>\n#include \"client/windows/common/auto_critical_section.h\"\n#include \"processor/scoped_ptr.h\"\n\n#include \"client/windows/crash_generation/client_info.h\"\n\nnamespace google_breakpad {\n\n// Output buffer size.\nstatic const size_t kOutBufferSize = 64;\n\n// Input buffer size.\nstatic const size_t kInBufferSize = 64;\n\n// Access flags for the client on the dump request event.\nstatic const DWORD kDumpRequestEventAccess = EVENT_MODIFY_STATE;\n\n// Access flags for the client on the dump generated event.\nstatic const DWORD kDumpGeneratedEventAccess = EVENT_MODIFY_STATE |\n                                               SYNCHRONIZE;\n\n// Access flags for the client on the mutex.\nstatic const DWORD kMutexAccess = SYNCHRONIZE;\n\n// Attribute flags for the pipe.\nstatic const DWORD kPipeAttr = FILE_FLAG_FIRST_PIPE_INSTANCE |\n                               PIPE_ACCESS_DUPLEX |\n                               FILE_FLAG_OVERLAPPED;\n\n// Mode for the pipe.\nstatic const DWORD kPipeMode = PIPE_TYPE_MESSAGE |\n                               PIPE_READMODE_MESSAGE |\n                               PIPE_WAIT;\n\n// For pipe I/O, execute the callback in the wait thread itself,\n// since the callback does very little work. The callback executes\n// the code for one of the states of the server state machine and\n// the code for all of the states perform async I/O and hence\n// finish very quickly.\nstatic const ULONG kPipeIOThreadFlags = WT_EXECUTEINWAITTHREAD;\n\n// Dump request threads will, most likely, generate dumps. That may\n// take some time to finish, so specify WT_EXECUTELONGFUNCTION flag.\nstatic const ULONG kDumpRequestThreadFlags = WT_EXECUTEINWAITTHREAD |\n                                             WT_EXECUTELONGFUNCTION;\n\n// Maximum delay during server shutdown if some work items\n// are still executing.\nstatic const int kShutdownDelayMs = 10000;\n\n// Interval for each sleep during server shutdown.\nstatic const int kShutdownSleepIntervalMs = 5;\n\nstatic bool IsClientRequestValid(const ProtocolMessage& msg) {\n  return msg.tag == MESSAGE_TAG_UPLOAD_REQUEST ||\n         (msg.tag == MESSAGE_TAG_REGISTRATION_REQUEST &&\n          msg.id != 0 &&\n          msg.thread_id != NULL &&\n          msg.exception_pointers != NULL &&\n          msg.assert_info != NULL);\n}\n\nCrashGenerationServer::CrashGenerationServer(\n    const std::wstring& pipe_name,\n    SECURITY_ATTRIBUTES* pipe_sec_attrs,\n    OnClientConnectedCallback connect_callback,\n    void* connect_context,\n    OnClientDumpRequestCallback dump_callback,\n    void* dump_context,\n    OnClientExitedCallback exit_callback,\n    void* exit_context,\n    OnClientUploadRequestCallback upload_request_callback,\n    void* upload_context,\n    bool generate_dumps,\n    const std::wstring* dump_path)\n    : pipe_name_(pipe_name),\n      pipe_sec_attrs_(pipe_sec_attrs),\n      pipe_(NULL),\n      pipe_wait_handle_(NULL),\n      server_alive_handle_(NULL),\n      connect_callback_(connect_callback),\n      connect_context_(connect_context),\n      dump_callback_(dump_callback),\n      dump_context_(dump_context),\n      exit_callback_(exit_callback),\n      exit_context_(exit_context),\n      upload_request_callback_(upload_request_callback),\n      upload_context_(upload_context),\n      generate_dumps_(generate_dumps),\n      dump_generator_(NULL),\n      server_state_(IPC_SERVER_STATE_UNINITIALIZED),\n      shutting_down_(false),\n      overlapped_(),\n      client_info_(NULL),\n      cleanup_item_count_(0) {\n  InitializeCriticalSection(&sync_);\n\n  if (dump_path) {\n    dump_generator_.reset(new MinidumpGenerator(*dump_path));\n  }\n}\n\nCrashGenerationServer::~CrashGenerationServer() {\n  // New scope to release the lock automatically.\n  {\n    AutoCriticalSection lock(&sync_);\n\n    // Indicate to existing threads that server is shutting down.\n    shutting_down_ = true;\n\n    // Even if there are no current worker threads running, it is possible that\n    // an I/O request is pending on the pipe right now but not yet done.\n    // In fact, it's very likely this is the case unless we are in an ERROR\n    // state. If we don't wait for the pending I/O to be done, then when the I/O\n    // completes, it may write to invalid memory. AppVerifier will flag this\n    // problem too. So we disconnect from the pipe and then wait for the server\n    // to get into error state so that the pending I/O will fail and get\n    // cleared.\n    DisconnectNamedPipe(pipe_);\n    int num_tries = 100;\n    while (num_tries-- && server_state_ != IPC_SERVER_STATE_ERROR) {\n      lock.Release();\n      Sleep(10);\n      lock.Acquire();\n    }\n\n    // Unregister wait on the pipe.\n    if (pipe_wait_handle_) {\n      // Wait for already executing callbacks to finish.\n      UnregisterWaitEx(pipe_wait_handle_, INVALID_HANDLE_VALUE);\n    }\n\n    // Close the pipe to avoid further client connections.\n    if (pipe_) {\n      CloseHandle(pipe_);\n    }\n\n    // Request all ClientInfo objects to unregister all waits.\n    std::list<ClientInfo*>::iterator iter;\n    for (iter = clients_.begin(); iter != clients_.end(); ++iter) {\n      ClientInfo* client_info = *iter;\n      client_info->UnregisterWaits();\n    }\n  }\n\n  // Now that all waits have been unregistered, wait for some time\n  // for all pending work items to finish.\n  int total_wait = 0;\n  while (cleanup_item_count_ > 0) {\n    Sleep(kShutdownSleepIntervalMs);\n\n    total_wait += kShutdownSleepIntervalMs;\n\n    if (total_wait >= kShutdownDelayMs) {\n      break;\n    }\n  }\n\n  // New scope to hold the lock for the shortest time.\n  {\n    AutoCriticalSection lock(&sync_);\n\n    // Clean up all the ClientInfo objects.\n    std::list<ClientInfo*>::iterator iter;\n    for (iter = clients_.begin(); iter != clients_.end(); ++iter) {\n      ClientInfo* client_info = *iter;\n      delete client_info;\n    }\n\n    if (server_alive_handle_) {\n      // Release the mutex before closing the handle so that clients requesting\n      // dumps wait for a long time for the server to generate a dump.\n      ReleaseMutex(server_alive_handle_);\n      CloseHandle(server_alive_handle_);\n    }\n\n    if (overlapped_.hEvent) {\n      CloseHandle(overlapped_.hEvent);\n    }\n  }\n\n  DeleteCriticalSection(&sync_);\n}\n\nbool CrashGenerationServer::Start() {\n  AutoCriticalSection lock(&sync_);\n\n  if (server_state_ != IPC_SERVER_STATE_UNINITIALIZED) {\n    return false;\n  }\n\n  server_state_ = IPC_SERVER_STATE_INITIAL;\n\n  server_alive_handle_ = CreateMutex(NULL, TRUE, NULL);\n  if (!server_alive_handle_) {\n    return false;\n  }\n\n  // Event to signal the client connection and pipe reads and writes.\n  overlapped_.hEvent = CreateEvent(NULL,   // Security descriptor.\n                                   TRUE,   // Manual reset.\n                                   FALSE,  // Initially signaled.\n                                   NULL);  // Name.\n  if (!overlapped_.hEvent) {\n    return false;\n  }\n\n  // Register a callback with the thread pool for the client connection.\n  if (!RegisterWaitForSingleObject(&pipe_wait_handle_,\n                                   overlapped_.hEvent,\n                                   OnPipeConnected,\n                                   this,\n                                   INFINITE,\n                                   kPipeIOThreadFlags)) {\n    return false;\n  }\n\n  pipe_ = CreateNamedPipe(pipe_name_.c_str(),\n                          kPipeAttr,\n                          kPipeMode,\n                          1,\n                          kOutBufferSize,\n                          kInBufferSize,\n                          0,\n                          pipe_sec_attrs_);\n  if (pipe_ == INVALID_HANDLE_VALUE) {\n    return false;\n  }\n\n  // Kick-start the state machine. This will initiate an asynchronous wait\n  // for client connections.\n  HandleInitialState();\n\n  // If we are in error state, it's because we failed to start listening.\n  return server_state_ != IPC_SERVER_STATE_ERROR;\n}\n\n// If the server thread serving clients ever gets into the\n// ERROR state, reset the event, close the pipe and remain\n// in the error state forever. Error state means something\n// that we didn't account for has happened, and it's dangerous\n// to do anything unknowingly.\nvoid CrashGenerationServer::HandleErrorState() {\n  assert(server_state_ == IPC_SERVER_STATE_ERROR);\n\n  // If the server is shutting down anyway, don't clean up\n  // here since shut down process will clean up.\n  if (shutting_down_) {\n    return;\n  }\n\n  if (pipe_wait_handle_) {\n    UnregisterWait(pipe_wait_handle_);\n    pipe_wait_handle_ = NULL;\n  }\n\n  if (pipe_) {\n    CloseHandle(pipe_);\n    pipe_ = NULL;\n  }\n\n  if (overlapped_.hEvent) {\n    CloseHandle(overlapped_.hEvent);\n    overlapped_.hEvent = NULL;\n  }\n}\n\n// When the server thread serving clients is in the INITIAL state,\n// try to connect to the pipe asynchronously. If the connection\n// finishes synchronously, directly go into the CONNECTED state;\n// otherwise go into the CONNECTING state. For any problems, go\n// into the ERROR state.\nvoid CrashGenerationServer::HandleInitialState() {\n  assert(server_state_ == IPC_SERVER_STATE_INITIAL);\n\n  if (!ResetEvent(overlapped_.hEvent)) {\n    EnterErrorState();\n    return;\n  }\n\n  bool success = ConnectNamedPipe(pipe_, &overlapped_) != FALSE;\n  DWORD error_code = success ? ERROR_SUCCESS : GetLastError();\n\n  // From MSDN, it is not clear that when ConnectNamedPipe is used\n  // in an overlapped mode, will it ever return non-zero value, and\n  // if so, in what cases.\n  assert(!success);\n\n  switch (error_code) {\n    case ERROR_IO_PENDING:\n      EnterStateWhenSignaled(IPC_SERVER_STATE_CONNECTING);\n      break;\n\n    case ERROR_PIPE_CONNECTED:\n      EnterStateImmediately(IPC_SERVER_STATE_CONNECTED);\n      break;\n\n    default:\n      EnterErrorState();\n      break;\n  }\n}\n\n// When the server thread serving the clients is in the CONNECTING state,\n// try to get the result of the asynchronous connection request using\n// the OVERLAPPED object. If the result indicates the connection is done,\n// go into the CONNECTED state. If the result indicates I/O is still\n// INCOMPLETE, remain in the CONNECTING state. For any problems,\n// go into the DISCONNECTING state.\nvoid CrashGenerationServer::HandleConnectingState() {\n  assert(server_state_ == IPC_SERVER_STATE_CONNECTING);\n\n  DWORD bytes_count = 0;\n  bool success = GetOverlappedResult(pipe_,\n                                     &overlapped_,\n                                     &bytes_count,\n                                     FALSE) != FALSE;\n  DWORD error_code = success ? ERROR_SUCCESS : GetLastError();\n\n  if (success) {\n    EnterStateImmediately(IPC_SERVER_STATE_CONNECTED);\n  } else if (error_code != ERROR_IO_INCOMPLETE) {\n    EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);\n  } else {\n    // remain in CONNECTING state\n  }\n}\n\n// When the server thread serving the clients is in the CONNECTED state,\n// try to issue an asynchronous read from the pipe. If read completes\n// synchronously or if I/O is pending then go into the READING state.\n// For any problems, go into the DISCONNECTING state.\nvoid CrashGenerationServer::HandleConnectedState() {\n  assert(server_state_ == IPC_SERVER_STATE_CONNECTED);\n\n  DWORD bytes_count = 0;\n  memset(&msg_, 0, sizeof(msg_));\n  bool success = ReadFile(pipe_,\n                          &msg_,\n                          sizeof(msg_),\n                          &bytes_count,\n                          &overlapped_) != FALSE;\n  DWORD error_code = success ? ERROR_SUCCESS : GetLastError();\n\n  // Note that the asynchronous read issued above can finish before the\n  // code below executes. But, it is okay to change state after issuing\n  // the asynchronous read. This is because even if the asynchronous read\n  // is done, the callback for it would not be executed until the current\n  // thread finishes its execution.\n  if (success || error_code == ERROR_IO_PENDING) {\n    EnterStateWhenSignaled(IPC_SERVER_STATE_READING);\n  } else {\n    EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);\n  }\n}\n\n// When the server thread serving the clients is in the READING state,\n// try to get the result of the async read. If async read is done,\n// go into the READ_DONE state. For any problems, go into the\n// DISCONNECTING state.\nvoid CrashGenerationServer::HandleReadingState() {\n  assert(server_state_ == IPC_SERVER_STATE_READING);\n\n  DWORD bytes_count = 0;\n  bool success = GetOverlappedResult(pipe_,\n                                     &overlapped_,\n                                     &bytes_count,\n                                     FALSE) != FALSE;\n  DWORD error_code = success ? ERROR_SUCCESS : GetLastError();\n\n  if (success && bytes_count == sizeof(ProtocolMessage)) {\n    EnterStateImmediately(IPC_SERVER_STATE_READ_DONE);\n  } else {\n    // We should never get an I/O incomplete since we should not execute this\n    // unless the Read has finished and the overlapped event is signaled. If\n    // we do get INCOMPLETE, we have a bug in our code.\n    assert(error_code != ERROR_IO_INCOMPLETE);\n\n    EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);\n  }\n}\n\n// When the server thread serving the client is in the READ_DONE state,\n// validate the client's request message, register the client by\n// creating appropriate objects and prepare the response.  Then try to\n// write the response to the pipe asynchronously. If that succeeds,\n// go into the WRITING state. For any problems, go into the DISCONNECTING\n// state.\nvoid CrashGenerationServer::HandleReadDoneState() {\n  assert(server_state_ == IPC_SERVER_STATE_READ_DONE);\n\n  if (!IsClientRequestValid(msg_)) {\n    EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);\n    return;\n  }\n\n  if (msg_.tag == MESSAGE_TAG_UPLOAD_REQUEST) {\n    if (upload_request_callback_)\n      upload_request_callback_(upload_context_, msg_.id);\n    EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);\n    return;\n  }\n\n  scoped_ptr<ClientInfo> client_info(\n      new ClientInfo(this,\n                     msg_.id,\n                     msg_.dump_type,\n                     msg_.thread_id,\n                     msg_.exception_pointers,\n                     msg_.assert_info,\n                     msg_.custom_client_info));\n\n  if (!client_info->Initialize()) {\n    EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);\n    return;\n  }\n\n  // Issues an asynchronous WriteFile call if successful.\n  // Iff successful, assigns ownership of the client_info pointer to the server\n  // instance, in which case we must be sure not to free it in this function.\n  if (!RespondToClient(client_info.get())) {\n    EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);\n    return;\n  }\n\n  client_info_ = client_info.release();\n\n  // Note that the asynchronous write issued by RespondToClient function\n  // can finish before  the code below executes. But it is okay to change\n  // state after issuing the asynchronous write. This is because even if\n  // the asynchronous write is done, the callback for it would not be\n  // executed until the current thread finishes its execution.\n  EnterStateWhenSignaled(IPC_SERVER_STATE_WRITING);\n}\n\n// When the server thread serving the clients is in the WRITING state,\n// try to get the result of the async write. If the async write is done,\n// go into the WRITE_DONE state. For any problems, go into the\n// DISONNECTING state.\nvoid CrashGenerationServer::HandleWritingState() {\n  assert(server_state_ == IPC_SERVER_STATE_WRITING);\n\n  DWORD bytes_count = 0;\n  bool success = GetOverlappedResult(pipe_,\n                                     &overlapped_,\n                                     &bytes_count,\n                                     FALSE) != FALSE;\n  DWORD error_code = success ? ERROR_SUCCESS : GetLastError();\n\n  if (success) {\n    EnterStateImmediately(IPC_SERVER_STATE_WRITE_DONE);\n    return;\n  }\n\n  // We should never get an I/O incomplete since we should not execute this\n  // unless the Write has finished and the overlapped event is signaled. If\n  // we do get INCOMPLETE, we have a bug in our code.\n  assert(error_code != ERROR_IO_INCOMPLETE);\n\n  EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);\n}\n\n// When the server thread serving the clients is in the WRITE_DONE state,\n// try to issue an async read on the pipe. If the read completes synchronously\n// or if I/O is still pending then go into the READING_ACK state. For any\n// issues, go into the DISCONNECTING state.\nvoid CrashGenerationServer::HandleWriteDoneState() {\n  assert(server_state_ == IPC_SERVER_STATE_WRITE_DONE);\n\n  DWORD bytes_count = 0;\n  bool success = ReadFile(pipe_,\n                           &msg_,\n                           sizeof(msg_),\n                           &bytes_count,\n                           &overlapped_) != FALSE;\n  DWORD error_code = success ? ERROR_SUCCESS : GetLastError();\n\n  if (success) {\n    EnterStateImmediately(IPC_SERVER_STATE_READING_ACK);\n  } else if (error_code == ERROR_IO_PENDING) {\n    EnterStateWhenSignaled(IPC_SERVER_STATE_READING_ACK);\n  } else {\n    EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);\n  }\n}\n\n// When the server thread serving the clients is in the READING_ACK state,\n// try to get result of async read. Go into the DISCONNECTING state.\nvoid CrashGenerationServer::HandleReadingAckState() {\n  assert(server_state_ == IPC_SERVER_STATE_READING_ACK);\n\n  DWORD bytes_count = 0;\n  bool success = GetOverlappedResult(pipe_,\n                                     &overlapped_,\n                                     &bytes_count,\n                                     FALSE) != FALSE;\n  DWORD error_code = success ? ERROR_SUCCESS : GetLastError();\n\n  if (success) {\n    // The connection handshake with the client is now complete; perform\n    // the callback.\n    if (connect_callback_) {\n      connect_callback_(connect_context_, client_info_);\n    }\n  } else {\n    // We should never get an I/O incomplete since we should not execute this\n    // unless the Read has finished and the overlapped event is signaled. If\n    // we do get INCOMPLETE, we have a bug in our code.\n    assert(error_code != ERROR_IO_INCOMPLETE);\n  }\n\n  EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);\n}\n\n// When the server thread serving the client is in the DISCONNECTING state,\n// disconnect from the pipe and reset the event. If anything fails, go into\n// the ERROR state. If it goes well, go into the INITIAL state and set the\n// event to start all over again.\nvoid CrashGenerationServer::HandleDisconnectingState() {\n  assert(server_state_ == IPC_SERVER_STATE_DISCONNECTING);\n\n  // Done serving the client.\n  client_info_ = NULL;\n\n  overlapped_.Internal = NULL;\n  overlapped_.InternalHigh = NULL;\n  overlapped_.Offset = 0;\n  overlapped_.OffsetHigh = 0;\n  overlapped_.Pointer = NULL;\n\n  if (!ResetEvent(overlapped_.hEvent)) {\n    EnterErrorState();\n    return;\n  }\n\n  if (!DisconnectNamedPipe(pipe_)) {\n    EnterErrorState();\n    return;\n  }\n\n  // If the server is shutting down do not connect to the\n  // next client.\n  if (shutting_down_) {\n    return;\n  }\n\n  EnterStateImmediately(IPC_SERVER_STATE_INITIAL);\n}\n\nvoid CrashGenerationServer::EnterErrorState() {\n  SetEvent(overlapped_.hEvent);\n  server_state_ = IPC_SERVER_STATE_ERROR;\n}\n\nvoid CrashGenerationServer::EnterStateWhenSignaled(IPCServerState state) {\n  server_state_ = state;\n}\n\nvoid CrashGenerationServer::EnterStateImmediately(IPCServerState state) {\n  server_state_ = state;\n\n  if (!SetEvent(overlapped_.hEvent)) {\n    server_state_ = IPC_SERVER_STATE_ERROR;\n  }\n}\n\nbool CrashGenerationServer::PrepareReply(const ClientInfo& client_info,\n                                         ProtocolMessage* reply) const {\n  reply->tag = MESSAGE_TAG_REGISTRATION_RESPONSE;\n  reply->id = GetCurrentProcessId();\n\n  if (CreateClientHandles(client_info, reply)) {\n    return true;\n  }\n\n  if (reply->dump_request_handle) {\n    CloseHandle(reply->dump_request_handle);\n  }\n\n  if (reply->dump_generated_handle) {\n    CloseHandle(reply->dump_generated_handle);\n  }\n\n  if (reply->server_alive_handle) {\n    CloseHandle(reply->server_alive_handle);\n  }\n\n  return false;\n}\n\nbool CrashGenerationServer::CreateClientHandles(const ClientInfo& client_info,\n                                                ProtocolMessage* reply) const {\n  HANDLE current_process = GetCurrentProcess();\n  if (!DuplicateHandle(current_process,\n                       client_info.dump_requested_handle(),\n                       client_info.process_handle(),\n                       &reply->dump_request_handle,\n                       kDumpRequestEventAccess,\n                       FALSE,\n                       0)) {\n    return false;\n  }\n\n  if (!DuplicateHandle(current_process,\n                       client_info.dump_generated_handle(),\n                       client_info.process_handle(),\n                       &reply->dump_generated_handle,\n                       kDumpGeneratedEventAccess,\n                       FALSE,\n                       0)) {\n    return false;\n  }\n\n  if (!DuplicateHandle(current_process,\n                       server_alive_handle_,\n                       client_info.process_handle(),\n                       &reply->server_alive_handle,\n                       kMutexAccess,\n                       FALSE,\n                       0)) {\n    return false;\n  }\n\n  return true;\n}\n\nbool CrashGenerationServer::RespondToClient(ClientInfo* client_info) {\n  ProtocolMessage reply;\n  if (!PrepareReply(*client_info, &reply)) {\n    return false;\n  }\n\n  DWORD bytes_count = 0;\n  bool success = WriteFile(pipe_,\n                            &reply,\n                            sizeof(reply),\n                            &bytes_count,\n                            &overlapped_) != FALSE;\n  DWORD error_code = success ? ERROR_SUCCESS : GetLastError();\n\n  if (!success && error_code != ERROR_IO_PENDING) {\n    return false;\n  }\n\n  // Takes over ownership of client_info. We MUST return true if AddClient\n  // succeeds.\n  if (!AddClient(client_info)) {\n    return false;\n  }\n\n  return true;\n}\n\n// The server thread servicing the clients runs this method. The method\n// implements the state machine described in ReadMe.txt along with the\n// helper methods HandleXXXState.\nvoid CrashGenerationServer::HandleConnectionRequest() {\n  AutoCriticalSection lock(&sync_);\n\n  // If we are shutting doen then get into ERROR state, reset the event so more\n  // workers don't run and return immediately.\n  if (shutting_down_) {\n    server_state_ = IPC_SERVER_STATE_ERROR;\n    ResetEvent(overlapped_.hEvent);\n    return;\n  }\n\n  switch (server_state_) {\n    case IPC_SERVER_STATE_ERROR:\n      HandleErrorState();\n      break;\n\n    case IPC_SERVER_STATE_INITIAL:\n      HandleInitialState();\n      break;\n\n    case IPC_SERVER_STATE_CONNECTING:\n      HandleConnectingState();\n      break;\n\n    case IPC_SERVER_STATE_CONNECTED:\n      HandleConnectedState();\n      break;\n\n    case IPC_SERVER_STATE_READING:\n      HandleReadingState();\n      break;\n\n    case IPC_SERVER_STATE_READ_DONE:\n      HandleReadDoneState();\n      break;\n\n    case IPC_SERVER_STATE_WRITING:\n      HandleWritingState();\n      break;\n\n    case IPC_SERVER_STATE_WRITE_DONE:\n      HandleWriteDoneState();\n      break;\n\n    case IPC_SERVER_STATE_READING_ACK:\n      HandleReadingAckState();\n      break;\n\n    case IPC_SERVER_STATE_DISCONNECTING:\n      HandleDisconnectingState();\n      break;\n\n    default:\n      assert(false);\n      // This indicates that we added one more state without\n      // adding handling code.\n      server_state_ = IPC_SERVER_STATE_ERROR;\n      break;\n  }\n}\n\nbool CrashGenerationServer::AddClient(ClientInfo* client_info) {\n  HANDLE request_wait_handle = NULL;\n  if (!RegisterWaitForSingleObject(&request_wait_handle,\n                                   client_info->dump_requested_handle(),\n                                   OnDumpRequest,\n                                   client_info,\n                                   INFINITE,\n                                   kDumpRequestThreadFlags)) {\n    return false;\n  }\n\n  client_info->set_dump_request_wait_handle(request_wait_handle);\n\n  // OnClientEnd will be called when the client process terminates.\n  HANDLE process_wait_handle = NULL;\n  if (!RegisterWaitForSingleObject(&process_wait_handle,\n                                   client_info->process_handle(),\n                                   OnClientEnd,\n                                   client_info,\n                                   INFINITE,\n                                   WT_EXECUTEONLYONCE)) {\n    return false;\n  }\n\n  client_info->set_process_exit_wait_handle(process_wait_handle);\n\n  // New scope to hold the lock for the shortest time.\n  {\n    AutoCriticalSection lock(&sync_);\n    clients_.push_back(client_info);\n  }\n\n  return true;\n}\n\n// static\nvoid CALLBACK CrashGenerationServer::OnPipeConnected(void* context, BOOLEAN) {\n  assert(context);\n\n  CrashGenerationServer* obj =\n      reinterpret_cast<CrashGenerationServer*>(context);\n  obj->HandleConnectionRequest();\n}\n\n// static\nvoid CALLBACK CrashGenerationServer::OnDumpRequest(void* context, BOOLEAN) {\n  assert(context);\n  ClientInfo* client_info = reinterpret_cast<ClientInfo*>(context);\n  client_info->PopulateCustomInfo();\n\n  CrashGenerationServer* crash_server = client_info->crash_server();\n  assert(crash_server);\n  crash_server->HandleDumpRequest(*client_info);\n\n  ResetEvent(client_info->dump_requested_handle());\n}\n\n// static\nvoid CALLBACK CrashGenerationServer::OnClientEnd(void* context, BOOLEAN) {\n  assert(context);\n  ClientInfo* client_info = reinterpret_cast<ClientInfo*>(context);\n\n  CrashGenerationServer* crash_server = client_info->crash_server();\n  assert(crash_server);\n\n  client_info->UnregisterWaits();\n  InterlockedIncrement(&crash_server->cleanup_item_count_);\n\n  if (!QueueUserWorkItem(CleanupClient, context, WT_EXECUTEDEFAULT)) {\n    InterlockedDecrement(&crash_server->cleanup_item_count_);\n  }\n}\n\n// static\nDWORD WINAPI CrashGenerationServer::CleanupClient(void* context) {\n  assert(context);\n  ClientInfo* client_info = reinterpret_cast<ClientInfo*>(context);\n\n  CrashGenerationServer* crash_server = client_info->crash_server();\n  assert(crash_server);\n\n  if (crash_server->exit_callback_) {\n    crash_server->exit_callback_(crash_server->exit_context_, client_info);\n  }\n\n  crash_server->DoCleanup(client_info);\n\n  InterlockedDecrement(&crash_server->cleanup_item_count_);\n  return 0;\n}\n\nvoid CrashGenerationServer::DoCleanup(ClientInfo* client_info) {\n  assert(client_info);\n\n  // Start a new scope to release lock automatically.\n  {\n    AutoCriticalSection lock(&sync_);\n    clients_.remove(client_info);\n  }\n\n  delete client_info;\n}\n\nvoid CrashGenerationServer::HandleDumpRequest(const ClientInfo& client_info) {\n  // Generate the dump only if it's explicitly requested by the\n  // server application; otherwise the server might want to generate\n  // dump in the callback.\n  std::wstring dump_path;\n  if (generate_dumps_) {\n    if (!GenerateDump(client_info, &dump_path)) {\n      return;\n    }\n  }\n\n  if (dump_callback_) {\n    std::wstring* ptr_dump_path = (dump_path == L\"\") ? NULL : &dump_path;\n    dump_callback_(dump_context_, &client_info, ptr_dump_path);\n  }\n\n  SetEvent(client_info.dump_generated_handle());\n}\n\nbool CrashGenerationServer::GenerateDump(const ClientInfo& client,\n                                         std::wstring* dump_path) {\n  assert(client.pid() != 0);\n  assert(client.process_handle());\n\n  // We have to get the address of EXCEPTION_INFORMATION from\n  // the client process address space.\n  EXCEPTION_POINTERS* client_ex_info = NULL;\n  if (!client.GetClientExceptionInfo(&client_ex_info)) {\n    return false;\n  }\n\n  DWORD client_thread_id = 0;\n  if (!client.GetClientThreadId(&client_thread_id)) {\n    return false;\n  }\n\n  return dump_generator_->WriteMinidump(client.process_handle(),\n                                        client.pid(),\n                                        client_thread_id,\n                                        GetCurrentThreadId(),\n                                        client_ex_info,\n                                        client.assert_info(),\n                                        client.dump_type(),\n                                        true,\n                                        dump_path);\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/crash_generation/crash_generation_server.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__\n#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__\n\n#include <list>\n#include <string>\n#include \"client/windows/common/ipc_protocol.h\"\n#include \"client/windows/crash_generation/minidump_generator.h\"\n#include \"processor/scoped_ptr.h\"\n\nnamespace google_breakpad {\nclass ClientInfo;\n\n// Abstraction for server side implementation of out-of-process crash\n// generation protocol for Windows platform only. It generates Windows\n// minidump files for client processes that request dump generation. When\n// the server is requested to start listening for clients (by calling the\n// Start method), it creates a named pipe and waits for the clients to\n// register. In response, it hands them event handles that the client can\n// signal to request dump generation. When the clients request dump\n// generation in this way, the server generates Windows minidump files.\nclass CrashGenerationServer {\n public:\n  typedef void (*OnClientConnectedCallback)(void* context,\n                                            const ClientInfo* client_info);\n\n  typedef void (*OnClientDumpRequestCallback)(void* context,\n                                              const ClientInfo* client_info,\n                                              const std::wstring* file_path);\n\n  typedef void (*OnClientExitedCallback)(void* context,\n                                         const ClientInfo* client_info);\n\n  typedef void (*OnClientUploadRequestCallback)(void* context,\n                                                const DWORD crash_id);\n\n  // Creates an instance with the given parameters.\n  //\n  // Parameter pipe_name: Name of the Windows named pipe\n  // Parameter pipe_sec_attrs Security attributes to set on the pipe. Pass\n  //     NULL to use default security on the pipe. By default, the pipe created\n  //     allows Local System, Administrators and the Creator full control and\n  //     the Everyone group read access on the pipe.\n  // Parameter connect_callback: Callback for a new client connection.\n  // Parameter connect_context: Context for client connection callback.\n  // Parameter crash_callback: Callback for a client crash dump request.\n  // Parameter crash_context: Context for client crash dump request callback.\n  // Parameter exit_callback: Callback for client process exit.\n  // Parameter exit_context: Context for client exit callback.\n  // Parameter generate_dumps: Whether to automatically generate dumps.\n  // Client code of this class might want to generate dumps explicitly in the\n  // crash dump request callback. In that case, false can be passed for this\n  // parameter.\n  // Parameter dump_path: Path for generating dumps; required only if true is\n  // passed for generateDumps parameter; NULL can be passed otherwise.\n  CrashGenerationServer(const std::wstring& pipe_name,\n                        SECURITY_ATTRIBUTES* pipe_sec_attrs,\n                        OnClientConnectedCallback connect_callback,\n                        void* connect_context,\n                        OnClientDumpRequestCallback dump_callback,\n                        void* dump_context,\n                        OnClientExitedCallback exit_callback,\n                        void* exit_context,\n                        OnClientUploadRequestCallback upload_request_callback,\n                        void* upload_context,\n                        bool generate_dumps,\n                        const std::wstring* dump_path);\n\n  ~CrashGenerationServer();\n\n  // Performs initialization steps needed to start listening to clients. Upon\n  // successful return clients may connect to this server's pipe.\n  //\n  // Returns true if initialization is successful; false otherwise.\n  bool Start();\n\n private:\n  // Various states the client can be in during the handshake with\n  // the server.\n  enum IPCServerState {\n    // Server starts in this state.\n    IPC_SERVER_STATE_UNINITIALIZED,\n\n    // Server is in error state and it cannot serve any clients.\n    IPC_SERVER_STATE_ERROR,\n\n    // Server starts in this state.\n    IPC_SERVER_STATE_INITIAL,\n\n    // Server has issued an async connect to the pipe and it is waiting\n    // for the connection to be established.\n    IPC_SERVER_STATE_CONNECTING,\n\n    // Server is connected successfully.\n    IPC_SERVER_STATE_CONNECTED,\n\n    // Server has issued an async read from the pipe and it is waiting for\n    // the read to finish.\n    IPC_SERVER_STATE_READING,\n\n    // Server is done reading from the pipe.\n    IPC_SERVER_STATE_READ_DONE,\n\n    // Server has issued an async write to the pipe and it is waiting for\n    // the write to finish.\n    IPC_SERVER_STATE_WRITING,\n\n    // Server is done writing to the pipe.\n    IPC_SERVER_STATE_WRITE_DONE,\n\n    // Server has issued an async read from the pipe for an ack and it\n    // is waiting for the read to finish.\n    IPC_SERVER_STATE_READING_ACK,\n\n    // Server is done writing to the pipe and it is now ready to disconnect\n    // and reconnect.\n    IPC_SERVER_STATE_DISCONNECTING\n  };\n\n  //\n  // Helper methods to handle various server IPC states.\n  //\n  void HandleErrorState();\n  void HandleInitialState();\n  void HandleConnectingState();\n  void HandleConnectedState();\n  void HandleReadingState();\n  void HandleReadDoneState();\n  void HandleWritingState();\n  void HandleWriteDoneState();\n  void HandleReadingAckState();\n  void HandleDisconnectingState();\n\n  // Prepares reply for a client from the given parameters.\n  bool PrepareReply(const ClientInfo& client_info,\n                    ProtocolMessage* reply) const;\n\n  // Duplicates various handles in the ClientInfo object for the client\n  // process and stores them in the given ProtocolMessage instance. If\n  // creating any handle fails, ProtocolMessage will contain the handles\n  // already created successfully, which should be closed by the caller.\n  bool CreateClientHandles(const ClientInfo& client_info,\n                           ProtocolMessage* reply) const;\n\n  // Response to the given client. Return true if all steps of\n  // responding to the client succeed, false otherwise.\n  bool RespondToClient(ClientInfo* client_info);\n\n  // Handles a connection request from the client.\n  void HandleConnectionRequest();\n\n  // Handles a dump request from the client.\n  void HandleDumpRequest(const ClientInfo& client_info);\n\n  // Callback for pipe connected event.\n  static void CALLBACK OnPipeConnected(void* context, BOOLEAN timer_or_wait);\n\n  // Callback for a dump request.\n  static void CALLBACK OnDumpRequest(void* context, BOOLEAN timer_or_wait);\n\n  // Callback for client process exit event.\n  static void CALLBACK OnClientEnd(void* context, BOOLEAN timer_or_wait);\n\n  // Releases resources for a client.\n  static DWORD WINAPI CleanupClient(void* context);\n\n  // Cleans up for the given client.\n  void DoCleanup(ClientInfo* client_info);\n\n  // Adds the given client to the list of registered clients.\n  bool AddClient(ClientInfo* client_info);\n\n  // Generates dump for the given client.\n  bool GenerateDump(const ClientInfo& client, std::wstring* dump_path);\n\n  // Puts the server in a permanent error state and sets a signal such that\n  // the state will be immediately entered after the current state transition\n  // is complete.\n  void EnterErrorState();\n\n  // Puts the server in the specified state and sets a signal such that the\n  // state is immediately entered after the current state transition is\n  // complete.\n  void EnterStateImmediately(IPCServerState state);\n\n  // Puts the server in the specified state. No signal will be set, so the state\n  // transition will only occur when signaled manually or by completion of an\n  // asynchronous IO operation.\n  void EnterStateWhenSignaled(IPCServerState state);\n\n  // Sync object for thread-safe access to the shared list of clients and\n  // the server's state.\n  CRITICAL_SECTION sync_;\n\n  // List of clients.\n  std::list<ClientInfo*> clients_;\n\n  // Pipe name.\n  std::wstring pipe_name_;\n\n  // Pipe security attributes\n  SECURITY_ATTRIBUTES* pipe_sec_attrs_;\n\n  // Handle to the pipe used for handshake with clients.\n  HANDLE pipe_;\n\n  // Pipe wait handle.\n  HANDLE pipe_wait_handle_;\n\n  // Handle to server-alive mutex.\n  HANDLE server_alive_handle_;\n\n  // Callback for a successful client connection.\n  OnClientConnectedCallback connect_callback_;\n\n  // Context for client connected callback.\n  void* connect_context_;\n\n  // Callback for a client dump request.\n  OnClientDumpRequestCallback dump_callback_;\n\n  // Context for client dump request callback.\n  void* dump_context_;\n\n  // Callback for client process exit.\n  OnClientExitedCallback exit_callback_;\n\n  // Context for client process exit callback.\n  void* exit_context_;\n\n  // Callback for upload request.\n  OnClientUploadRequestCallback upload_request_callback_;\n\n  // Context for upload request callback.\n  void* upload_context_;\n\n  // Whether to generate dumps.\n  bool generate_dumps_;\n\n  // Instance of a mini dump generator.\n  scoped_ptr<MinidumpGenerator> dump_generator_;\n\n  // State of the server in performing the IPC with the client.\n  // Note that since we restrict the pipe to one instance, we\n  // only need to keep one state of the server. Otherwise, server\n  // would have one state per client it is talking to.\n  IPCServerState server_state_;\n\n  // Whether the server is shutting down.\n  bool shutting_down_;\n\n  // Overlapped instance for async I/O on the pipe.\n  OVERLAPPED overlapped_;\n\n  // Message object used in IPC with the client.\n  ProtocolMessage msg_;\n\n  // Client Info for the client that's connecting to the server.\n  ClientInfo* client_info_;\n\n  // Count of clean-up work items that are currently running or are\n  // already queued to run.\n  volatile LONG cleanup_item_count_;\n\n  // Disable copy ctor and operator=.\n  CrashGenerationServer(const CrashGenerationServer& crash_server);\n  CrashGenerationServer& operator=(const CrashGenerationServer& crash_server);\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/crash_generation/minidump_generator.cc",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"client/windows/crash_generation/minidump_generator.h\"\n#include <cassert>\n#include \"client/windows/common/auto_critical_section.h\"\n#include \"common/windows/guid_string.h\"\n\nusing std::wstring;\n\nnamespace google_breakpad {\n\nMinidumpGenerator::MinidumpGenerator(const wstring& dump_path)\n    : dbghelp_module_(NULL),\n      rpcrt4_module_(NULL),\n      dump_path_(dump_path),\n      write_dump_(NULL),\n      create_uuid_(NULL) {\n  InitializeCriticalSection(&module_load_sync_);\n  InitializeCriticalSection(&get_proc_address_sync_);\n}\n\nMinidumpGenerator::~MinidumpGenerator() {\n  if (dbghelp_module_) {\n    FreeLibrary(dbghelp_module_);\n  }\n\n  if (rpcrt4_module_) {\n    FreeLibrary(rpcrt4_module_);\n  }\n\n  DeleteCriticalSection(&get_proc_address_sync_);\n  DeleteCriticalSection(&module_load_sync_);\n}\n\nbool MinidumpGenerator::WriteMinidump(HANDLE process_handle,\n                                      DWORD process_id,\n                                      DWORD thread_id,\n                                      DWORD requesting_thread_id,\n                                      EXCEPTION_POINTERS* exception_pointers,\n                                      MDRawAssertionInfo* assert_info,\n                                      MINIDUMP_TYPE dump_type,\n                                      bool is_client_pointers,\n                                      wstring* dump_path) {\n  // Just call the full WriteMinidump with NULL as the full_dump_path.\n  return this->WriteMinidump(process_handle, process_id, thread_id,\n                             requesting_thread_id, exception_pointers,\n                             assert_info, dump_type, is_client_pointers,\n                             dump_path, NULL);\n}\n\nbool MinidumpGenerator::WriteMinidump(HANDLE process_handle,\n                                      DWORD process_id,\n                                      DWORD thread_id,\n                                      DWORD requesting_thread_id,\n                                      EXCEPTION_POINTERS* exception_pointers,\n                                      MDRawAssertionInfo* assert_info,\n                                      MINIDUMP_TYPE dump_type,\n                                      bool is_client_pointers,\n                                      wstring* dump_path,\n                                      wstring* full_dump_path) {\n  MiniDumpWriteDumpType write_dump = GetWriteDump();\n  if (!write_dump) {\n    return false;\n  }\n\n  wstring dump_file_path;\n  if (!GenerateDumpFilePath(&dump_file_path)) {\n    return false;\n  }\n\n  // If the client requests a full memory dump, we will write a normal mini\n  // dump and a full memory dump. Both dump files use the same uuid as file\n  // name prefix.\n  bool full_memory_dump = (dump_type & MiniDumpWithFullMemory) != 0;\n  wstring full_dump_file_path;\n  if (full_memory_dump) {\n    full_dump_file_path.assign(dump_file_path);\n    full_dump_file_path.resize(full_dump_file_path.size() - 4);  // strip .dmp\n    full_dump_file_path.append(TEXT(\"-full.dmp\"));\n  }\n\n  HANDLE dump_file = CreateFile(dump_file_path.c_str(),\n                                GENERIC_WRITE,\n                                0,\n                                NULL,\n                                CREATE_NEW,\n                                FILE_ATTRIBUTE_NORMAL,\n                                NULL);\n\n  if (dump_file == INVALID_HANDLE_VALUE) {\n    return false;\n  }\n\n  HANDLE full_dump_file = INVALID_HANDLE_VALUE;\n  if (full_memory_dump) {\n    full_dump_file = CreateFile(full_dump_file_path.c_str(),\n                                GENERIC_WRITE,\n                                0,\n                                NULL,\n                                CREATE_NEW,\n                                FILE_ATTRIBUTE_NORMAL,\n                                NULL);\n\n    if (full_dump_file == INVALID_HANDLE_VALUE) {\n      CloseHandle(dump_file);\n      return false;\n    }\n  }\n\n  MINIDUMP_EXCEPTION_INFORMATION* dump_exception_pointers = NULL;\n  MINIDUMP_EXCEPTION_INFORMATION dump_exception_info;\n\n  // Setup the exception information object only if it's a dump\n  // due to an exception.\n  if (exception_pointers) {\n    dump_exception_pointers = &dump_exception_info;\n    dump_exception_info.ThreadId = thread_id;\n    dump_exception_info.ExceptionPointers = exception_pointers;\n    dump_exception_info.ClientPointers = is_client_pointers;\n  }\n\n  // Add an MDRawBreakpadInfo stream to the minidump, to provide additional\n  // information about the exception handler to the Breakpad processor.\n  // The information will help the processor determine which threads are\n  // relevant. The Breakpad processor does not require this information but\n  // can function better with Breakpad-generated dumps when it is present.\n  // The native debugger is not harmed by the presence of this information.\n  MDRawBreakpadInfo breakpad_info = {0};\n  if (!is_client_pointers) {\n    // Set the dump thread id and requesting thread id only in case of\n    // in-process dump generation.\n    breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID |\n                             MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID;\n    breakpad_info.dump_thread_id = thread_id;\n    breakpad_info.requesting_thread_id = requesting_thread_id;\n  }\n\n  // Leave room in user_stream_array for a possible assertion info stream.\n  MINIDUMP_USER_STREAM user_stream_array[2];\n  user_stream_array[0].Type = MD_BREAKPAD_INFO_STREAM;\n  user_stream_array[0].BufferSize = sizeof(breakpad_info);\n  user_stream_array[0].Buffer = &breakpad_info;\n\n  MINIDUMP_USER_STREAM_INFORMATION user_streams;\n  user_streams.UserStreamCount = 1;\n  user_streams.UserStreamArray = user_stream_array;\n\n  MDRawAssertionInfo* actual_assert_info = assert_info;\n  MDRawAssertionInfo client_assert_info = {0};\n\n  if (assert_info) {\n    // If the assertion info object lives in the client process,\n    // read the memory of the client process.\n    if (is_client_pointers) {\n      SIZE_T bytes_read = 0;\n      if (!ReadProcessMemory(process_handle,\n                             assert_info,\n                             &client_assert_info,\n                             sizeof(client_assert_info),\n                             &bytes_read)) {\n        CloseHandle(dump_file);\n        if (full_dump_file != INVALID_HANDLE_VALUE)\n          CloseHandle(full_dump_file);\n        return false;\n      }\n\n      if (bytes_read != sizeof(client_assert_info)) {\n        CloseHandle(dump_file);\n        if (full_dump_file != INVALID_HANDLE_VALUE)\n          CloseHandle(full_dump_file);\n        return false;\n      }\n\n      actual_assert_info  = &client_assert_info;\n    }\n\n    user_stream_array[1].Type = MD_ASSERTION_INFO_STREAM;\n    user_stream_array[1].BufferSize = sizeof(MDRawAssertionInfo);\n    user_stream_array[1].Buffer = actual_assert_info;\n    ++user_streams.UserStreamCount;\n  }\n\n  bool result_minidump = write_dump(\n      process_handle,\n      process_id,\n      dump_file,\n      static_cast<MINIDUMP_TYPE>((dump_type & (~MiniDumpWithFullMemory))\n                                  | MiniDumpNormal),\n      exception_pointers ? &dump_exception_info : NULL,\n      &user_streams,\n      NULL) != FALSE;\n\n  bool result_full_memory = true;\n  if (full_memory_dump) {\n    result_full_memory = write_dump(\n        process_handle,\n        process_id,\n        full_dump_file,\n        static_cast<MINIDUMP_TYPE>(dump_type & (~MiniDumpNormal)),\n        exception_pointers ? &dump_exception_info : NULL,\n        &user_streams,\n        NULL) != FALSE;\n  }\n\n  bool result = result_minidump && result_full_memory;\n\n  CloseHandle(dump_file);\n  if (full_dump_file != INVALID_HANDLE_VALUE)\n    CloseHandle(full_dump_file);\n\n  // Store the path of the dump file in the out parameter if dump generation\n  // succeeded.\n  if (result && dump_path) {\n    *dump_path = dump_file_path;\n  }\n  if (result && full_memory_dump && full_dump_path) {\n    *full_dump_path = full_dump_file_path;\n  }\n\n  return result;\n}\n\nHMODULE MinidumpGenerator::GetDbghelpModule() {\n  AutoCriticalSection lock(&module_load_sync_);\n  if (!dbghelp_module_) {\n    dbghelp_module_ = LoadLibrary(TEXT(\"dbghelp.dll\"));\n  }\n\n  return dbghelp_module_;\n}\n\nMinidumpGenerator::MiniDumpWriteDumpType MinidumpGenerator::GetWriteDump() {\n  AutoCriticalSection lock(&get_proc_address_sync_);\n  if (!write_dump_) {\n    HMODULE module = GetDbghelpModule();\n    if (module) {\n      FARPROC proc = GetProcAddress(module, \"MiniDumpWriteDump\");\n      write_dump_ = reinterpret_cast<MiniDumpWriteDumpType>(proc);\n    }\n  }\n\n  return write_dump_;\n}\n\nHMODULE MinidumpGenerator::GetRpcrt4Module() {\n  AutoCriticalSection lock(&module_load_sync_);\n  if (!rpcrt4_module_) {\n    rpcrt4_module_ = LoadLibrary(TEXT(\"rpcrt4.dll\"));\n  }\n\n  return rpcrt4_module_;\n}\n\nMinidumpGenerator::UuidCreateType MinidumpGenerator::GetCreateUuid() {\n  AutoCriticalSection lock(&module_load_sync_);\n  if (!create_uuid_) {\n    HMODULE module = GetRpcrt4Module();\n    if (module) {\n      FARPROC proc = GetProcAddress(module, \"UuidCreate\");\n      create_uuid_ = reinterpret_cast<UuidCreateType>(proc);\n    }\n  }\n\n  return create_uuid_;\n}\n\nbool MinidumpGenerator::GenerateDumpFilePath(wstring* file_path) {\n  UUID id = {0};\n\n  UuidCreateType create_uuid = GetCreateUuid();\n  if (!create_uuid) {\n    return false;\n  }\n\n  create_uuid(&id);\n  wstring id_str = GUIDString::GUIDToWString(&id);\n\n  *file_path = dump_path_ + TEXT(\"\\\\\") + id_str + TEXT(\".dmp\");\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/crash_generation/minidump_generator.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATOR_H_\n#define CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATOR_H_\n\n#include <windows.h>\n#include <dbghelp.h>\n#include <list>\n#include \"google_breakpad/common/minidump_format.h\"\n\nnamespace google_breakpad {\n\n// Abstraction for various objects and operations needed to generate\n// minidump on Windows. This abstraction is useful to hide all the gory\n// details for minidump generation and provide a clean interface to\n// the clients to generate minidumps.\nclass MinidumpGenerator {\n public:\n  // Creates an instance with the given dump path.\n  explicit MinidumpGenerator(const std::wstring& dump_path);\n\n  ~MinidumpGenerator();\n\n  // Writes the minidump with the given parameters. Stores the\n  // dump file path in the dump_path parameter if dump generation\n  // succeeds.\n  bool WriteMinidump(HANDLE process_handle,\n                     DWORD process_id,\n                     DWORD thread_id,\n                     DWORD requesting_thread_id,\n                     EXCEPTION_POINTERS* exception_pointers,\n                     MDRawAssertionInfo* assert_info,\n                     MINIDUMP_TYPE dump_type,\n                     bool is_client_pointers,\n                     std::wstring* dump_path);\n\n  // Writes the minidump with the given parameters. Stores the dump file\n  // path in the dump_path (and full_dump_path) parameter if dump\n  // generation succeeds. full_dump_path and dump_path can be NULL.\n  bool WriteMinidump(HANDLE process_handle,\n                     DWORD process_id,\n                     DWORD thread_id,\n                     DWORD requesting_thread_id,\n                     EXCEPTION_POINTERS* exception_pointers,\n                     MDRawAssertionInfo* assert_info,\n                     MINIDUMP_TYPE dump_type,\n                     bool is_client_pointers,\n                     std::wstring* dump_path,\n                     std::wstring* full_dump_path);\n\n private:\n  // Function pointer type for MiniDumpWriteDump, which is looked up\n  // dynamically.\n  typedef BOOL (WINAPI* MiniDumpWriteDumpType)(\n      HANDLE hProcess,\n      DWORD ProcessId,\n      HANDLE hFile,\n      MINIDUMP_TYPE DumpType,\n      CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,\n      CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,\n      CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);\n\n  // Function pointer type for UuidCreate, which is looked up dynamically.\n  typedef RPC_STATUS (RPC_ENTRY* UuidCreateType)(UUID* Uuid);\n\n  // Loads the appropriate DLL lazily in a thread safe way.\n  HMODULE GetDbghelpModule();\n\n  // Loads the appropriate DLL and gets a pointer to the MiniDumpWriteDump\n  // function lazily and in a thread-safe manner.\n  MiniDumpWriteDumpType GetWriteDump();\n\n  // Loads the appropriate DLL lazily in a thread safe way.\n  HMODULE GetRpcrt4Module();\n\n  // Loads the appropriate DLL and gets a pointer to the UuidCreate\n  // function lazily and in a thread-safe manner.\n  UuidCreateType GetCreateUuid();\n\n  // Returns the path for the file to write dump to.\n  bool GenerateDumpFilePath(std::wstring* file_path);\n\n  // Handle to dynamically loaded DbgHelp.dll.\n  HMODULE dbghelp_module_;\n\n  // Pointer to the MiniDumpWriteDump function.\n  MiniDumpWriteDumpType write_dump_;\n\n  // Handle to dynamically loaded rpcrt4.dll.\n  HMODULE rpcrt4_module_;\n\n  // Pointer to the UuidCreate function.\n  UuidCreateType create_uuid_;\n\n  // Folder path to store dump files.\n  std::wstring dump_path_;\n\n  // Critical section to sychronize action of loading modules dynamically.\n  CRITICAL_SECTION module_load_sync_;\n\n  // Critical section to synchronize action of dynamically getting function\n  // addresses from modules.\n  CRITICAL_SECTION get_proc_address_sync_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATOR_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/handler/exception_handler.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <objbase.h>\n\n#include <algorithm>\n#include <cassert>\n#include <cstdio>\n\n#include \"common/windows/string_utils-inl.h\"\n\n#include \"client/windows/common/ipc_protocol.h\"\n#include \"client/windows/handler/exception_handler.h\"\n#include \"common/windows/guid_string.h\"\n\nnamespace google_breakpad {\n\nstatic const int kWaitForHandlerThreadMs = 60000;\nstatic const int kExceptionHandlerThreadInitialStackSize = 64 * 1024;\n\n// This is passed as the context to the MinidumpWriteDump callback.\ntypedef struct {\n  ULONG64 memory_base;\n  ULONG memory_size;\n  bool finished;\n} MinidumpCallbackContext;\n\nvector<ExceptionHandler*>* ExceptionHandler::handler_stack_ = NULL;\nLONG ExceptionHandler::handler_stack_index_ = 0;\nCRITICAL_SECTION ExceptionHandler::handler_stack_critical_section_;\nvolatile LONG ExceptionHandler::instance_count_ = 0;\n\nExceptionHandler::ExceptionHandler(const wstring& dump_path,\n                                   FilterCallback filter,\n                                   MinidumpCallback callback,\n                                   void* callback_context,\n                                   int handler_types,\n                                   MINIDUMP_TYPE dump_type,\n                                   const wchar_t* pipe_name,\n                                   const CustomClientInfo* custom_info) {\n  Initialize(dump_path,\n             filter,\n             callback,\n             callback_context,\n             handler_types,\n             dump_type,\n             pipe_name,\n             custom_info);\n}\n\nExceptionHandler::ExceptionHandler(const wstring &dump_path,\n                                   FilterCallback filter,\n                                   MinidumpCallback callback,\n                                   void* callback_context,\n                                   int handler_types) {\n  Initialize(dump_path,\n             filter,\n             callback,\n             callback_context,\n             handler_types,\n             MiniDumpNormal,\n             NULL,\n             NULL);\n}\n\nvoid ExceptionHandler::Initialize(const wstring& dump_path,\n                                  FilterCallback filter,\n                                  MinidumpCallback callback,\n                                  void* callback_context,\n                                  int handler_types,\n                                  MINIDUMP_TYPE dump_type,\n                                  const wchar_t* pipe_name,\n                                  const CustomClientInfo* custom_info) {\n  LONG instance_count = InterlockedIncrement(&instance_count_);\n  filter_ = filter;\n  callback_ = callback;\n  callback_context_ = callback_context;\n  dump_path_c_ = NULL;\n  next_minidump_id_c_ = NULL;\n  next_minidump_path_c_ = NULL;\n  dbghelp_module_ = NULL;\n  minidump_write_dump_ = NULL;\n  dump_type_ = dump_type;\n  rpcrt4_module_ = NULL;\n  uuid_create_ = NULL;\n  handler_types_ = handler_types;\n  previous_filter_ = NULL;\n#if _MSC_VER >= 1400  // MSVC 2005/8\n  previous_iph_ = NULL;\n#endif  // _MSC_VER >= 1400\n  previous_pch_ = NULL;\n  handler_thread_ = NULL;\n  is_shutdown_ = false;\n  handler_start_semaphore_ = NULL;\n  handler_finish_semaphore_ = NULL;\n  requesting_thread_id_ = 0;\n  exception_info_ = NULL;\n  assertion_ = NULL;\n  handler_return_value_ = false;\n  handle_debug_exceptions_ = false;\n\n  // Attempt to use out-of-process if user has specified pipe name.\n  if (pipe_name != NULL) {\n    scoped_ptr<CrashGenerationClient> client(\n        new CrashGenerationClient(pipe_name,\n                                  dump_type_,\n                                  custom_info));\n\n    // If successful in registering with the monitoring process,\n    // there is no need to setup in-process crash generation.\n    if (client->Register()) {\n      crash_generation_client_.reset(client.release());\n    }\n  }\n\n  if (!IsOutOfProcess()) {\n    // Either client did not ask for out-of-process crash generation\n    // or registration with the server process failed. In either case,\n    // setup to do in-process crash generation.\n\n    // Set synchronization primitives and the handler thread.  Each\n    // ExceptionHandler object gets its own handler thread because that's the\n    // only way to reliably guarantee sufficient stack space in an exception,\n    // and it allows an easy way to get a snapshot of the requesting thread's\n    // context outside of an exception.\n    InitializeCriticalSection(&handler_critical_section_);\n    handler_start_semaphore_ = CreateSemaphore(NULL, 0, 1, NULL);\n    assert(handler_start_semaphore_ != NULL);\n\n    handler_finish_semaphore_ = CreateSemaphore(NULL, 0, 1, NULL);\n    assert(handler_finish_semaphore_ != NULL);\n\n    // Don't attempt to create the thread if we could not create the semaphores.\n    if (handler_finish_semaphore_ != NULL && handler_start_semaphore_ != NULL) {\n      DWORD thread_id;\n      handler_thread_ = CreateThread(NULL,         // lpThreadAttributes\n                                     kExceptionHandlerThreadInitialStackSize,\n                                     ExceptionHandlerThreadMain,\n                                     this,         // lpParameter\n                                     0,            // dwCreationFlags\n                                     &thread_id);\n      assert(handler_thread_ != NULL);\n    }\n\n    dbghelp_module_ = LoadLibrary(L\"dbghelp.dll\");\n    if (dbghelp_module_) {\n      minidump_write_dump_ = reinterpret_cast<MiniDumpWriteDump_type>(\n          GetProcAddress(dbghelp_module_, \"MiniDumpWriteDump\"));\n    }\n\n    // Load this library dynamically to not affect existing projects.  Most\n    // projects don't link against this directly, it's usually dynamically\n    // loaded by dependent code.\n    rpcrt4_module_ = LoadLibrary(L\"rpcrt4.dll\");\n    if (rpcrt4_module_) {\n      uuid_create_ = reinterpret_cast<UuidCreate_type>(\n          GetProcAddress(rpcrt4_module_, \"UuidCreate\"));\n    }\n\n    // set_dump_path calls UpdateNextID.  This sets up all of the path and id\n    // strings, and their equivalent c_str pointers.\n    set_dump_path(dump_path);\n  }\n\n  // There is a race condition here. If the first instance has not yet\n  // initialized the critical section, the second (and later) instances may\n  // try to use uninitialized critical section object. The feature of multiple\n  // instances in one module is not used much, so leave it as is for now.\n  // One way to solve this in the current design (that is, keeping the static\n  // handler stack) is to use spin locks with volatile bools to synchronize\n  // the handler stack. This works only if the compiler guarantees to generate\n  // cache coherent code for volatile.\n  // TODO(munjal): Fix this in a better way by changing the design if possible.\n\n  // Lazy initialization of the handler_stack_critical_section_\n  if (instance_count == 1) {\n    InitializeCriticalSection(&handler_stack_critical_section_);\n  }\n\n  if (handler_types != HANDLER_NONE) {\n    EnterCriticalSection(&handler_stack_critical_section_);\n\n    // The first time an ExceptionHandler that installs a handler is\n    // created, set up the handler stack.\n    if (!handler_stack_) {\n      handler_stack_ = new vector<ExceptionHandler*>();\n    }\n    handler_stack_->push_back(this);\n\n    if (handler_types & HANDLER_EXCEPTION)\n      previous_filter_ = SetUnhandledExceptionFilter(HandleException);\n\n#if _MSC_VER >= 1400  // MSVC 2005/8\n    if (handler_types & HANDLER_INVALID_PARAMETER)\n      previous_iph_ = _set_invalid_parameter_handler(HandleInvalidParameter);\n#endif  // _MSC_VER >= 1400\n\n//    if (handler_types & HANDLER_PURECALL)\n//      previous_pch_ = _set_purecall_handler(HandlePureVirtualCall);\n\n    LeaveCriticalSection(&handler_stack_critical_section_);\n  }\n}\n\nExceptionHandler::~ExceptionHandler() {\n  if (dbghelp_module_) {\n    FreeLibrary(dbghelp_module_);\n  }\n\n  if (rpcrt4_module_) {\n    FreeLibrary(rpcrt4_module_);\n  }\n\n  if (handler_types_ != HANDLER_NONE) {\n    EnterCriticalSection(&handler_stack_critical_section_);\n\n    if (handler_types_ & HANDLER_EXCEPTION)\n      SetUnhandledExceptionFilter(previous_filter_);\n\n#if _MSC_VER >= 1400  // MSVC 2005/8\n    if (handler_types_ & HANDLER_INVALID_PARAMETER)\n      _set_invalid_parameter_handler(previous_iph_);\n#endif  // _MSC_VER >= 1400\n\n//    if (handler_types_ & HANDLER_PURECALL)\n//      _set_purecall_handler(previous_pch_);\n\n    if (handler_stack_->back() == this) {\n      handler_stack_->pop_back();\n    } else {\n      // TODO(mmentovai): use advapi32!ReportEvent to log the warning to the\n      // system's application event log.\n      fprintf(stderr, \"warning: removing Breakpad handler out of order\\n\");\n      vector<ExceptionHandler*>::iterator iterator = handler_stack_->begin();\n      while (iterator != handler_stack_->end()) {\n        if (*iterator == this) {\n          iterator = handler_stack_->erase(iterator);\n        } else {\n          ++iterator;\n        }\n      }\n    }\n\n    if (handler_stack_->empty()) {\n      // When destroying the last ExceptionHandler that installed a handler,\n      // clean up the handler stack.\n      delete handler_stack_;\n      handler_stack_ = NULL;\n    }\n\n    LeaveCriticalSection(&handler_stack_critical_section_);\n  }\n\n  // Some of the objects were only initialized if out of process\n  // registration was not done.\n  if (!IsOutOfProcess()) {\n#ifdef BREAKPAD_NO_TERMINATE_THREAD\n    // Clean up the handler thread and synchronization primitives. The handler\n    // thread is either waiting on the semaphore to handle a crash or it is\n    // handling a crash. Coming out of the wait is fast but wait more in the\n    // eventuality a crash is handled.  This compilation option results in a\n    // deadlock if the exception handler is destroyed while executing code\n    // inside DllMain.\n    is_shutdown_ = true;\n    ReleaseSemaphore(handler_start_semaphore_, 1, NULL);\n    WaitForSingleObject(handler_thread_, kWaitForHandlerThreadMs);\n#else\n    TerminateThread(handler_thread_, 1);\n#endif  // BREAKPAD_NO_TERMINATE_THREAD\n\n    CloseHandle(handler_thread_);\n    handler_thread_ = NULL;\n    DeleteCriticalSection(&handler_critical_section_);\n    CloseHandle(handler_start_semaphore_);\n    CloseHandle(handler_finish_semaphore_);\n  }\n\n  // There is a race condition in the code below: if this instance is\n  // deleting the static critical section and a new instance of the class\n  // is created, then there is a possibility that the critical section be\n  // initialized while the same critical section is being deleted. Given the\n  // usage pattern for the code, this race condition is unlikely to hit, but it\n  // is a race condition nonetheless.\n  if (InterlockedDecrement(&instance_count_) == 0) {\n    DeleteCriticalSection(&handler_stack_critical_section_);\n  }\n}\n\nbool ExceptionHandler::RequestUpload(DWORD crash_id) {\n  return crash_generation_client_->RequestUpload(crash_id);\n}\n\n// static\nDWORD ExceptionHandler::ExceptionHandlerThreadMain(void* lpParameter) {\n  ExceptionHandler* self = reinterpret_cast<ExceptionHandler *>(lpParameter);\n  assert(self);\n  assert(self->handler_start_semaphore_ != NULL);\n  assert(self->handler_finish_semaphore_ != NULL);\n\n  while (true) {\n    if (WaitForSingleObject(self->handler_start_semaphore_, INFINITE) ==\n        WAIT_OBJECT_0) {\n      // Perform the requested action.\n      if (self->is_shutdown_) {\n        // The instance of the exception handler is being destroyed.\n        break;\n      } else {\n        self->handler_return_value_ =\n            self->WriteMinidumpWithException(self->requesting_thread_id_,\n                                             self->exception_info_,\n                                             self->assertion_);\n      }\n\n      // Allow the requesting thread to proceed.\n      ReleaseSemaphore(self->handler_finish_semaphore_, 1, NULL);\n    }\n  }\n\n  // This statement is not reached when the thread is unconditionally\n  // terminated by the ExceptionHandler destructor.\n  return 0;\n}\n\n// HandleException and HandleInvalidParameter must create an\n// AutoExceptionHandler object to maintain static state and to determine which\n// ExceptionHandler instance to use.  The constructor locates the correct\n// instance, and makes it available through get_handler().  The destructor\n// restores the state in effect prior to allocating the AutoExceptionHandler.\nclass AutoExceptionHandler {\n public:\n  AutoExceptionHandler() {\n    // Increment handler_stack_index_ so that if another Breakpad handler is\n    // registered using this same HandleException function, and it needs to be\n    // called while this handler is running (either because this handler\n    // declines to handle the exception, or an exception occurs during\n    // handling), HandleException will find the appropriate ExceptionHandler\n    // object in handler_stack_ to deliver the exception to.\n    //\n    // Because handler_stack_ is addressed in reverse (as |size - index|),\n    // preincrementing handler_stack_index_ avoids needing to subtract 1 from\n    // the argument to |at|.\n    //\n    // The index is maintained instead of popping elements off of the handler\n    // stack and pushing them at the end of this method.  This avoids ruining\n    // the order of elements in the stack in the event that some other thread\n    // decides to manipulate the handler stack (such as creating a new\n    // ExceptionHandler object) while an exception is being handled.\n    EnterCriticalSection(&ExceptionHandler::handler_stack_critical_section_);\n    handler_ = ExceptionHandler::handler_stack_->at(\n        ExceptionHandler::handler_stack_->size() -\n        ++ExceptionHandler::handler_stack_index_);\n\n    // In case another exception occurs while this handler is doing its thing,\n    // it should be delivered to the previous filter.\n    SetUnhandledExceptionFilter(handler_->previous_filter_);\n#if _MSC_VER >= 1400  // MSVC 2005/8\n    _set_invalid_parameter_handler(handler_->previous_iph_);\n#endif  // _MSC_VER >= 1400\n//    _set_purecall_handler(handler_->previous_pch_);\n  }\n\n  ~AutoExceptionHandler() {\n    // Put things back the way they were before entering this handler.\n    SetUnhandledExceptionFilter(ExceptionHandler::HandleException);\n#if _MSC_VER >= 1400  // MSVC 2005/8\n    _set_invalid_parameter_handler(ExceptionHandler::HandleInvalidParameter);\n#endif  // _MSC_VER >= 1400\n//    _set_purecall_handler(ExceptionHandler::HandlePureVirtualCall);\n\n    --ExceptionHandler::handler_stack_index_;\n    LeaveCriticalSection(&ExceptionHandler::handler_stack_critical_section_);\n  }\n\n  ExceptionHandler* get_handler() const { return handler_; }\n\n private:\n  ExceptionHandler* handler_;\n};\n\n// static\nLONG ExceptionHandler::HandleException(EXCEPTION_POINTERS* exinfo) {\n  AutoExceptionHandler auto_exception_handler;\n  ExceptionHandler* current_handler = auto_exception_handler.get_handler();\n\n  // Ignore EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP exceptions.  This\n  // logic will short-circuit before calling WriteMinidumpOnHandlerThread,\n  // allowing something else to handle the breakpoint without incurring the\n  // overhead transitioning to and from the handler thread.  This behavior\n  // can be overridden by calling ExceptionHandler::set_handle_debug_exceptions.\n  DWORD code = exinfo->ExceptionRecord->ExceptionCode;\n  LONG action;\n  bool is_debug_exception = (code == EXCEPTION_BREAKPOINT) ||\n                            (code == EXCEPTION_SINGLE_STEP);\n\n  bool success = false;\n\n  if (!is_debug_exception ||\n      current_handler->get_handle_debug_exceptions()) {\n    // If out-of-proc crash handler client is available, we have to use that\n    // to generate dump and we cannot fall back on in-proc dump generation\n    // because we never prepared for an in-proc dump generation\n\n    // In case of out-of-process dump generation, directly call\n    // WriteMinidumpWithException since there is no separate thread running.\n    if (current_handler->IsOutOfProcess()) {\n      success = current_handler->WriteMinidumpWithException(\n          GetCurrentThreadId(),\n          exinfo,\n          NULL);\n    } else {\n      success = current_handler->WriteMinidumpOnHandlerThread(exinfo, NULL);\n    }\n  }\n\n  // The handler fully handled the exception.  Returning\n  // EXCEPTION_EXECUTE_HANDLER indicates this to the system, and usually\n  // results in the application being terminated.\n  //\n  // Note: If the application was launched from within the Cygwin\n  // environment, returning EXCEPTION_EXECUTE_HANDLER seems to cause the\n  // application to be restarted.\n  if (success) {\n    action = EXCEPTION_EXECUTE_HANDLER;\n  } else {\n    // There was an exception, it was a breakpoint or something else ignored\n    // above, or it was passed to the handler, which decided not to handle it.\n    // This could be because the filter callback didn't want it, because\n    // minidump writing failed for some reason, or because the post-minidump\n    // callback function indicated failure.  Give the previous handler a\n    // chance to do something with the exception.  If there is no previous\n    // handler, return EXCEPTION_CONTINUE_SEARCH, which will allow a debugger\n    // or native \"crashed\" dialog to handle the exception.\n    if (current_handler->previous_filter_) {\n      action = current_handler->previous_filter_(exinfo);\n    } else {\n      action = EXCEPTION_CONTINUE_SEARCH;\n    }\n  }\n\n  return action;\n}\n\n#if _MSC_VER >= 1400  // MSVC 2005/8\n// static\nvoid ExceptionHandler::HandleInvalidParameter(const wchar_t* expression,\n                                              const wchar_t* function,\n                                              const wchar_t* file,\n                                              unsigned int line,\n                                              uintptr_t reserved) {\n  // This is an invalid parameter, not an exception.  It's safe to play with\n  // sprintf here.\n  AutoExceptionHandler auto_exception_handler;\n  ExceptionHandler* current_handler = auto_exception_handler.get_handler();\n\n  MDRawAssertionInfo assertion;\n  memset(&assertion, 0, sizeof(assertion));\n  _snwprintf_s(reinterpret_cast<wchar_t*>(assertion.expression),\n               sizeof(assertion.expression) / sizeof(assertion.expression[0]),\n               _TRUNCATE, L\"%s\", expression);\n  _snwprintf_s(reinterpret_cast<wchar_t*>(assertion.function),\n               sizeof(assertion.function) / sizeof(assertion.function[0]),\n               _TRUNCATE, L\"%s\", function);\n  _snwprintf_s(reinterpret_cast<wchar_t*>(assertion.file),\n               sizeof(assertion.file) / sizeof(assertion.file[0]),\n               _TRUNCATE, L\"%s\", file);\n  assertion.line = line;\n  assertion.type = MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER;\n\n  // Make up an exception record for the current thread and CPU context\n  // to make it possible for the crash processor to classify these\n  // as do regular crashes, and to make it humane for developers to\n  // analyze them.\n  EXCEPTION_RECORD exception_record = {};\n  CONTEXT exception_context = {};\n  EXCEPTION_POINTERS exception_ptrs = { &exception_record, &exception_context };\n\n  ::RtlCaptureContext(&exception_context);\n\n  exception_record.ExceptionCode = STATUS_INVALID_PARAMETER;\n\n  // We store pointers to the the expression and function strings,\n  // and the line as exception parameters to make them easy to\n  // access by the developer on the far side.\n  exception_record.NumberParameters = 3;\n  exception_record.ExceptionInformation[0] =\n      reinterpret_cast<ULONG_PTR>(&assertion.expression);\n  exception_record.ExceptionInformation[1] =\n      reinterpret_cast<ULONG_PTR>(&assertion.file);\n  exception_record.ExceptionInformation[2] = assertion.line;\n\n  bool success = false;\n  // In case of out-of-process dump generation, directly call\n  // WriteMinidumpWithException since there is no separate thread running.\n  if (current_handler->IsOutOfProcess()) {\n    success = current_handler->WriteMinidumpWithException(\n        GetCurrentThreadId(),\n        &exception_ptrs,\n        &assertion);\n  } else {\n    success = current_handler->WriteMinidumpOnHandlerThread(&exception_ptrs,\n                                                            &assertion);\n  }\n\n  if (!success) {\n    if (current_handler->previous_iph_) {\n      // The handler didn't fully handle the exception.  Give it to the\n      // previous invalid parameter handler.\n      current_handler->previous_iph_(expression,\n                                     function,\n                                     file,\n                                     line,\n                                     reserved);\n    } else {\n      // If there's no previous handler, pass the exception back in to the\n      // invalid parameter handler's core.  That's the routine that called this\n      // function, but now, since this function is no longer registered (and in\n      // fact, no function at all is registered), this will result in the\n      // default code path being taken: _CRT_DEBUGGER_HOOK and _invoke_watson.\n      // Use _invalid_parameter where it exists (in _DEBUG builds) as it passes\n      // more information through.  In non-debug builds, it is not available,\n      // so fall back to using _invalid_parameter_noinfo.  See invarg.c in the\n      // CRT source.\n#ifdef _DEBUG\n      _invalid_parameter(expression, function, file, line, reserved);\n#else  // _DEBUG\n      _invalid_parameter_noinfo();\n#endif  // _DEBUG\n    }\n  }\n\n  // The handler either took care of the invalid parameter problem itself,\n  // or passed it on to another handler.  \"Swallow\" it by exiting, paralleling\n  // the behavior of \"swallowing\" exceptions.\n  exit(0);\n}\n#endif  // _MSC_VER >= 1400\n\n// static\nvoid ExceptionHandler::HandlePureVirtualCall() {\n  // This is an pure virtual function call, not an exception.  It's safe to\n  // play with sprintf here.\n  AutoExceptionHandler auto_exception_handler;\n  ExceptionHandler* current_handler = auto_exception_handler.get_handler();\n\n  MDRawAssertionInfo assertion;\n  memset(&assertion, 0, sizeof(assertion));\n  assertion.type = MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL;\n\n  // Make up an exception record for the current thread and CPU context\n  // to make it possible for the crash processor to classify these\n  // as do regular crashes, and to make it humane for developers to\n  // analyze them.\n  EXCEPTION_RECORD exception_record = {};\n  CONTEXT exception_context = {};\n  EXCEPTION_POINTERS exception_ptrs = { &exception_record, &exception_context };\n\n  ::RtlCaptureContext(&exception_context);\n\n  exception_record.ExceptionCode = STATUS_NONCONTINUABLE_EXCEPTION;\n\n  // We store pointers to the the expression and function strings,\n  // and the line as exception parameters to make them easy to\n  // access by the developer on the far side.\n  exception_record.NumberParameters = 3;\n  exception_record.ExceptionInformation[0] =\n      reinterpret_cast<ULONG_PTR>(&assertion.expression);\n  exception_record.ExceptionInformation[1] =\n      reinterpret_cast<ULONG_PTR>(&assertion.file);\n  exception_record.ExceptionInformation[2] = assertion.line;\n\n  bool success = false;\n  // In case of out-of-process dump generation, directly call\n  // WriteMinidumpWithException since there is no separate thread running.\n\n  if (current_handler->IsOutOfProcess()) {\n    success = current_handler->WriteMinidumpWithException(\n        GetCurrentThreadId(),\n        &exception_ptrs,\n        &assertion);\n  } else {\n    success = current_handler->WriteMinidumpOnHandlerThread(&exception_ptrs,\n                                                            &assertion);\n  }\n\n  if (!success) {\n    if (current_handler->previous_pch_) {\n      // The handler didn't fully handle the exception.  Give it to the\n      // previous purecall handler.\n      current_handler->previous_pch_();\n    } else {\n      // If there's no previous handler, return and let _purecall handle it.\n      // This will just put up an assertion dialog.\n      return;\n    }\n  }\n\n  // The handler either took care of the invalid parameter problem itself,\n  // or passed it on to another handler.  \"Swallow\" it by exiting, paralleling\n  // the behavior of \"swallowing\" exceptions.\n  exit(0);\n}\n\nbool ExceptionHandler::WriteMinidumpOnHandlerThread(\n    EXCEPTION_POINTERS* exinfo, MDRawAssertionInfo* assertion) {\n  EnterCriticalSection(&handler_critical_section_);\n\n  // There isn't much we can do if the handler thread\n  // was not successfully created.\n  if (handler_thread_ == NULL) {\n    LeaveCriticalSection(&handler_critical_section_);\n    return false;\n  }\n\n  // The handler thread should only be created when the semaphores are valid.\n  assert(handler_start_semaphore_ != NULL);\n  assert(handler_finish_semaphore_ != NULL);\n\n  // Set up data to be passed in to the handler thread.\n  requesting_thread_id_ = GetCurrentThreadId();\n  exception_info_ = exinfo;\n  assertion_ = assertion;\n\n  // This causes the handler thread to call WriteMinidumpWithException.\n  ReleaseSemaphore(handler_start_semaphore_, 1, NULL);\n\n  // Wait until WriteMinidumpWithException is done and collect its return value.\n  WaitForSingleObject(handler_finish_semaphore_, INFINITE);\n  bool status = handler_return_value_;\n\n  // Clean up.\n  requesting_thread_id_ = 0;\n  exception_info_ = NULL;\n  assertion_ = NULL;\n\n  LeaveCriticalSection(&handler_critical_section_);\n\n  return status;\n}\n\nbool ExceptionHandler::WriteMinidump() {\n  // Make up an exception record for the current thread and CPU context\n  // to make it possible for the crash processor to classify these\n  // as do regular crashes, and to make it humane for developers to\n  // analyze them.\n  EXCEPTION_RECORD exception_record = {};\n  CONTEXT exception_context = {};\n  EXCEPTION_POINTERS exception_ptrs = { &exception_record, &exception_context };\n\n  ::RtlCaptureContext(&exception_context);\n  exception_record.ExceptionCode = STATUS_NONCONTINUABLE_EXCEPTION;\n\n  return WriteMinidumpForException(&exception_ptrs);\n}\n\nbool ExceptionHandler::WriteMinidumpForException(EXCEPTION_POINTERS* exinfo) {\n  // In case of out-of-process dump generation, directly call\n  // WriteMinidumpWithException since there is no separate thread running.\n  if (IsOutOfProcess()) {\n    return WriteMinidumpWithException(GetCurrentThreadId(),\n                                      exinfo,\n                                      NULL);\n  }\n\n  bool success = WriteMinidumpOnHandlerThread(exinfo, NULL);\n  UpdateNextID();\n  return success;\n}\n\n// static\nbool ExceptionHandler::WriteMinidump(const wstring &dump_path,\n                                     MinidumpCallback callback,\n                                     void* callback_context) {\n  ExceptionHandler handler(dump_path, NULL, callback, callback_context,\n                           HANDLER_NONE);\n  return handler.WriteMinidump();\n}\n\nbool ExceptionHandler::WriteMinidumpWithException(\n    DWORD requesting_thread_id,\n    EXCEPTION_POINTERS* exinfo,\n    MDRawAssertionInfo* assertion) {\n  // Give user code a chance to approve or prevent writing a minidump.  If the\n  // filter returns false, don't handle the exception at all.  If this method\n  // was called as a result of an exception, returning false will cause\n  // HandleException to call any previous handler or return\n  // EXCEPTION_CONTINUE_SEARCH on the exception thread, allowing it to appear\n  // as though this handler were not present at all.\n  if (filter_ && !filter_(callback_context_, exinfo, assertion)) {\n    return false;\n  }\n\n  bool success = false;\n  if (IsOutOfProcess()) {\n    success = crash_generation_client_->RequestDump(exinfo, assertion);\n  } else {\n    if (minidump_write_dump_) {\n      HANDLE dump_file = CreateFile(next_minidump_path_c_,\n                                    GENERIC_WRITE,\n                                    0,  // no sharing\n                                    NULL,\n                                    CREATE_NEW,  // fail if exists\n                                    FILE_ATTRIBUTE_NORMAL,\n                                    NULL);\n      if (dump_file != INVALID_HANDLE_VALUE) {\n        MINIDUMP_EXCEPTION_INFORMATION except_info;\n        except_info.ThreadId = requesting_thread_id;\n        except_info.ExceptionPointers = exinfo;\n        except_info.ClientPointers = FALSE;\n\n        // Add an MDRawBreakpadInfo stream to the minidump, to provide\n        // additional information about the exception handler to the Breakpad\n        // processor. The information will help the processor determine which\n        // threads are relevant.  The Breakpad processor does not require this\n        // information but can function better with Breakpad-generated dumps\n        // when it is present. The native debugger is not harmed by the\n        // presence of this information.\n        MDRawBreakpadInfo breakpad_info;\n        breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID |\n                               MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID;\n        breakpad_info.dump_thread_id = GetCurrentThreadId();\n        breakpad_info.requesting_thread_id = requesting_thread_id;\n\n        // Leave room in user_stream_array for a possible assertion info stream.\n        MINIDUMP_USER_STREAM user_stream_array[2];\n        user_stream_array[0].Type = MD_BREAKPAD_INFO_STREAM;\n        user_stream_array[0].BufferSize = sizeof(breakpad_info);\n        user_stream_array[0].Buffer = &breakpad_info;\n\n        MINIDUMP_USER_STREAM_INFORMATION user_streams;\n        user_streams.UserStreamCount = 1;\n        user_streams.UserStreamArray = user_stream_array;\n\n        if (assertion) {\n          user_stream_array[1].Type = MD_ASSERTION_INFO_STREAM;\n          user_stream_array[1].BufferSize = sizeof(MDRawAssertionInfo);\n          user_stream_array[1].Buffer = assertion;\n          ++user_streams.UserStreamCount;\n        }\n\n        MINIDUMP_CALLBACK_INFORMATION callback;\n        MinidumpCallbackContext context;\n        MINIDUMP_CALLBACK_INFORMATION* callback_pointer = NULL;\n        // Older versions of DbgHelp.dll don't correctly put the memory around\n        // the faulting instruction pointer into the minidump. This\n        // callback will ensure that it gets included.\n        if (exinfo) {\n          // Find a memory region of 256 bytes centered on the\n          // faulting instruction pointer.\n          const ULONG64 instruction_pointer = \n#if defined(_M_IX86)\n            exinfo->ContextRecord->Eip;\n#elif defined(_M_AMD64)\n            exinfo->ContextRecord->Rip;\n#else\n#error Unsupported platform\n#endif\n\n          MEMORY_BASIC_INFORMATION info;\n          if (VirtualQuery(reinterpret_cast<LPCVOID>(instruction_pointer),\n                           &info,\n                           sizeof(MEMORY_BASIC_INFORMATION)) != 0 &&\n              info.State == MEM_COMMIT) {\n            // Attempt to get 128 bytes before and after the instruction\n            // pointer, but settle for whatever's available up to the\n            // boundaries of the memory region.\n            const ULONG64 kIPMemorySize = 256;\n            context.memory_base =\n              (std::max)(reinterpret_cast<ULONG64>(info.BaseAddress),\n                       instruction_pointer - (kIPMemorySize / 2));\n            ULONG64 end_of_range =\n              (std::min)(instruction_pointer + (kIPMemorySize / 2),\n                       reinterpret_cast<ULONG64>(info.BaseAddress)\n                       + info.RegionSize);\n            context.memory_size =\n                static_cast<ULONG>(end_of_range - context.memory_base);\n\n            context.finished = false;\n            callback.CallbackRoutine = MinidumpWriteDumpCallback;\n            callback.CallbackParam = reinterpret_cast<void*>(&context);\n            callback_pointer = &callback;\n          }\n        }\n\n        // The explicit comparison to TRUE avoids a warning (C4800).\n        success = (minidump_write_dump_(GetCurrentProcess(),\n                                        GetCurrentProcessId(),\n                                        dump_file,\n                                        dump_type_,\n                                        exinfo ? &except_info : NULL,\n                                        &user_streams,\n                                        callback_pointer) == TRUE);\n\n        CloseHandle(dump_file);\n      }\n    }\n  }\n\n  if (callback_) {\n    // TODO(munjal): In case of out-of-process dump generation, both\n    // dump_path_c_ and next_minidump_id_ will be NULL. For out-of-process\n    // scenario, the server process ends up creating the dump path and dump\n    // id so they are not known to the client.\n    success = callback_(dump_path_c_, next_minidump_id_c_, callback_context_,\n                        exinfo, assertion, success);\n  }\n\n  return success;\n}\n\n// static\nBOOL CALLBACK ExceptionHandler::MinidumpWriteDumpCallback(\n    PVOID context,\n    const PMINIDUMP_CALLBACK_INPUT callback_input,\n    PMINIDUMP_CALLBACK_OUTPUT callback_output) {\n  switch (callback_input->CallbackType) {\n  case MemoryCallback: {\n    MinidumpCallbackContext* callback_context =\n        reinterpret_cast<MinidumpCallbackContext*>(context);\n    if (callback_context->finished)\n      return FALSE;\n\n    // Include the specified memory region.\n    callback_output->MemoryBase = callback_context->memory_base;\n    callback_output->MemorySize = callback_context->memory_size;\n    callback_context->finished = true;\n    return TRUE;\n  }\n    \n    // Include all modules.\n  case IncludeModuleCallback:\n  case ModuleCallback:\n    return TRUE;\n\n    // Include all threads.\n  case IncludeThreadCallback:\n  case ThreadCallback:\n    return TRUE;\n\n    // Stop receiving cancel callbacks.\n  case CancelCallback:\n    callback_output->CheckCancel = FALSE;\n    callback_output->Cancel = FALSE;\n    return TRUE;\n  }\n  // Ignore other callback types.\n  return FALSE;\n}\n\nvoid ExceptionHandler::UpdateNextID() {\n  assert(uuid_create_);\n  UUID id = {0};\n  if (uuid_create_) {\n    uuid_create_(&id);\n  }\n  next_minidump_id_ = GUIDString::GUIDToWString(&id);\n  next_minidump_id_c_ = next_minidump_id_.c_str();\n\n  wchar_t minidump_path[MAX_PATH];\n  swprintf(minidump_path, MAX_PATH, L\"%s\\\\%s.dmp\",\n           dump_path_c_, next_minidump_id_c_);\n\n  // remove when VC++7.1 is no longer supported\n  minidump_path[MAX_PATH - 1] = L'\\0';\n\n  next_minidump_path_ = minidump_path;\n  next_minidump_path_c_ = next_minidump_path_.c_str();\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/handler/exception_handler.gyp",
    "content": "# Copyright (c) 2010, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n{\n  'includes': [\n    '../build/common.gypi',\n  ],\n  'targets': [\n    {\n      'target_name': 'exception_handler',\n      'type': '<(library)',\n      'sources': [\n        \"exception_handler.cc\",\n        \"exception_handler.h\",\n      ],\n      'dependencies': [\n        '../breakpad_client.gyp:common',\n        '../crash_generation/crash_generation.gyp:crash_generation_server',\n      ]\n    },\n  ],\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/handler/exception_handler.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// ExceptionHandler can write a minidump file when an exception occurs,\n// or when WriteMinidump() is called explicitly by your program.\n//\n// To have the exception handler write minidumps when an uncaught exception\n// (crash) occurs, you should create an instance early in the execution\n// of your program, and keep it around for the entire time you want to\n// have crash handling active (typically, until shutdown).\n//\n// If you want to write minidumps without installing the exception handler,\n// you can create an ExceptionHandler with install_handler set to false,\n// then call WriteMinidump.  You can also use this technique if you want to\n// use different minidump callbacks for different call sites.\n//\n// In either case, a callback function is called when a minidump is written,\n// which receives the unqiue id of the minidump.  The caller can use this\n// id to collect and write additional application state, and to launch an\n// external crash-reporting application.\n//\n// It is important that creation and destruction of ExceptionHandler objects\n// be nested cleanly, when using install_handler = true.\n// Avoid the following pattern:\n//   ExceptionHandler *e = new ExceptionHandler(...);\n//   ExceptionHandler *f = new ExceptionHandler(...);\n//   delete e;\n// This will put the exception filter stack into an inconsistent state.\n\n#ifndef CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__\n#define CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__\n\n#include <stdlib.h>\n#include <windows.h>\n#include <dbghelp.h>\n#include <rpc.h>\n\n#pragma warning( push )\n// Disable exception handler warnings.\n#pragma warning( disable : 4530 )\n\n#include <string>\n#include <vector>\n\n#include \"client/windows/common/ipc_protocol.h\"\n#include \"client/windows/crash_generation/crash_generation_client.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"processor/scoped_ptr.h\"\n\nnamespace google_breakpad {\n\nusing std::vector;\nusing std::wstring;\n\nclass ExceptionHandler {\n public:\n  // A callback function to run before Breakpad performs any substantial\n  // processing of an exception.  A FilterCallback is called before writing\n  // a minidump.  context is the parameter supplied by the user as\n  // callback_context when the handler was created.  exinfo points to the\n  // exception record, if any; assertion points to assertion information,\n  // if any.\n  //\n  // If a FilterCallback returns true, Breakpad will continue processing,\n  // attempting to write a minidump.  If a FilterCallback returns false,\n  // Breakpad will immediately report the exception as unhandled without\n  // writing a minidump, allowing another handler the opportunity to handle it.\n  typedef bool (*FilterCallback)(void* context, EXCEPTION_POINTERS* exinfo,\n                                 MDRawAssertionInfo* assertion);\n\n  // A callback function to run after the minidump has been written.\n  // minidump_id is a unique id for the dump, so the minidump\n  // file is <dump_path>\\<minidump_id>.dmp.  context is the parameter supplied\n  // by the user as callback_context when the handler was created.  exinfo\n  // points to the exception record, or NULL if no exception occurred.\n  // succeeded indicates whether a minidump file was successfully written.\n  // assertion points to information about an assertion if the handler was\n  // invoked by an assertion.\n  //\n  // If an exception occurred and the callback returns true, Breakpad will treat\n  // the exception as fully-handled, suppressing any other handlers from being\n  // notified of the exception.  If the callback returns false, Breakpad will\n  // treat the exception as unhandled, and allow another handler to handle it.\n  // If there are no other handlers, Breakpad will report the exception to the\n  // system as unhandled, allowing a debugger or native crash dialog the\n  // opportunity to handle the exception.  Most callback implementations\n  // should normally return the value of |succeeded|, or when they wish to\n  // not report an exception of handled, false.  Callbacks will rarely want to\n  // return true directly (unless |succeeded| is true).\n  //\n  // For out-of-process dump generation, dump path and minidump ID will always\n  // be NULL. In case of out-of-process dump generation, the dump path and\n  // minidump id are controlled by the server process and are not communicated\n  // back to the crashing process.\n  typedef bool (*MinidumpCallback)(const wchar_t* dump_path,\n                                   const wchar_t* minidump_id,\n                                   void* context,\n                                   EXCEPTION_POINTERS* exinfo,\n                                   MDRawAssertionInfo* assertion,\n                                   bool succeeded);\n\n  // HandlerType specifies which types of handlers should be installed, if\n  // any.  Use HANDLER_NONE for an ExceptionHandler that remains idle,\n  // without catching any failures on its own.  This type of handler may\n  // still be triggered by calling WriteMinidump.  Otherwise, use a\n  // combination of the other HANDLER_ values, or HANDLER_ALL to install\n  // all handlers.\n  enum HandlerType {\n    HANDLER_NONE = 0,\n    HANDLER_EXCEPTION = 1 << 0,          // SetUnhandledExceptionFilter\n    HANDLER_INVALID_PARAMETER = 1 << 1,  // _set_invalid_parameter_handler\n    HANDLER_PURECALL = 1 << 2,           // _set_purecall_handler\n    HANDLER_ALL = HANDLER_EXCEPTION |\n                  HANDLER_INVALID_PARAMETER |\n                  HANDLER_PURECALL\n  };\n\n  // Creates a new ExceptionHandler instance to handle writing minidumps.\n  // Before writing a minidump, the optional filter callback will be called.\n  // Its return value determines whether or not Breakpad should write a\n  // minidump.  Minidump files will be written to dump_path, and the optional\n  // callback is called after writing the dump file, as described above.\n  // handler_types specifies the types of handlers that should be installed.\n  ExceptionHandler(const wstring& dump_path,\n                   FilterCallback filter,\n                   MinidumpCallback callback,\n                   void* callback_context,\n                   int handler_types);\n\n  // Creates a new ExcetpionHandler instance that can attempt to perform\n  // out-of-process dump generation if pipe_name is not NULL. If pipe_name is\n  // NULL, or if out-of-process dump generation registration step fails,\n  // in-process dump generation will be used. This also allows specifying\n  // the dump type to generate.\n  ExceptionHandler(const wstring& dump_path,\n                   FilterCallback filter,\n                   MinidumpCallback callback,\n                   void* callback_context,\n                   int handler_types,\n                   MINIDUMP_TYPE dump_type,\n                   const wchar_t* pipe_name,\n                   const CustomClientInfo* custom_info);\n\n  ~ExceptionHandler();\n\n  // Get and set the minidump path.\n  wstring dump_path() const { return dump_path_; }\n  void set_dump_path(const wstring &dump_path) {\n    dump_path_ = dump_path;\n    dump_path_c_ = dump_path_.c_str();\n    UpdateNextID();  // Necessary to put dump_path_ in next_minidump_path_.\n  }\n\n  // Requests that a previously reported crash be uploaded.\n  bool RequestUpload(DWORD crash_id);\n\n  // Writes a minidump immediately.  This can be used to capture the\n  // execution state independently of a crash.  Returns true on success.\n  bool WriteMinidump();\n\n  // Writes a minidump immediately, with the user-supplied exception\n  // information.\n  bool WriteMinidumpForException(EXCEPTION_POINTERS* exinfo);\n\n  // Convenience form of WriteMinidump which does not require an\n  // ExceptionHandler instance.\n  static bool WriteMinidump(const wstring &dump_path,\n                            MinidumpCallback callback, void* callback_context);\n\n  // Get the thread ID of the thread requesting the dump (either the exception\n  // thread or any other thread that called WriteMinidump directly).  This\n  // may be useful if you want to include additional thread state in your\n  // dumps.\n  DWORD get_requesting_thread_id() const { return requesting_thread_id_; }\n\n  // Controls behavior of EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP.\n  bool get_handle_debug_exceptions() const { return handle_debug_exceptions_; }\n  void set_handle_debug_exceptions(bool handle_debug_exceptions) {\n    handle_debug_exceptions_ = handle_debug_exceptions;\n  }\n\n  // Returns whether out-of-process dump generation is used or not.\n  bool IsOutOfProcess() const { return crash_generation_client_.get() != NULL; }\n\n private:\n  friend class AutoExceptionHandler;\n\n  // Initializes the instance with given values.\n  void Initialize(const wstring& dump_path,\n                  FilterCallback filter,\n                  MinidumpCallback callback,\n                  void* callback_context,\n                  int handler_types,\n                  MINIDUMP_TYPE dump_type,\n                  const wchar_t* pipe_name,\n                  const CustomClientInfo* custom_info);\n\n  // Function pointer type for MiniDumpWriteDump, which is looked up\n  // dynamically.\n  typedef BOOL (WINAPI *MiniDumpWriteDump_type)(\n      HANDLE hProcess,\n      DWORD dwPid,\n      HANDLE hFile,\n      MINIDUMP_TYPE DumpType,\n      CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,\n      CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,\n      CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);\n\n  // Function pointer type for UuidCreate, which is looked up dynamically.\n  typedef RPC_STATUS (RPC_ENTRY *UuidCreate_type)(UUID* Uuid);\n\n  // Runs the main loop for the exception handler thread.\n  static DWORD WINAPI ExceptionHandlerThreadMain(void* lpParameter);\n\n  // Called on the exception thread when an unhandled exception occurs.\n  // Signals the exception handler thread to handle the exception.\n  static LONG WINAPI HandleException(EXCEPTION_POINTERS* exinfo);\n\n#if _MSC_VER >= 1400  // MSVC 2005/8\n  // This function will be called by some CRT functions when they detect\n  // that they were passed an invalid parameter.  Note that in _DEBUG builds,\n  // the CRT may display an assertion dialog before calling this function,\n  // and the function will not be called unless the assertion dialog is\n  // dismissed by clicking \"Ignore.\"\n  static void HandleInvalidParameter(const wchar_t* expression,\n                                     const wchar_t* function,\n                                     const wchar_t* file,\n                                     unsigned int line,\n                                     uintptr_t reserved);\n#endif  // _MSC_VER >= 1400\n\n  // This function will be called by the CRT when a pure virtual\n  // function is called.\n  static void HandlePureVirtualCall();\n\n  // This is called on the exception thread or on another thread that\n  // the user wishes to produce a dump from.  It calls\n  // WriteMinidumpWithException on the handler thread, avoiding stack\n  // overflows and inconsistent dumps due to writing the dump from\n  // the exception thread.  If the dump is requested as a result of an\n  // exception, exinfo contains exception information, otherwise, it\n  // is NULL.  If the dump is requested as a result of an assertion\n  // (such as an invalid parameter being passed to a CRT function),\n  // assertion contains data about the assertion, otherwise, it is NULL.\n  bool WriteMinidumpOnHandlerThread(EXCEPTION_POINTERS* exinfo,\n                                    MDRawAssertionInfo* assertion);\n\n  // This function does the actual writing of a minidump.  It is called\n  // on the handler thread.  requesting_thread_id is the ID of the thread\n  // that requested the dump.  If the dump is requested as a result of\n  // an exception, exinfo contains exception information, otherwise,\n  // it is NULL.\n  bool WriteMinidumpWithException(DWORD requesting_thread_id,\n                                  EXCEPTION_POINTERS* exinfo,\n                                  MDRawAssertionInfo* assertion);\n\n  // This function is used as a callback when calling MinidumpWriteDump,\n  // in order to add additional memory regions to the dump.\n  static BOOL CALLBACK MinidumpWriteDumpCallback(\n      PVOID context,\n      const PMINIDUMP_CALLBACK_INPUT callback_input,\n      PMINIDUMP_CALLBACK_OUTPUT callback_output);\n\n  // Generates a new ID and stores it in next_minidump_id_, and stores the\n  // path of the next minidump to be written in next_minidump_path_.\n  void UpdateNextID();\n\n  FilterCallback filter_;\n  MinidumpCallback callback_;\n  void* callback_context_;\n\n  scoped_ptr<CrashGenerationClient> crash_generation_client_;\n\n  // The directory in which a minidump will be written, set by the dump_path\n  // argument to the constructor, or set_dump_path.\n  wstring dump_path_;\n\n  // The basename of the next minidump to be written, without the extension.\n  wstring next_minidump_id_;\n\n  // The full pathname of the next minidump to be written, including the file\n  // extension.\n  wstring next_minidump_path_;\n\n  // Pointers to C-string representations of the above.  These are set when\n  // the above wstring versions are set in order to avoid calling c_str during\n  // an exception, as c_str may attempt to allocate heap memory.  These\n  // pointers are not owned by the ExceptionHandler object, but their lifetimes\n  // should be equivalent to the lifetimes of the associated wstring, provided\n  // that the wstrings are not altered.\n  const wchar_t* dump_path_c_;\n  const wchar_t* next_minidump_id_c_;\n  const wchar_t* next_minidump_path_c_;\n\n  HMODULE dbghelp_module_;\n  MiniDumpWriteDump_type minidump_write_dump_;\n  MINIDUMP_TYPE dump_type_;\n\n  HMODULE rpcrt4_module_;\n  UuidCreate_type uuid_create_;\n\n  // Tracks the handler types that were installed according to the\n  // handler_types constructor argument.\n  int handler_types_;\n\n  // When installed_handler_ is true, previous_filter_ is the unhandled\n  // exception filter that was set prior to installing ExceptionHandler as\n  // the unhandled exception filter and pointing it to |this|.  NULL indicates\n  // that there is no previous unhandled exception filter.\n  LPTOP_LEVEL_EXCEPTION_FILTER previous_filter_;\n\n#if _MSC_VER >= 1400  // MSVC 2005/8\n  // Beginning in VC 8, the CRT provides an invalid parameter handler that will\n  // be called when some CRT functions are passed invalid parameters.  In\n  // earlier CRTs, the same conditions would cause unexpected behavior or\n  // crashes.\n  _invalid_parameter_handler previous_iph_;\n#endif  // _MSC_VER >= 1400\n\n  // The CRT allows you to override the default handler for pure\n  // virtual function calls.\n  _purecall_handler previous_pch_;\n\n  // The exception handler thread.\n  HANDLE handler_thread_;\n\n  // True if the exception handler is being destroyed.\n  // Starting with MSVC 2005, Visual C has stronger guarantees on volatile vars.\n  // It has release semantics on write and acquire semantics on reads.\n  // See the msdn documentation.\n  volatile bool is_shutdown_;\n\n  // The critical section enforcing the requirement that only one exception be\n  // handled by a handler at a time.\n  CRITICAL_SECTION handler_critical_section_;\n\n  // Semaphores used to move exception handling between the exception thread\n  // and the handler thread.  handler_start_semaphore_ is signalled by the\n  // exception thread to wake up the handler thread when an exception occurs.\n  // handler_finish_semaphore_ is signalled by the handler thread to wake up\n  // the exception thread when handling is complete.\n  HANDLE handler_start_semaphore_;\n  HANDLE handler_finish_semaphore_;\n\n  // The next 2 fields contain data passed from the requesting thread to\n  // the handler thread.\n\n  // The thread ID of the thread requesting the dump (either the exception\n  // thread or any other thread that called WriteMinidump directly).\n  DWORD requesting_thread_id_;\n\n  // The exception info passed to the exception handler on the exception\n  // thread, if an exception occurred.  NULL for user-requested dumps.\n  EXCEPTION_POINTERS* exception_info_;\n\n  // If the handler is invoked due to an assertion, this will contain a\n  // pointer to the assertion information.  It is NULL at other times.\n  MDRawAssertionInfo* assertion_;\n\n  // The return value of the handler, passed from the handler thread back to\n  // the requesting thread.\n  bool handler_return_value_;\n\n  // If true, the handler will intercept EXCEPTION_BREAKPOINT and\n  // EXCEPTION_SINGLE_STEP exceptions.  Leave this false (the default)\n  // to not interfere with debuggers.\n  bool handle_debug_exceptions_;\n\n  // A stack of ExceptionHandler objects that have installed unhandled\n  // exception filters.  This vector is used by HandleException to determine\n  // which ExceptionHandler object to route an exception to.  When an\n  // ExceptionHandler is created with install_handler true, it will append\n  // itself to this list.\n  static vector<ExceptionHandler*>* handler_stack_;\n\n  // The index of the ExceptionHandler in handler_stack_ that will handle the\n  // next exception.  Note that 0 means the last entry in handler_stack_, 1\n  // means the next-to-last entry, and so on.  This is used by HandleException\n  // to support multiple stacked Breakpad handlers.\n  static LONG handler_stack_index_;\n\n  // handler_stack_critical_section_ guards operations on handler_stack_ and\n  // handler_stack_index_. The critical section is initialized by the\n  // first instance of the class and destroyed by the last instance of it.\n  static CRITICAL_SECTION handler_stack_critical_section_;\n\n  // The number of instances of this class.\n  volatile static LONG instance_count_;\n\n  // disallow copy ctor and operator=\n  explicit ExceptionHandler(const ExceptionHandler &);\n  void operator=(const ExceptionHandler &);\n};\n\n}  // namespace google_breakpad\n\n#pragma warning( pop )\n\n#endif  // CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/sender/crash_report_sender.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Disable exception handler warnings.\n#pragma warning( disable : 4530 )\n\n#include <errno.h>\n\n#include \"client/windows/sender/crash_report_sender.h\"\n#include \"common/windows/http_upload.h\"\n\n#if _MSC_VER < 1400  // MSVC 2005/8\n// Older MSVC doesn't have fscanf_s, but they are compatible as long as\n// we don't use the string conversions (%s/%c/%S/%C).\n#define fscanf_s fscanf\n#endif\n\nnamespace google_breakpad {\n\nstatic const char kCheckpointSignature[] = \"GBP1\\n\";\n\nCrashReportSender::CrashReportSender(const wstring &checkpoint_file)\n    : checkpoint_file_(checkpoint_file),\n      max_reports_per_day_(-1),\n      last_sent_date_(-1),\n      reports_sent_(0) {\n  FILE *fd;\n  if (OpenCheckpointFile(L\"r\", &fd) == 0) {\n    ReadCheckpoint(fd);\n    fclose(fd);\n  }\n}\n\nReportResult CrashReportSender::SendCrashReport(\n    const wstring &url, const map<wstring, wstring> &parameters,\n    const wstring &dump_file_name, wstring *report_code) {\n  int today = GetCurrentDate();\n  if (today == last_sent_date_ &&\n      max_reports_per_day_ != -1 &&\n      reports_sent_ >= max_reports_per_day_) {\n    return RESULT_THROTTLED;\n  }\n\n  int http_response = 0;\n  bool result = HTTPUpload::SendRequest(\n    url, parameters, dump_file_name, L\"upload_file_minidump\", NULL, report_code,\n    &http_response);\n\n  if (result) {\n    ReportSent(today);\n    return RESULT_SUCCEEDED;\n  } else if (http_response >= 400 && http_response < 500) {\n    return RESULT_REJECTED;\n  } else {\n    return RESULT_FAILED;\n  }\n}\n\nvoid CrashReportSender::ReadCheckpoint(FILE *fd) {\n  char buf[128];\n  if (!fgets(buf, sizeof(buf), fd) ||\n      strcmp(buf, kCheckpointSignature) != 0) {\n    return;\n  }\n\n  if (fscanf_s(fd, \"%d\\n\", &last_sent_date_) != 1) {\n    last_sent_date_ = -1;\n    return;\n  }\n  if (fscanf_s(fd, \"%d\\n\", &reports_sent_) != 1) {\n    reports_sent_ = 0;\n    return;\n  }\n}\n\nvoid CrashReportSender::ReportSent(int today) {\n  // Update the report stats\n  if (today != last_sent_date_) {\n    last_sent_date_ = today;\n    reports_sent_ = 0;\n  }\n  ++reports_sent_;\n\n  // Update the checkpoint file\n  FILE *fd;\n  if (OpenCheckpointFile(L\"w\", &fd) == 0) {\n    fputs(kCheckpointSignature, fd);\n    fprintf(fd, \"%d\\n\", last_sent_date_);\n    fprintf(fd, \"%d\\n\", reports_sent_);\n    fclose(fd);\n  }\n}\n\nint CrashReportSender::GetCurrentDate() const {\n  SYSTEMTIME system_time;\n  GetSystemTime(&system_time);\n  return (system_time.wYear * 10000) + (system_time.wMonth * 100) +\n      system_time.wDay;\n}\n\nint CrashReportSender::OpenCheckpointFile(const wchar_t *mode, FILE **fd) {\n  if (checkpoint_file_.empty()) {\n    return ENOENT;\n  }\n#if _MSC_VER >= 1400  // MSVC 2005/8\n  return _wfopen_s(fd, checkpoint_file_.c_str(), mode);\n#else\n  *fd = _wfopen(checkpoint_file_.c_str(), mode);\n  if (*fd == NULL) {\n    return errno;\n  }\n  return 0;\n#endif\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/sender/crash_report_sender.gyp",
    "content": "# Copyright (c) 2010, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n{\n  'includes': [\n    '../build/common.gypi',\n  ],\n  'targets': [\n    {\n      'target_name': 'crash_report_sender',\n      'type': '<(library)',\n      'sources': [\n        'crash_report_sender.cc',\n        'crash_report_sender.h',\n      ],\n      'dependencies': [\n        '../breakpad_client.gyp:common'\n      ],\n    },\n  ],\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/sender/crash_report_sender.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_WINDOWS_SENDER_CRASH_REPORT_SENDER_H__\n#define CLIENT_WINDOWS_SENDER_CRASH_REPORT_SENDER_H__\n\n// CrashReportSender is a \"static\" class which provides an API to upload\n// crash reports via HTTP(S).  A crash report is formatted as a multipart POST\n// request, which contains a set of caller-supplied string key/value pairs,\n// and a minidump file to upload.\n//\n// To use this library in your project, you will need to link against\n// wininet.lib.\n\n#pragma warning( push )\n// Disable exception handler warnings.\n#pragma warning( disable : 4530 ) \n\n#include <map>\n#include <string>\n\nnamespace google_breakpad {\n\nusing std::wstring;\nusing std::map;\n\ntypedef enum {\n  RESULT_FAILED = 0,  // Failed to communicate with the server; try later.\n  RESULT_REJECTED,    // Successfully sent the crash report, but the\n                      // server rejected it; don't resend this report.\n  RESULT_SUCCEEDED,   // The server accepted the crash report.\n  RESULT_THROTTLED    // No attempt was made to send the crash report, because\n                      // we exceeded the maximum reports per day.\n} ReportResult;\n\nclass CrashReportSender {\n public:\n  // Initializes a CrashReportSender instance.\n  // If checkpoint_file is non-empty, breakpad will persist crash report\n  // state to this file.  A checkpoint file is required for\n  // set_max_reports_per_day() to function properly.\n  explicit CrashReportSender(const wstring &checkpoint_file);\n  ~CrashReportSender() {}\n\n  // Sets the maximum number of crash reports that will be sent in a 24-hour\n  // period.  This uses the state persisted to the checkpoint file.\n  // The default value of -1 means that there is no limit on reports sent.\n  void set_max_reports_per_day(int reports) {\n    max_reports_per_day_ = reports;\n  }\n\n  int max_reports_per_day() const { return max_reports_per_day_; }\n\n  // Sends the specified minidump file, along with the map of\n  // name value pairs, as a multipart POST request to the given URL.\n  // Parameter names must contain only printable ASCII characters,\n  // and may not contain a quote (\") character.\n  // Only HTTP(S) URLs are currently supported.  The return value indicates\n  // the result of the operation (see above for possible results).\n  // If report_code is non-NULL and the report is sent successfully (that is,\n  // the return value is RESULT_SUCCEEDED), a code uniquely identifying the\n  // report will be returned in report_code.\n  // (Otherwise, report_code will be unchanged.)\n  ReportResult SendCrashReport(const wstring &url,\n                               const map<wstring, wstring> &parameters,\n                               const wstring &dump_file_name,\n                               wstring *report_code);\n\n private:\n  // Reads persistent state from a checkpoint file.\n  void ReadCheckpoint(FILE *fd);\n\n  // Called when a new report has been sent, to update the checkpoint state.\n  void ReportSent(int today);\n\n  // Returns today's date (UTC) formatted as YYYYMMDD.\n  int GetCurrentDate() const;\n\n  // Opens the checkpoint file with the specified mode.\n  // Returns zero on success, or an error code on failure.\n  int OpenCheckpointFile(const wchar_t *mode, FILE **fd);\n\n  wstring checkpoint_file_;\n  int max_reports_per_day_;\n  // The last date on which we sent a report, expressed as YYYYMMDD.\n  int last_sent_date_;\n  // Number of reports sent on last_sent_date_\n  int reports_sent_;\n\n  // Disallow copy constructor and operator=\n  explicit CrashReportSender(const CrashReportSender &);\n  void operator=(const CrashReportSender &);\n};\n\n}  // namespace google_breakpad\n\n#pragma warning( pop )\n\n#endif  // CLIENT_WINDOWS_SENDER_CRASH_REPORT_SENDER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/tests/crash_generation_app/abstract_class.cc",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"client/windows/tests/crash_generation_app/abstract_class.h\"\n\nnamespace google_breakpad {\n\nBase::Base(Derived* derived)\n    : derived_(derived) {\n}\n\nBase::~Base() {\n  derived_->DoSomething();\n}\n\n#pragma warning(push)\n#pragma warning(disable:4355)\n// Disable warning C4355: 'this' : used in base member initializer list.\nDerived::Derived()\n    : Base(this) {  // C4355\n}\n#pragma warning(pop)\n\nvoid Derived::DoSomething() {\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/tests/crash_generation_app/abstract_class.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_ABSTRACT_CLASS_H__\n#define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_ABSTRACT_CLASS_H__\n\nnamespace google_breakpad {\n\n// Dummy classes to help generate a pure call violation.\n\nclass Derived;\n\nclass Base {\n public:\n  Base(Derived* derived);\n  virtual ~Base();\n  virtual void DoSomething() = 0;\n\n private:\n  Derived* derived_;\n};\n\nclass Derived : public Base {\n public:\n  Derived();\n  virtual void DoSomething();\n};\n\n}  // namespace google_breakpad\n\n#endif  // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.cc",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// crash_generation_app.cpp : Defines the entry point for the application.\n//\n\n#include \"client/windows/tests/crash_generation_app/crash_generation_app.h\"\n\n#include <windows.h>\n#include <tchar.h>\n\n#include \"client/windows/crash_generation/client_info.h\"\n#include \"client/windows/crash_generation/crash_generation_server.h\"\n#include \"client/windows/handler/exception_handler.h\"\n#include \"client/windows/common/ipc_protocol.h\"\n\n#include \"client/windows/tests/crash_generation_app/abstract_class.h\"\n\nnamespace google_breakpad {\n\nconst int kMaxLoadString = 100;\nconst wchar_t kPipeName[] = L\"\\\\\\\\.\\\\pipe\\\\BreakpadCrashServices\\\\TestServer\";\n\nconst DWORD kEditBoxStyles = WS_CHILD |\n                             WS_VISIBLE |\n                             WS_VSCROLL |\n                             ES_LEFT |\n                             ES_MULTILINE |\n                             ES_AUTOVSCROLL |\n                             ES_READONLY;\n\n// Maximum length of a line in the edit box.\nconst size_t kMaximumLineLength = 256;\n\n// CS to access edit control in a thread safe way.\nstatic CRITICAL_SECTION* cs_edit = NULL;\n\n// Edit control.\nstatic HWND client_status_edit_box;\n\nHINSTANCE current_instance;             // Current instance.\nTCHAR title[kMaxLoadString];            // Title bar text.\nTCHAR window_class[kMaxLoadString];     // Main window class name.\n\nATOM MyRegisterClass(HINSTANCE instance);\nBOOL InitInstance(HINSTANCE, int);\nLRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);\nINT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);\n\nstatic int kCustomInfoCount = 2;\nstatic CustomInfoEntry kCustomInfoEntries[] = {\n    CustomInfoEntry(L\"prod\", L\"CrashTestApp\"),\n    CustomInfoEntry(L\"ver\", L\"1.0\"),\n};\n\nstatic ExceptionHandler* handler = NULL;\nstatic CrashGenerationServer* crash_server = NULL;\n\n// Registers the window class.\n//\n// This function and its usage are only necessary if you want this code\n// to be compatible with Win32 systems prior to the 'RegisterClassEx'\n// function that was added to Windows 95. It is important to call this\n// function so that the application will get 'well formed' small icons\n// associated with it.\nATOM MyRegisterClass(HINSTANCE instance) {\n  WNDCLASSEX wcex;\n  wcex.cbSize = sizeof(WNDCLASSEX);\n  wcex.style = CS_HREDRAW | CS_VREDRAW;\n  wcex.lpfnWndProc = WndProc;\n  wcex.cbClsExtra = 0;\n  wcex.cbWndExtra = 0;\n  wcex.hInstance = instance;\n  wcex.hIcon = LoadIcon(instance,\n                        MAKEINTRESOURCE(IDI_CRASHGENERATIONAPP));\n  wcex.hCursor = LoadCursor(NULL, IDC_ARROW);\n  wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);\n  wcex.lpszMenuName = MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP);\n  wcex.lpszClassName = window_class;\n  wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));\n\n  return RegisterClassEx(&wcex);\n}\n\n// Saves instance handle and creates main window\n//\n// In this function, we save the instance handle in a global variable and\n//   create and display the main program window.\nBOOL InitInstance(HINSTANCE instance, int command_show) {\n  current_instance = instance;\n  HWND wnd = CreateWindow(window_class,\n                          title,\n                          WS_OVERLAPPEDWINDOW,\n                          CW_USEDEFAULT,\n                          0,\n                          CW_USEDEFAULT,\n                          0,\n                          NULL,\n                          NULL,\n                          instance,\n                          NULL);\n\n  if (!wnd) {\n    return FALSE;\n  }\n\n  ShowWindow(wnd, command_show);\n  UpdateWindow(wnd);\n\n  return TRUE;\n}\n\nstatic void AppendTextToEditBox(TCHAR* text) {\n  EnterCriticalSection(cs_edit);\n  SYSTEMTIME current_time;\n  GetLocalTime(&current_time);\n  TCHAR line[kMaximumLineLength];\n  int result = swprintf_s(line,\n                          kMaximumLineLength,\n                          L\"[%.2d-%.2d-%.4d %.2d:%.2d:%.2d] %s\",\n                          current_time.wMonth,\n                          current_time.wDay,\n                          current_time.wYear,\n                          current_time.wHour,\n                          current_time.wMinute,\n                          current_time.wSecond,\n                          text);\n\n  if (result == -1) {\n    return;\n  }\n\n  int length = GetWindowTextLength(client_status_edit_box);\n  SendMessage(client_status_edit_box,\n              EM_SETSEL,\n              (WPARAM)length,\n              (LPARAM)length);\n  SendMessage(client_status_edit_box,\n              EM_REPLACESEL,\n              (WPARAM)FALSE,\n              (LPARAM)line);\n  LeaveCriticalSection(cs_edit);\n}\n\nstatic DWORD WINAPI AppendTextWorker(void* context) {\n  TCHAR* text = reinterpret_cast<TCHAR*>(context);\n\n  AppendTextToEditBox(text);\n  delete[] text;\n\n  return 0;\n}\n\nbool ShowDumpResults(const wchar_t* dump_path,\n                     const wchar_t* minidump_id,\n                     void* context,\n                     EXCEPTION_POINTERS* exinfo,\n                     MDRawAssertionInfo* assertion,\n                     bool succeeded) {\n  TCHAR* text = new TCHAR[kMaximumLineLength];\n  text[0] = _T('\\0');\n  int result = swprintf_s(text,\n                          kMaximumLineLength,\n                          TEXT(\"Dump generation request %s\\r\\n\"),\n                          succeeded ? TEXT(\"succeeded\") : TEXT(\"failed\"));\n  if (result == -1) {\n    delete [] text;\n  }\n\n  QueueUserWorkItem(AppendTextWorker, text, WT_EXECUTEDEFAULT);\n  return succeeded;\n}\n\nstatic void _cdecl ShowClientConnected(void* context,\n                                       const ClientInfo* client_info) {\n  TCHAR* line = new TCHAR[kMaximumLineLength];\n  line[0] = _T('\\0');\n  int result = swprintf_s(line,\n                          kMaximumLineLength,\n                          L\"Client connected:\\t\\t%d\\r\\n\",\n                          client_info->pid());\n\n  if (result == -1) {\n    delete[] line;\n    return;\n  }\n\n  QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT);\n}\n\nstatic void _cdecl ShowClientCrashed(void* context,\n                                     const ClientInfo* client_info,\n                                     const wstring* dump_path) {\n  TCHAR* line = new TCHAR[kMaximumLineLength];\n  line[0] = _T('\\0');\n  int result = swprintf_s(line,\n                          kMaximumLineLength,\n                          TEXT(\"Client requested dump:\\t%d\\r\\n\"),\n                          client_info->pid());\n\n  if (result == -1) {\n    delete[] line;\n    return;\n  }\n\n  QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT);\n\n  CustomClientInfo custom_info = client_info->GetCustomInfo();\n  if (custom_info.count <= 0) {\n    return;\n  }\n\n  wstring str_line;\n  for (size_t i = 0; i < custom_info.count; ++i) {\n    if (i > 0) {\n      str_line += L\", \";\n    }\n    str_line += custom_info.entries[i].name;\n    str_line += L\": \";\n    str_line += custom_info.entries[i].value;\n  }\n\n  line = new TCHAR[kMaximumLineLength];\n  line[0] = _T('\\0');\n  result = swprintf_s(line,\n                      kMaximumLineLength,\n                      L\"%s\\n\",\n                      str_line.c_str());\n  if (result == -1) {\n    delete[] line;\n    return;\n  }\n  QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT);\n}\n\nstatic void _cdecl ShowClientExited(void* context,\n                                    const ClientInfo* client_info) {\n  TCHAR* line = new TCHAR[kMaximumLineLength];\n  line[0] = _T('\\0');\n  int result = swprintf_s(line,\n                          kMaximumLineLength,\n                          TEXT(\"Client exited:\\t\\t%d\\r\\n\"),\n                          client_info->pid());\n\n  if (result == -1) {\n    delete[] line;\n    return;\n  }\n\n  QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT);\n}\n\nvoid CrashServerStart() {\n  // Do not create another instance of the server.\n  if (crash_server) {\n    return;\n  }\n\n  std::wstring dump_path = L\"C:\\\\Dumps\\\\\";\n  crash_server = new CrashGenerationServer(kPipeName,\n                                           NULL,\n                                           ShowClientConnected,\n                                           NULL,\n                                           ShowClientCrashed,\n                                           NULL,\n                                           ShowClientExited,\n                                           NULL,\n                                           NULL,\n                                           NULL,\n                                           true,\n                                           &dump_path);\n\n  if (!crash_server->Start()) {\n    MessageBoxW(NULL, L\"Unable to start server\", L\"Dumper\", MB_OK);\n    delete crash_server;\n    crash_server = NULL;\n  }\n}\n\nvoid CrashServerStop() {\n  delete crash_server;\n  crash_server = NULL;\n}\n\nvoid DerefZeroCrash() {\n  int* x = 0;\n  *x = 1;\n}\n\nvoid InvalidParamCrash() {\n  printf(NULL);\n}\n\nvoid PureCallCrash() {\n  Derived derived;\n}\n\nvoid RequestDump() {\n  if (!handler->WriteMinidump()) {\n    MessageBoxW(NULL, L\"Dump request failed\", L\"Dumper\", MB_OK);\n  }\n  kCustomInfoEntries[1].set_value(L\"1.1\");\n}\n\nvoid CleanUp() {\n  if (cs_edit) {\n    DeleteCriticalSection(cs_edit);\n    delete cs_edit;\n  }\n\n  if (handler) {\n    delete handler;\n  }\n\n  if (crash_server) {\n    delete crash_server;\n  }\n}\n\n// Processes messages for the main window.\n//\n// WM_COMMAND\t- process the application menu.\n// WM_PAINT\t- Paint the main window.\n// WM_DESTROY\t- post a quit message and return.\nLRESULT CALLBACK WndProc(HWND wnd,\n                         UINT message,\n                         WPARAM w_param,\n                         LPARAM l_param) {\n  int message_id;\n  int message_event;\n  PAINTSTRUCT ps;\n  HDC hdc;\n\n#pragma warning(push)\n#pragma warning(disable:4312)\n  // Disable warning\tC4312: 'type cast' : conversion from 'LONG' to\n  // 'HINSTANCE' of greater size.\n  // The value returned by GetwindowLong in the case below returns unsigned.\n  HINSTANCE instance = (HINSTANCE)GetWindowLong(wnd, GWL_HINSTANCE);\n#pragma warning(pop)\n\n  switch (message) {\n    case WM_COMMAND:\n      // Parse the menu selections.\n      message_id = LOWORD(w_param);\n      message_event = HIWORD(w_param);\n      switch (message_id) {\n        case IDM_ABOUT:\n          DialogBox(current_instance,\n                    MAKEINTRESOURCE(IDD_ABOUTBOX),\n                    wnd,\n                    About);\n          break;\n        case IDM_EXIT:\n          DestroyWindow(wnd);\n          break;\n        case ID_SERVER_START:\n          CrashServerStart();\n          break;\n        case ID_SERVER_STOP:\n          CrashServerStop();\n          break;\n        case ID_CLIENT_DEREFZERO:\n          DerefZeroCrash();\n          break;\n        case ID_CLIENT_INVALIDPARAM:\n          InvalidParamCrash();\n          break;\n        case ID_CLIENT_PURECALL:\n          PureCallCrash();\n          break;\n        case ID_CLIENT_REQUESTEXPLICITDUMP:\n          RequestDump();\n          break;\n        default:\n          return DefWindowProc(wnd, message, w_param, l_param);\n      }\n      break;\n    case WM_CREATE:\n      client_status_edit_box = CreateWindow(TEXT(\"EDIT\"),\n                                            NULL,\n                                            kEditBoxStyles,\n                                            0,\n                                            0,\n                                            0,\n                                            0,\n                                            wnd,\n                                            NULL,\n                                            instance,\n                                            NULL);\n      break;\n    case WM_SIZE: \n      // Make the edit control the size of the window's client area. \n      MoveWindow(client_status_edit_box, \n                 0,\n                 0,\n                 LOWORD(l_param),        // width of client area.\n                 HIWORD(l_param),        // height of client area.\n                 TRUE);                  // repaint window.\n      break;\n    case WM_SETFOCUS: \n      SetFocus(client_status_edit_box);\n      break;\n    case WM_PAINT:\n      hdc = BeginPaint(wnd, &ps);\n      EndPaint(wnd, &ps);\n      break;\n    case WM_DESTROY:\n      CleanUp();\n      PostQuitMessage(0);\n      break;\n    default:\n      return DefWindowProc(wnd, message, w_param, l_param);\n  }\n\n  return 0;\n}\n\n// Message handler for about box.\nINT_PTR CALLBACK About(HWND dlg,\n                       UINT message,\n                       WPARAM w_param,\n                       LPARAM l_param) {\n  UNREFERENCED_PARAMETER(l_param);\n  switch (message) {\n    case WM_INITDIALOG:\n      return (INT_PTR)TRUE;\n\n    case WM_COMMAND:\n      if (LOWORD(w_param) == IDOK || LOWORD(w_param) == IDCANCEL) {\n        EndDialog(dlg, LOWORD(w_param));\n        return (INT_PTR)TRUE;\n      }\n      break;\n  }\n\n  return (INT_PTR)FALSE;\n}\n\n}  // namespace google_breakpad\n\nint APIENTRY _tWinMain(HINSTANCE instance,\n                       HINSTANCE previous_instance,\n                       LPTSTR command_line,\n                       int command_show) {\n  using namespace google_breakpad;\n\n  UNREFERENCED_PARAMETER(previous_instance);\n  UNREFERENCED_PARAMETER(command_line);\n\n  cs_edit = new CRITICAL_SECTION();\n  InitializeCriticalSection(cs_edit);\n\n  CustomClientInfo custom_info = {kCustomInfoEntries, kCustomInfoCount};\n\n  CrashServerStart();\n  // This is needed for CRT to not show dialog for invalid param\n  // failures and instead let the code handle it.\n  _CrtSetReportMode(_CRT_ASSERT, 0);\n  handler = new ExceptionHandler(L\"C:\\\\dumps\\\\\",\n                                 NULL,\n                                 google_breakpad::ShowDumpResults,\n                                 NULL,\n                                 ExceptionHandler::HANDLER_ALL,\n                                 MiniDumpNormal,\n                                 kPipeName,\n                                 &custom_info);\n\n  // Initialize global strings.\n  LoadString(instance, IDS_APP_TITLE, title, kMaxLoadString);\n  LoadString(instance,\n             IDC_CRASHGENERATIONAPP,\n             window_class,\n             kMaxLoadString);\n  MyRegisterClass(instance);\n\n  // Perform application initialization.\n  if (!InitInstance (instance, command_show)) {\n    return FALSE;\n  }\n\n  HACCEL accel_table = LoadAccelerators(\n      instance,\n      MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP));\n\n  // Main message loop.\n  MSG msg;\n  while (GetMessage(&msg, NULL, 0, 0)) {\n    if (!TranslateAccelerator(msg.hwnd, accel_table, &msg)) {\n      TranslateMessage(&msg);\n      DispatchMessage(&msg);\n    }\n  }\n\n  return (int)msg.wParam;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.gyp",
    "content": "# Copyright (c) 2010, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n{\n  'includes': [\n    '../../build/common.gypi',\n  ],\n  'targets': [\n    {\n      'target_name': 'crash_generation_app',\n      'type': 'executable',\n      'sources': [\n        'abstract_class.cc',\n        'abstract_class.h',\n        'crash_generation_app.cc',\n        'crash_generation_app.h',\n        'crash_generation_app.ico',\n        'crash_generation_app.rc',\n        'resource.h',\n        'small.ico',\n      ],\n      'dependencies': [\n        '../../breakpad_client.gyp:common',\n        '../../crash_generation/crash_generation.gyp:crash_generation_server',\n        '../../crash_generation/crash_generation.gyp:crash_generation_client',\n        '../../handler/exception_handler.gyp:exception_handler',\n      ],\n      'msvs_settings': {\n        'VCLinkerTool': {\n          'SubSystem': '2',  # Windows Subsystem as opposed to a console app\n        },\n      },\n    }\n  ]\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__\n#define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__\n\n#include \"resource.h\"\n\n#endif  // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.rc",
    "content": "// Microsoft Visual C++ generated resource script.\n//\n#include \"resource.h\"\n\n#define APSTUDIO_READONLY_SYMBOLS\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 2 resource.\n//\n#define APSTUDIO_HIDDEN_SYMBOLS\n#include \"windows.h\"\n#undef APSTUDIO_HIDDEN_SYMBOLS\n\n/////////////////////////////////////////////////////////////////////////////\n#undef APSTUDIO_READONLY_SYMBOLS\n\n/////////////////////////////////////////////////////////////////////////////\n// English (U.S.) resources\n\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\n#ifdef _WIN32\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\n#pragma code_page(1252)\n#endif //_WIN32\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Icon\n//\n\n// Icon with lowest ID value placed first to ensure application icon\n// remains consistent on all systems.\nIDI_CRASHGENERATIONAPP  ICON                    \"crash_generation_app.ico\"\nIDI_SMALL               ICON                    \"small.ico\"\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Menu\n//\n\nIDC_CRASHGENERATIONAPP MENU \nBEGIN\n    POPUP \"&File\"\n    BEGIN\n        MENUITEM \"E&xit\",                       IDM_EXIT\n    END\n    POPUP \"&Server\"\n    BEGIN\n        MENUITEM \"&Start\",                      ID_SERVER_START\n        MENUITEM \"S&top\",                       ID_SERVER_STOP\n    END\n    POPUP \"&Client\"\n    BEGIN\n        MENUITEM \"&Deref Zero\",                 ID_CLIENT_DEREFZERO\n        MENUITEM \"&Invalid Param\",              ID_CLIENT_INVALIDPARAM\n        MENUITEM \"&Pure Call\",                  ID_CLIENT_PURECALL\n        MENUITEM \"&Request Dump\",               ID_CLIENT_REQUESTEXPLICITDUMP\n    END\nEND\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Accelerator\n//\n\nIDC_CRASHGENERATIONAPP ACCELERATORS \nBEGIN\n    \"?\",            IDM_ABOUT,              ASCII,  ALT\n    \"/\",            IDM_ABOUT,              ASCII,  ALT\nEND\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Dialog\n//\n\nIDD_ABOUTBOX DIALOG  22, 17, 230, 75\nSTYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU\nCAPTION \"About\"\nFONT 8, \"System\"\nBEGIN\n    ICON            IDI_CRASHGENERATIONAPP,IDC_MYICON,14,9,16,16\n    LTEXT           \"CrashGenerationApp Version 1.0\",IDC_STATIC,49,10,119,8,SS_NOPREFIX\n    LTEXT           \"Copyright (C) 2008\",IDC_STATIC,49,20,119,8\n    DEFPUSHBUTTON   \"OK\",IDOK,195,6,30,11,WS_GROUP\nEND\n\n\n#ifdef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// TEXTINCLUDE\n//\n\n1 TEXTINCLUDE \nBEGIN\n    \"resource.h\\0\"\nEND\n\n2 TEXTINCLUDE \nBEGIN\n    \"#define APSTUDIO_HIDDEN_SYMBOLS\\r\\n\"\n    \"#include \"\"windows.h\"\"\\r\\n\"\n    \"#undef APSTUDIO_HIDDEN_SYMBOLS\\r\\n\"\n    \"\\0\"\nEND\n\n3 TEXTINCLUDE \nBEGIN\n    \"\\r\\n\"\n    \"\\0\"\nEND\n\n#endif    // APSTUDIO_INVOKED\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// String Table\n//\n\nSTRINGTABLE \nBEGIN\n    IDS_APP_TITLE           \"CrashGenerationApp\"\n    IDC_CRASHGENERATIONAPP  \"CRASHGENERATIONAPP\"\nEND\n\n#endif    // English (U.S.) resources\n/////////////////////////////////////////////////////////////////////////////\n\n\n\n#ifndef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 3 resource.\n//\n\n\n/////////////////////////////////////////////////////////////////////////////\n#endif    // not APSTUDIO_INVOKED\n\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/tests/crash_generation_app/resource.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// PreCompile.h : include file for standard system include files,\n// or project specific include files that are used frequently, but\n// are changed infrequently\n//\n\n#ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_RESOURCE_H__\n#define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_RESOURCE_H__\n\n//{{NO_DEPENDENCIES}}\n// Microsoft Visual C++ generated include file.\n// Used by crash_generation_app.rc\n//\n#define IDC_MYICON                      2\n#define IDD_CRASHGENERATIONAPP_DIALOG   102\n#define IDS_APP_TITLE                   103\n#define IDD_ABOUTBOX                    103\n#define IDM_ABOUT                       104\n#define IDM_EXIT                        105\n#define IDI_CRASHGENERATIONAPP          107\n#define IDI_SMALL                       108\n#define IDC_CRASHGENERATIONAPP          109\n#define IDR_MAINFRAME                   128\n#define ID_SERVER_START                 32771\n#define ID_SERVER_STOP                  32772\n#define ID_CLIENT_INVALIDPARAM          32773\n#define ID_CLIENT_ASSERTFAILURE         32774\n#define ID_CLIENT_DEREFZERO             32775\n#define ID_CLIENT_PURECALL              32777\n#define ID_CLIENT_REQUESTEXPLICITDUMP   32778\n#define IDC_STATIC                      -1\n\n// Next default values for new objects\n// \n#ifdef APSTUDIO_INVOKED\n#ifndef APSTUDIO_READONLY_SYMBOLS\n#define _APS_NO_MFC                     1\n#define _APS_NEXT_RESOURCE_VALUE        129\n#define _APS_NEXT_COMMAND_VALUE         32780\n#define _APS_NEXT_CONTROL_VALUE         1000\n#define _APS_NEXT_SYMED_VALUE           110\n#endif\n#endif\n\n#endif  // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_RESOURCE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/unittests/client_tests.gyp",
    "content": "# Copyright (c) 2010, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n{\n  'includes': [\n    '../build/common.gypi',\n  ],\n  'targets': [\n    {\n      'target_name': 'client_tests',\n      'type': 'executable',\n      'sources': [\n        'exception_handler_test.cc',\n        'exception_handler_death_test.cc',\n        'minidump_test.cc',\n        'dump_analysis.cc',\n        'dump_analysis.h',\n        'crash_generation_server_test.cc'\n      ],\n      'dependencies': [\n        'testing.gyp:gtest',\n        'testing.gyp:gmock',\n        '../breakpad_client.gyp:common',\n        '../crash_generation/crash_generation.gyp:crash_generation_server',\n        '../crash_generation/crash_generation.gyp:crash_generation_client',\n        '../handler/exception_handler.gyp:exception_handler',\n\t'processor_bits',\n      ]\n    },\n    {\n      'target_name': 'processor_bits',\n      'type': 'static_library',\n      'include_dirs': [\n        '<(DEPTH)',\n      ],\n      'direct_dependent_settings': {\n        'include_dirs': [\n          '<(DEPTH)',\n        ]\n      },\n      'sources': [\n        '<(DEPTH)/common/string_conversion.cc',\n        '<(DEPTH)/processor/basic_code_modules.cc',\n        '<(DEPTH)/processor/logging.cc',\n        '<(DEPTH)/processor/minidump.cc',\n        '<(DEPTH)/processor/pathname_stripper.cc',\n      ]\n    }\n  ],\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/unittests/crash_generation_server_test.cc",
    "content": "// Copyright 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include \"testing/gtest/include/gtest/gtest.h\"\n#include \"testing/include/gmock/gmock.h\"\n\n#include \"client/windows/crash_generation/crash_generation_server.h\"\n#include \"client/windows/common/ipc_protocol.h\"\n\nusing testing::_;\n\nnamespace {\n\nconst wchar_t kPipeName[] =\n  L\"\\\\\\\\.\\\\pipe\\\\CrashGenerationServerTest\\\\TestCaseServer\";\n\nconst DWORD kPipeDesiredAccess = FILE_READ_DATA |\n                                 FILE_WRITE_DATA |\n                                 FILE_WRITE_ATTRIBUTES;\n\nconst DWORD kPipeFlagsAndAttributes = SECURITY_IDENTIFICATION |\n                                      SECURITY_SQOS_PRESENT;\n\nconst DWORD kPipeMode = PIPE_READMODE_MESSAGE;\n\nint kCustomInfoCount = 2;\n\ngoogle_breakpad::CustomInfoEntry kCustomInfoEntries[] = {\n    google_breakpad::CustomInfoEntry(L\"prod\", L\"CrashGenerationServerTest\"),\n    google_breakpad::CustomInfoEntry(L\"ver\", L\"1.0\"),\n};\n\nclass CrashGenerationServerTest : public ::testing::Test {\n public:\n  CrashGenerationServerTest()\n      : crash_generation_server_(kPipeName,\n                                 NULL,\n                                 CallOnClientConnected, &mock_callbacks_,\n                                 CallOnClientDumpRequested, &mock_callbacks_,\n                                 CallOnClientExited, &mock_callbacks_,\n                                 CallOnClientUploadRequested, &mock_callbacks_,\n                                 false,\n                                 NULL),\n        thread_id_(0),\n        exception_pointers_(NULL) {\n    memset(&assert_info_, 0, sizeof(assert_info_));\n  }\n\n protected:\n  class MockCrashGenerationServerCallbacks {\n   public:\n    MOCK_METHOD1(OnClientConnected,\n                 void(const google_breakpad::ClientInfo* client_info));\n    MOCK_METHOD2(OnClientDumpRequested,\n                 void(const google_breakpad::ClientInfo* client_info,\n                      const std::wstring* file_path));\n    MOCK_METHOD1(OnClientExited,\n                 void(const google_breakpad::ClientInfo* client_info));\n    MOCK_METHOD1(OnClientUploadRequested,\n                 void(const DWORD crash_id));\n  };\n\n  enum ClientFault {\n    NO_FAULT,\n    CLOSE_AFTER_CONNECT,\n    SEND_INVALID_REGISTRATION,\n    TRUNCATE_REGISTRATION,\n    CLOSE_AFTER_REGISTRATION,\n    RESPONSE_BUFFER_TOO_SMALL,\n    CLOSE_AFTER_RESPONSE,\n    SEND_INVALID_ACK\n  };\n\n  void SetUp() {\n    ASSERT_TRUE(crash_generation_server_.Start());\n  }\n\n  void FaultyClient(ClientFault fault_type) {\n    HANDLE pipe = CreateFile(kPipeName,\n                             kPipeDesiredAccess,\n                             0,\n                             NULL,\n                             OPEN_EXISTING,\n                             kPipeFlagsAndAttributes,\n                             NULL);\n\n    if (pipe == INVALID_HANDLE_VALUE) {\n      ASSERT_EQ(ERROR_PIPE_BUSY, GetLastError());\n\n      // Cannot continue retrying if wait on pipe fails.\n      ASSERT_TRUE(WaitNamedPipe(kPipeName, 500));\n\n      pipe = CreateFile(kPipeName,\n                        kPipeDesiredAccess,\n                        0,\n                        NULL,\n                        OPEN_EXISTING,\n                        kPipeFlagsAndAttributes,\n                        NULL);\n    }\n\n    ASSERT_NE(pipe, INVALID_HANDLE_VALUE);\n\n    DWORD mode = kPipeMode;\n    ASSERT_TRUE(SetNamedPipeHandleState(pipe, &mode, NULL, NULL));\n\n    DoFaultyClient(fault_type, pipe);\n\n    CloseHandle(pipe);\n  }\n\n  void DoTestFault(ClientFault fault) {\n    EXPECT_CALL(mock_callbacks_, OnClientConnected(_)).Times(0);\n    ASSERT_NO_FATAL_FAILURE(FaultyClient(fault));\n    ASSERT_NO_FATAL_FAILURE(FaultyClient(fault));\n    ASSERT_NO_FATAL_FAILURE(FaultyClient(fault));\n\n    EXPECT_CALL(mock_callbacks_, OnClientConnected(_));\n\n    ASSERT_NO_FATAL_FAILURE(FaultyClient(NO_FAULT));\n\n    // Slight hack. The OnClientConnected is only invoked after the ack is\n    // received by the server. At that point, the FaultyClient call has already\n    // returned. The best way to wait until the server is done handling that is\n    // to send one more ping, whose processing will be blocked by delivery of\n    // the OnClientConnected message.\n    ASSERT_NO_FATAL_FAILURE(FaultyClient(CLOSE_AFTER_CONNECT));\n  }\n\n  MockCrashGenerationServerCallbacks mock_callbacks_;\n\n private:\n  // Depends on the caller to successfully open the pipe before invocation and\n  // to close it immediately afterwards.\n  void DoFaultyClient(ClientFault fault_type, HANDLE pipe) {\n    if (fault_type == CLOSE_AFTER_CONNECT) {\n      return;\n    }\n\n    google_breakpad::CustomClientInfo custom_info = {kCustomInfoEntries,\n                                                     kCustomInfoCount};\n\n    google_breakpad::ProtocolMessage msg(\n      fault_type == SEND_INVALID_REGISTRATION ?\n        google_breakpad::MESSAGE_TAG_NONE :\n        google_breakpad::MESSAGE_TAG_REGISTRATION_REQUEST,\n      GetCurrentProcessId(),\n      MiniDumpNormal,\n      &thread_id_,\n      &exception_pointers_,\n      &assert_info_,\n      custom_info,\n      NULL,\n      NULL,\n      NULL);\n\n    DWORD bytes_count = 0;\n\n    ASSERT_TRUE(WriteFile(pipe,\n                          &msg,\n                          fault_type == TRUNCATE_REGISTRATION ?\n                            sizeof(msg) / 2 : sizeof(msg),\n                          &bytes_count,\n                          NULL));\n\n    if (fault_type == CLOSE_AFTER_REGISTRATION) {\n      return;\n    }\n\n    google_breakpad::ProtocolMessage reply;\n\n    if (!ReadFile(pipe,\n                  &reply,\n                  fault_type == RESPONSE_BUFFER_TOO_SMALL ?\n                    sizeof(google_breakpad::ProtocolMessage) / 2 :\n                    sizeof(google_breakpad::ProtocolMessage),\n                  &bytes_count,\n                  NULL)) {\n      switch (fault_type) {\n        case TRUNCATE_REGISTRATION:\n        case RESPONSE_BUFFER_TOO_SMALL:\n        case SEND_INVALID_REGISTRATION:\n          return;\n\n        default:\n          FAIL() << \"Unexpectedly failed to register.\";\n      }\n    }\n\n    if (fault_type == CLOSE_AFTER_RESPONSE) {\n      return;\n    }\n\n    google_breakpad::ProtocolMessage ack_msg;\n    ack_msg.tag = google_breakpad::MESSAGE_TAG_REGISTRATION_ACK;\n\n    ASSERT_TRUE(WriteFile(pipe,\n                          &ack_msg,\n                          SEND_INVALID_ACK ?\n                            sizeof(ack_msg) : sizeof(ack_msg) / 2,\n                          &bytes_count,\n                          NULL));\n\n    return;\n  }\n\n  static void CallOnClientConnected(\n    void* context, const google_breakpad::ClientInfo* client_info) {\n    static_cast<MockCrashGenerationServerCallbacks*>(context)->\n      OnClientConnected(client_info);\n  }\n\n  static void CallOnClientDumpRequested(\n    void* context,\n    const google_breakpad::ClientInfo* client_info,\n    const std::wstring* file_path) {\n    static_cast<MockCrashGenerationServerCallbacks*>(context)->\n      OnClientDumpRequested(client_info, file_path);\n  }\n\n  static void CallOnClientExited(\n    void* context, const google_breakpad::ClientInfo* client_info) {\n    static_cast<MockCrashGenerationServerCallbacks*>(context)->\n      OnClientExited(client_info);\n  }\n\n  static void CallOnClientUploadRequested(void* context, const DWORD crash_id) {\n    static_cast<MockCrashGenerationServerCallbacks*>(context)->\n      OnClientUploadRequested(crash_id);\n  }\n\n  DWORD thread_id_;\n  EXCEPTION_POINTERS* exception_pointers_;\n  MDRawAssertionInfo assert_info_;\n\n  google_breakpad::CrashGenerationServer crash_generation_server_;\n};\n\nTEST_F(CrashGenerationServerTest, PingServerTest) {\n  DoTestFault(CLOSE_AFTER_CONNECT);\n}\n\nTEST_F(CrashGenerationServerTest, InvalidRegistration) {\n  DoTestFault(SEND_INVALID_REGISTRATION);\n}\n\nTEST_F(CrashGenerationServerTest, TruncateRegistration) {\n  DoTestFault(TRUNCATE_REGISTRATION);\n}\n\nTEST_F(CrashGenerationServerTest, CloseAfterRegistration) {\n  DoTestFault(CLOSE_AFTER_REGISTRATION);\n}\n\nTEST_F(CrashGenerationServerTest, ResponseBufferTooSmall) {\n  DoTestFault(RESPONSE_BUFFER_TOO_SMALL);\n}\n\nTEST_F(CrashGenerationServerTest, CloseAfterResponse) {\n  DoTestFault(CLOSE_AFTER_RESPONSE);\n}\n\n// It turns out that, as long as you send one byte, the ACK is accepted and\n// registration succeeds.\nTEST_F(CrashGenerationServerTest, SendInvalidAck) {\n  EXPECT_CALL(mock_callbacks_, OnClientConnected(_));\n  ASSERT_NO_FATAL_FAILURE(FaultyClient(SEND_INVALID_ACK));\n\n  // See DoTestFault for an explanation of this line\n  ASSERT_NO_FATAL_FAILURE(FaultyClient(CLOSE_AFTER_CONNECT));\n\n  EXPECT_CALL(mock_callbacks_, OnClientConnected(_));\n  ASSERT_NO_FATAL_FAILURE(FaultyClient(NO_FAULT));\n\n  // See DoTestFault for an explanation of this line\n  ASSERT_NO_FATAL_FAILURE(FaultyClient(CLOSE_AFTER_CONNECT));\n}\n\n}  // anonymous namespace\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/unittests/dump_analysis.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <windows.h>\n#include <objbase.h>\n#include <dbghelp.h>\n\n#include \"dump_analysis.h\"  // NOLINT\n#include \"gtest/gtest.h\"\n\nDumpAnalysis::~DumpAnalysis() {\n  if (dump_file_view_ != NULL) {\n    EXPECT_TRUE(::UnmapViewOfFile(dump_file_view_));\n    ::CloseHandle(dump_file_mapping_);\n    dump_file_mapping_ = NULL;\n  }\n\n  if (dump_file_handle_ != NULL) {\n    ::CloseHandle(dump_file_handle_);\n    dump_file_handle_ = NULL;\n  }\n}\n\nvoid DumpAnalysis::EnsureDumpMapped() {\n  if (dump_file_view_ == NULL) {\n    dump_file_handle_ = ::CreateFile(dump_file_.c_str(),\n      GENERIC_READ,\n      0,\n      NULL,\n      OPEN_EXISTING,\n      0,\n      NULL);\n    ASSERT_TRUE(dump_file_handle_ != NULL);\n    ASSERT_TRUE(dump_file_mapping_ == NULL);\n\n    dump_file_mapping_ = ::CreateFileMapping(dump_file_handle_,\n      NULL,\n      PAGE_READONLY,\n      0,\n      0,\n      NULL);\n    ASSERT_TRUE(dump_file_mapping_ != NULL);\n\n    dump_file_view_ = ::MapViewOfFile(dump_file_mapping_,\n      FILE_MAP_READ,\n      0,\n      0,\n      0);\n    ASSERT_TRUE(dump_file_view_ != NULL);\n  }\n}\n\nbool DumpAnalysis::HasTebs() const {\n  MINIDUMP_THREAD_LIST* thread_list = NULL;\n  size_t thread_list_size = GetStream(ThreadListStream, &thread_list);\n\n  if (thread_list_size > 0 && thread_list != NULL) {\n    for (ULONG i = 0; i < thread_list->NumberOfThreads; ++i) {\n      if (!HasMemory(thread_list->Threads[i].Teb))\n        return false;\n    }\n\n    return true;\n  }\n\n  // No thread list, no TEB info.\n  return false;\n}\n\nbool DumpAnalysis::HasPeb() const {\n  MINIDUMP_THREAD_LIST* thread_list = NULL;\n  size_t thread_list_size = GetStream(ThreadListStream, &thread_list);\n\n  if (thread_list_size > 0 && thread_list != NULL &&\n      thread_list->NumberOfThreads > 0) {\n    FakeTEB* teb = NULL;\n    if (!HasMemory(thread_list->Threads[0].Teb, &teb))\n      return false;\n\n    return HasMemory(teb->peb);\n  }\n\n  return false;\n}\n\nbool DumpAnalysis::HasStream(ULONG stream_number) const {\n  void* stream = NULL;\n  size_t stream_size = GetStreamImpl(stream_number, &stream);\n  return stream_size > 0 && stream != NULL;\n}\n\nsize_t DumpAnalysis::GetStreamImpl(ULONG stream_number, void** stream) const {\n  MINIDUMP_DIRECTORY* directory = NULL;\n  ULONG memory_list_size = 0;\n  BOOL ret = ::MiniDumpReadDumpStream(dump_file_view_,\n                                      stream_number,\n                                      &directory,\n                                      stream,\n                                      &memory_list_size);\n\n  return ret ? memory_list_size : 0;\n}\n\nbool DumpAnalysis::HasMemoryImpl(const void *addr_in, size_t structuresize,\n                                 void **structure) const {\n  uintptr_t address = reinterpret_cast<uintptr_t>(addr_in);\n  MINIDUMP_MEMORY_LIST* memory_list = NULL;\n  size_t memory_list_size = GetStream(MemoryListStream, &memory_list);\n  if (memory_list_size > 0 && memory_list != NULL) {\n    for (ULONG i = 0; i < memory_list->NumberOfMemoryRanges; ++i) {\n      MINIDUMP_MEMORY_DESCRIPTOR& descr = memory_list->MemoryRanges[i];\n      const uintptr_t range_start =\n          static_cast<uintptr_t>(descr.StartOfMemoryRange);\n      uintptr_t range_end = range_start + descr.Memory.DataSize;\n\n      if (address >= range_start &&\n          address + structuresize < range_end) {\n        // The start address falls in the range, and the end address is\n        // in bounds, return a pointer to the structure if requested.\n        if (structure != NULL)\n          *structure = RVA_TO_ADDR(dump_file_view_, descr.Memory.Rva);\n\n        return true;\n      }\n    }\n  }\n\n  // We didn't find the range in a MINIDUMP_MEMORY_LIST, so maybe this\n  // is a full dump using MINIDUMP_MEMORY64_LIST with all the memory at the\n  // end of the dump file.\n  MINIDUMP_MEMORY64_LIST* memory64_list = NULL;\n  memory_list_size = GetStream(Memory64ListStream, &memory64_list);\n  if (memory_list_size > 0 && memory64_list != NULL) {\n    // Keep track of where the current descriptor maps to.\n    RVA64 curr_rva = memory64_list->BaseRva;\n    for (ULONG i = 0; i < memory64_list->NumberOfMemoryRanges; ++i) {\n      MINIDUMP_MEMORY_DESCRIPTOR64& descr = memory64_list->MemoryRanges[i];\n      uintptr_t range_start =\n          static_cast<uintptr_t>(descr.StartOfMemoryRange);\n      uintptr_t range_end = range_start + static_cast<size_t>(descr.DataSize);\n\n      if (address >= range_start &&\n          address + structuresize < range_end) {\n        // The start address falls in the range, and the end address is\n        // in bounds, return a pointer to the structure if requested.\n        if (structure != NULL)\n          *structure = RVA_TO_ADDR(dump_file_view_, curr_rva);\n\n        return true;\n      }\n\n      // Advance the current RVA.\n      curr_rva += descr.DataSize;\n    }\n  }\n\n  return false;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/unittests/dump_analysis.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef CLIENT_WINDOWS_UNITTESTS_DUMP_ANALYSIS_H_\n#define CLIENT_WINDOWS_UNITTESTS_DUMP_ANALYSIS_H_\n\n#include \"../crash_generation/minidump_generator.h\"\n\n// Convenience to get to the PEB pointer in a TEB.\nstruct FakeTEB {\n  char dummy[0x30];\n  void* peb;\n};\n\nclass DumpAnalysis {\n public:\n  explicit DumpAnalysis(const std::wstring& file_path)\n      : dump_file_(file_path), dump_file_view_(NULL), dump_file_mapping_(NULL),\n        dump_file_handle_(NULL) {\n    EnsureDumpMapped();\n  }\n  ~DumpAnalysis();\n\n  bool HasStream(ULONG stream_number) const;\n\n  // This is template to keep type safety in the front, but we end up casting\n  // to void** inside the implementation to pass the pointer to Win32. So\n  // casting here is considered safe.\n  template <class StreamType>\n  size_t GetStream(ULONG stream_number, StreamType** stream) const {\n    return GetStreamImpl(stream_number, reinterpret_cast<void**>(stream));\n  }\n\n  bool HasTebs() const;\n  bool HasPeb() const;\n  bool HasMemory(ULONG64 address) const {\n    return HasMemory<BYTE>(address, NULL);\n  }\n\n  bool HasMemory(const void* address) const {\n    return HasMemory<BYTE>(address, NULL);\n  }\n\n  template <class StructureType>\n  bool HasMemory(ULONG64 address, StructureType** structure = NULL) const {\n    // We can't cope with 64 bit addresses for now.\n    if (address > 0xFFFFFFFFUL)\n      return false;\n\n    return HasMemory(reinterpret_cast<void*>(address), structure);\n  }\n\n  template <class StructureType>\n  bool HasMemory(const void* addr_in, StructureType** structure = NULL) const {\n    return HasMemoryImpl(addr_in, sizeof(StructureType),\n                             reinterpret_cast<void**>(structure));\n  }\n\n protected:\n  void EnsureDumpMapped();\n\n  HANDLE dump_file_mapping_;\n  HANDLE dump_file_handle_;\n  void* dump_file_view_;\n  std::wstring dump_file_;\n\n private:\n  // This is the implementation of GetStream<>.\n  size_t GetStreamImpl(ULONG stream_number, void** stream) const;\n\n  // This is the implementation of HasMemory<>.\n  bool HasMemoryImpl(const void* addr_in, size_t pointersize,\n                     void** structure) const;\n};\n\n#endif  // CLIENT_WINDOWS_UNITTESTS_DUMP_ANALYSIS_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/unittests/exception_handler_death_test.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <windows.h>\n#include <dbghelp.h>\n#include <strsafe.h>\n#include <objbase.h>\n#include <shellapi.h>\n\n#include <string>\n\n#include \"../../../breakpad_googletest_includes.h\"\n#include \"../../../../common/windows/string_utils-inl.h\"\n#include \"../crash_generation/crash_generation_server.h\"\n#include \"../handler/exception_handler.h\"\n#include \"../../../../google_breakpad/processor/minidump.h\"\n\nnamespace {\n\nusing std::wstring;\nusing namespace google_breakpad;\n\nconst wchar_t kPipeName[] = L\"\\\\\\\\.\\\\pipe\\\\BreakpadCrashTest\\\\TestCaseServer\";\nconst char kSuccessIndicator[] = \"success\";\nconst char kFailureIndicator[] = \"failure\";\n\n// Utility function to test for a path's existence.\nBOOL DoesPathExist(const TCHAR *path_name);\n\nclass ExceptionHandlerDeathTest : public ::testing::Test {\n protected:\n  // Member variable for each test that they can use\n  // for temporary storage.\n  TCHAR temp_path_[MAX_PATH];\n  // Actually constructs a temp path name.\n  virtual void SetUp();\n  // A helper method that tests can use to crash.\n  void DoCrashAccessViolation();\n  void DoCrashPureVirtualCall();\n};\n\nvoid ExceptionHandlerDeathTest::SetUp() {\n  const ::testing::TestInfo* const test_info =\n    ::testing::UnitTest::GetInstance()->current_test_info();\n  TCHAR temp_path[MAX_PATH] = { '\\0' };\n  TCHAR test_name_wide[MAX_PATH] = { '\\0' };\n  // We want the temporary directory to be what the OS returns\n  // to us, + the test case name.\n  GetTempPath(MAX_PATH, temp_path);\n  // The test case name is exposed as a c-style string,\n  // convert it to a wchar_t string.\n  int dwRet = MultiByteToWideChar(CP_ACP, 0, test_info->name(),\n                                  strlen(test_info->name()),\n                                  test_name_wide,\n                                  MAX_PATH);\n  if (!dwRet) {\n    assert(false);\n  }\n  StringCchPrintfW(temp_path_, MAX_PATH, L\"%s%s\", temp_path, test_name_wide);\n  CreateDirectory(temp_path_, NULL);\n}\n\nBOOL DoesPathExist(const TCHAR *path_name) {\n  DWORD flags = GetFileAttributes(path_name);\n  if (flags == INVALID_FILE_ATTRIBUTES) {\n    return FALSE;\n  }\n  return TRUE;\n}\n\nbool MinidumpWrittenCallback(const wchar_t* dump_path,\n                             const wchar_t* minidump_id,\n                             void* context,\n                             EXCEPTION_POINTERS* exinfo,\n                             MDRawAssertionInfo* assertion,\n                             bool succeeded) {\n  if (succeeded && DoesPathExist(dump_path)) {\n    fprintf(stderr, kSuccessIndicator);\n  } else {\n    fprintf(stderr, kFailureIndicator);\n  }\n  // If we don't flush, the output doesn't get sent before\n  // this process dies.\n  fflush(stderr);\n  return succeeded;\n}\n\nTEST_F(ExceptionHandlerDeathTest, InProcTest) {\n  // For the in-proc test, we just need to instantiate an exception\n  // handler in in-proc mode, and crash.   Since the entire test is\n  // reexecuted in the child process, we don't have to worry about\n  // the semantics of the exception handler being inherited/not\n  // inherited across CreateProcess().\n  ASSERT_TRUE(DoesPathExist(temp_path_));\n  google_breakpad::ExceptionHandler *exc =\n    new google_breakpad::ExceptionHandler(\n    temp_path_, NULL, &MinidumpWrittenCallback, NULL,\n    google_breakpad::ExceptionHandler::HANDLER_ALL);\n  int *i = NULL;\n  ASSERT_DEATH((*i)++, kSuccessIndicator);\n  delete exc;\n}\n\nstatic bool gDumpCallbackCalled = false;\n\nvoid clientDumpCallback(void *dump_context,\n                        const google_breakpad::ClientInfo *client_info,\n                        const std::wstring *dump_path) {\n  gDumpCallbackCalled = true;\n}\n\nvoid ExceptionHandlerDeathTest::DoCrashAccessViolation() {\n  google_breakpad::ExceptionHandler *exc =\n    new google_breakpad::ExceptionHandler(\n    temp_path_, NULL, NULL, NULL,\n    google_breakpad::ExceptionHandler::HANDLER_ALL, MiniDumpNormal, kPipeName,\n    NULL);\n  // Although this is executing in the child process of the death test,\n  // if it's not true we'll still get an error rather than the crash\n  // being expected.\n  ASSERT_TRUE(exc->IsOutOfProcess());\n  int *i = NULL;\n  printf(\"%d\\n\", (*i)++);\n}\n\nTEST_F(ExceptionHandlerDeathTest, OutOfProcTest) {\n  // We can take advantage of a detail of google test here to save some\n  // complexity in testing: when you do a death test, it actually forks.\n  // So we can make the main test harness the crash generation server,\n  // and call ASSERT_DEATH on a NULL dereference, it to expecting test\n  // the out of process scenario, since it's happening in a different\n  // process!  This is different from the above because, above, we pass\n  // a NULL pipe name, and we also don't start a crash generation server.\n\n  ASSERT_TRUE(DoesPathExist(temp_path_));\n  std::wstring dump_path(temp_path_);\n  google_breakpad::CrashGenerationServer server(\n    kPipeName, NULL, NULL, NULL, &clientDumpCallback, NULL, NULL, NULL, NULL,\n    NULL, true, &dump_path);\n\n  // This HAS to be EXPECT_, because when this test case is executed in the\n  // child process, the server registration will fail due to the named pipe\n  // being the same.\n  EXPECT_TRUE(server.Start());\n  EXPECT_FALSE(gDumpCallbackCalled);\n  ASSERT_DEATH(this->DoCrashAccessViolation(), \"\");\n  EXPECT_TRUE(gDumpCallbackCalled);\n}\n\nTEST_F(ExceptionHandlerDeathTest, InvalidParameterTest) {\n  using google_breakpad::ExceptionHandler;\n\n  ASSERT_TRUE(DoesPathExist(temp_path_));\n  ExceptionHandler handler(temp_path_, NULL, NULL, NULL,\n                           ExceptionHandler::HANDLER_INVALID_PARAMETER);\n\n  // Disable the message box for assertions\n  _CrtSetReportMode(_CRT_ASSERT, 0);\n\n  // Call with a bad argument. The invalid parameter will be swallowed\n  // and a dump will be generated, the process will exit(0).\n  ASSERT_EXIT(printf(NULL), ::testing::ExitedWithCode(0), \"\");\n}\n\n\nstruct PureVirtualCallBase {\n  PureVirtualCallBase() {\n    // We have to reinterpret so the linker doesn't get confused because the\n    // method isn't defined.\n    reinterpret_cast<PureVirtualCallBase*>(this)->PureFunction();\n  }\n  virtual ~PureVirtualCallBase() {}\n  virtual void PureFunction() const = 0;\n};\nstruct PureVirtualCall : public PureVirtualCallBase {\n  PureVirtualCall() { PureFunction(); }\n  virtual void PureFunction() const {}\n};\n\nvoid ExceptionHandlerDeathTest::DoCrashPureVirtualCall() {\n  PureVirtualCall instance;\n}\n\nTEST_F(ExceptionHandlerDeathTest, PureVirtualCallTest) {\n  using google_breakpad::ExceptionHandler;\n\n  ASSERT_TRUE(DoesPathExist(temp_path_));\n  ExceptionHandler handler(temp_path_, NULL, NULL, NULL,\n                           ExceptionHandler::HANDLER_PURECALL);\n\n  // Disable the message box for assertions\n  _CrtSetReportMode(_CRT_ASSERT, 0);\n\n  // Calls a pure virtual function.\n  EXPECT_EXIT(DoCrashPureVirtualCall(), ::testing::ExitedWithCode(0), \"\");\n}\n\nwstring find_minidump_in_directory(const wstring &directory) {\n  wstring search_path = directory + L\"\\\\*\";\n  WIN32_FIND_DATA find_data;\n  HANDLE find_handle = FindFirstFileW(search_path.c_str(), &find_data);\n  if (find_handle == INVALID_HANDLE_VALUE)\n    return wstring();\n\n  wstring filename;\n  do {\n    const wchar_t extension[] = L\".dmp\";\n    const int extension_length = sizeof(extension) / sizeof(extension[0]) - 1;\n    const int filename_length = wcslen(find_data.cFileName);\n    if (filename_length > extension_length &&\n    wcsncmp(extension,\n            find_data.cFileName + filename_length - extension_length,\n            extension_length) == 0) {\n      filename = directory + L\"\\\\\" + find_data.cFileName;\n      break;\n    }\n  } while(FindNextFile(find_handle, &find_data));\n  FindClose(find_handle);\n  return filename;\n}\n\nTEST_F(ExceptionHandlerDeathTest, InstructionPointerMemory) {\n  ASSERT_TRUE(DoesPathExist(temp_path_));\n  google_breakpad::ExceptionHandler *exc =\n      new google_breakpad::ExceptionHandler(\n          temp_path_, NULL, NULL, NULL,\n          google_breakpad::ExceptionHandler::HANDLER_ALL);\n\n  // Get some executable memory.\n  const u_int32_t kMemorySize = 256;  // bytes\n  const int kOffset = kMemorySize / 2;\n  // This crashes with SIGILL on x86/x86-64/arm.\n  const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff };\n  char* memory = reinterpret_cast<char*>(VirtualAlloc(NULL,\n                                                      kMemorySize,\n                                                      MEM_COMMIT | MEM_RESERVE,\n                                                      PAGE_EXECUTE_READWRITE));\n  ASSERT_TRUE(memory);\n\n  // Write some instructions that will crash. Put them\n  // in the middle of the block of memory, because the\n  // minidump should contain 128 bytes on either side of the\n  // instruction pointer.\n  memcpy(memory + kOffset, instructions, sizeof(instructions));\n  \n  // Now execute the instructions, which should crash.\n  typedef void (*void_function)(void);\n  void_function memory_function =\n      reinterpret_cast<void_function>(memory + kOffset);\n  ASSERT_DEATH(memory_function(), \"\");\n\n  // free the memory.\n  VirtualFree(memory, 0, MEM_RELEASE);\n\n  // Verify that the resulting minidump contains the memory around the IP\n  wstring minidump_filename_wide = find_minidump_in_directory(temp_path_);\n  ASSERT_FALSE(minidump_filename_wide.empty());\n  string minidump_filename;\n  ASSERT_TRUE(WindowsStringUtils::safe_wcstombs(minidump_filename_wide,\n                                                &minidump_filename));\n\n  // Read the minidump. Locate the exception record and the\n  // memory list, and then ensure that there is a memory region\n  // in the memory list that covers the instruction pointer from\n  // the exception record.\n  {\n    Minidump minidump(minidump_filename);\n    ASSERT_TRUE(minidump.Read());\n\n    MinidumpException* exception = minidump.GetException();\n    MinidumpMemoryList* memory_list = minidump.GetMemoryList();\n    ASSERT_TRUE(exception);\n    ASSERT_TRUE(memory_list);\n    ASSERT_LT((unsigned)0, memory_list->region_count());\n\n    MinidumpContext* context = exception->GetContext();\n    ASSERT_TRUE(context);\n\n    u_int64_t instruction_pointer;\n    switch (context->GetContextCPU()) {\n    case MD_CONTEXT_X86:\n      instruction_pointer = context->GetContextX86()->eip;\n      break;\n    case MD_CONTEXT_AMD64:\n      instruction_pointer = context->GetContextAMD64()->rip;\n      break;\n    default:\n      FAIL() << \"Unknown context CPU: \" << context->GetContextCPU();\n      break;\n    }\n\n    MinidumpMemoryRegion* region =\n        memory_list->GetMemoryRegionForAddress(instruction_pointer);\n    ASSERT_TRUE(region);\n\n    EXPECT_EQ(kMemorySize, region->GetSize());\n    const u_int8_t* bytes = region->GetMemory();\n    ASSERT_TRUE(bytes);\n\n    u_int8_t prefix_bytes[kOffset];\n    u_int8_t suffix_bytes[kMemorySize - kOffset - sizeof(instructions)];\n    memset(prefix_bytes, 0, sizeof(prefix_bytes));\n    memset(suffix_bytes, 0, sizeof(suffix_bytes));\n    EXPECT_TRUE(memcmp(bytes, prefix_bytes, sizeof(prefix_bytes)) == 0);\n    EXPECT_TRUE(memcmp(bytes + kOffset, instructions,\n                       sizeof(instructions)) == 0);\n    EXPECT_TRUE(memcmp(bytes + kOffset + sizeof(instructions),\n                       suffix_bytes, sizeof(suffix_bytes)) == 0);\n  }\n\n  DeleteFileW(minidump_filename_wide.c_str());\n}\n\nTEST_F(ExceptionHandlerDeathTest, InstructionPointerMemoryMinBound) {\n  ASSERT_TRUE(DoesPathExist(temp_path_));\n  google_breakpad::ExceptionHandler *exc =\n      new google_breakpad::ExceptionHandler(\n          temp_path_, NULL, NULL, NULL,\n          google_breakpad::ExceptionHandler::HANDLER_ALL);\n\n  SYSTEM_INFO sSysInfo;         // Useful information about the system\n  GetSystemInfo(&sSysInfo);     // Initialize the structure.\n\n  const u_int32_t kMemorySize = 256;  // bytes\n  const DWORD kPageSize = sSysInfo.dwPageSize;\n  const int kOffset = 0;\n  // This crashes with SIGILL on x86/x86-64/arm.\n  const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff };\n  // Get some executable memory. Specifically, reserve two pages,\n  // but only commit the second.\n  char* all_memory = reinterpret_cast<char*>(VirtualAlloc(NULL,\n                                                          kPageSize * 2,\n                                                          MEM_RESERVE,\n                                                          PAGE_NOACCESS));\n  ASSERT_TRUE(all_memory);\n  char* memory = all_memory + kPageSize;\n  ASSERT_TRUE(VirtualAlloc(memory, kPageSize,\n                           MEM_COMMIT, PAGE_EXECUTE_READWRITE));\n\n  // Write some instructions that will crash. Put them\n  // in the middle of the block of memory, because the\n  // minidump should contain 128 bytes on either side of the\n  // instruction pointer.\n  memcpy(memory + kOffset, instructions, sizeof(instructions));\n  \n  // Now execute the instructions, which should crash.\n  typedef void (*void_function)(void);\n  void_function memory_function =\n      reinterpret_cast<void_function>(memory + kOffset);\n  ASSERT_DEATH(memory_function(), \"\");\n\n  // free the memory.\n  VirtualFree(memory, 0, MEM_RELEASE);\n\n  // Verify that the resulting minidump contains the memory around the IP\n  wstring minidump_filename_wide = find_minidump_in_directory(temp_path_);\n  ASSERT_FALSE(minidump_filename_wide.empty());\n  string minidump_filename;\n  ASSERT_TRUE(WindowsStringUtils::safe_wcstombs(minidump_filename_wide,\n                                                &minidump_filename));\n\n  // Read the minidump. Locate the exception record and the\n  // memory list, and then ensure that there is a memory region\n  // in the memory list that covers the instruction pointer from\n  // the exception record.\n  {\n    Minidump minidump(minidump_filename);\n    ASSERT_TRUE(minidump.Read());\n\n    MinidumpException* exception = minidump.GetException();\n    MinidumpMemoryList* memory_list = minidump.GetMemoryList();\n    ASSERT_TRUE(exception);\n    ASSERT_TRUE(memory_list);\n    ASSERT_LT((unsigned)0, memory_list->region_count());\n\n    MinidumpContext* context = exception->GetContext();\n    ASSERT_TRUE(context);\n\n    u_int64_t instruction_pointer;\n    switch (context->GetContextCPU()) {\n    case MD_CONTEXT_X86:\n      instruction_pointer = context->GetContextX86()->eip;\n      break;\n    case MD_CONTEXT_AMD64:\n      instruction_pointer = context->GetContextAMD64()->rip;\n      break;\n    default:\n      FAIL() << \"Unknown context CPU: \" << context->GetContextCPU();\n      break;\n    }\n\n    MinidumpMemoryRegion* region =\n        memory_list->GetMemoryRegionForAddress(instruction_pointer);\n    ASSERT_TRUE(region);\n\n    EXPECT_EQ(kMemorySize / 2, region->GetSize());\n    const u_int8_t* bytes = region->GetMemory();\n    ASSERT_TRUE(bytes);\n\n    u_int8_t suffix_bytes[kMemorySize / 2 - sizeof(instructions)];\n    memset(suffix_bytes, 0, sizeof(suffix_bytes));\n    EXPECT_TRUE(memcmp(bytes + kOffset,\n                       instructions, sizeof(instructions)) == 0);\n    EXPECT_TRUE(memcmp(bytes + kOffset + sizeof(instructions),\n                       suffix_bytes, sizeof(suffix_bytes)) == 0);\n  }\n\n  DeleteFileW(minidump_filename_wide.c_str());\n}\n\nTEST_F(ExceptionHandlerDeathTest, InstructionPointerMemoryMaxBound) {\n  ASSERT_TRUE(DoesPathExist(temp_path_));\n  google_breakpad::ExceptionHandler *exc =\n      new google_breakpad::ExceptionHandler(\n          temp_path_, NULL, NULL, NULL,\n          google_breakpad::ExceptionHandler::HANDLER_ALL);\n\n  SYSTEM_INFO sSysInfo;         // Useful information about the system\n  GetSystemInfo(&sSysInfo);     // Initialize the structure.\n\n  const DWORD kPageSize = sSysInfo.dwPageSize;\n  // This crashes with SIGILL on x86/x86-64/arm.\n  const unsigned char instructions[] = { 0xff, 0xff, 0xff, 0xff };\n  const int kOffset = kPageSize - sizeof(instructions);\n  // Get some executable memory. Specifically, reserve two pages,\n  // but only commit the first.\n  char* memory = reinterpret_cast<char*>(VirtualAlloc(NULL,\n                                                      kPageSize * 2,\n                                                      MEM_RESERVE,\n                                                      PAGE_NOACCESS));\n  ASSERT_TRUE(memory);\n  ASSERT_TRUE(VirtualAlloc(memory, kPageSize,\n                           MEM_COMMIT, PAGE_EXECUTE_READWRITE));\n\n  // Write some instructions that will crash.\n  memcpy(memory + kOffset, instructions, sizeof(instructions));\n  \n  // Now execute the instructions, which should crash.\n  typedef void (*void_function)(void);\n  void_function memory_function =\n      reinterpret_cast<void_function>(memory + kOffset);\n  ASSERT_DEATH(memory_function(), \"\");\n\n  // free the memory.\n  VirtualFree(memory, 0, MEM_RELEASE);\n\n  // Verify that the resulting minidump contains the memory around the IP\n  wstring minidump_filename_wide = find_minidump_in_directory(temp_path_);\n  ASSERT_FALSE(minidump_filename_wide.empty());\n  string minidump_filename;\n  ASSERT_TRUE(WindowsStringUtils::safe_wcstombs(minidump_filename_wide,\n                                                &minidump_filename));\n\n  // Read the minidump. Locate the exception record and the\n  // memory list, and then ensure that there is a memory region\n  // in the memory list that covers the instruction pointer from\n  // the exception record.\n  {\n    Minidump minidump(minidump_filename);\n    ASSERT_TRUE(minidump.Read());\n\n    MinidumpException* exception = minidump.GetException();\n    MinidumpMemoryList* memory_list = minidump.GetMemoryList();\n    ASSERT_TRUE(exception);\n    ASSERT_TRUE(memory_list);\n    ASSERT_LT((unsigned)0, memory_list->region_count());\n\n    MinidumpContext* context = exception->GetContext();\n    ASSERT_TRUE(context);\n\n    u_int64_t instruction_pointer;\n    switch (context->GetContextCPU()) {\n    case MD_CONTEXT_X86:\n      instruction_pointer = context->GetContextX86()->eip;\n      break;\n    case MD_CONTEXT_AMD64:\n      instruction_pointer = context->GetContextAMD64()->rip;\n      break;\n    default:\n      FAIL() << \"Unknown context CPU: \" << context->GetContextCPU();\n      break;\n    }\n\n    MinidumpMemoryRegion* region =\n        memory_list->GetMemoryRegionForAddress(instruction_pointer);\n    ASSERT_TRUE(region);\n\n    const size_t kPrefixSize = 128;  // bytes\n    EXPECT_EQ(kPrefixSize + sizeof(instructions), region->GetSize());\n    const u_int8_t* bytes = region->GetMemory();\n    ASSERT_TRUE(bytes);\n\n    u_int8_t prefix_bytes[kPrefixSize];\n    memset(prefix_bytes, 0, sizeof(prefix_bytes));\n    EXPECT_TRUE(memcmp(bytes, prefix_bytes, sizeof(prefix_bytes)) == 0);\n    EXPECT_TRUE(memcmp(bytes + kPrefixSize,\n                       instructions, sizeof(instructions)) == 0);\n  }\n\n  DeleteFileW(minidump_filename_wide.c_str());\n}\n\n}  // namespace\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/unittests/exception_handler_test.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <windows.h>\n#include <dbghelp.h>\n#include <strsafe.h>\n#include <objbase.h>\n#include <shellapi.h>\n\n#include <string>\n\n#include \"../../../breakpad_googletest_includes.h\"\n#include \"../../../../common/windows/string_utils-inl.h\"\n#include \"../../../../google_breakpad/processor/minidump.h\"\n#include \"../crash_generation/crash_generation_server.h\"\n#include \"../handler/exception_handler.h\"\n#include \"dump_analysis.h\"  // NOLINT\n\nnamespace {\n\nusing std::wstring;\nusing namespace google_breakpad;\n\nconst wchar_t kPipeName[] = L\"\\\\\\\\.\\\\pipe\\\\BreakpadCrashTest\\\\TestCaseServer\";\nconst char kSuccessIndicator[] = \"success\";\nconst char kFailureIndicator[] = \"failure\";\n\nconst MINIDUMP_TYPE kFullDumpType = static_cast<MINIDUMP_TYPE>(\n    MiniDumpWithFullMemory |  // Full memory from process.\n    MiniDumpWithProcessThreadData |  // Get PEB and TEB.\n    MiniDumpWithHandleData);  // Get all handle information.\n\nclass ExceptionHandlerTest : public ::testing::Test {\n protected:\n  // Member variable for each test that they can use\n  // for temporary storage.\n  TCHAR temp_path_[MAX_PATH];\n\n  // Actually constructs a temp path name.\n  virtual void SetUp();\n\n  // Deletes temporary files.\n  virtual void TearDown();\n\n  void DoCrashInvalidParameter();\n  void DoCrashPureVirtualCall();\n\n  // Utility function to test for a path's existence.\n  static BOOL DoesPathExist(const TCHAR *path_name);\n\n  // Client callback.\n  static void ClientDumpCallback(\n      void *dump_context,\n      const google_breakpad::ClientInfo *client_info,\n      const std::wstring *dump_path);\n\n  static bool DumpCallback(const wchar_t* dump_path,\n                           const wchar_t* minidump_id,\n                           void* context,\n                           EXCEPTION_POINTERS* exinfo,\n                           MDRawAssertionInfo* assertion,\n                           bool succeeded);\n\n  static std::wstring dump_file;\n  static std::wstring full_dump_file;\n};\n\nstd::wstring ExceptionHandlerTest::dump_file;\nstd::wstring ExceptionHandlerTest::full_dump_file;\n\nvoid ExceptionHandlerTest::SetUp() {\n  const ::testing::TestInfo* const test_info =\n    ::testing::UnitTest::GetInstance()->current_test_info();\n  TCHAR temp_path[MAX_PATH] = { '\\0' };\n  TCHAR test_name_wide[MAX_PATH] = { '\\0' };\n  // We want the temporary directory to be what the OS returns\n  // to us, + the test case name.\n  GetTempPath(MAX_PATH, temp_path);\n  // THe test case name is exposed to use as a c-style string,\n  // But we might be working in UNICODE here on Windows.\n  int dwRet = MultiByteToWideChar(CP_ACP, 0, test_info->name(),\n                                  strlen(test_info->name()),\n                                  test_name_wide,\n                                  MAX_PATH);\n  if (!dwRet) {\n    assert(false);\n  }\n  StringCchPrintfW(temp_path_, MAX_PATH, L\"%s%s\", temp_path, test_name_wide);\n  CreateDirectory(temp_path_, NULL);\n}\n\nvoid ExceptionHandlerTest::TearDown() {\n  if (!dump_file.empty()) {\n    ::DeleteFile(dump_file.c_str());\n    dump_file = L\"\";\n  }\n  if (!full_dump_file.empty()) {\n    ::DeleteFile(full_dump_file.c_str());\n    full_dump_file = L\"\";\n  }\n}\n\nBOOL ExceptionHandlerTest::DoesPathExist(const TCHAR *path_name) {\n  DWORD flags = GetFileAttributes(path_name);\n  if (flags == INVALID_FILE_ATTRIBUTES) {\n    return FALSE;\n  }\n  return TRUE;\n}\n\n// static\nvoid ExceptionHandlerTest::ClientDumpCallback(\n    void *dump_context,\n    const google_breakpad::ClientInfo *client_info,\n    const wstring *dump_path) {\n  dump_file = *dump_path;\n  // Create the full dump file name from the dump path.\n  full_dump_file = dump_file.substr(0, dump_file.length() - 4) + L\"-full.dmp\";\n}\n\n// static\nbool ExceptionHandlerTest::DumpCallback(const wchar_t* dump_path,\n                    const wchar_t* minidump_id,\n                    void* context,\n                    EXCEPTION_POINTERS* exinfo,\n                    MDRawAssertionInfo* assertion,\n                    bool succeeded) {\n  dump_file = dump_path;\n  dump_file += L\"\\\\\";\n  dump_file += minidump_id;\n  dump_file += L\".dmp\";\n    return succeeded;\n}\n\nvoid ExceptionHandlerTest::DoCrashInvalidParameter() {\n  google_breakpad::ExceptionHandler *exc =\n      new google_breakpad::ExceptionHandler(\n          temp_path_, NULL, NULL, NULL,\n          google_breakpad::ExceptionHandler::HANDLER_INVALID_PARAMETER,\n          kFullDumpType, kPipeName, NULL);\n\n  // Disable the message box for assertions\n  _CrtSetReportMode(_CRT_ASSERT, 0);\n\n  // Although this is executing in the child process of the death test,\n  // if it's not true we'll still get an error rather than the crash\n  // being expected.\n  ASSERT_TRUE(exc->IsOutOfProcess());\n  printf(NULL);\n}\n\n\nstruct PureVirtualCallBase {\n  PureVirtualCallBase() {\n    // We have to reinterpret so the linker doesn't get confused because the\n    // method isn't defined.\n    reinterpret_cast<PureVirtualCallBase*>(this)->PureFunction();\n  }\n  virtual ~PureVirtualCallBase() {}\n  virtual void PureFunction() const = 0;\n};\nstruct PureVirtualCall : public PureVirtualCallBase {\n  PureVirtualCall() { PureFunction(); }\n  virtual void PureFunction() const {}\n};\n\nvoid ExceptionHandlerTest::DoCrashPureVirtualCall() {\n  google_breakpad::ExceptionHandler *exc =\n      new google_breakpad::ExceptionHandler(\n          temp_path_, NULL, NULL, NULL,\n          google_breakpad::ExceptionHandler::HANDLER_PURECALL,\n          kFullDumpType, kPipeName, NULL);\n\n  // Disable the message box for assertions\n  _CrtSetReportMode(_CRT_ASSERT, 0);\n\n  // Although this is executing in the child process of the death test,\n  // if it's not true we'll still get an error rather than the crash\n  // being expected.\n  ASSERT_TRUE(exc->IsOutOfProcess());\n\n  // Create a new frame to ensure PureVirtualCall is not optimized to some\n  // other line in this function.\n  {\n    PureVirtualCall instance;\n  }\n}\n\n// This test validates that the minidump is written correctly.\nTEST_F(ExceptionHandlerTest, InvalidParameterMiniDumpTest) {\n  ASSERT_TRUE(DoesPathExist(temp_path_));\n\n  // Call with a bad argument\n  ASSERT_TRUE(DoesPathExist(temp_path_));\n  wstring dump_path(temp_path_);\n  google_breakpad::CrashGenerationServer server(\n      kPipeName, NULL, NULL, NULL, ClientDumpCallback, NULL, NULL, NULL, NULL,\n      NULL, true, &dump_path);\n\n  ASSERT_TRUE(dump_file.empty() && full_dump_file.empty());\n\n  // This HAS to be EXPECT_, because when this test case is executed in the\n  // child process, the server registration will fail due to the named pipe\n  // being the same.\n  EXPECT_TRUE(server.Start());\n  EXPECT_EXIT(DoCrashInvalidParameter(), ::testing::ExitedWithCode(0), \"\");\n  ASSERT_TRUE(!dump_file.empty() && !full_dump_file.empty());\n  ASSERT_TRUE(DoesPathExist(dump_file.c_str()));\n\n  // Verify the dump for infos.\n  DumpAnalysis mini(dump_file);\n  DumpAnalysis full(full_dump_file);\n\n  // The dump should have all of these streams.\n  EXPECT_TRUE(mini.HasStream(ThreadListStream));\n  EXPECT_TRUE(full.HasStream(ThreadListStream));\n  EXPECT_TRUE(mini.HasStream(ModuleListStream));\n  EXPECT_TRUE(full.HasStream(ModuleListStream));\n  EXPECT_TRUE(mini.HasStream(ExceptionStream));\n  EXPECT_TRUE(full.HasStream(ExceptionStream));\n  EXPECT_TRUE(mini.HasStream(SystemInfoStream));\n  EXPECT_TRUE(full.HasStream(SystemInfoStream));\n  EXPECT_TRUE(mini.HasStream(MiscInfoStream));\n  EXPECT_TRUE(full.HasStream(MiscInfoStream));\n  EXPECT_TRUE(mini.HasStream(HandleDataStream));\n  EXPECT_TRUE(full.HasStream(HandleDataStream));\n\n  // We expect PEB and TEBs in this dump.\n  EXPECT_TRUE(mini.HasTebs() || full.HasTebs());\n  EXPECT_TRUE(mini.HasPeb() || full.HasPeb());\n\n  // Minidump should have a memory listing, but no 64-bit memory.\n  EXPECT_TRUE(mini.HasStream(MemoryListStream));\n  EXPECT_FALSE(mini.HasStream(Memory64ListStream));\n\n  EXPECT_FALSE(full.HasStream(MemoryListStream));\n  EXPECT_TRUE(full.HasStream(Memory64ListStream));\n\n  // This is the only place we don't use OR because we want both not\n  // to have the streams.\n  EXPECT_FALSE(mini.HasStream(ThreadExListStream));\n  EXPECT_FALSE(full.HasStream(ThreadExListStream));\n  EXPECT_FALSE(mini.HasStream(CommentStreamA));\n  EXPECT_FALSE(full.HasStream(CommentStreamA));\n  EXPECT_FALSE(mini.HasStream(CommentStreamW));\n  EXPECT_FALSE(full.HasStream(CommentStreamW));\n  EXPECT_FALSE(mini.HasStream(FunctionTableStream));\n  EXPECT_FALSE(full.HasStream(FunctionTableStream));\n  EXPECT_FALSE(mini.HasStream(MemoryInfoListStream));\n  EXPECT_FALSE(full.HasStream(MemoryInfoListStream));\n  EXPECT_FALSE(mini.HasStream(ThreadInfoListStream));\n  EXPECT_FALSE(full.HasStream(ThreadInfoListStream));\n  EXPECT_FALSE(mini.HasStream(HandleOperationListStream));\n  EXPECT_FALSE(full.HasStream(HandleOperationListStream));\n  EXPECT_FALSE(mini.HasStream(TokenStream));\n  EXPECT_FALSE(full.HasStream(TokenStream));\n}\n\n\n// This test validates that the minidump is written correctly.\nTEST_F(ExceptionHandlerTest, PureVirtualCallMiniDumpTest) {\n  ASSERT_TRUE(DoesPathExist(temp_path_));\n\n  // Call with a bad argument\n  ASSERT_TRUE(DoesPathExist(temp_path_));\n  wstring dump_path(temp_path_);\n  google_breakpad::CrashGenerationServer server(\n      kPipeName, NULL, NULL, NULL, ClientDumpCallback, NULL, NULL, NULL, NULL,\n      NULL, true, &dump_path);\n\n  ASSERT_TRUE(dump_file.empty() && full_dump_file.empty());\n\n  // This HAS to be EXPECT_, because when this test case is executed in the\n  // child process, the server registration will fail due to the named pipe\n  // being the same.\n  EXPECT_TRUE(server.Start());\n  EXPECT_EXIT(DoCrashPureVirtualCall(), ::testing::ExitedWithCode(0), \"\");\n  ASSERT_TRUE(!dump_file.empty() && !full_dump_file.empty());\n  ASSERT_TRUE(DoesPathExist(dump_file.c_str()));\n\n  // Verify the dump for infos.\n  DumpAnalysis mini(dump_file);\n  DumpAnalysis full(full_dump_file);\n\n  // The dump should have all of these streams.\n  EXPECT_TRUE(mini.HasStream(ThreadListStream));\n  EXPECT_TRUE(full.HasStream(ThreadListStream));\n  EXPECT_TRUE(mini.HasStream(ModuleListStream));\n  EXPECT_TRUE(full.HasStream(ModuleListStream));\n  EXPECT_TRUE(mini.HasStream(ExceptionStream));\n  EXPECT_TRUE(full.HasStream(ExceptionStream));\n  EXPECT_TRUE(mini.HasStream(SystemInfoStream));\n  EXPECT_TRUE(full.HasStream(SystemInfoStream));\n  EXPECT_TRUE(mini.HasStream(MiscInfoStream));\n  EXPECT_TRUE(full.HasStream(MiscInfoStream));\n  EXPECT_TRUE(mini.HasStream(HandleDataStream));\n  EXPECT_TRUE(full.HasStream(HandleDataStream));\n\n  // We expect PEB and TEBs in this dump.\n  EXPECT_TRUE(mini.HasTebs() || full.HasTebs());\n  EXPECT_TRUE(mini.HasPeb() || full.HasPeb());\n\n  // Minidump should have a memory listing, but no 64-bit memory.\n  EXPECT_TRUE(mini.HasStream(MemoryListStream));\n  EXPECT_FALSE(mini.HasStream(Memory64ListStream));\n\n  EXPECT_FALSE(full.HasStream(MemoryListStream));\n  EXPECT_TRUE(full.HasStream(Memory64ListStream));\n\n  // This is the only place we don't use OR because we want both not\n  // to have the streams.\n  EXPECT_FALSE(mini.HasStream(ThreadExListStream));\n  EXPECT_FALSE(full.HasStream(ThreadExListStream));\n  EXPECT_FALSE(mini.HasStream(CommentStreamA));\n  EXPECT_FALSE(full.HasStream(CommentStreamA));\n  EXPECT_FALSE(mini.HasStream(CommentStreamW));\n  EXPECT_FALSE(full.HasStream(CommentStreamW));\n  EXPECT_FALSE(mini.HasStream(FunctionTableStream));\n  EXPECT_FALSE(full.HasStream(FunctionTableStream));\n  EXPECT_FALSE(mini.HasStream(MemoryInfoListStream));\n  EXPECT_FALSE(full.HasStream(MemoryInfoListStream));\n  EXPECT_FALSE(mini.HasStream(ThreadInfoListStream));\n  EXPECT_FALSE(full.HasStream(ThreadInfoListStream));\n  EXPECT_FALSE(mini.HasStream(HandleOperationListStream));\n  EXPECT_FALSE(full.HasStream(HandleOperationListStream));\n  EXPECT_FALSE(mini.HasStream(TokenStream));\n  EXPECT_FALSE(full.HasStream(TokenStream));\n}\n\n// Test that writing a minidump produces a valid minidump containing\n// some expected structures.\nTEST_F(ExceptionHandlerTest, WriteMinidumpTest) {\n  ExceptionHandler handler(temp_path_,\n                           NULL,\n                           DumpCallback,\n                           NULL,\n                           ExceptionHandler::HANDLER_ALL);\n  ASSERT_TRUE(handler.WriteMinidump());\n  ASSERT_FALSE(dump_file.empty());\n\n  string minidump_filename;\n  ASSERT_TRUE(WindowsStringUtils::safe_wcstombs(dump_file,\n                                                &minidump_filename));\n\n  // Read the minidump and verify some info.\n  Minidump minidump(minidump_filename);\n  ASSERT_TRUE(minidump.Read());\n  //TODO(ted): more comprehensive tests...\n}\n\n}  // namespace\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/unittests/minidump_test.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <windows.h>\n#include <objbase.h>\n#include <dbghelp.h>\n\n#include \"../crash_generation/minidump_generator.h\"\n#include \"dump_analysis.h\"  // NOLINT\n\n#include \"gtest/gtest.h\"\n\nnamespace {\n\n// Minidump with stacks, PEB, TEB, and unloaded module list.\nconst MINIDUMP_TYPE kSmallDumpType = static_cast<MINIDUMP_TYPE>(\n    MiniDumpWithProcessThreadData |  // Get PEB and TEB.\n    MiniDumpWithUnloadedModules);  // Get unloaded modules when available.\n\n// Minidump with all of the above, plus memory referenced from stack.\nconst MINIDUMP_TYPE kLargerDumpType = static_cast<MINIDUMP_TYPE>(\n    MiniDumpWithProcessThreadData |  // Get PEB and TEB.\n    MiniDumpWithUnloadedModules |  // Get unloaded modules when available.\n    MiniDumpWithIndirectlyReferencedMemory);  // Get memory referenced by stack.\n\n// Large dump with all process memory.\nconst MINIDUMP_TYPE kFullDumpType = static_cast<MINIDUMP_TYPE>(\n    MiniDumpWithFullMemory |  // Full memory from process.\n    MiniDumpWithProcessThreadData |  // Get PEB and TEB.\n    MiniDumpWithHandleData |  // Get all handle information.\n    MiniDumpWithUnloadedModules);  // Get unloaded modules when available.\n\nclass MinidumpTest: public testing::Test {\n public:\n  MinidumpTest() {\n    wchar_t temp_dir_path[ MAX_PATH ] = {0};\n    ::GetTempPath(MAX_PATH, temp_dir_path);\n    dump_path_ = temp_dir_path;\n  }\n\n  virtual void SetUp() {\n    // Make sure URLMon isn't loaded into our process.\n    ASSERT_EQ(NULL, ::GetModuleHandle(L\"urlmon.dll\"));\n\n    // Then load and unload it to ensure we have something to\n    // stock the unloaded module list with.\n    HMODULE urlmon = ::LoadLibrary(L\"urlmon.dll\");\n    ASSERT_TRUE(urlmon != NULL);\n    ASSERT_TRUE(::FreeLibrary(urlmon));\n  }\n\n  virtual void TearDown() {\n    if (!dump_file_.empty()) {\n      ::DeleteFile(dump_file_.c_str());\n      dump_file_ = L\"\";\n    }\n    if (!full_dump_file_.empty()) {\n      ::DeleteFile(full_dump_file_.c_str());\n      full_dump_file_ = L\"\";\n    }\n  }\n\n  bool WriteDump(ULONG flags) {\n    using google_breakpad::MinidumpGenerator;\n\n    // Fake exception is access violation on write to this.\n    EXCEPTION_RECORD ex_record = {\n        STATUS_ACCESS_VIOLATION,  // ExceptionCode\n        0,  // ExceptionFlags\n        NULL,  // ExceptionRecord;\n        reinterpret_cast<void*>(0xCAFEBABE),  // ExceptionAddress;\n        2,  // NumberParameters;\n        { EXCEPTION_WRITE_FAULT, reinterpret_cast<ULONG_PTR>(this) }\n    };\n    CONTEXT ctx_record = {};\n    EXCEPTION_POINTERS ex_ptrs = {\n      &ex_record,\n      &ctx_record,\n    };\n\n    MinidumpGenerator generator(dump_path_);\n\n    // And write a dump\n    bool result = generator.WriteMinidump(::GetCurrentProcess(),\n                                          ::GetCurrentProcessId(),\n                                          ::GetCurrentThreadId(),\n                                          ::GetCurrentThreadId(),\n                                          &ex_ptrs,\n                                          NULL,\n                                          static_cast<MINIDUMP_TYPE>(flags),\n                                          TRUE,\n                                          &dump_file_,\n                                          &full_dump_file_);\n    return result == TRUE;\n  }\n\n protected:\n  std::wstring dump_file_;\n  std::wstring full_dump_file_;\n\n  std::wstring dump_path_;\n};\n\n// We need to be able to get file information from Windows\nbool HasFileInfo(const std::wstring& file_path) {\n  DWORD dummy;\n  const wchar_t* path = file_path.c_str();\n  DWORD length = ::GetFileVersionInfoSize(path, &dummy);\n  if (length == 0)\n    return NULL;\n\n  void* data = calloc(length, 1);\n  if (!data)\n    return false;\n\n  if (!::GetFileVersionInfo(path, dummy, length, data)) {\n    free(data);\n    return false;\n  }\n\n  void* translate = NULL;\n  UINT page_count;\n  BOOL query_result = VerQueryValue(\n      data,\n      L\"\\\\VarFileInfo\\\\Translation\",\n      static_cast<void**>(&translate),\n      &page_count);\n\n  free(data);\n  if (query_result && translate) {\n    return true;\n  } else {\n    return false;\n  }\n}\n\nTEST_F(MinidumpTest, Version) {\n  API_VERSION* version = ::ImagehlpApiVersion();\n\n  HMODULE dbg_help = ::GetModuleHandle(L\"dbghelp.dll\");\n  ASSERT_TRUE(dbg_help != NULL);\n\n  wchar_t dbg_help_file[1024] = {};\n  ASSERT_TRUE(::GetModuleFileName(dbg_help,\n                                  dbg_help_file,\n                                  sizeof(dbg_help_file) /\n                                      sizeof(*dbg_help_file)));\n  ASSERT_TRUE(HasFileInfo(std::wstring(dbg_help_file)) != NULL);\n\n//  LOG(INFO) << \"DbgHelp.dll version: \" << file_info->file_version();\n}\n\nTEST_F(MinidumpTest, Normal) {\n  EXPECT_TRUE(WriteDump(MiniDumpNormal));\n  DumpAnalysis mini(dump_file_);\n\n  // We expect threads, modules and some memory.\n  EXPECT_TRUE(mini.HasStream(ThreadListStream));\n  EXPECT_TRUE(mini.HasStream(ModuleListStream));\n  EXPECT_TRUE(mini.HasStream(MemoryListStream));\n  EXPECT_TRUE(mini.HasStream(ExceptionStream));\n  EXPECT_TRUE(mini.HasStream(SystemInfoStream));\n  EXPECT_TRUE(mini.HasStream(MiscInfoStream));\n\n  EXPECT_FALSE(mini.HasStream(ThreadExListStream));\n  EXPECT_FALSE(mini.HasStream(Memory64ListStream));\n  EXPECT_FALSE(mini.HasStream(CommentStreamA));\n  EXPECT_FALSE(mini.HasStream(CommentStreamW));\n  EXPECT_FALSE(mini.HasStream(HandleDataStream));\n  EXPECT_FALSE(mini.HasStream(FunctionTableStream));\n  EXPECT_FALSE(mini.HasStream(UnloadedModuleListStream));\n  EXPECT_FALSE(mini.HasStream(MemoryInfoListStream));\n  EXPECT_FALSE(mini.HasStream(ThreadInfoListStream));\n  EXPECT_FALSE(mini.HasStream(HandleOperationListStream));\n  EXPECT_FALSE(mini.HasStream(TokenStream));\n\n  // We expect no PEB nor TEBs in this dump.\n  EXPECT_FALSE(mini.HasTebs());\n  EXPECT_FALSE(mini.HasPeb());\n\n  // We expect no off-stack memory in this dump.\n  EXPECT_FALSE(mini.HasMemory(this));\n}\n\nTEST_F(MinidumpTest, SmallDump) {\n  ASSERT_TRUE(WriteDump(kSmallDumpType));\n  DumpAnalysis mini(dump_file_);\n\n  EXPECT_TRUE(mini.HasStream(ThreadListStream));\n  EXPECT_TRUE(mini.HasStream(ModuleListStream));\n  EXPECT_TRUE(mini.HasStream(MemoryListStream));\n  EXPECT_TRUE(mini.HasStream(ExceptionStream));\n  EXPECT_TRUE(mini.HasStream(SystemInfoStream));\n  EXPECT_TRUE(mini.HasStream(UnloadedModuleListStream));\n  EXPECT_TRUE(mini.HasStream(MiscInfoStream));\n\n  // We expect PEB and TEBs in this dump.\n  EXPECT_TRUE(mini.HasTebs());\n  EXPECT_TRUE(mini.HasPeb());\n\n  EXPECT_FALSE(mini.HasStream(ThreadExListStream));\n  EXPECT_FALSE(mini.HasStream(Memory64ListStream));\n  EXPECT_FALSE(mini.HasStream(CommentStreamA));\n  EXPECT_FALSE(mini.HasStream(CommentStreamW));\n  EXPECT_FALSE(mini.HasStream(HandleDataStream));\n  EXPECT_FALSE(mini.HasStream(FunctionTableStream));\n  EXPECT_FALSE(mini.HasStream(MemoryInfoListStream));\n  EXPECT_FALSE(mini.HasStream(ThreadInfoListStream));\n  EXPECT_FALSE(mini.HasStream(HandleOperationListStream));\n  EXPECT_FALSE(mini.HasStream(TokenStream));\n\n  // We expect no off-stack memory in this dump.\n  EXPECT_FALSE(mini.HasMemory(this));\n}\n\nTEST_F(MinidumpTest, LargerDump) {\n  ASSERT_TRUE(WriteDump(kLargerDumpType));\n  DumpAnalysis mini(dump_file_);\n\n  // The dump should have all of these streams.\n  EXPECT_TRUE(mini.HasStream(ThreadListStream));\n  EXPECT_TRUE(mini.HasStream(ModuleListStream));\n  EXPECT_TRUE(mini.HasStream(MemoryListStream));\n  EXPECT_TRUE(mini.HasStream(ExceptionStream));\n  EXPECT_TRUE(mini.HasStream(SystemInfoStream));\n  EXPECT_TRUE(mini.HasStream(UnloadedModuleListStream));\n  EXPECT_TRUE(mini.HasStream(MiscInfoStream));\n\n  // We expect memory referenced by stack in this dump.\n  EXPECT_TRUE(mini.HasMemory(this));\n\n  // We expect PEB and TEBs in this dump.\n  EXPECT_TRUE(mini.HasTebs());\n  EXPECT_TRUE(mini.HasPeb());\n\n  EXPECT_FALSE(mini.HasStream(ThreadExListStream));\n  EXPECT_FALSE(mini.HasStream(Memory64ListStream));\n  EXPECT_FALSE(mini.HasStream(CommentStreamA));\n  EXPECT_FALSE(mini.HasStream(CommentStreamW));\n  EXPECT_FALSE(mini.HasStream(HandleDataStream));\n  EXPECT_FALSE(mini.HasStream(FunctionTableStream));\n  EXPECT_FALSE(mini.HasStream(MemoryInfoListStream));\n  EXPECT_FALSE(mini.HasStream(ThreadInfoListStream));\n  EXPECT_FALSE(mini.HasStream(HandleOperationListStream));\n  EXPECT_FALSE(mini.HasStream(TokenStream));\n}\n\nTEST_F(MinidumpTest, FullDump) {\n  ASSERT_TRUE(WriteDump(kFullDumpType));\n  ASSERT_TRUE(dump_file_ != L\"\");\n  ASSERT_TRUE(full_dump_file_ != L\"\");\n  DumpAnalysis mini(dump_file_);\n  DumpAnalysis full(full_dump_file_);\n\n  // Either dumps can contain part of the information.\n\n  // The dump should have all of these streams.\n  EXPECT_TRUE(mini.HasStream(ThreadListStream));\n  EXPECT_TRUE(full.HasStream(ThreadListStream));\n  EXPECT_TRUE(mini.HasStream(ModuleListStream));\n  EXPECT_TRUE(full.HasStream(ModuleListStream));\n  EXPECT_TRUE(mini.HasStream(ExceptionStream));\n  EXPECT_TRUE(full.HasStream(ExceptionStream));\n  EXPECT_TRUE(mini.HasStream(SystemInfoStream));\n  EXPECT_TRUE(full.HasStream(SystemInfoStream));\n  EXPECT_TRUE(mini.HasStream(UnloadedModuleListStream));\n  EXPECT_TRUE(full.HasStream(UnloadedModuleListStream));\n  EXPECT_TRUE(mini.HasStream(MiscInfoStream));\n  EXPECT_TRUE(full.HasStream(MiscInfoStream));\n  EXPECT_TRUE(mini.HasStream(HandleDataStream));\n  EXPECT_TRUE(full.HasStream(HandleDataStream));\n\n  // We expect memory referenced by stack in this dump.\n  EXPECT_FALSE(mini.HasMemory(this));\n  EXPECT_TRUE(full.HasMemory(this));\n\n  // We expect PEB and TEBs in this dump.\n  EXPECT_TRUE(mini.HasTebs() || full.HasTebs());\n  EXPECT_TRUE(mini.HasPeb() || full.HasPeb());\n\n  EXPECT_TRUE(mini.HasStream(MemoryListStream));\n  EXPECT_TRUE(full.HasStream(Memory64ListStream));\n  EXPECT_FALSE(mini.HasStream(Memory64ListStream));\n  EXPECT_FALSE(full.HasStream(MemoryListStream));\n\n  // This is the only place we don't use OR because we want both not\n  // to have the streams.\n  EXPECT_FALSE(mini.HasStream(ThreadExListStream));\n  EXPECT_FALSE(full.HasStream(ThreadExListStream));\n  EXPECT_FALSE(mini.HasStream(CommentStreamA));\n  EXPECT_FALSE(full.HasStream(CommentStreamA));\n  EXPECT_FALSE(mini.HasStream(CommentStreamW));\n  EXPECT_FALSE(full.HasStream(CommentStreamW));\n  EXPECT_FALSE(mini.HasStream(FunctionTableStream));\n  EXPECT_FALSE(full.HasStream(FunctionTableStream));\n  EXPECT_FALSE(mini.HasStream(MemoryInfoListStream));\n  EXPECT_FALSE(full.HasStream(MemoryInfoListStream));\n  EXPECT_FALSE(mini.HasStream(ThreadInfoListStream));\n  EXPECT_FALSE(full.HasStream(ThreadInfoListStream));\n  EXPECT_FALSE(mini.HasStream(HandleOperationListStream));\n  EXPECT_FALSE(full.HasStream(HandleOperationListStream));\n  EXPECT_FALSE(mini.HasStream(TokenStream));\n  EXPECT_FALSE(full.HasStream(TokenStream));\n}\n\n}  // namespace\n"
  },
  {
    "path": "archive/spotify/breakpad/client/windows/unittests/testing.gyp",
    "content": "# Copyright (c) 2010, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n{\n  'includes': [\n    '../build/common.gypi',\n  ],\n  'target_defaults': {\n  },\n  'targets': [\n    {\n      'target_name': 'gtest',\n      'type': '<(library)',\n      'include_dirs': [\n        '<(DEPTH)/testing/include',\n        '<(DEPTH)/testing/gtest',\n        '<(DEPTH)/testing/gtest/include',\n      ],\n      'sources': [\n        '<(DEPTH)/testing/gtest/src/gtest-all.cc',\n      ],\n      'direct_dependent_settings': {\n        'include_dirs': [\n          '<(DEPTH)/testing/include',\n          '<(DEPTH)/testing/gtest/include',\n        ]\n      },\n    },\n    {\n      'target_name': 'gmock',\n      'type': '<(library)',\n      'include_dirs': [\n        '<(DEPTH)/testing/include',\n        '<(DEPTH)/testing/',\n        '<(DEPTH)/testing/gtest',\n        '<(DEPTH)/testing/gtest/include',\n      ],\n      'sources': [\n        '<(DEPTH)/testing/src/gmock-all.cc',\n        '<(DEPTH)/testing/src/gmock_main.cc',\n      ],\n      'direct_dependent_settings': {\n        'include_dirs': [\n          '<(DEPTH)/testing/include',\n          '<(DEPTH)/testing/gtest/include',\n        ]\n      },\n    },\n\n  ],\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/basictypes.h",
    "content": "// Copyright (c) 2011 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef COMMON_BASICTYPES_H_\n#define COMMON_BASICTYPES_H_\n\n// A macro to disallow the copy constructor and operator= functions\n// This should be used in the private: declarations for a class\n#define DISALLOW_COPY_AND_ASSIGN(TypeName) \\\n  TypeName(const TypeName&);               \\\n  void operator=(const TypeName&)\n\n#endif  // COMMON_BASICTYPES_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/byte_cursor.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// byte_cursor.h: Classes for parsing values from a buffer of bytes.\n// The ByteCursor class provides a convenient interface for reading\n// fixed-size integers of arbitrary endianness, being thorough about\n// checking for buffer overruns.\n\n#ifndef COMMON_BYTE_CURSOR_H_\n#define COMMON_BYTE_CURSOR_H_\n\n#include <assert.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n#include <string>\n\nnamespace google_breakpad {\n\n// A buffer holding a series of bytes.\nstruct ByteBuffer {\n  ByteBuffer() : start(0), end(0) { }\n  ByteBuffer(const uint8_t *set_start, size_t set_size)\n      : start(set_start), end(set_start + set_size) { }\n  ~ByteBuffer() { };\n\n  // Equality operators. Useful in unit tests, and when we're using\n  // ByteBuffers to refer to regions of a larger buffer.\n  bool operator==(const ByteBuffer &that) const {\n    return start == that.start && end == that.end;\n  }\n  bool operator!=(const ByteBuffer &that) const {\n    return start != that.start || end != that.end;\n  }\n\n  // Not C++ style guide compliant, but this definitely belongs here.\n  size_t Size() const {\n    assert(start <= end);\n    return end - start;\n  }\n\n  const uint8_t *start, *end;\n};\n\n// A cursor pointing into a ByteBuffer that can parse numbers of various\n// widths and representations, strings, and data blocks, advancing through\n// the buffer as it goes. All ByteCursor operations check that accesses\n// haven't gone beyond the end of the enclosing ByteBuffer.\nclass ByteCursor {\n public:\n  // Create a cursor reading bytes from the start of BUFFER. By default, the\n  // cursor reads multi-byte values in little-endian form.\n  ByteCursor(const ByteBuffer *buffer, bool big_endian = false)\n      : buffer_(buffer), here_(buffer->start), \n        big_endian_(big_endian), complete_(true) { }\n\n  // Accessor and setter for this cursor's endianness flag.\n  bool big_endian() const { return big_endian_; }\n  void set_big_endian(bool big_endian) { big_endian_ = big_endian; }\n\n  // Accessor and setter for this cursor's current position. The setter\n  // returns a reference to this cursor.\n  const uint8_t *here() const { return here_; }\n  ByteCursor &set_here(const uint8_t *here) {\n    assert(buffer_->start <= here && here <= buffer_->end);\n    here_ = here;\n    return *this;\n  }\n\n  // Return the number of bytes available to read at the cursor.\n  size_t Available() const { return size_t(buffer_->end - here_); }\n\n  // Return true if this cursor is at the end of its buffer.\n  bool AtEnd() const { return Available() == 0; }\n\n  // When used as a boolean value this cursor converts to true if all\n  // prior reads have been completed, or false if we ran off the end\n  // of the buffer.\n  operator bool() const { return complete_; }\n\n  // Read a SIZE-byte integer at this cursor, signed if IS_SIGNED is true,\n  // unsigned otherwise, using the cursor's established endianness, and set\n  // *RESULT to the number. If we read off the end of our buffer, clear\n  // this cursor's complete_ flag, and store a dummy value in *RESULT.\n  // Return a reference to this cursor.\n  template<typename T>\n  ByteCursor &Read(size_t size, bool is_signed, T *result) {\n    if (CheckAvailable(size)) {\n      T v = 0;\n      if (big_endian_) {\n        for (size_t i = 0; i < size; i++)\n          v = (v << 8) + here_[i];\n      } else {\n        // This loop condition looks weird, but size_t is unsigned, so\n        // decrementing i after it is zero yields the largest size_t value.\n        for (size_t i = size - 1; i < size; i--)\n          v = (v << 8) + here_[i];\n      }\n      if (is_signed && size < sizeof(T)) {\n        size_t sign_bit = (T)1 << (size * 8 - 1);\n        v = (v ^ sign_bit) - sign_bit;\n      }\n      here_ += size;\n      *result = v;\n    } else {\n      *result = (T) 0xdeadbeef;\n    }\n    return *this;\n  }\n\n  // Read an integer, using the cursor's established endianness and\n  // *RESULT's size and signedness, and set *RESULT to the number. If we\n  // read off the end of our buffer, clear this cursor's complete_ flag.\n  // Return a reference to this cursor.\n  template<typename T>\n  ByteCursor &operator>>(T &result) {\n    bool T_is_signed = (T)-1 < 0;\n    return Read(sizeof(T), T_is_signed, &result); \n  }\n\n  // Copy the SIZE bytes at the cursor to BUFFER, and advance this\n  // cursor to the end of them. If we read off the end of our buffer,\n  // clear this cursor's complete_ flag, and set *POINTER to NULL.\n  // Return a reference to this cursor.\n  ByteCursor &Read(uint8_t *buffer, size_t size) {\n    if (CheckAvailable(size)) {\n      memcpy(buffer, here_, size);\n      here_ += size;\n    }\n    return *this;\n  }\n\n  // Set STR to a copy of the '\\0'-terminated string at the cursor. If the\n  // byte buffer does not contain a terminating zero, clear this cursor's\n  // complete_ flag, and set STR to the empty string. Return a reference to\n  // this cursor.\n  ByteCursor &CString(std::string *str) {\n    const uint8_t *end\n      = static_cast<const uint8_t *>(memchr(here_, '\\0', Available()));\n    if (end) {\n      str->assign(reinterpret_cast<const char *>(here_), end - here_);\n      here_ = end + 1;\n    } else {\n      str->clear();\n      here_ = buffer_->end;\n      complete_ = false;\n    }\n    return *this;\n  }\n\n  // Like CString(STR), but extract the string from a fixed-width buffer\n  // LIMIT bytes long, which may or may not contain a terminating '\\0'\n  // byte. Specifically:\n  //\n  // - If there are not LIMIT bytes available at the cursor, clear the\n  //   cursor's complete_ flag and set STR to the empty string.\n  //\n  // - Otherwise, if the LIMIT bytes at the cursor contain any '\\0'\n  //   characters, set *STR to a copy of the bytes before the first '\\0',\n  //   and advance the cursor by LIMIT bytes.\n  //   \n  // - Otherwise, set *STR to a copy of those LIMIT bytes, and advance the\n  //   cursor by LIMIT bytes.\n  ByteCursor &CString(std::string *str, size_t limit) {\n    if (CheckAvailable(limit)) {\n      const uint8_t *end\n        = static_cast<const uint8_t *>(memchr(here_, '\\0', limit));\n      if (end)\n        str->assign(reinterpret_cast<const char *>(here_), end - here_);\n      else\n        str->assign(reinterpret_cast<const char *>(here_), limit);\n      here_ += limit;\n    } else {\n      str->clear();\n    }\n    return *this;\n  }\n\n  // Set *POINTER to point to the SIZE bytes at the cursor, and advance\n  // this cursor to the end of them. If SIZE is omitted, don't move the\n  // cursor. If we read off the end of our buffer, clear this cursor's\n  // complete_ flag, and set *POINTER to NULL. Return a reference to this\n  // cursor.\n  ByteCursor &PointTo(const uint8_t **pointer, size_t size = 0) {\n    if (CheckAvailable(size)) {\n      *pointer = here_;\n      here_ += size;\n    } else {\n      *pointer = NULL;\n    }\n    return *this;\n  }\n\n  // Skip SIZE bytes at the cursor. If doing so would advance us off\n  // the end of our buffer, clear this cursor's complete_ flag, and\n  // set *POINTER to NULL. Return a reference to this cursor.\n  ByteCursor &Skip(size_t size) {\n    if (CheckAvailable(size))\n      here_ += size;\n    return *this;\n  }\n\n private:\n  // If there are at least SIZE bytes available to read from the buffer,\n  // return true. Otherwise, set here_ to the end of the buffer, set\n  // complete_ to false, and return false.\n  bool CheckAvailable(size_t size) {\n    if (Available() >= size) {\n      return true;\n    } else {\n      here_ = buffer_->end;\n      complete_ = false;\n      return false;\n    }\n  }\n\n  // The buffer we're reading bytes from.\n  const ByteBuffer *buffer_;\n\n  // The next byte within buffer_ that we'll read.\n  const uint8_t *here_;\n\n  // True if we should read numbers in big-endian form; false if we\n  // should read in little-endian form.\n  bool big_endian_;\n\n  // True if we've been able to read all we've been asked to.\n  bool complete_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_BYTE_CURSOR_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/byte_cursor_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// byte_cursor_unittest.cc: Unit tests for google_breakpad::ByteBuffer\n// and google_breakpad::ByteCursor.\n\n#include <string>\n\n#include <string.h>\n\n#include \"common/byte_cursor.h\"\n#include \"breakpad_googletest_includes.h\"\n\nusing google_breakpad::ByteBuffer;\nusing google_breakpad::ByteCursor;\nusing std::string;\n\nTEST(Buffer, SizeOfNothing) {\n  uint8_t data[1];\n  ByteBuffer buffer(data, 0);\n  EXPECT_EQ(0U, buffer.Size());\n}\n\nTEST(Buffer, SizeOfSomething) {\n  uint8_t data[10];\n  ByteBuffer buffer(data, sizeof(data));\n  EXPECT_EQ(10U, buffer.Size());\n}\n\nTEST(Extent, AvailableEmpty) {\n  uint8_t data[1];\n  ByteBuffer buffer(data, 0);\n  ByteCursor cursor(&buffer);\n  EXPECT_EQ(0U, cursor.Available());\n}\n\nTEST(Extent, AtEndEmpty) {\n  uint8_t data[1];\n  ByteBuffer buffer(data, 0);\n  ByteCursor cursor(&buffer);\n  EXPECT_TRUE(cursor.AtEnd());\n}\n\nTEST(Extent, AsBoolEmpty) {\n  uint8_t data[1];\n  ByteBuffer buffer(data, 0);\n  ByteCursor cursor(&buffer);\n  EXPECT_TRUE(cursor);\n}\n\nTEST(Extent, AvailableSome) {\n  uint8_t data[10];\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  EXPECT_EQ(10U, cursor.Available());\n}\n\nTEST(Extent, AtEndSome) {\n  uint8_t data[10];\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  EXPECT_FALSE(cursor.AtEnd());\n  EXPECT_TRUE(cursor.Skip(sizeof(data)).AtEnd());\n}\n\nTEST(Extent, AsBoolSome) {\n  uint8_t data[10];\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  EXPECT_TRUE(cursor);\n  EXPECT_TRUE(cursor.Skip(sizeof(data)));\n  EXPECT_FALSE(cursor.Skip(1));\n}\n\nTEST(Extent, Cursor) {\n  uint8_t data[] = { 0xf7,\n                     0x9f, 0xbe,\n                     0x67, 0xfb, 0xd3, 0x58,\n                     0x6f, 0x36, 0xde, 0xd1,\n                     0x2a, 0x2a, 0x2a };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n\n  uint8_t a;\n  uint16_t b;\n  uint32_t c;\n  uint32_t d;\n  uint8_t stars[3];\n\n  EXPECT_EQ(data + 0U, cursor.here());\n\n  EXPECT_TRUE(cursor >> a);\n  EXPECT_EQ(data + 1U, cursor.here());\n\n  EXPECT_TRUE(cursor >> b);\n  EXPECT_EQ(data + 3U, cursor.here());\n\n  EXPECT_TRUE(cursor >> c);\n  EXPECT_EQ(data + 7U, cursor.here());\n\n  EXPECT_TRUE(cursor.Skip(4));\n  EXPECT_EQ(data + 11U, cursor.here());\n\n  EXPECT_TRUE(cursor.Read(stars, 3));\n  EXPECT_EQ(data + 14U, cursor.here());\n\n  EXPECT_FALSE(cursor >> d);\n  EXPECT_EQ(data + 14U, cursor.here());\n}\n\nTEST(Extent, SetOffset) {\n  uint8_t data[] = { 0x5c, 0x79, 0x8c, 0xd5 };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n\n  uint8_t a, b, c, d, e;\n  EXPECT_TRUE(cursor >> a);\n  EXPECT_EQ(0x5cU, a);\n  EXPECT_EQ(data + 1U, cursor.here());\n  EXPECT_TRUE(((cursor >> b).set_here(data + 3) >> c).set_here(data + 1)\n              >> d >> e);\n  EXPECT_EQ(0x79U, b);\n  EXPECT_EQ(0xd5U, c);\n  EXPECT_EQ(0x79U, d);\n  EXPECT_EQ(0x8cU, e);\n  EXPECT_EQ(data + 3U, cursor.here());\n}\n\nTEST(BigEndian, Signed1) {\n  uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  cursor.set_big_endian(true);\n  int a, b, c, d, e;\n  ASSERT_TRUE(cursor\n              .Read(1, true, &a)\n              .Read(1, true, &b)\n              .Read(1, true, &c)\n              .Read(1, true, &d));\n  EXPECT_EQ(0,     a);\n  EXPECT_EQ(0x7f,  b);\n  EXPECT_EQ(-0x80, c);\n  EXPECT_EQ(-1,    d);\n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(1, true, &e));\n}\n\nTEST(BigEndian, Signed2) {\n  uint8_t data[] = { 0x00, 0x00,   0x00, 0x80,   0x7f, 0xff,\n                     0x80, 0x00,   0x80, 0x80,   0xff, 0xff,\n                     0x39, 0xf1,   0x8a, 0xbc,   0x5a, 0xec };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer, true);\n  int a, b, c, d, e, f, g, h, i, j;\n  ASSERT_TRUE(cursor\n              .Read(2, true, &a)\n              .Read(2, true, &b)\n              .Read(2, true, &c)\n              .Read(2, true, &d)\n              .Read(2, true, &e)\n              .Read(2, true, &f)\n              .Read(2, true, &g)\n              .Read(2, true, &h)\n              .Read(2, true, &i));\n  EXPECT_EQ(0,       a);\n  EXPECT_EQ(0x80,    b);\n  EXPECT_EQ(0x7fff,  c);\n  EXPECT_EQ(-0x8000, d);\n  EXPECT_EQ(-0x7f80, e);\n  EXPECT_EQ(-1,      f);\n  EXPECT_EQ(0x39f1,  g);\n  EXPECT_EQ(-0x7544, h);\n  EXPECT_EQ(0x5aec,  i);\n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(2, true, &j));\n}\n\nTEST(BigEndian, Signed4) {\n  uint8_t data[] = { 0x00, 0x00, 0x00, 0x00,\n                     0x7f, 0xff, 0xff, 0xff,\n                     0x80, 0x00, 0x00, 0x00,\n                     0xff, 0xff, 0xff, 0xff,\n                     0xb6, 0xb1, 0xff, 0xef,\n                     0x19, 0x6a, 0xca, 0x46 };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  cursor.set_big_endian(true);\n  int64_t a, b, c, d, e, f, g;\n  ASSERT_TRUE(cursor\n              .Read(4, true, &a)\n              .Read(4, true, &b)\n              .Read(4, true, &c)\n              .Read(4, true, &d)\n              .Read(4, true, &e)\n              .Read(4, true, &f));\n  EXPECT_EQ(0,                    a);\n  EXPECT_EQ(0x7fffffff,           b);\n  EXPECT_EQ(-0x80000000LL,        c);\n  EXPECT_EQ(-1,                   d);\n  EXPECT_EQ((int32_t) 0xb6b1ffef, e);\n  EXPECT_EQ(0x196aca46,           f);\n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(4, true, &g));\n}\n\nTEST(BigEndian, Signed8) {\n  uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n                     0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n                     0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n                     0x93, 0x20, 0xd5, 0xe9, 0xd2, 0xd5, 0x87, 0x9c,\n                     0x4e, 0x42, 0x49, 0xd2, 0x7f, 0x84, 0x14, 0xa4 };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer, true);\n  int64_t a, b, c, d, e, f, g;\n  ASSERT_TRUE(cursor\n              .Read(8, true, &a)\n              .Read(8, true, &b)\n              .Read(8, true, &c)\n              .Read(8, true, &d)\n              .Read(8, true, &e)\n              .Read(8, true, &f));\n  EXPECT_EQ(0,                               a);\n  EXPECT_EQ(0x7fffffffffffffffLL,            b);\n  EXPECT_EQ(-0x7fffffffffffffffLL - 1,       c);\n  EXPECT_EQ(-1,                              d);\n  EXPECT_EQ((int64_t) 0x9320d5e9d2d5879cULL, e);\n  EXPECT_EQ(0x4e4249d27f8414a4LL,            f);  \n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(8, true, &g));\n}\n\nTEST(BigEndian, Unsigned1) {\n  uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  cursor.set_big_endian(true);\n  int32_t a, b, c, d, e;\n  ASSERT_TRUE(cursor\n              .Read(1, false, &a)\n              .Read(1, false, &b)\n              .Read(1, false, &c)\n              .Read(1, false, &d));\n  EXPECT_EQ(0,    a);\n  EXPECT_EQ(0x7f, b);\n  EXPECT_EQ(0x80, c);\n  EXPECT_EQ(0xff, d);\n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(1, false, &e));\n}\n\nTEST(BigEndian, Unsigned2) {\n  uint8_t data[] = { 0x00, 0x00,   0x00, 0x80,   0x7f, 0xff,\n                     0x80, 0x00,   0x80, 0x80,   0xff, 0xff,\n                     0x39, 0xf1,   0x8a, 0xbc,   0x5a, 0xec };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer, true);\n  int64_t a, b, c, d, e, f, g, h, i, j;\n  ASSERT_TRUE(cursor\n              .Read(2, false, &a)\n              .Read(2, false, &b)\n              .Read(2, false, &c)\n              .Read(2, false, &d)\n              .Read(2, false, &e)\n              .Read(2, false, &f)\n              .Read(2, false, &g)\n              .Read(2, false, &h)\n              .Read(2, false, &i));\n  EXPECT_EQ(0,      a);\n  EXPECT_EQ(0x80,   b);\n  EXPECT_EQ(0x7fff, c);\n  EXPECT_EQ(0x8000, d);\n  EXPECT_EQ(0x8080, e);\n  EXPECT_EQ(0xffff, f);\n  EXPECT_EQ(0x39f1, g);\n  EXPECT_EQ(0x8abc, h);\n  EXPECT_EQ(0x5aec, i);\n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(2, false, &j));\n}\n\nTEST(BigEndian, Unsigned4) {\n  uint8_t data[] = { 0x00, 0x00, 0x00, 0x00,\n                     0x7f, 0xff, 0xff, 0xff,\n                     0x80, 0x00, 0x00, 0x00,\n                     0xff, 0xff, 0xff, 0xff,\n                     0xb6, 0xb1, 0xff, 0xef,\n                     0x19, 0x6a, 0xca, 0x46 };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  cursor.set_big_endian(true);\n  int64_t a, b, c, d, e, f, g;\n  ASSERT_TRUE(cursor\n              .Read(4, false, &a)\n              .Read(4, false, &b)\n              .Read(4, false, &c)\n              .Read(4, false, &d)\n              .Read(4, false, &e)\n              .Read(4, false, &f));\n  EXPECT_EQ(0,          a);\n  EXPECT_EQ(0x7fffffff, b);\n  EXPECT_EQ(0x80000000, c);\n  EXPECT_EQ(0xffffffff, d);\n  EXPECT_EQ(0xb6b1ffef, e);\n  EXPECT_EQ(0x196aca46, f);\n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(4, false, &g));\n}\n\nTEST(BigEndian, Unsigned8) {\n  uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n                     0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n                     0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n                     0x93, 0x20, 0xd5, 0xe9, 0xd2, 0xd5, 0x87, 0x9c,\n                     0x4e, 0x42, 0x49, 0xd2, 0x7f, 0x84, 0x14, 0xa4 };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer, true);\n  uint64_t a, b, c, d, e, f, g;\n  ASSERT_TRUE(cursor\n              .Read(8, false, &a)\n              .Read(8, false, &b)\n              .Read(8, false, &c)\n              .Read(8, false, &d)\n              .Read(8, false, &e)\n              .Read(8, false, &f));\n  EXPECT_EQ(0U,                    a);\n  EXPECT_EQ(0x7fffffffffffffffULL, b);\n  EXPECT_EQ(0x8000000000000000ULL, c);\n  EXPECT_EQ(0xffffffffffffffffULL, d);\n  EXPECT_EQ(0x9320d5e9d2d5879cULL, e);\n  EXPECT_EQ(0x4e4249d27f8414a4ULL, f);  \n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(8, false, &g));\n}\n\nTEST(LittleEndian, Signed1) {\n  uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  int32_t a, b, c, d, e;\n  ASSERT_TRUE(cursor\n              .Read(1, true, &a)\n              .Read(1, true, &b)\n              .Read(1, true, &c)\n              .Read(1, true, &d));\n  EXPECT_EQ(0,     a);\n  EXPECT_EQ(0x7f,  b);\n  EXPECT_EQ(-0x80, c);\n  EXPECT_EQ(-1,    d);\n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(1, true, &e));\n}\n\nTEST(LittleEndian, Signed2) {\n  uint8_t data[] = { 0x00, 0x00,   0x80, 0x00,   0xff, 0x7f,\n                     0x00, 0x80,   0x80, 0x80,   0xff, 0xff,\n                     0xf1, 0x39,   0xbc, 0x8a,   0xec, 0x5a };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer, false);\n  int32_t a, b, c, d, e, f, g, h, i, j;\n  ASSERT_TRUE(cursor\n              .Read(2, true, &a)\n              .Read(2, true, &b)\n              .Read(2, true, &c)\n              .Read(2, true, &d)\n              .Read(2, true, &e)\n              .Read(2, true, &f)\n              .Read(2, true, &g)\n              .Read(2, true, &h)\n              .Read(2, true, &i));\n  EXPECT_EQ(0,       a);\n  EXPECT_EQ(0x80,    b);\n  EXPECT_EQ(0x7fff,  c);\n  EXPECT_EQ(-0x8000, d);\n  EXPECT_EQ(-0x7f80, e);\n  EXPECT_EQ(-1,      f);\n  EXPECT_EQ(0x39f1,  g);\n  EXPECT_EQ(-0x7544, h);\n  EXPECT_EQ(0x5aec,  i);\n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(2, true, &j));\n}\n\nTEST(LittleEndian, Signed4) {\n  uint8_t data[] = { 0x00, 0x00, 0x00, 0x00,\n                     0xff, 0xff, 0xff, 0x7f,\n                     0x00, 0x00, 0x00, 0x80,\n                     0xff, 0xff, 0xff, 0xff,\n                     0xef, 0xff, 0xb1, 0xb6, \n                     0x46, 0xca, 0x6a, 0x19 };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  int64_t a, b, c, d, e, f, g;\n  ASSERT_TRUE(cursor\n              .Read(4, true, &a)\n              .Read(4, true, &b)\n              .Read(4, true, &c)\n              .Read(4, true, &d)\n              .Read(4, true, &e)\n              .Read(4, true, &f));\n  EXPECT_EQ(0,                    a);\n  EXPECT_EQ(0x7fffffff,           b);\n  EXPECT_EQ(-0x80000000LL,        c);\n  EXPECT_EQ(-1,                   d);\n  EXPECT_EQ((int32_t) 0xb6b1ffef, e);\n  EXPECT_EQ(0x196aca46,           f);\n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(4, true, &g));\n}\n\nTEST(LittleEndian, Signed8) {\n  uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n                     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,\n                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,\n                     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n                     0x9c, 0x87, 0xd5, 0xd2, 0xe9, 0xd5, 0x20, 0x93,\n                     0xa4, 0x14, 0x84, 0x7f, 0xd2, 0x49, 0x42, 0x4e };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer, false);\n  int64_t a, b, c, d, e, f, g;\n  ASSERT_TRUE(cursor\n              .Read(8, true, &a)\n              .Read(8, true, &b)\n              .Read(8, true, &c)\n              .Read(8, true, &d)\n              .Read(8, true, &e)\n              .Read(8, true, &f));\n  EXPECT_EQ(0,                               a);\n  EXPECT_EQ(0x7fffffffffffffffLL,            b);\n  EXPECT_EQ(-0x7fffffffffffffffLL - 1,       c);\n  EXPECT_EQ(-1,                              d);\n  EXPECT_EQ((int64_t) 0x9320d5e9d2d5879cULL, e);\n  EXPECT_EQ(0x4e4249d27f8414a4LL,            f);  \n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(8, true, &g));\n}\n\nTEST(LittleEndian, Unsigned1) {\n  uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  int32_t a, b, c, d, e;\n  ASSERT_TRUE(cursor\n              .Read(1, false, &a)\n              .Read(1, false, &b)\n              .Read(1, false, &c)\n              .Read(1, false, &d));\n  EXPECT_EQ(0,    a);\n  EXPECT_EQ(0x7f, b);\n  EXPECT_EQ(0x80, c);\n  EXPECT_EQ(0xff, d);\n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(1, false, &e));\n}\n\nTEST(LittleEndian, Unsigned2) {\n  uint8_t data[] = { 0x00, 0x00,   0x80, 0x00,   0xff, 0x7f,\n                     0x00, 0x80,   0x80, 0x80,   0xff, 0xff,\n                     0xf1, 0x39,   0xbc, 0x8a,   0xec, 0x5a };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  int32_t a, b, c, d, e, f, g, h, i, j;\n  ASSERT_TRUE(cursor\n              .Read(2, false, &a)\n              .Read(2, false, &b)\n              .Read(2, false, &c)\n              .Read(2, false, &d)\n              .Read(2, false, &e)\n              .Read(2, false, &f)\n              .Read(2, false, &g)\n              .Read(2, false, &h)\n              .Read(2, false, &i));\n  EXPECT_EQ(0,      a);\n  EXPECT_EQ(0x80,   b);\n  EXPECT_EQ(0x7fff, c);\n  EXPECT_EQ(0x8000, d);\n  EXPECT_EQ(0x8080, e);\n  EXPECT_EQ(0xffff, f);\n  EXPECT_EQ(0x39f1, g);\n  EXPECT_EQ(0x8abc, h);\n  EXPECT_EQ(0x5aec, i);\n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(2, false, &j));\n}\n\nTEST(LittleEndian, Unsigned4) {\n  uint8_t data[] = { 0x00, 0x00, 0x00, 0x00,\n                     0xff, 0xff, 0xff, 0x7f,\n                     0x00, 0x00, 0x00, 0x80,\n                     0xff, 0xff, 0xff, 0xff,\n                     0xef, 0xff, 0xb1, 0xb6,\n                     0x46, 0xca, 0x6a, 0x19 };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  int64_t a, b, c, d, e, f, g;\n  ASSERT_TRUE(cursor\n              .Read(4, false, &a)\n              .Read(4, false, &b)\n              .Read(4, false, &c)\n              .Read(4, false, &d)\n              .Read(4, false, &e)\n              .Read(4, false, &f));\n  EXPECT_EQ(0,          a);\n  EXPECT_EQ(0x7fffffff, b);\n  EXPECT_EQ(0x80000000, c);\n  EXPECT_EQ(0xffffffff, d);\n  EXPECT_EQ(0xb6b1ffef, e);\n  EXPECT_EQ(0x196aca46, f);\n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(4, false, &g));\n}\n\nTEST(LittleEndian, Unsigned8) {\n  uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n                     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,\n                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,\n                     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n                     0x9c, 0x87, 0xd5, 0xd2, 0xe9, 0xd5, 0x20, 0x93,\n                     0xa4, 0x14, 0x84, 0x7f, 0xd2, 0x49, 0x42, 0x4e };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  uint64_t a, b, c, d, e, f, g;\n  ASSERT_TRUE(cursor\n              .Read(8, false, &a)\n              .Read(8, false, &b)\n              .Read(8, false, &c)\n              .Read(8, false, &d)\n              .Read(8, false, &e)\n              .Read(8, false, &f));\n  EXPECT_EQ(0U,                    a);\n  EXPECT_EQ(0x7fffffffffffffffULL, b);\n  EXPECT_EQ(0x8000000000000000ULL, c);\n  EXPECT_EQ(0xffffffffffffffffULL, d);\n  EXPECT_EQ(0x9320d5e9d2d5879cULL, e);\n  EXPECT_EQ(0x4e4249d27f8414a4ULL, f);  \n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor.Read(8, false, &g));\n}\n\nTEST(Extractor, Signed1) {\n  uint8_t data[] = { 0xfd };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  int8_t a;\n  EXPECT_TRUE(cursor >> a);\n  EXPECT_EQ(-3, a);\n  EXPECT_FALSE(cursor >> a);\n}\n\nTEST(Extractor, Signed2) {\n  uint8_t data[] = { 0x13, 0xcd };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  int16_t a;\n  EXPECT_TRUE(cursor >> a);\n  EXPECT_EQ(-13037, a);\n  EXPECT_FALSE(cursor >> a);\n}\n\nTEST(Extractor, Signed4) {\n  uint8_t data[] = { 0xd2, 0xe4, 0x53, 0xe9 };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  int32_t a;\n  // For some reason, G++ 4.4.1 complains:\n  //   warning: array subscript is above array bounds\n  // in ByteCursor::Read(size_t, bool, T *) as it inlines this call, but\n  // I'm not able to see how such a reference would occur.\n  EXPECT_TRUE(cursor >> a);\n  EXPECT_EQ(-380377902, a);\n  EXPECT_FALSE(cursor >> a);\n}\n\nTEST(Extractor, Unsigned1) {\n  uint8_t data[] = { 0xfd };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  uint8_t a;\n  EXPECT_TRUE(cursor >> a);\n  EXPECT_EQ(0xfd, a);\n  EXPECT_FALSE(cursor >> a);\n}\n\nTEST(Extractor, Unsigned2) {\n  uint8_t data[] = { 0x13, 0xcd };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  uint16_t a;\n  EXPECT_TRUE(cursor >> a);\n  EXPECT_EQ(0xcd13, a);\n  EXPECT_FALSE(cursor >> a);\n}\n\nTEST(Extractor, Unsigned4) {\n  uint8_t data[] = { 0xd2, 0xe4, 0x53, 0xe9 };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  uint32_t a;\n  // For some reason, G++ 4.4.1 complains:\n  //   warning: array subscript is above array bounds\n  // in ByteCursor::Read(size_t, bool, T *) as it inlines this call, but\n  // I'm not able to see how such a reference would occur.\n  EXPECT_TRUE(cursor >> a);\n  EXPECT_EQ(0xe953e4d2, a);\n  EXPECT_FALSE(cursor >> a);\n  EXPECT_FALSE(cursor >> a);\n}\n\nTEST(Extractor, Mixed) {\n  uint8_t data[] = { 0x42,\n                     0x25, 0x0b,\n                     0x3d, 0x25, 0xed, 0x2a,\n                     0xec, 0x16, 0x9e, 0x14, 0x61, 0x5b, 0x2c, 0xcf,\n                     0xd8,\n                     0x22, 0xa5,\n                     0x3a, 0x02, 0x6a, 0xd7,\n                     0x93, 0x2a, 0x2d, 0x8d, 0xb4, 0x95, 0xe0, 0xc6 };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n  cursor.set_big_endian(true);\n\n  uint8_t a;\n  uint16_t b;\n  uint32_t c;\n  uint64_t d;\n  int8_t e;\n  int16_t f;\n  int32_t g;\n  int64_t h;\n  int z;\n  EXPECT_FALSE(cursor.AtEnd());\n  EXPECT_TRUE(cursor >> a >> b >> c >> d >> e >> f >> g >> h);\n  EXPECT_EQ(0x42U, a);\n  EXPECT_EQ(0x250bU, b);\n  EXPECT_EQ(0x3d25ed2aU, c);\n  EXPECT_EQ(0xec169e14615b2ccfULL, d);\n  EXPECT_EQ(-40, e);\n  EXPECT_EQ(0x22a5, f);\n  EXPECT_EQ(0x3a026ad7, g);\n  EXPECT_EQ(-7842405714468937530LL, h);\n\n  EXPECT_TRUE(cursor.AtEnd());\n  EXPECT_FALSE(cursor >> z);\n}\n\nTEST(Strings, Zero) {\n  uint8_t data[] = { 0xa6 };\n  ByteBuffer buffer(data, 0);\n  ByteCursor cursor(&buffer);\n\n  uint8_t received[1];\n  received[0] = 0xc2;\n  EXPECT_TRUE(cursor.Read(received, 0));\n  EXPECT_EQ(0xc2U, received[0]);\n}\n\nTEST(Strings, Some) {\n  uint8_t data[] = { 0x5d, 0x31, 0x09, 0xa6, 0x2e, 0x2c, 0x83, 0xbb };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n\n  uint8_t received[7] = { 0xa7, 0xf7, 0x43, 0x0c, 0x27, 0xea, 0xed };\n  EXPECT_TRUE(cursor.Skip(2).Read(received, 5));\n  uint8_t expected[7] = { 0x09, 0xa6, 0x2e, 0x2c, 0x83, 0xea, 0xed };\n  EXPECT_TRUE(memcmp(received, expected, 7) == 0);\n}\n\nTEST(Strings, TooMuch) {\n  uint8_t data[] = { 0x5d, 0x31, 0x09, 0xa6, 0x2e, 0x2c, 0x83, 0xbb };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n\n  uint8_t received1[3];\n  uint8_t received2[3];\n  uint8_t received3[3];\n  EXPECT_FALSE(cursor\n               .Read(received1, 3)\n               .Read(received2, 3)\n               .Read(received3, 3));\n  uint8_t expected1[3] = { 0x5d, 0x31, 0x09 };\n  uint8_t expected2[3] = { 0xa6, 0x2e, 0x2c };\n\n  EXPECT_TRUE(memcmp(received1, expected1, 3) == 0);\n  EXPECT_TRUE(memcmp(received2, expected2, 3) == 0);\n}\n\nTEST(Strings, PointTo) {\n  uint8_t data[] = { 0x83, 0x80, 0xb4, 0x38, 0x00, 0x2c, 0x0a, 0x27 };\n  ByteBuffer buffer(data, sizeof(data));\n  ByteCursor cursor(&buffer);\n\n  const uint8_t *received1;\n  const uint8_t *received2;\n  const uint8_t *received3;\n  const uint8_t *received4;\n  EXPECT_FALSE(cursor\n               .PointTo(&received1, 3)\n               .PointTo(&received2, 3)\n               .PointTo(&received3)\n               .PointTo(&received4, 3));\n  EXPECT_EQ(data + 0, received1);\n  EXPECT_EQ(data + 3, received2);\n  EXPECT_EQ(data + 6, received3);\n  EXPECT_EQ(NULL, received4);\n}\n\nTEST(Strings, CString) {\n  uint8_t data[] = \"abc\\0\\0foo\";\n  ByteBuffer buffer(data, sizeof(data) - 1);  // don't include terminating '\\0'\n  ByteCursor cursor(&buffer);\n\n  string a, b, c;\n  EXPECT_TRUE(cursor.CString(&a).CString(&b));\n  EXPECT_EQ(\"abc\", a);\n  EXPECT_EQ(\"\", b);\n  EXPECT_FALSE(cursor.CString(&c));\n  EXPECT_EQ(\"\", c);\n  EXPECT_TRUE(cursor.AtEnd());\n}\n\nTEST(Strings, CStringLimit) {\n  uint8_t data[] = \"abcdef\\0\\0foobar\";\n  ByteBuffer buffer(data, sizeof(data) - 1);  // don't include terminating '\\0'\n  ByteCursor cursor(&buffer);\n\n  string a, b, c, d, e;\n\n  EXPECT_TRUE(cursor.CString(&a, 3));\n  EXPECT_EQ(\"abc\", a);\n\n  EXPECT_TRUE(cursor.CString(&b, 0));\n  EXPECT_EQ(\"\", b);\n\n  EXPECT_TRUE(cursor.CString(&c, 6));\n  EXPECT_EQ(\"def\", c);\n\n  EXPECT_TRUE(cursor.CString(&d, 4));\n  EXPECT_EQ(\"ooba\", d);\n\n  EXPECT_FALSE(cursor.CString(&e, 4));\n  EXPECT_EQ(\"\", e);\n\n  EXPECT_TRUE(cursor.AtEnd());\n}\n\n//  uint8_t data[] = { 0xa6, 0x54, 0xdf, 0x67, 0x51, 0x43, 0xac, 0xf1 };\n//  ByteBuffer buffer(data, sizeof(data));\n"
  },
  {
    "path": "archive/spotify/breakpad/common/convert_UTF.c",
    "content": "/*\n * Copyright 2001-2004 Unicode, Inc.\n *\n * Disclaimer\n *\n * This source code is provided as is by Unicode, Inc. No claims are\n * made as to fitness for any particular purpose. No warranties of any\n * kind are expressed or implied. The recipient agrees to determine\n * applicability of information provided. If this file has been\n * purchased on magnetic or optical media from Unicode, Inc., the\n * sole remedy for any claim will be exchange of defective media\n * within 90 days of receipt.\n *\n * Limitations on Rights to Redistribute This Code\n *\n * Unicode, Inc. hereby grants the right to freely use the information\n * supplied in this file in the creation of products supporting the\n * Unicode Standard, and to make copies of this file in any form\n * for internal or external distribution as long as this notice\n * remains attached.\n */\n\n/* ---------------------------------------------------------------------\n\nConversions between UTF32, UTF-16, and UTF-8. Source code file.\nAuthor: Mark E. Davis, 1994.\nRev History: Rick McGowan, fixes & updates May 2001.\nSept 2001: fixed const & error conditions per\nmods suggested by S. Parent & A. Lillich.\nJune 2002: Tim Dodd added detection and handling of incomplete\nsource sequences, enhanced error detection, added casts\nto eliminate compiler warnings.\nJuly 2003: slight mods to back out aggressive FFFE detection.\nJan 2004: updated switches in from-UTF8 conversions.\nOct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions.\n\nSee the header file \"ConvertUTF.h\" for complete documentation.\n\n------------------------------------------------------------------------ */\n\n\n#include \"convert_UTF.h\"\n#ifdef CVTUTF_DEBUG\n#include <stdio.h>\n#endif\n\nstatic const int halfShift  = 10; /* used for shifting by 10 bits */\n\nstatic const UTF32 halfBase = 0x0010000UL;\nstatic const UTF32 halfMask = 0x3FFUL;\n\n#define UNI_SUR_HIGH_START  (UTF32)0xD800\n#define UNI_SUR_HIGH_END    (UTF32)0xDBFF\n#define UNI_SUR_LOW_START   (UTF32)0xDC00\n#define UNI_SUR_LOW_END     (UTF32)0xDFFF\n#define false\t   0\n#define true\t    1\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF32toUTF16 (const UTF32** sourceStart, const UTF32* sourceEnd,\n                                      UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {\n  ConversionResult result = conversionOK;\n  const UTF32* source = *sourceStart;\n  UTF16* target = *targetStart;\n  while (source < sourceEnd) {\n    UTF32 ch;\n    if (target >= targetEnd) {\n\t    result = targetExhausted; break;\n    }\n    ch = *source++;\n    if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */\n\t    /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */\n\t    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {\n        if (flags == strictConversion) {\n          --source; /* return to the illegal value itself */\n          result = sourceIllegal;\n          break;\n        } else {\n          *target++ = UNI_REPLACEMENT_CHAR;\n        }\n\t    } else {\n        *target++ = (UTF16)ch; /* normal case */\n\t    }\n    } else if (ch > UNI_MAX_LEGAL_UTF32) {\n\t    if (flags == strictConversion) {\n        result = sourceIllegal;\n\t    } else {\n        *target++ = UNI_REPLACEMENT_CHAR;\n\t    }\n    } else {\n\t    /* target is a character in range 0xFFFF - 0x10FFFF. */\n\t    if (target + 1 >= targetEnd) {\n        --source; /* Back up source pointer! */\n        result = targetExhausted; break;\n\t    }\n\t    ch -= halfBase;\n\t    *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);\n\t    *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);\n    }\n  }\n*sourceStart = source;\n*targetStart = target;\nreturn result;\n}\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF16toUTF32 (const UTF16** sourceStart, const UTF16* sourceEnd,\n                                      UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {\n  ConversionResult result = conversionOK;\n  const UTF16* source = *sourceStart;\n  UTF32* target = *targetStart;\n  UTF32 ch, ch2;\n  while (source < sourceEnd) {\n    const UTF16* oldSource = source; /*  In case we have to back up because of target overflow. */\n    ch = *source++;\n    /* If we have a surrogate pair, convert to UTF32 first. */\n    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {\n\t    /* If the 16 bits following the high surrogate are in the source buffer... */\n\t    if (source < sourceEnd) {\n        ch2 = *source;\n        /* If it's a low surrogate, convert to UTF32. */\n        if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {\n          ch = ((ch - UNI_SUR_HIGH_START) << halfShift)\n          + (ch2 - UNI_SUR_LOW_START) + halfBase;\n          ++source;\n        } else if (flags == strictConversion) { /* it's an unpaired high surrogate */\n          --source; /* return to the illegal value itself */\n          result = sourceIllegal;\n          break;\n        }\n\t    } else { /* We don't have the 16 bits following the high surrogate. */\n        --source; /* return to the high surrogate */\n        result = sourceExhausted;\n        break;\n\t    }\n    } else if (flags == strictConversion) {\n\t    /* UTF-16 surrogate values are illegal in UTF-32 */\n\t    if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {\n        --source; /* return to the illegal value itself */\n        result = sourceIllegal;\n        break;\n\t    }\n    }\n    if (target >= targetEnd) {\n\t    source = oldSource; /* Back up source pointer! */\n\t    result = targetExhausted; break;\n    }\n    *target++ = ch;\n  }\n  *sourceStart = source;\n  *targetStart = target;\n#ifdef CVTUTF_DEBUG\n  if (result == sourceIllegal) {\n    fprintf(stderr, \"ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\\n\", ch, ch2);\n    fflush(stderr);\n  }\n#endif\n  return result;\n}\n\n/* --------------------------------------------------------------------- */\n\n/*\n * Index into the table below with the first byte of a UTF-8 sequence to\n * get the number of trailing bytes that are supposed to follow it.\n * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is\n * left as-is for anyone who may want to do such conversion, which was\n * allowed in earlier algorithms.\n */\nstatic const char trailingBytesForUTF8[256] = {\n  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\n  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5\n};\n\n/*\n * Magic values subtracted from a buffer value during UTF8 conversion.\n * This table contains as many values as there might be trailing bytes\n * in a UTF-8 sequence.\n */\nstatic const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL,\n  0x03C82080UL, 0xFA082080UL, 0x82082080UL };\n\n/*\n * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed\n * into the first byte, depending on how many bytes follow.  There are\n * as many entries in this table as there are UTF-8 sequence types.\n * (I.e., one byte sequence, two byte... etc.). Remember that sequencs\n * for *legal* UTF-8 will be 4 or fewer bytes total.\n */\nstatic const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };\n\n/* --------------------------------------------------------------------- */\n\n/* The interface converts a whole buffer to avoid function-call overhead.\n* Constants have been gathered. Loops & conditionals have been removed as\n* much as possible for efficiency, in favor of drop-through switches.\n* (See \"Note A\" at the bottom of the file for equivalent code.)\n* If your compiler supports it, the \"isLegalUTF8\" call can be turned\n* into an inline function.\n*/\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF16toUTF8 (const UTF16** sourceStart, const UTF16* sourceEnd,\n                                     UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {\n  ConversionResult result = conversionOK;\n  const UTF16* source = *sourceStart;\n  UTF8* target = *targetStart;\n  while (source < sourceEnd) {\n    UTF32 ch;\n    unsigned short bytesToWrite = 0;\n    const UTF32 byteMask = 0xBF;\n    const UTF32 byteMark = 0x80;\n    const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */\n    ch = *source++;\n    /* If we have a surrogate pair, convert to UTF32 first. */\n    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) {\n\t    /* If the 16 bits following the high surrogate are in the source buffer... */\n\t    if (source < sourceEnd) {\n        UTF32 ch2 = *source;\n        /* If it's a low surrogate, convert to UTF32. */\n        if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) {\n          ch = ((ch - UNI_SUR_HIGH_START) << halfShift)\n          + (ch2 - UNI_SUR_LOW_START) + halfBase;\n          ++source;\n        } else if (flags == strictConversion) { /* it's an unpaired high surrogate */\n          --source; /* return to the illegal value itself */\n          result = sourceIllegal;\n          break;\n        }\n\t    } else { /* We don't have the 16 bits following the high surrogate. */\n        --source; /* return to the high surrogate */\n        result = sourceExhausted;\n        break;\n\t    }\n    } else if (flags == strictConversion) {\n\t    /* UTF-16 surrogate values are illegal in UTF-32 */\n\t    if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) {\n        --source; /* return to the illegal value itself */\n        result = sourceIllegal;\n        break;\n\t    }\n    }\n    /* Figure out how many bytes the result will require */\n    if (ch < (UTF32)0x80) {\t     bytesToWrite = 1;\n    } else if (ch < (UTF32)0x800) {     bytesToWrite = 2;\n    } else if (ch < (UTF32)0x10000) {   bytesToWrite = 3;\n    } else if (ch < (UTF32)0x110000) {  bytesToWrite = 4;\n    } else {\t\t\t    bytesToWrite = 3;\n      ch = UNI_REPLACEMENT_CHAR;\n    }\n\n    target += bytesToWrite;\n    if (target > targetEnd) {\n\t    source = oldSource; /* Back up source pointer! */\n\t    target -= bytesToWrite; result = targetExhausted; break;\n    }\n    switch (bytesToWrite) { /* note: everything falls through. */\n\t    case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 1: *--target =  (UTF8)(ch | firstByteMark[bytesToWrite]);\n    }\n    target += bytesToWrite;\n  }\n*sourceStart = source;\n*targetStart = target;\nreturn result;\n}\n\n/* --------------------------------------------------------------------- */\n\n/*\n * Utility routine to tell whether a sequence of bytes is legal UTF-8.\n * This must be called with the length pre-determined by the first byte.\n * If not calling this from ConvertUTF8to*, then the length can be set by:\n *  length = trailingBytesForUTF8[*source]+1;\n * and the sequence is illegal right away if there aren't that many bytes\n * available.\n * If presented with a length > 4, this returns false.  The Unicode\n * definition of UTF-8 goes up to 4-byte sequences.\n */\n\nstatic Boolean isLegalUTF8(const UTF8 *source, int length) {\n  UTF8 a;\n  const UTF8 *srcptr = source+length;\n  switch (length) {\n    default: return false;\n      /* Everything else falls through when \"true\"... */\n    case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;\n    case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false;\n    case 2: if ((a = (*--srcptr)) > 0xBF) return false;\n\n      switch (*source) {\n        /* no fall-through in this inner switch */\n        case 0xE0: if (a < 0xA0) return false; break;\n        case 0xED: if (a > 0x9F) return false; break;\n        case 0xF0: if (a < 0x90) return false; break;\n        case 0xF4: if (a > 0x8F) return false; break;\n        default:   if (a < 0x80) return false;\n      }\n\n      case 1: if (*source >= 0x80 && *source < 0xC2) return false;\n  }\n  if (*source > 0xF4) return false;\n  return true;\n}\n\n/* --------------------------------------------------------------------- */\n\n/*\n * Exported function to return whether a UTF-8 sequence is legal or not.\n * This is not used here; it's just exported.\n */\nBoolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) {\n  int length = trailingBytesForUTF8[*source]+1;\n  if (source+length > sourceEnd) {\n    return false;\n  }\n  return isLegalUTF8(source, length);\n}\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF8toUTF16 (const UTF8** sourceStart, const UTF8* sourceEnd,\n                                     UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) {\n  ConversionResult result = conversionOK;\n  const UTF8* source = *sourceStart;\n  UTF16* target = *targetStart;\n  while (source < sourceEnd) {\n    UTF32 ch = 0;\n    unsigned short extraBytesToRead = trailingBytesForUTF8[*source];\n    if (source + extraBytesToRead >= sourceEnd) {\n\t    result = sourceExhausted; break;\n    }\n    /* Do this check whether lenient or strict */\n    if (! isLegalUTF8(source, extraBytesToRead+1)) {\n\t    result = sourceIllegal;\n\t    break;\n    }\n    /*\n     * The cases all fall through. See \"Note A\" below.\n     */\n    switch (extraBytesToRead) {\n\t    case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */\n\t    case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */\n\t    case 3: ch += *source++; ch <<= 6;\n\t    case 2: ch += *source++; ch <<= 6;\n\t    case 1: ch += *source++; ch <<= 6;\n\t    case 0: ch += *source++;\n    }\n    ch -= offsetsFromUTF8[extraBytesToRead];\n\n    if (target >= targetEnd) {\n\t    source -= (extraBytesToRead+1); /* Back up source pointer! */\n\t    result = targetExhausted; break;\n    }\n    if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */\n\t    /* UTF-16 surrogate values are illegal in UTF-32 */\n\t    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {\n        if (flags == strictConversion) {\n          source -= (extraBytesToRead+1); /* return to the illegal value itself */\n          result = sourceIllegal;\n          break;\n        } else {\n          *target++ = UNI_REPLACEMENT_CHAR;\n        }\n\t    } else {\n        *target++ = (UTF16)ch; /* normal case */\n\t    }\n    } else if (ch > UNI_MAX_UTF16) {\n\t    if (flags == strictConversion) {\n        result = sourceIllegal;\n        source -= (extraBytesToRead+1); /* return to the start */\n        break; /* Bail out; shouldn't continue */\n\t    } else {\n        *target++ = UNI_REPLACEMENT_CHAR;\n\t    }\n    } else {\n\t    /* target is a character in range 0xFFFF - 0x10FFFF. */\n\t    if (target + 1 >= targetEnd) {\n        source -= (extraBytesToRead+1); /* Back up source pointer! */\n        result = targetExhausted; break;\n\t    }\n\t    ch -= halfBase;\n\t    *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START);\n\t    *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START);\n    }\n  }\n*sourceStart = source;\n*targetStart = target;\nreturn result;\n}\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF32toUTF8 (const UTF32** sourceStart, const UTF32* sourceEnd,\n                                     UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) {\n  ConversionResult result = conversionOK;\n  const UTF32* source = *sourceStart;\n  UTF8* target = *targetStart;\n  while (source < sourceEnd) {\n    UTF32 ch;\n    unsigned short bytesToWrite = 0;\n    const UTF32 byteMask = 0xBF;\n    const UTF32 byteMark = 0x80;\n    ch = *source++;\n    if (flags == strictConversion ) {\n\t    /* UTF-16 surrogate values are illegal in UTF-32 */\n\t    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {\n        --source; /* return to the illegal value itself */\n        result = sourceIllegal;\n        break;\n\t    }\n    }\n    /*\n     * Figure out how many bytes the result will require. Turn any\n     * illegally large UTF32 things (> Plane 17) into replacement chars.\n     */\n    if (ch < (UTF32)0x80) {\t     bytesToWrite = 1;\n    } else if (ch < (UTF32)0x800) {     bytesToWrite = 2;\n    } else if (ch < (UTF32)0x10000) {   bytesToWrite = 3;\n    } else if (ch <= UNI_MAX_LEGAL_UTF32) {  bytesToWrite = 4;\n    } else {\t\t\t    bytesToWrite = 3;\n      ch = UNI_REPLACEMENT_CHAR;\n      result = sourceIllegal;\n    }\n\n    target += bytesToWrite;\n    if (target > targetEnd) {\n\t    --source; /* Back up source pointer! */\n\t    target -= bytesToWrite; result = targetExhausted; break;\n    }\n    switch (bytesToWrite) { /* note: everything falls through. */\n\t    case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6;\n\t    case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]);\n    }\n    target += bytesToWrite;\n  }\n*sourceStart = source;\n*targetStart = target;\nreturn result;\n}\n\n/* --------------------------------------------------------------------- */\n\nConversionResult ConvertUTF8toUTF32 (const UTF8** sourceStart, const UTF8* sourceEnd,\n                                     UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) {\n  ConversionResult result = conversionOK;\n  const UTF8* source = *sourceStart;\n  UTF32* target = *targetStart;\n  while (source < sourceEnd) {\n    UTF32 ch = 0;\n    unsigned short extraBytesToRead = trailingBytesForUTF8[*source];\n    if (source + extraBytesToRead >= sourceEnd) {\n\t    result = sourceExhausted; break;\n    }\n    /* Do this check whether lenient or strict */\n    if (! isLegalUTF8(source, extraBytesToRead+1)) {\n\t    result = sourceIllegal;\n\t    break;\n    }\n    /*\n     * The cases all fall through. See \"Note A\" below.\n     */\n    switch (extraBytesToRead) {\n\t    case 5: ch += *source++; ch <<= 6;\n\t    case 4: ch += *source++; ch <<= 6;\n\t    case 3: ch += *source++; ch <<= 6;\n\t    case 2: ch += *source++; ch <<= 6;\n\t    case 1: ch += *source++; ch <<= 6;\n\t    case 0: ch += *source++;\n    }\n    ch -= offsetsFromUTF8[extraBytesToRead];\n\n    if (target >= targetEnd) {\n\t    source -= (extraBytesToRead+1); /* Back up the source pointer! */\n\t    result = targetExhausted; break;\n    }\n    if (ch <= UNI_MAX_LEGAL_UTF32) {\n\t    /*\n\t     * UTF-16 surrogate values are illegal in UTF-32, and anything\n\t     * over Plane 17 (> 0x10FFFF) is illegal.\n\t     */\n\t    if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) {\n        if (flags == strictConversion) {\n          source -= (extraBytesToRead+1); /* return to the illegal value itself */\n          result = sourceIllegal;\n          break;\n        } else {\n          *target++ = UNI_REPLACEMENT_CHAR;\n        }\n\t    } else {\n        *target++ = ch;\n\t    }\n    } else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */\n\t    result = sourceIllegal;\n\t    *target++ = UNI_REPLACEMENT_CHAR;\n    }\n  }\n  *sourceStart = source;\n  *targetStart = target;\n  return result;\n}\n\n/* ---------------------------------------------------------------------\n\nNote A.\nThe fall-through switches in UTF-8 reading code save a\ntemp variable, some decrements & conditionals.  The switches\nare equivalent to the following loop:\n{\n  int tmpBytesToRead = extraBytesToRead+1;\n  do {\n\t\tch += *source++;\n\t\t--tmpBytesToRead;\n\t\tif (tmpBytesToRead) ch <<= 6;\n  } while (tmpBytesToRead > 0);\n}\nIn UTF-8 writing code, the switches on \"bytesToWrite\" are\nsimilarly unrolled loops.\n\n--------------------------------------------------------------------- */\n"
  },
  {
    "path": "archive/spotify/breakpad/common/convert_UTF.h",
    "content": "/*\n * Copyright 2001-2004 Unicode, Inc.\n *\n * Disclaimer\n *\n * This source code is provided as is by Unicode, Inc. No claims are\n * made as to fitness for any particular purpose. No warranties of any\n * kind are expressed or implied. The recipient agrees to determine\n * applicability of information provided. If this file has been\n * purchased on magnetic or optical media from Unicode, Inc., the\n * sole remedy for any claim will be exchange of defective media\n * within 90 days of receipt.\n *\n * Limitations on Rights to Redistribute This Code\n *\n * Unicode, Inc. hereby grants the right to freely use the information\n * supplied in this file in the creation of products supporting the\n * Unicode Standard, and to make copies of this file in any form\n * for internal or external distribution as long as this notice\n * remains attached.\n */\n\n/* ---------------------------------------------------------------------\n\nConversions between UTF32, UTF-16, and UTF-8.  Header file.\n\nSeveral funtions are included here, forming a complete set of\nconversions between the three formats.  UTF-7 is not included\nhere, but is handled in a separate source file.\n\nEach of these routines takes pointers to input buffers and output\nbuffers.  The input buffers are const.\n\nEach routine converts the text between *sourceStart and sourceEnd,\nputting the result into the buffer between *targetStart and\ntargetEnd. Note: the end pointers are *after* the last item: e.g.\n*(sourceEnd - 1) is the last item.\n\nThe return result indicates whether the conversion was successful,\nand if not, whether the problem was in the source or target buffers.\n(Only the first encountered problem is indicated.)\n\nAfter the conversion, *sourceStart and *targetStart are both\nupdated to point to the end of last text successfully converted in\nthe respective buffers.\n\nInput parameters:\nsourceStart - pointer to a pointer to the source buffer.\nThe contents of this are modified on return so that\nit points at the next thing to be converted.\ntargetStart - similarly, pointer to pointer to the target buffer.\nsourceEnd, targetEnd - respectively pointers to the ends of the\ntwo buffers, for overflow checking only.\n\nThese conversion functions take a ConversionFlags argument. When this\nflag is set to strict, both irregular sequences and isolated surrogates\nwill cause an error.  When the flag is set to lenient, both irregular\nsequences and isolated surrogates are converted.\n\nWhether the flag is strict or lenient, all illegal sequences will cause\nan error return. This includes sequences such as: <F4 90 80 80>, <C0 80>,\nor <A0> in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code\nmust check for illegal sequences.\n\nWhen the flag is set to lenient, characters over 0x10FFFF are converted\nto the replacement character; otherwise (when the flag is set to strict)\nthey constitute an error.\n\nOutput parameters:\nThe value \"sourceIllegal\" is returned from some routines if the input\nsequence is malformed.  When \"sourceIllegal\" is returned, the source\nvalue will point to the illegal value that caused the problem. E.g.,\nin UTF-8 when a sequence is malformed, it points to the start of the\nmalformed sequence.\n\nAuthor: Mark E. Davis, 1994.\nRev History: Rick McGowan, fixes & updates May 2001.\nFixes & updates, Sept 2001.\n\n------------------------------------------------------------------------ */\n\n/* ---------------------------------------------------------------------\nThe following 4 definitions are compiler-specific.\nThe C standard does not guarantee that wchar_t has at least\n16 bits, so wchar_t is no less portable than unsigned short!\nAll should be unsigned values to avoid sign extension during\nbit mask & shift operations.\n------------------------------------------------------------------------ */\n\ntypedef unsigned long\tUTF32;\t/* at least 32 bits */\ntypedef unsigned short\tUTF16;\t/* at least 16 bits */\ntypedef unsigned char\tUTF8;\t/* typically 8 bits */\ntypedef unsigned char\tBoolean; /* 0 or 1 */\n\n/* Some fundamental constants */\n#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD\n#define UNI_MAX_BMP (UTF32)0x0000FFFF\n#define UNI_MAX_UTF16 (UTF32)0x0010FFFF\n#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF\n#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF\n\ntypedef enum {\n\tconversionOK, \t\t/* conversion successful */\n\tsourceExhausted,\t/* partial character in source, but hit end */\n\ttargetExhausted,\t/* insuff. room in target for conversion */\n\tsourceIllegal\t\t/* source sequence is illegal/malformed */\n} ConversionResult;\n\ntypedef enum {\n\tstrictConversion = 0,\n\tlenientConversion\n} ConversionFlags;\n\n/* This is for C++ and does no harm in C */\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nConversionResult ConvertUTF8toUTF16 (const UTF8** sourceStart, const UTF8* sourceEnd,\n                                     UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);\n\nConversionResult ConvertUTF16toUTF8 (const UTF16** sourceStart, const UTF16* sourceEnd,\n                                     UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);\n\nConversionResult ConvertUTF8toUTF32 (const UTF8** sourceStart, const UTF8* sourceEnd,\n                                     UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);\n\nConversionResult ConvertUTF32toUTF8 (const UTF32** sourceStart, const UTF32* sourceEnd,\n                                     UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);\n\nConversionResult ConvertUTF16toUTF32 (const UTF16** sourceStart, const UTF16* sourceEnd,\n                                      UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);\n\nConversionResult ConvertUTF32toUTF16 (const UTF32** sourceStart, const UTF32* sourceEnd,\n                                      UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);\n\nBoolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd);\n\n#ifdef __cplusplus\n}\n#endif\n\n/* --------------------------------------------------------------------- */\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/bytereader-inl.h",
    "content": "// Copyright 2006 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef UTIL_DEBUGINFO_BYTEREADER_INL_H__\n#define UTIL_DEBUGINFO_BYTEREADER_INL_H__\n\n#include \"common/dwarf/bytereader.h\"\n\n#include <assert.h>\n\nnamespace dwarf2reader {\n\ninline uint8 ByteReader::ReadOneByte(const char* buffer) const {\n  return buffer[0];\n}\n\ninline uint16 ByteReader::ReadTwoBytes(const char* signed_buffer) const {\n  const unsigned char *buffer\n    = reinterpret_cast<const unsigned char *>(signed_buffer);\n  const uint16 buffer0 = buffer[0];\n  const uint16 buffer1 = buffer[1];\n  if (endian_ == ENDIANNESS_LITTLE) {\n    return buffer0 | buffer1 << 8;\n  } else {\n    return buffer1 | buffer0 << 8;\n  }\n}\n\ninline uint64 ByteReader::ReadFourBytes(const char* signed_buffer) const {\n  const unsigned char *buffer\n    = reinterpret_cast<const unsigned char *>(signed_buffer);\n  const uint32 buffer0 = buffer[0];\n  const uint32 buffer1 = buffer[1];\n  const uint32 buffer2 = buffer[2];\n  const uint32 buffer3 = buffer[3];\n  if (endian_ == ENDIANNESS_LITTLE) {\n    return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24;\n  } else {\n    return buffer3 | buffer2 << 8 | buffer1 << 16 | buffer0 << 24;\n  }\n}\n\ninline uint64 ByteReader::ReadEightBytes(const char* signed_buffer) const {\n  const unsigned char *buffer\n    = reinterpret_cast<const unsigned char *>(signed_buffer);\n  const uint64 buffer0 = buffer[0];\n  const uint64 buffer1 = buffer[1];\n  const uint64 buffer2 = buffer[2];\n  const uint64 buffer3 = buffer[3];\n  const uint64 buffer4 = buffer[4];\n  const uint64 buffer5 = buffer[5];\n  const uint64 buffer6 = buffer[6];\n  const uint64 buffer7 = buffer[7];\n  if (endian_ == ENDIANNESS_LITTLE) {\n    return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24 |\n      buffer4 << 32 | buffer5 << 40 | buffer6 << 48 | buffer7 << 56;\n  } else {\n    return buffer7 | buffer6 << 8 | buffer5 << 16 | buffer4 << 24 |\n      buffer3 << 32 | buffer2 << 40 | buffer1 << 48 | buffer0 << 56;\n  }\n}\n\n// Read an unsigned LEB128 number.  Each byte contains 7 bits of\n// information, plus one bit saying whether the number continues or\n// not.\n\ninline uint64 ByteReader::ReadUnsignedLEB128(const char* buffer,\n                                             size_t* len) const {\n  uint64 result = 0;\n  size_t num_read = 0;\n  unsigned int shift = 0;\n  unsigned char byte;\n\n  do {\n    byte = *buffer++;\n    num_read++;\n\n    result |= (static_cast<uint64>(byte & 0x7f)) << shift;\n\n    shift += 7;\n\n  } while (byte & 0x80);\n\n  *len = num_read;\n\n  return result;\n}\n\n// Read a signed LEB128 number.  These are like regular LEB128\n// numbers, except the last byte may have a sign bit set.\n\ninline int64 ByteReader::ReadSignedLEB128(const char* buffer,\n                                          size_t* len) const {\n  int64 result = 0;\n  unsigned int shift = 0;\n  size_t num_read = 0;\n  unsigned char byte;\n\n  do {\n      byte = *buffer++;\n      num_read++;\n      result |= (static_cast<uint64>(byte & 0x7f) << shift);\n      shift += 7;\n  } while (byte & 0x80);\n\n  if ((shift < 8 * sizeof (result)) && (byte & 0x40))\n    result |= -((static_cast<int64>(1)) << shift);\n  *len = num_read;\n  return result;\n}\n\ninline uint64 ByteReader::ReadOffset(const char* buffer) const {\n  assert(this->offset_reader_);\n  return (this->*offset_reader_)(buffer);\n}\n\ninline uint64 ByteReader::ReadAddress(const char* buffer) const {\n  assert(this->address_reader_);\n  return (this->*address_reader_)(buffer);\n}\n\ninline void ByteReader::SetCFIDataBase(uint64 section_base,\n                                       const char *buffer_base) {\n  section_base_ = section_base;\n  buffer_base_ = buffer_base;\n  have_section_base_ = true;\n}\n\ninline void ByteReader::SetTextBase(uint64 text_base) {\n  text_base_ = text_base;\n  have_text_base_ = true;\n}\n\ninline void ByteReader::SetDataBase(uint64 data_base) {\n  data_base_ = data_base;\n  have_data_base_ = true;\n}\n\ninline void ByteReader::SetFunctionBase(uint64 function_base) {\n  function_base_ = function_base;\n  have_function_base_ = true;\n}\n\ninline void ByteReader::ClearFunctionBase() {\n  have_function_base_ = false;\n}\n\n}  // namespace dwarf2reader\n\n#endif  // UTIL_DEBUGINFO_BYTEREADER_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/bytereader.cc",
    "content": "// Copyright (c) 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <assert.h>\n#include <stdlib.h>\n\n#include \"common/dwarf/bytereader-inl.h\"\n#include \"common/dwarf/bytereader.h\"\n\nnamespace dwarf2reader {\n\nByteReader::ByteReader(enum Endianness endian)\n    :offset_reader_(NULL), address_reader_(NULL), endian_(endian),\n     address_size_(0), offset_size_(0),\n     have_section_base_(), have_text_base_(), have_data_base_(),\n     have_function_base_() { }\n\nByteReader::~ByteReader() { }\n\nvoid ByteReader::SetOffsetSize(uint8 size) {\n  offset_size_ = size;\n  assert(size == 4 || size == 8);\n  if (size == 4) {\n    this->offset_reader_ = &ByteReader::ReadFourBytes;\n  } else {\n    this->offset_reader_ = &ByteReader::ReadEightBytes;\n  }\n}\n\nvoid ByteReader::SetAddressSize(uint8 size) {\n  address_size_ = size;\n  assert(size == 4 || size == 8);\n  if (size == 4) {\n    this->address_reader_ = &ByteReader::ReadFourBytes;\n  } else {\n    this->address_reader_ = &ByteReader::ReadEightBytes;\n  }\n}\n\nuint64 ByteReader::ReadInitialLength(const char* start, size_t* len) {\n  const uint64 initial_length = ReadFourBytes(start);\n  start += 4;\n\n  // In DWARF2/3, if the initial length is all 1 bits, then the offset\n  // size is 8 and we need to read the next 8 bytes for the real length.\n  if (initial_length == 0xffffffff) {\n    SetOffsetSize(8);\n    *len = 12;\n    return ReadOffset(start);\n  } else {\n    SetOffsetSize(4);\n    *len = 4;\n  }\n  return initial_length;\n}\n\nbool ByteReader::ValidEncoding(DwarfPointerEncoding encoding) const {\n  if (encoding == DW_EH_PE_omit) return true;\n  if (encoding == DW_EH_PE_aligned) return true;\n  if ((encoding & 0x7) > DW_EH_PE_udata8)\n    return false;\n  if ((encoding & 0x70) > DW_EH_PE_funcrel)\n    return false;\n  return true;\n}\n\nbool ByteReader::UsableEncoding(DwarfPointerEncoding encoding) const {\n  switch (encoding & 0x70) {\n    case DW_EH_PE_absptr:  return true;\n    case DW_EH_PE_pcrel:   return have_section_base_;\n    case DW_EH_PE_textrel: return have_text_base_;\n    case DW_EH_PE_datarel: return have_data_base_;\n    case DW_EH_PE_funcrel: return have_function_base_;\n    default:               return false;\n  }\n}\n\nuint64 ByteReader::ReadEncodedPointer(const char *buffer,\n                                      DwarfPointerEncoding encoding,\n                                      size_t *len) const {\n  // UsableEncoding doesn't approve of DW_EH_PE_omit, so we shouldn't\n  // see it here.\n  assert(encoding != DW_EH_PE_omit);\n\n  // The Linux Standards Base 4.0 does not make this clear, but the\n  // GNU tools (gcc/unwind-pe.h; readelf/dwarf.c; gdb/dwarf2-frame.c)\n  // agree that aligned pointers are always absolute, machine-sized,\n  // machine-signed pointers.\n  if (encoding == DW_EH_PE_aligned) {\n    assert(have_section_base_);\n\n    // We don't need to align BUFFER in *our* address space. Rather, we\n    // need to find the next position in our buffer that would be aligned\n    // when the .eh_frame section the buffer contains is loaded into the\n    // program's memory. So align assuming that buffer_base_ gets loaded at\n    // address section_base_, where section_base_ itself may or may not be\n    // aligned.\n\n    // First, find the offset to START from the closest prior aligned\n    // address.\n    uint64 skew = section_base_ & (AddressSize() - 1);\n    // Now find the offset from that aligned address to buffer.\n    uint64 offset = skew + (buffer - buffer_base_);\n    // Round up to the next boundary.\n    uint64 aligned = (offset + AddressSize() - 1) & -AddressSize();\n    // Convert back to a pointer.\n    const char *aligned_buffer = buffer_base_ + (aligned - skew);\n    // Finally, store the length and actually fetch the pointer.\n    *len = aligned_buffer - buffer + AddressSize();\n    return ReadAddress(aligned_buffer);\n  }\n\n  // Extract the value first, ignoring whether it's a pointer or an\n  // offset relative to some base.\n  uint64 offset;\n  switch (encoding & 0x0f) {\n    case DW_EH_PE_absptr:\n      // DW_EH_PE_absptr is weird, as it is used as a meaningful value for\n      // both the high and low nybble of encoding bytes. When it appears in\n      // the high nybble, it means that the pointer is absolute, not an\n      // offset from some base address. When it appears in the low nybble,\n      // as here, it means that the pointer is stored as a normal\n      // machine-sized and machine-signed address. A low nybble of\n      // DW_EH_PE_absptr does not imply that the pointer is absolute; it is\n      // correct for us to treat the value as an offset from a base address\n      // if the upper nybble is not DW_EH_PE_absptr.\n      offset = ReadAddress(buffer);\n      *len = AddressSize();\n      break;\n\n    case DW_EH_PE_uleb128:\n      offset = ReadUnsignedLEB128(buffer, len);\n      break;\n\n    case DW_EH_PE_udata2:\n      offset = ReadTwoBytes(buffer);\n      *len = 2;\n      break;\n\n    case DW_EH_PE_udata4:\n      offset = ReadFourBytes(buffer);\n      *len = 4;\n      break;\n\n    case DW_EH_PE_udata8:\n      offset = ReadEightBytes(buffer);\n      *len = 8;\n      break;\n\n    case DW_EH_PE_sleb128:\n      offset = ReadSignedLEB128(buffer, len);\n      break;\n\n    case DW_EH_PE_sdata2:\n      offset = ReadTwoBytes(buffer);\n      // Sign-extend from 16 bits.\n      offset = (offset ^ 0x8000) - 0x8000;\n      *len = 2;\n      break;\n\n    case DW_EH_PE_sdata4:\n      offset = ReadFourBytes(buffer);\n      // Sign-extend from 32 bits.\n      offset = (offset ^ 0x80000000ULL) - 0x80000000ULL;\n      *len = 4;\n      break;\n\n    case DW_EH_PE_sdata8:\n      // No need to sign-extend; this is the full width of our type.\n      offset = ReadEightBytes(buffer);\n      *len = 8;\n      break;\n\n    default:\n      abort();\n  }\n\n  // Find the appropriate base address.\n  uint64 base;\n  switch (encoding & 0x70) {\n    case DW_EH_PE_absptr:\n      base = 0;\n      break;\n\n    case DW_EH_PE_pcrel:\n      assert(have_section_base_);\n      base = section_base_ + (buffer - buffer_base_);\n      break;\n\n    case DW_EH_PE_textrel:\n      assert(have_text_base_);\n      base = text_base_;\n      break;\n\n    case DW_EH_PE_datarel:\n      assert(have_data_base_);\n      base = data_base_;\n      break;\n\n    case DW_EH_PE_funcrel:\n      assert(have_function_base_);\n      base = function_base_;\n      break;\n\n    default:\n      abort();\n  }\n\n  uint64 pointer = base + offset;\n\n  // Remove inappropriate upper bits.\n  if (AddressSize() == 4)\n    pointer = pointer & 0xffffffff;\n  else\n    assert(AddressSize() == sizeof(uint64));\n\n  return pointer;\n}\n\n}  // namespace dwarf2reader\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/bytereader.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef COMMON_DWARF_BYTEREADER_H__\n#define COMMON_DWARF_BYTEREADER_H__\n\n#include <string>\n#include \"common/dwarf/types.h\"\n#include \"common/dwarf/dwarf2enums.h\"\n\nnamespace dwarf2reader {\n\n// We can't use the obvious name of LITTLE_ENDIAN and BIG_ENDIAN\n// because it conflicts with a macro\nenum Endianness {\n  ENDIANNESS_BIG,\n  ENDIANNESS_LITTLE\n};\n\n// A ByteReader knows how to read single- and multi-byte values of\n// various endiannesses, sizes, and encodings, as used in DWARF\n// debugging information and Linux C++ exception handling data.\nclass ByteReader {\n public:\n  // Construct a ByteReader capable of reading one-, two-, four-, and\n  // eight-byte values according to ENDIANNESS, absolute machine-sized\n  // addresses, DWARF-style \"initial length\" values, signed and\n  // unsigned LEB128 numbers, and Linux C++ exception handling data's\n  // encoded pointers.\n  explicit ByteReader(enum Endianness endianness);\n  virtual ~ByteReader();\n\n  // Read a single byte from BUFFER and return it as an unsigned 8 bit\n  // number.\n  uint8 ReadOneByte(const char* buffer) const;\n\n  // Read two bytes from BUFFER and return them as an unsigned 16 bit\n  // number, using this ByteReader's endianness.\n  uint16 ReadTwoBytes(const char* buffer) const;\n\n  // Read four bytes from BUFFER and return them as an unsigned 32 bit\n  // number, using this ByteReader's endianness. This function returns\n  // a uint64 so that it is compatible with ReadAddress and\n  // ReadOffset. The number it returns will never be outside the range\n  // of an unsigned 32 bit integer.\n  uint64 ReadFourBytes(const char* buffer) const;\n\n  // Read eight bytes from BUFFER and return them as an unsigned 64\n  // bit number, using this ByteReader's endianness.\n  uint64 ReadEightBytes(const char* buffer) const;\n\n  // Read an unsigned LEB128 (Little Endian Base 128) number from\n  // BUFFER and return it as an unsigned 64 bit integer. Set LEN to\n  // the number of bytes read.\n  //\n  // The unsigned LEB128 representation of an integer N is a variable\n  // number of bytes:\n  //\n  // - If N is between 0 and 0x7f, then its unsigned LEB128\n  //   representation is a single byte whose value is N.\n  //\n  // - Otherwise, its unsigned LEB128 representation is (N & 0x7f) |\n  //   0x80, followed by the unsigned LEB128 representation of N /\n  //   128, rounded towards negative infinity.\n  //\n  // In other words, we break VALUE into groups of seven bits, put\n  // them in little-endian order, and then write them as eight-bit\n  // bytes with the high bit on all but the last.\n  uint64 ReadUnsignedLEB128(const char* buffer, size_t* len) const;\n\n  // Read a signed LEB128 number from BUFFER and return it as an\n  // signed 64 bit integer. Set LEN to the number of bytes read.\n  //\n  // The signed LEB128 representation of an integer N is a variable\n  // number of bytes:\n  //\n  // - If N is between -0x40 and 0x3f, then its signed LEB128\n  //   representation is a single byte whose value is N in two's\n  //   complement.\n  //\n  // - Otherwise, its signed LEB128 representation is (N & 0x7f) |\n  //   0x80, followed by the signed LEB128 representation of N / 128,\n  //   rounded towards negative infinity.\n  //\n  // In other words, we break VALUE into groups of seven bits, put\n  // them in little-endian order, and then write them as eight-bit\n  // bytes with the high bit on all but the last.\n  int64 ReadSignedLEB128(const char* buffer, size_t* len) const;\n\n  // Indicate that addresses on this architecture are SIZE bytes long. SIZE\n  // must be either 4 or 8. (DWARF allows addresses to be any number of\n  // bytes in length from 1 to 255, but we only support 32- and 64-bit\n  // addresses at the moment.) You must call this before using the\n  // ReadAddress member function.\n  //\n  // For data in a .debug_info section, or something that .debug_info\n  // refers to like line number or macro data, the compilation unit\n  // header's address_size field indicates the address size to use. Call\n  // frame information doesn't indicate its address size (a shortcoming of\n  // the spec); you must supply the appropriate size based on the\n  // architecture of the target machine.\n  void SetAddressSize(uint8 size);\n\n  // Return the current address size, in bytes. This is either 4,\n  // indicating 32-bit addresses, or 8, indicating 64-bit addresses.\n  uint8 AddressSize() const { return address_size_; }\n\n  // Read an address from BUFFER and return it as an unsigned 64 bit\n  // integer, respecting this ByteReader's endianness and address size. You\n  // must call SetAddressSize before calling this function.\n  uint64 ReadAddress(const char* buffer) const;\n\n  // DWARF actually defines two slightly different formats: 32-bit DWARF\n  // and 64-bit DWARF. This is *not* related to the size of registers or\n  // addresses on the target machine; it refers only to the size of section\n  // offsets and data lengths appearing in the DWARF data. One only needs\n  // 64-bit DWARF when the debugging data itself is larger than 4GiB.\n  // 32-bit DWARF can handle x86_64 or PPC64 code just fine, unless the\n  // debugging data itself is very large.\n  //\n  // DWARF information identifies itself as 32-bit or 64-bit DWARF: each\n  // compilation unit and call frame information entry begins with an\n  // \"initial length\" field, which, in addition to giving the length of the\n  // data, also indicates the size of section offsets and lengths appearing\n  // in that data. The ReadInitialLength member function, below, reads an\n  // initial length and sets the ByteReader's offset size as a side effect.\n  // Thus, in the normal process of reading DWARF data, the appropriate\n  // offset size is set automatically. So, you should only need to call\n  // SetOffsetSize if you are using the same ByteReader to jump from the\n  // midst of one block of DWARF data into another.\n\n  // Read a DWARF \"initial length\" field from START, and return it as\n  // an unsigned 64 bit integer, respecting this ByteReader's\n  // endianness. Set *LEN to the length of the initial length in\n  // bytes, either four or twelve. As a side effect, set this\n  // ByteReader's offset size to either 4 (if we see a 32-bit DWARF\n  // initial length) or 8 (if we see a 64-bit DWARF initial length).\n  //\n  // A DWARF initial length is either:\n  //\n  // - a byte count stored as an unsigned 32-bit value less than\n  //   0xffffff00, indicating that the data whose length is being\n  //   measured uses the 32-bit DWARF format, or\n  //\n  // - The 32-bit value 0xffffffff, followed by a 64-bit byte count,\n  //   indicating that the data whose length is being measured uses\n  //   the 64-bit DWARF format.\n  uint64 ReadInitialLength(const char* start, size_t* len);\n\n  // Read an offset from BUFFER and return it as an unsigned 64 bit\n  // integer, respecting the ByteReader's endianness. In 32-bit DWARF, the\n  // offset is 4 bytes long; in 64-bit DWARF, the offset is eight bytes\n  // long. You must call ReadInitialLength or SetOffsetSize before calling\n  // this function; see the comments above for details.\n  uint64 ReadOffset(const char* buffer) const;\n\n  // Return the current offset size, in bytes.\n  // A return value of 4 indicates that we are reading 32-bit DWARF.\n  // A return value of 8 indicates that we are reading 64-bit DWARF.\n  uint8 OffsetSize() const { return offset_size_; }\n\n  // Indicate that section offsets and lengths are SIZE bytes long. SIZE\n  // must be either 4 (meaning 32-bit DWARF) or 8 (meaning 64-bit DWARF).\n  // Usually, you should not call this function yourself; instead, let a\n  // call to ReadInitialLength establish the data's offset size\n  // automatically.\n  void SetOffsetSize(uint8 size);\n\n  // The Linux C++ ABI uses a variant of DWARF call frame information\n  // for exception handling. This data is included in the program's\n  // address space as the \".eh_frame\" section, and intepreted at\n  // runtime to walk the stack, find exception handlers, and run\n  // cleanup code. The format is mostly the same as DWARF CFI, with\n  // some adjustments made to provide the additional\n  // exception-handling data, and to make the data easier to work with\n  // in memory --- for example, to allow it to be placed in read-only\n  // memory even when describing position-independent code.\n  //\n  // In particular, exception handling data can select a number of\n  // different encodings for pointers that appear in the data, as\n  // described by the DwarfPointerEncoding enum. There are actually\n  // four axes(!) to the encoding:\n  //\n  // - The pointer size: pointers can be 2, 4, or 8 bytes long, or use\n  //   the DWARF LEB128 encoding.\n  //\n  // - The pointer's signedness: pointers can be signed or unsigned.\n  //\n  // - The pointer's base address: the data stored in the exception\n  //   handling data can be the actual address (that is, an absolute\n  //   pointer), or relative to one of a number of different base\n  //   addreses --- including that of the encoded pointer itself, for\n  //   a form of \"pc-relative\" addressing.\n  //\n  // - The pointer may be indirect: it may be the address where the\n  //   true pointer is stored. (This is used to refer to things via\n  //   global offset table entries, program linkage table entries, or\n  //   other tricks used in position-independent code.)\n  //\n  // There are also two options that fall outside that matrix\n  // altogether: the pointer may be omitted, or it may have padding to\n  // align it on an appropriate address boundary. (That last option\n  // may seem like it should be just another axis, but it is not.)\n\n  // Indicate that the exception handling data is loaded starting at\n  // SECTION_BASE, and that the start of its buffer in our own memory\n  // is BUFFER_BASE. This allows us to find the address that a given\n  // byte in our buffer would have when loaded into the program the\n  // data describes. We need this to resolve DW_EH_PE_pcrel pointers.\n  void SetCFIDataBase(uint64 section_base, const char *buffer_base);\n\n  // Indicate that the base address of the program's \".text\" section\n  // is TEXT_BASE. We need this to resolve DW_EH_PE_textrel pointers.\n  void SetTextBase(uint64 text_base);\n\n  // Indicate that the base address for DW_EH_PE_datarel pointers is\n  // DATA_BASE. The proper value depends on the ABI; it is usually the\n  // address of the global offset table, held in a designated register in\n  // position-independent code. You will need to look at the startup code\n  // for the target system to be sure. I tried; my eyes bled.\n  void SetDataBase(uint64 data_base);\n\n  // Indicate that the base address for the FDE we are processing is\n  // FUNCTION_BASE. This is the start address of DW_EH_PE_funcrel\n  // pointers. (This encoding does not seem to be used by the GNU\n  // toolchain.)\n  void SetFunctionBase(uint64 function_base);\n\n  // Indicate that we are no longer processing any FDE, so any use of\n  // a DW_EH_PE_funcrel encoding is an error.\n  void ClearFunctionBase();\n\n  // Return true if ENCODING is a valid pointer encoding.\n  bool ValidEncoding(DwarfPointerEncoding encoding) const;\n\n  // Return true if we have all the information we need to read a\n  // pointer that uses ENCODING. This checks that the appropriate\n  // SetFooBase function for ENCODING has been called.\n  bool UsableEncoding(DwarfPointerEncoding encoding) const;\n\n  // Read an encoded pointer from BUFFER using ENCODING; return the\n  // absolute address it represents, and set *LEN to the pointer's\n  // length in bytes, including any padding for aligned pointers.\n  //\n  // This function calls 'abort' if ENCODING is invalid or refers to a\n  // base address this reader hasn't been given, so you should check\n  // with ValidEncoding and UsableEncoding first if you would rather\n  // die in a more helpful way.\n  uint64 ReadEncodedPointer(const char *buffer, DwarfPointerEncoding encoding,\n                            size_t *len) const;\n\n private:\n\n  // Function pointer type for our address and offset readers.\n  typedef uint64 (ByteReader::*AddressReader)(const char*) const;\n\n  // Read an offset from BUFFER and return it as an unsigned 64 bit\n  // integer.  DWARF2/3 define offsets as either 4 or 8 bytes,\n  // generally depending on the amount of DWARF2/3 info present.\n  // This function pointer gets set by SetOffsetSize.\n  AddressReader offset_reader_;\n\n  // Read an address from BUFFER and return it as an unsigned 64 bit\n  // integer.  DWARF2/3 allow addresses to be any size from 0-255\n  // bytes currently.  Internally we support 4 and 8 byte addresses,\n  // and will CHECK on anything else.\n  // This function pointer gets set by SetAddressSize.\n  AddressReader address_reader_;\n\n  Endianness endian_;\n  uint8 address_size_;\n  uint8 offset_size_;\n\n  // Base addresses for Linux C++ exception handling data's encoded pointers.\n  bool have_section_base_, have_text_base_, have_data_base_;\n  bool have_function_base_;\n  uint64 section_base_, text_base_, data_base_, function_base_;\n  const char *buffer_base_;\n};\n\n}  // namespace dwarf2reader\n\n#endif  // COMMON_DWARF_BYTEREADER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/bytereader_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// bytereader_unittest.cc: Unit tests for dwarf2reader::ByteReader\n\n#include <string>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/dwarf/bytereader.h\"\n#include \"common/dwarf/bytereader-inl.h\"\n#include \"common/dwarf/cfi_assembler.h\"\n\nusing dwarf2reader::ByteReader;\nusing dwarf2reader::DwarfPointerEncoding;\nusing dwarf2reader::ENDIANNESS_BIG;\nusing dwarf2reader::ENDIANNESS_LITTLE;\nusing google_breakpad::CFISection;\nusing google_breakpad::test_assembler::Label;\nusing google_breakpad::test_assembler::kBigEndian;\nusing google_breakpad::test_assembler::kLittleEndian;\nusing google_breakpad::test_assembler::Section;\nusing std::string;\nusing testing::Test;\n\nstruct ReaderFixture {\n  string contents;\n  size_t pointer_size;\n};\n\nclass Reader: public ReaderFixture, public Test { };\nclass ReaderDeathTest: public ReaderFixture, public Test { };\n\nTEST_F(Reader, SimpleConstructor) {\n  ByteReader reader(ENDIANNESS_BIG);\n  reader.SetAddressSize(4);\n  CFISection section(kBigEndian, 4);\n  section\n    .D8(0xc0)\n    .D16(0xcf0d)\n    .D32(0x96fdd219)\n    .D64(0xbbf55fef0825f117ULL)\n    .ULEB128(0xa0927048ba8121afULL)\n    .LEB128(-0x4f337badf4483f83LL)\n    .D32(0xfec319c9);\n  ASSERT_TRUE(section.GetContents(&contents));\n  const char *data = contents.data();\n  EXPECT_EQ(0xc0U, reader.ReadOneByte(data));\n  EXPECT_EQ(0xcf0dU, reader.ReadTwoBytes(data + 1));\n  EXPECT_EQ(0x96fdd219U, reader.ReadFourBytes(data + 3));\n  EXPECT_EQ(0xbbf55fef0825f117ULL, reader.ReadEightBytes(data + 7));\n  size_t leb128_size;\n  EXPECT_EQ(0xa0927048ba8121afULL,\n            reader.ReadUnsignedLEB128(data + 15, &leb128_size));\n  EXPECT_EQ(10U, leb128_size);\n  EXPECT_EQ(-0x4f337badf4483f83LL,\n            reader.ReadSignedLEB128(data + 25, &leb128_size));\n  EXPECT_EQ(10U, leb128_size);\n  EXPECT_EQ(0xfec319c9, reader.ReadAddress(data + 35));\n}\n\nTEST_F(Reader, ValidEncodings) {\n  ByteReader reader(ENDIANNESS_LITTLE);\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_omit)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_aligned)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_absptr |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_uleb128 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_udata2 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_udata4 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_udata8 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sleb128 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sdata2 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sdata4 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sdata8 |\n                           dwarf2reader::DW_EH_PE_pcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_absptr |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_uleb128 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_udata2 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_udata4 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_udata8 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sleb128 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sdata2 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sdata4 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sdata8 |\n                           dwarf2reader::DW_EH_PE_textrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_absptr |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_uleb128 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_udata2 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_udata4 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_udata8 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sleb128 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sdata2 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sdata4 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sdata8 |\n                           dwarf2reader::DW_EH_PE_datarel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_absptr |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_uleb128 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_udata2 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_udata4 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_udata8 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sleb128 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sdata2 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sdata4 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n  EXPECT_TRUE(reader.ValidEncoding(\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |\n                           dwarf2reader::DW_EH_PE_sdata8 |\n                           dwarf2reader::DW_EH_PE_funcrel)));\n\n  EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x05)));\n  EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x07)));\n  EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x0d)));\n  EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x0f)));\n  EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x51)));\n  EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x60)));\n  EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x70)));\n  EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0xf0)));\n  EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0xd0)));\n}\n\nTEST_F(ReaderDeathTest, DW_EH_PE_omit) {\n  static const char data[1] = { 42 };\n  ByteReader reader(ENDIANNESS_BIG);\n  reader.SetAddressSize(4);\n  EXPECT_DEATH(reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_omit,\n                                         &pointer_size),\n               \"encoding != DW_EH_PE_omit\");\n}\n\nTEST_F(Reader, DW_EH_PE_absptr4) {\n  static const char data[] = { 0x27, 0x57, 0xea, 0x40 };\n  ByteReader reader(ENDIANNESS_LITTLE);\n  reader.SetAddressSize(4);\n  EXPECT_EQ(0x40ea5727U,\n            reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_absptr,\n                                      &pointer_size));\n  EXPECT_EQ(4U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_absptr8) {\n  static const char data[] = {\n    0x60, 0x27, 0x57, 0xea, 0x40, 0xc2, 0x98, 0x05, 0x01, 0x50\n  };\n  ByteReader reader(ENDIANNESS_LITTLE);\n  reader.SetAddressSize(8);\n  EXPECT_EQ(0x010598c240ea5727ULL,\n            reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_absptr,\n                                      &pointer_size));\n  EXPECT_EQ(8U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_uleb128) {\n  static const char data[] = { 0x81, 0x84, 0x4c };\n  ByteReader reader(ENDIANNESS_LITTLE);\n  reader.SetAddressSize(4);\n  EXPECT_EQ(0x130201U,\n            reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_uleb128,\n                                      &pointer_size));\n  EXPECT_EQ(3U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_udata2) {\n  static const char data[] = { 0xf4, 0x8d };\n  ByteReader reader(ENDIANNESS_BIG);\n  reader.SetAddressSize(4);\n  EXPECT_EQ(0xf48dU,\n            reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_udata2,\n                                      &pointer_size));\n  EXPECT_EQ(2U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_udata4) {\n  static const char data[] = { 0xb2, 0x68, 0xa5, 0x62, 0x8f, 0x8b };\n  ByteReader reader(ENDIANNESS_BIG);\n  reader.SetAddressSize(8);\n  EXPECT_EQ(0xa5628f8b,\n            reader.ReadEncodedPointer(data + 2, dwarf2reader::DW_EH_PE_udata4,\n                                      &pointer_size));\n  EXPECT_EQ(4U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_udata8Addr8) {\n  static const char data[] = {\n    0x27, 0x04, 0x73, 0x04, 0x69, 0x9f, 0x19, 0xed, 0x8f, 0xfe\n  };\n  ByteReader reader(ENDIANNESS_LITTLE);\n  reader.SetAddressSize(8);\n  EXPECT_EQ(0x8fed199f69047304ULL,\n            reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_udata8,\n                                        &pointer_size));\n  EXPECT_EQ(8U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_udata8Addr4) {\n  static const char data[] = {\n    0x27, 0x04, 0x73, 0x04, 0x69, 0x9f, 0x19, 0xed, 0x8f, 0xfe\n  };\n  ByteReader reader(ENDIANNESS_LITTLE);\n  reader.SetAddressSize(4);\n  EXPECT_EQ(0x69047304ULL,\n            reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_udata8,\n                                        &pointer_size));\n  EXPECT_EQ(8U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_sleb128) {\n  static const char data[] = { 0x42, 0xff, 0xfb, 0x73 };\n  ByteReader reader(ENDIANNESS_BIG);\n  reader.SetAddressSize(4);\n  EXPECT_EQ(-0x030201U & 0xffffffff,\n            reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_sleb128,\n                                        &pointer_size));\n  EXPECT_EQ(3U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_sdata2) {\n  static const char data[] = { 0xb9, 0xbf };\n  ByteReader reader(ENDIANNESS_LITTLE);\n  reader.SetAddressSize(8);\n  EXPECT_EQ(0xffffffffffffbfb9ULL,\n            reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_sdata2,\n                                        &pointer_size));\n  EXPECT_EQ(2U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_sdata4) {\n  static const char data[] = { 0xa0, 0xca, 0xf2, 0xb8, 0xc2, 0xad };\n  ByteReader reader(ENDIANNESS_LITTLE);\n  reader.SetAddressSize(8);\n  EXPECT_EQ(0xffffffffadc2b8f2ULL,\n            reader.ReadEncodedPointer(data + 2, dwarf2reader::DW_EH_PE_sdata4,\n                                        &pointer_size));\n  EXPECT_EQ(4U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_sdata8) {\n  static const char data[] = {\n    0xf6, 0x66, 0x57, 0x79, 0xe0, 0x0c, 0x9b, 0x26, 0x87\n  };\n  ByteReader reader(ENDIANNESS_LITTLE);\n  reader.SetAddressSize(8);\n  EXPECT_EQ(0x87269b0ce0795766ULL,\n            reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_sdata8,\n                                        &pointer_size));\n  EXPECT_EQ(8U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_pcrel) {\n  static const char data[] = { 0x4a, 0x8b, 0x1b, 0x14, 0xc8, 0xc4, 0x02, 0xce };\n  ByteReader reader(ENDIANNESS_BIG);\n  reader.SetAddressSize(4);\n  DwarfPointerEncoding encoding =\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_pcrel\n                           | dwarf2reader::DW_EH_PE_absptr);\n  reader.SetCFIDataBase(0x89951377, data);\n  EXPECT_EQ(0x89951377 + 3 + 0x14c8c402,\n            reader.ReadEncodedPointer(data + 3, encoding, &pointer_size));\n  EXPECT_EQ(4U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_textrel) {\n  static const char data[] = { 0xd9, 0x0d, 0x05, 0x17, 0xc9, 0x7a, 0x42, 0x1e };\n  ByteReader reader(ENDIANNESS_LITTLE);\n  reader.SetAddressSize(4);\n  reader.SetTextBase(0xb91beaf0);\n  DwarfPointerEncoding encoding =\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_textrel\n                           | dwarf2reader::DW_EH_PE_sdata2);\n  EXPECT_EQ((0xb91beaf0 + 0xffffc917) & 0xffffffff,\n            reader.ReadEncodedPointer(data + 3, encoding, &pointer_size));\n  EXPECT_EQ(2U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_datarel) {\n  static const char data[] = { 0x16, 0xf2, 0xbb, 0x82, 0x68, 0xa7, 0xbc, 0x39 };\n  ByteReader reader(ENDIANNESS_BIG);\n  reader.SetAddressSize(8);\n  reader.SetDataBase(0xbef308bd25ce74f0ULL);\n  DwarfPointerEncoding encoding =\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_datarel\n                           | dwarf2reader::DW_EH_PE_sleb128);\n  EXPECT_EQ(0xbef308bd25ce74f0ULL + 0xfffffffffffa013bULL,\n            reader.ReadEncodedPointer(data + 2, encoding, &pointer_size));\n  EXPECT_EQ(3U, pointer_size);\n}\n\nTEST_F(Reader, DW_EH_PE_funcrel) {\n  static const char data[] = { 0x84, 0xf8, 0x14, 0x01, 0x61, 0xd1, 0x48, 0xc9 };\n  ByteReader reader(ENDIANNESS_BIG);\n  reader.SetAddressSize(4);\n  reader.SetFunctionBase(0x823c3520);\n  DwarfPointerEncoding encoding =\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_funcrel\n                           | dwarf2reader::DW_EH_PE_udata2);\n  EXPECT_EQ(0x823c3520 + 0xd148,\n            reader.ReadEncodedPointer(data + 5, encoding, &pointer_size));\n  EXPECT_EQ(2U, pointer_size);\n}\n\nTEST(UsableBase, CFI) {\n  static const char data[1] = { 0x42 };\n  ByteReader reader(ENDIANNESS_BIG);\n  reader.SetCFIDataBase(0xb31cbd20, data);\n  EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));\n  EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));\n  EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));\n}\n\nTEST(UsableBase, Text) {\n  ByteReader reader(ENDIANNESS_BIG);\n  reader.SetTextBase(0xa899ccb9);\n  EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));\n  EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));\n  EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));\n}\n\nTEST(UsableBase, Data) {\n  ByteReader reader(ENDIANNESS_BIG);\n  reader.SetDataBase(0xf7b10bcd);\n  EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));\n  EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));\n  EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));\n}\n\nTEST(UsableBase, Function) {\n  ByteReader reader(ENDIANNESS_BIG);\n  reader.SetFunctionBase(0xc2c0ed81);\n  EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));\n  EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));\n  EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));\n}\n\nTEST(UsableBase, ClearFunction) {\n  ByteReader reader(ENDIANNESS_BIG);\n  reader.SetFunctionBase(0xc2c0ed81);\n  reader.ClearFunctionBase();\n  EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));\n  EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));\n  EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));\n}\n\nstruct AlignedFixture {\n  AlignedFixture() : reader(ENDIANNESS_BIG) { reader.SetAddressSize(4); }\n  static const char data[10];\n  ByteReader reader;\n  size_t pointer_size;\n};\n  \nconst char AlignedFixture::data[10] = {\n  0xfe, 0x6e, 0x93, 0xd8, 0x34, 0xd5, 0x1c, 0xd3, 0xac, 0x2b\n};\n\nclass Aligned: public AlignedFixture, public Test { };\n\nTEST_F(Aligned, DW_EH_PE_aligned0) {\n  reader.SetCFIDataBase(0xb440305c, data);\n  EXPECT_EQ(0xfe6e93d8U,\n            reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned,\n                                      &pointer_size));\n  EXPECT_EQ(4U, pointer_size);\n}\n\nTEST_F(Aligned, DW_EH_PE_aligned1) {\n  reader.SetCFIDataBase(0xb440305d, data);\n  EXPECT_EQ(0xd834d51cU,\n            reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned,\n                                      &pointer_size));\n  EXPECT_EQ(7U, pointer_size);\n}\n\nTEST_F(Aligned, DW_EH_PE_aligned2) {\n  reader.SetCFIDataBase(0xb440305e, data);\n  EXPECT_EQ(0x93d834d5U,\n            reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned,\n                                      &pointer_size));\n  EXPECT_EQ(6U, pointer_size);\n}\n\nTEST_F(Aligned, DW_EH_PE_aligned3) {\n  reader.SetCFIDataBase(0xb440305f, data);\n  EXPECT_EQ(0x6e93d834U,\n            reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned,\n                                      &pointer_size));\n  EXPECT_EQ(5U, pointer_size);\n}\n\nTEST_F(Aligned, DW_EH_PE_aligned11) {\n  reader.SetCFIDataBase(0xb4403061, data);\n  EXPECT_EQ(0xd834d51cU,\n            reader.ReadEncodedPointer(data + 1,\n                                      dwarf2reader::DW_EH_PE_aligned,\n                                      &pointer_size));\n  EXPECT_EQ(6U, pointer_size);\n}\n\nTEST_F(Aligned, DW_EH_PE_aligned30) {\n  reader.SetCFIDataBase(0xb4403063, data);\n  EXPECT_EQ(0x6e93d834U,\n            reader.ReadEncodedPointer(data + 1,\n                                      dwarf2reader::DW_EH_PE_aligned,\n                                      &pointer_size));\n  EXPECT_EQ(4U, pointer_size);\n}\n\nTEST_F(Aligned, DW_EH_PE_aligned23) {\n  reader.SetCFIDataBase(0xb4403062, data);\n  EXPECT_EQ(0x1cd3ac2bU,\n            reader.ReadEncodedPointer(data + 3,\n                                      dwarf2reader::DW_EH_PE_aligned,\n                                      &pointer_size));\n  EXPECT_EQ(7U, pointer_size);\n}\n\nTEST_F(Aligned, DW_EH_PE_aligned03) {\n  reader.SetCFIDataBase(0xb4403064, data);\n  EXPECT_EQ(0x34d51cd3U,\n            reader.ReadEncodedPointer(data + 3,\n                                      dwarf2reader::DW_EH_PE_aligned,\n                                      &pointer_size));\n  EXPECT_EQ(5U, pointer_size);\n}  \n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/cfi_assembler.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// cfi_assembler.cc: Implementation of google_breakpad::CFISection class.\n// See cfi_assembler.h for details.\n\n#include \"common/dwarf/cfi_assembler.h\"\n\n#include <assert.h>\n#include <stdlib.h>\n\nnamespace google_breakpad {\n\nusing dwarf2reader::DwarfPointerEncoding;\n  \nCFISection &CFISection::CIEHeader(u_int64_t code_alignment_factor,\n                                  int data_alignment_factor,\n                                  unsigned return_address_register,\n                                  u_int8_t version,\n                                  const string &augmentation,\n                                  bool dwarf64) {\n  assert(!entry_length_);\n  entry_length_ = new PendingLength();\n  in_fde_ = false;\n\n  if (dwarf64) {\n    D32(kDwarf64InitialLengthMarker);\n    D64(entry_length_->length);\n    entry_length_->start = Here();\n    D64(eh_frame_ ? kEHFrame64CIEIdentifier : kDwarf64CIEIdentifier);\n  } else {\n    D32(entry_length_->length);\n    entry_length_->start = Here();\n    D32(eh_frame_ ? kEHFrame32CIEIdentifier : kDwarf32CIEIdentifier);\n  }\n  D8(version);\n  AppendCString(augmentation);\n  ULEB128(code_alignment_factor);\n  LEB128(data_alignment_factor);\n  if (version == 1)\n    D8(return_address_register);\n  else\n    ULEB128(return_address_register);\n  return *this;\n}\n\nCFISection &CFISection::FDEHeader(Label cie_pointer,\n                                  u_int64_t initial_location,\n                                  u_int64_t address_range,\n                                  bool dwarf64) {\n  assert(!entry_length_);\n  entry_length_ = new PendingLength();\n  in_fde_ = true;\n  fde_start_address_ = initial_location;\n\n  if (dwarf64) {\n    D32(0xffffffff);\n    D64(entry_length_->length);\n    entry_length_->start = Here();\n    if (eh_frame_)\n      D64(Here() - cie_pointer);\n    else\n      D64(cie_pointer);\n  } else {\n    D32(entry_length_->length);\n    entry_length_->start = Here();\n    if (eh_frame_)\n      D32(Here() - cie_pointer);\n    else\n      D32(cie_pointer);\n  }\n  EncodedPointer(initial_location);\n  // The FDE length in an .eh_frame section uses the same encoding as the\n  // initial location, but ignores the base address (selected by the upper\n  // nybble of the encoding), as it's a length, not an address that can be\n  // made relative.\n  EncodedPointer(address_range,\n                 DwarfPointerEncoding(pointer_encoding_ & 0x0f));\n  return *this;\n}\n\nCFISection &CFISection::FinishEntry() {\n  assert(entry_length_);\n  Align(address_size_, dwarf2reader::DW_CFA_nop);\n  entry_length_->length = Here() - entry_length_->start;\n  delete entry_length_;\n  entry_length_ = NULL;\n  in_fde_ = false;\n  return *this;\n}\n\nCFISection &CFISection::EncodedPointer(u_int64_t address,\n                                       DwarfPointerEncoding encoding,\n                                       const EncodedPointerBases &bases) {\n  // Omitted data is extremely easy to emit.\n  if (encoding == dwarf2reader::DW_EH_PE_omit)\n    return *this;\n\n  // If (encoding & dwarf2reader::DW_EH_PE_indirect) != 0, then we assume\n  // that ADDRESS is the address at which the pointer is stored --- in\n  // other words, that bit has no effect on how we write the pointer.\n  encoding = DwarfPointerEncoding(encoding & ~dwarf2reader::DW_EH_PE_indirect);\n\n  // Find the base address to which this pointer is relative. The upper\n  // nybble of the encoding specifies this.\n  u_int64_t base;\n  switch (encoding & 0xf0) {\n    case dwarf2reader::DW_EH_PE_absptr:  base = 0;                  break;\n    case dwarf2reader::DW_EH_PE_pcrel:   base = bases.cfi + Size(); break;\n    case dwarf2reader::DW_EH_PE_textrel: base = bases.text;         break;\n    case dwarf2reader::DW_EH_PE_datarel: base = bases.data;         break;\n    case dwarf2reader::DW_EH_PE_funcrel: base = fde_start_address_; break;\n    case dwarf2reader::DW_EH_PE_aligned: base = 0;                  break;\n    default: abort();\n  };\n\n  // Make ADDRESS relative. Yes, this is appropriate even for \"absptr\"\n  // values; see gcc/unwind-pe.h.\n  address -= base;\n\n  // Align the pointer, if required.\n  if ((encoding & 0xf0) == dwarf2reader::DW_EH_PE_aligned)\n    Align(AddressSize());\n\n  // Append ADDRESS to this section in the appropriate form. For the\n  // fixed-width forms, we don't need to differentiate between signed and\n  // unsigned encodings, because ADDRESS has already been extended to 64\n  // bits before it was passed to us.\n  switch (encoding & 0x0f) {\n    case dwarf2reader::DW_EH_PE_absptr:\n      Address(address);\n      break;\n\n    case dwarf2reader::DW_EH_PE_uleb128:\n      ULEB128(address);\n      break;\n\n    case dwarf2reader::DW_EH_PE_sleb128:\n      LEB128(address);\n      break;\n\n    case dwarf2reader::DW_EH_PE_udata2:\n    case dwarf2reader::DW_EH_PE_sdata2:\n      D16(address);\n      break;\n\n    case dwarf2reader::DW_EH_PE_udata4:\n    case dwarf2reader::DW_EH_PE_sdata4:\n      D32(address);\n      break;\n\n    case dwarf2reader::DW_EH_PE_udata8:\n    case dwarf2reader::DW_EH_PE_sdata8:\n      D64(address);\n      break;\n\n    default:\n      abort();\n  }\n\n  return *this;\n};\n\nconst u_int32_t CFISection::kDwarf64InitialLengthMarker;\nconst u_int32_t CFISection::kDwarf32CIEIdentifier;\nconst u_int64_t CFISection::kDwarf64CIEIdentifier;\nconst u_int32_t CFISection::kEHFrame32CIEIdentifier;\nconst u_int64_t CFISection::kEHFrame64CIEIdentifier;\n\n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/cfi_assembler.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// cfi_assembler.h: Define CFISection, a class for creating properly\n// (and improperly) formatted DWARF CFI data for unit tests.\n\n#ifndef PROCESSOR_CFI_ASSEMBLER_H_\n#define PROCESSOR_CFI_ASSEMBLER_H_\n\n#include <string>\n\n#include \"common/dwarf/dwarf2enums.h\"\n#include \"common/test_assembler.h\"\n#include \"google_breakpad/common/breakpad_types.h\"\n\nnamespace google_breakpad {\n\nusing dwarf2reader::DwarfPointerEncoding;\nusing google_breakpad::test_assembler::Endianness;\nusing google_breakpad::test_assembler::Label;\nusing google_breakpad::test_assembler::Section;\nusing std::string;\n\nclass CFISection: public Section {\n public:\n\n  // CFI augmentation strings beginning with 'z', defined by the\n  // Linux/IA-64 C++ ABI, can specify interesting encodings for\n  // addresses appearing in FDE headers and call frame instructions (and\n  // for additional fields whose presence the augmentation string\n  // specifies). In particular, pointers can be specified to be relative\n  // to various base address: the start of the .text section, the\n  // location holding the address itself, and so on. These allow the\n  // frame data to be position-independent even when they live in\n  // write-protected pages. These variants are specified at the\n  // following two URLs:\n  //\n  // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/dwarfext.html\n  // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/ehframechpt.html\n  //\n  // CFISection leaves the production of well-formed 'z'-augmented CIEs and\n  // FDEs to the user, but does provide EncodedPointer, to emit\n  // properly-encoded addresses for a given pointer encoding.\n  // EncodedPointer uses an instance of this structure to find the base\n  // addresses it should use; you can establish a default for all encoded\n  // pointers appended to this section with SetEncodedPointerBases.\n  struct EncodedPointerBases {\n    EncodedPointerBases() : cfi(), text(), data() { }\n\n    // The starting address of this CFI section in memory, for\n    // DW_EH_PE_pcrel. DW_EH_PE_pcrel pointers may only be used in data\n    // that has is loaded into the program's address space.\n    u_int64_t cfi;\n\n    // The starting address of this file's .text section, for DW_EH_PE_textrel.\n    u_int64_t text;\n\n    // The starting address of this file's .got or .eh_frame_hdr section,\n    // for DW_EH_PE_datarel.\n    u_int64_t data;\n  };\n\n  // Create a CFISection whose endianness is ENDIANNESS, and where\n  // machine addresses are ADDRESS_SIZE bytes long. If EH_FRAME is\n  // true, use the .eh_frame format, as described by the Linux\n  // Standards Base Core Specification, instead of the DWARF CFI\n  // format.\n  CFISection(Endianness endianness, size_t address_size,\n             bool eh_frame = false)\n      : Section(endianness), address_size_(address_size), eh_frame_(eh_frame),\n        pointer_encoding_(dwarf2reader::DW_EH_PE_absptr),\n        encoded_pointer_bases_(), entry_length_(NULL), in_fde_(false) {\n    // The 'start', 'Here', and 'Mark' members of a CFISection all refer\n    // to section offsets.\n    start() = 0;\n  }\n\n  // Return this CFISection's address size.\n  size_t AddressSize() const { return address_size_; }\n\n  // Return true if this CFISection uses the .eh_frame format, or\n  // false if it contains ordinary DWARF CFI data.\n  bool ContainsEHFrame() const { return eh_frame_; }\n\n  // Use ENCODING for pointers in calls to FDEHeader and EncodedPointer.\n  void SetPointerEncoding(DwarfPointerEncoding encoding) {\n    pointer_encoding_ = encoding;\n  }\n\n  // Use the addresses in BASES as the base addresses for encoded\n  // pointers in subsequent calls to FDEHeader or EncodedPointer.\n  // This function makes a copy of BASES.\n  void SetEncodedPointerBases(const EncodedPointerBases &bases) {\n    encoded_pointer_bases_ = bases;\n  }\n\n  // Append a Common Information Entry header to this section with the\n  // given values. If dwarf64 is true, use the 64-bit DWARF initial\n  // length format for the CIE's initial length. Return a reference to\n  // this section. You should call FinishEntry after writing the last\n  // instruction for the CIE.\n  //\n  // Before calling this function, you will typically want to use Mark\n  // or Here to make a label to pass to FDEHeader that refers to this\n  // CIE's position in the section.\n  CFISection &CIEHeader(u_int64_t code_alignment_factor,\n                        int data_alignment_factor,\n                        unsigned return_address_register,\n                        u_int8_t version = 3,\n                        const string &augmentation = \"\",\n                        bool dwarf64 = false);\n\n  // Append a Frame Description Entry header to this section with the\n  // given values. If dwarf64 is true, use the 64-bit DWARF initial\n  // length format for the CIE's initial length. Return a reference to\n  // this section. You should call FinishEntry after writing the last\n  // instruction for the CIE.\n  //\n  // This function doesn't support entries that are longer than\n  // 0xffffff00 bytes. (The \"initial length\" is always a 32-bit\n  // value.) Nor does it support .debug_frame sections longer than\n  // 0xffffff00 bytes.\n  CFISection &FDEHeader(Label cie_pointer,\n                        u_int64_t initial_location,\n                        u_int64_t address_range,\n                        bool dwarf64 = false);\n\n  // Note the current position as the end of the last CIE or FDE we\n  // started, after padding with DW_CFA_nops for alignment. This\n  // defines the label representing the entry's length, cited in the\n  // entry's header. Return a reference to this section.\n  CFISection &FinishEntry();\n\n  // Append the contents of BLOCK as a DW_FORM_block value: an\n  // unsigned LEB128 length, followed by that many bytes of data.\n  CFISection &Block(const string &block) {\n    ULEB128(block.size());\n    Append(block);\n    return *this;\n  }\n\n  // Append ADDRESS to this section, in the appropriate size and\n  // endianness. Return a reference to this section.\n  CFISection &Address(u_int64_t address) {\n    Section::Append(endianness(), address_size_, address);\n    return *this;\n  }\n  CFISection &Address(Label address) {\n    Section::Append(endianness(), address_size_, address);\n    return *this;\n  }\n\n  // Append ADDRESS to this section, using ENCODING and BASES. ENCODING\n  // defaults to this section's default encoding, established by\n  // SetPointerEncoding. BASES defaults to this section's bases, set by\n  // SetEncodedPointerBases. If the DW_EH_PE_indirect bit is set in the\n  // encoding, assume that ADDRESS is where the true address is stored.\n  // Return a reference to this section.\n  // \n  // (C++ doesn't let me use default arguments here, because I want to\n  // refer to members of *this in the default argument expression.)\n  CFISection &EncodedPointer(u_int64_t address) {\n    return EncodedPointer(address, pointer_encoding_, encoded_pointer_bases_);\n  }\n  CFISection &EncodedPointer(u_int64_t address, DwarfPointerEncoding encoding) {\n    return EncodedPointer(address, encoding, encoded_pointer_bases_);\n  }\n  CFISection &EncodedPointer(u_int64_t address, DwarfPointerEncoding encoding,\n                             const EncodedPointerBases &bases);\n\n  // Restate some member functions, to keep chaining working nicely.\n  CFISection &Mark(Label *label)   { Section::Mark(label); return *this; }\n  CFISection &D8(u_int8_t v)       { Section::D8(v);       return *this; }\n  CFISection &D16(u_int16_t v)     { Section::D16(v);      return *this; }\n  CFISection &D16(Label v)         { Section::D16(v);      return *this; }\n  CFISection &D32(u_int32_t v)     { Section::D32(v);      return *this; }\n  CFISection &D32(const Label &v)  { Section::D32(v);      return *this; }\n  CFISection &D64(u_int64_t v)     { Section::D64(v);      return *this; }\n  CFISection &D64(const Label &v)  { Section::D64(v);      return *this; }\n  CFISection &LEB128(long long v)  { Section::LEB128(v);   return *this; }\n  CFISection &ULEB128(u_int64_t v) { Section::ULEB128(v);  return *this; }\n\n private:\n  // A length value that we've appended to the section, but is not yet\n  // known. LENGTH is the appended value; START is a label referring\n  // to the start of the data whose length was cited.\n  struct PendingLength {\n    Label length;\n    Label start;\n  };\n\n  // Constants used in CFI/.eh_frame data:\n\n  // If the first four bytes of an \"initial length\" are this constant, then\n  // the data uses the 64-bit DWARF format, and the length itself is the\n  // subsequent eight bytes.\n  static const u_int32_t kDwarf64InitialLengthMarker = 0xffffffffU;\n\n  // The CIE identifier for 32- and 64-bit DWARF CFI and .eh_frame data.\n  static const u_int32_t kDwarf32CIEIdentifier = ~(u_int32_t)0;\n  static const u_int64_t kDwarf64CIEIdentifier = ~(u_int64_t)0;\n  static const u_int32_t kEHFrame32CIEIdentifier = 0;\n  static const u_int64_t kEHFrame64CIEIdentifier = 0;\n\n  // The size of a machine address for the data in this section.\n  size_t address_size_;\n\n  // If true, we are generating a Linux .eh_frame section, instead of\n  // a standard DWARF .debug_frame section.\n  bool eh_frame_;\n\n  // The encoding to use for FDE pointers.\n  DwarfPointerEncoding pointer_encoding_;\n\n  // The base addresses to use when emitting encoded pointers.\n  EncodedPointerBases encoded_pointer_bases_;\n\n  // The length value for the current entry.\n  //\n  // Oddly, this must be dynamically allocated. Labels never get new\n  // values; they only acquire constraints on the value they already\n  // have, or assert if you assign them something incompatible. So\n  // each header needs truly fresh Label objects to cite in their\n  // headers and track their positions. The alternative is explicit\n  // destructor invocation and a placement new. Ick.\n  PendingLength *entry_length_;\n\n  // True if we are currently emitting an FDE --- that is, we have\n  // called FDEHeader but have not yet called FinishEntry.\n  bool in_fde_;\n\n  // If in_fde_ is true, this is its starting address. We use this for\n  // emitting DW_EH_PE_funcrel pointers.\n  u_int64_t fde_start_address_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_CFI_ASSEMBLER_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/dwarf2diehandler.cc",
    "content": "// Copyright (c) 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dwarf2diehandler.cc: Implement the dwarf2reader::DieDispatcher class.\n// See dwarf2diehandler.h for details.\n\n#include \"common/dwarf/dwarf2diehandler.h\"\n\n#include <assert.h>\n\nnamespace dwarf2reader {\n\nDIEDispatcher::~DIEDispatcher() {\n  while (!die_handlers_.empty()) {\n    HandlerStack &entry = die_handlers_.top();\n    if (entry.handler_ != root_handler_)\n      delete entry.handler_;\n    die_handlers_.pop();\n  }\n}\n\nbool DIEDispatcher::StartCompilationUnit(uint64 offset, uint8 address_size,\n                                         uint8 offset_size, uint64 cu_length,\n                                         uint8 dwarf_version) {\n  return root_handler_->StartCompilationUnit(offset, address_size,\n                                             offset_size, cu_length,\n                                             dwarf_version);\n}\n\nbool DIEDispatcher::StartDIE(uint64 offset, enum DwarfTag tag,\n                             const AttributeList& attrs) {\n  // The stack entry for the parent of this DIE, if there is one.\n  HandlerStack *parent = die_handlers_.empty() ? NULL : &die_handlers_.top();\n\n  // Does this call indicate that we're done receiving the parent's\n  // attributes' values?  If so, call its EndAttributes member function.\n  if (parent && parent->handler_ && !parent->reported_attributes_end_) {\n    parent->reported_attributes_end_ = true;\n    if (!parent->handler_->EndAttributes()) {\n      // Finish off this handler now. and edit *PARENT to indicate that\n      // we don't want to visit any of the children.\n      parent->handler_->Finish();\n      if (parent->handler_ != root_handler_)\n        delete parent->handler_;\n      parent->handler_ = NULL;\n      return false;\n    }\n  }\n\n  // Find a handler for this DIE.\n  DIEHandler *handler;\n  if (parent) {\n    if (parent->handler_)\n      // Ask the parent to find a handler.\n      handler = parent->handler_->FindChildHandler(offset, tag, attrs);\n    else\n      // No parent handler means we're not interested in any of our\n      // children.\n      handler = NULL;\n  } else {\n    // This is the root DIE.  For a non-root DIE, the parent's handler\n    // decides whether to visit it, but the root DIE has no parent\n    // handler, so we have a special method on the root DIE handler\n    // itself to decide.\n    if (root_handler_->StartRootDIE(offset, tag, attrs))\n      handler = root_handler_;\n    else\n      handler = NULL;\n  }\n\n  // Push a handler stack entry for this new handler. As an\n  // optimization, we don't push NULL-handler entries on top of other\n  // NULL-handler entries; we just let the oldest such entry stand for\n  // the whole subtree.\n  if (handler || !parent || parent->handler_) {\n    HandlerStack entry;\n    entry.offset_ = offset;\n    entry.handler_ = handler;\n    entry.reported_attributes_end_ = false;\n    die_handlers_.push(entry);\n  }\n\n  return handler != NULL;\n}\n\nvoid DIEDispatcher::EndDIE(uint64 offset) {\n  assert(!die_handlers_.empty());\n  HandlerStack *entry = &die_handlers_.top();\n  if (entry->handler_) {\n    // This entry had better be the handler for this DIE.\n    assert(entry->offset_ == offset);\n    // If a DIE has no children, this EndDIE call indicates that we're\n    // done receiving its attributes' values.\n    if (!entry->reported_attributes_end_)\n      entry->handler_->EndAttributes(); // Ignore return value: no children.\n    entry->handler_->Finish();\n    if (entry->handler_ != root_handler_)\n      delete entry->handler_;\n  } else {\n    // If this DIE is within a tree we're ignoring, then don't pop the\n    // handler stack: that entry stands for the whole tree.\n    if (entry->offset_ != offset)\n      return;\n  }\n  die_handlers_.pop();\n}\n\nvoid DIEDispatcher::ProcessAttributeUnsigned(uint64 offset,\n                                             enum DwarfAttribute attr,\n                                             enum DwarfForm form,\n                                             uint64 data) {\n  HandlerStack &current = die_handlers_.top();\n  // This had better be an attribute of the DIE we were meant to handle.\n  assert(offset == current.offset_);\n  current.handler_->ProcessAttributeUnsigned(attr, form, data);\n}\n\nvoid DIEDispatcher::ProcessAttributeSigned(uint64 offset,\n                                           enum DwarfAttribute attr,\n                                           enum DwarfForm form,\n                                           int64 data) {\n  HandlerStack &current = die_handlers_.top();\n  // This had better be an attribute of the DIE we were meant to handle.\n  assert(offset == current.offset_);\n  current.handler_->ProcessAttributeSigned(attr, form, data);\n}\n\nvoid DIEDispatcher::ProcessAttributeReference(uint64 offset,\n                                              enum DwarfAttribute attr,\n                                              enum DwarfForm form,\n                                              uint64 data) {\n  HandlerStack &current = die_handlers_.top();\n  // This had better be an attribute of the DIE we were meant to handle.\n  assert(offset == current.offset_);\n  current.handler_->ProcessAttributeReference(attr, form, data);\n}\n\nvoid DIEDispatcher::ProcessAttributeBuffer(uint64 offset,\n                                           enum DwarfAttribute attr,\n                                           enum DwarfForm form,\n                                           const char* data,\n                                           uint64 len) {\n  HandlerStack &current = die_handlers_.top();\n  // This had better be an attribute of the DIE we were meant to handle.\n  assert(offset == current.offset_);\n  current.handler_->ProcessAttributeBuffer(attr, form, data, len);\n}\n\nvoid DIEDispatcher::ProcessAttributeString(uint64 offset,\n                                           enum DwarfAttribute attr,\n                                           enum DwarfForm form,\n                                           const std::string& data) {\n  HandlerStack &current = die_handlers_.top();\n  // This had better be an attribute of the DIE we were meant to handle.\n  assert(offset == current.offset_);\n  current.handler_->ProcessAttributeString(attr, form, data);\n}\n\nvoid DIEDispatcher::ProcessAttributeSignature(uint64 offset,\n                                              enum DwarfAttribute attr,\n                                              enum DwarfForm form,\n                                              uint64 signature) {\n  HandlerStack &current = die_handlers_.top();\n  // This had better be an attribute of the DIE we were meant to handle.\n  assert(offset == current.offset_);\n  current.handler_->ProcessAttributeSignature(attr, form, signature);\n}\n\n} // namespace dwarf2reader\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/dwarf2diehandler.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dwarf2reader::CompilationUnit is a simple and direct parser for\n// DWARF data, but its handler interface is not convenient to use.  In\n// particular:\n//\n// - CompilationUnit calls Dwarf2Handler's member functions to report\n//   every attribute's value, regardless of what sort of DIE it is.\n//   As a result, the ProcessAttributeX functions end up looking like\n//   this:\n//\n//     switch (parent_die_tag) {\n//       case DW_TAG_x:\n//         switch (attribute_name) {\n//           case DW_AT_y:\n//             handle attribute y of DIE type x\n//           ...\n//         } break;\n//       ...\n//     } \n//\n//   In C++ it's much nicer to use virtual function dispatch to find\n//   the right code for a given case than to switch on the DIE tag\n//   like this.\n//\n// - Processing different kinds of DIEs requires different sets of\n//   data: lexical block DIEs have start and end addresses, but struct\n//   type DIEs don't.  It would be nice to be able to have separate\n//   handler classes for separate kinds of DIEs, each with the members\n//   appropriate to its role, instead of having one handler class that\n//   needs to hold data for every DIE type.\n//\n// - There should be a separate instance of the appropriate handler\n//   class for each DIE, instead of a single object with tables\n//   tracking all the dies in the compilation unit.\n//\n// - It's not convenient to take some action after all a DIE's\n//   attributes have been seen, but before visiting any of its\n//   children.  The only indication you have that a DIE's attribute\n//   list is complete is that you get either a StartDIE or an EndDIE\n//   call.\n//\n// - It's not convenient to make use of the tree structure of the\n//   DIEs.  Skipping all the children of a given die requires\n//   maintaining state and returning false from StartDIE until we get\n//   an EndDIE call with the appropriate offset.\n//\n// This interface tries to take care of all that.  (You're shocked, I'm sure.)\n//\n// Using the classes here, you provide an initial handler for the root\n// DIE of the compilation unit.  Each handler receives its DIE's\n// attributes, and provides fresh handler objects for children of\n// interest, if any.  The three classes are:\n//\n// - DIEHandler: the base class for your DIE-type-specific handler\n//   classes.\n//\n// - RootDIEHandler: derived from DIEHandler, the base class for your\n//   root DIE handler class.\n//\n// - DIEDispatcher: derived from Dwarf2Handler, an instance of this\n//   invokes your DIE-type-specific handler objects.\n//\n// In detail:\n//\n// - Define handler classes specialized for the DIE types you're\n//   interested in.  These handler classes must inherit from\n//   DIEHandler.  Thus:\n//\n//     class My_DW_TAG_X_Handler: public DIEHandler { ... };\n//     class My_DW_TAG_Y_Handler: public DIEHandler { ... };\n//\n//   DIEHandler subclasses needn't correspond exactly to single DIE\n//   types, as shown here; the point is that you can have several\n//   different classes appropriate to different kinds of DIEs.\n//\n// - In particular, define a handler class for the compilation\n//   unit's root DIE, that inherits from RootDIEHandler:\n//\n//     class My_DW_TAG_compile_unit_Handler: public RootDIEHandler { ... };\n//\n//   RootDIEHandler inherits from DIEHandler, adding a few additional\n//   member functions for examining the compilation unit as a whole,\n//   and other quirks of rootness.\n//\n// - Then, create a DIEDispatcher instance, passing it an instance of\n//   your root DIE handler class, and use that DIEDispatcher as the\n//   dwarf2reader::CompilationUnit's handler:\n//\n//     My_DW_TAG_compile_unit_Handler root_die_handler(...);\n//     DIEDispatcher die_dispatcher(&root_die_handler);\n//     CompilationUnit reader(sections, offset, bytereader, &die_dispatcher);\n//\n//   Here, 'die_dispatcher' acts as a shim between 'reader' and the\n//   various DIE-specific handlers you have defined.\n//\n// - When you call reader.Start(), die_dispatcher behaves as follows,\n//   starting with your root die handler and the compilation unit's\n//   root DIE:\n//\n//   - It calls the handler's ProcessAttributeX member functions for\n//     each of the DIE's attributes.\n//\n//   - It calls the handler's EndAttributes member function.  This\n//     should return true if any of the DIE's children should be\n//     visited, in which case:\n//\n//     - For each of the DIE's children, die_dispatcher calls the\n//       DIE's handler's FindChildHandler member function.  If that\n//       returns a pointer to a DIEHandler instance, then\n//       die_dispatcher uses that handler to process the child, using\n//       this procedure recursively.  Alternatively, if\n//       FindChildHandler returns NULL, die_dispatcher ignores that\n//       child and its descendants.\n// \n//   - When die_dispatcher has finished processing all the DIE's\n//     children, it invokes the handler's Finish() member function,\n//     and destroys the handler.  (As a special case, it doesn't\n//     destroy the root DIE handler.)\n// \n// This allows the code for handling a particular kind of DIE to be\n// gathered together in a single class, makes it easy to skip all the\n// children or individual children of a particular DIE, and provides\n// appropriate parental context for each die.\n\n#ifndef COMMON_DWARF_DWARF2DIEHANDLER_H__\n#define COMMON_DWARF_DWARF2DIEHANDLER_H__\n\n#include <stack>\n\n#include \"common/dwarf/types.h\"\n#include \"common/dwarf/dwarf2enums.h\"\n#include \"common/dwarf/dwarf2reader.h\"\n\nnamespace dwarf2reader {\n\n// A base class for handlers for specific DIE types.  The series of\n// calls made on a DIE handler is as follows:\n//\n// - for each attribute of the DIE:\n//   - ProcessAttributeX()\n// - EndAttributes()\n// - if that returned true, then for each child:\n//   - FindChildHandler()\n//   - if that returns a non-NULL pointer to a new handler:\n//     - recurse, with the new handler and the child die\n// - Finish()\n// - destruction\nclass DIEHandler {\n public:\n  DIEHandler() { }\n  virtual ~DIEHandler() { }\n\n  // When we visit a DIE, we first use these member functions to\n  // report the DIE's attributes and their values.  These have the\n  // same restrictions as the corresponding member functions of\n  // dwarf2reader::Dwarf2Handler.\n  //\n  // Since DWARF does not specify in what order attributes must\n  // appear, avoid making decisions in these functions that would be\n  // affected by the presence of other attributes. The EndAttributes\n  // function is a more appropriate place for such work, as all the\n  // DIE's attributes have been seen at that point.\n  //\n  // The default definitions ignore the values they are passed.\n  virtual void ProcessAttributeUnsigned(enum DwarfAttribute attr,\n                                        enum DwarfForm form,\n                                        uint64 data) { }\n  virtual void ProcessAttributeSigned(enum DwarfAttribute attr,\n                                      enum DwarfForm form,\n                                      int64 data) { }\n  virtual void ProcessAttributeReference(enum DwarfAttribute attr,\n                                         enum DwarfForm form,\n                                         uint64 data) { }\n  virtual void ProcessAttributeBuffer(enum DwarfAttribute attr,\n                                      enum DwarfForm form,\n                                      const char* data,\n                                      uint64 len) { }\n  virtual void ProcessAttributeString(enum DwarfAttribute attr,\n                                      enum DwarfForm form,\n                                      const std::string& data) { }\n  virtual void ProcessAttributeSignature(enum DwarfAttribute attr,\n                                         enum DwarfForm form,\n                                         uint64 signture) { }\n\n  // Once we have reported all the DIE's attributes' values, we call\n  // this member function.  If it returns false, we skip all the DIE's\n  // children.  If it returns true, we call FindChildHandler on each\n  // child.  If that returns a handler object, we use that to visit\n  // the child; otherwise, we skip the child.\n  //\n  // This is a good place to make decisions that depend on more than\n  // one attribute. DWARF does not specify in what order attributes\n  // must appear, so only when the EndAttributes function is called\n  // does the handler have a complete picture of the DIE's attributes.\n  //\n  // The default definition elects to ignore the DIE's children.\n  // You'll need to override this if you override FindChildHandler,\n  // but at least the default behavior isn't to pass the children to\n  // FindChildHandler, which then ignores them all.\n  virtual bool EndAttributes() { return false; }\n\n  // If EndAttributes returns true to indicate that some of the DIE's\n  // children might be of interest, then we apply this function to\n  // each of the DIE's children.  If it returns a handler object, then\n  // we use that to visit the child DIE.  If it returns NULL, we skip\n  // that child DIE (and all its descendants).\n  //\n  // OFFSET is the offset of the child; TAG indicates what kind of DIE\n  // it is; and ATTRS is the list of attributes the DIE will have, and\n  // their forms (their values are not provided).\n  //\n  // The default definition skips all children.\n  virtual DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag,\n                                       const AttributeList &attrs) {\n    return NULL;\n  }\n\n  // When we are done processing a DIE, we call this member function.\n  // This happens after the EndAttributes call, all FindChildHandler\n  // calls (if any), and all operations on the children themselves (if\n  // any). We call Finish on every handler --- even if EndAttributes\n  // returns false.\n  virtual void Finish() { };\n};\n\n// A subclass of DIEHandler, with additional kludges for handling the\n// compilation unit's root die.\nclass RootDIEHandler: public DIEHandler {\n public:\n  RootDIEHandler() { }\n  virtual ~RootDIEHandler() { }\n\n  // We pass the values reported via Dwarf2Handler::StartCompilationUnit\n  // to this member function, and skip the entire compilation unit if it\n  // returns false.  So the root DIE handler is actually also\n  // responsible for handling the compilation unit metadata.\n  // The default definition always visits the compilation unit.\n  virtual bool StartCompilationUnit(uint64 offset, uint8 address_size,\n                                    uint8 offset_size, uint64 cu_length,\n                                    uint8 dwarf_version) { return true; }\n\n  // For the root DIE handler only, we pass the offset, tag and\n  // attributes of the compilation unit's root DIE.  This is the only\n  // way the root DIE handler can find the root DIE's tag.  If this\n  // function returns true, we will visit the root DIE using the usual\n  // DIEHandler methods; otherwise, we skip the entire compilation\n  // unit.\n  //\n  // The default definition elects to visit the root DIE.\n  virtual bool StartRootDIE(uint64 offset, enum DwarfTag tag,\n                            const AttributeList& attrs) { return true; }\n};\n\nclass DIEDispatcher: public Dwarf2Handler {\n public:\n  // Create a Dwarf2Handler which uses ROOT_HANDLER as the handler for\n  // the compilation unit's root die, as described for the DIEHandler\n  // class.\n  DIEDispatcher(RootDIEHandler *root_handler) : root_handler_(root_handler) { }\n  // Destroying a DIEDispatcher destroys all active handler objects\n  // except the root handler.\n  ~DIEDispatcher();\n  bool StartCompilationUnit(uint64 offset, uint8 address_size,\n                            uint8 offset_size, uint64 cu_length,\n                            uint8 dwarf_version);\n  bool StartDIE(uint64 offset, enum DwarfTag tag,\n                const AttributeList &attrs);\n  void ProcessAttributeUnsigned(uint64 offset,\n                                enum DwarfAttribute attr,\n                                enum DwarfForm form,\n                                uint64 data);\n  void ProcessAttributeSigned(uint64 offset,\n                              enum DwarfAttribute attr,\n                              enum DwarfForm form,\n                              int64 data);\n  void ProcessAttributeReference(uint64 offset,\n                                 enum DwarfAttribute attr,\n                                 enum DwarfForm form,\n                                 uint64 data);\n  void ProcessAttributeBuffer(uint64 offset,\n                              enum DwarfAttribute attr,\n                              enum DwarfForm form,\n                              const char* data,\n                              uint64 len);\n  void ProcessAttributeString(uint64 offset,\n                              enum DwarfAttribute attr,\n                              enum DwarfForm form,\n                              const std::string &data);\n  void ProcessAttributeSignature(uint64 offset,\n                                 enum DwarfAttribute attr,\n                                 enum DwarfForm form,\n                                 uint64 signature);\n  void EndDIE(uint64 offset);\n\n private:\n\n  // The type of a handler stack entry.  This includes some fields\n  // which don't really need to be on the stack --- they could just be\n  // single data members of DIEDispatcher --- but putting them here\n  // makes it easier to see that the code is correct.\n  struct HandlerStack {\n    // The offset of the DIE for this handler stack entry.\n    uint64 offset_;\n\n    // The handler object interested in this DIE's attributes and\n    // children.  If NULL, we're not interested in either.\n    DIEHandler *handler_;\n\n    // Have we reported the end of this DIE's attributes to the handler?\n    bool reported_attributes_end_;\n  };\n\n  // Stack of DIE attribute handlers.  At StartDIE(D), the top of the\n  // stack is the handler of D's parent, whom we may ask for a handler\n  // for D itself.  At EndDIE(D), the top of the stack is D's handler.\n  // Special cases:\n  //\n  // - Before we've seen the compilation unit's root DIE, the stack is\n  //   empty; we'll call root_handler_'s special member functions, and\n  //   perhaps push root_handler_ on the stack to look at the root's\n  //   immediate children.\n  //\n  // - When we decide to ignore a subtree, we only push an entry on\n  //   the stack for the root of the tree being ignored, rather than\n  //   pushing lots of stack entries with handler_ set to NULL.\n  std::stack<HandlerStack> die_handlers_;\n\n  // The root handler.  We don't push it on die_handlers_ until we\n  // actually get the StartDIE call for the root.\n  RootDIEHandler *root_handler_;\n};\n\n} // namespace dwarf2reader\n#endif  // COMMON_DWARF_DWARF2DIEHANDLER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/dwarf2diehandler_unittest.cc",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dwarf2diehander_unittest.cc: Unit tests for google_breakpad::DIEDispatcher.\n\n#include <string>\n#include <utility>\n\n#include \"breakpad_googletest_includes.h\"\n\n#include \"common/dwarf/dwarf2diehandler.h\"\n\nusing std::make_pair;\nusing std::string;\n\nusing ::testing::_;\nusing ::testing::ContainerEq;\nusing ::testing::ElementsAreArray;\nusing ::testing::Eq;\nusing ::testing::InSequence;\nusing ::testing::Return;\nusing ::testing::Sequence;\nusing ::testing::StrEq;\n\nusing dwarf2reader::AttributeList;\nusing dwarf2reader::DIEDispatcher;\nusing dwarf2reader::DIEHandler;\nusing dwarf2reader::DwarfAttribute;\nusing dwarf2reader::DwarfForm;\nusing dwarf2reader::DwarfTag;\nusing dwarf2reader::RootDIEHandler;\n\nclass MockDIEHandler: public DIEHandler {\n public:\n  MOCK_METHOD3(ProcessAttributeUnsigned,\n               void(DwarfAttribute, DwarfForm, uint64));\n  MOCK_METHOD3(ProcessAttributeSigned,\n               void(DwarfAttribute, DwarfForm, int64));\n  MOCK_METHOD3(ProcessAttributeReference,\n               void(DwarfAttribute, DwarfForm, uint64));\n  MOCK_METHOD4(ProcessAttributeBuffer,\n               void(DwarfAttribute, DwarfForm, const char *, uint64));\n  MOCK_METHOD3(ProcessAttributeString,\n               void(DwarfAttribute, DwarfForm, const string &));\n  MOCK_METHOD3(ProcessAttributeSignature,\n               void(DwarfAttribute, DwarfForm, uint64));\n  MOCK_METHOD0(EndAttributes, bool());\n  MOCK_METHOD3(FindChildHandler, DIEHandler *(uint64, DwarfTag,\n                                              const AttributeList &));\n  MOCK_METHOD0(Finish, void());\n};\n\nclass MockRootDIEHandler: public RootDIEHandler {\n public:\n  MOCK_METHOD3(ProcessAttributeUnsigned,\n               void(DwarfAttribute, DwarfForm, uint64));\n  MOCK_METHOD3(ProcessAttributeSigned,\n               void(DwarfAttribute, DwarfForm, int64));\n  MOCK_METHOD3(ProcessAttributeReference,\n               void(DwarfAttribute, DwarfForm, uint64));\n  MOCK_METHOD4(ProcessAttributeBuffer,\n               void(DwarfAttribute, DwarfForm, const char *, uint64));\n  MOCK_METHOD3(ProcessAttributeString,\n               void(DwarfAttribute, DwarfForm, const string &));\n  MOCK_METHOD3(ProcessAttributeSignature,\n               void(DwarfAttribute, DwarfForm, uint64));\n  MOCK_METHOD0(EndAttributes, bool());\n  MOCK_METHOD3(FindChildHandler, DIEHandler *(uint64, DwarfTag,\n                                              const AttributeList &));\n  MOCK_METHOD0(Finish, void());\n  MOCK_METHOD5(StartCompilationUnit, bool(uint64, uint8, uint8, uint64, uint8));\n  MOCK_METHOD3(StartRootDIE, bool(uint64, DwarfTag, const AttributeList &));\n};\n\n// If the handler elects to skip the compilation unit, the dispatcher\n// should tell the reader so.\nTEST(Dwarf2DIEHandler, SkipCompilationUnit) {\n  Sequence s;\n  MockRootDIEHandler mock_root_handler;\n  DIEDispatcher die_dispatcher(&mock_root_handler);\n\n  EXPECT_CALL(mock_root_handler,\n              StartCompilationUnit(0x8d42aed77cfccf3eLL,\n                                   0x89, 0xdc,\n                                   0x2ecb4dc778a80f21LL,\n                                   0x66))\n      .InSequence(s)\n      .WillOnce(Return(false));\n\n  EXPECT_FALSE(die_dispatcher.StartCompilationUnit(0x8d42aed77cfccf3eLL,\n                                                   0x89, 0xdc,\n                                                   0x2ecb4dc778a80f21LL,\n                                                   0x66));\n}\n\n// If the handler elects to skip the root DIE, the dispatcher should\n// tell the reader so.\nTEST(Dwarf2DIEHandler, SkipRootDIE) {\n  Sequence s;\n  MockRootDIEHandler mock_root_handler;\n  DIEDispatcher die_dispatcher(&mock_root_handler);\n\n  AttributeList mock_attribute_list;\n  mock_attribute_list.push_back(make_pair(dwarf2reader::DW_AT_name,\n                                          dwarf2reader::DW_FORM_string));\n\n  EXPECT_CALL(mock_root_handler,\n              StartCompilationUnit(0xde8994029fc8b999LL, 0xf4, 0x02,\n                                   0xb00febffa76e2b2bLL, 0x5c))\n      .InSequence(s)\n      .WillOnce(Return(true));\n  EXPECT_CALL(mock_root_handler,\n              StartRootDIE(0x7d08242b4b510cf2LL, (DwarfTag) 0xb4f98da6,\n                           ContainerEq(mock_attribute_list)))\n      .InSequence(s)\n      .WillOnce(Return(false));\n\n  EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0xde8994029fc8b999LL, \n                                                  0xf4, 0x02,\n                                                  0xb00febffa76e2b2bLL, 0x5c));\n  EXPECT_FALSE(die_dispatcher.StartDIE(0x7d08242b4b510cf2LL,\n                                       (DwarfTag) 0xb4f98da6,\n                                       mock_attribute_list));\n  die_dispatcher.EndDIE(0x7d08242b4b510cf2LL);\n}\n\n// If the handler elects to skip the root DIE's children, the\n// dispatcher should tell the reader so --- and avoid deleting the\n// root handler.\nTEST(Dwarf2DIEHandler, SkipRootDIEChildren) {\n  MockRootDIEHandler mock_root_handler;\n  DIEDispatcher die_dispatcher(&mock_root_handler);\n\n  AttributeList mock_attribute_list;\n\n  {\n    InSequence s;\n\n    EXPECT_CALL(mock_root_handler,\n                StartCompilationUnit(0x15d6897480cc65a7LL, 0x26, 0xa0,\n                                     0x09f8bf0767f91675LL, 0xdb))\n      .WillOnce(Return(true));\n    EXPECT_CALL(mock_root_handler,\n                StartRootDIE(0x7d08242b4b510cf2LL, (DwarfTag) 0xb4f98da6,\n                             ContainerEq(mock_attribute_list)))\n      .WillOnce(Return(true));\n    // Please don't tell me about my children.\n    EXPECT_CALL(mock_root_handler, EndAttributes())\n      .WillOnce(Return(false));\n    EXPECT_CALL(mock_root_handler, Finish())\n      .WillOnce(Return());\n  }\n\n  EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0x15d6897480cc65a7LL,\n                                                  0x26, 0xa0,\n                                                  0x09f8bf0767f91675LL, 0xdb));\n  EXPECT_TRUE(die_dispatcher.StartDIE(0x7d08242b4b510cf2LL,\n                                      (DwarfTag) 0xb4f98da6,\n                                      mock_attribute_list));\n  EXPECT_FALSE(die_dispatcher.StartDIE(0x435150ceedccda18LL,\n                                       (DwarfTag) 0xc3a17bba,\n                                       mock_attribute_list));\n  die_dispatcher.EndDIE(0x435150ceedccda18LL);\n  die_dispatcher.EndDIE(0x7d08242b4b510cf2LL);\n}\n\n// The dispatcher should pass attribute values through to the die\n// handler accurately.\nTEST(Dwarf2DIEHandler, PassAttributeValues) {\n  MockRootDIEHandler mock_root_handler;\n  DIEDispatcher die_dispatcher(&mock_root_handler);\n\n  AttributeList mock_attribute_list;\n  mock_attribute_list.push_back(make_pair(dwarf2reader::DW_AT_name,\n                                          dwarf2reader::DW_FORM_string));\n  const char buffer[10] = { 0x24, 0x24, 0x35, 0x9a, 0xca,\n                            0xcf, 0xa8, 0x84, 0xa7, 0x18 };\n  string str = \"\\xc8\\x26\\x2e\\x0d\\xa4\\x9c\\x37\\xd6\\xfb\\x1d\";\n\n  // Set expectations.\n  {\n    InSequence s;\n\n    // We'll like the compilation unit header.\n    EXPECT_CALL(mock_root_handler,\n                StartCompilationUnit(0x8d42aed77cfccf3eLL, 0x89, 0xdc,\n                                     0x2ecb4dc778a80f21LL, 0x66))\n      .WillOnce(Return(true));\n\n    // We'll like the root DIE.\n    EXPECT_CALL(mock_root_handler,\n                StartRootDIE(0xe2222da01e29f2a9LL, (DwarfTag) 0x9829445c,\n                             ContainerEq(mock_attribute_list)))\n      .WillOnce(Return(true));\n\n    // Expect some attribute values.\n    EXPECT_CALL(mock_root_handler,\n                ProcessAttributeUnsigned((DwarfAttribute) 0x1cc0bfed,\n                                         (DwarfForm) 0x424f1468,\n                                         0xa592571997facda1ULL))\n      .WillOnce(Return());\n    EXPECT_CALL(mock_root_handler,\n                ProcessAttributeSigned((DwarfAttribute) 0x43694dc9,\n                                       (DwarfForm) 0xf6f78901L,\n                                       0x92602a4e3bf1f446LL))\n      .WillOnce(Return());\n    EXPECT_CALL(mock_root_handler,\n                ProcessAttributeReference((DwarfAttribute) 0x4033e8cL,\n                                          (DwarfForm) 0xf66fbe0bL,\n                                          0x50fddef44734fdecULL))\n      .WillOnce(Return());\n    EXPECT_CALL(mock_root_handler,\n                ProcessAttributeBuffer((DwarfAttribute) 0x25d7e0af,\n                                       (DwarfForm) 0xe99a539a,\n                                       buffer, sizeof(buffer)))\n      .WillOnce(Return());\n    EXPECT_CALL(mock_root_handler,\n                ProcessAttributeString((DwarfAttribute) 0x310ed065,\n                                       (DwarfForm) 0x15762fec,\n                                       StrEq(str)))\n      .WillOnce(Return());\n    EXPECT_CALL(mock_root_handler,\n                ProcessAttributeSignature((DwarfAttribute) 0x58790d72,\n                                          (DwarfForm) 0x4159f138,\n                                          0x94682463613e6a5fULL))\n      .WillOnce(Return());\n    EXPECT_CALL(mock_root_handler, EndAttributes())\n      .WillOnce(Return(true));\n    EXPECT_CALL(mock_root_handler, FindChildHandler(_, _, _))\n      .Times(0);\n    EXPECT_CALL(mock_root_handler, Finish())\n      .WillOnce(Return());\n  }\n\n  // Drive the dispatcher.\n\n  // Report the CU header.\n  EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0x8d42aed77cfccf3eLL,\n                                                  0x89, 0xdc,\n                                                  0x2ecb4dc778a80f21LL,\n                                                  0x66));\n  // Report the root DIE.\n  EXPECT_TRUE(die_dispatcher.StartDIE(0xe2222da01e29f2a9LL,\n                                      (DwarfTag) 0x9829445c,\n                                      mock_attribute_list));\n\n  // Report some attribute values.\n  die_dispatcher.ProcessAttributeUnsigned(0xe2222da01e29f2a9LL,\n                                          (DwarfAttribute) 0x1cc0bfed,\n                                          (DwarfForm) 0x424f1468,\n                                          0xa592571997facda1ULL);\n  die_dispatcher.ProcessAttributeSigned(0xe2222da01e29f2a9LL,\n                                        (DwarfAttribute) 0x43694dc9,\n                                        (DwarfForm) 0xf6f78901,\n                                        0x92602a4e3bf1f446LL);\n  die_dispatcher.ProcessAttributeReference(0xe2222da01e29f2a9LL,\n                                           (DwarfAttribute) 0x4033e8c,\n                                           (DwarfForm) 0xf66fbe0b,\n                                           0x50fddef44734fdecULL);\n  die_dispatcher.ProcessAttributeBuffer(0xe2222da01e29f2a9LL,\n                                        (DwarfAttribute) 0x25d7e0af,\n                                        (DwarfForm) 0xe99a539a,\n                                        buffer, sizeof(buffer));\n  die_dispatcher.ProcessAttributeString(0xe2222da01e29f2a9LL,\n                                        (DwarfAttribute) 0x310ed065,\n                                        (DwarfForm) 0x15762fec,\n                                        str);\n  die_dispatcher.ProcessAttributeSignature(0xe2222da01e29f2a9LL,\n                                           (DwarfAttribute) 0x58790d72,\n                                           (DwarfForm) 0x4159f138,\n                                           0x94682463613e6a5fULL);\n\n  // Finish the root DIE (and thus the CU).\n  die_dispatcher.EndDIE(0xe2222da01e29f2a9LL);\n}\n\nTEST(Dwarf2DIEHandler, FindAndSkipChildren) {\n  MockRootDIEHandler mock_root_handler;\n  MockDIEHandler *mock_child1_handler = new(MockDIEHandler);\n  MockDIEHandler *mock_child3_handler = new(MockDIEHandler);\n  DIEDispatcher die_dispatcher(&mock_root_handler);\n\n  AttributeList root_attribute_list;\n  root_attribute_list.push_back(make_pair((DwarfAttribute) 0xb01185df,\n                                          (DwarfForm) 0xbc97cee8));\n  AttributeList child1_attribute_list;\n  child1_attribute_list.push_back(make_pair((DwarfAttribute) 0x41014e43,\n                                            (DwarfForm) 0x63155f4c));\n  AttributeList grandchild1_attribute_list;\n  grandchild1_attribute_list.push_back(make_pair((DwarfAttribute) 0xf72f823c,\n                                                 (DwarfForm) 0x0ff6a201));\n  AttributeList greatgrandchild1_attribute_list;\n  greatgrandchild1_attribute_list\n    .push_back(make_pair((DwarfAttribute) 0xbe66e5f0, (DwarfForm) 0xb4b24ff7));\n  AttributeList child2_attribute_list;\n  child1_attribute_list.push_back(make_pair((DwarfAttribute) 0xf22df14c,\n                                            (DwarfForm) 0x20676e7d));\n  AttributeList child3_attribute_list;\n  child3_attribute_list.push_back(make_pair((DwarfAttribute) 0xe8bf1201,\n                                            (DwarfForm) 0x53a5b7a8));\n\n  {\n    InSequence s;\n\n    // We'll like the compilation unit header.\n    EXPECT_CALL(mock_root_handler,\n                StartCompilationUnit(0x9ec1e6d05e434a0eLL, 0xeb, 0x21,\n                                     0x47dd3c764275a216LL, 0xa5))\n      .WillOnce(Return(true));\n\n    // Root DIE.\n    {\n      EXPECT_CALL(mock_root_handler,\n                  StartRootDIE(0x15f0e06bdfe3c372LL, (DwarfTag) 0xf5d60c59,\n                               ContainerEq(root_attribute_list)))\n        .WillOnce(Return(true));\n      EXPECT_CALL(mock_root_handler,\n                  ProcessAttributeSigned((DwarfAttribute) 0xf779a642,\n                                         (DwarfForm) 0x2cb63027,\n                                         0x18e744661769d08fLL))\n        .WillOnce(Return());\n      EXPECT_CALL(mock_root_handler, EndAttributes())\n        .WillOnce(Return(true));\n\n      // First child DIE.\n      EXPECT_CALL(mock_root_handler,\n                  FindChildHandler(0x149f644f8116fe8cLL,\n                                   (DwarfTag) 0xac2cbd8c,\n                                   ContainerEq(child1_attribute_list)))\n        .WillOnce(Return(mock_child1_handler));\n      {\n        EXPECT_CALL(*mock_child1_handler,\n                    ProcessAttributeSigned((DwarfAttribute) 0xa6fd6f65,\n                                           (DwarfForm) 0xe4f64c41,\n                                           0x1b04e5444a55fe67LL))\n          .WillOnce(Return());\n        EXPECT_CALL(*mock_child1_handler, EndAttributes())\n          .WillOnce(Return(false));\n        // Skip first grandchild DIE and first great-grandchild DIE.\n        EXPECT_CALL(*mock_child1_handler, Finish())\n          .WillOnce(Return());\n      }\n\n      // Second child DIE.  Root handler will decline to return a handler\n      // for this child.\n      EXPECT_CALL(mock_root_handler,\n                  FindChildHandler(0x97412be24875de9dLL,\n                                   (DwarfTag) 0x505a068b,\n                                   ContainerEq(child2_attribute_list)))\n        .WillOnce(Return((DIEHandler *) NULL));\n\n      // Third child DIE.\n      EXPECT_CALL(mock_root_handler,\n                  FindChildHandler(0x753c964c8ab538aeLL,\n                                   (DwarfTag) 0x8c22970e,\n                                   ContainerEq(child3_attribute_list)))\n        .WillOnce(Return(mock_child3_handler));\n      {\n        EXPECT_CALL(*mock_child3_handler,\n                    ProcessAttributeSigned((DwarfAttribute) 0x4e2b7cfb,\n                                           (DwarfForm) 0x610b7ae1,\n                                           0x3ea5c609d7d7560fLL))\n          .WillOnce(Return());\n        EXPECT_CALL(*mock_child3_handler, EndAttributes())\n          .WillOnce(Return(true));\n        EXPECT_CALL(*mock_child3_handler, Finish())\n          .WillOnce(Return());\n      }\n\n      EXPECT_CALL(mock_root_handler, Finish())\n        .WillOnce(Return());\n    }\n  }\n\n    \n  // Drive the dispatcher.\n\n  // Report the CU header.\n  EXPECT_TRUE(die_dispatcher\n              .StartCompilationUnit(0x9ec1e6d05e434a0eLL, 0xeb, 0x21,\n                                    0x47dd3c764275a216LL, 0xa5));\n  // Report the root DIE.\n  {\n    EXPECT_TRUE(die_dispatcher.StartDIE(0x15f0e06bdfe3c372LL,\n                                        (DwarfTag) 0xf5d60c59,\n                                        root_attribute_list));\n    die_dispatcher.ProcessAttributeSigned(0x15f0e06bdfe3c372LL,\n                                          (DwarfAttribute) 0xf779a642,\n                                          (DwarfForm) 0x2cb63027,\n                                          0x18e744661769d08fLL);\n\n    // First child DIE.\n    {\n      EXPECT_TRUE(die_dispatcher.StartDIE(0x149f644f8116fe8cLL,\n                                          (DwarfTag) 0xac2cbd8c,\n                                          child1_attribute_list));\n      die_dispatcher.ProcessAttributeSigned(0x149f644f8116fe8cLL,\n                                            (DwarfAttribute) 0xa6fd6f65,\n                                            (DwarfForm) 0xe4f64c41,\n                                            0x1b04e5444a55fe67LL);\n\n      // First grandchild DIE.  Will be skipped.\n      {\n        EXPECT_FALSE(die_dispatcher.StartDIE(0xd68de1ee0bd29419LL,\n                                            (DwarfTag) 0x22f05a15,\n                                            grandchild1_attribute_list));\n        // First great-grandchild DIE.  Will be skipped without being\n        // mentioned to any handler.\n        {\n          EXPECT_FALSE(die_dispatcher\n                       .StartDIE(0xb3076285d25cac25LL,\n                                 (DwarfTag) 0xcff4061b,\n                                 greatgrandchild1_attribute_list));\n          die_dispatcher.EndDIE(0xb3076285d25cac25LL);          \n        }\n        die_dispatcher.EndDIE(0xd68de1ee0bd29419LL);\n      }\n      die_dispatcher.EndDIE(0x149f644f8116fe8cLL);\n    }\n\n    // Second child DIE.  Root handler will decline to find a handler for it.\n    {\n      EXPECT_FALSE(die_dispatcher.StartDIE(0x97412be24875de9dLL,\n                                           (DwarfTag) 0x505a068b,\n                                           child2_attribute_list));\n      die_dispatcher.EndDIE(0x97412be24875de9dLL);\n    }\n    \n    // Third child DIE.\n    {\n      EXPECT_TRUE(die_dispatcher.StartDIE(0x753c964c8ab538aeLL,\n                                          (DwarfTag) 0x8c22970e,\n                                          child3_attribute_list));\n      die_dispatcher.ProcessAttributeSigned(0x753c964c8ab538aeLL,\n                                            (DwarfAttribute) 0x4e2b7cfb,\n                                            (DwarfForm) 0x610b7ae1,\n                                            0x3ea5c609d7d7560fLL);\n      die_dispatcher.EndDIE(0x753c964c8ab538aeLL);\n    }\n    \n    // Finish the root DIE (and thus the CU).\n    die_dispatcher.EndDIE(0x15f0e06bdfe3c372LL);\n  }\n}\n\n// The DIEDispatcher destructor is supposed to delete all handlers on\n// the stack, except for the root.\nTEST(Dwarf2DIEHandler, FreeHandlersOnStack) {\n  MockRootDIEHandler mock_root_handler;\n  MockDIEHandler *mock_child_handler = new(MockDIEHandler);\n  MockDIEHandler *mock_grandchild_handler = new(MockDIEHandler);\n  AttributeList empty_attribute_list;\n\n  {\n    InSequence s;\n\n    // We'll like the compilation unit header.\n    EXPECT_CALL(mock_root_handler,\n                StartCompilationUnit(0x87b41ba8381cd71cLL, 0xff, 0x89,\n                                     0x76d392ff393ddda2LL, 0xbf))\n      .WillOnce(Return(true));\n\n    // Root DIE.\n    {\n      EXPECT_CALL(mock_root_handler,\n                  StartRootDIE(0xbf13b761691ddc91LL, (DwarfTag) 0x98980361,\n                               ContainerEq(empty_attribute_list)))\n        .WillOnce(Return(true));\n      EXPECT_CALL(mock_root_handler, EndAttributes())\n        .WillOnce(Return(true));\n      \n      // Child DIE.\n      EXPECT_CALL(mock_root_handler,\n                  FindChildHandler(0x058f09240c5fc8c9LL,\n                                   (DwarfTag) 0x898bf0d0,\n                                   ContainerEq(empty_attribute_list)))\n        .WillOnce(Return(mock_child_handler));\n      {\n        EXPECT_CALL(*mock_child_handler, EndAttributes())\n          .WillOnce(Return(true));\n\n        // Grandchild DIE.\n        EXPECT_CALL(*mock_child_handler,\n                    FindChildHandler(0x32dc00c9945dc0c8LL,\n                                     (DwarfTag) 0x2802d007,\n                                     ContainerEq(empty_attribute_list)))\n          .WillOnce(Return(mock_grandchild_handler));\n        {\n          EXPECT_CALL(*mock_grandchild_handler,\n                      ProcessAttributeSigned((DwarfAttribute) 0x4e2b7cfb,\n                                             (DwarfForm) 0x610b7ae1,\n                                             0x3ea5c609d7d7560fLL))\n            .WillOnce(Return());\n\n          // At this point, we abandon the traversal, so none of the\n          // usual stuff should get called.\n          EXPECT_CALL(*mock_grandchild_handler, EndAttributes())\n            .Times(0);\n          EXPECT_CALL(*mock_grandchild_handler, Finish())\n            .Times(0);\n        }\n\n        EXPECT_CALL(*mock_child_handler, Finish())\n          .Times(0);\n      }\n\n      EXPECT_CALL(mock_root_handler, Finish())\n        .Times(0);\n    }\n  }\n\n  // The dispatcher.\n  DIEDispatcher die_dispatcher(&mock_root_handler);\n  \n  // Report the CU header.\n  EXPECT_TRUE(die_dispatcher\n              .StartCompilationUnit(0x87b41ba8381cd71cLL, 0xff, 0x89,\n                                    0x76d392ff393ddda2LL, 0xbf));\n  // Report the root DIE.\n  {\n    EXPECT_TRUE(die_dispatcher.StartDIE(0xbf13b761691ddc91LL,\n                                        (DwarfTag) 0x98980361,\n                                        empty_attribute_list));\n\n    // Child DIE.\n    {\n      EXPECT_TRUE(die_dispatcher.StartDIE(0x058f09240c5fc8c9LL,\n                                          (DwarfTag) 0x898bf0d0,\n                                          empty_attribute_list));\n\n      // Grandchild DIE.\n      {\n        EXPECT_TRUE(die_dispatcher.StartDIE(0x32dc00c9945dc0c8LL,\n                                            (DwarfTag) 0x2802d007,\n                                            empty_attribute_list));\n        die_dispatcher.ProcessAttributeSigned(0x32dc00c9945dc0c8LL,\n                                              (DwarfAttribute) 0x4e2b7cfb,\n                                              (DwarfForm) 0x610b7ae1,\n                                              0x3ea5c609d7d7560fLL);\n\n        // Stop the traversal abruptly, so that there will still be\n        // handlers on the stack when the dispatcher is destructed.\n\n        // No EndDIE call...\n      }\n      // No EndDIE call...\n    }\n    // No EndDIE call...\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/dwarf2enums.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef COMMON_DWARF_DWARF2ENUMS_H__\n#define COMMON_DWARF_DWARF2ENUMS_H__\n\nnamespace dwarf2reader {\n\n// These enums do not follow the google3 style only because they are\n// known universally (specs, other implementations) by the names in\n// exactly this capitalization.\n// Tag names and codes.\nenum DwarfTag {\n  DW_TAG_padding = 0x00,\n  DW_TAG_array_type = 0x01,\n  DW_TAG_class_type = 0x02,\n  DW_TAG_entry_point = 0x03,\n  DW_TAG_enumeration_type = 0x04,\n  DW_TAG_formal_parameter = 0x05,\n  DW_TAG_imported_declaration = 0x08,\n  DW_TAG_label = 0x0a,\n  DW_TAG_lexical_block = 0x0b,\n  DW_TAG_member = 0x0d,\n  DW_TAG_pointer_type = 0x0f,\n  DW_TAG_reference_type = 0x10,\n  DW_TAG_compile_unit = 0x11,\n  DW_TAG_string_type = 0x12,\n  DW_TAG_structure_type = 0x13,\n  DW_TAG_subroutine_type = 0x15,\n  DW_TAG_typedef = 0x16,\n  DW_TAG_union_type = 0x17,\n  DW_TAG_unspecified_parameters = 0x18,\n  DW_TAG_variant = 0x19,\n  DW_TAG_common_block = 0x1a,\n  DW_TAG_common_inclusion = 0x1b,\n  DW_TAG_inheritance = 0x1c,\n  DW_TAG_inlined_subroutine = 0x1d,\n  DW_TAG_module = 0x1e,\n  DW_TAG_ptr_to_member_type = 0x1f,\n  DW_TAG_set_type = 0x20,\n  DW_TAG_subrange_type = 0x21,\n  DW_TAG_with_stmt = 0x22,\n  DW_TAG_access_declaration = 0x23,\n  DW_TAG_base_type = 0x24,\n  DW_TAG_catch_block = 0x25,\n  DW_TAG_const_type = 0x26,\n  DW_TAG_constant = 0x27,\n  DW_TAG_enumerator = 0x28,\n  DW_TAG_file_type = 0x29,\n  DW_TAG_friend = 0x2a,\n  DW_TAG_namelist = 0x2b,\n  DW_TAG_namelist_item = 0x2c,\n  DW_TAG_packed_type = 0x2d,\n  DW_TAG_subprogram = 0x2e,\n  DW_TAG_template_type_param = 0x2f,\n  DW_TAG_template_value_param = 0x30,\n  DW_TAG_thrown_type = 0x31,\n  DW_TAG_try_block = 0x32,\n  DW_TAG_variant_part = 0x33,\n  DW_TAG_variable = 0x34,\n  DW_TAG_volatile_type = 0x35,\n  // DWARF 3.\n  DW_TAG_dwarf_procedure = 0x36,\n  DW_TAG_restrict_type = 0x37,\n  DW_TAG_interface_type = 0x38,\n  DW_TAG_namespace = 0x39,\n  DW_TAG_imported_module = 0x3a,\n  DW_TAG_unspecified_type = 0x3b,\n  DW_TAG_partial_unit = 0x3c,\n  DW_TAG_imported_unit = 0x3d,\n  // SGI/MIPS Extensions.\n  DW_TAG_MIPS_loop = 0x4081,\n  // HP extensions.  See:\n  // ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz\n  DW_TAG_HP_array_descriptor = 0x4090,\n  // GNU extensions.\n  DW_TAG_format_label = 0x4101,  // For FORTRAN 77 and Fortran 90.\n  DW_TAG_function_template = 0x4102,  // For C++.\n  DW_TAG_class_template = 0x4103,  // For C++.\n  DW_TAG_GNU_BINCL = 0x4104,\n  DW_TAG_GNU_EINCL = 0x4105,\n  // Extensions for UPC.  See: http://upc.gwu.edu/~upc.\n  DW_TAG_upc_shared_type = 0x8765,\n  DW_TAG_upc_strict_type = 0x8766,\n  DW_TAG_upc_relaxed_type = 0x8767,\n  // PGI (STMicroelectronics) extensions.  No documentation available.\n  DW_TAG_PGI_kanji_type      = 0xA000,\n  DW_TAG_PGI_interface_block = 0xA020\n};\n\n\nenum DwarfHasChild {\n  DW_children_no = 0,\n  DW_children_yes = 1\n};\n\n// Form names and codes.\nenum DwarfForm {\n  DW_FORM_addr = 0x01,\n  DW_FORM_block2 = 0x03,\n  DW_FORM_block4 = 0x04,\n  DW_FORM_data2 = 0x05,\n  DW_FORM_data4 = 0x06,\n  DW_FORM_data8 = 0x07,\n  DW_FORM_string = 0x08,\n  DW_FORM_block = 0x09,\n  DW_FORM_block1 = 0x0a,\n  DW_FORM_data1 = 0x0b,\n  DW_FORM_flag = 0x0c,\n  DW_FORM_sdata = 0x0d,\n  DW_FORM_strp = 0x0e,\n  DW_FORM_udata = 0x0f,\n  DW_FORM_ref_addr = 0x10,\n  DW_FORM_ref1 = 0x11,\n  DW_FORM_ref2 = 0x12,\n  DW_FORM_ref4 = 0x13,\n  DW_FORM_ref8 = 0x14,\n  DW_FORM_ref_udata = 0x15,\n  DW_FORM_indirect = 0x16,\n\n  // Added in DWARF 4:\n  DW_FORM_sec_offset = 0x17,\n  DW_FORM_exprloc = 0x18,\n  DW_FORM_flag_present = 0x19,\n  DW_FORM_ref_sig8 = 0x20\n};\n\n// Attribute names and codes\nenum DwarfAttribute {\n  DW_AT_sibling = 0x01,\n  DW_AT_location = 0x02,\n  DW_AT_name = 0x03,\n  DW_AT_ordering = 0x09,\n  DW_AT_subscr_data = 0x0a,\n  DW_AT_byte_size = 0x0b,\n  DW_AT_bit_offset = 0x0c,\n  DW_AT_bit_size = 0x0d,\n  DW_AT_element_list = 0x0f,\n  DW_AT_stmt_list = 0x10,\n  DW_AT_low_pc = 0x11,\n  DW_AT_high_pc = 0x12,\n  DW_AT_language = 0x13,\n  DW_AT_member = 0x14,\n  DW_AT_discr = 0x15,\n  DW_AT_discr_value = 0x16,\n  DW_AT_visibility = 0x17,\n  DW_AT_import = 0x18,\n  DW_AT_string_length = 0x19,\n  DW_AT_common_reference = 0x1a,\n  DW_AT_comp_dir = 0x1b,\n  DW_AT_const_value = 0x1c,\n  DW_AT_containing_type = 0x1d,\n  DW_AT_default_value = 0x1e,\n  DW_AT_inline = 0x20,\n  DW_AT_is_optional = 0x21,\n  DW_AT_lower_bound = 0x22,\n  DW_AT_producer = 0x25,\n  DW_AT_prototyped = 0x27,\n  DW_AT_return_addr = 0x2a,\n  DW_AT_start_scope = 0x2c,\n  DW_AT_stride_size = 0x2e,\n  DW_AT_upper_bound = 0x2f,\n  DW_AT_abstract_origin = 0x31,\n  DW_AT_accessibility = 0x32,\n  DW_AT_address_class = 0x33,\n  DW_AT_artificial = 0x34,\n  DW_AT_base_types = 0x35,\n  DW_AT_calling_convention = 0x36,\n  DW_AT_count = 0x37,\n  DW_AT_data_member_location = 0x38,\n  DW_AT_decl_column = 0x39,\n  DW_AT_decl_file = 0x3a,\n  DW_AT_decl_line = 0x3b,\n  DW_AT_declaration = 0x3c,\n  DW_AT_discr_list = 0x3d,\n  DW_AT_encoding = 0x3e,\n  DW_AT_external = 0x3f,\n  DW_AT_frame_base = 0x40,\n  DW_AT_friend = 0x41,\n  DW_AT_identifier_case = 0x42,\n  DW_AT_macro_info = 0x43,\n  DW_AT_namelist_items = 0x44,\n  DW_AT_priority = 0x45,\n  DW_AT_segment = 0x46,\n  DW_AT_specification = 0x47,\n  DW_AT_static_link = 0x48,\n  DW_AT_type = 0x49,\n  DW_AT_use_location = 0x4a,\n  DW_AT_variable_parameter = 0x4b,\n  DW_AT_virtuality = 0x4c,\n  DW_AT_vtable_elem_location = 0x4d,\n  // DWARF 3 values.\n  DW_AT_allocated     = 0x4e,\n  DW_AT_associated    = 0x4f,\n  DW_AT_data_location = 0x50,\n  DW_AT_stride        = 0x51,\n  DW_AT_entry_pc      = 0x52,\n  DW_AT_use_UTF8      = 0x53,\n  DW_AT_extension     = 0x54,\n  DW_AT_ranges        = 0x55,\n  DW_AT_trampoline    = 0x56,\n  DW_AT_call_column   = 0x57,\n  DW_AT_call_file     = 0x58,\n  DW_AT_call_line     = 0x59,\n  // SGI/MIPS extensions.\n  DW_AT_MIPS_fde = 0x2001,\n  DW_AT_MIPS_loop_begin = 0x2002,\n  DW_AT_MIPS_tail_loop_begin = 0x2003,\n  DW_AT_MIPS_epilog_begin = 0x2004,\n  DW_AT_MIPS_loop_unroll_factor = 0x2005,\n  DW_AT_MIPS_software_pipeline_depth = 0x2006,\n  DW_AT_MIPS_linkage_name = 0x2007,\n  DW_AT_MIPS_stride = 0x2008,\n  DW_AT_MIPS_abstract_name = 0x2009,\n  DW_AT_MIPS_clone_origin = 0x200a,\n  DW_AT_MIPS_has_inlines = 0x200b,\n  // HP extensions.\n  DW_AT_HP_block_index         = 0x2000,\n  DW_AT_HP_unmodifiable        = 0x2001,  // Same as DW_AT_MIPS_fde.\n  DW_AT_HP_actuals_stmt_list   = 0x2010,\n  DW_AT_HP_proc_per_section    = 0x2011,\n  DW_AT_HP_raw_data_ptr        = 0x2012,\n  DW_AT_HP_pass_by_reference   = 0x2013,\n  DW_AT_HP_opt_level           = 0x2014,\n  DW_AT_HP_prof_version_id     = 0x2015,\n  DW_AT_HP_opt_flags           = 0x2016,\n  DW_AT_HP_cold_region_low_pc  = 0x2017,\n  DW_AT_HP_cold_region_high_pc = 0x2018,\n  DW_AT_HP_all_variables_modifiable = 0x2019,\n  DW_AT_HP_linkage_name        = 0x201a,\n  DW_AT_HP_prof_flags          = 0x201b,  // In comp unit of procs_info for -g.\n  // GNU extensions.\n  DW_AT_sf_names   = 0x2101,\n  DW_AT_src_info   = 0x2102,\n  DW_AT_mac_info   = 0x2103,\n  DW_AT_src_coords = 0x2104,\n  DW_AT_body_begin = 0x2105,\n  DW_AT_body_end   = 0x2106,\n  DW_AT_GNU_vector = 0x2107,\n  // VMS extensions.\n  DW_AT_VMS_rtnbeg_pd_address = 0x2201,\n  // UPC extension.\n  DW_AT_upc_threads_scaled = 0x3210,\n  // PGI (STMicroelectronics) extensions.\n  DW_AT_PGI_lbase    = 0x3a00,\n  DW_AT_PGI_soffset  = 0x3a01,\n  DW_AT_PGI_lstride  = 0x3a02\n};\n\n\n// Line number opcodes.\nenum DwarfLineNumberOps {\n  DW_LNS_extended_op = 0,\n  DW_LNS_copy = 1,\n  DW_LNS_advance_pc = 2,\n  DW_LNS_advance_line = 3,\n  DW_LNS_set_file = 4,\n  DW_LNS_set_column = 5,\n  DW_LNS_negate_stmt = 6,\n  DW_LNS_set_basic_block = 7,\n  DW_LNS_const_add_pc = 8,\n  DW_LNS_fixed_advance_pc = 9,\n  // DWARF 3.\n  DW_LNS_set_prologue_end = 10,\n  DW_LNS_set_epilogue_begin = 11,\n  DW_LNS_set_isa = 12\n};\n\n// Line number extended opcodes.\nenum DwarfLineNumberExtendedOps {\n  DW_LNE_end_sequence = 1,\n  DW_LNE_set_address = 2,\n  DW_LNE_define_file = 3,\n  // HP extensions.\n  DW_LNE_HP_negate_is_UV_update      = 0x11,\n  DW_LNE_HP_push_context             = 0x12,\n  DW_LNE_HP_pop_context              = 0x13,\n  DW_LNE_HP_set_file_line_column     = 0x14,\n  DW_LNE_HP_set_routine_name         = 0x15,\n  DW_LNE_HP_set_sequence             = 0x16,\n  DW_LNE_HP_negate_post_semantics    = 0x17,\n  DW_LNE_HP_negate_function_exit     = 0x18,\n  DW_LNE_HP_negate_front_end_logical = 0x19,\n  DW_LNE_HP_define_proc              = 0x20\n};\n\n// Type encoding names and codes\nenum DwarfEncoding {\n  DW_ATE_address                     =0x1,\n  DW_ATE_boolean                     =0x2,\n  DW_ATE_complex_float               =0x3,\n  DW_ATE_float                       =0x4,\n  DW_ATE_signed                      =0x5,\n  DW_ATE_signed_char                 =0x6,\n  DW_ATE_unsigned                    =0x7,\n  DW_ATE_unsigned_char               =0x8,\n  // DWARF3/DWARF3f\n  DW_ATE_imaginary_float             =0x9,\n  DW_ATE_packed_decimal              =0xa,\n  DW_ATE_numeric_string              =0xb,\n  DW_ATE_edited                      =0xc,\n  DW_ATE_signed_fixed                =0xd,\n  DW_ATE_unsigned_fixed              =0xe,\n  DW_ATE_decimal_float               =0xf,\n  DW_ATE_lo_user                     =0x80,\n  DW_ATE_hi_user                     =0xff\n};\n\n// Location virtual machine opcodes\nenum DwarfOpcode {\n  DW_OP_addr                         =0x03,\n  DW_OP_deref                        =0x06,\n  DW_OP_const1u                      =0x08,\n  DW_OP_const1s                      =0x09,\n  DW_OP_const2u                      =0x0a,\n  DW_OP_const2s                      =0x0b,\n  DW_OP_const4u                      =0x0c,\n  DW_OP_const4s                      =0x0d,\n  DW_OP_const8u                      =0x0e,\n  DW_OP_const8s                      =0x0f,\n  DW_OP_constu                       =0x10,\n  DW_OP_consts                       =0x11,\n  DW_OP_dup                          =0x12,\n  DW_OP_drop                         =0x13,\n  DW_OP_over                         =0x14,\n  DW_OP_pick                         =0x15,\n  DW_OP_swap                         =0x16,\n  DW_OP_rot                          =0x17,\n  DW_OP_xderef                       =0x18,\n  DW_OP_abs                          =0x19,\n  DW_OP_and                          =0x1a,\n  DW_OP_div                          =0x1b,\n  DW_OP_minus                        =0x1c,\n  DW_OP_mod                          =0x1d,\n  DW_OP_mul                          =0x1e,\n  DW_OP_neg                          =0x1f,\n  DW_OP_not                          =0x20,\n  DW_OP_or                           =0x21,\n  DW_OP_plus                         =0x22,\n  DW_OP_plus_uconst                  =0x23,\n  DW_OP_shl                          =0x24,\n  DW_OP_shr                          =0x25,\n  DW_OP_shra                         =0x26,\n  DW_OP_xor                          =0x27,\n  DW_OP_bra                          =0x28,\n  DW_OP_eq                           =0x29,\n  DW_OP_ge                           =0x2a,\n  DW_OP_gt                           =0x2b,\n  DW_OP_le                           =0x2c,\n  DW_OP_lt                           =0x2d,\n  DW_OP_ne                           =0x2e,\n  DW_OP_skip                         =0x2f,\n  DW_OP_lit0                         =0x30,\n  DW_OP_lit1                         =0x31,\n  DW_OP_lit2                         =0x32,\n  DW_OP_lit3                         =0x33,\n  DW_OP_lit4                         =0x34,\n  DW_OP_lit5                         =0x35,\n  DW_OP_lit6                         =0x36,\n  DW_OP_lit7                         =0x37,\n  DW_OP_lit8                         =0x38,\n  DW_OP_lit9                         =0x39,\n  DW_OP_lit10                        =0x3a,\n  DW_OP_lit11                        =0x3b,\n  DW_OP_lit12                        =0x3c,\n  DW_OP_lit13                        =0x3d,\n  DW_OP_lit14                        =0x3e,\n  DW_OP_lit15                        =0x3f,\n  DW_OP_lit16                        =0x40,\n  DW_OP_lit17                        =0x41,\n  DW_OP_lit18                        =0x42,\n  DW_OP_lit19                        =0x43,\n  DW_OP_lit20                        =0x44,\n  DW_OP_lit21                        =0x45,\n  DW_OP_lit22                        =0x46,\n  DW_OP_lit23                        =0x47,\n  DW_OP_lit24                        =0x48,\n  DW_OP_lit25                        =0x49,\n  DW_OP_lit26                        =0x4a,\n  DW_OP_lit27                        =0x4b,\n  DW_OP_lit28                        =0x4c,\n  DW_OP_lit29                        =0x4d,\n  DW_OP_lit30                        =0x4e,\n  DW_OP_lit31                        =0x4f,\n  DW_OP_reg0                         =0x50,\n  DW_OP_reg1                         =0x51,\n  DW_OP_reg2                         =0x52,\n  DW_OP_reg3                         =0x53,\n  DW_OP_reg4                         =0x54,\n  DW_OP_reg5                         =0x55,\n  DW_OP_reg6                         =0x56,\n  DW_OP_reg7                         =0x57,\n  DW_OP_reg8                         =0x58,\n  DW_OP_reg9                         =0x59,\n  DW_OP_reg10                        =0x5a,\n  DW_OP_reg11                        =0x5b,\n  DW_OP_reg12                        =0x5c,\n  DW_OP_reg13                        =0x5d,\n  DW_OP_reg14                        =0x5e,\n  DW_OP_reg15                        =0x5f,\n  DW_OP_reg16                        =0x60,\n  DW_OP_reg17                        =0x61,\n  DW_OP_reg18                        =0x62,\n  DW_OP_reg19                        =0x63,\n  DW_OP_reg20                        =0x64,\n  DW_OP_reg21                        =0x65,\n  DW_OP_reg22                        =0x66,\n  DW_OP_reg23                        =0x67,\n  DW_OP_reg24                        =0x68,\n  DW_OP_reg25                        =0x69,\n  DW_OP_reg26                        =0x6a,\n  DW_OP_reg27                        =0x6b,\n  DW_OP_reg28                        =0x6c,\n  DW_OP_reg29                        =0x6d,\n  DW_OP_reg30                        =0x6e,\n  DW_OP_reg31                        =0x6f,\n  DW_OP_breg0                        =0x70,\n  DW_OP_breg1                        =0x71,\n  DW_OP_breg2                        =0x72,\n  DW_OP_breg3                        =0x73,\n  DW_OP_breg4                        =0x74,\n  DW_OP_breg5                        =0x75,\n  DW_OP_breg6                        =0x76,\n  DW_OP_breg7                        =0x77,\n  DW_OP_breg8                        =0x78,\n  DW_OP_breg9                        =0x79,\n  DW_OP_breg10                       =0x7a,\n  DW_OP_breg11                       =0x7b,\n  DW_OP_breg12                       =0x7c,\n  DW_OP_breg13                       =0x7d,\n  DW_OP_breg14                       =0x7e,\n  DW_OP_breg15                       =0x7f,\n  DW_OP_breg16                       =0x80,\n  DW_OP_breg17                       =0x81,\n  DW_OP_breg18                       =0x82,\n  DW_OP_breg19                       =0x83,\n  DW_OP_breg20                       =0x84,\n  DW_OP_breg21                       =0x85,\n  DW_OP_breg22                       =0x86,\n  DW_OP_breg23                       =0x87,\n  DW_OP_breg24                       =0x88,\n  DW_OP_breg25                       =0x89,\n  DW_OP_breg26                       =0x8a,\n  DW_OP_breg27                       =0x8b,\n  DW_OP_breg28                       =0x8c,\n  DW_OP_breg29                       =0x8d,\n  DW_OP_breg30                       =0x8e,\n  DW_OP_breg31                       =0x8f,\n  DW_OP_regX                         =0x90,\n  DW_OP_fbreg                        =0x91,\n  DW_OP_bregX                        =0x92,\n  DW_OP_piece                        =0x93,\n  DW_OP_deref_size                   =0x94,\n  DW_OP_xderef_size                  =0x95,\n  DW_OP_nop                          =0x96,\n  // DWARF3/DWARF3f\n  DW_OP_push_object_address          =0x97,\n  DW_OP_call2                        =0x98,\n  DW_OP_call4                        =0x99,\n  DW_OP_call_ref                     =0x9a,\n  DW_OP_form_tls_address             =0x9b,\n  DW_OP_call_frame_cfa               =0x9c,\n  DW_OP_bit_piece                    =0x9d,\n  DW_OP_lo_user                      =0xe0,\n  DW_OP_hi_user                      =0xff,  \n  // GNU extensions\n  DW_OP_GNU_push_tls_address         =0xe0\n};\n\n// Source languages.  These are values for DW_AT_language.\nenum DwarfLanguage\n  {\n    DW_LANG_none                     =0x0000,\n    DW_LANG_C89                      =0x0001,\n    DW_LANG_C                        =0x0002,\n    DW_LANG_Ada83                    =0x0003,\n    DW_LANG_C_plus_plus              =0x0004,\n    DW_LANG_Cobol74                  =0x0005,\n    DW_LANG_Cobol85                  =0x0006,\n    DW_LANG_Fortran77                =0x0007,\n    DW_LANG_Fortran90                =0x0008,\n    DW_LANG_Pascal83                 =0x0009,\n    DW_LANG_Modula2                  =0x000a,\n    DW_LANG_Java                     =0x000b,\n    DW_LANG_C99                      =0x000c,\n    DW_LANG_Ada95                    =0x000d,\n    DW_LANG_Fortran95                =0x000e,\n    DW_LANG_PLI                      =0x000f,\n    DW_LANG_ObjC                     =0x0010,\n    DW_LANG_ObjC_plus_plus           =0x0011,\n    DW_LANG_UPC                      =0x0012,\n    DW_LANG_D                        =0x0013,\n    // Implementation-defined language code range.\n    DW_LANG_lo_user = 0x8000,\n    DW_LANG_hi_user = 0xffff,\n\n    // Extensions.\n\n    // MIPS assembly language.  The GNU toolchain uses this for all\n    // assembly languages, since there's no generic DW_LANG_ value for that.\n    // See include/dwarf2.h in the binutils, gdb, or gcc source trees.\n    DW_LANG_Mips_Assembler           =0x8001,\n    DW_LANG_Upc                      =0x8765 // Unified Parallel C\n  };\n\n// Inline codes.  These are values for DW_AT_inline.\nenum DwarfInline {\n  DW_INL_not_inlined                 =0x0,\n  DW_INL_inlined                     =0x1,\n  DW_INL_declared_not_inlined        =0x2,\n  DW_INL_declared_inlined            =0x3\n};\n\n// Call Frame Info instructions.\nenum DwarfCFI\n  {\n    DW_CFA_advance_loc        = 0x40,\n    DW_CFA_offset             = 0x80,\n    DW_CFA_restore            = 0xc0,\n    DW_CFA_nop                = 0x00,\n    DW_CFA_set_loc            = 0x01,\n    DW_CFA_advance_loc1       = 0x02,\n    DW_CFA_advance_loc2       = 0x03,\n    DW_CFA_advance_loc4       = 0x04,\n    DW_CFA_offset_extended    = 0x05,\n    DW_CFA_restore_extended   = 0x06,\n    DW_CFA_undefined          = 0x07,\n    DW_CFA_same_value         = 0x08,\n    DW_CFA_register           = 0x09,\n    DW_CFA_remember_state     = 0x0a,\n    DW_CFA_restore_state      = 0x0b,\n    DW_CFA_def_cfa            = 0x0c,\n    DW_CFA_def_cfa_register   = 0x0d,\n    DW_CFA_def_cfa_offset     = 0x0e,\n    DW_CFA_def_cfa_expression = 0x0f,\n    DW_CFA_expression         = 0x10,\n    DW_CFA_offset_extended_sf = 0x11,\n    DW_CFA_def_cfa_sf         = 0x12,\n    DW_CFA_def_cfa_offset_sf  = 0x13,\n    DW_CFA_val_offset         = 0x14,\n    DW_CFA_val_offset_sf      = 0x15,\n    DW_CFA_val_expression     = 0x16,\n\n    // Opcodes in this range are reserved for user extensions.\n    DW_CFA_lo_user = 0x1c,\n    DW_CFA_hi_user = 0x3f,\n\n    // SGI/MIPS specific.\n    DW_CFA_MIPS_advance_loc8 = 0x1d,\n\n    // GNU extensions.\n    DW_CFA_GNU_window_save = 0x2d,\n    DW_CFA_GNU_args_size = 0x2e,\n    DW_CFA_GNU_negative_offset_extended = 0x2f\n  };\n\n// Exception handling 'z' augmentation letters.\nenum DwarfZAugmentationCodes {\n  // If the CFI augmentation string begins with 'z', then the CIE and FDE\n  // have an augmentation data area just before the instructions, whose\n  // contents are determined by the subsequent augmentation letters.\n  DW_Z_augmentation_start = 'z',\n\n  // If this letter is present in a 'z' augmentation string, the CIE\n  // augmentation data includes a pointer encoding, and the FDE\n  // augmentation data includes a language-specific data area pointer,\n  // represented using that encoding.\n  DW_Z_has_LSDA = 'L',\n\n  // If this letter is present in a 'z' augmentation string, the CIE\n  // augmentation data includes a pointer encoding, followed by a pointer\n  // to a personality routine, represented using that encoding.\n  DW_Z_has_personality_routine = 'P',\n\n  // If this letter is present in a 'z' augmentation string, the CIE\n  // augmentation data includes a pointer encoding describing how the FDE's\n  // initial location, address range, and DW_CFA_set_loc operands are\n  // encoded.\n  DW_Z_has_FDE_address_encoding = 'R',\n\n  // If this letter is present in a 'z' augmentation string, then code\n  // addresses covered by FDEs that cite this CIE are signal delivery\n  // trampolines. Return addresses of frames in trampolines should not be\n  // adjusted as described in section 6.4.4 of the DWARF 3 spec.\n  DW_Z_is_signal_trampoline = 'S'\n};\n\n// Exception handling frame description pointer formats, as described\n// by the Linux Standard Base Core Specification 4.0, section 11.5,\n// DWARF Extensions.\nenum DwarfPointerEncoding\n  {\n    DW_EH_PE_absptr\t= 0x00,\n    DW_EH_PE_omit\t= 0xff,\n    DW_EH_PE_uleb128    = 0x01,\n    DW_EH_PE_udata2\t= 0x02,\n    DW_EH_PE_udata4\t= 0x03,\n    DW_EH_PE_udata8\t= 0x04,\n    DW_EH_PE_sleb128    = 0x09,\n    DW_EH_PE_sdata2\t= 0x0A,\n    DW_EH_PE_sdata4\t= 0x0B,\n    DW_EH_PE_sdata8\t= 0x0C,\n    DW_EH_PE_pcrel\t= 0x10,\n    DW_EH_PE_textrel\t= 0x20,\n    DW_EH_PE_datarel\t= 0x30,\n    DW_EH_PE_funcrel\t= 0x40,\n    DW_EH_PE_aligned\t= 0x50,\n\n    // The GNU toolchain sources define this enum value as well,\n    // simply to help classify the lower nybble values into signed and\n    // unsigned groups.\n    DW_EH_PE_signed\t= 0x08,\n\n    // This is not documented in LSB 4.0, but it is used in both the\n    // Linux and OS X toolchains. It can be added to any other\n    // encoding (except DW_EH_PE_aligned), and indicates that the\n    // encoded value represents the address at which the true address\n    // is stored, not the true address itself.\n    DW_EH_PE_indirect\t= 0x80  \n  };\n\n}  // namespace dwarf2reader\n#endif  // COMMON_DWARF_DWARF2ENUMS_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/dwarf2reader.cc",
    "content": "// Copyright (c) 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// CFI reader author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// Implementation of dwarf2reader::LineInfo, dwarf2reader::CompilationUnit,\n// and dwarf2reader::CallFrameInfo. See dwarf2reader.h for details.\n\n#include \"common/dwarf/dwarf2reader.h\"\n\n#include <assert.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <string.h>\n\n#include <map>\n#include <memory>\n#include <stack>\n#include <utility>\n\n#include \"common/dwarf/bytereader-inl.h\"\n#include \"common/dwarf/bytereader.h\"\n#include \"common/dwarf/line_state_machine.h\"\n\nnamespace dwarf2reader {\n\nCompilationUnit::CompilationUnit(const SectionMap& sections, uint64 offset,\n                                 ByteReader* reader, Dwarf2Handler* handler)\n    : offset_from_section_start_(offset), reader_(reader),\n      sections_(sections), handler_(handler), abbrevs_(NULL),\n      string_buffer_(NULL), string_buffer_length_(0) {}\n\n// Read a DWARF2/3 abbreviation section.\n// Each abbrev consists of a abbreviation number, a tag, a byte\n// specifying whether the tag has children, and a list of\n// attribute/form pairs.\n// The list of forms is terminated by a 0 for the attribute, and a\n// zero for the form.  The entire abbreviation section is terminated\n// by a zero for the code.\n\nvoid CompilationUnit::ReadAbbrevs() {\n  if (abbrevs_)\n    return;\n\n  // First get the debug_abbrev section.  \".debug_abbrev\" is the name\n  // recommended in the DWARF spec, and used on Linux;\n  // \"__debug_abbrev\" is the name used in Mac OS X Mach-O files.\n  SectionMap::const_iterator iter = sections_.find(\".debug_abbrev\");\n  if (iter == sections_.end())\n    iter = sections_.find(\"__debug_abbrev\");\n  assert(iter != sections_.end());\n\n  abbrevs_ = new std::vector<Abbrev>;\n  abbrevs_->resize(1);\n\n  // The only way to check whether we are reading over the end of the\n  // buffer would be to first compute the size of the leb128 data by\n  // reading it, then go back and read it again.\n  const char* abbrev_start = iter->second.first +\n                                      header_.abbrev_offset;\n  const char* abbrevptr = abbrev_start;\n#ifndef NDEBUG\n  const uint64 abbrev_length = iter->second.second - header_.abbrev_offset;\n#endif\n\n  while (1) {\n    CompilationUnit::Abbrev abbrev;\n    size_t len;\n    const uint64 number = reader_->ReadUnsignedLEB128(abbrevptr, &len);\n\n    if (number == 0)\n      break;\n    abbrev.number = number;\n    abbrevptr += len;\n\n    assert(abbrevptr < abbrev_start + abbrev_length);\n    const uint64 tag = reader_->ReadUnsignedLEB128(abbrevptr, &len);\n    abbrevptr += len;\n    abbrev.tag = static_cast<enum DwarfTag>(tag);\n\n    assert(abbrevptr < abbrev_start + abbrev_length);\n    abbrev.has_children = reader_->ReadOneByte(abbrevptr);\n    abbrevptr += 1;\n\n    assert(abbrevptr < abbrev_start + abbrev_length);\n\n    while (1) {\n      const uint64 nametemp = reader_->ReadUnsignedLEB128(abbrevptr, &len);\n      abbrevptr += len;\n\n      assert(abbrevptr < abbrev_start + abbrev_length);\n      const uint64 formtemp = reader_->ReadUnsignedLEB128(abbrevptr, &len);\n      abbrevptr += len;\n      if (nametemp == 0 && formtemp == 0)\n        break;\n\n      const enum DwarfAttribute name =\n        static_cast<enum DwarfAttribute>(nametemp);\n      const enum DwarfForm form = static_cast<enum DwarfForm>(formtemp);\n      abbrev.attributes.push_back(std::make_pair(name, form));\n    }\n    assert(abbrev.number == abbrevs_->size());\n    abbrevs_->push_back(abbrev);\n  }\n}\n\n// Skips a single DIE's attributes.\nconst char* CompilationUnit::SkipDIE(const char* start,\n                                              const Abbrev& abbrev) {\n  for (AttributeList::const_iterator i = abbrev.attributes.begin();\n       i != abbrev.attributes.end();\n       i++)  {\n    start = SkipAttribute(start, i->second);\n  }\n  return start;\n}\n\n// Skips a single attribute form's data.\nconst char* CompilationUnit::SkipAttribute(const char* start,\n                                                    enum DwarfForm form) {\n  size_t len;\n\n  switch (form) {\n    case DW_FORM_indirect:\n      form = static_cast<enum DwarfForm>(reader_->ReadUnsignedLEB128(start,\n                                                                     &len));\n      start += len;\n      return SkipAttribute(start, form);\n\n    case DW_FORM_flag_present:\n      return start;\n    case DW_FORM_data1:\n    case DW_FORM_flag:\n    case DW_FORM_ref1:\n      return start + 1;\n    case DW_FORM_ref2:\n    case DW_FORM_data2:\n      return start + 2;\n    case DW_FORM_ref4:\n    case DW_FORM_data4:\n      return start + 4;\n    case DW_FORM_ref8:\n    case DW_FORM_data8:\n    case DW_FORM_ref_sig8:\n      return start + 8;\n    case DW_FORM_string:\n      return start + strlen(start) + 1;\n    case DW_FORM_udata:\n    case DW_FORM_ref_udata:\n      reader_->ReadUnsignedLEB128(start, &len);\n      return start + len;\n\n    case DW_FORM_sdata:\n      reader_->ReadSignedLEB128(start, &len);\n      return start + len;\n    case DW_FORM_addr:\n      return start + reader_->AddressSize();\n    case DW_FORM_ref_addr:\n      // DWARF2 and 3 differ on whether ref_addr is address size or\n      // offset size.\n      assert(header_.version == 2 || header_.version == 3);\n      if (header_.version == 2) {\n        return start + reader_->AddressSize();\n      } else if (header_.version == 3) {\n        return start + reader_->OffsetSize();\n      }\n\n    case DW_FORM_block1:\n      return start + 1 + reader_->ReadOneByte(start);\n    case DW_FORM_block2:\n      return start + 2 + reader_->ReadTwoBytes(start);\n    case DW_FORM_block4:\n      return start + 4 + reader_->ReadFourBytes(start);\n    case DW_FORM_block:\n    case DW_FORM_exprloc: {\n      uint64 size = reader_->ReadUnsignedLEB128(start, &len);\n      return start + size + len;\n    }\n    case DW_FORM_strp:\n    case DW_FORM_sec_offset:\n      return start + reader_->OffsetSize();\n  }\n  fprintf(stderr,\"Unhandled form type\");\n  return NULL;\n}\n\n// Read a DWARF2/3 header.\n// The header is variable length in DWARF3 (and DWARF2 as extended by\n// most compilers), and consists of an length field, a version number,\n// the offset in the .debug_abbrev section for our abbrevs, and an\n// address size.\nvoid CompilationUnit::ReadHeader() {\n  const char* headerptr = buffer_;\n  size_t initial_length_size;\n\n  assert(headerptr + 4 < buffer_ + buffer_length_);\n  const uint64 initial_length\n    = reader_->ReadInitialLength(headerptr, &initial_length_size);\n  headerptr += initial_length_size;\n  header_.length = initial_length;\n\n  assert(headerptr + 2 < buffer_ + buffer_length_);\n  header_.version = reader_->ReadTwoBytes(headerptr);\n  headerptr += 2;\n\n  assert(headerptr + reader_->OffsetSize() < buffer_ + buffer_length_);\n  header_.abbrev_offset = reader_->ReadOffset(headerptr);\n  headerptr += reader_->OffsetSize();\n\n  assert(headerptr + 1 < buffer_ + buffer_length_);\n  header_.address_size = reader_->ReadOneByte(headerptr);\n  reader_->SetAddressSize(header_.address_size);\n  headerptr += 1;\n\n  after_header_ = headerptr;\n\n  // This check ensures that we don't have to do checking during the\n  // reading of DIEs. header_.length does not include the size of the\n  // initial length.\n  assert(buffer_ + initial_length_size + header_.length <=\n        buffer_ + buffer_length_);\n}\n\nuint64 CompilationUnit::Start() {\n  // First get the debug_info section.  \".debug_info\" is the name\n  // recommended in the DWARF spec, and used on Linux; \"__debug_info\"\n  // is the name used in Mac OS X Mach-O files.\n  SectionMap::const_iterator iter = sections_.find(\".debug_info\");\n  if (iter == sections_.end())\n    iter = sections_.find(\"__debug_info\");\n  assert(iter != sections_.end());\n\n  // Set up our buffer\n  buffer_ = iter->second.first + offset_from_section_start_;\n  buffer_length_ = iter->second.second - offset_from_section_start_;\n\n  // Read the header\n  ReadHeader();\n\n  // Figure out the real length from the end of the initial length to\n  // the end of the compilation unit, since that is the value we\n  // return.\n  uint64 ourlength = header_.length;\n  if (reader_->OffsetSize() == 8)\n    ourlength += 12;\n  else\n    ourlength += 4;\n\n  // See if the user wants this compilation unit, and if not, just return.\n  if (!handler_->StartCompilationUnit(offset_from_section_start_,\n                                      reader_->AddressSize(),\n                                      reader_->OffsetSize(),\n                                      header_.length,\n                                      header_.version))\n    return ourlength;\n\n  // Otherwise, continue by reading our abbreviation entries.\n  ReadAbbrevs();\n\n  // Set the string section if we have one.  \".debug_str\" is the name\n  // recommended in the DWARF spec, and used on Linux; \"__debug_str\"\n  // is the name used in Mac OS X Mach-O files.\n  iter = sections_.find(\".debug_str\");\n  if (iter == sections_.end())\n    iter = sections_.find(\"__debug_str\");\n  if (iter != sections_.end()) {\n    string_buffer_ = iter->second.first;\n    string_buffer_length_ = iter->second.second;\n  }\n\n  // Now that we have our abbreviations, start processing DIE's.\n  ProcessDIEs();\n\n  return ourlength;\n}\n\n// If one really wanted, you could merge SkipAttribute and\n// ProcessAttribute\n// This is all boring data manipulation and calling of the handler.\nconst char* CompilationUnit::ProcessAttribute(\n    uint64 dieoffset, const char* start, enum DwarfAttribute attr,\n    enum DwarfForm form) {\n  size_t len;\n\n  switch (form) {\n    // DW_FORM_indirect is never used because it is such a space\n    // waster.\n    case DW_FORM_indirect:\n      form = static_cast<enum DwarfForm>(reader_->ReadUnsignedLEB128(start,\n                                                                     &len));\n      start += len;\n      return ProcessAttribute(dieoffset, start, attr, form);\n\n    case DW_FORM_flag_present:\n      handler_->ProcessAttributeUnsigned(dieoffset, attr, form, 1);\n      return start;\n    case DW_FORM_data1:\n    case DW_FORM_flag:\n      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,\n                                         reader_->ReadOneByte(start));\n      return start + 1;\n    case DW_FORM_data2:\n      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,\n                                         reader_->ReadTwoBytes(start));\n      return start + 2;\n    case DW_FORM_data4:\n      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,\n                                         reader_->ReadFourBytes(start));\n      return start + 4;\n    case DW_FORM_data8:\n      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,\n                                         reader_->ReadEightBytes(start));\n      return start + 8;\n    case DW_FORM_string: {\n      const char* str = start;\n      handler_->ProcessAttributeString(dieoffset, attr, form,\n                                       str);\n      return start + strlen(str) + 1;\n    }\n    case DW_FORM_udata:\n      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,\n                                         reader_->ReadUnsignedLEB128(start,\n                                                                     &len));\n      return start + len;\n\n    case DW_FORM_sdata:\n      handler_->ProcessAttributeSigned(dieoffset, attr, form,\n                                      reader_->ReadSignedLEB128(start, &len));\n      return start + len;\n    case DW_FORM_addr:\n      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,\n                                         reader_->ReadAddress(start));\n      return start + reader_->AddressSize();\n    case DW_FORM_sec_offset:\n      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,\n                                         reader_->ReadOffset(start));\n      return start + reader_->OffsetSize();\n\n    case DW_FORM_ref1:\n      handler_->ProcessAttributeReference(dieoffset, attr, form,\n                                          reader_->ReadOneByte(start)\n                                          + offset_from_section_start_);\n      return start + 1;\n    case DW_FORM_ref2:\n      handler_->ProcessAttributeReference(dieoffset, attr, form,\n                                          reader_->ReadTwoBytes(start)\n                                          + offset_from_section_start_);\n      return start + 2;\n    case DW_FORM_ref4:\n      handler_->ProcessAttributeReference(dieoffset, attr, form,\n                                          reader_->ReadFourBytes(start)\n                                          + offset_from_section_start_);\n      return start + 4;\n    case DW_FORM_ref8:\n      handler_->ProcessAttributeReference(dieoffset, attr, form,\n                                          reader_->ReadEightBytes(start)\n                                          + offset_from_section_start_);\n      return start + 8;\n    case DW_FORM_ref_udata:\n      handler_->ProcessAttributeReference(dieoffset, attr, form,\n                                          reader_->ReadUnsignedLEB128(start,\n                                                                      &len)\n                                          + offset_from_section_start_);\n      return start + len;\n    case DW_FORM_ref_addr:\n      // DWARF2 and 3 differ on whether ref_addr is address size or\n      // offset size.\n      assert(header_.version == 2 || header_.version == 3);\n      if (header_.version == 2) {\n        handler_->ProcessAttributeReference(dieoffset, attr, form,\n                                            reader_->ReadAddress(start));\n        return start + reader_->AddressSize();\n      } else if (header_.version == 3) {\n        handler_->ProcessAttributeReference(dieoffset, attr, form,\n                                            reader_->ReadOffset(start));\n        return start + reader_->OffsetSize();\n      }\n      break;\n    case DW_FORM_ref_sig8:\n      handler_->ProcessAttributeSignature(dieoffset, attr, form,\n                                          reader_->ReadEightBytes(start));\n      return start + 8;\n\n    case DW_FORM_block1: {\n      uint64 datalen = reader_->ReadOneByte(start);\n      handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 1,\n                                       datalen);\n      return start + 1 + datalen;\n    }\n    case DW_FORM_block2: {\n      uint64 datalen = reader_->ReadTwoBytes(start);\n      handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 2,\n                                       datalen);\n      return start + 2 + datalen;\n    }\n    case DW_FORM_block4: {\n      uint64 datalen = reader_->ReadFourBytes(start);\n      handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 4,\n                                       datalen);\n      return start + 4 + datalen;\n    }\n    case DW_FORM_block:\n    case DW_FORM_exprloc: {\n      uint64 datalen = reader_->ReadUnsignedLEB128(start, &len);\n      handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + len,\n                                       datalen);\n      return start + datalen + len;\n    }\n    case DW_FORM_strp: {\n      assert(string_buffer_ != NULL);\n\n      const uint64 offset = reader_->ReadOffset(start);\n      assert(string_buffer_ + offset < string_buffer_ + string_buffer_length_);\n\n      const char* str = string_buffer_ + offset;\n      handler_->ProcessAttributeString(dieoffset, attr, form,\n                                       str);\n      return start + reader_->OffsetSize();\n    }\n  }\n  fprintf(stderr, \"Unhandled form type\\n\");\n  return NULL;\n}\n\nconst char* CompilationUnit::ProcessDIE(uint64 dieoffset,\n                                                 const char* start,\n                                                 const Abbrev& abbrev) {\n  for (AttributeList::const_iterator i = abbrev.attributes.begin();\n       i != abbrev.attributes.end();\n       i++)  {\n    start = ProcessAttribute(dieoffset, start, i->first, i->second);\n  }\n  return start;\n}\n\nvoid CompilationUnit::ProcessDIEs() {\n  const char* dieptr = after_header_;\n  size_t len;\n\n  // lengthstart is the place the length field is based on.\n  // It is the point in the header after the initial length field\n  const char* lengthstart = buffer_;\n\n  // In 64 bit dwarf, the initial length is 12 bytes, because of the\n  // 0xffffffff at the start.\n  if (reader_->OffsetSize() == 8)\n    lengthstart += 12;\n  else\n    lengthstart += 4;\n\n  std::stack<uint64> die_stack;\n  \n  while (dieptr < (lengthstart + header_.length)) {\n    // We give the user the absolute offset from the beginning of\n    // debug_info, since they need it to deal with ref_addr forms.\n    uint64 absolute_offset = (dieptr - buffer_) + offset_from_section_start_;\n\n    uint64 abbrev_num = reader_->ReadUnsignedLEB128(dieptr, &len);\n\n    dieptr += len;\n\n    // Abbrev == 0 represents the end of a list of children, or padding\n    // at the end of the compilation unit.\n    if (abbrev_num == 0) {\n      if (die_stack.size() == 0)\n        // If it is padding, then we are done with the compilation unit's DIEs.\n        return;\n      const uint64 offset = die_stack.top();\n      die_stack.pop();\n      handler_->EndDIE(offset);\n      continue;\n    }\n\n    const Abbrev& abbrev = abbrevs_->at(static_cast<size_t>(abbrev_num));\n    const enum DwarfTag tag = abbrev.tag;\n    if (!handler_->StartDIE(absolute_offset, tag, abbrev.attributes)) {\n      dieptr = SkipDIE(dieptr, abbrev);\n    } else {\n      dieptr = ProcessDIE(absolute_offset, dieptr, abbrev);\n    }\n\n    if (abbrev.has_children) {\n      die_stack.push(absolute_offset);\n    } else {\n      handler_->EndDIE(absolute_offset);\n    }\n  }\n}\n\nLineInfo::LineInfo(const char* buffer, uint64 buffer_length,\n                   ByteReader* reader, LineInfoHandler* handler):\n    handler_(handler), reader_(reader), buffer_(buffer),\n    buffer_length_(buffer_length) {\n  header_.std_opcode_lengths = NULL;\n}\n\nuint64 LineInfo::Start() {\n  ReadHeader();\n  ReadLines();\n  return after_header_ - buffer_;\n}\n\n// The header for a debug_line section is mildly complicated, because\n// the line info is very tightly encoded.\nvoid LineInfo::ReadHeader() {\n  const char* lineptr = buffer_;\n  size_t initial_length_size;\n\n  const uint64 initial_length\n    = reader_->ReadInitialLength(lineptr, &initial_length_size);\n\n  lineptr += initial_length_size;\n  header_.total_length = initial_length;\n  assert(buffer_ + initial_length_size + header_.total_length <=\n        buffer_ + buffer_length_);\n\n  // Address size *must* be set by CU ahead of time.\n  assert(reader_->AddressSize() != 0);\n\n  header_.version = reader_->ReadTwoBytes(lineptr);\n  lineptr += 2;\n\n  header_.prologue_length = reader_->ReadOffset(lineptr);\n  lineptr += reader_->OffsetSize();\n\n  header_.min_insn_length = reader_->ReadOneByte(lineptr);\n  lineptr += 1;\n\n  header_.default_is_stmt = reader_->ReadOneByte(lineptr);\n  lineptr += 1;\n\n  header_.line_base = *reinterpret_cast<const int8*>(lineptr);\n  lineptr += 1;\n\n  header_.line_range = reader_->ReadOneByte(lineptr);\n  lineptr += 1;\n\n  header_.opcode_base = reader_->ReadOneByte(lineptr);\n  lineptr += 1;\n\n  header_.std_opcode_lengths = new std::vector<unsigned char>;\n  header_.std_opcode_lengths->resize(header_.opcode_base + 1);\n  (*header_.std_opcode_lengths)[0] = 0;\n  for (int i = 1; i < header_.opcode_base; i++) {\n    (*header_.std_opcode_lengths)[i] = reader_->ReadOneByte(lineptr);\n    lineptr += 1;\n  }\n\n  // It is legal for the directory entry table to be empty.\n  if (*lineptr) {\n    uint32 dirindex = 1;\n    while (*lineptr) {\n      const char* dirname = lineptr;\n      handler_->DefineDir(dirname, dirindex);\n      lineptr += strlen(dirname) + 1;\n      dirindex++;\n    }\n  }\n  lineptr++;\n\n  // It is also legal for the file entry table to be empty.\n  if (*lineptr) {\n    uint32 fileindex = 1;\n    size_t len;\n    while (*lineptr) {\n      const char* filename = lineptr;\n      lineptr += strlen(filename) + 1;\n\n      uint64 dirindex = reader_->ReadUnsignedLEB128(lineptr, &len);\n      lineptr += len;\n\n      uint64 mod_time = reader_->ReadUnsignedLEB128(lineptr, &len);\n      lineptr += len;\n\n      uint64 filelength = reader_->ReadUnsignedLEB128(lineptr, &len);\n      lineptr += len;\n      handler_->DefineFile(filename, fileindex, static_cast<uint32>(dirindex), \n                           mod_time, filelength);\n      fileindex++;\n    }\n  }\n  lineptr++;\n\n  after_header_ = lineptr;\n}\n\n/* static */\nbool LineInfo::ProcessOneOpcode(ByteReader* reader,\n                                LineInfoHandler* handler,\n                                const struct LineInfoHeader &header,\n                                const char* start,\n                                struct LineStateMachine* lsm,\n                                size_t* len,\n                                uintptr pc,\n                                bool *lsm_passes_pc) {\n  size_t oplen = 0;\n  size_t templen;\n  uint8 opcode = reader->ReadOneByte(start);\n  oplen++;\n  start++;\n\n  // If the opcode is great than the opcode_base, it is a special\n  // opcode. Most line programs consist mainly of special opcodes.\n  if (opcode >= header.opcode_base) {\n    opcode -= header.opcode_base;\n    const int64 advance_address = (opcode / header.line_range)\n                                  * header.min_insn_length;\n    const int32 advance_line = (opcode % header.line_range)\n                               + header.line_base;\n\n    // Check if the lsm passes \"pc\". If so, mark it as passed.\n    if (lsm_passes_pc &&\n        lsm->address <= pc && pc < lsm->address + advance_address) {\n      *lsm_passes_pc = true;\n    }\n\n    lsm->address += advance_address;\n    lsm->line_num += advance_line;\n    lsm->basic_block = true;\n    *len = oplen;\n    return true;\n  }\n\n  // Otherwise, we have the regular opcodes\n  switch (opcode) {\n    case DW_LNS_copy: {\n      lsm->basic_block = false;\n      *len = oplen;\n      return true;\n    }\n\n    case DW_LNS_advance_pc: {\n      uint64 advance_address = reader->ReadUnsignedLEB128(start, &templen);\n      oplen += templen;\n\n      // Check if the lsm passes \"pc\". If so, mark it as passed.\n      if (lsm_passes_pc && lsm->address <= pc &&\n          pc < lsm->address + header.min_insn_length * advance_address) {\n        *lsm_passes_pc = true;\n      }\n\n      lsm->address += header.min_insn_length * advance_address;\n    }\n      break;\n    case DW_LNS_advance_line: {\n      const int64 advance_line = reader->ReadSignedLEB128(start, &templen);\n      oplen += templen;\n      lsm->line_num += static_cast<int32>(advance_line);\n\n      // With gcc 4.2.1, we can get the line_no here for the first time\n      // since DW_LNS_advance_line is called after DW_LNE_set_address is\n      // called. So we check if the lsm passes \"pc\" here, not in\n      // DW_LNE_set_address.\n      if (lsm_passes_pc && lsm->address == pc) {\n        *lsm_passes_pc = true;\n      }\n    }\n      break;\n    case DW_LNS_set_file: {\n      const uint64 fileno = reader->ReadUnsignedLEB128(start, &templen);\n      oplen += templen;\n      lsm->file_num = static_cast<uint32>(fileno);\n    }\n      break;\n    case DW_LNS_set_column: {\n      const uint64 colno = reader->ReadUnsignedLEB128(start, &templen);\n      oplen += templen;\n      lsm->column_num = static_cast<uint32>(colno);\n    }\n      break;\n    case DW_LNS_negate_stmt: {\n      lsm->is_stmt = !lsm->is_stmt;\n    }\n      break;\n    case DW_LNS_set_basic_block: {\n      lsm->basic_block = true;\n    }\n      break;\n    case DW_LNS_fixed_advance_pc: {\n      const uint16 advance_address = reader->ReadTwoBytes(start);\n      oplen += 2;\n\n      // Check if the lsm passes \"pc\". If so, mark it as passed.\n      if (lsm_passes_pc &&\n          lsm->address <= pc && pc < lsm->address + advance_address) {\n        *lsm_passes_pc = true;\n      }\n\n      lsm->address += advance_address;\n    }\n      break;\n    case DW_LNS_const_add_pc: {\n      const int64 advance_address = header.min_insn_length\n                                    * ((255 - header.opcode_base)\n                                       / header.line_range);\n\n      // Check if the lsm passes \"pc\". If so, mark it as passed.\n      if (lsm_passes_pc &&\n          lsm->address <= pc && pc < lsm->address + advance_address) {\n        *lsm_passes_pc = true;\n      }\n\n      lsm->address += advance_address;\n    }\n      break;\n    case DW_LNS_extended_op: {\n      const uint64 extended_op_len = reader->ReadUnsignedLEB128(start,\n                                                                &templen);\n      start += templen;\n      oplen += templen + extended_op_len;\n\n      const uint64 extended_op = reader->ReadOneByte(start);\n      start++;\n\n      switch (extended_op) {\n        case DW_LNE_end_sequence: {\n          lsm->end_sequence = true;\n          *len = oplen;\n          return true;\n        }\n          break;\n        case DW_LNE_set_address: {\n          // With gcc 4.2.1, we cannot tell the line_no here since\n          // DW_LNE_set_address is called before DW_LNS_advance_line is\n          // called.  So we do not check if the lsm passes \"pc\" here.  See\n          // also the comment in DW_LNS_advance_line.\n          uint64 address = reader->ReadAddress(start);\n          lsm->address = address;\n        }\n          break;\n        case DW_LNE_define_file: {\n          const char* filename  = start;\n\n          templen = strlen(filename) + 1;\n          start += templen;\n\n          uint64 dirindex = reader->ReadUnsignedLEB128(start, &templen);\n          oplen += templen;\n\n          const uint64 mod_time = reader->ReadUnsignedLEB128(start,\n                                                             &templen);\n          oplen += templen;\n\n          const uint64 filelength = reader->ReadUnsignedLEB128(start,\n                                                               &templen);\n          oplen += templen;\n\n          if (handler) {\n            handler->DefineFile(filename, -1, static_cast<uint32>(dirindex), \n                                mod_time, filelength);\n          }\n        }\n          break;\n      }\n    }\n      break;\n\n    default: {\n      // Ignore unknown opcode  silently\n      if (header.std_opcode_lengths) {\n        for (int i = 0; i < (*header.std_opcode_lengths)[opcode]; i++) {\n          reader->ReadUnsignedLEB128(start, &templen);\n          start += templen;\n          oplen += templen;\n        }\n      }\n    }\n      break;\n  }\n  *len = oplen;\n  return false;\n}\n\nvoid LineInfo::ReadLines() {\n  struct LineStateMachine lsm;\n\n  // lengthstart is the place the length field is based on.\n  // It is the point in the header after the initial length field\n  const char* lengthstart = buffer_;\n\n  // In 64 bit dwarf, the initial length is 12 bytes, because of the\n  // 0xffffffff at the start.\n  if (reader_->OffsetSize() == 8)\n    lengthstart += 12;\n  else\n    lengthstart += 4;\n\n  const char* lineptr = after_header_;\n  lsm.Reset(header_.default_is_stmt);\n\n  // The LineInfoHandler interface expects each line's length along\n  // with its address, but DWARF only provides addresses (sans\n  // length), and an end-of-sequence address; one infers the length\n  // from the next address. So we report a line only when we get the\n  // next line's address, or the end-of-sequence address.\n  bool have_pending_line = false;\n  uint64 pending_address = 0;\n  uint32 pending_file_num = 0, pending_line_num = 0, pending_column_num = 0;\n\n  while (lineptr < lengthstart + header_.total_length) {\n    size_t oplength;\n    bool add_row = ProcessOneOpcode(reader_, handler_, header_,\n                                    lineptr, &lsm, &oplength, (uintptr)-1,\n                                    NULL);\n    if (add_row) {\n      if (have_pending_line)\n        handler_->AddLine(pending_address, lsm.address - pending_address,\n                          pending_file_num, pending_line_num,\n                          pending_column_num);\n      if (lsm.end_sequence) {\n        lsm.Reset(header_.default_is_stmt);      \n        have_pending_line = false;\n      } else {\n        pending_address = lsm.address;\n        pending_file_num = lsm.file_num;\n        pending_line_num = lsm.line_num;\n        pending_column_num = lsm.column_num;\n        have_pending_line = true;\n      }\n    }\n    lineptr += oplength;\n  }\n\n  after_header_ = lengthstart + header_.total_length;\n}\n\n// A DWARF rule for recovering the address or value of a register, or\n// computing the canonical frame address. There is one subclass of this for\n// each '*Rule' member function in CallFrameInfo::Handler.\n//\n// It's annoying that we have to handle Rules using pointers (because\n// the concrete instances can have an arbitrary size). They're small,\n// so it would be much nicer if we could just handle them by value\n// instead of fretting about ownership and destruction.\n//\n// It seems like all these could simply be instances of std::tr1::bind,\n// except that we need instances to be EqualityComparable, too.\n//\n// This could logically be nested within State, but then the qualified names\n// get horrendous.\nclass CallFrameInfo::Rule {\n public:\n  virtual ~Rule() { }\n\n  // Tell HANDLER that, at ADDRESS in the program, REGISTER can be\n  // recovered using this rule. If REGISTER is kCFARegister, then this rule\n  // describes how to compute the canonical frame address. Return what the\n  // HANDLER member function returned.\n  virtual bool Handle(Handler *handler,\n                      uint64 address, int register) const = 0;\n\n  // Equality on rules. We use these to decide which rules we need\n  // to report after a DW_CFA_restore_state instruction.\n  virtual bool operator==(const Rule &rhs) const = 0;\n\n  bool operator!=(const Rule &rhs) const { return ! (*this == rhs); }\n\n  // Return a pointer to a copy of this rule.\n  virtual Rule *Copy() const = 0;\n\n  // If this is a base+offset rule, change its base register to REG.\n  // Otherwise, do nothing. (Ugly, but required for DW_CFA_def_cfa_register.)\n  virtual void SetBaseRegister(unsigned reg) { }\n\n  // If this is a base+offset rule, change its offset to OFFSET. Otherwise,\n  // do nothing. (Ugly, but required for DW_CFA_def_cfa_offset.)\n  virtual void SetOffset(long long offset) { }\n};\n\n// Rule: the value the register had in the caller cannot be recovered.\nclass CallFrameInfo::UndefinedRule: public CallFrameInfo::Rule {\n public:\n  UndefinedRule() { }\n  ~UndefinedRule() { }\n  bool Handle(Handler *handler, uint64 address, int reg) const {\n    return handler->UndefinedRule(address, reg);\n  }\n  bool operator==(const Rule &rhs) const {\n    // dynamic_cast is allowed by the Google C++ Style Guide, if the use has\n    // been carefully considered; cheap RTTI-like workarounds are forbidden.\n    const UndefinedRule *our_rhs = dynamic_cast<const UndefinedRule *>(&rhs);\n    return (our_rhs != NULL);\n  }\n  Rule *Copy() const { return new UndefinedRule(*this); }\n};\n\n// Rule: the register's value is the same as that it had in the caller.\nclass CallFrameInfo::SameValueRule: public CallFrameInfo::Rule {\n public:\n  SameValueRule() { }\n  ~SameValueRule() { }\n  bool Handle(Handler *handler, uint64 address, int reg) const {\n    return handler->SameValueRule(address, reg);\n  }\n  bool operator==(const Rule &rhs) const {\n    // dynamic_cast is allowed by the Google C++ Style Guide, if the use has\n    // been carefully considered; cheap RTTI-like workarounds are forbidden.\n    const SameValueRule *our_rhs = dynamic_cast<const SameValueRule *>(&rhs);\n    return (our_rhs != NULL);\n  }\n  Rule *Copy() const { return new SameValueRule(*this); }\n};\n\n// Rule: the register is saved at OFFSET from BASE_REGISTER.  BASE_REGISTER\n// may be CallFrameInfo::Handler::kCFARegister.\nclass CallFrameInfo::OffsetRule: public CallFrameInfo::Rule {\n public:\n  OffsetRule(int base_register, long offset)\n      : base_register_(base_register), offset_(offset) { }\n  ~OffsetRule() { }\n  bool Handle(Handler *handler, uint64 address, int reg) const {\n    return handler->OffsetRule(address, reg, base_register_, offset_);\n  }\n  bool operator==(const Rule &rhs) const {\n    // dynamic_cast is allowed by the Google C++ Style Guide, if the use has\n    // been carefully considered; cheap RTTI-like workarounds are forbidden.\n    const OffsetRule *our_rhs = dynamic_cast<const OffsetRule *>(&rhs);\n    return (our_rhs &&\n            base_register_ == our_rhs->base_register_ &&\n            offset_ == our_rhs->offset_);\n  }\n  Rule *Copy() const { return new OffsetRule(*this); }\n  // We don't actually need SetBaseRegister or SetOffset here, since they\n  // are only ever applied to CFA rules, for DW_CFA_def_cfa_offset, and it\n  // doesn't make sense to use OffsetRule for computing the CFA: it\n  // computes the address at which a register is saved, not a value.\n private:\n  int base_register_;\n  long offset_;\n};\n\n// Rule: the value the register had in the caller is the value of\n// BASE_REGISTER plus offset. BASE_REGISTER may be\n// CallFrameInfo::Handler::kCFARegister.\nclass CallFrameInfo::ValOffsetRule: public CallFrameInfo::Rule {\n public:\n  ValOffsetRule(int base_register, long offset)\n      : base_register_(base_register), offset_(offset) { }\n  ~ValOffsetRule() { }\n  bool Handle(Handler *handler, uint64 address, int reg) const {\n    return handler->ValOffsetRule(address, reg, base_register_, offset_);\n  }\n  bool operator==(const Rule &rhs) const {\n    // dynamic_cast is allowed by the Google C++ Style Guide, if the use has\n    // been carefully considered; cheap RTTI-like workarounds are forbidden.\n    const ValOffsetRule *our_rhs = dynamic_cast<const ValOffsetRule *>(&rhs);\n    return (our_rhs &&\n            base_register_ == our_rhs->base_register_ &&\n            offset_ == our_rhs->offset_);\n  }\n  Rule *Copy() const { return new ValOffsetRule(*this); }\n  void SetBaseRegister(unsigned reg) { base_register_ = reg; }\n  void SetOffset(long long offset) { offset_ = offset; }\n private:\n  int base_register_;\n  long offset_;\n};\n\n// Rule: the register has been saved in another register REGISTER_NUMBER_.\nclass CallFrameInfo::RegisterRule: public CallFrameInfo::Rule {\n public:\n  explicit RegisterRule(int register_number)\n      : register_number_(register_number) { }\n  ~RegisterRule() { }\n  bool Handle(Handler *handler, uint64 address, int reg) const {\n    return handler->RegisterRule(address, reg, register_number_);\n  }\n  bool operator==(const Rule &rhs) const {\n    // dynamic_cast is allowed by the Google C++ Style Guide, if the use has\n    // been carefully considered; cheap RTTI-like workarounds are forbidden.\n    const RegisterRule *our_rhs = dynamic_cast<const RegisterRule *>(&rhs);\n    return (our_rhs && register_number_ == our_rhs->register_number_);\n  }\n  Rule *Copy() const { return new RegisterRule(*this); }\n private:\n  int register_number_;\n};\n\n// Rule: EXPRESSION evaluates to the address at which the register is saved.\nclass CallFrameInfo::ExpressionRule: public CallFrameInfo::Rule {\n public:\n  explicit ExpressionRule(const std::string &expression)\n      : expression_(expression) { }\n  ~ExpressionRule() { }\n  bool Handle(Handler *handler, uint64 address, int reg) const {\n    return handler->ExpressionRule(address, reg, expression_);\n  }\n  bool operator==(const Rule &rhs) const {\n    // dynamic_cast is allowed by the Google C++ Style Guide, if the use has\n    // been carefully considered; cheap RTTI-like workarounds are forbidden.\n    const ExpressionRule *our_rhs = dynamic_cast<const ExpressionRule *>(&rhs);\n    return (our_rhs && expression_ == our_rhs->expression_);\n  }\n  Rule *Copy() const { return new ExpressionRule(*this); }\n private:\n  std::string expression_;\n};\n\n// Rule: EXPRESSION evaluates to the address at which the register is saved.\nclass CallFrameInfo::ValExpressionRule: public CallFrameInfo::Rule {\n public:\n  explicit ValExpressionRule(const std::string &expression)\n      : expression_(expression) { }\n  ~ValExpressionRule() { }\n  bool Handle(Handler *handler, uint64 address, int reg) const {\n    return handler->ValExpressionRule(address, reg, expression_);\n  }\n  bool operator==(const Rule &rhs) const {\n    // dynamic_cast is allowed by the Google C++ Style Guide, if the use has\n    // been carefully considered; cheap RTTI-like workarounds are forbidden.\n    const ValExpressionRule *our_rhs =\n        dynamic_cast<const ValExpressionRule *>(&rhs);\n    return (our_rhs && expression_ == our_rhs->expression_);\n  }\n  Rule *Copy() const { return new ValExpressionRule(*this); }\n private:\n  std::string expression_;\n};\n\n// A map from register numbers to rules.\nclass CallFrameInfo::RuleMap {\n public:\n  RuleMap() : cfa_rule_(NULL) { }\n  RuleMap(const RuleMap &rhs) : cfa_rule_(NULL) { *this = rhs; }\n  ~RuleMap() { Clear(); }\n\n  RuleMap &operator=(const RuleMap &rhs);\n\n  // Set the rule for computing the CFA to RULE. Take ownership of RULE.\n  void SetCFARule(Rule *rule) { delete cfa_rule_; cfa_rule_ = rule; }\n\n  // Return the current CFA rule. Unlike RegisterRule, this RuleMap retains\n  // ownership of the rule. We use this for DW_CFA_def_cfa_offset and\n  // DW_CFA_def_cfa_register, and for detecting references to the CFA before\n  // a rule for it has been established.\n  Rule *CFARule() const { return cfa_rule_; }\n\n  // Return the rule for REG, or NULL if there is none. The caller takes\n  // ownership of the result.\n  Rule *RegisterRule(int reg) const;\n\n  // Set the rule for computing REG to RULE. Take ownership of RULE.\n  void SetRegisterRule(int reg, Rule *rule);\n\n  // Make all the appropriate calls to HANDLER as if we were changing from\n  // this RuleMap to NEW_RULES at ADDRESS. We use this to implement\n  // DW_CFA_restore_state, where lots of rules can change simultaneously.\n  // Return true if all handlers returned true; otherwise, return false.\n  bool HandleTransitionTo(Handler *handler, uint64 address,\n                          const RuleMap &new_rules) const;\n\n private:\n  // A map from register numbers to Rules.\n  typedef std::map<int, Rule *> RuleByNumber;\n\n  // Remove all register rules and clear cfa_rule_.\n  void Clear();\n\n  // The rule for computing the canonical frame address. This RuleMap owns\n  // this rule.\n  Rule *cfa_rule_;\n\n  // A map from register numbers to postfix expressions to recover\n  // their values. This RuleMap owns the Rules the map refers to.\n  RuleByNumber registers_;\n};\n\nCallFrameInfo::RuleMap &CallFrameInfo::RuleMap::operator=(const RuleMap &rhs) {\n  Clear();\n  // Since each map owns the rules it refers to, assignment must copy them.\n  if (rhs.cfa_rule_) cfa_rule_ = rhs.cfa_rule_->Copy();\n  for (RuleByNumber::const_iterator it = rhs.registers_.begin();\n       it != rhs.registers_.end(); it++)\n    registers_[it->first] = it->second->Copy();\n  return *this;\n}\n\nCallFrameInfo::Rule *CallFrameInfo::RuleMap::RegisterRule(int reg) const {\n  assert(reg != Handler::kCFARegister);\n  RuleByNumber::const_iterator it = registers_.find(reg);\n  if (it != registers_.end())\n    return it->second->Copy();\n  else\n    return NULL;\n}\n\nvoid CallFrameInfo::RuleMap::SetRegisterRule(int reg, Rule *rule) {\n  assert(reg != Handler::kCFARegister);\n  assert(rule);\n  Rule **slot = &registers_[reg];\n  delete *slot;\n  *slot = rule;\n}\n\nbool CallFrameInfo::RuleMap::HandleTransitionTo(\n    Handler *handler,\n    uint64 address,\n    const RuleMap &new_rules) const {\n  // Transition from cfa_rule_ to new_rules.cfa_rule_.\n  if (cfa_rule_ && new_rules.cfa_rule_) {\n    if (*cfa_rule_ != *new_rules.cfa_rule_ &&\n        !new_rules.cfa_rule_->Handle(handler, address,\n                                     Handler::kCFARegister))\n      return false;\n  } else if (cfa_rule_) {\n    // this RuleMap has a CFA rule but new_rules doesn't.\n    // CallFrameInfo::Handler has no way to handle this --- and shouldn't;\n    // it's garbage input. The instruction interpreter should have\n    // detected this and warned, so take no action here.\n  } else if (new_rules.cfa_rule_) {\n    // This shouldn't be possible: NEW_RULES is some prior state, and\n    // there's no way to remove entries.\n    assert(0);\n  } else {\n    // Both CFA rules are empty.  No action needed.\n  }\n\n  // Traverse the two maps in order by register number, and report\n  // whatever differences we find.\n  RuleByNumber::const_iterator old_it = registers_.begin();\n  RuleByNumber::const_iterator new_it = new_rules.registers_.begin();\n  while (old_it != registers_.end() && new_it != new_rules.registers_.end()) {\n    if (old_it->first < new_it->first) {\n      // This RuleMap has an entry for old_it->first, but NEW_RULES\n      // doesn't.\n      //\n      // This isn't really the right thing to do, but since CFI generally\n      // only mentions callee-saves registers, and GCC's convention for\n      // callee-saves registers is that they are unchanged, it's a good\n      // approximation.\n      if (!handler->SameValueRule(address, old_it->first))\n        return false;\n      old_it++;\n    } else if (old_it->first > new_it->first) {\n      // NEW_RULES has entry for new_it->first, but this RuleMap\n      // doesn't. This shouldn't be possible: NEW_RULES is some prior\n      // state, and there's no way to remove entries.\n      assert(0);\n    } else {\n      // Both maps have an entry for this register. Report the new\n      // rule if it is different.\n      if (*old_it->second != *new_it->second &&\n          !new_it->second->Handle(handler, address, new_it->first))\n        return false;\n      new_it++, old_it++;\n    }\n  }\n  // Finish off entries from this RuleMap with no counterparts in new_rules.\n  while (old_it != registers_.end()) {\n    if (!handler->SameValueRule(address, old_it->first))\n      return false;\n    old_it++;\n  }\n  // Since we only make transitions from a rule set to some previously\n  // saved rule set, and we can only add rules to the map, NEW_RULES\n  // must have fewer rules than *this.\n  assert(new_it == new_rules.registers_.end());\n\n  return true;\n}\n\n// Remove all register rules and clear cfa_rule_.\nvoid CallFrameInfo::RuleMap::Clear() {\n  delete cfa_rule_;\n  cfa_rule_ = NULL;\n  for (RuleByNumber::iterator it = registers_.begin();\n       it != registers_.end(); it++)\n    delete it->second;\n  registers_.clear();\n}\n\n// The state of the call frame information interpreter as it processes\n// instructions from a CIE and FDE.\nclass CallFrameInfo::State {\n public:\n  // Create a call frame information interpreter state with the given\n  // reporter, reader, handler, and initial call frame info address.\n  State(ByteReader *reader, Handler *handler, Reporter *reporter,\n        uint64 address)\n      : reader_(reader), handler_(handler), reporter_(reporter),\n        address_(address), entry_(NULL), cursor_(NULL) { }\n\n  // Interpret instructions from CIE, save the resulting rule set for\n  // DW_CFA_restore instructions, and return true. On error, report\n  // the problem to reporter_ and return false.\n  bool InterpretCIE(const CIE &cie);\n\n  // Interpret instructions from FDE, and return true. On error,\n  // report the problem to reporter_ and return false.\n  bool InterpretFDE(const FDE &fde);\n\n private:  \n  // The operands of a CFI instruction, for ParseOperands.\n  struct Operands {\n    unsigned register_number;  // A register number.\n    uint64 offset;             // An offset or address.\n    long signed_offset;        // A signed offset.\n    std::string expression;    // A DWARF expression.\n  };\n\n  // Parse CFI instruction operands from STATE's instruction stream as\n  // described by FORMAT. On success, populate OPERANDS with the\n  // results, and return true. On failure, report the problem and\n  // return false.\n  //\n  // Each character of FORMAT should be one of the following:\n  //\n  //   'r'  unsigned LEB128 register number (OPERANDS->register_number)\n  //   'o'  unsigned LEB128 offset          (OPERANDS->offset)\n  //   's'  signed LEB128 offset            (OPERANDS->signed_offset)\n  //   'a'  machine-size address            (OPERANDS->offset)\n  //        (If the CIE has a 'z' augmentation string, 'a' uses the\n  //        encoding specified by the 'R' argument.)\n  //   '1'  a one-byte offset               (OPERANDS->offset)\n  //   '2'  a two-byte offset               (OPERANDS->offset)\n  //   '4'  a four-byte offset              (OPERANDS->offset)\n  //   '8'  an eight-byte offset            (OPERANDS->offset)\n  //   'e'  a DW_FORM_block holding a       (OPERANDS->expression)\n  //        DWARF expression\n  bool ParseOperands(const char *format, Operands *operands);\n\n  // Interpret one CFI instruction from STATE's instruction stream, update\n  // STATE, report any rule changes to handler_, and return true. On\n  // failure, report the problem and return false.\n  bool DoInstruction();\n\n  // The following Do* member functions are subroutines of DoInstruction,\n  // factoring out the actual work of operations that have several\n  // different encodings.\n\n  // Set the CFA rule to be the value of BASE_REGISTER plus OFFSET, and\n  // return true. On failure, report and return false. (Used for\n  // DW_CFA_def_cfa and DW_CFA_def_cfa_sf.)\n  bool DoDefCFA(unsigned base_register, long offset);\n\n  // Change the offset of the CFA rule to OFFSET, and return true. On\n  // failure, report and return false. (Subroutine for\n  // DW_CFA_def_cfa_offset and DW_CFA_def_cfa_offset_sf.)\n  bool DoDefCFAOffset(long offset);\n\n  // Specify that REG can be recovered using RULE, and return true. On\n  // failure, report and return false.\n  bool DoRule(unsigned reg, Rule *rule);\n\n  // Specify that REG can be found at OFFSET from the CFA, and return true.\n  // On failure, report and return false. (Subroutine for DW_CFA_offset,\n  // DW_CFA_offset_extended, and DW_CFA_offset_extended_sf.)\n  bool DoOffset(unsigned reg, long offset);\n\n  // Specify that the caller's value for REG is the CFA plus OFFSET,\n  // and return true. On failure, report and return false. (Subroutine\n  // for DW_CFA_val_offset and DW_CFA_val_offset_sf.)\n  bool DoValOffset(unsigned reg, long offset);\n\n  // Restore REG to the rule established in the CIE, and return true. On\n  // failure, report and return false. (Subroutine for DW_CFA_restore and\n  // DW_CFA_restore_extended.)\n  bool DoRestore(unsigned reg);\n\n  // Return the section offset of the instruction at cursor. For use\n  // in error messages.\n  uint64 CursorOffset() { return entry_->offset + (cursor_ - entry_->start); }\n\n  // Report that entry_ is incomplete, and return false. For brevity.\n  bool ReportIncomplete() {\n    reporter_->Incomplete(entry_->offset, entry_->kind);\n    return false;\n  }\n\n  // For reading multi-byte values with the appropriate endianness.\n  ByteReader *reader_;\n\n  // The handler to which we should report the data we find.\n  Handler *handler_;\n\n  // For reporting problems in the info we're parsing.\n  Reporter *reporter_;\n\n  // The code address to which the next instruction in the stream applies.\n  uint64 address_;\n\n  // The entry whose instructions we are currently processing. This is\n  // first a CIE, and then an FDE.\n  const Entry *entry_;\n\n  // The next instruction to process.\n  const char *cursor_;\n\n  // The current set of rules.\n  RuleMap rules_;\n\n  // The set of rules established by the CIE, used by DW_CFA_restore\n  // and DW_CFA_restore_extended. We set this after interpreting the\n  // CIE's instructions.\n  RuleMap cie_rules_;\n\n  // A stack of saved states, for DW_CFA_remember_state and\n  // DW_CFA_restore_state.\n  std::stack<RuleMap> saved_rules_;\n};\n\nbool CallFrameInfo::State::InterpretCIE(const CIE &cie) {\n  entry_ = &cie;\n  cursor_ = entry_->instructions;\n  while (cursor_ < entry_->end)\n    if (!DoInstruction())\n      return false;\n  // Note the rules established by the CIE, for use by DW_CFA_restore\n  // and DW_CFA_restore_extended.\n  cie_rules_ = rules_;\n  return true;\n}\n\nbool CallFrameInfo::State::InterpretFDE(const FDE &fde) {\n  entry_ = &fde;\n  cursor_ = entry_->instructions;\n  while (cursor_ < entry_->end)\n    if (!DoInstruction())\n      return false;\n  return true;\n}\n\nbool CallFrameInfo::State::ParseOperands(const char *format,\n                                         Operands *operands) {\n  size_t len;\n  const char *operand;\n\n  for (operand = format; *operand; operand++) {\n    size_t bytes_left = entry_->end - cursor_;\n    switch (*operand) {\n      case 'r':\n        operands->register_number = reader_->ReadUnsignedLEB128(cursor_, &len);\n        if (len > bytes_left) return ReportIncomplete();\n        cursor_ += len;\n        break;\n\n      case 'o':\n        operands->offset = reader_->ReadUnsignedLEB128(cursor_, &len);\n        if (len > bytes_left) return ReportIncomplete();\n        cursor_ += len;\n        break;\n\n      case 's':\n        operands->signed_offset = reader_->ReadSignedLEB128(cursor_, &len);\n        if (len > bytes_left) return ReportIncomplete();\n        cursor_ += len;\n        break;\n\n      case 'a':\n        operands->offset =\n          reader_->ReadEncodedPointer(cursor_, entry_->cie->pointer_encoding,\n                                      &len);\n        if (len > bytes_left) return ReportIncomplete();\n        cursor_ += len;\n        break;\n\n      case '1':\n        if (1 > bytes_left) return ReportIncomplete();\n        operands->offset = static_cast<unsigned char>(*cursor_++);\n        break;\n\n      case '2':\n        if (2 > bytes_left) return ReportIncomplete();\n        operands->offset = reader_->ReadTwoBytes(cursor_);\n        cursor_ += 2;\n        break;\n\n      case '4':\n        if (4 > bytes_left) return ReportIncomplete();\n        operands->offset = reader_->ReadFourBytes(cursor_);\n        cursor_ += 4;\n        break;\n\n      case '8':\n        if (8 > bytes_left) return ReportIncomplete();\n        operands->offset = reader_->ReadEightBytes(cursor_);\n        cursor_ += 8;\n        break;\n\n      case 'e': {\n        size_t expression_length = reader_->ReadUnsignedLEB128(cursor_, &len);\n        if (len > bytes_left || expression_length > bytes_left - len)\n          return ReportIncomplete();\n        cursor_ += len;\n        operands->expression = std::string(cursor_, expression_length);\n        cursor_ += expression_length;\n        break;\n      }\n\n      default:\n          assert(0);\n    }\n  }\n\n  return true;\n}\n\nbool CallFrameInfo::State::DoInstruction() {\n  CIE *cie = entry_->cie;\n  Operands ops;\n\n  // Our entry's kind should have been set by now.\n  assert(entry_->kind != kUnknown);\n\n  // We shouldn't have been invoked unless there were more\n  // instructions to parse.\n  assert(cursor_ < entry_->end);\n\n  unsigned opcode = *cursor_++;\n  if ((opcode & 0xc0) != 0) {\n    switch (opcode & 0xc0) {\n      // Advance the address.\n      case DW_CFA_advance_loc: {\n        size_t code_offset = opcode & 0x3f;\n        address_ += code_offset * cie->code_alignment_factor;\n        break;\n      }\n\n      // Find a register at an offset from the CFA.\n      case DW_CFA_offset:\n        if (!ParseOperands(\"o\", &ops) ||\n            !DoOffset(opcode & 0x3f, ops.offset * cie->data_alignment_factor))\n          return false;\n        break;\n\n      // Restore the rule established for a register by the CIE.\n      case DW_CFA_restore:\n        if (!DoRestore(opcode & 0x3f)) return false;\n        break;\n\n      // The 'if' above should have excluded this possibility.\n      default:\n        assert(0);\n    }\n\n    // Return here, so the big switch below won't be indented.\n    return true;\n  }\n\n  switch (opcode) {\n    // Set the address.\n    case DW_CFA_set_loc:\n      if (!ParseOperands(\"a\", &ops)) return false;\n      address_ = ops.offset;\n      break;\n\n    // Advance the address.\n    case DW_CFA_advance_loc1:\n      if (!ParseOperands(\"1\", &ops)) return false;\n      address_ += ops.offset * cie->code_alignment_factor;\n      break;\n      \n    // Advance the address.\n    case DW_CFA_advance_loc2:\n      if (!ParseOperands(\"2\", &ops)) return false;\n      address_ += ops.offset * cie->code_alignment_factor;\n      break;\n      \n    // Advance the address.\n    case DW_CFA_advance_loc4:\n      if (!ParseOperands(\"4\", &ops)) return false;\n      address_ += ops.offset * cie->code_alignment_factor;\n      break;\n      \n    // Advance the address.\n    case DW_CFA_MIPS_advance_loc8:\n      if (!ParseOperands(\"8\", &ops)) return false;\n      address_ += ops.offset * cie->code_alignment_factor;\n      break;\n\n    // Compute the CFA by adding an offset to a register.\n    case DW_CFA_def_cfa:\n      if (!ParseOperands(\"ro\", &ops) ||\n          !DoDefCFA(ops.register_number, ops.offset))\n        return false;\n      break;\n\n    // Compute the CFA by adding an offset to a register.\n    case DW_CFA_def_cfa_sf:\n      if (!ParseOperands(\"rs\", &ops) ||\n          !DoDefCFA(ops.register_number,\n                    ops.signed_offset * cie->data_alignment_factor))\n        return false;\n      break;\n\n    // Change the base register used to compute the CFA.\n    case DW_CFA_def_cfa_register: {\n      Rule *cfa_rule = rules_.CFARule();\n      if (!cfa_rule) {\n        reporter_->NoCFARule(entry_->offset, entry_->kind, CursorOffset());\n        return false;\n      }\n      if (!ParseOperands(\"r\", &ops)) return false;\n      cfa_rule->SetBaseRegister(ops.register_number);\n      if (!cfa_rule->Handle(handler_, address_,\n                            Handler::kCFARegister))\n        return false;\n      break;\n    }\n\n    // Change the offset used to compute the CFA.\n    case DW_CFA_def_cfa_offset:\n      if (!ParseOperands(\"o\", &ops) ||\n          !DoDefCFAOffset(ops.offset))\n        return false;\n      break;\n\n    // Change the offset used to compute the CFA.\n    case DW_CFA_def_cfa_offset_sf:\n      if (!ParseOperands(\"s\", &ops) ||\n          !DoDefCFAOffset(ops.signed_offset * cie->data_alignment_factor))\n        return false;\n      break;\n\n    // Specify an expression whose value is the CFA.\n    case DW_CFA_def_cfa_expression: {\n      if (!ParseOperands(\"e\", &ops))\n        return false;\n      Rule *rule = new ValExpressionRule(ops.expression);\n      rules_.SetCFARule(rule);\n      if (!rule->Handle(handler_, address_,\n                        Handler::kCFARegister))\n        return false;\n      break;\n    }\n\n    // The register's value cannot be recovered.\n    case DW_CFA_undefined: {\n      if (!ParseOperands(\"r\", &ops) ||\n          !DoRule(ops.register_number, new UndefinedRule()))\n        return false;\n      break;\n    }\n\n    // The register's value is unchanged from its value in the caller.\n    case DW_CFA_same_value: {\n      if (!ParseOperands(\"r\", &ops) ||\n          !DoRule(ops.register_number, new SameValueRule()))\n        return false;\n      break;\n    }\n\n    // Find a register at an offset from the CFA.\n    case DW_CFA_offset_extended:\n      if (!ParseOperands(\"ro\", &ops) ||\n          !DoOffset(ops.register_number,\n                    ops.offset * cie->data_alignment_factor))\n        return false;\n      break;\n\n    // The register is saved at an offset from the CFA.\n    case DW_CFA_offset_extended_sf:\n      if (!ParseOperands(\"rs\", &ops) ||\n          !DoOffset(ops.register_number,\n                    ops.signed_offset * cie->data_alignment_factor))\n        return false;\n      break;\n\n    // The register is saved at an offset from the CFA.\n    case DW_CFA_GNU_negative_offset_extended:\n      if (!ParseOperands(\"ro\", &ops) ||\n          !DoOffset(ops.register_number,\n                    -ops.offset * cie->data_alignment_factor))\n        return false;\n      break;\n\n    // The register's value is the sum of the CFA plus an offset.\n    case DW_CFA_val_offset:\n      if (!ParseOperands(\"ro\", &ops) ||\n          !DoValOffset(ops.register_number,\n                       ops.offset * cie->data_alignment_factor))\n        return false;\n      break;\n\n    // The register's value is the sum of the CFA plus an offset.\n    case DW_CFA_val_offset_sf:\n      if (!ParseOperands(\"rs\", &ops) ||\n          !DoValOffset(ops.register_number,\n                       ops.signed_offset * cie->data_alignment_factor))\n        return false;\n      break;\n\n    // The register has been saved in another register.\n    case DW_CFA_register: {\n      if (!ParseOperands(\"ro\", &ops) ||\n          !DoRule(ops.register_number, new RegisterRule(ops.offset)))\n        return false;\n      break;\n    }\n\n    // An expression yields the address at which the register is saved.\n    case DW_CFA_expression: {\n      if (!ParseOperands(\"re\", &ops) ||\n          !DoRule(ops.register_number, new ExpressionRule(ops.expression)))\n        return false;\n      break;\n    }\n\n    // An expression yields the caller's value for the register.\n    case DW_CFA_val_expression: {\n      if (!ParseOperands(\"re\", &ops) ||\n          !DoRule(ops.register_number, new ValExpressionRule(ops.expression)))\n        return false;\n      break;\n    }\n\n    // Restore the rule established for a register by the CIE.\n    case DW_CFA_restore_extended:\n      if (!ParseOperands(\"r\", &ops) ||\n          !DoRestore( ops.register_number))\n        return false;\n      break;\n\n    // Save the current set of rules on a stack.\n    case DW_CFA_remember_state:\n      saved_rules_.push(rules_);\n      break;\n\n    // Pop the current set of rules off the stack.\n    case DW_CFA_restore_state: {\n      if (saved_rules_.empty()) {\n        reporter_->EmptyStateStack(entry_->offset, entry_->kind,\n                                   CursorOffset());\n        return false;\n      }\n      const RuleMap &new_rules = saved_rules_.top();\n      if (rules_.CFARule() && !new_rules.CFARule()) {\n        reporter_->ClearingCFARule(entry_->offset, entry_->kind,\n                                   CursorOffset());\n        return false;\n      }\n      rules_.HandleTransitionTo(handler_, address_, new_rules);\n      rules_ = new_rules;\n      saved_rules_.pop();\n      break;\n    }\n\n    // No operation.  (Padding instruction.)\n    case DW_CFA_nop:\n      break;\n\n    // A SPARC register window save: Registers 8 through 15 (%o0-%o7)\n    // are saved in registers 24 through 31 (%i0-%i7), and registers\n    // 16 through 31 (%l0-%l7 and %i0-%i7) are saved at CFA offsets\n    // (0-15 * the register size). The register numbers must be\n    // hard-coded. A GNU extension, and not a pretty one.\n    case DW_CFA_GNU_window_save: {\n      // Save %o0-%o7 in %i0-%i7.\n      for (int i = 8; i < 16; i++)\n        if (!DoRule(i, new RegisterRule(i + 16)))\n          return false;\n      // Save %l0-%l7 and %i0-%i7 at the CFA.\n      for (int i = 16; i < 32; i++)\n        // Assume that the byte reader's address size is the same as\n        // the architecture's register size. !@#%*^ hilarious.\n        if (!DoRule(i, new OffsetRule(Handler::kCFARegister,\n                                      (i - 16) * reader_->AddressSize())))\n          return false;\n      break;\n    }\n\n    // I'm not sure what this is. GDB doesn't use it for unwinding.\n    case DW_CFA_GNU_args_size:\n      if (!ParseOperands(\"o\", &ops)) return false;\n      break;\n\n    // An opcode we don't recognize.\n    default: {\n      reporter_->BadInstruction(entry_->offset, entry_->kind, CursorOffset());\n      return false;\n    }\n  }\n\n  return true;\n}\n\nbool CallFrameInfo::State::DoDefCFA(unsigned base_register, long offset) {\n  Rule *rule = new ValOffsetRule(base_register, offset);\n  rules_.SetCFARule(rule);\n  return rule->Handle(handler_, address_,\n                      Handler::kCFARegister);\n}\n\nbool CallFrameInfo::State::DoDefCFAOffset(long offset) {\n  Rule *cfa_rule = rules_.CFARule();\n  if (!cfa_rule) {\n    reporter_->NoCFARule(entry_->offset, entry_->kind, CursorOffset());\n    return false;\n  }\n  cfa_rule->SetOffset(offset);\n  return cfa_rule->Handle(handler_, address_,\n                          Handler::kCFARegister);\n}\n\nbool CallFrameInfo::State::DoRule(unsigned reg, Rule *rule) {\n  rules_.SetRegisterRule(reg, rule);\n  return rule->Handle(handler_, address_, reg);\n}\n\nbool CallFrameInfo::State::DoOffset(unsigned reg, long offset) {\n  if (!rules_.CFARule()) {\n    reporter_->NoCFARule(entry_->offset, entry_->kind, CursorOffset());\n    return false;\n  }\n  return DoRule(reg,\n                new OffsetRule(Handler::kCFARegister, offset));\n}\n\nbool CallFrameInfo::State::DoValOffset(unsigned reg, long offset) {\n  if (!rules_.CFARule()) {\n    reporter_->NoCFARule(entry_->offset, entry_->kind, CursorOffset());\n    return false;\n  }\n  return DoRule(reg,\n                new ValOffsetRule(Handler::kCFARegister, offset));\n}\n\nbool CallFrameInfo::State::DoRestore(unsigned reg) {\n  // DW_CFA_restore and DW_CFA_restore_extended don't make sense in a CIE.\n  if (entry_->kind == kCIE) {\n    reporter_->RestoreInCIE(entry_->offset, CursorOffset());\n    return false;\n  }\n  Rule *rule = cie_rules_.RegisterRule(reg);\n  if (!rule) {\n    // This isn't really the right thing to do, but since CFI generally\n    // only mentions callee-saves registers, and GCC's convention for\n    // callee-saves registers is that they are unchanged, it's a good\n    // approximation.\n    rule = new SameValueRule();\n  }\n  return DoRule(reg, rule);\n}\n\nbool CallFrameInfo::ReadEntryPrologue(const char *cursor, Entry *entry) {\n  const char *buffer_end = buffer_ + buffer_length_;\n\n  // Initialize enough of ENTRY for use in error reporting.\n  entry->offset = cursor - buffer_;\n  entry->start = cursor;\n  entry->kind = kUnknown;\n  entry->end = NULL;\n\n  // Read the initial length. This sets reader_'s offset size.\n  size_t length_size;\n  uint64 length = reader_->ReadInitialLength(cursor, &length_size);\n  if (length_size > size_t(buffer_end - cursor))\n    return ReportIncomplete(entry);\n  cursor += length_size;\n\n  // In a .eh_frame section, a length of zero marks the end of the series\n  // of entries.\n  if (length == 0 && eh_frame_) {\n    entry->kind = kTerminator;\n    entry->end = cursor;\n    return true;\n  }\n\n  // Validate the length.\n  if (length > size_t(buffer_end - cursor))\n    return ReportIncomplete(entry);\n \n  // The length is the number of bytes after the initial length field;\n  // we have that position handy at this point, so compute the end\n  // now. (If we're parsing 64-bit-offset DWARF on a 32-bit machine,\n  // and the length didn't fit in a size_t, we would have rejected it\n  // above.)\n  entry->end = cursor + length;\n\n  // Parse the next field: either the offset of a CIE or a CIE id.\n  size_t offset_size = reader_->OffsetSize();\n  if (offset_size > size_t(entry->end - cursor)) return ReportIncomplete(entry);\n  entry->id = reader_->ReadOffset(cursor);\n\n  // Don't advance cursor past id field yet; in .eh_frame data we need\n  // the id's position to compute the section offset of an FDE's CIE.\n\n  // Now we can decide what kind of entry this is.\n  if (eh_frame_) {\n    // In .eh_frame data, an ID of zero marks the entry as a CIE, and\n    // anything else is an offset from the id field of the FDE to the start\n    // of the CIE.\n    if (entry->id == 0) {\n      entry->kind = kCIE;\n    } else {\n      entry->kind = kFDE;\n      // Turn the offset from the id into an offset from the buffer's start.\n      entry->id = (cursor - buffer_) - entry->id;\n    }\n  } else {\n    // In DWARF CFI data, an ID of ~0 (of the appropriate width, given the\n    // offset size for the entry) marks the entry as a CIE, and anything\n    // else is the offset of the CIE from the beginning of the section.\n    if (offset_size == 4)\n      entry->kind = (entry->id == 0xffffffff) ? kCIE : kFDE;\n    else {\n      assert(offset_size == 8);\n      entry->kind = (entry->id == 0xffffffffffffffffULL) ? kCIE : kFDE;\n    }\n  }\n\n  // Now advance cursor past the id.\n   cursor += offset_size;\n \n  // The fields specific to this kind of entry start here.\n  entry->fields = cursor;\n\n  entry->cie = NULL;\n\n  return true;\n}\n\nbool CallFrameInfo::ReadCIEFields(CIE *cie) {\n  const char *cursor = cie->fields;\n  size_t len;\n\n  assert(cie->kind == kCIE);\n\n  // Prepare for early exit.\n  cie->version = 0;\n  cie->augmentation.clear();\n  cie->code_alignment_factor = 0;\n  cie->data_alignment_factor = 0;\n  cie->return_address_register = 0;\n  cie->has_z_augmentation = false;\n  cie->pointer_encoding = DW_EH_PE_absptr;\n  cie->instructions = 0;\n\n  // Parse the version number.\n  if (cie->end - cursor < 1)\n    return ReportIncomplete(cie);\n  cie->version = reader_->ReadOneByte(cursor);\n  cursor++;\n\n  // If we don't recognize the version, we can't parse any more fields of the\n  // CIE. For DWARF CFI, we handle versions 1 through 3 (there was never a\n  // version 2 of CFI data). For .eh_frame, we handle versions 1 and 3 as well;\n  // the difference between those versions seems to be the same as for\n  // .debug_frame.\n  if (cie->version < 1 || cie->version > 3) {\n    reporter_->UnrecognizedVersion(cie->offset, cie->version);\n    return false;\n  }\n\n  const char *augmentation_start = cursor;\n  const void *augmentation_end =\n      memchr(augmentation_start, '\\0', cie->end - augmentation_start);\n  if (! augmentation_end) return ReportIncomplete(cie);\n  cursor = static_cast<const char *>(augmentation_end);\n  cie->augmentation = std::string(augmentation_start,\n                                  cursor - augmentation_start);\n  // Skip the terminating '\\0'.\n  cursor++;\n\n  // Is this CFI augmented?\n  if (!cie->augmentation.empty()) {\n    // Is it an augmentation we recognize?\n    if (cie->augmentation[0] == DW_Z_augmentation_start) {\n      // Linux C++ ABI 'z' augmentation, used for exception handling data.\n      cie->has_z_augmentation = true;\n    } else {\n      // Not an augmentation we recognize. Augmentations can have arbitrary\n      // effects on the form of rest of the content, so we have to give up.\n      reporter_->UnrecognizedAugmentation(cie->offset, cie->augmentation);\n      return false;\n    }\n  }\n\n  // Parse the code alignment factor.\n  cie->code_alignment_factor = reader_->ReadUnsignedLEB128(cursor, &len);\n  if (size_t(cie->end - cursor) < len) return ReportIncomplete(cie);\n  cursor += len;\n  \n  // Parse the data alignment factor.\n  cie->data_alignment_factor = reader_->ReadSignedLEB128(cursor, &len);\n  if (size_t(cie->end - cursor) < len) return ReportIncomplete(cie);\n  cursor += len;\n  \n  // Parse the return address register. This is a ubyte in version 1, and\n  // a ULEB128 in version 3.\n  if (cie->version == 1) {\n    if (cursor >= cie->end) return ReportIncomplete(cie);\n    cie->return_address_register = uint8(*cursor++);\n  } else {\n    cie->return_address_register = reader_->ReadUnsignedLEB128(cursor, &len);\n    if (size_t(cie->end - cursor) < len) return ReportIncomplete(cie);\n    cursor += len;\n  }\n\n  // If we have a 'z' augmentation string, find the augmentation data and\n  // use the augmentation string to parse it.\n  if (cie->has_z_augmentation) {\n    uint64_t data_size = reader_->ReadUnsignedLEB128(cursor, &len);\n    if (size_t(cie->end - cursor) < len + data_size)\n      return ReportIncomplete(cie);\n    cursor += len;\n    const char *data = cursor;\n    cursor += data_size;\n    const char *data_end = cursor;\n\n    cie->has_z_lsda = false;\n    cie->has_z_personality = false;\n    cie->has_z_signal_frame = false;\n\n    // Walk the augmentation string, and extract values from the\n    // augmentation data as the string directs.\n    for (size_t i = 1; i < cie->augmentation.size(); i++) {\n      switch (cie->augmentation[i]) {\n        case DW_Z_has_LSDA:\n          // The CIE's augmentation data holds the language-specific data\n          // area pointer's encoding, and the FDE's augmentation data holds\n          // the pointer itself.\n          cie->has_z_lsda = true;\n          // Fetch the LSDA encoding from the augmentation data.\n          if (data >= data_end) return ReportIncomplete(cie);\n          cie->lsda_encoding = DwarfPointerEncoding(*data++);\n          if (!reader_->ValidEncoding(cie->lsda_encoding)) {\n            reporter_->InvalidPointerEncoding(cie->offset, cie->lsda_encoding);\n            return false;\n          }\n          // Don't check if the encoding is usable here --- we haven't\n          // read the FDE's fields yet, so we're not prepared for\n          // DW_EH_PE_funcrel, although that's a fine encoding for the\n          // LSDA to use, since it appears in the FDE.\n          break;\n\n        case DW_Z_has_personality_routine:\n          // The CIE's augmentation data holds the personality routine\n          // pointer's encoding, followed by the pointer itself.\n          cie->has_z_personality = true;\n          // Fetch the personality routine pointer's encoding from the\n          // augmentation data.\n          if (data >= data_end) return ReportIncomplete(cie);\n          cie->personality_encoding = DwarfPointerEncoding(*data++);\n          if (!reader_->ValidEncoding(cie->personality_encoding)) {\n            reporter_->InvalidPointerEncoding(cie->offset,\n                                              cie->personality_encoding);\n            return false;\n          }\n          if (!reader_->UsableEncoding(cie->personality_encoding)) {\n            reporter_->UnusablePointerEncoding(cie->offset,\n                                               cie->personality_encoding);\n            return false;\n          }\n          // Fetch the personality routine's pointer itself from the data.\n          cie->personality_address =\n            reader_->ReadEncodedPointer(data, cie->personality_encoding,\n                                        &len);\n          if (len > size_t(data_end - data))\n            return ReportIncomplete(cie);\n          data += len;\n          break;\n\n        case DW_Z_has_FDE_address_encoding:\n          // The CIE's augmentation data holds the pointer encoding to use\n          // for addresses in the FDE.\n          if (data >= data_end) return ReportIncomplete(cie);\n          cie->pointer_encoding = DwarfPointerEncoding(*data++);\n          if (!reader_->ValidEncoding(cie->pointer_encoding)) {\n            reporter_->InvalidPointerEncoding(cie->offset,\n                                              cie->pointer_encoding);\n            return false;\n          }\n          if (!reader_->UsableEncoding(cie->pointer_encoding)) {\n            reporter_->UnusablePointerEncoding(cie->offset,\n                                               cie->pointer_encoding);\n            return false;\n          }\n          break;\n\n        case DW_Z_is_signal_trampoline:\n          // Frames using this CIE are signal delivery frames.\n          cie->has_z_signal_frame = true;\n          break;\n\n        default:\n          // An augmentation we don't recognize.\n          reporter_->UnrecognizedAugmentation(cie->offset, cie->augmentation);\n          return false;\n      }\n    }\n  }\n\n  // The CIE's instructions start here.\n  cie->instructions = cursor;\n\n  return true;\n}\n  \nbool CallFrameInfo::ReadFDEFields(FDE *fde) {\n  const char *cursor = fde->fields;\n  size_t size;\n\n  fde->address = reader_->ReadEncodedPointer(cursor, fde->cie->pointer_encoding,\n                                             &size);\n  if (size > size_t(fde->end - cursor))\n    return ReportIncomplete(fde);\n  cursor += size;\n  reader_->SetFunctionBase(fde->address);\n\n  // For the length, we strip off the upper nybble of the encoding used for\n  // the starting address.\n  DwarfPointerEncoding length_encoding =\n    DwarfPointerEncoding(fde->cie->pointer_encoding & 0x0f);\n  fde->size = reader_->ReadEncodedPointer(cursor, length_encoding, &size);\n  if (size > size_t(fde->end - cursor))\n    return ReportIncomplete(fde);\n  cursor += size;\n\n  // If the CIE has a 'z' augmentation string, then augmentation data\n  // appears here.\n  if (fde->cie->has_z_augmentation) {\n    uint64_t data_size = reader_->ReadUnsignedLEB128(cursor, &size);\n    if (size_t(fde->end - cursor) < size + data_size)\n      return ReportIncomplete(fde);\n    cursor += size;\n    \n    // In the abstract, we should walk the augmentation string, and extract\n    // items from the FDE's augmentation data as we encounter augmentation\n    // string characters that specify their presence: the ordering of items\n    // in the augmentation string determines the arrangement of values in\n    // the augmentation data.\n    //\n    // In practice, there's only ever one value in FDE augmentation data\n    // that we support --- the LSDA pointer --- and we have to bail if we\n    // see any unrecognized augmentation string characters. So if there is\n    // anything here at all, we know what it is, and where it starts.\n    if (fde->cie->has_z_lsda) {\n      // Check whether the LSDA's pointer encoding is usable now: only once\n      // we've parsed the FDE's starting address do we call reader_->\n      // SetFunctionBase, so that the DW_EH_PE_funcrel encoding becomes\n      // usable.\n      if (!reader_->UsableEncoding(fde->cie->lsda_encoding)) {\n        reporter_->UnusablePointerEncoding(fde->cie->offset,\n                                           fde->cie->lsda_encoding);\n        return false;\n      }\n\n      fde->lsda_address =\n        reader_->ReadEncodedPointer(cursor, fde->cie->lsda_encoding, &size);\n      if (size > data_size)\n        return ReportIncomplete(fde);\n      // Ideally, we would also complain here if there were unconsumed\n      // augmentation data.\n    }\n\n    cursor += data_size;\n  }\n\n  // The FDE's instructions start after those.\n  fde->instructions = cursor;\n\n  return true;\n}\n  \nbool CallFrameInfo::Start() {\n  const char *buffer_end = buffer_ + buffer_length_;\n  const char *cursor;\n  bool all_ok = true;\n  const char *entry_end;\n  bool ok;\n\n  // Traverse all the entries in buffer_, skipping CIEs and offering\n  // FDEs to the handler.\n  for (cursor = buffer_; cursor < buffer_end;\n       cursor = entry_end, all_ok = all_ok && ok) {\n    FDE fde;\n\n    // Make it easy to skip this entry with 'continue': assume that\n    // things are not okay until we've checked all the data, and\n    // prepare the address of the next entry.\n    ok = false;\n\n    // Read the entry's prologue.\n    if (!ReadEntryPrologue(cursor, &fde)) {\n      if (!fde.end) {\n        // If we couldn't even figure out this entry's extent, then we\n        // must stop processing entries altogether.\n        all_ok = false;\n        break;\n      }\n      entry_end = fde.end;\n      continue;\n    }\n\n    // The next iteration picks up after this entry.\n    entry_end = fde.end;\n\n    // Did we see an .eh_frame terminating mark?\n    if (fde.kind == kTerminator) {\n      // If there appears to be more data left in the section after the\n      // terminating mark, warn the user. But this is just a warning;\n      // we leave all_ok true.\n      if (fde.end < buffer_end) reporter_->EarlyEHTerminator(fde.offset);\n      break;\n    }\n\n    // In this loop, we skip CIEs. We only parse them fully when we\n    // parse an FDE that refers to them. This limits our memory\n    // consumption (beyond the buffer itself) to that needed to\n    // process the largest single entry.\n    if (fde.kind != kFDE) {\n      ok = true;\n      continue;\n    }\n\n    // Validate the CIE pointer.\n    if (fde.id > buffer_length_) {\n      reporter_->CIEPointerOutOfRange(fde.offset, fde.id);\n      continue;\n    }\n      \n    CIE cie;\n\n    // Parse this FDE's CIE header.\n    if (!ReadEntryPrologue(buffer_ + fde.id, &cie))\n      continue;\n    // This had better be an actual CIE.\n    if (cie.kind != kCIE) {\n      reporter_->BadCIEId(fde.offset, fde.id);\n      continue;\n    }\n    if (!ReadCIEFields(&cie))\n      continue;\n\n    // We now have the values that govern both the CIE and the FDE.\n    cie.cie = &cie;\n    fde.cie = &cie;\n\n    // Parse the FDE's header.\n    if (!ReadFDEFields(&fde))\n      continue;\n\n    // Call Entry to ask the consumer if they're interested.\n    if (!handler_->Entry(fde.offset, fde.address, fde.size,\n                         cie.version, cie.augmentation,\n                         cie.return_address_register)) {\n      // The handler isn't interested in this entry. That's not an error.\n      ok = true;\n      continue;\n    }\n                         \n    if (cie.has_z_augmentation) {\n      // Report the personality routine address, if we have one.\n      if (cie.has_z_personality) {\n        if (!handler_\n            ->PersonalityRoutine(cie.personality_address,\n                                 IsIndirectEncoding(cie.personality_encoding)))\n          continue;\n      }\n\n      // Report the language-specific data area address, if we have one.\n      if (cie.has_z_lsda) {\n        if (!handler_\n            ->LanguageSpecificDataArea(fde.lsda_address,\n                                       IsIndirectEncoding(cie.lsda_encoding)))\n          continue;\n      }\n\n      // If this is a signal-handling frame, report that.\n      if (cie.has_z_signal_frame) {\n        if (!handler_->SignalHandler())\n          continue;\n      }\n    }\n\n    // Interpret the CIE's instructions, and then the FDE's instructions.\n    State state(reader_, handler_, reporter_, fde.address);\n    ok = state.InterpretCIE(cie) && state.InterpretFDE(fde);\n\n    // Tell the ByteReader that the function start address from the\n    // FDE header is no longer valid.\n    reader_->ClearFunctionBase();\n\n    // Report the end of the entry.\n    handler_->End();\n  }\n\n  return all_ok;\n}\n\nconst char *CallFrameInfo::KindName(EntryKind kind) {\n  if (kind == CallFrameInfo::kUnknown)\n    return \"entry\";\n  else if (kind == CallFrameInfo::kCIE)\n    return \"common information entry\";\n  else if (kind == CallFrameInfo::kFDE)\n    return \"frame description entry\";\n  else {\n    assert (kind == CallFrameInfo::kTerminator);\n    return \".eh_frame sequence terminator\";\n  }\n}\n\nbool CallFrameInfo::ReportIncomplete(Entry *entry) {\n  reporter_->Incomplete(entry->offset, entry->kind);\n  return false;\n}\n\nvoid CallFrameInfo::Reporter::Incomplete(uint64 offset,\n                                         CallFrameInfo::EntryKind kind) {\n  fprintf(stderr,\n          \"%s: CFI %s at offset 0x%llx in '%s': entry ends early\\n\",\n          filename_.c_str(), CallFrameInfo::KindName(kind), offset,\n          section_.c_str());\n}\n\nvoid CallFrameInfo::Reporter::EarlyEHTerminator(uint64 offset) {\n  fprintf(stderr,\n          \"%s: CFI at offset 0x%llx in '%s': saw end-of-data marker\"\n          \" before end of section contents\\n\",\n          filename_.c_str(), offset, section_.c_str());\n}\n\nvoid CallFrameInfo::Reporter::CIEPointerOutOfRange(uint64 offset,\n                                                   uint64 cie_offset) {\n  fprintf(stderr,\n          \"%s: CFI frame description entry at offset 0x%llx in '%s':\"\n          \" CIE pointer is out of range: 0x%llx\\n\",\n          filename_.c_str(), offset, section_.c_str(), cie_offset);\n}\n\nvoid CallFrameInfo::Reporter::BadCIEId(uint64 offset, uint64 cie_offset) {\n  fprintf(stderr,\n          \"%s: CFI frame description entry at offset 0x%llx in '%s':\"\n          \" CIE pointer does not point to a CIE: 0x%llx\\n\",\n          filename_.c_str(), offset, section_.c_str(), cie_offset);\n}\n\nvoid CallFrameInfo::Reporter::UnrecognizedVersion(uint64 offset, int version) {\n  fprintf(stderr,\n          \"%s: CFI frame description entry at offset 0x%llx in '%s':\"\n          \" CIE specifies unrecognized version: %d\\n\",\n          filename_.c_str(), offset, section_.c_str(), version);\n}\n\nvoid CallFrameInfo::Reporter::UnrecognizedAugmentation(uint64 offset,\n                                                       const std::string &aug) {\n  fprintf(stderr,\n          \"%s: CFI frame description entry at offset 0x%llx in '%s':\"\n          \" CIE specifies unrecognized augmentation: '%s'\\n\",\n          filename_.c_str(), offset, section_.c_str(), aug.c_str());\n}\n\nvoid CallFrameInfo::Reporter::InvalidPointerEncoding(uint64 offset,\n                                                     uint8 encoding) {\n  fprintf(stderr,\n          \"%s: CFI common information entry at offset 0x%llx in '%s':\"\n          \" 'z' augmentation specifies invalid pointer encoding: 0x%02x\\n\",\n          filename_.c_str(), offset, section_.c_str(), encoding);\n}\n\nvoid CallFrameInfo::Reporter::UnusablePointerEncoding(uint64 offset,\n                                                      uint8 encoding) {\n  fprintf(stderr,\n          \"%s: CFI common information entry at offset 0x%llx in '%s':\"\n          \" 'z' augmentation specifies a pointer encoding for which\"\n          \" we have no base address: 0x%02x\\n\",\n          filename_.c_str(), offset, section_.c_str(), encoding);\n}\n\nvoid CallFrameInfo::Reporter::RestoreInCIE(uint64 offset, uint64 insn_offset) {\n  fprintf(stderr,\n          \"%s: CFI common information entry at offset 0x%llx in '%s':\"\n          \" the DW_CFA_restore instruction at offset 0x%llx\"\n          \" cannot be used in a common information entry\\n\",\n          filename_.c_str(), offset, section_.c_str(), insn_offset);\n}\n\nvoid CallFrameInfo::Reporter::BadInstruction(uint64 offset,\n                                             CallFrameInfo::EntryKind kind,\n                                             uint64 insn_offset) {\n  fprintf(stderr,\n          \"%s: CFI %s at offset 0x%llx in section '%s':\"\n          \" the instruction at offset 0x%llx is unrecognized\\n\",\n          filename_.c_str(), CallFrameInfo::KindName(kind),\n          offset, section_.c_str(), insn_offset);\n}\n\nvoid CallFrameInfo::Reporter::NoCFARule(uint64 offset,\n                                        CallFrameInfo::EntryKind kind,\n                                        uint64 insn_offset) {\n  fprintf(stderr,\n          \"%s: CFI %s at offset 0x%llx in section '%s':\"\n          \" the instruction at offset 0x%llx assumes that a CFA rule has\"\n          \" been set, but none has been set\\n\",\n          filename_.c_str(), CallFrameInfo::KindName(kind), offset,\n          section_.c_str(), insn_offset);\n}\n\nvoid CallFrameInfo::Reporter::EmptyStateStack(uint64 offset,\n                                              CallFrameInfo::EntryKind kind,\n                                              uint64 insn_offset) {\n  fprintf(stderr,\n          \"%s: CFI %s at offset 0x%llx in section '%s':\"\n          \" the DW_CFA_restore_state instruction at offset 0x%llx\"\n          \" should pop a saved state from the stack, but the stack is empty\\n\",\n          filename_.c_str(), CallFrameInfo::KindName(kind), offset,\n          section_.c_str(), insn_offset);\n}\n\nvoid CallFrameInfo::Reporter::ClearingCFARule(uint64 offset,\n                                              CallFrameInfo::EntryKind kind,\n                                              uint64 insn_offset) {\n  fprintf(stderr,\n          \"%s: CFI %s at offset 0x%llx in section '%s':\"\n          \" the DW_CFA_restore_state instruction at offset 0x%llx\"\n          \" would clear the CFA rule in effect\\n\",\n          filename_.c_str(), CallFrameInfo::KindName(kind), offset,\n          section_.c_str(), insn_offset);\n}\n\n}  // namespace dwarf2reader\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/dwarf2reader.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// CFI reader author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// This file contains definitions related to the DWARF2/3 reader and\n// it's handler interfaces.\n// The DWARF2/3 specification can be found at\n// http://dwarf.freestandards.org and should be considered required\n// reading if you wish to modify the implementation.\n// Only a cursory attempt is made to explain terminology that is\n// used here, as it is much better explained in the standard documents\n#ifndef COMMON_DWARF_DWARF2READER_H__\n#define COMMON_DWARF_DWARF2READER_H__\n\n#include <list>\n#include <map>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"common/dwarf/bytereader.h\"\n#include \"common/dwarf/dwarf2enums.h\"\n#include \"common/dwarf/types.h\"\n\nnamespace dwarf2reader {\nstruct LineStateMachine;\nclass Dwarf2Handler;\nclass LineInfoHandler;\n\n// This maps from a string naming a section to a pair containing a\n// the data for the section, and the size of the section.\ntypedef std::map<std::string, std::pair<const char*, uint64> > SectionMap;\ntypedef std::list<std::pair<enum DwarfAttribute, enum DwarfForm> >\n    AttributeList;\ntypedef AttributeList::iterator AttributeIterator;\ntypedef AttributeList::const_iterator ConstAttributeIterator;\n\nstruct LineInfoHeader {\n  uint64 total_length;\n  uint16 version;\n  uint64 prologue_length;\n  uint8 min_insn_length; // insn stands for instructin\n  bool default_is_stmt; // stmt stands for statement\n  int8 line_base;\n  uint8 line_range;\n  uint8 opcode_base;\n  // Use a pointer so that signalsafe_addr2line is able to use this structure\n  // without heap allocation problem.\n  std::vector<unsigned char> *std_opcode_lengths;\n};\n\nclass LineInfo {\n public:\n\n  // Initializes a .debug_line reader. Buffer and buffer length point\n  // to the beginning and length of the line information to read.\n  // Reader is a ByteReader class that has the endianness set\n  // properly.\n  LineInfo(const char* buffer_, uint64 buffer_length,\n           ByteReader* reader, LineInfoHandler* handler);\n\n  virtual ~LineInfo() {\n    if (header_.std_opcode_lengths) {\n      delete header_.std_opcode_lengths;\n    }\n  }\n\n  // Start processing line info, and calling callbacks in the handler.\n  // Consumes the line number information for a single compilation unit.\n  // Returns the number of bytes processed.\n  uint64 Start();\n\n  // Process a single line info opcode at START using the state\n  // machine at LSM.  Return true if we should define a line using the\n  // current state of the line state machine.  Place the length of the\n  // opcode in LEN.\n  // If LSM_PASSES_PC is non-NULL, this function also checks if the lsm\n  // passes the address of PC. In other words, LSM_PASSES_PC will be\n  // set to true, if the following condition is met.\n  //\n  // lsm's old address < PC <= lsm's new address\n  static bool ProcessOneOpcode(ByteReader* reader,\n                               LineInfoHandler* handler,\n                               const struct LineInfoHeader &header,\n                               const char* start,\n                               struct LineStateMachine* lsm,\n                               size_t* len,\n                               uintptr pc,\n                               bool *lsm_passes_pc);\n\n private:\n  // Reads the DWARF2/3 header for this line info.\n  void ReadHeader();\n\n  // Reads the DWARF2/3 line information\n  void ReadLines();\n\n  // The associated handler to call processing functions in\n  LineInfoHandler* handler_;\n\n  // The associated ByteReader that handles endianness issues for us\n  ByteReader* reader_;\n\n  // A DWARF2/3 line info header.  This is not the same size as\n  // in the actual file, as the one in the file may have a 32 bit or\n  // 64 bit lengths\n\n  struct LineInfoHeader header_;\n\n  // buffer is the buffer for our line info, starting at exactly where\n  // the line info to read is.  after_header is the place right after\n  // the end of the line information header.\n  const char* buffer_;\n  uint64 buffer_length_;\n  const char* after_header_;\n};\n\n// This class is the main interface between the line info reader and\n// the client.  The virtual functions inside this get called for\n// interesting events that happen during line info reading.  The\n// default implementation does nothing\n\nclass LineInfoHandler {\n public:\n  LineInfoHandler() { }\n\n  virtual ~LineInfoHandler() { }\n\n  // Called when we define a directory.  NAME is the directory name,\n  // DIR_NUM is the directory number\n  virtual void DefineDir(const std::string& name, uint32 dir_num) { }\n\n  // Called when we define a filename. NAME is the filename, FILE_NUM\n  // is the file number which is -1 if the file index is the next\n  // index after the last numbered index (this happens when files are\n  // dynamically defined by the line program), DIR_NUM is the\n  // directory index for the directory name of this file, MOD_TIME is\n  // the modification time of the file, and LENGTH is the length of\n  // the file\n  virtual void DefineFile(const std::string& name, int32 file_num,\n                          uint32 dir_num, uint64 mod_time,\n                          uint64 length) { }\n\n  // Called when the line info reader has a new line, address pair\n  // ready for us. ADDRESS is the address of the code, LENGTH is the\n  // length of its machine code in bytes, FILE_NUM is the file number\n  // containing the code, LINE_NUM is the line number in that file for\n  // the code, and COLUMN_NUM is the column number the code starts at,\n  // if we know it (0 otherwise).\n  virtual void AddLine(uint64 address, uint64 length,\n                       uint32 file_num, uint32 line_num, uint32 column_num) { }\n};\n\n// The base of DWARF2/3 debug info is a DIE (Debugging Information\n// Entry.\n// DWARF groups DIE's into a tree and calls the root of this tree a\n// \"compilation unit\".  Most of the time, there is one compilation\n// unit in the .debug_info section for each file that had debug info\n// generated.\n// Each DIE consists of\n\n// 1. a tag specifying a thing that is being described (ie\n// DW_TAG_subprogram for functions, DW_TAG_variable for variables, etc\n// 2. attributes (such as DW_AT_location for location in memory,\n// DW_AT_name for name), and data for each attribute.\n// 3. A flag saying whether the DIE has children or not\n\n// In order to gain some amount of compression, the format of\n// each DIE (tag name, attributes and data forms for the attributes)\n// are stored in a separate table called the \"abbreviation table\".\n// This is done because a large number of DIEs have the exact same tag\n// and list of attributes, but different data for those attributes.\n// As a result, the .debug_info section is just a stream of data, and\n// requires reading of the .debug_abbrev section to say what the data\n// means.\n\n// As a warning to the user, it should be noted that the reason for\n// using absolute offsets from the beginning of .debug_info is that\n// DWARF2/3 supports referencing DIE's from other DIE's by their offset\n// from either the current compilation unit start, *or* the beginning\n// of the .debug_info section.  This means it is possible to reference\n// a DIE in one compilation unit from a DIE in another compilation\n// unit.  This style of reference is usually used to eliminate\n// duplicated information that occurs across compilation\n// units, such as base types, etc.  GCC 3.4+ support this with\n// -feliminate-dwarf2-dups.  Other toolchains will sometimes do\n// duplicate elimination in the linker.\n\nclass CompilationUnit {\n public:\n\n  // Initialize a compilation unit.  This requires a map of sections,\n  // the offset of this compilation unit in the .debug_info section, a\n  // ByteReader, and a Dwarf2Handler class to call callbacks in.\n  CompilationUnit(const SectionMap& sections, uint64 offset,\n                  ByteReader* reader, Dwarf2Handler* handler);\n  virtual ~CompilationUnit() {\n    if (abbrevs_) delete abbrevs_;\n  }\n\n  // Begin reading a Dwarf2 compilation unit, and calling the\n  // callbacks in the Dwarf2Handler\n\n  // Return the full length of the compilation unit, including\n  // headers. This plus the starting offset passed to the constructor\n  // is the offset of the end of the compilation unit --- and the\n  // start of the next compilation unit, if there is one.\n  uint64 Start();\n\n private:\n\n  // This struct represents a single DWARF2/3 abbreviation\n  // The abbreviation tells how to read a DWARF2/3 DIE, and consist of a\n  // tag and a list of attributes, as well as the data form of each attribute.\n  struct Abbrev {\n    uint64 number;\n    enum DwarfTag tag;\n    bool has_children;\n    AttributeList attributes;\n  };\n\n  // A DWARF2/3 compilation unit header.  This is not the same size as\n  // in the actual file, as the one in the file may have a 32 bit or\n  // 64 bit length.\n  struct CompilationUnitHeader {\n    uint64 length;\n    uint16 version;\n    uint64 abbrev_offset;\n    uint8 address_size;\n  } header_;\n\n  // Reads the DWARF2/3 header for this compilation unit.\n  void ReadHeader();\n\n  // Reads the DWARF2/3 abbreviations for this compilation unit\n  void ReadAbbrevs();\n\n  // Processes a single DIE for this compilation unit and return a new\n  // pointer just past the end of it\n  const char* ProcessDIE(uint64 dieoffset,\n                                  const char* start,\n                                  const Abbrev& abbrev);\n\n  // Processes a single attribute and return a new pointer just past the\n  // end of it\n  const char* ProcessAttribute(uint64 dieoffset,\n                                        const char* start,\n                                        enum DwarfAttribute attr,\n                                        enum DwarfForm form);\n\n  // Processes all DIEs for this compilation unit\n  void ProcessDIEs();\n\n  // Skips the die with attributes specified in ABBREV starting at\n  // START, and return the new place to position the stream to.\n  const char* SkipDIE(const char* start,\n                               const Abbrev& abbrev);\n\n  // Skips the attribute starting at START, with FORM, and return the\n  // new place to position the stream to.\n  const char* SkipAttribute(const char* start,\n                                     enum DwarfForm form);\n\n  // Offset from section start is the offset of this compilation unit\n  // from the beginning of the .debug_info section.\n  uint64 offset_from_section_start_;\n\n  // buffer is the buffer for our CU, starting at .debug_info + offset\n  // passed in from constructor.\n  // after_header points to right after the compilation unit header.\n  const char* buffer_;\n  uint64 buffer_length_;\n  const char* after_header_;\n\n  // The associated ByteReader that handles endianness issues for us\n  ByteReader* reader_;\n\n  // The map of sections in our file to buffers containing their data\n  const SectionMap& sections_;\n\n  // The associated handler to call processing functions in\n  Dwarf2Handler* handler_;\n\n  // Set of DWARF2/3 abbreviations for this compilation unit.  Indexed\n  // by abbreviation number, which means that abbrevs_[0] is not\n  // valid.\n  std::vector<Abbrev>* abbrevs_;\n\n  // String section buffer and length, if we have a string section.\n  // This is here to avoid doing a section lookup for strings in\n  // ProcessAttribute, which is in the hot path for DWARF2 reading.\n  const char* string_buffer_;\n  uint64 string_buffer_length_;\n};\n\n// This class is the main interface between the reader and the\n// client.  The virtual functions inside this get called for\n// interesting events that happen during DWARF2 reading.\n// The default implementation skips everything.\n\nclass Dwarf2Handler {\n public:\n  Dwarf2Handler() { }\n\n  virtual ~Dwarf2Handler() { }\n\n  // Start to process a compilation unit at OFFSET from the beginning of the\n  // .debug_info section. Return false if you would like to skip this\n  // compilation unit.\n  virtual bool StartCompilationUnit(uint64 offset, uint8 address_size,\n                                    uint8 offset_size, uint64 cu_length,\n                                    uint8 dwarf_version) { return false; }\n\n  // Start to process a DIE at OFFSET from the beginning of the .debug_info\n  // section. Return false if you would like to skip this DIE.\n  virtual bool StartDIE(uint64 offset, enum DwarfTag tag,\n                        const AttributeList& attrs) { return false; }\n\n  // Called when we have an attribute with unsigned data to give to our\n  // handler. The attribute is for the DIE at OFFSET from the beginning of the\n  // .debug_info section. Its name is ATTR, its form is FORM, and its value is\n  // DATA.\n  virtual void ProcessAttributeUnsigned(uint64 offset,\n                                        enum DwarfAttribute attr,\n                                        enum DwarfForm form,\n                                        uint64 data) { }\n\n  // Called when we have an attribute with signed data to give to our handler.\n  // The attribute is for the DIE at OFFSET from the beginning of the\n  // .debug_info section. Its name is ATTR, its form is FORM, and its value is\n  // DATA.\n  virtual void ProcessAttributeSigned(uint64 offset,\n                                      enum DwarfAttribute attr,\n                                      enum DwarfForm form,\n                                      int64 data) { }\n\n  // Called when we have an attribute whose value is a reference to\n  // another DIE. The attribute belongs to the DIE at OFFSET from the\n  // beginning of the .debug_info section. Its name is ATTR, its form\n  // is FORM, and the offset of the DIE being referred to from the\n  // beginning of the .debug_info section is DATA.\n  virtual void ProcessAttributeReference(uint64 offset,\n                                         enum DwarfAttribute attr,\n                                         enum DwarfForm form,\n                                         uint64 data) { }\n\n  // Called when we have an attribute with a buffer of data to give to our\n  // handler. The attribute is for the DIE at OFFSET from the beginning of the\n  // .debug_info section. Its name is ATTR, its form is FORM, DATA points to\n  // the buffer's contents, and its length in bytes is LENGTH. The buffer is\n  // owned by the caller, not the callee, and may not persist for very long.\n  // If you want the data to be available later, it needs to be copied.\n  virtual void ProcessAttributeBuffer(uint64 offset,\n                                      enum DwarfAttribute attr,\n                                      enum DwarfForm form,\n                                      const char* data,\n                                      uint64 len) { }\n\n  // Called when we have an attribute with string data to give to our handler.\n  // The attribute is for the DIE at OFFSET from the beginning of the\n  // .debug_info section. Its name is ATTR, its form is FORM, and its value is\n  // DATA.\n  virtual void ProcessAttributeString(uint64 offset,\n                                      enum DwarfAttribute attr,\n                                      enum DwarfForm form,\n                                      const std::string& data) { }\n\n  // Called when we have an attribute whose value is the 64-bit signature\n  // of a type unit in the .debug_types section. OFFSET is the offset of\n  // the DIE whose attribute we're reporting. ATTR and FORM are the\n  // attribute's name and form. SIGNATURE is the type unit's signature.\n  virtual void ProcessAttributeSignature(uint64 offset,\n                                         enum DwarfAttribute attr,\n                                         enum DwarfForm form,\n                                         uint64 signature) { }\n\n  // Called when finished processing the DIE at OFFSET.\n  // Because DWARF2/3 specifies a tree of DIEs, you may get starts\n  // before ends of the previous DIE, as we process children before\n  // ending the parent.\n  virtual void EndDIE(uint64 offset) { }\n\n};\n\n// This class is a reader for DWARF's Call Frame Information.  CFI\n// describes how to unwind stack frames --- even for functions that do\n// not follow fixed conventions for saving registers, whose frame size\n// varies as they execute, etc.\n//\n// CFI describes, at each machine instruction, how to compute the\n// stack frame's base address, how to find the return address, and\n// where to find the saved values of the caller's registers (if the\n// callee has stashed them somewhere to free up the registers for its\n// own use).\n//\n// For example, suppose we have a function whose machine code looks\n// like this (imagine an assembly language that looks like C, for a\n// machine with 32-bit registers, and a stack that grows towards lower\n// addresses):\n//\n// func:                                ; entry point; return address at sp\n// func+0:      sp = sp - 16            ; allocate space for stack frame\n// func+1:      sp[12] = r0             ; save r0 at sp+12\n// ...                                  ; other code, not frame-related\n// func+10:     sp -= 4; *sp = x        ; push some x on the stack\n// ...                                  ; other code, not frame-related\n// func+20:     r0 = sp[16]             ; restore saved r0\n// func+21:     sp += 20                ; pop whole stack frame\n// func+22:     pc = *sp; sp += 4       ; pop return address and jump to it\n//\n// DWARF CFI is (a very compressed representation of) a table with a\n// row for each machine instruction address and a column for each\n// register showing how to restore it, if possible.\n//\n// A special column named \"CFA\", for \"Canonical Frame Address\", tells how\n// to compute the base address of the frame; registers' entries may\n// refer to the CFA in describing where the registers are saved.\n//\n// Another special column, named \"RA\", represents the return address.\n//\n// For example, here is a complete (uncompressed) table describing the\n// function above:\n// \n//     insn      cfa    r0      r1 ...  ra\n//     =======================================\n//     func+0:   sp                     cfa[0]\n//     func+1:   sp+16                  cfa[0] \n//     func+2:   sp+16  cfa[-4]         cfa[0]\n//     func+11:  sp+20  cfa[-4]         cfa[0]\n//     func+21:  sp+20                  cfa[0]\n//     func+22:  sp                     cfa[0]\n//\n// Some things to note here:\n//\n// - Each row describes the state of affairs *before* executing the\n//   instruction at the given address.  Thus, the row for func+0\n//   describes the state before we allocate the stack frame.  In the\n//   next row, the formula for computing the CFA has changed,\n//   reflecting that allocation.\n//\n// - The other entries are written in terms of the CFA; this allows\n//   them to remain unchanged as the stack pointer gets bumped around.\n//   For example, the rule for recovering the return address (the \"ra\"\n//   column) remains unchanged throughout the function, even as the\n//   stack pointer takes on three different offsets from the return\n//   address.\n//\n// - Although we haven't shown it, most calling conventions designate\n//   \"callee-saves\" and \"caller-saves\" registers. The callee must\n//   preserve the values of callee-saves registers; if it uses them,\n//   it must save their original values somewhere, and restore them\n//   before it returns. In contrast, the callee is free to trash\n//   caller-saves registers; if the callee uses these, it will\n//   probably not bother to save them anywhere, and the CFI will\n//   probably mark their values as \"unrecoverable\".\n//\n//   (However, since the caller cannot assume the callee was going to\n//   save them, caller-saves registers are probably dead in the caller\n//   anyway, so compilers usually don't generate CFA for caller-saves\n//   registers.)\n// \n// - Exactly where the CFA points is a matter of convention that\n//   depends on the architecture and ABI in use. In the example, the\n//   CFA is the value the stack pointer had upon entry to the\n//   function, pointing at the saved return address. But on the x86,\n//   the call frame information generated by GCC follows the\n//   convention that the CFA is the address *after* the saved return\n//   address.\n//\n//   But by definition, the CFA remains constant throughout the\n//   lifetime of the frame. This makes it a useful value for other\n//   columns to refer to. It is also gives debuggers a useful handle\n//   for identifying a frame.\n//\n// If you look at the table above, you'll notice that a given entry is\n// often the same as the one immediately above it: most instructions\n// change only one or two aspects of the stack frame, if they affect\n// it at all. The DWARF format takes advantage of this fact, and\n// reduces the size of the data by mentioning only the addresses and\n// columns at which changes take place. So for the above, DWARF CFI\n// data would only actually mention the following:\n// \n//     insn      cfa    r0      r1 ...  ra\n//     =======================================\n//     func+0:   sp                     cfa[0]\n//     func+1:   sp+16\n//     func+2:          cfa[-4]\n//     func+11:  sp+20\n//     func+21:         r0\n//     func+22:  sp            \n//\n// In fact, this is the way the parser reports CFI to the consumer: as\n// a series of statements of the form, \"At address X, column Y changed\n// to Z,\" and related conventions for describing the initial state.\n//\n// Naturally, it would be impractical to have to scan the entire\n// program's CFI, noting changes as we go, just to recover the\n// unwinding rules in effect at one particular instruction. To avoid\n// this, CFI data is grouped into \"entries\", each of which covers a\n// specified range of addresses and begins with a complete statement\n// of the rules for all recoverable registers at that starting\n// address. Each entry typically covers a single function.\n//\n// Thus, to compute the contents of a given row of the table --- that\n// is, rules for recovering the CFA, RA, and registers at a given\n// instruction --- the consumer should find the entry that covers that\n// instruction's address, start with the initial state supplied at the\n// beginning of the entry, and work forward until it has processed all\n// the changes up to and including those for the present instruction.\n//\n// There are seven kinds of rules that can appear in an entry of the\n// table:\n//\n// - \"undefined\": The given register is not preserved by the callee;\n//   its value cannot be recovered.\n//\n// - \"same value\": This register has the same value it did in the callee.\n//\n// - offset(N): The register is saved at offset N from the CFA.\n//\n// - val_offset(N): The value the register had in the caller is the\n//   CFA plus offset N. (This is usually only useful for describing\n//   the stack pointer.)\n//\n// - register(R): The register's value was saved in another register R.\n//\n// - expression(E): Evaluating the DWARF expression E using the\n//   current frame's registers' values yields the address at which the\n//   register was saved.\n//\n// - val_expression(E): Evaluating the DWARF expression E using the\n//   current frame's registers' values yields the value the register\n//   had in the caller.\n\nclass CallFrameInfo {\n public:\n  // The different kinds of entries one finds in CFI. Used internally,\n  // and for error reporting.\n  enum EntryKind { kUnknown, kCIE, kFDE, kTerminator };\n\n  // The handler class to which the parser hands the parsed call frame\n  // information.  Defined below.\n  class Handler;\n\n  // A reporter class, which CallFrameInfo uses to report errors\n  // encountered while parsing call frame information.  Defined below.\n  class Reporter;\n\n  // Create a DWARF CFI parser. BUFFER points to the contents of the\n  // .debug_frame section to parse; BUFFER_LENGTH is its length in bytes.\n  // REPORTER is an error reporter the parser should use to report\n  // problems. READER is a ByteReader instance that has the endianness and\n  // address size set properly. Report the data we find to HANDLER.\n  //\n  // This class can also parse Linux C++ exception handling data, as found\n  // in '.eh_frame' sections. This data is a variant of DWARF CFI that is\n  // placed in loadable segments so that it is present in the program's\n  // address space, and is interpreted by the C++ runtime to search the\n  // call stack for a handler interested in the exception being thrown,\n  // actually pop the frames, and find cleanup code to run.\n  //\n  // There are two differences between the call frame information described\n  // in the DWARF standard and the exception handling data Linux places in\n  // the .eh_frame section:\n  //\n  // - Exception handling data uses uses a different format for call frame\n  //   information entry headers. The distinguished CIE id, the way FDEs\n  //   refer to their CIEs, and the way the end of the series of entries is\n  //   determined are all slightly different.\n  //\n  //   If the constructor's EH_FRAME argument is true, then the\n  //   CallFrameInfo parses the entry headers as Linux C++ exception\n  //   handling data. If EH_FRAME is false or omitted, the CallFrameInfo\n  //   parses standard DWARF call frame information.\n  //\n  // - Linux C++ exception handling data uses CIE augmentation strings\n  //   beginning with 'z' to specify the presence of additional data after\n  //   the CIE and FDE headers and special encodings used for addresses in\n  //   frame description entries.\n  //\n  //   CallFrameInfo can handle 'z' augmentations in either DWARF CFI or\n  //   exception handling data if you have supplied READER with the base\n  //   addresses needed to interpret the pointer encodings that 'z'\n  //   augmentations can specify. See the ByteReader interface for details\n  //   about the base addresses. See the CallFrameInfo::Handler interface\n  //   for details about the additional information one might find in\n  //   'z'-augmented data.\n  //\n  // Thus:\n  //\n  // - If you are parsing standard DWARF CFI, as found in a .debug_frame\n  //   section, you should pass false for the EH_FRAME argument, or omit\n  //   it, and you need not worry about providing READER with the\n  //   additional base addresses.\n  //\n  // - If you want to parse Linux C++ exception handling data from a\n  //   .eh_frame section, you should pass EH_FRAME as true, and call\n  //   READER's Set*Base member functions before calling our Start method.\n  //\n  // - If you want to parse DWARF CFI that uses the 'z' augmentations\n  //   (although I don't think any toolchain ever emits such data), you\n  //   could pass false for EH_FRAME, but call READER's Set*Base members.\n  //\n  // The extensions the Linux C++ ABI makes to DWARF for exception\n  // handling are described here, rather poorly:\n  // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/dwarfext.html\n  // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/ehframechpt.html\n  // \n  // The mechanics of C++ exception handling, personality routines,\n  // and language-specific data areas are described here, rather nicely:\n  // http://www.codesourcery.com/public/cxx-abi/abi-eh.html\n  CallFrameInfo(const char *buffer, size_t buffer_length,\n                ByteReader *reader, Handler *handler, Reporter *reporter,\n                bool eh_frame = false)\n      : buffer_(buffer), buffer_length_(buffer_length),\n        reader_(reader), handler_(handler), reporter_(reporter),\n        eh_frame_(eh_frame) { }\n\n  ~CallFrameInfo() { }\n\n  // Parse the entries in BUFFER, reporting what we find to HANDLER.\n  // Return true if we reach the end of the section successfully, or\n  // false if we encounter an error.\n  bool Start();\n\n  // Return the textual name of KIND. For error reporting.\n  static const char *KindName(EntryKind kind);\n\n private:\n\n  struct CIE;\n\n  // A CFI entry, either an FDE or a CIE.\n  struct Entry {\n    // The starting offset of the entry in the section, for error\n    // reporting.\n    size_t offset;\n\n    // The start of this entry in the buffer.\n    const char *start;\n    \n    // Which kind of entry this is.\n    //\n    // We want to be able to use this for error reporting even while we're\n    // in the midst of parsing. Error reporting code may assume that kind,\n    // offset, and start fields are valid, although kind may be kUnknown.\n    EntryKind kind;\n\n    // The end of this entry's common prologue (initial length and id), and\n    // the start of this entry's kind-specific fields.\n    const char *fields;\n\n    // The start of this entry's instructions.\n    const char *instructions;\n\n    // The address past the entry's last byte in the buffer. (Note that\n    // since offset points to the entry's initial length field, and the\n    // length field is the number of bytes after that field, this is not\n    // simply buffer_ + offset + length.)\n    const char *end;\n\n    // For both DWARF CFI and .eh_frame sections, this is the CIE id in a\n    // CIE, and the offset of the associated CIE in an FDE.\n    uint64 id;\n\n    // The CIE that applies to this entry, if we've parsed it. If this is a\n    // CIE, then this field points to this structure.\n    CIE *cie;\n  };\n\n  // A common information entry (CIE).\n  struct CIE: public Entry {\n    uint8 version;                      // CFI data version number\n    std::string augmentation;           // vendor format extension markers\n    uint64 code_alignment_factor;       // scale for code address adjustments \n    int data_alignment_factor;          // scale for stack pointer adjustments\n    unsigned return_address_register;   // which register holds the return addr\n\n    // True if this CIE includes Linux C++ ABI 'z' augmentation data.\n    bool has_z_augmentation;\n \n    // Parsed 'z' augmentation data. These are meaningful only if\n    // has_z_augmentation is true.\n    bool has_z_lsda;                    // The 'z' augmentation included 'L'.\n    bool has_z_personality;             // The 'z' augmentation included 'P'.\n    bool has_z_signal_frame;            // The 'z' augmentation included 'S'.\n\n    // If has_z_lsda is true, this is the encoding to be used for language-\n    // specific data area pointers in FDEs.\n    DwarfPointerEncoding lsda_encoding;\n\n    // If has_z_personality is true, this is the encoding used for the\n    // personality routine pointer in the augmentation data.\n    DwarfPointerEncoding personality_encoding;\n\n    // If has_z_personality is true, this is the address of the personality\n    // routine --- or, if personality_encoding & DW_EH_PE_indirect, the\n    // address where the personality routine's address is stored.\n    uint64 personality_address;\n\n    // This is the encoding used for addresses in the FDE header and\n    // in DW_CFA_set_loc instructions. This is always valid, whether\n    // or not we saw a 'z' augmentation string; its default value is\n    // DW_EH_PE_absptr, which is what normal DWARF CFI uses.\n    DwarfPointerEncoding pointer_encoding;\n  };\n\n  // A frame description entry (FDE).\n  struct FDE: public Entry {\n    uint64 address;                     // start address of described code\n    uint64 size;                        // size of described code, in bytes\n\n    // If cie->has_z_lsda is true, then this is the language-specific data\n    // area's address --- or its address's address, if cie->lsda_encoding\n    // has the DW_EH_PE_indirect bit set.\n    uint64 lsda_address;\n  };\n\n  // Internal use.\n  class Rule;\n  class UndefinedRule;\n  class SameValueRule;\n  class OffsetRule;\n  class ValOffsetRule;\n  class RegisterRule;\n  class ExpressionRule;\n  class ValExpressionRule;\n  class RuleMap;\n  class State;\n  \n  // Parse the initial length and id of a CFI entry, either a CIE, an FDE,\n  // or a .eh_frame end-of-data mark. CURSOR points to the beginning of the\n  // data to parse. On success, populate ENTRY as appropriate, and return\n  // true. On failure, report the problem, and return false. Even if we\n  // return false, set ENTRY->end to the first byte after the entry if we\n  // were able to figure that out, or NULL if we weren't.\n  bool ReadEntryPrologue(const char *cursor, Entry *entry);\n\n  // Parse the fields of a CIE after the entry prologue, including any 'z'\n  // augmentation data. Assume that the 'Entry' fields of CIE are\n  // populated; use CIE->fields and CIE->end as the start and limit for\n  // parsing. On success, populate the rest of *CIE, and return true; on\n  // failure, report the problem and return false.\n  bool ReadCIEFields(CIE *cie);\n\n  // Parse the fields of an FDE after the entry prologue, including any 'z'\n  // augmentation data. Assume that the 'Entry' fields of *FDE are\n  // initialized; use FDE->fields and FDE->end as the start and limit for\n  // parsing. Assume that FDE->cie is fully initialized. On success,\n  // populate the rest of *FDE, and return true; on failure, report the\n  // problem and return false.\n  bool ReadFDEFields(FDE *fde);\n\n  // Report that ENTRY is incomplete, and return false. This is just a\n  // trivial wrapper for invoking reporter_->Incomplete; it provides a\n  // little brevity.\n  bool ReportIncomplete(Entry *entry);\n\n  // Return true if ENCODING has the DW_EH_PE_indirect bit set.\n  static bool IsIndirectEncoding(DwarfPointerEncoding encoding) {\n    return encoding & DW_EH_PE_indirect;\n  }\n\n  // The contents of the DWARF .debug_info section we're parsing.\n  const char *buffer_;\n  size_t buffer_length_;\n\n  // For reading multi-byte values with the appropriate endianness.\n  ByteReader *reader_;\n\n  // The handler to which we should report the data we find.\n  Handler *handler_;\n\n  // For reporting problems in the info we're parsing.\n  Reporter *reporter_;\n\n  // True if we are processing .eh_frame-format data.\n  bool eh_frame_;\n};\n\n// The handler class for CallFrameInfo.  The a CFI parser calls the\n// member functions of a handler object to report the data it finds.\nclass CallFrameInfo::Handler {\n public:\n  // The pseudo-register number for the canonical frame address.\n  enum { kCFARegister = -1 };\n\n  Handler() { }\n  virtual ~Handler() { }\n\n  // The parser has found CFI for the machine code at ADDRESS,\n  // extending for LENGTH bytes. OFFSET is the offset of the frame\n  // description entry in the section, for use in error messages.\n  // VERSION is the version number of the CFI format. AUGMENTATION is\n  // a string describing any producer-specific extensions present in\n  // the data. RETURN_ADDRESS is the number of the register that holds\n  // the address to which the function should return.\n  //\n  // Entry should return true to process this CFI, or false to skip to\n  // the next entry.\n  //\n  // The parser invokes Entry for each Frame Description Entry (FDE)\n  // it finds.  The parser doesn't report Common Information Entries\n  // to the handler explicitly; instead, if the handler elects to\n  // process a given FDE, the parser reiterates the appropriate CIE's\n  // contents at the beginning of the FDE's rules.\n  virtual bool Entry(size_t offset, uint64 address, uint64 length,\n                     uint8 version, const std::string &augmentation,\n                     unsigned return_address) = 0;\n\n  // When the Entry function returns true, the parser calls these\n  // handler functions repeatedly to describe the rules for recovering\n  // registers at each instruction in the given range of machine code.\n  // Immediately after a call to Entry, the handler should assume that\n  // the rule for each callee-saves register is \"unchanged\" --- that\n  // is, that the register still has the value it had in the caller.\n  // \n  // If a *Rule function returns true, we continue processing this entry's\n  // instructions. If a *Rule function returns false, we stop evaluating\n  // instructions, and skip to the next entry. Either way, we call End\n  // before going on to the next entry.\n  //\n  // In all of these functions, if the REG parameter is kCFARegister, then\n  // the rule describes how to find the canonical frame address.\n  // kCFARegister may be passed as a BASE_REGISTER argument, meaning that\n  // the canonical frame address should be used as the base address for the\n  // computation. All other REG values will be positive.\n\n  // At ADDRESS, register REG's value is not recoverable.\n  virtual bool UndefinedRule(uint64 address, int reg) = 0;\n\n  // At ADDRESS, register REG's value is the same as that it had in\n  // the caller.\n  virtual bool SameValueRule(uint64 address, int reg) = 0;\n\n  // At ADDRESS, register REG has been saved at offset OFFSET from\n  // BASE_REGISTER.\n  virtual bool OffsetRule(uint64 address, int reg,\n                          int base_register, long offset) = 0;\n\n  // At ADDRESS, the caller's value of register REG is the current\n  // value of BASE_REGISTER plus OFFSET. (This rule doesn't provide an\n  // address at which the register's value is saved.)\n  virtual bool ValOffsetRule(uint64 address, int reg,\n                             int base_register, long offset) = 0;\n\n  // At ADDRESS, register REG has been saved in BASE_REGISTER. This differs\n  // from ValOffsetRule(ADDRESS, REG, BASE_REGISTER, 0), in that\n  // BASE_REGISTER is the \"home\" for REG's saved value: if you want to\n  // assign to a variable whose home is REG in the calling frame, you\n  // should put the value in BASE_REGISTER.\n  virtual bool RegisterRule(uint64 address, int reg, int base_register) = 0;\n\n  // At ADDRESS, the DWARF expression EXPRESSION yields the address at\n  // which REG was saved.\n  virtual bool ExpressionRule(uint64 address, int reg,\n                              const std::string &expression) = 0;\n\n  // At ADDRESS, the DWARF expression EXPRESSION yields the caller's\n  // value for REG. (This rule doesn't provide an address at which the\n  // register's value is saved.)\n  virtual bool ValExpressionRule(uint64 address, int reg,\n                                 const std::string &expression) = 0;\n\n  // Indicate that the rules for the address range reported by the\n  // last call to Entry are complete.  End should return true if\n  // everything is okay, or false if an error has occurred and parsing\n  // should stop.\n  virtual bool End() = 0;\n\n  // Handler functions for Linux C++ exception handling data. These are\n  // only called if the data includes 'z' augmentation strings.\n\n  // The Linux C++ ABI uses an extension of the DWARF CFI format to\n  // walk the stack to propagate exceptions from the throw to the\n  // appropriate catch, and do the appropriate cleanups along the way.\n  // CFI entries used for exception handling have two additional data\n  // associated with them:\n  //\n  // - The \"language-specific data area\" describes which exception\n  //   types the function has 'catch' clauses for, and indicates how\n  //   to go about re-entering the function at the appropriate catch\n  //   clause. If the exception is not caught, it describes the\n  //   destructors that must run before the frame is popped.\n  //\n  // - The \"personality routine\" is responsible for interpreting the\n  //   language-specific data area's contents, and deciding whether\n  //   the exception should continue to propagate down the stack,\n  //   perhaps after doing some cleanup for this frame, or whether the\n  //   exception will be caught here.\n  //\n  // In principle, the language-specific data area is opaque to\n  // everybody but the personality routine. In practice, these values\n  // may be useful or interesting to readers with extra context, and\n  // we have to at least skip them anyway, so we might as well report\n  // them to the handler.\n\n  // This entry's exception handling personality routine's address is\n  // ADDRESS. If INDIRECT is true, then ADDRESS is the address at\n  // which the routine's address is stored. The default definition for\n  // this handler function simply returns true, allowing parsing of\n  // the entry to continue.\n  virtual bool PersonalityRoutine(uint64 address, bool indirect) {\n    return true;\n  }\n\n  // This entry's language-specific data area (LSDA) is located at\n  // ADDRESS. If INDIRECT is true, then ADDRESS is the address at\n  // which the area's address is stored. The default definition for\n  // this handler function simply returns true, allowing parsing of\n  // the entry to continue.\n  virtual bool LanguageSpecificDataArea(uint64 address, bool indirect) {\n    return true;\n  }\n\n  // This entry describes a signal trampoline --- this frame is the\n  // caller of a signal handler. The default definition for this\n  // handler function simply returns true, allowing parsing of the\n  // entry to continue.\n  //\n  // The best description of the rationale for and meaning of signal\n  // trampoline CFI entries seems to be in the GCC bug database:\n  // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26208\n  virtual bool SignalHandler() { return true; }\n};\n\n// The CallFrameInfo class makes calls on an instance of this class to\n// report errors or warn about problems in the data it is parsing. The\n// default definitions of these methods print a message to stderr, but\n// you can make a derived class that overrides them.\nclass CallFrameInfo::Reporter {\n public:\n  // Create an error reporter which attributes troubles to the section\n  // named SECTION in FILENAME.\n  //\n  // Normally SECTION would be .debug_frame, but the Mac puts CFI data\n  // in a Mach-O section named __debug_frame. If we support\n  // Linux-style exception handling data, we could be reading an\n  // .eh_frame section.\n  Reporter(const std::string &filename,\n           const std::string &section = \".debug_frame\")\n      : filename_(filename), section_(section) { }\n  virtual ~Reporter() { }\n\n  // The CFI entry at OFFSET ends too early to be well-formed. KIND\n  // indicates what kind of entry it is; KIND can be kUnknown if we\n  // haven't parsed enough of the entry to tell yet.\n  virtual void Incomplete(uint64 offset, CallFrameInfo::EntryKind kind);\n\n  // The .eh_frame data has a four-byte zero at OFFSET where the next\n  // entry's length would be; this is a terminator. However, the buffer\n  // length as given to the CallFrameInfo constructor says there should be\n  // more data.\n  virtual void EarlyEHTerminator(uint64 offset);\n\n  // The FDE at OFFSET refers to the CIE at CIE_OFFSET, but the\n  // section is not that large.\n  virtual void CIEPointerOutOfRange(uint64 offset, uint64 cie_offset);\n\n  // The FDE at OFFSET refers to the CIE at CIE_OFFSET, but the entry\n  // there is not a CIE.\n  virtual void BadCIEId(uint64 offset, uint64 cie_offset);\n\n  // The FDE at OFFSET refers to a CIE with version number VERSION,\n  // which we don't recognize. We cannot parse DWARF CFI if it uses\n  // a version number we don't recognize.\n  virtual void UnrecognizedVersion(uint64 offset, int version);\n\n  // The FDE at OFFSET refers to a CIE with augmentation AUGMENTATION,\n  // which we don't recognize. We cannot parse DWARF CFI if it uses\n  // augmentations we don't recognize.\n  virtual void UnrecognizedAugmentation(uint64 offset,\n                                        const std::string &augmentation);\n\n  // The pointer encoding ENCODING, specified by the CIE at OFFSET, is not\n  // a valid encoding.\n  virtual void InvalidPointerEncoding(uint64 offset, uint8 encoding);\n\n  // The pointer encoding ENCODING, specified by the CIE at OFFSET, depends\n  // on a base address which has not been supplied.\n  virtual void UnusablePointerEncoding(uint64 offset, uint8 encoding);\n\n  // The CIE at OFFSET contains a DW_CFA_restore instruction at\n  // INSN_OFFSET, which may not appear in a CIE.\n  virtual void RestoreInCIE(uint64 offset, uint64 insn_offset);\n\n  // The entry at OFFSET, of kind KIND, has an unrecognized\n  // instruction at INSN_OFFSET.\n  virtual void BadInstruction(uint64 offset, CallFrameInfo::EntryKind kind,\n                              uint64 insn_offset);\n\n  // The instruction at INSN_OFFSET in the entry at OFFSET, of kind\n  // KIND, establishes a rule that cites the CFA, but we have not\n  // established a CFA rule yet.\n  virtual void NoCFARule(uint64 offset, CallFrameInfo::EntryKind kind, \n                         uint64 insn_offset);\n\n  // The instruction at INSN_OFFSET in the entry at OFFSET, of kind\n  // KIND, is a DW_CFA_restore_state instruction, but the stack of\n  // saved states is empty.\n  virtual void EmptyStateStack(uint64 offset, CallFrameInfo::EntryKind kind, \n                               uint64 insn_offset);\n\n  // The DW_CFA_remember_state instruction at INSN_OFFSET in the entry\n  // at OFFSET, of kind KIND, would restore a state that has no CFA\n  // rule, whereas the current state does have a CFA rule. This is\n  // bogus input, which the CallFrameInfo::Handler interface doesn't\n  // (and shouldn't) have any way to report.\n  virtual void ClearingCFARule(uint64 offset, CallFrameInfo::EntryKind kind, \n                               uint64 insn_offset);\n\n protected:\n  // The name of the file whose CFI we're reading.\n  std::string filename_;\n\n  // The name of the CFI section in that file.\n  std::string section_;\n};\n\n}  // namespace dwarf2reader\n\n#endif  // UTIL_DEBUGINFO_DWARF2READER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/dwarf2reader_cfi_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dwarf2reader_cfi_unittest.cc: Unit tests for dwarf2reader::CallFrameInfo\n\n#include <stdlib.h>\n\n#include <string>\n#include <vector>\n\n// The '.eh_frame' format, used by the Linux C++ ABI for exception\n// handling, is poorly specified. To help test our support for .eh_frame,\n// if you #define WRITE_ELF while compiling this file, and add the\n// 'include' directory from the binutils, gcc, or gdb source tree to the\n// #include path, then each test that calls the\n// PERHAPS_WRITE_DEBUG_FRAME_FILE or PERHAPS_WRITE_EH_FRAME_FILE will write\n// an ELF file containing a .debug_frame or .eh_frame section; you can then\n// use tools like readelf to examine the test data, and check the tools'\n// interpretation against the test's intentions. Each ELF file is named\n// \"cfitest-TEST\", where TEST identifies the particular test.\n#ifdef WRITE_ELF\n#include <errno.h>\n#include <stdio.h>\n#include <string.h>\nextern \"C\" {\n// To compile with WRITE_ELF, you should add the 'include' directory\n// of the binutils, gcc, or gdb source tree to your #include path;\n// that directory contains this header.\n#include \"elf/common.h\"\n}\n#endif\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/dwarf/bytereader-inl.h\"\n#include \"common/dwarf/cfi_assembler.h\"\n#include \"common/dwarf/dwarf2reader.h\"\n#include \"google_breakpad/common/breakpad_types.h\"\n\nusing google_breakpad::CFISection;\nusing google_breakpad::test_assembler::Label;\nusing google_breakpad::test_assembler::kBigEndian;\nusing google_breakpad::test_assembler::kLittleEndian;\nusing google_breakpad::test_assembler::Section;\n\nusing dwarf2reader::DwarfPointerEncoding;\nusing dwarf2reader::ENDIANNESS_BIG;\nusing dwarf2reader::ENDIANNESS_LITTLE;\nusing dwarf2reader::ByteReader;\nusing dwarf2reader::CallFrameInfo;\n\nusing std::string;\nusing std::vector;\nusing testing::InSequence;\nusing testing::Return;\nusing testing::Sequence;\nusing testing::Test;\nusing testing::_;\n\n#ifdef WRITE_ELF\nvoid WriteELFFrameSection(const char *filename, const char *section_name,\n                          const CFISection &section);\n#define PERHAPS_WRITE_DEBUG_FRAME_FILE(name, section)                   \\\n    WriteELFFrameSection(\"cfitest-\" name, \".debug_frame\", section);\n#define PERHAPS_WRITE_EH_FRAME_FILE(name, section)                      \\\n    WriteELFFrameSection(\"cfitest-\" name, \".eh_frame\", section);\n#else\n#define PERHAPS_WRITE_DEBUG_FRAME_FILE(name, section)\n#define PERHAPS_WRITE_EH_FRAME_FILE(name, section)\n#endif\n\nclass MockCallFrameInfoHandler: public CallFrameInfo::Handler {\n public:\n  MOCK_METHOD6(Entry, bool(size_t offset, uint64 address, uint64 length,\n                           uint8 version, const string &augmentation,\n                           unsigned return_address));\n  MOCK_METHOD2(UndefinedRule, bool(uint64 address, int reg));\n  MOCK_METHOD2(SameValueRule, bool(uint64 address, int reg));\n  MOCK_METHOD4(OffsetRule, bool(uint64 address, int reg, int base_register,\n                                long offset));\n  MOCK_METHOD4(ValOffsetRule, bool(uint64 address, int reg, int base_register,\n                                   long offset));\n  MOCK_METHOD3(RegisterRule, bool(uint64 address, int reg, int base_register));\n  MOCK_METHOD3(ExpressionRule, bool(uint64 address, int reg,\n                                    const string &expression));\n  MOCK_METHOD3(ValExpressionRule, bool(uint64 address, int reg,\n                                       const string &expression));\n  MOCK_METHOD0(End, bool());\n  MOCK_METHOD2(PersonalityRoutine, bool(uint64 address, bool indirect));\n  MOCK_METHOD2(LanguageSpecificDataArea, bool(uint64 address, bool indirect));\n  MOCK_METHOD0(SignalHandler, bool());\n};\n\nclass MockCallFrameErrorReporter: public CallFrameInfo::Reporter {\n public:\n  MockCallFrameErrorReporter() : Reporter(\"mock filename\", \"mock section\") { }\n  MOCK_METHOD2(Incomplete, void(uint64, CallFrameInfo::EntryKind));\n  MOCK_METHOD1(EarlyEHTerminator, void(uint64));\n  MOCK_METHOD2(CIEPointerOutOfRange, void(uint64, uint64));\n  MOCK_METHOD2(BadCIEId, void(uint64, uint64));\n  MOCK_METHOD2(UnrecognizedVersion, void(uint64, int version));\n  MOCK_METHOD2(UnrecognizedAugmentation, void(uint64, const string &));\n  MOCK_METHOD2(InvalidPointerEncoding, void(uint64, uint8));\n  MOCK_METHOD2(UnusablePointerEncoding, void(uint64, uint8));\n  MOCK_METHOD2(RestoreInCIE, void(uint64, uint64));\n  MOCK_METHOD3(BadInstruction, void(uint64, CallFrameInfo::EntryKind, uint64));\n  MOCK_METHOD3(NoCFARule, void(uint64, CallFrameInfo::EntryKind, uint64));\n  MOCK_METHOD3(EmptyStateStack, void(uint64, CallFrameInfo::EntryKind, uint64));\n};\n\nstruct CFIFixture {\n\n  enum { kCFARegister = CallFrameInfo::Handler::kCFARegister };\n\n  CFIFixture() {\n    // Default expectations for the data handler.\n    //\n    // - Leave Entry and End without expectations, as it's probably a\n    //   good idea to set those explicitly in each test.\n    //\n    // - Expect the *Rule functions to not be called, \n    //   so that each test can simply list the calls they expect.\n    //\n    // I gather I could use StrictMock for this, but the manual seems\n    // to suggest using that only as a last resort, and this isn't so\n    // bad.\n    EXPECT_CALL(handler, UndefinedRule(_, _)).Times(0);\n    EXPECT_CALL(handler, SameValueRule(_, _)).Times(0);\n    EXPECT_CALL(handler, OffsetRule(_, _, _, _)).Times(0);\n    EXPECT_CALL(handler, ValOffsetRule(_, _, _, _)).Times(0);\n    EXPECT_CALL(handler, RegisterRule(_, _, _)).Times(0);\n    EXPECT_CALL(handler, ExpressionRule(_, _, _)).Times(0);\n    EXPECT_CALL(handler, ValExpressionRule(_, _, _)).Times(0);\n    EXPECT_CALL(handler, PersonalityRoutine(_, _)).Times(0);\n    EXPECT_CALL(handler, LanguageSpecificDataArea(_, _)).Times(0);\n    EXPECT_CALL(handler, SignalHandler()).Times(0);\n\n    // Default expectations for the error/warning reporer.\n    EXPECT_CALL(reporter, Incomplete(_, _)).Times(0);\n    EXPECT_CALL(reporter, EarlyEHTerminator(_)).Times(0);\n    EXPECT_CALL(reporter, CIEPointerOutOfRange(_, _)).Times(0);\n    EXPECT_CALL(reporter, BadCIEId(_, _)).Times(0);\n    EXPECT_CALL(reporter, UnrecognizedVersion(_, _)).Times(0);\n    EXPECT_CALL(reporter, UnrecognizedAugmentation(_, _)).Times(0);\n    EXPECT_CALL(reporter, InvalidPointerEncoding(_, _)).Times(0);\n    EXPECT_CALL(reporter, UnusablePointerEncoding(_, _)).Times(0);\n    EXPECT_CALL(reporter, RestoreInCIE(_, _)).Times(0);\n    EXPECT_CALL(reporter, BadInstruction(_, _, _)).Times(0);\n    EXPECT_CALL(reporter, NoCFARule(_, _, _)).Times(0);\n    EXPECT_CALL(reporter, EmptyStateStack(_, _, _)).Times(0);\n  }\n\n  MockCallFrameInfoHandler handler;\n  MockCallFrameErrorReporter reporter;\n};\n\nclass CFI: public CFIFixture, public Test { };\n\nTEST_F(CFI, EmptyRegion) {\n  EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0);\n  EXPECT_CALL(handler, End()).Times(0);\n  static const char data[1] = { 42 };\n\n  ByteReader byte_reader(ENDIANNESS_BIG);\n  CallFrameInfo parser(data, 0, &byte_reader, &handler, &reporter);\n  EXPECT_TRUE(parser.Start());\n}\n\nTEST_F(CFI, IncompleteLength32) {\n  CFISection section(kBigEndian, 8);\n  section\n      // Not even long enough for an initial length.\n      .D16(0xa0f)\n      // Padding to keep valgrind happy. We subtract these off when we\n      // construct the parser.\n      .D16(0);\n\n  EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0);\n  EXPECT_CALL(handler, End()).Times(0);\n\n  EXPECT_CALL(reporter, Incomplete(_, CallFrameInfo::kUnknown))\n      .WillOnce(Return());\n\n  string contents;\n  ASSERT_TRUE(section.GetContents(&contents));\n\n  ByteReader byte_reader(ENDIANNESS_BIG);\n  byte_reader.SetAddressSize(8);\n  CallFrameInfo parser(contents.data(), contents.size() - 2,\n                       &byte_reader, &handler, &reporter);\n  EXPECT_FALSE(parser.Start());\n}\n\nTEST_F(CFI, IncompleteLength64) {\n  CFISection section(kLittleEndian, 4);\n  section\n      // An incomplete 64-bit DWARF initial length.\n      .D32(0xffffffff).D32(0x71fbaec2)\n      // Padding to keep valgrind happy. We subtract these off when we\n      // construct the parser.\n      .D32(0);\n\n  EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0);\n  EXPECT_CALL(handler, End()).Times(0);\n\n  EXPECT_CALL(reporter, Incomplete(_, CallFrameInfo::kUnknown))\n      .WillOnce(Return());\n\n  string contents;\n  ASSERT_TRUE(section.GetContents(&contents));\n\n  ByteReader byte_reader(ENDIANNESS_LITTLE);\n  byte_reader.SetAddressSize(4);\n  CallFrameInfo parser(contents.data(), contents.size() - 4,\n                       &byte_reader, &handler, &reporter);\n  EXPECT_FALSE(parser.Start());\n}\n\nTEST_F(CFI, IncompleteId32) {\n  CFISection section(kBigEndian, 8);\n  section\n      .D32(3)                      // Initial length, not long enough for id\n      .D8(0xd7).D8(0xe5).D8(0xf1)  // incomplete id\n      .CIEHeader(8727, 3983, 8889, 3, \"\")\n      .FinishEntry();\n\n  EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0);\n  EXPECT_CALL(handler, End()).Times(0);\n\n  EXPECT_CALL(reporter, Incomplete(_, CallFrameInfo::kUnknown))\n      .WillOnce(Return());\n\n  string contents;\n  ASSERT_TRUE(section.GetContents(&contents));\n\n  ByteReader byte_reader(ENDIANNESS_BIG);\n  byte_reader.SetAddressSize(8);\n  CallFrameInfo parser(contents.data(), contents.size(),\n                       &byte_reader, &handler, &reporter);\n  EXPECT_FALSE(parser.Start());\n}\n\nTEST_F(CFI, BadId32) {\n  CFISection section(kBigEndian, 8);\n  section\n      .D32(0x100)                       // Initial length\n      .D32(0xe802fade)                  // bogus ID\n      .Append(0x100 - 4, 0x42);         // make the length true\n  section\n      .CIEHeader(1672, 9872, 8529, 3, \"\")\n      .FinishEntry();\n\n  EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0);\n  EXPECT_CALL(handler, End()).Times(0);\n\n  EXPECT_CALL(reporter, CIEPointerOutOfRange(_, 0xe802fade))\n      .WillOnce(Return());\n\n  string contents;\n  ASSERT_TRUE(section.GetContents(&contents));\n\n  ByteReader byte_reader(ENDIANNESS_BIG);\n  byte_reader.SetAddressSize(8);\n  CallFrameInfo parser(contents.data(), contents.size(),\n                       &byte_reader, &handler, &reporter);\n  EXPECT_FALSE(parser.Start());\n}\n\n// A lone CIE shouldn't cause any handler calls.\nTEST_F(CFI, SingleCIE) {\n  CFISection section(kLittleEndian, 4);\n  section.CIEHeader(0xffe799a8, 0x3398dcdd, 0x6e9683de, 3, \"\");\n  section.Append(10, dwarf2reader::DW_CFA_nop);\n  section.FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"SingleCIE\", section);\n\n  EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0);\n  EXPECT_CALL(handler, End()).Times(0);\n\n  string contents;\n  EXPECT_TRUE(section.GetContents(&contents));\n  ByteReader byte_reader(ENDIANNESS_LITTLE);\n  byte_reader.SetAddressSize(4);\n  CallFrameInfo parser(contents.data(), contents.size(),\n                       &byte_reader, &handler, &reporter);\n  EXPECT_TRUE(parser.Start());\n}\n\n// One FDE, one CIE.\nTEST_F(CFI, OneFDE) {\n  CFISection section(kBigEndian, 4);\n  Label cie;\n  section\n      .Mark(&cie)\n      .CIEHeader(0x4be22f75, 0x2492236e, 0x6b6efb87, 3, \"\")\n      .FinishEntry()\n      .FDEHeader(cie, 0x7714740d, 0x3d5a10cd)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"OneFDE\", section);\n\n  {\n    InSequence s;\n    EXPECT_CALL(handler,\n                Entry(_, 0x7714740d, 0x3d5a10cd, 3, \"\", 0x6b6efb87))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End()).WillOnce(Return(true));\n  }\n\n  string contents;\n  EXPECT_TRUE(section.GetContents(&contents));\n  ByteReader byte_reader(ENDIANNESS_BIG);\n  byte_reader.SetAddressSize(4);\n  CallFrameInfo parser(contents.data(), contents.size(),\n                       &byte_reader, &handler, &reporter);\n  EXPECT_TRUE(parser.Start());\n}\n\n// Two FDEs share a CIE.\nTEST_F(CFI, TwoFDEsOneCIE) {\n  CFISection section(kBigEndian, 4);\n  Label cie;\n  section\n      // First FDE. readelf complains about this one because it makes\n      // a forward reference to its CIE.\n      .FDEHeader(cie, 0xa42744df, 0xa3b42121)\n      .FinishEntry()\n      // CIE.\n      .Mark(&cie)\n      .CIEHeader(0x04f7dc7b, 0x3d00c05f, 0xbd43cb59, 3, \"\")\n      .FinishEntry()\n      // Second FDE.\n      .FDEHeader(cie, 0x6057d391, 0x700f608d)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"TwoFDEsOneCIE\", section);\n\n  {\n    InSequence s;\n    EXPECT_CALL(handler,\n                Entry(_, 0xa42744df, 0xa3b42121, 3, \"\", 0xbd43cb59))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End()).WillOnce(Return(true));\n  }\n  {\n    InSequence s;\n    EXPECT_CALL(handler,\n                Entry(_, 0x6057d391, 0x700f608d, 3, \"\", 0xbd43cb59))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End()).WillOnce(Return(true));\n  }\n\n  string contents;\n  EXPECT_TRUE(section.GetContents(&contents));\n  ByteReader byte_reader(ENDIANNESS_BIG);\n  byte_reader.SetAddressSize(4);\n  CallFrameInfo parser(contents.data(), contents.size(),\n                       &byte_reader, &handler, &reporter);\n  EXPECT_TRUE(parser.Start());\n}\n\n// Two FDEs, two CIEs.\nTEST_F(CFI, TwoFDEsTwoCIEs) {\n  CFISection section(kLittleEndian, 8);\n  Label cie1, cie2;\n  section\n      // First CIE.\n      .Mark(&cie1)\n      .CIEHeader(0x694d5d45, 0x4233221b, 0xbf45e65a, 3, \"\")\n      .FinishEntry()\n      // First FDE which cites second CIE. readelf complains about\n      // this one because it makes a forward reference to its CIE.\n      .FDEHeader(cie2, 0x778b27dfe5871f05ULL, 0x324ace3448070926ULL)\n      .FinishEntry()\n      // Second FDE, which cites first CIE.\n      .FDEHeader(cie1, 0xf6054ca18b10bf5fULL, 0x45fdb970d8bca342ULL)\n      .FinishEntry()\n      // Second CIE.\n      .Mark(&cie2)\n      .CIEHeader(0xfba3fad7, 0x6287e1fd, 0x61d2c581, 2, \"\")\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"TwoFDEsTwoCIEs\", section);\n\n  {\n    InSequence s;\n    EXPECT_CALL(handler,\n                Entry(_, 0x778b27dfe5871f05ULL, 0x324ace3448070926ULL, 2,\n                      \"\", 0x61d2c581))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End()).WillOnce(Return(true));\n  }\n  {\n    InSequence s;\n    EXPECT_CALL(handler,\n                Entry(_, 0xf6054ca18b10bf5fULL, 0x45fdb970d8bca342ULL, 3,\n                      \"\", 0xbf45e65a))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End()).WillOnce(Return(true));\n  }\n\n  string contents;\n  EXPECT_TRUE(section.GetContents(&contents));\n  ByteReader byte_reader(ENDIANNESS_LITTLE);\n  byte_reader.SetAddressSize(8);\n  CallFrameInfo parser(contents.data(), contents.size(),\n                       &byte_reader, &handler, &reporter);\n  EXPECT_TRUE(parser.Start());\n}\n\n// An FDE whose CIE specifies a version we don't recognize.\nTEST_F(CFI, BadVersion) {\n  CFISection section(kBigEndian, 4);\n  Label cie1, cie2;\n  section\n      .Mark(&cie1)\n      .CIEHeader(0xca878cf0, 0x7698ec04, 0x7b616f54, 0x52, \"\")\n      .FinishEntry()\n      // We should skip this entry, as its CIE specifies a version we\n      // don't recognize.\n      .FDEHeader(cie1, 0x08852292, 0x2204004a)\n      .FinishEntry()\n      // Despite the above, we should visit this entry.\n      .Mark(&cie2)\n      .CIEHeader(0x7c3ae7c9, 0xb9b9a512, 0x96cb3264, 3, \"\")\n      .FinishEntry()\n      .FDEHeader(cie2, 0x2094735a, 0x6e875501)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"BadVersion\", section);\n\n  EXPECT_CALL(reporter, UnrecognizedVersion(_, 0x52))\n    .WillOnce(Return());\n\n  {\n    InSequence s;\n    // We should see no mention of the first FDE, but we should get\n    // a call to Entry for the second.\n    EXPECT_CALL(handler, Entry(_, 0x2094735a, 0x6e875501, 3, \"\",\n                               0x96cb3264))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End())\n        .WillOnce(Return(true));\n  }\n\n  string contents;\n  EXPECT_TRUE(section.GetContents(&contents));\n  ByteReader byte_reader(ENDIANNESS_BIG);\n  byte_reader.SetAddressSize(4);\n  CallFrameInfo parser(contents.data(), contents.size(),\n                       &byte_reader, &handler, &reporter);\n  EXPECT_FALSE(parser.Start());\n}\n\n// An FDE whose CIE specifies an augmentation we don't recognize.\nTEST_F(CFI, BadAugmentation) {\n  CFISection section(kBigEndian, 4);\n  Label cie1, cie2;\n  section\n      .Mark(&cie1)\n      .CIEHeader(0x4be22f75, 0x2492236e, 0x6b6efb87, 3, \"spaniels!\")\n      .FinishEntry()\n      // We should skip this entry, as its CIE specifies an\n      // augmentation we don't recognize.\n      .FDEHeader(cie1, 0x7714740d, 0x3d5a10cd)\n      .FinishEntry()\n      // Despite the above, we should visit this entry.\n      .Mark(&cie2)\n      .CIEHeader(0xf8bc4399, 0x8cf09931, 0xf2f519b2, 3, \"\")\n      .FinishEntry()\n      .FDEHeader(cie2, 0x7bf0fda0, 0xcbcd28d8)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"BadAugmentation\", section);\n\n  EXPECT_CALL(reporter, UnrecognizedAugmentation(_, \"spaniels!\"))\n    .WillOnce(Return());\n\n  {\n    InSequence s;\n    // We should see no mention of the first FDE, but we should get\n    // a call to Entry for the second.\n    EXPECT_CALL(handler, Entry(_, 0x7bf0fda0, 0xcbcd28d8, 3, \"\",\n                               0xf2f519b2))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End())\n        .WillOnce(Return(true));\n  }\n\n  string contents;\n  EXPECT_TRUE(section.GetContents(&contents));\n  ByteReader byte_reader(ENDIANNESS_BIG);\n  byte_reader.SetAddressSize(4);\n  CallFrameInfo parser(contents.data(), contents.size(),\n                       &byte_reader, &handler, &reporter);\n  EXPECT_FALSE(parser.Start());\n}\n\n// The return address column field is a byte in CFI version 1\n// (DWARF2), but a ULEB128 value in version 3 (DWARF3).\nTEST_F(CFI, CIEVersion1ReturnColumn) {\n  CFISection section(kBigEndian, 4);\n  Label cie;\n  section\n      // CIE, using the version 1 format: return column is a ubyte.\n      .Mark(&cie)\n      // Use a value for the return column that is parsed differently\n      // as a ubyte and as a ULEB128.\n      .CIEHeader(0xbcdea24f, 0x5be28286, 0x9f, 1, \"\")\n      .FinishEntry()\n      // FDE, citing that CIE.\n      .FDEHeader(cie, 0xb8d347b5, 0x825e55dc)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"CIEVersion1ReturnColumn\", section);\n\n  {\n    InSequence s;\n    EXPECT_CALL(handler, Entry(_, 0xb8d347b5, 0x825e55dc, 1, \"\", 0x9f))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End()).WillOnce(Return(true));\n  }\n\n  string contents;\n  EXPECT_TRUE(section.GetContents(&contents));\n  ByteReader byte_reader(ENDIANNESS_BIG);\n  byte_reader.SetAddressSize(4);\n  CallFrameInfo parser(contents.data(), contents.size(),\n                       &byte_reader, &handler, &reporter);\n  EXPECT_TRUE(parser.Start());\n}\n\n// The return address column field is a byte in CFI version 1\n// (DWARF2), but a ULEB128 value in version 3 (DWARF3).\nTEST_F(CFI, CIEVersion3ReturnColumn) {\n  CFISection section(kBigEndian, 4);\n  Label cie;\n  section\n      // CIE, using the version 3 format: return column is a ULEB128.\n      .Mark(&cie)\n      // Use a value for the return column that is parsed differently\n      // as a ubyte and as a ULEB128.\n      .CIEHeader(0x0ab4758d, 0xc010fdf7, 0x89, 3, \"\")\n      .FinishEntry()\n      // FDE, citing that CIE.\n      .FDEHeader(cie, 0x86763f2b, 0x2a66dc23)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"CIEVersion3ReturnColumn\", section);\n\n  {\n    InSequence s;\n    EXPECT_CALL(handler, Entry(_, 0x86763f2b, 0x2a66dc23, 3, \"\", 0x89))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End()).WillOnce(Return(true));\n  }\n\n  string contents;\n  EXPECT_TRUE(section.GetContents(&contents));\n  ByteReader byte_reader(ENDIANNESS_BIG);\n  byte_reader.SetAddressSize(4);\n  CallFrameInfo parser(contents.data(), contents.size(),\n                       &byte_reader, &handler, &reporter);\n  EXPECT_TRUE(parser.Start());\n}\n\nstruct CFIInsnFixture: public CFIFixture {\n  CFIInsnFixture() : CFIFixture() {\n    data_factor = 0xb6f;\n    return_register = 0x9be1ed9f;\n    version = 3;\n    cfa_base_register = 0x383a3aa;\n    cfa_offset = 0xf748;\n  }\n  \n  // Prepare SECTION to receive FDE instructions.\n  //\n  // - Append a stock CIE header that establishes the fixture's\n  //   code_factor, data_factor, return_register, version, and\n  //   augmentation values.\n  // - Have the CIE set up a CFA rule using cfa_base_register and\n  //   cfa_offset.\n  // - Append a stock FDE header, referring to the above CIE, for the\n  //   fde_size bytes at fde_start. Choose fde_start and fde_size\n  //   appropriately for the section's address size.\n  // - Set appropriate expectations on handler in sequence s for the\n  //   frame description entry and the CIE's CFA rule.\n  //\n  // On return, SECTION is ready to have FDE instructions appended to\n  // it, and its FinishEntry member called.\n  void StockCIEAndFDE(CFISection *section) {\n    // Choose appropriate constants for our address size.\n    if (section->AddressSize() == 4) {\n      fde_start = 0xc628ecfbU;\n      fde_size = 0x5dee04a2;\n      code_factor = 0x60b;\n    } else {\n      assert(section->AddressSize() == 8);\n      fde_start = 0x0005c57ce7806bd3ULL;\n      fde_size = 0x2699521b5e333100ULL;\n      code_factor = 0x01008e32855274a8ULL;\n    }\n\n    // Create the CIE.\n    (*section)\n        .Mark(&cie_label)\n        .CIEHeader(code_factor, data_factor, return_register, version,\n                   \"\")\n        .D8(dwarf2reader::DW_CFA_def_cfa)\n        .ULEB128(cfa_base_register)\n        .ULEB128(cfa_offset)\n        .FinishEntry();\n\n    // Create the FDE.\n    section->FDEHeader(cie_label, fde_start, fde_size);\n\n    // Expect an Entry call for the FDE and a ValOffsetRule call for the\n    // CIE's CFA rule.\n    EXPECT_CALL(handler, Entry(_, fde_start, fde_size, version, \"\",\n                               return_register))\n        .InSequence(s)\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, ValOffsetRule(fde_start, kCFARegister,\n                                       cfa_base_register, cfa_offset))\n      .InSequence(s)\n      .WillOnce(Return(true));\n  }\n\n  // Run the contents of SECTION through a CallFrameInfo parser,\n  // expecting parser.Start to return SUCCEEDS\n  void ParseSection(CFISection *section, bool succeeds = true) {\n    string contents;\n    EXPECT_TRUE(section->GetContents(&contents));\n    dwarf2reader::Endianness endianness;\n    if (section->endianness() == kBigEndian)\n      endianness = ENDIANNESS_BIG;\n    else {\n      assert(section->endianness() == kLittleEndian);\n      endianness = ENDIANNESS_LITTLE;\n    }\n    ByteReader byte_reader(endianness);\n    byte_reader.SetAddressSize(section->AddressSize());\n    CallFrameInfo parser(contents.data(), contents.size(),\n                         &byte_reader, &handler, &reporter);\n    if (succeeds)\n      EXPECT_TRUE(parser.Start());\n    else\n      EXPECT_FALSE(parser.Start());\n  }\n\n  Label cie_label;\n  Sequence s;\n  uint64 code_factor;\n  int data_factor;\n  unsigned return_register;\n  unsigned version;\n  unsigned cfa_base_register;\n  int cfa_offset;\n  uint64 fde_start, fde_size;\n};\n\nclass CFIInsn: public CFIInsnFixture, public Test { };\n\nTEST_F(CFIInsn, DW_CFA_set_loc) {\n  CFISection section(kBigEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_set_loc).D32(0xb1ee3e7a)\n      // Use DW_CFA_def_cfa to force a handler call that we can use to\n      // check the effect of the DW_CFA_set_loc.\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x4defb431).ULEB128(0x6d17b0ee)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"DW_CFA_set_loc\", section);\n\n  EXPECT_CALL(handler,\n              ValOffsetRule(0xb1ee3e7a, kCFARegister, 0x4defb431, 0x6d17b0ee))\n      .InSequence(s)\n      .WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_advance_loc) {\n  CFISection section(kBigEndian, 8);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_advance_loc | 0x2a)\n      // Use DW_CFA_def_cfa to force a handler call that we can use to\n      // check the effect of the DW_CFA_advance_loc.\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x5bbb3715).ULEB128(0x0186c7bf)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"DW_CFA_advance_loc\", section);\n\n  EXPECT_CALL(handler,\n              ValOffsetRule(fde_start + 0x2a * code_factor,\n                            kCFARegister, 0x5bbb3715, 0x0186c7bf))\n        .InSequence(s)\n        .WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_advance_loc1) {\n  CFISection section(kLittleEndian, 8);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_advance_loc1).D8(0xd8)\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x69d5696a).ULEB128(0x1eb7fc93)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"DW_CFA_advance_loc1\", section);\n\n  EXPECT_CALL(handler,\n              ValOffsetRule((fde_start + 0xd8 * code_factor),\n                            kCFARegister, 0x69d5696a, 0x1eb7fc93))\n      .InSequence(s)\n      .WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_advance_loc2) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_advance_loc2).D16(0x3adb)\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x3a368bed).ULEB128(0x3194ee37)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"DW_CFA_advance_loc2\", section);\n\n  EXPECT_CALL(handler,\n              ValOffsetRule((fde_start + 0x3adb * code_factor),\n                            kCFARegister, 0x3a368bed, 0x3194ee37))\n      .InSequence(s)\n      .WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_advance_loc4) {\n  CFISection section(kBigEndian, 8);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_advance_loc4).D32(0x15813c88)\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x135270c5).ULEB128(0x24bad7cb)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"DW_CFA_advance_loc4\", section);\n\n  EXPECT_CALL(handler,\n              ValOffsetRule((fde_start + 0x15813c88ULL * code_factor),\n                            kCFARegister, 0x135270c5, 0x24bad7cb))\n      .InSequence(s)\n      .WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_MIPS_advance_loc8) {\n  code_factor = 0x2d;\n  CFISection section(kBigEndian, 8);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_MIPS_advance_loc8).D64(0x3c4f3945b92c14ULL)\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0xe17ed602).ULEB128(0x3d162e7f)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"DW_CFA_advance_loc8\", section);\n\n  EXPECT_CALL(handler,\n              ValOffsetRule((fde_start + 0x3c4f3945b92c14ULL * code_factor),\n                            kCFARegister, 0xe17ed602, 0x3d162e7f))\n      .InSequence(s)\n      .WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_def_cfa) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x4e363a85).ULEB128(0x815f9aa7)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"DW_CFA_def_cfa\", section);\n\n  EXPECT_CALL(handler,\n              ValOffsetRule(fde_start, kCFARegister, 0x4e363a85, 0x815f9aa7))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_def_cfa_sf) {\n  CFISection section(kBigEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_def_cfa_sf).ULEB128(0x8ccb32b7).LEB128(0x9ea)\n      .D8(dwarf2reader::DW_CFA_def_cfa_sf).ULEB128(0x9b40f5da).LEB128(-0x40a2)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              ValOffsetRule(fde_start, kCFARegister, 0x8ccb32b7,\n                            0x9ea * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler,\n              ValOffsetRule(fde_start, kCFARegister, 0x9b40f5da,\n                            -0x40a2 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_def_cfa_register) {\n  CFISection section(kLittleEndian, 8);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_def_cfa_register).ULEB128(0x3e7e9363)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              ValOffsetRule(fde_start, kCFARegister, 0x3e7e9363, cfa_offset))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\n// DW_CFA_def_cfa_register should have no effect when applied to a\n// non-base/offset rule.\nTEST_F(CFIInsn, DW_CFA_def_cfa_registerBadRule) {\n  CFISection section(kBigEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_def_cfa_expression).Block(\"needle in a haystack\")\n      .D8(dwarf2reader::DW_CFA_def_cfa_register).ULEB128(0xf1b49e49)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              ValExpressionRule(fde_start, kCFARegister,\n                                \"needle in a haystack\"))\n      .WillRepeatedly(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_def_cfa_offset) {\n  CFISection section(kBigEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_def_cfa_offset).ULEB128(0x1e8e3b9b)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              ValOffsetRule(fde_start, kCFARegister, cfa_base_register,\n                            0x1e8e3b9b))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_def_cfa_offset_sf) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_def_cfa_offset_sf).LEB128(0x970)\n      .D8(dwarf2reader::DW_CFA_def_cfa_offset_sf).LEB128(-0x2cd)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              ValOffsetRule(fde_start, kCFARegister, cfa_base_register,\n                            0x970 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler,\n              ValOffsetRule(fde_start, kCFARegister, cfa_base_register,\n                            -0x2cd * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\n// DW_CFA_def_cfa_offset should have no effect when applied to a\n// non-base/offset rule.\nTEST_F(CFIInsn, DW_CFA_def_cfa_offsetBadRule) {\n  CFISection section(kBigEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_def_cfa_expression).Block(\"six ways to Sunday\")\n      .D8(dwarf2reader::DW_CFA_def_cfa_offset).ULEB128(0x1e8e3b9b)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              ValExpressionRule(fde_start, kCFARegister, \"six ways to Sunday\"))\n      .WillRepeatedly(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_def_cfa_expression) {\n  CFISection section(kLittleEndian, 8);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_def_cfa_expression).Block(\"eating crow\")\n      .FinishEntry();\n\n  EXPECT_CALL(handler, ValExpressionRule(fde_start, kCFARegister,\n                                         \"eating crow\"))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_undefined) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0x300ce45d)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, UndefinedRule(fde_start, 0x300ce45d))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_same_value) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_same_value).ULEB128(0x3865a760)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, SameValueRule(fde_start, 0x3865a760))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_offset) {\n  CFISection section(kBigEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_offset | 0x2c).ULEB128(0x9f6)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              OffsetRule(fde_start, 0x2c, kCFARegister, 0x9f6 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_offset_extended) {\n  CFISection section(kBigEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_offset_extended).ULEB128(0x402b).ULEB128(0xb48)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              OffsetRule(fde_start, 0x402b, kCFARegister, 0xb48 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_offset_extended_sf) {\n  CFISection section(kBigEndian, 8);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_offset_extended_sf)\n          .ULEB128(0x997c23ee).LEB128(0x2d00)\n      .D8(dwarf2reader::DW_CFA_offset_extended_sf)\n          .ULEB128(0x9519eb82).LEB128(-0xa77)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              OffsetRule(fde_start, 0x997c23ee,\n                         kCFARegister, 0x2d00 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler,\n              OffsetRule(fde_start, 0x9519eb82,\n                         kCFARegister, -0xa77 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_val_offset) {\n  CFISection section(kBigEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_val_offset).ULEB128(0x623562fe).ULEB128(0x673)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              ValOffsetRule(fde_start, 0x623562fe,\n                            kCFARegister, 0x673 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_val_offset_sf) {\n  CFISection section(kBigEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_val_offset_sf).ULEB128(0x6f4f).LEB128(0xaab)\n      .D8(dwarf2reader::DW_CFA_val_offset_sf).ULEB128(0x2483).LEB128(-0x8a2)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              ValOffsetRule(fde_start, 0x6f4f,\n                            kCFARegister, 0xaab * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler,\n              ValOffsetRule(fde_start, 0x2483,\n                            kCFARegister, -0x8a2 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_register) {\n  CFISection section(kLittleEndian, 8);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_register).ULEB128(0x278d18f9).ULEB128(0x1a684414)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, RegisterRule(fde_start, 0x278d18f9, 0x1a684414))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_expression) {\n  CFISection section(kBigEndian, 8);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_expression).ULEB128(0xa1619fb2)\n      .Block(\"plus ça change, plus c'est la même chose\")\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              ExpressionRule(fde_start, 0xa1619fb2,\n                             \"plus ça change, plus c'est la même chose\"))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_val_expression) {\n  CFISection section(kBigEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_val_expression).ULEB128(0xc5e4a9e3)\n      .Block(\"he who has the gold makes the rules\")\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              ValExpressionRule(fde_start, 0xc5e4a9e3,\n                                \"he who has the gold makes the rules\"))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_restore) {\n  CFISection section(kLittleEndian, 8);\n  code_factor = 0x01bd188a9b1fa083ULL;\n  data_factor = -0x1ac8;\n  return_register = 0x8c35b049;\n  version = 2;\n  fde_start = 0x2d70fe998298bbb1ULL;\n  fde_size = 0x46ccc2e63cf0b108ULL;\n  Label cie;\n  section\n      .Mark(&cie)\n      .CIEHeader(code_factor, data_factor, return_register, version,\n                 \"\")\n      // Provide a CFA rule, because register rules require them.\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x6ca1d50e).ULEB128(0x372e38e8)\n      // Provide an offset(N) rule for register 0x3c.\n      .D8(dwarf2reader::DW_CFA_offset | 0x3c).ULEB128(0xb348)\n      .FinishEntry()\n      // In the FDE...\n      .FDEHeader(cie, fde_start, fde_size)\n      // At a second address, provide a new offset(N) rule for register 0x3c.\n      .D8(dwarf2reader::DW_CFA_advance_loc | 0x13)\n      .D8(dwarf2reader::DW_CFA_offset | 0x3c).ULEB128(0x9a50)\n      // At a third address, restore the original rule for register 0x3c.\n      .D8(dwarf2reader::DW_CFA_advance_loc | 0x01)\n      .D8(dwarf2reader::DW_CFA_restore | 0x3c)\n      .FinishEntry();\n\n  {\n    InSequence s;\n    EXPECT_CALL(handler,\n                Entry(_, fde_start, fde_size, version, \"\", return_register))\n        .WillOnce(Return(true));\n    // CIE's CFA rule.\n    EXPECT_CALL(handler,\n                ValOffsetRule(fde_start, kCFARegister, 0x6ca1d50e, 0x372e38e8))\n        .WillOnce(Return(true));\n    // CIE's rule for register 0x3c.\n    EXPECT_CALL(handler,\n                OffsetRule(fde_start, 0x3c, kCFARegister, 0xb348 * data_factor))\n        .WillOnce(Return(true));\n    // FDE's rule for register 0x3c.\n    EXPECT_CALL(handler,\n                OffsetRule(fde_start + 0x13 * code_factor, 0x3c,\n                           kCFARegister, 0x9a50 * data_factor))\n        .WillOnce(Return(true));\n    // Restore CIE's rule for register 0x3c.\n    EXPECT_CALL(handler,\n                OffsetRule(fde_start + (0x13 + 0x01) * code_factor, 0x3c,\n                           kCFARegister, 0xb348 * data_factor))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End()).WillOnce(Return(true));\n  }\n    \n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_restoreNoRule) {\n  CFISection section(kBigEndian, 4);\n  code_factor = 0x005f78143c1c3b82ULL;\n  data_factor = 0x25d0;\n  return_register = 0xe8;\n  version = 1;\n  fde_start = 0x4062e30f;\n  fde_size = 0x5302a389;\n  Label cie;\n  section\n      .Mark(&cie)\n      .CIEHeader(code_factor, data_factor, return_register, version, \"\")\n      // Provide a CFA rule, because register rules require them.\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x470aa334).ULEB128(0x099ef127)\n      .FinishEntry()\n      // In the FDE...\n      .FDEHeader(cie, fde_start, fde_size)\n      // At a second address, provide an offset(N) rule for register 0x2c.\n      .D8(dwarf2reader::DW_CFA_advance_loc | 0x7)\n      .D8(dwarf2reader::DW_CFA_offset | 0x2c).ULEB128(0x1f47)\n      // At a third address, restore the (missing) CIE rule for register 0x2c.\n      .D8(dwarf2reader::DW_CFA_advance_loc | 0xb)\n      .D8(dwarf2reader::DW_CFA_restore | 0x2c)\n      .FinishEntry();\n\n  {\n    InSequence s;\n    EXPECT_CALL(handler,\n                Entry(_, fde_start, fde_size, version, \"\", return_register))\n        .WillOnce(Return(true));\n    // CIE's CFA rule.\n    EXPECT_CALL(handler,\n                ValOffsetRule(fde_start, kCFARegister, 0x470aa334, 0x099ef127))\n        .WillOnce(Return(true));\n    // FDE's rule for register 0x2c.\n    EXPECT_CALL(handler,\n                OffsetRule(fde_start + 0x7 * code_factor, 0x2c,\n                           kCFARegister, 0x1f47 * data_factor))\n        .WillOnce(Return(true));\n    // Restore CIE's (missing) rule for register 0x2c.\n    EXPECT_CALL(handler,\n                SameValueRule(fde_start + (0x7 + 0xb) * code_factor, 0x2c))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End()).WillOnce(Return(true));\n  }\n    \n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_restore_extended) {\n  CFISection section(kBigEndian, 4);\n  code_factor = 0x126e;\n  data_factor = -0xd8b;\n  return_register = 0x77711787;\n  version = 3;\n  fde_start = 0x01f55a45;\n  fde_size = 0x452adb80;\n  Label cie;\n  section\n      .Mark(&cie)\n      .CIEHeader(code_factor, data_factor, return_register, version,\n                 \"\", true /* dwarf64 */ )\n      // Provide a CFA rule, because register rules require them.\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x56fa0edd).ULEB128(0x097f78a5)\n      // Provide an offset(N) rule for register 0x0f9b8a1c.\n      .D8(dwarf2reader::DW_CFA_offset_extended)\n          .ULEB128(0x0f9b8a1c).ULEB128(0xc979)\n      .FinishEntry()\n      // In the FDE...\n      .FDEHeader(cie, fde_start, fde_size)\n      // At a second address, provide a new offset(N) rule for reg 0x0f9b8a1c.\n      .D8(dwarf2reader::DW_CFA_advance_loc | 0x3)\n      .D8(dwarf2reader::DW_CFA_offset_extended)\n          .ULEB128(0x0f9b8a1c).ULEB128(0x3b7b)\n      // At a third address, restore the original rule for register 0x0f9b8a1c.\n      .D8(dwarf2reader::DW_CFA_advance_loc | 0x04)\n      .D8(dwarf2reader::DW_CFA_restore_extended).ULEB128(0x0f9b8a1c)\n      .FinishEntry();\n\n  {\n    InSequence s;\n    EXPECT_CALL(handler,\n                Entry(_, fde_start, fde_size, version, \"\", return_register))\n        .WillOnce(Return(true));\n    // CIE's CFA rule.\n    EXPECT_CALL(handler,\n                ValOffsetRule(fde_start, kCFARegister, 0x56fa0edd, 0x097f78a5))\n        .WillOnce(Return(true));\n    // CIE's rule for register 0x0f9b8a1c.\n    EXPECT_CALL(handler,\n                OffsetRule(fde_start, 0x0f9b8a1c, kCFARegister,\n                           0xc979 * data_factor))\n        .WillOnce(Return(true));\n    // FDE's rule for register 0x0f9b8a1c.\n    EXPECT_CALL(handler,\n                OffsetRule(fde_start + 0x3 * code_factor, 0x0f9b8a1c,\n                           kCFARegister, 0x3b7b * data_factor))\n        .WillOnce(Return(true));\n    // Restore CIE's rule for register 0x0f9b8a1c.\n    EXPECT_CALL(handler,\n                OffsetRule(fde_start + (0x3 + 0x4) * code_factor, 0x0f9b8a1c,\n                           kCFARegister, 0xc979 * data_factor))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End()).WillOnce(Return(true));\n  }\n    \n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_remember_and_restore_state) {\n  CFISection section(kLittleEndian, 8);\n  StockCIEAndFDE(&section);\n\n  // We create a state, save it, modify it, and then restore. We\n  // refer to the state that is overridden the restore as the\n  // \"outgoing\" state, and the restored state the \"incoming\" state.\n  //\n  // Register         outgoing        incoming        expect\n  // 1                offset(N)       no rule         new \"same value\" rule\n  // 2                register(R)     offset(N)       report changed rule\n  // 3                offset(N)       offset(M)       report changed offset\n  // 4                offset(N)       offset(N)       no report\n  // 5                offset(N)       no rule         new \"same value\" rule\n  section\n      // Create the \"incoming\" state, which we will save and later restore.\n      .D8(dwarf2reader::DW_CFA_offset | 2).ULEB128(0x9806)\n      .D8(dwarf2reader::DW_CFA_offset | 3).ULEB128(0x995d)\n      .D8(dwarf2reader::DW_CFA_offset | 4).ULEB128(0x7055)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      // Advance to a new instruction; an implementation could legitimately\n      // ignore all but the final rule for a given register at a given address.\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      // Create the \"outgoing\" state, which we will discard.\n      .D8(dwarf2reader::DW_CFA_offset | 1).ULEB128(0xea1a)\n      .D8(dwarf2reader::DW_CFA_register).ULEB128(2).ULEB128(0x1d2a3767)\n      .D8(dwarf2reader::DW_CFA_offset | 3).ULEB128(0xdd29)\n      .D8(dwarf2reader::DW_CFA_offset | 5).ULEB128(0xf1ce)\n      // At a third address, restore the incoming state.\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  uint64 addr = fde_start;\n\n  // Expect the incoming rules to be reported.\n  EXPECT_CALL(handler, OffsetRule(addr, 2, kCFARegister, 0x9806 * data_factor))\n    .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, OffsetRule(addr, 3, kCFARegister, 0x995d * data_factor))\n    .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, OffsetRule(addr, 4, kCFARegister, 0x7055 * data_factor))\n    .InSequence(s).WillOnce(Return(true));\n\n  addr += code_factor;\n\n  // After the save, we establish the outgoing rule set.\n  EXPECT_CALL(handler, OffsetRule(addr, 1, kCFARegister, 0xea1a * data_factor))\n    .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, RegisterRule(addr, 2, 0x1d2a3767))\n    .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, OffsetRule(addr, 3, kCFARegister, 0xdd29 * data_factor))\n    .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, OffsetRule(addr, 5, kCFARegister, 0xf1ce * data_factor))\n    .InSequence(s).WillOnce(Return(true));\n\n  addr += code_factor;\n\n  // Finally, after the restore, expect to see the differences from\n  // the outgoing to the incoming rules reported.\n  EXPECT_CALL(handler, SameValueRule(addr, 1))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, OffsetRule(addr, 2, kCFARegister, 0x9806 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, OffsetRule(addr, 3, kCFARegister, 0x995d * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, SameValueRule(addr, 5))\n      .InSequence(s).WillOnce(Return(true));\n\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\n// Check that restoring a rule set reports changes to the CFA rule.\nTEST_F(CFIInsn, DW_CFA_remember_and_restore_stateCFA) {\n  CFISection section(kBigEndian, 4);\n  StockCIEAndFDE(&section);\n\n  section\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_def_cfa_offset).ULEB128(0x90481102)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, ValOffsetRule(fde_start + code_factor, kCFARegister,\n                                     cfa_base_register, 0x90481102))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, ValOffsetRule(fde_start + code_factor * 2, kCFARegister,\n                                     cfa_base_register, cfa_offset))\n      .InSequence(s).WillOnce(Return(true));\n\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_nop) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_nop)\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x3fb8d4f1).ULEB128(0x078dc67b)\n      .D8(dwarf2reader::DW_CFA_nop)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              ValOffsetRule(fde_start, kCFARegister, 0x3fb8d4f1, 0x078dc67b))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_GNU_window_save) {\n  CFISection section(kBigEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_GNU_window_save)\n      .FinishEntry();\n\n  // Don't include all the rules in any particular sequence.\n\n  // The caller's %o0-%o7 have become the callee's %i0-%i7. This is\n  // the GCC register numbering.\n  for (int i = 8; i < 16; i++)\n    EXPECT_CALL(handler, RegisterRule(fde_start, i, i + 16))\n        .WillOnce(Return(true));\n  // The caller's %l0-%l7 and %i0-%i7 have been saved at the top of\n  // its frame.\n  for (int i = 16; i < 32; i++)\n    EXPECT_CALL(handler, OffsetRule(fde_start, i, kCFARegister, (i-16) * 4))\n        .WillOnce(Return(true));\n\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_GNU_args_size) {\n  CFISection section(kLittleEndian, 8);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_GNU_args_size).ULEB128(0xeddfa520)\n      // Verify that we see this, meaning we parsed the above properly.\n      .D8(dwarf2reader::DW_CFA_offset | 0x23).ULEB128(0x269)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              OffsetRule(fde_start, 0x23, kCFARegister, 0x269 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIInsn, DW_CFA_GNU_negative_offset_extended) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_GNU_negative_offset_extended)\n      .ULEB128(0x430cc87a).ULEB128(0x613)\n      .FinishEntry();\n\n  EXPECT_CALL(handler,\n              OffsetRule(fde_start, 0x430cc87a,\n                         kCFARegister, -0x613 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\n// Three FDEs: skip the second\nTEST_F(CFIInsn, SkipFDE) {\n  CFISection section(kBigEndian, 4);\n  Label cie;\n  section\n      // CIE, used by all FDEs.\n      .Mark(&cie)\n      .CIEHeader(0x010269f2, 0x9177, 0xedca5849, 2, \"\")\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x42ed390b).ULEB128(0x98f43aad)\n      .FinishEntry()\n      // First FDE.\n      .FDEHeader(cie, 0xa870ebdd, 0x60f6aa4)\n      .D8(dwarf2reader::DW_CFA_register).ULEB128(0x3a860351).ULEB128(0x6c9a6bcf)\n      .FinishEntry()\n      // Second FDE.\n      .FDEHeader(cie, 0xc534f7c0, 0xf6552e9, true /* dwarf64 */)\n      .D8(dwarf2reader::DW_CFA_register).ULEB128(0x1b62c234).ULEB128(0x26586b18)\n      .FinishEntry()\n      // Third FDE.\n      .FDEHeader(cie, 0xf681cfc8, 0x7e4594e)\n      .D8(dwarf2reader::DW_CFA_register).ULEB128(0x26c53934).ULEB128(0x18eeb8a4)\n      .FinishEntry();\n\n  {\n    InSequence s;\n\n    // Process the first FDE.\n    EXPECT_CALL(handler, Entry(_, 0xa870ebdd, 0x60f6aa4, 2, \"\", 0xedca5849))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, ValOffsetRule(0xa870ebdd, kCFARegister,\n                                       0x42ed390b, 0x98f43aad))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, RegisterRule(0xa870ebdd, 0x3a860351, 0x6c9a6bcf))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End())\n        .WillOnce(Return(true));\n\n    // Skip the second FDE.\n    EXPECT_CALL(handler, Entry(_, 0xc534f7c0, 0xf6552e9, 2, \"\", 0xedca5849))\n        .WillOnce(Return(false));\n\n    // Process the third FDE.\n    EXPECT_CALL(handler, Entry(_, 0xf681cfc8, 0x7e4594e, 2, \"\", 0xedca5849))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, ValOffsetRule(0xf681cfc8, kCFARegister,\n                                       0x42ed390b, 0x98f43aad))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, RegisterRule(0xf681cfc8, 0x26c53934, 0x18eeb8a4))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, End())\n        .WillOnce(Return(true));\n  }\n\n  ParseSection(&section);\n}\n\n// Quit processing in the middle of an entry's instructions.\nTEST_F(CFIInsn, QuitMidentry) {\n  CFISection section(kLittleEndian, 8);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_register).ULEB128(0xe0cf850d).ULEB128(0x15aab431)\n      .D8(dwarf2reader::DW_CFA_expression).ULEB128(0x46750aa5).Block(\"meat\")\n      .FinishEntry();\n\n  EXPECT_CALL(handler, RegisterRule(fde_start, 0xe0cf850d, 0x15aab431))\n      .InSequence(s).WillOnce(Return(false));\n  EXPECT_CALL(handler, End())\n      .InSequence(s).WillOnce(Return(true));\n  \n  ParseSection(&section, false);\n}\n\nclass CFIRestore: public CFIInsnFixture, public Test { };\n\nTEST_F(CFIRestore, RestoreUndefinedRuleUnchanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0x0bac878e)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, UndefinedRule(fde_start, 0x0bac878e))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreUndefinedRuleChanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0x7dedff5f)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_same_value).ULEB128(0x7dedff5f)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, UndefinedRule(fde_start, 0x7dedff5f))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, SameValueRule(fde_start + code_factor, 0x7dedff5f))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, UndefinedRule(fde_start + 2 * code_factor, 0x7dedff5f))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreSameValueRuleUnchanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_same_value).ULEB128(0xadbc9b3a)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, SameValueRule(fde_start, 0xadbc9b3a))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreSameValueRuleChanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_same_value).ULEB128(0x3d90dcb5)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0x3d90dcb5)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, SameValueRule(fde_start, 0x3d90dcb5))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0x3d90dcb5))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, SameValueRule(fde_start + 2 * code_factor, 0x3d90dcb5))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreOffsetRuleUnchanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_offset | 0x14).ULEB128(0xb6f)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, OffsetRule(fde_start, 0x14,\n                                  kCFARegister, 0xb6f * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreOffsetRuleChanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_offset | 0x21).ULEB128(0xeb7)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0x21)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, OffsetRule(fde_start, 0x21,\n                                  kCFARegister, 0xeb7 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0x21))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, OffsetRule(fde_start + 2 * code_factor, 0x21,\n                                  kCFARegister, 0xeb7 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreOffsetRuleChangedOffset) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_offset | 0x21).ULEB128(0x134)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_offset | 0x21).ULEB128(0xf4f)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, OffsetRule(fde_start, 0x21,\n                                  kCFARegister, 0x134 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, OffsetRule(fde_start + code_factor, 0x21,\n                                  kCFARegister, 0xf4f * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, OffsetRule(fde_start + 2 * code_factor, 0x21,\n                                  kCFARegister, 0x134 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreValOffsetRuleUnchanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_val_offset).ULEB128(0x829caee6).ULEB128(0xe4c)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, ValOffsetRule(fde_start, 0x829caee6,\n                                  kCFARegister, 0xe4c * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreValOffsetRuleChanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_val_offset).ULEB128(0xf17c36d6).ULEB128(0xeb7)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0xf17c36d6)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, ValOffsetRule(fde_start, 0xf17c36d6,\n                                  kCFARegister, 0xeb7 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0xf17c36d6))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, ValOffsetRule(fde_start + 2 * code_factor, 0xf17c36d6,\n                                  kCFARegister, 0xeb7 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreValOffsetRuleChangedValOffset) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_val_offset).ULEB128(0x2cf0ab1b).ULEB128(0x562)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_val_offset).ULEB128(0x2cf0ab1b).ULEB128(0xe88)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, ValOffsetRule(fde_start, 0x2cf0ab1b,\n                                  kCFARegister, 0x562 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, ValOffsetRule(fde_start + code_factor, 0x2cf0ab1b,\n                                  kCFARegister, 0xe88 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, ValOffsetRule(fde_start + 2 * code_factor, 0x2cf0ab1b,\n                                  kCFARegister, 0x562 * data_factor))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreRegisterRuleUnchanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_register).ULEB128(0x77514acc).ULEB128(0x464de4ce)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, RegisterRule(fde_start, 0x77514acc, 0x464de4ce))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreRegisterRuleChanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_register).ULEB128(0xe39acce5).ULEB128(0x095f1559)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0xe39acce5)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, RegisterRule(fde_start, 0xe39acce5, 0x095f1559))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0xe39acce5))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, RegisterRule(fde_start + 2 * code_factor, 0xe39acce5,\n                                    0x095f1559))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreRegisterRuleChangedRegister) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_register).ULEB128(0xd40e21b1).ULEB128(0x16607d6a)\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_register).ULEB128(0xd40e21b1).ULEB128(0xbabb4742)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, RegisterRule(fde_start, 0xd40e21b1, 0x16607d6a))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, RegisterRule(fde_start + code_factor, 0xd40e21b1,\n                                    0xbabb4742))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, RegisterRule(fde_start + 2 * code_factor, 0xd40e21b1,\n                                    0x16607d6a))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreExpressionRuleUnchanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_expression).ULEB128(0x666ae152).Block(\"dwarf\")\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, ExpressionRule(fde_start, 0x666ae152, \"dwarf\"))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreExpressionRuleChanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_expression).ULEB128(0xb5ca5c46).Block(\"elf\")\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0xb5ca5c46)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, ExpressionRule(fde_start, 0xb5ca5c46, \"elf\"))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0xb5ca5c46))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, ExpressionRule(fde_start + 2 * code_factor, 0xb5ca5c46,\n                                      \"elf\"))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreExpressionRuleChangedExpression) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_expression).ULEB128(0x500f5739).Block(\"smurf\")\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_expression).ULEB128(0x500f5739).Block(\"orc\")\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, ExpressionRule(fde_start, 0x500f5739, \"smurf\"))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, ExpressionRule(fde_start + code_factor, 0x500f5739,\n                                      \"orc\"))\n      .InSequence(s).WillOnce(Return(true));\n  // Expectations are not wishes.\n  EXPECT_CALL(handler, ExpressionRule(fde_start + 2 * code_factor, 0x500f5739,\n                                      \"smurf\"))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreValExpressionRuleUnchanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_val_expression).ULEB128(0x666ae152)\n      .Block(\"hideous\")\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  EXPECT_CALL(handler, ValExpressionRule(fde_start, 0x666ae152, \"hideous\"))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreValExpressionRuleChanged) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_val_expression).ULEB128(0xb5ca5c46)\n      .Block(\"revolting\")\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0xb5ca5c46)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"RestoreValExpressionRuleChanged\", section);\n\n  EXPECT_CALL(handler, ValExpressionRule(fde_start, 0xb5ca5c46, \"revolting\"))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0xb5ca5c46))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, ValExpressionRule(fde_start + 2 * code_factor, 0xb5ca5c46,\n                                      \"revolting\"))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nTEST_F(CFIRestore, RestoreValExpressionRuleChangedValExpression) {\n  CFISection section(kLittleEndian, 4);\n  StockCIEAndFDE(&section);\n  section\n      .D8(dwarf2reader::DW_CFA_val_expression).ULEB128(0x500f5739)\n      .Block(\"repulsive\")\n      .D8(dwarf2reader::DW_CFA_remember_state)\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_val_expression).ULEB128(0x500f5739)\n      .Block(\"nauseous\")\n      .D8(dwarf2reader::DW_CFA_advance_loc | 1)\n      .D8(dwarf2reader::DW_CFA_restore_state)\n      .FinishEntry();\n\n  PERHAPS_WRITE_DEBUG_FRAME_FILE(\"RestoreValExpressionRuleChangedValExpression\",\n                                 section);\n\n  EXPECT_CALL(handler, ValExpressionRule(fde_start, 0x500f5739, \"repulsive\"))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, ValExpressionRule(fde_start + code_factor, 0x500f5739,\n                                      \"nauseous\"))\n      .InSequence(s).WillOnce(Return(true));\n  // Expectations are not wishes.\n  EXPECT_CALL(handler, ValExpressionRule(fde_start + 2 * code_factor, 0x500f5739,\n                                      \"repulsive\"))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End()).WillOnce(Return(true));\n\n  ParseSection(&section);\n}\n\nstruct EHFrameFixture: public CFIInsnFixture {\n  EHFrameFixture() \n      : CFIInsnFixture(), section(kBigEndian, 4, true) {\n    encoded_pointer_bases.cfi  = 0x7f496cb2;\n    encoded_pointer_bases.text = 0x540f67b6;\n    encoded_pointer_bases.data = 0xe3eab768;\n    section.SetEncodedPointerBases(encoded_pointer_bases);\n  }\n  CFISection section;\n  CFISection::EncodedPointerBases encoded_pointer_bases;\n\n  // Parse CFIInsnFixture::ParseSection, but parse the section as\n  // .eh_frame data, supplying stock base addresses.\n  void ParseEHFrameSection(CFISection *section, bool succeeds = true) {\n    EXPECT_TRUE(section->ContainsEHFrame());\n    string contents;\n    EXPECT_TRUE(section->GetContents(&contents));\n    dwarf2reader::Endianness endianness;\n    if (section->endianness() == kBigEndian)\n      endianness = ENDIANNESS_BIG;\n    else {\n      assert(section->endianness() == kLittleEndian);\n      endianness = ENDIANNESS_LITTLE;\n    }\n    ByteReader byte_reader(endianness);\n    byte_reader.SetAddressSize(section->AddressSize());\n    byte_reader.SetCFIDataBase(encoded_pointer_bases.cfi, contents.data());\n    byte_reader.SetTextBase(encoded_pointer_bases.text);\n    byte_reader.SetDataBase(encoded_pointer_bases.data);\n    CallFrameInfo parser(contents.data(), contents.size(),\n                         &byte_reader, &handler, &reporter, true);\n    if (succeeds)\n      EXPECT_TRUE(parser.Start());\n    else\n      EXPECT_FALSE(parser.Start());\n  }\n\n};\n\nclass EHFrame: public EHFrameFixture, public Test { };\n\n// A simple CIE, an FDE, and a terminator.\nTEST_F(EHFrame, Terminator) {\n  Label cie;\n  section\n      .Mark(&cie)\n      .CIEHeader(9968, 2466, 67, 1, \"\")\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(3772).ULEB128(1372)\n      .FinishEntry()\n      .FDEHeader(cie, 0x848037a1, 0x7b30475e)\n      .D8(dwarf2reader::DW_CFA_set_loc).D32(0x17713850)\n      .D8(dwarf2reader::DW_CFA_undefined).ULEB128(5721)\n      .FinishEntry()\n      .D32(0)                           // Terminate the sequence.\n      // This FDE should be ignored.\n      .FDEHeader(cie, 0xf19629fe, 0x439fb09b)\n      .FinishEntry();\n\n  PERHAPS_WRITE_EH_FRAME_FILE(\"EHFrame.Terminator\", section);\n\n  EXPECT_CALL(handler, Entry(_, 0x848037a1, 0x7b30475e, 1, \"\", 67))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, ValOffsetRule(0x848037a1, kCFARegister, 3772, 1372))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, UndefinedRule(0x17713850, 5721))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End())\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(reporter, EarlyEHTerminator(_))\n      .InSequence(s).WillOnce(Return());\n\n  ParseEHFrameSection(&section);\n}\n\n// The parser should recognize the Linux Standards Base 'z' augmentations.\nTEST_F(EHFrame, SimpleFDE) {\n  DwarfPointerEncoding lsda_encoding =\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect\n                           | dwarf2reader::DW_EH_PE_datarel\n                           | dwarf2reader::DW_EH_PE_sdata2);\n  DwarfPointerEncoding fde_encoding =\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_textrel\n                           | dwarf2reader::DW_EH_PE_udata2);\n  \n  section.SetPointerEncoding(fde_encoding);\n  section.SetEncodedPointerBases(encoded_pointer_bases);\n  Label cie;\n  section\n      .Mark(&cie)\n      .CIEHeader(4873, 7012, 100, 1, \"zSLPR\")\n      .ULEB128(7)                                // Augmentation data length\n      .D8(lsda_encoding)                         // LSDA pointer format\n      .D8(dwarf2reader::DW_EH_PE_pcrel)          // personality pointer format\n      .EncodedPointer(0x97baa00, dwarf2reader::DW_EH_PE_pcrel) // and value \n      .D8(fde_encoding)                          // FDE pointer format\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(6706).ULEB128(31)\n      .FinishEntry()\n      .FDEHeader(cie, 0x540f6b56, 0xf686)\n      .ULEB128(2)                                // Augmentation data length\n      .EncodedPointer(0xe3eab475, lsda_encoding) // LSDA pointer, signed\n      .D8(dwarf2reader::DW_CFA_set_loc)\n      .EncodedPointer(0x540fa4ce, fde_encoding)\n      .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0x675e)\n      .FinishEntry()\n      .D32(0);                                   // terminator\n\n  PERHAPS_WRITE_EH_FRAME_FILE(\"EHFrame.SimpleFDE\", section);\n\n  EXPECT_CALL(handler, Entry(_, 0x540f6b56, 0xf686, 1, \"zSLPR\", 100))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, PersonalityRoutine(0x97baa00, false))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, LanguageSpecificDataArea(0xe3eab475, true))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, SignalHandler())\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, ValOffsetRule(0x540f6b56, kCFARegister, 6706, 31))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, UndefinedRule(0x540fa4ce, 0x675e))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End())\n      .InSequence(s).WillOnce(Return(true));\n\n  ParseEHFrameSection(&section);\n}\n\n// Check that we can handle an empty 'z' augmentation.\nTEST_F(EHFrame, EmptyZ) {\n  Label cie;\n  section\n      .Mark(&cie)\n      .CIEHeader(5955, 5805, 228, 1, \"z\")\n      .ULEB128(0)                                // Augmentation data length\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(3629).ULEB128(247)\n      .FinishEntry()\n      .FDEHeader(cie, 0xda007738, 0xfb55c641)\n      .ULEB128(0)                                // Augmentation data length\n      .D8(dwarf2reader::DW_CFA_advance_loc1).D8(11)\n      .D8(dwarf2reader::DW_CFA_undefined).ULEB128(3769)\n      .FinishEntry();\n\n  PERHAPS_WRITE_EH_FRAME_FILE(\"EHFrame.EmptyZ\", section);\n\n  EXPECT_CALL(handler, Entry(_, 0xda007738, 0xfb55c641, 1, \"z\", 228))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, ValOffsetRule(0xda007738, kCFARegister, 3629, 247))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, UndefinedRule(0xda007738 + 11 * 5955, 3769))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End())\n      .InSequence(s).WillOnce(Return(true));\n\n  ParseEHFrameSection(&section);\n}\n\n// Check that we recognize bad 'z' augmentation characters.\nTEST_F(EHFrame, BadZ) {\n  Label cie;\n  section\n      .Mark(&cie)\n      .CIEHeader(6937, 1045, 142, 1, \"zQ\")\n      .ULEB128(0)                                // Augmentation data length\n      .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(9006).ULEB128(7725)\n      .FinishEntry()\n      .FDEHeader(cie, 0x1293efa8, 0x236f53f2)\n      .ULEB128(0)                                // Augmentation data length\n      .D8(dwarf2reader::DW_CFA_advance_loc | 12)\n      .D8(dwarf2reader::DW_CFA_register).ULEB128(5667).ULEB128(3462)\n      .FinishEntry();\n\n  PERHAPS_WRITE_EH_FRAME_FILE(\"EHFrame.BadZ\", section);\n\n  EXPECT_CALL(reporter, UnrecognizedAugmentation(_, \"zQ\"))\n      .WillOnce(Return());\n\n  ParseEHFrameSection(&section, false);\n}\n\nTEST_F(EHFrame, zL) {\n  Label cie;\n  DwarfPointerEncoding lsda_encoding =\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_funcrel\n                           | dwarf2reader::DW_EH_PE_udata2);\n  section\n      .Mark(&cie)\n      .CIEHeader(9285, 9959, 54, 1, \"zL\")\n      .ULEB128(1)                       // Augmentation data length\n      .D8(lsda_encoding)                // encoding for LSDA pointer in FDE\n\n      .FinishEntry()\n      .FDEHeader(cie, 0xd40091aa, 0x9aa6e746)\n      .ULEB128(2)                       // Augmentation data length\n      .EncodedPointer(0xd40099cd, lsda_encoding) // LSDA pointer\n      .FinishEntry()\n      .D32(0);                                   // terminator\n\n  PERHAPS_WRITE_EH_FRAME_FILE(\"EHFrame.zL\", section);\n\n  EXPECT_CALL(handler, Entry(_, 0xd40091aa, 0x9aa6e746, 1, \"zL\", 54))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, LanguageSpecificDataArea(0xd40099cd, false))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End())\n      .InSequence(s).WillOnce(Return(true));\n\n  ParseEHFrameSection(&section);\n}\n\nTEST_F(EHFrame, zP) {\n  Label cie;\n  DwarfPointerEncoding personality_encoding =\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_datarel\n                           | dwarf2reader::DW_EH_PE_udata2);\n  section\n      .Mark(&cie)\n      .CIEHeader(1097, 6313, 17, 1, \"zP\")\n      .ULEB128(3)                  // Augmentation data length\n      .D8(personality_encoding)    // encoding for personality routine\n      .EncodedPointer(0xe3eaccac, personality_encoding) // value\n      .FinishEntry()\n      .FDEHeader(cie, 0x0c8350c9, 0xbef11087)\n      .ULEB128(0)                       // Augmentation data length\n      .FinishEntry()\n      .D32(0);                                   // terminator\n\n  PERHAPS_WRITE_EH_FRAME_FILE(\"EHFrame.zP\", section);\n\n  EXPECT_CALL(handler, Entry(_, 0x0c8350c9, 0xbef11087, 1, \"zP\", 17))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, PersonalityRoutine(0xe3eaccac, false))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End())\n      .InSequence(s).WillOnce(Return(true));\n\n  ParseEHFrameSection(&section);\n}\n\nTEST_F(EHFrame, zR) {\n  Label cie;\n  DwarfPointerEncoding pointer_encoding =\n      DwarfPointerEncoding(dwarf2reader::DW_EH_PE_textrel\n                           | dwarf2reader::DW_EH_PE_sdata2);\n  section.SetPointerEncoding(pointer_encoding);\n  section\n      .Mark(&cie)\n      .CIEHeader(8011, 5496, 75, 1, \"zR\")\n      .ULEB128(1)                       // Augmentation data length\n      .D8(pointer_encoding)             // encoding for FDE addresses\n      .FinishEntry()\n      .FDEHeader(cie, 0x540f9431, 0xbd0)\n      .ULEB128(0)                       // Augmentation data length\n      .FinishEntry()\n      .D32(0);                          // terminator\n\n  PERHAPS_WRITE_EH_FRAME_FILE(\"EHFrame.zR\", section);\n\n  EXPECT_CALL(handler, Entry(_, 0x540f9431, 0xbd0, 1, \"zR\", 75))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End())\n      .InSequence(s).WillOnce(Return(true));\n\n  ParseEHFrameSection(&section);\n}\n\nTEST_F(EHFrame, zS) {\n  Label cie;\n  section\n      .Mark(&cie)\n      .CIEHeader(9217, 7694, 57, 1, \"zS\")\n      .ULEB128(0)                                // Augmentation data length\n      .FinishEntry()\n      .FDEHeader(cie, 0xd40091aa, 0x9aa6e746)\n      .ULEB128(0)                                // Augmentation data length\n      .FinishEntry()\n      .D32(0);                                   // terminator\n\n  PERHAPS_WRITE_EH_FRAME_FILE(\"EHFrame.zS\", section);\n\n  EXPECT_CALL(handler, Entry(_, 0xd40091aa, 0x9aa6e746, 1, \"zS\", 57))\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, SignalHandler())\n      .InSequence(s).WillOnce(Return(true));\n  EXPECT_CALL(handler, End())\n      .InSequence(s).WillOnce(Return(true));\n\n  ParseEHFrameSection(&section);\n}\n\n// These tests require manual inspection of the test output.\nstruct CFIReporterFixture {\n  CFIReporterFixture() : reporter(\"test file name\", \"test section name\") { }\n  CallFrameInfo::Reporter reporter;\n};\n\nclass CFIReporter: public CFIReporterFixture, public Test { };\n\nTEST_F(CFIReporter, Incomplete) {\n  reporter.Incomplete(0x0102030405060708ULL, CallFrameInfo::kUnknown);\n}\n\nTEST_F(CFIReporter, EarlyEHTerminator) {\n  reporter.EarlyEHTerminator(0x0102030405060708ULL);\n}\n\nTEST_F(CFIReporter, CIEPointerOutOfRange) {\n  reporter.CIEPointerOutOfRange(0x0123456789abcdefULL, 0xfedcba9876543210ULL);\n}\n\nTEST_F(CFIReporter, BadCIEId) {\n  reporter.BadCIEId(0x0123456789abcdefULL, 0xfedcba9876543210ULL);\n}\n\nTEST_F(CFIReporter, UnrecognizedVersion) {\n  reporter.UnrecognizedVersion(0x0123456789abcdefULL, 43);\n}\n\nTEST_F(CFIReporter, UnrecognizedAugmentation) {\n  reporter.UnrecognizedAugmentation(0x0123456789abcdefULL, \"poodles\");\n}\n\nTEST_F(CFIReporter, InvalidPointerEncoding) {\n  reporter.InvalidPointerEncoding(0x0123456789abcdefULL, 0x42);\n}\n\nTEST_F(CFIReporter, UnusablePointerEncoding) {\n  reporter.UnusablePointerEncoding(0x0123456789abcdefULL, 0x42);\n}\n\nTEST_F(CFIReporter, RestoreInCIE) {\n  reporter.RestoreInCIE(0x0123456789abcdefULL, 0xfedcba9876543210ULL);\n}\n\nTEST_F(CFIReporter, BadInstruction) {\n  reporter.BadInstruction(0x0123456789abcdefULL, CallFrameInfo::kFDE,\n                          0xfedcba9876543210ULL);\n}\n\nTEST_F(CFIReporter, NoCFARule) {\n  reporter.NoCFARule(0x0123456789abcdefULL, CallFrameInfo::kCIE,\n                     0xfedcba9876543210ULL);\n}\n\nTEST_F(CFIReporter, EmptyStateStack) {\n  reporter.EmptyStateStack(0x0123456789abcdefULL, CallFrameInfo::kTerminator,\n                           0xfedcba9876543210ULL);\n}\n\nTEST_F(CFIReporter, ClearingCFARule) {\n  reporter.ClearingCFARule(0x0123456789abcdefULL, CallFrameInfo::kFDE,\n                           0xfedcba9876543210ULL);\n}\n\n#ifdef WRITE_ELF\n// See comments at the top of the file mentioning WRITE_ELF for details.\n\nusing google_breakpad::test_assembler::Section;\n\nstruct ELFSectionHeader {\n  ELFSectionHeader(unsigned int set_type)\n      : type(set_type), flags(0), address(0), link(0), info(0),\n        alignment(1), entry_size(0) { }\n  Label name;\n  unsigned int type;\n  u_int64_t flags;\n  u_int64_t address;\n  Label file_offset;\n  Label file_size;\n  unsigned int link;\n  unsigned int info;\n  u_int64_t alignment;\n  u_int64_t entry_size;\n};\n\nvoid AppendSectionHeader(CFISection *table, const ELFSectionHeader &header) {\n  (*table)\n      .D32(header.name)                   // name, index in string tbl\n      .D32(header.type)                   // type\n      .Address(header.flags)              // flags\n      .Address(header.address)            // address in memory\n      .Address(header.file_offset)        // offset in ELF file\n      .Address(header.file_size)          // length in bytes\n      .D32(header.link)                   // link to related section\n      .D32(header.info)                   // miscellaneous\n      .Address(header.alignment)          // alignment\n      .Address(header.entry_size);        // entry size\n}\n\nvoid WriteELFFrameSection(const char *filename, const char *cfi_name,\n                          const CFISection &cfi) {\n  int elf_class = cfi.AddressSize() == 4 ? ELFCLASS32 : ELFCLASS64;\n  int elf_data = (cfi.endianness() == kBigEndian\n                  ? ELFDATA2MSB : ELFDATA2LSB);\n  CFISection elf(cfi.endianness(), cfi.AddressSize());\n  Label elf_header_size, section_table_offset;\n  elf\n      .Append(\"\\x7f\" \"ELF\")\n      .D8(elf_class)              // 32-bit or 64-bit ELF\n      .D8(elf_data)               // endianness\n      .D8(1)                      // ELF version\n      .D8(ELFOSABI_LINUX)         // Operating System/ABI indication\n      .D8(0)                      // ABI version\n      .Append(7, 0xda)            // padding\n      .D16(ET_EXEC)               // file type: executable file\n      .D16(EM_386)                // architecture: Intel IA-32\n      .D32(EV_CURRENT);           // ELF version\n  elf\n      .Address(0x0123456789abcdefULL) // program entry point\n      .Address(0)                 // program header offset\n      .Address(section_table_offset) // section header offset\n      .D32(0)                     // processor-specific flags\n      .D16(elf_header_size)       // ELF header size in bytes */\n      .D16(elf_class == ELFCLASS32 ? 32 : 56) // program header entry size\n      .D16(0)                     // program header table entry count\n      .D16(elf_class == ELFCLASS32 ? 40 : 64) // section header entry size\n      .D16(3)                     // section  count\n      .D16(1)                     // section name string table\n      .Mark(&elf_header_size);\n\n  // The null section. Every ELF file has one, as the first entry in\n  // the section header table.\n  ELFSectionHeader null_header(SHT_NULL);\n  null_header.file_offset = 0;\n  null_header.file_size = 0;\n\n  // The CFI section. The whole reason for writing out this ELF file\n  // is to put this in it so that we can run other dumping programs on\n  // it to check its contents.\n  ELFSectionHeader cfi_header(SHT_PROGBITS);\n  cfi_header.file_size = cfi.Size();\n\n  // The section holding the names of the sections. This is the\n  // section whose index appears in the e_shstrndx member of the ELF\n  // header.\n  ELFSectionHeader section_names_header(SHT_STRTAB);\n  CFISection section_names(cfi.endianness(), cfi.AddressSize());\n  section_names\n      .Mark(&null_header.name)\n      .AppendCString(\"\")\n      .Mark(&section_names_header.name)\n      .AppendCString(\".shstrtab\")\n      .Mark(&cfi_header.name)\n      .AppendCString(cfi_name)\n      .Mark(&section_names_header.file_size);\n  \n  // Create the section table. The ELF header's e_shoff member refers\n  // to this, and the e_shnum member gives the number of entries it\n  // contains.\n  CFISection section_table(cfi.endianness(), cfi.AddressSize());\n  AppendSectionHeader(&section_table, null_header);\n  AppendSectionHeader(&section_table, section_names_header);\n  AppendSectionHeader(&section_table, cfi_header);\n\n  // Append the section table and the section contents to the ELF file.\n  elf\n      .Mark(&section_table_offset)\n      .Append(section_table)\n      .Mark(&section_names_header.file_offset)\n      .Append(section_names)\n      .Mark(&cfi_header.file_offset)\n      .Append(cfi);\n\n  string contents;\n  if (!elf.GetContents(&contents)) {\n    fprintf(stderr, \"failed to get ELF file contents\\n\");\n    exit(1);\n  }\n\n  FILE *out = fopen(filename, \"w\");\n  if (!out) {\n    fprintf(stderr, \"error opening ELF file '%s': %s\\n\",\n            filename, strerror(errno));\n    exit(1);\n  }\n\n  if (fwrite(contents.data(), 1, contents.size(), out) != contents.size()) {\n    fprintf(stderr, \"error writing ELF data to '%s': %s\\n\",\n            filename, strerror(errno));\n    exit(1);\n  }\n\n  if (fclose(out) == EOF) {\n    fprintf(stderr, \"error closing ELF file '%s': %s\\n\",\n            filename, strerror(errno));\n    exit(1);\n  }\n}\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/dwarf2reader_die_unittest.cc",
    "content": "// Copyright (c) 2012, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dwarf2reader_die_unittest.cc: Unit tests for dwarf2reader::CompilationUnit\n\n#include <stdlib.h>\n\n#include <iostream>\n#include <string>\n#include <vector>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/dwarf/bytereader-inl.h\"\n#include \"common/dwarf/dwarf2reader_test_common.h\"\n#include \"common/dwarf/dwarf2reader.h\"\n#include \"google_breakpad/common/breakpad_types.h\"\n\nusing google_breakpad::test_assembler::Endianness;\nusing google_breakpad::test_assembler::Label;\nusing google_breakpad::test_assembler::Section;\nusing google_breakpad::test_assembler::kBigEndian;\nusing google_breakpad::test_assembler::kLittleEndian;\n\nusing dwarf2reader::AttributeList;\nusing dwarf2reader::ByteReader;\nusing dwarf2reader::CompilationUnit;\nusing dwarf2reader::Dwarf2Handler;\nusing dwarf2reader::DwarfAttribute;\nusing dwarf2reader::DwarfForm;\nusing dwarf2reader::DwarfHasChild;\nusing dwarf2reader::DwarfTag;\nusing dwarf2reader::ENDIANNESS_BIG;\nusing dwarf2reader::ENDIANNESS_LITTLE;\nusing dwarf2reader::SectionMap;\n\nusing std::string;\nusing std::vector;\nusing testing::InSequence;\nusing testing::Pointee;\nusing testing::Return;\nusing testing::Sequence;\nusing testing::Test;\nusing testing::TestWithParam;\nusing testing::_;\n\nclass MockDwarf2Handler: public Dwarf2Handler {\n public:\n  MOCK_METHOD5(StartCompilationUnit, bool(uint64 offset, uint8 address_size,\n                                          uint8 offset_size, uint64 cu_length,\n                                          uint8 dwarf_version));\n  MOCK_METHOD3(StartDIE, bool(uint64 offset, enum DwarfTag tag,\n                              const AttributeList& attrs));\n  MOCK_METHOD4(ProcessAttributeUnsigned, void(uint64 offset,\n                                              DwarfAttribute attr,\n                                              enum DwarfForm form,\n                                              uint64 data));\n  MOCK_METHOD4(ProcessAttributeSigned, void(uint64 offset,\n                                            enum DwarfAttribute attr,\n                                            enum DwarfForm form,\n                                            int64 data));\n  MOCK_METHOD4(ProcessAttributeReference, void(uint64 offset,\n                                               enum DwarfAttribute attr,\n                                               enum DwarfForm form,\n                                               uint64 data));\n  MOCK_METHOD5(ProcessAttributeBuffer, void(uint64 offset,\n                                            enum DwarfAttribute attr,\n                                            enum DwarfForm form,\n                                            const char* data,\n                                            uint64 len));\n  MOCK_METHOD4(ProcessAttributeString, void(uint64 offset,\n                                            enum DwarfAttribute attr,\n                                            enum DwarfForm form,\n                                            const std::string& data));\n  MOCK_METHOD4(ProcessAttributeSignature, void(uint64 offset,\n                                               DwarfAttribute attr,\n                                               enum DwarfForm form,\n                                               uint64 signature));\n  MOCK_METHOD1(EndDIE, void(uint64 offset));\n};\n\nstruct DIEFixture {\n\n  DIEFixture() {\n    // Fix the initial offset of the .debug_info and .debug_abbrev sections.\n    info.start() = 0;\n    abbrevs.start() = 0;\n\n    // Default expectations for the data handler.\n    EXPECT_CALL(handler, StartCompilationUnit(_, _, _, _, _)).Times(0);\n    EXPECT_CALL(handler, StartDIE(_, _, _)).Times(0);\n    EXPECT_CALL(handler, ProcessAttributeUnsigned(_, _, _, _)).Times(0);\n    EXPECT_CALL(handler, ProcessAttributeSigned(_, _, _, _)).Times(0);\n    EXPECT_CALL(handler, ProcessAttributeReference(_, _, _, _)).Times(0);\n    EXPECT_CALL(handler, ProcessAttributeBuffer(_, _, _, _, _)).Times(0);\n    EXPECT_CALL(handler, ProcessAttributeString(_, _, _, _)).Times(0);\n    EXPECT_CALL(handler, EndDIE(_)).Times(0);\n  }\n\n  // Return a reference to a section map whose .debug_info section refers\n  // to |info|, and whose .debug_abbrev section refers to |abbrevs|. This\n  // function returns a reference to the same SectionMap each time; new\n  // calls wipe out maps established by earlier calls.\n  const SectionMap &MakeSectionMap() {\n    // Copy the sections' contents into strings that will live as long as\n    // the map itself.\n    assert(info.GetContents(&info_contents));\n    assert(abbrevs.GetContents(&abbrevs_contents));\n    section_map.clear();\n    section_map[\".debug_info\"].first  = info_contents.data();\n    section_map[\".debug_info\"].second = info_contents.size();\n    section_map[\".debug_abbrev\"].first  = abbrevs_contents.data();\n    section_map[\".debug_abbrev\"].second = abbrevs_contents.size();\n    return section_map;\n  }\n\n  TestCompilationUnit info;\n  TestAbbrevTable abbrevs;\n  MockDwarf2Handler handler;\n  string abbrevs_contents, info_contents;\n  SectionMap section_map;\n};\n\nstruct DwarfHeaderParams {\n  DwarfHeaderParams(Endianness endianness, size_t format_size,\n                   int version, size_t address_size)\n      : endianness(endianness), format_size(format_size),\n        version(version), address_size(address_size) { }\n  Endianness endianness;\n  size_t format_size;                   // 4-byte or 8-byte DWARF offsets\n  int version;\n  size_t address_size;\n};\n\nclass DwarfHeader: public DIEFixture,\n                   public TestWithParam<DwarfHeaderParams> { };\n\nTEST_P(DwarfHeader, Header) {\n  Label abbrev_table = abbrevs.Here();\n  abbrevs.Abbrev(1, dwarf2reader::DW_TAG_compile_unit,\n                 dwarf2reader::DW_children_yes)\n      .Attribute(dwarf2reader::DW_AT_name, dwarf2reader::DW_FORM_string)\n      .EndAbbrev()\n      .EndTable();\n\n  info.set_format_size(GetParam().format_size);\n  info.set_endianness(GetParam().endianness);\n\n  info.Header(GetParam().version, abbrev_table, GetParam().address_size)\n      .ULEB128(1)                     // DW_TAG_compile_unit, with children\n      .AppendCString(\"sam\")           // DW_AT_name, DW_FORM_string\n      .D8(0);                         // end of children\n  info.Finish();\n\n  {\n    InSequence s;\n    EXPECT_CALL(handler,\n                StartCompilationUnit(0, GetParam().address_size,\n                                     GetParam().format_size, _,\n                                     GetParam().version))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, StartDIE(_, dwarf2reader::DW_TAG_compile_unit, _))\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, ProcessAttributeString(_, dwarf2reader::DW_AT_name, \n                                                dwarf2reader::DW_FORM_string,\n                                                \"sam\"))\n        .WillOnce(Return());\n    EXPECT_CALL(handler, EndDIE(_))\n        .WillOnce(Return());\n  }\n\n  ByteReader byte_reader(GetParam().endianness == kLittleEndian ?\n                         ENDIANNESS_LITTLE : ENDIANNESS_BIG);\n  CompilationUnit parser(MakeSectionMap(), 0, &byte_reader, &handler);\n  EXPECT_EQ(parser.Start(), info_contents.size());\n}\n\nINSTANTIATE_TEST_CASE_P(\n    HeaderVariants, DwarfHeader,\n    ::testing::Values(DwarfHeaderParams(kLittleEndian, 4, 2, 4),\n                      DwarfHeaderParams(kLittleEndian, 4, 2, 8),\n                      DwarfHeaderParams(kLittleEndian, 4, 3, 4),\n                      DwarfHeaderParams(kLittleEndian, 4, 3, 8),\n                      DwarfHeaderParams(kLittleEndian, 4, 4, 4),\n                      DwarfHeaderParams(kLittleEndian, 4, 4, 8),\n                      DwarfHeaderParams(kLittleEndian, 8, 2, 4),\n                      DwarfHeaderParams(kLittleEndian, 8, 2, 8),\n                      DwarfHeaderParams(kLittleEndian, 8, 3, 4),\n                      DwarfHeaderParams(kLittleEndian, 8, 3, 8),\n                      DwarfHeaderParams(kLittleEndian, 8, 4, 4),\n                      DwarfHeaderParams(kLittleEndian, 8, 4, 8),\n                      DwarfHeaderParams(kBigEndian,    4, 2, 4),\n                      DwarfHeaderParams(kBigEndian,    4, 2, 8),\n                      DwarfHeaderParams(kBigEndian,    4, 3, 4),\n                      DwarfHeaderParams(kBigEndian,    4, 3, 8),\n                      DwarfHeaderParams(kBigEndian,    4, 4, 4),\n                      DwarfHeaderParams(kBigEndian,    4, 4, 8),\n                      DwarfHeaderParams(kBigEndian,    8, 2, 4),\n                      DwarfHeaderParams(kBigEndian,    8, 2, 8),\n                      DwarfHeaderParams(kBigEndian,    8, 3, 4),\n                      DwarfHeaderParams(kBigEndian,    8, 3, 8),\n                      DwarfHeaderParams(kBigEndian,    8, 4, 4),\n                      DwarfHeaderParams(kBigEndian,    8, 4, 8)));\n\nstruct DwarfFormsFixture: public DIEFixture {\n  // Start a compilation unit, as directed by |params|, containing one\n  // childless DIE of the given tag, with one attribute of the given name\n  // and form. The 'info' fixture member is left just after the abbrev\n  // code, waiting for the attribute value to be appended.\n  void StartSingleAttributeDIE(const DwarfHeaderParams &params,\n                               DwarfTag tag, DwarfAttribute name,\n                               DwarfForm form) {\n    // Create the abbreviation table.\n    Label abbrev_table = abbrevs.Here();\n    abbrevs.Abbrev(1, tag, dwarf2reader::DW_children_no)\n        .Attribute(name, form)\n        .EndAbbrev()\n        .EndTable();\n\n    // Create the compilation unit, up to the attribute value.\n    info.set_format_size(params.format_size);\n    info.set_endianness(params.endianness);\n    info.Header(params.version, abbrev_table, params.address_size)\n        .ULEB128(1);                    // abbrev code\n  }\n\n  // Set up handler to expect a compilation unit matching |params|,\n  // containing one childless DIE of the given tag, in the sequence s. Stop\n  // just before the expectations.\n  void ExpectBeginCompilationUnit(const DwarfHeaderParams &params,\n                                  DwarfTag tag, uint64 offset=0) {\n    EXPECT_CALL(handler,\n                StartCompilationUnit(offset, params.address_size,\n                                     params.format_size, _,\n                                     params.version))\n        .InSequence(s)\n        .WillOnce(Return(true));\n    EXPECT_CALL(handler, StartDIE(_, tag, _))\n        .InSequence(s)\n        .WillOnce(Return(true));\n  }\n\n  void ExpectEndCompilationUnit() {\n    EXPECT_CALL(handler, EndDIE(_))\n        .InSequence(s)\n        .WillOnce(Return());\n  }\n\n  void ParseCompilationUnit(const DwarfHeaderParams &params, uint64 offset=0) {\n    ByteReader byte_reader(params.endianness == kLittleEndian ?\n                           ENDIANNESS_LITTLE : ENDIANNESS_BIG);\n    CompilationUnit parser(MakeSectionMap(), offset, &byte_reader, &handler);\n    EXPECT_EQ(offset + parser.Start(), info_contents.size());\n  }\n\n  // The sequence to which the fixture's methods append expectations.\n  Sequence s;\n};\n\nstruct DwarfForms: public DwarfFormsFixture,\n                   public TestWithParam<DwarfHeaderParams> { };\n\nTEST_P(DwarfForms, addr) {\n  StartSingleAttributeDIE(GetParam(), dwarf2reader::DW_TAG_compile_unit,\n                          dwarf2reader::DW_AT_low_pc,\n                          dwarf2reader::DW_FORM_addr);\n  u_int64_t value;\n  if (GetParam().address_size == 4) {\n    value = 0xc8e9ffcc;\n    info.D32(value);\n  } else {\n    value = 0xe942517fc2768564ULL;\n    info.D64(value);\n  }\n  info.Finish();\n\n  ExpectBeginCompilationUnit(GetParam(), dwarf2reader::DW_TAG_compile_unit);\n  EXPECT_CALL(handler, ProcessAttributeUnsigned(_, dwarf2reader::DW_AT_low_pc, \n                                                dwarf2reader::DW_FORM_addr,\n                                                value))\n      .InSequence(s)\n      .WillOnce(Return());\n  ExpectEndCompilationUnit();\n\n  ParseCompilationUnit(GetParam());\n}\n\nTEST_P(DwarfForms, block2_empty) {\n  StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x16e4d2f7,\n                          (DwarfAttribute) 0xe52c4463,\n                          dwarf2reader::DW_FORM_block2);\n  info.D16(0);\n  info.Finish();\n\n  ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x16e4d2f7);\n  EXPECT_CALL(handler, ProcessAttributeBuffer(_, (DwarfAttribute) 0xe52c4463,\n                                              dwarf2reader::DW_FORM_block2,\n                                              _, 0))\n      .InSequence(s)\n      .WillOnce(Return());\n  ExpectEndCompilationUnit();\n\n  ParseCompilationUnit(GetParam());\n}\n\nTEST_P(DwarfForms, block2) {\n  StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x16e4d2f7,\n                          (DwarfAttribute) 0xe52c4463,\n                          dwarf2reader::DW_FORM_block2);\n  unsigned char data[258];\n  memset(data, '*', sizeof(data));\n  info.D16(sizeof(data))\n      .Append(data, sizeof(data));\n  info.Finish();\n\n  ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x16e4d2f7);\n  EXPECT_CALL(handler, ProcessAttributeBuffer(_, (DwarfAttribute) 0xe52c4463,\n                                              dwarf2reader::DW_FORM_block2,\n                                              Pointee('*'), 258))\n      .InSequence(s)\n      .WillOnce(Return());\n  ExpectEndCompilationUnit();\n\n  ParseCompilationUnit(GetParam());\n}\n\nTEST_P(DwarfForms, flag_present) {\n  StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x3e449ac2,\n                          (DwarfAttribute) 0x359d1972,\n                          dwarf2reader::DW_FORM_flag_present);\n  // DW_FORM_flag_present occupies no space in the DIE.\n  info.Finish();\n\n  ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x3e449ac2);\n  EXPECT_CALL(handler,\n              ProcessAttributeUnsigned(_, (DwarfAttribute) 0x359d1972,\n                                       dwarf2reader::DW_FORM_flag_present,\n                                       1))\n      .InSequence(s)\n      .WillOnce(Return());\n  ExpectEndCompilationUnit();\n\n  ParseCompilationUnit(GetParam());\n}\n\nTEST_P(DwarfForms, sec_offset) {\n  StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x1d971689,\n                          (DwarfAttribute) 0xa060bfd1,\n                          dwarf2reader::DW_FORM_sec_offset);\n  u_int64_t value;\n  if (GetParam().format_size == 4) {\n    value = 0xacc9c388;\n    info.D32(value);\n  } else {\n    value = 0xcffe5696ffe3ed0aULL;\n    info.D64(value);\n  }\n  info.Finish();\n\n  ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x1d971689);\n  EXPECT_CALL(handler, ProcessAttributeUnsigned(_, (DwarfAttribute) 0xa060bfd1,\n                                                dwarf2reader::DW_FORM_sec_offset,\n                                                value))\n      .InSequence(s)\n      .WillOnce(Return());\n  ExpectEndCompilationUnit();\n\n  ParseCompilationUnit(GetParam());\n}\n\nTEST_P(DwarfForms, exprloc) {\n  StartSingleAttributeDIE(GetParam(), (DwarfTag) 0xb6d167bb,\n                          (DwarfAttribute) 0xba3ae5cb,\n                          dwarf2reader::DW_FORM_exprloc);\n  info.ULEB128(29)\n      .Append(29, 173);\n  info.Finish();\n\n  ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0xb6d167bb);\n  EXPECT_CALL(handler, ProcessAttributeBuffer(_, (DwarfAttribute) 0xba3ae5cb,\n                                              dwarf2reader::DW_FORM_exprloc,\n                                              Pointee(173), 29))\n      .InSequence(s)\n      .WillOnce(Return());\n  ExpectEndCompilationUnit();\n\n  ParseCompilationUnit(GetParam());\n}\n\nTEST_P(DwarfForms, ref_sig8) {\n  StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x253e7b2b,\n                          (DwarfAttribute) 0xd708d908,\n                          dwarf2reader::DW_FORM_ref_sig8);\n  info.D64(0xf72fa0cb6ddcf9d6ULL);\n  info.Finish();\n\n  ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x253e7b2b);\n  EXPECT_CALL(handler, ProcessAttributeSignature(_, (DwarfAttribute) 0xd708d908,\n                                                 dwarf2reader::DW_FORM_ref_sig8,\n                                                 0xf72fa0cb6ddcf9d6ULL))\n      .InSequence(s)\n      .WillOnce(Return());\n  ExpectEndCompilationUnit();\n\n  ParseCompilationUnit(GetParam());\n}\n\n// A value passed to ProcessAttributeSignature is just an absolute number,\n// not an offset within the compilation unit as most of the other\n// DW_FORM_ref forms are. Check that the reader doesn't try to apply any\n// offset to the signature, by reading it from a compilation unit that does\n// not start at the beginning of the section.\nTEST_P(DwarfForms, ref_sig8_not_first) {\n  info.Append(98, '*');\n  StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x253e7b2b,\n                          (DwarfAttribute) 0xd708d908,\n                          dwarf2reader::DW_FORM_ref_sig8);\n  info.D64(0xf72fa0cb6ddcf9d6ULL);\n  info.Finish();\n\n  ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x253e7b2b, 98);\n  EXPECT_CALL(handler, ProcessAttributeSignature(_, (DwarfAttribute) 0xd708d908,\n                                                 dwarf2reader::DW_FORM_ref_sig8,\n                                                 0xf72fa0cb6ddcf9d6ULL))\n      .InSequence(s)\n      .WillOnce(Return());\n  ExpectEndCompilationUnit();\n\n  ParseCompilationUnit(GetParam(), 98);\n}\n\n// Tests for the other attribute forms could go here.\n\nINSTANTIATE_TEST_CASE_P(\n    HeaderVariants, DwarfForms,\n    ::testing::Values(DwarfHeaderParams(kLittleEndian, 4, 2, 4),\n                      DwarfHeaderParams(kLittleEndian, 4, 2, 8),\n                      DwarfHeaderParams(kLittleEndian, 4, 3, 4),\n                      DwarfHeaderParams(kLittleEndian, 4, 3, 8),\n                      DwarfHeaderParams(kLittleEndian, 4, 4, 4),\n                      DwarfHeaderParams(kLittleEndian, 4, 4, 8),\n                      DwarfHeaderParams(kLittleEndian, 8, 2, 4),\n                      DwarfHeaderParams(kLittleEndian, 8, 2, 8),\n                      DwarfHeaderParams(kLittleEndian, 8, 3, 4),\n                      DwarfHeaderParams(kLittleEndian, 8, 3, 8),\n                      DwarfHeaderParams(kLittleEndian, 8, 4, 4),\n                      DwarfHeaderParams(kLittleEndian, 8, 4, 8),\n                      DwarfHeaderParams(kBigEndian,    4, 2, 4),\n                      DwarfHeaderParams(kBigEndian,    4, 2, 8),\n                      DwarfHeaderParams(kBigEndian,    4, 3, 4),\n                      DwarfHeaderParams(kBigEndian,    4, 3, 8),\n                      DwarfHeaderParams(kBigEndian,    4, 4, 4),\n                      DwarfHeaderParams(kBigEndian,    4, 4, 8),\n                      DwarfHeaderParams(kBigEndian,    8, 2, 4),\n                      DwarfHeaderParams(kBigEndian,    8, 2, 8),\n                      DwarfHeaderParams(kBigEndian,    8, 3, 4),\n                      DwarfHeaderParams(kBigEndian,    8, 3, 8),\n                      DwarfHeaderParams(kBigEndian,    8, 4, 4),\n                      DwarfHeaderParams(kBigEndian,    8, 4, 8)));\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/dwarf2reader_test_common.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2012, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dwarf2reader_test_common.h: Define TestCompilationUnit and\n// TestAbbrevTable, classes for creating properly (and improperly)\n// formatted DWARF compilation unit data for unit tests.\n\n#ifndef COMMON_DWARF_DWARF2READER_TEST_COMMON_H__\n#define COMMON_DWARF_DWARF2READER_TEST_COMMON_H__\n\n#include \"common/test_assembler.h\"\n#include \"common/dwarf/dwarf2enums.h\"\n\n// A subclass of test_assembler::Section, specialized for constructing\n// DWARF compilation units.\nclass TestCompilationUnit: public google_breakpad::test_assembler::Section {\n public:\n  typedef dwarf2reader::DwarfTag DwarfTag;\n  typedef dwarf2reader::DwarfAttribute DwarfAttribute;\n  typedef dwarf2reader::DwarfForm DwarfForm;\n  typedef google_breakpad::test_assembler::Label Label;\n\n  // Set the section's DWARF format size (the 32-bit DWARF format or the\n  // 64-bit DWARF format, for lengths and section offsets --- not the\n  // address size) to format_size.\n  void set_format_size(size_t format_size) {\n    assert(format_size == 4 || format_size == 8);\n    format_size_ = format_size;\n  }\n    \n  // Append a DWARF section offset value, of the appropriate size for this\n  // compilation unit.\n  template<typename T>\n  void SectionOffset(T offset) {\n    if (format_size_ == 4)\n      D32(offset);\n    else\n      D64(offset);\n  }\n\n  // Append a DWARF compilation unit header to the section, with the given\n  // DWARF version, abbrev table offset, and address size.\n  TestCompilationUnit &Header(int version, const Label &abbrev_offset,\n                              size_t address_size) {\n    if (format_size_ == 4) {\n      D32(length_);\n    } else {\n      D32(0xffffffff);\n      D64(length_);\n    }\n    post_length_offset_ = Size();\n    D16(version);\n    SectionOffset(abbrev_offset);\n    D8(address_size);\n    return *this;\n  }\n\n  // Mark the end of this header's DIEs.\n  TestCompilationUnit &Finish() {\n    length_ = Size() - post_length_offset_;\n    return *this;\n  }\n\n private:\n  // The DWARF format size for this compilation unit.\n  size_t format_size_;\n\n  // The offset of the point in the compilation unit header immediately\n  // after the initial length field.\n  u_int64_t post_length_offset_;\n\n  // The length of the compilation unit, not including the initial length field.\n  Label length_;\n};\n\n// A subclass of test_assembler::Section specialized for constructing DWARF\n// abbreviation tables.\nclass TestAbbrevTable: public google_breakpad::test_assembler::Section {\n public:\n  typedef dwarf2reader::DwarfTag DwarfTag;\n  typedef dwarf2reader::DwarfAttribute DwarfAttribute;\n  typedef dwarf2reader::DwarfForm DwarfForm;\n  typedef dwarf2reader::DwarfHasChild DwarfHasChild;\n  typedef google_breakpad::test_assembler::Label Label;\n\n  // Start a new abbreviation table entry for abbreviation code |code|,\n  // encoding a DIE whose tag is |tag|, and which has children if and only\n  // if |has_children| is true.\n  TestAbbrevTable &Abbrev(int code, DwarfTag tag, DwarfHasChild has_children) {\n    assert(code != 0);\n    ULEB128(code);\n    ULEB128(static_cast<unsigned>(tag));\n    D8(static_cast<unsigned>(has_children));\n    return *this;\n  };\n\n  // Add an attribute to the current abbreviation code whose name is |name|\n  // and whose form is |form|.\n  TestAbbrevTable &Attribute(DwarfAttribute name, DwarfForm form) {\n    ULEB128(static_cast<unsigned>(name));\n    ULEB128(static_cast<unsigned>(form));\n    return *this;\n  }\n\n  // Finish the current abbreviation code.\n  TestAbbrevTable &EndAbbrev() {\n    ULEB128(0);\n    ULEB128(0);\n    return *this;\n  }\n\n  // Finish the current abbreviation table.\n  TestAbbrevTable &EndTable() {\n    ULEB128(0);\n    return *this;\n  }\n};\n\n#endif // COMMON_DWARF_DWARF2READER_TEST_COMMON_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/functioninfo.cc",
    "content": "// Copyright (c) 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This is a client for the dwarf2reader to extract function and line\n// information from the debug info.\n\n#include <assert.h>\n#include <limits.h>\n#include <stdio.h>\n\n#include <map>\n#include <queue>\n#include <vector>\n#include <memory>\n\n#include \"common/dwarf/functioninfo.h\"\n\n#include \"common/dwarf/bytereader.h\"\n\n\nnamespace dwarf2reader {\n\nCULineInfoHandler::CULineInfoHandler(std::vector<SourceFileInfo>* files,\n                                     std::vector<std::string>* dirs,\n                                     LineMap* linemap):linemap_(linemap),\n                                                       files_(files),\n                                                       dirs_(dirs) {\n  // The dirs and files are 1 indexed, so just make sure we put\n  // nothing in the 0 vector.\n  assert(dirs->size() == 0);\n  assert(files->size() == 0);\n  dirs->push_back(\"\");\n  SourceFileInfo s;\n  s.name = \"\";\n  s.lowpc = ULLONG_MAX;\n  files->push_back(s);\n}\n\nvoid CULineInfoHandler::DefineDir(const std::string& name, uint32 dir_num) {\n  // These should never come out of order, actually\n  assert(dir_num == dirs_->size());\n  dirs_->push_back(name);\n}\n\nvoid CULineInfoHandler::DefineFile(const std::string& name,\n                                   int32 file_num, uint32 dir_num,\n                                   uint64 mod_time, uint64 length) {\n  assert(dir_num >= 0);\n  assert(dir_num < dirs_->size());\n\n  // These should never come out of order, actually.\n  if (file_num == (int32)files_->size() || file_num == -1) {\n    std::string dir = dirs_->at(dir_num);\n\n    SourceFileInfo s;\n    s.lowpc = ULLONG_MAX;\n\n    if (dir == \"\") {\n      s.name = name;\n    } else {\n      s.name = dir + \"/\" + name;\n    }\n\n    files_->push_back(s);\n  } else {\n    fprintf(stderr, \"error in DefineFile\");\n  }\n}\n\nvoid CULineInfoHandler::AddLine(uint64 address, uint64 length, uint32 file_num,\n                                uint32 line_num, uint32 column_num) {\n  if (file_num < files_->size()) {\n    linemap_->insert(\n        std::make_pair(address,\n                       std::make_pair(files_->at(file_num).name.c_str(),\n                                      line_num)));\n\n    if(address < files_->at(file_num).lowpc) {\n      files_->at(file_num).lowpc = address;\n    }\n  } else {\n    fprintf(stderr,\"error in AddLine\");\n  }\n}\n\nbool CUFunctionInfoHandler::StartCompilationUnit(uint64 offset,\n                                                 uint8 address_size,\n                                                 uint8 offset_size,\n                                                 uint64 cu_length,\n                                                 uint8 dwarf_version) {\n  current_compilation_unit_offset_ = offset;\n  return true;\n}\n\n\n// For function info, we only care about subprograms and inlined\n// subroutines. For line info, the DW_AT_stmt_list lives in the\n// compile unit tag.\n\nbool CUFunctionInfoHandler::StartDIE(uint64 offset, enum DwarfTag tag,\n                                     const AttributeList& attrs) {\n  switch (tag) {\n    case DW_TAG_subprogram:\n    case DW_TAG_inlined_subroutine: {\n      current_function_info_ = new FunctionInfo;\n      current_function_info_->lowpc = current_function_info_->highpc = 0;\n      current_function_info_->name = \"\";\n      current_function_info_->line = 0;\n      current_function_info_->file = \"\";\n      offset_to_funcinfo_->insert(std::make_pair(offset,\n                                                 current_function_info_));\n    };\n      // FALLTHROUGH\n    case DW_TAG_compile_unit:\n      return true;\n    default:\n      return false;\n  }\n  return false;\n}\n\n// Only care about the name attribute for functions\n\nvoid CUFunctionInfoHandler::ProcessAttributeString(uint64 offset,\n                                                   enum DwarfAttribute attr,\n                                                   enum DwarfForm form,\n                                                   const std::string &data) {\n  if (current_function_info_) {\n    if (attr == DW_AT_name)\n      current_function_info_->name = data;\n    else if(attr == DW_AT_MIPS_linkage_name)\n      current_function_info_->mangled_name = data;\n  }\n}\n\nvoid CUFunctionInfoHandler::ProcessAttributeUnsigned(uint64 offset,\n                                                     enum DwarfAttribute attr,\n                                                     enum DwarfForm form,\n                                                     uint64 data) {\n  if (attr == DW_AT_stmt_list) {\n    SectionMap::const_iterator iter = sections_.find(\"__debug_line\");\n    assert(iter != sections_.end());\n\n    // this should be a scoped_ptr but we dont' use boost :-(\n    std::auto_ptr<LineInfo> lireader(new LineInfo(iter->second.first + data,\n                                                  iter->second.second  - data,\n                                                  reader_, linehandler_));\n    lireader->Start();\n  } else if (current_function_info_) {\n    switch (attr) {\n      case DW_AT_low_pc:\n        current_function_info_->lowpc = data;\n        break;\n      case DW_AT_high_pc:\n        current_function_info_->highpc = data;\n        break;\n      case DW_AT_decl_line:\n        current_function_info_->line = data;\n        break;\n      case DW_AT_decl_file:\n        current_function_info_->file = files_->at(data).name;\n        break;\n      default:\n        break;\n    }\n  }\n}\n\nvoid CUFunctionInfoHandler::ProcessAttributeReference(uint64 offset,\n                                                      enum DwarfAttribute attr,\n                                                      enum DwarfForm form,\n                                                      uint64 data) {\n  if (current_function_info_) {\n    switch (attr) {\n      case DW_AT_specification: {\n        // Some functions have a \"specification\" attribute\n        // which means they were defined elsewhere. The name\n        // attribute is not repeated, and must be taken from\n        // the specification DIE. Here we'll assume that\n        // any DIE referenced in this manner will already have\n        // been seen, but that's not really required by the spec.\n        FunctionMap::iterator iter = offset_to_funcinfo_->find(data);\n        if (iter != offset_to_funcinfo_->end()) {\n          current_function_info_->name = iter->second->name;\n          current_function_info_->mangled_name = iter->second->mangled_name;\n        } else {\n          // If you hit this, this code probably needs to be rewritten.\n          fprintf(stderr, \"Error: DW_AT_specification was seen before the referenced DIE! (Looking for DIE at offset %08llx, in DIE at offset %08llx)\\n\", data, offset);\n        }\n        break;\n      }\n      default:\n        break;\n    }\n  }\n}\n\nvoid CUFunctionInfoHandler::EndDIE(uint64 offset) {\n  if (current_function_info_ && current_function_info_->lowpc)\n    address_to_funcinfo_->insert(std::make_pair(current_function_info_->lowpc,\n                                                current_function_info_));\n}\n\n}  // namespace dwarf2reader\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/functioninfo.h",
    "content": "// Copyright (c) 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// This file contains the definitions for a DWARF2/3 information\n// collector that uses the DWARF2/3 reader interface to build a mapping\n// of addresses to files, lines, and functions.\n\n#ifndef COMMON_DWARF_FUNCTIONINFO_H__\n#define COMMON_DWARF_FUNCTIONINFO_H__\n\n#include <map>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"common/dwarf/dwarf2reader.h\"\n\n\nnamespace dwarf2reader {\n\nstruct FunctionInfo {\n  // Name of the function\n  std::string name;\n  // Mangled name of the function\n  std::string mangled_name;\n  // File containing this function\n  std::string file;\n  // Line number for start of function.\n  uint32 line;\n  // Beginning address for this function\n  uint64 lowpc;\n  // End address for this function.\n  uint64 highpc;\n};\n\nstruct SourceFileInfo {\n  // Name of the source file name\n  std::string name;\n  // Low address of source file name\n  uint64 lowpc;\n};\n\ntypedef std::map<uint64, FunctionInfo*> FunctionMap;\ntypedef std::map<uint64, std::pair<std::string, uint32> > LineMap;\n\n// This class is a basic line info handler that fills in the dirs,\n// file, and linemap passed into it with the data produced from the\n// LineInfoHandler.\nclass CULineInfoHandler: public LineInfoHandler {\n public:\n\n  //\n  CULineInfoHandler(std::vector<SourceFileInfo>* files,\n                    std::vector<std::string>* dirs,\n                    LineMap* linemap);\n  virtual ~CULineInfoHandler() { }\n\n  // Called when we define a directory.  We just place NAME into dirs_\n  // at position DIR_NUM.\n  virtual void DefineDir(const std::string& name, uint32 dir_num);\n\n  // Called when we define a filename.  We just place\n  // concat(dirs_[DIR_NUM], NAME) into files_ at position FILE_NUM.\n  virtual void DefineFile(const std::string& name, int32 file_num,\n                          uint32 dir_num, uint64 mod_time, uint64 length);\n\n\n  // Called when the line info reader has a new line, address pair\n  // ready for us. ADDRESS is the address of the code, LENGTH is the\n  // length of its machine code in bytes, FILE_NUM is the file number\n  // containing the code, LINE_NUM is the line number in that file for\n  // the code, and COLUMN_NUM is the column number the code starts at,\n  // if we know it (0 otherwise).\n  virtual void AddLine(uint64 address, uint64 length,\n                       uint32 file_num, uint32 line_num, uint32 column_num);\n\n private:\n  LineMap* linemap_;\n  std::vector<SourceFileInfo>* files_;\n  std::vector<std::string>* dirs_;\n};\n\nclass CUFunctionInfoHandler: public Dwarf2Handler {\n public:\n  CUFunctionInfoHandler(std::vector<SourceFileInfo>* files,\n                        std::vector<std::string>* dirs,\n                        LineMap* linemap,\n                        FunctionMap* offset_to_funcinfo,\n                        FunctionMap* address_to_funcinfo,\n                        CULineInfoHandler* linehandler,\n                        const SectionMap& sections,\n                        ByteReader* reader)\n      : files_(files), dirs_(dirs), linemap_(linemap),\n        offset_to_funcinfo_(offset_to_funcinfo),\n        address_to_funcinfo_(address_to_funcinfo),\n        linehandler_(linehandler), sections_(sections),\n        reader_(reader), current_function_info_(NULL) { }\n\n  virtual ~CUFunctionInfoHandler() { }\n\n  // Start to process a compilation unit at OFFSET from the beginning of the\n  // .debug_info section.  We want to see all compilation units, so we\n  // always return true.\n\n  virtual bool StartCompilationUnit(uint64 offset, uint8 address_size,\n                                    uint8 offset_size, uint64 cu_length,\n                                    uint8 dwarf_version);\n\n  // Start to process a DIE at OFFSET from the beginning of the\n  // .debug_info section.  We only care about function related DIE's.\n  virtual bool StartDIE(uint64 offset, enum DwarfTag tag,\n                        const AttributeList& attrs);\n\n  // Called when we have an attribute with unsigned data to give to\n  // our handler.  The attribute is for the DIE at OFFSET from the\n  // beginning of the .debug_info section, has a name of ATTR, a form of\n  // FORM, and the actual data of the attribute is in DATA.\n  virtual void ProcessAttributeUnsigned(uint64 offset,\n                                        enum DwarfAttribute attr,\n                                        enum DwarfForm form,\n                                        uint64 data);\n\n  // Called when we have an attribute with a DIE reference to give to\n  // our handler.  The attribute is for the DIE at OFFSET from the\n  // beginning of the .debug_info section, has a name of ATTR, a form of\n  // FORM, and the offset of the referenced DIE from the start of the\n  // .debug_info section is in DATA.\n  virtual void ProcessAttributeReference(uint64 offset,\n                                         enum DwarfAttribute attr,\n                                         enum DwarfForm form,\n                                         uint64 data);\n\n  // Called when we have an attribute with string data to give to\n  // our handler.  The attribute is for the DIE at OFFSET from the\n  // beginning of the .debug_info section, has a name of ATTR, a form of\n  // FORM, and the actual data of the attribute is in DATA.\n  virtual void ProcessAttributeString(uint64 offset,\n                                      enum DwarfAttribute attr,\n                                      enum DwarfForm form,\n                                      const std::string& data);\n\n  // Called when finished processing the DIE at OFFSET.\n  // Because DWARF2/3 specifies a tree of DIEs, you may get starts\n  // before ends of the previous DIE, as we process children before\n  // ending the parent.\n  virtual void EndDIE(uint64 offset);\n\n private:\n  std::vector<SourceFileInfo>* files_;\n  std::vector<std::string>* dirs_;\n  LineMap* linemap_;\n  FunctionMap* offset_to_funcinfo_;\n  FunctionMap* address_to_funcinfo_;\n  CULineInfoHandler* linehandler_;\n  const SectionMap& sections_;\n  ByteReader* reader_;\n  FunctionInfo* current_function_info_;\n  uint64 current_compilation_unit_offset_;\n};\n\n}  // namespace dwarf2reader\n#endif  // COMMON_DWARF_FUNCTIONINFO_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/line_state_machine.h",
    "content": "// Copyright 2008 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#ifndef COMMON_DWARF_LINE_STATE_MACHINE_H__\n#define COMMON_DWARF_LINE_STATE_MACHINE_H__\n\nnamespace dwarf2reader {\n\n// This is the format of a DWARF2/3 line state machine that we process\n// opcodes using.  There is no need for anything outside the lineinfo\n// processor to know how this works.\nstruct LineStateMachine {\n  void Reset(bool default_is_stmt) {\n    file_num = 1;\n    address = 0;\n    line_num = 1;\n    column_num = 0;\n    is_stmt = default_is_stmt;\n    basic_block = false;\n    end_sequence = false;\n  }\n\n  uint32 file_num;\n  uint64 address;\n  uint32 line_num;\n  uint32 column_num;\n  bool is_stmt;  // stmt means statement.\n  bool basic_block;\n  bool end_sequence;\n};\n\n}  // namespace dwarf2reader\n\n\n#endif  // COMMON_DWARF_LINE_STATE_MACHINE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf/types.h",
    "content": "// Copyright 2008 Google, Inc.  All Rights reserved\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n// This file contains some typedefs for basic types\n\n\n#ifndef _COMMON_DWARF_TYPES_H__\n#define _COMMON_DWARF_TYPES_H__\n\n#include <stdint.h>\n\ntypedef signed char         int8;\ntypedef short               int16;\ntypedef int                 int32;\ntypedef long long           int64;\n\ntypedef unsigned char      uint8;\ntypedef unsigned short     uint16;\ntypedef unsigned int       uint32;\ntypedef unsigned long long uint64;\n\n#ifdef __PTRDIFF_TYPE__\ntypedef          __PTRDIFF_TYPE__ intptr;\ntypedef unsigned __PTRDIFF_TYPE__ uintptr;\n#else\n#error \"Can't find pointer-sized integral types.\"\n#endif\n\n#endif // _COMMON_DWARF_TYPES_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf_cfi_to_module.cc",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// Implementation of google_breakpad::DwarfCFIToModule.\n// See dwarf_cfi_to_module.h for details.\n\n#include <sstream>\n\n#include \"common/dwarf_cfi_to_module.h\"\n\nnamespace google_breakpad {\n\nusing std::ostringstream;\n\nvector<string> DwarfCFIToModule::RegisterNames::MakeVector(\n    const char * const *strings,\n    size_t size) {\n  vector<string> names(strings, strings + size);\n  return names;\n}\n\nvector<string> DwarfCFIToModule::RegisterNames::I386() {\n  static const char *const names[] = {\n    \"$eax\", \"$ecx\", \"$edx\", \"$ebx\", \"$esp\", \"$ebp\", \"$esi\", \"$edi\",\n    \"$eip\", \"$eflags\", \"$unused1\",\n    \"$st0\", \"$st1\", \"$st2\", \"$st3\", \"$st4\", \"$st5\", \"$st6\", \"$st7\",\n    \"$unused2\", \"$unused3\",\n    \"$xmm0\", \"$xmm1\", \"$xmm2\", \"$xmm3\", \"$xmm4\", \"$xmm5\", \"$xmm6\", \"$xmm7\",\n    \"$mm0\", \"$mm1\", \"$mm2\", \"$mm3\", \"$mm4\", \"$mm5\", \"$mm6\", \"$mm7\",\n    \"$fcw\", \"$fsw\", \"$mxcsr\",\n    \"$es\", \"$cs\", \"$ss\", \"$ds\", \"$fs\", \"$gs\", \"$unused4\", \"$unused5\",\n    \"$tr\", \"$ldtr\"\n  };\n\n  return MakeVector(names, sizeof(names) / sizeof(names[0]));\n}\n\nvector<string> DwarfCFIToModule::RegisterNames::X86_64() {\n  static const char *const names[] = {\n    \"$rax\", \"$rdx\", \"$rcx\", \"$rbx\", \"$rsi\", \"$rdi\", \"$rbp\", \"$rsp\",\n    \"$r8\",  \"$r9\",  \"$r10\", \"$r11\", \"$r12\", \"$r13\", \"$r14\", \"$r15\",\n    \"$rip\",\n    \"$xmm0\",\"$xmm1\",\"$xmm2\", \"$xmm3\", \"$xmm4\", \"$xmm5\", \"$xmm6\", \"$xmm7\",\n    \"$xmm8\",\"$xmm9\",\"$xmm10\",\"$xmm11\",\"$xmm12\",\"$xmm13\",\"$xmm14\",\"$xmm15\",\n    \"$st0\", \"$st1\", \"$st2\", \"$st3\", \"$st4\", \"$st5\", \"$st6\", \"$st7\",\n    \"$mm0\", \"$mm1\", \"$mm2\", \"$mm3\", \"$mm4\", \"$mm5\", \"$mm6\", \"$mm7\",\n    \"$rflags\",\n    \"$es\", \"$cs\", \"$ss\", \"$ds\", \"$fs\", \"$gs\", \"$unused1\", \"$unused2\",\n    \"$fs.base\", \"$gs.base\", \"$unused3\", \"$unused4\",\n    \"$tr\", \"$ldtr\",\n    \"$mxcsr\", \"$fcw\", \"$fsw\"\n  };\n\n  return MakeVector(names, sizeof(names) / sizeof(names[0]));\n}\n\nvector<string> DwarfCFIToModule::RegisterNames::ARM() {\n  static const char *const names[] = {\n    \"r0\",  \"r1\",  \"r2\",  \"r3\",  \"r4\",  \"r5\",  \"r6\",  \"r7\",\n    \"r8\",  \"r9\",  \"r10\", \"r11\", \"r12\", \"sp\",  \"lr\",  \"pc\",\n    \"f0\",  \"f1\",  \"f2\",  \"f3\",  \"f4\",  \"f5\",  \"f6\",  \"f7\",\n    \"fps\", \"cpsr\"\n  };\n\n  return MakeVector(names, sizeof(names) / sizeof(names[0]));\n}\n\nbool DwarfCFIToModule::Entry(size_t offset, uint64 address, uint64 length,\n                             uint8 version, const string &augmentation,\n                             unsigned return_address) {\n  assert(!entry_);\n\n  // If dwarf2reader::CallFrameInfo can handle this version and\n  // augmentation, then we should be okay with that, so there's no\n  // need to check them here.\n\n  // Get ready to collect entries.\n  entry_ = new Module::StackFrameEntry;\n  entry_->address = address;\n  entry_->size = length;\n  entry_offset_ = offset;\n  return_address_ = return_address;\n\n  // Breakpad STACK CFI records must provide a .ra rule, but DWARF CFI\n  // may not establish any rule for .ra if the return address column\n  // is an ordinary register, and that register holds the return\n  // address on entry to the function. So establish an initial .ra\n  // rule citing the return address register.\n  if (return_address_ < register_names_.size())\n    entry_->initial_rules[ra_name_] = register_names_[return_address_];\n\n  return true;\n}\n\nstring DwarfCFIToModule::RegisterName(int i) {\n  assert(entry_);\n  if (i < 0) {\n    assert(i == kCFARegister);\n    return cfa_name_;\n  }\n  unsigned reg = i;\n  if (reg == return_address_)\n    return ra_name_;\n\n  if (reg < register_names_.size())\n    return register_names_[reg];\n\n  reporter_->UnnamedRegister(entry_offset_, reg);\n  char buf[30];\n  sprintf(buf, \"unnamed_register%u\", reg);\n  return buf;\n}\n\nvoid DwarfCFIToModule::Record(Module::Address address, int reg,\n                              const string &rule) {\n  assert(entry_);\n\n  // Place the name in our global set of strings, and then use the string\n  // from the set. Even though the assignment looks like a copy, all the\n  // major std::string implementations use reference counting internally,\n  // so the effect is to have all our data structures share copies of rules\n  // whenever possible. Since register names are drawn from a\n  // vector<string>, register names are already shared.\n  string shared_rule = *common_strings_.insert(rule).first;\n\n  // Is this one of this entry's initial rules?\n  if (address == entry_->address)\n    entry_->initial_rules[RegisterName(reg)] = shared_rule;\n  // File it under the appropriate address.\n  else\n    entry_->rule_changes[address][RegisterName(reg)] = shared_rule;\n}\n\nbool DwarfCFIToModule::UndefinedRule(uint64 address, int reg) {\n  reporter_->UndefinedNotSupported(entry_offset_, RegisterName(reg));\n  // Treat this as a non-fatal error.\n  return true;\n}\n\nbool DwarfCFIToModule::SameValueRule(uint64 address, int reg) {\n  ostringstream s;\n  s << RegisterName(reg);\n  Record(address, reg, s.str());\n  return true;\n}\n\nbool DwarfCFIToModule::OffsetRule(uint64 address, int reg,\n                                  int base_register, long offset) {\n  ostringstream s;\n  s << RegisterName(base_register) << \" \" << offset << \" + ^\";\n  Record(address, reg, s.str());\n  return true;\n}\n\nbool DwarfCFIToModule::ValOffsetRule(uint64 address, int reg,\n                                     int base_register, long offset) {\n  ostringstream s;\n  s << RegisterName(base_register) << \" \" << offset << \" +\";\n  Record(address, reg, s.str());\n  return true;\n}\n\nbool DwarfCFIToModule::RegisterRule(uint64 address, int reg,\n                                    int base_register) {\n  ostringstream s;\n  s << RegisterName(base_register);\n  Record(address, reg, s.str());\n  return true;\n}\n\nbool DwarfCFIToModule::ExpressionRule(uint64 address, int reg,\n                                      const string &expression) {\n  reporter_->ExpressionsNotSupported(entry_offset_, RegisterName(reg));\n  // Treat this as a non-fatal error.\n  return true;\n}\n\nbool DwarfCFIToModule::ValExpressionRule(uint64 address, int reg,\n                                         const string &expression) {\n  reporter_->ExpressionsNotSupported(entry_offset_, RegisterName(reg));\n  // Treat this as a non-fatal error.\n  return true;\n}\n\nbool DwarfCFIToModule::End() {\n  module_->AddStackFrameEntry(entry_);\n  entry_ = NULL;\n  return true;\n}\n\nvoid DwarfCFIToModule::Reporter::UnnamedRegister(size_t offset, int reg) {\n  fprintf(stderr, \"%s, section '%s': \"\n          \"the call frame entry at offset 0x%zx refers to register %d,\"\n          \" whose name we don't know\\n\",\n          file_.c_str(), section_.c_str(), offset, reg);\n}\n\nvoid DwarfCFIToModule::Reporter::UndefinedNotSupported(size_t offset,\n                                                       const string &reg) {\n  fprintf(stderr, \"%s, section '%s': \"\n          \"the call frame entry at offset 0x%zx sets the rule for \"\n          \"register '%s' to 'undefined', but the Breakpad symbol file format\"\n          \" cannot express this\\n\",\n          file_.c_str(), section_.c_str(), offset, reg.c_str());\n}\n\nvoid DwarfCFIToModule::Reporter::ExpressionsNotSupported(size_t offset,\n                                                         const string &reg) {\n  fprintf(stderr, \"%s, section '%s': \"\n          \"the call frame entry at offset 0x%zx uses a DWARF expression to\"\n          \" describe how to recover register '%s', \"\n          \" but this translator cannot yet translate DWARF expressions to\"\n          \" Breakpad postfix expressions\\n\",\n          file_.c_str(), section_.c_str(), offset, reg.c_str());\n}\n\n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf_cfi_to_module.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dwarf_cfi_to_module.h: Define the DwarfCFIToModule class, which\n// accepts parsed DWARF call frame info and adds it to a\n// google_breakpad::Module object, which can write that information to\n// a Breakpad symbol file.\n\n#ifndef COMMON_LINUX_DWARF_CFI_TO_MODULE_H\n#define COMMON_LINUX_DWARF_CFI_TO_MODULE_H\n\n#include <assert.h>\n#include <stdio.h>\n\n#include <set>\n#include <string>\n#include <vector>\n\n#include \"common/module.h\"\n#include \"common/dwarf/dwarf2reader.h\"\n\nnamespace google_breakpad {\n\nusing dwarf2reader::CallFrameInfo;\nusing google_breakpad::Module;\nusing std::set;\nusing std::string;\nusing std::vector;\n\n// A class that accepts parsed call frame information from the DWARF\n// CFI parser and populates a google_breakpad::Module object with the\n// contents.\nclass DwarfCFIToModule: public CallFrameInfo::Handler {\n public:\n\n  // DwarfCFIToModule uses an instance of this class to report errors\n  // detected while converting DWARF CFI to Breakpad STACK CFI records.\n  class Reporter {\n   public:\n    // Create a reporter that writes messages to the standard error\n    // stream. FILE is the name of the file we're processing, and\n    // SECTION is the name of the section within that file that we're\n    // looking at (.debug_frame, .eh_frame, etc.).\n    Reporter(const string &file, const string &section)\n      : file_(file), section_(section) { }\n    virtual ~Reporter() { }\n\n    // The DWARF CFI entry at OFFSET cites register REG, but REG is not\n    // covered by the vector of register names passed to the\n    // DwarfCFIToModule constructor, nor does it match the return\n    // address column number for this entry.\n    virtual void UnnamedRegister(size_t offset, int reg);\n\n    // The DWARF CFI entry at OFFSET says that REG is undefined, but the\n    // Breakpad symbol file format cannot express this.\n    virtual void UndefinedNotSupported(size_t offset, const string &reg);\n\n    // The DWARF CFI entry at OFFSET says that REG uses a DWARF\n    // expression to find its value, but DwarfCFIToModule is not\n    // capable of translating DWARF expressions to Breakpad postfix\n    // expressions.\n    virtual void ExpressionsNotSupported(size_t offset, const string &reg);\n\n  protected:\n    string file_, section_;\n  };\n\n  // Register name tables. If TABLE is a vector returned by one of these\n  // functions, then TABLE[R] is the name of the register numbered R in\n  // DWARF call frame information.\n  class RegisterNames {\n   public:\n    // Intel's \"x86\" or IA-32.\n    static vector<string> I386();\n\n    // AMD x86_64, AMD64, Intel EM64T, or Intel 64\n    static vector<string> X86_64();\n\n    // ARM.\n    static vector<string> ARM();\n\n   private:\n    // Given STRINGS, an array of C strings with SIZE elements, return an\n    // equivalent vector<string>.\n    static vector<string> MakeVector(const char * const *strings, size_t size);\n  };\n\n  // Create a handler for the dwarf2reader::CallFrameInfo parser that\n  // records the stack unwinding information it receives in MODULE.\n  //\n  // Use REGISTER_NAMES[I] as the name of register number I; *this\n  // keeps a reference to the vector, so the vector should remain\n  // alive for as long as the DwarfCFIToModule does.\n  //\n  // Use REPORTER for reporting problems encountered in the conversion\n  // process.\n  DwarfCFIToModule(Module *module, const vector<string> &register_names,\n                   Reporter *reporter)\n      : module_(module), register_names_(register_names), reporter_(reporter),\n        entry_(NULL), return_address_(-1), cfa_name_(\".cfa\"), ra_name_(\".ra\") {\n  }\n  virtual ~DwarfCFIToModule() { delete entry_; }\n\n  virtual bool Entry(size_t offset, uint64 address, uint64 length,\n                     uint8 version, const string &augmentation,\n                     unsigned return_address);\n  virtual bool UndefinedRule(uint64 address, int reg);\n  virtual bool SameValueRule(uint64 address, int reg);\n  virtual bool OffsetRule(uint64 address, int reg,\n                          int base_register, long offset);\n  virtual bool ValOffsetRule(uint64 address, int reg,\n                             int base_register, long offset);\n  virtual bool RegisterRule(uint64 address, int reg, int base_register);\n  virtual bool ExpressionRule(uint64 address, int reg,\n                              const string &expression);\n  virtual bool ValExpressionRule(uint64 address, int reg,\n                                 const string &expression);\n  virtual bool End();\n\n private:\n  // Return the name to use for register REG.\n  string RegisterName(int i);\n\n  // Record RULE for register REG at ADDRESS.\n  void Record(Module::Address address, int reg, const string &rule);\n\n  // The module to which we should add entries.\n  Module *module_;\n\n  // Map from register numbers to register names.\n  const vector<string> &register_names_;\n\n  // The reporter to use to report problems.\n  Reporter *reporter_;\n\n  // The current entry we're constructing.\n  Module::StackFrameEntry *entry_;\n\n  // The section offset of the current frame description entry, for\n  // use in error messages.\n  size_t entry_offset_;\n\n  // The return address column for that entry.\n  unsigned return_address_;\n\n  // The names of the return address and canonical frame address. Putting\n  // these here instead of using string literals allows us to share their\n  // texts in reference-counted std::string implementations (all the\n  // popular ones). Many, many rules cite these strings.\n  string cfa_name_, ra_name_;\n\n  // A set of strings used by this CFI. Before storing a string in one of\n  // our data structures, insert it into this set, and then use the string\n  // from the set.\n  // \n  // Because std::string uses reference counting internally, simply using\n  // strings from this set, even if passed by value, assigned, or held\n  // directly in structures and containers (map<string, ...>, for example),\n  // causes those strings to share a single instance of each distinct piece\n  // of text.\n  set<string> common_strings_;\n};\n\n} // namespace google_breakpad\n\n#endif // COMMON_LINUX_DWARF_CFI_TO_MODULE_H\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf_cfi_to_module_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dwarf_cfi_to_module_unittest.cc: Tests for google_breakpad::DwarfCFIToModule.\n\n#include <string>\n#include <vector>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/dwarf_cfi_to_module.h\"\n\nusing std::string;\nusing std::vector;\n\nusing google_breakpad::Module;\nusing google_breakpad::DwarfCFIToModule;\nusing testing::ContainerEq;\nusing testing::Test;\nusing testing::_;\n\nstruct MockCFIReporter: public DwarfCFIToModule::Reporter {\n  MockCFIReporter(const string &file, const string &section)\n      : Reporter(file, section) { }\n  MOCK_METHOD2(UnnamedRegister, void(size_t offset, int reg));\n  MOCK_METHOD2(UndefinedNotSupported, void(size_t offset, const string &reg));\n  MOCK_METHOD2(ExpressionsNotSupported, void(size_t offset, const string &reg));\n};\n\nstruct DwarfCFIToModuleFixture {\n  DwarfCFIToModuleFixture()\n      : module(\"module name\", \"module os\", \"module arch\", \"module id\"),\n        reporter(\"reporter file\", \"reporter section\"),\n        handler(&module, register_names, &reporter) {\n    register_names.push_back(\"reg0\");\n    register_names.push_back(\"reg1\");\n    register_names.push_back(\"reg2\");\n    register_names.push_back(\"reg3\");\n    register_names.push_back(\"reg4\");\n    register_names.push_back(\"reg5\");\n    register_names.push_back(\"reg6\");\n    register_names.push_back(\"reg7\");\n    register_names.push_back(\"sp\");\n    register_names.push_back(\"pc\");\n\n    EXPECT_CALL(reporter, UnnamedRegister(_, _)).Times(0);\n    EXPECT_CALL(reporter, UndefinedNotSupported(_, _)).Times(0);\n    EXPECT_CALL(reporter, ExpressionsNotSupported(_, _)).Times(0);\n  }\n\n  Module module;\n  vector<string> register_names;\n  MockCFIReporter reporter;\n  DwarfCFIToModule handler;\n  vector<Module::StackFrameEntry *> entries;\n};\n\nclass Entry: public DwarfCFIToModuleFixture, public Test { };\n\nTEST_F(Entry, Accept) {\n  ASSERT_TRUE(handler.Entry(0x3b8961b8, 0xa21069698096fc98ULL,\n                            0xb440ce248169c8d6ULL, 3, \"\", 0xea93c106));\n  ASSERT_TRUE(handler.End());\n  module.GetStackFrameEntries(&entries);\n  EXPECT_EQ(1U, entries.size());\n  EXPECT_EQ(0xa21069698096fc98ULL, entries[0]->address);\n  EXPECT_EQ(0xb440ce248169c8d6ULL, entries[0]->size);\n  EXPECT_EQ(0U, entries[0]->initial_rules.size());\n  EXPECT_EQ(0U, entries[0]->rule_changes.size());\n}\n\nTEST_F(Entry, AcceptOldVersion) {\n  ASSERT_TRUE(handler.Entry(0xeb60e0fc, 0x75b8806bb09eab78ULL,\n                            0xc771f44958d40bbcULL, 1, \"\", 0x093c945e));\n  ASSERT_TRUE(handler.End());\n  module.GetStackFrameEntries(&entries);\n  EXPECT_EQ(1U, entries.size());\n  EXPECT_EQ(0x75b8806bb09eab78ULL, entries[0]->address);\n  EXPECT_EQ(0xc771f44958d40bbcULL, entries[0]->size);\n  EXPECT_EQ(0U, entries[0]->initial_rules.size());\n  EXPECT_EQ(0U, entries[0]->rule_changes.size());\n}\n\nstruct RuleFixture: public DwarfCFIToModuleFixture {\n  RuleFixture() : DwarfCFIToModuleFixture() {\n    entry_address = 0x89327ebf86b47492ULL;\n    entry_size    = 0x2f8cd573072fe02aULL;\n    return_reg    = 0x7886a346;\n  }\n  void StartEntry() {\n    ASSERT_TRUE(handler.Entry(0x4445c05c, entry_address, entry_size,\n                              3, \"\", return_reg));\n  }\n  void CheckEntry() {\n    module.GetStackFrameEntries(&entries);\n    EXPECT_EQ(1U, entries.size());\n    EXPECT_EQ(entry_address, entries[0]->address);\n    EXPECT_EQ(entry_size, entries[0]->size);\n  }\n  uint64 entry_address, entry_size;\n  unsigned return_reg;\n};\n\nclass Rule: public RuleFixture, public Test { };\n\nTEST_F(Rule, UndefinedRule) {\n  EXPECT_CALL(reporter, UndefinedNotSupported(_, \"reg7\"));\n  StartEntry();\n  ASSERT_TRUE(handler.UndefinedRule(entry_address, 7));\n  ASSERT_TRUE(handler.End());\n  CheckEntry();\n  EXPECT_EQ(0U, entries[0]->initial_rules.size());\n  EXPECT_EQ(0U, entries[0]->rule_changes.size());\n}\n\nTEST_F(Rule, SameValueRule) {\n  StartEntry();\n  ASSERT_TRUE(handler.SameValueRule(entry_address, 6));\n  ASSERT_TRUE(handler.End());\n  CheckEntry();\n  Module::RuleMap expected_initial;\n  expected_initial[\"reg6\"] = \"reg6\";\n  EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));\n  EXPECT_EQ(0U, entries[0]->rule_changes.size());\n}\n\nTEST_F(Rule, OffsetRule) {\n  StartEntry();\n  ASSERT_TRUE(handler.OffsetRule(entry_address + 1, return_reg,\n                                 DwarfCFIToModule::kCFARegister,\n                                 16927065));\n  ASSERT_TRUE(handler.End());\n  CheckEntry();\n  EXPECT_EQ(0U, entries[0]->initial_rules.size());\n  Module::RuleChangeMap expected_changes;\n  expected_changes[entry_address + 1][\".ra\"] = \".cfa 16927065 + ^\";\n  EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));\n}\n\nTEST_F(Rule, OffsetRuleNegative) {\n  StartEntry();\n  ASSERT_TRUE(handler.OffsetRule(entry_address + 1,\n                                 DwarfCFIToModule::kCFARegister, 4, -34530721));\n  ASSERT_TRUE(handler.End());\n  CheckEntry();\n  EXPECT_EQ(0U, entries[0]->initial_rules.size());\n  Module::RuleChangeMap expected_changes;\n  expected_changes[entry_address + 1][\".cfa\"] = \"reg4 -34530721 + ^\";\n  EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));\n}\n\nTEST_F(Rule, ValOffsetRule) {\n  // Use an unnamed register number, to exercise that branch of RegisterName.\n  EXPECT_CALL(reporter, UnnamedRegister(_, 10));\n  StartEntry();\n  ASSERT_TRUE(handler.ValOffsetRule(entry_address + 0x5ab7,\n                                    DwarfCFIToModule::kCFARegister,\n                                    10, 61812979));\n  ASSERT_TRUE(handler.End());\n  CheckEntry();\n  EXPECT_EQ(0U, entries[0]->initial_rules.size());\n  Module::RuleChangeMap expected_changes;\n  expected_changes[entry_address + 0x5ab7][\".cfa\"] =\n      \"unnamed_register10 61812979 +\";\n  EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));\n}\n\nTEST_F(Rule, RegisterRule) {\n  StartEntry();\n  ASSERT_TRUE(handler.RegisterRule(entry_address, return_reg, 3));\n  ASSERT_TRUE(handler.End());\n  CheckEntry();\n  Module::RuleMap expected_initial;\n  expected_initial[\".ra\"] = \"reg3\";\n  EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));\n  EXPECT_EQ(0U, entries[0]->rule_changes.size());\n}\n\nTEST_F(Rule, ExpressionRule) {\n  EXPECT_CALL(reporter, ExpressionsNotSupported(_, \"reg2\"));\n  StartEntry();\n  ASSERT_TRUE(handler.ExpressionRule(entry_address + 0xf326, 2,\n                                     \"it takes two to tango\"));\n  ASSERT_TRUE(handler.End());\n  CheckEntry();\n  EXPECT_EQ(0U, entries[0]->initial_rules.size());\n  EXPECT_EQ(0U, entries[0]->rule_changes.size());\n}\n\nTEST_F(Rule, ValExpressionRule) {\n  EXPECT_CALL(reporter, ExpressionsNotSupported(_, \"reg0\"));\n  StartEntry();\n  ASSERT_TRUE(handler.ValExpressionRule(entry_address + 0x6367, 0,\n                                        \"bit off more than he could chew\"));\n  ASSERT_TRUE(handler.End());\n  CheckEntry();\n  EXPECT_EQ(0U, entries[0]->initial_rules.size());\n  EXPECT_EQ(0U, entries[0]->rule_changes.size());\n}\n\nTEST_F(Rule, DefaultReturnAddressRule) {\n  return_reg = 2;\n  StartEntry();\n  ASSERT_TRUE(handler.RegisterRule(entry_address, 0, 1));\n  ASSERT_TRUE(handler.End());\n  CheckEntry();\n  Module::RuleMap expected_initial;\n  expected_initial[\".ra\"] = \"reg2\";\n  expected_initial[\"reg0\"] = \"reg1\";\n  EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));\n  EXPECT_EQ(0U, entries[0]->rule_changes.size());\n}\n\nTEST_F(Rule, DefaultReturnAddressRuleOverride) {\n  return_reg = 2;\n  StartEntry();\n  ASSERT_TRUE(handler.RegisterRule(entry_address, return_reg, 1));\n  ASSERT_TRUE(handler.End());\n  CheckEntry();\n  Module::RuleMap expected_initial;\n  expected_initial[\".ra\"] = \"reg1\";\n  EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));\n  EXPECT_EQ(0U, entries[0]->rule_changes.size());\n}\n\nTEST_F(Rule, DefaultReturnAddressRuleLater) {\n  return_reg = 2;\n  StartEntry();\n  ASSERT_TRUE(handler.RegisterRule(entry_address + 1, return_reg, 1));\n  ASSERT_TRUE(handler.End());\n  CheckEntry();\n  Module::RuleMap expected_initial;\n  expected_initial[\".ra\"] = \"reg2\";\n  EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));\n  Module::RuleChangeMap expected_changes;\n  expected_changes[entry_address + 1][\".ra\"] = \"reg1\";\n  EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));\n}\n\nTEST(RegisterNames, I386) {\n  vector<string> names = DwarfCFIToModule::RegisterNames::I386();\n\n  EXPECT_EQ(\"$eax\", names[0]);\n  EXPECT_EQ(\"$ecx\", names[1]);\n  EXPECT_EQ(\"$esp\", names[4]);\n  EXPECT_EQ(\"$eip\", names[8]);\n}\n\nTEST(RegisterNames, ARM) {\n  vector<string> names = DwarfCFIToModule::RegisterNames::ARM();\n\n  EXPECT_EQ(\"r0\", names[0]);\n  EXPECT_EQ(\"r10\", names[10]);\n  EXPECT_EQ(\"sp\", names[13]);\n  EXPECT_EQ(\"lr\", names[14]);\n  EXPECT_EQ(\"pc\", names[15]);\n}\n\nTEST(RegisterNames, X86_64) {\n  vector<string> names = DwarfCFIToModule::RegisterNames::X86_64();\n\n  EXPECT_EQ(\"$rax\", names[0]);\n  EXPECT_EQ(\"$rdx\", names[1]);\n  EXPECT_EQ(\"$rbp\", names[6]);\n  EXPECT_EQ(\"$rsp\", names[7]);\n  EXPECT_EQ(\"$rip\", names[16]);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf_cu_to_module.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// Implement the DwarfCUToModule class; see dwarf_cu_to_module.h.\n\n// For <inttypes.h> PRI* macros, before anything else might #include it.\n#ifndef __STDC_FORMAT_MACROS\n#define __STDC_FORMAT_MACROS\n#endif  /* __STDC_FORMAT_MACROS */\n\n#include \"common/dwarf_cu_to_module.h\"\n\n#include <assert.h>\n#include <inttypes.h>\n#include <stdio.h>\n\n#include <algorithm>\n#include <set>\n#include <utility>\n\n#include \"common/dwarf_line_to_module.h\"\n\nnamespace google_breakpad {\n\nusing std::map;\nusing std::pair;\nusing std::set;\nusing std::vector;\n\n// Data provided by a DWARF specification DIE.\n// \n// In DWARF, the DIE for a definition may contain a DW_AT_specification\n// attribute giving the offset of the corresponding declaration DIE, and\n// the definition DIE may omit information given in the declaration. For\n// example, it's common for a function's address range to appear only in\n// its definition DIE, but its name to appear only in its declaration\n// DIE.\n//\n// The dumper needs to be able to follow DW_AT_specification links to\n// bring all this information together in a FUNC record. Conveniently,\n// DIEs that are the target of such links have a DW_AT_declaration flag\n// set, so we can identify them when we first see them, and record their\n// contents for later reference.\n//\n// A Specification holds information gathered from a declaration DIE that\n// we may need if we find a DW_AT_specification link pointing to it.\nstruct DwarfCUToModule::Specification {\n  // The name of the enclosing scope, or the empty string if there is none.\n  string enclosing_name;\n\n  // The name for the specification DIE itself, without any enclosing\n  // name components.\n  string unqualified_name;\n};\n\n// An abstract origin -- base definition of an inline function.\nstruct AbstractOrigin {\n  AbstractOrigin() : name() {}\n  AbstractOrigin(const string& name) : name(name) {}\n\n  string name;\n};\n\ntypedef map<uint64, AbstractOrigin> AbstractOriginByOffset;\n\n// Data global to the DWARF-bearing file that is private to the\n// DWARF-to-Module process.\nstruct DwarfCUToModule::FilePrivate {\n  // A set of strings used in this CU. Before storing a string in one of\n  // our data structures, insert it into this set, and then use the string\n  // from the set.\n  // \n  // Because std::string uses reference counting internally, simply using\n  // strings from this set, even if passed by value, assigned, or held\n  // directly in structures and containers (map<string, ...>, for example),\n  // causes those strings to share a single instance of each distinct piece\n  // of text.\n  set<string> common_strings;\n\n  // A map from offsets of DIEs within the .debug_info section to\n  // Specifications describing those DIEs. Specification references can\n  // cross compilation unit boundaries.\n  SpecificationByOffset specifications;\n\n  AbstractOriginByOffset origins;\n};\n\nDwarfCUToModule::FileContext::FileContext(const string &filename_arg,\n                                          Module *module_arg)\n    : filename(filename_arg), module(module_arg) {\n  file_private = new FilePrivate();\n}\n\nDwarfCUToModule::FileContext::~FileContext() {\n  delete file_private;\n}\n\n// Information global to the particular compilation unit we're\n// parsing. This is for data shared across the CU's entire DIE tree,\n// and parameters from the code invoking the CU parser.\nstruct DwarfCUToModule::CUContext {\n  CUContext(FileContext *file_context_arg, WarningReporter *reporter_arg)\n      : file_context(file_context_arg),\n        reporter(reporter_arg),\n        language(Language::CPlusPlus) { }\n  ~CUContext() {\n    for (vector<Module::Function *>::iterator it = functions.begin();\n         it != functions.end(); it++)\n      delete *it;\n  };\n\n  // The DWARF-bearing file into which this CU was incorporated.\n  FileContext *file_context;\n\n  // For printing error messages.\n  WarningReporter *reporter;\n\n  // The source language of this compilation unit.\n  const Language *language;\n\n  // The functions defined in this compilation unit. We accumulate\n  // them here during parsing. Then, in DwarfCUToModule::Finish, we\n  // assign them lines and add them to file_context->module.\n  //\n  // Destroying this destroys all the functions this vector points to.\n  vector<Module::Function *> functions;\n};\n\n// Information about the context of a particular DIE. This is for\n// information that changes as we descend the tree towards the leaves:\n// the containing classes/namespaces, etc.\nstruct DwarfCUToModule::DIEContext {\n  // The fully-qualified name of the context. For example, for a\n  // tree like:\n  //\n  // DW_TAG_namespace Foo\n  //   DW_TAG_class Bar\n  //     DW_TAG_subprogram Baz\n  //\n  // in a C++ compilation unit, the DIEContext's name for the\n  // DW_TAG_subprogram DIE would be \"Foo::Bar\". The DIEContext's\n  // name for the DW_TAG_namespace DIE would be \"\".\n  string name;\n};\n\n// An abstract base class for all the dumper's DIE handlers.\nclass DwarfCUToModule::GenericDIEHandler: public dwarf2reader::DIEHandler {\n public:\n  // Create a handler for the DIE at OFFSET whose compilation unit is\n  // described by CU_CONTEXT, and whose immediate context is described\n  // by PARENT_CONTEXT.\n  GenericDIEHandler(CUContext *cu_context, DIEContext *parent_context,\n                    uint64 offset)\n      : cu_context_(cu_context),\n        parent_context_(parent_context),\n        offset_(offset),\n        declaration_(false),\n        specification_(NULL) { }\n\n  // Derived classes' ProcessAttributeUnsigned can defer to this to\n  // handle DW_AT_declaration, or simply not override it.\n  void ProcessAttributeUnsigned(enum DwarfAttribute attr,\n                                enum DwarfForm form,\n                                uint64 data);\n\n  // Derived classes' ProcessAttributeReference can defer to this to\n  // handle DW_AT_specification, or simply not override it.\n  void ProcessAttributeReference(enum DwarfAttribute attr,\n                                 enum DwarfForm form,\n                                 uint64 data);\n\n  // Derived classes' ProcessAttributeReference can defer to this to\n  // handle DW_AT_specification, or simply not override it.\n  void ProcessAttributeString(enum DwarfAttribute attr,\n                              enum DwarfForm form,\n                              const string &data);\n\n protected:\n  // Compute and return the fully-qualified name of the DIE. If this\n  // DIE is a declaration DIE, to be cited by other DIEs'\n  // DW_AT_specification attributes, record its enclosing name and\n  // unqualified name in the specification table.\n  //\n  // Use this from EndAttributes member functions, not ProcessAttribute*\n  // functions; only the former can be sure that all the DIE's attributes\n  // have been seen.\n  string ComputeQualifiedName();\n\n  CUContext *cu_context_;\n  DIEContext *parent_context_;\n  uint64 offset_;\n\n  // If this DIE has a DW_AT_declaration attribute, this is its value.\n  // It is false on DIEs with no DW_AT_declaration attribute.\n  bool declaration_;\n\n  // If this DIE has a DW_AT_specification attribute, this is the\n  // Specification structure for the DIE the attribute refers to.\n  // Otherwise, this is NULL.\n  Specification *specification_;\n\n  // The value of the DW_AT_name attribute, or the empty string if the\n  // DIE has no such attribute.\n  string name_attribute_;\n};\n\nvoid DwarfCUToModule::GenericDIEHandler::ProcessAttributeUnsigned(\n    enum DwarfAttribute attr,\n    enum DwarfForm form,\n    uint64 data) {\n  switch (attr) {\n    case dwarf2reader::DW_AT_declaration: declaration_ = (data != 0); break;\n    default: break;\n  }\n}\n\nvoid DwarfCUToModule::GenericDIEHandler::ProcessAttributeReference(\n    enum DwarfAttribute attr,\n    enum DwarfForm form,\n    uint64 data) {\n  switch (attr) {\n    case dwarf2reader::DW_AT_specification: {\n      // Find the Specification to which this attribute refers, and\n      // set specification_ appropriately. We could do more processing\n      // here, but it's better to leave the real work to our\n      // EndAttribute member function, at which point we know we have\n      // seen all the DIE's attributes.\n      FileContext *file_context = cu_context_->file_context;\n      SpecificationByOffset *specifications\n          = &file_context->file_private->specifications;\n      SpecificationByOffset::iterator spec = specifications->find(data);\n      if (spec != specifications->end()) {\n        specification_ = &spec->second;\n      } else {\n        // Technically, there's no reason a DW_AT_specification\n        // couldn't be a forward reference, but supporting that would\n        // be a lot of work (changing to a two-pass structure), and I\n        // don't think any producers we care about ever emit such\n        // things.\n        cu_context_->reporter->UnknownSpecification(offset_, data);\n      }\n      break;\n    }\n    default: break;\n  }\n}\n\nvoid DwarfCUToModule::GenericDIEHandler::ProcessAttributeString(\n    enum DwarfAttribute attr,\n    enum DwarfForm form,\n    const string &data) {\n  switch (attr) {\n    case dwarf2reader::DW_AT_name: {\n      // Place the name in our global set of strings, and then use the\n      // string from the set. Even though the assignment looks like a copy,\n      // all the major std::string implementations use reference counting\n      // internally, so the effect is to have all our data structures share\n      // copies of strings whenever possible.\n      pair<set<string>::iterator, bool> result =\n          cu_context_->file_context->file_private->common_strings.insert(data);\n      name_attribute_ = *result.first; \n      break;\n    }\n    default: break;\n  }\n}\n\nstring DwarfCUToModule::GenericDIEHandler::ComputeQualifiedName() {\n  // Find our unqualified name. If the DIE has its own DW_AT_name\n  // attribute, then use that; otherwise, check our specification.\n  const string *unqualified_name;\n  if (name_attribute_.empty() && specification_)\n    unqualified_name = &specification_->unqualified_name;\n  else\n    unqualified_name = &name_attribute_;\n\n  // Find the name of our enclosing context. If we have a\n  // specification, it's the specification's enclosing context that\n  // counts; otherwise, use this DIE's context.\n  const string *enclosing_name;\n  if (specification_)\n    enclosing_name = &specification_->enclosing_name;\n  else\n    enclosing_name = &parent_context_->name;\n\n  // If this DIE was marked as a declaration, record its names in the\n  // specification table.\n  if (declaration_) {\n    FileContext *file_context = cu_context_->file_context;\n    Specification spec;\n    spec.enclosing_name = *enclosing_name;\n    spec.unqualified_name = *unqualified_name;\n    file_context->file_private->specifications[offset_] = spec;\n  }\n\n  // Combine the enclosing name and unqualified name to produce our\n  // own fully-qualified name.\n  return cu_context_->language->MakeQualifiedName(*enclosing_name,\n                                                  *unqualified_name);\n}\n\n// A handler class for DW_TAG_subprogram DIEs.\nclass DwarfCUToModule::FuncHandler: public GenericDIEHandler {\n public:\n  FuncHandler(CUContext *cu_context, DIEContext *parent_context,\n              uint64 offset)\n      : GenericDIEHandler(cu_context, parent_context, offset),\n        low_pc_(0), high_pc_(0), abstract_origin_(NULL), inline_(false) { }\n  void ProcessAttributeUnsigned(enum DwarfAttribute attr,\n                                enum DwarfForm form,\n                                uint64 data);\n  void ProcessAttributeSigned(enum DwarfAttribute attr,\n                              enum DwarfForm form,\n                              int64 data);\n  void ProcessAttributeReference(enum DwarfAttribute attr,\n                                 enum DwarfForm form,\n                                 uint64 data);\n\n  bool EndAttributes();\n  void Finish();\n\n private:\n  // The fully-qualified name, as derived from name_attribute_,\n  // specification_, parent_context_.  Computed in EndAttributes.\n  string name_;\n  uint64 low_pc_, high_pc_; // DW_AT_low_pc, DW_AT_high_pc\n  const AbstractOrigin* abstract_origin_;\n  bool inline_;\n};\n\nvoid DwarfCUToModule::FuncHandler::ProcessAttributeUnsigned(\n    enum DwarfAttribute attr,\n    enum DwarfForm form,\n    uint64 data) {\n  switch (attr) {\n    // If this attribute is present at all --- even if its value is\n    // DW_INL_not_inlined --- then GCC may cite it as someone else's\n    // DW_AT_abstract_origin attribute.\n    case dwarf2reader::DW_AT_inline:      inline_  = true; break;\n\n    case dwarf2reader::DW_AT_low_pc:      low_pc_  = data; break;\n    case dwarf2reader::DW_AT_high_pc:     high_pc_ = data; break;\n    default:\n      GenericDIEHandler::ProcessAttributeUnsigned(attr, form, data);\n      break;\n  }\n}\n\nvoid DwarfCUToModule::FuncHandler::ProcessAttributeSigned(\n    enum DwarfAttribute attr,\n    enum DwarfForm form,\n    int64 data) {\n  switch (attr) {\n    // If this attribute is present at all --- even if its value is\n    // DW_INL_not_inlined --- then GCC may cite it as someone else's\n    // DW_AT_abstract_origin attribute.\n    case dwarf2reader::DW_AT_inline:      inline_  = true; break;\n\n    default:\n      break;\n  }\n}\n\nvoid DwarfCUToModule::FuncHandler::ProcessAttributeReference(\n    enum DwarfAttribute attr,\n    enum DwarfForm form,\n    uint64 data) {\n  switch(attr) {\n    case dwarf2reader::DW_AT_abstract_origin: {\n      const AbstractOriginByOffset& origins =\n          cu_context_->file_context->file_private->origins;\n      AbstractOriginByOffset::const_iterator origin = origins.find(data);\n      if (origin != origins.end()) {\n        abstract_origin_ = &(origin->second);\n      } else {\n        cu_context_->reporter->UnknownAbstractOrigin(offset_, data);\n      }\n      break;\n    }\n    default:\n      GenericDIEHandler::ProcessAttributeReference(attr, form, data);\n      break;\n  }\n}\n\nbool DwarfCUToModule::FuncHandler::EndAttributes() {\n  // Compute our name, and record a specification, if appropriate.\n  name_ = ComputeQualifiedName();\n  if (name_.empty() && abstract_origin_) {\n    name_ = abstract_origin_->name;\n  }\n  return true;\n}\n\nvoid DwarfCUToModule::FuncHandler::Finish() {\n  // Did we collect the information we need?  Not all DWARF function\n  // entries have low and high addresses (for example, inlined\n  // functions that were never used), but all the ones we're\n  // interested in cover a non-empty range of bytes.\n  if (low_pc_ < high_pc_) {\n    // Create a Module::Function based on the data we've gathered, and\n    // add it to the functions_ list.\n    Module::Function *func = new Module::Function;\n    // Malformed DWARF may omit the name, but all Module::Functions must\n    // have names.\n    if (!name_.empty()) {\n      func->name = name_;\n    } else {\n      cu_context_->reporter->UnnamedFunction(offset_);\n      func->name = \"<name omitted>\";\n    }\n    func->address = low_pc_;\n    func->size = high_pc_ - low_pc_;\n    func->parameter_size = 0;\n    if (func->address) {\n       // If the function address is zero this is a sign that this function\n       // description is just empty debug data and should just be discarded.\n       cu_context_->functions.push_back(func);\n     }\n  } else if (inline_) {\n    AbstractOrigin origin(name_);\n    cu_context_->file_context->file_private->origins[offset_] = origin;\n  }\n}\n\n// A handler for DIEs that contain functions and contribute a\n// component to their names: namespaces, classes, etc.\nclass DwarfCUToModule::NamedScopeHandler: public GenericDIEHandler {\n public:\n  NamedScopeHandler(CUContext *cu_context, DIEContext *parent_context,\n                    uint64 offset)\n      : GenericDIEHandler(cu_context, parent_context, offset) { }\n  bool EndAttributes();\n  DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag,\n                               const AttributeList &attrs);\n\n private:\n  DIEContext child_context_; // A context for our children.\n};\n\nbool DwarfCUToModule::NamedScopeHandler::EndAttributes() {\n  child_context_.name = ComputeQualifiedName();\n  return true;\n}\n\ndwarf2reader::DIEHandler *DwarfCUToModule::NamedScopeHandler::FindChildHandler(\n    uint64 offset,\n    enum DwarfTag tag,\n    const AttributeList &attrs) {\n  switch (tag) {\n    case dwarf2reader::DW_TAG_subprogram:\n      return new FuncHandler(cu_context_, &child_context_, offset);\n    case dwarf2reader::DW_TAG_namespace:\n    case dwarf2reader::DW_TAG_class_type:\n    case dwarf2reader::DW_TAG_structure_type:\n    case dwarf2reader::DW_TAG_union_type:\n      return new NamedScopeHandler(cu_context_, &child_context_, offset);\n    default:\n      return NULL;\n  }\n}\n\nvoid DwarfCUToModule::WarningReporter::CUHeading() {\n  if (printed_cu_header_)\n    return;\n  fprintf(stderr, \"%s: in compilation unit '%s' (offset 0x%llx):\\n\",\n          filename_.c_str(), cu_name_.c_str(), cu_offset_);\n  printed_cu_header_ = true;\n}\n\nvoid DwarfCUToModule::WarningReporter::UnknownSpecification(uint64 offset,\n                                                            uint64 target) {\n  CUHeading();\n  fprintf(stderr, \"%s: the DIE at offset 0x%llx has a DW_AT_specification\"\n          \" attribute referring to the die at offset 0x%llx, which either\"\n          \" was not marked as a declaration, or comes later in the file\\n\",\n          filename_.c_str(), offset, target);\n}\n\nvoid DwarfCUToModule::WarningReporter::UnknownAbstractOrigin(uint64 offset,\n                                                             uint64 target) {\n  CUHeading();\n  fprintf(stderr, \"%s: the DIE at offset 0x%llx has a DW_AT_abstract_origin\"\n          \" attribute referring to the die at offset 0x%llx, which either\"\n          \" was not marked as an inline, or comes later in the file\\n\",\n          filename_.c_str(), offset, target);\n}\n\nvoid DwarfCUToModule::WarningReporter::MissingSection(const string &name) {\n  CUHeading();\n  fprintf(stderr, \"%s: warning: couldn't find DWARF '%s' section\\n\",\n          filename_.c_str(), name.c_str());\n}\n\nvoid DwarfCUToModule::WarningReporter::BadLineInfoOffset(uint64 offset) {\n  CUHeading();\n  fprintf(stderr, \"%s: warning: line number data offset beyond end\"\n          \" of '.debug_line' section\\n\",\n          filename_.c_str());\n}\n\nvoid DwarfCUToModule::WarningReporter::UncoveredHeading() {\n  if (printed_unpaired_header_)\n    return;\n  CUHeading();\n  fprintf(stderr, \"%s: warning: skipping unpaired lines/functions:\\n\",\n          filename_.c_str());\n  printed_unpaired_header_ = true;\n}\n\nvoid DwarfCUToModule::WarningReporter::UncoveredFunction(\n    const Module::Function &function) {\n  if (!uncovered_warnings_enabled_)\n    return;\n  UncoveredHeading();\n  fprintf(stderr, \"    function%s: %s\\n\",\n          function.size == 0 ? \" (zero-length)\" : \"\",\n          function.name.c_str());\n}\n\nvoid DwarfCUToModule::WarningReporter::UncoveredLine(const Module::Line &line) {\n  if (!uncovered_warnings_enabled_)\n    return;\n  UncoveredHeading();\n  fprintf(stderr, \"    line%s: %s:%d at 0x%\" PRIx64 \"\\n\",\n          (line.size == 0 ? \" (zero-length)\" : \"\"),\n          line.file->name.c_str(), line.number, line.address);\n}\n\nvoid DwarfCUToModule::WarningReporter::UnnamedFunction(uint64 offset) {\n  CUHeading();\n  fprintf(stderr, \"%s: warning: function at offset 0x%llx has no name\\n\",\n          filename_.c_str(), offset);\n}\n\nDwarfCUToModule::DwarfCUToModule(FileContext *file_context,\n                                 LineToModuleFunctor *line_reader,\n                                 WarningReporter *reporter)\n    : line_reader_(line_reader), has_source_line_info_(false) { \n  cu_context_ = new CUContext(file_context, reporter);\n  child_context_ = new DIEContext();\n}\n\nDwarfCUToModule::~DwarfCUToModule() {\n  delete cu_context_;\n  delete child_context_;\n}\n\nvoid DwarfCUToModule::ProcessAttributeSigned(enum DwarfAttribute attr,\n                                             enum DwarfForm form,\n                                             int64 data) {\n  switch (attr) {\n    case dwarf2reader::DW_AT_language: // source language of this CU\n      SetLanguage(static_cast<DwarfLanguage>(data));\n      break;\n    default:\n      break;\n  }\n}\n\nvoid DwarfCUToModule::ProcessAttributeUnsigned(enum DwarfAttribute attr,\n                                               enum DwarfForm form,\n                                               uint64 data) {\n  switch (attr) {\n    case dwarf2reader::DW_AT_stmt_list: // Line number information.\n      has_source_line_info_ = true;\n      source_line_offset_ = data;\n      break;\n    case dwarf2reader::DW_AT_language: // source language of this CU\n      SetLanguage(static_cast<DwarfLanguage>(data));\n      break;\n    default:\n      break;\n  }\n}\n\nvoid DwarfCUToModule::ProcessAttributeString(enum DwarfAttribute attr,\n                                             enum DwarfForm form,\n                                             const string &data) {\n  if (attr == dwarf2reader::DW_AT_name)\n    cu_context_->reporter->SetCUName(data);\n}\n\nbool DwarfCUToModule::EndAttributes() {\n  return true;\n}\n\ndwarf2reader::DIEHandler *DwarfCUToModule::FindChildHandler(\n    uint64 offset,\n    enum DwarfTag tag,\n    const AttributeList &attrs) {\n  switch (tag) {\n    case dwarf2reader::DW_TAG_subprogram:\n      return new FuncHandler(cu_context_, child_context_, offset);\n    case dwarf2reader::DW_TAG_namespace:\n    case dwarf2reader::DW_TAG_class_type:\n    case dwarf2reader::DW_TAG_structure_type:\n    case dwarf2reader::DW_TAG_union_type:\n      return new NamedScopeHandler(cu_context_, child_context_, offset);\n    default:\n      return NULL;\n  }\n}\n\nvoid DwarfCUToModule::SetLanguage(DwarfLanguage language) {\n  switch (language) {\n    case dwarf2reader::DW_LANG_Java:\n      cu_context_->language = Language::Java;\n      break;\n\n    // DWARF has no generic language code for assembly language; this is\n    // what the GNU toolchain uses.\n    case dwarf2reader::DW_LANG_Mips_Assembler:\n      cu_context_->language = Language::Assembler;\n      break;\n\n    // C++ covers so many cases that it probably has some way to cope\n    // with whatever the other languages throw at us. So make it the\n    // default.\n    //\n    // Objective C and Objective C++ seem to create entries for\n    // methods whose DW_AT_name values are already fully-qualified:\n    // \"-[Classname method:]\".  These appear at the top level.\n    // \n    // DWARF data for C should never include namespaces or functions\n    // nested in struct types, but if it ever does, then C++'s\n    // notation is probably not a bad choice for that.\n    default:\n    case dwarf2reader::DW_LANG_ObjC:\n    case dwarf2reader::DW_LANG_ObjC_plus_plus:\n    case dwarf2reader::DW_LANG_C:\n    case dwarf2reader::DW_LANG_C89:\n    case dwarf2reader::DW_LANG_C99:\n    case dwarf2reader::DW_LANG_C_plus_plus:\n      cu_context_->language = Language::CPlusPlus;\n      break;\n  }\n}\n\nvoid DwarfCUToModule::ReadSourceLines(uint64 offset) {\n  const dwarf2reader::SectionMap &section_map\n      = cu_context_->file_context->section_map;\n  dwarf2reader::SectionMap::const_iterator map_entry\n      = section_map.find(\".debug_line\");\n  // Mac OS X puts DWARF data in sections whose names begin with \"__\"\n  // instead of \".\".\n  if (map_entry == section_map.end())\n    map_entry = section_map.find(\"__debug_line\");\n  if (map_entry == section_map.end()) {\n    cu_context_->reporter->MissingSection(\".debug_line\");\n    return;\n  }\n  const char *section_start = map_entry->second.first;\n  uint64 section_length = map_entry->second.second;\n  if (offset >= section_length) {\n    cu_context_->reporter->BadLineInfoOffset(offset);\n    return;\n  }\n  (*line_reader_)(section_start + offset, section_length - offset,\n                  cu_context_->file_context->module, &lines_);\n}\n\nnamespace {\n// Return true if ADDRESS falls within the range of ITEM.\ntemplate <class T>\ninline bool within(const T &item, Module::Address address) {\n  // Because Module::Address is unsigned, and unsigned arithmetic\n  // wraps around, this will be false if ADDRESS falls before the\n  // start of ITEM, or if it falls after ITEM's end.\n  return address - item.address < item.size;\n}\n}\n\nvoid DwarfCUToModule::AssignLinesToFunctions() {\n  vector<Module::Function *> *functions = &cu_context_->functions;\n  WarningReporter *reporter = cu_context_->reporter;\n\n  // This would be simpler if we assumed that source line entries\n  // don't cross function boundaries.  However, there's no real reason\n  // to assume that (say) a series of function definitions on the same\n  // line wouldn't get coalesced into one line number entry.  The\n  // DWARF spec certainly makes no such promises.\n  //\n  // So treat the functions and lines as peers, and take the trouble\n  // to compute their ranges' intersections precisely.  In any case,\n  // the hair here is a constant factor for performance; the\n  // complexity from here on out is linear.\n\n  // Put both our functions and lines in order by address.\n  sort(functions->begin(), functions->end(),\n       Module::Function::CompareByAddress);\n  sort(lines_.begin(), lines_.end(), Module::Line::CompareByAddress);\n\n  // The last line that we used any piece of.  We use this only for\n  // generating warnings.\n  const Module::Line *last_line_used = NULL;\n\n  // The last function and line we warned about --- so we can avoid\n  // doing so more than once.\n  const Module::Function *last_function_cited = NULL;\n  const Module::Line *last_line_cited = NULL;\n\n  // Make a single pass through both vectors from lower to higher\n  // addresses, populating each Function's lines vector with lines\n  // from our lines_ vector that fall within the function's address\n  // range.\n  vector<Module::Function *>::iterator func_it = functions->begin();\n  vector<Module::Line>::const_iterator line_it = lines_.begin();\n\n  Module::Address current;\n\n  // Pointers to the referents of func_it and line_it, or NULL if the\n  // iterator is at the end of the sequence.\n  Module::Function *func;\n  const Module::Line *line;\n\n  // Start current at the beginning of the first line or function,\n  // whichever is earlier.\n  if (func_it != functions->end() && line_it != lines_.end()) {\n    func = *func_it;\n    line = &*line_it;\n    current = std::min(func->address, line->address);\n  } else if (line_it != lines_.end()) {\n    func = NULL;\n    line = &*line_it;\n    current = line->address;\n  } else if (func_it != functions->end()) {\n    func = *func_it;\n    line = NULL;\n    current = (*func_it)->address;\n  } else {\n    return;\n  }\n\n  while (func || line) {\n    // This loop has two invariants that hold at the top.\n    //\n    // First, at least one of the iterators is not at the end of its\n    // sequence, and those that are not refer to the earliest\n    // function or line that contains or starts after CURRENT.\n    //\n    // Note that every byte is in one of four states: it is covered\n    // or not covered by a function, and, independently, it is\n    // covered or not covered by a line.\n    //\n    // The second invariant is that CURRENT refers to a byte whose\n    // state is different from its predecessor, or it refers to the\n    // first byte in the address space. In other words, CURRENT is\n    // always the address of a transition.\n    //\n    // Note that, although each iteration advances CURRENT from one\n    // transition address to the next in each iteration, it might\n    // not advance the iterators. Suppose we have a function that\n    // starts with a line, has a gap, and then a second line, and\n    // suppose that we enter an iteration with CURRENT at the end of\n    // the first line. The next transition address is the start of\n    // the second line, after the gap, so the iteration should\n    // advance CURRENT to that point. At the head of that iteration,\n    // the invariants require that the line iterator be pointing at\n    // the second line. But this is also true at the head of the\n    // next. And clearly, the iteration must not change the function\n    // iterator. So neither iterator moves.\n\n    // Assert the first invariant (see above).\n    assert(!func || current < func->address || within(*func, current));\n    assert(!line || current < line->address || within(*line, current));\n\n    // The next transition after CURRENT.\n    Module::Address next_transition;\n\n    // Figure out which state we're in, add lines or warn, and compute\n    // the next transition address.\n    if (func && current >= func->address) {\n      if (line && current >= line->address) {\n        // Covered by both a line and a function.\n        Module::Address func_left = func->size - (current - func->address);\n        Module::Address line_left = line->size - (current - line->address);\n        // This may overflow, but things work out.\n        next_transition = current + std::min(func_left, line_left);\n        Module::Line l = *line;\n        l.address = current;\n        l.size = next_transition - current;\n        func->lines.push_back(l);\n        last_line_used = line;\n      } else {\n        // Covered by a function, but no line.\n        if (func != last_function_cited) {\n          reporter->UncoveredFunction(*func);\n          last_function_cited = func;\n        }\n        if (line && within(*func, line->address))\n          next_transition = line->address;\n        else\n          // If this overflows, we'll catch it below.\n          next_transition = func->address + func->size;\n      }\n    } else {\n      if (line && current >= line->address) {\n        // Covered by a line, but no function.\n        //\n        // If GCC emits padding after one function to align the start\n        // of the next, then it will attribute the padding\n        // instructions to the last source line of function (to reduce\n        // the size of the line number info), but omit it from the\n        // DW_AT_{low,high}_pc range given in .debug_info (since it\n        // costs nothing to be precise there). If we did use at least\n        // some of the line we're about to skip, and it ends at the\n        // start of the next function, then assume this is what\n        // happened, and don't warn.\n        if (line != last_line_cited\n            && !(func\n                 && line == last_line_used\n                 && func->address - line->address == line->size)) {\n          reporter->UncoveredLine(*line);\n          last_line_cited = line;\n        }\n        if (func && within(*line, func->address))\n          next_transition = func->address;\n        else\n          // If this overflows, we'll catch it below.\n          next_transition = line->address + line->size;\n      } else {\n        // Covered by neither a function nor a line. By the invariant,\n        // both func and line begin after CURRENT. The next transition\n        // is the start of the next function or next line, whichever\n        // is earliest.\n        assert (func || line);\n        if (func && line)\n          next_transition = std::min(func->address, line->address);\n        else if (func)\n          next_transition = func->address;\n        else\n          next_transition = line->address;\n      }\n    }\n\n    // If a function or line abuts the end of the address space, then\n    // next_transition may end up being zero, in which case we've completed\n    // our pass. Handle that here, instead of trying to deal with it in\n    // each place we compute next_transition.\n    if (!next_transition)\n      break;\n\n    // Advance iterators as needed. If lines overlap or functions overlap,\n    // then we could go around more than once. We don't worry too much\n    // about what result we produce in that case, just as long as we don't\n    // hang or crash.\n    while (func_it != functions->end()\n           && next_transition >= (*func_it)->address\n           && !within(**func_it, next_transition))\n      func_it++;\n    func = (func_it != functions->end()) ? *func_it : NULL;\n    while (line_it != lines_.end()\n           && next_transition >= line_it->address\n           && !within(*line_it, next_transition))\n      line_it++;\n    line = (line_it != lines_.end()) ? &*line_it : NULL;\n\n    // We must make progress.\n    assert(next_transition > current);\n    current = next_transition;\n  }\n}\n\nvoid DwarfCUToModule::Finish() {\n  // Assembly language files have no function data, and that gives us\n  // no place to store our line numbers (even though the GNU toolchain\n  // will happily produce source line info for assembly language\n  // files).  To avoid spurious warnings about lines we can't assign\n  // to functions, skip CUs in languages that lack functions.\n  if (!cu_context_->language->HasFunctions())\n    return;\n\n  // Read source line info, if we have any.\n  if (has_source_line_info_)\n    ReadSourceLines(source_line_offset_);\n\n  vector<Module::Function *> *functions = &cu_context_->functions;\n\n  // Dole out lines to the appropriate functions.\n  AssignLinesToFunctions();\n\n  // Add our functions, which now have source lines assigned to them,\n  // to module_.\n  cu_context_->file_context->module->AddFunctions(functions->begin(),\n                                                  functions->end());\n\n  // Ownership of the function objects has shifted from cu_context to\n  // the Module.\n  functions->clear();\n}\n\nbool DwarfCUToModule::StartCompilationUnit(uint64 offset,\n                                           uint8 address_size,\n                                           uint8 offset_size,\n                                           uint64 cu_length,\n                                           uint8 dwarf_version) {\n  return dwarf_version >= 2;\n}\n\nbool DwarfCUToModule::StartRootDIE(uint64 offset, enum DwarfTag tag,\n                                   const AttributeList& attrs) {\n  // We don't deal with partial compilation units (the only other tag\n  // likely to be used for root DIE).\n  return tag == dwarf2reader::DW_TAG_compile_unit;\n}\n\n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf_cu_to_module.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// Add DWARF debugging information to a Breakpad symbol file. This\n// file defines the DwarfCUToModule class, which accepts parsed DWARF\n// data and populates a google_breakpad::Module with the results; the\n// Module can then write its contents as a Breakpad symbol file.\n\n#ifndef COMMON_LINUX_DWARF_CU_TO_MODULE_H__\n#define COMMON_LINUX_DWARF_CU_TO_MODULE_H__\n\n#include <string>\n\n#include \"common/language.h\"\n#include \"common/module.h\"\n#include \"common/dwarf/bytereader.h\"\n#include \"common/dwarf/dwarf2diehandler.h\"\n#include \"common/dwarf/dwarf2reader.h\"\n\nnamespace google_breakpad {\n\nusing dwarf2reader::AttributeList;\nusing dwarf2reader::DwarfAttribute;\nusing dwarf2reader::DwarfForm;\nusing dwarf2reader::DwarfLanguage;\nusing dwarf2reader::DwarfTag;\n\n// Populate a google_breakpad::Module with DWARF debugging information.\n//\n// An instance of this class can be provided as a handler to a\n// dwarf2reader::DIEDispatcher, which can in turn be a handler for a\n// dwarf2reader::CompilationUnit DWARF parser. The handler uses the results\n// of parsing to populate a google_breakpad::Module with source file,\n// function, and source line information.\nclass DwarfCUToModule: public dwarf2reader::RootDIEHandler {\n  struct FilePrivate;\n public:\n\n  // Information global to the DWARF-bearing file we are processing,\n  // for use by DwarfCUToModule. Each DwarfCUToModule instance deals\n  // with a single compilation unit within the file, but information\n  // global to the whole file is held here. The client is responsible\n  // for filling it in appropriately (except for the 'file_private'\n  // field, which the constructor and destructor take care of), and\n  // then providing it to the DwarfCUToModule instance for each\n  // compilation unit we process in that file.\n  struct FileContext {\n    FileContext(const string &filename_arg, Module *module_arg);\n    ~FileContext();\n\n    // The name of this file, for use in error messages.\n    string filename;\n\n    // A map of this file's sections, used for finding other DWARF\n    // sections that the .debug_info section may refer to.\n    dwarf2reader::SectionMap section_map;\n\n    // The Module to which we're contributing definitions.\n    Module *module;\n\n    // Inter-compilation unit data used internally by the handlers.\n    FilePrivate *file_private;\n  };\n\n  // An abstract base class for functors that handle DWARF line data\n  // for DwarfCUToModule. DwarfCUToModule could certainly just use\n  // dwarf2reader::LineInfo itself directly, but decoupling things\n  // this way makes unit testing a little easier.\n  class LineToModuleFunctor {\n   public:\n    LineToModuleFunctor() { }\n    virtual ~LineToModuleFunctor() { }\n\n    // Populate MODULE and LINES with source file names and code/line\n    // mappings, given a pointer to some DWARF line number data\n    // PROGRAM, and an overestimate of its size. Add no zero-length\n    // lines to LINES.\n    virtual void operator()(const char *program, uint64 length,\n                            Module *module, vector<Module::Line> *lines) = 0;\n  };\n\n  // The interface DwarfCUToModule uses to report warnings. The member\n  // function definitions for this class write messages to stderr, but\n  // you can override them if you'd like to detect or report these\n  // conditions yourself.\n  class WarningReporter {\n   public:\n    // Warn about problems in the DWARF file FILENAME, in the\n    // compilation unit at OFFSET.\n    WarningReporter(const string &filename, uint64 cu_offset)\n        : filename_(filename), cu_offset_(cu_offset), printed_cu_header_(false),\n          printed_unpaired_header_(false),\n          uncovered_warnings_enabled_(false) { }\n    virtual ~WarningReporter() { }\n\n    // Set the name of the compilation unit we're processing to NAME.\n    virtual void SetCUName(const string &name) { cu_name_ = name; }\n\n    // Accessor and setter for uncovered_warnings_enabled_.\n    // UncoveredFunction and UncoveredLine only report a problem if that is\n    // true. By default, these warnings are disabled, because those\n    // conditions occur occasionally in healthy code.\n    virtual bool uncovered_warnings_enabled() const {\n      return uncovered_warnings_enabled_;\n    }\n    virtual void set_uncovered_warnings_enabled(bool value) {\n      uncovered_warnings_enabled_ = value;\n    }\n\n    // A DW_AT_specification in the DIE at OFFSET refers to a DIE we\n    // haven't processed yet, or that wasn't marked as a declaration,\n    // at TARGET.\n    virtual void UnknownSpecification(uint64 offset, uint64 target);\n\n    // A DW_AT_abstract_origin in the DIE at OFFSET refers to a DIE we\n    // haven't processed yet, or that wasn't marked as inline, at TARGET.\n    virtual void UnknownAbstractOrigin(uint64 offset, uint64 target);\n\n    // We were unable to find the DWARF section named SECTION_NAME.\n    virtual void MissingSection(const string &section_name);\n\n    // The CU's DW_AT_stmt_list offset OFFSET is bogus.\n    virtual void BadLineInfoOffset(uint64 offset);\n\n    // FUNCTION includes code covered by no line number data.\n    virtual void UncoveredFunction(const Module::Function &function);\n\n    // Line number NUMBER in LINE_FILE, of length LENGTH, includes code\n    // covered by no function.\n    virtual void UncoveredLine(const Module::Line &line);\n\n    // The DW_TAG_subprogram DIE at OFFSET has no name specified directly\n    // in the DIE, nor via a DW_AT_specification or DW_AT_abstract_origin\n    // link.\n    virtual void UnnamedFunction(uint64 offset);\n\n   protected:\n    string filename_;\n    uint64 cu_offset_;\n    string cu_name_;\n    bool printed_cu_header_;\n    bool printed_unpaired_header_;\n    bool uncovered_warnings_enabled_;\n\n   private:\n    // Print a per-CU heading, once.\n    void CUHeading();\n    // Print an unpaired function/line heading, once.\n    void UncoveredHeading();\n  };\n\n  // Create a DWARF debugging info handler for a compilation unit\n  // within FILE_CONTEXT. This uses information received from the\n  // dwarf2reader::CompilationUnit DWARF parser to populate\n  // FILE_CONTEXT->module. Use LINE_READER to handle the compilation\n  // unit's line number data. Use REPORTER to report problems with the\n  // data we find.\n  DwarfCUToModule(FileContext *file_context,\n                  LineToModuleFunctor *line_reader,\n                  WarningReporter *reporter);\n  ~DwarfCUToModule();\n\n  void ProcessAttributeSigned(enum DwarfAttribute attr,\n                              enum DwarfForm form,\n                              int64 data);\n  void ProcessAttributeUnsigned(enum DwarfAttribute attr,\n                                enum DwarfForm form,\n                                uint64 data);\n  void ProcessAttributeString(enum DwarfAttribute attr,\n                              enum DwarfForm form,\n                              const string &data);\n  bool EndAttributes();\n  DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag,\n                               const AttributeList &attrs);\n\n  // Assign all our source Lines to the Functions that cover their\n  // addresses, and then add them to module_.\n  void Finish();\n\n  bool StartCompilationUnit(uint64 offset, uint8 address_size,\n                            uint8 offset_size, uint64 cu_length,\n                            uint8 dwarf_version);\n  bool StartRootDIE(uint64 offset, enum DwarfTag tag,\n                    const AttributeList& attrs);\n\n private:\n\n  // Used internally by the handler. Full definitions are in\n  // dwarf_cu_to_module.cc.\n  struct FilePrivate;\n  struct Specification;\n  struct CUContext;\n  struct DIEContext;\n  class GenericDIEHandler;\n  class FuncHandler;\n  class NamedScopeHandler;\n\n  // A map from section offsets to specifications.\n  typedef map<uint64, Specification> SpecificationByOffset;\n\n  // Set this compilation unit's source language to LANGUAGE.\n  void SetLanguage(DwarfLanguage language);\n  \n  // Read source line information at OFFSET in the .debug_line\n  // section.  Record source files in module_, but record source lines\n  // in lines_; we apportion them to functions in\n  // AssignLinesToFunctions.\n  void ReadSourceLines(uint64 offset);\n\n  // Assign the lines in lines_ to the individual line lists of the\n  // functions in functions_.  (DWARF line information maps an entire\n  // compilation unit at a time, and gives no indication of which\n  // lines belong to which functions, beyond their addresses.)\n  void AssignLinesToFunctions();\n\n  // The only reason cu_context_ and child_context_ are pointers is\n  // that we want to keep their definitions private to\n  // dwarf_cu_to_module.cc, instead of listing them all here. They are\n  // owned by this DwarfCUToModule: the constructor sets them, and the\n  // destructor deletes them.\n\n  // The functor to use to handle line number data.\n  LineToModuleFunctor *line_reader_;\n\n  // This compilation unit's context.\n  CUContext *cu_context_;\n\n  // A context for our children.\n  DIEContext *child_context_;\n\n  // True if this compilation unit has source line information.\n  bool has_source_line_info_;\n\n  // The offset of this compilation unit's line number information in\n  // the .debug_line section.\n  uint64 source_line_offset_;\n\n  // The line numbers we have seen thus far.  We accumulate these here\n  // during parsing.  Then, in Finish, we call AssignLinesToFunctions\n  // to dole them out to the appropriate functions.\n  vector<Module::Line> lines_;\n};\n\n} // namespace google_breakpad\n\n#endif  // COMMON_LINUX_DWARF_CU_TO_MODULE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf_cu_to_module_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dwarf_cu_to_module.cc: Unit tests for google_breakpad::DwarfCUToModule.\n\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/dwarf_cu_to_module.h\"\n\nusing std::make_pair;\nusing std::string;\nusing std::vector;\n\nusing dwarf2reader::AttributeList;\nusing dwarf2reader::DIEHandler;\nusing dwarf2reader::DwarfTag;\nusing dwarf2reader::DwarfAttribute;\nusing dwarf2reader::DwarfForm;\nusing dwarf2reader::DwarfInline;\nusing dwarf2reader::RootDIEHandler;\nusing google_breakpad::DwarfCUToModule;\nusing google_breakpad::Module;\n\nusing ::testing::_;\nusing ::testing::AtMost;\nusing ::testing::Invoke;\nusing ::testing::Return;\nusing ::testing::Test;\nusing ::testing::TestWithParam;\nusing ::testing::Values;\nusing ::testing::ValuesIn;\n\n// Mock classes.\n\nclass MockLineToModuleFunctor: public DwarfCUToModule::LineToModuleFunctor {\n public:\n  MOCK_METHOD4(mock_apply, void(const char *program, uint64 length,\n                                Module *module, vector<Module::Line> *lines));\n  void operator()(const char *program, uint64 length,\n                  Module *module, vector<Module::Line> *lines) {\n    mock_apply(program, length, module, lines);\n  }\n};\n\nclass MockWarningReporter: public DwarfCUToModule::WarningReporter {\n public:\n  MockWarningReporter(const string &filename, uint64 cu_offset)\n      : DwarfCUToModule::WarningReporter(filename, cu_offset) { }\n  MOCK_METHOD1(SetCUName, void(const string &name));\n  MOCK_METHOD2(UnknownSpecification, void(uint64 offset, uint64 target));\n  MOCK_METHOD2(UnknownAbstractOrigin, void(uint64 offset, uint64 target));\n  MOCK_METHOD1(MissingSection, void(const string &section_name));\n  MOCK_METHOD1(BadLineInfoOffset, void(uint64 offset));\n  MOCK_METHOD1(UncoveredFunction, void(const Module::Function &function));\n  MOCK_METHOD1(UncoveredLine, void(const Module::Line &line));\n  MOCK_METHOD1(UnnamedFunction, void(uint64 offset));\n};\n\n// A fixture class including all the objects needed to handle a\n// compilation unit, and their entourage. It includes member functions\n// for doing common kinds of setup and tests.\nclass CUFixtureBase {\n public:\n\n  // If we have:\n  //\n  //   vector<Module::Line> lines;\n  //   AppendLinesFunctor appender(lines);\n  //\n  // then doing:\n  //\n  //   appender(line_program, length, module, line_vector);\n  //\n  // will append lines to the end of line_vector.  We can use this with\n  // MockLineToModuleFunctor like this:\n  //\n  //   MockLineToModuleFunctor l2m;\n  //   EXPECT_CALL(l2m, mock_apply(_,_,_,_))\n  //       .WillOnce(DoAll(Invoke(appender), Return()));\n  //\n  // in which case calling l2m with some line vector will append lines.\n  class AppendLinesFunctor {\n   public:\n    AppendLinesFunctor(const vector<Module::Line> *lines) : lines_(lines) { }\n    void operator()(const char *program, uint64 length,\n                    Module *module, vector<Module::Line> *lines) {\n      lines->insert(lines->end(), lines_->begin(), lines_->end());\n    }\n   private:\n    const vector<Module::Line> *lines_;\n  };\n\n  CUFixtureBase()\n      : module_(\"module-name\", \"module-os\", \"module-arch\", \"module-id\"),\n        file_context_(\"dwarf-filename\", &module_),\n        language_(dwarf2reader::DW_LANG_none),\n        language_signed_(false),\n        appender_(&lines_),\n        reporter_(\"dwarf-filename\", 0xcf8f9bb6443d29b5LL),\n        root_handler_(&file_context_, &line_reader_, &reporter_),\n        functions_filled_(false) {\n    // By default, expect no warnings to be reported, and expect the\n    // compilation unit's name to be provided. The test can override\n    // these expectations.\n    EXPECT_CALL(reporter_, SetCUName(\"compilation-unit-name\")).Times(1);\n    EXPECT_CALL(reporter_, UnknownSpecification(_, _)).Times(0);\n    EXPECT_CALL(reporter_, UnknownAbstractOrigin(_, _)).Times(0);\n    EXPECT_CALL(reporter_, MissingSection(_)).Times(0);\n    EXPECT_CALL(reporter_, BadLineInfoOffset(_)).Times(0);\n    EXPECT_CALL(reporter_, UncoveredFunction(_)).Times(0);\n    EXPECT_CALL(reporter_, UncoveredLine(_)).Times(0);\n    EXPECT_CALL(reporter_, UnnamedFunction(_)).Times(0);\n\n    // By default, expect the line program reader not to be invoked. We\n    // may override this in StartCU.\n    EXPECT_CALL(line_reader_, mock_apply(_,_,_,_)).Times(0);\n\n    // The handler will consult this section map to decide what to\n    // pass to our line reader.\n    file_context_.section_map[\".debug_line\"] = make_pair(dummy_line_program_,\n                                                         dummy_line_size_);\n  }\n\n  // Add a line with the given address, size, filename, and line\n  // number to the end of the statement list the handler will receive\n  // when it invokes its LineToModuleFunctor. Call this before calling\n  // StartCU.\n  void PushLine(Module::Address address, Module::Address size,\n                const string &filename, int line_number);\n\n  // Use LANGUAGE for the compilation unit. More precisely, arrange\n  // for StartCU to pass the compilation unit's root DIE a\n  // DW_AT_language attribute whose value is LANGUAGE.\n  void SetLanguage(dwarf2reader::DwarfLanguage language) {\n    language_ = language;\n  }\n\n  // If SIGNED true, have StartCU report DW_AT_language as a signed\n  // attribute; if false, have it report it as unsigned.\n  void SetLanguageSigned(bool is_signed) { language_signed_ = is_signed; }\n\n  // Call the handler this.root_handler_'s StartCompilationUnit and\n  // StartRootDIE member functions, passing it appropriate attributes as\n  // determined by prior calls to PushLine and SetLanguage. Leave\n  // this.root_handler_ ready to hear about children: call\n  // this.root_handler_.EndAttributes, but not this.root_handler_.Finish.\n  void StartCU();\n\n  // Add some strange attributes/form pairs to the end of ATTRS.\n  void PushBackStrangeAttributes(dwarf2reader::AttributeList *attrs);\n\n  // Have HANDLER process some strange attribute/form/value triples.\n  // These will match those promised by PushBackStrangeAttributes.\n  void ProcessStrangeAttributes(dwarf2reader::DIEHandler *handler);\n\n  // Start a child DIE of PARENT with the given tag and name. Leave\n  // the handler ready to hear about children: call EndAttributes, but\n  // not Finish.\n  DIEHandler *StartNamedDIE(DIEHandler *parent, DwarfTag tag,\n                            const string &name);\n \n  // Start a child DIE of PARENT with the given tag and a\n  // DW_AT_specification attribute whose value is SPECIFICATION. Leave\n  // the handler ready to hear about children: call EndAttributes, but\n  // not Finish. If NAME is non-zero, use it as the DW_AT_name\n  // attribute.\n  DIEHandler *StartSpecifiedDIE(DIEHandler *parent, DwarfTag tag,\n                                uint64 specification, const char *name = NULL);\n \n  // Define a function as a child of PARENT with the given name,\n  // address, and size. Call EndAttributes and Finish; one cannot\n  // define children of the defined function's DIE.\n  void DefineFunction(DIEHandler *parent, const string &name,\n                      Module::Address address, Module::Address size);      \n\n  // Create a declaration DIE as a child of PARENT with the given\n  // offset, tag and name. If NAME is the empty string, don't provide\n  // a DW_AT_name attribute. Call EndAttributes and Finish.\n  void DeclarationDIE(DIEHandler *parent, uint64 offset,\n                      DwarfTag tag, const string &name);\n\n  // Create a definition DIE as a child of PARENT with the given tag\n  // that refers to the declaration DIE at offset SPECIFICATION as its\n  // specification. If NAME is non-empty, pass it as the DW_AT_name\n  // attribute. If SIZE is non-zero, record ADDRESS and SIZE as\n  // low_pc/high_pc attributes.\n  void DefinitionDIE(DIEHandler *parent, DwarfTag tag,\n                     uint64 specification, const string &name,\n                     Module::Address address = 0, Module::Address size = 0);\n\n  // Create an inline DW_TAG_subprogram DIE as a child of PARENT.  If\n  // SPECIFICATION is non-zero, then the DIE refers to the declaration DIE at\n  // offset SPECIFICATION as its specification.  If Name is non-empty, pass it\n  // as the DW_AT_name attribute.\n  void AbstractInstanceDIE(DIEHandler *parent, uint64 offset,\n                           DwarfInline type, uint64 specification,\n                           const string &name,\n                           DwarfForm form = dwarf2reader::DW_FORM_data1);\n\n  // Create a DW_TAG_subprogram DIE as a child of PARENT that refers to\n  // ORIGIN in its DW_AT_abstract_origin attribute.  If NAME is the empty\n  // string, don't provide a DW_AT_name attribute.\n  void DefineInlineInstanceDIE(DIEHandler *parent, const string &name,\n                               uint64 origin, Module::Address address,\n                               Module::Address size);\n\n  // The following Test* functions should be called after calling\n  // this.root_handler_.Finish. After that point, no further calls\n  // should be made on the handler.\n\n  // Test that the number of functions defined in the module this.module_ is\n  // equal to EXPECTED.\n  void TestFunctionCount(size_t expected);\n\n  // Test that the I'th function (ordered by address) in the module\n  // this.module_ has the given name, address, and size, and that its\n  // parameter size is zero.\n  void TestFunction(int i, const string &name,\n                    Module::Address address, Module::Address size);\n  \n  // Test that the number of source lines owned by the I'th function\n  // in the module this.module_ is equal to EXPECTED.\n  void TestLineCount(int i, size_t expected);\n\n  // Test that the J'th line (ordered by address) of the I'th function\n  // (again, by address) has the given address, size, filename, and\n  // line number.\n  void TestLine(int i, int j, Module::Address address, Module::Address size,\n                const string &filename, int number);\n\n  // Actual objects under test.\n  Module module_;\n  DwarfCUToModule::FileContext file_context_;\n\n  // If this is not DW_LANG_none, we'll pass it as a DW_AT_language\n  // attribute to the compilation unit. This defaults to DW_LANG_none.\n  dwarf2reader::DwarfLanguage language_;\n\n  // If this is true, report DW_AT_language as a signed value; if false,\n  // report it as an unsigned value.\n  bool language_signed_;\n\n  // If this is not empty, we'll give the CU a DW_AT_stmt_list\n  // attribute that, when passed to line_reader_, adds these lines to the\n  // provided lines array.\n  vector<Module::Line> lines_;\n\n  // Mock line program reader.\n  MockLineToModuleFunctor line_reader_;\n  AppendLinesFunctor appender_;\n  static const char dummy_line_program_[];\n  static const size_t dummy_line_size_;\n  \n  MockWarningReporter reporter_;\n  DwarfCUToModule root_handler_;\n\n private:\n  // Fill functions_, if we haven't already.\n  void FillFunctions();\n\n  // If functions_filled_ is true, this is a table of functions we've\n  // extracted from module_, sorted by address.\n  vector<Module::Function *> functions_;\n  // True if we have filled the above vector with this.module_'s function list.\n  bool functions_filled_;\n};\n\nconst char CUFixtureBase::dummy_line_program_[] = \"lots of fun data\";\nconst size_t CUFixtureBase::dummy_line_size_ = \n    sizeof (CUFixtureBase::dummy_line_program_);\n\nvoid CUFixtureBase::PushLine(Module::Address address, Module::Address size,\n                             const string &filename, int line_number) {\n  Module::Line l;\n  l.address = address;\n  l.size = size;\n  l.file = module_.FindFile(filename);\n  l.number = line_number;\n  lines_.push_back(l);\n}\n\nvoid CUFixtureBase::StartCU() {\n  // If we have lines, make the line reader expect to be invoked at\n  // most once. (Hey, if the handler can pass its tests without\n  // bothering to read the line number data, that's great.)\n  // Have it add the lines passed to PushLine. Otherwise, leave the \n  // initial expectation (no calls) in force.\n  if (!lines_.empty())\n    EXPECT_CALL(line_reader_,\n                mock_apply(&dummy_line_program_[0], dummy_line_size_,\n                           &module_, _))\n        .Times(AtMost(1))\n        .WillOnce(DoAll(Invoke(appender_), Return()));\n\n  ASSERT_TRUE(root_handler_\n              .StartCompilationUnit(0x51182ec307610b51ULL, 0x81, 0x44,\n                                    0x4241b4f33720dd5cULL, 3));\n  {\n    dwarf2reader::AttributeList attrs;\n    attrs.push_back(make_pair(dwarf2reader::DW_AT_name,\n                              dwarf2reader::DW_FORM_strp));\n    if (!lines_.empty())\n      attrs.push_back(make_pair(dwarf2reader::DW_AT_stmt_list,\n                                dwarf2reader::DW_FORM_ref4));\n    if (language_ != dwarf2reader::DW_LANG_none)\n      attrs.push_back(make_pair(dwarf2reader::DW_AT_language,\n                                language_signed_\n                                ? dwarf2reader::DW_FORM_sdata \n                                : dwarf2reader::DW_FORM_udata));\n    ASSERT_TRUE(root_handler_.StartRootDIE(0x02e56bfbda9e7337ULL,\n                                           dwarf2reader::DW_TAG_compile_unit,\n                                           attrs));\n  }\n  root_handler_.ProcessAttributeString(dwarf2reader::DW_AT_name,\n                                       dwarf2reader::DW_FORM_strp,\n                                       \"compilation-unit-name\");\n  if (!lines_.empty())\n    root_handler_.ProcessAttributeUnsigned(dwarf2reader::DW_AT_stmt_list,\n                                           dwarf2reader::DW_FORM_ref4,\n                                           0);\n  if (language_ != dwarf2reader::DW_LANG_none) {\n    if (language_signed_)\n      root_handler_.ProcessAttributeSigned(dwarf2reader::DW_AT_language,\n                                           dwarf2reader::DW_FORM_sdata,\n                                           language_);\n    else\n      root_handler_.ProcessAttributeUnsigned(dwarf2reader::DW_AT_language,\n                                             dwarf2reader::DW_FORM_udata,\n                                             language_);\n  }\n  ASSERT_TRUE(root_handler_.EndAttributes());\n}\n\nvoid CUFixtureBase::PushBackStrangeAttributes(\n    dwarf2reader::AttributeList *attrs) {\n  attrs->push_back(make_pair((DwarfAttribute) 0xf560dead,\n                             (DwarfForm) 0x4106e4db));\n  attrs->push_back(make_pair((DwarfAttribute) 0x85380095,\n                             (DwarfForm) 0x0f16fe87));\n  attrs->push_back(make_pair((DwarfAttribute) 0xf7f7480f,\n                             (DwarfForm) 0x829e038a));\n  attrs->push_back(make_pair((DwarfAttribute) 0xa55ffb51,\n                             (DwarfForm) 0x2f43b041));\n  attrs->push_back(make_pair((DwarfAttribute) 0x2fde304a,\n                             (DwarfForm) 0x895ffa23));\n}\n\nvoid CUFixtureBase::ProcessStrangeAttributes(\n    dwarf2reader::DIEHandler *handler) {\n  handler->ProcessAttributeUnsigned((DwarfAttribute) 0xf560dead,\n                                    (DwarfForm) 0x4106e4db,\n                                    0xa592571997facda1ULL);\n  handler->ProcessAttributeSigned((DwarfAttribute) 0x85380095,\n                                  (DwarfForm) 0x0f16fe87,\n                                  0x12602a4e3bf1f446LL);\n  handler->ProcessAttributeReference((DwarfAttribute) 0xf7f7480f,\n                                     (DwarfForm) 0x829e038a,\n                                     0x50fddef44734fdecULL);\n  static const char buffer[10] = \"frobynode\";\n  handler->ProcessAttributeBuffer((DwarfAttribute) 0xa55ffb51,\n                                  (DwarfForm) 0x2f43b041,\n                                  buffer, sizeof(buffer));\n  handler->ProcessAttributeString((DwarfAttribute) 0x2f43b041,\n                                  (DwarfForm) 0x895ffa23,\n                                  \"strange string\");\n}\n\nDIEHandler *CUFixtureBase::StartNamedDIE(DIEHandler *parent,\n                                         DwarfTag tag,\n                                         const string &name) {\n  dwarf2reader::AttributeList attrs;\n  attrs.push_back(make_pair(dwarf2reader::DW_AT_name,\n                            dwarf2reader::DW_FORM_strp));\n  PushBackStrangeAttributes(&attrs);\n  dwarf2reader::DIEHandler *handler\n    = parent->FindChildHandler(0x8f4c783c0467c989ULL, tag, attrs);\n  if (!handler)\n    return NULL;\n  handler->ProcessAttributeString(dwarf2reader::DW_AT_name,\n                                  dwarf2reader::DW_FORM_strp,\n                                  name);\n  ProcessStrangeAttributes(handler);\n  if (!handler->EndAttributes()) {\n    handler->Finish();\n    delete handler;\n    return NULL;\n  }\n    \n  return handler;\n}\n\nDIEHandler *CUFixtureBase::StartSpecifiedDIE(DIEHandler *parent,\n                                             DwarfTag tag,\n                                             uint64 specification,\n                                             const char *name) {\n  dwarf2reader::AttributeList attrs;\n  if (name)\n    attrs.push_back(make_pair(dwarf2reader::DW_AT_name,\n                              dwarf2reader::DW_FORM_strp));\n  attrs.push_back(make_pair(dwarf2reader::DW_AT_specification,\n                            dwarf2reader::DW_FORM_ref4));\n  dwarf2reader::DIEHandler *handler\n    = parent->FindChildHandler(0x8f4c783c0467c989ULL, tag, attrs);\n  if (!handler)\n    return NULL;\n  if (name)\n    handler->ProcessAttributeString(dwarf2reader::DW_AT_name,\n                                    dwarf2reader::DW_FORM_strp,\n                                    name);\n  handler->ProcessAttributeReference(dwarf2reader::DW_AT_specification,\n                                     dwarf2reader::DW_FORM_ref4,\n                                     specification);\n  if (!handler->EndAttributes()) {\n    handler->Finish();\n    delete handler;\n    return NULL;\n  }\n    \n  return handler;\n}\n\nvoid CUFixtureBase::DefineFunction(dwarf2reader::DIEHandler *parent,\n                                   const string &name, Module::Address address,\n                                   Module::Address size) {\n  dwarf2reader::AttributeList func_attrs;\n  func_attrs.push_back(make_pair(dwarf2reader::DW_AT_name,\n                                 dwarf2reader::DW_FORM_strp));\n  func_attrs.push_back(make_pair(dwarf2reader::DW_AT_low_pc,\n                                 dwarf2reader::DW_FORM_addr));\n  func_attrs.push_back(make_pair(dwarf2reader::DW_AT_high_pc,\n                                 dwarf2reader::DW_FORM_addr));\n  PushBackStrangeAttributes(&func_attrs);\n  dwarf2reader::DIEHandler *func\n      = parent->FindChildHandler(0xe34797c7e68590a8LL,\n                                 dwarf2reader::DW_TAG_subprogram,\n                                 func_attrs);\n  ASSERT_TRUE(func != NULL);\n  func->ProcessAttributeString(dwarf2reader::DW_AT_name,\n                               dwarf2reader::DW_FORM_strp,\n                               name);\n  func->ProcessAttributeUnsigned(dwarf2reader::DW_AT_low_pc,\n                                 dwarf2reader::DW_FORM_addr,\n                                 address);\n  func->ProcessAttributeUnsigned(dwarf2reader::DW_AT_high_pc,\n                                 dwarf2reader::DW_FORM_addr,\n                                 address + size);\n  ProcessStrangeAttributes(func);\n  EXPECT_TRUE(func->EndAttributes());\n  func->Finish();\n  delete func;\n}\n\nvoid CUFixtureBase::DeclarationDIE(DIEHandler *parent, uint64 offset,\n                                   DwarfTag tag,\n                                   const string &name) {\n  dwarf2reader::AttributeList attrs;\n  if (!name.empty())\n    attrs.push_back(make_pair(dwarf2reader::DW_AT_name,\n                              dwarf2reader::DW_FORM_strp));\n  attrs.push_back(make_pair(dwarf2reader::DW_AT_declaration,\n                            dwarf2reader::DW_FORM_flag));\n  dwarf2reader::DIEHandler *die = parent->FindChildHandler(offset, tag, attrs);\n  ASSERT_TRUE(die != NULL);\n  if (!name.empty())\n    die->ProcessAttributeString(dwarf2reader::DW_AT_name,\n                                dwarf2reader::DW_FORM_strp,\n                                name);\n  die->ProcessAttributeUnsigned(dwarf2reader::DW_AT_declaration,\n                                dwarf2reader::DW_FORM_flag,\n                                1);\n  EXPECT_TRUE(die->EndAttributes());\n  die->Finish();\n  delete die;\n}\n\nvoid CUFixtureBase::DefinitionDIE(DIEHandler *parent,\n                                  DwarfTag tag,\n                                  uint64 specification,\n                                  const string &name,\n                                  Module::Address address,\n                                  Module::Address size) {\n  dwarf2reader::AttributeList attrs;\n  attrs.push_back(make_pair(dwarf2reader::DW_AT_specification,\n                            dwarf2reader::DW_FORM_ref4));\n  if (!name.empty())\n    attrs.push_back(make_pair(dwarf2reader::DW_AT_name,\n                              dwarf2reader::DW_FORM_strp));\n  if (size) {\n    attrs.push_back(make_pair(dwarf2reader::DW_AT_low_pc,\n                              dwarf2reader::DW_FORM_addr));\n    attrs.push_back(make_pair(dwarf2reader::DW_AT_high_pc,\n                              dwarf2reader::DW_FORM_addr));\n  }\n  dwarf2reader::DIEHandler *die\n    = parent->FindChildHandler(0x6ccfea031a9e6cc9ULL, tag, attrs);\n  ASSERT_TRUE(die != NULL);\n  die->ProcessAttributeReference(dwarf2reader::DW_AT_specification,\n                                 dwarf2reader::DW_FORM_ref4,\n                                 specification);\n  if (!name.empty())\n    die->ProcessAttributeString(dwarf2reader::DW_AT_name,\n                                dwarf2reader::DW_FORM_strp,\n                                name);\n  if (size) {\n    die->ProcessAttributeUnsigned(dwarf2reader::DW_AT_low_pc,\n                                  dwarf2reader::DW_FORM_addr,\n                                  address);\n    die->ProcessAttributeUnsigned(dwarf2reader::DW_AT_high_pc,\n                                  dwarf2reader::DW_FORM_addr,\n                                  address + size);\n  }\n  EXPECT_TRUE(die->EndAttributes());\n  die->Finish();\n  delete die;\n}\n\nvoid CUFixtureBase::AbstractInstanceDIE(DIEHandler *parent,\n                                        uint64 offset,\n                                        DwarfInline type,\n                                        uint64 specification,\n                                        const string &name,\n                                        DwarfForm form) {\n  dwarf2reader::AttributeList attrs;\n  if (specification != 0ULL)\n    attrs.push_back(make_pair(dwarf2reader::DW_AT_specification,\n                              dwarf2reader::DW_FORM_ref4));\n  attrs.push_back(make_pair(dwarf2reader::DW_AT_inline, form));\n  if (!name.empty())\n    attrs.push_back(make_pair(dwarf2reader::DW_AT_name,\n                              dwarf2reader::DW_FORM_strp));\n  dwarf2reader::DIEHandler *die\n    = parent->FindChildHandler(offset, dwarf2reader::DW_TAG_subprogram, attrs);\n  ASSERT_TRUE(die != NULL);\n  if (specification != 0ULL)\n    die->ProcessAttributeReference(dwarf2reader::DW_AT_specification,\n                                   dwarf2reader::DW_FORM_ref4,\n                                   specification);\n  if (form == dwarf2reader::DW_FORM_sdata) {\n    die->ProcessAttributeSigned(dwarf2reader::DW_AT_inline, form, type);\n  } else {\n    die->ProcessAttributeUnsigned(dwarf2reader::DW_AT_inline, form, type);\n  }\n  if (!name.empty())\n    die->ProcessAttributeString(dwarf2reader::DW_AT_name,\n                                dwarf2reader::DW_FORM_strp,\n                                name);\n\n  EXPECT_TRUE(die->EndAttributes());\n  die->Finish();\n  delete die;\n}\n\nvoid CUFixtureBase::DefineInlineInstanceDIE(DIEHandler *parent,\n                                            const string &name,\n                                            uint64 origin, \n                                            Module::Address address,\n                                            Module::Address size) {\n  dwarf2reader::AttributeList func_attrs;\n  if (!name.empty())\n    func_attrs.push_back(make_pair(dwarf2reader::DW_AT_name,\n                                   dwarf2reader::DW_FORM_strp));\n  func_attrs.push_back(make_pair(dwarf2reader::DW_AT_low_pc,\n                                 dwarf2reader::DW_FORM_addr));\n  func_attrs.push_back(make_pair(dwarf2reader::DW_AT_high_pc,\n                                 dwarf2reader::DW_FORM_addr));\n  func_attrs.push_back(make_pair(dwarf2reader::DW_AT_abstract_origin,\n                                 dwarf2reader::DW_FORM_ref4));\n  PushBackStrangeAttributes(&func_attrs);\n  dwarf2reader::DIEHandler *func\n      = parent->FindChildHandler(0x11c70f94c6e87ccdLL,\n                                 dwarf2reader::DW_TAG_subprogram,\n                                 func_attrs);\n  ASSERT_TRUE(func != NULL);\n  if (!name.empty()) {\n    func->ProcessAttributeString(dwarf2reader::DW_AT_name,\n                                 dwarf2reader::DW_FORM_strp,\n                                 name);\n  }\n  func->ProcessAttributeUnsigned(dwarf2reader::DW_AT_low_pc,\n                                 dwarf2reader::DW_FORM_addr,\n                                 address);\n  func->ProcessAttributeUnsigned(dwarf2reader::DW_AT_high_pc,\n                                 dwarf2reader::DW_FORM_addr,\n                                 address + size);\n  func->ProcessAttributeReference(dwarf2reader::DW_AT_abstract_origin,\n                                 dwarf2reader::DW_FORM_ref4,\n                                 origin);\n  ProcessStrangeAttributes(func);\n  EXPECT_TRUE(func->EndAttributes());\n  func->Finish();\n  delete func;\n}\n\nvoid CUFixtureBase::FillFunctions() {\n  if (functions_filled_)\n    return;\n  module_.GetFunctions(&functions_, functions_.end());\n  sort(functions_.begin(), functions_.end(),\n       Module::Function::CompareByAddress);\n  functions_filled_ = true;\n}\n\nvoid CUFixtureBase::TestFunctionCount(size_t expected) {\n  FillFunctions();\n  ASSERT_EQ(expected, functions_.size());\n}\n\nvoid CUFixtureBase::TestFunction(int i, const string &name,\n                                 Module::Address address,\n                                 Module::Address size) {\n  FillFunctions();\n  ASSERT_LT((size_t) i, functions_.size());\n\n  Module::Function *function = functions_[i];\n  EXPECT_EQ(name,    function->name);\n  EXPECT_EQ(address, function->address);\n  EXPECT_EQ(size,    function->size);\n  EXPECT_EQ(0U,      function->parameter_size);\n}\n\nvoid CUFixtureBase::TestLineCount(int i, size_t expected) {\n  FillFunctions();\n  ASSERT_LT((size_t) i, functions_.size());\n\n  ASSERT_EQ(expected, functions_[i]->lines.size());\n}\n\nvoid CUFixtureBase::TestLine(int i, int j,\n                             Module::Address address, Module::Address size,\n                             const string &filename, int number) {\n  FillFunctions();\n  ASSERT_LT((size_t) i, functions_.size());\n  ASSERT_LT((size_t) j, functions_[i]->lines.size());\n\n  Module::Line *line = &functions_[i]->lines[j];\n  EXPECT_EQ(address,  line->address);\n  EXPECT_EQ(size,     line->size);\n  EXPECT_EQ(filename, line->file->name.c_str());\n  EXPECT_EQ(number,   line->number);\n}\n\n// Include caller locations for our test subroutines.\n#define TRACE(call) do { SCOPED_TRACE(\"called from here\"); call; } while (0)\n#define PushLine(a,b,c,d)          TRACE(PushLine((a),(b),(c),(d)))\n#define SetLanguage(a)             TRACE(SetLanguage(a))\n#define StartCU()                  TRACE(StartCU())\n#define DefineFunction(a,b,c,d)    TRACE(DefineFunction((a),(b),(c),(d)))\n#define DeclarationDIE(a,b,c,d)    TRACE(DeclarationDIE((a),(b),(c),(d)))\n#define DefinitionDIE(a,b,c,d,e,f) TRACE(DefinitionDIE((a),(b),(c),(d),(e),(f)))\n#define TestFunctionCount(a)       TRACE(TestFunctionCount(a))\n#define TestFunction(a,b,c,d)      TRACE(TestFunction((a),(b),(c),(d)))\n#define TestLineCount(a,b)         TRACE(TestLineCount((a),(b)))\n#define TestLine(a,b,c,d,e,f)      TRACE(TestLine((a),(b),(c),(d),(e),(f)))\n\nclass SimpleCU: public CUFixtureBase, public Test {\n};\n\nTEST_F(SimpleCU, OneFunc) {\n  PushLine(0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, \"line-file\", 246571772);\n\n  StartCU();\n  DefineFunction(&root_handler_, \"function1\",\n                 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL);\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"function1\", 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL);\n  TestLineCount(0, 1);\n  TestLine(0, 0, 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, \"line-file\",\n           246571772);\n}\n\nTEST_F(SimpleCU, IrrelevantRootChildren) {\n  StartCU();\n  dwarf2reader::AttributeList no_attrs;\n  EXPECT_FALSE(root_handler_\n               .FindChildHandler(0x7db32bff4e2dcfb1ULL,\n                                 dwarf2reader::DW_TAG_lexical_block, no_attrs));\n}\n\nTEST_F(SimpleCU, IrrelevantNamedScopeChildren) {\n  StartCU();\n  dwarf2reader::AttributeList no_attrs;\n  DIEHandler *class_A_handler\n    = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type, \"class_A\");\n  EXPECT_TRUE(class_A_handler != NULL);\n  EXPECT_FALSE(class_A_handler\n               ->FindChildHandler(0x02e55999b865e4e9ULL,\n                                  dwarf2reader::DW_TAG_lexical_block, \n                                  no_attrs));\n  delete class_A_handler;\n}\n\n// Verify that FileContexts can safely be deleted unused.\nTEST_F(SimpleCU, UnusedFileContext) {\n  Module m(\"module-name\", \"module-os\", \"module-arch\", \"module-id\");\n  DwarfCUToModule::FileContext fc(\"dwarf-filename\", &m);\n\n  // Kludge: satisfy reporter_'s expectation.\n  reporter_.SetCUName(\"compilation-unit-name\");\n}\n\nTEST_F(SimpleCU, InlineFunction) {\n  PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, \"line-file\", 75173118);\n\n  StartCU();\n  AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL,\n                      dwarf2reader::DW_INL_inlined, 0, \"inline-name\");\n  DefineInlineInstanceDIE(&root_handler_, \"\", 0x1e8dac5d507ed7abULL,\n                       0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"inline-name\",\n               0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);\n}\n\nTEST_F(SimpleCU, InlineFunctionSignedAttribute) {\n  PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, \"line-file\", 75173118);\n\n  StartCU();\n  AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL,\n                      dwarf2reader::DW_INL_inlined, 0, \"inline-name\",\n                      dwarf2reader::DW_FORM_sdata);\n  DefineInlineInstanceDIE(&root_handler_, \"\", 0x1e8dac5d507ed7abULL,\n                       0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"inline-name\",\n               0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);\n}\n\n// Any DIE with an DW_AT_inline attribute can be cited by\n// DW_AT_abstract_origin attributes --- even if the value of the\n// DW_AT_inline attribute is DW_INL_not_inlined.\nTEST_F(SimpleCU, AbstractOriginNotInlined) {\n  PushLine(0x2805c4531be6ca0eULL, 0x686b52155a8d4d2cULL, \"line-file\", 6111581);\n\n  StartCU();\n  AbstractInstanceDIE(&root_handler_, 0x93e9cdad52826b39ULL,\n                      dwarf2reader::DW_INL_not_inlined, 0, \"abstract-instance\");\n  DefineInlineInstanceDIE(&root_handler_, \"\", 0x93e9cdad52826b39ULL,\n                          0x2805c4531be6ca0eULL, 0x686b52155a8d4d2cULL);\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"abstract-instance\",\n               0x2805c4531be6ca0eULL, 0x686b52155a8d4d2cULL);\n}\n\nTEST_F(SimpleCU, UnknownAbstractOrigin) {\n  EXPECT_CALL(reporter_, UnknownAbstractOrigin(_, 1ULL)).WillOnce(Return());\n  EXPECT_CALL(reporter_, UnnamedFunction(0x11c70f94c6e87ccdLL))\n    .WillOnce(Return());\n  PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, \"line-file\", 75173118);\n\n  StartCU();\n  AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL,\n                      dwarf2reader::DW_INL_inlined, 0, \"inline-name\");\n  DefineInlineInstanceDIE(&root_handler_, \"\", 1ULL,\n                       0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"<name omitted>\",\n               0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);\n}\n\nTEST_F(SimpleCU, UnnamedFunction) {\n  EXPECT_CALL(reporter_, UnnamedFunction(0xe34797c7e68590a8LL))\n    .WillOnce(Return());\n  PushLine(0x72b80e41a0ac1d40ULL, 0x537174f231ee181cULL, \"line-file\", 14044850);\n\n  StartCU();\n  DefineFunction(&root_handler_, \"\",\n                 0x72b80e41a0ac1d40ULL, 0x537174f231ee181cULL);\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"<name omitted>\",\n               0x72b80e41a0ac1d40ULL, 0x537174f231ee181cULL);\n}\n\n// An address range.\nstruct Range {\n  Module::Address start, end;\n};\n\n// Test data for pairing functions and lines.\nstruct Situation {\n  // Two function intervals, and two line intervals.\n  Range functions[2], lines[2];\n\n  // The number of lines we expect to be assigned to each of the\n  // functions, and the address ranges.\n  int paired_count[2];\n  Range paired[2][2];\n\n  // The number of functions that are not entirely covered by lines,\n  // and vice versa.\n  int uncovered_functions, uncovered_lines;\n};\n\n#define PAIRING(func1_start, func1_end, func2_start, func2_end, \\\n                line1_start, line1_end, line2_start, line2_end, \\\n                func1_num_lines, func2_num_lines,               \\\n                func1_line1_start, func1_line1_end,             \\\n                func1_line2_start, func1_line2_end,             \\\n                func2_line1_start, func2_line1_end,             \\\n                func2_line2_start, func2_line2_end,             \\\n                uncovered_functions, uncovered_lines)           \\\n  { { { func1_start, func1_end }, { func2_start, func2_end } }, \\\n    { { line1_start, line1_end }, { line2_start, line2_end } }, \\\n    { func1_num_lines, func2_num_lines },                       \\\n    { { { func1_line1_start, func1_line1_end },                 \\\n        { func1_line2_start, func1_line2_end } },               \\\n      { { func2_line1_start, func2_line1_end },                 \\\n          { func2_line2_start, func2_line2_end } } },           \\\n    uncovered_functions, uncovered_lines },\n\nSituation situations[] = {\n#include \"common/testdata/func-line-pairing.h\"\n};\n\n#undef PAIRING\n\nclass FuncLinePairing: public CUFixtureBase,\n                       public TestWithParam<Situation> { };\n\nINSTANTIATE_TEST_CASE_P(AllSituations, FuncLinePairing,\n                        ValuesIn(situations));\n\nTEST_P(FuncLinePairing, Pairing) {\n  const Situation &s = GetParam();\n  PushLine(s.lines[0].start,\n           s.lines[0].end - s.lines[0].start,\n           \"line-file\", 67636963);\n  PushLine(s.lines[1].start,\n           s.lines[1].end - s.lines[1].start,\n           \"line-file\", 67636963);\n  if (s.uncovered_functions)\n    EXPECT_CALL(reporter_, UncoveredFunction(_))\n      .Times(s.uncovered_functions)\n      .WillRepeatedly(Return());\n  if (s.uncovered_lines)\n    EXPECT_CALL(reporter_, UncoveredLine(_))\n      .Times(s.uncovered_lines)\n      .WillRepeatedly(Return());\n\n  StartCU();\n  DefineFunction(&root_handler_, \"function1\",\n                 s.functions[0].start, \n                 s.functions[0].end - s.functions[0].start);\n  DefineFunction(&root_handler_, \"function2\",\n                 s.functions[1].start, \n                 s.functions[1].end - s.functions[1].start);\n  root_handler_.Finish();\n\n  TestFunctionCount(2);\n  TestFunction(0, \"function1\",\n               s.functions[0].start, \n               s.functions[0].end - s.functions[0].start);\n  TestLineCount(0, s.paired_count[0]);\n  for (int i = 0; i < s.paired_count[0]; i++)\n    TestLine(0, i, s.paired[0][i].start, \n             s.paired[0][i].end - s.paired[0][i].start, \n             \"line-file\", 67636963);\n  TestFunction(1, \"function2\",\n               s.functions[1].start, \n               s.functions[1].end - s.functions[1].start);\n  TestLineCount(1, s.paired_count[1]);\n  for (int i = 0; i < s.paired_count[1]; i++)\n    TestLine(1, i, s.paired[1][i].start, \n             s.paired[1][i].end - s.paired[1][i].start, \n             \"line-file\", 67636963);\n}\n\nTEST_F(FuncLinePairing, EmptyCU) {\n\n  StartCU();\n  root_handler_.Finish();\n\n  TestFunctionCount(0);\n}\n\nTEST_F(FuncLinePairing, LinesNoFuncs) {\n  PushLine(40, 2, \"line-file\", 82485646);\n  EXPECT_CALL(reporter_, UncoveredLine(_)).WillOnce(Return());\n\n  StartCU();\n  root_handler_.Finish();\n\n  TestFunctionCount(0);\n}\n\nTEST_F(FuncLinePairing, FuncsNoLines) {\n  EXPECT_CALL(reporter_, UncoveredFunction(_)).WillOnce(Return());\n\n  StartCU();\n  DefineFunction(&root_handler_, \"function1\", 0x127da12ffcf5c51fULL, 0x1000U);\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"function1\", 0x127da12ffcf5c51fULL, 0x1000U);\n}\n\nTEST_F(FuncLinePairing, GapThenFunction) {\n  PushLine(20, 2, \"line-file-2\", 174314698);\n  PushLine(10, 2, \"line-file-1\", 263008005);\n\n  StartCU();\n  DefineFunction(&root_handler_, \"function1\", 10, 2);\n  DefineFunction(&root_handler_, \"function2\", 20, 2);\n  root_handler_.Finish();\n\n  TestFunctionCount(2);\n  TestFunction(0, \"function1\", 10, 2);\n  TestLineCount(0, 1);\n  TestLine(0, 0, 10, 2, \"line-file-1\", 263008005);\n  TestFunction(1, \"function2\", 20, 2);\n  TestLineCount(1, 1);\n  TestLine(1, 0, 20, 2, \"line-file-2\", 174314698);\n}\n\n// If GCC emits padding after one function to align the start of\n// the next, then it will attribute the padding instructions to\n// the last source line of function (to reduce the size of the\n// line number info), but omit it from the DW_AT_{low,high}_pc\n// range given in .debug_info (since it costs nothing to be\n// precise there).  If we did use at least some of the line\n// we're about to skip, then assume this is what happened, and\n// don't warn.\nTEST_F(FuncLinePairing, GCCAlignmentStretch) {\n  PushLine(10, 10, \"line-file\", 63351048);\n  PushLine(20, 10, \"line-file\", 61661044);\n\n  StartCU();\n  DefineFunction(&root_handler_, \"function1\", 10, 5);\n  // five-byte gap between functions, covered by line 63351048.\n  // This should not elicit a warning.\n  DefineFunction(&root_handler_, \"function2\", 20, 10);\n  root_handler_.Finish();\n\n  TestFunctionCount(2);\n  TestFunction(0, \"function1\", 10, 5);\n  TestLineCount(0, 1);\n  TestLine(0, 0, 10, 5, \"line-file\", 63351048);\n  TestFunction(1, \"function2\", 20, 10);\n  TestLineCount(1, 1);\n  TestLine(1, 0, 20, 10, \"line-file\", 61661044);\n}\n\n// Unfortunately, neither the DWARF parser's handler interface nor the\n// DIEHandler interface is capable of expressing a function that abuts\n// the end of the address space: the high_pc value looks like zero.\n\nTEST_F(FuncLinePairing, LineAtEndOfAddressSpace) {\n  PushLine(0xfffffffffffffff0ULL, 16, \"line-file\", 63351048);\n  EXPECT_CALL(reporter_, UncoveredLine(_)).WillOnce(Return());\n\n  StartCU();\n  DefineFunction(&root_handler_, \"function1\", 0xfffffffffffffff0ULL, 6);\n  DefineFunction(&root_handler_, \"function2\", 0xfffffffffffffffaULL, 5);\n  root_handler_.Finish();\n\n  TestFunctionCount(2);\n  TestFunction(0, \"function1\", 0xfffffffffffffff0ULL, 6);\n  TestLineCount(0, 1);\n  TestLine(0, 0, 0xfffffffffffffff0ULL, 6, \"line-file\", 63351048);\n  TestFunction(1, \"function2\", 0xfffffffffffffffaULL, 5);\n  TestLineCount(1, 1);\n  TestLine(1, 0, 0xfffffffffffffffaULL, 5, \"line-file\", 63351048);\n}\n\n// A function with more than one uncovered area should only be warned\n// about once.\nTEST_F(FuncLinePairing, WarnOnceFunc) {\n  PushLine(20, 1, \"line-file-2\", 262951329);\n  PushLine(11, 1, \"line-file-1\", 219964021);\n  EXPECT_CALL(reporter_, UncoveredFunction(_)).WillOnce(Return());\n\n  StartCU();\n  DefineFunction(&root_handler_, \"function\", 10, 11);\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"function\", 10, 11);\n  TestLineCount(0, 2);\n  TestLine(0, 0, 11, 1, \"line-file-1\", 219964021);\n  TestLine(0, 1, 20, 1, \"line-file-2\", 262951329);\n}\n\n// A line with more than one uncovered area should only be warned\n// about once.\nTEST_F(FuncLinePairing, WarnOnceLine) {\n  PushLine(10, 20, \"filename1\", 118581871);\n  EXPECT_CALL(reporter_, UncoveredLine(_)).WillOnce(Return());\n\n  StartCU();\n  DefineFunction(&root_handler_, \"function1\", 11, 1);\n  DefineFunction(&root_handler_, \"function2\", 13, 1);\n  root_handler_.Finish();\n\n  TestFunctionCount(2);\n  TestFunction(0, \"function1\", 11, 1);\n  TestLineCount(0, 1);\n  TestLine(0, 0, 11, 1, \"filename1\", 118581871);\n  TestFunction(1, \"function2\", 13, 1);\n  TestLineCount(1, 1);\n  TestLine(1, 0, 13, 1, \"filename1\", 118581871);\n}\n\nclass CXXQualifiedNames: public CUFixtureBase,\n                         public TestWithParam<DwarfTag> { };\n\nINSTANTIATE_TEST_CASE_P(VersusEnclosures, CXXQualifiedNames,\n                        Values(dwarf2reader::DW_TAG_class_type,\n                               dwarf2reader::DW_TAG_structure_type,\n                               dwarf2reader::DW_TAG_union_type,\n                               dwarf2reader::DW_TAG_namespace));\n\nTEST_P(CXXQualifiedNames, TwoFunctions) {\n  DwarfTag tag = GetParam();\n\n  SetLanguage(dwarf2reader::DW_LANG_C_plus_plus);\n  PushLine(10, 1, \"filename1\", 69819327);\n  PushLine(20, 1, \"filename2\", 95115701);\n\n  StartCU();\n  DIEHandler *enclosure_handler = StartNamedDIE(&root_handler_, tag,\n                                                \"Enclosure\");\n  EXPECT_TRUE(enclosure_handler != NULL);\n  DefineFunction(enclosure_handler, \"func_B\", 10, 1);\n  DefineFunction(enclosure_handler, \"func_C\", 20, 1);\n  enclosure_handler->Finish();\n  delete enclosure_handler;\n  root_handler_.Finish();\n\n  TestFunctionCount(2);\n  TestFunction(0, \"Enclosure::func_B\", 10, 1);\n  TestFunction(1, \"Enclosure::func_C\", 20, 1);\n}\n\nTEST_P(CXXQualifiedNames, FuncInEnclosureInNamespace) {\n  DwarfTag tag = GetParam();\n\n  SetLanguage(dwarf2reader::DW_LANG_C_plus_plus);\n  PushLine(10, 1, \"line-file\", 69819327);\n\n  StartCU();\n  DIEHandler *namespace_handler \n      = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_namespace,\n                      \"Namespace\");\n  EXPECT_TRUE(namespace_handler != NULL);\n  DIEHandler *enclosure_handler = StartNamedDIE(namespace_handler, tag, \n                                                \"Enclosure\");\n  EXPECT_TRUE(enclosure_handler != NULL);\n  DefineFunction(enclosure_handler, \"function\", 10, 1);\n  enclosure_handler->Finish();\n  delete enclosure_handler;\n  namespace_handler->Finish();\n  delete namespace_handler;\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"Namespace::Enclosure::function\", 10, 1);\n}\n\nTEST_F(CXXQualifiedNames, FunctionInClassInStructInNamespace) {\n  SetLanguage(dwarf2reader::DW_LANG_C_plus_plus);\n  PushLine(10, 1, \"filename1\", 69819327);\n\n  StartCU();\n  DIEHandler *namespace_handler\n      = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_namespace,\n                      \"namespace_A\");\n  EXPECT_TRUE(namespace_handler != NULL);\n  DIEHandler *struct_handler\n      = StartNamedDIE(namespace_handler, dwarf2reader::DW_TAG_structure_type,\n                      \"struct_B\");\n  EXPECT_TRUE(struct_handler != NULL);\n  DIEHandler *class_handler\n      = StartNamedDIE(struct_handler, dwarf2reader::DW_TAG_class_type,\n                      \"class_C\");\n  DefineFunction(class_handler, \"function_D\", 10, 1);\n  class_handler->Finish();\n  delete class_handler;\n  struct_handler->Finish();\n  delete struct_handler;\n  namespace_handler->Finish();\n  delete namespace_handler;\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"namespace_A::struct_B::class_C::function_D\", 10, 1);\n}\n\nstruct LanguageAndQualifiedName {\n  dwarf2reader::DwarfLanguage language;\n  const char *name;\n};\n\nconst LanguageAndQualifiedName LanguageAndQualifiedNameCases[] = {\n  { dwarf2reader::DW_LANG_none,           \"class_A::function_B\" },\n  { dwarf2reader::DW_LANG_C,              \"class_A::function_B\" },\n  { dwarf2reader::DW_LANG_C89,            \"class_A::function_B\" },\n  { dwarf2reader::DW_LANG_C99,            \"class_A::function_B\" },\n  { dwarf2reader::DW_LANG_C_plus_plus,    \"class_A::function_B\" },\n  { dwarf2reader::DW_LANG_Java,           \"class_A.function_B\" },\n  { dwarf2reader::DW_LANG_Cobol74,        \"class_A::function_B\" },\n  { dwarf2reader::DW_LANG_Mips_Assembler, NULL }\n};\n\nclass QualifiedForLanguage:\n    public CUFixtureBase,\n    public TestWithParam<LanguageAndQualifiedName> { };\n                        \nINSTANTIATE_TEST_CASE_P(LanguageAndQualifiedName, QualifiedForLanguage,\n                        ValuesIn(LanguageAndQualifiedNameCases));\n\nTEST_P(QualifiedForLanguage, MemberFunction) {\n  const LanguageAndQualifiedName &param = GetParam();\n\n  PushLine(10, 1, \"line-file\", 212966758);\n  SetLanguage(param.language);\n\n  StartCU();\n  DIEHandler *class_handler\n      = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,\n                      \"class_A\");\n  DefineFunction(class_handler, \"function_B\", 10, 1);\n  class_handler->Finish();\n  delete class_handler;\n  root_handler_.Finish();\n\n  if (param.name) {\n    TestFunctionCount(1);\n    TestFunction(0, param.name, 10, 1);\n  } else {\n    TestFunctionCount(0);\n  }\n}\n\nTEST_P(QualifiedForLanguage, MemberFunctionSignedLanguage) {\n  const LanguageAndQualifiedName &param = GetParam();\n\n  PushLine(10, 1, \"line-file\", 212966758);\n  SetLanguage(param.language);\n  SetLanguageSigned(true);\n\n  StartCU();\n  DIEHandler *class_handler\n      = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,\n                      \"class_A\");\n  DefineFunction(class_handler, \"function_B\", 10, 1);\n  class_handler->Finish();\n  delete class_handler;\n  root_handler_.Finish();\n\n  if (param.name) {\n    TestFunctionCount(1);\n    TestFunction(0, param.name, 10, 1);\n  } else {\n    TestFunctionCount(0);\n  }\n}\n\nclass Specifications: public CUFixtureBase, public Test { };\n\nTEST_F(Specifications, Function) {\n  PushLine(0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL, \"line-file\", 54883661);\n\n  StartCU();\n  DeclarationDIE(&root_handler_, 0xcd3c51b946fb1eeeLL,\n                 dwarf2reader::DW_TAG_subprogram, \"declaration-name\");\n  DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,\n                0xcd3c51b946fb1eeeLL, \"\",\n                0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL);\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"declaration-name\",\n               0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL);\n}\n\nTEST_F(Specifications, MemberFunction) {\n  PushLine(0x3341a248634e7170ULL, 0x5f6938ee5553b953ULL, \"line-file\", 18116691);\n\n  StartCU();\n  DIEHandler *class_handler\n    = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type, \"class_A\");\n  DeclarationDIE(class_handler, 0x7d83028c431406e8ULL,\n                 dwarf2reader::DW_TAG_subprogram, \"declaration-name\");\n  class_handler->Finish();\n  delete class_handler;\n  DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,\n                0x7d83028c431406e8ULL, \"\",\n                0x3341a248634e7170ULL, 0x5f6938ee5553b953ULL);\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"class_A::declaration-name\",\n               0x3341a248634e7170ULL, 0x5f6938ee5553b953ULL);\n}\n\n// This case should gather the name from both the definition and the\n// declaration's parent.\nTEST_F(Specifications, FunctionDeclarationParent) {\n  PushLine(0x463c9ddf405be227ULL, 0x6a47774af5049680ULL, \"line-file\", 70254922);\n\n  StartCU();\n  {\n    DIEHandler *class_handler\n      = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,\n                      \"class_A\");\n    ASSERT_TRUE(class_handler != NULL);\n    DeclarationDIE(class_handler, 0x0e0e877c8404544aULL,\n                   dwarf2reader::DW_TAG_subprogram, \"declaration-name\");\n    class_handler->Finish();\n    delete class_handler;\n  }\n\n  DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,\n                0x0e0e877c8404544aULL, \"definition-name\", \n                0x463c9ddf405be227ULL, 0x6a47774af5049680ULL);\n\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"class_A::definition-name\",\n               0x463c9ddf405be227ULL, 0x6a47774af5049680ULL);\n}\n\n// Named scopes should also gather enclosing name components from\n// their declarations.\nTEST_F(Specifications, NamedScopeDeclarationParent) {\n  PushLine(0x5d13433d0df13d00ULL, 0x48ebebe5ade2cab4ULL, \"line-file\", 77392604);\n\n  StartCU();\n  {\n    DIEHandler *space_handler\n      = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_namespace,\n                      \"space_A\");\n    ASSERT_TRUE(space_handler != NULL);\n    DeclarationDIE(space_handler, 0x419bb1d12f9a73a2ULL,\n                   dwarf2reader::DW_TAG_class_type, \"class-declaration-name\");\n    space_handler->Finish();\n    delete space_handler;\n  }\n\n  {\n    DIEHandler *class_handler\n      = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,\n                          0x419bb1d12f9a73a2ULL, \"class-definition-name\");\n    ASSERT_TRUE(class_handler != NULL);\n    DefineFunction(class_handler, \"function\", \n                   0x5d13433d0df13d00ULL, 0x48ebebe5ade2cab4ULL);\n    class_handler->Finish();\n    delete class_handler;\n  }\n\n  root_handler_.Finish();\n  \n  TestFunctionCount(1);\n  TestFunction(0, \"space_A::class-definition-name::function\",\n               0x5d13433d0df13d00ULL, 0x48ebebe5ade2cab4ULL);\n}\n\n// This test recreates bug 364.\nTEST_F(Specifications, InlineFunction) {\n  PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, \"line-file\", 75173118);\n\n  StartCU();\n  DeclarationDIE(&root_handler_, 0xcd3c51b946fb1eeeLL,\n                 dwarf2reader::DW_TAG_subprogram, \"inline-name\");\n  AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL,\n                      dwarf2reader::DW_INL_inlined, 0xcd3c51b946fb1eeeLL, \"\");\n  DefineInlineInstanceDIE(&root_handler_, \"\", 0x1e8dac5d507ed7abULL,\n                       0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"inline-name\",\n               0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);\n}\n\n// Check name construction for a long chain containing each combination of:\n// - struct, union, class, namespace\n// - direct and definition\nTEST_F(Specifications, LongChain) {\n  PushLine(0x5a0dd6bb85db754cULL, 0x3bccb213d08c7fd3ULL, \"line-file\", 21192926);\n  SetLanguage(dwarf2reader::DW_LANG_C_plus_plus);\n\n  StartCU();\n  // The structure we're building here is:\n  // space_A full definition\n  //   space_B declaration\n  // space_B definition\n  //   struct_C full definition\n  //     struct_D declaration\n  // struct_D definition\n  //   union_E full definition\n  //     union_F declaration\n  // union_F definition\n  //   class_G full definition\n  //     class_H declaration\n  // class_H definition\n  //   func_I declaration\n  // func_I definition\n  // \n  // So: \n  // - space_A, struct_C, union_E, and class_G don't use specifications;\n  // - space_B, struct_D, union_F, and class_H do.\n  // - func_I uses a specification.\n  // \n  // The full name for func_I is thus:\n  // \n  // space_A::space_B::struct_C::struct_D::union_E::union_F::\n  //   class_G::class_H::func_I\n  {\n    DIEHandler *space_A_handler\n      = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_namespace,\n                      \"space_A\");\n    DeclarationDIE(space_A_handler, 0x2e111126496596e2ULL,\n                   dwarf2reader::DW_TAG_namespace, \"space_B\");\n    space_A_handler->Finish();\n    delete space_A_handler;\n  }\n\n  {\n    DIEHandler *space_B_handler\n      = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_namespace,\n                          0x2e111126496596e2ULL);\n    DIEHandler *struct_C_handler\n      = StartNamedDIE(space_B_handler, dwarf2reader::DW_TAG_structure_type,\n                      \"struct_C\");\n    DeclarationDIE(struct_C_handler, 0x20cd423bf2a25a4cULL,\n                   dwarf2reader::DW_TAG_structure_type, \"struct_D\");\n    struct_C_handler->Finish();\n    delete struct_C_handler;\n    space_B_handler->Finish();\n    delete space_B_handler;\n  }\n\n  {\n    DIEHandler *struct_D_handler\n      = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_structure_type,\n                          0x20cd423bf2a25a4cULL);\n    DIEHandler *union_E_handler\n      = StartNamedDIE(struct_D_handler, dwarf2reader::DW_TAG_union_type,\n                      \"union_E\");\n    DeclarationDIE(union_E_handler, 0xe25c84805aa58c32ULL,\n                   dwarf2reader::DW_TAG_union_type, \"union_F\");\n    union_E_handler->Finish();\n    delete union_E_handler;\n    struct_D_handler->Finish();\n    delete struct_D_handler;\n  }\n\n  {\n    DIEHandler *union_F_handler\n      = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_union_type,\n                          0xe25c84805aa58c32ULL);\n    DIEHandler *class_G_handler\n      = StartNamedDIE(union_F_handler, dwarf2reader::DW_TAG_class_type,\n                      \"class_G\");\n    DeclarationDIE(class_G_handler, 0xb70d960dcc173b6eULL,\n                   dwarf2reader::DW_TAG_class_type, \"class_H\");\n    class_G_handler->Finish();\n    delete class_G_handler;\n    union_F_handler->Finish();\n    delete union_F_handler;\n  }\n\n  {\n    DIEHandler *class_H_handler\n      = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,\n                          0xb70d960dcc173b6eULL);\n    DeclarationDIE(class_H_handler, 0x27ff829e3bf69f37ULL,\n                   dwarf2reader::DW_TAG_subprogram, \"func_I\");\n    class_H_handler->Finish();\n    delete class_H_handler;\n  }\n\n  DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,\n                0x27ff829e3bf69f37ULL, \"\",\n                0x5a0dd6bb85db754cULL, 0x3bccb213d08c7fd3ULL);\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"space_A::space_B::struct_C::struct_D::union_E::union_F\"\n               \"::class_G::class_H::func_I\",\n               0x5a0dd6bb85db754cULL, 0x3bccb213d08c7fd3ULL);\n}\n\nTEST_F(Specifications, InterCU) {\n  Module m(\"module-name\", \"module-os\", \"module-arch\", \"module-id\");\n  DwarfCUToModule::FileContext fc(\"dwarf-filename\", &m);\n  EXPECT_CALL(reporter_, UncoveredFunction(_)).WillOnce(Return());\n  MockLineToModuleFunctor lr;\n  EXPECT_CALL(lr, mock_apply(_,_,_,_)).Times(0);\n  dwarf2reader::AttributeList no_attrs;\n\n  // Kludge: satisfy reporter_'s expectation.\n  reporter_.SetCUName(\"compilation-unit-name\");\n\n  // First CU.  Declares class_A.\n  {\n    DwarfCUToModule root1_handler(&fc, &lr, &reporter_);\n    ASSERT_TRUE(root1_handler.StartCompilationUnit(0, 1, 2, 3, 3));\n    dwarf2reader::AttributeList attrs;\n    PushBackStrangeAttributes(&attrs);\n    ASSERT_TRUE(root1_handler.StartRootDIE(1, dwarf2reader::DW_TAG_compile_unit,\n                                           attrs));\n    ProcessStrangeAttributes(&root1_handler);\n    ASSERT_TRUE(root1_handler.EndAttributes());\n    DeclarationDIE(&root1_handler, 0xb8fbfdd5f0b26fceULL,\n                   dwarf2reader::DW_TAG_class_type, \"class_A\");\n    root1_handler.Finish();\n  }\n   \n  // Second CU.  Defines class_A, declares member_func_B.\n  {\n    DwarfCUToModule root2_handler(&fc, &lr, &reporter_);\n    ASSERT_TRUE(root2_handler.StartCompilationUnit(0, 1, 2, 3, 3));\n    ASSERT_TRUE(root2_handler.StartRootDIE(1, dwarf2reader::DW_TAG_compile_unit,\n                                           no_attrs));\n    ASSERT_TRUE(root2_handler.EndAttributes());\n    DIEHandler *class_A_handler\n      = StartSpecifiedDIE(&root2_handler, dwarf2reader::DW_TAG_class_type,\n                          0xb8fbfdd5f0b26fceULL);\n    DeclarationDIE(class_A_handler, 0xb01fef8b380bd1a2ULL,\n                   dwarf2reader::DW_TAG_subprogram, \"member_func_B\");\n    class_A_handler->Finish();\n    delete class_A_handler;\n    root2_handler.Finish();\n  }\n\n  // Third CU.  Defines member_func_B.\n  {\n    DwarfCUToModule root3_handler(&fc, &lr, &reporter_);\n    ASSERT_TRUE(root3_handler.StartCompilationUnit(0, 1, 2, 3, 3));\n    ASSERT_TRUE(root3_handler.StartRootDIE(1, dwarf2reader::DW_TAG_compile_unit,\n                                           no_attrs));\n    ASSERT_TRUE(root3_handler.EndAttributes());\n    DefinitionDIE(&root3_handler, dwarf2reader::DW_TAG_subprogram,\n                  0xb01fef8b380bd1a2ULL, \"\",\n                  0x2618f00a1a711e53ULL, 0x4fd94b76d7c2caf5ULL);\n    root3_handler.Finish();\n  }\n\n  vector<Module::Function *> functions;\n  m.GetFunctions(&functions, functions.end());\n  EXPECT_EQ(1U, functions.size());\n  EXPECT_STREQ(\"class_A::member_func_B\", functions[0]->name.c_str());\n}\n\nTEST_F(Specifications, BadOffset) {\n  PushLine(0xa0277efd7ce83771ULL, 0x149554a184c730c1ULL, \"line-file\", 56636272);\n  EXPECT_CALL(reporter_, UnknownSpecification(_, 0x2be953efa6f9a996ULL))\n    .WillOnce(Return());\n\n  StartCU();\n  DeclarationDIE(&root_handler_, 0xefd7f7752c27b7e4ULL,\n                 dwarf2reader::DW_TAG_subprogram, \"\");\n  DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,\n                0x2be953efa6f9a996ULL, \"function\",\n                0xa0277efd7ce83771ULL, 0x149554a184c730c1ULL);\n  root_handler_.Finish();\n}\n\nTEST_F(Specifications, FunctionDefinitionHasOwnName) {\n  PushLine(0xced50b3eea81022cULL, 0x08dd4d301cc7a7d2ULL, \"line-file\", 56792403);\n\n  StartCU();\n  DeclarationDIE(&root_handler_, 0xc34ff4786cae78bdULL,\n                 dwarf2reader::DW_TAG_subprogram, \"declaration-name\");\n  DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,\n                0xc34ff4786cae78bdULL, \"definition-name\",\n                0xced50b3eea81022cULL, 0x08dd4d301cc7a7d2ULL);\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"definition-name\",\n               0xced50b3eea81022cULL, 0x08dd4d301cc7a7d2ULL);\n}\n\nTEST_F(Specifications, ClassDefinitionHasOwnName) {\n  PushLine(0x1d0f5e0f6ce309bdULL, 0x654e1852ec3599e7ULL, \"line-file\", 57119241);\n\n  StartCU();\n  DeclarationDIE(&root_handler_, 0xd0fe467ec2f1a58cULL,\n                 dwarf2reader::DW_TAG_class_type, \"class-declaration-name\");\n\n  dwarf2reader::DIEHandler *class_definition\n    = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,\n                        0xd0fe467ec2f1a58cULL, \"class-definition-name\");\n  ASSERT_TRUE(class_definition);\n  DeclarationDIE(class_definition, 0x6d028229c15623dbULL,\n                 dwarf2reader::DW_TAG_subprogram,\n                 \"function-declaration-name\");\n  class_definition->Finish();\n  delete class_definition;\n\n  DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,\n                0x6d028229c15623dbULL, \"function-definition-name\",\n                0x1d0f5e0f6ce309bdULL, 0x654e1852ec3599e7ULL);\n\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"class-definition-name::function-definition-name\",\n               0x1d0f5e0f6ce309bdULL, 0x654e1852ec3599e7ULL);\n}\n\n// DIEs that cite a specification should prefer the specification's\n// parents over their own when choosing qualified names. In this test,\n// we take the name from our definition but the enclosing scope name\n// from our declaration. I don't see why they'd ever be different, but\n// we want to verify what DwarfCUToModule is looking at.\nTEST_F(Specifications, PreferSpecificationParents) {\n  PushLine(0xbbd9d54dce3b95b7ULL, 0x39188b7b52b0899fULL, \"line-file\", 79488694);\n\n  StartCU();\n  {\n    dwarf2reader::DIEHandler *declaration_class_handler\n      = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type, \"declaration-class\");\n    DeclarationDIE(declaration_class_handler, 0x9ddb35517455ef7aULL,\n                   dwarf2reader::DW_TAG_subprogram, \"function-declaration\");\n    declaration_class_handler->Finish();\n    delete declaration_class_handler;\n  }\n  {\n    dwarf2reader::DIEHandler *definition_class_handler\n      = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,\n                      \"definition-class\");\n    DefinitionDIE(definition_class_handler, dwarf2reader::DW_TAG_subprogram,\n                  0x9ddb35517455ef7aULL, \"function-definition\",\n                  0xbbd9d54dce3b95b7ULL, 0x39188b7b52b0899fULL);\n    definition_class_handler->Finish();\n    delete definition_class_handler;\n  }\n  root_handler_.Finish();\n\n  TestFunctionCount(1);\n  TestFunction(0, \"declaration-class::function-definition\",\n               0xbbd9d54dce3b95b7ULL, 0x39188b7b52b0899fULL);\n}\n\nclass CUErrors: public CUFixtureBase, public Test { };\n\nTEST_F(CUErrors, BadStmtList) {\n  EXPECT_CALL(reporter_, BadLineInfoOffset(dummy_line_size_ + 10)).Times(1);\n\n  ASSERT_TRUE(root_handler_\n              .StartCompilationUnit(0xc591d5b037543d7cULL, 0x11, 0xcd,\n                                    0x2d7d19546cf6590cULL, 3));\n  dwarf2reader::AttributeList attrs;\n  attrs.push_back(make_pair(dwarf2reader::DW_AT_name,\n                            dwarf2reader::DW_FORM_strp));\n  attrs.push_back(make_pair(dwarf2reader::DW_AT_stmt_list,\n                            dwarf2reader::DW_FORM_ref4));\n  ASSERT_TRUE(root_handler_.StartRootDIE(0xae789dc102cfca54ULL,\n                                         dwarf2reader::DW_TAG_compile_unit,\n                                         attrs));\n  root_handler_.ProcessAttributeString(dwarf2reader::DW_AT_name,\n                                       dwarf2reader::DW_FORM_strp,\n                                       \"compilation-unit-name\");\n  root_handler_.ProcessAttributeUnsigned(dwarf2reader::DW_AT_stmt_list,\n                                         dwarf2reader::DW_FORM_ref4,\n                                         dummy_line_size_ + 10);\n  root_handler_.EndAttributes();\n  root_handler_.Finish();\n}\n\nTEST_F(CUErrors, NoLineSection) {\n  EXPECT_CALL(reporter_, MissingSection(\".debug_line\")).Times(1);\n  PushLine(0x88507fb678052611ULL, 0x42c8e9de6bbaa0faULL, \"line-file\", 64472290);\n  // Delete the entry for .debug_line added by the fixture class's constructor.\n  file_context_.section_map.clear();\n\n  StartCU();\n  root_handler_.Finish();\n}\n\nTEST_F(CUErrors, BadDwarfVersion1) {\n  // Kludge: satisfy reporter_'s expectation.\n  reporter_.SetCUName(\"compilation-unit-name\");\n\n  ASSERT_FALSE(root_handler_\n               .StartCompilationUnit(0xadf6e0eb71e2b0d9ULL, 0x4d, 0x90,\n                                     0xc9de224ccb99ac3eULL, 1));\n}\n\nTEST_F(CUErrors, GoodDwarfVersion2) {\n  // Kludge: satisfy reporter_'s expectation.\n  reporter_.SetCUName(\"compilation-unit-name\");\n\n  ASSERT_TRUE(root_handler_\n               .StartCompilationUnit(0xadf6e0eb71e2b0d9ULL, 0x4d, 0x90,\n                                     0xc9de224ccb99ac3eULL, 2));\n}\n\nTEST_F(CUErrors, GoodDwarfVersion3) {\n  // Kludge: satisfy reporter_'s expectation.\n  reporter_.SetCUName(\"compilation-unit-name\");\n\n  ASSERT_TRUE(root_handler_\n               .StartCompilationUnit(0xadf6e0eb71e2b0d9ULL, 0x4d, 0x90,\n                                     0xc9de224ccb99ac3eULL, 3));\n}\n\nTEST_F(CUErrors, BadCURootDIETag) {\n  // Kludge: satisfy reporter_'s expectation.\n  reporter_.SetCUName(\"compilation-unit-name\");\n\n  ASSERT_TRUE(root_handler_\n               .StartCompilationUnit(0xadf6e0eb71e2b0d9ULL, 0x4d, 0x90,\n                                     0xc9de224ccb99ac3eULL, 3));\n\n  dwarf2reader::AttributeList no_attrs;\n  ASSERT_FALSE(root_handler_.StartRootDIE(0x02e56bfbda9e7337ULL,\n                                          dwarf2reader::DW_TAG_subprogram,\n                                          no_attrs));\n}\n\n// Tests for DwarfCUToModule::Reporter. These just produce (or fail to\n// produce) output, so their results need to be checked by hand.\nstruct Reporter: public Test {\n  Reporter()\n      : reporter(\"filename\", 0x123456789abcdef0ULL) {\n    reporter.SetCUName(\"compilation-unit-name\");\n\n    function.name = \"function name\";\n    function.address = 0x19c45c30770c1eb0ULL;\n    function.size = 0x89808a5bdfa0a6a3ULL;\n    function.parameter_size = 0x6a329f18683dcd51ULL;\n\n    file.name = \"source file name\";\n\n    line.address = 0x3606ac6267aebeccULL;\n    line.size = 0x5de482229f32556aULL;\n    line.file = &file;\n    line.number = 93400201;\n  }\n  \n  DwarfCUToModule::WarningReporter reporter;\n  Module::Function function;\n  Module::File file;\n  Module::Line line;\n};\n\nTEST_F(Reporter, UnknownSpecification) {\n  reporter.UnknownSpecification(0x123456789abcdef1ULL, 0x323456789abcdef2ULL);\n}\n\nTEST_F(Reporter, UnknownAbstractOrigin) {\n  reporter.UnknownAbstractOrigin(0x123456789abcdef1ULL, 0x323456789abcdef2ULL);\n}\n\nTEST_F(Reporter, MissingSection) {\n  reporter.MissingSection(\"section name\");\n}\n\nTEST_F(Reporter, BadLineInfoOffset) {\n  reporter.BadLineInfoOffset(0x123456789abcdef1ULL);\n}\n\nTEST_F(Reporter, UncoveredFunctionDisabled) {\n  reporter.UncoveredFunction(function);\n  EXPECT_FALSE(reporter.uncovered_warnings_enabled());\n}\n\nTEST_F(Reporter, UncoveredFunctionEnabled) {\n  reporter.set_uncovered_warnings_enabled(true);\n  reporter.UncoveredFunction(function);\n  EXPECT_TRUE(reporter.uncovered_warnings_enabled());\n}\n\nTEST_F(Reporter, UncoveredLineDisabled) {\n  reporter.UncoveredLine(line);\n  EXPECT_FALSE(reporter.uncovered_warnings_enabled());\n}\n\nTEST_F(Reporter, UncoveredLineEnabled) {\n  reporter.set_uncovered_warnings_enabled(true);\n  reporter.UncoveredLine(line);\n  EXPECT_TRUE(reporter.uncovered_warnings_enabled());\n}\n\nTEST_F(Reporter, UnnamedFunction) {\n  reporter.UnnamedFunction(0x90c0baff9dedb2d9ULL);\n}  \n\n// Would be nice to also test:\n// - overlapping lines, functions\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf_line_to_module.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dwarf_line_to_module.cc: Implementation of DwarfLineToModule class.\n// See dwarf_line_to_module.h for details. \n\n#include \"common/dwarf_line_to_module.h\"\n\n#include <stdio.h>\n\n// Trying to support Windows paths in a reasonable way adds a lot of\n// variations to test; it would be better to just put off dealing with\n// it until we actually have to deal with DWARF on Windows.\n\n// Return true if PATH is an absolute path, false if it is relative.\nstatic bool PathIsAbsolute(const std::string &path) {\n  return (path.size() >= 1 && path[0] == '/');\n}\n\n// If PATH is an absolute path, return PATH.  If PATH is a relative path,\n// treat it as relative to BASE and return the combined path.\nstatic std::string ExpandPath(const std::string &path,\n                              const std::string &base) {\n  if (PathIsAbsolute(path))\n    return path;\n  return base + \"/\" + path;\n}\n\nnamespace google_breakpad {\n\nvoid DwarfLineToModule::DefineDir(const std::string &name, uint32 dir_num) {\n  // Directory number zero is reserved to mean the compilation\n  // directory. Silently ignore attempts to redefine it.\n  if (dir_num != 0)\n    directories_[dir_num] = name;\n}\n\nvoid DwarfLineToModule::DefineFile(const std::string &name, int32 file_num,\n                                   uint32 dir_num, uint64 mod_time,\n                                   uint64 length) {\n  if (file_num == -1)\n    file_num = ++highest_file_number_;\n  else if (file_num > highest_file_number_)\n    highest_file_number_ = file_num;\n\n  std::string full_name;\n  if (dir_num != 0) {\n    DirectoryTable::const_iterator directory_it = directories_.find(dir_num);\n    if (directory_it != directories_.end()) {\n      full_name = ExpandPath(name, directory_it->second);\n    } else {\n      if (!warned_bad_directory_number_) {\n        fprintf(stderr, \"warning: DWARF line number data refers to undefined\"\n                \" directory numbers\\n\");\n        warned_bad_directory_number_ = true;\n      }\n      full_name = name; // just treat name as relative\n    }\n  } else {\n    // Directory number zero is the compilation directory; we just report\n    // relative paths in that case.\n    full_name = name;\n  }\n\n  // Find a Module::File object of the given name, and add it to the\n  // file table.\n  files_[file_num] = module_->FindFile(full_name);\n}\n\nvoid DwarfLineToModule::AddLine(uint64 address, uint64 length,\n                                uint32 file_num, uint32 line_num,\n                                uint32 column_num) {\n  if (length == 0)\n    return;\n\n  // Clip lines not to extend beyond the end of the address space.\n  if (address + length < address)\n    length = -address;\n\n  // Should we omit this line? (See the comments for omitted_line_end_.)\n  if (address == 0 || address == omitted_line_end_) {\n    omitted_line_end_ = address + length;\n    return;\n  } else {\n    omitted_line_end_ = 0;\n  }\n\n  // Find the source file being referred to.\n  Module::File *file = files_[file_num];\n  if (!file) {\n    if (!warned_bad_file_number_) {\n      fprintf(stderr, \"warning: DWARF line number data refers to \"\n              \"undefined file numbers\\n\");\n      warned_bad_file_number_ = true;\n    }\n    return;\n  }\n  Module::Line line;\n  line.address = address;\n  // We set the size when we get the next line or the EndSequence call.\n  line.size = length;\n  line.file = file;\n  line.number = line_num;\n  lines_->push_back(line);\n}\n\n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf_line_to_module.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// The DwarfLineToModule class accepts line number information from a\n// DWARF parser and adds it to a google_breakpad::Module. The Module\n// can write that data out as a Breakpad symbol file.\n\n#ifndef COMMON_LINUX_DWARF_LINE_TO_MODULE_H\n#define COMMON_LINUX_DWARF_LINE_TO_MODULE_H\n\n#include \"common/module.h\"\n#include \"common/dwarf/dwarf2reader.h\"\n\nnamespace google_breakpad {\n\n// A class for producing a vector of google_breakpad::Module::Line\n// instances from parsed DWARF line number data.  \n//\n// An instance of this class can be provided as a handler to a\n// dwarf2reader::LineInfo DWARF line number information parser. The\n// handler accepts source location information from the parser and\n// uses it to produce a vector of google_breakpad::Module::Line\n// objects, referring to google_breakpad::Module::File objects added\n// to a particular google_breakpad::Module.\n//\n// GNU toolchain omitted sections support:\n// ======================================\n//\n// Given the right options, the GNU toolchain will omit unreferenced\n// functions from the final executable. Unfortunately, when it does so, it\n// does not remove the associated portions of the DWARF line number\n// program; instead, it gives the DW_LNE_set_address instructions referring\n// to the now-deleted code addresses of zero. Given this input, the DWARF\n// line parser will call AddLine with a series of lines starting at address\n// zero. For example, here is the output from 'readelf -wl' for a program\n// with four functions, the first three of which have been omitted:\n//\n//   Line Number Statements:\n//    Extended opcode 2: set Address to 0x0\n//    Advance Line by 14 to 15\n//    Copy\n//    Special opcode 48: advance Address by 3 to 0x3 and Line by 1 to 16\n//    Special opcode 119: advance Address by 8 to 0xb and Line by 2 to 18\n//    Advance PC by 2 to 0xd\n//    Extended opcode 1: End of Sequence\n// \n//    Extended opcode 2: set Address to 0x0\n//    Advance Line by 14 to 15\n//    Copy\n//    Special opcode 48: advance Address by 3 to 0x3 and Line by 1 to 16\n//    Special opcode 119: advance Address by 8 to 0xb and Line by 2 to 18\n//    Advance PC by 2 to 0xd\n//    Extended opcode 1: End of Sequence\n// \n//    Extended opcode 2: set Address to 0x0\n//    Advance Line by 19 to 20\n//    Copy\n//    Special opcode 48: advance Address by 3 to 0x3 and Line by 1 to 21\n//    Special opcode 76: advance Address by 5 to 0x8 and Line by 1 to 22\n//    Advance PC by 2 to 0xa\n//    Extended opcode 1: End of Sequence\n// \n//    Extended opcode 2: set Address to 0x80483a4\n//    Advance Line by 23 to 24\n//    Copy\n//    Special opcode 202: advance Address by 14 to 0x80483b2 and Line by 1 to 25\n//    Special opcode 76: advance Address by 5 to 0x80483b7 and Line by 1 to 26\n//    Advance PC by 6 to 0x80483bd\n//    Extended opcode 1: End of Sequence\n//\n// Instead of collecting runs of lines describing code that is not there,\n// we try to recognize and drop them. Since the linker doesn't explicitly\n// distinguish references to dropped sections from genuine references to\n// code at address zero, we must use a heuristic. We have chosen:\n//\n// - If a line starts at address zero, omit it. (On the platforms\n//   breakpad targets, it is extremely unlikely that there will be code\n//   at address zero.)\n//\n// - If a line starts immediately after an omitted line, omit it too.\nclass DwarfLineToModule: public dwarf2reader::LineInfoHandler {\n public:\n  // As the DWARF line info parser passes us line records, add source\n  // files to MODULE, and add all lines to the end of LINES. LINES\n  // need not be empty. If the parser hands us a zero-length line, we\n  // omit it. If the parser hands us a line that extends beyond the\n  // end of the address space, we clip it. It's up to our client to\n  // sort out which lines belong to which functions; we don't add them\n  // to any particular function in MODULE ourselves.\n  DwarfLineToModule(Module *module, vector<Module::Line> *lines)\n      : module_(module),\n        lines_(lines),\n        highest_file_number_(-1),\n        omitted_line_end_(0),\n        warned_bad_file_number_(false),\n        warned_bad_directory_number_(false) { }\n  \n  ~DwarfLineToModule() { }\n\n  void DefineDir(const std::string &name, uint32 dir_num);\n  void DefineFile(const std::string &name, int32 file_num,\n                  uint32 dir_num, uint64 mod_time,\n                  uint64 length);\n  void AddLine(uint64 address, uint64 length,\n               uint32 file_num, uint32 line_num, uint32 column_num);\n\n private:\n\n  typedef std::map<uint32, std::string> DirectoryTable;\n  typedef std::map<uint32, Module::File *> FileTable;\n\n  // The module we're contributing debugging info to. Owned by our\n  // client.\n  Module *module_;\n\n  // The vector of lines we're accumulating. Owned by our client.\n  //\n  // In a Module, as in a breakpad symbol file, lines belong to\n  // specific functions, but DWARF simply assigns lines to addresses;\n  // one must infer the line/function relationship using the\n  // functions' beginning and ending addresses. So we can't add these\n  // to the appropriate function from module_ until we've read the\n  // function info as well. Instead, we accumulate lines here, and let\n  // whoever constructed this sort it all out.\n  vector<Module::Line> *lines_;\n\n  // A table mapping directory numbers to paths.\n  DirectoryTable directories_;\n\n  // A table mapping file numbers to Module::File pointers.\n  FileTable files_;\n\n  // The highest file number we've seen so far, or -1 if we've seen\n  // none.  Used for dynamically defined file numbers.\n  int32 highest_file_number_;\n  \n  // This is the ending address of the last line we omitted, or zero if we\n  // didn't omit the previous line. It is zero before we have received any\n  // AddLine calls.\n  uint64 omitted_line_end_;\n\n  // True if we've warned about:\n  bool warned_bad_file_number_; // bad file numbers\n  bool warned_bad_directory_number_; // bad directory numbers\n};\n\n} // namespace google_breakpad\n\n#endif // COMMON_LINUX_DWARF_LINE_TO_MODULE_H\n"
  },
  {
    "path": "archive/spotify/breakpad/common/dwarf_line_to_module_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dwarf_line_to_module.cc: Unit tests for google_breakpad::DwarfLineToModule.\n\n#include <vector>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/dwarf_line_to_module.h\"\n\nusing std::vector;\n\nusing google_breakpad::DwarfLineToModule;\nusing google_breakpad::Module;\nusing google_breakpad::Module;\n\nTEST(SimpleModule, One) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineFile(\"file1\", 0x30bf0f27, 0, 0, 0);\n  h.AddLine(0x6fd126fbf74f2680LL, 0x63c9a14cf556712bLL, 0x30bf0f27,\n            0x4c090cbf, 0x1cf9fe0d);\n\n  vector<Module::File *> files;\n  m.GetFiles(&files);\n  EXPECT_EQ(1U, files.size());\n  EXPECT_STREQ(\"file1\", files[0]->name.c_str());\n\n  EXPECT_EQ(1U, lines.size());\n  EXPECT_EQ(0x6fd126fbf74f2680ULL, lines[0].address);\n  EXPECT_EQ(0x63c9a14cf556712bULL, lines[0].size);\n  EXPECT_TRUE(lines[0].file == files[0]);\n  EXPECT_EQ(0x4c090cbf, lines[0].number);\n}\n\nTEST(SimpleModule, Many) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineDir(\"directory1\", 0x838299ab);\n  h.DefineDir(\"directory2\", 0xf85de023);\n  h.DefineFile(\"file1\", 0x2b80377a, 0x838299ab, 0, 0);\n  h.DefineFile(\"file1\", 0x63beb4a4, 0xf85de023, 0, 0);\n  h.DefineFile(\"file2\", 0x1d161d56, 0x838299ab, 0, 0);\n  h.DefineFile(\"file2\", 0x1e7a667c, 0xf85de023, 0, 0);\n  h.AddLine(0x69900c5d553b7274ULL, 0x90fded183f0d0d3cULL, 0x2b80377a,\n            0x15b0f0a9U, 0x3ff5abd6U);\n  h.AddLine(0x45811219a39b7101ULL, 0x25a5e6a924afc41fULL, 0x63beb4a4,\n            0x4d259ce9U, 0x41c5ee32U);\n  h.AddLine(0xfa90514c1dc9704bULL, 0x0063efeabc02f313ULL, 0x1d161d56,\n            0x1ee9fa4fU, 0xbf70e46aU);\n  h.AddLine(0x556b55fb6a647b10ULL, 0x3f3089ca2bfd80f5ULL, 0x1e7a667c,\n            0x77fc280eU, 0x2c4a728cU);\n  h.DefineFile(\"file3\", -1, 0, 0, 0);\n  h.AddLine(0xe2d72a37f8d9403aULL, 0x034dfab5b0d4d236ULL, 0x63beb4a5,\n            0x75047044U, 0xb6a0016cU);\n\n  vector<Module::File *> files;\n  m.GetFiles(&files);\n  ASSERT_EQ(5U, files.size());\n  EXPECT_STREQ(\"directory1/file1\", files[0]->name.c_str());\n  EXPECT_STREQ(\"directory1/file2\", files[1]->name.c_str());\n  EXPECT_STREQ(\"directory2/file1\", files[2]->name.c_str());\n  EXPECT_STREQ(\"directory2/file2\", files[3]->name.c_str());\n  EXPECT_STREQ(\"file3\",            files[4]->name.c_str());\n\n  ASSERT_EQ(5U, lines.size());\n\n  EXPECT_EQ(0x69900c5d553b7274ULL, lines[0].address);\n  EXPECT_EQ(0x90fded183f0d0d3cULL, lines[0].size);\n  EXPECT_TRUE(lines[0].file == files[0]);\n  EXPECT_EQ(0x15b0f0a9, lines[0].number);\n\n  EXPECT_EQ(0x45811219a39b7101ULL, lines[1].address);\n  EXPECT_EQ(0x25a5e6a924afc41fULL, lines[1].size);\n  EXPECT_TRUE(lines[1].file == files[2]);\n  EXPECT_EQ(0x4d259ce9, lines[1].number);\n\n  EXPECT_EQ(0xfa90514c1dc9704bULL, lines[2].address);\n  EXPECT_EQ(0x0063efeabc02f313ULL, lines[2].size);\n  EXPECT_TRUE(lines[2].file == files[1]);\n  EXPECT_EQ(0x1ee9fa4f, lines[2].number);\n\n  EXPECT_EQ(0x556b55fb6a647b10ULL, lines[3].address);\n  EXPECT_EQ(0x3f3089ca2bfd80f5ULL, lines[3].size);\n  EXPECT_TRUE(lines[3].file == files[3]);\n  EXPECT_EQ(0x77fc280e, lines[3].number);\n\n  EXPECT_EQ(0xe2d72a37f8d9403aULL, lines[4].address);\n  EXPECT_EQ(0x034dfab5b0d4d236ULL, lines[4].size);\n  EXPECT_TRUE(lines[4].file == files[4]);\n  EXPECT_EQ(0x75047044, lines[4].number);\n}\n\nTEST(Filenames, Absolute) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineDir(\"directory1\", 1);\n  h.DefineFile(\"/absolute\", 1, 1, 0, 0);\n\n  h.AddLine(1, 1, 1, 0, 0);\n\n  vector<Module::File *> files;\n  m.GetFiles(&files);\n  ASSERT_EQ(1U, files.size());\n  EXPECT_STREQ(\"/absolute\", files[0]->name.c_str());\n  ASSERT_EQ(1U, lines.size());\n  EXPECT_TRUE(lines[0].file == files[0]);\n}\n\nTEST(Filenames, Relative) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineDir(\"directory1\", 1);\n  h.DefineFile(\"relative\", 1, 1, 0, 0);\n\n  h.AddLine(1, 1, 1, 0, 0);\n\n  vector<Module::File *> files;\n  m.GetFiles(&files);\n  ASSERT_EQ(1U, files.size());\n  EXPECT_STREQ(\"directory1/relative\", files[0]->name.c_str());\n  ASSERT_EQ(1U, lines.size());\n  EXPECT_TRUE(lines[0].file == files[0]);\n}\n\nTEST(Filenames, StrangeFile) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineDir(\"directory1\", 1);\n  h.DefineFile(\"\", 1, 1, 0, 0);\n  h.AddLine(1, 1, 1, 0, 0);\n\n  ASSERT_EQ(1U, lines.size());\n  EXPECT_STREQ(\"directory1/\", lines[0].file->name.c_str());\n}\n\nTEST(Filenames, StrangeDirectory) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineDir(\"\", 1);\n  h.DefineFile(\"file1\", 1, 1, 0, 0);\n  h.AddLine(1, 1, 1, 0, 0);\n\n  ASSERT_EQ(1U, lines.size());\n  EXPECT_STREQ(\"/file1\", lines[0].file->name.c_str());\n}\n\nTEST(Filenames, StrangeDirectoryAndFile) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineDir(\"\", 1);\n  h.DefineFile(\"\", 1, 1, 0, 0);\n  h.AddLine(1, 1, 1, 0, 0);\n\n  ASSERT_EQ(1U, lines.size());\n  EXPECT_STREQ(\"/\", lines[0].file->name.c_str());\n}\n\n// We should silently ignore attempts to define directory number zero,\n// since that is always the compilation directory.\nTEST(ModuleErrors, DirectoryZero) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineDir(\"directory0\", 0); // should be ignored\n  h.DefineFile(\"relative\", 1, 0, 0, 0);\n\n  h.AddLine(1, 1, 1, 0, 0);\n\n  ASSERT_EQ(1U, lines.size());\n  EXPECT_STREQ(\"relative\", lines[0].file->name.c_str());\n}\n\n// We should refuse to add lines with bogus file numbers. We should\n// produce only one warning, however.\nTEST(ModuleErrors, BadFileNumber) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineFile(\"relative\", 1, 0, 0, 0);\n  h.AddLine(1, 1, 2, 0, 0); // bad file number\n  h.AddLine(2, 1, 2, 0, 0); // bad file number (no duplicate warning)\n\n  EXPECT_EQ(0U, lines.size());\n}\n\n// We should treat files with bogus directory numbers as relative to\n// the compilation unit.\nTEST(ModuleErrors, BadDirectoryNumber) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineDir(\"directory1\", 1);\n  h.DefineFile(\"baddirnumber1\", 1, 2, 0, 0); // bad directory number\n  h.DefineFile(\"baddirnumber2\", 2, 2, 0, 0); // bad dir number (no warning)\n  h.AddLine(1, 1, 1, 0, 0);\n\n  ASSERT_EQ(1U, lines.size());\n  EXPECT_STREQ(\"baddirnumber1\", lines[0].file->name.c_str());\n}\n\n// We promise not to report empty lines.\nTEST(ModuleErrors, EmptyLine) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineFile(\"filename1\", 1, 0, 0, 0);\n  h.AddLine(1, 0, 1, 0, 0);\n\n  ASSERT_EQ(0U, lines.size());\n}  \n\n// We are supposed to clip lines that extend beyond the end of the\n// address space.\nTEST(ModuleErrors, BigLine) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineFile(\"filename1\", 1, 0, 0, 0);\n  h.AddLine(0xffffffffffffffffULL, 2, 1, 0, 0);\n\n  ASSERT_EQ(1U, lines.size());\n  EXPECT_EQ(1U, lines[0].size);\n}  \n\n// The 'Omitted' tests verify that we correctly omit line information\n// for code in sections that the linker has dropped. See \"GNU\n// toolchain omitted sections support\" at the top of the\n// DwarfLineToModule class.\n\nTEST(Omitted, DroppedThenGood) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineFile(\"filename1\", 1, 0, 0, 0);\n  h.AddLine(0,  10, 1, 83816211, 0);   // should be omitted\n  h.AddLine(20, 10, 1, 13059195, 0);   // should be recorded\n\n  ASSERT_EQ(1U, lines.size());\n  EXPECT_EQ(13059195, lines[0].number);\n}\n\nTEST(Omitted, GoodThenDropped) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineFile(\"filename1\", 1, 0, 0, 0);\n  h.AddLine(0x9dd6a372, 10, 1, 41454594, 0);   // should be recorded\n  h.AddLine(0,  10, 1, 44793413, 0);           // should be omitted\n\n  ASSERT_EQ(1U, lines.size());\n  EXPECT_EQ(41454594, lines[0].number);\n}\n\nTEST(Omitted, Mix1) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineFile(\"filename1\", 1, 0, 0, 0);\n  h.AddLine(0x679ed72f,  10,   1, 58932642, 0);   // should be recorded\n  h.AddLine(0xdfb5a72d,  10,   1, 39847385, 0);   // should be recorded\n  h.AddLine(0,           0x78, 1, 23053829, 0);   // should be omitted\n  h.AddLine(0x78,        0x6a, 1, 65317783, 0);   // should be omitted\n  h.AddLine(0x78 + 0x6a, 0x2a, 1, 77601423, 0);   // should be omitted\n  h.AddLine(0x9fe0cea5,  10,   1, 91806582, 0);   // should be recorded\n  h.AddLine(0x7e41a109,  10,   1, 56169221, 0);   // should be recorded\n\n  ASSERT_EQ(4U, lines.size());\n  EXPECT_EQ(58932642, lines[0].number);\n  EXPECT_EQ(39847385, lines[1].number);\n  EXPECT_EQ(91806582, lines[2].number);\n  EXPECT_EQ(56169221, lines[3].number);\n}\n\nTEST(Omitted, Mix2) {\n  Module m(\"name\", \"os\", \"architecture\", \"id\");\n  vector<Module::Line> lines;\n  DwarfLineToModule h(&m, &lines);\n\n  h.DefineFile(\"filename1\", 1, 0, 0, 0);\n  h.AddLine(0,           0xf2, 1, 58802211, 0);   // should be omitted\n  h.AddLine(0xf2,        0xb9, 1, 78958222, 0);   // should be omitted\n  h.AddLine(0xf2 + 0xb9, 0xf7, 1, 64861892, 0);   // should be omitted\n  h.AddLine(0x4e4d271e,  9,    1, 67355743, 0);   // should be recorded\n  h.AddLine(0xdfb5a72d,  30,   1, 23365776, 0);   // should be recorded\n  h.AddLine(0,           0x64, 1, 76196762, 0);   // should be omitted\n  h.AddLine(0x64,        0x33, 1, 71066611, 0);   // should be omitted\n  h.AddLine(0x64 + 0x33, 0xe3, 1, 61749337, 0);   // should be omitted\n\n  ASSERT_EQ(2U, lines.size());\n  EXPECT_EQ(67355743, lines[0].number);\n  EXPECT_EQ(23365776, lines[1].number);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/language.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// language.cc: Subclasses and singletons for google_breakpad::Language.\n// See language.h for details.\n\n#include \"common/language.h\"\n\nnamespace google_breakpad {\n\n// C++ language-specific operations.\nclass CPPLanguage: public Language {\n public:\n  CPPLanguage() {}\n  string MakeQualifiedName(const string &parent_name,\n                           const string &name) const {\n    if (parent_name.empty())\n      return name;\n    else\n      return parent_name + \"::\" + name;\n  }\n};\n\nCPPLanguage CPPLanguageSingleton;\n\n// Java language-specific operations.\nclass JavaLanguage: public Language {\n public:\n  string MakeQualifiedName(const string &parent_name,\n                           const string &name) const {\n    if (parent_name.empty())\n      return name;\n    else\n      return parent_name + \".\" + name;\n  }\n};\n\nJavaLanguage JavaLanguageSingleton;\n\n// Assembler language-specific operations.\nclass AssemblerLanguage: public Language {\n  bool HasFunctions() const { return false; }\n  string MakeQualifiedName(const string &parent_name,\n                           const string &name) const {\n    return name;\n  }\n};\n\nAssemblerLanguage AssemblerLanguageSingleton;\n\nconst Language * const Language::CPlusPlus = &CPPLanguageSingleton;\nconst Language * const Language::Java = &JavaLanguageSingleton;\nconst Language * const Language::Assembler = &AssemblerLanguageSingleton;\n\n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/language.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// language.h: Define google_breakpad::Language. Instances of\n// subclasses of this class provide language-appropriate operations\n// for the Breakpad symbol dumper.\n\n#ifndef COMMON_LINUX_LANGUAGE_H__\n#define COMMON_LINUX_LANGUAGE_H__\n\n#include <string>\n\nnamespace google_breakpad {\n\nusing std::string;\n\n// An abstract base class for language-specific operations. We choose\n// an instance of a subclass of this when we find the CU's language.\n// This class's definitions are appropriate for CUs with no specified\n// language.\nclass Language {\n public:\n  // Return true if this language has functions to which we can assign\n  // line numbers. (Debugging info for assembly language, for example,\n  // can have source location information, but does not have functions\n  // recorded using DW_TAG_subprogram DIEs.)\n  virtual bool HasFunctions() const { return true; }\n\n  // Construct a fully-qualified, language-appropriate form of NAME,\n  // given that PARENT_NAME is the name of the construct enclosing\n  // NAME. If PARENT_NAME is the empty string, then NAME is a\n  // top-level name.\n  //\n  // This API sort of assumes that a fully-qualified name is always\n  // some simple textual composition of the unqualified name and its\n  // parent's name, and that we don't need to know anything else about\n  // the parent or the child (say, their DIEs' tags) to do the job.\n  // This is true for the languages we support at the moment, and\n  // keeps things concrete. Perhaps a more refined operation would\n  // take into account the parent and child DIE types, allow languages\n  // to use their own data type for complex parent names, etc. But if\n  // C++ doesn't need all that, who would?\n  virtual string MakeQualifiedName (const string &parent_name,\n                                    const string &name) const = 0;\n\n  // Instances for specific languages.\n  static const Language * const CPlusPlus,\n                        * const Java,\n                        * const Assembler;\n};\n\n} // namespace google_breakpad\n\n#endif  // COMMON_LINUX_LANGUAGE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/dump_symbols.cc",
    "content": "// Copyright (c) 2011 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Restructured in 2009 by: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dump_symbols.cc: implement google_breakpad::WriteSymbolFile:\n// Find all the debugging info in a file and dump it as a Breakpad symbol file.\n\n#include \"common/linux/dump_symbols.h\"\n\n#include <assert.h>\n#include <elf.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <link.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/mman.h>\n#include <sys/stat.h>\n#include <unistd.h>\n\n#include <iostream>\n#include <set>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include \"common/dwarf/bytereader-inl.h\"\n#include \"common/dwarf/dwarf2diehandler.h\"\n#include \"common/dwarf_cfi_to_module.h\"\n#include \"common/dwarf_cu_to_module.h\"\n#include \"common/dwarf_line_to_module.h\"\n#include \"common/linux/elf_symbols_to_module.h\"\n#include \"common/linux/file_id.h\"\n#include \"common/module.h\"\n#include \"common/stabs_reader.h\"\n#include \"common/stabs_to_module.h\"\n\n// This namespace contains helper functions.\nnamespace {\n\nusing google_breakpad::DwarfCFIToModule;\nusing google_breakpad::DwarfCUToModule;\nusing google_breakpad::DwarfLineToModule;\nusing google_breakpad::Module;\nusing google_breakpad::StabsToModule;\n\n//\n// FDWrapper\n//\n// Wrapper class to make sure opened file is closed.\n//\nclass FDWrapper {\n public:\n  explicit FDWrapper(int fd) :\n    fd_(fd) {}\n  ~FDWrapper() {\n    if (fd_ != -1)\n      close(fd_);\n  }\n  int get() {\n    return fd_;\n  }\n  int release() {\n    int fd = fd_;\n    fd_ = -1;\n    return fd;\n  }\n private:\n  int fd_;\n};\n\n//\n// MmapWrapper\n//\n// Wrapper class to make sure mapped regions are unmapped.\n//\nclass MmapWrapper {\n public:\n  MmapWrapper() : is_set_(false) {}\n  ~MmapWrapper() {\n    assert(is_set_);\n    if (base_ != NULL) {\n      assert(size_ > 0);\n      munmap(base_, size_);\n    }\n  }\n  void set(void *mapped_address, size_t mapped_size) {\n    is_set_ = true;\n    base_ = mapped_address;\n    size_ = mapped_size;\n  }\n  void release() {\n    assert(is_set_);\n    base_ = NULL;\n    size_ = 0;\n  }\n\n private:\n  bool is_set_;\n  void *base_;\n  size_t size_;\n};\n\n\n// Fix offset into virtual address by adding the mapped base into offsets.\n// Make life easier when want to find something by offset.\nstatic void FixAddress(void *obj_base) {\n  ElfW(Addr) base = reinterpret_cast<ElfW(Addr)>(obj_base);\n  ElfW(Ehdr) *elf_header = static_cast<ElfW(Ehdr) *>(obj_base);\n  elf_header->e_phoff += base;\n  elf_header->e_shoff += base;\n  ElfW(Shdr) *sections = reinterpret_cast<ElfW(Shdr) *>(elf_header->e_shoff);\n  for (int i = 0; i < elf_header->e_shnum; ++i)\n    sections[i].sh_offset += base;\n}\n\n// Find the preferred loading address of the binary.\nstatic ElfW(Addr) GetLoadingAddress(const ElfW(Phdr) *program_headers,\n                                    int nheader) {\n  for (int i = 0; i < nheader; ++i) {\n    const ElfW(Phdr) &header = program_headers[i];\n    // For executable, it is the PT_LOAD segment with offset to zero.\n    if (header.p_type == PT_LOAD &&\n        header.p_offset == 0)\n      return header.p_vaddr;\n  }\n  // For other types of ELF, return 0.\n  return 0;\n}\n\nstatic bool IsValidElf(const ElfW(Ehdr) *elf_header) {\n  return memcmp(elf_header, ELFMAG, SELFMAG) == 0;\n}\n\nstatic const ElfW(Shdr) *FindSectionByName(const char *name,\n                                           const ElfW(Shdr) *sections,\n                                           const ElfW(Shdr) *section_names,\n                                           int nsection) {\n  assert(name != NULL);\n  assert(sections != NULL);\n  assert(nsection > 0);\n\n  int name_len = strlen(name);\n  if (name_len == 0)\n    return NULL;\n\n  // Find the end of the section name section, to make sure that\n  // comparisons don't run off the end of the section.\n  const char *names_end =\n    reinterpret_cast<char*>(section_names->sh_offset + section_names->sh_size);\n\n  for (int i = 0; i < nsection; ++i) {\n    const char *section_name =\n      reinterpret_cast<char*>(section_names->sh_offset + sections[i].sh_name);\n    if (names_end - section_name >= name_len + 1 &&\n        strcmp(name, section_name) == 0) {\n      if (sections[i].sh_type == SHT_NOBITS) {\n        fprintf(stderr,\n                \"Section %s found, but ignored because type=SHT_NOBITS.\\n\",\n                name);\n        return NULL;\n      }\n      return sections + i;\n    }\n  }\n  return NULL;\n}\n\nstatic bool LoadStabs(const ElfW(Ehdr) *elf_header,\n                      const ElfW(Shdr) *stab_section,\n                      const ElfW(Shdr) *stabstr_section,\n                      const bool big_endian,\n                      Module *module) {\n  // A callback object to handle data from the STABS reader.\n  StabsToModule handler(module);\n  // Find the addresses of the STABS data, and create a STABS reader object.\n  // On Linux, STABS entries always have 32-bit values, regardless of the\n  // address size of the architecture whose code they're describing, and\n  // the strings are always \"unitized\".\n  uint8_t *stabs = reinterpret_cast<uint8_t *>(stab_section->sh_offset);\n  uint8_t *stabstr = reinterpret_cast<uint8_t *>(stabstr_section->sh_offset);\n  google_breakpad::StabsReader reader(stabs, stab_section->sh_size,\n                                      stabstr, stabstr_section->sh_size,\n                                      big_endian, 4, true, &handler);\n  // Read the STABS data, and do post-processing.\n  if (!reader.Process())\n    return false;\n  handler.Finalize();\n  return true;\n}\n\n// A line-to-module loader that accepts line number info parsed by\n// dwarf2reader::LineInfo and populates a Module and a line vector\n// with the results.\nclass DumperLineToModule: public DwarfCUToModule::LineToModuleFunctor {\n public:\n  // Create a line-to-module converter using BYTE_READER.\n  explicit DumperLineToModule(dwarf2reader::ByteReader *byte_reader)\n      : byte_reader_(byte_reader) { }\n  void operator()(const char *program, uint64 length,\n                  Module *module, std::vector<Module::Line> *lines) {\n    DwarfLineToModule handler(module, lines);\n    dwarf2reader::LineInfo parser(program, length, byte_reader_, &handler);\n    parser.Start();\n  }\n private:\n  dwarf2reader::ByteReader *byte_reader_;\n};\n\nstatic bool LoadDwarf(const std::string &dwarf_filename,\n                      const ElfW(Ehdr) *elf_header,\n                      const bool big_endian,\n                      Module *module) {\n  const dwarf2reader::Endianness endianness = big_endian ?\n      dwarf2reader::ENDIANNESS_BIG : dwarf2reader::ENDIANNESS_LITTLE;\n  dwarf2reader::ByteReader byte_reader(endianness);\n\n  // Construct a context for this file.\n  DwarfCUToModule::FileContext file_context(dwarf_filename, module);\n\n  // Build a map of the ELF file's sections.\n  const ElfW(Shdr) *sections\n      = reinterpret_cast<ElfW(Shdr) *>(elf_header->e_shoff);\n  int num_sections = elf_header->e_shnum;\n  const ElfW(Shdr) *section_names = sections + elf_header->e_shstrndx;\n  for (int i = 0; i < num_sections; i++) {\n    const ElfW(Shdr) *section = &sections[i];\n    std::string name = reinterpret_cast<const char *>(section_names->sh_offset +\n                                                      section->sh_name);\n    const char *contents = reinterpret_cast<const char *>(section->sh_offset);\n    uint64 length = section->sh_size;\n    file_context.section_map[name] = std::make_pair(contents, length);\n  }\n\n  // Parse all the compilation units in the .debug_info section.\n  DumperLineToModule line_to_module(&byte_reader);\n  std::pair<const char *, uint64> debug_info_section\n      = file_context.section_map[\".debug_info\"];\n  // We should never have been called if the file doesn't have a\n  // .debug_info section.\n  assert(debug_info_section.first);\n  uint64 debug_info_length = debug_info_section.second;\n  for (uint64 offset = 0; offset < debug_info_length;) {\n    // Make a handler for the root DIE that populates MODULE with the\n    // data we find.\n    DwarfCUToModule::WarningReporter reporter(dwarf_filename, offset);\n    DwarfCUToModule root_handler(&file_context, &line_to_module, &reporter);\n    // Make a Dwarf2Handler that drives our DIEHandler.\n    dwarf2reader::DIEDispatcher die_dispatcher(&root_handler);\n    // Make a DWARF parser for the compilation unit at OFFSET.\n    dwarf2reader::CompilationUnit reader(file_context.section_map,\n                                         offset,\n                                         &byte_reader,\n                                         &die_dispatcher);\n    // Process the entire compilation unit; get the offset of the next.\n    offset += reader.Start();\n  }\n  return true;\n}\n\n// Fill REGISTER_NAMES with the register names appropriate to the\n// machine architecture given in HEADER, indexed by the register\n// numbers used in DWARF call frame information. Return true on\n// success, or false if we don't recognize HEADER's machine\n// architecture.\nstatic bool DwarfCFIRegisterNames(const ElfW(Ehdr) *elf_header,\n                                  std::vector<std::string> *register_names) {\n  switch (elf_header->e_machine) {\n    case EM_386:\n      *register_names = DwarfCFIToModule::RegisterNames::I386();\n      return true;\n    case EM_ARM:\n      *register_names = DwarfCFIToModule::RegisterNames::ARM();\n      return true;\n    case EM_X86_64:\n      *register_names = DwarfCFIToModule::RegisterNames::X86_64();\n      return true;\n    default:\n      return false;\n  }\n}\n\nstatic bool LoadDwarfCFI(const std::string &dwarf_filename,\n                         const ElfW(Ehdr) *elf_header,\n                         const char *section_name,\n                         const ElfW(Shdr) *section,\n                         const bool eh_frame,\n                         const ElfW(Shdr) *got_section,\n                         const ElfW(Shdr) *text_section,\n                         const bool big_endian,\n                         Module *module) {\n  // Find the appropriate set of register names for this file's\n  // architecture.\n  std::vector<std::string> register_names;\n  if (!DwarfCFIRegisterNames(elf_header, &register_names)) {\n    fprintf(stderr, \"%s: unrecognized ELF machine architecture '%d';\"\n            \" cannot convert DWARF call frame information\\n\",\n            dwarf_filename.c_str(), elf_header->e_machine);\n    return false;\n  }\n\n  const dwarf2reader::Endianness endianness = big_endian ?\n      dwarf2reader::ENDIANNESS_BIG : dwarf2reader::ENDIANNESS_LITTLE;\n\n  // Find the call frame information and its size.\n  const char *cfi = reinterpret_cast<const char *>(section->sh_offset);\n  size_t cfi_size = section->sh_size;\n\n  // Plug together the parser, handler, and their entourages.\n  DwarfCFIToModule::Reporter module_reporter(dwarf_filename, section_name);\n  DwarfCFIToModule handler(module, register_names, &module_reporter);\n  dwarf2reader::ByteReader byte_reader(endianness);\n  // Since we're using the ElfW macro, we're not actually capable of\n  // processing both ELF32 and ELF64 files with the same program; that\n  // would take a bit more work. But this will work out well enough.\n  if (elf_header->e_ident[EI_CLASS] == ELFCLASS32)\n    byte_reader.SetAddressSize(4);\n  else if (elf_header->e_ident[EI_CLASS] == ELFCLASS64)\n    byte_reader.SetAddressSize(8);\n  else {\n    fprintf(stderr, \"%s: bad file class in ELF header: %d\\n\",\n            dwarf_filename.c_str(), elf_header->e_ident[EI_CLASS]);\n    return false;\n  }\n  // Provide the base addresses for .eh_frame encoded pointers, if\n  // possible.\n  byte_reader.SetCFIDataBase(section->sh_addr, cfi);\n  if (got_section)\n    byte_reader.SetDataBase(got_section->sh_addr);\n  if (text_section)\n    byte_reader.SetTextBase(text_section->sh_addr);\n\n  dwarf2reader::CallFrameInfo::Reporter dwarf_reporter(dwarf_filename,\n                                                       section_name);\n  dwarf2reader::CallFrameInfo parser(cfi, cfi_size,\n                                     &byte_reader, &handler, &dwarf_reporter,\n                                     eh_frame);\n  parser.Start();\n  return true;\n}\n\nbool LoadELF(const std::string &obj_file, MmapWrapper* map_wrapper,\n             ElfW(Ehdr) **elf_header) {\n  int obj_fd = open(obj_file.c_str(), O_RDONLY);\n  if (obj_fd < 0) {\n    fprintf(stderr, \"Failed to open ELF file '%s': %s\\n\",\n            obj_file.c_str(), strerror(errno));\n    return false;\n  }\n  FDWrapper obj_fd_wrapper(obj_fd);\n  struct stat st;\n  if (fstat(obj_fd, &st) != 0 && st.st_size <= 0) {\n    fprintf(stderr, \"Unable to fstat ELF file '%s': %s\\n\",\n            obj_file.c_str(), strerror(errno));\n    return false;\n  }\n  void *obj_base = mmap(NULL, st.st_size,\n                        PROT_READ | PROT_WRITE, MAP_PRIVATE, obj_fd, 0);\n  if (obj_base == MAP_FAILED) {\n    fprintf(stderr, \"Failed to mmap ELF file '%s': %s\\n\",\n            obj_file.c_str(), strerror(errno));\n    return false;\n  }\n  map_wrapper->set(obj_base, st.st_size);\n  *elf_header = reinterpret_cast<ElfW(Ehdr) *>(obj_base);\n  if (!IsValidElf(*elf_header)) {\n    fprintf(stderr, \"Not a valid ELF file: %s\\n\", obj_file.c_str());\n    return false;\n  }\n  return true;\n}\n\n// Get the endianness of ELF_HEADER. If it's invalid, return false.\nbool ElfEndianness(const ElfW(Ehdr) *elf_header, bool *big_endian) {\n  if (elf_header->e_ident[EI_DATA] == ELFDATA2LSB) {\n    *big_endian = false;\n    return true;\n  }\n  if (elf_header->e_ident[EI_DATA] == ELFDATA2MSB) {\n    *big_endian = true;\n    return true;\n  }\n\n  fprintf(stderr, \"bad data encoding in ELF header: %d\\n\",\n          elf_header->e_ident[EI_DATA]);\n  return false;\n}\n\n// Read the .gnu_debuglink and get the debug file name. If anything goes\n// wrong, return an empty string.\nstatic std::string ReadDebugLink(const ElfW(Shdr) *debuglink_section,\n                                 const std::string &obj_file,\n                                 const std::string &debug_dir) {\n  char *debuglink = reinterpret_cast<char *>(debuglink_section->sh_offset);\n  size_t debuglink_len = strlen(debuglink) + 5;  // '\\0' + CRC32.\n  debuglink_len = 4 * ((debuglink_len + 3) / 4);  // Round to nearest 4 bytes.\n\n  // Sanity check.\n  if (debuglink_len != debuglink_section->sh_size) {\n    fprintf(stderr, \"Mismatched .gnu_debuglink string / section size: \"\n            \"%zx %zx\\n\", debuglink_len, debuglink_section->sh_size);\n    return \"\";\n  }\n\n  std::string debuglink_path = debug_dir + \"/\" + debuglink;\n  int debuglink_fd = open(debuglink_path.c_str(), O_RDONLY);\n  if (debuglink_fd < 0) {\n    fprintf(stderr, \"Failed to open debug ELF file '%s' for '%s': %s\\n\",\n            debuglink_path.c_str(), obj_file.c_str(), strerror(errno));\n    return \"\";\n  }\n  FDWrapper debuglink_fd_wrapper(debuglink_fd);\n  // TODO(thestig) check the CRC-32 at the end of the .gnu_debuglink\n  // section.\n\n  return debuglink_path;\n}\n\n//\n// LoadSymbolsInfo\n//\n// Holds the state between the two calls to LoadSymbols() in case we have to\n// follow the .gnu_debuglink section and load debug information from a\n// different file.\n//\nclass LoadSymbolsInfo {\n public:\n  explicit LoadSymbolsInfo(const std::string &dbg_dir) :\n    debug_dir_(dbg_dir),\n    has_loading_addr_(false) {}\n\n  // Keeps track of which sections have been loaded so we don't accidentally\n  // load it twice from two different files.\n  void LoadedSection(const std::string &section) {\n    if (loaded_sections_.count(section) == 0) {\n      loaded_sections_.insert(section);\n    } else {\n      fprintf(stderr, \"Section %s has already been loaded.\\n\",\n              section.c_str());\n    }\n  }\n\n  // We expect the ELF file and linked debug file to have the same preferred\n  // loading address.\n  void set_loading_addr(ElfW(Addr) addr, const std::string &filename) {\n    if (!has_loading_addr_) {\n      loading_addr_ = addr;\n      loaded_file_ = filename;\n      return;\n    }\n\n    if (addr != loading_addr_) {\n      fprintf(stderr,\n              \"ELF file '%s' and debug ELF file '%s' \"\n              \"have different load addresses.\\n\",\n              loaded_file_.c_str(), filename.c_str());\n      assert(false);\n    }\n  }\n\n  // Setters and getters\n  const std::string &debug_dir() const {\n    return debug_dir_;\n  }\n\n  std::string debuglink_file() const {\n    return debuglink_file_;\n  }\n  void set_debuglink_file(std::string file) {\n    debuglink_file_ = file;\n  }\n\n private:\n  const std::string &debug_dir_;  // Directory with the debug ELF file.\n\n  std::string debuglink_file_;  // Full path to the debug ELF file.\n\n  bool has_loading_addr_;  // Indicate if LOADING_ADDR_ is valid.\n\n  ElfW(Addr) loading_addr_;  // Saves the preferred loading address from the\n                             // first call to LoadSymbols().\n\n  std::string loaded_file_;  // Name of the file loaded from the first call to\n                             // LoadSymbols().\n\n  std::set<std::string> loaded_sections_;  // Tracks the Loaded ELF sections\n                                           // between calls to LoadSymbols().\n};\n\nstatic bool LoadSymbols(const std::string &obj_file,\n                        const bool big_endian,\n                        ElfW(Ehdr) *elf_header,\n                        const bool read_gnu_debug_link,\n                        LoadSymbolsInfo *info,\n                        Module *module) {\n  // Translate all offsets in section headers into address.\n  FixAddress(elf_header);\n  ElfW(Addr) loading_addr = GetLoadingAddress(\n      reinterpret_cast<ElfW(Phdr) *>(elf_header->e_phoff),\n      elf_header->e_phnum);\n  module->SetLoadAddress(loading_addr);\n  info->set_loading_addr(loading_addr, obj_file);\n\n  const ElfW(Shdr) *sections =\n      reinterpret_cast<ElfW(Shdr) *>(elf_header->e_shoff);\n  const ElfW(Shdr) *section_names = sections + elf_header->e_shstrndx;\n  bool found_debug_info_section = false;\n  bool found_usable_info = false;\n\n  // Look for STABS debugging information, and load it if present.\n  const ElfW(Shdr) *stab_section\n      = FindSectionByName(\".stab\", sections, section_names,\n                          elf_header->e_shnum);\n  if (stab_section) {\n    const ElfW(Shdr) *stabstr_section = stab_section->sh_link + sections;\n    if (stabstr_section) {\n      found_debug_info_section = true;\n      found_usable_info = true;\n      info->LoadedSection(\".stab\");\n      if (!LoadStabs(elf_header, stab_section, stabstr_section, big_endian,\n                     module)) {\n        fprintf(stderr, \"%s: \\\".stab\\\" section found, but failed to load STABS\"\n                \" debugging information\\n\", obj_file.c_str());\n      }\n    }\n  }\n\n  // Look for DWARF debugging information, and load it if present.\n  const ElfW(Shdr) *dwarf_section\n      = FindSectionByName(\".debug_info\", sections, section_names,\n                          elf_header->e_shnum);\n  if (dwarf_section) {\n    found_debug_info_section = true;\n    found_usable_info = true;\n    info->LoadedSection(\".debug_info\");\n    if (!LoadDwarf(obj_file, elf_header, big_endian, module))\n      fprintf(stderr, \"%s: \\\".debug_info\\\" section found, but failed to load \"\n              \"DWARF debugging information\\n\", obj_file.c_str());\n  }\n\n  // Dwarf Call Frame Information (CFI) is actually independent from\n  // the other DWARF debugging information, and can be used alone.\n  const ElfW(Shdr) *dwarf_cfi_section =\n      FindSectionByName(\".debug_frame\", sections, section_names,\n                          elf_header->e_shnum);\n  if (dwarf_cfi_section) {\n    // Ignore the return value of this function; even without call frame\n    // information, the other debugging information could be perfectly\n    // useful.\n    info->LoadedSection(\".debug_frame\");\n    bool result =\n      LoadDwarfCFI(obj_file, elf_header, \".debug_frame\",\n                   dwarf_cfi_section, false, 0, 0, big_endian, module);\n    found_usable_info = found_usable_info || result;\n  }\n\n  // Linux C++ exception handling information can also provide\n  // unwinding data.\n  const ElfW(Shdr) *eh_frame_section =\n      FindSectionByName(\".eh_frame\", sections, section_names,\n                        elf_header->e_shnum);\n  if (eh_frame_section) {\n    // Pointers in .eh_frame data may be relative to the base addresses of\n    // certain sections. Provide those sections if present.\n    const ElfW(Shdr) *got_section =\n      FindSectionByName(\".got\", sections, section_names, elf_header->e_shnum);\n    const ElfW(Shdr) *text_section =\n      FindSectionByName(\".text\", sections, section_names,\n                        elf_header->e_shnum);\n    info->LoadedSection(\".eh_frame\");\n    // As above, ignore the return value of this function.\n    bool result =\n      LoadDwarfCFI(obj_file, elf_header, \".eh_frame\", eh_frame_section, true,\n                   got_section, text_section, big_endian, module);\n    found_usable_info = found_usable_info || result;\n  }\n\n  if (!found_debug_info_section) {\n    fprintf(stderr, \"%s: file contains no debugging information\"\n            \" (no \\\".stab\\\" or \\\".debug_info\\\" sections)\\n\",\n            obj_file.c_str());\n\n    // Failed, but maybe we can find a .gnu_debuglink section?\n    if (read_gnu_debug_link) {\n      const ElfW(Shdr) *gnu_debuglink_section\n          = FindSectionByName(\".gnu_debuglink\", sections, section_names,\n                              elf_header->e_shnum);\n      if (gnu_debuglink_section) {\n        if (!info->debug_dir().empty()) {\n          std::string debuglink_file =\n              ReadDebugLink(gnu_debuglink_section, obj_file, info->debug_dir());\n          info->set_debuglink_file(debuglink_file);\n        } else {\n          fprintf(stderr, \".gnu_debuglink section found in '%s', \"\n                  \"but no debug path specified.\\n\", obj_file.c_str());\n        }\n      } else {\n        fprintf(stderr, \"%s does not contain a .gnu_debuglink section.\\n\",\n                obj_file.c_str());\n      }\n    } else {\n      // The caller doesn't want to consult .gnu_debuglink.\n      // See if there are export symbols available.\n      const ElfW(Shdr) *dynsym_section =\n        FindSectionByName(\".dynsym\", sections, section_names,\n                          elf_header->e_shnum);\n      const ElfW(Shdr) *dynstr_section =\n        FindSectionByName(\".dynstr\", sections, section_names,\n                          elf_header->e_shnum);\n      if (dynsym_section && dynstr_section) {\n        info->LoadedSection(\".dynsym\");\n        fprintf(stderr, \"Have .dynsym + .dynstr\\n\");\n\n        uint8_t* dynsyms =\n          reinterpret_cast<uint8_t*>(dynsym_section->sh_offset);\n        uint8_t* dynstrs =\n          reinterpret_cast<uint8_t*>(dynstr_section->sh_offset);\n        bool result =\n          ELFSymbolsToModule(dynsyms,\n                             dynsym_section->sh_size,\n                             dynstrs,\n                             dynstr_section->sh_size,\n                             big_endian,\n                             // This could change to something more useful\n                             // when support for dumping cross-architecture\n                             // symbols is finished.\n                             sizeof(ElfW(Addr)),\n                             module);\n        found_usable_info = found_usable_info || result;\n      }\n\n      // Return true if some usable information was found, since\n      // the caller doesn't want to use .gnu_debuglink.\n      return found_usable_info;\n    }\n\n    // No debug info was found, let the user try again with .gnu_debuglink\n    // if present.\n    return false;\n  }\n\n  return true;\n}\n\n// Return the breakpad symbol file identifier for the architecture of\n// ELF_HEADER.\nconst char *ElfArchitecture(const ElfW(Ehdr) *elf_header) {\n  ElfW(Half) arch = elf_header->e_machine;\n  switch (arch) {\n    case EM_386:        return \"x86\";\n    case EM_ARM:        return \"arm\";\n    case EM_MIPS:       return \"mips\";\n    case EM_PPC64:      return \"ppc64\";\n    case EM_PPC:        return \"ppc\";\n    case EM_S390:       return \"s390\";\n    case EM_SPARC:      return \"sparc\";\n    case EM_SPARCV9:    return \"sparcv9\";\n    case EM_X86_64:     return \"x86_64\";\n    default: return NULL;\n  }\n}\n\n// Format the Elf file identifier in IDENTIFIER as a UUID with the\n// dashes removed.\nstd::string FormatIdentifier(unsigned char identifier[16]) {\n  char identifier_str[40];\n  google_breakpad::FileID::ConvertIdentifierToString(\n      identifier,\n      identifier_str,\n      sizeof(identifier_str));\n  std::string id_no_dash;\n  for (int i = 0; identifier_str[i] != '\\0'; ++i)\n    if (identifier_str[i] != '-')\n      id_no_dash += identifier_str[i];\n  // Add an extra \"0\" by the end.  PDB files on Windows have an 'age'\n  // number appended to the end of the file identifier; this isn't\n  // really used or necessary on other platforms, but let's preserve\n  // the pattern.\n  id_no_dash += '0';\n  return id_no_dash;\n}\n\n// Return the non-directory portion of FILENAME: the portion after the\n// last slash, or the whole filename if there are no slashes.\nstd::string BaseFileName(const std::string &filename) {\n  // Lots of copies!  basename's behavior is less than ideal.\n  char *c_filename = strdup(filename.c_str());\n  std::string base = basename(c_filename);\n  free(c_filename);\n  return base;\n}\n\n}  // namespace\n\nnamespace google_breakpad {\n\n// Not explicitly exported, but not static so it can be used in unit tests.\n// Ideally obj_file would be const, but internally this code does write\n// to some ELF header fields to make its work simpler.\nbool WriteSymbolFileInternal(uint8_t* obj_file,\n                             const std::string &obj_filename,\n                             const std::string &debug_dir,\n                             bool cfi,\n                             std::ostream &sym_stream) {\n  ElfW(Ehdr) *elf_header = reinterpret_cast<ElfW(Ehdr) *>(obj_file);\n\n  if (!IsValidElf(elf_header)) {\n    fprintf(stderr, \"Not a valid ELF file: %s\\n\", obj_filename.c_str());\n    return false;\n  }\n\n  unsigned char identifier[16];\n  if (!google_breakpad::FileID::ElfFileIdentifierFromMappedFile(elf_header,\n                                                                identifier)) {\n    fprintf(stderr, \"%s: unable to generate file identifier\\n\",\n            obj_filename.c_str());\n    return false;\n  }\n\n  const char *architecture = ElfArchitecture(elf_header);\n  if (!architecture) {\n    fprintf(stderr, \"%s: unrecognized ELF machine architecture: %d\\n\",\n            obj_filename.c_str(), elf_header->e_machine);\n    return false;\n  }\n\n  // Figure out what endianness this file is.\n  bool big_endian;\n  if (!ElfEndianness(elf_header, &big_endian))\n    return false;\n\n  std::string name = BaseFileName(obj_filename);\n  std::string os = \"Linux\";\n  std::string id = FormatIdentifier(identifier);\n\n  LoadSymbolsInfo info(debug_dir);\n  Module module(name, os, architecture, id);\n  if (!LoadSymbols(obj_filename, big_endian, elf_header, !debug_dir.empty(),\n                   &info, &module)) {\n    const std::string debuglink_file = info.debuglink_file();\n    if (debuglink_file.empty())\n      return false;\n\n    // Load debuglink ELF file.\n    fprintf(stderr, \"Found debugging info in %s\\n\", debuglink_file.c_str());\n    MmapWrapper debug_map_wrapper;\n    ElfW(Ehdr) *debug_elf_header = NULL;\n    if (!LoadELF(debuglink_file, &debug_map_wrapper, &debug_elf_header))\n      return false;\n    // Sanity checks to make sure everything matches up.\n    const char *debug_architecture = ElfArchitecture(debug_elf_header);\n    if (!debug_architecture) {\n      fprintf(stderr, \"%s: unrecognized ELF machine architecture: %d\\n\",\n              debuglink_file.c_str(), debug_elf_header->e_machine);\n      return false;\n    }\n    if (strcmp(architecture, debug_architecture)) {\n      fprintf(stderr, \"%s with ELF machine architecture %s does not match \"\n              \"%s with ELF architecture %s\\n\",\n              debuglink_file.c_str(), debug_architecture,\n              obj_filename.c_str(), architecture);\n      return false;\n    }\n\n    bool debug_big_endian;\n    if (!ElfEndianness(debug_elf_header, &debug_big_endian))\n      return false;\n    if (debug_big_endian != big_endian) {\n      fprintf(stderr, \"%s and %s does not match in endianness\\n\",\n              obj_filename.c_str(), debuglink_file.c_str());\n      return false;\n    }\n\n    if (!LoadSymbols(debuglink_file, debug_big_endian, debug_elf_header,\n                     false, &info, &module)) {\n      return false;\n    }\n  }\n  if (!module.Write(sym_stream, cfi))\n    return false;\n\n  return true;\n}\n\nbool WriteSymbolFile(const std::string &obj_file,\n                     const std::string &debug_dir,\n                     bool cfi,\n                     std::ostream &sym_stream) {\n  MmapWrapper map_wrapper;\n  ElfW(Ehdr) *elf_header = NULL;\n  if (!LoadELF(obj_file, &map_wrapper, &elf_header))\n    return false;\n\n  return WriteSymbolFileInternal(reinterpret_cast<uint8_t*>(elf_header),\n                                 obj_file, debug_dir, cfi, sym_stream);\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/dump_symbols.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// dump_symbols.h: Read debugging information from an ELF file, and write\n// it out as a Breakpad symbol file.\n\n#ifndef COMMON_LINUX_DUMP_SYMBOLS_H__\n#define COMMON_LINUX_DUMP_SYMBOLS_H__\n\n#include <iostream>\n#include <string>\n\nnamespace google_breakpad {\n\n// Find all the debugging information in OBJ_FILE, an ELF executable\n// or shared library, and write it to SYM_STREAM in the Breakpad symbol\n// file format.\n// If OBJ_FILE has been stripped but contains a .gnu_debuglink section,\n// then look for the debug file in DEBUG_DIR.\n// If CFI is set to false, then omit the CFI section.\nbool WriteSymbolFile(const std::string &obj_file,\n                     const std::string &debug_dir,\n                     bool cfi,\n                     std::ostream &sym_stream);\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_LINUX_DUMP_SYMBOLS_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/dump_symbols_unittest.cc",
    "content": "// Copyright (c) 2011 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Ted Mielczarek <ted.mielczarek@gmail.com>\n\n// dump_symbols_unittest.cc:\n// Unittests for google_breakpad::DumpSymbols\n\n#include <elf.h>\n#include <link.h>\n#include <stdio.h>\n\n#include <sstream>\n#include <string>\n#include <vector>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/linux/synth_elf.h\"\n\nnamespace google_breakpad {\nbool WriteSymbolFileInternal(uint8_t* obj_file,\n                             const std::string &obj_filename,\n                             const std::string &debug_dir,\n                             bool cfi,\n                             std::ostream &sym_stream);\n}\n\nusing google_breakpad::synth_elf::ELF;\nusing google_breakpad::synth_elf::StringTable;\nusing google_breakpad::synth_elf::SymbolTable;\nusing google_breakpad::test_assembler::kLittleEndian;\nusing google_breakpad::test_assembler::Section;\nusing google_breakpad::WriteSymbolFileInternal;\nusing std::string;\nusing std::stringstream;\nusing std::vector;\nusing ::testing::Test;\n\nclass DumpSymbols : public Test {\n public:\n  void GetElfContents(ELF& elf) {\n    string contents;\n    ASSERT_TRUE(elf.GetContents(&contents));\n    ASSERT_LT(0, contents.size());\n\n    elfdata_v.clear();\n    elfdata_v.insert(elfdata_v.begin(), contents.begin(), contents.end());\n    elfdata = &elfdata_v[0];\n  }\n\n  vector<uint8_t> elfdata_v;\n  uint8_t* elfdata;\n};\n\nTEST_F(DumpSymbols, Invalid) {\n  Elf32_Ehdr header;\n  memset(&header, 0, sizeof(header));\n  stringstream s;\n  EXPECT_FALSE(WriteSymbolFileInternal(reinterpret_cast<uint8_t*>(&header),\n                                       \"foo\",\n                                       \"\",\n                                       true,\n                                       s));\n}\n\n// TODO(ted): Fix the dump_symbols code to deal with cross-word-size\n// ELF files.\n#if __ELF_NATIVE_CLASS == 32\nTEST_F(DumpSymbols, SimplePublic32) {\n  ELF elf(EM_386, ELFCLASS32, kLittleEndian);\n  // Zero out text section for simplicity.\n  Section text(kLittleEndian);\n  text.Append(4096, 0);\n  elf.AddSection(\".text\", text, SHT_PROGBITS);\n\n  // Add a public symbol.\n  StringTable table(kLittleEndian);\n  SymbolTable syms(kLittleEndian, 4, table);\n  syms.AddSymbol(\"superfunc\", (uint32_t)0x1000, (uint32_t)0x10,\n                 ELF32_ST_INFO(STB_GLOBAL, STT_FUNC),\n                 SHN_UNDEF + 1);\n  int index = elf.AddSection(\".dynstr\", table, SHT_STRTAB);\n  elf.AddSection(\".dynsym\", syms,\n                 SHT_DYNSYM,          // type\n                 SHF_ALLOC,           // flags\n                 0,                   // addr\n                 index,               // link\n                 sizeof(Elf32_Sym));  // entsize\n\n  elf.Finish();\n  GetElfContents(elf);\n\n  stringstream s;\n  ASSERT_TRUE(WriteSymbolFileInternal(elfdata,\n                                      \"foo\",\n                                      \"\",\n                                      true,\n                                      s));\n  EXPECT_EQ(\"MODULE Linux x86 000000000000000000000000000000000 foo\\n\"\n            \"PUBLIC 1000 0 superfunc\\n\",\n            s.str());\n}\n#endif\n\n#if __ELF_NATIVE_CLASS == 64\nTEST_F(DumpSymbols, SimplePublic64) {\n  ELF elf(EM_X86_64, ELFCLASS64, kLittleEndian);\n  // Zero out text section for simplicity.\n  Section text(kLittleEndian);\n  text.Append(4096, 0);\n  elf.AddSection(\".text\", text, SHT_PROGBITS);\n\n  // Add a public symbol.\n  StringTable table(kLittleEndian);\n  SymbolTable syms(kLittleEndian, 8, table);\n  syms.AddSymbol(\"superfunc\", (uint64_t)0x1000, (uint64_t)0x10,\n                 ELF64_ST_INFO(STB_GLOBAL, STT_FUNC),\n                 SHN_UNDEF + 1);\n  int index = elf.AddSection(\".dynstr\", table, SHT_STRTAB);\n  elf.AddSection(\".dynsym\", syms,\n                 SHT_DYNSYM,          // type\n                 SHF_ALLOC,           // flags\n                 0,                   // addr\n                 index,               // link\n                 sizeof(Elf64_Sym));  // entsize\n\n  elf.Finish();\n  GetElfContents(elf);\n\n  stringstream s;\n  ASSERT_TRUE(WriteSymbolFileInternal(elfdata,\n                                      \"foo\",\n                                      \"\",\n                                      true,\n                                      s));\n  EXPECT_EQ(\"MODULE Linux x86_64 000000000000000000000000000000000 foo\\n\"\n            \"PUBLIC 1000 0 superfunc\\n\",\n            s.str());\n}\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/eintr_wrapper.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef COMMON_LINUX_EINTR_WRAPPER_H_\n#define COMMON_LINUX_EINTR_WRAPPER_H_\n\n#include <errno.h>\n\n// This provides a wrapper around system calls which may be interrupted by a\n// signal and return EINTR. See man 7 signal.\n//\n\n#define HANDLE_EINTR(x) ({ \\\n  typeof(x) __eintr_result__; \\\n  do { \\\n    __eintr_result__ = x; \\\n  } while (__eintr_result__ == -1 && errno == EINTR); \\\n  __eintr_result__;\\\n})\n\n#endif // ifndef COMMON_LINUX_EINTR_WRAPPER_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/elf_core_dump.cc",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// elf_core_dump.cc: Implement google_breakpad::ElfCoreDump.\n// See elf_core_dump.h for details.\n\n#include \"common/linux/elf_core_dump.h\"\n\n#include <stddef.h>\n#include <string.h>\n\nnamespace google_breakpad {\n\n// Implementation of ElfCoreDump::Note.\n\nElfCoreDump::Note::Note() {}\n\nElfCoreDump::Note::Note(const MemoryRange& content) : content_(content) {}\n\nbool ElfCoreDump::Note::IsValid() const {\n  return GetHeader() != NULL;\n}\n\nconst ElfCoreDump::Nhdr* ElfCoreDump::Note::GetHeader() const {\n  return content_.GetData<Nhdr>(0);\n}\n\nElfCoreDump::Word ElfCoreDump::Note::GetType() const {\n  const Nhdr* header = GetHeader();\n  // 0 is not being used as a NOTE type.\n  return header ? header->n_type : 0;\n}\n\nMemoryRange ElfCoreDump::Note::GetName() const {\n  const Nhdr* header = GetHeader();\n  if (header) {\n      return content_.Subrange(sizeof(Nhdr), header->n_namesz);\n  }\n  return MemoryRange();\n}\n\nMemoryRange ElfCoreDump::Note::GetDescription() const {\n  const Nhdr* header = GetHeader();\n  if (header) {\n    return content_.Subrange(AlignedSize(sizeof(Nhdr) + header->n_namesz),\n                             header->n_descsz);\n  }\n  return MemoryRange();\n}\n\nElfCoreDump::Note ElfCoreDump::Note::GetNextNote() const {\n  MemoryRange next_content;\n  const Nhdr* header = GetHeader();\n  if (header) {\n    size_t next_offset = AlignedSize(sizeof(Nhdr) + header->n_namesz);\n    next_offset = AlignedSize(next_offset + header->n_descsz);\n    next_content =\n        content_.Subrange(next_offset, content_.length() - next_offset);\n  }\n  return Note(next_content);\n}\n\n// static\nsize_t ElfCoreDump::Note::AlignedSize(size_t size) {\n  size_t mask = sizeof(Word) - 1;\n  return (size + mask) & ~mask;\n}\n\n\n// Implementation of ElfCoreDump.\n\nElfCoreDump::ElfCoreDump() {}\n\nElfCoreDump::ElfCoreDump(const MemoryRange& content)\n    : content_(content) {\n}\n\nvoid ElfCoreDump::SetContent(const MemoryRange& content) {\n  content_ = content;\n}\n\nbool ElfCoreDump::IsValid() const {\n  const Ehdr* header = GetHeader();\n  return (header &&\n          header->e_ident[0] == ELFMAG0 &&\n          header->e_ident[1] == ELFMAG1 &&\n          header->e_ident[2] == ELFMAG2 &&\n          header->e_ident[3] == ELFMAG3 &&\n          header->e_ident[4] == kClass &&\n          header->e_version == EV_CURRENT &&\n          header->e_type == ET_CORE);\n}\n\nconst ElfCoreDump::Ehdr* ElfCoreDump::GetHeader() const {\n  return content_.GetData<Ehdr>(0);\n}\n\nconst ElfCoreDump::Phdr* ElfCoreDump::GetProgramHeader(unsigned index) const {\n  const Ehdr* header = GetHeader();\n  if (header) {\n    return reinterpret_cast<const Phdr*>(content_.GetArrayElement(\n        header->e_phoff, header->e_phentsize, index));\n  }\n  return NULL;\n}\n\nconst ElfCoreDump::Phdr* ElfCoreDump::GetFirstProgramHeaderOfType(\n    Word type) const {\n  for (unsigned i = 0, n = GetProgramHeaderCount(); i < n; ++i) {\n    const Phdr* program = GetProgramHeader(i);\n    if (program->p_type == type) {\n      return program;\n    }\n  }\n  return NULL;\n}\n\nunsigned ElfCoreDump::GetProgramHeaderCount() const {\n  const Ehdr* header = GetHeader();\n  return header ? header->e_phnum : 0;\n}\n\nbool ElfCoreDump::CopyData(void* buffer, Addr virtual_address, size_t length) {\n  for (unsigned i = 0, n = GetProgramHeaderCount(); i < n; ++i) {\n    const Phdr* program = GetProgramHeader(i);\n    if (program->p_type != PT_LOAD)\n      continue;\n\n    size_t offset_in_segment = virtual_address - program->p_vaddr;\n    if (virtual_address >= program->p_vaddr &&\n        offset_in_segment < program->p_filesz) {\n      const void* data =\n          content_.GetData(program->p_offset + offset_in_segment, length);\n      if (data) {\n        memcpy(buffer, data, length);\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nElfCoreDump::Note ElfCoreDump::GetFirstNote() const {\n  MemoryRange note_content;\n  const Phdr* program_header = GetFirstProgramHeaderOfType(PT_NOTE);\n  if (program_header) {\n    note_content = content_.Subrange(program_header->p_offset,\n                                     program_header->p_filesz);\n  }\n  return Note(note_content);\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/elf_core_dump.h",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// elf_core_dump.h: Define the google_breakpad::ElfCoreDump class, which\n// encapsulates an ELF core dump file mapped into memory.\n\n#ifndef COMMON_LINUX_ELF_CORE_DUMP_H_\n#define COMMON_LINUX_ELF_CORE_DUMP_H_\n\n#include <elf.h>\n#if !defined(__ANDROID__)\n#include <link.h>\n#endif\n#include <stddef.h>\n\n#include \"common/memory_range.h\"\n#if defined(__ANDROID__)\n#include \"common/linux/android_link.h\"\n#endif\n\nnamespace google_breakpad {\n\n// A class encapsulating an ELF core dump file mapped into memory, which\n// provides methods for accessing program headers and the note section.\nclass ElfCoreDump {\n public:\n  // ELF types based on the value of __WORDSIZE.\n  typedef ElfW(Ehdr) Ehdr;\n  typedef ElfW(Nhdr) Nhdr;\n  typedef ElfW(Phdr) Phdr;\n  typedef ElfW(Word) Word;\n  typedef ElfW(Addr) Addr;\n#if __WORDSIZE == 32\n  static const int kClass = ELFCLASS32;\n#elif __WORDSIZE == 64\n  static const int kClass = ELFCLASS64;\n#else\n#error \"Unsupported __WORDSIZE for ElfCoreDump.\"\n#endif\n\n  // A class encapsulating the note content in a core dump, which provides\n  // methods for accessing the name and description of a note.\n  class Note {\n   public:\n    Note();\n\n    // Constructor that takes the note content from |content|.\n    explicit Note(const MemoryRange& content);\n\n    // Returns true if this note is valid, i,e. a note header is found in\n    // |content_|, or false otherwise.\n    bool IsValid() const;\n\n    // Returns the note header, or NULL if no note header is found in\n    // |content_|.\n    const Nhdr* GetHeader() const;\n\n    // Returns the note type, or 0 if no note header is found in |content_|.\n    Word GetType() const;\n\n    // Returns a memory range covering the note name, or an empty range\n    // if no valid note name is found in |content_|.\n    MemoryRange GetName() const;\n\n    // Returns a memory range covering the note description, or an empty\n    // range if no valid note description is found in |content_|.\n    MemoryRange GetDescription() const;\n\n    // Returns the note following this note, or an empty note if no valid\n    // note is found after this note.\n    Note GetNextNote() const;\n\n   private:\n    // Returns the size in bytes round up to the word alignment, specified\n    // for the note section, of a given size in bytes.\n    static size_t AlignedSize(size_t size);\n\n    // Note content.\n    MemoryRange content_;\n  };\n\n  ElfCoreDump();\n\n  // Constructor that takes the core dump content from |content|.\n  explicit ElfCoreDump(const MemoryRange& content);\n\n  // Sets the core dump content to |content|.\n  void SetContent(const MemoryRange& content);\n\n  // Returns true if a valid ELF header in the core dump, or false otherwise.\n  bool IsValid() const;\n\n  // Returns the ELF header in the core dump, or NULL if no ELF header\n  // is found in |content_|.\n  const Ehdr* GetHeader() const;\n\n  // Returns the |index|-th program header in the core dump, or NULL if no\n  // ELF header is found in |content_| or |index| is out of bounds.\n  const Phdr* GetProgramHeader(unsigned index) const;\n\n  // Returns the first program header of |type| in the core dump, or NULL if\n  // no ELF header is found in |content_| or no program header of |type| is\n  // found.\n  const Phdr* GetFirstProgramHeaderOfType(Word type) const;\n\n  // Returns the number of program headers in the core dump, or 0 if no\n  // ELF header is found in |content_|.\n  unsigned GetProgramHeaderCount() const;\n\n  // Copies |length| bytes of data starting at |virtual_address| in the core\n  // dump to |buffer|. |buffer| should be a valid pointer to a buffer of at\n  // least |length| bytes. Returns true if the data to be copied is found in\n  // the core dump, or false otherwise.\n  bool CopyData(void* buffer, Addr virtual_address, size_t length);\n\n  // Returns the first note found in the note section of the core dump, or\n  // an empty note if no note is found.\n  Note GetFirstNote() const;\n\n private:\n  // Core dump content.\n  MemoryRange content_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_LINUX_ELF_CORE_DUMP_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/elf_core_dump_unittest.cc",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// elf_core_dump_unittest.cc: Unit tests for google_breakpad::ElfCoreDump.\n\n#include <sys/procfs.h>\n\n#include <set>\n#include <string>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/linux/elf_core_dump.h\"\n#include \"common/linux/memory_mapped_file.h\"\n#include \"common/tests/file_utils.h\"\n#include \"common/linux/tests/crash_generator.h\"\n\nusing google_breakpad::AutoTempDir;\nusing google_breakpad::CrashGenerator;\nusing google_breakpad::ElfCoreDump;\nusing google_breakpad::MemoryMappedFile;\nusing google_breakpad::MemoryRange;\nusing google_breakpad::WriteFile;\nusing std::set;\nusing std::string;\n\nTEST(ElfCoreDumpTest, DefaultConstructor) {\n  ElfCoreDump core;\n  EXPECT_FALSE(core.IsValid());\n  EXPECT_EQ(NULL, core.GetHeader());\n  EXPECT_EQ(0, core.GetProgramHeaderCount());\n  EXPECT_EQ(NULL, core.GetProgramHeader(0));\n  EXPECT_EQ(NULL, core.GetFirstProgramHeaderOfType(PT_LOAD));\n  EXPECT_FALSE(core.GetFirstNote().IsValid());\n}\n\nTEST(ElfCoreDumpTest, TestElfHeader) {\n  ElfCoreDump::Ehdr header;\n  memset(&header, 0, sizeof(header));\n\n  AutoTempDir temp_dir;\n  string core_path = temp_dir.path() + \"/core\";\n  const char* core_file = core_path.c_str();\n  MemoryMappedFile mapped_core_file;\n  ElfCoreDump core;\n\n  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header) - 1));\n  ASSERT_TRUE(mapped_core_file.Map(core_file));\n  core.SetContent(mapped_core_file.content());\n  EXPECT_FALSE(core.IsValid());\n  EXPECT_EQ(NULL, core.GetHeader());\n  EXPECT_EQ(0, core.GetProgramHeaderCount());\n  EXPECT_EQ(NULL, core.GetProgramHeader(0));\n  EXPECT_EQ(NULL, core.GetFirstProgramHeaderOfType(PT_LOAD));\n  EXPECT_FALSE(core.GetFirstNote().IsValid());\n\n  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));\n  ASSERT_TRUE(mapped_core_file.Map(core_file));\n  core.SetContent(mapped_core_file.content());\n  EXPECT_FALSE(core.IsValid());\n\n  header.e_ident[0] = ELFMAG0;\n  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));\n  ASSERT_TRUE(mapped_core_file.Map(core_file));\n  core.SetContent(mapped_core_file.content());\n  EXPECT_FALSE(core.IsValid());\n\n  header.e_ident[1] = ELFMAG1;\n  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));\n  ASSERT_TRUE(mapped_core_file.Map(core_file));\n  core.SetContent(mapped_core_file.content());\n  EXPECT_FALSE(core.IsValid());\n\n  header.e_ident[2] = ELFMAG2;\n  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));\n  ASSERT_TRUE(mapped_core_file.Map(core_file));\n  core.SetContent(mapped_core_file.content());\n  EXPECT_FALSE(core.IsValid());\n\n  header.e_ident[3] = ELFMAG3;\n  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));\n  ASSERT_TRUE(mapped_core_file.Map(core_file));\n  core.SetContent(mapped_core_file.content());\n  EXPECT_FALSE(core.IsValid());\n\n  header.e_ident[4] = ElfCoreDump::kClass;\n  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));\n  ASSERT_TRUE(mapped_core_file.Map(core_file));\n  core.SetContent(mapped_core_file.content());\n  EXPECT_FALSE(core.IsValid());\n\n  header.e_version = EV_CURRENT;\n  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));\n  ASSERT_TRUE(mapped_core_file.Map(core_file));\n  core.SetContent(mapped_core_file.content());\n  EXPECT_FALSE(core.IsValid());\n\n  header.e_type = ET_CORE;\n  ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));\n  ASSERT_TRUE(mapped_core_file.Map(core_file));\n  core.SetContent(mapped_core_file.content());\n  EXPECT_TRUE(core.IsValid());\n}\n\nTEST(ElfCoreDumpTest, ValidCoreFile) {\n  CrashGenerator crash_generator;\n  if (!crash_generator.HasDefaultCorePattern()) {\n    fprintf(stderr, \"ElfCoreDumpTest.ValidCoreFile test is skipped \"\n            \"due to non-default core pattern\");\n    return;\n  }\n\n  const unsigned kNumOfThreads = 3;\n  const unsigned kCrashThread = 1;\n  const int kCrashSignal = SIGABRT;\n  // TODO(benchan): Revert to use ASSERT_TRUE once the flakiness in\n  // CrashGenerator is identified and fixed.\n  if (!crash_generator.CreateChildCrash(kNumOfThreads, kCrashThread,\n                                        kCrashSignal, NULL)) {\n    fprintf(stderr, \"ElfCoreDumpTest.ValidCoreFile test is skipped \"\n            \"due to no core dump generated\");\n    return;\n  }\n  pid_t expected_crash_thread_id = crash_generator.GetThreadId(kCrashThread);\n  set<pid_t> expected_thread_ids;\n  for (unsigned i = 0; i < kNumOfThreads; ++i) {\n    expected_thread_ids.insert(crash_generator.GetThreadId(i));\n  }\n\n  MemoryMappedFile mapped_core_file;\n  ASSERT_TRUE(mapped_core_file.Map(crash_generator.GetCoreFilePath().c_str()));\n\n  ElfCoreDump core;\n  core.SetContent(mapped_core_file.content());\n  EXPECT_TRUE(core.IsValid());\n\n  // Based on write_note_info() in linux/kernel/fs/binfmt_elf.c, notes are\n  // ordered as follows (NT_PRXFPREG and NT_386_TLS are i386 specific):\n  //   Thread           Name          Type\n  //   -------------------------------------------------------------------\n  //   1st thread       CORE          NT_PRSTATUS\n  //   process-wide     CORE          NT_PRPSINFO\n  //   process-wide     CORE          NT_AUXV\n  //   1st thread       CORE          NT_FPREGSET\n  //   1st thread       LINUX         NT_PRXFPREG\n  //   1st thread       LINUX         NT_386_TLS\n  //\n  //   2nd thread       CORE          NT_PRSTATUS\n  //   2nd thread       CORE          NT_FPREGSET\n  //   2nd thread       LINUX         NT_PRXFPREG\n  //   2nd thread       LINUX         NT_386_TLS\n  //\n  //   3rd thread       CORE          NT_PRSTATUS\n  //   3rd thread       CORE          NT_FPREGSET\n  //   3rd thread       LINUX         NT_PRXFPREG\n  //   3rd thread       LINUX         NT_386_TLS\n\n  size_t num_nt_prpsinfo = 0;\n  size_t num_nt_prstatus = 0;\n  size_t num_nt_fpregset = 0;\n  size_t num_nt_prxfpreg = 0;\n  set<pid_t> actual_thread_ids;\n  ElfCoreDump::Note note = core.GetFirstNote();\n  while (note.IsValid()) {\n    MemoryRange name = note.GetName();\n    MemoryRange description = note.GetDescription();\n    EXPECT_FALSE(name.IsEmpty());\n    EXPECT_FALSE(description.IsEmpty());\n\n    switch (note.GetType()) {\n      case NT_PRPSINFO: {\n        EXPECT_TRUE(description.data() != NULL);\n        EXPECT_EQ(sizeof(elf_prpsinfo), description.length());\n        ++num_nt_prpsinfo;\n        break;\n      }\n      case NT_PRSTATUS: {\n        EXPECT_TRUE(description.data() != NULL);\n        EXPECT_EQ(sizeof(elf_prstatus), description.length());\n        const elf_prstatus* status = description.GetData<elf_prstatus>(0);\n        actual_thread_ids.insert(status->pr_pid);\n        if (num_nt_prstatus == 0) {\n          EXPECT_EQ(expected_crash_thread_id, status->pr_pid);\n          EXPECT_EQ(kCrashSignal, status->pr_info.si_signo);\n        }\n        ++num_nt_prstatus;\n        break;\n      }\n#if defined(__i386) || defined(__x86_64)\n      case NT_FPREGSET: {\n        EXPECT_TRUE(description.data() != NULL);\n        EXPECT_EQ(sizeof(user_fpregs_struct), description.length());\n        ++num_nt_fpregset;\n        break;\n      }\n#endif\n#if defined(__i386)\n      case NT_PRXFPREG: {\n        EXPECT_TRUE(description.data() != NULL);\n        EXPECT_EQ(sizeof(user_fpxregs_struct), description.length());\n        ++num_nt_prxfpreg;\n        break;\n      }\n#endif\n      default:\n        break;\n    }\n    note = note.GetNextNote();\n  }\n\n  EXPECT_TRUE(expected_thread_ids == actual_thread_ids);\n  EXPECT_EQ(1, num_nt_prpsinfo);\n  EXPECT_EQ(kNumOfThreads, num_nt_prstatus);\n#if defined(__i386) || defined(__x86_64)\n  EXPECT_EQ(kNumOfThreads, num_nt_fpregset);\n#endif\n#if defined(__i386)\n  EXPECT_EQ(kNumOfThreads, num_nt_prxfpreg);\n#endif\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/elf_symbols_to_module.cc",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2011 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Ted Mielczarek <ted.mielczarek@gmail.com>\n\n#include \"common/linux/elf_symbols_to_module.h\"\n\n#include <elf.h>\n#include <string.h>\n\n#include \"common/byte_cursor.h\"\n#include \"common/module.h\"\n\nnamespace google_breakpad {\n\nclass ELFSymbolIterator {\npublic:\n  // The contents of an ELF symbol, adjusted for the host's endianness,\n  // word size, and so on. Corresponds to the data in Elf32_Sym / Elf64_Sym.\n  struct Symbol {\n    // True if this iterator has reached the end of the symbol array. When\n    // this is set, the other members of this structure are not valid.\n    bool at_end;\n\n    // The number of this symbol within the list.\n    size_t index;\n\n    // The current symbol's name offset. This is the offset within the\n    // string table.\n    size_t name_offset;\n\n    // The current symbol's value, size, info and shndx fields.\n    uint64_t value;\n    uint64_t size;\n    unsigned char info;\n    uint16_t shndx;\n  };\n\n  // Create an ELFSymbolIterator walking the symbols in BUFFER. Treat the\n  // symbols as big-endian if BIG_ENDIAN is true, as little-endian\n  // otherwise. Assume each symbol has a 'value' field whose size is\n  // VALUE_SIZE.\n  //\n  ELFSymbolIterator(const ByteBuffer *buffer, bool big_endian,\n                    size_t value_size)\n    : value_size_(value_size), cursor_(buffer, big_endian) {\n    // Actually, weird sizes could be handled just fine, but they're\n    // probably mistakes --- expressed in bits, say.\n    assert(value_size == 4 || value_size == 8);\n    symbol_.index = 0;\n    Fetch();\n  }\n\n  // Move to the next symbol. This function's behavior is undefined if\n  // at_end() is true when it is called.\n  ELFSymbolIterator &operator++() { Fetch(); symbol_.index++; return *this; }\n\n  // Dereferencing this iterator produces a reference to an Symbol structure\n  // that holds the current symbol's values. The symbol is owned by this\n  // SymbolIterator, and will be invalidated at the next call to operator++.\n  const Symbol &operator*() const { return symbol_; }\n  const Symbol *operator->() const { return &symbol_; }\n\nprivate:\n  // Read the symbol at cursor_, and set symbol_ appropriately.\n  void Fetch() {\n    // Elf32_Sym and Elf64_Sym have different layouts.\n    unsigned char other;\n    if (value_size_ == 4) {\n      // Elf32_Sym\n      cursor_\n        .Read(4, false, &symbol_.name_offset)\n        .Read(4, false, &symbol_.value)\n        .Read(4, false, &symbol_.size)\n        .Read(1, false, &symbol_.info)\n        .Read(1, false, &other)\n        .Read(2, false, &symbol_.shndx);\n    } else {\n      // Elf64_Sym\n      cursor_\n        .Read(4, false, &symbol_.name_offset)\n        .Read(1, false, &symbol_.info)\n        .Read(1, false, &other)\n        .Read(2, false, &symbol_.shndx)\n        .Read(8, false, &symbol_.value)\n        .Read(8, false, &symbol_.size);\n    }\n    symbol_.at_end = !cursor_;\n  }\n\n  // The size of symbols' value field, in bytes.\n  size_t value_size_;\n\n  // A byte cursor traversing buffer_.\n  ByteCursor cursor_;\n\n  // Values for the symbol this iterator refers to.\n  Symbol symbol_;\n};\n\nconst char *SymbolString(ptrdiff_t offset, ByteBuffer& strings) {\n  if (offset < 0 || (size_t) offset >= strings.Size()) {\n    // Return the null string.\n    offset = 0;\n  }\n  return reinterpret_cast<const char *>(strings.start + offset);\n}\n\nbool ELFSymbolsToModule(const uint8_t *symtab_section,\n                        size_t symtab_size,\n                        const uint8_t *string_section,\n                        size_t string_size,\n                        const bool big_endian,\n                        size_t value_size,\n                        Module *module) {\n  ByteBuffer symbols(symtab_section, symtab_size);\n  // Ensure that the string section is null-terminated.\n  if (string_section[string_size - 1] != '\\0') {\n    const void* null_terminator = memrchr(string_section, '\\0', string_size);\n    string_size = reinterpret_cast<const uint8_t*>(null_terminator)\n      - string_section;\n  }\n  ByteBuffer strings(string_section, string_size);\n\n  // The iterator walking the symbol table.\n  ELFSymbolIterator iterator(&symbols, big_endian, value_size);\n\n  while(!iterator->at_end) {\n    if (ELF32_ST_TYPE(iterator->info) == STT_FUNC &&\n        iterator->shndx != SHN_UNDEF) {\n      Module::Extern *ext = new Module::Extern;\n      ext->name = SymbolString(iterator->name_offset, strings);\n      ext->address = iterator->value;\n      module->AddExtern(ext);\n    }\n    ++iterator;\n  }\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/elf_symbols_to_module.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2011 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Ted Mielczarek <ted.mielczarek@gmail.com>\n\n// elf_symbols_to_module.h: Exposes ELFSymbolsToModule, a function\n// for reading ELF symbol tables and inserting exported symbol names\n// into a google_breakpad::Module as Extern definitions.\n\n#ifndef BREAKPAD_COMMON_LINUX_ELF_SYMBOLS_TO_MODULE_H_\n#define BREAKPAD_COMMON_LINUX_ELF_SYMBOLS_TO_MODULE_H_\n\n#include <stddef.h>\n#include <stdint.h>\n\nnamespace google_breakpad {\n\nclass Module;\n\nbool ELFSymbolsToModule(const uint8_t *symtab_section,\n                        size_t symtab_size,\n                        const uint8_t *string_section,\n                        size_t string_size,\n                        const bool big_endian,\n                        size_t value_size,\n                        Module *module);\n\n}  // namespace google_breakpad\n\n\n#endif  // BREAKPAD_COMMON_LINUX_ELF_SYMBOLS_TO_MODULE_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/elf_symbols_to_module_unittest.cc",
    "content": "// Copyright (c) 2011 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Ted Mielczarek <ted.mielczarek@gmail.com>\n\n// elf_symbols_to_module_unittest.cc:\n// Unittests for google_breakpad::ELFSymbolsToModule\n\n#include <elf.h>\n\n#include <string>\n#include <vector>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/linux/elf_symbols_to_module.h\"\n#include \"common/linux/synth_elf.h\"\n#include \"common/module.h\"\n#include \"common/test_assembler.h\"\n\nusing google_breakpad::Module;\nusing google_breakpad::synth_elf::StringTable;\nusing google_breakpad::test_assembler::Endianness;\nusing google_breakpad::test_assembler::kBigEndian;\nusing google_breakpad::test_assembler::kLittleEndian;\nusing google_breakpad::test_assembler::Label;\nusing google_breakpad::test_assembler::Section;\nusing ::testing::Test;\nusing ::testing::TestWithParam;\nusing std::string;\nusing std::vector;\n\nclass ELFSymbolsToModuleTestFixture {\npublic:\n  ELFSymbolsToModuleTestFixture(Endianness endianness,\n                                size_t value_size) : module(\"a\", \"b\", \"c\", \"d\"),\n                                                     section(endianness),\n                                                     table(endianness),\n                                                     value_size(value_size) {}\n\n  bool ProcessSection() {\n    string section_contents, table_contents;\n    section.GetContents(&section_contents);\n    table.GetContents(&table_contents);\n\n    bool ret = ELFSymbolsToModule(reinterpret_cast<const uint8_t*>(section_contents.data()),\n                                  section_contents.size(),\n                                  reinterpret_cast<const uint8_t*>(table_contents.data()),\n                                  table_contents.size(),\n                                  section.endianness() == kBigEndian,\n                                  value_size,\n                                  &module);\n    module.GetExterns(&externs, externs.end());\n    return ret;\n  }\n\n  Module module;\n  Section section;\n  StringTable table;\n  string section_contents;\n  // 4 or 8 (bytes)\n  size_t value_size;\n\n  vector<Module::Extern *> externs;\n};\n\nclass ELFSymbolsToModuleTest32 : public ELFSymbolsToModuleTestFixture,\n                                   public TestWithParam<Endianness>  {\npublic:\n  ELFSymbolsToModuleTest32() : ELFSymbolsToModuleTestFixture(GetParam(), 4) {}\n\n  void AddElf32Sym(const string& name, uint32_t value,\n                   uint32_t size, unsigned info, uint16_t shndx) {\n    section\n      .D32(table.Add(name))\n      .D32(value)\n      .D32(size)\n      .D8(info)\n      .D8(0) // other\n      .D16(shndx);\n  }\n};\n\nTEST_P(ELFSymbolsToModuleTest32, NoFuncs) {\n  ProcessSection();\n\n  ASSERT_EQ((size_t)0, externs.size());\n}\n\nTEST_P(ELFSymbolsToModuleTest32, OneFunc) {\n  const string kFuncName = \"superfunc\";\n  const uint32_t kFuncAddr = 0x1000;\n  const uint32_t kFuncSize = 0x10;\n\n  AddElf32Sym(kFuncName, kFuncAddr, kFuncSize,\n              ELF32_ST_INFO(STB_GLOBAL, STT_FUNC),\n              // Doesn't really matter, just can't be SHN_UNDEF.\n              SHN_UNDEF + 1);\n\n  ProcessSection();\n\n  ASSERT_EQ((size_t)1, externs.size());\n  Module::Extern *extern1 = externs[0];\n  EXPECT_EQ(kFuncName, extern1->name);\n  EXPECT_EQ((Module::Address)kFuncAddr, extern1->address);\n}\n\nTEST_P(ELFSymbolsToModuleTest32, NameOutOfBounds) {\n  const string kFuncName = \"\";\n  const uint32_t kFuncAddr = 0x1000;\n  const uint32_t kFuncSize = 0x10;\n\n  table.Add(\"Foo\");\n  table.Add(\"Bar\");\n  // Can't use AddElf32Sym because it puts in a valid string offset.\n  section\n    .D32((uint32_t)table.Here().Value() + 1)\n    .D32(kFuncAddr)\n    .D32(kFuncSize)\n    .D8(ELF32_ST_INFO(STB_GLOBAL, STT_FUNC))\n    .D8(0) // other\n    .D16(SHN_UNDEF + 1);\n\n  ProcessSection();\n\n  ASSERT_EQ((size_t)1, externs.size());\n  Module::Extern *extern1 = externs[0];\n  EXPECT_EQ(kFuncName, extern1->name);\n  EXPECT_EQ((Module::Address)kFuncAddr, extern1->address);\n}\n\nTEST_P(ELFSymbolsToModuleTest32, NonTerminatedStringTable) {\n  const string kFuncName = \"\";\n  const uint32_t kFuncAddr = 0x1000;\n  const uint32_t kFuncSize = 0x10;\n\n  table.Add(\"Foo\");\n  table.Add(\"Bar\");\n  // Add a non-null-terminated string to the end of the string table\n  Label l;\n  table\n    .Mark(&l)\n    .Append(\"Unterminated\");\n  // Can't use AddElf32Sym because it puts in a valid string offset.\n  section\n    .D32((uint32_t)l.Value())\n    .D32(kFuncAddr)\n    .D32(kFuncSize)\n    .D8(ELF32_ST_INFO(STB_GLOBAL, STT_FUNC))\n    .D8(0) // other\n    .D16(SHN_UNDEF + 1);\n\n  ProcessSection();\n\n  ASSERT_EQ((size_t)1, externs.size());\n  Module::Extern *extern1 = externs[0];\n  EXPECT_EQ(kFuncName, extern1->name);\n  EXPECT_EQ((Module::Address)kFuncAddr, extern1->address);\n}\n\nTEST_P(ELFSymbolsToModuleTest32, MultipleFuncs) {\n  const string kFuncName1 = \"superfunc\";\n  const uint32_t kFuncAddr1 = 0x10001000;\n  const uint32_t kFuncSize1 = 0x10;\n  const string kFuncName2 = \"awesomefunc\";\n  const uint32_t kFuncAddr2 = 0x20002000;\n  const uint32_t kFuncSize2 = 0x2f;\n  const string kFuncName3 = \"megafunc\";\n  const uint32_t kFuncAddr3 = 0x30003000;\n  const uint32_t kFuncSize3 = 0x3c;\n\n  AddElf32Sym(kFuncName1, kFuncAddr1, kFuncSize1,\n              ELF32_ST_INFO(STB_GLOBAL, STT_FUNC),\n              // Doesn't really matter, just can't be SHN_UNDEF.\n              SHN_UNDEF + 1);\n  AddElf32Sym(kFuncName2, kFuncAddr2, kFuncSize2,\n              ELF32_ST_INFO(STB_LOCAL, STT_FUNC),\n              // Doesn't really matter, just can't be SHN_UNDEF.\n              SHN_UNDEF + 2);\n  AddElf32Sym(kFuncName3, kFuncAddr3, kFuncSize3,\n              ELF32_ST_INFO(STB_LOCAL, STT_FUNC),\n              // Doesn't really matter, just can't be SHN_UNDEF.\n              SHN_UNDEF + 3);\n\n  ProcessSection();\n\n  ASSERT_EQ((size_t)3, externs.size());\n  Module::Extern *extern1 = externs[0];\n  EXPECT_EQ(kFuncName1, extern1->name);\n  EXPECT_EQ((Module::Address)kFuncAddr1, extern1->address);\n  Module::Extern *extern2 = externs[1];\n  EXPECT_EQ(kFuncName2, extern2->name);\n  EXPECT_EQ((Module::Address)kFuncAddr2, extern2->address);\n  Module::Extern *extern3 = externs[2];\n  EXPECT_EQ(kFuncName3, extern3->name);\n  EXPECT_EQ((Module::Address)kFuncAddr3, extern3->address);\n}\n\nTEST_P(ELFSymbolsToModuleTest32, SkipStuff) {\n  const string kFuncName = \"superfunc\";\n  const uint32_t kFuncAddr = 0x1000;\n  const uint32_t kFuncSize = 0x10;\n\n  // Should skip functions in SHN_UNDEF\n  AddElf32Sym(\"skipme\", 0xFFFF, 0x10,\n              ELF32_ST_INFO(STB_GLOBAL, STT_FUNC),\n              SHN_UNDEF);\n  AddElf32Sym(kFuncName, kFuncAddr, kFuncSize,\n              ELF32_ST_INFO(STB_GLOBAL, STT_FUNC),\n              // Doesn't really matter, just can't be SHN_UNDEF.\n              SHN_UNDEF + 1);\n  // Should skip non-STT_FUNC entries.\n  AddElf32Sym(\"skipmetoo\", 0xAAAA, 0x10,\n              ELF32_ST_INFO(STB_GLOBAL, STT_FILE),\n              SHN_UNDEF + 1);\n\n  ProcessSection();\n\n  ASSERT_EQ((size_t)1, externs.size());\n  Module::Extern *extern1 = externs[0];\n  EXPECT_EQ(kFuncName, extern1->name);\n  EXPECT_EQ((Module::Address)kFuncAddr, extern1->address);\n}\n\n// Run all the 32-bit tests with both endianness\nINSTANTIATE_TEST_CASE_P(Endian,\n                        ELFSymbolsToModuleTest32,\n                        ::testing::Values(kLittleEndian, kBigEndian));\n\n// Similar tests, but with 64-bit values. Ostensibly this could be\n// shoehorned into the parameterization by using ::testing::Combine,\n// but that would make it difficult to get the types right since these\n// actual test cases aren't parameterized. This could also be written\n// as a type-parameterized test, but combining that with a value-parameterized\n// test seemed really ugly, and also makes it harder to test 64-bit\n// values.\nclass ELFSymbolsToModuleTest64 : public ELFSymbolsToModuleTestFixture,\n                                 public TestWithParam<Endianness>  {\npublic:\n  ELFSymbolsToModuleTest64() : ELFSymbolsToModuleTestFixture(GetParam(), 8) {}\n\n  void AddElf64Sym(const string& name, uint64_t value,\n                   uint64_t size, unsigned info, uint16_t shndx) {\n    section\n      .D32(table.Add(name))\n      .D8(info)\n      .D8(0) // other\n      .D16(shndx)\n      .D64(value)\n      .D64(size);\n  }\n};\n\nTEST_P(ELFSymbolsToModuleTest64, NoFuncs) {\n  ProcessSection();\n\n  ASSERT_EQ((size_t)0, externs.size());\n}\n\nTEST_P(ELFSymbolsToModuleTest64, OneFunc) {\n  const string kFuncName = \"superfunc\";\n  const uint64_t kFuncAddr = 0x1000200030004000ULL;\n  const uint64_t kFuncSize = 0x1000;\n\n  AddElf64Sym(kFuncName, kFuncAddr, kFuncSize,\n              ELF64_ST_INFO(STB_GLOBAL, STT_FUNC),\n              // Doesn't really matter, just can't be SHN_UNDEF.\n              SHN_UNDEF + 1);\n\n  ProcessSection();\n\n  ASSERT_EQ((size_t)1, externs.size());\n  Module::Extern *extern1 = externs[0];\n  EXPECT_EQ(kFuncName, extern1->name);\n  EXPECT_EQ((Module::Address)kFuncAddr, extern1->address);\n}\n\nTEST_P(ELFSymbolsToModuleTest64, MultipleFuncs) {\n  const string kFuncName1 = \"superfunc\";\n  const uint64_t kFuncAddr1 = 0x1000100010001000ULL;\n  const uint64_t kFuncSize1 = 0x1000;\n  const string kFuncName2 = \"awesomefunc\";\n  const uint64_t kFuncAddr2 = 0x2000200020002000ULL;\n  const uint64_t kFuncSize2 = 0x2f00;\n  const string kFuncName3 = \"megafunc\";\n  const uint64_t kFuncAddr3 = 0x3000300030003000ULL;\n  const uint64_t kFuncSize3 = 0x3c00;\n\n  AddElf64Sym(kFuncName1, kFuncAddr1, kFuncSize1,\n              ELF64_ST_INFO(STB_GLOBAL, STT_FUNC),\n              // Doesn't really matter, just can't be SHN_UNDEF.\n              SHN_UNDEF + 1);\n  AddElf64Sym(kFuncName2, kFuncAddr2, kFuncSize2,\n              ELF64_ST_INFO(STB_LOCAL, STT_FUNC),\n              // Doesn't really matter, just can't be SHN_UNDEF.\n              SHN_UNDEF + 2);\n  AddElf64Sym(kFuncName3, kFuncAddr3, kFuncSize3,\n              ELF64_ST_INFO(STB_LOCAL, STT_FUNC),\n              // Doesn't really matter, just can't be SHN_UNDEF.\n              SHN_UNDEF + 3);\n\n  ProcessSection();\n\n  ASSERT_EQ((size_t)3, externs.size());\n  Module::Extern *extern1 = externs[0];\n  EXPECT_EQ(kFuncName1, extern1->name);\n  EXPECT_EQ((Module::Address)kFuncAddr1, extern1->address);\n  Module::Extern *extern2 = externs[1];\n  EXPECT_EQ(kFuncName2, extern2->name);\n  EXPECT_EQ((Module::Address)kFuncAddr2, extern2->address);\n  Module::Extern *extern3 = externs[2];\n  EXPECT_EQ(kFuncName3, extern3->name);\n  EXPECT_EQ((Module::Address)kFuncAddr3, extern3->address);\n}\n\nTEST_P(ELFSymbolsToModuleTest64, SkipStuff) {\n  const string kFuncName = \"superfunc\";\n  const uint64_t kFuncAddr = 0x1000100010001000ULL;\n  const uint64_t kFuncSize = 0x1000;\n\n  // Should skip functions in SHN_UNDEF\n  AddElf64Sym(\"skipme\", 0xFFFF, 0x10,\n              ELF64_ST_INFO(STB_GLOBAL, STT_FUNC),\n              SHN_UNDEF);\n  AddElf64Sym(kFuncName, kFuncAddr, kFuncSize,\n              ELF64_ST_INFO(STB_GLOBAL, STT_FUNC),\n              // Doesn't really matter, just can't be SHN_UNDEF.\n              SHN_UNDEF + 1);\n  // Should skip non-STT_FUNC entries.\n  AddElf64Sym(\"skipmetoo\", 0xAAAA, 0x10,\n              ELF64_ST_INFO(STB_GLOBAL, STT_FILE),\n              SHN_UNDEF + 1);\n\n  ProcessSection();\n\n  ASSERT_EQ((size_t)1, externs.size());\n  Module::Extern *extern1 = externs[0];\n  EXPECT_EQ(kFuncName, extern1->name);\n  EXPECT_EQ((Module::Address)kFuncAddr, extern1->address);\n}\n\n// Run all the 64-bit tests with both endianness\nINSTANTIATE_TEST_CASE_P(Endian,\n                        ELFSymbolsToModuleTest64,\n                        ::testing::Values(kLittleEndian, kBigEndian));\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/file_id.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// file_id.cc: Return a unique identifier for a file\n//\n// See file_id.h for documentation\n//\n\n#include \"common/linux/file_id.h\"\n\n#include <arpa/inet.h>\n#include <assert.h>\n#if defined(__ANDROID__)\n#include <linux/elf.h>\n#include \"client/linux/android_link.h\"\n#else\n#include <elf.h>\n#include <link.h>\n#endif\n#include <string.h>\n\n#include <algorithm>\n\n#include \"common/linux/linux_libc_support.h\"\n#include \"common/linux/memory_mapped_file.h\"\n#include \"third_party/lss/linux_syscall_support.h\"\n\nnamespace google_breakpad {\n\n#ifndef NT_GNU_BUILD_ID\n#define NT_GNU_BUILD_ID 3\n#endif\n\nFileID::FileID(const char* path) {\n  strncpy(path_, path, sizeof(path_));\n}\n\nstruct ElfClass32 {\n  typedef Elf32_Ehdr Ehdr;\n  typedef Elf32_Nhdr Nhdr;\n  typedef Elf32_Shdr Shdr;\n  static const int kClass = ELFCLASS32;\n};\n\nstruct ElfClass64 {\n  typedef Elf64_Ehdr Ehdr;\n  typedef Elf64_Nhdr Nhdr;\n  typedef Elf64_Shdr Shdr;\n  static const int kClass = ELFCLASS64;\n};\n\n// These six functions are also used inside the crashed process, so be safe\n// and use the syscall/libc wrappers instead of direct syscalls or libc.\ntemplate<typename ElfClass>\nstatic void FindElfClassSection(const char *elf_base,\n                                const char *section_name,\n                                uint32_t section_type,\n                                const void **section_start,\n                                int *section_size) {\n  typedef typename ElfClass::Ehdr Ehdr;\n  typedef typename ElfClass::Shdr Shdr;\n\n  assert(elf_base);\n  assert(section_start);\n  assert(section_size);\n\n  assert(my_strncmp(elf_base, ELFMAG, SELFMAG) == 0);\n\n  int name_len = my_strlen(section_name);\n\n  const Ehdr* elf_header = reinterpret_cast<const Ehdr*>(elf_base);\n  assert(elf_header->e_ident[EI_CLASS] == ElfClass::kClass);\n\n  const Shdr* sections =\n      reinterpret_cast<const Shdr*>(elf_base + elf_header->e_shoff);\n  const Shdr* string_section = sections + elf_header->e_shstrndx;\n\n  const Shdr* section = NULL;\n  for (int i = 0; i < elf_header->e_shnum; ++i) {\n    if (sections[i].sh_type == section_type) {\n      const char* current_section_name = (char*)(elf_base +\n                                                 string_section->sh_offset +\n                                                 sections[i].sh_name);\n      if (!my_strncmp(current_section_name, section_name, name_len)) {\n        section = &sections[i];\n        break;\n      }\n    }\n  }\n  if (section != NULL && section->sh_size > 0) {\n    *section_start = elf_base + section->sh_offset;\n    *section_size = section->sh_size;\n  }\n}\n\n// Attempt to find a section named |section_name| of type |section_type|\n// in the ELF binary data at |elf_mapped_base|. On success, returns true\n// and sets |*section_start| to point to the start of the section data,\n// and |*section_size| to the size of the section's data. If |elfclass|\n// is not NULL, set |*elfclass| to the ELF file class.\nstatic bool FindElfSection(const void *elf_mapped_base,\n                           const char *section_name,\n                           uint32_t section_type,\n                           const void **section_start,\n                           int *section_size,\n                           int *elfclass) {\n  assert(elf_mapped_base);\n  assert(section_start);\n  assert(section_size);\n\n  *section_start = NULL;\n  *section_size = 0;\n\n  const char* elf_base =\n    static_cast<const char*>(elf_mapped_base);\n  const ElfW(Ehdr)* elf_header =\n    reinterpret_cast<const ElfW(Ehdr)*>(elf_base);\n  if (my_strncmp(elf_base, ELFMAG, SELFMAG) != 0)\n    return false;\n\n  if (elfclass) {\n    *elfclass = elf_header->e_ident[EI_CLASS];\n  }\n\n  if (elf_header->e_ident[EI_CLASS] == ELFCLASS32) {\n    FindElfClassSection<ElfClass32>(elf_base, section_name, section_type,\n                                    section_start, section_size);\n    return *section_start != NULL;\n  } else if (elf_header->e_ident[EI_CLASS] == ELFCLASS64) {\n    FindElfClassSection<ElfClass64>(elf_base, section_name, section_type,\n                                    section_start, section_size);\n    return *section_start != NULL;\n  }\n\n  return false;\n}\n\ntemplate<typename ElfClass>\nstatic bool ElfClassBuildIDNoteIdentifier(const void *section,\n                                          uint8_t identifier[kMDGUIDSize]) {\n  typedef typename ElfClass::Nhdr Nhdr;\n\n  const Nhdr* note_header = reinterpret_cast<const Nhdr*>(section);\n  if (note_header->n_type != NT_GNU_BUILD_ID ||\n      note_header->n_descsz == 0) {\n    return false;\n  }\n\n  const char* build_id = reinterpret_cast<const char*>(section) +\n    sizeof(Nhdr) + note_header->n_namesz;\n  // Copy as many bits of the build ID as will fit\n  // into the GUID space.\n  my_memset(identifier, 0, kMDGUIDSize);\n  memcpy(identifier, build_id,\n         std::min(kMDGUIDSize, (size_t)note_header->n_descsz));\n\n  return true;\n}\n\n// Attempt to locate a .note.gnu.build-id section in an ELF binary\n// and copy as many bytes of it as will fit into |identifier|.\nstatic bool FindElfBuildIDNote(const void *elf_mapped_base,\n                               uint8_t identifier[kMDGUIDSize]) {\n  void* note_section;\n  int note_size, elfclass;\n  if (!FindElfSection(elf_mapped_base, \".note.gnu.build-id\", SHT_NOTE,\n                      (const void**)&note_section, &note_size, &elfclass) ||\n      note_size == 0) {\n    return false;\n  }\n\n  if (elfclass == ELFCLASS32) {\n    return ElfClassBuildIDNoteIdentifier<ElfClass32>(note_section, identifier);\n  } else if (elfclass == ELFCLASS64) {\n    return ElfClassBuildIDNoteIdentifier<ElfClass64>(note_section, identifier);\n  }\n\n  return false;\n}\n\n// Attempt to locate the .text section of an ELF binary and generate\n// a simple hash by XORing the first page worth of bytes into |identifier|.\nstatic bool HashElfTextSection(const void *elf_mapped_base,\n                               uint8_t identifier[kMDGUIDSize]) {\n  void* text_section;\n  int text_size;\n  if (!FindElfSection(elf_mapped_base, \".text\", SHT_PROGBITS,\n                      (const void**)&text_section, &text_size, NULL) ||\n      text_size == 0) {\n    return false;\n  }\n\n  my_memset(identifier, 0, kMDGUIDSize);\n  const uint8_t* ptr = reinterpret_cast<const uint8_t*>(text_section);\n  const uint8_t* ptr_end = ptr + std::min(text_size, 4096);\n  while (ptr < ptr_end) {\n    for (unsigned i = 0; i < kMDGUIDSize; i++)\n      identifier[i] ^= ptr[i];\n    ptr += kMDGUIDSize;\n  }\n  return true;\n}\n\n// static\nbool FileID::ElfFileIdentifierFromMappedFile(const void* base,\n                                             uint8_t identifier[kMDGUIDSize]) {\n  // Look for a build id note first.\n  if (FindElfBuildIDNote(base, identifier))\n    return true;\n\n  // Fall back on hashing the first page of the text section.\n  return HashElfTextSection(base, identifier);\n}\n\nbool FileID::ElfFileIdentifier(uint8_t identifier[kMDGUIDSize]) {\n  MemoryMappedFile mapped_file(path_);\n  if (!mapped_file.data())  // Should probably check if size >= ElfW(Ehdr)?\n    return false;\n\n  return ElfFileIdentifierFromMappedFile(mapped_file.data(), identifier);\n}\n\n// static\nvoid FileID::ConvertIdentifierToString(const uint8_t identifier[kMDGUIDSize],\n                                       char* buffer, int buffer_length) {\n  uint8_t identifier_swapped[kMDGUIDSize];\n\n  // Endian-ness swap to match dump processor expectation.\n  memcpy(identifier_swapped, identifier, kMDGUIDSize);\n  uint32_t* data1 = reinterpret_cast<uint32_t*>(identifier_swapped);\n  *data1 = htonl(*data1);\n  uint16_t* data2 = reinterpret_cast<uint16_t*>(identifier_swapped + 4);\n  *data2 = htons(*data2);\n  uint16_t* data3 = reinterpret_cast<uint16_t*>(identifier_swapped + 6);\n  *data3 = htons(*data3);\n\n  int buffer_idx = 0;\n  for (unsigned int idx = 0;\n       (buffer_idx < buffer_length) && (idx < kMDGUIDSize);\n       ++idx) {\n    int hi = (identifier_swapped[idx] >> 4) & 0x0F;\n    int lo = (identifier_swapped[idx]) & 0x0F;\n\n    if (idx == 4 || idx == 6 || idx == 8 || idx == 10)\n      buffer[buffer_idx++] = '-';\n\n    buffer[buffer_idx++] = (hi >= 10) ? 'A' + hi - 10 : '0' + hi;\n    buffer[buffer_idx++] = (lo >= 10) ? 'A' + lo - 10 : '0' + lo;\n  }\n\n  // NULL terminate\n  buffer[(buffer_idx < buffer_length) ? buffer_idx : buffer_idx - 1] = 0;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/file_id.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// file_id.h: Return a unique identifier for a file\n//\n\n#ifndef COMMON_LINUX_FILE_ID_H__\n#define COMMON_LINUX_FILE_ID_H__\n\n#include <limits.h>\n\n#include \"common/linux/guid_creator.h\"\n\nnamespace google_breakpad {\n\nstatic const size_t kMDGUIDSize = sizeof(MDGUID);\n\nclass FileID {\n public:\n  explicit FileID(const char* path);\n  ~FileID() {}\n\n  // Load the identifier for the elf file path specified in the constructor into\n  // |identifier|.  Return false if the identifier could not be created for the\n  // file.\n  // The current implementation will look for a .note.gnu.build-id\n  // section and use that as the file id, otherwise it falls back to\n  // XORing the first 4096 bytes of the .text section to generate an identifier.\n  bool ElfFileIdentifier(uint8_t identifier[kMDGUIDSize]);\n\n  // Load the identifier for the elf file mapped into memory at |base| into\n  // |identifier|.  Return false if the identifier could not be created for the\n  // file.\n  static bool ElfFileIdentifierFromMappedFile(const void* base,\n                                              uint8_t identifier[kMDGUIDSize]);\n\n  // Convert the |identifier| data to a NULL terminated string.  The string will\n  // be formatted as a UUID (e.g., 22F065BB-FC9C-49F7-80FE-26A7CEBD7BCE).\n  // The |buffer| should be at least 37 bytes long to receive all of the data\n  // and termination.  Shorter buffers will contain truncated data.\n  static void ConvertIdentifierToString(const uint8_t identifier[kMDGUIDSize],\n                                        char* buffer, int buffer_length);\n\n private:\n  // Storage for the path specified\n  char path_[PATH_MAX];\n};\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_LINUX_FILE_ID_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/file_id_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Unit tests for FileID\n\n#include <elf.h>\n#include <stdlib.h>\n\n#include \"common/linux/file_id.h\"\n#include \"common/linux/safe_readlink.h\"\n#include \"common/linux/synth_elf.h\"\n#include \"common/test_assembler.h\"\n#include \"common/tests/auto_tempdir.h\"\n#include \"breakpad_googletest_includes.h\"\n\nusing namespace google_breakpad;\nusing google_breakpad::SafeReadLink;\nusing google_breakpad::synth_elf::BuildIDNote;\nusing google_breakpad::synth_elf::ELF;\nusing google_breakpad::test_assembler::kLittleEndian;\nusing google_breakpad::test_assembler::Section;\n\nnamespace {\n\n// Simply calling Section::Append(size, byte) produces a uninteresting pattern\n// that tends to get hashed to 0000...0000. This populates the section with\n// data to produce better hashes.\nvoid PopulateSection(Section* section, int size, int prime_number) {\n  for (int i = 0; i < size; i++)\n    section->Append(1, (i % prime_number) % 256);\n}\n\n}  // namespace\n\nTEST(FileIDStripTest, StripSelf) {\n  // Calculate the File ID of this binary using\n  // FileID::ElfFileIdentifier, then make a copy of this binary,\n  // strip it, and ensure that the result is the same.\n  char exe_name[PATH_MAX];\n  ASSERT_TRUE(SafeReadLink(\"/proc/self/exe\", exe_name));\n\n  // copy our binary to a temp file, and strip it\n  AutoTempDir temp_dir;\n  std::string templ = temp_dir.path() + \"/file-id-unittest\";\n  char cmdline[4096];\n  sprintf(cmdline, \"cp \\\"%s\\\" \\\"%s\\\"\", exe_name, templ.c_str());\n  ASSERT_EQ(system(cmdline), 0);\n  sprintf(cmdline, \"strip \\\"%s\\\"\", templ.c_str());\n  ASSERT_EQ(system(cmdline), 0);\n\n  uint8_t identifier1[sizeof(MDGUID)];\n  uint8_t identifier2[sizeof(MDGUID)];\n  FileID fileid1(exe_name);\n  EXPECT_TRUE(fileid1.ElfFileIdentifier(identifier1));\n  FileID fileid2(templ.c_str());\n  EXPECT_TRUE(fileid2.ElfFileIdentifier(identifier2));\n  char identifier_string1[37];\n  char identifier_string2[37];\n  FileID::ConvertIdentifierToString(identifier1, identifier_string1,\n                                    37);\n  FileID::ConvertIdentifierToString(identifier2, identifier_string2,\n                                    37);\n  EXPECT_STREQ(identifier_string1, identifier_string2);\n}\n\nclass FileIDTest : public testing::Test {\npublic:\n  void GetElfContents(ELF& elf) {\n    string contents;\n    ASSERT_TRUE(elf.GetContents(&contents));\n    ASSERT_LT(0, contents.size());\n\n    elfdata_v.clear();\n    elfdata_v.insert(elfdata_v.begin(), contents.begin(), contents.end());\n    elfdata = &elfdata_v[0];\n  }\n\n  vector<uint8_t> elfdata_v;\n  uint8_t* elfdata;\n};\n\nTEST_F(FileIDTest, ElfClass) {\n  uint8_t identifier[sizeof(MDGUID)];\n  const char expected_identifier_string[] =\n      \"80808080-8080-0000-0000-008080808080\";\n  char identifier_string[sizeof(expected_identifier_string)];\n  const size_t kTextSectionSize = 128;\n\n  ELF elf32(EM_386, ELFCLASS32, kLittleEndian);\n  Section text32(kLittleEndian);\n  for (size_t i = 0; i < kTextSectionSize; ++i) {\n    text32.D8(i * 3);\n  }\n  elf32.AddSection(\".text\", text32, SHT_PROGBITS);\n  elf32.Finish();\n  GetElfContents(elf32);\n\n  EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier));\n\n  FileID::ConvertIdentifierToString(identifier, identifier_string,\n                                    sizeof(identifier_string));\n  EXPECT_STREQ(expected_identifier_string, identifier_string);\n\n  memset(identifier, 0, sizeof(identifier));\n  memset(identifier_string, 0, sizeof(identifier_string));\n\n  ELF elf64(EM_X86_64, ELFCLASS64, kLittleEndian);\n  Section text64(kLittleEndian);\n  for (size_t i = 0; i < kTextSectionSize; ++i) {\n    text64.D8(i * 3);\n  }\n  elf64.AddSection(\".text\", text64, SHT_PROGBITS);\n  elf64.Finish();\n  GetElfContents(elf64);\n\n  EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier));\n\n  FileID::ConvertIdentifierToString(identifier, identifier_string,\n                                    sizeof(identifier_string));\n  EXPECT_STREQ(expected_identifier_string, identifier_string);\n}\n\nTEST_F(FileIDTest, BuildID) {\n  const uint8_t kExpectedIdentifier[sizeof(MDGUID)] =\n    {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n     0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};\n  char expected_identifier_string[] =\n    \"00000000-0000-0000-0000-000000000000\";\n  FileID::ConvertIdentifierToString(kExpectedIdentifier,\n                                    expected_identifier_string,\n                                    sizeof(expected_identifier_string));\n\n  uint8_t identifier[sizeof(MDGUID)];\n  char identifier_string[sizeof(expected_identifier_string)];\n\n  ELF elf32(EM_386, ELFCLASS32, kLittleEndian);\n  Section text(kLittleEndian);\n  text.Append(4096, 0);\n  elf32.AddSection(\".text\", text, SHT_PROGBITS);\n  BuildIDNote::AppendSection(elf32,\n                             kExpectedIdentifier,\n                             sizeof(kExpectedIdentifier));\n  elf32.Finish();\n  GetElfContents(elf32);\n\n  EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier));\n\n  FileID::ConvertIdentifierToString(identifier, identifier_string,\n                                    sizeof(identifier_string));\n  EXPECT_STREQ(expected_identifier_string, identifier_string);\n\n  memset(identifier, 0, sizeof(identifier));\n  memset(identifier_string, 0, sizeof(identifier_string));\n\n  ELF elf64(EM_X86_64, ELFCLASS64, kLittleEndian);\n  // Re-use empty text section from previous test\n  elf64.AddSection(\".text\", text, SHT_PROGBITS);\n  BuildIDNote::AppendSection(elf64,\n                             kExpectedIdentifier,\n                             sizeof(kExpectedIdentifier));\n  elf64.Finish();\n  GetElfContents(elf64);\n\n  EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier));\n\n  FileID::ConvertIdentifierToString(identifier, identifier_string,\n                                    sizeof(identifier_string));\n  EXPECT_STREQ(expected_identifier_string, identifier_string);\n}\n\n// Test to make sure two files with different text sections produce\n// different hashes when not using a build id.\nTEST_F(FileIDTest, UniqueHashes32) {\n  char identifier_string_1[] =\n    \"00000000-0000-0000-0000-000000000000\";\n  char identifier_string_2[] =\n    \"00000000-0000-0000-0000-000000000000\";\n  uint8_t identifier_1[sizeof(MDGUID)];\n  uint8_t identifier_2[sizeof(MDGUID)];\n\n  {\n    ELF elf1(EM_386, ELFCLASS32, kLittleEndian);\n    Section foo_1(kLittleEndian);\n    PopulateSection(&foo_1, 32, 5);\n    elf1.AddSection(\".foo\", foo_1, SHT_PROGBITS);\n    Section text_1(kLittleEndian);\n    PopulateSection(&text_1, 4096, 17);\n    elf1.AddSection(\".text\", text_1, SHT_PROGBITS);\n    elf1.Finish();\n    GetElfContents(elf1);\n  }\n\n  EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier_1));\n  FileID::ConvertIdentifierToString(identifier_1, identifier_string_1,\n                                    sizeof(identifier_string_1));\n\n  {\n    ELF elf2(EM_386, ELFCLASS32, kLittleEndian);\n    Section text_2(kLittleEndian);\n    Section foo_2(kLittleEndian);\n    PopulateSection(&foo_2, 32, 5);\n    elf2.AddSection(\".foo\", foo_2, SHT_PROGBITS);\n    PopulateSection(&text_2, 4096, 31);\n    elf2.AddSection(\".text\", text_2, SHT_PROGBITS);\n    elf2.Finish();\n    GetElfContents(elf2);\n  }\n\n  EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier_2));\n  FileID::ConvertIdentifierToString(identifier_2, identifier_string_2,\n                                    sizeof(identifier_string_2));\n\n  EXPECT_STRNE(identifier_string_1, identifier_string_2);\n}\n\n// Same as UniqueHashes32, for x86-64.\nTEST_F(FileIDTest, UniqueHashes64) {\n  char identifier_string_1[] =\n    \"00000000-0000-0000-0000-000000000000\";\n  char identifier_string_2[] =\n    \"00000000-0000-0000-0000-000000000000\";\n  uint8_t identifier_1[sizeof(MDGUID)];\n  uint8_t identifier_2[sizeof(MDGUID)];\n\n  {\n    ELF elf1(EM_X86_64, ELFCLASS64, kLittleEndian);\n    Section foo_1(kLittleEndian);\n    PopulateSection(&foo_1, 32, 5);\n    elf1.AddSection(\".foo\", foo_1, SHT_PROGBITS);\n    Section text_1(kLittleEndian);\n    PopulateSection(&text_1, 4096, 17);\n    elf1.AddSection(\".text\", text_1, SHT_PROGBITS);\n    elf1.Finish();\n    GetElfContents(elf1);\n  }\n\n  EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier_1));\n  FileID::ConvertIdentifierToString(identifier_1, identifier_string_1,\n                                    sizeof(identifier_string_1));\n\n  {\n    ELF elf2(EM_X86_64, ELFCLASS64, kLittleEndian);\n    Section text_2(kLittleEndian);\n    Section foo_2(kLittleEndian);\n    PopulateSection(&foo_2, 32, 5);\n    elf2.AddSection(\".foo\", foo_2, SHT_PROGBITS);\n    PopulateSection(&text_2, 4096, 31);\n    elf2.AddSection(\".text\", text_2, SHT_PROGBITS);\n    elf2.Finish();\n    GetElfContents(elf2);\n  }\n\n  EXPECT_TRUE(FileID::ElfFileIdentifierFromMappedFile(elfdata, identifier_2));\n  FileID::ConvertIdentifierToString(identifier_2, identifier_string_2,\n                                    sizeof(identifier_string_2));\n\n  EXPECT_STRNE(identifier_string_1, identifier_string_2);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/google_crashdump_uploader.cc",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include \"common/linux/google_crashdump_uploader.h\"\n#include \"common/linux/libcurl_wrapper.h\"\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <unistd.h>\n\n#include <iostream>\n\nusing std::string;\n\nnamespace google_breakpad {\n\nGoogleCrashdumpUploader::GoogleCrashdumpUploader(const std::string& product,\n                                                 const std::string& version,\n                                                 const std::string& guid,\n                                                 const std::string& ptime,\n                                                 const std::string& ctime,\n                                                 const std::string& email,\n                                                 const std::string& comments,\n                                                 const std::string& minidump_pathname,\n                                                 const std::string& crash_server,\n                                                 const std::string& proxy_host,\n                                                 const std::string& proxy_userpassword) {\n  LibcurlWrapper* http_layer = new LibcurlWrapper();\n  Init(product,\n       version,\n       guid,\n       ptime,\n       ctime,\n       email,\n       comments,\n       minidump_pathname,\n       crash_server,\n       proxy_host,\n       proxy_userpassword,\n       http_layer);\n}\n\nGoogleCrashdumpUploader::GoogleCrashdumpUploader(const std::string& product,\n                                                 const std::string& version,\n                                                 const std::string& guid,\n                                                 const std::string& ptime,\n                                                 const std::string& ctime,\n                                                 const std::string& email,\n                                                 const std::string& comments,\n                                                 const std::string& minidump_pathname,\n                                                 const std::string& crash_server,\n                                                 const std::string& proxy_host,\n                                                 const std::string& proxy_userpassword,\n                                                 LibcurlWrapper* http_layer) {\n  Init(product,\n       version,\n       guid,\n       ptime,\n       ctime,\n       email,\n       comments,\n       minidump_pathname,\n       crash_server,\n       proxy_host,\n       proxy_userpassword,\n       http_layer);\n}\n\nvoid GoogleCrashdumpUploader::Init(const std::string& product,\n                                   const std::string& version,\n                                   const std::string& guid,\n                                   const std::string& ptime,\n                                   const std::string& ctime,\n                                   const std::string& email,\n                                   const std::string& comments,\n                                   const std::string& minidump_pathname,\n                                   const std::string& crash_server,\n                                   const std::string& proxy_host,\n                                   const std::string& proxy_userpassword,\n                                   LibcurlWrapper* http_layer) {\n  product_ = product;\n  version_ = version;\n  guid_ = guid;\n  ptime_ = ptime;\n  ctime_ = ctime;\n  email_ = email;\n  comments_ = comments;\n  http_layer_ = http_layer;\n\n  crash_server_ = crash_server;\n  proxy_host_ = proxy_host;\n  proxy_userpassword_ = proxy_userpassword;\n  minidump_pathname_ = minidump_pathname;\n  std::cout << \"Uploader initializing\";\n  std::cout << \"\\tProduct: \" << product_;\n  std::cout << \"\\tVersion: \" << version_;\n  std::cout << \"\\tGUID: \" << guid_;\n  if (!ptime_.empty()) {\n    std::cout << \"\\tProcess uptime: \" << ptime_;\n  }\n  if (!ctime_.empty()) {\n    std::cout << \"\\tCumulative Process uptime: \" << ctime_;\n  }\n  if (!email_.empty()) {\n    std::cout << \"\\tEmail: \" << email_;\n  }\n  if (!comments_.empty()) {\n    std::cout << \"\\tComments: \" << comments_;\n  }\n}\n\nbool GoogleCrashdumpUploader::CheckRequiredParametersArePresent() {\n  std::string error_text;\n  if (product_.empty()) {\n    error_text.append(\"\\nProduct name must be specified.\");\n  }\n\n  if (version_.empty()) {\n    error_text.append(\"\\nProduct version must be specified.\");\n  }\n\n  if (guid_.empty()) {\n    error_text.append(\"\\nClient ID must be specified.\");\n  }\n\n  if (minidump_pathname_.empty()) {\n    error_text.append(\"\\nMinidump pathname must be specified.\");\n  }\n\n  if (!error_text.empty()) {\n    std::cout << error_text;\n    return false;\n  }\n  return true;\n\n}\n\nbool GoogleCrashdumpUploader::Upload() {\n  bool ok = http_layer_->Init();\n  if (!ok) {\n    std::cout << \"http layer init failed\";\n    return ok;\n  }\n\n  if (!CheckRequiredParametersArePresent()) {\n    return false;\n  }\n\n  struct stat st;\n  int err = stat(minidump_pathname_.c_str(), &st);\n  if (err) {\n    std::cout << minidump_pathname_ << \" could not be found\";\n    return false;\n  }\n\n  parameters_[\"prod\"] = product_;\n  parameters_[\"ver\"] = version_;\n  parameters_[\"guid\"] = guid_;\n  parameters_[\"ptime\"] = ptime_;\n  parameters_[\"ctime\"] = ctime_;\n  parameters_[\"email\"] = email_;\n  parameters_[\"comments_\"] = comments_;\n  if (!http_layer_->AddFile(minidump_pathname_,\n                            \"upload_file_minidump\")) {\n    return false;\n  }\n  std::cout << \"Sending request to \" << crash_server_;\n  return http_layer_->SendRequest(crash_server_,\n                                  parameters_,\n                                  NULL);\n}\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/google_crashdump_uploader.h",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n#include <string>\n#include <map>\n\nnamespace google_breakpad {\n\nclass LibcurlWrapper;\n\nclass GoogleCrashdumpUploader {\n public:\n  GoogleCrashdumpUploader(const std::string& product,\n                          const std::string& version,\n                          const std::string& guid,\n                          const std::string& ptime,\n                          const std::string& ctime,\n                          const std::string& email,\n                          const std::string& comments,\n                          const std::string& minidump_pathname,\n                          const std::string& crash_server,\n                          const std::string& proxy_host,\n                          const std::string& proxy_userpassword);\n\n  GoogleCrashdumpUploader(const std::string& product,\n                          const std::string& version,\n                          const std::string& guid,\n                          const std::string& ptime,\n                          const std::string& ctime,\n                          const std::string& email,\n                          const std::string& comments,\n                          const std::string& minidump_pathname,\n                          const std::string& crash_server,\n                          const std::string& proxy_host,\n                          const std::string& proxy_userpassword,\n                          LibcurlWrapper* http_layer);\n\n  void Init(const std::string& product,\n            const std::string& version,\n            const std::string& guid,\n            const std::string& ptime,\n            const std::string& ctime,\n            const std::string& email,\n            const std::string& comments,\n            const std::string& minidump_pathname,\n            const std::string& crash_server,\n            const std::string& proxy_host,\n            const std::string& proxy_userpassword,\n            LibcurlWrapper* http_layer);\n  bool Upload();\n\n private:\n  bool CheckRequiredParametersArePresent();\n\n  LibcurlWrapper* http_layer_;\n  std::string product_;\n  std::string version_;\n  std::string guid_;\n  std::string ptime_;\n  std::string ctime_;\n  std::string email_;\n  std::string comments_;\n  std::string minidump_pathname_;\n\n  std::string crash_server_;\n  std::string proxy_host_;\n  std::string proxy_userpassword_;\n\n  std::map<std::string, std::string> parameters_;\n};\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/google_crashdump_uploader_test.cc",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Unit test for crash dump uploader.\n\n#include \"common/linux/google_crashdump_uploader.h\"\n#include \"common/linux/libcurl_wrapper.h\"\n#include \"breakpad_googletest_includes.h\"\n\nnamespace google_breakpad {\n\nusing ::testing::Return;\nusing ::testing::_;\n\nclass MockLibcurlWrapper : public LibcurlWrapper {\n public:\n  MOCK_METHOD0(Init, bool());\n  MOCK_METHOD2(SetProxy, bool(const std::string& proxy_host,\n                              const std::string& proxy_userpwd));\n  MOCK_METHOD2(AddFile, bool(const std::string& upload_file_path,\n                             const std::string& basename));\n  MOCK_METHOD3(SendRequest,\n               bool(const std::string& url,\n                    const std::map<std::string, std::string>& parameters,\n                    std::string* server_response));\n};\n\nclass GoogleCrashdumpUploaderTest : public ::testing::Test {\n};\n\nTEST_F(GoogleCrashdumpUploaderTest, InitFailsCausesUploadFailure) {\n  MockLibcurlWrapper m;\n  EXPECT_CALL(m, Init()).Times(1).WillOnce(Return(false));\n  GoogleCrashdumpUploader *uploader = new GoogleCrashdumpUploader(\"foobar\",\n                                                                  \"1.0\",\n                                                                  \"AAA-BBB\",\n                                                                  \"\",\n                                                                  \"\",\n                                                                  \"test@test.com\",\n                                                                  \"none\",\n                                                                  \"/tmp/foo.dmp\",\n                                                                  \"http://foo.com\",\n                                                                  \"\",\n                                                                  \"\",\n                                                                  &m);\n  ASSERT_FALSE(uploader->Upload());\n}\n\nTEST_F(GoogleCrashdumpUploaderTest, TestSendRequestHappensWithValidParameters) {\n  // Create a temp file\n  char tempfn[80] = \"/tmp/googletest-upload-XXXXXX\";\n  int fd = mkstemp(tempfn);\n  ASSERT_NE(fd, -1);\n  close(fd);\n\n  MockLibcurlWrapper m;\n  EXPECT_CALL(m, Init()).Times(1).WillOnce(Return(true));\n  EXPECT_CALL(m, AddFile(tempfn, _)).WillOnce(Return(true));\n  EXPECT_CALL(m,\n              SendRequest(\"http://foo.com\",_,_)).Times(1).WillOnce(Return(true));\n  GoogleCrashdumpUploader *uploader = new GoogleCrashdumpUploader(\"foobar\",\n                                                                  \"1.0\",\n                                                                  \"AAA-BBB\",\n                                                                  \"\",\n                                                                  \"\",\n                                                                  \"test@test.com\",\n                                                                  \"none\",\n                                                                  tempfn,\n                                                                  \"http://foo.com\",\n                                                                  \"\",\n                                                                  \"\",\n                                                                  &m);\n  ASSERT_TRUE(uploader->Upload());\n}\n\n\nTEST_F(GoogleCrashdumpUploaderTest, InvalidPathname) {\n  MockLibcurlWrapper m;\n  EXPECT_CALL(m, Init()).Times(1).WillOnce(Return(true));\n  EXPECT_CALL(m, SendRequest(_,_,_)).Times(0);\n  GoogleCrashdumpUploader *uploader = new GoogleCrashdumpUploader(\"foobar\",\n                                                                  \"1.0\",\n                                                                  \"AAA-BBB\",\n                                                                  \"\",\n                                                                  \"\",\n                                                                  \"test@test.com\",\n                                                                  \"none\",\n                                                                  \"/tmp/foo.dmp\",\n                                                                  \"http://foo.com\",\n                                                                  \"\",\n                                                                  \"\",\n                                                                  &m);\n  ASSERT_FALSE(uploader->Upload());\n}\n\nTEST_F(GoogleCrashdumpUploaderTest, TestRequiredParametersMustBePresent) {\n  // Test with empty product name.\n  GoogleCrashdumpUploader uploader(\"\",\n                                   \"1.0\",\n                                   \"AAA-BBB\",\n                                   \"\",\n                                   \"\",\n                                   \"test@test.com\",\n                                   \"none\",\n                                   \"/tmp/foo.dmp\",\n                                   \"http://foo.com\",\n                                   \"\",\n                                   \"\");\n  ASSERT_FALSE(uploader.Upload());\n\n  // Test with empty product version.\n  GoogleCrashdumpUploader uploader1(\"product\",\n                                    \"\",\n                                    \"AAA-BBB\",\n                                    \"\",\n                                    \"\",\n                                    \"\",\n                                    \"\",\n                                    \"/tmp/foo.dmp\",\n                                    \"\",\n                                    \"\",\n                                    \"\");\n\n  ASSERT_FALSE(uploader1.Upload());\n\n  // Test with empty client GUID.\n  GoogleCrashdumpUploader uploader2(\"product\",\n                                    \"1.0\",\n                                    \"\",\n                                    \"\",\n                                    \"\",\n                                    \"\",\n                                    \"\",\n                                    \"/tmp/foo.dmp\",\n                                    \"\",\n                                    \"\",\n                                    \"\");\n  ASSERT_FALSE(uploader2.Upload());\n}\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/guid_creator.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"common/linux/guid_creator.h\"\n\n#include <assert.h>\n#include <pthread.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <time.h>\n#include <unistd.h>\n\n//\n// GUIDGenerator\n//\n// This class is used to generate random GUID.\n// Currently use random number to generate a GUID since Linux has\n// no native GUID generator. This should be OK since we don't expect\n// crash to happen very offen.\n//\nclass GUIDGenerator {\n public:\n  static u_int32_t BytesToUInt32(const u_int8_t bytes[]) {\n    return ((u_int32_t) bytes[0]\n            | ((u_int32_t) bytes[1] << 8)\n            | ((u_int32_t) bytes[2] << 16)\n            | ((u_int32_t) bytes[3] << 24));\n  }\n\n  static void UInt32ToBytes(u_int8_t bytes[], u_int32_t n) {\n    bytes[0] = n & 0xff;\n    bytes[1] = (n >> 8) & 0xff;\n    bytes[2] = (n >> 16) & 0xff;\n    bytes[3] = (n >> 24) & 0xff;\n  }\n\n  static bool CreateGUID(GUID *guid) {\n    InitOnce();\n    guid->data1 = random();\n    guid->data2 = (u_int16_t)(random());\n    guid->data3 = (u_int16_t)(random());\n    UInt32ToBytes(&guid->data4[0], random());\n    UInt32ToBytes(&guid->data4[4], random());\n    return true;\n  }\n\n private:\n  static void InitOnce() {\n    pthread_once(&once_control, &InitOnceImpl);\n  }\n\n  static void InitOnceImpl() {\n    srandom(time(NULL));\n  }\n\n  static pthread_once_t once_control;\n};\n\npthread_once_t GUIDGenerator::once_control = PTHREAD_ONCE_INIT;\n\nbool CreateGUID(GUID *guid) {\n  return GUIDGenerator::CreateGUID(guid);\n}\n\n// Parse guid to string.\nbool GUIDToString(const GUID *guid, char *buf, int buf_len) {\n  // Should allow more space the the max length of GUID.\n  assert(buf_len > kGUIDStringLength);\n  int num = snprintf(buf, buf_len, kGUIDFormatString,\n                     guid->data1, guid->data2, guid->data3,\n                     GUIDGenerator::BytesToUInt32(&(guid->data4[0])),\n                     GUIDGenerator::BytesToUInt32(&(guid->data4[4])));\n  if (num != kGUIDStringLength)\n    return false;\n\n  buf[num] = '\\0';\n  return true;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/guid_creator.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef COMMON_LINUX_GUID_CREATOR_H__\n#define COMMON_LINUX_GUID_CREATOR_H__\n\n#include \"google_breakpad/common/minidump_format.h\"\n\ntypedef MDGUID GUID;\n\n// Format string for parsing GUID.\n#define kGUIDFormatString \"%08x-%04x-%04x-%08x-%08x\"\n// Length of GUID string. Don't count the ending '\\0'.\n#define kGUIDStringLength 36\n\n// Create a guid.\nbool CreateGUID(GUID *guid);\n\n// Get the string from guid.\nbool GUIDToString(const GUID *guid, char *buf, int buf_len);\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/http_upload.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"common/linux/http_upload.h\"\n\n#include <assert.h>\n#include <dlfcn.h>\n#include \"third_party/curl/curl.h\"\n\nnamespace {\n\n// Callback to get the response data from server.\nstatic size_t WriteCallback(void *ptr, size_t size,\n                            size_t nmemb, void *userp) {\n  if (!userp)\n    return 0;\n\n  std::string *response = reinterpret_cast<std::string *>(userp);\n  size_t real_size = size * nmemb;\n  response->append(reinterpret_cast<char *>(ptr), real_size);\n  return real_size;\n}\n\n}  // namespace\n\nnamespace google_breakpad {\n\nstatic const char kUserAgent[] = \"Breakpad/1.0 (Linux)\";\n\n// static\nbool HTTPUpload::SendRequest(const string &url,\n                             const map<string, string> &parameters,\n                             const string &upload_file,\n                             const string &file_part_name,\n                             const string &proxy,\n                             const string &proxy_user_pwd,\n                             const string &ca_certificate_file,\n                             string *response_body,\n                             long *response_code,\n                             string *error_description) {\n  if (response_code != NULL)\n    *response_code = 0;\n\n  if (!CheckParameters(parameters))\n    return false;\n\n  void *curl_lib = dlopen(\"libcurl.so\", RTLD_NOW);\n  if (!curl_lib) {\n    if (error_description != NULL)\n      *error_description = dlerror();\n    curl_lib = dlopen(\"libcurl.so.4\", RTLD_NOW);\n  }\n  if (!curl_lib) {\n    // Debian gives libcurl a different name when it is built against GnuTLS\n    // instead of OpenSSL.\n    curl_lib = dlopen(\"libcurl-gnutls.so.4\", RTLD_NOW);\n  }\n  if (!curl_lib) {\n    curl_lib = dlopen(\"libcurl.so.3\", RTLD_NOW);\n  }\n  if (!curl_lib) {\n    return false;\n  }\n\n  CURL* (*curl_easy_init)(void);\n  *(void**) (&curl_easy_init) = dlsym(curl_lib, \"curl_easy_init\");\n  CURL *curl = (*curl_easy_init)();\n  if (error_description != NULL)\n    *error_description = \"No Error\";\n\n  if (!curl) {\n    dlclose(curl_lib);\n    return false;\n  }\n\n  CURLcode err_code = CURLE_OK;\n  CURLcode (*curl_easy_setopt)(CURL *, CURLoption, ...);\n  *(void**) (&curl_easy_setopt) = dlsym(curl_lib, \"curl_easy_setopt\");\n  (*curl_easy_setopt)(curl, CURLOPT_URL, url.c_str());\n  (*curl_easy_setopt)(curl, CURLOPT_USERAGENT, kUserAgent);\n  // Set proxy information if necessary.\n  if (!proxy.empty())\n    (*curl_easy_setopt)(curl, CURLOPT_PROXY, proxy.c_str());\n  if (!proxy_user_pwd.empty())\n    (*curl_easy_setopt)(curl, CURLOPT_PROXYUSERPWD, proxy_user_pwd.c_str());\n\n  if (!ca_certificate_file.empty())\n    (*curl_easy_setopt)(curl, CURLOPT_CAINFO, ca_certificate_file.c_str());\n\n  struct curl_httppost *formpost = NULL;\n  struct curl_httppost *lastptr = NULL;\n  // Add form data.\n  CURLFORMcode (*curl_formadd)(struct curl_httppost **, struct curl_httppost **, ...);\n  *(void**) (&curl_formadd) = dlsym(curl_lib, \"curl_formadd\");\n  map<string, string>::const_iterator iter = parameters.begin();\n  for (; iter != parameters.end(); ++iter)\n    (*curl_formadd)(&formpost, &lastptr,\n                 CURLFORM_COPYNAME, iter->first.c_str(),\n                 CURLFORM_COPYCONTENTS, iter->second.c_str(),\n                 CURLFORM_END);\n\n  // Add form file.\n  (*curl_formadd)(&formpost, &lastptr,\n               CURLFORM_COPYNAME, file_part_name.c_str(),\n               CURLFORM_FILE, upload_file.c_str(),\n               CURLFORM_END);\n\n  (*curl_easy_setopt)(curl, CURLOPT_HTTPPOST, formpost);\n\n  // Disable 100-continue header.\n  struct curl_slist *headerlist = NULL;\n  char buf[] = \"Expect:\";\n  struct curl_slist* (*curl_slist_append)(struct curl_slist *, const char *);\n  *(void**) (&curl_slist_append) = dlsym(curl_lib, \"curl_slist_append\");\n  headerlist = (*curl_slist_append)(headerlist, buf);\n  (*curl_easy_setopt)(curl, CURLOPT_HTTPHEADER, headerlist);\n\n  if (response_body != NULL) {\n    (*curl_easy_setopt)(curl, CURLOPT_WRITEFUNCTION, WriteCallback);\n    (*curl_easy_setopt)(curl, CURLOPT_WRITEDATA,\n                     reinterpret_cast<void *>(response_body));\n  }\n\n  // Fail if 400+ is returned from the web server.\n  (*curl_easy_setopt)(curl, CURLOPT_FAILONERROR, 1);\n\n  CURLcode (*curl_easy_perform)(CURL *);\n  *(void**) (&curl_easy_perform) = dlsym(curl_lib, \"curl_easy_perform\");\n  err_code = (*curl_easy_perform)(curl);\n  if (response_code != NULL) {\n    CURLcode (*curl_easy_getinfo)(CURL *, CURLINFO, ...);\n    *(void**) (&curl_easy_getinfo) = dlsym(curl_lib, \"curl_easy_getinfo\");\n    (*curl_easy_getinfo)(curl, CURLINFO_RESPONSE_CODE, response_code);\n  }\n  const char* (*curl_easy_strerror)(CURLcode);\n  *(void**) (&curl_easy_strerror) = dlsym(curl_lib, \"curl_easy_strerror\");\n#ifndef NDEBUG\n  if (err_code != CURLE_OK)\n    fprintf(stderr, \"Failed to send http request to %s, error: %s\\n\",\n            url.c_str(),\n            (*curl_easy_strerror)(err_code));\n#endif\n  if (error_description != NULL)\n    *error_description = (*curl_easy_strerror)(err_code);\n\n  void (*curl_easy_cleanup)(CURL *);\n  *(void**) (&curl_easy_cleanup) = dlsym(curl_lib, \"curl_easy_cleanup\");\n  (*curl_easy_cleanup)(curl);\n  if (formpost != NULL) {\n    void (*curl_formfree)(struct curl_httppost *);\n    *(void**) (&curl_formfree) = dlsym(curl_lib, \"curl_formfree\");\n    (*curl_formfree)(formpost);\n  }\n  if (headerlist != NULL) {\n    void (*curl_slist_free_all)(struct curl_slist *);\n    *(void**) (&curl_slist_free_all) = dlsym(curl_lib, \"curl_slist_free_all\");\n    (*curl_slist_free_all)(headerlist);\n  }\n  dlclose(curl_lib);\n  return err_code == CURLE_OK;\n}\n\n// static\nbool HTTPUpload::CheckParameters(const map<string, string> &parameters) {\n  for (map<string, string>::const_iterator pos = parameters.begin();\n       pos != parameters.end(); ++pos) {\n    const string &str = pos->first;\n    if (str.size() == 0)\n      return false;  // disallow empty parameter names\n    for (unsigned int i = 0; i < str.size(); ++i) {\n      int c = str[i];\n      if (c < 32 || c == '\"' || c > 127) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/http_upload.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// HTTPUpload provides a \"nice\" API to send a multipart HTTP(S) POST\n// request using libcurl.  It currently supports requests that contain\n// a set of string parameters (key/value pairs), and a file to upload.\n\n#ifndef COMMON_LINUX_HTTP_UPLOAD_H__\n#define COMMON_LINUX_HTTP_UPLOAD_H__\n\n#include <map>\n#include <string>\n\nnamespace google_breakpad {\n\nusing std::string;\nusing std::map;\n\nclass HTTPUpload {\n public:\n  // Sends the given set of parameters, along with the contents of\n  // upload_file, as a multipart POST request to the given URL.\n  // file_part_name contains the name of the file part of the request\n  // (i.e. it corresponds to the name= attribute on an <input type=\"file\">.\n  // Parameter names must contain only printable ASCII characters,\n  // and may not contain a quote (\") character.\n  // Only HTTP(S) URLs are currently supported.  Returns true on success.\n  // If the request is successful and response_body is non-NULL,\n  // the response body will be returned in response_body.\n  // If response_code is non-NULL, it will be set to the HTTP response code\n  // received (or 0 if the request failed before getting an HTTP response).\n  // If the send fails, a description of the error will be\n  // returned in error_description.\n  static bool SendRequest(const string &url,\n                          const map<string, string> &parameters,\n                          const string &upload_file,\n                          const string &file_part_name,\n                          const string &proxy,\n                          const string &proxy_user_pwd,\n                          const string &ca_certificate_file,\n                          string *response_body,\n                          long *response_code,\n                          string *error_description);\n\n private:\n  // Checks that the given list of parameters has only printable\n  // ASCII characters in the parameter name, and does not contain\n  // any quote (\") characters.  Returns true if so.\n  static bool CheckParameters(const map<string, string> &parameters);\n\n  // No instances of this class should be created.\n  // Disallow all constructors, destructors, and operator=.\n  HTTPUpload();\n  explicit HTTPUpload(const HTTPUpload &);\n  void operator=(const HTTPUpload &);\n  ~HTTPUpload();\n};\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_LINUX_HTTP_UPLOAD_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/libcurl_wrapper.cc",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <dlfcn.h>\n\n#include <iostream>\n#include <string>\n\n#include \"common/linux/libcurl_wrapper.h\"\n\nusing std::string;\n\nnamespace google_breakpad {\nLibcurlWrapper::LibcurlWrapper()\n    : init_ok_(false),\n      formpost_(NULL),\n      lastptr_(NULL),\n      headerlist_(NULL) {\n  curl_lib_ = dlopen(\"libcurl.so\", RTLD_NOW);\n  if (!curl_lib_) {\n    curl_lib_ = dlopen(\"libcurl.so.4\", RTLD_NOW);\n  }\n  if (!curl_lib_) {\n    curl_lib_ = dlopen(\"libcurl.so.3\", RTLD_NOW);\n  }\n  if (!curl_lib_) {\n    std::cout << \"Could not find libcurl via dlopen\";\n    return;\n  }\n  std::cout << \"LibcurlWrapper init succeeded\";\n  init_ok_ = true;\n  return;\n}\n\nbool LibcurlWrapper::SetProxy(const std::string& proxy_host,\n                              const std::string& proxy_userpwd) {\n  if (!init_ok_) {\n    return false;\n  }\n  // Set proxy information if necessary.\n  if (!proxy_host.empty()) {\n    (*easy_setopt_)(curl_, CURLOPT_PROXY, proxy_host.c_str());\n  } else {\n    std::cout << \"SetProxy called with empty proxy host.\";\n    return false;\n  }\n  if (!proxy_userpwd.empty()) {\n    (*easy_setopt_)(curl_, CURLOPT_PROXYUSERPWD, proxy_userpwd.c_str());\n  } else {\n    std::cout << \"SetProxy called with empty proxy username/password.\";\n    return false;\n  }\n  std::cout << \"Set proxy host to \" << proxy_host;\n  return true;\n}\n\nbool LibcurlWrapper::AddFile(const std::string& upload_file_path,\n                             const std::string& basename) {\n  if (!init_ok_) {\n    return false;\n  }\n  std::cout << \"Adding \" << upload_file_path << \" to form upload.\";\n  // Add form file.\n  (*formadd_)(&formpost_, &lastptr_,\n              CURLFORM_COPYNAME, basename.c_str(),\n              CURLFORM_FILE, upload_file_path.c_str(),\n              CURLFORM_END);\n\n  return true;\n}\n\n// Callback to get the response data from server.\nstatic size_t WriteCallback(void *ptr, size_t size,\n                            size_t nmemb, void *userp) {\n  if (!userp)\n    return 0;\n\n  std::string *response = reinterpret_cast<std::string *>(userp);\n  size_t real_size = size * nmemb;\n  response->append(reinterpret_cast<char *>(ptr), real_size);\n  return real_size;\n}\n\nbool LibcurlWrapper::SendRequest(const std::string& url,\n                                 const std::map<std::string, std::string>& parameters,\n                                 std::string* server_response) {\n  (*easy_setopt_)(curl_, CURLOPT_URL, url.c_str());\n  std::map<std::string, std::string>::const_iterator iter = parameters.begin();\n  for (; iter != parameters.end(); ++iter)\n    (*formadd_)(&formpost_, &lastptr_,\n                CURLFORM_COPYNAME, iter->first.c_str(),\n                CURLFORM_COPYCONTENTS, iter->second.c_str(),\n                CURLFORM_END);\n\n  (*easy_setopt_)(curl_, CURLOPT_HTTPPOST, formpost_);\n  if (server_response != NULL) {\n    (*easy_setopt_)(curl_, CURLOPT_WRITEFUNCTION, WriteCallback);\n    (*easy_setopt_)(curl_, CURLOPT_WRITEDATA,\n                     reinterpret_cast<void *>(server_response));\n  }\n\n  CURLcode err_code = CURLE_OK;\n  err_code = (*easy_perform_)(curl_);\n  easy_strerror_ = reinterpret_cast<const char* (*)(CURLcode)>\n                       (dlsym(curl_lib_, \"curl_easy_strerror\"));\n\n#ifndef NDEBUG\n  if (err_code != CURLE_OK)\n    fprintf(stderr, \"Failed to send http request to %s, error: %s\\n\",\n            url.c_str(),\n            (*easy_strerror_)(err_code));\n#endif\n  if (headerlist_ != NULL) {\n    (*slist_free_all_)(headerlist_);\n  }\n\n  (*easy_cleanup_)(curl_);\n  if (formpost_ != NULL) {\n    (*formfree_)(formpost_);\n  }\n\n  return err_code == CURLE_OK;\n}\n\nbool LibcurlWrapper::Init() {\n  if (!init_ok_) {\n    std::cout << \"Init_OK was not true in LibcurlWrapper::Init(), check earlier log messages\";\n    return false;\n  }\n\n  if (!SetFunctionPointers()) {\n    std::cout << \"Could not find function pointers\";\n    init_ok_ = false;\n    return false;\n  }\n\n  curl_ = (*easy_init_)();\n\n  last_curl_error_ = \"No Error\";\n\n  if (!curl_) {\n    dlclose(curl_lib_);\n    std::cout << \"Curl initialization failed\";\n    return false;\n  }\n\n  // Disable 100-continue header.\n  char buf[] = \"Expect:\";\n\n  headerlist_ = (*slist_append_)(headerlist_, buf);\n  (*easy_setopt_)(curl_, CURLOPT_HTTPHEADER, headerlist_);\n  return true;\n}\n\n#define SET_AND_CHECK_FUNCTION_POINTER(var, function_name, type) \\\n  var = reinterpret_cast<type>(dlsym(curl_lib_, function_name)); \\\n  if (!var) { \\\n    std::cout << \"Could not find libcurl function \" << function_name; \\\n    init_ok_ = false; \\\n    return false; \\\n  }\n\nbool LibcurlWrapper::SetFunctionPointers() {\n\n  SET_AND_CHECK_FUNCTION_POINTER(easy_init_,\n                                 \"curl_easy_init\",\n                                 CURL*(*)());\n\n  SET_AND_CHECK_FUNCTION_POINTER(easy_setopt_,\n                                 \"curl_easy_setopt\",\n                                 CURLcode(*)(CURL*, CURLoption, ...));\n\n  SET_AND_CHECK_FUNCTION_POINTER(formadd_, \"curl_formadd\",\n      CURLFORMcode(*)(curl_httppost**, curl_httppost**, ...));\n\n  SET_AND_CHECK_FUNCTION_POINTER(slist_append_, \"curl_slist_append\",\n      curl_slist*(*)(curl_slist*, const char*));\n\n  SET_AND_CHECK_FUNCTION_POINTER(easy_perform_,\n                                 \"curl_easy_perform\",\n                                 CURLcode(*)(CURL*));\n\n  SET_AND_CHECK_FUNCTION_POINTER(easy_cleanup_,\n                                 \"curl_easy_cleanup\",\n                                 void(*)(CURL*));\n\n  SET_AND_CHECK_FUNCTION_POINTER(slist_free_all_,\n                                 \"curl_slist_free_all\",\n                                 void(*)(curl_slist*));\n\n  SET_AND_CHECK_FUNCTION_POINTER(formfree_,\n                                 \"curl_formfree\",\n                                 void(*)(curl_httppost*));\n  return true;\n}\n\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/libcurl_wrapper.h",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A wrapper for libcurl to do HTTP Uploads, to support easy mocking\n// and unit testing of the HTTPUpload class.\n\n#include <string>\n#include <map>\n\n#include \"third_party/curl/curl.h\"\n\nnamespace google_breakpad {\nclass LibcurlWrapper {\n public:\n  LibcurlWrapper();\n  virtual bool Init();\n  virtual bool SetProxy(const std::string& proxy_host,\n                        const std::string& proxy_userpwd);\n  virtual bool AddFile(const std::string& upload_file_path,\n                       const std::string& basename);\n  virtual bool SendRequest(const std::string& url,\n                           const std::map<std::string, std::string>& parameters,\n                           std::string* server_response);\n private:\n  // This function initializes class state corresponding to function\n  // pointers into the CURL library.\n  bool SetFunctionPointers();\n\n  bool init_ok_;                 // Whether init succeeded\n  void* curl_lib_;               // Pointer to result of dlopen() on\n                                 // curl library\n  std::string last_curl_error_;  // The text of the last error when\n                                 // dealing\n  // with CURL.\n\n  CURL *curl_;                   // Pointer for handle for CURL calls.\n\n  CURL* (*easy_init_)(void);\n\n  // Stateful pointers for calling into curl_formadd()\n  struct curl_httppost *formpost_;\n  struct curl_httppost *lastptr_;\n  struct curl_slist *headerlist_;\n\n  // Function pointers into CURL library\n  CURLcode (*easy_setopt_)(CURL *, CURLoption, ...);\n  CURLFORMcode (*formadd_)(struct curl_httppost **,\n                           struct curl_httppost **, ...);\n  struct curl_slist* (*slist_append_)(struct curl_slist *, const char *);\n  void (*slist_free_all_)(struct curl_slist *);\n  CURLcode (*easy_perform_)(CURL *);\n  const char* (*easy_strerror_)(CURLcode);\n  void (*easy_cleanup_)(CURL *);\n  void (*formfree_)(struct curl_httppost *);\n\n};\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/linux_libc_support.h",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This header provides replacements for libc functions that we need. We if\n// call the libc functions directly we risk crashing in the dynamic linker as\n// it tries to resolve uncached PLT entries.\n\n#ifndef CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_\n#define CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_\n\n#include <stdint.h>\n#include <limits.h>\n#include <sys/types.h>\n\nextern \"C\" {\n\nstatic inline size_t\nmy_strlen(const char* s) {\n  size_t len = 0;\n  while (*s++) len++;\n  return len;\n}\n\nstatic inline int\nmy_strcmp(const char* a, const char* b) {\n  for (;;) {\n    if (*a < *b)\n      return -1;\n    else if (*a > *b)\n      return 1;\n    else if (*a == 0)\n      return 0;\n    a++;\n    b++;\n  }\n}\n\nstatic inline int\nmy_strncmp(const char* a, const char* b, size_t len) {\n  for (size_t i = 0; i < len; ++i) {\n    if (*a < *b)\n      return -1;\n    else if (*a > *b)\n      return 1;\n    else if (*a == 0)\n      return 0;\n    a++;\n    b++;\n  }\n\n  return 0;\n}\n\n// Parse a non-negative integer.\n//   result: (output) the resulting non-negative integer\n//   s: a NUL terminated string\n// Return true iff successful.\nstatic inline bool\nmy_strtoui(int* result, const char* s) {\n  if (*s == 0)\n    return false;\n  int r = 0;\n  for (;; s++) {\n    if (*s == 0)\n      break;\n    const int old_r = r;\n    r *= 10;\n    if (*s < '0' || *s > '9')\n      return false;\n    r += *s - '0';\n    if (r < old_r)\n      return false;\n  }\n\n  *result = r;\n  return true;\n}\n\n// Return the length of the given, non-negative integer when expressed in base\n// 10.\nstatic inline unsigned\nmy_int_len(intmax_t i) {\n  if (!i)\n    return 1;\n\n  int len = 0;\n  while (i) {\n    len++;\n    i /= 10;\n  }\n\n  return len;\n}\n\n// Convert a non-negative integer to a string\n//   output: (output) the resulting string is written here. This buffer must be\n//     large enough to hold the resulting string. Call |my_int_len| to get the\n//     required length.\n//   i: the non-negative integer to serialise.\n//   i_len: the length of the integer in base 10 (see |my_int_len|).\nstatic inline void\nmy_itos(char* output, intmax_t i, unsigned i_len) {\n  for (unsigned index = i_len; index; --index, i /= 10)\n    output[index - 1] = '0' + (i % 10);\n}\n\nstatic inline const char*\nmy_strchr(const char* haystack, char needle) {\n  while (*haystack && *haystack != needle)\n    haystack++;\n  if (*haystack == needle)\n    return haystack;\n  return (const char*) 0;\n}\n\n// Read a hex value\n//   result: (output) the resulting value\n//   s: a string\n// Returns a pointer to the first invalid charactor.\nstatic inline const char*\nmy_read_hex_ptr(uintptr_t* result, const char* s) {\n  uintptr_t r = 0;\n\n  for (;; ++s) {\n    if (*s >= '0' && *s <= '9') {\n      r <<= 4;\n      r += *s - '0';\n    } else if (*s >= 'a' && *s <= 'f') {\n      r <<= 4;\n      r += (*s - 'a') + 10;\n    } else if (*s >= 'A' && *s <= 'F') {\n      r <<= 4;\n      r += (*s - 'A') + 10;\n    } else {\n      break;\n    }\n  }\n\n  *result = r;\n  return s;\n}\n\nstatic inline void\nmy_memset(void* ip, char c, size_t len) {\n  char* p = (char *) ip;\n  while (len--)\n    *p++ = c;\n}\n\n}  // extern \"C\"\n\n#endif  // CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/linux_libc_support_unittest.cc",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"common/linux/linux_libc_support.h\"\n#include \"testing/gtest/include/gtest/gtest.h\"\n\nnamespace {\ntypedef testing::Test LinuxLibcSupportTest;\n}\n\nTEST(LinuxLibcSupportTest, strlen) {\n  static const char* test_data[] = { \"\", \"a\", \"aa\", \"aaa\", \"aabc\", NULL };\n  for (unsigned i = 0; ; ++i) {\n    if (!test_data[i])\n      break;\n    ASSERT_EQ(strlen(test_data[i]), my_strlen(test_data[i]));\n  }\n}\n\nTEST(LinuxLibcSupportTest, strcmp) {\n  static const char* test_data[] = {\n    \"\", \"\",\n    \"a\", \"\",\n    \"\", \"a\",\n    \"a\", \"b\",\n    \"a\", \"a\",\n    \"ab\", \"aa\",\n    \"abc\", \"ab\",\n    \"abc\", \"abc\",\n    NULL,\n  };\n\n  for (unsigned i = 0; ; ++i) {\n    if (!test_data[i*2])\n      break;\n    int libc_result = strcmp(test_data[i*2], test_data[i*2 + 1]);\n    if (libc_result > 1)\n      libc_result = 1;\n    else if (libc_result < -1)\n      libc_result = -1;\n    ASSERT_EQ(my_strcmp(test_data[i*2], test_data[i*2 + 1]), libc_result);\n  }\n}\n\nTEST(LinuxLibcSupportTest, strtoui) {\n  int result;\n\n  ASSERT_FALSE(my_strtoui(&result, \"\"));\n  ASSERT_FALSE(my_strtoui(&result, \"-1\"));\n  ASSERT_FALSE(my_strtoui(&result, \"-\"));\n  ASSERT_FALSE(my_strtoui(&result, \"a\"));\n  ASSERT_FALSE(my_strtoui(&result, \"23472893472938472987987398472398\"));\n\n  ASSERT_TRUE(my_strtoui(&result, \"0\"));\n  ASSERT_EQ(result, 0);\n  ASSERT_TRUE(my_strtoui(&result, \"1\"));\n  ASSERT_EQ(result, 1);\n  ASSERT_TRUE(my_strtoui(&result, \"12\"));\n  ASSERT_EQ(result, 12);\n  ASSERT_TRUE(my_strtoui(&result, \"123\"));\n  ASSERT_EQ(result, 123);\n  ASSERT_TRUE(my_strtoui(&result, \"0123\"));\n  ASSERT_EQ(result, 123);\n}\n\nTEST(LinuxLibcSupportTest, int_len) {\n  ASSERT_EQ(my_int_len(0), 1);\n  ASSERT_EQ(my_int_len(2), 1);\n  ASSERT_EQ(my_int_len(5), 1);\n  ASSERT_EQ(my_int_len(9), 1);\n  ASSERT_EQ(my_int_len(10), 2);\n  ASSERT_EQ(my_int_len(99), 2);\n  ASSERT_EQ(my_int_len(100), 3);\n  ASSERT_EQ(my_int_len(101), 3);\n  ASSERT_EQ(my_int_len(1000), 4);\n}\n\nTEST(LinuxLibcSupportTest, itos) {\n  char buf[10];\n\n  my_itos(buf, 0, 1);\n  ASSERT_EQ(0, memcmp(buf, \"0\", 1));\n\n  my_itos(buf, 1, 1);\n  ASSERT_EQ(0, memcmp(buf, \"1\", 1));\n\n  my_itos(buf, 10, 2);\n  ASSERT_EQ(0, memcmp(buf, \"10\", 2));\n\n  my_itos(buf, 63, 2);\n  ASSERT_EQ(0, memcmp(buf, \"63\", 2));\n\n  my_itos(buf, 101, 3);\n  ASSERT_EQ(0, memcmp(buf, \"101\", 2));\n}\n\nTEST(LinuxLibcSupportTest, strchr) {\n  ASSERT_EQ(NULL, my_strchr(\"abc\", 'd'));\n  ASSERT_EQ(NULL, my_strchr(\"\", 'd'));\n  ASSERT_EQ(NULL, my_strchr(\"efghi\", 'd'));\n\n  ASSERT_TRUE(my_strchr(\"a\", 'a'));\n  ASSERT_TRUE(my_strchr(\"abc\", 'a'));\n  ASSERT_TRUE(my_strchr(\"bcda\", 'a'));\n  ASSERT_TRUE(my_strchr(\"sdfasdf\", 'a'));\n}\n\nTEST(LinuxLibcSupportTest, read_hex_ptr) {\n  uintptr_t result;\n  const char* last;\n\n  last = my_read_hex_ptr(&result, \"\");\n  ASSERT_EQ(result, 0);\n  ASSERT_EQ(*last, 0);\n\n  last = my_read_hex_ptr(&result, \"0\");\n  ASSERT_EQ(result, 0);\n  ASSERT_EQ(*last, 0);\n\n  last = my_read_hex_ptr(&result, \"0123\");\n  ASSERT_EQ(result, 0x123);\n  ASSERT_EQ(*last, 0);\n\n  last = my_read_hex_ptr(&result, \"0123a\");\n  ASSERT_EQ(result, 0x123a);\n  ASSERT_EQ(*last, 0);\n\n  last = my_read_hex_ptr(&result, \"0123a-\");\n  ASSERT_EQ(result, 0x123a);\n  ASSERT_EQ(*last, '-');\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/memory_mapped_file.cc",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// memory_mapped_file.cc: Implement google_breakpad::MemoryMappedFile.\n// See memory_mapped_file.h for details.\n\n#include \"common/linux/memory_mapped_file.h\"\n\n#include <fcntl.h>\n#include <sys/mman.h>\n#if defined(__ANDROID__)\n#include <sys/stat.h>\n#endif\n#include <unistd.h>\n\n#include \"common/memory_range.h\"\n#include \"third_party/lss/linux_syscall_support.h\"\n\nnamespace google_breakpad {\n\nMemoryMappedFile::MemoryMappedFile() {}\n\nMemoryMappedFile::MemoryMappedFile(const char* path) {\n  Map(path);\n}\n\nMemoryMappedFile::~MemoryMappedFile() {\n  Unmap();\n}\n\nbool MemoryMappedFile::Map(const char* path) {\n  Unmap();\n\n  int fd = sys_open(path, O_RDONLY, 0);\n  if (fd == -1) {\n    return false;\n  }\n\n#if defined(__ANDROID__)\n  struct stat st;\n  if (fstat(fd, &st) != 0) {\n#elif defined(__x86_64__)\n  struct kernel_stat st;\n  if (sys_fstat(fd, &st) == -1 || st.st_size < 0) {\n#else\n  struct kernel_stat64 st;\n  if (sys_fstat64(fd, &st) == -1 || st.st_size < 0) {\n#endif\n    sys_close(fd);\n    return false;\n  }\n\n  // If the file size is zero, simply use an empty MemoryRange and return\n  // true. Don't bother to call mmap() even though mmap() can handle an\n  // empty file on some platforms.\n  if (st.st_size == 0) {\n    sys_close(fd);\n    return true;\n  }\n\n#if defined(__x86_64__)\n  void* data = sys_mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);\n#else\n  void* data = sys_mmap2(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);\n#endif\n  sys_close(fd);\n  if (data == MAP_FAILED) {\n    return false;\n  }\n\n  content_.Set(data, st.st_size);\n  return true;\n}\n\nvoid MemoryMappedFile::Unmap() {\n  if (content_.data()) {\n    sys_munmap(const_cast<u_int8_t*>(content_.data()), content_.length());\n    content_.Set(NULL, 0);\n  }\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/memory_mapped_file.h",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// memory_mapped_file.h: Define the google_breakpad::MemoryMappedFile\n// class, which maps a file into memory for read-only access.\n\n#ifndef COMMON_LINUX_MEMORY_MAPPED_FILE_H_\n#define COMMON_LINUX_MEMORY_MAPPED_FILE_H_\n\n#include \"common/basictypes.h\"\n#include \"common/memory_range.h\"\n\nnamespace google_breakpad {\n\n// A utility class for mapping a file into memory for read-only access of\n// the file content. Its implementation avoids calling into libc functions\n// by directly making system calls for open, close, mmap, and munmap.\nclass MemoryMappedFile {\n public:\n  MemoryMappedFile();\n\n  // Constructor that calls Map() to map a file at |path| into memory.\n  // If Map() fails, the object behaves as if it is default constructed.\n  explicit MemoryMappedFile(const char* path);\n\n  ~MemoryMappedFile();\n\n  // Maps a file at |path| into memory, which can then be accessed via\n  // content() as a MemoryRange object or via data(), and returns true on\n  // success. Mapping an empty file will succeed but with data() and size()\n  // returning NULL and 0, respectively. An existing mapping is unmapped\n  // before a new mapping is created.\n  bool Map(const char* path);\n\n  // Unmaps the memory for the mapped file. It's a no-op if no file is\n  // mapped.\n  void Unmap();\n\n  // Returns a MemoryRange object that covers the memory for the mapped\n  // file. The MemoryRange object is empty if no file is mapped.\n  const MemoryRange& content() const { return content_; }\n\n  // Returns a pointer to the beginning of the memory for the mapped file.\n  // or NULL if no file is mapped or the mapped file is empty.\n  const void* data() const { return content_.data(); }\n\n  // Returns the size in bytes of the mapped file, or zero if no file\n  // is mapped.\n  size_t size() const { return content_.length(); }\n\n private:\n  // Mapped file content as a MemoryRange object.\n  MemoryRange content_;\n\n  DISALLOW_COPY_AND_ASSIGN(MemoryMappedFile);\n};\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_LINUX_MEMORY_MAPPED_FILE_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/memory_mapped_file_unittest.cc",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// memory_mapped_file_unittest.cc:\n// Unit tests for google_breakpad::MemoryMappedFile.\n\n#include <fcntl.h>\n#include <string.h>\n#include <unistd.h>\n\n#include <string>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/linux/eintr_wrapper.h\"\n#include \"common/linux/memory_mapped_file.h\"\n#include \"common/tests/auto_tempdir.h\"\n#include \"common/tests/file_utils.h\"\n\nusing google_breakpad::AutoTempDir;\nusing google_breakpad::MemoryMappedFile;\nusing google_breakpad::WriteFile;\nusing std::string;\n\nnamespace {\n\nclass MemoryMappedFileTest : public testing::Test {\n protected:\n  void ExpectNoMappedData(const MemoryMappedFile& mapped_file) {\n    EXPECT_TRUE(mapped_file.content().IsEmpty());\n    EXPECT_TRUE(mapped_file.data() == NULL);\n    EXPECT_EQ(0, mapped_file.size());\n  }\n};\n\n}  // namespace\n\nTEST_F(MemoryMappedFileTest, DefaultConstructor) {\n  MemoryMappedFile mapped_file;\n  ExpectNoMappedData(mapped_file);\n}\n\nTEST_F(MemoryMappedFileTest, UnmapWithoutMap) {\n  MemoryMappedFile mapped_file;\n  mapped_file.Unmap();\n}\n\nTEST_F(MemoryMappedFileTest, MapNonexistentFile) {\n  {\n    MemoryMappedFile mapped_file(\"nonexistent-file\");\n    ExpectNoMappedData(mapped_file);\n  }\n  {\n    MemoryMappedFile mapped_file;\n    EXPECT_FALSE(mapped_file.Map(\"nonexistent-file\"));\n    ExpectNoMappedData(mapped_file);\n  }\n}\n\nTEST_F(MemoryMappedFileTest, MapEmptyFile) {\n  AutoTempDir temp_dir;\n  string test_file = temp_dir.path() + \"/empty_file\";\n  ASSERT_TRUE(WriteFile(test_file.c_str(), NULL, 0));\n\n  {\n    MemoryMappedFile mapped_file(test_file.c_str());\n    ExpectNoMappedData(mapped_file);\n  }\n  {\n    MemoryMappedFile mapped_file;\n    EXPECT_TRUE(mapped_file.Map(test_file.c_str()));\n    ExpectNoMappedData(mapped_file);\n  }\n}\n\nTEST_F(MemoryMappedFileTest, MapNonEmptyFile) {\n  char data[256];\n  size_t data_size = sizeof(data);\n  for (size_t i = 0; i < data_size; ++i) {\n    data[i] = i;\n  }\n\n  AutoTempDir temp_dir;\n  string test_file = temp_dir.path() + \"/test_file\";\n  ASSERT_TRUE(WriteFile(test_file.c_str(), data, data_size));\n\n  {\n    MemoryMappedFile mapped_file(test_file.c_str());\n    EXPECT_FALSE(mapped_file.content().IsEmpty());\n    EXPECT_TRUE(mapped_file.data() != NULL);\n    EXPECT_EQ(data_size, mapped_file.size());\n    EXPECT_EQ(0, memcmp(data, mapped_file.data(), data_size));\n  }\n  {\n    MemoryMappedFile mapped_file;\n    EXPECT_TRUE(mapped_file.Map(test_file.c_str()));\n    EXPECT_FALSE(mapped_file.content().IsEmpty());\n    EXPECT_TRUE(mapped_file.data() != NULL);\n    EXPECT_EQ(data_size, mapped_file.size());\n    EXPECT_EQ(0, memcmp(data, mapped_file.data(), data_size));\n  }\n}\n\nTEST_F(MemoryMappedFileTest, RemapAfterMap) {\n  char data1[256];\n  size_t data1_size = sizeof(data1);\n  for (size_t i = 0; i < data1_size; ++i) {\n    data1[i] = i;\n  }\n\n  char data2[50];\n  size_t data2_size = sizeof(data2);\n  for (size_t i = 0; i < data2_size; ++i) {\n    data2[i] = 255 - i;\n  }\n\n  AutoTempDir temp_dir;\n  string test_file1 = temp_dir.path() + \"/test_file1\";\n  string test_file2 = temp_dir.path() + \"/test_file2\";\n  ASSERT_TRUE(WriteFile(test_file1.c_str(), data1, data1_size));\n  ASSERT_TRUE(WriteFile(test_file2.c_str(), data2, data2_size));\n\n  {\n    MemoryMappedFile mapped_file(test_file1.c_str());\n    EXPECT_FALSE(mapped_file.content().IsEmpty());\n    EXPECT_TRUE(mapped_file.data() != NULL);\n    EXPECT_EQ(data1_size, mapped_file.size());\n    EXPECT_EQ(0, memcmp(data1, mapped_file.data(), data1_size));\n\n    mapped_file.Map(test_file2.c_str());\n    EXPECT_FALSE(mapped_file.content().IsEmpty());\n    EXPECT_TRUE(mapped_file.data() != NULL);\n    EXPECT_EQ(data2_size, mapped_file.size());\n    EXPECT_EQ(0, memcmp(data2, mapped_file.data(), data2_size));\n  }\n  {\n    MemoryMappedFile mapped_file;\n    EXPECT_TRUE(mapped_file.Map(test_file1.c_str()));\n    EXPECT_FALSE(mapped_file.content().IsEmpty());\n    EXPECT_TRUE(mapped_file.data() != NULL);\n    EXPECT_EQ(data1_size, mapped_file.size());\n    EXPECT_EQ(0, memcmp(data1, mapped_file.data(), data1_size));\n\n    mapped_file.Map(test_file2.c_str());\n    EXPECT_FALSE(mapped_file.content().IsEmpty());\n    EXPECT_TRUE(mapped_file.data() != NULL);\n    EXPECT_EQ(data2_size, mapped_file.size());\n    EXPECT_EQ(0, memcmp(data2, mapped_file.data(), data2_size));\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/safe_readlink.cc",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// safe_readlink.cc: Implement google_breakpad::SafeReadLink.\n// See safe_readlink.h for details.\n\n#include <stddef.h>\n\n#include \"third_party/lss/linux_syscall_support.h\"\n\nnamespace google_breakpad {\n\nbool SafeReadLink(const char* path, char* buffer, size_t buffer_size) {\n  // sys_readlink() does not add a NULL byte to |buffer|. In order to return\n  // a NULL-terminated string in |buffer|, |buffer_size| should be at least\n  // one byte longer than the expected path length. Also, sys_readlink()\n  // returns the actual path length on success, which does not count the\n  // NULL byte, so |result_size| should be less than |buffer_size|.\n  ssize_t result_size = sys_readlink(path, buffer, buffer_size);\n  if (result_size >= 0 && static_cast<size_t>(result_size) < buffer_size) {\n    buffer[result_size] = '\\0';\n    return true;\n  }\n  return false;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/safe_readlink.h",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// safe_readlink.h: Define the google_breakpad::SafeReadLink function,\n// which wraps sys_readlink and gurantees the result is NULL-terminated.\n\n#ifndef COMMON_LINUX_SAFE_READLINK_H_\n#define COMMON_LINUX_SAFE_READLINK_H_\n\n#include <stddef.h>\n\nnamespace google_breakpad {\n\n// This function wraps sys_readlink() and performs the same functionalty,\n// but guarantees |buffer| is NULL-terminated if sys_readlink() returns\n// no error. It takes the same arguments as sys_readlink(), but unlike\n// sys_readlink(), it returns true on success.\n//\n// |buffer_size| specifies the size of |buffer| in bytes. As this function\n// always NULL-terminates |buffer| on success, |buffer_size| should be\n// at least one byte longer than the expected path length (e.g. PATH_MAX,\n// which is typically defined as the maximum length of a path name\n// including the NULL byte).\n//\n// The implementation of this function calls sys_readlink() instead of\n// readlink(), it can thus be used in the context where calling to libc\n// functions is discouraged.\nbool SafeReadLink(const char* path, char* buffer, size_t buffer_size);\n\n// Same as the three-argument version of SafeReadLink() but deduces the\n// size of |buffer| if it is a char array of known size.\ntemplate <size_t N>\nbool SafeReadLink(const char* path, char (&buffer)[N]) {\n  return SafeReadLink(path, buffer, sizeof(buffer));\n}\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_LINUX_SAFE_READLINK_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/safe_readlink_unittest.cc",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// safe_readlink_unittest.cc: Unit tests for google_breakpad::SafeReadLink.\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/linux/safe_readlink.h\"\n\nusing google_breakpad::SafeReadLink;\n\nTEST(SafeReadLinkTest, ZeroBufferSize) {\n  char buffer[1];\n  EXPECT_FALSE(SafeReadLink(\"/proc/self/exe\", buffer, 0));\n}\n\nTEST(SafeReadLinkTest, BufferSizeTooSmall) {\n  char buffer[1];\n  EXPECT_FALSE(SafeReadLink(\"/proc/self/exe\", buffer, 1));\n}\n\nTEST(SafeReadLinkTest, BoundaryBufferSize) {\n  char buffer[PATH_MAX];\n  EXPECT_TRUE(SafeReadLink(\"/proc/self/exe\", buffer, sizeof(buffer)));\n  size_t path_length = strlen(buffer);\n  EXPECT_LT(0, path_length);\n  EXPECT_GT(sizeof(buffer), path_length);\n\n  // Buffer size equals to the expected path length plus 1 for the NULL byte.\n  char buffer2[PATH_MAX];\n  EXPECT_TRUE(SafeReadLink(\"/proc/self/exe\", buffer2, path_length + 1));\n  EXPECT_EQ(path_length, strlen(buffer2));\n  EXPECT_EQ(0, strncmp(buffer, buffer2, PATH_MAX));\n\n  // Buffer size equals to the expected path length.\n  EXPECT_FALSE(SafeReadLink(\"/proc/self/exe\", buffer, path_length));\n}\n\nTEST(SafeReadLinkTest, NonexistentPath) {\n  char buffer[PATH_MAX];\n  EXPECT_FALSE(SafeReadLink(\"nonexistent_path\", buffer, sizeof(buffer)));\n}\n\nTEST(SafeReadLinkTest, NonSymbolicLinkPath) {\n  char actual_path[PATH_MAX];\n  EXPECT_TRUE(SafeReadLink(\"/proc/self/exe\", actual_path, sizeof(actual_path)));\n\n  char buffer[PATH_MAX];\n  EXPECT_FALSE(SafeReadLink(actual_path, buffer, sizeof(buffer)));\n}\n\nTEST(SafeReadLinkTest, DeduceBufferSizeFromCharArray) {\n  char buffer[PATH_MAX];\n  char* buffer_pointer = buffer;\n  EXPECT_TRUE(SafeReadLink(\"/proc/self/exe\", buffer_pointer, sizeof(buffer)));\n  size_t path_length = strlen(buffer);\n\n  // Use the template version of SafeReadLink to deduce the buffer size\n  // from the char array.\n  char buffer2[PATH_MAX];\n  EXPECT_TRUE(SafeReadLink(\"/proc/self/exe\", buffer2));\n  EXPECT_EQ(path_length, strlen(buffer2));\n  EXPECT_EQ(0, strncmp(buffer, buffer2, PATH_MAX));\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/synth_elf.cc",
    "content": "#include \"common/linux/synth_elf.h\"\n\n#include <assert.h>\n#include <elf.h>\n#include <stdio.h>\n#include <string.h>\n\nnamespace google_breakpad {\nnamespace synth_elf {\n\n#ifndef NT_GNU_BUILD_ID\n#define NT_GNU_BUILD_ID 3\n#endif\n\nELF::ELF(uint16_t machine,\n         uint8_t file_class,\n         Endianness endianness)\n  : Section(endianness),\n    addr_size_(file_class == ELFCLASS64 ? 8 : 4),\n    program_count_(0),\n    section_count_(0),\n    section_header_table_(endianness),\n    section_header_strings_(endianness) {\n  // Could add support for more machine types here if needed.\n  assert(machine == EM_386 ||\n         machine == EM_X86_64 ||\n         machine == EM_ARM);\n  assert(file_class == ELFCLASS32 || file_class == ELFCLASS64);\n\n  start() = 0;\n  // Add ELF header\n  // e_ident\n  // EI_MAG0...EI_MAG3\n  D8(ELFMAG0);\n  D8(ELFMAG1);\n  D8(ELFMAG2);\n  D8(ELFMAG3);\n  // EI_CLASS\n  D8(file_class);\n  // EI_DATA\n  D8(endianness == kLittleEndian ? ELFDATA2LSB : ELFDATA2MSB);\n  // EI_VERSION\n  D8(EV_CURRENT);\n  // EI_OSABI\n  D8(ELFOSABI_SYSV);\n  // EI_ABIVERSION\n  D8(0);\n  // EI_PAD\n  Append(7, 0);\n  assert(Size() == EI_NIDENT);\n\n  // e_type\n  D16(ET_EXEC);  //TODO: allow passing ET_DYN?\n  // e_machine\n  D16(machine);\n  // e_version\n  D32(EV_CURRENT);\n  // e_entry\n  Append(endianness, addr_size_, 0);\n  // e_phoff\n  Append(endianness, addr_size_, program_header_label_);\n  // e_shoff\n  Append(endianness, addr_size_, section_header_label_);\n  // e_flags\n  D32(0);\n  // e_ehsize\n  D16(addr_size_ == 8 ? sizeof(Elf64_Ehdr) : sizeof(Elf32_Ehdr));\n  // e_phentsize\n  D16(addr_size_ == 8 ? sizeof(Elf64_Phdr) : sizeof(Elf32_Phdr));\n  // e_phnum\n  D16(program_count_label_);\n  // e_shentsize\n  D16(addr_size_ == 8 ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr));\n  // e_shnum\n  D16(section_count_label_);\n  // e_shstrndx\n  D16(section_header_string_index_);\n\n  // Add an empty section for SHN_UNDEF.\n  Section shn_undef;\n  AddSection(\"\", shn_undef, SHT_NULL);\n}\n\nint ELF::AddSection(const string& name, const Section& section,\n                    uint32_t type, uint32_t flags, uint64_t addr,\n                    uint32_t link, uint64_t entsize, uint64_t offset) {\n  Label offset_label;\n  Label string_label(section_header_strings_.Add(name));\n  size_t size = section.Size();\n\n  int index = section_count_;\n  ++section_count_;\n\n  section_header_table_\n    // sh_name\n    .D32(string_label)\n    // sh_type\n    .D32(type)\n    // sh_flags\n    .Append(endianness(), addr_size_, flags)\n    // sh_addr\n    .Append(endianness(), addr_size_, addr)\n    // sh_offset\n    .Append(endianness(), addr_size_, offset_label)\n    // sh_size\n    .Append(endianness(), addr_size_, size)\n    // sh_link\n    .D32(link)\n    // sh_info\n    .D32(0)\n    // sh_addralign\n    .Append(endianness(), addr_size_, 0)\n    // sh_entsize\n    .Append(endianness(), addr_size_, entsize);\n\n  // NULL and NOBITS sections have no content, so they\n  // don't need to be written to the file.\n  if (type == SHT_NULL) {\n    offset_label = 0;\n  } else if (type == SHT_NOBITS) {\n    offset_label = offset;\n  } else {\n    Mark(&offset_label);\n    Append(section);\n    Align(4);\n  }\n  return index;\n}\n\nvoid ELF::Finish() {\n  // Add the section header string table at the end.\n  section_header_string_index_ = section_count_;\n  //printf(\".shstrtab size: %ld\\n\", section_header_strings_.Size());\n  AddSection(\".shstrtab\", section_header_strings_, SHT_STRTAB);\n  //printf(\"section_count_: %ld, sections_.size(): %ld\\n\",\n  //     section_count_, sections_.size());\n  section_count_label_ = section_count_;\n  program_count_label_ = program_count_;\n  // TODO:  allow adding entries to program header table\n  program_header_label_ = 0;\n\n  // Section header table starts here.\n  Mark(&section_header_label_);\n  Append(section_header_table_);\n}\n\nSymbolTable::SymbolTable(Endianness endianness,\n                         size_t addr_size,\n                         StringTable& table) : Section(endianness),\n                                               addr_size_(addr_size),\n                                               table_(table) {\n  assert(addr_size_ == 4 || addr_size_ == 8);\n}\n\nvoid SymbolTable::AddSymbol(const string& name, uint32_t value,\n                            uint32_t size, unsigned info, uint16_t shndx) {\n  assert(addr_size_ == 4);\n  D32(table_.Add(name));\n  D32(value);\n  D32(size);\n  D8(info);\n  D8(0); // other\n  D16(shndx);\n}\n\nvoid SymbolTable::AddSymbol(const string& name, uint64_t value,\n                            uint64_t size, unsigned info, uint16_t shndx) {\n  assert(addr_size_ == 8);\n  D32(table_.Add(name));\n  D8(info);\n  D8(0); // other\n  D16(shndx);\n  D64(value);\n  D64(size);\n}\n\nBuildIDNote::BuildIDNote(const uint8_t* id_bytes,\n                         size_t id_size,\n                         Endianness endianness) : Section(endianness) {\n  const char kNoteName[] = \"GNU\";\n  // Elf32_Nhdr and Elf64_Nhdr are exactly the same.\n  Elf32_Nhdr note_header;\n  memset(&note_header, 0, sizeof(note_header));\n  note_header.n_namesz = sizeof(kNoteName);\n  note_header.n_descsz = id_size;\n  note_header.n_type = NT_GNU_BUILD_ID;\n\n  Append(reinterpret_cast<const uint8_t*>(&note_header),\n         sizeof(note_header));\n  AppendCString(kNoteName);\n  Append(id_bytes, id_size);\n}\n\n// static\nvoid BuildIDNote::AppendSection(ELF& elf,\n                                const uint8_t* id_bytes,\n                                size_t id_size) {\n  const char kBuildIDSectionName[] = \".note.gnu.build-id\";\n  BuildIDNote note(id_bytes, id_size, elf.endianness());\n  elf.AddSection(kBuildIDSectionName, note, SHT_NOTE);\n}\n\n}  // namespace synth_elf\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/synth_elf.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Ted Mielczarek <ted.mielczarek@gmail.com>\n\n// synth_elf.h: Interface to synth_elf::ELF: fake ELF generator.\n\n#ifndef COMMON_LINUX_SYNTH_ELF_H_\n#define COMMON_LINUX_SYNTH_ELF_H_\n\n#include \"common/test_assembler.h\"\n\n#include <list>\n#include <map>\n#include <string>\n#include <utility>\n\nnamespace google_breakpad {\nnamespace synth_elf {\n\nusing std::list;\nusing std::map;\nusing std::pair;\nusing std::string;\nusing test_assembler::Endianness;\nusing test_assembler::kLittleEndian;\nusing test_assembler::kUnsetEndian;\nusing test_assembler::Label;\nusing test_assembler::Section;\n\n// String tables are common in ELF headers, so subclass Section\n// to make them easy to generate.\nclass StringTable : public Section {\npublic:\n  StringTable(Endianness endianness = kUnsetEndian)\n  : Section(endianness) {\n    start() = 0;\n    empty_string = Add(\"\");\n  }\n\n  // Add the string s to the string table, and return\n  // a label containing the offset into the string table\n  // at which it was added.\n  Label Add(const string& s) {\n    if (strings_.find(s) != strings_.end())\n      return strings_[s];\n\n    Label string_label(Here());\n    AppendCString(s);\n    strings_[s] = string_label;\n    return string_label;\n  }\n\n  // All StringTables contain an empty string as their first\n  // entry.\n  Label empty_string;\n\n  // Avoid inserting duplicate strings.\n  map<string,Label> strings_;\n};\n\n// A Section representing an entire ELF file.\nclass ELF : public Section {\n public:\n  ELF(uint16_t machine,    // EM_386, etc\n      uint8_t file_class,  // ELFCLASS{32,64}\n      Endianness endianness = kLittleEndian);\n\n  // Add the Section section to the section header table and append it\n  // to the file. Returns the index of the section in the section\n  // header table.\n  int AddSection(const string& name, const Section& section,\n                 uint32_t type, uint32_t flags = 0, uint64_t addr = 0,\n                 uint32_t link = 0, uint64_t entsize = 0, uint64_t offset = 0);\n                  \n  // Write out all data. GetContents may be used after this.\n  void Finish();\n\n private:\n  // Size of an address, in bytes.\n  const size_t addr_size_;\n\n  // Offset to the program header table.\n  Label program_header_label_;\n  // Number of entries in the program header table.\n  int program_count_;\n  Label program_count_label_;\n\n  // Offset to the section header table.\n  Label section_header_label_;\n  // Number of entries in the section header table.\n  int section_count_;\n  Label section_count_label_;\n  // The section header table itself.\n  Section section_header_table_;\n\n  // Index of the section header string table in the section\n  // header table.\n  Label section_header_string_index_;\n  // Section containing the names of section header table entries.\n  StringTable section_header_strings_;\n};\n\n// A class to build .symtab or .dynsym sections.\nclass SymbolTable : public Section {\n public:\n  // table is the StringTable that contains symbol names. The caller\n  // must ensure that it remains alive for the life of the\n  // SymbolTable.\n  SymbolTable(Endianness endianness, size_t addr_size, StringTable& table);\n\n  // Add an Elf32_Sym.\n  void AddSymbol(const string& name, uint32_t value,\n                 uint32_t size, unsigned info, uint16_t shndx);\n  // Add an Elf64_Sym.\n  void AddSymbol(const string& name, uint64_t value,\n                 uint64_t size, unsigned info, uint16_t shndx);\n\n private:\n  size_t addr_size_;\n  StringTable& table_;\n};\n\n// A class to build GNU Build ID note sections\nclass BuildIDNote : public Section {\npublic:\n  BuildIDNote(const uint8_t* id_bytes, size_t id_size, Endianness endianness);\n\n  // Append a new Build ID note section to |elf|.\n  static void AppendSection(ELF& elf, const uint8_t* id_bytes, size_t id_size);\n};\n\n}  // namespace synth_elf\n}  // namespace google_breakpad\n\n#endif  // COMMON_LINUX_SYNTH_ELF_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/synth_elf_unittest.cc",
    "content": "// Copyright (c) 2011 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Ted Mielczarek <ted.mielczarek@gmail.com>\n\n// synth_elf_unittest.cc:\n// Unittests for google_breakpad::synth_elf::ELF\n\n#include <elf.h>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/linux/synth_elf.h\"\n\nusing google_breakpad::synth_elf::ELF;\nusing google_breakpad::synth_elf::StringTable;\nusing google_breakpad::synth_elf::SymbolTable;\nusing google_breakpad::test_assembler::Endianness;\nusing google_breakpad::test_assembler::kBigEndian;\nusing google_breakpad::test_assembler::kLittleEndian;\nusing google_breakpad::test_assembler::Label;\nusing std::string;\nusing ::testing::Test;\n\nclass StringTableTest : public Test {\npublic:\n  StringTableTest() : table(kLittleEndian) {}\n\n  StringTable table;\n};\n\nTEST_F(StringTableTest, Empty) {\n  EXPECT_EQ(1, table.Size());\n  string contents;\n  ASSERT_TRUE(table.GetContents(&contents));\n  const char* kExpectedContents = \"\\0\";\n  EXPECT_EQ(0, memcmp(kExpectedContents,\n                      contents.c_str(),\n                      contents.size()));\n  ASSERT_TRUE(table.empty_string.IsKnownConstant());\n  EXPECT_EQ(0, table.empty_string.Value());\n}\n\nTEST_F(StringTableTest, Basic) {\n  const string s1(\"table fills with strings\");\n  const string s2(\"offsets preserved as labels\");\n  const string s3(\"verified with tests\");\n  const char* kExpectedContents = \n    \"\\0table fills with strings\\0\"\n    \"offsets preserved as labels\\0\"\n    \"verified with tests\\0\";\n  Label l1(table.Add(s1));\n  Label l2(table.Add(s2));\n  Label l3(table.Add(s3));\n  string contents;\n  ASSERT_TRUE(table.GetContents(&contents));\n  EXPECT_EQ(0, memcmp(kExpectedContents,\n                      contents.c_str(),\n                      contents.size()));\n  // empty_string is at zero, other strings start at 1.\n  ASSERT_TRUE(l1.IsKnownConstant());\n  EXPECT_EQ(1, l1.Value());\n  // Each string has an extra byte for a trailing null.\n  EXPECT_EQ(1 + s1.length() + 1, l2.Value());\n  EXPECT_EQ(1 + s1.length() + 1 + s2.length() + 1, l3.Value());\n}\n\nTEST_F(StringTableTest, Duplicates) {\n  const string s1(\"string 1\");\n  const string s2(\"string 2\");\n  const string s3(\"\");\n  const char* kExpectedContents = \"\\0string 1\\0string 2\\0\";\n  Label l1(table.Add(s1));\n  Label l2(table.Add(s2));\n  // Adding strings twice should return the same Label.\n  Label l3(table.Add(s3));\n  Label l4(table.Add(s2));\n  string contents;\n  ASSERT_TRUE(table.GetContents(&contents));\n  EXPECT_EQ(0, memcmp(kExpectedContents,\n                      contents.c_str(),\n                      contents.size()));\n  EXPECT_EQ(0, table.empty_string.Value());\n  EXPECT_EQ(table.empty_string.Value(), l3.Value());\n  EXPECT_EQ(l2.Value(), l4.Value());\n}\n\nclass SymbolTableTest : public Test {};\n\nTEST_F(SymbolTableTest, Simple32) {\n  StringTable table(kLittleEndian);\n  SymbolTable syms(kLittleEndian, 4, table);\n\n  const string kFuncName1 = \"superfunc\";\n  const uint32_t kFuncAddr1 = 0x10001000;\n  const uint32_t kFuncSize1 = 0x10;\n  const string kFuncName2 = \"awesomefunc\";\n  const uint32_t kFuncAddr2 = 0x20002000;\n  const uint32_t kFuncSize2 = 0x2f;\n  const string kFuncName3 = \"megafunc\";\n  const uint32_t kFuncAddr3 = 0x30003000;\n  const uint32_t kFuncSize3 = 0x3c;\n\n  syms.AddSymbol(kFuncName1, kFuncAddr1, kFuncSize1,\n                 ELF32_ST_INFO(STB_GLOBAL, STT_FUNC),\n                 SHN_UNDEF + 1);\n  syms.AddSymbol(kFuncName2, kFuncAddr2, kFuncSize2,\n                 ELF32_ST_INFO(STB_LOCAL, STT_FUNC),\n                 SHN_UNDEF + 2);\n  syms.AddSymbol(kFuncName3, kFuncAddr3, kFuncSize3,\n                 ELF32_ST_INFO(STB_LOCAL, STT_FUNC),\n                 SHN_UNDEF + 3);\n\n  const char kExpectedStringTable[] = \"\\0superfunc\\0awesomefunc\\0megafunc\";\n  const size_t kExpectedStringTableSize = sizeof(kExpectedStringTable);\n  EXPECT_EQ(kExpectedStringTableSize, table.Size());\n  string table_contents;\n  table.GetContents(&table_contents);\n  EXPECT_EQ(0, memcmp(kExpectedStringTable,\n                      table_contents.c_str(),\n                      table_contents.size()));\n\n  const uint8_t kExpectedSymbolContents[] = {\n    // Symbol 1\n    0x01, 0x00, 0x00, 0x00, // name\n    0x00, 0x10, 0x00, 0x10, // value\n    0x10, 0x00, 0x00, 0x00, // size\n    ELF32_ST_INFO(STB_GLOBAL, STT_FUNC), // info\n    0x00, // other\n    0x01, 0x00, // shndx\n    // Symbol 2\n    0x0B, 0x00, 0x00, 0x00, // name\n    0x00, 0x20, 0x00, 0x20, // value\n    0x2f, 0x00, 0x00, 0x00, // size\n    ELF32_ST_INFO(STB_LOCAL, STT_FUNC), // info\n    0x00, // other\n    0x02, 0x00, // shndx\n    // Symbol 3\n    0x17, 0x00, 0x00, 0x00, // name\n    0x00, 0x30, 0x00, 0x30, // value\n    0x3c, 0x00, 0x00, 0x00, // size\n    ELF32_ST_INFO(STB_LOCAL, STT_FUNC), // info\n    0x00, // other\n    0x03, 0x00, // shndx\n  };\n  const size_t kExpectedSymbolSize = sizeof(kExpectedSymbolContents);\n  EXPECT_EQ(kExpectedSymbolSize, syms.Size());\n\n  string symbol_contents;\n  syms.GetContents(&symbol_contents);\n  EXPECT_EQ(0, memcmp(kExpectedSymbolContents,\n                      symbol_contents.c_str(),\n                      symbol_contents.size()));\n}\n\nclass BasicElf : public Test {};\n\n// Doesn't seem worthwhile writing the tests to be endian-independent\n// when they're unlikely to ever be run on big-endian systems.\n#if defined(__i386__) || defined(__x86_64__)\n\nTEST_F(BasicElf, EmptyLE32) {\n  const size_t kStringTableSize = sizeof(\"\\0.shstrtab\");\n  const size_t kStringTableAlign = 4 - kStringTableSize % 4;\n  const size_t kExpectedSize = sizeof(Elf32_Ehdr) +\n    // Two sections, SHT_NULL + the section header string table.\n    2 * sizeof(Elf32_Shdr) +\n    kStringTableSize + kStringTableAlign;\n\n  ELF elf(EM_386, ELFCLASS32, kLittleEndian);\n  elf.Finish();\n  EXPECT_EQ(kExpectedSize, elf.Size());\n\n  string contents;\n  ASSERT_TRUE(elf.GetContents(&contents));\n  ASSERT_EQ(kExpectedSize, contents.size());\n  const Elf32_Ehdr* header =\n    reinterpret_cast<const Elf32_Ehdr*>(contents.data());\n  const uint8_t kIdent[] = {\n    ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3,\n    ELFCLASS32, ELFDATA2LSB, EV_CURRENT, ELFOSABI_SYSV,\n    0, 0, 0, 0, 0, 0, 0, 0\n  };\n  EXPECT_EQ(0, memcmp(kIdent, header->e_ident, sizeof(kIdent)));\n  EXPECT_EQ(ET_EXEC, header->e_type);\n  EXPECT_EQ(EM_386, header->e_machine);\n  EXPECT_EQ(EV_CURRENT, header->e_version);\n  EXPECT_EQ(0, header->e_entry);\n  EXPECT_EQ(0, header->e_phoff);\n  EXPECT_EQ(sizeof(Elf32_Ehdr) + kStringTableSize + kStringTableAlign,\n            header->e_shoff);\n  EXPECT_EQ(0, header->e_flags);\n  EXPECT_EQ(sizeof(Elf32_Ehdr), header->e_ehsize);\n  EXPECT_EQ(sizeof(Elf32_Phdr), header->e_phentsize);\n  EXPECT_EQ(0, header->e_phnum);\n  EXPECT_EQ(sizeof(Elf32_Shdr), header->e_shentsize);\n  EXPECT_EQ(2, header->e_shnum);\n  EXPECT_EQ(1, header->e_shstrndx);\n}\n\nTEST_F(BasicElf, EmptyLE64) {\n  const size_t kStringTableSize = sizeof(\"\\0.shstrtab\");\n  const size_t kStringTableAlign = 4 - kStringTableSize % 4;\n  const size_t kExpectedSize = sizeof(Elf64_Ehdr) +\n    // Two sections, SHT_NULL + the section header string table.\n    2 * sizeof(Elf64_Shdr) +\n    kStringTableSize + kStringTableAlign;\n\n  ELF elf(EM_X86_64, ELFCLASS64, kLittleEndian);\n  elf.Finish();\n  EXPECT_EQ(kExpectedSize, elf.Size());\n\n  string contents;\n  ASSERT_TRUE(elf.GetContents(&contents));\n  ASSERT_EQ(kExpectedSize, contents.size());\n  const Elf64_Ehdr* header =\n    reinterpret_cast<const Elf64_Ehdr*>(contents.data());\n  const uint8_t kIdent[] = {\n    ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3,\n    ELFCLASS64, ELFDATA2LSB, EV_CURRENT, ELFOSABI_SYSV,\n    0, 0, 0, 0, 0, 0, 0, 0\n  };\n  EXPECT_EQ(0, memcmp(kIdent, header->e_ident, sizeof(kIdent)));\n  EXPECT_EQ(ET_EXEC, header->e_type);\n  EXPECT_EQ(EM_X86_64, header->e_machine);\n  EXPECT_EQ(EV_CURRENT, header->e_version);\n  EXPECT_EQ(0, header->e_entry);\n  EXPECT_EQ(0, header->e_phoff);\n  EXPECT_EQ(sizeof(Elf64_Ehdr) + kStringTableSize + kStringTableAlign,\n            header->e_shoff);\n  EXPECT_EQ(0, header->e_flags);\n  EXPECT_EQ(sizeof(Elf64_Ehdr), header->e_ehsize);\n  EXPECT_EQ(sizeof(Elf64_Phdr), header->e_phentsize);\n  EXPECT_EQ(0, header->e_phnum);\n  EXPECT_EQ(sizeof(Elf64_Shdr), header->e_shentsize);\n  EXPECT_EQ(2, header->e_shnum);\n  EXPECT_EQ(1, header->e_shstrndx);\n}\n\n#endif  // defined(__i386__) || defined(__x86_64__)\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/tests/crash_generator.cc",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// crash_generator.cc: Implement google_breakpad::CrashGenerator.\n// See crash_generator.h for details.\n\n#include \"common/linux/tests/crash_generator.h\"\n\n#include <pthread.h>\n#include <signal.h>\n#include <stdio.h>\n#include <sys/mman.h>\n#include <sys/resource.h>\n#include <sys/syscall.h>\n#include <sys/wait.h>\n#include <unistd.h>\n\n#include <string>\n\n#include \"common/linux/eintr_wrapper.h\"\n#include \"common/tests/auto_tempdir.h\"\n#include \"common/tests/file_utils.h\"\n\nnamespace {\n\nstruct ThreadData {\n  pthread_t thread;\n  pthread_barrier_t* barrier;\n  pid_t* thread_id_ptr;\n};\n\nconst char* const kProcFilesToCopy[] = {\n  \"auxv\", \"cmdline\", \"environ\", \"maps\", \"status\"\n};\nconst size_t kNumProcFilesToCopy =\n    sizeof(kProcFilesToCopy) / sizeof(kProcFilesToCopy[0]);\n\n// Core file size limit set to 1 MB, which is big enough for test purposes.\nconst rlim_t kCoreSizeLimit = 1024 * 1024;\n\nvoid *thread_function(void *data) {\n  ThreadData* thread_data = reinterpret_cast<ThreadData*>(data);\n  volatile pid_t thread_id = syscall(__NR_gettid);\n  *(thread_data->thread_id_ptr) = thread_id;\n  int result = pthread_barrier_wait(thread_data->barrier);\n  if (result != 0 && result != PTHREAD_BARRIER_SERIAL_THREAD) {\n    exit(1);\n  }\n  while (true) {\n    pthread_yield();\n  }\n}\n\n}  // namespace\n\nnamespace google_breakpad {\n\nCrashGenerator::CrashGenerator()\n    : shared_memory_(NULL),\n      shared_memory_size_(0) {\n}\n\nCrashGenerator::~CrashGenerator() {\n  UnmapSharedMemory();\n}\n\nbool CrashGenerator::HasDefaultCorePattern() const {\n  char buffer[8];\n  ssize_t buffer_size = sizeof(buffer);\n  return ReadFile(\"/proc/sys/kernel/core_pattern\", buffer, &buffer_size) &&\n         buffer_size == 5 && memcmp(buffer, \"core\", 4) == 0;\n}\n\nstd::string CrashGenerator::GetCoreFilePath() const {\n  return temp_dir_.path() + \"/core\";\n}\n\nstd::string CrashGenerator::GetDirectoryOfProcFilesCopy() const {\n  return temp_dir_.path() + \"/proc\";\n}\n\npid_t CrashGenerator::GetThreadId(unsigned index) const {\n  return reinterpret_cast<pid_t*>(shared_memory_)[index];\n}\n\npid_t* CrashGenerator::GetThreadIdPointer(unsigned index) {\n  return reinterpret_cast<pid_t*>(shared_memory_) + index;\n}\n\nbool CrashGenerator::MapSharedMemory(size_t memory_size) {\n  if (!UnmapSharedMemory())\n    return false;\n\n  void* mapped_memory = mmap(0, memory_size, PROT_READ | PROT_WRITE,\n                             MAP_SHARED | MAP_ANONYMOUS, -1, 0);\n  if (mapped_memory == MAP_FAILED) {\n    perror(\"CrashGenerator: Failed to map shared memory\");\n    return false;\n  }\n\n  memset(mapped_memory, 0, memory_size);\n  shared_memory_ = mapped_memory;\n  shared_memory_size_ = memory_size;\n  return true;\n}\n\nbool CrashGenerator::UnmapSharedMemory() {\n  if (!shared_memory_)\n    return true;\n\n  if (munmap(shared_memory_, shared_memory_size_) == 0) {\n    shared_memory_ = NULL;\n    shared_memory_size_ = 0;\n    return true;\n  }\n\n  perror(\"CrashGenerator: Failed to unmap shared memory\");\n  return false;\n}\n\nbool CrashGenerator::SetCoreFileSizeLimit(rlim_t limit) const {\n  struct rlimit limits = { limit, limit };\n  if (setrlimit(RLIMIT_CORE, &limits) == -1) {\n    perror(\"CrashGenerator: Failed to set core file size limit\");\n    return false;\n  }\n  return true;\n}\n\nbool CrashGenerator::CreateChildCrash(\n    unsigned num_threads, unsigned crash_thread, int crash_signal,\n    pid_t* child_pid) {\n  if (num_threads == 0 || crash_thread >= num_threads)\n    return false;\n\n  if (!MapSharedMemory(num_threads * sizeof(pid_t)))\n    return false;\n\n  pid_t pid = fork();\n  if (pid == 0) {\n    if (chdir(temp_dir_.path().c_str()) == -1) {\n      perror(\"CrashGenerator: Failed to change directory\");\n      exit(1);\n    }\n    if (SetCoreFileSizeLimit(kCoreSizeLimit)) {\n      CreateThreadsInChildProcess(num_threads);\n      std::string proc_dir = GetDirectoryOfProcFilesCopy();\n      if (mkdir(proc_dir.c_str(), 0755) == -1) {\n        perror(\"CrashGenerator: Failed to create proc directory\");\n        exit(1);\n      }\n      if (!CopyProcFiles(getpid(), proc_dir.c_str())) {\n        fprintf(stderr, \"CrashGenerator: Failed to copy proc files\\n\");\n        exit(1);\n      }\n      if (kill(*GetThreadIdPointer(crash_thread), crash_signal) == -1) {\n        perror(\"CrashGenerator: Failed to kill thread by signal\");\n      }\n    }\n    exit(1);\n  } else if (pid == -1) {\n    perror(\"CrashGenerator: Failed to create child process\");\n    return false;\n  }\n\n  int status;\n  if (HANDLE_EINTR(waitpid(pid, &status, 0)) == -1) {\n    perror(\"CrashGenerator: Failed to wait for child process\");\n    return false;\n  }\n  if (!WIFSIGNALED(status) || WTERMSIG(status) != crash_signal) {\n    fprintf(stderr, \"CrashGenerator: Child process not killed by the expected signal\\n\"\n                    \"  exit status=0x%x signaled=%s sig=%d expected=%d\\n\",\n                    status, WIFSIGNALED(status) ? \"true\" : \"false\",\n                    WTERMSIG(status), crash_signal);\n    return false;\n  }\n\n  if (child_pid)\n    *child_pid = pid;\n  return true;\n}\n\nbool CrashGenerator::CopyProcFiles(pid_t pid, const char* path) const {\n  char from_path[PATH_MAX], to_path[PATH_MAX];\n  for (size_t i = 0; i < kNumProcFilesToCopy; ++i) {\n    int num_chars = snprintf(from_path, PATH_MAX, \"/proc/%d/%s\",\n                             pid, kProcFilesToCopy[i]);\n    if (num_chars < 0 || num_chars >= PATH_MAX)\n      return false;\n\n    num_chars = snprintf(to_path, PATH_MAX, \"%s/%s\",\n                         path, kProcFilesToCopy[i]);\n    if (num_chars < 0 || num_chars >= PATH_MAX)\n      return false;\n\n    if (!CopyFile(from_path, to_path))\n      return false;\n  }\n  return true;\n}\n\nvoid CrashGenerator::CreateThreadsInChildProcess(unsigned num_threads) {\n  *GetThreadIdPointer(0) = getpid();\n\n  if (num_threads <= 1)\n    return;\n\n  // This method does not clean up any pthread resource, as the process\n  // is expected to be killed anyway.\n  ThreadData* thread_data = new ThreadData[num_threads];\n\n  // Create detached threads so that we do not worry about pthread_join()\n  // later being called or not.\n  pthread_attr_t thread_attributes;\n  if (pthread_attr_init(&thread_attributes) != 0 ||\n      pthread_attr_setdetachstate(&thread_attributes,\n                                  PTHREAD_CREATE_DETACHED) != 0) {\n    fprintf(stderr, \"CrashGenerator: Failed to initialize thread attribute\\n\");\n    exit(1);\n  }\n\n  pthread_barrier_t thread_barrier;\n  if (pthread_barrier_init(&thread_barrier, NULL, num_threads) != 0) {\n    fprintf(stderr, \"CrashGenerator: Failed to initialize thread barrier\\n\");\n    exit(1);\n  }\n\n  for (unsigned i = 1; i < num_threads; ++i) {\n    thread_data[i].barrier = &thread_barrier;\n    thread_data[i].thread_id_ptr = GetThreadIdPointer(i);\n    if (pthread_create(&thread_data[i].thread, &thread_attributes,\n                       thread_function, &thread_data[i]) != 0) {\n      fprintf(stderr, \"CrashGenerator: Failed to create thread %d\\n\", i);\n      exit(1);\n    }\n  }\n\n  int result = pthread_barrier_wait(&thread_barrier);\n  if (result != 0 && result != PTHREAD_BARRIER_SERIAL_THREAD) {\n    fprintf(stderr, \"CrashGenerator: Failed to wait for thread barrier\\n\");\n    exit(1);\n  }\n\n  pthread_barrier_destroy(&thread_barrier);\n  pthread_attr_destroy(&thread_attributes);\n  delete[] thread_data;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/linux/tests/crash_generator.h",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// crash_generator.h: Define the google_breakpad::CrashGenerator class,\n// which is used to generate a crash (and a core dump file) for testing.\n\n#ifndef COMMON_LINUX_TESTS_CRASH_GENERATOR_H_\n#define COMMON_LINUX_TESTS_CRASH_GENERATOR_H_\n\n#include <sys/resource.h>\n\n#include <string>\n\n#include \"common/tests/auto_tempdir.h\"\n\nnamespace google_breakpad {\n\n// A utility class for generating a crash (and a core dump file) for\n// testing. It creates a child process with the specified number of\n// threads, which is then termainated by the specified signal. A core\n// dump file is expected to be created upon the termination of the child\n// process, which can then be used for testing code that processes core\n// dump files.\nclass CrashGenerator {\n public:\n  CrashGenerator();\n\n  ~CrashGenerator();\n\n  // Returns true if a core dump file named 'core' will be generated in\n  // the current directory for a test that produces a crash by checking\n  // if /proc/sys/kernel/core_pattern has the default value 'core'.\n  bool HasDefaultCorePattern() const;\n\n  // Returns the expected path of the core dump file.\n  std::string GetCoreFilePath() const;\n\n  // Returns the directory of a copy of proc files of the child process.\n  std::string GetDirectoryOfProcFilesCopy() const;\n\n  // Creates a crash (and a core dump file) by creating a child process with\n  // |num_threads| threads, and the terminating the child process by sending\n  // a signal with number |crash_signal| to the |crash_thread|-th thread.\n  // Returns true on success.\n  bool CreateChildCrash(unsigned num_threads, unsigned crash_thread,\n                        int crash_signal, pid_t* child_pid);\n\n  // Returns the thread ID of the |index|-th thread in the child process.\n  // This method does not validate |index|.\n  pid_t GetThreadId(unsigned index) const;\n\n private:\n  // Copies the following proc files of the process with |pid| to the directory\n  // at |path|: auxv, cmdline, environ, maps, status\n  // The directory must have been created. Returns true on success.\n  bool CopyProcFiles(pid_t pid, const char* path) const;\n\n  // Creates |num_threads| threads in the child process.\n  void CreateThreadsInChildProcess(unsigned num_threads);\n\n  // Sets the maximum size of core dump file (both the soft and hard limit)\n  // to |limit| bytes. Returns true on success.\n  bool SetCoreFileSizeLimit(rlim_t limit) const;\n\n  // Creates a shared memory of |memory_size| bytes for communicating thread\n  // IDs between the parent and child process. Returns true on success.\n  bool MapSharedMemory(size_t memory_size);\n\n  // Releases any shared memory created by MapSharedMemory(). Returns true on\n  // success.\n  bool UnmapSharedMemory();\n\n  // Returns the pointer to the thread ID of the |index|-th thread in the child\n  // process. This method does not validate |index|.\n  pid_t* GetThreadIdPointer(unsigned index);\n\n  // Temporary directory in which a core file is generated.\n  AutoTempDir temp_dir_;\n\n  // Shared memory for communicating thread IDs between the parent and\n  // child process.\n  void* shared_memory_;\n\n  // Number of bytes mapped for |shared_memory_|.\n  size_t shared_memory_size_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_LINUX_TESTS_CRASH_GENERATOR_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/Breakpad.xcconfig",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nARCHS = $(ARCHS_STANDARD_32_64_BIT)\nSDKROOT = macosx10.5\n\nGCC_VERSION = 4.2\nGCC_VERSION[sdk=macosx10.4][arch=*] = 4.0\n\nGCC_C_LANGUAGE_STANDARD = c99\n\nGCC_WARN_CHECK_SWITCH_STATEMENTS = YES\n// TODO(nealsid): Get the code so we can turn on the 64_TO_32 warning.\nGCC_WARN_64_TO_32_BIT_CONVERSION = NO\nGCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES\nGCC_WARN_ABOUT_RETURN_TYPE = YES\nGCC_WARN_MISSING_PARENTHESES = YES\nGCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES\nGCC_WARN_ABOUT_MISSING_NEWLINE = YES\nGCC_WARN_SIGN_COMPARE = YES\nGCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES\nGCC_WARN_UNDECLARED_SELECTOR = YES\nGCC_WARN_UNKNOWN_PRAGMAS = YES\nGCC_WARN_UNUSED_VARIABLE = YES\nGCC_TREAT_WARNINGS_AS_ERRORS = YES\n\nDEBUG_INFORMATION_FORMAT = dwarf-with-dsym\nDEBUG_INFORMATION_FORMAT[sdk=macosx10.4][arch=*] = stabs\n\nALWAYS_SEARCH_USER_PATHS = NO\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/BreakpadDebug.xcconfig",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"Breakpad.xcconfig\"\n\nGCC_OPTIMIZATION_LEVEL = 0\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/BreakpadRelease.xcconfig",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"Breakpad.xcconfig\"\n\nGCC_OPTIMIZATION_LEVEL = s\nGCC_WARN_UNINITIALIZED_AUTOS = YES\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/GTMDefines.h",
    "content": "// \n// GTMDefines.h\n//\n//  Copyright 2008 Google Inc.\n//\n//  Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n//  use this file except in compliance with the License.  You may obtain a copy\n//  of the License at\n// \n//  http://www.apache.org/licenses/LICENSE-2.0\n// \n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the\n//  License for the specific language governing permissions and limitations under\n//  the License.\n//\n \n// ============================================================================\n\n#include <AvailabilityMacros.h>\n#include <TargetConditionals.h>\n\n// Not all MAC_OS_X_VERSION_10_X macros defined in past SDKs\n#ifndef MAC_OS_X_VERSION_10_5\n  #define MAC_OS_X_VERSION_10_5 1050\n#endif\n#ifndef MAC_OS_X_VERSION_10_6\n  #define MAC_OS_X_VERSION_10_6 1060\n#endif\n\n// ----------------------------------------------------------------------------\n// CPP symbols that can be overridden in a prefix to control how the toolbox\n// is compiled.\n// ----------------------------------------------------------------------------\n\n\n// By setting the GTM_CONTAINERS_VALIDATION_FAILED_LOG and \n// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT macros you can control what happens\n// when a validation fails. If you implement your own validators, you may want\n// to control their internals using the same macros for consistency.\n#ifndef GTM_CONTAINERS_VALIDATION_FAILED_ASSERT\n  #define GTM_CONTAINERS_VALIDATION_FAILED_ASSERT 0\n#endif\n\n// Give ourselves a consistent way to do inlines.  Apple's macros even use\n// a few different actual definitions, so we're based off of the foundation\n// one.\n#if !defined(GTM_INLINE)\n  #if defined (__GNUC__) && (__GNUC__ == 4)\n    #define GTM_INLINE static __inline__ __attribute__((always_inline))\n  #else\n    #define GTM_INLINE static __inline__\n  #endif\n#endif\n\n// Give ourselves a consistent way of doing externs that links up nicely\n// when mixing objc and objc++\n#if !defined (GTM_EXTERN)\n  #if defined __cplusplus\n    #define GTM_EXTERN extern \"C\"\n  #else\n    #define GTM_EXTERN extern\n  #endif\n#endif\n\n// Give ourselves a consistent way of exporting things if we have visibility\n// set to hidden.\n#if !defined (GTM_EXPORT)\n  #define GTM_EXPORT __attribute__((visibility(\"default\")))\n#endif\n\n// _GTMDevLog & _GTMDevAssert\n//\n// _GTMDevLog & _GTMDevAssert are meant to be a very lightweight shell for\n// developer level errors.  This implementation simply macros to NSLog/NSAssert.\n// It is not intended to be a general logging/reporting system.\n//\n// Please see http://code.google.com/p/google-toolbox-for-mac/wiki/DevLogNAssert\n// for a little more background on the usage of these macros.\n//\n//    _GTMDevLog           log some error/problem in debug builds\n//    _GTMDevAssert        assert if conditon isn't met w/in a method/function\n//                           in all builds.\n// \n// To replace this system, just provide different macro definitions in your\n// prefix header.  Remember, any implementation you provide *must* be thread\n// safe since this could be called by anything in what ever situtation it has\n// been placed in.\n// \n\n// We only define the simple macros if nothing else has defined this.\n#ifndef _GTMDevLog\n\n#ifdef DEBUG\n  #define _GTMDevLog(...) NSLog(__VA_ARGS__)\n#else\n  #define _GTMDevLog(...) do { } while (0)\n#endif\n\n#endif // _GTMDevLog\n\n// Declared here so that it can easily be used for logging tracking if\n// necessary. See GTMUnitTestDevLog.h for details.\n@class NSString;\nGTM_EXTERN void _GTMUnitTestDevLog(NSString *format, ...);\n\n#ifndef _GTMDevAssert\n// we directly invoke the NSAssert handler so we can pass on the varargs\n// (NSAssert doesn't have a macro we can use that takes varargs)\n#if !defined(NS_BLOCK_ASSERTIONS)\n  #define _GTMDevAssert(condition, ...)                                       \\\n    do {                                                                      \\\n      if (!(condition)) {                                                     \\\n        [[NSAssertionHandler currentHandler]                                  \\\n            handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \\\n                               file:[NSString stringWithUTF8String:__FILE__]  \\\n                         lineNumber:__LINE__                                  \\\n                        description:__VA_ARGS__];                             \\\n      }                                                                       \\\n    } while(0)\n#else // !defined(NS_BLOCK_ASSERTIONS)\n  #define _GTMDevAssert(condition, ...) do { } while (0)\n#endif // !defined(NS_BLOCK_ASSERTIONS)\n\n#endif // _GTMDevAssert\n\n// _GTMCompileAssert\n// _GTMCompileAssert is an assert that is meant to fire at compile time if you\n// want to check things at compile instead of runtime. For example if you\n// want to check that a wchar is 4 bytes instead of 2 you would use\n// _GTMCompileAssert(sizeof(wchar_t) == 4, wchar_t_is_4_bytes_on_OS_X)\n// Note that the second \"arg\" is not in quotes, and must be a valid processor\n// symbol in it's own right (no spaces, punctuation etc).\n\n// Wrapping this in an #ifndef allows external groups to define their own\n// compile time assert scheme.\n#ifndef _GTMCompileAssert\n  // We got this technique from here:\n  // http://unixjunkie.blogspot.com/2007/10/better-compile-time-asserts_29.html\n\n  #define _GTMCompileAssertSymbolInner(line, msg) _GTMCOMPILEASSERT ## line ## __ ## msg\n  #define _GTMCompileAssertSymbol(line, msg) _GTMCompileAssertSymbolInner(line, msg)\n  #define _GTMCompileAssert(test, msg) \\\n    typedef char _GTMCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]\n#endif // _GTMCompileAssert\n\n// Macro to allow fast enumeration when building for 10.5 or later, and\n// reliance on NSEnumerator for 10.4.  Remember, NSDictionary w/ FastEnumeration\n// does keys, so pick the right thing, nothing is done on the FastEnumeration\n// side to be sure you're getting what you wanted.\n#ifndef GTM_FOREACH_OBJECT\n  #if TARGET_OS_IPHONE || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)\n    #define GTM_FOREACH_OBJECT(element, collection) \\\n      for (element in collection)\n    #define GTM_FOREACH_KEY(element, collection) \\\n      for (element in collection)\n  #else\n    #define GTM_FOREACH_OBJECT(element, collection) \\\n      for (NSEnumerator * _ ## element ## _enum = [collection objectEnumerator]; \\\n           (element = [_ ## element ## _enum nextObject]) != nil; )\n    #define GTM_FOREACH_KEY(element, collection) \\\n      for (NSEnumerator * _ ## element ## _enum = [collection keyEnumerator]; \\\n           (element = [_ ## element ## _enum nextObject]) != nil; )\n  #endif\n#endif\n\n// ============================================================================\n\n// ----------------------------------------------------------------------------\n// CPP symbols defined based on the project settings so the GTM code has\n// simple things to test against w/o scattering the knowledge of project\n// setting through all the code.\n// ----------------------------------------------------------------------------\n\n// Provide a single constant CPP symbol that all of GTM uses for ifdefing\n// iPhone code.\n#if TARGET_OS_IPHONE // iPhone SDK\n  // For iPhone specific stuff\n  #define GTM_IPHONE_SDK 1\n  #if TARGET_IPHONE_SIMULATOR\n    #define GTM_IPHONE_SIMULATOR 1\n  #else\n    #define GTM_IPHONE_DEVICE 1\n  #endif  // TARGET_IPHONE_SIMULATOR\n#else\n  // For MacOS specific stuff\n  #define GTM_MACOS_SDK 1\n#endif\n\n// Provide a symbol to include/exclude extra code for GC support.  (This mainly\n// just controls the inclusion of finalize methods).\n#ifndef GTM_SUPPORT_GC\n  #if GTM_IPHONE_SDK\n    // iPhone never needs GC\n    #define GTM_SUPPORT_GC 0\n  #else\n    // We can't find a symbol to tell if GC is supported/required, so best we\n    // do on Mac targets is include it if we're on 10.5 or later.\n    #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4\n      #define GTM_SUPPORT_GC 0\n    #else\n      #define GTM_SUPPORT_GC 1\n    #endif\n  #endif\n#endif\n\n// To simplify support for 64bit (and Leopard in general), we provide the type\n// defines for non Leopard SDKs\n#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4\n // NSInteger/NSUInteger and Max/Mins\n  #ifndef NSINTEGER_DEFINED\n    #if __LP64__ || NS_BUILD_32_LIKE_64\n      typedef long NSInteger;\n      typedef unsigned long NSUInteger;\n    #else\n      typedef int NSInteger;\n      typedef unsigned int NSUInteger;\n    #endif\n    #define NSIntegerMax    LONG_MAX\n    #define NSIntegerMin    LONG_MIN\n    #define NSUIntegerMax   ULONG_MAX\n    #define NSINTEGER_DEFINED 1\n  #endif  // NSINTEGER_DEFINED\n  // CGFloat\n  #ifndef CGFLOAT_DEFINED\n    #if defined(__LP64__) && __LP64__\n      // This really is an untested path (64bit on Tiger?)\n      typedef double CGFloat;\n      #define CGFLOAT_MIN DBL_MIN\n      #define CGFLOAT_MAX DBL_MAX\n      #define CGFLOAT_IS_DOUBLE 1\n    #else /* !defined(__LP64__) || !__LP64__ */\n      typedef float CGFloat;\n      #define CGFLOAT_MIN FLT_MIN\n      #define CGFLOAT_MAX FLT_MAX\n      #define CGFLOAT_IS_DOUBLE 0\n    #endif /* !defined(__LP64__) || !__LP64__ */\n    #define CGFLOAT_DEFINED 1\n  #endif // CGFLOAT_DEFINED\n#endif  // MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/GTMGarbageCollection.h",
    "content": "//\n//  GTMGarbageCollection.h\n//\n//  Copyright 2007-2008 Google Inc.\n//\n//  Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n//  use this file except in compliance with the License.  You may obtain a copy\n//  of the License at\n// \n//  http://www.apache.org/licenses/LICENSE-2.0\n// \n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the\n//  License for the specific language governing permissions and limitations under\n//  the License.\n//\n\n#import <Foundation/Foundation.h>\n\n#import \"GTMDefines.h\"\n\n// This allows us to easily move our code from GC to non GC.\n// They are no-ops unless we are require Leopard or above.\n// See \n// http://developer.apple.com/documentation/Cocoa/Conceptual/GarbageCollection/index.html\n// and\n// http://developer.apple.com/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html#//apple_ref/doc/uid/TP40006687-SW1\n// for details.\n\n#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) && !GTM_IPHONE_SDK\n// General use would be to call this through GTMCFAutorelease\n// but there may be a reason the you want to make something collectable\n// but not autoreleased, especially in pure GC code where you don't\n// want to bother with the nop autorelease. Done as a define instead of an \n// inline so that tools like Clang's scan-build don't report code as leaking.\n#define GTMNSMakeCollectable(cf) ((id)NSMakeCollectable(cf))\n\n// GTMNSMakeUncollectable is for global maps, etc. that we don't\n// want released ever. You should still retain these in non-gc code.\nGTM_INLINE void GTMNSMakeUncollectable(id object) {\n  [[NSGarbageCollector defaultCollector] disableCollectorForPointer:object];\n}\n\n// Hopefully no code really needs this, but GTMIsGarbageCollectionEnabled is\n// a common way to check at runtime if GC is on.\n// There are some places where GC doesn't work w/ things w/in Apple's\n// frameworks, so this is here so GTM unittests and detect it, and not run\n// individual tests to work around bugs in Apple's frameworks.\nGTM_INLINE BOOL GTMIsGarbageCollectionEnabled(void) {\n  return ([NSGarbageCollector defaultCollector] != nil);\n}\n\n#else\n\n#define GTMNSMakeCollectable(cf) ((id)(cf))\n\nGTM_INLINE void GTMNSMakeUncollectable(id object) {\n}\n\nGTM_INLINE BOOL GTMIsGarbageCollectionEnabled(void) {\n  return NO;\n}\n\n#endif\n\n// GTMCFAutorelease makes a CF object collectable in GC mode, or adds it \n// to the autorelease pool in non-GC mode. Either way it is taken care\n// of. Done as a define instead of an inline so that tools like Clang's\n// scan-build don't report code as leaking.\n#define GTMCFAutorelease(cf) ([GTMNSMakeCollectable(cf) autorelease])\n\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/GTMLogger.h",
    "content": "//\n//  GTMLogger.h\n//\n//  Copyright 2007-2008 Google Inc.\n//\n//  Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n//  use this file except in compliance with the License.  You may obtain a copy\n//  of the License at\n// \n//  http://www.apache.org/licenses/LICENSE-2.0\n// \n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the\n//  License for the specific language governing permissions and limitations under\n//  the License.\n//\n\n// Key Abstractions\n// ----------------\n// \n// This file declares multiple classes and protocols that are used by the \n// GTMLogger logging system. The 4 main abstractions used in this file are the\n// following:\n//\n//   * logger (GTMLogger) - The main logging class that users interact with. It\n//   has methods for logging at different levels and uses a log writer, a log\n//   formatter, and a log filter to get the job done.\n// \n//   * log writer (GTMLogWriter) - Writes a given string to some log file, where\n//   a \"log file\" can be a physical file on disk, a POST over HTTP to some URL,\n//   or even some in-memory structure (e.g., a ring buffer).\n//\n//   * log formatter (GTMLogFormatter) - Given a format string and arguments as\n//   a va_list, returns a single formatted NSString. A \"formatted string\" could\n//   be a string with the date prepended, a string with values in a CSV format,\n//   or even a string of XML.\n//\n//   * log filter (GTMLogFilter) - Given a formatted log message as an NSString\n//   and the level at which the message is to be logged, this class will decide\n//   whether the given message should be logged or not. This is a flexible way\n//   to filter out messages logged at a certain level, messages that contain\n//   certain text, or filter nothing out at all. This gives the caller the\n//   flexibility to dynamically enable debug logging in Release builds.\n//\n// This file also declares some classes to handle the common log writer, log\n// formatter, and log filter cases. Callers can also create their own writers, \n// formatters, and filters and they can even build them on top of the ones\n// declared here. Keep in mind that your custom writer/formatter/filter may be\n// called from multiple threads, so it must be thread-safe.\n\n#import <Foundation/Foundation.h>\n#import \"GTMDefines.h\"\n\n// Predeclaration of used protocols that are declared later in this file.\n@protocol GTMLogWriter, GTMLogFormatter, GTMLogFilter;\n\n#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5\n#define CHECK_FORMAT_NSSTRING(a, b) __attribute__((format(__NSString__, a, b)))\n#else\n#define CHECK_FORMAT_NSSTRING(a, b)\n#endif\n\n// GTMLogger\n//\n// GTMLogger is the primary user-facing class for an object-oriented logging\n// system. It is built on the concept of log formatters (GTMLogFormatter), log\n// writers (GTMLogWriter), and log filters (GTMLogFilter). When a message is\n// sent to a GTMLogger to log a message, the message is formatted using the log\n// formatter, then the log filter is consulted to see if the message should be\n// logged, and if so, the message is sent to the log writer to be written out.\n// \n// GTMLogger is intended to be a flexible and thread-safe logging solution. Its\n// flexibility comes from the fact that GTMLogger instances can be customized\n// with user defined formatters, filters, and writers. And these writers,\n// filters, and formatters can be combined, stacked, and customized in arbitrary\n// ways to suit the needs at hand. For example, multiple writers can be used at\n// the same time, and a GTMLogger instance can even be used as another\n// GTMLogger's writer. This allows for arbitrarily deep logging trees.\n// \n// A standard GTMLogger uses a writer that sends messages to standard out, a\n// formatter that smacks a timestamp and a few other bits of interesting\n// information on the message, and a filter that filters out debug messages from\n// release builds. Using the standard log settings, a log message will look like\n// the following:\n//\n//   2007-12-30 10:29:24.177 myapp[4588/0xa07d0f60] [lvl=1] foo=<Foo: 0x123>\n// \n// The output contains the date and time of the log message, the name of the\n// process followed by its process ID/thread ID, the log level at which the\n// message was logged (in the previous example the level was 1:\n// kGTMLoggerLevelDebug), and finally, the user-specified log message itself (in\n// this case, the log message was @\"foo=%@\", foo).\n// \n// Multiple instances of GTMLogger can be created, each configured their own\n// way.  Though GTMLogger is not a singleton (in the GoF sense), it does provide\n// access to a shared (i.e., globally accessible) GTMLogger instance. This makes\n// it convenient for all code in a process to use the same GTMLogger instance.\n// The shared GTMLogger instance can also be configured in an arbitrary, and\n// these configuration changes will affect all code that logs through the shared\n// instance.\n\n//\n// Log Levels\n// ----------\n// GTMLogger has 3 different log levels: Debug, Info, and Error. GTMLogger\n// doesn't take any special action based on the log level; it simply forwards\n// this information on to formatters, filters, and writers, each of which may\n// optionally take action based on the level. Since log level filtering is\n// performed at runtime, log messages are typically not filtered out at compile\n// time.  The exception to this rule is that calls to the GTMLoggerDebug() macro\n// *ARE* filtered out of non-DEBUG builds. This is to be backwards compatible\n// with behavior that many developers are currently used to. Note that this\n// means that GTMLoggerDebug(@\"hi\") will be compiled out of Release builds, but\n// [[GTMLogger sharedLogger] logDebug:@\"hi\"] will NOT be compiled out.\n// \n// Standard loggers are created with the GTMLogLevelFilter log filter, which\n// filters out certain log messages based on log level, and some other settings.\n// \n// In addition to the -logDebug:, -logInfo:, and -logError: methods defined on\n// GTMLogger itself, there are also C macros that make usage of the shared\n// GTMLogger instance very convenient. These macros are:\n//\n//   GTMLoggerDebug(...)\n//   GTMLoggerInfo(...)\n//   GTMLoggerError(...)\n//\n// Again, a notable feature of these macros is that GTMLogDebug() calls *will be\n// compiled out of non-DEBUG builds*.\n//\n// Standard Loggers\n// ----------------\n// GTMLogger has the concept of \"standard loggers\". A standard logger is simply\n// a logger that is pre-configured with some standard/common writer, formatter,\n// and filter combination. Standard loggers are created using the creation\n// methods beginning with \"standard\". The alternative to a standard logger is a\n// regular logger, which will send messages to stdout, with no special\n// formatting, and no filtering.\n//\n// How do I use GTMLogger?\n// ----------------------\n// The typical way you will want to use GTMLogger is to simply use the\n// GTMLogger*() macros for logging from code. That way we can easily make\n// changes to the GTMLogger class and simply update the macros accordingly. Only\n// your application startup code (perhaps, somewhere in main()) should use the\n// GTMLogger class directly in order to configure the shared logger, which all\n// of the code using the macros will be using. Again, this is just the typical\n// situation.\n// \n// To be complete, there are cases where you may want to use GTMLogger directly,\n// or even create separate GTMLogger instances for some reason. That's fine,\n// too.\n//\n// Examples\n// --------\n// The following show some common GTMLogger use cases.\n//\n// 1. You want to log something as simply as possible. Also, this call will only\n//    appear in debug builds. In non-DEBUG builds it will be completely removed.\n//\n//      GTMLoggerDebug(@\"foo = %@\", foo);\n//\n// 2. The previous example is similar to the following. The major difference is \n//    that the previous call (example 1) will be compiled out of Release builds\n//    but this statement will not be compiled out.\n//\n//      [[GTMLogger sharedLogger] logDebug:@\"foo = %@\", foo];\n//\n// 3. Send all logging output from the shared logger to a file. We do this by\n//    creating an NSFileHandle for writing associated with a file, and setting \n//    that file handle as the logger's writer.\n//\n//      NSFileHandle *f = [NSFileHandle fileHandleForWritingAtPath:@\"/tmp/f.log\"\n//                                                          create:YES];\n//      [[GTMLogger sharedLogger] setWriter:f];\n//      GTMLoggerError(@\"hi\");  // This will be sent to /tmp/f.log\n//\n// 4. Create a new GTMLogger that will log to a file. This example differs from\n//    the previous one because here we create a new GTMLogger that is different\n//    from the shared logger.\n//\n//      GTMLogger *logger = [GTMLogger standardLoggerWithPath:@\"/tmp/temp.log\"];\n//      [logger logInfo:@\"hi temp log file\"];\n//\n// 5. Create a logger that writes to stdout and does NOT do any formatting to\n//    the log message. This might be useful, for example, when writing a help\n//    screen for a command-line tool to standard output.\n//      \n//      GTMLogger *logger = [GTMLogger logger];\n//      [logger logInfo:@\"%@ version 0.1 usage\", progName];\n//\n// 6. Send log output to stdout AND to a log file. The trick here is that \n//    NSArrays function as composite log writers, which means when an array is \n//    set as the log writer, it forwards all logging messages to all of its\n//    contained GTMLogWriters.\n//\n//      // Create array of GTMLogWriters\n//      NSArray *writers = [NSArray arrayWithObjects:\n//          [NSFileHandle fileHandleForWritingAtPath:@\"/tmp/f.log\" create:YES],\n//          [NSFileHandle fileHandleWithStandardOutput], nil];\n//      \n//      GTMLogger *logger = [GTMLogger standardLogger];\n//      [logger setWriter:writers];\n//      [logger logInfo:@\"hi\"];  // Output goes to stdout and /tmp/f.log\n//\n// For futher details on log writers, formatters, and filters, see the\n// documentation below.\n//\n// NOTE: GTMLogger is application level logging.  By default it does nothing\n// with _GTMDevLog/_GTMDevAssert (see GTMDefines.h).  An application can choose\n// to bridge _GTMDevLog/_GTMDevAssert to GTMLogger by providing macro\n// definitions in its prefix header (see GTMDefines.h for how one would do\n// that).\n//\n@interface GTMLogger : NSObject {\n @private\n  id<GTMLogWriter> writer_;\n  id<GTMLogFormatter> formatter_;\n  id<GTMLogFilter> filter_;\n}\n\n//\n// Accessors for the shared logger instance\n//\n\n// Returns a shared/global standard GTMLogger instance. Callers should typically\n// use this method to get a GTMLogger instance, unless they explicitly want\n// their own instance to configure for their own needs. This is the only method\n// that returns a shared instance; all the rest return new GTMLogger instances.\n+ (id)sharedLogger;\n\n// Sets the shared logger instance to |logger|. Future calls to +sharedLogger\n// will return |logger| instead.\n+ (void)setSharedLogger:(GTMLogger *)logger;\n\n//\n// Creation methods\n//\n\n// Returns a new autoreleased GTMLogger instance that will log to stdout, using\n// the GTMLogStandardFormatter, and the GTMLogLevelFilter filter.\n+ (id)standardLogger;\n\n// Same as +standardLogger, but logs to stderr.\n+ (id)standardLoggerWithStderr;\n\n// Returns a new standard GTMLogger instance with a log writer that will\n// write to the file at |path|, and will use the GTMLogStandardFormatter and\n// GTMLogLevelFilter classes. If |path| does not exist, it will be created.\n+ (id)standardLoggerWithPath:(NSString *)path;\n\n// Returns an autoreleased GTMLogger instance that will use the specified\n// |writer|, |formatter|, and |filter|.\n+ (id)loggerWithWriter:(id<GTMLogWriter>)writer\n             formatter:(id<GTMLogFormatter>)formatter\n                filter:(id<GTMLogFilter>)filter;\n\n// Returns an autoreleased GTMLogger instance that logs to stdout, with the\n// basic formatter, and no filter. The returned logger differs from the logger\n// returned by +standardLogger because this one does not do any filtering and\n// does not do any special log formatting; this is the difference between a\n// \"regular\" logger and a \"standard\" logger.\n+ (id)logger;\n\n// Designated initializer. This method returns a GTMLogger initialized with the\n// specified |writer|, |formatter|, and |filter|. See the setter methods below\n// for what values will be used if nil is passed for a parameter.\n- (id)initWithWriter:(id<GTMLogWriter>)writer\n           formatter:(id<GTMLogFormatter>)formatter\n              filter:(id<GTMLogFilter>)filter;\n\n//\n// Logging  methods\n//\n\n// Logs a message at the debug level (kGTMLoggerLevelDebug).\n- (void)logDebug:(NSString *)fmt, ... CHECK_FORMAT_NSSTRING(1, 2);\n// Logs a message at the info level (kGTMLoggerLevelInfo).\n- (void)logInfo:(NSString *)fmt, ... CHECK_FORMAT_NSSTRING(1, 2);\n// Logs a message at the error level (kGTMLoggerLevelError).\n- (void)logError:(NSString *)fmt, ... CHECK_FORMAT_NSSTRING(1, 2);\n// Logs a message at the assert level (kGTMLoggerLevelAssert).\n- (void)logAssert:(NSString *)fmt, ... CHECK_FORMAT_NSSTRING(1, 2);\n\n\n//\n// Accessors\n//\n\n// Accessor methods for the log writer. If the log writer is set to nil,  \n// [NSFileHandle fileHandleWithStandardOutput] is used.\n- (id<GTMLogWriter>)writer;\n- (void)setWriter:(id<GTMLogWriter>)writer;\n\n// Accessor methods for the log formatter. If the log formatter is set to nil,\n// GTMLogBasicFormatter is used. This formatter will format log messages in a\n// plain printf style.\n- (id<GTMLogFormatter>)formatter;\n- (void)setFormatter:(id<GTMLogFormatter>)formatter;\n\n// Accessor methods for the log filter. If the log filter is set to nil,\n// GTMLogNoFilter is used, which allows all log messages through.\n- (id<GTMLogFilter>)filter;\n- (void)setFilter:(id<GTMLogFilter>)filter;\n\n@end  // GTMLogger\n\n\n// Helper functions that are used by the convenience GTMLogger*() macros that \n// enable the logging of function names.\n@interface GTMLogger (GTMLoggerMacroHelpers)\n- (void)logFuncDebug:(const char *)func msg:(NSString *)fmt, ...\n  CHECK_FORMAT_NSSTRING(2, 3);\n- (void)logFuncInfo:(const char *)func msg:(NSString *)fmt, ...\n  CHECK_FORMAT_NSSTRING(2, 3);\n- (void)logFuncError:(const char *)func msg:(NSString *)fmt, ...\n  CHECK_FORMAT_NSSTRING(2, 3);\n- (void)logFuncAssert:(const char *)func msg:(NSString *)fmt, ...\n  CHECK_FORMAT_NSSTRING(2, 3);\n@end  // GTMLoggerMacroHelpers\n\n\n// Convenience macros that log to the shared GTMLogger instance. These macros\n// are how users should typically log to GTMLogger. Notice that GTMLoggerDebug()\n// calls will be compiled out of non-Debug builds.\n#define GTMLoggerDebug(...)  \\\n  [[GTMLogger sharedLogger] logFuncDebug:__func__ msg:__VA_ARGS__]\n#define GTMLoggerInfo(...)   \\\n  [[GTMLogger sharedLogger] logFuncInfo:__func__ msg:__VA_ARGS__]\n#define GTMLoggerError(...)  \\\n  [[GTMLogger sharedLogger] logFuncError:__func__ msg:__VA_ARGS__]\n#define GTMLoggerAssert(...) \\\n  [[GTMLogger sharedLogger] logFuncAssert:__func__ msg:__VA_ARGS__]\n\n// If we're not in a debug build, remove the GTMLoggerDebug statements. This\n// makes calls to GTMLoggerDebug \"compile out\" of Release builds\n#ifndef DEBUG\n#undef GTMLoggerDebug\n#define GTMLoggerDebug(...) do {} while(0)\n#endif\n\n// Log levels.\ntypedef enum {\n  kGTMLoggerLevelUnknown,\n  kGTMLoggerLevelDebug,\n  kGTMLoggerLevelInfo,\n  kGTMLoggerLevelError,\n  kGTMLoggerLevelAssert,\n} GTMLoggerLevel;\n\n\n//\n//   Log Writers\n//\n\n// Protocol to be implemented by a GTMLogWriter instance.\n@protocol GTMLogWriter <NSObject>\n// Writes the given log message to where the log writer is configured to write.\n- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level;\n@end  // GTMLogWriter\n\n\n// Simple category on NSFileHandle that makes NSFileHandles valid log writers.\n// This is convenient because something like, say, +fileHandleWithStandardError\n// now becomes a valid log writer. Log messages are written to the file handle\n// with a newline appended.\n@interface NSFileHandle (GTMFileHandleLogWriter) <GTMLogWriter>\n// Opens the file at |path| in append mode, and creates the file with |mode| \n// if it didn't previously exist.\n+ (id)fileHandleForLoggingAtPath:(NSString *)path mode:(mode_t)mode;\n@end  // NSFileHandle\n\n\n// This category makes NSArray a GTMLogWriter that can be composed of other\n// GTMLogWriters. This is the classic Composite GoF design pattern. When the\n// GTMLogWriter -logMessage:level: message is sent to the array, the array\n// forwards the message to all of its elements that implement the GTMLogWriter\n// protocol.\n//\n// This is useful in situations where you would like to send log output to\n// multiple log writers at the same time. Simply create an NSArray of the log\n// writers you wish to use, then set the array as the \"writer\" for your \n// GTMLogger instance.\n@interface NSArray (GTMArrayCompositeLogWriter) <GTMLogWriter>\n@end  // GTMArrayCompositeLogWriter\n\n\n// This category adapts the GTMLogger interface so that it can be used as a log\n// writer; it's an \"adapter\" in the GoF Adapter pattern sense.\n//\n// This is useful when you want to configure a logger to log to a specific\n// writer with a specific formatter and/or filter. But you want to also compose\n// that with a different log writer that may have its own formatter and/or \n// filter.\n@interface GTMLogger (GTMLoggerLogWriter) <GTMLogWriter>\n@end  // GTMLoggerLogWriter\n\n\n//\n//   Log Formatters\n//\n\n// Protocol to be implemented by a GTMLogFormatter instance.\n@protocol GTMLogFormatter <NSObject>\n// Returns a formatted string using the format specified in |fmt| and the va\n// args specified in |args|.\n- (NSString *)stringForFunc:(NSString *)func\n                 withFormat:(NSString *)fmt\n                     valist:(va_list)args\n                      level:(GTMLoggerLevel)level;\n@end  // GTMLogFormatter\n\n\n// A basic log formatter that formats a string the same way that NSLog (or \n// printf) would. It does not do anything fancy, nor does it add any data of its\n// own.\n@interface GTMLogBasicFormatter : NSObject <GTMLogFormatter>\n@end  // GTMLogBasicFormatter\n\n\n// A log formatter that formats the log string like the basic formatter, but\n// also prepends a timestamp and some basic process info to the message, as\n// shown in the following sample output.\n//   2007-12-30 10:29:24.177 myapp[4588/0xa07d0f60] [lvl=1] log mesage here\n@interface GTMLogStandardFormatter : GTMLogBasicFormatter {\n @private\n  NSDateFormatter *dateFormatter_;  // yyyy-MM-dd HH:mm:ss.SSS\n  NSString *pname_;\n  pid_t pid_;\n}\n@end  // GTMLogStandardFormatter\n\n\n//\n//   Log Filters\n//\n\n// Protocol to be imlemented by a GTMLogFilter instance.\n@protocol GTMLogFilter <NSObject>\n// Returns YES if |msg| at |level| should be filtered out; NO otherwise.\n- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level;\n@end  // GTMLogFilter\n\n\n// A log filter that filters messages at the kGTMLoggerLevelDebug level out of\n// non-debug builds. Messages at the kGTMLoggerLevelInfo level are also filtered\n// out of non-debug builds unless GTMVerboseLogging is set in the environment or\n// the processes's defaults. Messages at the kGTMLoggerLevelError level are\n// never filtered.\n@interface GTMLogLevelFilter : NSObject <GTMLogFilter>\n@end  // GTMLogLevelFilter\n\n\n// A simple log filter that does NOT filter anything out;\n// -filterAllowsMessage:level will always return YES. This can be a convenient\n// way to enable debug-level logging in release builds (if you so desire).\n@interface GTMLogNoFilter : NSObject <GTMLogFilter>\n@end  // GTMLogNoFilter\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/GTMLogger.m",
    "content": "//\n//  GTMLogger.m\n//\n//  Copyright 2007-2008 Google Inc.\n//\n//  Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n//  use this file except in compliance with the License.  You may obtain a copy\n//  of the License at\n// \n//  http://www.apache.org/licenses/LICENSE-2.0\n// \n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the\n//  License for the specific language governing permissions and limitations under\n//  the License.\n//\n\n#import \"GTMLogger.h\"\n#import \"GTMGarbageCollection.h\"\n#import <fcntl.h>\n#import <unistd.h>\n#import <stdlib.h>\n#import <pthread.h>\n\n\n// Define a trivial assertion macro to avoid dependencies\n#ifdef DEBUG\n  #define GTMLOGGER_ASSERT(expr) assert(expr)\n#else\n  #define GTMLOGGER_ASSERT(expr)\n#endif\n\n\n@interface GTMLogger (PrivateMethods)\n\n- (void)logInternalFunc:(const char *)func\n                 format:(NSString *)fmt\n                 valist:(va_list)args \n                  level:(GTMLoggerLevel)level;\n\n@end\n\n\n// Reference to the shared GTMLogger instance. This is not a singleton, it's \n// just an easy reference to one shared instance.\nstatic GTMLogger *gSharedLogger = nil;\n\n\n@implementation GTMLogger\n\n// Returns a pointer to the shared logger instance. If none exists, a standard \n// logger is created and returned.\n+ (id)sharedLogger {\n  @synchronized(self) {\n    if (gSharedLogger == nil) {\n      gSharedLogger = [[self standardLogger] retain];\n    }\n    GTMLOGGER_ASSERT(gSharedLogger != nil);\n  }\n  return [[gSharedLogger retain] autorelease];\n}\n\n+ (void)setSharedLogger:(GTMLogger *)logger {\n  @synchronized(self) {\n    [gSharedLogger autorelease];\n    gSharedLogger = [logger retain];\n  }\n}\n\n+ (id)standardLogger {\n  id<GTMLogWriter> writer = [NSFileHandle fileHandleWithStandardOutput];\n  id<GTMLogFormatter> fr = [[[GTMLogStandardFormatter alloc] init] autorelease];\n  id<GTMLogFilter> filter = [[[GTMLogLevelFilter alloc] init] autorelease];\n  return [self loggerWithWriter:writer formatter:fr filter:filter];\n}\n\n+ (id)standardLoggerWithStderr {\n  id me = [self standardLogger];\n  [me setWriter:[NSFileHandle fileHandleWithStandardError]];\n  return me;\n}\n\n+ (id)standardLoggerWithPath:(NSString *)path {\n  NSFileHandle *fh = [NSFileHandle fileHandleForLoggingAtPath:path mode:0644];\n  if (fh == nil) return nil;\n  id me = [self standardLogger];\n  [me setWriter:fh];\n  return me;\n}\n\n+ (id)loggerWithWriter:(id<GTMLogWriter>)writer\n             formatter:(id<GTMLogFormatter>)formatter\n                filter:(id<GTMLogFilter>)filter {\n  return [[[self alloc] initWithWriter:writer\n                             formatter:formatter\n                                filter:filter] autorelease];\n}\n\n+ (id)logger {\n  return [[[self alloc] init] autorelease];\n}\n\n- (id)init {\n  return [self initWithWriter:nil formatter:nil filter:nil];\n}\n\n- (id)initWithWriter:(id<GTMLogWriter>)writer\n           formatter:(id<GTMLogFormatter>)formatter\n              filter:(id<GTMLogFilter>)filter {\n  if ((self = [super init])) {\n    [self setWriter:writer];\n    [self setFormatter:formatter];\n    [self setFilter:filter];\n    GTMLOGGER_ASSERT(formatter_ != nil);\n    GTMLOGGER_ASSERT(filter_ != nil);\n    GTMLOGGER_ASSERT(writer_ != nil);\n  }\n  return self;\n}\n\n- (void)dealloc {\n  GTMLOGGER_ASSERT(writer_ != nil);\n  GTMLOGGER_ASSERT(formatter_ != nil);\n  GTMLOGGER_ASSERT(filter_ != nil);\n  [writer_ release];\n  [formatter_ release];\n  [filter_ release];\n  [super dealloc];\n}\n\n- (id<GTMLogWriter>)writer {\n  GTMLOGGER_ASSERT(writer_ != nil);\n  return [[writer_ retain] autorelease];\n}\n\n- (void)setWriter:(id<GTMLogWriter>)writer {\n  @synchronized(self) {\n    [writer_ autorelease];\n    if (writer == nil)\n      writer_ = [[NSFileHandle fileHandleWithStandardOutput] retain];\n    else\n      writer_ = [writer retain];\n  }\n  GTMLOGGER_ASSERT(writer_ != nil);\n}\n\n- (id<GTMLogFormatter>)formatter {\n  GTMLOGGER_ASSERT(formatter_ != nil);\n  return [[formatter_ retain] autorelease];\n}\n\n- (void)setFormatter:(id<GTMLogFormatter>)formatter {\n  @synchronized(self) {\n    [formatter_ autorelease];\n    if (formatter == nil)\n      formatter_ = [[GTMLogBasicFormatter alloc] init];\n    else\n      formatter_ = [formatter retain];\n  }\n  GTMLOGGER_ASSERT(formatter_ != nil);\n}\n\n- (id<GTMLogFilter>)filter {\n  GTMLOGGER_ASSERT(filter_ != nil);\n  return [[filter_ retain] autorelease];\n}\n\n- (void)setFilter:(id<GTMLogFilter>)filter {\n  @synchronized(self) {\n    [filter_ autorelease];\n    if (filter == nil)\n      filter_ = [[GTMLogNoFilter alloc] init];\n    else\n      filter_ = [filter retain];\n  }\n  GTMLOGGER_ASSERT(filter_ != nil);\n}\n\n- (void)logDebug:(NSString *)fmt, ... {\n  va_list args;\n  va_start(args, fmt);\n  [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelDebug];\n  va_end(args);\n}\n\n- (void)logInfo:(NSString *)fmt, ... {\n  va_list args;\n  va_start(args, fmt);\n  [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelInfo];\n  va_end(args);\n}\n\n- (void)logError:(NSString *)fmt, ... {\n  va_list args;\n  va_start(args, fmt);\n  [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelError];\n  va_end(args);\n}\n\n- (void)logAssert:(NSString *)fmt, ... {\n  va_list args;\n  va_start(args, fmt);\n  [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelAssert];\n  va_end(args);\n}\n\n@end  // GTMLogger\n\n\n@implementation GTMLogger (GTMLoggerMacroHelpers)\n\n- (void)logFuncDebug:(const char *)func msg:(NSString *)fmt, ... {\n  va_list args;\n  va_start(args, fmt);\n  [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelDebug];\n  va_end(args);\n}\n\n- (void)logFuncInfo:(const char *)func msg:(NSString *)fmt, ... {\n  va_list args;\n  va_start(args, fmt);\n  [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelInfo];\n  va_end(args);\n}\n\n- (void)logFuncError:(const char *)func msg:(NSString *)fmt, ... {\n  va_list args;\n  va_start(args, fmt);\n  [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelError];\n  va_end(args);\n}\n\n- (void)logFuncAssert:(const char *)func msg:(NSString *)fmt, ... {\n  va_list args;\n  va_start(args, fmt);\n  [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelAssert];\n  va_end(args);\n}\n\n@end  // GTMLoggerMacroHelpers\n\n\n@implementation GTMLogger (PrivateMethods)\n\n- (void)logInternalFunc:(const char *)func\n                 format:(NSString *)fmt\n                 valist:(va_list)args \n                  level:(GTMLoggerLevel)level {\n  GTMLOGGER_ASSERT(formatter_ != nil);\n  GTMLOGGER_ASSERT(filter_ != nil);\n  GTMLOGGER_ASSERT(writer_ != nil);\n  \n  NSString *fname = func ? [NSString stringWithUTF8String:func] : nil;\n  NSString *msg = [formatter_ stringForFunc:fname\n                                 withFormat:fmt\n                                     valist:args \n                                      level:level];\n  if (msg && [filter_ filterAllowsMessage:msg level:level])\n    [writer_ logMessage:msg level:level];\n}\n\n@end  // PrivateMethods\n\n\n@implementation NSFileHandle (GTMFileHandleLogWriter)\n\n+ (id)fileHandleForLoggingAtPath:(NSString *)path mode:(mode_t)mode {\n  int fd = -1;\n  if (path) {\n    int flags = O_WRONLY | O_APPEND | O_CREAT;\n    fd = open([path fileSystemRepresentation], flags, mode);\n  }\n  if (fd == -1) return nil;\n  return [[[self alloc] initWithFileDescriptor:fd\n                                closeOnDealloc:YES] autorelease];\n}\n\n- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level {\n  @synchronized(self) {\n    NSString *line = [NSString stringWithFormat:@\"%@\\n\", msg];\n    [self writeData:[line dataUsingEncoding:NSUTF8StringEncoding]];\n  }\n}\n\n@end  // GTMFileHandleLogWriter\n\n\n@implementation NSArray (GTMArrayCompositeLogWriter)\n\n- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level {\n  @synchronized(self) {\n    id<GTMLogWriter> child = nil;\n    GTM_FOREACH_OBJECT(child, self) {\n      if ([child conformsToProtocol:@protocol(GTMLogWriter)])\n        [child logMessage:msg level:level];\n    }\n  }\n}\n\n@end  // GTMArrayCompositeLogWriter\n\n\n@implementation GTMLogger (GTMLoggerLogWriter)\n\n- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level {\n  switch (level) {\n    case kGTMLoggerLevelDebug:\n      [self logDebug:@\"%@\", msg]; \n      break;\n    case kGTMLoggerLevelInfo:\n      [self logInfo:@\"%@\", msg];\n      break;\n    case kGTMLoggerLevelError:   \n      [self logError:@\"%@\", msg];\n      break;\n    case kGTMLoggerLevelAssert:\n      [self logAssert:@\"%@\", msg];\n      break;\n    default: \n      // Ignore the message.\n      break;\n  }\n}\n\n@end  // GTMLoggerLogWriter\n\n\n@implementation GTMLogBasicFormatter\n\n- (NSString *)stringForFunc:(NSString *)func\n                 withFormat:(NSString *)fmt\n                     valist:(va_list)args \n                      level:(GTMLoggerLevel)level {\n  // Performance note: since we always have to create a new NSString from the \n  // returned CFStringRef, we may want to do a quick check here to see if |fmt|\n  // contains a '%', and if not, simply return 'fmt'. \n  CFStringRef cfmsg = NULL;  \n  cfmsg = CFStringCreateWithFormatAndArguments(kCFAllocatorDefault, \n                                               NULL,  // format options\n                                               (CFStringRef)fmt, \n                                               args);\n  return GTMCFAutorelease(cfmsg);\n}\n\n@end  // GTMLogBasicFormatter\n\n\n@implementation GTMLogStandardFormatter\n\n- (id)init {\n  if ((self = [super init])) {\n    dateFormatter_ = [[NSDateFormatter alloc] init];\n    [dateFormatter_ setFormatterBehavior:NSDateFormatterBehavior10_4];\n    [dateFormatter_ setDateFormat:@\"yyyy-MM-dd HH:mm:ss.SSS\"];\n    pname_ = [[[NSProcessInfo processInfo] processName] copy];\n    pid_ = [[NSProcessInfo processInfo] processIdentifier];\n  }\n  return self;\n}\n\n- (void)dealloc {\n  [dateFormatter_ release];\n  [pname_ release];\n  [super dealloc];\n}\n\n- (NSString *)stringForFunc:(NSString *)func\n                 withFormat:(NSString *)fmt\n                     valist:(va_list)args \n                      level:(GTMLoggerLevel)level {\n  GTMLOGGER_ASSERT(dateFormatter_ != nil);\n  NSString *tstamp = nil;\n  @synchronized (dateFormatter_) {\n    tstamp = [dateFormatter_ stringFromDate:[NSDate date]];\n  }\n  return [NSString stringWithFormat:@\"%@ %@[%d/%p] [lvl=%d] %@ %@\",\n          tstamp, pname_, pid_, pthread_self(),\n          level, (func ? func : @\"(no func)\"),\n          [super stringForFunc:func withFormat:fmt valist:args level:level]];\n}\n\n@end  // GTMLogStandardFormatter\n\n\n@implementation GTMLogLevelFilter\n\n// Check the environment and the user preferences for the GTMVerboseLogging key\n// to see if verbose logging has been enabled. The environment variable will\n// override the defaults setting, so check the environment first.\n// COV_NF_START\nstatic BOOL IsVerboseLoggingEnabled(void) {\n  static NSString *const kVerboseLoggingKey = @\"GTMVerboseLogging\";\n  static char *env = NULL;\n  if (env == NULL)\n    env = getenv([kVerboseLoggingKey UTF8String]);\n  \n  if (env && env[0]) {\n    return (strtol(env, NULL, 10) != 0);\n  }\n\n  return [[NSUserDefaults standardUserDefaults] boolForKey:kVerboseLoggingKey];\n}\n// COV_NF_END\n\n// In DEBUG builds, log everything. If we're not in a debug build we'll assume\n// that we're in a Release build.\n- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level {\n#if DEBUG\n  return YES;\n#endif\n    \n  BOOL allow = YES;\n  \n  switch (level) {\n    case kGTMLoggerLevelDebug:\n      allow = NO;\n      break;\n    case kGTMLoggerLevelInfo:\n      allow = (IsVerboseLoggingEnabled() == YES);\n      break;\n    case kGTMLoggerLevelError:\n      allow = YES;\n      break;\n    case kGTMLoggerLevelAssert:\n      allow = YES;\n      break;\n    default:\n      allow = YES;\n      break;\n  }\n\n  return allow;\n}\n\n@end  // GTMLogLevelFilter\n\n\n@implementation GTMLogNoFilter\n\n- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level {\n  return YES;  // Allow everything through\n}\n\n@end  // GTMLogNoFilter\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/HTTPMultipartUpload.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// HTTPMultipartUpload: A multipart/form-data HTTP uploader.\n// Each parameter pair is sent as a boundary\n// Each file is sent with a name field in addition to the filename and data\n// The data will be sent synchronously.\n\n#import <Foundation/Foundation.h>\n\n@interface HTTPMultipartUpload : NSObject {\n @protected\n  NSURL *url_;                  // The destination URL (STRONG)\n  NSDictionary *parameters_;    // The key/value pairs for sending data (STRONG)\n  NSMutableDictionary *files_;  // Dictionary of name/file-path (STRONG)\n  NSString *boundary_;          // The boundary string (STRONG)\n  NSHTTPURLResponse *response_; // The response from the send (STRONG)\n}\n\n- (id)initWithURL:(NSURL *)url;\n\n- (NSURL *)URL;\n\n- (void)setParameters:(NSDictionary *)parameters;\n- (NSDictionary *)parameters;\n\n- (void)addFileAtPath:(NSString *)path name:(NSString *)name;\n- (void)addFileContents:(NSData *)data name:(NSString *)name;\n- (NSDictionary *)files;\n\n// Set the data and return the response\n- (NSData *)send:(NSError **)error;\n- (NSHTTPURLResponse *)response;\n\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/HTTPMultipartUpload.m",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#import \"HTTPMultipartUpload.h\"\n#import \"GTMDefines.h\"\n\n@interface HTTPMultipartUpload(PrivateMethods)\n- (NSString *)multipartBoundary;\n// Each of the following methods will append the starting multipart boundary,\n// but not the ending one.\n- (NSData *)formDataForKey:(NSString *)key value:(NSString *)value;\n- (NSData *)formDataForFileContents:(NSData *)contents name:(NSString *)name;\n- (NSData *)formDataForFile:(NSString *)file name:(NSString *)name;\n@end\n\n@implementation HTTPMultipartUpload\n//=============================================================================\n#pragma mark -\n#pragma mark || Private ||\n//=============================================================================\n- (NSString *)multipartBoundary {\n  // The boundary has 27 '-' characters followed by 16 hex digits\n  return [NSString stringWithFormat:@\"---------------------------%08X%08X\",\n    rand(), rand()];\n}\n\n//=============================================================================\n- (NSData *)formDataForKey:(NSString *)key value:(NSString *)value {\n  NSString *escaped =\n    [key stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];\n  NSString *fmt =\n    @\"--%@\\r\\nContent-Disposition: form-data; name=\\\"%@\\\"\\r\\n\\r\\n%@\\r\\n\";\n  NSString *form = [NSString stringWithFormat:fmt, boundary_, escaped, value];\n\n  return [form dataUsingEncoding:NSUTF8StringEncoding];\n}\n\n//=============================================================================\n- (NSData *)formDataForFileContents:(NSData *)contents name:(NSString *)name {\n  NSMutableData *data = [NSMutableData data];\n  NSString *escaped =\n    [name stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];\n  NSString *fmt = @\"--%@\\r\\nContent-Disposition: form-data; name=\\\"%@\\\"; \"\n    \"filename=\\\"minidump.dmp\\\"\\r\\nContent-Type: application/octet-stream\\r\\n\\r\\n\";\n  NSString *pre = [NSString stringWithFormat:fmt, boundary_, escaped];\n\n  [data appendData:[pre dataUsingEncoding:NSUTF8StringEncoding]];\n  [data appendData:contents];\n\n  return data;\n}\n\n//=============================================================================\n- (NSData *)formDataForFile:(NSString *)file name:(NSString *)name {\n  NSData *contents = [NSData dataWithContentsOfFile:file];\n\n  return [self formDataForFileContents:contents name:name];\n}\n\n//=============================================================================\n#pragma mark -\n#pragma mark || Public ||\n//=============================================================================\n- (id)initWithURL:(NSURL *)url {\n  if ((self = [super init])) {\n    url_ = [url copy];\n    boundary_ = [[self multipartBoundary] retain];\n    files_ = [[NSMutableDictionary alloc] init];\n  }\n\n  return self;\n}\n\n//=============================================================================\n- (void)dealloc {\n  [url_ release];\n  [parameters_ release];\n  [files_ release];\n  [boundary_ release];\n  [response_ release];\n\n  [super dealloc];\n}\n\n//=============================================================================\n- (NSURL *)URL {\n  return url_;\n}\n\n//=============================================================================\n- (void)setParameters:(NSDictionary *)parameters {\n  if (parameters != parameters_) {\n    [parameters_ release];\n    parameters_ = [parameters copy];\n  }\n}\n\n//=============================================================================\n- (NSDictionary *)parameters {\n  return parameters_;\n}\n\n//=============================================================================\n- (void)addFileAtPath:(NSString *)path name:(NSString *)name {\n  [files_ setObject:path forKey:name];\n}\n\n//=============================================================================\n- (void)addFileContents:(NSData *)data name:(NSString *)name {\n  [files_ setObject:data forKey:name];\n}\n\n//=============================================================================\n- (NSDictionary *)files {\n  return files_;\n}\n\n//=============================================================================\n- (NSData *)send:(NSError **)error {\n  NSMutableURLRequest *req = \n    [[NSMutableURLRequest alloc]\n          initWithURL:url_ cachePolicy:NSURLRequestUseProtocolCachePolicy\n      timeoutInterval:10.0 ];\n\n  NSMutableData *postBody = [NSMutableData data];\n\n  [req setValue:[NSString stringWithFormat:@\"multipart/form-data; boundary=%@\",\n    boundary_] forHTTPHeaderField:@\"Content-type\"];\n\n  // Add any parameters to the message\n  NSArray *parameterKeys = [parameters_ allKeys];\n  NSString *key;\n\n  NSInteger count = [parameterKeys count];\n  for (NSInteger i = 0; i < count; ++i) {\n    key = [parameterKeys objectAtIndex:i];\n    [postBody appendData:[self formDataForKey:key\n                                        value:[parameters_ objectForKey:key]]];\n  }\n\n  // Add any files to the message\n  NSArray *fileNames = [files_ allKeys];\n  count = [fileNames count];\n  for (NSInteger i = 0; i < count; ++i) {\n    NSString *name = [fileNames objectAtIndex:i];\n    id fileOrData = [files_ objectForKey:name];\n    NSData *fileData;\n\n    // The object can be either the path to a file (NSString) or the contents\n    // of the file (NSData).\n    if ([fileOrData isKindOfClass:[NSData class]])\n      fileData = [self formDataForFileContents:fileOrData name:name];\n    else\n      fileData = [self formDataForFile:fileOrData name:name];\n\n    [postBody appendData:fileData];\n  }\n\n  NSString *epilogue = [NSString stringWithFormat:@\"\\r\\n--%@--\\r\\n\", boundary_];\n  [postBody appendData:[epilogue dataUsingEncoding:NSUTF8StringEncoding]];\n\n  [req setHTTPBody:postBody];\n  [req setHTTPMethod:@\"POST\"];\n\n  [response_ release];\n  response_ = nil;\n  \n  NSData *data =  [NSURLConnection sendSynchronousRequest:req\n                               returningResponse:&response_\n                                           error:error];\n\n  [response_ retain];\n  [req release];\n\n  return data;\n}\n\n//=============================================================================\n- (NSHTTPURLResponse *)response {\n  return response_;\n}\n\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/MachIPC.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//  MachIPC.h\n//\n//  Some helpful wrappers for using Mach IPC calls\n\n#ifndef MACH_IPC_H__\n#define MACH_IPC_H__\n\n#import <mach/mach.h>\n#import <mach/message.h>\n#import <servers/bootstrap.h>\n#import <sys/types.h>\n\n#import <CoreServices/CoreServices.h>\n\n//==============================================================================\n// DISCUSSION:\n//\n// The three main classes of interest are\n//\n//  MachMessage:    a wrapper for a mach message of the following form\n//   mach_msg_header_t\n//   mach_msg_body_t\n//   optional descriptors\n//   optional extra message data\n//\n//  MachReceiveMessage and MachSendMessage subclass MachMessage\n//    and are used instead of MachMessage which is an abstract base class\n//\n//  ReceivePort:\n//    Represents a mach port for which we have receive rights\n//\n//  MachPortSender:\n//    Represents a mach port for which we have send rights\n//\n// Here's an example to receive a message on a server port:\n//\n//        // This creates our named server port\n//        ReceivePort receivePort(\"com.Google.MyService\");\n//\n//        MachReceiveMessage message;\n//        kern_return_t result = receivePort.WaitForMessage(&message, 0);\n//\n//        if (result == KERN_SUCCESS && message.GetMessageID() == 57) {\n//          mach_port_t task = message.GetTranslatedPort(0);\n//          mach_port_t thread = message.GetTranslatedPort(1);\n//\n//          char *messageString = message.GetData();\n//\n//          printf(\"message string = %s\\n\", messageString);\n//        }\n//\n// Here is an example of using these classes to send a message to this port:\n//\n//    // send to already named port\n//    MachPortSender sender(\"com.Google.MyService\");\n//    MachSendMessage message(57);      // our message ID is 57\n//\n//    // add some ports to be translated for us\n//    message.AddDescriptor(mach_task_self());     // our task\n//    message.AddDescriptor(mach_thread_self());   // this thread\n//\n//    char messageString[] = \"Hello server!\\n\";\n//    message.SetData(messageString, strlen(messageString)+1);\n//\n//    kern_return_t result = sender.SendMessage(message, 1000); // timeout 1000ms\n//\n\nnamespace google_breakpad {\n#define PRINT_MACH_RESULT(result_, message_) \\\n  printf(message_\" %s (%d)\\n\", mach_error_string(result_), result_ );\n\n//==============================================================================\n// A wrapper class for mach_msg_port_descriptor_t (with same memory layout)\n// with convenient constructors and accessors\nclass MachMsgPortDescriptor : public mach_msg_port_descriptor_t {\n public:\n  // General-purpose constructor\n  MachMsgPortDescriptor(mach_port_t in_name,\n                        mach_msg_type_name_t in_disposition) {\n    name = in_name;\n    pad1 = 0;\n    pad2 = 0;\n    disposition = in_disposition;\n    type = MACH_MSG_PORT_DESCRIPTOR;\n  }\n\n  // For passing send rights to a port\n  MachMsgPortDescriptor(mach_port_t in_name) {\n    name = in_name;\n    pad1 = 0;\n    pad2 = 0;\n    disposition = MACH_MSG_TYPE_COPY_SEND;\n    type = MACH_MSG_PORT_DESCRIPTOR;\n  }\n\n  // Copy constructor\n  MachMsgPortDescriptor(const MachMsgPortDescriptor& desc) {\n    name = desc.name;\n    pad1 = desc.pad1;\n    pad2 = desc.pad2;\n    disposition = desc.disposition;\n    type = desc.type;\n  }\n\n  mach_port_t GetMachPort() const {\n    return name;\n  }\n\n  mach_msg_type_name_t GetDisposition() const {\n    return disposition;\n  }\n\n  // For convenience\n  operator mach_port_t() const {\n    return GetMachPort();\n  }\n};\n\n//==============================================================================\n// MachMessage: a wrapper for a mach message\n//  (mach_msg_header_t, mach_msg_body_t, extra data)\n//\n//  This considerably simplifies the construction of a message for sending\n//  and the getting at relevant data and descriptors for the receiver.\n//\n//  Currently the combined size of the descriptors plus data must be\n//  less than 1024.  But as a benefit no memory allocation is necessary.\n//\n// TODO: could consider adding malloc() support for very large messages\n//\n//  A MachMessage object is used by ReceivePort::WaitForMessage\n//  and MachPortSender::SendMessage\n//\nclass MachMessage {\n public:\n\n  // The receiver of the message can retrieve the raw data this way\n  u_int8_t *GetData() {\n    return GetDataLength() > 0 ? GetDataPacket()->data : NULL;\n  }\n\n  u_int32_t GetDataLength() {\n    return EndianU32_LtoN(GetDataPacket()->data_length);\n  }\n\n  // The message ID may be used as a code identifying the type of message\n  void SetMessageID(int32_t message_id) {\n    GetDataPacket()->id = EndianU32_NtoL(message_id);\n  }\n\n  int32_t GetMessageID() { return EndianU32_LtoN(GetDataPacket()->id); }\n\n  // Adds a descriptor (typically a mach port) to be translated\n  // returns true if successful, otherwise not enough space\n  bool AddDescriptor(const MachMsgPortDescriptor &desc);\n\n  int GetDescriptorCount() const { return body.msgh_descriptor_count; }\n  MachMsgPortDescriptor *GetDescriptor(int n);\n\n  // Convenience method which gets the mach port described by the descriptor\n  mach_port_t GetTranslatedPort(int n);\n\n  // A simple message is one with no descriptors\n  bool IsSimpleMessage() const { return GetDescriptorCount() == 0; }\n\n  // Sets raw data for the message (returns false if not enough space)\n  bool SetData(void *data, int32_t data_length);\n\n protected:\n  // Consider this an abstract base class - must create an actual instance\n  // of MachReceiveMessage or MachSendMessage\n\n  MachMessage() {\n    memset(this, 0, sizeof(MachMessage));\n  }\n\n  friend class ReceivePort;\n  friend class MachPortSender;\n\n  // Represents raw data in our message\n  struct MessageDataPacket {\n    int32_t      id;          // little-endian\n    int32_t      data_length; // little-endian\n    u_int8_t     data[1];     // actual size limited by sizeof(MachMessage)\n  };\n\n  MessageDataPacket* GetDataPacket();\n\n  void SetDescriptorCount(int n);\n  void SetDescriptor(int n, const MachMsgPortDescriptor &desc);\n\n  // Returns total message size setting msgh_size in the header to this value\n  mach_msg_size_t CalculateSize();\n\n  mach_msg_header_t  head;\n  mach_msg_body_t    body;\n  u_int8_t           padding[1024]; // descriptors and data may be embedded here\n};\n\n//==============================================================================\n// MachReceiveMessage and MachSendMessage are useful to separate the idea\n// of a mach message being sent and being received, and adds increased type\n// safety:\n//  ReceivePort::WaitForMessage() only accepts a MachReceiveMessage\n//  MachPortSender::SendMessage() only accepts a MachSendMessage\n\n//==============================================================================\nclass MachReceiveMessage : public MachMessage {\n public:\n  MachReceiveMessage() : MachMessage() {};\n};\n\n//==============================================================================\nclass MachSendMessage : public MachMessage {\n public:\n  MachSendMessage(int32_t message_id);\n};\n\n//==============================================================================\n// Represents a mach port for which we have receive rights\nclass ReceivePort {\n public:\n  // Creates a new mach port for receiving messages and registers a name for it\n  explicit ReceivePort(const char *receive_port_name);\n\n  // Given an already existing mach port, use it.  We take ownership of the\n  // port and deallocate it in our destructor.\n  explicit ReceivePort(mach_port_t receive_port);\n\n  // Create a new mach port for receiving messages\n  ReceivePort();\n\n  ~ReceivePort();\n\n  // Waits on the mach port until message received or timeout\n  kern_return_t WaitForMessage(MachReceiveMessage *out_message,\n                               mach_msg_timeout_t timeout);\n\n  // The underlying mach port that we wrap\n  mach_port_t  GetPort() const { return port_; }\n\n private:\n  ReceivePort(const ReceivePort&);  // disable copy c-tor\n\n  mach_port_t   port_;\n  kern_return_t init_result_;\n};\n\n//==============================================================================\n// Represents a mach port for which we have send rights\nclass MachPortSender {\n public:\n  // get a port with send rights corresponding to a named registered service\n  explicit MachPortSender(const char *receive_port_name);\n\n\n  // Given an already existing mach port, use it.\n  explicit MachPortSender(mach_port_t send_port);\n\n  kern_return_t SendMessage(MachSendMessage &message,\n                            mach_msg_timeout_t timeout);\n\n private:\n  MachPortSender(const MachPortSender&);  // disable copy c-tor\n\n  mach_port_t   send_port_;\n  kern_return_t init_result_;\n};\n\n}  // namespace google_breakpad\n\n#endif // MACH_IPC_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/MachIPC.mm",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//  MachIPC.mm\n//  Wrapper for mach IPC calls\n\n#import <stdio.h>\n#import \"MachIPC.h\"\n#include \"common/mac/bootstrap_compat.h\"\n\nnamespace google_breakpad {\n//==============================================================================\nMachSendMessage::MachSendMessage(int32_t message_id) : MachMessage() {\n  head.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);\n\n  // head.msgh_remote_port = ...; // filled out in MachPortSender::SendMessage()\n  head.msgh_local_port = MACH_PORT_NULL;\n  head.msgh_reserved = 0;\n  head.msgh_id = 0;\n\n  SetDescriptorCount(0);  // start out with no descriptors\n\n  SetMessageID(message_id);\n  SetData(NULL, 0);       // client may add data later\n}\n\n//==============================================================================\n// returns true if successful\nbool MachMessage::SetData(void *data,\n                          int32_t data_length) {\n  // first check to make sure we have enough space\n  size_t size = CalculateSize();\n  size_t new_size = size + data_length;\n  \n  if (new_size > sizeof(MachMessage)) {\n    return false;  // not enough space\n  }\n\n  GetDataPacket()->data_length = EndianU32_NtoL(data_length);\n  if (data) memcpy(GetDataPacket()->data, data, data_length);\n\n  CalculateSize();\n\n  return true;\n}\n\n//==============================================================================\n// calculates and returns the total size of the message\n// Currently, the entire message MUST fit inside of the MachMessage\n//    messsage size <= sizeof(MachMessage)\nmach_msg_size_t MachMessage::CalculateSize() {\n  size_t size = sizeof(mach_msg_header_t) + sizeof(mach_msg_body_t);\n  \n  // add space for MessageDataPacket\n  int32_t alignedDataLength = (GetDataLength() + 3) & ~0x3;\n  size += 2*sizeof(int32_t) + alignedDataLength;\n  \n  // add space for descriptors\n  size += GetDescriptorCount() * sizeof(MachMsgPortDescriptor);\n  \n  head.msgh_size = static_cast<mach_msg_size_t>(size);\n  \n  return head.msgh_size;\n}\n\n//==============================================================================\nMachMessage::MessageDataPacket *MachMessage::GetDataPacket() {\n  size_t desc_size = sizeof(MachMsgPortDescriptor)*GetDescriptorCount();\n  MessageDataPacket *packet =\n    reinterpret_cast<MessageDataPacket*>(padding + desc_size);\n\n  return packet;\n}\n\n//==============================================================================\nvoid MachMessage::SetDescriptor(int n,\n                                const MachMsgPortDescriptor &desc) {\n  MachMsgPortDescriptor *desc_array =\n    reinterpret_cast<MachMsgPortDescriptor*>(padding);\n  desc_array[n] = desc;\n}\n\n//==============================================================================\n// returns true if successful otherwise there was not enough space\nbool MachMessage::AddDescriptor(const MachMsgPortDescriptor &desc) {\n  // first check to make sure we have enough space\n  int size = CalculateSize();\n  size_t new_size = size + sizeof(MachMsgPortDescriptor);\n  \n  if (new_size > sizeof(MachMessage)) {\n    return false;  // not enough space\n  }\n\n  // unfortunately, we need to move the data to allow space for the\n  // new descriptor\n  u_int8_t *p = reinterpret_cast<u_int8_t*>(GetDataPacket());\n  bcopy(p, p+sizeof(MachMsgPortDescriptor), GetDataLength()+2*sizeof(int32_t));\n  \n  SetDescriptor(GetDescriptorCount(), desc);\n  SetDescriptorCount(GetDescriptorCount() + 1);\n\n  CalculateSize();\n  \n  return true;\n}\n\n//==============================================================================\nvoid MachMessage::SetDescriptorCount(int n) {\n  body.msgh_descriptor_count = n;\n\n  if (n > 0) {\n    head.msgh_bits |= MACH_MSGH_BITS_COMPLEX;\n  } else {\n    head.msgh_bits &= ~MACH_MSGH_BITS_COMPLEX;\n  }\n}\n\n//==============================================================================\nMachMsgPortDescriptor *MachMessage::GetDescriptor(int n) {\n  if (n < GetDescriptorCount()) {\n    MachMsgPortDescriptor *desc =\n      reinterpret_cast<MachMsgPortDescriptor*>(padding);\n    return desc + n;\n  }\n  \n  return nil;\n}\n\n//==============================================================================\nmach_port_t MachMessage::GetTranslatedPort(int n) {\n  if (n < GetDescriptorCount()) {\n    return GetDescriptor(n)->GetMachPort();\n  }\n  return MACH_PORT_NULL;\n}\n\n#pragma mark -\n\n//==============================================================================\n// create a new mach port for receiving messages and register a name for it\nReceivePort::ReceivePort(const char *receive_port_name) {\n  mach_port_t current_task = mach_task_self();\n\n  init_result_ = mach_port_allocate(current_task,\n                                    MACH_PORT_RIGHT_RECEIVE,\n                                    &port_);\n\n  if (init_result_ != KERN_SUCCESS)\n    return;\n    \n  init_result_ = mach_port_insert_right(current_task,\n                                        port_,\n                                        port_,\n                                        MACH_MSG_TYPE_MAKE_SEND);\n\n  if (init_result_ != KERN_SUCCESS)\n    return;\n\n  mach_port_t task_bootstrap_port = 0;\n  init_result_ = task_get_bootstrap_port(current_task, &task_bootstrap_port);\n\n  if (init_result_ != KERN_SUCCESS)\n    return;\n\n  init_result_ = breakpad::BootstrapRegister(\n      bootstrap_port,\n      const_cast<char*>(receive_port_name),\n      port_);\n}\n\n//==============================================================================\n// create a new mach port for receiving messages\nReceivePort::ReceivePort() {\n  mach_port_t current_task = mach_task_self();\n\n  init_result_ = mach_port_allocate(current_task,\n                                    MACH_PORT_RIGHT_RECEIVE,\n                                    &port_);\n\n  if (init_result_ != KERN_SUCCESS)\n    return;\n\n  init_result_ =   mach_port_insert_right(current_task,\n                                          port_,\n                                          port_,\n                                          MACH_MSG_TYPE_MAKE_SEND);\n}\n\n//==============================================================================\n// Given an already existing mach port, use it.  We take ownership of the\n// port and deallocate it in our destructor.\nReceivePort::ReceivePort(mach_port_t receive_port)\n  : port_(receive_port),\n    init_result_(KERN_SUCCESS) {\n}\n\n//==============================================================================\nReceivePort::~ReceivePort() {\n  if (init_result_ == KERN_SUCCESS)\n    mach_port_deallocate(mach_task_self(), port_);\n}\n\n//==============================================================================\nkern_return_t ReceivePort::WaitForMessage(MachReceiveMessage *out_message,\n                                          mach_msg_timeout_t timeout) {\n  if (!out_message) {\n    return KERN_INVALID_ARGUMENT;\n  }\n\n  // return any error condition encountered in constructor\n  if (init_result_ != KERN_SUCCESS)\n    return init_result_;\n  \n  out_message->head.msgh_bits = 0;\n  out_message->head.msgh_local_port = port_;\n  out_message->head.msgh_remote_port = MACH_PORT_NULL;\n  out_message->head.msgh_reserved = 0;\n  out_message->head.msgh_id = 0;\n\n  mach_msg_option_t options = MACH_RCV_MSG;\n  if (timeout != MACH_MSG_TIMEOUT_NONE)\n    options |= MACH_RCV_TIMEOUT;\n  kern_return_t result = mach_msg(&out_message->head,\n                                  options,\n                                  0,\n                                  sizeof(MachMessage),\n                                  port_,\n                                  timeout,              // timeout in ms\n                                  MACH_PORT_NULL);\n\n  return result;\n}\n\n#pragma mark -\n\n//==============================================================================\n// get a port with send rights corresponding to a named registered service\nMachPortSender::MachPortSender(const char *receive_port_name) {\n  mach_port_t task_bootstrap_port = 0;\n  init_result_ = task_get_bootstrap_port(mach_task_self(), \n                                         &task_bootstrap_port);\n  \n  if (init_result_ != KERN_SUCCESS)\n    return;\n\n  init_result_ = bootstrap_look_up(task_bootstrap_port,\n                    const_cast<char*>(receive_port_name),\n                    &send_port_);\n}\n\n//==============================================================================\nMachPortSender::MachPortSender(mach_port_t send_port) \n  : send_port_(send_port),\n    init_result_(KERN_SUCCESS) {\n}\n\n//==============================================================================\nkern_return_t MachPortSender::SendMessage(MachSendMessage &message,\n                                          mach_msg_timeout_t timeout) {\n  if (message.head.msgh_size == 0) {\n    return KERN_INVALID_VALUE;    // just for safety -- never should occur\n  };\n  \n  if (init_result_ != KERN_SUCCESS)\n    return init_result_;\n  \n  message.head.msgh_remote_port = send_port_;\n\n  kern_return_t result = mach_msg(&message.head,\n                                  MACH_SEND_MSG | MACH_SEND_TIMEOUT,\n                                  message.head.msgh_size,\n                                  0,\n                                  MACH_PORT_NULL,\n                                  timeout,              // timeout in ms\n                                  MACH_PORT_NULL);\n\n  return result;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/SimpleStringDictionary.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//  SimpleStringDictionary.h\n//\n\n#ifndef SimpleStringDictionary_H__\n#define SimpleStringDictionary_H__\n\n#import <string>\n#import <vector>\n\nnamespace google_breakpad {\n\n//==============================================================================\n// SimpleStringDictionary (and associated class KeyValueEntry) implement a very\n// basic dictionary container class.  It has the property of not making any\n// memory allocations when getting and setting values.  But it is not very\n// efficient, with calls to get and set values operating in linear time.\n// It has the additional limitation of having a fairly small fixed capacity of\n// SimpleStringDictionary::MAX_NUM_ENTRIES entries.  An assert() will fire if\n// the client attempts to set more than this number of key/value pairs.\n// Ordinarilly a C++ programmer would use something like the std::map template\n// class, or on the Macintosh would often choose CFDictionary or NSDictionary.\n// But these dictionary classes may call malloc() during get and set operations.\n// Google Breakpad requires that no memory allocations be made in code running\n// in its exception handling thread, so it uses SimpleStringDictionary as the\n// underlying implementation for the GoogleBreakpad.framework APIs:\n// GoogleBreakpadSetKeyValue(),  GoogleBreakpadKeyValue(), and\n// GoogleBreakpadRemoveKeyValue()\n//\n\n//==============================================================================\n// KeyValueEntry\n//\n// A helper class used by SimpleStringDictionary representing a single\n// storage cell for a key/value pair.  Each key and value string are\n// limited to MAX_STRING_STORAGE_SIZE-1 bytes (not glyphs).  This class\n// performs no memory allocations.  It has methods for setting  and getting\n// key and value strings.\n//\nclass KeyValueEntry {\n public:\n  KeyValueEntry() {\n    Clear();\n  }\n  \n  KeyValueEntry(const char *key, const char *value) {\n    SetKeyValue(key, value);\n  }\n\n  void        SetKeyValue(const char *key, const char *value) {\n    if (!key) {\n      key = \"\";\n    }\n    if (!value) {\n      value = \"\";\n    }\n    \n    strlcpy(key_, key, sizeof(key_));\n    strlcpy(value_, value, sizeof(value_));\n  }  \n\n  void        SetValue(const char *value) {\n    if (!value) {\n      value = \"\";\n    }\n    strlcpy(value_, value, sizeof(value_));\n  };\n  \n  // Removes the key/value\n  void        Clear() {\n    memset(key_, 0, sizeof(key_));\n    memset(value_, 0, sizeof(value_));\n  }\n\n  bool        IsActive() const { return key_[0] != '\\0'; }\n  const char *GetKey() const { return key_; }\n  const char *GetValue() const { return value_; }\n\n  // Don't change this without considering the fixed size\n  // of MachMessage (in MachIPC.h)\n  // (see also struct KeyValueMessageData in Inspector.h)\n  enum {MAX_STRING_STORAGE_SIZE = 256};\n  \n private:\n  char key_[MAX_STRING_STORAGE_SIZE];\n  char value_[MAX_STRING_STORAGE_SIZE];\n};\n\n//==============================================================================\n// This class is not an efficient dictionary, but for the purposes of breakpad\n// will be just fine.  We're just dealing with ten or so distinct\n// key/value pairs.  The idea is to avoid any malloc() or free() calls\n// in certain important methods to be called when a process is in a\n// crashed state.  Each key and value string are limited to\n// KeyValueEntry::MAX_STRING_STORAGE_SIZE-1 bytes (not glyphs).  Strings passed\n// in exceeding this length will be truncated.\n//\nclass SimpleStringDictionary {\n public:\n  SimpleStringDictionary() {};  // entries will all be cleared\n  \n  // Returns the number of active key/value pairs.  The upper limit for this\n  // is MAX_NUM_ENTRIES.\n  int GetCount() const;\n\n  // Given |key|, returns its corresponding |value|.\n  // If |key| is NULL, an assert will fire or NULL will be returned.  If |key|\n  // is not found or is an empty string, NULL is returned.\n  const char *GetValueForKey(const char *key) const;\n    \n  // Stores a string |value| represented by |key|.  If |key| is NULL or an empty\n  // string, this will assert (or do nothing).  If |value| is NULL then\n  // the |key| will be removed.  An empty string is OK for |value|.\n  void SetKeyValue(const char *key, const char *value);\n  \n  // Given |key|, removes any associated value.  It will assert (or do nothing)\n  // if NULL is passed in.  It will do nothing if |key| is not found.\n  void RemoveKey(const char *key);\n\n  // This is the maximum number of key/value pairs which may be set in the\n  // dictionary.  An assert may fire if more values than this are set.\n  // Don't change this without also changing comment in GoogleBreakpad.h\n  enum {MAX_NUM_ENTRIES = 64};\n\n private:\n  friend class SimpleStringDictionaryIterator;\n\n  const KeyValueEntry *GetEntry(int i) const;\n\n  KeyValueEntry             entries_[MAX_NUM_ENTRIES];\n};\n\n//==============================================================================\nclass SimpleStringDictionaryIterator {\n public:\n  SimpleStringDictionaryIterator(const SimpleStringDictionary &dict)\n    : dict_(dict), i_(0) {\n    }\n\n  // Initializes iterator to the beginning (may later call Next() )\n  void Start() {\n    i_ = 0;\n  }\n  \n  // like the nextObject method of NSEnumerator (in Cocoa)\n  // returns NULL when there are no more entries\n  //\n  const KeyValueEntry* Next() {\n    for (; i_ < SimpleStringDictionary::MAX_NUM_ENTRIES; ++i_) {\n      const KeyValueEntry *entry = dict_.GetEntry(i_);\n      if (entry->IsActive()) {\n        i_++;   // move to next entry for next time\n        return entry;\n      }\n    }\n\n    return NULL;  // reached end of array\n  }\n  \n private:\n  const SimpleStringDictionary&   dict_;\n  int                             i_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // SimpleStringDictionary_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/SimpleStringDictionary.mm",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n//  SimpleStringDictionary.mm\n//  Simple string dictionary that does not allocate memory\n//\n\n#include <assert.h>\n\n#import \"SimpleStringDictionary.h\"\n\nnamespace google_breakpad {\n\n//==============================================================================\nconst KeyValueEntry *SimpleStringDictionary::GetEntry(int i) const {\n  return (i >= 0 && i < MAX_NUM_ENTRIES) ? &entries_[i] : NULL;\n}\n\n//==============================================================================\nint SimpleStringDictionary::GetCount() const {\n  int count = 0;\n  for (int i = 0; i < MAX_NUM_ENTRIES; ++i) {\n    if (entries_[i].IsActive() ) {\n      ++count;\n    }\n  }\n  \n  return count;\n}\n\n//==============================================================================\nconst char *SimpleStringDictionary::GetValueForKey(const char *key) const {\n  assert(key);\n  if (!key)\n    return NULL;\n\n  for (int i = 0; i < MAX_NUM_ENTRIES; ++i) {\n    const KeyValueEntry &entry = entries_[i];\n    if (entry.IsActive() && !strcmp(entry.GetKey(), key)) {\n      return entry.GetValue();\n    }\n  }\n\n  return NULL;\n}\n\n//==============================================================================\nvoid SimpleStringDictionary::SetKeyValue(const char *key,\n                                         const char *value) {\n  if (!value) {\n    RemoveKey(key);\n    return;\n  }\n\n  // key must not be NULL\n  assert(key);\n  if (!key)\n    return;\n  \n  // key must not be empty string\n  assert(key[0] != '\\0');\n  if (key[0] == '\\0')\n    return;\n  \n  int free_index = -1;\n  \n  // check if key already exists\n  for (int i = 0; i < MAX_NUM_ENTRIES; ++i) {\n    KeyValueEntry &entry = entries_[i];\n    \n    if (entry.IsActive()) {\n      if (!strcmp(entry.GetKey(), key)) {\n        entry.SetValue(value);\n        return;\n      }\n    } else {\n      // Make a note of an empty slot\n      if (free_index == -1) {\n        free_index = i;\n      }\n    }\n  }\n  \n  // check if we've run out of space\n  assert(free_index != -1);\n  \n  // Put new key into an empty slot (if found)\n  if (free_index != -1) {\n    entries_[free_index].SetKeyValue(key, value);\n  }\n}\n\n//==============================================================================\nvoid SimpleStringDictionary::RemoveKey(const char *key) {\n  assert(key);\n  if (!key)\n    return;\n\n  for (int i = 0; i < MAX_NUM_ENTRIES; ++i) {\n    if (!strcmp(entries_[i].GetKey(), key)) {\n      entries_[i].Clear();\n      return;\n    }\n  }\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/bootstrap_compat.cc",
    "content": "// Copyright (c) 2012, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"common/mac/bootstrap_compat.h\"\n\nnamespace breakpad {\n\n#pragma GCC diagnostic ignored \"-Wdeprecated-declarations\"\nkern_return_t BootstrapRegister(mach_port_t bp,\n                                name_t service_name,\n                                mach_port_t sp) {\n  return bootstrap_register(bp, service_name, sp);\n}\n#pragma GCC diagnostic warning \"-Wdeprecated-declarations\"\n\n}  // namesapce breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/bootstrap_compat.h",
    "content": "// Copyright (c) 2012, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef COMMON_MAC_BOOTSTRAP_COMPAT_H_\n#define COMMON_MAC_BOOTSTRAP_COMPAT_H_\n\n#include <servers/bootstrap.h>\n\nnamespace breakpad {\n\n// Wrapper for bootstrap_register to avoid deprecation warnings.\n//\n// In 10.6, it's possible to call bootstrap_check_in as the one-stop-shop for\n// handling what bootstrap_register is used for. In 10.5, bootstrap_check_in\n// can't check in a service whose name has not yet been registered, despite\n// bootstrap_register being marked as deprecated in that OS release. Breakpad\n// needs to register new service names, and in 10.5, calling\n// bootstrap_register is the only way to achieve that. Attempts to call\n// bootstrap_check_in for a new service name on 10.5 will result in\n// BOOTSTRAP_UNKNOWN_SERVICE being returned rather than registration of the\n// new service name.\nkern_return_t BootstrapRegister(mach_port_t bp,\n                                name_t service_name,\n                                mach_port_t sp);\n\n}  // namespace breakpad\n\n#endif  // COMMON_MAC_BOOTSTRAP_COMPAT_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/byteswap.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jim@mozilla.com> <jimb@red-bean.com>\n\n// byteswap.h: Overloaded functions for conveniently byteswapping values.\n\n#ifndef COMMON_MAC_BYTESWAP_H_\n#define COMMON_MAC_BYTESWAP_H_\n\n#include <libkern/OSByteOrder.h>\n\nstatic inline uint16_t ByteSwap(uint16_t v) { return OSSwapInt16(v); }\nstatic inline uint32_t ByteSwap(uint32_t v) { return OSSwapInt32(v); }\nstatic inline uint64_t ByteSwap(uint64_t v) { return OSSwapInt64(v); }\nstatic inline int16_t  ByteSwap(int16_t  v) { return OSSwapInt16(v); }\nstatic inline int32_t  ByteSwap(int32_t  v) { return OSSwapInt32(v); }\nstatic inline int64_t  ByteSwap(int64_t  v) { return OSSwapInt64(v); }\n\n#endif  // COMMON_MAC_BYTESWAP_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/dump_syms.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dump_syms.h: Declaration of google_breakpad::DumpSymbols, a class for\n// reading debugging information from Mach-O files and writing it out as a\n// Breakpad symbol file.\n\n#include <Foundation/Foundation.h>\n#include <mach-o/loader.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#include <ostream>\n#include <string>\n#include <vector>\n\n#include \"common/byte_cursor.h\"\n#include \"common/mac/macho_reader.h\"\n#include \"common/module.h\"\n\nnamespace google_breakpad {\n\nclass DumpSymbols {\n public:\n  DumpSymbols()\n      : input_pathname_(),\n        object_filename_(),\n        contents_(),\n        selected_object_file_(),\n        selected_object_name_() { }\n  ~DumpSymbols() {\n    [input_pathname_ release];\n    [object_filename_ release];\n    [contents_ release];\n  }\n\n  // Prepare to read debugging information from |filename|. |filename| may be\n  // the name of a universal binary, a Mach-O file, or a dSYM bundle\n  // containing either of the above. On success, return true; if there is a\n  // problem reading |filename|, report it and return false.\n  //\n  // (This class uses NSString for filenames and related values,\n  // because the Mac Foundation framework seems to support\n  // filename-related operations more fully on NSString values.)\n  bool Read(NSString *filename);\n\n  // If this dumper's file includes an object file for |cpu_type| and\n  // |cpu_subtype|, then select that object file for dumping, and return\n  // true. Otherwise, return false, and leave this dumper's selected\n  // architecture unchanged.\n  //\n  // By default, if this dumper's file contains only one object file, then\n  // the dumper will dump those symbols; and if it contains more than one\n  // object file, then the dumper will dump the object file whose\n  // architecture matches that of this dumper program.\n  bool SetArchitecture(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype);\n\n  // If this dumper's file includes an object file for |arch_name|, then select\n  // that object file for dumping, and return true. Otherwise, return false,\n  // and leave this dumper's selected architecture unchanged.\n  //\n  // By default, if this dumper's file contains only one object file, then\n  // the dumper will dump those symbols; and if it contains more than one\n  // object file, then the dumper will dump the object file whose\n  // architecture matches that of this dumper program.\n  bool SetArchitecture(const std::string &arch_name);\n\n  // Return a pointer to an array of 'struct fat_arch' structures,\n  // describing the object files contained in this dumper's file. Set\n  // *|count| to the number of elements in the array. The returned array is\n  // owned by this DumpSymbols instance.\n  //\n  // If there are no available architectures, this function\n  // may return NULL.\n  const struct fat_arch *AvailableArchitectures(size_t *count) {\n    *count = object_files_.size();\n    if (object_files_.size() > 0)\n      return &object_files_[0];\n    return NULL;\n  }\n\n  // Read the selected object file's debugging information, and write it out to\n  // |stream|. Write the CFI section if |cfi| is true. Return true on success;\n  // if an error occurs, report it and return false.\n  bool WriteSymbolFile(std::ostream &stream, bool cfi);\n\n private:\n  // Used internally.\n  class DumperLineToModule;\n  class LoadCommandDumper;\n\n  // Return an identifier string for the file this DumpSymbols is dumping.\n  std::string Identifier();\n\n  // Read debugging information from |dwarf_sections|, which was taken from\n  // |macho_reader|, and add it to |module|. On success, return true;\n  // on failure, report the problem and return false.\n  bool ReadDwarf(google_breakpad::Module *module,\n                 const mach_o::Reader &macho_reader,\n                 const mach_o::SectionMap &dwarf_sections) const;\n\n  // Read DWARF CFI or .eh_frame data from |section|, belonging to\n  // |macho_reader|, and record it in |module|.  If |eh_frame| is true,\n  // then the data is .eh_frame-format data; otherwise, it is standard DWARF\n  // .debug_frame data. On success, return true; on failure, report\n  // the problem and return false.\n  bool ReadCFI(google_breakpad::Module *module,\n               const mach_o::Reader &macho_reader,\n               const mach_o::Section &section,\n               bool eh_frame) const;\n\n  // The name of the file or bundle whose symbols this will dump.\n  // This is the path given to Read, for use in error messages.\n  NSString *input_pathname_;\n\n  // The name of the file this DumpSymbols will actually read debugging\n  // information from. Normally, this is the same as input_pathname_, but if\n  // filename refers to a dSYM bundle, then this is the resource file\n  // within that bundle.\n  NSString *object_filename_;\n\n  // The complete contents of object_filename_, mapped into memory.\n  NSData *contents_;\n\n  // A vector of fat_arch structures describing the object files\n  // object_filename_ contains. If object_filename_ refers to a fat binary,\n  // this may have more than one element; if it refers to a Mach-O file, this\n  // has exactly one element.\n  vector<struct fat_arch> object_files_;\n\n  // The object file in object_files_ selected to dump, or NULL if\n  // SetArchitecture hasn't been called yet.\n  const struct fat_arch *selected_object_file_;\n\n  // A string that identifies the selected object file, for use in error\n  // messages.  This is usually object_filename_, but if that refers to a\n  // fat binary, it includes an indication of the particular architecture\n  // within that binary.\n  string selected_object_name_;\n};\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/dump_syms.mm",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dump_syms.mm: Create a symbol file for use with minidumps\n\n#include \"common/mac/dump_syms.h\"\n\n#include <Foundation/Foundation.h>\n#include <mach-o/arch.h>\n#include <mach-o/fat.h>\n#include <stdio.h>\n\n#include <ostream>\n#include <string>\n#include <vector>\n\n#include \"common/dwarf/bytereader-inl.h\"\n#include \"common/dwarf/dwarf2reader.h\"\n#include \"common/dwarf_cfi_to_module.h\"\n#include \"common/dwarf_cu_to_module.h\"\n#include \"common/dwarf_line_to_module.h\"\n#include \"common/mac/file_id.h\"\n#include \"common/mac/macho_reader.h\"\n#include \"common/module.h\"\n#include \"common/stabs_reader.h\"\n#include \"common/stabs_to_module.h\"\n\n#ifndef CPU_TYPE_ARM\n#define CPU_TYPE_ARM (static_cast<cpu_type_t>(12))\n#endif //  CPU_TYPE_ARM\n\nusing dwarf2reader::ByteReader;\nusing google_breakpad::DwarfCUToModule;\nusing google_breakpad::DwarfLineToModule;\nusing google_breakpad::FileID;\nusing google_breakpad::mach_o::FatReader;\nusing google_breakpad::mach_o::Section;\nusing google_breakpad::mach_o::Segment;\nusing google_breakpad::Module;\nusing google_breakpad::StabsReader;\nusing google_breakpad::StabsToModule;\nusing std::make_pair;\nusing std::pair;\nusing std::string;\nusing std::vector;\n\nnamespace google_breakpad {\n\nbool DumpSymbols::Read(NSString *filename) {\n  if (![[NSFileManager defaultManager] fileExistsAtPath:filename]) {\n    fprintf(stderr, \"Object file does not exist: %s\\n\",\n            [filename fileSystemRepresentation]);\n    return false;\n  }\n\n  input_pathname_ = [filename retain];\n\n  // Does this filename refer to a dSYM bundle?\n  NSBundle *bundle = [NSBundle bundleWithPath:input_pathname_];\n\n  if (bundle) {\n    // Filenames referring to bundles usually have names of the form\n    // \"<basename>.dSYM\"; however, if the user has specified a wrapper\n    // suffix (the WRAPPER_SUFFIX and WRAPPER_EXTENSION build settings),\n    // then the name may have the form \"<basename>.<extension>.dSYM\". In\n    // either case, the resource name for the file containing the DWARF\n    // info within the bundle is <basename>.\n    //\n    // Since there's no way to tell how much to strip off, remove one\n    // extension at a time, and use the first one that\n    // pathForResource:ofType:inDirectory likes.\n    NSString *base_name = [input_pathname_ lastPathComponent];\n    NSString *dwarf_resource;\n\n    do {\n      NSString *new_base_name = [base_name stringByDeletingPathExtension];\n\n      // If stringByDeletingPathExtension returned the name unchanged, then\n      // there's nothing more for us to strip off --- lose.\n      if ([new_base_name isEqualToString:base_name]) {\n        fprintf(stderr, \"Unable to find DWARF-bearing file in bundle: %s\\n\",\n                [input_pathname_ fileSystemRepresentation]);\n        return false;\n      }\n\n      // Take the shortened result as our new base_name.\n      base_name = new_base_name;\n\n      // Try to find a DWARF resource in the bundle under the new base_name.\n      dwarf_resource = [bundle pathForResource:base_name\n                        ofType:nil inDirectory:@\"DWARF\"];\n    } while (!dwarf_resource);\n\n    object_filename_ = [dwarf_resource retain];\n  } else {\n    object_filename_ = [input_pathname_ retain];\n  }\n\n  // Read the file's contents into memory.\n  //\n  // The documentation for dataWithContentsOfMappedFile says:\n  //\n  //     Because of file mapping restrictions, this method should only be\n  //     used if the file is guaranteed to exist for the duration of the\n  //     data object’s existence. It is generally safer to use the\n  //     dataWithContentsOfFile: method.\n  //\n  // I gather this means that OS X doesn't have (or at least, that method\n  // doesn't use) a form of mapping like Linux's MAP_PRIVATE, where the\n  // process appears to get its own copy of the data, and changes to the\n  // file don't affect memory and vice versa).\n  NSError *error;\n  contents_ = [NSData dataWithContentsOfFile:object_filename_\n                                     options:0\n                                       error:&error];\n  if (!contents_) {\n    fprintf(stderr, \"Error reading object file: %s: %s\\n\",\n            [object_filename_ fileSystemRepresentation],\n            [[error localizedDescription] UTF8String]);\n    return false;\n  }\n  [contents_ retain];\n\n  // Get the list of object files present in the file.\n  FatReader::Reporter fat_reporter([object_filename_\n                                    fileSystemRepresentation]);\n  FatReader fat_reader(&fat_reporter);\n  if (!fat_reader.Read(reinterpret_cast<const uint8_t *>([contents_ bytes]),\n                       [contents_ length])) {\n    return false;\n  }\n\n  // Get our own copy of fat_reader's object file list.\n  size_t object_files_count;\n  const struct fat_arch *object_files =\n    fat_reader.object_files(&object_files_count);\n  if (object_files_count == 0) {\n    fprintf(stderr, \"Fat binary file contains *no* architectures: %s\\n\",\n            [object_filename_ fileSystemRepresentation]);\n    return false;\n  }\n  object_files_.resize(object_files_count);\n  memcpy(&object_files_[0], object_files,\n         sizeof(struct fat_arch) * object_files_count);\n\n  return true;\n}\n\nbool DumpSymbols::SetArchitecture(cpu_type_t cpu_type,\n                                  cpu_subtype_t cpu_subtype) {\n  // Find the best match for the architecture the user requested.\n  const struct fat_arch *best_match\n    = NXFindBestFatArch(cpu_type, cpu_subtype, &object_files_[0],\n                        static_cast<uint32_t>(object_files_.size()));\n  if (!best_match) return false;\n\n  // Record the selected object file.\n  selected_object_file_ = best_match;\n  return true;\n}\n\nbool DumpSymbols::SetArchitecture(const std::string &arch_name) {\n  bool arch_set = false;\n  const NXArchInfo *arch_info = NXGetArchInfoFromName(arch_name.c_str());\n  if (arch_info) {\n    arch_set = SetArchitecture(arch_info->cputype, arch_info->cpusubtype);\n  }\n  return arch_set;\n}\n\nstring DumpSymbols::Identifier() {\n  FileID file_id([object_filename_ fileSystemRepresentation]);\n  unsigned char identifier_bytes[16];\n  cpu_type_t cpu_type = selected_object_file_->cputype;\n  if (!file_id.MachoIdentifier(cpu_type, identifier_bytes)) {\n    fprintf(stderr, \"Unable to calculate UUID of mach-o binary %s!\\n\",\n            [object_filename_ fileSystemRepresentation]);\n    return \"\";\n  }\n\n  char identifier_string[40];\n  FileID::ConvertIdentifierToString(identifier_bytes, identifier_string,\n                                    sizeof(identifier_string));\n\n  string compacted(identifier_string);\n  for(size_t i = compacted.find('-'); i != string::npos;\n      i = compacted.find('-', i))\n    compacted.erase(i, 1);\n\n  return compacted;\n}\n\n// A line-to-module loader that accepts line number info parsed by\n// dwarf2reader::LineInfo and populates a Module and a line vector\n// with the results.\nclass DumpSymbols::DumperLineToModule:\n      public DwarfCUToModule::LineToModuleFunctor {\n public:\n  // Create a line-to-module converter using BYTE_READER.\n  DumperLineToModule(dwarf2reader::ByteReader *byte_reader)\n      : byte_reader_(byte_reader) { }\n  void operator()(const char *program, uint64 length,\n                  Module *module, vector<Module::Line> *lines) {\n    DwarfLineToModule handler(module, lines);\n    dwarf2reader::LineInfo parser(program, length, byte_reader_, &handler);\n    parser.Start();\n  }\n private:\n  dwarf2reader::ByteReader *byte_reader_;  // WEAK\n};\n\nbool DumpSymbols::ReadDwarf(google_breakpad::Module *module,\n                            const mach_o::Reader &macho_reader,\n                            const mach_o::SectionMap &dwarf_sections) const {\n  // Build a byte reader of the appropriate endianness.\n  ByteReader byte_reader(macho_reader.big_endian()\n                         ? dwarf2reader::ENDIANNESS_BIG\n                         : dwarf2reader::ENDIANNESS_LITTLE);\n\n  // Construct a context for this file.\n  DwarfCUToModule::FileContext file_context(selected_object_name_,\n                                            module);\n\n  // Build a dwarf2reader::SectionMap from our mach_o::SectionMap.\n  for (mach_o::SectionMap::const_iterator it = dwarf_sections.begin();\n       it != dwarf_sections.end(); it++) {\n    file_context.section_map[it->first] =\n      make_pair(reinterpret_cast<const char *>(it->second.contents.start),\n                it->second.contents.Size());\n  }\n\n  // Find the __debug_info section.\n  std::pair<const char *, uint64> debug_info_section\n      = file_context.section_map[\"__debug_info\"];\n  // There had better be a __debug_info section!\n  if (!debug_info_section.first) {\n    fprintf(stderr, \"%s: __DWARF segment of file has no __debug_info section\\n\",\n            selected_object_name_.c_str());\n    return false;\n  }\n\n  // Build a line-to-module loader for the root handler to use.\n  DumperLineToModule line_to_module(&byte_reader);\n\n  // Walk the __debug_info section, one compilation unit at a time.\n  uint64 debug_info_length = debug_info_section.second;\n  for (uint64 offset = 0; offset < debug_info_length;) {\n    // Make a handler for the root DIE that populates MODULE with the\n    // debug info.\n    DwarfCUToModule::WarningReporter reporter(selected_object_name_,\n                                              offset);\n    DwarfCUToModule root_handler(&file_context, &line_to_module, &reporter);\n    // Make a Dwarf2Handler that drives our DIEHandler.\n    dwarf2reader::DIEDispatcher die_dispatcher(&root_handler);\n    // Make a DWARF parser for the compilation unit at OFFSET.\n    dwarf2reader::CompilationUnit dwarf_reader(file_context.section_map,\n                                               offset,\n                                               &byte_reader,\n                                               &die_dispatcher);\n    // Process the entire compilation unit; get the offset of the next.\n    offset += dwarf_reader.Start();\n  }\n\n  return true;\n}\n\nbool DumpSymbols::ReadCFI(google_breakpad::Module *module,\n                          const mach_o::Reader &macho_reader,\n                          const mach_o::Section &section,\n                          bool eh_frame) const {\n  // Find the appropriate set of register names for this file's\n  // architecture.\n  vector<string> register_names;\n  switch (macho_reader.cpu_type()) {\n    case CPU_TYPE_X86:\n      register_names = DwarfCFIToModule::RegisterNames::I386();\n      break;\n    case CPU_TYPE_X86_64:\n      register_names = DwarfCFIToModule::RegisterNames::X86_64();\n      break;\n    case CPU_TYPE_ARM:\n      register_names = DwarfCFIToModule::RegisterNames::ARM();\n      break;\n    default: {\n      const NXArchInfo *arch =\n          NXGetArchInfoFromCpuType(macho_reader.cpu_type(),\n                                   macho_reader.cpu_subtype());\n      fprintf(stderr, \"%s: cannot convert DWARF call frame information for \",\n              selected_object_name_.c_str());\n      if (arch)\n        fprintf(stderr, \"architecture '%s'\", arch->name);\n      else\n        fprintf(stderr, \"architecture %d,%d\",\n                macho_reader.cpu_type(), macho_reader.cpu_subtype());\n      fprintf(stderr, \" to Breakpad symbol file: no register name table\\n\");\n      return false;\n    }\n  }\n\n  // Find the call frame information and its size.\n  const char *cfi = reinterpret_cast<const char *>(section.contents.start);\n  size_t cfi_size = section.contents.Size();\n\n  // Plug together the parser, handler, and their entourages.\n  DwarfCFIToModule::Reporter module_reporter(selected_object_name_,\n                                             section.section_name);\n  DwarfCFIToModule handler(module, register_names, &module_reporter);\n  dwarf2reader::ByteReader byte_reader(macho_reader.big_endian() ?\n                                       dwarf2reader::ENDIANNESS_BIG :\n                                       dwarf2reader::ENDIANNESS_LITTLE);\n  byte_reader.SetAddressSize(macho_reader.bits_64() ? 8 : 4);\n  // At the moment, according to folks at Apple and some cursory\n  // investigation, Mac OS X only uses DW_EH_PE_pcrel-based pointers, so\n  // this is the only base address the CFI parser will need.\n  byte_reader.SetCFIDataBase(section.address, cfi);\n\n  dwarf2reader::CallFrameInfo::Reporter dwarf_reporter(selected_object_name_,\n                                                       section.section_name);\n  dwarf2reader::CallFrameInfo parser(cfi, cfi_size,\n                                     &byte_reader, &handler, &dwarf_reporter,\n                                     eh_frame);\n  parser.Start();\n  return true;\n}\n\n// A LoadCommandHandler that loads whatever debugging data it finds into a\n// Module.\nclass DumpSymbols::LoadCommandDumper:\n      public mach_o::Reader::LoadCommandHandler {\n public:\n  // Create a load command dumper handling load commands from READER's\n  // file, and adding data to MODULE.\n  LoadCommandDumper(const DumpSymbols &dumper,\n                    google_breakpad::Module *module,\n                    const mach_o::Reader &reader)\n      : dumper_(dumper), module_(module), reader_(reader) { }\n\n  bool SegmentCommand(const mach_o::Segment &segment);\n  bool SymtabCommand(const ByteBuffer &entries, const ByteBuffer &strings);\n\n private:\n  const DumpSymbols &dumper_;\n  google_breakpad::Module *module_;  // WEAK\n  const mach_o::Reader &reader_;\n};\n\nbool DumpSymbols::LoadCommandDumper::SegmentCommand(const Segment &segment) {\n  mach_o::SectionMap section_map;\n  if (!reader_.MapSegmentSections(segment, &section_map))\n    return false;\n\n  if (segment.name == \"__TEXT\") {\n    module_->SetLoadAddress(segment.vmaddr);\n    mach_o::SectionMap::const_iterator eh_frame =\n        section_map.find(\"__eh_frame\");\n    if (eh_frame != section_map.end()) {\n      // If there is a problem reading this, don't treat it as a fatal error.\n      dumper_.ReadCFI(module_, reader_, eh_frame->second, true);\n    }\n    return true;\n  }\n\n  if (segment.name == \"__DWARF\") {\n    if (!dumper_.ReadDwarf(module_, reader_, section_map))\n      return false;\n    mach_o::SectionMap::const_iterator debug_frame\n        = section_map.find(\"__debug_frame\");\n    if (debug_frame != section_map.end()) {\n      // If there is a problem reading this, don't treat it as a fatal error.\n      dumper_.ReadCFI(module_, reader_, debug_frame->second, false);\n    }\n  }\n\n  return true;\n}\n\nbool DumpSymbols::LoadCommandDumper::SymtabCommand(const ByteBuffer &entries,\n                                                   const ByteBuffer &strings) {\n  StabsToModule stabs_to_module(module_);\n  // Mac OS X STABS are never \"unitized\", and the size of the 'value' field\n  // matches the address size of the executable.\n  StabsReader stabs_reader(entries.start, entries.Size(),\n                           strings.start, strings.Size(),\n                           reader_.big_endian(),\n                           reader_.bits_64() ? 8 : 4,\n                           true,\n                           &stabs_to_module);\n  if (!stabs_reader.Process())\n    return false;\n  stabs_to_module.Finalize();\n  return true;\n}\n\nbool DumpSymbols::WriteSymbolFile(std::ostream &stream, bool cfi) {\n  // Select an object file, if SetArchitecture hasn't been called to set one\n  // explicitly.\n  if (!selected_object_file_) {\n    // If there's only one architecture, that's the one.\n    if (object_files_.size() == 1)\n      selected_object_file_ = &object_files_[0];\n    else {\n      // Look for an object file whose architecture matches our own.\n      const NXArchInfo *local_arch = NXGetLocalArchInfo();\n      if (!SetArchitecture(local_arch->cputype, local_arch->cpusubtype)) {\n        fprintf(stderr, \"%s: object file contains more than one\"\n                \" architecture, none of which match the current\"\n                \" architecture; specify an architecture explicitly\"\n                \" with '-a ARCH' to resolve the ambiguity\\n\",\n                [object_filename_ fileSystemRepresentation]);\n        return false;\n      }\n    }\n  }\n\n  assert(selected_object_file_);\n\n  // Find the name of the selected file's architecture, to appear in\n  // the MODULE record and in error messages.\n  const NXArchInfo *selected_arch_info\n      = NXGetArchInfoFromCpuType(selected_object_file_->cputype,\n                                 selected_object_file_->cpusubtype);\n\n  const char *selected_arch_name = selected_arch_info->name;\n  if (strcmp(selected_arch_name, \"i386\") == 0)\n    selected_arch_name = \"x86\";\n\n  // Produce a name to use in error messages that includes the\n  // filename, and the architecture, if there is more than one.\n  selected_object_name_ = [object_filename_ UTF8String];\n  if (object_files_.size() > 1) {\n    selected_object_name_ += \", architecture \";\n    selected_object_name_ + selected_arch_name;\n  }\n\n  // Compute a module name, to appear in the MODULE record.\n  NSString *module_name = [object_filename_ lastPathComponent];\n\n  // Choose an identifier string, to appear in the MODULE record.\n  string identifier = Identifier();\n  if (identifier.empty())\n    return false;\n  identifier += \"0\";\n\n  // Create a module to hold the debugging information.\n  Module module([module_name UTF8String], \"mac\", selected_arch_name,\n                identifier);\n\n  // Parse the selected object file.\n  mach_o::Reader::Reporter reporter(selected_object_name_);\n  mach_o::Reader reader(&reporter);\n  if (!reader.Read(reinterpret_cast<const uint8_t *>([contents_ bytes])\n                   + selected_object_file_->offset,\n                   selected_object_file_->size,\n                   selected_object_file_->cputype,\n                   selected_object_file_->cpusubtype))\n    return false;\n\n  // Walk its load commands, and deal with whatever is there.\n  LoadCommandDumper load_command_dumper(*this, &module, reader);\n  if (!reader.WalkLoadCommands(&load_command_dumper))\n    return false;\n\n  return module.Write(stream, cfi);\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/file_id.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// file_id.cc: Return a unique identifier for a file\n//\n// See file_id.h for documentation\n//\n// Author: Dan Waylonis\n\n#include <fcntl.h>\n#include <string.h>\n#include <unistd.h>\n\n#include \"common/mac/file_id.h\"\n#include \"common/mac/macho_id.h\"\n\nusing MacFileUtilities::MachoID;\n\nnamespace google_breakpad {\n\nFileID::FileID(const char *path) {\n  strlcpy(path_, path, sizeof(path_));\n}\n\nbool FileID::FileIdentifier(unsigned char identifier[16]) {\n  int fd = open(path_, O_RDONLY);\n  if (fd == -1)\n    return false;\n\n  MD5Context md5;\n  MD5Init(&md5);\n\n  // Read 4k x 2 bytes at a time.  This is faster than just 4k bytes, but\n  // doesn't seem to be an unreasonable size for the stack.\n  unsigned char buffer[4096 * 2];\n  size_t buffer_size = sizeof(buffer);\n  while ((buffer_size = read(fd, buffer, buffer_size) > 0)) {\n    MD5Update(&md5, buffer, buffer_size);\n  }\n\n  close(fd);\n  MD5Final(identifier, &md5);\n\n  return true;\n}\n\nbool FileID::MachoIdentifier(int cpu_type, unsigned char identifier[16]) {\n  MachoID macho(path_);\n\n  if (macho.UUIDCommand(cpu_type, identifier))\n    return true;\n\n  return macho.MD5(cpu_type, identifier);\n}\n\n// static\nvoid FileID::ConvertIdentifierToString(const unsigned char identifier[16],\n                                       char *buffer, int buffer_length) {\n  int buffer_idx = 0;\n  for (int idx = 0; (buffer_idx < buffer_length) && (idx < 16); ++idx) {\n    int hi = (identifier[idx] >> 4) & 0x0F;\n    int lo = (identifier[idx]) & 0x0F;\n\n    if (idx == 4 || idx == 6 || idx == 8 || idx == 10)\n      buffer[buffer_idx++] = '-';\n\n    buffer[buffer_idx++] = (hi >= 10) ? 'A' + hi - 10 : '0' + hi;\n    buffer[buffer_idx++] = (lo >= 10) ? 'A' + lo - 10 : '0' + lo;\n  }\n\n  // NULL terminate\n  buffer[(buffer_idx < buffer_length) ? buffer_idx : buffer_idx - 1] = 0;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/file_id.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// file_id.h: Return a unique identifier for a file\n//\n// Author: Dan Waylonis\n\n#ifndef COMMON_MAC_FILE_ID_H__\n#define COMMON_MAC_FILE_ID_H__\n\n#include <limits.h>\n\nnamespace google_breakpad {\n\nclass FileID {\n public:\n  FileID(const char *path);\n  ~FileID() {};\n\n  // Load the identifier for the file path specified in the constructor into\n  // |identifier|.  Return false if the identifier could not be created for the\n  // file.\n  // The current implementation will return the MD5 hash of the file's bytes.\n  bool FileIdentifier(unsigned char identifier[16]);\n\n  // Treat the file as a mach-o file that will contain one or more archicture.\n  // Accepted values for |cpu_type| (e.g., CPU_TYPE_X86 or CPU_TYPE_POWERPC)\n  // are listed in /usr/include/mach/machine.h.\n  // If |cpu_type| is 0, then the native cpu type is used.\n  // Returns false if opening the file failed or if the |cpu_type| is not\n  // present in the file.\n  // Return the unique identifier in |identifier|.\n  // The current implementation will look for the (in order of priority):\n  // LC_UUID, LC_ID_DYLIB, or MD5 hash of the given |cpu_type|.\n  bool MachoIdentifier(int cpu_type, unsigned char identifier[16]);\n\n  // Convert the |identifier| data to a NULL terminated string.  The string will\n  // be formatted as a UUID (e.g., 22F065BB-FC9C-49F7-80FE-26A7CEBD7BCE).\n  // The |buffer| should be at least 37 bytes long to receive all of the data\n  // and termination.  Shorter buffers will contain truncated data.\n  static void ConvertIdentifierToString(const unsigned char identifier[16],\n                                        char *buffer, int buffer_length);\n\n private:\n  // Storage for the path specified\n  char path_[PATH_MAX];\n};\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_MAC_FILE_ID_H__\n\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/macho_id.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// macho_id.cc: Functions to gather identifying information from a macho file\n//\n// See macho_id.h for documentation\n//\n// Author: Dan Waylonis\n\nextern \"C\" {  // necessary for Leopard\n  #include <fcntl.h>\n  #include <mach-o/loader.h>\n  #include <mach-o/swap.h>\n  #include <stdio.h>\n  #include <stdlib.h>\n  #include <string.h>\n  #include <sys/time.h>\n  #include <sys/types.h>\n  #include <unistd.h>\n}\n\n#include \"common/mac/macho_id.h\"\n#include \"common/mac/macho_walker.h\"\n#include \"common/mac/macho_utilities.h\"\n\nnamespace MacFileUtilities {\n\nusing google_breakpad::MD5Init;\nusing google_breakpad::MD5Update;\nusing google_breakpad::MD5Final;\n\nMachoID::MachoID(const char *path)\n   : memory_(0),\n     memory_size_(0),\n     crc_(0), \n     md5_context_(), \n     update_function_(NULL) {\n  strlcpy(path_, path, sizeof(path_));\n}\n\nMachoID::MachoID(const char *path, void *memory, size_t size)\n   : memory_(memory),\n     memory_size_(size),\n     crc_(0), \n     md5_context_(), \n     update_function_(NULL) {\n  strlcpy(path_, path, sizeof(path_));\n}\n\nMachoID::~MachoID() {\n}\n\n// The CRC info is from http://en.wikipedia.org/wiki/Adler-32\n// With optimizations from http://www.zlib.net/\n\n// The largest prime smaller than 65536\n#define MOD_ADLER 65521\n// MAX_BLOCK is the largest n such that 255n(n+1)/2 + (n+1)(MAX_BLOCK-1) <= 2^32-1\n#define MAX_BLOCK 5552\n\nvoid MachoID::UpdateCRC(unsigned char *bytes, size_t size) {\n// Unrolled loops for summing\n#define DO1(buf,i)  {sum1 += (buf)[i]; sum2 += sum1;}\n#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);\n#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);\n#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);\n#define DO16(buf)   DO8(buf,0); DO8(buf,8);\n  // Split up the crc\n  uint32_t sum1 = crc_ & 0xFFFF;\n  uint32_t sum2 = (crc_ >> 16) & 0xFFFF;\n\n  // Do large blocks\n  while (size >= MAX_BLOCK) {\n    size -= MAX_BLOCK;\n    int block_count = MAX_BLOCK / 16;\n    do {\n      DO16(bytes);\n      bytes += 16;\n    } while (--block_count);\n    sum1 %= MOD_ADLER;\n    sum2 %= MOD_ADLER;\n  }\n\n  // Do remaining bytes\n  if (size) {\n    while (size >= 16) {\n      size -= 16;\n      DO16(bytes);\n      bytes += 16;\n    }\n    while (size--) {\n      sum1 += *bytes++;\n      sum2 += sum1;\n    }\n    sum1 %= MOD_ADLER;\n    sum2 %= MOD_ADLER;\n    crc_ = (sum2 << 16) | sum1;\n  }\n}\n\nvoid MachoID::UpdateMD5(unsigned char *bytes, size_t size) {\n  MD5Update(&md5_context_, bytes, size);\n}\n\nvoid MachoID::Update(MachoWalker *walker, off_t offset, size_t size) {\n  if (!update_function_ || !size)\n    return;\n\n  // Read up to 4k bytes at a time\n  unsigned char buffer[4096];\n  size_t buffer_size;\n  off_t file_offset = offset;\n  while (size > 0) {\n    if (size > sizeof(buffer)) {\n      buffer_size = sizeof(buffer);\n      size -= buffer_size;\n    } else {\n      buffer_size = size;\n      size = 0;\n    }\n\n    if (!walker->ReadBytes(buffer, buffer_size, file_offset))\n      return;\n\n    (this->*update_function_)(buffer, buffer_size);\n    file_offset += buffer_size;\n  }\n}\n\nbool MachoID::UUIDCommand(int cpu_type, unsigned char bytes[16]) {\n  struct breakpad_uuid_command uuid_cmd;\n  uuid_cmd.cmd = 0;\n  if (!WalkHeader(cpu_type, UUIDWalkerCB, &uuid_cmd))\n    return false;\n\n  // If we found the command, we'll have initialized the uuid_command\n  // structure\n  if (uuid_cmd.cmd == LC_UUID) {\n    memcpy(bytes, uuid_cmd.uuid, sizeof(uuid_cmd.uuid));\n    return true;\n  }\n\n  return false;\n}\n\nbool MachoID::IDCommand(int cpu_type, unsigned char identifier[16]) {\n  struct dylib_command dylib_cmd;\n  dylib_cmd.cmd = 0;\n  if (!WalkHeader(cpu_type, IDWalkerCB, &dylib_cmd))\n    return false;\n\n  // If we found the command, we'll have initialized the dylib_command\n  // structure\n  if (dylib_cmd.cmd == LC_ID_DYLIB) {\n    // Take the hashed filename, version, and compatability version bytes\n    // to form the first 12 bytes, pad the rest with zeros\n\n    // create a crude hash of the filename to generate the first 4 bytes\n    identifier[0] = 0;\n    identifier[1] = 0;\n    identifier[2] = 0;\n    identifier[3] = 0;\n\n    for (int j = 0, i = (int)strlen(path_)-1; i>=0 && path_[i]!='/'; ++j, --i) {\n      identifier[j%4] += path_[i];\n    }\n\n    identifier[4] = (dylib_cmd.dylib.current_version >> 24) & 0xFF;\n    identifier[5] = (dylib_cmd.dylib.current_version >> 16) & 0xFF;\n    identifier[6] = (dylib_cmd.dylib.current_version >> 8) & 0xFF;\n    identifier[7] = dylib_cmd.dylib.current_version & 0xFF;\n    identifier[8] = (dylib_cmd.dylib.compatibility_version >> 24) & 0xFF;\n    identifier[9] = (dylib_cmd.dylib.compatibility_version >> 16) & 0xFF;\n    identifier[10] = (dylib_cmd.dylib.compatibility_version >> 8) & 0xFF;\n    identifier[11] = dylib_cmd.dylib.compatibility_version & 0xFF;\n    identifier[12] = (cpu_type >> 24) & 0xFF;\n    identifier[13] = (cpu_type >> 16) & 0xFF;\n    identifier[14] = (cpu_type >> 8) & 0xFF;\n    identifier[15] = cpu_type & 0xFF;\n\n    return true;\n  }\n\n  return false;\n}\n\nuint32_t MachoID::Adler32(int cpu_type) {\n  update_function_ = &MachoID::UpdateCRC;\n  crc_ = 0;\n\n  if (!WalkHeader(cpu_type, WalkerCB, this))\n    return 0;\n\n  return crc_;\n}\n\nbool MachoID::MD5(int cpu_type, unsigned char identifier[16]) {\n  update_function_ = &MachoID::UpdateMD5;\n\n  MD5Init(&md5_context_);\n\n  if (!WalkHeader(cpu_type, WalkerCB, this))\n    return false;\n\n  MD5Final(identifier, &md5_context_);\n  return true;\n}\n\nbool MachoID::WalkHeader(int cpu_type,\n                         MachoWalker::LoadCommandCallback callback,\n                         void *context) {\n  if (memory_) {\n    MachoWalker walker(memory_, memory_size_, callback, context);\n    return walker.WalkHeader(cpu_type);\n  } else {\n    MachoWalker walker(path_, callback, context);\n    return walker.WalkHeader(cpu_type);\n  }\n}\n\n// static\nbool MachoID::WalkerCB(MachoWalker *walker, load_command *cmd, off_t offset,\n                       bool swap, void *context) {\n  MachoID *macho_id = (MachoID *)context;\n\n  if (cmd->cmd == LC_SEGMENT) {\n    struct segment_command seg;\n\n    if (!walker->ReadBytes(&seg, sizeof(seg), offset))\n      return false;\n\n    if (swap)\n      swap_segment_command(&seg, NXHostByteOrder());\n\n    struct mach_header_64 header;\n    off_t header_offset;\n    \n    if (!walker->CurrentHeader(&header, &header_offset))\n      return false;\n        \n    // Process segments that have sections:\n    // (e.g., __TEXT, __DATA, __IMPORT, __OBJC)\n    offset += sizeof(struct segment_command);\n    struct section sec;\n    for (unsigned long i = 0; i < seg.nsects; ++i) {\n      if (!walker->ReadBytes(&sec, sizeof(sec), offset))\n        return false;\n\n      if (swap)\n        swap_section(&sec, 1, NXHostByteOrder());\n\n      // sections of type S_ZEROFILL are \"virtual\" and contain no data\n      // in the file itself\n      if ((sec.flags & SECTION_TYPE) != S_ZEROFILL && sec.offset != 0)\n        macho_id->Update(walker, header_offset + sec.offset, sec.size);\n\n      offset += sizeof(struct section);\n    }\n  } else if (cmd->cmd == LC_SEGMENT_64) {\n    struct segment_command_64 seg64;\n\n    if (!walker->ReadBytes(&seg64, sizeof(seg64), offset))\n      return false;\n\n    if (swap)\n      breakpad_swap_segment_command_64(&seg64, NXHostByteOrder());\n\n    struct mach_header_64 header;\n    off_t header_offset;\n    \n    if (!walker->CurrentHeader(&header, &header_offset))\n      return false;\n    \n    // Process segments that have sections:\n    // (e.g., __TEXT, __DATA, __IMPORT, __OBJC)\n    offset += sizeof(struct segment_command_64);\n    struct section_64 sec64;\n    for (unsigned long i = 0; i < seg64.nsects; ++i) {\n      if (!walker->ReadBytes(&sec64, sizeof(sec64), offset))\n        return false;\n\n      if (swap)\n        breakpad_swap_section_64(&sec64, 1, NXHostByteOrder());\n\n      // sections of type S_ZEROFILL are \"virtual\" and contain no data\n      // in the file itself\n      if ((sec64.flags & SECTION_TYPE) != S_ZEROFILL && sec64.offset != 0)\n        macho_id->Update(walker, \n                         header_offset + sec64.offset, \n                         (size_t)sec64.size);\n\n      offset += sizeof(struct section_64);\n    }\n  }\n\n  // Continue processing\n  return true;\n}\n\n// static\nbool MachoID::UUIDWalkerCB(MachoWalker *walker, load_command *cmd, off_t offset,\n                           bool swap, void *context) {\n  if (cmd->cmd == LC_UUID) {\n    struct breakpad_uuid_command *uuid_cmd =\n      (struct breakpad_uuid_command *)context;\n\n    if (!walker->ReadBytes(uuid_cmd, sizeof(struct breakpad_uuid_command),\n                           offset))\n      return false;\n\n    if (swap)\n      breakpad_swap_uuid_command(uuid_cmd, NXHostByteOrder());\n\n    return false;\n  }\n\n  // Continue processing\n  return true;\n}\n\n// static\nbool MachoID::IDWalkerCB(MachoWalker *walker, load_command *cmd, off_t offset,\n                         bool swap, void *context) {\n  if (cmd->cmd == LC_ID_DYLIB) {\n    struct dylib_command *dylib_cmd = (struct dylib_command *)context;\n\n    if (!walker->ReadBytes(dylib_cmd, sizeof(struct dylib_command), offset))\n      return false;\n\n    if (swap)\n      swap_dylib_command(dylib_cmd, NXHostByteOrder());\n\n    return false;\n  }\n\n  // Continue processing\n  return true;\n}\n\n}  // namespace MacFileUtilities\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/macho_id.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// macho_id.h: Functions to gather identifying information from a macho file\n//\n// Author: Dan Waylonis\n\n#ifndef COMMON_MAC_MACHO_ID_H__\n#define COMMON_MAC_MACHO_ID_H__\n\n#include <limits.h>\n#include <mach-o/loader.h>\n\n#include \"common/mac/macho_walker.h\"\n#include \"common/md5.h\"\n\nnamespace MacFileUtilities {\n\nclass MachoID {\n public:\n  MachoID(const char *path);\n  MachoID(const char *path, void *memory, size_t size);\n  ~MachoID();\n\n  // For the given |cpu_type|, return a UUID from the LC_UUID command.\n  // Return false if there isn't a LC_UUID command.\n  bool UUIDCommand(int cpu_type, unsigned char identifier[16]);\n\n  // For the given |cpu_type|, return a UUID from the LC_ID_DYLIB command.\n  // Return false if there isn't a LC_ID_DYLIB command.\n  bool IDCommand(int cpu_type, unsigned char identifier[16]);\n\n  // For the given |cpu_type|, return the Adler32 CRC for the mach-o data\n  // segment(s).\n  // Return 0 on error (e.g., if the file is not a mach-o file)\n  uint32_t Adler32(int cpu_type);\n\n  // For the given |cpu_type|, return the MD5 for the mach-o data segment(s).\n  // Return true on success, false otherwise\n  bool MD5(int cpu_type, unsigned char identifier[16]);\n\n private:\n  // Signature of class member function to be called with data read from file\n  typedef void (MachoID::*UpdateFunction)(unsigned char *bytes, size_t size);\n\n  // Update the CRC value by examining |size| |bytes| and applying the algorithm\n  // to each byte.\n  void UpdateCRC(unsigned char *bytes, size_t size);\n\n  // Update the MD5 value by examining |size| |bytes| and applying the algorithm\n  // to each byte.\n  void UpdateMD5(unsigned char *bytes, size_t size);\n\n  // Bottleneck for update routines\n  void Update(MachoWalker *walker, off_t offset, size_t size);\n\n  // Factory for the MachoWalker\n  bool WalkHeader(int cpu_type, MachoWalker::LoadCommandCallback callback,\n                  void *context);\n\n  // The callback from the MachoWalker for CRC and MD5\n  static bool WalkerCB(MachoWalker *walker, load_command *cmd, off_t offset,\n                       bool swap, void *context);\n\n  // The callback from the MachoWalker for LC_UUID\n  static bool UUIDWalkerCB(MachoWalker *walker, load_command *cmd, off_t offset,\n                           bool swap, void *context);\n\n  // The callback from the MachoWalker for LC_ID_DYLIB\n  static bool IDWalkerCB(MachoWalker *walker, load_command *cmd, off_t offset,\n                         bool swap, void *context);\n\n  // File path\n  char path_[PATH_MAX];\n\n  // Memory region to read from\n  void *memory_;\n\n  // Size of the memory region\n  size_t memory_size_;\n\n  // The current crc value\n  uint32_t crc_;\n\n  // The MD5 context\n  google_breakpad::MD5Context md5_context_;\n\n  // The current update to call from the Update callback\n  UpdateFunction update_function_;\n};\n\n}  // namespace MacFileUtilities\n\n#endif  // COMMON_MAC_MACHO_ID_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/macho_reader.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// macho_reader.cc: Implementation of google_breakpad::Mach_O::FatReader and\n// google_breakpad::Mach_O::Reader. See macho_reader.h for details.\n\n#include \"common/mac/macho_reader.h\"\n\n#include <assert.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n// Unfortunately, CPU_TYPE_ARM is not define for 10.4.\n#if !defined(CPU_TYPE_ARM)\n#define CPU_TYPE_ARM 12\n#endif\n\nnamespace google_breakpad {\nnamespace mach_o {\n\n// If NDEBUG is #defined, then the 'assert' macro doesn't evaluate its\n// arguments, so you can't place expressions that do necessary work in\n// the argument of an assert. Nor can you assign the result of the\n// expression to a variable and assert that the variable's value is\n// true: you'll get unused variable warnings when NDEBUG is #defined.\n//\n// ASSERT_ALWAYS_EVAL always evaluates its argument, and asserts that\n// the result is true if NDEBUG is not #defined.\n#if defined(NDEBUG)\n#define ASSERT_ALWAYS_EVAL(x) (x)\n#else\n#define ASSERT_ALWAYS_EVAL(x) assert(x)\n#endif\n\nvoid FatReader::Reporter::BadHeader() {\n  fprintf(stderr, \"%s: file is neither a fat binary file\"\n          \" nor a Mach-O object file\\n\", filename_.c_str());\n}\n\nvoid FatReader::Reporter::TooShort() {\n  fprintf(stderr, \"%s: file too short for the data it claims to contain\\n\",\n          filename_.c_str());\n}\n\nvoid FatReader::Reporter::MisplacedObjectFile() {\n  fprintf(stderr, \"%s: file too short for the object files it claims\"\n          \" to contain\\n\", filename_.c_str());\n}\n\nbool FatReader::Read(const uint8_t *buffer, size_t size) {\n  buffer_.start = buffer;\n  buffer_.end = buffer + size;\n  ByteCursor cursor(&buffer_);\n\n  // Fat binaries always use big-endian, so read the magic number in\n  // that endianness. To recognize Mach-O magic numbers, which can use\n  // either endianness, check for both the proper and reversed forms\n  // of the magic numbers.\n  cursor.set_big_endian(true);\n  if (cursor >> magic_) {\n    if (magic_ == FAT_MAGIC) {\n      // How many object files does this fat binary contain?\n      uint32_t object_files_count;\n      if (!(cursor >> object_files_count)) {  // nfat_arch\n        reporter_->TooShort();\n        return false;\n      }\n\n      // Read the list of object files.\n      object_files_.resize(object_files_count);\n      for (size_t i = 0; i < object_files_count; i++) {\n        struct fat_arch *objfile = &object_files_[i];\n\n        // Read this object file entry, byte-swapping as appropriate.\n        cursor >> objfile->cputype\n               >> objfile->cpusubtype\n               >> objfile->offset\n               >> objfile->size\n               >> objfile->align;\n        if (!cursor) {\n          reporter_->TooShort();\n          return false;\n        }\n        // Does the file actually have the bytes this entry refers to?\n        size_t fat_size = buffer_.Size();\n        if (objfile->offset > fat_size ||\n            objfile->size > fat_size - objfile->offset) {\n          reporter_->MisplacedObjectFile();\n          return false;\n        }\n      }\n\n      return true;\n    } else if (magic_ == MH_MAGIC || magic_ == MH_MAGIC_64 ||\n               magic_ == MH_CIGAM || magic_ == MH_CIGAM_64) {\n      // If this is a little-endian Mach-O file, fix the cursor's endianness.\n      if (magic_ == MH_CIGAM || magic_ == MH_CIGAM_64)\n        cursor.set_big_endian(false);\n      // Record the entire file as a single entry in the object file list.\n      object_files_.resize(1);\n\n      // Get the cpu type and subtype from the Mach-O header.\n      if (!(cursor >> object_files_[0].cputype\n                   >> object_files_[0].cpusubtype)) {\n        reporter_->TooShort();\n        return false;\n      }\n\n      object_files_[0].offset = 0;\n      object_files_[0].size = static_cast<uint32_t>(buffer_.Size());\n      // This alignment is correct for 32 and 64-bit x86 and ppc.\n      // See get_align in the lipo source for other architectures:\n      // http://www.opensource.apple.com/source/cctools/cctools-773/misc/lipo.c\n      object_files_[0].align = 12;  // 2^12 == 4096\n      \n      return true;\n    }\n  }\n  \n  reporter_->BadHeader();\n  return false;\n}\n\nvoid Reader::Reporter::BadHeader() {\n  fprintf(stderr, \"%s: file is not a Mach-O object file\\n\", filename_.c_str());\n}\n\nvoid Reader::Reporter::CPUTypeMismatch(cpu_type_t cpu_type,\n                                       cpu_subtype_t cpu_subtype,\n                                       cpu_type_t expected_cpu_type,\n                                       cpu_subtype_t expected_cpu_subtype) {\n  fprintf(stderr, \"%s: CPU type %d, subtype %d does not match expected\"\n          \" type %d, subtype %d\\n\",\n          filename_.c_str(), cpu_type, cpu_subtype,\n          expected_cpu_type, expected_cpu_subtype);\n}\n\nvoid Reader::Reporter::HeaderTruncated() {\n  fprintf(stderr, \"%s: file does not contain a complete Mach-O header\\n\",\n          filename_.c_str());\n}\n\nvoid Reader::Reporter::LoadCommandRegionTruncated() {\n  fprintf(stderr, \"%s: file too short to hold load command region\"\n          \" given in Mach-O header\\n\", filename_.c_str());\n}\n\nvoid Reader::Reporter::LoadCommandsOverrun(size_t claimed, size_t i,\n                                           LoadCommandType type) {\n  fprintf(stderr, \"%s: file's header claims there are %ld\"\n          \" load commands, but load command #%ld\",\n          filename_.c_str(), claimed, i);\n  if (type) fprintf(stderr, \", of type %d,\", type);\n  fprintf(stderr, \" extends beyond the end of the load command region\\n\");\n}\n\nvoid Reader::Reporter::LoadCommandTooShort(size_t i, LoadCommandType type) {\n  fprintf(stderr, \"%s: the contents of load command #%ld, of type %d,\"\n          \" extend beyond the size given in the load command's header\\n\",\n          filename_.c_str(), i, type);\n}\n\nvoid Reader::Reporter::SectionsMissing(const string &name) {\n  fprintf(stderr, \"%s: the load command for segment '%s'\"\n          \" is too short to hold the section headers it claims to have\\n\",\n          filename_.c_str(), name.c_str());\n}\n\nvoid Reader::Reporter::MisplacedSegmentData(const string &name) {\n  fprintf(stderr, \"%s: the segment '%s' claims its contents lie beyond\"\n          \" the end of the file\\n\", filename_.c_str(), name.c_str());\n}\n\nvoid Reader::Reporter::MisplacedSectionData(const string &section,\n                                            const string &segment) {\n  fprintf(stderr, \"%s: the section '%s' in segment '%s'\"\n          \" claims its contents lie outside the segment's contents\\n\",\n          filename_.c_str(), section.c_str(), segment.c_str());\n}\n\nvoid Reader::Reporter::MisplacedSymbolTable() {\n  fprintf(stderr, \"%s: the LC_SYMTAB load command claims that the symbol\"\n          \" table's contents are located beyond the end of the file\\n\",\n          filename_.c_str());\n}\n\nvoid Reader::Reporter::UnsupportedCPUType(cpu_type_t cpu_type) {\n  fprintf(stderr, \"%s: CPU type %d is not supported\\n\",\n          filename_.c_str(), cpu_type);\n}\n\nbool Reader::Read(const uint8_t *buffer,\n                  size_t size,\n                  cpu_type_t expected_cpu_type,\n                  cpu_subtype_t expected_cpu_subtype) {\n  assert(!buffer_.start);\n  buffer_.start = buffer;\n  buffer_.end = buffer + size;\n  ByteCursor cursor(&buffer_, true);\n  uint32_t magic;\n  if (!(cursor >> magic)) {\n    reporter_->HeaderTruncated();\n    return false;\n  }\n\n  if (expected_cpu_type != CPU_TYPE_ANY) {\n    uint32_t expected_magic;\n    // validate that magic matches the expected cpu type\n    switch (expected_cpu_type) {\n      case CPU_TYPE_ARM:\n      case CPU_TYPE_I386:\n        expected_magic = MH_CIGAM;\n        break;\n      case CPU_TYPE_POWERPC:\n        expected_magic = MH_MAGIC;\n        break;\n      case CPU_TYPE_X86_64:\n        expected_magic = MH_CIGAM_64;\n        break;\n      case CPU_TYPE_POWERPC64:\n        expected_magic = MH_MAGIC_64;\n        break;\n      default:\n        reporter_->UnsupportedCPUType(expected_cpu_type);\n        return false;\n    }\n\n    if (expected_magic != magic) {\n      reporter_->BadHeader();\n      return false;\n    }\n  }\n\n  // Since the byte cursor is in big-endian mode, a reversed magic number\n  // always indicates a little-endian file, regardless of our own endianness.\n  switch (magic) {\n    case MH_MAGIC:    big_endian_ = true;  bits_64_ = false; break;\n    case MH_CIGAM:    big_endian_ = false; bits_64_ = false; break;\n    case MH_MAGIC_64: big_endian_ = true;  bits_64_ = true;  break;\n    case MH_CIGAM_64: big_endian_ = false; bits_64_ = true;  break;\n    default:\n      reporter_->BadHeader();\n      return false;\n  }\n  cursor.set_big_endian(big_endian_);\n  uint32_t commands_size, reserved;\n  cursor >> cpu_type_ >> cpu_subtype_ >> file_type_ >> load_command_count_\n         >> commands_size >> flags_;\n  if (bits_64_)\n    cursor >> reserved;\n  if (!cursor) {\n    reporter_->HeaderTruncated();\n    return false;\n  }\n\n  if (expected_cpu_type != CPU_TYPE_ANY &&\n      (expected_cpu_type != cpu_type_ ||\n       expected_cpu_subtype != cpu_subtype_)) {\n    reporter_->CPUTypeMismatch(cpu_type_, cpu_subtype_,\n                              expected_cpu_type, expected_cpu_subtype);\n    return false;\n  }\n\n  cursor\n      .PointTo(&load_commands_.start, commands_size)\n      .PointTo(&load_commands_.end, 0);\n  if (!cursor) {\n    reporter_->LoadCommandRegionTruncated();\n    return false;\n  }\n\n  return true;\n}\n\nbool Reader::WalkLoadCommands(Reader::LoadCommandHandler *handler) const {\n  ByteCursor list_cursor(&load_commands_, big_endian_);\n\n  for (size_t index = 0; index < load_command_count_; ++index) {\n    // command refers to this load command alone, so that cursor will\n    // refuse to read past the load command's end. But since we haven't\n    // read the size yet, let command initially refer to the entire\n    // remainder of the load command series.\n    ByteBuffer command(list_cursor.here(), list_cursor.Available());\n    ByteCursor cursor(&command, big_endian_);\n    \n    // Read the command type and size --- fields common to all commands.\n    uint32_t type, size;\n    if (!(cursor >> type)) {\n      reporter_->LoadCommandsOverrun(load_command_count_, index, 0);\n      return false;\n    }\n    if (!(cursor >> size) || size > command.Size()) {\n      reporter_->LoadCommandsOverrun(load_command_count_, index, type);\n      return false;\n    }\n\n    // Now that we've read the length, restrict command's range to this\n    // load command only.\n    command.end = command.start + size;\n\n    switch (type) {\n      case LC_SEGMENT:\n      case LC_SEGMENT_64: {\n        Segment segment;\n        segment.bits_64 = (type == LC_SEGMENT_64);\n        size_t word_size = segment.bits_64 ? 8 : 4;\n        cursor.CString(&segment.name, 16);\n        size_t file_offset, file_size;\n        cursor\n            .Read(word_size, false, &segment.vmaddr)\n            .Read(word_size, false, &segment.vmsize)\n            .Read(word_size, false, &file_offset)\n            .Read(word_size, false, &file_size);\n        cursor >> segment.maxprot\n               >> segment.initprot\n               >> segment.nsects\n               >> segment.flags;\n        if (!cursor) {\n          reporter_->LoadCommandTooShort(index, type);\n          return false;\n        }\n        if (file_offset > buffer_.Size() ||\n            file_size > buffer_.Size() - file_offset) {\n          reporter_->MisplacedSegmentData(segment.name);\n          return false;\n        }\n        // Mach-O files in .dSYM bundles have the contents of the loaded\n        // segments removed, and their file offsets and file sizes zeroed\n        // out. To help us handle this special case properly, give such\n        // segments' contents NULL starting and ending pointers.\n        if (file_offset == 0 && file_size == 0) {\n          segment.contents.start = segment.contents.end = NULL;\n        } else {\n          segment.contents.start = buffer_.start + file_offset;\n          segment.contents.end = segment.contents.start + file_size;\n        }\n        // The section list occupies the remainder of this load command's space.\n        segment.section_list.start = cursor.here();\n        segment.section_list.end = command.end;\n\n        if (!handler->SegmentCommand(segment))\n          return false;\n        break;\n      }\n\n      case LC_SYMTAB: {\n        uint32_t symoff, nsyms, stroff, strsize;\n        cursor >> symoff >> nsyms >> stroff >> strsize;\n        if (!cursor) {\n          reporter_->LoadCommandTooShort(index, type);\n          return false;\n        }\n        // How big are the entries in the symbol table?\n        // sizeof(struct nlist_64) : sizeof(struct nlist),\n        // but be paranoid about alignment vs. target architecture.\n        size_t symbol_size = bits_64_ ? 16 : 12;\n        // How big is the entire symbol array?\n        size_t symbols_size = nsyms * symbol_size;\n        if (symoff > buffer_.Size() || symbols_size > buffer_.Size() - symoff ||\n            stroff > buffer_.Size() || strsize > buffer_.Size() - stroff) {\n          reporter_->MisplacedSymbolTable();\n          return false;\n        }\n        ByteBuffer entries(buffer_.start + symoff, symbols_size);\n        ByteBuffer names(buffer_.start + stroff, strsize);\n        if (!handler->SymtabCommand(entries, names))\n          return false;\n        break;\n      }\n      \n      default: {\n        if (!handler->UnknownCommand(type, command))\n          return false;\n        break;\n      }\n    }\n\n    list_cursor.set_here(command.end);\n  }\n\n  return true;\n}\n\n// A load command handler that looks for a segment of a given name.\nclass Reader::SegmentFinder : public LoadCommandHandler {\n public:\n  // Create a load command handler that looks for a segment named NAME,\n  // and sets SEGMENT to describe it if found.\n  SegmentFinder(const string &name, Segment *segment) \n      : name_(name), segment_(segment), found_() { }\n\n  // Return true if the traversal found the segment, false otherwise.\n  bool found() const { return found_; }\n\n  bool SegmentCommand(const Segment &segment) {\n    if (segment.name == name_) {\n      *segment_ = segment;\n      found_ = true;\n      return false;\n    }\n    return true;\n  }\n\n private:\n  // The name of the segment our creator is looking for.\n  const string &name_;\n\n  // Where we should store the segment if found. (WEAK)\n  Segment *segment_;\n\n  // True if we found the segment.\n  bool found_;\n};\n\nbool Reader::FindSegment(const string &name, Segment *segment) const {\n  SegmentFinder finder(name, segment);\n  WalkLoadCommands(&finder);\n  return finder.found();\n}\n\nbool Reader::WalkSegmentSections(const Segment &segment,\n                                 SectionHandler *handler) const {\n  size_t word_size = segment.bits_64 ? 8 : 4;\n  ByteCursor cursor(&segment.section_list, big_endian_);\n\n  for (size_t i = 0; i < segment.nsects; i++) {\n    Section section;\n    section.bits_64 = segment.bits_64;\n    uint64_t size;\n    uint32_t offset, dummy32;\n    cursor\n        .CString(&section.section_name, 16)\n        .CString(&section.segment_name, 16)\n        .Read(word_size, false, &section.address)\n        .Read(word_size, false, &size)\n        >> offset\n        >> section.align\n        >> dummy32\n        >> dummy32\n        >> section.flags\n        >> dummy32\n        >> dummy32;\n    if (section.bits_64)\n      cursor >> dummy32;\n    if (!cursor) {\n      reporter_->SectionsMissing(segment.name);\n      return false;\n    }\n    if ((section.flags & SECTION_TYPE) == S_ZEROFILL) {\n      // Zero-fill sections have a size, but no contents.\n      section.contents.start = section.contents.end = NULL;\n    } else if (segment.contents.start == NULL && \n               segment.contents.end == NULL) {\n      // Mach-O files in .dSYM bundles have the contents of the loaded\n      // segments removed, and their file offsets and file sizes zeroed\n      // out.  However, the sections within those segments still have\n      // non-zero sizes.  There's no reason to call MisplacedSectionData in\n      // this case; the caller may just need the section's load\n      // address. But do set the contents' limits to NULL, for safety.\n      section.contents.start = section.contents.end = NULL;\n    } else {\n      if (offset < size_t(segment.contents.start - buffer_.start) ||\n          offset > size_t(segment.contents.end - buffer_.start) ||\n          size > size_t(segment.contents.end - buffer_.start - offset)) {\n        reporter_->MisplacedSectionData(section.section_name,\n                                        section.segment_name);\n        return false;\n      }\n      section.contents.start = buffer_.start + offset;\n      section.contents.end = section.contents.start + size;\n    }\n    if (!handler->HandleSection(section))\n      return false;\n  }\n  return true;\n}\n\n// A SectionHandler that builds a SectionMap for the sections within a\n// given segment.\nclass Reader::SectionMapper: public SectionHandler {\n public:\n  // Create a SectionHandler that populates MAP with an entry for\n  // each section it is given.\n  SectionMapper(SectionMap *map) : map_(map) { }\n  bool HandleSection(const Section &section) {\n    (*map_)[section.section_name] = section;\n    return true;\n  }\n private:\n  // The map under construction. (WEAK)\n  SectionMap *map_;\n};\n\nbool Reader::MapSegmentSections(const Segment &segment,\n                                SectionMap *section_map) const {\n  section_map->clear();\n  SectionMapper mapper(section_map);\n  return WalkSegmentSections(segment, &mapper);\n}\n\n}  // namespace mach_o\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/macho_reader.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// macho_reader.h: A class for parsing Mach-O files.\n\n#ifndef BREAKPAD_COMMON_MAC_MACHO_READER_H_\n#define BREAKPAD_COMMON_MAC_MACHO_READER_H_\n\n#include <mach-o/loader.h>\n#include <mach-o/fat.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <unistd.h>\n\n#include <map>\n#include <string>\n#include <vector>\n\n#include \"common/byte_cursor.h\"\n\nnamespace google_breakpad {\nnamespace mach_o {\n\nusing std::map;\nusing std::string;\nusing std::vector;\n\n// The Mac headers don't specify particular types for these groups of\n// constants, but defining them here provides some documentation\n// value.  We also give them the same width as the fields in which\n// they appear, which makes them a bit easier to use with ByteCursors.\ntypedef uint32_t Magic;\ntypedef uint32_t FileType;\ntypedef uint32_t FileFlags;\ntypedef uint32_t LoadCommandType;\ntypedef uint32_t SegmentFlags;\ntypedef uint32_t SectionFlags;\n\n// A parser for fat binary files, used to store universal binaries.\n// When applied to a (non-fat) Mach-O file, this behaves as if the\n// file were a fat file containing a single object file.\nclass FatReader {\n public:\n\n  // A class for reporting errors found while parsing fat binary files. The\n  // default definitions of these methods print messages to stderr.\n  class Reporter {\n   public:\n    // Create a reporter that attributes problems to |filename|.\n    explicit Reporter(const string &filename) : filename_(filename) { }\n\n    virtual ~Reporter() { }\n\n    // The data does not begin with a fat binary or Mach-O magic number.\n    // This is a fatal error.\n    virtual void BadHeader();\n\n    // The Mach-O fat binary file ends abruptly, without enough space\n    // to contain an object file it claims is present.\n    virtual void MisplacedObjectFile();\n\n    // The file ends abruptly: either it is not large enough to hold a\n    // complete header, or the header implies that contents are present\n    // beyond the actual end of the file.\n    virtual void TooShort();\n  \n   private:\n    // The filename to which the reader should attribute problems.\n    string filename_;\n  };\n\n  // Create a fat binary file reader that uses |reporter| to report problems.\n  explicit FatReader(Reporter *reporter) : reporter_(reporter) { }\n  \n  // Read the |size| bytes at |buffer| as a fat binary file. On success,\n  // return true; on failure, report the problem to reporter_ and return\n  // false.\n  //\n  // If the data is a plain Mach-O file, rather than a fat binary file,\n  // then the reader behaves as if it had found a fat binary file whose\n  // single object file is the Mach-O file.\n  bool Read(const uint8_t *buffer, size_t size);\n\n  // Return an array of 'struct fat_arch' structures describing the\n  // object files present in this fat binary file. Set |size| to the\n  // number of elements in the array.\n  //\n  // Assuming Read returned true, the entries are validated: it is\n  // safe to assume that the offsets and sizes in each 'struct\n  // fat_arch' refer to subranges of the bytes passed to Read.\n  //\n  // If there are no object files in this fat binary, then this\n  // function can return NULL.\n  //\n  // The array is owned by this FatReader instance; it will be freed when\n  // this FatReader is destroyed.\n  //\n  // This function returns a C-style array instead of a vector to make it\n  // possible to use the result with OS X functions like NXFindBestFatArch,\n  // so that the symbol dumper will behave consistently with other OS X\n  // utilities that work with fat binaries.\n  const struct fat_arch *object_files(size_t *count) const { \n    *count = object_files_.size();\n    if (object_files_.size() > 0)\n      return &object_files_[0];\n    return NULL;\n  }\n\n private:\n  // We use this to report problems parsing the file's contents. (WEAK)\n  Reporter *reporter_;\n\n  // The contents of the fat binary or Mach-O file we're parsing. We do not\n  // own the storage it refers to.\n  ByteBuffer buffer_;\n\n  // The magic number of this binary, in host byte order.\n  Magic magic_;\n\n  // The list of object files in this binary.\n  // object_files_.size() == fat_header.nfat_arch\n  vector<struct fat_arch> object_files_;\n};\n\n// A segment in a Mach-O file. All these fields have been byte-swapped as\n// appropriate for use by the executing architecture.\nstruct Segment {\n  // The ByteBuffers below point into the bytes passed to the Reader that\n  // created this Segment.\n\n  ByteBuffer section_list;    // This segment's section list.\n  ByteBuffer contents;        // This segment's contents.\n\n  // This segment's name.\n  string name;\n\n  // The address at which this segment should be loaded in memory. If\n  // bits_64 is false, only the bottom 32 bits of this value are valid.\n  uint64_t vmaddr;\n\n  // The size of this segment when loaded into memory. This may be larger\n  // than contents.Size(), in which case the extra area will be\n  // initialized with zeros. If bits_64 is false, only the bottom 32 bits\n  // of this value are valid.\n  uint64_t vmsize;\n\n  // The maximum and initial VM protection of this segment's contents.\n  uint32_t maxprot;\n  uint32_t initprot;\n  \n  // The number of sections in section_list.\n  uint32_t nsects;\n\n  // Flags describing this segment, from SegmentFlags.\n  uint32_t flags;\n\n  // True if this is a 64-bit section; false if it is a 32-bit section.\n  bool bits_64;\n};\n\n// A section in a Mach-O file. All these fields have been byte-swapped as\n// appropriate for use by the executing architecture.\nstruct Section {\n  // This section's contents. This points into the bytes passed to the\n  // Reader that created this Section.\n  ByteBuffer contents;\n\n  // This section's name.\n  string section_name;  // section[_64].sectname\n  // The name of the segment this section belongs to.\n  string segment_name;  // section[_64].segname\n\n  // The address at which this section's contents should be loaded in\n  // memory. If bits_64 is false, only the bottom 32 bits of this value\n  // are valid.\n  uint64_t address;\n\n  // The contents of this section should be loaded into memory at an\n  // address which is a multiple of (two raised to this power).\n  uint32_t align;\n\n  // Flags from SectionFlags describing the section's contents.\n  uint32_t flags;\n\n  // We don't support reading relocations yet.\n\n  // True if this is a 64-bit section; false if it is a 32-bit section.\n  bool bits_64;\n};\n\n// A map from section names to Sections.\ntypedef map<string, Section> SectionMap;\n\n// A reader for a Mach-O file.\n//\n// This does not handle fat binaries; see FatReader above. FatReader\n// provides a friendly interface for parsing data that could be either a\n// fat binary or a Mach-O file.\nclass Reader {\n public:\n\n  // A class for reporting errors found while parsing Mach-O files. The\n  // default definitions of these member functions print messages to\n  // stderr.\n  class Reporter {\n   public:\n    // Create a reporter that attributes problems to |filename|.\n    explicit Reporter(const string &filename) : filename_(filename) { }\n    virtual ~Reporter() { }\n\n    // Reporter functions for fatal errors return void; the reader will\n    // definitely return an error to its caller after calling them\n\n    // The data does not begin with a Mach-O magic number, or the magic\n    // number does not match the expected value for the cpu architecture.\n    // This is a fatal error.\n    virtual void BadHeader();\n\n    // The data contained in a Mach-O fat binary (|cpu_type|, |cpu_subtype|)\n    // does not match the expected CPU architecture\n    // (|expected_cpu_type|, |expected_cpu_subtype|).\n    virtual void CPUTypeMismatch(cpu_type_t cpu_type,\n                                 cpu_subtype_t cpu_subtype,\n                                 cpu_type_t expected_cpu_type,\n                                 cpu_subtype_t expected_cpu_subtype);\n\n    // The file ends abruptly: either it is not large enough to hold a\n    // complete header, or the header implies that contents are present\n    // beyond the actual end of the file.\n    virtual void HeaderTruncated();\n\n    // The file's load command region, as given in the Mach-O header, is\n    // too large for the file.\n    virtual void LoadCommandRegionTruncated();\n\n    // The file's Mach-O header claims the file contains |claimed| load\n    // commands, but the I'th load command, of type |type|, extends beyond\n    // the end of the load command region, as given by the Mach-O header.\n    // If |type| is zero, the command's type was unreadable.\n    virtual void LoadCommandsOverrun(size_t claimed, size_t i,\n                                     LoadCommandType type);\n\n    // The contents of the |i|'th load command, of type |type|, extend beyond\n    // the size given in the load command's header.\n    virtual void LoadCommandTooShort(size_t i, LoadCommandType type);\n\n    // The LC_SEGMENT or LC_SEGMENT_64 load command for the segment named\n    // |name| is too short to hold the sections that its header says it does.\n    // (This more specific than LoadCommandTooShort.)\n    virtual void SectionsMissing(const string &name);\n\n    // The segment named |name| claims that its contents lie beyond the end\n    // of the file.\n    virtual void MisplacedSegmentData(const string &name);\n\n    // The section named |section| in the segment named |segment| claims that\n    // its contents do not lie entirely within the segment.\n    virtual void MisplacedSectionData(const string &section,\n                                      const string &segment);\n\n    // The LC_SYMTAB command claims that symbol table contents are located\n    // beyond the end of the file.\n    virtual void MisplacedSymbolTable();\n\n    // An attempt was made to read a Mach-O file of the unsupported\n    // CPU architecture |cpu_type|.\n    virtual void UnsupportedCPUType(cpu_type_t cpu_type);\n\n   private:\n    string filename_;\n  };\n\n  // A handler for sections parsed from a segment. The WalkSegmentSections\n  // member function accepts an instance of this class, and applies it to\n  // each section defined in a given segment.\n  class SectionHandler {\n   public:\n    virtual ~SectionHandler() { }\n\n    // Called to report that the segment's section list contains |section|.\n    // This should return true if the iteration should continue, or false\n    // if it should stop.\n    virtual bool HandleSection(const Section &section) = 0;\n  };\n\n  // A handler for the load commands in a Mach-O file.\n  class LoadCommandHandler {\n   public:\n    LoadCommandHandler() { }\n    virtual ~LoadCommandHandler() { }\n\n    // When called from WalkLoadCommands, the following handler functions\n    // should return true if they wish to continue iterating over the load\n    // command list, or false if they wish to stop iterating.\n    //\n    // When called from LoadCommandIterator::Handle or Reader::Handle,\n    // these functions' return values are simply passed through to Handle's\n    // caller.\n    //\n    // The definitions provided by this base class simply return true; the\n    // default is to silently ignore sections whose member functions the\n    // subclass doesn't override.\n\n    // COMMAND is load command we don't recognize. We provide only the\n    // command type and a ByteBuffer enclosing the command's data (If we\n    // cannot parse the command type or its size, we call\n    // reporter_->IncompleteLoadCommand instead.)\n    virtual bool UnknownCommand(LoadCommandType type,\n                                const ByteBuffer &contents) {\n      return true;\n    }\n\n    // The load command is LC_SEGMENT or LC_SEGMENT_64, defining a segment\n    // with the properties given in |segment|.\n    virtual bool SegmentCommand(const Segment &segment) {\n      return true;\n    }\n\n    // The load command is LC_SYMTAB. |entries| holds the array of nlist\n    // entries, and |names| holds the strings the entries refer to.\n    virtual bool SymtabCommand(const ByteBuffer &entries,\n                               const ByteBuffer &names) {\n      return true;\n    }\n\n    // Add handler functions for more load commands here as needed.\n  };\n\n  // Create a Mach-O file reader that reports problems to |reporter|.\n  explicit Reader(Reporter *reporter)\n      : reporter_(reporter) { }\n\n  // Read the given data as a Mach-O file. The reader retains pointers\n  // into the data passed, so the data should live as long as the reader\n  // does. On success, return true; on failure, return false.\n  //\n  // At most one of these functions should be invoked once on each Reader\n  // instance.\n  bool Read(const uint8_t *buffer,\n            size_t size,\n            cpu_type_t expected_cpu_type,\n            cpu_subtype_t expected_cpu_subtype);\n  bool Read(const ByteBuffer &buffer,\n            cpu_type_t expected_cpu_type,\n            cpu_subtype_t expected_cpu_subtype) {\n    return Read(buffer.start,\n                buffer.Size(),\n                expected_cpu_type,\n                expected_cpu_subtype); \n  }\n\n  // Return this file's characteristics, as found in the Mach-O header.\n  cpu_type_t    cpu_type()    const { return cpu_type_; }\n  cpu_subtype_t cpu_subtype() const { return cpu_subtype_; }\n  FileType      file_type()   const { return file_type_; }\n  FileFlags     flags()       const { return flags_; }\n\n  // Return true if this is a 64-bit Mach-O file, false if it is a 32-bit\n  // Mach-O file.\n  bool bits_64() const { return bits_64_; }\n\n  // Return true if this is a big-endian Mach-O file, false if it is\n  // little-endian.\n  bool big_endian() const { return big_endian_; }\n\n  // Apply |handler| to each load command in this Mach-O file, stopping when\n  // a handler function returns false. If we encounter a malformed load\n  // command, report it via reporter_ and return false. Return true if all\n  // load commands were parseable and all handlers returned true.\n  bool WalkLoadCommands(LoadCommandHandler *handler) const;\n\n  // Set |segment| to describe the segment named |name|, if present. If\n  // found, |segment|'s byte buffers refer to a subregion of the bytes\n  // passed to Read. If we find the section, return true; otherwise,\n  // return false.\n  bool FindSegment(const string &name, Segment *segment) const;\n\n  // Apply |handler| to each section defined in |segment|. If |handler| returns\n  // false, stop iterating and return false. If all calls to |handler| return\n  // true and we reach the end of the section list, return true.\n  bool WalkSegmentSections(const Segment &segment, SectionHandler *handler)\n    const;\n\n  // Clear |section_map| and then populate it with a map of the sections\n  // in |segment|, from section names to Section structures.\n  // Each Section's contents refer to bytes in |segment|'s contents.\n  // On success, return true; if a problem occurs, report it and return false.\n  bool MapSegmentSections(const Segment &segment, SectionMap *section_map)\n    const;\n\n private:\n  // Used internally.\n  class SegmentFinder;\n  class SectionMapper;\n\n  // We use this to report problems parsing the file's contents. (WEAK)\n  Reporter *reporter_;\n\n  // The contents of the Mach-O file we're parsing. We do not own the\n  // storage it refers to.\n  ByteBuffer buffer_;\n\n  // True if this file is big-endian.\n  bool big_endian_;\n\n  // True if this file is a 64-bit Mach-O file.\n  bool bits_64_;\n\n  // This file's cpu type and subtype.\n  cpu_type_t cpu_type_;        // mach_header[_64].cputype\n  cpu_subtype_t cpu_subtype_;  // mach_header[_64].cpusubtype\n\n  // This file's type.\n  FileType file_type_;         // mach_header[_64].filetype\n\n  // The region of buffer_ occupied by load commands.\n  ByteBuffer load_commands_;\n\n  // The number of load commands in load_commands_.\n  uint32_t load_command_count_;  // mach_header[_64].ncmds\n\n  // This file's header flags.\n  FileFlags flags_;\n};\n\n}  // namespace mach_o\n}  // namespace google_breakpad\n\n#endif  // BREAKPAD_COMMON_MAC_MACHO_READER_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/macho_reader_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// macho_reader_unittest.cc: Unit tests for google_breakpad::Mach_O::FatReader\n// and google_breakpad::Mach_O::Reader.\n\n#include <map>\n#include <string>\n#include <vector>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/mac/macho_reader.h\"\n#include \"common/test_assembler.h\"\n\nnamespace mach_o = google_breakpad::mach_o;\nnamespace test_assembler = google_breakpad::test_assembler;\n\nusing mach_o::FatReader;\nusing mach_o::FileFlags;\nusing mach_o::FileType;\nusing mach_o::LoadCommandType;\nusing mach_o::Reader;\nusing mach_o::Section;\nusing mach_o::SectionMap;\nusing mach_o::Segment;\nusing test_assembler::Endianness;\nusing test_assembler::Label;\nusing test_assembler::kBigEndian;\nusing test_assembler::kLittleEndian;\nusing test_assembler::kUnsetEndian;\nusing google_breakpad::ByteBuffer;\nusing std::map;\nusing std::string;\nusing std::vector;\nusing testing::AllOf;\nusing testing::DoAll;\nusing testing::Field;\nusing testing::InSequence;\nusing testing::Matcher;\nusing testing::Return;\nusing testing::SaveArg;\nusing testing::Test;\nusing testing::_;\n\n\f\n// Mock classes for the reader's various reporters and handlers.\n\nclass MockFatReaderReporter: public FatReader::Reporter {\n public:\n  MockFatReaderReporter(const string &filename)\n      : FatReader::Reporter(filename) { }\n  MOCK_METHOD0(BadHeader, void());\n  MOCK_METHOD0(MisplacedObjectFile, void());\n  MOCK_METHOD0(TooShort, void());\n};\n\nclass MockReaderReporter: public Reader::Reporter {\n public:\n  MockReaderReporter(const string &filename) : Reader::Reporter(filename) { }\n  MOCK_METHOD0(BadHeader, void());\n  MOCK_METHOD4(CPUTypeMismatch, void(cpu_type_t cpu_type,\n                                     cpu_subtype_t cpu_subtype,\n                                     cpu_type_t expected_cpu_type,\n                                     cpu_subtype_t expected_cpu_subtype));\n  MOCK_METHOD0(HeaderTruncated, void());\n  MOCK_METHOD0(LoadCommandRegionTruncated, void());\n  MOCK_METHOD3(LoadCommandsOverrun, void(size_t claimed, size_t i,\n                                         LoadCommandType type));\n  MOCK_METHOD2(LoadCommandTooShort, void(size_t i, LoadCommandType type));\n  MOCK_METHOD1(SectionsMissing, void(const string &name));\n  MOCK_METHOD1(MisplacedSegmentData, void(const string &name));\n  MOCK_METHOD2(MisplacedSectionData, void(const string &section,\n                                          const string &segment));\n  MOCK_METHOD0(MisplacedSymbolTable, void());\n  MOCK_METHOD1(UnsupportedCPUType, void(cpu_type_t cpu_type));\n};\n\nclass MockLoadCommandHandler: public Reader::LoadCommandHandler {\n public:\n  MOCK_METHOD2(UnknownCommand, bool(LoadCommandType, const ByteBuffer &));\n  MOCK_METHOD1(SegmentCommand, bool(const Segment &));\n  MOCK_METHOD2(SymtabCommand,  bool(const ByteBuffer &, const ByteBuffer &));\n};\n\nclass MockSectionHandler: public Reader::SectionHandler {\n public:\n  MOCK_METHOD1(HandleSection, bool(const Section &section));\n};\n\n\f\n// Tests for mach_o::FatReader.\n\n// Since the effect of these functions is to write to stderr, the\n// results of these tests must be inspected by hand.\nTEST(FatReaderReporter, BadHeader) {\n  FatReader::Reporter reporter(\"filename\");\n  reporter.BadHeader();\n}\n\nTEST(FatReaderReporter, MisplacedObjectFile) {\n  FatReader::Reporter reporter(\"filename\");\n  reporter.MisplacedObjectFile();\n}\n\nTEST(FatReaderReporter, TooShort) {\n  FatReader::Reporter reporter(\"filename\");\n  reporter.TooShort();\n}\n\nTEST(MachOReaderReporter, BadHeader) {\n  Reader::Reporter reporter(\"filename\");\n  reporter.BadHeader();\n}\n\nTEST(MachOReaderReporter, CPUTypeMismatch) {\n  Reader::Reporter reporter(\"filename\");\n  reporter.CPUTypeMismatch(CPU_TYPE_I386, CPU_SUBTYPE_X86_ALL,\n                           CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_ALL);\n}\n\nTEST(MachOReaderReporter, HeaderTruncated) {\n  Reader::Reporter reporter(\"filename\");\n  reporter.HeaderTruncated();\n}\n\nTEST(MachOReaderReporter, LoadCommandRegionTruncated) {\n  Reader::Reporter reporter(\"filename\");\n  reporter.LoadCommandRegionTruncated();\n}\n\nTEST(MachOReaderReporter, LoadCommandsOverrun) {\n  Reader::Reporter reporter(\"filename\");\n  reporter.LoadCommandsOverrun(10, 9, LC_DYSYMTAB);\n  reporter.LoadCommandsOverrun(10, 9, 0);\n}\n\nTEST(MachOReaderReporter, LoadCommandTooShort) {\n  Reader::Reporter reporter(\"filename\");\n  reporter.LoadCommandTooShort(11, LC_SYMTAB);\n}\n\nTEST(MachOReaderReporter, SectionsMissing) {\n  Reader::Reporter reporter(\"filename\");\n  reporter.SectionsMissing(\"segment name\");\n}\n\nTEST(MachOReaderReporter, MisplacedSegmentData) {\n  Reader::Reporter reporter(\"filename\");\n  reporter.MisplacedSegmentData(\"segment name\");\n}\n\nTEST(MachOReaderReporter, MisplacedSectionData) {\n  Reader::Reporter reporter(\"filename\");\n  reporter.MisplacedSectionData(\"section name\", \"segment name\");\n}\n\nTEST(MachOReaderReporter, MisplacedSymbolTable) {\n  Reader::Reporter reporter(\"filename\");\n  reporter.MisplacedSymbolTable();\n}\n\nTEST(MachOReaderReporter, UnsupportedCPUType) {\n  Reader::Reporter reporter(\"filename\");\n  reporter.UnsupportedCPUType(CPU_TYPE_HPPA);\n}\n\nstruct FatReaderFixture {\n  FatReaderFixture()\n      : fat(kBigEndian),\n        reporter(\"reporter filename\"),\n        reader(&reporter), object_files(), object_files_size() { \n    EXPECT_CALL(reporter, BadHeader()).Times(0);\n    EXPECT_CALL(reporter, TooShort()).Times(0);\n\n    // here, start, and Mark are file offsets in 'fat'.\n    fat.start() = 0;\n  }\n  // Append a 'fat_arch' entry to 'fat', with the given field values.\n  void AppendFatArch(cpu_type_t type, cpu_subtype_t subtype,\n                     Label offset, Label size, uint32_t align) {\n    fat\n        .B32(type)\n        .B32(subtype)\n        .B32(offset)\n        .B32(size)\n        .B32(align);\n  }\n  // Append |n| dummy 'fat_arch' entries to 'fat'. The cpu type and\n  // subtype have unrealistic values.\n  void AppendDummyArchEntries(int n) {\n    for (int i = 0; i < n; i++)\n      AppendFatArch(0xb68ad617, 0x715a0840, 0, 0, 1);\n  }\n  void ReadFat(bool expect_parse_success = true) {\n    ASSERT_TRUE(fat.GetContents(&contents));\n    fat_bytes = reinterpret_cast<const uint8_t *>(contents.data());\n    if (expect_parse_success) {\n      EXPECT_TRUE(reader.Read(fat_bytes, contents.size()));\n      object_files = reader.object_files(&object_files_size);\n    }\n    else\n      EXPECT_FALSE(reader.Read(fat_bytes, contents.size()));\n  }\n  test_assembler::Section fat;\n  MockFatReaderReporter reporter;\n  FatReader reader;\n  string contents;\n  const uint8_t *fat_bytes;\n  const struct fat_arch *object_files;\n  size_t object_files_size;\n};\n\nclass FatReaderTest: public FatReaderFixture, public Test { };\n\nTEST_F(FatReaderTest, BadMagic) {\n  EXPECT_CALL(reporter, BadHeader()).Times(1);\n  fat\n      .B32(0xcafed00d)           // magic number (incorrect)\n      .B32(10);                  // number of architectures\n  AppendDummyArchEntries(10);\n  ReadFat(false);\n}\n\nTEST_F(FatReaderTest, HeaderTooShort) {\n  EXPECT_CALL(reporter, TooShort()).Times(1);\n  fat\n      .B32(0xcafebabe);             // magic number\n  ReadFat(false);\n}\n\nTEST_F(FatReaderTest, ObjectListTooShort) {\n  EXPECT_CALL(reporter, TooShort()).Times(1);\n  fat\n      .B32(0xcafebabe)              // magic number\n      .B32(10);                     // number of architectures\n  AppendDummyArchEntries(9);        // nine dummy architecture entries...\n  fat                               // and a tenth, missing a byte at the end\n      .B32(0x3d46c8fc)              // cpu type\n      .B32(0x8a7bfb01)              // cpu subtype\n      .B32(0)                       // offset\n      .B32(0)                       // size\n      .Append(3, '*');              // one byte short of a four-byte alignment\n  ReadFat(false);\n}\n\nTEST_F(FatReaderTest, DataTooShort) {\n  EXPECT_CALL(reporter, MisplacedObjectFile()).Times(1);\n  Label arch_data;\n  fat\n      .B32(0xcafebabe)              // magic number\n      .B32(1);                      // number of architectures\n  AppendFatArch(0xb4d4a366, 0x4ba4f525, arch_data, 40, 0);\n  fat\n      .Mark(&arch_data)             // file data begins here\n      .Append(30, '*');             // only 30 bytes, not 40 as header claims\n  ReadFat(false);\n}\n\nTEST_F(FatReaderTest, NoObjectFiles) {\n  fat\n      .B32(0xcafebabe)              // magic number\n      .B32(0);                      // number of architectures\n  ReadFat();\n  EXPECT_EQ(0U, object_files_size);\n}\n\nTEST_F(FatReaderTest, OneObjectFile) {\n  Label obj1_offset;\n  fat\n      .B32(0xcafebabe)              // magic number\n      .B32(1);                      // number of architectures\n  // First object file list entry\n  AppendFatArch(0x5e3a6e91, 0x52ccd852, obj1_offset, 0x42, 0x355b15b2);\n  // First object file data\n  fat\n      .Mark(&obj1_offset)           \n      .Append(0x42, '*');           // dummy contents\n  ReadFat();\n  ASSERT_EQ(1U, object_files_size);\n  EXPECT_EQ(0x5e3a6e91, object_files[0].cputype);\n  EXPECT_EQ(0x52ccd852, object_files[0].cpusubtype);\n  EXPECT_EQ(obj1_offset.Value(), object_files[0].offset);\n  EXPECT_EQ(0x42U, object_files[0].size);\n  EXPECT_EQ(0x355b15b2U, object_files[0].align);\n}\n\nTEST_F(FatReaderTest, ThreeObjectFiles) {\n  Label obj1, obj2, obj3;\n  fat\n      .B32(0xcafebabe)              // magic number\n      .B32(3);                      // number of architectures\n  // Three object file list entries.\n  AppendFatArch(0x0cb92c30, 0x6a159a71, obj1, 0xfb4, 0x2615dbe8);\n  AppendFatArch(0x0f3f1cbb, 0x6c55e90f, obj2, 0xc31, 0x83af6ffd);\n  AppendFatArch(0x3717276d, 0x10ecdc84, obj3, 0x4b3, 0x035267d7);\n  fat\n      // First object file data\n      .Mark(&obj1)           \n      .Append(0xfb4, '*')           // dummy contents\n      // Second object file data\n      .Mark(&obj2)           \n      .Append(0xc31, '%')           // dummy contents\n      // Third object file data\n      .Mark(&obj3)           \n      .Append(0x4b3, '^');          // dummy contents\n  \n  ReadFat();\n\n  ASSERT_EQ(3U, object_files_size);\n\n  // First object file.\n  EXPECT_EQ(0x0cb92c30, object_files[0].cputype);\n  EXPECT_EQ(0x6a159a71, object_files[0].cpusubtype);\n  EXPECT_EQ(obj1.Value(), object_files[0].offset);\n  EXPECT_EQ(0xfb4U, object_files[0].size);\n  EXPECT_EQ(0x2615dbe8U, object_files[0].align);\n\n  // Second object file.\n  EXPECT_EQ(0x0f3f1cbb, object_files[1].cputype);\n  EXPECT_EQ(0x6c55e90f, object_files[1].cpusubtype);\n  EXPECT_EQ(obj2.Value(), object_files[1].offset);\n  EXPECT_EQ(0xc31U, object_files[1].size);\n  EXPECT_EQ(0x83af6ffdU, object_files[1].align);\n\n  // Third object file.\n  EXPECT_EQ(0x3717276d, object_files[2].cputype);\n  EXPECT_EQ(0x10ecdc84, object_files[2].cpusubtype);\n  EXPECT_EQ(obj3.Value(), object_files[2].offset);\n  EXPECT_EQ(0x4b3U, object_files[2].size);\n  EXPECT_EQ(0x035267d7U, object_files[2].align);\n}\n\nTEST_F(FatReaderTest, BigEndianMachO32) {\n  fat.set_endianness(kBigEndian);\n  fat\n      .D32(0xfeedface)                  // Mach-O file magic number\n      .D32(0x1a9d0518)                  // cpu type\n      .D32(0x1b779357)                  // cpu subtype\n      .D32(0x009df67e)                  // file type\n      .D32(0)                           // no load commands\n      .D32(0)                           // the load commands occupy no bytes\n      .D32(0x21987a99);                 // flags\n\n  ReadFat();\n\n  // FatReader should treat a Mach-O file as if it were a fat binary file\n  // containing one object file --- the whole thing.\n  ASSERT_EQ(1U, object_files_size);\n  EXPECT_EQ(0x1a9d0518, object_files[0].cputype);\n  EXPECT_EQ(0x1b779357, object_files[0].cpusubtype);\n  EXPECT_EQ(0U, object_files[0].offset);\n  EXPECT_EQ(contents.size(), object_files[0].size);\n}\n\nTEST_F(FatReaderTest, BigEndianMachO64) {\n  fat.set_endianness(kBigEndian);\n  fat\n      .D32(0xfeedfacf)                  // Mach-O 64-bit file magic number\n      .D32(0x5aff8487)                  // cpu type\n      .D32(0x4c6a57f7)                  // cpu subtype\n      .D32(0x4392d2c8)                  // file type\n      .D32(0)                           // no load commands\n      .D32(0)                           // the load commands occupy no bytes\n      .D32(0x1b033eea);                 // flags\n\n  ReadFat();\n\n  // FatReader should treat a Mach-O file as if it were a fat binary file\n  // containing one object file --- the whole thing.\n  ASSERT_EQ(1U, object_files_size);\n  EXPECT_EQ(0x5aff8487, object_files[0].cputype);\n  EXPECT_EQ(0x4c6a57f7, object_files[0].cpusubtype);\n  EXPECT_EQ(0U, object_files[0].offset);\n  EXPECT_EQ(contents.size(), object_files[0].size);\n}\n\nTEST_F(FatReaderTest, LittleEndianMachO32) {\n  fat.set_endianness(kLittleEndian);\n  fat\n      .D32(0xfeedface)                  // Mach-O file magic number\n      .D32(0x1a9d0518)                  // cpu type\n      .D32(0x1b779357)                  // cpu subtype\n      .D32(0x009df67e)                  // file type\n      .D32(0)                           // no load commands\n      .D32(0)                           // the load commands occupy no bytes\n      .D32(0x21987a99);                 // flags\n\n  ReadFat();\n\n  // FatReader should treat a Mach-O file as if it were a fat binary file\n  // containing one object file --- the whole thing.\n  ASSERT_EQ(1U, object_files_size);\n  EXPECT_EQ(0x1a9d0518, object_files[0].cputype);\n  EXPECT_EQ(0x1b779357, object_files[0].cpusubtype);\n  EXPECT_EQ(0U, object_files[0].offset);\n  EXPECT_EQ(contents.size(), object_files[0].size);\n}\n\nTEST_F(FatReaderTest, LittleEndianMachO64) {\n  fat.set_endianness(kLittleEndian);\n  fat\n      .D32(0xfeedfacf)                  // Mach-O 64-bit file magic number\n      .D32(0x5aff8487)                  // cpu type\n      .D32(0x4c6a57f7)                  // cpu subtype\n      .D32(0x4392d2c8)                  // file type\n      .D32(0)                           // no load commands\n      .D32(0)                           // the load commands occupy no bytes\n      .D32(0x1b033eea);                 // flags\n\n  ReadFat();\n\n  // FatReader should treat a Mach-O file as if it were a fat binary file\n  // containing one object file --- the whole thing.\n  ASSERT_EQ(1U, object_files_size);\n  EXPECT_EQ(0x5aff8487, object_files[0].cputype);\n  EXPECT_EQ(0x4c6a57f7, object_files[0].cpusubtype);\n  EXPECT_EQ(0U, object_files[0].offset);\n  EXPECT_EQ(contents.size(), object_files[0].size);\n}\n\nTEST_F(FatReaderTest, IncompleteMach) {\n  fat.set_endianness(kLittleEndian);\n  fat\n      .D32(0xfeedfacf)                  // Mach-O 64-bit file magic number\n      .D32(0x5aff8487);                 // cpu type\n      // Truncated!\n\n  EXPECT_CALL(reporter, TooShort()).WillOnce(Return());\n\n  ReadFat(false);\n}\n\n\f\n// General mach_o::Reader tests.\n\n// Dynamically scoped configuration data.\nclass WithConfiguration {\n public:\n  // Establish the given parameters as the default for SizedSections\n  // created within the dynamic scope of this instance.\n  WithConfiguration(Endianness endianness, size_t word_size)\n      : endianness_(endianness), word_size_(word_size), saved_(current_) {\n    current_ = this;\n  }\n  ~WithConfiguration() { current_ = saved_; }\n  static Endianness endianness() { \n    assert(current_);\n    return current_->endianness_;\n  }\n  static size_t word_size() { \n    assert(current_);\n    return current_->word_size_;\n  }\n\n private:\n  // The innermost WithConfiguration in whose dynamic scope we are\n  // currently executing.\n  static WithConfiguration *current_;\n\n  // The innermost WithConfiguration whose dynamic scope encloses this\n  // WithConfiguration.\n  Endianness endianness_;\n  size_t word_size_;\n  WithConfiguration *saved_;\n};\n\nWithConfiguration *WithConfiguration::current_ = NULL;\n\n// A test_assembler::Section with a size that we can cite. The start(),\n// Here() and Mark() member functions of a SizedSection always represent\n// offsets within the overall file.\nclass SizedSection: public test_assembler::Section {\n public:\n  // Construct a section of the given endianness and word size.\n  explicit SizedSection(Endianness endianness, size_t word_size)\n      : test_assembler::Section(endianness), word_size_(word_size) {\n    assert(word_size_ == 32 || word_size_ == 64);\n  }\n  SizedSection()\n      : test_assembler::Section(WithConfiguration::endianness()),\n        word_size_(WithConfiguration::word_size()) {\n    assert(word_size_ == 32 || word_size_ == 64);\n  }\n\n  // Access/set this section's word size.\n  size_t word_size() const { return word_size_; }\n  void set_word_size(size_t word_size) { \n    assert(word_size_ == 32 || word_size_ == 64);\n    word_size_ = word_size;\n  }\n\n  // Return a label representing the size this section will have when it\n  // is Placed in some containing section.\n  Label final_size() const { return final_size_; }\n\n  // Append SECTION to the end of this section, and call its Finish member.\n  // Return a reference to this section.\n  SizedSection &Place(SizedSection *section) {\n    assert(section->endianness() == endianness());\n    section->Finish();\n    section->start() = Here();\n    test_assembler::Section::Append(*section);\n    return *this;\n  }\n\n protected:\n  // Mark this section's contents as complete. For plain SizedSections, we\n  // set SECTION's start to its position in this section, and its final_size\n  // label to its current size. Derived classes can extend this as needed\n  // for their additional semantics.\n  virtual void Finish() {\n    final_size_ = Size();\n  }\n\n  // The word size for this data: either 32 or 64.\n  size_t word_size_;\n\n private:\n  // This section's final size, set when we are placed in some other\n  // SizedSection.\n  Label final_size_;\n};\n\n// A SizedSection that is loaded into memory at a particular address.\nclass LoadedSection: public SizedSection {\n public:\n  explicit LoadedSection(Label address = Label()) : address_(address) { }\n\n  // Return a label representing this section's address.\n  Label address() const { return address_; }\n\n  // Placing a loaded section within a loaded section sets the relationship\n  // between their addresses.\n  LoadedSection &Place(LoadedSection *section) {\n    section->address() = address() + Size();\n    SizedSection::Place(section);\n    return *this;\n  }\n\n protected:\n  // The address at which this section's contents will be loaded.\n  Label address_;\n};\n  \n// A SizedSection representing a segment load command.\nclass SegmentLoadCommand: public SizedSection {\n public:\n  SegmentLoadCommand() : section_count_(0) { }\n\n  // Append a segment load command header with the given characteristics.\n  // The load command will refer to CONTENTS, which must be Placed in the\n  // file separately, at the desired position. Return a reference to this\n  // section.\n  SegmentLoadCommand &Header(const string &name, const LoadedSection &contents,\n                             uint32_t maxprot, uint32_t initprot,\n                             uint32_t flags) {\n    assert(contents.word_size() == word_size());\n    D32(word_size() == 32 ? LC_SEGMENT : LC_SEGMENT_64);\n    D32(final_size());\n    AppendCString(name, 16);\n    Append(endianness(), word_size() / 8, contents.address());\n    Append(endianness(), word_size() / 8, vmsize_);\n    Append(endianness(), word_size() / 8, contents.start());\n    Append(endianness(), word_size() / 8, contents.final_size());\n    D32(maxprot);\n    D32(initprot);\n    D32(final_section_count_);\n    D32(flags);\n\n    content_final_size_ = contents.final_size();\n\n    return *this;\n  }\n\n  // Return a label representing the size of this segment when loaded into\n  // memory. If this label is still undefined by the time we place this\n  // segment, it defaults to the final size of the segment's in-file\n  // contents. Return a reference to this load command.\n  Label &vmsize() { return vmsize_; }\n\n  // Add a section entry with the given characteristics to this segment\n  // load command. Return a reference to this. The section entry will refer\n  // to CONTENTS, which must be Placed in the segment's contents\n  // separately, at the desired position.\n  SegmentLoadCommand &AppendSectionEntry(const string &section_name,\n                                         const string &segment_name,\n                                         uint32_t alignment, uint32_t flags,\n                                         const LoadedSection &contents) {\n    AppendCString(section_name, 16);\n    AppendCString(segment_name, 16);\n    Append(endianness(), word_size() / 8, contents.address());\n    Append(endianness(), word_size() / 8, contents.final_size());\n    D32(contents.start());\n    D32(alignment);\n    D32(0);                  // relocations start\n    D32(0);                  // relocations size\n    D32(flags);\n    D32(0x93656b95);         // reserved1\n    D32(0xc35a2473);         // reserved2\n    if (word_size() == 64)\n      D32(0x70284b95);       // reserved3\n\n    section_count_++;\n\n    return *this;\n  }\n\n protected:\n  void Finish() {\n    final_section_count_ = section_count_;\n    if (!vmsize_.IsKnownConstant())\n      vmsize_ = content_final_size_;\n    SizedSection::Finish();\n  }\n\n private:\n  // The number of sections that have been added to this segment so far.\n  size_t section_count_;\n\n  // A label representing the final number of sections this segment will hold.\n  Label final_section_count_;\n\n  // The size of the contents for this segment present in the file.\n  Label content_final_size_;\n\n  // A label representing the size of this segment when loaded; this can be\n  // larger than the size of its file contents, the difference being\n  // zero-filled. If not set explicitly by calling set_vmsize, this is set\n  // equal to the size of the contents.\n  Label vmsize_;\n};\n\n// A SizedSection holding a list of Mach-O load commands.\nclass LoadCommands: public SizedSection {\n public:\n  LoadCommands() : command_count_(0) { }\n\n  // Return a label representing the final load command count.\n  Label final_command_count() const { return final_command_count_; }\n\n  // Increment the command count; return a reference to this section.\n  LoadCommands &CountCommand() {\n    command_count_++;\n    return *this;\n  }\n\n  // Place COMMAND, containing a load command, at the end of this section.\n  // Return a reference to this section.\n  LoadCommands &Place(SizedSection *section) {\n    SizedSection::Place(section);\n    CountCommand();\n    return *this;\n  }\n\n protected:\n  // Mark this load command list as complete.\n  void Finish() {\n    SizedSection::Finish();\n    final_command_count_ = command_count_;\n  }\n\n private:\n  // The number of load commands we have added to this file so far.\n  size_t command_count_;\n\n  // A label representing the final command count.\n  Label final_command_count_;\n};\n\n// A SizedSection holding the contents of a Mach-O file. Within a\n// MachOFile, the start, Here, and Mark members refer to file offsets.\nclass MachOFile: public SizedSection {\n public:\n  MachOFile() { \n    start() = 0;\n  }\n\n  // Create a Mach-O file header using the given characteristics and load\n  // command list. This Places COMMANDS immediately after the header.\n  // Return a reference to this section.\n  MachOFile &Header(LoadCommands *commands,\n                    cpu_type_t cpu_type = CPU_TYPE_X86,\n                    cpu_subtype_t cpu_subtype = CPU_SUBTYPE_I386_ALL,\n                    FileType file_type = MH_EXECUTE,\n                    uint32_t file_flags = (MH_TWOLEVEL |\n                                           MH_DYLDLINK |\n                                           MH_NOUNDEFS)) {\n    D32(word_size() == 32 ? 0xfeedface : 0xfeedfacf);  // magic number\n    D32(cpu_type);                              // cpu type\n    D32(cpu_subtype);                           // cpu subtype\n    D32(file_type);                             // file type\n    D32(commands->final_command_count());       // number of load commands\n    D32(commands->final_size());                // their size in bytes\n    D32(file_flags);                            // flags\n    if (word_size() == 64)\n      D32(0x55638b90);                          // reserved\n    Place(commands);\n    return *this;\n  }\n};\n\n\nstruct ReaderFixture {\n  ReaderFixture()\n      : reporter(\"reporter filename\"),\n        reader(&reporter) { \n    EXPECT_CALL(reporter, BadHeader()).Times(0);\n    EXPECT_CALL(reporter, CPUTypeMismatch(_, _, _, _)).Times(0);\n    EXPECT_CALL(reporter, HeaderTruncated()).Times(0);\n    EXPECT_CALL(reporter, LoadCommandRegionTruncated()).Times(0);\n    EXPECT_CALL(reporter, LoadCommandsOverrun(_, _, _)).Times(0);\n    EXPECT_CALL(reporter, LoadCommandTooShort(_, _)).Times(0);\n    EXPECT_CALL(reporter, SectionsMissing(_)).Times(0);\n    EXPECT_CALL(reporter, MisplacedSegmentData(_)).Times(0);\n    EXPECT_CALL(reporter, MisplacedSectionData(_, _)).Times(0);\n    EXPECT_CALL(reporter, MisplacedSymbolTable()).Times(0);\n    EXPECT_CALL(reporter, UnsupportedCPUType(_)).Times(0);\n\n    EXPECT_CALL(load_command_handler, UnknownCommand(_, _)).Times(0);\n    EXPECT_CALL(load_command_handler, SegmentCommand(_)).Times(0);\n  }\n\n  void ReadFile(MachOFile *file,\n                bool expect_parse_success,\n                cpu_type_t expected_cpu_type,\n                cpu_subtype_t expected_cpu_subtype) {\n    ASSERT_TRUE(file->GetContents(&file_contents));\n    file_bytes = reinterpret_cast<const uint8_t *>(file_contents.data());\n    if (expect_parse_success) {\n      EXPECT_TRUE(reader.Read(file_bytes,\n                              file_contents.size(),\n                              expected_cpu_type,\n                              expected_cpu_subtype));\n    } else {\n      EXPECT_FALSE(reader.Read(file_bytes,\n                               file_contents.size(),\n                               expected_cpu_type,\n                               expected_cpu_subtype));\n    }\n  }\n\n  string file_contents;\n  const uint8_t *file_bytes;\n  MockReaderReporter reporter;\n  Reader reader;\n  MockLoadCommandHandler load_command_handler;\n  MockSectionHandler section_handler;\n};\n\nclass ReaderTest: public ReaderFixture, public Test { };\n\nTEST_F(ReaderTest, BadMagic) {\n  WithConfiguration config(kLittleEndian, 32);\n  const cpu_type_t kCPUType = 0x46b760df;\n  const cpu_subtype_t kCPUSubType = 0x76a0e7f7;\n  MachOFile file;\n  file\n      .D32(0x67bdebe1)                  // Not a proper magic number.\n      .D32(kCPUType)                    // cpu type\n      .D32(kCPUSubType)                 // cpu subtype\n      .D32(0x149fc717)                  // file type\n      .D32(0)                           // no load commands\n      .D32(0)                           // they occupy no bytes\n      .D32(0x80e71d64)                  // flags\n      .D32(0);                          // reserved\n  EXPECT_CALL(reporter, BadHeader()).WillOnce(Return());\n  ReadFile(&file, false, CPU_TYPE_ANY, kCPUSubType);\n}\n\nTEST_F(ReaderTest, MismatchedMagic) {\n  WithConfiguration config(kLittleEndian, 32);\n  const cpu_type_t kCPUType = CPU_TYPE_I386;\n  const cpu_subtype_t kCPUSubType = CPU_SUBTYPE_X86_ALL;\n  MachOFile file;\n  file\n      .D32(MH_CIGAM)                    // Right magic, but winds up wrong\n                                        // due to bitswapping\n      .D32(kCPUType)                    // cpu type\n      .D32(kCPUSubType)                 // cpu subtype\n      .D32(0x149fc717)                  // file type\n      .D32(0)                           // no load commands\n      .D32(0)                           // they occupy no bytes\n      .D32(0x80e71d64)                  // flags\n      .D32(0);                          // reserved\n  EXPECT_CALL(reporter, BadHeader()).WillOnce(Return());\n  ReadFile(&file, false, kCPUType, kCPUSubType);\n}\n\nTEST_F(ReaderTest, ShortMagic) {\n  WithConfiguration config(kBigEndian, 32);\n  MachOFile file;\n  file\n      .D16(0xfeed);                     // magic number\n                                        // truncated!\n  EXPECT_CALL(reporter, HeaderTruncated()).WillOnce(Return());\n  ReadFile(&file, false, CPU_TYPE_ANY, 0);\n}\n\nTEST_F(ReaderTest, ShortHeader) {\n  WithConfiguration config(kBigEndian, 32);\n  const cpu_type_t kCPUType = CPU_TYPE_ANY;\n  const cpu_subtype_t kCPUSubType = 0x76a0e7f7;\n  MachOFile file;\n  file\n      .D32(0xfeedface)                  // magic number\n      .D32(kCPUType)                    // cpu type\n      .D32(kCPUSubType)                 // cpu subtype\n      .D32(0x149fc717)                  // file type\n      .D32(0)                           // no load commands\n      .D32(0);                          // they occupy no bytes\n  EXPECT_CALL(reporter, HeaderTruncated()).WillOnce(Return());\n  ReadFile(&file, false, CPU_TYPE_ANY, kCPUSubType);\n}\n\nTEST_F(ReaderTest, MismatchedCPU) {\n  WithConfiguration config(kBigEndian, 32);\n  const cpu_type_t kCPUType = CPU_TYPE_I386;\n  const cpu_subtype_t kCPUSubType = CPU_SUBTYPE_X86_ALL;\n  MachOFile file;\n  file\n      .D32(MH_MAGIC)                    // Right magic for PPC (once bitswapped)\n      .D32(kCPUType)                    // cpu type\n      .D32(kCPUSubType)                 // cpu subtype\n      .D32(0x149fc717)                  // file type\n      .D32(0)                           // no load commands\n      .D32(0)                           // they occupy no bytes\n      .D32(0x80e71d64)                  // flags\n      .D32(0);                          // reserved\n  EXPECT_CALL(reporter,\n              CPUTypeMismatch(CPU_TYPE_I386, CPU_SUBTYPE_X86_ALL,\n                              CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_ALL))\n    .WillOnce(Return());\n  ReadFile(&file, false, CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_ALL);\n}\n\nTEST_F(ReaderTest, LittleEndian32Bit) {\n  WithConfiguration config(kLittleEndian, 32);\n  const cpu_type_t kCPUType = 0x46b760df;\n  const cpu_subtype_t kCPUSubType = 0x76a0e7f7;\n  MachOFile file;\n  file\n      .D32(0xfeedface)                  // magic number\n      .D32(kCPUType)                    // cpu type\n      .D32(kCPUSubType)                 // cpu subtype\n      .D32(0x149fc717)                  // file type\n      .D32(0)                           // no load commands\n      .D32(0)                           // they occupy no bytes\n      .D32(0x80e71d64)                  // flags\n      .D32(0);                          // reserved\n           ReadFile(&file, true, CPU_TYPE_ANY, kCPUSubType);\n  EXPECT_FALSE(reader.bits_64());\n  EXPECT_FALSE(reader.big_endian());\n  EXPECT_EQ(kCPUType,               reader.cpu_type());\n  EXPECT_EQ(kCPUSubType,            reader.cpu_subtype());\n  EXPECT_EQ(FileType(0x149fc717),   reader.file_type());\n  EXPECT_EQ(FileFlags(0x80e71d64),  reader.flags());\n}\n\nTEST_F(ReaderTest, LittleEndian64Bit) {\n  WithConfiguration config(kLittleEndian, 64);\n  const cpu_type_t kCPUType = 0x46b760df;\n  const cpu_subtype_t kCPUSubType = 0x76a0e7f7;\n  MachOFile file;\n  file\n      .D32(0xfeedfacf)                  // magic number\n      .D32(kCPUType)                    // cpu type\n      .D32(kCPUSubType)                 // cpu subtype\n      .D32(0x149fc717)                  // file type\n      .D32(0)                           // no load commands\n      .D32(0)                           // they occupy no bytes\n      .D32(0x80e71d64)                  // flags\n      .D32(0);                          // reserved\n  ReadFile(&file, true, CPU_TYPE_ANY, kCPUSubType);\n  EXPECT_TRUE(reader.bits_64());\n  EXPECT_FALSE(reader.big_endian());\n  EXPECT_EQ(kCPUType,               reader.cpu_type());\n  EXPECT_EQ(kCPUSubType,            reader.cpu_subtype());\n  EXPECT_EQ(FileType(0x149fc717),   reader.file_type());\n  EXPECT_EQ(FileFlags(0x80e71d64),  reader.flags());\n}\n\nTEST_F(ReaderTest, BigEndian32Bit) {\n  WithConfiguration config(kBigEndian, 32);\n  const cpu_type_t kCPUType = 0x46b760df;\n  const cpu_subtype_t kCPUSubType = 0x76a0e7f7;\n  MachOFile file;\n  file\n      .D32(0xfeedface)                  // magic number\n      .D32(kCPUType)                    // cpu type\n      .D32(kCPUSubType)                 // cpu subtype\n      .D32(0x149fc717)                  // file type\n      .D32(0)                           // no load commands\n      .D32(0)                           // they occupy no bytes\n      .D32(0x80e71d64)                  // flags\n      .D32(0);                          // reserved\n  ReadFile(&file, true, CPU_TYPE_ANY, kCPUSubType);\n  EXPECT_FALSE(reader.bits_64());\n  EXPECT_TRUE(reader.big_endian());\n  EXPECT_EQ(kCPUType,               reader.cpu_type());\n  EXPECT_EQ(kCPUSubType,            reader.cpu_subtype());\n  EXPECT_EQ(FileType(0x149fc717),   reader.file_type());\n  EXPECT_EQ(FileFlags(0x80e71d64),  reader.flags());\n}\n\nTEST_F(ReaderTest, BigEndian64Bit) {\n  WithConfiguration config(kBigEndian, 64);\n  const cpu_type_t kCPUType = 0x46b760df;\n  const cpu_subtype_t kCPUSubType = 0x76a0e7f7;\n  MachOFile file;\n  file\n      .D32(0xfeedfacf)                  // magic number\n      .D32(kCPUType)                    // cpu type\n      .D32(kCPUSubType)                 // cpu subtype\n      .D32(0x149fc717)                  // file type\n      .D32(0)                           // no load commands\n      .D32(0)                           // they occupy no bytes\n      .D32(0x80e71d64)                  // flags\n      .D32(0);                          // reserved\n  ReadFile(&file, true, CPU_TYPE_ANY, kCPUSubType);\n  EXPECT_TRUE(reader.bits_64());\n  EXPECT_TRUE(reader.big_endian());\n  EXPECT_EQ(kCPUType,               reader.cpu_type());\n  EXPECT_EQ(kCPUSubType,            reader.cpu_subtype());\n  EXPECT_EQ(FileType(0x149fc717),   reader.file_type());\n  EXPECT_EQ(FileFlags(0x80e71d64),  reader.flags());\n}\n\n\f\n// Load command tests.\n\nclass LoadCommand: public ReaderFixture, public Test { };\n\nTEST_F(LoadCommand, RegionTruncated) {\n  WithConfiguration config(kBigEndian, 64);\n  const cpu_type_t kCPUType = 0x46b760df;\n  const cpu_subtype_t kCPUSubType = 0x76a0e7f7;\n  MachOFile file;\n  file\n      .D32(0xfeedfacf)                  // magic number\n      .D32(kCPUType)                    // cpu type\n      .D32(kCPUSubType)                 // cpu subtype\n      .D32(0x149fc717)                  // file type\n      .D32(1)                           // one load command\n      .D32(40)                          // occupying 40 bytes\n      .D32(0x80e71d64)                  // flags\n      .D32(0)                           // reserved\n      .Append(20, 0);                   // load command region, not as long as\n                                        // Mach-O header promised\n\n  EXPECT_CALL(reporter, LoadCommandRegionTruncated()).WillOnce(Return());\n\n  ReadFile(&file, false, CPU_TYPE_ANY, kCPUSubType);\n}\n\nTEST_F(LoadCommand, None) {\n  WithConfiguration config(kLittleEndian, 32);\n  LoadCommands load_commands;\n  MachOFile file;\n  file.Header(&load_commands);\n\n  ReadFile(&file, true, CPU_TYPE_X86, CPU_SUBTYPE_I386_ALL);\n\n  EXPECT_FALSE(reader.bits_64());\n  EXPECT_FALSE(reader.big_endian());\n  EXPECT_EQ(CPU_TYPE_X86,         reader.cpu_type());\n  EXPECT_EQ(CPU_SUBTYPE_I386_ALL, reader.cpu_subtype());\n  EXPECT_EQ(static_cast<uint32_t>(MH_EXECUTE), reader.file_type());\n  EXPECT_EQ(FileFlags(MH_TWOLEVEL |\n                      MH_DYLDLINK |\n                      MH_NOUNDEFS),\n            FileFlags(reader.flags()));\n  \n  EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));\n}\n\nTEST_F(LoadCommand, Unknown) {\n  WithConfiguration config(kBigEndian, 32);\n  LoadCommands load_commands;\n  load_commands\n      .CountCommand()\n      .D32(0x33293d4a)                  // unknown load command\n      .D32(40)                          // total size in bytes\n      .Append(32, '*');                 // dummy data\n  MachOFile file;\n  file.Header(&load_commands);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  EXPECT_FALSE(reader.bits_64());\n  EXPECT_TRUE(reader.big_endian());\n  EXPECT_EQ(CPU_TYPE_X86,         reader.cpu_type());\n  EXPECT_EQ(CPU_SUBTYPE_I386_ALL, reader.cpu_subtype());\n  EXPECT_EQ(static_cast<uint32_t>(MH_EXECUTE), reader.file_type());\n  EXPECT_EQ(FileFlags(MH_TWOLEVEL |\n                      MH_DYLDLINK |\n                      MH_NOUNDEFS),\n            reader.flags());\n\n  ByteBuffer expected;\n  expected.start = file_bytes + load_commands.start().Value();\n  expected.end = expected.start + load_commands.final_size().Value();\n  EXPECT_CALL(load_command_handler, UnknownCommand(0x33293d4a,\n                                                   expected))\n      .WillOnce(Return(true));\n\n  EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));\n}\n\nTEST_F(LoadCommand, TypeIncomplete) {\n  WithConfiguration config(kLittleEndian, 32);\n  LoadCommands load_commands;\n  load_commands\n      .CountCommand()\n      .Append(3, 0);                    // load command type, incomplete\n\n  MachOFile file;\n  file.Header(&load_commands);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  EXPECT_CALL(reporter, LoadCommandsOverrun(1, 0, 0))\n      .WillOnce(Return());\n  EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));\n}\n\nTEST_F(LoadCommand, LengthIncomplete) {\n  WithConfiguration config(kBigEndian, 64);\n  LoadCommands load_commands;\n  load_commands\n      .CountCommand()\n      .D32(LC_SEGMENT);                 // load command\n                                                // no length\n  MachOFile file;\n  file.Header(&load_commands);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  EXPECT_CALL(reporter, LoadCommandsOverrun(1, 0, LC_SEGMENT))\n      .WillOnce(Return());\n  EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));\n}\n\nTEST_F(LoadCommand, ContentIncomplete) {\n  WithConfiguration config(kLittleEndian, 64);\n  LoadCommands load_commands;\n  load_commands\n      .CountCommand()\n      .D32(LC_SEGMENT)          // load command\n      .D32(40)                          // total size in bytes\n      .Append(28, '*');                 // not enough dummy data\n  MachOFile file;\n  file.Header(&load_commands);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  EXPECT_CALL(reporter, LoadCommandsOverrun(1, 0, LC_SEGMENT))\n      .WillOnce(Return());\n  EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));\n}\n\nTEST_F(LoadCommand, SegmentBE32) {\n  WithConfiguration config(kBigEndian, 32);\n  LoadedSection segment;\n  segment.address() = 0x1891139c;\n  segment.Append(42, '*');              // segment contents\n  SegmentLoadCommand segment_command;\n  segment_command\n      .Header(\"froon\", segment, 0x94d6dd22, 0x8bdbc319, 0x990a16dd);\n  segment_command.vmsize() = 0xcb76584fU;\n  LoadCommands load_commands;\n  load_commands.Place(&segment_command);\n  MachOFile file;\n  file\n      .Header(&load_commands)\n      .Place(&segment);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  Segment actual_segment;\n  EXPECT_CALL(load_command_handler, SegmentCommand(_))\n    .WillOnce(DoAll(SaveArg<0>(&actual_segment),\n                    Return(true)));\n  EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));\n\n  EXPECT_EQ(false,                        actual_segment.bits_64);\n  EXPECT_EQ(\"froon\",                      actual_segment.name);\n  EXPECT_EQ(0x1891139cU,                  actual_segment.vmaddr);\n  EXPECT_EQ(0xcb76584fU,                  actual_segment.vmsize);\n  EXPECT_EQ(0x94d6dd22U,                  actual_segment.maxprot);\n  EXPECT_EQ(0x8bdbc319U,                  actual_segment.initprot);\n  EXPECT_EQ(0x990a16ddU,                  actual_segment.flags);\n  EXPECT_EQ(0U,                           actual_segment.nsects);\n  EXPECT_EQ(0U,                           actual_segment.section_list.Size());\n  EXPECT_EQ(segment.final_size().Value(), actual_segment.contents.Size());\n}\n\nTEST_F(LoadCommand, SegmentLE32) {\n  WithConfiguration config(kLittleEndian, 32);\n  LoadedSection segment;\n  segment.address() = 0x4b877866;\n  segment.Append(42, '*');              // segment contents\n  SegmentLoadCommand segment_command;\n  segment_command\n      .Header(\"sixteenprecisely\", segment,\n              0x350759ed, 0x6cf5a62e, 0x990a16dd);\n  segment_command.vmsize() = 0xcb76584fU;\n  LoadCommands load_commands;\n  load_commands.Place(&segment_command);\n  MachOFile file;\n  file\n      .Header(&load_commands)\n      .Place(&segment);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  Segment actual_segment;\n  EXPECT_CALL(load_command_handler, SegmentCommand(_))\n    .WillOnce(DoAll(SaveArg<0>(&actual_segment),\n                    Return(true)));\n  EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));\n\n  EXPECT_EQ(false,                        actual_segment.bits_64);\n  EXPECT_EQ(\"sixteenprecisely\",           actual_segment.name);\n  EXPECT_EQ(0x4b877866U,                  actual_segment.vmaddr);\n  EXPECT_EQ(0xcb76584fU,                  actual_segment.vmsize);\n  EXPECT_EQ(0x350759edU,                  actual_segment.maxprot);\n  EXPECT_EQ(0x6cf5a62eU,                  actual_segment.initprot);\n  EXPECT_EQ(0x990a16ddU,                  actual_segment.flags);\n  EXPECT_EQ(0U,                           actual_segment.nsects);\n  EXPECT_EQ(0U,                           actual_segment.section_list.Size());\n  EXPECT_EQ(segment.final_size().Value(), actual_segment.contents.Size());\n}\n\nTEST_F(LoadCommand, SegmentBE64) {\n  WithConfiguration config(kBigEndian, 64);\n  LoadedSection segment;\n  segment.address() = 0x79f484f77009e511ULL;\n  segment.Append(42, '*');              // segment contents\n  SegmentLoadCommand segment_command;\n  segment_command\n      .Header(\"froon\", segment, 0x42b45da5, 0x8bdbc319, 0xb2335220);\n  segment_command.vmsize() = 0x8d92397ce6248abaULL;\n  LoadCommands load_commands;\n  load_commands.Place(&segment_command);\n  MachOFile file;\n  file\n      .Header(&load_commands)\n      .Place(&segment);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  Segment actual_segment;\n  EXPECT_CALL(load_command_handler, SegmentCommand(_))\n    .WillOnce(DoAll(SaveArg<0>(&actual_segment),\n                    Return(true)));\n  EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));\n\n  EXPECT_EQ(true,                         actual_segment.bits_64);\n  EXPECT_EQ(\"froon\",                      actual_segment.name);\n  EXPECT_EQ(0x79f484f77009e511ULL,        actual_segment.vmaddr);\n  EXPECT_EQ(0x8d92397ce6248abaULL,        actual_segment.vmsize);\n  EXPECT_EQ(0x42b45da5U,                  actual_segment.maxprot);\n  EXPECT_EQ(0x8bdbc319U,                  actual_segment.initprot);\n  EXPECT_EQ(0xb2335220U,                  actual_segment.flags);\n  EXPECT_EQ(0U,                           actual_segment.nsects);\n  EXPECT_EQ(0U,                           actual_segment.section_list.Size());\n  EXPECT_EQ(segment.final_size().Value(), actual_segment.contents.Size());\n}\n\nTEST_F(LoadCommand, SegmentLE64) {\n  WithConfiguration config(kLittleEndian, 64);\n  LoadedSection segment;\n  segment.address() = 0x50c0501dc5922d35ULL;\n  segment.Append(42, '*');              // segment contents\n  SegmentLoadCommand segment_command;\n  segment_command\n      .Header(\"sixteenprecisely\", segment,\n              0x917c339d, 0xdbc446fa, 0xb650b563);\n  segment_command.vmsize() = 0x84ae73e7c75469bfULL;\n  LoadCommands load_commands;\n  load_commands.Place(&segment_command);\n  MachOFile file;\n  file\n      .Header(&load_commands)\n      .Place(&segment);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  Segment actual_segment;\n  EXPECT_CALL(load_command_handler, SegmentCommand(_))\n    .WillOnce(DoAll(SaveArg<0>(&actual_segment),\n                    Return(true)));\n  EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));\n\n  EXPECT_EQ(true,                         actual_segment.bits_64);\n  EXPECT_EQ(\"sixteenprecisely\",           actual_segment.name);\n  EXPECT_EQ(0x50c0501dc5922d35ULL,        actual_segment.vmaddr);\n  EXPECT_EQ(0x84ae73e7c75469bfULL,        actual_segment.vmsize);\n  EXPECT_EQ(0x917c339dU,                  actual_segment.maxprot);\n  EXPECT_EQ(0xdbc446faU,                  actual_segment.initprot);\n  EXPECT_EQ(0xb650b563U,                  actual_segment.flags);\n  EXPECT_EQ(0U,                           actual_segment.nsects);\n  EXPECT_EQ(0U,                           actual_segment.section_list.Size());\n  EXPECT_EQ(segment.final_size().Value(), actual_segment.contents.Size());\n}\n\nTEST_F(LoadCommand, SegmentCommandTruncated) {\n  WithConfiguration config(kBigEndian, 32);\n  LoadedSection segment_contents;\n  segment_contents.Append(20, '*');     \t// lah di dah\n  SizedSection command;\n  command\n      .D32(LC_SEGMENT)          \t// command type\n      .D32(command.final_size())                // command size\n      .AppendCString(\"too-short\", 16)           // segment name\n      .D32(0x9c759211)                          // vmaddr\n      .D32(segment_contents.final_size())       // vmsize\n      .D32(segment_contents.start())            // file offset\n      .D32(segment_contents.final_size())       // file size\n      .D32(0x56f28446)                          // max protection\n      .D32(0xe7910dcb)                          // initial protection\n      .D32(0)                                   // no sections\n      .Append(3, 0);                            // flags (one byte short!)\n  LoadCommands load_commands;\n  load_commands.Place(&command);\n  MachOFile file;\n  file\n      .Header(&load_commands)\n      .Place(&segment_contents);\n  \n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  EXPECT_CALL(reporter, LoadCommandTooShort(0, LC_SEGMENT))\n      .WillOnce(Return());\n\n  EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));\n}\n\nTEST_F(LoadCommand, SegmentBadContentOffset) {\n  WithConfiguration config(kLittleEndian, 32);\n  // Instead of letting a Place call set the segment's file offset and size,\n  // set them ourselves, to check that the parser catches invalid offsets\n  // instead of handing us bogus pointers.\n  LoadedSection segment;\n  segment.address() = 0x4db5489c;\n  segment.start() = 0x7e189e76;         // beyond end of file\n  segment.final_size() = 0x98b9c3ab;\n  SegmentLoadCommand segment_command;\n  segment_command\n      .Header(\"notmerelyfifteen\", segment, 0xcbab25ee, 0x359a20db, 0x68a3933f);\n  LoadCommands load_commands;\n  load_commands.Place(&segment_command);\n  MachOFile file;\n  file.Header(&load_commands);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  EXPECT_CALL(reporter, MisplacedSegmentData(\"notmerelyfifteen\"))\n      .WillOnce(Return());\n\n  EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));\n}\n\nTEST_F(LoadCommand, ThreeLoadCommands) {\n  WithConfiguration config(kBigEndian, 32);\n  LoadedSection seg1, seg2, seg3;\n  SegmentLoadCommand cmd1, cmd2, cmd3;\n\n  seg1.Append(128, '@');\n  seg1.address() = 0xa7f61ef6;\n  cmd1.Header(\"head\", seg1, 0x88bf1cc7, 0x889a26a4, 0xe9b80d87);\n  // Include some dummy data at the end of the load command. Since we\n  // didn't claim to have any sections, the reader should ignore this. But\n  // making sure the commands have different lengths ensures that we're\n  // using the right command's length to advance the LoadCommandIterator.\n  cmd1.Append(128, '!');\n\n  seg2.Append(42, '*');\n  seg2.address() = 0xc70fc909;\n  cmd2.Header(\"thorax\", seg2, 0xde7327f4, 0xfdaf771d, 0x65e74b30);\n  // More dummy data at the end of the load command. \n  cmd2.Append(32, '^');\n\n  seg3.Append(42, '%');\n  seg3.address() = 0x46b3ab05;\n  cmd3.Header(\"abdomen\", seg3, 0x7098b70d, 0x8d8d7728, 0x5131419b);\n  // More dummy data at the end of the load command. \n  cmd3.Append(64, '&');\n\n  LoadCommands load_commands;\n  load_commands.Place(&cmd1).Place(&cmd2).Place(&cmd3);\n\n  MachOFile file;\n  file.Header(&load_commands).Place(&seg1).Place(&seg2).Place(&seg3);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  {\n    InSequence s;\n    EXPECT_CALL(load_command_handler,\n                SegmentCommand(Field(&Segment::name, \"head\")))\n      .WillOnce(Return(true));\n    EXPECT_CALL(load_command_handler,\n                SegmentCommand(Field(&Segment::name, \"thorax\")))\n      .WillOnce(Return(true));\n    EXPECT_CALL(load_command_handler,\n                SegmentCommand(Field(&Segment::name, \"abdomen\")))\n      .WillOnce(Return(true));\n  }\n\n  EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));\n}\n\nstatic inline Matcher<const Section &> MatchSection(\n    Matcher<bool> bits_64,\n    Matcher<const string &> section_name,\n    Matcher<const string &> segment_name,\n    Matcher<uint64_t> address,\n    Matcher<uint32_t> alignment,\n    Matcher<uint32_t> flags,\n    Matcher<const ByteBuffer &> contents) {\n  return AllOf(AllOf(Field(&Section::bits_64, bits_64),\n                     Field(&Section::section_name, section_name),\n                     Field(&Section::segment_name, segment_name),\n                     Field(&Section::address, address)),\n               AllOf(Field(&Section::align, alignment),\n                     Field(&Section::flags, flags),\n                     Field(&Section::contents, contents)));\n}\n\nstatic inline Matcher<const Section &> MatchSection(\n    Matcher<bool> bits_64,\n    Matcher<const string &> section_name,\n    Matcher<const string &> segment_name,\n    Matcher<uint64_t> address) {\n  return AllOf(Field(&Section::bits_64, bits_64),\n               Field(&Section::section_name, section_name),\n               Field(&Section::segment_name, segment_name),\n               Field(&Section::address, address));\n}\n\nTEST_F(LoadCommand, OneSegmentTwoSections) {\n  WithConfiguration config(kBigEndian, 64);\n\n  // Create some sections with some data.\n  LoadedSection section1, section2;\n  section1.Append(\"buddha's hand\");\n  section2.Append(\"kumquat\");\n\n  // Create a segment to hold them.\n  LoadedSection segment;\n  segment.address() = 0xe1d0eeec;\n  segment.Place(&section2).Place(&section1);\n\n  SegmentLoadCommand segment_command;\n  segment_command\n      .Header(\"head\", segment, 0x92c9568c, 0xa89f2627, 0x4dc7a1e2)\n      .AppendSectionEntry(\"mandarin\", \"kishu\", 12, 0x8cd4604bU, section1)\n      .AppendSectionEntry(\"bergamot\", \"cara cara\", 12, 0x98746efaU, section2);\n\n  LoadCommands commands;\n  commands.Place(&segment_command);\n\n  MachOFile file;\n  file.Header(&commands).Place(&segment);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n  \n  Segment actual_segment;\n  EXPECT_CALL(load_command_handler, SegmentCommand(_))\n      .WillOnce(DoAll(SaveArg<0>(&actual_segment),\n                      Return(true)));\n  EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));\n\n  {\n    InSequence s;\n    ByteBuffer contents1;\n    contents1.start = file_bytes + section1.start().Value();\n    contents1.end = contents1.start + section1.final_size().Value();\n    EXPECT_EQ(\"buddha's hand\",\n              string(reinterpret_cast<const char *>(contents1.start),\n                     contents1.Size()));\n    EXPECT_CALL(section_handler,\n                HandleSection(MatchSection(true, \"mandarin\", \"kishu\",\n                                           section1.address().Value(), 12,\n                                           0x8cd4604bU, contents1)))\n      .WillOnce(Return(true));\n    \n    ByteBuffer contents2;\n    contents2.start = file_bytes + section2.start().Value();\n    contents2.end = contents2.start + section2.final_size().Value();\n    EXPECT_EQ(\"kumquat\",\n              string(reinterpret_cast<const char *>(contents2.start),\n                     contents2.Size()));\n    EXPECT_CALL(section_handler,\n                HandleSection(MatchSection(true, \"bergamot\", \"cara cara\",\n                                           section2.address().Value(), 12,\n                                           0x98746efaU, contents2)))\n      .WillOnce(Return(true));\n  }\n\n  EXPECT_TRUE(reader.WalkSegmentSections(actual_segment, &section_handler));\n}\n\nTEST_F(LoadCommand, MisplacedSectionBefore) {\n  WithConfiguration config(kLittleEndian, 64);\n\n  // The segment.\n  LoadedSection segment;\n  segment.address() = 0x696d83cc;\n  segment.Append(10, '0');\n\n  // The contents of the following sections don't matter, because\n  // we're not really going to Place them in segment; we're just going\n  // to set all their labels by hand to get the (impossible)\n  // configurations we want.\n\n  // A section whose starting offset is before that of its section.\n  LoadedSection before;\n  before.Append(10, '1');\n  before.start()   = segment.start() - 1;\n  before.address() = segment.address() - 1;\n  before.final_size() = before.Size();\n  \n  SegmentLoadCommand command;\n  command\n    .Header(\"segment\", segment, 0x173baa29, 0x8407275d, 0xed8f7057)\n    .AppendSectionEntry(\"before\",     \"segment\", 0, 0x686c6921, before);\n\n  LoadCommands commands;\n  commands.Place(&command);\n\n  MachOFile file;\n  file.Header(&commands).Place(&segment);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  Segment actual_segment;\n  EXPECT_TRUE(reader.FindSegment(\"segment\", &actual_segment));\n\n  EXPECT_CALL(reporter, MisplacedSectionData(\"before\", \"segment\"))\n    .WillOnce(Return());\n  EXPECT_FALSE(reader.WalkSegmentSections(actual_segment, &section_handler));\n}\n\nTEST_F(LoadCommand, MisplacedSectionAfter) {\n  WithConfiguration config(kLittleEndian, 64);\n\n  // The segment.\n  LoadedSection segment;\n  segment.address() = 0x696d83cc;\n  segment.Append(10, '0');\n\n  // The contents of the following sections don't matter, because\n  // we're not really going to Place them in segment; we're just going\n  // to set all their labels by hand to get the (impossible)\n  // configurations we want.\n\n  // A section whose starting offset is after the end of its section.\n  LoadedSection after;\n  after.Append(10, '2');\n  after.start()    = segment.start() + 11;\n  after.address()   = segment.address() + 11;\n  after.final_size() = after.Size();\n\n  SegmentLoadCommand command;\n  command\n    .Header(\"segment\", segment, 0x173baa29, 0x8407275d, 0xed8f7057)\n    .AppendSectionEntry(\"after\",      \"segment\", 0, 0x2ee50124, after);\n\n  LoadCommands commands;\n  commands.Place(&command);\n\n  MachOFile file;\n  file.Header(&commands).Place(&segment);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  Segment actual_segment;\n  EXPECT_TRUE(reader.FindSegment(\"segment\", &actual_segment));\n\n  EXPECT_CALL(reporter, MisplacedSectionData(\"after\", \"segment\"))\n    .WillOnce(Return());\n  EXPECT_FALSE(reader.WalkSegmentSections(actual_segment, &section_handler));\n}\n\nTEST_F(LoadCommand, MisplacedSectionTooBig) {\n  WithConfiguration config(kLittleEndian, 64);\n\n  // The segment.\n  LoadedSection segment;\n  segment.address() = 0x696d83cc;\n  segment.Append(10, '0');\n\n  // The contents of the following sections don't matter, because\n  // we're not really going to Place them in segment; we're just going\n  // to set all their labels by hand to get the (impossible)\n  // configurations we want.\n\n  // A section that extends beyond the end of its section.\n  LoadedSection too_big;\n  too_big.Append(10, '3');\n  too_big.start()   = segment.start() + 1;\n  too_big.address() = segment.address() + 1;\n  too_big.final_size() = too_big.Size();\n\n  SegmentLoadCommand command;\n  command\n    .Header(\"segment\", segment, 0x173baa29, 0x8407275d, 0xed8f7057)\n    .AppendSectionEntry(\"too big\",    \"segment\", 0, 0x8b53ae5c, too_big);\n\n  LoadCommands commands;\n  commands.Place(&command);\n\n  MachOFile file;\n  file.Header(&commands).Place(&segment);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  Segment actual_segment;\n  EXPECT_TRUE(reader.FindSegment(\"segment\", &actual_segment));\n\n  EXPECT_CALL(reporter, MisplacedSectionData(\"too big\", \"segment\"))\n    .WillOnce(Return());\n  EXPECT_FALSE(reader.WalkSegmentSections(actual_segment, &section_handler));\n}\n\n\n// The segments in a .dSYM bundle's Mach-O file have their file offset\n// and size set to zero, but the sections don't.  The reader shouldn't\n// report an error in this case.\nTEST_F(LoadCommand, ZappedSegment) {\n  WithConfiguration config(kBigEndian, 32);\n\n  // The segment.\n  LoadedSection segment;\n  segment.address() = 0x696d83cc;\n  segment.start() = 0;\n  segment.final_size() = 0;\n\n  // The section.\n  LoadedSection section;\n  section.address() = segment.address();\n  section.start() = 0;\n  section.final_size() = 1000;          // extends beyond its segment\n  \n  SegmentLoadCommand command;\n  command\n    .Header(\"zapped\", segment, 0x0861a5cb, 0x68ccff67, 0x0b66255c)\n    .AppendSectionEntry(\"twitching\", \"zapped\", 0, 0x93b3bd42, section);\n\n  LoadCommands commands;\n  commands.Place(&command);\n\n  MachOFile file;\n  file.Header(&commands);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  Segment actual_segment;\n  EXPECT_TRUE(reader.FindSegment(\"zapped\", &actual_segment));\n\n  ByteBuffer zapped_extent(NULL, 0);\n  EXPECT_CALL(section_handler,\n              HandleSection(MatchSection(false, \"twitching\", \"zapped\",\n                                         0x696d83cc, 0, 0x93b3bd42,\n                                         zapped_extent)))\n    .WillOnce(Return(true));\n\n  EXPECT_TRUE(reader.WalkSegmentSections(actual_segment, &section_handler));\n}\n\nTEST_F(LoadCommand, MapSegmentSections) {\n  WithConfiguration config(kLittleEndian, 32);\n\n  // Create some sections with some data.\n  LoadedSection section1, section2, section3, section4;\n  section1.Append(\"buddha's hand\");\n  section2.start() = 0;                 // Section 2 is an S_ZEROFILL section.\n  section2.final_size() = 0;\n  section3.Append(\"shasta gold\");\n  section4.Append(\"satsuma\");\n\n  // Create two segments to hold them.\n  LoadedSection segment1, segment2;\n  segment1.address() = 0x13e6c8a9;\n  segment1.Place(&section3).Place(&section1);\n  segment2.set_word_size(64);\n  segment2.address() = 0x04d462e2;\n  segment2.Place(&section4);\n  section2.address() = segment2.address() + segment2.Size();\n\n  SegmentLoadCommand segment_command1, segment_command2;\n  segment_command1\n      .Header(\"head\", segment1, 0x67d955a6, 0x7a61c13e, 0xe3e50c64)\n      .AppendSectionEntry(\"mandarin\", \"head\", 12, 0x5bb565d7, section1)\n      .AppendSectionEntry(\"bergamot\", \"head\", 12, 0x8620de73, section3);\n  segment_command2.set_word_size(64);\n  segment_command2\n      .Header(\"thorax\", segment2, 0x7aab2419, 0xe908007f, 0x17961d33)\n      .AppendSectionEntry(\"sixteenprecisely\", \"thorax\",\n                          12, S_ZEROFILL, section2)\n      .AppendSectionEntry(\"cara cara\", \"thorax\", 12, 0xb6c5dd8a, section4);\n\n  LoadCommands commands;\n  commands.Place(&segment_command1).Place(&segment_command2);\n\n  MachOFile file;\n  file.Header(&commands).Place(&segment1).Place(&segment2);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  Segment segment;\n  SectionMap section_map;\n\n  EXPECT_FALSE(reader.FindSegment(\"smoot\", &segment));\n\n  ASSERT_TRUE(reader.FindSegment(\"thorax\", &segment));\n  ASSERT_TRUE(reader.MapSegmentSections(segment, &section_map));\n\n  EXPECT_FALSE(section_map.find(\"sixteenpreciselyandthensome\")\n               != section_map.end());\n  EXPECT_FALSE(section_map.find(\"mandarin\") != section_map.end());\n  ASSERT_TRUE(section_map.find(\"cara cara\") != section_map.end());\n  EXPECT_THAT(section_map[\"cara cara\"],\n              MatchSection(true, \"cara cara\", \"thorax\", 0x04d462e2));\n  ASSERT_TRUE(section_map.find(\"sixteenprecisely\")\n              != section_map.end());\n  ByteBuffer sixteenprecisely_contents(NULL, 0);\n  EXPECT_THAT(section_map[\"sixteenprecisely\"],\n              MatchSection(true, \"sixteenprecisely\", \"thorax\",\n                           0x04d462e2 + 7, 12, S_ZEROFILL,\n                           sixteenprecisely_contents));\n\n  ASSERT_TRUE(reader.FindSegment(\"head\", &segment));\n  ASSERT_TRUE(reader.MapSegmentSections(segment, &section_map));\n\n  ASSERT_TRUE(section_map.find(\"mandarin\") != section_map.end());\n  EXPECT_THAT(section_map[\"mandarin\"],\n              MatchSection(false, \"mandarin\", \"head\", 0x13e6c8a9 + 11));\n  ASSERT_TRUE(section_map.find(\"bergamot\") != section_map.end());\n  EXPECT_THAT(section_map[\"bergamot\"],\n              MatchSection(false, \"bergamot\", \"head\", 0x13e6c8a9));\n}\n\nTEST_F(LoadCommand, FindSegment) {\n  WithConfiguration config(kBigEndian, 32);\n\n  LoadedSection segment1, segment2, segment3;\n  segment1.address() = 0xb8ae5752;\n  segment1.Append(\"Some contents!\");\n  segment2.address() = 0xd6b0ce83;\n  segment2.Append(\"Different stuff.\");\n  segment3.address() = 0x7374fd2a;\n  segment3.Append(\"Further materials.\");\n\n  SegmentLoadCommand cmd1, cmd2, cmd3;\n  cmd1.Header(\"first\",  segment1, 0xfadb6932, 0x175bf529, 0x0de790ad);\n  cmd2.Header(\"second\", segment2, 0xeef716e0, 0xe103a9d7, 0x7d38a8ef);\n  cmd3.Header(\"third\",  segment3, 0xe172b39e, 0x86012f07, 0x080ac94d);\n\n  LoadCommands commands;\n  commands.Place(&cmd1).Place(&cmd2).Place(&cmd3);\n\n  MachOFile file;\n  file.Header(&commands).Place(&segment1).Place(&segment2).Place(&segment3);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  Segment actual_segment;\n\n  EXPECT_FALSE(reader.FindSegment(\"murphy\", &actual_segment));\n\n  EXPECT_TRUE(reader.FindSegment(\"second\", &actual_segment));\n  EXPECT_EQ(0xd6b0ce83, actual_segment.vmaddr);\n}\n\n\f\n// Symtab tests.\n\n// A StringAssembler is a class for generating .stabstr sections to present\n// as input to the STABS parser.\nclass StringAssembler: public SizedSection {\n public:\n  // Add the string S to this StringAssembler, and return the string's\n  // offset within this compilation unit's strings.\n  size_t Add(const string &s) {\n    size_t offset = Size();\n    AppendCString(s);\n    return offset;\n  }\n};\n\n// A SymbolAssembler is a class for generating .stab sections to present as\n// test input for the STABS parser.\nclass SymbolAssembler: public SizedSection {\n public:\n  // Create a SymbolAssembler that uses StringAssembler for its strings.\n  explicit SymbolAssembler(StringAssembler *string_assembler) \n      : string_assembler_(string_assembler),\n        entry_count_(0) { }\n\n  // Append a STAB entry to the end of this section with the given\n  // characteristics. NAME is the offset of this entry's name string within\n  // its compilation unit's portion of the .stabstr section; this can be a\n  // value generated by a StringAssembler. Return a reference to this\n  // SymbolAssembler.\n  SymbolAssembler &Symbol(uint8_t type, uint8_t other, Label descriptor,\n                          Label value, Label name) {\n    D32(name);\n    D8(type);\n    D8(other);\n    D16(descriptor);\n    Append(endianness(), word_size_ / 8, value);\n    entry_count_++;\n    return *this;\n  }\n\n  // As above, but automatically add NAME to our StringAssembler.\n  SymbolAssembler &Symbol(uint8_t type, uint8_t other, Label descriptor,\n                       Label value, const string &name) {\n    return Symbol(type, other, descriptor, value, string_assembler_->Add(name));\n  }\n\n private:\n  // The strings for our STABS entries.\n  StringAssembler *string_assembler_;\n\n  // The number of entries in this compilation unit so far.\n  size_t entry_count_;\n};\n\nclass Symtab: public ReaderFixture, public Test { };\n\nTEST_F(Symtab, Symtab32) {\n  WithConfiguration config(kLittleEndian, 32);\n\n  StringAssembler strings;\n  SymbolAssembler symbols(&strings);\n  symbols\n      .Symbol(0x52, 0x7c, 0x3470, 0x9bb02e7c, \"hrududu\")\n      .Symbol(0x50, 0x90, 0x7520, 0x1122525d, \"Frith\");\n\n  SizedSection symtab_command;\n  symtab_command\n      .D32(LC_SYMTAB)                    // command\n      .D32(symtab_command.final_size())  // size\n      .D32(symbols.start())              // file offset of symbols\n      .D32(2)                            // symbol count\n      .D32(strings.start())              // file offset of strings\n      .D32(strings.final_size());        // strings size\n\n  LoadCommands load_commands;\n  load_commands.Place(&symtab_command);\n\n  MachOFile file;\n  file.Header(&load_commands).Place(&symbols).Place(&strings);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  ByteBuffer symbols_found, strings_found;\n  EXPECT_CALL(load_command_handler, SymtabCommand(_, _))\n      .WillOnce(DoAll(SaveArg<0>(&symbols_found),\n                      SaveArg<1>(&strings_found),\n                      Return(true)));\n  EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));\n\n  EXPECT_EQ(24U, symbols_found.Size());\n  EXPECT_EQ(14U, strings_found.Size());\n}\n\nTEST_F(Symtab, Symtab64) {\n  WithConfiguration config(kBigEndian, 64);\n\n  StringAssembler strings;\n  SymbolAssembler symbols(&strings);\n  symbols\n      .Symbol(0xa7, 0xaf, 0x03af, 0x42f3072c74335181ULL, \"foo\")\n      .Symbol(0xb0, 0x9a, 0x2aa7, 0x2e2d349b3d5744a0ULL, \"bar\");\n\n  SizedSection symtab_command;\n  symtab_command\n      .D32(LC_SYMTAB)                    // command\n      .D32(symtab_command.final_size())  // size\n      .D32(symbols.start())              // file offset of symbols\n      .D32(2)                            // symbol count\n      .D32(strings.start())              // file offset of strings\n      .D32(strings.final_size());        // strings size\n\n  LoadCommands load_commands;\n  load_commands.Place(&symtab_command);\n\n  MachOFile file;\n  file.Header(&load_commands).Place(&symbols).Place(&strings);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  ByteBuffer symbols_found, strings_found;\n  EXPECT_CALL(load_command_handler, SymtabCommand(_, _))\n      .WillOnce(DoAll(SaveArg<0>(&symbols_found),\n                      SaveArg<1>(&strings_found),\n                      Return(true)));\n  EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));\n\n  EXPECT_EQ(32U, symbols_found.Size());\n  EXPECT_EQ(8U,  strings_found.Size());\n}\n\nTEST_F(Symtab, SymtabMisplacedSymbols) {\n  WithConfiguration config(kBigEndian, 32);\n\n  StringAssembler strings;\n  SymbolAssembler symbols(&strings);\n  symbols\n      .Symbol(0xa7, 0xaf, 0x03af, 0x42f3072c74335181ULL, \"foo\")\n      .Symbol(0xb0, 0x9a, 0x2aa7, 0x2e2d349b3d5744a0ULL, \"bar\");\n\n  SizedSection symtab_command;\n  symtab_command\n      .D32(LC_SYMTAB)                    // command\n      .D32(symtab_command.final_size())  // size\n      .D32(symbols.start())              // file offset of symbols\n      .D32(3)                            // symbol count (too many)\n      .D32(strings.start())              // file offset of strings\n      .D32(strings.final_size());        // strings size\n\n  LoadCommands load_commands;\n  load_commands.Place(&symtab_command);\n\n  MachOFile file;\n  // Put symbols at end, so the excessive length will be noticed.\n  file.Header(&load_commands).Place(&strings).Place(&symbols);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  EXPECT_CALL(reporter, MisplacedSymbolTable()).Times(1);\n  EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));\n}\n\nTEST_F(Symtab, SymtabMisplacedStrings) {\n  WithConfiguration config(kLittleEndian, 32);\n\n  StringAssembler strings;\n  SymbolAssembler symbols(&strings);\n  symbols\n      .Symbol(0xa7, 0xaf, 0x03af, 0x42f3072c74335181ULL, \"foo\")\n      .Symbol(0xb0, 0x9a, 0x2aa7, 0x2e2d349b3d5744a0ULL, \"bar\");\n\n  SizedSection symtab_command;\n  symtab_command\n      .D32(LC_SYMTAB)                    // command\n      .D32(symtab_command.final_size())  // size\n      .D32(symbols.start())              // file offset of symbols\n      .D32(2)                            // symbol count\n      .D32(strings.start())              // file offset of strings\n      .D32(strings.final_size() + 1);    // strings size (too long)\n\n  LoadCommands load_commands;\n  load_commands.Place(&symtab_command);\n\n  MachOFile file;\n  // Put strings at end, so the excessive length will be noticed.\n  file.Header(&load_commands).Place(&symbols).Place(&strings);\n\n  ReadFile(&file, true, CPU_TYPE_ANY, 0);\n\n  EXPECT_CALL(reporter, MisplacedSymbolTable()).Times(1);\n  EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));\n}\n\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/macho_utilities.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// macho_utilties.cc: Utilities for dealing with mach-o files\n//\n// Author: Dave Camp\n\n#include \"common/mac/byteswap.h\"\n#include \"common/mac/macho_utilities.h\"\n\nvoid breakpad_swap_uuid_command(struct breakpad_uuid_command *uc,\n                                enum NXByteOrder target_byte_order)\n{\n  uc->cmd = ByteSwap(uc->cmd);\n  uc->cmdsize = ByteSwap(uc->cmdsize);\n}\n\nvoid breakpad_swap_segment_command_64(struct segment_command_64 *sg,\n                                      enum NXByteOrder target_byte_order)\n{\n  sg->cmd = ByteSwap(sg->cmd);\n  sg->cmdsize = ByteSwap(sg->cmdsize);\n\n  sg->vmaddr = ByteSwap(sg->vmaddr);\n  sg->vmsize = ByteSwap(sg->vmsize);\n  sg->fileoff = ByteSwap(sg->fileoff);\n  sg->filesize = ByteSwap(sg->filesize);\n\n  sg->maxprot = ByteSwap(sg->maxprot);\n  sg->initprot = ByteSwap(sg->initprot);\n  sg->nsects = ByteSwap(sg->nsects);\n  sg->flags = ByteSwap(sg->flags);\n}\n\nvoid breakpad_swap_mach_header_64(struct mach_header_64 *mh,\n                                  enum NXByteOrder target_byte_order)\n{\n  mh->magic = ByteSwap(mh->magic);\n  mh->cputype = ByteSwap(mh->cputype);\n  mh->cpusubtype = ByteSwap(mh->cpusubtype);\n  mh->filetype = ByteSwap(mh->filetype);\n  mh->ncmds = ByteSwap(mh->ncmds);\n  mh->sizeofcmds = ByteSwap(mh->sizeofcmds);\n  mh->flags = ByteSwap(mh->flags);\n  mh->reserved = ByteSwap(mh->reserved);\n}\n\nvoid breakpad_swap_section_64(struct section_64 *s,\n                              uint32_t nsects,\n                              enum NXByteOrder target_byte_order)\n{\n  for (uint32_t i = 0; i < nsects; i++) {\n    s[i].addr = ByteSwap(s[i].addr);\n    s[i].size = ByteSwap(s[i].size);\n\n    s[i].offset = ByteSwap(s[i].offset);\n    s[i].align = ByteSwap(s[i].align);\n    s[i].reloff = ByteSwap(s[i].reloff);\n    s[i].nreloc = ByteSwap(s[i].nreloc);\n    s[i].flags = ByteSwap(s[i].flags);\n    s[i].reserved1 = ByteSwap(s[i].reserved1);\n    s[i].reserved2 = ByteSwap(s[i].reserved2);\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/macho_utilities.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// macho_utilities.h: Utilities for dealing with mach-o files\n//\n// Author: Dave Camp\n\n#ifndef COMMON_MAC_MACHO_UTILITIES_H__\n#define COMMON_MAC_MACHO_UTILITIES_H__\n\n#include <mach-o/loader.h>\n#include <mach/thread_status.h>\n\n/* Some #defines and structs that aren't defined in older SDKs */\n#ifndef CPU_ARCH_ABI64\n# define CPU_ARCH_ABI64    0x01000000\n#endif\n\n#ifndef CPU_TYPE_X86\n# define CPU_TYPE_X86 CPU_TYPE_I386\n#endif\n\n#ifndef CPU_TYPE_POWERPC64\n# define CPU_TYPE_POWERPC64 (CPU_TYPE_POWERPC | CPU_ARCH_ABI64)\n#endif\n\n#ifndef LC_UUID\n# define LC_UUID         0x1b    /* the uuid */\n#endif\n\n#if TARGET_CPU_X86\n# define BREAKPAD_MACHINE_THREAD_STATE i386_THREAD_STATE\n#elif TARGET_CPU_X86_64\n# define BREAKPAD_MACHINE_THREAD_STATE x86_THREAD_STATE64\n#else\n# define BREAKPAD_MACHINE_THREAD_STATE MACHINE_THREAD_STATE\n#endif\n\n// The uuid_command struct/swap routines were added during the 10.4 series.\n// Their presence isn't guaranteed.\nstruct breakpad_uuid_command {\n  uint32_t    cmd;            /* LC_UUID */\n  uint32_t    cmdsize;        /* sizeof(struct uuid_command) */\n  uint8_t     uuid[16];       /* the 128-bit uuid */\n};\n\nvoid breakpad_swap_uuid_command(struct breakpad_uuid_command *uc,\n                                enum NXByteOrder target_byte_order);\n\n// Older SDKs defines thread_state_data_t as an int[] instead\n// of the natural_t[] it should be.\ntypedef natural_t breakpad_thread_state_data_t[THREAD_STATE_MAX];\n\n// The 64-bit swap routines were added during the 10.4 series, their\n// presence isn't guaranteed.\nvoid breakpad_swap_segment_command_64(struct segment_command_64 *sg,\n                                      enum NXByteOrder target_byte_order);\n\nvoid breakpad_swap_mach_header_64(struct mach_header_64 *mh,\n                                  enum NXByteOrder target_byte_order);\n\nvoid breakpad_swap_section_64(struct section_64 *s,\n                              uint32_t nsects,\n                              enum NXByteOrder target_byte_order);\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/macho_walker.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// macho_walker.cc: Iterate over the load commands in a mach-o file\n//\n// See macho_walker.h for documentation\n//\n// Author: Dan Waylonis\n\nextern \"C\" {  // necessary for Leopard\n  #include <assert.h>\n  #include <fcntl.h>\n  #include <mach-o/arch.h>\n  #include <mach-o/loader.h>\n  #include <mach-o/swap.h>\n  #include <string.h>\n  #include <unistd.h>\n}\n\n#include \"common/mac/byteswap.h\"\n#include \"common/mac/macho_walker.h\"\n#include \"common/mac/macho_utilities.h\"\n\nnamespace MacFileUtilities {\n\nMachoWalker::MachoWalker(const char *path, LoadCommandCallback callback,\n                         void *context)\n    : file_(0),\n      memory_(NULL),\n      memory_size_(0),\n      callback_(callback),\n      callback_context_(context),\n      current_header_(NULL),\n      current_header_size_(0),\n      current_header_offset_(0) {\n  file_ = open(path, O_RDONLY);\n}\n\nMachoWalker::MachoWalker(void *memory, size_t size,\n                         LoadCommandCallback callback, void *context)\n    : file_(0),\n      memory_(memory),\n      memory_size_(size),\n      callback_(callback),\n      callback_context_(context),\n      current_header_(NULL),\n      current_header_size_(0),\n      current_header_offset_(0) {\n}\n\nMachoWalker::~MachoWalker() {\n  if (file_ != -1)\n    close(file_);\n}\n\nint MachoWalker::ValidateCPUType(int cpu_type) {\n  // If the user didn't specify, use the local architecture.\n  if (cpu_type == 0) {\n    const NXArchInfo *arch = NXGetLocalArchInfo();\n    assert(arch);\n    cpu_type = arch->cputype;\n  }\n\n  return cpu_type;\n}\n\nbool MachoWalker::WalkHeader(int cpu_type) {\n  int valid_cpu_type = ValidateCPUType(cpu_type);\n  off_t offset;\n  if (FindHeader(valid_cpu_type, offset)) {\n    if (cpu_type & CPU_ARCH_ABI64)\n      return WalkHeader64AtOffset(offset);\n\n    return WalkHeaderAtOffset(offset);\n  }\n\n  return false;\n}\n\nbool MachoWalker::ReadBytes(void *buffer, size_t size, off_t offset) {\n  if (memory_) {\n    if (offset < 0)\n      return false;\n    bool result = true;\n    if (offset + size > memory_size_) {\n      if (static_cast<size_t>(offset) >= memory_size_)\n        return false;\n      size = memory_size_ - offset;\n      result = false;\n    }\n    memcpy(buffer, static_cast<char *>(memory_) + offset, size);\n    return result;\n  } else {\n    return pread(file_, buffer, size, offset) == (ssize_t)size;\n  }\n}\n\nbool MachoWalker::CurrentHeader(struct mach_header_64 *header, off_t *offset) {\n  if (current_header_) {\n    memcpy(header, current_header_, sizeof(mach_header_64));\n    *offset = current_header_offset_;\n    return true;\n  }\n\n  return false;\n}\n\nbool MachoWalker::FindHeader(int cpu_type, off_t &offset) {\n  int valid_cpu_type = ValidateCPUType(cpu_type);\n  // Read the magic bytes that's common amongst all mach-o files\n  uint32_t magic;\n  if (!ReadBytes(&magic, sizeof(magic), 0))\n    return false;\n\n  offset = sizeof(magic);\n\n  // Figure out what type of file we've got\n  bool is_fat = false;\n  if (magic == FAT_MAGIC || magic == FAT_CIGAM) {\n    is_fat = true;\n  }\n  else if (magic != MH_MAGIC && magic != MH_CIGAM && magic != MH_MAGIC_64 &&\n           magic != MH_CIGAM_64) {\n    return false;\n  }\n\n  if (!is_fat) {\n    // If we don't have a fat header, check if the cpu type matches the single\n    // header\n    cpu_type_t header_cpu_type;\n    if (!ReadBytes(&header_cpu_type, sizeof(header_cpu_type), offset))\n      return false;\n\n    if (magic == MH_CIGAM || magic == MH_CIGAM_64)\n      header_cpu_type = ByteSwap(header_cpu_type);\n\n    if (valid_cpu_type != header_cpu_type)\n      return false;\n\n    offset = 0;\n    return true;\n  } else {\n    // Read the fat header and find an appropriate architecture\n    offset = 0;\n    struct fat_header fat;\n    if (!ReadBytes(&fat, sizeof(fat), offset))\n      return false;\n\n    if (NXHostByteOrder() != NX_BigEndian)\n      swap_fat_header(&fat, NXHostByteOrder());\n\n    offset += sizeof(fat);\n\n    // Search each architecture for the desired one\n    struct fat_arch arch;\n    for (uint32_t i = 0; i < fat.nfat_arch; ++i) {\n      if (!ReadBytes(&arch, sizeof(arch), offset))\n        return false;\n\n      if (NXHostByteOrder() != NX_BigEndian)\n        swap_fat_arch(&arch, 1, NXHostByteOrder());\n\n      if (arch.cputype == valid_cpu_type) {\n        offset = arch.offset;\n        return true;\n      }\n\n      offset += sizeof(arch);\n    }\n  }\n\n  return false;\n}\n\nbool MachoWalker::WalkHeaderAtOffset(off_t offset) {\n  struct mach_header header;\n  if (!ReadBytes(&header, sizeof(header), offset))\n    return false;\n\n  bool swap = (header.magic == MH_CIGAM);\n  if (swap)\n    swap_mach_header(&header, NXHostByteOrder());\n\n  // Copy the data into the mach_header_64 structure.  Since the 32-bit and\n  // 64-bit only differ in the last field (reserved), this is safe to do.\n  struct mach_header_64 header64;\n  memcpy((void *)&header64, (const void *)&header, sizeof(header));\n  header64.reserved = 0;\n\n  current_header_ = &header64;\n  current_header_size_ = sizeof(header); // 32-bit, not 64-bit\n  current_header_offset_ = offset;\n  offset += current_header_size_;\n  bool result = WalkHeaderCore(offset, header.ncmds, swap);\n  current_header_ = NULL;\n  current_header_size_ = 0;\n  current_header_offset_ = 0;\n  return result;\n}\n\nbool MachoWalker::WalkHeader64AtOffset(off_t offset) {\n  struct mach_header_64 header;\n  if (!ReadBytes(&header, sizeof(header), offset))\n    return false;\n\n  bool swap = (header.magic == MH_CIGAM_64);\n  if (swap)\n    breakpad_swap_mach_header_64(&header, NXHostByteOrder());\n\n  current_header_ = &header;\n  current_header_size_ = sizeof(header);\n  current_header_offset_ = offset;\n  offset += current_header_size_;\n  bool result = WalkHeaderCore(offset, header.ncmds, swap);\n  current_header_ = NULL;\n  current_header_size_ = 0;\n  current_header_offset_ = 0;\n  return result;\n}\n\nbool MachoWalker::WalkHeaderCore(off_t offset, uint32_t number_of_commands,\n                                 bool swap) {\n  for (uint32_t i = 0; i < number_of_commands; ++i) {\n    struct load_command cmd;\n    if (!ReadBytes(&cmd, sizeof(cmd), offset))\n      return false;\n\n    if (swap)\n      swap_load_command(&cmd, NXHostByteOrder());\n\n    // Call the user callback\n    if (callback_ && !callback_(this, &cmd, offset, swap, callback_context_))\n      break;\n\n    offset += cmd.cmdsize;\n  }\n\n  return true;\n}\n\n}  // namespace MacFileUtilities\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/macho_walker.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// macho_walker.h: Iterate over the load commands in a mach-o file\n//\n// Author: Dan Waylonis\n\n#ifndef COMMON_MAC_MACHO_WALKER_H__\n#define COMMON_MAC_MACHO_WALKER_H__\n\n#include <mach-o/loader.h>\n#include <sys/types.h>\n\nnamespace MacFileUtilities {\n\nclass MachoWalker {\n public:\n  // A callback function executed when a new load command is read.  If no\n  // further processing of load commands is desired, return false.  Otherwise,\n  // return true.\n  // |cmd| is the current command, and |offset| is the location relative to the\n  // beginning of the file (not header) where the command was read.  If |swap|\n  // is set, then any command data (other than the returned load_command) should\n  // be swapped when read\n  typedef bool (*LoadCommandCallback)(MachoWalker *walker, load_command *cmd,\n                                      off_t offset, bool swap, void *context);\n\n  MachoWalker(const char *path, LoadCommandCallback callback, void *context);\n  MachoWalker(void *memory, size_t size, LoadCommandCallback callback,\n              void *context);\n  ~MachoWalker();\n\n  // Begin walking the header for |cpu_type|.  If |cpu_type| is 0, then the\n  // native cpu type is used.  Otherwise, accepted values are listed in\n  // /usr/include/mach/machine.h (e.g., CPU_TYPE_X86 or CPU_TYPE_POWERPC).\n  // Returns false if opening the file failed or if the |cpu_type| is not\n  // present in the file.\n  bool WalkHeader(int cpu_type);\n\n  // Locate (if any) the header offset for |cpu_type| and return in |offset|.\n  // Return true if found, false otherwise.\n  bool FindHeader(int cpu_type, off_t &offset);\n\n  // Read |size| bytes from the opened file at |offset| into |buffer|\n  bool ReadBytes(void *buffer, size_t size, off_t offset);\n\n  // Return the current header and header offset\n  bool CurrentHeader(struct mach_header_64 *header, off_t *offset);\n\n private:\n  // Validate the |cpu_type|\n  int ValidateCPUType(int cpu_type);\n\n  // Process an individual header starting at |offset| from the start of the\n  // file.  Return true if successful, false otherwise.\n  bool WalkHeaderAtOffset(off_t offset);\n  bool WalkHeader64AtOffset(off_t offset);\n\n  // Bottleneck for walking the load commands\n  bool WalkHeaderCore(off_t offset, uint32_t number_of_commands, bool swap);\n\n  // File descriptor to the opened file\n  int file_;\n\n  // Memory location to read from.\n  void *memory_;\n\n  // Size of the memory segment we can read from.\n  size_t memory_size_;\n\n  // User specified callback & context\n  LoadCommandCallback callback_;\n  void *callback_context_;\n\n  // Current header, size, and offset.  The mach_header_64 is used for both\n  // 32-bit and 64-bit headers because they only differ in their last field\n  // (reserved).  By adding the |current_header_size_| and the\n  // |current_header_offset_|, you can determine the offset in the file just\n  // after the header.\n  struct mach_header_64 *current_header_;\n  unsigned long current_header_size_;\n  off_t current_header_offset_;\n\n private:\n  MachoWalker(const MachoWalker &);\n  MachoWalker &operator=(const MachoWalker &);\n};\n\n}  // namespace MacFileUtilities\n\n#endif  // COMMON_MAC_MACHO_WALKER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/scoped_task_suspend-inl.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Inline implementation of ScopedTaskSuspend, which suspends a Mach\n// task for the duration of its scope.\n\n#ifndef GOOGLE_BREAKPAD_COMMON_MAC_SCOPED_TASK_SUSPEND_H_\n#define GOOGLE_BREAKPAD_COMMON_MAC_SCOPED_TASK_SUSPEND_H_\n\n#include <mach/mach.h>\n\nnamespace google_breakpad {\n\nclass ScopedTaskSuspend {\n public:\n  explicit ScopedTaskSuspend(mach_port_t target) : target_(target) {\n    task_suspend(target_);\n  }\n\n  ~ScopedTaskSuspend() {\n    task_resume(target_);\n  }\n\n private:\n  mach_port_t target_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_COMMON_MAC_SCOPED_TASK_SUSPEND_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/string_utilities.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"processor/scoped_ptr.h\"\n#include \"common/mac/string_utilities.h\"\n\nnamespace MacStringUtils {\n\nusing google_breakpad::scoped_array;\n\nstd::string ConvertToString(CFStringRef str) {\n  CFIndex length = CFStringGetLength(str);\n  std::string result;\n\n  if (!length)\n    return result;\n\n  CFIndex maxUTF8Length =\n    CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8);\n  scoped_array<UInt8> buffer(new UInt8[maxUTF8Length + 1]);\n  CFIndex actualUTF8Length;\n  CFStringGetBytes(str, CFRangeMake(0, length), kCFStringEncodingUTF8, 0,\n                   false, buffer.get(), maxUTF8Length, &actualUTF8Length);\n  buffer[actualUTF8Length] = 0;\n  result.assign((const char *)buffer.get());\n\n  return result;\n}\n\nunsigned int IntegerValueAtIndex(string &str, unsigned int idx) {\n  string digits(\"0123456789\"), temp;\n  size_t start = 0;\n  size_t end;\n  size_t found = 0;\n  unsigned int result = 0;\n\n  for (; found <= idx; ++found) {\n    end = str.find_first_not_of(digits, start);\n\n    if (end == string::npos)\n      end = str.size();\n\n    temp = str.substr(start, end - start);\n\n    if (found == idx) {\n      result = atoi(temp.c_str());\n    }\n\n    start = str.find_first_of(digits, end + 1);\n\n    if (start == string::npos)\n      break;\n  }\n\n  return result;\n}\n\n}  // namespace MacStringUtils\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/string_utilities.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// string_utilities.h: Utilities for strings for Mac platform\n\n#ifndef COMMON_MAC_STRING_UTILITIES_H__\n#define COMMON_MAC_STRING_UTILITIES_H__\n\n#include <CoreFoundation/CoreFoundation.h>\n\n#include <string>\n\nnamespace MacStringUtils {\n\nusing std::string;\n\n// Convert a CoreFoundation string into a std::string\nstring ConvertToString(CFStringRef str);\n\n// Return the idx'th decimal integer in str, separated by non-decimal-digits\n// E.g., str = 10.4.8, idx = 1 -> 4\nunsigned int IntegerValueAtIndex(string &str, unsigned int idx);\n\n}  // namespace MacStringUtils\n\n#endif  // COMMON_MAC_STRING_UTILITIES_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/testing/GTMSenTestCase.h",
    "content": "//\n//  GTMSenTestCase.h\n//\n//  Copyright 2007-2008 Google Inc.\n//\n//  Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n//  use this file except in compliance with the License.  You may obtain a copy\n//  of the License at\n// \n//  http://www.apache.org/licenses/LICENSE-2.0\n// \n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the\n//  License for the specific language governing permissions and limitations under\n//  the License.\n//\n\n// Portions of this file fall under the following license, marked with\n// SENTE_BEGIN - SENTE_END\n//\n// Copyright (c) 1997-2005, Sen:te (Sente SA).  All rights reserved.\n//\n// Use of this source code is governed by the following license:\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// \n// (1) Redistributions of source code must retain the above copyright notice, \n// this list of conditions and the following disclaimer.\n// \n// (2) Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation \n// and/or other materials provided with the distribution.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' \n// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL Sente SA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n// OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) \n// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, \n// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, \n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// \n// Note: this license is equivalent to the FreeBSD license.\n// \n// This notice may not be removed from this file.\n\n// Some extra test case macros that would have been convenient for SenTestingKit \n// to provide. I didn't stick GTM in front of the Macro names, so that they would \n// be easy to remember.\n\n#import \"GTMDefines.h\"\n\n#if (!GTM_IPHONE_SDK) \n#import <SenTestingKit/SenTestingKit.h>\n#else\n#import <Foundation/Foundation.h>\nNSString *STComposeString(NSString *, ...);\n#endif\n\n// Generates a failure when a1 != noErr\n//  Args:\n//    a1: should be either an OSErr or an OSStatus\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertNoErr(a1, description, ...) \\\ndo { \\\n  @try {\\\n    OSStatus a1value = (a1); \\\n    if (a1value != noErr) { \\\n      NSString *_expression = [NSString stringWithFormat:@\"Expected noErr, got %ld for (%s)\", a1value, #a1]; \\\n      if (description) { \\\n        _expression = [NSString stringWithFormat:@\"%@: %@\", _expression, STComposeString(description, ##__VA_ARGS__)]; \\\n      } \\\n      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                  atLine:__LINE__ \\\n                                         withDescription:_expression]]; \\\n    } \\\n  }\\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@\"(%s) == noErr fails\", #a1] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n// Generates a failure when a1 != a2\n//  Args:\n//    a1: received value. Should be either an OSErr or an OSStatus\n//    a2: expected value. Should be either an OSErr or an OSStatus\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertErr(a1, a2, description, ...) \\\ndo { \\\n  @try {\\\n    OSStatus a1value = (a1); \\\n    OSStatus a2value = (a2); \\\n    if (a1value != a2value) { \\\n      NSString *_expression = [NSString stringWithFormat:@\"Expected %s(%ld) but got %ld for (%s)\", #a2, a2value, a1value, #a1]; \\\n      if (description) { \\\n        _expression = [NSString stringWithFormat:@\"%@: %@\", _expression, STComposeString(description, ##__VA_ARGS__)]; \\\n      } \\\n      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                  atLine:__LINE__ \\\n                                         withDescription:_expression]]; \\\n    } \\\n  }\\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@\"(%s) == (%s) fails\", #a1, #a2] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n\n// Generates a failure when a1 is NULL\n//  Args:\n//    a1: should be a pointer (use STAssertNotNil for an object)\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertNotNULL(a1, description, ...) \\\ndo { \\\n  @try {\\\n    const void* a1value = (a1); \\\n    if (a1value == NULL) { \\\n      NSString *_expression = [NSString stringWithFormat:@\"(%s) != NULL\", #a1]; \\\n      if (description) { \\\n        _expression = [NSString stringWithFormat:@\"%@: %@\", _expression, STComposeString(description, ##__VA_ARGS__)]; \\\n      } \\\n      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                  atLine:__LINE__ \\\n                                         withDescription:_expression]]; \\\n    } \\\n  }\\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@\"(%s) != NULL fails\", #a1] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n// Generates a failure when a1 is not NULL\n//  Args:\n//    a1: should be a pointer (use STAssertNil for an object)\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertNULL(a1, description, ...) \\\ndo { \\\n  @try {\\\n    const void* a1value = (a1); \\\n    if (a1value != NULL) { \\\n      NSString *_expression = [NSString stringWithFormat:@\"(%s) == NULL\", #a1]; \\\n      if (description) { \\\n        _expression = [NSString stringWithFormat:@\"%@: %@\", _expression, STComposeString(description, ##__VA_ARGS__)]; \\\n      } \\\n      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                  atLine:__LINE__ \\\n                                         withDescription:_expression]]; \\\n    } \\\n  }\\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@\"(%s) == NULL fails\", #a1] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n// Generates a failure when a1 is equal to a2. This test is for C scalars, \n// structs and unions.\n//  Args:\n//    a1: argument 1\n//    a2: argument 2\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertNotEquals(a1, a2, description, ...) \\\ndo { \\\n  @try {\\\n    if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \\\n      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                  atLine:__LINE__ \\\n                                         withDescription:[[[NSString stringWithFormat:@\"Type mismatch (%@/%@) -- \",@encode(__typeof__(a1)),@encode(__typeof__(a2))] stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \\\n    } else { \\\n      __typeof__(a1) a1value = (a1); \\\n      __typeof__(a2) a2value = (a2); \\\n      NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \\\n      NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \\\n      if ([a1encoded isEqualToValue:a2encoded]) { \\\n        NSString *_expression = [NSString stringWithFormat:@\"(%s) != (%s)\", #a1, #a2]; \\\n        if (description) { \\\n          _expression = [NSString stringWithFormat:@\"%@: %@\", _expression, STComposeString(description, ##__VA_ARGS__)]; \\\n        } \\\n        [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                    atLine:__LINE__ \\\n                                          withDescription:_expression]]; \\\n      } \\\n    } \\\n  } \\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@\"(%s) != (%s)\", #a1, #a2] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n            withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n// Generates a failure when a1 is equal to a2. This test is for objects.\n//  Args:\n//    a1: argument 1. object.\n//    a2: argument 2. object.\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertNotEqualObjects(a1, a2, desc, ...) \\\ndo { \\\n  @try {\\\n    id a1value = (a1); \\\n    id a2value = (a2); \\\n    if ( (@encode(__typeof__(a1value)) == @encode(id)) && \\\n         (@encode(__typeof__(a2value)) == @encode(id)) && \\\n         ![(id)a1value isEqual:(id)a2value] ) continue; \\\n         NSString *_expression = [NSString stringWithFormat:@\"%s('%@') != %s('%@')\", #a1, [a1 description], #a2, [a2 description]]; \\\n         if (desc) { \\\n           _expression = [NSString stringWithFormat:@\"%@: %@\", _expression, STComposeString(desc, ##__VA_ARGS__)]; \\\n         } \\\n         [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                     atLine:__LINE__ \\\n                                            withDescription:_expression]]; \\\n  }\\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @\"(%s) != (%s)\", #a1, #a2] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(desc, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n// Generates a failure when a1 is not 'op' to a2. This test is for C scalars. \n//  Args:\n//    a1: argument 1\n//    a2: argument 2\n//    op: operation\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertOperation(a1, a2, op, description, ...) \\\ndo { \\\n  @try {\\\n    if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \\\n      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                  atLine:__LINE__ \\\n                                         withDescription:[[[NSString stringWithFormat:@\"Type mismatch (%@/%@) -- \",@encode(__typeof__(a1)),@encode(__typeof__(a2))] stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \\\n    } else { \\\n      __typeof__(a1) a1value = (a1); \\\n      __typeof__(a2) a2value = (a2); \\\n      if (!(a1value op a2value)) { \\\n        double a1DoubleValue = a1value; \\\n        double a2DoubleValue = a2value; \\\n        NSString *_expression = [NSString stringWithFormat:@\"%s (%lg) %s %s (%lg)\", #a1, a1DoubleValue, #op, #a2, a2DoubleValue]; \\\n        if (description) { \\\n          _expression = [NSString stringWithFormat:@\"%@: %@\", _expression, STComposeString(description, ##__VA_ARGS__)]; \\\n        } \\\n        [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                    atLine:__LINE__ \\\n                                           withDescription:_expression]]; \\\n      } \\\n    } \\\n  } \\\n  @catch (id anException) {\\\n    [self failWithException:[NSException \\\n             failureInRaise:[NSString stringWithFormat:@\"(%s) %s (%s)\", #a1, #op, #a2] \\\n                  exception:anException \\\n                     inFile:[NSString stringWithUTF8String:__FILE__] \\\n                     atLine:__LINE__ \\\n            withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n// Generates a failure when a1 is not > a2. This test is for C scalars. \n//  Args:\n//    a1: argument 1\n//    a2: argument 2\n//    op: operation\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertGreaterThan(a1, a2, description, ...) \\\n  STAssertOperation(a1, a2, >, description, ##__VA_ARGS__)\n\n// Generates a failure when a1 is not >= a2. This test is for C scalars. \n//  Args:\n//    a1: argument 1\n//    a2: argument 2\n//    op: operation\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertGreaterThanOrEqual(a1, a2, description, ...) \\\n  STAssertOperation(a1, a2, >=, description, ##__VA_ARGS__)\n\n// Generates a failure when a1 is not < a2. This test is for C scalars. \n//  Args:\n//    a1: argument 1\n//    a2: argument 2\n//    op: operation\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertLessThan(a1, a2, description, ...) \\\n  STAssertOperation(a1, a2, <, description, ##__VA_ARGS__)\n\n// Generates a failure when a1 is not <= a2. This test is for C scalars. \n//  Args:\n//    a1: argument 1\n//    a2: argument 2\n//    op: operation\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertLessThanOrEqual(a1, a2, description, ...) \\\n  STAssertOperation(a1, a2, <=, description, ##__VA_ARGS__)\n\n// Generates a failure when string a1 is not equal to string a2. This call\n// differs from STAssertEqualObjects in that strings that are different in\n// composition (precomposed vs decomposed) will compare equal if their final\n// representation is equal.\n// ex O + umlaut decomposed is the same as O + umlaut composed.\n//  Args:\n//    a1: string 1\n//    a2: string 2\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertEqualStrings(a1, a2, description, ...) \\\ndo { \\\n  @try {\\\n    id a1value = (a1); \\\n    id a2value = (a2); \\\n    if (a1value == a2value) continue; \\\n    if ([a1value isKindOfClass:[NSString class]] && \\\n        [a2value isKindOfClass:[NSString class]] && \\\n        [a1value compare:a2value options:0] == NSOrderedSame) continue; \\\n     [self failWithException:[NSException failureInEqualityBetweenObject: a1value \\\n                                                               andObject: a2value \\\n                                                                  inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                                  atLine: __LINE__ \\\n                                                         withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @\"(%s) == (%s)\", #a1, #a2] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n// Generates a failure when string a1 is equal to string a2. This call\n// differs from STAssertEqualObjects in that strings that are different in\n// composition (precomposed vs decomposed) will compare equal if their final\n// representation is equal.\n// ex O + umlaut decomposed is the same as O + umlaut composed.\n//  Args:\n//    a1: string 1\n//    a2: string 2\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertNotEqualStrings(a1, a2, description, ...) \\\ndo { \\\n  @try {\\\n    id a1value = (a1); \\\n    id a2value = (a2); \\\n    if ([a1value isKindOfClass:[NSString class]] && \\\n        [a2value isKindOfClass:[NSString class]] && \\\n        [a1value compare:a2value options:0] != NSOrderedSame) continue; \\\n     [self failWithException:[NSException failureInEqualityBetweenObject: a1value \\\n                                                               andObject: a2value \\\n                                                                  inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                                  atLine: __LINE__ \\\n                                                         withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @\"(%s) != (%s)\", #a1, #a2] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n// Generates a failure when c-string a1 is not equal to c-string a2.\n//  Args:\n//    a1: string 1\n//    a2: string 2\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertEqualCStrings(a1, a2, description, ...) \\\ndo { \\\n  @try {\\\n    const char* a1value = (a1); \\\n    const char* a2value = (a2); \\\n    if (a1value == a2value) continue; \\\n    if (strcmp(a1value, a2value) == 0) continue; \\\n    [self failWithException:[NSException failureInEqualityBetweenObject: [NSString stringWithUTF8String:a1value] \\\n                                                              andObject: [NSString stringWithUTF8String:a2value] \\\n                                                                 inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                                 atLine: __LINE__ \\\n                                                        withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @\"(%s) == (%s)\", #a1, #a2] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n// Generates a failure when c-string a1 is equal to c-string a2.\n//  Args:\n//    a1: string 1\n//    a2: string 2\n//    description: A format string as in the printf() function. Can be nil or\n//                 an empty string but must be present.\n//    ...: A variable number of arguments to the format string. Can be absent.\n#define STAssertNotEqualCStrings(a1, a2, description, ...) \\\ndo { \\\n  @try {\\\n    const char* a1value = (a1); \\\n    const char* a2value = (a2); \\\n    if (strcmp(a1value, a2value) != 0) continue; \\\n    [self failWithException:[NSException failureInEqualityBetweenObject: [NSString stringWithUTF8String:a1value] \\\n                                                              andObject: [NSString stringWithUTF8String:a2value] \\\n                                                                 inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                                 atLine: __LINE__ \\\n                                                        withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @\"(%s) != (%s)\", #a1, #a2] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n#if GTM_IPHONE_SDK\n\n// SENTE_BEGIN\n/*\" Generates a failure when !{ [a1 isEqualTo:a2] } is false \n\t(or one is nil and the other is not). \n\t_{a1    The object on the left.}\n\t_{a2    The object on the right.}\n\t_{description A format string as in the printf() function. Can be nil or\n\t\tan empty string but must be present.}\n\t_{... A variable number of arguments to the format string. Can be absent.}\n\"*/\n#define STAssertEqualObjects(a1, a2, description, ...) \\\ndo { \\\n  @try {\\\n    id a1value = (a1); \\\n    id a2value = (a2); \\\n    if (a1value == a2value) continue; \\\n    if ( (@encode(__typeof__(a1value)) == @encode(id)) && \\\n         (@encode(__typeof__(a2value)) == @encode(id)) && \\\n         [(id)a1value isEqual: (id)a2value] ) continue; \\\n    [self failWithException:[NSException failureInEqualityBetweenObject: a1value \\\n                                                              andObject: a2value \\\n                                                                 inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                                 atLine: __LINE__ \\\n                                                        withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @\"(%s) == (%s)\", #a1, #a2] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n\n/*\" Generates a failure when a1 is not equal to a2. This test is for\n    C scalars, structs and unions.\n    _{a1    The argument on the left.}\n    _{a2    The argument on the right.}\n    _{description A format string as in the printf() function. Can be nil or\n                        an empty string but must be present.}\n    _{... A variable number of arguments to the format string. Can be absent.}\n\"*/\n#define STAssertEquals(a1, a2, description, ...) \\\ndo { \\\n  @try {\\\n    if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \\\n      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                                                 atLine:__LINE__ \\\n\t\t\t       withDescription:[[NSString stringWithFormat:@\"Type mismatch (%@/%@) -- \",@encode(__typeof__(a1)),@encode(__typeof__(a2))] stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \\\n    } else { \\\n      __typeof__(a1) a1value = (a1); \\\n      __typeof__(a2) a2value = (a2); \\\n      NSValue *a1encoded = [NSValue value:&a1value withObjCType: @encode(__typeof__(a1))]; \\\n      NSValue *a2encoded = [NSValue value:&a2value withObjCType: @encode(__typeof__(a2))]; \\\n      if (![a1encoded isEqualToValue:a2encoded]) { \\\n        [self failWithException:[NSException failureInEqualityBetweenValue: a1encoded \\\n                                                                  andValue: a2encoded \\\n                                                              withAccuracy: nil \\\n                                                                    inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                                    atLine: __LINE__ \\\n                                                           withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n      } \\\n    } \\\n  } \\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @\"(%s) == (%s)\", #a1, #a2] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n#define STAbsoluteDifference(left,right) (MAX(left,right)-MIN(left,right))\n\n\n/*\" Generates a failure when a1 is not equal to a2 within + or - accuracy is false. \n  This test is for scalars such as floats and doubles where small differences \n  could make these items not exactly equal, but also works for all scalars.\n  _{a1    The scalar on the left.}\n  _{a2    The scalar on the right.}\n  _{accuracy  The maximum difference between a1 and a2 for these values to be\n  considered equal.}\n  _{description A format string as in the printf() function. Can be nil or\n                      an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.}\n\"*/\n\n#define STAssertEqualsWithAccuracy(a1, a2, accuracy, description, ...) \\\ndo { \\\n  @try {\\\n    if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \\\n      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                                                 atLine:__LINE__ \\\n                                                                        withDescription:[[[NSString stringWithFormat:@\"Type mismatch (%@/%@) -- \",@encode(__typeof__(a1)),@encode(__typeof__(a2))] stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \\\n    } else { \\\n      __typeof__(a1) a1value = (a1); \\\n      __typeof__(a2) a2value = (a2); \\\n      __typeof__(accuracy) accuracyvalue = (accuracy); \\\n      if (STAbsoluteDifference(a1value, a2value) > accuracyvalue) { \\\n              NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \\\n              NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \\\n              NSValue *accuracyencoded = [NSValue value:&accuracyvalue withObjCType:@encode(__typeof__(accuracy))]; \\\n              [self failWithException:[NSException failureInEqualityBetweenValue: a1encoded \\\n                                                                        andValue: a2encoded \\\n                                                                    withAccuracy: accuracyencoded \\\n                                                                          inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                                          atLine: __LINE__ \\\n                                                                 withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n      } \\\n    } \\\n  } \\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @\"(%s) == (%s)\", #a1, #a2] \\\n                                                                         exception:anException \\\n                                                                            inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                                            atLine:__LINE__ \\\n                                                                   withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n\n\n/*\" Generates a failure unconditionally. \n  _{description A format string as in the printf() function. Can be nil or\n                      an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.}\n\"*/\n#define STFail(description, ...) \\\n[self failWithException:[NSException failureInFile: [NSString stringWithUTF8String:__FILE__] \\\n                                            atLine: __LINE__ \\\n                                   withDescription: STComposeString(description, ##__VA_ARGS__)]]\n\n\n\n/*\" Generates a failure when a1 is not nil.\n  _{a1    An object.}\n  _{description A format string as in the printf() function. Can be nil or\n    an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.}\n\"*/\n#define STAssertNil(a1, description, ...) \\\ndo { \\\n  @try {\\\n    id a1value = (a1); \\\n    if (a1value != nil) { \\\n      NSString *_a1 = [NSString stringWithUTF8String: #a1]; \\\n      NSString *_expression = [NSString stringWithFormat:@\"((%@) == nil)\", _a1]; \\\n      [self failWithException:[NSException failureInCondition: _expression \\\n                                                       isTrue: NO \\\n                                                       inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                       atLine: __LINE__ \\\n                                              withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n    } \\\n  }\\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @\"(%s) == nil fails\", #a1] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n\n/*\" Generates a failure when a1 is nil.\n  _{a1    An object.}\n  _{description A format string as in the printf() function. Can be nil or\n  an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.}\n\"*/\n#define STAssertNotNil(a1, description, ...) \\\ndo { \\\n  @try {\\\n    id a1value = (a1); \\\n    if (a1value == nil) { \\\n      NSString *_a1 = [NSString stringWithUTF8String: #a1]; \\\n      NSString *_expression = [NSString stringWithFormat:@\"((%@) != nil)\", _a1]; \\\n      [self failWithException:[NSException failureInCondition: _expression \\\n                                                       isTrue: NO \\\n                                                       inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                       atLine: __LINE__ \\\n                                              withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n    } \\\n  }\\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @\"(%s) != nil fails\", #a1] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while(0)\n\n\n/*\" Generates a failure when expression evaluates to false. \n  _{expr    The expression that is tested.}\n  _{description A format string as in the printf() function. Can be nil or\n  an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.}\n\"*/\n#define STAssertTrue(expr, description, ...) \\\ndo { \\\n  BOOL _evaluatedExpression = (expr);\\\n  if (!_evaluatedExpression) {\\\n    NSString *_expression = [NSString stringWithUTF8String: #expr];\\\n    [self failWithException:[NSException failureInCondition: _expression \\\n                                                     isTrue: NO \\\n                                                     inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                     atLine: __LINE__ \\\n                                            withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n  } \\\n} while (0)\n\n\n/*\" Generates a failure when expression evaluates to false and in addition will \n  generate error messages if an exception is encountered. \n  _{expr    The expression that is tested.}\n  _{description A format string as in the printf() function. Can be nil or\n  an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.}\n\"*/\n#define STAssertTrueNoThrow(expr, description, ...) \\\ndo { \\\n  @try {\\\n    BOOL _evaluatedExpression = (expr);\\\n    if (!_evaluatedExpression) {\\\n      NSString *_expression = [NSString stringWithUTF8String: #expr];\\\n      [self failWithException:[NSException failureInCondition: _expression \\\n                                                       isTrue: NO \\\n                                                       inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                       atLine: __LINE__ \\\n                                              withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n    } \\\n  } \\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @\"(%s) \", #expr] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while (0)\n\n\n/*\" Generates a failure when the expression evaluates to true. \n  _{expr    The expression that is tested.}\n  _{description A format string as in the printf() function. Can be nil or\n  an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.}\n\"*/\n#define STAssertFalse(expr, description, ...) \\\ndo { \\\n  BOOL _evaluatedExpression = (expr);\\\n  if (_evaluatedExpression) {\\\n    NSString *_expression = [NSString stringWithUTF8String: #expr];\\\n    [self failWithException:[NSException failureInCondition: _expression \\\n                                                     isTrue: YES \\\n                                                     inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                     atLine: __LINE__ \\\n                                            withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n  } \\\n} while (0)\n\n\n/*\" Generates a failure when the expression evaluates to true and in addition \n  will generate error messages if an exception is encountered.\n  _{expr    The expression that is tested.}\n  _{description A format string as in the printf() function. Can be nil or\n  an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.}\n\"*/\n#define STAssertFalseNoThrow(expr, description, ...) \\\ndo { \\\n  @try {\\\n    BOOL _evaluatedExpression = (expr);\\\n    if (_evaluatedExpression) {\\\n      NSString *_expression = [NSString stringWithUTF8String: #expr];\\\n      [self failWithException:[NSException failureInCondition: _expression \\\n                                                       isTrue: YES \\\n                                                       inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                       atLine: __LINE__ \\\n                                              withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n    } \\\n  } \\\n  @catch (id anException) {\\\n    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @\"!(%s) \", #expr] \\\n                                              exception:anException \\\n                                                 inFile:[NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine:__LINE__ \\\n                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while (0)\n\n\n/*\" Generates a failure when expression does not throw an exception. \n  _{expression    The expression that is evaluated.}\n  _{description A format string as in the printf() function. Can be nil or\n  an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.\n\"*/\n#define STAssertThrows(expr, description, ...) \\\ndo { \\\n  @try { \\\n    (expr);\\\n  } \\\n  @catch (id anException) { \\\n    continue; \\\n  }\\\n  [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \\\n                                            exception: nil \\\n                                               inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                               atLine: __LINE__ \\\n                                      withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n} while (0)\n\n\n/*\" Generates a failure when expression does not throw an exception of a \n  specific class. \n  _{expression    The expression that is evaluated.}\n  _{specificException    The specified class of the exception.}\n  _{description A format string as in the printf() function. Can be nil or\n  an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.}\n\"*/\n#define STAssertThrowsSpecific(expr, specificException, description, ...) \\\ndo { \\\n  @try { \\\n    (expr);\\\n  } \\\n  @catch (specificException *anException) { \\\n    continue; \\\n  }\\\n  @catch (id anException) {\\\n    NSString *_descrip = STComposeString(@\"(Expected exception: %@) %@\", NSStringFromClass([specificException class]), description);\\\n    [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \\\n                                              exception: anException \\\n                                                 inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine: __LINE__ \\\n                                        withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \\\n                                            continue; \\\n  }\\\n  NSString *_descrip = STComposeString(@\"(Expected exception: %@) %@\", NSStringFromClass([specificException class]), description);\\\n  [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \\\n                                            exception: nil \\\n                                               inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                               atLine: __LINE__ \\\n                                      withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \\\n} while (0)\n\n\n/*\" Generates a failure when expression does not throw an exception of a \n  specific class with a specific name.  Useful for those frameworks like\n  AppKit or Foundation that throw generic NSException w/specific names \n  (NSInvalidArgumentException, etc).\n  _{expression    The expression that is evaluated.}\n  _{specificException    The specified class of the exception.}\n  _{aName    The name of the specified exception.}\n  _{description A format string as in the printf() function. Can be nil or\n  an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.}\n\n\"*/\n#define STAssertThrowsSpecificNamed(expr, specificException, aName, description, ...) \\\ndo { \\\n  @try { \\\n    (expr);\\\n  } \\\n  @catch (specificException *anException) { \\\n    if ([aName isEqualToString: [anException name]]) continue; \\\n    NSString *_descrip = STComposeString(@\"(Expected exception: %@ (name: %@)) %@\", NSStringFromClass([specificException class]), aName, description);\\\n    [self failWithException: \\\n      [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \\\n                        exception: anException \\\n                           inFile: [NSString stringWithUTF8String:__FILE__] \\\n                           atLine: __LINE__ \\\n                  withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \\\n    continue; \\\n  }\\\n  @catch (id anException) {\\\n    NSString *_descrip = STComposeString(@\"(Expected exception: %@) %@\", NSStringFromClass([specificException class]), description);\\\n    [self failWithException: \\\n      [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \\\n                        exception: anException \\\n                           inFile: [NSString stringWithUTF8String:__FILE__] \\\n                           atLine: __LINE__ \\\n                  withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \\\n    continue; \\\n  }\\\n  NSString *_descrip = STComposeString(@\"(Expected exception: %@) %@\", NSStringFromClass([specificException class]), description);\\\n  [self failWithException: \\\n    [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \\\n                      exception: nil \\\n                         inFile: [NSString stringWithUTF8String:__FILE__] \\\n                         atLine: __LINE__ \\\n                withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \\\n} while (0)\n\n\n/*\" Generates a failure when expression does throw an exception. \n  _{expression    The expression that is evaluated.}\n  _{description A format string as in the printf() function. Can be nil or\n  an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.}\n\"*/\n#define STAssertNoThrow(expr, description, ...) \\\ndo { \\\n  @try { \\\n    (expr);\\\n  } \\\n  @catch (id anException) { \\\n    [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \\\n                                              exception: anException \\\n                                                 inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine: __LINE__ \\\n                                        withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n} while (0)\n\n\n/*\" Generates a failure when expression does throw an exception of the specitied\n  class. Any other exception is okay (i.e. does not generate a failure).\n  _{expression    The expression that is evaluated.}\n  _{specificException    The specified class of the exception.}\n  _{description A format string as in the printf() function. Can be nil or\n  an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.}\n\"*/\n#define STAssertNoThrowSpecific(expr, specificException, description, ...) \\\ndo { \\\n  @try { \\\n    (expr);\\\n  } \\\n  @catch (specificException *anException) { \\\n    [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \\\n                                              exception: anException \\\n                                                 inFile: [NSString stringWithUTF8String:__FILE__] \\\n                                                 atLine: __LINE__ \\\n                                        withDescription: STComposeString(description, ##__VA_ARGS__)]]; \\\n  }\\\n  @catch (id anythingElse) {\\\n    ; \\\n  }\\\n} while (0)\n\n\n/*\" Generates a failure when expression does throw an exception of a \n  specific class with a specific name.  Useful for those frameworks like\n  AppKit or Foundation that throw generic NSException w/specific names \n  (NSInvalidArgumentException, etc).\n  _{expression    The expression that is evaluated.}\n  _{specificException    The specified class of the exception.}\n  _{aName    The name of the specified exception.}\n  _{description A format string as in the printf() function. Can be nil or\n  an empty string but must be present.}\n  _{... A variable number of arguments to the format string. Can be absent.}\n\n\"*/\n#define STAssertNoThrowSpecificNamed(expr, specificException, aName, description, ...) \\\ndo { \\\n  @try { \\\n    (expr);\\\n  } \\\n  @catch (specificException *anException) { \\\n    if ([aName isEqualToString: [anException name]]) { \\\n      NSString *_descrip = STComposeString(@\"(Expected exception: %@ (name: %@)) %@\", NSStringFromClass([specificException class]), aName, description);\\\n      [self failWithException: \\\n        [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \\\n                          exception: anException \\\n                             inFile: [NSString stringWithUTF8String:__FILE__] \\\n                             atLine: __LINE__ \\\n                    withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \\\n    } \\\n    continue; \\\n  }\\\n  @catch (id anythingElse) {\\\n    ; \\\n  }\\\n} while (0)\n\n\n\n@interface NSException (GTMSenTestAdditions)\n+ (NSException *)failureInFile:(NSString *)filename \n                        atLine:(int)lineNumber \n               withDescription:(NSString *)formatString, ...;\n+ (NSException *)failureInCondition:(NSString *)condition \n                             isTrue:(BOOL)isTrue \n                             inFile:(NSString *)filename \n                             atLine:(int)lineNumber \n                    withDescription:(NSString *)formatString, ...;\n+ (NSException *)failureInEqualityBetweenObject:(id)left\n                                      andObject:(id)right\n                                         inFile:(NSString *)filename\n                                         atLine:(int)lineNumber\n                                withDescription:(NSString *)formatString, ...;\n+ (NSException *)failureInEqualityBetweenValue:(NSValue *)left \n                                      andValue:(NSValue *)right \n                                  withAccuracy:(NSValue *)accuracy \n                                        inFile:(NSString *)filename \n                                        atLine:(int) ineNumber\n                               withDescription:(NSString *)formatString, ...;\n+ (NSException *)failureInRaise:(NSString *)expression \n                         inFile:(NSString *)filename \n                         atLine:(int)lineNumber\n                withDescription:(NSString *)formatString, ...;\n+ (NSException *)failureInRaise:(NSString *)expression \n                      exception:(NSException *)exception \n                         inFile:(NSString *)filename \n                         atLine:(int)lineNumber \n                withDescription:(NSString *)formatString, ...;\n@end\n\n// SENTE_END\n\n@interface SenTestCase : NSObject {\n  SEL currentSelector_;\n}\n\n- (void)setUp;\n- (void)invokeTest;\n- (void)tearDown;\n- (void)performTest:(SEL)sel;\n- (void)failWithException:(NSException*)exception;\n@end\n\nGTM_EXTERN NSString *const SenTestFailureException;\n\nGTM_EXTERN NSString *const SenTestFilenameKey;\nGTM_EXTERN NSString *const SenTestLineNumberKey;\n\n#endif // GTM_IPHONE_SDK\n\n// All unittest cases in GTM should inherit from GTMTestCase. It makes sure\n// to set up our logging system correctly to verify logging calls.\n// See GTMUnitTestDevLog.h for details\n@interface GTMTestCase : SenTestCase\n@end\n"
  },
  {
    "path": "archive/spotify/breakpad/common/mac/testing/GTMSenTestCase.m",
    "content": "//\n//  GTMSenTestCase.m\n//\n//  Copyright 2007-2008 Google Inc.\n//\n//  Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n//  use this file except in compliance with the License.  You may obtain a copy\n//  of the License at\n//\n//  http://www.apache.org/licenses/LICENSE-2.0\n//\n//  Unless required by applicable law or agreed to in writing, software\n//  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the\n//  License for the specific language governing permissions and limitations under\n//  the License.\n//\n\n#import \"GTMSenTestCase.h\"\n#import <unistd.h>\n\n#if !GTM_IPHONE_SDK\n#import \"GTMGarbageCollection.h\"\n#endif  // !GTM_IPHONE_SDK\n\n#if GTM_IPHONE_SDK\n#import <stdarg.h>\n\n@interface NSException (GTMSenTestPrivateAdditions)\n+ (NSException *)failureInFile:(NSString *)filename\n                        atLine:(int)lineNumber\n                        reason:(NSString *)reason;\n@end\n\n@implementation NSException (GTMSenTestPrivateAdditions)\n+ (NSException *)failureInFile:(NSString *)filename\n                        atLine:(int)lineNumber\n                        reason:(NSString *)reason {\n  NSDictionary *userInfo =\n    [NSDictionary dictionaryWithObjectsAndKeys:\n     [NSNumber numberWithInteger:lineNumber], SenTestLineNumberKey,\n     filename, SenTestFilenameKey,\n     nil];\n\n  return [self exceptionWithName:SenTestFailureException\n                          reason:reason\n                        userInfo:userInfo];\n}\n@end\n\n@implementation NSException (GTMSenTestAdditions)\n\n+ (NSException *)failureInFile:(NSString *)filename\n                        atLine:(int)lineNumber\n               withDescription:(NSString *)formatString, ... {\n\n  NSString *testDescription = @\"\";\n  if (formatString) {\n    va_list vl;\n    va_start(vl, formatString);\n    testDescription =\n      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];\n    va_end(vl);\n  }\n\n  NSString *reason = testDescription;\n\n  return [self failureInFile:filename atLine:lineNumber reason:reason];\n}\n\n+ (NSException *)failureInCondition:(NSString *)condition\n                             isTrue:(BOOL)isTrue\n                             inFile:(NSString *)filename\n                             atLine:(int)lineNumber\n                    withDescription:(NSString *)formatString, ... {\n\n  NSString *testDescription = @\"\";\n  if (formatString) {\n    va_list vl;\n    va_start(vl, formatString);\n    testDescription =\n      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];\n    va_end(vl);\n  }\n\n  NSString *reason = [NSString stringWithFormat:@\"'%@' should be %s. %@\",\n                      condition, isTrue ? \"TRUE\" : \"FALSE\", testDescription];\n\n  return [self failureInFile:filename atLine:lineNumber reason:reason];\n}\n\n+ (NSException *)failureInEqualityBetweenObject:(id)left\n                                      andObject:(id)right\n                                         inFile:(NSString *)filename\n                                         atLine:(int)lineNumber\n                                withDescription:(NSString *)formatString, ... {\n\n  NSString *testDescription = @\"\";\n  if (formatString) {\n    va_list vl;\n    va_start(vl, formatString);\n    testDescription =\n      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];\n    va_end(vl);\n  }\n\n  NSString *reason =\n    [NSString stringWithFormat:@\"'%@' should be equal to '%@'. %@\",\n     [left description], [right description], testDescription];\n\n  return [self failureInFile:filename atLine:lineNumber reason:reason];\n}\n\n+ (NSException *)failureInEqualityBetweenValue:(NSValue *)left\n                                      andValue:(NSValue *)right\n                                  withAccuracy:(NSValue *)accuracy\n                                        inFile:(NSString *)filename\n                                        atLine:(int)lineNumber\n                               withDescription:(NSString *)formatString, ... {\n\n  NSString *testDescription = @\"\";\n  if (formatString) {\n    va_list vl;\n    va_start(vl, formatString);\n    testDescription =\n      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];\n    va_end(vl);\n  }\n\n  NSString *reason;\n  if (accuracy) {\n    reason =\n      [NSString stringWithFormat:@\"'%@' should be equal to '%@'. %@\",\n       left, right, testDescription];\n  } else {\n    reason =\n      [NSString stringWithFormat:@\"'%@' should be equal to '%@' +/-'%@'. %@\",\n       left, right, accuracy, testDescription];\n  }\n\n  return [self failureInFile:filename atLine:lineNumber reason:reason];\n}\n\n+ (NSException *)failureInRaise:(NSString *)expression\n                         inFile:(NSString *)filename\n                         atLine:(int)lineNumber\n                withDescription:(NSString *)formatString, ... {\n\n  NSString *testDescription = @\"\";\n  if (formatString) {\n    va_list vl;\n    va_start(vl, formatString);\n    testDescription =\n      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];\n    va_end(vl);\n  }\n\n  NSString *reason = [NSString stringWithFormat:@\"'%@' should raise. %@\",\n                      expression, testDescription];\n\n  return [self failureInFile:filename atLine:lineNumber reason:reason];\n}\n\n+ (NSException *)failureInRaise:(NSString *)expression\n                      exception:(NSException *)exception\n                         inFile:(NSString *)filename\n                         atLine:(int)lineNumber\n                withDescription:(NSString *)formatString, ... {\n\n  NSString *testDescription = @\"\";\n  if (formatString) {\n    va_list vl;\n    va_start(vl, formatString);\n    testDescription =\n      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];\n    va_end(vl);\n  }\n\n  NSString *reason;\n  if ([[exception name] isEqualToString:SenTestFailureException]) {\n    // it's our exception, assume it has the right description on it.\n    reason = [exception reason];\n  } else {\n    // not one of our exception, use the exceptions reason and our description\n    reason = [NSString stringWithFormat:@\"'%@' raised '%@'. %@\",\n              expression, [exception reason], testDescription];\n  }\n\n  return [self failureInFile:filename atLine:lineNumber reason:reason];\n}\n\n@end\n\nNSString *STComposeString(NSString *formatString, ...) {\n  NSString *reason = @\"\";\n  if (formatString) {\n    va_list vl;\n    va_start(vl, formatString);\n    reason =\n      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];\n    va_end(vl);\n  }\n  return reason;\n}\n\nNSString *const SenTestFailureException = @\"SenTestFailureException\";\nNSString *const SenTestFilenameKey = @\"SenTestFilenameKey\";\nNSString *const SenTestLineNumberKey = @\"SenTestLineNumberKey\";\n\n@interface SenTestCase (SenTestCasePrivate)\n// our method of logging errors\n+ (void)printException:(NSException *)exception fromTestName:(NSString *)name;\n@end\n\n@implementation SenTestCase\n- (void)failWithException:(NSException*)exception {\n  [exception raise];\n}\n\n- (void)setUp {\n}\n\n- (void)performTest:(SEL)sel {\n  currentSelector_ = sel;\n  @try {\n    [self invokeTest];\n  } @catch (NSException *exception) {\n    [[self class] printException:exception\n                    fromTestName:NSStringFromSelector(sel)];\n    [exception raise];\n  }\n}\n\n+ (void)printException:(NSException *)exception fromTestName:(NSString *)name {\n  NSDictionary *userInfo = [exception userInfo];\n  NSString *filename = [userInfo objectForKey:SenTestFilenameKey];\n  NSNumber *lineNumber = [userInfo objectForKey:SenTestLineNumberKey];\n  NSString *className = NSStringFromClass([self class]);\n  if ([filename length] == 0) {\n    filename = @\"Unknown.m\";\n  }\n  fprintf(stderr, \"%s:%ld: error: -[%s %s] : %s\\n\",\n          [filename UTF8String],\n          (long)[lineNumber integerValue],\n          [className UTF8String],\n          [name UTF8String],\n          [[exception reason] UTF8String]);\n  fflush(stderr);\n}\n\n- (void)invokeTest {\n  NSException *e = nil;\n  @try {\n    // Wrap things in autorelease pools because they may\n    // have an STMacro in their dealloc which may get called\n    // when the pool is cleaned up\n    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n    // We don't log exceptions here, instead we let the person that called\n    // this log the exception.  This ensures they are only logged once but the\n    // outer layers get the exceptions to report counts, etc.\n    @try {\n      [self setUp];\n      @try {\n        [self performSelector:currentSelector_];\n      } @catch (NSException *exception) {\n        e = [exception retain];\n      }\n      [self tearDown];\n    } @catch (NSException *exception) {\n      e = [exception retain];\n    }\n    [pool release];\n  } @catch (NSException *exception) {\n    e = [exception retain];\n  }\n  if (e) {\n    [e autorelease];\n    [e raise];\n  }\n}\n\n- (void)tearDown {\n}\n\n- (NSString *)description {\n  // This matches the description OCUnit would return to you\n  return [NSString stringWithFormat:@\"-[%@ %@]\", [self class], \n          NSStringFromSelector(currentSelector_)];\n}\n@end\n\n#endif  // GTM_IPHONE_SDK\n\n@implementation GTMTestCase : SenTestCase\n- (void)invokeTest {\n  Class devLogClass = NSClassFromString(@\"GTMUnitTestDevLog\");\n  if (devLogClass) {\n    [devLogClass performSelector:@selector(enableTracking)];\n    [devLogClass performSelector:@selector(verifyNoMoreLogsExpected)];\n\n  }\n  [super invokeTest];\n  if (devLogClass) {\n    [devLogClass performSelector:@selector(verifyNoMoreLogsExpected)];\n    [devLogClass performSelector:@selector(disableTracking)];\n  }\n}\n@end\n\n// Leak detection\n#if !GTM_IPHONE_DEVICE\n// Don't want to get leaks on the iPhone Device as the device doesn't\n// have 'leaks'. The simulator does though.\n\n// COV_NF_START\n// We don't have leak checking on by default, so this won't be hit.\nstatic void _GTMRunLeaks(void) {\n  // This is an atexit handler. It runs leaks for us to check if we are \n  // leaking anything in our tests. \n  const char* cExclusionsEnv = getenv(\"GTM_LEAKS_SYMBOLS_TO_IGNORE\");\n  NSMutableString *exclusions = [NSMutableString string];\n  if (cExclusionsEnv) {\n    NSString *exclusionsEnv = [NSString stringWithUTF8String:cExclusionsEnv];\n    NSArray *exclusionsArray = [exclusionsEnv componentsSeparatedByString:@\",\"];\n    NSString *exclusion;\n    NSCharacterSet *wcSet = [NSCharacterSet whitespaceCharacterSet];\n    GTM_FOREACH_OBJECT(exclusion, exclusionsArray) {\n      exclusion = [exclusion stringByTrimmingCharactersInSet:wcSet];\n      [exclusions appendFormat:@\"-exclude \\\"%@\\\" \", exclusion];\n    }\n  }\n  NSString *string \n    = [NSString stringWithFormat:@\"/usr/bin/leaks %@%d\"\n       @\"| /usr/bin/sed -e 's/Leak: /Leaks:0: warning: Leak /'\", \n       exclusions, getpid()];\n  int ret = system([string UTF8String]);\n  if (ret) {\n    fprintf(stderr, \"%s:%d: Error: Unable to run leaks. 'system' returned: %d\", \n            __FILE__, __LINE__, ret);\n    fflush(stderr);\n  }\n}\n// COV_NF_END\n\nstatic __attribute__((constructor)) void _GTMInstallLeaks(void) {\n  BOOL checkLeaks = YES;\n#if !GTM_IPHONE_SDK\n  checkLeaks = GTMIsGarbageCollectionEnabled() ? NO : YES;\n#endif  // !GTM_IPHONE_SDK\n  if (checkLeaks) {\n    checkLeaks = getenv(\"GTM_ENABLE_LEAKS\") ? YES : NO;\n    if (checkLeaks) {\n      // COV_NF_START\n      // We don't have leak checking on by default, so this won't be hit.\n      fprintf(stderr, \"Leak Checking Enabled\\n\");\n      fflush(stderr);\n      int ret = atexit(&_GTMRunLeaks);\n      _GTMDevAssert(ret == 0, \n                    @\"Unable to install _GTMRunLeaks as an atexit handler (%d)\", \n                    errno);\n      // COV_NF_END\n    }  \n  }\n}\n\n#endif   // !GTM_IPHONE_DEVICE\n"
  },
  {
    "path": "archive/spotify/breakpad/common/md5.cc",
    "content": "/*\n * written by Colin Plumb in 1993, no copyright is claimed.\n * This code is in the public domain; do with it what you wish.\n *\n * Equivalent code is available from RSA Data Security, Inc.\n * This code has been tested against that, and is equivalent,\n * except that you don't need to include two pages of legalese\n * with every copy.\n *\n * To compute the message digest of a chunk of bytes, declare an\n * MD5Context structure, pass it to MD5Init, call MD5Update as\n * needed on buffers full of bytes, and then call MD5Final, which\n * will fill a supplied 16-byte array with the digest.\n */\n\n#include <string.h>\n\n#include \"common/md5.h\"\n\nnamespace google_breakpad {\n\n#ifndef WORDS_BIGENDIAN\n#define byteReverse(buf, len)   /* Nothing */\n#else\n/*\n * Note: this code is harmless on little-endian machines.\n */\nstatic void byteReverse(unsigned char *buf, unsigned longs)\n{\n  u32 t;\n  do {\n    t = (u32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |\n      ((unsigned) buf[1] << 8 | buf[0]);\n    *(u32 *) buf = t;\n    buf += 4;\n  } while (--longs);\n}\n#endif\n\nstatic void MD5Transform(u32 buf[4], u32 const in[16]);\n\n/*\n * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious\n * initialization constants.\n */\nvoid MD5Init(struct MD5Context *ctx)\n{\n  ctx->buf[0] = 0x67452301;\n  ctx->buf[1] = 0xefcdab89;\n  ctx->buf[2] = 0x98badcfe;\n  ctx->buf[3] = 0x10325476;\n\n  ctx->bits[0] = 0;\n  ctx->bits[1] = 0;\n}\n\n/*\n * Update context to reflect the concatenation of another buffer full\n * of bytes.\n */\nvoid MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len)\n{\n  u32 t;\n\n  /* Update bitcount */\n\n  t = ctx->bits[0];\n  if ((ctx->bits[0] = t + ((u32) len << 3)) < t)\n    ctx->bits[1]++;         /* Carry from low to high */\n  ctx->bits[1] += len >> 29;\n\n  t = (t >> 3) & 0x3f;        /* Bytes already in shsInfo->data */\n\n  /* Handle any leading odd-sized chunks */\n\n  if (t) {\n    unsigned char *p = (unsigned char *) ctx->in + t;\n\n    t = 64 - t;\n    if (len < t) {\n      memcpy(p, buf, len);\n      return;\n    }\n    memcpy(p, buf, t);\n    byteReverse(ctx->in, 16);\n    MD5Transform(ctx->buf, (u32 *) ctx->in);\n    buf += t;\n    len -= t;\n  }\n  /* Process data in 64-byte chunks */\n\n  while (len >= 64) {\n    memcpy(ctx->in, buf, 64);\n    byteReverse(ctx->in, 16);\n    MD5Transform(ctx->buf, (u32 *) ctx->in);\n    buf += 64;\n    len -= 64;\n  }\n\n  /* Handle any remaining bytes of data. */\n\n  memcpy(ctx->in, buf, len);\n}\n\n/*\n * Final wrapup - pad to 64-byte boundary with the bit pattern\n * 1 0* (64-bit count of bits processed, MSB-first)\n */\nvoid MD5Final(unsigned char digest[16], struct MD5Context *ctx)\n{\n  unsigned count;\n  unsigned char *p;\n\n  /* Compute number of bytes mod 64 */\n  count = (ctx->bits[0] >> 3) & 0x3F;\n\n  /* Set the first char of padding to 0x80.  This is safe since there is\n     always at least one byte free */\n  p = ctx->in + count;\n  *p++ = 0x80;\n\n  /* Bytes of padding needed to make 64 bytes */\n  count = 64 - 1 - count;\n\n  /* Pad out to 56 mod 64 */\n  if (count < 8) {\n    /* Two lots of padding:  Pad the first block to 64 bytes */\n    memset(p, 0, count);\n    byteReverse(ctx->in, 16);\n    MD5Transform(ctx->buf, (u32 *) ctx->in);\n\n    /* Now fill the next block with 56 bytes */\n    memset(ctx->in, 0, 56);\n  } else {\n    /* Pad block to 56 bytes */\n    memset(p, 0, count - 8);\n  }\n  byteReverse(ctx->in, 14);\n\n  /* Append length in bits and transform */\n  ((u32 *) ctx->in)[14] = ctx->bits[0];\n  ((u32 *) ctx->in)[15] = ctx->bits[1];\n\n  MD5Transform(ctx->buf, (u32 *) ctx->in);\n  byteReverse((unsigned char *) ctx->buf, 4);\n  memcpy(digest, ctx->buf, 16);\n  memset(ctx, 0, sizeof(*ctx));        /* In case it's sensitive */\n}\n\n/* The four core functions - F1 is optimized somewhat */\n\n/* #define F1(x, y, z) (x & y | ~x & z) */\n#define F1(x, y, z) (z ^ (x & (y ^ z)))\n#define F2(x, y, z) F1(z, x, y)\n#define F3(x, y, z) (x ^ y ^ z)\n#define F4(x, y, z) (y ^ (x | ~z))\n\n/* This is the central step in the MD5 algorithm. */\n#define MD5STEP(f, w, x, y, z, data, s) \\\n  ( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )\n\n/*\n * The core of the MD5 algorithm, this alters an existing MD5 hash to\n * reflect the addition of 16 longwords of new data.  MD5Update blocks\n * the data and converts bytes into longwords for this routine.\n */\nstatic void MD5Transform(u32 buf[4], u32 const in[16])\n{\n  register u32 a, b, c, d;\n\n  a = buf[0];\n  b = buf[1];\n  c = buf[2];\n  d = buf[3];\n\n  MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);\n  MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);\n  MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);\n  MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);\n  MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);\n  MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);\n  MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);\n  MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);\n  MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);\n  MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);\n  MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);\n  MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);\n  MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);\n  MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);\n  MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);\n  MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);\n\n  MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);\n  MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);\n  MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);\n  MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);\n  MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);\n  MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);\n  MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);\n  MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);\n  MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);\n  MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);\n  MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);\n  MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);\n  MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);\n  MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);\n  MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);\n  MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);\n\n  MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);\n  MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);\n  MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);\n  MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);\n  MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);\n  MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);\n  MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);\n  MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);\n  MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);\n  MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);\n  MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);\n  MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);\n  MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);\n  MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);\n  MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);\n  MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);\n\n  MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);\n  MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);\n  MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);\n  MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);\n  MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);\n  MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);\n  MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);\n  MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);\n  MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);\n  MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);\n  MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);\n  MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);\n  MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);\n  MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);\n  MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);\n  MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);\n\n  buf[0] += a;\n  buf[1] += b;\n  buf[2] += c;\n  buf[3] += d;\n}\n\n}  // namespace google_breakpad\n\n"
  },
  {
    "path": "archive/spotify/breakpad/common/md5.h",
    "content": "// Copyright 2007 Google Inc. All Rights Reserved.\n// Author: liuli@google.com (Liu Li)\n#ifndef COMMON_MD5_H__\n#define COMMON_MD5_H__\n\n#include <stdint.h>\n\nnamespace google_breakpad {\n\ntypedef uint32_t u32;\ntypedef uint8_t u8;\n\nstruct MD5Context {\n  u32 buf[4];\n  u32 bits[2];\n  u8 in[64];\n};\n\nvoid MD5Init(struct MD5Context *ctx);\n\nvoid MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len);\n\nvoid MD5Final(unsigned char digest[16], struct MD5Context *ctx);\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_MD5_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/memory.h",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef GOOGLE_BREAKPAD_COMMON_MEMORY_H_\n#define GOOGLE_BREAKPAD_COMMON_MEMORY_H_\n\n#include <stdint.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <sys/mman.h>\n\n#ifdef __APPLE__\n#define sys_mmap mmap\n#define sys_mmap2 mmap\n#define sys_munmap munmap\n#define MAP_ANONYMOUS MAP_ANON\n#else\n#include \"third_party/lss/linux_syscall_support.h\"\n#endif\n\nnamespace google_breakpad {\n\n// This is very simple allocator which fetches pages from the kernel directly.\n// Thus, it can be used even when the heap may be corrupted.\n//\n// There is no free operation. The pages are only freed when the object is\n// destroyed.\nclass PageAllocator {\n public:\n  PageAllocator()\n      : page_size_(getpagesize()),\n        last_(NULL),\n        current_page_(NULL),\n        page_offset_(0) {\n  }\n\n  ~PageAllocator() {\n    FreeAll();\n  }\n\n  void *Alloc(unsigned bytes) {\n    if (!bytes)\n      return NULL;\n\n    if (current_page_ && page_size_ - page_offset_ >= bytes) {\n      uint8_t *const ret = current_page_ + page_offset_;\n      page_offset_ += bytes;\n      if (page_offset_ == page_size_) {\n        page_offset_ = 0;\n        current_page_ = NULL;\n      }\n\n      return ret;\n    }\n\n    const unsigned pages =\n        (bytes + sizeof(PageHeader) + page_size_ - 1) / page_size_;\n    uint8_t *const ret = GetNPages(pages);\n    if (!ret)\n      return NULL;\n\n    page_offset_ = (page_size_ - (page_size_ * pages - (bytes + sizeof(PageHeader)))) % page_size_;\n    current_page_ = page_offset_ ? ret + page_size_ * (pages - 1) : NULL;\n\n    return ret + sizeof(PageHeader);\n  }\n\n private:\n  uint8_t *GetNPages(unsigned num_pages) {\n#ifdef __x86_64\n    void *a = sys_mmap(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE,\n                       MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n#else\n    void *a = sys_mmap2(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE,\n                        MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);\n#endif\n    if (a == MAP_FAILED)\n      return NULL;\n\n    struct PageHeader *header = reinterpret_cast<PageHeader*>(a);\n    header->next = last_;\n    header->num_pages = num_pages;\n    last_ = header;\n\n    return reinterpret_cast<uint8_t*>(a);\n  }\n\n  void FreeAll() {\n    PageHeader *next;\n\n    for (PageHeader *cur = last_; cur; cur = next) {\n      next = cur->next;\n      sys_munmap(cur, cur->num_pages * page_size_);\n    }\n  }\n\n  struct PageHeader {\n    PageHeader *next;  // pointer to the start of the next set of pages.\n    unsigned num_pages;  // the number of pages in this set.\n  };\n\n  const unsigned page_size_;\n  PageHeader *last_;\n  uint8_t *current_page_;\n  unsigned page_offset_;\n};\n\n// A wasteful vector is like a normal std::vector, except that it's very much\n// simplier and it allocates memory from a PageAllocator. It's wasteful\n// because, when resizing, it always allocates a whole new array since the\n// PageAllocator doesn't support realloc.\ntemplate<class T>\nclass wasteful_vector {\n public:\n  wasteful_vector(PageAllocator *allocator, unsigned size_hint = 16)\n      : allocator_(allocator),\n        a_((T*) allocator->Alloc(sizeof(T) * size_hint)),\n        allocated_(size_hint),\n        used_(0) {\n  }\n\n  T& back() {\n    return a_[used_ - 1];\n  }\n\n  const T& back() const {\n    return a_[used_ - 1];\n  }\n\n  bool empty() const {\n    return used_ == 0;\n  }\n\n  void push_back(const T& new_element) {\n    if (used_ == allocated_)\n      Realloc(allocated_ * 2);\n    a_[used_++] = new_element;\n  }\n\n  size_t size() const {\n    return used_;\n  }\n\n  void resize(unsigned sz, T c = T()) {\n    // No need to test \"sz >= 0\", as \"sz\" is unsigned.\n    if (sz <= used_) {\n      used_ = sz;\n    } else {\n      unsigned a = allocated_;\n      if (sz > a) {\n        while (sz > a) {\n          a *= 2;\n        }\n        Realloc(a);\n      }\n      while (sz > used_) {\n        a_[used_++] = c;\n      }\n    }\n  }\n\n  T& operator[](size_t index) {\n    return a_[index];\n  }\n\n  const T& operator[](size_t index) const {\n    return a_[index];\n  }\n\n private:\n  void Realloc(unsigned new_size) {\n    T *new_array =\n        reinterpret_cast<T*>(allocator_->Alloc(sizeof(T) * new_size));\n    memcpy(new_array, a_, used_ * sizeof(T));\n    a_ = new_array;\n    allocated_ = new_size;\n  }\n\n  PageAllocator *const allocator_;\n  T *a_;  // pointer to an array of |allocated_| elements.\n  unsigned allocated_;  // size of |a_|, in elements.\n  unsigned used_;  // number of used slots in |a_|.\n};\n\n}  // namespace google_breakpad\n\ninline void* operator new(size_t nbytes,\n                          google_breakpad::PageAllocator& allocator) {\n   return allocator.Alloc(nbytes);\n}\n\n#endif  // GOOGLE_BREAKPAD_COMMON_MEMORY_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/memory_range.h",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// memory_range.h: Define the google_breakpad::MemoryRange class, which\n// is a lightweight wrapper with a pointer and a length to encapsulate\n// a contiguous range of memory.\n\n#ifndef COMMON_MEMORY_RANGE_H_\n#define COMMON_MEMORY_RANGE_H_\n\n#include <stddef.h>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\nnamespace google_breakpad {\n\n// A lightweight wrapper with a pointer and a length to encapsulate a\n// contiguous range of memory. It provides helper methods for checked\n// access of a subrange of the memory. Its implemementation does not\n// allocate memory or call into libc functions, and is thus safer to use\n// in a crashed environment.\nclass MemoryRange {\n public:\n  MemoryRange() : data_(NULL), length_(0) {}\n\n  MemoryRange(const void* data, size_t length) {\n    Set(data, length);\n  }\n\n  // Returns true if this memory range contains no data.\n  bool IsEmpty() const {\n    // Set() guarantees that |length_| is zero if |data_| is NULL.\n    return length_ == 0;\n  }\n\n  // Resets to an empty range.\n  void Reset() {\n    data_ = NULL;\n    length_ = 0;\n  }\n\n  // Sets this memory range to point to |data| and its length to |length|.\n  void Set(const void* data, size_t length) {\n    data_ = reinterpret_cast<const u_int8_t*>(data);\n    // Always set |length_| to zero if |data_| is NULL.\n    length_ = data ? length : 0;\n  }\n\n  // Returns true if this range covers a subrange of |sub_length| bytes\n  // at |sub_offset| bytes of this memory range, or false otherwise.\n  bool Covers(size_t sub_offset, size_t sub_length) const {\n    // The following checks verify that:\n    // 1. sub_offset is within [ 0 .. length_ - 1 ]\n    // 2. sub_offset + sub_length is within\n    //    [ sub_offset .. length_ ]\n    return sub_offset < length_ &&\n           sub_offset + sub_length >= sub_offset &&\n           sub_offset + sub_length <= length_;\n  }\n\n  // Returns a raw data pointer to a subrange of |sub_length| bytes at\n  // |sub_offset| bytes of this memory range, or NULL if the subrange\n  // is out of bounds.\n  const void* GetData(size_t sub_offset, size_t sub_length) const {\n    return Covers(sub_offset, sub_length) ? (data_ + sub_offset) : NULL;\n  }\n\n  // Same as the two-argument version of GetData() but uses sizeof(DataType)\n  // as the subrange length and returns an |DataType| pointer for convenience.\n  template <typename DataType>\n  const DataType* GetData(size_t sub_offset) const {\n    return reinterpret_cast<const DataType*>(\n        GetData(sub_offset, sizeof(DataType)));\n  }\n\n  // Returns a raw pointer to the |element_index|-th element of an array\n  // of elements of length |element_size| starting at |sub_offset| bytes\n  // of this memory range, or NULL if the element is out of bounds.\n  const void* GetArrayElement(size_t element_offset,\n                              size_t element_size,\n                              unsigned element_index) const {\n    size_t sub_offset = element_offset + element_index * element_size;\n    return GetData(sub_offset, element_size);\n  }\n\n  // Same as the three-argument version of GetArrayElement() but deduces\n  // the element size using sizeof(ElementType) and returns an |ElementType|\n  // pointer for convenience.\n  template <typename ElementType>\n  const ElementType* GetArrayElement(size_t element_offset,\n                                     unsigned element_index) const {\n    return reinterpret_cast<const ElementType*>(\n        GetArrayElement(element_offset, sizeof(ElementType), element_index));\n  }\n\n  // Returns a subrange of |sub_length| bytes at |sub_offset| bytes of\n  // this memory range, or an empty range if the subrange is out of bounds.\n  MemoryRange Subrange(size_t sub_offset, size_t sub_length) const {\n    return Covers(sub_offset, sub_length) ?\n        MemoryRange(data_ + sub_offset, sub_length) : MemoryRange();\n  }\n\n  // Returns a pointer to the beginning of this memory range.\n  const u_int8_t* data() const { return data_; }\n\n  // Returns the length, in bytes, of this memory range.\n  size_t length() const { return length_; }\n\n private:\n  // Pointer to the beginning of this memory range.\n  const u_int8_t* data_;\n\n  // Length, in bytes, of this memory range.\n  size_t length_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_MEMORY_RANGE_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/memory_range_unittest.cc",
    "content": "// Copyright (c) 2011, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// memory_range_unittest.cc: Unit tests for google_breakpad::MemoryRange.\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/memory_range.h\"\n\nusing google_breakpad::MemoryRange;\nusing testing::Message;\n\nnamespace {\n\nconst u_int32_t kBuffer[10] = { 0 };\nconst size_t kBufferSize = sizeof(kBuffer);\nconst u_int8_t* kBufferPointer = reinterpret_cast<const u_int8_t*>(kBuffer);\n\n// Test vectors for verifying Covers, GetData, and Subrange.\nconst struct {\n  bool valid;\n  size_t offset;\n  size_t length;\n} kSubranges[] = {\n  { true, 0, 0 },\n  { true, 0, 2 },\n  { true, 0, kBufferSize },\n  { true, 2, 0 },\n  { true, 2, 4 },\n  { true, 2, kBufferSize - 2 },\n  { true, kBufferSize - 1, 1 },\n  { false, kBufferSize, 0 },\n  { false, kBufferSize, -1 },\n  { false, kBufferSize + 1, 0 },\n  { false, -1, 2 },\n  { false, 1, kBufferSize },\n  { false, kBufferSize - 1, 2 },\n  { false, 0, -1 },\n  { false, 1, -1 },\n};\nconst size_t kNumSubranges = sizeof(kSubranges) / sizeof(kSubranges[0]);\n\n// Test vectors for verifying GetArrayElement.\nconst struct {\n  size_t offset;\n  size_t size;\n  size_t index;\n  const void* const pointer;\n} kElements[] = {\n  // Valid array elemenets\n  { 0, 1, 0, kBufferPointer },\n  { 0, 1, 1, kBufferPointer + 1 },\n  { 0, 1, kBufferSize - 1, kBufferPointer + kBufferSize - 1 },\n  { 0, 2, 1, kBufferPointer + 2 },\n  { 0, 4, 2, kBufferPointer + 8 },\n  { 0, 4, 9, kBufferPointer + 36 },\n  { kBufferSize - 1, 1, 0, kBufferPointer + kBufferSize - 1 },\n  // Invalid array elemenets\n  { 0, 1, kBufferSize, NULL },\n  { 0, 4, 10, NULL },\n  { kBufferSize - 1, 1, 1, NULL },\n  { kBufferSize - 1, 2, 0, NULL },\n  { kBufferSize, 1, 0, NULL },\n};\nconst size_t kNumElements = sizeof(kElements) / sizeof(kElements[0]);\n\n}  // namespace\n\nTEST(MemoryRangeTest, DefaultConstructor) {\n  MemoryRange range;\n  EXPECT_EQ(NULL, range.data());\n  EXPECT_EQ(0, range.length());\n}\n\nTEST(MemoryRangeTest, ConstructorWithDataAndLength) {\n  MemoryRange range(kBuffer, kBufferSize);\n  EXPECT_EQ(kBufferPointer, range.data());\n  EXPECT_EQ(kBufferSize, range.length());\n}\n\nTEST(MemoryRangeTest, Reset) {\n  MemoryRange range;\n  range.Reset();\n  EXPECT_EQ(NULL, range.data());\n  EXPECT_EQ(0, range.length());\n\n  range.Set(kBuffer, kBufferSize);\n  EXPECT_EQ(kBufferPointer, range.data());\n  EXPECT_EQ(kBufferSize, range.length());\n\n  range.Reset();\n  EXPECT_EQ(NULL, range.data());\n  EXPECT_EQ(0, range.length());\n}\n\nTEST(MemoryRangeTest, Set) {\n  MemoryRange range;\n  range.Set(kBuffer, kBufferSize);\n  EXPECT_EQ(kBufferPointer, range.data());\n  EXPECT_EQ(kBufferSize, range.length());\n\n  range.Set(NULL, 0);\n  EXPECT_EQ(NULL, range.data());\n  EXPECT_EQ(0, range.length());\n}\n\nTEST(MemoryRangeTest, SubrangeOfEmptyMemoryRange) {\n  MemoryRange range;\n  MemoryRange subrange = range.Subrange(0, 10);\n  EXPECT_EQ(NULL, subrange.data());\n  EXPECT_EQ(0, subrange.length());\n}\n\nTEST(MemoryRangeTest, SubrangeAndGetData) {\n  MemoryRange range(kBuffer, kBufferSize);\n  for (size_t i = 0; i < kNumSubranges; ++i) {\n    bool valid = kSubranges[i].valid;\n    size_t sub_offset = kSubranges[i].offset;\n    size_t sub_length = kSubranges[i].length;\n    SCOPED_TRACE(Message() << \"offset=\" << sub_offset\n                 << \", length=\" << sub_length);\n\n    MemoryRange subrange = range.Subrange(sub_offset, sub_length);\n    if (valid) {\n      EXPECT_TRUE(range.Covers(sub_offset, sub_length));\n      EXPECT_EQ(kBufferPointer + sub_offset,\n                range.GetData(sub_offset, sub_length));\n      EXPECT_EQ(kBufferPointer + sub_offset, subrange.data());\n      EXPECT_EQ(sub_length, subrange.length());\n    } else {\n      EXPECT_FALSE(range.Covers(sub_offset, sub_length));\n      EXPECT_EQ(NULL, range.GetData(sub_offset, sub_length));\n      EXPECT_EQ(NULL, subrange.data());\n      EXPECT_EQ(0, subrange.length());\n    }\n  }\n}\n\nTEST(MemoryRangeTest, GetDataWithTemplateType) {\n  MemoryRange range(kBuffer, kBufferSize);\n  const char* char_pointer = range.GetData<char>(0);\n  EXPECT_EQ(reinterpret_cast<const char*>(kBufferPointer), char_pointer);\n  const int* int_pointer = range.GetData<int>(0);\n  EXPECT_EQ(reinterpret_cast<const int*>(kBufferPointer), int_pointer);\n}\n\nTEST(MemoryRangeTest, GetArrayElement) {\n  MemoryRange range(kBuffer, kBufferSize);\n  for (size_t i = 0; i < kNumElements; ++i) {\n    size_t element_offset = kElements[i].offset;\n    size_t element_size = kElements[i].size;\n    unsigned element_index = kElements[i].index;\n    const void* const element_pointer = kElements[i].pointer;\n    SCOPED_TRACE(Message() << \"offset=\" << element_offset\n                 << \", size=\" << element_size\n                 << \", index=\" << element_index);\n    EXPECT_EQ(element_pointer, range.GetArrayElement(\n        element_offset, element_size, element_index));\n  }\n}\n\nTEST(MemoryRangeTest, GetArrayElmentWithTemplateType) {\n  MemoryRange range(kBuffer, kBufferSize);\n  const char* char_pointer = range.GetArrayElement<char>(0, 0);\n  EXPECT_EQ(reinterpret_cast<const char*>(kBufferPointer), char_pointer);\n  const int* int_pointer = range.GetArrayElement<int>(0, 0);\n  EXPECT_EQ(reinterpret_cast<const int*>(kBufferPointer), int_pointer);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/memory_unittest.cc",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"common/memory.h\"\n#include \"testing/gtest/include/gtest/gtest.h\"\n\nusing namespace google_breakpad;\n\nnamespace {\ntypedef testing::Test PageAllocatorTest;\n}\n\nTEST(PageAllocatorTest, Setup) {\n  PageAllocator allocator;\n}\n\nTEST(PageAllocatorTest, SmallObjects) {\n  PageAllocator allocator;\n\n  for (unsigned i = 1; i < 1024; ++i) {\n    uint8_t *p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));\n    ASSERT_FALSE(p == NULL);\n    memset(p, 0, i);\n  }\n}\n\nTEST(PageAllocatorTest, LargeObject) {\n  PageAllocator allocator;\n\n  uint8_t *p = reinterpret_cast<uint8_t*>(allocator.Alloc(10000));\n  ASSERT_FALSE(p == NULL);\n  for (unsigned i = 1; i < 10; ++i) {\n    uint8_t *p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));\n    ASSERT_FALSE(p == NULL);\n    memset(p, 0, i);\n  }\n}\n\nnamespace {\ntypedef testing::Test WastefulVectorTest;\n}\n\nTEST(WastefulVectorTest, Setup) {\n  PageAllocator allocator_;\n  wasteful_vector<int> v(&allocator_);\n  ASSERT_TRUE(v.empty());\n  ASSERT_EQ(v.size(), 0u);\n}\n\nTEST(WastefulVectorTest, Simple) {\n  PageAllocator allocator_;\n  wasteful_vector<unsigned> v(&allocator_);\n\n  for (unsigned i = 0; i < 256; ++i) {\n    v.push_back(i);\n    ASSERT_EQ(i, v.back());\n    ASSERT_EQ(&v.back(), &v[i]);\n  }\n  ASSERT_FALSE(v.empty());\n  ASSERT_EQ(v.size(), 256u);\n  for (unsigned i = 0; i < 256; ++i)\n    ASSERT_EQ(v[i], i);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/module.cc",
    "content": "// Copyright (c) 2011 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// module.cc: Implement google_breakpad::Module.  See module.h.\n\n#include \"common/module.h\"\n\n#include <assert.h>\n#include <errno.h>\n#include <stdio.h>\n#include <string.h>\n\n#include <iostream>\n#include <utility>\n\nnamespace google_breakpad {\n\nusing std::dec;\nusing std::endl;\nusing std::hex;\n\n\nModule::Module(const string &name, const string &os,\n               const string &architecture, const string &id) :\n    name_(name),\n    os_(os),\n    architecture_(architecture),\n    id_(id),\n    load_address_(0) { }\n\nModule::~Module() {\n  for (FileByNameMap::iterator it = files_.begin(); it != files_.end(); ++it)\n    delete it->second;\n  for (FunctionSet::iterator it = functions_.begin();\n       it != functions_.end(); ++it) {\n    delete *it;\n  }\n  for (vector<StackFrameEntry *>::iterator it = stack_frame_entries_.begin();\n       it != stack_frame_entries_.end(); ++it) {\n    delete *it;\n  }\n  for (ExternSet::iterator it = externs_.begin(); it != externs_.end(); ++it)\n    delete *it;\n}\n\nvoid Module::SetLoadAddress(Address address) {\n  load_address_ = address;\n}\n\nvoid Module::AddFunction(Function *function) {\n  // FUNC lines must not hold an empty name, so catch the problem early if\n  // callers try to add one.\n  assert(!function->name.empty());\n  std::pair<FunctionSet::iterator,bool> ret = functions_.insert(function);\n  if (!ret.second) {\n    // Free the duplicate that was not inserted because this Module\n    // now owns it.\n    delete function;\n  }\n}\n\nvoid Module::AddFunctions(vector<Function *>::iterator begin,\n                          vector<Function *>::iterator end) {\n  for (vector<Function *>::iterator it = begin; it != end; ++it)\n    AddFunction(*it);\n}\n\nvoid Module::AddStackFrameEntry(StackFrameEntry *stack_frame_entry) {\n  stack_frame_entries_.push_back(stack_frame_entry);\n}\n\nvoid Module::AddExtern(Extern *ext) {\n  std::pair<ExternSet::iterator,bool> ret = externs_.insert(ext);\n  if (!ret.second) {\n    // Free the duplicate that was not inserted because this Module\n    // now owns it.\n    delete ext;\n  }\n}\n\nvoid Module::GetFunctions(vector<Function *> *vec,\n                          vector<Function *>::iterator i) {\n  vec->insert(i, functions_.begin(), functions_.end());\n}\n\nvoid Module::GetExterns(vector<Extern *> *vec,\n                        vector<Extern *>::iterator i) {\n  vec->insert(i, externs_.begin(), externs_.end());\n}\n\nModule::File *Module::FindFile(const string &name) {\n  // A tricky bit here.  The key of each map entry needs to be a\n  // pointer to the entry's File's name string.  This means that we\n  // can't do the initial lookup with any operation that would create\n  // an empty entry for us if the name isn't found (like, say,\n  // operator[] or insert do), because such a created entry's key will\n  // be a pointer the string passed as our argument.  Since the key of\n  // a map's value type is const, we can't fix it up once we've\n  // created our file.  lower_bound does the lookup without doing an\n  // insertion, and returns a good hint iterator to pass to insert.\n  // Our \"destiny\" is where we belong, whether we're there or not now.\n  FileByNameMap::iterator destiny = files_.lower_bound(&name);\n  if (destiny == files_.end()\n      || *destiny->first != name) {  // Repeated string comparison, boo hoo.\n    File *file = new File;\n    file->name = name;\n    file->source_id = -1;\n    destiny = files_.insert(destiny,\n                            FileByNameMap::value_type(&file->name, file));\n  }\n  return destiny->second;\n}\n\nModule::File *Module::FindFile(const char *name) {\n  string name_string = name;\n  return FindFile(name_string);\n}\n\nModule::File *Module::FindExistingFile(const string &name) {\n  FileByNameMap::iterator it = files_.find(&name);\n  return (it == files_.end()) ? NULL : it->second;\n}\n\nvoid Module::GetFiles(vector<File *> *vec) {\n  vec->clear();\n  for (FileByNameMap::iterator it = files_.begin(); it != files_.end(); ++it)\n    vec->push_back(it->second);\n}\n\nvoid Module::GetStackFrameEntries(vector<StackFrameEntry *> *vec) {\n  *vec = stack_frame_entries_;\n}\n\nvoid Module::AssignSourceIds() {\n  // First, give every source file an id of -1.\n  for (FileByNameMap::iterator file_it = files_.begin();\n       file_it != files_.end(); ++file_it) {\n    file_it->second->source_id = -1;\n  }\n\n  // Next, mark all files actually cited by our functions' line number\n  // info, by setting each one's source id to zero.\n  for (FunctionSet::const_iterator func_it = functions_.begin();\n       func_it != functions_.end(); ++func_it) {\n    Function *func = *func_it;\n    for (vector<Line>::iterator line_it = func->lines.begin();\n         line_it != func->lines.end(); ++line_it)\n      line_it->file->source_id = 0;\n  }\n\n  // Finally, assign source ids to those files that have been marked.\n  // We could have just assigned source id numbers while traversing\n  // the line numbers, but doing it this way numbers the files in\n  // lexicographical order by name, which is neat.\n  int next_source_id = 0;\n  for (FileByNameMap::iterator file_it = files_.begin();\n       file_it != files_.end(); ++file_it) {\n    if (!file_it->second->source_id)\n      file_it->second->source_id = next_source_id++;\n  }\n}\n\nbool Module::ReportError() {\n  fprintf(stderr, \"error writing symbol file: %s\\n\",\n          strerror(errno));\n  return false;\n}\n\nbool Module::WriteRuleMap(const RuleMap &rule_map, std::ostream &stream) {\n  for (RuleMap::const_iterator it = rule_map.begin();\n       it != rule_map.end(); ++it) {\n    if (it != rule_map.begin())\n      stream << ' ';\n    stream << it->first << \": \" << it->second;\n  }\n  return stream.good();\n}\n\nbool Module::Write(std::ostream &stream, bool cfi) {\n  stream << \"MODULE \" << os_ << \" \" << architecture_ << \" \"\n         << id_ << \" \" << name_ << endl;\n  if (!stream.good())\n    return ReportError();\n\n  AssignSourceIds();\n\n  // Write out files.\n  for (FileByNameMap::iterator file_it = files_.begin();\n       file_it != files_.end(); ++file_it) {\n    File *file = file_it->second;\n    if (file->source_id >= 0) {\n      stream << \"FILE \" << file->source_id << \" \" <<  file->name << endl;\n      if (!stream.good())\n        return ReportError();\n    }\n  }\n\n  // Write out functions and their lines.\n  for (FunctionSet::const_iterator func_it = functions_.begin();\n       func_it != functions_.end(); ++func_it) {\n    Function *func = *func_it;\n    stream << \"FUNC \" << hex\n           << (func->address - load_address_) << \" \"\n           << func->size << \" \"\n           << func->parameter_size << \" \"\n           << func->name << dec << endl;\n\n    if (!stream.good())\n      return ReportError();\n    for (vector<Line>::iterator line_it = func->lines.begin();\n         line_it != func->lines.end(); ++line_it) {\n      stream << hex\n             << (line_it->address - load_address_) << \" \"\n             << line_it->size << \" \"\n             << dec\n             << line_it->number << \" \"\n             << line_it->file->source_id << endl;\n      if (!stream.good())\n        return ReportError();\n    }\n  }\n\n  // Write out 'PUBLIC' records.\n  for (ExternSet::const_iterator extern_it = externs_.begin();\n       extern_it != externs_.end(); ++extern_it) {\n    Extern *ext = *extern_it;\n    stream << \"PUBLIC \" << hex\n           << (ext->address - load_address_) << \" 0 \"\n           << ext->name << dec << endl;\n    if (!stream.good())\n      return ReportError();\n  }\n\n  if (cfi) {\n    // Write out 'STACK CFI INIT' and 'STACK CFI' records.\n    vector<StackFrameEntry *>::const_iterator frame_it;\n    for (frame_it = stack_frame_entries_.begin();\n         frame_it != stack_frame_entries_.end(); ++frame_it) {\n      StackFrameEntry *entry = *frame_it;\n      stream << \"STACK CFI INIT \" << hex\n             << (entry->address - load_address_) << \" \"\n             << entry->size << \" \" << dec;\n      if (!stream.good()\n          || !WriteRuleMap(entry->initial_rules, stream))\n        return ReportError();\n\n      stream << endl;\n\n      // Write out this entry's delta rules as 'STACK CFI' records.\n      for (RuleChangeMap::const_iterator delta_it = entry->rule_changes.begin();\n           delta_it != entry->rule_changes.end(); ++delta_it) {\n        stream << \"STACK CFI \" << hex\n               << (delta_it->first - load_address_) << \" \" << dec;\n        if (!stream.good()\n            || !WriteRuleMap(delta_it->second, stream))\n          return ReportError();\n\n        stream << endl;\n      }\n    }\n  }\n\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/module.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// module.h: Define google_breakpad::Module. A Module holds debugging\n// information, and can write that information out as a Breakpad\n// symbol file.\n\n#ifndef COMMON_LINUX_MODULE_H__\n#define COMMON_LINUX_MODULE_H__\n\n#include <iostream>\n#include <map>\n#include <set>\n#include <string>\n#include <vector>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\nnamespace google_breakpad {\n\nusing std::set;\nusing std::string;\nusing std::vector;\nusing std::map;\n\n// A Module represents the contents of a module, and supports methods\n// for adding information produced by parsing STABS or DWARF data\n// --- possibly both from the same file --- and then writing out the\n// unified contents as a Breakpad-format symbol file.\nclass Module {\n public:\n  // The type of addresses and sizes in a symbol table.\n  typedef u_int64_t Address;\n  struct File;\n  struct Function;\n  struct Line;\n  struct Extern;\n\n  // Addresses appearing in File, Function, and Line structures are\n  // absolute, not relative to the the module's load address.  That\n  // is, if the module were loaded at its nominal load address, the\n  // addresses would be correct.\n\n  // A source file.\n  struct File {\n    // The name of the source file.\n    string name;\n\n    // The file's source id.  The Write member function clears this\n    // field and assigns source ids a fresh, so any value placed here\n    // before calling Write will be lost.\n    int source_id;\n  };\n\n  // A function.\n  struct Function {\n    // For sorting by address.  (Not style-guide compliant, but it's\n    // stupid not to put this in the struct.)\n    static bool CompareByAddress(const Function *x, const Function *y) {\n      return x->address < y->address;\n    }\n\n    // The function's name.\n    string name;\n\n    // The start address and length of the function's code.\n    Address address, size;\n\n    // The function's parameter size.\n    Address parameter_size;\n\n    // Source lines belonging to this function, sorted by increasing\n    // address.\n    vector<Line> lines;\n  };\n\n  // A source line.\n  struct Line {\n    // For sorting by address.  (Not style-guide compliant, but it's\n    // stupid not to put this in the struct.)\n    static bool CompareByAddress(const Module::Line &x, const Module::Line &y) {\n      return x.address < y.address;\n    }\n\n    Address address, size;    // The address and size of the line's code.\n    File *file;                // The source file.\n    int number;                // The source line number.\n  };\n\n  // An exported symbol.\n  struct Extern {\n    Address address;\n    string name;\n  };\n\n  // A map from register names to postfix expressions that recover\n  // their their values. This can represent a complete set of rules to\n  // follow at some address, or a set of changes to be applied to an\n  // extant set of rules.\n  typedef map<string, string> RuleMap;\n\n  // A map from addresses to RuleMaps, representing changes that take\n  // effect at given addresses.\n  typedef map<Address, RuleMap> RuleChangeMap;\n\n  // A range of 'STACK CFI' stack walking information. An instance of\n  // this structure corresponds to a 'STACK CFI INIT' record and the\n  // subsequent 'STACK CFI' records that fall within its range.\n  struct StackFrameEntry {\n    // The starting address and number of bytes of machine code this\n    // entry covers.\n    Address address, size;\n\n    // The initial register recovery rules, in force at the starting\n    // address.\n    RuleMap initial_rules;\n\n    // A map from addresses to rule changes. To find the rules in\n    // force at a given address, start with initial_rules, and then\n    // apply the changes given in this map for all addresses up to and\n    // including the address you're interested in.\n    RuleChangeMap rule_changes;\n  };\n\n  struct FunctionCompare {\n    bool operator() (const Function *lhs,\n                     const Function *rhs) const {\n      if (lhs->address == rhs->address)\n        return lhs->name < rhs->name;\n      return lhs->address < rhs->address;\n    }\n  };\n\n  struct ExternCompare {\n    bool operator() (const Extern *lhs,\n                     const Extern *rhs) const {\n      return lhs->address < rhs->address;\n    }\n  };\n\n  // Create a new module with the given name, operating system,\n  // architecture, and ID string.\n  Module(const string &name, const string &os, const string &architecture,\n         const string &id);\n  ~Module();\n\n  // Set the module's load address to LOAD_ADDRESS; addresses given\n  // for functions and lines will be written to the Breakpad symbol\n  // file as offsets from this address.  Construction initializes this\n  // module's load address to zero: addresses written to the symbol\n  // file will be the same as they appear in the Function, Line, and\n  // StackFrameEntry structures.\n  //\n  // Note that this member function has no effect on addresses stored\n  // in the data added to this module; the Write member function\n  // simply subtracts off the load address from addresses before it\n  // prints them. Only the last load address given before calling\n  // Write is used.\n  void SetLoadAddress(Address load_address);\n\n  // Add FUNCTION to the module. FUNCTION's name must not be empty.\n  // This module owns all Function objects added with this function:\n  // destroying the module destroys them as well.\n  void AddFunction(Function *function);\n\n  // Add all the functions in [BEGIN,END) to the module.\n  // This module owns all Function objects added with this function:\n  // destroying the module destroys them as well.\n  void AddFunctions(vector<Function *>::iterator begin,\n                    vector<Function *>::iterator end);\n\n  // Add STACK_FRAME_ENTRY to the module.\n  // This module owns all StackFrameEntry objects added with this\n  // function: destroying the module destroys them as well.\n  void AddStackFrameEntry(StackFrameEntry *stack_frame_entry);\n\n  // Add PUBLIC to the module.\n  // This module owns all Extern objects added with this function:\n  // destroying the module destroys them as well.\n  void AddExtern(Extern *ext);\n\n  // If this module has a file named NAME, return a pointer to it. If\n  // it has none, then create one and return a pointer to the new\n  // file. This module owns all File objects created using these\n  // functions; destroying the module destroys them as well.\n  File *FindFile(const string &name);\n  File *FindFile(const char *name);\n\n  // If this module has a file named NAME, return a pointer to it.\n  // Otherwise, return NULL.\n  File *FindExistingFile(const string &name);\n\n  // Insert pointers to the functions added to this module at I in\n  // VEC. The pointed-to Functions are still owned by this module.\n  // (Since this is effectively a copy of the function list, this is\n  // mostly useful for testing; other uses should probably get a more\n  // appropriate interface.)\n  void GetFunctions(vector<Function *> *vec, vector<Function *>::iterator i);\n\n  // Insert pointers to the externs added to this module at I in\n  // VEC. The pointed-to Externs are still owned by this module.\n  // (Since this is effectively a copy of the extern list, this is\n  // mostly useful for testing; other uses should probably get a more\n  // appropriate interface.)\n  void GetExterns(vector<Extern *> *vec, vector<Extern *>::iterator i);\n\n  // Clear VEC and fill it with pointers to the Files added to this\n  // module, sorted by name. The pointed-to Files are still owned by\n  // this module. (Since this is effectively a copy of the file list,\n  // this is mostly useful for testing; other uses should probably get\n  // a more appropriate interface.)\n  void GetFiles(vector<File *> *vec);\n\n  // Clear VEC and fill it with pointers to the StackFrameEntry\n  // objects that have been added to this module. (Since this is\n  // effectively a copy of the stack frame entry list, this is mostly\n  // useful for testing; other uses should probably get\n  // a more appropriate interface.)\n  void GetStackFrameEntries(vector<StackFrameEntry *> *vec);\n\n  // Find those files in this module that are actually referred to by\n  // functions' line number data, and assign them source id numbers.\n  // Set the source id numbers for all other files --- unused by the\n  // source line data --- to -1.  We do this before writing out the\n  // symbol file, at which point we omit any unused files.\n  void AssignSourceIds();\n\n  // Call AssignSourceIds, and write this module to STREAM in the\n  // breakpad symbol format. Return true if all goes well, or false if\n  // an error occurs. This method writes out:\n  // - a header based on the values given to the constructor,\n  // - the source files added via FindFile,\n  // - the functions added via AddFunctions, each with its lines,\n  // - all public records,\n  // - and if CFI is true, all CFI records.\n  // Addresses in the output are all relative to the load address\n  // established by SetLoadAddress.\n  bool Write(std::ostream &stream, bool cfi);\n\n private:\n  // Report an error that has occurred writing the symbol file, using\n  // errno to find the appropriate cause.  Return false.\n  static bool ReportError();\n\n  // Write RULE_MAP to STREAM, in the form appropriate for 'STACK CFI'\n  // records, without a final newline. Return true if all goes well;\n  // if an error occurs, return false, and leave errno set.\n  static bool WriteRuleMap(const RuleMap &rule_map, std::ostream &stream);\n\n  // Module header entries.\n  string name_, os_, architecture_, id_;\n\n  // The module's nominal load address.  Addresses for functions and\n  // lines are absolute, assuming the module is loaded at this\n  // address.\n  Address load_address_;\n\n  // Relation for maps whose keys are strings shared with some other\n  // structure.\n  struct CompareStringPtrs {\n    bool operator()(const string *x, const string *y) { return *x < *y; }\n  };\n\n  // A map from filenames to File structures.  The map's keys are\n  // pointers to the Files' names.\n  typedef map<const string *, File *, CompareStringPtrs> FileByNameMap;\n\n  // A set containing Function structures, sorted by address.\n  typedef set<Function *, FunctionCompare> FunctionSet;\n\n  // A set containing Extern structures, sorted by address.\n  typedef set<Extern *, ExternCompare> ExternSet;\n\n  // The module owns all the files and functions that have been added\n  // to it; destroying the module frees the Files and Functions these\n  // point to.\n  FileByNameMap files_;    // This module's source files.\n  FunctionSet functions_;  // This module's functions.\n\n  // The module owns all the call frame info entries that have been\n  // added to it.\n  vector<StackFrameEntry *> stack_frame_entries_;\n\n  // The module owns all the externs that have been added to it;\n  // destroying the module frees the Externs these point to.\n  ExternSet externs_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_LINUX_MODULE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/module_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// module_unittest.cc: Unit tests for google_breakpad::Module.\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <algorithm>\n#include <sstream>\n#include <string>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/module.h\"\n\nusing google_breakpad::Module;\nusing std::string;\nusing std::stringstream;\nusing std::vector;\nusing testing::ContainerEq;\n\nstatic Module::Function *generate_duplicate_function(const string &name) {\n  const Module::Address DUP_ADDRESS = 0xd35402aac7a7ad5cLL;\n  const Module::Address DUP_SIZE = 0x200b26e605f99071LL;\n  const Module::Address DUP_PARAMETER_SIZE = 0xf14ac4fed48c4a99LL;\n\n  Module::Function *function = new(Module::Function);\n  function->name = name;\n  function->address = DUP_ADDRESS;\n  function->size = DUP_SIZE;\n  function->parameter_size = DUP_PARAMETER_SIZE;\n  return function;\n}\n\n#define MODULE_NAME \"name with spaces\"\n#define MODULE_OS \"os-name\"\n#define MODULE_ARCH \"architecture\"\n#define MODULE_ID \"id-string\"\n\nTEST(Write, Header) {\n  stringstream s;\n  Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);\n  m.Write(s, true);\n  string contents = s.str();\n  EXPECT_STREQ(\"MODULE os-name architecture id-string name with spaces\\n\",\n               contents.c_str());\n}\n\nTEST(Write, OneLineFunc) {\n  stringstream s;\n  Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);\n\n  Module::File *file = m.FindFile(\"file_name.cc\");\n  Module::Function *function = new(Module::Function);\n  function->name = \"function_name\";\n  function->address = 0xe165bf8023b9d9abLL;\n  function->size = 0x1e4bb0eb1cbf5b09LL;\n  function->parameter_size = 0x772beee89114358aLL;\n  Module::Line line = { 0xe165bf8023b9d9abLL, 0x1e4bb0eb1cbf5b09LL,\n                        file, 67519080 };\n  function->lines.push_back(line);\n  m.AddFunction(function);\n\n  m.Write(s, true);\n  string contents = s.str();\n  EXPECT_STREQ(\"MODULE os-name architecture id-string name with spaces\\n\"\n               \"FILE 0 file_name.cc\\n\"\n               \"FUNC e165bf8023b9d9ab 1e4bb0eb1cbf5b09 772beee89114358a\"\n               \" function_name\\n\"\n               \"e165bf8023b9d9ab 1e4bb0eb1cbf5b09 67519080 0\\n\",\n               contents.c_str());\n}\n\nTEST(Write, RelativeLoadAddress) {\n  stringstream s;\n  Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);\n\n  // Some source files.  We will expect to see them in lexicographic order.\n  Module::File *file1 = m.FindFile(\"filename-b.cc\");\n  Module::File *file2 = m.FindFile(\"filename-a.cc\");\n\n  // A function.\n  Module::Function *function = new(Module::Function);\n  function->name = \"A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)\";\n  function->address = 0xbec774ea5dd935f3LL;\n  function->size = 0x2922088f98d3f6fcLL;\n  function->parameter_size = 0xe5e9aa008bd5f0d0LL;\n\n  // Some source lines.  The module should not sort these.\n  Module::Line line1 = { 0xbec774ea5dd935f3LL, 0x1c2be6d6c5af2611LL,\n                         file1, 41676901 };\n  Module::Line line2 = { 0xdaf35bc123885c04LL, 0xcf621b8d324d0ebLL,\n                         file2, 67519080 };\n  function->lines.push_back(line2);\n  function->lines.push_back(line1);\n\n  m.AddFunction(function);\n\n  // Some stack information.\n  Module::StackFrameEntry *entry = new Module::StackFrameEntry();\n  entry->address = 0x30f9e5c83323973dULL;\n  entry->size = 0x49fc9ca7c7c13dc2ULL;\n  entry->initial_rules[\".cfa\"] = \"he was a handsome man\";\n  entry->initial_rules[\"and\"] = \"what i want to know is\";\n  entry->rule_changes[0x30f9e5c83323973eULL][\"how\"] =\n    \"do you like your blueeyed boy\";\n  entry->rule_changes[0x30f9e5c83323973eULL][\"Mister\"] = \"Death\";\n  m.AddStackFrameEntry(entry);\n\n  // Set the load address.  Doing this after adding all the data to\n  // the module must work fine.\n  m.SetLoadAddress(0x2ab698b0b6407073LL);\n\n  m.Write(s, true);\n  string contents = s.str();\n  EXPECT_STREQ(\"MODULE os-name architecture id-string name with spaces\\n\"\n               \"FILE 0 filename-a.cc\\n\"\n               \"FILE 1 filename-b.cc\\n\"\n               \"FUNC 9410dc39a798c580 2922088f98d3f6fc e5e9aa008bd5f0d0\"\n               \" A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)\\n\"\n               \"b03cc3106d47eb91 cf621b8d324d0eb 67519080 0\\n\"\n               \"9410dc39a798c580 1c2be6d6c5af2611 41676901 1\\n\"\n               \"STACK CFI INIT 6434d177ce326ca 49fc9ca7c7c13dc2\"\n               \" .cfa: he was a handsome man\"\n               \" and: what i want to know is\\n\"\n               \"STACK CFI 6434d177ce326cb\"\n               \" Mister: Death\"\n               \" how: do you like your blueeyed boy\\n\",\n               contents.c_str());\n}\n\nTEST(Write, OmitUnusedFiles) {\n  Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);\n\n  // Create some source files.\n  Module::File *file1 = m.FindFile(\"filename1\");\n  m.FindFile(\"filename2\");  // not used by any line\n  Module::File *file3 = m.FindFile(\"filename3\");\n\n  // Create a function.\n  Module::Function *function = new(Module::Function);\n  function->name = \"function_name\";\n  function->address = 0x9b926d464f0b9384LL;\n  function->size = 0x4f524a4ba795e6a6LL;\n  function->parameter_size = 0xbbe8133a6641c9b7LL;\n\n  // Source files that refer to some files, but not others.\n  Module::Line line1 = { 0x595fa44ebacc1086LL, 0x1e1e0191b066c5b3LL,\n                         file1, 137850127 };\n  Module::Line line2 = { 0x401ce8c8a12d25e3LL, 0x895751c41b8d2ce2LL,\n                         file3, 28113549 };\n  function->lines.push_back(line1);\n  function->lines.push_back(line2);\n  m.AddFunction(function);\n\n  m.AssignSourceIds();\n\n  vector<Module::File *> vec;\n  m.GetFiles(&vec);\n  EXPECT_EQ((size_t) 3, vec.size());\n  EXPECT_STREQ(\"filename1\", vec[0]->name.c_str());\n  EXPECT_NE(-1, vec[0]->source_id);\n  // Expect filename2 not to be used.\n  EXPECT_STREQ(\"filename2\", vec[1]->name.c_str());\n  EXPECT_EQ(-1, vec[1]->source_id);\n  EXPECT_STREQ(\"filename3\", vec[2]->name.c_str());\n  EXPECT_NE(-1, vec[2]->source_id);\n\n  stringstream s;\n  m.Write(s, true);\n  string contents = s.str();\n  EXPECT_STREQ(\"MODULE os-name architecture id-string name with spaces\\n\"\n               \"FILE 0 filename1\\n\"\n               \"FILE 1 filename3\\n\"\n               \"FUNC 9b926d464f0b9384 4f524a4ba795e6a6 bbe8133a6641c9b7\"\n               \" function_name\\n\"\n               \"595fa44ebacc1086 1e1e0191b066c5b3 137850127 0\\n\"\n               \"401ce8c8a12d25e3 895751c41b8d2ce2 28113549 1\\n\",\n               contents.c_str());\n}\n\nTEST(Write, NoCFI) {\n  stringstream s;\n  Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);\n\n  // Some source files.  We will expect to see them in lexicographic order.\n  Module::File *file1 = m.FindFile(\"filename.cc\");\n\n  // A function.\n  Module::Function *function = new(Module::Function);\n  function->name = \"A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)\";\n  function->address = 0xbec774ea5dd935f3LL;\n  function->size = 0x2922088f98d3f6fcLL;\n  function->parameter_size = 0xe5e9aa008bd5f0d0LL;\n\n  // Some source lines.  The module should not sort these.\n  Module::Line line1 = { 0xbec774ea5dd935f3LL, 0x1c2be6d6c5af2611LL,\n                         file1, 41676901 };\n  function->lines.push_back(line1);\n\n  m.AddFunction(function);\n\n  // Some stack information.\n  Module::StackFrameEntry *entry = new Module::StackFrameEntry();\n  entry->address = 0x30f9e5c83323973dULL;\n  entry->size = 0x49fc9ca7c7c13dc2ULL;\n  entry->initial_rules[\".cfa\"] = \"he was a handsome man\";\n  entry->initial_rules[\"and\"] = \"what i want to know is\";\n  entry->rule_changes[0x30f9e5c83323973eULL][\"how\"] =\n    \"do you like your blueeyed boy\";\n  entry->rule_changes[0x30f9e5c83323973eULL][\"Mister\"] = \"Death\";\n  m.AddStackFrameEntry(entry);\n\n  // Set the load address.  Doing this after adding all the data to\n  // the module must work fine.\n  m.SetLoadAddress(0x2ab698b0b6407073LL);\n\n  m.Write(s, false);\n  string contents = s.str();\n  EXPECT_STREQ(\"MODULE os-name architecture id-string name with spaces\\n\"\n               \"FILE 0 filename.cc\\n\"\n               \"FUNC 9410dc39a798c580 2922088f98d3f6fc e5e9aa008bd5f0d0\"\n               \" A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)\\n\"\n               \"9410dc39a798c580 1c2be6d6c5af2611 41676901 0\\n\",\n               contents.c_str());\n}\n\nTEST(Construct, AddFunctions) {\n  stringstream s;\n  Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);\n\n  // Two functions.\n  Module::Function *function1 = new(Module::Function);\n  function1->name = \"_without_form\";\n  function1->address = 0xd35024aa7ca7da5cLL;\n  function1->size = 0x200b26e605f99071LL;\n  function1->parameter_size = 0xf14ac4fed48c4a99LL;\n\n  Module::Function *function2 = new(Module::Function);\n  function2->name = \"_and_void\";\n  function2->address = 0x2987743d0b35b13fLL;\n  function2->size = 0xb369db048deb3010LL;\n  function2->parameter_size = 0x938e556cb5a79988LL;\n\n  // Put them in a vector.\n  vector<Module::Function *> vec;\n  vec.push_back(function1);\n  vec.push_back(function2);\n\n  m.AddFunctions(vec.begin(), vec.end());\n\n  m.Write(s, true);\n  string contents = s.str();\n  EXPECT_STREQ(\"MODULE os-name architecture id-string name with spaces\\n\"\n               \"FUNC 2987743d0b35b13f b369db048deb3010 938e556cb5a79988\"\n               \" _and_void\\n\"\n               \"FUNC d35024aa7ca7da5c 200b26e605f99071 f14ac4fed48c4a99\"\n               \" _without_form\\n\",\n               contents.c_str());\n\n  // Check that m.GetFunctions returns the functions we expect.\n  vec.clear();\n  m.GetFunctions(&vec, vec.end());\n  EXPECT_TRUE(vec.end() != find(vec.begin(), vec.end(), function1));\n  EXPECT_TRUE(vec.end() != find(vec.begin(), vec.end(), function2));\n  EXPECT_EQ((size_t) 2, vec.size());\n}\n\nTEST(Construct, AddFrames) {\n  stringstream s;\n  Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);\n\n  // First STACK CFI entry, with no initial rules or deltas.\n  Module::StackFrameEntry *entry1 = new Module::StackFrameEntry();\n  entry1->address = 0xddb5f41285aa7757ULL;\n  entry1->size = 0x1486493370dc5073ULL;\n  m.AddStackFrameEntry(entry1);\n\n  // Second STACK CFI entry, with initial rules but no deltas.\n  Module::StackFrameEntry *entry2 = new Module::StackFrameEntry();\n  entry2->address = 0x8064f3af5e067e38ULL;\n  entry2->size = 0x0de2a5ee55509407ULL;\n  entry2->initial_rules[\".cfa\"] = \"I think that I shall never see\";\n  entry2->initial_rules[\"stromboli\"] = \"a poem lovely as a tree\";\n  entry2->initial_rules[\"cannoli\"] = \"a tree whose hungry mouth is prest\";\n  m.AddStackFrameEntry(entry2);\n\n  // Third STACK CFI entry, with initial rules and deltas.\n  Module::StackFrameEntry *entry3 = new Module::StackFrameEntry();\n  entry3->address = 0x5e8d0db0a7075c6cULL;\n  entry3->size = 0x1c7edb12a7aea229ULL;\n  entry3->initial_rules[\".cfa\"] = \"Whose woods are these\";\n  entry3->rule_changes[0x47ceb0f63c269d7fULL][\"calzone\"] =\n    \"the village though\";\n  entry3->rule_changes[0x47ceb0f63c269d7fULL][\"cannoli\"] =\n    \"he will not see me stopping here\";\n  entry3->rule_changes[0x36682fad3763ffffULL][\"stromboli\"] =\n    \"his house is in\";\n  entry3->rule_changes[0x36682fad3763ffffULL][\".cfa\"] =\n    \"I think I know\";\n  m.AddStackFrameEntry(entry3);\n\n  // Check that Write writes STACK CFI records properly.\n  m.Write(s, true);\n  string contents = s.str();\n  EXPECT_STREQ(\"MODULE os-name architecture id-string name with spaces\\n\"\n               \"STACK CFI INIT ddb5f41285aa7757 1486493370dc5073 \\n\"\n               \"STACK CFI INIT 8064f3af5e067e38 de2a5ee55509407\"\n               \" .cfa: I think that I shall never see\"\n               \" cannoli: a tree whose hungry mouth is prest\"\n               \" stromboli: a poem lovely as a tree\\n\"\n               \"STACK CFI INIT 5e8d0db0a7075c6c 1c7edb12a7aea229\"\n               \" .cfa: Whose woods are these\\n\"\n               \"STACK CFI 36682fad3763ffff\"\n               \" .cfa: I think I know\"\n               \" stromboli: his house is in\\n\"\n               \"STACK CFI 47ceb0f63c269d7f\"\n               \" calzone: the village though\"\n               \" cannoli: he will not see me stopping here\\n\",\n               contents.c_str());\n\n  // Check that GetStackFrameEntries works.\n  vector<Module::StackFrameEntry *> entries;\n  m.GetStackFrameEntries(&entries);\n  ASSERT_EQ(3U, entries.size());\n  // Check first entry.\n  EXPECT_EQ(0xddb5f41285aa7757ULL, entries[0]->address);\n  EXPECT_EQ(0x1486493370dc5073ULL, entries[0]->size);\n  ASSERT_EQ(0U, entries[0]->initial_rules.size());\n  ASSERT_EQ(0U, entries[0]->rule_changes.size());\n  // Check second entry.\n  EXPECT_EQ(0x8064f3af5e067e38ULL, entries[1]->address);\n  EXPECT_EQ(0x0de2a5ee55509407ULL, entries[1]->size);\n  ASSERT_EQ(3U, entries[1]->initial_rules.size());\n  Module::RuleMap entry2_initial;\n  entry2_initial[\".cfa\"] = \"I think that I shall never see\";\n  entry2_initial[\"stromboli\"] = \"a poem lovely as a tree\";\n  entry2_initial[\"cannoli\"] = \"a tree whose hungry mouth is prest\";\n  EXPECT_THAT(entries[1]->initial_rules, ContainerEq(entry2_initial));\n  ASSERT_EQ(0U, entries[1]->rule_changes.size());\n  // Check third entry.\n  EXPECT_EQ(0x5e8d0db0a7075c6cULL, entries[2]->address);\n  EXPECT_EQ(0x1c7edb12a7aea229ULL, entries[2]->size);\n  Module::RuleMap entry3_initial;\n  entry3_initial[\".cfa\"] = \"Whose woods are these\";\n  EXPECT_THAT(entries[2]->initial_rules, ContainerEq(entry3_initial));\n  Module::RuleChangeMap entry3_changes;\n  entry3_changes[0x36682fad3763ffffULL][\".cfa\"] = \"I think I know\";\n  entry3_changes[0x36682fad3763ffffULL][\"stromboli\"] = \"his house is in\";\n  entry3_changes[0x47ceb0f63c269d7fULL][\"calzone\"] = \"the village though\";\n  entry3_changes[0x47ceb0f63c269d7fULL][\"cannoli\"] =\n    \"he will not see me stopping here\";\n  EXPECT_THAT(entries[2]->rule_changes, ContainerEq(entry3_changes));\n}\n\nTEST(Construct, UniqueFiles) {\n  Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);\n  Module::File *file1 = m.FindFile(\"foo\");\n  Module::File *file2 = m.FindFile(string(\"bar\"));\n  Module::File *file3 = m.FindFile(string(\"foo\"));\n  Module::File *file4 = m.FindFile(\"bar\");\n  EXPECT_NE(file1, file2);\n  EXPECT_EQ(file1, file3);\n  EXPECT_EQ(file2, file4);\n  EXPECT_EQ(file1, m.FindExistingFile(\"foo\"));\n  EXPECT_TRUE(m.FindExistingFile(\"baz\") == NULL);\n}\n\nTEST(Construct, DuplicateFunctions) {\n  stringstream s;\n  Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);\n\n  // Two functions.\n  Module::Function *function1 = generate_duplicate_function(\"_without_form\");\n  Module::Function *function2 = generate_duplicate_function(\"_without_form\");\n\n  m.AddFunction(function1);\n  m.AddFunction(function2);\n\n  m.Write(s, true);\n  string contents = s.str();\n  EXPECT_STREQ(\"MODULE os-name architecture id-string name with spaces\\n\"\n               \"FUNC d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99\"\n               \" _without_form\\n\",\n               contents.c_str());\n}\n\nTEST(Construct, FunctionsWithSameAddress) {\n  stringstream s;\n  Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);\n\n  // Two functions.\n  Module::Function *function1 = generate_duplicate_function(\"_without_form\");\n  Module::Function *function2 = generate_duplicate_function(\"_and_void\");\n\n  m.AddFunction(function1);\n  m.AddFunction(function2);\n\n  m.Write(s, true);\n  string contents = s.str();\n  EXPECT_STREQ(\"MODULE os-name architecture id-string name with spaces\\n\"\n               \"FUNC d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99\"\n               \" _and_void\\n\"\n               \"FUNC d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99\"\n               \" _without_form\\n\",\n               contents.c_str());\n}\n\n// Externs should be written out as PUBLIC records, sorted by\n// address.\nTEST(Construct, Externs) {\n  stringstream s;\n  Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);\n\n  // Two externs.\n  Module::Extern *extern1 = new(Module::Extern);\n  extern1->address = 0xffff;\n  extern1->name = \"_abc\";\n  Module::Extern *extern2 = new(Module::Extern);\n  extern2->address = 0xaaaa;\n  extern2->name = \"_xyz\";\n\n  m.AddExtern(extern1);\n  m.AddExtern(extern2);\n\n  m.Write(s, true);\n  string contents = s.str();\n\n  EXPECT_STREQ(\"MODULE \" MODULE_OS \" \" MODULE_ARCH \" \"\n               MODULE_ID \" \" MODULE_NAME \"\\n\"\n               \"PUBLIC aaaa 0 _xyz\\n\"\n               \"PUBLIC ffff 0 _abc\\n\",\n               contents.c_str());\n}\n\n// Externs with the same address should only keep the first entry\n// added.\nTEST(Construct, DuplicateExterns) {\n  stringstream s;\n  Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);\n\n  // Two externs.\n  Module::Extern *extern1 = new(Module::Extern);\n  extern1->address = 0xffff;\n  extern1->name = \"_xyz\";\n  Module::Extern *extern2 = new(Module::Extern);\n  extern2->address = 0xffff;\n  extern2->name = \"_abc\";\n\n  m.AddExtern(extern1);\n  m.AddExtern(extern2);\n\n  m.Write(s, true);\n  string contents = s.str();\n\n  EXPECT_STREQ(\"MODULE \" MODULE_OS \" \" MODULE_ARCH \" \"\n               MODULE_ID \" \" MODULE_NAME \"\\n\"\n               \"PUBLIC ffff 0 _xyz\\n\",\n               contents.c_str());\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/solaris/dump_symbols.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Alfred Peng\n\n#include <demangle.h>\n#include <fcntl.h>\n#include <gelf.h>\n#include <link.h>\n#include <sys/mman.h>\n#include <stab.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <unistd.h>\n\n#include <functional>\n#include <map>\n#include <vector>\n\n#include \"common/solaris/dump_symbols.h\"\n#include \"common/solaris/file_id.h\"\n#include \"common/solaris/guid_creator.h\"\n#include \"processor/scoped_ptr.h\"\n\n// This namespace contains helper functions.\nnamespace {\n\nusing std::make_pair;\n\n#if defined(_LP64)\ntypedef Elf64_Sym   Elf_Sym;\n#else\ntypedef Elf32_Sym   Elf_Sym;\n#endif\n\n// Symbol table entry from stabs. Sun CC specific.\nstruct slist {\n  // String table index.\n  unsigned int n_strx;\n  // Stab type. \n  unsigned char n_type;\n  char n_other;\n  short n_desc;\n  unsigned long n_value;\n};\n\n// Symbol table entry\nstruct SymbolEntry {\n  // Offset from the start of the file.\n  GElf_Addr offset;\n  // Function size.\n  GElf_Word size;\n};\n\n// Infomation of a line.\nstruct LineInfo {\n  // Offset from start of the function.\n  // Load from stab symbol.\n  GElf_Off rva_to_func;\n  // Offset from base of the loading binary.\n  GElf_Off rva_to_base;\n  // Size of the line.\n  // The first line: equals to rva_to_func.\n  // The other lines: the difference of rva_to_func of the line and\n  // rva_to_func of the previous N_SLINE.\n  uint32_t size;\n  // Line number.\n  uint32_t line_num;\n};\n\n// Information of a function.\nstruct FuncInfo {\n  // Name of the function.\n  const char *name;\n  // Offset from the base of the loading address.\n  GElf_Off rva_to_base;\n  // Virtual address of the function.\n  // Load from stab symbol.\n  GElf_Addr addr;\n  // Size of the function.\n  // Equal to rva_to_func of the last function line.\n  uint32_t size;\n  // Total size of stack parameters.\n  uint32_t stack_param_size;\n  // Line information array.\n  std::vector<struct LineInfo> line_info;\n};\n\n// Information of a source file.\nstruct SourceFileInfo {\n  // Name of the source file.\n  const char *name;\n  // Starting address of the source file.\n  GElf_Addr addr;\n  // Id of the source file.\n  int source_id;\n  // Functions information.\n  std::vector<struct FuncInfo> func_info;\n};\n\nstruct CompareString {\n  bool operator()(const char *s1, const char *s2) const {\n    return strcmp(s1, s2) < 0;\n  }\n};\n\ntypedef std::map<const char *, struct SymbolEntry *, CompareString> SymbolMap;\n\n// Information of a symbol table.\n// This is the root of all types of symbol.\nstruct SymbolInfo {\n  std::vector<struct SourceFileInfo> source_file_info;\n  // Symbols information.\n  SymbolMap symbol_entries;\n};\n\n// Stab section name.\nconst char *kStabName = \".stab\";\n\n// Stab str section name.\nconst char *kStabStrName = \".stabstr\";\n\n// Symtab section name.\nconst char *kSymtabName = \".symtab\";\n\n// Strtab section name.\nconst char *kStrtabName = \".strtab\";\n\n// Default buffer lenght for demangle.\nconst int demangleLen = 20000;\n\n// Offset to the string table.\nu_int64_t stringOffset = 0;\n\n// Update the offset to the start of the string index of the next\n// object module for every N_ENDM stabs.\ninline void RecalculateOffset(struct slist* cur_list, char *stabstr) {\n  while ((--cur_list)->n_strx == 0) ;\n  stringOffset += cur_list->n_strx;\n\n  char *temp = stabstr + stringOffset;\n  while (*temp != '\\0') {\n    ++stringOffset;\n    ++temp;\n  }\n  // Skip the extra '\\0'\n  ++stringOffset;\n}\n\n// Demangle using demangle library on Solaris.\nstd::string Demangle(const char *mangled) {\n  int status = 0;\n  std::string str(mangled);\n  char *demangled = (char *)malloc(demangleLen);\n\n  if (!demangled) {\n    fprintf(stderr, \"no enough memory.\\n\");\n    goto out;\n  }\n\n  if ((status = cplus_demangle(mangled, demangled, demangleLen)) ==\n      DEMANGLE_ESPACE) {\n    fprintf(stderr, \"incorrect demangle.\\n\");\n    goto out;\n  }\n\n  str = demangled;\n  free(demangled);\n\nout:\n  return str; \n}\n\nbool WriteFormat(int fd, const char *fmt, ...) {\n  va_list list;\n  char buffer[4096];\n  ssize_t expected, written;\n  va_start(list, fmt);\n  vsnprintf(buffer, sizeof(buffer), fmt, list);\n  expected = strlen(buffer);\n  written = write(fd, buffer, strlen(buffer));\n  va_end(list);\n  return expected == written;\n}\n\nbool IsValidElf(const GElf_Ehdr *elf_header) {\n  return memcmp(elf_header, ELFMAG, SELFMAG) == 0;\n}\n\nstatic bool FindSectionByName(Elf *elf, const char *name,\n                              int shstrndx,\n                              GElf_Shdr *shdr) {\n  assert(name != NULL);\n\n  if (strlen(name) == 0)\n    return false;\n\n  Elf_Scn *scn = NULL;\n\n  while ((scn = elf_nextscn(elf, scn)) != NULL) {\n    if (gelf_getshdr(scn, shdr) == (GElf_Shdr *)0) {\n      fprintf(stderr, \"failed to read section header: %s\\n\", elf_errmsg(0));\n      return false;\n    }\n\n    const char *section_name = elf_strptr(elf, shstrndx, shdr->sh_name);\n    if (!section_name) {\n      fprintf(stderr, \"Section name error: %s\\n\", elf_errmsg(-1));\n      continue;\n    }\n\n    if (strcmp(section_name, name) == 0)\n      return true;\n  }\n\n  return false;\n}\n\n// The parameter size is used for FPO-optimized code, and\n// this is all tied up with the debugging data for Windows x86.\n// Set it to 0 on Solaris.\nint LoadStackParamSize(struct slist *list,\n                       struct slist *list_end,\n                       struct FuncInfo *func_info) {\n  struct slist *cur_list = list;\n  int step = 1;\n  while (cur_list < list_end && cur_list->n_type == N_PSYM) {\n    ++cur_list;\n    ++step;\n  }\n\n  func_info->stack_param_size = 0;\n  return step;\n}\n\nint LoadLineInfo(struct slist *list,\n                 struct slist *list_end,\n                 struct FuncInfo *func_info) {\n  struct slist *cur_list = list;\n  do {\n    // Skip non line information.\n    while (cur_list < list_end && cur_list->n_type != N_SLINE) {\n      // Only exit when got another function, or source file, or end stab.\n      if (cur_list->n_type == N_FUN || cur_list->n_type == N_SO ||\n          cur_list->n_type == N_ENDM) {\n        return cur_list - list;\n      }\n      ++cur_list;\n    }\n    struct LineInfo line;\n    while (cur_list < list_end && cur_list->n_type == N_SLINE) {\n      line.rva_to_func = cur_list->n_value;\n      // n_desc is a signed short\n      line.line_num = (unsigned short)cur_list->n_desc;\n      func_info->line_info.push_back(line);\n      ++cur_list;\n    }\n    if (cur_list == list_end && cur_list->n_type == N_ENDM)\n      break;\n  } while (list < list_end);\n\n  return cur_list - list;\n}\n\nint LoadFuncSymbols(struct slist *list,\n                    struct slist *list_end,\n                    char *stabstr,\n                    GElf_Word base,\n                    struct SourceFileInfo *source_file_info) {\n  struct slist *cur_list = list;\n  assert(cur_list->n_type == N_SO);\n  ++cur_list;\n\n  source_file_info->func_info.clear();\n  while (cur_list < list_end) {\n    // Go until the function symbol.\n    while (cur_list < list_end && cur_list->n_type != N_FUN) {\n      if (cur_list->n_type == N_SO) {\n        return cur_list - list;\n      }\n      ++cur_list;\n      if (cur_list->n_type == N_ENDM)\n        RecalculateOffset(cur_list, stabstr);\n      continue;\n    }\n    while (cur_list->n_type == N_FUN) {\n      struct FuncInfo func_info;\n      memset(&func_info, 0, sizeof(func_info));\n      func_info.name = stabstr + cur_list->n_strx + stringOffset;\n      // The n_value field is always 0 from stab generated by Sun CC.\n      // TODO(Alfred): Find the correct value.\n      func_info.addr = cur_list->n_value;\n      ++cur_list;\n      if (cur_list->n_type == N_ENDM)\n        RecalculateOffset(cur_list, stabstr);\n      if (cur_list->n_type != N_ESYM && cur_list->n_type != N_ISYM &&\n          cur_list->n_type != N_FUN) {\n        // Stack parameter size.\n        cur_list += LoadStackParamSize(cur_list, list_end, &func_info);\n        // Line info.\n        cur_list += LoadLineInfo(cur_list, list_end, &func_info);\n      }\n      if (cur_list < list_end && cur_list->n_type == N_ENDM)\n        RecalculateOffset(cur_list, stabstr);\n      // Functions in this module should have address bigger than the module\n      // starting address.\n      //\n      // These two values are always 0 with Sun CC.\n      // TODO(Alfred): Get the correct value or remove the condition statement.\n      if (func_info.addr >= source_file_info->addr) {\n        source_file_info->func_info.push_back(func_info);\n      }\n    }\n  }\n  return cur_list - list;\n}\n\n// Compute size and rva information based on symbols loaded from stab section.\nbool ComputeSizeAndRVA(struct SymbolInfo *symbols) {\n  std::vector<struct SourceFileInfo> *sorted_files =\n    &(symbols->source_file_info);\n  SymbolMap *symbol_entries = &(symbols->symbol_entries);\n  for (size_t i = 0; i < sorted_files->size(); ++i) {\n    struct SourceFileInfo &source_file = (*sorted_files)[i];\n    std::vector<struct FuncInfo> *sorted_functions = &(source_file.func_info);\n    int func_size = sorted_functions->size();\n\n    for (size_t j = 0; j < func_size; ++j) {\n      struct FuncInfo &func_info = (*sorted_functions)[j];\n      int line_count = func_info.line_info.size();\n\n      // Discard the ending part of the name.\n      std::string func_name(func_info.name);\n      std::string::size_type last_colon = func_name.find_first_of(':');\n      if (last_colon != std::string::npos)\n        func_name = func_name.substr(0, last_colon);\n\n      // Fine the symbol offset from the loading address and size by name.\n      SymbolMap::const_iterator it = symbol_entries->find(func_name.c_str());\n      if (it->second) {\n        func_info.rva_to_base = it->second->offset;\n        func_info.size = (line_count == 0) ? 0 : it->second->size;\n      } else {\n        func_info.rva_to_base = 0;\n        func_info.size = 0;\n      }\n\n      // Compute function and line size.\n      for (size_t k = 0; k < line_count; ++k) {\n        struct LineInfo &line_info = func_info.line_info[k];\n\n        line_info.rva_to_base = line_info.rva_to_func + func_info.rva_to_base;\n        if (k == line_count - 1) {\n          line_info.size = func_info.size - line_info.rva_to_func;\n        } else {\n          struct LineInfo &next_line = func_info.line_info[k + 1];\n          line_info.size = next_line.rva_to_func - line_info.rva_to_func;\n        }\n      }  // for each line.\n    }  // for each function.\n  }  // for each source file.\n  for (SymbolMap::iterator it = symbol_entries->begin();\n       it != symbol_entries->end(); ++it) {\n    free(it->second);\n  }\n  return true;\n}\n\nbool LoadAllSymbols(const GElf_Shdr *stab_section,\n                    const GElf_Shdr *stabstr_section,\n                    GElf_Word base,\n                    struct SymbolInfo *symbols) {\n  if (stab_section == NULL || stabstr_section == NULL)\n    return false;\n\n  char *stabstr = \n    reinterpret_cast<char *>(stabstr_section->sh_offset + base);\n  struct slist *lists =\n    reinterpret_cast<struct slist *>(stab_section->sh_offset + base);\n  int nstab = stab_section->sh_size / sizeof(struct slist);\n  int source_id = 0;\n\n  // First pass, load all symbols from the object file.\n  for (int i = 0; i < nstab; ) {\n    int step = 1;\n    struct slist *cur_list = lists + i;\n    if (cur_list->n_type == N_SO) {\n      // FUNC <address> <size> <param_stack_size> <function>\n      struct SourceFileInfo source_file_info;\n      source_file_info.name = stabstr + cur_list->n_strx + stringOffset;\n      // The n_value field is always 0 from stab generated by Sun CC.\n      // TODO(Alfred): Find the correct value.\n      source_file_info.addr = cur_list->n_value;\n      if (strchr(source_file_info.name, '.'))\n        source_file_info.source_id = source_id++;\n      else\n        source_file_info.source_id = -1;\n      step = LoadFuncSymbols(cur_list, lists + nstab - 1, stabstr,\n                             base, &source_file_info);\n      symbols->source_file_info.push_back(source_file_info);\n    }\n    i += step;\n  }\n  // Second pass, compute the size of functions and lines.\n  return ComputeSizeAndRVA(symbols);\n}\n\nbool LoadSymbols(Elf *elf, GElf_Ehdr *elf_header, struct SymbolInfo *symbols,\n                 void *obj_base) {\n  GElf_Word base = reinterpret_cast<GElf_Word>(obj_base);\n\n  const GElf_Shdr *sections =\n    reinterpret_cast<GElf_Shdr *>(elf_header->e_shoff + base);\n  GElf_Shdr stab_section;\n  if (!FindSectionByName(elf, kStabName, elf_header->e_shstrndx,\n                         &stab_section)) {\n    fprintf(stderr, \"Stab section not found.\\n\");\n    return false;\n  }\n  GElf_Shdr stabstr_section;\n  if (!FindSectionByName(elf, kStabStrName, elf_header->e_shstrndx,\n                         &stabstr_section)) {\n    fprintf(stderr, \"Stabstr section not found.\\n\");\n    return false;\n  }\n  GElf_Shdr symtab_section;\n  if (!FindSectionByName(elf, kSymtabName, elf_header->e_shstrndx,\n                         &symtab_section)) {\n    fprintf(stderr, \"Symtab section not found.\\n\");\n    return false;\n  }\n  GElf_Shdr strtab_section;\n  if (!FindSectionByName(elf, kStrtabName, elf_header->e_shstrndx,\n                         &strtab_section)) {\n    fprintf(stderr, \"Strtab section not found.\\n\");\n    return false;\n  }\n\n  Elf_Sym *symbol = (Elf_Sym *)((char *)base + symtab_section.sh_offset);\n  for (int i = 0; i < symtab_section.sh_size/symtab_section.sh_entsize; ++i) {\n    struct SymbolEntry *symbol_entry =\n        (struct SymbolEntry *)malloc(sizeof(struct SymbolEntry));\n    const char *name = reinterpret_cast<char *>(\n        strtab_section.sh_offset + (GElf_Word)base + symbol->st_name);\n    symbol_entry->offset = symbol->st_value;\n    symbol_entry->size = symbol->st_size;\n    symbols->symbol_entries.insert(make_pair(name, symbol_entry));\n    ++symbol;\n  }\n\n\n  // Load symbols.\n  return LoadAllSymbols(&stab_section, &stabstr_section, base, symbols);\n}\n\nbool WriteModuleInfo(int fd, GElf_Half arch, const std::string &obj_file) {\n  const char *arch_name = NULL;\n  if (arch == EM_386)\n    arch_name = \"x86\";\n  else if (arch == EM_X86_64)\n    arch_name = \"x86_64\";\n  else if (arch == EM_SPARC32PLUS)\n    arch_name = \"SPARC_32+\";\n  else {\n    printf(\"Please add more ARCH support\\n\");\n    return false;\n  }\n\n  unsigned char identifier[16];\n  google_breakpad::FileID file_id(obj_file.c_str());\n  if (file_id.ElfFileIdentifier(identifier)) {\n    char identifier_str[40];\n    file_id.ConvertIdentifierToString(identifier,\n                                      identifier_str, sizeof(identifier_str));\n    std::string filename = obj_file;\n    size_t slash_pos = obj_file.find_last_of(\"/\");\n    if (slash_pos != std::string::npos)\n      filename = obj_file.substr(slash_pos + 1);\n    return WriteFormat(fd, \"MODULE solaris %s %s %s\\n\", arch_name,\n                       identifier_str, filename.c_str());\n  }\n  return false;\n}\n\nbool WriteSourceFileInfo(int fd, const struct SymbolInfo &symbols) {\n  for (size_t i = 0; i < symbols.source_file_info.size(); ++i) {\n    if (symbols.source_file_info[i].source_id != -1) {\n      const char *name = symbols.source_file_info[i].name;\n      if (!WriteFormat(fd, \"FILE %d %s\\n\",\n                       symbols.source_file_info[i].source_id, name))\n        return false;\n    }\n  }\n  return true;\n}\n\nbool WriteOneFunction(int fd, int source_id,\n                      const struct FuncInfo &func_info){\n  // Discard the ending part of the name.\n  std::string func_name(func_info.name);\n  std::string::size_type last_colon = func_name.find_last_of(':');\n  if (last_colon != std::string::npos)\n    func_name = func_name.substr(0, last_colon);\n  func_name = Demangle(func_name.c_str());\n\n  if (func_info.size <= 0)\n    return true;\n\n  // rva_to_base could be unsigned long(32 bit) or unsigned long long(64 bit).\n  if (WriteFormat(fd, \"FUNC %llx %x %d %s\\n\",\n                  (long long)func_info.rva_to_base,\n                  func_info.size,\n                  func_info.stack_param_size,\n                  func_name.c_str())) {\n    for (size_t i = 0; i < func_info.line_info.size(); ++i) {\n      const struct LineInfo &line_info = func_info.line_info[i];\n      if (line_info.line_num == 0)\n        return true;\n      if (!WriteFormat(fd, \"%llx %x %d %d\\n\",\n                       (long long)line_info.rva_to_base,\n                       line_info.size,\n                       line_info.line_num,\n                       source_id))\n        return false;\n    }\n    return true;\n  }\n  return false;\n}\n\nbool WriteFunctionInfo(int fd, const struct SymbolInfo &symbols) {\n  for (size_t i = 0; i < symbols.source_file_info.size(); ++i) {\n    const struct SourceFileInfo &file_info = symbols.source_file_info[i];\n    for (size_t j = 0; j < file_info.func_info.size(); ++j) {\n      const struct FuncInfo &func_info = file_info.func_info[j];\n      if (!WriteOneFunction(fd, file_info.source_id, func_info))\n        return false;\n    }\n  }\n  return true;\n}\n\nbool DumpStabSymbols(int fd, const struct SymbolInfo &symbols) {\n  return WriteSourceFileInfo(fd, symbols) &&\n    WriteFunctionInfo(fd, symbols);\n}\n\n//\n// FDWrapper\n//\n// Wrapper class to make sure opened file is closed.\n//\nclass FDWrapper {\n public:\n  explicit FDWrapper(int fd) :\n    fd_(fd) {\n    }\n  ~FDWrapper() {\n    if (fd_ != -1)\n      close(fd_);\n  }\n  int get() {\n    return fd_;\n  }\n  int release() {\n    int fd = fd_;\n    fd_ = -1;\n    return fd;\n  }\n private:\n  int fd_;\n};\n\n//\n// MmapWrapper\n//\n// Wrapper class to make sure mapped regions are unmapped.\n//\nclass MmapWrapper {\n public:\n  MmapWrapper(void *mapped_address, size_t mapped_size) :\n    base_(mapped_address), size_(mapped_size) {\n  }\n  ~MmapWrapper() {\n    if (base_ != NULL) {\n      assert(size_ > 0);\n      munmap((char *)base_, size_);\n    }\n  }\n  void release() {\n    base_ = NULL;\n    size_ = 0;\n  }\n\n private:\n  void *base_;\n  size_t size_;\n};\n\n}  // namespace\n\nnamespace google_breakpad {\n\nclass AutoElfEnder {\n public:\n  AutoElfEnder(Elf *elf) : elf_(elf) {}\n  ~AutoElfEnder() { if (elf_) elf_end(elf_); }\n private:\n  Elf *elf_;\n};\n\n\nbool DumpSymbols::WriteSymbolFile(const std::string &obj_file, int sym_fd) {\n  if (elf_version(EV_CURRENT) == EV_NONE) {\n    fprintf(stderr, \"elf_version() failed: %s\\n\", elf_errmsg(0));\n    return false;\n  }\n\n  int obj_fd = open(obj_file.c_str(), O_RDONLY);\n  if (obj_fd < 0)\n    return false;\n  FDWrapper obj_fd_wrapper(obj_fd);\n  struct stat st;\n  if (fstat(obj_fd, &st) != 0 && st.st_size <= 0)\n    return false;\n  void *obj_base = mmap(NULL, st.st_size,\n                        PROT_READ, MAP_PRIVATE, obj_fd, 0);\n  if (obj_base == MAP_FAILED)\n    return false;\n  MmapWrapper map_wrapper(obj_base, st.st_size);\n  GElf_Ehdr elf_header;\n  Elf *elf = elf_begin(obj_fd, ELF_C_READ, NULL);\n  AutoElfEnder elfEnder(elf);\n\n  if (gelf_getehdr(elf, &elf_header) == (GElf_Ehdr *)NULL) {\n    fprintf(stderr, \"failed to read elf header: %s\\n\", elf_errmsg(-1));\n    return false;\n  }\n\n  if (!IsValidElf(&elf_header)) {\n    fprintf(stderr, \"header magic doesn't match\\n\");\n    return false;\n  }\n  struct SymbolInfo symbols;\n  if (!LoadSymbols(elf, &elf_header, &symbols, obj_base))\n    return false;\n  // Write to symbol file.\n  if (WriteModuleInfo(sym_fd, elf_header.e_machine, obj_file) &&\n      DumpStabSymbols(sym_fd, symbols))\n    return true;\n\n  return false;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/solaris/dump_symbols.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// dump_symbols.cc: Implements a Solaris stab debugging format dumper.\n//\n// Author: Alfred Peng\n\n#ifndef COMMON_SOLARIS_DUMP_SYMBOLS_H__\n#define COMMON_SOLARIS_DUMP_SYMBOLS_H__\n\n#include <string>\n\nnamespace google_breakpad {\n\nclass DumpSymbols {\n public:\n  bool WriteSymbolFile(const std::string &obj_file,\n                       int sym_fd);\n};\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_SOLARIS_DUMP_SYMBOLS_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/solaris/file_id.cc",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// file_id.cc: Return a unique identifier for a file\n//\n// See file_id.h for documentation\n//\n// Author: Alfred Peng\n\n#include <elf.h>\n#include <fcntl.h>\n#include <gelf.h>\n#include <sys/mman.h>\n#include <sys/ksyms.h>\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n\n#include <cassert>\n#include <cstdio>\n\n#include \"common/md5.h\"\n#include \"common/solaris/file_id.h\"\n#include \"common/solaris/message_output.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n\nnamespace google_breakpad {\n\nclass AutoElfEnder {\n public:\n  AutoElfEnder(Elf *elf) : elf_(elf) {}\n  ~AutoElfEnder() { if (elf_) elf_end(elf_); }\n private:\n  Elf *elf_;\n};\n\n// Find the text section in elf object file.\n// Return the section start address and the size.\nstatic bool FindElfTextSection(int fd, const void *elf_base,\n                               const void **text_start,\n                               int *text_size) {\n  assert(text_start);\n  assert(text_size);\n\n  *text_start = NULL;\n  *text_size = 0;\n\n  if (elf_version(EV_CURRENT) == EV_NONE) {\n    print_message2(2, \"elf_version() failed: %s\\n\", elf_errmsg(0));\n    return false;\n  }\n\n  GElf_Ehdr elf_header;\n  lseek(fd, 0L, 0);\n  Elf *elf = elf_begin(fd, ELF_C_READ, NULL);\n  AutoElfEnder elfEnder(elf);\n\n  if (gelf_getehdr(elf, &elf_header) == (GElf_Ehdr *)NULL) {\n    print_message2(2, \"failed to read elf header: %s\\n\", elf_errmsg(-1));\n    return false;\n  }\n\n  if (elf_header.e_ident[EI_MAG0] != ELFMAG0 ||\n      elf_header.e_ident[EI_MAG1] != ELFMAG1 ||\n      elf_header.e_ident[EI_MAG2] != ELFMAG2 ||\n      elf_header.e_ident[EI_MAG3] != ELFMAG3) {\n    print_message1(2, \"header magic doesn't match\\n\");\n    return false;\n  }\n\n  static const char kTextSectionName[] = \".text\";\n  const GElf_Shdr *text_section = NULL;\n  Elf_Scn *scn = NULL;\n  GElf_Shdr shdr;\n\n  while ((scn = elf_nextscn(elf, scn)) != NULL) {\n    if (gelf_getshdr(scn, &shdr) == (GElf_Shdr *)0) {\n      print_message2(2, \"failed to read section header: %s\\n\", elf_errmsg(0));\n      return false;\n    }\n\n    if (shdr.sh_type == SHT_PROGBITS) {\n      const char *section_name = elf_strptr(elf, elf_header.e_shstrndx,\n                                            shdr.sh_name);\n      if (!section_name) {\n        print_message2(2, \"Section name error: %s\\n\", elf_errmsg(-1));\n        continue;\n      }\n\n      if (strcmp(section_name, kTextSectionName) == 0) {\n        text_section = &shdr;\n        break;\n      }\n    }\n  }\n  if (text_section != NULL && text_section->sh_size > 0) {\n    *text_start = (char *)elf_base + text_section->sh_offset;\n    *text_size = text_section->sh_size;\n    return true;\n  }\n\n  return false;\n}\n\nFileID::FileID(const char *path) {\n  strcpy(path_, path);\n}\n\nclass AutoCloser {\n public:\n  AutoCloser(int fd) : fd_(fd) {}\n  ~AutoCloser() { if (fd_) close(fd_); }\n private:\n  int fd_;\n};\n\nbool FileID::ElfFileIdentifier(unsigned char identifier[16]) {\n  int fd = 0;\n  if ((fd = open(path_, O_RDONLY)) < 0)\n    return false;\n\n  AutoCloser autocloser(fd);\n  struct stat st;\n  if (fstat(fd, &st) != 0 || st.st_size <= 0)\n    return false;\n\n  void *base = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);\n  if (base == MAP_FAILED)\n    return false;\n\n  bool success = false;\n  const void *text_section = NULL;\n  int text_size = 0;\n\n  if (FindElfTextSection(fd, base, &text_section, &text_size)) {\n    MD5Context md5;\n    MD5Init(&md5);\n    MD5Update(&md5, (const unsigned char *)text_section, text_size);\n    MD5Final(identifier, &md5);\n    success = true;\n  }\n\n  munmap((char *)base, st.st_size);\n  return success;\n}\n\n// static\nbool FileID::ConvertIdentifierToString(const unsigned char identifier[16],\n                                       char *buffer, int buffer_length) {\n  if (buffer_length < 34)\n    return false;\n\n  int buffer_idx = 0;\n  for (int idx = 0; idx < 16; ++idx) {\n    int hi = (identifier[idx] >> 4) & 0x0F;\n    int lo = (identifier[idx]) & 0x0F;\n\n    buffer[buffer_idx++] = (hi >= 10) ? 'A' + hi - 10 : '0' + hi;\n    buffer[buffer_idx++] = (lo >= 10) ? 'A' + lo - 10 : '0' + lo;\n  }\n\n  // Add an extra \"0\" by the end.\n  buffer[buffer_idx++] = '0';\n\n  // NULL terminate\n  buffer[buffer_idx] = 0;\n\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/solaris/file_id.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// file_id.h: Return a unique identifier for a file\n//\n// Author: Alfred Peng\n\n#ifndef COMMON_SOLARIS_FILE_ID_H__\n#define COMMON_SOLARIS_FILE_ID_H__\n\n#include <limits.h>\n\nnamespace google_breakpad {\n\nclass FileID {\n public:\n  FileID(const char *path);\n  ~FileID() {};\n\n  // Load the identifier for the elf file path specified in the constructor into\n  // |identifier|.  Return false if the identifier could not be created for the\n  // file.\n  // The current implementation will return the MD5 hash of the file's bytes.\n  bool ElfFileIdentifier(unsigned char identifier[16]);\n\n  // Convert the |identifier| data to a NULL terminated string.  The string will\n  // be formatted as a MDCVInfoPDB70 struct.\n  // The |buffer| should be at least 34 bytes long to receive all of the data\n  // and termination. Shorter buffers will return false.\n  static bool ConvertIdentifierToString(const unsigned char identifier[16],\n                                        char *buffer, int buffer_length);\n\n private:\n  // Storage for the path specified\n  char path_[PATH_MAX];\n};\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_SOLARIS_FILE_ID_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/solaris/guid_creator.cc",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Alfred Peng\n\n#include <cassert>\n#include <ctime>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n\n#include \"common/solaris/guid_creator.h\"\n\n//\n// GUIDGenerator\n//\n// This class is used to generate random GUID.\n// Currently use random number to generate a GUID. This should be OK since\n// we don't expect crash to happen very offen.\n//\nclass GUIDGenerator {\n public:\n  GUIDGenerator() {\n    srandom(time(NULL));\n  }\n\n  bool CreateGUID(GUID *guid) const {\n    guid->data1 = random();\n    guid->data2 = (u_int16_t)(random());\n    guid->data3 = (u_int16_t)(random());\n    *reinterpret_cast<u_int32_t*>(&guid->data4[0]) = random();\n    *reinterpret_cast<u_int32_t*>(&guid->data4[4]) = random();\n    return true;\n  }\n};\n\n// Guid generator.\nconst GUIDGenerator kGuidGenerator;\n\nbool CreateGUID(GUID *guid) {\n  return kGuidGenerator.CreateGUID(guid);\n};\n\n// Parse guid to string.\nbool GUIDToString(const GUID *guid, char *buf, int buf_len) {\n  // Should allow more space the the max length of GUID.\n  assert(buf_len > kGUIDStringLength);\n  int num = snprintf(buf, buf_len, kGUIDFormatString,\n                     guid->data1, guid->data2, guid->data3,\n                     *reinterpret_cast<const u_int32_t *>(&(guid->data4[0])),\n                     *reinterpret_cast<const u_int32_t *>(&(guid->data4[4])));\n  if (num != kGUIDStringLength)\n    return false;\n\n  buf[num] = '\\0';\n  return true;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/solaris/guid_creator.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Alfred Peng\n\n#ifndef COMMON_SOLARIS_GUID_CREATOR_H__\n#define COMMON_SOLARIS_GUID_CREATOR_H__\n\n#include \"google_breakpad/common/minidump_format.h\"\n\ntypedef MDGUID GUID;\n\n// Format string for parsing GUID.\n#define kGUIDFormatString \"%08x-%04x-%04x-%08x-%08x\"\n// Length of GUID string. Don't count the ending '\\0'.\n#define kGUIDStringLength 36\n\n// Create a guid.\nbool CreateGUID(GUID *guid);\n\n// Get the string from guid.\nbool GUIDToString(const GUID *guid, char *buf, int buf_len);\n\n#endif  // COMMON_SOLARIS_GUID_CREATOR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/solaris/message_output.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Alfred Peng\n\n#ifndef COMMON_SOLARIS_MESSAGE_OUTPUT_H__\n#define COMMON_SOLARIS_MESSAGE_OUTPUT_H__\n\nnamespace google_breakpad {\n\nconst int MESSAGE_MAX = 1000;\n\n// Message output macros.\n// snprintf doesn't operate heap on Solaris, while printf and fprintf do.\n// Use snprintf here to avoid heap allocation.\n#define print_message1(std, message) \\\n  char buffer[MESSAGE_MAX]; \\\n  int len = snprintf(buffer, MESSAGE_MAX, message); \\\n  write(std, buffer, len)\n\n#define print_message2(std, message, para) \\\n  char buffer[MESSAGE_MAX]; \\\n  int len = snprintf(buffer, MESSAGE_MAX, message, para); \\\n  write(std, buffer, len);\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_SOLARIS_MESSAGE_OUTPUT_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/stabs_reader.cc",
    "content": "// Copyright (c) 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// This file implements the google_breakpad::StabsReader class.\n// See stabs_reader.h.\n\n#include \"common/stabs_reader.h\"\n\n#include <assert.h>\n#include <stab.h>\n#include <string.h>\n\nusing std::vector;\n\nnamespace google_breakpad {\n\nStabsReader::EntryIterator::EntryIterator(const ByteBuffer *buffer,\n                                          bool big_endian, size_t value_size)\n    : value_size_(value_size), cursor_(buffer, big_endian) {\n  // Actually, we could handle weird sizes just fine, but they're\n  // probably mistakes --- expressed in bits, say.\n  assert(value_size == 4 || value_size == 8);\n  entry_.index = 0;\n  Fetch();\n}\n\nvoid StabsReader::EntryIterator::Fetch() {\n  cursor_\n      .Read(4, false, &entry_.name_offset)\n      .Read(1, false, &entry_.type)\n      .Read(1, false, &entry_.other)\n      .Read(2, false, &entry_.descriptor)\n      .Read(value_size_, false, &entry_.value);\n  entry_.at_end = !cursor_;\n}\n\nStabsReader::StabsReader(const uint8_t *stab,    size_t stab_size,\n                         const uint8_t *stabstr, size_t stabstr_size,\n                         bool big_endian, size_t value_size, bool unitized,\n                         StabsHandler *handler)\n    : entries_(stab, stab_size),\n      strings_(stabstr, stabstr_size),\n      iterator_(&entries_, big_endian, value_size),\n      unitized_(unitized),\n      handler_(handler),\n      string_offset_(0),\n      next_cu_string_offset_(0),\n      current_source_file_(NULL) { }\n\nconst char *StabsReader::SymbolString() {\n  ptrdiff_t offset = string_offset_ + iterator_->name_offset;\n  if (offset < 0 || (size_t) offset >= strings_.Size()) {\n    handler_->Warning(\"symbol %d: name offset outside the string section\\n\",\n                      iterator_->index);\n    // Return our null string, to keep our promise about all names being\n    // taken from the string section.\n    offset = 0;\n  }\n  return reinterpret_cast<const char *>(strings_.start + offset);\n}\n\nbool StabsReader::Process() {\n  while (!iterator_->at_end) {\n    if (iterator_->type == N_SO) {\n      if (! ProcessCompilationUnit())\n        return false;\n    } else if (iterator_->type == N_UNDF && unitized_) {\n      // In unitized STABS (including Linux STABS, and pretty much anything\n      // else that puts STABS data in sections), at the head of each\n      // compilation unit's entries there is an N_UNDF stab giving the\n      // number of symbols in the compilation unit, and the number of bytes\n      // that compilation unit's strings take up in the .stabstr section.\n      // Each CU's strings are separate; the n_strx values are offsets\n      // within the current CU's portion of the .stabstr section.\n      //\n      // As an optimization, the GNU linker combines all the\n      // compilation units into one, with a single N_UNDF at the\n      // beginning. However, other linkers, like Gold, do not perform\n      // this optimization.\n      string_offset_ = next_cu_string_offset_;\n      next_cu_string_offset_ = iterator_->value;\n      ++iterator_;\n    }\n#if defined(HAVE_MACH_O_NLIST_H)\n    // Export symbols in Mach-O binaries look like this.\n    // This is necessary in order to be able to dump symbols\n    // from OS X system libraries.\n    else if ((iterator_->type & N_STAB) == 0 &&\n               (iterator_->type & N_TYPE) == N_SECT) {\n      ProcessExtern();\n    }\n#endif\n    else {\n      ++iterator_;\n    }\n  }\n  return true;\n}\n\nbool StabsReader::ProcessCompilationUnit() {\n  assert(!iterator_->at_end && iterator_->type == N_SO);\n\n  // There may be an N_SO entry whose name ends with a slash,\n  // indicating the directory in which the compilation occurred.\n  // The build directory defaults to NULL.\n  const char *build_directory = NULL;\n  {\n    const char *name = SymbolString();\n    if (name[0] && name[strlen(name) - 1] == '/') {\n      build_directory = name;\n      ++iterator_;\n    }\n  }\n\n  // We expect to see an N_SO entry with a filename next, indicating\n  // the start of the compilation unit.\n  {\n    if (iterator_->at_end || iterator_->type != N_SO)\n      return true;\n    const char *name = SymbolString();\n    if (name[0] == '\\0') {\n      // This seems to be a stray end-of-compilation-unit marker;\n      // consume it, but don't report the end, since we didn't see a\n      // beginning.\n      ++iterator_;\n      return true;\n    }\n    current_source_file_ = name;\n  }\n\n  if (! handler_->StartCompilationUnit(current_source_file_,\n                                       iterator_->value,\n                                       build_directory))\n    return false;\n\n  ++iterator_;\n\n  // The STABS documentation says that some compilers may emit\n  // additional N_SO entries with names immediately following the\n  // first, and that they should be ignored.  However, the original\n  // Breakpad STABS reader doesn't ignore them, so we won't either.\n\n  // Process the body of the compilation unit, up to the next N_SO.\n  while (!iterator_->at_end && iterator_->type != N_SO) {\n    if (iterator_->type == N_FUN) {\n      if (! ProcessFunction())\n        return false;\n    } else if (iterator_->type == N_SLINE) {\n      // Mac OS X STABS place SLINE records before functions.\n      Line line;\n      // The value of an N_SLINE entry that appears outside a function is\n      // the absolute address of the line.\n      line.address = iterator_->value;\n      line.filename = current_source_file_;\n      // The n_desc of a N_SLINE entry is the line number.  It's a\n      // signed 16-bit field; line numbers from 32768 to 65535 are\n      // stored as n-65536.\n      line.number = (uint16_t) iterator_->descriptor;\n      queued_lines_.push_back(line);\n      ++iterator_;\n    } else if (iterator_->type == N_SOL) {\n      current_source_file_ = SymbolString();\n      ++iterator_;\n    } else {\n      // Ignore anything else.\n      ++iterator_;\n    }\n  }\n\n  // An N_SO with an empty name indicates the end of the compilation\n  // unit.  Default to zero.\n  uint64_t ending_address = 0;\n  if (!iterator_->at_end) {\n    assert(iterator_->type == N_SO);\n    const char *name = SymbolString();\n    if (name[0] == '\\0') {\n      ending_address = iterator_->value;\n      ++iterator_;\n    }\n  }\n\n  if (! handler_->EndCompilationUnit(ending_address))\n    return false;\n\n  queued_lines_.clear();\n\n  return true;\n}\n\nbool StabsReader::ProcessFunction() {\n  assert(!iterator_->at_end && iterator_->type == N_FUN);\n\n  uint64_t function_address = iterator_->value;\n  // The STABS string for an N_FUN entry is the name of the function,\n  // followed by a colon, followed by type information for the\n  // function.  We want to pass the name alone to StartFunction.\n  const char *stab_string = SymbolString();\n  const char *name_end = strchr(stab_string, ':');\n  if (! name_end)\n    name_end = stab_string + strlen(stab_string);\n  std::string name(stab_string, name_end - stab_string);\n  if (! handler_->StartFunction(name, function_address))\n    return false;\n  ++iterator_;\n\n  // If there were any SLINE records given before the function, report them now.\n  for (vector<Line>::const_iterator it = queued_lines_.begin();\n       it != queued_lines_.end(); it++) {\n    if (!handler_->Line(it->address, it->filename, it->number))\n      return false;\n  }\n  queued_lines_.clear();\n\n  while (!iterator_->at_end) {\n    if (iterator_->type == N_SO || iterator_->type == N_FUN)\n      break;\n    else if (iterator_->type == N_SLINE) {\n      // The value of an N_SLINE entry is the offset of the line from\n      // the function's start address.\n      uint64_t line_address = function_address + iterator_->value;\n      // The n_desc of a N_SLINE entry is the line number.  It's a\n      // signed 16-bit field; line numbers from 32768 to 65535 are\n      // stored as n-65536.\n      uint16_t line_number = iterator_->descriptor;\n      if (! handler_->Line(line_address, current_source_file_, line_number))\n        return false;\n      ++iterator_;\n    } else if (iterator_->type == N_SOL) {\n      current_source_file_ = SymbolString();\n      ++iterator_;\n    } else\n      // Ignore anything else.\n      ++iterator_;\n  }\n\n  // We've reached the end of the function. See if we can figure out its\n  // ending address.\n  uint64_t ending_address = 0;\n  if (!iterator_->at_end) {\n    assert(iterator_->type == N_SO || iterator_->type == N_FUN);\n    if (iterator_->type == N_FUN) {\n      const char *symbol_name = SymbolString();\n      if (symbol_name[0] == '\\0') {\n        // An N_FUN entry with no name is a terminator for this function;\n        // its value is the function's size.\n        ending_address = function_address + iterator_->value;\n        ++iterator_;\n      } else {\n        // An N_FUN entry with a name is the next function, and we can take\n        // its value as our ending address. Don't advance the iterator, as\n        // we'll use this symbol to start the next function as well.\n        ending_address = iterator_->value;\n      }\n    } else {\n      // An N_SO entry could be an end-of-compilation-unit marker, or the\n      // start of the next compilation unit, but in either case, its value\n      // is our ending address. We don't advance the iterator;\n      // ProcessCompilationUnit will decide what to do with this symbol.\n      ending_address = iterator_->value;\n    }\n  }\n\n  if (! handler_->EndFunction(ending_address))\n    return false;\n\n  return true;\n}\n\nbool StabsReader::ProcessExtern() {\n#if defined(HAVE_MACH_O_NLIST_H)\n  assert(!iterator_->at_end &&\n         (iterator_->type & N_STAB) == 0 &&\n         (iterator_->type & N_TYPE) == N_SECT);\n#endif\n\n  // TODO(mark): only do symbols in the text section?\n  if (!handler_->Extern(SymbolString(), iterator_->value))\n    return false;\n\n  ++iterator_;\n  return true;\n}\n\n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/stabs_reader.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// stabs_reader.h: Define StabsReader, a parser for STABS debugging\n// information. A description of the STABS debugging format can be\n// found at:\n//\n//    http://sourceware.org/gdb/current/onlinedocs/stabs_toc.html\n//\n// The comments here assume you understand the format.\n//\n// This parser can handle big-endian and little-endian data, and the symbol\n// values may be either 32 or 64 bits long. It handles both STABS in\n// sections (as used on Linux) and STABS appearing directly in an\n// a.out-like symbol table (as used in Darwin OS X Mach-O files).\n\n#ifndef COMMON_STABS_READER_H__\n#define COMMON_STABS_READER_H__\n\n#include <stddef.h>\n#include <stdint.h>\n\n#ifdef HAVE_CONFIG_H\n#include <config.h>\n#endif\n\n#ifdef HAVE_A_OUT_H\n#include <a.out.h>\n#endif\n#ifdef HAVE_MACH_O_NLIST_H\n#include <mach-o/nlist.h>\n#endif\n\n#include <string>\n#include <vector>\n\n#include \"common/byte_cursor.h\"\n\nnamespace google_breakpad {\n\nclass StabsHandler;\n\nclass StabsReader {\n public:\n  // Create a reader for the STABS debug information whose .stab section is\n  // being traversed by ITERATOR, and whose .stabstr section is referred to\n  // by STRINGS. The reader will call the member functions of HANDLER to\n  // report the information it finds, when the reader's 'Process' member\n  // function is called.\n  //\n  // BIG_ENDIAN should be true if the entries in the .stab section are in\n  // big-endian form, or false if they are in little-endian form.\n  //\n  // VALUE_SIZE should be either 4 or 8, indicating the size of the 'value'\n  // field in each entry in bytes.\n  //\n  // UNITIZED should be true if the STABS data is stored in units with\n  // N_UNDF headers. This is usually the case for STABS stored in sections,\n  // like .stab/.stabstr, and usually not the case for STABS stored in the\n  // actual symbol table; UNITIZED should be true when parsing Linux stabs,\n  // false when parsing Mac OS X STABS. For details, see:\n  // http://sourceware.org/gdb/current/onlinedocs/stabs/Stab-Section-Basics.html\n  // \n  // Note that, in ELF, the .stabstr section should be found using the\n  // 'sh_link' field of the .stab section header, not by name.\n  StabsReader(const uint8_t *stab,    size_t stab_size,\n              const uint8_t *stabstr, size_t stabstr_size,\n              bool big_endian, size_t value_size, bool unitized,\n              StabsHandler *handler);\n\n  // Process the STABS data, calling the handler's member functions to\n  // report what we find.  While the handler functions return true,\n  // continue to process until we reach the end of the section.  If we\n  // processed the entire section and all handlers returned true,\n  // return true.  If any handler returned false, return false.\n  // \n  // This is only meant to be called once per StabsReader instance;\n  // resuming a prior processing pass that stopped abruptly isn't supported.\n  bool Process();\n\n private:\n\n  // An class for walking arrays of STABS entries. This isolates the main\n  // STABS reader from the exact format (size; endianness) of the entries\n  // themselves.\n  class EntryIterator {\n   public:\n    // The contents of a STABS entry, adjusted for the host's endianness,\n    // word size, 'struct nlist' layout, and so on.\n    struct Entry {\n      // True if this iterator has reached the end of the entry array. When\n      // this is set, the other members of this structure are not valid.\n      bool at_end;\n\n      // The number of this entry within the list.\n      size_t index;\n\n      // The current entry's name offset. This is the offset within the\n      // current compilation unit's strings, as establish by the N_UNDF entries.\n      size_t name_offset;\n\n      // The current entry's type, 'other' field, descriptor, and value.\n      unsigned char type;\n      unsigned char other;\n      short descriptor;\n      uint64_t value;\n    };\n\n    // Create a EntryIterator walking the entries in BUFFER. Treat the\n    // entries as big-endian if BIG_ENDIAN is true, as little-endian\n    // otherwise. Assume each entry has a 'value' field whose size is\n    // VALUE_SIZE.\n    //\n    // This would not be terribly clean to extend to other format variations,\n    // but it's enough to handle Linux and Mac, and we'd like STABS to die\n    // anyway.\n    //\n    // For the record: on Linux, STABS entry values are always 32 bits,\n    // regardless of the architecture address size (don't ask me why); on\n    // Mac, they are 32 or 64 bits long. Oddly, the section header's entry\n    // size for a Linux ELF .stab section varies according to the ELF class\n    // from 12 to 20 even as the actual entries remain unchanged.\n    EntryIterator(const ByteBuffer *buffer, bool big_endian, size_t value_size);\n\n    // Move to the next entry. This function's behavior is undefined if\n    // at_end() is true when it is called.\n    EntryIterator &operator++() { Fetch(); entry_.index++; return *this; }\n\n    // Dereferencing this iterator produces a reference to an Entry structure\n    // that holds the current entry's values. The entry is owned by this\n    // EntryIterator, and will be invalidated at the next call to operator++.\n    const Entry &operator*() const { return entry_; }\n    const Entry *operator->() const { return &entry_; }\n\n   private:\n    // Read the STABS entry at cursor_, and set entry_ appropriately.\n    void Fetch();\n\n    // The size of entries' value field, in bytes.\n    size_t value_size_;\n\n    // A byte cursor traversing buffer_.\n    ByteCursor cursor_;\n\n    // Values for the entry this iterator refers to.\n    Entry entry_;\n  };\n\n  // A source line, saved to be reported later.\n  struct Line {\n    uint64_t address;\n    const char *filename;\n    int number;\n  };\n\n  // Return the name of the current symbol.\n  const char *SymbolString();\n\n  // Process a compilation unit starting at symbol_.  Return true\n  // to continue processing, or false to abort.\n  bool ProcessCompilationUnit();\n\n  // Process a function in current_source_file_ starting at symbol_.\n  // Return true to continue processing, or false to abort.\n  bool ProcessFunction();\n\n  // Process an exported function symbol.\n  // Return true to continue processing, or false to abort.\n  bool ProcessExtern();\n\n  // The STABS entries being parsed.\n  ByteBuffer entries_;\n\n  // The string section to which the entries refer.\n  ByteBuffer strings_;\n\n  // The iterator walking the STABS entries.\n  EntryIterator iterator_;\n\n  // True if the data is \"unitized\"; see the explanation in the comment for\n  // StabsReader::StabsReader.\n  bool unitized_;\n\n  StabsHandler *handler_;\n\n  // The offset of the current compilation unit's strings within stabstr_.\n  size_t string_offset_;\n\n  // The value string_offset_ should have for the next compilation unit,\n  // as established by N_UNDF entries.\n  size_t next_cu_string_offset_;\n\n  // The current source file name.\n  const char *current_source_file_;\n\n  // Mac OS X STABS place SLINE records before functions; we accumulate a\n  // vector of these until we see the FUN record, and then report them\n  // after the StartFunction call.\n  std::vector<Line> queued_lines_;\n};\n\n// Consumer-provided callback structure for the STABS reader.  Clients\n// of the STABS reader provide an instance of this structure.  The\n// reader then invokes the member functions of that instance to report\n// the information it finds.\n//\n// The default definitions of the member functions do nothing, and return\n// true so processing will continue.\nclass StabsHandler {\n public:\n  StabsHandler() { }\n  virtual ~StabsHandler() { }\n\n  // Some general notes about the handler callback functions:\n\n  // Processing proceeds until the end of the .stabs section, or until\n  // one of these functions returns false.\n\n  // The addresses given are as reported in the STABS info, without\n  // regard for whether the module may be loaded at different\n  // addresses at different times (a shared library, say).  When\n  // processing STABS from an ELF shared library, the addresses given\n  // all assume the library is loaded at its nominal load address.\n  // They are *not* offsets from the nominal load address.  If you\n  // want offsets, you must subtract off the library's nominal load\n  // address.\n\n  // The arguments to these functions named FILENAME are all\n  // references to strings stored in the .stabstr section.  Because\n  // both the Linux and Solaris linkers factor out duplicate strings\n  // from the .stabstr section, the consumer can assume that if two\n  // FILENAME values are different addresses, they represent different\n  // file names.\n  //\n  // Thus, it's safe to use (say) std::map<char *, ...>, which does\n  // string address comparisons, not string content comparisons.\n  // Since all the strings are in same array of characters --- the\n  // .stabstr section --- comparing their addresses produces\n  // predictable, if not lexicographically meaningful, results.\n\n  // Begin processing a compilation unit whose main source file is\n  // named FILENAME, and whose base address is ADDRESS.  If\n  // BUILD_DIRECTORY is non-NULL, it is the name of the build\n  // directory in which the compilation occurred.\n  virtual bool StartCompilationUnit(const char *filename, uint64_t address,\n                                    const char *build_directory) {\n    return true;\n  }\n\n  // Finish processing the compilation unit.  If ADDRESS is non-zero,\n  // it is the ending address of the compilation unit.  If ADDRESS is\n  // zero, then the compilation unit's ending address is not\n  // available, and the consumer must infer it by other means.\n  virtual bool EndCompilationUnit(uint64_t address) { return true; }\n\n  // Begin processing a function named NAME, whose starting address is\n  // ADDRESS.  This function belongs to the compilation unit that was\n  // most recently started but not ended.\n  //\n  // Note that, unlike filenames, NAME is not a pointer into the\n  // .stabstr section; this is because the name as it appears in the\n  // STABS data is followed by type information.  The value passed to\n  // StartFunction is the function name alone.\n  //\n  // In languages that use name mangling, like C++, NAME is mangled.\n  virtual bool StartFunction(const std::string &name, uint64_t address) {\n    return true;\n  }\n\n  // Finish processing the function.  If ADDRESS is non-zero, it is\n  // the ending address for the function.  If ADDRESS is zero, then\n  // the function's ending address is not available, and the consumer\n  // must infer it by other means.\n  virtual bool EndFunction(uint64_t address) { return true; }\n  \n  // Report that the code at ADDRESS is attributable to line NUMBER of\n  // the source file named FILENAME.  The caller must infer the ending\n  // address of the line.\n  virtual bool Line(uint64_t address, const char *filename, int number) {\n    return true;\n  }\n\n  // Report that an exported function NAME is present at ADDRESS.\n  // The size of the function is unknown.\n  virtual bool Extern(const std::string &name, uint64_t address) {\n    return true;\n  }\n\n  // Report a warning.  FORMAT is a printf-like format string,\n  // specifying how to format the subsequent arguments.\n  virtual void Warning(const char *format, ...) = 0;\n};\n\n} // namespace google_breakpad\n\n#endif  // COMMON_STABS_READER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/stabs_reader_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// stabs_reader_unittest.cc: Unit tests for google_breakpad::StabsReader.\n\n#include <assert.h>\n#include <errno.h>\n#include <stab.h>\n#include <stdarg.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <fstream>\n#include <iomanip>\n#include <iostream>\n#include <map>\n#include <sstream>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/stabs_reader.h\"\n#include \"common/test_assembler.h\"\n\nusing ::testing::Eq;\nusing ::testing::InSequence;\nusing ::testing::Return;\nusing ::testing::StrEq;\nusing ::testing::Test;\nusing ::testing::_;\nusing google_breakpad::StabsHandler;\nusing google_breakpad::StabsReader;\nusing google_breakpad::test_assembler::Label;\nusing google_breakpad::test_assembler::Section;\nusing google_breakpad::test_assembler::kBigEndian;\nusing google_breakpad::test_assembler::kLittleEndian;\nusing std::map;\nusing std::string;\n\nnamespace {\n\n// A StringAssembler is a class for generating .stabstr sections to present\n// as input to the STABS parser.\nclass StringAssembler: public Section {\n public:\n  StringAssembler() : in_cu_(false) { StartCU(); }\n\n  // Add the string S to this StringAssembler, and return the string's\n  // offset within this compilation unit's strings. If S has been added\n  // already, this returns the offset of its first instance.\n  size_t Add(const string &s) {\n    map<string, size_t>::iterator it = added_.find(s);\n    if (it != added_.end())\n      return it->second;\n    size_t offset = Size() - cu_start_;\n    AppendCString(s);\n    added_[s] = offset;\n    return offset;\n  }\n\n  // Start a fresh compilation unit string collection.\n  void StartCU() {\n    // Ignore duplicate calls to StartCU. Our test data don't always call\n    // StartCU at all, meaning that our constructor has to take care of it,\n    // meaning that tests that *do* call StartCU call it twice at the\n    // beginning.  This is not worth smoothing out.\n    if (in_cu_) return;\n\n    added_.clear();\n    cu_start_ = Size();\n\n    // Each compilation unit's strings start with an empty string.\n    AppendCString(\"\");\n    added_[\"\"] = 0;\n\n    in_cu_ = true;\n  }\n  \n  // Finish off the current CU's strings.\n  size_t EndCU() { \n    assert(in_cu_);\n    in_cu_ = false;\n    return Size() - cu_start_;\n  }\n\n private:\n  // The offset of the start of this compilation unit's strings.\n  size_t cu_start_;\n\n  // True if we're in a CU.\n  bool in_cu_;\n\n  // A map from the strings that have been added to this section to\n  // their starting indices within their compilation unit.\n  map<string, size_t> added_;\n};\n\n// A StabsAssembler is a class for generating .stab sections to present as\n// test input for the STABS parser.\nclass StabsAssembler: public Section {\n public:\n  // Create a StabsAssembler that uses StringAssembler for its strings.\n  StabsAssembler(StringAssembler *string_assembler) \n      : Section(string_assembler->endianness()),\n        string_assembler_(string_assembler),\n        value_size_(0),\n        entry_count_(0),\n        cu_header_(NULL) { }\n  ~StabsAssembler() { assert(!cu_header_); }\n\n  // Accessor and setter for value_size_.\n  size_t value_size() const { return value_size_; }\n  StabsAssembler &set_value_size(size_t value_size) {\n    value_size_ = value_size;\n    return *this;\n  }\n\n  // Append a STAB entry to the end of this section with the given\n  // characteristics. NAME is the offset of this entry's name string within\n  // its compilation unit's portion of the .stabstr section; this can be a\n  // value generated by a StringAssembler. Return a reference to this\n  // StabsAssembler.\n  StabsAssembler &Stab(uint8_t type, uint8_t other, Label descriptor,\n                       Label value, Label name) {\n    D32(name);\n    D8(type);\n    D8(other);\n    D16(descriptor);\n    Append(endianness(), value_size_, value);\n    entry_count_++;\n    return *this;\n  }\n\n  // As above, but automatically add NAME to our StringAssembler.\n  StabsAssembler &Stab(uint8_t type, uint8_t other, Label descriptor,\n                       Label value, const string &name) {\n    return Stab(type, other, descriptor, value, string_assembler_->Add(name));\n  }\n\n  // Start a compilation unit named NAME, with an N_UNDF symbol to start\n  // it, and its own portion of the string section. Return a reference to\n  // this StabsAssembler.\n  StabsAssembler &StartCU(const string &name) {\n    assert(!cu_header_);\n    cu_header_ = new CUHeader;\n    string_assembler_->StartCU();\n    entry_count_ = 0;\n    return Stab(N_UNDF, 0,\n                cu_header_->final_entry_count,\n                cu_header_->final_string_size,\n                string_assembler_->Add(name));\n  }\n\n  // Close off the current compilation unit. Return a reference to this\n  // StabsAssembler.\n  StabsAssembler &EndCU() {\n    assert(cu_header_);\n    cu_header_->final_entry_count = entry_count_;\n    cu_header_->final_string_size = string_assembler_->EndCU();\n    delete cu_header_;\n    cu_header_ = NULL;\n    return *this;\n  }\n  \n private:\n  // Data used in a compilation unit header STAB that we won't know until\n  // we've finished the compilation unit.\n  struct CUHeader {\n    // The final number of entries this compilation unit will hold.\n    Label final_entry_count;\n\n    // The final size of this compilation unit's strings.\n    Label final_string_size;\n  };\n\n  // The strings for our STABS entries.\n  StringAssembler *string_assembler_;\n\n  // The size of the 'value' field of stabs entries in this section.\n  size_t value_size_;\n\n  // The number of entries in this compilation unit so far.\n  size_t entry_count_;\n\n  // Header labels for this compilation unit, if we've started one but not\n  // finished it.\n  CUHeader *cu_header_;\n};\n\nclass MockStabsReaderHandler: public StabsHandler {\n public:\n  MOCK_METHOD3(StartCompilationUnit,\n               bool(const char *, uint64_t, const char *));\n  MOCK_METHOD1(EndCompilationUnit, bool(uint64_t));\n  MOCK_METHOD2(StartFunction, bool(const std::string &, uint64_t));\n  MOCK_METHOD1(EndFunction, bool(uint64_t));\n  MOCK_METHOD3(Line, bool(uint64_t, const char *, int));\n  MOCK_METHOD2(Extern, bool(const std::string &, uint64_t));\n  void Warning(const char *format, ...) { MockWarning(format); }\n  MOCK_METHOD1(MockWarning, void(const char *));\n};\n\nstruct StabsFixture {\n  StabsFixture() : stabs(&strings), unitized(true) { }\n\n  // Create a StabsReader to parse the mock stabs data in stabs and\n  // strings, and pass the parsed information to mock_handler. Use the\n  // endianness and value size of stabs to parse the data. If all goes\n  // well, return the result of calling the reader's Process member\n  // function. Otherwise, return false.\n  bool ApplyHandlerToMockStabsData() {\n    string stabs_contents, stabstr_contents;\n    if (!stabs.GetContents(&stabs_contents) ||\n        !strings.GetContents(&stabstr_contents))\n      return false;\n\n    // Run the parser on the test input, passing whatever we find to HANDLER.\n    StabsReader reader(\n        reinterpret_cast<const uint8_t *>(stabs_contents.data()),\n        stabs_contents.size(),\n        reinterpret_cast<const uint8_t *>(stabstr_contents.data()),\n        stabstr_contents.size(),\n        stabs.endianness() == kBigEndian, stabs.value_size(), unitized,\n        &mock_handler);\n    return reader.Process();\n  }\n\n  StringAssembler strings;\n  StabsAssembler stabs;\n  bool unitized;\n  MockStabsReaderHandler mock_handler;\n};\n\nclass Stabs: public StabsFixture, public Test { };\n\nTEST_F(Stabs, MockStabsInput) {\n  stabs.set_endianness(kLittleEndian);\n  stabs.set_value_size(4);\n  stabs\n      .Stab(N_SO,      149, 40232, 0x18a2a72bU, \"builddir/\")\n      .Stab(N_FUN,      83, 50010, 0x91a5353fU, \n            \"not the SO with source file name we expected \")\n      .Stab(N_SO,      165, 24791, 0xfe69d23cU, \"\")\n      .Stab(N_SO,      184, 34178, 0xca4d883aU, \"builddir1/\")\n      .Stab(N_SO,       83, 40859, 0xd2fe5df3U, \"file1.c\")\n      .Stab(N_LSYM,    147, 39565, 0x60d4bb8aU, \"not the FUN we're looking for\")\n      .Stab(N_FUN,     120, 50271, 0xa049f4b1U, \"fun1\")\n      .Stab(N_BINCL,   150, 15694, 0xef65c659U, \n            \"something to ignore in a FUN body\")\n      .Stab(N_SLINE,   147,  4967, 0xd904b3f, \"\")\n      .Stab(N_SOL,     177, 56135, 0xbd97b1dcU, \"header.h\")\n      .Stab(N_SLINE,   130, 24610, 0x90f145b, \"\")\n      .Stab(N_FUN,      45, 32441, 0xbf27cf93U, \n            \"fun2:some stabs type info here:to trim from the name\")\n      .Stab(N_SLINE,   138, 39002, 0x8148b87, \"\")\n      .Stab(N_SOL,      60, 49318, 0x1d06e025U, \"file1.c\")\n      .Stab(N_SLINE,    29, 52163, 0x6eebbb7, \"\")\n      .Stab(N_SO,      167,  4647, 0xd04b7448U, \"\")\n      .Stab(N_LSYM,     58, 37837, 0xe6b14d37U, \"\")\n      .Stab(N_SO,      152,  7810, 0x11759f10U, \"file3.c\")\n      .Stab(N_SO,      218, 12447, 0x11cfe4b5U, \"\");\n\n  {\n    InSequence s;\n\n    EXPECT_CALL(mock_handler,\n                StartCompilationUnit(StrEq(\"file1.c\"), 0xd2fe5df3U,\n                                     StrEq(\"builddir1/\")))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, StartFunction(StrEq(\"fun1\"), 0xa049f4b1U))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler,\n                Line(0xa049f4b1U + 0xd904b3f, StrEq(\"file1.c\"), 4967))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler,\n                Line(0xa049f4b1U + 0x90f145b, StrEq(\"header.h\"), 24610))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndFunction(0xbf27cf93U))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, StartFunction(StrEq(\"fun2\"), 0xbf27cf93U))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler,\n                Line(0xbf27cf93U + 0x8148b87, StrEq(\"header.h\"), 39002))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler,\n                Line(0xbf27cf93U + 0x6eebbb7, StrEq(\"file1.c\"), 52163))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndFunction(0xd04b7448U))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndCompilationUnit(0xd04b7448U))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, StartCompilationUnit(StrEq(\"file3.c\"), \n                                                   0x11759f10U, NULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndCompilationUnit(0x11cfe4b5U))\n        .WillOnce(Return(true));\n  }\n\n  ASSERT_TRUE(ApplyHandlerToMockStabsData());\n}\n\nTEST_F(Stabs, AbruptCU) {\n  stabs.set_endianness(kBigEndian);\n  stabs.set_value_size(4);\n  stabs.Stab(N_SO, 177, 23446, 0xbf10d5e4, \"file2-1.c\");\n\n  {\n    InSequence s;\n\n    EXPECT_CALL(mock_handler,\n                StartCompilationUnit(StrEq(\"file2-1.c\"), 0xbf10d5e4, NULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndCompilationUnit(NULL))\n        .WillOnce(Return(true));\n  }\n\n  ASSERT_TRUE(ApplyHandlerToMockStabsData());\n}\n\nTEST_F(Stabs, AbruptFunction) {\n  stabs.set_endianness(kLittleEndian);\n  stabs.set_value_size(8);\n  stabs\n      .Stab(N_SO,      218,   26631,   0xb83ddf10U, \"file3-1.c\")\n      .Stab(N_FUN,     113,   24765,   0xbbd4a145U, \"fun3_1\");\n\n  {\n    InSequence s;\n\n    EXPECT_CALL(mock_handler,\n                StartCompilationUnit(StrEq(\"file3-1.c\"), 0xb83ddf10U, NULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, StartFunction(StrEq(\"fun3_1\"), 0xbbd4a145U))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndFunction(NULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndCompilationUnit(NULL))\n        .WillOnce(Return(true));\n  }\n\n  ASSERT_TRUE(ApplyHandlerToMockStabsData());\n}\n\nTEST_F(Stabs, NoCU) {\n  stabs.set_endianness(kBigEndian);\n  stabs.set_value_size(8);\n  stabs.Stab(N_SO, 161, 25673, 0x8f676e7bU, \"build-directory/\");\n\n  EXPECT_CALL(mock_handler, StartCompilationUnit(_, _, _))\n      .Times(0);\n  EXPECT_CALL(mock_handler, StartFunction(_, _))\n      .Times(0);\n\n  ASSERT_TRUE(ApplyHandlerToMockStabsData());\n}\n\nTEST_F(Stabs, NoCUEnd) {\n  stabs.set_endianness(kBigEndian);\n  stabs.set_value_size(8);\n  stabs\n      .Stab(N_SO,      116,   58280,   0x2f7493c9U, \"file5-1.c\")\n      .Stab(N_SO,      224,   23057,   0xf9f1d50fU, \"file5-2.c\");\n\n  {\n    InSequence s;\n\n    EXPECT_CALL(mock_handler,\n                StartCompilationUnit(StrEq(\"file5-1.c\"), 0x2f7493c9U, NULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndCompilationUnit(NULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler,\n                StartCompilationUnit(StrEq(\"file5-2.c\"), 0xf9f1d50fU, NULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndCompilationUnit(NULL))\n        .WillOnce(Return(true));\n  }\n\n  ASSERT_TRUE(ApplyHandlerToMockStabsData());\n}\n\n// On systems that store STABS in sections, string offsets are relative to\n// the beginning of that compilation unit's strings, marked with N_UNDF\n// symbols; see the comments for StabsReader::StabsReader.\nTEST_F(Stabs, Unitized) {\n  stabs.set_endianness(kBigEndian);\n  stabs.set_value_size(4);\n  stabs\n      .StartCU(\"antimony\")\n      .Stab(N_SO,   49, 26043, 0x7e259f1aU, \"antimony\")\n      .Stab(N_FUN, 101, 63253, 0x7fbcccaeU, \"arsenic\")\n      .Stab(N_SO,  124, 37175, 0x80b0014cU, \"\")\n      .EndCU()\n      .StartCU(\"aluminum\")\n      .Stab(N_SO,   72, 23084, 0x86756839U, \"aluminum\")\n      .Stab(N_FUN,  59,  3305, 0xa8e120b0U, \"selenium\")\n      .Stab(N_SO,  178, 56949, 0xbffff983U, \"\")\n      .EndCU();\n\n  {\n    InSequence s;\n    EXPECT_CALL(mock_handler,\n                StartCompilationUnit(StrEq(\"antimony\"), 0x7e259f1aU, NULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, StartFunction(Eq(\"arsenic\"), 0x7fbcccaeU))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndFunction(0x80b0014cU))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndCompilationUnit(0x80b0014cU))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler,\n                StartCompilationUnit(StrEq(\"aluminum\"), 0x86756839U, NULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, StartFunction(Eq(\"selenium\"), 0xa8e120b0U))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndFunction(0xbffff983U))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndCompilationUnit(0xbffff983U))\n        .WillOnce(Return(true));\n  }\n\n  ASSERT_TRUE(ApplyHandlerToMockStabsData());\n}\n\n// On systems that store STABS entries in the real symbol table, the N_UNDF\n// entries have no special meaning, and shouldn't mess up the string\n// indices.\nTEST_F(Stabs, NonUnitized) {\n  stabs.set_endianness(kLittleEndian);\n  stabs.set_value_size(4);\n  unitized = false;\n  stabs\n      .Stab(N_UNDF,    21, 11551, 0x9bad2b2e, \"\")\n      .Stab(N_UNDF,    21, 11551, 0x9bad2b2e, \"\")\n      .Stab(N_SO,      71, 45139, 0x11a97352, \"Tanzania\")\n      .Stab(N_SO,     221, 41976, 0x21a97352, \"\");\n\n  {\n    InSequence s;\n    EXPECT_CALL(mock_handler,\n                StartCompilationUnit(StrEq(\"Tanzania\"),\n                                     0x11a97352, NULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndCompilationUnit(0x21a97352))\n        .WillOnce(Return(true));\n  }\n\n  ASSERT_TRUE(ApplyHandlerToMockStabsData());\n}\n\nTEST_F(Stabs, FunctionEnd) {\n  stabs.set_endianness(kLittleEndian);\n  stabs.set_value_size(8);\n  stabs\n      .Stab(N_SO,    102, 62362, 0x52a830d644cd6942ULL, \"compilation unit\")\n      // This function is terminated by the start of the next function.\n      .Stab(N_FUN,   216, 38405, 0xbb5ab70ecdd23bfeULL, \"function 1\")\n      // This function is terminated by an explicit end-of-function stab,\n      // whose value is a size in bytes.\n      .Stab(N_FUN,   240, 10973, 0xc954de9b8fb3e5e2ULL, \"function 2\")\n      .Stab(N_FUN,    14, 36749, 0xc1ab,     \"\")\n      // This function is terminated by the end of the compilation unit.\n      .Stab(N_FUN,   143, 64514, 0xdff98c9a35386e1fULL, \"function 3\")\n      .Stab(N_SO,    164, 60142, 0xfdacb856e78bbf57ULL, \"\");\n\n  {\n    InSequence s;\n    EXPECT_CALL(mock_handler,\n                StartCompilationUnit(StrEq(\"compilation unit\"),\n                                     0x52a830d644cd6942ULL, NULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler,\n                StartFunction(Eq(\"function 1\"), 0xbb5ab70ecdd23bfeULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndFunction(0xc954de9b8fb3e5e2ULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler,\n                StartFunction(Eq(\"function 2\"), 0xc954de9b8fb3e5e2ULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndFunction(0xc954de9b8fb3e5e2ULL + 0xc1ab))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler,\n                StartFunction(Eq(\"function 3\"), 0xdff98c9a35386e1fULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndFunction(0xfdacb856e78bbf57ULL))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndCompilationUnit(0xfdacb856e78bbf57ULL))\n        .WillOnce(Return(true));\n  }\n\n  ASSERT_TRUE(ApplyHandlerToMockStabsData());\n}\n\n// On Mac OS X, SLINE records can appear before the FUN stab to which they\n// belong, and their values are absolute addresses, not offsets.\nTEST_F(Stabs, LeadingLine) {\n  stabs.set_endianness(kBigEndian);\n  stabs.set_value_size(4);\n  stabs\n      .Stab(N_SO,    179, 27357, 0x8adabc15, \"build directory/\")\n      .Stab(N_SO,     52, 53058, 0x4c7e3bf4, \"compilation unit\")\n      .Stab(N_SOL,   165, 12086, 0x6a797ca3, \"source file name\")\n      .Stab(N_SLINE, 229, 20015, 0x4cb3d7e0, \"\")\n      .Stab(N_SLINE,  89, 43802, 0x4cba8b88, \"\")\n      .Stab(N_FUN,   251, 51639, 0xce1b98fa, \"rutabaga\")\n      .Stab(N_FUN,   218, 16113, 0x5798,     \"\")\n      .Stab(N_SO,     52, 53058, 0xd4af4415, \"\");\n\n  {\n    InSequence s;\n    EXPECT_CALL(mock_handler,\n                StartCompilationUnit(StrEq(\"compilation unit\"),\n                                     0x4c7e3bf4, StrEq(\"build directory/\")))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler,\n                StartFunction(Eq(\"rutabaga\"), 0xce1b98fa))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler,\n                Line(0x4cb3d7e0, StrEq(\"source file name\"), 20015))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler,\n                Line(0x4cba8b88, StrEq(\"source file name\"), 43802))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndFunction(0xce1b98fa + 0x5798))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler, EndCompilationUnit(0xd4af4415))\n        .WillOnce(Return(true));\n  }\n\n  ASSERT_TRUE(ApplyHandlerToMockStabsData());\n}\n\n\n#if defined(HAVE_MACH_O_NLIST_H)\n// These tests have no meaning on non-Mach-O-based systems, as\n// only Mach-O uses N_SECT to represent public symbols.\nTEST_F(Stabs, OnePublicSymbol) {\n  stabs.set_endianness(kLittleEndian);\n  stabs.set_value_size(4);\n\n  const u_int32_t kExpectedAddress = 0x9000;\n  const string kExpectedFunctionName(\"public_function\");\n  stabs\n    .Stab(N_SECT, 1, 0, kExpectedAddress, kExpectedFunctionName);\n\n  {\n    InSequence s;\n    EXPECT_CALL(mock_handler,\n                Extern(StrEq(kExpectedFunctionName),\n                       kExpectedAddress))\n        .WillOnce(Return(true));\n  }\n  ASSERT_TRUE(ApplyHandlerToMockStabsData());\n}\n\nTEST_F(Stabs, TwoPublicSymbols) {\n  stabs.set_endianness(kLittleEndian);\n  stabs.set_value_size(4);\n\n  const u_int32_t kExpectedAddress1 = 0xB0B0B0B0;\n  const string kExpectedFunctionName1(\"public_function\");\n  const u_int32_t kExpectedAddress2 = 0xF0F0F0F0;\n  const string kExpectedFunctionName2(\"something else\");\n  stabs\n    .Stab(N_SECT, 1, 0, kExpectedAddress1, kExpectedFunctionName1)\n    .Stab(N_SECT, 1, 0, kExpectedAddress2, kExpectedFunctionName2);\n\n  {\n    InSequence s;\n    EXPECT_CALL(mock_handler,\n                Extern(StrEq(kExpectedFunctionName1),\n                       kExpectedAddress1))\n        .WillOnce(Return(true));\n    EXPECT_CALL(mock_handler,\n                Extern(StrEq(kExpectedFunctionName2),\n                       kExpectedAddress2))\n        .WillOnce(Return(true));\n  }\n  ASSERT_TRUE(ApplyHandlerToMockStabsData());\n}\n\n#endif\n\n} // anonymous namespace\n"
  },
  {
    "path": "archive/spotify/breakpad/common/stabs_to_module.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dump_stabs.cc --- implement the StabsToModule class.\n\n#include <assert.h>\n#include <cxxabi.h>\n#include <stdarg.h>\n#include <stdio.h>\n\n#include <algorithm>\n\n#include \"common/stabs_to_module.h\"\n\nnamespace google_breakpad {\n\nusing std::string;\n\n// Demangle using abi call.\n// Older GCC may not support it.\nstatic string Demangle(const string &mangled) {\n  int status = 0;\n  char *demangled = abi::__cxa_demangle(mangled.c_str(), NULL, NULL, &status);\n  if (status == 0 && demangled != NULL) {\n    string str(demangled);\n    free(demangled);\n    return str;\n  }\n  return string(mangled);\n}\n\nStabsToModule::~StabsToModule() {\n  // Free any functions we've accumulated but not added to the module.\n  for (vector<Module::Function *>::const_iterator func_it = functions_.begin();\n       func_it != functions_.end(); func_it++)\n    delete *func_it;\n  // Free any function that we're currently within.\n  delete current_function_;\n}\n\nbool StabsToModule::StartCompilationUnit(const char *name, uint64_t address,\n                                         const char *build_directory) {\n  assert(!in_compilation_unit_);\n  in_compilation_unit_ = true;\n  current_source_file_name_ = name;\n  current_source_file_ = module_->FindFile(name);\n  comp_unit_base_address_ = address;\n  boundaries_.push_back(static_cast<Module::Address>(address));\n  return true;\n}\n\nbool StabsToModule::EndCompilationUnit(uint64_t address) {\n  assert(in_compilation_unit_);\n  in_compilation_unit_ = false;\n  comp_unit_base_address_ = 0;\n  current_source_file_ = NULL;\n  current_source_file_name_ = NULL;\n  if (address)\n    boundaries_.push_back(static_cast<Module::Address>(address));\n  return true;\n}\n\nbool StabsToModule::StartFunction(const string &name,\n                                  uint64_t address) {\n  assert(!current_function_);\n  Module::Function *f = new Module::Function;\n  f->name = Demangle(name);\n  f->address = address;\n  f->size = 0;           // We compute this in StabsToModule::Finalize().\n  f->parameter_size = 0; // We don't provide this information.\n  current_function_ = f;\n  boundaries_.push_back(static_cast<Module::Address>(address));\n  return true;\n}\n\nbool StabsToModule::EndFunction(uint64_t address) {\n  assert(current_function_);\n  // Functions in this compilation unit should have address bigger\n  // than the compilation unit's starting address.  There may be a lot\n  // of duplicated entries for functions in the STABS data. We will\n  // count on the Module to remove the duplicates.\n  if (current_function_->address >= comp_unit_base_address_)\n    functions_.push_back(current_function_);\n  else\n    delete current_function_;\n  current_function_ = NULL;\n  if (address)\n    boundaries_.push_back(static_cast<Module::Address>(address));\n  return true;\n}\n\nbool StabsToModule::Line(uint64_t address, const char *name, int number) {\n  assert(current_function_);\n  assert(current_source_file_);\n  if (name != current_source_file_name_) {\n    current_source_file_ = module_->FindFile(name);\n    current_source_file_name_ = name;\n  }\n  Module::Line line;\n  line.address = address;\n  line.size = 0;  // We compute this in StabsToModule::Finalize().\n  line.file = current_source_file_;\n  line.number = number;\n  current_function_->lines.push_back(line);\n  return true;\n}\n\nbool StabsToModule::Extern(const string &name, uint64_t address) {\n  Module::Extern *ext = new Module::Extern;\n  // Older libstdc++ demangle implementations can crash on unexpected\n  // input, so be careful about what gets passed in.\n  if (name.compare(0, 3, \"__Z\") == 0) {\n    ext->name = Demangle(name.substr(1));\n  } else if (name[0] == '_') {\n    ext->name = name.substr(1);\n  } else {\n    ext->name = name;\n  }\n  ext->address = address;\n  module_->AddExtern(ext);\n  return true;\n}\n\nvoid StabsToModule::Warning(const char *format, ...) {\n  va_list args;\n  va_start(args, format);\n  vfprintf(stderr, format, args);\n  va_end(args);\n}\n\nvoid StabsToModule::Finalize() {\n  // Sort our boundary list, so we can search it quickly.\n  sort(boundaries_.begin(), boundaries_.end());\n  // Sort all functions by address, just for neatness.\n  sort(functions_.begin(), functions_.end(),\n       Module::Function::CompareByAddress);\n\n  for (vector<Module::Function *>::const_iterator func_it = functions_.begin();\n       func_it != functions_.end();\n       func_it++) {\n    Module::Function *f = *func_it;\n    // Compute the function f's size.\n    vector<Module::Address>::const_iterator boundary\n        = std::upper_bound(boundaries_.begin(), boundaries_.end(), f->address);\n    if (boundary != boundaries_.end())\n      f->size = *boundary - f->address;\n    else\n      // If this is the last function in the module, and the STABS\n      // reader was unable to give us its ending address, then assign\n      // it a bogus, very large value.  This will happen at most once\n      // per module: since we've added all functions' addresses to the\n      // boundary table, only one can be the last.\n      f->size = kFallbackSize;\n\n    // Compute sizes for each of the function f's lines --- if it has any.\n    if (!f->lines.empty()) {\n      stable_sort(f->lines.begin(), f->lines.end(),\n                  Module::Line::CompareByAddress);\n      vector<Module::Line>::iterator last_line = f->lines.end() - 1;\n      for (vector<Module::Line>::iterator line_it = f->lines.begin();\n           line_it != last_line; line_it++)\n        line_it[0].size = line_it[1].address - line_it[0].address;\n      // Compute the size of the last line from f's end address.\n      last_line->size = (f->address + f->size) - last_line->address;\n    }\n  }\n  // Now that everything has a size, add our functions to the module, and\n  // dispose of our private list.\n  module_->AddFunctions(functions_.begin(), functions_.end());\n  functions_.clear();\n}\n\n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/stabs_to_module.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dump_stabs.h: Define the StabsToModule class, which receives\n// STABS debugging information from a parser and adds it to a Breakpad\n// symbol file.\n\n#ifndef BREAKPAD_COMMON_STABS_TO_MODULE_H_\n#define BREAKPAD_COMMON_STABS_TO_MODULE_H_\n\n#include <stdint.h>\n\n#include <string>\n#include <vector>\n\n#include \"common/module.h\"\n#include \"common/stabs_reader.h\"\n\nnamespace google_breakpad {\n\nusing std::string;\nusing std::vector;\n\n// A StabsToModule is a handler that receives parsed STABS debugging \n// information from a StabsReader, and uses that to populate\n// a Module. (All classes are in the google_breakpad namespace.) A\n// Module represents the contents of a Breakpad symbol file, and knows\n// how to write itself out as such. A StabsToModule thus acts as\n// the bridge between STABS and Breakpad data.\n// When processing Darwin Mach-O files, this also receives public linker\n// symbols, like those found in system libraries.\nclass StabsToModule: public google_breakpad::StabsHandler {\n public:\n  // Receive parsed debugging information from a StabsReader, and\n  // store it all in MODULE.\n  StabsToModule(Module *module) :\n      module_(module),\n      in_compilation_unit_(false),\n      comp_unit_base_address_(0),\n      current_function_(NULL),\n      current_source_file_(NULL),\n      current_source_file_name_(NULL) { }\n  ~StabsToModule();\n\n  // The standard StabsHandler virtual member functions.\n  bool StartCompilationUnit(const char *name, uint64_t address,\n                            const char *build_directory);\n  bool EndCompilationUnit(uint64_t address);\n  bool StartFunction(const string &name, uint64_t address);\n  bool EndFunction(uint64_t address);\n  bool Line(uint64_t address, const char *name, int number);\n  bool Extern(const string &name, uint64_t address);\n  void Warning(const char *format, ...);\n\n  // Do any final processing necessary to make module_ contain all the\n  // data provided by the STABS reader.\n  //\n  // Because STABS does not provide reliable size information for\n  // functions and lines, we need to make a pass over the data after\n  // processing all the STABS to compute those sizes.  We take care of\n  // that here.\n  void Finalize();\n\n private:\n\n  // An arbitrary, but very large, size to use for functions whose\n  // size we can't compute properly.\n  static const uint64_t kFallbackSize = 0x10000000;\n\n  // The module we're contributing debugging info to.\n  Module *module_;\n\n  // The functions we've generated so far.  We don't add these to\n  // module_ as we parse them.  Instead, we wait until we've computed\n  // their ending address, and their lines' ending addresses.\n  //\n  // We could just stick them in module_ from the outset, but if\n  // module_ already contains data gathered from other debugging\n  // formats, that would complicate the size computation.\n  vector<Module::Function *> functions_;\n\n  // Boundary addresses.  STABS doesn't necessarily supply sizes for\n  // functions and lines, so we need to compute them ourselves by\n  // finding the next object.\n  vector<Module::Address> boundaries_;\n\n  // True if we are currently within a compilation unit: we have gotten a\n  // StartCompilationUnit call, but no matching EndCompilationUnit call\n  // yet. We use this for sanity checks.\n  bool in_compilation_unit_;\n\n  // The base address of the current compilation unit.  We use this to\n  // recognize functions we should omit from the symbol file.  (If you\n  // know the details of why we omit these, please patch this\n  // comment.)\n  Module::Address comp_unit_base_address_;\n\n  // The function we're currently contributing lines to.\n  Module::Function *current_function_;\n\n  // The last Module::File we got a line number in.\n  Module::File *current_source_file_;\n\n  // The pointer in the .stabstr section of the name that\n  // current_source_file_ is built from.  This allows us to quickly\n  // recognize when the current line is in the same file as the\n  // previous one (which it usually is).\n  const char *current_source_file_name_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // BREAKPAD_COMMON_STABS_TO_MODULE_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/stabs_to_module_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// dump_stabs_unittest.cc: Unit tests for StabsToModule.\n\n#include <vector>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/stabs_to_module.h\"\n\nusing google_breakpad::Module;\nusing google_breakpad::StabsToModule;\nusing std::vector;\n\nTEST(StabsToModule, SimpleCU) {\n  Module m(\"name\", \"os\", \"arch\", \"id\");\n  StabsToModule h(&m);\n\n  // Feed in a simple compilation unit that defines a function with\n  // one line.\n  EXPECT_TRUE(h.StartCompilationUnit(\"compilation-unit\", 0x9f4d1271e50db93bLL,\n                                     \"build-directory\"));\n  EXPECT_TRUE(h.StartFunction(\"function\", 0xfde4abbed390c394LL));\n  EXPECT_TRUE(h.Line(0xfde4abbed390c394LL, \"source-file-name\", 174823314));\n  EXPECT_TRUE(h.EndFunction(0xfde4abbed390c3a4LL));\n  EXPECT_TRUE(h.EndCompilationUnit(0xfee4abbed390c3a4LL));\n  h.Finalize();\n\n  // Now check to see what has been added to the Module.\n  Module::File *file = m.FindExistingFile(\"source-file-name\");\n  ASSERT_TRUE(file != NULL);\n\n  vector<Module::Function *> functions;\n  m.GetFunctions(&functions, functions.end());\n  ASSERT_EQ((size_t) 1, functions.size());\n  Module::Function *function = functions[0];\n  EXPECT_STREQ(\"function\", function->name.c_str());\n  EXPECT_EQ(0xfde4abbed390c394LL, function->address);\n  EXPECT_EQ(0x10U, function->size);\n  EXPECT_EQ(0U, function->parameter_size);\n  ASSERT_EQ((size_t) 1, function->lines.size());\n  Module::Line *line = &function->lines[0];\n  EXPECT_EQ(0xfde4abbed390c394LL, line->address);\n  EXPECT_EQ(0x10U, line->size); // derived from EndFunction\n  EXPECT_TRUE(line->file == file);\n  EXPECT_EQ(174823314, line->number);\n}\n\n#ifdef __GNUC__\n// Function name mangling can vary by compiler, so only run mangled-name\n// tests on GCC for simplicity's sake.\nTEST(StabsToModule, Externs) {\n  Module m(\"name\", \"os\", \"arch\", \"id\");\n  StabsToModule h(&m);\n\n  // Feed in a few Extern symbols.\n  EXPECT_TRUE(h.Extern(\"_foo\", 0xffff));\n  EXPECT_TRUE(h.Extern(\"__Z21dyldGlobalLockAcquirev\", 0xaaaa));\n  EXPECT_TRUE(h.Extern(\"_MorphTableGetNextMorphChain\", 0x1111));\n  h.Finalize();\n\n  // Now check to see what has been added to the Module.\n  vector<Module::Extern *> externs;\n  m.GetExterns(&externs, externs.end());\n  ASSERT_EQ((size_t) 3, externs.size());\n  Module::Extern *extern1 = externs[0];\n  EXPECT_STREQ(\"MorphTableGetNextMorphChain\", extern1->name.c_str());\n  EXPECT_EQ((Module::Address)0x1111, extern1->address);\n  Module::Extern *extern2 = externs[1];\n  EXPECT_STREQ(\"dyldGlobalLockAcquire()\", extern2->name.c_str());\n  EXPECT_EQ((Module::Address)0xaaaa, extern2->address);\n  Module::Extern *extern3 = externs[2];\n  EXPECT_STREQ(\"foo\", extern3->name.c_str());\n  EXPECT_EQ((Module::Address)0xffff, extern3->address);\n}\n#endif  // __GNUC__\n\nTEST(StabsToModule, DuplicateFunctionNames) {\n  Module m(\"name\", \"os\", \"arch\", \"id\");\n  StabsToModule h(&m);\n\n  // Compilation unit with one function, mangled name.\n  EXPECT_TRUE(h.StartCompilationUnit(\"compilation-unit\", 0xf2cfda36ecf7f46cLL,\n                                     \"build-directory\"));\n  EXPECT_TRUE(h.StartFunction(\"funcfoo\",\n                              0xf2cfda36ecf7f46dLL));\n  EXPECT_TRUE(h.EndFunction(0));\n  EXPECT_TRUE(h.StartFunction(\"funcfoo\",\n                              0xf2cfda36ecf7f46dLL));\n  EXPECT_TRUE(h.EndFunction(0));\n  EXPECT_TRUE(h.EndCompilationUnit(0));\n\n  h.Finalize();\n\n  // Now check to see what has been added to the Module.\n  Module::File *file = m.FindExistingFile(\"compilation-unit\");\n  ASSERT_TRUE(file != NULL);\n\n  vector<Module::Function *> functions;\n  m.GetFunctions(&functions, functions.end());\n  ASSERT_EQ(1U, functions.size());\n\n  Module::Function *function = functions[0];\n  EXPECT_EQ(0xf2cfda36ecf7f46dLL, function->address);\n  EXPECT_LT(0U, function->size);  // should have used dummy size\n  EXPECT_EQ(0U, function->parameter_size);\n  ASSERT_EQ(0U, function->lines.size());\n}\n\nTEST(InferSizes, LineSize) {\n  Module m(\"name\", \"os\", \"arch\", \"id\");\n  StabsToModule h(&m);\n\n  // Feed in a simple compilation unit that defines a function with\n  // one line.\n  EXPECT_TRUE(h.StartCompilationUnit(\"compilation-unit\", 0xb4513962eff94e92LL,\n                                     \"build-directory\"));\n  EXPECT_TRUE(h.StartFunction(\"function\", 0xb4513962eff94e92LL));\n  EXPECT_TRUE(h.Line(0xb4513962eff94e92LL, \"source-file-name-1\", 77396614));\n  EXPECT_TRUE(h.Line(0xb4513963eff94e92LL, \"source-file-name-2\", 87660088));\n  EXPECT_TRUE(h.EndFunction(0));  // unknown function end address\n  EXPECT_TRUE(h.EndCompilationUnit(0)); // unknown CU end address\n  EXPECT_TRUE(h.StartCompilationUnit(\"compilation-unit-2\", 0xb4523963eff94e92LL,\n                                     \"build-directory-2\")); // next boundary\n  EXPECT_TRUE(h.EndCompilationUnit(0));\n  h.Finalize();\n\n  // Now check to see what has been added to the Module.\n  Module::File *file1 = m.FindExistingFile(\"source-file-name-1\");\n  ASSERT_TRUE(file1 != NULL);\n  Module::File *file2 = m.FindExistingFile(\"source-file-name-2\");\n  ASSERT_TRUE(file2 != NULL);\n\n  vector<Module::Function *> functions;\n  m.GetFunctions(&functions, functions.end());\n  ASSERT_EQ((size_t) 1, functions.size());\n\n  Module::Function *function = functions[0];\n  EXPECT_STREQ(\"function\", function->name.c_str());\n  EXPECT_EQ(0xb4513962eff94e92LL, function->address);\n  EXPECT_EQ(0x1000100000000ULL, function->size); // inferred from CU end\n  EXPECT_EQ(0U, function->parameter_size);\n  ASSERT_EQ((size_t) 2, function->lines.size());\n\n  Module::Line *line1 = &function->lines[0];\n  EXPECT_EQ(0xb4513962eff94e92LL, line1->address);\n  EXPECT_EQ(0x100000000ULL, line1->size); // derived from EndFunction\n  EXPECT_TRUE(line1->file == file1);\n  EXPECT_EQ(77396614, line1->number);\n\n  Module::Line *line2 = &function->lines[1];\n  EXPECT_EQ(0xb4513963eff94e92LL, line2->address);\n  EXPECT_EQ(0x1000000000000ULL, line2->size); // derived from EndFunction\n  EXPECT_TRUE(line2->file == file2);\n  EXPECT_EQ(87660088, line2->number);\n}\n\n#ifdef __GNUC__\n// Function name mangling can vary by compiler, so only run mangled-name\n// tests on GCC for simplicity's sake.\nTEST(FunctionNames, Mangled) {\n  Module m(\"name\", \"os\", \"arch\", \"id\");\n  StabsToModule h(&m);\n\n  // Compilation unit with one function, mangled name.\n  EXPECT_TRUE(h.StartCompilationUnit(\"compilation-unit\", 0xf2cfda63cef7f46cLL,\n                                     \"build-directory\"));\n  EXPECT_TRUE(h.StartFunction(\"_ZNSt6vectorIySaIyEE9push_backERKy\",\n                              0xf2cfda63cef7f46dLL));\n  EXPECT_TRUE(h.EndFunction(0));\n  EXPECT_TRUE(h.EndCompilationUnit(0));\n\n  h.Finalize();\n\n  // Now check to see what has been added to the Module.\n  Module::File *file = m.FindExistingFile(\"compilation-unit\");\n  ASSERT_TRUE(file != NULL);\n\n  vector<Module::Function *> functions;\n  m.GetFunctions(&functions, functions.end());\n  ASSERT_EQ(1U, functions.size());\n\n  Module::Function *function = functions[0];\n  // This is GCC-specific, but we shouldn't be seeing STABS data anywhere\n  // but Linux.\n  EXPECT_STREQ(\"std::vector<unsigned long long, \"\n               \"std::allocator<unsigned long long> >::\"\n               \"push_back(unsigned long long const&)\",\n               function->name.c_str());\n  EXPECT_EQ(0xf2cfda63cef7f46dLL, function->address);\n  EXPECT_LT(0U, function->size); // should have used dummy size\n  EXPECT_EQ(0U, function->parameter_size);\n  ASSERT_EQ(0U, function->lines.size());\n}\n#endif  // __GNUC__\n\n// The GNU toolchain can omit functions that are not used; however,\n// when it does so, it doesn't clean up the debugging information that\n// refers to them. In STABS, this results in compilation units whose\n// SO addresses are zero.\nTEST(Omitted, Function) {\n  Module m(\"name\", \"os\", \"arch\", \"id\");\n  StabsToModule h(&m);\n\n  // The StartCompilationUnit and EndCompilationUnit calls may both have an\n  // address of zero if the compilation unit has had sections removed.\n  EXPECT_TRUE(h.StartCompilationUnit(\"compilation-unit\", 0, \"build-directory\"));\n  EXPECT_TRUE(h.StartFunction(\"function\", 0x2a133596));\n  EXPECT_TRUE(h.EndFunction(0));\n  EXPECT_TRUE(h.EndCompilationUnit(0));\n}\n\n// TODO --- if we actually cared about STABS. Even without these we've\n// got full coverage of non-failure source lines in dump_stabs.cc.\n\n// Line size from next line\n// Line size from function end\n// Line size from next function start\n// line size from cu end\n// line size from next cu start\n// fallback size is something plausible\n\n// function size from function end\n// function size from next function start\n// function size from cu end\n// function size from next cu start\n// fallback size is something plausible\n\n// omitting functions outside the compilation unit's address range\n// zero-line, one-line, many-line functions\n"
  },
  {
    "path": "archive/spotify/breakpad/common/string_conversion.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"common/convert_UTF.h\"\n#include \"processor/scoped_ptr.h\"\n#include \"common/string_conversion.h\"\n#include <string.h>\n\nnamespace google_breakpad {\n\nusing std::string;\nusing std::vector;\n\nvoid UTF8ToUTF16(const char *in, vector<u_int16_t> *out) {\n  size_t source_length = strlen(in);\n  const UTF8 *source_ptr = reinterpret_cast<const UTF8 *>(in);\n  const UTF8 *source_end_ptr = source_ptr + source_length;\n  // Erase the contents and zero fill to the expected size\n  out->clear();\n  out->insert(out->begin(), source_length, 0);\n  u_int16_t *target_ptr = &(*out)[0];\n  u_int16_t *target_end_ptr = target_ptr + out->capacity() * sizeof(u_int16_t);\n  ConversionResult result = ConvertUTF8toUTF16(&source_ptr, source_end_ptr,\n                                               &target_ptr, target_end_ptr,\n                                               strictConversion);\n\n  // Resize to be the size of the # of converted characters + NULL\n  out->resize(result == conversionOK ? target_ptr - &(*out)[0] + 1: 0);\n}\n\nint UTF8ToUTF16Char(const char *in, int in_length, u_int16_t out[2]) {\n  const UTF8 *source_ptr = reinterpret_cast<const UTF8 *>(in);\n  const UTF8 *source_end_ptr = source_ptr + sizeof(char);\n  u_int16_t *target_ptr = out;\n  u_int16_t *target_end_ptr = target_ptr + 2 * sizeof(u_int16_t);\n  out[0] = out[1] = 0;\n\n  // Process one character at a time\n  while (1) {\n    ConversionResult result = ConvertUTF8toUTF16(&source_ptr, source_end_ptr,\n                                                 &target_ptr, target_end_ptr,\n                                                 strictConversion);\n\n    if (result == conversionOK)\n      return static_cast<int>(source_ptr - reinterpret_cast<const UTF8 *>(in));\n\n    // Add another character to the input stream and try again\n    source_ptr = reinterpret_cast<const UTF8 *>(in);\n    ++source_end_ptr;\n\n    if (source_end_ptr > reinterpret_cast<const UTF8 *>(in) + in_length)\n      break;\n  }\n\n  return 0;\n}\n\nvoid UTF32ToUTF16(const wchar_t *in, vector<u_int16_t> *out) {\n  size_t source_length = wcslen(in);\n  const UTF32 *source_ptr = reinterpret_cast<const UTF32 *>(in);\n  const UTF32 *source_end_ptr = source_ptr + source_length;\n  // Erase the contents and zero fill to the expected size\n  out->clear();\n  out->insert(out->begin(), source_length, 0);\n  u_int16_t *target_ptr = &(*out)[0];\n  u_int16_t *target_end_ptr = target_ptr + out->capacity() * sizeof(u_int16_t);\n  ConversionResult result = ConvertUTF32toUTF16(&source_ptr, source_end_ptr,\n                                                &target_ptr, target_end_ptr,\n                                                strictConversion);\n\n  // Resize to be the size of the # of converted characters + NULL\n  out->resize(result == conversionOK ? target_ptr - &(*out)[0] + 1: 0);\n}\n\nvoid UTF32ToUTF16Char(wchar_t in, u_int16_t out[2]) {\n  const UTF32 *source_ptr = reinterpret_cast<const UTF32 *>(&in);\n  const UTF32 *source_end_ptr = source_ptr + 1;\n  u_int16_t *target_ptr = out;\n  u_int16_t *target_end_ptr = target_ptr + 2 * sizeof(u_int16_t);\n  out[0] = out[1] = 0;\n  ConversionResult result = ConvertUTF32toUTF16(&source_ptr, source_end_ptr,\n                                                &target_ptr, target_end_ptr,\n                                                strictConversion);\n\n  if (result != conversionOK) {\n    out[0] = out[1] = 0;\n  }\n}\n\nstatic inline u_int16_t Swap(u_int16_t value) {\n  return (value >> 8) | (value << 8);\n}\n\nstring UTF16ToUTF8(const vector<u_int16_t> &in, bool swap) {\n  const UTF16 *source_ptr = &in[0];\n  scoped_ptr<u_int16_t> source_buffer;\n\n  // If we're to swap, we need to make a local copy and swap each byte pair\n  if (swap) {\n    int idx = 0;\n    source_buffer.reset(new u_int16_t[in.size()]);\n    UTF16 *source_buffer_ptr = source_buffer.get();\n    for (vector<u_int16_t>::const_iterator it = in.begin();\n         it != in.end(); ++it, ++idx)\n      source_buffer_ptr[idx] = Swap(*it);\n\n    source_ptr = source_buffer.get();\n  }\n\n  // The maximum expansion would be 4x the size of the input string.\n  const UTF16 *source_end_ptr = source_ptr + in.size();\n  size_t target_capacity = in.size() * 4;\n  scoped_array<UTF8> target_buffer(new UTF8[target_capacity]);\n  UTF8 *target_ptr = target_buffer.get();\n  UTF8 *target_end_ptr = target_ptr + target_capacity;\n  ConversionResult result = ConvertUTF16toUTF8(&source_ptr, source_end_ptr, \n                                               &target_ptr, target_end_ptr,\n                                               strictConversion);\n\n  if (result == conversionOK) {\n    const char *targetPtr = reinterpret_cast<const char *>(target_buffer.get());\n    return targetPtr;\n  }\n\n  return \"\";\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/string_conversion.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// string_conversion.h: Conversion between different UTF-8/16/32 encodings.\n\n#ifndef COMMON_STRING_CONVERSION_H__\n#define COMMON_STRING_CONVERSION_H__\n\n#include <string>\n#include <vector>\n#include \"google_breakpad/common/breakpad_types.h\"\n\nnamespace google_breakpad {\n  \nusing std::vector;\n\n// Convert |in| to UTF-16 into |out|.  Use platform byte ordering.  If the\n// conversion failed, |out| will be zero length.\nvoid UTF8ToUTF16(const char *in, vector<u_int16_t> *out);\n\n// Convert at least one character (up to a maximum of |in_length|) from |in|\n// to UTF-16 into |out|.  Return the number of characters consumed from |in|.\n// Any unused characters in |out| will be initialized to 0.  No memory will\n// be allocated by this routine.\nint UTF8ToUTF16Char(const char *in, int in_length, u_int16_t out[2]);\n\n// Convert |in| to UTF-16 into |out|.  Use platform byte ordering.  If the\n// conversion failed, |out| will be zero length.\nvoid UTF32ToUTF16(const wchar_t *in, vector<u_int16_t> *out);\n\n// Convert |in| to UTF-16 into |out|.  Any unused characters in |out| will be\n// initialized to 0.  No memory will be allocated by this routine.\nvoid UTF32ToUTF16Char(wchar_t in, u_int16_t out[2]);\n\n// Convert |in| to UTF-8.  If |swap| is true, swap bytes before converting.\nstd::string UTF16ToUTF8(const vector<u_int16_t> &in, bool swap);\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_STRING_CONVERSION_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/test_assembler.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// test_assembler.cc: Implementation of google_breakpad::TestAssembler.\n// See test_assembler.h for details.\n\n#include \"common/test_assembler.h\"\n\n#include <assert.h>\n#include <stdio.h>\n\n#include <iterator>\n\nnamespace google_breakpad {\nnamespace test_assembler {\n\nusing std::back_insert_iterator;\n\nLabel::Label() : value_(new Binding()) { }\nLabel::Label(u_int64_t value) : value_(new Binding(value)) { }\nLabel::Label(const Label &label) {\n  value_ = label.value_;\n  value_->Acquire();\n}\nLabel::~Label() {\n  if (value_->Release()) delete value_;\n}\n\nLabel &Label::operator=(u_int64_t value) {\n  value_->Set(NULL, value);\n  return *this;\n}\n\nLabel &Label::operator=(const Label &label) {\n  value_->Set(label.value_, 0);\n  return *this;\n}\n\nLabel Label::operator+(u_int64_t addend) const {\n  Label l;\n  l.value_->Set(this->value_, addend);\n  return l;\n}\n\nLabel Label::operator-(u_int64_t subtrahend) const {\n  Label l;\n  l.value_->Set(this->value_, -subtrahend);\n  return l;\n}\n\n// When NDEBUG is #defined, assert doesn't evaluate its argument. This\n// means you can't simply use assert to check the return value of a\n// function with necessary side effects.\n//\n// ALWAYS_EVALUATE_AND_ASSERT(x) evaluates x regardless of whether\n// NDEBUG is #defined; when NDEBUG is not #defined, it further asserts\n// that x is true.\n#ifdef NDEBUG\n#define ALWAYS_EVALUATE_AND_ASSERT(x) x\n#else\n#define ALWAYS_EVALUATE_AND_ASSERT(x) assert(x)\n#endif\n\nu_int64_t Label::operator-(const Label &label) const {\n  u_int64_t offset;\n  ALWAYS_EVALUATE_AND_ASSERT(IsKnownOffsetFrom(label, &offset));\n  return offset;\n}\n\nu_int64_t Label::Value() const {\n  u_int64_t v = 0;\n  ALWAYS_EVALUATE_AND_ASSERT(IsKnownConstant(&v));\n  return v;\n};\n\nbool Label::IsKnownConstant(u_int64_t *value_p) const {\n  Binding *base;\n  u_int64_t addend;\n  value_->Get(&base, &addend);\n  if (base != NULL) return false;\n  if (value_p) *value_p = addend;\n  return true;\n}\n\nbool Label::IsKnownOffsetFrom(const Label &label, u_int64_t *offset_p) const\n{\n  Binding *label_base, *this_base;\n  u_int64_t label_addend, this_addend;\n  label.value_->Get(&label_base, &label_addend);\n  value_->Get(&this_base, &this_addend);\n  // If this and label are related, Get will find their final\n  // common ancestor, regardless of how indirect the relation is. This\n  // comparison also handles the constant vs. constant case.\n  if (this_base != label_base) return false;\n  if (offset_p) *offset_p = this_addend - label_addend;\n  return true;\n}\n\nLabel::Binding::Binding() : base_(this), addend_(), reference_count_(1) { }\n\nLabel::Binding::Binding(u_int64_t addend)\n    : base_(NULL), addend_(addend), reference_count_(1) { }\n\nLabel::Binding::~Binding() {\n  assert(reference_count_ == 0);\n  if (base_ && base_ != this && base_->Release())\n    delete base_;\n}\n\nvoid Label::Binding::Set(Binding *binding, u_int64_t addend) {\n  if (!base_ && !binding) {\n    // We're equating two constants. This could be okay.\n    assert(addend_ == addend);\n  } else if (!base_) {\n    // We are a known constant, but BINDING may not be, so turn the\n    // tables and try to set BINDING's value instead.\n    binding->Set(NULL, addend_ - addend);\n  } else {\n    if (binding) {\n      // Find binding's final value. Since the final value is always either\n      // completely unconstrained or a constant, never a reference to\n      // another variable (otherwise, it wouldn't be final), this\n      // guarantees we won't create cycles here, even for code like this:\n      //   l = m, m = n, n = l;\n      u_int64_t binding_addend;\n      binding->Get(&binding, &binding_addend);\n      addend += binding_addend;\n    }\n\n    // It seems likely that setting a binding to itself is a bug\n    // (although I can imagine this might turn out to be helpful to\n    // permit).\n    assert(binding != this);\n\n    if (base_ != this) {\n      // Set the other bindings on our chain as well. Note that this\n      // is sufficient even though binding relationships form trees:\n      // All binding operations traverse their chains to the end, and\n      // all bindings related to us share some tail of our chain, so\n      // they will see the changes we make here.\n      base_->Set(binding, addend - addend_);\n      // We're not going to use base_ any more.\n      if (base_->Release()) delete base_;\n    }\n    \n    // Adopt BINDING as our base. Note that it should be correct to\n    // acquire here, after the release above, even though the usual\n    // reference-counting rules call for acquiring first, and then\n    // releasing: the self-reference assertion above should have\n    // complained if BINDING were 'this' or anywhere along our chain,\n    // so we didn't release BINDING.\n    if (binding) binding->Acquire();\n    base_ = binding;\n    addend_ = addend;\n  }\n}\n\nvoid Label::Binding::Get(Binding **base, u_int64_t *addend) {\n  if (base_ && base_ != this) {\n    // Recurse to find the end of our reference chain (the root of our\n    // tree), and then rewrite every binding along the chain to refer\n    // to it directly, adjusting addends appropriately. (This is why\n    // this member function isn't this-const.)\n    Binding *final_base;\n    u_int64_t final_addend;\n    base_->Get(&final_base, &final_addend);\n    if (final_base) final_base->Acquire();\n    if (base_->Release()) delete base_;\n    base_ = final_base;\n    addend_ += final_addend;\n  }\n  *base = base_;\n  *addend = addend_;\n}\n\ntemplate<typename Inserter>\nstatic inline void InsertEndian(test_assembler::Endianness endianness,\n                                size_t size, u_int64_t number, Inserter dest) {\n  assert(size > 0);\n  if (endianness == kLittleEndian) {\n    for (size_t i = 0; i < size; i++) {\n      *dest++ = (char) (number & 0xff);\n      number >>= 8;\n    }\n  } else {\n    assert(endianness == kBigEndian);\n    // The loop condition is odd, but it's correct for size_t.\n    for (size_t i = size - 1; i < size; i--)\n      *dest++ = (char) ((number >> (i * 8)) & 0xff);\n  }\n}\n\nSection &Section::Append(Endianness endianness, size_t size, u_int64_t number) {\n  InsertEndian(endianness, size, number,\n               back_insert_iterator<string>(contents_));\n  return *this;\n}\n\nSection &Section::Append(Endianness endianness, size_t size,\n                         const Label &label) {\n  // If this label's value is known, there's no reason to waste an\n  // entry in references_ on it.\n  u_int64_t value;\n  if (label.IsKnownConstant(&value))\n    return Append(endianness, size, value);\n\n  // This will get caught when the references are resolved, but it's\n  // nicer to find out earlier.\n  assert(endianness != kUnsetEndian);\n\n  references_.push_back(Reference(contents_.size(), endianness, size, label));\n  contents_.append(size, 0);\n  return *this;\n}\n\n#define ENDIANNESS_L kLittleEndian\n#define ENDIANNESS_B kBigEndian\n#define ENDIANNESS(e) ENDIANNESS_ ## e\n\n#define DEFINE_SHORT_APPEND_NUMBER_ENDIAN(e, bits)                      \\\n  Section &Section::e ## bits(u_int ## bits ## _t v) {                  \\\n    InsertEndian(ENDIANNESS(e), bits / 8, v,                            \\\n                 back_insert_iterator<string>(contents_));              \\\n    return *this;                                                       \\\n  }\n\n#define DEFINE_SHORT_APPEND_LABEL_ENDIAN(e, bits)                       \\\n  Section &Section::e ## bits(const Label &v) {                         \\\n    return Append(ENDIANNESS(e), bits / 8, v);                          \\\n  }\n\n// Define L16, B32, and friends.\n#define DEFINE_SHORT_APPEND_ENDIAN(e, bits)                             \\\n  DEFINE_SHORT_APPEND_NUMBER_ENDIAN(e, bits)                            \\\n  DEFINE_SHORT_APPEND_LABEL_ENDIAN(e, bits)\n\nDEFINE_SHORT_APPEND_LABEL_ENDIAN(L, 8);\nDEFINE_SHORT_APPEND_LABEL_ENDIAN(B, 8);\nDEFINE_SHORT_APPEND_ENDIAN(L, 16);\nDEFINE_SHORT_APPEND_ENDIAN(L, 32);\nDEFINE_SHORT_APPEND_ENDIAN(L, 64);\nDEFINE_SHORT_APPEND_ENDIAN(B, 16);\nDEFINE_SHORT_APPEND_ENDIAN(B, 32);\nDEFINE_SHORT_APPEND_ENDIAN(B, 64);\n\n#define DEFINE_SHORT_APPEND_NUMBER_DEFAULT(bits)                        \\\n  Section &Section::D ## bits(u_int ## bits ## _t v) {                  \\\n    InsertEndian(endianness_, bits / 8, v,                              \\\n                 back_insert_iterator<string>(contents_));              \\\n    return *this;                                                       \\\n  }\n#define DEFINE_SHORT_APPEND_LABEL_DEFAULT(bits)                         \\\n  Section &Section::D ## bits(const Label &v) {                         \\\n    return Append(endianness_, bits / 8, v);                            \\\n  }\n#define DEFINE_SHORT_APPEND_DEFAULT(bits)                               \\\n  DEFINE_SHORT_APPEND_NUMBER_DEFAULT(bits)                              \\\n  DEFINE_SHORT_APPEND_LABEL_DEFAULT(bits)\n\nDEFINE_SHORT_APPEND_LABEL_DEFAULT(8)\nDEFINE_SHORT_APPEND_DEFAULT(16);\nDEFINE_SHORT_APPEND_DEFAULT(32);\nDEFINE_SHORT_APPEND_DEFAULT(64);\n\nSection &Section::Append(const Section &section) {\n  size_t base = contents_.size();\n  contents_.append(section.contents_);\n  for (vector<Reference>::const_iterator it = section.references_.begin();\n       it != section.references_.end(); it++)\n    references_.push_back(Reference(base + it->offset, it->endianness,\n                                    it->size, it->label));\n  return *this;\n}\n\nSection &Section::LEB128(long long value) {\n  while (value < -0x40 || 0x3f < value) {\n    contents_ += (value & 0x7f) | 0x80;\n    if (value < 0)\n      value = (value >> 7) | ~(((unsigned long long) -1) >> 7);\n    else\n      value = (value >> 7);\n  }\n  contents_ += value & 0x7f;\n  return *this;\n}\n\nSection &Section::ULEB128(u_int64_t value) {\n  while (value > 0x7f) {\n    contents_ += (value & 0x7f) | 0x80;\n    value = (value >> 7);\n  }\n  contents_ += value;\n  return *this;\n}\n\nSection &Section::Align(size_t alignment, u_int8_t pad_byte) {\n  // ALIGNMENT must be a power of two.\n  assert(((alignment - 1) & alignment) == 0);\n  size_t new_size = (contents_.size() + alignment - 1) & ~(alignment - 1);\n  contents_.append(new_size - contents_.size(), pad_byte);\n  assert((contents_.size() & (alignment - 1)) == 0);\n  return *this;\n}\n\nvoid Section::Clear() {\n  contents_.clear();\n  references_.clear();\n}\n\nbool Section::GetContents(string *contents) {\n  // For each label reference, find the label's value, and patch it into\n  // the section's contents.\n  for (size_t i = 0; i < references_.size(); i++) {\n    Reference &r = references_[i];\n    u_int64_t value;\n    if (!r.label.IsKnownConstant(&value)) {\n      fprintf(stderr, \"Undefined label #%zu at offset 0x%zx\\n\", i, r.offset);\n      return false;\n    }\n    assert(r.offset < contents_.size());\n    assert(contents_.size() - r.offset >= r.size);\n    InsertEndian(r.endianness, r.size, value, contents_.begin() + r.offset);\n  }\n  contents->clear();\n  std::swap(contents_, *contents);\n  references_.clear();\n  return true;\n}\n\n}  // namespace test_assembler\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/test_assembler.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// test-assembler.h: interface to class for building complex binary streams.\n\n// To test the Breakpad symbol dumper and processor thoroughly, for\n// all combinations of host system and minidump processor\n// architecture, we need to be able to easily generate complex test\n// data like debugging information and minidump files.\n// \n// For example, if we want our unit tests to provide full code\n// coverage for stack walking, it may be difficult to persuade the\n// compiler to generate every possible sort of stack walking\n// information that we want to support; there are probably DWARF CFI\n// opcodes that GCC never emits. Similarly, if we want to test our\n// error handling, we will need to generate damaged minidumps or\n// debugging information that (we hope) the client or compiler will\n// never produce on its own.\n//\n// google_breakpad::TestAssembler provides a predictable and\n// (relatively) simple way to generate complex formatted data streams\n// like minidumps and CFI. Furthermore, because TestAssembler is\n// portable, developers without access to (say) Visual Studio or a\n// SPARC assembler can still work on test data for those targets.\n\n#ifndef PROCESSOR_TEST_ASSEMBLER_H_\n#define PROCESSOR_TEST_ASSEMBLER_H_\n\n#include <list>\n#include <vector>\n#include <string>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\nnamespace google_breakpad {\n\nusing std::list;\nusing std::string;\nusing std::vector;\n\nnamespace test_assembler {\n\n// A Label represents a value not yet known that we need to store in a\n// section. As long as all the labels a section refers to are defined\n// by the time we retrieve its contents as bytes, we can use undefined\n// labels freely in that section's construction.\n//\n// A label can be in one of three states:\n// - undefined,\n// - defined as the sum of some other label and a constant, or\n// - a constant.\n// \n// A label's value never changes, but it can accumulate constraints.\n// Adding labels and integers is permitted, and yields a label.\n// Subtracting a constant from a label is permitted, and also yields a\n// label. Subtracting two labels that have some relationship to each\n// other is permitted, and yields a constant.\n//\n// For example:\n//\n//   Label a;               // a's value is undefined\n//   Label b;               // b's value is undefined\n//   {\n//     Label c = a + 4;     // okay, even though a's value is unknown\n//     b = c + 4;           // also okay; b is now a+8\n//   }\n//   Label d = b - 2;       // okay; d == a+6, even though c is gone\n//   d.Value();             // error: d's value is not yet known\n//   d - a;                 // is 6, even though their values are not known\n//   a = 12;                // now b == 20, and d == 18\n//   d.Value();             // 18: no longer an error\n//   b.Value();             // 20\n//   d = 10;                // error: d is already defined.\n//\n// Label objects' lifetimes are unconstrained: notice that, in the\n// above example, even though a and b are only related through c, and\n// c goes out of scope, the assignment to a sets b's value as well. In\n// particular, it's not necessary to ensure that a Label lives beyond\n// Sections that refer to it.\nclass Label {\n public:\n  Label();                      // An undefined label.\n  Label(u_int64_t value);       // A label with a fixed value\n  Label(const Label &value);    // A label equal to another.\n  ~Label();\n\n  // Return this label's value; it must be known.\n  //\n  // Providing this as a cast operator is nifty, but the conversions\n  // happen in unexpected places. In particular, ISO C++ says that\n  // Label + size_t becomes ambigious, because it can't decide whether\n  // to convert the Label to a u_int64_t and then to a size_t, or use\n  // the overloaded operator that returns a new label, even though the\n  // former could fail if the label is not yet defined and the latter won't.\n  u_int64_t Value() const;\n\n  Label &operator=(u_int64_t value);\n  Label &operator=(const Label &value);\n  Label operator+(u_int64_t addend) const;\n  Label operator-(u_int64_t subtrahend) const;\n  u_int64_t operator-(const Label &subtrahend) const;\n\n  // We could also provide == and != that work on undefined, but\n  // related, labels.\n\n  // Return true if this label's value is known. If VALUE_P is given,\n  // set *VALUE_P to the known value if returning true.\n  bool IsKnownConstant(u_int64_t *value_p = NULL) const;\n\n  // Return true if the offset from LABEL to this label is known. If\n  // OFFSET_P is given, set *OFFSET_P to the offset when returning true.\n  //\n  // You can think of l.KnownOffsetFrom(m, &d) as being like 'd = l-m',\n  // except that it also returns a value indicating whether the\n  // subtraction is possible given what we currently know of l and m.\n  // It can be possible even if we don't know l and m's values. For\n  // example:\n  // \n  //   Label l, m;\n  //   m = l + 10;\n  //   l.IsKnownConstant();             // false\n  //   m.IsKnownConstant();             // false\n  //   u_int64_t d;                     \n  //   l.IsKnownOffsetFrom(m, &d);      // true, and sets d to -10.\n  //   l-m                              // -10\n  //   m-l                              // 10\n  //   m.Value()                        // error: m's value is not known\n  bool IsKnownOffsetFrom(const Label &label, u_int64_t *offset_p = NULL) const;\n\n private:\n  // A label's value, or if that is not yet known, how the value is\n  // related to other labels' values. A binding may be:\n  // - a known constant,\n  // - constrained to be equal to some other binding plus a constant, or\n  // - unconstrained, and free to take on any value.\n  //\n  // Many labels may point to a single binding, and each binding may\n  // refer to another, so bindings and labels form trees whose leaves\n  // are labels, whose interior nodes (and roots) are bindings, and\n  // where links point from children to parents. Bindings are\n  // reference counted, allowing labels to be lightweight, copyable,\n  // assignable, placed in containers, and so on.\n  class Binding {\n   public:\n    Binding();\n    Binding(u_int64_t addend);\n    ~Binding();\n\n    // Increment our reference count.\n    void Acquire() { reference_count_++; };\n    // Decrement our reference count, and return true if it is zero.\n    bool Release() { return --reference_count_ == 0; }\n\n    // Set this binding to be equal to BINDING + ADDEND. If BINDING is\n    // NULL, then set this binding to the known constant ADDEND.\n    // Update every binding on this binding's chain to point directly\n    // to BINDING, or to be a constant, with addends adjusted\n    // appropriately.\n    void Set(Binding *binding, u_int64_t value);\n\n    // Return what we know about the value of this binding.\n    // - If this binding's value is a known constant, set BASE to\n    //   NULL, and set ADDEND to its value.\n    // - If this binding is not a known constant but related to other\n    //   bindings, set BASE to the binding at the end of the relation\n    //   chain (which will always be unconstrained), and set ADDEND to the\n    //   value to add to that binding's value to get this binding's\n    //   value.\n    // - If this binding is unconstrained, set BASE to this, and leave\n    //   ADDEND unchanged.\n    void Get(Binding **base, u_int64_t *addend);\n\n   private:\n    // There are three cases:\n    //\n    // - A binding representing a known constant value has base_ NULL,\n    //   and addend_ equal to the value.\n    //\n    // - A binding representing a completely unconstrained value has\n    //   base_ pointing to this; addend_ is unused.\n    //\n    // - A binding whose value is related to some other binding's\n    //   value has base_ pointing to that other binding, and addend_\n    //   set to the amount to add to that binding's value to get this\n    //   binding's value. We only represent relationships of the form\n    //   x = y+c.\n    //\n    // Thus, the bind_ links form a chain terminating in either a\n    // known constant value or a completely unconstrained value. Most\n    // operations on bindings do path compression: they change every\n    // binding on the chain to point directly to the final value,\n    // adjusting addends as appropriate.\n    Binding *base_;\n    u_int64_t addend_;\n\n    // The number of Labels and Bindings pointing to this binding.\n    // (When a binding points to itself, indicating a completely\n    // unconstrained binding, that doesn't count as a reference.)\n    int reference_count_;\n  };\n\n  // This label's value.\n  Binding *value_;\n};\n\ninline Label operator+(u_int64_t a, const Label &l) { return l + a; }\n// Note that int-Label isn't defined, as negating a Label is not an\n// operation we support.\n\n// Conventions for representing larger numbers as sequences of bytes.\nenum Endianness {\n  kBigEndian,        // Big-endian: the most significant byte comes first.\n  kLittleEndian,     // Little-endian: the least significant byte comes first.\n  kUnsetEndian,      // used internally\n};\n \n// A section is a sequence of bytes, constructed by appending bytes\n// to the end. Sections have a convenient and flexible set of member\n// functions for appending data in various formats: big-endian and\n// little-endian signed and unsigned values of different sizes;\n// LEB128 and ULEB128 values (see below), and raw blocks of bytes.\n//\n// If you need to append a value to a section that is not convenient\n// to compute immediately, you can create a label, append the\n// label's value to the section, and then set the label's value\n// later, when it's convenient to do so. Once a label's value is\n// known, the section class takes care of updating all previously\n// appended references to it.\n//\n// Once all the labels to which a section refers have had their\n// values determined, you can get a copy of the section's contents\n// as a string.\n//\n// Note that there is no specified \"start of section\" label. This is\n// because there are typically several different meanings for \"the\n// start of a section\": the offset of the section within an object\n// file, the address in memory at which the section's content appear,\n// and so on. It's up to the code that uses the Section class to \n// keep track of these explicitly, as they depend on the application.\nclass Section {\n public:\n  Section(Endianness endianness = kUnsetEndian)\n      : endianness_(endianness) { };\n  ~Section() { };\n\n  // Set the default endianness of this section to ENDIANNESS. This\n  // sets the behavior of the D<N> appending functions. If the\n  // assembler's default endianness was set, this is the \n  void set_endianness(Endianness endianness) {\n    endianness_ = endianness;\n  }\n\n  // Return the default endianness of this section.\n  Endianness endianness() const { return endianness_; }\n\n  // Append the SIZE bytes at DATA or the contents of STRING to the\n  // end of this section. Return a reference to this section.\n  Section &Append(const u_int8_t *data, size_t size) {\n    contents_.append(reinterpret_cast<const char *>(data), size);\n    return *this;\n  };\n  Section &Append(const string &data) {\n    contents_.append(data);\n    return *this;\n  };\n\n  // Append SIZE copies of BYTE to the end of this section. Return a\n  // reference to this section.\n  Section &Append(size_t size, u_int8_t byte) {\n    contents_.append(size, (char) byte);\n    return *this;\n  }\n      \n  // Append NUMBER to this section. ENDIANNESS is the endianness to\n  // use to write the number. SIZE is the length of the number in\n  // bytes. Return a reference to this section.\n  Section &Append(Endianness endianness, size_t size, u_int64_t number);\n  Section &Append(Endianness endianness, size_t size, const Label &label);\n\n  // Append SECTION to the end of this section. The labels SECTION\n  // refers to need not be defined yet.\n  //\n  // Note that this has no effect on any Labels' values, or on\n  // SECTION. If placing SECTION within 'this' provides new\n  // constraints on existing labels' values, then it's up to the\n  // caller to fiddle with those labels as needed.\n  Section &Append(const Section &section);\n\n  // Append the contents of DATA as a series of bytes terminated by\n  // a NULL character.\n  Section &AppendCString(const string &data) {\n    Append(data);\n    contents_ += '\\0';\n    return *this;\n  }\n\n  // Append at most SIZE bytes from DATA; if DATA is less than SIZE bytes\n  // long, pad with '\\0' characters.\n  Section &AppendCString(const string &data, size_t size) {\n    contents_.append(data, 0, size);\n    if (data.size() < size)\n      Append(size - data.size(), 0);\n    return *this;\n  }\n\n  // Append VALUE or LABEL to this section, with the given bit width and\n  // endianness. Return a reference to this section.\n  //\n  // The names of these functions have the form <ENDIANNESS><BITWIDTH>:\n  // <ENDIANNESS> is either 'L' (little-endian, least significant byte first),\n  //                        'B' (big-endian, most significant byte first), or\n  //                        'D' (default, the section's default endianness)\n  // <BITWIDTH> is 8, 16, 32, or 64.\n  //\n  // Since endianness doesn't matter for a single byte, all the\n  // <BITWIDTH>=8 functions are equivalent.\n  //\n  // These can be used to write both signed and unsigned values, as\n  // the compiler will properly sign-extend a signed value before\n  // passing it to the function, at which point the function's\n  // behavior is the same either way.\n  Section &L8(u_int8_t value) { contents_ += value; return *this; }\n  Section &B8(u_int8_t value) { contents_ += value; return *this; }\n  Section &D8(u_int8_t value) { contents_ += value; return *this; }\n  Section &L16(u_int16_t), &L32(u_int32_t), &L64(u_int64_t),\n          &B16(u_int16_t), &B32(u_int32_t), &B64(u_int64_t),\n          &D16(u_int16_t), &D32(u_int32_t), &D64(u_int64_t);\n  Section &L8(const Label &label),  &L16(const Label &label),\n          &L32(const Label &label), &L64(const Label &label),\n          &B8(const Label &label),  &B16(const Label &label),\n          &B32(const Label &label), &B64(const Label &label),\n          &D8(const Label &label),  &D16(const Label &label),\n          &D32(const Label &label), &D64(const Label &label);\n\n  // Append VALUE in a signed LEB128 (Little-Endian Base 128) form.\n  // \n  // The signed LEB128 representation of an integer N is a variable\n  // number of bytes:\n  //\n  // - If N is between -0x40 and 0x3f, then its signed LEB128\n  //   representation is a single byte whose value is N.\n  // \n  // - Otherwise, its signed LEB128 representation is (N & 0x7f) |\n  //   0x80, followed by the signed LEB128 representation of N / 128,\n  //   rounded towards negative infinity.\n  //\n  // In other words, we break VALUE into groups of seven bits, put\n  // them in little-endian order, and then write them as eight-bit\n  // bytes with the high bit on all but the last.\n  //\n  // Note that VALUE cannot be a Label (we would have to implement\n  // relaxation).\n  Section &LEB128(long long value);\n\n  // Append VALUE in unsigned LEB128 (Little-Endian Base 128) form.\n  // \n  // The unsigned LEB128 representation of an integer N is a variable\n  // number of bytes:\n  //\n  // - If N is between 0 and 0x7f, then its unsigned LEB128\n  //   representation is a single byte whose value is N.\n  // \n  // - Otherwise, its unsigned LEB128 representation is (N & 0x7f) |\n  //   0x80, followed by the unsigned LEB128 representation of N /\n  //   128, rounded towards negative infinity.\n  //\n  // Note that VALUE cannot be a Label (we would have to implement\n  // relaxation).\n  Section &ULEB128(u_int64_t value);\n\n  // Jump to the next location aligned on an ALIGNMENT-byte boundary,\n  // relative to the start of the section. Fill the gap with PAD_BYTE.\n  // ALIGNMENT must be a power of two. Return a reference to this\n  // section.\n  Section &Align(size_t alignment, u_int8_t pad_byte = 0);\n\n  // Clear the contents of this section.\n  void Clear();\n\n  // Return the current size of the section.\n  size_t Size() const { return contents_.size(); }\n\n  // Return a label representing the start of the section.\n  // \n  // It is up to the user whether this label represents the section's\n  // position in an object file, the section's address in memory, or\n  // what have you; some applications may need both, in which case\n  // this simple-minded interface won't be enough. This class only\n  // provides a single start label, for use with the Here and Mark\n  // member functions.\n  //\n  // Ideally, we'd provide this in a subclass that actually knows more\n  // about the application at hand and can provide an appropriate\n  // collection of start labels. But then the appending member\n  // functions like Append and D32 would return a reference to the\n  // base class, not the derived class, and the chaining won't work.\n  // Since the only value here is in pretty notation, that's a fatal\n  // flaw.\n  Label start() const { return start_; }\n\n  // Return a label representing the point at which the next Appended\n  // item will appear in the section, relative to start().\n  Label Here() const { return start_ + Size(); }\n\n  // Set *LABEL to Here, and return a reference to this section.\n  Section &Mark(Label *label) { *label = Here(); return *this; }\n\n  // If there are no undefined label references left in this\n  // section, set CONTENTS to the contents of this section, as a\n  // string, and clear this section. Return true on success, or false\n  // if there were still undefined labels.\n  bool GetContents(string *contents);\n\n private:\n  // Used internally. A reference to a label's value.\n  struct Reference {\n    Reference(size_t set_offset, Endianness set_endianness,  size_t set_size,\n              const Label &set_label)\n        : offset(set_offset), endianness(set_endianness), size(set_size),\n          label(set_label) { }\n      \n    // The offset of the reference within the section.\n    size_t offset;\n\n    // The endianness of the reference.\n    Endianness endianness;\n\n    // The size of the reference.\n    size_t size;\n\n    // The label to which this is a reference.\n    Label label;\n  };\n\n  // The default endianness of this section.\n  Endianness endianness_;\n\n  // The contents of the section.\n  string contents_;\n  \n  // References to labels within those contents.\n  vector<Reference> references_;\n\n  // A label referring to the beginning of the section.\n  Label start_;\n};\n\n}  // namespace test_assembler\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_TEST_ASSEMBLER_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/common/test_assembler_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// test_assembler_unittest.cc: Unit tests for google_breakpad::TestAssembler.\n\n#include <string>\n#include <string.h>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/test_assembler.h\"\n\nusing google_breakpad::test_assembler::Label;\nusing google_breakpad::test_assembler::Section;\nusing google_breakpad::test_assembler::kBigEndian;\nusing google_breakpad::test_assembler::kLittleEndian;\nusing std::string;\nusing testing::Test;\n\nTEST(ConstructLabel, Simple) {\n  Label l;\n}\n\nTEST(ConstructLabel, Undefined) {\n  Label l;\n  EXPECT_FALSE(l.IsKnownConstant());\n}\n\nTEST(ConstructLabelDeathTest, Undefined) {\n  Label l;\n  ASSERT_DEATH(l.Value(), \"IsKnownConstant\\\\(&v\\\\)\");\n}\n\nTEST(ConstructLabel, Constant) {\n  Label l(0x060b9f974eaf301eULL);\n  u_int64_t v;\n  EXPECT_TRUE(l.IsKnownConstant(&v));\n  EXPECT_EQ(v, 0x060b9f974eaf301eULL);\n  EXPECT_EQ(l.Value(), 0x060b9f974eaf301eULL);\n}\n\nTEST(ConstructLabel, Copy) {\n  Label l;\n  Label m(l);\n  u_int64_t v;\n  EXPECT_TRUE(l.IsKnownOffsetFrom(m, &v));\n  EXPECT_EQ(0U, v);\n}\n\n// The left-hand-side of a label assignment can be either\n// unconstrained, related, or known. The right-hand-side can be any of\n// those, or an integer.\nTEST(Assignment, UnconstrainedToUnconstrained) {\n  Label l, m;\n  l = m;\n  EXPECT_EQ(0U, l-m);\n  EXPECT_TRUE(l.IsKnownOffsetFrom(m));\n  u_int64_t d;\n  EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d));\n  EXPECT_EQ(0U, d);\n  EXPECT_FALSE(l.IsKnownConstant());\n}\n\nTEST(Assignment, UnconstrainedToRelated) {\n  Label l, m, n;\n  l = n;\n  l = m;\n  EXPECT_EQ(0U, l-m);\n  EXPECT_TRUE(l.IsKnownOffsetFrom(m));\n  u_int64_t d;\n  EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d));\n  EXPECT_EQ(0U, d);\n  EXPECT_FALSE(l.IsKnownConstant());\n}\n\nTEST(Assignment, UnconstrainedToKnown) {\n  Label l, m;\n  l = 0x8fd16e55b20a39c1ULL;\n  l = m;\n  EXPECT_EQ(0U, l-m);\n  EXPECT_TRUE(l.IsKnownOffsetFrom(m));\n  u_int64_t d;\n  EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d));\n  EXPECT_EQ(0U, d);\n  EXPECT_TRUE(m.IsKnownConstant());\n  EXPECT_EQ(0x8fd16e55b20a39c1ULL, m.Value());\n}\n\nTEST(Assignment, RelatedToUnconstrained) {\n  Label l, m, n;\n  m = n;\n  l = m;\n  EXPECT_EQ(0U, l-n);\n  EXPECT_TRUE(l.IsKnownOffsetFrom(n));\n  u_int64_t d;\n  EXPECT_TRUE(l.IsKnownOffsetFrom(n, &d));\n  EXPECT_EQ(0U, d);\n  EXPECT_FALSE(l.IsKnownConstant());\n}\n\nTEST(Assignment, RelatedToRelated) {\n  Label l, m, n, o;\n  l = n;\n  m = o;\n  l = m;\n  EXPECT_EQ(0U, n-o);\n  EXPECT_TRUE(n.IsKnownOffsetFrom(o));\n  u_int64_t d;\n  EXPECT_TRUE(n.IsKnownOffsetFrom(o, &d));\n  EXPECT_EQ(0U, d);\n  EXPECT_FALSE(l.IsKnownConstant());\n}\n\nTEST(Assignment, RelatedToKnown) {\n  Label l, m, n;\n  m = n;\n  l = 0xd2011f8c82ad56f2ULL;\n  l = m;\n  EXPECT_TRUE(l.IsKnownConstant());\n  EXPECT_EQ(0xd2011f8c82ad56f2ULL, l.Value());\n  EXPECT_TRUE(m.IsKnownConstant());\n  EXPECT_EQ(0xd2011f8c82ad56f2ULL, m.Value());\n  EXPECT_TRUE(n.IsKnownConstant());\n  EXPECT_EQ(0xd2011f8c82ad56f2ULL, n.Value());\n}\n\nTEST(Assignment, KnownToUnconstrained) {\n  Label l, m;\n  m = 0x50b024c0d6073887ULL;\n  l = m;\n  EXPECT_TRUE(l.IsKnownConstant());\n  EXPECT_EQ(0x50b024c0d6073887ULL, l.Value());\n  EXPECT_TRUE(m.IsKnownConstant());\n  EXPECT_EQ(0x50b024c0d6073887ULL, m.Value());\n}\n\nTEST(Assignment, KnownToRelated) {\n  Label l, m, n;\n  l = n;\n  m = 0x5348883655c727e5ULL;\n  l = m;\n  EXPECT_TRUE(l.IsKnownConstant());\n  EXPECT_EQ(0x5348883655c727e5ULL, l.Value());\n  EXPECT_TRUE(m.IsKnownConstant());\n  EXPECT_EQ(0x5348883655c727e5ULL, m.Value());\n  EXPECT_TRUE(n.IsKnownConstant());\n  EXPECT_EQ(0x5348883655c727e5ULL, n.Value());\n}\n\nTEST(Assignment, KnownToKnown) {\n  Label l, m;\n  l = 0x36c209c20987564eULL;\n  m = 0x36c209c20987564eULL;\n  l = m;\n  EXPECT_TRUE(l.IsKnownConstant());\n  EXPECT_EQ(0x36c209c20987564eULL, l.Value());\n  EXPECT_TRUE(m.IsKnownConstant());\n  EXPECT_EQ(0x36c209c20987564eULL, m.Value());\n}\n\nTEST(Assignment, ConstantToUnconstrained) {\n  Label l;\n  l = 0xc02495f4d7f5a957ULL;\n  EXPECT_TRUE(l.IsKnownConstant());\n  EXPECT_EQ(0xc02495f4d7f5a957ULL, l.Value());\n}\n\nTEST(Assignment, ConstantToRelated) {\n  Label l, m;\n  l = m;\n  l = 0x4577901cf275488dULL;\n  EXPECT_TRUE(l.IsKnownConstant());\n  EXPECT_EQ(0x4577901cf275488dULL, l.Value());\n  EXPECT_TRUE(m.IsKnownConstant());\n  EXPECT_EQ(0x4577901cf275488dULL, m.Value());\n}\n\nTEST(Assignment, ConstantToKnown) {\n  Label l;\n  l = 0xec0b9c369b7e8ea7ULL;\n  l = 0xec0b9c369b7e8ea7ULL;\n  EXPECT_TRUE(l.IsKnownConstant());\n  EXPECT_EQ(0xec0b9c369b7e8ea7ULL, l.Value());\n}\n\nTEST(AssignmentDeathTest, Self) {\n  Label l;\n  ASSERT_DEATH(l = l, \"binding != this\");\n}\n\nTEST(AssignmentDeathTest, IndirectCycle) {\n  Label l, m, n;\n  l = m;\n  m = n;\n  ASSERT_DEATH(n = l, \"binding != this\");\n}\n\nTEST(AssignmentDeathTest, Cycle) {\n  Label l, m, n, o;\n  l = m;\n  m = n;\n  o = n;\n  ASSERT_DEATH(o = l, \"binding != this\");\n}\n\nTEST(Addition, LabelConstant) {\n  Label l, m;\n  m = l + 0x5248d93e8bbe9497ULL;\n  EXPECT_TRUE(m.IsKnownOffsetFrom(l));\n  u_int64_t d;\n  EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));\n  EXPECT_EQ(0x5248d93e8bbe9497ULL, d);\n  EXPECT_FALSE(m.IsKnownConstant());\n}\n\nTEST(Addition, ConstantLabel) {\n  Label l, m;\n  m = 0xf51e94e00d6e3c84ULL + l;\n  EXPECT_TRUE(m.IsKnownOffsetFrom(l));\n  u_int64_t d;\n  EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));\n  EXPECT_EQ(0xf51e94e00d6e3c84ULL, d);\n  EXPECT_FALSE(m.IsKnownConstant());\n}\n\nTEST(Addition, KnownLabelConstant) {\n  Label l, m;\n  l = 0x16286307042ce0d8ULL;\n  m = l + 0x3fdddd91306719d7ULL;\n  EXPECT_TRUE(m.IsKnownOffsetFrom(l));\n  u_int64_t d;\n  EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));\n  EXPECT_EQ(0x3fdddd91306719d7ULL, d);\n  EXPECT_TRUE(m.IsKnownConstant());\n  EXPECT_EQ(0x16286307042ce0d8ULL + 0x3fdddd91306719d7ULL, m.Value());\n}\n\nTEST(Addition, ConstantKnownLabel) {\n  Label l, m;\n  l = 0x50f62d0cdd1031deULL;\n  m = 0x1b13462d8577c538ULL + l;\n  EXPECT_TRUE(m.IsKnownOffsetFrom(l));\n  u_int64_t d;\n  EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));\n  EXPECT_EQ(0x1b13462d8577c538ULL, d);\n  EXPECT_TRUE(m.IsKnownConstant());\n  EXPECT_EQ(0x50f62d0cdd1031deULL + 0x1b13462d8577c538ULL, m.Value());\n}\n\nTEST(Subtraction, LabelConstant) {\n  Label l, m;\n  m = l - 0x0620884d21d3138eULL;\n  EXPECT_TRUE(m.IsKnownOffsetFrom(l));\n  u_int64_t d;\n  EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));\n  EXPECT_EQ(-0x0620884d21d3138eULL, d);\n  EXPECT_FALSE(m.IsKnownConstant());\n}\n\nTEST(Subtraction, KnownLabelConstant) {\n  Label l, m;\n  l = 0x6237fbaf9ef7929eULL;\n  m = l - 0x317730995d2ab6eeULL;\n  EXPECT_TRUE(m.IsKnownOffsetFrom(l));\n  u_int64_t d;\n  EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));\n  EXPECT_EQ(-0x317730995d2ab6eeULL, d);\n  EXPECT_TRUE(m.IsKnownConstant());\n  EXPECT_EQ(0x6237fbaf9ef7929eULL - 0x317730995d2ab6eeULL, m.Value());\n}\n\nTEST(SubtractionDeathTest, LabelLabel) {\n  Label l, m;\n  ASSERT_DEATH(l - m, \"IsKnownOffsetFrom\\\\(label, &offset\\\\)\");\n}\n\nTEST(Subtraction, LabelLabel) {\n  Label l, m;\n  l = m + 0x7fa77ec63e28a17aULL;\n  EXPECT_EQ(0x7fa77ec63e28a17aULL, l - m);\n  EXPECT_EQ(-0x7fa77ec63e28a17aULL, m - l);\n}\n\nTEST(IsKnownConstant, Undefined) {\n  Label l;\n  EXPECT_FALSE(l.IsKnownConstant());\n}\n\nTEST(IsKnownConstant, RelatedLabel) {\n  Label l, m;\n  l = m;\n  EXPECT_FALSE(l.IsKnownConstant());\n  EXPECT_FALSE(m.IsKnownConstant());\n}\n\nTEST(IsKnownConstant, Constant) {\n  Label l;\n  l = 0xf374b1bdd6a22576ULL;\n  EXPECT_TRUE(l.IsKnownConstant());\n}\n\nTEST(IsKnownOffsetFrom, Unrelated) {\n  Label l, m;\n  EXPECT_FALSE(l.IsKnownOffsetFrom(m));\n}\n\nTEST(IsKnownOffsetFrom, Related) {\n  Label l, m;\n  l = m;\n  EXPECT_TRUE(l.IsKnownOffsetFrom(m));\n}\n\n// Test the construction of chains of related labels, and the\n// propagation of values through them.\n//\n// Although the relations between labels are supposed to behave\n// symmetrically --- that is, 'a = b' should put a and b in\n// indistinguishable states --- there's a distinction made internally\n// between the target (a) and the source (b).\n// \n// So there are five test axes to cover:\n//\n// - Do we construct the chain with assignment (\"Assign\") or with constructors\n//   (\"Construct\")?\n//\n// - Do we set the value of the label at the start of the chain\n//   (\"Start\") or the label at the end (\"End\")?\n//\n// - Are we testing the propagation of a relationship between variable\n//   values (\"Relation\"), or the propagation of a known constant value\n//   (\"Value\")?\n//\n// - Do we set the value before building the chain (\"Before\") or after\n//   the chain has been built (\"After\")?\n//\n// - Do we add new relationships to the end of the existing chain\n//   (\"Forward\") or to the beginning (\"Backward\")?\n//\n// Of course, \"Construct\" and \"Backward\" can't be combined, which\n// eliminates eight combinations, and \"Construct\", \"End\", and \"Before\"\n// can't be combined, which eliminates two more, so there are are 22\n// combinations, not 32.\n\nTEST(LabelChain, AssignStartRelationBeforeForward) {\n  Label a, b, c, d;\n  Label x;\n  a = x;\n  b = a + 0x1;\n  c = b + 0x10;\n  d = c + 0x100;\n  EXPECT_EQ(0x111U, d-x);\n  EXPECT_EQ(0x11U,  c-x);\n  EXPECT_EQ(0x1U,   b-x);\n  EXPECT_EQ(0U,     a-x);\n}\n\nTEST(LabelChain, AssignStartRelationBeforeBackward) {\n  Label a, b, c, d;\n  Label x;\n  a = x;\n  d = c + 0x100;\n  c = b + 0x10;\n  b = a + 0x1;\n  EXPECT_EQ(0x111U, d-x);\n  EXPECT_EQ(0x11U,  c-x);\n  EXPECT_EQ(0x1U,   b-x);\n  EXPECT_EQ(0U,     a-x);\n}\n\nTEST(LabelChain, AssignStartRelationAfterForward) {\n  Label a, b, c, d;\n  Label x;\n  b = a + 0x1;\n  c = b + 0x10;\n  d = c + 0x100;\n  a = x;\n  EXPECT_EQ(0x111U, d-x);\n  EXPECT_EQ(0x11U,  c-x);\n  EXPECT_EQ(0x1U,   b-x);\n  EXPECT_EQ(0U,     a-x);\n}\n\nTEST(LabelChain, AssignStartRelationAfterBackward) {\n  Label a, b, c, d;\n  Label x;\n  d = c + 0x100;\n  c = b + 0x10;\n  b = a + 0x1;\n  a = x;\n  EXPECT_EQ(0x111U, d-x);\n  EXPECT_EQ(0x11U,  c-x);\n  EXPECT_EQ(0x1U,   b-x);\n  EXPECT_EQ(0U,     a-x);\n}\n\nTEST(LabelChain, AssignStartValueBeforeForward) {\n  Label a, b, c, d;\n  a = 0xa131200190546ac2ULL;\n  b = a + 0x1;\n  c = b + 0x10;\n  d = c + 0x100;\n  EXPECT_EQ(0xa131200190546ac2ULL + 0x111U, d.Value());\n  EXPECT_EQ(0xa131200190546ac2ULL + 0x11U,  c.Value());\n  EXPECT_EQ(0xa131200190546ac2ULL + 0x1U,   b.Value());\n  EXPECT_EQ(0xa131200190546ac2ULL + 0U,     a.Value());\n}\n\nTEST(LabelChain, AssignStartValueBeforeBackward) {\n  Label a, b, c, d;\n  a = 0x8da17e1670ad4fa2ULL;\n  d = c + 0x100;\n  c = b + 0x10;\n  b = a + 0x1;\n  EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x111U, d.Value());\n  EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x11U,  c.Value());\n  EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x1U,   b.Value());\n  EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0U,     a.Value());\n}\n\nTEST(LabelChain, AssignStartValueAfterForward) {\n  Label a, b, c, d;\n  b = a + 0x1;\n  c = b + 0x10;\n  d = c + 0x100;\n  a = 0x99b8f51bafd41adaULL;\n  EXPECT_EQ(0x99b8f51bafd41adaULL + 0x111U, d.Value());\n  EXPECT_EQ(0x99b8f51bafd41adaULL + 0x11U,  c.Value());\n  EXPECT_EQ(0x99b8f51bafd41adaULL + 0x1U,   b.Value());\n  EXPECT_EQ(0x99b8f51bafd41adaULL + 0U,     a.Value());\n}\n\nTEST(LabelChain, AssignStartValueAfterBackward) {\n  Label a, b, c, d;\n  d = c + 0x100;\n  c = b + 0x10;\n  b = a + 0x1;\n  a = 0xc86ca1d97ab5df6eULL;\n  EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x111U, d.Value());\n  EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x11U,  c.Value());\n  EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x1U,   b.Value());\n  EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0U,     a.Value());\n}\n\nTEST(LabelChain, AssignEndRelationBeforeForward) {\n  Label a, b, c, d;\n  Label x;\n  x = d;\n  b = a + 0x1;\n  c = b + 0x10;\n  d = c + 0x100;\n  EXPECT_EQ(-(u_int64_t)0x111U, a-x);\n  EXPECT_EQ(-(u_int64_t)0x110U, b-x);\n  EXPECT_EQ(-(u_int64_t)0x100U, c-x);\n  EXPECT_EQ(-(u_int64_t)0U,     d-x);\n}\n\nTEST(LabelChain, AssignEndRelationBeforeBackward) {\n  Label a, b, c, d;\n  Label x;\n  x = d;\n  d = c + 0x100;\n  c = b + 0x10;\n  b = a + 0x1;\n  EXPECT_EQ(-(u_int64_t)0x111U, a-x);\n  EXPECT_EQ(-(u_int64_t)0x110U, b-x);\n  EXPECT_EQ(-(u_int64_t)0x100U, c-x);\n  EXPECT_EQ(-(u_int64_t)0U,     d-x);\n}\n\nTEST(LabelChain, AssignEndRelationAfterForward) {\n  Label a, b, c, d;\n  Label x;\n  b = a + 0x1;\n  c = b + 0x10;\n  d = c + 0x100;\n  x = d;\n  EXPECT_EQ(-(u_int64_t)0x111U, a-x);\n  EXPECT_EQ(-(u_int64_t)0x110U, b-x);\n  EXPECT_EQ(-(u_int64_t)0x100U, c-x);\n  EXPECT_EQ(-(u_int64_t)0x000U, d-x);\n}\n\nTEST(LabelChain, AssignEndRelationAfterBackward) {\n  Label a, b, c, d;\n  Label x;\n  d = c + 0x100;\n  c = b + 0x10;\n  b = a + 0x1;\n  x = d;\n  EXPECT_EQ(-(u_int64_t)0x111U, a-x);\n  EXPECT_EQ(-(u_int64_t)0x110U, b-x);\n  EXPECT_EQ(-(u_int64_t)0x100U, c-x);\n  EXPECT_EQ(-(u_int64_t)0x000U, d-x);\n}\n\nTEST(LabelChain, AssignEndValueBeforeForward) {\n  Label a, b, c, d;\n  d = 0xa131200190546ac2ULL;\n  b = a + 0x1;\n  c = b + 0x10;\n  d = c + 0x100;\n  EXPECT_EQ(0xa131200190546ac2ULL - 0x111, a.Value());\n  EXPECT_EQ(0xa131200190546ac2ULL - 0x110, b.Value());\n  EXPECT_EQ(0xa131200190546ac2ULL - 0x100, c.Value());\n  EXPECT_EQ(0xa131200190546ac2ULL - 0x000, d.Value());\n}\n\nTEST(LabelChain, AssignEndValueBeforeBackward) {\n  Label a, b, c, d;\n  d = 0x8da17e1670ad4fa2ULL;\n  d = c + 0x100;\n  c = b + 0x10;\n  b = a + 0x1;\n  EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x111, a.Value());\n  EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x110, b.Value());\n  EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x100, c.Value());\n  EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x000, d.Value());\n}\n\nTEST(LabelChain, AssignEndValueAfterForward) {\n  Label a, b, c, d;\n  b = a + 0x1;\n  c = b + 0x10;\n  d = c + 0x100;\n  d = 0x99b8f51bafd41adaULL;\n  EXPECT_EQ(0x99b8f51bafd41adaULL - 0x111, a.Value());\n  EXPECT_EQ(0x99b8f51bafd41adaULL - 0x110, b.Value());\n  EXPECT_EQ(0x99b8f51bafd41adaULL - 0x100, c.Value());\n  EXPECT_EQ(0x99b8f51bafd41adaULL - 0x000, d.Value());\n}\n\nTEST(LabelChain, AssignEndValueAfterBackward) {\n  Label a, b, c, d;\n  d = c + 0x100;\n  c = b + 0x10;\n  b = a + 0x1;\n  d = 0xc86ca1d97ab5df6eULL;\n  EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x111, a.Value());\n  EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x110, b.Value());\n  EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x100, c.Value());\n  EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x000, d.Value());\n}\n\nTEST(LabelChain, ConstructStartRelationBeforeForward) {\n  Label x;\n  Label a(x);\n  Label b(a + 0x1);\n  Label c(b + 0x10);\n  Label d(c + 0x100);\n  EXPECT_EQ(0x111U, d-x);\n  EXPECT_EQ(0x11U,  c-x);\n  EXPECT_EQ(0x1U,   b-x);\n  EXPECT_EQ(0U,     a-x);\n}\n\nTEST(LabelChain, ConstructStartRelationAfterForward) {\n  Label x;\n  Label a;\n  Label b(a + 0x1);\n  Label c(b + 0x10);\n  Label d(c + 0x100);\n  a = x;\n  EXPECT_EQ(0x111U, d-x);\n  EXPECT_EQ(0x11U,  c-x);\n  EXPECT_EQ(0x1U,   b-x);\n  EXPECT_EQ(0U,     a-x);\n}\n\nTEST(LabelChain, ConstructStartValueBeforeForward) {\n  Label a(0x5d234d177d01ccc8ULL);\n  Label b(a + 0x1);\n  Label c(b + 0x10);\n  Label d(c + 0x100);\n  EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x111U, d.Value());\n  EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x011U, c.Value());\n  EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x001U, b.Value());\n  EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x000U, a.Value());\n}\n\nTEST(LabelChain, ConstructStartValueAfterForward) {\n  Label a;\n  Label b(a + 0x1);\n  Label c(b + 0x10);\n  Label d(c + 0x100);\n  a = 0xded85d54586e84fcULL;\n  EXPECT_EQ(0xded85d54586e84fcULL + 0x111U, d.Value());\n  EXPECT_EQ(0xded85d54586e84fcULL + 0x011U, c.Value());\n  EXPECT_EQ(0xded85d54586e84fcULL + 0x001U, b.Value());\n  EXPECT_EQ(0xded85d54586e84fcULL + 0x000U, a.Value());\n}\n\nTEST(LabelChain, ConstructEndRelationAfterForward) {\n  Label x;\n  Label a;\n  Label b(a + 0x1);\n  Label c(b + 0x10);\n  Label d(c + 0x100);\n  x = d;\n  EXPECT_EQ(-(u_int64_t)0x111U, a-x);\n  EXPECT_EQ(-(u_int64_t)0x110U, b-x);\n  EXPECT_EQ(-(u_int64_t)0x100U, c-x);\n  EXPECT_EQ(-(u_int64_t)0x000U, d-x);\n}\n\nTEST(LabelChain, ConstructEndValueAfterForward) {\n  Label a;\n  Label b(a + 0x1);\n  Label c(b + 0x10);\n  Label d(c + 0x100);\n  d = 0x99b8f51bafd41adaULL;\n  EXPECT_EQ(0x99b8f51bafd41adaULL - 0x111, a.Value());\n  EXPECT_EQ(0x99b8f51bafd41adaULL - 0x110, b.Value());\n  EXPECT_EQ(0x99b8f51bafd41adaULL - 0x100, c.Value());\n  EXPECT_EQ(0x99b8f51bafd41adaULL - 0x000, d.Value());\n}\n\nTEST(LabelTree, KnownValue) {\n  Label l, m, n, o, p;\n  l = m;\n  m = n;\n  o = p;\n  p = n;\n  l = 0x536b5de3d468a1b5ULL;\n  EXPECT_EQ(0x536b5de3d468a1b5ULL, o.Value());\n}\n\nTEST(LabelTree, Related) {\n  Label l, m, n, o, p;\n  l = m - 1;\n  m = n - 10;\n  o = p + 100;\n  p = n + 1000;\n  EXPECT_EQ(1111U, o - l);\n}\n\nTEST(EquationDeathTest, EqualConstants) {\n  Label m = 0x0d3962f280f07d24ULL;\n  Label n = 0x0d3962f280f07d24ULL;\n  m = n; // no death expected\n}\n\nTEST(EquationDeathTest, EqualIndirectConstants) {\n  Label m = 0xa347f1e5238fe6a1ULL;\n  Label n;\n  Label o = n;\n  n = 0xa347f1e5238fe6a1ULL;\n  n = m; // no death expected\n}\n\nTEST(EquationDeathTest, ConstantClash) {\n  Label m = 0xd4cc0f4f630ec741ULL;\n  Label n = 0x934cd2d8254fc3eaULL;\n  ASSERT_DEATH(m = n, \"addend_ == addend\");\n}\n\nTEST(EquationDeathTest, IndirectConstantClash) {\n  Label m = 0xd4cc0f4f630ec741ULL;\n  Label n, o;\n  n = o;\n  o = 0xcfbe3b83ac49ce86ULL;\n  ASSERT_DEATH(m = n, \"addend_ == addend\");\n}\n\n// Assigning to a related label may free the next Binding on its\n// chain. This test always passes; it is interesting to memory\n// checkers and coverage analysis.\nTEST(LabelReferenceCount, AssignmentFree) {\n  Label l;\n  {\n    Label m;\n    l = m;\n  }\n  // This should free m's Binding.\n  l = 0xca8bae92f0376d4fULL;\n  ASSERT_EQ(0xca8bae92f0376d4fULL, l.Value());\n}\n\n// Finding the value of a label may free the Binding it refers to. This test\n// always passes; it is interesting to memory checkers and coverage analysis.\nTEST(LabelReferenceCount, FindValueFree) {\n  Label l;\n  {\n    Label m, n;\n    l = m;\n    m = n;\n    n = 0x7a0b0c576672daafULL;\n    // At this point, l's Binding refers to m's Binding, which refers\n    // to n's binding.\n  }\n  // Now, l is the only reference keeping the three Bindings alive.\n  // Resolving its value should free l's and m's original bindings.\n  ASSERT_EQ(0x7a0b0c576672daafULL, l.Value());\n}\n\nTEST(ConstructSection, Simple) {\n  Section s;\n}\n\nTEST(ConstructSection, WithEndian) {\n  Section s(kBigEndian);\n}\n\n// A fixture class for TestAssembler::Section tests.\nclass SectionFixture {\n public:\n  Section section;\n  string contents;\n  static const u_int8_t data[];\n  static const size_t data_size;\n};\n\nconst u_int8_t SectionFixture::data[] = {\n  0x87, 0x4f, 0x43, 0x67, 0x30, 0xd0, 0xd4, 0x0e\n};\n\n#define I0()\n#define I1(a) { a }\n#define I2(a,b) { a,b }\n#define I3(a,b,c) { a,b,c }\n#define I4(a,b,c,d) { a,b,c,d }\n#define I5(a,b,c,d,e) { a,b,c,d,e }\n#define I6(a,b,c,d,e,f) { a,b,c,d,e,f }\n#define I7(a,b,c,d,e,f,g) { a,b,c,d,e,f,g }\n#define I8(a,b,c,d,e,f,g,h) { a,b,c,d,e,f,g,h }\n#define I9(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f,g,h,i }\n#define ASSERT_BYTES(s, b)                                              \\\n  do                                                                    \\\n    {                                                                   \\\n      static const u_int8_t expected_bytes[] = b;                       \\\n      ASSERT_EQ(sizeof(expected_bytes), s.size());                      \\\n      ASSERT_TRUE(memcmp(s.data(), (const char *) expected_bytes,       \\\n                         sizeof(expected_bytes)) == 0);                 \\\n    }                                                                   \\\n  while(0)\n\nclass Append: public SectionFixture, public Test { };\n\nTEST_F(Append, Bytes) {\n  section.Append(data, sizeof(data));\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_EQ(sizeof(data), contents.size());\n  EXPECT_TRUE(0 == memcmp(contents.data(), (const char *) data, sizeof(data)));\n}\n\nTEST_F(Append, BytesTwice) {\n  section.Append(data, sizeof(data));\n  section.Append(data, sizeof(data));\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_EQ(2 * sizeof(data), contents.size());\n  ASSERT_TRUE(0 == memcmp(contents.data(), (const char *) data, sizeof(data)));\n  ASSERT_TRUE(0 == memcmp(contents.data() + sizeof(data),\n                          (const char *) data, sizeof(data)));\n}\n\nTEST_F(Append, String) {\n  string s1 = \"howdy \";\n  string s2 = \"there\";\n  section.Append(s1);\n  section.Append(s2);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_STREQ(contents.c_str(), \"howdy there\");\n}\n\nTEST_F(Append, CString) {\n  section.AppendCString(\"howdy\");\n  section.AppendCString(\"\");\n  section.AppendCString(\"there\");\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_EQ(string(\"howdy\\0\\0there\\0\", 13), contents);\n}\n\nTEST_F(Append, CStringSize) {\n  section.AppendCString(\"howdy\", 3);\n  section.AppendCString(\"there\", 5);\n  section.AppendCString(\"fred\", 6);\n  section.AppendCString(\"natalie\", 0);\n  section.AppendCString(\"\", 10);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_EQ(string(\"howtherefred\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\", 24), contents);\n}\n\nTEST_F(Append, RepeatedBytes) {\n  section.Append((size_t) 10, '*');\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_STREQ(contents.c_str(), \"**********\");\n}\n\nTEST_F(Append, GeneralLE1) {\n  section.Append(kLittleEndian, 1, 42);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I1(42));\n}\n\nTEST_F(Append, GeneralLE2) {\n  section.Append(kLittleEndian, 2, 0x15a1);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I2(0xa1, 0x15));\n}\n\nTEST_F(Append, GeneralLE3) {\n  section.Append(kLittleEndian, 3, 0x59ae8d);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I3(0x8d, 0xae, 0x59));\n}\n\nTEST_F(Append, GeneralLE4) {\n  section.Append(kLittleEndian, 4, 0x51603c56);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I4(0x56, 0x3c, 0x60, 0x51));\n}\n\nTEST_F(Append, GeneralLE5) {\n  section.Append(kLittleEndian, 5, 0x385e2803b4ULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I5(0xb4, 0x03, 0x28, 0x5e, 0x38));\n}\n\nTEST_F(Append, GeneralLE6) {\n  section.Append(kLittleEndian, 6, 0xc7db9534dd1fULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I6(0x1f, 0xdd, 0x34, 0x95, 0xdb, 0xc7));\n}\n\nTEST_F(Append, GeneralLE7) {\n  section.Append(kLittleEndian, 7, 0x1445c9f1b843e6ULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I7(0xe6, 0x43, 0xb8, 0xf1, 0xc9, 0x45, 0x14));\n}\n\nTEST_F(Append, GeneralLE8) {\n  section.Append(kLittleEndian, 8, 0xaf48019dfe5c01e5ULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I8(0xe5, 0x01, 0x5c, 0xfe, 0x9d, 0x01, 0x48, 0xaf));\n}\n\nTEST_F(Append, GeneralBE1) {\n  section.Append(kBigEndian, 1, 0xd0ULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I1(0xd0));\n}\n\nTEST_F(Append, GeneralBE2) {\n  section.Append(kBigEndian, 2, 0x2e7eULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I2(0x2e, 0x7e));\n}\n\nTEST_F(Append, GeneralBE3) {\n  section.Append(kBigEndian, 3, 0x37dad6ULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I3(0x37, 0xda, 0xd6));\n}\n\nTEST_F(Append, GeneralBE4) {\n  section.Append(kBigEndian, 4, 0x715935c7ULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I4(0x71, 0x59, 0x35, 0xc7));\n}\n\nTEST_F(Append, GeneralBE5) {\n  section.Append(kBigEndian, 5, 0x42baeb02b7ULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I5(0x42, 0xba, 0xeb, 0x02, 0xb7));\n}\n\nTEST_F(Append, GeneralBE6) {\n  section.Append(kBigEndian, 6, 0xf1cdf10e7b18ULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I6(0xf1, 0xcd, 0xf1, 0x0e, 0x7b, 0x18));\n}\n\nTEST_F(Append, GeneralBE7) {\n  section.Append(kBigEndian, 7, 0xf50a724f0b0d20ULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I7(0xf5, 0x0a, 0x72, 0x4f, 0x0b, 0x0d, 0x20));\n}\n\nTEST_F(Append, GeneralBE8) {\n  section.Append(kBigEndian, 8, 0xa6b2cb5e98dc9c16ULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I8(0xa6, 0xb2, 0xcb, 0x5e, 0x98, 0xdc, 0x9c, 0x16));\n}\n\nTEST_F(Append, GeneralLE1Label) {\n  Label l;\n  section.Append(kLittleEndian, 1, l);\n  l = 42;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I1(42));\n}\n\nTEST_F(Append, GeneralLE2Label) {\n  Label l;\n  section.Append(kLittleEndian, 2, l);\n  l = 0x15a1;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I2(0xa1, 0x15));\n}\n\nTEST_F(Append, GeneralLE3Label) {\n  Label l;\n  section.Append(kLittleEndian, 3, l);\n  l = 0x59ae8d;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I3(0x8d, 0xae, 0x59));\n}\n\nTEST_F(Append, GeneralLE4Label) {\n  Label l;\n  section.Append(kLittleEndian, 4, l);\n  l = 0x51603c56;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I4(0x56, 0x3c, 0x60, 0x51));\n}\n\nTEST_F(Append, GeneralLE5Label) {\n  Label l;\n  section.Append(kLittleEndian, 5, l);\n  l = 0x385e2803b4ULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I5(0xb4, 0x03, 0x28, 0x5e, 0x38));\n}\n\nTEST_F(Append, GeneralLE6Label) {\n  Label l;\n  section.Append(kLittleEndian, 6, l);\n  l = 0xc7db9534dd1fULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I6(0x1f, 0xdd, 0x34, 0x95, 0xdb, 0xc7));\n}\n\nTEST_F(Append, GeneralLE7Label) {\n  Label l;\n  section.Append(kLittleEndian, 7, l);\n  l = 0x1445c9f1b843e6ULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I7(0xe6, 0x43, 0xb8, 0xf1, 0xc9, 0x45, 0x14));\n}\n\nTEST_F(Append, GeneralLE8Label) {\n  Label l;\n  section.Append(kLittleEndian, 8, l);\n  l = 0xaf48019dfe5c01e5ULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I8(0xe5, 0x01, 0x5c, 0xfe, 0x9d, 0x01, 0x48, 0xaf));\n}\n\nTEST_F(Append, GeneralBE1Label) {\n  Label l;\n  section.Append(kBigEndian, 1, l);\n  l = 0xd0ULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I1(0xd0));\n}\n\nTEST_F(Append, GeneralBE2Label) {\n  Label l;\n  section.Append(kBigEndian, 2, l);\n  l = 0x2e7eULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I2(0x2e, 0x7e));\n}\n\nTEST_F(Append, GeneralBE3Label) {\n  Label l;\n  section.Append(kBigEndian, 3, l);\n  l = 0x37dad6ULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I3(0x37, 0xda, 0xd6));\n}\n\nTEST_F(Append, GeneralBE4Label) {\n  Label l;\n  section.Append(kBigEndian, 4, l);\n  l = 0x715935c7ULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I4(0x71, 0x59, 0x35, 0xc7));\n}\n\nTEST_F(Append, GeneralBE5Label) {\n  Label l;\n  section.Append(kBigEndian, 5, l);\n  l = 0x42baeb02b7ULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I5(0x42, 0xba, 0xeb, 0x02, 0xb7));\n}\n\nTEST_F(Append, GeneralBE6Label) {\n  Label l;\n  section.Append(kBigEndian, 6, l);\n  l = 0xf1cdf10e7b18ULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I6(0xf1, 0xcd, 0xf1, 0x0e, 0x7b, 0x18));\n}\n\nTEST_F(Append, GeneralBE7Label) {\n  Label l;\n  section.Append(kBigEndian, 7, l);\n  l = 0xf50a724f0b0d20ULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I7(0xf5, 0x0a, 0x72, 0x4f, 0x0b, 0x0d, 0x20));\n}\n\nTEST_F(Append, GeneralBE8Label) {\n  Label l;\n  section.Append(kBigEndian, 8, l);\n  l = 0xa6b2cb5e98dc9c16ULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I8(0xa6, 0xb2, 0xcb, 0x5e, 0x98, 0xdc, 0x9c, 0x16));\n}\n\nTEST_F(Append, B8) {\n  section.Append(1, 0x2a);\n  section.B8(0xd3U);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I2(0x2a, 0xd3));\n}\n\nTEST_F(Append, B8Label) {\n  Label l;\n  section.Append(1, 0x2a);\n  section.B8(l);\n  l = 0x4bU;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I2(0x2a, 0x4b));\n}\n\nTEST_F(Append, B16) {\n  section.Append(1, 0x2a);\n  section.B16(0x472aU);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I3(0x2a, 0x47, 0x2a));\n}\n\nTEST_F(Append, B16Label) {\n  Label l;\n  section.Append(1, 0x2a);\n  section.B16(l);\n  l = 0x55e8U;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I3(0x2a, 0x55, 0xe8));\n}\n\nTEST_F(Append, B32) {\n  section.Append(1, 0x2a);\n  section.B32(0xbd412cbcU);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I5(0x2a, 0xbd, 0x41, 0x2c, 0xbc));\n}\n\nTEST_F(Append, B32Label) {\n  Label l;\n  section.Append(1, 0x2a);\n  section.B32(l);\n  l = 0x208e37d5U;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I5(0x2a, 0x20, 0x8e, 0x37, 0xd5));\n}\n\nTEST_F(Append, B64) {\n  section.Append(1, 0x2a);\n  section.B64(0x3402a013111e68adULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, \n               I9(0x2a, 0x34, 0x02, 0xa0, 0x13, 0x11, 0x1e, 0x68, 0xad));\n}\n\nTEST_F(Append, B64Label) {\n  Label l;\n  section.Append(1, 0x2a);\n  section.B64(l);\n  l = 0x355dbfbb4ac6d57fULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, \n               I9(0x2a, 0x35, 0x5d, 0xbf, 0xbb, 0x4a, 0xc6, 0xd5, 0x7f));\n}\n\nTEST_F(Append, L8) {\n  section.Append(1, 0x2a);\n  section.L8(0x26U);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I2(0x2a, 0x26));\n}\n\nTEST_F(Append, L8Label) {\n  Label l;\n  section.Append(1, 0x2a);\n  section.L8(l);\n  l = 0xa8U;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I2(0x2a, 0xa8));\n}\n\nTEST_F(Append, L16) {\n  section.Append(1, 0x2a);\n  section.L16(0xca6dU);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I3(0x2a, 0x6d, 0xca));\n}\n\nTEST_F(Append, L16Label) {\n  Label l;\n  section.Append(1, 0x2a);\n  section.L16(l);\n  l = 0xd21fU;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I3(0x2a, 0x1f, 0xd2));\n}\n\nTEST_F(Append, L32) {\n  section.Append(1, 0x2a);\n  section.L32(0x558f6181U);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I5(0x2a, 0x81, 0x61, 0x8f, 0x55));\n}\n\nTEST_F(Append, L32Label) {\n  Label l;\n  section.Append(1, 0x2a);\n  section.L32(l);\n  l = 0x4b810f82U;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I5(0x2a, 0x82, 0x0f, 0x81, 0x4b));\n}\n\nTEST_F(Append, L64) {\n  section.Append(1, 0x2a);\n  section.L64(0x564384f7579515bfULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, \n               I9(0x2a, 0xbf, 0x15, 0x95, 0x57, 0xf7, 0x84, 0x43, 0x56));\n}\n\nTEST_F(Append, L64Label) {\n  Label l;\n  section.Append(1, 0x2a);\n  section.L64(l);\n  l = 0x424b1d020667c8dbULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, \n               I9(0x2a, 0xdb, 0xc8, 0x67, 0x06, 0x02, 0x1d, 0x4b, 0x42));\n}\n\nTEST_F(Append, D8Big) {\n  section.set_endianness(kBigEndian);\n  section.Append(1, 0x2a);\n  section.D8(0xe6U);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I2(0x2a, 0xe6));\n}\n\nTEST_F(Append, D8BigLabel) {\n  Label l;\n  section.set_endianness(kBigEndian);\n  section.Append(1, 0x2a);\n  section.D8(l);\n  l = 0xeeU;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I2(0x2a, 0xee));\n}\n\nTEST_F(Append, D16Big) {\n  section.set_endianness(kBigEndian);\n  section.Append(1, 0x2a);\n  section.D16(0x83b1U);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I3(0x2a, 0x83, 0xb1));\n}\n\nTEST_F(Append, D16BigLabel) {\n  Label l;\n  section.set_endianness(kBigEndian);\n  section.Append(1, 0x2a);\n  section.D16(l);\n  l = 0x5b55U;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I3(0x2a, 0x5b, 0x55));\n}\n\nTEST_F(Append, D32Big) {\n  section.set_endianness(kBigEndian);\n  section.Append(1, 0x2a);\n  section.D32(0xd0b0e431U);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I5(0x2a, 0xd0, 0xb0, 0xe4, 0x31));\n}\n\nTEST_F(Append, D32BigLabel) {\n  Label l;\n  section.set_endianness(kBigEndian);\n  section.Append(1, 0x2a);\n  section.D32(l);\n  l = 0x312fb340U;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I5(0x2a, 0x31, 0x2f, 0xb3, 0x40));\n}\n\nTEST_F(Append, D64Big) {\n  section.set_endianness(kBigEndian);\n  section.Append(1, 0x2a);\n  section.D64(0xb109843500dbcb16ULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, \n               I9(0x2a, 0xb1, 0x09, 0x84, 0x35, 0x00, 0xdb, 0xcb, 0x16));\n}\n\nTEST_F(Append, D64BigLabel) {\n  Label l;\n  section.set_endianness(kBigEndian);\n  section.Append(1, 0x2a);\n  section.D64(l);\n  l = 0x9a0d61b70f671fd7ULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, \n               I9(0x2a, 0x9a, 0x0d, 0x61, 0xb7, 0x0f, 0x67, 0x1f, 0xd7));\n}\n\nTEST_F(Append, D8Little) {\n  section.set_endianness(kLittleEndian);\n  section.Append(1, 0x2a);\n  section.D8(0x42U);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I2(0x2a, 0x42));\n}\n\nTEST_F(Append, D8LittleLabel) {\n  Label l;\n  section.set_endianness(kLittleEndian);\n  section.Append(1, 0x2a);\n  section.D8(l);\n  l = 0x05U;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I2(0x2a, 0x05));\n}\n\nTEST_F(Append, D16Little) {\n  section.set_endianness(kLittleEndian);\n  section.Append(1, 0x2a);\n  section.D16(0xc5c5U);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I3(0x2a, 0xc5, 0xc5));\n}\n\nTEST_F(Append, D16LittleLabel) {\n  Label l;\n  section.set_endianness(kLittleEndian);\n  section.Append(1, 0x2a);\n  section.D16(l);\n  l = 0xb620U;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I3(0x2a, 0x20, 0xb6));\n}\n\nTEST_F(Append, D32Little) {\n  section.set_endianness(kLittleEndian);\n  section.Append(1, 0x2a);\n  section.D32(0x1a87d0feU);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I5(0x2a, 0xfe, 0xd0, 0x87, 0x1a));\n}\n\nTEST_F(Append, D32LittleLabel) {\n  Label l;\n  section.set_endianness(kLittleEndian);\n  section.Append(1, 0x2a);\n  section.D32(l);\n  l = 0xb8012d6bU;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I5(0x2a, 0x6b, 0x2d, 0x01, 0xb8));\n}\n\nTEST_F(Append, D64Little) {\n  section.set_endianness(kLittleEndian);\n  section.Append(1, 0x2a);\n  section.D64(0x42de75c61375a1deULL);\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, \n               I9(0x2a, 0xde, 0xa1, 0x75, 0x13, 0xc6, 0x75, 0xde, 0x42));\n}\n\nTEST_F(Append, D64LittleLabel) {\n  Label l;\n  section.set_endianness(kLittleEndian);\n  section.Append(1, 0x2a);\n  section.D64(l);\n  l = 0x8b3bececf3fb5312ULL;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, \n               I9(0x2a, 0x12, 0x53, 0xfb, 0xf3, 0xec, 0xec, 0x3b, 0x8b));\n}\n\nTEST_F(Append, Variety) {\n  Label a, b, c, d, e, f, g, h;\n  section.Append(kBigEndian, 1, a)\n      .Append(kLittleEndian, 8, h)\n      .Append(kBigEndian, 1, 0x8bULL)\n      .Append(kLittleEndian, 8, 0x0ea56540448f4439ULL)\n      .Append(kBigEndian, 2, b)\n      .Append(kLittleEndian, 7, g)\n      .Append(kBigEndian, 2, 0xcf15ULL)\n      .Append(kLittleEndian, 7, 0x29694f04c5724aULL)\n      .Append(kBigEndian, 3, c)\n      .Append(kLittleEndian, 6, f)\n      .Append(kBigEndian, 3, 0x8c3ffdULL)\n      .Append(kLittleEndian, 6, 0x6f11ba80187aULL)\n      .Append(kBigEndian, 4, d)\n      .Append(kLittleEndian, 5, e)\n      .Append(kBigEndian, 4, 0x2fda2472ULL)\n      .Append(kLittleEndian, 5, 0x0aa02d423fULL)\n      .Append(kBigEndian, 5, e)\n      .Append(kLittleEndian, 4, d)\n      .Append(kBigEndian, 5, 0x53ba432138ULL)\n      .Append(kLittleEndian, 4, 0xf139ae60ULL)\n      .Append(kBigEndian, 6, f)\n      .Append(kLittleEndian, 3, c)\n      .Append(kBigEndian, 6, 0x168e436af716ULL)\n      .Append(kLittleEndian, 3, 0x3ef189ULL)\n      .Append(kBigEndian, 7, g)\n      .Append(kLittleEndian, 2, b)\n      .Append(kBigEndian, 7, 0xacd4ef233e47d9ULL)\n      .Append(kLittleEndian, 2, 0x5311ULL)\n      .Append(kBigEndian, 8, h)\n      .Append(kLittleEndian, 1, a)\n      .Append(kBigEndian, 8, 0x4668d5f1c93637a1ULL)\n      .Append(kLittleEndian, 1, 0x65ULL);\n  a = 0x79ac9bd8aa256b35ULL;\n  b = 0x22d13097ef86c91cULL;\n  c = 0xf204968b0a05862fULL;\n  d = 0x163177f15a0eb4ecULL;\n  e = 0xbd1b0f1d977f2246ULL;\n  f = 0x2b0842eee83c6461ULL;\n  g = 0x92f4b928a4bf875eULL;\n  h = 0x61a199a8f7286ba6ULL;\n  ASSERT_EQ(8 * 18U, section.Size());\n  ASSERT_TRUE(section.GetContents(&contents));\n\n  static const u_int8_t expected[] = {\n    0x35,    0xa6, 0x6b, 0x28, 0xf7, 0xa8, 0x99, 0xa1, 0x61,\n    0x8b,    0x39, 0x44, 0x8f, 0x44, 0x40, 0x65, 0xa5, 0x0e,\n    0xc9, 0x1c,    0x5e, 0x87, 0xbf, 0xa4, 0x28, 0xb9, 0xf4,\n    0xcf, 0x15,    0x4a, 0x72, 0xc5, 0x04, 0x4f, 0x69, 0x29,\n    0x05, 0x86, 0x2f,    0x61, 0x64, 0x3c, 0xe8, 0xee, 0x42,\n    0x8c, 0x3f, 0xfd,    0x7a, 0x18, 0x80, 0xba, 0x11, 0x6f,\n    0x5a, 0x0e, 0xb4, 0xec,    0x46, 0x22, 0x7f, 0x97, 0x1d,\n    0x2f, 0xda, 0x24, 0x72,    0x3f, 0x42, 0x2d, 0xa0, 0x0a,\n    0x1d, 0x97, 0x7f, 0x22, 0x46,    0xec, 0xb4, 0x0e, 0x5a,\n    0x53, 0xba, 0x43, 0x21, 0x38,    0x60, 0xae, 0x39, 0xf1,\n    0x42, 0xee, 0xe8, 0x3c, 0x64, 0x61,    0x2f, 0x86, 0x05,\n    0x16, 0x8e, 0x43, 0x6a, 0xf7, 0x16,    0x89, 0xf1, 0x3e,\n    0xf4, 0xb9, 0x28, 0xa4, 0xbf, 0x87, 0x5e,    0x1c, 0xc9,\n    0xac, 0xd4, 0xef, 0x23, 0x3e, 0x47, 0xd9,    0x11, 0x53,\n    0x61, 0xa1, 0x99, 0xa8, 0xf7, 0x28, 0x6b, 0xa6,    0x35,\n    0x46, 0x68, 0xd5, 0xf1, 0xc9, 0x36, 0x37, 0xa1,    0x65,\n  };\n\n  ASSERT_TRUE(0 == memcmp(contents.data(), expected, sizeof(expected)));\n}\n\nTEST_F(Append, Section) {\n  section.Append(\"murder\");\n  {\n    Section middle;\n    middle.Append(\" she\");\n    section.Append(middle);\n  }\n  section.Append(\" wrote\");\n  EXPECT_EQ(16U, section.Size());\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_STREQ(contents.c_str(), \"murder she wrote\");\n}\n\nTEST_F(Append, SectionRefs) {\n  section.Append(\"sugar \");\n  Label l;\n  {\n    Section middle;\n    Label m;\n    middle.B32(m);\n    section.Append(middle);\n    m = 0x66726565;\n  }\n  section.Append(\" jazz\");\n  EXPECT_EQ(15U, section.Size());\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_STREQ(contents.c_str(), \"sugar free jazz\");\n}\n\nTEST_F(Append, LEB128_0) {\n  section.LEB128(0);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\0\", 1), contents);\n}\n\nTEST_F(Append, LEB128_0x3f) {\n  section.LEB128(0x3f);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x3f\", 1), contents);\n}\n\nTEST_F(Append, LEB128_0x40) {\n  section.LEB128(0x40);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\xc0\\x00\", 2), contents);\n}\n\nTEST_F(Append, LEB128_0x7f) {\n  section.LEB128(0x7f);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\xff\\x00\", 2), contents);\n}\n\nTEST_F(Append, LEB128_0x80) {\n  section.LEB128(0x80);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x80\\x01\", 2), contents);\n}\n\nTEST_F(Append, LEB128_0xff) {\n  section.LEB128(0xff);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\xff\\x01\", 2), contents);\n}\n\nTEST_F(Append, LEB128_0x1fff) {\n  section.LEB128(0x1fff);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\xff\\x3f\", 2), contents);\n}\n\nTEST_F(Append, LEB128_0x2000) {\n  section.LEB128(0x2000);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x80\\xc0\\x00\", 3), contents);\n}\n\nTEST_F(Append, LEB128_n1) {\n  section.LEB128(-1);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x7f\", 1), contents);\n}\n\nTEST_F(Append, LEB128_n0x40) {\n  section.LEB128(-0x40);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x40\", 1), contents);\n}\n\nTEST_F(Append, LEB128_n0x41) {\n  section.LEB128(-0x41);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\xbf\\x7f\", 2), contents);\n}\n\nTEST_F(Append, LEB128_n0x7f) {\n  section.LEB128(-0x7f);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x81\\x7f\", 2), contents);\n}\n\nTEST_F(Append, LEB128_n0x80) {\n  section.LEB128(-0x80);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x80\\x7f\", 2), contents);\n}\n\nTEST_F(Append, LEB128_n0x2000) {\n  section.LEB128(-0x2000);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x80\\x40\", 2), contents);\n}\n\nTEST_F(Append, LEB128_n0x2001) {\n  section.LEB128(-0x2001);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\xff\\xbf\\x7f\", 3), contents);\n}\n\nTEST_F(Append,ULEB128_0) {\n  section.ULEB128(0);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\0\", 1), contents);\n}\n\nTEST_F(Append,ULEB128_1) {\n  section.ULEB128(1);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x01\", 1), contents);\n}\n\nTEST_F(Append,ULEB128_0x3f) {\n  section.ULEB128(0x3f);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x3f\", 1), contents);\n}\n\nTEST_F(Append,ULEB128_0x40) {\n  section.ULEB128(0x40);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x40\", 1), contents);\n}\n\nTEST_F(Append,ULEB128_0x7f) {\n  section.ULEB128(0x7f);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x7f\", 1), contents);\n}\n\nTEST_F(Append,ULEB128_0x80) {\n  section.ULEB128(0x80);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x80\\x01\", 2), contents);\n}\n\nTEST_F(Append,ULEB128_0xff) {\n  section.ULEB128(0xff);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\xff\\x01\", 2), contents);\n}\n\nTEST_F(Append,ULEB128_0x100) {\n  section.ULEB128(0x100);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x80\\x02\", 2), contents);\n}\n\nTEST_F(Append,ULEB128_0x1fff) {\n  section.ULEB128(0x1fff);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\xff\\x3f\", 2), contents);\n}\n\nTEST_F(Append,ULEB128_0x2000) {\n  section.ULEB128(0x2000);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x80\\x40\", 2), contents);\n}\n\nTEST_F(Append,ULEB128_0x3fff) {\n  section.ULEB128(0x3fff);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\xff\\x7f\", 2), contents);\n}\n\nTEST_F(Append,ULEB128_0x4000) {\n  section.ULEB128(0x4000);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x80\\x80\\x01\", 3), contents);\n}\n\nTEST_F(Append,ULEB128_12857) {\n  section.ULEB128(12857);\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\xb9\\x64\", 2), contents);\n}\n\nTEST_F(Append, LEBChain) {\n  section.LEB128(-0x80).ULEB128(12857).Append(\"*\");\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x80\\x7f\\xb9\\x64*\", 5), contents);\n}\n\n\nclass GetContents: public SectionFixture, public Test { };\n\nTEST_F(GetContents, Undefined) {\n  Label l;\n  section.Append(kLittleEndian, 8, l);\n  ASSERT_FALSE(section.GetContents(&contents));\n}\n\nTEST_F(GetContents, ClearsContents) {\n  section.Append((size_t) 10, '*');\n  EXPECT_EQ(10U, section.Size());\n  EXPECT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(0U, section.Size());\n}\n\nTEST_F(GetContents, ClearsReferences) {\n  Label l;\n  section.Append(kBigEndian, 1, l);\n  l = 42;\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_BYTES(contents, I1(42));\n  ASSERT_TRUE(section.GetContents(&contents)); // should not die\n}\n\nclass Miscellanea: public SectionFixture, public Test { };\n\nTEST_F(Miscellanea, Clear) {\n  section.Append(\"howdy\");\n  Label l;\n  section.L32(l);\n  EXPECT_EQ(9U, section.Size());\n  section.Clear();\n  EXPECT_EQ(0U, section.Size());\n  l = 0x8d231bf0U;\n  ASSERT_TRUE(section.GetContents(&contents)); // should not die\n}\n\nTEST_F(Miscellanea, Align) {\n  section.Append(\"*\");\n  EXPECT_EQ(1U, section.Size());\n  section.Align(4).Append(\"*\");\n  EXPECT_EQ(5U, section.Size());\n  section.Append(\"*\").Align(2);\n  EXPECT_EQ(6U, section.Size());\n}\n\nTEST_F(Miscellanea, AlignPad) {\n  section.Append(\"*\");\n  EXPECT_EQ(1U, section.Size());\n  section.Align(4, ' ').Append(\"*\");\n  EXPECT_EQ(5U, section.Size());\n  section.Append(\"*\").Align(2, ' ');\n  EXPECT_EQ(6U, section.Size());\n  ASSERT_TRUE(section.GetContents(&contents));\n  ASSERT_EQ(string(\"*   **\"), contents);\n}\n\nTEST_F(Miscellanea, StartHereMark) {\n  Label m;\n  section.Append(42, ' ').Mark(&m).Append(13, '+');\n  EXPECT_EQ(42U, m - section.start());\n  EXPECT_EQ(42U + 13U, section.Here() - section.start());\n  EXPECT_FALSE(section.start().IsKnownConstant());\n  EXPECT_FALSE(m.IsKnownConstant());\n  EXPECT_FALSE(section.Here().IsKnownConstant());\n}\n\nTEST_F(Miscellanea, Endianness) {\n  section.set_endianness(kBigEndian);\n  EXPECT_EQ(kBigEndian, section.endianness());\n  section.set_endianness(kLittleEndian);\n  EXPECT_EQ(kLittleEndian, section.endianness());\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/common/testdata/func-line-pairing.h",
    "content": "// -*- mode: c++ -*-\n\n// Test data for pairing functions and lines.\n// \n// For a pair of functions that are adjacent (10,20),(20,25) and a\n// pair that are not (10,15),(20,25), we include a test case for every\n// possible arrangement of two lines relative to those functions. We\n// include cases only for non-empty ranges, since empty functions and\n// lines are dropped before we do any pairing.\n//\n// Each test case is represented by a macro call of the form:\n// \n//   PAIRING(func1_start, func1_end, func2_start, func2_end,\n//           line1_start, line1_end, line2_start, line2_end,\n//           func1_num_lines, func2_num_lines,\n//           func1_line1_start, func1_line1_end,\n//           func1_line2_start, func1_line2_end,\n//           func2_line1_start, func2_line1_end,\n//           func2_line2_start, func2_line2_end,\n//           uncovered_funcs, uncovered_lines)\n//\n// where:\n// - funcN_{start,end} is the range of the N'th function\n// - lineN_{start,end} is the range of the N'th function\n// - funcN_num_lines is the number of source lines that should be\n//   paired with the N'th function\n// - funcN_lineM_{start,end} is the range of the M'th line\n//   paired with the N'th function, where 0,0 indicates that\n//   there should be no such line paired\n// - uncovered_funcs is the number of functions with area that is\n//   uncovered by any line, and\n// - uncovered_lines is the reverse.\n\n//      func1   func2    line1   line2    num    pairing1        pairing2       uncovered\nPAIRING(10, 20, 20, 25,  6,  7,  7,  8,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #0\nPAIRING(10, 20, 20, 25,  6,  7,  7, 10,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #1\nPAIRING(10, 20, 20, 25,  6,  7,  7, 11,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 2) // #2\nPAIRING(10, 20, 20, 25,  6,  7,  7, 20,   1, 0, 10, 20,  0,  0,  0,  0,  0,  0,   1, 2) // #3\nPAIRING(10, 20, 20, 25,  6,  7,  7, 21,   1, 1, 10, 20,  0,  0, 20, 21,  0,  0,   1, 2) // #4\nPAIRING(10, 20, 20, 25,  6,  7,  7, 25,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 2) // #5\nPAIRING(10, 20, 20, 25,  6,  7,  7, 26,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 2) // #6\nPAIRING(10, 20, 20, 25,  6,  7,  8,  9,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #7\nPAIRING(10, 20, 20, 25,  6,  7,  8, 10,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #8\nPAIRING(10, 20, 20, 25,  6,  7,  8, 11,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 2) // #9\nPAIRING(10, 20, 20, 25,  6,  7,  8, 20,   1, 0, 10, 20,  0,  0,  0,  0,  0,  0,   1, 2) // #10\nPAIRING(10, 20, 20, 25,  6,  7,  8, 21,   1, 1, 10, 20,  0,  0, 20, 21,  0,  0,   1, 2) // #11\nPAIRING(10, 20, 20, 25,  6,  7,  8, 25,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 2) // #12\nPAIRING(10, 20, 20, 25,  6,  7,  8, 26,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 2) // #13\nPAIRING(10, 20, 20, 25,  6,  7, 10, 11,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 1) // #14\nPAIRING(10, 20, 20, 25,  6,  7, 10, 20,   1, 0, 10, 20,  0,  0,  0,  0,  0,  0,   1, 1) // #15\nPAIRING(10, 20, 20, 25,  6,  7, 10, 21,   1, 1, 10, 20,  0,  0, 20, 21,  0,  0,   1, 1) // #16\nPAIRING(10, 20, 20, 25,  6,  7, 10, 25,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 1) // #17\nPAIRING(10, 20, 20, 25,  6,  7, 10, 26,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 2) // #18\nPAIRING(10, 20, 20, 25,  6,  7, 11, 12,   1, 0, 11, 12,  0,  0,  0,  0,  0,  0,   2, 1) // #19\nPAIRING(10, 20, 20, 25,  6,  7, 11, 20,   1, 0, 11, 20,  0,  0,  0,  0,  0,  0,   2, 1) // #20\nPAIRING(10, 20, 20, 25,  6,  7, 11, 21,   1, 1, 11, 20,  0,  0, 20, 21,  0,  0,   2, 1) // #21\nPAIRING(10, 20, 20, 25,  6,  7, 11, 25,   1, 1, 11, 20,  0,  0, 20, 25,  0,  0,   1, 1) // #22\nPAIRING(10, 20, 20, 25,  6,  7, 11, 26,   1, 1, 11, 20,  0,  0, 20, 25,  0,  0,   1, 2) // #23\nPAIRING(10, 20, 20, 25,  6,  7, 20, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 1) // #24\nPAIRING(10, 20, 20, 25,  6,  7, 20, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 1) // #25\nPAIRING(10, 20, 20, 25,  6,  7, 20, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #26\nPAIRING(10, 20, 20, 25,  6,  7, 21, 22,   0, 1,  0,  0,  0,  0, 21, 22,  0,  0,   2, 1) // #27\nPAIRING(10, 20, 20, 25,  6,  7, 21, 25,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 1) // #28\nPAIRING(10, 20, 20, 25,  6,  7, 21, 26,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 2) // #29\nPAIRING(10, 20, 20, 25,  6,  7, 25, 26,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #30\nPAIRING(10, 20, 20, 25,  6,  7, 26, 27,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #31\nPAIRING(10, 20, 20, 25,  6, 10, 10, 11,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 1) // #32\nPAIRING(10, 20, 20, 25,  6, 10, 10, 20,   1, 0, 10, 20,  0,  0,  0,  0,  0,  0,   1, 1) // #33\nPAIRING(10, 20, 20, 25,  6, 10, 10, 21,   1, 1, 10, 20,  0,  0, 20, 21,  0,  0,   1, 1) // #34\nPAIRING(10, 20, 20, 25,  6, 10, 10, 25,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 1) // #35\nPAIRING(10, 20, 20, 25,  6, 10, 10, 26,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 2) // #36\nPAIRING(10, 20, 20, 25,  6, 10, 11, 12,   1, 0, 11, 12,  0,  0,  0,  0,  0,  0,   2, 1) // #37\nPAIRING(10, 20, 20, 25,  6, 10, 11, 20,   1, 0, 11, 20,  0,  0,  0,  0,  0,  0,   2, 1) // #38\nPAIRING(10, 20, 20, 25,  6, 10, 11, 21,   1, 1, 11, 20,  0,  0, 20, 21,  0,  0,   2, 1) // #39\nPAIRING(10, 20, 20, 25,  6, 10, 11, 25,   1, 1, 11, 20,  0,  0, 20, 25,  0,  0,   1, 1) // #40\nPAIRING(10, 20, 20, 25,  6, 10, 11, 26,   1, 1, 11, 20,  0,  0, 20, 25,  0,  0,   1, 2) // #41\nPAIRING(10, 20, 20, 25,  6, 10, 20, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 1) // #42\nPAIRING(10, 20, 20, 25,  6, 10, 20, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 1) // #43\nPAIRING(10, 20, 20, 25,  6, 10, 20, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #44\nPAIRING(10, 20, 20, 25,  6, 10, 21, 22,   0, 1,  0,  0,  0,  0, 21, 22,  0,  0,   2, 1) // #45\nPAIRING(10, 20, 20, 25,  6, 10, 21, 25,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 1) // #46\nPAIRING(10, 20, 20, 25,  6, 10, 21, 26,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 2) // #47\nPAIRING(10, 20, 20, 25,  6, 10, 25, 26,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #48\nPAIRING(10, 20, 20, 25,  6, 10, 26, 27,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #49\nPAIRING(10, 20, 20, 25,  6, 11, 11, 12,   2, 0, 10, 11, 11, 12,  0,  0,  0,  0,   2, 1) // #50\nPAIRING(10, 20, 20, 25,  6, 11, 11, 20,   2, 0, 10, 11, 11, 20,  0,  0,  0,  0,   1, 1) // #51\nPAIRING(10, 20, 20, 25,  6, 11, 11, 21,   2, 1, 10, 11, 11, 20, 20, 21,  0,  0,   1, 1) // #52\nPAIRING(10, 20, 20, 25,  6, 11, 11, 25,   2, 1, 10, 11, 11, 20, 20, 25,  0,  0,   0, 1) // #53\nPAIRING(10, 20, 20, 25,  6, 11, 11, 26,   2, 1, 10, 11, 11, 20, 20, 25,  0,  0,   0, 2) // #54\nPAIRING(10, 20, 20, 25,  6, 11, 12, 13,   2, 0, 10, 11, 12, 13,  0,  0,  0,  0,   2, 1) // #55\nPAIRING(10, 20, 20, 25,  6, 11, 12, 20,   2, 0, 10, 11, 12, 20,  0,  0,  0,  0,   2, 1) // #56\nPAIRING(10, 20, 20, 25,  6, 11, 12, 21,   2, 1, 10, 11, 12, 20, 20, 21,  0,  0,   2, 1) // #57\nPAIRING(10, 20, 20, 25,  6, 11, 12, 25,   2, 1, 10, 11, 12, 20, 20, 25,  0,  0,   1, 1) // #58\nPAIRING(10, 20, 20, 25,  6, 11, 12, 26,   2, 1, 10, 11, 12, 20, 20, 25,  0,  0,   1, 2) // #59\nPAIRING(10, 20, 20, 25,  6, 11, 20, 21,   1, 1, 10, 11,  0,  0, 20, 21,  0,  0,   2, 1) // #60\nPAIRING(10, 20, 20, 25,  6, 11, 20, 25,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 1) // #61\nPAIRING(10, 20, 20, 25,  6, 11, 20, 26,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 2) // #62\nPAIRING(10, 20, 20, 25,  6, 11, 21, 22,   1, 1, 10, 11,  0,  0, 21, 22,  0,  0,   2, 1) // #63\nPAIRING(10, 20, 20, 25,  6, 11, 21, 25,   1, 1, 10, 11,  0,  0, 21, 25,  0,  0,   2, 1) // #64\nPAIRING(10, 20, 20, 25,  6, 11, 21, 26,   1, 1, 10, 11,  0,  0, 21, 25,  0,  0,   2, 2) // #65\nPAIRING(10, 20, 20, 25,  6, 11, 25, 26,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 2) // #66\nPAIRING(10, 20, 20, 25,  6, 11, 26, 27,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 2) // #67\nPAIRING(10, 20, 20, 25,  6, 20, 20, 21,   1, 1, 10, 20,  0,  0, 20, 21,  0,  0,   1, 1) // #68\nPAIRING(10, 20, 20, 25,  6, 20, 20, 25,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 1) // #69\nPAIRING(10, 20, 20, 25,  6, 20, 20, 26,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 2) // #70\nPAIRING(10, 20, 20, 25,  6, 20, 21, 22,   1, 1, 10, 20,  0,  0, 21, 22,  0,  0,   1, 1) // #71\nPAIRING(10, 20, 20, 25,  6, 20, 21, 25,   1, 1, 10, 20,  0,  0, 21, 25,  0,  0,   1, 1) // #72\nPAIRING(10, 20, 20, 25,  6, 20, 21, 26,   1, 1, 10, 20,  0,  0, 21, 25,  0,  0,   1, 2) // #73\nPAIRING(10, 20, 20, 25,  6, 20, 25, 26,   1, 0, 10, 20,  0,  0,  0,  0,  0,  0,   1, 2) // #74\nPAIRING(10, 20, 20, 25,  6, 20, 26, 27,   1, 0, 10, 20,  0,  0,  0,  0,  0,  0,   1, 2) // #75\nPAIRING(10, 20, 20, 25,  6, 21, 21, 22,   1, 2, 10, 20,  0,  0, 20, 21, 21, 22,   1, 1) // #76\nPAIRING(10, 20, 20, 25,  6, 21, 21, 25,   1, 2, 10, 20,  0,  0, 20, 21, 21, 25,   0, 1) // #77\nPAIRING(10, 20, 20, 25,  6, 21, 21, 26,   1, 2, 10, 20,  0,  0, 20, 21, 21, 25,   0, 2) // #78\nPAIRING(10, 20, 20, 25,  6, 21, 22, 23,   1, 2, 10, 20,  0,  0, 20, 21, 22, 23,   1, 1) // #79\nPAIRING(10, 20, 20, 25,  6, 21, 22, 25,   1, 2, 10, 20,  0,  0, 20, 21, 22, 25,   1, 1) // #80\nPAIRING(10, 20, 20, 25,  6, 21, 22, 26,   1, 2, 10, 20,  0,  0, 20, 21, 22, 25,   1, 2) // #81\nPAIRING(10, 20, 20, 25,  6, 21, 25, 26,   1, 1, 10, 20,  0,  0, 20, 21,  0,  0,   1, 2) // #82\nPAIRING(10, 20, 20, 25,  6, 21, 26, 27,   1, 1, 10, 20,  0,  0, 20, 21,  0,  0,   1, 2) // #83\nPAIRING(10, 20, 20, 25,  6, 25, 25, 26,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 2) // #84\nPAIRING(10, 20, 20, 25,  6, 25, 26, 27,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 2) // #85\nPAIRING(10, 20, 20, 25,  6, 26, 26, 27,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 2) // #86\nPAIRING(10, 20, 20, 25,  6, 26, 27, 28,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 2) // #87\nPAIRING(10, 20, 20, 25, 10, 11, 11, 12,   2, 0, 10, 11, 11, 12,  0,  0,  0,  0,   2, 0) // #88\nPAIRING(10, 20, 20, 25, 10, 11, 11, 20,   2, 0, 10, 11, 11, 20,  0,  0,  0,  0,   1, 0) // #89\nPAIRING(10, 20, 20, 25, 10, 11, 11, 21,   2, 1, 10, 11, 11, 20, 20, 21,  0,  0,   1, 0) // #90\nPAIRING(10, 20, 20, 25, 10, 11, 11, 25,   2, 1, 10, 11, 11, 20, 20, 25,  0,  0,   0, 0) // #91\nPAIRING(10, 20, 20, 25, 10, 11, 11, 26,   2, 1, 10, 11, 11, 20, 20, 25,  0,  0,   0, 1) // #92\nPAIRING(10, 20, 20, 25, 10, 11, 12, 13,   2, 0, 10, 11, 12, 13,  0,  0,  0,  0,   2, 0) // #93\nPAIRING(10, 20, 20, 25, 10, 11, 12, 20,   2, 0, 10, 11, 12, 20,  0,  0,  0,  0,   2, 0) // #94\nPAIRING(10, 20, 20, 25, 10, 11, 12, 21,   2, 1, 10, 11, 12, 20, 20, 21,  0,  0,   2, 0) // #95\nPAIRING(10, 20, 20, 25, 10, 11, 12, 25,   2, 1, 10, 11, 12, 20, 20, 25,  0,  0,   1, 0) // #96\nPAIRING(10, 20, 20, 25, 10, 11, 12, 26,   2, 1, 10, 11, 12, 20, 20, 25,  0,  0,   1, 1) // #97\nPAIRING(10, 20, 20, 25, 10, 11, 20, 21,   1, 1, 10, 11,  0,  0, 20, 21,  0,  0,   2, 0) // #98\nPAIRING(10, 20, 20, 25, 10, 11, 20, 25,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 0) // #99\nPAIRING(10, 20, 20, 25, 10, 11, 20, 26,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 1) // #100\nPAIRING(10, 20, 20, 25, 10, 11, 21, 22,   1, 1, 10, 11,  0,  0, 21, 22,  0,  0,   2, 0) // #101\nPAIRING(10, 20, 20, 25, 10, 11, 21, 25,   1, 1, 10, 11,  0,  0, 21, 25,  0,  0,   2, 0) // #102\nPAIRING(10, 20, 20, 25, 10, 11, 21, 26,   1, 1, 10, 11,  0,  0, 21, 25,  0,  0,   2, 1) // #103\nPAIRING(10, 20, 20, 25, 10, 11, 25, 26,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 1) // #104\nPAIRING(10, 20, 20, 25, 10, 11, 26, 27,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 1) // #105\nPAIRING(10, 20, 20, 25, 10, 20, 20, 21,   1, 1, 10, 20,  0,  0, 20, 21,  0,  0,   1, 0) // #106\nPAIRING(10, 20, 20, 25, 10, 20, 20, 25,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 0) // #107\nPAIRING(10, 20, 20, 25, 10, 20, 20, 26,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 1) // #108\nPAIRING(10, 20, 20, 25, 10, 20, 21, 22,   1, 1, 10, 20,  0,  0, 21, 22,  0,  0,   1, 0) // #109\nPAIRING(10, 20, 20, 25, 10, 20, 21, 25,   1, 1, 10, 20,  0,  0, 21, 25,  0,  0,   1, 0) // #110\nPAIRING(10, 20, 20, 25, 10, 20, 21, 26,   1, 1, 10, 20,  0,  0, 21, 25,  0,  0,   1, 1) // #111\nPAIRING(10, 20, 20, 25, 10, 20, 25, 26,   1, 0, 10, 20,  0,  0,  0,  0,  0,  0,   1, 1) // #112\nPAIRING(10, 20, 20, 25, 10, 20, 26, 27,   1, 0, 10, 20,  0,  0,  0,  0,  0,  0,   1, 1) // #113\nPAIRING(10, 20, 20, 25, 10, 21, 21, 22,   1, 2, 10, 20,  0,  0, 20, 21, 21, 22,   1, 0) // #114\nPAIRING(10, 20, 20, 25, 10, 21, 21, 25,   1, 2, 10, 20,  0,  0, 20, 21, 21, 25,   0, 0) // #115\nPAIRING(10, 20, 20, 25, 10, 21, 21, 26,   1, 2, 10, 20,  0,  0, 20, 21, 21, 25,   0, 1) // #116\nPAIRING(10, 20, 20, 25, 10, 21, 22, 23,   1, 2, 10, 20,  0,  0, 20, 21, 22, 23,   1, 0) // #117\nPAIRING(10, 20, 20, 25, 10, 21, 22, 25,   1, 2, 10, 20,  0,  0, 20, 21, 22, 25,   1, 0) // #118\nPAIRING(10, 20, 20, 25, 10, 21, 22, 26,   1, 2, 10, 20,  0,  0, 20, 21, 22, 25,   1, 1) // #119\nPAIRING(10, 20, 20, 25, 10, 21, 25, 26,   1, 1, 10, 20,  0,  0, 20, 21,  0,  0,   1, 1) // #120\nPAIRING(10, 20, 20, 25, 10, 21, 26, 27,   1, 1, 10, 20,  0,  0, 20, 21,  0,  0,   1, 1) // #121\nPAIRING(10, 20, 20, 25, 10, 25, 25, 26,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 1) // #122\nPAIRING(10, 20, 20, 25, 10, 25, 26, 27,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 1) // #123\nPAIRING(10, 20, 20, 25, 10, 26, 26, 27,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 2) // #124\nPAIRING(10, 20, 20, 25, 10, 26, 27, 28,   1, 1, 10, 20,  0,  0, 20, 25,  0,  0,   0, 2) // #125\nPAIRING(10, 20, 20, 25, 11, 12, 12, 13,   2, 0, 11, 12, 12, 13,  0,  0,  0,  0,   2, 0) // #126\nPAIRING(10, 20, 20, 25, 11, 12, 12, 20,   2, 0, 11, 12, 12, 20,  0,  0,  0,  0,   2, 0) // #127\nPAIRING(10, 20, 20, 25, 11, 12, 12, 21,   2, 1, 11, 12, 12, 20, 20, 21,  0,  0,   2, 0) // #128\nPAIRING(10, 20, 20, 25, 11, 12, 12, 25,   2, 1, 11, 12, 12, 20, 20, 25,  0,  0,   1, 0) // #129\nPAIRING(10, 20, 20, 25, 11, 12, 12, 26,   2, 1, 11, 12, 12, 20, 20, 25,  0,  0,   1, 1) // #130\nPAIRING(10, 20, 20, 25, 11, 12, 13, 14,   2, 0, 11, 12, 13, 14,  0,  0,  0,  0,   2, 0) // #131\nPAIRING(10, 20, 20, 25, 11, 12, 13, 20,   2, 0, 11, 12, 13, 20,  0,  0,  0,  0,   2, 0) // #132\nPAIRING(10, 20, 20, 25, 11, 12, 13, 21,   2, 1, 11, 12, 13, 20, 20, 21,  0,  0,   2, 0) // #133\nPAIRING(10, 20, 20, 25, 11, 12, 13, 25,   2, 1, 11, 12, 13, 20, 20, 25,  0,  0,   1, 0) // #134\nPAIRING(10, 20, 20, 25, 11, 12, 13, 26,   2, 1, 11, 12, 13, 20, 20, 25,  0,  0,   1, 1) // #135\nPAIRING(10, 20, 20, 25, 11, 12, 20, 21,   1, 1, 11, 12,  0,  0, 20, 21,  0,  0,   2, 0) // #136\nPAIRING(10, 20, 20, 25, 11, 12, 20, 25,   1, 1, 11, 12,  0,  0, 20, 25,  0,  0,   1, 0) // #137\nPAIRING(10, 20, 20, 25, 11, 12, 20, 26,   1, 1, 11, 12,  0,  0, 20, 25,  0,  0,   1, 1) // #138\nPAIRING(10, 20, 20, 25, 11, 12, 21, 22,   1, 1, 11, 12,  0,  0, 21, 22,  0,  0,   2, 0) // #139\nPAIRING(10, 20, 20, 25, 11, 12, 21, 25,   1, 1, 11, 12,  0,  0, 21, 25,  0,  0,   2, 0) // #140\nPAIRING(10, 20, 20, 25, 11, 12, 21, 26,   1, 1, 11, 12,  0,  0, 21, 25,  0,  0,   2, 1) // #141\nPAIRING(10, 20, 20, 25, 11, 12, 25, 26,   1, 0, 11, 12,  0,  0,  0,  0,  0,  0,   2, 1) // #142\nPAIRING(10, 20, 20, 25, 11, 12, 26, 27,   1, 0, 11, 12,  0,  0,  0,  0,  0,  0,   2, 1) // #143\nPAIRING(10, 20, 20, 25, 11, 20, 20, 21,   1, 1, 11, 20,  0,  0, 20, 21,  0,  0,   2, 0) // #144\nPAIRING(10, 20, 20, 25, 11, 20, 20, 25,   1, 1, 11, 20,  0,  0, 20, 25,  0,  0,   1, 0) // #145\nPAIRING(10, 20, 20, 25, 11, 20, 20, 26,   1, 1, 11, 20,  0,  0, 20, 25,  0,  0,   1, 1) // #146\nPAIRING(10, 20, 20, 25, 11, 20, 21, 22,   1, 1, 11, 20,  0,  0, 21, 22,  0,  0,   2, 0) // #147\nPAIRING(10, 20, 20, 25, 11, 20, 21, 25,   1, 1, 11, 20,  0,  0, 21, 25,  0,  0,   2, 0) // #148\nPAIRING(10, 20, 20, 25, 11, 20, 21, 26,   1, 1, 11, 20,  0,  0, 21, 25,  0,  0,   2, 1) // #149\nPAIRING(10, 20, 20, 25, 11, 20, 25, 26,   1, 0, 11, 20,  0,  0,  0,  0,  0,  0,   2, 1) // #150\nPAIRING(10, 20, 20, 25, 11, 20, 26, 27,   1, 0, 11, 20,  0,  0,  0,  0,  0,  0,   2, 1) // #151\nPAIRING(10, 20, 20, 25, 11, 21, 21, 22,   1, 2, 11, 20,  0,  0, 20, 21, 21, 22,   2, 0) // #152\nPAIRING(10, 20, 20, 25, 11, 21, 21, 25,   1, 2, 11, 20,  0,  0, 20, 21, 21, 25,   1, 0) // #153\nPAIRING(10, 20, 20, 25, 11, 21, 21, 26,   1, 2, 11, 20,  0,  0, 20, 21, 21, 25,   1, 1) // #154\nPAIRING(10, 20, 20, 25, 11, 21, 22, 23,   1, 2, 11, 20,  0,  0, 20, 21, 22, 23,   2, 0) // #155\nPAIRING(10, 20, 20, 25, 11, 21, 22, 25,   1, 2, 11, 20,  0,  0, 20, 21, 22, 25,   2, 0) // #156\nPAIRING(10, 20, 20, 25, 11, 21, 22, 26,   1, 2, 11, 20,  0,  0, 20, 21, 22, 25,   2, 1) // #157\nPAIRING(10, 20, 20, 25, 11, 21, 25, 26,   1, 1, 11, 20,  0,  0, 20, 21,  0,  0,   2, 1) // #158\nPAIRING(10, 20, 20, 25, 11, 21, 26, 27,   1, 1, 11, 20,  0,  0, 20, 21,  0,  0,   2, 1) // #159\nPAIRING(10, 20, 20, 25, 11, 25, 25, 26,   1, 1, 11, 20,  0,  0, 20, 25,  0,  0,   1, 1) // #160\nPAIRING(10, 20, 20, 25, 11, 25, 26, 27,   1, 1, 11, 20,  0,  0, 20, 25,  0,  0,   1, 1) // #161\nPAIRING(10, 20, 20, 25, 11, 26, 26, 27,   1, 1, 11, 20,  0,  0, 20, 25,  0,  0,   1, 2) // #162\nPAIRING(10, 20, 20, 25, 11, 26, 27, 28,   1, 1, 11, 20,  0,  0, 20, 25,  0,  0,   1, 2) // #163\nPAIRING(10, 20, 20, 25, 20, 21, 21, 22,   0, 2,  0,  0,  0,  0, 20, 21, 21, 22,   2, 0) // #164\nPAIRING(10, 20, 20, 25, 20, 21, 21, 25,   0, 2,  0,  0,  0,  0, 20, 21, 21, 25,   1, 0) // #165\nPAIRING(10, 20, 20, 25, 20, 21, 21, 26,   0, 2,  0,  0,  0,  0, 20, 21, 21, 25,   1, 1) // #166\nPAIRING(10, 20, 20, 25, 20, 21, 22, 23,   0, 2,  0,  0,  0,  0, 20, 21, 22, 23,   2, 0) // #167\nPAIRING(10, 20, 20, 25, 20, 21, 22, 25,   0, 2,  0,  0,  0,  0, 20, 21, 22, 25,   2, 0) // #168\nPAIRING(10, 20, 20, 25, 20, 21, 22, 26,   0, 2,  0,  0,  0,  0, 20, 21, 22, 25,   2, 1) // #169\nPAIRING(10, 20, 20, 25, 20, 21, 25, 26,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 1) // #170\nPAIRING(10, 20, 20, 25, 20, 21, 26, 27,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 1) // #171\nPAIRING(10, 20, 20, 25, 20, 25, 25, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 1) // #172\nPAIRING(10, 20, 20, 25, 20, 25, 26, 27,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 1) // #173\nPAIRING(10, 20, 20, 25, 20, 26, 26, 27,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #174\nPAIRING(10, 20, 20, 25, 20, 26, 27, 28,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #175\nPAIRING(10, 20, 20, 25, 21, 22, 22, 23,   0, 2,  0,  0,  0,  0, 21, 22, 22, 23,   2, 0) // #176\nPAIRING(10, 20, 20, 25, 21, 22, 22, 25,   0, 2,  0,  0,  0,  0, 21, 22, 22, 25,   2, 0) // #177\nPAIRING(10, 20, 20, 25, 21, 22, 22, 26,   0, 2,  0,  0,  0,  0, 21, 22, 22, 25,   2, 1) // #178\nPAIRING(10, 20, 20, 25, 21, 22, 23, 24,   0, 2,  0,  0,  0,  0, 21, 22, 23, 24,   2, 0) // #179\nPAIRING(10, 20, 20, 25, 21, 22, 23, 25,   0, 2,  0,  0,  0,  0, 21, 22, 23, 25,   2, 0) // #180\nPAIRING(10, 20, 20, 25, 21, 22, 23, 26,   0, 2,  0,  0,  0,  0, 21, 22, 23, 25,   2, 1) // #181\nPAIRING(10, 20, 20, 25, 21, 22, 25, 26,   0, 1,  0,  0,  0,  0, 21, 22,  0,  0,   2, 1) // #182\nPAIRING(10, 20, 20, 25, 21, 22, 26, 27,   0, 1,  0,  0,  0,  0, 21, 22,  0,  0,   2, 1) // #183\nPAIRING(10, 20, 20, 25, 21, 25, 25, 26,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 1) // #184\nPAIRING(10, 20, 20, 25, 21, 25, 26, 27,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 1) // #185\nPAIRING(10, 20, 20, 25, 21, 26, 26, 27,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 2) // #186\nPAIRING(10, 20, 20, 25, 21, 26, 27, 28,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 2) // #187\nPAIRING(10, 20, 20, 25, 25, 26, 26, 27,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #188\nPAIRING(10, 20, 20, 25, 25, 26, 27, 28,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #189\nPAIRING(10, 20, 20, 25, 26, 27, 27, 28,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #190\nPAIRING(10, 20, 20, 25, 26, 27, 28, 29,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #191\nPAIRING(10, 15, 20, 25,  6,  7,  7,  8,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #192\nPAIRING(10, 15, 20, 25,  6,  7,  7, 10,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #193\nPAIRING(10, 15, 20, 25,  6,  7,  7, 11,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 2) // #194\nPAIRING(10, 15, 20, 25,  6,  7,  7, 15,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #195\nPAIRING(10, 15, 20, 25,  6,  7,  7, 16,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #196\nPAIRING(10, 15, 20, 25,  6,  7,  7, 20,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #197\nPAIRING(10, 15, 20, 25,  6,  7,  7, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #198\nPAIRING(10, 15, 20, 25,  6,  7,  7, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #199\nPAIRING(10, 15, 20, 25,  6,  7,  7, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #200\nPAIRING(10, 15, 20, 25,  6,  7,  8,  9,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #201\nPAIRING(10, 15, 20, 25,  6,  7,  8, 10,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #202\nPAIRING(10, 15, 20, 25,  6,  7,  8, 11,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 2) // #203\nPAIRING(10, 15, 20, 25,  6,  7,  8, 15,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #204\nPAIRING(10, 15, 20, 25,  6,  7,  8, 16,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #205\nPAIRING(10, 15, 20, 25,  6,  7,  8, 20,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #206\nPAIRING(10, 15, 20, 25,  6,  7,  8, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #207\nPAIRING(10, 15, 20, 25,  6,  7,  8, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #208\nPAIRING(10, 15, 20, 25,  6,  7,  8, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #209\nPAIRING(10, 15, 20, 25,  6,  7, 10, 11,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 1) // #210\nPAIRING(10, 15, 20, 25,  6,  7, 10, 15,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 1) // #211\nPAIRING(10, 15, 20, 25,  6,  7, 10, 16,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #212\nPAIRING(10, 15, 20, 25,  6,  7, 10, 20,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 1) // #213\nPAIRING(10, 15, 20, 25,  6,  7, 10, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #214\nPAIRING(10, 15, 20, 25,  6,  7, 10, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #215\nPAIRING(10, 15, 20, 25,  6,  7, 10, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #216\nPAIRING(10, 15, 20, 25,  6,  7, 11, 12,   1, 0, 11, 12,  0,  0,  0,  0,  0,  0,   2, 1) // #217\nPAIRING(10, 15, 20, 25,  6,  7, 11, 15,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 1) // #218\nPAIRING(10, 15, 20, 25,  6,  7, 11, 16,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 2) // #219\nPAIRING(10, 15, 20, 25,  6,  7, 11, 20,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 1) // #220\nPAIRING(10, 15, 20, 25,  6,  7, 11, 21,   1, 1, 11, 15,  0,  0, 20, 21,  0,  0,   2, 2) // #221\nPAIRING(10, 15, 20, 25,  6,  7, 11, 25,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 2) // #222\nPAIRING(10, 15, 20, 25,  6,  7, 11, 26,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 2) // #223\nPAIRING(10, 15, 20, 25,  6,  7, 15, 16,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #224\nPAIRING(10, 15, 20, 25,  6,  7, 15, 20,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #225\nPAIRING(10, 15, 20, 25,  6,  7, 15, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 2) // #226\nPAIRING(10, 15, 20, 25,  6,  7, 15, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #227\nPAIRING(10, 15, 20, 25,  6,  7, 15, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #228\nPAIRING(10, 15, 20, 25,  6,  7, 16, 17,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #229\nPAIRING(10, 15, 20, 25,  6,  7, 16, 20,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #230\nPAIRING(10, 15, 20, 25,  6,  7, 16, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 2) // #231\nPAIRING(10, 15, 20, 25,  6,  7, 16, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #232\nPAIRING(10, 15, 20, 25,  6,  7, 16, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #233\nPAIRING(10, 15, 20, 25,  6,  7, 20, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 1) // #234\nPAIRING(10, 15, 20, 25,  6,  7, 20, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 1) // #235\nPAIRING(10, 15, 20, 25,  6,  7, 20, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #236\nPAIRING(10, 15, 20, 25,  6,  7, 21, 22,   0, 1,  0,  0,  0,  0, 21, 22,  0,  0,   2, 1) // #237\nPAIRING(10, 15, 20, 25,  6,  7, 21, 25,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 1) // #238\nPAIRING(10, 15, 20, 25,  6,  7, 21, 26,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 2) // #239\nPAIRING(10, 15, 20, 25,  6,  7, 25, 26,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #240\nPAIRING(10, 15, 20, 25,  6,  7, 26, 27,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #241\nPAIRING(10, 15, 20, 25,  6, 10, 10, 11,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 1) // #242\nPAIRING(10, 15, 20, 25,  6, 10, 10, 15,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 1) // #243\nPAIRING(10, 15, 20, 25,  6, 10, 10, 16,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #244\nPAIRING(10, 15, 20, 25,  6, 10, 10, 20,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 1) // #245\nPAIRING(10, 15, 20, 25,  6, 10, 10, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #246\nPAIRING(10, 15, 20, 25,  6, 10, 10, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #247\nPAIRING(10, 15, 20, 25,  6, 10, 10, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #248\nPAIRING(10, 15, 20, 25,  6, 10, 11, 12,   1, 0, 11, 12,  0,  0,  0,  0,  0,  0,   2, 1) // #249\nPAIRING(10, 15, 20, 25,  6, 10, 11, 15,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 1) // #250\nPAIRING(10, 15, 20, 25,  6, 10, 11, 16,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 2) // #251\nPAIRING(10, 15, 20, 25,  6, 10, 11, 20,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 1) // #252\nPAIRING(10, 15, 20, 25,  6, 10, 11, 21,   1, 1, 11, 15,  0,  0, 20, 21,  0,  0,   2, 2) // #253\nPAIRING(10, 15, 20, 25,  6, 10, 11, 25,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 2) // #254\nPAIRING(10, 15, 20, 25,  6, 10, 11, 26,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 2) // #255\nPAIRING(10, 15, 20, 25,  6, 10, 15, 16,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #256\nPAIRING(10, 15, 20, 25,  6, 10, 15, 20,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #257\nPAIRING(10, 15, 20, 25,  6, 10, 15, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 2) // #258\nPAIRING(10, 15, 20, 25,  6, 10, 15, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #259\nPAIRING(10, 15, 20, 25,  6, 10, 15, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #260\nPAIRING(10, 15, 20, 25,  6, 10, 16, 17,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #261\nPAIRING(10, 15, 20, 25,  6, 10, 16, 20,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #262\nPAIRING(10, 15, 20, 25,  6, 10, 16, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 2) // #263\nPAIRING(10, 15, 20, 25,  6, 10, 16, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #264\nPAIRING(10, 15, 20, 25,  6, 10, 16, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #265\nPAIRING(10, 15, 20, 25,  6, 10, 20, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 1) // #266\nPAIRING(10, 15, 20, 25,  6, 10, 20, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 1) // #267\nPAIRING(10, 15, 20, 25,  6, 10, 20, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #268\nPAIRING(10, 15, 20, 25,  6, 10, 21, 22,   0, 1,  0,  0,  0,  0, 21, 22,  0,  0,   2, 1) // #269\nPAIRING(10, 15, 20, 25,  6, 10, 21, 25,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 1) // #270\nPAIRING(10, 15, 20, 25,  6, 10, 21, 26,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 2) // #271\nPAIRING(10, 15, 20, 25,  6, 10, 25, 26,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #272\nPAIRING(10, 15, 20, 25,  6, 10, 26, 27,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #273\nPAIRING(10, 15, 20, 25,  6, 11, 11, 12,   2, 0, 10, 11, 11, 12,  0,  0,  0,  0,   2, 1) // #274\nPAIRING(10, 15, 20, 25,  6, 11, 11, 15,   2, 0, 10, 11, 11, 15,  0,  0,  0,  0,   1, 1) // #275\nPAIRING(10, 15, 20, 25,  6, 11, 11, 16,   2, 0, 10, 11, 11, 15,  0,  0,  0,  0,   1, 2) // #276\nPAIRING(10, 15, 20, 25,  6, 11, 11, 20,   2, 0, 10, 11, 11, 15,  0,  0,  0,  0,   1, 1) // #277\nPAIRING(10, 15, 20, 25,  6, 11, 11, 21,   2, 1, 10, 11, 11, 15, 20, 21,  0,  0,   1, 2) // #278\nPAIRING(10, 15, 20, 25,  6, 11, 11, 25,   2, 1, 10, 11, 11, 15, 20, 25,  0,  0,   0, 2) // #279\nPAIRING(10, 15, 20, 25,  6, 11, 11, 26,   2, 1, 10, 11, 11, 15, 20, 25,  0,  0,   0, 2) // #280\nPAIRING(10, 15, 20, 25,  6, 11, 12, 13,   2, 0, 10, 11, 12, 13,  0,  0,  0,  0,   2, 1) // #281\nPAIRING(10, 15, 20, 25,  6, 11, 12, 15,   2, 0, 10, 11, 12, 15,  0,  0,  0,  0,   2, 1) // #282\nPAIRING(10, 15, 20, 25,  6, 11, 12, 16,   2, 0, 10, 11, 12, 15,  0,  0,  0,  0,   2, 2) // #283\nPAIRING(10, 15, 20, 25,  6, 11, 12, 20,   2, 0, 10, 11, 12, 15,  0,  0,  0,  0,   2, 1) // #284\nPAIRING(10, 15, 20, 25,  6, 11, 12, 21,   2, 1, 10, 11, 12, 15, 20, 21,  0,  0,   2, 2) // #285\nPAIRING(10, 15, 20, 25,  6, 11, 12, 25,   2, 1, 10, 11, 12, 15, 20, 25,  0,  0,   1, 2) // #286\nPAIRING(10, 15, 20, 25,  6, 11, 12, 26,   2, 1, 10, 11, 12, 15, 20, 25,  0,  0,   1, 2) // #287\nPAIRING(10, 15, 20, 25,  6, 11, 15, 16,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 2) // #288\nPAIRING(10, 15, 20, 25,  6, 11, 15, 20,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 2) // #289\nPAIRING(10, 15, 20, 25,  6, 11, 15, 21,   1, 1, 10, 11,  0,  0, 20, 21,  0,  0,   2, 2) // #290\nPAIRING(10, 15, 20, 25,  6, 11, 15, 25,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 2) // #291\nPAIRING(10, 15, 20, 25,  6, 11, 15, 26,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 2) // #292\nPAIRING(10, 15, 20, 25,  6, 11, 16, 17,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 2) // #293\nPAIRING(10, 15, 20, 25,  6, 11, 16, 20,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 2) // #294\nPAIRING(10, 15, 20, 25,  6, 11, 16, 21,   1, 1, 10, 11,  0,  0, 20, 21,  0,  0,   2, 2) // #295\nPAIRING(10, 15, 20, 25,  6, 11, 16, 25,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 2) // #296\nPAIRING(10, 15, 20, 25,  6, 11, 16, 26,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 2) // #297\nPAIRING(10, 15, 20, 25,  6, 11, 20, 21,   1, 1, 10, 11,  0,  0, 20, 21,  0,  0,   2, 1) // #298\nPAIRING(10, 15, 20, 25,  6, 11, 20, 25,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 1) // #299\nPAIRING(10, 15, 20, 25,  6, 11, 20, 26,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 2) // #300\nPAIRING(10, 15, 20, 25,  6, 11, 21, 22,   1, 1, 10, 11,  0,  0, 21, 22,  0,  0,   2, 1) // #301\nPAIRING(10, 15, 20, 25,  6, 11, 21, 25,   1, 1, 10, 11,  0,  0, 21, 25,  0,  0,   2, 1) // #302\nPAIRING(10, 15, 20, 25,  6, 11, 21, 26,   1, 1, 10, 11,  0,  0, 21, 25,  0,  0,   2, 2) // #303\nPAIRING(10, 15, 20, 25,  6, 11, 25, 26,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 2) // #304\nPAIRING(10, 15, 20, 25,  6, 11, 26, 27,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 2) // #305\nPAIRING(10, 15, 20, 25,  6, 15, 15, 16,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #306\nPAIRING(10, 15, 20, 25,  6, 15, 15, 20,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #307\nPAIRING(10, 15, 20, 25,  6, 15, 15, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #308\nPAIRING(10, 15, 20, 25,  6, 15, 15, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #309\nPAIRING(10, 15, 20, 25,  6, 15, 15, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #310\nPAIRING(10, 15, 20, 25,  6, 15, 16, 17,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #311\nPAIRING(10, 15, 20, 25,  6, 15, 16, 20,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #312\nPAIRING(10, 15, 20, 25,  6, 15, 16, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #313\nPAIRING(10, 15, 20, 25,  6, 15, 16, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #314\nPAIRING(10, 15, 20, 25,  6, 15, 16, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #315\nPAIRING(10, 15, 20, 25,  6, 15, 20, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 1) // #316\nPAIRING(10, 15, 20, 25,  6, 15, 20, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 1) // #317\nPAIRING(10, 15, 20, 25,  6, 15, 20, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #318\nPAIRING(10, 15, 20, 25,  6, 15, 21, 22,   1, 1, 10, 15,  0,  0, 21, 22,  0,  0,   1, 1) // #319\nPAIRING(10, 15, 20, 25,  6, 15, 21, 25,   1, 1, 10, 15,  0,  0, 21, 25,  0,  0,   1, 1) // #320\nPAIRING(10, 15, 20, 25,  6, 15, 21, 26,   1, 1, 10, 15,  0,  0, 21, 25,  0,  0,   1, 2) // #321\nPAIRING(10, 15, 20, 25,  6, 15, 25, 26,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #322\nPAIRING(10, 15, 20, 25,  6, 15, 26, 27,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #323\nPAIRING(10, 15, 20, 25,  6, 16, 16, 17,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #324\nPAIRING(10, 15, 20, 25,  6, 16, 16, 20,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #325\nPAIRING(10, 15, 20, 25,  6, 16, 16, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #326\nPAIRING(10, 15, 20, 25,  6, 16, 16, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #327\nPAIRING(10, 15, 20, 25,  6, 16, 16, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #328\nPAIRING(10, 15, 20, 25,  6, 16, 17, 18,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #329\nPAIRING(10, 15, 20, 25,  6, 16, 17, 20,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #330\nPAIRING(10, 15, 20, 25,  6, 16, 17, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #331\nPAIRING(10, 15, 20, 25,  6, 16, 17, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #332\nPAIRING(10, 15, 20, 25,  6, 16, 17, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #333\nPAIRING(10, 15, 20, 25,  6, 16, 20, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 1) // #334\nPAIRING(10, 15, 20, 25,  6, 16, 20, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 1) // #335\nPAIRING(10, 15, 20, 25,  6, 16, 20, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #336\nPAIRING(10, 15, 20, 25,  6, 16, 21, 22,   1, 1, 10, 15,  0,  0, 21, 22,  0,  0,   1, 1) // #337\nPAIRING(10, 15, 20, 25,  6, 16, 21, 25,   1, 1, 10, 15,  0,  0, 21, 25,  0,  0,   1, 1) // #338\nPAIRING(10, 15, 20, 25,  6, 16, 21, 26,   1, 1, 10, 15,  0,  0, 21, 25,  0,  0,   1, 2) // #339\nPAIRING(10, 15, 20, 25,  6, 16, 25, 26,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #340\nPAIRING(10, 15, 20, 25,  6, 16, 26, 27,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #341\nPAIRING(10, 15, 20, 25,  6, 20, 20, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 1) // #342\nPAIRING(10, 15, 20, 25,  6, 20, 20, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 1) // #343\nPAIRING(10, 15, 20, 25,  6, 20, 20, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #344\nPAIRING(10, 15, 20, 25,  6, 20, 21, 22,   1, 1, 10, 15,  0,  0, 21, 22,  0,  0,   1, 1) // #345\nPAIRING(10, 15, 20, 25,  6, 20, 21, 25,   1, 1, 10, 15,  0,  0, 21, 25,  0,  0,   1, 1) // #346\nPAIRING(10, 15, 20, 25,  6, 20, 21, 26,   1, 1, 10, 15,  0,  0, 21, 25,  0,  0,   1, 2) // #347\nPAIRING(10, 15, 20, 25,  6, 20, 25, 26,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #348\nPAIRING(10, 15, 20, 25,  6, 20, 26, 27,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #349\nPAIRING(10, 15, 20, 25,  6, 21, 21, 22,   1, 2, 10, 15,  0,  0, 20, 21, 21, 22,   1, 1) // #350\nPAIRING(10, 15, 20, 25,  6, 21, 21, 25,   1, 2, 10, 15,  0,  0, 20, 21, 21, 25,   0, 1) // #351\nPAIRING(10, 15, 20, 25,  6, 21, 21, 26,   1, 2, 10, 15,  0,  0, 20, 21, 21, 25,   0, 2) // #352\nPAIRING(10, 15, 20, 25,  6, 21, 22, 23,   1, 2, 10, 15,  0,  0, 20, 21, 22, 23,   1, 1) // #353\nPAIRING(10, 15, 20, 25,  6, 21, 22, 25,   1, 2, 10, 15,  0,  0, 20, 21, 22, 25,   1, 1) // #354\nPAIRING(10, 15, 20, 25,  6, 21, 22, 26,   1, 2, 10, 15,  0,  0, 20, 21, 22, 25,   1, 2) // #355\nPAIRING(10, 15, 20, 25,  6, 21, 25, 26,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #356\nPAIRING(10, 15, 20, 25,  6, 21, 26, 27,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #357\nPAIRING(10, 15, 20, 25,  6, 25, 25, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #358\nPAIRING(10, 15, 20, 25,  6, 25, 26, 27,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #359\nPAIRING(10, 15, 20, 25,  6, 26, 26, 27,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #360\nPAIRING(10, 15, 20, 25,  6, 26, 27, 28,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #361\nPAIRING(10, 15, 20, 25, 10, 11, 11, 12,   2, 0, 10, 11, 11, 12,  0,  0,  0,  0,   2, 0) // #362\nPAIRING(10, 15, 20, 25, 10, 11, 11, 15,   2, 0, 10, 11, 11, 15,  0,  0,  0,  0,   1, 0) // #363\nPAIRING(10, 15, 20, 25, 10, 11, 11, 16,   2, 0, 10, 11, 11, 15,  0,  0,  0,  0,   1, 1) // #364\nPAIRING(10, 15, 20, 25, 10, 11, 11, 20,   2, 0, 10, 11, 11, 15,  0,  0,  0,  0,   1, 0) // #365\nPAIRING(10, 15, 20, 25, 10, 11, 11, 21,   2, 1, 10, 11, 11, 15, 20, 21,  0,  0,   1, 1) // #366\nPAIRING(10, 15, 20, 25, 10, 11, 11, 25,   2, 1, 10, 11, 11, 15, 20, 25,  0,  0,   0, 1) // #367\nPAIRING(10, 15, 20, 25, 10, 11, 11, 26,   2, 1, 10, 11, 11, 15, 20, 25,  0,  0,   0, 1) // #368\nPAIRING(10, 15, 20, 25, 10, 11, 12, 13,   2, 0, 10, 11, 12, 13,  0,  0,  0,  0,   2, 0) // #369\nPAIRING(10, 15, 20, 25, 10, 11, 12, 15,   2, 0, 10, 11, 12, 15,  0,  0,  0,  0,   2, 0) // #370\nPAIRING(10, 15, 20, 25, 10, 11, 12, 16,   2, 0, 10, 11, 12, 15,  0,  0,  0,  0,   2, 1) // #371\nPAIRING(10, 15, 20, 25, 10, 11, 12, 20,   2, 0, 10, 11, 12, 15,  0,  0,  0,  0,   2, 0) // #372\nPAIRING(10, 15, 20, 25, 10, 11, 12, 21,   2, 1, 10, 11, 12, 15, 20, 21,  0,  0,   2, 1) // #373\nPAIRING(10, 15, 20, 25, 10, 11, 12, 25,   2, 1, 10, 11, 12, 15, 20, 25,  0,  0,   1, 1) // #374\nPAIRING(10, 15, 20, 25, 10, 11, 12, 26,   2, 1, 10, 11, 12, 15, 20, 25,  0,  0,   1, 1) // #375\nPAIRING(10, 15, 20, 25, 10, 11, 15, 16,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 1) // #376\nPAIRING(10, 15, 20, 25, 10, 11, 15, 20,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 1) // #377\nPAIRING(10, 15, 20, 25, 10, 11, 15, 21,   1, 1, 10, 11,  0,  0, 20, 21,  0,  0,   2, 1) // #378\nPAIRING(10, 15, 20, 25, 10, 11, 15, 25,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 1) // #379\nPAIRING(10, 15, 20, 25, 10, 11, 15, 26,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 1) // #380\nPAIRING(10, 15, 20, 25, 10, 11, 16, 17,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 1) // #381\nPAIRING(10, 15, 20, 25, 10, 11, 16, 20,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 1) // #382\nPAIRING(10, 15, 20, 25, 10, 11, 16, 21,   1, 1, 10, 11,  0,  0, 20, 21,  0,  0,   2, 1) // #383\nPAIRING(10, 15, 20, 25, 10, 11, 16, 25,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 1) // #384\nPAIRING(10, 15, 20, 25, 10, 11, 16, 26,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 1) // #385\nPAIRING(10, 15, 20, 25, 10, 11, 20, 21,   1, 1, 10, 11,  0,  0, 20, 21,  0,  0,   2, 0) // #386\nPAIRING(10, 15, 20, 25, 10, 11, 20, 25,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 0) // #387\nPAIRING(10, 15, 20, 25, 10, 11, 20, 26,   1, 1, 10, 11,  0,  0, 20, 25,  0,  0,   1, 1) // #388\nPAIRING(10, 15, 20, 25, 10, 11, 21, 22,   1, 1, 10, 11,  0,  0, 21, 22,  0,  0,   2, 0) // #389\nPAIRING(10, 15, 20, 25, 10, 11, 21, 25,   1, 1, 10, 11,  0,  0, 21, 25,  0,  0,   2, 0) // #390\nPAIRING(10, 15, 20, 25, 10, 11, 21, 26,   1, 1, 10, 11,  0,  0, 21, 25,  0,  0,   2, 1) // #391\nPAIRING(10, 15, 20, 25, 10, 11, 25, 26,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 1) // #392\nPAIRING(10, 15, 20, 25, 10, 11, 26, 27,   1, 0, 10, 11,  0,  0,  0,  0,  0,  0,   2, 1) // #393\nPAIRING(10, 15, 20, 25, 10, 15, 15, 16,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 1) // #394\nPAIRING(10, 15, 20, 25, 10, 15, 15, 20,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 1) // #395\nPAIRING(10, 15, 20, 25, 10, 15, 15, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 1) // #396\nPAIRING(10, 15, 20, 25, 10, 15, 15, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 1) // #397\nPAIRING(10, 15, 20, 25, 10, 15, 15, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 1) // #398\nPAIRING(10, 15, 20, 25, 10, 15, 16, 17,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 1) // #399\nPAIRING(10, 15, 20, 25, 10, 15, 16, 20,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 1) // #400\nPAIRING(10, 15, 20, 25, 10, 15, 16, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 1) // #401\nPAIRING(10, 15, 20, 25, 10, 15, 16, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 1) // #402\nPAIRING(10, 15, 20, 25, 10, 15, 16, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 1) // #403\nPAIRING(10, 15, 20, 25, 10, 15, 20, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 0) // #404\nPAIRING(10, 15, 20, 25, 10, 15, 20, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 0) // #405\nPAIRING(10, 15, 20, 25, 10, 15, 20, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 1) // #406\nPAIRING(10, 15, 20, 25, 10, 15, 21, 22,   1, 1, 10, 15,  0,  0, 21, 22,  0,  0,   1, 0) // #407\nPAIRING(10, 15, 20, 25, 10, 15, 21, 25,   1, 1, 10, 15,  0,  0, 21, 25,  0,  0,   1, 0) // #408\nPAIRING(10, 15, 20, 25, 10, 15, 21, 26,   1, 1, 10, 15,  0,  0, 21, 25,  0,  0,   1, 1) // #409\nPAIRING(10, 15, 20, 25, 10, 15, 25, 26,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 1) // #410\nPAIRING(10, 15, 20, 25, 10, 15, 26, 27,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 1) // #411\nPAIRING(10, 15, 20, 25, 10, 16, 16, 17,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #412\nPAIRING(10, 15, 20, 25, 10, 16, 16, 20,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #413\nPAIRING(10, 15, 20, 25, 10, 16, 16, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #414\nPAIRING(10, 15, 20, 25, 10, 16, 16, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #415\nPAIRING(10, 15, 20, 25, 10, 16, 16, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #416\nPAIRING(10, 15, 20, 25, 10, 16, 17, 18,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #417\nPAIRING(10, 15, 20, 25, 10, 16, 17, 20,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #418\nPAIRING(10, 15, 20, 25, 10, 16, 17, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #419\nPAIRING(10, 15, 20, 25, 10, 16, 17, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #420\nPAIRING(10, 15, 20, 25, 10, 16, 17, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #421\nPAIRING(10, 15, 20, 25, 10, 16, 20, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 1) // #422\nPAIRING(10, 15, 20, 25, 10, 16, 20, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 1) // #423\nPAIRING(10, 15, 20, 25, 10, 16, 20, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #424\nPAIRING(10, 15, 20, 25, 10, 16, 21, 22,   1, 1, 10, 15,  0,  0, 21, 22,  0,  0,   1, 1) // #425\nPAIRING(10, 15, 20, 25, 10, 16, 21, 25,   1, 1, 10, 15,  0,  0, 21, 25,  0,  0,   1, 1) // #426\nPAIRING(10, 15, 20, 25, 10, 16, 21, 26,   1, 1, 10, 15,  0,  0, 21, 25,  0,  0,   1, 2) // #427\nPAIRING(10, 15, 20, 25, 10, 16, 25, 26,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #428\nPAIRING(10, 15, 20, 25, 10, 16, 26, 27,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 2) // #429\nPAIRING(10, 15, 20, 25, 10, 20, 20, 21,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 0) // #430\nPAIRING(10, 15, 20, 25, 10, 20, 20, 25,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 0) // #431\nPAIRING(10, 15, 20, 25, 10, 20, 20, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 1) // #432\nPAIRING(10, 15, 20, 25, 10, 20, 21, 22,   1, 1, 10, 15,  0,  0, 21, 22,  0,  0,   1, 0) // #433\nPAIRING(10, 15, 20, 25, 10, 20, 21, 25,   1, 1, 10, 15,  0,  0, 21, 25,  0,  0,   1, 0) // #434\nPAIRING(10, 15, 20, 25, 10, 20, 21, 26,   1, 1, 10, 15,  0,  0, 21, 25,  0,  0,   1, 1) // #435\nPAIRING(10, 15, 20, 25, 10, 20, 25, 26,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 1) // #436\nPAIRING(10, 15, 20, 25, 10, 20, 26, 27,   1, 0, 10, 15,  0,  0,  0,  0,  0,  0,   1, 1) // #437\nPAIRING(10, 15, 20, 25, 10, 21, 21, 22,   1, 2, 10, 15,  0,  0, 20, 21, 21, 22,   1, 1) // #438\nPAIRING(10, 15, 20, 25, 10, 21, 21, 25,   1, 2, 10, 15,  0,  0, 20, 21, 21, 25,   0, 1) // #439\nPAIRING(10, 15, 20, 25, 10, 21, 21, 26,   1, 2, 10, 15,  0,  0, 20, 21, 21, 25,   0, 2) // #440\nPAIRING(10, 15, 20, 25, 10, 21, 22, 23,   1, 2, 10, 15,  0,  0, 20, 21, 22, 23,   1, 1) // #441\nPAIRING(10, 15, 20, 25, 10, 21, 22, 25,   1, 2, 10, 15,  0,  0, 20, 21, 22, 25,   1, 1) // #442\nPAIRING(10, 15, 20, 25, 10, 21, 22, 26,   1, 2, 10, 15,  0,  0, 20, 21, 22, 25,   1, 2) // #443\nPAIRING(10, 15, 20, 25, 10, 21, 25, 26,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #444\nPAIRING(10, 15, 20, 25, 10, 21, 26, 27,   1, 1, 10, 15,  0,  0, 20, 21,  0,  0,   1, 2) // #445\nPAIRING(10, 15, 20, 25, 10, 25, 25, 26,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #446\nPAIRING(10, 15, 20, 25, 10, 25, 26, 27,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #447\nPAIRING(10, 15, 20, 25, 10, 26, 26, 27,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #448\nPAIRING(10, 15, 20, 25, 10, 26, 27, 28,   1, 1, 10, 15,  0,  0, 20, 25,  0,  0,   0, 2) // #449\nPAIRING(10, 15, 20, 25, 11, 12, 12, 13,   2, 0, 11, 12, 12, 13,  0,  0,  0,  0,   2, 0) // #450\nPAIRING(10, 15, 20, 25, 11, 12, 12, 15,   2, 0, 11, 12, 12, 15,  0,  0,  0,  0,   2, 0) // #451\nPAIRING(10, 15, 20, 25, 11, 12, 12, 16,   2, 0, 11, 12, 12, 15,  0,  0,  0,  0,   2, 1) // #452\nPAIRING(10, 15, 20, 25, 11, 12, 12, 20,   2, 0, 11, 12, 12, 15,  0,  0,  0,  0,   2, 0) // #453\nPAIRING(10, 15, 20, 25, 11, 12, 12, 21,   2, 1, 11, 12, 12, 15, 20, 21,  0,  0,   2, 1) // #454\nPAIRING(10, 15, 20, 25, 11, 12, 12, 25,   2, 1, 11, 12, 12, 15, 20, 25,  0,  0,   1, 1) // #455\nPAIRING(10, 15, 20, 25, 11, 12, 12, 26,   2, 1, 11, 12, 12, 15, 20, 25,  0,  0,   1, 1) // #456\nPAIRING(10, 15, 20, 25, 11, 12, 13, 14,   2, 0, 11, 12, 13, 14,  0,  0,  0,  0,   2, 0) // #457\nPAIRING(10, 15, 20, 25, 11, 12, 13, 15,   2, 0, 11, 12, 13, 15,  0,  0,  0,  0,   2, 0) // #458\nPAIRING(10, 15, 20, 25, 11, 12, 13, 16,   2, 0, 11, 12, 13, 15,  0,  0,  0,  0,   2, 1) // #459\nPAIRING(10, 15, 20, 25, 11, 12, 13, 20,   2, 0, 11, 12, 13, 15,  0,  0,  0,  0,   2, 0) // #460\nPAIRING(10, 15, 20, 25, 11, 12, 13, 21,   2, 1, 11, 12, 13, 15, 20, 21,  0,  0,   2, 1) // #461\nPAIRING(10, 15, 20, 25, 11, 12, 13, 25,   2, 1, 11, 12, 13, 15, 20, 25,  0,  0,   1, 1) // #462\nPAIRING(10, 15, 20, 25, 11, 12, 13, 26,   2, 1, 11, 12, 13, 15, 20, 25,  0,  0,   1, 1) // #463\nPAIRING(10, 15, 20, 25, 11, 12, 15, 16,   1, 0, 11, 12,  0,  0,  0,  0,  0,  0,   2, 1) // #464\nPAIRING(10, 15, 20, 25, 11, 12, 15, 20,   1, 0, 11, 12,  0,  0,  0,  0,  0,  0,   2, 1) // #465\nPAIRING(10, 15, 20, 25, 11, 12, 15, 21,   1, 1, 11, 12,  0,  0, 20, 21,  0,  0,   2, 1) // #466\nPAIRING(10, 15, 20, 25, 11, 12, 15, 25,   1, 1, 11, 12,  0,  0, 20, 25,  0,  0,   1, 1) // #467\nPAIRING(10, 15, 20, 25, 11, 12, 15, 26,   1, 1, 11, 12,  0,  0, 20, 25,  0,  0,   1, 1) // #468\nPAIRING(10, 15, 20, 25, 11, 12, 16, 17,   1, 0, 11, 12,  0,  0,  0,  0,  0,  0,   2, 1) // #469\nPAIRING(10, 15, 20, 25, 11, 12, 16, 20,   1, 0, 11, 12,  0,  0,  0,  0,  0,  0,   2, 1) // #470\nPAIRING(10, 15, 20, 25, 11, 12, 16, 21,   1, 1, 11, 12,  0,  0, 20, 21,  0,  0,   2, 1) // #471\nPAIRING(10, 15, 20, 25, 11, 12, 16, 25,   1, 1, 11, 12,  0,  0, 20, 25,  0,  0,   1, 1) // #472\nPAIRING(10, 15, 20, 25, 11, 12, 16, 26,   1, 1, 11, 12,  0,  0, 20, 25,  0,  0,   1, 1) // #473\nPAIRING(10, 15, 20, 25, 11, 12, 20, 21,   1, 1, 11, 12,  0,  0, 20, 21,  0,  0,   2, 0) // #474\nPAIRING(10, 15, 20, 25, 11, 12, 20, 25,   1, 1, 11, 12,  0,  0, 20, 25,  0,  0,   1, 0) // #475\nPAIRING(10, 15, 20, 25, 11, 12, 20, 26,   1, 1, 11, 12,  0,  0, 20, 25,  0,  0,   1, 1) // #476\nPAIRING(10, 15, 20, 25, 11, 12, 21, 22,   1, 1, 11, 12,  0,  0, 21, 22,  0,  0,   2, 0) // #477\nPAIRING(10, 15, 20, 25, 11, 12, 21, 25,   1, 1, 11, 12,  0,  0, 21, 25,  0,  0,   2, 0) // #478\nPAIRING(10, 15, 20, 25, 11, 12, 21, 26,   1, 1, 11, 12,  0,  0, 21, 25,  0,  0,   2, 1) // #479\nPAIRING(10, 15, 20, 25, 11, 12, 25, 26,   1, 0, 11, 12,  0,  0,  0,  0,  0,  0,   2, 1) // #480\nPAIRING(10, 15, 20, 25, 11, 12, 26, 27,   1, 0, 11, 12,  0,  0,  0,  0,  0,  0,   2, 1) // #481\nPAIRING(10, 15, 20, 25, 11, 15, 15, 16,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 1) // #482\nPAIRING(10, 15, 20, 25, 11, 15, 15, 20,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 1) // #483\nPAIRING(10, 15, 20, 25, 11, 15, 15, 21,   1, 1, 11, 15,  0,  0, 20, 21,  0,  0,   2, 1) // #484\nPAIRING(10, 15, 20, 25, 11, 15, 15, 25,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 1) // #485\nPAIRING(10, 15, 20, 25, 11, 15, 15, 26,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 1) // #486\nPAIRING(10, 15, 20, 25, 11, 15, 16, 17,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 1) // #487\nPAIRING(10, 15, 20, 25, 11, 15, 16, 20,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 1) // #488\nPAIRING(10, 15, 20, 25, 11, 15, 16, 21,   1, 1, 11, 15,  0,  0, 20, 21,  0,  0,   2, 1) // #489\nPAIRING(10, 15, 20, 25, 11, 15, 16, 25,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 1) // #490\nPAIRING(10, 15, 20, 25, 11, 15, 16, 26,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 1) // #491\nPAIRING(10, 15, 20, 25, 11, 15, 20, 21,   1, 1, 11, 15,  0,  0, 20, 21,  0,  0,   2, 0) // #492\nPAIRING(10, 15, 20, 25, 11, 15, 20, 25,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 0) // #493\nPAIRING(10, 15, 20, 25, 11, 15, 20, 26,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 1) // #494\nPAIRING(10, 15, 20, 25, 11, 15, 21, 22,   1, 1, 11, 15,  0,  0, 21, 22,  0,  0,   2, 0) // #495\nPAIRING(10, 15, 20, 25, 11, 15, 21, 25,   1, 1, 11, 15,  0,  0, 21, 25,  0,  0,   2, 0) // #496\nPAIRING(10, 15, 20, 25, 11, 15, 21, 26,   1, 1, 11, 15,  0,  0, 21, 25,  0,  0,   2, 1) // #497\nPAIRING(10, 15, 20, 25, 11, 15, 25, 26,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 1) // #498\nPAIRING(10, 15, 20, 25, 11, 15, 26, 27,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 1) // #499\nPAIRING(10, 15, 20, 25, 11, 16, 16, 17,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 2) // #500\nPAIRING(10, 15, 20, 25, 11, 16, 16, 20,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 2) // #501\nPAIRING(10, 15, 20, 25, 11, 16, 16, 21,   1, 1, 11, 15,  0,  0, 20, 21,  0,  0,   2, 2) // #502\nPAIRING(10, 15, 20, 25, 11, 16, 16, 25,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 2) // #503\nPAIRING(10, 15, 20, 25, 11, 16, 16, 26,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 2) // #504\nPAIRING(10, 15, 20, 25, 11, 16, 17, 18,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 2) // #505\nPAIRING(10, 15, 20, 25, 11, 16, 17, 20,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 2) // #506\nPAIRING(10, 15, 20, 25, 11, 16, 17, 21,   1, 1, 11, 15,  0,  0, 20, 21,  0,  0,   2, 2) // #507\nPAIRING(10, 15, 20, 25, 11, 16, 17, 25,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 2) // #508\nPAIRING(10, 15, 20, 25, 11, 16, 17, 26,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 2) // #509\nPAIRING(10, 15, 20, 25, 11, 16, 20, 21,   1, 1, 11, 15,  0,  0, 20, 21,  0,  0,   2, 1) // #510\nPAIRING(10, 15, 20, 25, 11, 16, 20, 25,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 1) // #511\nPAIRING(10, 15, 20, 25, 11, 16, 20, 26,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 2) // #512\nPAIRING(10, 15, 20, 25, 11, 16, 21, 22,   1, 1, 11, 15,  0,  0, 21, 22,  0,  0,   2, 1) // #513\nPAIRING(10, 15, 20, 25, 11, 16, 21, 25,   1, 1, 11, 15,  0,  0, 21, 25,  0,  0,   2, 1) // #514\nPAIRING(10, 15, 20, 25, 11, 16, 21, 26,   1, 1, 11, 15,  0,  0, 21, 25,  0,  0,   2, 2) // #515\nPAIRING(10, 15, 20, 25, 11, 16, 25, 26,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 2) // #516\nPAIRING(10, 15, 20, 25, 11, 16, 26, 27,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 2) // #517\nPAIRING(10, 15, 20, 25, 11, 20, 20, 21,   1, 1, 11, 15,  0,  0, 20, 21,  0,  0,   2, 0) // #518\nPAIRING(10, 15, 20, 25, 11, 20, 20, 25,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 0) // #519\nPAIRING(10, 15, 20, 25, 11, 20, 20, 26,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 1) // #520\nPAIRING(10, 15, 20, 25, 11, 20, 21, 22,   1, 1, 11, 15,  0,  0, 21, 22,  0,  0,   2, 0) // #521\nPAIRING(10, 15, 20, 25, 11, 20, 21, 25,   1, 1, 11, 15,  0,  0, 21, 25,  0,  0,   2, 0) // #522\nPAIRING(10, 15, 20, 25, 11, 20, 21, 26,   1, 1, 11, 15,  0,  0, 21, 25,  0,  0,   2, 1) // #523\nPAIRING(10, 15, 20, 25, 11, 20, 25, 26,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 1) // #524\nPAIRING(10, 15, 20, 25, 11, 20, 26, 27,   1, 0, 11, 15,  0,  0,  0,  0,  0,  0,   2, 1) // #525\nPAIRING(10, 15, 20, 25, 11, 21, 21, 22,   1, 2, 11, 15,  0,  0, 20, 21, 21, 22,   2, 1) // #526\nPAIRING(10, 15, 20, 25, 11, 21, 21, 25,   1, 2, 11, 15,  0,  0, 20, 21, 21, 25,   1, 1) // #527\nPAIRING(10, 15, 20, 25, 11, 21, 21, 26,   1, 2, 11, 15,  0,  0, 20, 21, 21, 25,   1, 2) // #528\nPAIRING(10, 15, 20, 25, 11, 21, 22, 23,   1, 2, 11, 15,  0,  0, 20, 21, 22, 23,   2, 1) // #529\nPAIRING(10, 15, 20, 25, 11, 21, 22, 25,   1, 2, 11, 15,  0,  0, 20, 21, 22, 25,   2, 1) // #530\nPAIRING(10, 15, 20, 25, 11, 21, 22, 26,   1, 2, 11, 15,  0,  0, 20, 21, 22, 25,   2, 2) // #531\nPAIRING(10, 15, 20, 25, 11, 21, 25, 26,   1, 1, 11, 15,  0,  0, 20, 21,  0,  0,   2, 2) // #532\nPAIRING(10, 15, 20, 25, 11, 21, 26, 27,   1, 1, 11, 15,  0,  0, 20, 21,  0,  0,   2, 2) // #533\nPAIRING(10, 15, 20, 25, 11, 25, 25, 26,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 2) // #534\nPAIRING(10, 15, 20, 25, 11, 25, 26, 27,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 2) // #535\nPAIRING(10, 15, 20, 25, 11, 26, 26, 27,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 2) // #536\nPAIRING(10, 15, 20, 25, 11, 26, 27, 28,   1, 1, 11, 15,  0,  0, 20, 25,  0,  0,   1, 2) // #537\nPAIRING(10, 15, 20, 25, 15, 16, 16, 17,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #538\nPAIRING(10, 15, 20, 25, 15, 16, 16, 20,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #539\nPAIRING(10, 15, 20, 25, 15, 16, 16, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 2) // #540\nPAIRING(10, 15, 20, 25, 15, 16, 16, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #541\nPAIRING(10, 15, 20, 25, 15, 16, 16, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #542\nPAIRING(10, 15, 20, 25, 15, 16, 17, 18,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #543\nPAIRING(10, 15, 20, 25, 15, 16, 17, 20,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #544\nPAIRING(10, 15, 20, 25, 15, 16, 17, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 2) // #545\nPAIRING(10, 15, 20, 25, 15, 16, 17, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #546\nPAIRING(10, 15, 20, 25, 15, 16, 17, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #547\nPAIRING(10, 15, 20, 25, 15, 16, 20, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 1) // #548\nPAIRING(10, 15, 20, 25, 15, 16, 20, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 1) // #549\nPAIRING(10, 15, 20, 25, 15, 16, 20, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #550\nPAIRING(10, 15, 20, 25, 15, 16, 21, 22,   0, 1,  0,  0,  0,  0, 21, 22,  0,  0,   2, 1) // #551\nPAIRING(10, 15, 20, 25, 15, 16, 21, 25,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 1) // #552\nPAIRING(10, 15, 20, 25, 15, 16, 21, 26,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 2) // #553\nPAIRING(10, 15, 20, 25, 15, 16, 25, 26,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #554\nPAIRING(10, 15, 20, 25, 15, 16, 26, 27,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #555\nPAIRING(10, 15, 20, 25, 15, 20, 20, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 1) // #556\nPAIRING(10, 15, 20, 25, 15, 20, 20, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 1) // #557\nPAIRING(10, 15, 20, 25, 15, 20, 20, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #558\nPAIRING(10, 15, 20, 25, 15, 20, 21, 22,   0, 1,  0,  0,  0,  0, 21, 22,  0,  0,   2, 1) // #559\nPAIRING(10, 15, 20, 25, 15, 20, 21, 25,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 1) // #560\nPAIRING(10, 15, 20, 25, 15, 20, 21, 26,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 2) // #561\nPAIRING(10, 15, 20, 25, 15, 20, 25, 26,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #562\nPAIRING(10, 15, 20, 25, 15, 20, 26, 27,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #563\nPAIRING(10, 15, 20, 25, 15, 21, 21, 22,   0, 2,  0,  0,  0,  0, 20, 21, 21, 22,   2, 1) // #564\nPAIRING(10, 15, 20, 25, 15, 21, 21, 25,   0, 2,  0,  0,  0,  0, 20, 21, 21, 25,   1, 1) // #565\nPAIRING(10, 15, 20, 25, 15, 21, 21, 26,   0, 2,  0,  0,  0,  0, 20, 21, 21, 25,   1, 2) // #566\nPAIRING(10, 15, 20, 25, 15, 21, 22, 23,   0, 2,  0,  0,  0,  0, 20, 21, 22, 23,   2, 1) // #567\nPAIRING(10, 15, 20, 25, 15, 21, 22, 25,   0, 2,  0,  0,  0,  0, 20, 21, 22, 25,   2, 1) // #568\nPAIRING(10, 15, 20, 25, 15, 21, 22, 26,   0, 2,  0,  0,  0,  0, 20, 21, 22, 25,   2, 2) // #569\nPAIRING(10, 15, 20, 25, 15, 21, 25, 26,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 2) // #570\nPAIRING(10, 15, 20, 25, 15, 21, 26, 27,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 2) // #571\nPAIRING(10, 15, 20, 25, 15, 25, 25, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #572\nPAIRING(10, 15, 20, 25, 15, 25, 26, 27,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #573\nPAIRING(10, 15, 20, 25, 15, 26, 26, 27,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #574\nPAIRING(10, 15, 20, 25, 15, 26, 27, 28,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #575\nPAIRING(10, 15, 20, 25, 16, 17, 17, 18,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #576\nPAIRING(10, 15, 20, 25, 16, 17, 17, 20,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #577\nPAIRING(10, 15, 20, 25, 16, 17, 17, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 2) // #578\nPAIRING(10, 15, 20, 25, 16, 17, 17, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #579\nPAIRING(10, 15, 20, 25, 16, 17, 17, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #580\nPAIRING(10, 15, 20, 25, 16, 17, 18, 19,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #581\nPAIRING(10, 15, 20, 25, 16, 17, 18, 20,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #582\nPAIRING(10, 15, 20, 25, 16, 17, 18, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 2) // #583\nPAIRING(10, 15, 20, 25, 16, 17, 18, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #584\nPAIRING(10, 15, 20, 25, 16, 17, 18, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #585\nPAIRING(10, 15, 20, 25, 16, 17, 20, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 1) // #586\nPAIRING(10, 15, 20, 25, 16, 17, 20, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 1) // #587\nPAIRING(10, 15, 20, 25, 16, 17, 20, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #588\nPAIRING(10, 15, 20, 25, 16, 17, 21, 22,   0, 1,  0,  0,  0,  0, 21, 22,  0,  0,   2, 1) // #589\nPAIRING(10, 15, 20, 25, 16, 17, 21, 25,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 1) // #590\nPAIRING(10, 15, 20, 25, 16, 17, 21, 26,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 2) // #591\nPAIRING(10, 15, 20, 25, 16, 17, 25, 26,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #592\nPAIRING(10, 15, 20, 25, 16, 17, 26, 27,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #593\nPAIRING(10, 15, 20, 25, 16, 20, 20, 21,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 1) // #594\nPAIRING(10, 15, 20, 25, 16, 20, 20, 25,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 1) // #595\nPAIRING(10, 15, 20, 25, 16, 20, 20, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #596\nPAIRING(10, 15, 20, 25, 16, 20, 21, 22,   0, 1,  0,  0,  0,  0, 21, 22,  0,  0,   2, 1) // #597\nPAIRING(10, 15, 20, 25, 16, 20, 21, 25,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 1) // #598\nPAIRING(10, 15, 20, 25, 16, 20, 21, 26,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 2) // #599\nPAIRING(10, 15, 20, 25, 16, 20, 25, 26,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #600\nPAIRING(10, 15, 20, 25, 16, 20, 26, 27,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #601\nPAIRING(10, 15, 20, 25, 16, 21, 21, 22,   0, 2,  0,  0,  0,  0, 20, 21, 21, 22,   2, 1) // #602\nPAIRING(10, 15, 20, 25, 16, 21, 21, 25,   0, 2,  0,  0,  0,  0, 20, 21, 21, 25,   1, 1) // #603\nPAIRING(10, 15, 20, 25, 16, 21, 21, 26,   0, 2,  0,  0,  0,  0, 20, 21, 21, 25,   1, 2) // #604\nPAIRING(10, 15, 20, 25, 16, 21, 22, 23,   0, 2,  0,  0,  0,  0, 20, 21, 22, 23,   2, 1) // #605\nPAIRING(10, 15, 20, 25, 16, 21, 22, 25,   0, 2,  0,  0,  0,  0, 20, 21, 22, 25,   2, 1) // #606\nPAIRING(10, 15, 20, 25, 16, 21, 22, 26,   0, 2,  0,  0,  0,  0, 20, 21, 22, 25,   2, 2) // #607\nPAIRING(10, 15, 20, 25, 16, 21, 25, 26,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 2) // #608\nPAIRING(10, 15, 20, 25, 16, 21, 26, 27,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 2) // #609\nPAIRING(10, 15, 20, 25, 16, 25, 25, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #610\nPAIRING(10, 15, 20, 25, 16, 25, 26, 27,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #611\nPAIRING(10, 15, 20, 25, 16, 26, 26, 27,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #612\nPAIRING(10, 15, 20, 25, 16, 26, 27, 28,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #613\nPAIRING(10, 15, 20, 25, 20, 21, 21, 22,   0, 2,  0,  0,  0,  0, 20, 21, 21, 22,   2, 0) // #614\nPAIRING(10, 15, 20, 25, 20, 21, 21, 25,   0, 2,  0,  0,  0,  0, 20, 21, 21, 25,   1, 0) // #615\nPAIRING(10, 15, 20, 25, 20, 21, 21, 26,   0, 2,  0,  0,  0,  0, 20, 21, 21, 25,   1, 1) // #616\nPAIRING(10, 15, 20, 25, 20, 21, 22, 23,   0, 2,  0,  0,  0,  0, 20, 21, 22, 23,   2, 0) // #617\nPAIRING(10, 15, 20, 25, 20, 21, 22, 25,   0, 2,  0,  0,  0,  0, 20, 21, 22, 25,   2, 0) // #618\nPAIRING(10, 15, 20, 25, 20, 21, 22, 26,   0, 2,  0,  0,  0,  0, 20, 21, 22, 25,   2, 1) // #619\nPAIRING(10, 15, 20, 25, 20, 21, 25, 26,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 1) // #620\nPAIRING(10, 15, 20, 25, 20, 21, 26, 27,   0, 1,  0,  0,  0,  0, 20, 21,  0,  0,   2, 1) // #621\nPAIRING(10, 15, 20, 25, 20, 25, 25, 26,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 1) // #622\nPAIRING(10, 15, 20, 25, 20, 25, 26, 27,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 1) // #623\nPAIRING(10, 15, 20, 25, 20, 26, 26, 27,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #624\nPAIRING(10, 15, 20, 25, 20, 26, 27, 28,   0, 1,  0,  0,  0,  0, 20, 25,  0,  0,   1, 2) // #625\nPAIRING(10, 15, 20, 25, 21, 22, 22, 23,   0, 2,  0,  0,  0,  0, 21, 22, 22, 23,   2, 0) // #626\nPAIRING(10, 15, 20, 25, 21, 22, 22, 25,   0, 2,  0,  0,  0,  0, 21, 22, 22, 25,   2, 0) // #627\nPAIRING(10, 15, 20, 25, 21, 22, 22, 26,   0, 2,  0,  0,  0,  0, 21, 22, 22, 25,   2, 1) // #628\nPAIRING(10, 15, 20, 25, 21, 22, 23, 24,   0, 2,  0,  0,  0,  0, 21, 22, 23, 24,   2, 0) // #629\nPAIRING(10, 15, 20, 25, 21, 22, 23, 25,   0, 2,  0,  0,  0,  0, 21, 22, 23, 25,   2, 0) // #630\nPAIRING(10, 15, 20, 25, 21, 22, 23, 26,   0, 2,  0,  0,  0,  0, 21, 22, 23, 25,   2, 1) // #631\nPAIRING(10, 15, 20, 25, 21, 22, 25, 26,   0, 1,  0,  0,  0,  0, 21, 22,  0,  0,   2, 1) // #632\nPAIRING(10, 15, 20, 25, 21, 22, 26, 27,   0, 1,  0,  0,  0,  0, 21, 22,  0,  0,   2, 1) // #633\nPAIRING(10, 15, 20, 25, 21, 25, 25, 26,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 1) // #634\nPAIRING(10, 15, 20, 25, 21, 25, 26, 27,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 1) // #635\nPAIRING(10, 15, 20, 25, 21, 26, 26, 27,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 2) // #636\nPAIRING(10, 15, 20, 25, 21, 26, 27, 28,   0, 1,  0,  0,  0,  0, 21, 25,  0,  0,   2, 2) // #637\nPAIRING(10, 15, 20, 25, 25, 26, 26, 27,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #638\nPAIRING(10, 15, 20, 25, 25, 26, 27, 28,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #639\nPAIRING(10, 15, 20, 25, 26, 27, 27, 28,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #640\nPAIRING(10, 15, 20, 25, 26, 27, 28, 29,   0, 0,  0,  0,  0,  0,  0,  0,  0,  0,   2, 2) // #641\n"
  },
  {
    "path": "archive/spotify/breakpad/common/windows/guid_string.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// guid_string.cc: Convert GUIDs to strings.\n//\n// See guid_string.h for documentation.\n\n#include <wchar.h>\n\n#include \"common/windows/string_utils-inl.h\"\n\n#include \"common/windows/guid_string.h\"\n\nnamespace google_breakpad {\n\n// static\nwstring GUIDString::GUIDToWString(GUID *guid) {\n  wchar_t guid_string[37];\n  swprintf(\n      guid_string, sizeof(guid_string) / sizeof(guid_string[0]),\n      L\"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\",\n      guid->Data1, guid->Data2, guid->Data3,\n      guid->Data4[0], guid->Data4[1], guid->Data4[2],\n      guid->Data4[3], guid->Data4[4], guid->Data4[5],\n      guid->Data4[6], guid->Data4[7]);\n\n  // remove when VC++7.1 is no longer supported\n  guid_string[sizeof(guid_string) / sizeof(guid_string[0]) - 1] = L'\\0';\n\n  return wstring(guid_string);\n}\n\n// static\nwstring GUIDString::GUIDToSymbolServerWString(GUID *guid) {\n  wchar_t guid_string[33];\n  swprintf(\n      guid_string, sizeof(guid_string) / sizeof(guid_string[0]),\n      L\"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X\",\n      guid->Data1, guid->Data2, guid->Data3,\n      guid->Data4[0], guid->Data4[1], guid->Data4[2],\n      guid->Data4[3], guid->Data4[4], guid->Data4[5],\n      guid->Data4[6], guid->Data4[7]);\n\n  // remove when VC++7.1 is no longer supported\n  guid_string[sizeof(guid_string) / sizeof(guid_string[0]) - 1] = L'\\0';\n\n  return wstring(guid_string);\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/windows/guid_string.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// guid_string.cc: Convert GUIDs to strings.\n\n#ifndef COMMON_WINDOWS_GUID_STRING_H__\n#define COMMON_WINDOWS_GUID_STRING_H__\n\n#include <guiddef.h>\n\n#include <string>\n\nnamespace google_breakpad {\n\nusing std::wstring;\n\nclass GUIDString {\n public:\n  // Converts guid to a string in the format recommended by RFC 4122 and\n  // returns the string.\n  static wstring GUIDToWString(GUID *guid);\n\n  // Converts guid to a string formatted as uppercase hexadecimal, with\n  // no separators, and returns the string.  This is the format used for\n  // symbol server identifiers, although identifiers have an age tacked\n  // on to the string.\n  static wstring GUIDToSymbolServerWString(GUID *guid);\n};\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_WINDOWS_GUID_STRING_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/windows/http_upload.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <assert.h>\n\n// Disable exception handler warnings.\n#pragma warning( disable : 4530 )\n\n#include <fstream>\n\n#include \"common/windows/string_utils-inl.h\"\n\n#include \"common/windows/http_upload.h\"\n\nnamespace google_breakpad {\n\nusing std::ifstream;\nusing std::ios;\n\nstatic const wchar_t kUserAgent[] = L\"Breakpad/1.0 (Windows)\";\n\n// Helper class which closes an internet handle when it goes away\nclass HTTPUpload::AutoInternetHandle {\n public:\n  explicit AutoInternetHandle(HINTERNET handle) : handle_(handle) {}\n  ~AutoInternetHandle() {\n    if (handle_) {\n      InternetCloseHandle(handle_);\n    }\n  }\n\n  HINTERNET get() { return handle_; }\n\n private:\n  HINTERNET handle_;\n};\n\n// static\nbool HTTPUpload::SendRequest(const wstring &url,\n                             const map<wstring, wstring> &parameters,\n                             const wstring &upload_file,\n                             const wstring &file_part_name,\n                             int *timeout,\n                             wstring *response_body,\n                             int *response_code) {\n  if (response_code) {\n    *response_code = 0;\n  }\n\n  // TODO(bryner): support non-ASCII parameter names\n  if (!CheckParameters(parameters)) {\n    return false;\n  }\n\n  // Break up the URL and make sure we can handle it\n  wchar_t scheme[16], host[256], path[256];\n  URL_COMPONENTS components;\n  memset(&components, 0, sizeof(components));\n  components.dwStructSize = sizeof(components);\n  components.lpszScheme = scheme;\n  components.dwSchemeLength = sizeof(scheme) / sizeof(scheme[0]);\n  components.lpszHostName = host;\n  components.dwHostNameLength = sizeof(host) / sizeof(host[0]);\n  components.lpszUrlPath = path;\n  components.dwUrlPathLength = sizeof(path) / sizeof(path[0]);\n  if (!InternetCrackUrl(url.c_str(), static_cast<DWORD>(url.size()),\n                        0, &components)) {\n    return false;\n  }\n  bool secure = false;\n  if (wcscmp(scheme, L\"https\") == 0) {\n    secure = true;\n  } else if (wcscmp(scheme, L\"http\") != 0) {\n    return false;\n  }\n\n  AutoInternetHandle internet(InternetOpen(kUserAgent,\n                                           INTERNET_OPEN_TYPE_PRECONFIG,\n                                           NULL,  // proxy name\n                                           NULL,  // proxy bypass\n                                           0));   // flags\n  if (!internet.get()) {\n    return false;\n  }\n\n  AutoInternetHandle connection(InternetConnect(internet.get(),\n                                                host,\n                                                components.nPort,\n                                                NULL,    // user name\n                                                NULL,    // password\n                                                INTERNET_SERVICE_HTTP,\n                                                0,       // flags\n                                                NULL));  // context\n  if (!connection.get()) {\n    return false;\n  }\n\n  DWORD http_open_flags = secure ? INTERNET_FLAG_SECURE : 0;\n  http_open_flags |= INTERNET_FLAG_NO_COOKIES;\n  AutoInternetHandle request(HttpOpenRequest(connection.get(),\n                                             L\"POST\",\n                                             path,\n                                             NULL,    // version\n                                             NULL,    // referer\n                                             NULL,    // agent type\n                                             http_open_flags,\n                                             NULL));  // context\n  if (!request.get()) {\n    return false;\n  }\n\n  wstring boundary = GenerateMultipartBoundary();\n  wstring content_type_header = GenerateRequestHeader(boundary);\n  HttpAddRequestHeaders(request.get(),\n                        content_type_header.c_str(),\n                        static_cast<DWORD>(-1),\n                        HTTP_ADDREQ_FLAG_ADD);\n\n  string request_body;\n  if (!GenerateRequestBody(parameters, upload_file,\n                           file_part_name, boundary, &request_body)) {\n    return false;\n  }\n\n  if (timeout) {\n    if (!InternetSetOption(request.get(),\n                           INTERNET_OPTION_SEND_TIMEOUT,\n                           timeout,\n                           sizeof(timeout))) {\n      fwprintf(stderr, L\"Could not unset send timeout, continuing...\\n\");\n    }\n\n    if (!InternetSetOption(request.get(),\n                           INTERNET_OPTION_RECEIVE_TIMEOUT,\n                           timeout,\n                           sizeof(timeout))) {\n      fwprintf(stderr, L\"Could not unset receive timeout, continuing...\\n\");\n    }\n  }\n  \n  if (!HttpSendRequest(request.get(), NULL, 0,\n                       const_cast<char *>(request_body.data()),\n                       static_cast<DWORD>(request_body.size()))) {\n    return false;\n  }\n\n  // The server indicates a successful upload with HTTP status 200.\n  wchar_t http_status[4];\n  DWORD http_status_size = sizeof(http_status);\n  if (!HttpQueryInfo(request.get(), HTTP_QUERY_STATUS_CODE,\n                     static_cast<LPVOID>(&http_status), &http_status_size,\n                     0)) {\n    return false;\n  }\n\n  int http_response = wcstol(http_status, NULL, 10);\n  if (response_code) {\n    *response_code = http_response;\n  }\n\n  bool result = (http_response == 200);\n\n  if (result) {\n    result = ReadResponse(request.get(), response_body);\n  }\n\n  return result;\n}\n\n// static\nbool HTTPUpload::ReadResponse(HINTERNET request, wstring *response) {\n  bool has_content_length_header = false;\n  wchar_t content_length[32];\n  DWORD content_length_size = sizeof(content_length);\n  DWORD claimed_size = 0;\n  string response_body;\n\n  if (HttpQueryInfo(request, HTTP_QUERY_CONTENT_LENGTH,\n                    static_cast<LPVOID>(&content_length),\n                    &content_length_size, 0)) {\n    has_content_length_header = true;\n    claimed_size = wcstol(content_length, NULL, 10);\n    response_body.reserve(claimed_size);\n  }\n\n\n  DWORD bytes_available;\n  DWORD total_read = 0;\n  BOOL return_code;\n\n  while (((return_code = InternetQueryDataAvailable(request, &bytes_available,\n\t  0, 0)) != 0) && bytes_available > 0) {\n\n    vector<char> response_buffer(bytes_available);\n    DWORD size_read;\n\n    return_code = InternetReadFile(request,\n                                   &response_buffer[0],\n                                   bytes_available, &size_read);\n\n    if (return_code && size_read > 0) {\n      total_read += size_read;\n      response_body.append(&response_buffer[0], size_read);\n    } else {\n      break;\n    }\n  }\n\n  bool succeeded = return_code && (!has_content_length_header ||\n                                   (total_read == claimed_size));\n  if (succeeded && response) {\n    *response = UTF8ToWide(response_body);\n  }\n\n  return succeeded;\n}\n\n// static\nwstring HTTPUpload::GenerateMultipartBoundary() {\n  // The boundary has 27 '-' characters followed by 16 hex digits\n  static const wchar_t kBoundaryPrefix[] = L\"---------------------------\";\n  static const int kBoundaryLength = 27 + 16 + 1;\n\n  // Generate some random numbers to fill out the boundary\n  int r0 = rand();\n  int r1 = rand();\n\n  wchar_t temp[kBoundaryLength];\n  swprintf(temp, kBoundaryLength, L\"%s%08X%08X\", kBoundaryPrefix, r0, r1);\n\n  // remove when VC++7.1 is no longer supported\n  temp[kBoundaryLength - 1] = L'\\0';\n\n  return wstring(temp);\n}\n\n// static\nwstring HTTPUpload::GenerateRequestHeader(const wstring &boundary) {\n  wstring header = L\"Content-Type: multipart/form-data; boundary=\";\n  header += boundary;\n  return header;\n}\n\n// static\nbool HTTPUpload::GenerateRequestBody(const map<wstring, wstring> &parameters,\n                                     const wstring &upload_file,\n                                     const wstring &file_part_name,\n                                     const wstring &boundary,\n                                     string *request_body) {\n  vector<char> contents;\n  if (!GetFileContents(upload_file, &contents)) {\n    return false;\n  }\n\n  string boundary_str = WideToUTF8(boundary);\n  if (boundary_str.empty()) {\n    return false;\n  }\n\n  request_body->clear();\n\n  // Append each of the parameter pairs as a form-data part\n  for (map<wstring, wstring>::const_iterator pos = parameters.begin();\n       pos != parameters.end(); ++pos) {\n    request_body->append(\"--\" + boundary_str + \"\\r\\n\");\n    request_body->append(\"Content-Disposition: form-data; name=\\\"\" +\n                         WideToUTF8(pos->first) + \"\\\"\\r\\n\\r\\n\" +\n                         WideToUTF8(pos->second) + \"\\r\\n\");\n  }\n\n  // Now append the upload file as a binary (octet-stream) part\n  string filename_utf8 = WideToUTF8(upload_file);\n  if (filename_utf8.empty()) {\n    return false;\n  }\n\n  string file_part_name_utf8 = WideToUTF8(file_part_name);\n  if (file_part_name_utf8.empty()) {\n    return false;\n  }\n\n  request_body->append(\"--\" + boundary_str + \"\\r\\n\");\n  request_body->append(\"Content-Disposition: form-data; \"\n                       \"name=\\\"\" + file_part_name_utf8 + \"\\\"; \"\n                       \"filename=\\\"\" + filename_utf8 + \"\\\"\\r\\n\");\n  request_body->append(\"Content-Type: application/octet-stream\\r\\n\");\n  request_body->append(\"\\r\\n\");\n\n  if (!contents.empty()) {\n      request_body->append(&(contents[0]), contents.size());\n  }\n  request_body->append(\"\\r\\n\");\n  request_body->append(\"--\" + boundary_str + \"--\\r\\n\");\n  return true;\n}\n\n// static\nbool HTTPUpload::GetFileContents(const wstring &filename,\n                                 vector<char> *contents) {\n  // The \"open\" method on pre-MSVC8 ifstream implementations doesn't accept a\n  // wchar_t* filename, so use _wfopen directly in that case.  For VC8 and\n  // later, _wfopen has been deprecated in favor of _wfopen_s, which does\n  // not exist in earlier versions, so let the ifstream open the file itself.\n#if _MSC_VER >= 1400  // MSVC 2005/8\n  ifstream file;\n  file.open(filename.c_str(), ios::binary);\n#else  // _MSC_VER >= 1400\n  ifstream file(_wfopen(filename.c_str(), L\"rb\"));\n#endif  // _MSC_VER >= 1400\n  if (file.is_open()) {\n    file.seekg(0, ios::end);\n    std::streamoff length = file.tellg();\n    contents->resize(length);\n    if (length != 0) {\n      file.seekg(0, ios::beg);\n      file.read(&((*contents)[0]), length);\n    }\n    file.close();\n    return true;\n  }\n  return false;\n}\n\n// static\nwstring HTTPUpload::UTF8ToWide(const string &utf8) {\n  if (utf8.length() == 0) {\n    return wstring();\n  }\n\n  // compute the length of the buffer we'll need\n  int charcount = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0);\n\n  if (charcount == 0) {\n    return wstring();\n  }\n\n  // convert\n  wchar_t* buf = new wchar_t[charcount];\n  MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, buf, charcount);\n  wstring result(buf);\n  delete[] buf;\n  return result;\n}\n\n// static\nstring HTTPUpload::WideToUTF8(const wstring &wide) {\n  if (wide.length() == 0) {\n    return string();\n  }\n\n  // compute the length of the buffer we'll need\n  int charcount = WideCharToMultiByte(CP_UTF8, 0, wide.c_str(), -1,\n                                      NULL, 0, NULL, NULL);\n  if (charcount == 0) {\n    return string();\n  }\n\n  // convert\n  char *buf = new char[charcount];\n  WideCharToMultiByte(CP_UTF8, 0, wide.c_str(), -1, buf, charcount,\n                      NULL, NULL);\n\n  string result(buf);\n  delete[] buf;\n  return result;\n}\n\n// static\nbool HTTPUpload::CheckParameters(const map<wstring, wstring> &parameters) {\n  for (map<wstring, wstring>::const_iterator pos = parameters.begin();\n       pos != parameters.end(); ++pos) {\n    const wstring &str = pos->first;\n    if (str.size() == 0) {\n      return false;  // disallow empty parameter names\n    }\n    for (unsigned int i = 0; i < str.size(); ++i) {\n      wchar_t c = str[i];\n      if (c < 32 || c == '\"' || c > 127) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/windows/http_upload.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// HTTPUpload provides a \"nice\" API to send a multipart HTTP(S) POST\n// request using wininet.  It currently supports requests that contain\n// a set of string parameters (key/value pairs), and a file to upload.\n\n#ifndef COMMON_WINDOWS_HTTP_UPLOAD_H__\n#define COMMON_WINDOWS_HTTP_UPLOAD_H__\n\n#pragma warning( push )\n// Disable exception handler warnings.\n#pragma warning( disable : 4530 ) \n\n#include <Windows.h>\n#include <WinInet.h>\n\n#include <map>\n#include <string>\n#include <vector>\n\nnamespace google_breakpad {\n\nusing std::string;\nusing std::wstring;\nusing std::map;\nusing std::vector;\n\nclass HTTPUpload {\n public:\n  // Sends the given set of parameters, along with the contents of\n  // upload_file, as a multipart POST request to the given URL.\n  // file_part_name contains the name of the file part of the request\n  // (i.e. it corresponds to the name= attribute on an <input type=\"file\">.\n  // Parameter names must contain only printable ASCII characters,\n  // and may not contain a quote (\") character.\n  // Only HTTP(S) URLs are currently supported.  Returns true on success.\n  // If the request is successful and response_body is non-NULL,\n  // the response body will be returned in response_body.\n  // If response_code is non-NULL, it will be set to the HTTP response code\n  // received (or 0 if the request failed before getting an HTTP response).\n  static bool SendRequest(const wstring &url,\n                          const map<wstring, wstring> &parameters,\n                          const wstring &upload_file,\n                          const wstring &file_part_name,\n                          int *timeout,\n                          wstring *response_body,\n                          int *response_code);\n\n private:\n  class AutoInternetHandle;\n\n  // Retrieves the HTTP response.  If NULL is passed in for response,\n  // this merely checks (via the return value) that we were successfully\n  // able to retrieve exactly as many bytes of content in the response as\n  // were specified in the Content-Length header.\n  static bool HTTPUpload::ReadResponse(HINTERNET request, wstring* response);\n\n  // Generates a new multipart boundary for a POST request\n  static wstring GenerateMultipartBoundary();\n\n  // Generates a HTTP request header for a multipart form submit.\n  static wstring GenerateRequestHeader(const wstring &boundary);\n\n  // Given a set of parameters, an upload filename, and a file part name,\n  // generates a multipart request body string with these parameters\n  // and minidump contents.  Returns true on success.\n  static bool GenerateRequestBody(const map<wstring, wstring> &parameters,\n                                  const wstring &upload_file,\n                                  const wstring &file_part_name,\n                                  const wstring &boundary,\n                                  string *request_body);\n\n  // Fills the supplied vector with the contents of filename.\n  static bool GetFileContents(const wstring &filename, vector<char> *contents);\n\n  // Converts a UTF8 string to UTF16.\n  static wstring UTF8ToWide(const string &utf8);\n\n  // Converts a UTF16 string to UTF8.\n  static string WideToUTF8(const wstring &wide);\n\n  // Checks that the given list of parameters has only printable\n  // ASCII characters in the parameter name, and does not contain\n  // any quote (\") characters.  Returns true if so.\n  static bool CheckParameters(const map<wstring, wstring> &parameters);\n\n  // No instances of this class should be created.\n  // Disallow all constructors, destructors, and operator=.\n  HTTPUpload();\n  explicit HTTPUpload(const HTTPUpload &);\n  void operator=(const HTTPUpload &);\n  ~HTTPUpload();\n};\n\n}  // namespace google_breakpad\n\n#pragma warning( pop )\n\n#endif  // COMMON_WINDOWS_HTTP_UPLOAD_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/windows/pdb_source_line_writer.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <atlbase.h>\n#include <dia2.h>\n#include <ImageHlp.h>\n#include <stdio.h>\n\n#include \"common/windows/string_utils-inl.h\"\n\n#include \"common/windows/pdb_source_line_writer.h\"\n#include \"common/windows/guid_string.h\"\n\n// This constant may be missing from DbgHelp.h.  See the documentation for\n// IDiaSymbol::get_undecoratedNameEx.\n#ifndef UNDNAME_NO_ECSU\n#define UNDNAME_NO_ECSU 0x8000  // Suppresses enum/class/struct/union.\n#endif  // UNDNAME_NO_ECSU\n\nnamespace google_breakpad {\n\nusing std::vector;\n\n// A helper class to scope a PLOADED_IMAGE.\nclass AutoImage {\n public:\n  explicit AutoImage(PLOADED_IMAGE img) : img_(img) {}\n  ~AutoImage() {\n    if (img_)\n      ImageUnload(img_);\n  }\n\n  operator PLOADED_IMAGE() { return img_; }\n  PLOADED_IMAGE operator->() { return img_; }\n\n private:\n  PLOADED_IMAGE img_;\n};\n\nPDBSourceLineWriter::PDBSourceLineWriter() : output_(NULL) {\n}\n\nPDBSourceLineWriter::~PDBSourceLineWriter() {\n}\n\nbool PDBSourceLineWriter::Open(const wstring &file, FileFormat format) {\n  Close();\n\n  if (FAILED(CoInitialize(NULL))) {\n    fprintf(stderr, \"CoInitialize failed\\n\");\n    return false;\n  }\n\n  CComPtr<IDiaDataSource> data_source;\n  if (FAILED(data_source.CoCreateInstance(CLSID_DiaSource))) {\n    const int kGuidSize = 64;\n    wchar_t classid[kGuidSize] = {0};\n    StringFromGUID2(CLSID_DiaSource, classid, kGuidSize);\n    // vc80 uses bce36434-2c24-499e-bf49-8bd99b0eeb68.\n    // vc90 uses 4C41678E-887B-4365-A09E-925D28DB33C2.\n    fprintf(stderr, \"CoCreateInstance CLSID_DiaSource %S failed \"\n            \"(msdia*.dll unregistered?)\\n\", classid);\n    return false;\n  }\n\n  switch (format) {\n    case PDB_FILE:\n      if (FAILED(data_source->loadDataFromPdb(file.c_str()))) {\n        fprintf(stderr, \"loadDataFromPdb failed for %ws\\n\", file.c_str());\n        return false;\n      }\n      break;\n    case EXE_FILE:\n      if (FAILED(data_source->loadDataForExe(file.c_str(), NULL, NULL))) {\n        fprintf(stderr, \"loadDataForExe failed for %ws\\n\", file.c_str());\n        return false;\n      }\n      code_file_ = file;\n      break;\n    case ANY_FILE:\n      if (FAILED(data_source->loadDataFromPdb(file.c_str()))) {\n        if (FAILED(data_source->loadDataForExe(file.c_str(), NULL, NULL))) {\n          fprintf(stderr, \"loadDataForPdb and loadDataFromExe failed for %ws\\n\", file.c_str());\n          return false;\n        }\n\tcode_file_ = file;\n      }\n      break;\n    default:\n      fprintf(stderr, \"Unknown file format\\n\");\n      return false;\n  }\n\n  if (FAILED(data_source->openSession(&session_))) {\n    fprintf(stderr, \"openSession failed\\n\");\n  }\n\n  return true;\n}\n\nbool PDBSourceLineWriter::PrintLines(IDiaEnumLineNumbers *lines) {\n  // The line number format is:\n  // <rva> <line number> <source file id>\n  CComPtr<IDiaLineNumber> line;\n  ULONG count;\n\n  while (SUCCEEDED(lines->Next(1, &line, &count)) && count == 1) {\n    DWORD rva;\n    if (FAILED(line->get_relativeVirtualAddress(&rva))) {\n      fprintf(stderr, \"failed to get line rva\\n\");\n      return false;\n    }\n\n    DWORD length;\n    if (FAILED(line->get_length(&length))) {\n      fprintf(stderr, \"failed to get line code length\\n\");\n      return false;\n    }\n\n    DWORD dia_source_id;\n    if (FAILED(line->get_sourceFileId(&dia_source_id))) {\n      fprintf(stderr, \"failed to get line source file id\\n\");\n      return false;\n    }\n    // duplicate file names are coalesced to share one ID\n    DWORD source_id = GetRealFileID(dia_source_id);\n\n    DWORD line_num;\n    if (FAILED(line->get_lineNumber(&line_num))) {\n      fprintf(stderr, \"failed to get line number\\n\");\n      return false;\n    }\n\n    fprintf(output_, \"%x %x %d %d\\n\", rva, length, line_num, source_id);\n    line.Release();\n  }\n  return true;\n}\n\nbool PDBSourceLineWriter::PrintFunction(IDiaSymbol *function,\n                                        IDiaSymbol *block) {\n  // The function format is:\n  // FUNC <address> <length> <param_stack_size> <function>\n  DWORD rva;\n  if (FAILED(block->get_relativeVirtualAddress(&rva))) {\n    fprintf(stderr, \"couldn't get rva\\n\");\n    return false;\n  }\n\n  ULONGLONG length;\n  if (FAILED(block->get_length(&length))) {\n    fprintf(stderr, \"failed to get function length\\n\");\n    return false;\n  }\n\n  if (length == 0) {\n    // Silently ignore zero-length functions, which can infrequently pop up.\n    return true;\n  }\n\n  CComBSTR name;\n  int stack_param_size;\n  if (!GetSymbolFunctionName(function, &name, &stack_param_size)) {\n    return false;\n  }\n\n  // If the decorated name didn't give the parameter size, try to\n  // calculate it.\n  if (stack_param_size < 0) {\n    stack_param_size = GetFunctionStackParamSize(function);\n  }\n\n  fprintf(output_, \"FUNC %x %\" WIN_STRING_FORMAT_LL \"x %x %ws\\n\",\n          rva, length, stack_param_size, name);\n\n  CComPtr<IDiaEnumLineNumbers> lines;\n  if (FAILED(session_->findLinesByRVA(rva, DWORD(length), &lines))) {\n    return false;\n  }\n\n  if (!PrintLines(lines)) {\n    return false;\n  }\n  return true;\n}\n\nbool PDBSourceLineWriter::PrintSourceFiles() {\n  CComPtr<IDiaSymbol> global;\n  if (FAILED(session_->get_globalScope(&global))) {\n    fprintf(stderr, \"get_globalScope failed\\n\");\n    return false;\n  }\n\n  CComPtr<IDiaEnumSymbols> compilands;\n  if (FAILED(global->findChildren(SymTagCompiland, NULL,\n                                  nsNone, &compilands))) {\n    fprintf(stderr, \"findChildren failed\\n\");\n    return false;\n  }\n\n  CComPtr<IDiaSymbol> compiland;\n  ULONG count;\n  while (SUCCEEDED(compilands->Next(1, &compiland, &count)) && count == 1) {\n    CComPtr<IDiaEnumSourceFiles> source_files;\n    if (FAILED(session_->findFile(compiland, NULL, nsNone, &source_files))) {\n      return false;\n    }\n    CComPtr<IDiaSourceFile> file;\n    while (SUCCEEDED(source_files->Next(1, &file, &count)) && count == 1) {\n      DWORD file_id;\n      if (FAILED(file->get_uniqueId(&file_id))) {\n        return false;\n      }\n\n      CComBSTR file_name;\n      if (FAILED(file->get_fileName(&file_name))) {\n        return false;\n      }\n\n      wstring file_name_string(file_name);\n      if (!FileIDIsCached(file_name_string)) {\n        // this is a new file name, cache it and output a FILE line.\n        CacheFileID(file_name_string, file_id);\n        fwprintf(output_, L\"FILE %d %s\\n\", file_id, file_name);\n      } else {\n        // this file name has already been seen, just save this\n        // ID for later lookup.\n        StoreDuplicateFileID(file_name_string, file_id);\n      }\n      file.Release();\n    }\n    compiland.Release();\n  }\n  return true;\n}\n\nbool PDBSourceLineWriter::PrintFunctions() {\n  CComPtr<IDiaEnumSymbolsByAddr> symbols;\n  if (FAILED(session_->getSymbolsByAddr(&symbols))) {\n    fprintf(stderr, \"failed to get symbol enumerator\\n\");\n    return false;\n  }\n\n  CComPtr<IDiaSymbol> symbol;\n  if (FAILED(symbols->symbolByAddr(1, 0, &symbol))) {\n    fprintf(stderr, \"failed to enumerate symbols\\n\");\n    return false;\n  }\n\n  DWORD rva_last = 0;\n  if (FAILED(symbol->get_relativeVirtualAddress(&rva_last))) {\n    fprintf(stderr, \"failed to get symbol rva\\n\");\n    return false;\n  }\n\n  ULONG count;\n  do {\n    DWORD tag;\n    if (FAILED(symbol->get_symTag(&tag))) {\n      fprintf(stderr, \"failed to get symbol tag\\n\");\n      return false;\n    }\n\n    // For a given function, DIA seems to give either a symbol with\n    // SymTagFunction or SymTagPublicSymbol, but not both.  This means\n    // that PDBSourceLineWriter will output either a FUNC or PUBLIC line,\n    // but not both.\n    if (tag == SymTagFunction) {\n      if (!PrintFunction(symbol, symbol)) {\n        return false;\n      }\n    } else if (tag == SymTagPublicSymbol) {\n      if (!PrintCodePublicSymbol(symbol)) {\n        return false;\n      }\n    }\n    symbol.Release();\n  } while (SUCCEEDED(symbols->Next(1, &symbol, &count)) && count == 1);\n\n  // When building with PGO, the compiler can split functions into\n  // \"hot\" and \"cold\" blocks, and move the \"cold\" blocks out to separate\n  // pages, so the function can be noncontiguous. To find these blocks,\n  // we have to iterate over all the compilands, and then find blocks\n  // that are children of them. We can then find the lexical parents\n  // of those blocks and print out an extra FUNC line for blocks\n  // that are not contained in their parent functions.\n  CComPtr<IDiaSymbol> global;\n  if (FAILED(session_->get_globalScope(&global))) {\n    fprintf(stderr, \"get_globalScope failed\\n\");\n    return false;\n  }\n\n  CComPtr<IDiaEnumSymbols> compilands;\n  if (FAILED(global->findChildren(SymTagCompiland, NULL,\n                                  nsNone, &compilands))) {\n    fprintf(stderr, \"findChildren failed on the global\\n\");\n    return false;\n  }\n\n  CComPtr<IDiaSymbol> compiland;\n  while (SUCCEEDED(compilands->Next(1, &compiland, &count)) && count == 1) {\n    CComPtr<IDiaEnumSymbols> blocks;\n    if (FAILED(compiland->findChildren(SymTagBlock, NULL,\n                                       nsNone, &blocks))) {\n      fprintf(stderr, \"findChildren failed on a compiland\\n\");\n      return false;\n    }\n\n    CComPtr<IDiaSymbol> block;\n    while (SUCCEEDED(blocks->Next(1, &block, &count)) && count == 1) {\n      // find this block's lexical parent function\n      CComPtr<IDiaSymbol> parent;\n      DWORD tag;\n      if (SUCCEEDED(block->get_lexicalParent(&parent)) &&\n          SUCCEEDED(parent->get_symTag(&tag)) &&\n          tag == SymTagFunction) {\n        // now get the block's offset and the function's offset and size,\n        // and determine if the block is outside of the function\n        DWORD func_rva, block_rva;\n        ULONGLONG func_length;\n        if (SUCCEEDED(block->get_relativeVirtualAddress(&block_rva)) &&\n            SUCCEEDED(parent->get_relativeVirtualAddress(&func_rva)) &&\n            SUCCEEDED(parent->get_length(&func_length))) {\n          if (block_rva < func_rva || block_rva > (func_rva + func_length)) {\n            if (!PrintFunction(parent, block)) {\n              return false;\n            }\n          }\n        }\n      }\n      parent.Release();\n      block.Release();\n    }\n    blocks.Release();\n    compiland.Release();\n  }\n\n  return true;\n}\n\nbool PDBSourceLineWriter::PrintFrameData() {\n  // It would be nice if it were possible to output frame data alongside the\n  // associated function, as is done with line numbers, but the DIA API\n  // doesn't make it possible to get the frame data in that way.\n\n  CComPtr<IDiaEnumTables> tables;\n  if (FAILED(session_->getEnumTables(&tables)))\n    return false;\n\n  // Pick up the first table that supports IDiaEnumFrameData.\n  CComPtr<IDiaEnumFrameData> frame_data_enum;\n  CComPtr<IDiaTable> table;\n  ULONG count;\n  while (!frame_data_enum &&\n         SUCCEEDED(tables->Next(1, &table, &count)) &&\n         count == 1) {\n    table->QueryInterface(_uuidof(IDiaEnumFrameData),\n                          reinterpret_cast<void**>(&frame_data_enum));\n    table.Release();\n  }\n  if (!frame_data_enum)\n    return false;\n\n  DWORD last_type = -1;\n  DWORD last_rva = -1;\n  DWORD last_code_size = 0;\n  DWORD last_prolog_size = -1;\n\n  CComPtr<IDiaFrameData> frame_data;\n  while (SUCCEEDED(frame_data_enum->Next(1, &frame_data, &count)) &&\n         count == 1) {\n    DWORD type;\n    if (FAILED(frame_data->get_type(&type)))\n      return false;\n\n    DWORD rva;\n    if (FAILED(frame_data->get_relativeVirtualAddress(&rva)))\n      return false;\n\n    DWORD code_size;\n    if (FAILED(frame_data->get_lengthBlock(&code_size)))\n      return false;\n\n    DWORD prolog_size;\n    if (FAILED(frame_data->get_lengthProlog(&prolog_size)))\n      return false;\n\n    // epliog_size is always 0.\n    DWORD epilog_size = 0;\n\n    // parameter_size is the size of parameters passed on the stack.  If any\n    // parameters are not passed on the stack (such as in registers), their\n    // sizes will not be included in parameter_size.\n    DWORD parameter_size;\n    if (FAILED(frame_data->get_lengthParams(&parameter_size)))\n      return false;\n\n    DWORD saved_register_size;\n    if (FAILED(frame_data->get_lengthSavedRegisters(&saved_register_size)))\n      return false;\n\n    DWORD local_size;\n    if (FAILED(frame_data->get_lengthLocals(&local_size)))\n      return false;\n\n    // get_maxStack can return S_FALSE, just use 0 in that case.\n    DWORD max_stack_size = 0;\n    if (FAILED(frame_data->get_maxStack(&max_stack_size)))\n      return false;\n\n    // get_programString can return S_FALSE, indicating that there is no\n    // program string.  In that case, check whether %ebp is used.\n    HRESULT program_string_result;\n    CComBSTR program_string;\n    if (FAILED(program_string_result = frame_data->get_program(\n        &program_string))) {\n      return false;\n    }\n\n    // get_allocatesBasePointer can return S_FALSE, treat that as though\n    // %ebp is not used.\n    BOOL allocates_base_pointer = FALSE;\n    if (program_string_result != S_OK) {\n      if (FAILED(frame_data->get_allocatesBasePointer(\n          &allocates_base_pointer))) {\n        return false;\n      }\n    }\n\n    // Only print out a line if type, rva, code_size, or prolog_size have\n    // changed from the last line.  It is surprisingly common (especially in\n    // system library PDBs) for DIA to return a series of identical\n    // IDiaFrameData objects.  For kernel32.pdb from Windows XP SP2 on x86,\n    // this check reduces the size of the dumped symbol file by a third.\n    if (type != last_type || rva != last_rva || code_size != last_code_size ||\n        prolog_size != last_prolog_size) {\n      fprintf(output_, \"STACK WIN %x %x %x %x %x %x %x %x %x %d \",\n              type, rva, code_size, prolog_size, epilog_size,\n              parameter_size, saved_register_size, local_size, max_stack_size,\n              program_string_result == S_OK);\n      if (program_string_result == S_OK) {\n        fprintf(output_, \"%ws\\n\", program_string);\n      } else {\n        fprintf(output_, \"%d\\n\", allocates_base_pointer);\n      }\n\n      last_type = type;\n      last_rva = rva;\n      last_code_size = code_size;\n      last_prolog_size = prolog_size;\n    }\n\n    frame_data.Release();\n  }\n\n  return true;\n}\n\nbool PDBSourceLineWriter::PrintCodePublicSymbol(IDiaSymbol *symbol) {\n  BOOL is_code;\n  if (FAILED(symbol->get_code(&is_code))) {\n    return false;\n  }\n  if (!is_code) {\n    return true;\n  }\n\n  DWORD rva;\n  if (FAILED(symbol->get_relativeVirtualAddress(&rva))) {\n    return false;\n  }\n\n  CComBSTR name;\n  int stack_param_size;\n  if (!GetSymbolFunctionName(symbol, &name, &stack_param_size)) {\n    return false;\n  }\n\n  fprintf(output_, \"PUBLIC %x %x %ws\\n\", rva,\n          stack_param_size > 0 ? stack_param_size : 0, name);\n  return true;\n}\n\nbool PDBSourceLineWriter::PrintPDBInfo() {\n  PDBModuleInfo info;\n  if (!GetModuleInfo(&info)) {\n    return false;\n  }\n\n  // Hard-code \"windows\" for the OS because that's the only thing that makes\n  // sense for PDB files.  (This might not be strictly correct for Windows CE\n  // support, but we don't care about that at the moment.)\n  fprintf(output_, \"MODULE windows %ws %ws %ws\\n\",\n          info.cpu.c_str(), info.debug_identifier.c_str(),\n          info.debug_file.c_str());\n\n  return true;\n}\n\nbool PDBSourceLineWriter::PrintPEInfo() {\n  PEModuleInfo info;\n  if (!GetPEInfo(&info)) {\n    return false;\n  }\n\n  fprintf(output_, \"INFO CODE_ID %ws %ws\\n\",\n\t  info.code_identifier.c_str(),\n\t  info.code_file.c_str());\n  return true;\n}\n\n// wcstol_positive_strict is sort of like wcstol, but much stricter.  string\n// should be a buffer pointing to a null-terminated string containing only\n// decimal digits.  If the entire string can be converted to an integer\n// without overflowing, and there are no non-digit characters before the\n// result is set to the value and this function returns true.  Otherwise,\n// this function returns false.  This is an alternative to the strtol, atoi,\n// and scanf families, which are not as strict about input and in some cases\n// don't provide a good way for the caller to determine if a conversion was\n// successful.\nstatic bool wcstol_positive_strict(wchar_t *string, int *result) {\n  int value = 0;\n  for (wchar_t *c = string; *c != '\\0'; ++c) {\n    int last_value = value;\n    value *= 10;\n    // Detect overflow.\n    if (value / 10 != last_value || value < 0) {\n      return false;\n    }\n    if (*c < '0' || *c > '9') {\n      return false;\n    }\n    unsigned int c_value = *c - '0';\n    last_value = value;\n    value += c_value;\n    // Detect overflow.\n    if (value < last_value) {\n      return false;\n    }\n    // Forbid leading zeroes unless the string is just \"0\".\n    if (value == 0 && *(c+1) != '\\0') {\n      return false;\n    }\n  }\n  *result = value;\n  return true;\n}\n\nbool PDBSourceLineWriter::FindPEFile() {\n  CComPtr<IDiaSymbol> global;\n  if (FAILED(session_->get_globalScope(&global))) {\n    fprintf(stderr, \"get_globalScope failed\\n\");\n    return false;\n  }\n\n  CComBSTR symbols_file;\n  if (SUCCEEDED(global->get_symbolsFileName(&symbols_file))) {\n    wstring file(symbols_file);\n    \n    // Look for an EXE or DLL file.\n    const wchar_t *extensions[] = { L\"exe\", L\"dll\" };\n    for (int i = 0; i < sizeof(extensions) / sizeof(extensions[0]); i++) {\n      size_t dot_pos = file.find_last_of(L\".\");\n      if (dot_pos != wstring::npos) {\n\tfile.replace(dot_pos + 1, wstring::npos, extensions[i]);\n\t// Check if this file exists.\n\tif (GetFileAttributesW(file.c_str()) != INVALID_FILE_ATTRIBUTES) {\n\t  code_file_ = file;\n\t  return true;\n\t}\n      }\n    }\n  }\n\n  return false;\n}\n\n// static\nbool PDBSourceLineWriter::GetSymbolFunctionName(IDiaSymbol *function,\n                                                BSTR *name,\n                                                int *stack_param_size) {\n  *stack_param_size = -1;\n  const DWORD undecorate_options = UNDNAME_NO_MS_KEYWORDS |\n                                   UNDNAME_NO_FUNCTION_RETURNS |\n                                   UNDNAME_NO_ALLOCATION_MODEL |\n                                   UNDNAME_NO_ALLOCATION_LANGUAGE |\n                                   UNDNAME_NO_THISTYPE |\n                                   UNDNAME_NO_ACCESS_SPECIFIERS |\n                                   UNDNAME_NO_THROW_SIGNATURES |\n                                   UNDNAME_NO_MEMBER_TYPE |\n                                   UNDNAME_NO_RETURN_UDT_MODEL |\n                                   UNDNAME_NO_ECSU;\n\n  // Use get_undecoratedNameEx to get readable C++ names with arguments.\n  if (function->get_undecoratedNameEx(undecorate_options, name) != S_OK) {\n    if (function->get_name(name) != S_OK) {\n      fprintf(stderr, \"failed to get function name\\n\");\n      return false;\n    }\n    // If a name comes from get_name because no undecorated form existed,\n    // it's already formatted properly to be used as output.  Don't do any\n    // additional processing.\n    //\n    // MSVC7's DIA seems to not undecorate names in as many cases as MSVC8's.\n    // This will result in calling get_name for some C++ symbols, so\n    // all of the parameter and return type information may not be included in\n    // the name string.\n  } else {\n    // C++ uses a bogus \"void\" argument for functions and methods that don't\n    // take any parameters.  Take it out of the undecorated name because it's\n    // ugly and unnecessary.\n    const wchar_t *replace_string = L\"(void)\";\n    const size_t replace_length = wcslen(replace_string);\n    const wchar_t *replacement_string = L\"()\";\n    size_t length = wcslen(*name);\n    if (length >= replace_length) {\n      wchar_t *name_end = *name + length - replace_length;\n      if (wcscmp(name_end, replace_string) == 0) {\n        WindowsStringUtils::safe_wcscpy(name_end, replace_length,\n                                        replacement_string);\n        length = wcslen(*name);\n      }\n    }\n\n    // Undecorate names used for stdcall and fastcall.  These names prefix\n    // the identifier with '_' (stdcall) or '@' (fastcall) and suffix it\n    // with '@' followed by the number of bytes of parameters, in decimal.\n    // If such a name is found, take note of the size and undecorate it.\n    // Only do this for names that aren't C++, which is determined based on\n    // whether the undecorated name contains any ':' or '(' characters.\n    if (!wcschr(*name, ':') && !wcschr(*name, '(') &&\n        (*name[0] == '_' || *name[0] == '@')) {\n      wchar_t *last_at = wcsrchr(*name + 1, '@');\n      if (last_at && wcstol_positive_strict(last_at + 1, stack_param_size)) {\n        // If this function adheres to the fastcall convention, it accepts up\n        // to the first 8 bytes of parameters in registers (%ecx and %edx).\n        // We're only interested in the stack space used for parameters, so\n        // so subtract 8 and don't let the size go below 0.\n        if (*name[0] == '@') {\n          if (*stack_param_size > 8) {\n            *stack_param_size -= 8;\n          } else {\n            *stack_param_size = 0;\n          }\n        }\n\n        // Undecorate the name by moving it one character to the left in its\n        // buffer, and terminating it where the last '@' had been.\n        WindowsStringUtils::safe_wcsncpy(*name, length,\n                                         *name + 1, last_at - *name - 1);\n     } else if (*name[0] == '_') {\n        // This symbol's name is encoded according to the cdecl rules.  The\n        // name doesn't end in a '@' character followed by a decimal positive\n        // integer, so it's not a stdcall name.  Strip off the leading\n        // underscore.\n        WindowsStringUtils::safe_wcsncpy(*name, length, *name + 1, length);\n      }\n    }\n  }\n\n  return true;\n}\n\n// static\nint PDBSourceLineWriter::GetFunctionStackParamSize(IDiaSymbol *function) {\n  // This implementation is highly x86-specific.\n\n  // Gather the symbols corresponding to data.\n  CComPtr<IDiaEnumSymbols> data_children;\n  if (FAILED(function->findChildren(SymTagData, NULL, nsNone,\n                                    &data_children))) {\n    return 0;\n  }\n\n  // lowest_base is the lowest %ebp-relative byte offset used for a parameter.\n  // highest_end is one greater than the highest offset (i.e. base + length).\n  // Stack parameters are assumed to be contiguous, because in reality, they\n  // are.\n  int lowest_base = INT_MAX;\n  int highest_end = INT_MIN;\n\n  CComPtr<IDiaSymbol> child;\n  DWORD count;\n  while (SUCCEEDED(data_children->Next(1, &child, &count)) && count == 1) {\n    // If any operation fails at this point, just proceed to the next child.\n    // Use the next_child label instead of continue because child needs to\n    // be released before it's reused.  Declare constructable/destructable\n    // types early to avoid gotos that cross initializations.\n    CComPtr<IDiaSymbol> child_type;\n\n    // DataIsObjectPtr is only used for |this|.  Because |this| can be passed\n    // as a stack parameter, look for it in addition to traditional\n    // parameters.\n    DWORD child_kind;\n    if (FAILED(child->get_dataKind(&child_kind)) ||\n        (child_kind != DataIsParam && child_kind != DataIsObjectPtr)) {\n      goto next_child;\n    }\n\n    // Only concentrate on register-relative parameters.  Parameters may also\n    // be enregistered (passed directly in a register), but those don't\n    // consume any stack space, so they're not of interest.\n    DWORD child_location_type;\n    if (FAILED(child->get_locationType(&child_location_type)) ||\n        child_location_type != LocIsRegRel) {\n      goto next_child;\n    }\n\n    // Of register-relative parameters, the only ones that make any sense are\n    // %ebp- or %esp-relative.  Note that MSVC's debugging information always\n    // gives parameters as %ebp-relative even when a function doesn't use a\n    // traditional frame pointer and stack parameters are accessed relative to\n    // %esp, so just look for %ebp-relative parameters.  If you wanted to\n    // access parameters, you'd probably want to treat these %ebp-relative\n    // offsets as if they were relative to %esp before a function's prolog\n    // executed.\n    DWORD child_register;\n    if (FAILED(child->get_registerId(&child_register)) ||\n        child_register != CV_REG_EBP) {\n      goto next_child;\n    }\n\n    LONG child_register_offset;\n    if (FAILED(child->get_offset(&child_register_offset))) {\n      goto next_child;\n    }\n\n    // IDiaSymbol::get_type can succeed but still pass back a NULL value.\n    if (FAILED(child->get_type(&child_type)) || !child_type) {\n      goto next_child;\n    }\n\n    ULONGLONG child_length;\n    if (FAILED(child_type->get_length(&child_length))) {\n      goto next_child;\n    }\n\n    int child_end = child_register_offset + static_cast<ULONG>(child_length);\n    if (child_register_offset < lowest_base) {\n      lowest_base = child_register_offset;\n    }\n    if (child_end > highest_end) {\n      highest_end = child_end;\n    }\n\nnext_child:\n    child.Release();\n  }\n\n  int param_size = 0;\n  // Make sure lowest_base isn't less than 4, because [%esp+4] is the lowest\n  // possible address to find a stack parameter before executing a function's\n  // prolog (see above).  Some optimizations cause parameter offsets to be\n  // lower than 4, but we're not concerned with those because we're only\n  // looking for parameters contained in addresses higher than where the\n  // return address is stored.\n  if (lowest_base < 4) {\n    lowest_base = 4;\n  }\n  if (highest_end > lowest_base) {\n    // All stack parameters are pushed as at least 4-byte quantities.  If the\n    // last type was narrower than 4 bytes, promote it.  This assumes that all\n    // parameters' offsets are 4-byte-aligned, which is always the case.  Only\n    // worry about the last type, because we're not summing the type sizes,\n    // just looking at the lowest and highest offsets.\n    int remainder = highest_end % 4;\n    if (remainder) {\n      highest_end += 4 - remainder;\n    }\n\n    param_size = highest_end - lowest_base;\n  }\n\n  return param_size;\n}\n\nbool PDBSourceLineWriter::WriteMap(FILE *map_file) {\n  output_ = map_file;\n\n  bool ret = PrintPDBInfo();\n  // This is not a critical piece of the symbol file.\n  PrintPEInfo();\n  ret = ret &&\n    PrintSourceFiles() && \n    PrintFunctions() &&\n    PrintFrameData();\n\n  output_ = NULL;\n  return ret;\n}\n\nvoid PDBSourceLineWriter::Close() {\n  session_.Release();\n}\n\nbool PDBSourceLineWriter::GetModuleInfo(PDBModuleInfo *info) {\n  if (!info) {\n    return false;\n  }\n\n  info->debug_file.clear();\n  info->debug_identifier.clear();\n  info->cpu.clear();\n\n  CComPtr<IDiaSymbol> global;\n  if (FAILED(session_->get_globalScope(&global))) {\n    return false;\n  }\n\n  DWORD machine_type;\n  // get_machineType can return S_FALSE.\n  if (global->get_machineType(&machine_type) == S_OK) {\n    // The documentation claims that get_machineType returns a value from\n    // the CV_CPU_TYPE_e enumeration, but that's not the case.\n    // Instead, it returns one of the IMAGE_FILE_MACHINE values as\n    // defined here:\n    // http://msdn.microsoft.com/en-us/library/ms680313%28VS.85%29.aspx\n    switch (machine_type) {\n      case IMAGE_FILE_MACHINE_I386:\n        info->cpu = L\"x86\";\n        break;\n      case IMAGE_FILE_MACHINE_AMD64:\n        info->cpu = L\"x86_64\";\n        break;\n      default:\n        info->cpu = L\"unknown\";\n        break;\n    }\n  } else {\n    // Unexpected, but handle gracefully.\n    info->cpu = L\"unknown\";\n  }\n\n  // DWORD* and int* are not compatible.  This is clean and avoids a cast.\n  DWORD age;\n  if (FAILED(global->get_age(&age))) {\n    return false;\n  }\n\n  bool uses_guid;\n  if (!UsesGUID(&uses_guid)) {\n    return false;\n  }\n\n  if (uses_guid) {\n    GUID guid;\n    if (FAILED(global->get_guid(&guid))) {\n      return false;\n    }\n\n    // Use the same format that the MS symbol server uses in filesystem\n    // hierarchies.\n    wchar_t age_string[9];\n    swprintf(age_string, sizeof(age_string) / sizeof(age_string[0]),\n             L\"%x\", age);\n\n    // remove when VC++7.1 is no longer supported\n    age_string[sizeof(age_string) / sizeof(age_string[0]) - 1] = L'\\0';\n\n    info->debug_identifier = GUIDString::GUIDToSymbolServerWString(&guid);\n    info->debug_identifier.append(age_string);\n  } else {\n    DWORD signature;\n    if (FAILED(global->get_signature(&signature))) {\n      return false;\n    }\n\n    // Use the same format that the MS symbol server uses in filesystem\n    // hierarchies.\n    wchar_t identifier_string[17];\n    swprintf(identifier_string,\n             sizeof(identifier_string) / sizeof(identifier_string[0]),\n             L\"%08X%x\", signature, age);\n\n    // remove when VC++7.1 is no longer supported\n    identifier_string[sizeof(identifier_string) /\n                      sizeof(identifier_string[0]) - 1] = L'\\0';\n\n    info->debug_identifier = identifier_string;\n  }\n\n  CComBSTR debug_file_string;\n  if (FAILED(global->get_symbolsFileName(&debug_file_string))) {\n    return false;\n  }\n  info->debug_file =\n      WindowsStringUtils::GetBaseName(wstring(debug_file_string));\n\n  return true;\n}\n\nbool PDBSourceLineWriter::GetPEInfo(PEModuleInfo *info) {\n  if (!info) {\n    return false;\n  }\n\n  if (code_file_.empty() && !FindPEFile()) {\n    fprintf(stderr, \"Couldn't locate EXE or DLL file.\\n\");\n    return false;\n  }\n\n  // Convert wchar to native charset because ImageLoad only takes\n  // a PSTR as input.\n  string code_file;\n  if (!WindowsStringUtils::safe_wcstombs(code_file_, &code_file)) {\n    return false;\n  }\n\n  AutoImage img(ImageLoad((PSTR)code_file.c_str(), NULL));\n  if (!img) {\n    fprintf(stderr, \"Failed to open PE file: %s\\n\", code_file.c_str());\n    return false;\n  }\n\n  info->code_file = WindowsStringUtils::GetBaseName(code_file_);\n\n  // The date and time that the file was created by the linker.\n  DWORD TimeDateStamp = img->FileHeader->FileHeader.TimeDateStamp;\n  // The size of the file in bytes, including all headers.\n  DWORD SizeOfImage = 0;\n  PIMAGE_OPTIONAL_HEADER64 opt =\n    &((PIMAGE_NT_HEADERS64)img->FileHeader)->OptionalHeader;\n  if (opt->Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\n    // 64-bit PE file.\n    SizeOfImage = opt->SizeOfImage;\n  }\n  else {\n    // 32-bit PE file.\n    SizeOfImage = img->FileHeader->OptionalHeader.SizeOfImage;\n  }\n  wchar_t code_identifier[32];\n  swprintf(code_identifier,\n\t   sizeof(code_identifier) / sizeof(code_identifier[0]),\n\t   L\"%08X%X\", TimeDateStamp, SizeOfImage);\n  info->code_identifier = code_identifier;\n\n  return true;\n}\n\nbool PDBSourceLineWriter::UsesGUID(bool *uses_guid) {\n  if (!uses_guid)\n    return false;\n\n  CComPtr<IDiaSymbol> global;\n  if (FAILED(session_->get_globalScope(&global)))\n    return false;\n\n  GUID guid;\n  if (FAILED(global->get_guid(&guid)))\n    return false;\n\n  DWORD signature;\n  if (FAILED(global->get_signature(&signature)))\n    return false;\n\n  // There are two possibilities for guid: either it's a real 128-bit GUID\n  // as identified in a code module by a new-style CodeView record, or it's\n  // a 32-bit signature (timestamp) as identified by an old-style record.\n  // See MDCVInfoPDB70 and MDCVInfoPDB20 in minidump_format.h.\n  //\n  // Because DIA doesn't provide a way to directly determine whether a module\n  // uses a GUID or a 32-bit signature, this code checks whether the first 32\n  // bits of guid are the same as the signature, and if the rest of guid is\n  // zero.  If so, then with a pretty high degree of certainty, there's an\n  // old-style CodeView record in use.  This method will only falsely find an\n  // an old-style CodeView record if a real 128-bit GUID has its first 32\n  // bits set the same as the module's signature (timestamp) and the rest of\n  // the GUID is set to 0.  This is highly unlikely.\n\n  GUID signature_guid = {signature};  // 0-initializes other members\n  *uses_guid = !IsEqualGUID(guid, signature_guid);\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/common/windows/pdb_source_line_writer.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// PDBSourceLineWriter uses a pdb file produced by Visual C++ to output\n// a line/address map for use with BasicSourceLineResolver.\n\n#ifndef _PDB_SOURCE_LINE_WRITER_H__\n#define _PDB_SOURCE_LINE_WRITER_H__\n\n#include <atlcomcli.h>\n\n#include <hash_map>\n#include <string>\n\nstruct IDiaEnumLineNumbers;\nstruct IDiaSession;\nstruct IDiaSymbol;\n\nnamespace google_breakpad {\n\nusing std::wstring;\nusing stdext::hash_map;\n\n// A structure that carries information that identifies a pdb file.\nstruct PDBModuleInfo {\n public:\n  // The basename of the pdb file from which information was loaded.\n  wstring debug_file;\n\n  // The pdb's identifier.  For recent pdb files, the identifier consists\n  // of the pdb's guid, in uppercase hexadecimal form without any dashes\n  // or separators, followed immediately by the pdb's age, also in\n  // uppercase hexadecimal form.  For older pdb files which have no guid,\n  // the identifier is the pdb's 32-bit signature value, in zero-padded\n  // hexadecimal form, followed immediately by the pdb's age, in lowercase\n  // hexadecimal form.\n  wstring debug_identifier;\n\n  // A string identifying the cpu that the pdb is associated with.\n  // Currently, this may be \"x86\" or \"unknown\".\n  wstring cpu;\n};\n\n// A structure that carries information that identifies a PE file,\n// either an EXE or a DLL.\nstruct PEModuleInfo {\n  // The basename of the PE file.\n  wstring code_file;\n\n  // The PE file's code identifier, which consists of its timestamp\n  // and file size concatenated together into a single hex string.\n  // (The fields IMAGE_OPTIONAL_HEADER::SizeOfImage and\n  // IMAGE_FILE_HEADER::TimeDateStamp, as defined in the ImageHlp\n  // documentation.) This is not well documented, if it's documented\n  // at all, but it's what symstore does and what DbgHelp supports.\n  wstring code_identifier;\n};\n\nclass PDBSourceLineWriter {\n public:\n  enum FileFormat {\n    PDB_FILE,  // a .pdb file containing debug symbols\n    EXE_FILE,  // a .exe or .dll file\n    ANY_FILE   // try PDB_FILE and then EXE_FILE\n  };\n\n  explicit PDBSourceLineWriter();\n  ~PDBSourceLineWriter();\n\n  // Opens the given file.  For executable files, the corresponding pdb\n  // file must be available; Open will be if it is not.\n  // If there is already a pdb file open, it is automatically closed.\n  // Returns true on success.\n  bool Open(const wstring &file, FileFormat format);\n\n  // Locates the pdb file for the given executable (exe or dll) file,\n  // and opens it.  If there is already a pdb file open, it is automatically\n  // closed.  Returns true on success.\n  bool OpenExecutable(const wstring &exe_file);\n\n  // Writes a map file from the current pdb file to the given file stream.\n  // Returns true on success.\n  bool WriteMap(FILE *map_file);\n\n  // Closes the current pdb file and its associated resources.\n  void Close();\n\n  // Retrieves information about the module's debugging file.  Returns\n  // true on success and false on failure.\n  bool GetModuleInfo(PDBModuleInfo *info);\n\n  // Retrieves information about the module's PE file.  Returns\n  // true on success and false on failure.\n  bool GetPEInfo(PEModuleInfo *info);\n\n  // Sets uses_guid to true if the opened file uses a new-style CodeView\n  // record with a 128-bit GUID, or false if the opened file uses an old-style\n  // CodeView record.  When no GUID is available, a 32-bit signature should be\n  // used to identify the module instead.  If the information cannot be\n  // determined, this method returns false.\n  bool UsesGUID(bool *uses_guid);\n\n private:\n  // Outputs the line/address pairs for each line in the enumerator.\n  // Returns true on success.\n  bool PrintLines(IDiaEnumLineNumbers *lines);\n\n  // Outputs a function address and name, followed by its source line list.\n  // block can be the same object as function, or it can be a reference\n  // to a code block that is lexically part of this function, but\n  // resides at a separate address.\n  // Returns true on success.\n  bool PrintFunction(IDiaSymbol *function, IDiaSymbol *block);\n\n  // Outputs all functions as described above.  Returns true on success.\n  bool PrintFunctions();\n\n  // Outputs all of the source files in the session's pdb file.\n  // Returns true on success.\n  bool PrintSourceFiles();\n\n  // Outputs all of the frame information necessary to construct stack\n  // backtraces in the absence of frame pointers.  Returns true on success.\n  bool PrintFrameData();\n\n  // Outputs a single public symbol address and name, if the symbol corresponds\n  // to a code address.  Returns true on success.  If symbol is does not\n  // correspond to code, returns true without outputting anything.\n  bool PrintCodePublicSymbol(IDiaSymbol *symbol);\n\n  // Outputs a line identifying the PDB file that is being dumped, along with\n  // its uuid and age.\n  bool PrintPDBInfo();\n\n  // Outputs a line identifying the PE file corresponding to the PDB\n  // file that is being dumped, along with its code identifier,\n  // which consists of its timestamp and file size.\n  bool PrintPEInfo();\n\n  // Returns true if this filename has already been seen,\n  // and an ID is stored for it, or false if it has not.\n  bool FileIDIsCached(const wstring &file) {\n    return unique_files_.find(file) != unique_files_.end();\n  };\n\n  // Cache this filename and ID for later reuse.\n  void CacheFileID(const wstring &file, DWORD id) {\n    unique_files_[file] = id;\n  };\n\n  // Store this ID in the cache as a duplicate for this filename.\n  void StoreDuplicateFileID(const wstring &file, DWORD id) {\n    hash_map<wstring, DWORD>::iterator iter = unique_files_.find(file);\n    if (iter != unique_files_.end()) {\n      // map this id to the previously seen one\n      file_ids_[id] = iter->second;\n    }\n  };\n\n  // Given a file's unique ID, return the ID that should be used to\n  // reference it. There may be multiple files with identical filenames\n  // but different unique IDs. The cache attempts to coalesce these into\n  // one ID per unique filename.\n  DWORD GetRealFileID(DWORD id) {\n    hash_map<DWORD, DWORD>::iterator iter = file_ids_.find(id);\n    if (iter == file_ids_.end())\n      return id;\n    return iter->second;\n  };\n\n  // Find the PE file corresponding to the loaded PDB file, and\n  // set the code_file_ member. Returns false on failure.\n  bool FindPEFile();\n\n  // Returns the function name for a symbol.  If possible, the name is\n  // undecorated.  If the symbol's decorated form indicates the size of\n  // parameters on the stack, this information is returned in stack_param_size.\n  // Returns true on success.  If the symbol doesn't encode parameter size\n  // information, stack_param_size is set to -1.\n  static bool GetSymbolFunctionName(IDiaSymbol *function, BSTR *name,\n                                    int *stack_param_size);\n\n  // Returns the number of bytes of stack space used for a function's\n  // parameters.  function must have the tag SymTagFunction.  In the event of\n  // a failure, returns 0, which is also a valid number of bytes.\n  static int GetFunctionStackParamSize(IDiaSymbol *function);\n\n  // The filename of the PE file corresponding to the currently-open\n  // pdb file.\n  wstring code_file_;\n\n  // The session for the currently-open pdb file.\n  CComPtr<IDiaSession> session_;\n\n  // The current output file for this WriteMap invocation.\n  FILE *output_;\n\n  // There may be many duplicate filenames with different IDs.\n  // This maps from the DIA \"unique ID\" to a single ID per unique\n  // filename.\n  hash_map<DWORD, DWORD> file_ids_;\n  // This maps unique filenames to file IDs.\n  hash_map<wstring, DWORD> unique_files_;\n\n  // Disallow copy ctor and operator=\n  PDBSourceLineWriter(const PDBSourceLineWriter&);\n  void operator=(const PDBSourceLineWriter&);\n};\n\n}  // namespace google_breakpad\n\n#endif  // _PDB_SOURCE_LINE_WRITER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/windows/string_utils-inl.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// string_utils-inl.h: Safer string manipulation on Windows, supporting\n// pre-MSVC8 environments.\n\n#ifndef COMMON_WINDOWS_STRING_UTILS_INL_H__\n#define COMMON_WINDOWS_STRING_UTILS_INL_H__\n\n#include <stdarg.h>\n#include <wchar.h>\n\n#include <string>\n\n// The \"ll\" printf format size specifier corresponding to |long long| was\n// intrudced in MSVC8.  Earlier versions did not provide this size specifier,\n// but \"I64\" can be used to print 64-bit types.  Don't use \"I64\" where \"ll\"\n// is available, in the event of oddball systems where |long long| is not\n// 64 bits wide.\n#if _MSC_VER >= 1400  // MSVC 2005/8\n#define WIN_STRING_FORMAT_LL \"ll\"\n#else  // MSC_VER >= 1400\n#define WIN_STRING_FORMAT_LL \"I64\"\n#endif  // MSC_VER >= 1400\n\n// A nonconforming version of swprintf, without the length argument, was\n// included with the CRT prior to MSVC8.  Although a conforming version was\n// also available via an overload, it is not reliably chosen.  _snwprintf\n// behaves as a standards-confirming swprintf should, so force the use of\n// _snwprintf when using older CRTs.\n#if _MSC_VER < 1400  // MSVC 2005/8\n#define swprintf _snwprintf\n#else\n// For MSVC8 and newer, swprintf_s is the recommended method. Conveniently,\n// it takes the same argument list as swprintf.\n#define swprintf swprintf_s\n#endif  // MSC_VER < 1400\n\nnamespace google_breakpad {\n\nusing std::string;\nusing std::wstring;\n\nclass WindowsStringUtils {\n public:\n  // Roughly equivalent to MSVC8's wcscpy_s, except pre-MSVC8, this does\n  // not fail if source is longer than destination_size.  The destination\n  // buffer is always 0-terminated.\n  static void safe_wcscpy(wchar_t *destination, size_t destination_size,\n                          const wchar_t *source);\n\n  // Roughly equivalent to MSVC8's wcsncpy_s, except that _TRUNCATE cannot\n  // be passed directly, and pre-MSVC8, this will not fail if source or count\n  // are longer than destination_size.  The destination buffer is always\n  // 0-terminated.\n  static void safe_wcsncpy(wchar_t *destination, size_t destination_size,\n                           const wchar_t *source, size_t count);\n\n  // Performs multi-byte to wide character conversion on C++ strings, using\n  // mbstowcs_s (MSVC8) or mbstowcs (pre-MSVC8).  Returns false on failure,\n  // without setting wcs.\n  static bool safe_mbstowcs(const string &mbs, wstring *wcs);\n\n  // The inverse of safe_mbstowcs.\n  static bool safe_wcstombs(const wstring &wcs, string *mbs);\n\n  // Returns the base name of a file, e.g. strips off the path.\n  static wstring GetBaseName(const wstring &filename);\n\n private:\n  // Disallow instantiation and other object-based operations.\n  WindowsStringUtils();\n  WindowsStringUtils(const WindowsStringUtils&);\n  ~WindowsStringUtils();\n  void operator=(const WindowsStringUtils&);\n};\n\n// static\ninline void WindowsStringUtils::safe_wcscpy(wchar_t *destination,\n                                            size_t destination_size,\n                                            const wchar_t *source) {\n#if _MSC_VER >= 1400  // MSVC 2005/8\n  wcscpy_s(destination, destination_size, source);\n#else  // _MSC_VER >= 1400\n  // Pre-MSVC 2005/8 doesn't have wcscpy_s.  Simulate it with wcsncpy.\n  // wcsncpy doesn't 0-terminate the destination buffer if the source string\n  // is longer than size.  Ensure that the destination is 0-terminated.\n  wcsncpy(destination, source, destination_size);\n  if (destination && destination_size)\n    destination[destination_size - 1] = 0;\n#endif  // _MSC_VER >= 1400\n}\n\n// static\ninline void WindowsStringUtils::safe_wcsncpy(wchar_t *destination,\n                                             size_t destination_size,\n                                             const wchar_t *source,\n                                             size_t count) {\n#if _MSC_VER >= 1400  // MSVC 2005/8\n  wcsncpy_s(destination, destination_size, source, count);\n#else  // _MSC_VER >= 1400\n  // Pre-MSVC 2005/8 doesn't have wcsncpy_s.  Simulate it with wcsncpy.\n  // wcsncpy doesn't 0-terminate the destination buffer if the source string\n  // is longer than size.  Ensure that the destination is 0-terminated.\n  if (destination_size < count)\n    count = destination_size;\n\n  wcsncpy(destination, source, count);\n  if (destination && count)\n    destination[count - 1] = 0;\n#endif  // _MSC_VER >= 1400\n}\n\n}  // namespace google_breakpad\n\n#endif  // COMMON_WINDOWS_STRING_UTILS_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/common/windows/string_utils.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <cassert>\n#include <vector>\n\n#include \"common/windows/string_utils-inl.h\"\n\nnamespace google_breakpad {\n\n// static\nwstring WindowsStringUtils::GetBaseName(const wstring &filename) {\n  wstring base_name(filename);\n  size_t slash_pos = base_name.find_last_of(L\"/\\\\\");\n  if (slash_pos != wstring::npos) {\n    base_name.erase(0, slash_pos + 1);\n  }\n  return base_name;\n}\n\n// static\nbool WindowsStringUtils::safe_mbstowcs(const string &mbs, wstring *wcs) {\n  assert(wcs);\n\n  // First, determine the length of the destination buffer.\n  size_t wcs_length;\n\n#if _MSC_VER >= 1400  // MSVC 2005/8\n  errno_t err;\n  if ((err = mbstowcs_s(&wcs_length, NULL, 0, mbs.c_str(), _TRUNCATE)) != 0) {\n    return false;\n  }\n  assert(wcs_length > 0);\n#else  // _MSC_VER >= 1400\n  if ((wcs_length = mbstowcs(NULL, mbs.c_str(), mbs.length())) < 0) {\n    return false;\n  }\n\n  // Leave space for the 0-terminator.\n  ++wcs_length;\n#endif  // _MSC_VER >= 1400\n\n  std::vector<wchar_t> wcs_v(wcs_length);\n\n  // Now, convert.\n#if _MSC_VER >= 1400  // MSVC 2005/8\n  if ((err = mbstowcs_s(NULL, &wcs_v[0], wcs_length, mbs.c_str(),\n                        _TRUNCATE)) != 0) {\n    return false;\n  }\n#else  // _MSC_VER >= 1400\n  if (mbstowcs(&wcs_v[0], mbs.c_str(), mbs.length()) < 0) {\n    return false;\n  }\n\n  // Ensure presence of 0-terminator.\n  wcs_v[wcs_length - 1] = '\\0';\n#endif  // _MSC_VER >= 1400\n\n  *wcs = &wcs_v[0];\n  return true;\n}\n\n// static\nbool WindowsStringUtils::safe_wcstombs(const wstring &wcs, string *mbs) {\n  assert(mbs);\n\n  // First, determine the length of the destination buffer.\n  size_t mbs_length;\n\n#if _MSC_VER >= 1400  // MSVC 2005/8\n  errno_t err;\n  if ((err = wcstombs_s(&mbs_length, NULL, 0, wcs.c_str(), _TRUNCATE)) != 0) {\n    return false;\n  }\n  assert(mbs_length > 0);\n#else  // _MSC_VER >= 1400\n  if ((mbs_length = wcstombs(NULL, wcs.c_str(), wcs.length())) < 0) {\n    return false;\n  }\n\n  // Leave space for the 0-terminator.\n  ++mbs_length;\n#endif  // _MSC_VER >= 1400\n\n  std::vector<char> mbs_v(mbs_length);\n\n  // Now, convert.\n#if _MSC_VER >= 1400  // MSVC 2005/8\n  if ((err = wcstombs_s(NULL, &mbs_v[0], mbs_length, wcs.c_str(),\n                        _TRUNCATE)) != 0) {\n    return false;\n  }\n#else  // _MSC_VER >= 1400\n  if (wcstombs(&mbs_v[0], wcs.c_str(), wcs.length()) < 0) {\n    return false;\n  }\n\n  // Ensure presence of 0-terminator.\n  mbs_v[mbs_length - 1] = '\\0';\n#endif  // _MSC_VER >= 1400\n\n  *mbs = &mbs_v[0];\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/config.h.in",
    "content": "/* src/config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* Define to 1 if you have the <a.out.h> header file. */\n#undef HAVE_A_OUT_H\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#undef HAVE_INTTYPES_H\n\n/* Define to 1 if you have the <memory.h> header file. */\n#undef HAVE_MEMORY_H\n\n/* Define if you have POSIX threads libraries and header files. */\n#undef HAVE_PTHREAD\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#undef HAVE_STDINT_H\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#undef HAVE_STDLIB_H\n\n/* Define to 1 if you have the <strings.h> header file. */\n#undef HAVE_STRINGS_H\n\n/* Define to 1 if you have the <string.h> header file. */\n#undef HAVE_STRING_H\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#undef HAVE_SYS_STAT_H\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#undef HAVE_SYS_TYPES_H\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#undef HAVE_UNISTD_H\n\n/* Define to 1 if your C compiler doesn't accept -c and -o together. */\n#undef NO_MINUS_C_MINUS_O\n\n/* Name of package */\n#undef PACKAGE\n\n/* Define to the address where bug reports for this package should be sent. */\n#undef PACKAGE_BUGREPORT\n\n/* Define to the full name of this package. */\n#undef PACKAGE_NAME\n\n/* Define to the full name and version of this package. */\n#undef PACKAGE_STRING\n\n/* Define to the one symbol short name of this package. */\n#undef PACKAGE_TARNAME\n\n/* Define to the home page for this package. */\n#undef PACKAGE_URL\n\n/* Define to the version of this package. */\n#undef PACKAGE_VERSION\n\n/* Define to necessary symbol if this constant uses a non-standard name on\n   your system. */\n#undef PTHREAD_CREATE_JOINABLE\n\n/* Define to 1 if you have the ANSI C header files. */\n#undef STDC_HEADERS\n\n/* Version number of package */\n#undef VERSION\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/common/breakpad_types.h",
    "content": "/* Copyright (c) 2006, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/* breakpad_types.h: Precise-width types\n *\n * (This is C99 source, please don't corrupt it with C++.)\n *\n * This file ensures that types u_intN_t are defined for N = 8, 16, 32, and\n * 64.  Types of precise widths are crucial to the task of writing data\n * structures on one platform and reading them on another.\n *\n * Author: Mark Mentovai */\n\n#ifndef GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__\n#define GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__\n\n#ifndef _WIN32\n\n#include <sys/types.h>\n#ifndef __STDC_FORMAT_MACROS\n#define __STDC_FORMAT_MACROS\n#endif  /* __STDC_FORMAT_MACROS */\n#include <inttypes.h>\n\n#if defined(__SUNPRO_CC) || (defined(__GNUC__) && defined(__sun__))\ntypedef uint8_t u_int8_t;\ntypedef uint16_t u_int16_t;\ntypedef uint32_t u_int32_t;\ntypedef uint64_t u_int64_t;\n#endif\n\n#else  /* !_WIN32 */\n\n#include <wtypes.h>\n\ntypedef unsigned __int8  u_int8_t;\ntypedef unsigned __int16 u_int16_t;\ntypedef unsigned __int32 u_int32_t;\ntypedef unsigned __int64 u_int64_t;\n\n#endif  /* !_WIN32 */\n\ntypedef struct {\n  u_int64_t high;\n  u_int64_t low;\n} u_int128_t;\n\ntypedef u_int64_t breakpad_time_t;\n\n/* Try to get PRIx64 from inttypes.h, but if it's not defined, fall back to\n * llx, which is the format string for \"long long\" - this is a 64-bit\n * integral type on many systems. */\n#ifndef PRIx64\n#define PRIx64 \"llx\"\n#endif  /* !PRIx64 */\n\n#endif  /* GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/common/minidump_cpu_amd64.h",
    "content": "/* Copyright (c) 2006, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/* minidump_format.h: A cross-platform reimplementation of minidump-related\n * portions of DbgHelp.h from the Windows Platform SDK.\n *\n * (This is C99 source, please don't corrupt it with C++.)\n *\n * This file contains the necessary definitions to read minidump files\n * produced on amd64.  These files may be read on any platform provided\n * that the alignments of these structures on the processing system are\n * identical to the alignments of these structures on the producing system.\n * For this reason, precise-sized types are used.  The structures defined\n * by this file have been laid out to minimize alignment problems by ensuring\n * ensuring that all members are aligned on their natural boundaries.  In\n * In some cases, tail-padding may be significant when different ABIs specify\n * different tail-padding behaviors.  To avoid problems when reading or\n * writing affected structures, MD_*_SIZE macros are provided where needed,\n * containing the useful size of the structures without padding.\n *\n * Structures that are defined by Microsoft to contain a zero-length array\n * are instead defined here to contain an array with one element, as\n * zero-length arrays are forbidden by standard C and C++.  In these cases,\n * *_minsize constants are provided to be used in place of sizeof.  For a\n * cleaner interface to these sizes when using C++, see minidump_size.h.\n *\n * These structures are also sufficient to populate minidump files.\n *\n * These definitions may be extended to support handling minidump files\n * for other CPUs and other operating systems.\n *\n * Because precise data type sizes are crucial for this implementation to\n * function properly and portably in terms of interoperability with minidumps\n * produced by DbgHelp on Windows, a set of primitive types with known sizes\n * are used as the basis of each structure defined by this file.  DbgHelp\n * on Windows is assumed to be the reference implementation; this file\n * seeks to provide a cross-platform compatible implementation.  To avoid\n * collisions with the types and values defined and used by DbgHelp in the\n * event that this implementation is used on Windows, each type and value\n * defined here is given a new name, beginning with \"MD\".  Names of the\n * equivalent types and values in the Windows Platform SDK are given in\n * comments.\n *\n * Author: Mark Mentovai \n * Change to split into its own file: Neal Sidhwaney */\n\n#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__\n#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__\n\n\n/*\n * AMD64 support, see WINNT.H\n */\n\ntypedef struct {\n  u_int16_t  control_word;\n  u_int16_t  status_word;\n  u_int8_t   tag_word;\n  u_int8_t   reserved1;\n  u_int16_t  error_opcode;\n  u_int32_t  error_offset;\n  u_int16_t  error_selector;\n  u_int16_t  reserved2;\n  u_int32_t  data_offset;\n  u_int16_t  data_selector;\n  u_int16_t  reserved3;\n  u_int32_t  mx_csr;\n  u_int32_t  mx_csr_mask;\n  u_int128_t float_registers[8];\n  u_int128_t xmm_registers[16];\n  u_int8_t   reserved4[96];\n} MDXmmSaveArea32AMD64;  /* XMM_SAVE_AREA32 */\n\n#define MD_CONTEXT_AMD64_VR_COUNT 26\n\ntypedef struct {\n  /*\n   * Register parameter home addresses.\n   */\n  u_int64_t  p1_home;\n  u_int64_t  p2_home;\n  u_int64_t  p3_home;\n  u_int64_t  p4_home;\n  u_int64_t  p5_home;\n  u_int64_t  p6_home;\n\n  /* The next field determines the layout of the structure, and which parts\n   * of it are populated */\n  u_int32_t  context_flags;\n  u_int32_t  mx_csr;\n\n  /* The next register is included with MD_CONTEXT_AMD64_CONTROL */\n  u_int16_t  cs;\n\n  /* The next 4 registers are included with MD_CONTEXT_AMD64_SEGMENTS */\n  u_int16_t  ds;\n  u_int16_t  es;\n  u_int16_t  fs;\n  u_int16_t  gs;\n\n  /* The next 2 registers are included with MD_CONTEXT_AMD64_CONTROL */\n  u_int16_t  ss;\n  u_int32_t  eflags;\n  \n  /* The next 6 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */\n  u_int64_t  dr0;\n  u_int64_t  dr1;\n  u_int64_t  dr2;\n  u_int64_t  dr3;\n  u_int64_t  dr6;\n  u_int64_t  dr7;\n\n  /* The next 4 registers are included with MD_CONTEXT_AMD64_INTEGER */\n  u_int64_t  rax;\n  u_int64_t  rcx;\n  u_int64_t  rdx;\n  u_int64_t  rbx;\n\n  /* The next register is included with MD_CONTEXT_AMD64_CONTROL */\n  u_int64_t  rsp;\n\n  /* The next 11 registers are included with MD_CONTEXT_AMD64_INTEGER */\n  u_int64_t  rbp;\n  u_int64_t  rsi;\n  u_int64_t  rdi;\n  u_int64_t  r8;\n  u_int64_t  r9;\n  u_int64_t  r10;\n  u_int64_t  r11;\n  u_int64_t  r12;\n  u_int64_t  r13;\n  u_int64_t  r14;\n  u_int64_t  r15;\n\n  /* The next register is included with MD_CONTEXT_AMD64_CONTROL */\n  u_int64_t  rip;\n\n  /* The next set of registers are included with\n   * MD_CONTEXT_AMD64_FLOATING_POINT\n   */\n  union {\n    MDXmmSaveArea32AMD64 flt_save;\n    struct {\n      u_int128_t header[2];\n      u_int128_t legacy[8];\n      u_int128_t xmm0;\n      u_int128_t xmm1;\n      u_int128_t xmm2;\n      u_int128_t xmm3;\n      u_int128_t xmm4;\n      u_int128_t xmm5;\n      u_int128_t xmm6;\n      u_int128_t xmm7;\n      u_int128_t xmm8;\n      u_int128_t xmm9;\n      u_int128_t xmm10;\n      u_int128_t xmm11;\n      u_int128_t xmm12;\n      u_int128_t xmm13;\n      u_int128_t xmm14;\n      u_int128_t xmm15;\n    } sse_registers;\n  };\n\n  u_int128_t vector_register[MD_CONTEXT_AMD64_VR_COUNT];\n  u_int64_t  vector_control;\n\n  /* The next 5 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */\n  u_int64_t debug_control;\n  u_int64_t last_branch_to_rip;\n  u_int64_t last_branch_from_rip;\n  u_int64_t last_exception_to_rip;\n  u_int64_t last_exception_from_rip;\n  \n} MDRawContextAMD64;  /* CONTEXT */\n\n/* For (MDRawContextAMD64).context_flags.  These values indicate the type of\n * context stored in the structure.  The high 24 bits identify the CPU, the\n * low 8 bits identify the type of context saved. */\n#define MD_CONTEXT_AMD64 0x00100000  /* CONTEXT_AMD64 */\n#define MD_CONTEXT_AMD64_CONTROL         (MD_CONTEXT_AMD64 | 0x00000001)\n     /* CONTEXT_CONTROL */\n#define MD_CONTEXT_AMD64_INTEGER         (MD_CONTEXT_AMD64 | 0x00000002)\n     /* CONTEXT_INTEGER */\n#define MD_CONTEXT_AMD64_SEGMENTS        (MD_CONTEXT_AMD64 | 0x00000004)\n     /* CONTEXT_SEGMENTS */\n#define MD_CONTEXT_AMD64_FLOATING_POINT  (MD_CONTEXT_AMD64 | 0x00000008)\n     /* CONTEXT_FLOATING_POINT */\n#define MD_CONTEXT_AMD64_DEBUG_REGISTERS (MD_CONTEXT_AMD64 | 0x00000010)\n     /* CONTEXT_DEBUG_REGISTERS */\n#define MD_CONTEXT_AMD64_XSTATE          (MD_CONTEXT_AMD64 | 0x00000040)\n     /* CONTEXT_XSTATE */\n\n/* WinNT.h refers to CONTEXT_MMX_REGISTERS but doesn't appear to define it\n * I think it really means CONTEXT_FLOATING_POINT.\n */\n\n#define MD_CONTEXT_AMD64_FULL            (MD_CONTEXT_AMD64_CONTROL | \\\n                                          MD_CONTEXT_AMD64_INTEGER | \\\n                                          MD_CONTEXT_AMD64_FLOATING_POINT)\n     /* CONTEXT_FULL */\n\n#define MD_CONTEXT_AMD64_ALL             (MD_CONTEXT_AMD64_FULL | \\\n                                          MD_CONTEXT_AMD64_SEGMENTS | \\\n                                          MD_CONTEXT_X86_DEBUG_REGISTERS)\n     /* CONTEXT_ALL */\n\n\n#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/common/minidump_cpu_arm.h",
    "content": "/* Copyright (c) 2009, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/* minidump_format.h: A cross-platform reimplementation of minidump-related\n * portions of DbgHelp.h from the Windows Platform SDK.\n *\n * (This is C99 source, please don't corrupt it with C++.)\n *\n * This file contains the necessary definitions to read minidump files\n * produced on ARM.  These files may be read on any platform provided\n * that the alignments of these structures on the processing system are\n * identical to the alignments of these structures on the producing system.\n * For this reason, precise-sized types are used.  The structures defined\n * by this file have been laid out to minimize alignment problems by\n * ensuring that all members are aligned on their natural boundaries.\n * In some cases, tail-padding may be significant when different ABIs specify\n * different tail-padding behaviors.  To avoid problems when reading or\n * writing affected structures, MD_*_SIZE macros are provided where needed,\n * containing the useful size of the structures without padding.\n *\n * Structures that are defined by Microsoft to contain a zero-length array\n * are instead defined here to contain an array with one element, as\n * zero-length arrays are forbidden by standard C and C++.  In these cases,\n * *_minsize constants are provided to be used in place of sizeof.  For a\n * cleaner interface to these sizes when using C++, see minidump_size.h.\n *\n * These structures are also sufficient to populate minidump files.\n *\n * Because precise data type sizes are crucial for this implementation to\n * function properly and portably, a set of primitive types with known sizes\n * are used as the basis of each structure defined by this file.\n *\n * Author: Julian Seward\n */\n\n/*\n * ARM support\n */\n\n#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__\n#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__\n\n#define MD_FLOATINGSAVEAREA_ARM_FPR_COUNT 32\n#define MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT 8\n\n/*\n * Note that these structures *do not* map directly to the CONTEXT\n * structure defined in WinNT.h in the Windows Mobile SDK. That structure\n * does not accomodate VFPv3, and I'm unsure if it was ever used in the\n * wild anyway, as Windows CE only seems to produce \"cedumps\" which\n * are not exactly minidumps.\n */\ntypedef struct {\n  u_int64_t\tfpscr;      /* FPU status register */\n\n  /* 32 64-bit floating point registers, d0 .. d31. */\n  u_int64_t\tregs[MD_FLOATINGSAVEAREA_ARM_FPR_COUNT];\n\n  /* Miscellaneous control words */\n  u_int32_t     extra[MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT];\n} MDFloatingSaveAreaARM;\n\n#define MD_CONTEXT_ARM_GPR_COUNT 16\n\ntypedef struct {\n  /* The next field determines the layout of the structure, and which parts\n   * of it are populated\n   */\n  u_int32_t\tcontext_flags;\n\n  /* 16 32-bit integer registers, r0 .. r15\n   * Note the following fixed uses:\n   *   r13 is the stack pointer\n   *   r14 is the link register\n   *   r15 is the program counter\n   */\n  u_int32_t     iregs[MD_CONTEXT_ARM_GPR_COUNT];\n\n  /* CPSR (flags, basically): 32 bits:\n        bit 31 - N (negative)\n        bit 30 - Z (zero)\n        bit 29 - C (carry)\n        bit 28 - V (overflow)\n        bit 27 - Q (saturation flag, sticky)\n     All other fields -- ignore */\n  u_int32_t    cpsr;\n\n  /* The next field is included with MD_CONTEXT_ARM_FLOATING_POINT */\n  MDFloatingSaveAreaARM float_save;\n\n} MDRawContextARM;\n\n/* Indices into iregs for registers with a dedicated or conventional \n * purpose.\n */\nenum MDARMRegisterNumbers {\n  MD_CONTEXT_ARM_REG_IOS_FP = 7,\n  MD_CONTEXT_ARM_REG_FP     = 11,\n  MD_CONTEXT_ARM_REG_SP     = 13,\n  MD_CONTEXT_ARM_REG_LR     = 14,\n  MD_CONTEXT_ARM_REG_PC     = 15\n};\n\n/* For (MDRawContextARM).context_flags.  These values indicate the type of\n * context stored in the structure. */\n/* CONTEXT_ARM from the Windows CE 5.0 SDK. This value isn't correct\n * because this bit can be used for flags. Presumably this value was\n * never actually used in minidumps, but only in \"CEDumps\" which\n * are a whole parallel minidump file format for Windows CE.\n * Therefore, Breakpad defines its own value for ARM CPUs.\n */\n#define MD_CONTEXT_ARM_OLD               0x00000040\n/* This value was chosen to avoid likely conflicts with MD_CONTEXT_*\n * for other CPUs. */\n#define MD_CONTEXT_ARM                   0x40000000\n#define MD_CONTEXT_ARM_INTEGER           (MD_CONTEXT_ARM | 0x00000002)\n#define MD_CONTEXT_ARM_FLOATING_POINT    (MD_CONTEXT_ARM | 0x00000004)\n\n#define MD_CONTEXT_ARM_FULL              (MD_CONTEXT_ARM_INTEGER | \\\n                                          MD_CONTEXT_ARM_FLOATING_POINT)\n\n#define MD_CONTEXT_ARM_ALL               (MD_CONTEXT_ARM_INTEGER | \\\n                                          MD_CONTEXT_ARM_FLOATING_POINT)\n\n#endif  /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/common/minidump_cpu_ppc.h",
    "content": "/* Copyright (c) 2006, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/* minidump_format.h: A cross-platform reimplementation of minidump-related\n * portions of DbgHelp.h from the Windows Platform SDK.\n *\n * (This is C99 source, please don't corrupt it with C++.)\n *\n * This file contains the necessary definitions to read minidump files\n * produced on ppc.  These files may be read on any platform provided\n * that the alignments of these structures on the processing system are\n * identical to the alignments of these structures on the producing system.\n * For this reason, precise-sized types are used.  The structures defined\n * by this file have been laid out to minimize alignment problems by ensuring\n * ensuring that all members are aligned on their natural boundaries.  In\n * In some cases, tail-padding may be significant when different ABIs specify\n * different tail-padding behaviors.  To avoid problems when reading or\n * writing affected structures, MD_*_SIZE macros are provided where needed,\n * containing the useful size of the structures without padding.\n *\n * Structures that are defined by Microsoft to contain a zero-length array\n * are instead defined here to contain an array with one element, as\n * zero-length arrays are forbidden by standard C and C++.  In these cases,\n * *_minsize constants are provided to be used in place of sizeof.  For a\n * cleaner interface to these sizes when using C++, see minidump_size.h.\n *\n * These structures are also sufficient to populate minidump files.\n *\n * These definitions may be extended to support handling minidump files\n * for other CPUs and other operating systems.\n *\n * Because precise data type sizes are crucial for this implementation to\n * function properly and portably in terms of interoperability with minidumps\n * produced by DbgHelp on Windows, a set of primitive types with known sizes\n * are used as the basis of each structure defined by this file.  DbgHelp\n * on Windows is assumed to be the reference implementation; this file\n * seeks to provide a cross-platform compatible implementation.  To avoid\n * collisions with the types and values defined and used by DbgHelp in the\n * event that this implementation is used on Windows, each type and value\n * defined here is given a new name, beginning with \"MD\".  Names of the\n * equivalent types and values in the Windows Platform SDK are given in\n * comments.\n *\n * Author: Mark Mentovai \n * Change to split into its own file: Neal Sidhwaney */\n\n/*\n * Breakpad minidump extension for PowerPC support.  Based on Darwin/Mac OS X'\n * mach/ppc/_types.h\n */\n\n#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__\n#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__\n\n#define MD_FLOATINGSAVEAREA_PPC_FPR_COUNT 32\n\ntypedef struct {\n  /* fpregs is a double[32] in mach/ppc/_types.h, but a u_int64_t is used\n   * here for precise sizing. */\n  u_int64_t fpregs[MD_FLOATINGSAVEAREA_PPC_FPR_COUNT];\n  u_int32_t fpscr_pad;\n  u_int32_t fpscr;      /* Status/control */\n} MDFloatingSaveAreaPPC;  /* Based on ppc_float_state */\n\n\n#define MD_VECTORSAVEAREA_PPC_VR_COUNT 32\n\ntypedef struct {\n  /* Vector registers (including vscr) are 128 bits, but mach/ppc/_types.h\n   * exposes them as four 32-bit quantities. */\n  u_int128_t save_vr[MD_VECTORSAVEAREA_PPC_VR_COUNT];\n  u_int128_t save_vscr;  /* Status/control */\n  u_int32_t  save_pad5[4];\n  u_int32_t  save_vrvalid;  /* Identifies which vector registers are saved */\n  u_int32_t  save_pad6[7];\n} MDVectorSaveAreaPPC;  /* ppc_vector_state */\n\n\n#define MD_CONTEXT_PPC_GPR_COUNT 32\n\n/* Use the same 32-bit alignment when accessing this structure from 64-bit code\n * as is used natively in 32-bit code.  #pragma pack is a MSVC extension\n * supported by gcc. */\n#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)\n#pragma pack(4)\n#else\n#pragma pack(push, 4)\n#endif\n\ntypedef struct {\n  /* context_flags is not present in ppc_thread_state, but it aids\n   * identification of MDRawContextPPC among other raw context types,\n   * and it guarantees alignment when we get to float_save. */\n  u_int32_t             context_flags;\n\n  u_int32_t             srr0;    /* Machine status save/restore: stores pc\n                                  * (instruction) */\n  u_int32_t             srr1;    /* Machine status save/restore: stores msr\n                                  * (ps, program/machine state) */\n  /* ppc_thread_state contains 32 fields, r0 .. r31.  Here, an array is\n   * used for brevity. */\n  u_int32_t             gpr[MD_CONTEXT_PPC_GPR_COUNT];\n  u_int32_t             cr;      /* Condition */\n  u_int32_t             xer;     /* Integer (fiXed-point) exception */\n  u_int32_t             lr;      /* Link */\n  u_int32_t             ctr;     /* Count */\n  u_int32_t             mq;      /* Multiply/Quotient (PPC 601, POWER only) */\n  u_int32_t             vrsave;  /* Vector save */\n\n  /* float_save and vector_save aren't present in ppc_thread_state, but\n   * are represented in separate structures that still define a thread's\n   * context. */\n  MDFloatingSaveAreaPPC float_save;\n  MDVectorSaveAreaPPC   vector_save;\n} MDRawContextPPC;  /* Based on ppc_thread_state */\n\n#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)\n#pragma pack(0)\n#else\n#pragma pack(pop)\n#endif\n\n/* For (MDRawContextPPC).context_flags.  These values indicate the type of\n * context stored in the structure.  MD_CONTEXT_PPC is Breakpad-defined.  Its\n * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other\n * CPUs. */\n#define MD_CONTEXT_PPC                0x20000000\n#define MD_CONTEXT_PPC_BASE           (MD_CONTEXT_PPC | 0x00000001)\n#define MD_CONTEXT_PPC_FLOATING_POINT (MD_CONTEXT_PPC | 0x00000008)\n#define MD_CONTEXT_PPC_VECTOR         (MD_CONTEXT_PPC | 0x00000020)\n\n#define MD_CONTEXT_PPC_FULL           MD_CONTEXT_PPC_BASE\n#define MD_CONTEXT_PPC_ALL            (MD_CONTEXT_PPC_FULL | \\\n                                       MD_CONTEXT_PPC_FLOATING_POINT | \\\n                                       MD_CONTEXT_PPC_VECTOR)\n\n#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/common/minidump_cpu_ppc64.h",
    "content": "/* Copyright (c) 2008, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/* minidump_format.h: A cross-platform reimplementation of minidump-related\n * portions of DbgHelp.h from the Windows Platform SDK.\n *\n * (This is C99 source, please don't corrupt it with C++.)\n *\n * This file contains the necessary definitions to read minidump files\n * produced on ppc64.  These files may be read on any platform provided\n * that the alignments of these structures on the processing system are\n * identical to the alignments of these structures on the producing system.\n * For this reason, precise-sized types are used.  The structures defined\n * by this file have been laid out to minimize alignment problems by ensuring\n * ensuring that all members are aligned on their natural boundaries.  In\n * In some cases, tail-padding may be significant when different ABIs specify\n * different tail-padding behaviors.  To avoid problems when reading or\n * writing affected structures, MD_*_SIZE macros are provided where needed,\n * containing the useful size of the structures without padding.\n *\n * Structures that are defined by Microsoft to contain a zero-length array\n * are instead defined here to contain an array with one element, as\n * zero-length arrays are forbidden by standard C and C++.  In these cases,\n * *_minsize constants are provided to be used in place of sizeof.  For a\n * cleaner interface to these sizes when using C++, see minidump_size.h.\n *\n * These structures are also sufficient to populate minidump files.\n *\n * These definitions may be extended to support handling minidump files\n * for other CPUs and other operating systems.\n *\n * Because precise data type sizes are crucial for this implementation to\n * function properly and portably in terms of interoperability with minidumps\n * produced by DbgHelp on Windows, a set of primitive types with known sizes\n * are used as the basis of each structure defined by this file.  DbgHelp\n * on Windows is assumed to be the reference implementation; this file\n * seeks to provide a cross-platform compatible implementation.  To avoid\n * collisions with the types and values defined and used by DbgHelp in the\n * event that this implementation is used on Windows, each type and value\n * defined here is given a new name, beginning with \"MD\".  Names of the\n * equivalent types and values in the Windows Platform SDK are given in\n * comments.\n *\n * Author: Neal Sidhwaney */\n\n\n/*\n * Breakpad minidump extension for PPC64 support.  Based on Darwin/Mac OS X'\n * mach/ppc/_types.h\n */\n\n#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__\n#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__\n\n#include \"minidump_cpu_ppc.h\"\n\n// these types are the same in ppc64 & ppc\ntypedef MDFloatingSaveAreaPPC MDFloatingSaveAreaPPC64;\ntypedef MDVectorSaveAreaPPC MDVectorSaveAreaPPC64;\n\n#define MD_CONTEXT_PPC64_GPR_COUNT MD_CONTEXT_PPC_GPR_COUNT\n\ntypedef struct {\n  /* context_flags is not present in ppc_thread_state, but it aids\n   * identification of MDRawContextPPC among other raw context types,\n   * and it guarantees alignment when we get to float_save. */\n  u_int64_t             context_flags;\n\n  u_int64_t             srr0;    /* Machine status save/restore: stores pc\n                                  * (instruction) */\n  u_int64_t             srr1;    /* Machine status save/restore: stores msr\n                                  * (ps, program/machine state) */\n  /* ppc_thread_state contains 32 fields, r0 .. r31.  Here, an array is\n   * used for brevity. */\n  u_int64_t             gpr[MD_CONTEXT_PPC64_GPR_COUNT];\n  u_int64_t             cr;      /* Condition */\n  u_int64_t             xer;     /* Integer (fiXed-point) exception */\n  u_int64_t             lr;      /* Link */\n  u_int64_t             ctr;     /* Count */\n  u_int64_t             vrsave;  /* Vector save */\n\n  /* float_save and vector_save aren't present in ppc_thread_state, but\n   * are represented in separate structures that still define a thread's\n   * context. */\n  MDFloatingSaveAreaPPC float_save;\n  MDVectorSaveAreaPPC   vector_save;\n} MDRawContextPPC64;  /* Based on ppc_thread_state */\n\n/* For (MDRawContextPPC).context_flags.  These values indicate the type of\n * context stored in the structure.  MD_CONTEXT_PPC is Breakpad-defined.  Its\n * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other\n * CPUs. */\n#define MD_CONTEXT_PPC                0x20000000\n#define MD_CONTEXT_PPC_BASE           (MD_CONTEXT_PPC | 0x00000001)\n#define MD_CONTEXT_PPC_FLOATING_POINT (MD_CONTEXT_PPC | 0x00000008)\n#define MD_CONTEXT_PPC_VECTOR         (MD_CONTEXT_PPC | 0x00000020)\n\n#define MD_CONTEXT_PPC_FULL           MD_CONTEXT_PPC_BASE\n#define MD_CONTEXT_PPC_ALL            (MD_CONTEXT_PPC_FULL | \\\n                                       MD_CONTEXT_PPC_FLOATING_POINT | \\\n                                       MD_CONTEXT_PPC_VECTOR)\n\n#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/common/minidump_cpu_sparc.h",
    "content": "/* Copyright (c) 2006, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/* minidump_format.h: A cross-platform reimplementation of minidump-related\n * portions of DbgHelp.h from the Windows Platform SDK.\n *\n * (This is C99 source, please don't corrupt it with C++.)\n *\n * This file contains the necessary definitions to read minidump files\n * produced on sparc.  These files may be read on any platform provided\n * that the alignments of these structures on the processing system are\n * identical to the alignments of these structures on the producing system.\n * For this reason, precise-sized types are used.  The structures defined\n * by this file have been laid out to minimize alignment problems by ensuring\n * ensuring that all members are aligned on their natural boundaries.  In\n * In some cases, tail-padding may be significant when different ABIs specify\n * different tail-padding behaviors.  To avoid problems when reading or\n * writing affected structures, MD_*_SIZE macros are provided where needed,\n * containing the useful size of the structures without padding.\n *\n * Structures that are defined by Microsoft to contain a zero-length array\n * are instead defined here to contain an array with one element, as\n * zero-length arrays are forbidden by standard C and C++.  In these cases,\n * *_minsize constants are provided to be used in place of sizeof.  For a\n * cleaner interface to these sizes when using C++, see minidump_size.h.\n *\n * These structures are also sufficient to populate minidump files.\n *\n * These definitions may be extended to support handling minidump files\n * for other CPUs and other operating systems.\n *\n * Because precise data type sizes are crucial for this implementation to\n * function properly and portably in terms of interoperability with minidumps\n * produced by DbgHelp on Windows, a set of primitive types with known sizes\n * are used as the basis of each structure defined by this file.  DbgHelp\n * on Windows is assumed to be the reference implementation; this file\n * seeks to provide a cross-platform compatible implementation.  To avoid\n * collisions with the types and values defined and used by DbgHelp in the\n * event that this implementation is used on Windows, each type and value\n * defined here is given a new name, beginning with \"MD\".  Names of the\n * equivalent types and values in the Windows Platform SDK are given in\n * comments.\n *\n * Author: Mark Mentovai\n * Change to split into its own file: Neal Sidhwaney */\n\n/*\n * SPARC support, see (solaris)sys/procfs_isa.h also\n */\n\n#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__\n#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__\n\n#define MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT 32\n\ntypedef struct {\n\n  /* FPU floating point regs */\n  u_int64_t\tregs[MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT];\n\n  u_int64_t\tfiller;\n  u_int64_t\tfsr;        /* FPU status register */\n} MDFloatingSaveAreaSPARC;  /* FLOATING_SAVE_AREA */\n\n#define MD_CONTEXT_SPARC_GPR_COUNT 32\n\ntypedef struct {\n  /* The next field determines the layout of the structure, and which parts\n   * of it are populated\n   */\n  u_int32_t\tcontext_flags;\n  u_int32_t\tflag_pad;\n  /*\n   * General register access (SPARC).\n   * Don't confuse definitions here with definitions in <sys/regset.h>.\n   * Registers are 32 bits for ILP32, 64 bits for LP64.\n   * SPARC V7/V8 is for 32bit, SPARC V9 is for 64bit\n   */\n\n  /* 32 Integer working registers */\n\n  /* g_r[0-7]   global registers(g0-g7)\n   * g_r[8-15]  out registers(o0-o7)\n   * g_r[16-23] local registers(l0-l7)\n   * g_r[24-31] in registers(i0-i7)\n   */\n  u_int64_t     g_r[MD_CONTEXT_SPARC_GPR_COUNT];\n\n  /* several control registers */\n\n  /* Processor State register(PSR) for SPARC V7/V8\n   * Condition Code register (CCR) for SPARC V9\n   */\n  u_int64_t     ccr;\n\n  u_int64_t     pc;     /* Program Counter register (PC) */\n  u_int64_t     npc;    /* Next Program Counter register (nPC) */\n  u_int64_t     y;      /* Y register (Y) */\n\n  /* Address Space Identifier register (ASI) for SPARC V9\n   * WIM for SPARC V7/V8\n   */\n  u_int64_t     asi;\n\n  /* Floating-Point Registers State register (FPRS) for SPARC V9\n   * TBR for for SPARC V7/V8\n   */\n  u_int64_t     fprs;\n\n  /* The next field is included with MD_CONTEXT_SPARC_FLOATING_POINT */\n  MDFloatingSaveAreaSPARC float_save;\n\n} MDRawContextSPARC;  /* CONTEXT_SPARC */\n\n/* For (MDRawContextSPARC).context_flags.  These values indicate the type of\n * context stored in the structure.  MD_CONTEXT_SPARC is Breakpad-defined.  Its\n * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other\n * CPUs. */\n#define MD_CONTEXT_SPARC                 0x10000000\n#define MD_CONTEXT_SPARC_CONTROL         (MD_CONTEXT_SPARC | 0x00000001)\n#define MD_CONTEXT_SPARC_INTEGER         (MD_CONTEXT_SPARC | 0x00000002)\n#define MD_CONTEXT_SAPARC_FLOATING_POINT (MD_CONTEXT_SPARC | 0x00000004)\n#define MD_CONTEXT_SAPARC_EXTRA          (MD_CONTEXT_SPARC | 0x00000008)\n\n#define MD_CONTEXT_SPARC_FULL            (MD_CONTEXT_SPARC_CONTROL | \\\n                                          MD_CONTEXT_SPARC_INTEGER)\n\n#define MD_CONTEXT_SPARC_ALL             (MD_CONTEXT_SPARC_FULL | \\\n                                          MD_CONTEXT_SAPARC_FLOATING_POINT | \\\n                                          MD_CONTEXT_SAPARC_EXTRA)\n\n#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/common/minidump_cpu_x86.h",
    "content": "/* Copyright (c) 2006, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/* minidump_format.h: A cross-platform reimplementation of minidump-related\n * portions of DbgHelp.h from the Windows Platform SDK.\n *\n * (This is C99 source, please don't corrupt it with C++.)\n *\n * This file contains the necessary definitions to read minidump files\n * produced on x86.  These files may be read on any platform provided\n * that the alignments of these structures on the processing system are\n * identical to the alignments of these structures on the producing system.\n * For this reason, precise-sized types are used.  The structures defined\n * by this file have been laid out to minimize alignment problems by ensuring\n * ensuring that all members are aligned on their natural boundaries.  In\n * In some cases, tail-padding may be significant when different ABIs specify\n * different tail-padding behaviors.  To avoid problems when reading or\n * writing affected structures, MD_*_SIZE macros are provided where needed,\n * containing the useful size of the structures without padding.\n *\n * Structures that are defined by Microsoft to contain a zero-length array\n * are instead defined here to contain an array with one element, as\n * zero-length arrays are forbidden by standard C and C++.  In these cases,\n * *_minsize constants are provided to be used in place of sizeof.  For a\n * cleaner interface to these sizes when using C++, see minidump_size.h.\n *\n * These structures are also sufficient to populate minidump files.\n *\n * These definitions may be extended to support handling minidump files\n * for other CPUs and other operating systems.\n *\n * Because precise data type sizes are crucial for this implementation to\n * function properly and portably in terms of interoperability with minidumps\n * produced by DbgHelp on Windows, a set of primitive types with known sizes\n * are used as the basis of each structure defined by this file.  DbgHelp\n * on Windows is assumed to be the reference implementation; this file\n * seeks to provide a cross-platform compatible implementation.  To avoid\n * collisions with the types and values defined and used by DbgHelp in the\n * event that this implementation is used on Windows, each type and value\n * defined here is given a new name, beginning with \"MD\".  Names of the\n * equivalent types and values in the Windows Platform SDK are given in\n * comments.\n *\n * Author: Mark Mentovai */\n\n#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__\n#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__\n\n#define MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE 80\n     /* SIZE_OF_80387_REGISTERS */\n\ntypedef struct {\n  u_int32_t control_word;\n  u_int32_t status_word;\n  u_int32_t tag_word;\n  u_int32_t error_offset;\n  u_int32_t error_selector;\n  u_int32_t data_offset;\n  u_int32_t data_selector;\n\n  /* register_area contains eight 80-bit (x87 \"long double\") quantities for\n   * floating-point registers %st0 (%mm0) through %st7 (%mm7). */\n  u_int8_t  register_area[MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE];\n  u_int32_t cr0_npx_state;\n} MDFloatingSaveAreaX86;  /* FLOATING_SAVE_AREA */\n\n\n#define MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE 512\n     /* MAXIMUM_SUPPORTED_EXTENSION */\n\ntypedef struct {\n  /* The next field determines the layout of the structure, and which parts\n   * of it are populated */\n  u_int32_t             context_flags;\n\n  /* The next 6 registers are included with MD_CONTEXT_X86_DEBUG_REGISTERS */\n  u_int32_t             dr0;\n  u_int32_t             dr1;\n  u_int32_t             dr2;\n  u_int32_t             dr3;\n  u_int32_t             dr6;\n  u_int32_t             dr7;\n\n  /* The next field is included with MD_CONTEXT_X86_FLOATING_POINT */\n  MDFloatingSaveAreaX86 float_save;\n\n  /* The next 4 registers are included with MD_CONTEXT_X86_SEGMENTS */\n  u_int32_t             gs; \n  u_int32_t             fs;\n  u_int32_t             es;\n  u_int32_t             ds;\n  /* The next 6 registers are included with MD_CONTEXT_X86_INTEGER */\n  u_int32_t             edi;\n  u_int32_t             esi;\n  u_int32_t             ebx;\n  u_int32_t             edx;\n  u_int32_t             ecx;\n  u_int32_t             eax;\n\n  /* The next 6 registers are included with MD_CONTEXT_X86_CONTROL */\n  u_int32_t             ebp;\n  u_int32_t             eip;\n  u_int32_t             cs;      /* WinNT.h says \"must be sanitized\" */\n  u_int32_t             eflags;  /* WinNT.h says \"must be sanitized\" */\n  u_int32_t             esp;\n  u_int32_t             ss;\n\n  /* The next field is included with MD_CONTEXT_X86_EXTENDED_REGISTERS.\n   * It contains vector (MMX/SSE) registers.  It it laid out in the\n   * format used by the fxsave and fsrstor instructions, so it includes\n   * a copy of the x87 floating-point registers as well.  See FXSAVE in\n   * \"Intel Architecture Software Developer's Manual, Volume 2.\" */\n  u_int8_t              extended_registers[\n                         MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE];\n} MDRawContextX86;  /* CONTEXT */\n\n/* For (MDRawContextX86).context_flags.  These values indicate the type of\n * context stored in the structure.  The high 24 bits identify the CPU, the\n * low 8 bits identify the type of context saved. */\n#define MD_CONTEXT_X86                    0x00010000\n     /* CONTEXT_i386, CONTEXT_i486: identifies CPU */\n#define MD_CONTEXT_X86_CONTROL            (MD_CONTEXT_X86 | 0x00000001)\n     /* CONTEXT_CONTROL */\n#define MD_CONTEXT_X86_INTEGER            (MD_CONTEXT_X86 | 0x00000002)\n     /* CONTEXT_INTEGER */\n#define MD_CONTEXT_X86_SEGMENTS           (MD_CONTEXT_X86 | 0x00000004)\n     /* CONTEXT_SEGMENTS */\n#define MD_CONTEXT_X86_FLOATING_POINT     (MD_CONTEXT_X86 | 0x00000008)\n     /* CONTEXT_FLOATING_POINT */\n#define MD_CONTEXT_X86_DEBUG_REGISTERS    (MD_CONTEXT_X86 | 0x00000010)\n     /* CONTEXT_DEBUG_REGISTERS */\n#define MD_CONTEXT_X86_EXTENDED_REGISTERS (MD_CONTEXT_X86 | 0x00000020)\n     /* CONTEXT_EXTENDED_REGISTERS */\n#define MD_CONTEXT_X86_XSTATE             (MD_CONTEXT_X86 | 0x00000040)\n     /* CONTEXT_XSTATE */\n\n#define MD_CONTEXT_X86_FULL              (MD_CONTEXT_X86_CONTROL | \\\n                                          MD_CONTEXT_X86_INTEGER | \\\n                                          MD_CONTEXT_X86_SEGMENTS)\n     /* CONTEXT_FULL */\n\n#define MD_CONTEXT_X86_ALL               (MD_CONTEXT_X86_FULL | \\\n                                          MD_CONTEXT_X86_FLOATING_POINT | \\\n                                          MD_CONTEXT_X86_DEBUG_REGISTERS | \\\n                                          MD_CONTEXT_X86_EXTENDED_REGISTERS)\n     /* CONTEXT_ALL */\n\n#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/common/minidump_exception_linux.h",
    "content": "/* Copyright (c) 2006, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/* minidump_exception_linux.h: A definition of exception codes for\n * Linux\n *\n * (This is C99 source, please don't corrupt it with C++.)\n *\n * Author: Mark Mentovai\n * Split into its own file: Neal Sidhwaney */\n \n\n#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__\n#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__\n\n#include <stddef.h>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\n\n/* For (MDException).exception_code.  These values come from bits/signum.h.\n */\ntypedef enum {\n  MD_EXCEPTION_CODE_LIN_SIGHUP = 1,      /* Hangup (POSIX) */\n  MD_EXCEPTION_CODE_LIN_SIGINT = 2,      /* Interrupt (ANSI) */\n  MD_EXCEPTION_CODE_LIN_SIGQUIT = 3,     /* Quit (POSIX) */\n  MD_EXCEPTION_CODE_LIN_SIGILL = 4,      /* Illegal instruction (ANSI) */\n  MD_EXCEPTION_CODE_LIN_SIGTRAP = 5,     /* Trace trap (POSIX) */\n  MD_EXCEPTION_CODE_LIN_SIGABRT = 6,     /* Abort (ANSI) */\n  MD_EXCEPTION_CODE_LIN_SIGBUS = 7,      /* BUS error (4.2 BSD) */\n  MD_EXCEPTION_CODE_LIN_SIGFPE = 8,      /* Floating-point exception (ANSI) */\n  MD_EXCEPTION_CODE_LIN_SIGKILL = 9,     /* Kill, unblockable (POSIX) */\n  MD_EXCEPTION_CODE_LIN_SIGUSR1 = 10,    /* User-defined signal 1 (POSIX).  */\n  MD_EXCEPTION_CODE_LIN_SIGSEGV = 11,    /* Segmentation violation (ANSI) */\n  MD_EXCEPTION_CODE_LIN_SIGUSR2 = 12,    /* User-defined signal 2 (POSIX) */\n  MD_EXCEPTION_CODE_LIN_SIGPIPE = 13,    /* Broken pipe (POSIX) */\n  MD_EXCEPTION_CODE_LIN_SIGALRM = 14,    /* Alarm clock (POSIX) */\n  MD_EXCEPTION_CODE_LIN_SIGTERM = 15,    /* Termination (ANSI) */\n  MD_EXCEPTION_CODE_LIN_SIGSTKFLT = 16,  /* Stack faultd */\n  MD_EXCEPTION_CODE_LIN_SIGCHLD = 17,    /* Child status has changed (POSIX) */\n  MD_EXCEPTION_CODE_LIN_SIGCONT = 18,    /* Continue (POSIX) */\n  MD_EXCEPTION_CODE_LIN_SIGSTOP = 19,    /* Stop, unblockable (POSIX) */\n  MD_EXCEPTION_CODE_LIN_SIGTSTP = 20,    /* Keyboard stop (POSIX) */\n  MD_EXCEPTION_CODE_LIN_SIGTTIN = 21,    /* Background read from tty (POSIX) */\n  MD_EXCEPTION_CODE_LIN_SIGTTOU = 22,    /* Background write to tty (POSIX) */\n  MD_EXCEPTION_CODE_LIN_SIGURG = 23,\n    /* Urgent condition on socket (4.2 BSD) */\n  MD_EXCEPTION_CODE_LIN_SIGXCPU = 24,    /* CPU limit exceeded (4.2 BSD) */\n  MD_EXCEPTION_CODE_LIN_SIGXFSZ = 25,\n    /* File size limit exceeded (4.2 BSD) */\n  MD_EXCEPTION_CODE_LIN_SIGVTALRM = 26,  /* Virtual alarm clock (4.2 BSD) */\n  MD_EXCEPTION_CODE_LIN_SIGPROF = 27,    /* Profiling alarm clock (4.2 BSD) */\n  MD_EXCEPTION_CODE_LIN_SIGWINCH = 28,   /* Window size change (4.3 BSD, Sun) */\n  MD_EXCEPTION_CODE_LIN_SIGIO = 29,      /* I/O now possible (4.2 BSD) */\n  MD_EXCEPTION_CODE_LIN_SIGPWR = 30,     /* Power failure restart (System V) */\n  MD_EXCEPTION_CODE_LIN_SIGSYS = 31      /* Bad system call */\n} MDExceptionCodeLinux;\n\n#endif  /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/common/minidump_exception_mac.h",
    "content": "/* Copyright (c) 2006, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/* minidump_exception_mac.h: A definition of exception codes for Mac\n * OS X\n *\n * (This is C99 source, please don't corrupt it with C++.)\n *\n * Author: Mark Mentovai\n * Split into its own file: Neal Sidhwaney */\n \n\n#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__\n#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__\n\n#include <stddef.h>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\n/* For (MDException).exception_code.  Breakpad minidump extension for Mac OS X\n * support.  Based on Darwin/Mac OS X' mach/exception_types.h.  This is\n * what Mac OS X calls an \"exception\", not a \"code\". */\ntypedef enum {\n  /* Exception code.  The high 16 bits of exception_code contains one of\n   * these values. */\n  MD_EXCEPTION_MAC_BAD_ACCESS      = 1,  /* code can be a kern_return_t */\n      /* EXC_BAD_ACCESS */\n  MD_EXCEPTION_MAC_BAD_INSTRUCTION = 2,  /* code is CPU-specific */\n      /* EXC_BAD_INSTRUCTION */\n  MD_EXCEPTION_MAC_ARITHMETIC      = 3,  /* code is CPU-specific */\n      /* EXC_ARITHMETIC */\n  MD_EXCEPTION_MAC_EMULATION       = 4,  /* code is CPU-specific */\n      /* EXC_EMULATION */\n  MD_EXCEPTION_MAC_SOFTWARE        = 5,\n      /* EXC_SOFTWARE */\n  MD_EXCEPTION_MAC_BREAKPOINT      = 6,  /* code is CPU-specific */\n      /* EXC_BREAKPOINT */\n  MD_EXCEPTION_MAC_SYSCALL         = 7,\n      /* EXC_SYSCALL */\n  MD_EXCEPTION_MAC_MACH_SYSCALL    = 8,\n      /* EXC_MACH_SYSCALL */\n  MD_EXCEPTION_MAC_RPC_ALERT       = 9\n      /* EXC_RPC_ALERT */\n} MDExceptionMac;\n\n/* For (MDException).exception_flags.  Breakpad minidump extension for Mac OS X\n * support.  Based on Darwin/Mac OS X' mach/ppc/exception.h and\n * mach/i386/exception.h.  This is what Mac OS X calls a \"code\". */\ntypedef enum {\n  /* With MD_EXCEPTION_BAD_ACCESS.  These are relevant kern_return_t values\n   * from mach/kern_return.h. */\n  MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS    =  1,\n      /* KERN_INVALID_ADDRESS */\n  MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE =  2,\n      /* KERN_PROTECTION_FAILURE */\n  MD_EXCEPTION_CODE_MAC_NO_ACCESS          =  8,\n      /* KERN_NO_ACCESS */\n  MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE     =  9,\n      /* KERN_MEMORY_FAILURE */\n  MD_EXCEPTION_CODE_MAC_MEMORY_ERROR       = 10,\n      /* KERN_MEMORY_ERROR */\n\n  /* With MD_EXCEPTION_SOFTWARE */\n  MD_EXCEPTION_CODE_MAC_BAD_SYSCALL  = 0x00010000,  /* Mach SIGSYS */\n  MD_EXCEPTION_CODE_MAC_BAD_PIPE     = 0x00010001,  /* Mach SIGPIPE */\n  MD_EXCEPTION_CODE_MAC_ABORT        = 0x00010002,  /* Mach SIGABRT */\n  /* Custom values */\n  MD_EXCEPTION_CODE_MAC_NS_EXCEPTION = 0xDEADC0DE,  /* uncaught NSException */\n\n  /* With MD_EXCEPTION_MAC_BAD_ACCESS on ppc */\n  MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ = 0x0101,\n      /* EXC_PPC_VM_PROT_READ */\n  MD_EXCEPTION_CODE_MAC_PPC_BADSPACE     = 0x0102,\n      /* EXC_PPC_BADSPACE */\n  MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED    = 0x0103,\n      /* EXC_PPC_UNALIGNED */\n\n  /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on ppc */\n  MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL           = 1,\n      /* EXC_PPC_INVALID_SYSCALL */\n  MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION = 2,\n      /* EXC_PPC_UNIPL_INST */\n  MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION    = 3,\n      /* EXC_PPC_PRIVINST */\n  MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER       = 4,\n      /* EXC_PPC_PRIVREG */\n  MD_EXCEPTION_CODE_MAC_PPC_TRACE                     = 5,\n      /* EXC_PPC_TRACE */\n  MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR       = 6,\n      /* EXC_PPC_PERFMON */\n\n  /* With MD_EXCEPTION_MAC_ARITHMETIC on ppc */\n  MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW           = 1,\n      /* EXC_PPC_OVERFLOW */\n  MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE        = 2,\n      /* EXC_PPC_ZERO_DIVIDE */\n  MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT      = 3,\n      /* EXC_FLT_INEXACT */\n  MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE  = 4,\n      /* EXC_PPC_FLT_ZERO_DIVIDE */\n  MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW    = 5,\n      /* EXC_PPC_FLT_UNDERFLOW */\n  MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW     = 6,\n      /* EXC_PPC_FLT_OVERFLOW */\n  MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER = 7,\n      /* EXC_PPC_FLT_NOT_A_NUMBER */\n\n  /* With MD_EXCEPTION_MAC_EMULATION on ppc */\n  MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION   = 8,\n      /* EXC_PPC_NOEMULATION */\n  MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST = 9,\n      /* EXC_PPC_ALTIVECASSIST */\n\n  /* With MD_EXCEPTION_MAC_SOFTWARE on ppc */\n  MD_EXCEPTION_CODE_MAC_PPC_TRAP    = 0x00000001,  /* EXC_PPC_TRAP */\n  MD_EXCEPTION_CODE_MAC_PPC_MIGRATE = 0x00010100,  /* EXC_PPC_MIGRATE */\n\n  /* With MD_EXCEPTION_MAC_BREAKPOINT on ppc */\n  MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT = 1,  /* EXC_PPC_BREAKPOINT */\n\n  /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86, see also x86 interrupt\n   * values below. */\n  MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION = 1,  /* EXC_I386_INVOP */\n\n  /* With MD_EXCEPTION_MAC_ARITHMETIC on x86 */\n  MD_EXCEPTION_CODE_MAC_X86_DIV       = 1,  /* EXC_I386_DIV */\n  MD_EXCEPTION_CODE_MAC_X86_INTO      = 2,  /* EXC_I386_INTO */\n  MD_EXCEPTION_CODE_MAC_X86_NOEXT     = 3,  /* EXC_I386_NOEXT */\n  MD_EXCEPTION_CODE_MAC_X86_EXTOVR    = 4,  /* EXC_I386_EXTOVR */\n  MD_EXCEPTION_CODE_MAC_X86_EXTERR    = 5,  /* EXC_I386_EXTERR */\n  MD_EXCEPTION_CODE_MAC_X86_EMERR     = 6,  /* EXC_I386_EMERR */\n  MD_EXCEPTION_CODE_MAC_X86_BOUND     = 7,  /* EXC_I386_BOUND */\n  MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR = 8,  /* EXC_I386_SSEEXTERR */\n\n  /* With MD_EXCEPTION_MAC_BREAKPOINT on x86 */\n  MD_EXCEPTION_CODE_MAC_X86_SGL = 1,  /* EXC_I386_SGL */\n  MD_EXCEPTION_CODE_MAC_X86_BPT = 2,  /* EXC_I386_BPT */\n\n  /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86.  These are the raw\n   * x86 interrupt codes.  Most of these are mapped to other Mach\n   * exceptions and codes, are handled, or should not occur in user space.\n   * A few of these will do occur with MD_EXCEPTION_MAC_BAD_INSTRUCTION. */\n  /* EXC_I386_DIVERR    =  0: mapped to EXC_ARITHMETIC/EXC_I386_DIV */\n  /* EXC_I386_SGLSTP    =  1: mapped to EXC_BREAKPOINT/EXC_I386_SGL */\n  /* EXC_I386_NMIFLT    =  2: should not occur in user space */\n  /* EXC_I386_BPTFLT    =  3: mapped to EXC_BREAKPOINT/EXC_I386_BPT */\n  /* EXC_I386_INTOFLT   =  4: mapped to EXC_ARITHMETIC/EXC_I386_INTO */\n  /* EXC_I386_BOUNDFLT  =  5: mapped to EXC_ARITHMETIC/EXC_I386_BOUND */\n  /* EXC_I386_INVOPFLT  =  6: mapped to EXC_BAD_INSTRUCTION/EXC_I386_INVOP */\n  /* EXC_I386_NOEXTFLT  =  7: should be handled by the kernel */\n  /* EXC_I386_DBLFLT    =  8: should be handled (if possible) by the kernel */\n  /* EXC_I386_EXTOVRFLT =  9: mapped to EXC_BAD_ACCESS/(PROT_READ|PROT_EXEC) */\n  MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT = 10,\n      /* EXC_INVTSSFLT */\n  MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT        = 11,\n      /* EXC_SEGNPFLT */\n  MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT                = 12,\n      /* EXC_STKFLT */\n  MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT   = 13,\n      /* EXC_GPFLT */\n  /* EXC_I386_PGFLT     = 14: should not occur in user space */\n  /* EXC_I386_EXTERRFLT = 16: mapped to EXC_ARITHMETIC/EXC_I386_EXTERR */\n  MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT            = 17\n      /* EXC_ALIGNFLT (for vector operations) */\n  /* EXC_I386_ENOEXTFLT = 32: should be handled by the kernel */\n  /* EXC_I386_ENDPERR   = 33: should not occur */\n} MDExceptionCodeMac;\n\n#endif  /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_OSX_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/common/minidump_exception_solaris.h",
    "content": "/* Copyright (c) 2006, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/* minidump_exception_solaris.h: A definition of exception codes for\n * Solaris\n *\n * (This is C99 source, please don't corrupt it with C++.)\n *\n * Author: Mark Mentovai\n * Split into its own file: Neal Sidhwaney */\n\n\n#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__\n#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__\n\n#include <stddef.h>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\n/* For (MDException).exception_code.  These values come from sys/iso/signal_iso.h\n */\ntypedef enum {\n  MD_EXCEPTION_CODE_SOL_SIGHUP = 1,      /* Hangup */\n  MD_EXCEPTION_CODE_SOL_SIGINT = 2,      /* interrupt (rubout) */\n  MD_EXCEPTION_CODE_SOL_SIGQUIT = 3,     /* quit (ASCII FS) */\n  MD_EXCEPTION_CODE_SOL_SIGILL = 4,      /* illegal instruction (not reset when caught) */\n  MD_EXCEPTION_CODE_SOL_SIGTRAP = 5,     /* trace trap (not reset when caught) */\n  MD_EXCEPTION_CODE_SOL_SIGIOT = 6,      /* IOT instruction */\n  MD_EXCEPTION_CODE_SOL_SIGABRT = 6,     /* used by abort, replace SIGIOT in the future */\n  MD_EXCEPTION_CODE_SOL_SIGEMT = 7,      /* EMT instruction */\n  MD_EXCEPTION_CODE_SOL_SIGFPE = 8,      /* floating point exception */\n  MD_EXCEPTION_CODE_SOL_SIGKILL = 9,     /* kill (cannot be caught or ignored) */\n  MD_EXCEPTION_CODE_SOL_SIGBUS = 10,     /* bus error */\n  MD_EXCEPTION_CODE_SOL_SIGSEGV = 11,    /* segmentation violation */\n  MD_EXCEPTION_CODE_SOL_SIGSYS = 12,     /* bad argument to system call */\n  MD_EXCEPTION_CODE_SOL_SIGPIPE = 13,    /* write on a pipe with no one to read it */\n  MD_EXCEPTION_CODE_SOL_SIGALRM = 14,    /* alarm clock */\n  MD_EXCEPTION_CODE_SOL_SIGTERM = 15,    /* software termination signal from kill */\n  MD_EXCEPTION_CODE_SOL_SIGUSR1 = 16,    /* user defined signal 1 */\n  MD_EXCEPTION_CODE_SOL_SIGUSR2 = 17,    /* user defined signal 2 */\n  MD_EXCEPTION_CODE_SOL_SIGCLD = 18,     /* child status change */\n  MD_EXCEPTION_CODE_SOL_SIGCHLD = 18,    /* child status change alias (POSIX) */\n  MD_EXCEPTION_CODE_SOL_SIGPWR = 19,     /* power-fail restart */\n  MD_EXCEPTION_CODE_SOL_SIGWINCH = 20,   /* window size change */\n  MD_EXCEPTION_CODE_SOL_SIGURG = 21,     /* urgent socket condition */\n  MD_EXCEPTION_CODE_SOL_SIGPOLL = 22,    /* pollable event occurred */\n  MD_EXCEPTION_CODE_SOL_SIGIO = 22,      /* socket I/O possible (SIGPOLL alias) */\n  MD_EXCEPTION_CODE_SOL_SIGSTOP = 23,    /* stop (cannot be caught or ignored) */\n  MD_EXCEPTION_CODE_SOL_SIGTSTP = 24,    /* user stop requested from tty */\n  MD_EXCEPTION_CODE_SOL_SIGCONT = 25,    /* stopped process has been continued */\n  MD_EXCEPTION_CODE_SOL_SIGTTIN = 26,    /* background tty read attempted */\n  MD_EXCEPTION_CODE_SOL_SIGTTOU = 27,    /* background tty write attempted */\n  MD_EXCEPTION_CODE_SOL_SIGVTALRM = 28,  /* virtual timer expired */\n  MD_EXCEPTION_CODE_SOL_SIGPROF = 29,    /* profiling timer expired */\n  MD_EXCEPTION_CODE_SOL_SIGXCPU = 30,    /* exceeded cpu limit */\n  MD_EXCEPTION_CODE_SOL_SIGXFSZ = 31,    /* exceeded file size limit */\n  MD_EXCEPTION_CODE_SOL_SIGWAITING = 32, /* reserved signal no longer used by threading code */\n  MD_EXCEPTION_CODE_SOL_SIGLWP = 33,     /* reserved signal no longer used by threading code */\n  MD_EXCEPTION_CODE_SOL_SIGFREEZE = 34,  /* special signal used by CPR */\n  MD_EXCEPTION_CODE_SOL_SIGTHAW = 35,    /* special signal used by CPR */\n  MD_EXCEPTION_CODE_SOL_SIGCANCEL = 36,  /* reserved signal for thread cancellation */\n  MD_EXCEPTION_CODE_SOL_SIGLOST = 37,    /* resource lost (eg, record-lock lost) */\n  MD_EXCEPTION_CODE_SOL_SIGXRES = 38,    /* resource control exceeded */\n  MD_EXCEPTION_CODE_SOL_SIGJVM1 = 39,    /* reserved signal for Java Virtual Machine */\n  MD_EXCEPTION_CODE_SOL_SIGJVM2 = 40     /* reserved signal for Java Virtual Machine */\n} MDExceptionCodeSolaris;\n\n#endif  /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/common/minidump_exception_win32.h",
    "content": "/* Copyright (c) 2006, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/* minidump_exception_win32.h: Definitions of exception codes for\n * Win32 platform\n *\n * (This is C99 source, please don't corrupt it with C++.)\n *\n * Author: Mark Mentovai\n * Split into its own file: Neal Sidhwaney */\n\n\n#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__\n#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__\n\n#include <stddef.h>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\n\n/* For (MDException).exception_code.  These values come from WinBase.h\n * and WinNT.h (names beginning with EXCEPTION_ are in WinBase.h,\n * they are STATUS_ in WinNT.h). */\ntypedef enum {\n  MD_EXCEPTION_CODE_WIN_CONTROL_C                = 0x40010005,\n      /* DBG_CONTROL_C */\n  MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION     = 0x80000001,\n      /* EXCEPTION_GUARD_PAGE */\n  MD_EXCEPTION_CODE_WIN_DATATYPE_MISALIGNMENT    = 0x80000002,\n      /* EXCEPTION_DATATYPE_MISALIGNMENT */\n  MD_EXCEPTION_CODE_WIN_BREAKPOINT               = 0x80000003,\n      /* EXCEPTION_BREAKPOINT */\n  MD_EXCEPTION_CODE_WIN_SINGLE_STEP              = 0x80000004,\n      /* EXCEPTION_SINGLE_STEP */\n  MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION         = 0xc0000005,\n      /* EXCEPTION_ACCESS_VIOLATION */\n  MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR            = 0xc0000006,\n      /* EXCEPTION_IN_PAGE_ERROR */\n  MD_EXCEPTION_CODE_WIN_INVALID_HANDLE           = 0xc0000008,\n      /* EXCEPTION_INVALID_HANDLE */\n  MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION      = 0xc000001d,\n      /* EXCEPTION_ILLEGAL_INSTRUCTION */\n  MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION = 0xc0000025,\n      /* EXCEPTION_NONCONTINUABLE_EXCEPTION */\n  MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION      = 0xc0000026,\n      /* EXCEPTION_INVALID_DISPOSITION */\n  MD_EXCEPTION_CODE_WIN_ARRAY_BOUNDS_EXCEEDED    = 0xc000008c,\n      /* EXCEPTION_BOUNDS_EXCEEDED */\n  MD_EXCEPTION_CODE_WIN_FLOAT_DENORMAL_OPERAND   = 0xc000008d,\n      /* EXCEPTION_FLT_DENORMAL_OPERAND */\n  MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO     = 0xc000008e,\n      /* EXCEPTION_FLT_DIVIDE_BY_ZERO */\n  MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT     = 0xc000008f,\n      /* EXCEPTION_FLT_INEXACT_RESULT */\n  MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION  = 0xc0000090,\n      /* EXCEPTION_FLT_INVALID_OPERATION */\n  MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW           = 0xc0000091,\n      /* EXCEPTION_FLT_OVERFLOW */\n  MD_EXCEPTION_CODE_WIN_FLOAT_STACK_CHECK        = 0xc0000092,\n      /* EXCEPTION_FLT_STACK_CHECK */\n  MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW          = 0xc0000093,\n      /* EXCEPTION_FLT_UNDERFLOW */\n  MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO   = 0xc0000094,\n      /* EXCEPTION_INT_DIVIDE_BY_ZERO */\n  MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW         = 0xc0000095,\n      /* EXCEPTION_INT_OVERFLOW */\n  MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION   = 0xc0000096,\n      /* EXCEPTION_PRIV_INSTRUCTION */\n  MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW           = 0xc00000fd,\n      /* EXCEPTION_STACK_OVERFLOW */\n  MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK        = 0xc0000194,\n      /* EXCEPTION_POSSIBLE_DEADLOCK */\n  MD_EXCEPTION_CODE_WIN_STACK_BUFFER_OVERRUN     = 0xc0000409,\n      /* STATUS_STACK_BUFFER_OVERRUN */\n  MD_EXCEPTION_CODE_WIN_HEAP_CORRUPTION          = 0xc0000374,\n      /* STATUS_HEAP_CORRUPTION */\n  MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION  = 0xe06d7363\n      /* Per http://support.microsoft.com/kb/185294,\n         generated by Visual C++ compiler */\n} MDExceptionCodeWin;\n\n// These constants are defined in the MSDN documentation of\n// the EXCEPTION_RECORD structure.\ntypedef enum {\n  MD_ACCESS_VIOLATION_WIN_READ  = 0,\n  MD_ACCESS_VIOLATION_WIN_WRITE = 1,\n  MD_ACCESS_VIOLATION_WIN_EXEC  = 8\n} MDAccessViolationTypeWin;\n\n#endif  /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/common/minidump_format.h",
    "content": "/* Copyright (c) 2006, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n/* minidump_format.h: A cross-platform reimplementation of minidump-related\n * portions of DbgHelp.h from the Windows Platform SDK.\n *\n * (This is C99 source, please don't corrupt it with C++.)\n *\n * Structures that are defined by Microsoft to contain a zero-length array\n * are instead defined here to contain an array with one element, as\n * zero-length arrays are forbidden by standard C and C++.  In these cases,\n * *_minsize constants are provided to be used in place of sizeof.  For a\n * cleaner interface to these sizes when using C++, see minidump_size.h.\n *\n * These structures are also sufficient to populate minidump files.\n *\n * These definitions may be extended to support handling minidump files\n * for other CPUs and other operating systems.\n *\n * Because precise data type sizes are crucial for this implementation to\n * function properly and portably in terms of interoperability with minidumps\n * produced by DbgHelp on Windows, a set of primitive types with known sizes\n * are used as the basis of each structure defined by this file.  DbgHelp\n * on Windows is assumed to be the reference implementation; this file\n * seeks to provide a cross-platform compatible implementation.  To avoid\n * collisions with the types and values defined and used by DbgHelp in the\n * event that this implementation is used on Windows, each type and value\n * defined here is given a new name, beginning with \"MD\".  Names of the\n * equivalent types and values in the Windows Platform SDK are given in\n * comments.\n *\n * Author: Mark Mentovai */\n\n\n#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__\n#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__\n\n#include <stddef.h>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\n\n#if defined(_MSC_VER)\n/* Disable \"zero-sized array in struct/union\" warnings when compiling in\n * MSVC.  DbgHelp.h does this too. */\n#pragma warning(push)\n#pragma warning(disable:4200)\n#endif  /* _MSC_VER */\n\n\n/*\n * guiddef.h\n */\n\ntypedef struct {\n  u_int32_t data1;\n  u_int16_t data2;\n  u_int16_t data3;\n  u_int8_t  data4[8];\n} MDGUID;  /* GUID */\n\n\n/*\n * WinNT.h\n */\n\n/* Non-x86 CPU identifiers found in the high 24 bits of\n * (MDRawContext*).context_flags.  These aren't used by Breakpad, but are\n * defined here for reference, to avoid assigning values that conflict\n * (although some values already conflict). */\n#define MD_CONTEXT_IA64  0x00080000  /* CONTEXT_IA64 */\n/* Additional values from winnt.h in the Windows CE 5.0 SDK: */\n#define MD_CONTEXT_SHX   0x000000c0  /* CONTEXT_SH4 (Super-H, includes SH3) */\n#define MD_CONTEXT_MIPS  0x00010000  /* CONTEXT_R4000 (same value as x86?) */\n#define MD_CONTEXT_ALPHA 0x00020000  /* CONTEXT_ALPHA */\n\n/* As of Windows 7 SP1, the number of flag bits has increased to\n * include 0x40 (CONTEXT_XSTATE):\n * http://msdn.microsoft.com/en-us/library/hh134238%28v=vs.85%29.aspx */\n#define MD_CONTEXT_CPU_MASK 0xffffff00\n\n\n/* This is a base type for MDRawContextX86 and MDRawContextPPC.  This\n * structure should never be allocated directly.  The actual structure type\n * can be determined by examining the context_flags field. */\ntypedef struct {\n  u_int32_t context_flags;\n} MDRawContextBase;\n\n#include \"minidump_cpu_amd64.h\"\n#include \"minidump_cpu_arm.h\"\n#include \"minidump_cpu_ppc.h\"\n#include \"minidump_cpu_ppc64.h\"\n#include \"minidump_cpu_sparc.h\"\n#include \"minidump_cpu_x86.h\"\n\n/*\n * WinVer.h\n */\n\n\ntypedef struct {\n  u_int32_t signature;\n  u_int32_t struct_version;\n  u_int32_t file_version_hi;\n  u_int32_t file_version_lo;\n  u_int32_t product_version_hi;\n  u_int32_t product_version_lo;\n  u_int32_t file_flags_mask;    /* Identifies valid bits in fileFlags */\n  u_int32_t file_flags;\n  u_int32_t file_os;\n  u_int32_t file_type;\n  u_int32_t file_subtype;\n  u_int32_t file_date_hi;\n  u_int32_t file_date_lo;\n} MDVSFixedFileInfo;  /* VS_FIXEDFILEINFO */\n\n/* For (MDVSFixedFileInfo).signature */\n#define MD_VSFIXEDFILEINFO_SIGNATURE 0xfeef04bd\n     /* VS_FFI_SIGNATURE */\n\n/* For (MDVSFixedFileInfo).version */\n#define MD_VSFIXEDFILEINFO_VERSION 0x00010000\n     /* VS_FFI_STRUCVERSION */\n\n/* For (MDVSFixedFileInfo).file_flags_mask and\n * (MDVSFixedFileInfo).file_flags */\n#define MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG        0x00000001\n     /* VS_FF_DEBUG */\n#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRERELEASE   0x00000002\n     /* VS_FF_PRERELEASE */\n#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PATCHED      0x00000004\n     /* VS_FF_PATCHED */\n#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRIVATEBUILD 0x00000008\n     /* VS_FF_PRIVATEBUILD */\n#define MD_VSFIXEDFILEINFO_FILE_FLAGS_INFOINFERRED 0x00000010\n     /* VS_FF_INFOINFERRED */\n#define MD_VSFIXEDFILEINFO_FILE_FLAGS_SPECIALBUILD 0x00000020\n     /* VS_FF_SPECIALBUILD */\n\n/* For (MDVSFixedFileInfo).file_os: high 16 bits */\n#define MD_VSFIXEDFILEINFO_FILE_OS_UNKNOWN    0          /* VOS_UNKNOWN */\n#define MD_VSFIXEDFILEINFO_FILE_OS_DOS        (1 << 16)  /* VOS_DOS */\n#define MD_VSFIXEDFILEINFO_FILE_OS_OS216      (2 << 16)  /* VOS_OS216 */\n#define MD_VSFIXEDFILEINFO_FILE_OS_OS232      (3 << 16)  /* VOS_OS232 */\n#define MD_VSFIXEDFILEINFO_FILE_OS_NT         (4 << 16)  /* VOS_NT */\n#define MD_VSFIXEDFILEINFO_FILE_OS_WINCE      (5 << 16)  /* VOS_WINCE */\n/* Low 16 bits */\n#define MD_VSFIXEDFILEINFO_FILE_OS__BASE      0          /* VOS__BASE */\n#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS16 1          /* VOS__WINDOWS16 */\n#define MD_VSFIXEDFILEINFO_FILE_OS__PM16      2          /* VOS__PM16 */\n#define MD_VSFIXEDFILEINFO_FILE_OS__PM32      3          /* VOS__PM32 */\n#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS32 4          /* VOS__WINDOWS32 */\n\n/* For (MDVSFixedFileInfo).file_type */\n#define MD_VSFIXEDFILEINFO_FILE_TYPE_UNKNOWN    0  /* VFT_UNKNOWN */\n#define MD_VSFIXEDFILEINFO_FILE_TYPE_APP        1  /* VFT_APP */\n#define MD_VSFIXEDFILEINFO_FILE_TYPE_DLL        2  /* VFT_DLL */\n#define MD_VSFIXEDFILEINFO_FILE_TYPE_DRV        3  /* VFT_DLL */\n#define MD_VSFIXEDFILEINFO_FILE_TYPE_FONT       4  /* VFT_FONT */\n#define MD_VSFIXEDFILEINFO_FILE_TYPE_VXD        5  /* VFT_VXD */\n#define MD_VSFIXEDFILEINFO_FILE_TYPE_STATIC_LIB 7  /* VFT_STATIC_LIB */\n\n/* For (MDVSFixedFileInfo).file_subtype */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_UNKNOWN                0\n     /* VFT2_UNKNOWN */\n/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_DRV */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_PRINTER            1\n     /* VFT2_DRV_PRINTER */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_KEYBOARD           2\n     /* VFT2_DRV_KEYBOARD */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_LANGUAGE           3\n     /* VFT2_DRV_LANGUAGE */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_DISPLAY            4\n     /* VFT2_DRV_DISPLAY */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_MOUSE              5\n     /* VFT2_DRV_MOUSE */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_NETWORK            6\n     /* VFT2_DRV_NETWORK */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SYSTEM             7\n     /* VFT2_DRV_SYSTEM */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INSTALLABLE        8\n     /* VFT2_DRV_INSTALLABLE */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SOUND              9\n     /* VFT2_DRV_SOUND */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_COMM              10\n     /* VFT2_DRV_COMM */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INPUTMETHOD       11\n     /* VFT2_DRV_INPUTMETHOD */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_VERSIONED_PRINTER 12\n     /* VFT2_DRV_VERSIONED_PRINTER */\n/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_FONT */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_RASTER            1\n     /* VFT2_FONT_RASTER */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_VECTOR            2\n     /* VFT2_FONT_VECTOR */\n#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_TRUETYPE          3\n     /* VFT2_FONT_TRUETYPE */\n\n\n/*\n * DbgHelp.h\n */\n\n\n/* An MDRVA is an offset into the minidump file.  The beginning of the\n * MDRawHeader is at offset 0. */\ntypedef u_int32_t MDRVA;  /* RVA */\n\ntypedef struct {\n  u_int32_t data_size;\n  MDRVA     rva;\n} MDLocationDescriptor;  /* MINIDUMP_LOCATION_DESCRIPTOR */\n\n\ntypedef struct {\n  /* The base address of the memory range on the host that produced the\n   * minidump. */\n  u_int64_t            start_of_memory_range;\n\n  MDLocationDescriptor memory;\n} MDMemoryDescriptor;  /* MINIDUMP_MEMORY_DESCRIPTOR */\n\n\ntypedef struct {\n  u_int32_t signature;\n  u_int32_t version;\n  u_int32_t stream_count;\n  MDRVA     stream_directory_rva;  /* A |stream_count|-sized array of\n                                    * MDRawDirectory structures. */\n  u_int32_t checksum;              /* Can be 0.  In fact, that's all that's\n                                    * been found in minidump files. */\n  u_int32_t time_date_stamp;       /* time_t */\n  u_int64_t flags;\n} MDRawHeader;  /* MINIDUMP_HEADER */\n\n/* For (MDRawHeader).signature and (MDRawHeader).version.  Note that only the\n * low 16 bits of (MDRawHeader).version are MD_HEADER_VERSION.  Per the\n * documentation, the high 16 bits are implementation-specific. */\n#define MD_HEADER_SIGNATURE 0x504d444d /* 'PMDM' */\n     /* MINIDUMP_SIGNATURE */\n#define MD_HEADER_VERSION   0x0000a793 /* 42899 */\n     /* MINIDUMP_VERSION */\n\n/* For (MDRawHeader).flags: */\ntypedef enum {\n  /* MD_NORMAL is the standard type of minidump.  It includes full\n   * streams for the thread list, module list, exception, system info,\n   * and miscellaneous info.  A memory list stream is also present,\n   * pointing to the same stack memory contained in the thread list,\n   * as well as a 256-byte region around the instruction address that\n   * was executing when the exception occurred.  Stack memory is from\n   * 4 bytes below a thread's stack pointer up to the top of the\n   * memory region encompassing the stack. */\n  MD_NORMAL                            = 0x00000000,\n  MD_WITH_DATA_SEGS                    = 0x00000001,\n  MD_WITH_FULL_MEMORY                  = 0x00000002,\n  MD_WITH_HANDLE_DATA                  = 0x00000004,\n  MD_FILTER_MEMORY                     = 0x00000008,\n  MD_SCAN_MEMORY                       = 0x00000010,\n  MD_WITH_UNLOADED_MODULES             = 0x00000020,\n  MD_WITH_INDIRECTLY_REFERENCED_MEMORY = 0x00000040,\n  MD_FILTER_MODULE_PATHS               = 0x00000080,\n  MD_WITH_PROCESS_THREAD_DATA          = 0x00000100,\n  MD_WITH_PRIVATE_READ_WRITE_MEMORY    = 0x00000200,\n  MD_WITHOUT_OPTIONAL_DATA             = 0x00000400,\n  MD_WITH_FULL_MEMORY_INFO             = 0x00000800,\n  MD_WITH_THREAD_INFO                  = 0x00001000,\n  MD_WITH_CODE_SEGS                    = 0x00002000,\n  MD_WITHOUT_AUXILLIARY_SEGS           = 0x00004000,\n  MD_WITH_FULL_AUXILLIARY_STATE        = 0x00008000,\n  MD_WITH_PRIVATE_WRITE_COPY_MEMORY    = 0x00010000,\n  MD_IGNORE_INACCESSIBLE_MEMORY        = 0x00020000,\n  MD_WITH_TOKEN_INFORMATION            = 0x00040000\n} MDType;  /* MINIDUMP_TYPE */\n\n\ntypedef struct {\n  u_int32_t            stream_type;\n  MDLocationDescriptor location;\n} MDRawDirectory;  /* MINIDUMP_DIRECTORY */\n\n/* For (MDRawDirectory).stream_type */\ntypedef enum {\n  MD_UNUSED_STREAM               =  0,\n  MD_RESERVED_STREAM_0           =  1,\n  MD_RESERVED_STREAM_1           =  2,\n  MD_THREAD_LIST_STREAM          =  3,  /* MDRawThreadList */\n  MD_MODULE_LIST_STREAM          =  4,  /* MDRawModuleList */\n  MD_MEMORY_LIST_STREAM          =  5,  /* MDRawMemoryList */\n  MD_EXCEPTION_STREAM            =  6,  /* MDRawExceptionStream */\n  MD_SYSTEM_INFO_STREAM          =  7,  /* MDRawSystemInfo */\n  MD_THREAD_EX_LIST_STREAM       =  8,\n  MD_MEMORY_64_LIST_STREAM       =  9,\n  MD_COMMENT_STREAM_A            = 10,\n  MD_COMMENT_STREAM_W            = 11,\n  MD_HANDLE_DATA_STREAM          = 12,\n  MD_FUNCTION_TABLE_STREAM       = 13,\n  MD_UNLOADED_MODULE_LIST_STREAM = 14,\n  MD_MISC_INFO_STREAM            = 15,  /* MDRawMiscInfo */\n  MD_MEMORY_INFO_LIST_STREAM     = 16,  /* MDRawMemoryInfoList */\n  MD_THREAD_INFO_LIST_STREAM     = 17,\n  MD_HANDLE_OPERATION_LIST_STREAM = 18,\n  MD_LAST_RESERVED_STREAM        = 0x0000ffff,\n\n  /* Breakpad extension types.  0x4767 = \"Gg\" */\n  MD_BREAKPAD_INFO_STREAM        = 0x47670001,  /* MDRawBreakpadInfo */\n  MD_ASSERTION_INFO_STREAM       = 0x47670002   /* MDRawAssertionInfo */\n} MDStreamType;  /* MINIDUMP_STREAM_TYPE */\n\n\ntypedef struct {\n  u_int32_t length;     /* Length of buffer in bytes (not characters),\n                         * excluding 0-terminator */\n  u_int16_t buffer[1];  /* UTF-16-encoded, 0-terminated */\n} MDString;  /* MINIDUMP_STRING */\n\nstatic const size_t MDString_minsize = offsetof(MDString, buffer[0]);\n\n\ntypedef struct {\n  u_int32_t            thread_id;\n  u_int32_t            suspend_count;\n  u_int32_t            priority_class;\n  u_int32_t            priority;\n  u_int64_t            teb;             /* Thread environment block */\n  MDMemoryDescriptor   stack;\n  MDLocationDescriptor thread_context;  /* MDRawContext[CPU] */\n} MDRawThread;  /* MINIDUMP_THREAD */\n\n\ntypedef struct {\n  u_int32_t   number_of_threads;\n  MDRawThread threads[1];\n} MDRawThreadList;  /* MINIDUMP_THREAD_LIST */\n\nstatic const size_t MDRawThreadList_minsize = offsetof(MDRawThreadList,\n                                                       threads[0]);\n\n\ntypedef struct {\n  u_int64_t            base_of_image;\n  u_int32_t            size_of_image;\n  u_int32_t            checksum;         /* 0 if unknown */\n  u_int32_t            time_date_stamp;  /* time_t */\n  MDRVA                module_name_rva;  /* MDString, pathname or filename */\n  MDVSFixedFileInfo    version_info;\n\n  /* The next field stores a CodeView record and is populated when a module's\n   * debug information resides in a PDB file.  It identifies the PDB file. */\n  MDLocationDescriptor cv_record;\n\n  /* The next field is populated when a module's debug information resides\n   * in a DBG file.  It identifies the DBG file.  This field is effectively\n   * obsolete with modules built by recent toolchains. */\n  MDLocationDescriptor misc_record;\n\n  /* Alignment problem: reserved0 and reserved1 are defined by the platform\n   * SDK as 64-bit quantities.  However, that results in a structure whose\n   * alignment is unpredictable on different CPUs and ABIs.  If the ABI\n   * specifies full alignment of 64-bit quantities in structures (as ppc\n   * does), there will be padding between miscRecord and reserved0.  If\n   * 64-bit quantities can be aligned on 32-bit boundaries (as on x86),\n   * this padding will not exist.  (Note that the structure up to this point\n   * contains 1 64-bit member followed by 21 32-bit members.)\n   * As a workaround, reserved0 and reserved1 are instead defined here as\n   * four 32-bit quantities.  This should be harmless, as there are\n   * currently no known uses for these fields. */\n  u_int32_t            reserved0[2];\n  u_int32_t            reserved1[2];\n} MDRawModule;  /* MINIDUMP_MODULE */\n\n/* The inclusion of a 64-bit type in MINIDUMP_MODULE forces the struct to\n * be tail-padded out to a multiple of 64 bits under some ABIs (such as PPC).\n * This doesn't occur on systems that don't tail-pad in this manner.  Define\n * this macro to be the usable size of the MDRawModule struct, and use it in\n * place of sizeof(MDRawModule). */\n#define MD_MODULE_SIZE 108\n\n\n/* (MDRawModule).cv_record can reference MDCVInfoPDB20 or MDCVInfoPDB70.\n * Ref.: http://www.debuginfo.com/articles/debuginfomatch.html\n * MDCVInfoPDB70 is the expected structure type with recent toolchains. */\n\ntypedef struct {\n  u_int32_t signature;\n  u_int32_t offset;     /* Offset to debug data (expect 0 in minidump) */\n} MDCVHeader;\n\ntypedef struct {\n  MDCVHeader cv_header;\n  u_int32_t  signature;         /* time_t debug information created */\n  u_int32_t  age;               /* revision of PDB file */\n  u_int8_t   pdb_file_name[1];  /* Pathname or filename of PDB file */\n} MDCVInfoPDB20;\n\nstatic const size_t MDCVInfoPDB20_minsize = offsetof(MDCVInfoPDB20,\n                                                     pdb_file_name[0]);\n\n#define MD_CVINFOPDB20_SIGNATURE 0x3031424e  /* cvHeader.signature = '01BN' */\n\ntypedef struct {\n  u_int32_t cv_signature;\n  MDGUID    signature;         /* GUID, identifies PDB file */\n  u_int32_t age;               /* Identifies incremental changes to PDB file */\n  u_int8_t  pdb_file_name[1];  /* Pathname or filename of PDB file,\n                                * 0-terminated 8-bit character data (UTF-8?) */\n} MDCVInfoPDB70;\n\nstatic const size_t MDCVInfoPDB70_minsize = offsetof(MDCVInfoPDB70,\n                                                     pdb_file_name[0]);\n\n#define MD_CVINFOPDB70_SIGNATURE 0x53445352  /* cvSignature = 'SDSR' */\n\ntypedef struct {\n  u_int32_t data1[2];\n  u_int32_t data2;\n  u_int32_t data3;\n  u_int32_t data4;\n  u_int32_t data5[3];\n  u_int8_t extra[2];\n} MDCVInfoELF;\n\n/* In addition to the two CodeView record formats above, used for linking\n * to external pdb files, it is possible for debugging data to be carried\n * directly in the CodeView record itself.  These signature values will\n * be found in the first 4 bytes of the CodeView record.  Additional values\n * not commonly experienced in the wild are given by \"Microsoft Symbol and\n * Type Information\", http://www.x86.org/ftp/manuals/tools/sym.pdf, section\n * 7.2.  An in-depth description of the CodeView 4.1 format is given by\n * \"Undocumented Windows 2000 Secrets\", Windows 2000 Debugging Support/\n * Microsoft Symbol File Internals/CodeView Subsections,\n * http://www.rawol.com/features/undocumented/sbs-w2k-1-windows-2000-debugging-support.pdf\n */\n#define MD_CVINFOCV41_SIGNATURE 0x3930424e  /* '90BN', CodeView 4.10. */\n#define MD_CVINFOCV50_SIGNATURE 0x3131424e  /* '11BN', CodeView 5.0,\n                                             * MS C7-format (/Z7). */\n\n#define MD_CVINFOUNKNOWN_SIGNATURE 0xffffffff  /* An unlikely value. */\n\n/* (MDRawModule).miscRecord can reference MDImageDebugMisc.  The Windows\n * structure is actually defined in WinNT.h.  This structure is effectively\n * obsolete with modules built by recent toolchains. */\n\ntypedef struct {\n  u_int32_t data_type;    /* IMAGE_DEBUG_TYPE_*, not defined here because\n                           * this debug record type is mostly obsolete. */\n  u_int32_t length;       /* Length of entire MDImageDebugMisc structure */\n  u_int8_t  unicode;      /* True if data is multibyte */\n  u_int8_t  reserved[3];\n  u_int8_t  data[1];\n} MDImageDebugMisc;  /* IMAGE_DEBUG_MISC */\n\nstatic const size_t MDImageDebugMisc_minsize = offsetof(MDImageDebugMisc,\n                                                        data[0]);\n\n\ntypedef struct {\n  u_int32_t   number_of_modules;\n  MDRawModule modules[1];\n} MDRawModuleList;  /* MINIDUMP_MODULE_LIST */\n\nstatic const size_t MDRawModuleList_minsize = offsetof(MDRawModuleList,\n                                                       modules[0]);\n\n\ntypedef struct {\n  u_int32_t          number_of_memory_ranges;\n  MDMemoryDescriptor memory_ranges[1];\n} MDRawMemoryList;  /* MINIDUMP_MEMORY_LIST */\n\nstatic const size_t MDRawMemoryList_minsize = offsetof(MDRawMemoryList,\n                                                       memory_ranges[0]);\n\n\n#define MD_EXCEPTION_MAXIMUM_PARAMETERS 15\n\ntypedef struct {\n  u_int32_t exception_code;     /* Windows: MDExceptionCodeWin,\n                                 * Mac OS X: MDExceptionMac,\n                                 * Linux: MDExceptionCodeLinux. */\n  u_int32_t exception_flags;    /* Windows: 1 if noncontinuable,\n                                   Mac OS X: MDExceptionCodeMac. */\n  u_int64_t exception_record;   /* Address (in the minidump-producing host's\n                                 * memory) of another MDException, for\n                                 * nested exceptions. */\n  u_int64_t exception_address;  /* The address that caused the exception.\n                                 * Mac OS X: exception subcode (which is\n                                 *           typically the address). */\n  u_int32_t number_parameters;  /* Number of valid elements in\n                                 * exception_information. */\n  u_int32_t __align;\n  u_int64_t exception_information[MD_EXCEPTION_MAXIMUM_PARAMETERS];\n} MDException;  /* MINIDUMP_EXCEPTION */\n\n#include \"minidump_exception_win32.h\"\n#include \"minidump_exception_mac.h\"\n#include \"minidump_exception_linux.h\"\n#include \"minidump_exception_solaris.h\"\n\ntypedef struct {\n  u_int32_t            thread_id;         /* Thread in which the exception\n                                           * occurred.  Corresponds to\n                                           * (MDRawThread).thread_id. */\n  u_int32_t            __align;\n  MDException          exception_record;\n  MDLocationDescriptor thread_context;    /* MDRawContext[CPU] */\n} MDRawExceptionStream;  /* MINIDUMP_EXCEPTION_STREAM */\n\n\ntypedef union {\n  struct {\n    u_int32_t vendor_id[3];               /* cpuid 0: ebx, edx, ecx */\n    u_int32_t version_information;        /* cpuid 1: eax */\n    u_int32_t feature_information;        /* cpuid 1: edx */\n    u_int32_t amd_extended_cpu_features;  /* cpuid 0x80000001, ebx */\n  } x86_cpu_info;\n  struct {\n    u_int64_t processor_features[2];\n  } other_cpu_info;\n} MDCPUInformation;  /* CPU_INFORMATION */\n\n\ntypedef struct {\n  /* The next 3 fields and numberOfProcessors are from the SYSTEM_INFO\n   * structure as returned by GetSystemInfo */\n  u_int16_t        processor_architecture;\n  u_int16_t        processor_level;         /* x86: 5 = 586, 6 = 686, ... */\n  u_int16_t        processor_revision;      /* x86: 0xMMSS, where MM=model,\n                                             *      SS=stepping */\n\n  u_int8_t         number_of_processors;\n  u_int8_t         product_type;            /* Windows: VER_NT_* from WinNT.h */\n\n  /* The next 5 fields are from the OSVERSIONINFO structure as returned\n   * by GetVersionEx */\n  u_int32_t        major_version;\n  u_int32_t        minor_version;\n  u_int32_t        build_number;\n  u_int32_t        platform_id;\n  MDRVA            csd_version_rva;  /* MDString further identifying the\n                                      * host OS.\n                                      * Windows: name of the installed OS\n                                      *          service pack.\n                                      * Mac OS X: the Apple OS build number\n                                      *           (sw_vers -buildVersion).\n                                      * Linux: uname -srvmo */\n\n  u_int16_t        suite_mask;       /* Windows: VER_SUITE_* from WinNT.h */\n  u_int16_t        reserved2;\n\n  MDCPUInformation cpu;\n} MDRawSystemInfo;  /* MINIDUMP_SYSTEM_INFO */\n\n/* For (MDRawSystemInfo).processor_architecture: */\ntypedef enum {\n  MD_CPU_ARCHITECTURE_X86       =  0,  /* PROCESSOR_ARCHITECTURE_INTEL */\n  MD_CPU_ARCHITECTURE_MIPS      =  1,  /* PROCESSOR_ARCHITECTURE_MIPS */\n  MD_CPU_ARCHITECTURE_ALPHA     =  2,  /* PROCESSOR_ARCHITECTURE_ALPHA */\n  MD_CPU_ARCHITECTURE_PPC       =  3,  /* PROCESSOR_ARCHITECTURE_PPC */\n  MD_CPU_ARCHITECTURE_SHX       =  4,  /* PROCESSOR_ARCHITECTURE_SHX\n                                        * (Super-H) */\n  MD_CPU_ARCHITECTURE_ARM       =  5,  /* PROCESSOR_ARCHITECTURE_ARM */\n  MD_CPU_ARCHITECTURE_IA64      =  6,  /* PROCESSOR_ARCHITECTURE_IA64 */\n  MD_CPU_ARCHITECTURE_ALPHA64   =  7,  /* PROCESSOR_ARCHITECTURE_ALPHA64 */\n  MD_CPU_ARCHITECTURE_MSIL      =  8,  /* PROCESSOR_ARCHITECTURE_MSIL\n                                        * (Microsoft Intermediate Language) */\n  MD_CPU_ARCHITECTURE_AMD64     =  9,  /* PROCESSOR_ARCHITECTURE_AMD64 */\n  MD_CPU_ARCHITECTURE_X86_WIN64 = 10,\n      /* PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 (WoW64) */\n  MD_CPU_ARCHITECTURE_SPARC     = 0x8001, /* Breakpad-defined value for SPARC */\n  MD_CPU_ARCHITECTURE_UNKNOWN   = 0xffff  /* PROCESSOR_ARCHITECTURE_UNKNOWN */\n} MDCPUArchitecture;\n\n/* For (MDRawSystemInfo).platform_id: */\ntypedef enum {\n  MD_OS_WIN32S        = 0,  /* VER_PLATFORM_WIN32s (Windows 3.1) */\n  MD_OS_WIN32_WINDOWS = 1,  /* VER_PLATFORM_WIN32_WINDOWS (Windows 95-98-Me) */\n  MD_OS_WIN32_NT      = 2,  /* VER_PLATFORM_WIN32_NT (Windows NT, 2000+) */\n  MD_OS_WIN32_CE      = 3,  /* VER_PLATFORM_WIN32_CE, VER_PLATFORM_WIN32_HH\n                             * (Windows CE, Windows Mobile, \"Handheld\") */\n\n  /* The following values are Breakpad-defined. */\n  MD_OS_UNIX          = 0x8000,  /* Generic Unix-ish */\n  MD_OS_MAC_OS_X      = 0x8101,  /* Mac OS X/Darwin */\n  MD_OS_IOS           = 0x8102,  /* iOS */\n  MD_OS_LINUX         = 0x8201,  /* Linux */\n  MD_OS_SOLARIS       = 0x8202   /* Solaris */\n} MDOSPlatform;\n\n\ntypedef struct {\n  u_int32_t size_of_info;  /* Length of entire MDRawMiscInfo structure. */\n  u_int32_t flags1;\n\n  /* The next field is only valid if flags1 contains\n   * MD_MISCINFO_FLAGS1_PROCESS_ID. */\n  u_int32_t process_id;\n\n  /* The next 3 fields are only valid if flags1 contains\n   * MD_MISCINFO_FLAGS1_PROCESS_TIMES. */\n  u_int32_t process_create_time;  /* time_t process started */\n  u_int32_t process_user_time;    /* seconds of user CPU time */\n  u_int32_t process_kernel_time;  /* seconds of kernel CPU time */\n\n  /* The following fields are not present in MINIDUMP_MISC_INFO but are\n   * in MINIDUMP_MISC_INFO_2.  When this struct is populated, these values\n   * may not be set.  Use flags1 or sizeOfInfo to determine whether these\n   * values are present.  These are only valid when flags1 contains\n   * MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO. */\n  u_int32_t processor_max_mhz;\n  u_int32_t processor_current_mhz;\n  u_int32_t processor_mhz_limit;\n  u_int32_t processor_max_idle_state;\n  u_int32_t processor_current_idle_state;\n} MDRawMiscInfo;  /* MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO2 */\n\n#define MD_MISCINFO_SIZE 24\n#define MD_MISCINFO2_SIZE 44\n\n/* For (MDRawMiscInfo).flags1.  These values indicate which fields in the\n * MDRawMiscInfoStructure are valid. */\ntypedef enum {\n  MD_MISCINFO_FLAGS1_PROCESS_ID           = 0x00000001,\n      /* MINIDUMP_MISC1_PROCESS_ID */\n  MD_MISCINFO_FLAGS1_PROCESS_TIMES        = 0x00000002,\n      /* MINIDUMP_MISC1_PROCESS_TIMES */\n  MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO = 0x00000004\n      /* MINIDUMP_MISC1_PROCESSOR_POWER_INFO */\n} MDMiscInfoFlags1;\n\n/* \n * Around DbgHelp version 6.0, the style of new LIST structures changed\n * from including an array of length 1 at the end of the struct to\n * represent the variable-length data to including explicit\n * \"size of header\", \"size of entry\" and \"number of entries\" fields\n * in the header, presumably to allow backwards-compatibly-extending\n * the structures in the future. The actual list entries follow the\n * header data directly in this case.\n */\n\ntypedef struct {\n  u_int32_t size_of_header;    /* sizeof(MDRawMemoryInfoList) */\n  u_int32_t size_of_entry;     /* sizeof(MDRawMemoryInfo) */\n  u_int64_t number_of_entries;\n} MDRawMemoryInfoList;  /* MINIDUMP_MEMORY_INFO_LIST */\n\ntypedef struct {\n  u_int64_t base_address;           /* Base address of a region of pages */\n  u_int64_t allocation_base;        /* Base address of a range of pages\n                                     * within this region. */\n  u_int32_t allocation_protection;  /* Memory protection when this region\n                                     * was originally allocated:\n                                     * MDMemoryProtection */\n  u_int32_t __alignment1;\n  u_int64_t region_size;\n  u_int32_t state;                  /* MDMemoryState */\n  u_int32_t protection;             /* MDMemoryProtection */\n  u_int32_t type;                   /* MDMemoryType */\n  u_int32_t __alignment2;\n} MDRawMemoryInfo;  /* MINIDUMP_MEMORY_INFO */\n\n/* For (MDRawMemoryInfo).state */\ntypedef enum {\n  MD_MEMORY_STATE_COMMIT   = 0x1000,  /* physical storage has been allocated */\n  MD_MEMORY_STATE_RESERVE  = 0x2000,  /* reserved, but no physical storage */\n  MD_MEMORY_STATE_FREE     = 0x10000  /* available to be allocated */\n} MDMemoryState;\n\n/* For (MDRawMemoryInfo).allocation_protection and .protection */\ntypedef enum {\n  MD_MEMORY_PROTECT_NOACCESS          = 0x01,  /* PAGE_NOACCESS */\n  MD_MEMORY_PROTECT_READONLY          = 0x02,  /* PAGE_READONLY */\n  MD_MEMORY_PROTECT_READWRITE         = 0x04,  /* PAGE_READWRITE */\n  MD_MEMORY_PROTECT_WRITECOPY         = 0x08,  /* PAGE_WRITECOPY */\n  MD_MEMORY_PROTECT_EXECUTE           = 0x10,  /* PAGE_EXECUTE */\n  MD_MEMORY_PROTECT_EXECUTE_READ      = 0x20,  /* PAGE_EXECUTE_READ */\n  MD_MEMORY_PROTECT_EXECUTE_READWRITE = 0x40,  /* PAGE_EXECUTE_READWRITE */\n  MD_MEMORY_PROTECT_EXECUTE_WRITECOPY = 0x80,  /* PAGE_EXECUTE_WRITECOPY */\n  /* These options can be combined with the previous flags. */\n  MD_MEMORY_PROTECT_GUARD             = 0x100,  /* PAGE_GUARD */\n  MD_MEMORY_PROTECT_NOCACHE           = 0x200,  /* PAGE_NOCACHE */\n  MD_MEMORY_PROTECT_WRITECOMBINE      = 0x400,  /* PAGE_WRITECOMBINE */\n} MDMemoryProtection;\n\n/* Used to mask the mutually exclusive options from the combinable flags. */\nconst u_int32_t MD_MEMORY_PROTECTION_ACCESS_MASK = 0xFF;\n\n/* For (MDRawMemoryInfo).type */\ntypedef enum {\n  MD_MEMORY_TYPE_PRIVATE = 0x20000,   /* not shared by other processes */\n  MD_MEMORY_TYPE_MAPPED  = 0x40000,   /* mapped into the view of a section */\n  MD_MEMORY_TYPE_IMAGE   = 0x1000000  /* mapped into the view of an image */\n} MDMemoryType;\n\n/*\n * Breakpad extension types\n */\n\n\ntypedef struct {\n  /* validity is a bitmask with values from MDBreakpadInfoValidity, indicating\n   * which of the other fields in the structure are valid. */\n  u_int32_t validity;\n\n  /* Thread ID of the handler thread.  dump_thread_id should correspond to\n   * the thread_id of an MDRawThread in the minidump's MDRawThreadList if\n   * a dedicated thread in that list was used to produce the minidump.  If\n   * the MDRawThreadList does not contain a dedicated thread used to produce\n   * the minidump, this field should be set to 0 and the validity field\n   * must not contain MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID. */\n  u_int32_t dump_thread_id;\n\n  /* Thread ID of the thread that requested the minidump be produced.  As\n   * with dump_thread_id, requesting_thread_id should correspond to the\n   * thread_id of an MDRawThread in the minidump's MDRawThreadList.  For\n   * minidumps produced as a result of an exception, requesting_thread_id\n   * will be the same as the MDRawExceptionStream's thread_id field.  For\n   * minidumps produced \"manually\" at the program's request,\n   * requesting_thread_id will indicate which thread caused the dump to be\n   * written.  If the minidump was produced at the request of something\n   * other than a thread in the MDRawThreadList, this field should be set\n   * to 0 and the validity field must not contain\n   * MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID. */\n  u_int32_t requesting_thread_id;\n} MDRawBreakpadInfo;\n\n/* For (MDRawBreakpadInfo).validity: */\ntypedef enum {\n  /* When set, the dump_thread_id field is valid. */\n  MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID       = 1 << 0,\n\n  /* When set, the requesting_thread_id field is valid. */\n  MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID = 1 << 1\n} MDBreakpadInfoValidity;\n\ntypedef struct {\n  /* expression, function, and file are 0-terminated UTF-16 strings.  They\n   * may be truncated if necessary, but should always be 0-terminated when\n   * written to a file.\n   * Fixed-length strings are used because MiniDumpWriteDump doesn't offer\n   * a way for user streams to point to arbitrary RVAs for strings. */\n  u_int16_t expression[128];  /* Assertion that failed... */\n  u_int16_t function[128];    /* ...within this function... */\n  u_int16_t file[128];        /* ...in this file... */\n  u_int32_t line;             /* ...at this line. */\n  u_int32_t type;\n} MDRawAssertionInfo;\n\n/* For (MDRawAssertionInfo).type: */\ntypedef enum {\n  MD_ASSERTION_INFO_TYPE_UNKNOWN = 0,\n\n  /* Used for assertions that would be raised by the MSVC CRT but are\n   * directed to an invalid parameter handler instead. */\n  MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER,\n\n  /* Used for assertions that would be raised by the MSVC CRT but are\n   * directed to a pure virtual call handler instead. */\n  MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL\n} MDAssertionInfoData;\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif  /* _MSC_VER */\n\n\n#endif  /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/common/minidump_size.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */\n\n// minidump_size.h: Provides a C++ template for programmatic access to\n// the sizes of various types defined in minidump_format.h.\n//\n// Author: Mark Mentovai\n\n#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__\n#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__\n\n#include <sys/types.h>\n\n#include \"google_breakpad/common/minidump_format.h\"\n\nnamespace google_breakpad {\n\ntemplate<typename T>\nclass minidump_size {\n public:\n  static size_t size() { return sizeof(T); }\n};\n\n// Explicit specializations for variable-length types.  The size returned\n// for these should be the size for an object without its variable-length\n// section.\n\ntemplate<>\nclass minidump_size<MDString> {\n public:\n  static size_t size() { return MDString_minsize; }\n};\n\ntemplate<>\nclass minidump_size<MDRawThreadList> {\n public:\n  static size_t size() { return MDRawThreadList_minsize; }\n};\n\ntemplate<>\nclass minidump_size<MDCVInfoPDB20> {\n public:\n  static size_t size() { return MDCVInfoPDB20_minsize; }\n};\n\ntemplate<>\nclass minidump_size<MDCVInfoPDB70> {\n public:\n  static size_t size() { return MDCVInfoPDB70_minsize; }\n};\n\ntemplate<>\nclass minidump_size<MDImageDebugMisc> {\n public:\n  static size_t size() { return MDImageDebugMisc_minsize; }\n};\n\ntemplate<>\nclass minidump_size<MDRawModuleList> {\n public:\n  static size_t size() { return MDRawModuleList_minsize; }\n};\n\ntemplate<>\nclass minidump_size<MDRawMemoryList> {\n public:\n  static size_t size() { return MDRawMemoryList_minsize; }\n};\n\n// Explicit specialization for MDRawModule, for which sizeof may include\n// tail-padding on some architectures but not others.\n\ntemplate<>\nclass minidump_size<MDRawModule> {\n public:\n  static size_t size() { return MD_MODULE_SIZE; }\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/basic_source_line_resolver.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// basic_source_line_resolver.h: BasicSourceLineResolver is derived from\n// SourceLineResolverBase, and is a concrete implementation of\n// SourceLineResolverInterface, using address map files produced by a\n// compatible writer, e.g. PDBSourceLineWriter.\n//\n// see \"processor/source_line_resolver_base.h\"\n// and \"source_line_resolver_interface.h\" for more documentation.\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__\n\n#include <map>\n\n#include \"google_breakpad/processor/source_line_resolver_base.h\"\n\nnamespace google_breakpad {\n\nusing std::string;\nusing std::map;\n\nclass BasicSourceLineResolver : public SourceLineResolverBase {\n public:\n  BasicSourceLineResolver();\n  virtual ~BasicSourceLineResolver() { }\n\n  using SourceLineResolverBase::LoadModule;\n  using SourceLineResolverBase::LoadModuleUsingMapBuffer;\n  using SourceLineResolverBase::LoadModuleUsingMemoryBuffer;\n  using SourceLineResolverBase::ShouldDeleteMemoryBufferAfterLoadModule;\n  using SourceLineResolverBase::UnloadModule;\n  using SourceLineResolverBase::HasModule;\n  using SourceLineResolverBase::FillSourceLineInfo;\n  using SourceLineResolverBase::FindWindowsFrameInfo;\n  using SourceLineResolverBase::FindCFIFrameInfo;\n\n private:\n  // friend declarations:\n  friend class BasicModuleFactory;\n  friend class ModuleComparer;\n  friend class ModuleSerializer;\n  template<class> friend class SimpleSerializer;\n\n  // Function derives from SourceLineResolverBase::Function.\n  struct Function;\n  // Module implements SourceLineResolverBase::Module interface.\n  class Module;\n\n  // Disallow unwanted copy ctor and assignment operator\n  BasicSourceLineResolver(const BasicSourceLineResolver&);\n  void operator=(const BasicSourceLineResolver&);\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/call_stack.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// call_stack.h: A call stack comprised of stack frames.\n//\n// This class manages a vector of stack frames.  It is used instead of\n// exposing the vector directly to allow the CallStack to own StackFrame\n// pointers without having to publicly export the linked_ptr class.  A\n// CallStack must be composed of pointers instead of objects to allow for\n// CPU-specific StackFrame subclasses.\n//\n// By convention, the stack frame at index 0 is the innermost callee frame,\n// and the frame at the highest index in a call stack is the outermost\n// caller.  CallStack only allows stacks to be built by pushing frames,\n// beginning with the innermost callee frame.\n//\n// Author: Mark Mentovai\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_CALL_STACK_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_CALL_STACK_H__\n\n#include <vector>\n\nnamespace google_breakpad {\n\nusing std::vector;\n\nstruct StackFrame;\ntemplate<typename T> class linked_ptr;\n\nclass CallStack {\n public:\n  CallStack() { Clear(); }\n  ~CallStack();\n\n  // Resets the CallStack to its initial empty state\n  void Clear();\n  \n  const vector<StackFrame*>* frames() const { return &frames_; }\n\n private:\n  // Stackwalker is responsible for building the frames_ vector.\n  friend class Stackwalker;\n\n  // Storage for pushed frames.\n  vector<StackFrame*> frames_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCSSOR_CALL_STACK_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/code_module.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// code_module.h: Carries information about code modules that are loaded\n// into a process.\n//\n// Author: Mark Mentovai\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULE_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULE_H__\n\n#include <string>\n#include \"google_breakpad/common/breakpad_types.h\"\n\nnamespace google_breakpad {\n\nusing std::string;\n\nclass CodeModule {\n public:\n  virtual ~CodeModule() {}\n\n  // The base address of this code module as it was loaded by the process.\n  // (u_int64_t)-1 on error.\n  virtual u_int64_t base_address() const = 0;\n\n  // The size of the code module.  0 on error.\n  virtual u_int64_t size() const = 0;\n\n  // The path or file name that the code module was loaded from.  Empty on\n  // error.\n  virtual string code_file() const = 0;\n\n  // An identifying string used to discriminate between multiple versions and\n  // builds of the same code module.  This may contain a uuid, timestamp,\n  // version number, or any combination of this or other information, in an\n  // implementation-defined format.  Empty on error.\n  virtual string code_identifier() const = 0;\n\n  // The filename containing debugging information associated with the code\n  // module.  If debugging information is stored in a file separate from the\n  // code module itself (as is the case when .pdb or .dSYM files are used),\n  // this will be different from code_file.  If debugging information is\n  // stored in the code module itself (possibly prior to stripping), this\n  // will be the same as code_file.  Empty on error.\n  virtual string debug_file() const = 0;\n\n  // An identifying string similar to code_identifier, but identifies a\n  // specific version and build of the associated debug file.  This may be\n  // the same as code_identifier when the debug_file and code_file are\n  // identical or when the same identifier is used to identify distinct\n  // debug and code files.\n  virtual string debug_identifier() const = 0;\n\n  // A human-readable representation of the code module's version.  Empty on\n  // error.\n  virtual string version() const = 0;\n\n  // Creates a new copy of this CodeModule object, which the caller takes\n  // ownership of.  The new CodeModule may be of a different concrete class\n  // than the CodeModule being copied, but will behave identically to the\n  // copied CodeModule as far as the CodeModule interface is concerned.\n  virtual const CodeModule* Copy() const = 0;\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/code_modules.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// code_modules.h: Contains all of the CodeModule objects that were loaded\n// into a single process.\n//\n// Author: Mark Mentovai\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULES_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULES_H__\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\nnamespace google_breakpad {\n\nclass CodeModule;\n\nclass CodeModules {\n public:\n  virtual ~CodeModules() {}\n\n  // The number of contained CodeModule objects.\n  virtual unsigned int module_count() const = 0;\n\n  // Random access to modules.  Returns the module whose code is present\n  // at the address indicated by |address|.  If no module is present at this\n  // address, returns NULL.  Ownership of the returned CodeModule is retained\n  // by the CodeModules object; pointers returned by this method are valid for\n  // comparison with pointers returned by the other Get methods.\n  virtual const CodeModule* GetModuleForAddress(u_int64_t address) const = 0;\n\n  // Returns the module corresponding to the main executable.  If there is\n  // no main executable, returns NULL.  Ownership of the returned CodeModule\n  // is retained by the CodeModules object; pointers returned by this method\n  // are valid for comparison with pointers returned by the other Get\n  // methods.\n  virtual const CodeModule* GetMainModule() const = 0;\n\n  // Sequential access to modules.  A sequence number of 0 corresponds to the\n  // module residing lowest in memory.  If the sequence number is out of\n  // range, returns NULL.  Ownership of the returned CodeModule is retained\n  // by the CodeModules object; pointers returned by this method are valid for\n  // comparison with pointers returned by the other Get methods.\n  virtual const CodeModule* GetModuleAtSequence(\n      unsigned int sequence) const = 0;\n\n  // Sequential access to modules.  This is similar to GetModuleAtSequence,\n  // except no ordering requirement is enforced.  A CodeModules implementation\n  // may return CodeModule objects from GetModuleAtIndex in any order it\n  // wishes, provided that the order remain the same throughout the life of\n  // the CodeModules object.  Typically, GetModuleAtIndex would be used by\n  // a caller to enumerate all CodeModule objects quickly when the enumeration\n  // does not require any ordering.  If the index argument is out of range,\n  // returns NULL.  Ownership of the returned CodeModule is retained by\n  // the CodeModules object; pointers returned by this method are valid for\n  // comparison with pointers returned by the other Get methods.\n  virtual const CodeModule* GetModuleAtIndex(unsigned int index) const = 0;\n\n  // Creates a new copy of this CodeModules object, which the caller takes\n  // ownership of.  The new object will also contain copies of the existing\n  // object's child CodeModule objects.  The new CodeModules object may be of\n  // a different concrete class than the object being copied, but will behave\n  // identically to the copied object as far as the CodeModules and CodeModule\n  // interfaces are concerned, except that the order that GetModuleAtIndex\n  // returns objects in may differ between a copy and the original CodeModules\n  // object.\n  virtual const CodeModules* Copy() const = 0;\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_CODE_MODULES_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/exploitability.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// exploitability_engine.h: Generic exploitability engine.\n//\n// The Exploitability class is an abstract base class providing common\n// generic methods that apply to exploitability engines for specific platforms.\n// Specific implementations will extend this class by providing run\n// methods to fill in the exploitability_ enumeration of the ProcessState\n// for a crash.\n//\n// Author: Cris Neckar\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_H_\n#define GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_H_\n\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/processor/minidump.h\"\n#include \"google_breakpad/processor/process_state.h\"\n\nnamespace google_breakpad {\n\nclass Exploitability {\n public:\n  virtual ~Exploitability() {}\n\n  static Exploitability *ExploitabilityForPlatform(Minidump *dump,\n                                                   ProcessState *process_state);\n\n  ExploitabilityRating CheckExploitability();\n  bool AddressIsAscii(u_int64_t);\n\n protected:\n  Exploitability(Minidump *dump,\n                 ProcessState *process_state);\n\n  Minidump *dump_;\n  ProcessState *process_state_;\n  SystemInfo *system_info_;\n\n private:\n  virtual ExploitabilityRating CheckPlatformExploitability() = 0;\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/fast_source_line_resolver.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// fast_source_line_resolver.h: FastSourceLineResolver is derived from\n// SourceLineResolverBase, and is a concrete implementation of\n// SourceLineResolverInterface.\n//\n// FastSourceLineResolver is a sibling class of BasicSourceLineResolver.  The\n// difference is FastSourceLineResolver loads a serialized memory chunk of data\n// which can be used directly a Module without parsing or copying of underlying\n// data.  Therefore loading a symbol in FastSourceLineResolver is much faster\n// and more memory-efficient than BasicSourceLineResolver.\n//\n// See \"source_line_resolver_base.h\" and\n// \"google_breakpad/source_line_resolver_interface.h\" for more reference.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_FAST_SOURCE_LINE_RESOLVER_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_FAST_SOURCE_LINE_RESOLVER_H__\n\n#include <map>\n#include <string>\n\n#include \"google_breakpad/processor/source_line_resolver_base.h\"\n\nnamespace google_breakpad {\n\nusing std::map;\n\nclass FastSourceLineResolver : public SourceLineResolverBase {\n public:\n  FastSourceLineResolver();\n  virtual ~FastSourceLineResolver() { }\n\n  using SourceLineResolverBase::FillSourceLineInfo;\n  using SourceLineResolverBase::FindCFIFrameInfo;\n  using SourceLineResolverBase::FindWindowsFrameInfo;\n  using SourceLineResolverBase::HasModule;\n  using SourceLineResolverBase::LoadModule;\n  using SourceLineResolverBase::LoadModuleUsingMapBuffer;\n  using SourceLineResolverBase::LoadModuleUsingMemoryBuffer;\n  using SourceLineResolverBase::UnloadModule;\n\n private:\n  // Friend declarations.\n  friend class ModuleComparer;\n  friend class ModuleSerializer;\n  friend class FastModuleFactory;\n\n  // Nested types that will derive from corresponding nested types defined in\n  // SourceLineResolverBase.\n  struct Line;\n  struct Function;\n  struct PublicSymbol;\n  class Module;\n\n  // Deserialize raw memory data to construct a WindowsFrameInfo object.\n  static WindowsFrameInfo CopyWFI(const char *raw_memory);\n\n  // FastSourceLineResolver requires the memory buffer stays alive during the\n  // lifetime of a corresponding module, therefore it needs to redefine this\n  // virtual method.\n  virtual bool ShouldDeleteMemoryBufferAfterLoadModule();\n\n  // Disallow unwanted copy ctor and assignment operator\n  FastSourceLineResolver(const FastSourceLineResolver&);\n  void operator=(const FastSourceLineResolver&);\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_FAST_SOURCE_LINE_RESOLVER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/memory_region.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// memory_region.h: Access to memory regions.\n//\n// A MemoryRegion provides virtual access to a range of memory.  It is an\n// abstraction allowing the actual source of memory to be independent of\n// methods which need to access a virtual memory space.\n//\n// Author: Mark Mentovai\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_MEMORY_REGION_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_MEMORY_REGION_H__\n\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\n\nnamespace google_breakpad {\n\n\nclass MemoryRegion {\n public:\n  virtual ~MemoryRegion() {}\n\n  // The base address of this memory region.\n  virtual u_int64_t GetBase() const = 0;\n\n  // The size of this memory region.\n  virtual u_int32_t GetSize() const = 0;\n\n  // Access to data of various sizes within the memory region.  address\n  // is a pointer to read, and it must lie within the memory region as\n  // defined by its base address and size.  The location pointed to by\n  // value is set to the value at address.  Byte-swapping is performed\n  // if necessary so that the value is appropriate for the running\n  // program.  Returns true on success.  Fails and returns false if address\n  // is out of the region's bounds (after considering the width of value),\n  // or for other types of errors.\n  virtual bool GetMemoryAtAddress(u_int64_t address, u_int8_t*  value) const =0;\n  virtual bool GetMemoryAtAddress(u_int64_t address, u_int16_t* value) const =0;\n  virtual bool GetMemoryAtAddress(u_int64_t address, u_int32_t* value) const =0;\n  virtual bool GetMemoryAtAddress(u_int64_t address, u_int64_t* value) const =0;\n};\n\n\n}  // namespace google_breakpad\n\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_MEMORY_REGION_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/minidump.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// minidump.h: A minidump reader.\n//\n// The basic structure of this module tracks the structure of the minidump\n// file itself.  At the top level, a minidump file is represented by a\n// Minidump object.  Like most other classes in this module, Minidump\n// provides a Read method that initializes the object with information from\n// the file.  Most of the classes in this file are wrappers around the\n// \"raw\" structures found in the minidump file itself, and defined in\n// minidump_format.h.  For example, each thread is represented by a\n// MinidumpThread object, whose parameters are specified in an MDRawThread\n// structure.  A properly byte-swapped MDRawThread can be obtained from a\n// MinidumpThread easily by calling its thread() method.\n//\n// Most of the module lazily reads only the portion of the minidump file\n// necessary to fulfill the user's request.  Calling Minidump::Read\n// only reads the minidump's directory.  The thread list is not read until\n// it is needed, and even once it's read, the memory regions for each\n// thread's stack aren't read until they're needed.  This strategy avoids\n// unnecessary file input, and allocating memory for data in which the user\n// has no interest.  Note that although memory allocations for a typical\n// minidump file are not particularly large, it is possible for legitimate\n// minidumps to be sizable.  A full-memory minidump, for example, contains\n// a snapshot of the entire mapped memory space.  Even a normal minidump,\n// with stack memory only, can be large if, for example, the dump was\n// generated in response to a crash that occurred due to an infinite-\n// recursion bug that caused the stack's limits to be exceeded.  Finally,\n// some users of this library will unfortunately find themselves in the\n// position of having to process potentially-hostile minidumps that might\n// attempt to cause problems by forcing the minidump processor to over-\n// allocate memory.\n//\n// Memory management in this module is based on a strict\n// you-don't-own-anything policy.  The only object owned by the user is\n// the top-level Minidump object, the creation and destruction of which\n// must be the user's own responsibility.  All other objects obtained\n// through interaction with this module are ultimately owned by the\n// Minidump object, and will be freed upon the Minidump object's destruction.\n// Because memory regions can potentially involve large allocations, a\n// FreeMemory method is provided by MinidumpMemoryRegion, allowing the user\n// to release data when it is no longer needed.  Use of this method is\n// optional but recommended.  If freed data is later required, it will\n// be read back in from the minidump file again.\n//\n// There is one exception to this memory management policy:\n// Minidump::ReadString will return a string object to the user, and the user\n// is responsible for its deletion.\n//\n// Author: Mark Mentovai\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__\n\n#ifndef _WIN32\n#include <unistd.h>\n#endif\n\n#include <iostream>\n#include <map>\n#include <string>\n#include <vector>\n\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"google_breakpad/processor/code_module.h\"\n#include \"google_breakpad/processor/code_modules.h\"\n#include \"google_breakpad/processor/memory_region.h\"\n\n\nnamespace google_breakpad {\n\n\nusing std::map;\nusing std::string;\nusing std::vector;\n\n\nclass Minidump;\ntemplate<typename AddressType, typename EntryType> class RangeMap;\n\n\n// MinidumpObject is the base of all Minidump* objects except for Minidump\n// itself.\nclass MinidumpObject {\n public:\n  virtual ~MinidumpObject() {}\n\n  bool valid() const { return valid_; }\n\n protected:\n  explicit MinidumpObject(Minidump* minidump);\n\n  // Refers to the Minidump object that is the ultimate parent of this\n  // Some MinidumpObjects are owned by other MinidumpObjects, but at the\n  // root of the ownership tree is always a Minidump.  The Minidump object\n  // is kept here for access to its seeking and reading facilities, and\n  // for access to data about the minidump file itself, such as whether\n  // it should be byte-swapped.\n  Minidump* minidump_;\n\n  // MinidumpObjects are not valid when created.  When a subclass populates\n  // its own fields, it can set valid_ to true.  Accessors and mutators may\n  // wish to consider or alter the valid_ state as they interact with\n  // objects.\n  bool      valid_;\n};\n\n\n// This class exists primarily to provide a virtual destructor in a base\n// class common to all objects that might be stored in\n// Minidump::mStreamObjects.  Some object types (MinidumpContext) will\n// never be stored in Minidump::mStreamObjects, but are represented as\n// streams and adhere to the same interface, and may be derived from\n// this class.\nclass MinidumpStream : public MinidumpObject {\n public:\n  virtual ~MinidumpStream() {}\n\n protected:\n  explicit MinidumpStream(Minidump* minidump);\n\n private:\n  // Populate (and validate) the MinidumpStream.  minidump_ is expected\n  // to be positioned at the beginning of the stream, so that the next\n  // read from the minidump will be at the beginning of the stream.\n  // expected_size should be set to the stream's length as contained in\n  // the MDRawDirectory record or other identifying record.  A class\n  // that implements MinidumpStream can compare expected_size to a\n  // known size as an integrity check.\n  virtual bool Read(u_int32_t expected_size) = 0;\n};\n\n\n// MinidumpContext carries a CPU-specific MDRawContext structure, which\n// contains CPU context such as register states.  Each thread has its\n// own context, and the exception record, if present, also has its own\n// context.  Note that if the exception record is present, the context it\n// refers to is probably what the user wants to use for the exception\n// thread, instead of that thread's own context.  The exception thread's\n// context (as opposed to the exception record's context) will contain\n// context for the exception handler (which performs minidump generation),\n// and not the context that caused the exception (which is probably what the\n// user wants).\nclass MinidumpContext : public MinidumpStream {\n public:\n  virtual ~MinidumpContext();\n\n  // Returns an MD_CONTEXT_* value such as MD_CONTEXT_X86 or MD_CONTEXT_PPC\n  // identifying the CPU type that the context was collected from.  The\n  // returned value will identify the CPU only, and will have any other\n  // MD_CONTEXT_* bits masked out.  Returns 0 on failure.\n  u_int32_t GetContextCPU() const;\n\n  // Returns raw CPU-specific context data for the named CPU type.  If the\n  // context data does not match the CPU type or does not exist, returns\n  // NULL.\n  const MDRawContextAMD64* GetContextAMD64() const;\n  const MDRawContextARM*   GetContextARM() const;\n  const MDRawContextPPC*   GetContextPPC() const;\n  const MDRawContextSPARC* GetContextSPARC() const;\n  const MDRawContextX86*   GetContextX86() const;\n \n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  friend class MinidumpThread;\n  friend class MinidumpException;\n\n  explicit MinidumpContext(Minidump* minidump);\n\n  bool Read(u_int32_t expected_size);\n\n  // Free the CPU-specific context structure.\n  void FreeContext();\n\n  // If the minidump contains a SYSTEM_INFO_STREAM, makes sure that the\n  // system info stream gives an appropriate CPU type matching the context\n  // CPU type in context_cpu_type.  Returns false if the CPU type does not\n  // match.  Returns true if the CPU type matches or if the minidump does\n  // not contain a system info stream.\n  bool CheckAgainstSystemInfo(u_int32_t context_cpu_type);\n\n  // Store this separately because of the weirdo AMD64 context\n  u_int32_t context_flags_;\n\n  // The CPU-specific context structure.\n  union {\n    MDRawContextBase*  base;\n    MDRawContextX86*   x86;\n    MDRawContextPPC*   ppc;\n    MDRawContextAMD64* amd64;\n    // on Solaris SPARC, sparc is defined as a numeric constant,\n    // so variables can NOT be named as sparc\n    MDRawContextSPARC* ctx_sparc;\n    MDRawContextARM*   arm;\n  } context_;\n};\n\n\n// MinidumpMemoryRegion does not wrap any MDRaw structure, and only contains\n// a reference to an MDMemoryDescriptor.  This object is intended to wrap\n// portions of a minidump file that contain memory dumps.  In normal\n// minidumps, each MinidumpThread owns a MinidumpMemoryRegion corresponding\n// to the thread's stack memory.  MinidumpMemoryList also gives access to\n// memory regions in its list as MinidumpMemoryRegions.  This class\n// adheres to MemoryRegion so that it may be used as a data provider to\n// the Stackwalker family of classes.\nclass MinidumpMemoryRegion : public MinidumpObject,\n                             public MemoryRegion {\n public:\n  virtual ~MinidumpMemoryRegion();\n\n  static void set_max_bytes(u_int32_t max_bytes) { max_bytes_ = max_bytes; }\n  static u_int32_t max_bytes() { return max_bytes_; }\n\n  // Returns a pointer to the base of the memory region.  Returns the\n  // cached value if available, otherwise, reads the minidump file and\n  // caches the memory region.\n  const u_int8_t* GetMemory() const;\n\n  // The address of the base of the memory region.\n  u_int64_t GetBase() const;\n\n  // The size, in bytes, of the memory region.\n  u_int32_t GetSize() const;\n\n  // Frees the cached memory region, if cached.\n  void FreeMemory();\n\n  // Obtains the value of memory at the pointer specified by address.\n  bool GetMemoryAtAddress(u_int64_t address, u_int8_t*  value) const;\n  bool GetMemoryAtAddress(u_int64_t address, u_int16_t* value) const;\n  bool GetMemoryAtAddress(u_int64_t address, u_int32_t* value) const;\n  bool GetMemoryAtAddress(u_int64_t address, u_int64_t* value) const;\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  friend class MinidumpThread;\n  friend class MinidumpMemoryList;\n\n  explicit MinidumpMemoryRegion(Minidump* minidump);\n\n  // Identify the base address and size of the memory region, and the\n  // location it may be found in the minidump file.\n  void SetDescriptor(MDMemoryDescriptor* descriptor);\n\n  // Implementation for GetMemoryAtAddress\n  template<typename T> bool GetMemoryAtAddressInternal(u_int64_t address,\n                                                       T*        value) const;\n\n  // The largest memory region that will be read from a minidump.  The\n  // default is 1MB.\n  static u_int32_t max_bytes_;\n\n  // Base address and size of the memory region, and its position in the\n  // minidump file.\n  MDMemoryDescriptor* descriptor_;\n\n  // Cached memory.\n  mutable vector<u_int8_t>* memory_;\n};\n\n\n// MinidumpThread contains information about a thread of execution,\n// including a snapshot of the thread's stack and CPU context.  For\n// the thread that caused an exception, the context carried by\n// MinidumpException is probably desired instead of the CPU context\n// provided here.\nclass MinidumpThread : public MinidumpObject {\n public:\n  virtual ~MinidumpThread();\n\n  const MDRawThread* thread() const { return valid_ ? &thread_ : NULL; }\n  MinidumpMemoryRegion* GetMemory();\n  MinidumpContext* GetContext();\n\n  // The thread ID is used to determine if a thread is the exception thread,\n  // so a special getter is provided to retrieve this data from the\n  // MDRawThread structure.  Returns false if the thread ID cannot be\n  // determined.\n  bool GetThreadID(u_int32_t *thread_id) const;\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  // These objects are managed by MinidumpThreadList.\n  friend class MinidumpThreadList;\n\n  explicit MinidumpThread(Minidump* minidump);\n\n  // This works like MinidumpStream::Read, but is driven by\n  // MinidumpThreadList.  No size checking is done, because\n  // MinidumpThreadList handles that directly.\n  bool Read();\n\n  MDRawThread           thread_;\n  MinidumpMemoryRegion* memory_;\n  MinidumpContext*      context_;\n};\n\n\n// MinidumpThreadList contains all of the threads (as MinidumpThreads) in\n// a process.\nclass MinidumpThreadList : public MinidumpStream {\n public:\n  virtual ~MinidumpThreadList();\n\n  static void set_max_threads(u_int32_t max_threads) {\n    max_threads_ = max_threads;\n  }\n  static u_int32_t max_threads() { return max_threads_; }\n\n  unsigned int thread_count() const {\n    return valid_ ? thread_count_ : 0;\n  }\n\n  // Sequential access to threads.\n  MinidumpThread* GetThreadAtIndex(unsigned int index) const;\n\n  // Random access to threads.\n  MinidumpThread* GetThreadByID(u_int32_t thread_id);\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  friend class Minidump;\n\n  typedef map<u_int32_t, MinidumpThread*> IDToThreadMap;\n  typedef vector<MinidumpThread> MinidumpThreads;\n\n  static const u_int32_t kStreamType = MD_THREAD_LIST_STREAM;\n\n  explicit MinidumpThreadList(Minidump* aMinidump);\n\n  bool Read(u_int32_t aExpectedSize);\n\n  // The largest number of threads that will be read from a minidump.  The\n  // default is 256.\n  static u_int32_t max_threads_;\n\n  // Access to threads using the thread ID as the key.\n  IDToThreadMap    id_to_thread_map_;\n\n  // The list of threads.\n  MinidumpThreads* threads_;\n  u_int32_t        thread_count_;\n};\n\n\n// MinidumpModule wraps MDRawModule, which contains information about loaded\n// code modules.  Access is provided to various data referenced indirectly\n// by MDRawModule, such as the module's name and a specification for where\n// to locate debugging information for the module.\nclass MinidumpModule : public MinidumpObject,\n                       public CodeModule {\n public:\n  virtual ~MinidumpModule();\n\n  static void set_max_cv_bytes(u_int32_t max_cv_bytes) {\n    max_cv_bytes_ = max_cv_bytes;\n  }\n  static u_int32_t max_cv_bytes() { return max_cv_bytes_; }\n\n  static void set_max_misc_bytes(u_int32_t max_misc_bytes) {\n    max_misc_bytes_ = max_misc_bytes;\n  }\n  static u_int32_t max_misc_bytes() { return max_misc_bytes_; }\n\n  const MDRawModule* module() const { return valid_ ? &module_ : NULL; }\n\n  // CodeModule implementation\n  virtual u_int64_t base_address() const {\n    return valid_ ? module_.base_of_image : static_cast<u_int64_t>(-1);\n  }\n  virtual u_int64_t size() const { return valid_ ? module_.size_of_image : 0; }\n  virtual string code_file() const;\n  virtual string code_identifier() const;\n  virtual string debug_file() const;\n  virtual string debug_identifier() const;\n  virtual string version() const;\n  virtual const CodeModule* Copy() const;\n\n  // The CodeView record, which contains information to locate the module's\n  // debugging information (pdb).  This is returned as u_int8_t* because\n  // the data can be of types MDCVInfoPDB20* or MDCVInfoPDB70*, or it may be\n  // of a type unknown to Breakpad, in which case the raw data will still be\n  // returned but no byte-swapping will have been performed.  Check the\n  // record's signature in the first four bytes to differentiate between\n  // the various types.  Current toolchains generate modules which carry\n  // MDCVInfoPDB70 by default.  Returns a pointer to the CodeView record on\n  // success, and NULL on failure.  On success, the optional |size| argument\n  // is set to the size of the CodeView record.\n  const u_int8_t* GetCVRecord(u_int32_t* size);\n\n  // The miscellaneous debug record, which is obsolete.  Current toolchains\n  // do not generate this type of debugging information (dbg), and this\n  // field is not expected to be present.  Returns a pointer to the debugging\n  // record on success, and NULL on failure.  On success, the optional |size|\n  // argument is set to the size of the debugging record.\n  const MDImageDebugMisc* GetMiscRecord(u_int32_t* size);\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  // These objects are managed by MinidumpModuleList.\n  friend class MinidumpModuleList;\n\n  explicit MinidumpModule(Minidump* minidump);\n\n  // This works like MinidumpStream::Read, but is driven by\n  // MinidumpModuleList.  No size checking is done, because\n  // MinidumpModuleList handles that directly.\n  bool Read();\n\n  // Reads indirectly-referenced data, including the module name, CodeView\n  // record, and miscellaneous debugging record.  This is necessary to allow\n  // MinidumpModuleList to fully construct MinidumpModule objects without\n  // requiring seeks to read a contiguous set of MinidumpModule objects.\n  // All auxiliary data should be available when Read is called, in order to\n  // allow the CodeModule getters to be const methods.\n  bool ReadAuxiliaryData();\n\n  // The largest number of bytes that will be read from a minidump for a\n  // CodeView record or miscellaneous debugging record, respectively.  The\n  // default for each is 1024.\n  static u_int32_t max_cv_bytes_;\n  static u_int32_t max_misc_bytes_;\n\n  // True after a successful Read.  This is different from valid_, which is\n  // not set true until ReadAuxiliaryData also completes successfully.\n  // module_valid_ is only used by ReadAuxiliaryData and the functions it\n  // calls to determine whether the object is ready for auxiliary data to \n  // be read.\n  bool              module_valid_;\n\n  // True if debug info was read from the module.  Certain modules\n  // may contain debug records in formats we don't support,\n  // so we can just set this to false to ignore them.\n  bool              has_debug_info_;\n\n  MDRawModule       module_;\n\n  // Cached module name.\n  const string*     name_;\n\n  // Cached CodeView record - this is MDCVInfoPDB20 or (likely)\n  // MDCVInfoPDB70, or possibly something else entirely.  Stored as a u_int8_t\n  // because the structure contains a variable-sized string and its exact\n  // size cannot be known until it is processed.\n  vector<u_int8_t>* cv_record_;\n\n  // If cv_record_ is present, cv_record_signature_ contains a copy of the\n  // CodeView record's first four bytes, for ease of determinining the\n  // type of structure that cv_record_ contains.\n  u_int32_t cv_record_signature_;\n\n  // Cached MDImageDebugMisc (usually not present), stored as u_int8_t\n  // because the structure contains a variable-sized string and its exact\n  // size cannot be known until it is processed.\n  vector<u_int8_t>* misc_record_;\n};\n\n\n// MinidumpModuleList contains all of the loaded code modules for a process\n// in the form of MinidumpModules.  It maintains a map of these modules\n// so that it may easily provide a code module corresponding to a specific\n// address.\nclass MinidumpModuleList : public MinidumpStream,\n                           public CodeModules {\n public:\n  virtual ~MinidumpModuleList();\n\n  static void set_max_modules(u_int32_t max_modules) {\n    max_modules_ = max_modules;\n  }\n  static u_int32_t max_modules() { return max_modules_; }\n\n  // CodeModules implementation.\n  virtual unsigned int module_count() const {\n    return valid_ ? module_count_ : 0;\n  }\n  virtual const MinidumpModule* GetModuleForAddress(u_int64_t address) const;\n  virtual const MinidumpModule* GetMainModule() const;\n  virtual const MinidumpModule* GetModuleAtSequence(\n      unsigned int sequence) const;\n  virtual const MinidumpModule* GetModuleAtIndex(unsigned int index) const;\n  virtual const CodeModules* Copy() const;\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  friend class Minidump;\n\n  typedef vector<MinidumpModule> MinidumpModules;\n\n  static const u_int32_t kStreamType = MD_MODULE_LIST_STREAM;\n\n  explicit MinidumpModuleList(Minidump* minidump);\n\n  bool Read(u_int32_t expected_size);\n\n  // The largest number of modules that will be read from a minidump.  The\n  // default is 1024.\n  static u_int32_t max_modules_;\n\n  // Access to modules using addresses as the key.\n  RangeMap<u_int64_t, unsigned int> *range_map_;\n\n  MinidumpModules *modules_;\n  u_int32_t module_count_;\n};\n\n\n// MinidumpMemoryList corresponds to a minidump's MEMORY_LIST_STREAM stream,\n// which references the snapshots of all of the memory regions contained\n// within the minidump.  For a normal minidump, this includes stack memory\n// (also referenced by each MinidumpThread, in fact, the MDMemoryDescriptors\n// here and in MDRawThread both point to exactly the same data in a\n// minidump file, conserving space), as well as a 256-byte snapshot of memory\n// surrounding the instruction pointer in the case of an exception.  Other\n// types of minidumps may contain significantly more memory regions.  Full-\n// memory minidumps contain all of a process' mapped memory.\nclass MinidumpMemoryList : public MinidumpStream {\n public:\n  virtual ~MinidumpMemoryList();\n\n  static void set_max_regions(u_int32_t max_regions) {\n    max_regions_ = max_regions;\n  }\n  static u_int32_t max_regions() { return max_regions_; }\n\n  unsigned int region_count() const { return valid_ ? region_count_ : 0; }\n\n  // Sequential access to memory regions.\n  MinidumpMemoryRegion* GetMemoryRegionAtIndex(unsigned int index);\n\n  // Random access to memory regions.  Returns the region encompassing\n  // the address identified by address.\n  MinidumpMemoryRegion* GetMemoryRegionForAddress(u_int64_t address);\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  friend class Minidump;\n\n  typedef vector<MDMemoryDescriptor>   MemoryDescriptors;\n  typedef vector<MinidumpMemoryRegion> MemoryRegions;\n\n  static const u_int32_t kStreamType = MD_MEMORY_LIST_STREAM;\n\n  explicit MinidumpMemoryList(Minidump* minidump);\n\n  bool Read(u_int32_t expected_size);\n\n  // The largest number of memory regions that will be read from a minidump.\n  // The default is 256.\n  static u_int32_t max_regions_;\n\n  // Access to memory regions using addresses as the key.\n  RangeMap<u_int64_t, unsigned int> *range_map_;\n\n  // The list of descriptors.  This is maintained separately from the list\n  // of regions, because MemoryRegion doesn't own its MemoryDescriptor, it\n  // maintains a pointer to it.  descriptors_ provides the storage for this\n  // purpose.\n  MemoryDescriptors *descriptors_;\n\n  // The list of regions.\n  MemoryRegions *regions_;\n  u_int32_t region_count_;\n};\n\n\n// MinidumpException wraps MDRawExceptionStream, which contains information\n// about the exception that caused the minidump to be generated, if the\n// minidump was generated in an exception handler called as a result of\n// an exception.  It also provides access to a MinidumpContext object,\n// which contains the CPU context for the exception thread at the time\n// the exception occurred.\nclass MinidumpException : public MinidumpStream {\n public:\n  virtual ~MinidumpException();\n\n  const MDRawExceptionStream* exception() const {\n    return valid_ ? &exception_ : NULL;\n  }\n\n  // The thread ID is used to determine if a thread is the exception thread,\n  // so a special getter is provided to retrieve this data from the\n  // MDRawExceptionStream structure.  Returns false if the thread ID cannot\n  // be determined.\n  bool GetThreadID(u_int32_t *thread_id) const;\n\n  MinidumpContext* GetContext();\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  friend class Minidump;\n\n  static const u_int32_t kStreamType = MD_EXCEPTION_STREAM;\n\n  explicit MinidumpException(Minidump* minidump);\n\n  bool Read(u_int32_t expected_size);\n\n  MDRawExceptionStream exception_;\n  MinidumpContext*     context_;\n};\n\n// MinidumpAssertion wraps MDRawAssertionInfo, which contains information\n// about an assertion that caused the minidump to be generated.\nclass MinidumpAssertion : public MinidumpStream {\n public:\n  virtual ~MinidumpAssertion();\n\n  const MDRawAssertionInfo* assertion() const {\n    return valid_ ? &assertion_ : NULL;\n  }\n\n  string expression() const {\n    return valid_ ? expression_ : \"\";\n  }\n\n  string function() const {\n    return valid_ ? function_ : \"\";\n  }\n\n  string file() const {\n    return valid_ ? file_ : \"\";\n  }\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  friend class Minidump;\n\n  static const u_int32_t kStreamType = MD_ASSERTION_INFO_STREAM;\n\n  explicit MinidumpAssertion(Minidump* minidump);\n\n  bool Read(u_int32_t expected_size);\n\n  MDRawAssertionInfo assertion_;\n  string expression_;\n  string function_;\n  string file_;\n};\n\n\n// MinidumpSystemInfo wraps MDRawSystemInfo and provides information about\n// the system on which the minidump was generated.  See also MinidumpMiscInfo.\nclass MinidumpSystemInfo : public MinidumpStream {\n public:\n  virtual ~MinidumpSystemInfo();\n\n  const MDRawSystemInfo* system_info() const {\n    return valid_ ? &system_info_ : NULL;\n  }\n\n  // GetOS and GetCPU return textual representations of the operating system\n  // and CPU that produced the minidump.  Unlike most other Minidump* methods,\n  // they return string objects, not weak pointers.  Defined values for\n  // GetOS() are \"mac\", \"windows\", and \"linux\".  Defined values for GetCPU\n  // are \"x86\" and \"ppc\".  These methods return an empty string when their\n  // values are unknown.\n  string GetOS();\n  string GetCPU();\n\n  // I don't know what CSD stands for, but this field is documented as\n  // returning a textual representation of the OS service pack.  On other\n  // platforms, this provides additional information about an OS version\n  // level beyond major.minor.micro.  Returns NULL if unknown.\n  const string* GetCSDVersion();\n\n  // If a CPU vendor string can be determined, returns a pointer to it,\n  // otherwise, returns NULL.  CPU vendor strings can be determined from\n  // x86 CPUs with CPUID 0.\n  const string* GetCPUVendor();\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  friend class Minidump;\n\n  static const u_int32_t kStreamType = MD_SYSTEM_INFO_STREAM;\n\n  explicit MinidumpSystemInfo(Minidump* minidump);\n\n  bool Read(u_int32_t expected_size);\n\n  MDRawSystemInfo system_info_;\n\n  // Textual representation of the OS service pack, for minidumps produced\n  // by MiniDumpWriteDump on Windows.\n  const string* csd_version_;\n\n  // A string identifying the CPU vendor, if known.\n  const string* cpu_vendor_;\n};\n\n\n// MinidumpMiscInfo wraps MDRawMiscInfo and provides information about\n// the process that generated the minidump, and optionally additional system\n// information.  See also MinidumpSystemInfo.\nclass MinidumpMiscInfo : public MinidumpStream {\n public:\n  const MDRawMiscInfo* misc_info() const {\n    return valid_ ? &misc_info_ : NULL;\n  }\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  friend class Minidump;\n\n  static const u_int32_t kStreamType = MD_MISC_INFO_STREAM;\n\n  explicit MinidumpMiscInfo(Minidump* minidump_);\n\n  bool Read(u_int32_t expected_size_);\n\n  MDRawMiscInfo misc_info_;\n};\n\n\n// MinidumpBreakpadInfo wraps MDRawBreakpadInfo, which is an optional stream in\n// a minidump that provides additional information about the process state\n// at the time the minidump was generated.\nclass MinidumpBreakpadInfo : public MinidumpStream {\n public:\n  const MDRawBreakpadInfo* breakpad_info() const {\n    return valid_ ? &breakpad_info_ : NULL;\n  }\n\n  // These thread IDs are used to determine if threads deserve special\n  // treatment, so special getters are provided to retrieve this data from\n  // the MDRawBreakpadInfo structure.  The getters return false if the thread\n  // IDs cannot be determined.\n  bool GetDumpThreadID(u_int32_t *thread_id) const;\n  bool GetRequestingThreadID(u_int32_t *thread_id) const;\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  friend class Minidump;\n\n  static const u_int32_t kStreamType = MD_BREAKPAD_INFO_STREAM;\n\n  explicit MinidumpBreakpadInfo(Minidump* minidump_);\n\n  bool Read(u_int32_t expected_size_);\n\n  MDRawBreakpadInfo breakpad_info_;\n};\n\n// MinidumpMemoryInfo wraps MDRawMemoryInfo, which provides information\n// about mapped memory regions in a process, including their ranges\n// and protection.\nclass MinidumpMemoryInfo : public MinidumpObject {\n public:\n  const MDRawMemoryInfo* info() const { return valid_ ? &memory_info_ : NULL; }\n\n  // The address of the base of the memory region.\n  u_int64_t GetBase() const { return valid_ ? memory_info_.base_address : 0; }\n\n  // The size, in bytes, of the memory region.\n  u_int32_t GetSize() const { return valid_ ? memory_info_.region_size : 0; }\n\n  // Return true if the memory protection allows execution.\n  bool IsExecutable() const;\n\n  // Return true if the memory protection allows writing.\n  bool IsWritable() const;\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  // These objects are managed by MinidumpMemoryInfoList.\n  friend class MinidumpMemoryInfoList;\n\n  explicit MinidumpMemoryInfo(Minidump* minidump);\n\n  // This works like MinidumpStream::Read, but is driven by\n  // MinidumpMemoryInfoList.  No size checking is done, because\n  // MinidumpMemoryInfoList handles that directly.\n  bool Read();\n\n  MDRawMemoryInfo memory_info_;\n};\n\n// MinidumpMemoryInfoList contains a list of information about\n// mapped memory regions for a process in the form of MDRawMemoryInfo.\n// It maintains a map of these structures so that it may easily provide\n// info corresponding to a specific address.\nclass MinidumpMemoryInfoList : public MinidumpStream {\n public:\n  virtual ~MinidumpMemoryInfoList();\n\n  unsigned int info_count() const { return valid_ ? info_count_ : 0; }\n\n  const MinidumpMemoryInfo* GetMemoryInfoForAddress(u_int64_t address) const;\n  const MinidumpMemoryInfo* GetMemoryInfoAtIndex(unsigned int index) const;\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  friend class Minidump;\n\n  typedef vector<MinidumpMemoryInfo> MinidumpMemoryInfos;\n\n  static const u_int32_t kStreamType = MD_MEMORY_INFO_LIST_STREAM;\n\n  explicit MinidumpMemoryInfoList(Minidump* minidump);\n\n  bool Read(u_int32_t expected_size);\n\n  // Access to memory info using addresses as the key.\n  RangeMap<u_int64_t, unsigned int> *range_map_;\n\n  MinidumpMemoryInfos* infos_;\n  u_int32_t info_count_;\n};\n\n\n// Minidump is the user's interface to a minidump file.  It wraps MDRawHeader\n// and provides access to the minidump's top-level stream directory.\nclass Minidump {\n public:\n  // path is the pathname of a file containing the minidump.\n  explicit Minidump(const string& path);\n  // input is an istream wrapping minidump data. Minidump holds a\n  // weak pointer to input, and the caller must ensure that the stream\n  // is valid as long as the Minidump object is.\n  explicit Minidump(std::istream& input);\n\n  virtual ~Minidump();\n\n  // path may be empty if the minidump was not opened from a file\n  virtual string path() const {\n    return path_;\n  }\n  static void set_max_streams(u_int32_t max_streams) {\n    max_streams_ = max_streams;\n  }\n  static u_int32_t max_streams() { return max_streams_; }\n\n  static void set_max_string_length(u_int32_t max_string_length) {\n    max_string_length_ = max_string_length;\n  }\n  static u_int32_t max_string_length() { return max_string_length_; }\n\n  virtual const MDRawHeader* header() const { return valid_ ? &header_ : NULL; }\n\n  // Reads the minidump file's header and top-level stream directory.\n  // The minidump is expected to be positioned at the beginning of the\n  // header.  Read() sets up the stream list and map, and validates the\n  // Minidump object.\n  virtual bool Read();\n\n  // The next set of methods are stubs that call GetStream.  They exist to\n  // force code generation of the templatized API within the module, and\n  // to avoid exposing an ugly API (GetStream needs to accept a garbage\n  // parameter).\n  virtual MinidumpThreadList* GetThreadList();\n  MinidumpModuleList* GetModuleList();\n  MinidumpMemoryList* GetMemoryList();\n  MinidumpException* GetException();\n  MinidumpAssertion* GetAssertion();\n  MinidumpSystemInfo* GetSystemInfo();\n  MinidumpMiscInfo* GetMiscInfo();\n  MinidumpBreakpadInfo* GetBreakpadInfo();\n  MinidumpMemoryInfoList* GetMemoryInfoList();\n\n  // The next set of methods are provided for users who wish to access\n  // data in minidump files directly, while leveraging the rest of\n  // this class and related classes to handle the basic minidump\n  // structure and known stream types.\n\n  unsigned int GetDirectoryEntryCount() const {\n    return valid_ ? header_.stream_count : 0;\n  }\n  const MDRawDirectory* GetDirectoryEntryAtIndex(unsigned int index) const;\n\n  // The next 2 methods are lower-level I/O routines.  They use fd_.\n\n  // Reads count bytes from the minidump at the current position into\n  // the storage area pointed to by bytes.  bytes must be of sufficient\n  // size.  After the read, the file position is advanced by count.\n  bool ReadBytes(void* bytes, size_t count);\n\n  // Sets the position of the minidump file to offset.\n  bool SeekSet(off_t offset);\n\n  // Returns the current position of the minidump file.\n  off_t Tell();\n\n  // The next 2 methods are medium-level I/O routines.\n\n  // ReadString returns a string which is owned by the caller!  offset\n  // specifies the offset that a length-encoded string is stored at in the\n  // minidump file.\n  string* ReadString(off_t offset);\n\n  // SeekToStreamType positions the file at the beginning of a stream\n  // identified by stream_type, and informs the caller of the stream's\n  // length by setting *stream_length.  Because stream_map maps each stream\n  // type to only one stream in the file, this might mislead the user into\n  // thinking that the stream that this seeks to is the only stream with\n  // type stream_type.  That can't happen for streams that these classes\n  // deal with directly, because they're only supposed to be present in the\n  // file singly, and that's verified when stream_map_ is built.  Users who\n  // are looking for other stream types should be aware of this\n  // possibility, and consider using GetDirectoryEntryAtIndex (possibly\n  // with GetDirectoryEntryCount) if expecting multiple streams of the same\n  // type in a single minidump file.\n  bool SeekToStreamType(u_int32_t stream_type, u_int32_t* stream_length);\n\n  bool swap() const { return valid_ ? swap_ : false; }\n\n  // Print a human-readable representation of the object to stdout.\n  void Print();\n\n private:\n  // MinidumpStreamInfo is used in the MinidumpStreamMap.  It lets\n  // the Minidump object locate interesting streams quickly, and\n  // provides a convenient place to stash MinidumpStream objects.\n  struct MinidumpStreamInfo {\n    MinidumpStreamInfo() : stream_index(0), stream(NULL) {}\n    ~MinidumpStreamInfo() { delete stream; }\n\n    // Index into the MinidumpDirectoryEntries vector\n    unsigned int    stream_index;\n\n    // Pointer to the stream if cached, or NULL if not yet populated\n    MinidumpStream* stream;\n  };\n\n  typedef vector<MDRawDirectory> MinidumpDirectoryEntries;\n  typedef map<u_int32_t, MinidumpStreamInfo> MinidumpStreamMap;\n\n  template<typename T> T* GetStream(T** stream);\n\n  // Opens the minidump file, or if already open, seeks to the beginning.\n  bool Open();\n\n  // The largest number of top-level streams that will be read from a minidump.\n  // Note that streams are only read (and only consume memory) as needed,\n  // when directed by the caller.  The default is 128.\n  static u_int32_t max_streams_;\n\n  // The maximum length of a UTF-16 string that will be read from a minidump\n  // in 16-bit words.  The default is 1024.  UTF-16 strings are converted\n  // to UTF-8 when stored in memory, and each UTF-16 word will be represented\n  // by as many as 3 bytes in UTF-8.\n  static unsigned int max_string_length_;\n\n  MDRawHeader               header_;\n\n  // The list of streams.\n  MinidumpDirectoryEntries* directory_;\n\n  // Access to streams using the stream type as the key.\n  MinidumpStreamMap*        stream_map_;\n\n  // The pathname of the minidump file to process, set in the constructor.\n  // This may be empty if the minidump was opened directly from a stream.\n  const string              path_;\n\n  // The stream for all file I/O.  Used by ReadBytes and SeekSet.\n  // Set based on the path in Open, or directly in the constructor.\n  std::istream*             stream_;\n\n  // swap_ is true if the minidump file should be byte-swapped.  If the\n  // minidump was produced by a CPU that is other-endian than the CPU\n  // processing the minidump, this will be true.  If the two CPUs are\n  // same-endian, this will be false.\n  bool                      swap_;\n\n  // Validity of the Minidump structure, false immediately after\n  // construction or after a failed Read(); true following a successful\n  // Read().\n  bool                      valid_;\n};\n\n\n}  // namespace google_breakpad\n\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/minidump_processor.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__\n\n#include <assert.h>\n#include <string>\n#include \"google_breakpad/common/breakpad_types.h\"\n\nnamespace google_breakpad {\n\nusing std::string;\n\nclass Minidump;\nclass ProcessState;\nclass SourceLineResolverInterface;\nclass SymbolSupplier;\nstruct SystemInfo;\n// Return type for Process()\nenum ProcessResult {\n  PROCESS_OK,                                 // The minidump was\n                                              // processed\n                                              // successfully.\n\n  PROCESS_ERROR_MINIDUMP_NOT_FOUND,           // The minidump file\n                                              // was not found.\n\n  PROCESS_ERROR_NO_MINIDUMP_HEADER,           // The minidump file\n                                              // had no header\n\n  PROCESS_ERROR_NO_THREAD_LIST,               // The minidump file\n                                              // had no thread list.\n\n  PROCESS_ERROR_GETTING_THREAD,               // There was an error\n                                              // getting one\n                                              // thread's data from\n                                              // the minidump.\n\n  PROCESS_ERROR_GETTING_THREAD_ID,            // There was an error\n                                              // getting a thread id\n                                              // from the thread's\n                                              // data.\n\n  PROCESS_ERROR_DUPLICATE_REQUESTING_THREADS, // There was more than\n                                              // one requesting\n                                              // thread.\n\n  PROCESS_ERROR_NO_MEMORY_FOR_THREAD,         // A thread had no\n                                              // memory region.\n\n  PROCESS_ERROR_NO_STACKWALKER_FOR_THREAD,    // We couldn't\n                                              // determine the\n                                              // StackWalker to walk\n                                              // the minidump's\n                                              // threads.\n\n  PROCESS_SYMBOL_SUPPLIER_INTERRUPTED         // The minidump\n                                              // processing was\n                                              // interrupted by the\n                                              // SymbolSupplier(not\n                                              // fatal)\n};\n\nclass MinidumpProcessor {\n public:\n  // Initializes this MinidumpProcessor.  supplier should be an\n  // implementation of the SymbolSupplier abstract base class.\n  MinidumpProcessor(SymbolSupplier *supplier,\n                    SourceLineResolverInterface *resolver);\n\n  // Initializes the MinidumpProcessor with the option of\n  // enabling the exploitability framework to analyze dumps\n  // for probable security relevance.\n  MinidumpProcessor(SymbolSupplier *supplier,\n                    SourceLineResolverInterface *resolver,\n                    bool enable_exploitability);\n\n  ~MinidumpProcessor();\n\n  // Processes the minidump file and fills process_state with the result.\n  ProcessResult Process(const string &minidump_file,\n                        ProcessState *process_state);\n\n  // Processes the minidump structure and fills process_state with the\n  // result.\n  ProcessResult Process(Minidump *minidump,\n                        ProcessState *process_state);\n  // Populates the cpu_* fields of the |info| parameter with textual\n  // representations of the CPU type that the minidump in |dump| was\n  // produced on.  Returns false if this information is not available in\n  // the minidump.\n  static bool GetCPUInfo(Minidump *dump, SystemInfo *info);\n\n  // Populates the os_* fields of the |info| parameter with textual\n  // representations of the operating system that the minidump in |dump|\n  // was produced on.  Returns false if this information is not available in\n  // the minidump.\n  static bool GetOSInfo(Minidump *dump, SystemInfo *info);\n\n  // Returns a textual representation of the reason that a crash occurred,\n  // if the minidump in dump was produced as a result of a crash.  Returns\n  // an empty string if this information cannot be determined.  If address\n  // is non-NULL, it will be set to contain the address that caused the\n  // exception, if this information is available.  This will be a code\n  // address when the crash was caused by problems such as illegal\n  // instructions or divisions by zero, or a data address when the crash\n  // was caused by a memory access violation.\n  static string GetCrashReason(Minidump *dump, u_int64_t *address);\n\n  // This function returns true if the passed-in error code is\n  // something unrecoverable(i.e. retry should not happen).  For\n  // instance, if the minidump is corrupt, then it makes no sense to\n  // retry as we won't be able to glean additional information.\n  // However, as an example of the other case, the symbol supplier can\n  // return an error code indicating it was 'interrupted', which can\n  // happen of the symbols are fetched from a remote store, and a\n  // retry might be successful later on.\n  // You should not call this method with PROCESS_OK! Test for\n  // that separately before calling this.\n  static bool IsErrorUnrecoverable(ProcessResult p) {\n    assert(p !=  PROCESS_OK);\n    return (p != PROCESS_SYMBOL_SUPPLIER_INTERRUPTED);\n  }\n\n  // Returns a textual representation of an assertion included\n  // in the minidump.  Returns an empty string if this information\n  // does not exist or cannot be determined.\n  static string GetAssertion(Minidump *dump);\n\n private:\n  SymbolSupplier *supplier_;\n  SourceLineResolverInterface *resolver_;\n\n  // This flag enables the exploitability scanner which attempts to\n  // guess how likely it is that the crash represents an exploitable\n  // memory corruption issue.\n  bool enable_exploitability_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/process_state.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// process_state.h: A snapshot of a process, in a fully-digested state.\n//\n// Author: Mark Mentovai\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__\n\n#include <string>\n#include <vector>\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/processor/system_info.h\"\n#include \"google_breakpad/processor/minidump.h\"\n\nnamespace google_breakpad {\n\nusing std::string;\nusing std::vector;\n\nclass CallStack;\nclass CodeModules;\n\nenum ExploitabilityRating {\n  EXPLOITABILITY_HIGH,                    // The crash likely represents\n                                          // a exploitable memory corruption\n                                          // vulnerability.\n\n  EXPLOITABLITY_MEDIUM,                   // The crash appears to corrupt\n                                          // memory in a way which may be\n                                          // exploitable in some situations.\n\n  EXPLOITABILITY_LOW,                     // The crash either does not corrupt\n                                          // memory directly or control over\n                                          // the effected data is limited. The\n                                          // issue may still be exploitable\n                                          // on certain platforms or situations.\n\n  EXPLOITABILITY_INTERESTING,             // The crash does not appear to be\n                                          // directly exploitable. However it\n                                          // represents a condition which should\n                                          // be furthur analyzed.\n\n  EXPLOITABILITY_NONE,                    // The crash does not appear to represent\n                                          // an exploitable condition.\n\n  EXPLOITABILITY_NOT_ANALYZED,            // The crash was not analyzed for\n                                          // exploitability because the engine\n                                          // was disabled.\n\n  EXPLOITABILITY_ERR_NOENGINE,            // The supplied minidump's platform does\n                                          // not have a exploitability engine\n                                          // associated with it.\n\n  EXPLOITABILITY_ERR_PROCESSING           // An error occured within the\n                                          // exploitability engine and no rating\n                                          // was calculated.\n};\n\nclass ProcessState {\n public:\n  ProcessState() : modules_(NULL) { Clear(); }\n  ~ProcessState();\n\n  // Resets the ProcessState to its default values\n  void Clear();\n\n  // Accessors.  See the data declarations below.\n  u_int32_t time_date_stamp() const { return time_date_stamp_; }\n  bool crashed() const { return crashed_; }\n  string crash_reason() const { return crash_reason_; }\n  u_int64_t crash_address() const { return crash_address_; }\n  string assertion() const { return assertion_; }\n  int requesting_thread() const { return requesting_thread_; }\n  const vector<CallStack*>* threads() const { return &threads_; }\n  const vector<MinidumpMemoryRegion*>* thread_memory_regions() const {\n    return &thread_memory_regions_;\n  }\n  const SystemInfo* system_info() const { return &system_info_; }\n  const CodeModules* modules() const { return modules_; }\n  ExploitabilityRating exploitability() const { return exploitability_; }\n\n private:\n  // MinidumpProcessor is responsible for building ProcessState objects.\n  friend class MinidumpProcessor;\n\n  // The time-date stamp of the minidump (time_t format)\n  u_int32_t time_date_stamp_;\n\n  // True if the process crashed, false if the dump was produced outside\n  // of an exception handler.\n  bool crashed_;\n\n  // If the process crashed, the type of crash.  OS- and possibly CPU-\n  // specific.  For example, \"EXCEPTION_ACCESS_VIOLATION\" (Windows),\n  // \"EXC_BAD_ACCESS / KERN_INVALID_ADDRESS\" (Mac OS X), \"SIGSEGV\"\n  // (other Unix).\n  string crash_reason_;\n\n  // If the process crashed, and if crash_reason implicates memory,\n  // the memory address that caused the crash.  For data access errors,\n  // this will be the data address that caused the fault.  For code errors,\n  // this will be the address of the instruction that caused the fault.\n  u_int64_t crash_address_;\n\n  // If there was an assertion that was hit, a textual representation\n  // of that assertion, possibly including the file and line at which\n  // it occurred.\n  string assertion_;\n\n  // The index of the thread that requested a dump be written in the\n  // threads vector.  If a dump was produced as a result of a crash, this\n  // will point to the thread that crashed.  If the dump was produced as\n  // by user code without crashing, and the dump contains extended Breakpad\n  // information, this will point to the thread that requested the dump.\n  // If the dump was not produced as a result of an exception and no\n  // extended Breakpad information is present, this field will be set to -1,\n  // indicating that the dump thread is not available.\n  int requesting_thread_;\n\n  // Stacks for each thread (except possibly the exception handler\n  // thread) at the time of the crash.\n  vector<CallStack*> threads_;\n  vector<MinidumpMemoryRegion*> thread_memory_regions_;\n\n  // OS and CPU information.\n  SystemInfo system_info_;\n\n  // The modules that were loaded into the process represented by the\n  // ProcessState.\n  const CodeModules *modules_;\n\n  // The exploitability rating as determined by the exploitability\n  // engine. When the exploitability engine is not enabled this\n  // defaults to EXPLOITABILITY_NONE.\n  ExploitabilityRating exploitability_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/source_line_resolver_base.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// source_line_resolver_base.h: SourceLineResolverBase, an (incomplete)\n// implementation of SourceLineResolverInterface.  It serves as a common base\n// class for concrete implementations: FastSourceLineResolver and\n// BasicSourceLineResolver.  It is designed for refactoring that removes\n// code redundancy in the two concrete source line resolver classes.\n//\n// See \"google_breakpad/processor/source_line_resolver_interface.h\" for more\n// documentation.\n\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_BASE_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_BASE_H__\n\n#include <map>\n#include <string>\n\n#include \"google_breakpad/processor/source_line_resolver_interface.h\"\n\nnamespace google_breakpad {\n\nusing std::map;\n\n// Forward declaration.\n// ModuleFactory is a simple factory interface for creating a Module instance\n// at run-time.\nclass ModuleFactory;\n\nclass SourceLineResolverBase : public SourceLineResolverInterface {\n public:\n  // Read the symbol_data from a file with given file_name.\n  // The part of code was originally in BasicSourceLineResolver::Module's\n  // LoadMap() method.\n  // Place dynamically allocated heap buffer in symbol_data. Caller has the\n  // ownership of the buffer, and should call delete [] to free the buffer.\n  static bool ReadSymbolFile(char **symbol_data, const string &file_name);\n\n protected:\n  // Users are not allowed create SourceLineResolverBase instance directly.\n  SourceLineResolverBase(ModuleFactory *module_factory);\n  virtual ~SourceLineResolverBase();\n\n  // Virtual methods inherited from SourceLineResolverInterface.\n  virtual bool LoadModule(const CodeModule *module, const string &map_file);\n  virtual bool LoadModuleUsingMapBuffer(const CodeModule *module,\n                                        const string &map_buffer);\n  virtual bool LoadModuleUsingMemoryBuffer(const CodeModule *module,\n                                           char *memory_buffer);\n  virtual bool ShouldDeleteMemoryBufferAfterLoadModule();\n  virtual void UnloadModule(const CodeModule *module);\n  virtual bool HasModule(const CodeModule *module);\n  virtual void FillSourceLineInfo(StackFrame *frame);\n  virtual WindowsFrameInfo *FindWindowsFrameInfo(const StackFrame *frame);\n  virtual CFIFrameInfo *FindCFIFrameInfo(const StackFrame *frame);\n\n  // Nested structs and classes.\n  struct Line;\n  struct Function;\n  struct PublicSymbol;\n  struct CompareString {\n    bool operator()(const string &s1, const string &s2) const;\n  };\n  // Module is an interface for an in-memory symbol file.\n  class Module;\n  class AutoFileCloser;\n\n  // All of the modules that are loaded.\n  typedef map<string, Module*, CompareString> ModuleMap;\n  ModuleMap *modules_;\n\n  // All of heap-allocated buffers that are owned locally by resolver.\n  typedef std::map<string, char*, CompareString> MemoryMap;\n  MemoryMap *memory_buffers_;\n\n  // Creates a concrete module at run-time.\n  ModuleFactory *module_factory_;\n\n private:\n  // ModuleFactory needs to have access to protected type Module.\n  friend class ModuleFactory;\n\n  // Disallow unwanted copy ctor and assignment operator\n  SourceLineResolverBase(const SourceLineResolverBase&);\n  void operator=(const SourceLineResolverBase&);\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_BASE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/source_line_resolver_interface.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Abstract interface to return function/file/line info for a memory address.\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__\n\n#include <string>\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/processor/code_module.h\"\n\nnamespace google_breakpad {\n\nusing std::string;\n\nstruct StackFrame;\nstruct WindowsFrameInfo;\nclass CFIFrameInfo;\n\nclass SourceLineResolverInterface {\n public:\n  typedef u_int64_t MemAddr;\n\n  virtual ~SourceLineResolverInterface() {}\n\n  // Adds a module to this resolver, returning true on success.\n  //\n  // module should have at least the code_file, debug_file,\n  // and debug_identifier members populated.\n  //\n  // map_file should contain line/address mappings for this module.\n  virtual bool LoadModule(const CodeModule *module,\n                          const string &map_file) = 0;\n  // Same as above, but takes the contents of a pre-read map buffer\n  virtual bool LoadModuleUsingMapBuffer(const CodeModule *module,\n                                        const string &map_buffer) = 0;\n\n  // Add an interface to load symbol using C-String data insteading string.\n  // This is useful in the optimization design for avoiding unnecessary copying\n  // of symbol data, in order to improve memory efficiency.\n  // LoadModuleUsingMemoryBuffer() does NOT take ownership of memory_buffer.\n  virtual bool LoadModuleUsingMemoryBuffer(const CodeModule *module,\n                                           char *memory_buffer) = 0;\n\n  // Return true if the memory buffer should be deleted immediately after\n  // LoadModuleUsingMemoryBuffer(). Return false if the memory buffer has to be\n  // alive during the lifetime of the corresponding Module.\n  virtual bool ShouldDeleteMemoryBufferAfterLoadModule() = 0;\n\n  // Request that the specified module be unloaded from this resolver.\n  // A resolver may choose to ignore such a request.\n  virtual void UnloadModule(const CodeModule *module) = 0;\n\n  // Returns true if the module has been loaded.\n  virtual bool HasModule(const CodeModule *module) = 0;\n\n  // Fills in the function_base, function_name, source_file_name,\n  // and source_line fields of the StackFrame.  The instruction and\n  // module_name fields must already be filled in.\n  virtual void FillSourceLineInfo(StackFrame *frame) = 0;\n\n  // If Windows stack walking information is available covering\n  // FRAME's instruction address, return a WindowsFrameInfo structure\n  // describing it. If the information is not available, returns NULL.\n  // A NULL return value does not indicate an error. The caller takes\n  // ownership of any returned WindowsFrameInfo object.\n  virtual WindowsFrameInfo *FindWindowsFrameInfo(const StackFrame *frame) = 0;\n\n  // If CFI stack walking information is available covering ADDRESS,\n  // return a CFIFrameInfo structure describing it. If the information\n  // is not available, return NULL. The caller takes ownership of any\n  // returned CFIFrameInfo object.\n  virtual CFIFrameInfo *FindCFIFrameInfo(const StackFrame *frame) = 0;\n\n protected:\n  // SourceLineResolverInterface cannot be instantiated except by subclasses\n  SourceLineResolverInterface() {}\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_SOURCE_LINE_RESOLVER_INTERFACE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/stack_frame.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_H__\n\n#include <string>\n#include \"google_breakpad/common/breakpad_types.h\"\n\nnamespace google_breakpad {\n\nclass CodeModule;\n\nusing std::string;\n\nstruct StackFrame {\n  // Indicates how well the instruction pointer derived during\n  // stack walking is trusted. Since the stack walker can resort to\n  // stack scanning, it can wind up with dubious frames.\n  // In rough order of \"trust metric\".\n  enum FrameTrust {\n    FRAME_TRUST_NONE,     // Unknown\n    FRAME_TRUST_SCAN,     // Scanned the stack, found this\n    FRAME_TRUST_CFI_SCAN, // Scanned the stack using call frame info, found this\n    FRAME_TRUST_FP,       // Derived from frame pointer\n    FRAME_TRUST_CFI,      // Derived from call frame info\n    FRAME_TRUST_CONTEXT   // Given as instruction pointer in a context\n  };\n\n  StackFrame()\n      : instruction(),\n        module(NULL),\n        function_name(),\n        function_base(),\n        source_file_name(),\n        source_line(),\n        source_line_base(),\n        trust(FRAME_TRUST_NONE) {}\n  virtual ~StackFrame() {}\n\n  // Return a string describing how this stack frame was found\n  // by the stackwalker.\n  string trust_description() const {\n    switch (trust) {\n      case StackFrame::FRAME_TRUST_CONTEXT:\n        return \"given as instruction pointer in context\";\n      case StackFrame::FRAME_TRUST_CFI:\n        return \"call frame info\";\n      case StackFrame::FRAME_TRUST_CFI_SCAN:\n        return \"call frame info with scanning\";\n      case StackFrame::FRAME_TRUST_FP:\n        return \"previous frame's frame pointer\";\n      case StackFrame::FRAME_TRUST_SCAN:\n        return \"stack scanning\";\n      default:\n        return \"unknown\";\n    }\n  };\n\n  // The program counter location as an absolute virtual address.  For the\n  // innermost called frame in a stack, this will be an exact program counter\n  // or instruction pointer value.  For all other frames, this will be within\n  // the instruction that caused execution to branch to a called function,\n  // but may not necessarily point to the exact beginning of that instruction.\n  u_int64_t instruction;\n\n  // The module in which the instruction resides.\n  const CodeModule *module;\n\n  // The function name, may be omitted if debug symbols are not available.\n  string function_name;\n\n  // The start address of the function, may be omitted if debug symbols\n  // are not available.\n  u_int64_t function_base;\n\n  // The source file name, may be omitted if debug symbols are not available.\n  string source_file_name;\n\n  // The (1-based) source line number, may be omitted if debug symbols are\n  // not available.\n  int source_line;\n\n  // The start address of the source line, may be omitted if debug symbols\n  // are not available.\n  u_int64_t source_line_base;\n\n  // Amount of trust the stack walker has in the instruction pointer\n  // of this frame.\n  FrameTrust trust;\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/stack_frame_cpu.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stack_frame_cpu.h: CPU-specific StackFrame extensions.\n//\n// These types extend the StackFrame structure to carry CPU-specific register\n// state.  They are defined in this header instead of stack_frame.h to\n// avoid the need to include minidump_format.h when only the generic\n// StackFrame type is needed.\n//\n// Author: Mark Mentovai\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__\n\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"google_breakpad/processor/stack_frame.h\"\n\nnamespace google_breakpad {\n\nstruct WindowsFrameInfo;\nclass CFIFrameInfo;\n\nstruct StackFrameX86 : public StackFrame {\n  // ContextValidity has one entry for each relevant hardware pointer\n  // register (%eip and %esp) and one entry for each general-purpose\n  // register. It's worthwhile having validity flags for caller-saves\n  // registers: they are valid in the youngest frame, and such a frame\n  // might save a callee-saves register in a caller-saves register, but\n  // SimpleCFIWalker won't touch registers unless they're marked as valid.\n  enum ContextValidity {\n    CONTEXT_VALID_NONE = 0,\n    CONTEXT_VALID_EIP  = 1 << 0,\n    CONTEXT_VALID_ESP  = 1 << 1,\n    CONTEXT_VALID_EBP  = 1 << 2,\n    CONTEXT_VALID_EAX  = 1 << 3,\n    CONTEXT_VALID_EBX  = 1 << 4,\n    CONTEXT_VALID_ECX  = 1 << 5,\n    CONTEXT_VALID_EDX  = 1 << 6,\n    CONTEXT_VALID_ESI  = 1 << 7,\n    CONTEXT_VALID_EDI  = 1 << 8,\n    CONTEXT_VALID_ALL  = -1\n  };\n\n StackFrameX86()\n     : context(),\n       context_validity(CONTEXT_VALID_NONE),\n       windows_frame_info(NULL),\n       cfi_frame_info(NULL) {}\n  ~StackFrameX86();\n\n  // Register state.  This is only fully valid for the topmost frame in a\n  // stack.  In other frames, the values of nonvolatile registers may be\n  // present, given sufficient debugging information.  Refer to\n  // context_validity.\n  MDRawContextX86 context;\n\n  // context_validity is actually ContextValidity, but int is used because\n  // the OR operator doesn't work well with enumerated types.  This indicates\n  // which fields in context are valid.\n  int context_validity;\n\n  // Any stack walking information we found describing this.instruction.\n  // These may be NULL if there is no such information for that address.\n  WindowsFrameInfo *windows_frame_info;\n  CFIFrameInfo *cfi_frame_info;\n};\n\nstruct StackFramePPC : public StackFrame {\n  // ContextValidity should eventually contain entries for the validity of\n  // other nonvolatile (callee-save) registers as in\n  // StackFrameX86::ContextValidity, but the ppc stackwalker doesn't currently\n  // locate registers other than the ones listed here.\n  enum ContextValidity {\n    CONTEXT_VALID_NONE = 0,\n    CONTEXT_VALID_SRR0 = 1 << 0,\n    CONTEXT_VALID_GPR1 = 1 << 1,\n    CONTEXT_VALID_ALL  = -1\n  };\n\n  StackFramePPC() : context(), context_validity(CONTEXT_VALID_NONE) {}\n\n  // Register state.  This is only fully valid for the topmost frame in a\n  // stack.  In other frames, the values of nonvolatile registers may be\n  // present, given sufficient debugging information.  Refer to\n  // context_validity.\n  MDRawContextPPC context;\n\n  // context_validity is actually ContextValidity, but int is used because\n  // the OR operator doesn't work well with enumerated types.  This indicates\n  // which fields in context are valid.\n  int context_validity;\n};\n\nstruct StackFrameAMD64 : public StackFrame {\n  // ContextValidity has one entry for each register that we might be able\n  // to recover.\n  enum ContextValidity {\n    CONTEXT_VALID_NONE  = 0,\n    CONTEXT_VALID_RAX   = 1 << 0,\n    CONTEXT_VALID_RDX   = 1 << 1,\n    CONTEXT_VALID_RCX   = 1 << 2,\n    CONTEXT_VALID_RBX   = 1 << 3,\n    CONTEXT_VALID_RSI   = 1 << 4,\n    CONTEXT_VALID_RDI   = 1 << 5,\n    CONTEXT_VALID_RBP   = 1 << 6,\n    CONTEXT_VALID_RSP   = 1 << 7,\n    CONTEXT_VALID_R8    = 1 << 8,\n    CONTEXT_VALID_R9    = 1 << 9,\n    CONTEXT_VALID_R10   = 1 << 10,\n    CONTEXT_VALID_R11   = 1 << 11,\n    CONTEXT_VALID_R12   = 1 << 12,\n    CONTEXT_VALID_R13   = 1 << 13,\n    CONTEXT_VALID_R14   = 1 << 14,\n    CONTEXT_VALID_R15   = 1 << 15,\n    CONTEXT_VALID_RIP   = 1 << 16,\n    CONTEXT_VALID_ALL  = -1\n  };\n\n  StackFrameAMD64() : context(), context_validity(CONTEXT_VALID_NONE) {}\n\n  // Register state. This is only fully valid for the topmost frame in a\n  // stack. In other frames, which registers are present depends on what\n  // debugging information we had available. Refer to context_validity.\n  MDRawContextAMD64 context;\n\n  // For each register in context whose value has been recovered, we set\n  // the corresponding CONTEXT_VALID_ bit in context_validity.\n  //\n  // context_validity's type should actually be ContextValidity, but\n  // we use int instead because the bitwise inclusive or operator\n  // yields an int when applied to enum values, and C++ doesn't\n  // silently convert from ints to enums.\n  int context_validity;\n};\n\nstruct StackFrameSPARC : public StackFrame {\n  // to be confirmed\n  enum ContextValidity {\n    CONTEXT_VALID_NONE = 0,\n    CONTEXT_VALID_PC   = 1 << 0,\n    CONTEXT_VALID_SP   = 1 << 1,\n    CONTEXT_VALID_FP   = 1 << 2,\n    CONTEXT_VALID_ALL  = -1\n  };\n\n  StackFrameSPARC() : context(), context_validity(CONTEXT_VALID_NONE) {}\n\n  // Register state.  This is only fully valid for the topmost frame in a\n  // stack.  In other frames, the values of nonvolatile registers may be\n  // present, given sufficient debugging information.  Refer to\n  // context_validity.\n  MDRawContextSPARC context;\n\n  // context_validity is actually ContextValidity, but int is used because\n  // the OR operator doesn't work well with enumerated types.  This indicates\n  // which fields in context are valid.\n  int context_validity;\n};\n\nstruct StackFrameARM : public StackFrame {\n  // A flag for each register we might know.\n  enum ContextValidity {\n    CONTEXT_VALID_NONE = 0,\n    CONTEXT_VALID_R0   = 1 << 0,\n    CONTEXT_VALID_R1   = 1 << 1,\n    CONTEXT_VALID_R2   = 1 << 2,\n    CONTEXT_VALID_R3   = 1 << 3,\n    CONTEXT_VALID_R4   = 1 << 4,\n    CONTEXT_VALID_R5   = 1 << 5,\n    CONTEXT_VALID_R6   = 1 << 6,\n    CONTEXT_VALID_R7   = 1 << 7,\n    CONTEXT_VALID_R8   = 1 << 8,\n    CONTEXT_VALID_R9   = 1 << 9,\n    CONTEXT_VALID_R10  = 1 << 10,\n    CONTEXT_VALID_R11  = 1 << 11,\n    CONTEXT_VALID_R12  = 1 << 12,\n    CONTEXT_VALID_R13  = 1 << 13,\n    CONTEXT_VALID_R14  = 1 << 14,\n    CONTEXT_VALID_R15  = 1 << 15,\n    CONTEXT_VALID_ALL  = ~CONTEXT_VALID_NONE,\n\n    // Aliases for registers with dedicated or conventional roles.\n    CONTEXT_VALID_FP   = CONTEXT_VALID_R11,\n    CONTEXT_VALID_SP   = CONTEXT_VALID_R13,\n    CONTEXT_VALID_LR   = CONTEXT_VALID_R14,\n    CONTEXT_VALID_PC   = CONTEXT_VALID_R15\n  };\n\n  StackFrameARM() : context(), context_validity(CONTEXT_VALID_NONE) {}\n\n  // Return the ContextValidity flag for register rN.\n  static ContextValidity RegisterValidFlag(int n) {\n    return ContextValidity(1 << n);\n  } \n\n  // Register state.  This is only fully valid for the topmost frame in a\n  // stack.  In other frames, the values of nonvolatile registers may be\n  // present, given sufficient debugging information.  Refer to\n  // context_validity.\n  MDRawContextARM context;\n\n  // For each register in context whose value has been recovered, we set\n  // the corresponding CONTEXT_VALID_ bit in context_validity.\n  //\n  // context_validity's type should actually be ContextValidity, but\n  // we use int instead because the bitwise inclusive or operator\n  // yields an int when applied to enum values, and C++ doesn't\n  // silently convert from ints to enums.\n  int context_validity;\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/stackwalker.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stackwalker.h: Generic stackwalker.\n//\n// The Stackwalker class is an abstract base class providing common generic\n// methods that apply to stacks from all systems.  Specific implementations\n// will extend this class by providing GetContextFrame and GetCallerFrame\n// methods to fill in system-specific data in a StackFrame structure.\n// Stackwalker assembles these StackFrame strucutres into a CallStack.\n//\n// Author: Mark Mentovai\n\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__\n\n#include <set>\n#include <string>\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/processor/code_modules.h\"\n#include \"google_breakpad/processor/memory_region.h\"\n\nnamespace google_breakpad {\n\nclass CallStack;\nclass MinidumpContext;\nclass SourceLineResolverInterface;\nstruct StackFrame;\nclass SymbolSupplier;\nstruct SystemInfo;\n\nusing std::set;\n\n\nclass Stackwalker {\n public:\n  virtual ~Stackwalker() {}\n\n  // Populates the given CallStack by calling GetContextFrame and\n  // GetCallerFrame.  The frames are further processed to fill all available\n  // data.  Returns true if the stackwalk completed, or false if it was\n  // interrupted by SymbolSupplier::GetSymbolFile().\n  bool Walk(CallStack *stack);\n\n  // Returns a new concrete subclass suitable for the CPU that a stack was\n  // generated on, according to the CPU type indicated by the context\n  // argument.  If no suitable concrete subclass exists, returns NULL.\n  static Stackwalker* StackwalkerForCPU(const SystemInfo *system_info,\n                                        MinidumpContext *context,\n                                        MemoryRegion *memory,\n                                        const CodeModules *modules,\n                                        SymbolSupplier *supplier,\n                                        SourceLineResolverInterface *resolver);\n\n  static void set_max_frames(u_int32_t max_frames) { max_frames_ = max_frames; }\n  static u_int32_t max_frames() { return max_frames_; }\n\n protected:\n  // system_info identifies the operating system, NULL or empty if unknown.\n  // memory identifies a MemoryRegion that provides the stack memory\n  // for the stack to walk.  modules, if non-NULL, is a CodeModules\n  // object that is used to look up which code module each stack frame is\n  // associated with.  supplier is an optional caller-supplied SymbolSupplier\n  // implementation.  If supplier is NULL, source line info will not be\n  // resolved.  resolver is an instance of SourceLineResolverInterface\n  // (see source_line_resolver_interface.h and basic_source_line_resolver.h).\n  // If resolver is NULL, source line info will not be resolved.\n  Stackwalker(const SystemInfo *system_info,\n              MemoryRegion *memory,\n              const CodeModules *modules,\n              SymbolSupplier *supplier,\n              SourceLineResolverInterface *resolver);\n\n  // This can be used to filter out potential return addresses when\n  // the stack walker resorts to stack scanning.\n  // Returns true if any of:\n  // * This address is within a loaded module, but we don't have symbols\n  //   for that module.\n  // * This address is within a loaded module for which we have symbols,\n  //   and falls inside a function in that module.\n  // Returns false otherwise.\n  bool InstructionAddressSeemsValid(u_int64_t address);\n\n  template<typename InstructionType>\n  bool ScanForReturnAddress(InstructionType location_start,\n                            InstructionType *location_found,\n                            InstructionType *ip_found) {\n    const int kRASearchWords = 30;\n    return ScanForReturnAddress(location_start, location_found, ip_found,\n                                kRASearchWords);\n  }\n\n  // Scan the stack starting at location_start, looking for an address\n  // that looks like a valid instruction pointer. Addresses must\n  // 1) be contained in the current stack memory\n  // 2) pass the checks in InstructionAddressSeemsValid\n  //\n  // Returns true if a valid-looking instruction pointer was found.\n  // When returning true, sets location_found to the address at which\n  // the value was found, and ip_found to the value contained at that\n  // location in memory.\n  template<typename InstructionType>\n  bool ScanForReturnAddress(InstructionType location_start,\n                            InstructionType *location_found,\n                            InstructionType *ip_found,\n                            int searchwords) {\n    for (InstructionType location = location_start;\n         location <= location_start + searchwords * sizeof(InstructionType);\n         location += sizeof(InstructionType)) {\n      InstructionType ip;\n      if (!memory_->GetMemoryAtAddress(location, &ip))\n        break;\n\n      if (modules_ && modules_->GetModuleForAddress(ip) &&\n          InstructionAddressSeemsValid(ip)) {\n\n        *ip_found = ip;\n        *location_found = location;\n        return true;\n      }\n    }\n    // nothing found\n    return false;\n  }\n\n  // Information about the system that produced the minidump.  Subclasses\n  // and the SymbolSupplier may find this information useful.\n  const SystemInfo *system_info_;\n\n  // The stack memory to walk.  Subclasses will require this region to\n  // get information from the stack.\n  MemoryRegion *memory_;\n\n  // A list of modules, for populating each StackFrame's module information.\n  // This field is optional and may be NULL.\n  const CodeModules *modules_;\n\n protected:\n  // The SourceLineResolver implementation.\n  SourceLineResolverInterface *resolver_;\n\n private:\n  // Obtains the context frame, the innermost called procedure in a stack\n  // trace.  Returns NULL on failure.  GetContextFrame allocates a new\n  // StackFrame (or StackFrame subclass), ownership of which is taken by\n  // the caller.\n  virtual StackFrame* GetContextFrame() = 0;\n\n  // Obtains a caller frame.  Each call to GetCallerFrame should return the\n  // frame that called the last frame returned by GetContextFrame or\n  // GetCallerFrame.  To aid this purpose, stack contains the CallStack\n  // made of frames that have already been walked.  GetCallerFrame should\n  // return NULL on failure or when there are no more caller frames (when\n  // the end of the stack has been reached).  GetCallerFrame allocates a new\n  // StackFrame (or StackFrame subclass), ownership of which is taken by\n  // the caller.\n  virtual StackFrame* GetCallerFrame(const CallStack *stack) = 0;\n\n  // The optional SymbolSupplier for resolving source line info.\n  SymbolSupplier *supplier_;\n\n  // A list of modules that we haven't found symbols for.  We track\n  // this in order to avoid repeatedly looking them up again within\n  // one minidump.\n  set<std::string> no_symbol_modules_;\n\n  // The maximum number of frames Stackwalker will walk through.\n  // This defaults to 1024 to prevent infinite loops.\n  static u_int32_t max_frames_;\n};\n\n\n}  // namespace google_breakpad\n\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/symbol_supplier.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// The caller may implement the SymbolSupplier abstract base class\n// to provide symbols for a given module.\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_SYMBOL_SUPPLIER_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_SYMBOL_SUPPLIER_H__\n\n#include <string>\n\nnamespace google_breakpad {\n\nusing std::string;\nclass CodeModule;\nstruct SystemInfo;\n\nclass SymbolSupplier {\n public:\n  // Result type for GetSymbolFile\n  enum SymbolResult {\n    // no symbols were found, but continue processing\n    NOT_FOUND,\n\n    // symbols were found, and the path has been placed in symbol_file\n    FOUND,\n\n    // stops processing the minidump immediately\n    INTERRUPT\n  };\n\n  virtual ~SymbolSupplier() {}\n\n  // Retrieves the symbol file for the given CodeModule, placing the\n  // path in symbol_file if successful.  system_info contains strings\n  // identifying the operating system and CPU; SymbolSupplier may use\n  // to help locate the symbol file.  system_info may be NULL or its\n  // fields may be empty if these values are unknown.  symbol_file\n  // must be a pointer to a valid string\n  virtual SymbolResult GetSymbolFile(const CodeModule *module,\n                                     const SystemInfo *system_info,\n                                     string *symbol_file) = 0;\n  // Same as above, except also places symbol data into symbol_data.\n  // If symbol_data is NULL, the data is not returned.\n  // TODO(nealsid) Once we have symbol data caching behavior implemented\n  // investigate making all symbol suppliers implement all methods,\n  // and make this pure virtual\n  virtual SymbolResult GetSymbolFile(const CodeModule *module,\n                                     const SystemInfo *system_info,\n                                     string *symbol_file,\n                                     string *symbol_data) = 0;\n\n  // Same as above, except allocates data buffer on heap and then places the\n  // symbol data into the buffer as C-string.\n  // SymbolSupplier is responsible for deleting the data buffer. After the call\n  // to GetCStringSymbolData(), the caller should call FreeSymbolData(const\n  // Module *module) once the data buffer is no longer needed.\n  // If symbol_data is not NULL, symbol supplier won't return FOUND unless it\n  // returns a valid buffer in symbol_data, e.g., returns INTERRUPT on memory\n  // allocation failure.\n  virtual SymbolResult GetCStringSymbolData(const CodeModule *module,\n                                            const SystemInfo *system_info,\n                                            string *symbol_file,\n                                            char **symbol_data) = 0;\n\n  // Frees the data buffer allocated for the module in GetCStringSymbolData.\n  virtual void FreeSymbolData(const CodeModule *module) = 0;\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_SYMBOL_SUPPLIER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/google_breakpad/processor/system_info.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// system_info.h: Information about the system that was running a program\n// when a crash report was produced.\n//\n// Author: Mark Mentovai\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_SYSTEM_INFO_H__\n#define GOOGLE_BREAKPAD_PROCESSOR_SYSTEM_INFO_H__\n\n#include <string>\n\nnamespace google_breakpad {\n\nusing std::string;\n\nstruct SystemInfo {\n public:\n  SystemInfo() : os(), os_short(), os_version(), cpu(), cpu_info(),\n    cpu_count(0) {}\n\n  // Resets the SystemInfo object to its default values.\n  void Clear() {\n    os.clear();\n    os_short.clear();\n    os_version.clear();\n    cpu.clear();\n    cpu_info.clear();\n    cpu_count = 0;\n  }\n\n  // A string identifying the operating system, such as \"Windows NT\",\n  // \"Mac OS X\", or \"Linux\".  If the information is present in the dump but\n  // its value is unknown, this field will contain a numeric value.  If\n  // the information is not present in the dump, this field will be empty.\n  string os;\n\n  // A short form of the os string, using lowercase letters and no spaces,\n  // suitable for use in a filesystem.  Possible values are \"windows\",\n  // \"mac\", and \"linux\".  Empty if the information is not present in the dump\n  // or if the OS given by the dump is unknown.  The values stored in this\n  // field should match those used by MinidumpSystemInfo::GetOS.\n  string os_short;\n\n  // A string identifying the version of the operating system, such as\n  // \"5.1.2600 Service Pack 2\" or \"10.4.8 8L2127\".  If the dump does not\n  // contain this information, this field will be empty.\n  string os_version;\n\n  // A string identifying the basic CPU family, such as \"x86\" or \"ppc\".\n  // If this information is present in the dump but its value is unknown,\n  // this field will contain a numeric value.  If the information is not\n  // present in the dump, this field will be empty.  The values stored in\n  // this field should match those used by MinidumpSystemInfo::GetCPU.\n  string cpu;\n\n  // A string further identifying the specific CPU, such as\n  // \"GenuineIntel level 6 model 13 stepping 8\".  If the information is not\n  // present in the dump, or additional identifying information is not\n  // defined for the CPU family, this field will be empty.\n  string cpu_info;\n\n  // The number of processors in the system.  Will be greater than one for\n  // multi-core systems.\n  int cpu_count;\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_SYSTEM_INFO_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/address_map-inl.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// address_map-inl.h: Address map implementation.\n//\n// See address_map.h for documentation.\n//\n// Author: Mark Mentovai\n\n#ifndef PROCESSOR_ADDRESS_MAP_INL_H__\n#define PROCESSOR_ADDRESS_MAP_INL_H__\n\n#include \"processor/address_map.h\"\n\n#include <assert.h>\n\n#include \"processor/logging.h\"\n\nnamespace google_breakpad {\n\ntemplate<typename AddressType, typename EntryType>\nbool AddressMap<AddressType, EntryType>::Store(const AddressType &address,\n                                               const EntryType &entry) {\n  // Ensure that the specified address doesn't conflict with something already\n  // in the map.\n  if (map_.find(address) != map_.end()) {\n    BPLOG(INFO) << \"Store failed, address \" << HexString(address) <<\n                   \" is already present\";\n    return false;\n  }\n\n  map_.insert(MapValue(address, entry));\n  return true;\n}\n\ntemplate<typename AddressType, typename EntryType>\nbool AddressMap<AddressType, EntryType>::Retrieve(\n    const AddressType &address,\n    EntryType *entry, AddressType *entry_address) const {\n  BPLOG_IF(ERROR, !entry) << \"AddressMap::Retrieve requires |entry|\";\n  assert(entry);\n\n  // upper_bound gives the first element whose key is greater than address,\n  // but we want the first element whose key is less than or equal to address.\n  // Decrement the iterator to get there, but not if the upper_bound already\n  // points to the beginning of the map - in that case, address is lower than\n  // the lowest stored key, so return false.\n  MapConstIterator iterator = map_.upper_bound(address);\n  if (iterator == map_.begin())\n    return false;\n  --iterator;\n\n  *entry = iterator->second;\n  if (entry_address)\n    *entry_address = iterator->first;\n\n  return true;\n}\n\ntemplate<typename AddressType, typename EntryType>\nvoid AddressMap<AddressType, EntryType>::Clear() {\n  map_.clear();\n}\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_ADDRESS_MAP_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/address_map.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// address_map.h: Address maps.\n//\n// An address map contains a set of objects keyed by address.  Objects are\n// retrieved from the map by returning the object with the highest key less\n// than or equal to the lookup key.\n//\n// Author: Mark Mentovai\n\n#ifndef PROCESSOR_ADDRESS_MAP_H__\n#define PROCESSOR_ADDRESS_MAP_H__\n\n#include <map>\n\nnamespace google_breakpad {\n\n// Forward declarations (for later friend declarations).\ntemplate<class, class> class AddressMapSerializer;\n\ntemplate<typename AddressType, typename EntryType>\nclass AddressMap {\n public:\n  AddressMap() : map_() {}\n\n  // Inserts an entry into the map.  Returns false without storing the entry\n  // if an entry is already stored in the map at the same address as specified\n  // by the address argument.\n  bool Store(const AddressType &address, const EntryType &entry);\n\n  // Locates the entry stored at the highest address less than or equal to\n  // the address argument.  If there is no such range, returns false.  The\n  // entry is returned in entry, which is a required argument.  If\n  // entry_address is not NULL, it will be set to the address that the entry\n  // was stored at.\n  bool Retrieve(const AddressType &address,\n                EntryType *entry, AddressType *entry_address) const;\n\n  // Empties the address map, restoring it to the same state as when it was\n  // initially created.\n  void Clear();\n\n private:\n  friend class AddressMapSerializer<AddressType, EntryType>;\n  friend class ModuleComparer;\n\n  // Convenience types.\n  typedef std::map<AddressType, EntryType> AddressToEntryMap;\n  typedef typename AddressToEntryMap::const_iterator MapConstIterator;\n  typedef typename AddressToEntryMap::value_type MapValue;\n\n  // Maps the address of each entry to an EntryType.\n  AddressToEntryMap map_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_ADDRESS_MAP_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/address_map_unittest.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// address_map_unittest.cc: Unit tests for AddressMap.\n//\n// Author: Mark Mentovai\n\n#include <limits.h>\n#include <stdio.h>\n\n#include \"processor/address_map-inl.h\"\n#include \"processor/linked_ptr.h\"\n#include \"processor/logging.h\"\n\n#define ASSERT_TRUE(condition) \\\n  if (!(condition)) { \\\n    fprintf(stderr, \"FAIL: %s @ %s:%d\\n\", #condition, __FILE__, __LINE__); \\\n    return false; \\\n  }\n\n#define ASSERT_FALSE(condition) ASSERT_TRUE(!(condition))\n\n#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2))\n\nnamespace {\n\nusing google_breakpad::AddressMap;\nusing google_breakpad::linked_ptr;\n\n// A CountedObject holds an int.  A global (not thread safe!) count of\n// allocated CountedObjects is maintained to help test memory management.\nclass CountedObject {\n public:\n  explicit CountedObject(int id) : id_(id) { ++count_; }\n  ~CountedObject() { --count_; }\n\n  static int count() { return count_; }\n  int id() const { return id_; }\n\n private:\n  static int count_;\n  int id_;\n};\n\nint CountedObject::count_;\n\ntypedef int AddressType;\ntypedef AddressMap< AddressType, linked_ptr<CountedObject> > TestMap;\n\nstatic bool DoAddressMapTest() {\n  ASSERT_EQ(CountedObject::count(), 0);\n\n  TestMap test_map;\n  linked_ptr<CountedObject> entry;\n  AddressType address;\n\n  // Check that a new map is truly empty.\n  ASSERT_FALSE(test_map.Retrieve(0, &entry, &address));\n  ASSERT_FALSE(test_map.Retrieve(INT_MIN, &entry, &address));\n  ASSERT_FALSE(test_map.Retrieve(INT_MAX, &entry, &address));\n\n  // Check that Clear clears the map without leaking.\n  ASSERT_EQ(CountedObject::count(), 0);\n  ASSERT_TRUE(test_map.Store(1,\n      linked_ptr<CountedObject>(new CountedObject(0))));\n  ASSERT_TRUE(test_map.Retrieve(1, &entry, &address));\n  ASSERT_EQ(CountedObject::count(), 1);\n  test_map.Clear();\n  ASSERT_EQ(CountedObject::count(), 1);  // still holding entry in this scope\n\n  // Check that a cleared map is truly empty.\n  ASSERT_FALSE(test_map.Retrieve(0, &entry, &address));\n  ASSERT_FALSE(test_map.Retrieve(INT_MIN, &entry, &address));\n  ASSERT_FALSE(test_map.Retrieve(INT_MAX, &entry, &address));\n\n  // Check a single-element map.\n  ASSERT_TRUE(test_map.Store(10,\n      linked_ptr<CountedObject>(new CountedObject(1))));\n  ASSERT_FALSE(test_map.Retrieve(9, &entry, &address));\n  ASSERT_TRUE(test_map.Retrieve(10, &entry, &address));\n  ASSERT_EQ(CountedObject::count(), 1);\n  ASSERT_EQ(entry->id(), 1);\n  ASSERT_EQ(address, 10);\n  ASSERT_TRUE(test_map.Retrieve(11, &entry, &address));\n  ASSERT_TRUE(test_map.Retrieve(11, &entry, NULL));     // NULL ok here\n\n  // Add some more elements.\n  ASSERT_TRUE(test_map.Store(5,\n      linked_ptr<CountedObject>(new CountedObject(2))));\n  ASSERT_EQ(CountedObject::count(), 2);\n  ASSERT_TRUE(test_map.Store(20,\n      linked_ptr<CountedObject>(new CountedObject(3))));\n  ASSERT_TRUE(test_map.Store(15,\n      linked_ptr<CountedObject>(new CountedObject(4))));\n  ASSERT_FALSE(test_map.Store(10,\n      linked_ptr<CountedObject>(new CountedObject(5))));  // already in map\n  ASSERT_TRUE(test_map.Store(16,\n      linked_ptr<CountedObject>(new CountedObject(6))));\n  ASSERT_TRUE(test_map.Store(14,\n      linked_ptr<CountedObject>(new CountedObject(7))));\n\n  // Nothing was stored with a key under 5.  Don't use ASSERT inside loops\n  // because it won't show exactly which key/entry/address failed.\n  for (AddressType key = 0; key < 5; ++key) {\n    if (test_map.Retrieve(key, &entry, &address)) {\n      fprintf(stderr,\n              \"FAIL: retrieve %d expected false observed true @ %s:%d\\n\",\n              key, __FILE__, __LINE__);\n      return false;\n    }\n  }\n\n  // Check everything that was stored.\n  const int id_verify[] = { 0, 0, 0, 0, 0,    // unused\n                            2, 2, 2, 2, 2,    // 5 - 9\n                            1, 1, 1, 1, 7,    // 10 - 14\n                            4, 6, 6, 6, 6,    // 15 - 19\n                            3, 3, 3, 3, 3,    // 20 - 24\n                            3, 3, 3, 3, 3 };  // 25 - 29\n  const AddressType address_verify[] = {  0,  0,  0,  0,  0,    // unused\n                                          5,  5,  5,  5,  5,    // 5 - 9\n                                         10, 10, 10, 10, 14,    // 10 - 14\n                                         15, 16, 16, 16, 16,    // 15 - 19\n                                         20, 20, 20, 20, 20,    // 20 - 24\n                                         20, 20, 20, 20, 20 };  // 25 - 29\n\n  for (AddressType key = 5; key < 30; ++key) {\n    if (!test_map.Retrieve(key, &entry, &address)) {\n      fprintf(stderr,\n              \"FAIL: retrieve %d expected true observed false @ %s:%d\\n\",\n              key, __FILE__, __LINE__);\n      return false;\n    }\n    if (entry->id() != id_verify[key]) {\n      fprintf(stderr,\n              \"FAIL: retrieve %d expected entry %d observed %d @ %s:%d\\n\",\n              key, id_verify[key], entry->id(), __FILE__, __LINE__);\n      return false;\n    }\n    if (address != address_verify[key]) {\n      fprintf(stderr,\n              \"FAIL: retrieve %d expected address %d observed %d @ %s:%d\\n\",\n              key, address_verify[key], address, __FILE__, __LINE__);\n      return false;\n    }\n  }\n\n  // The stored objects should still be in the map.\n  ASSERT_EQ(CountedObject::count(), 6);\n\n  return true;\n}\n\nstatic bool RunTests() {\n  if (!DoAddressMapTest())\n    return false;\n\n  // Leak check.\n  ASSERT_EQ(CountedObject::count(), 0);\n\n  return true;\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  BPLOG_INIT(&argc, &argv);\n\n  return RunTests() ? 0 : 1;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/basic_code_module.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// basic_code_module.h: Carries information about code modules that are loaded\n// into a process.\n//\n// This is a basic concrete implementation of CodeModule.  It cannot be\n// instantiated directly, only based on other objects that implement\n// the CodeModule interface.  It exists to provide a CodeModule implementation\n// a place to store information when the life of the original object (such as\n// a MinidumpModule) cannot be guaranteed.\n//\n// Author: Mark Mentovai\n\n#ifndef PROCESSOR_BASIC_CODE_MODULE_H__\n#define PROCESSOR_BASIC_CODE_MODULE_H__\n\n#include <string>\n\n#include \"google_breakpad/processor/code_module.h\"\n\nnamespace google_breakpad {\n\nusing std::string;\n\nclass BasicCodeModule : public CodeModule {\n public:\n  // Creates a new BasicCodeModule given any existing CodeModule\n  // implementation.  This is useful to make a copy of the data relevant to\n  // the CodeModule interface without requiring all of the resources that\n  // other CodeModule implementations may require.\n  explicit BasicCodeModule(const CodeModule *that)\n      : base_address_(that->base_address()),\n        size_(that->size()),\n        code_file_(that->code_file()),\n        code_identifier_(that->code_identifier()),\n        debug_file_(that->debug_file()),\n        debug_identifier_(that->debug_identifier()),\n        version_(that->version()) {}\n\n  BasicCodeModule(u_int64_t base_address, u_int64_t size,\n\t\t  const string &code_file,\n\t\t  const string &code_identifier,\n\t\t  const string &debug_file,\n\t\t  const string &debug_identifier,\n\t\t  const string &version)\n    : base_address_(base_address),\n      size_(size),\n      code_file_(code_file),\n      code_identifier_(code_identifier),\n      debug_file_(debug_file),\n      debug_identifier_(debug_identifier),\n      version_(version)\n    {}\n  virtual ~BasicCodeModule() {}\n\n  // See code_module.h for descriptions of these methods and the associated\n  // members.\n  virtual u_int64_t base_address() const { return base_address_; }\n  virtual u_int64_t size() const { return size_; }\n  virtual string code_file() const { return code_file_; }\n  virtual string code_identifier() const { return code_identifier_; }\n  virtual string debug_file() const { return debug_file_; }\n  virtual string debug_identifier() const { return debug_identifier_; }\n  virtual string version() const { return version_; }\n  virtual const CodeModule* Copy() const { return new BasicCodeModule(this); }\n\n private:\n  u_int64_t base_address_;\n  u_int64_t size_;\n  string code_file_;\n  string code_identifier_;\n  string debug_file_;\n  string debug_identifier_;\n  string version_;\n\n  // Disallow copy constructor and assignment operator.\n  BasicCodeModule(const BasicCodeModule &that);\n  void operator=(const BasicCodeModule &that);\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_BASIC_CODE_MODULE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/basic_code_modules.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// basic_code_modules.cc: Contains all of the CodeModule objects that\n// were loaded into a single process.\n//\n// See basic_code_modules.h for documentation.\n//\n// Author: Mark Mentovai\n\n#include \"processor/basic_code_modules.h\"\n\n#include <assert.h>\n\n#include \"google_breakpad/processor/code_module.h\"\n#include \"processor/linked_ptr.h\"\n#include \"processor/logging.h\"\n#include \"processor/range_map-inl.h\"\n\nnamespace google_breakpad {\n\nBasicCodeModules::BasicCodeModules(const CodeModules *that)\n    : main_address_(0),\n      map_(new RangeMap<u_int64_t, linked_ptr<const CodeModule> >()) {\n  BPLOG_IF(ERROR, !that) << \"BasicCodeModules::BasicCodeModules requires \"\n                            \"|that|\";\n  assert(that);\n\n  const CodeModule *main_module = that->GetMainModule();\n  if (main_module)\n    main_address_ = main_module->base_address();\n\n  unsigned int count = that->module_count();\n  for (unsigned int module_sequence = 0;\n       module_sequence < count;\n       ++module_sequence) {\n    // Make a copy of the module and insert it into the map.  Use\n    // GetModuleAtIndex because ordering is unimportant when slurping the\n    // entire list, and GetModuleAtIndex may be faster than\n    // GetModuleAtSequence.\n    const CodeModule *module = that->GetModuleAtIndex(module_sequence)->Copy();\n    if (!map_->StoreRange(module->base_address(), module->size(),\n                          linked_ptr<const CodeModule>(module))) {\n      BPLOG(ERROR) << \"Module \" << module->code_file() <<\n                      \" could not be stored\";\n    }\n  }\n}\n\nBasicCodeModules::~BasicCodeModules() {\n  delete map_;\n}\n\nunsigned int BasicCodeModules::module_count() const {\n  return map_->GetCount();\n}\n\nconst CodeModule* BasicCodeModules::GetModuleForAddress(\n    u_int64_t address) const {\n  linked_ptr<const CodeModule> module;\n  if (!map_->RetrieveRange(address, &module, NULL, NULL)) {\n    BPLOG(INFO) << \"No module at \" << HexString(address);\n    return NULL;\n  }\n\n  return module.get();\n}\n\nconst CodeModule* BasicCodeModules::GetMainModule() const {\n  return GetModuleForAddress(main_address_);\n}\n\nconst CodeModule* BasicCodeModules::GetModuleAtSequence(\n    unsigned int sequence) const {\n  linked_ptr<const CodeModule> module;\n  if (!map_->RetrieveRangeAtIndex(sequence, &module, NULL, NULL)) {\n    BPLOG(ERROR) << \"RetrieveRangeAtIndex failed for sequence \" << sequence;\n    return NULL;\n  }\n\n  return module.get();\n}\n\nconst CodeModule* BasicCodeModules::GetModuleAtIndex(\n    unsigned int index) const {\n  // This class stores everything in a RangeMap, without any more-efficient\n  // way to walk the list of CodeModule objects.  Implement GetModuleAtIndex\n  // using GetModuleAtSequence, which meets all of the requirements, and\n  // in addition, guarantees ordering.\n  return GetModuleAtSequence(index);\n}\n\nconst CodeModules* BasicCodeModules::Copy() const {\n  return new BasicCodeModules(this);\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/basic_code_modules.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// basic_code_modules.h: Contains all of the CodeModule objects that\n// were loaded into a single process.\n//\n// This is a basic concrete implementation of CodeModules.  It cannot be\n// instantiated directly, only based on other objects that implement\n// the CodeModules interface.  It exists to provide a CodeModules\n// implementation a place to store information when the life of the original\n// object (such as a MinidumpModuleList) cannot be guaranteed.\n//\n// Author: Mark Mentovai\n\n#ifndef PROCESSOR_BASIC_CODE_MODULES_H__\n#define PROCESSOR_BASIC_CODE_MODULES_H__\n\n#include \"google_breakpad/processor/code_modules.h\"\n\nnamespace google_breakpad {\n\ntemplate<typename T> class linked_ptr;\ntemplate<typename AddressType, typename EntryType> class RangeMap;\n\nclass BasicCodeModules : public CodeModules {\n public:\n  // Creates a new BasicCodeModules object given any existing CodeModules\n  // implementation.  This is useful to make a copy of the data relevant to\n  // the CodeModules and CodeModule interfaces without requiring all of the\n  // resources that other implementations may require.  A copy will be\n  // made of each contained CodeModule using CodeModule::Copy.\n  explicit BasicCodeModules(const CodeModules *that);\n\n  virtual ~BasicCodeModules();\n\n  // See code_modules.h for descriptions of these methods.\n  virtual unsigned int module_count() const;\n  virtual const CodeModule* GetModuleForAddress(u_int64_t address) const;\n  virtual const CodeModule* GetMainModule() const;\n  virtual const CodeModule* GetModuleAtSequence(unsigned int sequence) const;\n  virtual const CodeModule* GetModuleAtIndex(unsigned int index) const;\n  virtual const CodeModules* Copy() const;\n\n private:\n  // The base address of the main module.\n  u_int64_t main_address_;\n\n  // The map used to contain each CodeModule, keyed by each CodeModule's\n  // address range.\n  RangeMap<u_int64_t, linked_ptr<const CodeModule> > *map_;\n\n  // Disallow copy constructor and assignment operator.\n  BasicCodeModules(const BasicCodeModules &that);\n  void operator=(const BasicCodeModules &that);\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_BASIC_CODE_MODULES_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/basic_source_line_resolver.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// basic_source_line_resolver.cc: BasicSourceLineResolver implementation.\n//\n// See basic_source_line_resolver.h and basic_source_line_resolver_types.h\n// for documentation.\n\n\n#include <stdio.h>\n#include <string.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <unistd.h>\n\n#include <map>\n#include <utility>\n#include <vector>\n\n#include \"google_breakpad/processor/basic_source_line_resolver.h\"\n#include \"processor/basic_source_line_resolver_types.h\"\n#include \"processor/module_factory.h\"\n\n#include \"processor/tokenize.h\"\n\nusing std::map;\nusing std::vector;\nusing std::make_pair;\n\nnamespace google_breakpad {\n\nstatic const char *kWhitespace = \" \\r\\n\";\n\nBasicSourceLineResolver::BasicSourceLineResolver() :\n    SourceLineResolverBase(new BasicModuleFactory) { }\n\nbool BasicSourceLineResolver::Module::LoadMapFromMemory(char *memory_buffer) {\n  linked_ptr<Function> cur_func;\n  int line_number = 0;\n  char *save_ptr;\n  size_t map_buffer_length = strlen(memory_buffer);\n\n  // If the length is 0, we can still pretend we have a symbol file. This is\n  // for scenarios that want to test symbol lookup, but don't necessarily care\n  // if certain modules do not have any information, like system libraries.\n  if (map_buffer_length == 0) {\n    return true;\n  }\n\n  if (memory_buffer[map_buffer_length - 1] == '\\n') {\n    memory_buffer[map_buffer_length - 1] = '\\0';\n  }\n\n  char *buffer;\n  buffer = strtok_r(memory_buffer, \"\\r\\n\", &save_ptr);\n\n  while (buffer != NULL) {\n    ++line_number;\n\n    if (strncmp(buffer, \"FILE \", 5) == 0) {\n      if (!ParseFile(buffer)) {\n        BPLOG(ERROR) << \"ParseFile on buffer failed at \" <<\n            \":\" << line_number;\n        return false;\n      }\n    } else if (strncmp(buffer, \"STACK \", 6) == 0) {\n      if (!ParseStackInfo(buffer)) {\n        BPLOG(ERROR) << \"ParseStackInfo failed at \" <<\n            \":\" << line_number;\n        return false;\n      }\n    } else if (strncmp(buffer, \"FUNC \", 5) == 0) {\n      cur_func.reset(ParseFunction(buffer));\n      if (!cur_func.get()) {\n        BPLOG(ERROR) << \"ParseFunction failed at \" <<\n            \":\" << line_number;\n        return false;\n      }\n      // StoreRange will fail if the function has an invalid address or size.\n      // We'll silently ignore this, the function and any corresponding lines\n      // will be destroyed when cur_func is released.\n      functions_.StoreRange(cur_func->address, cur_func->size, cur_func);\n    } else if (strncmp(buffer, \"PUBLIC \", 7) == 0) {\n      // Clear cur_func: public symbols don't contain line number information.\n      cur_func.reset();\n\n      if (!ParsePublicSymbol(buffer)) {\n        BPLOG(ERROR) << \"ParsePublicSymbol failed at \" <<\n            \":\" << line_number;\n        return false;\n      }\n    } else if (strncmp(buffer, \"MODULE \", 7) == 0) {\n      // Ignore these.  They're not of any use to BasicSourceLineResolver,\n      // which is fed modules by a SymbolSupplier.  These lines are present to\n      // aid other tools in properly placing symbol files so that they can\n      // be accessed by a SymbolSupplier.\n      //\n      // MODULE <guid> <age> <filename>\n    } else if (strncmp(buffer, \"INFO \", 5) == 0) {\n      // Ignore these as well, they're similarly just for housekeeping.\n      //\n      // INFO CODE_ID <code id> <filename>\n    } else {\n      if (!cur_func.get()) {\n        BPLOG(ERROR) << \"Found source line data without a function at \" <<\n            \":\" << line_number;\n        return false;\n      }\n      Line *line = ParseLine(buffer);\n      if (!line) {\n        BPLOG(ERROR) << \"ParseLine failed at \" << line_number << \" for \" <<\n            buffer;\n        return false;\n      }\n      cur_func->lines.StoreRange(line->address, line->size,\n                                 linked_ptr<Line>(line));\n    }\n    buffer = strtok_r(NULL, \"\\r\\n\", &save_ptr);\n  }\n  return true;\n}\n\nvoid BasicSourceLineResolver::Module::LookupAddress(StackFrame *frame) const {\n  MemAddr address = frame->instruction - frame->module->base_address();\n\n  // First, look for a FUNC record that covers address. Use\n  // RetrieveNearestRange instead of RetrieveRange so that, if there\n  // is no such function, we can use the next function to bound the\n  // extent of the PUBLIC symbol we find, below. This does mean we\n  // need to check that address indeed falls within the function we\n  // find; do the range comparison in an overflow-friendly way.\n  linked_ptr<Function> func;\n  linked_ptr<PublicSymbol> public_symbol;\n  MemAddr function_base;\n  MemAddr function_size;\n  MemAddr public_address;\n  if (functions_.RetrieveNearestRange(address, &func,\n                                      &function_base, &function_size) &&\n      address >= function_base && address - function_base < function_size) {\n    frame->function_name = func->name;\n    frame->function_base = frame->module->base_address() + function_base;\n\n    linked_ptr<Line> line;\n    MemAddr line_base;\n    if (func->lines.RetrieveRange(address, &line, &line_base, NULL)) {\n      FileMap::const_iterator it = files_.find(line->source_file_id);\n      if (it != files_.end()) {\n        frame->source_file_name = files_.find(line->source_file_id)->second;\n      }\n      frame->source_line = line->line;\n      frame->source_line_base = frame->module->base_address() + line_base;\n    }\n  } else if (public_symbols_.Retrieve(address,\n                                      &public_symbol, &public_address) &&\n             (!func.get() || public_address > function_base)) {\n    frame->function_name = public_symbol->name;\n    frame->function_base = frame->module->base_address() + public_address;\n  }\n}\n\nWindowsFrameInfo *BasicSourceLineResolver::Module::FindWindowsFrameInfo(\n    const StackFrame *frame) const {\n  MemAddr address = frame->instruction - frame->module->base_address();\n  scoped_ptr<WindowsFrameInfo> result(new WindowsFrameInfo());\n\n  // We only know about WindowsFrameInfo::STACK_INFO_FRAME_DATA and\n  // WindowsFrameInfo::STACK_INFO_FPO. Prefer them in this order.\n  // WindowsFrameInfo::STACK_INFO_FRAME_DATA is the newer type that\n  // includes its own program string.\n  // WindowsFrameInfo::STACK_INFO_FPO is the older type\n  // corresponding to the FPO_DATA struct. See stackwalker_x86.cc.\n  linked_ptr<WindowsFrameInfo> frame_info;\n  if ((windows_frame_info_[WindowsFrameInfo::STACK_INFO_FRAME_DATA]\n       .RetrieveRange(address, &frame_info))\n      || (windows_frame_info_[WindowsFrameInfo::STACK_INFO_FPO]\n          .RetrieveRange(address, &frame_info))) {\n    result->CopyFrom(*frame_info.get());\n    return result.release();\n  }\n\n  // Even without a relevant STACK line, many functions contain\n  // information about how much space their parameters consume on the\n  // stack. Use RetrieveNearestRange instead of RetrieveRange, so that\n  // we can use the function to bound the extent of the PUBLIC symbol,\n  // below. However, this does mean we need to check that ADDRESS\n  // falls within the retrieved function's range; do the range\n  // comparison in an overflow-friendly way.\n  linked_ptr<Function> function;\n  MemAddr function_base, function_size;\n  if (functions_.RetrieveNearestRange(address, &function,\n                                      &function_base, &function_size) &&\n      address >= function_base && address - function_base < function_size) {\n    result->parameter_size = function->parameter_size;\n    result->valid |= WindowsFrameInfo::VALID_PARAMETER_SIZE;\n    return result.release();\n  }\n\n  // PUBLIC symbols might have a parameter size. Use the function we\n  // found above to limit the range the public symbol covers.\n  linked_ptr<PublicSymbol> public_symbol;\n  MemAddr public_address;\n  if (public_symbols_.Retrieve(address, &public_symbol, &public_address) &&\n      (!function.get() || public_address > function_base)) {\n    result->parameter_size = public_symbol->parameter_size;\n  }\n\n  return NULL;\n}\n\nCFIFrameInfo *BasicSourceLineResolver::Module::FindCFIFrameInfo(\n    const StackFrame *frame) const {\n  MemAddr address = frame->instruction - frame->module->base_address();\n  MemAddr initial_base, initial_size;\n  string initial_rules;\n\n  // Find the initial rule whose range covers this address. That\n  // provides an initial set of register recovery rules. Then, walk\n  // forward from the initial rule's starting address to frame's\n  // instruction address, applying delta rules.\n  if (!cfi_initial_rules_.RetrieveRange(address, &initial_rules,\n                                        &initial_base, &initial_size)) {\n    return NULL;\n  }\n\n  // Create a frame info structure, and populate it with the rules from\n  // the STACK CFI INIT record.\n  scoped_ptr<CFIFrameInfo> rules(new CFIFrameInfo());\n  if (!ParseCFIRuleSet(initial_rules, rules.get()))\n    return NULL;\n\n  // Find the first delta rule that falls within the initial rule's range.\n  map<MemAddr, string>::const_iterator delta =\n    cfi_delta_rules_.lower_bound(initial_base);\n\n  // Apply delta rules up to and including the frame's address.\n  while (delta != cfi_delta_rules_.end() && delta->first <= address) {\n    ParseCFIRuleSet(delta->second, rules.get());\n    delta++;\n  }\n\n  return rules.release();\n}\n\nbool BasicSourceLineResolver::Module::ParseFile(char *file_line) {\n  // FILE <id> <filename>\n  file_line += 5;  // skip prefix\n\n  vector<char*> tokens;\n  if (!Tokenize(file_line, kWhitespace, 2, &tokens)) {\n    return false;\n  }\n\n  int index = atoi(tokens[0]);\n  if (index < 0) {\n    return false;\n  }\n\n  char *filename = tokens[1];\n  if (!filename) {\n    return false;\n  }\n\n  files_.insert(make_pair(index, string(filename)));\n  return true;\n}\n\nBasicSourceLineResolver::Function*\nBasicSourceLineResolver::Module::ParseFunction(char *function_line) {\n  // FUNC <address> <size> <stack_param_size> <name>\n  function_line += 5;  // skip prefix\n\n  vector<char*> tokens;\n  if (!Tokenize(function_line, kWhitespace, 4, &tokens)) {\n    return NULL;\n  }\n\n  u_int64_t address    = strtoull(tokens[0], NULL, 16);\n  u_int64_t size       = strtoull(tokens[1], NULL, 16);\n  int stack_param_size = strtoull(tokens[2], NULL, 16);\n  char *name           = tokens[3];\n\n  return new Function(name, address, size, stack_param_size);\n}\n\nBasicSourceLineResolver::Line* BasicSourceLineResolver::Module::ParseLine(\n    char *line_line) {\n  // <address> <line number> <source file id>\n  vector<char*> tokens;\n  if (!Tokenize(line_line, kWhitespace, 4, &tokens)) {\n    return NULL;\n  }\n\n  u_int64_t address = strtoull(tokens[0], NULL, 16);\n  u_int64_t size    = strtoull(tokens[1], NULL, 16);\n  int line_number   = atoi(tokens[2]);\n  int source_file   = atoi(tokens[3]);\n  if (line_number <= 0) {\n    return NULL;\n  }\n\n  return new Line(address, size, source_file, line_number);\n}\n\nbool BasicSourceLineResolver::Module::ParsePublicSymbol(char *public_line) {\n  // PUBLIC <address> <stack_param_size> <name>\n\n  // Skip \"PUBLIC \" prefix.\n  public_line += 7;\n\n  vector<char*> tokens;\n  if (!Tokenize(public_line, kWhitespace, 3, &tokens)) {\n    return false;\n  }\n\n  u_int64_t address    = strtoull(tokens[0], NULL, 16);\n  int stack_param_size = strtoull(tokens[1], NULL, 16);\n  char *name           = tokens[2];\n\n  // A few public symbols show up with an address of 0.  This has been seen\n  // in the dumped output of ntdll.pdb for symbols such as _CIlog, _CIpow,\n  // RtlDescribeChunkLZNT1, and RtlReserveChunkLZNT1.  They would conflict\n  // with one another if they were allowed into the public_symbols_ map,\n  // but since the address is obviously invalid, gracefully accept them\n  // as input without putting them into the map.\n  if (address == 0) {\n    return true;\n  }\n\n  linked_ptr<PublicSymbol> symbol(new PublicSymbol(name, address,\n                                                   stack_param_size));\n  return public_symbols_.Store(address, symbol);\n}\n\nbool BasicSourceLineResolver::Module::ParseStackInfo(char *stack_info_line) {\n  // Skip \"STACK \" prefix.\n  stack_info_line += 6;\n\n  // Find the token indicating what sort of stack frame walking\n  // information this is.\n  while (*stack_info_line == ' ')\n    stack_info_line++;\n  const char *platform = stack_info_line;\n  while (!strchr(kWhitespace, *stack_info_line))\n    stack_info_line++;\n  *stack_info_line++ = '\\0';\n\n  // MSVC stack frame info.\n  if (strcmp(platform, \"WIN\") == 0) {\n    int type = 0;\n    u_int64_t rva, code_size;\n    linked_ptr<WindowsFrameInfo>\n      stack_frame_info(WindowsFrameInfo::ParseFromString(stack_info_line,\n                                                         type,\n                                                         rva,\n                                                         code_size));\n    if (stack_frame_info == NULL)\n      return false;\n\n    // TODO(mmentovai): I wanted to use StoreRange's return value as this\n    // method's return value, but MSVC infrequently outputs stack info that\n    // violates the containment rules.  This happens with a section of code\n    // in strncpy_s in test_app.cc (testdata/minidump2).  There, problem looks\n    // like this:\n    //   STACK WIN 4 4242 1a a 0 ...  (STACK WIN 4 base size prolog 0 ...)\n    //   STACK WIN 4 4243 2e 9 0 ...\n    // ContainedRangeMap treats these two blocks as conflicting.  In reality,\n    // when the prolog lengths are taken into account, the actual code of\n    // these blocks doesn't conflict.  However, we can't take the prolog lengths\n    // into account directly here because we'd wind up with a different set\n    // of range conflicts when MSVC outputs stack info like this:\n    //   STACK WIN 4 1040 73 33 0 ...\n    //   STACK WIN 4 105a 59 19 0 ...\n    // because in both of these entries, the beginning of the code after the\n    // prolog is at 0x1073, and the last byte of contained code is at 0x10b2.\n    // Perhaps we could get away with storing ranges by rva + prolog_size\n    // if ContainedRangeMap were modified to allow replacement of\n    // already-stored values.\n\n    windows_frame_info_[type].StoreRange(rva, code_size, stack_frame_info);\n    return true;\n  } else if (strcmp(platform, \"CFI\") == 0) {\n    // DWARF CFI stack frame info\n    return ParseCFIFrameInfo(stack_info_line);\n  } else {\n    // Something unrecognized.\n    return false;\n  }\n}\n\nbool BasicSourceLineResolver::Module::ParseCFIFrameInfo(\n    char *stack_info_line) {\n  char *cursor;\n\n  // Is this an INIT record or a delta record?\n  char *init_or_address = strtok_r(stack_info_line, \" \\r\\n\", &cursor);\n  if (!init_or_address)\n    return false;\n\n  if (strcmp(init_or_address, \"INIT\") == 0) {\n    // This record has the form \"STACK INIT <address> <size> <rules...>\".\n    char *address_field = strtok_r(NULL, \" \\r\\n\", &cursor);\n    if (!address_field) return false;\n\n    char *size_field = strtok_r(NULL, \" \\r\\n\", &cursor);\n    if (!size_field) return false;\n\n    char *initial_rules = strtok_r(NULL, \"\\r\\n\", &cursor);\n    if (!initial_rules) return false;\n\n    MemAddr address = strtoul(address_field, NULL, 16);\n    MemAddr size    = strtoul(size_field,    NULL, 16);\n    cfi_initial_rules_.StoreRange(address, size, initial_rules);\n    return true;\n  }\n\n  // This record has the form \"STACK <address> <rules...>\".\n  char *address_field = init_or_address;\n  char *delta_rules = strtok_r(NULL, \"\\r\\n\", &cursor);\n  if (!delta_rules) return false;\n  MemAddr address = strtoul(address_field, NULL, 16);\n  cfi_delta_rules_[address] = delta_rules;\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/basic_source_line_resolver_types.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// basic_source_line_types.h: definition of nested classes/structs in\n// BasicSourceLineResolver.  It moves the definitions out of\n// basic_source_line_resolver.cc, so that other classes could have access\n// to these private nested types without including basic_source_line_resolver.cc\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_TYPES_H__\n#define PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_TYPES_H__\n\n#include <map>\n#include <string>\n\n#include \"google_breakpad/processor/basic_source_line_resolver.h\"\n#include \"processor/source_line_resolver_base_types.h\"\n\n#include \"processor/address_map-inl.h\"\n#include \"processor/range_map-inl.h\"\n#include \"processor/contained_range_map-inl.h\"\n\n#include \"processor/linked_ptr.h\"\n#include \"processor/scoped_ptr.h\"\n#include \"google_breakpad/processor/stack_frame.h\"\n#include \"processor/cfi_frame_info.h\"\n#include \"processor/windows_frame_info.h\"\n\nnamespace google_breakpad {\n\nstruct\nBasicSourceLineResolver::Function : public SourceLineResolverBase::Function {\n  Function(const string &function_name,\n           MemAddr function_address,\n           MemAddr code_size,\n           int set_parameter_size) : Base(function_name,\n                                          function_address,\n                                          code_size,\n                                          set_parameter_size),\n                                     lines() { }\n  RangeMap< MemAddr, linked_ptr<Line> > lines;\n private:\n  typedef SourceLineResolverBase::Function Base;\n};\n\n\nclass BasicSourceLineResolver::Module : public SourceLineResolverBase::Module {\n public:\n  explicit Module(const string &name) : name_(name) { }\n  virtual ~Module() { }\n\n  // Loads a map from the given buffer in char* type.\n  // Does NOT have ownership of memory_buffer.\n  virtual bool LoadMapFromMemory(char *memory_buffer);\n\n  // Looks up the given relative address, and fills the StackFrame struct\n  // with the result.\n  virtual void LookupAddress(StackFrame *frame) const;\n\n  // If Windows stack walking information is available covering ADDRESS,\n  // return a WindowsFrameInfo structure describing it. If the information\n  // is not available, returns NULL. A NULL return value does not indicate\n  // an error. The caller takes ownership of any returned WindowsFrameInfo\n  // object.\n  virtual WindowsFrameInfo *FindWindowsFrameInfo(const StackFrame *frame) const;\n\n  // If CFI stack walking information is available covering ADDRESS,\n  // return a CFIFrameInfo structure describing it. If the information\n  // is not available, return NULL. The caller takes ownership of any\n  // returned CFIFrameInfo object.\n  virtual CFIFrameInfo *FindCFIFrameInfo(const StackFrame *frame) const;\n\n private:\n  // Friend declarations.\n  friend class BasicSourceLineResolver;\n  friend class ModuleComparer;\n  friend class ModuleSerializer;\n\n  typedef std::map<int, string> FileMap;\n\n  // Parses a file declaration\n  bool ParseFile(char *file_line);\n\n  // Parses a function declaration, returning a new Function object.\n  Function* ParseFunction(char *function_line);\n\n  // Parses a line declaration, returning a new Line object.\n  Line* ParseLine(char *line_line);\n\n  // Parses a PUBLIC symbol declaration, storing it in public_symbols_.\n  // Returns false if an error occurs.\n  bool ParsePublicSymbol(char *public_line);\n\n  // Parses a STACK WIN or STACK CFI frame info declaration, storing\n  // it in the appropriate table.\n  bool ParseStackInfo(char *stack_info_line);\n\n  // Parses a STACK CFI record, storing it in cfi_frame_info_.\n  bool ParseCFIFrameInfo(char *stack_info_line);\n\n  string name_;\n  FileMap files_;\n  RangeMap< MemAddr, linked_ptr<Function> > functions_;\n  AddressMap< MemAddr, linked_ptr<PublicSymbol> > public_symbols_;\n\n  // Each element in the array is a ContainedRangeMap for a type\n  // listed in WindowsFrameInfoTypes. These are split by type because\n  // there may be overlaps between maps of different types, but some\n  // information is only available as certain types.\n  ContainedRangeMap< MemAddr, linked_ptr<WindowsFrameInfo> >\n    windows_frame_info_[WindowsFrameInfo::STACK_INFO_LAST];\n\n  // DWARF CFI stack walking data. The Module stores the initial rule sets\n  // and rule deltas as strings, just as they appear in the symbol file:\n  // although the file may contain hundreds of thousands of STACK CFI\n  // records, walking a stack will only ever use a few of them, so it's\n  // best to delay parsing a record until it's actually needed.\n\n  // STACK CFI INIT records: for each range, an initial set of register\n  // recovery rules. The RangeMap's itself gives the starting and ending\n  // addresses.\n  RangeMap<MemAddr, string> cfi_initial_rules_;\n\n  // STACK CFI records: at a given address, the changes to the register\n  // recovery rules that take effect at that address. The map key is the\n  // starting address; the ending address is the key of the next entry in\n  // this map, or the end of the range as given by the cfi_initial_rules_\n  // entry (which FindCFIFrameInfo looks up first).\n  std::map<MemAddr, string> cfi_delta_rules_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_TYPES_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/basic_source_line_resolver_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <stdio.h>\n\n#include <string>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"google_breakpad/processor/basic_source_line_resolver.h\"\n#include \"google_breakpad/processor/code_module.h\"\n#include \"google_breakpad/processor/stack_frame.h\"\n#include \"google_breakpad/processor/memory_region.h\"\n#include \"processor/linked_ptr.h\"\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n#include \"processor/windows_frame_info.h\"\n#include \"processor/cfi_frame_info.h\"\n\nnamespace {\n\nusing std::string;\nusing google_breakpad::BasicSourceLineResolver;\nusing google_breakpad::CFIFrameInfo;\nusing google_breakpad::CodeModule;\nusing google_breakpad::MemoryRegion;\nusing google_breakpad::StackFrame;\nusing google_breakpad::WindowsFrameInfo;\nusing google_breakpad::linked_ptr;\nusing google_breakpad::scoped_ptr;\n\nclass TestCodeModule : public CodeModule {\n public:\n  TestCodeModule(string code_file) : code_file_(code_file) {}\n  virtual ~TestCodeModule() {}\n\n  virtual u_int64_t base_address() const { return 0; }\n  virtual u_int64_t size() const { return 0xb000; }\n  virtual string code_file() const { return code_file_; }\n  virtual string code_identifier() const { return \"\"; }\n  virtual string debug_file() const { return \"\"; }\n  virtual string debug_identifier() const { return \"\"; }\n  virtual string version() const { return \"\"; }\n  virtual const CodeModule* Copy() const {\n    return new TestCodeModule(code_file_);\n  }\n\n private:\n  string code_file_;\n};\n\n// A mock memory region object, for use by the STACK CFI tests.\nclass MockMemoryRegion: public MemoryRegion {\n  u_int64_t GetBase() const { return 0x10000; }\n  u_int32_t GetSize() const { return 0x01000; }\n  bool GetMemoryAtAddress(u_int64_t address, u_int8_t *value) const {\n    *value = address & 0xff;\n    return true;\n  }\n  bool GetMemoryAtAddress(u_int64_t address, u_int16_t *value) const {\n    *value = address & 0xffff;\n    return true;\n  }\n  bool GetMemoryAtAddress(u_int64_t address, u_int32_t *value) const {\n    switch (address) {\n      case 0x10008: *value = 0x98ecadc3; break; // saved %ebx\n      case 0x1000c: *value = 0x878f7524; break; // saved %esi\n      case 0x10010: *value = 0x6312f9a5; break; // saved %edi\n      case 0x10014: *value = 0x10038;    break; // caller's %ebp\n      case 0x10018: *value = 0xf6438648; break; // return address\n      default: *value = 0xdeadbeef;      break; // junk\n    }\n    return true;\n  }\n  bool GetMemoryAtAddress(u_int64_t address, u_int64_t *value) const {\n    *value = address;\n    return true;\n  }\n};\n\n// Verify that, for every association in ACTUAL, EXPECTED has the same\n// association. (That is, ACTUAL's associations should be a subset of\n// EXPECTED's.) Also verify that ACTUAL has associations for \".ra\" and\n// \".cfa\".\nstatic bool VerifyRegisters(\n    const char *file, int line,\n    const CFIFrameInfo::RegisterValueMap<u_int32_t> &expected,\n    const CFIFrameInfo::RegisterValueMap<u_int32_t> &actual) {\n  CFIFrameInfo::RegisterValueMap<u_int32_t>::const_iterator a;\n  a = actual.find(\".cfa\");\n  if (a == actual.end())\n    return false;\n  a = actual.find(\".ra\");\n  if (a == actual.end())\n    return false;\n  for (a = actual.begin(); a != actual.end(); a++) {\n    CFIFrameInfo::RegisterValueMap<u_int32_t>::const_iterator e =\n      expected.find(a->first);\n    if (e == expected.end()) {\n      fprintf(stderr, \"%s:%d: unexpected register '%s' recovered, value 0x%x\\n\",\n              file, line, a->first.c_str(), a->second);\n      return false;\n    }\n    if (e->second != a->second) {\n      fprintf(stderr,\n              \"%s:%d: register '%s' recovered value was 0x%x, expected 0x%x\\n\",\n              file, line, a->first.c_str(), a->second, e->second);\n      return false;\n    }\n    // Don't complain if this doesn't recover all registers. Although\n    // the DWARF spec says that unmentioned registers are undefined,\n    // GCC uses omission to mean that they are unchanged.\n  }\n  return true;\n}\n\n\nstatic bool VerifyEmpty(const StackFrame &frame) {\n  if (frame.function_name.empty() &&\n      frame.source_file_name.empty() &&\n      frame.source_line == 0)\n    return true;\n  return false;\n}\n\nstatic void ClearSourceLineInfo(StackFrame *frame) {\n  frame->function_name.clear();\n  frame->module = NULL;\n  frame->source_file_name.clear();\n  frame->source_line = 0;\n}\n\nclass TestBasicSourceLineResolver : public ::testing::Test {\npublic:\n  void SetUp() {\n    testdata_dir = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n                         \"/src/processor/testdata\";\n  }\n\n  BasicSourceLineResolver resolver;\n  string testdata_dir;\n};\n\nTEST_F(TestBasicSourceLineResolver, TestLoadAndResolve)\n{\n  TestCodeModule module1(\"module1\");\n  ASSERT_TRUE(resolver.LoadModule(&module1, testdata_dir + \"/module1.out\"));\n  ASSERT_TRUE(resolver.HasModule(&module1));\n  TestCodeModule module2(\"module2\");\n  ASSERT_TRUE(resolver.LoadModule(&module2, testdata_dir + \"/module2.out\"));\n  ASSERT_TRUE(resolver.HasModule(&module2));\n\n\n  StackFrame frame;\n  scoped_ptr<WindowsFrameInfo> windows_frame_info;\n  scoped_ptr<CFIFrameInfo> cfi_frame_info;\n  frame.instruction = 0x1000;\n  frame.module = NULL;\n  resolver.FillSourceLineInfo(&frame);\n  ASSERT_FALSE(frame.module);\n  ASSERT_TRUE(frame.function_name.empty());\n  ASSERT_EQ(frame.function_base, 0);\n  ASSERT_TRUE(frame.source_file_name.empty());\n  ASSERT_EQ(frame.source_line, 0);\n  ASSERT_EQ(frame.source_line_base, 0);\n\n  frame.module = &module1;\n  resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, \"Function1_1\");\n  ASSERT_TRUE(frame.module);\n  ASSERT_EQ(frame.module->code_file(), \"module1\");\n  ASSERT_EQ(frame.function_base, 0x1000);\n  ASSERT_EQ(frame.source_file_name, \"file1_1.cc\");\n  ASSERT_EQ(frame.source_line, 44);\n  ASSERT_EQ(frame.source_line_base, 0x1000);\n  windows_frame_info.reset(resolver.FindWindowsFrameInfo(&frame));\n  ASSERT_TRUE(windows_frame_info.get());\n  ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_FRAME_DATA);\n  ASSERT_FALSE(windows_frame_info->allocates_base_pointer);\n  ASSERT_EQ(windows_frame_info->program_string,\n            \"$eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ =\");\n\n  ClearSourceLineInfo(&frame);\n  frame.instruction = 0x800;\n  frame.module = &module1;\n  resolver.FillSourceLineInfo(&frame);\n  ASSERT_TRUE(VerifyEmpty(frame));\n  windows_frame_info.reset(resolver.FindWindowsFrameInfo(&frame));\n  ASSERT_FALSE(windows_frame_info.get());\n\n  frame.instruction = 0x1280;\n  resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, \"Function1_3\");\n  ASSERT_TRUE(frame.source_file_name.empty());\n  ASSERT_EQ(frame.source_line, 0);\n  windows_frame_info.reset(resolver.FindWindowsFrameInfo(&frame));\n  ASSERT_TRUE(windows_frame_info.get());\n  ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_UNKNOWN);\n  ASSERT_FALSE(windows_frame_info->allocates_base_pointer);\n  ASSERT_TRUE(windows_frame_info->program_string.empty());\n\n  frame.instruction = 0x1380;\n  resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, \"Function1_4\");\n  ASSERT_TRUE(frame.source_file_name.empty());\n  ASSERT_EQ(frame.source_line, 0);\n  windows_frame_info.reset(resolver.FindWindowsFrameInfo(&frame));\n  ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_FRAME_DATA);\n  ASSERT_TRUE(windows_frame_info.get());\n  ASSERT_FALSE(windows_frame_info->allocates_base_pointer);\n  ASSERT_FALSE(windows_frame_info->program_string.empty());\n\n  frame.instruction = 0x2000;\n  windows_frame_info.reset(resolver.FindWindowsFrameInfo(&frame));\n  ASSERT_FALSE(windows_frame_info.get());\n\n  // module1 has STACK CFI records covering 3d40..3def;\n  // module2 has STACK CFI records covering 3df0..3e9f;\n  // check that FindCFIFrameInfo doesn't claim to find any outside those ranges.\n  frame.instruction = 0x3d3f;\n  frame.module = &module1;\n  cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));\n  ASSERT_FALSE(cfi_frame_info.get());\n\n  frame.instruction = 0x3e9f;\n  frame.module = &module1;\n  cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));\n  ASSERT_FALSE(cfi_frame_info.get());\n\n  CFIFrameInfo::RegisterValueMap<u_int32_t> current_registers;\n  CFIFrameInfo::RegisterValueMap<u_int32_t> caller_registers;\n  CFIFrameInfo::RegisterValueMap<u_int32_t> expected_caller_registers;\n  MockMemoryRegion memory;\n\n  // Regardless of which instruction evaluation takes place at, it\n  // should produce the same values for the caller's registers.\n  expected_caller_registers[\".cfa\"] = 0x1001c;\n  expected_caller_registers[\".ra\"]  = 0xf6438648;\n  expected_caller_registers[\"$ebp\"] = 0x10038;\n  expected_caller_registers[\"$ebx\"] = 0x98ecadc3;\n  expected_caller_registers[\"$esi\"] = 0x878f7524;\n  expected_caller_registers[\"$edi\"] = 0x6312f9a5;\n\n  frame.instruction = 0x3d40;\n  frame.module = &module1;\n  current_registers.clear();\n  current_registers[\"$esp\"] = 0x10018;\n  current_registers[\"$ebp\"] = 0x10038;\n  current_registers[\"$ebx\"] = 0x98ecadc3;\n  current_registers[\"$esi\"] = 0x878f7524;\n  current_registers[\"$edi\"] = 0x6312f9a5;\n  cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));\n  ASSERT_TRUE(cfi_frame_info.get());\n  ASSERT_TRUE(cfi_frame_info.get()\n              ->FindCallerRegs<u_int32_t>(current_registers, memory,\n                                          &caller_registers));\n  ASSERT_TRUE(VerifyRegisters(__FILE__, __LINE__,\n                              expected_caller_registers, caller_registers));\n\n  frame.instruction = 0x3d41;\n  current_registers[\"$esp\"] = 0x10014;\n  cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));\n  ASSERT_TRUE(cfi_frame_info.get());\n  ASSERT_TRUE(cfi_frame_info.get()\n              ->FindCallerRegs<u_int32_t>(current_registers, memory,\n                                          &caller_registers));\n  ASSERT_TRUE(VerifyRegisters(__FILE__, __LINE__,\n                              expected_caller_registers, caller_registers));\n\n  frame.instruction = 0x3d43;\n  current_registers[\"$ebp\"] = 0x10014;\n  cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));\n  ASSERT_TRUE(cfi_frame_info.get());\n  ASSERT_TRUE(cfi_frame_info.get()\n              ->FindCallerRegs<u_int32_t>(current_registers, memory,\n                                          &caller_registers));\n  VerifyRegisters(__FILE__, __LINE__,\n                  expected_caller_registers, caller_registers);\n\n  frame.instruction = 0x3d54;\n  current_registers[\"$ebx\"] = 0x6864f054U;\n  cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));\n  ASSERT_TRUE(cfi_frame_info.get());\n  ASSERT_TRUE(cfi_frame_info.get()\n              ->FindCallerRegs<u_int32_t>(current_registers, memory,\n                                          &caller_registers));\n  VerifyRegisters(__FILE__, __LINE__,\n                  expected_caller_registers, caller_registers);\n\n  frame.instruction = 0x3d5a;\n  current_registers[\"$esi\"] = 0x6285f79aU;\n  cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));\n  ASSERT_TRUE(cfi_frame_info.get());\n  ASSERT_TRUE(cfi_frame_info.get()\n              ->FindCallerRegs<u_int32_t>(current_registers, memory,\n                                          &caller_registers));\n  VerifyRegisters(__FILE__, __LINE__,\n                  expected_caller_registers, caller_registers);\n\n  frame.instruction = 0x3d84;\n  current_registers[\"$edi\"] = 0x64061449U;\n  cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));\n  ASSERT_TRUE(cfi_frame_info.get());\n  ASSERT_TRUE(cfi_frame_info.get()\n              ->FindCallerRegs<u_int32_t>(current_registers, memory,\n                                          &caller_registers));\n  VerifyRegisters(__FILE__, __LINE__,\n                  expected_caller_registers, caller_registers);\n\n  frame.instruction = 0x2900;\n  frame.module = &module1;\n  resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, string(\"PublicSymbol\"));\n\n  frame.instruction = 0x4000;\n  frame.module = &module1;\n  resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, string(\"LargeFunction\"));\n\n  frame.instruction = 0x2181;\n  frame.module = &module2;\n  resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, \"Function2_2\");\n  ASSERT_EQ(frame.function_base, 0x2170);\n  ASSERT_TRUE(frame.module);\n  ASSERT_EQ(frame.module->code_file(), \"module2\");\n  ASSERT_EQ(frame.source_file_name, \"file2_2.cc\");\n  ASSERT_EQ(frame.source_line, 21);\n  ASSERT_EQ(frame.source_line_base, 0x2180);\n  windows_frame_info.reset(resolver.FindWindowsFrameInfo(&frame));\n  ASSERT_TRUE(windows_frame_info.get());\n  ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_FRAME_DATA);\n  ASSERT_EQ(windows_frame_info->prolog_size, 1);\n\n  frame.instruction = 0x216f;\n  resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, \"Public2_1\");\n\n  ClearSourceLineInfo(&frame);\n  frame.instruction = 0x219f;\n  frame.module = &module2;\n  resolver.FillSourceLineInfo(&frame);\n  ASSERT_TRUE(frame.function_name.empty());\n\n  frame.instruction = 0x21a0;\n  frame.module = &module2;\n  resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, \"Public2_2\");\n}\n\nTEST_F(TestBasicSourceLineResolver, TestInvalidLoads)\n{\n  TestCodeModule module3(\"module3\");\n  ASSERT_FALSE(resolver.LoadModule(&module3,\n                                   testdata_dir + \"/module3_bad.out\"));\n  ASSERT_FALSE(resolver.HasModule(&module3));\n  TestCodeModule module4(\"module4\");\n  ASSERT_FALSE(resolver.LoadModule(&module4,\n                                   testdata_dir + \"/module4_bad.out\"));\n  ASSERT_FALSE(resolver.HasModule(&module4));\n  TestCodeModule module5(\"module5\");\n  ASSERT_FALSE(resolver.LoadModule(&module5,\n                                   testdata_dir + \"/invalid-filename\"));\n  ASSERT_FALSE(resolver.HasModule(&module5));\n  TestCodeModule invalidmodule(\"invalid-module\");\n  ASSERT_FALSE(resolver.HasModule(&invalidmodule));\n}\n\nTEST_F(TestBasicSourceLineResolver, TestUnload)\n{\n  TestCodeModule module1(\"module1\");\n  ASSERT_FALSE(resolver.HasModule(&module1));\n  ASSERT_TRUE(resolver.LoadModule(&module1, testdata_dir + \"/module1.out\"));\n  ASSERT_TRUE(resolver.HasModule(&module1));\n  resolver.UnloadModule(&module1);\n  ASSERT_FALSE(resolver.HasModule(&module1));\n  ASSERT_TRUE(resolver.LoadModule(&module1, testdata_dir + \"/module1.out\"));\n  ASSERT_TRUE(resolver.HasModule(&module1));\n}\n\n}  // namespace\n\nint main(int argc, char *argv[]) {\n  ::testing::InitGoogleTest(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/binarystream.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <arpa/inet.h>\n#include <limits.h>\n\n#include <vector>\n\n#include \"processor/binarystream.h\"\n\nnamespace google_breakpad {\nusing std::string;\nusing std::vector;\n\nbinarystream &binarystream::operator>>(std::string &str) {\n  u_int16_t length;\n  *this >> length;\n  if (eof())\n    return *this;\n  if (length == 0) {\n    str.clear();\n    return *this;\n  }\n  vector<char> buffer(length);\n  stream_.read(&buffer[0], length);\n  if (!eof())\n    str.assign(&buffer[0], length);\n  return *this;\n}\n\nbinarystream &binarystream::operator>>(u_int8_t &u8) {\n  stream_.read((char *)&u8, 1);\n  return *this;\n}\n\nbinarystream &binarystream::operator>>(u_int16_t &u16) {\n  u_int16_t temp;\n  stream_.read((char *)&temp, 2);\n  if (!eof())\n    u16 = ntohs(temp);\n  return *this;\n}\n\nbinarystream &binarystream::operator>>(u_int32_t &u32) {\n  u_int32_t temp;\n  stream_.read((char *)&temp, 4);\n  if (!eof())\n    u32 = ntohl(temp);\n  return *this;\n}\n\nbinarystream &binarystream::operator>>(u_int64_t &u64) {\n  u_int32_t lower, upper;\n  *this >> lower >> upper;\n  if (!eof())\n    u64 = static_cast<u_int64_t>(lower) | (static_cast<u_int64_t>(upper) << 32);\n  return *this;\n}\n\nbinarystream &binarystream::operator<<(const std::string &str) {\n  if (str.length() > USHRT_MAX) {\n    // truncate to 16-bit length\n    *this << static_cast<u_int16_t>(USHRT_MAX);\n    stream_.write(str.c_str(), USHRT_MAX);\n  } else {\n    *this << (u_int16_t)(str.length() & 0xFFFF);\n    stream_.write(str.c_str(), str.length());\n  }\n  return *this;\n}\n\nbinarystream &binarystream::operator<<(u_int8_t u8) {\n  stream_.write((const char*)&u8, 1);\n  return *this;\n}\n\nbinarystream &binarystream::operator<<(u_int16_t u16) {\n  u16 = htons(u16);\n  stream_.write((const char*)&u16, 2);\n  return *this;\n}\n\nbinarystream &binarystream::operator<<(u_int32_t u32) {\n  u32 = htonl(u32);\n  stream_.write((const char*)&u32, 4);\n  return *this;\n}\n\nbinarystream &binarystream::operator<<(u_int64_t u64) {\n  // write 64-bit ints as two 32-bit ints, so we can byte-swap them easily\n  u_int32_t lower = static_cast<u_int32_t>(u64 & 0xFFFFFFFF);\n  u_int32_t upper = static_cast<u_int32_t>(u64 >> 32);\n  *this << lower << upper;\n  return *this;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/binarystream.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// binarystream implements part of the std::iostream interface as a\n// wrapper around std::stringstream to allow reading and writing\n// std::string and integers of known size.\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_BINARYSTREAM_H_\n#define GOOGLE_BREAKPAD_PROCESSOR_BINARYSTREAM_H_\n\n#include <sstream>\n#include <string>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\nnamespace google_breakpad {\nusing std::ios_base;\nusing std::ios;\n\nclass binarystream {\n public:\n  explicit binarystream(ios_base::openmode which = ios_base::out|ios_base::in)\n    : stream_(which) {}\n  explicit binarystream(const std::string &str,\n                        ios_base::openmode which = ios_base::out|ios_base::in)\n    : stream_(str, which) {}\n  explicit binarystream(const char *str, size_t size,\n                        ios_base::openmode which = ios_base::out|ios_base::in)\n    : stream_(std::string(str, size), which) {}\n\n  binarystream &operator>>(std::string &str);\n  binarystream &operator>>(u_int8_t &u8);\n  binarystream &operator>>(u_int16_t &u16);\n  binarystream &operator>>(u_int32_t &u32);\n  binarystream &operator>>(u_int64_t &u64);\n\n  // Note: strings are truncated at 65535 characters\n  binarystream &operator<<(const std::string &str);\n  binarystream &operator<<(u_int8_t u8);\n  binarystream &operator<<(u_int16_t u16);\n  binarystream &operator<<(u_int32_t u32);\n  binarystream &operator<<(u_int64_t u64);\n\n  // Forward a few methods directly from the stream object\n  bool eof() const { return stream_.eof(); }\n  void clear() { stream_.clear(); }\n  std::string str() const { return stream_.str(); }\n  void str(const std::string &s) { stream_.str(s); }\n    \n  // Seek both read and write pointers to the beginning of the stream.\n  void rewind() {\n    stream_.seekg (0, ios::beg);\n    stream_.seekp (0, ios::beg);\n    // This is to clear all the error flags, since only the EOF flag is cleared\n    // with seekg().\n    stream_.clear();\n  }\n\n private:\n  std::stringstream stream_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_BINARYSTREAM_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/binarystream_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <ios>\n#include <string>\n#include <vector>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"processor/binarystream.h\"\n\nnamespace {\nusing std::ios_base;\nusing std::string;\nusing std::vector;\nusing google_breakpad::binarystream;\n\n\nclass BinaryStreamBasicTest : public ::testing::Test {\nprotected:\n  binarystream stream;\n};\n \nTEST_F(BinaryStreamBasicTest, ReadU8) {\n  u_int8_t u8 = 0;\n  ASSERT_FALSE(stream.eof());\n  stream >> u8;\n  ASSERT_TRUE(stream.eof());\n  EXPECT_EQ(0, u8);\n  stream.rewind();\n  stream.clear();\n  stream << (u_int8_t)1;\n  ASSERT_FALSE(stream.eof());\n  stream >> u8;\n  EXPECT_EQ(1, u8);\n  EXPECT_FALSE(stream.eof());\n}\n\nTEST_F(BinaryStreamBasicTest, ReadU16) {\n  u_int16_t u16 = 0;\n  ASSERT_FALSE(stream.eof());\n  stream >> u16;\n  ASSERT_TRUE(stream.eof());\n  EXPECT_EQ(0, u16);\n  stream.rewind();\n  stream.clear();\n  stream << (u_int16_t)1;\n  ASSERT_FALSE(stream.eof());\n  stream >> u16;\n  EXPECT_EQ(1, u16);\n  EXPECT_FALSE(stream.eof());\n}\n\nTEST_F(BinaryStreamBasicTest, ReadU32) {\n  u_int32_t u32 = 0;\n  ASSERT_FALSE(stream.eof());\n  stream >> u32;\n  ASSERT_TRUE(stream.eof());\n  EXPECT_EQ(0, u32);\n  stream.rewind();\n  stream.clear();\n  stream << (u_int32_t)1;\n  ASSERT_FALSE(stream.eof());\n  stream >> u32;\n  EXPECT_EQ(1, u32);\n  EXPECT_FALSE(stream.eof());\n}\n\nTEST_F(BinaryStreamBasicTest, ReadU64) {\n  u_int64_t u64 = 0;\n  ASSERT_FALSE(stream.eof());\n  stream >> u64;\n  ASSERT_TRUE(stream.eof());\n  EXPECT_EQ(0, u64);\n  stream.rewind();\n  stream.clear();\n  stream << (u_int64_t)1;\n  ASSERT_FALSE(stream.eof());\n  stream >> u64;\n  EXPECT_EQ(1, u64);\n  EXPECT_FALSE(stream.eof());\n}\n\nTEST_F(BinaryStreamBasicTest, ReadString) {\n  string s(\"\");\n  ASSERT_FALSE(stream.eof());\n  stream >> s;\n  ASSERT_TRUE(stream.eof());\n  EXPECT_EQ(\"\", s);\n  // write an empty string to the stream, read it back\n  s = \"abcd\";\n  stream.rewind();\n  stream.clear();\n  stream << string(\"\");\n  stream >> s;\n  EXPECT_EQ(\"\", s);\n  EXPECT_FALSE(stream.eof());\n  stream.rewind();\n  stream.clear();\n  stream << string(\"test\");\n  ASSERT_FALSE(stream.eof());\n  stream >> s;\n  EXPECT_EQ(\"test\", s);\n  EXPECT_FALSE(stream.eof());\n}\n\nTEST_F(BinaryStreamBasicTest, ReadEmptyString) {\n  string s(\"abc\");\n  stream << string(\"\");\n  stream >> s;\n  EXPECT_EQ(\"\", s);\n}\n\nTEST_F(BinaryStreamBasicTest, ReadMultiU8) {\n  const u_int8_t ea = 0, eb = 100, ec = 200, ed = 0xFF;\n  u_int8_t a, b, c, d, e;\n  stream << ea << eb << ec << ed;\n  stream >> a >> b >> c >> d;\n  ASSERT_FALSE(stream.eof());\n  EXPECT_EQ(ea, a);\n  EXPECT_EQ(eb, b);\n  EXPECT_EQ(ec, c);\n  EXPECT_EQ(ed, d);\n  ASSERT_FALSE(stream.eof());\n  e = 0;\n  stream >> e;\n  EXPECT_EQ(0, e);\n  ASSERT_TRUE(stream.eof());\n  // try reading all at once, including one past eof\n  stream.rewind();\n  stream.clear();\n  ASSERT_FALSE(stream.eof());\n  a = b = c = d = e = 0;\n  stream << ea << eb << ec << ed;\n  stream >> a >> b >> c >> d >> e;\n  EXPECT_EQ(ea, a);\n  EXPECT_EQ(eb, b);\n  EXPECT_EQ(ec, c);\n  EXPECT_EQ(ed, d);\n  EXPECT_EQ(0, e);\n  EXPECT_TRUE(stream.eof());\n}\n\nTEST_F(BinaryStreamBasicTest, ReadMultiU16) {\n  const u_int16_t ea = 0, eb = 0x100, ec = 0x8000, ed = 0xFFFF;\n  u_int16_t a, b, c, d, e;\n  stream << ea << eb << ec << ed;\n  stream >> a >> b >> c >> d;\n  ASSERT_FALSE(stream.eof());\n  EXPECT_EQ(ea, a);\n  EXPECT_EQ(eb, b);\n  EXPECT_EQ(ec, c);\n  EXPECT_EQ(ed, d);\n  ASSERT_FALSE(stream.eof());\n  e = 0;\n  stream >> e;\n  EXPECT_EQ(0, e);\n  EXPECT_TRUE(stream.eof());\n  // try reading all at once, including one past eof\n  stream.rewind();\n  stream.clear();\n  ASSERT_FALSE(stream.eof());\n  a = b = c = d = e = 0;\n  stream << ea << eb << ec << ed;\n  stream >> a >> b >> c >> d >> e;\n  EXPECT_EQ(ea, a);\n  EXPECT_EQ(eb, b);\n  EXPECT_EQ(ec, c);\n  EXPECT_EQ(ed, d);\n  EXPECT_EQ(0, e);\n  EXPECT_TRUE(stream.eof());\n}\n\nTEST_F(BinaryStreamBasicTest, ReadMultiU32) {\n  const u_int32_t ea = 0, eb = 0x10000, ec = 0x8000000, ed = 0xFFFFFFFF;\n  u_int32_t a, b, c, d, e;\n  stream << ea << eb << ec << ed;\n  stream >> a >> b >> c >> d;\n  ASSERT_FALSE(stream.eof());\n  EXPECT_EQ(ea, a);\n  EXPECT_EQ(eb, b);\n  EXPECT_EQ(ec, c);\n  EXPECT_EQ(ed, d);\n  ASSERT_FALSE(stream.eof());\n  e = 0;\n  stream >> e;\n  EXPECT_EQ(0, e);\n  EXPECT_TRUE(stream.eof());\n  // try reading all at once, including one past eof\n  stream.rewind();\n  stream.clear();\n  ASSERT_FALSE(stream.eof());\n  a = b = c = d = e = 0;\n  stream << ea << eb << ec << ed;\n  stream >> a >> b >> c >> d >> e;\n  EXPECT_EQ(ea, a);\n  EXPECT_EQ(eb, b);\n  EXPECT_EQ(ec, c);\n  EXPECT_EQ(ed, d);\n  EXPECT_EQ(0, e);\n  EXPECT_TRUE(stream.eof());\n}\n\nTEST_F(BinaryStreamBasicTest, ReadMultiU64) {\n  const u_int64_t ea = 0, eb = 0x10000, ec = 0x100000000ULL,\n    ed = 0xFFFFFFFFFFFFFFFFULL;\n  u_int64_t a, b, c, d, e;\n  stream << ea << eb << ec << ed;\n  stream >> a >> b >> c >> d;\n  ASSERT_FALSE(stream.eof());\n  EXPECT_EQ(ea, a);\n  EXPECT_EQ(eb, b);\n  EXPECT_EQ(ec, c);\n  EXPECT_EQ(ed, d);\n  ASSERT_FALSE(stream.eof());\n  e = 0;\n  stream >> e;\n  EXPECT_EQ(0, e);\n  EXPECT_TRUE(stream.eof());\n  // try reading all at once, including one past eof\n  stream.rewind();\n  stream.clear();\n  ASSERT_FALSE(stream.eof());\n  a = b = c = d = e = 0;\n  stream << ea << eb << ec << ed;\n  stream >> a >> b >> c >> d >> e;\n  EXPECT_EQ(ea, a);\n  EXPECT_EQ(eb, b);\n  EXPECT_EQ(ec, c);\n  EXPECT_EQ(ed, d);\n  EXPECT_EQ(0, e);\n  EXPECT_TRUE(stream.eof());\n}\n\nTEST_F(BinaryStreamBasicTest, ReadMixed) {\n  const u_int8_t e8 = 0x10;\n  const u_int16_t e16 = 0x2020;\n  const u_int32_t e32 = 0x30303030;\n  const u_int64_t e64 = 0x4040404040404040ULL;\n  const string es = \"test\";\n  u_int8_t u8 = 0;\n  u_int16_t u16 = 0;\n  u_int32_t u32 = 0;\n  u_int64_t u64 = 0;\n  string s(\"test\");\n  stream << e8 << e16 << e32 << e64 << es;\n  stream >> u8 >> u16 >> u32 >> u64 >> s;\n  EXPECT_FALSE(stream.eof());\n  EXPECT_EQ(e8, u8);\n  EXPECT_EQ(e16, u16);\n  EXPECT_EQ(e32, u32);\n  EXPECT_EQ(e64, u64);\n  EXPECT_EQ(es, s);\n}\n\nTEST_F(BinaryStreamBasicTest, ReadStringMissing) {\n  // ensure that reading a string where only the length is present fails\n  u_int16_t u16 = 8;\n  stream << u16;\n  stream.rewind();\n  string s(\"\");\n  stream >> s;\n  EXPECT_EQ(\"\", s);\n  EXPECT_TRUE(stream.eof());\n}\n\nTEST_F(BinaryStreamBasicTest, ReadStringTruncated) {\n  // ensure that reading a string where not all the data is present fails\n  u_int16_t u16 = 8;\n  stream << u16;\n  stream << (u_int8_t)'t' << (u_int8_t)'e' << (u_int8_t)'s' << (u_int8_t)'t';\n  stream.rewind();\n  string s(\"\");\n  stream >> s;\n  EXPECT_EQ(\"\", s);\n  EXPECT_TRUE(stream.eof());\n}\n\nTEST_F(BinaryStreamBasicTest, StreamByteLength) {\n  // Test that the stream buffer contains the right amount of data\n  stream << (u_int8_t)0 << (u_int16_t)1 << (u_int32_t)2 << (u_int64_t)3\n         << string(\"test\");\n  string s = stream.str();\n  EXPECT_EQ(21, s.length());\n}\n\nTEST_F(BinaryStreamBasicTest, AppendStreamResultsByteLength) {\n  // Test that appending the str() results from two streams\n  // gives the right byte length\n  binarystream stream2;\n  stream << (u_int8_t)0 << (u_int16_t)1;\n  stream2 << (u_int32_t)0 << (u_int64_t)2\n          << string(\"test\");\n  string s = stream.str();\n  string s2 = stream2.str();\n  s.append(s2);\n  EXPECT_EQ(21, s.length());\n}\n\nTEST_F(BinaryStreamBasicTest, StreamSetStr) {\n  const string es(\"test\");\n  stream << es;\n  binarystream stream2;\n  stream2.str(stream.str());\n  string s;\n  stream2 >> s;\n  EXPECT_FALSE(stream2.eof());\n  EXPECT_EQ(\"test\", s);\n  s = \"\";\n  stream2.str(stream.str());\n  stream2.rewind();\n  stream2 >> s;\n  EXPECT_FALSE(stream2.eof());\n  EXPECT_EQ(\"test\", s);\n}\n\nclass BinaryStreamU8Test : public ::testing::Test {\nprotected:\n  binarystream stream;\n\n  void SetUp() {\n    stream << (u_int8_t)1;\n  }\n};\n\nTEST_F(BinaryStreamU8Test, ReadU16) {\n  u_int16_t u16 = 0;\n  ASSERT_FALSE(stream.eof());\n  stream >> u16;\n  ASSERT_TRUE(stream.eof());\n  EXPECT_EQ(0, u16);\n}\n\nTEST_F(BinaryStreamU8Test, ReadU32) {\n  u_int32_t u32 = 0;\n  ASSERT_FALSE(stream.eof());\n  stream >> u32;\n  ASSERT_TRUE(stream.eof());\n  EXPECT_EQ(0, u32);\n}\n\nTEST_F(BinaryStreamU8Test, ReadU64) {\n  u_int64_t u64 = 0;\n  ASSERT_FALSE(stream.eof());\n  stream >> u64;\n  ASSERT_TRUE(stream.eof());\n  EXPECT_EQ(0, u64);\n}\n\nTEST_F(BinaryStreamU8Test, ReadString) {\n  string s(\"\");\n  ASSERT_FALSE(stream.eof());\n  stream >> s;\n  ASSERT_TRUE(stream.eof());\n  EXPECT_EQ(\"\", s);\n}\n\n\nTEST(BinaryStreamTest, InitWithData) {\n  const char *data = \"abcd\";\n  binarystream stream(data);\n  u_int8_t a, b, c, d;\n  stream >> a >> b >> c >> d;\n  ASSERT_FALSE(stream.eof());\n  EXPECT_EQ('a', a);\n  EXPECT_EQ('b', b);\n  EXPECT_EQ('c', c);\n  EXPECT_EQ('d', d);\n}\n\nTEST(BinaryStreamTest, InitWithDataLeadingNull) {\n  const char *data = \"\\0abcd\";\n  binarystream stream(data, 5);\n  u_int8_t z, a, b, c, d;\n  stream >> z >> a >> b >> c >> d;\n  ASSERT_FALSE(stream.eof());\n  EXPECT_EQ(0, z);\n  EXPECT_EQ('a', a);\n  EXPECT_EQ('b', b);\n  EXPECT_EQ('c', c);\n  EXPECT_EQ('d', d);\n}\n\nTEST(BinaryStreamTest, InitWithDataVector) {\n  vector<char> data;\n  data.push_back('a');\n  data.push_back('b');\n  data.push_back('c');\n  data.push_back('d');\n  data.push_back('e');\n  data.resize(4);\n  binarystream stream(&data[0], data.size());\n  u_int8_t a, b, c, d;\n  stream >> a >> b >> c >> d;\n  ASSERT_FALSE(stream.eof());\n  EXPECT_EQ('a', a);\n  EXPECT_EQ('b', b);\n  EXPECT_EQ('c', c);\n  EXPECT_EQ('d', d);\n}\n\n} // namespace\n\nint main(int argc, char *argv[]) {\n  ::testing::InitGoogleTest(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/call_stack.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// call_stack.cc: A call stack comprised of stack frames.\n//\n// See call_stack.h for documentation.\n//\n// Author: Mark Mentovai\n\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/stack_frame.h\"\n\nnamespace google_breakpad {\n\nCallStack::~CallStack() {\n  Clear();\n}\n\nvoid CallStack::Clear() {\n  for (vector<StackFrame *>::const_iterator iterator = frames_.begin();\n       iterator != frames_.end();\n       ++iterator) {\n    delete *iterator;\n  }\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/cfi_frame_info-inl.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// cfi_frame_info-inl.h: Definitions for cfi_frame_info.h inlined functions.\n\n#ifndef PROCESSOR_CFI_FRAME_INFO_INL_H_\n#define PROCESSOR_CFI_FRAME_INFO_INL_H_\n\n#include <string.h>\n\nnamespace google_breakpad {\n\ntemplate <typename RegisterType, class RawContextType>\nbool SimpleCFIWalker<RegisterType, RawContextType>::FindCallerRegisters(\n    const MemoryRegion &memory,\n    const CFIFrameInfo &cfi_frame_info,\n    const RawContextType &callee_context,\n    int callee_validity,\n    RawContextType *caller_context,\n    int *caller_validity) const {\n  typedef CFIFrameInfo::RegisterValueMap<RegisterType> ValueMap;\n  ValueMap callee_registers;\n  ValueMap caller_registers;\n  // Just for brevity.\n  typename ValueMap::const_iterator caller_none = caller_registers.end();\n\n  // Populate callee_registers with register values from callee_context.\n  for (size_t i = 0; i < map_size_; i++) {\n    const RegisterSet &r = register_map_[i];\n    if (callee_validity & r.validity_flag)\n      callee_registers[r.name] = callee_context.*r.context_member;\n  }\n\n  // Apply the rules, and see what register values they yield.\n  if (!cfi_frame_info.FindCallerRegs<RegisterType>(callee_registers, memory,\n                                                   &caller_registers))\n    return false;\n\n  // Populate *caller_context with the values the rules placed in\n  // caller_registers.\n  memset(caller_context, 0xda, sizeof(*caller_context));\n  *caller_validity = 0;\n  for (size_t i = 0; i < map_size_; i++) {\n    const RegisterSet &r = register_map_[i];\n    typename ValueMap::const_iterator caller_entry;\n\n    // Did the rules provide a value for this register by its name?\n    caller_entry = caller_registers.find(r.name);\n    if (caller_entry != caller_none) {\n      caller_context->*r.context_member = caller_entry->second;\n      *caller_validity |= r.validity_flag;\n      continue;\n    }\n\n    // Did the rules provide a value for this register under its\n    // alternate name?\n    if (r.alternate_name) {\n      caller_entry = caller_registers.find(r.alternate_name);\n      if (caller_entry != caller_none) {\n        caller_context->*r.context_member = caller_entry->second;\n        *caller_validity |= r.validity_flag;\n        continue;\n      }\n    }\n\n    // Is this a callee-saves register? The walker assumes that these\n    // still hold the caller's value if the CFI doesn't mention them.\n    //\n    // Note that other frame walkers may fail to recover callee-saves\n    // registers; for example, the x86 \"traditional\" strategy only\n    // recovers %eip, %esp, and %ebp, even though %ebx, %esi, and %edi\n    // are callee-saves, too. It is not correct to blindly set the\n    // valid bit for all callee-saves registers, without first\n    // checking its validity bit in the callee.\n    if (r.callee_saves && (callee_validity & r.validity_flag) != 0) {\n      caller_context->*r.context_member = callee_context.*r.context_member;\n      *caller_validity |= r.validity_flag;\n      continue;\n    }\n\n    // Otherwise, the register's value is unknown.\n  }\n\n  return true;\n}\n\n} // namespace google_breakpad\n\n#endif // PROCESSOR_CFI_FRAME_INFO_INL_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/cfi_frame_info.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// cfi_frame_info.cc: Implementation of CFIFrameInfo class.\n// See cfi_frame_info.h for details.\n\n#include \"processor/cfi_frame_info.h\"\n\n#include <string.h>\n\n#include <sstream>\n\n#include \"processor/postfix_evaluator-inl.h\"\n#include \"processor/scoped_ptr.h\"\n\nnamespace google_breakpad {\n\ntemplate<typename V>\nbool CFIFrameInfo::FindCallerRegs(const RegisterValueMap<V> &registers,\n                                  const MemoryRegion &memory,\n                                  RegisterValueMap<V> *caller_registers) const {\n  // If there are not rules for both .ra and .cfa in effect at this address,\n  // don't use this CFI data for stack walking.\n  if (cfa_rule_.empty() || ra_rule_.empty())\n    return false;\n\n  RegisterValueMap<V> working;\n  PostfixEvaluator<V> evaluator(&working, &memory);\n\n  caller_registers->clear();\n\n  // First, compute the CFA.\n  V cfa;\n  working = registers;\n  if (!evaluator.EvaluateForValue(cfa_rule_, &cfa))\n    return false;\n\n  // Then, compute the return address.\n  V ra;\n  working = registers;\n  working[\".cfa\"] = cfa;\n  if (!evaluator.EvaluateForValue(ra_rule_, &ra))\n    return false;\n\n  // Now, compute values for all the registers register_rules_ mentions.\n  for (RuleMap::const_iterator it = register_rules_.begin();\n       it != register_rules_.end(); it++) {\n    V value;\n    working = registers;\n    working[\".cfa\"] = cfa;\n    if (!evaluator.EvaluateForValue(it->second, &value))\n      return false;\n    (*caller_registers)[it->first] = value;\n  }\n\n  (*caller_registers)[\".ra\"] = ra;\n  (*caller_registers)[\".cfa\"] = cfa;\n\n  return true;\n}\n\n// Explicit instantiations for 32-bit and 64-bit architectures.\ntemplate bool CFIFrameInfo::FindCallerRegs<u_int32_t>(\n    const RegisterValueMap<u_int32_t> &registers,\n    const MemoryRegion &memory,\n    RegisterValueMap<u_int32_t> *caller_registers) const;\ntemplate bool CFIFrameInfo::FindCallerRegs<u_int64_t>(\n    const RegisterValueMap<u_int64_t> &registers,\n    const MemoryRegion &memory,\n    RegisterValueMap<u_int64_t> *caller_registers) const;\n\nstring CFIFrameInfo::Serialize() const {\n  std::ostringstream stream;\n\n  if (!cfa_rule_.empty()) {\n    stream << \".cfa: \" << cfa_rule_;\n  }\n  if (!ra_rule_.empty()) {\n    if (static_cast<std::streamoff>(stream.tellp()) != 0)\n      stream << \" \";\n    stream << \".ra: \" << ra_rule_;\n  }\n  for (RuleMap::const_iterator iter = register_rules_.begin();\n       iter != register_rules_.end();\n       ++iter) {\n    if (static_cast<std::streamoff>(stream.tellp()) != 0)\n      stream << \" \";\n    stream << iter->first << \": \" << iter->second;\n  }\n\n  return stream.str();\n}\n\nbool CFIRuleParser::Parse(const string &rule_set) {\n  size_t rule_set_len = rule_set.size();\n  scoped_array<char> working_copy(new char[rule_set_len + 1]);\n  memcpy(working_copy.get(), rule_set.data(), rule_set_len);\n  working_copy[rule_set_len] = '\\0';\n\n  name_.clear();\n  expression_.clear();\n\n  char *cursor;\n  static const char token_breaks[] = \" \\t\\r\\n\";\n  char *token = strtok_r(working_copy.get(), token_breaks, &cursor);\n\n  for (;;) {\n    // End of rule set?\n    if (!token) return Report();\n\n    // Register/pseudoregister name?\n    size_t token_len = strlen(token);\n    if (token_len >= 1 && token[token_len - 1] == ':') {\n      // Names can't be empty.\n      if (token_len < 2) return false;\n      // If there is any pending content, report it.\n      if (!name_.empty() || !expression_.empty()) {\n        if (!Report()) return false;\n      }\n      name_.assign(token, token_len - 1);\n      expression_.clear();\n    } else {\n      // Another expression component.\n      assert(token_len > 0); // strtok_r guarantees this, I think.\n      if (!expression_.empty())\n        expression_ += ' ';\n      expression_ += token;\n    }\n    token = strtok_r(NULL, token_breaks, &cursor);\n  }\n}\n\nbool CFIRuleParser::Report() {\n  if (name_.empty() || expression_.empty()) return false;\n  if (name_ == \".cfa\") handler_->CFARule(expression_);\n  else if (name_ == \".ra\") handler_->RARule(expression_);\n  else handler_->RegisterRule(name_, expression_);\n  return true;\n}\n\nvoid CFIFrameInfoParseHandler::CFARule(const string &expression) {\n  frame_info_->SetCFARule(expression);\n}\n\nvoid CFIFrameInfoParseHandler::RARule(const string &expression) {\n  frame_info_->SetRARule(expression);\n}\n\nvoid CFIFrameInfoParseHandler::RegisterRule(const string &name,\n                                            const string &expression) {\n  frame_info_->SetRegisterRule(name, expression);\n}\n\n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/cfi_frame_info.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// cfi_frame_info.h: Define the CFIFrameInfo class, which holds the\n// set of 'STACK CFI'-derived register recovery rules that apply at a\n// given instruction.\n\n#ifndef PROCESSOR_CFI_FRAME_INFO_H_\n#define PROCESSOR_CFI_FRAME_INFO_H_\n\n#include <map>\n#include <string>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\nnamespace google_breakpad {\n\nusing std::map;\nusing std::string;\n\nclass MemoryRegion;\n\n// A set of rules for recovering the calling frame's registers'\n// values, when the PC is at a given address in the current frame's\n// function. See the description of 'STACK CFI' records at:\n//\n// http://code.google.com/p/google-breakpad/wiki/SymbolFiles\n//\n// To prepare an instance of CFIFrameInfo for use at a given\n// instruction, first populate it with the rules from the 'STACK CFI\n// INIT' record that covers that instruction, and then apply the\n// changes given by the 'STACK CFI' records up to our instruction's\n// address. Then, use the FindCallerRegs member function to apply the\n// rules to the callee frame's register values, yielding the caller\n// frame's register values.\nclass CFIFrameInfo {\n public:\n  // A map from register names onto values.\n  template<typename ValueType> class RegisterValueMap: \n    public map<string, ValueType> { };\n\n  // Set the expression for computing a call frame address, return\n  // address, or register's value. At least the CFA rule and the RA\n  // rule must be set before calling FindCallerRegs.\n  void SetCFARule(const string &expression) { cfa_rule_ = expression; }\n  void SetRARule(const string &expression)  { ra_rule_ = expression; }\n  void SetRegisterRule(const string &register_name, const string &expression) {\n    register_rules_[register_name] = expression;\n  }\n\n  // Compute the values of the calling frame's registers, according to\n  // this rule set. Use ValueType in expression evaluation; this\n  // should be u_int32_t on machines with 32-bit addresses, or\n  // u_int64_t on machines with 64-bit addresses.\n  //\n  // Return true on success, false otherwise.\n  //\n  // MEMORY provides access to the contents of the stack. REGISTERS is\n  // a dictionary mapping the names of registers whose values are\n  // known in the current frame to their values. CALLER_REGISTERS is\n  // populated with the values of the recoverable registers in the\n  // frame that called the current frame.\n  //\n  // In addition, CALLER_REGISTERS[\".ra\"] will be the return address,\n  // and CALLER_REGISTERS[\".cfa\"] will be the call frame address.\n  // These may be helpful in computing the caller's PC and stack\n  // pointer, if their values are not explicitly specified.\n  template<typename ValueType>\n  bool FindCallerRegs(const RegisterValueMap<ValueType> &registers,\n                      const MemoryRegion &memory,\n                      RegisterValueMap<ValueType> *caller_registers) const;\n\n  // Serialize the rules in this object into a string in the format\n  // of STACK CFI records.\n  string Serialize() const;\n\n private:\n\n  // A map from register names onto evaluation rules. \n  typedef map<string, string> RuleMap;\n\n  // In this type, a \"postfix expression\" is an expression of the sort\n  // interpreted by google_breakpad::PostfixEvaluator.\n\n  // A postfix expression for computing the current frame's CFA (call\n  // frame address). The CFA is a reference address for the frame that\n  // remains unchanged throughout the frame's lifetime. You should\n  // evaluate this expression with a dictionary initially populated\n  // with the values of the current frame's known registers.\n  string cfa_rule_;\n\n  // The following expressions should be evaluated with a dictionary\n  // initially populated with the values of the current frame's known\n  // registers, and with \".cfa\" set to the result of evaluating the\n  // cfa_rule expression, above.\n\n  // A postfix expression for computing the current frame's return\n  // address. \n  string ra_rule_;\n\n  // For a register named REG, rules[REG] is a postfix expression\n  // which leaves the value of REG in the calling frame on the top of\n  // the stack. You should evaluate this expression\n  RuleMap register_rules_;\n};\n\n// A parser for STACK CFI-style rule sets.\n// This may seem bureaucratic: there's no legitimate run-time reason\n// to use a parser/handler pattern for this, as it's not a likely\n// reuse boundary. But doing so makes finer-grained unit testing\n// possible.\nclass CFIRuleParser {\n public:\n\n  class Handler {\n   public:\n    Handler() { }\n    virtual ~Handler() { }\n\n    // The input specifies EXPRESSION as the CFA/RA computation rule.\n    virtual void CFARule(const string &expression) = 0;\n    virtual void RARule(const string &expression) = 0;\n\n    // The input specifies EXPRESSION as the recovery rule for register NAME.\n    virtual void RegisterRule(const string &name, const string &expression) = 0;\n  };\n    \n  // Construct a parser which feeds its results to HANDLER.\n  CFIRuleParser(Handler *handler) : handler_(handler) { }\n\n  // Parse RULE_SET as a set of CFA computation and RA/register\n  // recovery rules, as appearing in STACK CFI records. Report the\n  // results of parsing by making the appropriate calls to handler_.\n  // Return true if parsing was successful, false otherwise.\n  bool Parse(const string &rule_set);\n\n private:\n  // Report any accumulated rule to handler_\n  bool Report();\n\n  // The handler to which the parser reports its findings.\n  Handler *handler_;\n\n  // Working data.\n  string name_, expression_;\n};\n\n// A handler for rule set parsing that populates a CFIFrameInfo with\n// the results.\nclass CFIFrameInfoParseHandler: public CFIRuleParser::Handler {\n public:\n  // Populate FRAME_INFO with the results of parsing.\n  CFIFrameInfoParseHandler(CFIFrameInfo *frame_info)\n      : frame_info_(frame_info) { }\n\n  void CFARule(const string &expression);\n  void RARule(const string &expression);\n  void RegisterRule(const string &name, const string &expression);\n\n private:\n  CFIFrameInfo *frame_info_;\n};\n\n// A utility class template for simple 'STACK CFI'-driven stack walkers.\n// Given a CFIFrameInfo instance, a table describing the architecture's\n// register set, and a context holding the last frame's registers, an\n// instance of this class can populate a new context with the caller's\n// registers.\n//\n// This class template doesn't use any internal knowledge of CFIFrameInfo\n// or the other stack walking structures; it just uses the public interface\n// of CFIFrameInfo to do the usual things. But the logic it handles should\n// be common to many different architectures' stack walkers, so wrapping it\n// up in a class should allow the walkers to share code.\n//\n// RegisterType should be the type of this architecture's registers, either\n// u_int32_t or u_int64_t. RawContextType should be the raw context\n// structure type for this architecture.\ntemplate <typename RegisterType, class RawContextType>\nclass SimpleCFIWalker {\n public:\n  // A structure describing one architecture register.\n  struct RegisterSet {\n    // The register name, as it appears in STACK CFI rules.\n    const char *name;\n\n    // An alternate name that the register's value might be found\n    // under in a register value dictionary, or NULL. When generating\n    // names, prefer NAME to this value. It's common to list \".cfa\" as\n    // an alternative name for the stack pointer, and \".ra\" as an\n    // alternative name for the instruction pointer.\n    const char *alternate_name;\n\n    // True if the callee is expected to preserve the value of this\n    // register. If this flag is true for some register R, and the STACK\n    // CFI records provide no rule to recover R, then SimpleCFIWalker\n    // assumes that the callee has not changed R's value, and the caller's\n    // value for R is that currently in the callee's context.\n    bool callee_saves;\n\n    // The ContextValidity flag representing the register's presence.\n    int validity_flag;\n\n    // A pointer to the RawContextType member that holds the\n    // register's value.\n    RegisterType RawContextType::*context_member;\n  };\n\n  // Create a simple CFI-based frame walker, given a description of the\n  // architecture's register set. REGISTER_MAP is an array of\n  // RegisterSet structures; MAP_SIZE is the number of elements in the\n  // array.\n  SimpleCFIWalker(const RegisterSet *register_map, size_t map_size)\n      : register_map_(register_map), map_size_(map_size) { }\n\n  // Compute the calling frame's raw context given the callee's raw\n  // context.\n  //\n  // Given:\n  //\n  // - MEMORY, holding the stack's contents,\n  // - CFI_FRAME_INFO, describing the called function,\n  // - CALLEE_CONTEXT, holding the called frame's registers, and\n  // - CALLEE_VALIDITY, indicating which registers in CALLEE_CONTEXT are valid,\n  //\n  // fill in CALLER_CONTEXT with the caller's register values, and set\n  // CALLER_VALIDITY to indicate which registers are valid in\n  // CALLER_CONTEXT. Return true on success, or false on failure.\n  bool FindCallerRegisters(const MemoryRegion &memory,\n                           const CFIFrameInfo &cfi_frame_info,\n                           const RawContextType &callee_context,\n                           int callee_validity,\n                           RawContextType *caller_context,\n                           int *caller_validity) const;\n\n private:\n  const RegisterSet *register_map_;\n  size_t map_size_;\n};\n\n}  // namespace google_breakpad\n\n#include \"cfi_frame_info-inl.h\"\n\n#endif  // PROCESSOR_CFI_FRAME_INFO_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/cfi_frame_info_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// cfi_frame_info_unittest.cc: Unit tests for CFIFrameInfo,\n// CFIRuleParser, CFIFrameInfoParseHandler, and SimpleCFIWalker.\n\n#include <string.h>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"processor/cfi_frame_info.h\"\n#include \"google_breakpad/processor/memory_region.h\"\n\nusing google_breakpad::CFIFrameInfo;\nusing google_breakpad::CFIFrameInfoParseHandler;\nusing google_breakpad::CFIRuleParser;\nusing google_breakpad::MemoryRegion;\nusing google_breakpad::SimpleCFIWalker;\nusing std::string;\nusing testing::_;\nusing testing::A;\nusing testing::AtMost;\nusing testing::DoAll;\nusing testing::Return;\nusing testing::SetArgumentPointee;\nusing testing::Test;\n\nclass MockMemoryRegion: public MemoryRegion {\n public:\n  MOCK_CONST_METHOD0(GetBase, u_int64_t());\n  MOCK_CONST_METHOD0(GetSize, u_int32_t());\n  MOCK_CONST_METHOD2(GetMemoryAtAddress, bool(u_int64_t, u_int8_t *));\n  MOCK_CONST_METHOD2(GetMemoryAtAddress, bool(u_int64_t, u_int16_t *));\n  MOCK_CONST_METHOD2(GetMemoryAtAddress, bool(u_int64_t, u_int32_t *));\n  MOCK_CONST_METHOD2(GetMemoryAtAddress, bool(u_int64_t, u_int64_t *));\n};\n\n// Handy definitions for all tests.\nstruct CFIFixture {\n\n  // Set up the mock memory object to expect no references.\n  void ExpectNoMemoryReferences() {\n    EXPECT_CALL(memory, GetBase()).Times(0);\n    EXPECT_CALL(memory, GetSize()).Times(0);\n    EXPECT_CALL(memory, GetMemoryAtAddress(_, A<u_int8_t *>())).Times(0);\n    EXPECT_CALL(memory, GetMemoryAtAddress(_, A<u_int16_t *>())).Times(0);\n    EXPECT_CALL(memory, GetMemoryAtAddress(_, A<u_int32_t *>())).Times(0);\n    EXPECT_CALL(memory, GetMemoryAtAddress(_, A<u_int64_t *>())).Times(0);\n  }\n\n  CFIFrameInfo cfi;\n  MockMemoryRegion memory;\n  CFIFrameInfo::RegisterValueMap<u_int64_t> registers, caller_registers;\n};\n\nclass Simple: public CFIFixture, public Test { };\n\n// FindCallerRegs should fail if no .cfa rule is provided.\nTEST_F(Simple, NoCFA) {\n  ExpectNoMemoryReferences();\n\n  cfi.SetRARule(\"0\");\n  ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                             &caller_registers));\n  ASSERT_EQ(\".ra: 0\", cfi.Serialize());\n}\n\n// FindCallerRegs should fail if no .ra rule is provided.\nTEST_F(Simple, NoRA) {\n  ExpectNoMemoryReferences();\n\n  cfi.SetCFARule(\"0\");\n  ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                             &caller_registers));\n  ASSERT_EQ(\".cfa: 0\", cfi.Serialize());\n}\n\nTEST_F(Simple, SetCFAAndRARule) {\n  ExpectNoMemoryReferences();\n\n  cfi.SetCFARule(\"330903416631436410\");\n  cfi.SetRARule(\"5870666104170902211\");\n  ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                            &caller_registers));\n  ASSERT_EQ(2U, caller_registers.size());\n  ASSERT_EQ(330903416631436410ULL, caller_registers[\".cfa\"]);\n  ASSERT_EQ(5870666104170902211ULL, caller_registers[\".ra\"]);\n\n  ASSERT_EQ(\".cfa: 330903416631436410 .ra: 5870666104170902211\",\n            cfi.Serialize());\n}\n\nTEST_F(Simple, SetManyRules) {\n  ExpectNoMemoryReferences();\n\n  cfi.SetCFARule(\"$temp1 68737028 = $temp2 61072337 = $temp1 $temp2 -\");\n  cfi.SetRARule(\".cfa 99804755 +\");\n  cfi.SetRegisterRule(\"register1\", \".cfa 54370437 *\");\n  cfi.SetRegisterRule(\"vodkathumbscrewingly\", \"24076308 .cfa +\");\n  cfi.SetRegisterRule(\"pubvexingfjordschmaltzy\", \".cfa 29801007 -\");\n  cfi.SetRegisterRule(\"uncopyrightables\", \"92642917 .cfa /\");\n  ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                            &caller_registers));\n  ASSERT_EQ(6U, caller_registers.size());\n  ASSERT_EQ(7664691U,           caller_registers[\".cfa\"]);\n  ASSERT_EQ(107469446U,         caller_registers[\".ra\"]);\n  ASSERT_EQ(416732599139967ULL, caller_registers[\"register1\"]);\n  ASSERT_EQ(31740999U,          caller_registers[\"vodkathumbscrewingly\"]);\n  ASSERT_EQ(-22136316ULL,       caller_registers[\"pubvexingfjordschmaltzy\"]);\n  ASSERT_EQ(12U,                caller_registers[\"uncopyrightables\"]);\n  ASSERT_EQ(\".cfa: $temp1 68737028 = $temp2 61072337 = $temp1 $temp2 - \"\n            \".ra: .cfa 99804755 + \"\n            \"pubvexingfjordschmaltzy: .cfa 29801007 - \"\n            \"register1: .cfa 54370437 * \"\n            \"uncopyrightables: 92642917 .cfa / \"\n            \"vodkathumbscrewingly: 24076308 .cfa +\",\n            cfi.Serialize());\n}\n\nTEST_F(Simple, RulesOverride) {\n  ExpectNoMemoryReferences();\n\n  cfi.SetCFARule(\"330903416631436410\");\n  cfi.SetRARule(\"5870666104170902211\");\n  cfi.SetCFARule(\"2828089117179001\");\n  ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                            &caller_registers));\n  ASSERT_EQ(2U, caller_registers.size());\n  ASSERT_EQ(2828089117179001ULL, caller_registers[\".cfa\"]);\n  ASSERT_EQ(5870666104170902211ULL, caller_registers[\".ra\"]);\n  ASSERT_EQ(\".cfa: 2828089117179001 .ra: 5870666104170902211\",\n            cfi.Serialize());\n}\n\nclass Scope: public CFIFixture, public Test { };\n\n// There should be no value for .cfa in scope when evaluating the CFA rule.\nTEST_F(Scope, CFALacksCFA) {\n  ExpectNoMemoryReferences();\n\n  cfi.SetCFARule(\".cfa\");\n  cfi.SetRARule(\"0\");\n  ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                             &caller_registers));\n}\n\n// There should be no value for .ra in scope when evaluating the CFA rule.\nTEST_F(Scope, CFALacksRA) {\n  ExpectNoMemoryReferences();\n\n  cfi.SetCFARule(\".ra\");\n  cfi.SetRARule(\"0\");\n  ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                             &caller_registers));\n}\n\n// The current frame's registers should be in scope when evaluating\n// the CFA rule.\nTEST_F(Scope, CFASeesCurrentRegs) {\n  ExpectNoMemoryReferences();\n\n  registers[\".baraminology\"] = 0x06a7bc63e4f13893ULL;\n  registers[\".ornithorhynchus\"] = 0x5e0bf850bafce9d2ULL;\n  cfi.SetCFARule(\".baraminology .ornithorhynchus +\");\n  cfi.SetRARule(\"0\");\n  ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                            &caller_registers));\n  ASSERT_EQ(2U, caller_registers.size());\n  ASSERT_EQ(0x06a7bc63e4f13893ULL + 0x5e0bf850bafce9d2ULL,\n            caller_registers[\".cfa\"]);\n}\n\n// .cfa should be in scope in the return address expression.\nTEST_F(Scope, RASeesCFA) {\n  ExpectNoMemoryReferences();\n\n  cfi.SetCFARule(\"48364076\");\n  cfi.SetRARule(\".cfa\");\n  ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                            &caller_registers));\n  ASSERT_EQ(2U, caller_registers.size());\n  ASSERT_EQ(48364076U, caller_registers[\".ra\"]);\n}\n\n// There should be no value for .ra in scope when evaluating the CFA rule.\nTEST_F(Scope, RALacksRA) {\n  ExpectNoMemoryReferences();\n\n  cfi.SetCFARule(\"0\");\n  cfi.SetRARule(\".ra\");\n  ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                             &caller_registers));\n}\n\n// The current frame's registers should be in scope in the return\n// address expression.\nTEST_F(Scope, RASeesCurrentRegs) {\n  ExpectNoMemoryReferences();\n\n  registers[\"noachian\"] = 0x54dc4a5d8e5eb503ULL;\n  cfi.SetCFARule(\"10359370\");\n  cfi.SetRARule(\"noachian\");\n  ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                            &caller_registers));\n  ASSERT_EQ(2U, caller_registers.size());\n  ASSERT_EQ(0x54dc4a5d8e5eb503ULL, caller_registers[\".ra\"]);\n}\n\n// .cfa should be in scope for register rules.\nTEST_F(Scope, RegistersSeeCFA) {\n  ExpectNoMemoryReferences();\n\n  cfi.SetCFARule(\"6515179\");\n  cfi.SetRARule(\".cfa\");\n  cfi.SetRegisterRule(\"rogerian\", \".cfa\");\n  ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                            &caller_registers));\n  ASSERT_EQ(3U, caller_registers.size());\n  ASSERT_EQ(6515179U, caller_registers[\"rogerian\"]);\n}\n\n// The return address should not be in scope for register rules.\nTEST_F(Scope, RegsLackRA) {\n  ExpectNoMemoryReferences();\n\n  cfi.SetCFARule(\"42740329\");\n  cfi.SetRARule(\"27045204\");\n  cfi.SetRegisterRule(\"$r1\", \".ra\");\n  ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                             &caller_registers));\n}\n\n// Register rules can see the current frame's register values.\nTEST_F(Scope, RegsSeeRegs) {\n  ExpectNoMemoryReferences();\n\n  registers[\"$r1\"] = 0x6ed3582c4bedb9adULL;\n  registers[\"$r2\"] = 0xd27d9e742b8df6d0ULL;\n  cfi.SetCFARule(\"88239303\");\n  cfi.SetRARule(\"30503835\");\n  cfi.SetRegisterRule(\"$r1\", \"$r1 42175211 = $r2\");\n  cfi.SetRegisterRule(\"$r2\", \"$r2 21357221 = $r1\");\n  ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                            &caller_registers));\n  ASSERT_EQ(4U, caller_registers.size());\n  ASSERT_EQ(0xd27d9e742b8df6d0ULL, caller_registers[\"$r1\"]);\n  ASSERT_EQ(0x6ed3582c4bedb9adULL, caller_registers[\"$r2\"]);\n}\n\n// Each rule's temporaries are separate.\nTEST_F(Scope, SeparateTempsRA) {\n  ExpectNoMemoryReferences();\n\n  cfi.SetCFARule(\"$temp1 76569129 = $temp1\");\n  cfi.SetRARule(\"0\");\n  ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                            &caller_registers));\n\n  cfi.SetCFARule(\"$temp1 76569129 = $temp1\");\n  cfi.SetRARule(\"$temp1\");\n  ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                             &caller_registers));\n}\n\nclass MockCFIRuleParserHandler: public CFIRuleParser::Handler {\n public:\n  MOCK_METHOD1(CFARule, void(const string &));\n  MOCK_METHOD1(RARule,  void(const string &));\n  MOCK_METHOD2(RegisterRule, void(const string &, const string &));\n};\n\n// A fixture class for testing CFIRuleParser.\nclass CFIParserFixture {\n public:\n  CFIParserFixture() : parser(&mock_handler) {\n    // Expect no parsing results to be reported to mock_handler. Individual\n    // tests can override this.\n    EXPECT_CALL(mock_handler, CFARule(_)).Times(0);\n    EXPECT_CALL(mock_handler, RARule(_)).Times(0);\n    EXPECT_CALL(mock_handler, RegisterRule(_, _)).Times(0);\n  }\n\n  MockCFIRuleParserHandler mock_handler;\n  CFIRuleParser parser;\n};\n\nclass Parser: public CFIParserFixture, public Test { };\n\nTEST_F(Parser, Empty) {\n  EXPECT_FALSE(parser.Parse(\"\"));\n}\n\nTEST_F(Parser, LoneColon) {\n  EXPECT_FALSE(parser.Parse(\":\"));\n}\n\nTEST_F(Parser, CFANoExpr) {\n  EXPECT_FALSE(parser.Parse(\".cfa:\"));\n}\n\nTEST_F(Parser, CFANoColonNoExpr) {\n  EXPECT_FALSE(parser.Parse(\".cfa\"));\n}\n\nTEST_F(Parser, RANoExpr) {\n  EXPECT_FALSE(parser.Parse(\".ra:\"));\n}\n\nTEST_F(Parser, RANoColonNoExpr) {\n  EXPECT_FALSE(parser.Parse(\".ra\"));\n}\n\nTEST_F(Parser, RegNoExpr) {\n  EXPECT_FALSE(parser.Parse(\"reg:\"));\n}\n\nTEST_F(Parser, NoName) {\n  EXPECT_FALSE(parser.Parse(\"expr\"));\n}\n\nTEST_F(Parser, NoNameTwo) {\n  EXPECT_FALSE(parser.Parse(\"expr1 expr2\"));\n}\n\nTEST_F(Parser, StartsWithExpr) {\n  EXPECT_FALSE(parser.Parse(\"expr1 reg: expr2\"));\n}\n\nTEST_F(Parser, CFA) {\n  EXPECT_CALL(mock_handler, CFARule(\"spleen\")).WillOnce(Return());\n  EXPECT_TRUE(parser.Parse(\".cfa: spleen\"));\n}\n\nTEST_F(Parser, RA) {\n  EXPECT_CALL(mock_handler, RARule(\"notoriety\")).WillOnce(Return());\n  EXPECT_TRUE(parser.Parse(\".ra: notoriety\"));\n}\n\nTEST_F(Parser, Reg) {\n  EXPECT_CALL(mock_handler, RegisterRule(\"nemo\", \"mellifluous\"))\n      .WillOnce(Return());\n  EXPECT_TRUE(parser.Parse(\"nemo: mellifluous\"));\n}\n\nTEST_F(Parser, CFARARegs) {\n  EXPECT_CALL(mock_handler, CFARule(\"cfa expression\")).WillOnce(Return());\n  EXPECT_CALL(mock_handler, RARule(\"ra expression\")).WillOnce(Return());\n  EXPECT_CALL(mock_handler, RegisterRule(\"galba\", \"praetorian\"))\n      .WillOnce(Return());\n  EXPECT_CALL(mock_handler, RegisterRule(\"otho\", \"vitellius\"))\n      .WillOnce(Return());\n  EXPECT_TRUE(parser.Parse(\".cfa: cfa expression .ra: ra expression \"\n                    \"galba: praetorian otho: vitellius\"));\n}\n\nTEST_F(Parser, Whitespace) {\n  EXPECT_CALL(mock_handler, RegisterRule(\"r1\", \"r1 expression\"))\n      .WillOnce(Return());\n  EXPECT_CALL(mock_handler, RegisterRule(\"r2\", \"r2 expression\"))\n      .WillOnce(Return());\n  EXPECT_TRUE(parser.Parse(\" r1:\\tr1\\nexpression \\tr2:\\t\\rr2\\r\\n \"\n                           \"expression  \\n\"));\n}\n\nTEST_F(Parser, WhitespaceLoneColon) {\n  EXPECT_FALSE(parser.Parse(\"  \\n:\\t  \"));\n}\n\nTEST_F(Parser, EmptyName) {\n  EXPECT_CALL(mock_handler, RegisterRule(\"reg\", _))\n      .Times(AtMost(1))\n      .WillRepeatedly(Return());\n  EXPECT_FALSE(parser.Parse(\"reg: expr1 : expr2\"));\n}\n\nTEST_F(Parser, RuleLoneColon) {\n  EXPECT_CALL(mock_handler, RegisterRule(\"r1\", \"expr\"))\n      .Times(AtMost(1))\n      .WillRepeatedly(Return());\n  EXPECT_FALSE(parser.Parse(\" r1:   expr   :\"));\n}\n\nTEST_F(Parser, RegNoExprRule) {\n  EXPECT_CALL(mock_handler, RegisterRule(\"r1\", \"expr\"))\n      .Times(AtMost(1))\n      .WillRepeatedly(Return());\n  EXPECT_FALSE(parser.Parse(\"r0: r1:   expr\"));\n}\n\nclass ParseHandlerFixture: public CFIFixture {\n public:\n  ParseHandlerFixture() : CFIFixture(), handler(&cfi) { }\n  CFIFrameInfoParseHandler handler;\n};\n\nclass ParseHandler: public ParseHandlerFixture, public Test { };\n\nTEST_F(ParseHandler, CFARARule) {\n  handler.CFARule(\"reg-for-cfa\");\n  handler.RARule(\"reg-for-ra\");\n  registers[\"reg-for-cfa\"] = 0x268a9a4a3821a797ULL;\n  registers[\"reg-for-ra\"] = 0x6301b475b8b91c02ULL;\n  ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                            &caller_registers));\n  ASSERT_EQ(0x268a9a4a3821a797ULL, caller_registers[\".cfa\"]);\n  ASSERT_EQ(0x6301b475b8b91c02ULL, caller_registers[\".ra\"]);\n}\n\nTEST_F(ParseHandler, RegisterRules) {\n  handler.CFARule(\"reg-for-cfa\");\n  handler.RARule(\"reg-for-ra\");\n  handler.RegisterRule(\"reg1\", \"reg-for-reg1\");\n  handler.RegisterRule(\"reg2\", \"reg-for-reg2\");\n  registers[\"reg-for-cfa\"] = 0x268a9a4a3821a797ULL;\n  registers[\"reg-for-ra\"] = 0x6301b475b8b91c02ULL;\n  registers[\"reg-for-reg1\"] = 0x06cde8e2ff062481ULL;\n  registers[\"reg-for-reg2\"] = 0xff0c4f76403173e2ULL;\n  ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,\n                                            &caller_registers));\n  ASSERT_EQ(0x268a9a4a3821a797ULL, caller_registers[\".cfa\"]);\n  ASSERT_EQ(0x6301b475b8b91c02ULL, caller_registers[\".ra\"]);\n  ASSERT_EQ(0x06cde8e2ff062481ULL, caller_registers[\"reg1\"]);\n  ASSERT_EQ(0xff0c4f76403173e2ULL, caller_registers[\"reg2\"]);\n}\n\nstruct SimpleCFIWalkerFixture {\n  struct RawContext {\n    u_int64_t r0, r1, r2, r3, r4, sp, pc;\n  };\n  enum Validity {\n    R0_VALID = 0x01,\n    R1_VALID = 0x02,\n    R2_VALID = 0x04,\n    R3_VALID = 0x08,\n    R4_VALID = 0x10,\n    SP_VALID = 0x20,\n    PC_VALID = 0x40\n  };\n  typedef SimpleCFIWalker<u_int64_t, RawContext> CFIWalker;\n\n  SimpleCFIWalkerFixture()\n      : walker(register_map,\n               sizeof(register_map) / sizeof(register_map[0])) { }\n\n  static CFIWalker::RegisterSet register_map[7];\n  CFIFrameInfo call_frame_info;\n  CFIWalker walker;\n  MockMemoryRegion memory;\n  RawContext callee_context, caller_context;\n};\n\nSimpleCFIWalkerFixture::CFIWalker::RegisterSet\nSimpleCFIWalkerFixture::register_map[7] = {\n  { \"r0\", NULL,   true,  R0_VALID, &RawContext::r0 },\n  { \"r1\", NULL,   true,  R1_VALID, &RawContext::r1 },\n  { \"r2\", NULL,   false, R2_VALID, &RawContext::r2 },\n  { \"r3\", NULL,   false, R3_VALID, &RawContext::r3 },\n  { \"r4\", NULL,   true,  R4_VALID, &RawContext::r4 },\n  { \"sp\", \".cfa\", true,  SP_VALID, &RawContext::sp },\n  { \"pc\", \".ra\",  true,  PC_VALID, &RawContext::pc },\n};\n\nclass SimpleWalker: public SimpleCFIWalkerFixture, public Test { };\n\nTEST_F(SimpleWalker, Walk) {\n  // Stack_top is the current stack pointer, pointing to the lowest\n  // address of a frame that looks like this (all 64-bit words):\n  //\n  // sp ->  saved r0\n  //        garbage\n  //        return address\n  // cfa -> \n  //\n  // r0 has been saved on the stack.\n  // r1 has been saved in r2.\n  // r2 and r3 are not recoverable.\n  // r4 is not recoverable, even though it is a callee-saves register.\n  //    Some earlier frame's unwinder must have failed to recover it.\n\n  u_int64_t stack_top = 0x83254944b20d5512ULL;\n\n  // Saved r0.\n  EXPECT_CALL(memory,\n              GetMemoryAtAddress(stack_top, A<u_int64_t *>()))\n      .WillRepeatedly(DoAll(SetArgumentPointee<1>(0xdc1975eba8602302ULL),\n                            Return(true)));\n  // Saved return address.\n  EXPECT_CALL(memory,\n              GetMemoryAtAddress(stack_top + 16, A<u_int64_t *>()))\n      .WillRepeatedly(DoAll(SetArgumentPointee<1>(0xba5ad6d9acce28deULL),\n                            Return(true)));\n\n  call_frame_info.SetCFARule(\"sp 24 +\");\n  call_frame_info.SetRARule(\".cfa 8 - ^\");\n  call_frame_info.SetRegisterRule(\"r0\", \".cfa 24 - ^\");\n  call_frame_info.SetRegisterRule(\"r1\", \"r2\");\n\n  callee_context.r0 = 0x94e030ca79edd119ULL;\n  callee_context.r1 = 0x937b4d7e95ce52d9ULL;\n  callee_context.r2 = 0x5fe0027416b8b62aULL; // caller's r1\n  // callee_context.r3 is not valid in callee.\n  // callee_context.r4 is not valid in callee.\n  callee_context.sp = stack_top;\n  callee_context.pc = 0x25b21b224311d280ULL;\n  int callee_validity = R0_VALID | R1_VALID | R2_VALID | SP_VALID | PC_VALID;\n\n  memset(&caller_context, 0, sizeof(caller_context));\n\n  int caller_validity;\n  EXPECT_TRUE(walker.FindCallerRegisters(memory, call_frame_info,\n                                         callee_context, callee_validity,\n                                         &caller_context, &caller_validity));\n  EXPECT_EQ(R0_VALID | R1_VALID | SP_VALID | PC_VALID, caller_validity);\n  EXPECT_EQ(0xdc1975eba8602302ULL, caller_context.r0);\n  EXPECT_EQ(0x5fe0027416b8b62aULL, caller_context.r1);\n  EXPECT_EQ(stack_top + 24,        caller_context.sp);\n  EXPECT_EQ(0xba5ad6d9acce28deULL, caller_context.pc);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/contained_range_map-inl.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// contained_range_map-inl.h: Hierarchically-organized range map implementation.\n//\n// See contained_range_map.h for documentation.\n//\n// Author: Mark Mentovai\n\n#ifndef PROCESSOR_CONTAINED_RANGE_MAP_INL_H__\n#define PROCESSOR_CONTAINED_RANGE_MAP_INL_H__\n\n#include \"processor/contained_range_map.h\"\n\n#include <assert.h>\n\n#include \"processor/logging.h\"\n\n\nnamespace google_breakpad {\n\n\ntemplate<typename AddressType, typename EntryType>\nContainedRangeMap<AddressType, EntryType>::~ContainedRangeMap() {\n  // Clear frees the children pointed to by the map, and frees the map itself.\n  Clear();\n}\n\n\ntemplate<typename AddressType, typename EntryType>\nbool ContainedRangeMap<AddressType, EntryType>::StoreRange(\n    const AddressType &base, const AddressType &size, const EntryType &entry) {\n  AddressType high = base + size - 1;\n\n  // Check for undersize or overflow.\n  if (size <= 0 || high < base) {\n    //TODO(nealsid) We are commenting this out in order to prevent\n    // excessive logging.  We plan to move to better logging as this\n    // failure happens quite often and is expected(see comment in\n    // basic_source_line_resolver.cc:671).\n    // BPLOG(INFO) << \"StoreRange failed, \" << HexString(base) << \"+\"\n    // << HexString(size) << \", \" << HexString(high);\n    return false;\n  }\n\n  if (!map_)\n    map_ = new AddressToRangeMap();\n\n  MapIterator iterator_base = map_->lower_bound(base);\n  MapIterator iterator_high = map_->lower_bound(high);\n  MapIterator iterator_end = map_->end();\n\n  if (iterator_base == iterator_high && iterator_base != iterator_end &&\n      base >= iterator_base->second->base_) {\n    // The new range is entirely within an existing child range.\n\n    // If the new range's geometry is exactly equal to an existing child\n    // range's, it violates the containment rules, and an attempt to store\n    // it must fail.  iterator_base->first contains the key, which was the\n    // containing child's high address.\n    if (iterator_base->second->base_ == base && iterator_base->first == high) {\n      // TODO(nealsid): See the TODO above on why this is commented out.\n//       BPLOG(INFO) << \"StoreRange failed, identical range is already \"\n//                      \"present: \" << HexString(base) << \"+\" << HexString(size);\n      return false;\n    }\n\n    // Pass the new range on to the child to attempt to store.\n    return iterator_base->second->StoreRange(base, size, entry);\n  }\n\n  // iterator_high might refer to an irrelevant range: one whose base address\n  // is higher than the new range's high address.  Set contains_high to true\n  // only if iterator_high refers to a range that is at least partially\n  // within the new range.\n  bool contains_high = iterator_high != iterator_end &&\n                       high >= iterator_high->second->base_;\n\n  // If the new range encompasses any existing child ranges, it must do so\n  // fully.  Partial containment isn't allowed.\n  if ((iterator_base != iterator_end && base > iterator_base->second->base_) ||\n      (contains_high && high < iterator_high->first)) {\n    // TODO(mmentovai): Some symbol files will trip this check frequently\n    // on STACK lines.  Too many messages will be produced.  These are more\n    // suitable for a DEBUG channel than an INFO channel.\n    // BPLOG(INFO) << \"StoreRange failed, new range partially contains \"\n    //               \"existing range: \" << HexString(base) << \"+\" <<\n    //               HexString(size);\n    return false;\n  }\n\n  // When copying and erasing contained ranges, the \"end\" iterator needs to\n  // point one past the last item of the range to copy.  If contains_high is\n  // false, the iterator's already in the right place; the increment is safe\n  // because contains_high can't be true if iterator_high == iterator_end.\n  if (contains_high)\n    ++iterator_high;\n\n  // Optimization: if the iterators are equal, no child ranges would be\n  // moved.  Create the new child range with a NULL map to conserve space\n  // in leaf nodes, of which there will be many.\n  AddressToRangeMap *child_map = NULL;\n\n  if (iterator_base != iterator_high) {\n    // The children of this range that are contained by the new range must\n    // be transferred over to the new range.  Create the new child range map\n    // and copy the pointers to range maps it should contain into it.\n    child_map = new AddressToRangeMap(iterator_base, iterator_high);\n\n    // Remove the copied child pointers from this range's map of children.\n    map_->erase(iterator_base, iterator_high);\n  }\n\n  // Store the new range in the map by its high address.  Any children that\n  // the new child range contains were formerly children of this range but\n  // are now this range's grandchildren.  Ownership of these is transferred\n  // to the new child range.\n  map_->insert(MapValue(high,\n                        new ContainedRangeMap(base, entry, child_map)));\n  return true;\n}\n\n\ntemplate<typename AddressType, typename EntryType>\nbool ContainedRangeMap<AddressType, EntryType>::RetrieveRange(\n    const AddressType &address, EntryType *entry) const {\n  BPLOG_IF(ERROR, !entry) << \"ContainedRangeMap::RetrieveRange requires \"\n                             \"|entry|\";\n  assert(entry);\n\n  // If nothing was ever stored, then there's nothing to retrieve.\n  if (!map_)\n    return false;\n\n  // Get an iterator to the child range whose high address is equal to or\n  // greater than the supplied address.  If the supplied address is higher\n  // than all of the high addresses in the range, then this range does not\n  // contain a child at address, so return false.  If the supplied address\n  // is lower than the base address of the child range, then it is not within\n  // the child range, so return false.\n  MapConstIterator iterator = map_->lower_bound(address);\n  if (iterator == map_->end() || address < iterator->second->base_)\n    return false;\n\n  // The child in iterator->second contains the specified address.  Find out\n  // if it has a more-specific descendant that also contains it.  If it does,\n  // it will set |entry| appropriately.  If not, set |entry| to the child.\n  if (!iterator->second->RetrieveRange(address, entry))\n    *entry = iterator->second->entry_;\n\n  return true;\n}\n\n\ntemplate<typename AddressType, typename EntryType>\nvoid ContainedRangeMap<AddressType, EntryType>::Clear() {\n  if (map_) {\n    MapConstIterator end = map_->end();\n    for (MapConstIterator child = map_->begin(); child != end; ++child)\n      delete child->second;\n\n    delete map_;\n    map_ = NULL;\n  }\n}\n\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_CONTAINED_RANGE_MAP_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/contained_range_map.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// contained_range_map.h: Hierarchically-organized range maps.\n//\n// A contained range map is similar to a standard range map, except it allows\n// objects to be organized hierarchically.  A contained range map allows\n// objects to contain other objects.  It is not sensitive to the order that\n// objects are added to the map: larger, more general, containing objects\n// may be added either before or after smaller, more specific, contained\n// ones.\n//\n// Contained range maps guarantee that each object may only contain smaller\n// objects than itself, and that a parent object may only contain child\n// objects located entirely within the parent's address space.  Attempts\n// to introduce objects (via StoreRange) that violate these rules will fail.\n// Retrieval (via RetrieveRange) always returns the most specific (smallest)\n// object that contains the address being queried.  Note that while it is\n// not possible to insert two objects into a map that have exactly the same\n// geometry (base address and size), it is possible to completely mask a\n// larger object by inserting smaller objects that entirely fill the larger\n// object's address space.\n//\n// Internally, contained range maps are implemented as a tree.  Each tree\n// node except for the root node describes an object in the map.  Each node\n// maintains its list of children in a map similar to a standard range map,\n// keyed by the highest address that each child occupies.  Each node's\n// children occupy address ranges entirely within the node.  The root node\n// is the only node directly accessible to the user, and represents the\n// entire address space.\n//\n// Author: Mark Mentovai\n\n#ifndef PROCESSOR_CONTAINED_RANGE_MAP_H__\n#define PROCESSOR_CONTAINED_RANGE_MAP_H__\n\n\n#include <map>\n\n\nnamespace google_breakpad {\n\n// Forward declarations (for later friend declarations of specialized template).\ntemplate<class, class> class ContainedRangeMapSerializer;\n\ntemplate<typename AddressType, typename EntryType>\nclass ContainedRangeMap {\n public:\n  // The default constructor creates a ContainedRangeMap with no geometry\n  // and no entry, and as such is only suitable for the root node of a\n  // ContainedRangeMap tree.\n  ContainedRangeMap() : base_(), entry_(), map_(NULL) {}\n\n  ~ContainedRangeMap();\n\n  // Inserts a range into the map.  If the new range is encompassed by\n  // an existing child range, the new range is passed into the child range's\n  // StoreRange method.  If the new range encompasses any existing child\n  // ranges, those child ranges are moved to the new range, becoming\n  // grandchildren of this ContainedRangeMap.  Returns false for a\n  // parameter error, or if the ContainedRangeMap hierarchy guarantees\n  // would be violated.\n  bool StoreRange(const AddressType &base,\n                  const AddressType &size,\n                  const EntryType &entry);\n\n  // Retrieves the most specific (smallest) descendant range encompassing\n  // the specified address.  This method will only return entries held by\n  // child ranges, and not the entry contained by |this|.  This is necessary\n  // to support a sparsely-populated root range.  If no descendant range\n  // encompasses the address, returns false.\n  bool RetrieveRange(const AddressType &address, EntryType *entry) const;\n\n  // Removes all children.  Note that Clear only removes descendants,\n  // leaving the node on which it is called intact.  Because the only\n  // meaningful things contained by a root node are descendants, this\n  // is sufficient to restore an entire ContainedRangeMap to its initial\n  // empty state when called on the root node.\n  void Clear();\n\n private:\n  friend class ContainedRangeMapSerializer<AddressType, EntryType>;\n  friend class ModuleComparer;\n\n  // AddressToRangeMap stores pointers.  This makes reparenting simpler in\n  // StoreRange, because it doesn't need to copy entire objects.\n  typedef std::map<AddressType, ContainedRangeMap *> AddressToRangeMap;\n  typedef typename AddressToRangeMap::const_iterator MapConstIterator;\n  typedef typename AddressToRangeMap::iterator MapIterator;\n  typedef typename AddressToRangeMap::value_type MapValue;\n\n  // Creates a new ContainedRangeMap with the specified base address, entry,\n  // and initial child map, which may be NULL.  This is only used internally\n  // by ContainedRangeMap when it creates a new child.\n  ContainedRangeMap(const AddressType &base, const EntryType &entry,\n                    AddressToRangeMap *map)\n      : base_(base), entry_(entry), map_(map) {}\n\n  // The base address of this range.  The high address does not need to\n  // be stored, because it is used as the key to an object in its parent's\n  // map, and all ContainedRangeMaps except for the root range are contained\n  // within maps.  The root range does not actually contain an entry, so its\n  // base_ field is meaningless, and the fact that it has no parent and thus\n  // no key is unimportant.  For this reason, the base_ field should only be\n  // is accessed on child ContainedRangeMap objects, and never on |this|.\n  const AddressType base_;\n\n  // The entry corresponding to this range.  The root range does not\n  // actually contain an entry, so its entry_ field is meaningless.  For\n  // this reason, the entry_ field should only be accessed on child\n  // ContainedRangeMap objects, and never on |this|.\n  const EntryType entry_;\n\n  // The map containing child ranges, keyed by each child range's high\n  // address.  This is a pointer to avoid allocating map structures for\n  // leaf nodes, where they are not needed.\n  AddressToRangeMap *map_;\n};\n\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_CONTAINED_RANGE_MAP_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/contained_range_map_unittest.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// contained_range_map_unittest.cc: Unit tests for ContainedRangeMap\n//\n// Author: Mark Mentovai\n\n#include <stdio.h>\n\n#include \"processor/contained_range_map-inl.h\"\n\n#include \"processor/logging.h\"\n\n\n#define ASSERT_TRUE(condition) \\\n  if (!(condition)) { \\\n    fprintf(stderr, \"FAIL: %s @ %s:%d\\n\", #condition, __FILE__, __LINE__); \\\n    return false; \\\n  }\n\n#define ASSERT_FALSE(condition) ASSERT_TRUE(!(condition))\n\n\nnamespace {\n\n\nusing google_breakpad::ContainedRangeMap;\n\n\nstatic bool RunTests() {\n  ContainedRangeMap<unsigned int, int> crm;\n\n  // First, do the StoreRange tests.  This validates the containment\n  // rules.\n  ASSERT_TRUE (crm.StoreRange(10, 10,  1));\n  ASSERT_FALSE(crm.StoreRange(10, 10,  2));  // exactly equal to 1\n  ASSERT_FALSE(crm.StoreRange(11, 10,  3));  // begins inside 1 and extends up\n  ASSERT_FALSE(crm.StoreRange( 9, 10,  4));  // begins below 1 and ends inside\n  ASSERT_TRUE (crm.StoreRange(11,  9,  5));  // contained by existing\n  ASSERT_TRUE (crm.StoreRange(12,  7,  6));\n  ASSERT_TRUE (crm.StoreRange( 9, 12,  7));  // contains existing\n  ASSERT_TRUE (crm.StoreRange( 9, 13,  8));\n  ASSERT_TRUE (crm.StoreRange( 8, 14,  9));\n  ASSERT_TRUE (crm.StoreRange(30,  3, 10));\n  ASSERT_TRUE (crm.StoreRange(33,  3, 11));\n  ASSERT_TRUE (crm.StoreRange(30,  6, 12));  // storable but totally masked\n  ASSERT_TRUE (crm.StoreRange(40,  8, 13));  // will be totally masked\n  ASSERT_TRUE (crm.StoreRange(40,  4, 14));\n  ASSERT_TRUE (crm.StoreRange(44,  4, 15));\n  ASSERT_FALSE(crm.StoreRange(32, 10, 16));  // begins in #10, ends in #14\n  ASSERT_FALSE(crm.StoreRange(50,  0, 17));  // zero length\n  ASSERT_TRUE (crm.StoreRange(50, 10, 18));\n  ASSERT_TRUE (crm.StoreRange(50,  1, 19));\n  ASSERT_TRUE (crm.StoreRange(59,  1, 20));\n  ASSERT_TRUE (crm.StoreRange(60,  1, 21));\n  ASSERT_TRUE (crm.StoreRange(69,  1, 22));\n  ASSERT_TRUE (crm.StoreRange(60, 10, 23));\n  ASSERT_TRUE (crm.StoreRange(68,  1, 24));\n  ASSERT_TRUE (crm.StoreRange(61,  1, 25));\n  ASSERT_TRUE (crm.StoreRange(61,  8, 26));\n  ASSERT_FALSE(crm.StoreRange(59,  9, 27));\n  ASSERT_FALSE(crm.StoreRange(59, 10, 28));\n  ASSERT_FALSE(crm.StoreRange(59, 11, 29));\n  ASSERT_TRUE (crm.StoreRange(70, 10, 30));\n  ASSERT_TRUE (crm.StoreRange(74,  2, 31));\n  ASSERT_TRUE (crm.StoreRange(77,  2, 32));\n  ASSERT_FALSE(crm.StoreRange(72,  6, 33));\n  ASSERT_TRUE (crm.StoreRange(80,  3, 34));\n  ASSERT_TRUE (crm.StoreRange(81,  1, 35));\n  ASSERT_TRUE (crm.StoreRange(82,  1, 36));\n  ASSERT_TRUE (crm.StoreRange(83,  3, 37));\n  ASSERT_TRUE (crm.StoreRange(84,  1, 38));\n  ASSERT_TRUE (crm.StoreRange(83,  1, 39));\n  ASSERT_TRUE (crm.StoreRange(86,  5, 40));\n  ASSERT_TRUE (crm.StoreRange(88,  1, 41));\n  ASSERT_TRUE (crm.StoreRange(90,  1, 42));\n  ASSERT_TRUE (crm.StoreRange(86,  1, 43));\n  ASSERT_TRUE (crm.StoreRange(87,  1, 44));\n  ASSERT_TRUE (crm.StoreRange(89,  1, 45));\n  ASSERT_TRUE (crm.StoreRange(87,  4, 46));\n  ASSERT_TRUE (crm.StoreRange(87,  3, 47));\n  ASSERT_FALSE(crm.StoreRange(86,  2, 48));\n\n  // Each element in test_data contains the expected result when calling\n  // RetrieveRange on an address.\n  const int test_data[] = {\n    0,   // 0\n    0,   // 1\n    0,   // 2\n    0,   // 3\n    0,   // 4\n    0,   // 5\n    0,   // 6\n    0,   // 7\n    9,   // 8\n    7,   // 9\n    1,   // 10\n    5,   // 11\n    6,   // 12\n    6,   // 13\n    6,   // 14\n    6,   // 15\n    6,   // 16\n    6,   // 17\n    6,   // 18\n    5,   // 19\n    7,   // 20\n    8,   // 21\n    0,   // 22\n    0,   // 23\n    0,   // 24\n    0,   // 25\n    0,   // 26\n    0,   // 27\n    0,   // 28\n    0,   // 29\n    10,  // 30\n    10,  // 31\n    10,  // 32\n    11,  // 33\n    11,  // 34\n    11,  // 35\n    0,   // 36\n    0,   // 37\n    0,   // 38\n    0,   // 39\n    14,  // 40\n    14,  // 41\n    14,  // 42\n    14,  // 43\n    15,  // 44\n    15,  // 45\n    15,  // 46\n    15,  // 47\n    0,   // 48\n    0,   // 49\n    19,  // 50\n    18,  // 51\n    18,  // 52\n    18,  // 53\n    18,  // 54\n    18,  // 55\n    18,  // 56\n    18,  // 57\n    18,  // 58\n    20,  // 59\n    21,  // 60\n    25,  // 61\n    26,  // 62\n    26,  // 63\n    26,  // 64\n    26,  // 65\n    26,  // 66\n    26,  // 67\n    24,  // 68\n    22,  // 69\n    30,  // 70\n    30,  // 71\n    30,  // 72\n    30,  // 73\n    31,  // 74\n    31,  // 75\n    30,  // 76\n    32,  // 77\n    32,  // 78\n    30,  // 79\n    34,  // 80\n    35,  // 81\n    36,  // 82\n    39,  // 83\n    38,  // 84\n    37,  // 85\n    43,  // 86\n    44,  // 87\n    41,  // 88\n    45,  // 89\n    42,  // 90\n    0,   // 91\n    0,   // 92\n    0,   // 93\n    0,   // 94\n    0,   // 95\n    0,   // 96\n    0,   // 97\n    0,   // 98\n    0    // 99\n  };\n  unsigned int test_high = sizeof(test_data) / sizeof(int);\n\n  // Now, do the RetrieveRange tests.  This further validates that the\n  // objects were stored properly and that retrieval returns the correct\n  // object.\n  // If GENERATE_TEST_DATA is defined, instead of the retrieval tests, a\n  // new test_data array will be printed.  Exercise caution when doing this.\n  // Be sure to verify the results manually!\n#ifdef GENERATE_TEST_DATA\n  printf(\"  const int test_data[] = {\\n\");\n#endif  // GENERATE_TEST_DATA\n\n  for (unsigned int address = 0; address < test_high; ++address) {\n    int value;\n    if (!crm.RetrieveRange(address, &value))\n      value = 0;\n\n#ifndef GENERATE_TEST_DATA\n    // Don't use ASSERT inside the loop because it won't show the failed\n    // |address|, and the line number will always be the same.  That makes\n    // it difficult to figure out which test failed.\n    if (value != test_data[address]) {\n      fprintf(stderr, \"FAIL: retrieve %d expected %d observed %d @ %s:%d\\n\",\n              address, test_data[address], value, __FILE__, __LINE__);\n      return false;\n    }\n#else  // !GENERATE_TEST_DATA\n    printf(\"    %d%c%s  // %d\\n\", value,\n                                  address == test_high - 1 ? ' ' : ',',\n                                  value < 10 ? \" \" : \"\",\n                                  address);\n#endif  // !GENERATE_TEST_DATA\n  }\n\n#ifdef GENERATE_TEST_DATA\n  printf(\"  };\\n\");\n#endif  // GENERATE_TEST_DATA\n\n  return true;\n}\n\n\n}  // namespace\n\n\nint main(int argc, char **argv) {\n  BPLOG_INIT(&argc, &argv);\n\n  return RunTests() ? 0 : 1;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/disassembler_x86.cc",
    "content": "// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// disassembler_x86.cc: simple x86 disassembler.\n//\n// Provides single step disassembly of x86 bytecode and flags instructions\n// that utilize known bad register values.\n//\n// Author: Cris Neckar\n\n#include \"processor/disassembler_x86.h\"\n\n#include <string.h>\n#include <unistd.h>\n\nnamespace google_breakpad {\n\nDisassemblerX86::DisassemblerX86(const u_int8_t *bytecode,\n                                 u_int32_t size,\n                                 u_int32_t virtual_address) :\n                                     bytecode_(bytecode),\n                                     size_(size),\n                                     virtual_address_(virtual_address),\n                                     current_byte_offset_(0),\n                                     current_inst_offset_(0),\n                                     instr_valid_(false),\n                                     register_valid_(false),\n                                     pushed_bad_value_(false),\n                                     end_of_block_(false),\n                                     flags_(0) {\n  libdis::x86_init(libdis::opt_none, NULL, NULL);\n}\n\nDisassemblerX86::~DisassemblerX86() {\n  if (instr_valid_)\n    libdis::x86_oplist_free(&current_instr_);\n\n  libdis::x86_cleanup();\n}\n\nu_int32_t DisassemblerX86::NextInstruction() {\n  if (instr_valid_)\n    libdis::x86_oplist_free(&current_instr_);\n\n  if (current_byte_offset_ >= size_) {\n    instr_valid_ = false;\n    return 0;\n  }\n  u_int32_t instr_size = 0;\n  instr_size = libdis::x86_disasm((unsigned char *)bytecode_, size_,\n                          virtual_address_, current_byte_offset_,\n                          &current_instr_);\n  if (instr_size == 0) {\n    instr_valid_ = false;\n    return 0;\n  }\n\n  current_byte_offset_ += instr_size;\n  current_inst_offset_++;\n  instr_valid_ = libdis::x86_insn_is_valid(&current_instr_);\n  if (!instr_valid_)\n    return 0;\n\n  if (current_instr_.type == libdis::insn_return)\n    end_of_block_ = true;\n  libdis::x86_op_t *src = libdis::x86_get_src_operand(&current_instr_);\n  libdis::x86_op_t *dest = libdis::x86_get_dest_operand(&current_instr_);\n\n  if (register_valid_) {\n    switch (current_instr_.group) {\n      // Flag branches based off of bad registers and calls that occur\n      // after pushing bad values.\n      case libdis::insn_controlflow:\n        switch (current_instr_.type) {\n          case libdis::insn_jmp:\n          case libdis::insn_jcc:\n          case libdis::insn_call:\n          case libdis::insn_callcc:\n            if (dest) {\n              switch (dest->type) {\n                case libdis::op_expression:\n                  if (dest->data.expression.base.id == bad_register_.id)\n                    flags_ |= DISX86_BAD_BRANCH_TARGET;\n                  break;\n                case libdis::op_register:\n                  if (dest->data.reg.id == bad_register_.id)\n                    flags_ |= DISX86_BAD_BRANCH_TARGET;\n                  break;\n                default:\n                  if (pushed_bad_value_ &&\n                      (current_instr_.type == libdis::insn_call ||\n                      current_instr_.type == libdis::insn_callcc))\n                    flags_ |= DISX86_BAD_ARGUMENT_PASSED;\n                  break;\n              }\n            }\n            break;\n          default:\n            break;\n        }\n        break;\n\n      // Flag block data operations that use bad registers for src or dest.\n      case libdis::insn_string:\n        if (dest && dest->type == libdis::op_expression &&\n            dest->data.expression.base.id == bad_register_.id)\n          flags_ |= DISX86_BAD_BLOCK_WRITE;\n        if (src && src->type == libdis::op_expression &&\n            src->data.expression.base.id == bad_register_.id)\n          flags_ |= DISX86_BAD_BLOCK_READ;\n        break;\n\n      // Flag comparisons based on bad data.\n      case libdis::insn_comparison:\n        if ((dest && dest->type == libdis::op_expression &&\n            dest->data.expression.base.id == bad_register_.id) ||\n            (src && src->type == libdis::op_expression &&\n            src->data.expression.base.id == bad_register_.id) ||\n            (dest && dest->type == libdis::op_register &&\n            dest->data.reg.id == bad_register_.id) ||\n            (src && src->type == libdis::op_register &&\n            src->data.reg.id == bad_register_.id))\n          flags_ |= DISX86_BAD_COMPARISON;\n        break;\n\n      // Flag any other instruction which derefs a bad register for\n      // src or dest.\n      default:\n        if (dest && dest->type == libdis::op_expression &&\n            dest->data.expression.base.id == bad_register_.id)\n          flags_ |= DISX86_BAD_WRITE;\n        if (src && src->type == libdis::op_expression &&\n            src->data.expression.base.id == bad_register_.id)\n          flags_ |= DISX86_BAD_READ;\n        break;\n    }\n  }\n\n  // When a register is marked as tainted check if it is pushed.\n  // TODO(cdn): may also want to check for MOVs into EBP offsets.\n  if (register_valid_ && dest && current_instr_.type == libdis::insn_push) {\n    switch (dest->type) {\n      case libdis::op_expression:\n        if (dest->data.expression.base.id == bad_register_.id ||\n            dest->data.expression.index.id == bad_register_.id)\n          pushed_bad_value_ = true;\n        break;\n      case libdis::op_register:\n        if (dest->data.reg.id == bad_register_.id)\n          pushed_bad_value_ = true;\n        break;\n      default:\n        break;\n    }\n  }\n\n  // Check if a tainted register value is clobbered.\n  // For conditional MOVs and XCHGs assume that\n  // there is a hit.\n  if (register_valid_) {\n    switch (current_instr_.type) {\n      case libdis::insn_xor:\n        if (src && src->type == libdis::op_register &&\n            dest && dest->type == libdis::op_register &&\n            src->data.reg.id == bad_register_.id &&\n            src->data.reg.id == dest->data.reg.id)\n          register_valid_ = false;\n        break;\n      case libdis::insn_pop:\n      case libdis::insn_mov:\n      case libdis::insn_movcc:\n        if (dest && dest->type == libdis::op_register &&\n            dest->data.reg.id == bad_register_.id)\n          register_valid_ = false;\n        break;\n      case libdis::insn_popregs:\n        register_valid_ = false;\n        break;\n      case libdis::insn_xchg:\n      case libdis::insn_xchgcc:\n        if (dest && dest->type == libdis::op_register &&\n            src && src->type == libdis::op_register) {\n          if (dest->data.reg.id == bad_register_.id)\n            memcpy(&bad_register_, &src->data.reg, sizeof(libdis::x86_reg_t));\n          else if (src->data.reg.id == bad_register_.id)\n            memcpy(&bad_register_, &dest->data.reg, sizeof(libdis::x86_reg_t));\n        }\n        break;\n      default:\n        break;\n    }\n  }\n\n  return instr_size;\n}\n\nbool DisassemblerX86::setBadRead() {\n  if (!instr_valid_)\n    return false;\n\n  libdis::x86_op_t *operand = libdis::x86_get_src_operand(&current_instr_);\n  if (!operand || operand->type != libdis::op_expression)\n    return false;\n\n  memcpy(&bad_register_, &operand->data.expression.base,\n         sizeof(libdis::x86_reg_t));\n  register_valid_ = true;\n  return true;\n}\n\nbool DisassemblerX86::setBadWrite() {\n  if (!instr_valid_)\n    return false;\n\n  libdis::x86_op_t *operand = libdis::x86_get_dest_operand(&current_instr_);\n  if (!operand || operand->type != libdis::op_expression)\n    return false;\n\n  memcpy(&bad_register_, &operand->data.expression.base,\n         sizeof(libdis::x86_reg_t));\n  register_valid_ = true;\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/disassembler_x86.h",
    "content": "// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// disassembler_x86.h: Basic x86 bytecode disassembler\n//\n// Provides a simple disassembler which wraps libdisasm. This allows simple\n// tests to be run against bytecode to test for various properties.\n//\n// Author: Cris Neckar\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_DISASSEMBLER_X86_H_\n#define GOOGLE_BREAKPAD_PROCESSOR_DISASSEMBLER_X86_H_\n\n#include <stddef.h>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\nnamespace libdis {\n#include \"third_party/libdisasm/libdis.h\"\n}\n\nnamespace google_breakpad {\n\nenum {\n  DISX86_NONE =                 0x0,\n  DISX86_BAD_BRANCH_TARGET =    0x1,\n  DISX86_BAD_ARGUMENT_PASSED =  0x2,\n  DISX86_BAD_WRITE =            0x4,\n  DISX86_BAD_BLOCK_WRITE =      0x8,\n  DISX86_BAD_READ =             0x10,\n  DISX86_BAD_BLOCK_READ =       0x20,\n  DISX86_BAD_COMPARISON =       0x40\n};\n\nclass DisassemblerX86 {\n  public:\n    // TODO(cdn): Modify this class to take a MemoryRegion instead of just\n    // a raw buffer. This will make it easier to use this on arbitrary\n    // minidumps without first copying out the code segment.\n    DisassemblerX86(const u_int8_t *bytecode, u_int32_t, u_int32_t);\n    ~DisassemblerX86();\n\n    // This walks to the next instruction in the memory region and\n    // sets flags based on the type of instruction and previous state\n    // including any registers marked as bad through setBadRead()\n    // or setBadWrite(). This method can be called in a loop to\n    // disassemble until the end of a region.\n    u_int32_t NextInstruction();\n\n    // Indicates whether the current disassembled instruction was valid.\n    bool currentInstructionValid() { return instr_valid_; }\n\n    // Returns the current instruction as defined in libdis.h,\n    // or NULL if the current instruction is not valid.\n    const libdis::x86_insn_t* currentInstruction() {\n      return instr_valid_ ? &current_instr_ : NULL;\n    }\n\n    // Returns the type of the current instruction as defined in libdis.h.\n    libdis::x86_insn_group currentInstructionGroup() {\n      return current_instr_.group;\n    }\n\n    // Indicates whether a return instruction has been encountered.\n    bool endOfBlock() { return end_of_block_; }\n\n    // The flags set so far for the disassembly.\n    u_int16_t flags() { return flags_; }\n\n    // This sets an indicator that the register used to determine\n    // src or dest for the current instruction is tainted. These can\n    // be used after examining the current instruction to indicate,\n    // for example that a bad read or write occurred and the pointer\n    // stored in the register is currently invalid.\n    bool setBadRead();\n    bool setBadWrite();\n\n  protected:\n    const u_int8_t *bytecode_;\n    u_int32_t size_;\n    u_int32_t virtual_address_;\n    u_int32_t current_byte_offset_;\n    u_int32_t current_inst_offset_;\n\n    bool instr_valid_;\n    libdis::x86_insn_t current_instr_;\n\n    // TODO(cdn): Maybe also track an expression's index register.\n    // ex: mov eax, [ebx + ecx]; ebx is base, ecx is index.\n    bool register_valid_;\n    libdis::x86_reg_t bad_register_;\n\n    bool pushed_bad_value_;\n    bool end_of_block_;\n\n    u_int16_t flags_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_DISASSEMBLER_X86_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/disassembler_x86_unittest.cc",
    "content": "// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <unistd.h>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"processor/disassembler_x86.h\"\n#include \"third_party/libdisasm/libdis.h\"\n\nnamespace {\n\nusing google_breakpad::DisassemblerX86;\n\nunsigned char just_return[] = \"\\xc3\";  // retn\n\nunsigned char invalid_instruction[] = \"\\x00\";  // invalid\n\nunsigned char read_eax_jmp_eax[] =\n    \"\\x8b\\x18\"                  // mov ebx, [eax];\n    \"\\x33\\xc9\"                  // xor ebx, ebx;\n    \"\\xff\\x20\"                  // jmp eax;\n    \"\\xc3\";                     // retn;\n\nunsigned char write_eax_arg_to_call[] =\n    \"\\x89\\xa8\\x00\\x02\\x00\\x00\"  // mov [eax+200], ebp;\n    \"\\xc1\\xeb\\x02\"              // shr ebx, 2;\n    \"\\x50\"                      // push eax;\n    \"\\xe8\\xd1\\x24\\x77\\x88\"      // call something;\n    \"\\xc3\";                     // retn;\n\nunsigned char read_edi_stosb[] =\n    \"\\x8b\\x07\"                  // mov eax, [edi];\n    \"\\x8b\\xc8\"                  // mov ecx, eax;\n    \"\\xf3\\xaa\"                  // rep stosb;\n    \"\\xc3\";                     // retn;\n\nunsigned char read_clobber_write[] =\n    \"\\x03\\x18\"                  // add ebx, [eax];\n    \"\\x8b\\xc1\"                  // mov eax, ecx;\n    \"\\x89\\x10\"                  // mov [eax], edx;\n    \"\\xc3\";                     // retn;\n\nunsigned char read_xchg_write[] =\n    \"\\x03\\x18\"                  // add ebx, [eax];\n    \"\\x91\"                      // xchg eax, ecx;\n    \"\\x89\\x18\"                  // mov [eax], ebx;\n    \"\\x89\\x11\"                  // mov [ecx], edx;\n    \"\\xc3\";                     // retn;\n\nunsigned char read_cmp[] =\n    \"\\x03\\x18\"                  // add ebx, [eax];\n    \"\\x83\\xf8\\x00\"              // cmp eax, 0;\n    \"\\x74\\x04\"                  // je +4;\n    \"\\xc3\";                     // retn;\n\nTEST(DisassemblerX86Test, SimpleReturnInstruction) {\n  DisassemblerX86 dis(just_return, sizeof(just_return)-1, 0);\n  EXPECT_EQ(1, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(true, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_controlflow, dis.currentInstructionGroup());\n  const libdis::x86_insn_t* instruction = dis.currentInstruction();\n  EXPECT_EQ(libdis::insn_controlflow, instruction->group);\n  EXPECT_EQ(libdis::insn_return, instruction->type);\n  EXPECT_EQ(0, dis.NextInstruction());\n  EXPECT_EQ(false, dis.currentInstructionValid());\n  EXPECT_EQ(NULL, dis.currentInstruction());\n}\n\nTEST(DisassemblerX86Test, SimpleInvalidInstruction) {\n  DisassemblerX86 dis(invalid_instruction, sizeof(invalid_instruction)-1, 0);\n  EXPECT_EQ(0, dis.NextInstruction());\n  EXPECT_EQ(false, dis.currentInstructionValid());\n}\n\nTEST(DisassemblerX86Test, BadReadLeadsToBranch) {\n  DisassemblerX86 dis(read_eax_jmp_eax, sizeof(read_eax_jmp_eax)-1, 0);\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());\n  EXPECT_EQ(true, dis.setBadRead());\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_logic, dis.currentInstructionGroup());\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(google_breakpad::DISX86_BAD_BRANCH_TARGET, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_controlflow, dis.currentInstructionGroup());\n}\n\nTEST(DisassemblerX86Test, BadWriteLeadsToPushedArg) {\n  DisassemblerX86 dis(write_eax_arg_to_call,\n                      sizeof(write_eax_arg_to_call)-1, 0);\n  EXPECT_EQ(6, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());\n  EXPECT_EQ(true, dis.setBadWrite());\n  EXPECT_EQ(3, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_arithmetic, dis.currentInstructionGroup());\n  EXPECT_EQ(1, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(5, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(google_breakpad::DISX86_BAD_ARGUMENT_PASSED, dis.flags());\n  EXPECT_EQ(libdis::insn_controlflow, dis.currentInstructionGroup());\n  EXPECT_EQ(false, dis.endOfBlock());\n}\n\n\nTEST(DisassemblerX86Test, BadReadLeadsToBlockWrite) {\n  DisassemblerX86 dis(read_edi_stosb, sizeof(read_edi_stosb)-1, 0);\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());\n  EXPECT_EQ(true, dis.setBadRead());\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(google_breakpad::DISX86_BAD_BLOCK_WRITE, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_string, dis.currentInstructionGroup());\n}\n\nTEST(DisassemblerX86Test, BadReadClobberThenWrite) {\n  DisassemblerX86 dis(read_clobber_write, sizeof(read_clobber_write)-1, 0);\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_arithmetic, dis.currentInstructionGroup());\n  EXPECT_EQ(true, dis.setBadRead());\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());\n}\n\nTEST(DisassemblerX86Test, BadReadXCHGThenWrite) {\n  DisassemblerX86 dis(read_xchg_write, sizeof(read_xchg_write)-1, 0);\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_arithmetic, dis.currentInstructionGroup());\n  EXPECT_EQ(true, dis.setBadRead());\n  EXPECT_EQ(1, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(google_breakpad::DISX86_BAD_WRITE, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_move, dis.currentInstructionGroup());\n}\n\nTEST(DisassemblerX86Test, BadReadThenCMP) {\n  DisassemblerX86 dis(read_cmp, sizeof(read_cmp)-1, 0);\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(0, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_arithmetic, dis.currentInstructionGroup());\n  EXPECT_EQ(true, dis.setBadRead());\n  EXPECT_EQ(3, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(google_breakpad::DISX86_BAD_COMPARISON, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_comparison, dis.currentInstructionGroup());\n  EXPECT_EQ(2, dis.NextInstruction());\n  EXPECT_EQ(true, dis.currentInstructionValid());\n  EXPECT_EQ(google_breakpad::DISX86_BAD_COMPARISON, dis.flags());\n  EXPECT_EQ(false, dis.endOfBlock());\n  EXPECT_EQ(libdis::insn_controlflow, dis.currentInstructionGroup());\n}\n}\n\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/exploitability.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// exploitability_engine.cc: Generic exploitability engine.\n//\n// See exploitable_engine.h for documentation.\n//\n// Author: Cris Neckar\n\n\n#include <cassert>\n\n#include \"google_breakpad/processor/exploitability.h\"\n#include \"google_breakpad/processor/minidump.h\"\n#include \"google_breakpad/processor/process_state.h\"\n#include \"processor/exploitability_win.h\"\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n\nnamespace google_breakpad {\n\nExploitability::Exploitability(Minidump *dump,\n                               ProcessState *process_state)\n    : dump_(dump),\n      process_state_(process_state) {}\n\nExploitabilityRating Exploitability::CheckExploitability() {\n  return CheckPlatformExploitability();\n}\n\nExploitability *Exploitability::ExploitabilityForPlatform(\n    Minidump *dump,\n    ProcessState *process_state) {\n  Exploitability *platform_exploitability = NULL;\n  MinidumpSystemInfo *minidump_system_info = dump->GetSystemInfo();\n  if (!minidump_system_info)\n    return NULL;\n\n  const MDRawSystemInfo *raw_system_info =\n    minidump_system_info->system_info();\n  if (!raw_system_info)\n    return NULL;\n\n  switch (raw_system_info->platform_id) {\n    case MD_OS_WIN32_NT:\n    case MD_OS_WIN32_WINDOWS: {\n      platform_exploitability = new ExploitabilityWin(dump,\n                                                      process_state);\n      break;\n    }\n    case MD_OS_MAC_OS_X:\n    case MD_OS_IOS:\n    case MD_OS_LINUX:\n    case MD_OS_UNIX:\n    case MD_OS_SOLARIS:\n    default: {\n      platform_exploitability = NULL;\n      break;\n    }\n  }\n\n  BPLOG_IF(ERROR, !platform_exploitability) <<\n    \"No Exploitability module for platform: \" <<\n    process_state->system_info()->os;\n  return platform_exploitability;\n}\n\nbool Exploitability::AddressIsAscii(u_int64_t address) {\n  for (int i = 0; i < 8; i++) {\n    u_int8_t byte = (address >> (8*i)) & 0xff;\n    if ((byte >= ' ' && byte <= '~') || byte == 0)\n      continue;\n    return false;\n  }\n  return true;\n}\n\n}  // namespace google_breakpad\n\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/exploitability_unittest.cc",
    "content": "// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <stdlib.h>\n#include <unistd.h>\n\n#include <string>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"google_breakpad/processor/basic_source_line_resolver.h\"\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/code_module.h\"\n#include \"google_breakpad/processor/code_modules.h\"\n#include \"google_breakpad/processor/minidump.h\"\n#include \"google_breakpad/processor/minidump_processor.h\"\n#include \"google_breakpad/processor/process_state.h\"\n#include \"google_breakpad/processor/stack_frame.h\"\n#include \"google_breakpad/processor/symbol_supplier.h\"\n\nnamespace google_breakpad {\nclass MockMinidump : public Minidump {\n public:\n  MockMinidump() : Minidump(\"\") {\n  }\n\n  MOCK_METHOD0(Read, bool());\n  MOCK_CONST_METHOD0(path, string());\n  MOCK_CONST_METHOD0(header, const MDRawHeader*());\n  MOCK_METHOD0(GetThreadList, MinidumpThreadList*());\n};\n}\n\nnamespace {\n\nusing google_breakpad::BasicSourceLineResolver;\nusing google_breakpad::CallStack;\nusing google_breakpad::CodeModule;\nusing google_breakpad::MinidumpProcessor;\nusing google_breakpad::MinidumpThreadList;\nusing google_breakpad::MinidumpThread;\nusing google_breakpad::MockMinidump;\nusing google_breakpad::ProcessState;\nusing google_breakpad::SymbolSupplier;\nusing google_breakpad::SystemInfo;\nusing std::string;\n\nclass TestSymbolSupplier : public SymbolSupplier {\n public:\n  TestSymbolSupplier() : interrupt_(false) {}\n\n  virtual SymbolResult GetSymbolFile(const CodeModule *module,\n                                     const SystemInfo *system_info,\n                                     string *symbol_file);\n\n  virtual SymbolResult GetSymbolFile(const CodeModule *module,\n                                     const SystemInfo *system_info,\n                                     string *symbol_file,\n                                     string *symbol_data);\n\n  virtual SymbolResult GetCStringSymbolData(const CodeModule *module,\n                                            const SystemInfo *system_info,\n                                            string *symbol_file,\n                                            char **symbol_data);\n\n  virtual void FreeSymbolData(const CodeModule *module) { }\n  // When set to true, causes the SymbolSupplier to return INTERRUPT\n  void set_interrupt(bool interrupt) { interrupt_ = interrupt; }\n\n private:\n  bool interrupt_;\n};\n\nSymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile(\n    const CodeModule *module,\n    const SystemInfo *system_info,\n    string *symbol_file) {\n\n  if (interrupt_) {\n    return INTERRUPT;\n  }\n\n  return NOT_FOUND;\n}\n\nSymbolSupplier::SymbolResult TestSymbolSupplier::GetCStringSymbolData(\n    const CodeModule *module,\n    const SystemInfo *system_info,\n    string *symbol_file,\n    char **symbol_data) {\n  return GetSymbolFile(module, system_info, symbol_file);\n}\n\nSymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile(\n    const CodeModule *module,\n    const SystemInfo *system_info,\n    string *symbol_file,\n    string *symbol_data) {\n  return GetSymbolFile(module, system_info, symbol_file);\n}\n\nTEST(ExploitabilityTest, TestWindowsEngine) {\n  TestSymbolSupplier supplier;\n  BasicSourceLineResolver resolver;\n  MinidumpProcessor processor(&supplier, &resolver, true);\n  ProcessState state;\n\n  string minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/ascii_read_av.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/ascii_read_av_block_write.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/ascii_read_av_clobber_write.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/ascii_read_av_conditional.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/ascii_read_av_then_jmp.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/ascii_read_av_xchg_write.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/ascii_write_av.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/ascii_write_av_arg_to_call.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/null_read_av.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/null_write_av.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/stack_exhaustion.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_NONE,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/exec_av_on_stack.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_HIGH,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/write_av_non_null.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABLITY_MEDIUM,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/read_av_non_null.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/read_av_clobber_write.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW,\n            state.exploitability());\n\n  minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/read_av_conditional.dmp\";\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_LOW,\n            state.exploitability());\n}\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/exploitability_win.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// exploitability_win.cc: Windows specific exploitability engine.\n//\n// Provides a guess at the exploitability of the crash for the Windows\n// platform given a minidump and process_state.\n//\n// Author: Cris Neckar\n\n#include <vector>\n\n#include \"processor/exploitability_win.h\"\n\n#include \"google_breakpad/common/minidump_exception_win32.h\"\n#include \"google_breakpad/processor/minidump.h\"\n#include \"processor/disassembler_x86.h\"\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n\n#include \"third_party/libdisasm/libdis.h\"\n\nnamespace google_breakpad {\n\n// The cutoff that we use to judge if and address is likely an offset\n// from various interesting addresses.\nstatic const u_int64_t kProbableNullOffset = 4096;\nstatic const u_int64_t kProbableStackOffset = 8192;\n\n// The various cutoffs for the different ratings.\nstatic const size_t kHighCutoff        = 100;\nstatic const size_t kMediumCutoff      = 80;\nstatic const size_t kLowCutoff         = 50;\nstatic const size_t kInterestingCutoff = 25;\n\n// Predefined incremental values for conditional weighting.\nstatic const size_t kTinyBump          = 5;\nstatic const size_t kSmallBump         = 20;\nstatic const size_t kMediumBump        = 50;\nstatic const size_t kLargeBump         = 70;\nstatic const size_t kHugeBump          = 90;\n\n// The maximum number of bytes to disassemble past the program counter.\nstatic const size_t kDisassembleBytesBeyondPC = 2048;\n\nExploitabilityWin::ExploitabilityWin(Minidump *dump,\n                                     ProcessState *process_state)\n    : Exploitability(dump, process_state) { }\n\nExploitabilityRating ExploitabilityWin::CheckPlatformExploitability() {\n  MinidumpException *exception = dump_->GetException();\n  if (!exception) {\n    BPLOG(INFO) << \"Minidump does not have exception record.\";\n    return EXPLOITABILITY_ERR_PROCESSING;\n  }\n\n  const MDRawExceptionStream *raw_exception = exception->exception();\n  if (!raw_exception) {\n    BPLOG(INFO) << \"Could not obtain raw exception info.\";\n    return EXPLOITABILITY_ERR_PROCESSING;\n  }\n\n  const MinidumpContext *context = exception->GetContext();\n  if (!context) {\n    BPLOG(INFO) << \"Could not obtain exception context.\";\n    return EXPLOITABILITY_ERR_PROCESSING;\n  }\n\n  MinidumpMemoryList *memory_list = dump_->GetMemoryList();\n  bool memory_available = true;\n  if (!memory_list) {\n    BPLOG(INFO) << \"Minidump memory segments not available.\";\n    memory_available = false;\n  }\n  u_int64_t address = process_state_->crash_address();\n  u_int32_t exception_code = raw_exception->exception_record.exception_code;\n\n  u_int32_t exploitability_weight = 0;\n\n  u_int64_t stack_ptr = 0;\n  u_int64_t instruction_ptr = 0;\n  u_int64_t this_ptr = 0;\n\n  switch (context->GetContextCPU()) {\n    case MD_CONTEXT_X86:\n      stack_ptr = context->GetContextX86()->esp;\n      instruction_ptr = context->GetContextX86()->eip;\n      this_ptr = context->GetContextX86()->ecx;\n      break;\n    case MD_CONTEXT_AMD64:\n      stack_ptr = context->GetContextAMD64()->rsp;\n      instruction_ptr = context->GetContextAMD64()->rip;\n      this_ptr = context->GetContextAMD64()->rcx;\n      break;\n    default:\n      BPLOG(INFO) << \"Unsupported architecture.\";\n      return EXPLOITABILITY_ERR_PROCESSING;\n  }\n\n  // Check if we are executing on the stack.\n  if (instruction_ptr <= (stack_ptr + kProbableStackOffset) &&\n      instruction_ptr >= (stack_ptr - kProbableStackOffset))\n    exploitability_weight += kHugeBump;\n\n  switch (exception_code) {\n    // This is almost certainly recursion.\n    case MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW:\n      exploitability_weight += kTinyBump;\n      break;\n\n    // These exceptions tend to be benign and we can generally ignore them.\n    case MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO:\n    case MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW:\n    case MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO:\n    case MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT:\n    case MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW:\n    case MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW:\n    case MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR:\n      exploitability_weight += kTinyBump;\n      break;\n\n    // These exceptions will typically mean that we have jumped where we\n    // shouldn't.\n    case MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION:\n    case MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION:\n    case MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION:\n      exploitability_weight += kLargeBump;\n      break;\n\n    // These represent bugs in exception handlers.\n    case MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION:\n    case MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION:\n      exploitability_weight += kSmallBump;\n      break;\n\n    case MD_EXCEPTION_CODE_WIN_HEAP_CORRUPTION:\n    case MD_EXCEPTION_CODE_WIN_STACK_BUFFER_OVERRUN:\n      exploitability_weight += kHugeBump;\n      break;\n\n    case MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION:\n      exploitability_weight += kLargeBump;\n      break;\n\n    case MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION:\n      bool near_null = (address <= kProbableNullOffset);\n      bool bad_read = false;\n      bool bad_write = false;\n      if (raw_exception->exception_record.number_parameters >= 1) {\n        MDAccessViolationTypeWin av_type =\n            static_cast<MDAccessViolationTypeWin>\n            (raw_exception->exception_record.exception_information[0]);\n        switch (av_type) {\n          case MD_ACCESS_VIOLATION_WIN_READ:\n            bad_read = true;\n            if (near_null)\n              exploitability_weight += kSmallBump;\n            else\n              exploitability_weight += kMediumBump;\n            break;\n          case MD_ACCESS_VIOLATION_WIN_WRITE:\n            bad_write = true;\n            if (near_null)\n              exploitability_weight += kSmallBump;\n            else\n              exploitability_weight += kHugeBump;\n            break;\n          case MD_ACCESS_VIOLATION_WIN_EXEC:\n            if (near_null)\n              exploitability_weight += kSmallBump;\n            else\n              exploitability_weight += kHugeBump;\n            break;\n          default:\n            BPLOG(INFO) << \"Unrecognized access violation type.\";\n            return EXPLOITABILITY_ERR_PROCESSING;\n            break;\n        }\n        MinidumpMemoryRegion *instruction_region = 0;\n        if (memory_available) {\n          instruction_region =\n              memory_list->GetMemoryRegionForAddress(instruction_ptr);\n        }\n        if (!near_null && instruction_region &&\n            context->GetContextCPU() == MD_CONTEXT_X86 &&\n            (bad_read || bad_write)) {\n          // Perform checks related to memory around instruction pointer.\n          u_int32_t memory_offset =\n              instruction_ptr - instruction_region->GetBase();\n          u_int32_t available_memory =\n              instruction_region->GetSize() - memory_offset;\n          available_memory = available_memory > kDisassembleBytesBeyondPC ?\n              kDisassembleBytesBeyondPC : available_memory;\n          if (available_memory) {\n            const u_int8_t *raw_memory =\n                instruction_region->GetMemory() + memory_offset;\n            DisassemblerX86 disassembler(raw_memory,\n                                         available_memory,\n                                         instruction_ptr);\n            disassembler.NextInstruction();\n            if (bad_read)\n              disassembler.setBadRead();\n            else\n              disassembler.setBadWrite();\n            if (disassembler.currentInstructionValid()) {\n              // Check if the faulting instruction falls into one of\n              // several interesting groups.\n              switch (disassembler.currentInstructionGroup()) {\n                case libdis::insn_controlflow:\n                  exploitability_weight += kLargeBump;\n                  break;\n                case libdis::insn_string:\n                  exploitability_weight += kHugeBump;\n                  break;\n                default:\n                  break;\n              }\n              // Loop the disassembler through the code and check if it\n              // IDed any interesting conditions in the near future.\n              // Multiple flags may be set so treat each equally.\n              while (disassembler.NextInstruction() &&\n                     disassembler.currentInstructionValid() &&\n                     !disassembler.endOfBlock())\n                continue;\n              if (disassembler.flags() & DISX86_BAD_BRANCH_TARGET)\n                exploitability_weight += kLargeBump;\n              if (disassembler.flags() & DISX86_BAD_ARGUMENT_PASSED)\n                exploitability_weight += kTinyBump;\n              if (disassembler.flags() & DISX86_BAD_WRITE)\n                exploitability_weight += kMediumBump;\n              if (disassembler.flags() & DISX86_BAD_BLOCK_WRITE)\n                exploitability_weight += kMediumBump;\n              if (disassembler.flags() & DISX86_BAD_READ)\n                exploitability_weight += kTinyBump;\n              if (disassembler.flags() & DISX86_BAD_BLOCK_READ)\n                exploitability_weight += kTinyBump;\n              if (disassembler.flags() & DISX86_BAD_COMPARISON)\n                exploitability_weight += kTinyBump;\n            }\n          }\n        }\n        if (!near_null && AddressIsAscii(address))\n          exploitability_weight += kMediumBump;\n      } else {\n        BPLOG(INFO) << \"Access violation type parameter missing.\";\n        return EXPLOITABILITY_ERR_PROCESSING;\n      }\n  }\n\n  // Based on the calculated weight we return a simplified classification.\n  BPLOG(INFO) << \"Calculated exploitability weight: \" << exploitability_weight;\n  if (exploitability_weight >= kHighCutoff)\n    return EXPLOITABILITY_HIGH;\n  if (exploitability_weight >= kMediumCutoff)\n    return EXPLOITABLITY_MEDIUM;\n  if (exploitability_weight >= kLowCutoff)\n    return EXPLOITABILITY_LOW;\n  if (exploitability_weight >= kInterestingCutoff)\n    return EXPLOITABILITY_INTERESTING;\n\n  return EXPLOITABILITY_NONE;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/exploitability_win.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// exploitability_win.h: Windows specific exploitability engine.\n//\n// Provides a guess at the exploitability of the crash for the Windows\n// platform given a minidump and process_state.\n//\n// Author: Cris Neckar\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_WIN_H_\n#define GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_WIN_H_\n\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/processor/exploitability.h\"\n\nnamespace google_breakpad {\n\nclass ExploitabilityWin : public Exploitability {\n  public:\n    ExploitabilityWin(Minidump *dump,\n                      ProcessState *process_state);\n\n    virtual ExploitabilityRating CheckPlatformExploitability();\n};\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_EXPLOITABILITY_WIN_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/fast_source_line_resolver.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// fast_source_line_resolver.cc: FastSourceLineResolver is a concrete class that\n// implements SourceLineResolverInterface.  Both FastSourceLineResolver and\n// BasicSourceLineResolver inherit from SourceLineResolverBase class to reduce\n// code redundancy.\n//\n// See fast_source_line_resolver.h and fast_source_line_resolver_types.h\n// for more documentation.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#include \"google_breakpad/processor/fast_source_line_resolver.h\"\n#include \"processor/fast_source_line_resolver_types.h\"\n\n#include <map>\n#include <utility>\n\n#include \"processor/module_factory.h\"\n#include \"processor/scoped_ptr.h\"\n\nusing std::map;\nusing std::make_pair;\n\nnamespace google_breakpad {\n\nFastSourceLineResolver::FastSourceLineResolver()\n  : SourceLineResolverBase(new FastModuleFactory) { }\n\nbool FastSourceLineResolver::ShouldDeleteMemoryBufferAfterLoadModule() {\n  return false;\n}\n\nvoid FastSourceLineResolver::Module::LookupAddress(StackFrame *frame) const {\n  MemAddr address = frame->instruction - frame->module->base_address();\n\n  // First, look for a FUNC record that covers address. Use\n  // RetrieveNearestRange instead of RetrieveRange so that, if there\n  // is no such function, we can use the next function to bound the\n  // extent of the PUBLIC symbol we find, below. This does mean we\n  // need to check that address indeed falls within the function we\n  // find; do the range comparison in an overflow-friendly way.\n  scoped_ptr<Function> func(new Function);\n  const Function* func_ptr = 0;\n  scoped_ptr<PublicSymbol> public_symbol(new PublicSymbol);\n  const PublicSymbol* public_symbol_ptr = 0;\n  MemAddr function_base;\n  MemAddr function_size;\n  MemAddr public_address;\n\n  if (functions_.RetrieveNearestRange(address, func_ptr,\n                                      &function_base, &function_size) &&\n      address >= function_base && address - function_base < function_size) {\n    func.get()->CopyFrom(func_ptr);\n    frame->function_name = func->name;\n    frame->function_base = frame->module->base_address() + function_base;\n\n    scoped_ptr<Line> line(new Line);\n    const Line* line_ptr = 0;\n    MemAddr line_base;\n    if (func->lines.RetrieveRange(address, line_ptr, &line_base, NULL)) {\n      line.get()->CopyFrom(line_ptr);\n      FileMap::iterator it = files_.find(line->source_file_id);\n      if (it != files_.end()) {\n        frame->source_file_name =\n            files_.find(line->source_file_id).GetValuePtr();\n      }\n      frame->source_line = line->line;\n      frame->source_line_base = frame->module->base_address() + line_base;\n    }\n  } else if (public_symbols_.Retrieve(address,\n                                      public_symbol_ptr, &public_address) &&\n             (!func_ptr || public_address > function_base)) {\n    public_symbol.get()->CopyFrom(public_symbol_ptr);\n    frame->function_name = public_symbol->name;\n    frame->function_base = frame->module->base_address() + public_address;\n  }\n}\n\n// WFI: WindowsFrameInfo.\n// Returns a WFI object reading from a raw memory chunk of data\nWindowsFrameInfo FastSourceLineResolver::CopyWFI(const char *raw) {\n  const WindowsFrameInfo::StackInfoTypes type =\n     static_cast<const WindowsFrameInfo::StackInfoTypes>(\n         *reinterpret_cast<const int32_t*>(raw));\n\n  // The first 8 bytes of int data are unused.\n  // They correspond to \"StackInfoTypes type_;\" and \"int valid;\"\n  // data member of WFI.\n  const u_int32_t *para_uint32 = reinterpret_cast<const u_int32_t*>(\n      raw + 2 * sizeof(int32_t));\n\n  u_int32_t prolog_size = para_uint32[0];;\n  u_int32_t epilog_size = para_uint32[1];\n  u_int32_t parameter_size = para_uint32[2];\n  u_int32_t saved_register_size = para_uint32[3];\n  u_int32_t local_size = para_uint32[4];\n  u_int32_t max_stack_size = para_uint32[5];\n  const char *boolean = reinterpret_cast<const char*>(para_uint32 + 6);\n  bool allocates_base_pointer = (*boolean != 0);\n  std::string program_string = boolean + 1;\n\n  return WindowsFrameInfo(type,\n                          prolog_size,\n                          epilog_size,\n                          parameter_size,\n                          saved_register_size,\n                          local_size,\n                          max_stack_size,\n                          allocates_base_pointer,\n                          program_string);\n}\n\n// Loads a map from the given buffer in char* type.\n// Does NOT take ownership of mem_buffer.\n// In addition, treat mem_buffer as const char*.\nbool FastSourceLineResolver::Module::LoadMapFromMemory(char *mem_buffer) {\n  if (!mem_buffer) return false;\n\n  const u_int32_t *map_sizes = reinterpret_cast<const u_int32_t*>(mem_buffer);\n\n  unsigned int header_size = kNumberMaps_ * sizeof(unsigned int);\n\n  // offsets[]: an array of offset addresses (with respect to mem_buffer),\n  // for each \"Static***Map\" component of Module.\n  // \"Static***Map\": static version of std::map or map wrapper, i.e., StaticMap,\n  // StaticAddressMap, StaticContainedRangeMap, and StaticRangeMap.\n  unsigned int offsets[kNumberMaps_];\n  offsets[0] = header_size;\n  for (int i = 1; i < kNumberMaps_; ++i) {\n    offsets[i] = offsets[i - 1] + map_sizes[i - 1];\n  }\n\n  // Use pointers to construct Static*Map data members in Module:\n  int map_id = 0;\n  files_ = StaticMap<int, char>(mem_buffer + offsets[map_id++]);\n  functions_ =\n      StaticRangeMap<MemAddr, Function>(mem_buffer + offsets[map_id++]);\n  public_symbols_ =\n      StaticAddressMap<MemAddr, PublicSymbol>(mem_buffer + offsets[map_id++]);\n  for (int i = 0; i < WindowsFrameInfo::STACK_INFO_LAST; ++i)\n    windows_frame_info_[i] =\n        StaticContainedRangeMap<MemAddr, char>(mem_buffer + offsets[map_id++]);\n\n  cfi_initial_rules_ =\n      StaticRangeMap<MemAddr, char>(mem_buffer + offsets[map_id++]);\n  cfi_delta_rules_ = StaticMap<MemAddr, char>(mem_buffer + offsets[map_id++]);\n\n  return true;\n}\n\nWindowsFrameInfo *FastSourceLineResolver::Module::FindWindowsFrameInfo(\n    const StackFrame *frame) const {\n  MemAddr address = frame->instruction - frame->module->base_address();\n  scoped_ptr<WindowsFrameInfo> result(new WindowsFrameInfo());\n\n  // We only know about WindowsFrameInfo::STACK_INFO_FRAME_DATA and\n  // WindowsFrameInfo::STACK_INFO_FPO. Prefer them in this order.\n  // WindowsFrameInfo::STACK_INFO_FRAME_DATA is the newer type that\n  // includes its own program string.\n  // WindowsFrameInfo::STACK_INFO_FPO is the older type\n  // corresponding to the FPO_DATA struct. See stackwalker_x86.cc.\n  const char* frame_info_ptr;\n  if ((windows_frame_info_[WindowsFrameInfo::STACK_INFO_FRAME_DATA]\n       .RetrieveRange(address, frame_info_ptr))\n      || (windows_frame_info_[WindowsFrameInfo::STACK_INFO_FPO]\n          .RetrieveRange(address, frame_info_ptr))) {\n    result->CopyFrom(CopyWFI(frame_info_ptr));\n    return result.release();\n  }\n\n  // Even without a relevant STACK line, many functions contain\n  // information about how much space their parameters consume on the\n  // stack. Use RetrieveNearestRange instead of RetrieveRange, so that\n  // we can use the function to bound the extent of the PUBLIC symbol,\n  // below. However, this does mean we need to check that ADDRESS\n  // falls within the retrieved function's range; do the range\n  // comparison in an overflow-friendly way.\n  scoped_ptr<Function> function(new Function);\n  const Function* function_ptr = 0;\n  MemAddr function_base, function_size;\n  if (functions_.RetrieveNearestRange(address, function_ptr,\n                                      &function_base, &function_size) &&\n      address >= function_base && address - function_base < function_size) {\n    function.get()->CopyFrom(function_ptr);\n    result->parameter_size = function->parameter_size;\n    result->valid |= WindowsFrameInfo::VALID_PARAMETER_SIZE;\n    return result.release();\n  }\n\n  // PUBLIC symbols might have a parameter size. Use the function we\n  // found above to limit the range the public symbol covers.\n  scoped_ptr<PublicSymbol> public_symbol(new PublicSymbol);\n  const PublicSymbol* public_symbol_ptr = 0;\n  MemAddr public_address;\n  if (public_symbols_.Retrieve(address, public_symbol_ptr, &public_address) &&\n      (!function_ptr || public_address > function_base)) {\n    public_symbol.get()->CopyFrom(public_symbol_ptr);\n    result->parameter_size = public_symbol->parameter_size;\n  }\n\n  return NULL;\n}\n\nCFIFrameInfo *FastSourceLineResolver::Module::FindCFIFrameInfo(\n    const StackFrame *frame) const {\n  MemAddr address = frame->instruction - frame->module->base_address();\n  MemAddr initial_base, initial_size;\n  const char* initial_rules = NULL;\n\n  // Find the initial rule whose range covers this address. That\n  // provides an initial set of register recovery rules. Then, walk\n  // forward from the initial rule's starting address to frame's\n  // instruction address, applying delta rules.\n  if (!cfi_initial_rules_.RetrieveRange(address, initial_rules,\n                                        &initial_base, &initial_size)) {\n    return NULL;\n  }\n\n  // Create a frame info structure, and populate it with the rules from\n  // the STACK CFI INIT record.\n  scoped_ptr<CFIFrameInfo> rules(new CFIFrameInfo());\n  if (!ParseCFIRuleSet(initial_rules, rules.get()))\n    return NULL;\n\n  // Find the first delta rule that falls within the initial rule's range.\n  StaticMap<MemAddr, char>::iterator delta =\n    cfi_delta_rules_.lower_bound(initial_base);\n\n  // Apply delta rules up to and including the frame's address.\n  while (delta != cfi_delta_rules_.end() && delta.GetKey() <= address) {\n    ParseCFIRuleSet(delta.GetValuePtr(), rules.get());\n    delta++;\n  }\n\n  return rules.release();\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/fast_source_line_resolver_types.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// fast_source_line_resolver_types.h: definition of nested classes/structs in\n// FastSourceLineResolver.  It moves the definitions out of\n// fast_source_line_resolver.cc, so that other classes could have access\n// to these private nested types without including fast_source_line_resolver.cc\n//\n// Author: lambxsy@google.com (Siyang Xie)\n\n#ifndef PROCESSOR_FAST_SOURCE_LINE_RESOLVER_TYPES_H__\n#define PROCESSOR_FAST_SOURCE_LINE_RESOLVER_TYPES_H__\n\n#include \"google_breakpad/processor/fast_source_line_resolver.h\"\n#include \"processor/source_line_resolver_base_types.h\"\n\n#include <map>\n#include <string>\n\n#include \"google_breakpad/processor/stack_frame.h\"\n#include \"processor/cfi_frame_info.h\"\n#include \"processor/static_address_map-inl.h\"\n#include \"processor/static_contained_range_map-inl.h\"\n#include \"processor/static_map.h\"\n#include \"processor/static_range_map-inl.h\"\n#include \"processor/windows_frame_info.h\"\n\nnamespace google_breakpad {\n\nstruct FastSourceLineResolver::Line : public SourceLineResolverBase::Line {\n  void CopyFrom(const Line *line_ptr) {\n    const char *raw = reinterpret_cast<const char*>(line_ptr);\n    CopyFrom(raw);\n  }\n\n  // De-serialize the memory data of a Line.\n  void CopyFrom(const char *raw) {\n    address = *(reinterpret_cast<const MemAddr*>(raw));\n    size = *(reinterpret_cast<const MemAddr*>(raw + sizeof(address)));\n    source_file_id = *(reinterpret_cast<const int32_t *>(\n        raw + 2 * sizeof(address)));\n    line = *(reinterpret_cast<const int32_t*>(\n        raw + 2 * sizeof(address) + sizeof(source_file_id)));\n  }\n};\n\nstruct FastSourceLineResolver::Function :\npublic SourceLineResolverBase::Function {\n  void CopyFrom(const Function *func_ptr) {\n    const char *raw = reinterpret_cast<const char*>(func_ptr);\n    CopyFrom(raw);\n  }\n\n  // De-serialize the memory data of a Function.\n  void CopyFrom(const char *raw) {\n    size_t name_size = strlen(raw) + 1;\n    name = raw;\n    address = *(reinterpret_cast<const MemAddr*>(raw + name_size));\n    size = *(reinterpret_cast<const MemAddr*>(\n        raw + name_size + sizeof(MemAddr)));\n    parameter_size = *(reinterpret_cast<const int32_t*>(\n        raw + name_size + 2 * sizeof(MemAddr)));\n    lines = StaticRangeMap<MemAddr, Line>(\n        raw + name_size + 2 * sizeof(MemAddr) + sizeof(int32_t));\n  }\n\n  StaticRangeMap<MemAddr, Line> lines;\n};\n\nstruct FastSourceLineResolver::PublicSymbol :\npublic SourceLineResolverBase::PublicSymbol {\n  void CopyFrom(const PublicSymbol *public_symbol_ptr) {\n    const char *raw = reinterpret_cast<const char*>(public_symbol_ptr);\n    CopyFrom(raw);\n  }\n\n  // De-serialize the memory data of a PublicSymbol.\n  void CopyFrom(const char *raw) {\n    size_t name_size = strlen(raw) + 1;\n    name = raw;\n    address = *(reinterpret_cast<const MemAddr*>(raw + name_size));\n    parameter_size = *(reinterpret_cast<const int32_t*>(\n        raw + name_size + sizeof(MemAddr)));\n  }\n};\n\nclass FastSourceLineResolver::Module: public SourceLineResolverBase::Module {\n public:\n  explicit Module(const string &name) : name_(name) { }\n  virtual ~Module() { }\n\n  // Looks up the given relative address, and fills the StackFrame struct\n  // with the result.\n  virtual void LookupAddress(StackFrame *frame) const;\n\n  // Loads a map from the given buffer in char* type.\n  virtual bool LoadMapFromMemory(char *memory_buffer);\n\n  // If Windows stack walking information is available covering ADDRESS,\n  // return a WindowsFrameInfo structure describing it. If the information\n  // is not available, returns NULL. A NULL return value does not indicate\n  // an error. The caller takes ownership of any returned WindowsFrameInfo\n  // object.\n  virtual WindowsFrameInfo *FindWindowsFrameInfo(const StackFrame *frame) const;\n\n  // If CFI stack walking information is available covering ADDRESS,\n  // return a CFIFrameInfo structure describing it. If the information\n  // is not available, return NULL. The caller takes ownership of any\n  // returned CFIFrameInfo object.\n  virtual CFIFrameInfo *FindCFIFrameInfo(const StackFrame *frame) const;\n\n  // Number of serialized map components of Module.\n  static const int kNumberMaps_ = 5 + WindowsFrameInfo::STACK_INFO_LAST;\n\n private:\n  friend class FastSourceLineResolver;\n  friend class ModuleComparer;\n  typedef StaticMap<int, char> FileMap;\n\n  string name_;\n  StaticMap<int, char> files_;\n  StaticRangeMap<MemAddr, Function> functions_;\n  StaticAddressMap<MemAddr, PublicSymbol> public_symbols_;\n\n  // Each element in the array is a ContainedRangeMap for a type\n  // listed in WindowsFrameInfoTypes. These are split by type because\n  // there may be overlaps between maps of different types, but some\n  // information is only available as certain types.\n  StaticContainedRangeMap<MemAddr, char>\n    windows_frame_info_[WindowsFrameInfo::STACK_INFO_LAST];\n\n  // DWARF CFI stack walking data. The Module stores the initial rule sets\n  // and rule deltas as strings, just as they appear in the symbol file:\n  // although the file may contain hundreds of thousands of STACK CFI\n  // records, walking a stack will only ever use a few of them, so it's\n  // best to delay parsing a record until it's actually needed.\n  //\n  // STACK CFI INIT records: for each range, an initial set of register\n  // recovery rules. The RangeMap's itself gives the starting and ending\n  // addresses.\n  StaticRangeMap<MemAddr, char> cfi_initial_rules_;\n\n  // STACK CFI records: at a given address, the changes to the register\n  // recovery rules that take effect at that address. The map key is the\n  // starting address; the ending address is the key of the next entry in\n  // this map, or the end of the range as given by the cfi_initial_rules_\n  // entry (which FindCFIFrameInfo looks up first).\n  StaticMap<MemAddr, char> cfi_delta_rules_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_FAST_SOURCE_LINE_RESOLVER_TYPES_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/fast_source_line_resolver_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// fast_source_line_resolver_unittest.cc: Unit tests for FastSourceLineResolver.\n// Two different approaches for testing fast source line resolver:\n// First, use the same unit test data for basic source line resolver.\n// Second, read data from symbol files, load them as basic modules, and then\n// serialize them and load the serialized data as fast modules.  Then compare\n// modules to assure the fast module contains exactly the same data as\n// basic module.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#include <stdio.h>\n\n#include <sstream>\n#include <string>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"google_breakpad/processor/code_module.h\"\n#include \"google_breakpad/processor/stack_frame.h\"\n#include \"google_breakpad/processor/memory_region.h\"\n#include \"processor/logging.h\"\n#include \"processor/module_serializer.h\"\n#include \"processor/module_comparer.h\"\n\nnamespace {\n\nusing std::string;\nusing google_breakpad::SourceLineResolverBase;\nusing google_breakpad::BasicSourceLineResolver;\nusing google_breakpad::FastSourceLineResolver;\nusing google_breakpad::ModuleSerializer;\nusing google_breakpad::ModuleComparer;\nusing google_breakpad::CFIFrameInfo;\nusing google_breakpad::CodeModule;\nusing google_breakpad::MemoryRegion;\nusing google_breakpad::StackFrame;\nusing google_breakpad::WindowsFrameInfo;\nusing google_breakpad::linked_ptr;\nusing google_breakpad::scoped_ptr;\n\nclass TestCodeModule : public CodeModule {\n public:\n  explicit TestCodeModule(string code_file) : code_file_(code_file) {}\n  virtual ~TestCodeModule() {}\n\n  virtual u_int64_t base_address() const { return 0; }\n  virtual u_int64_t size() const { return 0xb000; }\n  virtual string code_file() const { return code_file_; }\n  virtual string code_identifier() const { return \"\"; }\n  virtual string debug_file() const { return \"\"; }\n  virtual string debug_identifier() const { return \"\"; }\n  virtual string version() const { return \"\"; }\n  virtual const CodeModule* Copy() const {\n    return new TestCodeModule(code_file_);\n  }\n\n private:\n  string code_file_;\n};\n\n// A mock memory region object, for use by the STACK CFI tests.\nclass MockMemoryRegion: public MemoryRegion {\n  u_int64_t GetBase() const { return 0x10000; }\n  u_int32_t GetSize() const { return 0x01000; }\n  bool GetMemoryAtAddress(u_int64_t address, u_int8_t *value) const {\n    *value = address & 0xff;\n    return true;\n  }\n  bool GetMemoryAtAddress(u_int64_t address, u_int16_t *value) const {\n    *value = address & 0xffff;\n    return true;\n  }\n  bool GetMemoryAtAddress(u_int64_t address, u_int32_t *value) const {\n    switch (address) {\n      case 0x10008: *value = 0x98ecadc3; break;  // saved %ebx\n      case 0x1000c: *value = 0x878f7524; break;  // saved %esi\n      case 0x10010: *value = 0x6312f9a5; break;  // saved %edi\n      case 0x10014: *value = 0x10038;    break;  // caller's %ebp\n      case 0x10018: *value = 0xf6438648; break;  // return address\n      default: *value = 0xdeadbeef;      break;  // junk\n    }\n    return true;\n  }\n  bool GetMemoryAtAddress(u_int64_t address, u_int64_t *value) const {\n    *value = address;\n    return true;\n  }\n};\n\n// Verify that, for every association in ACTUAL, EXPECTED has the same\n// association. (That is, ACTUAL's associations should be a subset of\n// EXPECTED's.) Also verify that ACTUAL has associations for \".ra\" and\n// \".cfa\".\nstatic bool VerifyRegisters(\n    const char *file, int line,\n    const CFIFrameInfo::RegisterValueMap<u_int32_t> &expected,\n    const CFIFrameInfo::RegisterValueMap<u_int32_t> &actual) {\n  CFIFrameInfo::RegisterValueMap<u_int32_t>::const_iterator a;\n  a = actual.find(\".cfa\");\n  if (a == actual.end())\n    return false;\n  a = actual.find(\".ra\");\n  if (a == actual.end())\n    return false;\n  for (a = actual.begin(); a != actual.end(); a++) {\n    CFIFrameInfo::RegisterValueMap<u_int32_t>::const_iterator e =\n      expected.find(a->first);\n    if (e == expected.end()) {\n      fprintf(stderr, \"%s:%d: unexpected register '%s' recovered, value 0x%x\\n\",\n              file, line, a->first.c_str(), a->second);\n      return false;\n    }\n    if (e->second != a->second) {\n      fprintf(stderr,\n              \"%s:%d: register '%s' recovered value was 0x%x, expected 0x%x\\n\",\n              file, line, a->first.c_str(), a->second, e->second);\n      return false;\n    }\n    // Don't complain if this doesn't recover all registers. Although\n    // the DWARF spec says that unmentioned registers are undefined,\n    // GCC uses omission to mean that they are unchanged.\n  }\n  return true;\n}\n\nstatic bool VerifyEmpty(const StackFrame &frame) {\n  if (frame.function_name.empty() &&\n      frame.source_file_name.empty() &&\n      frame.source_line == 0)\n    return true;\n  return false;\n}\n\nstatic void ClearSourceLineInfo(StackFrame *frame) {\n  frame->function_name.clear();\n  frame->module = NULL;\n  frame->source_file_name.clear();\n  frame->source_line = 0;\n}\n\nclass TestFastSourceLineResolver : public ::testing::Test {\n public:\n  void SetUp() {\n    testdata_dir = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n                         \"/src/processor/testdata\";\n  }\n\n  string symbol_file(int file_index) {\n    std::stringstream ss;\n    ss << testdata_dir << \"/module\" << file_index << \".out\";\n    return ss.str();\n  }\n\n  ModuleSerializer serializer;\n  BasicSourceLineResolver basic_resolver;\n  FastSourceLineResolver fast_resolver;\n  ModuleComparer module_comparer;\n\n  string testdata_dir;\n};\n\n// Test adapted from basic_source_line_resolver_unittest.\nTEST_F(TestFastSourceLineResolver, TestLoadAndResolve) {\n  TestCodeModule module1(\"module1\");\n  ASSERT_TRUE(basic_resolver.LoadModule(&module1, symbol_file(1)));\n  ASSERT_TRUE(basic_resolver.HasModule(&module1));\n  // Convert module1 to fast_module:\n  ASSERT_TRUE(serializer.ConvertOneModule(\n      module1.code_file(), &basic_resolver, &fast_resolver));\n  ASSERT_TRUE(fast_resolver.HasModule(&module1));\n\n  TestCodeModule module2(\"module2\");\n  ASSERT_TRUE(basic_resolver.LoadModule(&module2, symbol_file(2)));\n  ASSERT_TRUE(basic_resolver.HasModule(&module2));\n  // Convert module2 to fast_module:\n  ASSERT_TRUE(serializer.ConvertOneModule(\n      module2.code_file(), &basic_resolver, &fast_resolver));\n  ASSERT_TRUE(fast_resolver.HasModule(&module2));\n\n  StackFrame frame;\n  scoped_ptr<WindowsFrameInfo> windows_frame_info;\n  scoped_ptr<CFIFrameInfo> cfi_frame_info;\n  frame.instruction = 0x1000;\n  frame.module = NULL;\n  fast_resolver.FillSourceLineInfo(&frame);\n  ASSERT_FALSE(frame.module);\n  ASSERT_TRUE(frame.function_name.empty());\n  ASSERT_EQ(frame.function_base, 0);\n  ASSERT_TRUE(frame.source_file_name.empty());\n  ASSERT_EQ(frame.source_line, 0);\n  ASSERT_EQ(frame.source_line_base, 0);\n\n  frame.module = &module1;\n  fast_resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, \"Function1_1\");\n  ASSERT_TRUE(frame.module);\n  ASSERT_EQ(frame.module->code_file(), \"module1\");\n  ASSERT_EQ(frame.function_base, 0x1000);\n  ASSERT_EQ(frame.source_file_name, \"file1_1.cc\");\n  ASSERT_EQ(frame.source_line, 44);\n  ASSERT_EQ(frame.source_line_base, 0x1000);\n  windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame));\n  ASSERT_TRUE(windows_frame_info.get());\n  ASSERT_FALSE(windows_frame_info->allocates_base_pointer);\n  ASSERT_EQ(windows_frame_info->program_string,\n            \"$eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ =\");\n\n  ClearSourceLineInfo(&frame);\n  frame.instruction = 0x800;\n  frame.module = &module1;\n  fast_resolver.FillSourceLineInfo(&frame);\n  ASSERT_TRUE(VerifyEmpty(frame));\n  windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame));\n  ASSERT_FALSE(windows_frame_info.get());\n\n  frame.instruction = 0x1280;\n  fast_resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, \"Function1_3\");\n  ASSERT_TRUE(frame.source_file_name.empty());\n  ASSERT_EQ(frame.source_line, 0);\n  windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame));\n  ASSERT_TRUE(windows_frame_info.get());\n  ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_UNKNOWN);\n  ASSERT_FALSE(windows_frame_info->allocates_base_pointer);\n  ASSERT_TRUE(windows_frame_info->program_string.empty());\n\n  frame.instruction = 0x1380;\n  fast_resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, \"Function1_4\");\n  ASSERT_TRUE(frame.source_file_name.empty());\n  ASSERT_EQ(frame.source_line, 0);\n  windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame));\n  ASSERT_TRUE(windows_frame_info.get());\n  ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_FRAME_DATA);\n  ASSERT_FALSE(windows_frame_info->allocates_base_pointer);\n  ASSERT_FALSE(windows_frame_info->program_string.empty());\n\n  frame.instruction = 0x2000;\n  windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame));\n  ASSERT_FALSE(windows_frame_info.get());\n\n  // module1 has STACK CFI records covering 3d40..3def;\n  // module2 has STACK CFI records covering 3df0..3e9f;\n  // check that FindCFIFrameInfo doesn't claim to find any outside those ranges.\n  frame.instruction = 0x3d3f;\n  frame.module = &module1;\n  cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));\n  ASSERT_FALSE(cfi_frame_info.get());\n\n  frame.instruction = 0x3e9f;\n  frame.module = &module1;\n  cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));\n  ASSERT_FALSE(cfi_frame_info.get());\n\n  CFIFrameInfo::RegisterValueMap<u_int32_t> current_registers;\n  CFIFrameInfo::RegisterValueMap<u_int32_t> caller_registers;\n  CFIFrameInfo::RegisterValueMap<u_int32_t> expected_caller_registers;\n  MockMemoryRegion memory;\n\n  // Regardless of which instruction evaluation takes place at, it\n  // should produce the same values for the caller's registers.\n  expected_caller_registers[\".cfa\"] = 0x1001c;\n  expected_caller_registers[\".ra\"]  = 0xf6438648;\n  expected_caller_registers[\"$ebp\"] = 0x10038;\n  expected_caller_registers[\"$ebx\"] = 0x98ecadc3;\n  expected_caller_registers[\"$esi\"] = 0x878f7524;\n  expected_caller_registers[\"$edi\"] = 0x6312f9a5;\n\n  frame.instruction = 0x3d40;\n  frame.module = &module1;\n  current_registers.clear();\n  current_registers[\"$esp\"] = 0x10018;\n  current_registers[\"$ebp\"] = 0x10038;\n  current_registers[\"$ebx\"] = 0x98ecadc3;\n  current_registers[\"$esi\"] = 0x878f7524;\n  current_registers[\"$edi\"] = 0x6312f9a5;\n  cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));\n  ASSERT_TRUE(cfi_frame_info.get());\n  ASSERT_TRUE(cfi_frame_info.get()\n              ->FindCallerRegs<u_int32_t>(current_registers, memory,\n                                          &caller_registers));\n  ASSERT_TRUE(VerifyRegisters(__FILE__, __LINE__,\n                              expected_caller_registers, caller_registers));\n\n  frame.instruction = 0x3d41;\n  current_registers[\"$esp\"] = 0x10014;\n  cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));\n  ASSERT_TRUE(cfi_frame_info.get());\n  ASSERT_TRUE(cfi_frame_info.get()\n              ->FindCallerRegs<u_int32_t>(current_registers, memory,\n                                          &caller_registers));\n  ASSERT_TRUE(VerifyRegisters(__FILE__, __LINE__,\n                              expected_caller_registers, caller_registers));\n\n  frame.instruction = 0x3d43;\n  current_registers[\"$ebp\"] = 0x10014;\n  cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));\n  ASSERT_TRUE(cfi_frame_info.get());\n  ASSERT_TRUE(cfi_frame_info.get()\n              ->FindCallerRegs<u_int32_t>(current_registers, memory,\n                                          &caller_registers));\n  VerifyRegisters(__FILE__, __LINE__,\n                  expected_caller_registers, caller_registers);\n\n  frame.instruction = 0x3d54;\n  current_registers[\"$ebx\"] = 0x6864f054U;\n  cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));\n  ASSERT_TRUE(cfi_frame_info.get());\n  ASSERT_TRUE(cfi_frame_info.get()\n              ->FindCallerRegs<u_int32_t>(current_registers, memory,\n                                          &caller_registers));\n  VerifyRegisters(__FILE__, __LINE__,\n                  expected_caller_registers, caller_registers);\n\n  frame.instruction = 0x3d5a;\n  current_registers[\"$esi\"] = 0x6285f79aU;\n  cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));\n  ASSERT_TRUE(cfi_frame_info.get());\n  ASSERT_TRUE(cfi_frame_info.get()\n              ->FindCallerRegs<u_int32_t>(current_registers, memory,\n                                          &caller_registers));\n  VerifyRegisters(__FILE__, __LINE__,\n                  expected_caller_registers, caller_registers);\n\n  frame.instruction = 0x3d84;\n  current_registers[\"$edi\"] = 0x64061449U;\n  cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));\n  ASSERT_TRUE(cfi_frame_info.get());\n  ASSERT_TRUE(cfi_frame_info.get()\n              ->FindCallerRegs<u_int32_t>(current_registers, memory,\n                                          &caller_registers));\n  VerifyRegisters(__FILE__, __LINE__,\n                  expected_caller_registers, caller_registers);\n\n  frame.instruction = 0x2900;\n  frame.module = &module1;\n  fast_resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, string(\"PublicSymbol\"));\n\n  frame.instruction = 0x4000;\n  frame.module = &module1;\n  fast_resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, string(\"LargeFunction\"));\n\n  frame.instruction = 0x2181;\n  frame.module = &module2;\n  fast_resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, \"Function2_2\");\n  ASSERT_EQ(frame.function_base, 0x2170);\n  ASSERT_TRUE(frame.module);\n  ASSERT_EQ(frame.module->code_file(), \"module2\");\n  ASSERT_EQ(frame.source_file_name, \"file2_2.cc\");\n  ASSERT_EQ(frame.source_line, 21);\n  ASSERT_EQ(frame.source_line_base, 0x2180);\n  windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame));\n  ASSERT_TRUE(windows_frame_info.get());\n  ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_FRAME_DATA);\n  ASSERT_EQ(windows_frame_info->prolog_size, 1);\n\n  frame.instruction = 0x216f;\n  fast_resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, \"Public2_1\");\n\n  ClearSourceLineInfo(&frame);\n  frame.instruction = 0x219f;\n  frame.module = &module2;\n  fast_resolver.FillSourceLineInfo(&frame);\n  ASSERT_TRUE(frame.function_name.empty());\n\n  frame.instruction = 0x21a0;\n  frame.module = &module2;\n  fast_resolver.FillSourceLineInfo(&frame);\n  ASSERT_EQ(frame.function_name, \"Public2_2\");\n}\n\nTEST_F(TestFastSourceLineResolver, TestInvalidLoads) {\n  TestCodeModule module3(\"module3\");\n  ASSERT_FALSE(basic_resolver.LoadModule(&module3,\n                                         testdata_dir + \"/module3_bad.out\"));\n  ASSERT_FALSE(basic_resolver.HasModule(&module3));\n  // Convert module3 to fast_module:\n  ASSERT_FALSE(serializer.ConvertOneModule(module3.code_file(),\n                                           &basic_resolver,\n                                           &fast_resolver));\n  ASSERT_FALSE(fast_resolver.HasModule(&module3));\n\n  TestCodeModule module4(\"module4\");\n  ASSERT_FALSE(basic_resolver.LoadModule(&module4,\n                                         testdata_dir + \"/module4_bad.out\"));\n  ASSERT_FALSE(basic_resolver.HasModule(&module4));\n  // Convert module4 to fast_module:\n  ASSERT_FALSE(serializer.ConvertOneModule(module4.code_file(),\n                                           &basic_resolver,\n                                           &fast_resolver));\n  ASSERT_FALSE(fast_resolver.HasModule(&module4));\n\n  TestCodeModule module5(\"module5\");\n  ASSERT_FALSE(fast_resolver.LoadModule(&module5,\n                                         testdata_dir + \"/invalid-filename\"));\n  ASSERT_FALSE(fast_resolver.HasModule(&module5));\n\n  TestCodeModule invalidmodule(\"invalid-module\");\n  ASSERT_FALSE(fast_resolver.HasModule(&invalidmodule));\n}\n\nTEST_F(TestFastSourceLineResolver, TestUnload) {\n  TestCodeModule module1(\"module1\");\n  ASSERT_FALSE(basic_resolver.HasModule(&module1));\n\n  ASSERT_TRUE(basic_resolver.LoadModule(&module1, symbol_file(1)));\n  ASSERT_TRUE(basic_resolver.HasModule(&module1));\n  // Convert module1 to fast_module.\n  ASSERT_TRUE(serializer.ConvertOneModule(module1.code_file(),\n                                          &basic_resolver,\n                                          &fast_resolver));\n  ASSERT_TRUE(fast_resolver.HasModule(&module1));\n  basic_resolver.UnloadModule(&module1);\n  fast_resolver.UnloadModule(&module1);\n  ASSERT_FALSE(fast_resolver.HasModule(&module1));\n\n  ASSERT_TRUE(basic_resolver.LoadModule(&module1, symbol_file(1)));\n  ASSERT_TRUE(basic_resolver.HasModule(&module1));\n  // Convert module1 to fast_module.\n  ASSERT_TRUE(serializer.ConvertOneModule(module1.code_file(),\n                                          &basic_resolver,\n                                          &fast_resolver));\n  ASSERT_TRUE(fast_resolver.HasModule(&module1));\n}\n\nTEST_F(TestFastSourceLineResolver, CompareModule) {\n  char *symbol_data;\n  string symbol_data_string;\n  string filename;\n\n  for (int module_index = 0; module_index < 3; ++module_index) {\n    std::stringstream ss;\n    ss << testdata_dir << \"/module\" << module_index << \".out\";\n    filename = ss.str();\n    ASSERT_TRUE(SourceLineResolverBase::ReadSymbolFile(\n        &symbol_data, symbol_file(module_index)));\n    symbol_data_string = symbol_data;\n    delete [] symbol_data;\n    ASSERT_TRUE(module_comparer.Compare(symbol_data_string));\n  }\n}\n\n}  // namespace\n\nint main(int argc, char *argv[]) {\n  ::testing::InitGoogleTest(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/linked_ptr.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A \"smart\" pointer type with reference tracking.  Every pointer to a\n// particular object is kept on a circular linked list.  When the last pointer\n// to an object is destroyed or reassigned, the object is deleted.\n//\n// Used properly, this deletes the object when the last reference goes away.\n// There are several caveats:\n// - Like all reference counting schemes, cycles lead to leaks.\n// - Each smart pointer is actually two pointers (8 bytes instead of 4).\n// - Every time a pointer is assigned, the entire list of pointers to that\n//   object is traversed.  This class is therefore NOT SUITABLE when there\n//   will often be more than two or three pointers to a particular object.\n// - References are only tracked as long as linked_ptr<> objects are copied.\n//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS\n//   will happen (double deletion).\n//\n// A good use of this class is storing object references in STL containers.\n// You can safely put linked_ptr<> in a vector<>.\n// Other uses may not be as good.\n//\n// Note: If you use an incomplete type with linked_ptr<>, the class\n// *containing* linked_ptr<> must have a constructor and destructor (even\n// if they do nothing!).\n\n#ifndef PROCESSOR_LINKED_PTR_H__\n#define PROCESSOR_LINKED_PTR_H__\n\nnamespace google_breakpad {\n\n// This is used internally by all instances of linked_ptr<>.  It needs to be\n// a non-template class because different types of linked_ptr<> can refer to\n// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).\n// So, it needs to be possible for different types of linked_ptr to participate\n// in the same circular linked list, so we need a single class type here.\n//\n// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.\nclass linked_ptr_internal {\n public:\n  // Create a new circle that includes only this instance.\n  void join_new() {\n    next_ = this;\n  }\n\n  // Join an existing circle.\n  void join(linked_ptr_internal const* ptr) {\n    linked_ptr_internal const* p = ptr;\n    while (p->next_ != ptr) p = p->next_;\n    p->next_ = this;\n    next_ = ptr;\n  }\n\n  // Leave whatever circle we're part of.  Returns true iff we were the\n  // last member of the circle.  Once this is done, you can join() another.\n  bool depart() {\n    if (next_ == this) return true;\n    linked_ptr_internal const* p = next_;\n    while (p->next_ != this) p = p->next_;\n    p->next_ = next_;\n    return false;\n  }\n\n private:\n  mutable linked_ptr_internal const* next_;\n};\n\ntemplate <typename T>\nclass linked_ptr {\n public:\n  typedef T element_type;\n\n  // Take over ownership of a raw pointer.  This should happen as soon as\n  // possible after the object is created.\n  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }\n  ~linked_ptr() { depart(); }\n\n  // Copy an existing linked_ptr<>, adding ourselves to the list of references.\n  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }\n  linked_ptr(linked_ptr const& ptr) { copy(&ptr); }\n\n  // Assignment releases the old value and acquires the new.\n  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {\n    depart();\n    copy(&ptr);\n    return *this;\n  }\n\n  linked_ptr& operator=(linked_ptr const& ptr) {\n    if (&ptr != this) {\n      depart();\n      copy(&ptr);\n    }\n    return *this;\n  }\n\n  // Smart pointer members.\n  void reset(T* ptr = NULL) { depart(); capture(ptr); }\n  T* get() const { return value_; }\n  T* operator->() const { return value_; }\n  T& operator*() const { return *value_; }\n  // Release ownership of the pointed object and returns it.\n  // Sole ownership by this linked_ptr object is required.\n  T* release() {\n    bool last = link_.depart();\n    T* v = value_;\n    value_ = NULL;\n    return v;\n  }\n\n  bool operator==(T* p) const { return value_ == p; }\n  bool operator!=(T* p) const { return value_ != p; }\n  template <typename U>\n  bool operator==(linked_ptr<U> const& ptr) const {\n    return value_ == ptr.get();\n  }\n  template <typename U>\n  bool operator!=(linked_ptr<U> const& ptr) const {\n    return value_ != ptr.get();\n  }\n\n private:\n  template <typename U>\n  friend class linked_ptr;\n\n  T* value_;\n  linked_ptr_internal link_;\n\n  void depart() {\n    if (link_.depart()) delete value_;\n  }\n\n  void capture(T* ptr) {\n    value_ = ptr;\n    link_.join_new();\n  }\n\n  template <typename U> void copy(linked_ptr<U> const* ptr) {\n    value_ = ptr->get();\n    if (value_)\n      link_.join(&ptr->link_);\n    else\n      link_.join_new();\n  }\n};\n\ntemplate<typename T> inline\nbool operator==(T* ptr, const linked_ptr<T>& x) {\n  return ptr == x.get();\n}\n\ntemplate<typename T> inline\nbool operator!=(T* ptr, const linked_ptr<T>& x) {\n  return ptr != x.get();\n}\n\n// A function to convert T* into linked_ptr<T>\n// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation\n// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))\ntemplate <typename T>\nlinked_ptr<T> make_linked_ptr(T* ptr) {\n  return linked_ptr<T>(ptr);\n}\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_LINKED_PTR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/logging.cc",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// logging.cc: Breakpad logging\n//\n// See logging.h for documentation.\n//\n// Author: Mark Mentovai\n\n#include <assert.h>\n#include <errno.h>\n#include <stdio.h>\n#include <string.h>\n#include <time.h>\n\n#include \"processor/logging.h\"\n#include \"processor/pathname_stripper.h\"\n\n#ifdef _WIN32\n#define snprintf _snprintf\n#endif\n\nnamespace google_breakpad {\n\nLogStream::LogStream(std::ostream &stream, Severity severity,\n                     const char *file, int line)\n    : stream_(stream) {\n  time_t clock;\n  time(&clock);\n  struct tm tm_struct;\n#ifdef _WIN32\n  localtime_s(&tm_struct, &clock);\n#else\n  localtime_r(&clock, &tm_struct);\n#endif\n  char time_string[20];\n  strftime(time_string, sizeof(time_string), \"%Y-%m-%d %H:%M:%S\", &tm_struct);\n\n  const char *severity_string = \"UNKNOWN_SEVERITY\";\n  switch (severity) {\n    case SEVERITY_INFO:\n      severity_string = \"INFO\";\n      break;\n    case SEVERITY_ERROR:\n      severity_string = \"ERROR\";\n      break;\n  }\n\n  stream_ << time_string << \": \" << PathnameStripper::File(file) << \":\" <<\n             line << \": \" << severity_string << \": \";\n}\n\nLogStream::~LogStream() {\n  stream_ << std::endl;\n}\n\nstd::string HexString(u_int32_t number) {\n  char buffer[11];\n  snprintf(buffer, sizeof(buffer), \"0x%x\", number);\n  return std::string(buffer);\n}\n\nstd::string HexString(u_int64_t number) {\n  char buffer[19];\n  snprintf(buffer, sizeof(buffer), \"0x%\" PRIx64, number);\n  return std::string(buffer);\n}\n\nstd::string HexString(int number) {\n  char buffer[19];\n  snprintf(buffer, sizeof(buffer), \"0x%x\", number);\n  return std::string(buffer);\n}\n\nint ErrnoString(std::string *error_string) {\n  assert(error_string);\n\n  // strerror isn't necessarily thread-safe.  strerror_r would be preferrable,\n  // but GNU libc uses a nonstandard strerror_r by default, which returns a\n  // char* (rather than an int success indicator) and doesn't necessarily\n  // use the supplied buffer.\n  error_string->assign(strerror(errno));\n  return errno;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/logging.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// logging.h: Breakpad logging\n//\n// Breakpad itself uses Breakpad logging with statements of the form:\n//   BPLOG(severity) << \"message\";\n// severity may be INFO, ERROR, or other values defined in this file.\n//\n// BPLOG is an overridable macro so that users can customize Breakpad's\n// logging.  Left at the default, logging messages are sent to stderr along\n// with a timestamp and the source code location that produced a message.\n// The streams may be changed by redefining BPLOG_*_STREAM, the logging\n// behavior may be changed by redefining BPLOG_*, and the entire logging\n// system may be overridden by redefining BPLOG(severity).  These\n// redefinitions may be passed to the preprocessor as a command-line flag\n// (-D).\n//\n// If an additional header is required to override Breakpad logging, it can\n// be specified by the BP_LOGGING_INCLUDE macro.  If defined, this header\n// will #include the header specified by that macro.\n//\n// If any initialization is needed before logging, it can be performed by\n// a function called through the BPLOG_INIT macro.  Each main function of\n// an executable program in the Breakpad processor library calls\n// BPLOG_INIT(&argc, &argv); before any logging can be performed; define\n// BPLOG_INIT appropriately if initialization is required.\n//\n// Author: Mark Mentovai\n\n#ifndef PROCESSOR_LOGGING_H__\n#define PROCESSOR_LOGGING_H__\n\n#include <iostream>\n#include <string>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n\n#ifdef BP_LOGGING_INCLUDE\n#include BP_LOGGING_INCLUDE\n#endif  // BP_LOGGING_INCLUDE\n\nnamespace google_breakpad {\n\n// These are defined in Microsoft headers.\n#ifdef SEVERITY_ERROR\n#undef SEVERITY_ERROR\n#endif\n\n#ifdef ERROR\n#undef ERROR\n#endif\n\nclass LogStream {\n public:\n  enum Severity {\n    SEVERITY_INFO,\n    SEVERITY_ERROR\n  };\n\n  // Begin logging a message to the stream identified by |stream|, at the\n  // indicated severity.  The file and line parameters should be set so as to\n  // identify the line of source code that is producing a message.\n  LogStream(std::ostream &stream, Severity severity,\n            const char *file, int line);\n\n  // Finish logging by printing a newline and flushing the output stream.\n  ~LogStream();\n\n  template<typename T> std::ostream& operator<<(const T &t) {\n    return stream_ << t;\n  }\n\n private:\n  std::ostream &stream_;\n\n  // Disallow copy constructor and assignment operator\n  explicit LogStream(const LogStream &that);\n  void operator=(const LogStream &that);\n};\n\n// This class is used to explicitly ignore values in the conditional logging\n// macros.  This avoids compiler warnings like \"value computed is not used\"\n// and \"statement has no effect\".\nclass LogMessageVoidify {\n public:\n  LogMessageVoidify() {}\n\n  // This has to be an operator with a precedence lower than << but higher\n  // than ?:\n  void operator&(std::ostream &) {}\n};\n\n// Returns number formatted as a hexadecimal string, such as \"0x7b\".\nstd::string HexString(u_int32_t number);\nstd::string HexString(u_int64_t number);\nstd::string HexString(int number);\n\n// Returns the error code as set in the global errno variable, and sets\n// error_string, a required argument, to a string describing that error\n// code.\nint ErrnoString(std::string *error_string);\n\n}  // namespace google_breakpad\n\n#ifndef BPLOG_INIT\n#define BPLOG_INIT(pargc, pargv)\n#endif  // BPLOG_INIT\n\n#ifndef BPLOG\n#define BPLOG(severity) BPLOG_ ## severity\n#endif  // BPLOG\n\n#ifndef BPLOG_INFO\n#ifndef BPLOG_INFO_STREAM\n#define BPLOG_INFO_STREAM std::clog\n#endif  // BPLOG_INFO_STREAM\n#define BPLOG_INFO google_breakpad::LogStream(BPLOG_INFO_STREAM, \\\n                       google_breakpad::LogStream::SEVERITY_INFO, \\\n                       __FILE__, __LINE__)\n#endif  // BPLOG_INFO\n\n#ifndef BPLOG_ERROR\n#ifndef BPLOG_ERROR_STREAM\n#define BPLOG_ERROR_STREAM std::cerr\n#endif  // BPLOG_ERROR_STREAM\n#define BPLOG_ERROR google_breakpad::LogStream(BPLOG_ERROR_STREAM, \\\n                        google_breakpad::LogStream::SEVERITY_ERROR, \\\n                        __FILE__, __LINE__)\n#endif  // BPLOG_ERROR\n\n#define BPLOG_IF(severity, condition) \\\n    !(condition) ? (void) 0 : \\\n                   google_breakpad::LogMessageVoidify() & BPLOG(severity)\n\n#endif  // PROCESSOR_LOGGING_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/map_serializers-inl.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// map_serializers_inl.h: implementation for serializing std::map and its\n// wrapper classes.\n//\n// See map_serializers.h for documentation.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef PROCESSOR_MAP_SERIALIZERS_INL_H__\n#define PROCESSOR_MAP_SERIALIZERS_INL_H__\n\n#include <map>\n#include <string>\n\n#include \"processor/map_serializers.h\"\n#include \"processor/simple_serializer.h\"\n\n#include \"processor/address_map-inl.h\"\n#include \"processor/range_map-inl.h\"\n#include \"processor/contained_range_map-inl.h\"\n\n#include \"processor/logging.h\"\n\nnamespace google_breakpad {\n\ntemplate<typename Key, typename Value>\nsize_t StdMapSerializer<Key, Value>::SizeOf(\n    const std::map<Key, Value> &m) const {\n  size_t size = 0;\n  size_t header_size = (1 + m.size()) * sizeof(u_int32_t);\n  size += header_size;\n\n  typename std::map<Key, Value>::const_iterator iter;\n  for (iter = m.begin(); iter != m.end(); ++iter) {\n    size += key_serializer_.SizeOf(iter->first);\n    size += value_serializer_.SizeOf(iter->second);\n  }\n  return size;\n}\n\ntemplate<typename Key, typename Value>\nchar *StdMapSerializer<Key, Value>::Write(const std::map<Key, Value> &m,\n                                          char *dest) const {\n  if (!dest) {\n    BPLOG(ERROR) << \"StdMapSerializer failed: write to NULL address.\";\n    return NULL;\n  }\n  char *start_address = dest;\n\n  // Write header:\n  // Number of nodes.\n  dest = SimpleSerializer<u_int32_t>::Write(m.size(), dest);\n  // Nodes offsets.\n  u_int32_t *offsets = reinterpret_cast<u_int32_t*>(dest);\n  dest += sizeof(u_int32_t) * m.size();\n\n  char *key_address = dest;\n  dest += sizeof(Key) * m.size();\n\n  // Traverse map.\n  typename std::map<Key, Value>::const_iterator iter;\n  int index = 0;\n  for (iter = m.begin(); iter != m.end(); ++iter, ++index) {\n    offsets[index] = static_cast<u_int32_t>(dest - start_address);\n    key_address = key_serializer_.Write(iter->first, key_address);\n    dest = value_serializer_.Write(iter->second, dest);\n  }\n  return dest;\n}\n\ntemplate<typename Key, typename Value>\nchar *StdMapSerializer<Key, Value>::Serialize(\n    const std::map<Key, Value> &m, unsigned int *size) const {\n  // Compute size of memory to be allocated.\n  unsigned int size_to_alloc = SizeOf(m);\n  // Allocate memory.\n  char *serialized_data = new char[size_to_alloc];\n  if (!serialized_data) {\n    BPLOG(INFO) << \"StdMapSerializer memory allocation failed.\";\n    if (size) *size = 0;\n    return NULL;\n  }\n  // Write serialized data into memory.\n  Write(m, serialized_data);\n\n  if (size) *size = size_to_alloc;\n  return serialized_data;\n}\n\ntemplate<typename Address, typename Entry>\nsize_t RangeMapSerializer<Address, Entry>::SizeOf(\n    const RangeMap<Address, Entry> &m) const {\n  size_t size = 0;\n  size_t header_size = (1 + m.map_.size()) * sizeof(u_int32_t);\n  size += header_size;\n\n  typename std::map<Address, Range>::const_iterator iter;\n  for (iter = m.map_.begin(); iter != m.map_.end(); ++iter) {\n    // Size of key (high address).\n    size += address_serializer_.SizeOf(iter->first);\n    // Size of base (low address).\n    size += address_serializer_.SizeOf(iter->second.base());\n    // Size of entry.\n    size += entry_serializer_.SizeOf(iter->second.entry());\n  }\n  return size;\n}\n\ntemplate<typename Address, typename Entry>\nchar *RangeMapSerializer<Address, Entry>::Write(\n    const RangeMap<Address, Entry> &m, char *dest) const {\n  if (!dest) {\n    BPLOG(ERROR) << \"RangeMapSerializer failed: write to NULL address.\";\n    return NULL;\n  }\n  char *start_address = dest;\n\n  // Write header:\n  // Number of nodes.\n  dest = SimpleSerializer<u_int32_t>::Write(m.map_.size(), dest);\n  // Nodes offsets.\n  u_int32_t *offsets = reinterpret_cast<u_int32_t*>(dest);\n  dest += sizeof(u_int32_t) * m.map_.size();\n\n  char *key_address = dest;\n  dest += sizeof(Address) * m.map_.size();\n\n  // Traverse map.\n  typename std::map<Address, Range>::const_iterator iter;\n  int index = 0;\n  for (iter = m.map_.begin(); iter != m.map_.end(); ++iter, ++index) {\n    offsets[index] = static_cast<u_int32_t>(dest - start_address);\n    key_address = address_serializer_.Write(iter->first, key_address);\n    dest = address_serializer_.Write(iter->second.base(), dest);\n    dest = entry_serializer_.Write(iter->second.entry(), dest);\n  }\n  return dest;\n}\n\ntemplate<typename Address, typename Entry>\nchar *RangeMapSerializer<Address, Entry>::Serialize(\n    const RangeMap<Address, Entry> &m, unsigned int *size) const {\n  // Compute size of memory to be allocated.\n  unsigned int size_to_alloc = SizeOf(m);\n  // Allocate memory.\n  char *serialized_data = new char[size_to_alloc];\n  if (!serialized_data) {\n    BPLOG(INFO) << \"RangeMapSerializer memory allocation failed.\";\n    if (size) *size = 0;\n    return NULL;\n  }\n\n  // Write serialized data into memory.\n  Write(m, serialized_data);\n\n  if (size) *size = size_to_alloc;\n  return serialized_data;\n}\n\n\ntemplate<class AddrType, class EntryType>\nsize_t ContainedRangeMapSerializer<AddrType, EntryType>::SizeOf(\n    const ContainedRangeMap<AddrType, EntryType> *m) const {\n  size_t size = 0;\n  size_t header_size = addr_serializer_.SizeOf(m->base_)\n                       + entry_serializer_.SizeOf(m->entry_)\n                       + sizeof(u_int32_t);\n  size += header_size;\n  // In case m.map_ == NULL, we treat it as an empty map:\n  size += sizeof(u_int32_t);\n  if (m->map_) {\n    size += m->map_->size() * sizeof(u_int32_t);\n    typename Map::const_iterator iter;\n    for (iter = m->map_->begin(); iter != m->map_->end(); ++iter) {\n      size += addr_serializer_.SizeOf(iter->first);\n      // Recursive calculation of size:\n      size += SizeOf(iter->second);\n    }\n  }\n  return size;\n}\n\ntemplate<class AddrType, class EntryType>\nchar *ContainedRangeMapSerializer<AddrType, EntryType>::Write(\n    const ContainedRangeMap<AddrType, EntryType> *m, char *dest) const {\n  if (!dest) {\n    BPLOG(ERROR) << \"StdMapSerializer failed: write to NULL address.\";\n    return NULL;\n  }\n  dest = addr_serializer_.Write(m->base_, dest);\n  dest = SimpleSerializer<u_int32_t>::Write(entry_serializer_.SizeOf(m->entry_),\n                                            dest);\n  dest = entry_serializer_.Write(m->entry_, dest);\n\n  // Write map<<AddrType, ContainedRangeMap*>:\n  char *map_address = dest;\n  if (m->map_ == NULL) {\n    dest = SimpleSerializer<u_int32_t>::Write(0, dest);\n  } else {\n    dest = SimpleSerializer<u_int32_t>::Write(m->map_->size(), dest);\n    u_int32_t *offsets = reinterpret_cast<u_int32_t*>(dest);\n    dest += sizeof(u_int32_t) * m->map_->size();\n\n    char *key_address = dest;\n    dest += sizeof(AddrType) * m->map_->size();\n\n    // Traverse map.\n    typename Map::const_iterator iter;\n    int index = 0;\n    for (iter = m->map_->begin(); iter != m->map_->end(); ++iter, ++index) {\n      offsets[index] = static_cast<u_int32_t>(dest - map_address);\n      key_address = addr_serializer_.Write(iter->first, key_address);\n      // Recursively write.\n      dest = Write(iter->second, dest);\n    }\n  }\n  return dest;\n}\n\ntemplate<class AddrType, class EntryType>\nchar *ContainedRangeMapSerializer<AddrType, EntryType>::Serialize(\n    const ContainedRangeMap<AddrType, EntryType> *m, unsigned int *size) const {\n  unsigned int size_to_alloc = SizeOf(m);\n  // Allocating memory.\n  char *serialized_data = new char[size_to_alloc];\n  if (!serialized_data) {\n    BPLOG(INFO) << \"ContainedRangeMapSerializer memory allocation failed.\";\n    if (size) *size = 0;\n    return NULL;\n  }\n  Write(m, serialized_data);\n  if (size) *size = size_to_alloc;\n  return serialized_data;\n}\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_MAP_SERIALIZERS_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/map_serializers.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// map_serializers.h: defines templates for serializing std::map and its\n// wrappers: AddressMap, RangeMap, and ContainedRangeMap.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n\n#ifndef PROCESSOR_MAP_SERIALIZERS_H__\n#define PROCESSOR_MAP_SERIALIZERS_H__\n\n#include <map>\n#include <string>\n\n#include \"processor/simple_serializer.h\"\n\n#include \"processor/address_map-inl.h\"\n#include \"processor/range_map-inl.h\"\n#include \"processor/contained_range_map-inl.h\"\n\nnamespace google_breakpad {\n\n// StdMapSerializer allocates memory and serializes an std::map instance into a\n// chunk of memory data.\ntemplate<typename Key, typename Value>\nclass StdMapSerializer {\n public:\n  // Calculate the memory size of serialized data.\n  size_t SizeOf(const std::map<Key, Value> &m) const;\n\n  // Writes the serialized data to memory with start address = dest,\n  // and returns the \"end\" of data, i.e., return the address follow the final\n  // byte of data.\n  // NOTE: caller has to allocate enough memory before invoke Write() method.\n  char* Write(const std::map<Key, Value> &m, char* dest) const;\n\n  // Serializes a std::map object into a chunk of memory data with format\n  // described in \"StaticMap.h\" comment.\n  // Returns a pointer to the serialized data.  If size != NULL, *size is set\n  // to the size of serialized data, i.e., SizeOf(m).\n  // Caller has the ownership of memory allocated as \"new char[]\".\n  char* Serialize(const std::map<Key, Value> &m, unsigned int *size) const;\n\n private:\n  SimpleSerializer<Key> key_serializer_;\n  SimpleSerializer<Value> value_serializer_;\n};\n\n// AddressMapSerializer allocates memory and serializes an AddressMap into a\n// chunk of memory data.\ntemplate<typename Addr, typename Entry>\nclass AddressMapSerializer {\n public:\n  // Calculate the memory size of serialized data.\n  size_t SizeOf(const AddressMap<Addr, Entry> &m) const {\n    return std_map_serializer_.SizeOf(m.map_);\n  }\n\n  // Write the serialized data to specified memory location.  Return the \"end\"\n  // of data, i.e., return the address after the final byte of data.\n  // NOTE: caller has to allocate enough memory before invoke Write() method.\n  char* Write(const AddressMap<Addr, Entry> &m, char *dest) const {\n    return std_map_serializer_.Write(m.map_, dest);\n  }\n\n  // Serializes an AddressMap object into a chunk of memory data.\n  // Returns a pointer to the serialized data.  If size != NULL, *size is set\n  // to the size of serialized data, i.e., SizeOf(m).\n  // Caller has the ownership of memory allocated as \"new char[]\".\n  char* Serialize(const AddressMap<Addr, Entry> &m, unsigned int *size) const {\n    return std_map_serializer_.Serialize(m.map_, size);\n  }\n\n private:\n  // AddressMapSerializer is a simple wrapper of StdMapSerializer, just as\n  // AddressMap is a simple wrapper of std::map.\n  StdMapSerializer<Addr, Entry> std_map_serializer_;\n};\n\n// RangeMapSerializer allocates memory and serializes a RangeMap instance into a\n// chunk of memory data.\ntemplate<typename Address, typename Entry>\nclass RangeMapSerializer {\n public:\n  // Calculate the memory size of serialized data.\n  size_t SizeOf(const RangeMap<Address, Entry> &m) const;\n\n  // Write the serialized data to specified memory location.  Return the \"end\"\n  // of data, i.e., return the address after the final byte of data.\n  // NOTE: caller has to allocate enough memory before invoke Write() method.\n  char* Write(const RangeMap<Address, Entry> &m, char* dest) const;\n\n  // Serializes a RangeMap object into a chunk of memory data.\n  // Returns a pointer to the serialized data.  If size != NULL, *size is set\n  // to the size of serialized data, i.e., SizeOf(m).\n  // Caller has the ownership of memory allocated as \"new char[]\".\n  char* Serialize(const RangeMap<Address, Entry> &m, unsigned int *size) const;\n\n private:\n  // Convenient type name for Range.\n  typedef typename RangeMap<Address, Entry>::Range Range;\n\n  // Serializer for RangeMap's key and Range::base_.\n  SimpleSerializer<Address> address_serializer_;\n  // Serializer for RangeMap::Range::entry_.\n  SimpleSerializer<Entry> entry_serializer_;\n};\n\n// ContainedRangeMapSerializer allocates memory and serializes a\n// ContainedRangeMap instance into a chunk of memory data.\ntemplate<class AddrType, class EntryType>\nclass ContainedRangeMapSerializer {\n public:\n  // Calculate the memory size of serialized data.\n  size_t SizeOf(const ContainedRangeMap<AddrType, EntryType> *m) const;\n\n  // Write the serialized data to specified memory location.  Return the \"end\"\n  // of data, i.e., return the address after the final byte of data.\n  // NOTE: caller has to allocate enough memory before invoke Write() method.\n  char* Write(const ContainedRangeMap<AddrType, EntryType> *m,\n              char* dest) const;\n\n  // Serializes a ContainedRangeMap object into a chunk of memory data.\n  // Returns a pointer to the serialized data.  If size != NULL, *size is set\n  // to the size of serialized data, i.e., SizeOf(m).\n  // Caller has the ownership of memory allocated as \"new char[]\".\n  char* Serialize(const ContainedRangeMap<AddrType, EntryType> *m,\n                  unsigned int *size) const;\n\n private:\n  // Convenient type name for the underlying map type.\n  typedef std::map<AddrType, ContainedRangeMap<AddrType, EntryType>*> Map;\n\n  // Serializer for addresses and entries stored in ContainedRangeMap.\n  SimpleSerializer<AddrType> addr_serializer_;\n  SimpleSerializer<EntryType> entry_serializer_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_MAP_SERIALIZERS_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/map_serializers_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// map_serializers_unittest.cc: Unit tests for std::map serializer and\n// std::map wrapper serializers.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#include <climits>\n#include <map>\n#include <string>\n#include <utility>\n#include <iostream>\n#include <sstream>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"map_serializers-inl.h\"\n\n#include \"processor/address_map-inl.h\"\n#include \"processor/range_map-inl.h\"\n#include \"processor/contained_range_map-inl.h\"\n\ntypedef int32_t AddrType;\ntypedef int32_t EntryType;\n\nconst int kSizeOfInt = 4;\n\nclass TestStdMapSerializer : public ::testing::Test {\n protected:\n  void SetUp() {\n    serialized_size_ = 0;\n    serialized_data_ = NULL;\n  }\n\n  void TearDown() {\n    delete [] serialized_data_;\n  }\n\n  std::map<AddrType, EntryType> std_map_;\n  google_breakpad::StdMapSerializer<AddrType, EntryType> serializer_;\n  u_int32_t serialized_size_;\n  char *serialized_data_;\n};\n\nTEST_F(TestStdMapSerializer, EmptyMapTestCase) {\n  const int32_t correct_data[] = { 0 };\n  u_int32_t correct_size = sizeof(correct_data);\n\n  // std_map_ is empty.\n  serialized_data_ = serializer_.Serialize(std_map_, &serialized_size_);\n\n  EXPECT_EQ(correct_size, serialized_size_);\n  EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);\n}\n\nTEST_F(TestStdMapSerializer, MapWithTwoElementsTestCase) {\n  const int32_t correct_data[] = {\n      // # of nodes\n      2,\n      // Offsets\n      20, 24,\n      // Keys\n      1, 3,\n      // Values\n      2, 6\n  };\n  u_int32_t correct_size = sizeof(correct_data);\n\n  std_map_.insert(std::make_pair(1, 2));\n  std_map_.insert(std::make_pair(3, 6));\n\n  serialized_data_ = serializer_.Serialize(std_map_, &serialized_size_);\n\n  EXPECT_EQ(correct_size, serialized_size_);\n  EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);\n}\n\nTEST_F(TestStdMapSerializer, MapWithFiveElementsTestCase) {\n  const int32_t correct_data[] = {\n      // # of nodes\n      5,\n      // Offsets\n      44, 48, 52, 56, 60,\n      // Keys\n      1, 2, 3, 4, 5,\n      // Values\n      11, 12, 13, 14, 15\n  };\n  u_int32_t correct_size = sizeof(correct_data);\n\n  for (int i = 1; i < 6; ++i)\n    std_map_.insert(std::make_pair(i, 10 + i));\n\n  serialized_data_ = serializer_.Serialize(std_map_, &serialized_size_);\n\n  EXPECT_EQ(correct_size, serialized_size_);\n  EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);\n}\n\nclass TestAddressMapSerializer : public ::testing::Test {\n protected:\n  void SetUp() {\n    serialized_size_ = 0;\n    serialized_data_ = 0;\n  }\n\n  void TearDown() {\n    delete [] serialized_data_;\n  }\n\n  google_breakpad::AddressMap<AddrType, EntryType> address_map_;\n  google_breakpad::AddressMapSerializer<AddrType, EntryType> serializer_;\n  u_int32_t serialized_size_;\n  char *serialized_data_;\n};\n\nTEST_F(TestAddressMapSerializer, EmptyMapTestCase) {\n  const int32_t correct_data[] = { 0 };\n  u_int32_t correct_size = sizeof(correct_data);\n\n  // std_map_ is empty.\n  serialized_data_ = serializer_.Serialize(address_map_, &serialized_size_);\n\n  EXPECT_EQ(correct_size, serialized_size_);\n  EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);\n}\n\nTEST_F(TestAddressMapSerializer, MapWithTwoElementsTestCase) {\n  const int32_t correct_data[] = {\n      // # of nodes\n      2,\n      // Offsets\n      20, 24,\n      // Keys\n      1, 3,\n      // Values\n      2, 6\n  };\n  u_int32_t correct_size = sizeof(correct_data);\n\n  address_map_.Store(1, 2);\n  address_map_.Store(3, 6);\n\n  serialized_data_ = serializer_.Serialize(address_map_, &serialized_size_);\n\n  EXPECT_EQ(correct_size, serialized_size_);\n  EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);\n}\n\nTEST_F(TestAddressMapSerializer, MapWithFourElementsTestCase) {\n  const int32_t correct_data[] = {\n      // # of nodes\n      4,\n      // Offsets\n      36, 40, 44, 48,\n      // Keys\n      -6, -4, 8, 123,\n      // Values\n      2, 3, 5, 8\n  };\n  u_int32_t correct_size = sizeof(correct_data);\n\n  address_map_.Store(-6, 2);\n  address_map_.Store(-4, 3);\n  address_map_.Store(8, 5);\n  address_map_.Store(123, 8);\n\n  serialized_data_ = serializer_.Serialize(address_map_, &serialized_size_);\n\n  EXPECT_EQ(correct_size, serialized_size_);\n  EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);\n}\n\n\nclass TestRangeMapSerializer : public ::testing::Test {\n protected:\n  void SetUp() {\n    serialized_size_ = 0;\n    serialized_data_ = 0;\n  }\n\n  void TearDown() {\n    delete [] serialized_data_;\n  }\n\n  google_breakpad::RangeMap<AddrType, EntryType> range_map_;\n  google_breakpad::RangeMapSerializer<AddrType, EntryType> serializer_;\n  u_int32_t serialized_size_;\n  char *serialized_data_;\n};\n\nTEST_F(TestRangeMapSerializer, EmptyMapTestCase) {\n  const int32_t correct_data[] = { 0 };\n  u_int32_t correct_size = sizeof(correct_data);\n\n  // range_map_ is empty.\n  serialized_data_ = serializer_.Serialize(range_map_, &serialized_size_);\n\n  EXPECT_EQ(correct_size, serialized_size_);\n  EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);\n}\n\nTEST_F(TestRangeMapSerializer, MapWithOneRangeTestCase) {\n  const int32_t correct_data[] = {\n      // # of nodes\n      1,\n      // Offsets\n      12,\n      // Keys: high address\n      10,\n      // Values: (low address, entry) pairs\n      1, 6\n  };\n  u_int32_t correct_size = sizeof(correct_data);\n\n  range_map_.StoreRange(1, 10, 6);\n\n  serialized_data_ = serializer_.Serialize(range_map_, &serialized_size_);\n\n  EXPECT_EQ(correct_size, serialized_size_);\n  EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);\n}\n\nTEST_F(TestRangeMapSerializer, MapWithThreeRangesTestCase) {\n  const int32_t correct_data[] = {\n      // # of nodes\n      3,\n      // Offsets\n      28,    36,    44,\n      // Keys: high address\n      5,     9,     20,\n      // Values: (low address, entry) pairs\n      2, 1,  6, 2,  10, 3\n  };\n  u_int32_t correct_size = sizeof(correct_data);\n\n  ASSERT_TRUE(range_map_.StoreRange(2, 4, 1));\n  ASSERT_TRUE(range_map_.StoreRange(6, 4, 2));\n  ASSERT_TRUE(range_map_.StoreRange(10, 11, 3));\n\n  serialized_data_ = serializer_.Serialize(range_map_, &serialized_size_);\n\n  EXPECT_EQ(correct_size, serialized_size_);\n  EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);\n}\n\n\nclass TestContainedRangeMapSerializer : public ::testing::Test {\n protected:\n  void SetUp() {\n    serialized_size_ = 0;\n    serialized_data_ = 0;\n  }\n\n  void TearDown() {\n    delete [] serialized_data_;\n  }\n\n  google_breakpad::ContainedRangeMap<AddrType, EntryType> crm_map_;\n  google_breakpad::ContainedRangeMapSerializer<AddrType, EntryType> serializer_;\n  u_int32_t serialized_size_;\n  char *serialized_data_;\n};\n\nTEST_F(TestContainedRangeMapSerializer, EmptyMapTestCase) {\n  const int32_t correct_data[] = {\n      0,  // base address of root\n      4,  // size of entry\n      0,  // entry stored at root\n      0   // empty map stored at root\n  };\n  u_int32_t correct_size = sizeof(correct_data);\n\n  // crm_map_ is empty.\n  serialized_data_ = serializer_.Serialize(&crm_map_, &serialized_size_);\n\n  EXPECT_EQ(correct_size, serialized_size_);\n  EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);\n}\n\nTEST_F(TestContainedRangeMapSerializer, MapWithOneRangeTestCase) {\n  const int32_t correct_data[] = {\n      0,  // base address of root\n      4,  // size of entry\n      0,  // entry stored at root\n      // Map stored at root node:\n      1,  // # of nodes\n      12, // offset\n      9,  // key\n      // value: a child ContainedRangeMap\n      3,  // base address of child CRM\n      4,  // size of entry\n      -1, // entry stored in child CRM\n      0   // empty sub-map stored in child CRM\n  };\n  u_int32_t correct_size = sizeof(correct_data);\n\n  crm_map_.StoreRange(3, 7, -1);\n\n  serialized_data_ = serializer_.Serialize(&crm_map_, &serialized_size_);\n\n  EXPECT_EQ(correct_size, serialized_size_);\n  EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);\n}\n\nTEST_F(TestContainedRangeMapSerializer, MapWithTwoLevelsTestCase) {\n  // Tree structure of ranges:\n  //           root              level 0\n  //            |\n  //           map\n  //         /     \\             level 1: child1, child2\n  //      2~8      10~20\n  //       |         |\n  //      map       map\n  //     /   \\       |\n  //    3~4 6~7    16-20         level 2: grandchild1, grandchild2, grandchild3\n\n  const int32_t correct_data[] = {\n      // root: base, entry_size, entry\n      0, 4, 0,\n      // root's map: # of nodes, offset1, offset2, key1, key2\n      2, 20, 84, 8, 20,\n      // child1: base, entry_size, entry:\n      2, 4, -1,\n      // child1's map: # of nodes, offset1, offset2, key1, key2\n      2, 20, 36, 4, 7,\n        // grandchild1: base, entry_size, entry, empty_map\n        3, 4, -1, 0,\n        // grandchild2: base, entry_size, entry, empty_map\n        6, 4, -1, 0,\n      // child2: base, entry_size, entry:\n      10, 4, -1,\n      // child2's map: # of nodes, offset1, key1\n      1, 12, 20,\n        // grandchild3: base, entry_size, entry, empty_map\n        16, 4, -1, 0\n  };\n  u_int32_t correct_size = sizeof(correct_data);\n\n  // Store child1.\n  ASSERT_TRUE(crm_map_.StoreRange(2, 7, -1));\n  // Store child2.\n  ASSERT_TRUE(crm_map_.StoreRange(10, 11, -1));\n  // Store grandchild1.\n  ASSERT_TRUE(crm_map_.StoreRange(3, 2, -1));\n  // Store grandchild2.\n  ASSERT_TRUE(crm_map_.StoreRange(6, 2, -1));\n  // Store grandchild3.\n  ASSERT_TRUE(crm_map_.StoreRange(16, 5, -1));\n\n  serialized_data_ = serializer_.Serialize(&crm_map_, &serialized_size_);\n\n  EXPECT_EQ(correct_size, serialized_size_);\n  EXPECT_EQ(memcmp(correct_data, serialized_data_, correct_size), 0);\n}\n\n\nint main(int argc, char *argv[]) {\n  ::testing::InitGoogleTest(&argc, argv);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/minidump.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// minidump.cc: A minidump reader.\n//\n// See minidump.h for documentation.\n//\n// Author: Mark Mentovai\n\n#include \"google_breakpad/processor/minidump.h\"\n\n#include <assert.h>\n#include <fcntl.h>\n#include <stdio.h>\n#include <string.h>\n#include <time.h>\n\n#ifdef _WIN32\n#include <io.h>\ntypedef SSIZE_T ssize_t;\n#define PRIx64 \"llx\"\n#define PRIx32 \"lx\"\n#define snprintf _snprintf\n#else  // _WIN32\n#include <unistd.h>\n#define O_BINARY 0\n#endif  // _WIN32\n\n#include <fstream>\n#include <iostream>\n#include <limits>\n#include <map>\n#include <vector>\n\n#include \"processor/range_map-inl.h\"\n\n#include \"processor/basic_code_module.h\"\n#include \"processor/basic_code_modules.h\"\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n\n\nnamespace google_breakpad {\n\n\nusing std::istream;\nusing std::ifstream;\nusing std::numeric_limits;\nusing std::vector;\n\n\n//\n// Swapping routines\n//\n// Inlining these doesn't increase code size significantly, and it saves\n// a whole lot of unnecessary jumping back and forth.\n//\n\n\n// Swapping an 8-bit quantity is a no-op.  This function is only provided\n// to account for certain templatized operations that require swapping for\n// wider types but handle u_int8_t too\n// (MinidumpMemoryRegion::GetMemoryAtAddressInternal).\nstatic inline void Swap(u_int8_t* value) {\n}\n\n\n// Optimization: don't need to AND the furthest right shift, because we're\n// shifting an unsigned quantity.  The standard requires zero-filling in this\n// case.  If the quantities were signed, a bitmask whould be needed for this\n// right shift to avoid an arithmetic shift (which retains the sign bit).\n// The furthest left shift never needs to be ANDed bitmask.\n\n\nstatic inline void Swap(u_int16_t* value) {\n  *value = (*value >> 8) |\n           (*value << 8);\n}\n\n\nstatic inline void Swap(u_int32_t* value) {\n  *value =  (*value >> 24) |\n           ((*value >> 8)  & 0x0000ff00) |\n           ((*value << 8)  & 0x00ff0000) |\n            (*value << 24);\n}\n\n\nstatic inline void Swap(u_int64_t* value) {\n  u_int32_t* value32 = reinterpret_cast<u_int32_t*>(value);\n  Swap(&value32[0]);\n  Swap(&value32[1]);\n  u_int32_t temp = value32[0];\n  value32[0] = value32[1];\n  value32[1] = temp;\n}\n\n\n// Given a pointer to a 128-bit int in the minidump data, set the \"low\"\n// and \"high\" fields appropriately.\nstatic void Normalize128(u_int128_t* value, bool is_big_endian) {\n  // The struct format is [high, low], so if the format is big-endian,\n  // the most significant bytes will already be in the high field.\n  if (!is_big_endian) {\n    u_int64_t temp = value->low;\n    value->low = value->high;\n    value->high = temp;\n  }\n}\n\n// This just swaps each int64 half of the 128-bit value.\n// The value should also be normalized by calling Normalize128().\nstatic void Swap(u_int128_t* value) {\n  Swap(&value->low);\n  Swap(&value->high);\n}\n\n\nstatic inline void Swap(MDLocationDescriptor* location_descriptor) {\n  Swap(&location_descriptor->data_size);\n  Swap(&location_descriptor->rva);\n}\n\n\nstatic inline void Swap(MDMemoryDescriptor* memory_descriptor) {\n  Swap(&memory_descriptor->start_of_memory_range);\n  Swap(&memory_descriptor->memory);\n}\n\n\nstatic inline void Swap(MDGUID* guid) {\n  Swap(&guid->data1);\n  Swap(&guid->data2);\n  Swap(&guid->data3);\n  // Don't swap guid->data4[] because it contains 8-bit quantities.\n}\n\n\n//\n// Character conversion routines\n//\n\n\n// Standard wide-character conversion routines depend on the system's own\n// idea of what width a wide character should be: some use 16 bits, and\n// some use 32 bits.  For the purposes of a minidump, wide strings are\n// always represented with 16-bit UTF-16 chracters.  iconv isn't available\n// everywhere, and its interface varies where it is available.  iconv also\n// deals purely with char* pointers, so in addition to considering the swap\n// parameter, a converter that uses iconv would also need to take the host\n// CPU's endianness into consideration.  It doesn't seems worth the trouble\n// of making it a dependency when we don't care about anything but UTF-16.\nstatic string* UTF16ToUTF8(const vector<u_int16_t>& in,\n                           bool                     swap) {\n  scoped_ptr<string> out(new string());\n\n  // Set the string's initial capacity to the number of UTF-16 characters,\n  // because the UTF-8 representation will always be at least this long.\n  // If the UTF-8 representation is longer, the string will grow dynamically.\n  out->reserve(in.size());\n\n  for (vector<u_int16_t>::const_iterator iterator = in.begin();\n       iterator != in.end();\n       ++iterator) {\n    // Get a 16-bit value from the input\n    u_int16_t in_word = *iterator;\n    if (swap)\n      Swap(&in_word);\n\n    // Convert the input value (in_word) into a Unicode code point (unichar).\n    u_int32_t unichar;\n    if (in_word >= 0xdc00 && in_word <= 0xdcff) {\n      BPLOG(ERROR) << \"UTF16ToUTF8 found low surrogate \" <<\n                      HexString(in_word) << \" without high\";\n      return NULL;\n    } else if (in_word >= 0xd800 && in_word <= 0xdbff) {\n      // High surrogate.\n      unichar = (in_word - 0xd7c0) << 10;\n      if (++iterator == in.end()) {\n        BPLOG(ERROR) << \"UTF16ToUTF8 found high surrogate \" <<\n                        HexString(in_word) << \" at end of string\";\n        return NULL;\n      }\n      u_int32_t high_word = in_word;\n      in_word = *iterator;\n      if (in_word < 0xdc00 || in_word > 0xdcff) {\n        BPLOG(ERROR) << \"UTF16ToUTF8 found high surrogate \" <<\n                        HexString(high_word) << \" without low \" <<\n                        HexString(in_word);\n        return NULL;\n      }\n      unichar |= in_word & 0x03ff;\n    } else {\n      // The ordinary case, a single non-surrogate Unicode character encoded\n      // as a single 16-bit value.\n      unichar = in_word;\n    }\n\n    // Convert the Unicode code point (unichar) into its UTF-8 representation,\n    // appending it to the out string.\n    if (unichar < 0x80) {\n      (*out) += unichar;\n    } else if (unichar < 0x800) {\n      (*out) += 0xc0 | (unichar >> 6);\n      (*out) += 0x80 | (unichar & 0x3f);\n    } else if (unichar < 0x10000) {\n      (*out) += 0xe0 | (unichar >> 12);\n      (*out) += 0x80 | ((unichar >> 6) & 0x3f);\n      (*out) += 0x80 | (unichar & 0x3f);\n    } else if (unichar < 0x200000) {\n      (*out) += 0xf0 | (unichar >> 18);\n      (*out) += 0x80 | ((unichar >> 12) & 0x3f);\n      (*out) += 0x80 | ((unichar >> 6) & 0x3f);\n      (*out) += 0x80 | (unichar & 0x3f);\n    } else {\n      BPLOG(ERROR) << \"UTF16ToUTF8 cannot represent high value \" <<\n                      HexString(unichar) << \" in UTF-8\";\n      return NULL;\n    }\n  }\n\n  return out.release();\n}\n\n// Return the smaller of the number of code units in the UTF-16 string,\n// not including the terminating null word, or maxlen.\nstatic size_t UTF16codeunits(const u_int16_t *string, size_t maxlen) {\n  size_t count = 0;\n  while (count < maxlen && string[count] != 0)\n    count++;\n  return count;\n}\n\n\n//\n// MinidumpObject\n//\n\n\nMinidumpObject::MinidumpObject(Minidump* minidump)\n    : minidump_(minidump),\n      valid_(false) {\n}\n\n\n//\n// MinidumpStream\n//\n\n\nMinidumpStream::MinidumpStream(Minidump* minidump)\n    : MinidumpObject(minidump) {\n}\n\n\n//\n// MinidumpContext\n//\n\n\nMinidumpContext::MinidumpContext(Minidump* minidump)\n    : MinidumpStream(minidump),\n      context_flags_(0),\n      context_() {\n}\n\n\nMinidumpContext::~MinidumpContext() {\n  FreeContext();\n}\n\n\nbool MinidumpContext::Read(u_int32_t expected_size) {\n  valid_ = false;\n\n  FreeContext();\n\n  // First, figure out what type of CPU this context structure is for.\n  // For some reason, the AMD64 Context doesn't have context_flags\n  // at the beginning of the structure, so special case it here.\n  if (expected_size == sizeof(MDRawContextAMD64)) {\n    BPLOG(INFO) << \"MinidumpContext: looks like AMD64 context\";\n\n    scoped_ptr<MDRawContextAMD64> context_amd64(new MDRawContextAMD64());\n    if (!minidump_->ReadBytes(context_amd64.get(),\n                              sizeof(MDRawContextAMD64))) {\n      BPLOG(ERROR) << \"MinidumpContext could not read amd64 context\";\n      return false;\n    }\n\n    if (minidump_->swap())\n      Swap(&context_amd64->context_flags);\n\n    u_int32_t cpu_type = context_amd64->context_flags & MD_CONTEXT_CPU_MASK;\n\n    if (cpu_type != MD_CONTEXT_AMD64) {\n      //TODO: fall through to switch below?\n      // need a Tell method to be able to SeekSet back to beginning\n      // http://code.google.com/p/google-breakpad/issues/detail?id=224\n      BPLOG(ERROR) << \"MinidumpContext not actually amd64 context\";\n      return false;\n    }\n\n    // Do this after reading the entire MDRawContext structure because\n    // GetSystemInfo may seek minidump to a new position.\n    if (!CheckAgainstSystemInfo(cpu_type)) {\n      BPLOG(ERROR) << \"MinidumpContext amd64 does not match system info\";\n      return false;\n    }\n\n    // Normalize the 128-bit types in the dump.\n    // Since this is AMD64, by definition, the values are little-endian.\n    for (unsigned int vr_index = 0;\n         vr_index < MD_CONTEXT_AMD64_VR_COUNT;\n         ++vr_index)\n      Normalize128(&context_amd64->vector_register[vr_index], false);\n\n    if (minidump_->swap()) {\n      Swap(&context_amd64->p1_home);\n      Swap(&context_amd64->p2_home);\n      Swap(&context_amd64->p3_home);\n      Swap(&context_amd64->p4_home);\n      Swap(&context_amd64->p5_home);\n      Swap(&context_amd64->p6_home);\n      // context_flags is already swapped\n      Swap(&context_amd64->mx_csr);\n      Swap(&context_amd64->cs);\n      Swap(&context_amd64->ds);\n      Swap(&context_amd64->es);\n      Swap(&context_amd64->fs);\n      Swap(&context_amd64->ss);\n      Swap(&context_amd64->eflags);\n      Swap(&context_amd64->dr0);\n      Swap(&context_amd64->dr1);\n      Swap(&context_amd64->dr2);\n      Swap(&context_amd64->dr3);\n      Swap(&context_amd64->dr6);\n      Swap(&context_amd64->dr7);\n      Swap(&context_amd64->rax);\n      Swap(&context_amd64->rcx);\n      Swap(&context_amd64->rdx);\n      Swap(&context_amd64->rbx);\n      Swap(&context_amd64->rsp);\n      Swap(&context_amd64->rbp);\n      Swap(&context_amd64->rsi);\n      Swap(&context_amd64->rdi);\n      Swap(&context_amd64->r8);\n      Swap(&context_amd64->r9);\n      Swap(&context_amd64->r10);\n      Swap(&context_amd64->r11);\n      Swap(&context_amd64->r12);\n      Swap(&context_amd64->r13);\n      Swap(&context_amd64->r14);\n      Swap(&context_amd64->r15);\n      Swap(&context_amd64->rip);\n      //FIXME: I'm not sure what actually determines\n      // which member of the union {flt_save, sse_registers}\n      // is valid.  We're not currently using either,\n      // but it would be good to have them swapped properly.\n\n      for (unsigned int vr_index = 0;\n           vr_index < MD_CONTEXT_AMD64_VR_COUNT;\n           ++vr_index)\n        Swap(&context_amd64->vector_register[vr_index]);\n      Swap(&context_amd64->vector_control);\n      Swap(&context_amd64->debug_control);\n      Swap(&context_amd64->last_branch_to_rip);\n      Swap(&context_amd64->last_branch_from_rip);\n      Swap(&context_amd64->last_exception_to_rip);\n      Swap(&context_amd64->last_exception_from_rip);\n    }\n\n    context_flags_ = context_amd64->context_flags;\n\n    context_.amd64 = context_amd64.release();\n  }\n  else {\n    u_int32_t context_flags;\n    if (!minidump_->ReadBytes(&context_flags, sizeof(context_flags))) {\n      BPLOG(ERROR) << \"MinidumpContext could not read context flags\";\n      return false;\n    }\n    if (minidump_->swap())\n      Swap(&context_flags);\n\n    u_int32_t cpu_type = context_flags & MD_CONTEXT_CPU_MASK;\n    if (cpu_type == 0) {\n      // Unfortunately the flag for MD_CONTEXT_ARM that was taken\n      // from a Windows CE SDK header conflicts in practice with\n      // the CONTEXT_XSTATE flag. MD_CONTEXT_ARM has been renumbered,\n      // but handle dumps with the legacy value gracefully here.\n      if (context_flags & MD_CONTEXT_ARM_OLD) {\n        context_flags |= MD_CONTEXT_ARM;\n        context_flags &= ~MD_CONTEXT_ARM_OLD;\n        cpu_type = MD_CONTEXT_ARM;\n      }\n    }\n\n    // Allocate the context structure for the correct CPU and fill it.  The\n    // casts are slightly unorthodox, but it seems better to do that than to\n    // maintain a separate pointer for each type of CPU context structure\n    // when only one of them will be used.\n    switch (cpu_type) {\n      case MD_CONTEXT_X86: {\n        if (expected_size != sizeof(MDRawContextX86)) {\n          BPLOG(ERROR) << \"MinidumpContext x86 size mismatch, \" <<\n            expected_size << \" != \" << sizeof(MDRawContextX86);\n          return false;\n        }\n\n        scoped_ptr<MDRawContextX86> context_x86(new MDRawContextX86());\n\n        // Set the context_flags member, which has already been read, and\n        // read the rest of the structure beginning with the first member\n        // after context_flags.\n        context_x86->context_flags = context_flags;\n\n        size_t flags_size = sizeof(context_x86->context_flags);\n        u_int8_t* context_after_flags =\n          reinterpret_cast<u_int8_t*>(context_x86.get()) + flags_size;\n        if (!minidump_->ReadBytes(context_after_flags,\n                                  sizeof(MDRawContextX86) - flags_size)) {\n          BPLOG(ERROR) << \"MinidumpContext could not read x86 context\";\n          return false;\n        }\n\n        // Do this after reading the entire MDRawContext structure because\n        // GetSystemInfo may seek minidump to a new position.\n        if (!CheckAgainstSystemInfo(cpu_type)) {\n          BPLOG(ERROR) << \"MinidumpContext x86 does not match system info\";\n          return false;\n        }\n\n        if (minidump_->swap()) {\n          // context_x86->context_flags was already swapped.\n          Swap(&context_x86->dr0);\n          Swap(&context_x86->dr1);\n          Swap(&context_x86->dr2);\n          Swap(&context_x86->dr3);\n          Swap(&context_x86->dr6);\n          Swap(&context_x86->dr7);\n          Swap(&context_x86->float_save.control_word);\n          Swap(&context_x86->float_save.status_word);\n          Swap(&context_x86->float_save.tag_word);\n          Swap(&context_x86->float_save.error_offset);\n          Swap(&context_x86->float_save.error_selector);\n          Swap(&context_x86->float_save.data_offset);\n          Swap(&context_x86->float_save.data_selector);\n          // context_x86->float_save.register_area[] contains 8-bit quantities\n          // and does not need to be swapped.\n          Swap(&context_x86->float_save.cr0_npx_state);\n          Swap(&context_x86->gs);\n          Swap(&context_x86->fs);\n          Swap(&context_x86->es);\n          Swap(&context_x86->ds);\n          Swap(&context_x86->edi);\n          Swap(&context_x86->esi);\n          Swap(&context_x86->ebx);\n          Swap(&context_x86->edx);\n          Swap(&context_x86->ecx);\n          Swap(&context_x86->eax);\n          Swap(&context_x86->ebp);\n          Swap(&context_x86->eip);\n          Swap(&context_x86->cs);\n          Swap(&context_x86->eflags);\n          Swap(&context_x86->esp);\n          Swap(&context_x86->ss);\n          // context_x86->extended_registers[] contains 8-bit quantities and\n          // does not need to be swapped.\n        }\n\n        context_.x86 = context_x86.release();\n\n        break;\n      }\n\n      case MD_CONTEXT_PPC: {\n        if (expected_size != sizeof(MDRawContextPPC)) {\n          BPLOG(ERROR) << \"MinidumpContext ppc size mismatch, \" <<\n            expected_size << \" != \" << sizeof(MDRawContextPPC);\n          return false;\n        }\n\n        scoped_ptr<MDRawContextPPC> context_ppc(new MDRawContextPPC());\n\n        // Set the context_flags member, which has already been read, and\n        // read the rest of the structure beginning with the first member\n        // after context_flags.\n        context_ppc->context_flags = context_flags;\n\n        size_t flags_size = sizeof(context_ppc->context_flags);\n        u_int8_t* context_after_flags =\n          reinterpret_cast<u_int8_t*>(context_ppc.get()) + flags_size;\n        if (!minidump_->ReadBytes(context_after_flags,\n                                  sizeof(MDRawContextPPC) - flags_size)) {\n          BPLOG(ERROR) << \"MinidumpContext could not read ppc context\";\n          return false;\n        }\n\n        // Do this after reading the entire MDRawContext structure because\n        // GetSystemInfo may seek minidump to a new position.\n        if (!CheckAgainstSystemInfo(cpu_type)) {\n          BPLOG(ERROR) << \"MinidumpContext ppc does not match system info\";\n          return false;\n        }\n\n        // Normalize the 128-bit types in the dump.\n        // Since this is PowerPC, by definition, the values are big-endian.\n        for (unsigned int vr_index = 0;\n             vr_index < MD_VECTORSAVEAREA_PPC_VR_COUNT;\n             ++vr_index) {\n          Normalize128(&context_ppc->vector_save.save_vr[vr_index], true);\n        }\n\n        if (minidump_->swap()) {\n          // context_ppc->context_flags was already swapped.\n          Swap(&context_ppc->srr0);\n          Swap(&context_ppc->srr1);\n          for (unsigned int gpr_index = 0;\n               gpr_index < MD_CONTEXT_PPC_GPR_COUNT;\n               ++gpr_index) {\n            Swap(&context_ppc->gpr[gpr_index]);\n          }\n          Swap(&context_ppc->cr);\n          Swap(&context_ppc->xer);\n          Swap(&context_ppc->lr);\n          Swap(&context_ppc->ctr);\n          Swap(&context_ppc->mq);\n          Swap(&context_ppc->vrsave);\n          for (unsigned int fpr_index = 0;\n               fpr_index < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT;\n               ++fpr_index) {\n            Swap(&context_ppc->float_save.fpregs[fpr_index]);\n          }\n          // Don't swap context_ppc->float_save.fpscr_pad because it is only\n          // used for padding.\n          Swap(&context_ppc->float_save.fpscr);\n          for (unsigned int vr_index = 0;\n               vr_index < MD_VECTORSAVEAREA_PPC_VR_COUNT;\n               ++vr_index) {\n            Swap(&context_ppc->vector_save.save_vr[vr_index]);\n          }\n          Swap(&context_ppc->vector_save.save_vscr);\n          // Don't swap the padding fields in vector_save.\n          Swap(&context_ppc->vector_save.save_vrvalid);\n        }\n\n        context_.ppc = context_ppc.release();\n\n        break;\n      }\n\n      case MD_CONTEXT_SPARC: {\n        if (expected_size != sizeof(MDRawContextSPARC)) {\n          BPLOG(ERROR) << \"MinidumpContext sparc size mismatch, \" <<\n            expected_size << \" != \" << sizeof(MDRawContextSPARC);\n          return false;\n        }\n\n        scoped_ptr<MDRawContextSPARC> context_sparc(new MDRawContextSPARC());\n\n        // Set the context_flags member, which has already been read, and\n        // read the rest of the structure beginning with the first member\n        // after context_flags.\n        context_sparc->context_flags = context_flags;\n\n        size_t flags_size = sizeof(context_sparc->context_flags);\n        u_int8_t* context_after_flags =\n            reinterpret_cast<u_int8_t*>(context_sparc.get()) + flags_size;\n        if (!minidump_->ReadBytes(context_after_flags,\n                                  sizeof(MDRawContextSPARC) - flags_size)) {\n          BPLOG(ERROR) << \"MinidumpContext could not read sparc context\";\n          return false;\n        }\n\n        // Do this after reading the entire MDRawContext structure because\n        // GetSystemInfo may seek minidump to a new position.\n        if (!CheckAgainstSystemInfo(cpu_type)) {\n          BPLOG(ERROR) << \"MinidumpContext sparc does not match system info\";\n          return false;\n        }\n\n        if (minidump_->swap()) {\n          // context_sparc->context_flags was already swapped.\n          for (unsigned int gpr_index = 0;\n               gpr_index < MD_CONTEXT_SPARC_GPR_COUNT;\n               ++gpr_index) {\n            Swap(&context_sparc->g_r[gpr_index]);\n          }\n          Swap(&context_sparc->ccr);\n          Swap(&context_sparc->pc);\n          Swap(&context_sparc->npc);\n          Swap(&context_sparc->y);\n          Swap(&context_sparc->asi);\n          Swap(&context_sparc->fprs);\n          for (unsigned int fpr_index = 0;\n               fpr_index < MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT;\n               ++fpr_index) {\n            Swap(&context_sparc->float_save.regs[fpr_index]);\n          }\n          Swap(&context_sparc->float_save.filler);\n          Swap(&context_sparc->float_save.fsr);\n        }\n        context_.ctx_sparc = context_sparc.release();\n\n        break;\n      }\n\n      case MD_CONTEXT_ARM: {\n        if (expected_size != sizeof(MDRawContextARM)) {\n          BPLOG(ERROR) << \"MinidumpContext arm size mismatch, \" <<\n            expected_size << \" != \" << sizeof(MDRawContextARM);\n          return false;\n        }\n\n        scoped_ptr<MDRawContextARM> context_arm(new MDRawContextARM());\n\n        // Set the context_flags member, which has already been read, and\n        // read the rest of the structure beginning with the first member\n        // after context_flags.\n        context_arm->context_flags = context_flags;\n\n        size_t flags_size = sizeof(context_arm->context_flags);\n        u_int8_t* context_after_flags =\n            reinterpret_cast<u_int8_t*>(context_arm.get()) + flags_size;\n        if (!minidump_->ReadBytes(context_after_flags,\n                                  sizeof(MDRawContextARM) - flags_size)) {\n          BPLOG(ERROR) << \"MinidumpContext could not read arm context\";\n          return false;\n        }\n\n        // Do this after reading the entire MDRawContext structure because\n        // GetSystemInfo may seek minidump to a new position.\n        if (!CheckAgainstSystemInfo(cpu_type)) {\n          BPLOG(ERROR) << \"MinidumpContext arm does not match system info\";\n          return false;\n        }\n\n        if (minidump_->swap()) {\n          // context_arm->context_flags was already swapped.\n          for (unsigned int ireg_index = 0;\n               ireg_index < MD_CONTEXT_ARM_GPR_COUNT;\n               ++ireg_index) {\n            Swap(&context_arm->iregs[ireg_index]);\n          }\n          Swap(&context_arm->cpsr);\n          Swap(&context_arm->float_save.fpscr);\n          for (unsigned int fpr_index = 0;\n               fpr_index < MD_FLOATINGSAVEAREA_ARM_FPR_COUNT;\n               ++fpr_index) {\n            Swap(&context_arm->float_save.regs[fpr_index]);\n          }\n          for (unsigned int fpe_index = 0;\n               fpe_index < MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT;\n               ++fpe_index) {\n            Swap(&context_arm->float_save.extra[fpe_index]);\n          }\n        }\n        context_.arm = context_arm.release();\n\n        break;\n      }\n\n      default: {\n        // Unknown context type - Don't log as an error yet. Let the\n        // caller work that out.\n        BPLOG(INFO) << \"MinidumpContext unknown context type \" <<\n          HexString(cpu_type);\n        return false;\n        break;\n      }\n    }\n    context_flags_ = context_flags;\n  }\n\n  valid_ = true;\n  return true;\n}\n\n\nu_int32_t MinidumpContext::GetContextCPU() const {\n  if (!valid_) {\n    // Don't log a message, GetContextCPU can be legitimately called with\n    // valid_ false by FreeContext, which is called by Read.\n    return 0;\n  }\n\n  return context_flags_ & MD_CONTEXT_CPU_MASK;\n}\n\n\nconst MDRawContextX86* MinidumpContext::GetContextX86() const {\n  if (GetContextCPU() != MD_CONTEXT_X86) {\n    BPLOG(ERROR) << \"MinidumpContext cannot get x86 context\";\n    return NULL;\n  }\n\n  return context_.x86;\n}\n\n\nconst MDRawContextPPC* MinidumpContext::GetContextPPC() const {\n  if (GetContextCPU() != MD_CONTEXT_PPC) {\n    BPLOG(ERROR) << \"MinidumpContext cannot get ppc context\";\n    return NULL;\n  }\n\n  return context_.ppc;\n}\n\nconst MDRawContextAMD64* MinidumpContext::GetContextAMD64() const {\n  if (GetContextCPU() != MD_CONTEXT_AMD64) {\n    BPLOG(ERROR) << \"MinidumpContext cannot get amd64 context\";\n    return NULL;\n  }\n\n  return context_.amd64;\n}\n\nconst MDRawContextSPARC* MinidumpContext::GetContextSPARC() const {\n  if (GetContextCPU() != MD_CONTEXT_SPARC) {\n    BPLOG(ERROR) << \"MinidumpContext cannot get sparc context\";\n    return NULL;\n  }\n\n  return context_.ctx_sparc;\n}\n\nconst MDRawContextARM* MinidumpContext::GetContextARM() const {\n  if (GetContextCPU() != MD_CONTEXT_ARM) {\n    BPLOG(ERROR) << \"MinidumpContext cannot get arm context\";\n    return NULL;\n  }\n\n  return context_.arm;\n}\n\nvoid MinidumpContext::FreeContext() {\n  switch (GetContextCPU()) {\n    case MD_CONTEXT_X86:\n      delete context_.x86;\n      break;\n\n    case MD_CONTEXT_PPC:\n      delete context_.ppc;\n      break;\n\n    case MD_CONTEXT_AMD64:\n      delete context_.amd64;\n      break;\n\n    case MD_CONTEXT_SPARC:\n      delete context_.ctx_sparc;\n      break;\n\n    case MD_CONTEXT_ARM:\n      delete context_.arm;\n      break;\n\n    default:\n      // There is no context record (valid_ is false) or there's a\n      // context record for an unknown CPU (shouldn't happen, only known\n      // records are stored by Read).\n      break;\n  }\n\n  context_flags_ = 0;\n  context_.base = NULL;\n}\n\n\nbool MinidumpContext::CheckAgainstSystemInfo(u_int32_t context_cpu_type) {\n  // It's OK if the minidump doesn't contain an MD_SYSTEM_INFO_STREAM,\n  // as this function just implements a sanity check.\n  MinidumpSystemInfo* system_info = minidump_->GetSystemInfo();\n  if (!system_info) {\n    BPLOG(INFO) << \"MinidumpContext could not be compared against \"\n                   \"MinidumpSystemInfo\";\n    return true;\n  }\n\n  // If there is an MD_SYSTEM_INFO_STREAM, it should contain valid system info.\n  const MDRawSystemInfo* raw_system_info = system_info->system_info();\n  if (!raw_system_info) {\n    BPLOG(INFO) << \"MinidumpContext could not be compared against \"\n                   \"MDRawSystemInfo\";\n    return false;\n  }\n\n  MDCPUArchitecture system_info_cpu_type = static_cast<MDCPUArchitecture>(\n      raw_system_info->processor_architecture);\n\n  // Compare the CPU type of the context record to the CPU type in the\n  // minidump's system info stream.\n  bool return_value = false;\n  switch (context_cpu_type) {\n    case MD_CONTEXT_X86:\n      if (system_info_cpu_type == MD_CPU_ARCHITECTURE_X86 ||\n          system_info_cpu_type == MD_CPU_ARCHITECTURE_X86_WIN64 ||\n          system_info_cpu_type == MD_CPU_ARCHITECTURE_AMD64) {\n        return_value = true;\n      }\n      break;\n\n    case MD_CONTEXT_PPC:\n      if (system_info_cpu_type == MD_CPU_ARCHITECTURE_PPC)\n        return_value = true;\n      break;\n\n    case MD_CONTEXT_AMD64:\n      if (system_info_cpu_type == MD_CPU_ARCHITECTURE_AMD64)\n        return_value = true;\n      break;\n\n    case MD_CONTEXT_SPARC:\n      if (system_info_cpu_type == MD_CPU_ARCHITECTURE_SPARC)\n        return_value = true;\n      break;\n\n    case MD_CONTEXT_ARM:\n      if (system_info_cpu_type == MD_CPU_ARCHITECTURE_ARM)\n        return_value = true;\n      break;\n  }\n\n  BPLOG_IF(ERROR, !return_value) << \"MinidumpContext CPU \" <<\n                                    HexString(context_cpu_type) <<\n                                    \" wrong for MinidumpSystemInfo CPU \" <<\n                                    HexString(system_info_cpu_type);\n\n  return return_value;\n}\n\n\nvoid MinidumpContext::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpContext cannot print invalid data\";\n    return;\n  }\n\n  switch (GetContextCPU()) {\n    case MD_CONTEXT_X86: {\n      const MDRawContextX86* context_x86 = GetContextX86();\n      printf(\"MDRawContextX86\\n\");\n      printf(\"  context_flags                = 0x%x\\n\",\n             context_x86->context_flags);\n      printf(\"  dr0                          = 0x%x\\n\", context_x86->dr0);\n      printf(\"  dr1                          = 0x%x\\n\", context_x86->dr1);\n      printf(\"  dr2                          = 0x%x\\n\", context_x86->dr2);\n      printf(\"  dr3                          = 0x%x\\n\", context_x86->dr3);\n      printf(\"  dr6                          = 0x%x\\n\", context_x86->dr6);\n      printf(\"  dr7                          = 0x%x\\n\", context_x86->dr7);\n      printf(\"  float_save.control_word      = 0x%x\\n\",\n             context_x86->float_save.control_word);\n      printf(\"  float_save.status_word       = 0x%x\\n\",\n             context_x86->float_save.status_word);\n      printf(\"  float_save.tag_word          = 0x%x\\n\",\n             context_x86->float_save.tag_word);\n      printf(\"  float_save.error_offset      = 0x%x\\n\",\n             context_x86->float_save.error_offset);\n      printf(\"  float_save.error_selector    = 0x%x\\n\",\n             context_x86->float_save.error_selector);\n      printf(\"  float_save.data_offset       = 0x%x\\n\",\n             context_x86->float_save.data_offset);\n      printf(\"  float_save.data_selector     = 0x%x\\n\",\n             context_x86->float_save.data_selector);\n      printf(\"  float_save.register_area[%2d] = 0x\",\n             MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE);\n      for (unsigned int register_index = 0;\n           register_index < MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE;\n           ++register_index) {\n        printf(\"%02x\", context_x86->float_save.register_area[register_index]);\n      }\n      printf(\"\\n\");\n      printf(\"  float_save.cr0_npx_state     = 0x%x\\n\",\n             context_x86->float_save.cr0_npx_state);\n      printf(\"  gs                           = 0x%x\\n\", context_x86->gs);\n      printf(\"  fs                           = 0x%x\\n\", context_x86->fs);\n      printf(\"  es                           = 0x%x\\n\", context_x86->es);\n      printf(\"  ds                           = 0x%x\\n\", context_x86->ds);\n      printf(\"  edi                          = 0x%x\\n\", context_x86->edi);\n      printf(\"  esi                          = 0x%x\\n\", context_x86->esi);\n      printf(\"  ebx                          = 0x%x\\n\", context_x86->ebx);\n      printf(\"  edx                          = 0x%x\\n\", context_x86->edx);\n      printf(\"  ecx                          = 0x%x\\n\", context_x86->ecx);\n      printf(\"  eax                          = 0x%x\\n\", context_x86->eax);\n      printf(\"  ebp                          = 0x%x\\n\", context_x86->ebp);\n      printf(\"  eip                          = 0x%x\\n\", context_x86->eip);\n      printf(\"  cs                           = 0x%x\\n\", context_x86->cs);\n      printf(\"  eflags                       = 0x%x\\n\", context_x86->eflags);\n      printf(\"  esp                          = 0x%x\\n\", context_x86->esp);\n      printf(\"  ss                           = 0x%x\\n\", context_x86->ss);\n      printf(\"  extended_registers[%3d]      = 0x\",\n             MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE);\n      for (unsigned int register_index = 0;\n           register_index < MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE;\n           ++register_index) {\n        printf(\"%02x\", context_x86->extended_registers[register_index]);\n      }\n      printf(\"\\n\\n\");\n\n      break;\n    }\n\n    case MD_CONTEXT_PPC: {\n      const MDRawContextPPC* context_ppc = GetContextPPC();\n      printf(\"MDRawContextPPC\\n\");\n      printf(\"  context_flags            = 0x%x\\n\",\n             context_ppc->context_flags);\n      printf(\"  srr0                     = 0x%x\\n\", context_ppc->srr0);\n      printf(\"  srr1                     = 0x%x\\n\", context_ppc->srr1);\n      for (unsigned int gpr_index = 0;\n           gpr_index < MD_CONTEXT_PPC_GPR_COUNT;\n           ++gpr_index) {\n        printf(\"  gpr[%2d]                  = 0x%x\\n\",\n               gpr_index, context_ppc->gpr[gpr_index]);\n      }\n      printf(\"  cr                       = 0x%x\\n\", context_ppc->cr);\n      printf(\"  xer                      = 0x%x\\n\", context_ppc->xer);\n      printf(\"  lr                       = 0x%x\\n\", context_ppc->lr);\n      printf(\"  ctr                      = 0x%x\\n\", context_ppc->ctr);\n      printf(\"  mq                       = 0x%x\\n\", context_ppc->mq);\n      printf(\"  vrsave                   = 0x%x\\n\", context_ppc->vrsave);\n      for (unsigned int fpr_index = 0;\n           fpr_index < MD_FLOATINGSAVEAREA_PPC_FPR_COUNT;\n           ++fpr_index) {\n        printf(\"  float_save.fpregs[%2d]    = 0x%\" PRIx64 \"\\n\",\n               fpr_index, context_ppc->float_save.fpregs[fpr_index]);\n      }\n      printf(\"  float_save.fpscr         = 0x%x\\n\",\n             context_ppc->float_save.fpscr);\n      // TODO(mmentovai): print the 128-bit quantities in\n      // context_ppc->vector_save.  This isn't done yet because printf\n      // doesn't support 128-bit quantities, and printing them using\n      // PRIx64 as two 64-bit quantities requires knowledge of the CPU's\n      // byte ordering.\n      printf(\"  vector_save.save_vrvalid = 0x%x\\n\",\n             context_ppc->vector_save.save_vrvalid);\n      printf(\"\\n\");\n\n      break;\n    }\n\n    case MD_CONTEXT_AMD64: {\n      const MDRawContextAMD64* context_amd64 = GetContextAMD64();\n      printf(\"MDRawContextAMD64\\n\");\n      printf(\"  p1_home       = 0x%\" PRIx64 \"\\n\",\n             context_amd64->p1_home);\n      printf(\"  p2_home       = 0x%\" PRIx64 \"\\n\",\n             context_amd64->p2_home);\n      printf(\"  p3_home       = 0x%\" PRIx64 \"\\n\",\n             context_amd64->p3_home);\n      printf(\"  p4_home       = 0x%\" PRIx64 \"\\n\",\n             context_amd64->p4_home);\n      printf(\"  p5_home       = 0x%\" PRIx64 \"\\n\",\n             context_amd64->p5_home);\n      printf(\"  p6_home       = 0x%\" PRIx64 \"\\n\",\n             context_amd64->p6_home);\n      printf(\"  context_flags = 0x%x\\n\",\n             context_amd64->context_flags);\n      printf(\"  mx_csr        = 0x%x\\n\",\n             context_amd64->mx_csr);\n      printf(\"  cs            = 0x%x\\n\", context_amd64->cs);\n      printf(\"  ds            = 0x%x\\n\", context_amd64->ds);\n      printf(\"  es            = 0x%x\\n\", context_amd64->es);\n      printf(\"  fs            = 0x%x\\n\", context_amd64->fs);\n      printf(\"  gs            = 0x%x\\n\", context_amd64->gs);\n      printf(\"  ss            = 0x%x\\n\", context_amd64->ss);\n      printf(\"  eflags        = 0x%x\\n\", context_amd64->eflags);\n      printf(\"  dr0           = 0x%\" PRIx64 \"\\n\", context_amd64->dr0);\n      printf(\"  dr1           = 0x%\" PRIx64 \"\\n\", context_amd64->dr1);\n      printf(\"  dr2           = 0x%\" PRIx64 \"\\n\", context_amd64->dr2);\n      printf(\"  dr3           = 0x%\" PRIx64 \"\\n\", context_amd64->dr3);\n      printf(\"  dr6           = 0x%\" PRIx64 \"\\n\", context_amd64->dr6);\n      printf(\"  dr7           = 0x%\" PRIx64 \"\\n\", context_amd64->dr7);\n      printf(\"  rax           = 0x%\" PRIx64 \"\\n\", context_amd64->rax);\n      printf(\"  rcx           = 0x%\" PRIx64 \"\\n\", context_amd64->rcx);\n      printf(\"  rdx           = 0x%\" PRIx64 \"\\n\", context_amd64->rdx);\n      printf(\"  rbx           = 0x%\" PRIx64 \"\\n\", context_amd64->rbx);\n      printf(\"  rsp           = 0x%\" PRIx64 \"\\n\", context_amd64->rsp);\n      printf(\"  rbp           = 0x%\" PRIx64 \"\\n\", context_amd64->rbp);\n      printf(\"  rsi           = 0x%\" PRIx64 \"\\n\", context_amd64->rsi);\n      printf(\"  rdi           = 0x%\" PRIx64 \"\\n\", context_amd64->rdi);\n      printf(\"  r8            = 0x%\" PRIx64 \"\\n\", context_amd64->r8);\n      printf(\"  r9            = 0x%\" PRIx64 \"\\n\", context_amd64->r9);\n      printf(\"  r10           = 0x%\" PRIx64 \"\\n\", context_amd64->r10);\n      printf(\"  r11           = 0x%\" PRIx64 \"\\n\", context_amd64->r11);\n      printf(\"  r12           = 0x%\" PRIx64 \"\\n\", context_amd64->r12);\n      printf(\"  r13           = 0x%\" PRIx64 \"\\n\", context_amd64->r13);\n      printf(\"  r14           = 0x%\" PRIx64 \"\\n\", context_amd64->r14);\n      printf(\"  r15           = 0x%\" PRIx64 \"\\n\", context_amd64->r15);\n      printf(\"  rip           = 0x%\" PRIx64 \"\\n\", context_amd64->rip);\n      //TODO: print xmm, vector, debug registers\n      printf(\"\\n\");\n      break;\n    }\n\n    case MD_CONTEXT_SPARC: {\n      const MDRawContextSPARC* context_sparc = GetContextSPARC();\n      printf(\"MDRawContextSPARC\\n\");\n      printf(\"  context_flags       = 0x%x\\n\",\n             context_sparc->context_flags);\n      for (unsigned int g_r_index = 0;\n           g_r_index < MD_CONTEXT_SPARC_GPR_COUNT;\n           ++g_r_index) {\n        printf(\"  g_r[%2d]             = 0x%\" PRIx64 \"\\n\",\n               g_r_index, context_sparc->g_r[g_r_index]);\n      }\n      printf(\"  ccr                 = 0x%\" PRIx64 \"\\n\", context_sparc->ccr);\n      printf(\"  pc                  = 0x%\" PRIx64 \"\\n\", context_sparc->pc);\n      printf(\"  npc                 = 0x%\" PRIx64 \"\\n\", context_sparc->npc);\n      printf(\"  y                   = 0x%\" PRIx64 \"\\n\", context_sparc->y);\n      printf(\"  asi                 = 0x%\" PRIx64 \"\\n\", context_sparc->asi);\n      printf(\"  fprs                = 0x%\" PRIx64 \"\\n\", context_sparc->fprs);\n\n      for (unsigned int fpr_index = 0;\n           fpr_index < MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT;\n           ++fpr_index) {\n        printf(\"  float_save.regs[%2d] = 0x%\" PRIx64 \"\\n\",\n               fpr_index, context_sparc->float_save.regs[fpr_index]);\n      }\n      printf(\"  float_save.filler   = 0x%\" PRIx64 \"\\n\",\n             context_sparc->float_save.filler);\n      printf(\"  float_save.fsr      = 0x%\" PRIx64 \"\\n\",\n             context_sparc->float_save.fsr);\n      break;\n    }\n\n    case MD_CONTEXT_ARM: {\n      const MDRawContextARM* context_arm = GetContextARM();\n      printf(\"MDRawContextARM\\n\");\n      printf(\"  context_flags       = 0x%x\\n\",\n             context_arm->context_flags);\n      for (unsigned int ireg_index = 0;\n           ireg_index < MD_CONTEXT_ARM_GPR_COUNT;\n           ++ireg_index) {\n        printf(\"  iregs[%2d]            = 0x%x\\n\",\n               ireg_index, context_arm->iregs[ireg_index]);\n      }\n      printf(\"  cpsr                = 0x%x\\n\", context_arm->cpsr);\n      printf(\"  float_save.fpscr     = 0x%\" PRIx64 \"\\n\",\n             context_arm->float_save.fpscr);\n      for (unsigned int fpr_index = 0;\n           fpr_index < MD_FLOATINGSAVEAREA_ARM_FPR_COUNT;\n           ++fpr_index) {\n        printf(\"  float_save.regs[%2d] = 0x%\" PRIx64 \"\\n\",\n               fpr_index, context_arm->float_save.regs[fpr_index]);\n      }\n      for (unsigned int fpe_index = 0;\n           fpe_index < MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT;\n           ++fpe_index) {\n        printf(\"  float_save.extra[%2d] = 0x%\" PRIx32 \"\\n\",\n               fpe_index, context_arm->float_save.extra[fpe_index]);\n      }\n\n      break;\n    }\n\n    default: {\n      break;\n    }\n  }\n}\n\n\n//\n// MinidumpMemoryRegion\n//\n\n\nu_int32_t MinidumpMemoryRegion::max_bytes_ = 1024 * 1024;  // 1MB\n\n\nMinidumpMemoryRegion::MinidumpMemoryRegion(Minidump* minidump)\n    : MinidumpObject(minidump),\n      descriptor_(NULL),\n      memory_(NULL) {\n}\n\n\nMinidumpMemoryRegion::~MinidumpMemoryRegion() {\n  delete memory_;\n}\n\n\nvoid MinidumpMemoryRegion::SetDescriptor(MDMemoryDescriptor* descriptor) {\n  descriptor_ = descriptor;\n  valid_ = descriptor &&\n           descriptor_->memory.data_size <=\n               numeric_limits<u_int64_t>::max() -\n               descriptor_->start_of_memory_range;\n}\n\n\nconst u_int8_t* MinidumpMemoryRegion::GetMemory() const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpMemoryRegion for GetMemory\";\n    return NULL;\n  }\n\n  if (!memory_) {\n    if (descriptor_->memory.data_size == 0) {\n      BPLOG(ERROR) << \"MinidumpMemoryRegion is empty\";\n      return NULL;\n    }\n\n    if (!minidump_->SeekSet(descriptor_->memory.rva)) {\n      BPLOG(ERROR) << \"MinidumpMemoryRegion could not seek to memory region\";\n      return NULL;\n    }\n\n    if (descriptor_->memory.data_size > max_bytes_) {\n      BPLOG(ERROR) << \"MinidumpMemoryRegion size \" <<\n                      descriptor_->memory.data_size << \" exceeds maximum \" <<\n                      max_bytes_;\n      return NULL;\n    }\n\n    scoped_ptr< vector<u_int8_t> > memory(\n        new vector<u_int8_t>(descriptor_->memory.data_size));\n\n    if (!minidump_->ReadBytes(&(*memory)[0], descriptor_->memory.data_size)) {\n      BPLOG(ERROR) << \"MinidumpMemoryRegion could not read memory region\";\n      return NULL;\n    }\n\n    memory_ = memory.release();\n  }\n\n  return &(*memory_)[0];\n}\n\n\nu_int64_t MinidumpMemoryRegion::GetBase() const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpMemoryRegion for GetBase\";\n    return static_cast<u_int64_t>(-1);\n  }\n\n  return descriptor_->start_of_memory_range;\n}\n\n\nu_int32_t MinidumpMemoryRegion::GetSize() const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpMemoryRegion for GetSize\";\n    return 0;\n  }\n\n  return descriptor_->memory.data_size;\n}\n\n\nvoid MinidumpMemoryRegion::FreeMemory() {\n  delete memory_;\n  memory_ = NULL;\n}\n\n\ntemplate<typename T>\nbool MinidumpMemoryRegion::GetMemoryAtAddressInternal(u_int64_t address,\n                                                      T*        value) const {\n  BPLOG_IF(ERROR, !value) << \"MinidumpMemoryRegion::GetMemoryAtAddressInternal \"\n                             \"requires |value|\";\n  assert(value);\n  *value = 0;\n\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpMemoryRegion for \"\n                    \"GetMemoryAtAddressInternal\";\n    return false;\n  }\n\n  // Common failure case\n  if (address < descriptor_->start_of_memory_range ||\n      sizeof(T) > numeric_limits<u_int64_t>::max() - address ||\n      address + sizeof(T) > descriptor_->start_of_memory_range +\n                            descriptor_->memory.data_size) {\n    BPLOG(INFO) << \"MinidumpMemoryRegion request out of range: \" <<\n                    HexString(address) << \"+\" << sizeof(T) << \"/\" <<\n                    HexString(descriptor_->start_of_memory_range) << \"+\" <<\n                    HexString(descriptor_->memory.data_size);\n    return false;\n  }\n\n  const u_int8_t* memory = GetMemory();\n  if (!memory) {\n    // GetMemory already logged a perfectly good message.\n    return false;\n  }\n\n  // If the CPU requires memory accesses to be aligned, this can crash.\n  // x86 and ppc are able to cope, though.\n  *value = *reinterpret_cast<const T*>(\n      &memory[address - descriptor_->start_of_memory_range]);\n\n  if (minidump_->swap())\n    Swap(value);\n\n  return true;\n}\n\n\nbool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t  address,\n                                              u_int8_t*  value) const {\n  return GetMemoryAtAddressInternal(address, value);\n}\n\n\nbool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t  address,\n                                              u_int16_t* value) const {\n  return GetMemoryAtAddressInternal(address, value);\n}\n\n\nbool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t  address,\n                                              u_int32_t* value) const {\n  return GetMemoryAtAddressInternal(address, value);\n}\n\n\nbool MinidumpMemoryRegion::GetMemoryAtAddress(u_int64_t  address,\n                                              u_int64_t* value) const {\n  return GetMemoryAtAddressInternal(address, value);\n}\n\n\nvoid MinidumpMemoryRegion::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpMemoryRegion cannot print invalid data\";\n    return;\n  }\n\n  const u_int8_t* memory = GetMemory();\n  if (memory) {\n    printf(\"0x\");\n    for (unsigned int byte_index = 0;\n         byte_index < descriptor_->memory.data_size;\n         byte_index++) {\n      printf(\"%02x\", memory[byte_index]);\n    }\n    printf(\"\\n\");\n  } else {\n    printf(\"No memory\\n\");\n  }\n}\n\n\n//\n// MinidumpThread\n//\n\n\nMinidumpThread::MinidumpThread(Minidump* minidump)\n    : MinidumpObject(minidump),\n      thread_(),\n      memory_(NULL),\n      context_(NULL) {\n}\n\n\nMinidumpThread::~MinidumpThread() {\n  delete memory_;\n  delete context_;\n}\n\n\nbool MinidumpThread::Read() {\n  // Invalidate cached data.\n  delete memory_;\n  memory_ = NULL;\n  delete context_;\n  context_ = NULL;\n\n  valid_ = false;\n\n  if (!minidump_->ReadBytes(&thread_, sizeof(thread_))) {\n    BPLOG(ERROR) << \"MinidumpThread cannot read thread\";\n    return false;\n  }\n\n  if (minidump_->swap()) {\n    Swap(&thread_.thread_id);\n    Swap(&thread_.suspend_count);\n    Swap(&thread_.priority_class);\n    Swap(&thread_.priority);\n    Swap(&thread_.teb);\n    Swap(&thread_.stack);\n    Swap(&thread_.thread_context);\n  }\n\n  // Check for base + size overflow or undersize.\n  if (thread_.stack.memory.data_size == 0 ||\n      thread_.stack.memory.data_size > numeric_limits<u_int64_t>::max() -\n                                       thread_.stack.start_of_memory_range) {\n    BPLOG(ERROR) << \"MinidumpThread has a memory region problem, \" <<\n                    HexString(thread_.stack.start_of_memory_range) << \"+\" <<\n                    HexString(thread_.stack.memory.data_size);\n    return false;\n  }\n\n  memory_ = new MinidumpMemoryRegion(minidump_);\n  memory_->SetDescriptor(&thread_.stack);\n\n  valid_ = true;\n  return true;\n}\n\n\nMinidumpMemoryRegion* MinidumpThread::GetMemory() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpThread for GetMemory\";\n    return NULL;\n  }\n\n  return memory_;\n}\n\n\nMinidumpContext* MinidumpThread::GetContext() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpThread for GetContext\";\n    return NULL;\n  }\n\n  if (!context_) {\n    if (!minidump_->SeekSet(thread_.thread_context.rva)) {\n      BPLOG(ERROR) << \"MinidumpThread cannot seek to context\";\n      return NULL;\n    }\n\n    scoped_ptr<MinidumpContext> context(new MinidumpContext(minidump_));\n\n    if (!context->Read(thread_.thread_context.data_size)) {\n      BPLOG(ERROR) << \"MinidumpThread cannot read context\";\n      return NULL;\n    }\n\n    context_ = context.release();\n  }\n\n  return context_;\n}\n\n\nbool MinidumpThread::GetThreadID(u_int32_t *thread_id) const {\n  BPLOG_IF(ERROR, !thread_id) << \"MinidumpThread::GetThreadID requires \"\n                                 \"|thread_id|\";\n  assert(thread_id);\n  *thread_id = 0;\n\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpThread for GetThreadID\";\n    return false;\n  }\n\n  *thread_id = thread_.thread_id;\n  return true;\n}\n\n\nvoid MinidumpThread::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpThread cannot print invalid data\";\n    return;\n  }\n\n  printf(\"MDRawThread\\n\");\n  printf(\"  thread_id                   = 0x%x\\n\",   thread_.thread_id);\n  printf(\"  suspend_count               = %d\\n\",     thread_.suspend_count);\n  printf(\"  priority_class              = 0x%x\\n\",   thread_.priority_class);\n  printf(\"  priority                    = 0x%x\\n\",   thread_.priority);\n  printf(\"  teb                         = 0x%\" PRIx64 \"\\n\", thread_.teb);\n  printf(\"  stack.start_of_memory_range = 0x%\" PRIx64 \"\\n\",\n         thread_.stack.start_of_memory_range);\n  printf(\"  stack.memory.data_size      = 0x%x\\n\",\n         thread_.stack.memory.data_size);\n  printf(\"  stack.memory.rva            = 0x%x\\n\",   thread_.stack.memory.rva);\n  printf(\"  thread_context.data_size    = 0x%x\\n\",\n         thread_.thread_context.data_size);\n  printf(\"  thread_context.rva          = 0x%x\\n\",\n         thread_.thread_context.rva);\n\n  MinidumpContext* context = GetContext();\n  if (context) {\n    printf(\"\\n\");\n    context->Print();\n  } else {\n    printf(\"  (no context)\\n\");\n    printf(\"\\n\");\n  }\n\n  MinidumpMemoryRegion* memory = GetMemory();\n  if (memory) {\n    printf(\"Stack\\n\");\n    memory->Print();\n  } else {\n    printf(\"No stack\\n\");\n  }\n  printf(\"\\n\");\n}\n\n\n//\n// MinidumpThreadList\n//\n\n\nu_int32_t MinidumpThreadList::max_threads_ = 4096;\n\n\nMinidumpThreadList::MinidumpThreadList(Minidump* minidump)\n    : MinidumpStream(minidump),\n      id_to_thread_map_(),\n      threads_(NULL),\n      thread_count_(0) {\n}\n\n\nMinidumpThreadList::~MinidumpThreadList() {\n  delete threads_;\n}\n\n\nbool MinidumpThreadList::Read(u_int32_t expected_size) {\n  // Invalidate cached data.\n  id_to_thread_map_.clear();\n  delete threads_;\n  threads_ = NULL;\n  thread_count_ = 0;\n\n  valid_ = false;\n\n  u_int32_t thread_count;\n  if (expected_size < sizeof(thread_count)) {\n    BPLOG(ERROR) << \"MinidumpThreadList count size mismatch, \" <<\n                    expected_size << \" < \" << sizeof(thread_count);\n    return false;\n  }\n  if (!minidump_->ReadBytes(&thread_count, sizeof(thread_count))) {\n    BPLOG(ERROR) << \"MinidumpThreadList cannot read thread count\";\n    return false;\n  }\n\n  if (minidump_->swap())\n    Swap(&thread_count);\n\n  if (thread_count > numeric_limits<u_int32_t>::max() / sizeof(MDRawThread)) {\n    BPLOG(ERROR) << \"MinidumpThreadList thread count \" << thread_count <<\n                    \" would cause multiplication overflow\";\n    return false;\n  }\n\n  if (expected_size != sizeof(thread_count) +\n                       thread_count * sizeof(MDRawThread)) {\n    // may be padded with 4 bytes on 64bit ABIs for alignment\n    if (expected_size == sizeof(thread_count) + 4 +\n                         thread_count * sizeof(MDRawThread)) {\n      u_int32_t useless;\n      if (!minidump_->ReadBytes(&useless, 4)) {\n        BPLOG(ERROR) << \"MinidumpThreadList cannot read threadlist padded bytes\";\n        return false;\n      }\n    } else {\n      BPLOG(ERROR) << \"MinidumpThreadList size mismatch, \" << expected_size <<\n                    \" != \" << sizeof(thread_count) +\n                    thread_count * sizeof(MDRawThread);\n      return false;\n    }\n  }\n\n\n  if (thread_count > max_threads_) {\n    BPLOG(ERROR) << \"MinidumpThreadList count \" << thread_count <<\n                    \" exceeds maximum \" << max_threads_;\n    return false;\n  }\n\n  if (thread_count != 0) {\n    scoped_ptr<MinidumpThreads> threads(\n        new MinidumpThreads(thread_count, MinidumpThread(minidump_)));\n\n    for (unsigned int thread_index = 0;\n         thread_index < thread_count;\n         ++thread_index) {\n      MinidumpThread* thread = &(*threads)[thread_index];\n\n      // Assume that the file offset is correct after the last read.\n      if (!thread->Read()) {\n        BPLOG(ERROR) << \"MinidumpThreadList cannot read thread \" <<\n                        thread_index << \"/\" << thread_count;\n        return false;\n      }\n\n      u_int32_t thread_id;\n      if (!thread->GetThreadID(&thread_id)) {\n        BPLOG(ERROR) << \"MinidumpThreadList cannot get thread ID for thread \" <<\n                        thread_index << \"/\" << thread_count;\n        return false;\n      }\n\n      if (GetThreadByID(thread_id)) {\n        // Another thread with this ID is already in the list.  Data error.\n        BPLOG(ERROR) << \"MinidumpThreadList found multiple threads with ID \" <<\n                        HexString(thread_id) << \" at thread \" <<\n                        thread_index << \"/\" << thread_count;\n        return false;\n      }\n      id_to_thread_map_[thread_id] = thread;\n    }\n\n    threads_ = threads.release();\n  }\n\n  thread_count_ = thread_count;\n\n  valid_ = true;\n  return true;\n}\n\n\nMinidumpThread* MinidumpThreadList::GetThreadAtIndex(unsigned int index)\n    const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpThreadList for GetThreadAtIndex\";\n    return NULL;\n  }\n\n  if (index >= thread_count_) {\n    BPLOG(ERROR) << \"MinidumpThreadList index out of range: \" <<\n                    index << \"/\" << thread_count_;\n    return NULL;\n  }\n\n  return &(*threads_)[index];\n}\n\n\nMinidumpThread* MinidumpThreadList::GetThreadByID(u_int32_t thread_id) {\n  // Don't check valid_.  Read calls this method before everything is\n  // validated.  It is safe to not check valid_ here.\n  return id_to_thread_map_[thread_id];\n}\n\n\nvoid MinidumpThreadList::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpThreadList cannot print invalid data\";\n    return;\n  }\n\n  printf(\"MinidumpThreadList\\n\");\n  printf(\"  thread_count = %d\\n\", thread_count_);\n  printf(\"\\n\");\n\n  for (unsigned int thread_index = 0;\n       thread_index < thread_count_;\n       ++thread_index) {\n    printf(\"thread[%d]\\n\", thread_index);\n\n    (*threads_)[thread_index].Print();\n  }\n}\n\n\n//\n// MinidumpModule\n//\n\n\nu_int32_t MinidumpModule::max_cv_bytes_ = 32768;\nu_int32_t MinidumpModule::max_misc_bytes_ = 32768;\n\n\nMinidumpModule::MinidumpModule(Minidump* minidump)\n    : MinidumpObject(minidump),\n      module_valid_(false),\n      has_debug_info_(false),\n      module_(),\n      name_(NULL),\n      cv_record_(NULL),\n      cv_record_signature_(MD_CVINFOUNKNOWN_SIGNATURE),\n      misc_record_(NULL) {\n}\n\n\nMinidumpModule::~MinidumpModule() {\n  delete name_;\n  delete cv_record_;\n  delete misc_record_;\n}\n\n\nbool MinidumpModule::Read() {\n  // Invalidate cached data.\n  delete name_;\n  name_ = NULL;\n  delete cv_record_;\n  cv_record_ = NULL;\n  cv_record_signature_ = MD_CVINFOUNKNOWN_SIGNATURE;\n  delete misc_record_;\n  misc_record_ = NULL;\n\n  module_valid_ = false;\n  has_debug_info_ = false;\n  valid_ = false;\n\n  if (!minidump_->ReadBytes(&module_, MD_MODULE_SIZE)) {\n    BPLOG(ERROR) << \"MinidumpModule cannot read module\";\n    return false;\n  }\n\n  if (minidump_->swap()) {\n    Swap(&module_.base_of_image);\n    Swap(&module_.size_of_image);\n    Swap(&module_.checksum);\n    Swap(&module_.time_date_stamp);\n    Swap(&module_.module_name_rva);\n    Swap(&module_.version_info.signature);\n    Swap(&module_.version_info.struct_version);\n    Swap(&module_.version_info.file_version_hi);\n    Swap(&module_.version_info.file_version_lo);\n    Swap(&module_.version_info.product_version_hi);\n    Swap(&module_.version_info.product_version_lo);\n    Swap(&module_.version_info.file_flags_mask);\n    Swap(&module_.version_info.file_flags);\n    Swap(&module_.version_info.file_os);\n    Swap(&module_.version_info.file_type);\n    Swap(&module_.version_info.file_subtype);\n    Swap(&module_.version_info.file_date_hi);\n    Swap(&module_.version_info.file_date_lo);\n    Swap(&module_.cv_record);\n    Swap(&module_.misc_record);\n    // Don't swap reserved fields because their contents are unknown (as\n    // are their proper widths).\n  }\n\n  // Check for base + size overflow or undersize.\n  if (module_.size_of_image == 0 ||\n      module_.size_of_image >\n          numeric_limits<u_int64_t>::max() - module_.base_of_image) {\n    BPLOG(ERROR) << \"MinidumpModule has a module problem, \" <<\n                    HexString(module_.base_of_image) << \"+\" <<\n                    HexString(module_.size_of_image);\n    return false;\n  }\n\n  module_valid_ = true;\n  return true;\n}\n\n\nbool MinidumpModule::ReadAuxiliaryData() {\n  if (!module_valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpModule for ReadAuxiliaryData\";\n    return false;\n  }\n\n  // Each module must have a name.\n  name_ = minidump_->ReadString(module_.module_name_rva);\n  if (!name_) {\n    BPLOG(ERROR) << \"MinidumpModule could not read name\";\n    return false;\n  }\n\n  // At this point, we have enough info for the module to be valid.\n  valid_ = true;\n\n  // CodeView and miscellaneous debug records are only required if the\n  // module indicates that they exist.\n  if (module_.cv_record.data_size && !GetCVRecord(NULL)) {\n    BPLOG(ERROR) << \"MinidumpModule has no CodeView record, \"\n                    \"but one was expected\";\n    return false;\n  }\n\n  if (module_.misc_record.data_size && !GetMiscRecord(NULL)) {\n    BPLOG(ERROR) << \"MinidumpModule has no miscellaneous debug record, \"\n                    \"but one was expected\";\n    return false;\n  }\n\n  has_debug_info_ = true;\n  return true;\n}\n\n\nstring MinidumpModule::code_file() const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpModule for code_file\";\n    return \"\";\n  }\n\n  return *name_;\n}\n\n\nstring MinidumpModule::code_identifier() const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpModule for code_identifier\";\n    return \"\";\n  }\n\n  if (!has_debug_info_)\n    return \"\";\n\n  MinidumpSystemInfo *minidump_system_info = minidump_->GetSystemInfo();\n  if (!minidump_system_info) {\n    BPLOG(ERROR) << \"MinidumpModule code_identifier requires \"\n                    \"MinidumpSystemInfo\";\n    return \"\";\n  }\n\n  const MDRawSystemInfo *raw_system_info = minidump_system_info->system_info();\n  if (!raw_system_info) {\n    BPLOG(ERROR) << \"MinidumpModule code_identifier requires MDRawSystemInfo\";\n    return \"\";\n  }\n\n  string identifier;\n\n  switch (raw_system_info->platform_id) {\n    case MD_OS_WIN32_NT:\n    case MD_OS_WIN32_WINDOWS: {\n      // Use the same format that the MS symbol server uses in filesystem\n      // hierarchies.\n      char identifier_string[17];\n      snprintf(identifier_string, sizeof(identifier_string), \"%08X%x\",\n               module_.time_date_stamp, module_.size_of_image);\n      identifier = identifier_string;\n      break;\n    }\n\n    case MD_OS_MAC_OS_X:\n    case MD_OS_IOS:\n    case MD_OS_SOLARIS:\n    case MD_OS_LINUX: {\n      // TODO(mmentovai): support uuid extension if present, otherwise fall\n      // back to version (from LC_ID_DYLIB?), otherwise fall back to something\n      // else.\n      identifier = \"id\";\n      break;\n    }\n\n    default: {\n      // Without knowing what OS generated the dump, we can't generate a good\n      // identifier.  Return an empty string, signalling failure.\n      BPLOG(ERROR) << \"MinidumpModule code_identifier requires known platform, \"\n                      \"found \" << HexString(raw_system_info->platform_id);\n      break;\n    }\n  }\n\n  return identifier;\n}\n\n\nstring MinidumpModule::debug_file() const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpModule for debug_file\";\n    return \"\";\n  }\n\n  if (!has_debug_info_)\n    return \"\";\n\n  string file;\n  // Prefer the CodeView record if present.\n  if (cv_record_) {\n    if (cv_record_signature_ == MD_CVINFOPDB70_SIGNATURE) {\n      // It's actually an MDCVInfoPDB70 structure.\n      const MDCVInfoPDB70* cv_record_70 =\n          reinterpret_cast<const MDCVInfoPDB70*>(&(*cv_record_)[0]);\n      assert(cv_record_70->cv_signature == MD_CVINFOPDB70_SIGNATURE);\n\n      // GetCVRecord guarantees pdb_file_name is null-terminated.\n      file = reinterpret_cast<const char*>(cv_record_70->pdb_file_name);\n    } else if (cv_record_signature_ == MD_CVINFOPDB20_SIGNATURE) {\n      // It's actually an MDCVInfoPDB20 structure.\n      const MDCVInfoPDB20* cv_record_20 =\n          reinterpret_cast<const MDCVInfoPDB20*>(&(*cv_record_)[0]);\n      assert(cv_record_20->cv_header.signature == MD_CVINFOPDB20_SIGNATURE);\n\n      // GetCVRecord guarantees pdb_file_name is null-terminated.\n      file = reinterpret_cast<const char*>(cv_record_20->pdb_file_name);\n    }\n\n    // If there's a CodeView record but it doesn't match a known signature,\n    // try the miscellaneous record.\n  }\n\n  if (file.empty()) {\n    // No usable CodeView record.  Try the miscellaneous debug record.\n    if (misc_record_) {\n      const MDImageDebugMisc* misc_record =\n          reinterpret_cast<const MDImageDebugMisc *>(&(*misc_record_)[0]);\n      if (!misc_record->unicode) {\n        // If it's not Unicode, just stuff it into the string.  It's unclear\n        // if misc_record->data is 0-terminated, so use an explicit size.\n        file = string(\n            reinterpret_cast<const char*>(misc_record->data),\n            module_.misc_record.data_size - MDImageDebugMisc_minsize);\n      } else {\n        // There's a misc_record but it encodes the debug filename in UTF-16.\n        // (Actually, because miscellaneous records are so old, it's probably\n        // UCS-2.)  Convert it to UTF-8 for congruity with the other strings\n        // that this method (and all other methods in the Minidump family)\n        // return.\n\n        unsigned int bytes =\n            module_.misc_record.data_size - MDImageDebugMisc_minsize;\n        if (bytes % 2 == 0) {\n          unsigned int utf16_words = bytes / 2;\n\n          // UTF16ToUTF8 expects a vector<u_int16_t>, so create a temporary one\n          // and copy the UTF-16 data into it.\n          vector<u_int16_t> string_utf16(utf16_words);\n          if (utf16_words)\n            memcpy(&string_utf16[0], &misc_record->data, bytes);\n\n          // GetMiscRecord already byte-swapped the data[] field if it contains\n          // UTF-16, so pass false as the swap argument.\n          scoped_ptr<string> new_file(UTF16ToUTF8(string_utf16, false));\n          file = *new_file;\n        }\n      }\n    }\n  }\n\n  // Relatively common case\n  BPLOG_IF(INFO, file.empty()) << \"MinidumpModule could not determine \"\n                                  \"debug_file for \" << *name_;\n\n  return file;\n}\n\n\nstring MinidumpModule::debug_identifier() const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpModule for debug_identifier\";\n    return \"\";\n  }\n\n  if (!has_debug_info_)\n    return \"\";\n\n  string identifier;\n\n  // Use the CodeView record if present.\n  if (cv_record_) {\n    if (cv_record_signature_ == MD_CVINFOPDB70_SIGNATURE) {\n      // It's actually an MDCVInfoPDB70 structure.\n      const MDCVInfoPDB70* cv_record_70 =\n          reinterpret_cast<const MDCVInfoPDB70*>(&(*cv_record_)[0]);\n      assert(cv_record_70->cv_signature == MD_CVINFOPDB70_SIGNATURE);\n\n      // Use the same format that the MS symbol server uses in filesystem\n      // hierarchies.\n      char identifier_string[41];\n      snprintf(identifier_string, sizeof(identifier_string),\n               \"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%x\",\n               cv_record_70->signature.data1,\n               cv_record_70->signature.data2,\n               cv_record_70->signature.data3,\n               cv_record_70->signature.data4[0],\n               cv_record_70->signature.data4[1],\n               cv_record_70->signature.data4[2],\n               cv_record_70->signature.data4[3],\n               cv_record_70->signature.data4[4],\n               cv_record_70->signature.data4[5],\n               cv_record_70->signature.data4[6],\n               cv_record_70->signature.data4[7],\n               cv_record_70->age);\n      identifier = identifier_string;\n    } else if (cv_record_signature_ == MD_CVINFOPDB20_SIGNATURE) {\n      // It's actually an MDCVInfoPDB20 structure.\n      const MDCVInfoPDB20* cv_record_20 =\n          reinterpret_cast<const MDCVInfoPDB20*>(&(*cv_record_)[0]);\n      assert(cv_record_20->cv_header.signature == MD_CVINFOPDB20_SIGNATURE);\n\n      // Use the same format that the MS symbol server uses in filesystem\n      // hierarchies.\n      char identifier_string[17];\n      snprintf(identifier_string, sizeof(identifier_string),\n               \"%08X%x\", cv_record_20->signature, cv_record_20->age);\n      identifier = identifier_string;\n    }\n  }\n\n  // TODO(mmentovai): if there's no usable CodeView record, there might be a\n  // miscellaneous debug record.  It only carries a filename, though, and no\n  // identifier.  I'm not sure what the right thing to do for the identifier\n  // is in that case, but I don't expect to find many modules without a\n  // CodeView record (or some other Breakpad extension structure in place of\n  // a CodeView record).  Treat it as an error (empty identifier) for now.\n\n  // TODO(mmentovai): on the Mac, provide fallbacks as in code_identifier().\n\n  // Relatively common case\n  BPLOG_IF(INFO, identifier.empty()) << \"MinidumpModule could not determine \"\n                                        \"debug_identifier for \" << *name_;\n\n  return identifier;\n}\n\n\nstring MinidumpModule::version() const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpModule for version\";\n    return \"\";\n  }\n\n  string version;\n\n  if (module_.version_info.signature == MD_VSFIXEDFILEINFO_SIGNATURE &&\n      module_.version_info.struct_version & MD_VSFIXEDFILEINFO_VERSION) {\n    char version_string[24];\n    snprintf(version_string, sizeof(version_string), \"%u.%u.%u.%u\",\n             module_.version_info.file_version_hi >> 16,\n             module_.version_info.file_version_hi & 0xffff,\n             module_.version_info.file_version_lo >> 16,\n             module_.version_info.file_version_lo & 0xffff);\n    version = version_string;\n  }\n\n  // TODO(mmentovai): possibly support other struct types in place of\n  // the one used with MD_VSFIXEDFILEINFO_SIGNATURE.  We can possibly use\n  // a different structure that better represents versioning facilities on\n  // Mac OS X and Linux, instead of forcing them to adhere to the dotted\n  // quad of 16-bit ints that Windows uses.\n\n  BPLOG_IF(INFO, version.empty()) << \"MinidumpModule could not determine \"\n                                     \"version for \" << *name_;\n\n  return version;\n}\n\n\nconst CodeModule* MinidumpModule::Copy() const {\n  return new BasicCodeModule(this);\n}\n\n\nconst u_int8_t* MinidumpModule::GetCVRecord(u_int32_t* size) {\n  if (!module_valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpModule for GetCVRecord\";\n    return NULL;\n  }\n\n  if (!cv_record_) {\n    // This just guards against 0-sized CodeView records; more specific checks\n    // are used when the signature is checked against various structure types.\n    if (module_.cv_record.data_size == 0) {\n      return NULL;\n    }\n\n    if (!minidump_->SeekSet(module_.cv_record.rva)) {\n      BPLOG(ERROR) << \"MinidumpModule could not seek to CodeView record\";\n      return NULL;\n    }\n\n    if (module_.cv_record.data_size > max_cv_bytes_) {\n      BPLOG(ERROR) << \"MinidumpModule CodeView record size \" <<\n                      module_.cv_record.data_size << \" exceeds maximum \" <<\n                      max_cv_bytes_;\n      return NULL;\n    }\n\n    // Allocating something that will be accessed as MDCVInfoPDB70 or\n    // MDCVInfoPDB20 but is allocated as u_int8_t[] can cause alignment\n    // problems.  x86 and ppc are able to cope, though.  This allocation\n    // style is needed because the MDCVInfoPDB70 or MDCVInfoPDB20 are\n    // variable-sized due to their pdb_file_name fields; these structures\n    // are not MDCVInfoPDB70_minsize or MDCVInfoPDB20_minsize and treating\n    // them as such would result in incomplete structures or overruns.\n    scoped_ptr< vector<u_int8_t> > cv_record(\n        new vector<u_int8_t>(module_.cv_record.data_size));\n\n    if (!minidump_->ReadBytes(&(*cv_record)[0], module_.cv_record.data_size)) {\n      BPLOG(ERROR) << \"MinidumpModule could not read CodeView record\";\n      return NULL;\n    }\n\n    u_int32_t signature = MD_CVINFOUNKNOWN_SIGNATURE;\n    if (module_.cv_record.data_size > sizeof(signature)) {\n      MDCVInfoPDB70* cv_record_signature =\n          reinterpret_cast<MDCVInfoPDB70*>(&(*cv_record)[0]);\n      signature = cv_record_signature->cv_signature;\n      if (minidump_->swap())\n        Swap(&signature);\n    }\n\n    if (signature == MD_CVINFOPDB70_SIGNATURE) {\n      // Now that the structure type is known, recheck the size.\n      if (MDCVInfoPDB70_minsize > module_.cv_record.data_size) {\n        BPLOG(ERROR) << \"MinidumpModule CodeView7 record size mismatch, \" <<\n                        MDCVInfoPDB70_minsize << \" > \" <<\n                        module_.cv_record.data_size;\n        return NULL;\n      }\n\n      if (minidump_->swap()) {\n        MDCVInfoPDB70* cv_record_70 =\n            reinterpret_cast<MDCVInfoPDB70*>(&(*cv_record)[0]);\n        Swap(&cv_record_70->cv_signature);\n        Swap(&cv_record_70->signature);\n        Swap(&cv_record_70->age);\n        // Don't swap cv_record_70.pdb_file_name because it's an array of 8-bit\n        // quantities.  (It's a path, is it UTF-8?)\n      }\n\n      // The last field of either structure is null-terminated 8-bit character\n      // data.  Ensure that it's null-terminated.\n      if ((*cv_record)[module_.cv_record.data_size - 1] != '\\0') {\n        BPLOG(ERROR) << \"MinidumpModule CodeView7 record string is not \"\n                        \"0-terminated\";\n        return NULL;\n      }\n    } else if (signature == MD_CVINFOPDB20_SIGNATURE) {\n      // Now that the structure type is known, recheck the size.\n      if (MDCVInfoPDB20_minsize > module_.cv_record.data_size) {\n        BPLOG(ERROR) << \"MinidumpModule CodeView2 record size mismatch, \" <<\n                        MDCVInfoPDB20_minsize << \" > \" <<\n                        module_.cv_record.data_size;\n        return NULL;\n      }\n      if (minidump_->swap()) {\n        MDCVInfoPDB20* cv_record_20 =\n            reinterpret_cast<MDCVInfoPDB20*>(&(*cv_record)[0]);\n        Swap(&cv_record_20->cv_header.signature);\n        Swap(&cv_record_20->cv_header.offset);\n        Swap(&cv_record_20->signature);\n        Swap(&cv_record_20->age);\n        // Don't swap cv_record_20.pdb_file_name because it's an array of 8-bit\n        // quantities.  (It's a path, is it UTF-8?)\n      }\n\n      // The last field of either structure is null-terminated 8-bit character\n      // data.  Ensure that it's null-terminated.\n      if ((*cv_record)[module_.cv_record.data_size - 1] != '\\0') {\n        BPLOG(ERROR) << \"MindumpModule CodeView2 record string is not \"\n                        \"0-terminated\";\n        return NULL;\n      }\n    }\n\n    // If the signature doesn't match something above, it's not something\n    // that Breakpad can presently handle directly.  Because some modules in\n    // the wild contain such CodeView records as MD_CVINFOCV50_SIGNATURE,\n    // don't bail out here - allow the data to be returned to the user,\n    // although byte-swapping can't be done.\n\n    // Store the vector type because that's how storage was allocated, but\n    // return it casted to u_int8_t*.\n    cv_record_ = cv_record.release();\n    cv_record_signature_ = signature;\n  }\n\n  if (size)\n    *size = module_.cv_record.data_size;\n\n  return &(*cv_record_)[0];\n}\n\n\nconst MDImageDebugMisc* MinidumpModule::GetMiscRecord(u_int32_t* size) {\n  if (!module_valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpModule for GetMiscRecord\";\n    return NULL;\n  }\n\n  if (!misc_record_) {\n    if (module_.misc_record.data_size == 0) {\n      return NULL;\n    }\n\n    if (MDImageDebugMisc_minsize > module_.misc_record.data_size) {\n      BPLOG(ERROR) << \"MinidumpModule miscellaneous debugging record \"\n                      \"size mismatch, \" << MDImageDebugMisc_minsize << \" > \" <<\n                      module_.misc_record.data_size;\n      return NULL;\n    }\n\n    if (!minidump_->SeekSet(module_.misc_record.rva)) {\n      BPLOG(ERROR) << \"MinidumpModule could not seek to miscellaneous \"\n                      \"debugging record\";\n      return NULL;\n    }\n\n    if (module_.misc_record.data_size > max_misc_bytes_) {\n      BPLOG(ERROR) << \"MinidumpModule miscellaneous debugging record size \" <<\n                      module_.misc_record.data_size << \" exceeds maximum \" <<\n                      max_misc_bytes_;\n      return NULL;\n    }\n\n    // Allocating something that will be accessed as MDImageDebugMisc but\n    // is allocated as u_int8_t[] can cause alignment problems.  x86 and\n    // ppc are able to cope, though.  This allocation style is needed\n    // because the MDImageDebugMisc is variable-sized due to its data field;\n    // this structure is not MDImageDebugMisc_minsize and treating it as such\n    // would result in an incomplete structure or an overrun.\n    scoped_ptr< vector<u_int8_t> > misc_record_mem(\n        new vector<u_int8_t>(module_.misc_record.data_size));\n    MDImageDebugMisc* misc_record =\n        reinterpret_cast<MDImageDebugMisc*>(&(*misc_record_mem)[0]);\n\n    if (!minidump_->ReadBytes(misc_record, module_.misc_record.data_size)) {\n      BPLOG(ERROR) << \"MinidumpModule could not read miscellaneous debugging \"\n                      \"record\";\n      return NULL;\n    }\n\n    if (minidump_->swap()) {\n      Swap(&misc_record->data_type);\n      Swap(&misc_record->length);\n      // Don't swap misc_record.unicode because it's an 8-bit quantity.\n      // Don't swap the reserved fields for the same reason, and because\n      // they don't contain any valid data.\n      if (misc_record->unicode) {\n        // There is a potential alignment problem, but shouldn't be a problem\n        // in practice due to the layout of MDImageDebugMisc.\n        u_int16_t* data16 = reinterpret_cast<u_int16_t*>(&(misc_record->data));\n        unsigned int dataBytes = module_.misc_record.data_size -\n                                 MDImageDebugMisc_minsize;\n        unsigned int dataLength = dataBytes / 2;\n        for (unsigned int characterIndex = 0;\n             characterIndex < dataLength;\n             ++characterIndex) {\n          Swap(&data16[characterIndex]);\n        }\n      }\n    }\n\n    if (module_.misc_record.data_size != misc_record->length) {\n      BPLOG(ERROR) << \"MinidumpModule miscellaneous debugging record data \"\n                      \"size mismatch, \" << module_.misc_record.data_size <<\n                      \" != \" << misc_record->length;\n      return NULL;\n    }\n\n    // Store the vector type because that's how storage was allocated, but\n    // return it casted to MDImageDebugMisc*.\n    misc_record_ = misc_record_mem.release();\n  }\n\n  if (size)\n    *size = module_.misc_record.data_size;\n\n  return reinterpret_cast<MDImageDebugMisc*>(&(*misc_record_)[0]);\n}\n\n\nvoid MinidumpModule::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpModule cannot print invalid data\";\n    return;\n  }\n\n  printf(\"MDRawModule\\n\");\n  printf(\"  base_of_image                   = 0x%\" PRIx64 \"\\n\",\n         module_.base_of_image);\n  printf(\"  size_of_image                   = 0x%x\\n\",\n         module_.size_of_image);\n  printf(\"  checksum                        = 0x%x\\n\",\n         module_.checksum);\n  printf(\"  time_date_stamp                 = 0x%x\\n\",\n         module_.time_date_stamp);\n  printf(\"  module_name_rva                 = 0x%x\\n\",\n         module_.module_name_rva);\n  printf(\"  version_info.signature          = 0x%x\\n\",\n         module_.version_info.signature);\n  printf(\"  version_info.struct_version     = 0x%x\\n\",\n         module_.version_info.struct_version);\n  printf(\"  version_info.file_version       = 0x%x:0x%x\\n\",\n         module_.version_info.file_version_hi,\n         module_.version_info.file_version_lo);\n  printf(\"  version_info.product_version    = 0x%x:0x%x\\n\",\n         module_.version_info.product_version_hi,\n         module_.version_info.product_version_lo);\n  printf(\"  version_info.file_flags_mask    = 0x%x\\n\",\n         module_.version_info.file_flags_mask);\n  printf(\"  version_info.file_flags         = 0x%x\\n\",\n         module_.version_info.file_flags);\n  printf(\"  version_info.file_os            = 0x%x\\n\",\n         module_.version_info.file_os);\n  printf(\"  version_info.file_type          = 0x%x\\n\",\n         module_.version_info.file_type);\n  printf(\"  version_info.file_subtype       = 0x%x\\n\",\n         module_.version_info.file_subtype);\n  printf(\"  version_info.file_date          = 0x%x:0x%x\\n\",\n         module_.version_info.file_date_hi,\n         module_.version_info.file_date_lo);\n  printf(\"  cv_record.data_size             = %d\\n\",\n         module_.cv_record.data_size);\n  printf(\"  cv_record.rva                   = 0x%x\\n\",\n         module_.cv_record.rva);\n  printf(\"  misc_record.data_size           = %d\\n\",\n         module_.misc_record.data_size);\n  printf(\"  misc_record.rva                 = 0x%x\\n\",\n         module_.misc_record.rva);\n\n  printf(\"  (code_file)                     = \\\"%s\\\"\\n\", code_file().c_str());\n  printf(\"  (code_identifier)               = \\\"%s\\\"\\n\",\n         code_identifier().c_str());\n\n  u_int32_t cv_record_size;\n  const u_int8_t *cv_record = GetCVRecord(&cv_record_size);\n  if (cv_record) {\n    if (cv_record_signature_ == MD_CVINFOPDB70_SIGNATURE) {\n      const MDCVInfoPDB70* cv_record_70 =\n          reinterpret_cast<const MDCVInfoPDB70*>(cv_record);\n      assert(cv_record_70->cv_signature == MD_CVINFOPDB70_SIGNATURE);\n\n      printf(\"  (cv_record).cv_signature        = 0x%x\\n\",\n             cv_record_70->cv_signature);\n      printf(\"  (cv_record).signature           = %08x-%04x-%04x-%02x%02x-\",\n             cv_record_70->signature.data1,\n             cv_record_70->signature.data2,\n             cv_record_70->signature.data3,\n             cv_record_70->signature.data4[0],\n             cv_record_70->signature.data4[1]);\n      for (unsigned int guidIndex = 2;\n           guidIndex < 8;\n           ++guidIndex) {\n        printf(\"%02x\", cv_record_70->signature.data4[guidIndex]);\n      }\n      printf(\"\\n\");\n      printf(\"  (cv_record).age                 = %d\\n\",\n             cv_record_70->age);\n      printf(\"  (cv_record).pdb_file_name       = \\\"%s\\\"\\n\",\n             cv_record_70->pdb_file_name);\n    } else if (cv_record_signature_ == MD_CVINFOPDB20_SIGNATURE) {\n      const MDCVInfoPDB20* cv_record_20 =\n          reinterpret_cast<const MDCVInfoPDB20*>(cv_record);\n      assert(cv_record_20->cv_header.signature == MD_CVINFOPDB20_SIGNATURE);\n\n      printf(\"  (cv_record).cv_header.signature = 0x%x\\n\",\n             cv_record_20->cv_header.signature);\n      printf(\"  (cv_record).cv_header.offset    = 0x%x\\n\",\n             cv_record_20->cv_header.offset);\n      printf(\"  (cv_record).signature           = 0x%x\\n\",\n             cv_record_20->signature);\n      printf(\"  (cv_record).age                 = %d\\n\",\n             cv_record_20->age);\n      printf(\"  (cv_record).pdb_file_name       = \\\"%s\\\"\\n\",\n             cv_record_20->pdb_file_name);\n    } else {\n      printf(\"  (cv_record)                     = \");\n      for (unsigned int cv_byte_index = 0;\n           cv_byte_index < cv_record_size;\n           ++cv_byte_index) {\n        printf(\"%02x\", cv_record[cv_byte_index]);\n      }\n      printf(\"\\n\");\n    }\n  } else {\n    printf(\"  (cv_record)                     = (null)\\n\");\n  }\n\n  const MDImageDebugMisc* misc_record = GetMiscRecord(NULL);\n  if (misc_record) {\n    printf(\"  (misc_record).data_type         = 0x%x\\n\",\n           misc_record->data_type);\n    printf(\"  (misc_record).length            = 0x%x\\n\",\n           misc_record->length);\n    printf(\"  (misc_record).unicode           = %d\\n\",\n           misc_record->unicode);\n    // Don't bother printing the UTF-16, we don't really even expect to ever\n    // see this misc_record anyway.\n    if (misc_record->unicode)\n      printf(\"  (misc_record).data              = \\\"%s\\\"\\n\",\n             misc_record->data);\n    else\n      printf(\"  (misc_record).data              = (UTF-16)\\n\");\n  } else {\n    printf(\"  (misc_record)                   = (null)\\n\");\n  }\n\n  printf(\"  (debug_file)                    = \\\"%s\\\"\\n\", debug_file().c_str());\n  printf(\"  (debug_identifier)              = \\\"%s\\\"\\n\",\n         debug_identifier().c_str());\n  printf(\"  (version)                       = \\\"%s\\\"\\n\", version().c_str());\n  printf(\"\\n\");\n}\n\n\n//\n// MinidumpModuleList\n//\n\n\nu_int32_t MinidumpModuleList::max_modules_ = 1024;\n\n\nMinidumpModuleList::MinidumpModuleList(Minidump* minidump)\n    : MinidumpStream(minidump),\n      range_map_(new RangeMap<u_int64_t, unsigned int>()),\n      modules_(NULL),\n      module_count_(0) {\n}\n\n\nMinidumpModuleList::~MinidumpModuleList() {\n  delete range_map_;\n  delete modules_;\n}\n\n\nbool MinidumpModuleList::Read(u_int32_t expected_size) {\n  // Invalidate cached data.\n  range_map_->Clear();\n  delete modules_;\n  modules_ = NULL;\n  module_count_ = 0;\n\n  valid_ = false;\n\n  u_int32_t module_count;\n  if (expected_size < sizeof(module_count)) {\n    BPLOG(ERROR) << \"MinidumpModuleList count size mismatch, \" <<\n                    expected_size << \" < \" << sizeof(module_count);\n    return false;\n  }\n  if (!minidump_->ReadBytes(&module_count, sizeof(module_count))) {\n    BPLOG(ERROR) << \"MinidumpModuleList could not read module count\";\n    return false;\n  }\n\n  if (minidump_->swap())\n    Swap(&module_count);\n\n  if (module_count > numeric_limits<u_int32_t>::max() / MD_MODULE_SIZE) {\n    BPLOG(ERROR) << \"MinidumpModuleList module count \" << module_count <<\n                    \" would cause multiplication overflow\";\n    return false;\n  }\n\n  if (expected_size != sizeof(module_count) +\n                       module_count * MD_MODULE_SIZE) {\n    // may be padded with 4 bytes on 64bit ABIs for alignment\n    if (expected_size == sizeof(module_count) + 4 +\n                         module_count * MD_MODULE_SIZE) {\n      u_int32_t useless;\n      if (!minidump_->ReadBytes(&useless, 4)) {\n        BPLOG(ERROR) << \"MinidumpModuleList cannot read modulelist padded bytes\";\n        return false;\n      }\n    } else {\n      BPLOG(ERROR) << \"MinidumpModuleList size mismatch, \" << expected_size <<\n                      \" != \" << sizeof(module_count) +\n                      module_count * MD_MODULE_SIZE;\n      return false;\n    }\n  }\n\n  if (module_count > max_modules_) {\n    BPLOG(ERROR) << \"MinidumpModuleList count \" << module_count_ <<\n                    \" exceeds maximum \" << max_modules_;\n    return false;\n  }\n\n  if (module_count != 0) {\n    scoped_ptr<MinidumpModules> modules(\n        new MinidumpModules(module_count, MinidumpModule(minidump_)));\n\n    for (unsigned int module_index = 0;\n         module_index < module_count;\n         ++module_index) {\n      MinidumpModule* module = &(*modules)[module_index];\n\n      // Assume that the file offset is correct after the last read.\n      if (!module->Read()) {\n        BPLOG(ERROR) << \"MinidumpModuleList could not read module \" <<\n                        module_index << \"/\" << module_count;\n        return false;\n      }\n    }\n\n    // Loop through the module list once more to read additional data and\n    // build the range map.  This is done in a second pass because\n    // MinidumpModule::ReadAuxiliaryData seeks around, and if it were\n    // included in the loop above, additional seeks would be needed where\n    // none are now to read contiguous data.\n    for (unsigned int module_index = 0;\n         module_index < module_count;\n         ++module_index) {\n      MinidumpModule* module = &(*modules)[module_index];\n\n      // ReadAuxiliaryData fails if any data that the module indicates should\n      // exist is missing, but we treat some such cases as valid anyway.  See\n      // issue #222: if a debugging record is of a format that's too large to\n      // handle, it shouldn't render the entire dump invalid.  Check module\n      // validity before giving up.\n      if (!module->ReadAuxiliaryData() && !module->valid()) {\n        BPLOG(ERROR) << \"MinidumpModuleList could not read required module \"\n                        \"auxiliary data for module \" <<\n                        module_index << \"/\" << module_count;\n        return false;\n      }\n\n      // It is safe to use module->code_file() after successfully calling\n      // module->ReadAuxiliaryData or noting that the module is valid.\n\n      u_int64_t base_address = module->base_address();\n      u_int64_t module_size = module->size();\n      if (base_address == static_cast<u_int64_t>(-1)) {\n        BPLOG(ERROR) << \"MinidumpModuleList found bad base address \"\n                        \"for module \" << module_index << \"/\" << module_count <<\n                        \", \" << module->code_file();\n        return false;\n      }\n\n      if (!range_map_->StoreRange(base_address, module_size, module_index)) {\n        BPLOG(ERROR) << \"MinidumpModuleList could not store module \" <<\n                        module_index << \"/\" << module_count << \", \" <<\n                        module->code_file() << \", \" <<\n                        HexString(base_address) << \"+\" <<\n                        HexString(module_size);\n        return false;\n      }\n    }\n\n    modules_ = modules.release();\n  }\n\n  module_count_ = module_count;\n\n  valid_ = true;\n  return true;\n}\n\n\nconst MinidumpModule* MinidumpModuleList::GetModuleForAddress(\n    u_int64_t address) const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpModuleList for GetModuleForAddress\";\n    return NULL;\n  }\n\n  unsigned int module_index;\n  if (!range_map_->RetrieveRange(address, &module_index, NULL, NULL)) {\n    BPLOG(INFO) << \"MinidumpModuleList has no module at \" <<\n                   HexString(address);\n    return NULL;\n  }\n\n  return GetModuleAtIndex(module_index);\n}\n\n\nconst MinidumpModule* MinidumpModuleList::GetMainModule() const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpModuleList for GetMainModule\";\n    return NULL;\n  }\n\n  // The main code module is the first one present in a minidump file's\n  // MDRawModuleList.\n  return GetModuleAtIndex(0);\n}\n\n\nconst MinidumpModule* MinidumpModuleList::GetModuleAtSequence(\n    unsigned int sequence) const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpModuleList for GetModuleAtSequence\";\n    return NULL;\n  }\n\n  if (sequence >= module_count_) {\n    BPLOG(ERROR) << \"MinidumpModuleList sequence out of range: \" <<\n                    sequence << \"/\" << module_count_;\n    return NULL;\n  }\n\n  unsigned int module_index;\n  if (!range_map_->RetrieveRangeAtIndex(sequence, &module_index, NULL, NULL)) {\n    BPLOG(ERROR) << \"MinidumpModuleList has no module at sequence \" << sequence;\n    return NULL;\n  }\n\n  return GetModuleAtIndex(module_index);\n}\n\n\nconst MinidumpModule* MinidumpModuleList::GetModuleAtIndex(\n    unsigned int index) const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpModuleList for GetModuleAtIndex\";\n    return NULL;\n  }\n\n  if (index >= module_count_) {\n    BPLOG(ERROR) << \"MinidumpModuleList index out of range: \" <<\n                    index << \"/\" << module_count_;\n    return NULL;\n  }\n\n  return &(*modules_)[index];\n}\n\n\nconst CodeModules* MinidumpModuleList::Copy() const {\n  return new BasicCodeModules(this);\n}\n\n\nvoid MinidumpModuleList::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpModuleList cannot print invalid data\";\n    return;\n  }\n\n  printf(\"MinidumpModuleList\\n\");\n  printf(\"  module_count = %d\\n\", module_count_);\n  printf(\"\\n\");\n\n  for (unsigned int module_index = 0;\n       module_index < module_count_;\n       ++module_index) {\n    printf(\"module[%d]\\n\", module_index);\n\n    (*modules_)[module_index].Print();\n  }\n}\n\n\n//\n// MinidumpMemoryList\n//\n\n\nu_int32_t MinidumpMemoryList::max_regions_ = 4096;\n\n\nMinidumpMemoryList::MinidumpMemoryList(Minidump* minidump)\n    : MinidumpStream(minidump),\n      range_map_(new RangeMap<u_int64_t, unsigned int>()),\n      descriptors_(NULL),\n      regions_(NULL),\n      region_count_(0) {\n}\n\n\nMinidumpMemoryList::~MinidumpMemoryList() {\n  delete range_map_;\n  delete descriptors_;\n  delete regions_;\n}\n\n\nbool MinidumpMemoryList::Read(u_int32_t expected_size) {\n  // Invalidate cached data.\n  delete descriptors_;\n  descriptors_ = NULL;\n  delete regions_;\n  regions_ = NULL;\n  range_map_->Clear();\n  region_count_ = 0;\n\n  valid_ = false;\n\n  u_int32_t region_count;\n  if (expected_size < sizeof(region_count)) {\n    BPLOG(ERROR) << \"MinidumpMemoryList count size mismatch, \" <<\n                    expected_size << \" < \" << sizeof(region_count);\n    return false;\n  }\n  if (!minidump_->ReadBytes(&region_count, sizeof(region_count))) {\n    BPLOG(ERROR) << \"MinidumpMemoryList could not read memory region count\";\n    return false;\n  }\n\n  if (minidump_->swap())\n    Swap(&region_count);\n\n  if (region_count >\n          numeric_limits<u_int32_t>::max() / sizeof(MDMemoryDescriptor)) {\n    BPLOG(ERROR) << \"MinidumpMemoryList region count \" << region_count <<\n                    \" would cause multiplication overflow\";\n    return false;\n  }\n\n  if (expected_size != sizeof(region_count) +\n                       region_count * sizeof(MDMemoryDescriptor)) {\n    // may be padded with 4 bytes on 64bit ABIs for alignment\n    if (expected_size == sizeof(region_count) + 4 +\n                         region_count * sizeof(MDMemoryDescriptor)) {\n      u_int32_t useless;\n      if (!minidump_->ReadBytes(&useless, 4)) {\n        BPLOG(ERROR) << \"MinidumpMemoryList cannot read memorylist padded bytes\";\n        return false;\n      }\n    } else {\n      BPLOG(ERROR) << \"MinidumpMemoryList size mismatch, \" << expected_size <<\n                      \" != \" << sizeof(region_count) + \n                      region_count * sizeof(MDMemoryDescriptor);\n      return false;\n    }\n  }\n\n  if (region_count > max_regions_) {\n    BPLOG(ERROR) << \"MinidumpMemoryList count \" << region_count <<\n                    \" exceeds maximum \" << max_regions_;\n    return false;\n  }\n\n  if (region_count != 0) {\n    scoped_ptr<MemoryDescriptors> descriptors(\n        new MemoryDescriptors(region_count));\n\n    // Read the entire array in one fell swoop, instead of reading one entry\n    // at a time in the loop.\n    if (!minidump_->ReadBytes(&(*descriptors)[0],\n                              sizeof(MDMemoryDescriptor) * region_count)) {\n      BPLOG(ERROR) << \"MinidumpMemoryList could not read memory region list\";\n      return false;\n    }\n\n    scoped_ptr<MemoryRegions> regions(\n        new MemoryRegions(region_count, MinidumpMemoryRegion(minidump_)));\n\n    for (unsigned int region_index = 0;\n         region_index < region_count;\n         ++region_index) {\n      MDMemoryDescriptor* descriptor = &(*descriptors)[region_index];\n\n      if (minidump_->swap())\n        Swap(descriptor);\n\n      u_int64_t base_address = descriptor->start_of_memory_range;\n      u_int32_t region_size = descriptor->memory.data_size;\n\n      // Check for base + size overflow or undersize.\n      if (region_size == 0 ||\n          region_size > numeric_limits<u_int64_t>::max() - base_address) {\n        BPLOG(ERROR) << \"MinidumpMemoryList has a memory region problem, \" <<\n                        \" region \" << region_index << \"/\" << region_count <<\n                        \", \" << HexString(base_address) << \"+\" <<\n                        HexString(region_size);\n        return false;\n      }\n\n      if (!range_map_->StoreRange(base_address, region_size, region_index)) {\n        BPLOG(ERROR) << \"MinidumpMemoryList could not store memory region \" <<\n                        region_index << \"/\" << region_count << \", \" <<\n                        HexString(base_address) << \"+\" <<\n                        HexString(region_size);\n        return false;\n      }\n\n      (*regions)[region_index].SetDescriptor(descriptor);\n    }\n\n    descriptors_ = descriptors.release();\n    regions_ = regions.release();\n  }\n\n  region_count_ = region_count;\n\n  valid_ = true;\n  return true;\n}\n\n\nMinidumpMemoryRegion* MinidumpMemoryList::GetMemoryRegionAtIndex(\n      unsigned int index) {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpMemoryList for GetMemoryRegionAtIndex\";\n    return NULL;\n  }\n\n  if (index >= region_count_) {\n    BPLOG(ERROR) << \"MinidumpMemoryList index out of range: \" <<\n                    index << \"/\" << region_count_;\n    return NULL;\n  }\n\n  return &(*regions_)[index];\n}\n\n\nMinidumpMemoryRegion* MinidumpMemoryList::GetMemoryRegionForAddress(\n    u_int64_t address) {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpMemoryList for GetMemoryRegionForAddress\";\n    return NULL;\n  }\n\n  unsigned int region_index;\n  if (!range_map_->RetrieveRange(address, &region_index, NULL, NULL)) {\n    BPLOG(INFO) << \"MinidumpMemoryList has no memory region at \" <<\n                   HexString(address);\n    return NULL;\n  }\n\n  return GetMemoryRegionAtIndex(region_index);\n}\n\n\nvoid MinidumpMemoryList::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpMemoryList cannot print invalid data\";\n    return;\n  }\n\n  printf(\"MinidumpMemoryList\\n\");\n  printf(\"  region_count = %d\\n\", region_count_);\n  printf(\"\\n\");\n\n  for (unsigned int region_index = 0;\n       region_index < region_count_;\n       ++region_index) {\n    MDMemoryDescriptor* descriptor = &(*descriptors_)[region_index];\n    printf(\"region[%d]\\n\", region_index);\n    printf(\"MDMemoryDescriptor\\n\");\n    printf(\"  start_of_memory_range = 0x%\" PRIx64 \"\\n\",\n           descriptor->start_of_memory_range);\n    printf(\"  memory.data_size      = 0x%x\\n\", descriptor->memory.data_size);\n    printf(\"  memory.rva            = 0x%x\\n\", descriptor->memory.rva);\n    MinidumpMemoryRegion* region = GetMemoryRegionAtIndex(region_index);\n    if (region) {\n      printf(\"Memory\\n\");\n      region->Print();\n    } else {\n      printf(\"No memory\\n\");\n    }\n    printf(\"\\n\");\n  }\n}\n\n\n//\n// MinidumpException\n//\n\n\nMinidumpException::MinidumpException(Minidump* minidump)\n    : MinidumpStream(minidump),\n      exception_(),\n      context_(NULL) {\n}\n\n\nMinidumpException::~MinidumpException() {\n  delete context_;\n}\n\n\nbool MinidumpException::Read(u_int32_t expected_size) {\n  // Invalidate cached data.\n  delete context_;\n  context_ = NULL;\n\n  valid_ = false;\n\n  if (expected_size != sizeof(exception_)) {\n    BPLOG(ERROR) << \"MinidumpException size mismatch, \" << expected_size <<\n                    \" != \" << sizeof(exception_);\n    return false;\n  }\n\n  if (!minidump_->ReadBytes(&exception_, sizeof(exception_))) {\n    BPLOG(ERROR) << \"MinidumpException cannot read exception\";\n    return false;\n  }\n\n  if (minidump_->swap()) {\n    Swap(&exception_.thread_id);\n    // exception_.__align is for alignment only and does not need to be\n    // swapped.\n    Swap(&exception_.exception_record.exception_code);\n    Swap(&exception_.exception_record.exception_flags);\n    Swap(&exception_.exception_record.exception_record);\n    Swap(&exception_.exception_record.exception_address);\n    Swap(&exception_.exception_record.number_parameters);\n    // exception_.exception_record.__align is for alignment only and does not\n    // need to be swapped.\n    for (unsigned int parameter_index = 0;\n         parameter_index < MD_EXCEPTION_MAXIMUM_PARAMETERS;\n         ++parameter_index) {\n      Swap(&exception_.exception_record.exception_information[parameter_index]);\n    }\n    Swap(&exception_.thread_context);\n  }\n\n  valid_ = true;\n  return true;\n}\n\n\nbool MinidumpException::GetThreadID(u_int32_t *thread_id) const {\n  BPLOG_IF(ERROR, !thread_id) << \"MinidumpException::GetThreadID requires \"\n                                 \"|thread_id|\";\n  assert(thread_id);\n  *thread_id = 0;\n\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpException for GetThreadID\";\n    return false;\n  }\n\n  *thread_id = exception_.thread_id;\n  return true;\n}\n\n\nMinidumpContext* MinidumpException::GetContext() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpException for GetContext\";\n    return NULL;\n  }\n\n  if (!context_) {\n    if (!minidump_->SeekSet(exception_.thread_context.rva)) {\n      BPLOG(ERROR) << \"MinidumpException cannot seek to context\";\n      return NULL;\n    }\n\n    scoped_ptr<MinidumpContext> context(new MinidumpContext(minidump_));\n\n    // Don't log as an error if we can still fall back on the thread's context\n    // (which must be possible if we got this far.)\n    if (!context->Read(exception_.thread_context.data_size)) {\n      BPLOG(INFO) << \"MinidumpException cannot read context\";\n      return NULL;\n    }\n\n    context_ = context.release();\n  }\n\n  return context_;\n}\n\n\nvoid MinidumpException::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpException cannot print invalid data\";\n    return;\n  }\n\n  printf(\"MDException\\n\");\n  printf(\"  thread_id                                  = 0x%x\\n\",\n         exception_.thread_id);\n  printf(\"  exception_record.exception_code            = 0x%x\\n\",\n         exception_.exception_record.exception_code);\n  printf(\"  exception_record.exception_flags           = 0x%x\\n\",\n         exception_.exception_record.exception_flags);\n  printf(\"  exception_record.exception_record          = 0x%\" PRIx64 \"\\n\",\n         exception_.exception_record.exception_record);\n  printf(\"  exception_record.exception_address         = 0x%\" PRIx64 \"\\n\",\n         exception_.exception_record.exception_address);\n  printf(\"  exception_record.number_parameters         = %d\\n\",\n         exception_.exception_record.number_parameters);\n  for (unsigned int parameterIndex = 0;\n       parameterIndex < exception_.exception_record.number_parameters;\n       ++parameterIndex) {\n    printf(\"  exception_record.exception_information[%2d] = 0x%\" PRIx64 \"\\n\",\n           parameterIndex,\n           exception_.exception_record.exception_information[parameterIndex]);\n  }\n  printf(\"  thread_context.data_size                   = %d\\n\",\n         exception_.thread_context.data_size);\n  printf(\"  thread_context.rva                         = 0x%x\\n\",\n         exception_.thread_context.rva);\n  MinidumpContext* context = GetContext();\n  if (context) {\n    printf(\"\\n\");\n    context->Print();\n  } else {\n    printf(\"  (no context)\\n\");\n    printf(\"\\n\");\n  }\n}\n\n//\n// MinidumpAssertion\n//\n\n\nMinidumpAssertion::MinidumpAssertion(Minidump* minidump)\n    : MinidumpStream(minidump),\n      assertion_(),\n      expression_(),\n      function_(),\n      file_() {\n}\n\n\nMinidumpAssertion::~MinidumpAssertion() {\n}\n\n\nbool MinidumpAssertion::Read(u_int32_t expected_size) {\n  // Invalidate cached data.\n  valid_ = false;\n\n  if (expected_size != sizeof(assertion_)) {\n    BPLOG(ERROR) << \"MinidumpAssertion size mismatch, \" << expected_size <<\n                    \" != \" << sizeof(assertion_);\n    return false;\n  }\n\n  if (!minidump_->ReadBytes(&assertion_, sizeof(assertion_))) {\n    BPLOG(ERROR) << \"MinidumpAssertion cannot read assertion\";\n    return false;\n  }\n\n  // Each of {expression, function, file} is a UTF-16 string,\n  // we'll convert them to UTF-8 for ease of use.\n  // expression\n  // Since we don't have an explicit byte length for each string,\n  // we use UTF16codeunits to calculate word length, then derive byte\n  // length from that.\n  u_int32_t word_length = UTF16codeunits(assertion_.expression,\n                                         sizeof(assertion_.expression));\n  if (word_length > 0) {\n    u_int32_t byte_length = word_length * 2;\n    vector<u_int16_t> expression_utf16(word_length);\n    memcpy(&expression_utf16[0], &assertion_.expression[0], byte_length);\n\n    scoped_ptr<string> new_expression(UTF16ToUTF8(expression_utf16,\n                                                  minidump_->swap()));\n    if (new_expression.get())\n      expression_ = *new_expression;\n  }\n  \n  // assertion\n  word_length = UTF16codeunits(assertion_.function,\n                               sizeof(assertion_.function));\n  if (word_length) {\n    u_int32_t byte_length = word_length * 2;\n    vector<u_int16_t> function_utf16(word_length);\n    memcpy(&function_utf16[0], &assertion_.function[0], byte_length);\n    scoped_ptr<string> new_function(UTF16ToUTF8(function_utf16,\n                                                minidump_->swap()));\n    if (new_function.get())\n      function_ = *new_function;\n  }\n\n  // file\n  word_length = UTF16codeunits(assertion_.file,\n                               sizeof(assertion_.file));\n  if (word_length > 0) {\n    u_int32_t byte_length = word_length * 2;\n    vector<u_int16_t> file_utf16(word_length);\n    memcpy(&file_utf16[0], &assertion_.file[0], byte_length);\n    scoped_ptr<string> new_file(UTF16ToUTF8(file_utf16,\n                                            minidump_->swap()));\n    if (new_file.get())\n      file_ = *new_file;\n  }\n\n  if (minidump_->swap()) {\n    Swap(&assertion_.line);\n    Swap(&assertion_.type);\n  }\n\n  valid_ = true;\n  return true;\n}\n\nvoid MinidumpAssertion::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpAssertion cannot print invalid data\";\n    return;\n  }\n\n  printf(\"MDAssertion\\n\");\n  printf(\"  expression                                 = %s\\n\",\n         expression_.c_str());\n  printf(\"  function                                   = %s\\n\",\n         function_.c_str());\n  printf(\"  file                                       = %s\\n\",\n         file_.c_str());\n  printf(\"  line                                       = %u\\n\",\n         assertion_.line);\n  printf(\"  type                                       = %u\\n\",\n         assertion_.type);\n  printf(\"\\n\");\n}\n\n//\n// MinidumpSystemInfo\n//\n\n\nMinidumpSystemInfo::MinidumpSystemInfo(Minidump* minidump)\n    : MinidumpStream(minidump),\n      system_info_(),\n      csd_version_(NULL),\n      cpu_vendor_(NULL) {\n}\n\n\nMinidumpSystemInfo::~MinidumpSystemInfo() {\n  delete csd_version_;\n  delete cpu_vendor_;\n}\n\n\nbool MinidumpSystemInfo::Read(u_int32_t expected_size) {\n  // Invalidate cached data.\n  delete csd_version_;\n  csd_version_ = NULL;\n  delete cpu_vendor_;\n  cpu_vendor_ = NULL;\n\n  valid_ = false;\n\n  if (expected_size != sizeof(system_info_)) {\n    BPLOG(ERROR) << \"MinidumpSystemInfo size mismatch, \" << expected_size <<\n                    \" != \" << sizeof(system_info_);\n    return false;\n  }\n\n  if (!minidump_->ReadBytes(&system_info_, sizeof(system_info_))) {\n    BPLOG(ERROR) << \"MinidumpSystemInfo cannot read system info\";\n    return false;\n  }\n\n  if (minidump_->swap()) {\n    Swap(&system_info_.processor_architecture);\n    Swap(&system_info_.processor_level);\n    Swap(&system_info_.processor_revision);\n    // number_of_processors and product_type are 8-bit quantities and need no\n    // swapping.\n    Swap(&system_info_.major_version);\n    Swap(&system_info_.minor_version);\n    Swap(&system_info_.build_number);\n    Swap(&system_info_.platform_id);\n    Swap(&system_info_.csd_version_rva);\n    Swap(&system_info_.suite_mask);\n    // Don't swap the reserved2 field because its contents are unknown.\n\n    if (system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86 ||\n        system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86_WIN64) {\n      for (unsigned int i = 0; i < 3; ++i)\n        Swap(&system_info_.cpu.x86_cpu_info.vendor_id[i]);\n      Swap(&system_info_.cpu.x86_cpu_info.version_information);\n      Swap(&system_info_.cpu.x86_cpu_info.feature_information);\n      Swap(&system_info_.cpu.x86_cpu_info.amd_extended_cpu_features);\n    } else {\n      for (unsigned int i = 0; i < 2; ++i)\n        Swap(&system_info_.cpu.other_cpu_info.processor_features[i]);\n    }\n  }\n\n  valid_ = true;\n  return true;\n}\n\n\nstring MinidumpSystemInfo::GetOS() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpSystemInfo for GetOS\";\n    return NULL;\n  }\n\n  string os;\n\n  switch (system_info_.platform_id) {\n    case MD_OS_WIN32_NT:\n    case MD_OS_WIN32_WINDOWS:\n      os = \"windows\";\n      break;\n\n    case MD_OS_MAC_OS_X:\n      os = \"mac\";\n      break;\n\n    case MD_OS_IOS:\n      os = \"ios\";\n      break;\n\n    case MD_OS_LINUX:\n      os = \"linux\";\n      break;\n\n    case MD_OS_SOLARIS:\n      os = \"solaris\";\n      break;\n\n    default:\n      BPLOG(ERROR) << \"MinidumpSystemInfo unknown OS for platform \" <<\n                      HexString(system_info_.platform_id);\n      break;\n  }\n\n  return os;\n}\n\n\nstring MinidumpSystemInfo::GetCPU() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpSystemInfo for GetCPU\";\n    return \"\";\n  }\n\n  string cpu;\n\n  switch (system_info_.processor_architecture) {\n    case MD_CPU_ARCHITECTURE_X86:\n    case MD_CPU_ARCHITECTURE_X86_WIN64:\n      cpu = \"x86\";\n      break;\n\n    case MD_CPU_ARCHITECTURE_AMD64:\n      cpu = \"x86-64\";\n      break;\n\n    case MD_CPU_ARCHITECTURE_PPC:\n      cpu = \"ppc\";\n      break;\n\n    case MD_CPU_ARCHITECTURE_SPARC:\n      cpu = \"sparc\";\n      break;\n\n    case MD_CPU_ARCHITECTURE_ARM:\n      cpu = \"arm\";\n      break;\n\n    default:\n      BPLOG(ERROR) << \"MinidumpSystemInfo unknown CPU for architecture \" <<\n                      HexString(system_info_.processor_architecture);\n      break;\n  }\n\n  return cpu;\n}\n\n\nconst string* MinidumpSystemInfo::GetCSDVersion() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpSystemInfo for GetCSDVersion\";\n    return NULL;\n  }\n\n  if (!csd_version_)\n    csd_version_ = minidump_->ReadString(system_info_.csd_version_rva);\n\n  BPLOG_IF(ERROR, !csd_version_) << \"MinidumpSystemInfo could not read \"\n                                    \"CSD version\";\n\n  return csd_version_;\n}\n\n\nconst string* MinidumpSystemInfo::GetCPUVendor() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpSystemInfo for GetCPUVendor\";\n    return NULL;\n  }\n\n  // CPU vendor information can only be determined from x86 minidumps.\n  if (!cpu_vendor_ &&\n      (system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86 ||\n       system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86_WIN64)) {\n    char cpu_vendor_string[13];\n    snprintf(cpu_vendor_string, sizeof(cpu_vendor_string),\n             \"%c%c%c%c%c%c%c%c%c%c%c%c\",\n              system_info_.cpu.x86_cpu_info.vendor_id[0] & 0xff,\n             (system_info_.cpu.x86_cpu_info.vendor_id[0] >> 8) & 0xff,\n             (system_info_.cpu.x86_cpu_info.vendor_id[0] >> 16) & 0xff,\n             (system_info_.cpu.x86_cpu_info.vendor_id[0] >> 24) & 0xff,\n              system_info_.cpu.x86_cpu_info.vendor_id[1] & 0xff,\n             (system_info_.cpu.x86_cpu_info.vendor_id[1] >> 8) & 0xff,\n             (system_info_.cpu.x86_cpu_info.vendor_id[1] >> 16) & 0xff,\n             (system_info_.cpu.x86_cpu_info.vendor_id[1] >> 24) & 0xff,\n              system_info_.cpu.x86_cpu_info.vendor_id[2] & 0xff,\n             (system_info_.cpu.x86_cpu_info.vendor_id[2] >> 8) & 0xff,\n             (system_info_.cpu.x86_cpu_info.vendor_id[2] >> 16) & 0xff,\n             (system_info_.cpu.x86_cpu_info.vendor_id[2] >> 24) & 0xff);\n    cpu_vendor_ = new string(cpu_vendor_string);\n  }\n\n  return cpu_vendor_;\n}\n\n\nvoid MinidumpSystemInfo::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpSystemInfo cannot print invalid data\";\n    return;\n  }\n\n  printf(\"MDRawSystemInfo\\n\");\n  printf(\"  processor_architecture                     = %d\\n\",\n         system_info_.processor_architecture);\n  printf(\"  processor_level                            = %d\\n\",\n         system_info_.processor_level);\n  printf(\"  processor_revision                         = 0x%x\\n\",\n         system_info_.processor_revision);\n  printf(\"  number_of_processors                       = %d\\n\",\n         system_info_.number_of_processors);\n  printf(\"  product_type                               = %d\\n\",\n         system_info_.product_type);\n  printf(\"  major_version                              = %d\\n\",\n         system_info_.major_version);\n  printf(\"  minor_version                              = %d\\n\",\n         system_info_.minor_version);\n  printf(\"  build_number                               = %d\\n\",\n         system_info_.build_number);\n  printf(\"  platform_id                                = %d\\n\",\n         system_info_.platform_id);\n  printf(\"  csd_version_rva                            = 0x%x\\n\",\n         system_info_.csd_version_rva);\n  printf(\"  suite_mask                                 = 0x%x\\n\",\n         system_info_.suite_mask);\n  for (unsigned int i = 0; i < 3; ++i) {\n    printf(\"  cpu.x86_cpu_info.vendor_id[%d]              = 0x%x\\n\",\n           i, system_info_.cpu.x86_cpu_info.vendor_id[i]);\n  }\n  printf(\"  cpu.x86_cpu_info.version_information       = 0x%x\\n\",\n         system_info_.cpu.x86_cpu_info.version_information);\n  printf(\"  cpu.x86_cpu_info.feature_information       = 0x%x\\n\",\n         system_info_.cpu.x86_cpu_info.feature_information);\n  printf(\"  cpu.x86_cpu_info.amd_extended_cpu_features = 0x%x\\n\",\n         system_info_.cpu.x86_cpu_info.amd_extended_cpu_features);\n  const string* csd_version = GetCSDVersion();\n  if (csd_version) {\n    printf(\"  (csd_version)                              = \\\"%s\\\"\\n\",\n           csd_version->c_str());\n  } else {\n    printf(\"  (csd_version)                              = (null)\\n\");\n  }\n  const string* cpu_vendor = GetCPUVendor();\n  if (cpu_vendor) {\n    printf(\"  (cpu_vendor)                               = \\\"%s\\\"\\n\",\n           cpu_vendor->c_str());\n  } else {\n    printf(\"  (cpu_vendor)                               = (null)\\n\");\n  }\n  printf(\"\\n\");\n}\n\n\n//\n// MinidumpMiscInfo\n//\n\n\nMinidumpMiscInfo::MinidumpMiscInfo(Minidump* minidump)\n    : MinidumpStream(minidump),\n      misc_info_() {\n}\n\n\nbool MinidumpMiscInfo::Read(u_int32_t expected_size) {\n  valid_ = false;\n\n  if (expected_size != MD_MISCINFO_SIZE &&\n      expected_size != MD_MISCINFO2_SIZE) {\n    BPLOG(ERROR) << \"MinidumpMiscInfo size mismatch, \" << expected_size <<\n                    \" != \" << MD_MISCINFO_SIZE << \", \" << MD_MISCINFO2_SIZE <<\n                    \")\";\n    return false;\n  }\n\n  if (!minidump_->ReadBytes(&misc_info_, expected_size)) {\n    BPLOG(ERROR) << \"MinidumpMiscInfo cannot read miscellaneous info\";\n    return false;\n  }\n\n  if (minidump_->swap()) {\n    Swap(&misc_info_.size_of_info);\n    Swap(&misc_info_.flags1);\n    Swap(&misc_info_.process_id);\n    Swap(&misc_info_.process_create_time);\n    Swap(&misc_info_.process_user_time);\n    Swap(&misc_info_.process_kernel_time);\n    if (misc_info_.size_of_info > MD_MISCINFO_SIZE) {\n      Swap(&misc_info_.processor_max_mhz);\n      Swap(&misc_info_.processor_current_mhz);\n      Swap(&misc_info_.processor_mhz_limit);\n      Swap(&misc_info_.processor_max_idle_state);\n      Swap(&misc_info_.processor_current_idle_state);\n    }\n  }\n\n  if (expected_size != misc_info_.size_of_info) {\n    BPLOG(ERROR) << \"MinidumpMiscInfo size mismatch, \" <<\n                    expected_size << \" != \" << misc_info_.size_of_info;\n    return false;\n  }\n\n  valid_ = true;\n  return true;\n}\n\n\nvoid MinidumpMiscInfo::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpMiscInfo cannot print invalid data\";\n    return;\n  }\n\n  printf(\"MDRawMiscInfo\\n\");\n  printf(\"  size_of_info                 = %d\\n\",   misc_info_.size_of_info);\n  printf(\"  flags1                       = 0x%x\\n\", misc_info_.flags1);\n  printf(\"  process_id                   = 0x%x\\n\", misc_info_.process_id);\n  printf(\"  process_create_time          = 0x%x\\n\",\n         misc_info_.process_create_time);\n  printf(\"  process_user_time            = 0x%x\\n\",\n         misc_info_.process_user_time);\n  printf(\"  process_kernel_time          = 0x%x\\n\",\n         misc_info_.process_kernel_time);\n  if (misc_info_.size_of_info > MD_MISCINFO_SIZE) {\n    printf(\"  processor_max_mhz            = %d\\n\",\n           misc_info_.processor_max_mhz);\n    printf(\"  processor_current_mhz        = %d\\n\",\n           misc_info_.processor_current_mhz);\n    printf(\"  processor_mhz_limit          = %d\\n\",\n           misc_info_.processor_mhz_limit);\n    printf(\"  processor_max_idle_state     = 0x%x\\n\",\n           misc_info_.processor_max_idle_state);\n    printf(\"  processor_current_idle_state = 0x%x\\n\",\n           misc_info_.processor_current_idle_state);\n  }\n  printf(\"\\n\");\n}\n\n\n//\n// MinidumpBreakpadInfo\n//\n\n\nMinidumpBreakpadInfo::MinidumpBreakpadInfo(Minidump* minidump)\n    : MinidumpStream(minidump),\n      breakpad_info_() {\n}\n\n\nbool MinidumpBreakpadInfo::Read(u_int32_t expected_size) {\n  valid_ = false;\n\n  if (expected_size != sizeof(breakpad_info_)) {\n    BPLOG(ERROR) << \"MinidumpBreakpadInfo size mismatch, \" << expected_size <<\n                    \" != \" << sizeof(breakpad_info_);\n    return false;\n  }\n\n  if (!minidump_->ReadBytes(&breakpad_info_, sizeof(breakpad_info_))) {\n    BPLOG(ERROR) << \"MinidumpBreakpadInfo cannot read Breakpad info\";\n    return false;\n  }\n\n  if (minidump_->swap()) {\n    Swap(&breakpad_info_.validity);\n    Swap(&breakpad_info_.dump_thread_id);\n    Swap(&breakpad_info_.requesting_thread_id);\n  }\n\n  valid_ = true;\n  return true;\n}\n\n\nbool MinidumpBreakpadInfo::GetDumpThreadID(u_int32_t *thread_id) const {\n  BPLOG_IF(ERROR, !thread_id) << \"MinidumpBreakpadInfo::GetDumpThreadID \"\n                                 \"requires |thread_id|\";\n  assert(thread_id);\n  *thread_id = 0;\n\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpBreakpadInfo for GetDumpThreadID\";\n    return false;\n  }\n\n  if (!(breakpad_info_.validity & MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID)) {\n    BPLOG(INFO) << \"MinidumpBreakpadInfo has no dump thread\";\n    return false;\n  }\n\n  *thread_id = breakpad_info_.dump_thread_id;\n  return true;\n}\n\n\nbool MinidumpBreakpadInfo::GetRequestingThreadID(u_int32_t *thread_id)\n    const {\n  BPLOG_IF(ERROR, !thread_id) << \"MinidumpBreakpadInfo::GetRequestingThreadID \"\n                                 \"requires |thread_id|\";\n  assert(thread_id);\n  *thread_id = 0;\n\n  if (!thread_id || !valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpBreakpadInfo for GetRequestingThreadID\";\n    return false;\n  }\n\n  if (!(breakpad_info_.validity &\n            MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID)) {\n    BPLOG(INFO) << \"MinidumpBreakpadInfo has no requesting thread\";\n    return false;\n  }\n\n  *thread_id = breakpad_info_.requesting_thread_id;\n  return true;\n}\n\n\nvoid MinidumpBreakpadInfo::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpBreakpadInfo cannot print invalid data\";\n    return;\n  }\n\n  printf(\"MDRawBreakpadInfo\\n\");\n  printf(\"  validity             = 0x%x\\n\", breakpad_info_.validity);\n\n  if (breakpad_info_.validity & MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID) {\n    printf(\"  dump_thread_id       = 0x%x\\n\", breakpad_info_.dump_thread_id);\n  } else {\n    printf(\"  dump_thread_id       = (invalid)\\n\");\n  }\n\n  if (breakpad_info_.validity & MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID) {\n    printf(\"  requesting_thread_id = 0x%x\\n\",\n           breakpad_info_.requesting_thread_id);\n  } else {\n    printf(\"  requesting_thread_id = (invalid)\\n\");\n  }\n\n  printf(\"\\n\");\n}\n\n\n//\n// MinidumpMemoryInfo\n//\n\n\nMinidumpMemoryInfo::MinidumpMemoryInfo(Minidump* minidump)\n    : MinidumpObject(minidump),\n      memory_info_() {\n}\n\n\nbool MinidumpMemoryInfo::IsExecutable() const {\n  u_int32_t protection =\n      memory_info_.protection & MD_MEMORY_PROTECTION_ACCESS_MASK;\n  return protection == MD_MEMORY_PROTECT_EXECUTE ||\n      protection == MD_MEMORY_PROTECT_EXECUTE_READ ||\n      protection == MD_MEMORY_PROTECT_EXECUTE_READWRITE;\n}\n\n\nbool MinidumpMemoryInfo::IsWritable() const {\n  u_int32_t protection =\n      memory_info_.protection & MD_MEMORY_PROTECTION_ACCESS_MASK;\n  return protection == MD_MEMORY_PROTECT_READWRITE ||\n    protection == MD_MEMORY_PROTECT_WRITECOPY ||\n    protection == MD_MEMORY_PROTECT_EXECUTE_READWRITE ||\n    protection == MD_MEMORY_PROTECT_EXECUTE_WRITECOPY;\n}\n\n\nbool MinidumpMemoryInfo::Read() {\n  valid_ = false;\n\n  if (!minidump_->ReadBytes(&memory_info_, sizeof(memory_info_))) {\n    BPLOG(ERROR) << \"MinidumpMemoryInfo cannot read memory info\";\n    return false;\n  }\n\n  if (minidump_->swap()) {\n    Swap(&memory_info_.base_address);\n    Swap(&memory_info_.allocation_base);\n    Swap(&memory_info_.allocation_protection);\n    Swap(&memory_info_.region_size);\n    Swap(&memory_info_.state);\n    Swap(&memory_info_.protection);\n    Swap(&memory_info_.type);\n  }\n\n  // Check for base + size overflow or undersize.\n  if (memory_info_.region_size == 0 ||\n      memory_info_.region_size > numeric_limits<u_int64_t>::max() -\n                                     memory_info_.base_address) {\n    BPLOG(ERROR) << \"MinidumpMemoryInfo has a memory region problem, \" <<\n                    HexString(memory_info_.base_address) << \"+\" <<\n                    HexString(memory_info_.region_size);\n    return false;\n  }\n\n  valid_ = true;\n  return true;\n}\n\n\nvoid MinidumpMemoryInfo::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpMemoryInfo cannot print invalid data\";\n    return;\n  }\n\n  printf(\"MDRawMemoryInfo\\n\");\n  printf(\"  base_address          = 0x%\" PRIx64 \"\\n\",\n         memory_info_.base_address);\n  printf(\"  allocation_base       = 0x%\" PRIx64 \"\\n\",\n         memory_info_.allocation_base);\n  printf(\"  allocation_protection = 0x%x\\n\",\n         memory_info_.allocation_protection);\n  printf(\"  region_size           = 0x%\" PRIx64 \"\\n\", memory_info_.region_size);\n  printf(\"  state                 = 0x%x\\n\", memory_info_.state);\n  printf(\"  protection            = 0x%x\\n\", memory_info_.protection);\n  printf(\"  type                  = 0x%x\\n\", memory_info_.type);\n}\n\n\n//\n// MinidumpMemoryInfoList\n//\n\n\nMinidumpMemoryInfoList::MinidumpMemoryInfoList(Minidump* minidump)\n    : MinidumpStream(minidump),\n      range_map_(new RangeMap<u_int64_t, unsigned int>()),\n      infos_(NULL),\n      info_count_(0) {\n}\n\n\nMinidumpMemoryInfoList::~MinidumpMemoryInfoList() {\n  delete range_map_;\n  delete infos_;\n}\n\n\nbool MinidumpMemoryInfoList::Read(u_int32_t expected_size) {\n  // Invalidate cached data.\n  delete infos_;\n  infos_ = NULL;\n  range_map_->Clear();\n  info_count_ = 0;\n\n  valid_ = false;\n\n  MDRawMemoryInfoList header;\n  if (expected_size < sizeof(MDRawMemoryInfoList)) {\n    BPLOG(ERROR) << \"MinidumpMemoryInfoList header size mismatch, \" <<\n                    expected_size << \" < \" << sizeof(MDRawMemoryInfoList);\n    return false;\n  }\n  if (!minidump_->ReadBytes(&header, sizeof(header))) {\n    BPLOG(ERROR) << \"MinidumpMemoryInfoList could not read header\";\n    return false;\n  }\n\n  if (minidump_->swap()) {\n    Swap(&header.size_of_header);\n    Swap(&header.size_of_entry);\n    Swap(&header.number_of_entries);\n  }\n\n  // Sanity check that the header is the expected size.\n  //TODO(ted): could possibly handle this more gracefully, assuming\n  // that future versions of the structs would be backwards-compatible.\n  if (header.size_of_header != sizeof(MDRawMemoryInfoList)) {\n    BPLOG(ERROR) << \"MinidumpMemoryInfoList header size mismatch, \" <<\n                    header.size_of_header << \" != \" <<\n                    sizeof(MDRawMemoryInfoList);\n    return false;\n  }\n\n  // Sanity check that the entries are the expected size.\n  if (header.size_of_entry != sizeof(MDRawMemoryInfo)) {\n    BPLOG(ERROR) << \"MinidumpMemoryInfoList entry size mismatch, \" <<\n                    header.size_of_entry << \" != \" <<\n                    sizeof(MDRawMemoryInfo);\n    return false;\n  }\n\n  if (header.number_of_entries >\n          numeric_limits<u_int32_t>::max() / sizeof(MDRawMemoryInfo)) {\n    BPLOG(ERROR) << \"MinidumpMemoryInfoList info count \" <<\n                    header.number_of_entries <<\n                    \" would cause multiplication overflow\";\n    return false;\n  }\n\n  if (expected_size != sizeof(MDRawMemoryInfoList) +\n                        header.number_of_entries * sizeof(MDRawMemoryInfo)) {\n    BPLOG(ERROR) << \"MinidumpMemoryInfoList size mismatch, \" << expected_size <<\n                    \" != \" << sizeof(MDRawMemoryInfoList) +\n                        header.number_of_entries * sizeof(MDRawMemoryInfo);\n    return false;\n  }\n\n  if (header.number_of_entries != 0) {\n    scoped_ptr<MinidumpMemoryInfos> infos(\n        new MinidumpMemoryInfos(header.number_of_entries,\n                                MinidumpMemoryInfo(minidump_)));\n\n    for (unsigned int index = 0;\n         index < header.number_of_entries;\n         ++index) {\n      MinidumpMemoryInfo* info = &(*infos)[index];\n\n      // Assume that the file offset is correct after the last read.\n      if (!info->Read()) {\n        BPLOG(ERROR) << \"MinidumpMemoryInfoList cannot read info \" <<\n                        index << \"/\" << header.number_of_entries;\n        return false;\n      }\n\n      u_int64_t base_address = info->GetBase();\n      u_int32_t region_size = info->GetSize();\n\n      if (!range_map_->StoreRange(base_address, region_size, index)) {\n        BPLOG(ERROR) << \"MinidumpMemoryInfoList could not store\"\n                        \" memory region \" <<\n                        index << \"/\" << header.number_of_entries << \", \" <<\n                        HexString(base_address) << \"+\" <<\n                        HexString(region_size);\n        return false;\n      }\n    }\n\n    infos_ = infos.release();\n  }\n\n  info_count_ = header.number_of_entries;\n\n  valid_ = true;\n  return true;\n}\n\n\nconst MinidumpMemoryInfo* MinidumpMemoryInfoList::GetMemoryInfoAtIndex(\n      unsigned int index) const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpMemoryInfoList for GetMemoryInfoAtIndex\";\n    return NULL;\n  }\n\n  if (index >= info_count_) {\n    BPLOG(ERROR) << \"MinidumpMemoryInfoList index out of range: \" <<\n                    index << \"/\" << info_count_;\n    return NULL;\n  }\n\n  return &(*infos_)[index];\n}\n\n\nconst MinidumpMemoryInfo* MinidumpMemoryInfoList::GetMemoryInfoForAddress(\n    u_int64_t address) const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid MinidumpMemoryInfoList for\"\n                    \" GetMemoryInfoForAddress\";\n    return NULL;\n  }\n\n  unsigned int info_index;\n  if (!range_map_->RetrieveRange(address, &info_index, NULL, NULL)) {\n    BPLOG(INFO) << \"MinidumpMemoryInfoList has no memory info at \" <<\n                   HexString(address);\n    return NULL;\n  }\n\n  return GetMemoryInfoAtIndex(info_index);\n}\n\n\nvoid MinidumpMemoryInfoList::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"MinidumpMemoryInfoList cannot print invalid data\";\n    return;\n  }\n\n  printf(\"MinidumpMemoryInfoList\\n\");\n  printf(\"  info_count = %d\\n\", info_count_);\n  printf(\"\\n\");\n\n  for (unsigned int info_index = 0;\n       info_index < info_count_;\n       ++info_index) {\n    printf(\"info[%d]\\n\", info_index);\n    (*infos_)[info_index].Print();\n    printf(\"\\n\");\n  }\n}\n\n\n//\n// Minidump\n//\n\n\nu_int32_t Minidump::max_streams_ = 128;\nunsigned int Minidump::max_string_length_ = 1024;\n\n\nMinidump::Minidump(const string& path)\n    : header_(),\n      directory_(NULL),\n      stream_map_(new MinidumpStreamMap()),\n      path_(path),\n      stream_(NULL),\n      swap_(false),\n      valid_(false) {\n}\n\nMinidump::Minidump(istream& stream)\n    : header_(),\n      directory_(NULL),\n      stream_map_(new MinidumpStreamMap()),\n      path_(),\n      stream_(&stream),\n      swap_(false),\n      valid_(false) {\n}\n\nMinidump::~Minidump() {\n  if (stream_) {\n    BPLOG(INFO) << \"Minidump closing minidump\";\n  }\n  if (!path_.empty()) {\n    delete stream_;\n  }\n  delete directory_;\n  delete stream_map_;\n}\n\n\nbool Minidump::Open() {\n  if (stream_ != NULL) {\n    BPLOG(INFO) << \"Minidump reopening minidump \" << path_;\n\n    // The file is already open.  Seek to the beginning, which is the position\n    // the file would be at if it were opened anew.\n    return SeekSet(0);\n  }\n\n  stream_ = new ifstream(path_.c_str(), std::ios::in | std::ios::binary);\n  if (!stream_ || !stream_->good()) {\n    string error_string;\n    int error_code = ErrnoString(&error_string);\n    BPLOG(ERROR) << \"Minidump could not open minidump \" << path_ <<\n                    \", error \" << error_code << \": \" << error_string;\n    return false;\n  }\n\n  BPLOG(INFO) << \"Minidump opened minidump \" << path_;\n  return true;\n}\n\n\nbool Minidump::Read() {\n  // Invalidate cached data.\n  delete directory_;\n  directory_ = NULL;\n  stream_map_->clear();\n\n  valid_ = false;\n\n  if (!Open()) {\n    BPLOG(ERROR) << \"Minidump cannot open minidump\";\n    return false;\n  }\n\n  if (!ReadBytes(&header_, sizeof(MDRawHeader))) {\n    BPLOG(ERROR) << \"Minidump cannot read header\";\n    return false;\n  }\n\n  if (header_.signature != MD_HEADER_SIGNATURE) {\n    // The file may be byte-swapped.  Under the present architecture, these\n    // classes don't know or need to know what CPU (or endianness) the\n    // minidump was produced on in order to parse it.  Use the signature as\n    // a byte order marker.\n    u_int32_t signature_swapped = header_.signature;\n    Swap(&signature_swapped);\n    if (signature_swapped != MD_HEADER_SIGNATURE) {\n      // This isn't a minidump or a byte-swapped minidump.\n      BPLOG(ERROR) << \"Minidump header signature mismatch: (\" <<\n                      HexString(header_.signature) << \", \" <<\n                      HexString(signature_swapped) << \") != \" <<\n                      HexString(MD_HEADER_SIGNATURE);\n      return false;\n    }\n    swap_ = true;\n  } else {\n    // The file is not byte-swapped.  Set swap_ false (it may have been true\n    // if the object is being reused?)\n    swap_ = false;\n  }\n\n  BPLOG(INFO) << \"Minidump \" << (swap_ ? \"\" : \"not \") <<\n                 \"byte-swapping minidump\";\n\n  if (swap_) {\n    Swap(&header_.signature);\n    Swap(&header_.version);\n    Swap(&header_.stream_count);\n    Swap(&header_.stream_directory_rva);\n    Swap(&header_.checksum);\n    Swap(&header_.time_date_stamp);\n    Swap(&header_.flags);\n  }\n\n  // Version check.  The high 16 bits of header_.version contain something\n  // else \"implementation specific.\"\n  if ((header_.version & 0x0000ffff) != MD_HEADER_VERSION) {\n    BPLOG(ERROR) << \"Minidump version mismatch: \" <<\n                    HexString(header_.version & 0x0000ffff) << \" != \" <<\n                    HexString(MD_HEADER_VERSION);\n    return false;\n  }\n\n  if (!SeekSet(header_.stream_directory_rva)) {\n    BPLOG(ERROR) << \"Minidump cannot seek to stream directory\";\n    return false;\n  }\n\n  if (header_.stream_count > max_streams_) {\n    BPLOG(ERROR) << \"Minidump stream count \" << header_.stream_count <<\n                    \" exceeds maximum \" << max_streams_;\n    return false;\n  }\n\n  if (header_.stream_count != 0) {\n    scoped_ptr<MinidumpDirectoryEntries> directory(\n        new MinidumpDirectoryEntries(header_.stream_count));\n\n    // Read the entire array in one fell swoop, instead of reading one entry\n    // at a time in the loop.\n    if (!ReadBytes(&(*directory)[0],\n                   sizeof(MDRawDirectory) * header_.stream_count)) {\n      BPLOG(ERROR) << \"Minidump cannot read stream directory\";\n      return false;\n    }\n\n    for (unsigned int stream_index = 0;\n         stream_index < header_.stream_count;\n         ++stream_index) {\n      MDRawDirectory* directory_entry = &(*directory)[stream_index];\n\n      if (swap_) {\n        Swap(&directory_entry->stream_type);\n        Swap(&directory_entry->location);\n      }\n\n      // Initialize the stream_map_ map, which speeds locating a stream by\n      // type.\n      unsigned int stream_type = directory_entry->stream_type;\n      switch (stream_type) {\n        case MD_THREAD_LIST_STREAM:\n        case MD_MODULE_LIST_STREAM:\n        case MD_MEMORY_LIST_STREAM:\n        case MD_EXCEPTION_STREAM:\n        case MD_SYSTEM_INFO_STREAM:\n        case MD_MISC_INFO_STREAM:\n        case MD_BREAKPAD_INFO_STREAM: {\n          if (stream_map_->find(stream_type) != stream_map_->end()) {\n            // Another stream with this type was already found.  A minidump\n            // file should contain at most one of each of these stream types.\n            BPLOG(ERROR) << \"Minidump found multiple streams of type \" <<\n                            stream_type << \", but can only deal with one\";\n            return false;\n          }\n          // Fall through to default\n        }\n\n        default: {\n          // Overwrites for stream types other than those above, but it's\n          // expected to be the user's burden in that case.\n          (*stream_map_)[stream_type].stream_index = stream_index;\n        }\n      }\n    }\n\n    directory_ = directory.release();\n  }\n\n  valid_ = true;\n  return true;\n}\n\n\nMinidumpThreadList* Minidump::GetThreadList() {\n  MinidumpThreadList* thread_list;\n  return GetStream(&thread_list);\n}\n\n\nMinidumpModuleList* Minidump::GetModuleList() {\n  MinidumpModuleList* module_list;\n  return GetStream(&module_list);\n}\n\n\nMinidumpMemoryList* Minidump::GetMemoryList() {\n  MinidumpMemoryList* memory_list;\n  return GetStream(&memory_list);\n}\n\n\nMinidumpException* Minidump::GetException() {\n  MinidumpException* exception;\n  return GetStream(&exception);\n}\n\nMinidumpAssertion* Minidump::GetAssertion() {\n  MinidumpAssertion* assertion;\n  return GetStream(&assertion);\n}\n\n\nMinidumpSystemInfo* Minidump::GetSystemInfo() {\n  MinidumpSystemInfo* system_info;\n  return GetStream(&system_info);\n}\n\n\nMinidumpMiscInfo* Minidump::GetMiscInfo() {\n  MinidumpMiscInfo* misc_info;\n  return GetStream(&misc_info);\n}\n\n\nMinidumpBreakpadInfo* Minidump::GetBreakpadInfo() {\n  MinidumpBreakpadInfo* breakpad_info;\n  return GetStream(&breakpad_info);\n}\n\nMinidumpMemoryInfoList* Minidump::GetMemoryInfoList() {\n  MinidumpMemoryInfoList* memory_info_list;\n  return GetStream(&memory_info_list);\n}\n\n\nvoid Minidump::Print() {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Minidump cannot print invalid data\";\n    return;\n  }\n\n  printf(\"MDRawHeader\\n\");\n  printf(\"  signature            = 0x%x\\n\",    header_.signature);\n  printf(\"  version              = 0x%x\\n\",    header_.version);\n  printf(\"  stream_count         = %d\\n\",      header_.stream_count);\n  printf(\"  stream_directory_rva = 0x%x\\n\",    header_.stream_directory_rva);\n  printf(\"  checksum             = 0x%x\\n\",    header_.checksum);\n  struct tm timestruct;\n#ifdef _WIN32\n  gmtime_s(&timestruct, reinterpret_cast<time_t*>(&header_.time_date_stamp));\n#else\n  gmtime_r(reinterpret_cast<time_t*>(&header_.time_date_stamp), &timestruct);\n#endif\n  char timestr[20];\n  strftime(timestr, 20, \"%Y-%m-%d %H:%M:%S\", &timestruct);\n  printf(\"  time_date_stamp      = 0x%x %s\\n\", header_.time_date_stamp,\n                                               timestr);\n  printf(\"  flags                = 0x%\" PRIx64 \"\\n\",  header_.flags);\n  printf(\"\\n\");\n\n  for (unsigned int stream_index = 0;\n       stream_index < header_.stream_count;\n       ++stream_index) {\n    MDRawDirectory* directory_entry = &(*directory_)[stream_index];\n\n    printf(\"mDirectory[%d]\\n\", stream_index);\n    printf(\"MDRawDirectory\\n\");\n    printf(\"  stream_type        = %d\\n\",   directory_entry->stream_type);\n    printf(\"  location.data_size = %d\\n\",\n           directory_entry->location.data_size);\n    printf(\"  location.rva       = 0x%x\\n\", directory_entry->location.rva);\n    printf(\"\\n\");\n  }\n\n  printf(\"Streams:\\n\");\n  for (MinidumpStreamMap::const_iterator iterator = stream_map_->begin();\n       iterator != stream_map_->end();\n       ++iterator) {\n    u_int32_t stream_type = iterator->first;\n    MinidumpStreamInfo info = iterator->second;\n    printf(\"  stream type 0x%x at index %d\\n\", stream_type, info.stream_index);\n  }\n  printf(\"\\n\");\n}\n\n\nconst MDRawDirectory* Minidump::GetDirectoryEntryAtIndex(unsigned int index)\n      const {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid Minidump for GetDirectoryEntryAtIndex\";\n    return NULL;\n  }\n\n  if (index >= header_.stream_count) {\n    BPLOG(ERROR) << \"Minidump stream directory index out of range: \" <<\n                    index << \"/\" << header_.stream_count;\n    return NULL;\n  }\n\n  return &(*directory_)[index];\n}\n\n\nbool Minidump::ReadBytes(void* bytes, size_t count) {\n  // Can't check valid_ because Read needs to call this method before\n  // validity can be determined.\n  if (!stream_) {\n    return false;\n  }\n  stream_->read(static_cast<char*>(bytes), count);\n  size_t bytes_read = stream_->gcount();\n  if (bytes_read != count) {\n    if (bytes_read == size_t(-1)) {\n      string error_string;\n      int error_code = ErrnoString(&error_string);\n      BPLOG(ERROR) << \"ReadBytes: error \" << error_code << \": \" << error_string;\n    } else {\n      BPLOG(ERROR) << \"ReadBytes: read \" << bytes_read << \"/\" << count;\n    }\n    return false;\n  }\n  return true;\n}\n\n\nbool Minidump::SeekSet(off_t offset) {\n  // Can't check valid_ because Read needs to call this method before\n  // validity can be determined.\n  if (!stream_) {\n    return false;\n  }\n  stream_->seekg(offset, std::ios_base::beg);\n  if (!stream_->good()) {\n    string error_string;\n    int error_code = ErrnoString(&error_string);\n    BPLOG(ERROR) << \"SeekSet: error \" << error_code << \": \" << error_string;\n    return false;\n  }\n  return true;\n}\n\noff_t Minidump::Tell() {\n  if (!valid_ || !stream_) {\n    return (off_t)-1;\n  }\n\n  return stream_->tellg();\n}\n\n\nstring* Minidump::ReadString(off_t offset) {\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid Minidump for ReadString\";\n    return NULL;\n  }\n  if (!SeekSet(offset)) {\n    BPLOG(ERROR) << \"ReadString could not seek to string at offset \" << offset;\n    return NULL;\n  }\n\n  u_int32_t bytes;\n  if (!ReadBytes(&bytes, sizeof(bytes))) {\n    BPLOG(ERROR) << \"ReadString could not read string size at offset \" <<\n                    offset;\n    return NULL;\n  }\n  if (swap_)\n    Swap(&bytes);\n\n  if (bytes % 2 != 0) {\n    BPLOG(ERROR) << \"ReadString found odd-sized \" << bytes <<\n                    \"-byte string at offset \" << offset;\n    return NULL;\n  }\n  unsigned int utf16_words = bytes / 2;\n\n  if (utf16_words > max_string_length_) {\n    BPLOG(ERROR) << \"ReadString string length \" << utf16_words <<\n                    \" exceeds maximum \" << max_string_length_ <<\n                    \" at offset \" << offset;\n    return NULL;\n  }\n\n  vector<u_int16_t> string_utf16(utf16_words);\n\n  if (utf16_words) {\n    if (!ReadBytes(&string_utf16[0], bytes)) {\n      BPLOG(ERROR) << \"ReadString could not read \" << bytes <<\n                      \"-byte string at offset \" << offset;\n      return NULL;\n    }\n  }\n\n  return UTF16ToUTF8(string_utf16, swap_);\n}\n\n\nbool Minidump::SeekToStreamType(u_int32_t  stream_type,\n                                u_int32_t* stream_length) {\n  BPLOG_IF(ERROR, !stream_length) << \"Minidump::SeekToStreamType requires \"\n                                     \"|stream_length|\";\n  assert(stream_length);\n  *stream_length = 0;\n\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid Mindump for SeekToStreamType\";\n    return false;\n  }\n\n  MinidumpStreamMap::const_iterator iterator = stream_map_->find(stream_type);\n  if (iterator == stream_map_->end()) {\n    // This stream type didn't exist in the directory.\n    BPLOG(INFO) << \"SeekToStreamType: type \" << stream_type << \" not present\";\n    return false;\n  }\n\n  MinidumpStreamInfo info = iterator->second;\n  if (info.stream_index >= header_.stream_count) {\n    BPLOG(ERROR) << \"SeekToStreamType: type \" << stream_type <<\n                    \" out of range: \" <<\n                    info.stream_index << \"/\" << header_.stream_count;\n    return false;\n  }\n\n  MDRawDirectory* directory_entry = &(*directory_)[info.stream_index];\n  if (!SeekSet(directory_entry->location.rva)) {\n    BPLOG(ERROR) << \"SeekToStreamType could not seek to stream type \" <<\n                    stream_type;\n    return false;\n  }\n\n  *stream_length = directory_entry->location.data_size;\n\n  return true;\n}\n\n\ntemplate<typename T>\nT* Minidump::GetStream(T** stream) {\n  // stream is a garbage parameter that's present only to account for C++'s\n  // inability to overload a method based solely on its return type.\n\n  const u_int32_t stream_type = T::kStreamType;\n\n  BPLOG_IF(ERROR, !stream) << \"Minidump::GetStream type \" << stream_type <<\n                              \" requires |stream|\";\n  assert(stream);\n  *stream = NULL;\n\n  if (!valid_) {\n    BPLOG(ERROR) << \"Invalid Minidump for GetStream type \" << stream_type;\n    return NULL;\n  }\n\n  MinidumpStreamMap::iterator iterator = stream_map_->find(stream_type);\n  if (iterator == stream_map_->end()) {\n    // This stream type didn't exist in the directory.\n    BPLOG(INFO) << \"GetStream: type \" << stream_type << \" not present\";\n    return NULL;\n  }\n\n  // Get a pointer so that the stored stream field can be altered.\n  MinidumpStreamInfo* info = &iterator->second;\n\n  if (info->stream) {\n    // This cast is safe because info.stream is only populated by this\n    // method, and there is a direct correlation between T and stream_type.\n    *stream = static_cast<T*>(info->stream);\n    return *stream;\n  }\n\n  u_int32_t stream_length;\n  if (!SeekToStreamType(stream_type, &stream_length)) {\n    BPLOG(ERROR) << \"GetStream could not seek to stream type \" << stream_type;\n    return NULL;\n  }\n\n  scoped_ptr<T> new_stream(new T(this));\n\n  if (!new_stream->Read(stream_length)) {\n    BPLOG(ERROR) << \"GetStream could not read stream type \" << stream_type;\n    return NULL;\n  }\n\n  *stream = new_stream.release();\n  info->stream = *stream;\n  return *stream;\n}\n\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/minidump_dump.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// minidump_dump.cc: Print the contents of a minidump file in somewhat\n// readable text.\n//\n// Author: Mark Mentovai\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"client/linux/minidump_writer/minidump_extension_linux.h\"\n#include \"google_breakpad/processor/minidump.h\"\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n\nnamespace {\n\nusing google_breakpad::Minidump;\nusing google_breakpad::MinidumpThreadList;\nusing google_breakpad::MinidumpModuleList;\nusing google_breakpad::MinidumpMemoryInfoList;\nusing google_breakpad::MinidumpMemoryList;\nusing google_breakpad::MinidumpException;\nusing google_breakpad::MinidumpAssertion;\nusing google_breakpad::MinidumpSystemInfo;\nusing google_breakpad::MinidumpMiscInfo;\nusing google_breakpad::MinidumpBreakpadInfo;\n\nstatic void DumpRawStream(Minidump *minidump,\n                          u_int32_t stream_type,\n                          const char *stream_name,\n                          int *errors) {\n  u_int32_t length = 0;\n  if (!minidump->SeekToStreamType(stream_type, &length)) {\n    return;\n  }\n\n  printf(\"Stream %s:\\n\", stream_name);\n\n  if (length == 0) {\n    printf(\"\\n\");\n    return;\n  }\n  std::vector<char> contents(length);\n  if (!minidump->ReadBytes(&contents[0], length)) {\n    ++*errors;\n    BPLOG(ERROR) << \"minidump.ReadBytes failed\";\n    return;\n  }\n  size_t current_offset = 0;\n  while (current_offset < length) {\n    size_t remaining = length - current_offset;\n    // Printf requires an int and direct casting from size_t results\n    // in compatibility warnings.\n    u_int32_t int_remaining = remaining;\n    printf(\"%.*s\", int_remaining, &contents[current_offset]);\n    char *next_null = reinterpret_cast<char *>(\n        memchr(&contents[current_offset], 0, remaining));\n    if (next_null == NULL)\n      break;\n    printf(\"\\\\0\\n\");\n    size_t null_offset = next_null - &contents[0];\n    current_offset = null_offset + 1;\n  }\n  printf(\"\\n\\n\");\n}\n\nstatic bool PrintMinidumpDump(const char *minidump_file) {\n  Minidump minidump(minidump_file);\n  if (!minidump.Read()) {\n    BPLOG(ERROR) << \"minidump.Read() failed\";\n    return false;\n  }\n  minidump.Print();\n\n  int errors = 0;\n\n  MinidumpThreadList *thread_list = minidump.GetThreadList();\n  if (!thread_list) {\n    ++errors;\n    BPLOG(ERROR) << \"minidump.GetThreadList() failed\";\n  } else {\n    thread_list->Print();\n  }\n\n  MinidumpModuleList *module_list = minidump.GetModuleList();\n  if (!module_list) {\n    ++errors;\n    BPLOG(ERROR) << \"minidump.GetModuleList() failed\";\n  } else {\n    module_list->Print();\n  }\n\n  MinidumpMemoryList *memory_list = minidump.GetMemoryList();\n  if (!memory_list) {\n    ++errors;\n    BPLOG(ERROR) << \"minidump.GetMemoryList() failed\";\n  } else {\n    memory_list->Print();\n  }\n\n  MinidumpException *exception = minidump.GetException();\n  if (!exception) {\n    BPLOG(INFO) << \"minidump.GetException() failed\";\n  } else {\n    exception->Print();\n  }\n\n  MinidumpAssertion *assertion = minidump.GetAssertion();\n  if (!assertion) {\n    BPLOG(INFO) << \"minidump.GetAssertion() failed\";\n  } else {\n    assertion->Print();\n  }\n\n  MinidumpSystemInfo *system_info = minidump.GetSystemInfo();\n  if (!system_info) {\n    ++errors;\n    BPLOG(ERROR) << \"minidump.GetSystemInfo() failed\";\n  } else {\n    system_info->Print();\n  }\n\n  MinidumpMiscInfo *misc_info = minidump.GetMiscInfo();\n  if (!misc_info) {\n    ++errors;\n    BPLOG(ERROR) << \"minidump.GetMiscInfo() failed\";\n  } else {\n    misc_info->Print();\n  }\n\n  MinidumpBreakpadInfo *breakpad_info = minidump.GetBreakpadInfo();\n  if (!breakpad_info) {\n    // Breakpad info is optional, so don't treat this as an error.\n    BPLOG(INFO) << \"minidump.GetBreakpadInfo() failed\";\n  } else {\n    breakpad_info->Print();\n  }\n\n  MinidumpMemoryInfoList *memory_info_list = minidump.GetMemoryInfoList();\n  if (!memory_info_list) {\n    ++errors;\n    BPLOG(ERROR) << \"minidump.GetMemoryInfoList() failed\";\n  } else {\n    memory_info_list->Print();\n  }\n\n  DumpRawStream(&minidump,\n                MD_LINUX_CMD_LINE,\n                \"MD_LINUX_CMD_LINE\",\n                &errors);\n  DumpRawStream(&minidump,\n                MD_LINUX_ENVIRON,\n                \"MD_LINUX_ENVIRON\",\n                &errors);\n  DumpRawStream(&minidump,\n                MD_LINUX_LSB_RELEASE,\n                \"MD_LINUX_LSB_RELEASE\",\n                &errors);\n  DumpRawStream(&minidump,\n                MD_LINUX_PROC_STATUS,\n                \"MD_LINUX_PROC_STATUS\",\n                &errors);\n  DumpRawStream(&minidump,\n                MD_LINUX_CPU_INFO,\n                \"MD_LINUX_CPU_INFO\",\n                &errors);\n  DumpRawStream(&minidump,\n                MD_LINUX_MAPS,\n                \"MD_LINUX_MAPS\",\n                &errors);\n\n  return errors == 0;\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  BPLOG_INIT(&argc, &argv);\n\n  if (argc != 2) {\n    fprintf(stderr, \"usage: %s <file>\\n\", argv[0]);\n    return 1;\n  }\n\n  return PrintMinidumpDump(argv[1]) ? 0 : 1;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/minidump_dump_test",
    "content": "#!/bin/sh\n\n# Copyright (c) 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\ntestdata_dir=$srcdir/src/processor/testdata\n./src/processor/minidump_dump $testdata_dir/minidump2.dmp | \\\n tr -d '\\015' | \\\n diff -u $testdata_dir/minidump2.dump.out -\nexit $?\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/minidump_processor.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"google_breakpad/processor/minidump_processor.h\"\n\n#include <assert.h>\n#include <stdio.h>\n\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/minidump.h\"\n#include \"google_breakpad/processor/process_state.h\"\n#include \"google_breakpad/processor/exploitability.h\"\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n#include \"processor/stackwalker_x86.h\"\n\nnamespace google_breakpad {\n\nMinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier,\n                                     SourceLineResolverInterface *resolver)\n    : supplier_(supplier), resolver_(resolver),\n      enable_exploitability_(false) {\n}\n\nMinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier,\n                                     SourceLineResolverInterface *resolver,\n                                     bool enable_exploitability)\n    : supplier_(supplier), resolver_(resolver),\n      enable_exploitability_(enable_exploitability) {\n}\n\nMinidumpProcessor::~MinidumpProcessor() {\n}\n\nProcessResult MinidumpProcessor::Process(\n    Minidump *dump, ProcessState *process_state) {\n  assert(dump);\n  assert(process_state);\n\n  process_state->Clear();\n\n  const MDRawHeader *header = dump->header();\n  if (!header) {\n    BPLOG(ERROR) << \"Minidump \" << dump->path() << \" has no header\";\n    return PROCESS_ERROR_NO_MINIDUMP_HEADER;\n  }\n  process_state->time_date_stamp_ = header->time_date_stamp;\n\n  bool has_cpu_info = GetCPUInfo(dump, &process_state->system_info_);\n  bool has_os_info = GetOSInfo(dump, &process_state->system_info_);\n\n  u_int32_t dump_thread_id = 0;\n  bool has_dump_thread = false;\n  u_int32_t requesting_thread_id = 0;\n  bool has_requesting_thread = false;\n\n  MinidumpBreakpadInfo *breakpad_info = dump->GetBreakpadInfo();\n  if (breakpad_info) {\n    has_dump_thread = breakpad_info->GetDumpThreadID(&dump_thread_id);\n    has_requesting_thread =\n        breakpad_info->GetRequestingThreadID(&requesting_thread_id);\n  }\n\n  MinidumpException *exception = dump->GetException();\n  if (exception) {\n    process_state->crashed_ = true;\n    has_requesting_thread = exception->GetThreadID(&requesting_thread_id);\n\n    process_state->crash_reason_ = GetCrashReason(\n        dump, &process_state->crash_address_);\n  }\n\n  // This will just return an empty string if it doesn't exist.\n  process_state->assertion_ = GetAssertion(dump);\n\n  MinidumpModuleList *module_list = dump->GetModuleList();\n\n  // Put a copy of the module list into ProcessState object.  This is not\n  // necessarily a MinidumpModuleList, but it adheres to the CodeModules\n  // interface, which is all that ProcessState needs to expose.\n  if (module_list)\n    process_state->modules_ = module_list->Copy();\n\n  MinidumpThreadList *threads = dump->GetThreadList();\n  if (!threads) {\n    BPLOG(ERROR) << \"Minidump \" << dump->path() << \" has no thread list\";\n    return PROCESS_ERROR_NO_THREAD_LIST;\n  }\n\n  BPLOG(INFO) << \"Minidump \" << dump->path() << \" has \" <<\n      (has_cpu_info           ? \"\" : \"no \") << \"CPU info, \" <<\n      (has_os_info            ? \"\" : \"no \") << \"OS info, \" <<\n      (breakpad_info != NULL  ? \"\" : \"no \") << \"Breakpad info, \" <<\n      (exception != NULL      ? \"\" : \"no \") << \"exception, \" <<\n      (module_list != NULL    ? \"\" : \"no \") << \"module list, \" <<\n      (threads != NULL        ? \"\" : \"no \") << \"thread list, \" <<\n      (has_dump_thread        ? \"\" : \"no \") << \"dump thread, and \" <<\n      (has_requesting_thread  ? \"\" : \"no \") << \"requesting thread\";\n\n  bool interrupted = false;\n  bool found_requesting_thread = false;\n  unsigned int thread_count = threads->thread_count();\n  for (unsigned int thread_index = 0;\n       thread_index < thread_count;\n       ++thread_index) {\n    char thread_string_buffer[64];\n    snprintf(thread_string_buffer, sizeof(thread_string_buffer), \"%d/%d\",\n             thread_index, thread_count);\n    string thread_string = dump->path() + \":\" + thread_string_buffer;\n\n    MinidumpThread *thread = threads->GetThreadAtIndex(thread_index);\n    if (!thread) {\n      BPLOG(ERROR) << \"Could not get thread for \" << thread_string;\n      return PROCESS_ERROR_GETTING_THREAD;\n    }\n\n    u_int32_t thread_id;\n    if (!thread->GetThreadID(&thread_id)) {\n      BPLOG(ERROR) << \"Could not get thread ID for \" << thread_string;\n      return PROCESS_ERROR_GETTING_THREAD_ID;\n    }\n\n    thread_string += \" id \" + HexString(thread_id);\n    BPLOG(INFO) << \"Looking at thread \" << thread_string;\n\n    // If this thread is the thread that produced the minidump, don't process\n    // it.  Because of the problems associated with a thread producing a\n    // dump of itself (when both its context and its stack are in flux),\n    // processing that stack wouldn't provide much useful data.\n    if (has_dump_thread && thread_id == dump_thread_id) {\n      continue;\n    }\n\n    MinidumpContext *context = thread->GetContext();\n\n    if (has_requesting_thread && thread_id == requesting_thread_id) {\n      if (found_requesting_thread) {\n        // There can't be more than one requesting thread.\n        BPLOG(ERROR) << \"Duplicate requesting thread: \" << thread_string;\n        return PROCESS_ERROR_DUPLICATE_REQUESTING_THREADS;\n      }\n\n      // Use processed_state->threads_.size() instead of thread_index.\n      // thread_index points to the thread index in the minidump, which\n      // might be greater than the thread index in the threads vector if\n      // any of the minidump's threads are skipped and not placed into the\n      // processed threads vector.  The thread vector's current size will\n      // be the index of the current thread when it's pushed into the\n      // vector.\n      process_state->requesting_thread_ = process_state->threads_.size();\n\n      found_requesting_thread = true;\n\n      if (process_state->crashed_) {\n        // Use the exception record's context for the crashed thread, instead\n        // of the thread's own context.  For the crashed thread, the thread's\n        // own context is the state inside the exception handler.  Using it\n        // would not result in the expected stack trace from the time of the\n        // crash. If the exception context is invalid, however, we fall back\n        // on the thread context.\n        MinidumpContext *ctx = exception->GetContext();\n        context = ctx ? ctx : thread->GetContext();\n      }\n    }\n\n    MinidumpMemoryRegion *thread_memory = thread->GetMemory();\n    if (!thread_memory) {\n      BPLOG(ERROR) << \"No memory region for \" << thread_string;\n      return PROCESS_ERROR_NO_MEMORY_FOR_THREAD;\n    }\n\n    // Use process_state->modules_ instead of module_list, because the\n    // |modules| argument will be used to populate the |module| fields in\n    // the returned StackFrame objects, which will be placed into the\n    // returned ProcessState object.  module_list's lifetime is only as\n    // long as the Minidump object: it will be deleted when this function\n    // returns.  process_state->modules_ is owned by the ProcessState object\n    // (just like the StackFrame objects), and is much more suitable for this\n    // task.\n    scoped_ptr<Stackwalker> stackwalker(\n        Stackwalker::StackwalkerForCPU(process_state->system_info(),\n                                       context,\n                                       thread_memory,\n                                       process_state->modules_,\n                                       supplier_,\n                                       resolver_));\n    if (!stackwalker.get()) {\n      BPLOG(ERROR) << \"No stackwalker for \" << thread_string;\n      return PROCESS_ERROR_NO_STACKWALKER_FOR_THREAD;\n    }\n\n    scoped_ptr<CallStack> stack(new CallStack());\n    if (!stackwalker->Walk(stack.get())) {\n      BPLOG(INFO) << \"Stackwalker interrupt (missing symbols?) at \" <<\n          thread_string;\n      interrupted = true;\n    }\n    process_state->threads_.push_back(stack.release());\n    process_state->thread_memory_regions_.push_back(thread_memory);\n  }\n\n  if (interrupted) {\n    BPLOG(INFO) << \"Processing interrupted for \" << dump->path();\n    return PROCESS_SYMBOL_SUPPLIER_INTERRUPTED;\n  }\n\n  // If a requesting thread was indicated, it must be present.\n  if (has_requesting_thread && !found_requesting_thread) {\n    // Don't mark as an error, but invalidate the requesting thread\n    BPLOG(ERROR) << \"Minidump indicated requesting thread \" <<\n        HexString(requesting_thread_id) << \", not found in \" <<\n        dump->path();\n    process_state->requesting_thread_ = -1;\n  }\n\n  // Exploitability defaults to EXPLOITABILITY_NOT_ANALYZED\n  process_state->exploitability_ = EXPLOITABILITY_NOT_ANALYZED;\n\n  // If an exploitability run was requested we perform the platform specific\n  // rating.\n  if (enable_exploitability_) {\n    scoped_ptr<Exploitability> exploitability(\n        Exploitability::ExploitabilityForPlatform(dump, process_state));\n    // The engine will be null if the platform is not supported\n    if (exploitability != NULL) {\n      process_state->exploitability_ = exploitability->CheckExploitability();\n    } else {\n      process_state->exploitability_ = EXPLOITABILITY_ERR_NOENGINE;\n    }\n  }\n\n  BPLOG(INFO) << \"Processed \" << dump->path();\n  return PROCESS_OK;\n}\n\nProcessResult MinidumpProcessor::Process(\n    const string &minidump_file, ProcessState *process_state) {\n  BPLOG(INFO) << \"Processing minidump in file \" << minidump_file;\n\n  Minidump dump(minidump_file);\n  if (!dump.Read()) {\n     BPLOG(ERROR) << \"Minidump \" << dump.path() << \" could not be read\";\n     return PROCESS_ERROR_MINIDUMP_NOT_FOUND;\n  }\n\n  return Process(&dump, process_state);\n}\n\n// Returns the MDRawSystemInfo from a minidump, or NULL if system info is\n// not available from the minidump.  If system_info is non-NULL, it is used\n// to pass back the MinidumpSystemInfo object.\nstatic const MDRawSystemInfo* GetSystemInfo(Minidump *dump,\n                                            MinidumpSystemInfo **system_info) {\n  MinidumpSystemInfo *minidump_system_info = dump->GetSystemInfo();\n  if (!minidump_system_info)\n    return NULL;\n\n  if (system_info)\n    *system_info = minidump_system_info;\n\n  return minidump_system_info->system_info();\n}\n\n// static\nbool MinidumpProcessor::GetCPUInfo(Minidump *dump, SystemInfo *info) {\n  assert(dump);\n  assert(info);\n\n  info->cpu.clear();\n  info->cpu_info.clear();\n\n  MinidumpSystemInfo *system_info;\n  const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, &system_info);\n  if (!raw_system_info)\n    return false;\n\n  switch (raw_system_info->processor_architecture) {\n    case MD_CPU_ARCHITECTURE_X86:\n    case MD_CPU_ARCHITECTURE_AMD64: {\n      if (raw_system_info->processor_architecture ==\n          MD_CPU_ARCHITECTURE_X86)\n        info->cpu = \"x86\";\n      else\n        info->cpu = \"amd64\";\n\n      const string *cpu_vendor = system_info->GetCPUVendor();\n      if (cpu_vendor) {\n        info->cpu_info = *cpu_vendor;\n        info->cpu_info.append(\" \");\n      }\n\n      char x86_info[36];\n      snprintf(x86_info, sizeof(x86_info), \"family %u model %u stepping %u\",\n               raw_system_info->processor_level,\n               raw_system_info->processor_revision >> 8,\n               raw_system_info->processor_revision & 0xff);\n      info->cpu_info.append(x86_info);\n      break;\n    }\n\n    case MD_CPU_ARCHITECTURE_PPC: {\n      info->cpu = \"ppc\";\n      break;\n    }\n\n    case MD_CPU_ARCHITECTURE_SPARC: {\n      info->cpu = \"sparc\";\n      break;\n    }\n\n    case MD_CPU_ARCHITECTURE_ARM: {\n      info->cpu = \"arm\";\n      break;\n    }\n\n    default: {\n      // Assign the numeric architecture ID into the CPU string.\n      char cpu_string[7];\n      snprintf(cpu_string, sizeof(cpu_string), \"0x%04x\",\n               raw_system_info->processor_architecture);\n      info->cpu = cpu_string;\n      break;\n    }\n  }\n\n  info->cpu_count = raw_system_info->number_of_processors;\n\n  return true;\n}\n\n// static\nbool MinidumpProcessor::GetOSInfo(Minidump *dump, SystemInfo *info) {\n  assert(dump);\n  assert(info);\n\n  info->os.clear();\n  info->os_short.clear();\n  info->os_version.clear();\n\n  MinidumpSystemInfo *system_info;\n  const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, &system_info);\n  if (!raw_system_info)\n    return false;\n\n  info->os_short = system_info->GetOS();\n\n  switch (raw_system_info->platform_id) {\n    case MD_OS_WIN32_NT: {\n      info->os = \"Windows NT\";\n      break;\n    }\n\n    case MD_OS_WIN32_WINDOWS: {\n      info->os = \"Windows\";\n      break;\n    }\n\n    case MD_OS_MAC_OS_X: {\n      info->os = \"Mac OS X\";\n      break;\n    }\n\n    case MD_OS_IOS: {\n      info->os = \"iOS\";\n      break;\n    }\n\n    case MD_OS_LINUX: {\n      info->os = \"Linux\";\n      break;\n    }\n\n    case MD_OS_SOLARIS: {\n      info->os = \"Solaris\";\n      break;\n    }\n\n    default: {\n      // Assign the numeric platform ID into the OS string.\n      char os_string[11];\n      snprintf(os_string, sizeof(os_string), \"0x%08x\",\n               raw_system_info->platform_id);\n      info->os = os_string;\n      break;\n    }\n  }\n\n  char os_version_string[33];\n  snprintf(os_version_string, sizeof(os_version_string), \"%u.%u.%u\",\n           raw_system_info->major_version,\n           raw_system_info->minor_version,\n           raw_system_info->build_number);\n  info->os_version = os_version_string;\n\n  const string *csd_version = system_info->GetCSDVersion();\n  if (csd_version) {\n    info->os_version.append(\" \");\n    info->os_version.append(*csd_version);\n  }\n\n  return true;\n}\n\n// static\nstring MinidumpProcessor::GetCrashReason(Minidump *dump, u_int64_t *address) {\n  MinidumpException *exception = dump->GetException();\n  if (!exception)\n    return \"\";\n\n  const MDRawExceptionStream *raw_exception = exception->exception();\n  if (!raw_exception)\n    return \"\";\n\n  if (address)\n    *address = raw_exception->exception_record.exception_address;\n\n  // The reason value is OS-specific and possibly CPU-specific.  Set up\n  // sensible numeric defaults for the reason string in case we can't\n  // map the codes to a string (because there's no system info, or because\n  // it's an unrecognized platform, or because it's an unrecognized code.)\n  char reason_string[24];\n  u_int32_t exception_code = raw_exception->exception_record.exception_code;\n  u_int32_t exception_flags = raw_exception->exception_record.exception_flags;\n  snprintf(reason_string, sizeof(reason_string), \"0x%08x / 0x%08x\",\n           exception_code, exception_flags);\n  string reason = reason_string;\n\n  const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, NULL);\n  if (!raw_system_info)\n    return reason;\n\n  switch (raw_system_info->platform_id) {\n    case MD_OS_MAC_OS_X:\n    case MD_OS_IOS: {\n      char flags_string[11];\n      snprintf(flags_string, sizeof(flags_string), \"0x%08x\", exception_flags);\n      switch (exception_code) {\n        case MD_EXCEPTION_MAC_BAD_ACCESS:\n          reason = \"EXC_BAD_ACCESS / \";\n          switch (exception_flags) {\n            case MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS:\n              reason.append(\"KERN_INVALID_ADDRESS\");\n              break;\n            case MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE:\n              reason.append(\"KERN_PROTECTION_FAILURE\");\n              break;\n            case MD_EXCEPTION_CODE_MAC_NO_ACCESS:\n              reason.append(\"KERN_NO_ACCESS\");\n              break;\n            case MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE:\n              reason.append(\"KERN_MEMORY_FAILURE\");\n              break;\n            case MD_EXCEPTION_CODE_MAC_MEMORY_ERROR:\n              reason.append(\"KERN_MEMORY_ERROR\");\n              break;\n            // These are ppc only but shouldn't be a problem as they're\n            // unused on x86\n            case MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ:\n              reason.append(\"EXC_PPC_VM_PROT_READ\");\n              break;\n            case MD_EXCEPTION_CODE_MAC_PPC_BADSPACE:\n              reason.append(\"EXC_PPC_BADSPACE\");\n              break;\n            case MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED:\n              reason.append(\"EXC_PPC_UNALIGNED\");\n              break;\n            default:\n              reason.append(flags_string);\n              BPLOG(INFO) << \"Unknown exception reason \" << reason;\n              break;\n          }\n          break;\n        case MD_EXCEPTION_MAC_BAD_INSTRUCTION:\n          reason = \"EXC_BAD_INSTRUCTION / \";\n          switch (raw_system_info->processor_architecture) {\n            case MD_CPU_ARCHITECTURE_PPC: {\n              switch (exception_flags) {\n                case MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL:\n                  reason.append(\"EXC_PPC_INVALID_SYSCALL\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION:\n                  reason.append(\"EXC_PPC_UNIPL_INST\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION:\n                  reason.append(\"EXC_PPC_PRIVINST\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER:\n                  reason.append(\"EXC_PPC_PRIVREG\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_PPC_TRACE:\n                  reason.append(\"EXC_PPC_TRACE\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR:\n                  reason.append(\"EXC_PPC_PERFMON\");\n                  break;\n                default:\n                  reason.append(flags_string);\n                  BPLOG(INFO) << \"Unknown exception reason \" << reason;\n                  break;\n              }\n              break;\n            }\n            case MD_CPU_ARCHITECTURE_X86: {\n              switch (exception_flags) {\n                case MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION:\n                  reason.append(\"EXC_I386_INVOP\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT:\n                  reason.append(\"EXC_INVTSSFLT\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT:\n                  reason.append(\"EXC_SEGNPFLT\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT:\n                  reason.append(\"EXC_STKFLT\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT:\n                  reason.append(\"EXC_GPFLT\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT:\n                  reason.append(\"EXC_ALIGNFLT\");\n                  break;\n                default:\n                  reason.append(flags_string);\n                  BPLOG(INFO) << \"Unknown exception reason \" << reason;\n                  break;\n              }\n              break;\n            }\n            default:\n              reason.append(flags_string);\n              BPLOG(INFO) << \"Unknown exception reason \" << reason;\n              break;\n          }\n          break;\n        case MD_EXCEPTION_MAC_ARITHMETIC:\n          reason = \"EXC_ARITHMETIC / \";\n          switch (raw_system_info->processor_architecture) {\n            case MD_CPU_ARCHITECTURE_PPC: {\n              switch (exception_flags) {\n                case MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW:\n                  reason.append(\"EXC_PPC_OVERFLOW\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE:\n                  reason.append(\"EXC_PPC_ZERO_DIVIDE\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT:\n                  reason.append(\"EXC_FLT_INEXACT\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE:\n                  reason.append(\"EXC_PPC_FLT_ZERO_DIVIDE\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW:\n                  reason.append(\"EXC_PPC_FLT_UNDERFLOW\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW:\n                  reason.append(\"EXC_PPC_FLT_OVERFLOW\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER:\n                  reason.append(\"EXC_PPC_FLT_NOT_A_NUMBER\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION:\n                  reason.append(\"EXC_PPC_NOEMULATION\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST:\n                  reason.append(\"EXC_PPC_ALTIVECASSIST\");\n                default:\n                  reason.append(flags_string);\n                  BPLOG(INFO) << \"Unknown exception reason \" << reason;\n                  break;\n              }\n              break;\n            }\n            case MD_CPU_ARCHITECTURE_X86: {\n              switch (exception_flags) {\n                case MD_EXCEPTION_CODE_MAC_X86_DIV:\n                  reason.append(\"EXC_I386_DIV\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_X86_INTO:\n                  reason.append(\"EXC_I386_INTO\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_X86_NOEXT:\n                  reason.append(\"EXC_I386_NOEXT\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_X86_EXTOVR:\n                  reason.append(\"EXC_I386_EXTOVR\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_X86_EXTERR:\n                  reason.append(\"EXC_I386_EXTERR\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_X86_EMERR:\n                  reason.append(\"EXC_I386_EMERR\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_X86_BOUND:\n                  reason.append(\"EXC_I386_BOUND\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR:\n                  reason.append(\"EXC_I386_SSEEXTERR\");\n                  break;\n                default:\n                  reason.append(flags_string);\n                  BPLOG(INFO) << \"Unknown exception reason \" << reason;\n                  break;\n              }\n              break;\n            }\n            default:\n              reason.append(flags_string);\n              BPLOG(INFO) << \"Unknown exception reason \" << reason;\n              break;\n          }\n          break;\n        case MD_EXCEPTION_MAC_EMULATION:\n          reason = \"EXC_EMULATION / \";\n          reason.append(flags_string);\n          break;\n        case MD_EXCEPTION_MAC_SOFTWARE:\n          reason = \"EXC_SOFTWARE / \";\n          switch (exception_flags) {\n            case MD_EXCEPTION_CODE_MAC_ABORT:\n              reason.append(\"SIGABRT\");\n              break;\n            case MD_EXCEPTION_CODE_MAC_NS_EXCEPTION:\n              reason.append(\"UNCAUGHT_NS_EXCEPTION\");\n              break;\n            // These are ppc only but shouldn't be a problem as they're\n            // unused on x86\n            case MD_EXCEPTION_CODE_MAC_PPC_TRAP:\n              reason.append(\"EXC_PPC_TRAP\");\n              break;\n            case MD_EXCEPTION_CODE_MAC_PPC_MIGRATE:\n              reason.append(\"EXC_PPC_MIGRATE\");\n              break;\n            default:\n              reason.append(flags_string);\n              BPLOG(INFO) << \"Unknown exception reason \" << reason;\n              break;\n          }\n          break;\n        case MD_EXCEPTION_MAC_BREAKPOINT:\n          reason = \"EXC_BREAKPOINT / \";\n          switch (raw_system_info->processor_architecture) {\n            case MD_CPU_ARCHITECTURE_PPC: {\n              switch (exception_flags) {\n                case MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT:\n                  reason.append(\"EXC_PPC_BREAKPOINT\");\n                  break;\n                default:\n                  reason.append(flags_string);\n                  BPLOG(INFO) << \"Unknown exception reason \" << reason;\n                  break;\n              }\n              break;\n            }\n            case MD_CPU_ARCHITECTURE_X86: {\n              switch (exception_flags) {\n                case MD_EXCEPTION_CODE_MAC_X86_SGL:\n                  reason.append(\"EXC_I386_SGL\");\n                  break;\n                case MD_EXCEPTION_CODE_MAC_X86_BPT:\n                  reason.append(\"EXC_I386_BPT\");\n                  break;\n                default:\n                  reason.append(flags_string);\n                  BPLOG(INFO) << \"Unknown exception reason \" << reason;\n                  break;\n              }\n              break;\n            }\n            default:\n              reason.append(flags_string);\n              BPLOG(INFO) << \"Unknown exception reason \" << reason;\n              break;\n          }\n          break;\n        case MD_EXCEPTION_MAC_SYSCALL:\n          reason = \"EXC_SYSCALL / \";\n          reason.append(flags_string);\n          break;\n        case MD_EXCEPTION_MAC_MACH_SYSCALL:\n          reason = \"EXC_MACH_SYSCALL / \";\n          reason.append(flags_string);\n          break;\n        case MD_EXCEPTION_MAC_RPC_ALERT:\n          reason = \"EXC_RPC_ALERT / \";\n          reason.append(flags_string);\n          break;\n      }\n      break;\n    }\n\n    case MD_OS_WIN32_NT:\n    case MD_OS_WIN32_WINDOWS: {\n      switch (exception_code) {\n        case MD_EXCEPTION_CODE_WIN_CONTROL_C:\n          reason = \"DBG_CONTROL_C\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION:\n          reason = \"EXCEPTION_GUARD_PAGE\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_DATATYPE_MISALIGNMENT:\n          reason = \"EXCEPTION_DATATYPE_MISALIGNMENT\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_BREAKPOINT:\n          reason = \"EXCEPTION_BREAKPOINT\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_SINGLE_STEP:\n          reason = \"EXCEPTION_SINGLE_STEP\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION:\n          // For EXCEPTION_ACCESS_VIOLATION, Windows puts the address that\n          // caused the fault in exception_information[1].\n          // exception_information[0] is 0 if the violation was caused by\n          // an attempt to read data and 1 if it was an attempt to write\n          // data.\n          // This information is useful in addition to the code address, which\n          // will be present in the crash thread's instruction field anyway.\n          if (raw_exception->exception_record.number_parameters >= 1) {\n            MDAccessViolationTypeWin av_type =\n                static_cast<MDAccessViolationTypeWin>\n                (raw_exception->exception_record.exception_information[0]);\n            switch (av_type) {\n              case MD_ACCESS_VIOLATION_WIN_READ:\n                reason = \"EXCEPTION_ACCESS_VIOLATION_READ\";\n                break;\n              case MD_ACCESS_VIOLATION_WIN_WRITE:\n                reason = \"EXCEPTION_ACCESS_VIOLATION_WRITE\";\n                break;\n              case MD_ACCESS_VIOLATION_WIN_EXEC:\n                reason = \"EXCEPTION_ACCESS_VIOLATION_EXEC\";\n                break;\n              default:\n                reason = \"EXCEPTION_ACCESS_VIOLATION\";\n                break;\n            }\n          } else {\n            reason = \"EXCEPTION_ACCESS_VIOLATION\";\n          }\n          if (address &&\n              raw_exception->exception_record.number_parameters >= 2) {\n            *address =\n                raw_exception->exception_record.exception_information[1];\n          }\n          break;\n        case MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR:\n          reason = \"EXCEPTION_IN_PAGE_ERROR\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_INVALID_HANDLE:\n          reason = \"EXCEPTION_INVALID_HANDLE\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION:\n          reason = \"EXCEPTION_ILLEGAL_INSTRUCTION\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION:\n          reason = \"EXCEPTION_NONCONTINUABLE_EXCEPTION\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION:\n          reason = \"EXCEPTION_INVALID_DISPOSITION\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_ARRAY_BOUNDS_EXCEEDED:\n          reason = \"EXCEPTION_BOUNDS_EXCEEDED\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_FLOAT_DENORMAL_OPERAND:\n          reason = \"EXCEPTION_FLT_DENORMAL_OPERAND\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO:\n          reason = \"EXCEPTION_FLT_DIVIDE_BY_ZERO\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT:\n          reason = \"EXCEPTION_FLT_INEXACT_RESULT\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION:\n          reason = \"EXCEPTION_FLT_INVALID_OPERATION\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW:\n          reason = \"EXCEPTION_FLT_OVERFLOW\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_FLOAT_STACK_CHECK:\n          reason = \"EXCEPTION_FLT_STACK_CHECK\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW:\n          reason = \"EXCEPTION_FLT_UNDERFLOW\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO:\n          reason = \"EXCEPTION_INT_DIVIDE_BY_ZERO\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW:\n          reason = \"EXCEPTION_INT_OVERFLOW\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION:\n          reason = \"EXCEPTION_PRIV_INSTRUCTION\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW:\n          reason = \"EXCEPTION_STACK_OVERFLOW\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK:\n          reason = \"EXCEPTION_POSSIBLE_DEADLOCK\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_STACK_BUFFER_OVERRUN:\n          reason = \"EXCEPTION_STACK_BUFFER_OVERRUN\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_HEAP_CORRUPTION:\n          reason = \"EXCEPTION_HEAP_CORRUPTION\";\n          break;\n        case MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION:\n          reason = \"Unhandled C++ Exception\";\n          break;\n        default:\n          BPLOG(INFO) << \"Unknown exception reason \" << reason;\n          break;\n      }\n      break;\n    }\n\n    case MD_OS_LINUX: {\n      switch (exception_code) {\n        case MD_EXCEPTION_CODE_LIN_SIGHUP:\n          reason = \"SIGHUP\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGINT:\n          reason = \"SIGINT\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGQUIT:\n          reason = \"SIGQUIT\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGILL:\n          reason = \"SIGILL\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGTRAP:\n          reason = \"SIGTRAP\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGABRT:\n          reason = \"SIGABRT\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGBUS:\n          reason = \"SIGBUS\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGFPE:\n          reason = \"SIGFPE\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGKILL:\n          reason = \"SIGKILL\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGUSR1:\n          reason = \"SIGUSR1\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGSEGV:\n          reason = \"SIGSEGV\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGUSR2:\n          reason = \"SIGUSR2\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGPIPE:\n          reason = \"SIGPIPE\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGALRM:\n          reason = \"SIGALRM\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGTERM:\n          reason = \"SIGTERM\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGSTKFLT:\n          reason = \"SIGSTKFLT\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGCHLD:\n          reason = \"SIGCHLD\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGCONT:\n          reason = \"SIGCONT\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGSTOP:\n          reason = \"SIGSTOP\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGTSTP:\n          reason = \"SIGTSTP\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGTTIN:\n          reason = \"SIGTTIN\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGTTOU:\n          reason = \"SIGTTOU\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGURG:\n          reason = \"SIGURG\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGXCPU:\n          reason = \"SIGXCPU\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGXFSZ:\n          reason = \"SIGXFSZ\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGVTALRM:\n          reason = \"SIGVTALRM\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGPROF:\n          reason = \"SIGPROF\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGWINCH:\n          reason = \"SIGWINCH\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGIO:\n          reason = \"SIGIO\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGPWR:\n          reason = \"SIGPWR\";\n          break;\n        case MD_EXCEPTION_CODE_LIN_SIGSYS:\n          reason = \"SIGSYS\";\n          break;\n        default:\n          BPLOG(INFO) << \"Unknown exception reason \" << reason;\n          break;\n      }\n      break;\n    }\n\n    case MD_OS_SOLARIS: {\n      switch (exception_code) {\n        case MD_EXCEPTION_CODE_SOL_SIGHUP:\n          reason = \"SIGHUP\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGINT:\n          reason = \"SIGINT\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGQUIT:\n          reason = \"SIGQUIT\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGILL:\n          reason = \"SIGILL\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGTRAP:\n          reason = \"SIGTRAP\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGIOT:\n          reason = \"SIGIOT | SIGABRT\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGEMT:\n          reason = \"SIGEMT\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGFPE:\n          reason = \"SIGFPE\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGKILL:\n          reason = \"SIGKILL\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGBUS:\n          reason = \"SIGBUS\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGSEGV:\n          reason = \"SIGSEGV\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGSYS:\n          reason = \"SIGSYS\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGPIPE:\n          reason = \"SIGPIPE\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGALRM:\n          reason = \"SIGALRM\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGTERM:\n          reason = \"SIGTERM\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGUSR1:\n          reason = \"SIGUSR1\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGUSR2:\n          reason = \"SIGUSR2\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGCLD:\n          reason = \"SIGCLD | SIGCHLD\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGPWR:\n          reason = \"SIGPWR\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGWINCH:\n          reason = \"SIGWINCH\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGURG:\n          reason = \"SIGURG\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGPOLL:\n          reason = \"SIGPOLL | SIGIO\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGSTOP:\n          reason = \"SIGSTOP\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGTSTP:\n          reason = \"SIGTSTP\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGCONT:\n          reason = \"SIGCONT\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGTTIN:\n          reason = \"SIGTTIN\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGTTOU:\n          reason = \"SIGTTOU\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGVTALRM:\n          reason = \"SIGVTALRM\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGPROF:\n          reason = \"SIGPROF\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGXCPU:\n          reason = \"SIGXCPU\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGXFSZ:\n          reason = \"SIGXFSZ\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGWAITING:\n          reason = \"SIGWAITING\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGLWP:\n          reason = \"SIGLWP\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGFREEZE:\n          reason = \"SIGFREEZE\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGTHAW:\n          reason = \"SIGTHAW\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGCANCEL:\n          reason = \"SIGCANCEL\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGLOST:\n          reason = \"SIGLOST\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGXRES:\n          reason = \"SIGXRES\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGJVM1:\n          reason = \"SIGJVM1\";\n          break;\n        case MD_EXCEPTION_CODE_SOL_SIGJVM2:\n          reason = \"SIGJVM2\";\n          break;\n        default:\n          BPLOG(INFO) << \"Unknown exception reason \" << reason;\n          break;\n      }\n      break;\n    }\n\n    default: {\n      BPLOG(INFO) << \"Unknown exception reason \" << reason;\n      break;\n    }\n  }\n\n  return reason;\n}\n\n// static\nstring MinidumpProcessor::GetAssertion(Minidump *dump) {\n  MinidumpAssertion *assertion = dump->GetAssertion();\n  if (!assertion)\n    return \"\";\n\n  const MDRawAssertionInfo *raw_assertion = assertion->assertion();\n  if (!raw_assertion)\n    return \"\";\n\n  string assertion_string;\n  switch (raw_assertion->type) {\n  case MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER:\n    assertion_string = \"Invalid parameter passed to library function\";\n    break;\n  case MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL:\n    assertion_string = \"Pure virtual function called\";\n    break;\n  default: {\n    char assertion_type[32];\n    sprintf(assertion_type, \"0x%08x\", raw_assertion->type);\n    assertion_string = \"Unknown assertion type \";\n    assertion_string += assertion_type;\n    break;\n  }\n  }\n\n  string expression = assertion->expression();\n  if (!expression.empty()) {\n    assertion_string.append(\" \" + expression);\n  }\n\n  string function = assertion->function();\n  if (!function.empty()) {\n    assertion_string.append(\" in function \" + function);\n  }\n\n  string file = assertion->file();\n  if (!file.empty()) {\n    assertion_string.append(\", in file \" + file);\n  }\n\n  if (raw_assertion->line != 0) {\n    char assertion_line[32];\n    sprintf(assertion_line, \"%u\", raw_assertion->line);\n    assertion_string.append(\" at line \");\n    assertion_string.append(assertion_line);\n  }\n\n  return assertion_string;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/minidump_processor_unittest.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Unit test for MinidumpProcessor.  Uses a pre-generated minidump and\n// corresponding symbol file, and checks the stack frames for correctness.\n\n#include <stdlib.h>\n\n#include <string>\n#include <iostream>\n#include <fstream>\n#include <map>\n#include <utility>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"google_breakpad/processor/basic_source_line_resolver.h\"\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/code_module.h\"\n#include \"google_breakpad/processor/code_modules.h\"\n#include \"google_breakpad/processor/minidump.h\"\n#include \"google_breakpad/processor/minidump_processor.h\"\n#include \"google_breakpad/processor/process_state.h\"\n#include \"google_breakpad/processor/stack_frame.h\"\n#include \"google_breakpad/processor/symbol_supplier.h\"\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n\nusing std::map;\n\nnamespace google_breakpad {\nclass MockMinidump : public Minidump {\n public:\n  MockMinidump() : Minidump(\"\") {\n  }\n\n  MOCK_METHOD0(Read, bool());\n  MOCK_CONST_METHOD0(path, string());\n  MOCK_CONST_METHOD0(header, const MDRawHeader*());\n  MOCK_METHOD0(GetThreadList, MinidumpThreadList*());\n};\n}\n\nnamespace {\n\nusing google_breakpad::BasicSourceLineResolver;\nusing google_breakpad::CallStack;\nusing google_breakpad::CodeModule;\nusing google_breakpad::MinidumpProcessor;\nusing google_breakpad::MinidumpThreadList;\nusing google_breakpad::MinidumpThread;\nusing google_breakpad::MockMinidump;\nusing google_breakpad::ProcessState;\nusing google_breakpad::scoped_ptr;\nusing google_breakpad::SymbolSupplier;\nusing google_breakpad::SystemInfo;\nusing std::string;\nusing ::testing::_;\nusing ::testing::Mock;\nusing ::testing::Ne;\nusing ::testing::Property;\nusing ::testing::Return;\n\nstatic const char *kSystemInfoOS = \"Windows NT\";\nstatic const char *kSystemInfoOSShort = \"windows\";\nstatic const char *kSystemInfoOSVersion = \"5.1.2600 Service Pack 2\";\nstatic const char *kSystemInfoCPU = \"x86\";\nstatic const char *kSystemInfoCPUInfo =\n    \"GenuineIntel family 6 model 13 stepping 8\";\n\n#define ASSERT_TRUE_ABORT(cond) \\\n  if (!(cond)) {                                                        \\\n    fprintf(stderr, \"FAILED: %s at %s:%d\\n\", #cond, __FILE__, __LINE__); \\\n    abort(); \\\n  }\n\n#define ASSERT_EQ_ABORT(e1, e2) ASSERT_TRUE_ABORT((e1) == (e2))\n\nclass TestSymbolSupplier : public SymbolSupplier {\n public:\n  TestSymbolSupplier() : interrupt_(false) {}\n\n  virtual SymbolResult GetSymbolFile(const CodeModule *module,\n                                     const SystemInfo *system_info,\n                                     string *symbol_file);\n\n  virtual SymbolResult GetSymbolFile(const CodeModule *module,\n                                     const SystemInfo *system_info,\n                                     string *symbol_file,\n                                     string *symbol_data);\n\n  virtual SymbolResult GetCStringSymbolData(const CodeModule *module,\n                                            const SystemInfo *system_info,\n                                            string *symbol_file,\n                                            char **symbol_data);\n\n  virtual void FreeSymbolData(const CodeModule *module);\n\n  // When set to true, causes the SymbolSupplier to return INTERRUPT\n  void set_interrupt(bool interrupt) { interrupt_ = interrupt; }\n\n private:\n  bool interrupt_;\n  map<string, char *> memory_buffers_;\n};\n\nSymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile(\n    const CodeModule *module,\n    const SystemInfo *system_info,\n    string *symbol_file) {\n  ASSERT_TRUE_ABORT(module);\n  ASSERT_TRUE_ABORT(system_info);\n  ASSERT_EQ_ABORT(system_info->cpu, kSystemInfoCPU);\n  ASSERT_EQ_ABORT(system_info->cpu_info, kSystemInfoCPUInfo);\n  ASSERT_EQ_ABORT(system_info->os, kSystemInfoOS);\n  ASSERT_EQ_ABORT(system_info->os_short, kSystemInfoOSShort);\n  ASSERT_EQ_ABORT(system_info->os_version, kSystemInfoOSVersion);\n\n  if (interrupt_) {\n    return INTERRUPT;\n  }\n\n  if (module && module->code_file() == \"c:\\\\test_app.exe\") {\n      *symbol_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n                     \"/src/processor/testdata/symbols/test_app.pdb/\" +\n                     module->debug_identifier() +\n                     \"/test_app.sym\";\n    return FOUND;\n  }\n\n  return NOT_FOUND;\n}\n\nSymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile(\n    const CodeModule *module,\n    const SystemInfo *system_info,\n    string *symbol_file,\n    string *symbol_data) {\n  SymbolSupplier::SymbolResult s = GetSymbolFile(module, system_info,\n                                                 symbol_file);\n  if (s == FOUND) {\n    std::ifstream in(symbol_file->c_str());\n    std::getline(in, *symbol_data, std::string::traits_type::to_char_type(\n                     std::string::traits_type::eof()));\n    in.close();\n  }\n\n  return s;\n}\n\nSymbolSupplier::SymbolResult TestSymbolSupplier::GetCStringSymbolData(\n    const CodeModule *module,\n    const SystemInfo *system_info,\n    string *symbol_file,\n    char **symbol_data) {\n  string symbol_data_string;\n  SymbolSupplier::SymbolResult s = GetSymbolFile(module,\n                                                 system_info,\n                                                 symbol_file,\n                                                 &symbol_data_string);\n  if (s == FOUND) {\n    unsigned int size = symbol_data_string.size() + 1;\n    *symbol_data = new char[size];\n    if (*symbol_data == NULL) {\n      BPLOG(ERROR) << \"Memory allocation failed for module: \"\n                   << module->code_file() << \" size: \" << size;\n      return INTERRUPT;\n    }\n    strcpy(*symbol_data, symbol_data_string.c_str());\n    memory_buffers_.insert(make_pair(module->code_file(), *symbol_data));\n  }\n\n  return s;\n}\n\nvoid TestSymbolSupplier::FreeSymbolData(const CodeModule *module) {\n  map<string, char *>::iterator it = memory_buffers_.find(module->code_file());\n  if (it != memory_buffers_.end()) {\n    delete [] it->second;\n    memory_buffers_.erase(it);\n  }\n}\n\n// A mock symbol supplier that always returns NOT_FOUND; one current\n// use for testing the processor's caching of symbol lookups.\nclass MockSymbolSupplier : public SymbolSupplier {\n public:\n  MockSymbolSupplier() { }\n  MOCK_METHOD3(GetSymbolFile, SymbolResult(const CodeModule*,\n                                           const SystemInfo*,\n                                           string*));\n  MOCK_METHOD4(GetSymbolFile, SymbolResult(const CodeModule*,\n                                           const SystemInfo*,\n                                           string*,\n                                           string*));\n  MOCK_METHOD4(GetCStringSymbolData, SymbolResult(const CodeModule*,\n                                                  const SystemInfo*,\n                                                  string*,\n                                                  char**));\n  MOCK_METHOD1(FreeSymbolData, void(const CodeModule*));\n};\n\nclass MinidumpProcessorTest : public ::testing::Test {\n};\n\nTEST_F(MinidumpProcessorTest, TestCorruptMinidumps) {\n  MockMinidump dump;\n  TestSymbolSupplier supplier;\n  BasicSourceLineResolver resolver;\n  MinidumpProcessor processor(&supplier, &resolver);\n  ProcessState state;\n\n  EXPECT_EQ(processor.Process(\"nonexistent minidump\", &state),\n            google_breakpad::PROCESS_ERROR_MINIDUMP_NOT_FOUND);\n\n  EXPECT_CALL(dump, path()).WillRepeatedly(Return(\"mock minidump\"));\n  EXPECT_CALL(dump, Read()).WillRepeatedly(Return(true));\n\n  MDRawHeader fakeHeader;\n  fakeHeader.time_date_stamp = 0;\n  EXPECT_CALL(dump, header()).WillOnce(Return((MDRawHeader*)NULL)).\n      WillRepeatedly(Return(&fakeHeader));\n  EXPECT_EQ(processor.Process(&dump, &state),\n            google_breakpad::PROCESS_ERROR_NO_MINIDUMP_HEADER);\n\n  EXPECT_CALL(dump, GetThreadList()).\n      WillOnce(Return((MinidumpThreadList*)NULL));\n  EXPECT_EQ(processor.Process(&dump, &state),\n            google_breakpad::PROCESS_ERROR_NO_THREAD_LIST);\n}\n\n// This test case verifies that the symbol supplier is only consulted\n// once per minidump per module.\nTEST_F(MinidumpProcessorTest, TestSymbolSupplierLookupCounts) {\n  MockSymbolSupplier supplier;\n  BasicSourceLineResolver resolver;\n  MinidumpProcessor processor(&supplier, &resolver);\n\n  string minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n                         \"/src/processor/testdata/minidump2.dmp\";\n  ProcessState state;\n  EXPECT_CALL(supplier, GetCStringSymbolData(\n      Property(&google_breakpad::CodeModule::code_file,\n               \"c:\\\\test_app.exe\"),\n      _, _, _)).WillOnce(Return(SymbolSupplier::NOT_FOUND));\n  EXPECT_CALL(supplier, GetCStringSymbolData(\n      Property(&google_breakpad::CodeModule::code_file,\n               Ne(\"c:\\\\test_app.exe\")),\n      _, _, _)).WillRepeatedly(Return(SymbolSupplier::NOT_FOUND));\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n\n  ASSERT_TRUE(Mock::VerifyAndClearExpectations(&supplier));\n\n  // We need to verify that across minidumps, the processor will refetch\n  // symbol files, even with the same symbol supplier.\n  EXPECT_CALL(supplier, GetCStringSymbolData(\n      Property(&google_breakpad::CodeModule::code_file,\n               \"c:\\\\test_app.exe\"),\n      _, _, _)).WillOnce(Return(SymbolSupplier::NOT_FOUND));\n  EXPECT_CALL(supplier, GetCStringSymbolData(\n      Property(&google_breakpad::CodeModule::code_file,\n               Ne(\"c:\\\\test_app.exe\")),\n      _, _, _)).WillRepeatedly(Return(SymbolSupplier::NOT_FOUND));\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n}\n\nTEST_F(MinidumpProcessorTest, TestBasicProcessing) {\n  TestSymbolSupplier supplier;\n  BasicSourceLineResolver resolver;\n  MinidumpProcessor processor(&supplier, &resolver);\n\n  string minidump_file = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n                         \"/src/processor/testdata/minidump2.dmp\";\n\n  ProcessState state;\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_OK);\n  ASSERT_EQ(state.system_info()->os, kSystemInfoOS);\n  ASSERT_EQ(state.system_info()->os_short, kSystemInfoOSShort);\n  ASSERT_EQ(state.system_info()->os_version, kSystemInfoOSVersion);\n  ASSERT_EQ(state.system_info()->cpu, kSystemInfoCPU);\n  ASSERT_EQ(state.system_info()->cpu_info, kSystemInfoCPUInfo);\n  ASSERT_TRUE(state.crashed());\n  ASSERT_EQ(state.crash_reason(), \"EXCEPTION_ACCESS_VIOLATION_WRITE\");\n  ASSERT_EQ(state.crash_address(), 0x45U);\n  ASSERT_EQ(state.threads()->size(), size_t(1));\n  ASSERT_EQ(state.requesting_thread(), 0);\n\n  CallStack *stack = state.threads()->at(0);\n  ASSERT_TRUE(stack);\n  ASSERT_EQ(stack->frames()->size(), 4U);\n\n  ASSERT_TRUE(stack->frames()->at(0)->module);\n  ASSERT_EQ(stack->frames()->at(0)->module->base_address(), 0x400000U);\n  ASSERT_EQ(stack->frames()->at(0)->module->code_file(), \"c:\\\\test_app.exe\");\n  ASSERT_EQ(stack->frames()->at(0)->function_name,\n            \"`anonymous namespace'::CrashFunction\");\n  ASSERT_EQ(stack->frames()->at(0)->source_file_name, \"c:\\\\test_app.cc\");\n  ASSERT_EQ(stack->frames()->at(0)->source_line, 58);\n\n  ASSERT_TRUE(stack->frames()->at(1)->module);\n  ASSERT_EQ(stack->frames()->at(1)->module->base_address(), 0x400000U);\n  ASSERT_EQ(stack->frames()->at(1)->module->code_file(), \"c:\\\\test_app.exe\");\n  ASSERT_EQ(stack->frames()->at(1)->function_name, \"main\");\n  ASSERT_EQ(stack->frames()->at(1)->source_file_name, \"c:\\\\test_app.cc\");\n  ASSERT_EQ(stack->frames()->at(1)->source_line, 65);\n\n  // This comes from the CRT\n  ASSERT_TRUE(stack->frames()->at(2)->module);\n  ASSERT_EQ(stack->frames()->at(2)->module->base_address(), 0x400000U);\n  ASSERT_EQ(stack->frames()->at(2)->module->code_file(), \"c:\\\\test_app.exe\");\n  ASSERT_EQ(stack->frames()->at(2)->function_name, \"__tmainCRTStartup\");\n  ASSERT_EQ(stack->frames()->at(2)->source_file_name,\n            \"f:\\\\sp\\\\vctools\\\\crt_bld\\\\self_x86\\\\crt\\\\src\\\\crt0.c\");\n  ASSERT_EQ(stack->frames()->at(2)->source_line, 327);\n\n  // No debug info available for kernel32.dll\n  ASSERT_TRUE(stack->frames()->at(3)->module);\n  ASSERT_EQ(stack->frames()->at(3)->module->base_address(), 0x7c800000U);\n  ASSERT_EQ(stack->frames()->at(3)->module->code_file(),\n            \"C:\\\\WINDOWS\\\\system32\\\\kernel32.dll\");\n  ASSERT_TRUE(stack->frames()->at(3)->function_name.empty());\n  ASSERT_TRUE(stack->frames()->at(3)->source_file_name.empty());\n  ASSERT_EQ(stack->frames()->at(3)->source_line, 0);\n\n  ASSERT_EQ(state.modules()->module_count(), 13U);\n  ASSERT_TRUE(state.modules()->GetMainModule());\n  ASSERT_EQ(state.modules()->GetMainModule()->code_file(), \"c:\\\\test_app.exe\");\n  ASSERT_FALSE(state.modules()->GetModuleForAddress(0));\n  ASSERT_EQ(state.modules()->GetMainModule(),\n            state.modules()->GetModuleForAddress(0x400000));\n  ASSERT_EQ(state.modules()->GetModuleForAddress(0x7c801234)->debug_file(),\n            \"kernel32.pdb\");\n  ASSERT_EQ(state.modules()->GetModuleForAddress(0x77d43210)->version(),\n            \"5.1.2600.2622\");\n\n  // Test that disabled exploitability engine defaults to\n  // EXPLOITABILITY_NOT_ANALYZED.\n  ASSERT_EQ(google_breakpad::EXPLOITABILITY_NOT_ANALYZED,\n            state.exploitability());\n\n  // Test that the symbol supplier can interrupt processing\n  state.Clear();\n  supplier.set_interrupt(true);\n  ASSERT_EQ(processor.Process(minidump_file, &state),\n            google_breakpad::PROCESS_SYMBOL_SUPPLIER_INTERRUPTED);\n}\n}  // namespace\n\nint main(int argc, char *argv[]) {\n  ::testing::InitGoogleTest(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/minidump_stackwalk.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// minidump_stackwalk.cc: Process a minidump with MinidumpProcessor, printing\n// the results, including stack traces.\n//\n// Author: Mark Mentovai\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <string>\n#include <vector>\n\n#include \"google_breakpad/processor/basic_source_line_resolver.h\"\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/code_module.h\"\n#include \"google_breakpad/processor/code_modules.h\"\n#include \"google_breakpad/processor/minidump.h\"\n#include \"google_breakpad/processor/minidump_processor.h\"\n#include \"google_breakpad/processor/process_state.h\"\n#include \"google_breakpad/processor/stack_frame_cpu.h\"\n#include \"processor/logging.h\"\n#include \"processor/pathname_stripper.h\"\n#include \"processor/scoped_ptr.h\"\n#include \"processor/simple_symbol_supplier.h\"\n\nnamespace {\n\nusing std::string;\nusing std::vector;\nusing google_breakpad::BasicSourceLineResolver;\nusing google_breakpad::CallStack;\nusing google_breakpad::CodeModule;\nusing google_breakpad::CodeModules;\nusing google_breakpad::MinidumpModule;\nusing google_breakpad::MinidumpProcessor;\nusing google_breakpad::PathnameStripper;\nusing google_breakpad::ProcessState;\nusing google_breakpad::scoped_ptr;\nusing google_breakpad::SimpleSymbolSupplier;\nusing google_breakpad::StackFrame;\nusing google_breakpad::StackFramePPC;\nusing google_breakpad::StackFrameSPARC;\nusing google_breakpad::StackFrameX86;\nusing google_breakpad::StackFrameAMD64;\nusing google_breakpad::StackFrameARM;\n\n// Separator character for machine readable output.\nstatic const char kOutputSeparator = '|';\n\n// PrintRegister prints a register's name and value to stdout.  It will\n// print four registers on a line.  For the first register in a set,\n// pass 0 for |start_col|.  For registers in a set, pass the most recent\n// return value of PrintRegister.\n// The caller is responsible for printing the final newline after a set\n// of registers is completely printed, regardless of the number of calls\n// to PrintRegister.\nstatic const int kMaxWidth = 80;  // optimize for an 80-column terminal\nstatic int PrintRegister(const char *name, u_int32_t value, int start_col) {\n  char buffer[64];\n  snprintf(buffer, sizeof(buffer), \" %5s = 0x%08x\", name, value);\n\n  if (start_col + strlen(buffer) > kMaxWidth) {\n    start_col = 0;\n    printf(\"\\n \");\n  }\n  fputs(buffer, stdout);\n\n  return start_col + strlen(buffer);\n}\n\n// PrintRegister64 does the same thing, but for 64-bit registers.\nstatic int PrintRegister64(const char *name, u_int64_t value, int start_col) {\n  char buffer[64];\n  snprintf(buffer, sizeof(buffer), \" %5s = 0x%016\" PRIx64 , name, value);\n\n  if (start_col + strlen(buffer) > kMaxWidth) {\n    start_col = 0;\n    printf(\"\\n \");\n  }\n  fputs(buffer, stdout);\n\n  return start_col + strlen(buffer);\n}\n\n// StripSeparator takes a string |original| and returns a copy\n// of the string with all occurences of |kOutputSeparator| removed.\nstatic string StripSeparator(const string &original) {\n  string result = original;\n  string::size_type position = 0;\n  while ((position = result.find(kOutputSeparator, position)) != string::npos) {\n    result.erase(position, 1);\n  }\n  position = 0;\n  while ((position = result.find('\\n', position)) != string::npos) {\n    result.erase(position, 1);\n  }\n  return result;\n}\n\n// PrintStack prints the call stack in |stack| to stdout, in a reasonably\n// useful form.  Module, function, and source file names are displayed if\n// they are available.  The code offset to the base code address of the\n// source line, function, or module is printed, preferring them in that\n// order.  If no source line, function, or module information is available,\n// an absolute code offset is printed.\n//\n// If |cpu| is a recognized CPU name, relevant register state for each stack\n// frame printed is also output, if available.\nstatic void PrintStack(const CallStack *stack, const string &cpu) {\n  int frame_count = stack->frames()->size();\n  for (int frame_index = 0; frame_index < frame_count; ++frame_index) {\n    const StackFrame *frame = stack->frames()->at(frame_index);\n    printf(\"%2d  \", frame_index);\n\n    if (frame->module) {\n      printf(\"%s\", PathnameStripper::File(frame->module->code_file()).c_str());\n      if (!frame->function_name.empty()) {\n        printf(\"!%s\", frame->function_name.c_str());\n        if (!frame->source_file_name.empty()) {\n          string source_file = PathnameStripper::File(frame->source_file_name);\n          printf(\" [%s : %d + 0x%\" PRIx64 \"]\",\n                 source_file.c_str(),\n                 frame->source_line,\n                 frame->instruction - frame->source_line_base);\n        } else {\n          printf(\" + 0x%\" PRIx64, frame->instruction - frame->function_base);\n        }\n      } else {\n        printf(\" + 0x%\" PRIx64,\n               frame->instruction - frame->module->base_address());\n      }\n    } else {\n      printf(\"0x%\" PRIx64, frame->instruction);\n    }\n    printf(\"\\n \");\n\n    int sequence = 0;\n    if (cpu == \"x86\") {\n      const StackFrameX86 *frame_x86 =\n        reinterpret_cast<const StackFrameX86*>(frame);\n\n      if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EIP)\n        sequence = PrintRegister(\"eip\", frame_x86->context.eip, sequence);\n      if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_ESP)\n        sequence = PrintRegister(\"esp\", frame_x86->context.esp, sequence);\n      if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EBP)\n        sequence = PrintRegister(\"ebp\", frame_x86->context.ebp, sequence);\n      if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EBX)\n        sequence = PrintRegister(\"ebx\", frame_x86->context.ebx, sequence);\n      if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_ESI)\n        sequence = PrintRegister(\"esi\", frame_x86->context.esi, sequence);\n      if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EDI)\n        sequence = PrintRegister(\"edi\", frame_x86->context.edi, sequence);\n      if (frame_x86->context_validity == StackFrameX86::CONTEXT_VALID_ALL) {\n        sequence = PrintRegister(\"eax\", frame_x86->context.eax, sequence);\n        sequence = PrintRegister(\"ecx\", frame_x86->context.ecx, sequence);\n        sequence = PrintRegister(\"edx\", frame_x86->context.edx, sequence);\n        sequence = PrintRegister(\"efl\", frame_x86->context.eflags, sequence);\n      }\n    } else if (cpu == \"ppc\") {\n      const StackFramePPC *frame_ppc =\n        reinterpret_cast<const StackFramePPC*>(frame);\n\n      if (frame_ppc->context_validity & StackFramePPC::CONTEXT_VALID_SRR0)\n        sequence = PrintRegister(\"srr0\", frame_ppc->context.srr0, sequence);\n      if (frame_ppc->context_validity & StackFramePPC::CONTEXT_VALID_GPR1)\n        sequence = PrintRegister(\"r1\", frame_ppc->context.gpr[1], sequence);\n    } else if (cpu == \"amd64\") {\n      const StackFrameAMD64 *frame_amd64 =\n        reinterpret_cast<const StackFrameAMD64*>(frame);\n\n      if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RBX)\n        sequence = PrintRegister64(\"rbx\", frame_amd64->context.rbx, sequence);\n      if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R12)\n        sequence = PrintRegister64(\"r12\", frame_amd64->context.r12, sequence);\n      if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R13)\n        sequence = PrintRegister64(\"r13\", frame_amd64->context.r13, sequence);\n      if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R14)\n        sequence = PrintRegister64(\"r14\", frame_amd64->context.r14, sequence);\n      if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R15)\n        sequence = PrintRegister64(\"r15\", frame_amd64->context.r15, sequence);\n      if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RIP)\n        sequence = PrintRegister64(\"rip\", frame_amd64->context.rip, sequence);\n      if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RSP)\n        sequence = PrintRegister64(\"rsp\", frame_amd64->context.rsp, sequence);\n      if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RBP)\n        sequence = PrintRegister64(\"rbp\", frame_amd64->context.rbp, sequence);\n    } else if (cpu == \"sparc\") {\n      const StackFrameSPARC *frame_sparc =\n        reinterpret_cast<const StackFrameSPARC*>(frame);\n\n      if (frame_sparc->context_validity & StackFrameSPARC::CONTEXT_VALID_SP)\n        sequence = PrintRegister(\"sp\", frame_sparc->context.g_r[14], sequence);\n      if (frame_sparc->context_validity & StackFrameSPARC::CONTEXT_VALID_FP)\n        sequence = PrintRegister(\"fp\", frame_sparc->context.g_r[30], sequence);\n      if (frame_sparc->context_validity & StackFrameSPARC::CONTEXT_VALID_PC)\n        sequence = PrintRegister(\"pc\", frame_sparc->context.pc, sequence);\n    } else if (cpu == \"arm\") {\n      const StackFrameARM *frame_arm =\n        reinterpret_cast<const StackFrameARM*>(frame);\n\n      // General-purpose callee-saves registers.\n      if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R4)\n        sequence = PrintRegister(\"r4\", frame_arm->context.iregs[4], sequence);\n      if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R5)\n        sequence = PrintRegister(\"r5\", frame_arm->context.iregs[5], sequence);\n      if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R6)\n        sequence = PrintRegister(\"r6\", frame_arm->context.iregs[6], sequence);\n      if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R7)\n        sequence = PrintRegister(\"r7\", frame_arm->context.iregs[7], sequence);\n      if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R8)\n        sequence = PrintRegister(\"r8\", frame_arm->context.iregs[8], sequence);\n      if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R9)\n        sequence = PrintRegister(\"r9\", frame_arm->context.iregs[9], sequence);\n      if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_R10)\n        sequence = PrintRegister(\"r10\", frame_arm->context.iregs[10], sequence);\n\n      // Registers with a dedicated or conventional purpose.\n      if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_FP)\n        sequence = PrintRegister(\"fp\", frame_arm->context.iregs[11], sequence);\n      if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_SP)\n        sequence = PrintRegister(\"sp\", frame_arm->context.iregs[13], sequence);\n      if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_LR)\n        sequence = PrintRegister(\"lr\", frame_arm->context.iregs[14], sequence);\n      if (frame_arm->context_validity & StackFrameARM::CONTEXT_VALID_PC)\n        sequence = PrintRegister(\"pc\", frame_arm->context.iregs[15], sequence);\n    }\n    printf(\"\\n    Found by: %s\\n\", frame->trust_description().c_str());\n  }\n}\n\n// PrintStackMachineReadable prints the call stack in |stack| to stdout,\n// in the following machine readable pipe-delimited text format:\n// thread number|frame number|module|function|source file|line|offset\n//\n// Module, function, source file, and source line may all be empty\n// depending on availability.  The code offset follows the same rules as\n// PrintStack above.\nstatic void PrintStackMachineReadable(int thread_num, const CallStack *stack) {\n  int frame_count = stack->frames()->size();\n  for (int frame_index = 0; frame_index < frame_count; ++frame_index) {\n    const StackFrame *frame = stack->frames()->at(frame_index);\n    printf(\"%d%c%d%c\", thread_num, kOutputSeparator, frame_index,\n           kOutputSeparator);\n\n    if (frame->module) {\n      assert(!frame->module->code_file().empty());\n      printf(\"%s\", StripSeparator(PathnameStripper::File(\n                     frame->module->code_file())).c_str());\n      if (!frame->function_name.empty()) {\n        printf(\"%c%s\", kOutputSeparator,\n               StripSeparator(frame->function_name).c_str());\n        if (!frame->source_file_name.empty()) {\n          printf(\"%c%s%c%d%c0x%\" PRIx64,\n                 kOutputSeparator,\n                 StripSeparator(frame->source_file_name).c_str(),\n                 kOutputSeparator,\n                 frame->source_line,\n                 kOutputSeparator,\n                 frame->instruction - frame->source_line_base);\n        } else {\n          printf(\"%c%c%c0x%\" PRIx64,\n                 kOutputSeparator,  // empty source file\n                 kOutputSeparator,  // empty source line\n                 kOutputSeparator,\n                 frame->instruction - frame->function_base);\n        }\n      } else {\n        printf(\"%c%c%c%c0x%\" PRIx64,\n               kOutputSeparator,  // empty function name\n               kOutputSeparator,  // empty source file\n               kOutputSeparator,  // empty source line\n               kOutputSeparator,\n               frame->instruction - frame->module->base_address());\n      }\n    } else {\n      // the printf before this prints a trailing separator for module name\n      printf(\"%c%c%c%c0x%\" PRIx64,\n             kOutputSeparator,  // empty function name\n             kOutputSeparator,  // empty source file\n             kOutputSeparator,  // empty source line\n             kOutputSeparator,\n             frame->instruction);\n    }\n    printf(\"\\n\");\n  }\n}\n\nstatic void PrintModules(const CodeModules *modules) {\n  if (!modules)\n    return;\n\n  printf(\"\\n\");\n  printf(\"Loaded modules:\\n\");\n\n  u_int64_t main_address = 0;\n  const CodeModule *main_module = modules->GetMainModule();\n  if (main_module) {\n    main_address = main_module->base_address();\n  }\n\n  unsigned int module_count = modules->module_count();\n  for (unsigned int module_sequence = 0;\n       module_sequence < module_count;\n       ++module_sequence) {\n    const CodeModule *module = modules->GetModuleAtSequence(module_sequence);\n    u_int64_t base_address = module->base_address();\n    printf(\"0x%08\" PRIx64 \" - 0x%08\" PRIx64 \"  %s  %s%s\\n\",\n           base_address, base_address + module->size() - 1,\n           PathnameStripper::File(module->code_file()).c_str(),\n           module->version().empty() ? \"???\" : module->version().c_str(),\n           main_module != NULL && base_address == main_address ?\n               \"  (main)\" : \"\");\n  }\n}\n\n// PrintModulesMachineReadable outputs a list of loaded modules,\n// one per line, in the following machine-readable pipe-delimited\n// text format:\n// Module|{Module Filename}|{Version}|{Debug Filename}|{Debug Identifier}|\n// {Base Address}|{Max Address}|{Main}\nstatic void PrintModulesMachineReadable(const CodeModules *modules) {\n  if (!modules)\n    return;\n\n  u_int64_t main_address = 0;\n  const CodeModule *main_module = modules->GetMainModule();\n  if (main_module) {\n    main_address = main_module->base_address();\n  }\n\n  unsigned int module_count = modules->module_count();\n  for (unsigned int module_sequence = 0;\n       module_sequence < module_count;\n       ++module_sequence) {\n    const CodeModule *module = modules->GetModuleAtSequence(module_sequence);\n    u_int64_t base_address = module->base_address();\n    printf(\"Module%c%s%c%s%c%s%c%s%c0x%08\" PRIx64 \"%c0x%08\" PRIx64 \"%c%d\\n\",\n           kOutputSeparator,\n           StripSeparator(PathnameStripper::File(module->code_file())).c_str(),\n           kOutputSeparator, StripSeparator(module->version()).c_str(),\n           kOutputSeparator,\n           StripSeparator(PathnameStripper::File(module->debug_file())).c_str(),\n           kOutputSeparator,\n           StripSeparator(module->debug_identifier()).c_str(),\n           kOutputSeparator, base_address,\n           kOutputSeparator, base_address + module->size() - 1,\n           kOutputSeparator,\n           main_module != NULL && base_address == main_address ? 1 : 0);\n  }\n}\n\nstatic void PrintProcessState(const ProcessState& process_state) {\n  // Print OS and CPU information.\n  string cpu = process_state.system_info()->cpu;\n  string cpu_info = process_state.system_info()->cpu_info;\n  printf(\"Operating system: %s\\n\", process_state.system_info()->os.c_str());\n  printf(\"                  %s\\n\",\n         process_state.system_info()->os_version.c_str());\n  printf(\"CPU: %s\\n\", cpu.c_str());\n  if (!cpu_info.empty()) {\n    // This field is optional.\n    printf(\"     %s\\n\", cpu_info.c_str());\n  }\n  printf(\"     %d CPU%s\\n\",\n         process_state.system_info()->cpu_count,\n         process_state.system_info()->cpu_count != 1 ? \"s\" : \"\");\n  printf(\"\\n\");\n\n  // Print crash information.\n  if (process_state.crashed()) {\n    printf(\"Crash reason:  %s\\n\", process_state.crash_reason().c_str());\n    printf(\"Crash address: 0x%\" PRIx64 \"\\n\", process_state.crash_address());\n  } else {\n    printf(\"No crash\\n\");\n  }\n\n  string assertion = process_state.assertion();\n  if (!assertion.empty()) {\n    printf(\"Assertion: %s\\n\", assertion.c_str());\n  }\n\n  // If the thread that requested the dump is known, print it first.\n  int requesting_thread = process_state.requesting_thread();\n  if (requesting_thread != -1) {\n    printf(\"\\n\");\n    printf(\"Thread %d (%s)\\n\",\n          requesting_thread,\n          process_state.crashed() ? \"crashed\" :\n                                    \"requested dump, did not crash\");\n    PrintStack(process_state.threads()->at(requesting_thread), cpu);\n  }\n\n  // Print all of the threads in the dump.\n  int thread_count = process_state.threads()->size();\n  for (int thread_index = 0; thread_index < thread_count; ++thread_index) {\n    if (thread_index != requesting_thread) {\n      // Don't print the crash thread again, it was already printed.\n      printf(\"\\n\");\n      printf(\"Thread %d\\n\", thread_index);\n      PrintStack(process_state.threads()->at(thread_index), cpu);\n    }\n  }\n\n  PrintModules(process_state.modules());\n}\n\nstatic void PrintProcessStateMachineReadable(const ProcessState& process_state)\n{\n  // Print OS and CPU information.\n  // OS|{OS Name}|{OS Version}\n  // CPU|{CPU Name}|{CPU Info}|{Number of CPUs}\n  printf(\"OS%c%s%c%s\\n\", kOutputSeparator,\n         StripSeparator(process_state.system_info()->os).c_str(),\n         kOutputSeparator,\n         StripSeparator(process_state.system_info()->os_version).c_str());\n  printf(\"CPU%c%s%c%s%c%d\\n\", kOutputSeparator,\n         StripSeparator(process_state.system_info()->cpu).c_str(),\n         kOutputSeparator,\n         // this may be empty\n         StripSeparator(process_state.system_info()->cpu_info).c_str(),\n         kOutputSeparator,\n         process_state.system_info()->cpu_count);\n\n  int requesting_thread = process_state.requesting_thread();\n\n  // Print crash information.\n  // Crash|{Crash Reason}|{Crash Address}|{Crashed Thread}\n  printf(\"Crash%c\", kOutputSeparator);\n  if (process_state.crashed()) {\n    printf(\"%s%c0x%\" PRIx64 \"%c\",\n           StripSeparator(process_state.crash_reason()).c_str(),\n           kOutputSeparator, process_state.crash_address(), kOutputSeparator);\n  } else {\n    // print assertion info, if available, in place of crash reason,\n    // instead of the unhelpful \"No crash\"\n    string assertion = process_state.assertion();\n    if (!assertion.empty()) {\n      printf(\"%s%c%c\", StripSeparator(assertion).c_str(),\n             kOutputSeparator, kOutputSeparator);\n    } else {\n      printf(\"No crash%c%c\", kOutputSeparator, kOutputSeparator);\n    }\n  }\n\n  if (requesting_thread != -1) {\n    printf(\"%d\\n\", requesting_thread);\n  } else {\n    printf(\"\\n\");\n  }\n\n  PrintModulesMachineReadable(process_state.modules());\n\n  // blank line to indicate start of threads\n  printf(\"\\n\");\n\n  // If the thread that requested the dump is known, print it first.\n  if (requesting_thread != -1) {\n    PrintStackMachineReadable(requesting_thread,\n                              process_state.threads()->at(requesting_thread));\n  }\n\n  // Print all of the threads in the dump.\n  int thread_count = process_state.threads()->size();\n  for (int thread_index = 0; thread_index < thread_count; ++thread_index) {\n    if (thread_index != requesting_thread) {\n      // Don't print the crash thread again, it was already printed.\n      PrintStackMachineReadable(thread_index,\n                                process_state.threads()->at(thread_index));\n    }\n  }\n}\n\n// Processes |minidump_file| using MinidumpProcessor.  |symbol_path|, if\n// non-empty, is the base directory of a symbol storage area, laid out in\n// the format required by SimpleSymbolSupplier.  If such a storage area\n// is specified, it is made available for use by the MinidumpProcessor.\n//\n// Returns the value of MinidumpProcessor::Process.  If processing succeeds,\n// prints identifying OS and CPU information from the minidump, crash\n// information if the minidump was produced as a result of a crash, and\n// call stacks for each thread contained in the minidump.  All information\n// is printed to stdout.\nstatic bool PrintMinidumpProcess(const string &minidump_file,\n                                 const vector<string> &symbol_paths,\n                                 bool machine_readable) {\n  scoped_ptr<SimpleSymbolSupplier> symbol_supplier;\n  if (!symbol_paths.empty()) {\n    // TODO(mmentovai): check existence of symbol_path if specified?\n    symbol_supplier.reset(new SimpleSymbolSupplier(symbol_paths));\n  }\n\n  BasicSourceLineResolver resolver;\n  MinidumpProcessor minidump_processor(symbol_supplier.get(), &resolver);\n\n  // Process the minidump.\n  ProcessState process_state;\n  if (minidump_processor.Process(minidump_file, &process_state) !=\n      google_breakpad::PROCESS_OK) {\n    BPLOG(ERROR) << \"MinidumpProcessor::Process failed\";\n    return false;\n  }\n\n  if (machine_readable) {\n    PrintProcessStateMachineReadable(process_state);\n  } else {\n    PrintProcessState(process_state);\n  }\n\n  return true;\n}\n\n}  // namespace\n\nstatic void usage(const char *program_name) {\n  fprintf(stderr, \"usage: %s [-m] <minidump-file> [symbol-path ...]\\n\"\n          \"    -m : Output in machine-readable format\\n\",\n          program_name);\n}\n\nint main(int argc, char **argv) {\n  BPLOG_INIT(&argc, &argv);\n\n  if (argc < 2) {\n    usage(argv[0]);\n    return 1;\n  }\n\n  const char *minidump_file;\n  bool machine_readable;\n  int symbol_path_arg;\n\n  if (strcmp(argv[1], \"-m\") == 0) {\n    if (argc < 3) {\n      usage(argv[0]);\n      return 1;\n    }\n\n    machine_readable = true;\n    minidump_file = argv[2];\n    symbol_path_arg = 3;\n  } else {\n    machine_readable = false;\n    minidump_file = argv[1];\n    symbol_path_arg = 2;\n  }\n\n  // extra arguments are symbol paths\n  std::vector<std::string> symbol_paths;\n  if (argc > symbol_path_arg) {\n    for (int argi = symbol_path_arg; argi < argc; ++argi)\n      symbol_paths.push_back(argv[argi]);\n  }\n\n  return PrintMinidumpProcess(minidump_file,\n                              symbol_paths,\n                              machine_readable) ? 0 : 1;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/minidump_stackwalk_machine_readable_test",
    "content": "#!/bin/sh\n\n# Copyright (c) 2007, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\ntestdata_dir=$srcdir/src/processor/testdata\n./src/processor/minidump_stackwalk -m $testdata_dir/minidump2.dmp \\\n                                      $testdata_dir/symbols | \\\n tr -d '\\015' | \\\n diff -u $testdata_dir/minidump2.stackwalk.machine_readable.out -\nexit $?\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/minidump_stackwalk_test",
    "content": "#!/bin/sh\n\n# Copyright (c) 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\ntestdata_dir=$srcdir/src/processor/testdata\n./src/processor/minidump_stackwalk $testdata_dir/minidump2.dmp \\\n                                   $testdata_dir/symbols | \\\n tr -d '\\015' | \\\n diff -u $testdata_dir/minidump2.stackwalk.out -\nexit $?\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/minidump_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Unit test for Minidump.  Uses a pre-generated minidump and\n// verifies that certain streams are correct.\n\n#include <iostream>\n#include <fstream>\n#include <sstream>\n#include <stdlib.h>\n#include <string>\n#include <vector>\n#include \"breakpad_googletest_includes.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"google_breakpad/processor/minidump.h\"\n#include \"processor/logging.h\"\n#include \"processor/synth_minidump.h\"\n\nnamespace {\n\nusing google_breakpad::Minidump;\nusing google_breakpad::MinidumpContext;\nusing google_breakpad::MinidumpException;\nusing google_breakpad::MinidumpMemoryInfo;\nusing google_breakpad::MinidumpMemoryInfoList;\nusing google_breakpad::MinidumpMemoryList;\nusing google_breakpad::MinidumpMemoryRegion;\nusing google_breakpad::MinidumpModule;\nusing google_breakpad::MinidumpModuleList;\nusing google_breakpad::MinidumpSystemInfo;\nusing google_breakpad::MinidumpThread;\nusing google_breakpad::MinidumpThreadList;\nusing google_breakpad::SynthMinidump::Context;\nusing google_breakpad::SynthMinidump::Dump;\nusing google_breakpad::SynthMinidump::Exception;\nusing google_breakpad::SynthMinidump::Memory;\nusing google_breakpad::SynthMinidump::Module;\nusing google_breakpad::SynthMinidump::Stream;\nusing google_breakpad::SynthMinidump::String;\nusing google_breakpad::SynthMinidump::SystemInfo;\nusing google_breakpad::SynthMinidump::Thread;\nusing google_breakpad::test_assembler::kBigEndian;\nusing google_breakpad::test_assembler::kLittleEndian;\nusing std::ifstream;\nusing std::istringstream;\nusing std::string;\nusing std::vector;\nusing ::testing::Return;\n\nclass MinidumpTest : public ::testing::Test {\npublic:\n  void SetUp() {\n    minidump_file_ = string(getenv(\"srcdir\") ? getenv(\"srcdir\") : \".\") +\n      \"/src/processor/testdata/minidump2.dmp\";\n  }\n  string minidump_file_;\n};\n\nTEST_F(MinidumpTest, TestMinidumpFromFile) {\n  Minidump minidump(minidump_file_);\n  ASSERT_EQ(minidump.path(), minidump_file_);\n  ASSERT_TRUE(minidump.Read());\n  const MDRawHeader* header = minidump.header();\n  ASSERT_NE(header, (MDRawHeader*)NULL);\n  ASSERT_EQ(header->signature, u_int32_t(MD_HEADER_SIGNATURE));\n  //TODO: add more checks here\n}\n\nTEST_F(MinidumpTest, TestMinidumpFromStream) {\n  // read minidump contents into memory, construct a stringstream around them\n  ifstream file_stream(minidump_file_.c_str(), std::ios::in);\n  ASSERT_TRUE(file_stream.good());\n  vector<char> bytes;\n  file_stream.seekg(0, std::ios_base::end);\n  ASSERT_TRUE(file_stream.good());\n  bytes.resize(file_stream.tellg());\n  file_stream.seekg(0, std::ios_base::beg);\n  ASSERT_TRUE(file_stream.good());\n  file_stream.read(&bytes[0], bytes.size());\n  ASSERT_TRUE(file_stream.good());\n  string str(&bytes[0], bytes.size());\n  istringstream stream(str);\n  ASSERT_TRUE(stream.good());\n\n  // now read minidump from stringstream\n  Minidump minidump(stream);\n  ASSERT_EQ(minidump.path(), \"\");\n  ASSERT_TRUE(minidump.Read());\n  const MDRawHeader* header = minidump.header();\n  ASSERT_NE(header, (MDRawHeader*)NULL);\n  ASSERT_EQ(header->signature, u_int32_t(MD_HEADER_SIGNATURE));\n  //TODO: add more checks here\n}\n\nTEST(Dump, ReadBackEmpty) {\n  Dump dump(0);\n  dump.Finish();\n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n  istringstream stream(contents);\n  Minidump minidump(stream);\n  ASSERT_TRUE(minidump.Read());\n  ASSERT_EQ(0U, minidump.GetDirectoryEntryCount());\n}\n\nTEST(Dump, ReadBackEmptyBigEndian) {\n  Dump big_minidump(0, kBigEndian);\n  big_minidump.Finish();\n  string contents;\n  ASSERT_TRUE(big_minidump.GetContents(&contents));\n  istringstream stream(contents);\n  Minidump minidump(stream);\n  ASSERT_TRUE(minidump.Read());\n  ASSERT_EQ(0U, minidump.GetDirectoryEntryCount());\n}\n\nTEST(Dump, OneStream) {\n  Dump dump(0, kBigEndian);\n  Stream stream(dump, 0xfbb7fa2bU);\n  stream.Append(\"stream contents\");\n  dump.Add(&stream);\n  dump.Finish();\n  \n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n  istringstream minidump_stream(contents);\n  Minidump minidump(minidump_stream);\n  ASSERT_TRUE(minidump.Read());\n  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());\n\n  const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0);\n  ASSERT_TRUE(dir != NULL);\n  EXPECT_EQ(0xfbb7fa2bU, dir->stream_type);\n\n  u_int32_t stream_length;\n  ASSERT_TRUE(minidump.SeekToStreamType(0xfbb7fa2bU, &stream_length));\n  ASSERT_EQ(15U, stream_length);\n  char stream_contents[15];\n  ASSERT_TRUE(minidump.ReadBytes(stream_contents, sizeof(stream_contents)));\n  EXPECT_EQ(string(\"stream contents\"),\n            string(stream_contents, sizeof(stream_contents)));\n\n  EXPECT_FALSE(minidump.GetThreadList());\n  EXPECT_FALSE(minidump.GetModuleList());\n  EXPECT_FALSE(minidump.GetMemoryList());\n  EXPECT_FALSE(minidump.GetException());\n  EXPECT_FALSE(minidump.GetAssertion());\n  EXPECT_FALSE(minidump.GetSystemInfo());\n  EXPECT_FALSE(minidump.GetMiscInfo());\n  EXPECT_FALSE(minidump.GetBreakpadInfo());\n}\n\nTEST(Dump, OneMemory) {\n  Dump dump(0, kBigEndian);\n  Memory memory(dump, 0x309d68010bd21b2cULL);\n  memory.Append(\"memory contents\");\n  dump.Add(&memory);\n  dump.Finish();\n\n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n  istringstream minidump_stream(contents);\n  Minidump minidump(minidump_stream);\n  ASSERT_TRUE(minidump.Read());\n  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());\n\n  const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0);\n  ASSERT_TRUE(dir != NULL);\n  EXPECT_EQ((u_int32_t) MD_MEMORY_LIST_STREAM, dir->stream_type);\n\n  MinidumpMemoryList *memory_list = minidump.GetMemoryList();\n  ASSERT_TRUE(memory_list != NULL);\n  ASSERT_EQ(1U, memory_list->region_count());\n\n  MinidumpMemoryRegion *region1 = memory_list->GetMemoryRegionAtIndex(0);\n  ASSERT_EQ(0x309d68010bd21b2cULL, region1->GetBase());\n  ASSERT_EQ(15U, region1->GetSize());\n  const u_int8_t *region1_bytes = region1->GetMemory();\n  ASSERT_TRUE(memcmp(\"memory contents\", region1_bytes, 15) == 0);\n}\n\n// One thread --- and its requisite entourage.\nTEST(Dump, OneThread) {\n  Dump dump(0, kLittleEndian);\n  Memory stack(dump, 0x2326a0fa);\n  stack.Append(\"stack for thread\");\n\n  MDRawContextX86 raw_context;\n  raw_context.context_flags = MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL;\n  raw_context.edi = 0x3ecba80d;\n  raw_context.esi = 0x382583b9;\n  raw_context.ebx = 0x7fccc03f;\n  raw_context.edx = 0xf62f8ec2;\n  raw_context.ecx = 0x46a6a6a8;\n  raw_context.eax = 0x6a5025e2;\n  raw_context.ebp = 0xd9fabb4a;\n  raw_context.eip = 0x6913f540;\n  raw_context.cs = 0xbffe6eda;\n  raw_context.eflags = 0xb2ce1e2d;\n  raw_context.esp = 0x659caaa4;\n  raw_context.ss = 0x2e951ef7;\n  Context context(dump, raw_context);\n  \n  Thread thread(dump, 0xa898f11b, stack, context,\n                0x9e39439f, 0x4abfc15f, 0xe499898a, 0x0d43e939dcfd0372ULL);\n  \n  dump.Add(&stack);\n  dump.Add(&context);\n  dump.Add(&thread);\n  dump.Finish();\n\n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n\n  istringstream minidump_stream(contents);\n  Minidump minidump(minidump_stream);\n  ASSERT_TRUE(minidump.Read());\n  ASSERT_EQ(2U, minidump.GetDirectoryEntryCount());\n\n  MinidumpMemoryList *md_memory_list = minidump.GetMemoryList();\n  ASSERT_TRUE(md_memory_list != NULL);\n  ASSERT_EQ(1U, md_memory_list->region_count());\n\n  MinidumpMemoryRegion *md_region = md_memory_list->GetMemoryRegionAtIndex(0);\n  ASSERT_EQ(0x2326a0faU, md_region->GetBase());\n  ASSERT_EQ(16U, md_region->GetSize());\n  const u_int8_t *region_bytes = md_region->GetMemory();\n  ASSERT_TRUE(memcmp(\"stack for thread\", region_bytes, 16) == 0);\n\n  MinidumpThreadList *thread_list = minidump.GetThreadList();\n  ASSERT_TRUE(thread_list != NULL);\n  ASSERT_EQ(1U, thread_list->thread_count());\n\n  MinidumpThread *md_thread = thread_list->GetThreadAtIndex(0);\n  ASSERT_TRUE(md_thread != NULL);\n  u_int32_t thread_id;\n  ASSERT_TRUE(md_thread->GetThreadID(&thread_id));\n  ASSERT_EQ(0xa898f11bU, thread_id);\n  MinidumpMemoryRegion *md_stack = md_thread->GetMemory();\n  ASSERT_TRUE(md_stack != NULL);\n  ASSERT_EQ(0x2326a0faU, md_stack->GetBase());\n  ASSERT_EQ(16U, md_stack->GetSize());\n  const u_int8_t *md_stack_bytes = md_stack->GetMemory();\n  ASSERT_TRUE(memcmp(\"stack for thread\", md_stack_bytes, 16) == 0);\n\n  MinidumpContext *md_context = md_thread->GetContext();\n  ASSERT_TRUE(md_context != NULL);\n  ASSERT_EQ((u_int32_t) MD_CONTEXT_X86, md_context->GetContextCPU());\n  const MDRawContextX86 *md_raw_context = md_context->GetContextX86();\n  ASSERT_TRUE(md_raw_context != NULL);\n  ASSERT_EQ((u_int32_t) (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL),\n            (md_raw_context->context_flags\n             & (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL)));\n  EXPECT_EQ(0x3ecba80dU, raw_context.edi);\n  EXPECT_EQ(0x382583b9U, raw_context.esi);\n  EXPECT_EQ(0x7fccc03fU, raw_context.ebx);\n  EXPECT_EQ(0xf62f8ec2U, raw_context.edx);\n  EXPECT_EQ(0x46a6a6a8U, raw_context.ecx);\n  EXPECT_EQ(0x6a5025e2U, raw_context.eax);\n  EXPECT_EQ(0xd9fabb4aU, raw_context.ebp);\n  EXPECT_EQ(0x6913f540U, raw_context.eip);\n  EXPECT_EQ(0xbffe6edaU, raw_context.cs);\n  EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags);\n  EXPECT_EQ(0x659caaa4U, raw_context.esp);\n  EXPECT_EQ(0x2e951ef7U, raw_context.ss);\n}\n\nTEST(Dump, OneModule) {\n  static const MDVSFixedFileInfo fixed_file_info = {\n    0xb2fba33a,                           // signature\n    0x33d7a728,                           // struct_version\n    0x31afcb20,                           // file_version_hi\n    0xe51cdab1,                           // file_version_lo\n    0xd1ea6907,                           // product_version_hi\n    0x03032857,                           // product_version_lo\n    0x11bf71d7,                           // file_flags_mask\n    0x5fb8cdbf,                           // file_flags\n    0xe45d0d5d,                           // file_os\n    0x107d9562,                           // file_type\n    0x5a8844d4,                           // file_subtype\n    0xa8d30b20,                           // file_date_hi\n    0x651c3e4e                            // file_date_lo\n  };\n\n  Dump dump(0, kBigEndian);\n  String module_name(dump, \"single module\");\n  Module module(dump, 0xa90206ca83eb2852ULL, 0xada542bd,\n                module_name,\n                0xb1054d2a,\n                0x34571371,\n                fixed_file_info, // from synth_minidump_unittest_data.h\n                NULL, NULL);\n\n  dump.Add(&module);\n  dump.Add(&module_name);\n  dump.Finish();\n  \n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n  istringstream minidump_stream(contents);\n  Minidump minidump(minidump_stream);\n  ASSERT_TRUE(minidump.Read());\n  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());\n\n  const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0);\n  ASSERT_TRUE(dir != NULL);\n  EXPECT_EQ((u_int32_t) MD_MODULE_LIST_STREAM, dir->stream_type);\n\n  MinidumpModuleList *md_module_list = minidump.GetModuleList();\n  ASSERT_TRUE(md_module_list != NULL);\n  ASSERT_EQ(1U, md_module_list->module_count());\n\n  const MinidumpModule *md_module = md_module_list->GetModuleAtIndex(0);\n  ASSERT_TRUE(md_module != NULL);\n  ASSERT_EQ(0xa90206ca83eb2852ULL, md_module->base_address());\n  ASSERT_EQ(0xada542bd, md_module->size());\n  ASSERT_EQ(\"single module\", md_module->code_file());\n\n  const MDRawModule *md_raw_module = md_module->module();\n  ASSERT_TRUE(md_raw_module != NULL);\n  ASSERT_EQ(0xb1054d2aU, md_raw_module->time_date_stamp);\n  ASSERT_EQ(0x34571371U, md_raw_module->checksum);\n  ASSERT_TRUE(memcmp(&md_raw_module->version_info, &fixed_file_info,\n                     sizeof(fixed_file_info)) == 0);\n}\n\nTEST(Dump, OneSystemInfo) {\n  Dump dump(0, kLittleEndian);\n  String csd_version(dump, \"Petulant Pierogi\");\n  SystemInfo system_info(dump, SystemInfo::windows_x86, csd_version);\n\n  dump.Add(&system_info);\n  dump.Add(&csd_version);\n  dump.Finish();\n                         \n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n  istringstream minidump_stream(contents);\n  Minidump minidump(minidump_stream);\n  ASSERT_TRUE(minidump.Read());\n  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());\n\n  const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0);\n  ASSERT_TRUE(dir != NULL);\n  EXPECT_EQ((u_int32_t) MD_SYSTEM_INFO_STREAM, dir->stream_type);\n\n  MinidumpSystemInfo *md_system_info = minidump.GetSystemInfo();\n  ASSERT_TRUE(md_system_info != NULL);\n  ASSERT_EQ(\"windows\", md_system_info->GetOS());\n  ASSERT_EQ(\"x86\", md_system_info->GetCPU());\n  ASSERT_EQ(\"Petulant Pierogi\", *md_system_info->GetCSDVersion());\n  ASSERT_EQ(\"GenuineIntel\", *md_system_info->GetCPUVendor());\n}\n\nTEST(Dump, BigDump) {\n  Dump dump(0, kLittleEndian);\n\n  // A SystemInfo stream.\n  String csd_version(dump, \"Munificent Macaque\");\n  SystemInfo system_info(dump, SystemInfo::windows_x86, csd_version);\n  dump.Add(&csd_version);\n  dump.Add(&system_info);\n\n  // Five threads!\n  Memory stack0(dump, 0x70b9ebfc);\n  stack0.Append(\"stack for thread zero\");\n  MDRawContextX86 raw_context0;\n  raw_context0.context_flags = MD_CONTEXT_X86_INTEGER;\n  raw_context0.eip = 0xaf0709e4;\n  Context context0(dump, raw_context0);\n  Thread thread0(dump, 0xbbef4432, stack0, context0,\n                 0xd0377e7b, 0xdb8eb0cf, 0xd73bc314, 0x09d357bac7f9a163ULL);\n  dump.Add(&stack0);\n  dump.Add(&context0);\n  dump.Add(&thread0);\n\n  Memory stack1(dump, 0xf988cc45);\n  stack1.Append(\"stack for thread one\");\n  MDRawContextX86 raw_context1;\n  raw_context1.context_flags = MD_CONTEXT_X86_INTEGER;\n  raw_context1.eip = 0xe4f56f81;\n  Context context1(dump, raw_context1);\n  Thread thread1(dump, 0x657c3f58, stack1, context1,\n                 0xa68fa182, 0x6f3cf8dd, 0xe3a78ccf, 0x78cc84775e4534bbULL);\n  dump.Add(&stack1);\n  dump.Add(&context1);\n  dump.Add(&thread1);\n\n  Memory stack2(dump, 0xc8a92e7c);\n  stack2.Append(\"stack for thread two\");\n  MDRawContextX86 raw_context2;\n  raw_context2.context_flags = MD_CONTEXT_X86_INTEGER;\n  raw_context2.eip = 0xb336a438;\n  Context context2(dump, raw_context2);\n  Thread thread2(dump, 0xdf4b8a71, stack2, context2,\n                 0x674c26b6, 0x445d7120, 0x7e700c56, 0xd89bf778e7793e17ULL);\n  dump.Add(&stack2);\n  dump.Add(&context2);\n  dump.Add(&thread2);\n\n  Memory stack3(dump, 0x36d08e08);\n  stack3.Append(\"stack for thread three\");\n  MDRawContextX86 raw_context3;\n  raw_context3.context_flags = MD_CONTEXT_X86_INTEGER;\n  raw_context3.eip = 0xdf99a60c;\n  Context context3(dump, raw_context3);\n  Thread thread3(dump, 0x86e6c341, stack3, context3,\n                 0x32dc5c55, 0x17a2aba8, 0xe0cc75e7, 0xa46393994dae83aeULL);\n  dump.Add(&stack3);\n  dump.Add(&context3);\n  dump.Add(&thread3);\n\n  Memory stack4(dump, 0x1e0ab4fa);\n  stack4.Append(\"stack for thread four\");\n  MDRawContextX86 raw_context4;\n  raw_context4.context_flags = MD_CONTEXT_X86_INTEGER;\n  raw_context4.eip = 0xaa646267;\n  Context context4(dump, raw_context4);\n  Thread thread4(dump, 0x261a28d4, stack4, context4,\n                 0x6ebd389e, 0xa0cd4759, 0x30168846, 0x164f650a0cf39d35ULL);\n  dump.Add(&stack4);\n  dump.Add(&context4);\n  dump.Add(&thread4);\n\n  // Three modules!\n  String module1_name(dump, \"module one\");\n  Module module1(dump, 0xeb77da57b5d4cbdaULL, 0x83cd5a37, module1_name);\n  dump.Add(&module1_name);\n  dump.Add(&module1);\n\n  String module2_name(dump, \"module two\");\n  Module module2(dump, 0x8675884adfe5ac90ULL, 0xb11e4ea3, module2_name);\n  dump.Add(&module2_name);\n  dump.Add(&module2);\n\n  String module3_name(dump, \"module three\");\n  Module module3(dump, 0x95fc1544da321b6cULL, 0x7c2bf081, module3_name);\n  dump.Add(&module3_name);\n  dump.Add(&module3);\n\n  // Add one more memory region, on top of the five stacks.\n  Memory memory5(dump, 0x61979e828040e564ULL);\n  memory5.Append(\"contents of memory 5\");\n  dump.Add(&memory5);\n\n  dump.Finish();\n\n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n  istringstream minidump_stream(contents);\n  Minidump minidump(minidump_stream);\n  ASSERT_TRUE(minidump.Read());\n  ASSERT_EQ(4U, minidump.GetDirectoryEntryCount());\n\n  // Check the threads.\n  MinidumpThreadList *thread_list = minidump.GetThreadList();\n  ASSERT_TRUE(thread_list != NULL);\n  ASSERT_EQ(5U, thread_list->thread_count());\n  u_int32_t thread_id;\n  ASSERT_TRUE(thread_list->GetThreadAtIndex(0)->GetThreadID(&thread_id));\n  ASSERT_EQ(0xbbef4432U, thread_id);\n  ASSERT_EQ(0x70b9ebfcU,\n            thread_list->GetThreadAtIndex(0)->GetMemory()->GetBase());\n  ASSERT_EQ(0xaf0709e4U,\n            thread_list->GetThreadAtIndex(0)->GetContext()->GetContextX86()\n            ->eip);\n\n  ASSERT_TRUE(thread_list->GetThreadAtIndex(1)->GetThreadID(&thread_id));\n  ASSERT_EQ(0x657c3f58U, thread_id);\n  ASSERT_EQ(0xf988cc45U,\n            thread_list->GetThreadAtIndex(1)->GetMemory()->GetBase());\n  ASSERT_EQ(0xe4f56f81U,\n            thread_list->GetThreadAtIndex(1)->GetContext()->GetContextX86()\n            ->eip);\n\n  ASSERT_TRUE(thread_list->GetThreadAtIndex(2)->GetThreadID(&thread_id));\n  ASSERT_EQ(0xdf4b8a71U, thread_id);\n  ASSERT_EQ(0xc8a92e7cU,\n            thread_list->GetThreadAtIndex(2)->GetMemory()->GetBase());\n  ASSERT_EQ(0xb336a438U,\n            thread_list->GetThreadAtIndex(2)->GetContext()->GetContextX86()\n            ->eip);\n\n  ASSERT_TRUE(thread_list->GetThreadAtIndex(3)->GetThreadID(&thread_id));\n  ASSERT_EQ(0x86e6c341U, thread_id);\n  ASSERT_EQ(0x36d08e08U,\n            thread_list->GetThreadAtIndex(3)->GetMemory()->GetBase());\n  ASSERT_EQ(0xdf99a60cU,\n            thread_list->GetThreadAtIndex(3)->GetContext()->GetContextX86()\n            ->eip);\n\n  ASSERT_TRUE(thread_list->GetThreadAtIndex(4)->GetThreadID(&thread_id));\n  ASSERT_EQ(0x261a28d4U, thread_id);\n  ASSERT_EQ(0x1e0ab4faU,\n            thread_list->GetThreadAtIndex(4)->GetMemory()->GetBase());\n  ASSERT_EQ(0xaa646267U,\n            thread_list->GetThreadAtIndex(4)->GetContext()->GetContextX86()\n            ->eip);\n\n  // Check the modules.\n  MinidumpModuleList *md_module_list = minidump.GetModuleList();\n  ASSERT_TRUE(md_module_list != NULL);\n  ASSERT_EQ(3U, md_module_list->module_count());\n  EXPECT_EQ(0xeb77da57b5d4cbdaULL,\n            md_module_list->GetModuleAtIndex(0)->base_address());\n  EXPECT_EQ(0x8675884adfe5ac90ULL,\n            md_module_list->GetModuleAtIndex(1)->base_address());\n  EXPECT_EQ(0x95fc1544da321b6cULL,\n            md_module_list->GetModuleAtIndex(2)->base_address());\n}\n\nTEST(Dump, OneMemoryInfo) {\n  Dump dump(0, kBigEndian);\n  Stream stream(dump, MD_MEMORY_INFO_LIST_STREAM);\n\n  // Add the MDRawMemoryInfoList header.\n  const u_int64_t kNumberOfEntries = 1;\n  stream.D32(sizeof(MDRawMemoryInfoList))  // size_of_header\n        .D32(sizeof(MDRawMemoryInfo))      // size_of_entry\n        .D64(kNumberOfEntries);            // number_of_entries\n\n  \n  // Now add a MDRawMemoryInfo entry.\n  const u_int64_t kBaseAddress = 0x1000;\n  const u_int64_t kRegionSize = 0x2000;\n  stream.D64(kBaseAddress)                         // base_address\n        .D64(kBaseAddress)                         // allocation_base\n        .D32(MD_MEMORY_PROTECT_EXECUTE_READWRITE)  // allocation_protection\n        .D32(0)                                    // __alignment1\n        .D64(kRegionSize)                          // region_size\n        .D32(MD_MEMORY_STATE_COMMIT)               // state\n        .D32(MD_MEMORY_PROTECT_EXECUTE_READWRITE)  // protection\n        .D32(MD_MEMORY_TYPE_PRIVATE)               // type\n        .D32(0);                                   // __alignment2\n\n  dump.Add(&stream);\n  dump.Finish();\n\n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n  istringstream minidump_stream(contents);\n  Minidump minidump(minidump_stream);\n  ASSERT_TRUE(minidump.Read());\n  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());\n\n  const MDRawDirectory *dir = minidump.GetDirectoryEntryAtIndex(0);\n  ASSERT_TRUE(dir != NULL);\n  EXPECT_EQ((u_int32_t) MD_MEMORY_INFO_LIST_STREAM, dir->stream_type);\n\n  MinidumpMemoryInfoList *info_list = minidump.GetMemoryInfoList();\n  ASSERT_TRUE(info_list != NULL);\n  ASSERT_EQ(1U, info_list->info_count());\n\n  const MinidumpMemoryInfo *info1 = info_list->GetMemoryInfoAtIndex(0);\n  ASSERT_EQ(kBaseAddress, info1->GetBase());\n  ASSERT_EQ(kRegionSize, info1->GetSize());\n  ASSERT_TRUE(info1->IsExecutable());\n  ASSERT_TRUE(info1->IsWritable());\n\n  // Should get back the same memory region here.\n  const MinidumpMemoryInfo *info2 =\n      info_list->GetMemoryInfoForAddress(kBaseAddress + kRegionSize / 2);\n  ASSERT_EQ(kBaseAddress, info2->GetBase());\n  ASSERT_EQ(kRegionSize, info2->GetSize());\n}\n\nTEST(Dump, OneExceptionX86) {\n  Dump dump(0, kLittleEndian);\n\n  MDRawContextX86 raw_context;\n  raw_context.context_flags = MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL;\n  raw_context.edi = 0x3ecba80d;\n  raw_context.esi = 0x382583b9;\n  raw_context.ebx = 0x7fccc03f;\n  raw_context.edx = 0xf62f8ec2;\n  raw_context.ecx = 0x46a6a6a8;\n  raw_context.eax = 0x6a5025e2;\n  raw_context.ebp = 0xd9fabb4a;\n  raw_context.eip = 0x6913f540;\n  raw_context.cs = 0xbffe6eda;\n  raw_context.eflags = 0xb2ce1e2d;\n  raw_context.esp = 0x659caaa4;\n  raw_context.ss = 0x2e951ef7;\n  Context context(dump, raw_context);\n\n  Exception exception(dump, context,\n                      0x1234abcd, // thread id\n                      0xdcba4321, // exception code\n                      0xf0e0d0c0, // exception flags\n                      0x0919a9b9c9d9e9f9ULL); // exception address\n  \n  dump.Add(&context);\n  dump.Add(&exception);\n  dump.Finish();\n\n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n\n  istringstream minidump_stream(contents);\n  Minidump minidump(minidump_stream);\n  ASSERT_TRUE(minidump.Read());\n  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());\n\n  MinidumpException *md_exception = minidump.GetException();\n  ASSERT_TRUE(md_exception != NULL);\n\n  u_int32_t thread_id;\n  ASSERT_TRUE(md_exception->GetThreadID(&thread_id));\n  ASSERT_EQ(0x1234abcd, thread_id);\n\n  const MDRawExceptionStream* raw_exception = md_exception->exception();\n  ASSERT_TRUE(raw_exception != NULL);\n  EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code);\n  EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags);\n  EXPECT_EQ(0x0919a9b9c9d9e9f9ULL,\n            raw_exception->exception_record.exception_address);\n\n  MinidumpContext *md_context = md_exception->GetContext();\n  ASSERT_TRUE(md_context != NULL);\n  ASSERT_EQ((u_int32_t) MD_CONTEXT_X86, md_context->GetContextCPU());\n  const MDRawContextX86 *md_raw_context = md_context->GetContextX86();\n  ASSERT_TRUE(md_raw_context != NULL);\n  ASSERT_EQ((u_int32_t) (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL),\n            (md_raw_context->context_flags\n             & (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL)));\n  EXPECT_EQ(0x3ecba80dU, raw_context.edi);\n  EXPECT_EQ(0x382583b9U, raw_context.esi);\n  EXPECT_EQ(0x7fccc03fU, raw_context.ebx);\n  EXPECT_EQ(0xf62f8ec2U, raw_context.edx);\n  EXPECT_EQ(0x46a6a6a8U, raw_context.ecx);\n  EXPECT_EQ(0x6a5025e2U, raw_context.eax);\n  EXPECT_EQ(0xd9fabb4aU, raw_context.ebp);\n  EXPECT_EQ(0x6913f540U, raw_context.eip);\n  EXPECT_EQ(0xbffe6edaU, raw_context.cs);\n  EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags);\n  EXPECT_EQ(0x659caaa4U, raw_context.esp);\n  EXPECT_EQ(0x2e951ef7U, raw_context.ss);\n}\n\nTEST(Dump, OneExceptionX86XState) {\n  Dump dump(0, kLittleEndian);\n\n  MDRawContextX86 raw_context;\n  raw_context.context_flags = MD_CONTEXT_X86_INTEGER |\n    MD_CONTEXT_X86_CONTROL | MD_CONTEXT_X86_XSTATE;\n  raw_context.edi = 0x3ecba80d;\n  raw_context.esi = 0x382583b9;\n  raw_context.ebx = 0x7fccc03f;\n  raw_context.edx = 0xf62f8ec2;\n  raw_context.ecx = 0x46a6a6a8;\n  raw_context.eax = 0x6a5025e2;\n  raw_context.ebp = 0xd9fabb4a;\n  raw_context.eip = 0x6913f540;\n  raw_context.cs = 0xbffe6eda;\n  raw_context.eflags = 0xb2ce1e2d;\n  raw_context.esp = 0x659caaa4;\n  raw_context.ss = 0x2e951ef7;\n  Context context(dump, raw_context);\n\n  Exception exception(dump, context,\n                      0x1234abcd, // thread id\n                      0xdcba4321, // exception code\n                      0xf0e0d0c0, // exception flags\n                      0x0919a9b9c9d9e9f9ULL); // exception address\n  \n  dump.Add(&context);\n  dump.Add(&exception);\n  dump.Finish();\n\n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n\n  istringstream minidump_stream(contents);\n  Minidump minidump(minidump_stream);\n  ASSERT_TRUE(minidump.Read());\n  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());\n\n  MinidumpException *md_exception = minidump.GetException();\n  ASSERT_TRUE(md_exception != NULL);\n\n  u_int32_t thread_id;\n  ASSERT_TRUE(md_exception->GetThreadID(&thread_id));\n  ASSERT_EQ(0x1234abcd, thread_id);\n\n  const MDRawExceptionStream* raw_exception = md_exception->exception();\n  ASSERT_TRUE(raw_exception != NULL);\n  EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code);\n  EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags);\n  EXPECT_EQ(0x0919a9b9c9d9e9f9ULL,\n            raw_exception->exception_record.exception_address);\n\n  MinidumpContext *md_context = md_exception->GetContext();\n  ASSERT_TRUE(md_context != NULL);\n  ASSERT_EQ((u_int32_t) MD_CONTEXT_X86, md_context->GetContextCPU());\n  const MDRawContextX86 *md_raw_context = md_context->GetContextX86();\n  ASSERT_TRUE(md_raw_context != NULL);\n  ASSERT_EQ((u_int32_t) (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL),\n            (md_raw_context->context_flags\n             & (MD_CONTEXT_X86_INTEGER | MD_CONTEXT_X86_CONTROL)));\n  EXPECT_EQ(0x3ecba80dU, raw_context.edi);\n  EXPECT_EQ(0x382583b9U, raw_context.esi);\n  EXPECT_EQ(0x7fccc03fU, raw_context.ebx);\n  EXPECT_EQ(0xf62f8ec2U, raw_context.edx);\n  EXPECT_EQ(0x46a6a6a8U, raw_context.ecx);\n  EXPECT_EQ(0x6a5025e2U, raw_context.eax);\n  EXPECT_EQ(0xd9fabb4aU, raw_context.ebp);\n  EXPECT_EQ(0x6913f540U, raw_context.eip);\n  EXPECT_EQ(0xbffe6edaU, raw_context.cs);\n  EXPECT_EQ(0xb2ce1e2dU, raw_context.eflags);\n  EXPECT_EQ(0x659caaa4U, raw_context.esp);\n  EXPECT_EQ(0x2e951ef7U, raw_context.ss);\n}\n\nTEST(Dump, OneExceptionARM) {\n  Dump dump(0, kLittleEndian);\n\n  MDRawContextARM raw_context;\n  raw_context.context_flags = MD_CONTEXT_ARM_INTEGER;\n  raw_context.iregs[0] = 0x3ecba80d;\n  raw_context.iregs[1] = 0x382583b9;\n  raw_context.iregs[2] = 0x7fccc03f;\n  raw_context.iregs[3] = 0xf62f8ec2;\n  raw_context.iregs[4] = 0x46a6a6a8;\n  raw_context.iregs[5] = 0x6a5025e2;\n  raw_context.iregs[6] = 0xd9fabb4a;\n  raw_context.iregs[7] = 0x6913f540;\n  raw_context.iregs[8] = 0xbffe6eda;\n  raw_context.iregs[9] = 0xb2ce1e2d;\n  raw_context.iregs[10] = 0x659caaa4;\n  raw_context.iregs[11] = 0xf0e0d0c0;\n  raw_context.iregs[12] = 0xa9b8c7d6;\n  raw_context.iregs[13] = 0x12345678;\n  raw_context.iregs[14] = 0xabcd1234;\n  raw_context.iregs[15] = 0x10203040;\n  raw_context.cpsr = 0x2e951ef7;\n  Context context(dump, raw_context);\n\n  Exception exception(dump, context,\n                      0x1234abcd, // thread id\n                      0xdcba4321, // exception code\n                      0xf0e0d0c0, // exception flags\n                      0x0919a9b9c9d9e9f9ULL); // exception address\n  \n  dump.Add(&context);\n  dump.Add(&exception);\n  dump.Finish();\n\n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n\n  istringstream minidump_stream(contents);\n  Minidump minidump(minidump_stream);\n  ASSERT_TRUE(minidump.Read());\n  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());\n\n  MinidumpException *md_exception = minidump.GetException();\n  ASSERT_TRUE(md_exception != NULL);\n\n  u_int32_t thread_id;\n  ASSERT_TRUE(md_exception->GetThreadID(&thread_id));\n  ASSERT_EQ(0x1234abcd, thread_id);\n\n  const MDRawExceptionStream* raw_exception = md_exception->exception();\n  ASSERT_TRUE(raw_exception != NULL);\n  EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code);\n  EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags);\n  EXPECT_EQ(0x0919a9b9c9d9e9f9ULL,\n            raw_exception->exception_record.exception_address);\n\n  MinidumpContext *md_context = md_exception->GetContext();\n  ASSERT_TRUE(md_context != NULL);\n  ASSERT_EQ((u_int32_t) MD_CONTEXT_ARM, md_context->GetContextCPU());\n  const MDRawContextARM *md_raw_context = md_context->GetContextARM();\n  ASSERT_TRUE(md_raw_context != NULL);\n  ASSERT_EQ((u_int32_t) MD_CONTEXT_ARM_INTEGER,\n            (md_raw_context->context_flags\n             & MD_CONTEXT_ARM_INTEGER));\n  EXPECT_EQ(0x3ecba80dU, raw_context.iregs[0]);\n  EXPECT_EQ(0x382583b9U, raw_context.iregs[1]);\n  EXPECT_EQ(0x7fccc03fU, raw_context.iregs[2]);\n  EXPECT_EQ(0xf62f8ec2U, raw_context.iregs[3]);\n  EXPECT_EQ(0x46a6a6a8U, raw_context.iregs[4]);\n  EXPECT_EQ(0x6a5025e2U, raw_context.iregs[5]);\n  EXPECT_EQ(0xd9fabb4aU, raw_context.iregs[6]);\n  EXPECT_EQ(0x6913f540U, raw_context.iregs[7]);\n  EXPECT_EQ(0xbffe6edaU, raw_context.iregs[8]);\n  EXPECT_EQ(0xb2ce1e2dU, raw_context.iregs[9]);\n  EXPECT_EQ(0x659caaa4U, raw_context.iregs[10]);\n  EXPECT_EQ(0xf0e0d0c0U, raw_context.iregs[11]);\n  EXPECT_EQ(0xa9b8c7d6U, raw_context.iregs[12]);\n  EXPECT_EQ(0x12345678U, raw_context.iregs[13]);\n  EXPECT_EQ(0xabcd1234U, raw_context.iregs[14]);\n  EXPECT_EQ(0x10203040U, raw_context.iregs[15]);\n  EXPECT_EQ(0x2e951ef7U, raw_context.cpsr);\n}\n\nTEST(Dump, OneExceptionARMOldFlags) {\n  Dump dump(0, kLittleEndian);\n\n  MDRawContextARM raw_context;\n  // MD_CONTEXT_ARM_INTEGER, but with _OLD\n  raw_context.context_flags = MD_CONTEXT_ARM_OLD | 0x00000002;\n  raw_context.iregs[0] = 0x3ecba80d;\n  raw_context.iregs[1] = 0x382583b9;\n  raw_context.iregs[2] = 0x7fccc03f;\n  raw_context.iregs[3] = 0xf62f8ec2;\n  raw_context.iregs[4] = 0x46a6a6a8;\n  raw_context.iregs[5] = 0x6a5025e2;\n  raw_context.iregs[6] = 0xd9fabb4a;\n  raw_context.iregs[7] = 0x6913f540;\n  raw_context.iregs[8] = 0xbffe6eda;\n  raw_context.iregs[9] = 0xb2ce1e2d;\n  raw_context.iregs[10] = 0x659caaa4;\n  raw_context.iregs[11] = 0xf0e0d0c0;\n  raw_context.iregs[12] = 0xa9b8c7d6;\n  raw_context.iregs[13] = 0x12345678;\n  raw_context.iregs[14] = 0xabcd1234;\n  raw_context.iregs[15] = 0x10203040;\n  raw_context.cpsr = 0x2e951ef7;\n  Context context(dump, raw_context);\n\n  Exception exception(dump, context,\n                      0x1234abcd, // thread id\n                      0xdcba4321, // exception code\n                      0xf0e0d0c0, // exception flags\n                      0x0919a9b9c9d9e9f9ULL); // exception address\n  \n  dump.Add(&context);\n  dump.Add(&exception);\n  dump.Finish();\n\n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n\n  istringstream minidump_stream(contents);\n  Minidump minidump(minidump_stream);\n  ASSERT_TRUE(minidump.Read());\n  ASSERT_EQ(1U, minidump.GetDirectoryEntryCount());\n\n  MinidumpException *md_exception = minidump.GetException();\n  ASSERT_TRUE(md_exception != NULL);\n\n  u_int32_t thread_id;\n  ASSERT_TRUE(md_exception->GetThreadID(&thread_id));\n  ASSERT_EQ(0x1234abcd, thread_id);\n\n  const MDRawExceptionStream* raw_exception = md_exception->exception();\n  ASSERT_TRUE(raw_exception != NULL);\n  EXPECT_EQ(0xdcba4321, raw_exception->exception_record.exception_code);\n  EXPECT_EQ(0xf0e0d0c0, raw_exception->exception_record.exception_flags);\n  EXPECT_EQ(0x0919a9b9c9d9e9f9ULL,\n            raw_exception->exception_record.exception_address);\n\n  MinidumpContext *md_context = md_exception->GetContext();\n  ASSERT_TRUE(md_context != NULL);\n  ASSERT_EQ((u_int32_t) MD_CONTEXT_ARM, md_context->GetContextCPU());\n  const MDRawContextARM *md_raw_context = md_context->GetContextARM();\n  ASSERT_TRUE(md_raw_context != NULL);\n  ASSERT_EQ((u_int32_t) MD_CONTEXT_ARM_INTEGER,\n            (md_raw_context->context_flags\n             & MD_CONTEXT_ARM_INTEGER));\n  EXPECT_EQ(0x3ecba80dU, raw_context.iregs[0]);\n  EXPECT_EQ(0x382583b9U, raw_context.iregs[1]);\n  EXPECT_EQ(0x7fccc03fU, raw_context.iregs[2]);\n  EXPECT_EQ(0xf62f8ec2U, raw_context.iregs[3]);\n  EXPECT_EQ(0x46a6a6a8U, raw_context.iregs[4]);\n  EXPECT_EQ(0x6a5025e2U, raw_context.iregs[5]);\n  EXPECT_EQ(0xd9fabb4aU, raw_context.iregs[6]);\n  EXPECT_EQ(0x6913f540U, raw_context.iregs[7]);\n  EXPECT_EQ(0xbffe6edaU, raw_context.iregs[8]);\n  EXPECT_EQ(0xb2ce1e2dU, raw_context.iregs[9]);\n  EXPECT_EQ(0x659caaa4U, raw_context.iregs[10]);\n  EXPECT_EQ(0xf0e0d0c0U, raw_context.iregs[11]);\n  EXPECT_EQ(0xa9b8c7d6U, raw_context.iregs[12]);\n  EXPECT_EQ(0x12345678U, raw_context.iregs[13]);\n  EXPECT_EQ(0xabcd1234U, raw_context.iregs[14]);\n  EXPECT_EQ(0x10203040U, raw_context.iregs[15]);\n  EXPECT_EQ(0x2e951ef7U, raw_context.cpsr);\n}\n\n}  // namespace\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/module_comparer.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// module_comparer.cc: ModuleComparer implementation.\n// See module_comparer.h for documentation.\n//\n// Author: lambxsy@google.com (Siyang Xie)\n\n#include \"processor/module_comparer.h\"\n\n#include <map>\n#include <string>\n\n#include \"processor/basic_code_module.h\"\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n\n#define ASSERT_TRUE(condition) \\\n  if (!(condition)) { \\\n    BPLOG(ERROR) << \"FAIL: \" << #condition << \" @ \" \\\n                 << __FILE__ << \":\" << __LINE__; \\\n    return false; \\\n  }\n\n#define ASSERT_FALSE(condition) ASSERT_TRUE(!(condition))\n\nnamespace google_breakpad {\n\nbool ModuleComparer::Compare(const string &symbol_data) {\n  scoped_ptr<BasicModule> basic_module(new BasicModule(\"test_module\"));\n  scoped_ptr<FastModule> fast_module(new FastModule(\"test_module\"));\n\n  // Load symbol data into basic_module\n  scoped_array<char> buffer(new char[symbol_data.size() + 1]);\n  strcpy(buffer.get(), symbol_data.c_str());\n  ASSERT_TRUE(basic_module->LoadMapFromMemory(buffer.get()));\n  buffer.reset();\n\n  // Serialize BasicSourceLineResolver::Module.\n  unsigned int serialized_size = 0;\n  scoped_array<char> serialized_data(\n      serializer_.Serialize(*(basic_module.get()), &serialized_size));\n  ASSERT_TRUE(serialized_data.get());\n  BPLOG(INFO) << \"Serialized size = \" << serialized_size << \" Bytes\";\n\n  // Load FastSourceLineResolver::Module using serialized data.\n  ASSERT_TRUE(fast_module->LoadMapFromMemory(serialized_data.get()));\n\n  // Compare FastSourceLineResolver::Module with\n  // BasicSourceLineResolver::Module.\n  ASSERT_TRUE(CompareModule(basic_module.get(), fast_module.get()));\n\n  return true;\n}\n\n// Traversal the content of module and do comparison\nbool ModuleComparer::CompareModule(const BasicModule *basic_module,\n                                  const FastModule *fast_module) const {\n  // Compare name_.\n  ASSERT_TRUE(basic_module->name_ == fast_module->name_);\n\n  // Compare files_:\n  {\n    BasicModule::FileMap::const_iterator iter1 = basic_module->files_.begin();\n    FastModule::FileMap::iterator iter2 = fast_module->files_.begin();\n    while (iter1 != basic_module->files_.end()\n        && iter2 != fast_module->files_.end()) {\n      ASSERT_TRUE(iter1->first == iter2.GetKey());\n      string tmp(iter2.GetValuePtr());\n      ASSERT_TRUE(iter1->second == tmp);\n      ++iter1;\n      ++iter2;\n    }\n    ASSERT_TRUE(iter1 == basic_module->files_.end());\n    ASSERT_TRUE(iter2 == fast_module->files_.end());\n  }\n\n  // Compare functions_:\n  {\n    RangeMap<MemAddr, linked_ptr<BasicFunc> >::MapConstIterator iter1;\n    StaticRangeMap<MemAddr, FastFunc>::MapConstIterator iter2;\n    iter1 = basic_module->functions_.map_.begin();\n    iter2 = fast_module->functions_.map_.begin();\n    while (iter1 != basic_module->functions_.map_.end()\n        && iter2 != fast_module->functions_.map_.end()) {\n      ASSERT_TRUE(iter1->first == iter2.GetKey());\n      ASSERT_TRUE(iter1->second.base() == iter2.GetValuePtr()->base());\n      ASSERT_TRUE(CompareFunction(\n          iter1->second.entry().get(), iter2.GetValuePtr()->entryptr()));\n      ++iter1;\n      ++iter2;\n    }\n    ASSERT_TRUE(iter1 == basic_module->functions_.map_.end());\n    ASSERT_TRUE(iter2 == fast_module->functions_.map_.end());\n  }\n\n  // Compare public_symbols_:\n  {\n    AddressMap<MemAddr, linked_ptr<BasicPubSymbol> >::MapConstIterator iter1;\n    StaticAddressMap<MemAddr, FastPubSymbol>::MapConstIterator iter2;\n    iter1 = basic_module->public_symbols_.map_.begin();\n    iter2 = fast_module->public_symbols_.map_.begin();\n    while (iter1 != basic_module->public_symbols_.map_.end()\n          && iter2 != fast_module->public_symbols_.map_.end()) {\n      ASSERT_TRUE(iter1->first == iter2.GetKey());\n      ASSERT_TRUE(ComparePubSymbol(\n          iter1->second.get(), iter2.GetValuePtr()));\n      ++iter1;\n      ++iter2;\n    }\n    ASSERT_TRUE(iter1 == basic_module->public_symbols_.map_.end());\n    ASSERT_TRUE(iter2 == fast_module->public_symbols_.map_.end());\n  }\n\n  // Compare windows_frame_info_[]:\n  for (int i = 0; i < WindowsFrameInfo::STACK_INFO_LAST; ++i) {\n    ASSERT_TRUE(CompareCRM(&(basic_module->windows_frame_info_[i]),\n                           &(fast_module->windows_frame_info_[i])));\n  }\n\n  // Compare cfi_initial_rules_:\n  {\n    RangeMap<MemAddr, string>::MapConstIterator iter1;\n    StaticRangeMap<MemAddr, char>::MapConstIterator iter2;\n    iter1 = basic_module->cfi_initial_rules_.map_.begin();\n    iter2 = fast_module->cfi_initial_rules_.map_.begin();\n    while (iter1 != basic_module->cfi_initial_rules_.map_.end()\n        && iter2 != fast_module->cfi_initial_rules_.map_.end()) {\n      ASSERT_TRUE(iter1->first == iter2.GetKey());\n      ASSERT_TRUE(iter1->second.base() == iter2.GetValuePtr()->base());\n      string tmp(iter2.GetValuePtr()->entryptr());\n      ASSERT_TRUE(iter1->second.entry() == tmp);\n      ++iter1;\n      ++iter2;\n    }\n    ASSERT_TRUE(iter1 == basic_module->cfi_initial_rules_.map_.end());\n    ASSERT_TRUE(iter2 == fast_module->cfi_initial_rules_.map_.end());\n  }\n\n  // Compare cfi_delta_rules_:\n  {\n    map<MemAddr, string>::const_iterator iter1;\n    StaticMap<MemAddr, char>::iterator iter2;\n    iter1 = basic_module->cfi_delta_rules_.begin();\n    iter2 = fast_module->cfi_delta_rules_.begin();\n    while (iter1 != basic_module->cfi_delta_rules_.end()\n        && iter2 != fast_module->cfi_delta_rules_.end()) {\n      ASSERT_TRUE(iter1->first == iter2.GetKey());\n      string tmp(iter2.GetValuePtr());\n      ASSERT_TRUE(iter1->second == tmp);\n      ++iter1;\n      ++iter2;\n    }\n    ASSERT_TRUE(iter1 == basic_module->cfi_delta_rules_.end());\n    ASSERT_TRUE(iter2 == fast_module->cfi_delta_rules_.end());\n  }\n\n  return true;\n}\n\nbool ModuleComparer::CompareFunction(const BasicFunc *basic_func,\n                                    const FastFunc *fast_func_raw) const {\n  FastFunc* fast_func = new FastFunc();\n  fast_func->CopyFrom(fast_func_raw);\n  ASSERT_TRUE(basic_func->name == fast_func->name);\n  ASSERT_TRUE(basic_func->address == fast_func->address);\n  ASSERT_TRUE(basic_func->size == fast_func->size);\n\n  // compare range map of lines:\n  RangeMap<MemAddr, linked_ptr<BasicLine> >::MapConstIterator iter1;\n  StaticRangeMap<MemAddr, FastLine>::MapConstIterator iter2;\n  iter1 = basic_func->lines.map_.begin();\n  iter2 = fast_func->lines.map_.begin();\n  while (iter1 != basic_func->lines.map_.end()\n      && iter2 != fast_func->lines.map_.end()) {\n    ASSERT_TRUE(iter1->first == iter2.GetKey());\n    ASSERT_TRUE(iter1->second.base() == iter2.GetValuePtr()->base());\n    ASSERT_TRUE(CompareLine(iter1->second.entry().get(),\n                            iter2.GetValuePtr()->entryptr()));\n    ++iter1;\n    ++iter2;\n  }\n  ASSERT_TRUE(iter1 == basic_func->lines.map_.end());\n  ASSERT_TRUE(iter2 == fast_func->lines.map_.end());\n\n  delete fast_func;\n  return true;\n}\n\nbool ModuleComparer::CompareLine(const BasicLine *basic_line,\n                                const FastLine *fast_line_raw) const {\n  FastLine *fast_line = new FastLine;\n  fast_line->CopyFrom(fast_line_raw);\n\n  ASSERT_TRUE(basic_line->address == fast_line->address);\n  ASSERT_TRUE(basic_line->size == fast_line->size);\n  ASSERT_TRUE(basic_line->source_file_id == fast_line->source_file_id);\n  ASSERT_TRUE(basic_line->line == fast_line->line);\n\n  delete fast_line;\n  return true;\n}\n\nbool ModuleComparer::ComparePubSymbol(const BasicPubSymbol* basic_ps,\n                                     const FastPubSymbol* fastps_raw) const {\n  FastPubSymbol *fast_ps = new FastPubSymbol;\n  fast_ps->CopyFrom(fastps_raw);\n  ASSERT_TRUE(basic_ps->name == fast_ps->name);\n  ASSERT_TRUE(basic_ps->address == fast_ps->address);\n  ASSERT_TRUE(basic_ps->parameter_size == fast_ps->parameter_size);\n  delete fast_ps;\n  return true;\n}\n\nbool ModuleComparer::CompareWFI(const WindowsFrameInfo& wfi1,\n                               const WindowsFrameInfo& wfi2) const {\n  ASSERT_TRUE(wfi1.type_ == wfi2.type_);\n  ASSERT_TRUE(wfi1.valid == wfi2.valid);\n  ASSERT_TRUE(wfi1.prolog_size == wfi2.prolog_size);\n  ASSERT_TRUE(wfi1.epilog_size == wfi2.epilog_size);\n  ASSERT_TRUE(wfi1.parameter_size == wfi2.parameter_size);\n  ASSERT_TRUE(wfi1.saved_register_size == wfi2.saved_register_size);\n  ASSERT_TRUE(wfi1.local_size == wfi2.local_size);\n  ASSERT_TRUE(wfi1.max_stack_size == wfi2.max_stack_size);\n  ASSERT_TRUE(wfi1.allocates_base_pointer == wfi2.allocates_base_pointer);\n  ASSERT_TRUE(wfi1.program_string == wfi2.program_string);\n  return true;\n}\n\n// Compare ContainedRangeMap\nbool ModuleComparer::CompareCRM(\n    const ContainedRangeMap<MemAddr, linked_ptr<WFI> >* basic_crm,\n    const StaticContainedRangeMap<MemAddr, char>* fast_crm) const {\n  ASSERT_TRUE(basic_crm->base_ == fast_crm->base_);\n\n  if (!basic_crm->entry_.get() || !fast_crm->entry_ptr_) {\n    // empty entry:\n    ASSERT_TRUE(!basic_crm->entry_.get() && !fast_crm->entry_ptr_);\n  } else {\n    WFI newwfi;\n    newwfi.CopyFrom(fast_resolver_->CopyWFI(fast_crm->entry_ptr_));\n    ASSERT_TRUE(CompareWFI(*(basic_crm->entry_.get()), newwfi));\n  }\n\n  if ((!basic_crm->map_ || basic_crm->map_->empty())\n      || fast_crm->map_.empty()) {\n    ASSERT_TRUE((!basic_crm->map_ || basic_crm->map_->empty())\n               && fast_crm->map_.empty());\n  } else {\n    ContainedRangeMap<MemAddr, linked_ptr<WFI> >::MapConstIterator iter1;\n    StaticContainedRangeMap<MemAddr, char>::MapConstIterator iter2;\n    iter1 = basic_crm->map_->begin();\n    iter2 = fast_crm->map_.begin();\n    while (iter1 != basic_crm->map_->end()\n        && iter2 != fast_crm->map_.end()) {\n      ASSERT_TRUE(iter1->first == iter2.GetKey());\n      StaticContainedRangeMap<MemAddr, char> *child =\n          new StaticContainedRangeMap<MemAddr, char>(\n              reinterpret_cast<const char*>(iter2.GetValuePtr()));\n      ASSERT_TRUE(CompareCRM(iter1->second, child));\n      delete child;\n      ++iter1;\n      ++iter2;\n    }\n    ASSERT_TRUE(iter1 == basic_crm->map_->end());\n    ASSERT_TRUE(iter2 == fast_crm->map_.end());\n  }\n\n  return true;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/module_comparer.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// module_comparer.h: ModuleComparer reads a string format of symbol file, and\n// loads the symbol into both BasicSourceLineResolver::Module and\n// FastSourceLineResolve::Module.  It then traverses both Modules and compare\n// the content of data to verify the correctness of new fast module.\n// ModuleCompare class is a tool to verify correctness of a loaded\n// FastSourceLineResolver::Module instance, i.e., in-memory representation of\n// parsed symbol.  ModuleComparer class should be used for testing purpose only,\n// e.g., in fast_source_line_resolver_unittest.\n//\n// Author: lambxsy@google.com (Siyang Xie)\n\n#ifndef PROCESSOR_MODULE_COMPARER_H__\n#define PROCESSOR_MODULE_COMPARER_H__\n\n#include <string>\n\n#include \"processor/basic_source_line_resolver_types.h\"\n#include \"processor/fast_source_line_resolver_types.h\"\n#include \"processor/module_serializer.h\"\n#include \"processor/windows_frame_info.h\"\n\nnamespace google_breakpad {\n\nclass ModuleComparer {\n public:\n  ModuleComparer(): fast_resolver_(new FastSourceLineResolver),\n                   basic_resolver_(new BasicSourceLineResolver) { }\n  ~ModuleComparer() {\n    delete fast_resolver_;\n    delete basic_resolver_;\n  }\n\n  // BasicSourceLineResolver loads its module using the symbol data,\n  // ModuleSerializer serialize the loaded module into a memory chunk,\n  // FastSourceLineResolver loads its module using the serialized memory chunk,\n  // Then, traverse both modules together and compare underlying data\n  // return true if both modules contain exactly same data.\n  bool Compare(const string &symbol_data);\n\n private:\n  typedef BasicSourceLineResolver::Module BasicModule;\n  typedef FastSourceLineResolver::Module FastModule;\n  typedef BasicSourceLineResolver::Function BasicFunc;\n  typedef FastSourceLineResolver::Function FastFunc;\n  typedef BasicSourceLineResolver::Line BasicLine;\n  typedef FastSourceLineResolver::Line FastLine;\n  typedef BasicSourceLineResolver::PublicSymbol BasicPubSymbol;\n  typedef FastSourceLineResolver::PublicSymbol FastPubSymbol;\n  typedef WindowsFrameInfo WFI;\n\n  bool CompareModule(const BasicModule *oldmodule,\n                     const FastModule *newmodule) const;\n  bool CompareFunction(const BasicFunc *oldfunc, const FastFunc *newfunc) const;\n  bool CompareLine(const BasicLine *oldline, const FastLine *newline) const;\n  bool ComparePubSymbol(const BasicPubSymbol*, const FastPubSymbol*) const;\n  bool CompareWFI(const WindowsFrameInfo&, const WindowsFrameInfo&) const;\n\n  // Compare ContainedRangeMap\n  bool CompareCRM(const ContainedRangeMap<MemAddr, linked_ptr<WFI> >*,\n                  const StaticContainedRangeMap<MemAddr, char>*) const;\n\n  FastSourceLineResolver *fast_resolver_;\n  BasicSourceLineResolver *basic_resolver_;\n  ModuleSerializer serializer_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_MODULE_COMPARER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/module_factory.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// module_factory.h: ModuleFactory a factory that provides\n// an interface for creating a Module and deferring instantiation to subclasses\n// BasicModuleFactory and FastModuleFactory.\n\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef PROCESSOR_MODULE_FACTORY_H__\n#define PROCESSOR_MODULE_FACTORY_H__\n\n#include \"processor/basic_source_line_resolver_types.h\"\n#include \"processor/fast_source_line_resolver_types.h\"\n#include \"processor/source_line_resolver_base_types.h\"\n\nnamespace google_breakpad {\n\nclass ModuleFactory {\n public:\n  virtual ~ModuleFactory() { };\n  virtual SourceLineResolverBase::Module* CreateModule(\n      const string &name) const = 0;\n};\n\nclass BasicModuleFactory : public ModuleFactory {\n public:\n  virtual ~BasicModuleFactory() { }\n  virtual BasicSourceLineResolver::Module* CreateModule(\n      const string &name) const {\n    return new BasicSourceLineResolver::Module(name);\n  }\n};\n\nclass FastModuleFactory : public ModuleFactory {\n public:\n  virtual ~FastModuleFactory() { }\n  virtual FastSourceLineResolver::Module* CreateModule(\n      const string &name) const {\n    return new FastSourceLineResolver::Module(name);\n  }\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_MODULE_FACTORY_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/module_serializer.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// module_serializer.cc: ModuleSerializer implementation.\n//\n// See module_serializer.h for documentation.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#include \"processor/module_serializer.h\"\n\n#include <map>\n#include <string>\n\n#include \"processor/basic_code_module.h\"\n#include \"processor/logging.h\"\n\nnamespace google_breakpad {\n\n// Definition of static member variable in SimplerSerializer<Funcion>, which\n// is declared in file \"simple_serializer-inl.h\"\nRangeMapSerializer< MemAddr, linked_ptr<BasicSourceLineResolver::Line> >\nSimpleSerializer<BasicSourceLineResolver::Function>::range_map_serializer_;\n\nsize_t ModuleSerializer::SizeOf(const BasicSourceLineResolver::Module &module) {\n  size_t total_size_alloc_ = 0;\n\n  // Compute memory size for each map component in Module class.\n  int map_index = 0;\n  map_sizes_[map_index++] = files_serializer_.SizeOf(module.files_);\n  map_sizes_[map_index++] = functions_serializer_.SizeOf(module.functions_);\n  map_sizes_[map_index++] = pubsym_serializer_.SizeOf(module.public_symbols_);\n  for (int i = 0; i < WindowsFrameInfo::STACK_INFO_LAST; ++i)\n   map_sizes_[map_index++] =\n       wfi_serializer_.SizeOf(&(module.windows_frame_info_[i]));\n  map_sizes_[map_index++] = cfi_init_rules_serializer_.SizeOf(\n     module.cfi_initial_rules_);\n  map_sizes_[map_index++] = cfi_delta_rules_serializer_.SizeOf(\n     module.cfi_delta_rules_);\n\n  // Header size.\n  total_size_alloc_ = kNumberMaps_ * sizeof(u_int32_t);\n\n  for (int i = 0; i < kNumberMaps_; ++i)\n   total_size_alloc_ += map_sizes_[i];\n\n  // Extra one byte for null terminator for C-string copy safety.\n  ++total_size_alloc_;\n\n  return total_size_alloc_;\n}\n\nchar *ModuleSerializer::Write(const BasicSourceLineResolver::Module &module,\n                              char *dest) {\n  // Write header.\n  memcpy(dest, map_sizes_, kNumberMaps_ * sizeof(u_int32_t));\n  dest += kNumberMaps_ * sizeof(u_int32_t);\n  // Write each map.\n  dest = files_serializer_.Write(module.files_, dest);\n  dest = functions_serializer_.Write(module.functions_, dest);\n  dest = pubsym_serializer_.Write(module.public_symbols_, dest);\n  for (int i = 0; i < WindowsFrameInfo::STACK_INFO_LAST; ++i)\n    dest = wfi_serializer_.Write(&(module.windows_frame_info_[i]), dest);\n  dest = cfi_init_rules_serializer_.Write(module.cfi_initial_rules_, dest);\n  dest = cfi_delta_rules_serializer_.Write(module.cfi_delta_rules_, dest);\n  // Write a null terminator.\n  dest = SimpleSerializer<char>::Write(0, dest);\n  return dest;\n}\n\nchar* ModuleSerializer::Serialize(\n    const BasicSourceLineResolver::Module &module, unsigned int *size) {\n  // Compute size of memory to allocate.\n  unsigned int size_to_alloc = SizeOf(module);\n\n  // Allocate memory for serialized data.\n  char *serialized_data = new char[size_to_alloc];\n  if (!serialized_data) {\n    BPLOG(ERROR) << \"ModuleSerializer: memory allocation failed, \"\n                 << \"size to alloc: \" << size_to_alloc;\n    if (size) *size = 0;\n    return NULL;\n  }\n\n  // Write serialized data to allocated memory chunk.\n  char *end_address = Write(module, serialized_data);\n  // Verify the allocated memory size is equal to the size of data been written.\n  unsigned int size_written =\n      static_cast<unsigned int>(end_address - serialized_data);\n  if (size_to_alloc != size_written) {\n    BPLOG(ERROR) << \"size_to_alloc differs from size_written: \"\n                   << size_to_alloc << \" vs \" << size_written;\n  }\n\n  // Set size and return the start address of memory chunk.\n  if (size)\n    *size = size_to_alloc;\n  return serialized_data;\n}\n\nbool ModuleSerializer::SerializeModuleAndLoadIntoFastResolver(\n    const BasicSourceLineResolver::ModuleMap::const_iterator &iter,\n    FastSourceLineResolver *fast_resolver) {\n  BPLOG(INFO) << \"Converting symbol \" << iter->first.c_str();\n\n  // Cast SourceLineResolverBase::Module* to BasicSourceLineResolver::Module*.\n  BasicSourceLineResolver::Module* basic_module =\n      dynamic_cast<BasicSourceLineResolver::Module*>(iter->second);\n\n  unsigned int size = 0;\n  scoped_array<char> symbol_data(Serialize(*basic_module, &size));\n  if (!symbol_data.get()) {\n    BPLOG(ERROR) << \"Serialization failed for module: \" << basic_module->name_;\n    return false;\n  }\n  BPLOG(INFO) << \"Serialized Symbol Size \" << size;\n\n  // Copy the data into string.\n  // Must pass string to LoadModuleUsingMapBuffer(), instead of passing char* to\n  // LoadModuleUsingMemoryBuffer(), becaused of data ownership/lifetime issue.\n  string symbol_data_string(symbol_data.get(), size);\n  symbol_data.reset();\n\n  scoped_ptr<CodeModule> code_module(\n      new BasicCodeModule(0, 0, iter->first, \"\", \"\", \"\", \"\"));\n\n  return fast_resolver->LoadModuleUsingMapBuffer(code_module.get(),\n                                                 symbol_data_string);\n}\n\nvoid ModuleSerializer::ConvertAllModules(\n    const BasicSourceLineResolver *basic_resolver,\n    FastSourceLineResolver *fast_resolver) {\n  // Check for NULL pointer.\n  if (!basic_resolver || !fast_resolver)\n    return;\n\n  // Traverse module list in basic resolver.\n  BasicSourceLineResolver::ModuleMap::const_iterator iter;\n  iter = basic_resolver->modules_->begin();\n  for (; iter != basic_resolver->modules_->end(); ++iter)\n    SerializeModuleAndLoadIntoFastResolver(iter, fast_resolver);\n}\n\nbool ModuleSerializer::ConvertOneModule(\n    const string &moduleid,\n    const BasicSourceLineResolver *basic_resolver,\n    FastSourceLineResolver *fast_resolver) {\n  // Check for NULL pointer.\n  if (!basic_resolver || !fast_resolver)\n    return false;\n\n  BasicSourceLineResolver::ModuleMap::const_iterator iter;\n  iter = basic_resolver->modules_->find(moduleid);\n  if (iter == basic_resolver->modules_->end())\n    return false;\n\n  return SerializeModuleAndLoadIntoFastResolver(iter, fast_resolver);\n}\n\nchar* ModuleSerializer::SerializeSymbolFileData(\n    const string &symbol_data, unsigned int *size) {\n  scoped_ptr<BasicSourceLineResolver::Module> module(\n      new BasicSourceLineResolver::Module(\"no name\"));\n  scoped_array<char> buffer(new char[symbol_data.size() + 1]);\n  strcpy(buffer.get(), symbol_data.c_str());\n  if (!module->LoadMapFromMemory(buffer.get())) {\n    return NULL;\n  }\n  buffer.reset(NULL);\n  return Serialize(*(module.get()), size);\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/module_serializer.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// module_serializer.h: ModuleSerializer serializes a loaded symbol,\n// i.e., a loaded BasicSouceLineResolver::Module instance, into a memory\n// chunk of data. The serialized data can be read and loaded by\n// FastSourceLineResolver without CPU & memory-intensive parsing.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef PROCESSOR_MODULE_SERIALIZER_H__\n#define PROCESSOR_MODULE_SERIALIZER_H__\n\n#include <map>\n#include <string>\n\n#include \"google_breakpad/processor/basic_source_line_resolver.h\"\n#include \"google_breakpad/processor/fast_source_line_resolver.h\"\n#include \"processor/basic_source_line_resolver_types.h\"\n#include \"processor/fast_source_line_resolver_types.h\"\n#include \"processor/linked_ptr.h\"\n#include \"processor/map_serializers-inl.h\"\n#include \"processor/simple_serializer-inl.h\"\n#include \"processor/windows_frame_info.h\"\n\nnamespace google_breakpad {\n\n// ModuleSerializer serializes a loaded BasicSourceLineResolver::Module into a\n// chunk of memory data. ModuleSerializer also provides interface to compute\n// memory size of the serialized data, write serialized data directly into\n// memory, convert ASCII format symbol data into serialized binary data, and\n// convert loaded BasicSourceLineResolver::Module into\n// FastSourceLineResolver::Module.\nclass ModuleSerializer {\n public:\n  // Compute the size of memory required to serialize a module.  Return the\n  // total size needed for serialization.\n  size_t SizeOf(const BasicSourceLineResolver::Module &module);\n\n  // Write a module into an allocated memory chunk with required size.\n  // Return the \"end\" of data, i.e., the address after the final byte of data.\n  char* Write(const BasicSourceLineResolver::Module &module, char *dest);\n\n  // Serializes a loaded Module object into a chunk of memory data and returns\n  // the address of memory chunk.  If size != NULL, *size is set to the memory\n  // size allocated for the serialized data.\n  // Caller takes the ownership of the memory chunk (allocated on heap), and\n  // owner should call delete [] to free the memory after use.\n  char* Serialize(const BasicSourceLineResolver::Module &module,\n                  unsigned int *size = NULL);\n\n  // Given the string format symbol_data, produces a chunk of serialized data.\n  // Caller takes ownership of the serialized data (on heap), and owner should\n  // call delete [] to free the memory after use.\n  char* SerializeSymbolFileData(const string &symbol_data,\n                                unsigned int *size = NULL);\n\n  // Serializes one loaded module with given moduleid in the basic source line\n  // resolver, and loads the serialized data into the fast source line resolver.\n  // Return false if the basic source line doesn't have a module with the given\n  // moduleid.\n  bool ConvertOneModule(const string &moduleid,\n                        const BasicSourceLineResolver *basic_resolver,\n                        FastSourceLineResolver *fast_resolver);\n\n  // Serializes all the loaded modules in a basic source line resolver, and\n  // loads the serialized data into a fast source line resolver.\n  void ConvertAllModules(const BasicSourceLineResolver *basic_resolver,\n                         FastSourceLineResolver *fast_resolver);\n\n private:\n  // Convenient type names.\n  typedef BasicSourceLineResolver::Line Line;\n  typedef BasicSourceLineResolver::Function Function;\n  typedef BasicSourceLineResolver::PublicSymbol PublicSymbol;\n\n  // Internal implementation for ConvertOneModule and ConvertAllModules methods.\n  bool SerializeModuleAndLoadIntoFastResolver(\n      const BasicSourceLineResolver::ModuleMap::const_iterator &iter,\n      FastSourceLineResolver *fast_resolver);\n\n  // Number of Maps that Module class contains.\n  static const u_int32_t kNumberMaps_ =\n      FastSourceLineResolver::Module::kNumberMaps_;\n\n  // Memory sizes required to serialize map components in Module.\n  u_int32_t map_sizes_[kNumberMaps_];\n\n  // Serializers for each individual map component in Module class.\n  StdMapSerializer<int, string> files_serializer_;\n  RangeMapSerializer<MemAddr, linked_ptr<Function> > functions_serializer_;\n  AddressMapSerializer<MemAddr, linked_ptr<PublicSymbol> > pubsym_serializer_;\n  ContainedRangeMapSerializer<MemAddr,\n                              linked_ptr<WindowsFrameInfo> > wfi_serializer_;\n  RangeMapSerializer<MemAddr, string> cfi_init_rules_serializer_;\n  StdMapSerializer<MemAddr, string> cfi_delta_rules_serializer_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_MODULE_SERIALIZER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/pathname_stripper.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// pathname_stripper.cc: Manipulates pathnames into their component parts.\n//\n// See pathname_stripper.h for documentation.\n//\n// Author: Mark Mentovai\n\n#include \"processor/pathname_stripper.h\"\n\nnamespace google_breakpad {\n\n// static\nstring PathnameStripper::File(const string &path) {\n  string::size_type slash = path.rfind('/');\n  string::size_type backslash = path.rfind('\\\\');\n\n  string::size_type file_start = 0;\n  if (slash != string::npos &&\n      (backslash == string::npos || slash > backslash)) {\n    file_start = slash + 1;\n  } else if (backslash != string::npos) {\n    file_start = backslash + 1;\n  }\n\n  return path.substr(file_start);\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/pathname_stripper.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// pathname_stripper.h: Manipulates pathnames into their component parts.\n//\n// Author: Mark Mentovai\n\n#ifndef PROCESSOR_PATHNAME_STRIPPER_H__\n#define PROCESSOR_PATHNAME_STRIPPER_H__\n\n#include <string>\n\nnamespace google_breakpad {\n\nusing std::string;\n\nclass PathnameStripper {\n public:\n  // Given path, a pathname with components separated by slashes (/) or\n  // backslashes (\\), returns the trailing component, without any separator.\n  // If path ends in a separator character, returns an empty string.\n  static string File(const string &path);\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_PATHNAME_STRIPPER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/pathname_stripper_unittest.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <stdio.h>\n\n#include \"processor/pathname_stripper.h\"\n#include \"processor/logging.h\"\n\n#define ASSERT_TRUE(condition) \\\n  if (!(condition)) { \\\n    fprintf(stderr, \"FAIL: %s @ %s:%d\\n\", #condition, __FILE__, __LINE__); \\\n    return false; \\\n  }\n\n#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2))\n\nnamespace {\n\nusing google_breakpad::PathnameStripper;\n\nstatic bool RunTests() {\n  ASSERT_EQ(PathnameStripper::File(\"/dir/file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"\\\\dir\\\\file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"/dir\\\\file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"\\\\dir/file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"dir/file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"dir\\\\file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"dir/\\\\file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"dir\\\\/file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"dir/\"), \"\");\n  ASSERT_EQ(PathnameStripper::File(\"dir\\\\\"), \"\");\n  ASSERT_EQ(PathnameStripper::File(\"dir/dir/\"), \"\");\n  ASSERT_EQ(PathnameStripper::File(\"dir\\\\dir\\\\\"), \"\");\n  ASSERT_EQ(PathnameStripper::File(\"dir1/dir2/file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"dir1\\\\dir2\\\\file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"dir1/dir2\\\\file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"dir1\\\\dir2/file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"\"), \"\");\n  ASSERT_EQ(PathnameStripper::File(\"1\"), \"1\");\n  ASSERT_EQ(PathnameStripper::File(\"1/2\"), \"2\");\n  ASSERT_EQ(PathnameStripper::File(\"1\\\\2\"), \"2\");\n  ASSERT_EQ(PathnameStripper::File(\"/1/2\"), \"2\");\n  ASSERT_EQ(PathnameStripper::File(\"\\\\1\\\\2\"), \"2\");\n  ASSERT_EQ(PathnameStripper::File(\"dir//file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"dir\\\\\\\\file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"/dir//file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"\\\\dir\\\\\\\\file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"c:\\\\dir\\\\file\"), \"file\");\n  ASSERT_EQ(PathnameStripper::File(\"c:\\\\dir\\\\file.ext\"), \"file.ext\");\n\n  return true;\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  BPLOG_INIT(&argc, &argv);\n\n  return RunTests() ? 0 : 1;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/postfix_evaluator-inl.h",
    "content": "// -*- mode: c++ -*-\n\n// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// postfix_evaluator-inl.h: Postfix (reverse Polish) notation expression\n// evaluator.\n//\n// Documentation in postfix_evaluator.h.\n//\n// Author: Mark Mentovai\n\n#ifndef PROCESSOR_POSTFIX_EVALUATOR_INL_H__\n#define PROCESSOR_POSTFIX_EVALUATOR_INL_H__\n\n#include \"processor/postfix_evaluator.h\"\n\n#include <stdio.h>\n\n#include <sstream>\n\n#include \"google_breakpad/processor/memory_region.h\"\n#include \"processor/logging.h\"\n\nnamespace google_breakpad {\n\nusing std::istringstream;\nusing std::ostringstream;\n\n\n// A small class used in Evaluate to make sure to clean up the stack\n// before returning failure.\nclass AutoStackClearer {\n public:\n  explicit AutoStackClearer(vector<string> *stack) : stack_(stack) {}\n  ~AutoStackClearer() { stack_->clear(); }\n\n private:\n  vector<string> *stack_;\n};\n\n\ntemplate<typename ValueType>\nbool PostfixEvaluator<ValueType>::EvaluateToken(\n    const string &token,\n    const string &expression,\n    DictionaryValidityType *assigned) {\n  // There are enough binary operations that do exactly the same thing\n  // (other than the specific operation, of course) that it makes sense\n  // to share as much code as possible.\n  enum BinaryOperation {\n    BINARY_OP_NONE = 0,\n    BINARY_OP_ADD,\n    BINARY_OP_SUBTRACT,\n    BINARY_OP_MULTIPLY,\n    BINARY_OP_DIVIDE_QUOTIENT,\n    BINARY_OP_DIVIDE_MODULUS,\n    BINARY_OP_ALIGN\n  };\n\n  BinaryOperation operation = BINARY_OP_NONE;\n  if (token == \"+\")\n    operation = BINARY_OP_ADD;\n  else if (token == \"-\")\n    operation = BINARY_OP_SUBTRACT;\n  else if (token == \"*\")\n    operation = BINARY_OP_MULTIPLY;\n  else if (token == \"/\")\n    operation = BINARY_OP_DIVIDE_QUOTIENT;\n  else if (token == \"%\")\n    operation = BINARY_OP_DIVIDE_MODULUS;\n  else if (token == \"@\")\n    operation = BINARY_OP_ALIGN;\n\n  if (operation != BINARY_OP_NONE) {\n    // Get the operands.\n    ValueType operand1 = ValueType();\n    ValueType operand2 = ValueType();\n    if (!PopValues(&operand1, &operand2)) {\n      BPLOG(ERROR) << \"Could not PopValues to get two values for binary \"\n                      \"operation \" << token << \": \" << expression;\n      return false;\n    }\n\n    // Perform the operation.\n    ValueType result;\n    switch (operation) {\n      case BINARY_OP_ADD:\n        result = operand1 + operand2;\n        break;\n      case BINARY_OP_SUBTRACT:\n        result = operand1 - operand2;\n        break;\n      case BINARY_OP_MULTIPLY:\n        result = operand1 * operand2;\n        break;\n      case BINARY_OP_DIVIDE_QUOTIENT:\n        result = operand1 / operand2;\n        break;\n      case BINARY_OP_DIVIDE_MODULUS:\n        result = operand1 % operand2;\n        break;\n      case BINARY_OP_ALIGN:\n\tresult =\n\t  operand1 & (static_cast<ValueType>(-1) ^ (operand2 - 1));\n        break;\n      case BINARY_OP_NONE:\n        // This will not happen, but compilers will want a default or\n        // BINARY_OP_NONE case.\n        BPLOG(ERROR) << \"Not reached!\";\n        return false;\n        break;\n    }\n\n    // Save the result.\n    PushValue(result);\n  } else if (token == \"^\") {\n    // ^ for unary dereference.  Can't dereference without memory.\n    if (!memory_) {\n      BPLOG(ERROR) << \"Attempt to dereference without memory: \" <<\n                      expression;\n      return false;\n    }\n\n    ValueType address;\n    if (!PopValue(&address)) {\n      BPLOG(ERROR) << \"Could not PopValue to get value to derefence: \" <<\n                      expression;\n      return false;\n    }\n\n    ValueType value;\n    if (!memory_->GetMemoryAtAddress(address, &value)) {\n      BPLOG(ERROR) << \"Could not dereference memory at address \" <<\n                      HexString(address) << \": \" << expression;\n      return false;\n    }\n\n    PushValue(value);\n  } else if (token == \"=\") {\n    // = for assignment.\n    ValueType value;\n    if (!PopValue(&value)) {\n      BPLOG(INFO) << \"Could not PopValue to get value to assign: \" <<\n                     expression;\n      return false;\n    }\n\n    // Assignment is only meaningful when assigning into an identifier.\n    // The identifier must name a variable, not a constant.  Variables\n    // begin with '$'.\n    string identifier;\n    if (PopValueOrIdentifier(NULL, &identifier) != POP_RESULT_IDENTIFIER) {\n      BPLOG(ERROR) << \"PopValueOrIdentifier returned a value, but an \"\n                      \"identifier is needed to assign \" <<\n                      HexString(value) << \": \" << expression;\n      return false;\n    }\n    if (identifier.empty() || identifier[0] != '$') {\n      BPLOG(ERROR) << \"Can't assign \" << HexString(value) << \" to \" <<\n                      identifier << \": \" << expression;\n      return false;\n    }\n\n    (*dictionary_)[identifier] = value;\n    if (assigned)\n      (*assigned)[identifier] = true;\n  } else {\n    // The token is not an operator, it's a literal value or an identifier.\n    // Push it onto the stack as-is.  Use push_back instead of PushValue\n    // because PushValue pushes ValueType as a string, but token is already\n    // a string.\n    stack_.push_back(token);\n  }\n  return true;\n}\n\ntemplate<typename ValueType>\nbool PostfixEvaluator<ValueType>::EvaluateInternal(\n    const string &expression,\n    DictionaryValidityType *assigned) {\n  // Tokenize, splitting on whitespace.\n  istringstream stream(expression);\n  string token;\n  while (stream >> token) {\n    // Normally, tokens are whitespace-separated, but occasionally, the\n    // assignment operator is smashed up against the next token, i.e.\n    // $T0 $ebp 128 + =$eip $T0 4 + ^ =$ebp $T0 ^ =\n    // This has been observed in program strings produced by MSVS 2010 in LTO\n    // mode.\n    if (token.size() > 1 && token[0] == '=') {\n      if (!EvaluateToken(\"=\", expression, assigned)) {\n        return false;\n      }\n\n      if (!EvaluateToken(token.substr(1), expression, assigned)) {\n        return false;\n      }\n    } else if (!EvaluateToken(token, expression, assigned)) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\ntemplate<typename ValueType>\nbool PostfixEvaluator<ValueType>::Evaluate(const string &expression,\n                                           DictionaryValidityType *assigned) {\n  // Ensure that the stack is cleared before returning.\n  AutoStackClearer clearer(&stack_);\n\n  if (!EvaluateInternal(expression, assigned))\n    return false;\n\n  // If there's anything left on the stack, it indicates incomplete execution.\n  // This is a failure case.  If the stack is empty, evalution was complete\n  // and successful.\n  if (stack_.empty())\n    return true;\n\n  BPLOG(ERROR) << \"Incomplete execution: \" << expression;\n  return false;\n}\n\ntemplate<typename ValueType>\nbool PostfixEvaluator<ValueType>::EvaluateForValue(const string &expression,\n                                                   ValueType *result) {\n  // Ensure that the stack is cleared before returning.\n  AutoStackClearer clearer(&stack_);\n\n  if (!EvaluateInternal(expression, NULL))\n    return false;\n\n  // A successful execution should leave exactly one value on the stack.\n  if (stack_.size() != 1) {\n    BPLOG(ERROR) << \"Expression yielded bad number of results: \"\n                 << \"'\" << expression << \"'\";\n    return false;\n  }\n\n  return PopValue(result);\n}\n\ntemplate<typename ValueType>\ntypename PostfixEvaluator<ValueType>::PopResult\nPostfixEvaluator<ValueType>::PopValueOrIdentifier(\n    ValueType *value, string *identifier) {\n  // There needs to be at least one element on the stack to pop.\n  if (!stack_.size())\n    return POP_RESULT_FAIL;\n\n  string token = stack_.back();\n  stack_.pop_back();\n\n  // First, try to treat the value as a literal. Literals may have leading\n  // '-' sign, and the entire remaining string must be parseable as\n  // ValueType. If this isn't possible, it can't be a literal, so treat it\n  // as an identifier instead.\n  //\n  // Some versions of the libstdc++, the GNU standard C++ library, have\n  // stream extractors for unsigned integer values that permit a leading\n  // '-' sign (6.0.13); others do not (6.0.9). Since we require it, we\n  // handle it explicitly here.\n  istringstream token_stream(token);\n  ValueType literal = ValueType();\n  bool negative;\n  if (token_stream.peek() == '-') {\n    negative = true;\n    token_stream.get();\n  } else {\n    negative = false;\n  }\n  if (token_stream >> literal && token_stream.peek() == EOF) {\n    if (value) {\n      *value = literal;\n    }\n    if (negative)\n      *value = -*value;\n    return POP_RESULT_VALUE;\n  } else {\n    if (identifier) {\n      *identifier = token;\n    }\n    return POP_RESULT_IDENTIFIER;\n  }\n}\n\n\ntemplate<typename ValueType>\nbool PostfixEvaluator<ValueType>::PopValue(ValueType *value) {\n  ValueType literal = ValueType();\n  string token;\n  PopResult result;\n  if ((result = PopValueOrIdentifier(&literal, &token)) == POP_RESULT_FAIL) {\n    return false;\n  } else if (result == POP_RESULT_VALUE) {\n    // This is the easy case.\n    *value = literal;\n  } else {  // result == POP_RESULT_IDENTIFIER\n    // There was an identifier at the top of the stack.  Resolve it to a\n    // value by looking it up in the dictionary.\n    typename DictionaryType::const_iterator iterator =\n        dictionary_->find(token);\n    if (iterator == dictionary_->end()) {\n      // The identifier wasn't found in the dictionary.  Don't imply any\n      // default value, just fail.\n      BPLOG(INFO) << \"Identifier \" << token << \" not in dictionary\";\n      return false;\n    }\n\n    *value = iterator->second;\n  }\n\n  return true;\n}\n\n\ntemplate<typename ValueType>\nbool PostfixEvaluator<ValueType>::PopValues(ValueType *value1,\n                                            ValueType *value2) {\n  return PopValue(value2) && PopValue(value1);\n}\n\n\ntemplate<typename ValueType>\nvoid PostfixEvaluator<ValueType>::PushValue(const ValueType &value) {\n  ostringstream token_stream;\n  token_stream << value;\n  stack_.push_back(token_stream.str());\n}\n\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_POSTFIX_EVALUATOR_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/postfix_evaluator.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// postfix_evaluator.h: Postfix (reverse Polish) notation expression evaluator.\n//\n// PostfixEvaluator evaluates an expression, using the expression itself\n// in postfix (reverse Polish) notation and a dictionary mapping constants\n// and variables to their values.  The evaluator supports standard\n// arithmetic operations, assignment into variables, and when an optional\n// MemoryRange is provided, dereferencing.  (Any unary key-to-value operation\n// may be used with a MemoryRange implementation that returns the appropriate\n// values, but PostfixEvaluator was written with dereferencing in mind.)\n//\n// The expression language is simple.  Expressions are supplied as strings,\n// with operands and operators delimited by whitespace.  Operands may be\n// either literal values suitable for ValueType, or constants or variables,\n// which reference the dictionary.  The supported binary operators are +\n// (addition), - (subtraction), * (multiplication), / (quotient of division),\n// % (modulus of division), and @ (data alignment). The alignment operator (@)\n// accepts a value and an alignment size, and produces a result that is a\n// multiple of the alignment size by truncating the input value.\n// The unary ^ (dereference) operator is also provided.  These operators\n// allow any operand to be either a literal value, constant, or variable.\n// Assignment (=) of any type of operand into a variable is also supported.\n//\n// The dictionary is provided as a map with string keys.  Keys beginning\n// with the '$' character are treated as variables.  All other keys are\n// treated as constants.  Any results must be assigned into variables in the\n// dictionary.  These variables do not need to exist prior to calling\n// Evaluate, unless used in an expression prior to being assigned to.  The\n// internal stack state is not made available after evaluation, and any\n// values remaining on the stack are treated as evidence of incomplete\n// execution and cause the evaluator to indicate failure.\n//\n// PostfixEvaluator is intended to support evaluation of \"program strings\"\n// obtained from MSVC frame data debugging information in pdb files as\n// returned by the DIA APIs.\n//\n// Author: Mark Mentovai\n\n#ifndef PROCESSOR_POSTFIX_EVALUATOR_H__\n#define PROCESSOR_POSTFIX_EVALUATOR_H__\n\n\n#include <map>\n#include <string>\n#include <vector>\n\nnamespace google_breakpad {\n\nusing std::map;\nusing std::string;\nusing std::vector;\n\nclass MemoryRegion;\n\ntemplate<typename ValueType>\nclass PostfixEvaluator {\n public:\n  typedef map<string, ValueType> DictionaryType;\n  typedef map<string, bool> DictionaryValidityType;\n\n  // Create a PostfixEvaluator object that may be used (with Evaluate) on\n  // one or more expressions.  PostfixEvaluator does not take ownership of\n  // either argument.  |memory| may be NULL, in which case dereferencing\n  // (^) will not be supported.  |dictionary| may be NULL, but evaluation\n  // will fail in that case unless set_dictionary is used before calling\n  // Evaluate.\n  PostfixEvaluator(DictionaryType *dictionary, const MemoryRegion *memory)\n      : dictionary_(dictionary), memory_(memory), stack_() {}\n\n  // Evaluate the expression, starting with an empty stack. The results of\n  // execution will be stored in one (or more) variables in the dictionary.\n  // Returns false if any failures occur during execution, leaving\n  // variables in the dictionary in an indeterminate state. If assigned is\n  // non-NULL, any keys set in the dictionary as a result of evaluation\n  // will also be set to true in assigned, providing a way to determine if\n  // an expression modifies any of its input variables.\n  bool Evaluate(const string &expression, DictionaryValidityType *assigned);\n\n  // Like Evaluate, but provides the value left on the stack to the\n  // caller. If evaluation succeeds and leaves exactly one value on\n  // the stack, pop that value, store it in *result, and return true.\n  // Otherwise, return false.\n  bool EvaluateForValue(const string &expression, ValueType *result);\n\n  DictionaryType* dictionary() const { return dictionary_; }\n\n  // Reset the dictionary.  PostfixEvaluator does not take ownership.\n  void set_dictionary(DictionaryType *dictionary) {dictionary_ = dictionary; }\n\n private:\n  // Return values for PopValueOrIdentifier\n  enum PopResult {\n    POP_RESULT_FAIL = 0,\n    POP_RESULT_VALUE,\n    POP_RESULT_IDENTIFIER\n  };\n\n  // Retrieves the topmost literal value, constant, or variable from the\n  // stack.  Returns POP_RESULT_VALUE if the topmost entry is a literal\n  // value, and sets |value| accordingly.  Returns POP_RESULT_IDENTIFIER\n  // if the topmost entry is a constant or variable identifier, and sets\n  // |identifier| accordingly.  Returns POP_RESULT_FAIL on failure, such\n  // as when the stack is empty.\n  PopResult PopValueOrIdentifier(ValueType *value, string *identifier);\n\n  // Retrieves the topmost value on the stack.  If the topmost entry is\n  // an identifier, the dictionary is queried for the identifier's value.\n  // Returns false on failure, such as when the stack is empty or when\n  // a nonexistent identifier is named.\n  bool PopValue(ValueType *value);\n\n  // Retrieves the top two values on the stack, in the style of PopValue.\n  // value2 is popped before value1, so that value1 corresponds to the\n  // entry that was pushed prior to value2.  Returns false on failure.\n  bool PopValues(ValueType *value1, ValueType *value2);\n\n  // Pushes a new value onto the stack.\n  void PushValue(const ValueType &value);\n\n  // Evaluate expression, updating *assigned if it is non-zero. Return\n  // true if evaluation completes successfully. Do not clear the stack\n  // upon successful evaluation.\n  bool EvaluateInternal(const string &expression,\n                        DictionaryValidityType *assigned);\n\n  bool EvaluateToken(const string &token,\n                     const string &expression,\n                     DictionaryValidityType *assigned);\n\n  // The dictionary mapping constant and variable identifiers (strings) to\n  // values.  Keys beginning with '$' are treated as variable names, and\n  // PostfixEvaluator is free to create and modify these keys.  Weak pointer.\n  DictionaryType *dictionary_;\n\n  // If non-NULL, the MemoryRegion used for dereference (^) operations.\n  // If NULL, dereferencing is unsupported and will fail.  Weak pointer.\n  const MemoryRegion *memory_;\n\n  // The stack contains state information as execution progresses.  Values\n  // are pushed on to it as the expression string is read and as operations\n  // yield values; values are popped when used as operands to operators.\n  vector<string> stack_;\n};\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_POSTFIX_EVALUATOR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/postfix_evaluator_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// postfix_evaluator_unittest.cc: Unit tests for PostfixEvaluator.\n//\n// Author: Mark Mentovai\n\n#include <stdio.h>\n\n#include <map>\n#include <string>\n\n#include \"processor/postfix_evaluator-inl.h\"\n\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/processor/memory_region.h\"\n#include \"processor/logging.h\"\n\n\nnamespace {\n\n\nusing std::map;\nusing std::string;\nusing google_breakpad::MemoryRegion;\nusing google_breakpad::PostfixEvaluator;\n\n\n// FakeMemoryRegion is used to test PostfixEvaluator's dereference (^)\n// operator.  The result of dereferencing a value is one greater than\n// the value.\nclass FakeMemoryRegion : public MemoryRegion {\n public:\n  virtual u_int64_t GetBase() const { return 0; }\n  virtual u_int32_t GetSize() const { return 0; }\n  virtual bool GetMemoryAtAddress(u_int64_t address, u_int8_t  *value) const {\n    *value = address + 1;\n    return true;\n  }\n  virtual bool GetMemoryAtAddress(u_int64_t address, u_int16_t *value) const {\n    *value = address + 1;\n    return true;\n  }\n  virtual bool GetMemoryAtAddress(u_int64_t address, u_int32_t *value) const {\n    *value = address + 1;\n    return true;\n  }\n  virtual bool GetMemoryAtAddress(u_int64_t address, u_int64_t *value) const {\n    *value = address + 1;\n    return true;\n  }\n};\n\n\nstruct EvaluateTest {\n  // Expression passed to PostfixEvaluator::Evaluate.\n  const string expression;\n\n  // True if the expression is expected to be evaluable, false if evaluation\n  // is expected to fail.\n  bool evaluable;\n};\n\n\nstruct EvaluateTestSet {\n  // The dictionary used for all tests in the set.\n  PostfixEvaluator<unsigned int>::DictionaryType *dictionary;\n\n  // The list of tests.\n  const EvaluateTest *evaluate_tests;\n\n  // The number of tests.\n  unsigned int evaluate_test_count;\n\n  // Identifiers and their expected values upon completion of the Evaluate\n  // tests in the set.\n  map<string, unsigned int> *validate_data;\n};\n\n\nstruct EvaluateForValueTest {\n  // Expression passed to PostfixEvaluator::Evaluate.\n  const string expression;\n  \n  // True if the expression is expected to be evaluable, false if evaluation\n  // is expected to fail.\n  bool evaluable;\n\n  // If evaluable, the value we expect it to yield.\n  unsigned int value;\n};\n\nstatic bool RunTests() {\n  // The first test set checks the basic operations and failure modes.\n  PostfixEvaluator<unsigned int>::DictionaryType dictionary_0;\n  const EvaluateTest evaluate_tests_0[] = {\n    { \"$rAdd 2 2 + =\",     true },   // $rAdd = 2 + 2 = 4\n    { \"$rAdd $rAdd 2 + =\", true },   // $rAdd = $rAdd + 2 = 6\n    { \"$rAdd 2 $rAdd + =\", true },   // $rAdd = 2 + $rAdd = 8\n    { \"99\",                false },  // put some junk on the stack...\n    { \"$rAdd2 2 2 + =\",    true },   // ...and make sure things still work\n    { \"$rAdd2\\t2\\n2 + =\",  true },   // same but with different whitespace\n    { \"$rAdd2 2 2 + = \",   true },   // trailing whitespace\n    { \" $rAdd2 2 2 + =\",   true },   // leading whitespace\n    { \"$rAdd2  2 2 +   =\", true },   // extra whitespace\n    { \"$T0 2 = +\",         false },  // too few operands for add\n    { \"2 + =\",             false },  // too few operands for add\n    { \"2 +\",               false },  // too few operands for add\n    { \"+\",                 false },  // too few operands for add\n    { \"^\",                 false },  // too few operands for dereference\n    { \"=\",                 false },  // too few operands for assignment\n    { \"2 =\",               false },  // too few operands for assignment\n    { \"2 2 + =\",           false },  // too few operands for assignment\n    { \"2 2 =\",             false },  // can't assign into a literal\n    { \"k 2 =\",             false },  // can't assign into a constant\n    { \"2\",                 false },  // leftover data on stack\n    { \"2 2 +\",             false },  // leftover data on stack\n    { \"$rAdd\",             false },  // leftover data on stack\n    { \"0 $T1 0 0 + =\",     false },  // leftover data on stack\n    { \"$T2 $T2 2 + =\",     false },  // can't operate on an undefined value\n    { \"$rMul 9 6 * =\",     true },   // $rMul = 9 * 6 = 54\n    { \"$rSub 9 6 - =\",     true },   // $rSub = 9 - 6 = 3\n    { \"$rDivQ 9 6 / =\",    true },   // $rDivQ = 9 / 6 = 1\n    { \"$rDivM 9 6 % =\",    true },   // $rDivM = 9 % 6 = 3\n    { \"$rDeref 9 ^ =\",     true },   // $rDeref = ^9 = 10 (FakeMemoryRegion)\n    { \"$rAlign 36 8 @ =\",  true },   // $rAlign = 36 @ 8\n    { \"$rAdd3 2 2 + =$rMul2 9 6 * =\", true } // smashed-equals tokenization\n  };\n  map<string, unsigned int> validate_data_0;\n  validate_data_0[\"$rAdd\"]   = 8;\n  validate_data_0[\"$rAdd2\"]  = 4;\n  validate_data_0[\"$rSub\"]   = 3;\n  validate_data_0[\"$rMul\"]   = 54;\n  validate_data_0[\"$rDivQ\"]  = 1;\n  validate_data_0[\"$rDivM\"]  = 3;\n  validate_data_0[\"$rDeref\"] = 10;\n  validate_data_0[\"$rAlign\"] = 32;\n  validate_data_0[\"$rAdd3\"]  = 4;\n  validate_data_0[\"$rMul2\"]  = 54;\n\n  // The second test set simulates a couple of MSVC program strings.\n  // The data is fudged a little bit because the tests use FakeMemoryRegion\n  // instead of a real stack snapshot, but the program strings are real and\n  // the implementation doesn't know or care that the data is not real.\n  PostfixEvaluator<unsigned int>::DictionaryType dictionary_1;\n  dictionary_1[\"$ebp\"] = 0xbfff0010;\n  dictionary_1[\"$eip\"] = 0x10000000;\n  dictionary_1[\"$esp\"] = 0xbfff0000;\n  dictionary_1[\".cbSavedRegs\"] = 4;\n  dictionary_1[\".cbParams\"] = 4;\n  dictionary_1[\".raSearchStart\"] = 0xbfff0020;\n  const EvaluateTest evaluate_tests_1[] = {\n    { \"$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = \"\n      \"$L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\", true },\n    // Intermediate state: $T0  = 0xbfff0010, $eip = 0xbfff0015,\n    //                     $ebp = 0xbfff0011, $esp = 0xbfff0018,\n    //                     $L   = 0xbfff000c, $P   = 0xbfff001c\n    { \"$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = \"\n      \"$L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\",\n      true },\n    // Intermediate state: $T0  = 0xbfff0011, $eip = 0xbfff0016,\n    //                     $ebp = 0xbfff0012, $esp = 0xbfff0019,\n    //                     $L   = 0xbfff000d, $P   = 0xbfff001d,\n    //                     $ebx = 0xbffefff6\n    { \"$T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = \"\n      \"$esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = \"\n      \"$ebx $T0 28 - ^ =\",\n      true }\n  };\n  map<string, unsigned int> validate_data_1;\n  validate_data_1[\"$T0\"]  = 0xbfff0012;\n  validate_data_1[\"$T1\"]  = 0xbfff0020;\n  validate_data_1[\"$T2\"]  = 0xbfff0019;\n  validate_data_1[\"$eip\"] = 0xbfff0021;\n  validate_data_1[\"$ebp\"] = 0xbfff0012;\n  validate_data_1[\"$esp\"] = 0xbfff0024;\n  validate_data_1[\"$L\"]   = 0xbfff000e;\n  validate_data_1[\"$P\"]   = 0xbfff0028;\n  validate_data_1[\"$ebx\"] = 0xbffefff7;\n  validate_data_1[\".cbSavedRegs\"] = 4;\n  validate_data_1[\".cbParams\"] = 4;\n\n  EvaluateTestSet evaluate_test_sets[] = {\n    { &dictionary_0, evaluate_tests_0,\n          sizeof(evaluate_tests_0) / sizeof(EvaluateTest), &validate_data_0 },\n    { &dictionary_1, evaluate_tests_1,\n          sizeof(evaluate_tests_1) / sizeof(EvaluateTest), &validate_data_1 },\n  };\n\n  unsigned int evaluate_test_set_count = sizeof(evaluate_test_sets) /\n                                         sizeof(EvaluateTestSet);\n\n  FakeMemoryRegion fake_memory;\n  PostfixEvaluator<unsigned int> postfix_evaluator =\n      PostfixEvaluator<unsigned int>(NULL, &fake_memory);\n\n  for (unsigned int evaluate_test_set_index = 0;\n       evaluate_test_set_index < evaluate_test_set_count;\n       ++evaluate_test_set_index) {\n    EvaluateTestSet *evaluate_test_set =\n        &evaluate_test_sets[evaluate_test_set_index];\n    const EvaluateTest *evaluate_tests = evaluate_test_set->evaluate_tests;\n    unsigned int evaluate_test_count = evaluate_test_set->evaluate_test_count;\n\n    // The same dictionary will be used for each test in the set.  Earlier\n    // tests can affect the state of the dictionary for later tests.\n    postfix_evaluator.set_dictionary(evaluate_test_set->dictionary);\n\n    // Use a new validity dictionary for each test set.\n    PostfixEvaluator<unsigned int>::DictionaryValidityType assigned;\n\n    for (unsigned int evaluate_test_index = 0;\n         evaluate_test_index < evaluate_test_count;\n         ++evaluate_test_index) {\n      const EvaluateTest *evaluate_test = &evaluate_tests[evaluate_test_index];\n\n      // Do the test.\n      bool result = postfix_evaluator.Evaluate(evaluate_test->expression,\n                                               &assigned);\n      if (result != evaluate_test->evaluable) {\n        fprintf(stderr, \"FAIL: evaluate set %d/%d, test %d/%d, \"\n                        \"expression \\\"%s\\\", expected %s, observed %s\\n\",\n                evaluate_test_set_index, evaluate_test_set_count,\n                evaluate_test_index, evaluate_test_count,\n                evaluate_test->expression.c_str(),\n                evaluate_test->evaluable ? \"evaluable\" : \"not evaluable\",\n                result ? \"evaluted\" : \"not evaluated\");\n        return false;\n      }\n    }\n\n    // Validate the results.\n    for (map<string, unsigned int>::const_iterator validate_iterator =\n            evaluate_test_set->validate_data->begin();\n        validate_iterator != evaluate_test_set->validate_data->end();\n        ++validate_iterator) {\n      const string identifier = validate_iterator->first;\n      unsigned int expected_value = validate_iterator->second;\n\n      map<string, unsigned int>::const_iterator dictionary_iterator =\n          evaluate_test_set->dictionary->find(identifier);\n\n      // The identifier must exist in the dictionary.\n      if (dictionary_iterator == evaluate_test_set->dictionary->end()) {\n        fprintf(stderr, \"FAIL: evaluate test set %d/%d, \"\n                        \"validate identifier \\\"%s\\\", \"\n                        \"expected %d, observed not found\\n\",\n                evaluate_test_set_index, evaluate_test_set_count,\n                identifier.c_str(), expected_value);\n        return false;\n      }\n\n      // The value in the dictionary must be the same as the expected value.\n      unsigned int observed_value = dictionary_iterator->second;\n      if (expected_value != observed_value) {\n        fprintf(stderr, \"FAIL: evaluate test set %d/%d, \"\n                        \"validate identifier \\\"%s\\\", \"\n                        \"expected %d, observed %d\\n\",\n                evaluate_test_set_index, evaluate_test_set_count,\n                identifier.c_str(), expected_value, observed_value);\n        return false;\n      }\n\n      // The value must be set in the \"assigned\" dictionary if it was a\n      // variable.  It must not have been assigned if it was a constant.\n      bool expected_assigned = identifier[0] == '$';\n      bool observed_assigned = false;\n      PostfixEvaluator<unsigned int>::DictionaryValidityType::const_iterator\n          iterator_assigned = assigned.find(identifier);\n      if (iterator_assigned != assigned.end()) {\n        observed_assigned = iterator_assigned->second;\n      }\n      if (expected_assigned != observed_assigned) {\n        fprintf(stderr, \"FAIL: evaluate test set %d/%d, \"\n                        \"validate assignment of \\\"%s\\\", \"\n                        \"expected %d, observed %d\\n\",\n                evaluate_test_set_index, evaluate_test_set_count,\n                identifier.c_str(), expected_assigned, observed_assigned);\n        return false;\n      }\n    }\n  }\n\n  // EvaluateForValue tests.\n  PostfixEvaluator<unsigned int>::DictionaryType dictionary_2;\n  dictionary_2[\"$ebp\"] = 0xbfff0010;\n  dictionary_2[\"$eip\"] = 0x10000000;\n  dictionary_2[\"$esp\"] = 0xbfff0000;\n  dictionary_2[\".cbSavedRegs\"] = 4;\n  dictionary_2[\".cbParams\"] = 4;\n  dictionary_2[\".raSearchStart\"] = 0xbfff0020;\n  const EvaluateForValueTest evaluate_for_value_tests_2[] = {\n    { \"28907223\",               true,  28907223 },      // simple constant\n    { \"89854293 40010015 +\",    true,  89854293 + 40010015 }, // arithmetic\n    { \"-870245 8769343 +\",      true,  7899098 },       // negative constants\n    { \"$ebp $esp - $eip +\",     true,  0x10000010 },    // variable references\n    { \"18929794 34015074\",      false, 0 },             // too many values\n    { \"$ebp $ebp 4 - =\",        false, 0 },             // too few values\n    { \"$new $eip = $new\",       true,  0x10000000 },    // make new variable\n    { \"$new 4 +\",               true,  0x10000004 },    // see prior assignments\n    { \".cfa 42 = 10\",           false, 0 }              // can't set constants\n  };\n  const int evaluate_for_value_tests_2_size\n      = (sizeof (evaluate_for_value_tests_2)\n         / sizeof (evaluate_for_value_tests_2[0]));\n  map<string, unsigned int> validate_data_2;\n  validate_data_2[\"$eip\"] = 0x10000000;\n  validate_data_2[\"$ebp\"] = 0xbfff000c;\n  validate_data_2[\"$esp\"] = 0xbfff0000;\n  validate_data_2[\"$new\"] = 0x10000000;\n  validate_data_2[\".cbSavedRegs\"] = 4;\n  validate_data_2[\".cbParams\"] = 4;\n  validate_data_2[\".raSearchStart\"] = 0xbfff0020;\n\n  postfix_evaluator.set_dictionary(&dictionary_2);\n  for (int i = 0; i < evaluate_for_value_tests_2_size; i++) {\n    const EvaluateForValueTest *test = &evaluate_for_value_tests_2[i];\n    unsigned int result;\n    if (postfix_evaluator.EvaluateForValue(test->expression, &result)\n        != test->evaluable) {\n      fprintf(stderr, \"FAIL: evaluate for value test %d, \"\n              \"expected evaluation to %s, but it %s\\n\",\n              i, test->evaluable ? \"succeed\" : \"fail\",\n              test->evaluable ? \"failed\" : \"succeeded\");\n      return false;\n    }\n    if (test->evaluable && result != test->value) {\n      fprintf(stderr, \"FAIL: evaluate for value test %d, \"\n              \"expected value to be 0x%x, but it was 0x%x\\n\",\n              i, test->value, result);\n      return false;\n    }\n  }\n\n  for (map<string, unsigned int>::iterator v = validate_data_2.begin();\n       v != validate_data_2.end(); v++) {\n    map<string, unsigned int>::iterator a = dictionary_2.find(v->first);\n    if (a == dictionary_2.end()) {\n      fprintf(stderr, \"FAIL: evaluate for value dictionary check: \"\n              \"expected dict[\\\"%s\\\"] to be 0x%x, but it was unset\\n\",\n              v->first.c_str(), v->second);\n      return false;\n    } else if (a->second != v->second) {\n      fprintf(stderr, \"FAIL: evaluate for value dictionary check: \"\n              \"expected dict[\\\"%s\\\"] to be 0x%x, but it was 0x%x\\n\",\n              v->first.c_str(), v->second, a->second);\n      return false;\n    } \n    dictionary_2.erase(a);\n  }\n  \n  map<string, unsigned int>::iterator remaining = dictionary_2.begin();\n  if (remaining != dictionary_2.end()) {\n    fprintf(stderr, \"FAIL: evaluation of test expressions put unexpected \"\n            \"values in dictionary:\\n\");\n    for (; remaining != dictionary_2.end(); remaining++)\n      fprintf(stderr, \"    dict[\\\"%s\\\"] == 0x%x\\n\",\n              remaining->first.c_str(), remaining->second);\n    return false;\n  }\n\n  return true;\n}\n\n\n}  // namespace\n\n\nint main(int argc, char **argv) {\n  BPLOG_INIT(&argc, &argv);\n\n  return RunTests() ? 0 : 1;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/process_state.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// process_state.cc: A snapshot of a process, in a fully-digested state.\n//\n// See process_state.h for documentation.\n//\n// Author: Mark Mentovai\n\n#include \"google_breakpad/processor/process_state.h\"\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/code_modules.h\"\n\nnamespace google_breakpad {\n\nProcessState::~ProcessState() {\n  Clear();\n}\n\nvoid ProcessState::Clear() {\n  time_date_stamp_ = 0;\n  crashed_ = false;\n  crash_reason_.clear();\n  crash_address_ = 0;\n  assertion_.clear();\n  requesting_thread_ = -1;\n  for (vector<CallStack *>::const_iterator iterator = threads_.begin();\n       iterator != threads_.end();\n       ++iterator) {\n    delete *iterator;\n  }\n  threads_.clear();\n  system_info_.Clear();\n  delete modules_;\n  modules_ = NULL;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/proto/README",
    "content": "If you wish to use these protobufs, you must generate their source files\nusing  protoc from the protobuf project (http://code.google.com/p/protobuf/).\n\n-----\nTroubleshooting for Protobuf:\n\nInstall:\nIf you are getting permission errors install, make sure you are not trying to\ninstall from an NFS.\n\n\nRunning protoc:\nprotoc: error while loading shared libraries: libprotobuf.so.0: cannot open\nshared object file: No such file or directory\n\nThe issue is that Ubuntu 8.04 doesn't include /usr/local/lib in\nlibrary paths. \n\nTo fix it for your current terminal session, just type in\nexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib \n"
  },
  {
    "path": "archive/spotify/breakpad/processor/proto/process_state.proto",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// process_state_proto.proto: A client proto representation of a process,\n// in a fully-digested state.\n//\n// Derived from earlier struct and class based models of a client-side\n// processed minidump found under src/google_breakpad/processor.  The\n// file process_state.h  holds the top level representation of this model,\n// supported by additional classes.  We've added a proto representation\n// to ease serialization and parsing for server-side storage of crash\n// reports processed on the client.\n//\n// Author: Jess Gray\n\nsyntax = \"proto2\";\n\npackage google_breakpad;\n\n// A proto representation of a process, in a fully-digested state.\n// See src/google_breakpad/processor/process_state.h\nmessage ProcessStateProto {\n  // Next value: 13\n\n  // The time-date stamp of the original minidump (time_t format)\n  optional int64 time_date_stamp = 1;\n\n  message Crash {\n    // The type of crash.  OS- and possibly CPU- specific.  For example,\n    // \"EXCEPTION_ACCESS_VIOLATION\" (Windows), \"EXC_BAD_ACCESS /\n    // KERN_INVALID_ADDRESS\" (Mac OS X), \"SIGSEGV\" (other Unix).\n    required string reason = 1;\n\n    // If crash_reason implicates memory, the memory address that caused the\n    // crash.  For data access errors, this will be the data address that\n    // caused the fault.  For code errors, this will be the address of the\n    // instruction that caused the fault.\n    required int64 address = 2;\n  }\n  optional Crash crash = 2;\n\n\n  // If there was an assertion that was hit, a textual representation\n  // of that assertion, possibly including the file and line at which\n  // it occurred.\n  optional string assertion = 3;\n\n  // The index of the thread that requested a dump be written in the\n  // threads vector.  If a dump was produced as a result of a crash, this\n  // will point to the thread that crashed.  If the dump was produced as\n  // by user code without crashing, and the dump contains extended Breakpad\n  // information, this will point to the thread that requested the dump.\n  optional int32 requesting_thread = 4;\n\n  message Thread {\n    // Stack for the given thread\n    repeated StackFrame frames = 1;\n  }\n\n  // Stacks for each thread (except possibly the exception handler\n  // thread) at the time of the crash.\n  repeated Thread threads = 5;\n\n  // The modules that were loaded into the process represented by the\n  // ProcessState.\n  repeated CodeModule modules = 6;\n\n  // System Info: OS and CPU\n\n  // A string identifying the operating system, such as \"Windows NT\",\n  // \"Mac OS X\", or \"Linux\".  If the information is present in the dump but\n  // its value is unknown, this field will contain a numeric value.  If\n  // the information is not present in the dump, this field will be empty.\n  optional string os = 7;\n\n   // A short form of the os string, using lowercase letters and no spaces,\n  // suitable for use in a filesystem.  Possible values are \"windows\",\n  // \"mac\", and \"linux\".  Empty if the information is not present in the dump\n  // or if the OS given by the dump is unknown.  The values stored in this\n  // field should match those used by MinidumpSystemInfo::GetOS.\n  optional string os_short = 8;\n\n  // A string identifying the version of the operating system, such as\n  // \"5.1.2600 Service Pack 2\" or \"10.4.8 8L2127\".  If the dump does not\n  // contain this information, this field will be empty.\n  optional string os_version = 9;\n\n  // A string identifying the basic CPU family, such as \"x86\" or \"ppc\".\n  // If this information is present in the dump but its value is unknown,\n  // this field will contain a numeric value.  If the information is not\n  // present in the dump, this field will be empty.  The values stored in\n  // this field should match those used by MinidumpSystemInfo::GetCPU.\n  optional string cpu = 10;\n\n  // A string further identifying the specific CPU, such as\n  // \"GenuineIntel level 6 model 13 stepping 8\".  If the information is not\n  // present in the dump, or additional identifying information is not\n  // defined for the CPU family, this field will be empty.\n  optional string cpu_info = 11;\n\n  // The number of processors in the system.  Will be greater than one for\n  // multi-core systems.\n  optional int32 cpu_count = 12;\n\n  // Leave the ability to add the raw minidump to this representation\n}\n\n\n// Represents a single frame in a stack  \n// See src/google_breakpad/processor/code_module.h\nmessage StackFrame {\n  // Next value: 8\n\n  // The program counter location as an absolute virtual address.  For the\n  // innermost called frame in a stack, this will be an exact program counter\n  // or instruction pointer value.  For all other frames, this will be within\n  // the instruction that caused execution to branch to a called function,\n  // but may not necessarily point to the exact beginning of that instruction.\n  required int64 instruction = 1;\n\n  // The module in which the instruction resides.\n  optional CodeModule module = 2;\n\n  // The function name, may be omitted if debug symbols are not available.\n  optional string function_name = 3;\n\n  // The start address of the function, may be omitted if debug symbols\n  // are not available.\n  optional int64 function_base = 4;\n\n  // The source file name, may be omitted if debug symbols are not available.\n  optional string source_file_name = 5;\n\n  // The (1-based) source line number, may be omitted if debug symbols are\n  // not available.\n  optional int32 source_line = 6;\n\n  // The start address of the source line, may be omitted if debug symbols\n  // are not available.\n  optional int64 source_line_base = 7;\n}\n\n\n// Carries information about code modules that are loaded into a process.\n// See src/google_breakpad/processor/code_module.h\nmessage CodeModule {\n  // Next value: 8\n\n  // The base address of this code module as it was loaded by the process.\n  optional int64 base_address = 1;\n\n  // The size of the code module.\n  optional int64 size = 2;\n\n  // The path or file name that the code module was loaded from.\n  optional string code_file = 3;\n\n  // An identifying string used to discriminate between multiple versions and\n  // builds of the same code module.  This may contain a uuid, timestamp,\n  // version number, or any combination of this or other information, in an\n  // implementation-defined format.\n  optional string code_identifier = 4;\n\n  // The filename containing debugging information associated with the code\n  // module.  If debugging information is stored in a file separate from the\n  // code module itself (as is the case when .pdb or .dSYM files are used),\n  // this will be different from code_file.  If debugging information is\n  // stored in the code module itself (possibly prior to stripping), this\n  // will be the same as code_file.\n  optional string debug_file = 5;\n\n  // An identifying string similar to code_identifier, but identifies a\n  // specific version and build of the associated debug file.  This may be\n  // the same as code_identifier when the debug_file and code_file are\n  // identical or when the same identifier is used to identify distinct\n  // debug and code files.\n  optional string debug_identifier = 6;\n\n  // A human-readable representation of the code module's version.\n  optional string version = 7;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/range_map-inl.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// range_map-inl.h: Range map implementation.\n//\n// See range_map.h for documentation.\n//\n// Author: Mark Mentovai\n\n#ifndef PROCESSOR_RANGE_MAP_INL_H__\n#define PROCESSOR_RANGE_MAP_INL_H__\n\n\n#include <assert.h>\n\n#include \"processor/range_map.h\"\n#include \"processor/logging.h\"\n\n\nnamespace google_breakpad {\n\n\ntemplate<typename AddressType, typename EntryType>\nbool RangeMap<AddressType, EntryType>::StoreRange(const AddressType &base,\n                                                  const AddressType &size,\n                                                  const EntryType &entry) {\n  AddressType high = base + size - 1;\n\n  // Check for undersize or overflow.\n  if (size <= 0 || high < base) {\n    // The processor will hit this case too frequently with common symbol\n    // files in the size == 0 case, which is more suited to a DEBUG channel.\n    // Filter those out since there's no DEBUG channel at the moment.\n    BPLOG_IF(INFO, size != 0) << \"StoreRange failed, \" << HexString(base) <<\n                                 \"+\" << HexString(size) << \", \" <<\n                                 HexString(high);\n    return false;\n  }\n\n  // Ensure that this range does not overlap with another one already in the\n  // map.\n  MapConstIterator iterator_base = map_.lower_bound(base);\n  MapConstIterator iterator_high = map_.lower_bound(high);\n\n  if (iterator_base != iterator_high) {\n    // Some other range begins in the space used by this range.  It may be\n    // contained within the space used by this range, or it may extend lower.\n    // Regardless, it is an error.\n    AddressType other_base = iterator_base->second.base();\n    AddressType other_size = iterator_base->first - other_base + 1;\n    BPLOG(INFO) << \"StoreRange failed, an existing range is contained by or \"\n                   \"extends lower than the new range: new \" <<\n                   HexString(base) << \"+\" << HexString(size) << \", existing \" <<\n                   HexString(other_base) << \"+\" << HexString(other_size);\n    return false;\n  }\n\n  if (iterator_high != map_.end()) {\n    if (iterator_high->second.base() <= high) {\n      // The range above this one overlaps with this one.  It may fully\n      // contain this range, or it may begin within this range and extend\n      // higher.  Regardless, it's an error.\n      AddressType other_base = iterator_high->second.base();\n      AddressType other_size = iterator_high->first - other_base + 1;\n      BPLOG(INFO) << \"StoreRange failed, an existing range contains or \"\n                     \"extends higher than the new range: new \" <<\n                     HexString(base) << \"+\" << HexString(size) <<\n                     \", existing \" <<\n                     HexString(other_base) << \"+\" << HexString(other_size);\n      return false;\n    }\n  }\n\n  // Store the range in the map by its high address, so that lower_bound can\n  // be used to quickly locate a range by address.\n  map_.insert(MapValue(high, Range(base, entry)));\n  return true;\n}\n\n\ntemplate<typename AddressType, typename EntryType>\nbool RangeMap<AddressType, EntryType>::RetrieveRange(\n    const AddressType &address, EntryType *entry,\n    AddressType *entry_base, AddressType *entry_size) const {\n  BPLOG_IF(ERROR, !entry) << \"RangeMap::RetrieveRange requires |entry|\";\n  assert(entry);\n\n  MapConstIterator iterator = map_.lower_bound(address);\n  if (iterator == map_.end())\n    return false;\n\n  // The map is keyed by the high address of each range, so |address| is\n  // guaranteed to be lower than the range's high address.  If |range| is\n  // not directly preceded by another range, it's possible for address to\n  // be below the range's low address, though.  When that happens, address\n  // references something not within any range, so return false.\n  if (address < iterator->second.base())\n    return false;\n\n  *entry = iterator->second.entry();\n  if (entry_base)\n    *entry_base = iterator->second.base();\n  if (entry_size)\n    *entry_size = iterator->first - iterator->second.base() + 1;\n\n  return true;\n}\n\n\ntemplate<typename AddressType, typename EntryType>\nbool RangeMap<AddressType, EntryType>::RetrieveNearestRange(\n    const AddressType &address, EntryType *entry,\n    AddressType *entry_base, AddressType *entry_size) const {\n  BPLOG_IF(ERROR, !entry) << \"RangeMap::RetrieveNearestRange requires |entry|\";\n  assert(entry);\n\n  // If address is within a range, RetrieveRange can handle it.\n  if (RetrieveRange(address, entry, entry_base, entry_size))\n    return true;\n\n  // upper_bound gives the first element whose key is greater than address,\n  // but we want the first element whose key is less than or equal to address.\n  // Decrement the iterator to get there, but not if the upper_bound already\n  // points to the beginning of the map - in that case, address is lower than\n  // the lowest stored key, so return false.\n  MapConstIterator iterator = map_.upper_bound(address);\n  if (iterator == map_.begin())\n    return false;\n  --iterator;\n\n  *entry = iterator->second.entry();\n  if (entry_base)\n    *entry_base = iterator->second.base();\n  if (entry_size)\n    *entry_size = iterator->first - iterator->second.base() + 1;\n\n  return true;\n}\n\n\ntemplate<typename AddressType, typename EntryType>\nbool RangeMap<AddressType, EntryType>::RetrieveRangeAtIndex(\n    int index, EntryType *entry,\n    AddressType *entry_base, AddressType *entry_size) const {\n  BPLOG_IF(ERROR, !entry) << \"RangeMap::RetrieveRangeAtIndex requires |entry|\";\n  assert(entry);\n\n  if (index >= GetCount()) {\n    BPLOG(ERROR) << \"Index out of range: \" << index << \"/\" << GetCount();\n    return false;\n  }\n\n  // Walk through the map.  Although it's ordered, it's not a vector, so it\n  // can't be addressed directly by index.\n  MapConstIterator iterator = map_.begin();\n  for (int this_index = 0; this_index < index; ++this_index)\n    ++iterator;\n\n  *entry = iterator->second.entry();\n  if (entry_base)\n    *entry_base = iterator->second.base();\n  if (entry_size)\n    *entry_size = iterator->first - iterator->second.base() + 1;\n\n  return true;\n}\n\n\ntemplate<typename AddressType, typename EntryType>\nint RangeMap<AddressType, EntryType>::GetCount() const {\n  return map_.size();\n}\n\n\ntemplate<typename AddressType, typename EntryType>\nvoid RangeMap<AddressType, EntryType>::Clear() {\n  map_.clear();\n}\n\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_RANGE_MAP_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/range_map.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// range_map.h: Range maps.\n//\n// A range map associates a range of addresses with a specific object.  This\n// is useful when certain objects of variable size are located within an\n// address space.  The range map makes it simple to determine which object is\n// associated with a specific address, which may be any address within the\n// range associated with an object.\n//\n// Author: Mark Mentovai\n\n#ifndef PROCESSOR_RANGE_MAP_H__\n#define PROCESSOR_RANGE_MAP_H__\n\n\n#include <map>\n\n\nnamespace google_breakpad {\n\n// Forward declarations (for later friend declarations of specialized template).\ntemplate<class, class> class RangeMapSerializer;\n\ntemplate<typename AddressType, typename EntryType>\nclass RangeMap {\n public:\n  RangeMap() : map_() {}\n\n  // Inserts a range into the map.  Returns false for a parameter error,\n  // or if the location of the range would conflict with a range already\n  // stored in the map.\n  bool StoreRange(const AddressType &base,\n                  const AddressType &size,\n                  const EntryType &entry);\n\n  // Locates the range encompassing the supplied address.  If there is\n  // no such range, returns false.  entry_base and entry_size, if non-NULL,\n  // are set to the base and size of the entry's range.\n  bool RetrieveRange(const AddressType &address, EntryType *entry,\n                     AddressType *entry_base, AddressType *entry_size) const;\n\n  // Locates the range encompassing the supplied address, if one exists.\n  // If no range encompasses the supplied address, locates the nearest range\n  // to the supplied address that is lower than the address.  Returns false\n  // if no range meets these criteria.  entry_base and entry_size, if\n  // non-NULL, are set to the base and size of the entry's range.\n  bool RetrieveNearestRange(const AddressType &address, EntryType *entry,\n                            AddressType *entry_base, AddressType *entry_size)\n                            const;\n\n  // Treating all ranges as a list ordered by the address spaces that they\n  // occupy, locates the range at the index specified by index.  Returns\n  // false if index is larger than the number of ranges stored.  entry_base\n  // and entry_size, if non-NULL, are set to the base and size of the entry's\n  // range.\n  //\n  // RetrieveRangeAtIndex is not optimized for speedy operation.\n  bool RetrieveRangeAtIndex(int index, EntryType *entry,\n                            AddressType *entry_base, AddressType *entry_size)\n                            const;\n\n  // Returns the number of ranges stored in the RangeMap.\n  int GetCount() const;\n\n  // Empties the range map, restoring it to the state it was when it was\n  // initially created.\n  void Clear();\n\n private:\n  // Friend declarations.\n  friend class ModuleComparer;\n  friend class RangeMapSerializer<AddressType, EntryType>;\n\n  class Range {\n   public:\n    Range(const AddressType &base, const EntryType &entry)\n        : base_(base), entry_(entry) {}\n\n    AddressType base() const { return base_; }\n    EntryType entry() const { return entry_; }\n\n   private:\n    // The base address of the range.  The high address does not need to\n    // be stored, because RangeMap uses it as the key to the map.\n    const AddressType base_;\n\n    // The entry corresponding to a range.\n    const EntryType entry_;\n  };\n\n  // Convenience types.\n  typedef std::map<AddressType, Range> AddressToRangeMap;\n  typedef typename AddressToRangeMap::const_iterator MapConstIterator;\n  typedef typename AddressToRangeMap::value_type MapValue;\n\n  // Maps the high address of each range to a EntryType.\n  AddressToRangeMap map_;\n};\n\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_RANGE_MAP_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/range_map_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// range_map_unittest.cc: Unit tests for RangeMap\n//\n// Author: Mark Mentovai\n\n\n#include <limits.h>\n#include <stdio.h>\n\n#include \"processor/range_map-inl.h\"\n\n#include \"processor/linked_ptr.h\"\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n\n\nnamespace {\n\n\nusing google_breakpad::linked_ptr;\nusing google_breakpad::scoped_ptr;\nusing google_breakpad::RangeMap;\n\n\n// A CountedObject holds an int.  A global (not thread safe!) count of\n// allocated CountedObjects is maintained to help test memory management.\nclass CountedObject {\n public:\n  explicit CountedObject(int id) : id_(id) { ++count_; }\n  ~CountedObject() { --count_; }\n\n  static int count() { return count_; }\n  int id() const { return id_; }\n\n private:\n  static int count_;\n  int id_;\n};\n\nint CountedObject::count_;\n\n\ntypedef int AddressType;\ntypedef RangeMap< AddressType, linked_ptr<CountedObject> > TestMap;\n\n\n// RangeTest contains data to use for store and retrieve tests.  See\n// RunTests for descriptions of the tests.\nstruct RangeTest {\n  // Base address to use for test\n  AddressType address;\n\n  // Size of range to use for test\n  AddressType size;\n\n  // Unique ID of range - unstorable ranges must have unique IDs too\n  int id;\n\n  // Whether this range is expected to be stored successfully or not\n  bool expect_storable;\n};\n\n\n// A RangeTestSet encompasses multiple RangeTests, which are run in\n// sequence on the same RangeMap.\nstruct RangeTestSet {\n  // An array of RangeTests\n  const RangeTest *range_tests;\n\n  // The number of tests in the set\n  unsigned int range_test_count;\n};\n\n\n// StoreTest uses the data in a RangeTest and calls StoreRange on the\n// test RangeMap.  It returns true if the expected result occurred, and\n// false if something else happened.\nstatic bool StoreTest(TestMap *range_map, const RangeTest *range_test) {\n  linked_ptr<CountedObject> object(new CountedObject(range_test->id));\n  bool stored = range_map->StoreRange(range_test->address,\n                                      range_test->size,\n                                      object);\n\n  if (stored != range_test->expect_storable) {\n    fprintf(stderr, \"FAILED: \"\n            \"StoreRange id %d, expected %s, observed %s\\n\",\n            range_test->id,\n            range_test->expect_storable ? \"storable\" : \"not storable\",\n            stored ? \"stored\" : \"not stored\");\n    return false;\n  }\n\n  return true;\n}\n\n\n// RetrieveTest uses the data in RangeTest and calls RetrieveRange on the\n// test RangeMap.  If it retrieves the expected value (which can be no\n// map entry at the specified range,) it returns true, otherwise, it returns\n// false.  RetrieveTest will check the values around the base address and\n// the high address of a range to guard against off-by-one errors.\nstatic bool RetrieveTest(TestMap *range_map, const RangeTest *range_test) {\n  for (unsigned int side = 0; side <= 1; ++side) {\n    // When side == 0, check the low side (base address) of each range.\n    // When side == 1, check the high side (base + size) of each range.\n\n    // Check one-less and one-greater than the target address in addition\n    // to the target address itself.\n\n    // If the size of the range is only 1, don't check one greater than\n    // the base or one less than the high - for a successfully stored\n    // range, these tests would erroneously fail because the range is too\n    // small.\n    AddressType low_offset = -1;\n    AddressType high_offset = 1;\n    if (range_test->size == 1) {\n      if (!side)          // When checking the low side,\n        high_offset = 0;  // don't check one over the target.\n      else                // When checking the high side,\n        low_offset = 0;   // don't check one under the target.\n    }\n\n    for (AddressType offset = low_offset; offset <= high_offset; ++offset) {\n      AddressType address =\n          offset +\n          (!side ? range_test->address :\n                   range_test->address + range_test->size - 1);\n\n      bool expected_result = false;  // This is correct for tests not stored.\n      if (range_test->expect_storable) {\n        if (offset == 0)             // When checking the target address,\n          expected_result = true;    // test should always succeed.\n        else if (offset == -1)       // When checking one below the target,\n          expected_result = side;    // should fail low and succeed high.\n        else                         // When checking one above the target,\n          expected_result = !side;   // should succeed low and fail high.\n      }\n\n      linked_ptr<CountedObject> object;\n      AddressType retrieved_base = AddressType();\n      AddressType retrieved_size = AddressType();\n      bool retrieved = range_map->RetrieveRange(address, &object,\n                                                &retrieved_base,\n                                                &retrieved_size);\n\n      bool observed_result = retrieved && object->id() == range_test->id;\n\n      if (observed_result != expected_result) {\n        fprintf(stderr, \"FAILED: \"\n                        \"RetrieveRange id %d, side %d, offset %d, \"\n                        \"expected %s, observed %s\\n\",\n                        range_test->id,\n                        side,\n                        offset,\n                        expected_result ? \"true\" : \"false\",\n                        observed_result ? \"true\" : \"false\");\n        return false;\n      }\n\n      // If a range was successfully retrieved, check that the returned\n      // bounds match the range as stored.\n      if (observed_result == true &&\n          (retrieved_base != range_test->address ||\n           retrieved_size != range_test->size)) {\n        fprintf(stderr, \"FAILED: \"\n                        \"RetrieveRange id %d, side %d, offset %d, \"\n                        \"expected base/size %d/%d, observed %d/%d\\n\",\n                        range_test->id,\n                        side,\n                        offset,\n                        range_test->address, range_test->size,\n                        retrieved_base, retrieved_size);\n        return false;\n      }\n\n      // Now, check RetrieveNearestRange.  The nearest range is always\n      // expected to be different from the test range when checking one\n      // less than the low side.\n      bool expected_nearest = range_test->expect_storable;\n      if (!side && offset < 0)\n        expected_nearest = false;\n\n      linked_ptr<CountedObject> nearest_object;\n      AddressType nearest_base = AddressType();\n      AddressType nearest_size = AddressType();\n      bool retrieved_nearest = range_map->RetrieveNearestRange(address,\n                                                               &nearest_object,\n                                                               &nearest_base,\n                                                               &nearest_size);\n\n      // When checking one greater than the high side, RetrieveNearestRange\n      // should usually return the test range.  When a different range begins\n      // at that address, though, then RetrieveNearestRange should return the\n      // range at the address instead of the test range.\n      if (side && offset > 0 && nearest_base == address) {\n        expected_nearest = false;\n      }\n\n      bool observed_nearest = retrieved_nearest &&\n                              nearest_object->id() == range_test->id;\n\n      if (observed_nearest != expected_nearest) {\n        fprintf(stderr, \"FAILED: \"\n                        \"RetrieveNearestRange id %d, side %d, offset %d, \"\n                        \"expected %s, observed %s\\n\",\n                        range_test->id,\n                        side,\n                        offset,\n                        expected_nearest ? \"true\" : \"false\",\n                        observed_nearest ? \"true\" : \"false\");\n        return false;\n      }\n\n      // If a range was successfully retrieved, check that the returned\n      // bounds match the range as stored.\n      if (expected_nearest &&\n          (nearest_base != range_test->address ||\n           nearest_size != range_test->size)) {\n        fprintf(stderr, \"FAILED: \"\n                        \"RetrieveNearestRange id %d, side %d, offset %d, \"\n                        \"expected base/size %d/%d, observed %d/%d\\n\",\n                        range_test->id,\n                        side,\n                        offset,\n                        range_test->address, range_test->size,\n                        nearest_base, nearest_size);\n        return false;\n      }\n    }\n  }\n\n  return true;\n}\n\n\n// Test RetrieveRangeAtIndex, which is supposed to return objects in order\n// according to their addresses.  This test is performed by looping through\n// the map, calling RetrieveRangeAtIndex for all possible indices in sequence,\n// and verifying that each call returns a different object than the previous\n// call, and that ranges are returned with increasing base addresses.  Returns\n// false if the test fails.\nstatic bool RetrieveIndexTest(TestMap *range_map, int set) {\n  linked_ptr<CountedObject> object;\n  CountedObject *last_object = NULL;\n  AddressType last_base = 0;\n\n  int object_count = range_map->GetCount();\n  for (int object_index = 0; object_index < object_count; ++object_index) {\n    AddressType base;\n    if (!range_map->RetrieveRangeAtIndex(object_index, &object, &base, NULL)) {\n      fprintf(stderr, \"FAILED: RetrieveRangeAtIndex set %d index %d, \"\n              \"expected success, observed failure\\n\",\n              set, object_index);\n      return false;\n    }\n\n    if (!object.get()) {\n      fprintf(stderr, \"FAILED: RetrieveRangeAtIndex set %d index %d, \"\n              \"expected object, observed NULL\\n\",\n              set, object_index);\n      return false;\n    }\n\n    // It's impossible to do these comparisons unless there's a previous\n    // object to compare against.\n    if (last_object) {\n      // The object must be different from the last one.\n      if (object->id() == last_object->id()) {\n        fprintf(stderr, \"FAILED: RetrieveRangeAtIndex set %d index %d, \"\n                \"expected different objects, observed same objects (%d)\\n\",\n                set, object_index, object->id());\n        return false;\n      }\n\n      // Each object must have a base greater than the previous object's base.\n      if (base <= last_base) {\n        fprintf(stderr, \"FAILED: RetrieveRangeAtIndex set %d index %d, \"\n                \"expected different bases, observed same bases (%d)\\n\",\n                set, object_index, base);\n        return false;\n      }\n    }\n\n    last_object = object.get();\n    last_base = base;\n  }\n\n  // Make sure that RetrieveRangeAtIndex doesn't allow lookups at indices that\n  // are too high.\n  if (range_map->RetrieveRangeAtIndex(object_count, &object, NULL, NULL)) {\n    fprintf(stderr, \"FAILED: RetrieveRangeAtIndex set %d index %d (too large), \"\n            \"expected failure, observed success\\n\",\n            set, object_count);\n    return false;\n  }\n\n  return true;\n}\n\n// Additional RetriveAtIndex test to expose the bug in RetrieveRangeAtIndex().\n// Bug info: RetrieveRangeAtIndex() previously retrieves the high address of\n// entry, however, it is supposed to retrieve the base address of entry as\n// stated in the comment in range_map.h.\nstatic bool RetriveAtIndexTest2() {\n  scoped_ptr<TestMap> range_map(new TestMap());\n\n  // Store ranges with base address = 2 * object_id:\n  const int range_size = 2;\n  for (int object_id = 0; object_id < 100; ++object_id) {\n    linked_ptr<CountedObject> object(new CountedObject(object_id));\n    int base_address = 2 * object_id;\n    range_map->StoreRange(base_address, range_size, object);\n  }\n\n  linked_ptr<CountedObject> object;\n  int object_count = range_map->GetCount();\n  for (int object_index = 0; object_index < object_count; ++object_index) {\n    AddressType base;\n    if (!range_map->RetrieveRangeAtIndex(object_index, &object, &base, NULL)) {\n      fprintf(stderr, \"FAILED: RetrieveAtIndexTest2 index %d, \"\n              \"expected success, observed failure\\n\", object_index);\n      return false;\n    }\n\n    int expected_base = 2 * object->id();\n    if (base != expected_base) {\n      fprintf(stderr, \"FAILED: RetriveAtIndexTest2 index %d, \"\n              \"expected base %d, observed base %d\",\n              object_index, expected_base, base);\n      return false;\n    }\n  }\n\n  return true;\n}\n\n\n// RunTests runs a series of test sets.\nstatic bool RunTests() {\n  // These tests will be run sequentially.  The first set of tests exercises\n  // most functions of RangeTest, and verifies all of the bounds-checking.\n  const RangeTest range_tests_0[] = {\n    { INT_MIN,     16,      1,  true },   // lowest possible range\n    { -2,          5,       2,  true },   // a range through zero\n    { INT_MAX - 9, 11,      3,  false },  // tests anti-overflow\n    { INT_MAX - 9, 10,      4,  true },   // highest possible range\n    { 5,           0,       5,  false },  // tests anti-zero-size\n    { 5,           1,       6,  true },   // smallest possible range\n    { -20,         15,      7,  true },   // entirely negative\n\n    { 10,          10,      10, true },   // causes the following tests to fail\n    { 9,           10,      11, false },  // one-less base, one-less high\n    { 9,           11,      12, false },  // one-less base, identical high\n    { 9,           12,      13, false },  // completely contains existing\n    { 10,          9,       14, false },  // identical base, one-less high\n    { 10,          10,      15, false },  // exactly identical to existing range\n    { 10,          11,      16, false },  // identical base, one-greater high\n    { 11,          8,       17, false },  // contained completely within\n    { 11,          9,       18, false },  // one-greater base, identical high\n    { 11,          10,      19, false },  // one-greater base, one-greater high\n    { 9,           2,       20, false },  // overlaps bottom by one\n    { 10,          1,       21, false },  // overlaps bottom by one, contained\n    { 19,          1,       22, false },  // overlaps top by one, contained\n    { 19,          2,       23, false },  // overlaps top by one\n\n    { 9,           1,       24, true },   // directly below without overlap\n    { 20,          1,       25, true },   // directly above without overlap\n\n    { 6,           3,       26, true },   // exactly between two ranges, gapless\n    { 7,           3,       27, false },  // tries to span two ranges\n    { 7,           5,       28, false },  // tries to span three ranges\n    { 4,           20,      29, false },  // tries to contain several ranges\n\n    { 30,          50,      30, true },\n    { 90,          25,      31, true },\n    { 35,          65,      32, false },  // tries to span two noncontiguous\n    { 120,         10000,   33, true },   // > 8-bit\n    { 20000,       20000,   34, true },   // > 8-bit\n    { 0x10001,     0x10001, 35, true },   // > 16-bit\n\n    { 27,          -1,      36, false }   // tests high < base\n  };\n\n  // Attempt to fill the entire space.  The entire space must be filled with\n  // three stores because AddressType is signed for these tests, so RangeMap\n  // treats the size as signed and rejects sizes that appear to be negative.\n  // Even if these tests were run as unsigned, two stores would be needed\n  // to fill the space because the entire size of the space could only be\n  // described by using one more bit than would be present in AddressType.\n  const RangeTest range_tests_1[] = {\n    { INT_MIN, INT_MAX, 50, true },   // From INT_MIN to -2, inclusive\n    { -1,      2,       51, true },   // From -1 to 0, inclusive\n    { 1,       INT_MAX, 52, true },   // From 1 to INT_MAX, inclusive\n    { INT_MIN, INT_MAX, 53, false },  // Can't fill the space twice\n    { -1,      2,       54, false },\n    { 1,       INT_MAX, 55, false },\n    { -3,      6,       56, false },  // -3 to 2, inclusive - spans 3 ranges\n  };\n\n  // A light round of testing to verify that RetrieveRange does the right\n  // the right thing at the extremities of the range when nothing is stored\n  // there.  Checks are forced without storing anything at the extremities\n  // by setting size = 0.\n  const RangeTest range_tests_2[] = {\n    { INT_MIN, 0, 100, false },  // makes RetrieveRange check low end\n    { -1,      3, 101, true },\n    { INT_MAX, 0, 102, false },  // makes RetrieveRange check high end\n  };\n\n  // Similar to the previous test set, but with a couple of ranges closer\n  // to the extremities.\n  const RangeTest range_tests_3[] = {\n    { INT_MIN + 1, 1, 110, true },\n    { INT_MAX - 1, 1, 111, true },\n    { INT_MIN,     0, 112, false },  // makes RetrieveRange check low end\n    { INT_MAX,     0, 113, false }   // makes RetrieveRange check high end\n  };\n\n  // The range map is cleared between sets of tests listed here.\n  const RangeTestSet range_test_sets[] = {\n    { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) },\n    { range_tests_1, sizeof(range_tests_1) / sizeof(RangeTest) },\n    { range_tests_2, sizeof(range_tests_2) / sizeof(RangeTest) },\n    { range_tests_3, sizeof(range_tests_3) / sizeof(RangeTest) },\n    { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) }   // Run again\n  };\n\n  // Maintain the range map in a pointer so that deletion can be meaningfully\n  // tested.\n  scoped_ptr<TestMap> range_map(new TestMap());\n\n  // Run all of the test sets in sequence.\n  unsigned int range_test_set_count = sizeof(range_test_sets) /\n                                      sizeof(RangeTestSet);\n  for (unsigned int range_test_set_index = 0;\n       range_test_set_index < range_test_set_count;\n       ++range_test_set_index) {\n    const RangeTest *range_tests =\n        range_test_sets[range_test_set_index].range_tests;\n    unsigned int range_test_count =\n        range_test_sets[range_test_set_index].range_test_count;\n\n    // Run the StoreRange test, which validates StoreRange and initializes\n    // the RangeMap with data for the RetrieveRange test.\n    int stored_count = 0;  // The number of ranges successfully stored\n    for (unsigned int range_test_index = 0;\n         range_test_index < range_test_count;\n         ++range_test_index) {\n      const RangeTest *range_test = &range_tests[range_test_index];\n      if (!StoreTest(range_map.get(), range_test))\n        return false;\n\n      if (range_test->expect_storable)\n        ++stored_count;\n    }\n\n    // There should be exactly one CountedObject for everything successfully\n    // stored in the RangeMap.\n    if (CountedObject::count() != stored_count) {\n      fprintf(stderr, \"FAILED: \"\n              \"stored object counts don't match, expected %d, observed %d\\n\",\n              stored_count,\n              CountedObject::count());\n\n      return false;\n    }\n\n    // The RangeMap's own count of objects should also match.\n    if (range_map->GetCount() != stored_count) {\n      fprintf(stderr, \"FAILED: stored object count doesn't match GetCount, \"\n              \"expected %d, observed %d\\n\",\n              stored_count, range_map->GetCount());\n\n      return false;\n    }\n\n    // Run the RetrieveRange test\n    for (unsigned int range_test_index = 0;\n         range_test_index < range_test_count;\n         ++range_test_index) {\n      const RangeTest *range_test = &range_tests[range_test_index];\n      if (!RetrieveTest(range_map.get(), range_test))\n        return false;\n    }\n\n    if (!RetrieveIndexTest(range_map.get(), range_test_set_index))\n      return false;\n\n    // Clear the map between test sets.  If this is the final test set,\n    // delete the map instead to test destruction.\n    if (range_test_set_index < range_test_set_count - 1)\n      range_map->Clear();\n    else\n      range_map.reset();\n\n    // Test that all stored objects are freed when the RangeMap is cleared\n    // or deleted.\n    if (CountedObject::count() != 0) {\n      fprintf(stderr, \"FAILED: \"\n              \"did not free all objects after %s, %d still allocated\\n\",\n              range_test_set_index < range_test_set_count - 1 ? \"clear\"\n                                                              : \"delete\",\n              CountedObject::count());\n\n      return false;\n    }\n  }\n\n  if (!RetriveAtIndexTest2()) {\n    fprintf(stderr, \"FAILED: did not pass RetrieveAtIndexTest2()\\n\");\n    return false;\n  }\n\n  return true;\n}\n\n\n}  // namespace\n\n\nint main(int argc, char **argv) {\n  BPLOG_INIT(&argc, &argv);\n\n  return RunTests() ? 0 : 1;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/scoped_ptr.h",
    "content": "//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.\n//  Copyright (c) 2001, 2002 Peter Dimov\n//\n//  Permission to copy, use, modify, sell and distribute this software\n//  is granted provided this copyright notice appears in all copies.\n//  This software is provided \"as is\" without express or implied\n//  warranty, and with no claim as to its suitability for any purpose.\n//\n//  See http://www.boost.org/libs/smart_ptr/scoped_ptr.htm for documentation.\n//\n\n//  scoped_ptr mimics a built-in pointer except that it guarantees deletion\n//  of the object pointed to, either on destruction of the scoped_ptr or via\n//  an explicit reset(). scoped_ptr is a simple solution for simple needs;\n//  use shared_ptr or std::auto_ptr if your needs are more complex.\n\n//  *** NOTE ***\n//  If your scoped_ptr is a class member of class FOO pointing to a \n//  forward declared type BAR (as shown below), then you MUST use a non-inlined \n//  version of the destructor.  The destructor of a scoped_ptr (called from\n//  FOO's destructor) must have a complete definition of BAR in order to \n//  destroy it.  Example:\n//\n//  -- foo.h --\n//  class BAR;\n//\n//  class FOO {\n//   public:\n//    FOO();\n//    ~FOO();  // Required for sources that instantiate class FOO to compile!\n//    \n//   private:\n//    scoped_ptr<BAR> bar_;\n//  };\n//\n//  -- foo.cc --\n//  #include \"foo.h\"\n//  FOO::~FOO() {} // Empty, but must be non-inlined to FOO's class definition.\n\n//  scoped_ptr_malloc added by Google\n//  When one of these goes out of scope, instead of doing a delete or\n//  delete[], it calls free().  scoped_ptr_malloc<char> is likely to see\n//  much more use than any other specializations.\n\n//  release() added by Google\n//  Use this to conditionally transfer ownership of a heap-allocated object\n//  to the caller, usually on method success.\n\n#ifndef PROCESSOR_SCOPED_PTR_H__\n#define PROCESSOR_SCOPED_PTR_H__\n\n#include <cstddef>            // for std::ptrdiff_t\n#include <assert.h>           // for assert\n#include <stdlib.h>           // for free() decl\n\nnamespace google_breakpad {\n\ntemplate <typename T>\nclass scoped_ptr {\n private:\n\n  T* ptr;\n\n  scoped_ptr(scoped_ptr const &);\n  scoped_ptr & operator=(scoped_ptr const &);\n\n public:\n\n  typedef T element_type;\n\n  explicit scoped_ptr(T* p = 0): ptr(p) {}\n\n  ~scoped_ptr() {\n    typedef char type_must_be_complete[sizeof(T)];\n    delete ptr;\n  }\n\n  void reset(T* p = 0) {\n    typedef char type_must_be_complete[sizeof(T)];\n\n    if (ptr != p) {\n      delete ptr;\n      ptr = p;\n    }\n  }\n\n  T& operator*() const {\n    assert(ptr != 0);\n    return *ptr;\n  }\n\n  T* operator->() const  {\n    assert(ptr != 0);\n    return ptr;\n  }\n\n  bool operator==(T* p) const {\n    return ptr == p;\n  }\n\n  bool operator!=(T* p) const {\n    return ptr != p;\n  }\n\n  T* get() const  {\n    return ptr;\n  }\n\n  void swap(scoped_ptr & b) {\n    T* tmp = b.ptr;\n    b.ptr = ptr;\n    ptr = tmp;\n  }\n\n  T* release() {\n    T* tmp = ptr;\n    ptr = 0;\n    return tmp;\n  }\n\n private:\n\n  // no reason to use these: each scoped_ptr should have its own object\n  template <typename U> bool operator==(scoped_ptr<U> const& p) const;\n  template <typename U> bool operator!=(scoped_ptr<U> const& p) const;\n};\n\ntemplate<typename T> inline\nvoid swap(scoped_ptr<T>& a, scoped_ptr<T>& b) {\n  a.swap(b);\n}\n\ntemplate<typename T> inline\nbool operator==(T* p, const scoped_ptr<T>& b) {\n  return p == b.get();\n}\n\ntemplate<typename T> inline\nbool operator!=(T* p, const scoped_ptr<T>& b) {\n  return p != b.get();\n}\n\n//  scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to\n//  is guaranteed, either on destruction of the scoped_array or via an explicit\n//  reset(). Use shared_array or std::vector if your needs are more complex.\n\ntemplate<typename T>\nclass scoped_array {\n private:\n\n  T* ptr;\n\n  scoped_array(scoped_array const &);\n  scoped_array & operator=(scoped_array const &);\n\n public:\n\n  typedef T element_type;\n\n  explicit scoped_array(T* p = 0) : ptr(p) {}\n\n  ~scoped_array() {\n    typedef char type_must_be_complete[sizeof(T)];\n    delete[] ptr;\n  }\n\n  void reset(T* p = 0) {\n    typedef char type_must_be_complete[sizeof(T)];\n\n    if (ptr != p) {\n      delete [] ptr;\n      ptr = p;\n    }\n  }\n\n  T& operator[](std::ptrdiff_t i) const {\n    assert(ptr != 0);\n    assert(i >= 0);\n    return ptr[i];\n  }\n\n  bool operator==(T* p) const {\n    return ptr == p;\n  }\n\n  bool operator!=(T* p) const {\n    return ptr != p;\n  }\n\n  T* get() const {\n    return ptr;\n  }\n\n  void swap(scoped_array & b) {\n    T* tmp = b.ptr;\n    b.ptr = ptr;\n    ptr = tmp;\n  }\n\n  T* release() {\n    T* tmp = ptr;\n    ptr = 0;\n    return tmp;\n  }\n\n private:\n\n  // no reason to use these: each scoped_array should have its own object\n  template <typename U> bool operator==(scoped_array<U> const& p) const;\n  template <typename U> bool operator!=(scoped_array<U> const& p) const;\n};\n\ntemplate<class T> inline\nvoid swap(scoped_array<T>& a, scoped_array<T>& b) {\n  a.swap(b);\n}\n\ntemplate<typename T> inline\nbool operator==(T* p, const scoped_array<T>& b) {\n  return p == b.get();\n}\n\ntemplate<typename T> inline\nbool operator!=(T* p, const scoped_array<T>& b) {\n  return p != b.get();\n}\n\n\n// This class wraps the c library function free() in a class that can be\n// passed as a template argument to scoped_ptr_malloc below.\nclass ScopedPtrMallocFree {\n public:\n  inline void operator()(void* x) const {\n    free(x);\n  }\n};\n\n// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a\n// second template argument, the functor used to free the object.\n\ntemplate<typename T, typename FreeProc = ScopedPtrMallocFree>\nclass scoped_ptr_malloc {\n private:\n\n  T* ptr;\n\n  scoped_ptr_malloc(scoped_ptr_malloc const &);\n  scoped_ptr_malloc & operator=(scoped_ptr_malloc const &);\n\n public:\n\n  typedef T element_type;\n\n  explicit scoped_ptr_malloc(T* p = 0): ptr(p) {}\n\n  ~scoped_ptr_malloc() {\n    typedef char type_must_be_complete[sizeof(T)];\n    free_((void*) ptr);\n  }\n\n  void reset(T* p = 0) {\n    typedef char type_must_be_complete[sizeof(T)];\n\n    if (ptr != p) {\n      free_((void*) ptr);\n      ptr = p;\n    }\n  }\n\n  T& operator*() const {\n    assert(ptr != 0);\n    return *ptr;\n  }\n\n  T* operator->() const {\n    assert(ptr != 0);\n    return ptr;\n  }\n\n  bool operator==(T* p) const {\n    return ptr == p;\n  }\n\n  bool operator!=(T* p) const {\n    return ptr != p;\n  }\n\n  T* get() const {\n    return ptr;\n  }\n\n  void swap(scoped_ptr_malloc & b) {\n    T* tmp = b.ptr;\n    b.ptr = ptr;\n    ptr = tmp;\n  }\n\n  T* release() {\n    T* tmp = ptr;\n    ptr = 0;\n    return tmp;\n  }\n\n private:\n\n  // no reason to use these: each scoped_ptr_malloc should have its own object\n  template <typename U, typename GP>\n  bool operator==(scoped_ptr_malloc<U, GP> const& p) const;\n  template <typename U, typename GP>\n  bool operator!=(scoped_ptr_malloc<U, GP> const& p) const;\n\n  static FreeProc const free_;\n};\n\ntemplate<typename T, typename FP>\nFP const scoped_ptr_malloc<T,FP>::free_ = FP();\n\ntemplate<typename T, typename FP> inline\nvoid swap(scoped_ptr_malloc<T,FP>& a, scoped_ptr_malloc<T,FP>& b) {\n  a.swap(b);\n}\n\ntemplate<typename T, typename FP> inline\nbool operator==(T* p, const scoped_ptr_malloc<T,FP>& b) {\n  return p == b.get();\n}\n\ntemplate<typename T, typename FP> inline\nbool operator!=(T* p, const scoped_ptr_malloc<T,FP>& b) {\n  return p != b.get();\n}\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_SCOPED_PTR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/simple_serializer-inl.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// simple_serializer-inl.h: template specializations for following types:\n// bool, const char *(C-string), string,\n// Line, Function, PublicSymbol, WindowsFrameInfo and their linked pointers.\n//\n// See simple_serializer.h for moredocumentation.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef PROCESSOR_SIMPLE_SERIALIZER_INL_H__\n#define PROCESSOR_SIMPLE_SERIALIZER_INL_H__\n\n#include <string>\n\n#include \"processor/simple_serializer.h\"\n#include \"map_serializers-inl.h\"\n\n#include \"google_breakpad/processor/basic_source_line_resolver.h\"\n#include \"processor/basic_source_line_resolver_types.h\"\n#include \"processor/linked_ptr.h\"\n#include \"processor/windows_frame_info.h\"\n\nnamespace google_breakpad {\n\n// Specializations of SimpleSerializer: bool\ntemplate<>\nclass SimpleSerializer<bool> {\n public:\n  static size_t SizeOf(bool boolean) { return 1; }\n\n  static char *Write(bool boolean, char *dest) {\n    *dest = static_cast<char>(boolean? 255 : 0);\n    return ++dest;\n  }\n};\n\n// Specializations of SimpleSerializer: string\ntemplate<>\nclass SimpleSerializer<string> {\n public:\n  static size_t SizeOf(const string &str) { return str.size() + 1; }\n\n  static char *Write(const string &str, char *dest) {\n    strcpy(dest, str.c_str());\n    return dest + SizeOf(str);\n  }\n};\n\n// Specializations of SimpleSerializer: C-string\ntemplate<>\nclass SimpleSerializer<const char*> {\n public:\n  static size_t SizeOf(const char *cstring) {\n    return strlen(cstring) + 1;\n  }\n\n  static char *Write(const char *cstring, char *dest) {\n    strcpy(dest, cstring);\n    return dest + SizeOf(cstring);\n  }\n};\n\n// Specializations of SimpleSerializer: Line\ntemplate<>\nclass SimpleSerializer<BasicSourceLineResolver::Line> {\n  typedef BasicSourceLineResolver::Line Line;\n public:\n  static size_t SizeOf(const Line &line) {\n    return SimpleSerializer<MemAddr>::SizeOf(line.address)\n         + SimpleSerializer<MemAddr>::SizeOf(line.size)\n         + SimpleSerializer<int32_t>::SizeOf(line.source_file_id)\n         + SimpleSerializer<int32_t>::SizeOf(line.line);\n  }\n  static char *Write(const Line &line, char *dest) {\n    dest = SimpleSerializer<MemAddr>::Write(line.address, dest);\n    dest = SimpleSerializer<MemAddr>::Write(line.size, dest);\n    dest = SimpleSerializer<int32_t>::Write(line.source_file_id, dest);\n    dest = SimpleSerializer<int32_t>::Write(line.line, dest);\n    return dest;\n  }\n};\n\n// Specializations of SimpleSerializer: PublicSymbol\ntemplate<>\nclass SimpleSerializer<BasicSourceLineResolver::PublicSymbol> {\n  typedef BasicSourceLineResolver::PublicSymbol PublicSymbol;\n public:\n  static size_t SizeOf(const PublicSymbol &pubsymbol) {\n    return SimpleSerializer<string>::SizeOf(pubsymbol.name)\n         + SimpleSerializer<MemAddr>::SizeOf(pubsymbol.address)\n         + SimpleSerializer<int32_t>::SizeOf(pubsymbol.parameter_size);\n  }\n  static char *Write(const PublicSymbol &pubsymbol, char *dest) {\n    dest = SimpleSerializer<string>::Write(pubsymbol.name, dest);\n    dest = SimpleSerializer<MemAddr>::Write(pubsymbol.address, dest);\n    dest = SimpleSerializer<int32_t>::Write(pubsymbol.parameter_size, dest);\n    return dest;\n  }\n};\n\n// Specializations of SimpleSerializer: WindowsFrameInfo\ntemplate<>\nclass SimpleSerializer<WindowsFrameInfo> {\n public:\n  static size_t SizeOf(const WindowsFrameInfo &wfi) {\n    unsigned int size = 0;\n    size += sizeof(int32_t);  // wfi.type_\n    size += SimpleSerializer<int32_t>::SizeOf(wfi.valid);\n    size += SimpleSerializer<u_int32_t>::SizeOf(wfi.prolog_size);\n    size += SimpleSerializer<u_int32_t>::SizeOf(wfi.epilog_size);\n    size += SimpleSerializer<u_int32_t>::SizeOf(wfi.parameter_size);\n    size += SimpleSerializer<u_int32_t>::SizeOf(wfi.saved_register_size);\n    size += SimpleSerializer<u_int32_t>::SizeOf(wfi.local_size);\n    size += SimpleSerializer<u_int32_t>::SizeOf(wfi.max_stack_size);\n    size += SimpleSerializer<bool>::SizeOf(wfi.allocates_base_pointer);\n    size += SimpleSerializer<string>::SizeOf(wfi.program_string);\n    return size;\n  }\n  static char *Write(const WindowsFrameInfo &wfi, char *dest) {\n    dest = SimpleSerializer<int32_t>::Write(\n        static_cast<const int32_t>(wfi.type_), dest);\n    dest = SimpleSerializer<int32_t>::Write(wfi.valid, dest);\n    dest = SimpleSerializer<u_int32_t>::Write(wfi.prolog_size, dest);\n    dest = SimpleSerializer<u_int32_t>::Write(wfi.epilog_size, dest);\n    dest = SimpleSerializer<u_int32_t>::Write(wfi.parameter_size, dest);\n    dest = SimpleSerializer<u_int32_t>::Write(wfi.saved_register_size, dest);\n    dest = SimpleSerializer<u_int32_t>::Write(wfi.local_size, dest);\n    dest = SimpleSerializer<u_int32_t>::Write(wfi.max_stack_size, dest);\n    dest = SimpleSerializer<bool>::Write(wfi.allocates_base_pointer, dest);\n    return SimpleSerializer<string>::Write(wfi.program_string, dest);\n  }\n};\n\n// Specializations of SimpleSerializer: Linked_ptr version of\n// Line, Function, PublicSymbol, WindowsFrameInfo.\ntemplate<>\nclass SimpleSerializer< linked_ptr<BasicSourceLineResolver::Line> > {\n  typedef BasicSourceLineResolver::Line Line;\n public:\n  static size_t SizeOf(const linked_ptr<Line> &lineptr) {\n    if (lineptr.get() == NULL) return 0;\n    return SimpleSerializer<Line>::SizeOf(*(lineptr.get()));\n  }\n  static char *Write(const linked_ptr<Line> &lineptr, char *dest) {\n    if (lineptr.get())\n      dest = SimpleSerializer<Line>::Write(*(lineptr.get()), dest);\n    return dest;\n  }\n};\n\ntemplate<>\nclass SimpleSerializer<BasicSourceLineResolver::Function> {\n  // Convenient type names.\n  typedef BasicSourceLineResolver::Function Function;\n  typedef BasicSourceLineResolver::Line Line;\n public:\n  static size_t SizeOf(const Function &func) {\n    unsigned int size = 0;\n    size += SimpleSerializer<string>::SizeOf(func.name);\n    size += SimpleSerializer<MemAddr>::SizeOf(func.address);\n    size += SimpleSerializer<MemAddr>::SizeOf(func.size);\n    size += SimpleSerializer<int32_t>::SizeOf(func.parameter_size);\n    size += range_map_serializer_.SizeOf(func.lines);\n    return size;\n  }\n\n  static char *Write(const Function &func, char *dest) {\n    dest = SimpleSerializer<string>::Write(func.name, dest);\n    dest = SimpleSerializer<MemAddr>::Write(func.address, dest);\n    dest = SimpleSerializer<MemAddr>::Write(func.size, dest);\n    dest = SimpleSerializer<int32_t>::Write(func.parameter_size, dest);\n    dest = range_map_serializer_.Write(func.lines, dest);\n    return dest;\n  }\n private:\n  // This static member is defined in module_serializer.cc.\n  static RangeMapSerializer< MemAddr, linked_ptr<Line> > range_map_serializer_;\n};\n\ntemplate<>\nclass SimpleSerializer< linked_ptr<BasicSourceLineResolver::Function> > {\n  typedef BasicSourceLineResolver::Function Function;\n public:\n  static size_t SizeOf(const linked_ptr<Function> &func) {\n    if (!func.get()) return 0;\n    return SimpleSerializer<Function>::SizeOf(*(func.get()));\n  }\n\n  static char *Write(const linked_ptr<Function> &func, char *dest) {\n    if (func.get())\n      dest = SimpleSerializer<Function>::Write(*(func.get()), dest);\n    return dest;\n  }\n};\n\ntemplate<>\nclass SimpleSerializer< linked_ptr<BasicSourceLineResolver::PublicSymbol> > {\n  typedef BasicSourceLineResolver::PublicSymbol PublicSymbol;\n public:\n  static size_t SizeOf(const linked_ptr<PublicSymbol> &pubsymbol) {\n    if (pubsymbol.get() == NULL) return 0;\n    return SimpleSerializer<PublicSymbol>::SizeOf(*(pubsymbol.get()));\n  }\n  static char *Write(const linked_ptr<PublicSymbol> &pubsymbol, char *dest) {\n    if (pubsymbol.get())\n      dest = SimpleSerializer<PublicSymbol>::Write(*(pubsymbol.get()), dest);\n    return dest;\n  }\n};\n\ntemplate<>\nclass SimpleSerializer< linked_ptr<WindowsFrameInfo> > {\n public:\n  static size_t SizeOf(const linked_ptr<WindowsFrameInfo> &wfi) {\n    if (wfi.get() == NULL) return 0;\n    return SimpleSerializer<WindowsFrameInfo>::SizeOf(*(wfi.get()));\n  }\n  static char *Write(const linked_ptr<WindowsFrameInfo> &wfi, char *dest) {\n    if (wfi.get())\n      dest = SimpleSerializer<WindowsFrameInfo>::Write(*(wfi.get()), dest);\n    return dest;\n  }\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_SIMPLE_SERIALIZER_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/simple_serializer.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// simple_serializer.h: SimpleSerializer is a template for calculating size and\n// writing to specific memory location for objects of primitive types, C-style\n// string, string, breakpad types/structs etc.\n// All specializations of SimpleSerializer template are defined in the\n// \"simple_serializer-inl.h\" file.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef PROCESSOR_SIMPLE_SERIALIZER_H__\n#define PROCESSOR_SIMPLE_SERIALIZER_H__\n\n#include <sys/types.h>\n\nnamespace google_breakpad {\n\ntypedef u_int64_t MemAddr;\n\n// Default implementation of SimpleSerializer template.\n// Specializations are defined in \"simple_serializer-inl.h\".\ntemplate<class Type> class SimpleSerializer {\n public:\n  // Calculate and return the size of the 'item'.\n  static size_t SizeOf(const Type &item) { return sizeof(item); }\n  // Write 'item' to memory location 'dest', and return to the \"end\" address of\n  // data written, i.e., the address after the final byte written.\n  static char *Write(const Type &item, char *dest) {\n    new (dest) Type(item);\n    return dest + SizeOf(item);\n  }\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_SIMPLE_SERIALIZER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/simple_symbol_supplier.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// simple_symbol_supplier.cc: A simple SymbolSupplier implementation\n//\n// See simple_symbol_supplier.h for documentation.\n//\n// Author: Mark Mentovai\n\n#include \"processor/simple_symbol_supplier.h\"\n\n#include <assert.h>\n#include <string.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n\n#include <algorithm>\n#include <iostream>\n#include <fstream>\n\n#include \"google_breakpad/processor/code_module.h\"\n#include \"google_breakpad/processor/system_info.h\"\n#include \"processor/logging.h\"\n#include \"processor/pathname_stripper.h\"\n\nnamespace google_breakpad {\n\nstatic bool file_exists(const string &file_name) {\n  struct stat sb;\n  return stat(file_name.c_str(), &sb) == 0;\n}\n\nSymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFile(\n    const CodeModule *module, const SystemInfo *system_info,\n    string *symbol_file) {\n  BPLOG_IF(ERROR, !symbol_file) << \"SimpleSymbolSupplier::GetSymbolFile \"\n                                   \"requires |symbol_file|\";\n  assert(symbol_file);\n  symbol_file->clear();\n\n  for (unsigned int path_index = 0; path_index < paths_.size(); ++path_index) {\n    SymbolResult result;\n    if ((result = GetSymbolFileAtPathFromRoot(module, system_info,\n                                              paths_[path_index],\n                                              symbol_file)) != NOT_FOUND) {\n      return result;\n    }\n  }\n  return NOT_FOUND;\n}\n\nSymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFile(\n    const CodeModule *module,\n    const SystemInfo *system_info,\n    string *symbol_file,\n    string *symbol_data) {\n  assert(symbol_data);\n  symbol_data->clear();\n\n  SymbolSupplier::SymbolResult s = GetSymbolFile(module, system_info, symbol_file);\n\n  if (s == FOUND) {\n    std::ifstream in(symbol_file->c_str());\n    std::getline(in, *symbol_data, std::string::traits_type::to_char_type(\n                     std::string::traits_type::eof()));\n    in.close();\n  }\n  return s;\n}\n\nSymbolSupplier::SymbolResult SimpleSymbolSupplier::GetCStringSymbolData(\n    const CodeModule *module,\n    const SystemInfo *system_info,\n    string *symbol_file,\n    char **symbol_data) {\n  assert(symbol_data);\n\n  string symbol_data_string;\n  SymbolSupplier::SymbolResult s =\n      GetSymbolFile(module, system_info, symbol_file, &symbol_data_string);\n\n  if (s == FOUND) {\n    unsigned int size = symbol_data_string.size() + 1;\n    *symbol_data = new char[size];\n    if (*symbol_data == NULL) {\n      BPLOG(ERROR) << \"Memory allocation for size \" << size << \" failed\";\n      return INTERRUPT;\n    }\n    memcpy(*symbol_data, symbol_data_string.c_str(), size - 1);\n    (*symbol_data)[size - 1] = '\\0';\n    memory_buffers_.insert(make_pair(module->code_file(), *symbol_data));\n  }\n  return s;\n}\n\nvoid SimpleSymbolSupplier::FreeSymbolData(const CodeModule *module) {\n  if (!module) {\n    BPLOG(INFO) << \"Cannot free symbol data buffer for NULL module\";\n    return;\n  }\n\n  map<string, char *>::iterator it = memory_buffers_.find(module->code_file());\n  if (it == memory_buffers_.end()) {\n    BPLOG(INFO) << \"Cannot find symbol data buffer for module \"\n                << module->code_file();\n    return;\n  }\n  delete [] it->second;\n  memory_buffers_.erase(it);\n}\n\nSymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFileAtPathFromRoot(\n    const CodeModule *module, const SystemInfo *system_info,\n    const string &root_path, string *symbol_file) {\n  BPLOG_IF(ERROR, !symbol_file) << \"SimpleSymbolSupplier::GetSymbolFileAtPath \"\n                                   \"requires |symbol_file|\";\n  assert(symbol_file);\n  symbol_file->clear();\n\n  if (!module)\n    return NOT_FOUND;\n\n  // Start with the base path.\n  string path = root_path;\n\n  // Append the debug (pdb) file name as a directory name.\n  path.append(\"/\");\n  string debug_file_name = PathnameStripper::File(module->debug_file());\n  if (debug_file_name.empty()) {\n    BPLOG(ERROR) << \"Can't construct symbol file path without debug_file \"\n                    \"(code_file = \" <<\n                    PathnameStripper::File(module->code_file()) << \")\";\n    return NOT_FOUND;\n  }\n  path.append(debug_file_name);\n\n  // Append the identifier as a directory name.\n  path.append(\"/\");\n  string identifier = module->debug_identifier();\n  if (identifier.empty()) {\n    BPLOG(ERROR) << \"Can't construct symbol file path without debug_identifier \"\n                    \"(code_file = \" <<\n                    PathnameStripper::File(module->code_file()) <<\n                    \", debug_file = \" << debug_file_name << \")\";\n    return NOT_FOUND;\n  }\n  path.append(identifier);\n\n  // Transform the debug file name into one ending in .sym.  If the existing\n  // name ends in .pdb, strip the .pdb.  Otherwise, add .sym to the non-.pdb\n  // name.\n  path.append(\"/\");\n  string debug_file_extension;\n  if (debug_file_name.size() > 4)\n    debug_file_extension = debug_file_name.substr(debug_file_name.size() - 4);\n  std::transform(debug_file_extension.begin(), debug_file_extension.end(),\n                 debug_file_extension.begin(), tolower);\n  if (debug_file_extension == \".pdb\") {\n    path.append(debug_file_name.substr(0, debug_file_name.size() - 4));\n  } else {\n    path.append(debug_file_name);\n  }\n  path.append(\".sym\");\n\n  if (!file_exists(path)) {\n    BPLOG(INFO) << \"No symbol file at \" << path;\n    return NOT_FOUND;\n  }\n\n  *symbol_file = path;\n  return FOUND;\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/simple_symbol_supplier.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// simple_symbol_supplier.h: A simple SymbolSupplier implementation\n//\n// SimpleSymbolSupplier is a straightforward implementation of SymbolSupplier\n// that stores symbol files in a filesystem tree.  A SimpleSymbolSupplier is\n// created with one or more base directories, which are the root paths for all\n// symbol files.  Each symbol file contained therein has a directory entry in\n// the base directory with a name identical to the corresponding debugging \n// file (pdb).  Within each of these directories, there are subdirectories\n// named for the debugging file's identifier.  For recent pdb files, this is\n// a concatenation of the pdb's uuid and age, presented in hexadecimal form,\n// without any dashes or separators.  The uuid is in uppercase hexadecimal\n// and the age is in lowercase hexadecimal.  Within that subdirectory,\n// SimpleSymbolSupplier expects to find the symbol file, which is named\n// identically to the debug file, but with a .sym extension.  If the original\n// debug file had a name ending in .pdb, the .pdb extension will be replaced\n// with .sym.  This sample hierarchy is rooted at the \"symbols\" base\n// directory:\n//\n// symbols\n// symbols/test_app.pdb\n// symbols/test_app.pdb/63FE4780728D49379B9D7BB6460CB42A1\n// symbols/test_app.pdb/63FE4780728D49379B9D7BB6460CB42A1/test_app.sym\n// symbols/kernel32.pdb\n// symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542\n// symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym\n//\n// In this case, the uuid of test_app.pdb is\n// 63fe4780-728d-4937-9b9d-7bb6460cb42a and its age is 1.\n//\n// This scheme was chosen to be roughly analogous to the way that\n// symbol files may be accessed from Microsoft Symbol Server.  A hierarchy\n// used for Microsoft Symbol Server storage is usable as a hierarchy for\n// SimpleSymbolServer, provided that the pdb files are transformed to dumped\n// format using a tool such as dump_syms, and given a .sym extension.\n//\n// SimpleSymbolSupplier will iterate over all root paths searching for\n// a symbol file existing in that path.\n//\n// SimpleSymbolSupplier supports any debugging file which can be identified\n// by a CodeModule object's debug_file and debug_identifier accessors.  The\n// expected ultimate source of these CodeModule objects are MinidumpModule\n// objects; it is this class that is responsible for assigning appropriate\n// values for debug_file and debug_identifier.\n//\n// Author: Mark Mentovai\n\n#ifndef PROCESSOR_SIMPLE_SYMBOL_SUPPLIER_H__\n#define PROCESSOR_SIMPLE_SYMBOL_SUPPLIER_H__\n\n#include <map>\n#include <string>\n#include <vector>\n\n#include \"google_breakpad/processor/symbol_supplier.h\"\n\nnamespace google_breakpad {\n\nusing std::map;\nusing std::string;\nusing std::vector;\n\nclass CodeModule;\n\nclass SimpleSymbolSupplier : public SymbolSupplier {\n public:\n  // Creates a new SimpleSymbolSupplier, using path as the root path where\n  // symbols are stored.\n  explicit SimpleSymbolSupplier(const string &path) : paths_(1, path) {}\n\n  // Creates a new SimpleSymbolSupplier, using paths as a list of root\n  // paths where symbols may be stored.\n  explicit SimpleSymbolSupplier(const vector<string> &paths) : paths_(paths) {}\n\n  virtual ~SimpleSymbolSupplier() {}\n\n  // Returns the path to the symbol file for the given module.  See the\n  // description above.\n  virtual SymbolResult GetSymbolFile(const CodeModule *module,\n                                     const SystemInfo *system_info,\n                                     string *symbol_file);\n\n  virtual SymbolResult GetSymbolFile(const CodeModule *module,\n                                     const SystemInfo *system_info,\n                                     string *symbol_file,\n                                     string *symbol_data);\n\n  // Allocates data buffer on heap and writes symbol data into buffer.\n  // Symbol supplier ALWAYS takes ownership of the data buffer.\n  virtual SymbolResult GetCStringSymbolData(const CodeModule *module,\n                                            const SystemInfo *system_info,\n                                            string *symbol_file,\n                                            char **symbol_data);\n\n  // Free the data buffer allocated in the above GetCStringSymbolData();\n  virtual void FreeSymbolData(const CodeModule *module);\n\n protected:\n  SymbolResult GetSymbolFileAtPathFromRoot(const CodeModule *module,\n                                           const SystemInfo *system_info,\n                                           const string &root_path,\n                                           string *symbol_file);\n\n private:\n  map<string, char *> memory_buffers_;\n  vector<string> paths_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_SIMPLE_SYMBOL_SUPPLIER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/source_line_resolver_base.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// source_line_resolver_base.cc: Implementation of SourceLineResolverBase.\n//\n// See source_line_resolver_base.h and source_line_resolver_base_types.h for\n// more documentation.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#include <stdio.h>\n#include <string.h>\n#include <sys/stat.h>\n\n#include <map>\n#include <utility>\n\n#include \"google_breakpad/processor/source_line_resolver_base.h\"\n#include \"processor/source_line_resolver_base_types.h\"\n#include \"processor/module_factory.h\"\n\nusing std::map;\nusing std::make_pair;\n\nnamespace google_breakpad {\n\nSourceLineResolverBase::SourceLineResolverBase(\n    ModuleFactory *module_factory)\n  : modules_(new ModuleMap),\n    memory_buffers_(new MemoryMap),\n    module_factory_(module_factory) {\n}\n\nSourceLineResolverBase::~SourceLineResolverBase() {\n  ModuleMap::iterator it;\n  // Iterate through ModuleMap and delete all loaded modules.\n  for (it = modules_->begin(); it != modules_->end(); ++it) {\n    // Delete individual module.\n    delete it->second;\n  }\n  // Delete the map of modules.\n  delete modules_;\n\n  MemoryMap::iterator iter = memory_buffers_->begin();\n  for (; iter != memory_buffers_->end(); ++iter) {\n    delete [] iter->second;\n  }\n  // Delete the map of memory buffers.\n  delete memory_buffers_;\n\n  delete module_factory_;\n}\n\nbool SourceLineResolverBase::ReadSymbolFile(char **symbol_data,\n                                            const string &map_file) {\n  if (symbol_data == NULL) {\n    BPLOG(ERROR) << \"Could not Read file into Null memory pointer\";\n    return false;\n  }\n\n  struct stat buf;\n  int error_code = stat(map_file.c_str(), &buf);\n  if (error_code == -1) {\n    string error_string;\n    error_code = ErrnoString(&error_string);\n    BPLOG(ERROR) << \"Could not open \" << map_file <<\n        \", error \" << error_code << \": \" << error_string;\n    return false;\n  }\n\n  off_t file_size = buf.st_size;\n\n  // Allocate memory for file contents, plus a null terminator\n  // since we may use strtok() on the contents.\n  *symbol_data = new char[file_size + 1];\n\n  if (*symbol_data == NULL) {\n    BPLOG(ERROR) << \"Could not allocate memory for \" << map_file;\n    return false;\n  }\n\n  BPLOG(INFO) << \"Opening \" << map_file;\n\n  FILE *f = fopen(map_file.c_str(), \"rt\");\n  if (!f) {\n    string error_string;\n    error_code = ErrnoString(&error_string);\n    BPLOG(ERROR) << \"Could not open \" << map_file <<\n        \", error \" << error_code << \": \" << error_string;\n    delete [] (*symbol_data);\n    *symbol_data = NULL;\n    return false;\n  }\n\n  AutoFileCloser closer(f);\n\n  int items_read = 0;\n\n  items_read = fread(*symbol_data, 1, file_size, f);\n\n  if (items_read != file_size) {\n    string error_string;\n    error_code = ErrnoString(&error_string);\n    BPLOG(ERROR) << \"Could not slurp \" << map_file <<\n        \", error \" << error_code << \": \" << error_string;\n    delete [] (*symbol_data);\n    *symbol_data = NULL;\n    return false;\n  }\n\n  (*symbol_data)[file_size] = '\\0';\n  return true;\n}\n\nbool SourceLineResolverBase::LoadModule(const CodeModule *module,\n                                        const string &map_file) {\n  if (module == NULL)\n    return false;\n\n  // Make sure we don't already have a module with the given name.\n  if (modules_->find(module->code_file()) != modules_->end()) {\n    BPLOG(INFO) << \"Symbols for module \" << module->code_file()\n                << \" already loaded\";\n    return false;\n  }\n\n  BPLOG(INFO) << \"Loading symbols for module \" << module->code_file()\n              << \" from \" << map_file;\n\n  char *memory_buffer;\n  if (!ReadSymbolFile(&memory_buffer, map_file))\n    return false;\n\n  BPLOG(INFO) << \"Read symbol file \" << map_file << \" succeeded\";\n\n  bool load_result = LoadModuleUsingMemoryBuffer(module, memory_buffer);\n\n  if (load_result && !ShouldDeleteMemoryBufferAfterLoadModule()) {\n    // memory_buffer has to stay alive as long as the module.\n    memory_buffers_->insert(make_pair(module->code_file(), memory_buffer));\n  } else {\n    delete [] memory_buffer;\n  }\n\n  return load_result;\n}\n\nbool SourceLineResolverBase::LoadModuleUsingMapBuffer(\n    const CodeModule *module, const string &map_buffer) {\n  if (module == NULL)\n    return false;\n\n  // Make sure we don't already have a module with the given name.\n  if (modules_->find(module->code_file()) != modules_->end()) {\n    BPLOG(INFO) << \"Symbols for module \" << module->code_file()\n                << \" already loaded\";\n    return false;\n  }\n\n  char *memory_buffer = new char[map_buffer.size() + 1];\n  if (memory_buffer == NULL) {\n    BPLOG(ERROR) << \"Could not allocate memory for \" << module->code_file();\n    return false;\n  }\n\n  // Can't use strcpy, as the data may contain '\\0's before the end.\n  memcpy(memory_buffer, map_buffer.c_str(), map_buffer.size());\n  memory_buffer[map_buffer.size()] = '\\0';\n\n  bool load_result = LoadModuleUsingMemoryBuffer(module, memory_buffer);\n\n  if (load_result && !ShouldDeleteMemoryBufferAfterLoadModule()) {\n    // memory_buffer has to stay alive as long as the module.\n    memory_buffers_->insert(make_pair(module->code_file(), memory_buffer));\n  } else {\n    delete [] memory_buffer;\n  }\n\n  return load_result;\n}\n\nbool SourceLineResolverBase::LoadModuleUsingMemoryBuffer(\n    const CodeModule *module, char *memory_buffer) {\n  if (!module)\n    return false;\n\n  // Make sure we don't already have a module with the given name.\n  if (modules_->find(module->code_file()) != modules_->end()) {\n    BPLOG(INFO) << \"Symbols for module \" << module->code_file()\n                << \" already loaded\";\n    return false;\n  }\n\n  BPLOG(INFO) << \"Loading symbols for module \" << module->code_file()\n             << \" from memory buffer\";\n\n  Module *basic_module = module_factory_->CreateModule(module->code_file());\n\n  // Ownership of memory is NOT transfered to Module::LoadMapFromMemory().\n  if (!basic_module->LoadMapFromMemory(memory_buffer)) {\n    delete basic_module;\n    return false;\n  }\n\n  modules_->insert(make_pair(module->code_file(), basic_module));\n  return true;\n}\n\nbool SourceLineResolverBase::ShouldDeleteMemoryBufferAfterLoadModule() {\n  return true;\n}\n\nvoid SourceLineResolverBase::UnloadModule(const CodeModule *code_module) {\n  if (!code_module)\n    return;\n\n  ModuleMap::iterator mod_iter = modules_->find(code_module->code_file());\n  if (mod_iter != modules_->end()) {\n    Module *symbol_module = mod_iter->second;\n    delete symbol_module;\n    modules_->erase(mod_iter);\n  }\n\n  if (ShouldDeleteMemoryBufferAfterLoadModule()) {\n    // No-op.  Because we never store any memory buffers.\n  } else {\n    // There may be a buffer stored locally, we need to find and delete it.\n    MemoryMap::iterator iter = memory_buffers_->find(code_module->code_file());\n    if (iter != memory_buffers_->end()) {\n      delete [] iter->second;\n      memory_buffers_->erase(iter);\n    }\n  }\n}\n\nbool SourceLineResolverBase::HasModule(const CodeModule *module) {\n  if (!module)\n    return false;\n  return modules_->find(module->code_file()) != modules_->end();\n}\n\nvoid SourceLineResolverBase::FillSourceLineInfo(StackFrame *frame) {\n  if (frame->module) {\n    ModuleMap::const_iterator it = modules_->find(frame->module->code_file());\n    if (it != modules_->end()) {\n      it->second->LookupAddress(frame);\n    }\n  }\n}\n\nWindowsFrameInfo *SourceLineResolverBase::FindWindowsFrameInfo(\n    const StackFrame *frame) {\n  if (frame->module) {\n    ModuleMap::const_iterator it = modules_->find(frame->module->code_file());\n    if (it != modules_->end()) {\n      return it->second->FindWindowsFrameInfo(frame);\n    }\n  }\n  return NULL;\n}\n\nCFIFrameInfo *SourceLineResolverBase::FindCFIFrameInfo(\n    const StackFrame *frame) {\n  if (frame->module) {\n    ModuleMap::const_iterator it = modules_->find(frame->module->code_file());\n    if (it != modules_->end()) {\n      return it->second->FindCFIFrameInfo(frame);\n    }\n  }\n  return NULL;\n}\n\nbool SourceLineResolverBase::CompareString::operator()(\n    const string &s1, const string &s2) const {\n  return strcmp(s1.c_str(), s2.c_str()) < 0;\n}\n\nbool SourceLineResolverBase::Module::ParseCFIRuleSet(\n    const string &rule_set, CFIFrameInfo *frame_info) const {\n  CFIFrameInfoParseHandler handler(frame_info);\n  CFIRuleParser parser(&handler);\n  return parser.Parse(rule_set);\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/source_line_resolver_base_types.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// source_line_resolver_base_types.h: definition of nested classes/structs in\n// SourceLineResolverBase.  It moves the definitions out of\n// source_line_resolver_base.cc, so that other classes may have access\n// to these private nested types without including source_line_resolver_base.cc\n// In addition, Module is defined as a pure abstract class to be implemented by\n// each concrete source line resolver class.\n//\n// See source_line_resolver_base.h for more documentation.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#include <stdio.h>\n\n#include <map>\n#include <string>\n\n#include \"google_breakpad/processor/source_line_resolver_base.h\"\n#include \"google_breakpad/processor/stack_frame.h\"\n#include \"processor/cfi_frame_info.h\"\n#include \"processor/windows_frame_info.h\"\n\n#ifndef PROCESSOR_SOURCE_LINE_RESOLVER_BASE_TYPES_H__\n#define PROCESSOR_SOURCE_LINE_RESOLVER_BASE_TYPES_H__\n\nnamespace google_breakpad {\n\nclass SourceLineResolverBase::AutoFileCloser {\n public:\n  explicit AutoFileCloser(FILE *file) : file_(file) {}\n  ~AutoFileCloser() {\n    if (file_)\n      fclose(file_);\n  }\n\n private:\n  FILE *file_;\n};\n\nstruct SourceLineResolverBase::Line {\n  Line() { }\n  Line(MemAddr addr, MemAddr code_size, int file_id, int source_line)\n      : address(addr)\n      , size(code_size)\n      , source_file_id(file_id)\n      , line(source_line) { }\n\n  MemAddr address;\n  MemAddr size;\n  int32_t source_file_id;\n  int32_t line;\n};\n\nstruct SourceLineResolverBase::Function {\n  Function() { }\n  Function(const string &function_name,\n           MemAddr function_address,\n           MemAddr code_size,\n           int set_parameter_size)\n      : name(function_name), address(function_address), size(code_size),\n        parameter_size(set_parameter_size) { }\n\n  string name;\n  MemAddr address;\n  MemAddr size;\n\n  // The size of parameters passed to this function on the stack.\n  int32_t parameter_size;\n};\n\nstruct SourceLineResolverBase::PublicSymbol {\n  PublicSymbol() { }\n  PublicSymbol(const string& set_name,\n               MemAddr set_address,\n               int set_parameter_size)\n      : name(set_name),\n        address(set_address),\n        parameter_size(set_parameter_size) {}\n\n  string name;\n  MemAddr address;\n\n  // If the public symbol is used as a function entry point, parameter_size\n  // is set to the size of the parameters passed to the funciton on the\n  // stack, if known.\n  int32_t parameter_size;\n};\n\nclass SourceLineResolverBase::Module {\n public:\n  virtual ~Module() { };\n  // Loads a map from the given buffer in char* type.\n  // Does NOT take ownership of memory_buffer (the caller, source line resolver,\n  // is the owner of memory_buffer).\n  virtual bool LoadMapFromMemory(char *memory_buffer) = 0;\n\n  // Looks up the given relative address, and fills the StackFrame struct\n  // with the result.\n  virtual void LookupAddress(StackFrame *frame) const = 0;\n\n  // If Windows stack walking information is available covering ADDRESS,\n  // return a WindowsFrameInfo structure describing it. If the information\n  // is not available, returns NULL. A NULL return value does not indicate\n  // an error. The caller takes ownership of any returned WindowsFrameInfo\n  // object.\n  virtual WindowsFrameInfo *\n  FindWindowsFrameInfo(const StackFrame *frame) const = 0;\n\n  // If CFI stack walking information is available covering ADDRESS,\n  // return a CFIFrameInfo structure describing it. If the information\n  // is not available, return NULL. The caller takes ownership of any\n  // returned CFIFrameInfo object.\n  virtual CFIFrameInfo *FindCFIFrameInfo(const StackFrame *frame) const = 0;\n protected:\n  virtual bool ParseCFIRuleSet(const string &rule_set,\n                               CFIFrameInfo *frame_info) const;\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_SOURCE_LINE_RESOLVER_BASE_TYPES_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stackwalker.cc: Generic stackwalker.\n//\n// See stackwalker.h for documentation.\n//\n// Author: Mark Mentovai\n\n#include \"google_breakpad/processor/stackwalker.h\"\n\n#include <assert.h>\n\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/code_module.h\"\n#include \"google_breakpad/processor/code_modules.h\"\n#include \"google_breakpad/processor/minidump.h\"\n#include \"google_breakpad/processor/source_line_resolver_interface.h\"\n#include \"google_breakpad/processor/stack_frame.h\"\n#include \"google_breakpad/processor/symbol_supplier.h\"\n#include \"google_breakpad/processor/system_info.h\"\n#include \"processor/linked_ptr.h\"\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n#include \"processor/stackwalker_ppc.h\"\n#include \"processor/stackwalker_sparc.h\"\n#include \"processor/stackwalker_x86.h\"\n#include \"processor/stackwalker_amd64.h\"\n#include \"processor/stackwalker_arm.h\"\n\nnamespace google_breakpad {\n\nu_int32_t Stackwalker::max_frames_ = 1024;\n\nStackwalker::Stackwalker(const SystemInfo *system_info,\n                         MemoryRegion *memory,\n                         const CodeModules *modules,\n                         SymbolSupplier *supplier,\n                         SourceLineResolverInterface *resolver)\n    : system_info_(system_info),\n      memory_(memory),\n      modules_(modules),\n      resolver_(resolver),\n      supplier_(supplier) {\n}\n\n\nbool Stackwalker::Walk(CallStack *stack) {\n  BPLOG_IF(ERROR, !stack) << \"Stackwalker::Walk requires |stack|\";\n  assert(stack);\n  stack->Clear();\n\n  // Begin with the context frame, and keep getting callers until there are\n  // no more.\n\n  // Take ownership of the pointer returned by GetContextFrame.\n  scoped_ptr<StackFrame> frame(GetContextFrame());\n\n  while (frame.get()) {\n    // frame already contains a good frame with properly set instruction and\n    // frame_pointer fields.  The frame structure comes from either the\n    // context frame (above) or a caller frame (below).\n\n    // Resolve the module information, if a module map was provided.\n    if (modules_) {\n      const CodeModule *module =\n          modules_->GetModuleForAddress(frame->instruction);\n      if (module) {\n        frame->module = module;\n        if (resolver_ &&\n            !resolver_->HasModule(frame->module) &&\n            no_symbol_modules_.find(\n                module->code_file()) == no_symbol_modules_.end() &&\n            supplier_) {\n          string symbol_file;\n          char *symbol_data = NULL;\n          SymbolSupplier::SymbolResult symbol_result =\n              supplier_->GetCStringSymbolData(module,\n                                              system_info_,\n                                              &symbol_file,\n                                              &symbol_data);\n\n          switch (symbol_result) {\n            case SymbolSupplier::FOUND:\n              resolver_->LoadModuleUsingMemoryBuffer(frame->module,\n                                                     symbol_data);\n              break;\n            case SymbolSupplier::NOT_FOUND:\n              no_symbol_modules_.insert(module->code_file());\n              break;  // nothing to do\n            case SymbolSupplier::INTERRUPT:\n              return false;\n          }\n          // Inform symbol supplier to free the unused data memory buffer.\n          if (resolver_->ShouldDeleteMemoryBufferAfterLoadModule())\n            supplier_->FreeSymbolData(module);\n        }\n        if (resolver_)\n          resolver_->FillSourceLineInfo(frame.get());\n      }\n    }\n\n    // Add the frame to the call stack.  Relinquish the ownership claim\n    // over the frame, because the stack now owns it.\n    stack->frames_.push_back(frame.release());\n    if (stack->frames_.size() > max_frames_) {\n      BPLOG(ERROR) << \"The stack is over \" << max_frames_ << \" frames.\";\n      break;\n    }\n\n    // Get the next frame and take ownership.\n    frame.reset(GetCallerFrame(stack));\n  }\n\n  return true;\n}\n\n\n// static\nStackwalker* Stackwalker::StackwalkerForCPU(\n    const SystemInfo *system_info,\n    MinidumpContext *context,\n    MemoryRegion *memory,\n    const CodeModules *modules,\n    SymbolSupplier *supplier,\n    SourceLineResolverInterface *resolver) {\n  if (!context) {\n    BPLOG(ERROR) << \"Can't choose a stackwalker implementation without context\";\n    return NULL;\n  }\n\n  Stackwalker *cpu_stackwalker = NULL;\n\n  u_int32_t cpu = context->GetContextCPU();\n  switch (cpu) {\n    case MD_CONTEXT_X86:\n      cpu_stackwalker = new StackwalkerX86(system_info,\n                                           context->GetContextX86(),\n                                           memory, modules, supplier,\n                                           resolver);\n      break;\n\n    case MD_CONTEXT_PPC:\n      cpu_stackwalker = new StackwalkerPPC(system_info,\n                                           context->GetContextPPC(),\n                                           memory, modules, supplier,\n                                           resolver);\n      break;\n\n    case MD_CONTEXT_AMD64:\n      cpu_stackwalker = new StackwalkerAMD64(system_info,\n                                             context->GetContextAMD64(),\n                                             memory, modules, supplier,\n                                             resolver);\n      break;\n\n    case MD_CONTEXT_SPARC:\n      cpu_stackwalker = new StackwalkerSPARC(system_info,\n                                             context->GetContextSPARC(),\n                                             memory, modules, supplier,\n                                             resolver);\n      break;\n\n    case MD_CONTEXT_ARM:\n      int fp_register = -1;\n      if (system_info->os_short == \"ios\")\n        fp_register = MD_CONTEXT_ARM_REG_IOS_FP;\n      cpu_stackwalker = new StackwalkerARM(system_info,\n                                           context->GetContextARM(),\n\t\t\t\t\t   fp_register, memory, modules,\n\t\t\t\t\t   supplier, resolver);\n      break;\n  }\n\n  BPLOG_IF(ERROR, !cpu_stackwalker) << \"Unknown CPU type \" << HexString(cpu) <<\n                                       \", can't choose a stackwalker \"\n                                       \"implementation\";\n  return cpu_stackwalker;\n}\n\nbool Stackwalker::InstructionAddressSeemsValid(u_int64_t address) {\n  const CodeModule *module = modules_->GetModuleForAddress(address);\n  if (!module) {\n    // not inside any loaded module\n    return false;\n  }\n\n  if (!resolver_ || !supplier_) {\n    // we don't have a resolver and or symbol supplier,\n    // but we're inside a known module\n    return true;\n  }\n\n  if (!resolver_->HasModule(module)) {\n    string symbol_file;\n    char *symbol_data = NULL;\n    SymbolSupplier::SymbolResult symbol_result =\n      supplier_->GetCStringSymbolData(module, system_info_,\n                                      &symbol_file, &symbol_data);\n\n    if (symbol_result != SymbolSupplier::FOUND ||\n        !resolver_->LoadModuleUsingMemoryBuffer(module,\n                                             symbol_data)) {\n      // we don't have symbols, but we're inside a loaded module\n      return true;\n    }\n  }\n\n  StackFrame frame;\n  frame.module = module;\n  frame.instruction = address;\n  resolver_->FillSourceLineInfo(&frame);\n  // we have symbols, so return true if inside a function\n  return !frame.function_name.empty();\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_amd64.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stackwalker_amd64.cc: amd64-specific stackwalker.\n//\n// See stackwalker_amd64.h for documentation.\n//\n// Author: Mark Mentovai, Ted Mielczarek\n\n\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/memory_region.h\"\n#include \"google_breakpad/processor/source_line_resolver_interface.h\"\n#include \"google_breakpad/processor/stack_frame_cpu.h\"\n#include \"processor/cfi_frame_info.h\"\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n#include \"processor/stackwalker_amd64.h\"\n\nnamespace google_breakpad {\n\n\nconst StackwalkerAMD64::CFIWalker::RegisterSet\nStackwalkerAMD64::cfi_register_map_[] = {\n  // It may seem like $rip and $rsp are callee-saves, because the callee is\n  // responsible for having them restored upon return. But the callee_saves\n  // flags here really means that the walker should assume they're\n  // unchanged if the CFI doesn't mention them --- clearly wrong for $rip\n  // and $rsp.\n  { \"$rax\", NULL, false,\n    StackFrameAMD64::CONTEXT_VALID_RAX, &MDRawContextAMD64::rax },\n  { \"$rdx\", NULL, false,\n    StackFrameAMD64::CONTEXT_VALID_RDX, &MDRawContextAMD64::rdx },\n  { \"$rcx\", NULL, false,\n    StackFrameAMD64::CONTEXT_VALID_RCX, &MDRawContextAMD64::rcx },\n  { \"$rbx\", NULL, true,\n    StackFrameAMD64::CONTEXT_VALID_RBX, &MDRawContextAMD64::rbx },\n  { \"$rsi\", NULL, false,\n    StackFrameAMD64::CONTEXT_VALID_RSI, &MDRawContextAMD64::rsi },\n  { \"$rdi\", NULL, false,\n    StackFrameAMD64::CONTEXT_VALID_RDI, &MDRawContextAMD64::rdi },\n  { \"$rbp\", NULL, true,\n    StackFrameAMD64::CONTEXT_VALID_RBP, &MDRawContextAMD64::rbp },\n  { \"$rsp\", \".cfa\", false,\n    StackFrameAMD64::CONTEXT_VALID_RSP, &MDRawContextAMD64::rsp },\n  { \"$r8\", NULL, false,\n    StackFrameAMD64::CONTEXT_VALID_R8,  &MDRawContextAMD64::r8 },\n  { \"$r9\", NULL, false,\n    StackFrameAMD64::CONTEXT_VALID_R9,  &MDRawContextAMD64::r9 },\n  { \"$r10\", NULL, false,\n    StackFrameAMD64::CONTEXT_VALID_R10, &MDRawContextAMD64::r10 },\n  { \"$r11\", NULL, false,\n    StackFrameAMD64::CONTEXT_VALID_R11, &MDRawContextAMD64::r11 },\n  { \"$r12\", NULL, true,\n    StackFrameAMD64::CONTEXT_VALID_R12, &MDRawContextAMD64::r12 },\n  { \"$r13\", NULL, true,\n    StackFrameAMD64::CONTEXT_VALID_R13, &MDRawContextAMD64::r13 },\n  { \"$r14\", NULL, true,\n    StackFrameAMD64::CONTEXT_VALID_R14, &MDRawContextAMD64::r14 },\n  { \"$r15\", NULL, true,\n    StackFrameAMD64::CONTEXT_VALID_R15, &MDRawContextAMD64::r15 },\n  { \"$rip\", \".ra\", false,\n    StackFrameAMD64::CONTEXT_VALID_RIP, &MDRawContextAMD64::rip },\n};\n\nStackwalkerAMD64::StackwalkerAMD64(const SystemInfo *system_info,\n                                   const MDRawContextAMD64 *context,\n                                   MemoryRegion *memory,\n                                   const CodeModules *modules,\n                                   SymbolSupplier *supplier,\n                                   SourceLineResolverInterface *resolver)\n    : Stackwalker(system_info, memory, modules, supplier, resolver),\n      context_(context),\n      cfi_walker_(cfi_register_map_,\n                  (sizeof(cfi_register_map_) / sizeof(cfi_register_map_[0]))) {\n}\n\n\nStackFrame* StackwalkerAMD64::GetContextFrame() {\n  if (!context_ || !memory_) {\n    BPLOG(ERROR) << \"Can't get context frame without context or memory\";\n    return NULL;\n  }\n\n  StackFrameAMD64 *frame = new StackFrameAMD64();\n\n  // The instruction pointer is stored directly in a register, so pull it\n  // straight out of the CPU context structure.\n  frame->context = *context_;\n  frame->context_validity = StackFrameAMD64::CONTEXT_VALID_ALL;\n  frame->trust = StackFrame::FRAME_TRUST_CONTEXT;\n  frame->instruction = frame->context.rip;\n\n  return frame;\n}\n\nStackFrameAMD64 *StackwalkerAMD64::GetCallerByCFIFrameInfo(\n    const vector<StackFrame *> &frames,\n    CFIFrameInfo *cfi_frame_info) {\n  StackFrameAMD64 *last_frame = static_cast<StackFrameAMD64*>(frames.back());\n\n  scoped_ptr<StackFrameAMD64> frame(new StackFrameAMD64());\n  if (!cfi_walker_\n      .FindCallerRegisters(*memory_, *cfi_frame_info,\n                           last_frame->context, last_frame->context_validity,\n                           &frame->context, &frame->context_validity))\n    return NULL;\n\n  // Make sure we recovered all the essentials.\n  static const int essentials = (StackFrameAMD64::CONTEXT_VALID_RIP\n                                 | StackFrameAMD64::CONTEXT_VALID_RSP);\n  if ((frame->context_validity & essentials) != essentials)\n    return NULL;\n\n  frame->trust = StackFrame::FRAME_TRUST_CFI;\n  return frame.release();\n}\n\nStackFrameAMD64 *StackwalkerAMD64::GetCallerByStackScan(\n    const vector<StackFrame *> &frames) {\n  StackFrameAMD64 *last_frame = static_cast<StackFrameAMD64 *>(frames.back());\n  u_int64_t last_rsp = last_frame->context.rsp;\n  u_int64_t caller_rip_address, caller_rip;\n\n  if (!ScanForReturnAddress(last_rsp, &caller_rip_address, &caller_rip)) {\n    // No plausible return address was found.\n    return NULL;\n  }\n\n  // Create a new stack frame (ownership will be transferred to the caller)\n  // and fill it in.\n  StackFrameAMD64 *frame = new StackFrameAMD64();\n\n  frame->trust = StackFrame::FRAME_TRUST_SCAN;\n  frame->context = last_frame->context;\n  frame->context.rip = caller_rip;\n  // The caller's %rsp is directly underneath the return address pushed by\n  // the call.\n  frame->context.rsp = caller_rip_address + 8;\n  frame->context_validity = StackFrameAMD64::CONTEXT_VALID_RIP |\n                            StackFrameAMD64::CONTEXT_VALID_RSP;\n\n  // Other unwinders give up if they don't have an %rbp value, so see if we\n  // can pass some plausible value on.\n  if (last_frame->context_validity & StackFrameAMD64::CONTEXT_VALID_RBP) {\n    // Functions typically push their caller's %rbp immediately upon entry,\n    // and then set %rbp to point to that. So if the callee's %rbp is\n    // pointing to the first word below the alleged return address, presume\n    // that the caller's %rbp is saved there.\n    if (caller_rip_address - 8 == last_frame->context.rbp) {\n      u_int64_t caller_rbp = 0;\n      if (memory_->GetMemoryAtAddress(last_frame->context.rbp, &caller_rbp) &&\n          caller_rbp > caller_rip_address) {\n        frame->context.rbp = caller_rbp;\n        frame->context_validity |= StackFrameAMD64::CONTEXT_VALID_RBP;\n      }\n    } else if (last_frame->context.rbp >= caller_rip_address + 8) {\n      // If the callee's %rbp is plausible as a value for the caller's\n      // %rbp, presume that the callee left it unchanged.\n      frame->context.rbp = last_frame->context.rbp;\n      frame->context_validity |= StackFrameAMD64::CONTEXT_VALID_RBP;\n    }\n  }\n\n  return frame;\n}\n\nStackFrame* StackwalkerAMD64::GetCallerFrame(const CallStack *stack) {\n  if (!memory_ || !stack) {\n    BPLOG(ERROR) << \"Can't get caller frame without memory or stack\";\n    return NULL;\n  }\n\n  const vector<StackFrame *> &frames = *stack->frames();\n  StackFrameAMD64 *last_frame = static_cast<StackFrameAMD64 *>(frames.back());\n  scoped_ptr<StackFrameAMD64> new_frame;\n\n  // If we have DWARF CFI information, use it.\n  scoped_ptr<CFIFrameInfo> cfi_frame_info(\n      resolver_ ? resolver_->FindCFIFrameInfo(last_frame) : NULL);\n  if (cfi_frame_info.get())\n    new_frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get()));\n\n  // If CFI failed, or there wasn't CFI available, fall back\n  // to stack scanning.\n  if (!new_frame.get()) {\n    new_frame.reset(GetCallerByStackScan(frames));\n  }\n\n  // If nothing worked, tell the caller.\n  if (!new_frame.get())\n    return NULL;\n\n  // Treat an instruction address of 0 as end-of-stack.\n  if (new_frame->context.rip == 0)\n    return NULL;\n\n  // If the new stack pointer is at a lower address than the old, then\n  // that's clearly incorrect. Treat this as end-of-stack to enforce\n  // progress and avoid infinite loops.\n  if (new_frame->context.rsp <= last_frame->context.rsp)\n    return NULL;\n\n  // new_frame->context.rip is the return address, which is one instruction\n  // past the CALL that caused us to arrive at the callee. Set\n  // new_frame->instruction to one less than that. This won't reference the\n  // beginning of the CALL instruction, but it's guaranteed to be within\n  // the CALL, which is sufficient to get the source line information to\n  // match up with the line that contains a function call. Callers that\n  // require the exact return address value may access the context.rip\n  // field of StackFrameAMD64.\n  new_frame->instruction = new_frame->context.rip - 1;\n\n  return new_frame.release();\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_amd64.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stackwalker_amd64.h: amd64-specific stackwalker.\n//\n// Provides stack frames given amd64 register context and a memory region\n// corresponding to a amd64 stack.\n//\n// Author: Mark Mentovai, Ted Mielczarek\n\n\n#ifndef PROCESSOR_STACKWALKER_AMD64_H__\n#define PROCESSOR_STACKWALKER_AMD64_H__\n\n\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"google_breakpad/processor/stackwalker.h\"\n#include \"google_breakpad/processor/stack_frame_cpu.h\"\n#include \"processor/cfi_frame_info.h\"\n\nnamespace google_breakpad {\n\nclass CodeModules;\n\nclass StackwalkerAMD64 : public Stackwalker {\n public:\n  // context is a amd64 context object that gives access to amd64-specific\n  // register state corresponding to the innermost called frame to be\n  // included in the stack.  The other arguments are passed directly through\n  // to the base Stackwalker constructor.\n  StackwalkerAMD64(const SystemInfo *system_info,\n                   const MDRawContextAMD64 *context,\n                   MemoryRegion *memory,\n                   const CodeModules *modules,\n                   SymbolSupplier *supplier,\n                   SourceLineResolverInterface *resolver);\n\n private:\n  // A STACK CFI-driven frame walker for the AMD64\n  typedef SimpleCFIWalker<u_int64_t, MDRawContextAMD64> CFIWalker;\n\n  // Implementation of Stackwalker, using amd64 context (stack pointer in %rsp,\n  // stack base in %rbp) and stack conventions (saved stack pointer at 0(%rbp))\n  virtual StackFrame* GetContextFrame();\n  virtual StackFrame* GetCallerFrame(const CallStack *stack);\n\n  // Use cfi_frame_info (derived from STACK CFI records) to construct\n  // the frame that called frames.back(). The caller takes ownership\n  // of the returned frame. Return NULL on failure.\n  StackFrameAMD64 *GetCallerByCFIFrameInfo(const vector<StackFrame *> &frames,\n                                           CFIFrameInfo *cfi_frame_info);\n\n  // Scan the stack for plausible return addresses. The caller takes ownership\n  // of the returned frame. Return NULL on failure. \n  StackFrameAMD64 *GetCallerByStackScan(const vector<StackFrame *> &frames);\n\n  // Stores the CPU context corresponding to the innermost stack frame to\n  // be returned by GetContextFrame.\n  const MDRawContextAMD64 *context_;\n\n  // Our register map, for cfi_walker_.\n  static const CFIWalker::RegisterSet cfi_register_map_[];\n\n  // Our CFI frame walker.\n  const CFIWalker cfi_walker_;\n};\n\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_STACKWALKER_AMD64_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_amd64_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// stackwalker_amd64_unittest.cc: Unit tests for StackwalkerAMD64 class.\n\n#include <string>\n#include <string.h>\n#include <vector>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/test_assembler.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"google_breakpad/processor/basic_source_line_resolver.h\"\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/source_line_resolver_interface.h\"\n#include \"google_breakpad/processor/stack_frame_cpu.h\"\n#include \"processor/stackwalker_unittest_utils.h\"\n#include \"processor/stackwalker_amd64.h\"\n\nusing google_breakpad::BasicSourceLineResolver;\nusing google_breakpad::CallStack;\nusing google_breakpad::StackFrame;\nusing google_breakpad::StackFrameAMD64;\nusing google_breakpad::StackwalkerAMD64;\nusing google_breakpad::SystemInfo;\nusing google_breakpad::test_assembler::kLittleEndian;\nusing google_breakpad::test_assembler::Label;\nusing google_breakpad::test_assembler::Section;\nusing std::string;\nusing std::vector;\nusing testing::_;\nusing testing::Return;\nusing testing::SetArgumentPointee;\nusing testing::Test;\n\nclass StackwalkerAMD64Fixture {\n public:\n  StackwalkerAMD64Fixture()\n    : stack_section(kLittleEndian),\n      // Give the two modules reasonable standard locations and names\n      // for tests to play with.\n      module1(0x40000000c0000000ULL, 0x10000, \"module1\", \"version1\"),\n      module2(0x50000000b0000000ULL, 0x10000, \"module2\", \"version2\") {\n    // Identify the system as a Linux system.\n    system_info.os = \"Linux\";\n    system_info.os_short = \"linux\";\n    system_info.os_version = \"Horrendous Hippo\";\n    system_info.cpu = \"x86\";\n    system_info.cpu_info = \"\";\n\n    // Put distinctive values in the raw CPU context.\n    BrandContext(&raw_context);\n\n    // Create some modules with some stock debugging information.\n    modules.Add(&module1);\n    modules.Add(&module2);\n\n    // By default, none of the modules have symbol info; call\n    // SetModuleSymbols to override this.\n    EXPECT_CALL(supplier, GetCStringSymbolData(_, _, _, _))\n      .WillRepeatedly(Return(MockSymbolSupplier::NOT_FOUND));\n  }\n\n  // Set the Breakpad symbol information that supplier should return for\n  // MODULE to INFO.\n  void SetModuleSymbols(MockCodeModule *module, const string &info) {\n    unsigned int buffer_size = info.size() + 1;\n    char *buffer = reinterpret_cast<char*>(operator new(buffer_size));\n    strcpy(buffer, info.c_str());\n    EXPECT_CALL(supplier, GetCStringSymbolData(module, &system_info, _, _))\n      .WillRepeatedly(DoAll(SetArgumentPointee<3>(buffer),\n                            Return(MockSymbolSupplier::FOUND)));\n  }\n\n  // Populate stack_region with the contents of stack_section. Use\n  // stack_section.start() as the region's starting address.\n  void RegionFromSection() {\n    string contents;\n    ASSERT_TRUE(stack_section.GetContents(&contents));\n    stack_region.Init(stack_section.start().Value(), contents);\n  }\n\n  // Fill RAW_CONTEXT with pseudo-random data, for round-trip checking.\n  void BrandContext(MDRawContextAMD64 *raw_context) {\n    u_int8_t x = 173;\n    for (size_t i = 0; i < sizeof(*raw_context); i++)\n      reinterpret_cast<u_int8_t *>(raw_context)[i] = (x += 17);\n  }\n  \n  SystemInfo system_info;\n  MDRawContextAMD64 raw_context;\n  Section stack_section;\n  MockMemoryRegion stack_region;\n  MockCodeModule module1;\n  MockCodeModule module2;\n  MockCodeModules modules;\n  MockSymbolSupplier supplier;\n  BasicSourceLineResolver resolver;\n  CallStack call_stack;\n  const vector<StackFrame *> *frames;\n};\n\nclass GetContextFrame: public StackwalkerAMD64Fixture, public Test { };\n\nclass SanityCheck: public StackwalkerAMD64Fixture, public Test { };\n\nTEST_F(SanityCheck, NoResolver) {\n  // There should be no references to the stack in this walk: we don't\n  // provide any call frame information, so trying to reconstruct the\n  // context frame's caller should fail. So there's no need for us to\n  // provide stack contents.\n  raw_context.rip = 0x40000000c0000200ULL;\n  raw_context.rbp = 0x8000000080000000ULL;\n\n  StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules,\n                          NULL, NULL);\n  // This should succeed even without a resolver or supplier.\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_GE(1U, frames->size());\n  StackFrameAMD64 *frame = static_cast<StackFrameAMD64 *>(frames->at(0));\n  // Check that the values from the original raw context made it\n  // through to the context in the stack frame.\n  EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context)));\n}\n\nTEST_F(GetContextFrame, Simple) {\n  // There should be no references to the stack in this walk: we don't\n  // provide any call frame information, so trying to reconstruct the\n  // context frame's caller should fail. So there's no need for us to\n  // provide stack contents.\n  raw_context.rip = 0x40000000c0000200ULL;\n  raw_context.rbp = 0x8000000080000000ULL;\n\n  StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules,\n                          &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_GE(1U, frames->size());\n  StackFrameAMD64 *frame = static_cast<StackFrameAMD64 *>(frames->at(0));\n  // Check that the values from the original raw context made it\n  // through to the context in the stack frame.\n  EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context)));\n}\n\nclass GetCallerFrame: public StackwalkerAMD64Fixture, public Test { };\n\nTEST_F(GetCallerFrame, ScanWithoutSymbols) {\n  // When the stack walker resorts to scanning the stack,\n  // only addresses located within loaded modules are\n  // considered valid return addresses.\n  // Force scanning through three frames to ensure that the\n  // stack pointer is set properly in scan-recovered frames.\n  stack_section.start() = 0x8000000080000000ULL;\n  u_int64_t return_address1 = 0x50000000b0000100ULL;\n  u_int64_t return_address2 = 0x50000000b0000900ULL;\n  Label frame1_sp, frame2_sp, frame1_rbp;\n  stack_section\n    // frame 0\n    .Append(16, 0)                      // space\n\n    .D64(0x40000000b0000000ULL)         // junk that's not\n    .D64(0x50000000d0000000ULL)         // a return address\n\n    .D64(return_address1)               // actual return address\n    // frame 1\n    .Mark(&frame1_sp)\n    .Append(16, 0)                      // space\n\n    .D64(0x40000000b0000000ULL)         // more junk\n    .D64(0x50000000d0000000ULL)\n\n    .Mark(&frame1_rbp)\n    .D64(stack_section.start())         // This is in the right place to be\n                                        // a saved rbp, but it's bogus, so\n                                        // we shouldn't report it.\n\n    .D64(return_address2)               // actual return address\n    // frame 2\n    .Mark(&frame2_sp)\n    .Append(32, 0);                     // end of stack\n\n  RegionFromSection();\n    \n  raw_context.rip = 0x40000000c0000200ULL;\n  raw_context.rbp = frame1_rbp.Value();\n  raw_context.rsp = stack_section.start().Value();\n\n  StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules,\n                          &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(3U, frames->size());\n\n  StackFrameAMD64 *frame0 = static_cast<StackFrameAMD64 *>(frames->at(0));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n  ASSERT_EQ(StackFrameAMD64::CONTEXT_VALID_ALL, frame0->context_validity);\n  EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context)));\n\n  StackFrameAMD64 *frame1 = static_cast<StackFrameAMD64 *>(frames->at(1));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust);\n  ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP |\n             StackFrameAMD64::CONTEXT_VALID_RSP |\n             StackFrameAMD64::CONTEXT_VALID_RBP),\n            frame1->context_validity);\n  EXPECT_EQ(return_address1, frame1->context.rip);\n  EXPECT_EQ(frame1_sp.Value(), frame1->context.rsp);\n  EXPECT_EQ(frame1_rbp.Value(), frame1->context.rbp);\n\n  StackFrameAMD64 *frame2 = static_cast<StackFrameAMD64 *>(frames->at(2));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame2->trust);\n  ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP |\n             StackFrameAMD64::CONTEXT_VALID_RSP),\n            frame2->context_validity);\n  EXPECT_EQ(return_address2, frame2->context.rip);\n  EXPECT_EQ(frame2_sp.Value(), frame2->context.rsp);\n}\n\nTEST_F(GetCallerFrame, ScanWithFunctionSymbols) {\n  // During stack scanning, if a potential return address\n  // is located within a loaded module that has symbols,\n  // it is only considered a valid return address if it\n  // lies within a function's bounds.\n  stack_section.start() = 0x8000000080000000ULL;\n  u_int64_t return_address = 0x50000000b0000110ULL;\n  Label frame1_sp, frame1_rbp;\n\n  stack_section\n    // frame 0\n    .Append(16, 0)                      // space\n\n    .D64(0x40000000b0000000ULL)         // junk that's not\n    .D64(0x50000000b0000000ULL)         // a return address\n\n    .D64(0x40000000c0001000ULL)         // a couple of plausible addresses\n    .D64(0x50000000b000aaaaULL)         // that are not within functions\n\n    .D64(return_address)                // actual return address\n    // frame 1\n    .Mark(&frame1_sp)\n    .Append(32, 0)                      // end of stack\n    .Mark(&frame1_rbp);\n  RegionFromSection();\n    \n  raw_context.rip = 0x40000000c0000200ULL;\n  raw_context.rbp = frame1_rbp.Value();\n  raw_context.rsp = stack_section.start().Value();\n\n  SetModuleSymbols(&module1,\n                   // The youngest frame's function.\n                   \"FUNC 100 400 10 platypus\\n\");\n  SetModuleSymbols(&module2,\n                   // The calling frame's function.\n                   \"FUNC 100 400 10 echidna\\n\");\n\n  StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules,\n                          &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(2U, frames->size());\n\n  StackFrameAMD64 *frame0 = static_cast<StackFrameAMD64 *>(frames->at(0));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n  ASSERT_EQ(StackFrameAMD64::CONTEXT_VALID_ALL, frame0->context_validity);\n  EXPECT_EQ(\"platypus\", frame0->function_name);\n  EXPECT_EQ(0x40000000c0000100ULL, frame0->function_base);\n\n  StackFrameAMD64 *frame1 = static_cast<StackFrameAMD64 *>(frames->at(1));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust);\n  ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP |\n             StackFrameAMD64::CONTEXT_VALID_RSP |\n             StackFrameAMD64::CONTEXT_VALID_RBP),\n            frame1->context_validity);\n  EXPECT_EQ(return_address, frame1->context.rip);\n  EXPECT_EQ(frame1_sp.Value(), frame1->context.rsp);\n  EXPECT_EQ(frame1_rbp.Value(), frame1->context.rbp);\n  EXPECT_EQ(\"echidna\", frame1->function_name);\n  EXPECT_EQ(0x50000000b0000100ULL, frame1->function_base);\n}\n\nTEST_F(GetCallerFrame, CallerPushedRBP) {\n  // Functions typically push their %rbp upon entry and set %rbp pointing\n  // there.  If stackwalking finds a plausible address for the next frame's\n  // %rbp directly below the return address, assume that it is indeed the\n  // next frame's %rbp.\n  stack_section.start() = 0x8000000080000000ULL;\n  u_int64_t return_address = 0x50000000b0000110ULL;\n  Label frame0_rbp, frame1_sp, frame1_rbp;\n\n  stack_section\n    // frame 0\n    .Append(16, 0)                      // space\n\n    .D64(0x40000000b0000000ULL)         // junk that's not\n    .D64(0x50000000b0000000ULL)         // a return address\n\n    .D64(0x40000000c0001000ULL)         // a couple of plausible addresses\n    .D64(0x50000000b000aaaaULL)         // that are not within functions\n\n    .Mark(&frame0_rbp)\n    .D64(frame1_rbp)                    // caller-pushed %rbp\n    .D64(return_address)                // actual return address\n    // frame 1\n    .Mark(&frame1_sp)\n    .Append(32, 0)                      // body of frame1\n    .Mark(&frame1_rbp);                 // end of stack\n  RegionFromSection();\n\n  raw_context.rip = 0x40000000c0000200ULL;\n  raw_context.rbp = frame0_rbp.Value();\n  raw_context.rsp = stack_section.start().Value();\n\n  SetModuleSymbols(&module1,\n                   // The youngest frame's function.\n                   \"FUNC 100 400 10 sasquatch\\n\");\n  SetModuleSymbols(&module2,\n                   // The calling frame's function.\n                   \"FUNC 100 400 10 yeti\\n\");\n\n  StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules,\n                          &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(2U, frames->size());\n\n  StackFrameAMD64 *frame0 = static_cast<StackFrameAMD64 *>(frames->at(0));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n  ASSERT_EQ(StackFrameAMD64::CONTEXT_VALID_ALL, frame0->context_validity);\n  EXPECT_EQ(frame0_rbp.Value(), frame0->context.rbp);\n  EXPECT_EQ(\"sasquatch\", frame0->function_name);\n  EXPECT_EQ(0x40000000c0000100ULL, frame0->function_base);\n\n  StackFrameAMD64 *frame1 = static_cast<StackFrameAMD64 *>(frames->at(1));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust);\n  ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP |\n             StackFrameAMD64::CONTEXT_VALID_RSP |\n             StackFrameAMD64::CONTEXT_VALID_RBP),\n            frame1->context_validity);\n  EXPECT_EQ(return_address, frame1->context.rip);\n  EXPECT_EQ(frame1_sp.Value(), frame1->context.rsp);\n  EXPECT_EQ(frame1_rbp.Value(), frame1->context.rbp);\n  EXPECT_EQ(\"yeti\", frame1->function_name);\n  EXPECT_EQ(0x50000000b0000100ULL, frame1->function_base);\n}\n\nstruct CFIFixture: public StackwalkerAMD64Fixture {\n  CFIFixture() {\n    // Provide a bunch of STACK CFI records; we'll walk to the caller\n    // from every point in this series, expecting to find the same set\n    // of register values.\n    SetModuleSymbols(&module1,\n                     // The youngest frame's function.\n                     \"FUNC 4000 1000 10 enchiridion\\n\"\n                     // Initially, just a return address.\n                     \"STACK CFI INIT 4000 100 .cfa: $rsp 8 + .ra: .cfa 8 - ^\\n\"\n                     // Push %rbx.\n                     \"STACK CFI 4001 .cfa: $rsp 16 + $rbx: .cfa 16 - ^\\n\"\n                     // Save %r12 in %rbx.  Weird, but permitted.\n                     \"STACK CFI 4002 $r12: $rbx\\n\"\n                     // Allocate frame space, and save %r13.\n                     \"STACK CFI 4003 .cfa: $rsp 40 + $r13: .cfa 32 - ^\\n\"\n                     // Put the return address in %r13.\n                     \"STACK CFI 4005 .ra: $r13\\n\"\n                     // Save %rbp, and use it as a frame pointer.\n                     \"STACK CFI 4006 .cfa: $rbp 16 + $rbp: .cfa 24 - ^\\n\"\n\n                     // The calling function.\n                     \"FUNC 5000 1000 10 epictetus\\n\"\n                     // Mark it as end of stack.\n                     \"STACK CFI INIT 5000 1000 .cfa: $rsp .ra 0\\n\");\n\n    // Provide some distinctive values for the caller's registers.\n    expected.rsp = 0x8000000080000000ULL;\n    expected.rip = 0x40000000c0005510ULL;\n    expected.rbp = 0x68995b1de4700266ULL;\n    expected.rbx = 0x5a5beeb38de23be8ULL;\n    expected.r12 = 0xed1b02e8cc0fc79cULL;\n    expected.r13 = 0x1d20ad8acacbe930ULL;\n    expected.r14 = 0xe94cffc2f7adaa28ULL;\n    expected.r15 = 0xb638d17d8da413b5ULL;\n\n    // By default, registers are unchanged.\n    raw_context = expected;\n  }\n\n  // Walk the stack, using stack_section as the contents of the stack\n  // and raw_context as the current register values. (Set\n  // raw_context.rsp to the stack's starting address.) Expect two\n  // stack frames; in the older frame, expect the callee-saves\n  // registers to have values matching those in 'expected'.\n  void CheckWalk() {\n    RegionFromSection();\n    raw_context.rsp = stack_section.start().Value();\n\n    StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules,\n                          &supplier, &resolver);\n    ASSERT_TRUE(walker.Walk(&call_stack));\n    frames = call_stack.frames();\n    ASSERT_EQ(2U, frames->size());\n\n    StackFrameAMD64 *frame0 = static_cast<StackFrameAMD64 *>(frames->at(0));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n    ASSERT_EQ(StackFrameAMD64::CONTEXT_VALID_ALL, frame0->context_validity);\n    EXPECT_EQ(\"enchiridion\", frame0->function_name);\n    EXPECT_EQ(0x40000000c0004000ULL, frame0->function_base);\n\n    StackFrameAMD64 *frame1 = static_cast<StackFrameAMD64 *>(frames->at(1));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust);\n    ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP |\n               StackFrameAMD64::CONTEXT_VALID_RSP |\n               StackFrameAMD64::CONTEXT_VALID_RBP |\n               StackFrameAMD64::CONTEXT_VALID_RBX |\n               StackFrameAMD64::CONTEXT_VALID_R12 |\n               StackFrameAMD64::CONTEXT_VALID_R13 |\n               StackFrameAMD64::CONTEXT_VALID_R14 |\n               StackFrameAMD64::CONTEXT_VALID_R15),\n              frame1->context_validity);\n    EXPECT_EQ(expected.rip, frame1->context.rip);\n    EXPECT_EQ(expected.rsp, frame1->context.rsp);\n    EXPECT_EQ(expected.rbp, frame1->context.rbp);\n    EXPECT_EQ(expected.rbx, frame1->context.rbx);\n    EXPECT_EQ(expected.r12, frame1->context.r12);\n    EXPECT_EQ(expected.r13, frame1->context.r13);\n    EXPECT_EQ(expected.r14, frame1->context.r14);\n    EXPECT_EQ(expected.r15, frame1->context.r15);\n    EXPECT_EQ(\"epictetus\", frame1->function_name);\n  }\n\n  // The values we expect to find for the caller's registers.\n  MDRawContextAMD64 expected;\n};\n\nclass CFI: public CFIFixture, public Test { };\n\nTEST_F(CFI, At4000) {\n  Label frame1_rsp = expected.rsp;\n  stack_section\n    .D64(0x40000000c0005510ULL) // return address\n    .Mark(&frame1_rsp);         // This effectively sets stack_section.start().\n  raw_context.rip = 0x40000000c0004000ULL;\n  CheckWalk();\n}\n\nTEST_F(CFI, At4001) {\n  Label frame1_rsp = expected.rsp;\n  stack_section\n    .D64(0x5a5beeb38de23be8ULL) // saved %rbx\n    .D64(0x40000000c0005510ULL) // return address\n    .Mark(&frame1_rsp);         // This effectively sets stack_section.start().\n  raw_context.rip = 0x40000000c0004001ULL;\n  raw_context.rbx = 0xbe0487d2f9eafe29ULL; // callee's (distinct) %rbx value\n  CheckWalk();\n}\n\nTEST_F(CFI, At4002) {\n  Label frame1_rsp = expected.rsp;\n  stack_section\n    .D64(0x5a5beeb38de23be8ULL) // saved %rbx\n    .D64(0x40000000c0005510ULL) // return address\n    .Mark(&frame1_rsp);         // This effectively sets stack_section.start().\n  raw_context.rip = 0x40000000c0004002ULL;\n  raw_context.rbx = 0xed1b02e8cc0fc79cULL; // saved %r12\n  raw_context.r12 = 0xb0118de918a4bceaULL; // callee's (distinct) %r12 value\n  CheckWalk();\n}\n\nTEST_F(CFI, At4003) {\n  Label frame1_rsp = expected.rsp;\n  stack_section\n    .D64(0x0e023828dffd4d81ULL) // garbage\n    .D64(0x1d20ad8acacbe930ULL) // saved %r13\n    .D64(0x319e68b49e3ace0fULL) // garbage\n    .D64(0x5a5beeb38de23be8ULL) // saved %rbx\n    .D64(0x40000000c0005510ULL) // return address\n    .Mark(&frame1_rsp);         // This effectively sets stack_section.start().\n  raw_context.rip = 0x40000000c0004003ULL;\n  raw_context.rbx = 0xed1b02e8cc0fc79cULL; // saved %r12\n  raw_context.r12 = 0x89d04fa804c87a43ULL; // callee's (distinct) %r12\n  raw_context.r13 = 0x5118e02cbdb24b03ULL; // callee's (distinct) %r13\n  CheckWalk();\n}\n\n// The results here should be the same as those at module offset 0x4003.\nTEST_F(CFI, At4004) {\n  Label frame1_rsp = expected.rsp;\n  stack_section\n    .D64(0x0e023828dffd4d81ULL) // garbage\n    .D64(0x1d20ad8acacbe930ULL) // saved %r13\n    .D64(0x319e68b49e3ace0fULL) // garbage\n    .D64(0x5a5beeb38de23be8ULL) // saved %rbx\n    .D64(0x40000000c0005510ULL) // return address\n    .Mark(&frame1_rsp);         // This effectively sets stack_section.start().\n  raw_context.rip = 0x40000000c0004004ULL;\n  raw_context.rbx = 0xed1b02e8cc0fc79cULL; // saved %r12\n  raw_context.r12 = 0x89d04fa804c87a43ULL; // callee's (distinct) %r12\n  raw_context.r13 = 0x5118e02cbdb24b03ULL; // callee's (distinct) %r13\n  CheckWalk();\n}\n\nTEST_F(CFI, At4005) {\n  Label frame1_rsp = expected.rsp;\n  stack_section\n    .D64(0x4b516dd035745953ULL) // garbage\n    .D64(0x1d20ad8acacbe930ULL) // saved %r13\n    .D64(0xa6d445e16ae3d872ULL) // garbage\n    .D64(0x5a5beeb38de23be8ULL) // saved %rbx\n    .D64(0xaa95fa054aedfbaeULL) // garbage\n    .Mark(&frame1_rsp);         // This effectively sets stack_section.start().\n  raw_context.rip = 0x40000000c0004005ULL;\n  raw_context.rbx = 0xed1b02e8cc0fc79cULL; // saved %r12\n  raw_context.r12 = 0x46b1b8868891b34aULL; // callee's %r12\n  raw_context.r13 = 0x40000000c0005510ULL; // return address\n  CheckWalk();\n}\n\nTEST_F(CFI, At4006) {\n  Label frame0_rbp;\n  Label frame1_rsp = expected.rsp;\n  stack_section\n    .D64(0x043c6dfceb91aa34ULL) // garbage\n    .D64(0x1d20ad8acacbe930ULL) // saved %r13\n    .D64(0x68995b1de4700266ULL) // saved %rbp\n    .Mark(&frame0_rbp)          // frame pointer points here\n    .D64(0x5a5beeb38de23be8ULL) // saved %rbx\n    .D64(0xf015ee516ad89eabULL) // garbage\n    .Mark(&frame1_rsp);         // This effectively sets stack_section.start().\n  raw_context.rip = 0x40000000c0004006ULL;\n  raw_context.rbp = frame0_rbp.Value();\n  raw_context.rbx = 0xed1b02e8cc0fc79cULL; // saved %r12\n  raw_context.r12 = 0x26e007b341acfebdULL; // callee's %r12\n  raw_context.r13 = 0x40000000c0005510ULL; // return address\n  CheckWalk();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_arm.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stackwalker_arm.cc: arm-specific stackwalker.\n//\n// See stackwalker_arm.h for documentation.\n//\n// Author: Mark Mentovai, Ted Mielczarek, Jim Blandy\n\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/memory_region.h\"\n#include \"google_breakpad/processor/source_line_resolver_interface.h\"\n#include \"google_breakpad/processor/stack_frame_cpu.h\"\n#include \"processor/cfi_frame_info.h\"\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n#include \"processor/stackwalker_arm.h\"\n\nnamespace google_breakpad {\n\n\nStackwalkerARM::StackwalkerARM(const SystemInfo *system_info,\n                               const MDRawContextARM *context,\n                               int fp_register,\n                               MemoryRegion *memory,\n                               const CodeModules *modules,\n                               SymbolSupplier *supplier,\n                               SourceLineResolverInterface *resolver)\n    : Stackwalker(system_info, memory, modules, supplier, resolver),\n      context_(context), fp_register_(fp_register),\n      context_frame_validity_(StackFrameARM::CONTEXT_VALID_ALL) { }\n\n\nStackFrame* StackwalkerARM::GetContextFrame() {\n  if (!context_ || !memory_) {\n    BPLOG(ERROR) << \"Can't get context frame without context or memory\";\n    return NULL;\n  }\n\n  StackFrameARM *frame = new StackFrameARM();\n\n  // The instruction pointer is stored directly in a register (r15), so pull it\n  // straight out of the CPU context structure.\n  frame->context = *context_;\n  frame->context_validity = context_frame_validity_;\n  frame->trust = StackFrame::FRAME_TRUST_CONTEXT;\n  frame->instruction = frame->context.iregs[MD_CONTEXT_ARM_REG_PC];\n\n  return frame;\n}\n\nStackFrameARM *StackwalkerARM::GetCallerByCFIFrameInfo(\n    const vector<StackFrame *> &frames,\n    CFIFrameInfo *cfi_frame_info) {\n  StackFrameARM *last_frame = static_cast<StackFrameARM *>(frames.back());\n\n  static const char *register_names[] = {\n    \"r0\",  \"r1\",  \"r2\",  \"r3\",  \"r4\",  \"r5\",  \"r6\",  \"r7\",\n    \"r8\",  \"r9\",  \"r10\", \"r11\", \"r12\", \"sp\",  \"lr\",  \"pc\",\n    \"f0\",  \"f1\",  \"f2\",  \"f3\",  \"f4\",  \"f5\",  \"f6\",  \"f7\",\n    \"fps\", \"cpsr\",\n    NULL\n  };\n\n  // Populate a dictionary with the valid register values in last_frame.\n  CFIFrameInfo::RegisterValueMap<u_int32_t> callee_registers;\n  for (int i = 0; register_names[i]; i++)\n    if (last_frame->context_validity & StackFrameARM::RegisterValidFlag(i))\n      callee_registers[register_names[i]] = last_frame->context.iregs[i];\n\n  // Use the STACK CFI data to recover the caller's register values.\n  CFIFrameInfo::RegisterValueMap<u_int32_t> caller_registers;\n  if (!cfi_frame_info->FindCallerRegs(callee_registers, *memory_,\n                                      &caller_registers))\n    return NULL;\n\n  // Construct a new stack frame given the values the CFI recovered.\n  scoped_ptr<StackFrameARM> frame(new StackFrameARM());\n  for (int i = 0; register_names[i]; i++) {\n    CFIFrameInfo::RegisterValueMap<u_int32_t>::iterator entry =\n      caller_registers.find(register_names[i]);\n    if (entry != caller_registers.end()) {\n      // We recovered the value of this register; fill the context with the\n      // value from caller_registers.\n      frame->context_validity |= StackFrameARM::RegisterValidFlag(i);\n      frame->context.iregs[i] = entry->second;\n    } else if (4 <= i && i <= 11 && (last_frame->context_validity &\n                                     StackFrameARM::RegisterValidFlag(i))) {\n      // If the STACK CFI data doesn't mention some callee-saves register, and\n      // it is valid in the callee, assume the callee has not yet changed it.\n      // Registers r4 through r11 are callee-saves, according to the Procedure\n      // Call Standard for the ARM Architecture, which the Linux ABI follows.\n      frame->context_validity |= StackFrameARM::RegisterValidFlag(i);\n      frame->context.iregs[i] = last_frame->context.iregs[i];\n    }\n  }\n  // If the CFI doesn't recover the PC explicitly, then use .ra.\n  if (! (frame->context_validity & StackFrameARM::CONTEXT_VALID_PC)) {\n    CFIFrameInfo::RegisterValueMap<u_int32_t>::iterator entry =\n      caller_registers.find(\".ra\");\n    if (entry != caller_registers.end()) {\n      if (fp_register_ == -1) {\n        frame->context_validity |= StackFrameARM::CONTEXT_VALID_PC;\n        frame->context.iregs[MD_CONTEXT_ARM_REG_PC] = entry->second;\n      } else {\n        // The CFI updated the link register and not the program counter.\n        // Handle getting the program counter from the link register.\n        frame->context_validity |= StackFrameARM::CONTEXT_VALID_PC;\n        frame->context_validity |= StackFrameARM::CONTEXT_VALID_LR;\n        frame->context.iregs[MD_CONTEXT_ARM_REG_LR] = entry->second;\n        frame->context.iregs[MD_CONTEXT_ARM_REG_PC] =\n            last_frame->context.iregs[MD_CONTEXT_ARM_REG_LR];\n      }\n    }\n  }\n  // If the CFI doesn't recover the SP explicitly, then use .cfa.\n  if (! (frame->context_validity & StackFrameARM::CONTEXT_VALID_SP)) {\n    CFIFrameInfo::RegisterValueMap<u_int32_t>::iterator entry =\n      caller_registers.find(\".cfa\");\n    if (entry != caller_registers.end()) {\n      frame->context_validity |= StackFrameARM::CONTEXT_VALID_SP;\n      frame->context.iregs[MD_CONTEXT_ARM_REG_SP] = entry->second;\n    }\n  }\n\n  // If we didn't recover the PC and the SP, then the frame isn't very useful.\n  static const int essentials = (StackFrameARM::CONTEXT_VALID_SP\n                                 | StackFrameARM::CONTEXT_VALID_PC);\n  if ((frame->context_validity & essentials) != essentials)\n    return NULL;\n\n  frame->trust = StackFrame::FRAME_TRUST_CFI;\n  return frame.release();\n}\n\nStackFrameARM *StackwalkerARM::GetCallerByStackScan(\n    const vector<StackFrame *> &frames) {\n  StackFrameARM *last_frame = static_cast<StackFrameARM *>(frames.back());\n  u_int32_t last_sp = last_frame->context.iregs[MD_CONTEXT_ARM_REG_SP];\n  u_int32_t caller_sp, caller_pc;\n\n  if (!ScanForReturnAddress(last_sp, &caller_sp, &caller_pc)) {\n    // No plausible return address was found.\n    return NULL;\n  }\n\n  // ScanForReturnAddress found a reasonable return address. Advance\n  // %sp to the location above the one where the return address was\n  // found.\n  caller_sp += 4;\n\n  // Create a new stack frame (ownership will be transferred to the caller)\n  // and fill it in.\n  StackFrameARM *frame = new StackFrameARM();\n\n  frame->trust = StackFrame::FRAME_TRUST_SCAN;\n  frame->context = last_frame->context;\n  frame->context.iregs[MD_CONTEXT_ARM_REG_PC] = caller_pc;\n  frame->context.iregs[MD_CONTEXT_ARM_REG_SP] = caller_sp;\n  frame->context_validity = StackFrameARM::CONTEXT_VALID_PC |\n                            StackFrameARM::CONTEXT_VALID_SP;\n\n  return frame;\n}\n\nStackFrameARM *StackwalkerARM::GetCallerByFramePointer(\n    const vector<StackFrame *> &frames) {\n  StackFrameARM *last_frame = static_cast<StackFrameARM *>(frames.back());\n\n  if (!(last_frame->context_validity &\n        StackFrameARM::RegisterValidFlag(fp_register_))) {\n    return NULL;\n  }\n\n  u_int32_t last_fp = last_frame->context.iregs[fp_register_];\n\n  u_int32_t caller_fp = 0;\n  if (last_fp && !memory_->GetMemoryAtAddress(last_fp, &caller_fp)) {\n    BPLOG(ERROR) << \"Unable to read caller_fp from last_fp: 0x\"\n                 << std::hex << last_fp;\n    return NULL;\n  }\n\n  u_int32_t caller_lr = 0;\n  if (last_fp && !memory_->GetMemoryAtAddress(last_fp + 4, &caller_lr)) {\n    BPLOG(ERROR) << \"Unable to read caller_lr from last_fp + 4: 0x\"\n                 << std::hex << (last_fp + 4);\n    return NULL;\n  }\n\n  u_int32_t caller_sp = last_fp ? last_fp + 8 :\n      last_frame->context.iregs[MD_CONTEXT_ARM_REG_SP];\n\n  // Create a new stack frame (ownership will be transferred to the caller)\n  // and fill it in.\n  StackFrameARM *frame = new StackFrameARM();\n\n  frame->trust = StackFrame::FRAME_TRUST_FP;\n  frame->context = last_frame->context;\n  frame->context.iregs[fp_register_] = caller_fp;\n  frame->context.iregs[MD_CONTEXT_ARM_REG_SP] = caller_sp;\n  frame->context.iregs[MD_CONTEXT_ARM_REG_PC] =\n      last_frame->context.iregs[MD_CONTEXT_ARM_REG_LR];\n  frame->context.iregs[MD_CONTEXT_ARM_REG_LR] = caller_lr;\n  frame->context_validity = StackFrameARM::CONTEXT_VALID_PC |\n                            StackFrameARM::CONTEXT_VALID_LR |\n                            StackFrameARM::RegisterValidFlag(fp_register_) |\n                            StackFrameARM::CONTEXT_VALID_SP;\n  return frame;\n}\n\nStackFrame* StackwalkerARM::GetCallerFrame(const CallStack *stack) {\n  if (!memory_ || !stack) {\n    BPLOG(ERROR) << \"Can't get caller frame without memory or stack\";\n    return NULL;\n  }\n\n  const vector<StackFrame *> &frames = *stack->frames();\n  StackFrameARM *last_frame = static_cast<StackFrameARM *>(frames.back());\n  scoped_ptr<StackFrameARM> frame;\n\n  // See if there is DWARF call frame information covering this address.\n  scoped_ptr<CFIFrameInfo> cfi_frame_info(\n      resolver_ ? resolver_->FindCFIFrameInfo(last_frame) : NULL);\n  if (cfi_frame_info.get())\n    frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get()));\n\n  // If CFI failed, or there wasn't CFI available, fall back\n  // to frame pointer, if this is configured.\n  if (fp_register_ >= 0 && !frame.get())\n    frame.reset(GetCallerByFramePointer(frames));\n\n  // If everuthing failed, fall back to stack scanning.\n  if (!frame.get())\n    frame.reset(GetCallerByStackScan(frames));\n\n  // If nothing worked, tell the caller.\n  if (!frame.get())\n    return NULL;\n\n\n  // An instruction address of zero marks the end of the stack.\n  if (frame->context.iregs[MD_CONTEXT_ARM_REG_PC] == 0)\n    return NULL;\n\n  // If the new stack pointer is at a lower address than the old, then\n  // that's clearly incorrect. Treat this as end-of-stack to enforce\n  // progress and avoid infinite loops.\n  if (frame->context.iregs[MD_CONTEXT_ARM_REG_SP]\n      < last_frame->context.iregs[MD_CONTEXT_ARM_REG_SP])\n    return NULL;\n\n  // The new frame's context's PC is the return address, which is one\n  // instruction past the instruction that caused us to arrive at the\n  // callee. Set new_frame->instruction to one less than the PC. This won't\n  // reference the beginning of the call instruction, but it's at least\n  // within it, which is sufficient to get the source line information to\n  // match up with the line that contains the function call. Callers that\n  // require the exact return address value may access\n  // frame->context.iregs[MD_CONTEXT_ARM_REG_PC].\n  frame->instruction = frame->context.iregs[MD_CONTEXT_ARM_REG_PC] - 2;\n\n  return frame.release();\n}\n\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_arm.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stackwalker_arm.h: arm-specific stackwalker.\n//\n// Provides stack frames given arm register context and a memory region\n// corresponding to an arm stack.\n//\n// Author: Mark Mentovai, Ted Mielczarek\n\n\n#ifndef PROCESSOR_STACKWALKER_ARM_H__\n#define PROCESSOR_STACKWALKER_ARM_H__\n\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"google_breakpad/processor/stackwalker.h\"\n\nnamespace google_breakpad {\n\nclass CodeModules;\n\nclass StackwalkerARM : public Stackwalker {\n public:\n  // context is an arm context object that gives access to arm-specific\n  // register state corresponding to the innermost called frame to be\n  // included in the stack.  The other arguments are passed directly through\n  // to the base Stackwalker constructor.\n  StackwalkerARM(const SystemInfo *system_info,\n                 const MDRawContextARM *context,\n                 int fp_register,\n                 MemoryRegion *memory,\n                 const CodeModules *modules,\n                 SymbolSupplier *supplier,\n                 SourceLineResolverInterface *resolver);\n\n  // Change the context validity mask of the frame returned by\n  // GetContextFrame to VALID. This is only for use by unit tests; the\n  // default behavior is correct for all application code.\n  void SetContextFrameValidity(int valid) { context_frame_validity_ = valid; }\n\n private:\n  // Implementation of Stackwalker, using arm context and stack conventions.\n  virtual StackFrame* GetContextFrame();\n  virtual StackFrame* GetCallerFrame(const CallStack *stack);\n\n  // Use cfi_frame_info (derived from STACK CFI records) to construct\n  // the frame that called frames.back(). The caller takes ownership\n  // of the returned frame. Return NULL on failure.\n  StackFrameARM *GetCallerByCFIFrameInfo(const vector<StackFrame *> &frames,\n                                         CFIFrameInfo *cfi_frame_info);\n\n  // Use the frame pointer. The caller takes ownership of the returned frame.\n  // Return NULL on failure.\n  StackFrameARM *GetCallerByFramePointer(const vector<StackFrame *> &frames);\n\n  // Scan the stack for plausible return addresses. The caller takes ownership\n  // of the returned frame. Return NULL on failure.\n  StackFrameARM *GetCallerByStackScan(const vector<StackFrame *> &frames);\n\n  // Stores the CPU context corresponding to the youngest stack frame, to\n  // be returned by GetContextFrame.\n  const MDRawContextARM *context_;\n\n  // The register to use a as frame pointer. The value is -1 if frame pointer\n  // cannot be used.\n  int fp_register_;\n\n  // Validity mask for youngest stack frame. This is always\n  // CONTEXT_VALID_ALL in real use; it is only changeable for the sake of\n  // unit tests.\n  int context_frame_validity_;\n};\n\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_STACKWALKER_ARM_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_arm_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// stackwalker_arm_unittest.cc: Unit tests for StackwalkerARM class.\n\n#include <string>\n#include <string.h>\n#include <vector>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/test_assembler.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"google_breakpad/processor/basic_source_line_resolver.h\"\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/source_line_resolver_interface.h\"\n#include \"google_breakpad/processor/stack_frame_cpu.h\"\n#include \"processor/stackwalker_unittest_utils.h\"\n#include \"processor/stackwalker_arm.h\"\n#include \"processor/windows_frame_info.h\"\n\nusing google_breakpad::BasicSourceLineResolver;\nusing google_breakpad::CallStack;\nusing google_breakpad::StackFrame;\nusing google_breakpad::StackFrameARM;\nusing google_breakpad::StackwalkerARM;\nusing google_breakpad::SystemInfo;\nusing google_breakpad::WindowsFrameInfo;\nusing google_breakpad::test_assembler::kLittleEndian;\nusing google_breakpad::test_assembler::Label;\nusing google_breakpad::test_assembler::Section;\nusing std::string;\nusing std::vector;\nusing testing::_;\nusing testing::Return;\nusing testing::SetArgumentPointee;\nusing testing::Test;\n\nclass StackwalkerARMFixture {\n public:\n  StackwalkerARMFixture()\n    : stack_section(kLittleEndian),\n      // Give the two modules reasonable standard locations and names\n      // for tests to play with.\n      module1(0x40000000, 0x10000, \"module1\", \"version1\"),\n      module2(0x50000000, 0x10000, \"module2\", \"version2\") {\n    // Identify the system as a Linux system.\n    system_info.os = \"Linux\";\n    system_info.os_short = \"linux\";\n    system_info.os_version = \"Lugubrious Labrador\";\n    system_info.cpu = \"arm\";\n    system_info.cpu_info = \"\";\n\n    // Put distinctive values in the raw CPU context.\n    BrandContext(&raw_context);\n\n    // Create some modules with some stock debugging information.\n    modules.Add(&module1);\n    modules.Add(&module2);\n\n    // By default, none of the modules have symbol info; call\n    // SetModuleSymbols to override this.\n    EXPECT_CALL(supplier, GetCStringSymbolData(_, _, _, _))\n      .WillRepeatedly(Return(MockSymbolSupplier::NOT_FOUND));\n  }\n\n  // Set the Breakpad symbol information that supplier should return for\n  // MODULE to INFO.\n  void SetModuleSymbols(MockCodeModule *module, const string &info) {\n    unsigned int buffer_size = info.size() + 1;\n    char *buffer = reinterpret_cast<char*>(operator new(buffer_size));\n    strcpy(buffer, info.c_str());\n    EXPECT_CALL(supplier, GetCStringSymbolData(module, &system_info, _, _))\n      .WillRepeatedly(DoAll(SetArgumentPointee<3>(buffer),\n                            Return(MockSymbolSupplier::FOUND)));\n  }\n\n  // Populate stack_region with the contents of stack_section. Use\n  // stack_section.start() as the region's starting address.\n  void RegionFromSection() {\n    string contents;\n    ASSERT_TRUE(stack_section.GetContents(&contents));\n    stack_region.Init(stack_section.start().Value(), contents);\n  }\n\n  // Fill RAW_CONTEXT with pseudo-random data, for round-trip checking.\n  void BrandContext(MDRawContextARM *raw_context) {\n    u_int8_t x = 173;\n    for (size_t i = 0; i < sizeof(*raw_context); i++)\n      reinterpret_cast<u_int8_t *>(raw_context)[i] = (x += 17);\n  }\n\n  SystemInfo system_info;\n  MDRawContextARM raw_context;\n  Section stack_section;\n  MockMemoryRegion stack_region;\n  MockCodeModule module1;\n  MockCodeModule module2;\n  MockCodeModules modules;\n  MockSymbolSupplier supplier;\n  BasicSourceLineResolver resolver;\n  CallStack call_stack;\n  const vector<StackFrame *> *frames;\n};\n\nclass SanityCheck: public StackwalkerARMFixture, public Test { };\n\nTEST_F(SanityCheck, NoResolver) {\n  // Since we have no call frame information, and all unwinding\n  // requires call frame information, the stack walk will end after\n  // the first frame.\n  StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules,\n                        NULL, NULL);\n  // This should succeed even without a resolver or supplier.\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(1U, frames->size());\n  StackFrameARM *frame = static_cast<StackFrameARM *>(frames->at(0));\n  // Check that the values from the original raw context made it\n  // through to the context in the stack frame.\n  EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context)));\n}\n\nclass GetContextFrame: public StackwalkerARMFixture, public Test { };\n\nTEST_F(GetContextFrame, Simple) {\n  // Since we have no call frame information, and all unwinding\n  // requires call frame information, the stack walk will end after\n  // the first frame.\n  StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(1U, frames->size());\n  StackFrameARM *frame = static_cast<StackFrameARM *>(frames->at(0));\n  // Check that the values from the original raw context made it\n  // through to the context in the stack frame.\n  EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context)));\n}\n\nclass GetCallerFrame: public StackwalkerARMFixture, public Test { };\n\nTEST_F(GetCallerFrame, ScanWithoutSymbols) {\n  // When the stack walker resorts to scanning the stack,\n  // only addresses located within loaded modules are\n  // considered valid return addresses.\n  // Force scanning through three frames to ensure that the\n  // stack pointer is set properly in scan-recovered frames.\n  stack_section.start() = 0x80000000;\n  u_int32_t return_address1 = 0x50000100;\n  u_int32_t return_address2 = 0x50000900;\n  Label frame1_sp, frame2_sp;\n  stack_section\n    // frame 0\n    .Append(16, 0)                      // space\n\n    .D32(0x40090000)                    // junk that's not\n    .D32(0x60000000)                    // a return address\n\n    .D32(return_address1)               // actual return address\n    // frame 1\n    .Mark(&frame1_sp)\n    .Append(16, 0)                      // space\n\n    .D32(0xF0000000)                    // more junk\n    .D32(0x0000000D)\n\n    .D32(return_address2)               // actual return address\n    // frame 2\n    .Mark(&frame2_sp)\n    .Append(32, 0);                     // end of stack\n  RegionFromSection();\n\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40005510;\n  raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value();\n\n  StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(3U, frames->size());\n\n  StackFrameARM *frame0 = static_cast<StackFrameARM *>(frames->at(0));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n  ASSERT_EQ(StackFrameARM::CONTEXT_VALID_ALL, frame0->context_validity);\n  EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context)));\n\n  StackFrameARM *frame1 = static_cast<StackFrameARM *>(frames->at(1));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust);\n  ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC |\n             StackFrameARM::CONTEXT_VALID_SP),\n            frame1->context_validity);\n  EXPECT_EQ(return_address1, frame1->context.iregs[MD_CONTEXT_ARM_REG_PC]);\n  EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_ARM_REG_SP]);\n\n  StackFrameARM *frame2 = static_cast<StackFrameARM *>(frames->at(2));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame2->trust);\n  ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC |\n             StackFrameARM::CONTEXT_VALID_SP),\n            frame2->context_validity);\n  EXPECT_EQ(return_address2, frame2->context.iregs[MD_CONTEXT_ARM_REG_PC]);\n  EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_ARM_REG_SP]);\n}\n\nTEST_F(GetCallerFrame, ScanWithFunctionSymbols) {\n  // During stack scanning, if a potential return address\n  // is located within a loaded module that has symbols,\n  // it is only considered a valid return address if it\n  // lies within a function's bounds.\n  stack_section.start() = 0x80000000;\n  u_int32_t return_address = 0x50000200;\n  Label frame1_sp;\n\n  stack_section\n    // frame 0\n    .Append(16, 0)                      // space\n\n    .D32(0x40090000)                    // junk that's not\n    .D32(0x60000000)                    // a return address\n\n    .D32(0x40001000)                    // a couple of plausible addresses\n    .D32(0x5000F000)                    // that are not within functions\n\n    .D32(return_address)                // actual return address\n    // frame 1\n    .Mark(&frame1_sp)\n    .Append(32, 0);                     // end of stack\n  RegionFromSection();\n\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40000200;\n  raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value();\n\n  SetModuleSymbols(&module1,\n                   // The youngest frame's function.\n                   \"FUNC 100 400 10 monotreme\\n\");\n  SetModuleSymbols(&module2,\n                   // The calling frame's function.\n                   \"FUNC 100 400 10 marsupial\\n\");\n\n  StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(2U, frames->size());\n\n  StackFrameARM *frame0 = static_cast<StackFrameARM *>(frames->at(0));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n  ASSERT_EQ(StackFrameARM::CONTEXT_VALID_ALL, frame0->context_validity);\n  EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context)));\n  EXPECT_EQ(\"monotreme\", frame0->function_name);\n  EXPECT_EQ(0x40000100, frame0->function_base);\n\n  StackFrameARM *frame1 = static_cast<StackFrameARM *>(frames->at(1));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust);\n  ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC |\n             StackFrameARM::CONTEXT_VALID_SP),\n            frame1->context_validity);\n  EXPECT_EQ(return_address, frame1->context.iregs[MD_CONTEXT_ARM_REG_PC]);\n  EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_ARM_REG_SP]);\n  EXPECT_EQ(\"marsupial\", frame1->function_name);\n  EXPECT_EQ(0x50000100, frame1->function_base);\n}\n\nstruct CFIFixture: public StackwalkerARMFixture {\n  CFIFixture() {\n    // Provide a bunch of STACK CFI records; we'll walk to the caller\n    // from every point in this series, expecting to find the same set\n    // of register values.\n    SetModuleSymbols(&module1,\n                     // The youngest frame's function.\n                     \"FUNC 4000 1000 10 enchiridion\\n\"\n                     // Initially, nothing has been pushed on the stack,\n                     // and the return address is still in the link register.\n                     \"STACK CFI INIT 4000 100 .cfa: sp .ra: lr\\n\"\n                     // Push r4, the frame pointer, and the link register.\n                     \"STACK CFI 4001 .cfa: sp 12 + r4: .cfa 12 - ^\"\n                     \" r11: .cfa 8 - ^ .ra: .cfa 4 - ^\\n\"\n                     // Save r4..r7 in r0..r3: verify that we populate\n                     // the youngest frame with all the values we have.\n                     \"STACK CFI 4002 r4: r0 r5: r1 r6: r2 r7: r3\\n\"\n                     // Restore r4..r7. Save the non-callee-saves register r1.\n                     \"STACK CFI 4003 .cfa: sp 16 + r1: .cfa 16 - ^\"\n                     \" r4: r4 r5: r5 r6: r6 r7: r7\\n\"\n                     // Move the .cfa back four bytes, to point at the return\n                     // address, and restore the sp explicitly.\n                     \"STACK CFI 4005 .cfa: sp 12 + r1: .cfa 12 - ^\"\n                     \" r11: .cfa 4 - ^ .ra: .cfa ^ sp: .cfa 4 +\\n\"\n                     // Recover the PC explicitly from a new stack slot;\n                     // provide garbage for the .ra.\n                     \"STACK CFI 4006 .cfa: sp 16 + pc: .cfa 16 - ^\\n\"\n\n                     // The calling function.\n                     \"FUNC 5000 1000 10 epictetus\\n\"\n                     // Mark it as end of stack.\n                     \"STACK CFI INIT 5000 1000 .cfa: 0 .ra: 0\\n\"\n\n                     // A function whose CFI makes the stack pointer\n                     // go backwards.\n                     \"FUNC 6000 1000 20 palinal\\n\"\n                     \"STACK CFI INIT 6000 1000 .cfa: sp 4 - .ra: lr\\n\"\n\n                     // A function with CFI expressions that can't be\n                     // evaluated.\n                     \"FUNC 7000 1000 20 rhetorical\\n\"\n                     \"STACK CFI INIT 7000 1000 .cfa: moot .ra: ambiguous\\n\");\n\n    // Provide some distinctive values for the caller's registers.\n    expected.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40005510;\n    expected.iregs[MD_CONTEXT_ARM_REG_SP] = 0x80000000;\n    expected.iregs[4] = 0xb5d55e68;\n    expected.iregs[5] = 0xebd134f3;\n    expected.iregs[6] = 0xa31e74bc;\n    expected.iregs[7] = 0x2dcb16b3;\n    expected.iregs[8] = 0x2ada2137;\n    expected.iregs[9] = 0xbbbb557d;\n    expected.iregs[10] = 0x48bf8ca7;\n    expected.iregs[MD_CONTEXT_ARM_REG_FP] = 0x8112e110;\n\n    // Expect CFI to recover all callee-saves registers. Since CFI is the\n    // only stack frame construction technique we have, aside from the\n    // context frame itself, there's no way for us to have a set of valid\n    // registers smaller than this.\n    expected_validity = (StackFrameARM::CONTEXT_VALID_PC |\n                         StackFrameARM::CONTEXT_VALID_SP |\n                         StackFrameARM::CONTEXT_VALID_R4 |\n                         StackFrameARM::CONTEXT_VALID_R5 |\n                         StackFrameARM::CONTEXT_VALID_R6 |\n                         StackFrameARM::CONTEXT_VALID_R7 |\n                         StackFrameARM::CONTEXT_VALID_R8 |\n                         StackFrameARM::CONTEXT_VALID_R9 |\n                         StackFrameARM::CONTEXT_VALID_R10 |\n                         StackFrameARM::CONTEXT_VALID_FP);\n\n    // By default, context frames provide all registers, as normal.\n    context_frame_validity = StackFrameARM::CONTEXT_VALID_ALL;\n\n    // By default, registers are unchanged.\n    raw_context = expected;\n  }\n\n  // Walk the stack, using stack_section as the contents of the stack\n  // and raw_context as the current register values. (Set the stack\n  // pointer to the stack's starting address.) Expect two stack\n  // frames; in the older frame, expect the callee-saves registers to\n  // have values matching those in 'expected'.\n  void CheckWalk() {\n    RegionFromSection();\n    raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value();\n\n    StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region,\n                          &modules, &supplier, &resolver);\n    walker.SetContextFrameValidity(context_frame_validity);\n    ASSERT_TRUE(walker.Walk(&call_stack));\n    frames = call_stack.frames();\n    ASSERT_EQ(2U, frames->size());\n\n    StackFrameARM *frame0 = static_cast<StackFrameARM *>(frames->at(0));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n    ASSERT_EQ(context_frame_validity, frame0->context_validity);\n    EXPECT_EQ(\"enchiridion\", frame0->function_name);\n    EXPECT_EQ(0x40004000U, frame0->function_base);\n\n    StackFrameARM *frame1 = static_cast<StackFrameARM *>(frames->at(1));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust);\n    ASSERT_EQ(expected_validity, frame1->context_validity);\n    if (expected_validity & StackFrameARM::CONTEXT_VALID_R1)\n      EXPECT_EQ(expected.iregs[1], frame1->context.iregs[1]);\n    if (expected_validity & StackFrameARM::CONTEXT_VALID_R4)\n      EXPECT_EQ(expected.iregs[4], frame1->context.iregs[4]);\n    if (expected_validity & StackFrameARM::CONTEXT_VALID_R5)\n      EXPECT_EQ(expected.iregs[5], frame1->context.iregs[5]);\n    if (expected_validity & StackFrameARM::CONTEXT_VALID_R6)\n      EXPECT_EQ(expected.iregs[6], frame1->context.iregs[6]);\n    if (expected_validity & StackFrameARM::CONTEXT_VALID_R7)\n      EXPECT_EQ(expected.iregs[7], frame1->context.iregs[7]);\n    if (expected_validity & StackFrameARM::CONTEXT_VALID_R8)\n      EXPECT_EQ(expected.iregs[8], frame1->context.iregs[8]);\n    if (expected_validity & StackFrameARM::CONTEXT_VALID_R9)\n      EXPECT_EQ(expected.iregs[9], frame1->context.iregs[9]);\n    if (expected_validity & StackFrameARM::CONTEXT_VALID_R10)\n      EXPECT_EQ(expected.iregs[10], frame1->context.iregs[10]);\n    if (expected_validity & StackFrameARM::CONTEXT_VALID_FP)\n      EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM_REG_FP],\n                frame1->context.iregs[MD_CONTEXT_ARM_REG_FP]);\n\n    // We would never have gotten a frame in the first place if the SP\n    // and PC weren't valid or ->instruction weren't set.\n    EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM_REG_SP],\n              frame1->context.iregs[MD_CONTEXT_ARM_REG_SP]);\n    EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM_REG_PC],\n              frame1->context.iregs[MD_CONTEXT_ARM_REG_PC]);\n    EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM_REG_PC],\n              frame1->instruction + 2);\n    EXPECT_EQ(\"epictetus\", frame1->function_name);\n  }\n\n  // The values we expect to find for the caller's registers.\n  MDRawContextARM expected;\n\n  // The validity mask for expected.\n  int expected_validity;\n\n  // The validity mask to impose on the context frame.\n  int context_frame_validity;\n};\n\nclass CFI: public CFIFixture, public Test { };\n\nTEST_F(CFI, At4000) {\n  stack_section.start() = expected.iregs[MD_CONTEXT_ARM_REG_SP];\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004000;\n  raw_context.iregs[MD_CONTEXT_ARM_REG_LR] = 0x40005510;\n  CheckWalk();\n}\n\nTEST_F(CFI, At4001) {\n  Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP];\n  stack_section\n    .D32(0xb5d55e68)            // saved r4\n    .D32(0x8112e110)            // saved fp\n    .D32(0x40005510)            // return address\n    .Mark(&frame1_sp);          // This effectively sets stack_section.start().\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004001;\n  raw_context.iregs[4] = 0x635adc9f;                     // distinct callee r4\n  raw_context.iregs[MD_CONTEXT_ARM_REG_FP] = 0xbe145fc4; // distinct callee fp\n  CheckWalk();\n}\n\n// As above, but unwind from a context that has only the PC and SP.\nTEST_F(CFI, At4001LimitedValidity) {\n  context_frame_validity =\n    StackFrameARM::CONTEXT_VALID_PC | StackFrameARM::CONTEXT_VALID_SP;\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004001;\n  raw_context.iregs[MD_CONTEXT_ARM_REG_FP] = 0xbe145fc4; // distinct callee fp\n  Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP];\n  stack_section\n    .D32(0xb5d55e68)            // saved r4\n    .D32(0x8112e110)            // saved fp\n    .D32(0x40005510)            // return address\n    .Mark(&frame1_sp);          // This effectively sets stack_section.start().\n  expected_validity = (StackFrameARM::CONTEXT_VALID_PC\n                       | StackFrameARM::CONTEXT_VALID_SP\n                       | StackFrameARM::CONTEXT_VALID_FP\n                       | StackFrameARM::CONTEXT_VALID_R4);\n  CheckWalk();\n}\n\nTEST_F(CFI, At4002) {\n  Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP];\n  stack_section\n    .D32(0xfb81ff3d)            // no longer saved r4\n    .D32(0x8112e110)            // saved fp\n    .D32(0x40005510)            // return address\n    .Mark(&frame1_sp);          // This effectively sets stack_section.start().\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004002;\n  raw_context.iregs[0] = 0xb5d55e68;  // saved r4\n  raw_context.iregs[1] = 0xebd134f3;  // saved r5\n  raw_context.iregs[2] = 0xa31e74bc;  // saved r6\n  raw_context.iregs[3] = 0x2dcb16b3;  // saved r7\n  raw_context.iregs[4] = 0xfdd35466;  // distinct callee r4\n  raw_context.iregs[5] = 0xf18c946c;  // distinct callee r5\n  raw_context.iregs[6] = 0xac2079e8;  // distinct callee r6\n  raw_context.iregs[7] = 0xa449829f;  // distinct callee r7\n  raw_context.iregs[MD_CONTEXT_ARM_REG_FP] = 0xbe145fc4; // distinct callee fp\n  CheckWalk();\n}\n\nTEST_F(CFI, At4003) {\n  Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP];\n  stack_section\n    .D32(0x48c8dd5a)            // saved r1 (even though it's not callee-saves)\n    .D32(0xcb78040e)            // no longer saved r4\n    .D32(0x8112e110)            // saved fp\n    .D32(0x40005510)            // return address\n    .Mark(&frame1_sp);          // This effectively sets stack_section.start().\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004003;\n  raw_context.iregs[1] = 0xfb756319;                     // distinct callee r1\n  raw_context.iregs[MD_CONTEXT_ARM_REG_FP] = 0x0a2857ea; // distinct callee fp\n  expected.iregs[1] = 0x48c8dd5a;    // caller's r1\n  expected_validity |= StackFrameARM::CONTEXT_VALID_R1;\n  CheckWalk();\n}\n\n// We have no new rule at module offset 0x4004, so the results here should\n// be the same as those at module offset 0x4003.\nTEST_F(CFI, At4004) {\n  Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP];\n  stack_section\n    .D32(0x48c8dd5a)            // saved r1 (even though it's not callee-saves)\n    .D32(0xcb78040e)            // no longer saved r4\n    .D32(0x8112e110)            // saved fp\n    .D32(0x40005510)            // return address\n    .Mark(&frame1_sp);          // This effectively sets stack_section.start().\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004004;\n  raw_context.iregs[1] = 0xfb756319; // distinct callee r1\n  expected.iregs[1] = 0x48c8dd5a; // caller's r1\n  expected_validity |= StackFrameARM::CONTEXT_VALID_R1;\n  CheckWalk();\n}\n\n// Here we move the .cfa, but provide an explicit rule to recover the SP,\n// so again there should be no change in the registers recovered.\nTEST_F(CFI, At4005) {\n  Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP];\n  stack_section\n    .D32(0x48c8dd5a)            // saved r1 (even though it's not callee-saves)\n    .D32(0xf013f841)            // no longer saved r4\n    .D32(0x8112e110)            // saved fp\n    .D32(0x40005510)            // return address\n    .Mark(&frame1_sp);          // This effectively sets stack_section.start().\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004005;\n  raw_context.iregs[1] = 0xfb756319; // distinct callee r1\n  expected.iregs[1] = 0x48c8dd5a; // caller's r1\n  expected_validity |= StackFrameARM::CONTEXT_VALID_R1;\n  CheckWalk();\n}\n\n// Here we provide an explicit rule for the PC, and have the saved .ra be\n// bogus.\nTEST_F(CFI, At4006) {\n  Label frame1_sp = expected.iregs[MD_CONTEXT_ARM_REG_SP];\n  stack_section\n    .D32(0x40005510)            // saved pc\n    .D32(0x48c8dd5a)            // saved r1 (even though it's not callee-saves)\n    .D32(0xf013f841)            // no longer saved r4\n    .D32(0x8112e110)            // saved fp\n    .D32(0xf8d15783)            // .ra rule recovers this, which is garbage\n    .Mark(&frame1_sp);          // This effectively sets stack_section.start().\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40004006;\n  raw_context.iregs[1] = 0xfb756319; // callee's r1, different from caller's\n  expected.iregs[1] = 0x48c8dd5a; // caller's r1\n  expected_validity |= StackFrameARM::CONTEXT_VALID_R1;\n  CheckWalk();\n}\n\n// Check that we reject rules that would cause the stack pointer to\n// move in the wrong direction.\nTEST_F(CFI, RejectBackwards) {\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40006000;\n  raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = 0x80000000;\n  raw_context.iregs[MD_CONTEXT_ARM_REG_LR] = 0x40005510;\n  StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(1U, frames->size());\n}\n\n// Check that we reject rules whose expressions' evaluation fails.\nTEST_F(CFI, RejectBadExpressions) {\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40007000;\n  raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = 0x80000000;\n  StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(1U, frames->size());\n}\n\nclass StackwalkerARMFixtureIOS : public StackwalkerARMFixture {\n public:\n  StackwalkerARMFixtureIOS() {\n    system_info.os = \"iOS\";\n    system_info.os_short = \"ios\";\n  }\n};\n\nclass GetFramesByFramePointer: public StackwalkerARMFixtureIOS, public Test { };\n\nTEST_F(GetFramesByFramePointer, OnlyFramePointer) {\n  stack_section.start() = 0x80000000;\n  u_int32_t return_address1 = 0x50000100;\n  u_int32_t return_address2 = 0x50000900;\n  Label frame1_sp, frame2_sp;\n  Label frame1_fp, frame2_fp;\n  stack_section\n    // frame 0\n    .Append(32, 0)           // Whatever values on the stack.\n    .D32(0x0000000D)         // junk that's not\n    .D32(0xF0000000)         // a return address.\n\n    .Mark(&frame1_fp)        // Next fp will point to the next value.\n    .D32(frame2_fp)          // Save current frame pointer.\n    .D32(return_address2)    // Save current link register.\n    .Mark(&frame1_sp)\n\n    // frame 1\n    .Append(32, 0)           // Whatever values on the stack.\n    .D32(0x0000000D)         // junk that's not\n    .D32(0xF0000000)         // a return address.\n\n    .Mark(&frame2_fp)\n    .D32(0)\n    .D32(0)\n    .Mark(&frame2_sp)\n\n    // frame 2\n    .Append(32, 0)           // Whatever values on the stack.\n    .D32(0x0000000D)         // junk that's not\n    .D32(0xF0000000);        // a return address.\n  RegionFromSection();\n\n\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40005510;\n  raw_context.iregs[MD_CONTEXT_ARM_REG_LR] = return_address1;\n  raw_context.iregs[MD_CONTEXT_ARM_REG_IOS_FP] = frame1_fp.Value();\n  raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value();\n\n  StackwalkerARM walker(&system_info, &raw_context, MD_CONTEXT_ARM_REG_IOS_FP,\n                        &stack_region, &modules, &supplier, &resolver);\n\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(3U, frames->size());\n\n  StackFrameARM *frame0 = static_cast<StackFrameARM *>(frames->at(0));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n  ASSERT_EQ(StackFrameARM::CONTEXT_VALID_ALL, frame0->context_validity);\n  EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context)));\n\n  StackFrameARM *frame1 = static_cast<StackFrameARM *>(frames->at(1));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame1->trust);\n  ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC |\n             StackFrameARM::CONTEXT_VALID_LR |\n             StackFrameARM::RegisterValidFlag(MD_CONTEXT_ARM_REG_IOS_FP) |\n             StackFrameARM::CONTEXT_VALID_SP),\n            frame1->context_validity);\n  EXPECT_EQ(return_address1, frame1->context.iregs[MD_CONTEXT_ARM_REG_PC]);\n  EXPECT_EQ(return_address2, frame1->context.iregs[MD_CONTEXT_ARM_REG_LR]);\n  EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_ARM_REG_SP]);\n  EXPECT_EQ(frame2_fp.Value(),\n            frame1->context.iregs[MD_CONTEXT_ARM_REG_IOS_FP]);\n\n  StackFrameARM *frame2 = static_cast<StackFrameARM *>(frames->at(2));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame2->trust);\n  ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC |\n             StackFrameARM::CONTEXT_VALID_LR |\n             StackFrameARM::RegisterValidFlag(MD_CONTEXT_ARM_REG_IOS_FP) |\n             StackFrameARM::CONTEXT_VALID_SP),\n            frame2->context_validity);\n  EXPECT_EQ(return_address2, frame2->context.iregs[MD_CONTEXT_ARM_REG_PC]);\n  EXPECT_EQ(0, frame2->context.iregs[MD_CONTEXT_ARM_REG_LR]);\n  EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_ARM_REG_SP]);\n  EXPECT_EQ(0, frame2->context.iregs[MD_CONTEXT_ARM_REG_IOS_FP]);\n}\n\nTEST_F(GetFramesByFramePointer, FramePointerAndCFI) {\n  // Provide the standatd STACK CFI records that is obtained when exmining an\n  // executable produced by XCode.\n  SetModuleSymbols(&module1,\n                     // Adding a function in CFI.\n                     \"FUNC 4000 1000 10 enchiridion\\n\"\n\n                     \"STACK CFI INIT 4000 100 .cfa: sp 0 + .ra: lr\\n\"\n                     \"STACK CFI 4001 .cfa: sp 8 + .ra: .cfa -4 + ^\"\n                     \" r7: .cfa -8 + ^\\n\"\n                     \"STACK CFI 4002 .cfa: r7 8 +\\n\"\n                  );\n\n  stack_section.start() = 0x80000000;\n  u_int32_t return_address1 = 0x40004010;\n  u_int32_t return_address2 = 0x50000900;\n  Label frame1_sp, frame2_sp;\n  Label frame1_fp, frame2_fp;\n  stack_section\n    // frame 0\n    .Append(32, 0)           // Whatever values on the stack.\n    .D32(0x0000000D)         // junk that's not\n    .D32(0xF0000000)         // a return address.\n\n    .Mark(&frame1_fp)        // Next fp will point to the next value.\n    .D32(frame2_fp)          // Save current frame pointer.\n    .D32(return_address2)    // Save current link register.\n    .Mark(&frame1_sp)\n\n    // frame 1\n    .Append(32, 0)           // Whatever values on the stack.\n    .D32(0x0000000D)         // junk that's not\n    .D32(0xF0000000)         // a return address.\n\n    .Mark(&frame2_fp)\n    .D32(0)\n    .D32(0)\n    .Mark(&frame2_sp)\n\n    // frame 2\n    .Append(32, 0)           // Whatever values on the stack.\n    .D32(0x0000000D)         // junk that's not\n    .D32(0xF0000000);        // a return address.\n  RegionFromSection();\n\n\n  raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x50000400;\n  raw_context.iregs[MD_CONTEXT_ARM_REG_LR] = return_address1;\n  raw_context.iregs[MD_CONTEXT_ARM_REG_IOS_FP] = frame1_fp.Value();\n  raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value();\n\n  StackwalkerARM walker(&system_info, &raw_context, MD_CONTEXT_ARM_REG_IOS_FP,\n                        &stack_region, &modules, &supplier, &resolver);\n\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(3U, frames->size());\n\n  StackFrameARM *frame0 = static_cast<StackFrameARM *>(frames->at(0));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n  ASSERT_EQ(StackFrameARM::CONTEXT_VALID_ALL, frame0->context_validity);\n  EXPECT_EQ(0, memcmp(&raw_context, &frame0->context, sizeof(raw_context)));\n\n  StackFrameARM *frame1 = static_cast<StackFrameARM *>(frames->at(1));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame1->trust);\n  ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC |\n             StackFrameARM::CONTEXT_VALID_LR |\n             StackFrameARM::RegisterValidFlag(MD_CONTEXT_ARM_REG_IOS_FP) |\n             StackFrameARM::CONTEXT_VALID_SP),\n            frame1->context_validity);\n  EXPECT_EQ(return_address1, frame1->context.iregs[MD_CONTEXT_ARM_REG_PC]);\n  EXPECT_EQ(return_address2, frame1->context.iregs[MD_CONTEXT_ARM_REG_LR]);\n  EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_ARM_REG_SP]);\n  EXPECT_EQ(frame2_fp.Value(),\n            frame1->context.iregs[MD_CONTEXT_ARM_REG_IOS_FP]);\n  EXPECT_EQ(\"enchiridion\", frame1->function_name);\n  EXPECT_EQ(0x40004000U, frame1->function_base);\n\n\n  StackFrameARM *frame2 = static_cast<StackFrameARM *>(frames->at(2));\n  EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame2->trust);\n  ASSERT_EQ((StackFrameARM::CONTEXT_VALID_PC |\n             StackFrameARM::CONTEXT_VALID_LR |\n             StackFrameARM::RegisterValidFlag(MD_CONTEXT_ARM_REG_IOS_FP) |\n             StackFrameARM::CONTEXT_VALID_SP),\n            frame2->context_validity);\n  EXPECT_EQ(return_address2, frame2->context.iregs[MD_CONTEXT_ARM_REG_PC]);\n  EXPECT_EQ(0, frame2->context.iregs[MD_CONTEXT_ARM_REG_LR]);\n  EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_ARM_REG_SP]);\n  EXPECT_EQ(0, frame2->context.iregs[MD_CONTEXT_ARM_REG_IOS_FP]);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_ppc.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stackwalker_ppc.cc: ppc-specific stackwalker.\n//\n// See stackwalker_ppc.h for documentation.\n//\n// Author: Mark Mentovai\n\n\n#include \"processor/stackwalker_ppc.h\"\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/memory_region.h\"\n#include \"google_breakpad/processor/stack_frame_cpu.h\"\n#include \"processor/logging.h\"\n\nnamespace google_breakpad {\n\n\nStackwalkerPPC::StackwalkerPPC(const SystemInfo *system_info,\n                               const MDRawContextPPC *context,\n                               MemoryRegion *memory,\n                               const CodeModules *modules,\n                               SymbolSupplier *supplier,\n                               SourceLineResolverInterface *resolver)\n    : Stackwalker(system_info, memory, modules, supplier, resolver),\n      context_(context) {\n  if (memory_->GetBase() + memory_->GetSize() - 1 > 0xffffffff) {\n    // This implementation only covers 32-bit ppc CPUs.  The limits of the\n    // supplied stack are invalid.  Mark memory_ = NULL, which will cause\n    // stackwalking to fail.\n    BPLOG(ERROR) << \"Memory out of range for stackwalking: \" <<\n                    HexString(memory_->GetBase()) << \"+\" <<\n                    HexString(memory_->GetSize());\n    memory_ = NULL;\n  }\n}\n\n\nStackFrame* StackwalkerPPC::GetContextFrame() {\n  if (!context_ || !memory_) {\n    BPLOG(ERROR) << \"Can't get context frame without context or memory\";\n    return NULL;\n  }\n\n  StackFramePPC *frame = new StackFramePPC();\n\n  // The instruction pointer is stored directly in a register, so pull it\n  // straight out of the CPU context structure.\n  frame->context = *context_;\n  frame->context_validity = StackFramePPC::CONTEXT_VALID_ALL;\n  frame->trust = StackFrame::FRAME_TRUST_CONTEXT;\n  frame->instruction = frame->context.srr0;\n\n  return frame;\n}\n\n\nStackFrame* StackwalkerPPC::GetCallerFrame(const CallStack *stack) {\n  if (!memory_ || !stack) {\n    BPLOG(ERROR) << \"Can't get caller frame without memory or stack\";\n    return NULL;\n  }\n\n  // The instruction pointers for previous frames are saved on the stack.\n  // The typical ppc calling convention is for the called procedure to store\n  // its return address in the calling procedure's stack frame at 8(%r1),\n  // and to allocate its own stack frame by decrementing %r1 (the stack\n  // pointer) and saving the old value of %r1 at 0(%r1).  Because the ppc has\n  // no hardware stack, there is no distinction between the stack pointer and\n  // frame pointer, and what is typically thought of as the frame pointer on\n  // an x86 is usually referred to as the stack pointer on a ppc.\n\n  StackFramePPC *last_frame = static_cast<StackFramePPC*>(\n      stack->frames()->back());\n\n  // A caller frame must reside higher in memory than its callee frames.\n  // Anything else is an error, or an indication that we've reached the\n  // end of the stack.\n  u_int32_t stack_pointer;\n  if (!memory_->GetMemoryAtAddress(last_frame->context.gpr[1],\n                                   &stack_pointer) ||\n      stack_pointer <= last_frame->context.gpr[1]) {\n    return NULL;\n  }\n\n  // Mac OS X/Darwin gives 1 as the return address from the bottom-most\n  // frame in a stack (a thread's entry point).  I haven't found any\n  // documentation on this, but 0 or 1 would be bogus return addresses,\n  // so check for them here and return false (end of stack) when they're\n  // hit to avoid having a phantom frame.\n  u_int32_t instruction;\n  if (!memory_->GetMemoryAtAddress(stack_pointer + 8, &instruction) ||\n      instruction <= 1) {\n    return NULL;\n  }\n\n  StackFramePPC *frame = new StackFramePPC();\n\n  frame->context = last_frame->context;\n  frame->context.srr0 = instruction;\n  frame->context.gpr[1] = stack_pointer;\n  frame->context_validity = StackFramePPC::CONTEXT_VALID_SRR0 |\n                            StackFramePPC::CONTEXT_VALID_GPR1;\n  frame->trust = StackFrame::FRAME_TRUST_FP;\n\n  // frame->context.srr0 is the return address, which is one instruction\n  // past the branch that caused us to arrive at the callee.  Set\n  // frame_ppc->instruction to four less than that.  Since all ppc\n  // instructions are 4 bytes wide, this is the address of the branch\n  // instruction.  This allows source line information to match up with the\n  // line that contains a function call.  Callers that require the exact\n  // return address value may access the context.srr0 field of StackFramePPC.\n  frame->instruction = frame->context.srr0 - 4;\n\n  return frame;\n}\n\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_ppc.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stackwalker_ppc.h: ppc-specific stackwalker.\n//\n// Provides stack frames given ppc register context and a memory region\n// corresponding to a ppc stack.\n//\n// Author: Mark Mentovai\n\n\n#ifndef PROCESSOR_STACKWALKER_PPC_H__\n#define PROCESSOR_STACKWALKER_PPC_H__\n\n\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"google_breakpad/processor/stackwalker.h\"\n\nnamespace google_breakpad {\n\nclass CodeModules;\n\nclass StackwalkerPPC : public Stackwalker {\n public:\n  // context is a ppc context object that gives access to ppc-specific\n  // register state corresponding to the innermost called frame to be\n  // included in the stack.  The other arguments are passed directly through\n  // to the base Stackwalker constructor.\n  StackwalkerPPC(const SystemInfo *system_info,\n                 const MDRawContextPPC *context,\n                 MemoryRegion *memory,\n                 const CodeModules *modules,\n                 SymbolSupplier *supplier,\n                 SourceLineResolverInterface *resolver);\n\n private:\n  // Implementation of Stackwalker, using ppc context (stack pointer in %r1,\n  // saved program counter in %srr0) and stack conventions (saved stack\n  // pointer at 0(%r1), return address at 8(0(%r1)).\n  virtual StackFrame* GetContextFrame();\n  virtual StackFrame* GetCallerFrame(const CallStack *stack);\n\n  // Stores the CPU context corresponding to the innermost stack frame to\n  // be returned by GetContextFrame.\n  const MDRawContextPPC *context_;\n};\n\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_STACKWALKER_PPC_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_selftest.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stackwalker_selftest.cc: Tests StackwalkerX86 or StackwalkerPPC using the\n// running process' stack as test data, if running on an x86 or ppc and\n// compiled with gcc.  This test is not enabled in the \"make check\" suite\n// by default, because certain optimizations interfere with its proper\n// operation.  To turn it on, configure with --enable-selftest.\n//\n// Optimizations that cause problems:\n//  - stack frame reuse.  The Recursor function here calls itself with\n//    |return Recursor|.  When the caller's frame is reused, it will cause\n//    CountCallerFrames to correctly return the same number of frames\n//    in both the caller and callee.  This is considered an unexpected\n//    condition in the test, which expects a callee to have one more\n//    caller frame in the stack than its caller.\n//  - frame pointer omission.  Even with a stackwalker that understands\n//    this optimization, the code to harness debug information currently\n//    only exists to retrieve it from minidumps, not the current process.\n//\n// This test can also serve as a developmental and debugging aid if\n// PRINT_STACKS is defined.\n//\n// Author: Mark Mentovai\n\n#include \"processor/logging.h\"\n\n#if defined(__i386) && !defined(__i386__)\n#define __i386__\n#endif\n#if defined(__sparc) && !defined(__sparc__)\n#define __sparc__\n#endif\n \n#if (defined(__SUNPRO_CC) || defined(__GNUC__)) && \\\n    (defined(__i386__) || defined(__ppc__) || defined(__sparc__))\n\n\n#include <stdio.h>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"google_breakpad/processor/basic_source_line_resolver.h\"\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/memory_region.h\"\n#include \"google_breakpad/processor/stack_frame.h\"\n#include \"google_breakpad/processor/stack_frame_cpu.h\"\n#include \"processor/scoped_ptr.h\"\n\nusing google_breakpad::BasicSourceLineResolver;\nusing google_breakpad::CallStack;\nusing google_breakpad::MemoryRegion;\nusing google_breakpad::scoped_ptr;\nusing google_breakpad::StackFrame;\nusing google_breakpad::StackFramePPC;\nusing google_breakpad::StackFrameX86;\nusing google_breakpad::StackFrameSPARC;\n\n#if defined(__i386__)\n#include \"processor/stackwalker_x86.h\"\nusing google_breakpad::StackwalkerX86;\n#elif defined(__ppc__)\n#include \"processor/stackwalker_ppc.h\"\nusing google_breakpad::StackwalkerPPC;\n#elif defined(__sparc__)\n#include \"processor/stackwalker_sparc.h\"\nusing google_breakpad::StackwalkerSPARC;\n#endif  // __i386__ || __ppc__ || __sparc__\n\n#define RECURSION_DEPTH 100\n\n\n// A simple MemoryRegion subclass that provides direct access to this\n// process' memory space by pointer.\nclass SelfMemoryRegion : public MemoryRegion {\n public:\n  virtual u_int64_t GetBase() { return 0; }\n  virtual u_int32_t GetSize() { return 0xffffffff; }\n\n  bool GetMemoryAtAddress(u_int64_t address, u_int8_t*  value) {\n      return GetMemoryAtAddressInternal(address, value); }\n  bool GetMemoryAtAddress(u_int64_t address, u_int16_t* value) {\n      return GetMemoryAtAddressInternal(address, value); }\n  bool GetMemoryAtAddress(u_int64_t address, u_int32_t* value) {\n      return GetMemoryAtAddressInternal(address, value); }\n  bool GetMemoryAtAddress(u_int64_t address, u_int64_t* value) {\n      return GetMemoryAtAddressInternal(address, value); }\n\n private:\n  template<typename T> bool GetMemoryAtAddressInternal(u_int64_t address,\n                                                       T*        value) {\n    // Without knowing what addresses are actually mapped, just assume that\n    // everything low is not mapped.  This helps the stackwalker catch the\n    // end of a stack when it tries to dereference a null or low pointer\n    // in an attempt to find the caller frame.  Other unmapped accesses will\n    // cause the program to crash, but that would properly be a test failure.\n    if (address < 0x100)\n      return false;\n\n    u_int8_t* memory = 0;\n    *value = *reinterpret_cast<const T*>(&memory[address]);\n    return true;\n  }\n};\n\n\n#if defined(__GNUC__)\n\n\n#if defined(__i386__)\n\n// GetEBP returns the current value of the %ebp register.  Because it's\n// implemented as a function, %ebp itself contains GetEBP's frame pointer\n// and not the caller's frame pointer.  Dereference %ebp to obtain the\n// caller's frame pointer, which the compiler-generated preamble stored\n// on the stack (provided frame pointers are not being omitted.)  Because\n// this function depends on the compiler-generated preamble, inlining is\n// disabled.\nstatic u_int32_t GetEBP() __attribute__((noinline));\nstatic u_int32_t GetEBP() {\n  u_int32_t ebp;\n  __asm__ __volatile__(\n    \"movl (%%ebp), %0\"\n    : \"=a\" (ebp)\n  );\n  return ebp;\n}\n\n\n// The caller's %esp is 8 higher than the value of %ebp in this function,\n// assuming that it's not inlined and that the standard prolog is used.\n// The CALL instruction places a 4-byte return address on the stack above\n// the caller's %esp, and this function's prolog will save the caller's %ebp\n// on the stack as well, for another 4 bytes, before storing %esp in %ebp.\nstatic u_int32_t GetESP() __attribute__((noinline));\nstatic u_int32_t GetESP() {\n  u_int32_t ebp;\n  __asm__ __volatile__(\n    \"movl %%ebp, %0\"\n    : \"=a\" (ebp)\n  );\n  return ebp + 8;\n}\n\n\n// GetEIP returns the instruction pointer identifying the next instruction\n// to execute after GetEIP returns.  It obtains this information from the\n// stack, where it was placed by the call instruction that called GetEIP.\n// This function depends on frame pointers not being omitted.  It is possible\n// to write a pure asm version of this routine that has no compiler-generated\n// preamble and uses %esp instead of %ebp; that would function in the\n// absence of frame pointers.  However, the simpler approach is used here\n// because GetEBP and stackwalking necessarily depends on access to frame\n// pointers.  Because this function depends on a call instruction and the\n// compiler-generated preamble, inlining is disabled.\nstatic u_int32_t GetEIP() __attribute__((noinline));\nstatic u_int32_t GetEIP() {\n  u_int32_t eip;\n  __asm__ __volatile__(\n    \"movl 4(%%ebp), %0\"\n    : \"=a\" (eip)\n  );\n  return eip;\n}\n\n\n#elif defined(__ppc__)\n\n\n// GetSP returns the current value of the %r1 register, which by convention,\n// is the stack pointer on ppc.  Because it's implemented as a function,\n// %r1 itself contains GetSP's own stack pointer and not the caller's stack\n// pointer.  Dereference %r1 to obtain the caller's stack pointer, which the\n// compiler-generated prolog stored on the stack.  Because this function\n// depends on the compiler-generated prolog, inlining is disabled.\nstatic u_int32_t GetSP() __attribute__((noinline));\nstatic u_int32_t GetSP() {\n  u_int32_t sp;\n  __asm__ __volatile__(\n    \"lwz %0, 0(r1)\"\n    : \"=r\" (sp)\n  );\n  return sp;\n}\n\n\n// GetPC returns the program counter identifying the next instruction to\n// execute after GetPC returns.  It obtains this information from the\n// link register, where it was placed by the branch instruction that called\n// GetPC.  Because this function depends on the caller's use of a branch\n// instruction, inlining is disabled.\nstatic u_int32_t GetPC() __attribute__((noinline));\nstatic u_int32_t GetPC() {\n  u_int32_t lr;\n  __asm__ __volatile__(\n    \"mflr %0\"\n    : \"=r\" (lr)\n  );\n  return lr;\n}\n\n\n#elif defined(__sparc__)\n\n\n// GetSP returns the current value of the %sp/%o6/%g_r[14] register, which \n// by convention, is the stack pointer on sparc.  Because it's implemented\n// as a function, %sp itself contains GetSP's own stack pointer and not \n// the caller's stack pointer.  Dereference  to obtain the caller's stack \n// pointer, which the compiler-generated prolog stored on the stack.\n// Because this function depends on the compiler-generated prolog, inlining\n// is disabled.\nstatic u_int32_t GetSP() __attribute__((noinline));\nstatic u_int32_t GetSP() {\n  u_int32_t sp;\n  __asm__ __volatile__(\n    \"mov %%fp, %0\"\n    : \"=r\" (sp)\n  );\n  return sp;\n}\n\n// GetFP returns the current value of the %fp register.  Because it's\n// implemented as a function, %fp itself contains GetFP's frame pointer\n// and not the caller's frame pointer.  Dereference %fp to obtain the\n// caller's frame pointer, which the compiler-generated preamble stored\n// on the stack (provided frame pointers are not being omitted.)  Because\n// this function depends on the compiler-generated preamble, inlining is\n// disabled.\nstatic u_int32_t GetFP() __attribute__((noinline));\nstatic u_int32_t GetFP() {\n  u_int32_t fp;\n  __asm__ __volatile__(\n    \"ld [%%fp+56], %0\"\n    : \"=r\" (fp)\n  );\n  return fp;\n}\n\n// GetPC returns the program counter identifying the next instruction to\n// execute after GetPC returns.  It obtains this information from the\n// link register, where it was placed by the branch instruction that called\n// GetPC.  Because this function depends on the caller's use of a branch\n// instruction, inlining is disabled.\nstatic u_int32_t GetPC() __attribute__((noinline));\nstatic u_int32_t GetPC() {\n  u_int32_t pc;\n  __asm__ __volatile__(\n    \"mov %%i7, %0\"\n    : \"=r\" (pc)\n  );\n  return pc + 8;\n}\n\n#endif  // __i386__ || __ppc__ || __sparc__\n\n#elif defined(__SUNPRO_CC)\n\n#if defined(__i386__)\nextern \"C\" {\nextern u_int32_t GetEIP();\nextern u_int32_t GetEBP();\nextern u_int32_t GetESP();\n}\n#elif defined(__sparc__)\nextern \"C\" {\nextern u_int32_t GetPC();\nextern u_int32_t GetFP();\nextern u_int32_t GetSP();\n}\n#endif // __i386__ || __sparc__\n\n#endif // __GNUC__ || __SUNPRO_CC\n\n// CountCallerFrames returns the number of stack frames beneath the function\n// that called CountCallerFrames.  Because this function's return value\n// is dependent on the size of the stack beneath it, inlining is disabled,\n// and any function that calls this should not be inlined either.\n#if defined(__GNUC__)\nstatic unsigned int CountCallerFrames() __attribute__((noinline));\n#elif defined(__SUNPRO_CC)\nstatic unsigned int CountCallerFrames();\n#endif\nstatic unsigned int CountCallerFrames() {\n  SelfMemoryRegion memory;\n  BasicSourceLineResolver resolver;\n\n#if defined(__i386__)\n  MDRawContextX86 context = MDRawContextX86();\n  context.eip = GetEIP();\n  context.ebp = GetEBP();\n  context.esp = GetESP();\n\n  StackwalkerX86 stackwalker = StackwalkerX86(NULL, &context, &memory, NULL,\n                                              NULL, &resolver);\n#elif defined(__ppc__)\n  MDRawContextPPC context = MDRawContextPPC();\n  context.srr0 = GetPC();\n  context.gpr[1] = GetSP();\n\n  StackwalkerPPC stackwalker = StackwalkerPPC(NULL, &context, &memory, NULL,\n                                              NULL, &resolver);\n#elif defined(__sparc__)\n  MDRawContextSPARC context = MDRawContextSPARC();\n  context.pc = GetPC();\n  context.g_r[14] = GetSP();\n  context.g_r[30] = GetFP();\n\n  StackwalkerSPARC stackwalker = StackwalkerSPARC(NULL, &context, &memory,\n                                                  NULL, NULL, &resolver);\n#endif  // __i386__ || __ppc__ || __sparc__\n\n  CallStack stack;\n  stackwalker.Walk(&stack);\n\n#ifdef PRINT_STACKS\n  printf(\"\\n\");\n  for (unsigned int frame_index = 0;\n      frame_index < stack.frames()->size();\n      ++frame_index) {\n    StackFrame *frame = stack.frames()->at(frame_index);\n    printf(\"frame %-3d  instruction = 0x%08\" PRIx64,\n           frame_index, frame->instruction);\n#if defined(__i386__)\n    StackFrameX86 *frame_x86 = reinterpret_cast<StackFrameX86*>(frame);\n    printf(\"  esp = 0x%08x  ebp = 0x%08x\\n\",\n           frame_x86->context.esp, frame_x86->context.ebp);\n#elif defined(__ppc__)\n    StackFramePPC *frame_ppc = reinterpret_cast<StackFramePPC*>(frame);\n    printf(\"  gpr[1] = 0x%08x\\n\", frame_ppc->context.gpr[1]);\n#elif defined(__sparc__)\n    StackFrameSPARC *frame_sparc = reinterpret_cast<StackFrameSPARC*>(frame);\n    printf(\"  sp = 0x%08x  fp = 0x%08x\\n\",\n           frame_sparc->context.g_r[14], frame_sparc->context.g_r[30]);\n#endif  // __i386__ || __ppc__ || __sparc__\n  }\n#endif  // PRINT_STACKS\n\n  // Subtract 1 because the caller wants the number of frames beneath\n  // itself.  Because the caller called us, subract two for our frame and its\n  // frame, which are included in stack.size().\n  return stack.frames()->size() - 2;\n}\n\n\n// Recursor verifies that the number stack frames beneath itself is one more\n// than the number of stack frames beneath its parent.  When depth frames\n// have been reached, Recursor stops checking and returns success.  If the\n// frame count check fails at any depth, Recursor will stop and return false.\n// Because this calls CountCallerFrames, inlining is disabled.\n#if defined(__GNUC__)\nstatic bool Recursor(unsigned int depth, unsigned int parent_callers)\n    __attribute__((noinline));\n#elif defined(__SUNPRO_CC)\nstatic bool Recursor(unsigned int depth, unsigned int parent_callers);\n#endif\nstatic bool Recursor(unsigned int depth, unsigned int parent_callers) {\n  unsigned int callers = CountCallerFrames();\n  if (callers != parent_callers + 1)\n    return false;\n\n  if (depth)\n    return Recursor(depth - 1, callers);\n\n  // depth == 0\n  return true;\n}\n\n\n// Because this calls CountCallerFrames, inlining is disabled - but because\n// it's main (and nobody calls it other than the entry point), it wouldn't\n// be inlined anyway.\n#if defined(__GNUC__)\nint main(int argc, char** argv) __attribute__((noinline));\n#elif defined(__SUNPRO_CC)\nint main(int argc, char** argv);\n#endif\nint main(int argc, char** argv) {\n  BPLOG_INIT(&argc, &argv);\n\n  return Recursor(RECURSION_DEPTH, CountCallerFrames()) ? 0 : 1;\n}\n\n\n#else\n// Not i386 or ppc or sparc?  We can only test stacks we know how to walk.\n\n\nint main(int argc, char **argv) {\n  BPLOG_INIT(&argc, &argv);\n\n  // \"make check\" interprets an exit status of 77 to mean that the test is\n  // not supported.\n  BPLOG(ERROR) << \"Selftest not supported here\";\n  return 77;\n}\n\n\n#endif  // (__GNUC__ || __SUNPRO_CC) && (__i386__ || __ppc__ || __sparc__)\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_selftest_sol.s",
    "content": "/* Copyright (c) 2007, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* stackwalker_selftest_sol.s\n * On Solaris, the recommeded compiler is CC, so we can not use gcc inline\n * asm, use this method instead.\n *\n * How to compile: as -P -L -D_ASM -D_STDC -K PIC -o \\\n *                 src/processor/stackwalker_selftest_sol.o \\\n *                 src/processor/stackwalker_selftest_sol.s\n *\n * Author: Michael Shang\n */\n\n#include <sys/asm_linkage.h>\n\n#if defined(__i386)\n\n\nENTRY(GetEBP) \n      pushl    %ebp\n      movl     %esp,%ebp\n      subl     $0x00000004,%esp\n      movl     0x00000000(%ebp),%eax\n      movl     %eax,0xfffffffc(%ebp)\n      movl     0xfffffffc(%ebp),%eax\n      leave    \n      ret      \nSET_SIZE(GetEBP)\n\nENTRY(GetEIP) \n      pushl    %ebp\n      movl     %esp,%ebp\n      subl     $0x00000004,%esp\n      movl     0x00000004(%ebp),%eax\n      movl     %eax,0xfffffffc(%ebp)\n      movl     0xfffffffc(%ebp),%eax\n      leave    \n      ret      \nSET_SIZE(GetEIP)\n\nENTRY(GetESP) \n      pushl    %ebp\n      movl     %esp,%ebp\n      subl     $0x00000004,%esp\n      movl     %ebp,%eax\n      movl     %eax,0xfffffffc(%ebp)\n      movl     0xfffffffc(%ebp),%eax\n      addl     $0x00000008,%eax\n      leave    \n      ret      \nSET_SIZE(GetESP)\n\n\n#elif defined(__sparc)\n\n\nENTRY(GetPC)\n      save     %sp, -120, %sp\n      mov      %i7, %i4\n      inccc    8, %i4\n      mov      %i4, %i0\n      ret      \n      restore  \nSET_SIZE(GetPC)\n\nENTRY(GetSP)\n      save     %sp, -120, %sp\n      mov      %fp, %i4\n      mov      %i4, %i0\n      ret      \n      restore  \nSET_SIZE(GetSP)\n\nENTRY(GetFP)\n      save     %sp, -120, %sp\n      ld       [%fp + 56], %g1\n      mov      %g1, %i0\n      ret      \n      restore  \nSET_SIZE(GetFP)\n\n\n#endif  // __i386 || __sparc\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_sparc.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stackwalker_sparc.cc: sparc-specific stackwalker.\n//\n// See stackwalker_sparc.h for documentation.\n//\n// Author: Michael Shang\n\n\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/memory_region.h\"\n#include \"google_breakpad/processor/stack_frame_cpu.h\"\n#include \"processor/logging.h\"\n#include \"processor/stackwalker_sparc.h\"\n\nnamespace google_breakpad {\n\n\nStackwalkerSPARC::StackwalkerSPARC(const SystemInfo *system_info,\n                                   const MDRawContextSPARC *context,\n                                   MemoryRegion *memory,\n                                   const CodeModules *modules,\n                                   SymbolSupplier *supplier,\n                                   SourceLineResolverInterface *resolver)\n    : Stackwalker(system_info, memory, modules, supplier, resolver),\n      context_(context) {\n}\n\n\nStackFrame* StackwalkerSPARC::GetContextFrame() {\n  if (!context_ || !memory_) {\n    BPLOG(ERROR) << \"Can't get context frame without context or memory\";\n    return NULL;\n  }\n\n  StackFrameSPARC *frame = new StackFrameSPARC();\n\n  // The instruction pointer is stored directly in a register, so pull it\n  // straight out of the CPU context structure.\n  frame->context = *context_;\n  frame->context_validity = StackFrameSPARC::CONTEXT_VALID_ALL;\n  frame->trust = StackFrame::FRAME_TRUST_CONTEXT;\n  frame->instruction = frame->context.pc;\n\n  return frame;\n}\n\n\nStackFrame* StackwalkerSPARC::GetCallerFrame(const CallStack *stack) {\n  if (!memory_ || !stack) {\n    BPLOG(ERROR) << \"Can't get caller frame without memory or stack\";\n    return NULL;\n  }\n\n  StackFrameSPARC *last_frame = static_cast<StackFrameSPARC*>(\n      stack->frames()->back());\n\n  // new: caller\n  // old: callee\n  // %fp, %i6 and g_r[30] is the same, see minidump_format.h\n  // %sp, %o6 and g_r[14] is the same, see minidump_format.h\n  // %sp_new = %fp_old\n  // %fp_new = *(%fp_old + 32 + 32 - 8), where the callee's %i6 \n  // %pc_new = *(%fp_old + 32 + 32 - 4) + 8\n  // which is callee's %i7 plus 8\n\n  // A caller frame must reside higher in memory than its callee frames.\n  // Anything else is an error, or an indication that we've reached the\n  // end of the stack.\n  u_int64_t stack_pointer = last_frame->context.g_r[30];\n  if (stack_pointer <= last_frame->context.g_r[14]) {\n    return NULL;\n  }\n\n  u_int32_t instruction;\n  if (!memory_->GetMemoryAtAddress(stack_pointer + 60,\n                     &instruction) || instruction <= 1) {\n    return NULL;\n  }\n\n  u_int32_t stack_base;\n  if (!memory_->GetMemoryAtAddress(stack_pointer + 56,\n                     &stack_base) || stack_base <= 1) {\n    return NULL;\n  }\n\n  StackFrameSPARC *frame = new StackFrameSPARC();\n\n  frame->context = last_frame->context;\n  frame->context.g_r[14] = stack_pointer;\n  frame->context.g_r[30] = stack_base;\n  \n  // frame->context.pc is the return address, which is 2 instruction\n  // past the branch that caused us to arrive at the callee, which are \n  // a CALL instruction then a NOP instruction.\n  // frame_ppc->instruction to 8 less than that.  Since all sparc\n  // instructions are 4 bytes wide, this is the address of the branch\n  // instruction.  This allows source line information to match up with the\n  // line that contains a function call.  Callers that require the exact\n  // return address value may access the %i7/g_r[31] field of StackFrameSPARC.\n  frame->context.pc = instruction + 8;\n  frame->instruction = instruction;\n  frame->context_validity = StackFrameSPARC::CONTEXT_VALID_PC |\n                            StackFrameSPARC::CONTEXT_VALID_SP |\n                            StackFrameSPARC::CONTEXT_VALID_FP;\n  frame->trust = StackFrame::FRAME_TRUST_FP;\n                            \n  return frame;\n}\n\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_sparc.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stackwalker_sparc.h: sparc-specific stackwalker.\n//\n// Provides stack frames given sparc register context and a memory region\n// corresponding to an sparc stack.\n//\n// Author: Michael Shang\n\n\n#ifndef PROCESSOR_STACKWALKER_SPARC_H__\n#define PROCESSOR_STACKWALKER_SPARC_H__\n\n\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"google_breakpad/processor/stackwalker.h\"\n\nnamespace google_breakpad {\n\nclass CodeModules;\n\nclass StackwalkerSPARC : public Stackwalker {\n public:\n  // context is a sparc context object that gives access to sparc-specific\n  // register state corresponding to the innermost called frame to be\n  // included in the stack.  The other arguments are passed directly through\n  // to the base Stackwalker constructor.\n  StackwalkerSPARC(const SystemInfo *system_info,\n                   const MDRawContextSPARC *context,\n                   MemoryRegion *memory,\n                   const CodeModules *modules,\n                   SymbolSupplier *supplier,\n                   SourceLineResolverInterface *resolver);\n\n private:\n  // Implementation of Stackwalker, using sparc context (%fp, %sp, %pc) and\n  // stack conventions\n  virtual StackFrame* GetContextFrame();\n  virtual StackFrame* GetCallerFrame(const CallStack *stack);\n\n  // Stores the CPU context corresponding to the innermost stack frame to\n  // be returned by GetContextFrame.\n  const MDRawContextSPARC *context_;\n};\n\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_STACKWALKER_SPARC_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_unittest_utils.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// Mock classes for writing stackwalker tests, shared amongst architectures.\n\n#ifndef PROCESSOR_STACKWALKER_UNITTEST_UTILS_H_\n#define PROCESSOR_STACKWALKER_UNITTEST_UTILS_H_\n\n#include <stdlib.h>\n#include <string>\n#include <vector>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/processor/code_module.h\"\n#include \"google_breakpad/processor/code_modules.h\"\n#include \"google_breakpad/processor/memory_region.h\"\n#include \"google_breakpad/processor/symbol_supplier.h\"\n#include \"google_breakpad/processor/system_info.h\"\n\nclass MockMemoryRegion: public google_breakpad::MemoryRegion {\n public:\n  MockMemoryRegion(): base_address_(0) { }\n\n  // Set this region's address and contents. If we have placed an\n  // instance of this class in a test fixture class, individual tests\n  // can use this to provide the region's contents.\n  void Init(u_int64_t base_address, const std::string &contents) {\n    base_address_ = base_address;\n    contents_ = contents;\n  }\n\n  u_int64_t GetBase() const { return base_address_; }\n  u_int32_t GetSize() const { return contents_.size(); }\n\n  bool GetMemoryAtAddress(u_int64_t address, u_int8_t  *value) const {\n    return GetMemoryLittleEndian(address, value);\n  }\n  bool GetMemoryAtAddress(u_int64_t address, u_int16_t *value) const {\n    return GetMemoryLittleEndian(address, value);\n  }\n  bool GetMemoryAtAddress(u_int64_t address, u_int32_t *value) const {\n    return GetMemoryLittleEndian(address, value);\n  }\n  bool GetMemoryAtAddress(u_int64_t address, u_int64_t *value) const {\n    return GetMemoryLittleEndian(address, value);\n  }\n\n private:\n  // Fetch a little-endian value from ADDRESS in contents_ whose size\n  // is BYTES, and store it in *VALUE. Return true on success.\n  template<typename ValueType>\n  bool GetMemoryLittleEndian(u_int64_t address, ValueType *value) const {\n    if (address < base_address_ ||\n        address - base_address_ + sizeof(ValueType) > contents_.size())\n      return false;\n    ValueType v = 0;\n    int start = address - base_address_;\n    // The loop condition is odd, but it's correct for size_t.\n    for (size_t i = sizeof(ValueType) - 1; i < sizeof(ValueType); i--)\n      v = (v << 8) | static_cast<unsigned char>(contents_[start + i]);\n    *value = v;\n    return true;\n  }\n\n  u_int64_t base_address_;\n  std::string contents_;\n};\n\nclass MockCodeModule: public google_breakpad::CodeModule {\n public:\n  MockCodeModule(u_int64_t base_address, u_int64_t size,\n                 const std::string &code_file, const std::string &version)\n      : base_address_(base_address), size_(size), code_file_(code_file) { }\n\n  u_int64_t base_address()       const { return base_address_; }\n  u_int64_t size()               const { return size_; }\n  std::string code_file()        const { return code_file_; }\n  std::string code_identifier()  const { return code_file_; }\n  std::string debug_file()       const { return code_file_; }\n  std::string debug_identifier() const { return code_file_; }\n  std::string version()          const { return version_; }\n  const google_breakpad::CodeModule *Copy() const {\n    abort(); // Tests won't use this.\n  }\n\n private:\n  u_int64_t base_address_;\n  u_int64_t size_;\n  std::string code_file_;\n  std::string version_;\n};\n\nclass MockCodeModules: public google_breakpad::CodeModules {\n public:  \n  typedef google_breakpad::CodeModule CodeModule;\n  typedef google_breakpad::CodeModules CodeModules;\n\n  void Add(const MockCodeModule *module) { \n    modules_.push_back(module);\n  }\n\n  unsigned int module_count() const { return modules_.size(); }\n\n  const CodeModule *GetModuleForAddress(u_int64_t address) const {\n    for (ModuleVector::const_iterator i = modules_.begin();\n         i != modules_.end(); i++) {\n      const MockCodeModule *module = *i;\n      if (module->base_address() <= address &&\n          address - module->base_address() < module->size())\n        return module;\n    }\n    return NULL;\n  };\n\n  const CodeModule *GetMainModule() const { return modules_[0]; }\n\n  const CodeModule *GetModuleAtSequence(unsigned int sequence) const {\n    return modules_.at(sequence);\n  }\n\n  const CodeModule *GetModuleAtIndex(unsigned int index) const {\n    return modules_.at(index);\n  }\n\n  const CodeModules *Copy() const { abort(); } // Tests won't use this.\n\n private:  \n  typedef std::vector<const MockCodeModule *> ModuleVector;\n  ModuleVector modules_;\n};\n\nclass MockSymbolSupplier: public google_breakpad::SymbolSupplier {\n public:\n  typedef google_breakpad::CodeModule CodeModule;\n  typedef google_breakpad::SystemInfo SystemInfo;\n  MOCK_METHOD3(GetSymbolFile, SymbolResult(const CodeModule *module,\n                                           const SystemInfo *system_info,\n                                           std::string *symbol_file));\n  MOCK_METHOD4(GetSymbolFile, SymbolResult(const CodeModule *module,\n                                           const SystemInfo *system_info,\n                                           std::string *symbol_file,\n                                           std::string *symbol_data));\n  MOCK_METHOD4(GetCStringSymbolData, SymbolResult(const CodeModule *module,\n                                                  const SystemInfo *system_info,\n                                                  std::string *symbol_file,\n                                                  char **symbol_data));\n  MOCK_METHOD1(FreeSymbolData, void(const CodeModule *module));\n};\n\n#endif // PROCESSOR_STACKWALKER_UNITTEST_UTILS_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_x86.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stackwalker_x86.cc: x86-specific stackwalker.\n//\n// See stackwalker_x86.h for documentation.\n//\n// Author: Mark Mentovai\n\n\n#include \"processor/postfix_evaluator-inl.h\"\n\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/code_modules.h\"\n#include \"google_breakpad/processor/memory_region.h\"\n#include \"google_breakpad/processor/source_line_resolver_interface.h\"\n#include \"google_breakpad/processor/stack_frame_cpu.h\"\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n#include \"processor/stackwalker_x86.h\"\n#include \"processor/windows_frame_info.h\"\n#include \"processor/cfi_frame_info.h\"\n\nnamespace google_breakpad {\n\n\nconst StackwalkerX86::CFIWalker::RegisterSet\nStackwalkerX86::cfi_register_map_[] = {\n  // It may seem like $eip and $esp are callee-saves, because (with Unix or\n  // cdecl calling conventions) the callee is responsible for having them\n  // restored upon return. But the callee_saves flags here really means\n  // that the walker should assume they're unchanged if the CFI doesn't\n  // mention them, which is clearly wrong for $eip and $esp.\n  { \"$eip\", \".ra\",  false,\n    StackFrameX86::CONTEXT_VALID_EIP, &MDRawContextX86::eip },\n  { \"$esp\", \".cfa\", false,\n    StackFrameX86::CONTEXT_VALID_ESP, &MDRawContextX86::esp },\n  { \"$ebp\", NULL,   true,\n    StackFrameX86::CONTEXT_VALID_EBP, &MDRawContextX86::ebp },\n  { \"$eax\", NULL,   false,\n    StackFrameX86::CONTEXT_VALID_EAX, &MDRawContextX86::eax },\n  { \"$ebx\", NULL,   true,\n    StackFrameX86::CONTEXT_VALID_EBX, &MDRawContextX86::ebx },\n  { \"$ecx\", NULL,   false,\n    StackFrameX86::CONTEXT_VALID_ECX, &MDRawContextX86::ecx },\n  { \"$edx\", NULL,   false,\n    StackFrameX86::CONTEXT_VALID_EDX, &MDRawContextX86::edx },\n  { \"$esi\", NULL,   true,\n    StackFrameX86::CONTEXT_VALID_ESI, &MDRawContextX86::esi },\n  { \"$edi\", NULL,   true,\n    StackFrameX86::CONTEXT_VALID_EDI, &MDRawContextX86::edi },\n};\n\nStackwalkerX86::StackwalkerX86(const SystemInfo *system_info,\n                               const MDRawContextX86 *context,\n                               MemoryRegion *memory,\n                               const CodeModules *modules,\n                               SymbolSupplier *supplier,\n                               SourceLineResolverInterface *resolver)\n    : Stackwalker(system_info, memory, modules, supplier, resolver),\n      context_(context),\n      cfi_walker_(cfi_register_map_,\n                  (sizeof(cfi_register_map_) / sizeof(cfi_register_map_[0]))) {\n  if (memory_->GetBase() + memory_->GetSize() - 1 > 0xffffffff) {\n    // The x86 is a 32-bit CPU, the limits of the supplied stack are invalid.\n    // Mark memory_ = NULL, which will cause stackwalking to fail.\n    BPLOG(ERROR) << \"Memory out of range for stackwalking: \" <<\n                    HexString(memory_->GetBase()) << \"+\" <<\n                    HexString(memory_->GetSize());\n    memory_ = NULL;\n  }\n}\n\nStackFrameX86::~StackFrameX86() {\n  if (windows_frame_info)\n    delete windows_frame_info;\n  windows_frame_info = NULL;\n  if (cfi_frame_info)\n    delete cfi_frame_info;\n  cfi_frame_info = NULL;\n}\n\nStackFrame *StackwalkerX86::GetContextFrame() {\n  if (!context_ || !memory_) {\n    BPLOG(ERROR) << \"Can't get context frame without context or memory\";\n    return NULL;\n  }\n\n  StackFrameX86 *frame = new StackFrameX86();\n\n  // The instruction pointer is stored directly in a register, so pull it\n  // straight out of the CPU context structure.\n  frame->context = *context_;\n  frame->context_validity = StackFrameX86::CONTEXT_VALID_ALL;\n  frame->trust = StackFrame::FRAME_TRUST_CONTEXT;\n  frame->instruction = frame->context.eip;\n\n  return frame;\n}\n\nStackFrameX86 *StackwalkerX86::GetCallerByWindowsFrameInfo(\n    const vector<StackFrame *> &frames,\n    WindowsFrameInfo *last_frame_info) {\n  StackFrame::FrameTrust trust = StackFrame::FRAME_TRUST_NONE;\n\n  StackFrameX86 *last_frame = static_cast<StackFrameX86 *>(frames.back());\n\n  // Save the stack walking info we found, in case we need it later to\n  // find the callee of the frame we're constructing now.\n  last_frame->windows_frame_info = last_frame_info;\n\n  // This function only covers the full STACK WIN case. If\n  // last_frame_info is VALID_PARAMETER_SIZE-only, then we should\n  // assume the traditional frame format or use some other strategy.\n  if (last_frame_info->valid != WindowsFrameInfo::VALID_ALL)\n    return NULL;\n\n  // This stackwalker sets each frame's %esp to its value immediately prior\n  // to the CALL into the callee.  This means that %esp points to the last\n  // callee argument pushed onto the stack, which may not be where %esp points\n  // after the callee returns.  Specifically, the value is correct for the\n  // cdecl calling convention, but not other conventions.  The cdecl\n  // convention requires a caller to pop its callee's arguments from the\n  // stack after the callee returns.  This is usually accomplished by adding\n  // the known size of the arguments to %esp.  Other calling conventions,\n  // including stdcall, thiscall, and fastcall, require the callee to pop any\n  // parameters stored on the stack before returning.  This is usually\n  // accomplished by using the RET n instruction, which pops n bytes off\n  // the stack after popping the return address.\n  //\n  // Because each frame's %esp will point to a location on the stack after\n  // callee arguments have been PUSHed, when locating things in a stack frame\n  // relative to %esp, the size of the arguments to the callee need to be\n  // taken into account.  This seems a little bit unclean, but it's better\n  // than the alternative, which would need to take these same things into\n  // account, but only for cdecl functions.  With this implementation, we get\n  // to be agnostic about each function's calling convention.  Furthermore,\n  // this is how Windows debugging tools work, so it means that the %esp\n  // values produced by this stackwalker directly correspond to the %esp\n  // values you'll see there.\n  //\n  // If the last frame has no callee (because it's the context frame), just\n  // set the callee parameter size to 0: the stack pointer can't point to\n  // callee arguments because there's no callee.  This is correct as long\n  // as the context wasn't captured while arguments were being pushed for\n  // a function call.  Note that there may be functions whose parameter sizes\n  // are unknown, 0 is also used in that case.  When that happens, it should\n  // be possible to walk to the next frame without reference to %esp.\n\n  u_int32_t last_frame_callee_parameter_size = 0;\n  int frames_already_walked = frames.size();\n  if (frames_already_walked >= 2) {\n    const StackFrameX86 *last_frame_callee\n        = static_cast<StackFrameX86 *>(frames[frames_already_walked - 2]);\n    WindowsFrameInfo *last_frame_callee_info\n        = last_frame_callee->windows_frame_info;\n    if (last_frame_callee_info &&\n        (last_frame_callee_info->valid\n         & WindowsFrameInfo::VALID_PARAMETER_SIZE)) {\n      last_frame_callee_parameter_size =\n          last_frame_callee_info->parameter_size;\n    }\n  }\n\n  // Set up the dictionary for the PostfixEvaluator.  %ebp and %esp are used\n  // in each program string, and their previous values are known, so set them\n  // here.\n  PostfixEvaluator<u_int32_t>::DictionaryType dictionary;\n  // Provide the current register values.\n  dictionary[\"$ebp\"] = last_frame->context.ebp;\n  dictionary[\"$esp\"] = last_frame->context.esp;\n  // Provide constants from the debug info for last_frame and its callee.\n  // .cbCalleeParams is a Breakpad extension that allows us to use the\n  // PostfixEvaluator engine when certain types of debugging information\n  // are present without having to write the constants into the program\n  // string as literals.\n  dictionary[\".cbCalleeParams\"] = last_frame_callee_parameter_size;\n  dictionary[\".cbSavedRegs\"] = last_frame_info->saved_register_size;\n  dictionary[\".cbLocals\"] = last_frame_info->local_size;\n\n  u_int32_t raSearchStart = last_frame->context.esp +\n                            last_frame_callee_parameter_size +\n                            last_frame_info->local_size +\n                            last_frame_info->saved_register_size;\n\n  u_int32_t raSearchStartOld = raSearchStart;\n  u_int32_t found = 0; // dummy value\n  // Scan up to three words above the calculated search value, in case\n  // the stack was aligned to a quadword boundary.\n  if (ScanForReturnAddress(raSearchStart, &raSearchStart, &found, 3) &&\n      last_frame->trust == StackFrame::FRAME_TRUST_CONTEXT &&\n      last_frame->windows_frame_info != NULL &&\n      last_frame_info->type_ == WindowsFrameInfo::STACK_INFO_FPO &&\n      raSearchStartOld == raSearchStart &&\n      found == last_frame->context.eip) {\n    // The context frame represents an FPO-optimized Windows system call.\n    // On the top of the stack we have a pointer to the current instruction.\n    // This means that the callee has returned but the return address is still\n    // on the top of the stack which is very atypical situaltion.\n    // Skip one slot from the stack and do another scan in order to get the\n    // actual return address.\n    raSearchStart += 4;\n    ScanForReturnAddress(raSearchStart, &raSearchStart, &found, 3);\n  }\n\n  // The difference between raSearch and raSearchStart is unknown,\n  // but making them the same seems to work well in practice.\n  dictionary[\".raSearchStart\"] = raSearchStart;\n  dictionary[\".raSearch\"] = raSearchStart;\n\n  dictionary[\".cbParams\"] = last_frame_info->parameter_size;\n\n  // Decide what type of program string to use. The program string is in\n  // postfix notation and will be passed to PostfixEvaluator::Evaluate.\n  // Given the dictionary and the program string, it is possible to compute\n  // the return address and the values of other registers in the calling\n  // function. Because of bugs described below, the stack may need to be\n  // scanned for these values. The results of program string evaluation\n  // will be used to determine whether to scan for better values.\n  string program_string;\n  bool recover_ebp = true;\n\n  trust = StackFrame::FRAME_TRUST_CFI;\n  if (!last_frame_info->program_string.empty()) {\n    // The FPO data has its own program string, which will tell us how to\n    // get to the caller frame, and may even fill in the values of\n    // nonvolatile registers and provide pointers to local variables and\n    // parameters.  In some cases, particularly with program strings that use\n    // .raSearchStart, the stack may need to be scanned afterward.\n    program_string = last_frame_info->program_string;\n  } else if (last_frame_info->allocates_base_pointer) {\n    // The function corresponding to the last frame doesn't use the frame\n    // pointer for conventional purposes, but it does allocate a new\n    // frame pointer and use it for its own purposes.  Its callee's\n    // information is still accessed relative to %esp, and the previous\n    // value of %ebp can be recovered from a location in its stack frame,\n    // within the saved-register area.\n    //\n    // Functions that fall into this category use the %ebp register for\n    // a purpose other than the frame pointer.  They restore the caller's\n    // %ebp before returning.  These functions create their stack frame\n    // after a CALL by decrementing the stack pointer in an amount\n    // sufficient to store local variables, and then PUSHing saved\n    // registers onto the stack.  Arguments to a callee function, if any,\n    // are PUSHed after that.  Walking up to the caller, therefore,\n    // can be done solely with calculations relative to the stack pointer\n    // (%esp).  The return address is recovered from the memory location\n    // above the known sizes of the callee's parameters, saved registers,\n    // and locals.  The caller's stack pointer (the value of %esp when\n    // the caller executed CALL) is the location immediately above the\n    // saved return address.  The saved value of %ebp to be restored for\n    // the caller is at a known location in the saved-register area of\n    // the stack frame.\n    //\n    // For this type of frame, MSVC 14 (from Visual Studio 8/2005) in\n    // link-time code generation mode (/LTCG and /GL) can generate erroneous\n    // debugging data.  The reported size of saved registers can be 0,\n    // which is clearly an error because these frames must, at the very\n    // least, save %ebp.  For this reason, in addition to those given above\n    // about the use of .raSearchStart, the stack may need to be scanned\n    // for a better return address and a better frame pointer after the\n    // program string is evaluated.\n    //\n    // %eip_new = *(%esp_old + callee_params + saved_regs + locals)\n    // %ebp_new = *(%esp_old + callee_params + saved_regs - 8)\n    // %esp_new = %esp_old + callee_params + saved_regs + locals + 4\n    program_string = \"$eip .raSearchStart ^ = \"\n        \"$ebp $esp .cbCalleeParams + .cbSavedRegs + 8 - ^ = \"\n        \"$esp .raSearchStart 4 + =\";\n  } else {\n    // The function corresponding to the last frame doesn't use %ebp at\n    // all.  The callee frame is located relative to %esp.\n    //\n    // The called procedure's instruction pointer and stack pointer are\n    // recovered in the same way as the case above, except that no\n    // frame pointer (%ebp) is used at all, so it is not saved anywhere\n    // in the callee's stack frame and does not need to be recovered.\n    // Because %ebp wasn't used in the callee, whatever value it has\n    // is the value that it had in the caller, so it can be carried\n    // straight through without bringing its validity into question.\n    //\n    // Because of the use of .raSearchStart, the stack will possibly be\n    // examined to locate a better return address after program string\n    // evaluation.  The stack will not be examined to locate a saved\n    // %ebp value, because these frames do not save (or use) %ebp.\n    //\n    // %eip_new = *(%esp_old + callee_params + saved_regs + locals)\n    // %esp_new = %esp_old + callee_params + saved_regs + locals + 4\n    // %ebp_new = %ebp_old\n    program_string = \"$eip .raSearchStart ^ = \"\n        \"$esp .raSearchStart 4 + =\";\n    recover_ebp = false;\n  }\n\n  // Now crank it out, making sure that the program string set at least the\n  // two required variables.\n  PostfixEvaluator<u_int32_t> evaluator =\n      PostfixEvaluator<u_int32_t>(&dictionary, memory_);\n  PostfixEvaluator<u_int32_t>::DictionaryValidityType dictionary_validity;\n  if (!evaluator.Evaluate(program_string, &dictionary_validity) ||\n      dictionary_validity.find(\"$eip\") == dictionary_validity.end() ||\n      dictionary_validity.find(\"$esp\") == dictionary_validity.end()) {\n    // Program string evaluation failed. It may be that %eip is not somewhere\n    // with stack frame info, and %ebp is pointing to non-stack memory, so\n    // our evaluation couldn't succeed. We'll scan the stack for a return\n    // address. This can happen if the stack is in a module for which\n    // we don't have symbols, and that module is compiled without a\n    // frame pointer.\n    u_int32_t location_start = last_frame->context.esp;\n    u_int32_t location, eip;\n    if (!ScanForReturnAddress(location_start, &location, &eip)) {\n      // if we can't find an instruction pointer even with stack scanning,\n      // give up.\n      return NULL;\n    }\n\n    // This seems like a reasonable return address. Since program string\n    // evaluation failed, use it and set %esp to the location above the\n    // one where the return address was found.\n    dictionary[\"$eip\"] = eip;\n    dictionary[\"$esp\"] = location + 4;\n    trust = StackFrame::FRAME_TRUST_SCAN;\n  }\n\n  // Since this stack frame did not use %ebp in a traditional way,\n  // locating the return address isn't entirely deterministic. In that\n  // case, the stack can be scanned to locate the return address.\n  //\n  // However, if program string evaluation resulted in both %eip and\n  // %ebp values of 0, trust that the end of the stack has been\n  // reached and don't scan for anything else.\n  if (dictionary[\"$eip\"] != 0 || dictionary[\"$ebp\"] != 0) {\n    int offset = 0;\n\n    // This scan can only be done if a CodeModules object is available, to\n    // check that candidate return addresses are in fact inside a module.\n    //\n    // TODO(mmentovai): This ignores dynamically-generated code.  One possible\n    // solution is to check the minidump's memory map to see if the candidate\n    // %eip value comes from a mapped executable page, although this would\n    // require dumps that contain MINIDUMP_MEMORY_INFO, which the Breakpad\n    // client doesn't currently write (it would need to call MiniDumpWriteDump\n    // with the MiniDumpWithFullMemoryInfo type bit set).  Even given this\n    // ability, older OSes (pre-XP SP2) and CPUs (pre-P4) don't enforce\n    // an independent execute privilege on memory pages.\n\n    u_int32_t eip = dictionary[\"$eip\"];\n    if (modules_ && !modules_->GetModuleForAddress(eip)) {\n      // The instruction pointer at .raSearchStart was invalid, so start\n      // looking one 32-bit word above that location.\n      u_int32_t location_start = dictionary[\".raSearchStart\"] + 4;\n      u_int32_t location;\n      if (ScanForReturnAddress(location_start, &location, &eip)) {\n        // This is a better return address that what program string\n        // evaluation found.  Use it, and set %esp to the location above the\n        // one where the return address was found.\n        dictionary[\"$eip\"] = eip;\n        dictionary[\"$esp\"] = location + 4;\n        offset = location - location_start;\n        trust = StackFrame::FRAME_TRUST_CFI_SCAN;\n      }\n    }\n\n    // When trying to recover the previous value of the frame pointer (%ebp),\n    // start looking at the lowest possible address in the saved-register\n    // area, and look at the entire saved register area, increased by the\n    // size of |offset| to account for additional data that may be on the\n    // stack.  The scan is performed from the highest possible address to\n    // the lowest, because we expect that the function's prolog would have\n    // saved %ebp early.\n    u_int32_t ebp = dictionary[\"$ebp\"];\n    u_int32_t value;  // throwaway variable to check pointer validity\n    if (recover_ebp && !memory_->GetMemoryAtAddress(ebp, &value)) {\n      int fp_search_bytes = last_frame_info->saved_register_size + offset;\n      u_int32_t location_end = last_frame->context.esp +\n                               last_frame_callee_parameter_size;\n\n      for (u_int32_t location = location_end + fp_search_bytes;\n           location >= location_end;\n           location -= 4) {\n        if (!memory_->GetMemoryAtAddress(location, &ebp))\n          break;\n\n        if (memory_->GetMemoryAtAddress(ebp, &value)) {\n          // The candidate value is a pointer to the same memory region\n          // (the stack).  Prefer it as a recovered %ebp result.\n          dictionary[\"$ebp\"] = ebp;\n          break;\n        }\n      }\n    }\n  }\n\n  // Create a new stack frame (ownership will be transferred to the caller)\n  // and fill it in.\n  StackFrameX86 *frame = new StackFrameX86();\n\n  frame->trust = trust;\n  frame->context = last_frame->context;\n  frame->context.eip = dictionary[\"$eip\"];\n  frame->context.esp = dictionary[\"$esp\"];\n  frame->context.ebp = dictionary[\"$ebp\"];\n  frame->context_validity = StackFrameX86::CONTEXT_VALID_EIP |\n                                StackFrameX86::CONTEXT_VALID_ESP |\n                                StackFrameX86::CONTEXT_VALID_EBP;\n\n  // These are nonvolatile (callee-save) registers, and the program string\n  // may have filled them in.\n  if (dictionary_validity.find(\"$ebx\") != dictionary_validity.end()) {\n    frame->context.ebx = dictionary[\"$ebx\"];\n    frame->context_validity |= StackFrameX86::CONTEXT_VALID_EBX;\n  }\n  if (dictionary_validity.find(\"$esi\") != dictionary_validity.end()) {\n    frame->context.esi = dictionary[\"$esi\"];\n    frame->context_validity |= StackFrameX86::CONTEXT_VALID_ESI;\n  }\n  if (dictionary_validity.find(\"$edi\") != dictionary_validity.end()) {\n    frame->context.edi = dictionary[\"$edi\"];\n    frame->context_validity |= StackFrameX86::CONTEXT_VALID_EDI;\n  }\n\n  return frame;\n}\n\nStackFrameX86 *StackwalkerX86::GetCallerByCFIFrameInfo(\n    const vector<StackFrame*> &frames,\n    CFIFrameInfo *cfi_frame_info) {\n  StackFrameX86 *last_frame = static_cast<StackFrameX86*>(frames.back());\n  last_frame->cfi_frame_info = cfi_frame_info;\n\n  scoped_ptr<StackFrameX86> frame(new StackFrameX86());\n  if (!cfi_walker_\n      .FindCallerRegisters(*memory_, *cfi_frame_info,\n                           last_frame->context, last_frame->context_validity,\n                           &frame->context, &frame->context_validity))\n    return NULL;\n  \n  // Make sure we recovered all the essentials.\n  static const int essentials = (StackFrameX86::CONTEXT_VALID_EIP\n                                 | StackFrameX86::CONTEXT_VALID_ESP\n                                 | StackFrameX86::CONTEXT_VALID_EBP);\n  if ((frame->context_validity & essentials) != essentials)\n    return NULL;\n\n  frame->trust = StackFrame::FRAME_TRUST_CFI;\n\n  return frame.release();\n}\n\nStackFrameX86 *StackwalkerX86::GetCallerByEBPAtBase(\n    const vector<StackFrame *> &frames) {\n  StackFrame::FrameTrust trust;\n  StackFrameX86 *last_frame = static_cast<StackFrameX86 *>(frames.back());\n  u_int32_t last_esp = last_frame->context.esp;\n  u_int32_t last_ebp = last_frame->context.ebp;\n\n  // Assume that the standard %ebp-using x86 calling convention is in\n  // use.\n  //\n  // The typical x86 calling convention, when frame pointers are present,\n  // is for the calling procedure to use CALL, which pushes the return\n  // address onto the stack and sets the instruction pointer (%eip) to\n  // the entry point of the called routine.  The called routine then\n  // PUSHes the calling routine's frame pointer (%ebp) onto the stack\n  // before copying the stack pointer (%esp) to the frame pointer (%ebp).\n  // Therefore, the calling procedure's frame pointer is always available\n  // by dereferencing the called procedure's frame pointer, and the return\n  // address is always available at the memory location immediately above\n  // the address pointed to by the called procedure's frame pointer.  The\n  // calling procedure's stack pointer (%esp) is 8 higher than the value\n  // of the called procedure's frame pointer at the time the calling\n  // procedure made the CALL: 4 bytes for the return address pushed by the\n  // CALL itself, and 4 bytes for the callee's PUSH of the caller's frame\n  // pointer.\n  //\n  // %eip_new = *(%ebp_old + 4)\n  // %esp_new = %ebp_old + 8\n  // %ebp_new = *(%ebp_old)\n\n  u_int32_t caller_eip, caller_esp, caller_ebp;\n\n  if (memory_->GetMemoryAtAddress(last_ebp + 4, &caller_eip) &&\n      memory_->GetMemoryAtAddress(last_ebp, &caller_ebp)) {\n    caller_esp = last_ebp + 8;\n    trust = StackFrame::FRAME_TRUST_FP;\n  } else {\n    // We couldn't read the memory %ebp refers to. It may be that %ebp\n    // is pointing to non-stack memory. We'll scan the stack for a\n    // return address. This can happen if last_frame is executing code\n    // for a module for which we don't have symbols, and that module\n    // is compiled without a frame pointer.\n    if (!ScanForReturnAddress(last_esp, &caller_esp, &caller_eip)) {\n      // if we can't find an instruction pointer even with stack scanning,\n      // give up.\n      return NULL;\n    }\n\n    // ScanForReturnAddress found a reasonable return address. Advance\n    // %esp to the location above the one where the return address was\n    // found. Assume that %ebp is unchanged.\n    caller_esp += 4;\n    caller_ebp = last_ebp;\n\n    trust = StackFrame::FRAME_TRUST_SCAN;\n  }\n\n  // Create a new stack frame (ownership will be transferred to the caller)\n  // and fill it in.\n  StackFrameX86 *frame = new StackFrameX86();\n\n  frame->trust = trust;\n  frame->context = last_frame->context;\n  frame->context.eip = caller_eip;\n  frame->context.esp = caller_esp;\n  frame->context.ebp = caller_ebp;\n  frame->context_validity = StackFrameX86::CONTEXT_VALID_EIP |\n                            StackFrameX86::CONTEXT_VALID_ESP |\n                            StackFrameX86::CONTEXT_VALID_EBP;\n\n  return frame;\n}\n\nStackFrame *StackwalkerX86::GetCallerFrame(const CallStack *stack) {\n  if (!memory_ || !stack) {\n    BPLOG(ERROR) << \"Can't get caller frame without memory or stack\";\n    return NULL;\n  }\n\n  const vector<StackFrame *> &frames = *stack->frames();\n  StackFrameX86 *last_frame = static_cast<StackFrameX86 *>(frames.back());\n  scoped_ptr<StackFrameX86> new_frame;\n\n  // If the resolver has Windows stack walking information, use that.\n  WindowsFrameInfo *windows_frame_info\n      = resolver_ ? resolver_->FindWindowsFrameInfo(last_frame) : NULL;\n  if (windows_frame_info)\n    new_frame.reset(GetCallerByWindowsFrameInfo(frames, windows_frame_info));\n\n  // If the resolver has DWARF CFI information, use that.\n  if (!new_frame.get()) {\n    CFIFrameInfo *cfi_frame_info = \n        resolver_ ? resolver_->FindCFIFrameInfo(last_frame) : NULL;\n    if (cfi_frame_info)\n      new_frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info));\n  }\n\n  // Otherwise, hope that the program was using a traditional frame structure.\n  if (!new_frame.get())\n    new_frame.reset(GetCallerByEBPAtBase(frames));\n\n  // If nothing worked, tell the caller.\n  if (!new_frame.get())\n    return NULL;\n  \n  // Treat an instruction address of 0 as end-of-stack.\n  if (new_frame->context.eip == 0)\n    return NULL;\n\n  // If the new stack pointer is at a lower address than the old, then\n  // that's clearly incorrect. Treat this as end-of-stack to enforce\n  // progress and avoid infinite loops.\n  if (new_frame->context.esp <= last_frame->context.esp)\n    return NULL;\n\n  // new_frame->context.eip is the return address, which is one instruction\n  // past the CALL that caused us to arrive at the callee. Set\n  // new_frame->instruction to one less than that. This won't reference the\n  // beginning of the CALL instruction, but it's guaranteed to be within\n  // the CALL, which is sufficient to get the source line information to\n  // match up with the line that contains a function call. Callers that\n  // require the exact return address value may access the context.eip\n  // field of StackFrameX86.\n  new_frame->instruction = new_frame->context.eip - 1;\n\n  return new_frame.release();\n}\n\n}  // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_x86.h",
    "content": "// -*- mode: c++ -*- \n\n// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// stackwalker_x86.h: x86-specific stackwalker.\n//\n// Provides stack frames given x86 register context and a memory region\n// corresponding to an x86 stack.\n//\n// Author: Mark Mentovai\n\n\n#ifndef PROCESSOR_STACKWALKER_X86_H__\n#define PROCESSOR_STACKWALKER_X86_H__\n\n\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"google_breakpad/processor/stackwalker.h\"\n#include \"google_breakpad/processor/stack_frame_cpu.h\"\n#include \"processor/cfi_frame_info.h\"\n\nnamespace google_breakpad {\n\nclass CodeModules;\n\n\nclass StackwalkerX86 : public Stackwalker {\n public:\n  // context is an x86 context object that gives access to x86-specific\n  // register state corresponding to the innermost called frame to be\n  // included in the stack.  The other arguments are passed directly through\n  // to the base Stackwalker constructor.\n  StackwalkerX86(const SystemInfo *system_info,\n                 const MDRawContextX86 *context,\n                 MemoryRegion *memory,\n                 const CodeModules *modules,\n                 SymbolSupplier *supplier,\n                 SourceLineResolverInterface *resolver);\n\n private:\n  // A STACK CFI-driven frame walker for the X86.\n  typedef SimpleCFIWalker<u_int32_t, MDRawContextX86> CFIWalker;\n\n  // Implementation of Stackwalker, using x86 context (%ebp, %esp, %eip) and\n  // stack conventions (saved %ebp at [%ebp], saved %eip at 4[%ebp], or\n  // alternate conventions as guided by any WindowsFrameInfo available for the\n  // code in question.).\n  virtual StackFrame *GetContextFrame();\n  virtual StackFrame *GetCallerFrame(const CallStack *stack);\n\n  // Use windows_frame_info (derived from STACK WIN and FUNC records)\n  // to construct the frame that called frames.back(). The caller\n  // takes ownership of the returned frame. Return NULL on failure.\n  StackFrameX86 *GetCallerByWindowsFrameInfo(\n      const vector<StackFrame*> &frames,\n      WindowsFrameInfo *windows_frame_info);\n\n  // Use cfi_frame_info (derived from STACK CFI records) to construct\n  // the frame that called frames.back(). The caller takes ownership\n  // of the returned frame. Return NULL on failure.\n  StackFrameX86 *GetCallerByCFIFrameInfo(const vector<StackFrame*> &frames,\n                                         CFIFrameInfo *cfi_frame_info);\n\n  // Assuming a traditional frame layout --- where the caller's %ebp\n  // has been pushed just after the return address and the callee's\n  // %ebp points to the saved %ebp --- construct the frame that called\n  // frames.back(). The caller takes ownership of the returned frame.\n  // Return NULL on failure.\n  StackFrameX86 *GetCallerByEBPAtBase(const vector<StackFrame*> &frames);\n\n  // Stores the CPU context corresponding to the innermost stack frame to\n  // be returned by GetContextFrame.\n  const MDRawContextX86 *context_;\n\n  // Our register map, for cfi_walker_.\n  static const CFIWalker::RegisterSet cfi_register_map_[];\n\n  // Our CFI frame walker.\n  const CFIWalker cfi_walker_;\n};\n\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_STACKWALKER_X86_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/stackwalker_x86_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// stackwalker_x86_unittest.cc: Unit tests for StackwalkerX86 class.\n\n#include <string>\n#include <vector>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"common/test_assembler.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"google_breakpad/processor/basic_source_line_resolver.h\"\n#include \"google_breakpad/processor/call_stack.h\"\n#include \"google_breakpad/processor/source_line_resolver_interface.h\"\n#include \"google_breakpad/processor/stack_frame_cpu.h\"\n#include \"processor/stackwalker_unittest_utils.h\"\n#include \"processor/stackwalker_x86.h\"\n#include \"processor/windows_frame_info.h\"\n\nusing google_breakpad::BasicSourceLineResolver;\nusing google_breakpad::CallStack;\nusing google_breakpad::StackFrame;\nusing google_breakpad::StackFrameX86;\nusing google_breakpad::StackwalkerX86;\nusing google_breakpad::SystemInfo;\nusing google_breakpad::WindowsFrameInfo;\nusing google_breakpad::test_assembler::kLittleEndian;\nusing google_breakpad::test_assembler::Label;\nusing google_breakpad::test_assembler::Section;\nusing std::string;\nusing std::vector;\nusing testing::_;\nusing testing::Return;\nusing testing::SetArgumentPointee;\nusing testing::Test;\n\nclass StackwalkerX86Fixture {\n public:\n  StackwalkerX86Fixture()\n    : stack_section(kLittleEndian),\n      // Give the two modules reasonable standard locations and names\n      // for tests to play with.\n      module1(0x40000000, 0x10000, \"module1\", \"version1\"),\n      module2(0x50000000, 0x10000, \"module2\", \"version2\"),\n      module3(0x771d0000, 0x180000, \"module3\", \"version3\"),\n      module4(0x75f90000, 0x46000, \"module4\", \"version4\"),\n      module5(0x75730000, 0x110000, \"module5\", \"version5\"),\n      module6(0x647f0000, 0x1ba8000, \"module6\", \"version6\") {\n    // Identify the system as a Linux system.\n    system_info.os = \"Linux\";\n    system_info.os_short = \"linux\";\n    system_info.os_version = \"Salacious Skink\";\n    system_info.cpu = \"x86\";\n    system_info.cpu_info = \"\";\n\n    // Put distinctive values in the raw CPU context.\n    BrandContext(&raw_context);\n\n    // Create some modules with some stock debugging information.\n    modules.Add(&module1);\n    modules.Add(&module2);\n    modules.Add(&module3);\n    modules.Add(&module4);\n    modules.Add(&module5);\n    modules.Add(&module6);\n\n    // By default, none of the modules have symbol info; call\n    // SetModuleSymbols to override this.\n    EXPECT_CALL(supplier, GetCStringSymbolData(_, _, _, _))\n      .WillRepeatedly(Return(MockSymbolSupplier::NOT_FOUND));\n  }\n\n  // Set the Breakpad symbol information that supplier should return for\n  // MODULE to INFO.\n  void SetModuleSymbols(MockCodeModule *module, const string &info) {\n    unsigned int buffer_size = info.size() + 1;\n    char *buffer = reinterpret_cast<char*>(operator new(buffer_size));\n    strcpy(buffer, info.c_str());\n    EXPECT_CALL(supplier, GetCStringSymbolData(module, &system_info, _, _))\n      .WillRepeatedly(DoAll(SetArgumentPointee<3>(buffer),\n                            Return(MockSymbolSupplier::FOUND)));\n  }\n\n  // Populate stack_region with the contents of stack_section. Use\n  // stack_section.start() as the region's starting address.\n  void RegionFromSection() {\n    string contents;\n    ASSERT_TRUE(stack_section.GetContents(&contents));\n    stack_region.Init(stack_section.start().Value(), contents);\n  }\n\n  // Fill RAW_CONTEXT with pseudo-random data, for round-trip checking.\n  void BrandContext(MDRawContextX86 *raw_context) {\n    u_int8_t x = 173;\n    for (size_t i = 0; i < sizeof(*raw_context); i++)\n      reinterpret_cast<u_int8_t *>(raw_context)[i] = (x += 17);\n  }\n  \n  SystemInfo system_info;\n  MDRawContextX86 raw_context;\n  Section stack_section;\n  MockMemoryRegion stack_region;\n  MockCodeModule module1;\n  MockCodeModule module2;\n  MockCodeModule module3;\n  MockCodeModule module4;\n  MockCodeModule module5;\n  MockCodeModule module6;\n  MockCodeModules modules;\n  MockSymbolSupplier supplier;\n  BasicSourceLineResolver resolver;\n  CallStack call_stack;\n  const vector<StackFrame *> *frames;\n};\n\nclass SanityCheck: public StackwalkerX86Fixture, public Test { };\n\nTEST_F(SanityCheck, NoResolver) {\n  stack_section.start() = 0x80000000;\n  stack_section.D32(0).D32(0); // end-of-stack marker\n  RegionFromSection();\n  raw_context.eip = 0x40000200;\n  raw_context.ebp = 0x80000000;\n\n  StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                        NULL, NULL);\n  // This should succeed, even without a resolver or supplier.\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  StackFrameX86 *frame = static_cast<StackFrameX86 *>(frames->at(0));\n  // Check that the values from the original raw context made it\n  // through to the context in the stack frame.\n  EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context)));\n}\n\nclass GetContextFrame: public StackwalkerX86Fixture, public Test { };\n\nTEST_F(GetContextFrame, Simple) {\n  stack_section.start() = 0x80000000;\n  stack_section.D32(0).D32(0); // end-of-stack marker\n  RegionFromSection();\n  raw_context.eip = 0x40000200;\n  raw_context.ebp = 0x80000000;\n\n  StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  StackFrameX86 *frame = static_cast<StackFrameX86 *>(frames->at(0));\n  // Check that the values from the original raw context made it\n  // through to the context in the stack frame.\n  EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context)));\n}\n\nclass GetCallerFrame: public StackwalkerX86Fixture, public Test { };\n\n// Walk a traditional frame. A traditional frame saves the caller's\n// %ebp just below the return address, and has its own %ebp pointing\n// at the saved %ebp.\nTEST_F(GetCallerFrame, Traditional) {\n  stack_section.start() = 0x80000000;\n  Label frame0_ebp, frame1_ebp;\n  stack_section\n    .Append(12, 0)                      // frame 0: space\n    .Mark(&frame0_ebp)                  // frame 0 %ebp points here\n    .D32(frame1_ebp)                    // frame 0: saved %ebp\n    .D32(0x40008679)                    // frame 0: return address\n    .Append(8, 0)                       // frame 1: space\n    .Mark(&frame1_ebp)                  // frame 1 %ebp points here\n    .D32(0)                             // frame 1: saved %ebp (stack end)\n    .D32(0);                            // frame 1: return address (stack end)\n  RegionFromSection();\n  raw_context.eip = 0x4000c7a5;\n  raw_context.esp = stack_section.start().Value();\n  raw_context.ebp = frame0_ebp.Value();\n\n  StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(2U, frames->size());\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame0 = static_cast<StackFrameX86 *>(frames->at(0));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n    EXPECT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity);\n    EXPECT_EQ(0x4000c7a5U, frame0->instruction);\n    EXPECT_EQ(0x4000c7a5U, frame0->context.eip);\n    EXPECT_EQ(frame0_ebp.Value(), frame0->context.ebp);\n    EXPECT_EQ(NULL, frame0->windows_frame_info);\n  }\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame1 = static_cast<StackFrameX86 *>(frames->at(1));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame1->trust);\n    ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP\n               | StackFrameX86::CONTEXT_VALID_ESP\n               | StackFrameX86::CONTEXT_VALID_EBP),\n              frame1->context_validity);\n    EXPECT_EQ(0x40008679U, frame1->instruction + 1);\n    EXPECT_EQ(0x40008679U, frame1->context.eip);\n    EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp);\n    EXPECT_EQ(NULL, frame1->windows_frame_info);\n  }\n}\n\n// Walk a traditional frame, but use a bogus %ebp value, forcing a scan\n// of the stack for something that looks like a return address.\nTEST_F(GetCallerFrame, TraditionalScan) {\n  stack_section.start() = 0x80000000;\n  Label frame1_ebp;\n  stack_section\n    // frame 0\n    .D32(0xf065dc76)    // locals area:\n    .D32(0x46ee2167)    // garbage that doesn't look like\n    .D32(0xbab023ec)    // a return address\n    .D32(frame1_ebp)    // saved %ebp (%ebp fails to point here, forcing scan)\n    .D32(0x4000129d)    // return address\n    // frame 1\n    .Append(8, 0)       // space\n    .Mark(&frame1_ebp)  // %ebp points here\n    .D32(0)             // saved %ebp (stack end)\n    .D32(0);            // return address (stack end)\n\n  RegionFromSection();\n  raw_context.eip = 0x4000f49d;\n  raw_context.esp = stack_section.start().Value();\n  // Make the frame pointer bogus, to make the stackwalker scan the stack\n  // for something that looks like a return address.\n  raw_context.ebp = 0xd43eed6e;\n\n  StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(2U, frames->size());\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame0 = static_cast<StackFrameX86 *>(frames->at(0));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n    ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity);\n    EXPECT_EQ(0x4000f49dU, frame0->instruction);\n    EXPECT_EQ(0x4000f49dU, frame0->context.eip);\n    EXPECT_EQ(stack_section.start().Value(), frame0->context.esp);\n    EXPECT_EQ(0xd43eed6eU, frame0->context.ebp);\n    EXPECT_EQ(NULL, frame0->windows_frame_info);\n  }\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame1 = static_cast<StackFrameX86 *>(frames->at(1));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust);\n    // I'd argue that CONTEXT_VALID_EBP shouldn't be here, since the\n    // walker does not actually fetch the EBP after a scan (forcing the\n    // next frame to be scanned as well). But let's grandfather the existing\n    // behavior in for now.\n    ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP\n               | StackFrameX86::CONTEXT_VALID_ESP\n               | StackFrameX86::CONTEXT_VALID_EBP),\n              frame1->context_validity);\n    EXPECT_EQ(0x4000129dU, frame1->instruction + 1);\n    EXPECT_EQ(0x4000129dU, frame1->context.eip);\n    EXPECT_EQ(0x80000014U, frame1->context.esp);\n    EXPECT_EQ(0xd43eed6eU, frame1->context.ebp);\n    EXPECT_EQ(NULL, frame1->windows_frame_info);\n  }\n}\n\n// Force scanning for a return address a long way down the stack\nTEST_F(GetCallerFrame, TraditionalScanLongWay) {\n  stack_section.start() = 0x80000000;\n  Label frame1_ebp;\n  stack_section\n    // frame 0\n    .D32(0xf065dc76)    // locals area:\n    .D32(0x46ee2167)    // garbage that doesn't look like\n    .D32(0xbab023ec)    // a return address\n    .Append(20 * 4, 0)  // a bunch of space\n    .D32(frame1_ebp)    // saved %ebp (%ebp fails to point here, forcing scan)\n    .D32(0x4000129d)    // return address\n    // frame 1\n    .Append(8, 0)       // space\n    .Mark(&frame1_ebp)  // %ebp points here\n    .D32(0)             // saved %ebp (stack end)\n    .D32(0);            // return address (stack end)\n\n  RegionFromSection();\n  raw_context.eip = 0x4000f49d;\n  raw_context.esp = stack_section.start().Value();\n  // Make the frame pointer bogus, to make the stackwalker scan the stack\n  // for something that looks like a return address.\n  raw_context.ebp = 0xd43eed6e;\n\n  StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(2U, frames->size());\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame0 = static_cast<StackFrameX86 *>(frames->at(0));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n    ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity);\n    EXPECT_EQ(0x4000f49dU, frame0->instruction);\n    EXPECT_EQ(0x4000f49dU, frame0->context.eip);\n    EXPECT_EQ(stack_section.start().Value(), frame0->context.esp);\n    EXPECT_EQ(0xd43eed6eU, frame0->context.ebp);\n    EXPECT_EQ(NULL, frame0->windows_frame_info);\n  }\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame1 = static_cast<StackFrameX86 *>(frames->at(1));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust);\n    // I'd argue that CONTEXT_VALID_EBP shouldn't be here, since the\n    // walker does not actually fetch the EBP after a scan (forcing the\n    // next frame to be scanned as well). But let's grandfather the existing\n    // behavior in for now.\n    ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP\n               | StackFrameX86::CONTEXT_VALID_ESP\n               | StackFrameX86::CONTEXT_VALID_EBP),\n              frame1->context_validity);\n    EXPECT_EQ(0x4000129dU, frame1->instruction + 1);\n    EXPECT_EQ(0x4000129dU, frame1->context.eip);\n    EXPECT_EQ(0x80000064U, frame1->context.esp);\n    EXPECT_EQ(0xd43eed6eU, frame1->context.ebp);\n    EXPECT_EQ(NULL, frame1->windows_frame_info);\n  }\n}\n\n// Use Windows frame data (a \"STACK WIN 4\" record, from a\n// FrameTypeFrameData DIA record) to walk a stack frame.\nTEST_F(GetCallerFrame, WindowsFrameData) {\n  SetModuleSymbols(&module1,\n                   \"STACK WIN 4 aa85 176 0 0 4 10 4 0 1\"\n                   \" $T2 $esp .cbSavedRegs + =\"\n                   \" $T0 .raSearchStart =\"\n                   \" $eip $T0 ^ =\"\n                   \" $esp $T0 4 + =\"\n                   \" $ebx $T2 4  - ^ =\"\n                   \" $edi $T2 8  - ^ =\"\n                   \" $esi $T2 12 - ^ =\"\n                   \" $ebp $T2 16 - ^ =\\n\");\n  Label frame1_esp, frame1_ebp;\n  stack_section.start() = 0x80000000;\n  stack_section\n    // frame 0\n    .D32(frame1_ebp)                    // saved regs: %ebp\n    .D32(0xa7120d1a)                    //             %esi\n    .D32(0x630891be)                    //             %edi\n    .D32(0x9068a878)                    //             %ebx\n    .D32(0xa08ea45f)                    // locals: unused\n    .D32(0x40001350)                    // return address\n    // frame 1\n    .Mark(&frame1_esp)\n    .Append(12, 0)                      // empty space\n    .Mark(&frame1_ebp)\n    .D32(0)                             // saved %ebp (stack end)\n    .D32(0);                            // saved %eip (stack end)\n\n  RegionFromSection();\n  raw_context.eip = 0x4000aa85;\n  raw_context.esp = stack_section.start().Value();\n  raw_context.ebp = 0xf052c1de;         // should not be needed to walk frame\n\n  StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(2U, frames->size());\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame0 = static_cast<StackFrameX86 *>(frames->at(0));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n    ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity);\n    EXPECT_EQ(0x4000aa85U, frame0->instruction);\n    EXPECT_EQ(0x4000aa85U, frame0->context.eip);\n    EXPECT_EQ(stack_section.start().Value(), frame0->context.esp);\n    EXPECT_EQ(0xf052c1deU, frame0->context.ebp);\n    EXPECT_TRUE(frame0->windows_frame_info != NULL);\n  }\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame1 = static_cast<StackFrameX86 *>(frames->at(1));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust);\n    ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP\n               | StackFrameX86::CONTEXT_VALID_ESP\n               | StackFrameX86::CONTEXT_VALID_EBP\n               | StackFrameX86::CONTEXT_VALID_EBX\n               | StackFrameX86::CONTEXT_VALID_ESI\n               | StackFrameX86::CONTEXT_VALID_EDI),\n              frame1->context_validity);\n    EXPECT_EQ(0x40001350U, frame1->instruction + 1);\n    EXPECT_EQ(0x40001350U, frame1->context.eip);\n    EXPECT_EQ(frame1_esp.Value(), frame1->context.esp);\n    EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp);\n    EXPECT_EQ(0x9068a878U, frame1->context.ebx);\n    EXPECT_EQ(0xa7120d1aU, frame1->context.esi);\n    EXPECT_EQ(0x630891beU, frame1->context.edi);\n    EXPECT_EQ(NULL, frame1->windows_frame_info);\n  }\n}\n\n// Use Windows frame data (a \"STACK WIN 4\" record, from a\n// FrameTypeFrameData DIA record) to walk a stack frame where the stack\n// is aligned and we must search\nTEST_F(GetCallerFrame, WindowsFrameDataAligned) {\n  SetModuleSymbols(&module1,\n                   \"STACK WIN 4 aa85 176 0 0 4 4 8 0 1\"\n\t\t   \" $T1 .raSearch =\"\n\t\t   \" $T0 $T1 4 - 8 @ =\"\n\t\t   \" $ebp $T1 4 - ^ =\"\n\t\t   \" $eip $T1 ^ =\"\n\t\t   \" $esp $T1 4 + =\");\n  Label frame1_esp, frame1_ebp;\n  stack_section.start() = 0x80000000;\n  stack_section\n    // frame 0\n    .D32(0x0ffa0ffa)                    // unused saved register\n    .D32(0xdeaddead)                    // locals\n    .D32(0xbeefbeef)\n    .D32(0)                             // 8-byte alignment\n    .D32(frame1_ebp)\n    .D32(0x5000129d)                    // return address\n    // frame 1\n    .Mark(&frame1_esp)\n    .D32(0x1)                           // parameter\n    .Mark(&frame1_ebp)\n    .D32(0)                             // saved %ebp (stack end)\n    .D32(0);                            // saved %eip (stack end)\n\n  RegionFromSection();\n  raw_context.eip = 0x4000aa85;\n  raw_context.esp = stack_section.start().Value();\n  raw_context.ebp = 0xf052c1de;         // should not be needed to walk frame\n\n  StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(2U, frames->size());\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame0 = static_cast<StackFrameX86 *>(frames->at(0));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n    ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity);\n    EXPECT_EQ(0x4000aa85U, frame0->instruction);\n    EXPECT_EQ(0x4000aa85U, frame0->context.eip);\n    EXPECT_EQ(stack_section.start().Value(), frame0->context.esp);\n    EXPECT_EQ(0xf052c1deU, frame0->context.ebp);\n    EXPECT_TRUE(frame0->windows_frame_info != NULL);\n  }\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame1 = static_cast<StackFrameX86 *>(frames->at(1));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust);\n    ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP\n               | StackFrameX86::CONTEXT_VALID_ESP\n               | StackFrameX86::CONTEXT_VALID_EBP),\n              frame1->context_validity);\n    EXPECT_EQ(0x5000129dU, frame1->instruction + 1);\n    EXPECT_EQ(0x5000129dU, frame1->context.eip);\n    EXPECT_EQ(frame1_esp.Value(), frame1->context.esp);\n    EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp);\n    EXPECT_EQ(NULL, frame1->windows_frame_info);\n  }\n}\n\n// Use Windows frame data (a \"STACK WIN 4\" record, from a\n// FrameTypeFrameData DIA record) to walk a frame, and depend on the\n// parameter size from the callee as well.\nTEST_F(GetCallerFrame, WindowsFrameDataParameterSize) {\n  SetModuleSymbols(&module1, \"FUNC 1000 100 c module1::wheedle\\n\");\n  SetModuleSymbols(&module2,\n                   // Note bogus parameter size in FUNC record; the stack walker\n                   // should prefer the STACK WIN record, and see '4' below.\n                   \"FUNC aa85 176 beef module2::whine\\n\"\n                   \"STACK WIN 4 aa85 176 0 0 4 10 4 0 1\"\n                   \" $T2 $esp .cbLocals + .cbSavedRegs + =\"\n                   \" $T0 .raSearchStart =\"\n                   \" $eip $T0 ^ =\"\n                   \" $esp $T0 4 + =\"\n                   \" $ebp $T0 20 - ^ =\"\n                   \" $ebx $T0 8 - ^ =\\n\");\n  Label frame0_esp, frame0_ebp;\n  Label frame1_esp;\n  Label frame2_esp, frame2_ebp;\n  stack_section.start() = 0x80000000;\n  stack_section\n    // frame 0, in module1::wheedle.  Traditional frame.\n    .Mark(&frame0_esp)\n    .Append(16, 0)      // frame space\n    .Mark(&frame0_ebp)\n    .D32(0x6fa902e0)    // saved %ebp.  Not a frame pointer.\n    .D32(0x5000aa95)    // return address, in module2::whine\n    // frame 1, in module2::whine.  FrameData frame.\n    .Mark(&frame1_esp)\n    .D32(0xbaa0cb7a)    // argument 3 passed to module1::wheedle\n    .D32(0xbdc92f9f)    // argument 2\n    .D32(0x0b1d8442)    // argument 1\n    .D32(frame2_ebp)    // saved %ebp\n    .D32(0xb1b90a15)    // unused\n    .D32(0xf18e072d)    // unused\n    .D32(0x2558c7f3)    // saved %ebx\n    .D32(0x0365e25e)    // unused\n    .D32(0x2a179e38)    // return address; $T0 points here\n    // frame 2, in no module\n    .Mark(&frame2_esp)\n    .Append(12, 0)      // empty space\n    .Mark(&frame2_ebp)\n    .D32(0)             // saved %ebp (stack end)\n    .D32(0);            // saved %eip (stack end)\n\n  RegionFromSection();\n  raw_context.eip = 0x40001004; // in module1::wheedle\n  raw_context.esp = stack_section.start().Value();\n  raw_context.ebp = frame0_ebp.Value();\n\n  StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(3U, frames->size());\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame0 = static_cast<StackFrameX86 *>(frames->at(0));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n    ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity);\n    EXPECT_EQ(0x40001004U, frame0->instruction);\n    EXPECT_EQ(0x40001004U, frame0->context.eip);\n    EXPECT_EQ(frame0_esp.Value(), frame0->context.esp);\n    EXPECT_EQ(frame0_ebp.Value(), frame0->context.ebp);\n    EXPECT_EQ(&module1, frame0->module);\n    EXPECT_EQ(\"module1::wheedle\", frame0->function_name);\n    EXPECT_EQ(0x40001000U, frame0->function_base);\n    // The FUNC record for module1::wheedle should have produced a\n    // WindowsFrameInfo structure with only the parameter size valid.\n    ASSERT_TRUE(frame0->windows_frame_info != NULL);\n    EXPECT_EQ(WindowsFrameInfo::VALID_PARAMETER_SIZE,\n              frame0->windows_frame_info->valid);\n    EXPECT_EQ(WindowsFrameInfo::STACK_INFO_UNKNOWN,\n              frame0->windows_frame_info->type_);\n    EXPECT_EQ(12U, frame0->windows_frame_info->parameter_size);\n  }\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame1 = static_cast<StackFrameX86 *>(frames->at(1));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame1->trust);\n    ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP\n               | StackFrameX86::CONTEXT_VALID_ESP\n               | StackFrameX86::CONTEXT_VALID_EBP),\n              frame1->context_validity);\n    EXPECT_EQ(0x5000aa95U, frame1->instruction + 1);\n    EXPECT_EQ(0x5000aa95U, frame1->context.eip);\n    EXPECT_EQ(frame1_esp.Value(), frame1->context.esp);\n    EXPECT_EQ(0x6fa902e0U, frame1->context.ebp);\n    EXPECT_EQ(&module2, frame1->module);\n    EXPECT_EQ(\"module2::whine\", frame1->function_name);\n    EXPECT_EQ(0x5000aa85U, frame1->function_base);\n    ASSERT_TRUE(frame1->windows_frame_info != NULL);\n    EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame1->windows_frame_info->valid);\n    EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FRAME_DATA,\n              frame1->windows_frame_info->type_);\n    // This should not see the 0xbeef parameter size from the FUNC\n    // record, but should instead see the STACK WIN record.\n    EXPECT_EQ(4U, frame1->windows_frame_info->parameter_size);\n  }\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame2 = static_cast<StackFrameX86 *>(frames->at(2));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame2->trust);\n    ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP\n               | StackFrameX86::CONTEXT_VALID_ESP\n               | StackFrameX86::CONTEXT_VALID_EBP\n               | StackFrameX86::CONTEXT_VALID_EBX),\n              frame2->context_validity);\n    EXPECT_EQ(0x2a179e38U, frame2->instruction + 1);\n    EXPECT_EQ(0x2a179e38U, frame2->context.eip);\n    EXPECT_EQ(frame2_esp.Value(), frame2->context.esp);\n    EXPECT_EQ(frame2_ebp.Value(), frame2->context.ebp);\n    EXPECT_EQ(0x2558c7f3U, frame2->context.ebx);\n    EXPECT_EQ(NULL, frame2->module);\n    EXPECT_EQ(NULL, frame2->windows_frame_info);\n  }\n}\n\n// Use Windows frame data (a \"STACK WIN 4\" record, from a\n// FrameTypeFrameData DIA record) to walk a stack frame, where the\n// expression fails to yield both an $eip and an $ebp value, and the stack\n// walker must scan.\nTEST_F(GetCallerFrame, WindowsFrameDataScan) {\n  SetModuleSymbols(&module1,\n                   \"STACK WIN 4 c8c 111 0 0 4 10 4 0 1 bad program string\\n\");\n  // Mark frame 1's PC as the end of the stack.\n  SetModuleSymbols(&module2,\n                   \"FUNC 7c38 accf 0 module2::function\\n\"\n                   \"STACK WIN 4 7c38 accf 0 0 4 10 4 0 1 $eip 0 = $ebp 0 =\\n\");\n  Label frame1_esp;\n  stack_section.start() = 0x80000000;\n  stack_section\n    // frame 0\n    .Append(16, 0x2a)                   // unused, garbage\n    .D32(0x50007ce9)                    // return address\n    // frame 1\n    .Mark(&frame1_esp)\n    .Append(8, 0);                      // empty space\n\n  RegionFromSection();\n  raw_context.eip = 0x40000c9c;\n  raw_context.esp = stack_section.start().Value();\n  raw_context.ebp = 0x2ae314cd;         // should not be needed to walk frame\n\n  StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(2U, frames->size());\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame0 = static_cast<StackFrameX86 *>(frames->at(0));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n    ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity);\n    EXPECT_EQ(0x40000c9cU, frame0->instruction);\n    EXPECT_EQ(0x40000c9cU, frame0->context.eip);\n    EXPECT_EQ(stack_section.start().Value(), frame0->context.esp);\n    EXPECT_EQ(0x2ae314cdU, frame0->context.ebp);\n    EXPECT_TRUE(frame0->windows_frame_info != NULL);\n  }\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame1 = static_cast<StackFrameX86 *>(frames->at(1));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust);\n    // I'd argue that CONTEXT_VALID_EBP shouldn't be here, since the walker\n    // does not actually fetch the EBP after a scan (forcing the next frame\n    // to be scanned as well). But let's grandfather the existing behavior in\n    // for now.\n    ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP\n               | StackFrameX86::CONTEXT_VALID_ESP\n               | StackFrameX86::CONTEXT_VALID_EBP),\n              frame1->context_validity);\n    EXPECT_EQ(0x50007ce9U, frame1->instruction + 1);\n    EXPECT_EQ(0x50007ce9U, frame1->context.eip);\n    EXPECT_EQ(frame1_esp.Value(), frame1->context.esp);\n    EXPECT_TRUE(frame1->windows_frame_info != NULL);\n  }\n}\n\n// Use Windows frame data (a \"STACK WIN 4\" record, from a\n// FrameTypeFrameData DIA record) to walk a stack frame, where the\n// expression yields an $eip that falls outside of any module, and the\n// stack walker must scan.\nTEST_F(GetCallerFrame, WindowsFrameDataBadEIPScan) {\n  SetModuleSymbols(&module1,\n                   \"STACK WIN 4 6e6 e7 0 0 0 8 4 0 1\"\n                   // A traditional frame, actually.\n                   \" $eip $ebp 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ =\\n\");\n  // Mark frame 1's PC as the end of the stack.\n  SetModuleSymbols(&module2,\n                   \"FUNC cfdb 8406 0 module2::function\\n\"\n                   \"STACK WIN 4 cfdb 8406 0 0 0 0 0 0 1 $eip 0 = $ebp 0 =\\n\");\n  stack_section.start() = 0x80000000;\n\n  // In this stack, the context's %ebp is pointing at the wrong place, so\n  // the stack walker needs to scan to find the return address, and then\n  // scan again to find the caller's saved %ebp.\n  Label frame0_ebp, frame1_ebp, frame1_esp;\n  stack_section\n    // frame 0\n    .Append(8, 0x2a)            // garbage\n    .Mark(&frame0_ebp)          // frame 0 %ebp points here, but should point\n                                // at *** below\n    // The STACK WIN record says that the following two values are\n    // frame 1's saved %ebp and return address, but the %ebp is wrong;\n    // they're garbage. The stack walker will scan for the right values.\n    .D32(0x3d937b2b)            // alleged to be frame 1's saved %ebp\n    .D32(0x17847f5b)            // alleged to be frame 1's return address\n    .D32(frame1_ebp)            // frame 1's real saved %ebp; scan will find\n    .D32(0x2b2b2b2b)            // first word of realigned register save area\n    // *** frame 0 %ebp ought to be pointing here\n    .D32(0x2c2c2c2c)            // realigned locals area\n    .D32(0x5000d000)            // frame 1's real saved %eip; scan will find\n    // Frame 1, in module2::function. The STACK WIN record describes\n    // this as the oldest frame, without referring to its contents, so\n    // we needn't to provide any actual data here.\n    .Mark(&frame1_esp)\n    .Mark(&frame1_ebp)          // frame 1 %ebp points here\n    // A dummy value for frame 1's %ebp to point at. The scan recognizes the\n    // saved %ebp because it points to a valid word in the stack memory region.\n    .D32(0x2d2d2d2d);\n\n  RegionFromSection();\n  raw_context.eip = 0x40000700;\n  raw_context.esp = stack_section.start().Value();\n  raw_context.ebp = frame0_ebp.Value();\n\n  StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(2U, frames->size());\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame0 = static_cast<StackFrameX86 *>(frames->at(0));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n    ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity);\n    EXPECT_EQ(0x40000700U, frame0->instruction);\n    EXPECT_EQ(0x40000700U, frame0->context.eip);\n    EXPECT_EQ(stack_section.start().Value(), frame0->context.esp);\n    EXPECT_EQ(frame0_ebp.Value(), frame0->context.ebp);\n    EXPECT_TRUE(frame0->windows_frame_info != NULL);\n  }\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame1 = static_cast<StackFrameX86 *>(frames->at(1));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CFI_SCAN, frame1->trust);\n    // I'd argue that CONTEXT_VALID_EBP shouldn't be here, since the\n    // walker does not actually fetch the EBP after a scan (forcing the\n    // next frame to be scanned as well). But let's grandfather the existing\n    // behavior in for now.\n    ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP\n               | StackFrameX86::CONTEXT_VALID_ESP\n               | StackFrameX86::CONTEXT_VALID_EBP),\n              frame1->context_validity);\n    EXPECT_EQ(0x5000d000U, frame1->instruction + 1);\n    EXPECT_EQ(0x5000d000U, frame1->context.eip);\n    EXPECT_EQ(frame1_esp.Value(), frame1->context.esp);\n    EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp);\n    EXPECT_TRUE(frame1->windows_frame_info != NULL);\n  }\n}\n\n// Use Windows FrameTypeFPO data to walk a stack frame for a function that\n// does not modify %ebp from the value it had in the caller.\nTEST_F(GetCallerFrame, WindowsFPOUnchangedEBP) {\n  SetModuleSymbols(&module1,\n                   // Note bogus parameter size in FUNC record; the walker\n                   // should prefer the STACK WIN record, and see the '8' below.\n                   \"FUNC e8a8 100 feeb module1::discombobulated\\n\"\n                   \"STACK WIN 0 e8a8 100 0 0 8 4 10 0 0 0\\n\");\n  Label frame0_esp;\n  Label frame1_esp, frame1_ebp;\n  stack_section.start() = 0x80000000;\n  stack_section\n    // frame 0, in module1::wheedle.  FrameTypeFPO (STACK WIN 0) frame.\n    .Mark(&frame0_esp)\n    // no outgoing parameters; this is the youngest frame.\n    .D32(0x7c521352)    // four bytes of saved registers\n    .Append(0x10, 0x42) // local area\n    .D32(0x40009b5b)    // return address, in module1, no function\n    // frame 1, in module1, no function.\n    .Mark(&frame1_esp)\n    .D32(0xf60ea7fc)    // junk\n    .Mark(&frame1_ebp)\n    .D32(0)             // saved %ebp (stack end)\n    .D32(0);            // saved %eip (stack end)\n\n  RegionFromSection();\n  raw_context.eip = 0x4000e8b8; // in module1::whine\n  raw_context.esp = stack_section.start().Value();\n  // Frame pointer unchanged from caller.\n  raw_context.ebp = frame1_ebp.Value();\n\n  StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(2U, frames->size());\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame0 = static_cast<StackFrameX86 *>(frames->at(0));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n    ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity);\n    EXPECT_EQ(0x4000e8b8U, frame0->instruction);\n    EXPECT_EQ(0x4000e8b8U, frame0->context.eip);\n    EXPECT_EQ(frame0_esp.Value(), frame0->context.esp);\n    EXPECT_EQ(frame1_ebp.Value(), frame0->context.ebp); // unchanged from caller\n    EXPECT_EQ(&module1, frame0->module);\n    EXPECT_EQ(\"module1::discombobulated\", frame0->function_name);\n    EXPECT_EQ(0x4000e8a8U, frame0->function_base);\n    // The STACK WIN record for module1::discombobulated should have\n    // produced a fully populated WindowsFrameInfo structure.\n    ASSERT_TRUE(frame0->windows_frame_info != NULL);\n    EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame0->windows_frame_info->valid);\n    EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FPO,\n              frame0->windows_frame_info->type_);\n    EXPECT_EQ(0x10U, frame0->windows_frame_info->local_size);\n  }\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame1 = static_cast<StackFrameX86 *>(frames->at(1));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust);\n    ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP\n               | StackFrameX86::CONTEXT_VALID_ESP\n               | StackFrameX86::CONTEXT_VALID_EBP),\n              frame1->context_validity);\n    EXPECT_EQ(0x40009b5bU, frame1->instruction + 1);\n    EXPECT_EQ(0x40009b5bU, frame1->context.eip);\n    EXPECT_EQ(frame1_esp.Value(), frame1->context.esp);\n    EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp);\n    EXPECT_EQ(&module1, frame1->module);\n    EXPECT_EQ(\"\", frame1->function_name);\n    EXPECT_EQ(NULL, frame1->windows_frame_info);\n  }\n}\n\n// Use Windows FrameTypeFPO data to walk a stack frame for a function\n// that uses %ebp for its own purposes, saving the value it had in the\n// caller in the standard place in the saved register area.\nTEST_F(GetCallerFrame, WindowsFPOUsedEBP) {\n  SetModuleSymbols(&module1,\n                   // Note bogus parameter size in FUNC record; the walker\n                   // should prefer the STACK WIN record, and see the '8' below.\n                   \"FUNC 9aa8 e6 abbe module1::RaisedByTheAliens\\n\"\n                   \"STACK WIN 0 9aa8 e6 a 0 10 8 4 0 0 1\\n\");\n  Label frame0_esp;\n  Label frame1_esp, frame1_ebp;\n  stack_section.start() = 0x80000000;\n  stack_section\n    // frame 0, in module1::wheedle.  FrameTypeFPO (STACK WIN 0) frame.\n    .Mark(&frame0_esp)\n    // no outgoing parameters; this is the youngest frame.\n    .D32(frame1_ebp)    // saved register area: saved %ebp\n    .D32(0xb68bd5f9)    // saved register area: something else\n    .D32(0xd25d05fc)    // local area\n    .D32(0x4000debe)    // return address, in module1, no function\n    // frame 1, in module1, no function.\n    .Mark(&frame1_esp)\n    .D32(0xf0c9a974)    // junk\n    .Mark(&frame1_ebp)\n    .D32(0)             // saved %ebp (stack end)\n    .D32(0);            // saved %eip (stack end)\n\n  RegionFromSection();\n  raw_context.eip = 0x40009ab8; // in module1::RaisedByTheAliens\n  raw_context.esp = stack_section.start().Value();\n  // RaisedByTheAliens uses %ebp for its own mysterious purposes.\n  raw_context.ebp = 0xecbdd1a5;\n\n  StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n  ASSERT_EQ(2U, frames->size());\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame0 = static_cast<StackFrameX86 *>(frames->at(0));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n    ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity);\n    EXPECT_EQ(0x40009ab8U, frame0->instruction);\n    EXPECT_EQ(0x40009ab8U, frame0->context.eip);\n    EXPECT_EQ(frame0_esp.Value(), frame0->context.esp);\n    EXPECT_EQ(0xecbdd1a5, frame0->context.ebp);\n    EXPECT_EQ(&module1, frame0->module);\n    EXPECT_EQ(\"module1::RaisedByTheAliens\", frame0->function_name);\n    EXPECT_EQ(0x40009aa8U, frame0->function_base);\n    // The STACK WIN record for module1::RaisedByTheAliens should have\n    // produced a fully populated WindowsFrameInfo structure.\n    ASSERT_TRUE(frame0->windows_frame_info != NULL);\n    EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame0->windows_frame_info->valid);\n    EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FPO,\n              frame0->windows_frame_info->type_);\n    EXPECT_EQ(\"\", frame0->windows_frame_info->program_string);\n    EXPECT_TRUE(frame0->windows_frame_info->allocates_base_pointer);\n  }\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame1 = static_cast<StackFrameX86 *>(frames->at(1));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust);\n    ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP\n               | StackFrameX86::CONTEXT_VALID_ESP\n               | StackFrameX86::CONTEXT_VALID_EBP),\n              frame1->context_validity);\n    EXPECT_EQ(0x4000debeU, frame1->instruction + 1);\n    EXPECT_EQ(0x4000debeU, frame1->context.eip);\n    EXPECT_EQ(frame1_esp.Value(), frame1->context.esp);\n    EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp);\n    EXPECT_EQ(&module1, frame1->module);\n    EXPECT_EQ(\"\", frame1->function_name);\n    EXPECT_EQ(NULL, frame1->windows_frame_info);\n  }\n}\n\n// This is a regression unit test which covers a bug which has to do with\n// FPO-optimized Windows system call stubs in the context frame.  There is\n// a more recent Windows system call dispatch mechanism which differs from\n// the one which is being tested here.  The newer system call dispatch\n// mechanism creates an extra context frame (KiFastSystemCallRet).\nTEST_F(GetCallerFrame, WindowsFPOSystemCall) {\n  SetModuleSymbols(&module3,  // ntdll.dll\n                   \"PUBLIC 1f8ac c ZwWaitForSingleObject\\n\"\n                   \"STACK WIN 0 1f8ac 1b 0 0 c 0 0 0 0 0\\n\");\n  SetModuleSymbols(&module4,  // kernelbase.dll\n                   \"PUBLIC 109f9 c WaitForSingleObjectEx\\n\"\n                   \"PUBLIC 36590 0 _except_handler4\\n\"\n                   \"STACK WIN 4 109f9 df c 0 c c 48 0 1 $T0 $ebp = $eip \"\n                   \"$T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L \"\n                   \"$T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\\n\"\n                   \"STACK WIN 4 36590 154 17 0 10 0 14 0 1 $T0 $ebp = $eip \"\n                   \"$T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 \"\n                   \".cbSavedRegs - = $P $T0 8 + .cbParams + =\\n\");\n  SetModuleSymbols(&module5,  // kernel32.dll\n                   \"PUBLIC 11136 8 WaitForSingleObject\\n\"\n                   \"PUBLIC 11151 c WaitForSingleObjectExImplementation\\n\"\n                   \"STACK WIN 4 11136 16 5 0 8 0 0 0 1 $T0 $ebp = $eip \"\n                   \"$T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L \"\n                   \"$T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\\n\"\n                   \"STACK WIN 4 11151 7a 5 0 c 0 0 0 1 $T0 $ebp = $eip \"\n                   \"$T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L \"\n                   \"$T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\\n\");\n  SetModuleSymbols(&module6,  // chrome.dll\n                   \"FILE 7038 some_file_name.h\\n\"\n                   \"FILE 839776 some_file_name.cc\\n\"\n                   \"FUNC 217fda 17 4 function_217fda\\n\"\n                   \"217fda 4 102 839776\\n\"\n                   \"FUNC 217ff1 a 4 function_217ff1\\n\"\n                   \"217ff1 0 594 7038\\n\"\n                   \"217ff1 a 596 7038\\n\"\n                   \"STACK WIN 0 217ff1 a 0 0 4 0 0 0 0 0\\n\");\n\n  Label frame0_esp, frame1_esp;\n  Label frame1_ebp, frame2_ebp, frame3_ebp;\n  stack_section.start() = 0x002ff290;\n  stack_section\n    .Mark(&frame0_esp)\n    .D32(0x771ef8c1)    // EIP in frame 0 (system call)\n    .D32(0x75fa0a91)    // return address of frame 0\n    .Mark(&frame1_esp)\n    .D32(0x000017b0)    // args to child\n    .D32(0x00000000)\n    .D32(0x002ff2d8)\n    .D32(0x88014a2e)\n    .D32(0x002ff364)\n    .D32(0x000017b0)\n    .D32(0x00000000)\n    .D32(0x00000024)\n    .D32(0x00000001)\n    .D32(0x00000000)\n    .D32(0x00000000)\n    .D32(0x00000000)\n    .D32(0x00000000)\n    .D32(0x00000000)\n    .D32(0x00000000)\n    .D32(0x00000000)\n    .D32(0x9e3b9800)\n    .D32(0xfffffff7)\n    .D32(0x00000000)\n    .D32(0x002ff2a4)\n    .D32(0x64a07ff1)    // random value to be confused with a return address\n    .D32(0x002ff8dc)\n    .D32(0x75fc6590)    // random value to be confused with a return address\n    .D32(0xfdd2c6ea)\n    .D32(0x00000000)\n    .Mark(&frame1_ebp)\n    .D32(frame2_ebp)    // Child EBP\n    .D32(0x75741194)    // return address of frame 1\n    .D32(0x000017b0)    // args to child\n    .D32(0x0036ee80)\n    .D32(0x00000000)\n    .D32(0x65bc7d14)\n    .Mark(&frame2_ebp)\n    .D32(frame3_ebp)    // Child EBP\n    .D32(0x75741148)    // return address of frame 2\n    .D32(0x000017b0)    // args to child\n    .D32(0x0036ee80)\n    .D32(0x00000000)\n    .Mark(&frame3_ebp)\n    .D32(0)             // saved %ebp (stack end)\n    .D32(0);            // saved %eip (stack end)\n\n  RegionFromSection();\n  raw_context.eip = 0x771ef8c1;  // in ntdll::ZwWaitForSingleObject\n  raw_context.esp = stack_section.start().Value();\n  ASSERT_TRUE(raw_context.esp == frame0_esp.Value());\n  raw_context.ebp = frame1_ebp.Value();\n\n  StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                        &supplier, &resolver);\n  ASSERT_TRUE(walker.Walk(&call_stack));\n  frames = call_stack.frames();\n\n  ASSERT_EQ(4U, frames->size());\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame0 = static_cast<StackFrameX86 *>(frames->at(0));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n    ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity);\n    EXPECT_EQ(0x771ef8c1U, frame0->instruction);\n    EXPECT_EQ(0x771ef8c1U, frame0->context.eip);\n    EXPECT_EQ(frame0_esp.Value(), frame0->context.esp);\n    EXPECT_EQ(frame1_ebp.Value(), frame0->context.ebp);\n    EXPECT_EQ(&module3, frame0->module);\n    EXPECT_EQ(\"ZwWaitForSingleObject\", frame0->function_name);\n    // The STACK WIN record for module3!ZwWaitForSingleObject should have\n    // produced a fully populated WindowsFrameInfo structure.\n    ASSERT_TRUE(frame0->windows_frame_info != NULL);\n    EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame0->windows_frame_info->valid);\n    EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FPO,\n              frame0->windows_frame_info->type_);\n    EXPECT_EQ(\"\", frame0->windows_frame_info->program_string);\n    EXPECT_FALSE(frame0->windows_frame_info->allocates_base_pointer);\n  }\n\n  {  // To avoid reusing locals by mistake\n    StackFrameX86 *frame1 = static_cast<StackFrameX86 *>(frames->at(1));\n    EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust);\n    ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP\n               | StackFrameX86::CONTEXT_VALID_ESP\n               | StackFrameX86::CONTEXT_VALID_EBP),\n              frame1->context_validity);\n    EXPECT_EQ(0x75fa0a91U, frame1->instruction + 1);\n    EXPECT_EQ(0x75fa0a91U, frame1->context.eip);\n    EXPECT_EQ(frame1_esp.Value(), frame1->context.esp);\n    EXPECT_EQ(frame1_ebp.Value(), frame1->context.ebp);\n    EXPECT_EQ(&module4, frame1->module);\n    EXPECT_EQ(\"WaitForSingleObjectEx\", frame1->function_name);\n    // The STACK WIN record for module4!WaitForSingleObjectEx should have\n    // produced a fully populated WindowsFrameInfo structure.\n    ASSERT_TRUE(frame1->windows_frame_info != NULL);\n    EXPECT_EQ(WindowsFrameInfo::VALID_ALL, frame1->windows_frame_info->valid);\n    EXPECT_EQ(WindowsFrameInfo::STACK_INFO_FRAME_DATA,\n              frame1->windows_frame_info->type_);\n    EXPECT_EQ(\"$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L \"\n              \"$T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\",\n              frame1->windows_frame_info->program_string);\n    EXPECT_FALSE(frame1->windows_frame_info->allocates_base_pointer);\n  }\n}\n\nstruct CFIFixture: public StackwalkerX86Fixture {\n  CFIFixture() {\n    // Provide a bunch of STACK CFI records; individual tests walk to the\n    // caller from every point in this series, expecting to find the same\n    // set of register values.\n    SetModuleSymbols(&module1,\n                     // The youngest frame's function.\n                     \"FUNC 4000 1000 10 enchiridion\\n\"\n                     // Initially, just a return address.\n                     \"STACK CFI INIT 4000 100 .cfa: $esp 4 + .ra: .cfa 4 - ^\\n\"\n                     // Push %ebx.\n                     \"STACK CFI 4001 .cfa: $esp 8 + $ebx: .cfa 8 - ^\\n\"\n                     // Move %esi into %ebx.  Weird, but permitted.\n                     \"STACK CFI 4002 $esi: $ebx\\n\"\n                     // Allocate frame space, and save %edi.\n                     \"STACK CFI 4003 .cfa: $esp 20 + $edi: .cfa 16 - ^\\n\"\n                     // Put the return address in %edi.\n                     \"STACK CFI 4005 .ra: $edi\\n\"\n                     // Save %ebp, and use it as a frame pointer.\n                     \"STACK CFI 4006 .cfa: $ebp 8 + $ebp: .cfa 12 - ^\\n\"\n\n                     // The calling function.\n                     \"FUNC 5000 1000 10 epictetus\\n\"\n                     // Mark it as end of stack.\n                     \"STACK CFI INIT 5000 1000 .cfa: $esp .ra 0\\n\");\n\n    // Provide some distinctive values for the caller's registers.\n    expected.esp = 0x80000000;\n    expected.eip = 0x40005510;\n    expected.ebp = 0xc0d4aab9;\n    expected.ebx = 0x60f20ce6;\n    expected.esi = 0x53d1379d;\n    expected.edi = 0xafbae234;\n\n    // By default, registers are unchanged.\n    raw_context = expected;\n  }\n\n  // Walk the stack, using stack_section as the contents of the stack\n  // and raw_context as the current register values. (Set\n  // raw_context.esp to the stack's starting address.) Expect two\n  // stack frames; in the older frame, expect the callee-saves\n  // registers to have values matching those in 'expected'.\n  void CheckWalk() {\n    RegionFromSection();\n    raw_context.esp = stack_section.start().Value();\n\n    StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,\n                          &supplier, &resolver);\n    ASSERT_TRUE(walker.Walk(&call_stack));\n    frames = call_stack.frames();\n    ASSERT_EQ(2U, frames->size());\n\n    {  // To avoid reusing locals by mistake\n      StackFrameX86 *frame0 = static_cast<StackFrameX86 *>(frames->at(0));\n      EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);\n      ASSERT_EQ(StackFrameX86::CONTEXT_VALID_ALL, frame0->context_validity);\n      EXPECT_EQ(\"enchiridion\", frame0->function_name);\n      EXPECT_EQ(0x40004000U, frame0->function_base);\n      ASSERT_TRUE(frame0->windows_frame_info != NULL);\n      ASSERT_EQ(WindowsFrameInfo::VALID_PARAMETER_SIZE,\n                frame0->windows_frame_info->valid);\n      ASSERT_TRUE(frame0->cfi_frame_info != NULL);\n    }\n\n    {  // To avoid reusing locals by mistake\n      StackFrameX86 *frame1 = static_cast<StackFrameX86 *>(frames->at(1));\n      EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust);\n      ASSERT_EQ((StackFrameX86::CONTEXT_VALID_EIP |\n                 StackFrameX86::CONTEXT_VALID_ESP |\n                 StackFrameX86::CONTEXT_VALID_EBP |\n                 StackFrameX86::CONTEXT_VALID_EBX |\n                 StackFrameX86::CONTEXT_VALID_ESI |\n                 StackFrameX86::CONTEXT_VALID_EDI),\n                 frame1->context_validity);\n      EXPECT_EQ(expected.eip, frame1->context.eip);\n      EXPECT_EQ(expected.esp, frame1->context.esp);\n      EXPECT_EQ(expected.ebp, frame1->context.ebp);\n      EXPECT_EQ(expected.ebx, frame1->context.ebx);\n      EXPECT_EQ(expected.esi, frame1->context.esi);\n      EXPECT_EQ(expected.edi, frame1->context.edi);\n      EXPECT_EQ(\"epictetus\", frame1->function_name);\n    }\n  }\n\n  // The values the stack walker should find for the caller's registers.\n  MDRawContextX86 expected;\n};\n\nclass CFI: public CFIFixture, public Test { };\n\nTEST_F(CFI, At4000) {\n  Label frame1_esp = expected.esp;\n  stack_section\n    .D32(0x40005510)            // return address\n    .Mark(&frame1_esp);         // This effectively sets stack_section.start().\n  raw_context.eip = 0x40004000;\n  CheckWalk();\n}\n\nTEST_F(CFI, At4001) {\n  Label frame1_esp = expected.esp;\n  stack_section\n    .D32(0x60f20ce6)            // saved %ebx\n    .D32(0x40005510)            // return address\n    .Mark(&frame1_esp);         // This effectively sets stack_section.start().\n  raw_context.eip = 0x40004001;\n  raw_context.ebx = 0x91aa9a8b; // callee's %ebx value\n  CheckWalk();\n}\n\nTEST_F(CFI, At4002) {\n  Label frame1_esp = expected.esp;\n  stack_section\n    .D32(0x60f20ce6)            // saved %ebx\n    .D32(0x40005510)            // return address\n    .Mark(&frame1_esp);         // This effectively sets stack_section.start().\n  raw_context.eip = 0x40004002;\n  raw_context.ebx = 0x53d1379d; // saved %esi\n  raw_context.esi = 0xa5c790ed; // callee's %esi value\n  CheckWalk();\n}\n\nTEST_F(CFI, At4003) {\n  Label frame1_esp = expected.esp;\n  stack_section\n    .D32(0x56ec3db7)            // garbage\n    .D32(0xafbae234)            // saved %edi\n    .D32(0x53d67131)            // garbage\n    .D32(0x60f20ce6)            // saved %ebx\n    .D32(0x40005510)            // return address\n    .Mark(&frame1_esp);         // This effectively sets stack_section.start().\n  raw_context.eip = 0x40004003;\n  raw_context.ebx = 0x53d1379d; // saved %esi\n  raw_context.esi = 0xa97f229d; // callee's %esi\n  raw_context.edi = 0xb05cc997; // callee's %edi\n  CheckWalk();\n}\n\n// The results here should be the same as those at module offset\n// 0x4003.\nTEST_F(CFI, At4004) {\n  Label frame1_esp = expected.esp;\n  stack_section\n    .D32(0xe29782c2)            // garbage\n    .D32(0xafbae234)            // saved %edi\n    .D32(0x5ba29ce9)            // garbage\n    .D32(0x60f20ce6)            // saved %ebx\n    .D32(0x40005510)            // return address\n    .Mark(&frame1_esp);         // This effectively sets stack_section.start().\n  raw_context.eip = 0x40004004;\n  raw_context.ebx = 0x53d1379d; // saved %esi\n  raw_context.esi = 0x0fb7dc4e; // callee's %esi\n  raw_context.edi = 0x993b4280; // callee's %edi\n  CheckWalk();\n}\n\nTEST_F(CFI, At4005) {\n  Label frame1_esp = expected.esp;\n  stack_section\n    .D32(0xe29782c2)            // garbage\n    .D32(0xafbae234)            // saved %edi\n    .D32(0x5ba29ce9)            // garbage\n    .D32(0x60f20ce6)            // saved %ebx\n    .D32(0x8036cc02)            // garbage\n    .Mark(&frame1_esp);         // This effectively sets stack_section.start().\n  raw_context.eip = 0x40004005;\n  raw_context.ebx = 0x53d1379d; // saved %esi\n  raw_context.esi = 0x0fb7dc4e; // callee's %esi\n  raw_context.edi = 0x40005510; // return address\n  CheckWalk();\n}\n\nTEST_F(CFI, At4006) {\n  Label frame0_ebp;\n  Label frame1_esp = expected.esp;\n  stack_section\n    .D32(0xdcdd25cd)            // garbage\n    .D32(0xafbae234)            // saved %edi\n    .D32(0xc0d4aab9)            // saved %ebp\n    .Mark(&frame0_ebp)          // frame pointer points here\n    .D32(0x60f20ce6)            // saved %ebx\n    .D32(0x8036cc02)            // garbage\n    .Mark(&frame1_esp);         // This effectively sets stack_section.start().\n  raw_context.eip = 0x40004006;\n  raw_context.ebp = frame0_ebp.Value();\n  raw_context.ebx = 0x53d1379d; // saved %esi\n  raw_context.esi = 0x743833c9; // callee's %esi\n  raw_context.edi = 0x40005510; // return address\n  CheckWalk();\n}\n\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_address_map-inl.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// static_address_map-inl.h: StaticAddressMap implementation.\n//\n// See static_address_map.h for documentation.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef PROCESSOR_STATIC_ADDRESS_MAP_INL_H__\n#define PROCESSOR_STATIC_ADDRESS_MAP_INL_H__\n\n#include \"processor/static_address_map.h\"\n\n#include \"processor/logging.h\"\n\nnamespace google_breakpad {\n\ntemplate<typename AddressType, typename EntryType>\nbool StaticAddressMap<AddressType, EntryType>::Retrieve(\n    const AddressType &address,\n    const EntryType *&entry, AddressType *entry_address) const {\n\n  // upper_bound gives the first element whose key is greater than address,\n  // but we want the first element whose key is less than or equal to address.\n  // Decrement the iterator to get there, but not if the upper_bound already\n  // points to the beginning of the map - in that case, address is lower than\n  // the lowest stored key, so return false.\n\n  MapConstIterator iterator = map_.upper_bound(address);\n  if (iterator == map_.begin())\n    return false;\n  --iterator;\n\n  entry = iterator.GetValuePtr();\n  // Make sure AddressType is a copyable basic type\n  if (entry_address)\n    *entry_address = iterator.GetKey();\n\n  return true;\n}\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_STATIC_ADDRESS_MAP_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_address_map.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// static_address_map.h: StaticAddressMap.\n//\n// StaticAddressMap is a wrapper class of StaticMap, just as AddressMap wraps\n// std::map.  StaticAddressMap provides read-only Retrieve() operation, similar\n// as AddressMap.  However, the difference between StaticAddressMap and\n// AddressMap is that StaticAddressMap does not support dynamic operation\n// Store() due to the static nature of the underlying StaticMap.\n//\n// See address_map.h for reference.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef PROCESSOR_STATIC_ADDRESS_MAP_H__\n#define PROCESSOR_STATIC_ADDRESS_MAP_H__\n\n#include \"processor/static_map-inl.h\"\n\nnamespace google_breakpad {\n\n// AddressType MUST be a basic type, e.g.: integer types etc\n// EntryType could be a complex type, so we retrieve its pointer instead.\ntemplate<typename AddressType, typename EntryType>\nclass StaticAddressMap {\n public:\n  StaticAddressMap(): map_() { }\n  explicit StaticAddressMap(const char *map_data): map_(map_data) { }\n\n  // Locates the entry stored at the highest address less than or equal to\n  // the address argument.  If there is no such range, returns false.  The\n  // entry is returned in entry, which is a required argument.  If\n  // entry_address is not NULL, it will be set to the address that the entry\n  // was stored at.\n  bool Retrieve(const AddressType &address,\n                const EntryType *&entry, AddressType *entry_address) const;\n\n private:\n  friend class ModuleComparer;\n  // Convenience types.\n  typedef StaticAddressMap* SelfPtr;\n  typedef StaticMap<AddressType, EntryType> AddressToEntryMap;\n  typedef typename AddressToEntryMap::const_iterator MapConstIterator;\n\n  AddressToEntryMap map_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_STATIC_ADDRESS_MAP_H__\n\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_address_map_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// static_address_map_unittest.cc: Unit tests for StaticAddressMap.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#include <climits>\n#include <cstdlib>\n#include <ctime>\n#include <string>\n#include <iostream>\n#include <sstream>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"processor/address_map-inl.h\"\n#include \"processor/static_address_map-inl.h\"\n#include \"processor/simple_serializer-inl.h\"\n#include \"map_serializers-inl.h\"\n\ntypedef google_breakpad::StaticAddressMap<int, char> TestMap;\ntypedef google_breakpad::AddressMap<int, std::string> AddrMap;\n\nclass TestStaticAddressMap : public ::testing::Test {\n protected:\n  void SetUp() {\n    for (int testcase = 0; testcase < kNumberTestCases; ++testcase) {\n      testdata[testcase] = new int[testsize[testcase]];\n    }\n\n    // Test data set0: NULL (empty map)\n\n    // Test data set1: single element.\n    testdata[1][0] = 10;\n\n    // Test data set2: six elements.\n    const int tempdata[] = {5, 10, 14, 15, 16, 20};\n    for (int i = 0; i < testsize[2]; ++i)\n      testdata[2][i] = tempdata[i];\n\n    // Test data set3:\n    srand(time(NULL));\n    for (int i = 0; i < testsize[3]; ++i)\n      testdata[3][i] = rand();\n\n    // Setup maps.\n    std::stringstream sstream;\n    for (int testcase = 0; testcase < kNumberTestCases; ++testcase) {\n      for (int data_item = 0; data_item < testsize[testcase]; ++data_item) {\n        sstream.clear();\n        sstream << \"test \" << testdata[testcase][data_item];\n        addr_map[testcase].Store(testdata[testcase][data_item], sstream.str());\n      }\n      map_data[testcase] = serializer.Serialize(addr_map[testcase], NULL);\n      test_map[testcase] = TestMap(map_data[testcase]);\n    }\n  }\n\n  void TearDown() {\n    for (int i = 0; i < kNumberTestCases; ++i) {\n      delete [] map_data[i];\n      delete [] testdata[i];\n    }\n  }\n\n  void CompareRetrieveResult(int testcase, int target) {\n    int address;\n    int address_test;\n    std::string entry;\n    std::string entry_test;\n    const char *entry_cstring = NULL;\n    bool found;\n    bool found_test;\n\n    found = addr_map[testcase].Retrieve(target, &entry, &address);\n    found_test =\n        test_map[testcase].Retrieve(target, entry_cstring, &address_test);\n\n    ASSERT_EQ(found, found_test);\n\n    if (found && found_test) {\n      ASSERT_EQ(address, address_test);\n      entry_test = entry_cstring;\n      ASSERT_EQ(entry, entry_test);\n    }\n  }\n\n  void RetrieveTester(int testcase) {\n    int target;\n    target = INT_MIN;\n    CompareRetrieveResult(testcase, target);\n    target = INT_MAX;\n    CompareRetrieveResult(testcase, target);\n\n    srand(time(0));\n    for (int data_item = 0; data_item < testsize[testcase]; ++data_item) {\n      // Retrive (aka, search) for target address and compare results from\n      // AddressMap and StaticAddressMap.\n\n      // First, assign the search target to be one of original testdata that is\n      // known to exist in the map.\n      target = testdata[testcase][data_item];\n      CompareRetrieveResult(testcase, target);\n      // Then, add +2 / -1 bias to target value, in order to test searching for\n      // a target address not stored in the map.\n      target -= 1;\n      CompareRetrieveResult(testcase, target);\n      target += 3;\n      CompareRetrieveResult(testcase, target);\n      // Repeatedly test searching for random target addresses.\n      target = rand();\n      CompareRetrieveResult(testcase, target);\n    }\n  }\n\n  // Test data sets:\n  static const int kNumberTestCases = 4;\n  static const int testsize[];\n  int *testdata[kNumberTestCases];\n\n  AddrMap addr_map[kNumberTestCases];\n  TestMap test_map[kNumberTestCases];\n  char *map_data[kNumberTestCases];\n  google_breakpad::AddressMapSerializer<int, std::string> serializer;\n};\n\nconst int TestStaticAddressMap::testsize[] = {0, 1, 6, 1000};\n\nTEST_F(TestStaticAddressMap, TestEmptyMap) {\n  int testcase = 0;\n  int target;\n  target = INT_MIN;\n  CompareRetrieveResult(testcase, target);\n  target = INT_MAX;\n  CompareRetrieveResult(testcase, target);\n  for (int data_item = 0; data_item < testsize[testcase]; ++data_item) {\n    target = testdata[testcase][data_item];\n    CompareRetrieveResult(testcase, target);\n    target -= 1;\n    CompareRetrieveResult(testcase, target);\n    target += 3;\n    CompareRetrieveResult(testcase, target);\n    target = rand();\n    CompareRetrieveResult(testcase, target);\n  }\n}\n\nTEST_F(TestStaticAddressMap, TestOneElementMap) {\n  int testcase = 1;\n  int target;\n  target = INT_MIN;\n  CompareRetrieveResult(testcase, target);\n  target = INT_MAX;\n  CompareRetrieveResult(testcase, target);\n  for (int data_item = 0; data_item < testsize[testcase]; ++data_item) {\n    target = testdata[testcase][data_item];\n    CompareRetrieveResult(testcase, target);\n    target -= 1;\n    CompareRetrieveResult(testcase, target);\n    target += 3;\n    CompareRetrieveResult(testcase, target);\n    target = rand();\n    CompareRetrieveResult(testcase, target);\n  }\n}\n\nTEST_F(TestStaticAddressMap, TestSixElementsMap) {\n  int testcase = 2;\n  int target;\n  target = INT_MIN;\n  CompareRetrieveResult(testcase, target);\n  target = INT_MAX;\n  CompareRetrieveResult(testcase, target);\n  for (int data_item = 0; data_item < testsize[testcase]; ++data_item) {\n    target = testdata[testcase][data_item];\n    CompareRetrieveResult(testcase, target);\n    target -= 1;\n    CompareRetrieveResult(testcase, target);\n    target += 3;\n    CompareRetrieveResult(testcase, target);\n    target = rand();\n    CompareRetrieveResult(testcase, target);\n  }\n}\n\nTEST_F(TestStaticAddressMap, Test1000RandomElementsMap) {\n  int testcase = 3;\n  int target;\n  target = INT_MIN;\n  CompareRetrieveResult(testcase, target);\n  target = INT_MAX;\n  CompareRetrieveResult(testcase, target);\n  for (int data_item = 0; data_item < testsize[testcase]; ++data_item) {\n    target = testdata[testcase][data_item];\n    CompareRetrieveResult(testcase, target);\n    target -= 1;\n    CompareRetrieveResult(testcase, target);\n    target += 3;\n    CompareRetrieveResult(testcase, target);\n    target = rand();\n    CompareRetrieveResult(testcase, target);\n  }\n}\n\nint main(int argc, char *argv[]) {\n  ::testing::InitGoogleTest(&argc, argv);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_contained_range_map-inl.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// static_contained_range_map-inl.h: Hierarchically-organized range map,\n// i.e., StaticContainedRangeMap implementation.\n//\n// See static_contained_range_map.h for documentation.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef PROCESSOR_STATIC_CONTAINED_RANGE_MAP_INL_H__\n#define PROCESSOR_STATIC_CONTAINED_RANGE_MAP_INL_H__\n\n#include \"processor/static_contained_range_map.h\"\n#include \"processor/logging.h\"\n\nnamespace google_breakpad {\n\ntemplate<typename AddressType, typename EntryType>\nStaticContainedRangeMap<AddressType, EntryType>::StaticContainedRangeMap(\n    const char *base)\n    : base_(*(reinterpret_cast<const AddressType*>(base))),\n      entry_size_(*(reinterpret_cast<const u_int32_t*>(base + sizeof(base_)))),\n      entry_ptr_(reinterpret_cast<const EntryType *>(\n          base + sizeof(base_) + sizeof(entry_size_))),\n      map_(base + sizeof(base_) + sizeof(entry_size_) + entry_size_) {\n  if (entry_size_ == 0)\n    entry_ptr_ = NULL;\n}\n\n\ntemplate<typename AddressType, typename EntryType>\nbool StaticContainedRangeMap<AddressType, EntryType>::RetrieveRange(\n    const AddressType &address, const EntryType *&entry) const {\n\n  // Get an iterator to the child range whose high address is equal to or\n  // greater than the supplied address.  If the supplied address is higher\n  // than all of the high addresses in the range, then this range does not\n  // contain a child at address, so return false.  If the supplied address\n  // is lower than the base address of the child range, then it is not within\n  // the child range, so return false.\n  MapConstIterator iterator = map_.lower_bound(address);\n\n  if (iterator == map_.end())\n    return false;\n\n  const char *memory_child =\n      reinterpret_cast<const char*>(iterator.GetValuePtr());\n\n  StaticContainedRangeMap child_map(memory_child);\n\n  if (address < child_map.base_)\n    return false;\n\n  // The child in iterator->second contains the specified address.  Find out\n  // if it has a more-specific descendant that also contains it.  If it does,\n  // it will set |entry| appropriately.  If not, set |entry| to the child.\n  if (!child_map.RetrieveRange(address, entry))\n    entry = child_map.entry_ptr_;\n\n  return true;\n}\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_STATIC_CONTAINED_RANGE_MAP_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_contained_range_map.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// static_contained_range_map.h: StaticContainedRangeMap.\n//\n// StaticContainedRangeMap is similar to ContainedRangeMap.  However,\n// StaticContainedRangeMap wraps a StaticMap instead of std::map, and does not\n// support dynamic operations like StoreRange(...).\n// StaticContainedRangeMap provides same RetrieveRange(...) interfaces as\n// ContainedRangeMap.\n//\n// Please see contained_range_map.h for more documentation.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef PROCESSOR_STATIC_CONTAINED_RANGE_MAP_H__\n#define PROCESSOR_STATIC_CONTAINED_RANGE_MAP_H__\n\n#include \"processor/static_map-inl.h\"\n\nnamespace google_breakpad {\n\ntemplate<typename AddressType, typename EntryType>\nclass StaticContainedRangeMap {\n public:\n  StaticContainedRangeMap(): base_(), entry_size_(), entry_ptr_(), map_() { }\n  explicit StaticContainedRangeMap(const char *base);\n\n  // Retrieves the most specific (smallest) descendant range encompassing\n  // the specified address.  This method will only return entries held by\n  // child ranges, and not the entry contained by |this|.  This is necessary\n  // to support a sparsely-populated root range.  If no descendant range\n  // encompasses the address, returns false.\n  bool RetrieveRange(const AddressType &address, const EntryType *&entry) const;\n\n private:\n  friend class ModuleComparer;\n  // AddressToRangeMap stores pointers.  This makes reparenting simpler in\n  // StoreRange, because it doesn't need to copy entire objects.\n  typedef StaticContainedRangeMap* SelfPtr;\n  typedef\n  StaticMap<AddressType, StaticContainedRangeMap> AddressToRangeMap;\n  typedef typename AddressToRangeMap::const_iterator MapConstIterator;\n\n  // The base address of this range.  The high address does not need to\n  // be stored, because it is used as the key to an object in its parent's\n  // map, and all ContainedRangeMaps except for the root range are contained\n  // within maps.  The root range does not actually contain an entry, so its\n  // base_ field is meaningless, and the fact that it has no parent and thus\n  // no key is unimportant.  For this reason, the base_ field should only be\n  // is accessed on child ContainedRangeMap objects, and never on |this|.\n  AddressType base_;\n\n  // The entry corresponding to this range.  The root range does not\n  // actually contain an entry, so its entry_ field is meaningless.  For\n  // this reason, the entry_ field should only be accessed on child\n  // ContainedRangeMap objects, and never on |this|.\n  u_int32_t entry_size_;\n  const EntryType *entry_ptr_;\n\n  // The map containing child ranges, keyed by each child range's high\n  // address.  This is a pointer to avoid allocating map structures for\n  // leaf nodes, where they are not needed.\n  AddressToRangeMap map_;\n};\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_STATIC_CONTAINED_RANGE_MAP_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_contained_range_map_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// static_contained_range_map_unittest.cc: Unit tests for\n// StaticContainedRangeMap.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#include \"breakpad_googletest_includes.h\"\n#include \"processor/contained_range_map-inl.h\"\n#include \"processor/static_contained_range_map-inl.h\"\n#include \"processor/simple_serializer-inl.h\"\n#include \"processor/map_serializers-inl.h\"\n\n#include \"processor/scoped_ptr.h\"\n#include \"processor/logging.h\"\n\nnamespace {\n\ntypedef google_breakpad::ContainedRangeMap<unsigned int, int> CRMMap;\ntypedef google_breakpad::StaticContainedRangeMap<unsigned int, int> TestMap;\n\n// Each element in test_data contains the expected result when calling\n// RetrieveRange on an address.\nconst int test_data[] = {\n  0,   // 0\n  0,   // 1\n  0,   // 2\n  0,   // 3\n  0,   // 4\n  0,   // 5\n  0,   // 6\n  0,   // 7\n  9,   // 8\n  7,   // 9\n  1,   // 10\n  5,   // 11\n  6,   // 12\n  6,   // 13\n  6,   // 14\n  6,   // 15\n  6,   // 16\n  6,   // 17\n  6,   // 18\n  5,   // 19\n  7,   // 20\n  8,   // 21\n  0,   // 22\n  0,   // 23\n  0,   // 24\n  0,   // 25\n  0,   // 26\n  0,   // 27\n  0,   // 28\n  0,   // 29\n  10,  // 30\n  10,  // 31\n  10,  // 32\n  11,  // 33\n  11,  // 34\n  11,  // 35\n  0,   // 36\n  0,   // 37\n  0,   // 38\n  0,   // 39\n  14,  // 40\n  14,  // 41\n  14,  // 42\n  14,  // 43\n  15,  // 44\n  15,  // 45\n  15,  // 46\n  15,  // 47\n  0,   // 48\n  0,   // 49\n  19,  // 50\n  18,  // 51\n  18,  // 52\n  18,  // 53\n  18,  // 54\n  18,  // 55\n  18,  // 56\n  18,  // 57\n  18,  // 58\n  20,  // 59\n  21,  // 60\n  25,  // 61\n  26,  // 62\n  26,  // 63\n  26,  // 64\n  26,  // 65\n  26,  // 66\n  26,  // 67\n  24,  // 68\n  22,  // 69\n  30,  // 70\n  30,  // 71\n  30,  // 72\n  30,  // 73\n  31,  // 74\n  31,  // 75\n  30,  // 76\n  32,  // 77\n  32,  // 78\n  30,  // 79\n  34,  // 80\n  35,  // 81\n  36,  // 82\n  39,  // 83\n  38,  // 84\n  37,  // 85\n  43,  // 86\n  44,  // 87\n  41,  // 88\n  45,  // 89\n  42,  // 90\n  0,   // 91\n  0,   // 92\n  0,   // 93\n  0,   // 94\n  0,   // 95\n  0,   // 96\n  0,   // 97\n  0,   // 98\n  0    // 99\n};\n\n}  // namespace\n\nnamespace google_breakpad {\n\nclass TestStaticCRMMap : public ::testing::Test {\n protected:\n  void SetUp();\n\n  // A referrence map for testing StaticCRMMap.\n  google_breakpad::ContainedRangeMap<unsigned int, int> crm_map_;\n\n  // Static version of crm_map using serialized data of crm_map.\n  // The goal of testing is to make sure TestMap provides same results for\n  // lookup operation(s) as CRMMap does.\n  google_breakpad::StaticContainedRangeMap<unsigned int, int> test_map_;\n\n  google_breakpad::ContainedRangeMapSerializer<unsigned int, int> serializer_;\n\n  scoped_array<char> serialized_data_;\n};\n\nvoid TestStaticCRMMap::SetUp() {\n  // First, do the StoreRange tests.  This validates the containment\n  // rules.\n  // We confirm the referrence map correctly stores data during setup.\n  ASSERT_TRUE (crm_map_.StoreRange(10, 10,  1));\n  ASSERT_FALSE(crm_map_.StoreRange(10, 10,  2));  // exactly equal to 1\n  ASSERT_FALSE(crm_map_.StoreRange(11, 10,  3));  // begins inside 1 and extends up\n  ASSERT_FALSE(crm_map_.StoreRange( 9, 10,  4));  // begins below 1 and ends inside\n  ASSERT_TRUE (crm_map_.StoreRange(11,  9,  5));  // contained by existing\n  ASSERT_TRUE (crm_map_.StoreRange(12,  7,  6));\n  ASSERT_TRUE (crm_map_.StoreRange( 9, 12,  7));  // contains existing\n  ASSERT_TRUE (crm_map_.StoreRange( 9, 13,  8));\n  ASSERT_TRUE (crm_map_.StoreRange( 8, 14,  9));\n  ASSERT_TRUE (crm_map_.StoreRange(30,  3, 10));\n  ASSERT_TRUE (crm_map_.StoreRange(33,  3, 11));\n  ASSERT_TRUE (crm_map_.StoreRange(30,  6, 12));  // storable but totally masked\n  ASSERT_TRUE (crm_map_.StoreRange(40,  8, 13));  // will be totally masked\n  ASSERT_TRUE (crm_map_.StoreRange(40,  4, 14));\n  ASSERT_TRUE (crm_map_.StoreRange(44,  4, 15));\n  ASSERT_FALSE(crm_map_.StoreRange(32, 10, 16));  // begins in #10, ends in #14\n  ASSERT_FALSE(crm_map_.StoreRange(50,  0, 17));  // zero length\n  ASSERT_TRUE (crm_map_.StoreRange(50, 10, 18));\n  ASSERT_TRUE (crm_map_.StoreRange(50,  1, 19));\n  ASSERT_TRUE (crm_map_.StoreRange(59,  1, 20));\n  ASSERT_TRUE (crm_map_.StoreRange(60,  1, 21));\n  ASSERT_TRUE (crm_map_.StoreRange(69,  1, 22));\n  ASSERT_TRUE (crm_map_.StoreRange(60, 10, 23));\n  ASSERT_TRUE (crm_map_.StoreRange(68,  1, 24));\n  ASSERT_TRUE (crm_map_.StoreRange(61,  1, 25));\n  ASSERT_TRUE (crm_map_.StoreRange(61,  8, 26));\n  ASSERT_FALSE(crm_map_.StoreRange(59,  9, 27));\n  ASSERT_FALSE(crm_map_.StoreRange(59, 10, 28));\n  ASSERT_FALSE(crm_map_.StoreRange(59, 11, 29));\n  ASSERT_TRUE (crm_map_.StoreRange(70, 10, 30));\n  ASSERT_TRUE (crm_map_.StoreRange(74,  2, 31));\n  ASSERT_TRUE (crm_map_.StoreRange(77,  2, 32));\n  ASSERT_FALSE(crm_map_.StoreRange(72,  6, 33));\n  ASSERT_TRUE (crm_map_.StoreRange(80,  3, 34));\n  ASSERT_TRUE (crm_map_.StoreRange(81,  1, 35));\n  ASSERT_TRUE (crm_map_.StoreRange(82,  1, 36));\n  ASSERT_TRUE (crm_map_.StoreRange(83,  3, 37));\n  ASSERT_TRUE (crm_map_.StoreRange(84,  1, 38));\n  ASSERT_TRUE (crm_map_.StoreRange(83,  1, 39));\n  ASSERT_TRUE (crm_map_.StoreRange(86,  5, 40));\n  ASSERT_TRUE (crm_map_.StoreRange(88,  1, 41));\n  ASSERT_TRUE (crm_map_.StoreRange(90,  1, 42));\n  ASSERT_TRUE (crm_map_.StoreRange(86,  1, 43));\n  ASSERT_TRUE (crm_map_.StoreRange(87,  1, 44));\n  ASSERT_TRUE (crm_map_.StoreRange(89,  1, 45));\n  ASSERT_TRUE (crm_map_.StoreRange(87,  4, 46));\n  ASSERT_TRUE (crm_map_.StoreRange(87,  3, 47));\n  ASSERT_FALSE(crm_map_.StoreRange(86,  2, 48));\n\n  // Serialize crm_map to generate serialized data.\n  unsigned int size;\n  serialized_data_.reset(serializer_.Serialize(&crm_map_, &size));\n  BPLOG(INFO) << \"Serialized data size: \" << size << \" Bytes.\";\n\n  // Construct test_map_ from serialized data.\n  test_map_ = TestMap(serialized_data_.get());\n}\n\nTEST_F(TestStaticCRMMap, TestEmptyMap) {\n  CRMMap empty_crm_map;\n\n  unsigned int size;\n  scoped_array<char> serialized_data;\n  serialized_data.reset(serializer_.Serialize(&empty_crm_map, &size));\n  scoped_ptr<TestMap> test_map(new TestMap(serialized_data.get()));\n\n  const unsigned int kCorrectSizeForEmptyMap = 16;\n  ASSERT_EQ(kCorrectSizeForEmptyMap, size);\n\n  const int *entry_test;\n  ASSERT_FALSE(test_map->RetrieveRange(-1, entry_test));\n  ASSERT_FALSE(test_map->RetrieveRange(0, entry_test));\n  ASSERT_FALSE(test_map->RetrieveRange(10, entry_test));\n}\n\nTEST_F(TestStaticCRMMap, TestSingleElementMap) {\n  CRMMap crm_map;\n  // Test on one element:\n  int entry = 1;\n  crm_map.StoreRange(10, 10,  entry);\n\n  unsigned int size;\n  scoped_array<char> serialized_data;\n  serialized_data.reset(serializer_.Serialize(&crm_map, &size));\n  scoped_ptr<TestMap> test_map(new TestMap(serialized_data.get()));\n\n  const unsigned int kCorrectSizeForSingleElementMap = 40;\n  ASSERT_EQ(kCorrectSizeForSingleElementMap, size);\n\n  const int *entry_test;\n  ASSERT_FALSE(test_map->RetrieveRange(-1, entry_test));\n  ASSERT_FALSE(test_map->RetrieveRange(0, entry_test));\n  ASSERT_TRUE(test_map->RetrieveRange(10, entry_test));\n  ASSERT_EQ(*entry_test, entry);\n  ASSERT_TRUE(test_map->RetrieveRange(13, entry_test));\n  ASSERT_EQ(*entry_test, entry);\n}\n\nTEST_F(TestStaticCRMMap, RunTestData) {\n  unsigned int test_high = sizeof(test_data) / sizeof(test_data[0]);\n\n  // Now, do the RetrieveRange tests.  This further validates that the\n  // objects were stored properly and that retrieval returns the correct\n  // object.\n  // If GENERATE_TEST_DATA is defined, instead of the retrieval tests, a\n  // new test_data array will be printed.  Exercise caution when doing this.\n  // Be sure to verify the results manually!\n#ifdef GENERATE_TEST_DATA\n  printf(\"  const int test_data[] = {\\n\");\n#endif  // GENERATE_TEST_DATA\n\n  for (unsigned int address = 0; address < test_high; ++address) {\n    const int *entryptr;\n    int value = 0;\n    if (test_map_.RetrieveRange(address, entryptr))\n      value = *entryptr;\n\n#ifndef GENERATE_TEST_DATA\n    // Don't use ASSERT inside the loop because it won't show the failed\n    // |address|, and the line number will always be the same.  That makes\n    // it difficult to figure out which test failed.\n    EXPECT_EQ(value, test_data[address]) << \"FAIL: retrieve address \"\n                                         << address;\n#else  // !GENERATE_TEST_DATA\n    printf(\"    %d%c%s  // %d\\n\", value,\n                                  address == test_high - 1 ? ' ' : ',',\n                                  value < 10 ? \" \" : \"\",\n                                  address);\n#endif  // !GENERATE_TEST_DATA\n  }\n\n#ifdef GENERATE_TEST_DATA\n  printf(\"  };\\n\");\n#endif  // GENERATE_TEST_DATA\n}\n\n}  // namespace google_breakpad\n\nint main(int argc, char *argv[]) {\n  ::testing::InitGoogleTest(&argc, argv);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_map-inl.h",
    "content": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// static_map-inl.h: StaticMap implementation.\n//\n// See static_map.h for documentation.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n\n#ifndef PROCESSOR_STATIC_MAP_INL_H__\n#define PROCESSOR_STATIC_MAP_INL_H__\n\n#include \"processor/static_map.h\"\n#include \"processor/static_map_iterator-inl.h\"\n#include \"processor/logging.h\"\n\nnamespace google_breakpad {\n\ntemplate<typename Key, typename Value, typename Compare>\nStaticMap<Key, Value, Compare>::StaticMap(const char* raw_data)\n    : raw_data_(raw_data),\n      compare_() {\n  // First 4 Bytes store the number of nodes.\n  num_nodes_ = *(reinterpret_cast<const u_int32_t*>(raw_data_));\n\n  offsets_ = reinterpret_cast<const u_int32_t*>(\n      raw_data_ + sizeof(num_nodes_));\n\n  keys_ = reinterpret_cast<const Key*>(\n      raw_data_ + (1 + num_nodes_) * sizeof(u_int32_t));\n}\n\n// find(), lower_bound() and upper_bound() implement binary search algorithm.\ntemplate<typename Key, typename Value, typename Compare>\nStaticMapIterator<Key, Value, Compare>\nStaticMap<Key, Value, Compare>::find(const Key &key) const {\n  int begin = 0;\n  int end = num_nodes_;\n  int middle;\n  int compare_result;\n  while (begin < end) {\n    middle = begin + (end - begin) / 2;\n    compare_result = compare_(key, GetKeyAtIndex(middle));\n    if (compare_result == 0)\n      return IteratorAtIndex(middle);\n    if (compare_result < 0) {\n      end = middle;\n    } else {\n      begin = middle + 1;\n    }\n  }\n  return this->end();\n}\n\ntemplate<typename Key, typename Value, typename Compare>\nStaticMapIterator<Key, Value, Compare>\nStaticMap<Key, Value, Compare>::lower_bound(const Key &key) const {\n  int begin = 0;\n  int end = num_nodes_;\n  int middle;\n  int comp_result;\n  while (begin < end) {\n    middle = begin + (end - begin) / 2;\n    comp_result = compare_(key, GetKeyAtIndex(middle));\n    if (comp_result == 0)\n      return IteratorAtIndex(middle);\n    if (comp_result < 0) {\n      end = middle;\n    } else {\n      begin = middle + 1;\n    }\n  }\n  return IteratorAtIndex(begin);\n}\n\ntemplate<typename Key, typename Value, typename Compare>\nStaticMapIterator<Key, Value, Compare>\nStaticMap<Key, Value, Compare>::upper_bound(const Key &key) const {\n  int begin = 0;\n  int end = num_nodes_;\n  int middle;\n  int compare_result;\n  while (begin < end) {\n    middle = begin + (end - begin) / 2;\n    compare_result = compare_(key, GetKeyAtIndex(middle));\n    if (compare_result == 0)\n      return IteratorAtIndex(middle + 1);\n    if (compare_result < 0) {\n      end = middle;\n    } else {\n      begin = middle + 1;\n    }\n  }\n  return IteratorAtIndex(begin);\n}\n\ntemplate<typename Key, typename Value, typename Compare>\nbool StaticMap<Key, Value, Compare>::ValidateInMemoryStructure() const {\n  // check the number of nodes is non-negative:\n  if (!raw_data_) return false;\n  int32_t num_nodes = *(reinterpret_cast<const int32_t*>(raw_data_));\n  if (num_nodes < 0) {\n    BPLOG(INFO) << \"StaticMap check failed: negative number of nodes\";\n    return false;\n  }\n\n  int node_index = 0;\n  if (num_nodes_) {\n    u_int64_t first_offset = sizeof(int32_t) * (num_nodes_ + 1)\n                           + sizeof(Key) * num_nodes_;\n    // Num_nodes_ is too large.\n    if (first_offset > 0xffffffffUL) {\n      BPLOG(INFO) << \"StaticMap check failed: size exceeds limit\";\n      return false;\n    }\n    if (offsets_[node_index] != static_cast<u_int32_t>(first_offset)) {\n      BPLOG(INFO) << \"StaticMap check failed: first node offset is incorrect\";\n      return false;\n    }\n  }\n\n  for (node_index = 1; node_index < num_nodes_; ++node_index) {\n    // Check offsets[i] is strictly increasing:\n    if (offsets_[node_index] <= offsets_[node_index - 1]) {\n      BPLOG(INFO) << \"StaticMap check failed: node offsets non-increasing\";\n      return false;\n    }\n    // Check Key[i] is strictly increasing as no duplicate keys are allowed.\n    if (compare_(GetKeyAtIndex(node_index),\n                 GetKeyAtIndex(node_index - 1)) <= 0) {\n      BPLOG(INFO) << \"StaticMap check failed: node keys non-increasing\";\n      return false;\n    }\n  }\n  return true;\n}\n\ntemplate<typename Key, typename Value, typename Compare>\nconst Key StaticMap<Key, Value, Compare>::GetKeyAtIndex(int index) const {\n  if (index < 0 || index >= num_nodes_) {\n    BPLOG(ERROR) << \"Key index out of range error\";\n    // Key type is required to be primitive type.  Return 0 if index is invalid.\n    return 0;\n  }\n  return keys_[index];\n}\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_STATIC_MAP_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_map.h",
    "content": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// static_map.h: StaticMap.\n//\n// StaticMap provides lookup interfaces and iterators similar as stl::map's.\n// These lookup operations are purely Read-Only, thus memory\n// allocation & deallocation is mostly avoided (intentionally).\n//\n// The chunk of memory should contain data with pre-defined pattern:\n// **************** header ***************\n// uint32 (4 bytes): number of nodes\n// uint32 (4 bytes): address offset of node1's mapped_value\n// uint32 (4 bytes): address offset of node2's mapped_value\n// ...\n// uint32 (4 bytes): address offset of nodeN's mapped_value\n//\n// ************* Key array ************\n// (X bytes): node1's key\n// (X bytes): node2's key\n// ...\n// (X bytes): nodeN's key\n//\n// ************* Value array **********\n// (? bytes): node1's mapped_value\n// (? bytes): node2's mapped_value\n// ...\n// (? bytes): nodeN's mapped_value\n//\n// REQUIREMENT: Key type MUST be primitive type or pointers so that:\n// X = sizeof(typename Key);\n//\n// Note: since address offset is stored as uint32, user should keep in mind that\n// StaticMap only supports up to 4GB size of memory data.\n\n// Author: Siyang Xie (lambxsy@google.com)\n\n\n#ifndef PROCESSOR_STATIC_MAP_H__\n#define PROCESSOR_STATIC_MAP_H__\n\n#include \"processor/static_map_iterator-inl.h\"\n\nnamespace google_breakpad {\n\n// Default functor to compare keys.\ntemplate<typename Key>\nclass DefaultCompare {\n public:\n  int operator()(const Key &k1, const Key &k2) const {\n    if (k1 < k2) return -1;\n    if (k1 == k2) return 0;\n    return 1;\n  }\n};\n\ntemplate<typename Key, typename Value, typename Compare = DefaultCompare<Key> >\nclass StaticMap {\n public:\n  typedef StaticMapIterator<Key, Value, Compare> iterator;\n  typedef StaticMapIterator<Key, Value, Compare> const_iterator;\n\n  StaticMap() : raw_data_(0),\n                num_nodes_(0),\n                offsets_(0),\n                compare_() { }\n\n  explicit StaticMap(const char* raw_data);\n\n  inline bool empty() const { return num_nodes_ == 0; }\n  inline unsigned int size() const { return num_nodes_; }\n\n  // Return iterators.\n  inline iterator begin() const { return IteratorAtIndex(0); }\n  inline iterator last() const { return IteratorAtIndex(num_nodes_ - 1); }\n  inline iterator end() const { return IteratorAtIndex(num_nodes_); }\n  inline iterator IteratorAtIndex(int index) const {\n    return iterator(raw_data_, index);\n  }\n\n  // Lookup operations.\n  iterator find(const Key &k) const;\n\n  // lower_bound(k) searches in a sorted range for the first element that has a\n  // key not less than the argument k.\n  iterator lower_bound(const Key &k) const;\n\n  // upper_bound(k) searches in a sorted range for the first element that has a\n  // key greater than the argument k.\n  iterator upper_bound(const Key &k) const;\n\n  // Checks if the underlying memory data conforms to the predefined pattern:\n  // first check the number of nodes is non-negative,\n  // then check both offsets and keys are strictly increasing (sorted).\n  bool ValidateInMemoryStructure() const;\n\n private:\n  const Key GetKeyAtIndex(int i) const;\n\n  // Start address of a raw memory chunk with serialized data.\n  const char* raw_data_;\n\n  // Number of nodes in the static map.\n  u_int32_t num_nodes_;\n\n  // Array of offset addresses for stored values.\n  // For example:\n  // address_of_i-th_node_value = raw_data_ + offsets_[i]\n  const u_int32_t* offsets_;\n\n  // keys_[i] = key of i_th node\n  const Key* keys_;\n\n  Compare compare_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_STATIC_MAP_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_map_iterator-inl.h",
    "content": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// static_map_iterator-inl.h: StaticMapIterator implementation.\n//\n// See static_map_iterator.h for documentation.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef PROCESSOR_STATIC_MAP_ITERATOR_INL_H__\n#define PROCESSOR_STATIC_MAP_ITERATOR_INL_H__\n\n#include \"processor/static_map_iterator.h\"\n\n#include \"processor/logging.h\"\n\nnamespace google_breakpad {\n\ntemplate<typename Key, typename Value, typename Compare>\nStaticMapIterator<Key, Value, Compare>::StaticMapIterator(const char* base,\n                                                            const int &index):\n      index_(index), base_(base) {\n  // See static_map.h for documentation on\n  // bytes format of serialized StaticMap data.\n  num_nodes_ = *(reinterpret_cast<const int32_t*>(base_));\n  offsets_ = reinterpret_cast<const u_int32_t*>(base_ + sizeof(num_nodes_));\n  keys_ = reinterpret_cast<const Key*>(\n      base_ + (1 + num_nodes_) * sizeof(num_nodes_));\n}\n\n// Increment & Decrement operators:\ntemplate<typename Key, typename Value, typename Compare>\nStaticMapIterator<Key, Value, Compare>&\nStaticMapIterator<Key, Value, Compare>::operator++() {\n  if (!IsValid()) {\n    BPLOG(ERROR) << \"operator++ on invalid iterator\";\n    return *this;\n  }\n  if (++index_ > num_nodes_) index_ = num_nodes_;\n  return *this;\n}\n\ntemplate<typename Key, typename Value, typename Compare>\nStaticMapIterator<Key, Value, Compare>\nStaticMapIterator<Key, Value, Compare>::operator++(int postfix_operator) {\n  if (!IsValid()) {\n    BPLOG(ERROR) << \"operator++ on invalid iterator\";\n    return *this;\n  }\n  StaticMapIterator<Key, Value, Compare> tmp = *this;\n  if (++index_ > num_nodes_) index_ = num_nodes_;\n  return tmp;\n}\n\ntemplate<typename Key, typename Value, typename Compare>\nStaticMapIterator<Key, Value, Compare>&\nStaticMapIterator<Key, Value, Compare>::operator--() {\n  if (!IsValid()) {\n    BPLOG(ERROR) << \"operator++ on invalid iterator\";\n    return *this;\n  }\n\n  if (--index_ < 0) index_ = 0;\n  return *this;\n}\n\ntemplate<typename Key, typename Value, typename Compare>\nStaticMapIterator<Key, Value, Compare>\nStaticMapIterator<Key, Value, Compare>::operator--(int postfix_operator) {\n  if (!IsValid()) {\n    BPLOG(ERROR) << \"operator++ on invalid iterator\";\n    return *this;\n  }\n  StaticMapIterator<Key, Value, Compare> tmp = *this;\n\n  if (--index_ < 0) index_ = 0;\n  return tmp;\n}\n\ntemplate<typename Key, typename Value, typename Compare>\nconst Key* StaticMapIterator<Key, Value, Compare>::GetKeyPtr() const {\n  if (!IsValid()) {\n    BPLOG(ERROR) << \"call GetKeyPtr() on invalid iterator\";\n    return NULL;\n  }\n  return &(keys_[index_]);\n}\n\ntemplate<typename Key, typename Value, typename Compare>\nconst char* StaticMapIterator<Key, Value, Compare>::GetValueRawPtr() const {\n  if (!IsValid()) {\n    BPLOG(ERROR) << \"call GetValuePtr() on invalid iterator\";\n    return NULL;\n  }\n  return base_ + offsets_[index_];\n}\n\ntemplate<typename Key, typename Value, typename Compare>\nbool StaticMapIterator<Key, Value, Compare>::operator==(\n    const StaticMapIterator<Key, Value, Compare>& x) const {\n  return base_ == x.base_ && index_ == x.index_;\n}\n\ntemplate<typename Key, typename Value, typename Compare>\nbool StaticMapIterator<Key, Value, Compare>::operator!=(\n    const StaticMapIterator<Key, Value, Compare>& x) const {\n  // Only need to compare base_ and index_.\n  // Other data members are auxiliary.\n  return base_ != x.base_ || index_ != x.index_;\n}\n\ntemplate<typename Key, typename Value, typename Compare>\nbool StaticMapIterator<Key, Value, Compare>::IsValid() const {\n  if (!base_ || index_ < 0 || index_ > num_nodes_)\n    return false;\n\n  return true;\n}\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_STATIC_MAP_ITERATOR_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_map_iterator.h",
    "content": "// Copyright 2010 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// static_map_iterator.h: StaticMapIterator template class declaration.\n//\n// StaticMapIterator provides increment and decrement operators to iterate\n// through a StaticMap map.  It does not provide *, -> operators, user should\n// use GetKeyPtr(), GetKey(), GetValuePtr() interfaces to retrieve data or\n// pointer to data.  StaticMapIterator is essentially a const_iterator.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n\n#ifndef PROCESSOR_STATIC_MAP_ITERATOR_H__\n#define PROCESSOR_STATIC_MAP_ITERATOR_H__\n\n#include <sys/types.h>\n\nnamespace google_breakpad {\n\n// Forward declaration.\ntemplate<typename Key, typename Value, typename Compare> class StaticMap;\n\n// StaticMapIterator does not support operator*() or operator->(),\n// User should use GetKey(), GetKeyPtr(), GetValuePtr() instead;\ntemplate<typename Key, typename Value, typename Compare>\nclass StaticMapIterator {\n public:\n  // Constructors.\n  StaticMapIterator(): index_(-1), base_(NULL) { }\n\n  // Increment & Decrement operators:\n  StaticMapIterator& operator++();\n  StaticMapIterator operator++(int post_fix_operator);\n\n  StaticMapIterator& operator--();\n  StaticMapIterator operator--(int post_fix_operator);\n\n  // Interface for retrieving data / pointer to data.\n  const Key* GetKeyPtr() const;\n\n  // Run time error will occur if GetKey() is called on an invalid iterator.\n  inline const Key GetKey() const { return *GetKeyPtr(); }\n\n  // return a raw memory pointer that points to the start address of value.\n  const char* GetValueRawPtr() const;\n\n  // return a reinterpret-casted pointer to the value.\n  inline const Value* GetValuePtr() const {\n    return reinterpret_cast<const Value*>(GetValueRawPtr());\n  }\n\n  bool operator==(const StaticMapIterator& x) const;\n  bool operator!=(const StaticMapIterator& x) const;\n\n  // Check if this iterator is valid.\n  // If iterator is invalid, user is forbidden to use ++/-- operator\n  // or interfaces for retrieving data / pointer to data.\n  bool IsValid() const;\n\n private:\n  friend class StaticMap<Key, Value, Compare>;\n\n  // Only StaticMap can call this constructor.\n  explicit StaticMapIterator(const char* base, const int32_t &index);\n\n  // Index of node that the iterator is pointing to.\n  int32_t index_;\n\n  // Beginning address of the serialized map data.\n  const char* base_;\n\n  // Number of nodes in the map.  Use it to identify end() iterator.\n  int32_t num_nodes_;\n\n  // offsets_ is an array of offset addresses of mapped values.\n  // For example:\n  // address_of_i-th_node_value = base_ + offsets_[i]\n  const u_int32_t* offsets_;\n\n  // keys_[i] = key of i_th node.\n  const Key* keys_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_STATIC_MAP_ITERATOR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_map_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// static_map_unittest.cc: Unit tests for StaticMap.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#include <climits>\n#include <map>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"processor/static_map-inl.h\"\n\n\ntypedef int ValueType;\ntypedef int KeyType;\ntypedef google_breakpad::StaticMap< KeyType, ValueType > TestMap;\ntypedef std::map< KeyType, ValueType > StdMap;\n\ntemplate<typename Key, typename Value>\nclass SimpleMapSerializer {\n public:\n  static char* Serialize(const std::map<Key, Value> &stdmap,\n                   unsigned int* size = NULL) {\n    unsigned int size_per_node =\n        sizeof(u_int32_t) + sizeof(Key) + sizeof(Value);\n    unsigned int memsize = sizeof(int32_t) + size_per_node * stdmap.size();\n    if (size) *size = memsize;\n\n    // Allocate memory for serialized data:\n    char* mem = reinterpret_cast<char*>(operator new(memsize));\n    char* address = mem;\n\n    // Writer the number of nodes:\n    new (address) u_int32_t(static_cast<u_int32_t>(stdmap.size()));\n    address += sizeof(u_int32_t);\n\n    // Nodes' offset:\n    u_int32_t* offsets = reinterpret_cast<u_int32_t*>(address);\n    address += sizeof(u_int32_t) * stdmap.size();\n\n    // Keys:\n    Key* keys = reinterpret_cast<Key*>(address);\n    address += sizeof(Key) * stdmap.size();\n\n    // Traversing map:\n    typename std::map<Key, Value>::const_iterator iter = stdmap.begin();\n    for (int index = 0; iter != stdmap.end(); ++iter, ++index) {\n      offsets[index] = static_cast<unsigned int>(address - mem);\n      keys[index] = iter->first;\n      new (address) Value(iter->second);\n      address += sizeof(Value);\n    }\n    return mem;\n  }\n};\n\n\nclass TestInvalidMap : public ::testing::Test {\n protected:\n  void SetUp() {\n    memset(data, 0, kMemorySize);\n  }\n\n  // 40 Bytes memory can hold a StaticMap with up to 3 nodes.\n  static const int kMemorySize = 40;\n  char data[kMemorySize];\n  TestMap test_map;\n};\n\nTEST_F(TestInvalidMap, TestNegativeNumberNodes) {\n  memset(data, 0xff, sizeof(u_int32_t));  // Set the number of nodes = -1\n  test_map = TestMap(data);\n  ASSERT_FALSE(test_map.ValidateInMemoryStructure());\n}\n\nTEST_F(TestInvalidMap, TestWrongOffsets) {\n  u_int32_t* header = reinterpret_cast<u_int32_t*>(data);\n  const u_int32_t kNumNodes = 2;\n  const u_int32_t kHeaderOffset =\n        sizeof(u_int32_t) + kNumNodes * (sizeof(u_int32_t) + sizeof(KeyType));\n\n  header[0] = kNumNodes;\n  header[1] = kHeaderOffset + 3;   // Wrong offset for first node\n  test_map = TestMap(data);\n  ASSERT_FALSE(test_map.ValidateInMemoryStructure());\n\n  header[1] = kHeaderOffset;       // Correct offset for first node\n  header[2] = kHeaderOffset - 1;   // Wrong offset for second node\n  test_map = TestMap(data);\n  ASSERT_FALSE(test_map.ValidateInMemoryStructure());\n}\n\nTEST_F(TestInvalidMap, TestUnSortedKeys) {\n  u_int32_t* header = reinterpret_cast<u_int32_t*>(data);\n  const u_int32_t kNumNodes = 2;\n  const u_int32_t kHeaderOffset =\n      sizeof(u_int32_t) + kNumNodes * (sizeof(u_int32_t) + sizeof(KeyType));\n  header[0] = kNumNodes;\n  header[1] = kHeaderOffset;\n  header[2] = kHeaderOffset + sizeof(ValueType);\n\n  KeyType* keys = reinterpret_cast<KeyType*>(\n      data + (kNumNodes + 1) * sizeof(u_int32_t));\n  // Set keys in non-increasing order.\n  keys[0] = 10;\n  keys[1] = 7;\n  test_map = TestMap(data);\n  ASSERT_FALSE(test_map.ValidateInMemoryStructure());\n}\n\n\nclass TestValidMap : public ::testing::Test {\n protected:\n  void SetUp() {\n    int testcase = 0;\n\n    // Empty map.\n    map_data[testcase] =\n        serializer.Serialize(std_map[testcase], &size[testcase]);\n    test_map[testcase] = TestMap(map_data[testcase]);\n    ++testcase;\n\n    // Single element.\n    std_map[testcase].insert(std::make_pair(2, 8));\n    map_data[testcase] =\n        serializer.Serialize(std_map[testcase], &size[testcase]);\n    test_map[testcase] = TestMap(map_data[testcase]);\n    ++testcase;\n\n    // 100 elements.\n    for (int i = 0; i < 100; ++i)\n          std_map[testcase].insert(std::make_pair(i, 2 * i));\n    map_data[testcase] =\n        serializer.Serialize(std_map[testcase], &size[testcase]);\n    test_map[testcase] = TestMap(map_data[testcase]);\n    ++testcase;\n\n    // 1000 random elements.\n    for (int i = 0; i < 1000; ++i)\n      std_map[testcase].insert(std::make_pair(rand(), rand()));\n    map_data[testcase] =\n        serializer.Serialize(std_map[testcase], &size[testcase]);\n    test_map[testcase] = TestMap(map_data[testcase]);\n\n    // Set correct size of memory allocation for each test case.\n    unsigned int size_per_node =\n        sizeof(u_int32_t) + sizeof(KeyType) + sizeof(ValueType);\n    for (testcase = 0; testcase < kNumberTestCases; ++testcase) {\n      correct_size[testcase] =\n          sizeof(u_int32_t) + std_map[testcase].size() * size_per_node;\n    }\n  }\n\n  void TearDown() {\n    for (int i = 0;i < kNumberTestCases; ++i)\n      delete map_data[i];\n  }\n\n\n  void IteratorTester(int test_case) {\n    // scan through:\n    iter_test = test_map[test_case].begin();\n    iter_std = std_map[test_case].begin();\n\n    for (; iter_test != test_map[test_case].end() &&\n           iter_std != std_map[test_case].end();\n         ++iter_test, ++iter_std) {\n      ASSERT_EQ(iter_test.GetKey(), iter_std->first);\n      ASSERT_EQ(*(iter_test.GetValuePtr()), iter_std->second);\n    }\n    ASSERT_TRUE(iter_test == test_map[test_case].end()\n             && iter_std == std_map[test_case].end());\n\n    // Boundary testcase.\n    if (!std_map[test_case].empty()) {\n      // rear boundary case:\n      iter_test = test_map[test_case].end();\n      iter_std = std_map[test_case].end();\n      --iter_std;\n      --iter_test;\n      ASSERT_EQ(iter_test.GetKey(), iter_std->first);\n      ASSERT_EQ(*(iter_test.GetValuePtr()), iter_std->second);\n\n      ++iter_test;\n      ++iter_std;\n      ASSERT_TRUE(iter_test == test_map[test_case].end());\n\n      --iter_test;\n      --iter_std;\n      ASSERT_TRUE(iter_test != test_map[test_case].end());\n      ASSERT_TRUE(iter_test == test_map[test_case].last());\n      ASSERT_EQ(iter_test.GetKey(), iter_std->first);\n      ASSERT_EQ(*(iter_test.GetValuePtr()), iter_std->second);\n\n      // front boundary case:\n      iter_test = test_map[test_case].begin();\n      --iter_test;\n      ASSERT_TRUE(iter_test == test_map[test_case].begin());\n    }\n  }\n\n  void CompareLookupResult(int test_case) {\n    bool found1 = (iter_test != test_map[test_case].end());\n    bool found2 = (iter_std != std_map[test_case].end());\n    ASSERT_EQ(found1, found2);\n\n    if (found1 && found2) {\n      ASSERT_EQ(iter_test.GetKey(), iter_std->first);\n      ASSERT_EQ(*(iter_test.GetValuePtr()), iter_std->second);\n    }\n  }\n\n  void FindTester(int test_case, const KeyType &key) {\n    iter_test = test_map[test_case].find(key);\n    iter_std = std_map[test_case].find(key);\n    CompareLookupResult(test_case);\n  }\n\n  void LowerBoundTester(int test_case, const KeyType &key) {\n    iter_test = test_map[test_case].lower_bound(key);\n    iter_std = std_map[test_case].lower_bound(key);\n    CompareLookupResult(test_case);\n  }\n\n  void UpperBoundTester(int test_case, const KeyType &key) {\n    iter_test = test_map[test_case].upper_bound(key);\n    iter_std = std_map[test_case].upper_bound(key);\n    CompareLookupResult(test_case);\n  }\n\n  void LookupTester(int test_case) {\n    StdMap::const_iterator iter;\n    // Test find():\n    for (iter = std_map[test_case].begin();\n        iter != std_map[test_case].end();\n        ++iter) {\n      FindTester(test_case, iter->first);\n      FindTester(test_case, iter->first + 1);\n      FindTester(test_case, iter->first - 1);\n    }\n    FindTester(test_case, INT_MIN);\n    FindTester(test_case, INT_MAX);\n    // random test:\n    for (int i = 0; i < rand()%5000 + 5000; ++i)\n      FindTester(test_case, rand());\n\n    // Test lower_bound():\n    for (iter = std_map[test_case].begin();\n        iter != std_map[test_case].end();\n        ++iter) {\n      LowerBoundTester(test_case, iter->first);\n      LowerBoundTester(test_case, iter->first + 1);\n      LowerBoundTester(test_case, iter->first - 1);\n    }\n    LowerBoundTester(test_case, INT_MIN);\n    LowerBoundTester(test_case, INT_MAX);\n    // random test:\n    for (int i = 0; i < rand()%5000 + 5000; ++i)\n      LowerBoundTester(test_case, rand());\n\n    // Test upper_bound():\n    for (iter = std_map[test_case].begin();\n        iter != std_map[test_case].end();\n        ++iter) {\n      UpperBoundTester(test_case, iter->first);\n      UpperBoundTester(test_case, iter->first + 1);\n      UpperBoundTester(test_case, iter->first - 1);\n    }\n    UpperBoundTester(test_case, INT_MIN);\n    UpperBoundTester(test_case, INT_MAX);\n    // random test:\n    for (int i = 0; i < rand()%5000 + 5000; ++i)\n      UpperBoundTester(test_case, rand());\n  }\n\n  static const int kNumberTestCases = 4;\n  StdMap std_map[kNumberTestCases];\n  TestMap test_map[kNumberTestCases];\n  TestMap::const_iterator iter_test;\n  StdMap::const_iterator iter_std;\n  char* map_data[kNumberTestCases];\n  unsigned int size[kNumberTestCases];\n  unsigned int correct_size[kNumberTestCases];\n  SimpleMapSerializer<KeyType, ValueType> serializer;\n};\n\nTEST_F(TestValidMap, TestEmptyMap) {\n  int test_case = 0;\n  // Assert memory size allocated during serialization is correct.\n  ASSERT_EQ(correct_size[test_case], size[test_case]);\n\n  // Sanity check of serialized data:\n  ASSERT_TRUE(test_map[test_case].ValidateInMemoryStructure());\n  ASSERT_EQ(std_map[test_case].empty(), test_map[test_case].empty());\n  ASSERT_EQ(std_map[test_case].size(), test_map[test_case].size());\n\n  // Test Iterator.\n  IteratorTester(test_case);\n\n  // Test lookup operations.\n  LookupTester(test_case);\n}\n\nTEST_F(TestValidMap, TestSingleElement) {\n  int test_case = 1;\n  // Assert memory size allocated during serialization is correct.\n  ASSERT_EQ(correct_size[test_case], size[test_case]);\n\n  // Sanity check of serialized data:\n  ASSERT_TRUE(test_map[test_case].ValidateInMemoryStructure());\n  ASSERT_EQ(std_map[test_case].empty(), test_map[test_case].empty());\n  ASSERT_EQ(std_map[test_case].size(), test_map[test_case].size());\n\n  // Test Iterator.\n  IteratorTester(test_case);\n\n  // Test lookup operations.\n  LookupTester(test_case);\n}\n\nTEST_F(TestValidMap, Test100Elements) {\n  int test_case = 2;\n  // Assert memory size allocated during serialization is correct.\n  ASSERT_EQ(correct_size[test_case], size[test_case]);\n\n  // Sanity check of serialized data:\n  ASSERT_TRUE(test_map[test_case].ValidateInMemoryStructure());\n  ASSERT_EQ(std_map[test_case].empty(), test_map[test_case].empty());\n  ASSERT_EQ(std_map[test_case].size(), test_map[test_case].size());\n\n  // Test Iterator.\n  IteratorTester(test_case);\n\n  // Test lookup operations.\n  LookupTester(test_case);\n}\n\nTEST_F(TestValidMap, Test1000RandomElements) {\n  int test_case = 3;\n  // Assert memory size allocated during serialization is correct.\n  ASSERT_EQ(correct_size[test_case], size[test_case]);\n\n  // Sanity check of serialized data:\n  ASSERT_TRUE(test_map[test_case].ValidateInMemoryStructure());\n  ASSERT_EQ(std_map[test_case].empty(), test_map[test_case].empty());\n  ASSERT_EQ(std_map[test_case].size(), test_map[test_case].size());\n\n  // Test Iterator.\n  IteratorTester(test_case);\n\n  // Test lookup operations.\n  LookupTester(test_case);\n}\n\nint main(int argc, char *argv[]) {\n  ::testing::InitGoogleTest(&argc, argv);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_range_map-inl.h",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// static_range_map-inl.h: StaticRangeMap implementation.\n//\n// See static_range_map.h for documentation.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef PROCESSOR_STATIC_RANGE_MAP_INL_H__\n#define PROCESSOR_STATIC_RANGE_MAP_INL_H__\n\n#include \"processor/static_range_map.h\"\n#include \"processor/logging.h\"\n\nnamespace google_breakpad {\n\ntemplate<typename AddressType, typename EntryType>\nbool StaticRangeMap<AddressType, EntryType>::RetrieveRange(\n    const AddressType &address, const EntryType *&entry,\n    AddressType *entry_base, AddressType *entry_size) const {\n  MapConstIterator iterator = map_.lower_bound(address);\n  if (iterator == map_.end())\n    return false;\n\n  // The map is keyed by the high address of each range, so |address| is\n  // guaranteed to be lower than the range's high address.  If |range| is\n  // not directly preceded by another range, it's possible for address to\n  // be below the range's low address, though.  When that happens, address\n  // references something not within any range, so return false.\n\n  const Range *range = iterator.GetValuePtr();\n\n  // Make sure AddressType and EntryType are copyable basic types\n  // e.g.: integer types, pointers etc\n  if (address < range->base())\n    return false;\n\n  entry = range->entryptr();\n  if (entry_base)\n    *entry_base = range->base();\n  if (entry_size)\n    *entry_size = iterator.GetKey() - range->base() + 1;\n\n  return true;\n}\n\n\ntemplate<typename AddressType, typename EntryType>\nbool StaticRangeMap<AddressType, EntryType>::RetrieveNearestRange(\n    const AddressType &address, const EntryType *&entry,\n    AddressType *entry_base, AddressType *entry_size) const {\n  // If address is within a range, RetrieveRange can handle it.\n  if (RetrieveRange(address, entry, entry_base, entry_size))\n    return true;\n\n  // upper_bound gives the first element whose key is greater than address,\n  // but we want the first element whose key is less than or equal to address.\n  // Decrement the iterator to get there, but not if the upper_bound already\n  // points to the beginning of the map - in that case, address is lower than\n  // the lowest stored key, so return false.\n\n  MapConstIterator iterator = map_.upper_bound(address);\n  if (iterator == map_.begin())\n    return false;\n  --iterator;\n\n  const Range *range = iterator.GetValuePtr();\n  entry = range->entryptr();\n  if (entry_base)\n    *entry_base = range->base();\n  if (entry_size)\n    *entry_size = iterator.GetKey() - range->base() + 1;\n\n  return true;\n}\n\ntemplate<typename AddressType, typename EntryType>\nbool StaticRangeMap<AddressType, EntryType>::RetrieveRangeAtIndex(\n    int index, const EntryType *&entry,\n    AddressType *entry_base, AddressType *entry_size) const {\n\n  if (index >= GetCount()) {\n    BPLOG(ERROR) << \"Index out of range: \" << index << \"/\" << GetCount();\n    return false;\n  }\n\n  MapConstIterator iterator = map_.IteratorAtIndex(index);\n\n  const Range *range = iterator.GetValuePtr();\n\n  entry = range->entryptr();\n  if (entry_base)\n    *entry_base = range->base();\n  if (entry_size)\n    *entry_size = iterator.GetKey() - range->base() + 1;\n\n  return true;\n}\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_STATIC_RANGE_MAP_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_range_map.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// static_range_map.h: StaticRangeMap.\n//\n// StaticRangeMap is similar as RangeMap.  However, StaticRangeMap wraps a\n// StaticMap instead of std::map, and does not support dynamic operations like\n// StoreRange(...).  StaticRangeMap provides same Retrieve*() interfaces as\n// RangeMap.  Please see range_map.h for more documentation.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#ifndef PROCESSOR_STATIC_RANGE_MAP_H__\n#define PROCESSOR_STATIC_RANGE_MAP_H__\n\n\n#include \"processor/static_map-inl.h\"\n\nnamespace google_breakpad {\n\n// AddressType is basic type, e.g.: integer types, pointers etc\n// EntryType could be a complex type, so we retrieve its pointer instead.\ntemplate<typename AddressType, typename EntryType>\nclass StaticRangeMap {\n public:\n  StaticRangeMap(): map_() { }\n  explicit StaticRangeMap(const char *memory): map_(memory) { }\n\n  // Locates the range encompassing the supplied address.  If there is\n  // no such range, returns false.  entry_base and entry_size, if non-NULL,\n  // are set to the base and size of the entry's range.\n  bool RetrieveRange(const AddressType &address, const EntryType *&entry,\n                     AddressType *entry_base, AddressType *entry_size) const;\n\n  // Locates the range encompassing the supplied address, if one exists.\n  // If no range encompasses the supplied address, locates the nearest range\n  // to the supplied address that is lower than the address.  Returns false\n  // if no range meets these criteria.  entry_base and entry_size, if\n  // non-NULL, are set to the base and size of the entry's range.\n  bool RetrieveNearestRange(const AddressType &address, const EntryType *&entry,\n                            AddressType *entry_base, AddressType *entry_size)\n                            const;\n\n  // Treating all ranges as a list ordered by the address spaces that they\n  // occupy, locates the range at the index specified by index.  Returns\n  // false if index is larger than the number of ranges stored.  entry_base\n  // and entry_size, if non-NULL, are set to the base and size of the entry's\n  // range.\n  //\n  // RetrieveRangeAtIndex is not optimized for speedy operation.\n  bool RetrieveRangeAtIndex(int index, const EntryType *&entry,\n                            AddressType *entry_base, AddressType *entry_size)\n                            const;\n\n  // Returns the number of ranges stored in the RangeMap.\n  inline unsigned int GetCount() const { return map_.size(); }\n\n private:\n  friend class ModuleComparer;\n  class Range {\n   public:\n    AddressType base() const {\n      return *(reinterpret_cast<const AddressType*>(this));\n    }\n    const EntryType* entryptr() const {\n      return reinterpret_cast<const EntryType*>(this + sizeof(AddressType));\n    }\n  };\n\n  // Convenience types.\n  typedef StaticRangeMap* SelfPtr;\n  typedef StaticMap<AddressType, Range> AddressToRangeMap;\n  typedef typename AddressToRangeMap::const_iterator MapConstIterator;\n\n  AddressToRangeMap map_;\n};\n\n}  // namespace google_breakpad\n\n#endif  // PROCESSOR_STATIC_RANGE_MAP_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/static_range_map_unittest.cc",
    "content": "// Copyright (c) 2010 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// static_range_map_unittest.cc: Unit tests for StaticRangeMap.\n//\n// Author: Siyang Xie (lambxsy@google.com)\n\n#include \"breakpad_googletest_includes.h\"\n#include \"processor/range_map-inl.h\"\n#include \"processor/static_range_map-inl.h\"\n#include \"processor/simple_serializer-inl.h\"\n#include \"processor/map_serializers-inl.h\"\n\n#include \"processor/logging.h\"\n#include \"processor/scoped_ptr.h\"\n\nnamespace {\n// Types used for testing.\ntypedef int AddressType;\ntypedef int EntryType;\ntypedef google_breakpad::StaticRangeMap< AddressType, EntryType > TestMap;\ntypedef google_breakpad::RangeMap< AddressType, EntryType > RMap;\n\n// RangeTest contains data to use for store and retrieve tests.  See\n// RunTests for descriptions of the tests.\nstruct RangeTest {\n  // Base address to use for test\n  AddressType address;\n\n  // Size of range to use for test\n  AddressType size;\n\n  // Unique ID of range - unstorable ranges must have unique IDs too\n  EntryType id;\n\n  // Whether this range is expected to be stored successfully or not\n  bool expect_storable;\n};\n\n// A RangeTestSet encompasses multiple RangeTests, which are run in\n// sequence on the same RangeMap.\nstruct RangeTestSet {\n  // An array of RangeTests\n  const RangeTest* range_tests;\n\n  // The number of tests in the set\n  unsigned int range_test_count;\n};\n\n// These tests will be run sequentially.  The first set of tests exercises\n// most functions of RangeTest, and verifies all of the bounds-checking.\nconst RangeTest range_tests_0[] = {\n  { INT_MIN,     16,      1,  true },   // lowest possible range\n  { -2,          5,       2,  true },   // a range through zero\n  { INT_MAX - 9, 11,      3,  false },  // tests anti-overflow\n  { INT_MAX - 9, 10,      4,  true },   // highest possible range\n  { 5,           0,       5,  false },  // tests anti-zero-size\n  { 5,           1,       6,  true },   // smallest possible range\n  { -20,         15,      7,  true },   // entirely negative\n\n  { 10,          10,      10, true },   // causes the following tests to fail\n  { 9,           10,      11, false },  // one-less base, one-less high\n  { 9,           11,      12, false },  // one-less base, identical high\n  { 9,           12,      13, false },  // completely contains existing\n  { 10,          9,       14, false },  // identical base, one-less high\n  { 10,          10,      15, false },  // exactly identical to existing range\n  { 10,          11,      16, false },  // identical base, one-greater high\n  { 11,          8,       17, false },  // contained completely within\n  { 11,          9,       18, false },  // one-greater base, identical high\n  { 11,          10,      19, false },  // one-greater base, one-greater high\n  { 9,           2,       20, false },  // overlaps bottom by one\n  { 10,          1,       21, false },  // overlaps bottom by one, contained\n  { 19,          1,       22, false },  // overlaps top by one, contained\n  { 19,          2,       23, false },  // overlaps top by one\n\n  { 9,           1,       24, true },   // directly below without overlap\n  { 20,          1,       25, true },   // directly above without overlap\n\n  { 6,           3,       26, true },   // exactly between two ranges, gapless\n  { 7,           3,       27, false },  // tries to span two ranges\n  { 7,           5,       28, false },  // tries to span three ranges\n  { 4,           20,      29, false },  // tries to contain several ranges\n\n  { 30,          50,      30, true },\n  { 90,          25,      31, true },\n  { 35,          65,      32, false },  // tries to span two noncontiguous\n  { 120,         10000,   33, true },   // > 8-bit\n  { 20000,       20000,   34, true },   // > 8-bit\n  { 0x10001,     0x10001, 35, true },   // > 16-bit\n\n  { 27,          -1,      36, false }   // tests high < base\n};\n\n// Attempt to fill the entire space.  The entire space must be filled with\n// three stores because AddressType is signed for these tests, so RangeMap\n// treats the size as signed and rejects sizes that appear to be negative.\n// Even if these tests were run as unsigned, two stores would be needed\n// to fill the space because the entire size of the space could only be\n// described by using one more bit than would be present in AddressType.\nconst RangeTest range_tests_1[] = {\n  { INT_MIN, INT_MAX, 50, true },   // From INT_MIN to -2, inclusive\n  { -1,      2,       51, true },   // From -1 to 0, inclusive\n  { 1,       INT_MAX, 52, true },   // From 1 to INT_MAX, inclusive\n  { INT_MIN, INT_MAX, 53, false },  // Can't fill the space twice\n  { -1,      2,       54, false },\n  { 1,       INT_MAX, 55, false },\n  { -3,      6,       56, false },  // -3 to 2, inclusive - spans 3 ranges\n};\n\n// A light round of testing to verify that RetrieveRange does the right\n// the right thing at the extremities of the range when nothing is stored\n// there.  Checks are forced without storing anything at the extremities\n// by setting size = 0.\nconst RangeTest range_tests_2[] = {\n  { INT_MIN, 0, 100, false },  // makes RetrieveRange check low end\n  { -1,      3, 101, true },\n  { INT_MAX, 0, 102, false },  // makes RetrieveRange check high end\n};\n\n// Similar to the previous test set, but with a couple of ranges closer\n// to the extremities.\nconst RangeTest range_tests_3[] = {\n  { INT_MIN + 1, 1, 110, true },\n  { INT_MAX - 1, 1, 111, true },\n  { INT_MIN,     0, 112, false },  // makes RetrieveRange check low end\n  { INT_MAX,     0, 113, false }   // makes RetrieveRange check high end\n};\n\n// The range map is cleared between sets of tests listed here.\nconst RangeTestSet range_test_sets[] = {\n  { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) },\n  { range_tests_1, sizeof(range_tests_1) / sizeof(RangeTest) },\n  { range_tests_2, sizeof(range_tests_2) / sizeof(RangeTest) },\n  { range_tests_3, sizeof(range_tests_3) / sizeof(RangeTest) },\n  { range_tests_0, sizeof(range_tests_0) / sizeof(RangeTest) }   // Run again\n};\n\n}  // namespace\n\nnamespace google_breakpad {\nclass TestStaticRangeMap : public ::testing::Test {\n protected:\n  void SetUp() {\n    kTestCasesCount_ = sizeof(range_test_sets) / sizeof(RangeTestSet);\n  }\n\n  // StoreTest uses the data in a RangeTest and calls StoreRange on the\n  // test RangeMap.  It returns true if the expected result occurred, and\n  // false if something else happened.\n  void StoreTest(RMap* range_map, const RangeTest* range_test);\n\n  // RetrieveTest uses the data in RangeTest and calls RetrieveRange on the\n  // test RangeMap.  If it retrieves the expected value (which can be no\n  // map entry at the specified range,) it returns true, otherwise, it returns\n  // false.  RetrieveTest will check the values around the base address and\n  // the high address of a range to guard against off-by-one errors.\n  void RetrieveTest(TestMap* range_map, const RangeTest* range_test);\n\n  // Test RetrieveRangeAtIndex, which is supposed to return objects in order\n  // according to their addresses.  This test is performed by looping through\n  // the map, calling RetrieveRangeAtIndex for all possible indices in sequence,\n  // and verifying that each call returns a different object than the previous\n  // call, and that ranges are returned with increasing base addresses.  Returns\n  // false if the test fails.\n  void RetrieveIndexTest(const TestMap* range_map, int set);\n\n  void RunTestCase(int test_case);\n\n  unsigned int kTestCasesCount_;\n  RangeMapSerializer<AddressType, EntryType> serializer_;\n};\n\nvoid TestStaticRangeMap::StoreTest(RMap* range_map,\n                                   const RangeTest* range_test) {\n  bool stored = range_map->StoreRange(range_test->address,\n                                      range_test->size,\n                                      range_test->id);\n  EXPECT_EQ(stored, range_test->expect_storable)\n      << \"StoreRange id \" << range_test->id << \"FAILED\";\n}\n\nvoid TestStaticRangeMap::RetrieveTest(TestMap* range_map,\n                                      const RangeTest* range_test) {\n  for (unsigned int side = 0; side <= 1; ++side) {\n    // When side == 0, check the low side (base address) of each range.\n    // When side == 1, check the high side (base + size) of each range.\n\n    // Check one-less and one-greater than the target address in addition\n    // to the target address itself.\n\n    // If the size of the range is only 1, don't check one greater than\n    // the base or one less than the high - for a successfully stored\n    // range, these tests would erroneously fail because the range is too\n    // small.\n    AddressType low_offset = -1;\n    AddressType high_offset = 1;\n    if (range_test->size == 1) {\n      if (!side)          // When checking the low side,\n        high_offset = 0;  // don't check one over the target.\n      else                // When checking the high side,\n        low_offset = 0;   // don't check one under the target.\n    }\n\n    for (AddressType offset = low_offset; offset <= high_offset; ++offset) {\n      AddressType address =\n          offset +\n          (!side ? range_test->address :\n                   range_test->address + range_test->size - 1);\n\n      bool expected_result = false;  // This is correct for tests not stored.\n      if (range_test->expect_storable) {\n        if (offset == 0)             // When checking the target address,\n          expected_result = true;    // test should always succeed.\n        else if (offset == -1)       // When checking one below the target,\n          expected_result = side;    // should fail low and succeed high.\n        else                         // When checking one above the target,\n          expected_result = !side;   // should succeed low and fail high.\n      }\n\n      const EntryType* id;\n      AddressType retrieved_base;\n      AddressType retrieved_size;\n      bool retrieved = range_map->RetrieveRange(address, id,\n                                                &retrieved_base,\n                                                &retrieved_size);\n\n      bool observed_result = retrieved && *id == range_test->id;\n      EXPECT_EQ(observed_result, expected_result)\n          << \"RetrieveRange id \" << range_test->id\n          << \", side \" << side << \", offset \" << offset << \" FAILED.\";\n\n      // If a range was successfully retrieved, check that the returned\n      // bounds match the range as stored.\n      if (observed_result == true) {\n        EXPECT_EQ(retrieved_base, range_test->address)\n            << \"RetrieveRange id \" << range_test->id\n            << \", side \" << side << \", offset \" << offset << \" FAILED.\";\n        EXPECT_EQ(retrieved_size, range_test->size)\n            << \"RetrieveRange id \" << range_test->id\n            << \", side \" << side << \", offset \" << offset << \" FAILED.\";\n      }\n\n      // Now, check RetrieveNearestRange.  The nearest range is always\n      // expected to be different from the test range when checking one\n      // less than the low side.\n      bool expected_nearest = range_test->expect_storable;\n      if (!side && offset < 0)\n        expected_nearest = false;\n\n      AddressType nearest_base;\n      AddressType nearest_size;\n      bool retrieved_nearest = range_map->RetrieveNearestRange(address,\n                                                               id,\n                                                               &nearest_base,\n                                                               &nearest_size);\n\n      // When checking one greater than the high side, RetrieveNearestRange\n      // should usually return the test range.  When a different range begins\n      // at that address, though, then RetrieveNearestRange should return the\n      // range at the address instead of the test range.\n      if (side && offset > 0 && nearest_base == address) {\n        expected_nearest = false;\n      }\n\n      bool observed_nearest = retrieved_nearest &&\n                              *id == range_test->id;\n\n      EXPECT_EQ(observed_nearest, expected_nearest)\n          << \"RetrieveRange id \" << range_test->id\n          << \", side \" << side << \", offset \" << offset << \" FAILED.\";\n\n      // If a range was successfully retrieved, check that the returned\n      // bounds match the range as stored.\n      if (expected_nearest ==true) {\n        EXPECT_EQ(nearest_base, range_test->address)\n            << \"RetrieveRange id \" << range_test->id\n            << \", side \" << side << \", offset \" << offset << \" FAILED.\";\n        EXPECT_EQ(nearest_size, range_test->size)\n            << \"RetrieveRange id \" << range_test->id\n            << \", side \" << side << \", offset \" << offset << \" FAILED.\";\n      }\n    }\n  }\n}\n\nvoid TestStaticRangeMap::RetrieveIndexTest(const TestMap* range_map, int set) {\n  AddressType last_base = 0;\n  const EntryType* last_entry = 0;\n  const EntryType* entry;\n  int object_count = range_map->GetCount();\n  for (int object_index = 0; object_index < object_count; ++object_index) {\n    AddressType base;\n    ASSERT_TRUE(range_map->RetrieveRangeAtIndex(object_index,\n                                                entry,\n                                                &base,\n                                                NULL))\n        << \"FAILED: RetrieveRangeAtIndex set \" << set\n        << \" index \" << object_index;\n\n    ASSERT_TRUE(entry) << \"FAILED: RetrieveRangeAtIndex set \" << set\n                           << \" index \" << object_index;\n\n    // It's impossible to do these comparisons unless there's a previous\n    // object to compare against.\n    if (last_entry) {\n      // The object must be different from the last_entry one.\n      EXPECT_NE(*entry, *last_entry) << \"FAILED: RetrieveRangeAtIndex set \"\n                                     << set << \" index \" << object_index;\n      // Each object must have a base greater than the previous object's base.\n      EXPECT_GT(base, last_base) << \"FAILED: RetrieveRangeAtIndex set \" << set\n                                 << \" index \" << object_index;\n    }\n    last_entry = entry;\n    last_base = base;\n  }\n\n  // Make sure that RetrieveRangeAtIndex doesn't allow lookups at indices that\n  // are too high.\n  ASSERT_FALSE(range_map->RetrieveRangeAtIndex(\n      object_count, entry, NULL, NULL)) << \"FAILED: RetrieveRangeAtIndex set \"\n                                        << set << \" index \" << object_count\n                                        << \" (too large)\";\n}\n\n// RunTests runs a series of test sets.\nvoid TestStaticRangeMap::RunTestCase(int test_case) {\n  // Maintain the range map in a pointer so that deletion can be meaningfully\n  // tested.\n  scoped_ptr<RMap> rmap(new RMap());\n\n  const RangeTest* range_tests = range_test_sets[test_case].range_tests;\n  unsigned int range_test_count = range_test_sets[test_case].range_test_count;\n\n  // Run the StoreRange test, which validates StoreRange and initializes\n  // the RangeMap with data for the RetrieveRange test.\n  int stored_count = 0;  // The number of ranges successfully stored\n  for (unsigned int range_test_index = 0;\n       range_test_index < range_test_count;\n       ++range_test_index) {\n    const RangeTest* range_test = &range_tests[range_test_index];\n    StoreTest(rmap.get(), range_test);\n\n    if (range_test->expect_storable)\n      ++stored_count;\n  }\n\n  scoped_array<char> memaddr(serializer_.Serialize(*rmap, NULL));\n  scoped_ptr<TestMap> static_range_map(new TestMap(memaddr.get()));\n\n  // The RangeMap's own count of objects should also match.\n  EXPECT_EQ(static_range_map->GetCount(), stored_count);\n\n  // Run the RetrieveRange test\n  for (unsigned int range_test_index = 0;\n       range_test_index < range_test_count;\n       ++range_test_index) {\n    const RangeTest* range_test = &range_tests[range_test_index];\n    RetrieveTest(static_range_map.get(), range_test);\n  }\n\n  RetrieveIndexTest(static_range_map.get(), test_case);\n}\n\nTEST_F(TestStaticRangeMap, TestCase0) {\n  int test_case = 0;\n  RunTestCase(test_case);\n}\n\nTEST_F(TestStaticRangeMap, TestCase1) {\n  int test_case = 1;\n  RunTestCase(test_case);\n}\n\nTEST_F(TestStaticRangeMap, TestCase2) {\n  int test_case = 2;\n  RunTestCase(test_case);\n}\n\nTEST_F(TestStaticRangeMap, TestCase3) {\n  int test_case = 3;\n  RunTestCase(test_case);\n}\n\nTEST_F(TestStaticRangeMap, RunTestCase0Again) {\n  int test_case = 0;\n  RunTestCase(test_case);\n}\n\n}  // namespace google_breakpad\n\nint main(int argc, char *argv[]) {\n  ::testing::InitGoogleTest(&argc, argv);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/synth_minidump.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// synth_minidump.cc: Implementation of SynthMinidump.  See synth_minidump.h\n\n#include \"processor/synth_minidump.h\"\n\nnamespace google_breakpad {\n\nnamespace SynthMinidump {\n\nSection::Section(const Dump &dump)\n  : test_assembler::Section(dump.endianness()) { }\n\nvoid Section::CiteLocationIn(test_assembler::Section *section) const {\n  if (this)\n    (*section).D32(size_).D32(file_offset_);\n  else\n    (*section).D32(0).D32(0);\n}\n\nvoid Stream::CiteStreamIn(test_assembler::Section *section) const {\n  section->D32(type_);\n  CiteLocationIn(section);\n}\n\nSystemInfo::SystemInfo(const Dump &dump,\n                       const MDRawSystemInfo &system_info,\n                       const String &csd_version)\n    : Stream(dump, MD_SYSTEM_INFO_STREAM) {\n  D16(system_info.processor_architecture);\n  D16(system_info.processor_level);\n  D16(system_info.processor_revision);\n  D8(system_info.number_of_processors);\n  D8(system_info.product_type);\n  D32(system_info.major_version);\n  D32(system_info.minor_version);\n  D32(system_info.build_number);\n  D32(system_info.platform_id);\n  csd_version.CiteStringIn(this);\n  D16(system_info.suite_mask);\n  D16(system_info.reserved2);           // Well, why not?\n\n  // MDCPUInformation cpu;\n  if (system_info.processor_architecture == MD_CPU_ARCHITECTURE_X86) {\n    D32(system_info.cpu.x86_cpu_info.vendor_id[0]);\n    D32(system_info.cpu.x86_cpu_info.vendor_id[1]);\n    D32(system_info.cpu.x86_cpu_info.vendor_id[2]);\n    D32(system_info.cpu.x86_cpu_info.version_information);\n    D32(system_info.cpu.x86_cpu_info.feature_information);\n    D32(system_info.cpu.x86_cpu_info.amd_extended_cpu_features);\n  } else {\n    D64(system_info.cpu.other_cpu_info.processor_features[0]);\n    D64(system_info.cpu.other_cpu_info.processor_features[1]);\n  }\n}\n\nconst MDRawSystemInfo SystemInfo::windows_x86 = {\n  MD_CPU_ARCHITECTURE_X86,              // processor_architecture\n  6,                                    // processor_level\n  0xd08,                                // processor_revision\n  1,                                    // number_of_processors\n  1,                                    // product_type\n  5,                                    // major_version\n  1,                                    // minor_version\n  2600,                                 // build_number\n  2,                                    // platform_id\n  0xdeadbeef,                           // csd_version_rva\n  0x100,                                // suite_mask\n  0,                                    // reserved2\n  {                                     // cpu\n    { // x86_cpu_info\n      { 0x756e6547, 0x49656e69, 0x6c65746e }, // vendor_id\n      0x6d8,                                  // version_information\n      0xafe9fbff,                             // feature_information\n      0xffffffff                              // amd_extended_cpu_features\n    }\n  }\n};\n\nconst string SystemInfo::windows_x86_csd_version = \"Service Pack 2\";\n\nString::String(const Dump &dump, const string &contents) : Section(dump) {\n  D32(contents.size() * 2);\n  for (string::const_iterator i = contents.begin(); i != contents.end(); i++)\n    D16(*i);\n}\n\nvoid String::CiteStringIn(test_assembler::Section *section) const {\n  section->D32(file_offset_);\n}\n\nvoid Memory::CiteMemoryIn(test_assembler::Section *section) const {\n  section->D64(address_);\n  CiteLocationIn(section);\n}\n\nContext::Context(const Dump &dump, const MDRawContextX86 &context)\n  : Section(dump) {\n  // The caller should have properly set the CPU type flag.\n  assert(context.context_flags & MD_CONTEXT_X86);\n  // It doesn't make sense to store x86 registers in big-endian form.\n  assert(dump.endianness() == kLittleEndian);\n  D32(context.context_flags);\n  D32(context.dr0);\n  D32(context.dr1);\n  D32(context.dr2);\n  D32(context.dr3);\n  D32(context.dr6);\n  D32(context.dr7);\n  D32(context.float_save.control_word);\n  D32(context.float_save.status_word);\n  D32(context.float_save.tag_word);\n  D32(context.float_save.error_offset);\n  D32(context.float_save.error_selector);\n  D32(context.float_save.data_offset);\n  D32(context.float_save.data_selector);\n  // context.float_save.register_area[] contains 8-bit quantities and\n  // does not need to be swapped.\n  Append(context.float_save.register_area,\n         sizeof(context.float_save.register_area));\n  D32(context.float_save.cr0_npx_state);\n  D32(context.gs);\n  D32(context.fs);\n  D32(context.es);\n  D32(context.ds);\n  D32(context.edi);\n  D32(context.esi);\n  D32(context.ebx);\n  D32(context.edx);\n  D32(context.ecx);\n  D32(context.eax);\n  D32(context.ebp);\n  D32(context.eip);\n  D32(context.cs);\n  D32(context.eflags);\n  D32(context.esp);\n  D32(context.ss);\n  // context.extended_registers[] contains 8-bit quantities and does\n  // not need to be swapped.\n  Append(context.extended_registers, sizeof(context.extended_registers));\n  assert(Size() == sizeof(MDRawContextX86));\n}\n\nContext::Context(const Dump &dump, const MDRawContextARM &context)\n  : Section(dump) {\n  // The caller should have properly set the CPU type flag.\n  assert((context.context_flags & MD_CONTEXT_ARM) ||\n         (context.context_flags & MD_CONTEXT_ARM_OLD));\n  // It doesn't make sense to store ARM registers in big-endian form.\n  assert(dump.endianness() == kLittleEndian);\n  D32(context.context_flags);\n  for (int i = 0; i < MD_CONTEXT_ARM_GPR_COUNT; ++i)\n    D32(context.iregs[i]);\n  D32(context.cpsr);\n  D64(context.float_save.fpscr);\n  for (int i = 0; i < MD_FLOATINGSAVEAREA_ARM_FPR_COUNT; ++i)\n    D64(context.float_save.regs[i]);\n  for (int i = 0; i < MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT; ++i)\n    D32(context.float_save.extra[i]);\n  assert(Size() == sizeof(MDRawContextARM));\n}\n\nThread::Thread(const Dump &dump,\n               u_int32_t thread_id, const Memory &stack, const Context &context,\n               u_int32_t suspend_count, u_int32_t priority_class,\n               u_int32_t priority, u_int64_t teb) : Section(dump) {\n  D32(thread_id);\n  D32(suspend_count);\n  D32(priority_class);\n  D32(priority);\n  D64(teb);\n  stack.CiteMemoryIn(this);\n  context.CiteLocationIn(this);\n  assert(Size() == sizeof(MDRawThread));\n}\n\nModule::Module(const Dump &dump,\n               u_int64_t base_of_image,\n               u_int32_t size_of_image,\n               const String &name,\n               u_int32_t time_date_stamp,\n               u_int32_t checksum,\n               const MDVSFixedFileInfo &version_info,\n               const Section *cv_record,\n               const Section *misc_record) : Section(dump) {\n  D64(base_of_image);\n  D32(size_of_image);\n  D32(checksum);\n  D32(time_date_stamp);\n  name.CiteStringIn(this);\n  D32(version_info.signature);\n  D32(version_info.struct_version);\n  D32(version_info.file_version_hi);\n  D32(version_info.file_version_lo);\n  D32(version_info.product_version_hi);\n  D32(version_info.product_version_lo);\n  D32(version_info.file_flags_mask);\n  D32(version_info.file_flags);\n  D32(version_info.file_os);\n  D32(version_info.file_type);\n  D32(version_info.file_subtype);\n  D32(version_info.file_date_hi);\n  D32(version_info.file_date_lo);\n  cv_record->CiteLocationIn(this);\n  misc_record->CiteLocationIn(this);\n  D64(0).D64(0);\n}\n\nconst MDVSFixedFileInfo Module::stock_version_info = {\n  MD_VSFIXEDFILEINFO_SIGNATURE,         // signature\n  MD_VSFIXEDFILEINFO_VERSION,           // struct_version\n  0x11111111,                           // file_version_hi\n  0x22222222,                           // file_version_lo\n  0x33333333,                           // product_version_hi\n  0x44444444,                           // product_version_lo\n  MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG,  // file_flags_mask\n  MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG,  // file_flags\n  MD_VSFIXEDFILEINFO_FILE_OS_NT | MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS32,\n                                        // file_os\n  MD_VSFIXEDFILEINFO_FILE_TYPE_APP,     // file_type\n  MD_VSFIXEDFILEINFO_FILE_SUBTYPE_UNKNOWN, // file_subtype\n  0,                                    // file_date_hi\n  0                                     // file_date_lo\n};\n\nException::Exception(const Dump &dump,\n                     const Context &context,\n                     u_int32_t thread_id,\n                     u_int32_t exception_code,\n                     u_int32_t exception_flags,\n                     u_int64_t exception_address)\n  : Stream(dump, MD_EXCEPTION_STREAM) {\n  D32(thread_id);\n  D32(0);  // __align\n  D32(exception_code);\n  D32(exception_flags);\n  D64(0);  // exception_record\n  D64(exception_address);\n  D32(0);  // number_parameters\n  D32(0);  // __align\n  for (int i = 0; i < MD_EXCEPTION_MAXIMUM_PARAMETERS; ++i)\n    D64(0);  // exception_information\n  context.CiteLocationIn(this);\n  assert(Size() == sizeof(MDRawExceptionStream));\n}\n\nDump::Dump(u_int64_t flags,\n           Endianness endianness,\n           u_int32_t version,\n           u_int32_t date_time_stamp)\n    : test_assembler::Section(endianness),\n      file_start_(0),\n      stream_directory_(*this),\n      stream_count_(0),\n      thread_list_(*this, MD_THREAD_LIST_STREAM),\n      module_list_(*this, MD_MODULE_LIST_STREAM),\n      memory_list_(*this, MD_MEMORY_LIST_STREAM)\n {\n  D32(MD_HEADER_SIGNATURE);\n  D32(version);\n  D32(stream_count_label_);\n  D32(stream_directory_rva_);\n  D32(0);\n  D32(date_time_stamp);\n  D64(flags);\n  assert(Size() == sizeof(MDRawHeader));\n}\n\nDump &Dump::Add(SynthMinidump::Section *section) {\n  section->Finish(file_start_ + Size());\n  Append(*section);\n  return *this;\n}\n\nDump &Dump::Add(Stream *stream) {\n  Add(static_cast<SynthMinidump::Section *>(stream));\n  stream->CiteStreamIn(&stream_directory_);\n  stream_count_++;\n  return *this;\n}\n\nDump &Dump::Add(Memory *memory) {\n  // Add the memory contents themselves to the file.\n  Add(static_cast<SynthMinidump::Section *>(memory));\n\n  // The memory list is a list of MDMemoryDescriptors, not of actual\n  // memory elements. Produce a descriptor, and add that to the list.\n  SynthMinidump::Section descriptor(*this);\n  memory->CiteMemoryIn(&descriptor);\n  memory_list_.Add(&descriptor);\n  return *this;\n}\n\nDump &Dump::Add(Thread *thread) {\n  thread_list_.Add(thread);\n  return *this;\n}\n\nDump &Dump::Add(Module *module) {\n  module_list_.Add(module);\n  return *this;\n}\n\nvoid Dump::Finish() {\n  if (!thread_list_.Empty()) Add(&thread_list_);\n  if (!module_list_.Empty()) Add(&module_list_);\n  if (!memory_list_.Empty()) Add(&memory_list_);\n\n  // Create the stream directory. We don't use\n  // stream_directory_.Finish here, because the stream directory isn't\n  // cited using a location descriptor; rather, the Minidump header\n  // has the stream count and MDRVA.\n  stream_count_label_ = stream_count_;\n  stream_directory_rva_ = file_start_ + Size();\n  Append(static_cast<test_assembler::Section &>(stream_directory_));\n}\n\n} // namespace SynthMinidump\n          \n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/synth_minidump.h",
    "content": "// -*- mode: C++ -*-\n\n// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// synth_minidump.h: Interface to SynthMinidump: fake minidump generator.\n//\n// We treat a minidump file as the concatenation of a bunch of\n// test_assembler::Sections. The file header, stream directory,\n// streams, memory regions, strings, and so on --- each is a Section\n// that eventually gets appended to the minidump. Dump, Memory,\n// Context, Thread, and so on all inherit from test_assembler::Section.\n// For example:\n//\n//    using google_breakpad::test_assembler::kLittleEndian;\n//    using google_breakpad::SynthMinidump::Context;\n//    using google_breakpad::SynthMinidump::Dump;\n//    using google_breakpad::SynthMinidump::Memory;\n//    using google_breakpad::SynthMinidump::Thread;\n//    \n//    Dump minidump(MD_NORMAL, kLittleEndian);\n//    \n//    Memory stack1(minidump, 0x569eb0a9);\n//    ... build contents of stack1 with test_assembler::Section functions ...\n//    \n//    MDRawContextX86 x86_context1;\n//    x86_context1.context_flags = MD_CONTEXT_X86;\n//    x86_context1.eip = 0x7c90eb94;\n//    x86_context1.esp = 0x569eb0a9;\n//    x86_context1.ebp = x86_context1.esp + something appropriate;\n//    Context context1(minidump, x86_context1);\n//    \n//    Thread thread1(minidump, 0xe4a4821d, stack1, context1);\n//    \n//    minidump.Add(&stack1);\n//    minidump.Add(&context1);\n//    minidump.Add(&thread1);\n//    minidump.Finish();\n//    \n//    string contents;\n//    EXPECT_TRUE(minidump.GetContents(&contents));\n//    // contents now holds the bytes of a minidump file\n//\n// Because the test_assembler classes let us write Label references to\n// sections before the Labels' values are known, this gives us\n// flexibility in how we put the dump together: minidump pieces can\n// hold the file offsets of other minidump pieces before the\n// referents' positions have been decided. As long as everything has\n// been placed by the time we call dump.GetContents to obtain the\n// bytes, all the Labels' values will be known, and everything will\n// get patched up appropriately.\n//   \n// The dump.Add(thing) functions append THINGS's contents to the\n// minidump, but they also do two other things:\n//\n// - dump.Add(thing) invokes thing->Finish, which tells *thing the\n//   offset within the file at which it was placed, and allows *thing\n//   to do any final content generation.\n//\n// - If THING is something which should receive an entry in some sort\n//   of list or directory, then dump.Add(THING) automatically creates\n//   the appropriate directory or list entry. Streams must appear in\n//   the stream directory; memory ranges should be listed in the\n//   memory list; threads should be placed in the thread list; and so\n//   on.\n//\n// By convention, Section subclass constructors that take references\n// to other Sections do not take care of 'Add'ing their arguments to\n// the dump. For example, although the Thread constructor takes\n// references to a Memory and a Context, it does not add them to the\n// dump on the caller's behalf. Rather, the caller is responsible for\n// 'Add'ing every section they create. This allows Sections to be\n// cited from more than one place; for example, Memory ranges are\n// cited both from Thread objects (as their stack contents) and by the\n// memory list stream.\n//\n// If you forget to Add some Section, the Dump::GetContents call will\n// fail, as the test_assembler::Labels used to cite the Section's\n// contents from elsewhere will still be undefined.\n#ifndef PROCESSOR_SYNTH_MINIDUMP_H_\n#define PROCESSOR_SYNTH_MINIDUMP_H_\n\n#include <assert.h>\n\n#include <iostream>\n#include <string>\n\n#include \"common/test_assembler.h\"\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n\nnamespace google_breakpad {\n\nnamespace SynthMinidump {\n\nusing std::string;\nusing test_assembler::Endianness;\nusing test_assembler::kBigEndian;\nusing test_assembler::kLittleEndian;\nusing test_assembler::kUnsetEndian;\nusing test_assembler::Label;\n\nclass Dump;\nclass Memory;\nclass String;\n\n// A test_assembler::Section which will be appended to a minidump.\nclass Section: public test_assembler::Section {\n public:\n  explicit Section(const Dump &dump);\n\n  // Append an MDLocationDescriptor referring to this section to SECTION.\n  // If 'this' is NULL, append a descriptor with a zero length and MDRVA.\n  //\n  // (I couldn't find the language in the C++ standard that says that\n  // invoking member functions of a NULL pointer to a class type is\n  // bad, if such language exists. Having this function handle NULL\n  // 'this' is convenient, but if it causes trouble, it's not hard to\n  // do differently.)\n  void CiteLocationIn(test_assembler::Section *section) const;\n\n  // Note that this section's contents are complete, and that it has\n  // been placed in the minidump file at OFFSET. The 'Add' member\n  // functions call the Finish member function of the object being\n  // added for you; if you are 'Add'ing this section, you needn't Finish it.\n  virtual void Finish(const Label &offset) { \n    file_offset_ = offset; size_ = Size();\n  }\n\n protected:\n  // This section's size and offset within the minidump file.\n  Label file_offset_, size_;\n};\n\n// A stream within a minidump file. 'Add'ing a stream to a minidump\n// creates an entry for it in the minidump's stream directory.\nclass Stream: public Section {\n public:\n  // Create a stream of type TYPE.  You can append whatever contents\n  // you like to this stream using the test_assembler::Section methods.\n  Stream(const Dump &dump, u_int32_t type) : Section(dump), type_(type) { }\n\n  // Append an MDRawDirectory referring to this stream to SECTION.\n  void CiteStreamIn(test_assembler::Section *section) const;\n\n private:\n  // The type of this stream.\n  u_int32_t type_;\n};\n\nclass SystemInfo: public Stream {\n public:\n  // Create an MD_SYSTEM_INFO_STREAM stream belonging to DUMP holding\n  // an MDRawSystem info structure initialized with the values from\n  // SYSTEM_INFO, except that the csd_version field is replaced with\n  // the file offset of the string CSD_VERSION, which can be 'Add'ed\n  // to the dump at the desired location.\n  // \n  // Remember that you are still responsible for 'Add'ing CSD_VERSION\n  // to the dump yourself.\n  SystemInfo(const Dump &dump,\n             const MDRawSystemInfo &system_info,\n             const String &csd_version);\n\n  // Stock MDRawSystemInfo information and associated strings, for\n  // writing tests.\n  static const MDRawSystemInfo windows_x86;\n  static const string windows_x86_csd_version;\n};\n\n// An MDString: a string preceded by a 32-bit length.\nclass String: public Section {\n public:\n  String(const Dump &dump, const string &value);\n\n  // Append an MDRVA referring to this string to SECTION.\n  void CiteStringIn(test_assembler::Section *section) const;\n};\n\n// A range of memory contents. 'Add'ing a memory range to a minidump\n// creates n entry for it in the minidump's memory list. By\n// convention, the 'start', 'Here', and 'Mark' member functions refer\n// to memory addresses.\nclass Memory: public Section {\n public:\n  Memory(const Dump &dump, u_int64_t address)\n      : Section(dump), address_(address) { start() = address; }\n\n  // Append an MDMemoryDescriptor referring to this memory range to SECTION.\n  void CiteMemoryIn(test_assembler::Section *section) const;\n\n private:\n  // The process address from which these memory contents were taken.\n  // Shouldn't this be a Label?\n  u_int64_t address_;\n};\n\nclass Context: public Section {\n public:\n  // Create a context belonging to DUMP whose contents are a copy of CONTEXT.\n  Context(const Dump &dump, const MDRawContextX86 &context);\n  Context(const Dump &dump, const MDRawContextARM &context);\n  // Add constructors for other architectures here. Remember to byteswap.\n};\n\nclass Thread: public Section {\n public:\n  // Create a thread belonging to DUMP with the given values, citing\n  // STACK and CONTEXT (which you must Add to the dump separately).\n  Thread(const Dump &dump,\n         u_int32_t thread_id,\n         const Memory &stack,\n         const Context &context,\n         u_int32_t suspend_count = 0,\n         u_int32_t priority_class = 0,\n         u_int32_t priority = 0,\n         u_int64_t teb = 0);\n};\n\nclass Module: public Section {\n public:\n  // Create a module with the given values. Note that CV_RECORD and\n  // MISC_RECORD can be NULL, in which case the corresponding location\n  // descriptior in the minidump will have a length of zero.\n  Module(const Dump &dump,\n         u_int64_t base_of_image,\n         u_int32_t size_of_image,\n         const String &name,\n         u_int32_t time_date_stamp = 1262805309,\n         u_int32_t checksum = 0,\n         const MDVSFixedFileInfo &version_info = Module::stock_version_info,\n         const Section *cv_record = NULL,\n         const Section *misc_record = NULL);\n\n private:\n  // A standard MDVSFixedFileInfo structure to use as a default for\n  // minidumps.  There's no reason to make users write out all this crap\n  // over and over.\n  static const MDVSFixedFileInfo stock_version_info;\n};\n\nclass Exception : public Stream {\npublic:\n  Exception(const Dump &dump,\n            const Context &context,\n            u_int32_t thread_id = 0,\n            u_int32_t exception_code = 0,\n            u_int32_t exception_flags = 0,\n            u_int64_t exception_address = 0);\n};\n\n// A list of entries starting with a 32-bit count, like a memory list\n// or a thread list.\ntemplate<typename Element>\nclass List: public Stream {\n public:\n  List(const Dump &dump, u_int32_t type) : Stream(dump, type), count_(0) {\n    D32(count_label_);\n  }\n\n  // Add ELEMENT to this list.\n  void Add(Element *element) {\n    element->Finish(file_offset_ + Size());\n    Append(*element);\n    count_++;\n  }\n\n  // Return true if this List is empty, false otherwise.\n  bool Empty() { return count_ == 0; }\n\n  // Finish up the contents of this section, mark it as having been\n  // placed at OFFSET.\n  virtual void Finish(const Label &offset) {\n    Stream::Finish(offset);\n    count_label_ = count_;\n  }\n\n private:\n  size_t count_;\n  Label count_label_;\n};\n\nclass Dump: public test_assembler::Section {\n public:\n\n  // Create a test_assembler::Section containing a minidump file whose\n  // header uses the given values. ENDIANNESS determines the\n  // endianness of the signature; we set this section's default\n  // endianness by this.\n  Dump(u_int64_t flags,\n       Endianness endianness = kLittleEndian,\n       u_int32_t version = MD_HEADER_VERSION,\n       u_int32_t date_time_stamp = 1262805309);\n\n  // The following functions call OBJECT->Finish(), and append the\n  // contents of OBJECT to this minidump. They also record OBJECT in\n  // whatever directory or list is appropriate for its type. The\n  // stream directory, memory list, thread list, and module list are\n  // accumulated this way.\n  Dump &Add(SynthMinidump::Section *object); // simply append data\n  Dump &Add(Stream *object); // append, record in stream directory\n  Dump &Add(Memory *object); // append, record in memory list\n  Dump &Add(Thread *object); // append, record in thread list\n  Dump &Add(Module *object); // append, record in module list\n\n  // Complete the construction of the minidump, given the Add calls\n  // we've seen up to this point. After this call, this Dump's\n  // contents are complete, all labels should be defined if everything\n  // Cited has been Added, and you may call GetContents on it.\n  void Finish();\n\n private:\n  // A label representing the start of the minidump file.\n  Label file_start_;\n\n  // The stream directory.  We construct this incrementally from\n  // Add(Stream *) calls.\n  SynthMinidump::Section stream_directory_; // The directory's contents.\n  size_t stream_count_;                 // The number of streams so far.\n  Label stream_count_label_;            // Cited in file header.\n  Label stream_directory_rva_;          // The directory's file offset.\n\n  // This minidump's thread list. We construct this incrementally from\n  // Add(Thread *) calls.\n  List<Thread> thread_list_;\n\n  // This minidump's module list. We construct this incrementally from\n  // Add(Module *) calls.\n  List<Module> module_list_;\n\n  // This minidump's memory list. We construct this incrementally from\n  // Add(Memory *) calls. This is actually a list of MDMemoryDescriptors,\n  // not memory ranges --- thus the odd type.\n  List<SynthMinidump::Section> memory_list_;\n};\n\n} // namespace SynthMinidump\n\n} // namespace google_breakpad\n\n#endif  // PROCESSOR_SYNTH_MINIDUMP_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/synth_minidump_unittest.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>\n\n// synth_minidump_unittest.cc: Unit tests for google_breakpad::SynthMinidump\n// classes.\n\n#include <sstream>\n#include <string>\n\n#include \"breakpad_googletest_includes.h\"\n#include \"google_breakpad/common/minidump_format.h\"\n#include \"processor/synth_minidump.h\"\n#include \"processor/synth_minidump_unittest_data.h\"\n\nusing google_breakpad::SynthMinidump::Context;\nusing google_breakpad::SynthMinidump::Dump;\nusing google_breakpad::SynthMinidump::Exception;\nusing google_breakpad::SynthMinidump::List;\nusing google_breakpad::SynthMinidump::Memory;\nusing google_breakpad::SynthMinidump::Module;\nusing google_breakpad::SynthMinidump::Section;\nusing google_breakpad::SynthMinidump::Stream;\nusing google_breakpad::SynthMinidump::String;\nusing google_breakpad::SynthMinidump::SystemInfo;\nusing google_breakpad::SynthMinidump::Thread;\nusing google_breakpad::test_assembler::kBigEndian;\nusing google_breakpad::test_assembler::kLittleEndian;\nusing google_breakpad::test_assembler::Label;\nusing std::string;\n\nTEST(Section, Simple) {\n  Dump dump(0);\n  Section section(dump);\n  section.L32(0x12345678);\n  section.Finish(0);\n  string contents;\n  ASSERT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"\\x78\\x56\\x34\\x12\", 4), contents);\n}\n\nTEST(Section, CiteLocationIn) {\n  Dump dump(0, kBigEndian);\n  Section section1(dump), section2(dump);\n  section1.Append(\"order\");\n  section2.Append(\"mayhem\");\n  section2.Finish(0x32287ec2);\n  section2.CiteLocationIn(&section1);\n  string contents;\n  ASSERT_TRUE(section1.GetContents(&contents));\n  string expected(\"order\\0\\0\\0\\x06\\x32\\x28\\x7e\\xc2\", 13);\n  EXPECT_EQ(expected, contents);\n}\n\nTEST(Stream, CiteStreamIn) {\n  Dump dump(0, kLittleEndian);\n  Stream stream(dump, 0x40cae2b3);\n  Section section(dump);\n  stream.Append(\"stream contents\");\n  section.Append(\"section contents\");\n  stream.Finish(0x41424344);\n  stream.CiteStreamIn(&section);\n  string contents;\n  ASSERT_TRUE(section.GetContents(&contents));\n  string expected(\"section contents\"\n                  \"\\xb3\\xe2\\xca\\x40\"\n                  \"\\x0f\\0\\0\\0\"\n                  \"\\x44\\x43\\x42\\x41\",\n                  16 + 4 + 4 + 4);\n  EXPECT_EQ(expected, contents);\n}\n\nTEST(Memory, CiteMemoryIn) {\n  Dump dump(0, kBigEndian);\n  Memory memory(dump, 0x76d010874ab019f9ULL);\n  Section section(dump);\n  memory.Append(\"memory contents\");\n  section.Append(\"section contents\");\n  memory.Finish(0x51525354);\n  memory.CiteMemoryIn(&section);\n  string contents;\n  ASSERT_TRUE(section.GetContents(&contents));\n  string expected(\"section contents\"\n                  \"\\x76\\xd0\\x10\\x87\\x4a\\xb0\\x19\\xf9\"\n                  \"\\0\\0\\0\\x0f\"\n                  \"\\x51\\x52\\x53\\x54\",\n                  16 + 8 + 4 + 4);\n  EXPECT_EQ(contents, expected);\n}\n\nTEST(Memory, Here) {\n  Dump dump(0, kBigEndian);\n  Memory memory(dump, 0x89979731eb060ed4ULL);\n  memory.Append(1729, 42);\n  Label l = memory.Here();\n  ASSERT_EQ(0x89979731eb060ed4ULL + 1729, l.Value());\n}\n\nTEST(Context, X86) {\n  Dump dump(0, kLittleEndian);\n  assert(x86_raw_context.context_flags & MD_CONTEXT_X86);\n  Context context(dump, x86_raw_context);\n  string contents;\n  ASSERT_TRUE(context.GetContents(&contents));\n  EXPECT_EQ(sizeof(x86_expected_contents), contents.size());\n  EXPECT_TRUE(memcmp(contents.data(), x86_expected_contents, contents.size())\n              == 0);\n}\n\nTEST(Context, ARM) {\n  Dump dump(0, kLittleEndian);\n  assert(arm_raw_context.context_flags & MD_CONTEXT_ARM);\n  Context context(dump, arm_raw_context);\n  string contents;\n  ASSERT_TRUE(context.GetContents(&contents));\n  EXPECT_EQ(sizeof(arm_expected_contents), contents.size());\n  EXPECT_TRUE(memcmp(contents.data(), arm_expected_contents, contents.size())\n              == 0);\n}\n\nTEST(ContextDeathTest, X86BadFlags) {\n  Dump dump(0, kLittleEndian);\n  MDRawContextX86 raw;\n  raw.context_flags = 0;\n  ASSERT_DEATH(Context context(dump, raw);,\n               \"context\\\\.context_flags & (0x[0-9a-f]+|MD_CONTEXT_X86)\");\n}\n\nTEST(ContextDeathTest, X86BadEndianness) {\n  Dump dump(0, kBigEndian);\n  MDRawContextX86 raw;\n  raw.context_flags = MD_CONTEXT_X86;\n  ASSERT_DEATH(Context context(dump, raw);,\n               \"dump\\\\.endianness\\\\(\\\\) == kLittleEndian\");\n}\n\nTEST(Thread, Simple) {\n  Dump dump(0, kLittleEndian);\n  Context context(dump, x86_raw_context);\n  context.Finish(0x8665da0c);\n  Memory stack(dump, 0xaad55a93cc3c0efcULL);\n  stack.Append(\"stack contents\");\n  stack.Finish(0xe08cdbd1);\n  Thread thread(dump, 0x3d7ec360, stack, context,\n                0x3593f44d, // suspend count\n                0xab352b82, // priority class\n                0x2753d838, // priority\n                0xeb2de4be3f29e3e9ULL); // thread environment block\n  string contents;\n  ASSERT_TRUE(thread.GetContents(&contents));\n  static const u_int8_t expected_bytes[] = {\n    0x60, 0xc3, 0x7e, 0x3d, // thread id\n    0x4d, 0xf4, 0x93, 0x35, // suspend count\n    0x82, 0x2b, 0x35, 0xab, // priority class\n    0x38, 0xd8, 0x53, 0x27, // priority\n    0xe9, 0xe3, 0x29, 0x3f, 0xbe, 0xe4, 0x2d, 0xeb, // thread environment block\n    0xfc, 0x0e, 0x3c, 0xcc, 0x93, 0x5a, 0xd5, 0xaa, // stack address\n    0x0e, 0x00, 0x00, 0x00, // stack size\n    0xd1, 0xdb, 0x8c, 0xe0, // stack MDRVA\n    0xcc, 0x02, 0x00, 0x00, // context size\n    0x0c, 0xda, 0x65, 0x86  // context MDRVA\n  };\n  EXPECT_EQ(sizeof(expected_bytes), contents.size());\n  EXPECT_TRUE(memcmp(contents.data(), expected_bytes, contents.size()) == 0);\n}\n\nTEST(Exception, Simple) {\n  Dump dump(0, kLittleEndian);\n  Context context(dump, x86_raw_context);\n  context.Finish(0x8665da0c);\n  \n  Exception exception(dump, context,\n                      0x1234abcd, // thread id\n                      0xdcba4321, // exception code\n                      0xf0e0d0c0, // exception flags\n                      0x0919a9b9c9d9e9f9ULL); // exception address\n  string contents;\n  ASSERT_TRUE(exception.GetContents(&contents));\n  static const u_int8_t expected_bytes[] = {\n    0xcd, 0xab, 0x34, 0x12, // thread id\n    0x00, 0x00, 0x00, 0x00, // __align\n    0x21, 0x43, 0xba, 0xdc, // exception code\n    0xc0, 0xd0, 0xe0, 0xf0, // exception flags\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception record\n    0xf9, 0xe9, 0xd9, 0xc9, 0xb9, 0xa9, 0x19, 0x09, // exception address\n    0x00, 0x00, 0x00, 0x00, // number parameters\n    0x00, 0x00, 0x00, 0x00, // __align\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // exception_information\n    0xcc, 0x02, 0x00, 0x00, // context size\n    0x0c, 0xda, 0x65, 0x86  // context MDRVA\n  };\n  EXPECT_EQ(sizeof(expected_bytes), contents.size());\n  EXPECT_TRUE(memcmp(contents.data(), expected_bytes, contents.size()) == 0);\n}\n\nTEST(String, Simple) {\n  Dump dump(0, kBigEndian);\n  String s(dump, \"All mimsy were the borogoves\");\n  string contents;\n  ASSERT_TRUE(s.GetContents(&contents));\n  static const char expected[] = \n    \"\\x00\\x00\\x00\\x38\\0A\\0l\\0l\\0 \\0m\\0i\\0m\\0s\\0y\\0 \\0w\\0e\\0r\\0e\"\n    \"\\0 \\0t\\0h\\0e\\0 \\0b\\0o\\0r\\0o\\0g\\0o\\0v\\0e\\0s\";\n  string expected_string(expected, sizeof(expected) - 1);\n  EXPECT_EQ(expected_string, contents);\n}\n\nTEST(String, CiteStringIn) {\n  Dump dump(0, kLittleEndian);\n  String s(dump, \"and the mome wraths outgrabe\");\n  Section section(dump);\n  section.Append(\"initial\");\n  s.CiteStringIn(&section);\n  s.Finish(0xdc2bb469);\n  string contents;\n  ASSERT_TRUE(section.GetContents(&contents));\n  EXPECT_EQ(string(\"initial\\x69\\xb4\\x2b\\xdc\", 7 + 4), contents);\n}\n\nTEST(List, Empty) {\n  Dump dump(0, kBigEndian);\n  List<Section> list(dump, 0x2442779c);\n  EXPECT_TRUE(list.Empty());\n  list.Finish(0x84e09808);\n  string contents;\n  ASSERT_TRUE(list.GetContents(&contents));\n  EXPECT_EQ(string(\"\\0\\0\\0\\0\", 4), contents);\n}\n\nTEST(List, Two) {\n  Dump dump(0, kBigEndian);\n  List<Section> list(dump, 0x26c9f498);\n  Section section1(dump);\n  section1.Append(\"section one contents\");\n  EXPECT_TRUE(list.Empty());\n  list.Add(&section1);\n  EXPECT_FALSE(list.Empty());\n  Section section2(dump);\n  section2.Append(\"section two contents\");\n  list.Add(&section2);\n  list.Finish(0x1e5bb60e);\n  string contents;\n  ASSERT_TRUE(list.GetContents(&contents));\n  EXPECT_EQ(string(\"\\0\\0\\0\\x02section one contentssection two contents\", 44),\n            contents);\n}\n\nTEST(Dump, Header) {\n  Dump dump(0x9f738b33685cc84cULL, kLittleEndian, 0xb3817faf, 0x2c741c0a);\n  dump.Finish();\n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n  ASSERT_EQ(string(\"\\x4d\\x44\\x4d\\x50\"   // signature\n                   \"\\xaf\\x7f\\x81\\xb3\"   // version\n                   \"\\0\\0\\0\\0\"           // stream count\n                   \"\\x20\\0\\0\\0\"         // directory RVA (could be anything)\n                   \"\\0\\0\\0\\0\"           // checksum\n                   \"\\x0a\\x1c\\x74\\x2c\"   // time_date_stamp\n                   \"\\x4c\\xc8\\x5c\\x68\\x33\\x8b\\x73\\x9f\", // flags\n                   32),\n            contents);\n}\n\nTEST(Dump, HeaderBigEndian) {\n  Dump dump(0x206ce3cc6fb8e0f0ULL, kBigEndian, 0x161693e2, 0x35667744);\n  dump.Finish();\n  string contents;\n  ASSERT_TRUE(dump.GetContents(&contents));\n  ASSERT_EQ(string(\"\\x50\\x4d\\x44\\x4d\"   // signature\n                   \"\\x16\\x16\\x93\\xe2\"   // version\n                   \"\\0\\0\\0\\0\"           // stream count\n                   \"\\0\\0\\0\\x20\"         // directory RVA (could be anything)\n                   \"\\0\\0\\0\\0\"           // checksum\n                   \"\\x35\\x66\\x77\\x44\"   // time_date_stamp\n                   \"\\x20\\x6c\\xe3\\xcc\\x6f\\xb8\\xe0\\xf0\", // flags\n                   32),\n            contents);\n}\n\nTEST(Dump, OneSection) {\n  Dump dump(0, kLittleEndian);\n  Section section(dump);\n  section.Append(\"section contents\");\n  dump.Add(&section);\n  dump.Finish();\n  string dump_contents;\n  // Just check for undefined labels; don't worry about the contents.\n  ASSERT_TRUE(dump.GetContents(&dump_contents));\n\n  Section referencing_section(dump);\n  section.CiteLocationIn(&referencing_section);\n  string contents;\n  ASSERT_TRUE(referencing_section.GetContents(&contents));\n  ASSERT_EQ(string(\"\\x10\\0\\0\\0\\x20\\0\\0\\0\", 8), contents);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/synth_minidump_unittest_data.h",
    "content": "// -*- mode: C++ -*-\n\n// Not copyrightable: random test data.\n// synth_minidump_unittest_data.h: verbose test data for SynthMinidump tests.\n\n#ifndef PROCESSOR_SYNTH_MINIDUMP_UNITTEST_DATA_H_\n#define PROCESSOR_SYNTH_MINIDUMP_UNITTEST_DATA_H_\n\n#include \"google_breakpad/common/minidump_format.h\"\n\nstatic const MDRawContextX86 x86_raw_context = {\n  0xded5d71b,                           // context_flags\n  0x9fdb432e,                           // dr0\n  0x26b7a81a,                           // dr1\n  0xcac7e348,                           // dr2\n  0xcf99ec09,                           // dr3\n  0x7dc8c2cd,                           // dr6\n  0x21deb880,                           // dr7\n\n  // float_save\n  {\n    0x8a5d2bb0,                         // control_word\n    0x0286c4c9,                         // status_word\n    0xf1feea21,                         // tag_word\n    0xb2d40576,                         // error_offset\n    0x48146cde,                         // error_selector\n    0x983f9b21,                         // data_offset\n    0x475be12c,                         // data_selector\n\n    // register_area\n    {\n      0xd9, 0x04, 0x20, 0x6b, 0x88, 0x3a, 0x3f, 0xd5,\n      0x59, 0x7a, 0xa9, 0xeb, 0xd0, 0x5c, 0xdf, 0xfe,\n      0xad, 0xdd, 0x4a, 0x8b, 0x10, 0xcc, 0x9a, 0x33,\n      0xcb, 0xb6, 0xf7, 0x86, 0xcd, 0x69, 0x25, 0xae,\n      0x25, 0xe5, 0x7a, 0xa1, 0x8f, 0xb2, 0x84, 0xd9,\n      0xf7, 0x2d, 0x8a, 0xa1, 0x80, 0x81, 0x7f, 0x67,\n      0x07, 0xa8, 0x23, 0xf1, 0x8c, 0xdc, 0xd8, 0x04,\n      0x8b, 0x9d, 0xb1, 0xcd, 0x61, 0x0c, 0x9c, 0x69,\n      0xc7, 0x8d, 0x17, 0xb6, 0xe5, 0x0b, 0x94, 0xf7,\n      0x78, 0x9b, 0x63, 0x49, 0xba, 0xfc, 0x08, 0x4d\n    },\n\n    0x84c53a90,                         // cr0_npx_state\n  },\n\n  0x79f71e76,                           // gs\n  0x8107bd25,                           // fs\n  0x452d2921,                           // es\n  0x87ec2875,                           // ds\n  0xf8bb73f5,                           // edi\n  0xa63ebb88,                           // esi\n  0x95d35ebe,                           // ebx\n  0x17aa2456,                           // edx\n  0x135fa208,                           // ecx\n  0x500615e6,                           // eax\n  0x66d14205,                           // ebp\n  0x000719a5,                           // eip\n  0x477b481b,                           // cs\n  0x8684dfba,                           // eflags\n  0xe33ccddf,                           // esp\n  0xc0e65d33,                           // ss\n\n  // extended_registers\n  {\n    0x68, 0x63, 0xdf, 0x50, 0xf7, 0x3b, 0xe8, 0xe5,\n    0xcb, 0xd6, 0x66, 0x60, 0xe5, 0xa3, 0x58, 0xb3,\n    0x6f, 0x34, 0xca, 0x02, 0x9b, 0x5f, 0xd0, 0x41,\n    0xbd, 0xc5, 0x2d, 0xf8, 0xff, 0x15, 0xa2, 0xd0,\n    0xe3, 0x2b, 0x3b, 0x8a, 0x9f, 0xc3, 0x9e, 0x28,\n    0x0a, 0xc2, 0xac, 0x3b, 0x67, 0x37, 0x01, 0xfd,\n    0xc3, 0xaf, 0x60, 0xf6, 0x2c, 0x4f, 0xa9, 0x52,\n    0x92, 0xe5, 0x28, 0xde, 0x34, 0xb6, 0x2e, 0x44,\n    0x15, 0xa4, 0xb6, 0xe4, 0xc9, 0x1a, 0x14, 0xb9,\n    0x51, 0x33, 0x3c, 0xe0, 0xc7, 0x94, 0xf0, 0xf7,\n    0x78, 0xdd, 0xe5, 0xca, 0xb7, 0xa6, 0xe0, 0x14,\n    0xa6, 0x03, 0xab, 0x77, 0xad, 0xbd, 0xd2, 0x53,\n    0x3d, 0x07, 0xe7, 0xaf, 0x90, 0x44, 0x71, 0xbe,\n    0x0c, 0xdf, 0x2b, 0x97, 0x40, 0x48, 0xd5, 0xf9,\n    0x62, 0x03, 0x91, 0x84, 0xd6, 0xdd, 0x29, 0x97,\n    0x35, 0x02, 0xfb, 0x59, 0x97, 0xb0, 0xec, 0xa9,\n    0x39, 0x6f, 0x81, 0x71, 0x2a, 0xf0, 0xe7, 0x2c,\n    0x4e, 0x93, 0x90, 0xcb, 0x67, 0x69, 0xde, 0xd7,\n    0x68, 0x3b, 0x0f, 0x69, 0xa8, 0xf4, 0xa8, 0x83,\n    0x42, 0x80, 0x47, 0x65, 0x7a, 0xc9, 0x19, 0x5d,\n    0xcb, 0x43, 0xa5, 0xff, 0xf8, 0x9e, 0x62, 0xf4,\n    0xe2, 0x6c, 0xcc, 0x17, 0x55, 0x7c, 0x0d, 0x5c,\n    0x8d, 0x16, 0x01, 0xd7, 0x3a, 0x0c, 0xf4, 0x7f,\n    0x71, 0xdc, 0x48, 0xe9, 0x4b, 0xfe, 0x1a, 0xd0,\n    0x04, 0x15, 0x33, 0xec, 0x78, 0xc6, 0x7e, 0xde,\n    0x7c, 0x23, 0x18, 0x8d, 0x8f, 0xc2, 0x74, 0xc1,\n    0x48, 0xcd, 0x5d, 0xee, 0xee, 0x81, 0x9e, 0x49,\n    0x47, 0x8a, 0xf8, 0x61, 0xa3, 0x9c, 0x81, 0x96,\n    0xbe, 0x2b, 0x5e, 0xbc, 0xcd, 0x34, 0x0a, 0x2a,\n    0x3b, 0x8b, 0x7d, 0xa1, 0xf2, 0x8d, 0xb4, 0x51,\n    0x9e, 0x14, 0x78, 0xa3, 0x58, 0x65, 0x2d, 0xd6,\n    0x50, 0x40, 0x36, 0x32, 0x31, 0xd4, 0x3e, 0xc2,\n    0xe0, 0x87, 0x1c, 0x05, 0x95, 0x80, 0x84, 0x24,\n    0x08, 0x6f, 0x5b, 0xc7, 0xe1, 0x1d, 0xd5, 0xa3,\n    0x94, 0x44, 0xa1, 0x7c, 0xd8, 0x4b, 0x86, 0xd2,\n    0xc6, 0xa9, 0xf3, 0xe2, 0x4d, 0x6e, 0x1f, 0x0e,\n    0xf2, 0xf5, 0x71, 0xf9, 0x71, 0x05, 0x24, 0xc9,\n    0xc1, 0xe8, 0x91, 0x42, 0x61, 0x86, 0x57, 0x68,\n    0xd9, 0xc9, 0x1d, 0xd5, 0x5a, 0xe9, 0xba, 0xe6,\n    0x15, 0x8f, 0x87, 0xbd, 0x62, 0x56, 0xed, 0xda,\n    0xc2, 0xa5, 0xd5, 0x39, 0xac, 0x05, 0x10, 0x14,\n    0x4a, 0xe7, 0xe7, 0x3c, 0x3f, 0xb7, 0xbb, 0xed,\n    0x01, 0x6e, 0xcd, 0xee, 0x81, 0xb4, 0x62, 0xf4,\n    0x62, 0x16, 0xff, 0x20, 0xb4, 0xf0, 0xbc, 0xff,\n    0x7d, 0xd9, 0xcf, 0x95, 0x30, 0x27, 0xe0, 0x2f,\n    0x98, 0x53, 0x80, 0x15, 0x13, 0xef, 0x44, 0x58,\n    0x12, 0x16, 0xdb, 0x11, 0xef, 0x73, 0x51, 0xcd,\n    0x42, 0x3f, 0x98, 0x6c, 0xc9, 0x68, 0xc3, 0xf4,\n    0x5b, 0x0f, 0x5d, 0x77, 0xed, 0xdf, 0x0f, 0xff,\n    0xb8, 0x69, 0x98, 0x50, 0x77, 0x7a, 0xe8, 0x90,\n    0x27, 0x46, 0x10, 0xd2, 0xb5, 0x00, 0x3b, 0x36,\n    0x43, 0x6d, 0x67, 0x41, 0x20, 0x3a, 0x32, 0xe0,\n    0x2e, 0x5a, 0xfb, 0x4e, 0x4f, 0xa4, 0xf7, 0xc2,\n    0xe6, 0x81, 0x1a, 0x51, 0xa8, 0x7c, 0xd4, 0x60,\n    0x7c, 0x45, 0xe2, 0xba, 0x5b, 0x42, 0xf3, 0xbf,\n    0x28, 0xaa, 0xf2, 0x90, 0xe4, 0x94, 0xdd, 0xaa,\n    0x22, 0xd3, 0x71, 0x33, 0xa1, 0x01, 0x43, 0x0e,\n    0xfa, 0x46, 0xd2, 0x6e, 0x55, 0x5e, 0x49, 0xeb,\n    0x94, 0xf0, 0xb0, 0xb1, 0x2e, 0xf2, 0x3d, 0x6c,\n    0x00, 0x5e, 0x01, 0x56, 0x3b, 0xfd, 0x5b, 0xa1,\n    0x2f, 0x63, 0x1d, 0xbf, 0xf9, 0xd8, 0x13, 0xf7,\n    0x4d, 0xb7, 0x1e, 0x3d, 0x98, 0xd2, 0xee, 0xb8,\n    0x48, 0xc8, 0x5b, 0x91, 0x0f, 0x54, 0x9e, 0x26,\n    0xb2, 0xc7, 0x3a, 0x6c, 0x8a, 0x35, 0xe1, 0xba\n  }\n};\n\nstatic const u_int8_t x86_expected_contents[] = {\n  0x1b, 0xd7, 0xd5, 0xde,\n  0x2e, 0x43, 0xdb, 0x9f,\n  0x1a, 0xa8, 0xb7, 0x26,\n  0x48, 0xe3, 0xc7, 0xca,\n  0x09, 0xec, 0x99, 0xcf,\n  0xcd, 0xc2, 0xc8, 0x7d,\n  0x80, 0xb8, 0xde, 0x21,\n  0xb0, 0x2b, 0x5d, 0x8a,\n  0xc9, 0xc4, 0x86, 0x02,\n  0x21, 0xea, 0xfe, 0xf1,\n  0x76, 0x05, 0xd4, 0xb2,\n  0xde, 0x6c, 0x14, 0x48,\n  0x21, 0x9b, 0x3f, 0x98,\n  0x2c, 0xe1, 0x5b, 0x47,\n\n  // float_save.register_area --- unswapped\n  0xd9, 0x04, 0x20, 0x6b, 0x88, 0x3a, 0x3f, 0xd5,\n  0x59, 0x7a, 0xa9, 0xeb, 0xd0, 0x5c, 0xdf, 0xfe,\n  0xad, 0xdd, 0x4a, 0x8b, 0x10, 0xcc, 0x9a, 0x33,\n  0xcb, 0xb6, 0xf7, 0x86, 0xcd, 0x69, 0x25, 0xae,\n  0x25, 0xe5, 0x7a, 0xa1, 0x8f, 0xb2, 0x84, 0xd9,\n  0xf7, 0x2d, 0x8a, 0xa1, 0x80, 0x81, 0x7f, 0x67,\n  0x07, 0xa8, 0x23, 0xf1, 0x8c, 0xdc, 0xd8, 0x04,\n  0x8b, 0x9d, 0xb1, 0xcd, 0x61, 0x0c, 0x9c, 0x69,\n  0xc7, 0x8d, 0x17, 0xb6, 0xe5, 0x0b, 0x94, 0xf7,\n  0x78, 0x9b, 0x63, 0x49, 0xba, 0xfc, 0x08, 0x4d,\n\n  0x90, 0x3a, 0xc5, 0x84,\n  0x76, 0x1e, 0xf7, 0x79,\n  0x25, 0xbd, 0x07, 0x81,\n  0x21, 0x29, 0x2d, 0x45,\n  0x75, 0x28, 0xec, 0x87,\n  0xf5, 0x73, 0xbb, 0xf8,\n  0x88, 0xbb, 0x3e, 0xa6,\n  0xbe, 0x5e, 0xd3, 0x95,\n  0x56, 0x24, 0xaa, 0x17,\n  0x08, 0xa2, 0x5f, 0x13,\n  0xe6, 0x15, 0x06, 0x50,\n  0x05, 0x42, 0xd1, 0x66,\n  0xa5, 0x19, 0x07, 0x00,\n  0x1b, 0x48, 0x7b, 0x47,\n  0xba, 0xdf, 0x84, 0x86,\n  0xdf, 0xcd, 0x3c, 0xe3,\n  0x33, 0x5d, 0xe6, 0xc0,\n\n  // extended_registers --- unswapped\n  0x68, 0x63, 0xdf, 0x50, 0xf7, 0x3b, 0xe8, 0xe5,\n  0xcb, 0xd6, 0x66, 0x60, 0xe5, 0xa3, 0x58, 0xb3,\n  0x6f, 0x34, 0xca, 0x02, 0x9b, 0x5f, 0xd0, 0x41,\n  0xbd, 0xc5, 0x2d, 0xf8, 0xff, 0x15, 0xa2, 0xd0,\n  0xe3, 0x2b, 0x3b, 0x8a, 0x9f, 0xc3, 0x9e, 0x28,\n  0x0a, 0xc2, 0xac, 0x3b, 0x67, 0x37, 0x01, 0xfd,\n  0xc3, 0xaf, 0x60, 0xf6, 0x2c, 0x4f, 0xa9, 0x52,\n  0x92, 0xe5, 0x28, 0xde, 0x34, 0xb6, 0x2e, 0x44,\n  0x15, 0xa4, 0xb6, 0xe4, 0xc9, 0x1a, 0x14, 0xb9,\n  0x51, 0x33, 0x3c, 0xe0, 0xc7, 0x94, 0xf0, 0xf7,\n  0x78, 0xdd, 0xe5, 0xca, 0xb7, 0xa6, 0xe0, 0x14,\n  0xa6, 0x03, 0xab, 0x77, 0xad, 0xbd, 0xd2, 0x53,\n  0x3d, 0x07, 0xe7, 0xaf, 0x90, 0x44, 0x71, 0xbe,\n  0x0c, 0xdf, 0x2b, 0x97, 0x40, 0x48, 0xd5, 0xf9,\n  0x62, 0x03, 0x91, 0x84, 0xd6, 0xdd, 0x29, 0x97,\n  0x35, 0x02, 0xfb, 0x59, 0x97, 0xb0, 0xec, 0xa9,\n  0x39, 0x6f, 0x81, 0x71, 0x2a, 0xf0, 0xe7, 0x2c,\n  0x4e, 0x93, 0x90, 0xcb, 0x67, 0x69, 0xde, 0xd7,\n  0x68, 0x3b, 0x0f, 0x69, 0xa8, 0xf4, 0xa8, 0x83,\n  0x42, 0x80, 0x47, 0x65, 0x7a, 0xc9, 0x19, 0x5d,\n  0xcb, 0x43, 0xa5, 0xff, 0xf8, 0x9e, 0x62, 0xf4,\n  0xe2, 0x6c, 0xcc, 0x17, 0x55, 0x7c, 0x0d, 0x5c,\n  0x8d, 0x16, 0x01, 0xd7, 0x3a, 0x0c, 0xf4, 0x7f,\n  0x71, 0xdc, 0x48, 0xe9, 0x4b, 0xfe, 0x1a, 0xd0,\n  0x04, 0x15, 0x33, 0xec, 0x78, 0xc6, 0x7e, 0xde,\n  0x7c, 0x23, 0x18, 0x8d, 0x8f, 0xc2, 0x74, 0xc1,\n  0x48, 0xcd, 0x5d, 0xee, 0xee, 0x81, 0x9e, 0x49,\n  0x47, 0x8a, 0xf8, 0x61, 0xa3, 0x9c, 0x81, 0x96,\n  0xbe, 0x2b, 0x5e, 0xbc, 0xcd, 0x34, 0x0a, 0x2a,\n  0x3b, 0x8b, 0x7d, 0xa1, 0xf2, 0x8d, 0xb4, 0x51,\n  0x9e, 0x14, 0x78, 0xa3, 0x58, 0x65, 0x2d, 0xd6,\n  0x50, 0x40, 0x36, 0x32, 0x31, 0xd4, 0x3e, 0xc2,\n  0xe0, 0x87, 0x1c, 0x05, 0x95, 0x80, 0x84, 0x24,\n  0x08, 0x6f, 0x5b, 0xc7, 0xe1, 0x1d, 0xd5, 0xa3,\n  0x94, 0x44, 0xa1, 0x7c, 0xd8, 0x4b, 0x86, 0xd2,\n  0xc6, 0xa9, 0xf3, 0xe2, 0x4d, 0x6e, 0x1f, 0x0e,\n  0xf2, 0xf5, 0x71, 0xf9, 0x71, 0x05, 0x24, 0xc9,\n  0xc1, 0xe8, 0x91, 0x42, 0x61, 0x86, 0x57, 0x68,\n  0xd9, 0xc9, 0x1d, 0xd5, 0x5a, 0xe9, 0xba, 0xe6,\n  0x15, 0x8f, 0x87, 0xbd, 0x62, 0x56, 0xed, 0xda,\n  0xc2, 0xa5, 0xd5, 0x39, 0xac, 0x05, 0x10, 0x14,\n  0x4a, 0xe7, 0xe7, 0x3c, 0x3f, 0xb7, 0xbb, 0xed,\n  0x01, 0x6e, 0xcd, 0xee, 0x81, 0xb4, 0x62, 0xf4,\n  0x62, 0x16, 0xff, 0x20, 0xb4, 0xf0, 0xbc, 0xff,\n  0x7d, 0xd9, 0xcf, 0x95, 0x30, 0x27, 0xe0, 0x2f,\n  0x98, 0x53, 0x80, 0x15, 0x13, 0xef, 0x44, 0x58,\n  0x12, 0x16, 0xdb, 0x11, 0xef, 0x73, 0x51, 0xcd,\n  0x42, 0x3f, 0x98, 0x6c, 0xc9, 0x68, 0xc3, 0xf4,\n  0x5b, 0x0f, 0x5d, 0x77, 0xed, 0xdf, 0x0f, 0xff,\n  0xb8, 0x69, 0x98, 0x50, 0x77, 0x7a, 0xe8, 0x90,\n  0x27, 0x46, 0x10, 0xd2, 0xb5, 0x00, 0x3b, 0x36,\n  0x43, 0x6d, 0x67, 0x41, 0x20, 0x3a, 0x32, 0xe0,\n  0x2e, 0x5a, 0xfb, 0x4e, 0x4f, 0xa4, 0xf7, 0xc2,\n  0xe6, 0x81, 0x1a, 0x51, 0xa8, 0x7c, 0xd4, 0x60,\n  0x7c, 0x45, 0xe2, 0xba, 0x5b, 0x42, 0xf3, 0xbf,\n  0x28, 0xaa, 0xf2, 0x90, 0xe4, 0x94, 0xdd, 0xaa,\n  0x22, 0xd3, 0x71, 0x33, 0xa1, 0x01, 0x43, 0x0e,\n  0xfa, 0x46, 0xd2, 0x6e, 0x55, 0x5e, 0x49, 0xeb,\n  0x94, 0xf0, 0xb0, 0xb1, 0x2e, 0xf2, 0x3d, 0x6c,\n  0x00, 0x5e, 0x01, 0x56, 0x3b, 0xfd, 0x5b, 0xa1,\n  0x2f, 0x63, 0x1d, 0xbf, 0xf9, 0xd8, 0x13, 0xf7,\n  0x4d, 0xb7, 0x1e, 0x3d, 0x98, 0xd2, 0xee, 0xb8,\n  0x48, 0xc8, 0x5b, 0x91, 0x0f, 0x54, 0x9e, 0x26,\n  0xb2, 0xc7, 0x3a, 0x6c, 0x8a, 0x35, 0xe1, 0xba\n};\n\nstatic const MDRawContextARM arm_raw_context = {\n  // context_flags\n  0x591b9e6a,\n  // iregs\n  0xa21594de,\n  0x820d8a25,\n  0xc4e133b2,\n  0x173a1c02,\n  0x105fb175,\n  0xe871793f,\n  0x5def70b3,\n  0xcee3a623,\n  0x7b3aa9b8,\n  0x52518537,\n  0x627012c5,\n  0x22723dcc,\n  0x16fcc971,\n  0x20988bcb,\n  0xf1ab806b,\n  0x99d5fc03,\n  // cpsr\n  0xb70df511,\n  // float_save\n  {\n    // fpscr\n    0xa1e1f7ce1077e6b5ULL,\n    // regs\n    0xbcb8d002eed7fbdeULL,\n    0x4dd26a43b96ae97fULL,\n    0x8eec22db8b31741cULL,\n    0xfd634bd7c5ad66a0ULL,\n    0x1681da0daeb3debeULL,\n    0x474a32bdf72d0b71ULL,\n    0xcaf464f8b1044834ULL,\n    0xcaa6592ae5c7582aULL,\n    0x4ee46889d877c3dbULL,\n    0xf8930cf301645cf5ULL,\n    0x4da7e9ebba27f7c7ULL,\n    0x69a7b02761944da3ULL,\n    0x2cda2b2e78195c06ULL,\n    0x66b227ab9b460a42ULL,\n    0x7e77e49e52ee0849ULL,\n    0xd62cd9663e76f255ULL,\n    0xe9370f082451514bULL,\n    0x50a1c674dd1b6029ULL,\n    0x405db4575829eac4ULL,\n    0x67b948764649eee7ULL,\n    0x93731885419229d4ULL,\n    0xdb0338bad72a4ce7ULL,\n    0xa0a451f996fca4c8ULL,\n    0xb4508ea668400a45ULL,\n    0xbff28c5c7a142423ULL,\n    0x4f31b42b96f3a431ULL,\n    0x2ce6789d4ea1ff37ULL,\n    0xfa150b52e4f82a3cULL,\n    0xe9ec40449e6ed4f3ULL,\n    0x5ceca87836fe2251ULL,\n    0x66f50de463ee238cULL,\n    0x42823efcd59ab511ULL,\n    // extra\n    0xe9e14cd2,\n    0x865bb640,\n    0x9f3f0b3e,\n    0x94a71c52,\n    0x3c012f19,\n    0x6436637c,\n    0x46ccedcb,\n    0x7b341be7\n  }\n};\n\nstatic const u_int8_t arm_expected_contents[] = {\n  0x6a, 0x9e, 0x1b, 0x59,\n  0xde, 0x94, 0x15, 0xa2,\n  0x25, 0x8a, 0x0d, 0x82,\n  0xb2, 0x33, 0xe1, 0xc4,\n  0x02, 0x1c, 0x3a, 0x17,\n  0x75, 0xb1, 0x5f, 0x10,\n  0x3f, 0x79, 0x71, 0xe8,\n  0xb3, 0x70, 0xef, 0x5d,\n  0x23, 0xa6, 0xe3, 0xce,\n  0xb8, 0xa9, 0x3a, 0x7b,\n  0x37, 0x85, 0x51, 0x52,\n  0xc5, 0x12, 0x70, 0x62,\n  0xcc, 0x3d, 0x72, 0x22,\n  0x71, 0xc9, 0xfc, 0x16,\n  0xcb, 0x8b, 0x98, 0x20,\n  0x6b, 0x80, 0xab, 0xf1,\n  0x03, 0xfc, 0xd5, 0x99,\n  0x11, 0xf5, 0x0d, 0xb7,\n  0xb5, 0xe6, 0x77, 0x10,\n  0xce, 0xf7, 0xe1, 0xa1,\n  0xde, 0xfb, 0xd7, 0xee,\n  0x02, 0xd0, 0xb8, 0xbc,\n  0x7f, 0xe9, 0x6a, 0xb9,\n  0x43, 0x6a, 0xd2, 0x4d,\n  0x1c, 0x74, 0x31, 0x8b,\n  0xdb, 0x22, 0xec, 0x8e,\n  0xa0, 0x66, 0xad, 0xc5,\n  0xd7, 0x4b, 0x63, 0xfd,\n  0xbe, 0xde, 0xb3, 0xae,\n  0x0d, 0xda, 0x81, 0x16,\n  0x71, 0x0b, 0x2d, 0xf7,\n  0xbd, 0x32, 0x4a, 0x47,\n  0x34, 0x48, 0x04, 0xb1,\n  0xf8, 0x64, 0xf4, 0xca,\n  0x2a, 0x58, 0xc7, 0xe5,\n  0x2a, 0x59, 0xa6, 0xca,\n  0xdb, 0xc3, 0x77, 0xd8,\n  0x89, 0x68, 0xe4, 0x4e,\n  0xf5, 0x5c, 0x64, 0x01,\n  0xf3, 0x0c, 0x93, 0xf8,\n  0xc7, 0xf7, 0x27, 0xba,\n  0xeb, 0xe9, 0xa7, 0x4d,\n  0xa3, 0x4d, 0x94, 0x61,\n  0x27, 0xb0, 0xa7, 0x69,\n  0x06, 0x5c, 0x19, 0x78,\n  0x2e, 0x2b, 0xda, 0x2c,\n  0x42, 0x0a, 0x46, 0x9b,\n  0xab, 0x27, 0xb2, 0x66,\n  0x49, 0x08, 0xee, 0x52,\n  0x9e, 0xe4, 0x77, 0x7e,\n  0x55, 0xf2, 0x76, 0x3e,\n  0x66, 0xd9, 0x2c, 0xd6,\n  0x4b, 0x51, 0x51, 0x24,\n  0x08, 0x0f, 0x37, 0xe9,\n  0x29, 0x60, 0x1b, 0xdd,\n  0x74, 0xc6, 0xa1, 0x50,\n  0xc4, 0xea, 0x29, 0x58,\n  0x57, 0xb4, 0x5d, 0x40,\n  0xe7, 0xee, 0x49, 0x46,\n  0x76, 0x48, 0xb9, 0x67,\n  0xd4, 0x29, 0x92, 0x41,\n  0x85, 0x18, 0x73, 0x93,\n  0xe7, 0x4c, 0x2a, 0xd7,\n  0xba, 0x38, 0x03, 0xdb,\n  0xc8, 0xa4, 0xfc, 0x96,\n  0xf9, 0x51, 0xa4, 0xa0,\n  0x45, 0x0a, 0x40, 0x68,\n  0xa6, 0x8e, 0x50, 0xb4,\n  0x23, 0x24, 0x14, 0x7a,\n  0x5c, 0x8c, 0xf2, 0xbf,\n  0x31, 0xa4, 0xf3, 0x96,\n  0x2b, 0xb4, 0x31, 0x4f,\n  0x37, 0xff, 0xa1, 0x4e,\n  0x9d, 0x78, 0xe6, 0x2c,\n  0x3c, 0x2a, 0xf8, 0xe4,\n  0x52, 0x0b, 0x15, 0xfa,\n  0xf3, 0xd4, 0x6e, 0x9e,\n  0x44, 0x40, 0xec, 0xe9,\n  0x51, 0x22, 0xfe, 0x36,\n  0x78, 0xa8, 0xec, 0x5c,\n  0x8c, 0x23, 0xee, 0x63,\n  0xe4, 0x0d, 0xf5, 0x66,\n  0x11, 0xb5, 0x9a, 0xd5,\n  0xfc, 0x3e, 0x82, 0x42,\n  0xd2, 0x4c, 0xe1, 0xe9,\n  0x40, 0xb6, 0x5b, 0x86,\n  0x3e, 0x0b, 0x3f, 0x9f,\n  0x52, 0x1c, 0xa7, 0x94,\n  0x19, 0x2f, 0x01, 0x3c,\n  0x7c, 0x63, 0x36, 0x64,\n  0xcb, 0xed, 0xcc, 0x46,\n  0xe7, 0x1b, 0x34, 0x7b\n};\n\n#endif // PROCESSOR_SYNTH_MINIDUMP_UNITTEST_DATA_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/testdata/linux_test_app.cc",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Breakpad test application for Linux. When run, it generates one on-demand\n// minidump and then crashes, which should generate an on-crash minidump.\n// dump_syms can be used to extract symbol information for use in processing.\n\n// To build:\n// g++ -g -o linux_test_app -I ../../ -L../../client/linux linux_test_app.cc \\\n//   -lbreakpad\n// Add -m32 to build a 32-bit executable, or -m64 for a 64-bit one\n// (assuming your environment supports it). Replace -g with -gstabs+ to\n// generate an executable with STABS symbols (needs -m32), or -gdwarf-2 for one\n// with DWARF symbols (32- or 64-bit)\n\n#include <stdio.h>\n#include <sys/types.h>\n#include <unistd.h>\n\n#include <string>\n\n#include \"client/linux/handler/exception_handler.h\"\n#include \"third_party/lss/linux_syscall_support.h\"\n\nnamespace {\n\n// google_breakpad::MinidumpCallback to invoke after minidump generation.\nstatic bool callback(const char *dump_path, const char *id,\n                     void *context,\n                     bool succeeded) {\n  if (succeeded) {\n    printf(\"dump guid is %s\\n\", id);\n  } else {\n    printf(\"dump failed\\n\");\n  }\n  fflush(stdout);\n\n  return succeeded;\n}\n\nstatic void CrashFunction() {\n  int *i = reinterpret_cast<int*>(0x45);\n  *i = 5;  // crash!\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  google_breakpad::ExceptionHandler eh(\".\", NULL, callback, NULL, true);\n  if (!eh.WriteMinidump()) {\n    printf(\"Failed to generate on-demand minidump\\n\");\n  }\n  CrashFunction();\n  printf(\"did not crash?\\n\");\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/testdata/minidump2.dump.out",
    "content": "MDRawHeader\n  signature            = 0x504d444d\n  version              = 0x5128a793\n  stream_count         = 9\n  stream_directory_rva = 0x20\n  checksum             = 0x0\n  time_date_stamp      = 0x45d35f73 2007-02-14 19:13:55\n  flags                = 0x0\n\nmDirectory[0]\nMDRawDirectory\n  stream_type        = 3\n  location.data_size = 100\n  location.rva       = 0x184\n\nmDirectory[1]\nMDRawDirectory\n  stream_type        = 4\n  location.data_size = 1408\n  location.rva       = 0x1e8\n\nmDirectory[2]\nMDRawDirectory\n  stream_type        = 5\n  location.data_size = 52\n  location.rva       = 0x1505\n\nmDirectory[3]\nMDRawDirectory\n  stream_type        = 6\n  location.data_size = 168\n  location.rva       = 0xdc\n\nmDirectory[4]\nMDRawDirectory\n  stream_type        = 7\n  location.data_size = 56\n  location.rva       = 0x8c\n\nmDirectory[5]\nMDRawDirectory\n  stream_type        = 15\n  location.data_size = 24\n  location.rva       = 0xc4\n\nmDirectory[6]\nMDRawDirectory\n  stream_type        = 1197932545\n  location.data_size = 12\n  location.rva       = 0x14f9\n\nmDirectory[7]\nMDRawDirectory\n  stream_type        = 0\n  location.data_size = 0\n  location.rva       = 0x0\n\nmDirectory[8]\nMDRawDirectory\n  stream_type        = 0\n  location.data_size = 0\n  location.rva       = 0x0\n\nStreams:\n  stream type 0x0 at index 8\n  stream type 0x3 at index 0\n  stream type 0x4 at index 1\n  stream type 0x5 at index 2\n  stream type 0x6 at index 3\n  stream type 0x7 at index 4\n  stream type 0xf at index 5\n  stream type 0x47670001 at index 6\n\nMinidumpThreadList\n  thread_count = 2\n\nthread[0]\nMDRawThread\n  thread_id                   = 0xbf4\n  suspend_count               = 0\n  priority_class              = 0x0\n  priority                    = 0x0\n  teb                         = 0x7ffdf000\n  stack.start_of_memory_range = 0x12f31c\n  stack.memory.data_size      = 0xce4\n  stack.memory.rva            = 0x1639\n  thread_context.data_size    = 0x2cc\n  thread_context.rva          = 0xd94\n\nMDRawContextX86\n  context_flags                = 0x1003f\n  dr0                          = 0x0\n  dr1                          = 0x0\n  dr2                          = 0x0\n  dr3                          = 0x0\n  dr6                          = 0x0\n  dr7                          = 0x0\n  float_save.control_word      = 0xffff027f\n  float_save.status_word       = 0xffff0000\n  float_save.tag_word          = 0xffffffff\n  float_save.error_offset      = 0x0\n  float_save.error_selector    = 0x220000\n  float_save.data_offset       = 0x0\n  float_save.data_selector     = 0xffff0000\n  float_save.register_area[80] = 0x0000000018b72200000118b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n  float_save.cr0_npx_state     = 0x0\n  gs                           = 0x0\n  fs                           = 0x3b\n  es                           = 0x23\n  ds                           = 0x23\n  edi                          = 0x0\n  esi                          = 0x7b8\n  ebx                          = 0x7c883780\n  edx                          = 0x7c97c0d8\n  ecx                          = 0x7c80b46e\n  eax                          = 0x400000\n  ebp                          = 0x12f384\n  eip                          = 0x7c90eb94\n  cs                           = 0x1b\n  eflags                       = 0x246\n  esp                          = 0x12f320\n  ss                           = 0x23\n  extended_registers[512]      = 0x7f0200000000220000000000000000000000000000000000801f0000ffff00000000000018b72200000100000000000018b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004509917c4e09917c38b622002400020024b42200020000009041917c0070fd7f0510907cccb22200000000009cb3220018ee907c7009917cc0e4977c6f3e917c623e917c08020000dcb62200b4b622001e000000000000000000000000000000000000002eb42200000000000f000000020000001e00200000fcfd7f2f63796764726976652f632f444f43554d457e312f4d4d454e544f7e312f4c4f43414c537e312f54656d7000000000000000000130b422000000004300000000000000001efcfd7f4509917c4e09917c5ad9000008b32200b4b62200\n\nStack\n0x00000000c0e9907ccb25807cb8070000000000000000000034ff1200b0fe12008037887c140000000100000000000000000000001000000027e0907c2e39917c0050fd7f00f0fd7f000000000400000034f312006947c788d4f31200a89a837cf825807c0000000098f312003225807cb8070000ffffffff00000000e4f31200ff1d4000b8070000ffffffffa8fa12008037887c0e1c4000a8fa120000000000ff792a0f64f91200b01b400000004000b0fe12000040020070fa1200084042000000000080fa120080fa12004e30867ca8fa12000000000000000000000000000018000002100000e3ef907c0000000079d900000000000048f41200000014003207917c0500000078071400000014000000000020f412003207917ca05f140018ee907cfa00000074f61200000000009615917ceb06917cf00298000100000000000000384f14009615917ceb06917c7801140008000000404f14000000a659985f1400080000000000000018ee907c90fea700400698003815917c184f1400eb06917c00000000800000000000a65988f69f0090f51200a569917cf8f41200d95c878880f5120043ef907c480485000500000090f5120088fea700a8212400000000000000000080f512002469917cf8fbfd7fa821240008000000f500000000000000384d850078019800a8fa120004000000a05f140096d4917c00000000b0d4917c0000000008069800184f140000000000104f140000000000184f140000004000000000010040020063003a005c0074006500730074005f006100700070002e006500780065000000000000002f00000028000000184f1400780185007801140028000000000000000000140084f3120010000000d8f5120018ee907cf006917cffffffffeb06917ce619917c88e6a7003003000001030000ff1b917c0000980080e6a70080069800400698000000980080e6a70000000000000000000000000080e6a7000818000088e6a700d759927c78019800081800000210000000009800f8f31200280a0000dcf6120018ee907cf006917cffffffffeb06917c0859927c00009800080000005859927c00000000000001000000a659000000005a6202000010000068fe030001000000dffe03000000010000000100fffffe7f0100000001c0c27700008500000000002dc0c27700000000684aaf590000a659241a917c80c0977c0000000000000000cd5c927c0050fd7f0000a65900000100080000004550fd7f0000000000000000000000000050fd7fcd5c927c05000000d4f61200f45c927c80e4977c05000000010000000050fd7f18f712007009917cc0e4977c172e817cff2d817c000000000000a6590000a6590210000000f0fd7f05000000e8f612000806980064f81200a89a837c002e817cffffffffff2d817cc8242400dd8ea75901000000000000004cf712003608a9590000a65901000000000000000100000060f71200e407a9596cf7120000004000000000010040020063003a005c0074006500730074005f006100700070002e0065007800650000006d05917c905f140000000000440d020000000000604f14000c0000007801140000000000a04e1400d84d8700400687004509917c0800000000000000000000004000000078011400a8038700404f14000510907c000000000000000078011400980387000800000008000000c0e4977cd04d8700f835887c7801140010000000a0e7ae591600000030fd1200d39b917c44000000620000000000a65950e9ae59d8eaae59a80387000100000014040000000000000100000002000000f800a659c003870001000000780114009508917c0000a659091b917c020000000900000040000000a2fd12009cfd1200404f1400a2fd1200d04d8700640187000000000000000000d04d870010000000d84d8700384f1400a803870010000000c00300000000870074fb1200404f14006cfe120018ee907cf006917cffffffffeb06917ca09d400000008700000000000400000000000000ffffff3fc04d8700ccfd12009c4d400004000000fa19917cb84d870064018700c04d8700063440000400000018000000c04d870079d90000c0038700fa31400000000000c04d8700c04d87000000000001000000b0fe120082294000c04d87000000000000000000c04d870048fe12008cfe120000000000e224400040fe12008cfe1200c04d8700d84d8700b0fe12008600817c54fa1200d8f9120000000000160018005479420079d90000000000000757917c00000200a4f91200a4f91200a4f91200020000000200000000000000c4f912000000000079d9000014fb12004cfa120014fb1200005a917c00fa1200a0fb120001000000655a917ca405817c74c1977ce705817c00000000f4fd120098fb120000000000a0fb12000000000090fb12000000800070fa120000000000000000000000000016001800547942000000000001000000000000000000000000000000000000003308917ca89a837c0000807c0000807ce800807c2cfa12001fe2907c11fa877cffffffffe06f817c000000006cfa12001c0000000f000000e06f817c8fc60000f0f312000060817cc8fa1200a89a837c7039867cfffffffff0ff1200da36847ca8fa1200099b837cb0fa120000000000b0fa12000000000000000000000000009cfb1200b8fb1200d4fa1200bf37907c9cfb1200e0ff1200b8fb120070fb1200b0ff1200d837907ce0ff120084fb12008b37907c9cfb1200e0ff1200b8fb120070fb1200a89a837c010000009cfb1200e0ff12006078937c9cfb1200e0ff1200b8fb120070fb1200a89a837c280a00009cfb12000200000018ee907c9032917cffffffff8832917c3364917c68fb1200000087003207917c02000000dc31917c1232917c8132917c8832917c1e000000c01e2400080200003807917c54fb12003207917cc4fb120018ee907c9032917c0000130000d01200beb4800088fe1200faea907c00000000b8fb12009cfb1200b8fb1200050000c000000000000000009e4240000200000001000000450000003f0001000000000000000000000000000000000000000000000000007f02ffff0000ffffffffffff0000000000002200000000000000ffff0000000018b72200000118b7220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b0000002300000023000000280a000002000000c1ab807c58bc420094fe12004500000088fe12009e4240001b0000004602010084fe1200230000007f0200000000220000000000000000000000000000000000801f0000ffff00000000000018b72200000100000000000018b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004509917c4e09917c38b622002400020024b42200020000009041917c0070fd7f0510907cccb22200000000009cb3220018ee907c7009917cc0e4977c6f3e917c623e917c08020000dcb62200b4b622001e000000000000000000000000000000000000002eb42200000000000f000000020000001e00200000fcfd7f2f63796764726976652f632f444f43554d457e312f4d4d454e544f7e312f4c4f43414c537e312f54656d7000000000000000000130b422000000004300000000000000001efcfd7f4509917c4e09917c5ad9000008b32200b4b622004500000070ff120000424000b8278700dc31917c00000000004c870000000020040000000000000007000000000000004042400000000000000000002e000000000000000cff12007b434100010000000700000084434100004d87002e39917cffffffff24000000240000002700000000000000584d870004000000b1944000244c87002a0000002f000000c0fe1200004d8700584d87000000a659b0b9a859015d400015aa400000000000b4070000784e14000000000001000000f40b00000000000000000000bc070000b8070000f40b0000a8fa120000000000009c4000599c400094b240004f752a0fc0ff1200ec534000010000003039870050398700ff752a0f00002400a02024000050fd7f050000c00100000005000000000000000000240084ff1200acfa1200e0ff1200d06f4000a70b7a0f00000000f0ff1200d76f817c00002400a02024000050fd7f050000c0c8ff1200a8fa1200ffffffffa89a837ce06f817c0000000000000000000000004354400000000000\n\nthread[1]\nMDRawThread\n  thread_id                   = 0x11c0\n  suspend_count               = 0\n  priority_class              = 0x0\n  priority                    = 0x0\n  teb                         = 0x7ffde000\n  stack.start_of_memory_range = 0x97f6e8\n  stack.memory.data_size      = 0x918\n  stack.memory.rva            = 0x231d\n  thread_context.data_size    = 0x2cc\n  thread_context.rva          = 0x1060\n\nMDRawContextX86\n  context_flags                = 0x1003f\n  dr0                          = 0x0\n  dr1                          = 0x0\n  dr2                          = 0x0\n  dr3                          = 0x0\n  dr6                          = 0x0\n  dr7                          = 0x0\n  float_save.control_word      = 0xffff027f\n  float_save.status_word       = 0xffff0000\n  float_save.tag_word          = 0xffffffff\n  float_save.error_offset      = 0x0\n  float_save.error_selector    = 0x870000\n  float_save.data_offset       = 0x0\n  float_save.data_selector     = 0xffff0000\n  float_save.register_area[80] = 0x84fb120000001400320778071400000014000000f4fe1200a0fd120018eeb0fd12003815917c961534ff120034ff12000000e7712a0f2a0000005400ccfb120068514000584d540000002a000000f4fe\n  float_save.cr0_npx_state     = 0x0\n  gs                           = 0x0\n  fs                           = 0x3b\n  es                           = 0x23\n  ds                           = 0x23\n  edi                          = 0x145b00\n  esi                          = 0x145aa8\n  ebx                          = 0x145ad0\n  edx                          = 0x7c90eb94\n  ecx                          = 0x7\n  eax                          = 0xa80000\n  ebp                          = 0x97f6fc\n  eip                          = 0x7c90eb94\n  cs                           = 0x1b\n  eflags                       = 0x246\n  esp                          = 0x97f6ec\n  ss                           = 0x23\n  extended_registers[512]      = 0x7f0200000000870000000000000000000000000000000000801f0000ccfb120084fb1200000014003207917c050000007807140000001400000000005cfb1200f4fe1200a0fd120018ee907c2d020000b0fd12003815917c9615917ceb06917c34ff120034ff12000000000060000000e7712a0f2a0000005400000000000000ccfb120068514000584d870034fc1200540000002a000000f4fe1200f8fe12002c2f4000584d87005e00000034fc12005400000000000000b0fe1200f4fe1200c0fe12005f21400034fc12002a0000003b762a0f91214000303132330000870038393a3b3c3d3e3f4041424300000000070000003bd11e2340061400b858101e5e03e0652e005c00320033003100650064003100780114002d0066003300380034002d0000000000390034002d0062003800350038002d0031003000984e1400350065003000330065003000360035002e0064006d0070000000907c08000000ffffffff8832917cbeb4807c780114001d00f40b784e14000401000044fd120050fd1200c01e240078011400bdb9807ca04e14007c80c2770000000008fd120078011400ecfc1200f0fc1200e6b9807cffffffff7c80c27708fd12001c00000024fd1200e92a867c7c80c277b45a887c8037887c2d0200000080c2770000c17780000000005003000010000020000000780114005cff12001648847c091b917c\n\nStack\n0x8000108020fa97009fd7907c0000000048f7970005000f0040061400000000004cf7970037b9807c00000000000000003103917c780114000000000061dc907cf1b8807c00000000ffffffff70f79700000000000000000054f797003082140001000000000000000200000000000000000000007cf7970020b9807c0e00000004000000006000000000a80078011400000000000882140092d5907c8b9b807c9c070000d0f89700780114009c07000038821400807f140020dea85910fa9700780114009807000088fb9700e07f14009c0700000000000078011400000000000882140000000000000000000000000078011400ba0300000000000000000000000000000000000000000000000000007801140000000000000000000000000000000000c0030000000000000000000000000000088214005c0057000600000078011400000000005c00730079007300740065006d0033000082140068011400000000000000000000821400d47f1400807f140070f8970061eea859e000a8000000a8001c4e000084f89700bdeea859e000a8000000a8001c4e0000a4f897005fefa8590000a8000000000006000000c4f89700e000a80060fe9700c8f897005abfa8590000a80000000000060000001c000000d47f1400807f1400380000006ce9907c88b9807cffffffff0000a80000000000807f140030fa97007fc3a859a0c4a859b0fb970060fe9700684f1400504500004c010400ca9610410000000000000000e0000e210b01070a00400000003a000000000000f1100000001000000000bf760000000000100000000200000500010005000100040000000000000000b00000000400009ba2000000001400285214000000000034fa97007801140034fa9700910e917c080614006d05917cc84d85005c4e8500684f140000000000b04800002852140078011400e00300003052140000000000000000000000000078011400c403000030821400380000000000000000000000000000000000000000000000000000003882140048050000780200003800000000100000ec000000b8470000400000000000000000000000000000000000140000000000807f140000000000000000000000000000000101a900000060fe9700dcff9700dcff97000050fd7f78fa970054fa9700ad9d917c8cfa9700c2066f7f0e000000000000001c01000078fa9700c84d850068fa970085ae807c78fc970024fc970083dba85978fc97008cfa9700800000008edba85914010000050000000100000096020000b8fc97003815917c9615917ceb06917c60fe970060fe9700c4fd9700d8fa9700000014003207917c21000000b80c14000000140030521400b0fa9700fffffffff4fc970018ee907c3807917cffffffff3207917cab06917ceb06917ccc4f140060fe9700684f1400e0004000e4fa9700a863917c74fb970018ee907c3808917cffffffff3308917c5b2c817c872c817c00000000f4fb9700000000000000000054fd970018ee907c4006140064fd97003815917c00e0fd7feb06917c684f140038821400780114000050fd7facfb970000000000000004000000000090fe97000000000018fb970050531400508b1400a89a837cffe9907cf60d817ca807000000000000ffe9907cf60d817c08000000000000000000000000000000585314003cfc97003882140000000000160e817cc4fd970060fe970058531400208f1400588b1400460f917c50531400208f1400780114003082140000000000b8fc970078011400b8fc9700910e917c080614006d05917c3882140060fe97000000000000000000960200003082140078011400ffe9907c38821400a807000000000000780114005853140058fc9700505314001000000000000000160e817c784e8500c4fd9700388214000000000024010000f00c00001000000044fc970000000000c7e2907ce721807cffffffffe8f69700388214001809000098fc9700acfc9700d2e2a859ffffffffe8f697003882140018090000c4fc97003882140060fe9700c4fd9700ccfc97004ee3a859ffffffffe8f69700000000003882140018090000e0fc9700f4fc970093b2a859ffffffffe8f69700000000003882140018090000c4fd970060fe9700a85a140078fd9700a5b3a85960fe9700c4fd9700684f1400e8f697000000000018090000000000000200000080fd9700c4fd970060fe970000000000f40b000000000000000000000000000000f0fd7f000000001cf3120000000000e40c000039160000cc020000940d00000000000000000000000000000000000002000000ac4f14006010000098fd97005eb7a8593916000000000000684f1400784e85000000000084ff9700d4fe97007bb9a85960fe9700c4fd9700684f14003849140084ff9700010000000000000008ff9700f40b0000090000000000000020000000200000006c0000008c000000380000001e000000c4000000dc000000a80000008401000064000000b801000030000000e801000080050000e8010000680700000000000068070000680700000000000005150000340000002915000039150000fc1600001d23000068070000600300008a070000c80a0000310a00002c130000f91400000c000000352c000000000000ffffffff5c0f0000c84d8500784e8500884e85000000000000000000000000004c010000fc39a6590000000002000000050000000100000000008500280a000001000001cc0200009c0000000b00000050000000040000000010000000000000000000000001000000000000000000000000000034ff970078baa859384914005c0f0000c84d850001000000884e8500684f140008ff970064ff970000000000a8070000b0fe1200f40b00009cfb120000000000b8fb12000000000000000000ae20140000000000884e8500784e8500c84d8500a8fa120011204000ffffffff5c0f0000a80700000000000078ff970064ff970000000000adbf807c2025807cecff97000100000084ff970003000000c0110000f40b0000f40b0000a8fa120000000000010067470c0000006cff9700bc070000ffffffff000000006c1a4000f40b000000fa12000000000000004000a09d4000b0fe120083b6807cb0fe120000004000a09d4000b0fe120000e0fd7f00069c86c0ff9700d8863f86ffffffffa89a837c90b6807c000000000000000000000000301a4000b0fe120000000000\n\nMinidumpModuleList\n  module_count = 13\n\nmodule[0]\nMDRawModule\n  base_of_image                   = 0x400000\n  size_of_image                   = 0x2d000\n  checksum                        = 0x0\n  time_date_stamp                 = 0x45d35f6c\n  module_name_rva                 = 0x78a\n  version_info.signature          = 0x0\n  version_info.struct_version     = 0x0\n  version_info.file_version       = 0x0:0x0\n  version_info.product_version    = 0x0:0x0\n  version_info.file_flags_mask    = 0x0\n  version_info.file_flags         = 0x0\n  version_info.file_os            = 0x0\n  version_info.file_type          = 0x0\n  version_info.file_subtype       = 0x0\n  version_info.file_date          = 0x0:0x0\n  cv_record.data_size             = 40\n  cv_record.rva                   = 0x132c\n  misc_record.data_size           = 0\n  misc_record.rva                 = 0x0\n  (code_file)                     = \"c:\\test_app.exe\"\n  (code_identifier)               = \"45D35F6C2d000\"\n  (cv_record).cv_signature        = 0x53445352\n  (cv_record).signature           = 5a9832e5-2872-41c1-838e-d98914e9b7ff\n  (cv_record).age                 = 1\n  (cv_record).pdb_file_name       = \"c:\\test_app.pdb\"\n  (misc_record)                   = (null)\n  (debug_file)                    = \"c:\\test_app.pdb\"\n  (debug_identifier)              = \"5A9832E5287241C1838ED98914E9B7FF1\"\n  (version)                       = \"\"\n\nmodule[1]\nMDRawModule\n  base_of_image                   = 0x7c900000\n  size_of_image                   = 0xb0000\n  checksum                        = 0xaf2f7\n  time_date_stamp                 = 0x411096b4\n  module_name_rva                 = 0x7ae\n  version_info.signature          = 0xfeef04bd\n  version_info.struct_version     = 0x10000\n  version_info.file_version       = 0x50001:0xa280884\n  version_info.product_version    = 0x50001:0xa280884\n  version_info.file_flags_mask    = 0x3f\n  version_info.file_flags         = 0x0\n  version_info.file_os            = 0x40004\n  version_info.file_type          = 0x2\n  version_info.file_subtype       = 0x0\n  version_info.file_date          = 0x0:0x0\n  cv_record.data_size             = 34\n  cv_record.rva                   = 0x1354\n  misc_record.data_size           = 0\n  misc_record.rva                 = 0x0\n  (code_file)                     = \"C:\\WINDOWS\\system32\\ntdll.dll\"\n  (code_identifier)               = \"411096B4b0000\"\n  (cv_record).cv_signature        = 0x53445352\n  (cv_record).signature           = 36515fb5-d043-45e4-91f6-72fa2e2878c0\n  (cv_record).age                 = 2\n  (cv_record).pdb_file_name       = \"ntdll.pdb\"\n  (misc_record)                   = (null)\n  (debug_file)                    = \"ntdll.pdb\"\n  (debug_identifier)              = \"36515FB5D04345E491F672FA2E2878C02\"\n  (version)                       = \"5.1.2600.2180\"\n\nmodule[2]\nMDRawModule\n  base_of_image                   = 0x7c800000\n  size_of_image                   = 0xf4000\n  checksum                        = 0xf724d\n  time_date_stamp                 = 0x44ab9a84\n  module_name_rva                 = 0x7ee\n  version_info.signature          = 0xfeef04bd\n  version_info.struct_version     = 0x10000\n  version_info.file_version       = 0x50001:0xa280b81\n  version_info.product_version    = 0x50001:0xa280b81\n  version_info.file_flags_mask    = 0x3f\n  version_info.file_flags         = 0x0\n  version_info.file_os            = 0x40004\n  version_info.file_type          = 0x2\n  version_info.file_subtype       = 0x0\n  version_info.file_date          = 0x0:0x0\n  cv_record.data_size             = 37\n  cv_record.rva                   = 0x1376\n  misc_record.data_size           = 0\n  misc_record.rva                 = 0x0\n  (code_file)                     = \"C:\\WINDOWS\\system32\\kernel32.dll\"\n  (code_identifier)               = \"44AB9A84f4000\"\n  (cv_record).cv_signature        = 0x53445352\n  (cv_record).signature           = bce8785c-57b4-4245-a669-896b6a19b954\n  (cv_record).age                 = 2\n  (cv_record).pdb_file_name       = \"kernel32.pdb\"\n  (misc_record)                   = (null)\n  (debug_file)                    = \"kernel32.pdb\"\n  (debug_identifier)              = \"BCE8785C57B44245A669896B6A19B9542\"\n  (version)                       = \"5.1.2600.2945\"\n\nmodule[3]\nMDRawModule\n  base_of_image                   = 0x774e0000\n  size_of_image                   = 0x13d000\n  checksum                        = 0x13dc6b\n  time_date_stamp                 = 0x42e5be93\n  module_name_rva                 = 0x834\n  version_info.signature          = 0xfeef04bd\n  version_info.struct_version     = 0x10000\n  version_info.file_version       = 0x50001:0xa280aa6\n  version_info.product_version    = 0x50001:0xa280aa6\n  version_info.file_flags_mask    = 0x3f\n  version_info.file_flags         = 0x0\n  version_info.file_os            = 0x40004\n  version_info.file_type          = 0x2\n  version_info.file_subtype       = 0x0\n  version_info.file_date          = 0x0:0x0\n  cv_record.data_size             = 34\n  cv_record.rva                   = 0x139b\n  misc_record.data_size           = 0\n  misc_record.rva                 = 0x0\n  (code_file)                     = \"C:\\WINDOWS\\system32\\ole32.dll\"\n  (code_identifier)               = \"42E5BE9313d000\"\n  (cv_record).cv_signature        = 0x53445352\n  (cv_record).signature           = 683b65b2-46f4-4187-96d2-ee6d4c55eb11\n  (cv_record).age                 = 2\n  (cv_record).pdb_file_name       = \"ole32.pdb\"\n  (misc_record)                   = (null)\n  (debug_file)                    = \"ole32.pdb\"\n  (debug_identifier)              = \"683B65B246F4418796D2EE6D4C55EB112\"\n  (version)                       = \"5.1.2600.2726\"\n\nmodule[4]\nMDRawModule\n  base_of_image                   = 0x77dd0000\n  size_of_image                   = 0x9b000\n  checksum                        = 0xa0de4\n  time_date_stamp                 = 0x411096a7\n  module_name_rva                 = 0x874\n  version_info.signature          = 0xfeef04bd\n  version_info.struct_version     = 0x10000\n  version_info.file_version       = 0x50001:0xa280884\n  version_info.product_version    = 0x50001:0xa280884\n  version_info.file_flags_mask    = 0x3f\n  version_info.file_flags         = 0x0\n  version_info.file_os            = 0x40004\n  version_info.file_type          = 0x2\n  version_info.file_subtype       = 0x0\n  version_info.file_date          = 0x0:0x0\n  cv_record.data_size             = 37\n  cv_record.rva                   = 0x13bd\n  misc_record.data_size           = 0\n  misc_record.rva                 = 0x0\n  (code_file)                     = \"C:\\WINDOWS\\system32\\advapi32.dll\"\n  (code_identifier)               = \"411096A79b000\"\n  (cv_record).cv_signature        = 0x53445352\n  (cv_record).signature           = 455d6c5f-184d-45bb-b5c5-f30f82975114\n  (cv_record).age                 = 2\n  (cv_record).pdb_file_name       = \"advapi32.pdb\"\n  (misc_record)                   = (null)\n  (debug_file)                    = \"advapi32.pdb\"\n  (debug_identifier)              = \"455D6C5F184D45BBB5C5F30F829751142\"\n  (version)                       = \"5.1.2600.2180\"\n\nmodule[5]\nMDRawModule\n  base_of_image                   = 0x77e70000\n  size_of_image                   = 0x91000\n  checksum                        = 0x9c482\n  time_date_stamp                 = 0x411096ae\n  module_name_rva                 = 0x8ba\n  version_info.signature          = 0xfeef04bd\n  version_info.struct_version     = 0x10000\n  version_info.file_version       = 0x50001:0xa280884\n  version_info.product_version    = 0x50001:0xa280884\n  version_info.file_flags_mask    = 0x3f\n  version_info.file_flags         = 0x0\n  version_info.file_os            = 0x40004\n  version_info.file_type          = 0x2\n  version_info.file_subtype       = 0x0\n  version_info.file_date          = 0x0:0x0\n  cv_record.data_size             = 35\n  cv_record.rva                   = 0x13e2\n  misc_record.data_size           = 0\n  misc_record.rva                 = 0x0\n  (code_file)                     = \"C:\\WINDOWS\\system32\\rpcrt4.dll\"\n  (code_identifier)               = \"411096AE91000\"\n  (cv_record).cv_signature        = 0x53445352\n  (cv_record).signature           = bea45a72-1da1-41da-a3ba-86b3a2031153\n  (cv_record).age                 = 2\n  (cv_record).pdb_file_name       = \"rpcrt4.pdb\"\n  (misc_record)                   = (null)\n  (debug_file)                    = \"rpcrt4.pdb\"\n  (debug_identifier)              = \"BEA45A721DA141DAA3BA86B3A20311532\"\n  (version)                       = \"5.1.2600.2180\"\n\nmodule[6]\nMDRawModule\n  base_of_image                   = 0x77f10000\n  size_of_image                   = 0x47000\n  checksum                        = 0x4d0d0\n  time_date_stamp                 = 0x43b34feb\n  module_name_rva                 = 0x8fc\n  version_info.signature          = 0xfeef04bd\n  version_info.struct_version     = 0x10000\n  version_info.file_version       = 0x50001:0xa280b02\n  version_info.product_version    = 0x50001:0xa280b02\n  version_info.file_flags_mask    = 0x3f\n  version_info.file_flags         = 0x0\n  version_info.file_os            = 0x40004\n  version_info.file_type          = 0x2\n  version_info.file_subtype       = 0x0\n  version_info.file_date          = 0x0:0x0\n  cv_record.data_size             = 34\n  cv_record.rva                   = 0x1405\n  misc_record.data_size           = 0\n  misc_record.rva                 = 0x0\n  (code_file)                     = \"C:\\WINDOWS\\system32\\gdi32.dll\"\n  (code_identifier)               = \"43B34FEB47000\"\n  (cv_record).cv_signature        = 0x53445352\n  (cv_record).signature           = c0ea66be-00a6-4bd7-aef7-9e443a91869c\n  (cv_record).age                 = 2\n  (cv_record).pdb_file_name       = \"gdi32.pdb\"\n  (misc_record)                   = (null)\n  (debug_file)                    = \"gdi32.pdb\"\n  (debug_identifier)              = \"C0EA66BE00A64BD7AEF79E443A91869C2\"\n  (version)                       = \"5.1.2600.2818\"\n\nmodule[7]\nMDRawModule\n  base_of_image                   = 0x77d40000\n  size_of_image                   = 0x90000\n  checksum                        = 0x9505c\n  time_date_stamp                 = 0x42260159\n  module_name_rva                 = 0x93c\n  version_info.signature          = 0xfeef04bd\n  version_info.struct_version     = 0x10000\n  version_info.file_version       = 0x50001:0xa280a3e\n  version_info.product_version    = 0x50001:0xa280a3e\n  version_info.file_flags_mask    = 0x3f\n  version_info.file_flags         = 0x0\n  version_info.file_os            = 0x40004\n  version_info.file_type          = 0x2\n  version_info.file_subtype       = 0x0\n  version_info.file_date          = 0x0:0x0\n  cv_record.data_size             = 35\n  cv_record.rva                   = 0x1427\n  misc_record.data_size           = 0\n  misc_record.rva                 = 0x0\n  (code_file)                     = \"C:\\WINDOWS\\system32\\user32.dll\"\n  (code_identifier)               = \"4226015990000\"\n  (cv_record).cv_signature        = 0x53445352\n  (cv_record).signature           = ee2b714d-83a3-4c9d-8802-7621272f8326\n  (cv_record).age                 = 2\n  (cv_record).pdb_file_name       = \"user32.pdb\"\n  (misc_record)                   = (null)\n  (debug_file)                    = \"user32.pdb\"\n  (debug_identifier)              = \"EE2B714D83A34C9D88027621272F83262\"\n  (version)                       = \"5.1.2600.2622\"\n\nmodule[8]\nMDRawModule\n  base_of_image                   = 0x77c10000\n  size_of_image                   = 0x58000\n  checksum                        = 0x57cd3\n  time_date_stamp                 = 0x41109752\n  module_name_rva                 = 0x97e\n  version_info.signature          = 0xfeef04bd\n  version_info.struct_version     = 0x10000\n  version_info.file_version       = 0x70000:0xa280884\n  version_info.product_version    = 0x60001:0x21be0884\n  version_info.file_flags_mask    = 0x3f\n  version_info.file_flags         = 0x0\n  version_info.file_os            = 0x40004\n  version_info.file_type          = 0x1\n  version_info.file_subtype       = 0x0\n  version_info.file_date          = 0x0:0x0\n  cv_record.data_size             = 35\n  cv_record.rva                   = 0x144a\n  misc_record.data_size           = 0\n  misc_record.rva                 = 0x0\n  (code_file)                     = \"C:\\WINDOWS\\system32\\msvcrt.dll\"\n  (code_identifier)               = \"4110975258000\"\n  (cv_record).cv_signature        = 0x53445352\n  (cv_record).signature           = a678f3c3-0ded-426b-8390-32b996987e38\n  (cv_record).age                 = 1\n  (cv_record).pdb_file_name       = \"msvcrt.pdb\"\n  (misc_record)                   = (null)\n  (debug_file)                    = \"msvcrt.pdb\"\n  (debug_identifier)              = \"A678F3C30DED426B839032B996987E381\"\n  (version)                       = \"7.0.2600.2180\"\n\nmodule[9]\nMDRawModule\n  base_of_image                   = 0x76390000\n  size_of_image                   = 0x1d000\n  checksum                        = 0x2a024\n  time_date_stamp                 = 0x411096ae\n  module_name_rva                 = 0x9c0\n  version_info.signature          = 0xfeef04bd\n  version_info.struct_version     = 0x10000\n  version_info.file_version       = 0x50001:0xa280884\n  version_info.product_version    = 0x50001:0xa280884\n  version_info.file_flags_mask    = 0x3f\n  version_info.file_flags         = 0x0\n  version_info.file_os            = 0x40004\n  version_info.file_type          = 0x2\n  version_info.file_subtype       = 0x0\n  version_info.file_date          = 0x0:0x0\n  cv_record.data_size             = 34\n  cv_record.rva                   = 0x146d\n  misc_record.data_size           = 0\n  misc_record.rva                 = 0x0\n  (code_file)                     = \"C:\\WINDOWS\\system32\\imm32.dll\"\n  (code_identifier)               = \"411096AE1d000\"\n  (cv_record).cv_signature        = 0x53445352\n  (cv_record).signature           = 2c17a49c-251b-4c8e-b9e2-ad13d7d9ea16\n  (cv_record).age                 = 2\n  (cv_record).pdb_file_name       = \"imm32.pdb\"\n  (misc_record)                   = (null)\n  (debug_file)                    = \"imm32.pdb\"\n  (debug_identifier)              = \"2C17A49C251B4C8EB9E2AD13D7D9EA162\"\n  (version)                       = \"5.1.2600.2180\"\n\nmodule[10]\nMDRawModule\n  base_of_image                   = 0x59a60000\n  size_of_image                   = 0xa1000\n  checksum                        = 0xa8824\n  time_date_stamp                 = 0x4110969a\n  module_name_rva                 = 0xa00\n  version_info.signature          = 0xfeef04bd\n  version_info.struct_version     = 0x10000\n  version_info.file_version       = 0x50001:0xa280884\n  version_info.product_version    = 0x50001:0xa280884\n  version_info.file_flags_mask    = 0x3f\n  version_info.file_flags         = 0x0\n  version_info.file_os            = 0x40004\n  version_info.file_type          = 0x2\n  version_info.file_subtype       = 0x0\n  version_info.file_date          = 0x0:0x0\n  cv_record.data_size             = 36\n  cv_record.rva                   = 0x148f\n  misc_record.data_size           = 0\n  misc_record.rva                 = 0x0\n  (code_file)                     = \"C:\\WINDOWS\\system32\\dbghelp.dll\"\n  (code_identifier)               = \"4110969Aa1000\"\n  (cv_record).cv_signature        = 0x53445352\n  (cv_record).signature           = 39559573-e21b-46f2-8e28-6923be9e6a76\n  (cv_record).age                 = 1\n  (cv_record).pdb_file_name       = \"dbghelp.pdb\"\n  (misc_record)                   = (null)\n  (debug_file)                    = \"dbghelp.pdb\"\n  (debug_identifier)              = \"39559573E21B46F28E286923BE9E6A761\"\n  (version)                       = \"5.1.2600.2180\"\n\nmodule[11]\nMDRawModule\n  base_of_image                   = 0x77c00000\n  size_of_image                   = 0x8000\n  checksum                        = 0x11d78\n  time_date_stamp                 = 0x411096b7\n  module_name_rva                 = 0xa44\n  version_info.signature          = 0xfeef04bd\n  version_info.struct_version     = 0x10000\n  version_info.file_version       = 0x50001:0xa280884\n  version_info.product_version    = 0x50001:0xa280884\n  version_info.file_flags_mask    = 0x3f\n  version_info.file_flags         = 0x0\n  version_info.file_os            = 0x40004\n  version_info.file_type          = 0x2\n  version_info.file_subtype       = 0x0\n  version_info.file_date          = 0x0:0x0\n  cv_record.data_size             = 36\n  cv_record.rva                   = 0x14b3\n  misc_record.data_size           = 0\n  misc_record.rva                 = 0x0\n  (code_file)                     = \"C:\\WINDOWS\\system32\\version.dll\"\n  (code_identifier)               = \"411096B78000\"\n  (cv_record).cv_signature        = 0x53445352\n  (cv_record).signature           = 180a90c4-0384-463e-82dd-c45b2c8ab76e\n  (cv_record).age                 = 2\n  (cv_record).pdb_file_name       = \"version.pdb\"\n  (misc_record)                   = (null)\n  (debug_file)                    = \"version.pdb\"\n  (debug_identifier)              = \"180A90C40384463E82DDC45B2C8AB76E2\"\n  (version)                       = \"5.1.2600.2180\"\n\nmodule[12]\nMDRawModule\n  base_of_image                   = 0x76bf0000\n  size_of_image                   = 0xb000\n  checksum                        = 0xa29b\n  time_date_stamp                 = 0x411096ca\n  module_name_rva                 = 0xa88\n  version_info.signature          = 0xfeef04bd\n  version_info.struct_version     = 0x10000\n  version_info.file_version       = 0x50001:0xa280884\n  version_info.product_version    = 0x50001:0xa280884\n  version_info.file_flags_mask    = 0x3f\n  version_info.file_flags         = 0x0\n  version_info.file_os            = 0x40004\n  version_info.file_type          = 0x2\n  version_info.file_subtype       = 0x0\n  version_info.file_date          = 0x0:0x0\n  cv_record.data_size             = 34\n  cv_record.rva                   = 0x14d7\n  misc_record.data_size           = 0\n  misc_record.rva                 = 0x0\n  (code_file)                     = \"C:\\WINDOWS\\system32\\psapi.dll\"\n  (code_identifier)               = \"411096CAb000\"\n  (cv_record).cv_signature        = 0x53445352\n  (cv_record).signature           = a5c3a1f9-689f-43d8-ad22-8a0929388970\n  (cv_record).age                 = 2\n  (cv_record).pdb_file_name       = \"psapi.pdb\"\n  (misc_record)                   = (null)\n  (debug_file)                    = \"psapi.pdb\"\n  (debug_identifier)              = \"A5C3A1F9689F43D8AD228A09293889702\"\n  (version)                       = \"5.1.2600.2180\"\n\nMinidumpMemoryList\n  region_count = 3\n\nregion[0]\nMDMemoryDescriptor\n  start_of_memory_range = 0x7c90eb14\n  memory.data_size      = 0x100\n  memory.rva            = 0x1539\nMemory\n0xff83c4ec890424c744240401000000895c2408c74424100000000054e877000000c208009090909090558bec83ec508944240c64a1180000008b80a4010000890424c744240400000000c744240800000000c74424100000000054e8380000008b04248be55dc3908da424000000008d490090909090908bd40f349090909090c38da424000000008d64240090909090908d542408cd2ec3558bec9c81ecd00200008985dcfdffff898dd8fdffff8b45088b4d0489480c8d852cfdffff8988b80000008998a40000008990a800000089b0a000000089b89c0000008d4d0c8988c40000008b4d008988b40000008b4dfc8988c00000008c88bc0000008c989800\n\nregion[1]\nMDMemoryDescriptor\n  start_of_memory_range = 0x12f31c\n  memory.data_size      = 0xce4\n  memory.rva            = 0x1639\nMemory\n0x00000000c0e9907ccb25807cb8070000000000000000000034ff1200b0fe12008037887c140000000100000000000000000000001000000027e0907c2e39917c0050fd7f00f0fd7f000000000400000034f312006947c788d4f31200a89a837cf825807c0000000098f312003225807cb8070000ffffffff00000000e4f31200ff1d4000b8070000ffffffffa8fa12008037887c0e1c4000a8fa120000000000ff792a0f64f91200b01b400000004000b0fe12000040020070fa1200084042000000000080fa120080fa12004e30867ca8fa12000000000000000000000000000018000002100000e3ef907c0000000079d900000000000048f41200000014003207917c0500000078071400000014000000000020f412003207917ca05f140018ee907cfa00000074f61200000000009615917ceb06917cf00298000100000000000000384f14009615917ceb06917c7801140008000000404f14000000a659985f1400080000000000000018ee907c90fea700400698003815917c184f1400eb06917c00000000800000000000a65988f69f0090f51200a569917cf8f41200d95c878880f5120043ef907c480485000500000090f5120088fea700a8212400000000000000000080f512002469917cf8fbfd7fa821240008000000f500000000000000384d850078019800a8fa120004000000a05f140096d4917c00000000b0d4917c0000000008069800184f140000000000104f140000000000184f140000004000000000010040020063003a005c0074006500730074005f006100700070002e006500780065000000000000002f00000028000000184f1400780185007801140028000000000000000000140084f3120010000000d8f5120018ee907cf006917cffffffffeb06917ce619917c88e6a7003003000001030000ff1b917c0000980080e6a70080069800400698000000980080e6a70000000000000000000000000080e6a7000818000088e6a700d759927c78019800081800000210000000009800f8f31200280a0000dcf6120018ee907cf006917cffffffffeb06917c0859927c00009800080000005859927c00000000000001000000a659000000005a6202000010000068fe030001000000dffe03000000010000000100fffffe7f0100000001c0c27700008500000000002dc0c27700000000684aaf590000a659241a917c80c0977c0000000000000000cd5c927c0050fd7f0000a65900000100080000004550fd7f0000000000000000000000000050fd7fcd5c927c05000000d4f61200f45c927c80e4977c05000000010000000050fd7f18f712007009917cc0e4977c172e817cff2d817c000000000000a6590000a6590210000000f0fd7f05000000e8f612000806980064f81200a89a837c002e817cffffffffff2d817cc8242400dd8ea75901000000000000004cf712003608a9590000a65901000000000000000100000060f71200e407a9596cf7120000004000000000010040020063003a005c0074006500730074005f006100700070002e0065007800650000006d05917c905f140000000000440d020000000000604f14000c0000007801140000000000a04e1400d84d8700400687004509917c0800000000000000000000004000000078011400a8038700404f14000510907c000000000000000078011400980387000800000008000000c0e4977cd04d8700f835887c7801140010000000a0e7ae591600000030fd1200d39b917c44000000620000000000a65950e9ae59d8eaae59a80387000100000014040000000000000100000002000000f800a659c003870001000000780114009508917c0000a659091b917c020000000900000040000000a2fd12009cfd1200404f1400a2fd1200d04d8700640187000000000000000000d04d870010000000d84d8700384f1400a803870010000000c00300000000870074fb1200404f14006cfe120018ee907cf006917cffffffffeb06917ca09d400000008700000000000400000000000000ffffff3fc04d8700ccfd12009c4d400004000000fa19917cb84d870064018700c04d8700063440000400000018000000c04d870079d90000c0038700fa31400000000000c04d8700c04d87000000000001000000b0fe120082294000c04d87000000000000000000c04d870048fe12008cfe120000000000e224400040fe12008cfe1200c04d8700d84d8700b0fe12008600817c54fa1200d8f9120000000000160018005479420079d90000000000000757917c00000200a4f91200a4f91200a4f91200020000000200000000000000c4f912000000000079d9000014fb12004cfa120014fb1200005a917c00fa1200a0fb120001000000655a917ca405817c74c1977ce705817c00000000f4fd120098fb120000000000a0fb12000000000090fb12000000800070fa120000000000000000000000000016001800547942000000000001000000000000000000000000000000000000003308917ca89a837c0000807c0000807ce800807c2cfa12001fe2907c11fa877cffffffffe06f817c000000006cfa12001c0000000f000000e06f817c8fc60000f0f312000060817cc8fa1200a89a837c7039867cfffffffff0ff1200da36847ca8fa1200099b837cb0fa120000000000b0fa12000000000000000000000000009cfb1200b8fb1200d4fa1200bf37907c9cfb1200e0ff1200b8fb120070fb1200b0ff1200d837907ce0ff120084fb12008b37907c9cfb1200e0ff1200b8fb120070fb1200a89a837c010000009cfb1200e0ff12006078937c9cfb1200e0ff1200b8fb120070fb1200a89a837c280a00009cfb12000200000018ee907c9032917cffffffff8832917c3364917c68fb1200000087003207917c02000000dc31917c1232917c8132917c8832917c1e000000c01e2400080200003807917c54fb12003207917cc4fb120018ee907c9032917c0000130000d01200beb4800088fe1200faea907c00000000b8fb12009cfb1200b8fb1200050000c000000000000000009e4240000200000001000000450000003f0001000000000000000000000000000000000000000000000000007f02ffff0000ffffffffffff0000000000002200000000000000ffff0000000018b72200000118b7220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003b0000002300000023000000280a000002000000c1ab807c58bc420094fe12004500000088fe12009e4240001b0000004602010084fe1200230000007f0200000000220000000000000000000000000000000000801f0000ffff00000000000018b72200000100000000000018b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004509917c4e09917c38b622002400020024b42200020000009041917c0070fd7f0510907cccb22200000000009cb3220018ee907c7009917cc0e4977c6f3e917c623e917c08020000dcb62200b4b622001e000000000000000000000000000000000000002eb42200000000000f000000020000001e00200000fcfd7f2f63796764726976652f632f444f43554d457e312f4d4d454e544f7e312f4c4f43414c537e312f54656d7000000000000000000130b422000000004300000000000000001efcfd7f4509917c4e09917c5ad9000008b32200b4b622004500000070ff120000424000b8278700dc31917c00000000004c870000000020040000000000000007000000000000004042400000000000000000002e000000000000000cff12007b434100010000000700000084434100004d87002e39917cffffffff24000000240000002700000000000000584d870004000000b1944000244c87002a0000002f000000c0fe1200004d8700584d87000000a659b0b9a859015d400015aa400000000000b4070000784e14000000000001000000f40b00000000000000000000bc070000b8070000f40b0000a8fa120000000000009c4000599c400094b240004f752a0fc0ff1200ec534000010000003039870050398700ff752a0f00002400a02024000050fd7f050000c00100000005000000000000000000240084ff1200acfa1200e0ff1200d06f4000a70b7a0f00000000f0ff1200d76f817c00002400a02024000050fd7f050000c0c8ff1200a8fa1200ffffffffa89a837ce06f817c0000000000000000000000004354400000000000\n\nregion[2]\nMDMemoryDescriptor\n  start_of_memory_range = 0x97f6e8\n  memory.data_size      = 0x918\n  memory.rva            = 0x231d\nMemory\n0x8000108020fa97009fd7907c0000000048f7970005000f0040061400000000004cf7970037b9807c00000000000000003103917c780114000000000061dc907cf1b8807c00000000ffffffff70f79700000000000000000054f797003082140001000000000000000200000000000000000000007cf7970020b9807c0e00000004000000006000000000a80078011400000000000882140092d5907c8b9b807c9c070000d0f89700780114009c07000038821400807f140020dea85910fa9700780114009807000088fb9700e07f14009c0700000000000078011400000000000882140000000000000000000000000078011400ba0300000000000000000000000000000000000000000000000000007801140000000000000000000000000000000000c0030000000000000000000000000000088214005c0057000600000078011400000000005c00730079007300740065006d0033000082140068011400000000000000000000821400d47f1400807f140070f8970061eea859e000a8000000a8001c4e000084f89700bdeea859e000a8000000a8001c4e0000a4f897005fefa8590000a8000000000006000000c4f89700e000a80060fe9700c8f897005abfa8590000a80000000000060000001c000000d47f1400807f1400380000006ce9907c88b9807cffffffff0000a80000000000807f140030fa97007fc3a859a0c4a859b0fb970060fe9700684f1400504500004c010400ca9610410000000000000000e0000e210b01070a00400000003a000000000000f1100000001000000000bf760000000000100000000200000500010005000100040000000000000000b00000000400009ba2000000001400285214000000000034fa97007801140034fa9700910e917c080614006d05917cc84d85005c4e8500684f140000000000b04800002852140078011400e00300003052140000000000000000000000000078011400c403000030821400380000000000000000000000000000000000000000000000000000003882140048050000780200003800000000100000ec000000b8470000400000000000000000000000000000000000140000000000807f140000000000000000000000000000000101a900000060fe9700dcff9700dcff97000050fd7f78fa970054fa9700ad9d917c8cfa9700c2066f7f0e000000000000001c01000078fa9700c84d850068fa970085ae807c78fc970024fc970083dba85978fc97008cfa9700800000008edba85914010000050000000100000096020000b8fc97003815917c9615917ceb06917c60fe970060fe9700c4fd9700d8fa9700000014003207917c21000000b80c14000000140030521400b0fa9700fffffffff4fc970018ee907c3807917cffffffff3207917cab06917ceb06917ccc4f140060fe9700684f1400e0004000e4fa9700a863917c74fb970018ee907c3808917cffffffff3308917c5b2c817c872c817c00000000f4fb9700000000000000000054fd970018ee907c4006140064fd97003815917c00e0fd7feb06917c684f140038821400780114000050fd7facfb970000000000000004000000000090fe97000000000018fb970050531400508b1400a89a837cffe9907cf60d817ca807000000000000ffe9907cf60d817c08000000000000000000000000000000585314003cfc97003882140000000000160e817cc4fd970060fe970058531400208f1400588b1400460f917c50531400208f1400780114003082140000000000b8fc970078011400b8fc9700910e917c080614006d05917c3882140060fe97000000000000000000960200003082140078011400ffe9907c38821400a807000000000000780114005853140058fc9700505314001000000000000000160e817c784e8500c4fd9700388214000000000024010000f00c00001000000044fc970000000000c7e2907ce721807cffffffffe8f69700388214001809000098fc9700acfc9700d2e2a859ffffffffe8f697003882140018090000c4fc97003882140060fe9700c4fd9700ccfc97004ee3a859ffffffffe8f69700000000003882140018090000e0fc9700f4fc970093b2a859ffffffffe8f69700000000003882140018090000c4fd970060fe9700a85a140078fd9700a5b3a85960fe9700c4fd9700684f1400e8f697000000000018090000000000000200000080fd9700c4fd970060fe970000000000f40b000000000000000000000000000000f0fd7f000000001cf3120000000000e40c000039160000cc020000940d00000000000000000000000000000000000002000000ac4f14006010000098fd97005eb7a8593916000000000000684f1400784e85000000000084ff9700d4fe97007bb9a85960fe9700c4fd9700684f14003849140084ff9700010000000000000008ff9700f40b0000090000000000000020000000200000006c0000008c000000380000001e000000c4000000dc000000a80000008401000064000000b801000030000000e801000080050000e8010000680700000000000068070000680700000000000005150000340000002915000039150000fc1600001d23000068070000600300008a070000c80a0000310a00002c130000f91400000c000000352c000000000000ffffffff5c0f0000c84d8500784e8500884e85000000000000000000000000004c010000fc39a6590000000002000000050000000100000000008500280a000001000001cc0200009c0000000b00000050000000040000000010000000000000000000000001000000000000000000000000000034ff970078baa859384914005c0f0000c84d850001000000884e8500684f140008ff970064ff970000000000a8070000b0fe1200f40b00009cfb120000000000b8fb12000000000000000000ae20140000000000884e8500784e8500c84d8500a8fa120011204000ffffffff5c0f0000a80700000000000078ff970064ff970000000000adbf807c2025807cecff97000100000084ff970003000000c0110000f40b0000f40b0000a8fa120000000000010067470c0000006cff9700bc070000ffffffff000000006c1a4000f40b000000fa12000000000000004000a09d4000b0fe120083b6807cb0fe120000004000a09d4000b0fe120000e0fd7f00069c86c0ff9700d8863f86ffffffffa89a837c90b6807c000000000000000000000000301a4000b0fe120000000000\n\nMDException\n  thread_id                                  = 0xbf4\n  exception_record.exception_code            = 0xc0000005\n  exception_record.exception_flags           = 0x0\n  exception_record.exception_record          = 0x0\n  exception_record.exception_address         = 0x40429e\n  exception_record.number_parameters         = 2\n  exception_record.exception_information[ 0] = 0x1\n  exception_record.exception_information[ 1] = 0x45\n  thread_context.data_size                   = 716\n  thread_context.rva                         = 0xac8\n\nMDRawContextX86\n  context_flags                = 0x1003f\n  dr0                          = 0x0\n  dr1                          = 0x0\n  dr2                          = 0x0\n  dr3                          = 0x0\n  dr6                          = 0x0\n  dr7                          = 0x0\n  float_save.control_word      = 0xffff027f\n  float_save.status_word       = 0xffff0000\n  float_save.tag_word          = 0xffffffff\n  float_save.error_offset      = 0x0\n  float_save.error_selector    = 0x220000\n  float_save.data_offset       = 0x0\n  float_save.data_selector     = 0xffff0000\n  float_save.register_area[80] = 0x0000000018b72200000118b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n  float_save.cr0_npx_state     = 0x0\n  gs                           = 0x0\n  fs                           = 0x3b\n  es                           = 0x23\n  ds                           = 0x23\n  edi                          = 0xa28\n  esi                          = 0x2\n  ebx                          = 0x7c80abc1\n  edx                          = 0x42bc58\n  ecx                          = 0x12fe94\n  eax                          = 0x45\n  ebp                          = 0x12fe88\n  eip                          = 0x40429e\n  cs                           = 0x1b\n  eflags                       = 0x10246\n  esp                          = 0x12fe84\n  ss                           = 0x23\n  extended_registers[512]      = 0x7f0200000000220000000000000000000000000000000000801f0000ffff00000000000018b72200000100000000000018b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004509917c4e09917c38b622002400020024b42200020000009041917c0070fd7f0510907cccb22200000000009cb3220018ee907c7009917cc0e4977c6f3e917c623e917c08020000dcb62200b4b622001e000000000000000000000000000000000000002eb42200000000000f000000020000001e00200000fcfd7f2f63796764726976652f632f444f43554d457e312f4d4d454e544f7e312f4c4f43414c537e312f54656d7000000000000000000130b422000000004300000000000000001efcfd7f4509917c4e09917c5ad9000008b32200b4b62200\n\nMDRawSystemInfo\n  processor_architecture                     = 0\n  processor_level                            = 6\n  processor_revision                         = 0xd08\n  number_of_processors                       = 1\n  product_type                               = 1\n  major_version                              = 5\n  minor_version                              = 1\n  build_number                               = 2600\n  platform_id                                = 2\n  csd_version_rva                            = 0x768\n  suite_mask                                 = 0x100\n  cpu.x86_cpu_info.vendor_id[0]              = 0x756e6547\n  cpu.x86_cpu_info.vendor_id[1]              = 0x49656e69\n  cpu.x86_cpu_info.vendor_id[2]              = 0x6c65746e\n  cpu.x86_cpu_info.version_information       = 0x6d8\n  cpu.x86_cpu_info.feature_information       = 0xafe9fbff\n  cpu.x86_cpu_info.amd_extended_cpu_features = 0xffffffff\n  (csd_version)                              = \"Service Pack 2\"\n  (cpu_vendor)                               = \"GenuineIntel\"\n\nMDRawMiscInfo\n  size_of_info                 = 24\n  flags1                       = 0x3\n  process_id                   = 0xf5c\n  process_create_time          = 0x45d35f73\n  process_user_time            = 0x0\n  process_kernel_time          = 0x0\n\nMDRawBreakpadInfo\n  validity             = 0x3\n  dump_thread_id       = 0x11c0\n  requesting_thread_id = 0xbf4\n\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/testdata/minidump2.stackwalk.machine_readable.out",
    "content": "OS|Windows NT|5.1.2600 Service Pack 2\nCPU|x86|GenuineIntel family 6 model 13 stepping 8|1\nCrash|EXCEPTION_ACCESS_VIOLATION_WRITE|0x45|0\nModule|test_app.exe||test_app.pdb|5A9832E5287241C1838ED98914E9B7FF1|0x00400000|0x0042cfff|1\nModule|dbghelp.dll|5.1.2600.2180|dbghelp.pdb|39559573E21B46F28E286923BE9E6A761|0x59a60000|0x59b00fff|0\nModule|imm32.dll|5.1.2600.2180|imm32.pdb|2C17A49C251B4C8EB9E2AD13D7D9EA162|0x76390000|0x763acfff|0\nModule|psapi.dll|5.1.2600.2180|psapi.pdb|A5C3A1F9689F43D8AD228A09293889702|0x76bf0000|0x76bfafff|0\nModule|ole32.dll|5.1.2600.2726|ole32.pdb|683B65B246F4418796D2EE6D4C55EB112|0x774e0000|0x7761cfff|0\nModule|version.dll|5.1.2600.2180|version.pdb|180A90C40384463E82DDC45B2C8AB76E2|0x77c00000|0x77c07fff|0\nModule|msvcrt.dll|7.0.2600.2180|msvcrt.pdb|A678F3C30DED426B839032B996987E381|0x77c10000|0x77c67fff|0\nModule|user32.dll|5.1.2600.2622|user32.pdb|EE2B714D83A34C9D88027621272F83262|0x77d40000|0x77dcffff|0\nModule|advapi32.dll|5.1.2600.2180|advapi32.pdb|455D6C5F184D45BBB5C5F30F829751142|0x77dd0000|0x77e6afff|0\nModule|rpcrt4.dll|5.1.2600.2180|rpcrt4.pdb|BEA45A721DA141DAA3BA86B3A20311532|0x77e70000|0x77f00fff|0\nModule|gdi32.dll|5.1.2600.2818|gdi32.pdb|C0EA66BE00A64BD7AEF79E443A91869C2|0x77f10000|0x77f56fff|0\nModule|kernel32.dll|5.1.2600.2945|kernel32.pdb|BCE8785C57B44245A669896B6A19B9542|0x7c800000|0x7c8f3fff|0\nModule|ntdll.dll|5.1.2600.2180|ntdll.pdb|36515FB5D04345E491F672FA2E2878C02|0x7c900000|0x7c9affff|0\n\n0|0|test_app.exe|`anonymous namespace'::CrashFunction|c:\\test_app.cc|58|0x3\n0|1|test_app.exe|main|c:\\test_app.cc|65|0x4\n0|2|test_app.exe|__tmainCRTStartup|f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0.c|327|0x11\n0|3|kernel32.dll|BaseProcessStart|||0x22\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/testdata/minidump2.stackwalk.out",
    "content": "Operating system: Windows NT\n                  5.1.2600 Service Pack 2\nCPU: x86\n     GenuineIntel family 6 model 13 stepping 8\n     1 CPU\n\nCrash reason:  EXCEPTION_ACCESS_VIOLATION_WRITE\nCrash address: 0x45\n\nThread 0 (crashed)\n 0  test_app.exe!`anonymous namespace'::CrashFunction [test_app.cc : 58 + 0x3]\n    eip = 0x0040429e   esp = 0x0012fe84   ebp = 0x0012fe88   ebx = 0x7c80abc1\n    esi = 0x00000002   edi = 0x00000a28   eax = 0x00000045   ecx = 0x0012fe94\n    edx = 0x0042bc58   efl = 0x00010246\n    Found by: given as instruction pointer in context\n 1  test_app.exe!main [test_app.cc : 65 + 0x4]\n    eip = 0x00404200   esp = 0x0012fe90   ebp = 0x0012ff70\n    Found by: call frame info\n 2  test_app.exe!__tmainCRTStartup [crt0.c : 327 + 0x11]\n    eip = 0x004053ec   esp = 0x0012ff78   ebp = 0x0012ffc0\n    Found by: call frame info\n 3  kernel32.dll!BaseProcessStart + 0x22\n    eip = 0x7c816fd7   esp = 0x0012ffc8   ebp = 0x0012fff0\n    Found by: call frame info\n\nLoaded modules:\n0x00400000 - 0x0042cfff  test_app.exe  ???  (main)\n0x59a60000 - 0x59b00fff  dbghelp.dll  5.1.2600.2180\n0x76390000 - 0x763acfff  imm32.dll  5.1.2600.2180\n0x76bf0000 - 0x76bfafff  psapi.dll  5.1.2600.2180\n0x774e0000 - 0x7761cfff  ole32.dll  5.1.2600.2726\n0x77c00000 - 0x77c07fff  version.dll  5.1.2600.2180\n0x77c10000 - 0x77c67fff  msvcrt.dll  7.0.2600.2180\n0x77d40000 - 0x77dcffff  user32.dll  5.1.2600.2622\n0x77dd0000 - 0x77e6afff  advapi32.dll  5.1.2600.2180\n0x77e70000 - 0x77f00fff  rpcrt4.dll  5.1.2600.2180\n0x77f10000 - 0x77f56fff  gdi32.dll  5.1.2600.2818\n0x7c800000 - 0x7c8f3fff  kernel32.dll  5.1.2600.2945\n0x7c900000 - 0x7c9affff  ntdll.dll  5.1.2600.2180\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/testdata/module0.out",
    "content": "MODULE windows x86 5A9832E5287241C1838ED98914E9B7FF1 test_app.pdb\nFILE 1 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winbase.h\nFILE 2 c:\\program files\\microsoft visual studio 8\\vc\\include\\typeinfo\nFILE 3 c:\\breakpad\\trunk\\src\\common\\windows\\guid_string.h\nFILE 4 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcdce.h\nFILE 5 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winreg.h\nFILE 6 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\objidl.h\nFILE 7 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wtypes.h\nFILE 8 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\tvout.h\nFILE 9 c:\\program files\\microsoft visual studio 8\\vc\\include\\malloc.h\nFILE 10 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack2.h\nFILE 11 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winuser.h\nFILE 12 c:\\breakpad\\trunk\\src\\client\\windows\\handler\\exception_handler.cc\nFILE 13 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\urlmon.h\nFILE 14 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wincon.h\nFILE 15 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\imm.h\nFILE 16 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcdcep.h\nFILE 17 c:\\program files\\microsoft visual studio 8\\vc\\include\\xstring\nFILE 18 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winver.h\nFILE 19 c:\\program files\\microsoft visual studio 8\\vc\\include\\xmemory\nFILE 20 c:\\program files\\microsoft visual studio 8\\vc\\include\\new\nFILE 21 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack4.h\nFILE 22 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\reason.h\nFILE 23 c:\\program files\\microsoft visual studio 8\\vc\\include\\vector\nFILE 24 c:\\program files\\microsoft visual studio 8\\vc\\include\\memory\nFILE 25 c:\\program files\\microsoft visual studio 8\\vc\\include\\wtime.inl\nFILE 26 c:\\program files\\microsoft visual studio 8\\vc\\include\\iterator\nFILE 27 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\propidl.h\nFILE 28 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack1.h\nFILE 29 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\specstrings.h\nFILE 30 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\basetsd.h\nFILE 31 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winerror.h\nFILE 32 c:\\program files\\microsoft visual studio 8\\vc\\include\\assert.h\nFILE 33 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\poppack.h\nFILE 34 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstdio\nFILE 35 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdio.h\nFILE 36 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcnterr.h\nFILE 37 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcasync.h\nFILE 38 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcnsi.h\nFILE 39 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdlib.h\nFILE 40 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\servprov.h\nFILE 41 c:\\program files\\microsoft visual studio 8\\vc\\include\\limits.h\nFILE 42 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcndr.h\nFILE 43 c:\\breakpad\\trunk\\src\\client\\windows\\handler\\exception_handler.h\nFILE 44 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcnsip.h\nFILE 45 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\dbghelp.h\nFILE 46 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winnetwk.h\nFILE 47 c:\\program files\\microsoft visual studio 8\\vc\\include\\share.h\nFILE 48 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack8.h\nFILE 49 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\stralign.h\nFILE 50 c:\\breakpad\\trunk\\src\\google_breakpad\\common\\minidump_format.h\nFILE 51 c:\\breakpad\\trunk\\src\\google_breakpad\\common\\breakpad_types.h\nFILE 52 c:\\program files\\microsoft visual studio 8\\vc\\include\\xdebug\nFILE 53 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdarg.h\nFILE 54 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\windef.h\nFILE 55 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winsvc.h\nFILE 56 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wingdi.h\nFILE 57 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocinfo\nFILE 58 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocinfo.h\nFILE 59 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\oleidl.h\nFILE 60 c:\\program files\\microsoft visual studio 8\\vc\\include\\locale.h\nFILE 61 c:\\program files\\microsoft visual studio 8\\vc\\include\\string\nFILE 62 c:\\program files\\microsoft visual studio 8\\vc\\include\\istream\nFILE 63 c:\\breakpad\\trunk\\src\\common\\windows\\string_utils-inl.h\nFILE 64 c:\\program files\\microsoft visual studio 8\\vc\\include\\ostream\nFILE 65 c:\\program files\\microsoft visual studio 8\\vc\\include\\xutility\nFILE 66 c:\\program files\\microsoft visual studio 8\\vc\\include\\wchar.h\nFILE 67 c:\\program files\\microsoft visual studio 8\\vc\\include\\utility\nFILE 68 c:\\program files\\microsoft visual studio 8\\vc\\include\\ios\nFILE 69 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocnum\nFILE 70 c:\\program files\\microsoft visual studio 8\\vc\\include\\iosfwd\nFILE 71 c:\\program files\\microsoft visual studio 8\\vc\\include\\swprintf.inl\nFILE 72 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\guiddef.h\nFILE 73 c:\\program files\\microsoft visual studio 8\\vc\\include\\cwchar\nFILE 74 c:\\program files\\microsoft visual studio 8\\vc\\include\\climits\nFILE 75 c:\\program files\\microsoft visual studio 8\\vc\\include\\crtdbg.h\nFILE 76 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstdlib\nFILE 77 c:\\program files\\microsoft visual studio 8\\vc\\include\\streambuf\nFILE 78 c:\\program files\\microsoft visual studio 8\\vc\\include\\xiosbase\nFILE 79 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocale\nFILE 80 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstring\nFILE 81 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\mcx.h\nFILE 82 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdexcept\nFILE 83 c:\\program files\\microsoft visual studio 8\\vc\\include\\exception\nFILE 84 c:\\program files\\microsoft visual studio 8\\vc\\include\\xstddef\nFILE 85 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\objbase.h\nFILE 86 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstddef\nFILE 87 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\unknwn.h\nFILE 88 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpc.h\nFILE 89 c:\\program files\\microsoft visual studio 8\\vc\\include\\stddef.h\nFILE 90 c:\\program files\\microsoft visual studio 8\\vc\\include\\cassert\nFILE 91 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\ole2.h\nFILE 92 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\windows.h\nFILE 93 c:\\program files\\microsoft visual studio 8\\vc\\include\\yvals.h\nFILE 94 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\oleauto.h\nFILE 95 c:\\program files\\microsoft visual studio 8\\vc\\include\\excpt.h\nFILE 96 c:\\program files\\microsoft visual studio 8\\vc\\include\\use_ansi.h\nFILE 97 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\cguid.h\nFILE 98 c:\\program files\\microsoft visual studio 8\\vc\\include\\crtdefs.h\nFILE 99 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\msxml.h\nFILE 100 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\oaidl.h\nFILE 101 c:\\program files\\microsoft visual studio 8\\vc\\include\\sal.h\nFILE 102 c:\\program files\\microsoft visual studio 8\\vc\\include\\vadefs.h\nFILE 103 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winnt.h\nFILE 104 c:\\program files\\microsoft visual studio 8\\vc\\include\\ctype.h\nFILE 105 c:\\program files\\microsoft visual studio 8\\vc\\include\\eh.h\nFILE 106 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winnls.h\nFILE 107 c:\\program files\\microsoft visual studio 8\\vc\\include\\string.h\nFILE 108 c:\\program files\\microsoft visual studio 8\\vc\\include\\ctype.h\nFILE 109 c:\\program files\\microsoft visual studio 8\\vc\\include\\xutility\nFILE 110 c:\\program files\\microsoft visual studio 8\\vc\\include\\utility\nFILE 111 c:\\program files\\microsoft visual studio 8\\vc\\include\\iosfwd\nFILE 112 c:\\program files\\microsoft visual studio 8\\vc\\include\\cwchar\nFILE 113 c:\\program files\\microsoft visual studio 8\\vc\\include\\crtdbg.h\nFILE 114 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdexcept\nFILE 115 c:\\program files\\microsoft visual studio 8\\vc\\include\\exception\nFILE 116 c:\\program files\\microsoft visual studio 8\\vc\\include\\xstddef\nFILE 117 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstddef\nFILE 118 c:\\program files\\microsoft visual studio 8\\vc\\include\\stddef.h\nFILE 119 c:\\program files\\microsoft visual studio 8\\vc\\include\\eh.h\nFILE 120 c:\\program files\\microsoft visual studio 8\\vc\\include\\streambuf\nFILE 121 c:\\program files\\microsoft visual studio 8\\vc\\include\\xiosbase\nFILE 122 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocale\nFILE 123 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstring\nFILE 124 c:\\program files\\microsoft visual studio 8\\vc\\include\\string.h\nFILE 125 c:\\program files\\microsoft visual studio 8\\vc\\include\\typeinfo\nFILE 126 c:\\breakpad\\trunk\\src\\common\\windows\\guid_string.cc\nFILE 127 c:\\breakpad\\trunk\\src\\common\\windows\\string_utils-inl.h\nFILE 128 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdarg.h\nFILE 129 c:\\program files\\microsoft visual studio 8\\vc\\include\\string\nFILE 130 c:\\program files\\microsoft visual studio 8\\vc\\include\\istream\nFILE 131 c:\\program files\\microsoft visual studio 8\\vc\\include\\ostream\nFILE 132 c:\\program files\\microsoft visual studio 8\\vc\\include\\ios\nFILE 133 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocnum\nFILE 134 c:\\program files\\microsoft visual studio 8\\vc\\include\\climits\nFILE 135 c:\\program files\\microsoft visual studio 8\\vc\\include\\yvals.h\nFILE 136 c:\\program files\\microsoft visual studio 8\\vc\\include\\use_ansi.h\nFILE 137 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstdlib\nFILE 138 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdlib.h\nFILE 139 c:\\program files\\microsoft visual studio 8\\vc\\include\\malloc.h\nFILE 140 c:\\breakpad\\trunk\\src\\common\\windows\\guid_string.h\nFILE 141 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\guiddef.h\nFILE 142 c:\\program files\\microsoft visual studio 8\\vc\\include\\share.h\nFILE 143 c:\\program files\\microsoft visual studio 8\\vc\\include\\xstring\nFILE 144 c:\\program files\\microsoft visual studio 8\\vc\\include\\xmemory\nFILE 145 c:\\program files\\microsoft visual studio 8\\vc\\include\\new\nFILE 146 c:\\program files\\microsoft visual studio 8\\vc\\include\\locale.h\nFILE 147 c:\\program files\\microsoft visual studio 8\\vc\\include\\swprintf.inl\nFILE 148 c:\\program files\\microsoft visual studio 8\\vc\\include\\limits.h\nFILE 149 c:\\program files\\microsoft visual studio 8\\vc\\include\\wchar.h\nFILE 150 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstdio\nFILE 151 c:\\program files\\microsoft visual studio 8\\vc\\include\\crtdefs.h\nFILE 152 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdio.h\nFILE 153 c:\\program files\\microsoft visual studio 8\\vc\\include\\wtime.inl\nFILE 154 c:\\program files\\microsoft visual studio 8\\vc\\include\\sal.h\nFILE 155 c:\\program files\\microsoft visual studio 8\\vc\\include\\xdebug\nFILE 156 c:\\program files\\microsoft visual studio 8\\vc\\include\\vadefs.h\nFILE 157 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocinfo\nFILE 158 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocinfo.h\nFILE 159 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winnetwk.h\nFILE 160 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\urlmon.h\nFILE 161 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack8.h\nFILE 162 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\cderr.h\nFILE 163 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\shellapi.h\nFILE 164 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\dde.h\nFILE 165 c:\\program files\\microsoft visual studio 8\\vc\\include\\vector\nFILE 166 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdio.h\nFILE 167 c:\\program files\\microsoft visual studio 8\\vc\\include\\memory\nFILE 168 c:\\program files\\microsoft visual studio 8\\vc\\include\\iterator\nFILE 169 c:\\program files\\microsoft visual studio 8\\vc\\include\\malloc.h\nFILE 170 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdarg.h\nFILE 171 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\windef.h\nFILE 172 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wingdi.h\nFILE 173 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\imm.h\nFILE 174 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\mmsystem.h\nFILE 175 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winioctl.h\nFILE 176 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\guiddef.h\nFILE 177 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winsmcrd.h\nFILE 178 c:\\test_app.cc\nFILE 179 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\oaidl.h\nFILE 180 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\nb30.h\nFILE 181 c:\\program files\\microsoft visual studio 8\\vc\\include\\xstring\nFILE 182 c:\\program files\\microsoft visual studio 8\\vc\\include\\xmemory\nFILE 183 c:\\program files\\microsoft visual studio 8\\vc\\include\\new\nFILE 184 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\oleidl.h\nFILE 185 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winnls.h\nFILE 186 c:\\breakpad\\trunk\\src\\google_breakpad\\common\\minidump_format.h\nFILE 187 c:\\program files\\microsoft visual studio 8\\vc\\include\\string.h\nFILE 188 c:\\breakpad\\trunk\\src\\google_breakpad\\common\\breakpad_types.h\nFILE 189 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winnt.h\nFILE 190 c:\\program files\\microsoft visual studio 8\\vc\\include\\ctype.h\nFILE 191 c:\\program files\\microsoft visual studio 8\\vc\\include\\wtime.inl\nFILE 192 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winbase.h\nFILE 193 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\propidl.h\nFILE 194 c:\\breakpad\\trunk\\src\\client\\windows\\handler\\exception_handler.h\nFILE 195 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdlib.h\nFILE 196 c:\\program files\\microsoft visual studio 8\\vc\\include\\swprintf.inl\nFILE 197 c:\\program files\\microsoft visual studio 8\\vc\\include\\limits.h\nFILE 198 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winreg.h\nFILE 199 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpc.h\nFILE 200 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\ole2.h\nFILE 201 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winscard.h\nFILE 202 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\objbase.h\nFILE 203 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wtypes.h\nFILE 204 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcndr.h\nFILE 205 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcdce.h\nFILE 206 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcnsip.h\nFILE 207 c:\\program files\\microsoft visual studio 8\\vc\\include\\share.h\nFILE 208 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\tvout.h\nFILE 209 c:\\program files\\microsoft visual studio 8\\vc\\include\\use_ansi.h\nFILE 210 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winefs.h\nFILE 211 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack2.h\nFILE 212 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\commdlg.h\nFILE 213 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\unknwn.h\nFILE 214 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winsock.h\nFILE 215 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\stralign.h\nFILE 216 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winuser.h\nFILE 217 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\servprov.h\nFILE 218 c:\\program files\\microsoft visual studio 8\\vc\\include\\xdebug\nFILE 219 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winsvc.h\nFILE 220 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wincon.h\nFILE 221 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocinfo\nFILE 222 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocinfo.h\nFILE 223 c:\\program files\\microsoft visual studio 8\\vc\\include\\locale.h\nFILE 224 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\cguid.h\nFILE 225 c:\\program files\\microsoft visual studio 8\\vc\\include\\string\nFILE 226 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winver.h\nFILE 227 c:\\program files\\microsoft visual studio 8\\vc\\include\\istream\nFILE 228 c:\\program files\\microsoft visual studio 8\\vc\\include\\ostream\nFILE 229 c:\\program files\\microsoft visual studio 8\\vc\\include\\xutility\nFILE 230 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winperf.h\nFILE 231 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack4.h\nFILE 232 c:\\program files\\microsoft visual studio 8\\vc\\include\\utility\nFILE 233 c:\\program files\\microsoft visual studio 8\\vc\\include\\ios\nFILE 234 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocnum\nFILE 235 c:\\program files\\microsoft visual studio 8\\vc\\include\\crtdbg.h\nFILE 236 c:\\program files\\microsoft visual studio 8\\vc\\include\\iosfwd\nFILE 237 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcdcep.h\nFILE 238 c:\\program files\\microsoft visual studio 8\\vc\\include\\cwchar\nFILE 239 c:\\program files\\microsoft visual studio 8\\vc\\include\\climits\nFILE 240 c:\\program files\\microsoft visual studio 8\\vc\\include\\wchar.h\nFILE 241 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstdlib\nFILE 242 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\mcx.h\nFILE 243 c:\\program files\\microsoft visual studio 8\\vc\\include\\streambuf\nFILE 244 c:\\program files\\microsoft visual studio 8\\vc\\include\\xiosbase\nFILE 245 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\reason.h\nFILE 246 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocale\nFILE 247 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\dlgs.h\nFILE 248 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstring\nFILE 249 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdexcept\nFILE 250 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack1.h\nFILE 251 c:\\program files\\microsoft visual studio 8\\vc\\include\\exception\nFILE 252 c:\\program files\\microsoft visual studio 8\\vc\\include\\xstddef\nFILE 253 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\specstrings.h\nFILE 254 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstddef\nFILE 255 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\basetsd.h\nFILE 256 c:\\program files\\microsoft visual studio 8\\vc\\include\\stddef.h\nFILE 257 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winerror.h\nFILE 258 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wincrypt.h\nFILE 259 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\poppack.h\nFILE 260 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winspool.h\nFILE 261 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\oleauto.h\nFILE 262 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\prsht.h\nFILE 263 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\objidl.h\nFILE 264 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstdio\nFILE 265 c:\\program files\\microsoft visual studio 8\\vc\\include\\yvals.h\nFILE 266 c:\\program files\\microsoft visual studio 8\\vc\\include\\eh.h\nFILE 267 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\lzexpand.h\nFILE 268 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\ddeml.h\nFILE 269 c:\\program files\\microsoft visual studio 8\\vc\\include\\crtdefs.h\nFILE 270 c:\\program files\\microsoft visual studio 8\\vc\\include\\sal.h\nFILE 271 c:\\program files\\microsoft visual studio 8\\vc\\include\\vadefs.h\nFILE 272 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\dbghelp.h\nFILE 273 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcnterr.h\nFILE 274 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcasync.h\nFILE 275 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcnsi.h\nFILE 276 c:\\program files\\microsoft visual studio 8\\vc\\include\\typeinfo\nFILE 277 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\windows.h\nFILE 278 c:\\program files\\microsoft visual studio 8\\vc\\include\\excpt.h\nFILE 279 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\msxml.h\nFILE 280 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xdebug\nFILE 281 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\streambuf\nFILE 282 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xiosbase\nFILE 283 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xlocale\nFILE 284 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cstring\nFILE 285 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 286 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xlocinfo\nFILE 287 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xlocinfo.h\nFILE 288 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 289 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\share.h\nFILE 290 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\use_ansi.h\nFILE 291 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.cpp\nFILE 292 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\typeinfo\nFILE 293 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xutility\nFILE 294 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\utility\nFILE 295 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\iosfwd\nFILE 296 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cwchar\nFILE 297 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 298 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdexcept\nFILE 299 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\exception\nFILE 300 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xstddef\nFILE 301 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cstddef\nFILE 302 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 303 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\istream\nFILE 304 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ostream\nFILE 305 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ios\nFILE 306 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xlocnum\nFILE 307 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\eh.h\nFILE 308 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cstdlib\nFILE 309 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 310 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\climits\nFILE 311 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\yvals.h\nFILE 312 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 313 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 314 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 315 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 316 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 317 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cstdio\nFILE 318 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 319 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 320 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 321 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 322 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 323 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 324 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 325 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xstring\nFILE 326 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xmemory\nFILE 327 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\new\nFILE 328 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 329 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 330 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 331 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 332 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 333 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 334 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 335 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 336 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 337 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 338 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 339 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 340 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 341 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 342 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 343 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 344 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sect_attribs.h\nFILE 345 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 346 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 347 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 348 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 349 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 350 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\tran\\i386\\cpu_disp.c\nFILE 351 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 352 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 353 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 354 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 355 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 356 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 357 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 358 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 359 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 360 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 361 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 362 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 363 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 364 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 365 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 366 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 367 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 368 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 369 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 370 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 371 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 372 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 373 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 374 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 375 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 376 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 377 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 378 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 379 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 380 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 381 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 382 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 383 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 384 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 385 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sect_attribs.h\nFILE 386 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 387 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 388 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 389 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 390 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 391 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\tran\\i386\\mathfcns.c\nFILE 392 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 393 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 394 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 395 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 396 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 397 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 398 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 399 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 400 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 401 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 402 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 403 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 404 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 405 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 406 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 407 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 408 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 409 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 410 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 411 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 412 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 413 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 414 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 415 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 416 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctime.h\nFILE 417 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 418 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\time.h\nFILE 419 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 420 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 421 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 422 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\time.inl\nFILE 423 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 424 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 425 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 426 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 427 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 428 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 429 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 430 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 431 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 432 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 433 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 434 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 435 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 436 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 437 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 438 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 439 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 440 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tzset.c\nFILE 441 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 442 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 443 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 444 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 445 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 446 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 447 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 448 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 449 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 450 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 451 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 452 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 453 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 454 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 455 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 456 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 457 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 458 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 459 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\time.inl\nFILE 460 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 461 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 462 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 463 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 464 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 465 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 466 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 467 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 468 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 469 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 470 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 471 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 472 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 473 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 474 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 475 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 476 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 477 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 478 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 479 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 480 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 481 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 482 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 483 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 484 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 485 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 486 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 487 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\timeset.c\nFILE 488 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 489 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 490 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 491 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 492 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 493 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 494 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 495 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 496 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 497 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 498 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 499 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 500 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 501 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\time.h\nFILE 502 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 503 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 504 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\time.h\nFILE 505 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 506 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 507 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 508 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 509 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 510 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 511 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 512 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 513 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 514 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 515 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 516 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strftime.c\nFILE 517 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 518 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 519 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 520 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 521 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 522 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 523 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 524 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 525 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\time.inl\nFILE 526 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 527 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 528 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 529 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 530 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 531 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 532 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 533 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 534 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 535 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 536 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 537 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 538 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 539 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 540 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 541 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 542 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 543 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 544 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 545 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 546 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 547 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 548 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 549 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 550 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 551 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 552 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 553 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 554 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 555 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 556 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 557 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 558 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 559 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 560 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 561 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 562 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 563 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 564 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 565 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 566 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 567 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 568 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\days.c\nFILE 569 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 570 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 571 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 572 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 573 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 574 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 575 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 576 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 577 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 578 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 579 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 580 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 581 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 582 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 583 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 584 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 585 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 586 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 587 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 588 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 589 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 590 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 591 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 592 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 593 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 594 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 595 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 596 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 597 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 598 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 599 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 600 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 601 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 602 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 603 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strnicol.c\nFILE 604 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 605 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 606 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 607 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 608 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 609 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 610 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 611 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 612 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 613 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 614 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 615 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 616 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 617 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 618 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 619 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 620 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 621 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 622 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 623 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 624 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 625 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 626 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 627 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 628 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 629 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 630 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 631 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 632 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 633 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 634 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 635 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 636 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 637 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 638 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 639 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 640 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 641 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 642 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 643 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 644 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 645 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 646 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 647 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 648 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 649 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 650 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strnicmp.c\nFILE 651 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 652 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 653 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 654 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 655 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 656 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 657 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 658 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 659 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 660 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 661 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 662 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 663 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 664 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 665 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 666 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 667 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 668 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 669 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 670 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 671 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 672 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 673 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 674 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 675 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 676 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 677 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 678 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 679 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 680 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 681 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 682 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 683 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 684 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 685 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 686 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 687 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 688 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 689 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 690 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 691 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 692 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 693 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stricmp.c\nFILE 694 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 695 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 696 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 697 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 698 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 699 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 700 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 701 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 702 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 703 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 704 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 705 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 706 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 707 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 708 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 709 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 710 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 711 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 712 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 713 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 714 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 715 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 716 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 717 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 718 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 719 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 720 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 721 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 722 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 723 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 724 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 725 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 726 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 727 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 728 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 729 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 730 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 731 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wcslen.c\nFILE 732 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 733 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 734 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 735 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 736 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 737 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 738 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 739 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tcsncpy_s.inl\nFILE 740 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 741 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 742 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 743 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 744 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 745 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal_securecrt.h\nFILE 746 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 747 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 748 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 749 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 750 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 751 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 752 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 753 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 754 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 755 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 756 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 757 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 758 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strncpy_s.c\nFILE 759 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 760 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 761 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 762 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 763 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 764 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 765 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 766 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 767 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 768 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 769 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 770 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 771 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 772 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 773 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 774 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 775 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 776 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 777 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 778 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 779 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 780 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 781 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tcscpy_s.inl\nFILE 782 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 783 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 784 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 785 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 786 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 787 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal_securecrt.h\nFILE 788 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 789 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 790 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 791 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 792 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 793 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 794 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 795 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 796 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 797 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 798 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 799 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 800 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strcpy_s.c\nFILE 801 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 802 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 803 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 804 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 805 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 806 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 807 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 808 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 809 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 810 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 811 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 812 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 813 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 814 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 815 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 816 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 817 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 818 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 819 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 820 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 821 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 822 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 823 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tcscat_s.inl\nFILE 824 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 825 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 826 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 827 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 828 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 829 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal_securecrt.h\nFILE 830 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 831 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 832 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 833 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 834 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 835 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 836 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 837 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 838 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 839 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 840 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 841 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 842 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strcat_s.c\nFILE 843 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 844 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 845 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 846 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 847 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 848 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 849 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 850 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 851 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 852 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 853 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 854 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 855 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 856 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 857 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 858 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 859 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 860 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 861 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 862 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 863 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 864 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strlen_s.c\nFILE 865 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 866 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 867 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 868 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\strpbrk.asm\nFILE 869 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\Intel\\STRSPN.ASM\nFILE 870 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 871 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\_strnicm.asm\nFILE 872 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 873 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 874 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 875 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 876 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\intel\\strncmp.c\nFILE 877 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 878 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 879 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 880 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\strlen.asm\nFILE 881 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 882 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 883 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 884 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 885 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 886 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 887 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 888 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 889 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 890 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 891 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 892 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 893 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 894 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 895 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 896 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 897 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 898 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 899 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 900 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 901 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strdup.c\nFILE 902 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 903 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 904 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 905 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 906 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 907 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 908 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 909 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 910 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 911 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 912 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 913 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 914 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 915 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 916 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 917 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 918 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 919 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 920 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 921 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 922 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 923 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\strcspn.asm\nFILE 924 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\Intel\\STRSPN.ASM\nFILE 925 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 926 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\strcmp.asm\nFILE 927 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 928 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\strchr.asm\nFILE 929 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 930 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\string\\i386\\p4_memset.c\nFILE 931 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 932 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 933 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 934 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\memset.asm\nFILE 935 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 936 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 937 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 938 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 939 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 940 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 941 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 942 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 943 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 944 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 945 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 946 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 947 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 948 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 949 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 950 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 951 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 952 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 953 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 954 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 955 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\memmove_s.c\nFILE 956 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 957 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 958 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 959 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 960 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 961 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 962 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 963 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 964 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 965 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 966 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 967 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 968 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 969 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 970 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 971 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 972 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 973 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 974 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 975 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 976 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\memmove.asm\nFILE 977 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\Intel\\MEMCPY.ASM\nFILE 978 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 979 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\string\\i386\\memcmp.c\nFILE 980 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 981 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 982 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 983 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 984 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 985 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 986 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 987 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 988 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 989 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 990 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 991 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 992 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 993 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 994 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 995 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 996 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 997 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 998 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 999 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1000 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1001 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1002 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\memcpy_s.c\nFILE 1003 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1004 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1005 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1006 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1007 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1008 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1009 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1010 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1011 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1012 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1013 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1014 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1015 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1016 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1017 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1018 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1019 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1020 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1021 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1022 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1023 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\string\\i386\\p4_memcpy.c\nFILE 1024 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1025 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 1026 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 1027 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\memcpy.asm\nFILE 1028 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 1029 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1030 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1031 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1032 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1033 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1034 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1035 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1036 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1037 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1038 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1039 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1040 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\woutputs.c\nFILE 1041 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 1042 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1043 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1044 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1045 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1046 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1047 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1048 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1049 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1050 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1051 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1052 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1053 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\output.c\nFILE 1054 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1055 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1056 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1057 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1058 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1059 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1060 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1061 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1062 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1063 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1064 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1065 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1066 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1067 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1068 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1069 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1070 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cvt.h\nFILE 1071 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 1072 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1073 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1074 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 1075 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 1076 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1077 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1078 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1079 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1080 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1081 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1082 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1083 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 1084 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1085 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1086 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1087 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1088 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1089 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1090 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1091 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1092 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1093 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1094 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1095 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\woutputp.c\nFILE 1096 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 1097 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1098 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1099 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1100 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1101 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1102 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1103 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1104 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1105 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1106 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1107 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1108 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\output.c\nFILE 1109 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1110 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1111 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1112 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1113 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1114 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1115 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1116 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1117 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1118 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1119 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1120 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1121 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1122 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1123 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1124 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1125 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cvt.h\nFILE 1126 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 1127 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1128 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1129 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 1130 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 1131 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1132 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1133 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1134 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1135 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1136 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1137 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1138 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 1139 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1140 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1141 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1142 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1143 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1144 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1145 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1146 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1147 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1148 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1149 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1150 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\woutput.c\nFILE 1151 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 1152 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1153 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1154 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1155 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1156 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1157 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1158 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1159 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1160 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1161 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1162 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1163 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\output.c\nFILE 1164 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1165 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1166 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1167 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1168 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1169 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1170 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1171 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1172 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1173 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1174 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1175 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1176 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1177 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1178 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1179 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1180 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cvt.h\nFILE 1181 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 1182 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1183 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1184 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 1185 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 1186 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1187 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1188 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1189 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1190 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1191 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1192 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1193 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 1194 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1195 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1196 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1197 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1198 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1199 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1200 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1201 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1202 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1203 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1204 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1205 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 1206 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\outputs.c\nFILE 1207 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1208 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1209 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1210 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1211 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1212 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1213 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1214 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1215 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1216 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1217 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1218 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\output.c\nFILE 1219 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1220 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1221 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1222 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1223 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1224 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1225 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1226 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1227 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1228 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1229 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1230 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1231 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1232 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1233 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1234 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cvt.h\nFILE 1235 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 1236 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1237 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1238 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 1239 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 1240 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1241 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1242 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1243 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1244 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1245 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1246 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1247 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1248 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1249 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1250 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1251 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1252 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1253 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1254 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1255 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1256 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1257 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1258 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 1259 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\outputp.c\nFILE 1260 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1261 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1262 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1263 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1264 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1265 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1266 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1267 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1268 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1269 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1270 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1271 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\output.c\nFILE 1272 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1273 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1274 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1275 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1276 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1277 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1278 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1279 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1280 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1281 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1282 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1283 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1284 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1285 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1286 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1287 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cvt.h\nFILE 1288 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 1289 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1290 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1291 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 1292 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 1293 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1294 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1295 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1296 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1297 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1298 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1299 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1300 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1301 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1302 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1303 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1304 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1305 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1306 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1307 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1308 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1309 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1310 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1311 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 1312 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\output.c\nFILE 1313 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1314 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1315 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1316 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1317 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1318 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1319 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1320 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1321 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1322 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1323 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1324 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1325 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1326 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1327 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1328 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1329 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1330 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1331 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1332 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1333 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1334 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1335 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1336 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1337 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1338 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1339 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cvt.h\nFILE 1340 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 1341 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1342 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1343 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 1344 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 1345 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1346 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1347 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1348 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1349 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1350 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1351 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1352 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1353 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1354 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1355 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1356 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1357 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1358 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1359 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1360 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1361 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1362 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1363 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1364 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1365 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1366 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1367 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1368 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 1369 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1370 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1371 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1372 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1373 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1374 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vswprnc.c\nFILE 1375 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1376 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1377 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1378 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1379 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1380 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vswprint.c\nFILE 1381 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1382 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1383 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1384 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1385 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1386 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1387 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1388 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1389 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1390 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1391 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1392 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1393 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1394 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1395 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1396 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1397 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1398 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1399 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1400 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1401 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1402 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1403 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1404 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1405 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1406 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1407 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1408 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1409 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1410 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1411 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1412 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1413 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1414 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1415 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1416 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1417 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1418 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1419 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1420 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1421 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1422 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1423 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1424 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1425 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vswprint.c\nFILE 1426 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1427 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1428 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1429 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1430 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1431 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1432 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1433 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1434 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1435 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1436 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1437 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1438 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1439 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1440 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1441 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1442 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 1443 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1444 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1445 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1446 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1447 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1448 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1449 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1450 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1451 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1452 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1453 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1454 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1455 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1456 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1457 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1458 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1459 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1460 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1461 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1462 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vfprintf.c\nFILE 1463 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1464 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1465 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1466 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1467 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1468 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1469 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1470 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1471 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1472 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1473 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1474 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1475 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1476 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1477 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1478 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1479 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1480 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1481 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1482 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1483 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1484 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1485 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1486 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1487 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1488 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1489 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1490 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1491 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1492 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1493 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1494 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1495 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1496 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1497 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1498 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1499 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1500 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1501 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1502 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1503 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1504 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1505 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1506 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1507 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vprintf.c\nFILE 1508 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1509 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1510 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1511 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1512 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1513 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1514 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1515 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1516 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1517 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1518 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1519 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1520 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1521 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1522 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1523 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1524 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1525 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1526 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1527 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1528 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1529 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1530 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1531 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1532 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1533 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1534 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1535 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1536 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1537 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1538 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1539 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1540 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1541 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1542 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1543 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1544 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1545 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1546 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1547 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1548 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1549 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1550 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1551 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1552 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1553 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1554 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1555 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1556 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1557 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1558 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1559 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1560 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1561 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1562 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1563 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1564 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.c\nFILE 1565 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1566 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1567 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1568 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1569 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1570 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1571 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1572 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1573 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1574 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1575 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1576 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1577 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1578 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1579 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1580 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1581 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 1582 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1583 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1584 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1585 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1586 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1587 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1588 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1589 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1590 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1591 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1592 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1593 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1594 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1595 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1596 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1597 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1598 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1599 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1600 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1601 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\printf.c\nFILE 1602 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1603 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1604 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1605 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1606 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1607 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1608 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1609 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1610 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1611 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1612 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1613 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1614 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1615 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1616 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1617 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1618 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1619 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1620 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1621 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1622 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1623 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1624 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1625 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1626 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1627 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\process.h\nFILE 1628 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1629 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1630 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1631 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1632 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1633 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1634 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1635 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1636 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1637 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1638 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1639 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1640 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1641 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1642 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1643 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1644 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1645 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1646 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1647 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1648 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fprintf.c\nFILE 1649 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1650 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1651 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1652 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1653 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1654 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1655 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1656 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1657 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1658 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1659 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1660 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1661 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1662 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1663 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1664 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1665 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1666 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1667 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1668 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1669 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1670 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1671 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1672 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1673 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1674 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1675 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1676 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1677 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1678 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1679 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1680 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1681 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1682 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1683 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1684 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1685 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1686 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1687 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1688 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 1689 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1690 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1691 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1692 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1693 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1694 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1695 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1696 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1697 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1698 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1699 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1700 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1701 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1702 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1703 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1704 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fflush.c\nFILE 1705 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1706 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 1707 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1708 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1709 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1710 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1711 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1712 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1713 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1714 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1715 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1716 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1717 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1718 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1719 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1720 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1721 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1722 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1723 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1724 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1725 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1726 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1727 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1728 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1729 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1730 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1731 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1732 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1733 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1734 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1735 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1736 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1737 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1738 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1739 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1740 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1741 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1742 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1743 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1744 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1745 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1746 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1747 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1748 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1749 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1750 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1751 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1752 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fclose.c\nFILE 1753 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1754 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1755 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1756 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1757 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1758 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1759 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1760 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1761 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1762 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1763 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1764 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1765 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1766 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1767 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1768 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 1769 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1770 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1771 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1772 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1773 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1774 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1775 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1776 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1777 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1778 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1779 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1780 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1781 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1782 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1783 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1784 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1785 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1786 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1787 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1788 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 1789 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1790 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1791 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1792 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\closeall.c\nFILE 1793 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1794 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1795 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1796 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1797 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1798 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1799 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1800 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1801 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1802 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1803 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1804 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1805 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1806 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1807 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1808 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1809 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1810 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1811 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1812 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1813 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1814 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1815 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1816 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1817 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1818 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1819 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1820 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1821 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1822 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1823 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1824 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1825 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1826 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1827 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1828 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1829 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1830 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1831 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1832 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1833 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1834 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 1835 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1836 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1837 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1838 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1839 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1840 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 1841 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1842 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1843 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1844 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1845 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1846 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1847 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1848 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1849 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1850 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_sftbuf.c\nFILE 1851 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1852 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1853 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1854 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1855 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1856 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1857 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1858 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1859 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1860 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1861 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1862 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1863 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1864 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1865 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1866 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1867 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1868 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1869 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1870 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1871 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1872 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1873 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 1874 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1875 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1876 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1877 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1878 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1879 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1880 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1881 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1882 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1883 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1884 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1885 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1886 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1887 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1888 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1889 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1890 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1891 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1892 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1893 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_getbuf.c\nFILE 1894 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1895 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1896 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1897 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1898 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1899 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1900 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1901 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1902 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1903 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1904 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1905 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1906 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1907 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1908 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1909 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1910 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1911 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1912 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1913 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1914 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1915 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1916 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1917 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1918 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1919 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1920 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1921 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1922 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1923 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1924 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1925 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1926 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1927 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_freebuf.c\nFILE 1928 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1929 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1930 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1931 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1932 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1933 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1934 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1935 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1936 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1937 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1938 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1939 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1940 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1941 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1942 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1943 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1944 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1945 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1946 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1947 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1948 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1949 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1950 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1951 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1952 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1953 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1954 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1955 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1956 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1957 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1958 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1959 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1960 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1961 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1962 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1963 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1964 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1965 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1966 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1967 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1968 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1969 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1970 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1971 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1972 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1973 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1974 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1975 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1976 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1977 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 1978 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1979 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1980 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_flsbuf.c\nFILE 1981 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1982 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1983 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1984 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1985 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1986 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1987 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1988 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1989 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_flswbuf.c\nFILE 1990 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1991 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 1992 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1993 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1994 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1995 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1996 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1997 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1998 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1999 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2000 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2001 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 2002 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 2003 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2004 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2005 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2006 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2007 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2008 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2009 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2010 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2011 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2012 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2013 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2014 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2015 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2016 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2017 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2018 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2019 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2020 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2021 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2022 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2023 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2024 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2025 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 2026 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 2027 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2028 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 2029 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 2030 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2031 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2032 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2033 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2034 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2035 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2036 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2037 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 2038 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2039 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2040 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2041 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_flsbuf.c\nFILE 2042 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2043 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2044 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2045 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2046 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2047 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2048 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2049 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2050 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2051 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2052 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 2053 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 2054 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2055 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2056 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2057 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2058 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2059 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2060 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2061 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2062 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2063 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2064 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2065 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2066 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2067 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2068 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2069 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2070 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2071 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2072 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2073 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2074 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2075 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2076 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2077 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2078 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2079 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 2080 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 2081 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2082 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2083 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2084 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2085 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2086 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2087 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_file.c\nFILE 2088 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2089 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2090 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2091 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2092 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2093 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2094 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2095 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2096 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2097 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2098 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2099 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2100 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2101 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2102 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2103 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2104 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2105 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2106 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2107 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2108 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2109 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2110 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2111 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2112 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2113 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2114 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2115 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2116 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2117 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2118 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2119 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2120 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2121 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2122 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2123 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2124 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fputwc.c\nFILE 2125 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2126 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2127 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2128 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2129 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2130 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 2131 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2132 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2133 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 2134 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2135 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2136 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 2137 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 2138 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2139 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2140 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 2141 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2142 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2143 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2144 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2145 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2146 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2147 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2148 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2149 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2150 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2151 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2152 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 2153 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2154 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2155 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2156 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 2157 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2158 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2159 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2160 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2161 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2162 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2163 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2164 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2165 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2166 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2167 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2168 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2169 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2170 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2171 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2172 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2173 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2174 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2175 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2176 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fileno.c\nFILE 2177 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2178 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2179 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2180 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2181 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2182 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2183 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2184 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2185 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2186 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2187 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2188 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2189 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2190 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2191 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2192 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2193 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2194 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2195 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2196 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2197 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2198 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2199 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2200 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2201 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2202 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2203 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2204 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2205 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2206 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2207 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 2208 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2209 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2210 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2211 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2212 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2213 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2214 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2215 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2216 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2217 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2218 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 2219 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2220 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2221 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2222 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2223 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2224 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2225 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2226 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2227 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tidtable.c\nFILE 2228 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2229 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2230 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2231 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2232 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2233 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2234 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2235 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2236 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2237 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2238 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2239 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 2240 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2241 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2242 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2243 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2244 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 2245 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\memory.h\nFILE 2246 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2247 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 2248 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2249 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2250 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2251 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2252 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2253 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2254 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2255 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2256 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2257 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2258 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2259 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2260 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 2261 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2262 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 2263 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2264 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2265 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2266 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2267 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2268 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2269 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2270 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2271 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2272 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2273 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2274 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2275 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2276 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2277 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2278 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2279 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2280 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdenvp.c\nFILE 2281 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2282 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2283 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2284 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2285 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2286 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2287 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2288 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2289 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2290 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2291 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2292 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2293 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2294 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2295 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2296 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2297 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2298 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2299 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2300 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dos.h\nFILE 2301 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2302 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2303 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2304 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2305 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2306 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2307 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2308 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2309 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2310 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 2311 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 2312 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 2313 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2314 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2315 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2316 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2317 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2318 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2319 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2320 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2321 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2322 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdargv.c\nFILE 2323 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2324 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2325 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2326 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2327 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2328 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2329 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2330 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2331 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2332 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2333 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2334 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2335 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2336 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2337 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2338 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2339 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2340 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2341 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2342 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2343 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2344 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2345 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2346 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2347 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2348 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2349 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2350 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2351 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2352 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2353 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2354 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2355 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2356 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2357 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2358 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2359 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2360 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2361 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2362 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2363 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2364 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2365 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2366 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2367 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2368 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2369 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 2370 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2371 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mlock.c\nFILE 2372 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2373 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2374 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2375 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2376 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2377 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 2378 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2379 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2380 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2381 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2382 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2383 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2384 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2385 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2386 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2387 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2388 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2389 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2390 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2391 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2392 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2393 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2394 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2395 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2396 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2397 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 2398 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2399 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2400 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2401 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2402 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2403 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2404 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2405 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2406 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2407 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2408 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2409 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2410 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2411 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2412 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cmsgs.h\nFILE 2413 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2414 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 2415 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2416 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2417 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2418 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0msg.c\nFILE 2419 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2420 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2421 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2422 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2423 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2424 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2425 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2426 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2427 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2428 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2429 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2430 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2431 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2432 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2433 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2434 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2435 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2436 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2437 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2438 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2439 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2440 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2441 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2442 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2443 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2444 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2445 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2446 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2447 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2448 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2449 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2450 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2451 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2452 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 2453 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2454 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2455 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2456 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2457 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0init.c\nFILE 2458 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2459 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2460 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2461 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2462 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2463 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2464 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2465 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2466 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2467 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2468 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2469 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2470 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2471 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2472 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2473 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2474 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2475 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2476 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2477 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2478 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2479 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2480 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2481 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2482 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2483 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2484 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2485 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2486 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2487 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2488 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2489 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2490 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2491 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2492 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2493 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2494 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2495 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2496 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2497 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2498 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2499 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2500 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2501 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2502 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2503 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0fp.c\nFILE 2504 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2505 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2506 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2507 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2508 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2509 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2510 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2511 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2512 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2513 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2514 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2515 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2516 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2517 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2518 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2519 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2520 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2521 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2522 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2523 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2524 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2525 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2526 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2527 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2528 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\process.h\nFILE 2529 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2530 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2531 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2532 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2533 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2534 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2535 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2536 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2537 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 2538 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2539 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2540 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2541 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2542 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2543 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2544 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2545 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2546 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2547 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2548 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2549 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 2550 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 2551 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2552 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2553 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbdata.h\nFILE 2554 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 2555 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2556 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2557 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2558 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2559 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2560 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0dat.c\nFILE 2561 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2562 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2563 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2564 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2565 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2566 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2567 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2568 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2569 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2570 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dos.h\nFILE 2571 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2572 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2573 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2574 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2575 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2576 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2577 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2578 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2579 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2580 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2581 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2582 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2583 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2584 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2585 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2586 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 2587 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2588 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 2589 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2590 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\process.h\nFILE 2591 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 2592 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 2593 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2594 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2595 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2596 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2597 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2598 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2599 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2600 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dos.h\nFILE 2601 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2602 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2603 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2604 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2605 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2606 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2607 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 2608 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0.c\nFILE 2609 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2610 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2611 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2612 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2613 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2614 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2615 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2616 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2617 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2618 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2619 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2620 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2621 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2622 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2623 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2624 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2625 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2626 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2627 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2628 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2629 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2630 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 2631 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2632 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\alloca16.asm\nFILE 2633 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 2634 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\chkstk.asm\nFILE 2635 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 2636 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2637 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2638 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2639 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2640 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2641 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 2642 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2643 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 2644 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2645 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2646 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\rtc\\initsect.cpp\nFILE 2647 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2648 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2649 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2650 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2651 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 2652 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2653 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2654 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2655 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 2656 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2657 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 2658 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 2659 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2660 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 2661 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sect_attribs.h\nFILE 2662 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2663 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2664 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2665 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2666 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2667 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 2668 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2669 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2670 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\rtcapi.h\nFILE 2671 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2672 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 2673 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2674 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 2675 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 2676 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\rtcpriv.h\nFILE 2677 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2678 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\malloc.h\nFILE 2679 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 2680 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2681 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2682 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2683 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2684 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2685 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2686 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2687 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2688 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2689 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2690 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2691 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2692 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2693 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2694 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2695 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2696 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2697 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2698 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2699 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtombenv.c\nFILE 2700 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2701 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2702 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2703 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2704 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2705 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2706 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2707 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2708 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2709 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2710 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2711 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2712 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2713 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2714 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2715 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2716 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2717 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2718 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2719 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2720 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2721 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2722 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2723 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2724 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2725 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2726 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2727 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2728 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2729 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2730 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2731 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\float.h\nFILE 2732 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2733 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2734 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2735 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2736 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2737 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2738 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2739 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2740 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2741 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2742 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2743 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2744 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2745 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2746 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2747 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2748 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\signal.h\nFILE 2749 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2750 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2751 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2752 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winxfltr.c\nFILE 2753 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2754 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2755 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 2756 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2757 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2758 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2759 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2760 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2761 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2762 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2763 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2764 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2765 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtwrn.h\nFILE 2766 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2767 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2768 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2769 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2770 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2771 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2772 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2773 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2774 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2775 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2776 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2777 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2778 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2779 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2780 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2781 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2782 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2783 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2784 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2785 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winsig.c\nFILE 2786 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2787 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2788 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2789 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2790 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2791 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2792 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2793 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2794 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2795 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2796 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2797 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2798 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2799 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2800 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2801 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2802 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2803 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2804 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2805 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2806 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\signal.h\nFILE 2807 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2808 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2809 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2810 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2811 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\float.h\nFILE 2812 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtwrn.h\nFILE 2813 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2814 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 2815 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2816 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2817 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2818 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2819 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2820 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2821 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2822 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2823 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2824 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2825 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2826 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2827 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2828 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\w_str.c\nFILE 2829 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2830 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2831 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2832 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 2833 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2834 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2835 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2836 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2837 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2838 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2839 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2840 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2841 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2842 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2843 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2844 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2845 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2846 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2847 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2848 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 2849 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2850 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2851 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2852 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2853 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2854 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 2855 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2856 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2857 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2858 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2859 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2860 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2861 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2862 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2863 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2864 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2865 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2866 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2867 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2868 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2869 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2870 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2871 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2872 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2873 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2874 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 2875 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2876 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\w_loc.c\nFILE 2877 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2878 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2879 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2880 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 2881 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2882 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2883 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2884 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2885 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2886 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2887 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2888 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2889 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2890 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2891 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2892 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2893 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2894 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2895 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2896 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2897 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2898 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 2899 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2900 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2901 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2902 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2903 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2904 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2905 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2906 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2907 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2908 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2909 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2910 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2911 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2912 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2913 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2914 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 2915 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2916 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2917 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2918 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2919 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2920 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2921 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 2922 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2923 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2924 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2925 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 2926 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2927 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2928 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2929 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2930 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2931 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2932 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2933 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2934 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\convrtcp.c\nFILE 2935 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2936 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2937 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2938 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2939 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2940 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2941 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2942 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2943 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2944 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2945 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2946 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2947 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2948 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 2949 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2950 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2951 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2952 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2953 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2954 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2955 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2956 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2957 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2958 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2959 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2960 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2961 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 2962 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2963 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2964 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2965 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2966 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 2967 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2968 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2969 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2970 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2971 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2972 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2973 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2974 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2975 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2976 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2977 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 2978 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2979 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2980 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2981 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2982 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2983 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2984 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2985 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2986 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2987 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 2988 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2989 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2990 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2991 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2992 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2993 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 2994 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2995 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.c\nFILE 2996 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2997 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2998 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2999 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3000 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3001 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3002 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3003 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3004 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3005 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3006 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3007 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3008 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3009 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3010 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3011 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3012 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3013 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3014 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 3015 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 3016 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3017 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3018 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3019 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3020 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3021 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 3022 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3023 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3024 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3025 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3026 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3027 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3028 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3029 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 3030 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3031 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3032 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3033 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3034 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3035 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3036 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setenv.c\nFILE 3037 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3038 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3039 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3040 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3041 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3042 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3043 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3044 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3045 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3046 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3047 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3048 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3049 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3050 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3051 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3052 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3053 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3054 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3055 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3056 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3057 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3058 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3059 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3060 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3061 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3062 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3063 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3064 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3065 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3066 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3067 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3068 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3069 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3070 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3071 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3072 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3073 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3074 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3075 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rand_s.c\nFILE 3076 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3077 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3078 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3079 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3080 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3081 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3082 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3083 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3084 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3085 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3086 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3087 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3088 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3089 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 3090 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3091 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3092 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3093 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3094 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3095 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3096 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3097 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3098 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3099 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3100 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3101 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3102 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3103 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 3104 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3105 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3106 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3107 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3108 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3109 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3110 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3111 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3112 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3113 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3114 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3115 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3116 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3117 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3118 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3119 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\purevirt.c\nFILE 3120 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3121 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3122 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3123 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3124 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3125 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3126 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3127 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3128 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3129 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3130 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3131 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3132 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3133 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3134 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3135 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3136 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3137 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3138 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3139 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3140 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3141 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3142 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3143 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3144 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3145 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3146 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3147 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3148 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3149 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3150 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3151 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3152 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3153 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3154 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3155 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3156 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3157 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3158 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3159 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\pesect.c\nFILE 3160 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3161 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3162 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3163 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3164 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3165 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3166 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3167 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3168 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3169 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3170 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3171 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3172 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3173 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3174 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3175 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3176 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3177 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3178 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3179 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3180 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3181 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3182 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3183 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3184 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3185 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3186 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3187 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3188 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3189 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3190 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3191 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 3192 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3193 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3194 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3195 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3196 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3197 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3198 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3199 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3200 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3201 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3202 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3203 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3204 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3205 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3206 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\nlsdata2.c\nFILE 3207 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3208 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3209 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3210 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3211 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3212 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3213 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3214 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3215 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3216 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3217 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3218 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3219 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3220 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3221 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3222 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3223 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3224 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\nlsdata1.c\nFILE 3225 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3226 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3227 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3228 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3229 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\nlsint.h\nFILE 3230 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3231 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3232 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3233 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3234 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3235 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3236 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3237 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 3238 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3239 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3240 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3241 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3242 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3243 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3244 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3245 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3246 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3247 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3248 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3249 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3250 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3251 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3252 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3253 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 3254 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3255 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3256 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3257 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3258 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 3259 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\onexit.c\nFILE 3260 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3261 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3262 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3263 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3264 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3265 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3266 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3267 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3268 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3269 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3270 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3271 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3272 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3273 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3274 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3275 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3276 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3277 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3278 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3279 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3280 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3281 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3282 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3283 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3284 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3285 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3286 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3287 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3288 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3289 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3290 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3291 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3292 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3293 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3294 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3295 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3296 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3297 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3298 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3299 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3300 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3301 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3302 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\lconv.c\nFILE 3303 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3304 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3305 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3306 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3307 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3308 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3309 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3310 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3311 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3312 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3313 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3314 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3315 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3316 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3317 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3318 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3319 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3320 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3321 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3322 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3323 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3324 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3325 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 3326 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3327 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3328 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\invarg.c\nFILE 3329 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3330 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3331 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3332 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3333 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3334 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3335 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3336 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3337 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3338 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3339 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3340 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 3341 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3342 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3343 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3344 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3345 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3346 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3347 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3348 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3349 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3350 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3351 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3352 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3353 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3354 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3355 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3356 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3357 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3358 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3359 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3360 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3361 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3362 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 3363 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3364 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3365 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3366 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3367 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3368 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3369 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3370 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3371 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3372 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3373 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3374 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3375 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3376 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3377 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3378 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3379 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\inittime.c\nFILE 3380 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3381 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3382 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3383 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3384 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3385 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3386 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3387 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3388 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3389 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3390 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3391 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3392 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3393 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3394 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3395 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3396 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3397 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3398 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3399 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3400 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3401 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3402 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3403 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3404 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3405 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3406 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 3407 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3408 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3409 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3410 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3411 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3412 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3413 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3414 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3415 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3416 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3417 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3418 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3419 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3420 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3421 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3422 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3423 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3424 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3425 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3426 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3427 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\initnum.c\nFILE 3428 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\nlsint.h\nFILE 3429 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3430 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3431 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3432 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3433 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3434 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3435 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3436 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3437 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3438 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3439 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3440 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3441 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3442 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3443 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3444 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3445 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3446 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3447 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3448 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3449 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3450 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3451 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3452 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3453 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 3454 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3455 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3456 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3457 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3458 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3459 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3460 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3461 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3462 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3463 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3464 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3465 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3466 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3467 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3468 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3469 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3470 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\initmon.c\nFILE 3471 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3472 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3473 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3474 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3475 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3476 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3477 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3478 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3479 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3480 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3481 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3482 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3483 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3484 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3485 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3486 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3487 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3488 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3489 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3490 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3491 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3492 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3493 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3494 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3495 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3496 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3497 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3498 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3499 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3500 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3501 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3502 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3503 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3504 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3505 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 3506 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3507 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3508 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3509 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3510 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3511 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3512 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3513 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3514 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3515 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3516 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3517 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3518 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3519 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3520 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3521 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3522 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3523 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\inithelp.c\nFILE 3524 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3525 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3526 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3527 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3528 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3529 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3530 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3531 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3532 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3533 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3534 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3535 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3536 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3537 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3538 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3539 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3540 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3541 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3542 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3543 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3544 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 3545 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3546 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3547 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3548 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3549 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3550 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3551 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3552 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3553 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3554 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3555 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3556 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3557 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3558 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3559 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3560 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3561 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3562 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\initctyp.c\nFILE 3563 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 3564 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3565 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3566 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3567 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3568 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3569 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3570 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3571 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3572 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3573 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3574 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3575 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3576 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3577 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3578 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3579 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3580 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3581 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3582 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3583 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3584 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3585 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3586 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3587 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3588 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3589 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3590 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3591 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 3592 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3593 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3594 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3595 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3596 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3597 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3598 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3599 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3600 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3601 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3602 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3603 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3604 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3605 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3606 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3607 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3608 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3609 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\initcrit.c\nFILE 3610 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3611 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3612 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3613 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3614 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3615 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3616 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3617 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3618 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3619 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3620 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3621 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3622 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3623 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3624 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3625 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3626 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3627 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3628 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3629 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3630 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3631 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3632 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3633 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3634 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3635 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3636 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3637 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3638 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3639 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3640 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3641 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3642 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3643 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3644 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3645 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3646 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3647 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3648 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3649 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3650 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\initcoll.c\nFILE 3651 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3652 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3653 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3654 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3655 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3656 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3657 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3658 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3659 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3660 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3661 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3662 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3663 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3664 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3665 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3666 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3667 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3668 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3669 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3670 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3671 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3672 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3673 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3674 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3675 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3676 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3677 f:\\binaries.x86ret\\vcboot\\inc\\mm3dnow.h\nFILE 3678 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3679 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 3680 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3681 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3682 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3683 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3684 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3685 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3686 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3687 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3688 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3689 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\gs_support.c\nFILE 3690 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3691 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3692 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\intrin.h\nFILE 3693 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setjmp.h\nFILE 3694 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3695 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3696 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3697 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3698 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3699 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3700 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3701 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3702 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3703 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3704 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3705 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3706 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 3707 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3708 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3709 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3710 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3711 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3712 f:\\binaries.x86ret\\vcboot\\inc\\emmintrin.h\nFILE 3713 f:\\binaries.x86ret\\vcboot\\inc\\xmmintrin.h\nFILE 3714 f:\\binaries.x86ret\\vcboot\\inc\\mmintrin.h\nFILE 3715 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3716 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3717 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3718 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3719 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3720 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3721 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3722 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3723 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3724 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3725 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3726 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3727 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3728 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3729 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3730 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3731 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\gs_report.c\nFILE 3732 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3733 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3734 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3735 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3736 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3737 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3738 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3739 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3740 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3741 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3742 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3743 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3744 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3745 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3746 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3747 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3748 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3749 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3750 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3751 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3752 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3753 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3754 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3755 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3756 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3757 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3758 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3759 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3760 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3761 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3762 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3763 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3764 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3765 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3766 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3767 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3768 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3769 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\gs_cookie.c\nFILE 3770 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3771 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3772 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3773 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3774 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3775 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3776 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3777 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3778 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3779 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3780 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3781 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3782 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3783 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3784 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3785 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3786 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3787 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3788 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3789 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3790 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3791 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3792 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3793 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3794 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3795 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3796 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3797 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3798 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3799 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3800 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3801 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3802 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3803 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3804 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3805 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3806 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3807 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3808 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3809 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3810 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3811 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3812 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3813 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3814 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3815 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\glstatus.c\nFILE 3816 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3817 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3818 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3819 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3820 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3821 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3822 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3823 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3824 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3825 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3826 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3827 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3828 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3829 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3830 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3831 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3832 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3833 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3834 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3835 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3836 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3837 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3838 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3839 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3840 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3841 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3842 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3843 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3844 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3845 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3846 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3847 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3848 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3849 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\getqloc.c\nFILE 3850 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 3851 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3852 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3853 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3854 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3855 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3856 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3857 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3858 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3859 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3860 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3861 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3862 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3863 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3864 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3865 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3866 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3867 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3868 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3869 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3870 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3871 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3872 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3873 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3874 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3875 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3876 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3877 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3878 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3879 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3880 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3881 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3882 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3883 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3884 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3885 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3886 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3887 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3888 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3889 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3890 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3891 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3892 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3893 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3894 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 3895 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3896 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3897 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3898 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3899 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3900 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 3901 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 3902 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3903 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3904 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\getenv.c\nFILE 3905 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3906 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 3907 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3908 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3909 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3910 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3911 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3912 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3913 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3914 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3915 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3916 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3917 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3918 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3919 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3920 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3921 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3922 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3923 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3924 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3925 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3926 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3927 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3928 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3929 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3930 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3931 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3932 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3933 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3934 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3935 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3936 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3937 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errmode.c\nFILE 3938 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3939 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3940 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3941 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3942 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3943 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3944 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3945 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3946 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3947 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3948 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3949 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3950 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3951 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3952 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3953 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3954 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3955 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3956 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3957 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3958 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3959 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3960 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3961 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3962 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3963 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3964 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3965 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3966 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbghook.c\nFILE 3967 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3968 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3969 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3970 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3971 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3972 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3973 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3974 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3975 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3976 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3977 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3978 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3979 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3980 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3981 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3982 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3983 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3984 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3985 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 3986 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.c\nFILE 3987 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3988 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 3989 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3990 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3991 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3992 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3993 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3994 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3995 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3996 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3997 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3998 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3999 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4000 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4001 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4002 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4003 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4004 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 4005 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4006 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4007 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4008 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4009 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4010 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4011 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4012 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4013 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4014 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4015 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4016 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4017 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4018 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4019 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4020 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4021 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4022 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4023 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4024 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4025 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4026 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4027 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 4028 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 4029 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4030 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4031 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4032 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4033 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtmbox.c\nFILE 4034 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4035 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4036 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4037 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4038 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4039 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4040 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4041 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4042 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4043 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4044 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4045 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4046 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4047 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4048 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4049 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4050 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4051 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4052 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4053 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4054 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4055 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4056 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4057 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4058 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 4059 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4060 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4061 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4062 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4063 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4064 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4065 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4066 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4067 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4068 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4069 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4070 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4071 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4072 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4073 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4074 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cmiscdat.c\nFILE 4075 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4076 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4077 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4078 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4079 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4080 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4081 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4082 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4083 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4084 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4085 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4086 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4087 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4088 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4089 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4090 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4091 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4092 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4093 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4094 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4095 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4096 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4097 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4098 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4099 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4100 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 4101 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\signal.h\nFILE 4102 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4103 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4104 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4105 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4106 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4107 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4108 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4109 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4110 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4111 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4112 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4113 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4114 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4115 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4116 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4117 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4118 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4119 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\abort.c\nFILE 4120 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4121 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4122 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4123 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4124 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4125 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4126 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4127 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4128 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4129 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4130 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4131 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4132 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4133 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4134 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4135 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4136 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4137 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4138 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4139 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4140 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4141 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4142 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4143 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4144 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 4145 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4146 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4147 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4148 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4149 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4150 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4151 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4152 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4153 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4154 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4155 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\a_str.c\nFILE 4156 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4157 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4158 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4159 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4160 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4161 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4162 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4163 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4164 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4165 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4166 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4167 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4168 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4169 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4170 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4171 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4172 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4173 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4174 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4175 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4176 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4177 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4178 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4179 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4180 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4181 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4182 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4183 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4184 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4185 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4186 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4187 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4188 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4189 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4190 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4191 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4192 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 4193 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4194 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4195 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4196 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4197 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4198 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4199 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4200 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4201 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4202 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4203 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\a_map.c\nFILE 4204 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4205 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4206 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4207 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4208 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4209 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4210 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4211 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4212 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4213 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4214 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4215 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4216 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4217 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4218 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4219 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4220 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4221 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4222 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4223 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4224 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4225 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4226 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4227 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4228 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4229 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4230 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4231 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4232 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4233 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4234 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4235 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4236 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4237 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4238 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4239 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4240 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4241 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4242 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4243 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4244 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4245 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4246 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4247 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4248 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4249 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4250 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4251 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\a_loc.c\nFILE 4252 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4253 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4254 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4255 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4256 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4257 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4258 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4259 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4260 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4261 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4262 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4263 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4264 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4265 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4266 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4267 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4268 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4269 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4270 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 4271 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4272 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4273 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4274 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4275 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4276 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4277 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4278 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4279 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4280 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4281 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4282 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4283 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4284 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4285 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4286 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4287 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4288 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4289 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4290 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4291 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4292 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4293 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4294 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4295 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4296 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4297 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4298 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4299 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4300 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4301 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4302 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4303 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4304 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4305 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4306 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4307 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\a_env.c\nFILE 4308 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4309 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4310 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4311 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4312 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4313 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4314 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4315 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4316 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4317 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4318 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4319 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4320 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4321 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4322 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4323 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4324 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4325 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4326 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4327 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4328 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4329 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4330 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4331 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4332 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4333 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 4334 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4335 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4336 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4337 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4338 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4339 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4340 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4341 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4342 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4343 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4344 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4345 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\a_cmp.c\nFILE 4346 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4347 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4348 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4349 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4350 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4351 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4352 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4353 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4354 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4355 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4356 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4357 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4358 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4359 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4360 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4361 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4362 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4363 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4364 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4365 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4366 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4367 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4368 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4369 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4370 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4371 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4372 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4373 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4374 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4375 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4376 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4377 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4378 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4379 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4380 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4381 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\misc\\i386\\sehprolg4.asm\nFILE 4382 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4383 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4384 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4385 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4386 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4387 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4388 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4389 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4390 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4391 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4392 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4393 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4394 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4395 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4396 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4397 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\intel\\secchk.c\nFILE 4398 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4399 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4400 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\process.h\nFILE 4401 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4402 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4403 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4404 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4405 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4406 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4407 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4408 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4409 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4410 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4411 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4412 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4413 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4414 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4415 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4416 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4417 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4418 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4419 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4420 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4421 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4422 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4423 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4424 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4425 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4426 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4427 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4428 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4429 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4430 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4431 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4432 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4433 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4434 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\intel\\loadcfg.c\nFILE 4435 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4436 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4437 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4438 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4439 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4440 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4441 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4442 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4443 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4444 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4445 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4446 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4447 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4448 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4449 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4450 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4451 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4452 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4453 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4454 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4455 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\misc\\i386\\exsup4.asm\nFILE 4456 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\h\\exsup.inc\nFILE 4457 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\misc\\i386\\exsup.asm\nFILE 4458 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\h\\pversion.inc\nFILE 4459 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\h\\cmacros.inc\nFILE 4460 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\h\\exsup.inc\nFILE 4461 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\misc\\i386\\nlgsupp.asm\nFILE 4462 f:\\sp\\public\\sdk\\inc\\ntldr.h\nFILE 4463 f:\\sp\\public\\sdk\\inc\\ntpoapi.h\nFILE 4464 f:\\sp\\public\\sdk\\inc\\ntexapi.h\nFILE 4465 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4466 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4467 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 4468 f:\\sp\\public\\sdk\\inc\\ntdef.h\nFILE 4469 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 4470 f:\\sp\\public\\sdk\\inc\\mce.h\nFILE 4471 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4472 f:\\sp\\public\\sdk\\inc\\ntimage.h\nFILE 4473 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4474 f:\\sp\\public\\sdk\\inc\\ntpsapi.h\nFILE 4475 f:\\sp\\public\\sdk\\inc\\nti386.h\nFILE 4476 f:\\sp\\public\\sdk\\inc\\nt.h\nFILE 4477 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 4478 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 4479 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 4480 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4481 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4482 f:\\sp\\public\\sdk\\inc\\ntxcapi.h\nFILE 4483 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4484 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\misc\\i386\\chandler4.c\nFILE 4485 f:\\sp\\public\\sdk\\inc\\ntstatus.h\nFILE 4486 f:\\sp\\public\\sdk\\inc\\ntkeapi.h\nFILE 4487 f:\\sp\\public\\sdk\\inc\\ntconfig.h\nFILE 4488 f:\\sp\\public\\sdk\\inc\\ntregapi.h\nFILE 4489 f:\\sp\\public\\sdk\\inc\\ntmmapi.h\nFILE 4490 f:\\sp\\public\\sdk\\inc\\ntobapi.h\nFILE 4491 f:\\sp\\public\\sdk\\inc\\nxi386.h\nFILE 4492 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\process.h\nFILE 4493 f:\\sp\\public\\sdk\\inc\\ntioapi.h\nFILE 4494 f:\\sp\\public\\sdk\\inc\\devioctl.h\nFILE 4495 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 4496 f:\\sp\\public\\sdk\\inc\\ntseapi.h\nFILE 4497 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4498 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 4499 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 4500 f:\\sp\\public\\sdk\\inc\\ntnls.h\nFILE 4501 f:\\sp\\public\\sdk\\inc\\ntelfapi.h\nFILE 4502 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4503 f:\\sp\\public\\sdk\\inc\\ntiolog.h\nFILE 4504 f:\\sp\\public\\sdk\\inc\\ntlpcapi.h\nFILE 4505 f:\\sp\\public\\sdk\\inc\\ntpnpapi.h\nFILE 4506 f:\\sp\\public\\sdk\\inc\\cfg.h\nFILE 4507 f:\\sp\\public\\sdk\\inc\\pebteb.h\nFILE 4508 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4509 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4510 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4511 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4512 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4513 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4514 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4515 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4516 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbdata.h\nFILE 4517 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4518 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbsnbico.c\nFILE 4519 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4520 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4521 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4522 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4523 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 4524 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4525 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4526 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4527 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4528 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4529 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4530 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4531 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4532 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4533 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4534 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4535 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4536 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4537 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4538 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4539 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4540 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4541 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4542 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4543 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4544 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4545 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4546 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4547 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4548 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4549 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4550 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4551 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4552 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4553 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4554 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4555 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 4556 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4557 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4558 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4559 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4560 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 4561 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4562 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4563 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4564 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4565 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4566 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4567 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4568 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbschr.c\nFILE 4569 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4570 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4571 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4572 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4573 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4574 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4575 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4576 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4577 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4578 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4579 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4580 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4581 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4582 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4583 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4584 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4585 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4586 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4587 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 4588 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4589 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4590 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4591 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4592 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4593 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 4594 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4595 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4596 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4597 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4598 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4599 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4600 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4601 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4602 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4603 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbdata.h\nFILE 4604 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 4605 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4606 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4607 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4608 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4609 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4610 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4611 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4612 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4613 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 4614 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4615 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.c\nFILE 4616 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4617 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4618 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4619 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4620 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4621 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4622 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4623 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4624 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4625 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4626 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4627 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4628 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4629 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4630 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4631 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4632 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4633 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4634 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4635 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4636 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4637 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4638 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4639 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4640 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbdata.h\nFILE 4641 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4642 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4643 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4644 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4645 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4646 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 4647 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4648 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4649 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4650 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 4651 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4652 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 4653 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4654 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4655 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4656 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4657 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4658 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4659 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4660 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4661 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4662 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4663 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 4664 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4665 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4666 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4667 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4668 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4669 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ismbbyte.c\nFILE 4670 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4671 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4672 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4673 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4674 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4675 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4676 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4677 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4678 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4679 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4680 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4681 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4682 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4683 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4684 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4685 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4686 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 4687 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4688 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4689 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4690 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4691 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4692 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4693 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4694 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4695 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4696 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4697 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4698 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4699 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4700 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbdata.h\nFILE 4701 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4702 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4703 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 4704 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4705 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 4706 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4707 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4708 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4709 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4710 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4711 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4712 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4713 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4714 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4715 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4716 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4717 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4718 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4719 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4720 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4721 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\putwch.c\nFILE 4722 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4723 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4724 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4725 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4726 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4727 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4728 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4729 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4730 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4731 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4732 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4733 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 4734 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4735 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4736 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4737 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 4738 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4739 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4740 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4741 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4742 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4743 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4744 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4745 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4746 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4747 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 4748 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4749 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4750 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4751 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 4752 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4753 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4754 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4755 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4756 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4757 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 4758 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4759 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4760 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4761 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4762 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4763 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4764 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4765 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 4766 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4767 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4768 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4769 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4770 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4771 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4772 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4773 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4774 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4775 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4776 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4777 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\write.c\nFILE 4778 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4779 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4780 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4781 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4782 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4783 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4784 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 4785 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4786 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4787 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4788 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4789 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4790 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4791 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4792 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4793 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 4794 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4795 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4796 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4797 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4798 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4799 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4800 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4801 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4802 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4803 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4804 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4805 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4806 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4807 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4808 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4809 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4810 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4811 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4812 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4813 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4814 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4815 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4816 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4817 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4818 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4819 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4820 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 4821 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4822 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4823 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fcntl.h\nFILE 4824 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 4825 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\osfinfo.c\nFILE 4826 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4827 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4828 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4829 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4830 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4831 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4832 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 4833 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4834 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4835 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4836 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4837 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4838 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4839 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4840 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4841 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4842 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4843 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4844 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4845 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4846 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4847 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4848 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4849 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4850 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4851 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4852 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4853 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4854 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4855 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4856 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4857 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4858 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4859 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4860 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 4861 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4862 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4863 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4864 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 4865 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4866 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4867 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4868 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4869 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4870 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4871 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4872 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\lseeki64.c\nFILE 4873 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4874 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4875 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4876 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 4877 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 4878 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4879 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4880 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4881 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4882 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4883 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4884 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4885 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4886 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4887 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4888 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4889 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4890 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4891 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4892 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4893 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4894 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4895 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4896 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 4897 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4898 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4899 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4900 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4901 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4902 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4903 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4904 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 4905 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4906 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4907 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4908 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4909 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4910 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4911 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4912 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\isatty.c\nFILE 4913 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4914 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4915 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4916 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4917 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4918 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4919 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4920 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4921 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4922 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4923 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4924 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4925 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4926 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4927 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4928 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4929 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4930 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4931 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4932 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4933 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4934 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4935 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4936 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4937 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 4938 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4939 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4940 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4941 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4942 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4943 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4944 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 4945 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 4946 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 4947 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4948 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4949 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4950 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4951 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4952 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4953 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4954 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4955 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4956 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4957 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4958 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ioinit.c\nFILE 4959 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4960 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4961 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4962 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4963 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4964 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4965 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4966 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4967 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4968 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4969 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4970 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4971 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4972 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4973 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4974 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4975 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4976 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4977 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4978 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4979 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4980 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4981 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4982 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4983 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4984 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4985 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4986 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4987 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4988 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4989 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4990 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4991 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4992 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4993 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4994 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4995 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4996 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4997 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4998 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4999 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5000 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5001 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 5002 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 5003 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5004 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5005 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5006 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5007 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5008 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\initcon.c\nFILE 5009 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5010 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5011 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5012 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5013 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5014 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5015 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5016 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5017 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5018 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5019 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5020 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5021 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5022 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5023 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5024 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5025 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 5026 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5027 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5028 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5029 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5030 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5031 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 5032 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5033 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5034 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5035 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5036 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5037 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5038 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5039 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5040 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5041 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5042 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5043 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\commit.c\nFILE 5044 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5045 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5046 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5047 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5048 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 5049 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5050 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5051 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5052 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5053 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5054 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5055 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5056 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5057 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5058 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5059 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5060 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5061 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5062 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5063 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5064 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5065 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5066 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5067 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5068 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5069 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5070 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 5071 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5072 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5073 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5074 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5075 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5076 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5077 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5078 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5079 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5080 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5081 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5082 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5083 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5084 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 5085 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5086 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 5087 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 5088 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5089 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5090 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5091 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5092 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5093 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5094 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\close.c\nFILE 5095 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5096 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5097 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5098 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5099 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5100 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5101 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5102 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5103 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5104 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5105 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5106 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5107 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5108 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5109 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5110 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5111 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5112 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5113 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\ulldvrm.asm\nFILE 5114 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 5115 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\mm.inc\nFILE 5116 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\llmul.asm\nFILE 5117 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 5118 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\mm.inc\nFILE 5119 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\use_ansi.h\nFILE 5120 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\new\nFILE 5121 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\exception\nFILE 5122 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xstddef\nFILE 5123 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\new.cpp\nFILE 5124 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cstddef\nFILE 5125 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 5126 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\eh.h\nFILE 5127 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cstdlib\nFILE 5128 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\yvals.h\nFILE 5129 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5130 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5131 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5132 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 5133 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5134 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5135 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5136 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5137 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5138 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5139 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5140 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5141 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5142 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5143 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5144 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5145 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5146 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5147 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5148 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5149 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5150 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5151 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5152 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_newmode.c\nFILE 5153 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5154 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5155 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5156 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5157 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5158 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5159 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5160 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5161 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5162 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5163 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5164 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5165 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5166 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5167 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5168 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5169 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5170 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5171 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5172 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5173 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5174 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5175 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5176 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5177 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\new.h\nFILE 5178 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5179 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcsup.h\nFILE 5180 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 5181 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5182 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5183 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5184 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\delete.cpp\nFILE 5185 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5186 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5187 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5188 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5189 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5190 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5191 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5192 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5193 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5194 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5195 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5196 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5197 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5198 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5199 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5200 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5201 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5202 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5203 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5204 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5205 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5206 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5207 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5208 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5209 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5210 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5211 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5212 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5213 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5214 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5215 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5216 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5217 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5218 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5219 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\process.h\nFILE 5220 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5221 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5222 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5223 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5224 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5225 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5226 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5227 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5228 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5229 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5230 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\handler.cpp\nFILE 5231 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5232 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 5233 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5234 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5235 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5236 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5237 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 5238 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5239 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5240 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5241 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5242 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5243 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5244 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5245 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5246 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5247 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5248 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5249 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5250 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5251 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5252 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5253 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5254 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5255 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5256 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5257 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5258 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5259 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5260 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5261 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\new.h\nFILE 5262 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5263 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5264 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5265 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5266 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5267 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5268 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5269 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5270 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5271 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5272 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 5273 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5274 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5275 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5276 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5277 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5278 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5279 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5280 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5281 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sbheap.c\nFILE 5282 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5283 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5284 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5285 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5286 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5287 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5288 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5289 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5290 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5291 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5292 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5293 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5294 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5295 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5296 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5297 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5298 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5299 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5300 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5301 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 5302 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5303 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5304 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5305 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5306 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5307 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcsup.h\nFILE 5308 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 5309 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5310 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 5311 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5312 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5313 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5314 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5315 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5316 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5317 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5318 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5319 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5320 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5321 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5322 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5323 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5324 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5325 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5326 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5327 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5328 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5329 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5330 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5331 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5332 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5333 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5334 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5335 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5336 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5337 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5338 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\realloc.c\nFILE 5339 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5340 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5341 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5342 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5343 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5344 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5345 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5346 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5347 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5348 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5349 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5350 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 5351 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5352 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5353 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5354 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5355 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5356 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5357 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5358 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5359 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5360 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5361 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5362 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5363 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5364 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5365 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 5366 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5367 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5368 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5369 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5370 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5371 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5372 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5373 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5374 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5375 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5376 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5377 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5378 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5379 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5380 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5381 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5382 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5383 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msize.c\nFILE 5384 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5385 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5386 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5387 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5388 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5389 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5390 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5391 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5392 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5393 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5394 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5395 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5396 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5397 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5398 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5399 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5400 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5401 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5402 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5403 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5404 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5405 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5406 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5407 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5408 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5409 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5410 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5411 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5412 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5413 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5414 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5415 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5416 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5417 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5418 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5419 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5420 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5421 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5422 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5423 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 5424 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5425 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.c\nFILE 5426 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5427 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5428 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcsup.h\nFILE 5429 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 5430 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 5431 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5432 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5433 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5434 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5435 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5436 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5437 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5438 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5439 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5440 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5441 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5442 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5443 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5444 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5445 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 5446 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5447 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5448 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5449 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5450 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5451 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5452 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5453 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5454 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5455 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5456 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5457 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5458 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5459 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5460 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5461 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5462 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5463 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5464 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5465 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5466 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5467 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5468 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5469 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5470 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5471 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5472 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5473 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\heapinit.c\nFILE 5474 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5475 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5476 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5477 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5478 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5479 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5480 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5481 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5482 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5483 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5484 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5485 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5486 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5487 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5488 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5489 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5490 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5491 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5492 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5493 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5494 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5495 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5496 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5497 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5498 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5499 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5500 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5501 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5502 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5503 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5504 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5505 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5506 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5507 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5508 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5509 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5510 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5511 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5512 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 5513 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5514 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5515 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\free.c\nFILE 5516 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5517 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5518 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5519 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcsup.h\nFILE 5520 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 5521 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5522 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5523 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5524 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5525 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5526 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5527 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5528 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5529 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5530 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5531 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5532 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5533 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5534 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5535 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5536 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5537 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5538 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5539 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5540 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5541 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5542 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5543 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5544 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5545 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5546 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5547 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5548 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5549 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5550 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5551 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5552 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5553 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5554 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5555 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5556 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5557 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtheap.c\nFILE 5558 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5559 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5560 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5561 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5562 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5563 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5564 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5565 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5566 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5567 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5568 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5569 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5570 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5571 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5572 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5573 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5574 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5575 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5576 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5577 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5578 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5579 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5580 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5581 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5582 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5583 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5584 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5585 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5586 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5587 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5588 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5589 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 5590 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5591 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5592 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\calloc.c\nFILE 5593 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5594 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5595 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5596 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5597 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5598 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5599 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5600 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcsup.h\nFILE 5601 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 5602 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5603 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5604 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5605 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5606 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5607 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5608 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5609 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5610 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5611 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5612 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5613 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5614 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5615 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5616 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5617 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5618 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5619 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5620 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5621 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehhooks.h\nFILE 5622 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5623 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 5624 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5625 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehassert.h\nFILE 5626 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\setjmp.h\nFILE 5627 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\i386\\trnsctrl.cpp\nFILE 5628 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\process.h\nFILE 5629 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 5630 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5631 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5632 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5633 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5634 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5635 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\trnsctrl.h\nFILE 5636 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5637 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5638 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5639 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5640 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5641 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5642 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5643 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5644 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5645 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5646 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5647 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5648 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5649 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5650 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5651 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5652 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5653 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 5654 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5655 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 5656 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5657 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5658 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5659 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5660 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5661 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5662 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5663 f:\\sp\\vctools\\langapi\\include\\ehdata.h\nFILE 5664 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5665 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\eh\\i386\\lowhelpr.asm\nFILE 5666 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\h\\cruntime.inc\nFILE 5667 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\h\\exsup.inc\nFILE 5668 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\process.h\nFILE 5669 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5670 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5671 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\i386\\ehprolg3.c\nFILE 5672 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5673 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5674 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5675 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehassert.h\nFILE 5676 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5677 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5678 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5679 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5680 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5681 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5682 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5683 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\validate.cpp\nFILE 5684 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5685 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5686 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5687 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5688 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5689 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5690 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5691 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5692 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5693 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5694 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5695 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5696 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5697 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5698 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5699 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5700 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5701 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5702 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5703 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5704 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5705 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5706 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5707 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5708 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5709 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5710 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5711 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5712 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5713 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5714 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5715 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5716 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5717 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5718 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5719 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5720 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sect_attribs.h\nFILE 5721 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\unhandld.cpp\nFILE 5722 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5723 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 5724 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5725 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5726 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5727 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5728 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5729 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5730 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5731 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5732 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5733 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehhooks.h\nFILE 5734 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5735 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5736 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5737 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5738 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5739 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehassert.h\nFILE 5740 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5741 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5742 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 5743 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5744 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5745 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5746 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5747 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5748 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 5749 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5750 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5751 f:\\sp\\vctools\\langapi\\include\\ehdata.h\nFILE 5752 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5753 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 5754 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5755 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5756 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5757 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5758 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5759 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5760 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5761 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5762 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5763 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5764 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5765 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5766 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5767 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5768 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5769 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5770 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5771 f:\\sp\\vctools\\langapi\\undname\\undname.cxx\nFILE 5772 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5773 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5774 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5775 f:\\sp\\vctools\\langapi\\undname\\utf8.h\nFILE 5776 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5777 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5778 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5779 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5780 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5781 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\swprintf.inl\nFILE 5782 f:\\sp\\vctools\\langapi\\undname\\undname.hxx\nFILE 5783 f:\\sp\\vctools\\langapi\\undname\\undname.h\nFILE 5784 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 5785 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5786 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5787 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5788 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5789 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5790 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdio.h\nFILE 5791 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5792 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5793 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5794 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5795 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5796 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5797 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 5798 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5799 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5800 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5801 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5802 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5803 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5804 f:\\sp\\vctools\\langapi\\undname\\undname.inl\nFILE 5805 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5806 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5807 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5808 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5809 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5810 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5811 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5812 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5813 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 5814 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5815 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\typname.cpp\nFILE 5816 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 5817 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\cstddef\nFILE 5818 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5819 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5820 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5821 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5822 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5823 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5824 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5825 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5826 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5827 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5828 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 5829 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5830 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sect_attribs.h\nFILE 5831 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\dbgint.h\nFILE 5832 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5833 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5834 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5835 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\typeinfo.h\nFILE 5836 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\typeinfo\nFILE 5837 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\exception\nFILE 5838 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\xstddef\nFILE 5839 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5840 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\yvals.h\nFILE 5841 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\use_ansi.h\nFILE 5842 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5843 f:\\sp\\vctools\\langapi\\undname\\undname.h\nFILE 5844 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 5845 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5846 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5847 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5848 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5849 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5850 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 5851 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5852 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5853 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5854 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5855 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5856 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5857 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\malloc.h\nFILE 5858 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5859 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5860 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5861 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5862 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5863 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5864 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5865 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5866 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5867 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5868 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5869 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\dbgint.h\nFILE 5870 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 5871 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\cstddef\nFILE 5872 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5873 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\typinfo.cpp\nFILE 5874 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5875 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5876 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5877 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5878 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5879 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5880 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 5881 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5882 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5883 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5884 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 5885 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5886 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5887 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5888 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5889 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5890 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\typeinfo\nFILE 5891 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5892 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\exception\nFILE 5893 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\xstddef\nFILE 5894 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5895 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\yvals.h\nFILE 5896 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\use_ansi.h\nFILE 5897 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5898 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5899 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5900 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5901 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5902 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5903 f:\\sp\\vctools\\langapi\\undname\\undname.h\nFILE 5904 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5905 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\malloc.h\nFILE 5906 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5907 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5908 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5909 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5910 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5911 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5912 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\typeinfo\nFILE 5913 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5914 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\exception\nFILE 5915 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\xstddef\nFILE 5916 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\stdexcpt.cpp\nFILE 5917 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\yvals.h\nFILE 5918 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\use_ansi.h\nFILE 5919 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 5920 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5921 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5922 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5923 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\cstddef\nFILE 5924 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5925 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\malloc.h\nFILE 5926 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5927 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5928 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5929 f:\\sp\\vctools\\langapi\\include\\ehdata.h\nFILE 5930 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5931 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5932 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5933 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5934 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5935 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5936 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5937 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5938 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5939 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\throw.cpp\nFILE 5940 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5941 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5942 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5943 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5944 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5945 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5946 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5947 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5948 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5949 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5950 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5951 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5952 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5953 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5954 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehhooks.h\nFILE 5955 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5956 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehassert.h\nFILE 5957 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5958 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5959 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5960 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5961 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5962 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5963 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5964 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 5965 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5966 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5967 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5968 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5969 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5970 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5971 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5972 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5973 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5974 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5975 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5976 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5977 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5978 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5979 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5980 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 5981 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5982 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5983 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\hooks.cpp\nFILE 5984 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5985 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5986 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5987 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5988 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5989 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 5990 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5991 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5992 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5993 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5994 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 5995 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5996 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5997 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5998 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5999 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6000 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6001 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6002 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6003 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehhooks.h\nFILE 6004 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6005 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 6006 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6007 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehassert.h\nFILE 6008 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 6009 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6010 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6011 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6012 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6013 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 6014 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 6015 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6016 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 6017 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6018 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 6019 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehassert.h\nFILE 6020 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\malloc.h\nFILE 6021 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6022 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6023 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6024 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6025 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6026 f:\\sp\\vctools\\langapi\\include\\ehdata.h\nFILE 6027 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6028 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6029 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 6030 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 6031 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6032 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 6033 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6034 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\frame.cpp\nFILE 6035 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\exception\nFILE 6036 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\typeinfo.h\nFILE 6037 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\typeinfo\nFILE 6038 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\xstddef\nFILE 6039 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\yvals.h\nFILE 6040 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\use_ansi.h\nFILE 6041 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6042 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6043 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6044 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 6045 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6046 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 6047 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 6048 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 6049 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6050 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehstate.h\nFILE 6051 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 6052 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6053 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6054 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 6055 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6056 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6057 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 6058 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6059 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6060 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehhooks.h\nFILE 6061 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6062 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6063 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6064 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\trnsctrl.h\nFILE 6065 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 6066 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6067 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6068 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 6069 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\cstddef\nFILE 6070 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 6071 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 6072 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 6073 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6074 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6075 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6076 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6077 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6078 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6079 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6080 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6081 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6082 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6083 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6084 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6085 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6086 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6087 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6088 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6089 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6090 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6091 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6092 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6093 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6094 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6095 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6096 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6097 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6098 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6099 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6100 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dosmap.c\nFILE 6101 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6102 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6103 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6104 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6105 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6106 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6107 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6108 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6109 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6110 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6111 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6112 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6113 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6114 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6115 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6116 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6117 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6118 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6119 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6120 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6121 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6122 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6123 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6124 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6125 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6126 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6127 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6128 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wctomb.c\nFILE 6129 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6130 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6131 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6132 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6133 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6134 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6135 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6136 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6137 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6138 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6139 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6140 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6141 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6142 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6143 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6144 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6145 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6146 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6147 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6148 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6149 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6150 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6151 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6152 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6153 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6154 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6155 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6156 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6157 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6158 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6159 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6160 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6161 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6162 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6163 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6164 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6165 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6166 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6167 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6168 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6169 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6170 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6171 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6172 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6173 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wcstol.c\nFILE 6174 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6175 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6176 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6177 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6178 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6179 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6180 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6181 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6182 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6183 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6184 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6185 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6186 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6187 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6188 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6189 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6190 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6191 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6192 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6193 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6194 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6195 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6196 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6197 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6198 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6199 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6200 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6201 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6202 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6203 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6204 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6205 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6206 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6207 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6208 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6209 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6210 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6211 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6212 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6213 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6214 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6215 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6216 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6217 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6218 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tolower.c\nFILE 6219 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6220 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6221 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6222 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6223 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6224 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6225 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6226 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 6227 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6228 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6229 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6230 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6231 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6232 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6233 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6234 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 6235 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6236 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6237 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6238 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6239 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6240 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6241 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6242 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6243 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6244 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6245 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6246 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6247 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6248 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6249 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6250 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6251 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6252 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6253 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6254 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6255 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6256 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6257 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6258 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6259 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6260 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6261 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6262 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6263 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6264 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strtoq.c\nFILE 6265 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6266 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6267 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6268 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6269 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6270 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6271 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6272 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6273 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6274 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6275 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6276 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6277 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6278 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6279 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6280 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6281 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6282 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6283 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6284 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6285 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6286 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6287 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6288 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6289 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6290 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6291 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6292 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6293 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6294 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6295 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6296 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6297 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6298 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6299 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6300 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6301 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6302 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6303 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6304 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6305 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6306 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6307 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6308 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6309 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strtol.c\nFILE 6310 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6311 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6312 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6313 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6314 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6315 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6316 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6317 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6318 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6319 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6320 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6321 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6322 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6323 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6324 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6325 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6326 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6327 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6328 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6329 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6330 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6331 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6332 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6333 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6334 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6335 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6336 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6337 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6338 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6339 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6340 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6341 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6342 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6343 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6344 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6345 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6346 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6347 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6348 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6349 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6350 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6351 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6352 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6353 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6354 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6355 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbtowc.c\nFILE 6356 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6357 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6358 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6359 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6360 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6361 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6362 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6363 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6364 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6365 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6366 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6367 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6368 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6369 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6370 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6371 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6372 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6373 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 6374 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6375 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6376 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6377 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6378 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6379 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6380 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6381 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6382 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6383 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6384 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6385 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6386 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6387 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6388 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6389 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6390 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 6391 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6392 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6393 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6394 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 6395 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6396 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6397 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6398 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6399 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\isctype.c\nFILE 6400 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6401 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6402 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6403 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6404 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6405 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6406 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6407 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6408 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6409 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 6410 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6411 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6412 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6413 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6414 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6415 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6416 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6417 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6418 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6419 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6420 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6421 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6422 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6423 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6424 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6425 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6426 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 6427 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6428 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6429 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6430 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6431 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6432 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6433 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6434 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6435 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6436 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 6437 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6438 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6439 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6440 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6441 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6442 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6443 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6444 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6445 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\iswctype.c\nFILE 6446 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6447 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6448 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6449 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6450 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 6451 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6452 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6453 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6454 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6455 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6456 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 6457 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6458 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6459 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6460 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6461 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6462 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6463 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6464 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6465 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6466 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6467 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6468 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6469 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6470 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6471 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6472 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6473 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6474 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6475 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6476 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6477 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6478 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6479 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6480 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6481 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6482 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6483 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6484 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6485 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6486 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6487 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6488 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6489 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6490 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_wctype.c\nFILE 6491 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6492 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6493 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6494 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6495 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6496 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6497 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6498 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6499 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6500 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6501 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6502 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6503 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6504 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6505 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6506 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6507 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 6508 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6509 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6510 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6511 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6512 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6513 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6514 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6515 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6516 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6517 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6518 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6519 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6520 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6521 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6522 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6523 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6524 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6525 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6526 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6527 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6528 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6529 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6530 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6531 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6532 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6533 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6534 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6535 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_ctype.c\nFILE 6536 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6537 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6538 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6539 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6540 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6541 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6542 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6543 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6544 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6545 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6546 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6547 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6548 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6549 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6550 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6551 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6552 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6553 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6554 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6555 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6556 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6557 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6558 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6559 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6560 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6561 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6562 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6563 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6564 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6565 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6566 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6567 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6568 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6569 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6570 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6571 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6572 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6573 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal_securecrt.h\nFILE 6574 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6575 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6576 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6577 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6578 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6579 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6580 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6581 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xtoa.c\nFILE 6582 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6583 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6584 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6585 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6586 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 6587 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xtoas.c\nFILE 6588 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6589 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6590 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6591 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6592 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6593 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6594 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6595 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6596 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6597 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6598 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6599 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6600 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6601 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6602 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6603 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6604 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6605 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 6606 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6607 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6608 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6609 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 6610 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 6611 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6612 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6613 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchtodig.c\nFILE 6614 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6615 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6616 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6617 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 6618 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6619 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6620 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6621 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6622 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6623 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6624 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6625 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6626 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6627 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6628 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6629 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6630 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6631 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\atox.c\nFILE 6632 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6633 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6634 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6635 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6636 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6637 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6638 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6639 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6640 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6641 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6642 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6643 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 6644 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6645 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 6646 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6647 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6648 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6649 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6650 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6651 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6652 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6653 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 6654 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6655 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6656 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6657 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6658 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6659 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6660 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6661 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFUNC 1000 13 4 vswprintf\n1000 0 50 71\n1000 12 51 71\n1012 1 52 71\nFUNC 1020 1b 10 wmemcpy_s\n1020 0 1230 66\n1020 1b 1233 66\nFUNC 1040 1b 10 wmemmove_s\n1040 0 1250 66\n1040 1b 1253 66\nFUNC 1060 19 4 std::bad_alloc::bad_alloc(char const *)\n1060 13 371 83\n1073 6 372 83\nFUNC 1080 b 0 std::bad_alloc::~bad_alloc()\n1080 6 380 83\n1086 5 381 83\nFUNC 1090 24 0 std::bad_alloc::`vector deleting destructor'(unsigned int)\nFUNC 10c0 f 8 std::char_traits<wchar_t>::assign(wchar_t &,wchar_t const &)\n10c0 0 302 70\n10c0 e 303 70\n10ce 1 304 70\nFUNC 10d0 17 4 std::char_traits<wchar_t>::length(wchar_t const *)\n10d0 0 325 70\n10d0 16 327 70\n10e6 1 328 70\nFUNC 10f0 27 10 std::char_traits<wchar_t>::_Copy_s(wchar_t *,unsigned int,wchar_t const *,unsigned int)\n10f0 0 340 70\n10f0 23 343 70\n1113 3 344 70\n1116 1 345 70\nFUNC 1120 27 10 std::char_traits<wchar_t>::_Move_s(wchar_t *,unsigned int,wchar_t const *,unsigned int)\n1120 0 364 70\n1120 23 367 70\n1143 3 368 70\n1146 1 369 70\nFUNC 1150 d 8 std::char_traits<char>::assign(char &,char const &)\n1150 0 417 70\n1150 c 418 70\n115c 1 419 70\nFUNC 1160 13 4 std::char_traits<char>::length(char const *)\n1160 0 440 70\n1160 12 442 70\n1172 1 443 70\nFUNC 1180 21 10 std::char_traits<char>::_Copy_s(char *,unsigned int,char const *,unsigned int)\n1180 0 455 70\n1180 1d 458 70\n119d 3 459 70\n11a0 1 460 70\nFUNC 11b0 21 10 std::char_traits<char>::_Move_s(char *,unsigned int,char const *,unsigned int)\n11b0 0 479 70\n11b0 1d 482 70\n11cd 3 483 70\n11d0 1 484 70\nFUNC 11e0 7 0 std::_Iterator_base::_Iterator_base()\n11e0 6 441 65\n11e6 1 442 65\nFUNC 11f0 6b 4 std::logic_error::logic_error(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &)\n11f0 56 27 82\n1246 15 28 82\nFUNC 1260 32 0 std::logic_error::~logic_error()\n1260 9 31 82\n1269 29 32 82\nFUNC 12a0 e 0 std::logic_error::what()\n12a0 0 35 82\n12a0 9 36 82\n12a9 1 37 82\n12aa 3 36 82\n12ad 1 37 82\nFUNC 12b0 47 0 std::logic_error::`scalar deleting destructor'(unsigned int)\nFUNC 1300 19 4 std::length_error::length_error(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &)\n1300 13 106 82\n1313 6 107 82\nFUNC 1320 32 0 std::length_error::~length_error()\n1320 3 110 82\n1323 2f 111 82\nFUNC 1360 47 0 std::length_error::`vector deleting destructor'(unsigned int)\nFUNC 13b0 19 4 std::out_of_range::out_of_range(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &)\n13b0 13 130 82\n13c3 6 131 82\nFUNC 13d0 32 0 std::out_of_range::~out_of_range()\n13d0 3 134 82\n13d3 2f 135 82\nFUNC 1410 47 0 std::out_of_range::`vector deleting destructor'(unsigned int)\nFUNC 1460 19 4 std::out_of_range::out_of_range(std::out_of_range const &)\nFUNC 1480 71 4 std::logic_error::logic_error(std::logic_error const &)\nFUNC 1500 1b 8 google_breakpad::WindowsStringUtils::safe_swprintf(wchar_t *,unsigned int,wchar_t const *,...)\n1500 0 94 63\n1500 1a 97 63\n151a 1 105 63\nFUNC 1520 35 0 google_breakpad::ExceptionHandler::set_dump_path(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > const &)\n1520 4 137 43\n1524 f 138 43\n1533 c 139 43\n153f 7 140 43\n1546 1 141 43\n1547 6 139 43\n154d 7 140 43\n1554 1 141 43\nFUNC 1560 20b 14 google_breakpad::ExceptionHandler::ExceptionHandler(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > const &,bool (*)(void *,_EXCEPTION_POINTERS *,MDRawAssertionInfo *),bool (*)(wchar_t const *,wchar_t const *,void *,_EXCEPTION_POINTERS *,MDRawAssertionInfo *,bool),void *,bool)\n1560 6d 75 12\n15cd 90 78 12\n165d 9 86 12\n1666 d 87 12\n1673 d 88 12\n1680 1e 96 12\n169e 11 98 12\n16af 7 99 12\n16b6 f 101 12\n16c5 a 104 12\n16cf 8 105 12\n16d7 7 106 12\n16de 7 107 12\n16e5 b 110 12\n16f0 8 114 12\n16f8 25 115 12\n171d d 117 12\n172a b 118 12\n1735 10 121 12\n1745 e 124 12\n1753 18 126 12\nFUNC 1770 274 0 google_breakpad::ExceptionHandler::~ExceptionHandler()\n1770 e 128 12\n177e a 129 12\n1788 7 130 12\n178f a 133 12\n1799 b 134 12\n17a4 a 136 12\n17ae 9 139 12\n17b7 63 142 12\n181a 23 143 12\n183d 5 144 12\n1842 13 147 12\n1855 2b 149 12\n1880 2a 151 12\n18aa 17 152 12\n18c1 2c 153 12\n18ed 19 151 12\n1906 11 158 12\n1917 23 161 12\n193a 6 162 12\n1940 d 165 12\n194d f 169 12\n195c d 170 12\n1969 f 171 12\n1978 9 172 12\n1981 63 173 12\nFUNC 19f0 31 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::`scalar deleting destructor'(unsigned int)\nFUNC 1a30 51 4 google_breakpad::ExceptionHandler::ExceptionHandlerThreadMain(void *)\n1a30 13 176 12\n1a43 f 182 12\n1a52 1a 185 12\n1a6c 13 188 12\n1a7f 2 190 12\nFUNC 1a90 c7 4 google_breakpad::AutoExceptionHandler::AutoExceptionHandler()\n1a90 7 204 12\n1a97 b 221 12\n1aa2 82 224 12\n1b24 d 225 12\n1b31 c 229 12\n1b3d e 231 12\n1b4b c 233 12\nFUNC 1b60 36 0 google_breakpad::AutoExceptionHandler::~AutoExceptionHandler()\n1b60 0 235 12\n1b60 b 237 12\n1b6b d 239 12\n1b78 b 242 12\n1b83 7 243 12\n1b8a b 244 12\n1b95 1 245 12\nFUNC 1ba0 3 0 google_breakpad::AutoExceptionHandler::get_handler()\n1ba0 3 247 12\nFUNC 1bb0 c4 4 google_breakpad::ExceptionHandler::HandleException(_EXCEPTION_POINTERS *)\n1bb0 2b 254 12\n1bdb a 255 12\n1be5 f 262 12\n1bf4 1e 265 12\n1c12 5 273 12\n1c17 2 274 12\n1c19 7 283 12\n1c20 5 284 12\n1c25 2 285 12\n1c27 2 286 12\n1c29 37 290 12\n1c60 14 291 12\nFUNC 1c80 121 14 google_breakpad::ExceptionHandler::HandleInvalidParameter(wchar_t const *,wchar_t const *,wchar_t const *,unsigned int,unsigned int)\n1c80 40 299 12\n1cc0 b7 319 12\n1d77 7 320 12\n1d7e 14 323 12\n1d92 2 324 12\n1d94 5 337 12\n1d99 8 345 12\nFUNC 1db0 81 8 google_breakpad::ExceptionHandler::WriteMinidumpOnHandlerThread(_EXCEPTION_POINTERS *,MDRawAssertionInfo *)\n1db0 2 350 12\n1db2 d 351 12\n1dbf 6 354 12\n1dc5 2b 359 12\n1df0 f 362 12\n1dff 6 363 12\n1e05 26 370 12\n1e2b 3 372 12\n1e2e 3 373 12\nFUNC 1e40 1d 0 google_breakpad::ExceptionHandler::WriteMinidump()\n1e40 3 375 12\n1e43 b 376 12\n1e4e b 377 12\n1e59 3 378 12\n1e5c 1 379 12\nFUNC 1e60 a2 4 google_breakpad::ExceptionHandler::WriteMinidump(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > const &,bool (*)(wchar_t const *,wchar_t const *,void *,_EXCEPTION_POINTERS *,MDRawAssertionInfo *,bool),void *)\n1e60 41 384 12\n1ea1 10 385 12\n1eb1 2a 386 12\n1edb 27 387 12\nFUNC 1f10 142 c google_breakpad::ExceptionHandler::WriteMinidumpWithException(unsigned long,_EXCEPTION_POINTERS *,MDRawAssertionInfo *)\n1f10 0 392 12\n1f10 22 399 12\n1f32 7 466 12\n1f39 2 403 12\n1f3b e 404 12\n1f49 1f 411 12\n1f68 9 412 12\n1f71 8 414 12\n1f79 4 415 12\n1f7d 8 416 12\n1f85 8 426 12\n1f8d a 427 12\n1f97 34 440 12\n1fcb 8 441 12\n1fd3 8 442 12\n1fdb 4 443 12\n1fdf 8 444 12\n1fe7 30 454 12\n2017 c 456 12\n2023 7 460 12\n202a 1e 462 12\n2048 4 465 12\n204c 6 466 12\nFUNC 2060 138 0 google_breakpad::ExceptionHandler::UpdateNextID()\n2060 38 468 12\n2098 b 470 12\n20a3 4a 471 12\n20ed 25 472 12\n2112 1c 477 12\n212e 31 478 12\n215f 14 479 12\n2173 25 480 12\nFUNC 21a0 3b 4 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >(char const *)\n21a0 0 650 17\n21a0 35 652 17\n21d5 6 653 17\nFUNC 21e0 25 4 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &)\n21e0 1 720 17\n21e1 4 721 17\n21e5 1a 722 17\n21ff 6 723 17\nFUNC 2210 26 0 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >()\n2210 3 904 17\n2213 22 905 17\n2235 1 906 17\nFUNC 2240 e 0 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::c_str()\n2240 0 1621 17\n2240 9 1622 17\n2249 1 1623 17\n224a 3 1622 17\n224d 1 1623 17\nFUNC 2250 4 0 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::size()\n2250 0 1636 17\n2250 3 1637 17\n2253 1 1638 17\nFUNC 2260 11 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >()\n2260 0 564 17\n2260 10 565 17\n2270 1 566 17\nFUNC 2280 27 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::~basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >()\n2280 3 904 17\n2283 23 905 17\n22a6 1 906 17\nFUNC 22b0 b 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::operator=(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > const &)\n22b0 0 914 17\n22b0 a 915 17\n22ba 1 916 17\nFUNC 22c0 24 4 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::operator=(wchar_t const *)\n22c0 0 919 17\n22c0 21 920 17\n22e1 3 921 17\nFUNC 22f0 e 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::c_str()\n22f0 0 1621 17\n22f0 9 1622 17\n22f9 1 1623 17\n22fa 3 1622 17\n22fd 1 1623 17\nFUNC 2300 c 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >()\n2300 0 457 23\n2300 b 458 23\n230b 1 459 23\nFUNC 2310 26 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::~vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >()\n2310 0 545 23\n2310 25 546 23\n2335 1 547 23\nFUNC 2340 1d 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::begin()\n2340 1 627 23\n2341 1b 628 23\n235c 1 629 23\nFUNC 2360 1d 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::end()\n2360 1 637 23\n2361 1b 638 23\n237c 1 639 23\nFUNC 2380 13 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::size()\n2380 0 702 23\n2380 9 703 23\n2389 1 704 23\n238a 8 703 23\n2392 1 704 23\nFUNC 23a0 23 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::empty()\n23a0 0 712 23\n23a0 10 713 23\n23b0 1 714 23\n23b1 11 713 23\n23c2 1 714 23\nFUNC 23d0 56 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::at(unsigned int)\n23d0 b 729 23\n23db 15 730 23\n23f0 5 731 23\n23f5 29 732 23\n241e 8 733 23\nFUNC 2430 47 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::back()\n2430 c 776 23\n243c 32 777 23\n246e 9 778 23\nFUNC 2480 68 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::push_back(google_breakpad::ExceptionHandler * const &)\n2480 10 786 23\n2490 24 787 23\n24b4 d 796 23\n24c1 6 801 23\n24c7 1b 800 23\n24e2 6 801 23\nFUNC 24f0 23 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::pop_back()\n24f0 6 818 23\n24f6 15 819 23\n250b 6 822 23\n2511 2 824 23\nFUNC 2520 3f 8 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::erase(std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >)\n2520 7 996 23\n2527 24 998 23\n254b 11 1001 23\n255c 3 1002 23\nFUNC 2560 20 0 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator*()\n2560 0 325 23\n2560 1c 326 23\n257c 1 327 23\n257d 2 326 23\n257f 1 327 23\nFUNC 2580 20 0 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator++()\n2580 0 335 23\n2580 1d 336 23\n259d 2 337 23\n259f 1 338 23\nFUNC 25a0 1d 0 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator!=(std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> > const &)\n25a0 0 202 23\n25a0 1c 203 23\n25bc 1 204 23\nFUNC 25c0 da c std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,unsigned int,unsigned int)\n25c0 1 1038 17\n25c1 12 1039 17\n25d3 5 1040 17\n25d8 3 1041 17\n25db a 1042 17\n25e5 2 1043 17\n25e7 4 1045 17\n25eb 17 1046 17\n2602 5 1052 17\n2607 3 1053 17\n260a 21 1047 17\n262b b 1049 17\n2636 13 1047 17\n2649 5 1052 17\n264e 3 1053 17\n2651 7 1047 17\n2658 5 1052 17\n265d 3 1053 17\n2660 22 1049 17\n2682 10 1050 17\n2692 5 1052 17\n2697 3 1053 17\nFUNC 26a0 27 4 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(char const *)\n26a0 1 1069 17\n26a1 23 1070 17\n26c4 3 1071 17\nFUNC 26d0 4a 8 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(bool,unsigned int)\n26d0 0 2066 17\n26d0 f 2067 17\n26df 6 2069 17\n26e5 a 2072 17\n26ef d 2073 17\n26fc a 2074 17\n2706 11 2077 17\n2717 3 2078 17\nFUNC 2720 e 0 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Myptr()\n2720 0 2092 17\n2720 9 2093 17\n2729 1 2094 17\n272a 3 2093 17\n272d 1 2094 17\nFUNC 2730 5 4 std::_String_val<char,std::allocator<char> >::_String_val<char,std::allocator<char> >(std::allocator<char>)\n2730 2 471 17\n2732 3 472 17\nFUNC 2740 5 4 std::_String_val<char,std::allocator<char> >::_String_val<char,std::allocator<char> >(std::_String_val<char,std::allocator<char> > const &)\n2740 2 477 17\n2742 3 484 17\nFUNC 2750 3 0 std::allocator<char>::allocator<char>()\n2750 2 120 19\n2752 1 122 19\nFUNC 2760 b 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::assign(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > const &)\n2760 0 1032 17\n2760 a 1033 17\n276a 1 1034 17\nFUNC 2770 ef c std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::assign(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > const &,unsigned int,unsigned int)\n2770 1 1038 17\n2771 12 1039 17\n2783 5 1040 17\n2788 3 1041 17\n278b a 1042 17\n2795 2 1043 17\n2797 4 1045 17\n279b 17 1046 17\n27b2 5 1052 17\n27b7 3 1053 17\n27ba 24 1047 17\n27de b 1049 17\n27e9 13 1047 17\n27fc 5 1052 17\n2801 3 1053 17\n2804 9 1047 17\n280d 5 1052 17\n2812 3 1053 17\n2815 2f 1049 17\n2844 13 1050 17\n2857 5 1052 17\n285c 3 1053 17\nFUNC 2860 2b 4 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::assign(wchar_t const *)\n2860 1 1069 17\n2861 27 1070 17\n2888 3 1071 17\nFUNC 2890 4f 8 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Tidy(bool,unsigned int)\n2890 0 2066 17\n2890 f 2067 17\n289f 6 2069 17\n28a5 a 2072 17\n28af 10 2073 17\n28bf a 2074 17\n28c9 13 2077 17\n28dc 3 2078 17\nFUNC 28e0 e 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Myptr()\n28e0 0 2092 17\n28e0 9 2093 17\n28e9 1 2094 17\n28ea 3 2093 17\n28ed 1 2094 17\nFUNC 28f0 5 4 std::_String_val<wchar_t,std::allocator<wchar_t> >::_String_val<wchar_t,std::allocator<wchar_t> >(std::allocator<wchar_t>)\n28f0 2 471 17\n28f2 3 472 17\nFUNC 2900 3 0 std::allocator<wchar_t>::allocator<wchar_t>()\n2900 2 120 19\n2902 1 122 19\nFUNC 2910 13 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::capacity()\n2910 0 621 23\n2910 9 622 23\n2919 1 623 23\n291a 8 622 23\n2922 1 623 23\nFUNC 2930 86 c std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::insert(std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >,google_breakpad::ExceptionHandler * const &)\n2930 3 852 23\n2933 3e 853 23\n2971 11 854 23\n2982 2a 855 23\n29ac a 856 23\nFUNC 29c0 23 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Buy(unsigned int)\n29c0 0 1066 23\n29c0 8 1070 23\n29c8 5 1071 23\n29cd a 1074 23\n29d7 3 1075 23\n29da 6 1076 23\n29e0 2 1078 23\n29e2 1 1079 23\nFUNC 29f0 1 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Destroy(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *)\n29f0 0 1082 23\n29f0 1 1084 23\nFUNC 2a00 26 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Tidy()\n2a00 0 1087 23\n2a00 7 1088 23\n2a07 9 1096 23\n2a10 15 1098 23\n2a25 1 1099 23\nFUNC 2a30 23 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Ufill(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &)\n2a30 0 1207 23\n2a30 1f 1208 23\n2a4f 3 1209 23\n2a52 1 1210 23\nFUNC 2a60 76 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Xran()\n2a60 23 1218 23\n2a83 53 1219 23\nFUNC 2ae0 3 4 std::_Vector_val<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Vector_val<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(std::allocator<google_breakpad::ExceptionHandler *>)\n2ae0 0 412 23\n2ae0 3 413 23\nFUNC 2af0 1 0 std::allocator<google_breakpad::ExceptionHandler *>::allocator<google_breakpad::ExceptionHandler *>()\n2af0 0 120 19\n2af0 1 122 19\nFUNC 2b00 21 0 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,std::_Container_base const *)\n2b00 1e 314 23\n2b1e 3 315 23\nFUNC 2b30 32 4 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator+(int)\n2b30 1 367 23\n2b31 2 368 23\n2b33 26 369 23\n2b59 9 370 23\nFUNC 2b70 2f 0 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator-(int)\n2b70 1 378 23\n2b71 2 379 23\n2b73 25 380 23\n2b98 7 381 23\nFUNC 2ba0 20 0 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator*()\n2ba0 0 92 23\n2ba0 a 103 23\n2baa f 104 23\n2bb9 3 107 23\n2bbc 1 108 23\n2bbd 2 107 23\n2bbf 1 108 23\nFUNC 2bc0 20 0 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator++()\n2bc0 0 116 23\n2bc0 a 117 23\n2bca f 118 23\n2bd9 4 119 23\n2bdd 2 120 23\n2bdf 1 121 23\nFUNC 2be0 1d 0 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator==(std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> > const &)\n2be0 0 190 23\n2be0 f 195 23\n2bef d 198 23\n2bfc 1 199 23\nFUNC 2c00 c1 8 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(char const *,unsigned int)\n2c00 5 1056 17\n2c05 2d 1057 17\n2c32 1a 1058 17\n2c4c 4 1066 17\n2c50 25 1060 17\n2c75 c 1062 17\n2c81 f 1060 17\n2c90 8 1065 17\n2c98 3 1066 17\n2c9b e 1062 17\n2ca9 10 1063 17\n2cb9 5 1065 17\n2cbe 3 1066 17\nFUNC 2cd0 83 8 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::erase(unsigned int,unsigned int)\n2cd0 1 1240 17\n2cd1 d 1241 17\n2cde 5 1242 17\n2ce3 d 1243 17\n2cf0 2 1244 17\n2cf2 4 1245 17\n2cf6 3c 1248 17\n2d32 8 1249 17\n2d3a 12 1250 17\n2d4c 4 1252 17\n2d50 3 1253 17\nFUNC 2d60 1f 4 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Eos(unsigned int)\n2d60 0 2030 17\n2d60 14 2031 17\n2d74 3 2032 17\n2d77 5 2031 17\n2d7c 3 2032 17\nFUNC 2d80 bc 8 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Grow(unsigned int,bool)\n2d80 1 2036 17\n2d81 c 2037 17\n2d8d 5 2038 17\n2d92 7 2039 17\n2d99 c 2040 17\n2da5 a 2046 17\n2daf 3 2047 17\n2db2 d 2041 17\n2dbf 39 2043 17\n2df8 10 2046 17\n2e08 3 2047 17\n2e0b 4 2044 17\n2e0f b 2045 17\n2e1a c 2046 17\n2e26 3 2047 17\n2e29 6 2045 17\n2e2f a 2046 17\n2e39 3 2047 17\nFUNC 2e40 e 0 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Myptr()\n2e40 0 2087 17\n2e40 9 2088 17\n2e49 1 2089 17\n2e4a 3 2088 17\n2e4d 1 2089 17\nFUNC 2e50 5 4 std::allocator<char>::allocator<char>(std::allocator<char> const &)\n2e50 2 124 19\n2e52 3 126 19\nFUNC 2e60 e 8 std::allocator<char>::deallocate(char *,unsigned int)\n2e60 0 140 19\n2e60 b 141 19\n2e6b 3 142 19\nFUNC 2e70 da 8 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::assign(wchar_t const *,unsigned int)\n2e70 4 1056 17\n2e74 31 1057 17\n2ea5 1d 1058 17\n2ec2 3 1066 17\n2ec5 28 1060 17\n2eed d 1062 17\n2efa 10 1060 17\n2f0a a 1065 17\n2f14 3 1066 17\n2f17 18 1062 17\n2f2f 14 1063 17\n2f43 4 1065 17\n2f47 3 1066 17\nFUNC 2f50 97 8 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::erase(unsigned int,unsigned int)\n2f50 1 1240 17\n2f51 d 1241 17\n2f5e 5 1242 17\n2f63 d 1243 17\n2f70 2 1244 17\n2f72 4 1245 17\n2f76 4d 1248 17\n2fc3 8 1249 17\n2fcb 15 1250 17\n2fe0 4 1252 17\n2fe4 3 1253 17\nFUNC 2ff0 4 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::size()\n2ff0 0 1636 17\n2ff0 3 1637 17\n2ff3 1 1638 17\nFUNC 3000 23 4 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Eos(unsigned int)\n3000 0 2030 17\n3000 16 2031 17\n3016 3 2032 17\n3019 7 2031 17\n3020 3 2032 17\nFUNC 3030 c7 8 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Grow(unsigned int,bool)\n3030 1 2036 17\n3031 f 2037 17\n3040 5 2038 17\n3045 7 2039 17\n304c c 2040 17\n3058 a 2046 17\n3062 3 2047 17\n3065 d 2041 17\n3072 3c 2043 17\n30ae 12 2046 17\n30c0 3 2047 17\n30c3 4 2044 17\n30c7 b 2045 17\n30d2 d 2046 17\n30df 3 2047 17\n30e2 8 2045 17\n30ea a 2046 17\n30f4 3 2047 17\nFUNC 3100 e 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Myptr()\n3100 0 2087 17\n3100 9 2088 17\n3109 1 2089 17\n310a 3 2088 17\n310d 1 2089 17\nFUNC 3110 5 4 std::allocator<wchar_t>::allocator<wchar_t>(std::allocator<wchar_t> const &)\n3110 2 124 19\n3112 3 126 19\nFUNC 3120 e 8 std::allocator<wchar_t>::deallocate(wchar_t *,unsigned int)\n3120 0 140 19\n3120 b 141 19\n312b 3 142 19\nFUNC 3130 6 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::max_size()\n3130 0 707 23\n3130 5 708 23\n3135 1 709 23\nFUNC 3140 208 8 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Insert_n(std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >,unsigned int,google_breakpad::ExceptionHandler * const &)\n3140 6 1117 23\n3146 2 1125 23\n3148 1c 1126 23\n3164 1c 1130 23\n3180 5 1131 23\n3185 1b 1132 23\n31a0 23 1135 23\n31c3 17 1136 23\n31da 19 1137 23\n31f3 7 1138 23\n31fa 25 1143 23\n321f 7 1144 23\n3226 1e 1145 23\n3244 13 1152 23\n3257 4 1153 23\n325b 9 1156 23\n3264 7 1163 23\n326b a 1164 23\n3275 3 1165 23\n3278 a 1204 23\n3282 13 1167 23\n3295 17 1170 23\n32ac 1a 1174 23\n32c6 7 1180 23\n32cd 16 1187 23\n32e3 a 1204 23\n32ed 2a 1193 23\n3317 e 1200 23\n3325 19 1202 23\n333e a 1204 23\nFUNC 3350 7c 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Xlen()\n3350 29 1213 23\n3379 53 1214 23\nFUNC 33d0 1 0 std::allocator<google_breakpad::ExceptionHandler *>::allocator<google_breakpad::ExceptionHandler *>(std::allocator<google_breakpad::ExceptionHandler *> const &)\n33d0 0 124 19\n33d0 1 126 19\nFUNC 33e0 8 0 std::allocator<google_breakpad::ExceptionHandler *>::deallocate(google_breakpad::ExceptionHandler * *,unsigned int)\n33e0 0 140 19\n33e0 7 141 19\n33e7 1 142 19\nFUNC 33f0 56 0 std::allocator<google_breakpad::ExceptionHandler *>::allocate(unsigned int)\n33f0 3 145 19\n33f3 16 146 19\n3409 4 147 19\n340d 39 146 19\nFUNC 3450 32 4 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator+=(int)\n3450 0 361 23\n3450 2c 362 23\n347c 3 363 23\n347f 3 364 23\nFUNC 3490 28 0 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator-=(int)\n3490 0 373 23\n3490 27 374 23\n34b7 1 375 23\nFUNC 34c0 19 0 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator-(std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> > const &)\n34c0 0 384 23\n34c0 18 385 23\n34d8 1 386 23\nFUNC 34e0 21 0 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,std::_Container_base const *)\n34e0 0 77 23\n34e0 19 79 23\n34f9 2 80 23\n34fb 3 81 23\n34fe 3 82 23\nFUNC 3510 19 4 std::length_error::length_error(std::length_error const &)\nFUNC 3530 7 0 std::_Ranit<google_breakpad::ExceptionHandler *,int,google_breakpad::ExceptionHandler * const *,google_breakpad::ExceptionHandler * const &>::_Ranit<google_breakpad::ExceptionHandler *,int,google_breakpad::ExceptionHandler * const *,google_breakpad::ExceptionHandler * const &>()\nFUNC 3540 6 0 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::max_size()\n3540 0 1641 17\n3540 5 1643 17\n3545 1 1644 17\nFUNC 3550 171 8 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Copy(unsigned int,unsigned int)\n3550 30 2000 17\n3580 8 2001 17\n3588 5 2002 17\n358d 2 2003 17\n358f 2 2004 17\n3591 1f 2005 17\n35b0 3 2006 17\n35b3 2 2009 17\n35b5 18 2010 17\n35cd 2 2019 17\n35cf 30 2010 17\n35ff 3 2012 17\n3602 19 2014 17\n361b c 2019 17\n3627 7 2021 17\n362e 20 2022 17\n364e 12 2023 17\n3660 1c 2026 17\n367c 14 2027 17\n3690 15 2016 17\n36a5 1c 2017 17\nFUNC 36d0 39 4 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Inside(char const *)\n36d0 1 2050 17\n36d1 2b 2052 17\n36fc 3 2055 17\n36ff 4 2056 17\n3703 3 2053 17\n3706 3 2056 17\nFUNC 3710 6 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::max_size()\n3710 0 1641 17\n3710 5 1643 17\n3715 1 1644 17\nFUNC 3720 17b 8 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Copy(unsigned int,unsigned int)\n3720 30 2000 17\n3750 8 2001 17\n3758 8 2002 17\n3760 2 2003 17\n3762 2 2004 17\n3764 1f 2005 17\n3783 3 2006 17\n3786 2 2009 17\n3788 1b 2010 17\n37a3 2 2019 17\n37a5 30 2010 17\n37d5 3 2012 17\n37d8 19 2014 17\n37f1 c 2019 17\n37fd 7 2021 17\n3804 24 2022 17\n3828 12 2023 17\n383a 20 2026 17\n385a 14 2027 17\n386e 17 2016 17\n3885 16 2017 17\nFUNC 38a0 3a 4 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Inside(wchar_t const *)\n38a0 1 2050 17\n38a1 2c 2052 17\n38cd 3 2055 17\n38d0 4 2056 17\n38d4 3 2053 17\n38d7 3 2056 17\nFUNC 38e0 6 0 std::allocator<google_breakpad::ExceptionHandler *>::max_size()\n38e0 0 165 19\n38e0 5 167 19\n38e5 1 168 19\nFUNC 38f0 32 4 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator+=(int)\n38f0 0 146 23\n38f0 a 147 23\n38fa 1a 148 23\n3914 5 150 23\n3919 3 151 23\n391c 3 152 23\n391f 3 153 23\nFUNC 3930 19 0 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator-(std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> > const &)\n3930 0 173 23\n3930 f 178 23\n393f 9 181 23\n3948 1 182 23\nFUNC 3950 56 4 std::allocator<char>::allocate(unsigned int)\n3950 0 145 19\n3950 16 146 19\n3966 6 147 19\n396c 3a 146 19\nFUNC 39b0 4 0 std::allocator<char>::max_size()\n39b0 0 165 19\n39b0 3 167 19\n39b3 1 168 19\nFUNC 39c0 59 4 std::allocator<wchar_t>::allocate(unsigned int)\n39c0 0 145 19\n39c0 19 146 19\n39d9 6 147 19\n39df 3a 146 19\nFUNC 3a20 6 0 std::allocator<wchar_t>::max_size()\n3a20 0 165 19\n3a20 5 167 19\n3a25 1 168 19\nFUNC 3a30 21 10 std::_Traits_helper::copy_s<std::char_traits<char> >(char *,unsigned int,char const *,unsigned int)\n3a30 0 581 70\n3a30 20 582 70\n3a50 1 583 70\nFUNC 3a60 27 10 std::_Traits_helper::copy_s<std::char_traits<wchar_t> >(wchar_t *,unsigned int,wchar_t const *,unsigned int)\n3a60 0 581 70\n3a60 26 582 70\n3a86 1 583 70\nFUNC 3a90 24 0 stdext::unchecked_copy<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *)\n3a90 0 3407 65\n3a90 23 3409 65\n3ab3 1 3410 65\nFUNC 3ac0 1 0 std::_Destroy_range<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> &)\n3ac0 0 225 19\n3ac0 1 227 19\nFUNC 3ad0 15 0 stdext::unchecked_uninitialized_fill_n<google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::allocator<google_breakpad::ExceptionHandler *> &)\n3ad0 0 914 24\n3ad0 14 916 24\n3ae4 1 917 24\nFUNC 3af0 21 10 std::_Traits_helper::move_s<std::char_traits<char> >(char *,unsigned int,char const *,unsigned int)\n3af0 0 608 70\n3af0 20 609 70\n3b10 1 610 70\nFUNC 3b20 27 10 std::_Traits_helper::move_s<std::char_traits<wchar_t> >(wchar_t *,unsigned int,wchar_t const *,unsigned int)\n3b20 0 608 70\n3b20 26 609 70\n3b46 1 610 70\nFUNC 3b50 22 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Umove<google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *)\n3b50 0 1109 23\n3b50 21 1112 23\n3b71 1 1113 23\nFUNC 3b80 10 0 std::fill<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler *>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * const &)\n3b80 0 2976 65\n3b80 f 2977 65\n3b8f 1 2978 65\nFUNC 3b90 25 0 stdext::_Unchecked_move_backward<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *)\n3b90 0 3497 65\n3b90 24 3499 65\n3bb4 1 3500 65\nFUNC 3bc0 4f 0 std::_Allocate<google_breakpad::ExceptionHandler *>(unsigned int,google_breakpad::ExceptionHandler * *)\n3bc0 0 37 19\n3bc0 f 40 19\n3bcf 2c 41 19\n3bfb 10 44 19\n3c0b 4 45 19\nFUNC 3c10 54 8 std::_Allocate<char>(unsigned int,char *)\n3c10 0 37 19\n3c10 b 38 19\n3c1b 2 39 19\n3c1d 9 44 19\n3c26 4 45 19\n3c2a c 40 19\n3c36 2e 41 19\nFUNC 3c70 57 8 std::_Allocate<wchar_t>(unsigned int,wchar_t *)\n3c70 0 37 19\n3c70 b 38 19\n3c7b 2 39 19\n3c7d c 44 19\n3c89 4 45 19\n3c8d c 40 19\n3c99 2e 41 19\nFUNC 3cd0 19 4 std::bad_alloc::bad_alloc(std::bad_alloc const &)\nFUNC 3cf0 7 0 std::_Char_traits_cat<std::char_traits<char> >()\n3cf0 1 568 70\n3cf1 4 570 70\n3cf5 2 571 70\nFUNC 3d00 21 14 std::_Traits_helper::copy_s<std::char_traits<char> >(char *,unsigned int,char const *,unsigned int,std::_Secure_char_traits_tag)\n3d00 0 589 70\n3d00 20 590 70\n3d20 1 591 70\nFUNC 3d30 7 0 std::_Char_traits_cat<std::char_traits<wchar_t> >()\n3d30 1 568 70\n3d31 4 570 70\n3d35 2 571 70\nFUNC 3d40 27 14 std::_Traits_helper::copy_s<std::char_traits<wchar_t> >(wchar_t *,unsigned int,wchar_t const *,unsigned int,std::_Secure_char_traits_tag)\n3d40 0 589 70\n3d40 26 590 70\n3d66 1 591 70\nFUNC 3d70 3 0 std::_Checked_base<google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * * &)\n3d70 0 1009 65\n3d70 2 1011 65\n3d72 1 1012 65\nFUNC 3d80 1 0 std::_Iter_random<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * * const &,google_breakpad::ExceptionHandler * * const &)\n3d80 0 839 65\n3d80 1 844 65\nFUNC 3d90 7 0 std::_Ptr_cat<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * * &,google_breakpad::ExceptionHandler * * &)\n3d90 1 1329 65\n3d91 4 1331 65\n3d95 2 1332 65\nFUNC 3da0 15 4 std::_Copy_opt<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag)\n3da0 0 2288 65\n3da0 d 2300 65\n3dad 7 2301 65\n3db4 1 2302 65\nFUNC 3dc0 1 4 std::_Destroy_range<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> &,std::_Scalar_ptr_iterator_tag)\n3dc0 0 242 19\n3dc0 1 243 19\nFUNC 3dd0 15 8 std::_Uninit_fill_n<google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::allocator<google_breakpad::ExceptionHandler *> &,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag)\n3dd0 0 415 24\n3dd0 14 416 24\n3de4 1 417 24\nFUNC 3df0 21 14 std::_Traits_helper::move_s<std::char_traits<char> >(char *,unsigned int,char const *,unsigned int,std::_Secure_char_traits_tag)\n3df0 0 616 70\n3df0 20 617 70\n3e10 1 618 70\nFUNC 3e20 27 14 std::_Traits_helper::move_s<std::char_traits<wchar_t> >(wchar_t *,unsigned int,wchar_t const *,unsigned int,std::_Secure_char_traits_tag)\n3e20 0 616 70\n3e20 26 617 70\n3e46 1 618 70\nFUNC 3e50 22 0 stdext::_Unchecked_uninitialized_move<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> &)\n3e50 0 843 24\n3e50 21 845 24\n3e71 1 846 24\nFUNC 3e80 10 0 std::_Fill<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler *>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * const &)\n3e80 0 2946 65\n3e80 6 2948 65\n3e86 9 2949 65\n3e8f 1 2950 65\nFUNC 3e90 7 0 std::_Move_cat<google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * * const &)\n3e90 1 1046 65\n3e91 4 1048 65\n3e95 2 1049 65\nFUNC 3ea0 25 c std::_Move_backward_opt<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Undefined_move_tag>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Undefined_move_tag,std::_Range_checked_iterator_tag)\n3ea0 0 2546 65\n3ea0 24 2548 65\n3ec4 1 2549 65\nFUNC 3ed0 3 4 std::_Checked_base<google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * * &,std::_Unchanged_checked_iterator_base_type_tag)\n3ed0 0 992 65\n3ed0 2 993 65\n3ed2 1 994 65\nFUNC 3ee0 15 0 stdext::unchecked_fill_n<google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler *>(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &)\n3ee0 0 3523 65\n3ee0 14 3524 65\n3ef4 1 3525 65\nFUNC 3f00 22 8 std::_Uninit_move<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *>,std::_Undefined_move_tag>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> &,std::_Undefined_move_tag,std::_Range_checked_iterator_tag)\n3f00 0 205 24\n3f00 21 206 24\n3f21 1 207 24\nFUNC 3f30 13 0 std::_Copy_backward_opt<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag)\n3f30 0 2492 65\n3f30 10 2506 65\n3f40 2 2507 65\n3f42 1 2508 65\nFUNC 3f50 1 0 std::_Iter_cat<google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * * const &)\n3f50 0 798 65\n3f50 1 801 65\nFUNC 3f60 15 8 std::_Fill_n<google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler *>(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::random_access_iterator_tag,std::_Range_checked_iterator_tag)\n3f60 0 3040 65\n3f60 14 3044 65\n3f74 1 3045 65\nFUNC 3f80 22 0 stdext::unchecked_uninitialized_copy<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> &)\n3f80 0 803 24\n3f80 21 805 24\n3fa1 1 806 24\nFUNC 3fb0 15 4 std::_Fill_n<google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler *>(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::_Range_checked_iterator_tag)\n3fb0 0 2986 65\n3fb0 5 2987 65\n3fb5 f 2988 65\n3fc4 1 2989 65\nFUNC 3fd0 15 4 std::_Uninit_copy<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> &,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag)\n3fd0 0 144 24\n3fd0 d 150 24\n3fdd 7 151 24\n3fe4 1 152 24\nFUNC 3ff0 13 4 vswprintf\n3ff0 0 50 147\n3ff0 12 51 147\n4002 1 52 147\nFUNC 4010 ae 4 google_breakpad::GUIDString::GUIDToWString(_GUID *)\n4010 12 43 126\n4022 51 51 126\n4073 3a 52 126\n40ad 11 53 126\nFUNC 40c0 ae 4 google_breakpad::GUIDString::GUIDToSymbolServerWString(_GUID *)\n40c0 12 56 126\n40d2 51 64 126\n4123 3a 65 126\n415d 11 66 126\nFUNC 4170 40 4 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >(wchar_t const *)\n4170 0 650 143\n4170 3a 652 143\n41aa 6 653 143\nFUNC 41b0 86 8 main\n41b0 13 63 178\n41c3 38 64 178\n41fb 5 65 178\n4200 d 66 178\n420d 1b 67 178\n4228 e 68 178\nFUNC 4240 41 18 `anonymous namespace'::callback\n4240 3 45 178\n4243 8 46 178\n424b 11 47 178\n425c 2 48 178\n425e d 49 178\n426b 11 51 178\n427c 3 53 178\n427f 2 54 178\nFUNC 4290 18 0 `anonymous namespace'::CrashFunction\n4290 4 56 178\n4294 7 57 178\n429b 9 58 178\n42a4 4 59 178\nFUNC 42ae 18 4 std::invalid_argument::invalid_argument(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &)\n42ae 12 82 298\n42c0 6 83 298\nFUNC 42c6 b 0 std::invalid_argument::~invalid_argument()\n42c6 6 86 298\n42cc 5 87 298\nFUNC 42d1 22 0 std::invalid_argument::`vector deleting destructor'(unsigned int)\nFUNC 42f3 3f 0 std::_String_base::_Xlen()\n42f3 c 12 291\n42ff 33 13 291\nFUNC 4332 3f 0 std::_String_base::_Xran()\n4332 c 17 291\n433e 33 18 291\nFUNC 4371 3f 0 std::_String_base::_Xinvarg()\n4371 c 22 291\n437d 33 23 291\nFUNC 43b0 18 4 std::invalid_argument::invalid_argument(std::invalid_argument const &)\nFUNC 43c8 af 4 printf\n43c8 c 49 1601\n43d4 2b 54 1601\n43ff 14 58 1601\n4413 3 59 1601\n4416 10 61 1601\n4426 18 63 1601\n443e 11 65 1601\n444f c 68 1601\n445b 3 72 1601\n445e 6 73 1601\n4464 13 69 1601\nFUNC 4477 16 8 _printf_l\n4477 0 80 1601\n4477 15 85 1601\n448c 1 86 1601\nFUNC 448d 16 8 _printf_s_l\n448d 0 94 1601\n448d 15 99 1601\n44a2 1 100 1601\nFUNC 44a3 14 4 printf_s\n44a3 0 106 1601\n44a3 13 111 1601\n44b6 1 112 1601\nFUNC 44b7 16 8 _printf_p_l\n44b7 0 119 1601\n44b7 15 124 1601\n44cc 1 125 1601\nFUNC 44cd 14 4 _printf_p\n44cd 0 131 1601\n44cd 13 136 1601\n44e0 1 137 1601\nFUNC 44e1 25 4 _set_printf_count_output\n44e1 0 154 1601\n44e1 6 155 1601\n44e7 1e 156 1601\n4505 1 158 1601\nFUNC 4506 16 0 _get_printf_count_output\n4506 0 167 1601\n4506 15 168 1601\n451b 1 169 1601\nFUNC 451c f 0 __security_check_cookie\n451c 0 52 4397\n451c 6 55 4397\n4522 2 56 4397\n4524 2 57 4397\n4526 5 59 4397\nFUNC 452b 62 4 _flush\n452b 2 142 1704\n452d 25 152 1704\n4552 16 154 1704\n4568 7 158 1704\n456f 6 159 1704\n4575 2 161 1704\n4577 4 162 1704\n457b 4 163 1704\n457f 3 167 1704\n4582 7 168 1704\n4589 3 170 1704\n458c 1 171 1704\nFUNC 458d 42 4 _fflush_nolock\n458d 1 98 1704\n458e 8 102 1704\n4596 8 103 1704\n459e 1 116 1704\n459f b 106 1704\n45aa 4 108 1704\n45ae 1 116 1704\n45af 8 112 1704\n45b7 13 113 1704\n45ca 1 116 1704\n45cb 3 115 1704\n45ce 1 116 1704\nFUNC 45cf da 4 flsall\n45cf c 228 1704\n45db 5 230 1704\n45e0 3 231 1704\n45e3 8 233 1704\n45eb 3 234 1704\n45ee 11 236 1704\n45ff 14 238 1704\n4613 9 246 1704\n461c 6 248 1704\n4622 10 254 1704\n4632 5 256 1704\n4637 c 262 1704\n4643 3 266 1704\n4646 2 268 1704\n4648 a 269 1704\n4652 c 275 1704\n465e 3 276 1704\n4661 8 281 1704\n4669 3 236 1704\n466c 5 281 1704\n4671 11 282 1704\n4682 c 288 1704\n468e 4 292 1704\n4692 3 293 1704\n4695 2 292 1704\n4697 3 295 1704\n469a 6 296 1704\n46a0 9 289 1704\nFUNC 46a9 53 4 fflush\n46a9 c 57 1704\n46b5 7 62 1704\n46bc 9 63 1704\n46c5 9 65 1704\n46ce 3 67 1704\n46d1 c 68 1704\n46dd c 70 1704\n46e9 3 74 1704\n46ec 6 75 1704\n46f2 a 71 1704\nFUNC 46fc 9 0 _flushall\n46fc 0 193 1704\n46fc 8 194 1704\n4704 1 195 1704\nFUNC 4705 6 0 __iob_func\n4705 0 53 2087\n4705 5 54 2087\n470a 1 55 2087\nFUNC 470b b1 0 __initstdio\n470b 0 113 2087\n470b d 122 2087\n4718 7 123 2087\n471f 4 124 2087\n4723 7 125 2087\n472a 13 134 2087\n473d 19 137 2087\n4756 4 138 2087\n475a 1 163 2087\n475b e 145 2087\n4769 11 146 2087\n477a b 148 2087\n4785 24 151 2087\n47a9 2 158 2087\n47ab d 148 2087\n47b8 3 162 2087\n47bb 1 163 2087\nFUNC 47bc 20 0 __endstdio\n47bc 0 191 2087\n47bc 5 193 2087\n47c1 9 196 2087\n47ca 5 197 2087\n47cf c 198 2087\n47db 1 199 2087\nFUNC 47dc 3c 4 _lock_file\n47dc 1 221 2087\n47dd 15 226 2087\n47f2 10 231 2087\n4802 9 233 2087\n480b 1 242 2087\n480c b 241 2087\n4817 1 242 2087\nFUNC 4818 2e 8 _lock_file2\n4818 0 264 2087\n4818 9 269 2087\n4821 9 274 2087\n482a c 276 2087\n4836 1 285 2087\n4837 e 284 2087\n4845 1 285 2087\nFUNC 4846 36 4 _unlock_file\n4846 0 306 2087\n4846 14 311 2087\n485a 7 317 2087\n4861 f 318 2087\n4870 1 327 2087\n4871 a 326 2087\n487b 1 327 2087\nFUNC 487c 2a 8 _unlock_file2\n487c 0 349 2087\n487c 7 354 2087\n4883 d 360 2087\n4890 a 361 2087\n489a 1 370 2087\n489b a 369 2087\n48a5 1 370 2087\nFUNC 48a6 16 4 wcslen\n48a6 0 41 731\n48a6 4 42 731\n48aa a 44 731\n48b4 7 46 731\n48bb 1 47 731\nFUNC 48bc 5 4 operator delete(void *)\n48bc 0 20 5184\n48bc 5 23 5184\nFUNC 48c1 30 8 _JumpToContinuation(void *,EHRegistrationNode *)\n48c1 5 77 5627\n48c6 9 84 5627\n48cf 7 93 5627\n48d6 2 94 5627\n48d8 6 95 5627\n48de 3 100 5627\n48e1 3 101 5627\n48e4 3 102 5627\n48e7 3 103 5627\n48ea 2 104 5627\n48ec 5 106 5627\nFUNC 48f1 7 8 _CallMemberFunction0(void *,void *)\n48f1 0 118 5627\n48f1 1 120 5627\n48f2 1 121 5627\n48f3 3 122 5627\n48f6 2 123 5627\nFUNC 48f8 7 c _CallMemberFunction1(void *,void *,void *)\n48f8 0 139 5627\n48f8 1 141 5627\n48f9 1 142 5627\n48fa 3 143 5627\n48fd 2 144 5627\nFUNC 48ff 7 10 _CallMemberFunction2(void *,void *,void *,int)\n48ff 0 161 5627\n48ff 1 163 5627\n4900 1 164 5627\n4901 3 165 5627\n4904 2 166 5627\nFUNC 4906 52 8 _UnwindNestedFrames(EHRegistrationNode *,EHExceptionRecord *)\n4906 8 218 5627\n490e 7 232 5627\n4915 3 233 5627\n4918 7 236 5627\n491f 10 237 5627\n492f f 241 5627\n493e 7 247 5627\n4945 3 248 5627\n4948 2 249 5627\n494a 7 250 5627\n4951 7 256 5627\nFUNC 4958 36 10 __CxxFrameHandler\n4958 0 287 5627\n4958 1 295 5627\n4959 2 296 5627\n495b 3 297 5627\n495e 1 298 5627\n495f 1 299 5627\n4960 1 300 5627\n4961 1 301 5627\n4962 3 306 5627\n4965 1f 311 5627\n4984 1 316 5627\n4985 1 317 5627\n4986 1 318 5627\n4987 3 319 5627\n498a 2 320 5627\n498c 1 321 5627\n498d 1 322 5627\nFUNC 498e 36 10 __CxxFrameHandler3\n498e 0 341 5627\n498e 1 349 5627\n498f 2 350 5627\n4991 3 351 5627\n4994 1 352 5627\n4995 1 353 5627\n4996 1 354 5627\n4997 1 355 5627\n4998 3 360 5627\n499b 1f 365 5627\n49ba 1 370 5627\n49bb 1 371 5627\n49bc 1 372 5627\n49bd 3 373 5627\n49c0 2 374 5627\n49c2 1 375 5627\n49c3 1 376 5627\nFUNC 49c4 36 10 __CxxFrameHandler2\n49c4 0 391 5627\n49c4 1 399 5627\n49c5 2 400 5627\n49c7 3 401 5627\n49ca 1 402 5627\n49cb 1 403 5627\n49cc 1 404 5627\n49cd 1 405 5627\n49ce 3 410 5627\n49d1 1f 415 5627\n49f0 1 420 5627\n49f1 1 421 5627\n49f2 1 422 5627\n49f3 3 423 5627\n49f6 2 424 5627\n49f8 1 425 5627\n49f9 1 426 5627\nFUNC 49fa 1a 4 __CxxLongjmpUnwind\n49fa 0 443 5627\n49fa 17 449 5627\n4a11 3 452 5627\nFUNC 4a14 30 10 CatchGuardHandler\n4a14 1 545 5627\n4a15 1 551 5627\n4a16 e 557 5627\n4a24 1f 567 5627\n4a43 1 572 5627\nFUNC 4a44 d5 1c _CallSETranslator(EHExceptionRecord *,EHRegistrationNode *,void *,void *,_s_FuncInfo const *,int,EHRegistrationNode *)\n4a44 7 637 5627\n4a4b 9 642 5627\n4a54 5 644 5627\n4a59 3 645 5627\n4a5c 2 646 5627\n4a5e 8 648 5627\n4a66 4 656 5627\n4a6a 7 657 5627\n4a71 d 658 5627\n4a7e 6 659 5627\n4a84 6 660 5627\n4a8a 6 661 5627\n4a90 6 662 5627\n4a96 4 663 5627\n4a9a 4 664 5627\n4a9e 4 669 5627\n4aa2 3 675 5627\n4aa5 3 676 5627\n4aa8 6 681 5627\n4aae 3 682 5627\n4ab1 3 683 5627\n4ab4 6 684 5627\n4aba 7 690 5627\n4ac1 6 692 5627\n4ac7 6 693 5627\n4acd e 697 5627\n4adb e 701 5627\n4ae9 4 707 5627\n4aed 6 715 5627\n4af3 7 724 5627\n4afa 2 725 5627\n4afc 3 726 5627\n4aff 2 727 5627\n4b01 7 728 5627\n4b08 2 731 5627\n4b0a 3 737 5627\n4b0d 6 738 5627\n4b13 3 744 5627\n4b16 3 745 5627\nFUNC 4b19 9d 10 TranslatorGuardHandler\n4b19 5 770 5627\n4b1e 1 776 5627\n4b1f e 782 5627\n4b2d b 784 5627\n4b38 a 786 5627\n4b42 5 790 5627\n4b47 2 792 5627\n4b49 2a 796 5627\n4b73 9 798 5627\n4b7c b 802 5627\n4b87 1b 811 5627\n4ba2 3 818 5627\n4ba5 3 819 5627\n4ba8 3 820 5627\n4bab 3 821 5627\n4bae 2 822 5627\n4bb0 3 826 5627\n4bb3 3 828 5627\nFUNC 4bb6 73 14 _GetRangeOfTrysToCheck(_s_FuncInfo const *,int,int,unsigned int *,unsigned int *)\n4bb6 7 848 5627\n4bbd 6 849 5627\n4bc3 6 850 5627\n4bc9 2 851 5627\n4bcb 2 852 5627\n4bcd a 855 5627\n4bd7 1d 859 5627\n4bf4 3 860 5627\n4bf7 3 861 5627\n4bfa 3 862 5627\n4bfd 6 854 5627\n4c03 6 866 5627\n4c09 5 867 5627\n4c0e e 869 5627\n4c1c b 871 5627\n4c27 2 872 5627\nFUNC 4c29 28 8 _CreateFrameInfo\n4c29 0 889 5627\n4c29 b 890 5627\n4c34 e 891 5627\n4c42 b 892 5627\n4c4d 3 893 5627\n4c50 1 894 5627\nFUNC 4c51 21 4 _IsExceptionObjectToBeDestroyed\n4c51 0 907 5627\n4c51 d 910 5627\n4c5e 8 911 5627\n4c66 7 910 5627\n4c6d 1 915 5627\n4c6e 1 916 5627\n4c6f 2 912 5627\n4c71 1 916 5627\nFUNC 4c72 4c 4 _FindAndUnlinkFrame\n4c72 1 926 5627\n4c73 11 927 5627\n4c84 f 928 5627\n4c93 1 944 5627\n4c94 d 931 5627\n4ca1 7 935 5627\n4ca8 9 933 5627\n4cb1 5 943 5627\n4cb6 7 936 5627\n4cbd 1 944 5627\nFUNC 4cbe 5e 14 _CallCatchBlock2(EHRegistrationNode *,_s_FuncInfo const *,void *,int,unsigned long)\n4cbe 6 485 5627\n4cc4 e 493 5627\n4cd2 c 495 5627\n4cde 11 500 5627\n4cef 6 503 5627\n4cf5 3 504 5627\n4cf8 3 505 5627\n4cfb 6 506 5627\n4d01 e 512 5627\n4d0f 3 518 5627\n4d12 6 519 5627\n4d18 2 524 5627\n4d1a 2 525 5627\nFUNC 4d1c 4a 8 _CxxThrowException\n4d1c 6 95 5939\n4d22 15 117 5939\n4d37 3 118 5939\n4d3a 9 134 5939\n4d43 5 136 5939\n4d48 7 138 5939\n4d4f 13 159 5939\n4d62 4 161 5939\nFUNC 4d66 19 0 std::bad_alloc::bad_alloc()\n4d66 15 382 5121\n4d7b 4 383 5121\nFUNC 4d7f 6a 4 operator new(unsigned int)\n4d7f 6 57 5123\n4d85 2 59 5123\n4d87 d 60 5123\n4d94 d 59 5123\n4da1 2 67 5123\n4da3 27 62 5123\n4dca 1f 63 5123\nFUNC 4de9 f 4 type_info::name(__type_info_node *)\n4de9 0 44 5873\n4de9 c 45 5873\n4df5 3 46 5873\nFUNC 4df8 e 0 type_info::~type_info()\n4df8 0 49 5873\n4df8 d 50 5873\n4e05 1 51 5873\nFUNC 4e06 1c 0 type_info::`scalar deleting destructor'(unsigned int)\nFUNC 4e22 f 4 type_info::_name_internal_method(__type_info_node *)\n4e22 0 54 5873\n4e22 c 55 5873\n4e2e 3 56 5873\nFUNC 4e31 8 0 type_info::_type_info_dtor_internal_method()\n4e31 0 59 5873\n4e31 7 60 5873\n4e38 1 61 5873\nFUNC 4e39 1b 4 type_info::operator==(type_info const &)\n4e39 0 89 5873\n4e39 18 90 5873\n4e51 3 91 5873\nFUNC 4e54 1c 4 type_info::operator!=(type_info const &)\n4e54 0 98 5873\n4e54 19 99 5873\n4e6d 3 100 5873\nFUNC 4e70 1f 4 type_info::before(type_info const &)\n4e70 0 103 5873\n4e70 1c 104 5873\n4e8c 3 105 5873\nFUNC 4e8f 4 0 type_info::raw_name()\n4e8f 0 108 5873\n4e8f 3 109 5873\n4e92 1 110 5873\nFUNC 4e93 b 4 type_info::type_info(type_info const &)\n4e93 8 113 5873\n4e9b 3 123 5873\nFUNC 4e9e 5 4 type_info::operator=(type_info const &)\n4e9e 2 127 5873\n4ea0 3 135 5873\nFUNC 4ea3 11 0 std::exception::exception()\n4ea3 2 68 5916\n4ea5 4 69 5916\n4ea9 a 70 5916\n4eb3 1 71 5916\nFUNC 4eb4 4e 4 std::exception::exception(char const * const &)\n4eb4 1 77 5916\n4eb5 14 78 5916\n4ec9 9 80 5916\n4ed2 6 81 5916\n4ed8 9 82 5916\n4ee1 c 84 5916\n4eed 2 87 5916\n4eef 4 89 5916\n4ef3 7 91 5916\n4efa 8 92 5916\nFUNC 4f02 18 8 std::exception::exception(char const * const &,int)\n4f02 2 98 5916\n4f04 c 99 5916\n4f10 7 100 5916\n4f17 3 101 5916\nFUNC 4f1a 58 4 std::exception::exception(std::exception const &)\n4f1a 1 107 5916\n4f1b 13 108 5916\n4f2e 2 109 5916\n4f30 a 111 5916\n4f3a 9 113 5916\n4f43 6 114 5916\n4f49 9 115 5916\n4f52 d 117 5916\n4f5f 2 120 5916\n4f61 4 122 5916\n4f65 2 125 5916\n4f67 4 126 5916\n4f6b 7 127 5916\nFUNC 4f72 56 4 std::exception::operator=(std::exception const &)\n4f72 1 133 5916\n4f73 c 134 5916\n4f7f 6 136 5916\n4f85 2 137 5916\n4f87 9 139 5916\n4f90 9 141 5916\n4f99 6 144 5916\n4f9f 9 146 5916\n4fa8 d 148 5916\n4fb5 2 151 5916\n4fb7 4 153 5916\n4fbb 2 156 5916\n4fbd 3 157 5916\n4fc0 5 159 5916\n4fc5 3 160 5916\nFUNC 4fc8 16 0 std::exception::~exception()\n4fc8 0 167 5916\n4fc8 c 168 5916\n4fd4 9 169 5916\n4fdd 1 170 5916\nFUNC 4fde d 0 std::exception::what()\n4fde 0 180 5916\n4fde 5 181 5916\n4fe3 2 182 5916\n4fe5 5 184 5916\n4fea 1 185 5916\nFUNC 4feb 19 4 std::bad_cast::bad_cast(char const *)\n4feb 13 194 5916\n4ffe 6 195 5916\nFUNC 5004 18 4 std::bad_cast::bad_cast(std::bad_cast const &)\n5004 12 199 5916\n5016 6 200 5916\nFUNC 501c b 0 std::bad_cast::~bad_cast()\n501c 6 203 5916\n5022 5 204 5916\nFUNC 5027 19 4 std::bad_typeid::bad_typeid(char const *)\n5027 13 229 5916\n503a 6 230 5916\nFUNC 5040 18 4 std::bad_typeid::bad_typeid(std::bad_typeid const &)\n5040 12 234 5916\n5052 6 235 5916\nFUNC 5058 b 0 std::bad_typeid::~bad_typeid()\n5058 6 238 5916\n505e 5 239 5916\nFUNC 5063 18 4 std::__non_rtti_object::__non_rtti_object(char const *)\n5063 12 248 5916\n5075 6 249 5916\nFUNC 507b 18 4 std::__non_rtti_object::__non_rtti_object(std::__non_rtti_object const &)\n507b 12 253 5916\n508d 6 254 5916\nFUNC 5093 b 0 std::__non_rtti_object::~__non_rtti_object()\n5093 0 257 5916\n5093 b 258 5916\nFUNC 509e 1c 0 std::exception::`vector deleting destructor'(unsigned int)\nFUNC 50ba 22 0 std::bad_cast::`vector deleting destructor'(unsigned int)\nFUNC 50dc 22 0 std::bad_typeid::`scalar deleting destructor'(unsigned int)\nFUNC 50fe 22 0 std::__non_rtti_object::`scalar deleting destructor'(unsigned int)\nFUNC 5120 7b 10 memcpy_s\n5120 4 47 1002\n5124 a 48 1002\n512e 4 51 1002\n5132 20 55 1002\n5152 a 56 1002\n515c f 67 1002\n516b 2 68 1002\n516d f 59 1002\n517c 5 61 1002\n5181 13 62 1002\n5194 5 64 1002\n5199 2 69 1002\nFUNC 519b 5b 10 memmove_s\n519b 3 46 955\n519e 9 47 955\n51a7 2 50 955\n51a9 20 54 955\n51c9 5 55 955\n51ce 13 56 955\n51e1 f 58 955\n51f0 4 59 955\n51f4 2 60 955\nFUNC 51f6 a 4 _set_osplatform\n51f6 a 385 2595\nFUNC 5200 a 4 _set_osver\n5200 a 386 2595\nFUNC 520a a 4 _set_winver\n520a a 387 2595\nFUNC 5214 a 4 _set_winmajor\n5214 a 388 2595\nFUNC 521e a 4 _set_winminor\n521e a 389 2595\nFUNC 5228 24 4 fast_error_exit\n5228 0 375 2608\n5228 9 384 2608\n5231 5 386 2608\n5236 9 388 2608\n523f c 389 2608\n524b 1 390 2608\nFUNC 524c 41 0 check_managed_app\n524c 0 413 2608\n524c b 418 2608\n5257 5 422 2608\n525c a 424 2608\n5266 2 425 2608\n5268 9 427 2608\n5271 2 428 2608\n5273 7 433 2608\n527a 2 434 2608\n527c d 437 2608\n5289 1 438 2608\n528a 2 419 2608\n528c 1 438 2608\nFUNC 528d 1b6 0 __tmainCRTStartup\n528d c 203 2608\n5299 19 233 2608\n52b2 4 234 2608\n52b6 8 235 2608\n52be a 236 2608\n52c8 2 242 2608\n52ca 7 243 2608\n52d1 3 244 2608\n52d4 4 243 2608\n52d8 9 244 2608\n52e1 2 245 2608\n52e3 6 248 2608\n52e9 6 249 2608\n52ef 6 250 2608\n52f5 9 256 2608\n52fe 9 257 2608\n5307 8 258 2608\n530f 6 259 2608\n5315 d 260 2608\n5322 6 262 2608\n5328 5 263 2608\n532d 6 264 2608\n5333 6 265 2608\n5339 6 266 2608\n533f 8 271 2608\n5347 c 273 2608\n5353 8 274 2608\n535b 9 276 2608\n5364 8 277 2608\n536c 5 286 2608\n5371 4 294 2608\n5375 9 296 2608\n537e 8 297 2608\n5386 b 300 2608\n5391 a 303 2608\n539b 9 305 2608\n53a4 8 306 2608\n53ac 9 307 2608\n53b5 8 308 2608\n53bd 8 310 2608\n53c5 4 311 2608\n53c9 7 312 2608\n53d0 a 326 2608\n53da 18 327 2608\n53f2 6 330 2608\n53f8 6 331 2608\n53fe 5 333 2608\n5403 2 335 2608\n5405 17 336 2608\n541c 6 342 2608\n5422 6 344 2608\n5428 6 345 2608\n542e 5 347 2608\n5433 7 349 2608\n543a 3 351 2608\n543d 6 352 2608\nFUNC 5443 a 0 mainCRTStartup\n5443 0 186 2608\n5443 5 193 2608\n5448 5 195 2608\nFUNC 544d a 4 _initp_misc_invarg\n544d 0 38 3328\n544d 9 39 3328\n5456 1 40 3328\nFUNC 5457 fc 14 _invoke_watson\n5457 1c 111 3328\n5473 6 128 3328\n5479 6 129 3328\n547f 6 130 3328\n5485 3 131 3328\n5488 3 132 3328\n548b 3 133 3328\n548e 7 134 3328\n5495 7 135 3328\n549c 4 136 3328\n54a0 4 137 3328\n54a4 4 138 3328\n54a8 4 139 3328\n54ac 1 140 3328\n54ad 6 141 3328\n54b3 6 147 3328\n54b9 19 148 3328\n54d2 3 150 3328\n54d5 13 163 3328\n54e8 6 168 3328\n54ee 13 169 3328\n5501 6 171 3328\n5507 a 174 3328\n5511 a 176 3328\n551b 8 180 3328\n5523 8 181 3328\n552b 12 184 3328\n553d 16 185 3328\nFUNC 5553 22 4 _set_invalid_parameter_handler\n5553 1 207 3328\n5554 b 211 3328\n555f d 212 3328\n556c 5 214 3328\n5571 3 216 3328\n5574 1 217 3328\nFUNC 5575 d 0 _get_invalid_parameter_handler\n5575 0 221 3328\n5575 c 225 3328\n5581 1 228 3328\nFUNC 5582 9 14 _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)\n5582 3 266 3328\n5585 1 274 3328\n5586 5 273 3328\nFUNC 558b 24 14 _invalid_parameter\n558b 3 70 3328\n558e b 77 3328\n5599 5 78 3328\n559e 1 89 3328\n559f 2 80 3328\n55a1 8 86 3328\n55a9 1 89 3328\n55aa 5 88 3328\nFUNC 55af 10 0 _invalid_parameter_noinfo\n55af 0 98 3328\n55af f 99 3328\n55be 1 100 3328\nFUNC 55bf 9 14 _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)\n55bf 3 249 3328\n55c2 1 257 3328\n55c3 5 256 3328\nFUNC 55c8 96 8 _swprintf\n55c8 7 122 1564\n55cf 24 128 1564\n55f3 8 133 1564\n55fb 6 138 1564\n5601 22 153 1564\n5623 1d 160 1564\n5640 18 161 1564\n5658 4 163 1564\n565c 2 171 1564\nFUNC 565e 1a c __swprintf_l\n565e 0 181 1564\n565e 19 186 1564\n5677 1 188 1564\nFUNC 5678 1c c swprintf_s\n5678 0 238 1564\n5678 1b 243 1564\n5693 1 244 1564\nFUNC 5694 1f 10 _snwprintf_s\n5694 3 253 1564\n5697 1a 258 1564\n56b1 2 259 1564\nFUNC 56b3 1c c _swprintf_p\n56b3 0 267 1564\n56b3 1b 272 1564\n56ce 1 273 1564\nFUNC 56cf 1d 10 _swprintf_s_l\n56cf 3 282 1564\n56d2 18 287 1564\n56ea 2 288 1564\nFUNC 56ec 20 14 _snwprintf_s_l\n56ec 3 298 1564\n56ef 1b 303 1564\n570a 2 304 1564\nFUNC 570c 1d 10 _swprintf_p_l\n570c 3 313 1564\n570f 18 318 1564\n5727 2 319 1564\nFUNC 5729 11 4 _scwprintf\n5729 0 347 1564\n5729 10 352 1564\n5739 1 353 1564\nFUNC 573a 11 4 _scwprintf_p\n573a 0 359 1564\n573a 10 364 1564\n574a 1 365 1564\nFUNC 574b 16 8 _scwprintf_l\n574b 0 372 1564\n574b 15 376 1564\n5760 1 377 1564\nFUNC 5761 16 8 _scwprintf_p_l\n5761 0 384 1564\n5761 15 389 1564\n5776 1 390 1564\nFUNC 5777 14f 8 fprintf\n5777 c 49 1648\n5783 5 53 1648\n5788 2e 55 1648\n57b6 c 56 1648\n57c2 3 61 1648\n57c5 7 63 1648\n57cc 3 64 1648\n57cf b0 66 1648\n587f 5 67 1648\n5884 8 69 1648\n588c 11 70 1648\n589d a 71 1648\n58a7 c 75 1648\n58b3 3 79 1648\n58b6 6 80 1648\n58bc a 76 1648\nFUNC 58c6 1a c _fprintf_l\n58c6 0 88 1648\n58c6 19 93 1648\n58df 1 94 1648\nFUNC 58e0 1a c _fprintf_s_l\n58e0 0 102 1648\n58e0 19 107 1648\n58f9 1 108 1648\nFUNC 58fa 18 8 fprintf_s\n58fa 0 115 1648\n58fa 17 120 1648\n5911 1 121 1648\nFUNC 5912 1a c _fprintf_p_l\n5912 0 129 1648\n5912 19 134 1648\n592b 1 135 1648\nFUNC 592c 18 8 _fprintf_p\n592c 0 142 1648\n592c 17 147 1648\n5943 1 148 1648\nFUNC 5944 f6 18 _vswprintf_helper\n5944 7 125 1380\n594b 28 130 1380\n5973 2f 133 1380\n59a2 15 143 1380\n59b7 7 146 1380\n59be 2 148 1380\n59c0 6 150 1380\n59c6 13 157 1380\n59d9 5 160 1380\n59de 2 162 1380\n59e0 41 171 1380\n5a21 5 172 1380\n5a26 12 175 1380\n5a38 2 183 1380\nFUNC 5a3a 27 10 _vswprintf_c\n5a3a 0 241 1380\n5a3a 1f 242 1380\n5a59 7 243 1380\n5a60 1 244 1380\nFUNC 5a61 28 14 _vswprintf_c_l\n5a61 3 253 1380\n5a64 1c 254 1380\n5a80 7 255 1380\n5a87 2 256 1380\nFUNC 5a89 87 14 _vswprintf_s_l\n5a89 4 265 1380\n5a8d 25 269 1380\n5ab2 19 270 1380\n5acb 1a 272 1380\n5ae5 4 273 1380\n5ae9 3 275 1380\n5aec 5 278 1380\n5af1 1d 280 1380\n5b0e 2 288 1380\nFUNC 5b10 1b 10 vswprintf_s\n5b10 0 296 1380\n5b10 1a 297 1380\n5b2a 1 298 1380\nFUNC 5b2b 107 18 _vsnwprintf_s_l\n5b2b 5 308 1380\n5b30 27 313 1380\n5b57 13 314 1380\n5b6a 7 317 1380\n5b71 1b 319 1380\n5b8c 8 323 1380\n5b94 20 324 1380\n5bb4 5 325 1380\n5bb9 a 329 1380\n5bc3 7 331 1380\n5bca 2 333 1380\n5bcc 2 338 1380\n5bce 12 339 1380\n5be0 10 342 1380\n5bf0 a 344 1380\n5bfa a 346 1380\n5c04 2 348 1380\n5c06 4 352 1380\n5c0a 8 356 1380\n5c12 18 358 1380\n5c2a 6 360 1380\n5c30 2 366 1380\nFUNC 5c32 1e 14 _vsnwprintf_s\n5c32 3 375 1380\n5c35 19 376 1380\n5c4e 2 377 1380\nFUNC 5c50 27 10 _vswprintf_p\n5c50 0 385 1380\n5c50 1f 386 1380\n5c6f 7 387 1380\n5c76 1 388 1380\nFUNC 5c77 28 14 _vswprintf_p_l\n5c77 3 397 1380\n5c7a 1c 398 1380\n5c96 7 399 1380\n5c9d 2 400 1380\nFUNC 5c9f 24 4 _amsg_exit\n5c9f 0 446 2560\n5c9f 5 449 2560\n5ca4 9 450 2560\n5cad b 451 2560\n5cb8 a 452 2560\n5cc2 1 453 2560\nFUNC 5cc3 26 4 __crtCorExitProcess\n5cc3 0 650 2560\n5cc3 b 654 2560\n5cce 4 655 2560\n5cd2 c 656 2560\n5cde 4 657 2560\n5ce2 6 658 2560\n5ce8 1 668 2560\nFUNC 5ce9 15 4 __crtExitProcess\n5ce9 0 673 2560\n5ce9 a 674 2560\n5cf3 b 683 2560\nFUNC 5cfe 9 0 _lockexit\n5cfe 0 733 2560\n5cfe 8 734 2560\n5d06 1 735 2560\nFUNC 5d07 9 0 _unlockexit\n5d07 0 759 2560\n5d07 8 760 2560\n5d0f 1 761 2560\nFUNC 5d10 18 4 _initterm\n5d10 3 841 2560\n5d13 2 855 2560\n5d15 6 853 2560\n5d1b 2 854 2560\n5d1d 3 855 2560\n5d20 7 848 2560\n5d27 1 857 2560\nFUNC 5d28 20 8 _initterm_e\n5d28 1 890 2560\n5d29 c 899 2560\n5d35 6 904 2560\n5d3b 2 905 2560\n5d3d 3 906 2560\n5d40 7 899 2560\n5d47 1 910 2560\nFUNC 5d48 37 4 _get_osplatform\n5d48 0 929 2560\n5d48 27 931 2560\n5d6f 1 939 2560\n5d70 9 934 2560\n5d79 2 936 2560\n5d7b 3 938 2560\n5d7e 1 939 2560\nFUNC 5d7f 3c 4 _get_osver\n5d7f 0 958 2560\n5d7f 27 960 2560\n5da6 1 968 2560\n5da7 8 963 2560\n5daf 8 965 2560\n5db7 3 967 2560\n5dba 1 968 2560\nFUNC 5dbb 3c 4 _get_winver\n5dbb 0 987 2560\n5dbb 27 989 2560\n5de2 1 997 2560\n5de3 8 992 2560\n5deb 8 994 2560\n5df3 3 996 2560\n5df6 1 997 2560\nFUNC 5df7 3c 4 _get_winmajor\n5df7 0 1016 2560\n5df7 27 1018 2560\n5e1e 1 1026 2560\n5e1f 8 1021 2560\n5e27 8 1023 2560\n5e2f 3 1025 2560\n5e32 1 1026 2560\nFUNC 5e33 3c 4 _get_winminor\n5e33 0 1045 2560\n5e33 27 1047 2560\n5e5a 1 1055 2560\n5e5b 8 1050 2560\n5e63 8 1052 2560\n5e6b 3 1054 2560\n5e6e 1 1055 2560\nFUNC 5e6f 37 4 _get_wpgmptr\n5e6f 0 1074 2560\n5e6f 27 1076 2560\n5e96 1 1085 2560\n5e97 9 1080 2560\n5ea0 2 1082 2560\n5ea2 3 1084 2560\n5ea5 1 1085 2560\nFUNC 5ea6 37 4 _get_pgmptr\n5ea6 0 1104 2560\n5ea6 27 1106 2560\n5ecd 1 1115 2560\n5ece 9 1110 2560\n5ed7 2 1112 2560\n5ed9 3 1114 2560\n5edc 1 1115 2560\nFUNC 5edd 92 4 _cinit\n5edd 0 263 2560\n5edd 18 273 2560\n5ef5 b 275 2560\n5f00 5 277 2560\n5f05 f 283 2560\n5f14 4 284 2560\n5f18 4 285 2560\n5f1c a 288 2560\n5f26 20 293 2560\n5f46 1a 306 2560\n5f60 c 308 2560\n5f6c 2 312 2560\n5f6e 1 313 2560\nFUNC 5f6f e2 c doexit\n5f6f c 499 2560\n5f7b 8 517 2560\n5f83 5 518 2560\n5f88 b 520 2560\n5f93 6 521 2560\n5f99 8 524 2560\n5fa1 5 526 2560\n5fa6 e 542 2560\n5fb4 12 543 2560\n5fc6 5 545 2560\n5fcb b 546 2560\n5fd6 10 551 2560\n5fe6 9 552 2560\n5fef 2 553 2560\n5ff1 10 558 2560\n6001 10 566 2560\n6011 c 584 2560\n601d 6 588 2560\n6023 6 592 2560\n6029 8 594 2560\n6031 8 596 2560\n6039 3 584 2560\n603c 6 585 2560\n6042 9 586 2560\n604b 6 597 2560\nFUNC 6051 11 4 exit\n6051 0 397 2560\n6051 10 398 2560\n6061 1 399 2560\nFUNC 6062 11 4 _exit\n6062 0 405 2560\n6062 10 406 2560\n6072 1 407 2560\nFUNC 6073 f 0 _cexit\n6073 0 412 2560\n6073 e 413 2560\n6081 1 414 2560\nFUNC 6082 f 0 _c_exit\n6082 0 419 2560\n6082 e 420 2560\n6090 1 421 2560\nFUNC 6091 4c 0 _init_pointers\n6091 1 786 2560\n6092 7 787 2560\n6099 6 789 2560\n609f 6 790 2560\n60a5 6 791 2560\n60ab 6 792 2560\n60b1 6 793 2560\n60b7 6 794 2560\n60bd 6 795 2560\n60c3 6 796 2560\n60c9 13 799 2560\n60dc 1 800 2560\nFUNC 60e0 8b 4 strlen\n60e0 0 54 880\n60e0 4 63 880\n60e4 6 64 880\n60ea 2 65 880\n60ec 2 69 880\n60ee 3 70 880\n60f1 2 71 880\n60f3 2 72 880\n60f5 6 73 880\n60fb 2 74 880\n60fd 13 76 880\n6110 2 81 880\n6112 5 82 880\n6117 2 83 880\n6119 3 84 880\n611c 2 85 880\n611e 3 86 880\n6121 5 87 880\n6126 2 88 880\n6128 3 90 880\n612b 2 91 880\n612d 2 92 880\n612f 2 93 880\n6131 2 94 880\n6133 5 95 880\n6138 2 96 880\n613a 5 97 880\n613f 2 98 880\n6141 2 99 880\n6143 3 103 880\n6146 4 104 880\n614a 2 105 880\n614c 1 106 880\n614d 3 108 880\n6150 4 109 880\n6154 2 110 880\n6156 1 111 880\n6157 3 113 880\n615a 4 114 880\n615e 2 115 880\n6160 1 116 880\n6161 3 118 880\n6164 4 119 880\n6168 2 120 880\n616a 1 121 880\nFUNC 616b 33 4 _EH_prolog3\n616b 0 93 5671\n616b 1 101 5671\n616c 7 103 5671\n6173 4 112 5671\n6177 4 113 5671\n617b 1 114 5671\n617c 1 115 5671\n617d 1 116 5671\n617e 2 117 5671\n6180 2 118 5671\n6182 5 131 5671\n6187 2 132 5671\n6189 1 133 5671\n618a 3 134 5671\n618d 7 135 5671\n6194 3 150 5671\n6197 6 151 5671\n619d 1 153 5671\nFUNC 619e 36 4 _EH_prolog3_catch\n619e 0 206 5671\n619e 1 214 5671\n619f 7 216 5671\n61a6 4 225 5671\n61aa 4 226 5671\n61ae 1 228 5671\n61af 1 229 5671\n61b0 1 230 5671\n61b1 2 231 5671\n61b3 2 232 5671\n61b5 5 246 5671\n61ba 2 247 5671\n61bc 1 248 5671\n61bd 3 249 5671\n61c0 3 250 5671\n61c3 7 251 5671\n61ca 3 267 5671\n61cd 6 268 5671\n61d3 1 270 5671\nFUNC 61d4 36 4 _EH_prolog3_GS\n61d4 0 322 5671\n61d4 1 330 5671\n61d5 7 332 5671\n61dc 4 341 5671\n61e0 4 342 5671\n61e4 1 344 5671\n61e5 1 345 5671\n61e6 1 346 5671\n61e7 2 347 5671\n61e9 2 348 5671\n61eb 5 362 5671\n61f0 2 363 5671\n61f2 1 364 5671\n61f3 3 365 5671\n61f6 3 366 5671\n61f9 7 367 5671\n6200 3 384 5671\n6203 6 385 5671\n6209 1 387 5671\nFUNC 620a 39 4 _EH_prolog3_catch_GS\n620a 0 441 5671\n620a 1 449 5671\n620b 7 451 5671\n6212 4 460 5671\n6216 4 461 5671\n621a 1 463 5671\n621b 1 464 5671\n621c 1 465 5671\n621d 2 466 5671\n621f 2 467 5671\n6221 5 482 5671\n6226 2 483 5671\n6228 1 484 5671\n6229 3 485 5671\n622c 3 486 5671\n622f 3 487 5671\n6232 7 488 5671\n6239 3 505 5671\n623c 6 506 5671\n6242 1 508 5671\nFUNC 6243 14 0 _EH_epilog3\n6243 0 534 5671\n6243 3 537 5671\n6246 7 538 5671\n624d 1 539 5671\n624e 1 540 5671\n624f 1 541 5671\n6250 1 542 5671\n6251 1 543 5671\n6252 2 544 5671\n6254 1 545 5671\n6255 1 546 5671\n6256 1 547 5671\nFUNC 6257 f 0 _EH_epilog3_GS\n6257 0 575 5671\n6257 3 578 5671\n625a 2 579 5671\n625c 5 580 5671\n6261 5 581 5671\nFUNC 6266 f 0 _EH_epilog3_catch_GS\n6266 0 609 5671\n6266 3 612 5671\n6269 2 613 5671\n626b 5 614 5671\n6270 5 615 5671\nFUNC 6275 96 4 _stbuf\n6275 1 59 1850\n6276 14 69 1850\n628a 2 70 1850\n628c c 73 1850\n6298 4 74 1850\n629c c 75 1850\n62a8 3 76 1850\n62ab 6 82 1850\n62b1 6 86 1850\n62b7 4 87 1850\n62bb 1e 91 1850\n62d9 3 93 1850\n62dc e 94 1850\n62ea 2 96 1850\n62ec 7 98 1850\n62f3 6 99 1850\n62f9 8 102 1850\n6301 5 104 1850\n6306 1 105 1850\n6307 3 78 1850\n630a 1 105 1850\nFUNC 630b 2f 8 _ftbuf\n630b 0 138 1850\n630b 8 146 1850\n6313 c 148 1850\n631f 6 151 1850\n6325 7 152 1850\n632c 4 153 1850\n6330 9 154 1850\n6339 1 166 1850\nFUNC 633a 82 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)\n633a 0 261 1343\n633a f 262 1343\n6349 8 264 1343\n6351 5 265 1343\n6356 6 266 1343\n635c 1c 268 1343\n6378 21 269 1343\n6399 9 270 1343\n63a2 4 272 1343\n63a6 4 273 1343\n63aa 2 276 1343\n63ac a 278 1343\n63b6 6 280 1343\nFUNC 63bc e 0 _LocaleUpdate::~_LocaleUpdate()\n63bc 0 282 1343\n63bc 6 283 1343\n63c2 7 284 1343\n63c9 1 285 1343\nFUNC 63ca 3 0 _LocaleUpdate::GetLocaleT()\n63ca 2 287 1343\n63cc 1 289 1343\nFUNC 63cd 33 0 write_char\n63cd 0 2433 1312\n63cd a 2434 1312\n63d7 2 2437 1312\n63d9 21 2442 1312\n63fa 2 2444 1312\n63fc 1 2447 1312\n63fd 2 2446 1312\n63ff 1 2447 1312\nFUNC 6400 24 c write_multi_char\n6400 6 2498 1312\n6406 2 2501 1312\n6408 e 2500 1312\n6416 5 2501 1312\n641b 7 2499 1312\n6422 2 2504 1312\nFUNC 6424 4a 4 write_string\n6424 0 2563 1312\n6424 12 2564 1312\n6436 6 2566 1312\n643c 2 2567 1312\n643e e 2570 1312\n644c 5 2571 1312\n6451 a 2573 1312\n645b 9 2574 1312\n6464 9 2569 1312\n646d 1 2579 1312\nFUNC 646e d 4 get_int_arg\n646e 0 2602 1312\n646e c 2603 1312\n647a 1 2604 1312\nFUNC 647b 10 4 get_int64_arg\n647b 0 2644 1312\n647b f 2645 1312\n648a 1 2646 1312\nFUNC 648b e 4 get_short_arg\n648b 0 2671 1312\n648b d 2672 1312\n6498 1 2673 1312\nFUNC 6499 994 10 _output_l\n6499 1b 975 1312\n64b4 45 1036 1312\n64f9 2d 1031 1312\n6526 b1 1033 1312\n65d7 8 1036 1312\n65df 26 1073 1312\n6605 1d 1075 1312\n6622 8 1076 1312\n662a 18 1131 1312\n6642 13 1173 1312\n6655 3 1174 1312\n6658 5 1175 1312\n665d 1f 1179 1312\n667c 4 1193 1312\n6680 5 1194 1312\n6685 4 1181 1312\n6689 5 1182 1312\n668e 4 1184 1312\n6692 5 1185 1312\n6697 7 1190 1312\n669e 5 1191 1312\n66a3 4 1187 1312\n66a7 5 1196 1312\n66ac 5 1200 1312\n66b1 9 1206 1312\n66ba b 1233 1312\n66c5 4 1235 1312\n66c9 3 1236 1312\n66cc 5 1239 1312\n66d1 10 1241 1312\n66e1 5 1243 1312\n66e6 3 1248 1312\n66e9 5 1249 1312\n66ee 5 1253 1312\n66f3 9 1259 1312\n66fc b 1284 1312\n6707 4 1285 1312\n670b 5 1287 1312\n6710 10 1289 1312\n6720 5 1291 1312\n6725 18 1295 1312\n673d 7 1362 1312\n6744 5 1363 1312\n6749 5 1301 1312\n674e 1 1303 1312\n674f a 1304 1312\n6759 5 1306 1312\n675e 4 1308 1312\n6762 5 1310 1312\n6767 4 1358 1312\n676b 5 1359 1312\n6770 c 1322 1312\n677c 2 1324 1312\n677e f 1325 1312\n678d a 1327 1312\n6797 2 1329 1312\n6799 a 1330 1312\n67a3 5 1332 1312\n67a8 30 1337 1312\n67d8 3 1352 1312\n67db 13 1158 1312\n67ee 11 1160 1312\n67ff 3 1161 1312\n6802 b 1163 1312\n680d b 1166 1312\n6818 5 1167 1312\n681d 32 1378 1312\n684f d 1716 1312\n685c 4 1724 1312\n6860 17 1749 1312\n6877 c 1750 1312\n6883 8 1381 1312\n688b 9 1385 1312\n6894 8 1561 1312\n689c 7 1562 1312\n68a3 d 1584 1312\n68b0 3 1589 1312\n68b3 15 1635 1312\n68c8 4 1636 1312\n68cc 8 1637 1312\n68d4 f 1639 1312\n68e3 1d 1378 1312\n6900 12 1448 1312\n6912 16 1467 1312\n6928 4 1470 1312\n692c 7 1471 1312\n6933 2 1472 1312\n6935 6 1499 1312\n693b 7 1500 1312\n6942 6 1503 1312\n6948 5 1506 1312\n694d 5 1523 1312\n6952 e 1541 1312\n6960 6 1546 1312\n6966 d 1548 1312\n6973 7 1549 1312\n697a 5 1550 1312\n697f 3 1551 1312\n6982 5 1553 1312\n6987 8 1543 1312\n698f 7 1544 1312\n6996 5 1557 1312\n699b 34 1378 1312\n69cf d 1908 1312\n69dc 9 1910 1312\n69e5 8 1668 1312\n69ed d 1688 1312\n69fa 6 1702 1312\n6a00 7 1703 1312\n6a07 2 1704 1312\n6a09 5 1706 1312\n6a0e 7 1708 1312\n6a15 5 1710 1312\n6a1a 4 1864 1312\n6a1e 7 1869 1312\n6a25 c 1933 1312\n6a31 8 1939 1312\n6a39 5 1958 1312\n6a3e 7 1751 1312\n6a45 9 1752 1312\n6a4e 5 1753 1312\n6a53 3 1754 1312\n6a56 9 1756 1312\n6a5f f 1759 1312\n6a6e 2 1760 1312\n6a70 13 1765 1312\n6a83 9 1767 1312\n6a8c e 1809 1312\n6a9a 27 1828 1312\n6ac1 13 1838 1312\n6ad4 15 1840 1312\n6ae9 a 1844 1312\n6af3 15 1846 1312\n6b08 5 1852 1312\n6b0d 7 1853 1312\n6b14 4 1854 1312\n6b18 1 1857 1312\n6b19 5 1859 1312\n6b1e 7 1877 1312\n6b25 3 1887 1312\n6b28 2 1888 1312\n6b2a 1a 1378 1312\n6b44 7 1892 1312\n6b4b 11 1897 1312\n6b5c c 1900 1312\n6b68 7 1901 1312\n6b6f 5 1903 1312\n6b74 5 1961 1312\n6b79 6 1987 1312\n6b7f 14 2026 1312\n6b93 2 2045 1312\n6b95 5 2051 1312\n6b9a 2 2071 1312\n6b9c 3 2074 1312\n6b9f 6 2080 1312\n6ba5 2 2099 1312\n6ba7 5 2105 1312\n6bac f 2128 1312\n6bbb 7 2129 1312\n6bc2 7 2130 1312\n6bc9 c 2136 1312\n6bd5 2 2142 1312\n6bd7 6 2148 1312\n6bdd 7 2149 1312\n6be4 2 2150 1312\n6be6 4 2151 1312\n6bea a 2152 1312\n6bf4 3 2153 1312\n6bf7 6 2157 1312\n6bfd 3 2158 1312\n6c00 6 2163 1312\n6c06 10 2165 1312\n6c16 10 2166 1312\n6c26 c 2168 1312\n6c32 3 2170 1312\n6c35 3 2172 1312\n6c38 2 2173 1312\n6c3a 8 2175 1312\n6c42 1 2176 1312\n6c43 19 2180 1312\n6c5c 9 2181 1312\n6c65 1 2182 1312\n6c66 2 2185 1312\n6c68 6 1640 1312\n6c6e 2 1641 1312\n6c70 4 1640 1312\n6c74 5 1642 1312\n6c79 2 1644 1312\n6c7b 4 1645 1312\n6c7f 8 1646 1312\n6c87 5 1647 1312\n6c8c 6 1648 1312\n6c92 1 1649 1312\n6c93 4 1648 1312\n6c97 6 1650 1312\n6c9d a 2201 1312\n6ca7 7 2204 1312\n6cae 6 2205 1312\n6cb4 4 2207 1312\n6cb8 2 2208 1312\n6cba 4 2210 1312\n6cbe 4 2212 1312\n6cc2 2 2213 1312\n6cc4 4 2215 1312\n6cc8 4 2217 1312\n6ccc 7 2218 1312\n6cd3 9 2224 1312\n6cdc 6 2228 1312\n6ce2 11 2230 1312\n6cf3 11 2234 1312\n6d04 d 2236 1312\n6d11 f 2238 1312\n6d20 d 2243 1312\n6d2d 3 2249 1312\n6d30 3 2250 1312\n6d33 1e 2252 1312\n6d51 9 2253 1312\n6d5a 18 2257 1312\n6d72 2 1690 1312\n6d74 4 2254 1312\n6d78 2 2259 1312\n6d7a d 2260 1312\n6d87 c 2290 1312\n6d93 f 2292 1312\n6da2 6 2297 1312\n6da8 8 2298 1312\n6db0 1e 2299 1312\n6dce 17 1163 1312\n6de5 10 2376 1312\n6df5 38 2377 1312\nFUNC 6e2d 3b 4 _get_errno_from_oserr\n6e2d 0 119 6100\n6e2d 6 123 6100\n6e33 f 124 6100\n6e42 8 133 6100\n6e4a 3 134 6100\n6e4d 1 139 6100\n6e4e 7 125 6100\n6e55 1 139 6100\n6e56 11 135 6100\n6e67 1 139 6100\nFUNC 6e68 13 0 _errno\n6e68 0 280 6100\n6e68 5 281 6100\n6e6d 4 282 6100\n6e71 5 283 6100\n6e76 1 288 6100\n6e77 3 285 6100\n6e7a 1 288 6100\nFUNC 6e7b 13 0 __doserrno\n6e7b 0 293 6100\n6e7b 5 294 6100\n6e80 4 295 6100\n6e84 5 296 6100\n6e89 1 300 6100\n6e8a 3 298 6100\n6e8d 1 300 6100\nFUNC 6e8e 1e 4 _dosmaperr\n6e8e 1 110 6100\n6e8f 9 111 6100\n6e98 13 113 6100\n6eab 1 114 6100\nFUNC 6eac 1b 4 _set_errno\n6eac 0 157 6100\n6eac 5 158 6100\n6eb1 4 159 6100\n6eb5 3 161 6100\n6eb8 1 168 6100\n6eb9 b 165 6100\n6ec4 2 166 6100\n6ec6 1 168 6100\nFUNC 6ec7 2a 4 _get_errno\n6ec7 1 187 6100\n6ec8 1b 189 6100\n6ee3 1 195 6100\n6ee4 9 193 6100\n6eed 3 194 6100\n6ef0 1 195 6100\nFUNC 6ef1 1b 4 _set_doserrno\n6ef1 0 213 6100\n6ef1 5 214 6100\n6ef6 4 215 6100\n6efa 3 217 6100\n6efd 1 224 6100\n6efe b 221 6100\n6f09 2 222 6100\n6f0b 1 224 6100\nFUNC 6f0c 2a 4 _get_doserrno\n6f0c 1 243 6100\n6f0d 1b 245 6100\n6f28 1 251 6100\n6f29 9 249 6100\n6f32 3 250 6100\n6f35 1 251 6100\nFUNC 6f38 45 0 _SEH_prolog4\nFUNC 6f7d 14 0 _SEH_epilog4\nFUNC 6fa0 24 0 ValidateLocalCookies\nFUNC 6fd0 196 10 _except_handler4\nFUNC 7166 90 10 vprintf_helper\n7166 c 47 1507\n7172 d 48 1507\n717f 2b 52 1507\n71aa 7 55 1507\n71b1 3 56 1507\n71b4 8 58 1507\n71bc 10 59 1507\n71cc a 60 1507\n71d6 c 63 1507\n71e2 3 67 1507\n71e5 6 68 1507\n71eb 3 63 1507\n71ee 8 64 1507\nFUNC 71f6 1a c _vprintf_l\n71f6 0 75 1507\n71f6 19 76 1507\n720f 1 77 1507\nFUNC 7210 1a c _vprintf_s_l\n7210 0 84 1507\n7210 19 85 1507\n7229 1 86 1507\nFUNC 722a 1a c _vprintf_p_l\n722a 0 93 1507\n722a 19 94 1507\n7243 1 95 1507\nFUNC 7244 18 8 vprintf\n7244 0 101 1507\n7244 17 102 1507\n725b 1 103 1507\nFUNC 725c 18 8 vprintf_s\n725c 0 109 1507\n725c 17 110 1507\n7273 1 111 1507\nFUNC 7274 18 8 _vprintf_p\n7274 0 117 1507\n7274 17 118 1507\n728b 1 119 1507\nFUNC 728c 104 0 __report_gsfailure\n728c 9 140 3731\n7295 5 170 3731\n729a 6 171 3731\n72a0 6 172 3731\n72a6 6 173 3731\n72ac 6 174 3731\n72b2 6 175 3731\n72b8 7 176 3731\n72bf 7 177 3731\n72c6 7 178 3731\n72cd 7 179 3731\n72d4 7 180 3731\n72db 7 181 3731\n72e2 1 182 3731\n72e3 6 183 3731\n72e9 3 190 3731\n72ec 5 191 3731\n72f1 3 192 3731\n72f4 5 193 3731\n72f9 3 194 3731\n72fc 5 195 3731\n7301 6 201 3731\n7307 a 204 3731\n7311 a 206 3731\n731b a 285 3731\n7325 a 286 3731\n732f b 293 3731\n733a b 294 3731\n7345 b 297 3731\n7350 8 298 3731\n7358 8 302 3731\n7360 b 304 3731\n736b 9 313 3731\n7374 8 315 3731\n737c 12 319 3731\n738e 2 320 3731\nFUNC 7390 5c6 c _write_nolock\n7390 22 95 4777\n73b2 2 106 4777\n73b4 11 108 4777\n73c5 7 109 4777\n73cc 2b 111 4777\n73f7 27 113 4777\n741e 10 116 4777\n742e 33 119 4777\n7461 6 122 4777\n7467 f 126 4777\n7476 1c 143 4777\n7492 5 146 4777\n7497 8 147 4777\n749f 14 148 4777\n74b3 16 152 4777\n74c9 6 153 4777\n74cf 4 157 4777\n74d3 16 160 4777\n74e9 9 153 4777\n74f2 b 163 4777\n74fd 9 164 4777\n7506 11 170 4777\n7517 18 171 4777\n752f 2 173 4777\n7531 14 174 4777\n7545 18 175 4777\n755d 4 181 4777\n7561 2e 205 4777\n758f 21 212 4777\n75b0 6 213 4777\n75b6 8 214 4777\n75be a 222 4777\n75c8 29 229 4777\n75f1 a 230 4777\n75fb 3 232 4777\n75fe 3 233 4777\n7601 2 238 4777\n7603 8 186 4777\n760b 3 191 4777\n760e 9 192 4777\n7617 f 193 4777\n7626 8 240 4777\n762e 13 242 4777\n7641 3 244 4777\n7644 6 251 4777\n764a 3 254 4777\n764d 14 255 4777\n7661 3 257 4777\n7664 12 258 4777\n7676 5 236 4777\n767b e 268 4777\n7689 12 277 4777\n769b f 278 4777\n76aa d 279 4777\n76b7 8 283 4777\n76bf 9 284 4777\n76c8 5 285 4777\n76cd 3 286 4777\n76d0 7 287 4777\n76d7 f 289 4777\n76e6 25 297 4777\n770b 6 299 4777\n7711 16 300 4777\n7727 f 308 4777\n7736 f 314 4777\n7745 b 315 4777\n7750 8 319 4777\n7758 c 320 4777\n7764 6 321 4777\n776a 4 322 4777\n776e c 323 4777\n777a f 325 4777\n7789 25 333 4777\n77ae 6 335 4777\n77b4 1a 336 4777\n77ce 5 344 4777\n77d3 f 359 4777\n77e2 13 361 4777\n77f5 8 365 4777\n77fd b 366 4777\n7808 6 367 4777\n780e a 369 4777\n7818 11 371 4777\n7829 2f 382 4777\n7858 4 384 4777\n785c 25 406 4777\n7881 3 407 4777\n7884 6 412 4777\n788a 9 409 4777\n7893 4 419 4777\n7897 15 423 4777\n78ac 2 428 4777\n78ae 1b 434 4777\n78c9 a 437 4777\n78d3 2 439 4777\n78d5 9 440 4777\n78de a 443 4777\n78e8 7 447 4777\n78ef 8 449 4777\n78f7 b 452 4777\n7902 2 455 4777\n7904 9 456 4777\n790d 2 457 4777\n790f 11 459 4777\n7920 4 460 4777\n7924 b 462 4777\n792f 7 463 4777\n7936 5 464 4777\n793b 5 469 4777\n7940 16 470 4777\nFUNC 7956 dc c _write\n7956 c 61 4777\n7962 23 66 4777\n7985 2f 67 4777\n79b4 20 68 4777\n79d4 7 70 4777\n79db 3 72 4777\n79de 9 73 4777\n79e7 14 74 4777\n79fb 2 75 4777\n79fd b 76 4777\n7a08 7 77 4777\n7a0f 4 78 4777\n7a13 c 82 4777\n7a1f 3 86 4777\n7a22 6 87 4777\n7a28 a 83 4777\nFUNC 7a32 2d 4 _fileno\n7a32 0 40 2176\n7a32 27 41 2176\n7a59 1 43 2176\n7a5a 4 42 2176\n7a5e 1 43 2176\nFUNC 7a5f e1 4 _commit\n7a5f c 39 5043\n7a6b 1b 43 5043\n7a86 28 44 5043\n7aae 20 45 5043\n7ace 7 47 5043\n7ad5 3 48 5043\n7ad8 9 49 5043\n7ae1 14 51 5043\n7af5 9 52 5043\n7afe 2 54 5043\n7b00 3 55 5043\n7b03 5 59 5043\n7b08 a 62 5043\n7b12 b 66 5043\n7b1d 4 67 5043\n7b21 c 72 5043\n7b2d 3 75 5043\n7b30 6 76 5043\n7b36 a 73 5043\nFUNC 7b40 49 0 _mtinitlocks\n7b40 2 137 2371\n7b42 7 144 2371\n7b49 11 145 2371\n7b5a 2 146 2371\n7b5c 15 148 2371\n7b71 6 144 2371\n7b77 5 157 2371\n7b7c d 158 2371\nFUNC 7b89 55 0 _mtdeletelocks\n7b89 1 188 2371\n7b8a d 194 2371\n7b97 c 196 2371\n7ba3 3 200 2371\n7ba6 6 206 2371\n7bac f 207 2371\n7bbb 6 215 2371\n7bc1 c 217 2371\n7bcd 10 221 2371\n7bdd 1 224 2371\nFUNC 7bde 15 4 _unlock\n7bde 3 371 2371\n7be1 10 375 2371\n7bf1 2 376 2371\nFUNC 7bf3 18 4 _lockerr_exit\n7bf3 0 403 2371\n7bf3 c 404 2371\n7bff b 405 2371\n7c0a 1 406 2371\nFUNC 7c0b c3 4 _mtinitlocknum\n7c0b c 259 2371\n7c17 6 261 2371\n7c1d a 269 2371\n7c27 5 270 2371\n7c2c 7 271 2371\n7c33 c 272 2371\n7c3f e 276 2371\n7c4d 4 277 2371\n7c51 e 279 2371\n7c5f b 280 2371\n7c6a 4 281 2371\n7c6e 8 284 2371\n7c76 3 285 2371\n7c79 4 287 2371\n7c7d 11 288 2371\n7c8e 7 289 2371\n7c95 b 290 2371\n7ca0 3 291 2371\n7ca3 2 292 2371\n7ca5 2 293 2371\n7ca7 2 296 2371\n7ca9 7 297 2371\n7cb0 c 300 2371\n7cbc 3 304 2371\n7cbf 6 305 2371\n7cc5 9 301 2371\nFUNC 7cce 31 4 _lock\n7cce 3 333 2371\n7cd1 10 338 2371\n7ce1 b 340 2371\n7cec 8 341 2371\n7cf4 9 348 2371\n7cfd 2 349 2371\nFUNC 7cff 240 0 _ioinit\n7cff c 111 4958\n7d0b 5 122 4958\n7d10 a 127 4958\n7d1a 7 128 4958\n7d21 f 137 4958\n7d30 6 139 4958\n7d36 5 142 4958\n7d3b 6 143 4958\n7d41 8 145 4958\n7d49 4 146 4958\n7d4d 3 147 4958\n7d50 4 148 4958\n7d54 3 149 4958\n7d57 4 151 4958\n7d5b 4 152 4958\n7d5f 4 153 4958\n7d63 13 145 4958\n7d76 15 161 4958\n7d8b 2 166 4958\n7d8d 3 172 4958\n7d90 6 173 4958\n7d96 b 179 4958\n7da1 5 185 4958\n7da6 f 191 4958\n7db5 9 204 4958\n7dbe 7 205 4958\n7dc5 8 207 4958\n7dcd 4 208 4958\n7dd1 3 209 4958\n7dd4 4 210 4958\n7dd8 4 211 4958\n7ddc 4 212 4958\n7de0 4 213 4958\n7de4 4 214 4958\n7de8 f 207 4958\n7df7 9 185 4958\n7e00 2 284 4958\n7e02 6 197 4958\n7e08 8 221 4958\n7e10 24 234 4958\n7e34 15 236 4958\n7e49 7 237 4958\n7e50 5 238 4958\n7e55 18 241 4958\n7e6d 3 243 4958\n7e70 d 221 4958\n7e7d 2 253 4958\n7e7f b 255 4958\n7e8a c 258 4958\n7e96 6 306 4958\n7e9c 4 262 4958\n7ea0 30 266 4958\n7ed0 2 271 4958\n7ed2 a 277 4958\n7edc 6 278 4958\n7ee2 5 279 4958\n7ee7 4 280 4958\n7eeb 14 284 4958\n7eff 3 286 4958\n7f02 2 288 4958\n7f04 4 297 4958\n7f08 6 298 4958\n7f0e a 253 4958\n7f18 c 313 4958\n7f24 4 315 4958\n7f28 7 128 4958\n7f2f a 129 4958\n7f39 6 316 4958\nFUNC 7f3f 4c 0 _ioterm\n7f3f 2 341 4958\n7f41 5 345 4958\n7f46 6 347 4958\n7f4c 8 353 4958\n7f54 9 355 4958\n7f5d 11 356 4958\n7f6e 4 353 4958\n7f72 7 361 4958\n7f79 11 362 4958\n7f8a 1 365 4958\nFUNC 7f8b 21 4 wait_a_bit\n7f8b 1 18 5557\n7f8c b 19 5557\n7f97 6 20 5557\n7f9d 8 21 5557\n7fa5 3 22 5557\n7fa8 3 23 5557\n7fab 1 24 5557\nFUNC 7fac 10 4 _set_malloc_crt_max_wait\n7fac 0 32 5557\n7fac f 34 5557\n7fbb 1 36 5557\nFUNC 7fbc 40 4 _malloc_crt\n7fbc 2 39 5557\n7fbe 2 40 5557\n7fc0 b 44 5557\n7fcb d 45 5557\n7fd8 18 46 5557\n7ff0 7 47 5557\n7ff7 4 50 5557\n7ffb 1 51 5557\nFUNC 7ffc 48 8 _calloc_crt\n7ffc 2 54 5557\n7ffe 2 55 5557\n8000 14 61 5557\n8014 c 62 5557\n8020 18 63 5557\n8038 7 64 5557\n803f 4 67 5557\n8043 1 68 5557\nFUNC 8044 4b 8 _realloc_crt\n8044 2 71 5557\n8046 2 72 5557\n8048 f 76 5557\n8057 14 77 5557\n806b 18 78 5557\n8083 7 79 5557\n808a 4 82 5557\n808e 1 83 5557\nFUNC 808f 50 c _recalloc_crt\n808f 2 86 5557\n8091 2 87 5557\n8093 16 91 5557\n80a9 12 92 5557\n80bb 18 94 5557\n80d3 7 95 5557\n80da 4 100 5557\n80de 1 101 5557\nFUNC 80df 8 0 _malloc_crt_fastcall\n80df 0 105 5557\n80df 7 106 5557\n80e6 1 107 5557\nFUNC 80e7 a 0 _calloc_crt_fastcall\n80e7 0 110 5557\n80e7 9 111 5557\n80f0 1 112 5557\nFUNC 80f1 a 0 _realloc_crt_fastcall\n80f1 0 115 5557\n80f1 9 116 5557\n80fa 1 117 5557\nFUNC 80fb 8e 4 free\n80fb c 42 5515\n8107 7 47 5515\n810e 9 53 5515\n8117 8 57 5515\n811f 4 58 5515\n8123 e 60 5515\n8131 9 61 5515\n813a c 64 5515\n8146 6 68 5515\n814c 3 70 5515\n814f 2 106 5515\n8151 9 65 5515\n815a f 109 5515\n8169 4 110 5515\n816d 16 112 5515\n8183 6 115 5515\nFUNC 8189 9f 0 _fcloseall\n8189 c 43 1792\n8195 5 44 1792\n819a 8 47 1792\n81a2 3 48 1792\n81a5 e 50 1792\n81b3 10 52 1792\n81c3 14 57 1792\n81d7 3 58 1792\n81da 5 63 1792\n81df 12 65 1792\n81f1 e 66 1792\n81ff 8 67 1792\n8207 3 50 1792\n820a c 73 1792\n8216 3 77 1792\n8219 6 78 1792\n821f 9 74 1792\nFUNC 8228 19 4 std::bad_exception::bad_exception(char const *)\n8228 13 351 6035\n823b 6 352 6035\nFUNC 8241 b 0 std::bad_exception::~bad_exception()\n8241 6 355 6035\n8247 5 356 6035\nFUNC 824c 22 0 std::bad_exception::`vector deleting destructor'(unsigned int)\nFUNC 826e 5c c __TypeMatch\n826e 2 999 6034\n8270 13 1001 6034\n8283 1b 1008 6034\n829e 4 1009 6034\n82a2 22 1023 6034\n82c4 5 1002 6034\n82c9 1 1024 6034\nFUNC 82ca 44 4 __FrameUnwindFilter\n82ca 0 1035 6034\n82ca 6 1038 6034\n82d0 e 1040 6034\n82de 13 1076 6034\n82f1 e 1068 6034\n82ff c 1070 6034\n830b 2 1072 6034\n830d 1 1078 6034\nFUNC 830e e1 10 __FrameUnwindToState\n830e c 1105 6034\n831a 1b 1112 6034\n8335 c 1114 6034\n8341 4 1115 6034\n8345 5 1119 6034\n834a f 1123 6034\n8359 f 1126 6034\n8368 7 1128 6034\n836f 6 1131 6034\n8375 3 1138 6034\n8378 12 1145 6034\n838a 6 1149 6034\n8390 d 1151 6034\n839d d 1153 6034\n83aa 3 1155 6034\n83ad 2 1156 6034\n83af c 1157 6034\n83bb a 1169 6034\n83c5 3 1176 6034\n83c8 6 1180 6034\n83ce 6 1157 6034\n83d4 e 1158 6034\n83e2 d 1159 6034\nFUNC 83ef 45 0 ExFilterRethrow\n83ef 0 1533 6034\n83ef 2 1535 6034\n83f1 2f 1538 6034\n8420 e 1542 6034\n842e 2 1543 6034\n8430 1 1547 6034\n8431 2 1545 6034\n8433 1 1547 6034\nFUNC 8434 54 8 __DestructExceptionObject\n8434 c 1791 6034\n8440 f 1794 6034\n844f e 1801 6034\n845d 4 1803 6034\n8461 9 1810 6034\n846a 7 1814 6034\n8471 6 1824 6034\n8477 c 1815 6034\n8483 5 1819 6034\nFUNC 8488 25 8 __AdjustPointer\n8488 0 1842 6034\n8488 d 1843 6034\n8495 6 1845 6034\n849b 3 1850 6034\n849e e 1852 6034\n84ac 1 1856 6034\nFUNC 84ad 13 0 __uncaught_exception()\n84ad 0 1867 6034\n84ad 12 1868 6034\n84bf 1 1869 6034\nFUNC 84c0 b3 8 __CxxRegisterExceptionObject\n84c0 0 2077 6034\n84c0 14 2085 6034\n84d4 26 2087 6034\n84fa 6 2088 6034\n8500 b 2090 6034\n850b b 2093 6034\n8516 e 2094 6034\n8524 e 2095 6034\n8532 b 2096 6034\n853d 2 2097 6034\n853f 4 2098 6034\n8543 4 2099 6034\n8547 c 2101 6034\n8553 10 2102 6034\n8563 c 2103 6034\n856f 3 2104 6034\n8572 1 2105 6034\nFUNC 8573 4c 4 __CxxDetectRethrow\n8573 0 2117 6034\n8573 6 2119 6034\n8579 2 2120 6034\n857b 2 2121 6034\n857d 2f 2122 6034\n85ac c 2123 6034\n85b8 3 2124 6034\n85bb 1 2127 6034\n85bc 2 2126 6034\n85be 1 2127 6034\nFUNC 85bf 139 8 __CxxUnregisterExceptionObject\n85bf 1 2139 6034\n85c0 4 2143 6034\n85c4 d 2145 6034\n85d1 6 2146 6034\n85d7 85 2149 6034\n865c 14 2150 6034\n8670 5b 2152 6034\n86cb c 2153 6034\n86d7 e 2154 6034\n86e5 12 2155 6034\n86f7 1 2157 6034\nFUNC 86f8 4 0 __CxxQueryExceptionSize\n86f8 0 2167 6034\n86f8 3 2168 6034\n86fb 1 2169 6034\nFUNC 86fc 32 8 __CxxCallUnwindDtor\n86fc c 2189 6034\n8708 4 2190 6034\n870c 6 2192 6034\n8712 2 2193 6034\n8714 d 2194 6034\n8721 7 2197 6034\n8728 6 2198 6034\nFUNC 872e 33 8 __CxxCallUnwindDelDtor\n872e c 2218 6034\n873a 4 2219 6034\n873e 7 2221 6034\n8745 2 2222 6034\n8747 d 2223 6034\n8754 7 2226 6034\n875b 6 2227 6034\nFUNC 8761 32 8 __CxxCallUnwindStdDelDtor\n8761 c 2247 6034\n876d 4 2248 6034\n8771 6 2250 6034\n8777 2 2251 6034\n8779 d 2252 6034\n8786 7 2255 6034\n878d 6 2256 6034\nFUNC 8793 3b 14 __CxxCallUnwindVecDtor\n8793 c 2282 6034\n879f 4 2283 6034\n87a3 f 2285 6034\n87b2 2 2286 6034\n87b4 d 2287 6034\n87c1 7 2290 6034\n87c8 6 2291 6034\nFUNC 87ce 79 4 IsInExceptionSpec\n87ce 6 2302 6034\n87d4 9 2303 6034\n87dd 5 2307 6034\n87e2 f 2323 6034\n87f1 9 2326 6034\n87fa 2 2327 6034\n87fc 10 2328 6034\n880c 26 2335 6034\n8832 4 2337 6034\n8836 c 2323 6034\n8842 3 2343 6034\n8845 2 2344 6034\nFUNC 8847 49 4 CallUnexpected\n8847 c 2379 6034\n8853 13 2380 6034\n8866 4 2383 6034\n886a 5 2384 6034\n886f 4 2391 6034\n8873 5 2392 6034\n8878 8 2388 6034\n8880 10 2390 6034\nFUNC 8890 30 0 Is_bad_exception_allowed\n8890 2 2399 6034\n8892 8 2400 6034\n889a 1d 2402 6034\n88b7 4 2408 6034\n88bb 1 2409 6034\n88bc 4 2404 6034\nFUNC 88c0 82 8 _is_exception_typeof(type_info const &,_EXCEPTION_POINTERS *)\n88c0 1 2416 6034\n88c1 e 2417 6034\n88cf 2 2419 6034\n88d1 9 2422 6034\n88da 2b 2423 6034\n8905 6 2432 6034\n890b 7 2433 6034\n8912 2 2445 6034\n8914 20 2446 6034\n8934 4 2439 6034\n8938 4 2454 6034\n893c 6 2455 6034\nFUNC 8942 19c 18 CallCatchBlock\n8942 14 1431 6034\n8956 3 1437 6034\n8959 4 1439 6034\n895d 6 1443 6034\n8963 11 1447 6034\n8974 e 1451 6034\n8982 e 1452 6034\n8990 b 1454 6034\n899b e 1455 6034\n89a9 a 1457 6034\n89b3 3 1458 6034\n89b6 16 1463 6034\n89cc 12 1464 6034\n89de c 1465 6034\n89ea 3 1470 6034\n89ed 15 1471 6034\n8a02 3 1472 6034\n8a05 c 1474 6034\n8a11 11 1476 6034\n8a22 7 1478 6034\n8a29 d 1482 6034\n8a36 b 1486 6034\n8a41 13 1488 6034\n8a54 3 1517 6034\n8a57 6 1518 6034\n8a5d 5 1474 6034\n8a62 6 1488 6034\n8a68 6 1494 6034\n8a6e 9 1497 6034\n8a77 e 1500 6034\n8a85 e 1501 6034\n8a93 3f 1510 6034\n8ad2 c 1511 6034\nFUNC 8ade 17f 10 __BuildCatchObjectHelper\n8ade c 1575 6034\n8aea 5 1576 6034\n8aef 2a 1582 6034\n8b19 2 1588 6034\n8b1b 3 1590 6034\n8b1e 2 1588 6034\n8b20 2 1592 6034\n8b22 4 1611 6034\n8b26 3 1614 6034\n8b29 4 1622 6034\n8b2d 4 1615 6034\n8b31 26 1622 6034\n8b57 5 1623 6034\n8b5c 11 1625 6034\n8b6d 5 1628 6034\n8b72 3 1629 6034\n8b75 6 1636 6034\n8b7b 4 1629 6034\n8b7f 20 1636 6034\n8b9f 12 1637 6034\n8bb1 10 1639 6034\n8bc1 4 1641 6034\n8bc5 2 1646 6034\n8bc7 5 1649 6034\n8bcc 18 1654 6034\n8be4 1e 1656 6034\n8c02 2 1660 6034\n8c04 25 1668 6034\n8c29 d 1672 6034\n8c36 2 1677 6034\n8c38 5 1678 6034\n8c3d 7 1681 6034\n8c44 5 1688 6034\n8c49 7 1682 6034\n8c50 5 1684 6034\n8c55 2 1584 6034\n8c57 6 1689 6034\nFUNC 8c5d 91 10 __BuildCatchObject\n8c5d c 1712 6034\n8c69 b 1716 6034\n8c74 3 1718 6034\n8c77 2 1720 6034\n8c79 a 1739 6034\n8c83 4 1743 6034\n8c87 1a 1744 6034\n8ca1 1a 1756 6034\n8cbb 2 1757 6034\n8cbd 18 1750 6034\n8cd5 7 1762 6034\n8cdc 6 1769 6034\n8ce2 7 1763 6034\n8ce9 5 1765 6034\nFUNC 8cee 143 10 __CxxExceptionFilter\n8cee 3 1973 6034\n8cf1 a 1985 6034\n8cfb 3 2065 6034\n8cfe 2a 1993 6034\n8d28 32 2008 6034\n8d5a 6 2010 6034\n8d60 c 2011 6034\n8d6c 6 2012 6034\n8d72 b 2013 6034\n8d7d f 2040 6034\n8d8c a 2041 6034\n8d96 2 2047 6034\n8d98 1b 2050 6034\n8db3 4 2042 6034\n8db7 2 2050 6034\n8db9 c 2052 6034\n8dc5 6 2053 6034\n8dcb 13 2054 6034\n8dde 2 2055 6034\n8de0 25 1995 6034\n8e05 6 1997 6034\n8e0b e 1999 6034\n8e19 4 2000 6034\n8e1d c 2004 6034\n8e29 6 2005 6034\n8e2f 2 2065 6034\nFUNC 8e31 6c 20 CatchIt\n8e31 3 1217 6034\n8e34 6 1233 6034\n8e3a 10 1234 6034\n8e4a 4 1253 6034\n8e4e 6 1254 6034\n8e54 2 1255 6034\n8e56 8 1256 6034\n8e5e e 1259 6034\n8e6c 3 1265 6034\n8e6f 21 1273 6034\n8e90 4 1278 6034\n8e94 7 1280 6034\n8e9b 2 1286 6034\nFUNC 8e9d f2 20 FindHandlerForForeignException\n8e9d 6 913 6034\n8ea3 10 920 6034\n8eb3 2a 926 6034\n8edd 23 934 6034\n8f00 e 940 6034\n8f0e 17 945 6034\n8f25 c 948 6034\n8f31 29 954 6034\n8f5a 33 974 6034\n8f8d 2 984 6034\nFUNC 8f8f 356 20 FindHandler\n8f8f 6 569 6034\n8f95 20 632 6034\n8fb5 11 634 6034\n8fc6 42 637 6034\n9008 12 639 6034\n901a e 645 6034\n9028 b 646 6034\n9033 16 652 6034\n9049 2a 653 6034\n9073 12 659 6034\n9085 b 661 6034\n9090 5 662 6034\n9095 15 666 6034\n90aa 23 676 6034\n90cd 5 692 6034\n90d2 c 686 6034\n90de 30 688 6034\n910e 2b 698 6034\n9139 d 707 6034\n9146 19 715 6034\n915f c 718 6034\n916b 10 729 6034\n917b 6 735 6034\n9181 3 736 6034\n9184 7 737 6034\n918b 9 740 6034\n9194 2 741 6034\n9196 7 742 6034\n919d 23 750 6034\n91c0 d 737 6034\n91cd 2 676 6034\n91cf 33 774 6034\n9202 3 718 6034\n9205 6 795 6034\n920b a 804 6034\n9215 27 812 6034\n923c f 814 6034\n924b 5 840 6034\n9250 5 841 6034\n9255 b 843 6034\n9260 5 844 6034\n9265 d 846 6034\n9272 6 847 6034\n9278 2 848 6034\n927a 8 849 6034\n9282 14 851 6034\n9296 b 853 6034\n92a1 6 863 6034\n92a7 a 864 6034\n92b1 1c 866 6034\n92cd 16 877 6034\n92e3 2 880 6034\nFUNC 92e5 18 4 std::bad_exception::bad_exception(std::bad_exception const &)\nFUNC 92fd e4 20 __InternalCxxFrameHandler\n92fd 6 412 6034\n9303 3d 426 6034\n9340 6 432 6034\n9346 6 435 6034\n934c 10 440 6034\n935c 11 479 6034\n936d 2 482 6034\n936f 18 489 6034\n9387 19 499 6034\n93a0 1d 513 6034\n93bd 1c 524 6034\n93d9 6 533 6034\n93df 2 535 6034\nFUNC 93e1 6c 0 _use_encode_pointer\n93e1 7 66 2227\n93e8 2 72 2227\n93ea 12 75 2227\n93fc 7 76 2227\n9403 5 78 2227\n9408 7 82 2227\n940f 5 85 2227\n9414 e 91 2227\n9422 1f 93 2227\n9441 4 95 2227\n9445 6 100 2227\n944b 2 101 2227\nFUNC 944d 6e 4 _encode_pointer\n944d 1 120 2227\n944e 2b 129 2227\n9479 8 145 2227\n9481 d 133 2227\n948e d 135 2227\n949b c 138 2227\n94a7 4 148 2227\n94ab a 150 2227\n94b5 5 153 2227\n94ba 1 154 2227\nFUNC 94bb 9 0 _encoded_null\n94bb 0 173 2227\n94bb 8 174 2227\n94c3 1 175 2227\nFUNC 94c4 6e 4 _decode_pointer\n94c4 1 194 2227\n94c5 2b 203 2227\n94f0 8 219 2227\n94f8 d 207 2227\n9505 d 209 2227\n9512 c 212 2227\n951e 4 222 2227\n9522 a 224 2227\n952c 5 227 2227\n9531 1 228 2227\nFUNC 9532 9 4 __crtTlsAlloc\n9532 0 240 2227\n9532 6 241 2227\n9538 3 242 2227\nFUNC 953b 15 4 __fls_getvalue\n953b 0 258 2227\n953b 12 259 2227\n954d 3 260 2227\nFUNC 9550 6 0 __get_flsindex\n9550 0 272 2227\n9550 5 273 2227\n9555 1 274 2227\nFUNC 9556 32 0 __set_flsgetvalue\n9556 1 286 2227\n9557 e 288 2227\n9565 4 289 2227\n9569 e 291 2227\n9577 d 292 2227\n9584 3 294 2227\n9587 1 298 2227\nFUNC 9588 19 8 __fls_setvalue\n9588 0 315 2227\n9588 16 316 2227\n959e 3 317 2227\nFUNC 95a1 3d 0 _mtterm\n95a1 0 473 2227\n95a1 a 480 2227\n95ab f 481 2227\n95ba 7 482 2227\n95c1 a 485 2227\n95cb 7 486 2227\n95d2 7 487 2227\n95d9 5 494 2227\nFUNC 95de bf 8 _initptd\n95de c 521 2227\n95ea e 522 2227\n95f8 a 524 2227\n9602 6 525 2227\n9608 4 527 2227\n960c 9 529 2227\n9615 16 532 2227\n962b 10 533 2227\n963b 3 540 2227\n963e 7 544 2227\n9645 7 545 2227\n964c 8 546 2227\n9654 7 547 2227\n965b 8 551 2227\n9663 4 552 2227\n9667 6 553 2227\n966d 4 561 2227\n9671 8 562 2227\n9679 9 563 2227\n9682 c 565 2227\n968e 6 568 2227\n9694 9 566 2227\nFUNC 969d 77 0 _getptd_noexit\n969d 2 588 2227\n969f 6 592 2227\n96a5 15 600 2227\n96ba 14 608 2227\n96ce 19 610 2227\n96e7 a 616 2227\n96f1 6 618 2227\n96f7 6 619 2227\n96fd 2 621 2227\n96ff 7 627 2227\n9706 2 628 2227\n9708 8 633 2227\n9710 3 635 2227\n9713 1 636 2227\nFUNC 9714 18 0 _getptd\n9714 1 657 2227\n9715 7 658 2227\n971c 4 659 2227\n9720 8 660 2227\n9728 3 662 2227\n972b 1 663 2227\nFUNC 972c 121 4 _freefls\n972c c 691 2227\n9738 b 702 2227\n9743 7 703 2227\n974a 7 704 2227\n9751 7 706 2227\n9758 7 707 2227\n975f 7 709 2227\n9766 7 710 2227\n976d 7 712 2227\n9774 7 713 2227\n977b 7 715 2227\n9782 7 716 2227\n9789 7 718 2227\n9790 7 719 2227\n9797 a 721 2227\n97a1 7 722 2227\n97a8 8 724 2227\n97b0 4 725 2227\n97b4 1a 728 2227\n97ce 7 729 2227\n97d5 c 731 2227\n97e1 8 735 2227\n97e9 7 737 2227\n97f0 7 738 2227\n97f7 7 740 2227\n97fe 15 743 2227\n9813 7 744 2227\n981a c 747 2227\n9826 7 751 2227\n982d 8 754 2227\n9835 3 731 2227\n9838 9 732 2227\n9841 3 747 2227\n9844 9 748 2227\nFUNC 984d 69 4 _freeptd\n984d 0 778 2227\n984d a 783 2227\n9857 1b 795 2227\n9872 13 796 2227\n9885 16 802 2227\n989b 7 804 2227\n98a2 a 807 2227\n98ac 9 811 2227\n98b5 1 813 2227\nFUNC 98b6 6 0 __threadid\n98b6 0 837 2227\n98b6 6 838 2227\nFUNC 98bc 6 0 __threadhandle\n98bc 0 844 2227\n98bc 6 845 2227\nFUNC 98c2 184 0 _mtinit\n98c2 1 346 2227\n98c3 d 355 2227\n98d0 4 356 2227\n98d4 5 357 2227\n98d9 3 358 2227\n98dc 2 444 2227\n98de e 362 2227\n98ec d 365 2227\n98f9 d 368 2227\n9906 d 371 2227\n9913 2a 372 2227\n993d a 375 2227\n9947 1a 379 2227\n9961 25 388 2227\n9986 5 393 2227\n998b b 400 2227\n9996 10 401 2227\n99a6 10 402 2227\n99b6 18 403 2227\n99ce 7 410 2227\n99d5 2 412 2227\n99d7 1b 418 2227\n99f2 2 420 2227\n99f4 2d 428 2227\n9a21 a 438 2227\n9a2b 6 440 2227\n9a31 6 441 2227\n9a37 5 443 2227\n9a3c 5 430 2227\n9a41 4 389 2227\n9a45 1 444 2227\nFUNC 9a46 39 0 terminate()\n9a46 c 94 5983\n9a52 8 107 5983\n9a5a 4 111 5983\n9a5e 4 116 5983\n9a62 2 120 5983\n9a64 2 121 5983\n9a66 7 122 5983\n9a6d 7 127 5983\n9a74 5 135 5983\n9a79 6 136 5983\nFUNC 9a7f 13 0 unexpected()\n9a7f 0 149 5983\n9a7f 8 159 5983\n9a87 4 163 5983\n9a8b 2 167 5983\n9a8d 5 173 5983\nFUNC 9a92 37 0 _inconsistency()\n9a92 c 187 5983\n9a9e c 196 5983\n9aaa 4 197 5983\n9aae 4 202 5983\n9ab2 2 203 5983\n9ab4 2 204 5983\n9ab6 7 205 5983\n9abd 7 211 5983\n9ac4 5 217 5983\nFUNC 9ac9 11 4 _initp_eh_hooks\n9ac9 0 74 5983\n9ac9 10 80 5983\n9ad9 1 81 5983\nFUNC 9ae0 4c c _CallSettingFrame\n9ae0 3 48 5665\n9ae3 3 57 5665\n9ae6 1 58 5665\n9ae7 1 59 5665\n9ae8 3 60 5665\n9aeb 3 61 5665\n9aee 3 62 5665\n9af1 3 63 5665\n9af4 1 64 5665\n9af5 3 65 5665\n9af8 3 66 5665\n9afb 3 67 5665\n9afe 5 68 5665\n9b03 1 69 5665\n9b04 1 70 5665\n9b05 2 71 5665\n9b07 1 73 5665\n9b08 1 74 5665\n9b09 2 75 5665\n9b0b 1 76 5665\n9b0c 3 77 5665\n9b0f 1 78 5665\n9b10 2 79 5665\n9b12 6 80 5665\n9b18 2 81 5665\n9b1a 5 82 5665\n9b1f 1 84 5665\n9b20 5 85 5665\n9b25 1 86 5665\n9b26 1 87 5665\n9b27 1 88 5665\n9b28 4 89 5665\nPUBLIC 9b07 0 _NLG_Return\nFUNC 9b2c b9 4 _onexit_nolock\n9b2c 5 104 3259\n9b31 b 107 3259\n9b3c 13 108 3259\n9b4f 16 112 3259\n9b65 d 122 3259\n9b72 d 127 3259\n9b7f 14 129 3259\n9b93 3 134 3259\n9b96 14 136 3259\n9baa 3 147 3259\n9bad f 149 3259\n9bbc e 156 3259\n9bca c 157 3259\n9bd6 7 159 3259\n9bdd 6 114 3259\n9be3 2 160 3259\nFUNC 9be5 2f 0 __onexitinit\n9be5 1 205 3259\n9be6 b 208 3259\n9bf1 9 209 3259\n9bfa e 211 3259\n9c08 4 216 3259\n9c0c 1 221 3259\n9c0d 3 218 3259\n9c10 3 220 3259\n9c13 1 221 3259\nFUNC 9c14 3c 4 _onexit\n9c14 c 85 3259\n9c20 5 88 3259\n9c25 4 90 3259\n9c29 c 91 3259\n9c35 c 93 3259\n9c41 3 97 3259\n9c44 6 98 3259\n9c4a 6 94 3259\nFUNC 9c50 12 4 atexit\n9c50 0 165 3259\n9c50 11 166 3259\n9c61 1 167 3259\nFUNC 9c62 4f 4 V6_HeapAlloc\n9c62 c 27 5425\n9c6e 4 28 5425\n9c72 b 29 5425\n9c7d 8 31 5425\n9c85 4 32 5425\n9c89 a 33 5425\n9c93 c 35 5425\n9c9f 3 39 5425\n9ca2 6 40 5425\n9ca8 9 36 5425\nFUNC 9cb1 75 4 _heap_alloc\n9cb1 0 90 5425\n9cb1 9 95 5425\n9cba 5 96 5425\n9cbf 7 97 5425\n9cc6 c 98 5425\n9cd2 a 104 5425\n9cdc 18 105 5425\n9cf4 1 129 5425\n9cf5 a 107 5425\n9cff 9 108 5425\n9d08 2 109 5425\n9d0a 4 121 5425\n9d0e 1 122 5425\n9d0f 6 124 5425\n9d15 10 126 5425\n9d25 1 129 5425\nFUNC 9d26 c3 4 malloc\n9d26 1 155 5425\n9d27 16 159 5425\n9d3d 65 163 5425\n9da2 4 168 5425\n9da6 b 172 5425\n9db1 b 179 5425\n9dbc 2 183 5425\n9dbe 7 174 5425\n9dc5 8 193 5425\n9dcd 5 195 5425\n9dd2 1 196 5425\n9dd3 7 185 5425\n9dda b 186 5425\n9de5 3 187 5425\n9de8 1 196 5425\nFUNC 9de9 a 4 _initp_heap_handler\n9de9 0 31 5230\n9de9 9 32 5230\n9df2 1 33 5230\nFUNC 9df3 31 4 _set_new_handler(int (*)(unsigned int))\n9df3 1 53 5230\n9df4 7 57 5230\n9dfb b 59 5230\n9e06 b 60 5230\n9e11 f 63 5230\n9e20 3 65 5230\n9e23 1 66 5230\nFUNC 9e24 9 4 _set_new_handler(int)\n9e24 0 86 5230\n9e24 8 89 5230\n9e2c 1 90 5230\nFUNC 9e2d d 0 _query_new_handler()\n9e2d 0 110 5230\n9e2d c 111 5230\n9e39 1 112 5230\nFUNC 9e3a 22 4 _callnewh\n9e3a 0 131 5230\n9e3a b 133 5230\n9e45 10 135 5230\n9e55 3 138 5230\n9e58 1 139 5230\n9e59 2 136 5230\n9e5b 1 139 5230\nFUNC 9e5c 22 18 _invoke_watson_if_error\n9e5c 3 754 5850\n9e5f 6 755 5850\n9e65 17 759 5850\n9e7c 2 760 5850\nFUNC 9e7e 70 4 type_info::_Type_info_dtor(type_info *)\n9e7e c 62 5815\n9e8a 8 63 5815\n9e92 4 64 5815\n9e96 a 65 5815\n9ea0 d 70 5815\n9ead 4 72 5815\n9eb1 4 74 5815\n9eb5 6 79 5815\n9ebb 7 80 5815\n9ec2 9 94 5815\n9ecb 4 101 5815\n9ecf c 103 5815\n9edb 6 107 5815\n9ee1 2 83 5815\n9ee3 2 72 5815\n9ee5 9 104 5815\nFUNC 9eee f5 8 type_info::_Name_base(type_info const *,__type_info_node *)\n9eee c 109 5815\n9efa e 113 5815\n9f08 24 124 5815\n9f2c 7 125 5815\n9f33 16 132 5815\n9f49 2 133 5815\n9f4b 5 132 5815\n9f50 b 136 5815\n9f5b 5 142 5815\n9f60 a 149 5815\n9f6a 4 150 5815\n9f6e 11 157 5815\n9f7f 20 158 5815\n9f9f 5 159 5815\n9fa4 9 165 5815\n9fad 3 166 5815\n9fb0 2 167 5815\n9fb2 7 173 5815\n9fb9 9 180 5815\n9fc2 c 181 5815\n9fce 3 188 5815\n9fd1 6 189 5815\n9fd7 3 181 5815\n9fda 9 182 5815\nFUNC 9fe3 70 4 type_info::_Type_info_dtor_internal(type_info *)\n9fe3 c 197 5815\n9fef 8 198 5815\n9ff7 4 199 5815\n9ffb a 200 5815\na005 d 205 5815\na012 4 207 5815\na016 4 209 5815\na01a 6 214 5815\na020 7 215 5815\na027 9 229 5815\na030 4 236 5815\na034 c 238 5815\na040 6 242 5815\na046 2 218 5815\na048 2 207 5815\na04a 9 239 5815\nFUNC a053 31 10 __unDNameHelper\na053 3 249 5815\na056 7 250 5815\na05d 7 252 5815\na064 1e 260 5815\na082 2 261 5815\nFUNC a084 eb 8 type_info::_Name_base_internal(type_info const *,__type_info_node *)\na084 c 265 5815\na090 e 269 5815\na09e 1a 273 5815\na0b8 7 274 5815\na0bf 16 281 5815\na0d5 2 282 5815\na0d7 5 281 5815\na0dc b 285 5815\na0e7 5 291 5815\na0ec a 298 5815\na0f6 4 299 5815\na0fa 11 306 5815\na10b 20 307 5815\na12b 5 308 5815\na130 9 314 5815\na139 3 315 5815\na13c 2 316 5815\na13e 7 322 5815\na145 9 329 5815\na14e c 330 5815\na15a 3 337 5815\na15d 6 338 5815\na163 3 330 5815\na166 9 331 5815\nFUNC a16f 53 4 __clean_type_info_names_internal\na16f c 346 5815\na17b 8 347 5815\na183 4 348 5815\na187 6 352 5815\na18d 4 354 5815\na191 3 356 5815\na194 7 357 5815\na19b 8 358 5815\na1a3 4 354 5815\na1a7 c 359 5815\na1b3 6 363 5815\na1b9 9 361 5815\nFUNC a1d0 88 8 strcmp\na1d0 0 65 926\na1d0 4 73 926\na1d4 4 74 926\na1d8 6 76 926\na1de 2 77 926\na1e0 2 81 926\na1e2 2 83 926\na1e4 2 84 926\na1e6 2 85 926\na1e8 2 86 926\na1ea 3 87 926\na1ed 2 88 926\na1ef 2 89 926\na1f1 2 90 926\na1f3 3 92 926\na1f6 3 94 926\na1f9 2 95 926\na1fb 2 96 926\na1fd 2 97 926\na1ff 3 98 926\na202 2 99 926\na204 3 100 926\na207 3 101 926\na20a 2 102 926\na20c 4 103 926\na210 2 107 926\na212 2 108 926\na214 2 115 926\na216 2 116 926\na218 3 117 926\na21b 1 118 926\na21c 6 122 926\na222 2 123 926\na224 2 125 926\na226 3 126 926\na229 2 127 926\na22b 2 128 926\na22d 3 129 926\na230 2 130 926\na232 2 131 926\na234 6 133 926\na23a 2 134 926\na23c 3 139 926\na23f 3 140 926\na242 2 141 926\na244 2 142 926\na246 2 143 926\na248 2 144 926\na24a 3 145 926\na24d 2 146 926\na24f 2 147 926\na251 2 148 926\na253 3 149 926\na256 2 150 926\nFUNC a258 65 c strcpy_s\na258 0 13 781\na258 30 18 781\na288 c 19 781\na294 2 21 781\na296 d 23 781\na2a3 4 27 781\na2a7 2 29 781\na2a9 e 30 781\na2b7 5 33 781\na2bc 1 34 781\nFUNC a2c0 7a c memset\na2c0 0 59 934\na2c0 4 68 934\na2c4 4 69 934\na2c8 2 71 934\na2ca 2 72 934\na2cc 2 74 934\na2ce 4 75 934\na2d2 2 78 934\na2d4 2 79 934\na2d6 6 80 934\na2dc 2 81 934\na2de 7 82 934\na2e5 2 83 934\na2e7 5 85 934\na2ec 1 91 934\na2ed 2 92 934\na2ef 3 94 934\na2f2 2 95 934\na2f4 2 97 934\na2f6 3 98 934\na2f9 2 99 934\na2fb 2 101 934\na2fd 2 103 934\na2ff 3 104 934\na302 3 105 934\na305 2 106 934\na307 2 110 934\na309 3 111 934\na30c 2 113 934\na30e 2 115 934\na310 3 117 934\na313 2 119 934\na315 2 122 934\na317 3 123 934\na31a 3 124 934\na31d 2 125 934\na31f 2 127 934\na321 2 129 934\na323 2 130 934\na325 2 134 934\na327 3 135 934\na32a 3 137 934\na32d 2 138 934\na32f 4 142 934\na333 1 143 934\na334 1 145 934\na335 4 148 934\na339 1 150 934\nFUNC a340 365 c memcpy\na340 3 101 1027\na343 1 113 1027\na344 1 114 1027\na345 3 116 1027\na348 3 117 1027\na34b 3 119 1027\na34e 2 129 1027\na350 2 131 1027\na352 2 132 1027\na354 2 134 1027\na356 2 135 1027\na358 2 137 1027\na35a 6 138 1027\na360 6 147 1027\na366 2 148 1027\na368 7 150 1027\na36f 2 151 1027\na371 1 153 1027\na372 1 154 1027\na373 3 155 1027\na376 3 156 1027\na379 2 157 1027\na37b 1 158 1027\na37c 1 159 1027\na37d 2 160 1027\na37f 1 163 1027\na380 1 164 1027\na381 1 165 1027\na382 5 166 1027\na387 6 179 1027\na38d 2 180 1027\na38f 3 182 1027\na392 3 183 1027\na395 3 185 1027\na398 2 186 1027\na39a 2 188 1027\na39c 8 190 1027\na3a4 2 208 1027\na3a6 5 209 1027\na3ab 3 211 1027\na3ae 2 212 1027\na3b0 3 214 1027\na3b3 2 215 1027\na3b5 7 217 1027\na3bc 8 221 1027\na3c4 14 225 1027\na3d8 2 232 1027\na3da 2 233 1027\na3dc 2 235 1027\na3de 3 236 1027\na3e1 3 238 1027\na3e4 3 239 1027\na3e7 3 241 1027\na3ea 3 242 1027\na3ed 3 244 1027\na3f0 3 245 1027\na3f3 3 247 1027\na3f6 2 248 1027\na3f8 2 250 1027\na3fa a 252 1027\na404 2 256 1027\na406 2 257 1027\na408 2 259 1027\na40a 3 260 1027\na40d 3 262 1027\na410 3 263 1027\na413 3 265 1027\na416 3 266 1027\na419 3 268 1027\na41c 2 269 1027\na41e 2 271 1027\na420 8 273 1027\na428 2 277 1027\na42a 2 278 1027\na42c 2 280 1027\na42e 3 281 1027\na431 3 283 1027\na434 3 284 1027\na437 3 286 1027\na43a 2 287 1027\na43c 2 289 1027\na43e 2a 291 1027\na468 4 298 1027\na46c 4 300 1027\na470 4 302 1027\na474 4 304 1027\na478 4 306 1027\na47c 4 308 1027\na480 4 310 1027\na484 4 312 1027\na488 4 314 1027\na48c 4 316 1027\na490 4 318 1027\na494 4 320 1027\na498 4 322 1027\na49c 4 324 1027\na4a0 7 326 1027\na4a7 2 328 1027\na4a9 2 329 1027\na4ab 19 331 1027\na4c4 3 340 1027\na4c7 1 341 1027\na4c8 1 342 1027\na4c9 3 344 1027\na4cc 2 348 1027\na4ce 2 350 1027\na4d0 3 351 1027\na4d3 1 352 1027\na4d4 1 353 1027\na4d5 3 354 1027\na4d8 2 358 1027\na4da 2 360 1027\na4dc 3 361 1027\na4df 3 362 1027\na4e2 3 363 1027\na4e5 1 364 1027\na4e6 1 365 1027\na4e7 5 366 1027\na4ec 2 370 1027\na4ee 2 372 1027\na4f0 3 373 1027\na4f3 3 374 1027\na4f6 3 375 1027\na4f9 3 376 1027\na4fc 3 377 1027\na4ff 1 378 1027\na500 1 379 1027\na501 3 380 1027\na504 4 391 1027\na508 4 392 1027\na50c 6 397 1027\na512 2 398 1027\na514 3 400 1027\na517 3 401 1027\na51a 3 403 1027\na51d 2 404 1027\na51f 1 406 1027\na520 2 407 1027\na522 1 408 1027\na523 9 410 1027\na52c 2 414 1027\na52e a 417 1027\na538 2 422 1027\na53a 5 423 1027\na53f 3 425 1027\na542 2 426 1027\na544 3 428 1027\na547 2 429 1027\na549 7 431 1027\na550 14 435 1027\na564 3 442 1027\na567 2 443 1027\na569 3 445 1027\na56c 3 446 1027\na56f 3 448 1027\na572 3 449 1027\na575 3 451 1027\na578 2 452 1027\na57a 1 454 1027\na57b 2 455 1027\na57d 1 456 1027\na57e a 458 1027\na588 3 462 1027\na58b 2 463 1027\na58d 3 465 1027\na590 3 466 1027\na593 3 468 1027\na596 3 469 1027\na599 3 471 1027\na59c 3 472 1027\na59f 3 474 1027\na5a2 2 475 1027\na5a4 1 477 1027\na5a5 2 478 1027\na5a7 1 479 1027\na5a8 8 481 1027\na5b0 3 485 1027\na5b3 2 486 1027\na5b5 3 488 1027\na5b8 3 489 1027\na5bb 3 491 1027\na5be 3 492 1027\na5c1 3 494 1027\na5c4 3 495 1027\na5c7 3 497 1027\na5ca 3 498 1027\na5cd 3 500 1027\na5d0 6 501 1027\na5d6 1 503 1027\na5d7 2 504 1027\na5d9 1 505 1027\na5da 2a 507 1027\na604 4 516 1027\na608 4 518 1027\na60c 4 520 1027\na610 4 522 1027\na614 4 524 1027\na618 4 526 1027\na61c 4 528 1027\na620 4 530 1027\na624 4 532 1027\na628 4 534 1027\na62c 4 536 1027\na630 4 538 1027\na634 4 540 1027\na638 4 542 1027\na63c 7 544 1027\na643 2 546 1027\na645 2 547 1027\na647 19 549 1027\na660 3 558 1027\na663 1 560 1027\na664 1 561 1027\na665 3 562 1027\na668 3 566 1027\na66b 3 568 1027\na66e 3 569 1027\na671 1 570 1027\na672 1 571 1027\na673 5 572 1027\na678 3 576 1027\na67b 3 578 1027\na67e 3 579 1027\na681 3 580 1027\na684 3 581 1027\na687 1 582 1027\na688 1 583 1027\na689 3 584 1027\na68c 3 588 1027\na68f 3 590 1027\na692 3 591 1027\na695 3 592 1027\na698 3 593 1027\na69b 3 594 1027\na69e 3 595 1027\na6a1 1 596 1027\na6a2 1 597 1027\na6a3 2 598 1027\nFUNC a6b0 365 c memmove\na6b0 3 101 977\na6b3 1 113 977\na6b4 1 114 977\na6b5 3 116 977\na6b8 3 117 977\na6bb 3 119 977\na6be 2 129 977\na6c0 2 131 977\na6c2 2 132 977\na6c4 2 134 977\na6c6 2 135 977\na6c8 2 137 977\na6ca 6 138 977\na6d0 6 147 977\na6d6 2 148 977\na6d8 7 150 977\na6df 2 151 977\na6e1 1 153 977\na6e2 1 154 977\na6e3 3 155 977\na6e6 3 156 977\na6e9 2 157 977\na6eb 1 158 977\na6ec 1 159 977\na6ed 2 160 977\na6ef 1 163 977\na6f0 1 164 977\na6f1 1 165 977\na6f2 5 166 977\na6f7 6 179 977\na6fd 2 180 977\na6ff 3 182 977\na702 3 183 977\na705 3 185 977\na708 2 186 977\na70a 2 188 977\na70c 8 190 977\na714 2 208 977\na716 5 209 977\na71b 3 211 977\na71e 2 212 977\na720 3 214 977\na723 2 215 977\na725 7 217 977\na72c 8 221 977\na734 14 225 977\na748 2 232 977\na74a 2 233 977\na74c 2 235 977\na74e 3 236 977\na751 3 238 977\na754 3 239 977\na757 3 241 977\na75a 3 242 977\na75d 3 244 977\na760 3 245 977\na763 3 247 977\na766 2 248 977\na768 2 250 977\na76a a 252 977\na774 2 256 977\na776 2 257 977\na778 2 259 977\na77a 3 260 977\na77d 3 262 977\na780 3 263 977\na783 3 265 977\na786 3 266 977\na789 3 268 977\na78c 2 269 977\na78e 2 271 977\na790 8 273 977\na798 2 277 977\na79a 2 278 977\na79c 2 280 977\na79e 3 281 977\na7a1 3 283 977\na7a4 3 284 977\na7a7 3 286 977\na7aa 2 287 977\na7ac 2 289 977\na7ae 2a 291 977\na7d8 4 298 977\na7dc 4 300 977\na7e0 4 302 977\na7e4 4 304 977\na7e8 4 306 977\na7ec 4 308 977\na7f0 4 310 977\na7f4 4 312 977\na7f8 4 314 977\na7fc 4 316 977\na800 4 318 977\na804 4 320 977\na808 4 322 977\na80c 4 324 977\na810 7 326 977\na817 2 328 977\na819 2 329 977\na81b 19 331 977\na834 3 340 977\na837 1 341 977\na838 1 342 977\na839 3 344 977\na83c 2 348 977\na83e 2 350 977\na840 3 351 977\na843 1 352 977\na844 1 353 977\na845 3 354 977\na848 2 358 977\na84a 2 360 977\na84c 3 361 977\na84f 3 362 977\na852 3 363 977\na855 1 364 977\na856 1 365 977\na857 5 366 977\na85c 2 370 977\na85e 2 372 977\na860 3 373 977\na863 3 374 977\na866 3 375 977\na869 3 376 977\na86c 3 377 977\na86f 1 378 977\na870 1 379 977\na871 3 380 977\na874 4 391 977\na878 4 392 977\na87c 6 397 977\na882 2 398 977\na884 3 400 977\na887 3 401 977\na88a 3 403 977\na88d 2 404 977\na88f 1 406 977\na890 2 407 977\na892 1 408 977\na893 9 410 977\na89c 2 414 977\na89e a 417 977\na8a8 2 422 977\na8aa 5 423 977\na8af 3 425 977\na8b2 2 426 977\na8b4 3 428 977\na8b7 2 429 977\na8b9 7 431 977\na8c0 14 435 977\na8d4 3 442 977\na8d7 2 443 977\na8d9 3 445 977\na8dc 3 446 977\na8df 3 448 977\na8e2 3 449 977\na8e5 3 451 977\na8e8 2 452 977\na8ea 1 454 977\na8eb 2 455 977\na8ed 1 456 977\na8ee a 458 977\na8f8 3 462 977\na8fb 2 463 977\na8fd 3 465 977\na900 3 466 977\na903 3 468 977\na906 3 469 977\na909 3 471 977\na90c 3 472 977\na90f 3 474 977\na912 2 475 977\na914 1 477 977\na915 2 478 977\na917 1 479 977\na918 8 481 977\na920 3 485 977\na923 2 486 977\na925 3 488 977\na928 3 489 977\na92b 3 491 977\na92e 3 492 977\na931 3 494 977\na934 3 495 977\na937 3 497 977\na93a 3 498 977\na93d 3 500 977\na940 6 501 977\na946 1 503 977\na947 2 504 977\na949 1 505 977\na94a 2a 507 977\na974 4 516 977\na978 4 518 977\na97c 4 520 977\na980 4 522 977\na984 4 524 977\na988 4 526 977\na98c 4 528 977\na990 4 530 977\na994 4 532 977\na998 4 534 977\na99c 4 536 977\na9a0 4 538 977\na9a4 4 540 977\na9a8 4 542 977\na9ac 7 544 977\na9b3 2 546 977\na9b5 2 547 977\na9b7 19 549 977\na9d0 3 558 977\na9d3 1 560 977\na9d4 1 561 977\na9d5 3 562 977\na9d8 3 566 977\na9db 3 568 977\na9de 3 569 977\na9e1 1 570 977\na9e2 1 571 977\na9e3 5 572 977\na9e8 3 576 977\na9eb 3 578 977\na9ee 3 579 977\na9f1 3 580 977\na9f4 3 581 977\na9f7 1 582 977\na9f8 1 583 977\na9f9 3 584 977\na9fc 3 588 977\na9ff 3 590 977\naa02 3 591 977\naa05 3 592 977\naa08 3 593 977\naa0b 3 594 977\naa0e 3 595 977\naa11 1 596 977\naa12 1 597 977\naa13 2 598 977\nFUNC aa15 3d 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)\naa15 0 67 5721\naa15 33 68 5721\naa48 5 69 5721\naa4d 2 72 5721\naa4f 3 73 5721\nFUNC aa52 e 0 __CxxSetUnhandledExceptionFilter\naa52 0 86 5721\naa52 b 89 5721\naa5d 2 90 5721\naa5f 1 91 5721\nFUNC aa60 1a0 4 _NMSG_WRITE\naa60 2 174 2418\naa62 a 178 2418\naa6c f 179 2418\naa7b a 182 2418\naa85 2a 203 2418\naaaf c 215 2418\naabb 2a 224 2418\naae5 1e 227 2418\nab03 26 228 2418\nab29 d 231 2418\nab36 b 233 2418\nab41 2f 234 2418\nab70 20 237 2418\nab90 22 238 2418\nabb2 15 242 2418\nabc7 a 205 2418\nabd1 9 206 2418\nabda 24 212 2418\nabfe 2 245 2418\nFUNC ac00 20 4 _GET_RTERRMSG\nac00 0 268 2418\nac00 2 271 2418\nac02 13 272 2418\nac15 2 275 2418\nac17 1 276 2418\nac18 7 273 2418\nac1f 1 276 2418\nFUNC ac20 39 0 _FF_MSGBANNER\nac20 0 141 2418\nac20 22 145 2418\nac42 a 147 2418\nac4c c 148 2418\nac58 1 150 2418\nFUNC ac59 1 4 _initp_misc_winxfltr\nac59 0 105 2752\nac59 1 106 2752\nFUNC ac5a 32 4 xcptlookup\nac5a 0 410 2752\nac5a b 411 2752\nac65 14 418 2752\nac79 e 425 2752\nac87 2 428 2752\nac89 2 426 2752\nac8b 1 429 2752\nFUNC ac8c 15e 8 _XcptFilter\nac8c 6 206 2752\nac92 7 213 2752\nac99 8 214 2752\naca1 34 219 2752\nacd5 2 221 2752\nacd7 2 225 2752\nacd9 3 227 2752\nacdc 7 234 2752\nace3 7 235 2752\nacea 5 243 2752\nacef 4 248 2752\nacf3 8 249 2752\nacfb 3 255 2752\nacfe 6 259 2752\nad04 6 273 2752\nad0a 6 274 2752\nad10 c 283 2752\nad1c 17 291 2752\nad33 1e 294 2752\nad51 3 291 2752\nad54 c 321 2752\nad60 9 323 2752\nad69 7 325 2752\nad70 9 327 2752\nad79 7 329 2752\nad80 9 331 2752\nad89 7 333 2752\nad90 9 335 2752\nad99 7 337 2752\nada0 9 339 2752\nada9 7 341 2752\nadb0 9 343 2752\nadb9 7 345 2752\nadc0 7 347 2752\nadc7 8 356 2752\nadcf 3 361 2752\nadd2 2 363 2752\nadd4 4 368 2752\nadd8 3 369 2752\naddb 7 375 2752\nade2 6 377 2752\nade8 2 379 2752\nFUNC adea 1b 8 __CppXcptFilter\nadea 0 145 2752\nadea b 146 2752\nadf5 c 147 2752\nae01 1 151 2752\nae02 2 149 2752\nae04 1 151 2752\nFUNC ae05 db 0 _setenvp\nae05 1 77 2280\nae06 c 85 2280\nae12 5 86 2280\nae17 8 91 2280\nae1f 4 98 2280\nae23 8 99 2280\nae2b 4 110 2280\nae2f 1 111 2280\nae30 11 112 2280\nae41 15 117 2280\nae56 2 118 2280\nae58 9 121 2280\nae61 9 123 2280\nae6a 6 125 2280\nae70 10 127 2280\nae80 1c 133 2280\nae9c 3 134 2280\nae9f 6 121 2280\naea5 b 138 2280\naeb0 6 139 2280\naeb6 2 142 2280\naeb8 a 149 2280\naec2 7 152 2280\naec9 17 153 2280\nFUNC aee0 a 4 _set_pgmptr\naee0 a 334 2303\nFUNC aeea 198 c parse_cmdline\naeea 4 218 2322\naeee 6 226 2322\naef4 8 230 2322\naefc 14 231 2322\naf10 3 250 2322\naf13 5 252 2322\naf18 5 254 2322\naf1d 9 255 2322\naf26 2 256 2322\naf28 2 258 2322\naf2a 4 259 2322\naf2e 8 260 2322\naf36 2 262 2322\naf38 f 264 2322\naf47 2 265 2322\naf49 6 266 2322\naf4f a 267 2322\naf59 1 268 2322\naf5a 1a 272 2322\naf74 4 277 2322\naf78 4 278 2322\naf7c 4 281 2322\naf80 9 286 2322\naf89 a 287 2322\naf93 3 288 2322\naf96 1 275 2322\naf97 2 276 2322\naf99 9 291 2322\nafa2 6 295 2322\nafa8 9 296 2322\nafb1 2 297 2322\nafb3 3 311 2322\nafb6 4 315 2322\nafba 1 318 2322\nafbb 1 319 2322\nafbc 5 316 2322\nafc1 5 321 2322\nafc6 5 324 2322\nafcb e 325 2322\nafd9 2 326 2322\nafdb 2 327 2322\nafdd d 329 2322\nafea 2 332 2322\nafec 5 336 2322\naff1 4 337 2322\naff5 4 338 2322\naff9 6 339 2322\nafff 3 338 2322\nb002 14 343 2322\nb016 4 348 2322\nb01a 2 349 2322\nb01c 10 350 2322\nb02c b 351 2322\nb037 2 352 2322\nb039 a 354 2322\nb043 2 355 2322\nb045 a 356 2322\nb04f 1 357 2322\nb050 2 358 2322\nb052 5 361 2322\nb057 1 363 2322\nb058 5 372 2322\nb05d 4 376 2322\nb061 7 377 2322\nb068 2 378 2322\nb06a 8 379 2322\nb072 9 382 2322\nb07b 3 383 2322\nb07e 2 384 2322\nb080 2 385 2322\nFUNC b082 b9 0 _setargv\nb082 7 88 2322\nb089 c 97 2322\nb095 5 98 2322\nb09a 18 104 2322\nb0b2 19 120 2322\nb0cb 11 127 2322\nb0dc 15 132 2322\nb0f1 a 136 2322\nb0fb 2 138 2322\nb0fd 8 140 2322\nb105 3 141 2322\nb108 2 142 2322\nb10a 13 149 2322\nb11d c 153 2322\nb129 6 157 2322\nb12f 4 172 2322\nb133 6 134 2322\nb139 2 173 2322\nFUNC b13b 135 0 __crtGetEnvironmentStringsA\nb13b 2 43 4307\nb13d 1a 57 4307\nb157 8 59 4307\nb15f c 60 4307\nb16b b 62 4307\nb176 e 63 4307\nb184 9 68 4307\nb18d 4 71 4307\nb191 8 72 4307\nb199 7 73 4307\nb1a0 7 77 4307\nb1a7 7 78 4307\nb1ae 7 79 4307\nb1b5 1b 93 4307\nb1d0 13 97 4307\nb1e3 11 111 4307\nb1f4 a 113 4307\nb1fe 8 114 4307\nb206 7 99 4307\nb20d 4 100 4307\nb211 6 123 4307\nb217 2 152 4307\nb219 a 126 4307\nb223 6 127 4307\nb229 4 133 4307\nb22d 5 134 4307\nb232 5 135 4307\nb237 5 138 4307\nb23c d 140 4307\nb249 7 141 4307\nb250 5 142 4307\nb255 b 145 4307\nb260 7 147 4307\nb267 6 149 4307\nb26d 3 153 4307\nFUNC b270 24 0 _RTC_Initialize\nFUNC b294 24 0 _RTC_Terminate\nFUNC b2b8 5b 0 __heap_select\nb2b8 6 70 5473\nb2be 23 143 5473\nb2e1 1b 144 5473\nb2fc d 145 5473\nb309 3 146 5473\nb30c 2 164 5473\nb30e 3 161 5473\nb311 2 164 5473\nFUNC b313 5a 4 _heap_init\nb313 0 192 5473\nb313 20 199 5473\nb333 2 200 5473\nb335 1 240 5473\nb336 5 204 5473\nb33b a 206 5473\nb345 f 209 5473\nb354 c 211 5473\nb360 7 212 5473\nb367 2 213 5473\nb369 3 239 5473\nb36c 1 240 5473\nFUNC b36d 74 0 _heap_term\nb36d 1 261 5473\nb36e c 264 5473\nb37a 1b 270 5473\nb395 f 273 5473\nb3a4 b 276 5473\nb3af d 278 5473\nb3bc 11 281 5473\nb3cd c 300 5473\nb3d9 7 301 5473\nb3e0 1 302 5473\nFUNC b3e1 6 0 _get_heap_handle\nb3e1 0 320 5473\nb3e1 5 322 5473\nb3e6 1 323 5473\nFUNC b3e7 94 0 __security_init_cookie\nb3e7 6 97 3689\nb3ed 21 114 3689\nb40e 7 116 3689\nb415 3 117 3689\nb418 a 127 3689\nb422 6 132 3689\nb428 8 135 3689\nb430 8 136 3689\nb438 8 137 3689\nb440 10 139 3689\nb450 2 144 3689\nb452 4 161 3689\nb456 7 163 3689\nb45d 4 166 3689\nb461 7 168 3689\nb468 6 172 3689\nb46e b 173 3689\nb479 2 175 3689\nFUNC b47b 8 4 _crt_debugger_hook\nb47b 0 62 3966\nb47b 7 65 3966\nb482 1 66 3966\nFUNC b483 160 8 _flsbuf\nb483 5 93 2041\nb488 c 104 2041\nb494 8 106 2041\nb49c b 107 2041\nb4a7 4 108 2041\nb4ab 8 109 2041\nb4b3 4 110 2041\nb4b7 b 111 2041\nb4c2 3 113 2041\nb4c5 6 124 2041\nb4cb b 126 2041\nb4d6 3 127 2041\nb4d9 8 128 2041\nb4e1 9 137 2041\nb4ea f 141 2041\nb4f9 25 151 2041\nb51e 7 153 2041\nb525 d 158 2041\nb532 5 162 2041\nb537 5 163 2041\nb53c 6 164 2041\nb542 7 166 2041\nb549 10 167 2041\nb559 2 168 2041\nb55b 6 131 2041\nb561 5 132 2041\nb566 2e 169 2041\nb594 12 171 2041\nb5a6 2 174 2041\nb5a8 8 179 2041\nb5b0 2 186 2041\nb5b2 3 187 2041\nb5b5 13 189 2041\nb5c8 5 201 2041\nb5cd 4 202 2041\nb5d1 5 203 2041\nb5d6 b 207 2041\nb5e1 2 212 2041\nFUNC b5e3 25 4 write_char\nb5e3 0 2433 1163\nb5e3 a 2434 1163\nb5ed 2 2437 1163\nb5ef 12 2440 1163\nb601 3 2444 1163\nb604 1 2447 1163\nb605 2 2446 1163\nb607 1 2447 1163\nFUNC b608 25 c write_multi_char\nb608 6 2498 1163\nb60e 2 2501 1163\nb610 e 2500 1163\nb61e 6 2501 1163\nb624 7 2499 1163\nb62b 2 2504 1163\nFUNC b62d 4f 4 write_string\nb62d 0 2563 1163\nb62d 12 2564 1163\nb63f 6 2566 1163\nb645 2 2567 1163\nb647 11 2570 1163\nb658 6 2571 1163\nb65e a 2573 1163\nb668 a 2574 1163\nb672 9 2569 1163\nb67b 1 2579 1163\nFUNC b67c 910 10 _woutput_l\nb67c 1b 975 1163\nb697 72 1031 1163\nb709 4 1036 1163\nb70d 2c 1073 1163\nb739 1a 1075 1163\nb753 8 1076 1163\nb75b 18 1131 1163\nb773 2 1171 1163\nb775 13 1173 1163\nb788 3 1174 1163\nb78b 5 1175 1163\nb790 1f 1179 1163\nb7af 4 1193 1163\nb7b3 5 1194 1163\nb7b8 4 1181 1163\nb7bc 5 1182 1163\nb7c1 4 1184 1163\nb7c5 5 1185 1163\nb7ca 7 1190 1163\nb7d1 5 1191 1163\nb7d6 3 1187 1163\nb7d9 5 1196 1163\nb7de 6 1200 1163\nb7e4 9 1206 1163\nb7ed b 1233 1163\nb7f8 4 1235 1163\nb7fc 3 1236 1163\nb7ff 5 1239 1163\nb804 10 1241 1163\nb814 5 1243 1163\nb819 4 1248 1163\nb81d 5 1249 1163\nb822 6 1253 1163\nb828 9 1259 1163\nb831 b 1284 1163\nb83c 4 1285 1163\nb840 5 1287 1163\nb845 10 1289 1163\nb855 5 1291 1163\nb85a 1b 1295 1163\nb875 7 1362 1163\nb87c 5 1363 1163\nb881 6 1301 1163\nb887 2 1303 1163\nb889 a 1304 1163\nb893 5 1306 1163\nb898 4 1308 1163\nb89c 5 1310 1163\nb8a1 4 1358 1163\nb8a5 5 1359 1163\nb8aa 10 1322 1163\nb8ba 3 1324 1163\nb8bd f 1325 1163\nb8cc d 1327 1163\nb8d9 3 1329 1163\nb8dc a 1330 1163\nb8e6 5 1332 1163\nb8eb 3c 1337 1163\nb927 4 1352 1163\nb92b 13 1166 1163\nb93e 5 1167 1163\nb943 32 1378 1163\nb975 d 1716 1163\nb982 4 1724 1163\nb986 18 1749 1163\nb99e c 1750 1163\nb9aa c 1381 1163\nb9b6 9 1383 1163\nb9bf 8 1564 1163\nb9c7 4 1565 1163\nb9cb d 1584 1163\nb9d8 3 1589 1163\nb9db 13 1610 1163\nb9ee 4 1611 1163\nb9f2 8 1612 1163\nb9fa 19 1614 1163\nba13 13 1618 1163\nba26 1 1620 1163\nba27 9 1621 1163\nba30 5 1622 1163\nba35 1d 1378 1163\nba52 9 1397 1163\nba5b f 1415 1163\nba6a 3 1420 1163\nba6d 25 1430 1163\nba92 3 1434 1163\nba95 2 1436 1163\nba97 4 1437 1163\nba9b 6 1439 1163\nbaa1 3 1440 1163\nbaa4 5 1506 1163\nbaa9 5 1523 1163\nbaae e 1541 1163\nbabc 6 1546 1163\nbac2 b 1548 1163\nbacd 7 1549 1163\nbad4 5 1550 1163\nbad9 4 1551 1163\nbadd 5 1553 1163\nbae2 8 1543 1163\nbaea 7 1544 1163\nbaf1 5 1557 1163\nbaf6 34 1378 1163\nbb2a d 1908 1163\nbb37 9 1910 1163\nbb40 8 1668 1163\nbb48 d 1688 1163\nbb55 6 1702 1163\nbb5b 7 1703 1163\nbb62 2 1704 1163\nbb64 5 1706 1163\nbb69 7 1708 1163\nbb70 5 1710 1163\nbb75 4 1864 1163\nbb79 7 1869 1163\nbb80 c 1933 1163\nbb8c 8 1939 1163\nbb94 5 1958 1163\nbb99 8 1751 1163\nbba1 9 1752 1163\nbbaa 5 1753 1163\nbbaf 3 1754 1163\nbbb2 9 1756 1163\nbbbb f 1759 1163\nbbca 2 1760 1163\nbbcc 13 1765 1163\nbbdf 7 1767 1163\nbbe6 e 1809 1163\nbbf4 27 1828 1163\nbc1b 14 1838 1163\nbc2f 15 1840 1163\nbc44 b 1844 1163\nbc4f 15 1846 1163\nbc64 5 1852 1163\nbc69 7 1853 1163\nbc70 4 1854 1163\nbc74 1 1857 1163\nbc75 5 1859 1163\nbc7a 7 1877 1163\nbc81 3 1887 1163\nbc84 2 1888 1163\nbc86 1a 1378 1163\nbca0 7 1892 1163\nbca7 11 1897 1163\nbcb8 10 1900 1163\nbcc8 3 1901 1163\nbccb 5 1903 1163\nbcd0 6 1961 1163\nbcd6 6 1987 1163\nbcdc 16 2026 1163\nbcf2 2 2045 1163\nbcf4 5 2051 1163\nbcf9 2 2071 1163\nbcfb 4 2074 1163\nbcff 6 2080 1163\nbd05 2 2099 1163\nbd07 5 2105 1163\nbd0c 10 2128 1163\nbd1c 7 2129 1163\nbd23 7 2130 1163\nbd2a c 2136 1163\nbd36 2 2142 1163\nbd38 6 2148 1163\nbd3e 7 2149 1163\nbd45 2 2150 1163\nbd47 4 2151 1163\nbd4b a 2152 1163\nbd55 3 2153 1163\nbd58 6 2157 1163\nbd5e 3 2158 1163\nbd61 6 2163 1163\nbd67 10 2165 1163\nbd77 10 2166 1163\nbd87 c 2168 1163\nbd93 3 2170 1163\nbd96 3 2172 1163\nbd99 2 2173 1163\nbd9b 8 2175 1163\nbda3 1 2176 1163\nbda4 19 2180 1163\nbdbd 9 2181 1163\nbdc6 1 2182 1163\nbdc7 2 2185 1163\nbdc9 4 1625 1163\nbdcd 8 1626 1163\nbdd5 c 1628 1163\nbde1 7 1629 1163\nbde8 2 1630 1163\nbdea 4 1629 1163\nbdee 8 1631 1163\nbdf6 a 2201 1163\nbe00 7 2204 1163\nbe07 6 2205 1163\nbe0d 6 2207 1163\nbe13 2 2208 1163\nbe15 4 2210 1163\nbe19 6 2212 1163\nbe1f 2 2213 1163\nbe21 4 2215 1163\nbe25 6 2217 1163\nbe2b 7 2218 1163\nbe32 b 2224 1163\nbe3d 6 2228 1163\nbe43 11 2230 1163\nbe54 11 2234 1163\nbe65 d 2236 1163\nbe72 f 2238 1163\nbe81 a 2263 1163\nbe8b 3 2267 1163\nbe8e 3 2268 1163\nbe91 3 2269 1163\nbe94 1a 2276 1163\nbeae 7 2278 1163\nbeb5 e 2282 1163\nbec3 a 2283 1163\nbecd 2 1690 1163\nbecf 4 2279 1163\nbed3 2 2285 1163\nbed5 d 2286 1163\nbee2 c 2290 1163\nbeee 11 2292 1163\nbeff 6 2297 1163\nbf05 8 2298 1163\nbf0d 4 2299 1163\nbf11 1 2298 1163\nbf12 1b 1073 1163\nbf2d 17 1690 1163\nbf44 10 2376 1163\nbf54 38 2377 1163\nFUNC bf8c 97 10 _vswprintf_l\nbf8c 7 125 1425\nbf93 24 130 1425\nbfb7 8 135 1425\nbfbf 29 155 1425\nbfe8 1d 166 1425\nc005 18 167 1425\nc01d 4 169 1425\nc021 2 183 1425\nFUNC c023 17 c _vswprintf\nc023 0 192 1425\nc023 16 195 1425\nc039 1 197 1425\nFUNC c03a 5 10 __vswprintf_l\nc03a 0 205 1425\nc03a 5 208 1425\nFUNC c03f 55 10 _vscwprintf_helper\nc03f 7 430 1425\nc046 24 435 1425\nc06a 28 441 1425\nc092 2 443 1425\nFUNC c094 18 8 _vscwprintf\nc094 0 449 1425\nc094 17 450 1425\nc0ab 1 451 1425\nFUNC c0ac 1a c _vscwprintf_l\nc0ac 0 458 1425\nc0ac 19 459 1425\nc0c5 1 460 1425\nFUNC c0c6 18 8 _vscwprintf_p\nc0c6 0 466 1425\nc0c6 17 467 1425\nc0dd 1 468 1425\nFUNC c0de 1a c _vscwprintf_p_l\nc0de 0 475 1425\nc0de 19 476 1425\nc0f7 1 477 1425\nFUNC c0f8 14e 14 vfprintf_helper\nc0f8 c 51 1462\nc104 5 54 1462\nc109 2e 56 1462\nc137 c 57 1462\nc143 3 60 1462\nc146 7 62 1462\nc14d 3 63 1462\nc150 b0 65 1462\nc200 5 66 1462\nc205 8 68 1462\nc20d 10 69 1462\nc21d a 70 1462\nc227 c 74 1462\nc233 3 78 1462\nc236 6 79 1462\nc23c a 75 1462\nFUNC c246 1e 10 _vfprintf_l\nc246 0 87 1462\nc246 1d 88 1462\nc263 1 89 1462\nFUNC c264 1e 10 _vfprintf_s_l\nc264 0 97 1462\nc264 1d 98 1462\nc281 1 99 1462\nFUNC c282 1e 10 _vfprintf_p_l\nc282 0 107 1462\nc282 1d 108 1462\nc29f 1 109 1462\nFUNC c2a0 1c c vfprintf\nc2a0 0 116 1462\nc2a0 1b 117 1462\nc2bb 1 118 1462\nFUNC c2bc 1c c vfprintf_s\nc2bc 0 125 1462\nc2bc 1b 126 1462\nc2d7 1 127 1462\nFUNC c2d8 1c c _vfprintf_p\nc2d8 0 134 1462\nc2d8 1b 135 1462\nc2f3 1 136 1462\nFUNC c2f4 25 4 write_char\nc2f4 0 2433 1053\nc2f4 a 2434 1053\nc2fe 2 2437 1053\nc300 12 2440 1053\nc312 3 2444 1053\nc315 1 2447 1053\nc316 2 2446 1053\nc318 1 2447 1053\nFUNC c319 25 c write_multi_char\nc319 6 2498 1053\nc31f 2 2501 1053\nc321 e 2500 1053\nc32f 6 2501 1053\nc335 7 2499 1053\nc33c 2 2504 1053\nFUNC c33e 4f 4 write_string\nc33e 0 2563 1053\nc33e 12 2564 1053\nc350 6 2566 1053\nc356 2 2567 1053\nc358 11 2570 1053\nc369 6 2571 1053\nc36f a 2573 1053\nc379 a 2574 1053\nc383 9 2569 1053\nc38c 1 2579 1053\nFUNC c38d 91c 10 _woutput_s_l\nc38d 29 975 1053\nc3b6 3 976 1053\nc3b9 f 1007 1053\nc3c8 24 2172 1053\nc3ec 2f 1031 1053\nc41b 18 1036 1053\nc433 2e 1073 1053\nc461 16 1078 1053\nc477 e 1079 1053\nc485 11 1124 1053\nc496 10 1131 1053\nc4a6 2 1171 1053\nc4a8 13 1173 1053\nc4bb 3 1174 1053\nc4be 5 1175 1053\nc4c3 1e 1179 1053\nc4e1 3 1193 1053\nc4e4 5 1194 1053\nc4e9 4 1181 1053\nc4ed 5 1182 1053\nc4f2 4 1184 1053\nc4f6 5 1185 1053\nc4fb 7 1190 1053\nc502 5 1191 1053\nc507 3 1187 1053\nc50a 5 1196 1053\nc50f 6 1200 1053\nc515 5 1206 1053\nc51a e 1233 1053\nc528 4 1235 1053\nc52c 3 1236 1053\nc52f 5 1239 1053\nc534 10 1241 1053\nc544 5 1243 1053\nc549 4 1248 1053\nc54d 5 1249 1053\nc552 6 1253 1053\nc558 5 1259 1053\nc55d e 1284 1053\nc56b 4 1285 1053\nc56f 5 1287 1053\nc574 10 1289 1053\nc584 5 1291 1053\nc589 1b 1295 1053\nc5a4 7 1362 1053\nc5ab 5 1363 1053\nc5b0 6 1301 1053\nc5b6 2 1303 1053\nc5b8 7 1304 1053\nc5bf 5 1306 1053\nc5c4 4 1308 1053\nc5c8 5 1310 1053\nc5cd 4 1358 1053\nc5d1 5 1359 1053\nc5d6 10 1322 1053\nc5e6 3 1324 1053\nc5e9 c 1325 1053\nc5f5 d 1327 1053\nc602 3 1329 1053\nc605 7 1330 1053\nc60c 5 1332 1053\nc611 3c 1337 1053\nc64d 4 1352 1053\nc651 14 1166 1053\nc665 5 1167 1053\nc66a 32 1378 1053\nc69c d 1716 1053\nc6a9 4 1724 1053\nc6ad 18 1749 1053\nc6c5 c 1750 1053\nc6d1 c 1381 1053\nc6dd 9 1383 1053\nc6e6 8 1564 1053\nc6ee 4 1565 1053\nc6f2 d 1584 1053\nc6ff 3 1589 1053\nc702 13 1610 1053\nc715 4 1611 1053\nc719 8 1612 1053\nc721 19 1614 1053\nc73a 13 1618 1053\nc74d 1 1620 1053\nc74e 9 1621 1053\nc757 5 1622 1053\nc75c 1e 1378 1053\nc77a 9 1397 1053\nc783 f 1415 1053\nc792 3 1420 1053\nc795 25 1430 1053\nc7ba 3 1434 1053\nc7bd 2 1436 1053\nc7bf 4 1437 1053\nc7c3 6 1439 1053\nc7c9 3 1440 1053\nc7cc 5 1506 1053\nc7d1 5 1523 1053\nc7d6 e 1541 1053\nc7e4 6 1546 1053\nc7ea b 1548 1053\nc7f5 7 1549 1053\nc7fc 5 1550 1053\nc801 4 1551 1053\nc805 5 1553 1053\nc80a 8 1543 1053\nc812 7 1544 1053\nc819 5 1557 1053\nc81e 34 1378 1053\nc852 9 1908 1053\nc85b 9 1910 1053\nc864 8 1668 1053\nc86c d 1688 1053\nc879 6 1702 1053\nc87f 7 1703 1053\nc886 2 1704 1053\nc888 5 1706 1053\nc88d 7 1708 1053\nc894 5 1710 1053\nc899 4 1864 1053\nc89d 7 1869 1053\nc8a4 c 1933 1053\nc8b0 8 1939 1053\nc8b8 5 1958 1053\nc8bd 8 1751 1053\nc8c5 9 1752 1053\nc8ce 5 1753 1053\nc8d3 3 1754 1053\nc8d6 9 1756 1053\nc8df f 1759 1053\nc8ee 3 1760 1053\nc8f1 15 1765 1053\nc906 7 1767 1053\nc90d e 1809 1053\nc91b 27 1828 1053\nc942 14 1838 1053\nc956 15 1840 1053\nc96b b 1844 1053\nc976 15 1846 1053\nc98b 5 1852 1053\nc990 7 1853 1053\nc997 4 1854 1053\nc99b 1 1857 1053\nc99c 5 1859 1053\nc9a1 3 1877 1053\nc9a4 7 1887 1053\nc9ab 2 1888 1053\nc9ad 1a 1378 1053\nc9c7 7 1892 1053\nc9ce 11 1897 1053\nc9df 10 1900 1053\nc9ef 3 1901 1053\nc9f2 5 1903 1053\nc9f7 6 1961 1053\nc9fd 6 1987 1053\nca03 16 2026 1053\nca19 2 2045 1053\nca1b 5 2051 1053\nca20 2 2071 1053\nca22 4 2074 1053\nca26 6 2080 1053\nca2c 2 2099 1053\nca2e 5 2105 1053\nca33 10 2128 1053\nca43 7 2129 1053\nca4a 7 2130 1053\nca51 c 2136 1053\nca5d 2 2142 1053\nca5f 6 2148 1053\nca65 7 2149 1053\nca6c 2 2150 1053\nca6e 4 2151 1053\nca72 a 2152 1053\nca7c 3 2153 1053\nca7f 6 2157 1053\nca85 3 2158 1053\nca88 6 2163 1053\nca8e 10 2165 1053\nca9e 10 2166 1053\ncaae c 2168 1053\ncaba 3 2170 1053\ncabd 3 2172 1053\ncac0 2 2173 1053\ncac2 8 2175 1053\ncaca 1 2176 1053\ncacb 19 2180 1053\ncae4 9 2181 1053\ncaed 1 2182 1053\ncaee 2 2185 1053\ncaf0 4 1625 1053\ncaf4 8 1626 1053\ncafc c 1628 1053\ncb08 7 1629 1053\ncb0f 2 1630 1053\ncb11 4 1629 1053\ncb15 8 1631 1053\ncb1d a 2201 1053\ncb27 7 2204 1053\ncb2e 6 2205 1053\ncb34 6 2207 1053\ncb3a 2 2208 1053\ncb3c 4 2210 1053\ncb40 6 2212 1053\ncb46 2 2213 1053\ncb48 4 2215 1053\ncb4c 6 2217 1053\ncb52 7 2218 1053\ncb59 b 2224 1053\ncb64 6 2228 1053\ncb6a 11 2230 1053\ncb7b 11 2234 1053\ncb8c d 2236 1053\ncb99 f 2238 1053\ncba8 a 2263 1053\ncbb2 3 2267 1053\ncbb5 3 2268 1053\ncbb8 3 2269 1053\ncbbb 1a 2276 1053\ncbd5 7 2278 1053\ncbdc e 2282 1053\ncbea a 2283 1053\ncbf4 2 1690 1053\ncbf6 4 2279 1053\ncbfa 2 2285 1053\ncbfc d 2286 1053\ncc09 c 2290 1053\ncc15 11 2292 1053\ncc26 6 2297 1053\ncc2c 8 2298 1053\ncc34 16 2299 1053\ncc4a 7 1073 1053\ncc51 10 2310 1053\ncc61 10 2376 1053\ncc71 38 2377 1053\nFUNC cca9 154 10 _validate_param_reuseW\ncca9 3 606 1108\nccac 21 610 1108\ncccd 13 617 1108\ncce0 13 618 1108\nccf3 10 620 1108\ncd03 4a 629 1108\ncd4d 54 632 1108\ncda1 2 633 1108\ncda3 1a 639 1108\ncdbd f 645 1108\ncdcc 23 626 1108\ncdef c 614 1108\ncdfb 2 646 1108\nFUNC cdfd 25 4 write_char\ncdfd 0 2433 1108\ncdfd a 2434 1108\nce07 2 2437 1108\nce09 12 2440 1108\nce1b 3 2444 1108\nce1e 1 2447 1108\nce1f 2 2446 1108\nce21 1 2447 1108\nFUNC ce22 25 c write_multi_char\nce22 6 2498 1108\nce28 2 2501 1108\nce2a e 2500 1108\nce38 6 2501 1108\nce3e 7 2499 1108\nce45 2 2504 1108\nFUNC ce47 4f 4 write_string\nce47 0 2563 1108\nce47 12 2564 1108\nce59 6 2566 1108\nce5f 2 2567 1108\nce61 11 2570 1108\nce72 6 2571 1108\nce78 a 2573 1108\nce82 a 2574 1108\nce8c 9 2569 1108\nce95 1 2579 1108\nFUNC ce96 f60 10 _woutput_p_l\nce96 1b 975 1108\nceb1 20 1013 1108\nced1 28 2172 1108\ncef9 2c 1031 1108\ncf25 4 1036 1108\ncf29 3 1038 1108\ncf2c 3 1041 1108\ncf2f 3 1043 1108\ncf32 f 1046 1108\ncf41 44 1073 1108\ncf85 1a 1078 1108\ncf9f 11 1079 1108\ncfb0 16 1082 1108\ncfc6 6 1084 1108\ncfcc 1c 1087 1108\ncfe8 6 1089 1108\ncfee 16 1091 1108\nd004 7 1093 1108\nd00b 2 1095 1108\nd00d 7 1097 1108\nd014 6 1101 1108\nd01a c 1103 1108\nd026 7 1104 1108\nd02d f 1106 1108\nd03c 1d 1109 1108\nd059 8 1112 1108\nd061 5 1131 1108\nd066 3 1117 1108\nd069 7 1131 1108\nd070 9 1120 1108\nd079 b 1131 1108\nd084 24 1137 1108\nd0a8 5 1145 1108\nd0ad 2 1171 1108\nd0af 16 1173 1108\nd0c5 3 1174 1108\nd0c8 5 1175 1108\nd0cd 1f 1179 1108\nd0ec 7 1193 1108\nd0f3 5 1194 1108\nd0f8 7 1181 1108\nd0ff 5 1182 1108\nd104 7 1184 1108\nd10b 5 1185 1108\nd110 a 1190 1108\nd11a 5 1191 1108\nd11f 6 1187 1108\nd125 5 1196 1108\nd12a a 1200 1108\nd134 6 1203 1108\nd13a a 1206 1108\nd144 2 1209 1108\nd146 c 1211 1108\nd152 6 1212 1108\nd158 e 1214 1108\nd166 1c 1216 1108\nd182 8 1219 1108\nd18a 12 1221 1108\nd19c a 1274 1108\nd1a6 5 1275 1108\nd1ab c 1228 1108\nd1b7 b 1233 1108\nd1c2 7 1235 1108\nd1c9 3 1236 1108\nd1cc 5 1239 1108\nd1d1 10 1241 1108\nd1e1 5 1243 1108\nd1e6 4 1248 1108\nd1ea 5 1249 1108\nd1ef 6 1253 1108\nd1f5 6 1256 1108\nd1fb a 1259 1108\nd205 2 1262 1108\nd207 c 1264 1108\nd213 6 1265 1108\nd219 12 1267 1108\nd22b c 1280 1108\nd237 b 1284 1108\nd242 4 1285 1108\nd246 5 1287 1108\nd24b 22 1274 1108\nd26d 10 1289 1108\nd27d 5 1291 1108\nd282 1b 1295 1108\nd29d a 1362 1108\nd2a7 5 1363 1108\nd2ac 6 1301 1108\nd2b2 2 1303 1108\nd2b4 d 1304 1108\nd2c1 5 1306 1108\nd2c6 7 1308 1108\nd2cd 5 1310 1108\nd2d2 7 1358 1108\nd2d9 5 1359 1108\nd2de 10 1322 1108\nd2ee 3 1324 1108\nd2f1 12 1325 1108\nd303 d 1327 1108\nd310 3 1329 1108\nd313 d 1330 1108\nd320 5 1332 1108\nd325 24 1337 1108\nd349 4 1352 1108\nd34d 13 1166 1108\nd360 5 1167 1108\nd365 a 1342 1108\nd36f 5 1366 1108\nd374 36 1378 1108\nd3aa d 1716 1108\nd3b7 7 1724 1108\nd3be 14 1726 1108\nd3d2 9 1728 1108\nd3db 2a 1739 1108\nd405 b 1381 1108\nd410 9 1383 1108\nd419 b 1564 1108\nd424 7 1565 1108\nd42b d 1584 1108\nd438 b 1586 1108\nd443 a 1589 1108\nd44d 5 1592 1108\nd452 22 1378 1108\nd474 d 1394 1108\nd481 b 1397 1108\nd48c 2 1400 1108\nd48e 9 1402 1108\nd497 6 1404 1108\nd49d 24 1406 1108\nd4c1 5 1407 1108\nd4c6 d 1411 1108\nd4d3 c 1415 1108\nd4df 3 1420 1108\nd4e2 28 1430 1108\nd50a 7 1434 1108\nd511 2 1436 1108\nd513 7 1437 1108\nd51a 9 1439 1108\nd523 7 1440 1108\nd52a 5 1506 1108\nd52f 6 1520 1108\nd535 a 1523 1108\nd53f 2 1526 1108\nd541 9 1528 1108\nd54a 4 1530 1108\nd54e 6 1533 1108\nd554 c 1537 1108\nd560 b 1541 1108\nd56b 9 1546 1108\nd574 b 1548 1108\nd57f 7 1549 1108\nd586 5 1550 1108\nd58b 4 1551 1108\nd58f 5 1553 1108\nd594 8 1543 1108\nd59c 7 1544 1108\nd5a3 5 1557 1108\nd5a8 38 1378 1108\nd5e0 15 1908 1108\nd5f5 11 1910 1108\nd606 6 1665 1108\nd60c a 1668 1108\nd616 2 1671 1108\nd618 9 1673 1108\nd621 6 1675 1108\nd627 1f 1677 1108\nd646 5 1678 1108\nd64b c 1682 1108\nd657 d 1688 1108\nd664 9 1702 1108\nd66d 7 1703 1108\nd674 2 1704 1108\nd676 5 1706 1108\nd67b 7 1708 1108\nd682 5 1710 1108\nd687 7 1864 1108\nd68e 7 1869 1108\nd695 6 1910 1108\nd69b 9 1933 1108\nd6a4 a 1936 1108\nd6ae f 1939 1108\nd6bd 5 1942 1108\nd6c2 1a 1739 1108\nd6dc 21 1109 1108\nd6fd 17 1749 1108\nd714 9 1750 1108\nd71d 8 1751 1108\nd725 9 1752 1108\nd72e 5 1753 1108\nd733 3 1754 1108\nd736 a 1756 1108\nd740 f 1759 1108\nd74f 2 1760 1108\nd751 13 1765 1108\nd764 3 1767 1108\nd767 7 1806 1108\nd76e 9 1809 1108\nd777 2 1812 1108\nd779 a 1818 1108\nd783 6 1821 1108\nd789 16 1822 1108\nd79f 24 1828 1108\nd7c3 16 1838 1108\nd7d9 15 1840 1108\nd7ee b 1844 1108\nd7f9 15 1846 1108\nd80e 5 1852 1108\nd813 a 1853 1108\nd81d 4 1854 1108\nd821 1 1857 1108\nd822 5 1859 1108\nd827 7 1877 1108\nd82e 7 1887 1108\nd835 2 1888 1108\nd837 1a 1378 1108\nd851 7 1892 1108\nd858 14 1897 1108\nd86c 10 1900 1108\nd87c 3 1901 1108\nd87f 5 1903 1108\nd884 9 1944 1108\nd88d 28 1948 1108\nd8b5 5 1949 1108\nd8ba 7 1961 1108\nd8c1 4 1964 1108\nd8c5 6 1970 1108\nd8cb 9 1972 1108\nd8d4 28 1976 1108\nd8fc 5 1977 1108\nd901 c 1981 1108\nd90d 5 1987 1108\nd912 5 2019 1108\nd917 5 2020 1108\nd91c 6 2023 1108\nd922 b 2026 1108\nd92d 5 2029 1108\nd932 9 2031 1108\nd93b 4 2033 1108\nd93f 2 2036 1108\nd941 d 2040 1108\nd94e 5 2045 1108\nd953 6 2048 1108\nd959 b 2051 1108\nd964 5 2054 1108\nd969 9 2056 1108\nd972 4 2058 1108\nd976 2 2061 1108\nd978 d 2065 1108\nd985 2 2071 1108\nd987 5 2074 1108\nd98c 6 2077 1108\nd992 a 2080 1108\nd99c 2 2083 1108\nd99e 9 2085 1108\nd9a7 6 2087 1108\nd9ad 17 2089 1108\nd9c4 15 2114 1108\nd9d9 5 2115 1108\nd9de d 2094 1108\nd9eb 2 2099 1108\nd9ed 6 2102 1108\nd9f3 a 2105 1108\nd9fd 2 2108 1108\nd9ff 9 2110 1108\nda08 6 2112 1108\nda0e e 2119 1108\nda1c f 2128 1108\nda2b 7 2129 1108\nda32 c 2130 1108\nda3e c 2136 1108\nda4a 4 2142 1108\nda4e 6 2148 1108\nda54 7 2149 1108\nda5b 2 2150 1108\nda5d 1a 2114 1108\nda77 3 2151 1108\nda7a 10 2152 1108\nda8a 3 2153 1108\nda8d 7 2157 1108\nda94 3 2158 1108\nda97 6 2163 1108\nda9d 11 2165 1108\ndaae 12 2166 1108\ndac0 d 2168 1108\ndacd 3 2170 1108\ndad0 b 2173 1108\ndadb 8 2175 1108\ndae3 1 2176 1108\ndae4 20 2180 1108\ndb04 9 2181 1108\ndb0d 1 2182 1108\ndb0e 5 2185 1108\ndb13 9 1594 1108\ndb1c 9 1596 1108\ndb25 c 1603 1108\ndb31 c 1610 1108\ndb3d 4 1611 1108\ndb41 8 1612 1108\ndb49 11 1614 1108\ndb5a 13 1618 1108\ndb6d 1 1620 1108\ndb6e 9 1621 1108\ndb77 2 1622 1108\ndb79 19 1598 1108\ndb92 5 1625 1108\ndb97 8 1626 1108\ndb9f c 1628 1108\ndbab 6 1629 1108\ndbb1 2 1630 1108\ndbb3 4 1629 1108\ndbb7 8 1631 1108\ndbbf 10 2189 1108\ndbcf a 2201 1108\ndbd9 a 2204 1108\ndbe3 6 2205 1108\ndbe9 6 2207 1108\ndbef 2 2208 1108\ndbf1 4 2210 1108\ndbf5 6 2212 1108\ndbfb 2 2213 1108\ndbfd 4 2215 1108\ndc01 6 2217 1108\ndc07 7 2218 1108\ndc0e b 2224 1108\ndc19 9 2228 1108\ndc22 11 2230 1108\ndc33 11 2234 1108\ndc44 13 2236 1108\ndc57 f 2238 1108\ndc66 a 2263 1108\ndc70 3 2267 1108\ndc73 3 2268 1108\ndc76 3 2269 1108\ndc79 1a 2276 1108\ndc93 7 2278 1108\ndc9a e 2282 1108\ndca8 a 2283 1108\ndcb2 2 2310 1108\ndcb4 4 2279 1108\ndcb8 2 2285 1108\ndcba d 2286 1108\ndcc7 f 2290 1108\ndcd6 11 2292 1108\ndce7 6 2297 1108\ndced 8 2298 1108\ndcf5 4 2299 1108\ndcf9 1 2298 1108\ndcfa 12 1073 1108\ndd0c c 2310 1108\ndd18 c 2314 1108\ndd24 10 2319 1108\ndd34 16 2321 1108\ndd4a 2 2360 1108\ndd4c 9 2361 1108\ndd55 6 2362 1108\ndd5b 2 2344 1108\ndd5d 3 2345 1108\ndd60 2 2346 1108\ndd62 2 2324 1108\ndd64 6 2325 1108\ndd6a 9 2319 1108\ndd73 13 1043 1108\ndd86 17 1121 1108\ndd9d f 1818 1108\nddac 10 2376 1108\nddbc 3a 2377 1108\nFUNC ddf6 1f 0 _initp_misc_cfltcvt_tab\nddf6 2 54 4074\nddf8 8 56 4074\nde00 14 58 4074\nde14 1 60 4074\nFUNC de20 29 4 _ValidateImageBase\nde20 0 44 3159\nde20 b 50 3159\nde2b 2 52 3159\nde2d 1 68 3159\nde2e 5 55 3159\nde33 6 56 3159\nde39 2 58 3159\nde3b d 62 3159\nde48 1 68 3159\nFUNC de50 42 8 _FindPESection\nde50 0 92 3159\nde50 9 99 3159\nde59 19 108 3159\nde72 10 111 3159\nde82 a 108 3159\nde8c 5 123 3159\nde91 1 124 3159\nFUNC dea0 bb 4 _IsNonwritableInCurrentImage\ndea0 33 149 3159\nded3 7 156 3159\ndeda f 164 3159\ndee9 2 166 3159\ndeeb 8 174 3159\ndef3 e 175 3159\ndf01 2 176 3159\ndf03 2 178 3159\ndf05 12 185 3159\ndf17 12 195 3159\ndf29 17 187 3159\ndf40 9 193 3159\ndf49 12 195 3159\nFUNC df5b 19 4 _initp_misc_winsig\ndf5b 0 57 2785\ndf5b 9 58 2785\ndf64 5 59 2785\ndf69 5 60 2785\ndf6e 5 61 2785\ndf73 1 62 2785\nFUNC df74 9b 4 ctrlevent_capture\ndf74 c 89 2785\ndf80 9 94 2785\ndf89 3 95 2785\ndf8c 5 102 2785\ndf91 5 103 2785\ndf96 e 104 2785\ndfa4 7 105 2785\ndfab 2 107 2785\ndfad 5 108 2785\ndfb2 e 109 2785\ndfc0 7 110 2785\ndfc7 1 109 2785\ndfc8 9 113 2785\ndfd1 7 117 2785\ndfd8 c 120 2785\ndfe4 5 124 2785\ndfe9 4 128 2785\ndfed 2 120 2785\ndfef 8 121 2785\ndff7 6 130 2785\ndffd 7 131 2785\ne004 3 138 2785\ne007 8 139 2785\nFUNC e00f 34 4 siglookup\ne00f 0 634 2785\ne00f b 635 2785\ne01a 15 645 2785\ne02f f 649 2785\ne03e 2 653 2785\ne040 2 658 2785\ne042 1 659 2785\nFUNC e043 d 0 __get_sigabrt\ne043 0 676 2785\ne043 c 677 2785\ne04f 1 678 2785\nFUNC e050 9 0 __fpecode\ne050 0 699 2785\ne050 8 700 2785\ne058 1 701 2785\nFUNC e059 9 0 __pxcptinfoptrs\ne059 0 721 2785\ne059 8 722 2785\ne061 1 723 2785\nFUNC e062 23d 8 signal\ne062 c 219 2785\ne06e 4 224 2785\ne072 3 230 2785\ne075 3 244 2785\ne078 12 230 2785\ne08a 2f 244 2785\ne0b9 13 327 2785\ne0cc 7 334 2785\ne0d3 8 335 2785\ne0db a 342 2785\ne0e5 17 346 2785\ne0fc 10 352 2785\ne10c 13 367 2785\ne11f 3 380 2785\ne122 e 382 2785\ne130 3 395 2785\ne133 17 401 2785\ne14a 5 390 2785\ne14f 5 401 2785\ne154 8 246 2785\ne15c 4 247 2785\ne160 12 254 2785\ne172 14 257 2785\ne186 6 259 2785\ne18c 2 261 2785\ne18e f 263 2785\ne19d a 264 2785\ne1a7 18 268 2785\ne1bf f 288 2785\ne1ce 4 289 2785\ne1d2 b 291 2785\ne1dd 2 293 2785\ne1df f 279 2785\ne1ee 4 280 2785\ne1f2 b 282 2785\ne1fd 2 284 2785\ne1ff f 296 2785\ne20e 4 297 2785\ne212 b 299 2785\ne21d 2 301 2785\ne21f f 271 2785\ne22e 4 272 2785\ne232 c 274 2785\ne23e c 305 2785\ne24a 9 309 2785\ne253 4 407 2785\ne257 3 305 2785\ne25a 9 306 2785\ne263 19 410 2785\ne27c 1a 419 2785\ne296 3 417 2785\ne299 6 423 2785\nFUNC e29f 1b0 4 raise\ne29f c 452 2785\ne2ab 5 459 2785\ne2b0 3 460 2785\ne2b3 1f 462 2785\ne2d2 a 488 2785\ne2dc 4 489 2785\ne2e0 8 490 2785\ne2e8 a 465 2785\ne2f2 2 467 2785\ne2f4 11 492 2785\ne305 2 493 2785\ne307 f 462 2785\ne316 1c 500 2785\ne332 a 476 2785\ne33c 2 478 2785\ne33e a 470 2785\ne348 2 472 2785\ne34a a 481 2785\ne354 7 482 2785\ne35b a 502 2785\ne365 2 510 2785\ne367 4 509 2785\ne36b 6 510 2785\ne371 5 515 2785\ne376 7 520 2785\ne37d 5 527 2785\ne382 7 528 2785\ne389 5 530 2785\ne38e f 543 2785\ne39d 6 544 2785\ne3a3 3 545 2785\ne3a6 5 551 2785\ne3ab 6 552 2785\ne3b1 7 553 2785\ne3b8 5 561 2785\ne3bd 1c 568 2785\ne3d9 d 571 2785\ne3e6 5 568 2785\ne3eb 7 574 2785\ne3f2 c 577 2785\ne3fe 5 582 2785\ne403 8 588 2785\ne40b 2 589 2785\ne40d 6 577 2785\ne413 6 578 2785\ne419 9 579 2785\ne422 5 590 2785\ne427 f 597 2785\ne436 6 598 2785\ne43c 5 603 2785\ne441 6 604 2785\ne447 2 607 2785\ne449 6 608 2785\nFUNC e44f a 4 _initp_misc_rand_s\ne44f 0 58 3075\ne44f 9 59 3075\ne458 1 60 3075\nFUNC e459 104 4 rand_s\ne459 3 66 3075\ne45c b 67 3075\ne467 2b 68 3075\ne492 c 71 3075\ne49e d 77 3075\ne4ab 4 78 3075\ne4af 1e 80 3075\ne4cd e 83 3075\ne4db 4 84 3075\ne4df 2f 86 3075\ne50e 9 88 3075\ne517 5 89 3075\ne51c 16 94 3075\ne532 7 103 3075\ne539 9 107 3075\ne542 b 109 3075\ne54d 9 110 3075\ne556 6 112 3075\ne55c 1 113 3075\nFUNC e55d 15a 14 __getlocaleinfo\ne55d 1d 70 3523\ne57a 7 76 3523\ne581 87 109 3523\ne608 13 103 3523\ne61b 5 114 3523\ne620 7 115 3523\ne627 3 141 3523\ne62a 12 142 3523\ne63c 20 106 3523\ne65c 5 108 3523\ne661 7 109 3523\ne668 4 111 3523\ne66c 5 118 3523\ne671 1a 126 3523\ne68b 2 127 3523\ne68d 2 129 3523\ne68f 10 134 3523\ne69f 16 135 3523\ne6b5 2 139 3523\nFUNC e6b7 a 4 _initp_misc_purevirt\ne6b7 0 166 3523\ne6b7 9 167 3523\ne6c0 1 168 3523\nFUNC e6c1 a 4 _initp_misc_initcrit\ne6c1 0 47 3609\ne6c1 9 48 3609\ne6ca 1 49 3609\nFUNC e6cb 10 8 __crtInitCritSecNoSpinCount\ne6cb 0 76 3609\ne6cb a 77 3609\ne6d5 3 78 3609\ne6d8 3 79 3609\nFUNC e6db c5 8 __crtInitCritSecAndSpinCount\ne6db c 109 3609\ne6e7 5 111 3609\ne6ec e 112 3609\ne6fa 4 114 3609\ne6fe 1b 120 3609\ne719 4 121 3609\ne71d 2 129 3609\ne71f b 130 3609\ne72a 4 131 3609\ne72e e 134 3609\ne73c 4 136 3609\ne740 5 149 3609\ne745 c 152 3609\ne751 3 155 3609\ne754 b 161 3609\ne75f 2 162 3609\ne761 1a 163 3609\ne77b 9 170 3609\ne784 8 171 3609\ne78c 4 173 3609\ne790 7 174 3609\ne797 3 176 3609\ne79a 6 177 3609\nFUNC e7a0 5e 4 _isatty\ne7a0 0 37 4912\ne7a0 16 44 4912\ne7b6 2 59 4912\ne7b8 29 45 4912\ne7e1 1 59 4912\ne7e2 1b 58 4912\ne7fd 1 59 4912\nFUNC e7fe 2f 0 CPtoLCID\ne7fe 0 329 4615\ne7fe 14 330 4615\ne812 2 345 4615\ne814 1 346 4615\ne815 5 342 4615\ne81a 1 346 4615\ne81b 5 339 4615\ne820 1 346 4615\ne821 5 336 4615\ne826 1 346 4615\ne827 5 333 4615\ne82c 1 346 4615\nFUNC e82d 55 0 setSBCS\ne82d 4 363 4615\ne831 14 368 4615\ne845 3 371 4615\ne848 3 374 4615\ne84b 3 376 4615\ne84e 8 379 4615\ne856 a 381 4615\ne860 9 382 4615\ne869 b 384 4615\ne874 d 385 4615\ne881 1 386 4615\nFUNC e882 18a 0 setSBUpLow\ne882 1d 402 4615\ne89f f 412 4615\ne8ae d 415 4615\ne8bb c 416 4615\ne8c7 e 420 4615\ne8d5 3 419 4615\ne8d8 28 421 4615\ne900 1d 427 4615\ne91d 23 432 4615\ne940 25 437 4615\ne965 2 442 4615\ne967 a 443 4615\ne971 5 445 4615\ne976 9 446 4615\ne97f 5 448 4615\ne984 5 450 4615\ne989 e 451 4615\ne997 2 453 4615\ne999 8 454 4615\ne9a1 5 442 4615\ne9a6 8 456 4615\ne9ae 2c 472 4615\ne9da 5 466 4615\ne9df 5 468 4615\ne9e4 7 469 4615\ne9eb 2 471 4615\ne9ed 3 472 4615\ne9f0 5 460 4615\ne9f5 17 474 4615\nFUNC ea0c a4 0 __updatetmbcinfo\nea0c c 496 4615\nea18 7 499 4615\nea1f 10 500 4615\nea2f 3 533 4615\nea32 4 536 4615\nea36 8 538 4615\nea3e 2 541 4615\nea40 6 542 4615\nea46 8 501 4615\nea4e 4 503 4615\nea52 e 506 4615\nea60 17 512 4615\nea77 7 517 4615\nea7e 11 524 4615\nea8f 7 525 4615\nea96 11 528 4615\neaa7 9 530 4615\nFUNC eab0 7a 0 getSystemCP\neab0 7 282 4615\neab7 b 284 4615\neac2 b 289 4615\neacd a 291 4615\nead7 14 292 4615\neaeb 5 295 4615\neaf0 a 297 4615\neafa 8 298 4615\neb02 5 302 4615\neb07 12 305 4615\neb19 f 308 4615\neb28 2 309 4615\nFUNC eb2a 1d9 8 _setmbcp_nolock\neb2a 15 686 4615\neb3f b 693 4615\neb4a 9 696 4615\neb53 7 698 4615\neb5a 7 699 4615\neb61 3 703 4615\neb64 2 705 4615\neb66 19 708 4615\neb7f 2a 743 4615\neba9 13 751 4615\nebbc f 756 4615\nebcb 15 761 4615\nebe0 17 764 4615\nebf7 c 766 4615\nec03 f 712 4615\nec12 15 715 4615\nec27 9 720 4615\nec30 8 723 4615\nec38 12 724 4615\nec4a 9 723 4615\nec53 5 720 4615\nec58 12 715 4615\nec6a 20 731 4615\nec8a d 733 4615\nec97 7 736 4615\nec9e 5 737 4615\neca3 6 767 4615\neca9 10 766 4615\necb9 8 771 4615\necc1 7 772 4615\necc8 b 775 4615\necd3 3 778 4615\necd6 2 780 4615\necd8 3 782 4615\necdb 8 785 4615\nece3 2 789 4615\nece5 6 794 4615\neceb 6 797 4615\necf1 3 746 4615\necf4 f 802 4615\nFUNC ed03 3c 0 _getmbcp\ned03 6 819 4615\ned09 a 821 4615\ned13 9 822 4615\ned1c 10 823 4615\ned2c 2 826 4615\ned2e f 825 4615\ned3d 2 826 4615\nFUNC ed3f 19a 4 _setmbcp\ned3f c 574 4615\ned4b 4 575 4615\ned4f a 579 4615\ned59 5 581 4615\ned5e 3 582 4615\ned61 b 585 4615\ned6c 9 587 4615\ned75 d 593 4615\ned82 8 595 4615\ned8a c 597 4615\ned96 3 607 4615\ned99 16 612 4615\nedaf 1a 614 4615\nedc9 7 615 4615\nedd0 3 619 4615\nedd3 9 620 4615\neddc 17 622 4615\nedf3 8 624 4615\nedfb 4 625 4615\nedff 8 630 4615\nee07 8 631 4615\nee0f 8 632 4615\nee17 a 633 4615\nee21 d 634 4615\nee2e 3 633 4615\nee31 c 635 4615\nee3d a 636 4615\nee47 3 635 4615\nee4a c 637 4615\nee56 d 638 4615\nee63 3 637 4615\nee66 1c 640 4615\nee82 7 641 4615\nee89 6 645 4615\nee8f 3 646 4615\nee92 e 648 4615\neea0 9 650 4615\neea9 2 653 4615\neeab 5 654 4615\neeb0 8 660 4615\neeb8 7 661 4615\neebf b 662 4615\neeca 2 668 4615\neecc 4 673 4615\need0 3 682 4615\need3 6 683 4615\nFUNC eed9 1e 0 __initmbctable\need9 0 843 4615\need9 9 853 4615\neee2 8 854 4615\neeea a 855 4615\neef4 2 860 4615\neef6 1 861 4615\nFUNC eef7 6 0 ___setlc_active_func\neef7 0 90 2995\neef7 5 91 2995\neefc 1 92 2995\nFUNC eefd 6 0 ___unguarded_readlc_active_add_func\neefd 0 104 2995\neefd 5 105 2995\nef02 1 106 2995\nFUNC ef03 140 4 __freetlocinfo\nef03 3 144 2995\nef06 26 152 2995\nef2c e 155 2995\nef3a 6 157 2995\nef40 d 158 2995\nef4d e 162 2995\nef5b 6 164 2995\nef61 d 165 2995\nef6e b 168 2995\nef79 d 169 2995\nef86 e 176 2995\nef94 11 178 2995\nefa5 13 179 2995\nefb8 e 180 2995\nefc6 e 181 2995\nefd4 17 188 2995\nefeb 6 190 2995\neff1 9 191 2995\neffa 6 194 2995\nf000 13 197 2995\nf013 7 199 2995\nf01a 10 205 2995\nf02a d 207 2995\nf037 b 214 2995\nf042 1 215 2995\nFUNC f043 86 4 __addlocaleref\nf043 3 225 2995\nf046 e 227 2995\nf054 a 228 2995\nf05e 3 229 2995\nf061 a 231 2995\nf06b 3 232 2995\nf06e a 234 2995\nf078 3 235 2995\nf07b a 237 2995\nf085 3 238 2995\nf088 6 240 2995\nf08e f 242 2995\nf09d 3 243 2995\nf0a0 d 245 2995\nf0ad 9 246 2995\nf0b6 12 248 2995\nf0c8 1 249 2995\nFUNC f0c9 8c 4 __removelocaleref\nf0c9 1 259 2995\nf0ca b 261 2995\nf0d5 9 263 2995\nf0de a 265 2995\nf0e8 3 266 2995\nf0eb a 268 2995\nf0f5 3 269 2995\nf0f8 a 271 2995\nf102 3 272 2995\nf105 a 274 2995\nf10f 3 275 2995\nf112 6 277 2995\nf118 f 279 2995\nf127 3 280 2995\nf12a d 282 2995\nf137 9 283 2995\nf140 11 285 2995\nf151 3 287 2995\nf154 1 288 2995\nFUNC f155 24 0 _copytlocinfo_nolock\nf155 3 302 2995\nf158 d 303 2995\nf165 7 304 2995\nf16c 3 305 2995\nf16f 9 306 2995\nf178 1 308 2995\nFUNC f179 3e 0 _updatetlocinfoEx_nolock\nf179 0 321 2995\nf179 9 324 2995\nf182 2 326 2995\nf184 4 327 2995\nf188 8 334 2995\nf190 5 339 2995\nf195 6 341 2995\nf19b e 350 2995\nf1a9 7 351 2995\nf1b0 3 355 2995\nf1b3 1 356 2995\nf1b4 2 325 2995\nf1b6 1 356 2995\nFUNC f1b7 76 0 __updatetlocinfo\nf1b7 c 382 2995\nf1c3 7 384 2995\nf1ca 10 386 2995\nf1da 8 397 2995\nf1e2 4 399 2995\nf1e6 8 401 2995\nf1ee 2 404 2995\nf1f0 6 405 2995\nf1f6 8 387 2995\nf1fe 4 388 2995\nf202 11 390 2995\nf213 e 392 2995\nf221 8 394 2995\nf229 4 395 2995\nFUNC f22d 66 4 _configthreadlocale\nf22d 2 420 2995\nf22f 5 434 2995\nf234 10 435 2995\nf244 19 437 2995\nf25d 1d 456 2995\nf27a 3 444 2995\nf27d 2 445 2995\nf27f 6 440 2995\nf285 2 441 2995\nf287 7 452 2995\nf28e 4 460 2995\nf292 1 462 2995\nFUNC f293 53 0 sync_legacy_variables_lk\nf293 0 489 2995\nf293 e 490 2995\nf2a1 9 491 2995\nf2aa c 492 2995\nf2b6 c 493 2995\nf2c2 c 494 2995\nf2ce c 495 2995\nf2da b 496 2995\nf2e5 1 497 2995\nFUNC f2e6 96 4 _free_locale\nf2e6 c 517 2995\nf2f2 9 518 2995\nf2fb 1c 522 2995\nf317 7 524 2995\nf31e 4 526 2995\nf322 8 534 2995\nf32a 3 535 2995\nf32d 8 537 2995\nf335 11 540 2995\nf346 7 541 2995\nf34d c 543 2995\nf359 7 552 2995\nf360 3 553 2995\nf363 7 554 2995\nf36a 6 556 2995\nf370 3 543 2995\nf373 9 545 2995\nFUNC f37c 5 4 __free_locale\nf37c 0 562 2995\nf37c 5 563 2995\nFUNC f381 88 0 _get_current_locale\nf381 c 687 2995\nf38d 7 689 2995\nf394 14 691 2995\nf3a8 b 693 2995\nf3b3 4 694 2995\nf3b7 5 697 2995\nf3bc 5 698 2995\nf3c1 5 706 2995\nf3c6 6 707 2995\nf3cc 8 708 2995\nf3d4 4 709 2995\nf3d8 8 710 2995\nf3e0 c 712 2995\nf3ec 9 715 2995\nf3f5 2 717 2995\nf3f7 6 718 2995\nf3fd 3 712 2995\nf400 9 713 2995\nFUNC f409 5 0 __get_current_locale\nf409 0 722 2995\nf409 5 723 2995\nFUNC f40e 3 4 __init_dummy\nf40e 0 1283 2995\nf40e 2 1284 2995\nf410 1 1285 2995\nFUNC f411 3e c _strcats\nf411 2 1288 2995\nf413 f 1294 2995\nf422 26 1296 2995\nf448 6 1294 2995\nf44e 1 1299 2995\nFUNC f44f 129 8 __lc_strtolc\nf44f 6 1302 2995\nf455 11 1307 2995\nf466 c 1309 2995\nf472 7 1310 2995\nf479 b 1313 2995\nf484 25 1315 2995\nf4a9 6 1317 2995\nf4af 2 1318 2995\nf4b1 15 1323 2995\nf4c6 1d 1328 2995\nf4e3 9 1329 2995\nf4ec 10 1331 2995\nf4fc c 1332 2995\nf508 14 1334 2995\nf51c 28 1335 2995\nf544 9 1340 2995\nf54d b 1348 2995\nf558 18 1350 2995\nf570 6 1338 2995\nf576 2 1353 2995\nFUNC f578 6b c __lc_lctostr\nf578 5 1356 2995\nf57d 25 1357 2995\nf5a2 7 1358 2995\nf5a9 16 1359 2995\nf5bf c 1360 2995\nf5cb 16 1361 2995\nf5e1 2 1362 2995\nFUNC f5e3 171 0 _setlocale_get_all\nf5e3 4 1124 2995\nf5e7 3 1126 2995\nf5ea 1d 1134 2995\nf607 3 1137 2995\nf60a 3 1139 2995\nf60d 2 1140 2995\nf60f 2f 1143 2995\nf63e 26 1146 2995\nf664 10 1147 2995\nf674 5 1148 2995\nf679 4 1141 2995\nf67d 2f 1143 2995\nf6ac a 1144 2995\nf6b6 8 1152 2995\nf6be 14 1154 2995\nf6d2 9 1156 2995\nf6db e 1159 2995\nf6e9 9 1161 2995\nf6f2 7 1165 2995\nf6f9 7 1166 2995\nf700 9 1168 2995\nf709 15 1170 2995\nf71e 9 1172 2995\nf727 e 1175 2995\nf735 9 1177 2995\nf73e 12 1183 2995\nf750 4 1187 2995\nFUNC f754 1d4 18 _expandlocale\nf754 15 1198 2995\nf769 41 1230 2995\nf7aa 14 1211 2995\nf7be b 1216 2995\nf7c9 26 1219 2995\nf7ef 4 1220 2995\nf7f3 3 1222 2995\nf7f6 4 1223 2995\nf7fa 4 1224 2995\nf7fe 7 1226 2995\nf805 2 1228 2995\nf807 8 1230 2995\nf80f 6 1234 2995\nf815 2f 1236 2995\nf844 4 1241 2995\nf848 e 1243 2995\nf856 6 1244 2995\nf85c 10 1246 2995\nf86c 6 1247 2995\nf872 9 1251 2995\nf87b 10 1253 2995\nf88b a 1255 2995\nf895 2 1260 2995\nf897 8 1263 2995\nf89f 26 1267 2995\nf8c5 5 1271 2995\nf8ca e 1272 2995\nf8d8 5 1273 2995\nf8dd 10 1274 2995\nf8ed 22 1276 2995\nf90f 5 1277 2995\nf914 2 1212 2995\nf916 12 1278 2995\nFUNC f928 2f6 4 _setlocale_set_cat\nf928 19 980 2995\nf941 5 993 2995\nf946 2f 998 2995\nf975 7 1000 2995\nf97c 19 1002 2995\nf995 6 1004 2995\nf99b c 1007 2995\nf9a7 16 1008 2995\nf9bd 2 1010 2995\nf9bf 3 1013 2995\nf9c2 d 1014 2995\nf9cf 2c 1015 2995\nf9fb 3 1016 2995\nf9fe 39 1019 2995\nfa37 6 1020 2995\nfa3d 15 1021 2995\nfa52 17 1022 2995\nfa69 a 1029 2995\nfa73 6 1031 2995\nfa79 18 1037 2995\nfa91 7 1039 2995\nfa98 8 1053 2995\nfaa0 14 1054 2995\nfab4 18 1055 2995\nfacc 2 1039 2995\nface a 1044 2995\nfad8 d 1046 2995\nfae5 b 1047 2995\nfaf0 9 1058 2995\nfaf9 26 1066 2995\nfb1f 2 1069 2995\nfb21 10 1071 2995\nfb31 22 1072 2995\nfb53 2 1081 2995\nfb55 4 1082 2995\nfb59 5 1083 2995\nfb5e 9 1085 2995\nfb67 6 1088 2995\nfb6d 9 1089 2995\nfb76 12 1091 2995\nfb88 6 1094 2995\nfb8e e 1095 2995\nfb9c f 1096 2995\nfbab 9 1097 2995\nfbb4 5 1099 2995\nfbb9 24 1106 2995\nfbdd 7 1109 2995\nfbe4 8 1110 2995\nfbec 6 1111 2995\nfbf2 18 1116 2995\nfc0a 3 1118 2995\nfc0d 11 1119 2995\nFUNC fc1e 1ce 4 _setlocale_nolock\nfc1e 1a 873 2995\nfc38 7 877 2995\nfc3f 5 904 2995\nfc44 17 880 2995\nfc5b 5 882 2995\nfc60 12 888 2995\nfc72 1d 890 2995\nfc8f 2 894 2995\nfc91 d 898 2995\nfc9e 1e 900 2995\nfcbc 11 904 2995\nfccd 1d 907 2995\nfcea e 904 2995\nfcf8 1b 913 2995\nfd13 6 916 2995\nfd19 24 918 2995\nfd3d 18 922 2995\nfd55 3 923 2995\nfd58 7 925 2995\nfd5f 1 926 2995\nfd60 9 928 2995\nfd69 c 930 2995\nfd75 4 901 2995\nfd79 19 935 2995\nfd92 3 937 2995\nfd95 4 939 2995\nfd99 11 941 2995\nfdaa c 943 2995\nfdb6 2 947 2995\nfdb8 3 949 2995\nfdbb 2 952 2995\nfdbd 3 953 2995\nfdc0 9 937 2995\nfdc9 5 956 2995\nfdce 2 961 2995\nfdd0 3 962 2995\nfdd3 2 965 2995\nfdd5 5 966 2995\nfdda 12 972 2995\nFUNC fdec f3 8 _create_locale\nfdec 0 605 2995\nfdec 10 609 2995\nfdfc 13 612 2995\nfe0f b 614 2995\nfe1a 4 610 2995\nfe1e c 658 2995\nfe2a 8 617 2995\nfe32 7 619 2995\nfe39 2 621 2995\nfe3b 14 623 2995\nfe4f 7 625 2995\nfe56 7 626 2995\nfe5d 2 628 2995\nfe5f c 630 2995\nfe6b 14 632 2995\nfe7f 7 634 2995\nfe86 7 635 2995\nfe8d 9 637 2995\nfe96 2 640 2995\nfe98 13 642 2995\nfeab 8 644 2995\nfeb3 7 645 2995\nfeba 7 646 2995\nfec1 9 647 2995\nfeca 2 648 2995\nfecc 2 650 2995\nfece 5 652 2995\nfed3 5 653 2995\nfed8 7 657 2995\nFUNC fedf 5 8 __create_locale\nfedf 0 665 2995\nfedf 5 666 2995\nFUNC fee4 170 8 setlocale\nfee4 c 791 2995\nfef0 5 792 2995\nfef5 25 797 2995\nff1a a 799 2995\nff24 5 801 2995\nff29 4 806 2995\nff2d 3 807 2995\nff30 1b 808 2995\nff4b 8 818 2995\nff53 7 819 2995\nff5a a 820 2995\nff64 8 822 2995\nff6c 19 826 2995\nff85 18 834 2995\nff9d a 836 2995\nffa7 8 839 2995\nffaf 7 840 2995\nffb6 a 841 2995\nffc0 7 842 2995\nffc7 f 846 2995\nffd6 c 847 2995\nffe2 18 849 2995\nfffa 5 850 2995\nffff b 852 2995\n1000a 8 822 2995\n10012 9 823 2995\n1001b 3 852 2995\n1001e 9 853 2995\n10027 2 855 2995\n10029 6 856 2995\n1002f 8 857 2995\n10037 c 860 2995\n10043 3 865 2995\n10046 6 866 2995\n1004c 3 860 2995\n1004f 5 862 2995\nFUNC 10054 15f 14 _wctomb_s_l\n10054 8 56 6128\n1005c 11 57 6128\n1006d 7 60 6128\n10074 2 62 6128\n10076 4 64 6128\n1007a 7 67 6128\n10081 3 69 6128\n10084 23 74 6128\n100a7 b 77 6128\n100b2 c 79 6128\n100be a 81 6128\n100c8 8 83 6128\n100d0 b 85 6128\n100db b 125 6128\n100e6 13 126 6128\n100f9 5 136 6128\n100fe 4 91 6128\n10102 2c 93 6128\n1012e 2 94 6128\n10130 7 96 6128\n10137 6 98 6128\n1013d 15 100 6128\n10152 27 115 6128\n10179 7 129 6128\n10180 2 131 6128\n10182 2 133 6128\n10184 f 117 6128\n10193 10 119 6128\n101a3 b 121 6128\n101ae 5 123 6128\nFUNC 101b3 1b 10 wctomb_s\n101b3 0 144 6128\n101b3 1a 145 6128\n101cd 1 146 6128\nFUNC 101ce 4f c _wctomb_l\n101ce 6 178 6128\n101d4 f 181 6128\n101e3 1f 183 6128\n10202 19 184 6128\n1021b 2 185 6128\nFUNC 1021d 30 8 wctomb\n1021d 4 191 6128\n10221 4 192 6128\n10225 1a 195 6128\n1023f 7 196 6128\n10246 2 197 6128\n10248 3 196 6128\n1024b 2 197 6128\nFUNC 1024d 36 8 _isleadbyte_l\n1024d 6 55 6490\n10253 b 56 6490\n1025e 23 57 6490\n10281 2 58 6490\nFUNC 10283 e 4 isleadbyte\n10283 0 63 6490\n10283 d 64 6490\n10290 1 65 6490\nFUNC 10291 16 8 _iswalpha_l\n10291 0 71 6490\n10291 15 72 6490\n102a6 1 73 6490\nFUNC 102a7 11 4 iswalpha\n102a7 0 78 6490\n102a7 10 79 6490\n102b7 1 80 6490\nFUNC 102b8 13 8 _iswupper_l\n102b8 0 86 6490\n102b8 12 87 6490\n102ca 1 88 6490\nFUNC 102cb e 4 iswupper\n102cb 0 93 6490\n102cb d 94 6490\n102d8 1 95 6490\nFUNC 102d9 13 8 _iswlower_l\n102d9 0 101 6490\n102d9 12 102 6490\n102eb 1 103 6490\nFUNC 102ec e 4 iswlower\n102ec 0 108 6490\n102ec d 109 6490\n102f9 1 110 6490\nFUNC 102fa 13 8 _iswdigit_l\n102fa 0 116 6490\n102fa 12 117 6490\n1030c 1 118 6490\nFUNC 1030d e 4 iswdigit\n1030d 0 123 6490\n1030d d 124 6490\n1031a 1 125 6490\nFUNC 1031b 16 8 _iswxdigit_l\n1031b 0 131 6490\n1031b 15 132 6490\n10330 1 133 6490\nFUNC 10331 11 4 iswxdigit\n10331 0 138 6490\n10331 10 139 6490\n10341 1 140 6490\nFUNC 10342 13 8 _iswspace_l\n10342 0 146 6490\n10342 12 147 6490\n10354 1 148 6490\nFUNC 10355 e 4 iswspace\n10355 0 153 6490\n10355 d 154 6490\n10362 1 155 6490\nFUNC 10363 13 8 _iswpunct_l\n10363 0 161 6490\n10363 12 162 6490\n10375 1 163 6490\nFUNC 10376 e 4 iswpunct\n10376 0 168 6490\n10376 d 169 6490\n10383 1 170 6490\nFUNC 10384 16 8 _iswalnum_l\n10384 0 176 6490\n10384 15 177 6490\n10399 1 178 6490\nFUNC 1039a 11 4 iswalnum\n1039a 0 183 6490\n1039a 10 184 6490\n103aa 1 185 6490\nFUNC 103ab 16 8 _iswprint_l\n103ab 0 191 6490\n103ab 15 192 6490\n103c0 1 193 6490\nFUNC 103c1 11 4 iswprint\n103c1 0 198 6490\n103c1 10 199 6490\n103d1 1 200 6490\nFUNC 103d2 16 8 _iswgraph_l\n103d2 0 206 6490\n103d2 15 207 6490\n103e7 1 208 6490\nFUNC 103e8 11 4 iswgraph\n103e8 0 213 6490\n103e8 10 214 6490\n103f8 1 215 6490\nFUNC 103f9 13 8 _iswcntrl_l\n103f9 0 221 6490\n103f9 12 222 6490\n1040b 1 223 6490\nFUNC 1040c e 4 iswcntrl\n1040c 0 228 6490\n1040c d 229 6490\n10419 1 230 6490\nFUNC 1041a c 4 iswascii\n1041a 0 235 6490\n1041a b 236 6490\n10425 1 237 6490\nFUNC 10426 26 8 _iswcsym_l\n10426 0 243 6490\n10426 21 244 6490\n10447 1 245 6490\n10448 3 244 6490\n1044b 1 245 6490\nFUNC 1044c 21 4 __iswcsym\n1044c 0 250 6490\n1044c 1c 251 6490\n10468 1 252 6490\n10469 3 251 6490\n1046c 1 252 6490\nFUNC 1046d 26 8 _iswcsymf_l\n1046d 0 258 6490\n1046d 21 259 6490\n1048e 1 260 6490\n1048f 3 259 6490\n10492 1 260 6490\nFUNC 10493 21 4 __iswcsymf\n10493 0 265 6490\n10493 1c 266 6490\n104af 1 267 6490\n104b0 3 266 6490\n104b3 1 267 6490\nFUNC 104c0 95 0 _aulldvrm\n104c0 0 45 5113\n104c0 1 47 5113\n104c1 4 79 5113\n104c5 2 80 5113\n104c7 2 81 5113\n104c9 4 82 5113\n104cd 4 83 5113\n104d1 2 84 5113\n104d3 2 85 5113\n104d5 2 86 5113\n104d7 4 87 5113\n104db 2 88 5113\n104dd 2 89 5113\n104df 2 94 5113\n104e1 4 95 5113\n104e5 2 96 5113\n104e7 2 97 5113\n104e9 4 98 5113\n104ed 2 99 5113\n104ef 2 100 5113\n104f1 2 107 5113\n104f3 4 108 5113\n104f7 4 109 5113\n104fb 4 110 5113\n104ff 2 112 5113\n10501 2 113 5113\n10503 2 114 5113\n10505 2 115 5113\n10507 2 116 5113\n10509 2 117 5113\n1050b 2 118 5113\n1050d 2 119 5113\n1050f 4 128 5113\n10513 2 129 5113\n10515 4 130 5113\n10519 2 131 5113\n1051b 2 132 5113\n1051d 2 133 5113\n1051f 4 141 5113\n10523 2 142 5113\n10525 2 143 5113\n10527 4 144 5113\n1052b 2 145 5113\n1052d 1 147 5113\n1052e 4 148 5113\n10532 4 149 5113\n10536 2 151 5113\n10538 4 160 5113\n1053c 4 161 5113\n10540 2 162 5113\n10542 2 163 5113\n10544 3 164 5113\n10547 2 169 5113\n10549 2 170 5113\n1054b 2 171 5113\n1054d 2 172 5113\n1054f 2 173 5113\n10551 1 179 5113\n10552 3 181 5113\nFUNC 10558 90 0 _local_unwind4\nFUNC 105e8 46 0 _unwind_handler4\nFUNC 1062e 1c 4 _seh_longjmp_unwind4\nFUNC 1064a 17 0 _EH4_CallFilterFunc\nFUNC 10661 19 0 _EH4_TransferToHandler\nFUNC 1067a 1a 0 _EH4_GlobalUnwind\nFUNC 10694 17 8 _EH4_LocalUnwind\nFUNC 106ab 33 0 write_char\n106ab 0 2433 1218\n106ab a 2434 1218\n106b5 2 2437 1218\n106b7 21 2442 1218\n106d8 2 2444 1218\n106da 1 2447 1218\n106db 2 2446 1218\n106dd 1 2447 1218\nFUNC 106de 24 c write_multi_char\n106de 6 2498 1218\n106e4 2 2501 1218\n106e6 e 2500 1218\n106f4 5 2501 1218\n106f9 7 2499 1218\n10700 2 2504 1218\nFUNC 10702 4a 4 write_string\n10702 0 2563 1218\n10702 12 2564 1218\n10714 6 2566 1218\n1071a 2 2567 1218\n1071c e 2570 1218\n1072a 5 2571 1218\n1072f a 2573 1218\n10739 9 2574 1218\n10742 9 2569 1218\n1074b 1 2579 1218\nFUNC 1074c 9b0 10 _output_s_l\n1074c 1b 975 1218\n10767 45 1036 1218\n107ac 2d 1031 1218\n107d9 b1 1033 1218\n1088a 8 1036 1218\n10892 28 1073 1218\n108ba 17 1078 1218\n108d1 e 1079 1218\n108df 11 1124 1218\n108f0 12 1131 1218\n10902 2 1171 1218\n10904 13 1173 1218\n10917 3 1174 1218\n1091a 5 1175 1218\n1091f 1e 1179 1218\n1093d 3 1193 1218\n10940 5 1194 1218\n10945 4 1181 1218\n10949 5 1182 1218\n1094e 4 1184 1218\n10952 5 1185 1218\n10957 7 1190 1218\n1095e 5 1191 1218\n10963 4 1187 1218\n10967 5 1196 1218\n1096c 5 1200 1218\n10971 9 1206 1218\n1097a b 1233 1218\n10985 4 1235 1218\n10989 3 1236 1218\n1098c 5 1239 1218\n10991 10 1241 1218\n109a1 5 1243 1218\n109a6 4 1248 1218\n109aa 5 1249 1218\n109af 5 1253 1218\n109b4 9 1259 1218\n109bd b 1284 1218\n109c8 4 1285 1218\n109cc 5 1287 1218\n109d1 10 1289 1218\n109e1 5 1291 1218\n109e6 18 1295 1218\n109fe 7 1362 1218\n10a05 5 1363 1218\n10a0a 5 1301 1218\n10a0f 1 1303 1218\n10a10 a 1304 1218\n10a1a 5 1306 1218\n10a1f 4 1308 1218\n10a23 5 1310 1218\n10a28 4 1358 1218\n10a2c 5 1359 1218\n10a31 c 1322 1218\n10a3d 2 1324 1218\n10a3f f 1325 1218\n10a4e a 1327 1218\n10a58 2 1329 1218\n10a5a a 1330 1218\n10a64 5 1332 1218\n10a69 30 1337 1218\n10a99 4 1352 1218\n10a9d 4 1154 1218\n10aa1 10 1158 1218\n10ab1 11 1160 1218\n10ac2 3 1161 1218\n10ac5 b 1163 1218\n10ad0 b 1166 1218\n10adb 5 1167 1218\n10ae0 32 1378 1218\n10b12 d 1716 1218\n10b1f 4 1724 1218\n10b23 18 1749 1218\n10b3b c 1750 1218\n10b47 8 1381 1218\n10b4f 9 1385 1218\n10b58 8 1561 1218\n10b60 7 1562 1218\n10b67 d 1584 1218\n10b74 3 1589 1218\n10b77 15 1635 1218\n10b8c 4 1636 1218\n10b90 8 1637 1218\n10b98 f 1639 1218\n10ba7 1d 1378 1218\n10bc4 12 1448 1218\n10bd6 16 1467 1218\n10bec 4 1470 1218\n10bf0 7 1471 1218\n10bf7 2 1472 1218\n10bf9 6 1499 1218\n10bff 7 1500 1218\n10c06 6 1503 1218\n10c0c 5 1506 1218\n10c11 5 1523 1218\n10c16 e 1541 1218\n10c24 6 1546 1218\n10c2a d 1548 1218\n10c37 7 1549 1218\n10c3e 5 1550 1218\n10c43 4 1551 1218\n10c47 5 1553 1218\n10c4c 8 1543 1218\n10c54 7 1544 1218\n10c5b 5 1557 1218\n10c60 34 1378 1218\n10c94 9 1908 1218\n10c9d 9 1910 1218\n10ca6 8 1668 1218\n10cae d 1688 1218\n10cbb 6 1702 1218\n10cc1 7 1703 1218\n10cc8 2 1704 1218\n10cca 5 1706 1218\n10ccf 7 1708 1218\n10cd6 5 1710 1218\n10cdb 4 1864 1218\n10cdf 7 1869 1218\n10ce6 c 1933 1218\n10cf2 8 1939 1218\n10cfa 5 1958 1218\n10cff 7 1751 1218\n10d06 9 1752 1218\n10d0f 5 1753 1218\n10d14 3 1754 1218\n10d17 9 1756 1218\n10d20 f 1759 1218\n10d2f 2 1760 1218\n10d31 15 1765 1218\n10d46 8 1767 1218\n10d4e e 1809 1218\n10d5c 27 1828 1218\n10d83 14 1838 1218\n10d97 15 1840 1218\n10dac a 1844 1218\n10db6 15 1846 1218\n10dcb 5 1852 1218\n10dd0 7 1853 1218\n10dd7 4 1854 1218\n10ddb 1 1857 1218\n10ddc 5 1859 1218\n10de1 3 1877 1218\n10de4 3 1887 1218\n10de7 2 1888 1218\n10de9 1a 1378 1218\n10e03 7 1892 1218\n10e0a 11 1897 1218\n10e1b c 1900 1218\n10e27 7 1901 1218\n10e2e 5 1903 1218\n10e33 5 1961 1218\n10e38 6 1987 1218\n10e3e 14 2026 1218\n10e52 2 2045 1218\n10e54 5 2051 1218\n10e59 2 2071 1218\n10e5b 3 2074 1218\n10e5e 6 2080 1218\n10e64 2 2099 1218\n10e66 5 2105 1218\n10e6b f 2128 1218\n10e7a 7 2129 1218\n10e81 7 2130 1218\n10e88 c 2136 1218\n10e94 2 2142 1218\n10e96 6 2148 1218\n10e9c 7 2149 1218\n10ea3 2 2150 1218\n10ea5 4 2151 1218\n10ea9 a 2152 1218\n10eb3 3 2153 1218\n10eb6 6 2157 1218\n10ebc 3 2158 1218\n10ebf 6 2163 1218\n10ec5 10 2165 1218\n10ed5 10 2166 1218\n10ee5 c 2168 1218\n10ef1 3 2170 1218\n10ef4 3 2172 1218\n10ef7 2 2173 1218\n10ef9 8 2175 1218\n10f01 1 2176 1218\n10f02 19 2180 1218\n10f1b 9 2181 1218\n10f24 1 2182 1218\n10f25 2 2185 1218\n10f27 7 1640 1218\n10f2e 2 1641 1218\n10f30 4 1640 1218\n10f34 5 1642 1218\n10f39 2 1644 1218\n10f3b 4 1645 1218\n10f3f 8 1646 1218\n10f47 5 1647 1218\n10f4c 6 1648 1218\n10f52 1 1649 1218\n10f53 4 1648 1218\n10f57 6 1650 1218\n10f5d a 2201 1218\n10f67 7 2204 1218\n10f6e 6 2205 1218\n10f74 4 2207 1218\n10f78 2 2208 1218\n10f7a 4 2210 1218\n10f7e 4 2212 1218\n10f82 2 2213 1218\n10f84 4 2215 1218\n10f88 4 2217 1218\n10f8c 7 2218 1218\n10f93 9 2224 1218\n10f9c 6 2228 1218\n10fa2 11 2230 1218\n10fb3 11 2234 1218\n10fc4 d 2236 1218\n10fd1 f 2238 1218\n10fe0 d 2243 1218\n10fed 3 2249 1218\n10ff0 3 2250 1218\n10ff3 1e 2252 1218\n11011 9 2253 1218\n1101a 18 2257 1218\n11032 2 1690 1218\n11034 4 2254 1218\n11038 2 2259 1218\n1103a d 2260 1218\n11047 c 2290 1218\n11053 f 2292 1218\n11062 6 2297 1218\n11068 8 2298 1218\n11070 1b 2299 1218\n1108b 17 1125 1218\n110a2 2 1690 1218\n110a4 f 2310 1218\n110b3 10 2376 1218\n110c3 39 2377 1218\nFUNC 110fc 129 10 _validate_param_reuseA\n110fc 3 606 1271\n110ff 1c 610 1271\n1111b f 617 1271\n1112a 11 618 1271\n1113b 10 620 1271\n1114b 36 629 1271\n11181 46 632 1271\n111c7 2 633 1271\n111c9 17 639 1271\n111e0 c 645 1271\n111ec 2c 626 1271\n11218 b 614 1271\n11223 2 646 1271\nFUNC 11225 33 0 write_char\n11225 0 2433 1271\n11225 a 2434 1271\n1122f 2 2437 1271\n11231 21 2442 1271\n11252 2 2444 1271\n11254 1 2447 1271\n11255 2 2446 1271\n11257 1 2447 1271\nFUNC 11258 24 c write_multi_char\n11258 6 2498 1271\n1125e 2 2501 1271\n11260 e 2500 1271\n1126e 5 2501 1271\n11273 7 2499 1271\n1127a 2 2504 1271\nFUNC 1127c 4a 4 write_string\n1127c 0 2563 1271\n1127c 12 2564 1271\n1128e 6 2566 1271\n11294 2 2567 1271\n11296 e 2570 1271\n112a4 5 2571 1271\n112a9 a 2573 1271\n112b3 9 2574 1271\n112bc 9 2569 1271\n112c5 1 2579 1271\nFUNC 112c6 10 4 get_crtdouble_arg\n112c6 0 2684 1271\n112c6 f 2685 1271\n112d5 1 2686 1271\nFUNC 112d6 f88 10 _output_p_l\n112d6 1b 975 1271\n112f1 15 986 1271\n11306 b 1007 1271\n11311 2b 2172 1271\n1133c 2c 1031 1271\n11368 9b 1033 1271\n11403 8 1036 1271\n1140b 3 1038 1271\n1140e 3 1041 1271\n11411 3 1043 1271\n11414 11 1046 1271\n11425 7 1061 1271\n1142c 4 1062 1271\n11430 7 1069 1271\n11437 32 1073 1271\n11469 19 1078 1271\n11482 e 1079 1271\n11490 1a 1082 1271\n114aa 6 1084 1271\n114b0 1b 1087 1271\n114cb 5 1089 1271\n114d0 15 1091 1271\n114e5 3 1093 1271\n114e8 2 1095 1271\n114ea 6 1097 1271\n114f0 5 1101 1271\n114f5 c 1103 1271\n11501 7 1104 1271\n11508 e 1106 1271\n11516 1a 1109 1271\n11530 8 1112 1271\n11538 f 1131 1271\n11547 9 1120 1271\n11550 b 1131 1271\n1155b 21 1137 1271\n1157c 5 1145 1271\n11581 16 1173 1271\n11597 3 1174 1271\n1159a 5 1175 1271\n1159f 1f 1179 1271\n115be 7 1193 1271\n115c5 5 1194 1271\n115ca 7 1181 1271\n115d1 5 1182 1271\n115d6 6 1184 1271\n115dc 5 1185 1271\n115e1 a 1190 1271\n115eb 5 1191 1271\n115f0 7 1187 1271\n115f7 5 1196 1271\n115fc 9 1200 1271\n11605 5 1203 1271\n1160a a 1206 1271\n11614 2 1209 1271\n11616 c 1211 1271\n11622 7 1212 1271\n11629 b 1214 1271\n11634 1b 1216 1271\n1164f 8 1219 1271\n11657 12 1221 1271\n11669 9 1274 1271\n11672 5 1275 1271\n11677 c 1228 1271\n11683 b 1233 1271\n1168e 7 1235 1271\n11695 3 1236 1271\n11698 5 1239 1271\n1169d 10 1241 1271\n116ad 5 1243 1271\n116b2 3 1248 1271\n116b5 5 1249 1271\n116ba 5 1253 1271\n116bf 5 1256 1271\n116c4 a 1259 1271\n116ce 2 1262 1271\n116d0 c 1264 1271\n116dc 7 1265 1271\n116e3 f 1267 1271\n116f2 c 1280 1271\n116fe b 1284 1271\n11709 4 1285 1271\n1170d 5 1287 1271\n11712 1c 1274 1271\n1172e 10 1289 1271\n1173e 5 1291 1271\n11743 18 1295 1271\n1175b a 1362 1271\n11765 5 1363 1271\n1176a 5 1301 1271\n1176f 1 1303 1271\n11770 d 1304 1271\n1177d 5 1306 1271\n11782 7 1308 1271\n11789 5 1310 1271\n1178e 7 1358 1271\n11795 5 1359 1271\n1179a c 1322 1271\n117a6 2 1324 1271\n117a8 12 1325 1271\n117ba a 1327 1271\n117c4 2 1329 1271\n117c6 d 1330 1271\n117d3 5 1332 1271\n117d8 18 1337 1271\n117f0 3 1352 1271\n117f3 13 1158 1271\n11806 11 1160 1271\n11817 8 1161 1271\n1181f 8 1163 1271\n11827 b 1166 1271\n11832 5 1167 1271\n11837 a 1342 1271\n11841 5 1366 1271\n11846 39 1378 1271\n1187f 9 1716 1271\n11888 7 1724 1271\n1188f 12 1726 1271\n118a1 a 1728 1271\n118ab 27 1739 1271\n118d2 b 1381 1271\n118dd c 1385 1271\n118e9 b 1561 1271\n118f4 a 1562 1271\n118fe d 1584 1271\n1190b 9 1586 1271\n11914 a 1589 1271\n1191e 5 1592 1271\n11923 25 1378 1271\n11948 b 1442 1271\n11953 5 1445 1271\n11958 b 1448 1271\n11963 2 1451 1271\n11965 a 1453 1271\n1196f 27 1457 1271\n11996 5 1458 1271\n1199b a 1462 1271\n119a5 19 1467 1271\n119be 4 1470 1271\n119c2 3 1471 1271\n119c5 2 1472 1271\n119c7 5 1477 1271\n119cc b 1480 1271\n119d7 2 1483 1271\n119d9 a 1485 1271\n119e3 f 1489 1271\n119f2 a 1494 1271\n119fc 6 1499 1271\n11a02 3 1500 1271\n11a05 9 1503 1271\n11a0e 5 1506 1271\n11a13 5 1520 1271\n11a18 a 1523 1271\n11a22 2 1526 1271\n11a24 a 1528 1271\n11a2e 9 1532 1271\n11a37 6 1533 1271\n11a3d 9 1537 1271\n11a46 b 1541 1271\n11a51 9 1546 1271\n11a5a d 1548 1271\n11a67 3 1549 1271\n11a6a 5 1550 1271\n11a6f 3 1551 1271\n11a72 5 1553 1271\n11a77 8 1543 1271\n11a7f 7 1544 1271\n11a86 5 1557 1271\n11a8b 38 1378 1271\n11ac3 14 1908 1271\n11ad7 f 1910 1271\n11ae6 5 1665 1271\n11aeb a 1668 1271\n11af5 2 1671 1271\n11af7 a 1673 1271\n11b01 25 1677 1271\n11b26 5 1678 1271\n11b2b 9 1682 1271\n11b34 9 1688 1271\n11b3d 9 1702 1271\n11b46 7 1703 1271\n11b4d 2 1704 1271\n11b4f 5 1706 1271\n11b54 3 1708 1271\n11b57 5 1710 1271\n11b5c 7 1864 1271\n11b63 7 1869 1271\n11b6a f 1933 1271\n11b79 9 1936 1271\n11b82 e 1939 1271\n11b90 5 1942 1271\n11b95 1c 1739 1271\n11bb1 21 1109 1271\n11bd2 16 1749 1271\n11be8 9 1750 1271\n11bf1 7 1751 1271\n11bf8 3 1767 1271\n11bfb 5 1806 1271\n11c00 9 1809 1271\n11c09 2 1812 1271\n11c0b 5 1753 1271\n11c10 3 1754 1271\n11c13 a 1756 1271\n11c1d f 1759 1271\n11c2c 2 1760 1271\n11c2e 11 1765 1271\n11c3f a 1818 1271\n11c49 6 1821 1271\n11c4f 16 1822 1271\n11c65 26 1828 1271\n11c8b 16 1838 1271\n11ca1 17 1840 1271\n11cb8 a 1844 1271\n11cc2 17 1846 1271\n11cd9 8 1852 1271\n11ce1 a 1853 1271\n11ceb 3 1854 1271\n11cee 3 1857 1271\n11cf1 5 1859 1271\n11cf6 7 1877 1271\n11cfd 7 1887 1271\n11d04 2 1888 1271\n11d06 1a 1378 1271\n11d20 7 1892 1271\n11d27 14 1897 1271\n11d3b c 1900 1271\n11d47 7 1901 1271\n11d4e 5 1903 1271\n11d53 a 1944 1271\n11d5d 2c 1948 1271\n11d89 5 1949 1271\n11d8e 6 1961 1271\n11d94 3 1964 1271\n11d97 6 1970 1271\n11d9d a 1972 1271\n11da7 2c 1976 1271\n11dd3 5 1977 1271\n11dd8 c 1981 1271\n11de4 5 1987 1271\n11de9 4 2019 1271\n11ded 4 2020 1271\n11df1 5 2023 1271\n11df6 b 2026 1271\n11e01 5 2029 1271\n11e06 a 2031 1271\n11e10 f 2035 1271\n11e1f a 2040 1271\n11e29 2 2045 1271\n11e2b 5 2048 1271\n11e30 b 2051 1271\n11e3b 2 2054 1271\n11e3d a 2056 1271\n11e47 b 2060 1271\n11e52 a 2065 1271\n11e5c 2 2071 1271\n11e5e 4 2074 1271\n11e62 5 2077 1271\n11e67 a 2080 1271\n11e71 2 2083 1271\n11e73 a 2085 1271\n11e7d b 2089 1271\n11e88 a 2094 1271\n11e92 2 2099 1271\n11e94 5 2102 1271\n11e99 a 2105 1271\n11ea3 2 2108 1271\n11ea5 a 2110 1271\n11eaf 38 2114 1271\n11ee7 5 2115 1271\n11eec b 2119 1271\n11ef7 13 2128 1271\n11f0a 7 2129 1271\n11f11 a 2130 1271\n11f1b f 2136 1271\n11f2a 2 2142 1271\n11f2c 6 2148 1271\n11f32 7 2149 1271\n11f39 2 2150 1271\n11f3b 7 2151 1271\n11f42 a 2152 1271\n11f4c 3 2153 1271\n11f4f 6 2157 1271\n11f55 3 2158 1271\n11f58 6 2163 1271\n11f5e 10 2165 1271\n11f6e 10 2166 1271\n11f7e c 2168 1271\n11f8a 3 2170 1271\n11f8d 3 2172 1271\n11f90 2 2173 1271\n11f92 8 2175 1271\n11f9a 1 2176 1271\n11f9b 24 2180 1271\n11fbf 9 2181 1271\n11fc8 1 2182 1271\n11fc9 5 2185 1271\n11fce c 1594 1271\n11fda c 1598 1271\n11fe6 9 1603 1271\n11fef e 1635 1271\n11ffd 4 1636 1271\n12001 8 1637 1271\n12009 8 1639 1271\n12011 1c 1598 1271\n1202d 6 1640 1271\n12033 2 1641 1271\n12035 4 1640 1271\n12039 5 1642 1271\n1203e 2 1644 1271\n12040 5 1645 1271\n12045 8 1646 1271\n1204d 5 1647 1271\n12052 6 1648 1271\n12058 1 1649 1271\n12059 4 1648 1271\n1205d 6 1650 1271\n12063 10 2189 1271\n12073 a 2201 1271\n1207d a 2204 1271\n12087 6 2205 1271\n1208d 4 2207 1271\n12091 2 2208 1271\n12093 4 2210 1271\n12097 4 2212 1271\n1209b 2 2213 1271\n1209d 4 2215 1271\n120a1 4 2217 1271\n120a5 7 2218 1271\n120ac 9 2224 1271\n120b5 4 2228 1271\n120b9 11 2230 1271\n120ca 11 2234 1271\n120db 13 2236 1271\n120ee f 2238 1271\n120fd d 2243 1271\n1210a 3 2249 1271\n1210d 3 2250 1271\n12110 1e 2252 1271\n1212e 9 2253 1271\n12137 18 2257 1271\n1214f 2 2310 1271\n12151 4 2254 1271\n12155 2 2259 1271\n12157 d 2260 1271\n12164 f 2290 1271\n12173 f 2292 1271\n12182 6 2297 1271\n12188 8 2298 1271\n12190 15 2299 1271\n121a5 2 1073 1271\n121a7 f 2310 1271\n121b6 b 2314 1271\n121c1 10 2319 1271\n121d1 1d 2321 1271\n121ee 2 2360 1271\n121f0 3 2361 1271\n121f3 2 2362 1271\n121f5 2 2324 1271\n121f7 f 2325 1271\n12206 10 1043 1271\n12216 10 2376 1271\n12226 38 2377 1271\nFUNC 1225e c2 4 _putwch_nolock\n1225e 11 84 4721\n1226f a 89 4721\n12279 9 91 4721\n12282 5 92 4721\n12287 a 96 4721\n12291 6 97 4721\n12297 16 103 4721\n122ad 14 105 4721\n122c1 6 106 4721\n122c7 1c 123 4721\n122e3 1e 129 4721\n12301 2 131 4721\n12303 4 133 4721\n12307 d 134 4721\n12314 a 110 4721\n1231e 2 113 4721\nFUNC 12320 9b 4 _cputws\n12320 c 151 4721\n1232c 5 153 4721\n12331 30 155 4721\n12361 b 157 4721\n1236c 9 158 4721\n12375 3 159 4721\n12378 a 160 4721\n12382 17 162 4721\n12399 4 164 4721\n1239d c 169 4721\n123a9 3 172 4721\n123ac 6 173 4721\n123b2 9 170 4721\nFUNC 123bb 46 4 _putwch\n123bb c 49 4721\n123c7 8 52 4721\n123cf 4 53 4721\n123d3 f 55 4721\n123e2 c 58 4721\n123ee 4 62 4721\n123f2 6 63 4721\n123f8 9 59 4721\nFUNC 12401 113 10 _mbtowc_l\n12401 8 55 6355\n12409 e 56 6355\n12417 4 61 6355\n1241b 7 64 6355\n12422 3 65 6355\n12425 4 59 6355\n12429 2 116 6355\n1242b b 70 6355\n12436 8 73 6355\n1243e 7 75 6355\n12445 7 76 6355\n1244c 11 77 6355\n1245d 13 80 6355\n12470 33 90 6355\n124a3 10 93 6355\n124b3 1b 99 6355\n124ce b 95 6355\n124d9 14 96 6355\n124ed 25 108 6355\n12512 2 111 6355\nFUNC 12514 17 c mbtowc\n12514 0 123 6355\n12514 16 124 6355\n1252a 1 125 6355\nFUNC 1252b 83 10 _lseeki64_nolock\n1252b 5 120 4872\n12530 4 126 4872\n12534 1b 134 4872\n1254f b 136 4872\n1255a 6 138 4872\n12560 22 146 4872\n12582 7 148 4872\n12589 2 149 4872\n1258b 19 152 4872\n125a4 8 153 4872\n125ac 2 154 4872\nFUNC 125ae 119 10 _lseeki64\n125ae c 73 4872\n125ba 9 74 4872\n125c3 24 77 4872\n125e7 2f 78 4872\n12616 46 79 4872\n1265c 7 81 4872\n12663 3 82 4872\n12666 9 84 4872\n1266f 1a 85 4872\n12689 2 86 4872\n1268b b 87 4872\n12696 7 88 4872\n1269d 8 89 4872\n126a5 c 93 4872\n126b1 6 97 4872\n126b7 6 98 4872\n126bd a 94 4872\nFUNC 126c7 7d 8 _set_osfhnd\n126c7 0 213 4825\n126c7 2e 216 4825\n126f5 e 217 4825\n12703 b 218 4825\n1270e 3 226 4825\n12711 2 227 4825\n12713 3 223 4825\n12716 2 224 4825\n12718 9 220 4825\n12721 5 231 4825\n12726 5 232 4825\n1272b b 234 4825\n12736 8 235 4825\n1273e 5 236 4825\n12743 1 238 4825\nFUNC 12744 81 4 _free_osfhnd\n12744 0 263 4825\n12744 38 266 4825\n1277c 9 268 4825\n12785 a 269 4825\n1278f 3 277 4825\n12792 2 278 4825\n12794 3 274 4825\n12797 2 275 4825\n12799 9 271 4825\n127a2 6 282 4825\n127a8 4 283 4825\n127ac b 285 4825\n127b7 7 286 4825\n127be 6 287 4825\n127c4 1 289 4825\nFUNC 127c5 71 4 _get_osfhandle\n127c5 0 312 4825\n127c5 1f 313 4825\n127e4 2 318 4825\n127e6 e 314 4825\n127f4 3d 315 4825\n12831 1 318 4825\n12832 3 317 4825\n12835 1 318 4825\nFUNC 12836 a0 4 __lock_fhandle\n12836 c 437 4825\n12842 17 438 4825\n12859 7 439 4825\n12860 7 444 4825\n12867 8 446 4825\n1286f 3 447 4825\n12872 5 448 4825\n12877 14 449 4825\n1288b 3 453 4825\n1288e 3 455 4825\n12891 c 457 4825\n1289d 5 462 4825\n128a2 1d 464 4825\n128bf 3 467 4825\n128c2 6 468 4825\n128c8 5 457 4825\n128cd 9 458 4825\nFUNC 128d6 22 4 _unlock_fhandle\n128d6 0 489 4825\n128d6 21 490 4825\n128f7 1 491 4825\nFUNC 128f8 19f 0 _alloc_osfhnd\n128f8 c 52 4825\n12904 4 53 4825\n12908 5 56 4825\n1290d c 58 4825\n12919 8 59 4825\n12921 8 61 4825\n12929 3 62 4825\n1292c c 71 4825\n12938 f 77 4825\n12947 17 83 4825\n1295e 6 85 4825\n12964 6 89 4825\n1296a 8 90 4825\n12972 6 91 4825\n12978 6 92 4825\n1297e 14 93 4825\n12992 3 99 4825\n12995 2 101 4825\n12997 3 103 4825\n1299a 9 106 4825\n129a3 6 111 4825\n129a9 a 113 4825\n129b3 6 119 4825\n129b9 7 120 4825\n129c0 5 83 4825\n129c5 6 106 4825\n129cb 9 107 4825\n129d4 6 124 4825\n129da 4 126 4825\n129de 3 127 4825\n129e1 19 128 4825\n129fa 6 137 4825\n12a00 6 71 4825\n12a06 12 145 4825\n12a18 9 151 4825\n12a21 7 152 4825\n12a28 c 154 4825\n12a34 4 155 4825\n12a38 3 156 4825\n12a3b 4 157 4825\n12a3f 4 158 4825\n12a43 8 154 4825\n12a4b 6 165 4825\n12a51 19 166 4825\n12a6a b 167 4825\n12a75 4 171 4825\n12a79 c 178 4825\n12a85 3 186 4825\n12a88 6 187 4825\n12a8e 9 179 4825\nFUNC 12a97 115 8 _open_osfhandle\n12a97 c 343 4825\n12aa3 5 347 4825\n12aa8 2 351 4825\n12aaa 6 353 4825\n12ab0 3 354 4825\n12ab3 8 356 4825\n12abb 3 357 4825\n12abe 6 359 4825\n12ac4 3 360 4825\n12ac7 9 364 4825\n12ad0 4 365 4825\n12ad4 d 367 4825\n12ae1 3 409 4825\n12ae4 6 410 4825\n12aea 5 372 4825\n12aef 5 373 4825\n12af4 5 374 4825\n12af9 3 375 4825\n12afc f 380 4825\n12b0b b 381 4825\n12b16 7 382 4825\n12b1d 2 383 4825\n12b1f 3 385 4825\n12b22 b 391 4825\n12b2d 3 393 4825\n12b30 1a 395 4825\n12b4a 9 396 4825\n12b53 9 397 4825\n12b5c 7 399 4825\n12b63 c 401 4825\n12b6f 10 409 4825\n12b7f 5 401 4825\n12b84 5 402 4825\n12b89 1b 404 4825\n12ba4 8 406 4825\nFUNC 12bac 11e c _calloc_impl\n12bac c 23 5592\n12bb8 9 28 5592\n12bc1 2e 30 5592\n12bef 9 32 5592\n12bf8 4 36 5592\n12bfc 3 37 5592\n12bff 5 41 5592\n12c04 5 43 5592\n12c09 9 46 5592\n12c12 9 50 5592\n12c1b b 52 5592\n12c26 8 56 5592\n12c2e 3 57 5592\n12c31 c 58 5592\n12c3d c 60 5592\n12c49 7 64 5592\n12c50 d 65 5592\n12c5d 4 93 5592\n12c61 11 94 5592\n12c72 c 97 5592\n12c7e f 109 5592\n12c8d b 111 5592\n12c98 6 112 5592\n12c9e 5 113 5592\n12ca3 5 60 5592\n12ca8 9 61 5592\n12cb1 4 100 5592\n12cb5 7 102 5592\n12cbc 6 103 5592\n12cc2 2 105 5592\n12cc4 6 119 5592\nFUNC 12cca 3f 8 calloc\n12cca 4 145 5592\n12cce 5 146 5592\n12cd3 14 147 5592\n12ce7 15 149 5592\n12cfc 8 151 5592\n12d04 3 153 5592\n12d07 2 154 5592\nFUNC 12d09 21b 8 realloc\n12d09 c 64 5338\n12d15 7 69 5338\n12d1c e 70 5338\n12d2a 7 73 5338\n12d31 7 75 5338\n12d38 5 76 5338\n12d3d d 81 5338\n12d4a 5 88 5338\n12d4f 9 89 5338\n12d58 8 91 5338\n12d60 3 92 5338\n12d63 12 96 5338\n12d75 8 100 5338\n12d7d f 102 5338\n12d8c 5 103 5338\n12d91 e 104 5338\n12d9f 4 107 5338\n12da3 10 108 5338\n12db3 9 110 5338\n12dbc a 111 5338\n12dc6 5 118 5338\n12dcb 4 120 5338\n12dcf 6 121 5338\n12dd5 9 123 5338\n12dde 15 124 5338\n12df3 4 127 5338\n12df7 10 128 5338\n12e07 c 129 5338\n12e13 c 135 5338\n12e1f 6 142 5338\n12e25 4 144 5338\n12e29 1 145 5338\n12e2a 9 147 5338\n12e33 14 148 5338\n12e47 6 135 5338\n12e4d 9 137 5338\n12e56 3 148 5338\n12e59 10 158 5338\n12e69 f 181 5338\n12e78 5 186 5338\n12e7d 5 183 5338\n12e82 11 186 5338\n12e93 2 188 5338\n12e95 8 160 5338\n12e9d 5 170 5338\n12ea2 3 167 5338\n12ea5 2 172 5338\n12ea7 6 174 5338\n12ead 2 155 5338\n12eaf 4 321 5338\n12eb3 1 322 5338\n12eb4 12 323 5338\n12ec6 c 332 5338\n12ed2 b 347 5338\n12edd 5 319 5338\n12ee2 7 327 5338\n12ee9 b 328 5338\n12ef4 2 329 5338\n12ef6 6 356 5338\n12efc 5 349 5338\n12f01 5 350 5338\n12f06 4 334 5338\n12f0a 16 341 5338\n12f20 4 343 5338\nFUNC 12f24 79 c _recalloc\n12f24 3 744 5338\n12f27 a 749 5338\n12f31 28 751 5338\n12f59 4 753 5338\n12f5d 9 754 5338\n12f66 b 755 5338\n12f71 b 756 5338\n12f7c a 757 5338\n12f86 10 759 5338\n12f96 5 761 5338\n12f9b 2 762 5338\nFUNC 12f9d 21 0 _get_sbh_threshold\n12f9d 0 61 5281\n12f9d 9 64 5281\n12fa6 2 66 5281\n12fa8 1 81 5281\n12fa9 14 69 5281\n12fbd 1 81 5281\nFUNC 12fbe 46 4 _set_amblksiz\n12fbe 0 214 5281\n12fbe 2b 216 5281\n12fe9 1 224 5281\n12fea 11 217 5281\n12ffb 5 220 5281\n13000 3 223 5281\n13003 1 224 5281\nFUNC 13004 3c 4 _get_amblksiz\n13004 0 243 5281\n13004 27 245 5281\n1302b 1 253 5281\n1302c 8 246 5281\n13034 8 249 5281\n1303c 3 252 5281\n1303f 1 253 5281\nFUNC 13040 48 4 __sbh_heap_init\n13040 0 274 5281\n13040 1c 275 5281\n1305c 1 285 5281\n1305d 4 278 5281\n13061 7 280 5281\n13068 c 281 5281\n13074 13 284 5281\n13087 1 285 5281\nFUNC 13088 2b 4 __sbh_find_block\n13088 0 306 5281\n13088 12 307 5281\n1309a 7 316 5281\n130a1 8 317 5281\n130a9 3 319 5281\n130ac 4 314 5281\n130b0 2 321 5281\n130b2 1 322 5281\nFUNC 130b3 314 8 __sbh_free_block\n130b3 6 381 5281\n130b9 7 399 5281\n130c0 9 402 5281\n130c9 18 407 5281\n130e1 3 408 5281\n130e4 d 412 5281\n130f1 3 416 5281\n130f4 5 417 5281\n130f9 6 420 5281\n130ff b 424 5281\n1310a 4 429 5281\n1310e 5 430 5281\n13113 3 431 5281\n13116 8 434 5281\n1311e 3 439 5281\n13121 b 441 5281\n1312c e 442 5281\n1313a 5 443 5281\n1313f 2 445 5281\n13141 5 448 5281\n13146 11 449 5281\n13157 9 450 5281\n13160 9 455 5281\n13169 15 459 5281\n1317e 6 463 5281\n13184 5 464 5281\n13189 3 465 5281\n1318c f 468 5281\n1319b 3 474 5281\n1319e 6 477 5281\n131a4 b 478 5281\n131af 2 479 5281\n131b1 3 483 5281\n131b4 6 484 5281\n131ba 7 485 5281\n131c1 2 486 5281\n131c3 4 489 5281\n131c7 b 493 5281\n131d2 3 498 5281\n131d5 11 501 5281\n131e6 6 502 5281\n131ec 5 503 5281\n131f1 2 505 5281\n131f3 e 508 5281\n13201 6 509 5281\n13207 6 511 5281\n1320d c 516 5281\n13219 c 517 5281\n13225 8 520 5281\n1322d e 524 5281\n1323b 6 528 5281\n13241 3 529 5281\n13244 6 530 5281\n1324a 3 531 5281\n1324d 6 532 5281\n13253 8 535 5281\n1325b 18 541 5281\n13273 e 542 5281\n13281 f 543 5281\n13290 2 545 5281\n13292 6 547 5281\n13298 10 548 5281\n132a8 13 550 5281\n132bb 5 556 5281\n132c0 4 558 5281\n132c4 b 561 5281\n132cf d 564 5281\n132dc 6 568 5281\n132e2 1a 569 5281\n132fc 15 573 5281\n13311 16 577 5281\n13327 19 578 5281\n13340 9 579 5281\n13349 6 583 5281\n1334f 8 586 5281\n13357 16 589 5281\n1336d 25 595 5281\n13392 14 599 5281\n133a6 4 600 5281\n133aa a 603 5281\n133b4 8 608 5281\n133bc 9 609 5281\n133c5 2 611 5281\nFUNC 133c7 b0 0 __sbh_alloc_new_region\n133c7 0 891 5281\n133c7 13 897 5281\n133da 1e 900 5281\n133f8 4 901 5281\n133fc 12 905 5281\n1340e 9 909 5281\n13417 18 913 5281\n1342f 2 914 5281\n13431 1a 918 5281\n1344b 10 920 5281\n1345b 2 921 5281\n1345d 9 927 5281\n13466 6 930 5281\n1346c 6 933 5281\n13472 4 935 5281\n13476 1 936 5281\nFUNC 13477 106 4 __sbh_alloc_new_group\n13477 5 958 5281\n1347c 3 959 5281\n1347f 9 972 5281\n13488 4 973 5281\n1348c 2 976 5281\n1348e 1 977 5281\n1348f 4 974 5281\n13493 15 981 5281\n134a8 c 986 5281\n134b4 1f 993 5281\n134d3 8 994 5281\n134db 6 998 5281\n134e1 12 1001 5281\n134f3 4 1004 5281\n134f7 7 1005 5281\n134fe 8 1011 5281\n13506 10 1013 5281\n13516 12 1016 5281\n13528 3 1001 5281\n1352b 8 1021 5281\n13533 6 1023 5281\n13539 3 1024 5281\n1353c 6 1027 5281\n13542 3 1028 5281\n13545 5 1030 5281\n1354a a 1031 5281\n13554 9 1032 5281\n1355d b 1033 5281\n13568 e 1036 5281\n13576 5 1038 5281\n1357b 2 1039 5281\nFUNC 1357d 2df c __sbh_resize_block\n1357d 6 1061 5281\n13583 c 1080 5281\n1358f b 1083 5281\n1359a 3 1084 5281\n1359d 12 1085 5281\n135af 7 1089 5281\n135b6 14 1096 5281\n135ca 13 1099 5281\n135dd 7 1105 5281\n135e4 8 1106 5281\n135ec 6 1107 5281\n135f2 8 1110 5281\n135fa 3 1115 5281\n135fd 9 1117 5281\n13606 11 1118 5281\n13617 5 1119 5281\n1361c 2 1121 5281\n1361e 5 1124 5281\n13623 14 1125 5281\n13637 6 1126 5281\n1363d 9 1131 5281\n13646 9 1132 5281\n1364f 12 1135 5281\n13661 a 1141 5281\n1366b 9 1142 5281\n13674 3 1143 5281\n13677 9 1147 5281\n13680 6 1148 5281\n13686 6 1149 5281\n1368c 3 1150 5281\n1368f 6 1151 5281\n13695 8 1154 5281\n1369d 18 1160 5281\n136b5 e 1161 5281\n136c3 6 1162 5281\n136c9 2 1164 5281\n136cb 6 1166 5281\n136d1 10 1167 5281\n136e1 13 1169 5281\n136f4 c 1174 5281\n13700 9 1176 5281\n13709 6 1180 5281\n1370f 9 1182 5281\n13718 7 1100 5281\n1371f 6 1186 5281\n13725 3 1189 5281\n13728 d 1195 5281\n13735 7 1198 5281\n1373c b 1199 5281\n13747 3 1200 5281\n1374a a 1203 5281\n13754 7 1208 5281\n1375b 5 1209 5281\n13760 3 1210 5281\n13763 8 1213 5281\n1376b 3 1218 5281\n1376e b 1221 5281\n13779 e 1222 5281\n13787 5 1223 5281\n1378c 2 1225 5281\n1378e 5 1228 5281\n13793 11 1229 5281\n137a4 9 1231 5281\n137ad 9 1236 5281\n137b6 9 1237 5281\n137bf 9 1240 5281\n137c8 4 1241 5281\n137cc 5 1242 5281\n137d1 3 1243 5281\n137d4 6 1249 5281\n137da 3 1250 5281\n137dd 6 1251 5281\n137e3 3 1252 5281\n137e6 6 1253 5281\n137ec 8 1256 5281\n137f4 18 1262 5281\n1380c e 1263 5281\n1381a 6 1264 5281\n13820 2 1266 5281\n13822 6 1268 5281\n13828 10 1269 5281\n13838 13 1271 5281\n1384b 5 1276 5281\n13850 4 1278 5281\n13854 6 1281 5281\n1385a 2 1282 5281\nFUNC 1385c cd 0 __sbh_heapmin\n1385c 0 1302 5281\n1385c d 1306 5281\n13869 6 1310 5281\n1386f 17 1311 5281\n13886 15 1314 5281\n1389b 16 1318 5281\n138b1 19 1319 5281\n138ca 9 1320 5281\n138d3 f 1325 5281\n138e2 11 1328 5281\n138f3 28 1333 5281\n1391b 6 1334 5281\n13921 7 1338 5281\n13928 1 1340 5281\nFUNC 13929 2e2 0 __sbh_heap_check\n13929 3 1361 5281\n1392c 12 1391 5281\n1393e 8 1393 5281\n13946 16 1398 5281\n1395c 3 1401 5281\n1395f 8 1402 5281\n13967 6 1406 5281\n1396d 9 1407 5281\n13976 c 1408 5281\n13982 3 1409 5281\n13985 3 1410 5281\n13988 6 1411 5281\n1398e 4 1418 5281\n13992 1b 1421 5281\n139ad 9 1424 5281\n139b6 9 1428 5281\n139bf 1c 1438 5281\n139db 2 1445 5281\n139dd 7 1446 5281\n139e4 1 1449 5281\n139e5 c 1452 5281\n139f1 3 1456 5281\n139f4 2 1458 5281\n139f6 6 1462 5281\n139fc 5 1463 5281\n13a01 3 1464 5281\n13a04 9 1465 5281\n13a0d 1e 1470 5281\n13a2b c 1475 5281\n13a37 2 1479 5281\n13a39 4 1481 5281\n13a3d 6 1484 5281\n13a43 10 1488 5281\n13a53 e 1492 5281\n13a61 2 1498 5281\n13a63 4 1502 5281\n13a67 20 1505 5281\n13a87 19 1509 5281\n13aa0 8 1514 5281\n13aa8 3 1518 5281\n13aab 6 1520 5281\n13ab1 8 1524 5281\n13ab9 4 1527 5281\n13abd e 1532 5281\n13acb 8 1536 5281\n13ad3 6 1541 5281\n13ad9 5 1542 5281\n13ade 3 1543 5281\n13ae1 8 1544 5281\n13ae9 c 1549 5281\n13af5 11 1554 5281\n13b06 6 1559 5281\n13b0c 3 1561 5281\n13b0f e 1563 5281\n13b1d 3 1564 5281\n13b20 2 1566 5281\n13b22 8 1568 5281\n13b2a 3 1569 5281\n13b2d 1c 1575 5281\n13b49 c 1580 5281\n13b55 10 1585 5281\n13b65 17 1591 5281\n13b7c 7 1595 5281\n13b83 7 1596 5281\n13b8a 16 1597 5281\n13ba0 f 1602 5281\n13baf 18 1606 5281\n13bc7 5 1608 5281\n13bcc 2 1609 5281\n13bce 4 1403 5281\n13bd2 4 1425 5281\n13bd6 4 1453 5281\n13bda 4 1485 5281\n13bde 4 1471 5281\n13be2 4 1439 5281\n13be6 4 1493 5281\n13bea 4 1537 5281\n13bee 4 1545 5281\n13bf2 4 1550 5281\n13bf6 4 1510 5281\n13bfa 4 1581 5281\n13bfe 4 1576 5281\n13c02 4 1592 5281\n13c06 5 1603 5281\nFUNC 13c0b a8 4 _set_sbh_threshold\n13c0b 1 102 5281\n13c0c a 104 5281\n13c16 3 106 5281\n13c19 1 195 5281\n13c1a a 109 5281\n13c24 25 112 5281\n13c49 5 113 5281\n13c4e 4 114 5281\n13c52 2 195 5281\n13c54 6 173 5281\n13c5a 2 175 5281\n13c5c 5 179 5281\n13c61 2d 185 5281\n13c8e 6 186 5281\n13c94 a 187 5281\n13c9e 5 188 5281\n13ca3 b 193 5281\n13cae 4 194 5281\n13cb2 1 195 5281\nFUNC 13cb3 2e3 4 __sbh_alloc_block\n13cb3 6 632 5281\n13cb9 5 633 5281\n13cbe 15 650 5281\n13cd3 5 668 5281\n13cd8 7 669 5281\n13cdf 5 671 5281\n13ce4 4 672 5281\n13ce8 2 674 5281\n13cea d 677 5281\n13cf7 a 682 5281\n13d01 e 686 5281\n13d0f 3 688 5281\n13d12 2 683 5281\n13d14 5 688 5281\n13d19 4 692 5281\n13d1d 8 694 5281\n13d25 e 698 5281\n13d33 3 700 5281\n13d36 2 695 5281\n13d38 5 700 5281\n13d3d 6 705 5281\n13d43 6 709 5281\n13d49 6 711 5281\n13d4f 4 707 5281\n13d53 4 715 5281\n13d57 8 717 5281\n13d5f 6 720 5281\n13d65 3 722 5281\n13d68 2 718 5281\n13d6a 5 722 5281\n13d6f 4 726 5281\n13d73 e 727 5281\n13d81 7 728 5281\n13d88 12 733 5281\n13d9a 2 734 5281\n13d9c 6 737 5281\n13da2 3 739 5281\n13da5 2 740 5281\n13da7 1c 745 5281\n13dc3 4 749 5281\n13dc7 14 751 5281\n13ddb e 752 5281\n13de9 3 751 5281\n13dec 12 754 5281\n13dfe a 760 5281\n13e08 d 763 5281\n13e15 2 768 5281\n13e17 2 767 5281\n13e19 1 768 5281\n13e1a 4 765 5281\n13e1e 7 770 5281\n13e25 5 775 5281\n13e2a 6 776 5281\n13e30 8 777 5281\n13e38 3 778 5281\n13e3b 8 781 5281\n13e43 8 784 5281\n13e4b 3 788 5281\n13e4e e 791 5281\n13e5c 15 792 5281\n13e71 8 793 5281\n13e79 2 795 5281\n13e7b f 798 5281\n13e8a f 799 5281\n13e99 e 800 5281\n13ea7 1c 809 5281\n13ec3 6 813 5281\n13ec9 3 814 5281\n13ecc 6 815 5281\n13ed2 3 816 5281\n13ed5 6 817 5281\n13edb 8 820 5281\n13ee3 18 826 5281\n13efb b 827 5281\n13f06 10 829 5281\n13f16 2 831 5281\n13f18 6 833 5281\n13f1e d 835 5281\n13f2b 16 837 5281\n13f41 3 831 5281\n13f44 4 844 5281\n13f48 2 846 5281\n13f4a 9 848 5281\n13f53 a 853 5281\n13f5d 4 855 5281\n13f61 e 858 5281\n13f6f 13 862 5281\n13f82 7 863 5281\n13f89 5 866 5281\n13f8e 6 868 5281\n13f94 2 869 5281\nFUNC 13f96 72 4 _fclose_nolock\n13f96 2 86 1752\n13f98 2a 90 1752\n13fc2 6 96 1752\n13fc8 6 105 1752\n13fce 8 106 1752\n13fd6 13 108 1752\n13fe9 5 109 1752\n13fee 7 111 1752\n13ff5 7 120 1752\n13ffc 3 121 1752\n13fff 3 126 1752\n14002 5 127 1752\n14007 1 128 1752\nFUNC 14008 7c 4 fclose\n14008 c 44 1752\n14014 4 45 1752\n14018 2d 47 1752\n14045 6 50 1752\n1404b 3 51 1752\n1404e 3 64 1752\n14051 6 65 1752\n14057 7 55 1752\n1405e 3 56 1752\n14061 a 57 1752\n1406b 11 59 1752\n1407c 8 60 1752\nFUNC 14084 d 8 _ValidateRead(void const *,unsigned int)\n14084 0 63 5683\n14084 3 64 5683\n14087 7 65 5683\n1408e 2 68 5683\n14090 1 71 5683\nFUNC 14091 d 8 _ValidateWrite(void *,unsigned int)\n14091 0 74 5683\n14091 3 75 5683\n14094 7 76 5683\n1409b 2 79 5683\n1409d 1 82 5683\nFUNC 1409e d 4 _ValidateExecute(int (*)(void))\n1409e 0 85 5683\n1409e 3 86 5683\n140a1 7 87 5683\n140a8 2 90 5683\n140aa 1 93 5683\nFUNC 140ab f3 0 abort\n140ab 1b 53 4119\n140c6 a 56 4119\n140d0 8 59 4119\n140d8 5 68 4119\n140dd 4 69 4119\n140e1 8 71 4119\n140e9 d 78 4119\n140f6 6 87 4119\n140fc 6 88 4119\n14102 6 89 4119\n14108 3 90 4119\n1410b 3 91 4119\n1410e 3 92 4119\n14111 7 93 4119\n14118 7 94 4119\n1411f 4 95 4119\n14123 4 96 4119\n14127 4 97 4119\n1412b 4 98 4119\n1412f 1 99 4119\n14130 6 100 4119\n14136 6 106 4119\n1413c 19 107 4119\n14155 3 109 4119\n14158 13 117 4119\n1416b 9 122 4119\n14174 3 123 4119\n14177 15 126 4119\n1418c a 128 4119\n14196 8 137 4119\nFUNC 1419e 1e 8 _set_abort_behavior\n1419e 0 158 4119\n1419e 1d 160 4119\n141bb 1 162 4119\nFUNC 141bc 20 0 _global_unwind2\nFUNC 141dc 45 0 __unwind_handler\nFUNC 14221 84 0 _local_unwind2\nFUNC 142a5 23 0 _abnormal_termination\nFUNC 142c8 9 0 _NLG_Notify1\nFUNC 142d1 1f 0 _NLG_Notify\nPUBLIC 142e8 0 _NLG_Dispatch2\nFUNC 142f0 3 0 _NLG_Call\nPUBLIC 142f2 0 _NLG_Return2\nFUNC 142f3 a3 4 _msize\n142f3 c 43 5383\n142ff 2d 47 5383\n1432c 9 51 5383\n14335 8 55 5383\n1433d 3 56 5383\n14340 e 57 5383\n1434e e 59 5383\n1435c c 61 5383\n14368 5 64 5383\n1436d 10 88 5383\n1437d 2 91 5383\n1437f 6 93 5383\n14385 8 61 5383\n1438d 9 62 5383\nFUNC 14396 6 0 HeapManager::Block::Block()\n14396 6 90 5771\nFUNC 1439c 1b 8 HeapManager::Constructor(void * (*)(unsigned int),void (*)(void *))\n1439c 6 100 5771\n143a2 7 101 5771\n143a9 5 102 5771\n143ae 3 103 5771\n143b1 3 104 5771\n143b4 3 105 5771\nFUNC 143b7 26 0 HeapManager::Destructor()\n143b7 9 110 5771\n143c0 2 111 5771\n143c2 5 113 5771\n143c7 15 115 5771\n143dc 1 118 5771\nFUNC 143dd 63 0 UnDecorator::getNumberOfDimensions()\n143dd 0 1663 5771\n143dd c 1664 5771\n143e9 2 1665 5771\n143eb 1 1696 5771\n143ec a 1666 5771\n143f6 d 1667 5771\n14403 1 1696 5771\n14404 4 1670 5771\n14408 4 1677 5771\n1440c a 1679 5771\n14416 6 1680 5771\n1441c d 1684 5771\n14429 5 1675 5771\n1442e e 1690 5771\n1443c 3 1691 5771\n1443f 1 1696 5771\nFUNC 14440 474 0 UnDecorator::getTypeEncoding()\n14440 f 2335 5771\n1444f 2 2336 5771\n14451 5 2341 5771\n14456 9 2345 5771\n1445f c 2351 5771\n1446b 9 2423 5771\n14474 2 2426 5771\n14476 2a 2427 5771\n144a0 8 2450 5771\n144a8 2 2451 5771\n144aa 24 2454 5771\n144ce 7 2462 5771\n144d5 5 2463 5771\n144da 6 2353 5771\n144e0 8 2358 5771\n144e8 b 2362 5771\n144f3 5 2363 5771\n144f8 2 2364 5771\n144fa 5 2365 5771\n144ff 9 2369 5771\n14508 1b 2373 5771\n14523 11 2377 5771\n14534 a 2393 5771\n1453e 10 2388 5771\n1454e 2 2389 5771\n14550 18 2384 5771\n14568 2 2385 5771\n1456a 12 2380 5771\n1457c 16 2399 5771\n14592 11 2418 5771\n145a3 a 2406 5771\n145ad 5 2407 5771\n145b2 15 2410 5771\n145c7 5 2422 5771\n145cc 1b 2427 5771\n145e7 a 2430 5771\n145f1 5 2431 5771\n145f6 7 2472 5771\n145fd a 2478 5771\n14607 c 2483 5771\n14613 5 2485 5771\n14618 5 2486 5771\n1461d 5 2487 5771\n14622 5 2490 5771\n14627 5 2505 5771\n1462c 5 2508 5771\n14631 5 2509 5771\n14636 5 2434 5771\n1463b 5 2435 5771\n14640 1a 2427 5771\n1465a 30 2568 5771\n1468a 5 2529 5771\n1468f 4 2530 5771\n14693 a 2531 5771\n1469d 2 2532 5771\n1469f a 2533 5771\n146a9 5 2537 5771\n146ae 5 2538 5771\n146b3 2 2539 5771\n146b5 5 2540 5771\n146ba e 2544 5771\n146c8 6 2560 5771\n146ce 10 2555 5771\n146de 2 2556 5771\n146e0 18 2551 5771\n146f8 2 2552 5771\n146fa 12 2547 5771\n1470c 2 2564 5771\n1470e a 2442 5771\n14718 2 2443 5771\n1471a a 2438 5771\n14724 2 2439 5771\n14726 5 2445 5771\n1472b c 2574 5771\n14737 14 2577 5771\n1474b a 2579 5771\n14755 18 2586 5771\n1476d 1a 2589 5771\n14787 1b 2590 5771\n147a2 5 2591 5771\n147a7 1a 2594 5771\n147c1 1b 2595 5771\n147dc 5 2596 5771\n147e1 1a 2599 5771\n147fb 10 2600 5771\n1480b 2 2601 5771\n1480d 7 2604 5771\n14814 2 2605 5771\n14816 a 2608 5771\n14820 2 2609 5771\n14822 a 2612 5771\n1482c 2 2613 5771\n1482e a 2616 5771\n14838 2 2617 5771\n1483a a 2620 5771\n14844 2 2621 5771\n14846 a 2624 5771\n14850 7 2634 5771\n14857 7 2635 5771\n1485e 7 2637 5771\n14865 10 2639 5771\n14875 3f 2648 5771\nFUNC 148b4 b 0 UnDecorator::doUnderScore()\n148b4 b 4259 5771\nFUNC 148bf d 0 UnDecorator::doMSKeywords()\n148bf d 4260 5771\nFUNC 148cc e 0 UnDecorator::doPtr64()\n148cc e 4261 5771\nFUNC 148da e 0 UnDecorator::doFunctionReturns()\n148da e 4262 5771\nFUNC 148e8 e 0 UnDecorator::doAllocationModel()\n148e8 e 4263 5771\nFUNC 148f6 e 0 UnDecorator::doAllocationLanguage()\n148f6 e 4264 5771\nFUNC 14904 12 0 UnDecorator::doThisTypes()\n14904 12 4271 5771\nFUNC 14916 e 0 UnDecorator::doAccessSpecifiers()\n14916 e 4272 5771\nFUNC 14924 e 0 UnDecorator::doThrowTypes()\n14924 e 4273 5771\nFUNC 14932 e 0 UnDecorator::doMemberTypes()\n14932 e 4274 5771\nFUNC 14940 b 0 UnDecorator::doNameOnly()\n14940 b 4279 5771\nFUNC 1494b b 0 UnDecorator::doTypeOnly()\n1494b b 4280 5771\nFUNC 14956 b 0 UnDecorator::haveTemplateParameters()\n14956 b 4281 5771\nFUNC 14961 e 0 UnDecorator::doEcsu()\n14961 e 4282 5771\nFUNC 1496f b 0 UnDecorator::doNoIdentCharCheck()\n1496f b 4283 5771\nFUNC 1497a e 0 UnDecorator::doEllipsis()\n1497a e 4284 5771\nFUNC 14988 19 4 UnDecorator::UScore(Tokens)\n14988 0 4288 5771\n14988 9 4293 5771\n14991 d 4294 5771\n1499e 2 4296 5771\n149a0 1 4298 5771\nFUNC 149a1 84 8 HeapManager::getMemory(unsigned int,int)\n149a1 2 134 5804\n149a3 a 137 5804\n149ad 9 139 5804\n149b6 6 140 5804\n149bc 4 146 5804\n149c0 3 147 5804\n149c3 8 149 5804\n149cb 7 153 5804\n149d2 2 154 5804\n149d4 1c 159 5804\n149f0 4 164 5804\n149f4 7 168 5804\n149fb 2 169 5804\n149fd 2 170 5804\n149ff 3 171 5804\n14a02 8 175 5804\n14a0a 2 182 5804\n14a0c 4 179 5804\n14a10 5 183 5804\n14a15 d 187 5804\n14a22 3 190 5804\nFUNC 14a25 d 0 DName::DName()\n14a25 2 210 5804\n14a27 3 211 5804\n14a2a 7 220 5804\n14a31 1 221 5804\nFUNC 14a32 12 4 DName::DName(DNameNode *)\n14a32 2 224 5804\n14a34 4 225 5804\n14a38 9 234 5804\n14a41 3 235 5804\nFUNC 14a44 9c 4 DName::DName(DName const &)\n14a44 2 259 5804\n14a46 17 260 5804\n14a5d 10 261 5804\n14a6d d 262 5804\n14a7a d 263 5804\n14a87 10 264 5804\n14a97 4 265 5804\n14a9b e 266 5804\n14aa9 13 267 5804\n14abc 10 268 5804\n14acc 11 269 5804\n14add 3 270 5804\nFUNC 14ae0 a 0 DName::status()\n14ae0 a 481 5804\nFUNC 14aea 5 0 DName::clearStatus()\n14aea 5 482 5804\nFUNC 14aef 7 0 DName::setPtrRef()\n14aef 7 484 5804\nFUNC 14af6 a 0 DName::isPtrRef()\n14af6 a 485 5804\nFUNC 14b00 8 0 DName::setIsArray()\n14b00 8 490 5804\nFUNC 14b08 a 0 DName::isArray()\n14b08 a 491 5804\nFUNC 14b12 a 0 DName::isNoTE()\n14b12 a 492 5804\nFUNC 14b1c 8 0 DName::setIsNoTE()\n14b1c 8 493 5804\nFUNC 14b24 a 0 DName::isPinPtr()\n14b24 a 494 5804\nFUNC 14b2e 8 0 DName::setIsPinPtr()\n14b2e 8 495 5804\nFUNC 14b36 a 0 DName::isComArray()\n14b36 a 496 5804\nFUNC 14b40 8 0 DName::setIsComArray()\n14b40 8 497 5804\nFUNC 14b48 a 0 DName::isVCallThunk()\n14b48 a 498 5804\nFUNC 14b52 8 0 DName::setIsVCallThunk()\n14b52 8 499 5804\nFUNC 14b5a 7b 4 DName::operator=(DName const &)\n14b5a 3 879 5804\n14b5d 12 880 5804\n14b6f 17 882 5804\n14b86 d 883 5804\n14b93 d 884 5804\n14ba0 d 885 5804\n14bad 10 886 5804\n14bbd 10 887 5804\n14bcd 5 889 5804\n14bd2 3 897 5804\nFUNC 14bd5 9 0 Replicator::isFull()\n14bd5 9 1001 5804\nFUNC 14bde 25 4 Replicator::operator[](int)\n14bde 0 1028 5804\n14bde 9 1029 5804\n14be7 b 1031 5804\n14bf2 6 1034 5804\n14bf8 5 1032 5804\n14bfd 3 1030 5804\n14c00 3 1036 5804\nFUNC 14c03 d 0 DNameNode::DNameNode()\n14c03 d 1048 5804\nFUNC 14c10 4 0 DNameNode::nextNode()\n14c10 4 1052 5804\nFUNC 14c14 29 4 DNameNode::operator+=(DNameNode *)\n14c14 2 1131 5804\n14c16 8 1132 5804\n14c1e 8 1134 5804\n14c26 b 1139 5804\n14c31 4 1144 5804\n14c35 2 1147 5804\n14c37 3 1148 5804\n14c3a 3 1156 5804\nFUNC 14c3d 16 4 charNode::charNode(char)\n14c3d 16 1166 5804\nFUNC 14c53 4 0 charNode::length()\n14c53 4 1168 5804\nFUNC 14c57 4 0 charNode::getLastChar()\n14c57 4 1170 5804\nFUNC 14c5b 1b 8 charNode::getString(char *,int)\n14c5b 0 1173 5804\n14c5b f 1174 5804\n14c6a 5 1175 5804\n14c6f 2 1176 5804\n14c71 2 1177 5804\n14c73 3 1183 5804\nFUNC 14c76 4 0 pcharNode::length()\n14c76 4 1189 5804\nFUNC 14c7a 2f 4 pDNameNode::pDNameNode(DName *)\n14c7a 2f 1244 5804\nFUNC 14ca9 25 4 DNameStatusNode::DNameStatusNode(DNameStatus)\n14ca9 25 1261 5804\nFUNC 14cce 4 0 DNameStatusNode::length()\n14cce 4 1263 5804\nFUNC 14cd2 d 0 DNameStatusNode::getLastChar()\n14cd2 d 1266 5804\nFUNC 14cdf e 0 und_strlen\n14cdf 0 1283 5804\n14cdf 6 1286 5804\n14ce5 7 1287 5804\n14cec 1 1291 5804\nFUNC 14ced 20 8 und_strncpy\n14ced 0 1295 5804\n14ced 1b 1296 5804\n14d08 4 1299 5804\n14d0c 1 1301 5804\nFUNC 14d0d 25 4 und_strncmp\n14d0d 0 1304 5804\n14d0d 7 1305 5804\n14d14 2 1306 5804\n14d16 1 1315 5804\n14d17 a 1308 5804\n14d21 1 1310 5804\n14d22 1 1311 5804\n14d23 6 1308 5804\n14d29 8 1314 5804\n14d31 1 1315 5804\nFUNC 14d32 33 0 UnDecorator::getDataIndirectType()\n14d32 33 4033 5771\nFUNC 14d65 34 0 UnDecorator::getThisType()\n14d65 34 4034 5771\nFUNC 14d99 13 c operator new(unsigned int,HeapManager &,int)\n14d99 13 131 5804\nFUNC 14dac 56 4 DName::DName(DName *)\n14dac 0 274 5804\n14dac a 275 5804\n14db6 23 277 5804\n14dd9 13 278 5804\n14dec 2 281 5804\n14dee 4 283 5804\n14df2 3 284 5804\n14df5 7 295 5804\n14dfc 6 296 5804\nFUNC 14e02 61 4 DName::DName(DNameStatus)\n14e02 2 457 5804\n14e04 21 458 5804\n14e25 1e 459 5804\n14e43 7 467 5804\n14e4a 9 469 5804\n14e53 a 470 5804\n14e5d 6 472 5804\nFUNC 14e63 17 0 DName::isValid()\n14e63 17 478 5804\nFUNC 14e7a 15 0 DName::isEmpty()\n14e7a 15 479 5804\nFUNC 14e8f 14 0 DName::isUDC()\n14e8f 14 486 5804\nFUNC 14ea3 e 0 DName::setIsUDC()\n14ea3 e 487 5804\nFUNC 14eb1 14 0 DName::isUDTThunk()\n14eb1 14 488 5804\nFUNC 14ec5 25 0 DName::length()\n14ec5 1 502 5804\n14ec6 2 503 5804\n14ec8 a 506 5804\n14ed2 4 507 5804\n14ed6 b 508 5804\n14ee1 5 507 5804\n14ee6 3 510 5804\n14ee9 1 512 5804\nFUNC 14eea 38 0 DName::getLastChar()\n14eea 2 516 5804\n14eec 2 517 5804\n14eee 9 519 5804\n14ef7 6 520 5804\n14efd a 521 5804\n14f07 2 522 5804\n14f09 7 520 5804\n14f10 11 524 5804\n14f21 1 526 5804\nFUNC 14f22 91 8 DName::getString(char *,int)\n14f22 7 530 5804\n14f29 9 531 5804\n14f32 5 535 5804\n14f37 7 537 5804\n14f3e e 538 5804\n14f4c c 544 5804\n14f58 d 550 5804\n14f65 4 553 5804\n14f69 8 555 5804\n14f71 4 561 5804\n14f75 6 565 5804\n14f7b 2 566 5804\n14f7d b 570 5804\n14f88 4 574 5804\n14f8c 2 578 5804\n14f8e 3 579 5804\n14f91 3 586 5804\n14f94 4 553 5804\n14f98 4 590 5804\n14f9c 2 593 5804\n14f9e 6 594 5804\n14fa4 6 595 5804\n14faa 5 599 5804\n14faf 4 601 5804\nFUNC 14fb3 35 4 DName::operator|=(DName const &)\n14fb3 3 832 5804\n14fb6 19 835 5804\n14fcf 13 836 5804\n14fe2 3 840 5804\n14fe5 3 842 5804\nFUNC 14fe8 81 4 DName::operator=(DNameStatus)\n14fe8 2 928 5804\n14fea 10 929 5804\n14ffa 12 937 5804\n1500c 26 945 5804\n15032 6 947 5804\n15038 e 948 5804\n15046 10 933 5804\n15056 d 934 5804\n15063 3 954 5804\n15066 3 956 5804\nFUNC 15069 1e 0 Replicator::Replicator()\n15069 1e 1004 5804\nFUNC 15087 47 4 Replicator::operator+=(DName const &)\n15087 3 1009 5804\n1508a 12 1010 5804\n1509c 20 1012 5804\n150bc 4 1017 5804\n150c0 8 1018 5804\n150c8 3 1022 5804\n150cb 3 1024 5804\nFUNC 150ce 47 0 DNameNode::clone()\n150ce 3 1055 5804\n150d1 43 1056 5804\n15114 1 1057 5804\nFUNC 15115 65 8 pcharNode::pcharNode(char const *,int)\n15115 1 1197 5804\n15116 1f 1200 5804\n15135 c 1201 5804\n15141 8 1205 5804\n15149 c 1207 5804\n15155 a 1210 5804\n1515f b 1211 5804\n1516a 2 1214 5804\n1516c 3 1216 5804\n1516f 4 1217 5804\n15173 7 1220 5804\nFUNC 1517a 12 0 pcharNode::getLastChar()\n1517a 12 1191 5804\nFUNC 1518c 31 8 pcharNode::getString(char *,int)\n1518c 0 1224 5804\n1518c b 1227 5804\n15197 2 1228 5804\n15199 21 1232 5804\n151ba 3 1234 5804\nFUNC 151bd f 0 pDNameNode::length()\n151bd f 1246 5804\nFUNC 151cc f 0 pDNameNode::getLastChar()\n151cc f 1248 5804\nFUNC 151db 1d 8 pDNameNode::getString(char *,int)\n151db 1d 1251 5804\nFUNC 151f8 33 8 DNameStatusNode::getString(char *,int)\n151f8 0 1269 5804\n151f8 b 1272 5804\n15203 2 1273 5804\n15205 23 1277 5804\n15228 3 1279 5804\nFUNC 1522b 73 14 UnDecorator::UnDecorator(char *,char const *,int,char * (*)(long),unsigned long)\n1522b 16 736 5771\n15241 8 737 5771\n15249 5 738 5771\n1524e 9 740 5771\n15257 a 741 5771\n15261 5 745 5771\n15266 2 747 5771\n15268 6 748 5771\n1526e 6 749 5771\n15274 8 754 5771\n1527c 15 755 5771\n15291 d 758 5771\nFUNC 1529e 2f 4 UnDecorator::getReturnType(DName *)\n1529e 3 2906 5771\n152a1 8 2907 5771\n152a9 15 2911 5771\n152be d 2915 5771\n152cb 2 2917 5771\nFUNC 152cd f 0 UnDecorator::getStorageConvention()\n152cd f 4032 5771\nFUNC 152dc 79 4 DName::operator+=(DNameStatus)\n152dc 4 799 5804\n152e0 17 800 5804\n152f7 20 804 5804\n15317 4 807 5804\n1531b 7 809 5804\n15322 6 811 5804\n15328 8 812 5804\n15330 2 815 5804\n15332 3 816 5804\n15335 5 818 5804\n1533a e 819 5804\n15348 7 801 5804\n1534f 3 825 5804\n15352 3 827 5804\nFUNC 15355 68 4 DName::operator=(DName *)\n15355 3 901 5804\n15358 12 902 5804\n1536a 7 903 5804\n15371 29 911 5804\n1539a 6 913 5804\n153a0 c 914 5804\n153ac 2 917 5804\n153ae 9 918 5804\n153b7 3 922 5804\n153ba 3 924 5804\nFUNC 153bd a6 8 DName::doPchar(char const *,int)\n153bd 3 962 5804\n153c0 1e 963 5804\n153de 6 964 5804\n153e4 c 965 5804\n153f0 10 966 5804\n15400 5 970 5804\n15405 23 984 5804\n15428 6 986 5804\n1542e 9 987 5804\n15437 2 988 5804\n15439 1b 977 5804\n15454 c 993 5804\n15460 3 995 5804\nFUNC 15463 26 4 DName::DName(char)\n15463 3 238 5804\n15466 3 244 5804\n15469 7 248 5804\n15470 7 252 5804\n15477 c 253 5804\n15483 6 255 5804\nFUNC 15489 31 4 DName::DName(char const *)\n15489 0 300 5804\n15489 16 312 5804\n1549f 15 313 5804\n154b4 6 315 5804\nFUNC 154ba d0 8 DName::DName(char const * &,char)\n154ba 7 319 5804\n154c1 d 329 5804\n154ce f 333 5804\n154dd 8 334 5804\n154e5 9 342 5804\n154ee 40 343 5804\n1552e b 344 5804\n15539 9 355 5804\n15542 8 359 5804\n1554a 8 361 5804\n15552 9 363 5804\n1555b 3 364 5804\n1555e 2 367 5804\n15560 3 347 5804\n15563 a 378 5804\n1556d 8 380 5804\n15575 6 368 5804\n1557b 7 371 5804\n15582 6 372 5804\n15588 2 375 5804\nFUNC 1558a 69 8 DName::DName(unsigned __int64)\n1558a 15 384 5804\n1559f 3 390 5804\n155a2 a 398 5804\n155ac 4 402 5804\n155b0 13 406 5804\n155c3 3 407 5804\n155c6 c 409 5804\n155d2 e 411 5804\n155e0 13 413 5804\nFUNC 155f3 96 8 DName::DName(__int64)\n155f3 10 416 5804\n15603 26 436 5804\n15629 15 438 5804\n1563e 10 443 5804\n1564e 5 444 5804\n15653 c 446 5804\n1565f 6 448 5804\n15665 4 449 5804\n15669 e 452 5804\n15677 12 453 5804\nFUNC 15689 2e 4 DName::operator+(DNameStatus)\n15689 1 675 5804\n1568a c 676 5804\n15696 9 679 5804\n1569f b 680 5804\n156aa 2 681 5804\n156ac 5 682 5804\n156b1 3 686 5804\n156b4 3 688 5804\nFUNC 156b7 62 4 DName::operator+=(DName const &)\n156b7 2 739 5804\n156b9 f 740 5804\n156c8 13 741 5804\n156db 2 742 5804\n156dd 9 743 5804\n156e6 6 744 5804\n156ec 2 745 5804\n156ee 7 747 5804\n156f5 6 749 5804\n156fb 9 750 5804\n15704 2 751 5804\n15706 d 752 5804\n15713 3 758 5804\n15716 3 760 5804\nFUNC 15719 8b 4 DName::operator+=(DName *)\n15719 2 764 5804\n1571b a 765 5804\n15725 9 766 5804\n1572e 8 767 5804\n15736 10 768 5804\n15746 8 789 5804\n1574e 20 770 5804\n1576e 4 773 5804\n15772 7 775 5804\n15779 6 777 5804\n1577f 8 778 5804\n15787 2 781 5804\n15789 3 782 5804\n1578c 5 784 5804\n15791 d 785 5804\n1579e 3 793 5804\n157a1 3 795 5804\nFUNC 157a4 1c 4 DName::operator=(char)\n157a4 1 847 5804\n157a5 15 854 5804\n157ba 3 856 5804\n157bd 3 858 5804\nFUNC 157c0 2a 4 DName::operator=(char const *)\n157c0 0 862 5804\n157c0 24 869 5804\n157e4 3 873 5804\n157e7 3 875 5804\nFUNC 157ea a6 0 UnDecorator::getCallingConvention()\n157ea 5 2825 5771\n157ef f 2826 5771\n157fe c 2828 5771\n1580a 5 2835 5771\n1580f 1a 2845 5771\n15829 20 2852 5771\n15849 2 2875 5771\n1584b 2 2876 5771\n1584d 2 2871 5771\n1584f 2 2872 5771\n15851 2 2867 5771\n15853 2 2868 5771\n15855 2 2863 5771\n15857 2 2864 5771\n15859 1 2859 5771\n1585a 2 2860 5771\n1585c 13 2855 5771\n1586f e 2891 5771\n1587d 4 2895 5771\n15881 d 2899 5771\n1588e 2 2901 5771\nFUNC 15890 37 0 UnDecorator::getVCallThunkType()\n15890 3 4057 5771\n15893 9 4059 5771\n1589c 5 4066 5771\n158a1 4 4059 5771\n158a5 4 4066 5771\n158a9 6 4061 5771\n158af c 4062 5771\n158bb a 4064 5771\n158c5 2 4170 5771\nFUNC 158c7 51 4 DName::operator+(DName const &)\n158c7 1 639 5804\n158c8 c 640 5804\n158d4 b 643 5804\n158df b 644 5804\n158ea d 645 5804\n158f7 11 646 5804\n15908 2 647 5804\n1590a 8 648 5804\n15912 3 652 5804\n15915 3 654 5804\nFUNC 15918 2e 4 DName::operator+(DName *)\n15918 1 658 5804\n15919 c 659 5804\n15925 9 662 5804\n1592e b 663 5804\n15939 2 664 5804\n1593b 5 665 5804\n15940 3 669 5804\n15943 3 671 5804\nFUNC 15946 6a 4 DName::operator+=(char)\n15946 1 693 5804\n15947 b 694 5804\n15952 9 695 5804\n1595b 6 696 5804\n15961 2 697 5804\n15963 7 699 5804\n1596a 6 701 5804\n15970 2b 702 5804\n1599b 2 703 5804\n1599d c 704 5804\n159a9 4 710 5804\n159ad 3 712 5804\nFUNC 159b0 6c 4 DName::operator+=(char const *)\n159b0 2 716 5804\n159b2 f 717 5804\n159c1 9 718 5804\n159ca 6 719 5804\n159d0 2 720 5804\n159d2 7 722 5804\n159d9 6 724 5804\n159df 28 725 5804\n15a07 2 726 5804\n15a09 d 727 5804\n15a16 3 733 5804\n15a19 3 735 5804\nFUNC 15a1c e0 0 UnDecorator::getArgumentList()\n15a1c 7 3076 5771\n15a23 12 3078 5771\n15a35 29 3081 5771\n15a5e 6 3085 5771\n15a64 4 3086 5771\n15a68 2 3087 5771\n15a6a e 3088 5771\n15a78 6 3093 5771\n15a7e 6 3095 5771\n15a84 5 3100 5771\n15a89 1 3102 5771\n15a8a 11 3106 5771\n15a9b 2 3109 5771\n15a9d 16 3116 5771\n15ab3 19 3121 5771\n15acc 9 3122 5771\n15ad5 17 3126 5771\n15aec b 3132 5771\n15af7 3 3141 5771\n15afa 2 3143 5771\nFUNC 15afc 4f 4 UnDecorator::getVdispMapType(DName const &)\n15afc 6 4230 5771\n15b02 d 4231 5771\n15b0f c 4232 5771\n15b1b 12 4233 5771\n15b2d 9 4234 5771\n15b36 a 4236 5771\n15b40 6 4237 5771\n15b46 3 4238 5771\n15b49 2 4239 5771\nFUNC 15b4b 22 8 operator+(char,DName const &)\n15b4b 22 198 5804\nFUNC 15b6d 22 8 operator+(DNameStatus,DName const &)\n15b6d 22 201 5804\nFUNC 15b8f 22 8 operator+(char const *,DName const &)\n15b8f 22 204 5804\nFUNC 15bb1 2e 4 DName::operator+(char)\n15bb1 1 605 5804\n15bb2 c 606 5804\n15bbe 9 609 5804\n15bc7 b 610 5804\n15bd2 2 611 5804\n15bd4 5 612 5804\n15bd9 3 616 5804\n15bdc 3 618 5804\nFUNC 15bdf 2e 4 DName::operator+(char const *)\n15bdf 1 622 5804\n15be0 c 623 5804\n15bec 9 626 5804\n15bf5 b 627 5804\n15c00 2 628 5804\n15c02 5 629 5804\n15c07 3 633 5804\n15c0a 3 635 5804\nFUNC 15c0d 141 4 UnDecorator::getDimension(bool)\n15c0d 7 1616 5771\n15c14 10 1618 5771\n15c24 e 1620 5771\n15c32 6 1623 5771\n15c38 f 1624 5771\n15c47 8 1625 5771\n15c4f 47 1626 5771\n15c96 4 1629 5771\n15c9a 4 1636 5771\n15c9e 8 1638 5771\n15ca6 20 1639 5771\n15cc6 d 1643 5771\n15cd3 4 1634 5771\n15cd7 b 1649 5771\n15ce2 2 1650 5771\n15ce4 5 1652 5771\n15ce9 13 1653 5771\n15cfc c 1637 5771\n15d08 4 1641 5771\n15d0c a 1653 5771\n15d16 36 1655 5771\n15d4c 2 1659 5771\nFUNC 15d4e d4 0 UnDecorator::getEnumType()\n15d4e 6 2762 5771\n15d54 1a 2766 5771\n15d6e 12 2770 5771\n15d80 5 2774 5771\n15d85 2 2775 5771\n15d87 5 2779 5771\n15d8c 2 2780 5771\n15d8e 5 2786 5771\n15d93 2 2787 5771\n15d95 d 2791 5771\n15da2 1f 2801 5771\n15dc1 1e 2807 5771\n15ddf e 2814 5771\n15ded 4 2795 5771\n15df1 d 2818 5771\n15dfe 24 2820 5771\nFUNC 15e22 c4 0 UnDecorator::getArgumentTypes()\n15e22 3 3035 5771\n15e25 18 3036 5771\n15e3d 9 3046 5771\n15e46 7 3051 5771\n15e4d 13 3052 5771\n15e60 c 3064 5771\n15e6c 36 3058 5771\n15ea2 b 3061 5771\n15ead 21 3039 5771\n15ece 16 3042 5771\n15ee4 2 3072 5771\nFUNC 15ee6 7e 0 UnDecorator::getThrowTypes()\n15ee6 3 3148 5771\n15ee9 e 3149 5771\n15ef7 2 3150 5771\n15ef9 21 3151 5771\n15f1a 1f 3153 5771\n15f39 29 3155 5771\n15f62 2 3157 5771\nFUNC 15f64 125 c UnDecorator::getExtendedDataIndirectType(char &,bool &,int)\n15f64 6 3636 5771\n15f6a 1a 3641 5771\n15f84 1c 3643 5771\n15fa0 a 3669 5771\n15faa 6 3670 5771\n15fb0 b 3672 5771\n15fbb a 3674 5771\n15fc5 21 3675 5771\n15fe6 17 3678 5771\n15ffd a 3680 5771\n16007 6 3689 5771\n1600d 2 3691 5771\n1600f 17 3693 5771\n16026 1e 3700 5771\n16044 6 3663 5771\n1604a 2 3665 5771\n1604c 3 3656 5771\n1604f d 3657 5771\n1605c 2 3659 5771\n1605e 6 3647 5771\n16064 13 3649 5771\n16077 10 3703 5771\n16087 2 3704 5771\nFUNC 16089 15f 4 UnDecorator::getArrayType(DName const &)\n16089 3 3986 5771\n1608c 12 3987 5771\n1609e 7 3989 5771\n160a5 4 3991 5771\n160a9 2 3992 5771\n160ab 4 3994 5771\n160af 9 3995 5771\n160b8 2a 4026 5771\n160e2 2 4028 5771\n160e4 c 3998 5771\n160f0 9 4000 5771\n160f9 d 4001 5771\n16106 35 4005 5771\n1613b b 4009 5771\n16146 4 4010 5771\n1614a 8 4011 5771\n16152 2 4012 5771\n16154 2c 4013 5771\n16180 d 4017 5771\n1618d 9 4018 5771\n16196 12 4019 5771\n161a8 a 4023 5771\n161b2 36 4024 5771\nFUNC 161e8 31 0 UnDecorator::getLexicalFrame()\n161e8 31 4031 5771\nFUNC 16219 12 0 UnDecorator::getDisplacement()\n16219 12 4048 5771\nFUNC 1622b 12 0 UnDecorator::getCallIndex()\n1622b 12 4049 5771\nFUNC 1623d 12 0 UnDecorator::getGuardNumber()\n1623d 12 4050 5771\nFUNC 1624f 150 4 UnDecorator::getVfTableType(DName const &)\n1624f 7 4174 5771\n16256 d 4175 5771\n16263 1d 4178 5771\n16280 2c 4180 5771\n162ac f 4182 5771\n162bb e 4184 5771\n162c9 5 4186 5771\n162ce 11 4188 5771\n162df 2d 4190 5771\n1630c b 4194 5771\n16317 7 4195 5771\n1631e 10 4199 5771\n1632e a 4200 5771\n16338 b 4188 5771\n16343 b 4204 5771\n1634e a 4206 5771\n16358 7 4207 5771\n1635f 9 4209 5771\n16368 a 4216 5771\n16372 6 4217 5771\n16378 2 4220 5771\n1637a 9 4221 5771\n16383 17 4222 5771\n1639a 3 4224 5771\n1639d 2 4226 5771\nFUNC 1639f a0 8 UnDecorator::getStringEncoding(char *,int)\n1639f 6 1447 5771\n163a5 b 1448 5771\n163b0 22 1451 5771\n163d2 6 1456 5771\n163d8 b 1459 5771\n163e3 b 1462 5771\n163ee 13 1464 5771\n16401 c 1466 5771\n1640d 5 1469 5771\n16412 6 1470 5771\n16418 4 1471 5771\n1641c 14 1477 5771\n16430 d 1452 5771\n1643d 2 1478 5771\nFUNC 1643f 50 0 UnDecorator::getSignedDimension()\n1643f 5 1603 5771\n16444 b 1604 5771\n1644f c 1605 5771\n1645b 2 1606 5771\n1645d 23 1608 5771\n16480 d 1611 5771\n1648d 2 1612 5771\nFUNC 1648f 2bb 0 UnDecorator::getTemplateConstant()\n1648f 15 1877 5771\n164a4 f 1884 5771\n164b3 32 1885 5771\n164e5 9 1921 5771\n164ee b 1922 5771\n164f9 20 1924 5771\n16519 12 1931 5771\n1652b e 1932 5771\n16539 3 1937 5771\n1653c 7 1939 5771\n16543 6 1941 5771\n16549 4 1942 5771\n1654d 2 1944 5771\n1654f 4 1945 5771\n16553 2a 1950 5771\n1657d a 1900 5771\n16587 6 1902 5771\n1658d 11 1903 5771\n1659e 1b 1906 5771\n165b9 b 1892 5771\n165c4 6 2034 5771\n165ca 7 1954 5771\n165d1 26 1885 5771\n165f7 b 1990 5771\n16602 c 1991 5771\n1660e 10 1992 5771\n1661e 9 1966 5771\n16627 c 1968 5771\n16633 e 1971 5771\n16641 10 1973 5771\n16651 6 1975 5771\n16657 6 1976 5771\n1665d 3 1980 5771\n16660 29 1981 5771\n16689 a 1983 5771\n16693 a 2001 5771\n1669d a 2003 5771\n166a7 13 2007 5771\n166ba a 2008 5771\n166c4 11 2012 5771\n166d5 13 2015 5771\n166e8 a 2016 5771\n166f2 13 2021 5771\n16705 a 2022 5771\n1670f 13 2026 5771\n16722 d 2029 5771\n1672f 7 1913 5771\n16736 14 2041 5771\nFUNC 1674a d9 8 UnDecorator::getPtrRefDataType(DName const &,int)\n1674a 3 3937 5771\n1674d 11 3940 5771\n1675e b 3944 5771\n16769 12 3948 5771\n1677b 12 3949 5771\n1678d 10 3951 5771\n1679d 5 3957 5771\n167a2 16 3961 5771\n167b8 d 3967 5771\n167c5 c 3968 5771\n167d1 b 3970 5771\n167dc 6 3972 5771\n167e2 1e 3974 5771\n16800 e 3976 5771\n1680e 13 3980 5771\n16821 2 3982 5771\nFUNC 16823 14 4 UnDecorator::getVbTableType(DName const &)\n16823 14 4053 5771\nFUNC 16837 1b8 0 UnDecorator::getTemplateArgumentList()\n16837 14 1775 5771\n1684b c 1777 5771\n16857 7 1778 5771\n1685e 2a 1781 5771\n16888 6 1785 5771\n1688e 4 1786 5771\n16892 2 1787 5771\n16894 e 1788 5771\n168a2 8 1793 5771\n168aa 5 1798 5771\n168af 1 1800 5771\n168b0 11 1804 5771\n168c1 5 1807 5771\n168c6 7 1810 5771\n168cd 7 1816 5771\n168d4 6 1817 5771\n168da 12 1818 5771\n168ec a 1820 5771\n168f6 5 1821 5771\n168fb e 1822 5771\n16909 5 1824 5771\n1690e 9 1830 5771\n16917 c 1832 5771\n16923 e 1835 5771\n16931 10 1837 5771\n16941 6 1839 5771\n16947 1 1840 5771\n16948 2 1842 5771\n1694a 25 1843 5771\n1696f 2 1846 5771\n16971 10 1847 5771\n16981 2 1850 5771\n16983 1f 1851 5771\n169a2 17 1857 5771\n169b9 9 1858 5771\n169c2 16 1862 5771\n169d8 17 1873 5771\nFUNC 169ef 56f 8 UnDecorator::getOperatorName(bool,bool *)\n169ef b 1095 5771\n169fa 53 1103 5771\n16a4d 13 1183 5771\n16a60 c 1439 5771\n16a6c 1d 1440 5771\n16a89 11 1442 5771\n16a9a 5 1444 5771\n16a9f 3 1124 5771\n16aa2 8 1126 5771\n16aaa 21 1127 5771\n16acb c 1129 5771\n16ad7 a 1130 5771\n16ae1 a 1133 5771\n16aeb 7 1135 5771\n16af2 3 1136 5771\n16af5 9 1144 5771\n16afe 5 1145 5771\n16b03 6 1148 5771\n16b09 2 1154 5771\n16b0b 15 1156 5771\n16b20 18 1160 5771\n16b38 1a 1161 5771\n16b52 10 1166 5771\n16b62 b 1167 5771\n16b6d 5 1170 5771\n16b72 6 1106 5771\n16b78 f 1108 5771\n16b87 21 1103 5771\n16ba8 3d 1220 5771\n16be5 18 1240 5771\n16bfd b 1234 5771\n16c08 5 1235 5771\n16c0d 13 1245 5771\n16c20 7 1247 5771\n16c27 8 1249 5771\n16c2f 18 1220 5771\n16c47 13 1255 5771\n16c5a 7 1256 5771\n16c61 2 1257 5771\n16c63 16 1335 5771\n16c79 7 1356 5771\n16c80 6 1350 5771\n16c86 2 1352 5771\n16c88 25 1220 5771\n16cad 13 1290 5771\n16cc0 17 1291 5771\n16cd7 24 1292 5771\n16cfb 14 1313 5771\n16d0f 6 1316 5771\n16d15 5 1317 5771\n16d1a 10 1302 5771\n16d2a 20 1303 5771\n16d4a 20 1304 5771\n16d6a 20 1305 5771\n16d8a 22 1306 5771\n16dac 12 1307 5771\n16dbe c 1296 5771\n16dca 2b 1297 5771\n16df5 13 1281 5771\n16e08 17 1282 5771\n16e1f 1a 1283 5771\n16e39 5 1284 5771\n16e3e 2d 1220 5771\n16e6b 25 1364 5771\n16e90 10 1373 5771\n16ea0 13 1378 5771\n16eb3 a 1397 5771\n16ebd 13 1399 5771\n16ed0 a 1403 5771\n16eda 6 1405 5771\n16ee0 2 1408 5771\n16ee2 13 1410 5771\n16ef5 d 1413 5771\n16f02 5 1415 5771\n16f07 10 1278 5771\n16f17 b 1330 5771\n16f22 5 1428 5771\n16f27 3 1187 5771\n16f2a 13 1216 5771\n16f3d 8 1437 5771\n16f45 19 1438 5771\nFUNC 16f5e 153 4 UnDecorator::getTemplateName(bool)\n16f5e 5 1700 5771\n16f63 1f 1704 5771\n16f82 16 1714 5771\n16f98 1d 1716 5771\n16fb5 23 1725 5771\n16fd8 e 1729 5771\n16fe6 6 1730 5771\n16fec 12 1732 5771\n16ffe 2 1734 5771\n17000 16 1735 5771\n17016 c 1738 5771\n17022 7 1739 5771\n17029 6 1746 5771\n1702f 21 1747 5771\n17050 c 1749 5771\n1705c a 1750 5771\n17066 a 1753 5771\n17070 6 1755 5771\n17076 6 1756 5771\n1707c 23 1769 5771\n1709f d 1705 5771\n170ac 5 1771 5771\nFUNC 170b1 1ea 4 UnDecorator::getZName(bool)\n170b1 10 1007 5771\n170c1 11 1008 5771\n170d2 3 1013 5771\n170d5 26 1043 5771\n170fb b 1024 5771\n17106 5 1026 5771\n1710b 16 1028 5771\n17121 16 1030 5771\n17137 17 1031 5771\n1714e 7 1033 5771\n17155 25 1040 5771\n1717a 5 1042 5771\n1717f 29 1043 5771\n171a8 8 1045 5771\n171b0 b 1051 5771\n171bb c 1053 5771\n171c7 e 1056 5771\n171d5 10 1058 5771\n171e5 4 1060 5771\n171e9 b 1061 5771\n171f4 2 1063 5771\n171f6 a 1064 5771\n17200 10 1065 5771\n17210 2 1068 5771\n17212 d 1069 5771\n1721f 2a 1070 5771\n17249 2 1073 5771\n1724b 1a 1076 5771\n17265 11 1083 5771\n17276 9 1084 5771\n1727f f 1087 5771\n1728e d 1090 5771\nFUNC 1729b e4 0 UnDecorator::getScopedName()\n1729b 7 2727 5771\n172a2 e 2728 5771\n172b0 15 2733 5771\n172c5 1a 2737 5771\n172df 2a 2738 5771\n17309 b 2742 5771\n17314 8 2743 5771\n1731c 4 2744 5771\n17320 1b 2745 5771\n1733b b 2746 5771\n17346 7 2747 5771\n1734d 2 2748 5771\n1734f 2b 2749 5771\n1737a 3 2753 5771\n1737d 2 2755 5771\nFUNC 1737f f 0 UnDecorator::getECSUName()\n1737f f 2758 5771\nFUNC 1738e 100 0 UnDecorator::getECSUDataType()\n1738e 3 3392 5771\n17391 20 3395 5771\n173b1 37 3399 5771\n173e8 5 3424 5771\n173ed 2 3425 5771\n173ef 5 3420 5771\n173f4 2 3421 5771\n173f6 26 3431 5771\n1741c 2 3432 5771\n1741e 5 3415 5771\n17423 2 3416 5771\n17425 5 3411 5771\n1742a 2 3412 5771\n1742c d 3407 5771\n17439 7 3439 5771\n17440 4 3441 5771\n17444 c 3442 5771\n17450 16 3446 5771\n17466 e 3450 5771\n17474 18 3404 5771\n1748c 2 3452 5771\nFUNC 1748e 46 0 UnDecorator::getSymbolName()\n1748e 3 989 5771\n17491 a 990 5771\n1749b 6 991 5771\n174a1 c 992 5771\n174ad 16 997 5771\n174c3 f 1001 5771\n174d2 2 1003 5771\nFUNC 174d4 92 0 UnDecorator::getBasedType()\n174d4 6 2653 5771\n174da 13 2654 5771\n174ed a 2659 5771\n174f7 17 2661 5771\n1750e c 2707 5771\n1751a 13 2699 5771\n1752d 2 2700 5771\n1752f d 2674 5771\n1753c 2 2711 5771\n1753e a 2712 5771\n17548 d 2716 5771\n17555 f 2720 5771\n17564 2 2722 5771\nFUNC 17566 b42 4 UnDecorator::composeDeclaration(DName const &)\n17566 6 2045 5771\n1756c e 2046 5771\n1757a 5 2047 5771\n1757f a 2048 5771\n17589 b 2053 5771\n17594 f 2054 5771\n175a3 8 2055 5771\n175ab 15 2056 5771\n175c0 8 2057 5771\n175c8 10 2058 5771\n175d8 83 2075 5771\n1765b 7 2081 5771\n17662 19 2082 5771\n1767b 21 2083 5771\n1769c 2 2084 5771\n1769e 15 2085 5771\n176b3 27 2090 5771\n176da 33 2092 5771\n1770d 9 2094 5771\n17716 9 2096 5771\n1771f 2b 2098 5771\n1774a d 2101 5771\n17757 9 2103 5771\n17760 2d 2105 5771\n1778d 2e 2107 5771\n177bb 5 2111 5771\n177c0 3 2114 5771\n177c3 3 2115 5771\n177c6 3 2116 5771\n177c9 3 2117 5771\n177cc 3 2118 5771\n177cf 26 2121 5771\n177f5 12 2123 5771\n17807 19 2125 5771\n17820 19 2126 5771\n17839 2 2127 5771\n1783b 12 2129 5771\n1784d 19 2131 5771\n17866 1b 2134 5771\n17881 13 2141 5771\n17894 a 2142 5771\n1789e 15 2143 5771\n178b3 2 2144 5771\n178b5 f 2145 5771\n178c4 10 2147 5771\n178d4 9 2151 5771\n178dd 22 2152 5771\n178ff 2 2153 5771\n17901 13 2168 5771\n17914 c 2172 5771\n17920 14 2173 5771\n17934 1a 2174 5771\n1794e 2 2175 5771\n17950 b 2176 5771\n1795b 5 2182 5771\n17960 6 2185 5771\n17966 27 2187 5771\n1798d b 2189 5771\n17998 5 2190 5771\n1799d 1b 2194 5771\n179b8 15 2195 5771\n179cd 1d 2202 5771\n179ea 16 2204 5771\n17a00 55 2205 5771\n17a55 12 2206 5771\n17a67 2b 2207 5771\n17a92 2 2208 5771\n17a94 d 2209 5771\n17aa1 1a 2211 5771\n17abb 2e 2218 5771\n17ae9 12 2222 5771\n17afb c 2223 5771\n17b07 c 2227 5771\n17b13 15 2228 5771\n17b28 2 2229 5771\n17b2a f 2230 5771\n17b39 1a 2235 5771\n17b53 b 2237 5771\n17b5e 3 2238 5771\n17b61 5 2243 5771\n17b66 b 2245 5771\n17b71 1c 2250 5771\n17b8d 13 2251 5771\n17ba0 e 2252 5771\n17bae 2 2253 5771\n17bb0 10 2254 5771\n17bc0 3d 2255 5771\n17bfd c 2256 5771\n17c09 e 2257 5771\n17c17 4c 2258 5771\n17c63 a 2259 5771\n17c6d 4b 2260 5771\n17cb8 7 2261 5771\n17cbf 4b 2262 5771\n17d0a f 2263 5771\n17d19 f 2264 5771\n17d28 6 2268 5771\n17d2e 61 2277 5771\n17d8f 15 2281 5771\n17da4 2 2283 5771\n17da6 18 2285 5771\n17dbe 2d 2292 5771\n17deb 12 2294 5771\n17dfd 37 2296 5771\n17e34 23 2297 5771\n17e57 b7 2299 5771\n17f0e 23 2300 5771\n17f31 12 2306 5771\n17f43 37 2307 5771\n17f7a b 2308 5771\n17f85 37 2309 5771\n17fbc b 2310 5771\n17fc7 30 2311 5771\n17ff7 23 2312 5771\n1801a 36 2319 5771\n18050 1e 2320 5771\n1806e 8 2325 5771\n18076 1e 2326 5771\n18094 12 2329 5771\n180a6 2 2331 5771\nFUNC 180a8 211 0 UnDecorator::getDecoratedName()\n180a8 7 861 5771\n180af e 864 5771\n180bd a 868 5771\n180c7 b 873 5771\n180d2 8 874 5771\n180da 11 876 5771\n180eb 10 878 5771\n180fb 6 882 5771\n18101 9 903 5771\n1810a 9 906 5771\n18113 8 910 5771\n1811b 6 912 5771\n18121 5 910 5771\n18126 2 915 5771\n18128 a 918 5771\n18132 19 919 5771\n1814b 6 920 5771\n18151 f 924 5771\n18160 8 925 5771\n18168 17 929 5771\n1817f a 930 5771\n18189 c 932 5771\n18195 8 933 5771\n1819d 5 934 5771\n181a2 18 935 5771\n181ba a 936 5771\n181c4 13 937 5771\n181d7 b 938 5771\n181e2 2 940 5771\n181e4 29 941 5771\n1820d 4 945 5771\n18211 10 946 5771\n18221 9 948 5771\n1822a 3 950 5771\n1822d 1c 955 5771\n18249 f 959 5771\n18258 4 976 5771\n1825c 6 962 5771\n18262 14 964 5771\n18276 19 967 5771\n1828f 5 968 5771\n18294 10 971 5771\n182a4 2 979 5771\n182a6 2 980 5771\n182a8 f 982 5771\n182b7 2 984 5771\nFUNC 182b9 28b 0 UnDecorator::getScope()\n182b9 d 1482 5771\n182c6 f 1483 5771\n182d5 2a 1489 5771\n182ff 14 1492 5771\n18313 b 1495 5771\n1831e 16 1496 5771\n18334 5 1498 5771\n18339 17 1499 5771\n18350 3 1500 5771\n18353 f 1506 5771\n18362 2a 1507 5771\n1838c 10 1566 5771\n1839c 5 1567 5771\n183a1 34 1561 5771\n183d5 4 1562 5771\n183d9 5 1563 5771\n183de e 1510 5771\n183ec 5 1514 5771\n183f1 22 1515 5771\n18413 e 1518 5771\n18421 6 1519 5771\n18427 5 1522 5771\n1842c 2a 1523 5771\n18456 2 1524 5771\n18458 f 1546 5771\n18467 1a 1548 5771\n18481 b 1550 5771\n1848c 9 1551 5771\n18495 2 1554 5771\n18497 f 1530 5771\n184a6 2 1570 5771\n184a8 21 1571 5771\n184c9 a 1489 5771\n184d3 f 1577 5771\n184e2 18 1590 5771\n184fa 2 1591 5771\n184fc b 1580 5771\n18507 7 1581 5771\n1850e 2 1582 5771\n18510 2b 1583 5771\n1853b 4 1597 5771\n1853f 5 1599 5771\nFUNC 18544 341 4 UnDecorator::getFunctionIndirectType(DName const &)\n18544 3 3461 5771\n18547 e 3462 5771\n18555 15 3463 5771\n1856a f 3465 5771\n18579 10 3466 5771\n18589 7 3469 5771\n18590 a 3471 5771\n1859a 6 3473 5771\n185a0 7 3475 5771\n185a7 d 3477 5771\n185b4 17 3482 5771\n185cb 9 3485 5771\n185d4 3 3486 5771\n185d7 5 3490 5771\n185dc f 3491 5771\n185eb 6 3496 5771\n185f1 13 3497 5771\n18604 b 3501 5771\n1860f 1e 3503 5771\n1862d 8 3505 5771\n18635 29 3506 5771\n1865e 2 3507 5771\n18660 17 3508 5771\n18677 f 3510 5771\n18686 4 3511 5771\n1868a 10 3518 5771\n1869a 15 3519 5771\n186af 9 3527 5771\n186b8 d 3528 5771\n186c5 30 3529 5771\n186f5 2 3530 5771\n186f7 11 3521 5771\n18708 7 3514 5771\n1870f 16 3516 5771\n18725 13 3531 5771\n18738 d 3535 5771\n18745 22 3537 5771\n18767 2 3546 5771\n18769 13 3547 5771\n1877c c 3551 5771\n18788 28 3552 5771\n187b0 1e 3557 5771\n187ce c 3558 5771\n187da 2e 3561 5771\n18808 10 3563 5771\n18818 c 3564 5771\n18824 c 3566 5771\n18830 15 3567 5771\n18845 2 3568 5771\n18847 f 3569 5771\n18856 4 3573 5771\n1885a b 3574 5771\n18865 e 3580 5771\n18873 10 3576 5771\n18883 2 3581 5771\nFUNC 18885 4e4 10 UnDecorator::getDataIndirectType(DName const &,char,DName const &,int)\n18885 6 3707 5771\n1888b 23 3711 5771\n188ae 4 3713 5771\n188b2 17 3715 5771\n188c9 c 3717 5771\n188d5 10 3719 5771\n188e5 e 3723 5771\n188f3 6 3725 5771\n188f9 15 3726 5771\n1890e 17 3732 5771\n18925 11 3751 5771\n18936 a 3752 5771\n18940 32 3753 5771\n18972 5 3754 5771\n18977 11 3743 5771\n18988 a 3744 5771\n18992 25 3745 5771\n189b7 2 3746 5771\n189b9 8 3747 5771\n189c1 2 3749 5771\n189c3 19 3735 5771\n189dc a 3736 5771\n189e6 14 3737 5771\n189fa 5 3738 5771\n189ff 11 3739 5771\n18a10 6 3766 5771\n18a16 a 3768 5771\n18a20 17 3770 5771\n18a37 10 3772 5771\n18a47 1a 3778 5771\n18a61 5 3780 5771\n18a66 6 3782 5771\n18a6c 9 3787 5771\n18a75 b 3789 5771\n18a80 19 3791 5771\n18a99 c 3793 5771\n18aa5 24 3794 5771\n18ac9 c 3796 5771\n18ad5 22 3797 5771\n18af7 9 3801 5771\n18b00 5 3805 5771\n18b05 7 3806 5771\n18b0c 6 3810 5771\n18b12 1e 3812 5771\n18b30 8 3814 5771\n18b38 1b 3815 5771\n18b53 2 3816 5771\n18b55 16 3817 5771\n18b6b a 3819 5771\n18b75 13 3828 5771\n18b88 b 3833 5771\n18b93 c 3834 5771\n18b9f 8 3835 5771\n18ba7 6 3836 5771\n18bad b 3842 5771\n18bb8 b 3843 5771\n18bc3 3 3863 5771\n18bc6 6 3864 5771\n18bcc 22 3866 5771\n18bee 9 3871 5771\n18bf7 13 3872 5771\n18c0a 5 3876 5771\n18c0f 1e 3877 5771\n18c2d 5 3879 5771\n18c32 1e 3880 5771\n18c50 5 3884 5771\n18c55 e 3885 5771\n18c63 14 3889 5771\n18c77 28 3895 5771\n18c9f 2 3890 5771\n18ca1 b 3891 5771\n18cac 2 3892 5771\n18cae c 3898 5771\n18cba 17 3899 5771\n18cd1 4 3902 5771\n18cd5 6 3904 5771\n18cdb 7 3906 5771\n18ce2 8 3774 5771\n18cea 13 3918 5771\n18cfd 12 3922 5771\n18d0f 29 3925 5771\n18d38 10 3923 5771\n18d48 c 3928 5771\n18d54 3 3929 5771\n18d57 10 3931 5771\n18d67 2 3933 5771\nFUNC 18d69 14c 0 UnDecorator::operator char *()\n18d69 6 762 5771\n18d6f 4 763 5771\n18d73 f 764 5771\n18d82 9 770 5771\n18d8b c 772 5771\n18d97 7 775 5771\n18d9e 1d 776 5771\n18dbb 4 782 5771\n18dbf 16 783 5771\n18dd5 9 785 5771\n18dde 5 794 5771\n18de3 9 795 5771\n18dec 13 799 5771\n18dff e 808 5771\n18e0d 2 809 5771\n18e0f 2 848 5771\n18e11 1a 810 5771\n18e2b e 813 5771\n18e39 e 811 5771\n18e47 9 817 5771\n18e50 e 819 5771\n18e5e d 820 5771\n18e6b a 824 5771\n18e75 f 825 5771\n18e84 5 828 5771\n18e89 2 829 5771\n18e8b 2 830 5771\n18e8d 5 831 5771\n18e92 1 832 5771\n18e93 5 833 5771\n18e98 1 835 5771\n18e99 5 834 5771\n18e9e 2 838 5771\n18ea0 a 839 5771\n18eaa 9 841 5771\n18eb3 2 848 5771\nFUNC 18eb5 116 c UnDecorator::getPtrRefType(DName const &,DName const &,char)\n18eb5 5 3585 5771\n18eba f 3588 5771\n18ec9 d 3589 5771\n18ed6 b 3591 5771\n18ee1 20 3594 5771\n18f01 b 3595 5771\n18f0c b 3597 5771\n18f17 9 3598 5771\n18f20 14 3600 5771\n18f34 14 3606 5771\n18f48 1b 3608 5771\n18f63 a 3612 5771\n18f6d b 3615 5771\n18f78 c 3617 5771\n18f84 9 3618 5771\n18f8d c 3620 5771\n18f99 c 3622 5771\n18fa5 a 3623 5771\n18faf b 3625 5771\n18fba f 3629 5771\n18fc9 2 3632 5771\nFUNC 18fcb 1b 8 UnDecorator::getPointerType(DName const &,DName const &)\n18fcb 1b 4037 5771\nFUNC 18fe6 1b 8 UnDecorator::getPointerTypeArray(DName const &,DName const &)\n18fe6 1b 4040 5771\nFUNC 19001 1b 8 UnDecorator::getReferenceType(DName const &,DName const &)\n19001 1b 4043 5771\nFUNC 1901c a3 18 __unDName\n1901c f 604 5771\n1902b 9 606 5771\n19034 4 607 5771\n19038 a 612 5771\n19042 2 613 5771\n19044 8 614 5771\n1904c 3 615 5771\n1904f 20 618 5771\n1906f 1a 627 5771\n19089 e 628 5771\n19097 a 633 5771\n190a1 c 636 5771\n190ad 3 643 5771\n190b0 6 645 5771\n190b6 9 637 5771\nFUNC 190bf a3 1c __unDNameEx\n190bf f 684 5771\n190ce 9 687 5771\n190d7 4 688 5771\n190db a 693 5771\n190e5 2 694 5771\n190e7 8 695 5771\n190ef 3 696 5771\n190f2 20 699 5771\n19112 1a 708 5771\n1912c e 709 5771\n1913a a 714 5771\n19144 c 717 5771\n19150 3 724 5771\n19153 6 726 5771\n19159 9 718 5771\nFUNC 19162 387 4 UnDecorator::getBasicDataType(DName const &)\n19162 3 3162 5771\n19165 15 3163 5771\n1917a 6 3165 5771\n19180 4 3168 5771\n19184 35 3173 5771\n191b9 5 3178 5771\n191be 5 3179 5771\n191c3 5 3183 5771\n191c8 5 3184 5771\n191cd 5 3188 5771\n191d2 5 3189 5771\n191d7 5 3193 5771\n191dc 5 3194 5771\n191e1 5 3203 5771\n191e6 5 3204 5771\n191eb 2a 3173 5771\n19215 3c 3222 5771\n19251 5 3231 5771\n19256 5 3232 5771\n1925b 22 3273 5771\n1927d 5 3235 5771\n19282 5 3236 5771\n19287 f 3222 5771\n19296 5 3243 5771\n1929b 5 3244 5771\n192a0 5 3239 5771\n192a5 5 3240 5771\n192aa 5 3247 5771\n192af 5 3248 5771\n192b4 1b 3222 5771\n192cf 3 3264 5771\n192d2 6 3262 5771\n192d8 10 3264 5771\n192e8 10 3266 5771\n192f8 11 3267 5771\n19309 5 3275 5771\n1930e 2 3276 5771\n19310 5 3255 5771\n19315 2 3257 5771\n19317 3 3224 5771\n1931a 12 3343 5771\n1932c 9 3345 5771\n19335 7 3347 5771\n1933c 16 3348 5771\n19352 6 3352 5771\n19358 d 3353 5771\n19365 5 3355 5771\n1936a 5 3227 5771\n1936f 2 3278 5771\n19371 d 3281 5771\n1937e 2 3282 5771\n19380 5 3219 5771\n19385 2 3220 5771\n19387 3 3287 5771\n1938a 5 3290 5771\n1938f d 3207 5771\n1939c d 3212 5771\n193a9 9 3297 5771\n193b2 1f 3301 5771\n193d1 19 3314 5771\n193ea c 3322 5771\n193f6 2 3326 5771\n193f8 c 3307 5771\n19404 2 3308 5771\n19406 1e 3311 5771\n19424 10 3332 5771\n19434 18 3333 5771\n1944c 5 3337 5771\n19451 c 3360 5771\n1945d 5 3367 5771\n19462 d 3369 5771\n1946f 5 3371 5771\n19474 d 3372 5771\n19481 2 3373 5771\n19483 5 3374 5771\n19488 d 3375 5771\n19495 17 3380 5771\n194ac 16 3385 5771\n194c2 27 3387 5771\nFUNC 194e9 13e 4 UnDecorator::getPrimaryDataType(DName const &)\n194e9 7 2962 5771\n194f0 2b 2966 5771\n1951b 12 3027 5771\n1952d d 2972 5771\n1953a c 2974 5771\n19546 a 2975 5771\n19550 b 2981 5771\n1955b 6 2984 5771\n19561 1e 2986 5771\n1957f 7 2996 5771\n19586 2 2997 5771\n19588 6 2998 5771\n1958e f 3000 5771\n1959d 8 3002 5771\n195a5 10 3004 5771\n195b5 2f 3022 5771\n195e4 16 3012 5771\n195fa 17 3008 5771\n19611 14 2969 5771\n19625 2 3030 5771\nFUNC 19627 b1 4 UnDecorator::getDataType(DName *)\n19627 6 2922 5771\n1962d b 2923 5771\n19638 15 2928 5771\n1964d 10 2954 5771\n1965d 6 2934 5771\n19663 c 2936 5771\n1966f f 2937 5771\n1967e 13 2939 5771\n19691 6 2944 5771\n19697 29 2946 5771\n196c0 2 2947 5771\n196c2 14 2931 5771\n196d6 2 2957 5771\nFUNC 196d8 64 4 UnDecorator::getExternalDataType(DName const &)\n196d8 7 4244 5771\n196df 1e 4247 5771\n196fd 9 4248 5771\n19706 30 4253 5771\n19736 4 4255 5771\n1973a 2 4257 5771\nFUNC 1973c 57 8 fastzero_I\nFUNC 19793 8f c _VEC_memzero\nFUNC 19822 14 0 _sse2_mathfcns_init\nFUNC 19836 14 4 _set_SSE2_enable\nFUNC 1984a 87 c fastcopy_I\nFUNC 198d1 e3 c _VEC_memcpy\nFUNC 199b4 1bd c __crtMessageBoxA\n199b4 9 41 4033\n199bd 5 49 4033\n199c2 2 56 4033\n199c4 18 64 4033\n199dc d 66 4033\n199e9 2 67 4033\n199eb 6 69 4033\n199f1 10 76 4033\n19a01 6 78 4033\n19a07 6 80 4033\n19a0d 15 83 4033\n19a22 1a 86 4033\n19a3c 1c 88 4033\n19a58 6 89 4033\n19a5e 8 95 4033\n19a66 6 98 4033\n19a6c a 100 4033\n19a76 14 102 4033\n19a8a 14 116 4033\n19a9e 6 119 4033\n19aa4 d 120 4033\n19ab1 c 122 4033\n19abd 1f 127 4033\n19adc 1b 136 4033\n19af7 6 137 4033\n19afd 7 138 4033\n19b04 2 139 4033\n19b06 7 140 4033\n19b0d 2 142 4033\n19b0f a 144 4033\n19b19 6 146 4033\n19b1f 5 147 4033\n19b24 2 149 4033\n19b26 11 153 4033\n19b37 6 155 4033\n19b3d 5 156 4033\n19b42 8 158 4033\n19b4a b 165 4033\n19b55 5 166 4033\n19b5a 10 168 4033\n19b6a 5 173 4033\n19b6f 2 176 4033\nFUNC 19b71 71 c strcat_s\n19b71 0 13 823\n19b71 30 18 823\n19ba1 c 19 823\n19bad 2 21 823\n19baf 4 23 823\n19bb3 1 25 823\n19bb4 3 26 823\n19bb7 2 29 823\n19bb9 2 32 823\n19bbb d 35 823\n19bc8 4 39 823\n19bcc 2 41 823\n19bce e 42 823\n19bdc 5 45 823\n19be1 1 46 823\nFUNC 19be2 b3 10 strncpy_s\n19be2 5 13 739\n19be7 14 17 739\n19bfb 5 65 739\n19c00 2 66 739\n19c02 26 24 739\n19c28 5 25 739\n19c2d 2 28 739\n19c2f 2 29 739\n19c31 b 31 739\n19c3c 8 35 739\n19c44 d 37 739\n19c51 2 41 739\n19c53 12 45 739\n19c65 5 48 739\n19c6a 2 50 739\n19c6c 4 54 739\n19c70 6 56 739\n19c76 3 58 739\n19c79 c 59 739\n19c85 2 61 739\n19c87 e 62 739\nFUNC 19c95 46 4 _set_error_mode\n19c95 0 43 3937\n19c95 15 50 3937\n19caa 6 58 3937\n19cb0 1 65 3937\n19cb1 5 54 3937\n19cb6 7 55 3937\n19cbd 1 65 3937\n19cbe 1c 61 3937\n19cda 1 65 3937\nFUNC 19cdb a 4 __set_app_type\n19cdb 0 91 3937\n19cdb 9 96 3937\n19ce4 1 97 3937\nFUNC 19ce5 6 0 __get_app_type\n19ce5 0 120 3937\n19ce5 5 125 3937\n19cea 1 126 3937\nFUNC 19ceb 51 10 x_ismbbtype_l\n19ceb 6 213 4669\n19cf1 b 214 4669\n19cfc 4 219 4669\n19d00 3a 222 4669\n19d3a 2 223 4669\nFUNC 19d3c 15 8 _ismbbkalnum_l\n19d3c 0 80 4669\n19d3c 14 81 4669\n19d50 1 82 4669\nFUNC 19d51 13 4 _ismbbkalnum\n19d51 0 85 4669\n19d51 12 86 4669\n19d63 1 87 4669\nFUNC 19d64 15 8 _ismbbkprint_l\n19d64 0 90 4669\n19d64 14 91 4669\n19d78 1 92 4669\nFUNC 19d79 13 4 _ismbbkprint\n19d79 0 95 4669\n19d79 12 96 4669\n19d8b 1 97 4669\nFUNC 19d8c 15 8 _ismbbkpunct_l\n19d8c 0 100 4669\n19d8c 14 101 4669\n19da0 1 102 4669\nFUNC 19da1 13 4 _ismbbkpunct\n19da1 0 105 4669\n19da1 12 106 4669\n19db3 1 107 4669\nFUNC 19db4 18 8 _ismbbalnum_l\n19db4 0 113 4669\n19db4 17 114 4669\n19dcb 1 115 4669\nFUNC 19dcc 16 4 _ismbbalnum\n19dcc 0 118 4669\n19dcc 15 119 4669\n19de1 1 120 4669\nFUNC 19de2 18 8 _ismbbalpha_l\n19de2 0 123 4669\n19de2 17 124 4669\n19df9 1 125 4669\nFUNC 19dfa 16 4 _ismbbalpha\n19dfa 0 128 4669\n19dfa 15 129 4669\n19e0f 1 130 4669\nFUNC 19e10 18 8 _ismbbgraph_l\n19e10 0 133 4669\n19e10 17 134 4669\n19e27 1 135 4669\nFUNC 19e28 16 4 _ismbbgraph\n19e28 0 138 4669\n19e28 15 139 4669\n19e3d 1 140 4669\nFUNC 19e3e 18 8 _ismbbprint_l\n19e3e 0 143 4669\n19e3e 17 144 4669\n19e55 1 145 4669\nFUNC 19e56 16 4 _ismbbprint\n19e56 0 148 4669\n19e56 15 149 4669\n19e6b 1 150 4669\nFUNC 19e6c 15 8 _ismbbpunct_l\n19e6c 0 153 4669\n19e6c 14 154 4669\n19e80 1 155 4669\nFUNC 19e81 13 4 _ismbbpunct\n19e81 0 158 4669\n19e81 12 159 4669\n19e93 1 160 4669\nFUNC 19e94 15 8 _ismbblead_l\n19e94 0 166 4669\n19e94 14 167 4669\n19ea8 1 168 4669\nFUNC 19ea9 13 4 _ismbblead\n19ea9 0 171 4669\n19ea9 12 172 4669\n19ebb 1 173 4669\nFUNC 19ebc 15 8 _ismbbtrail_l\n19ebc 0 176 4669\n19ebc 14 177 4669\n19ed0 1 178 4669\nFUNC 19ed1 13 4 _ismbbtrail\n19ed1 0 181 4669\n19ed1 12 182 4669\n19ee3 1 183 4669\nFUNC 19ee4 53 8 _ismbbkana_l\n19ee4 6 189 4669\n19eea b 190 4669\n19ef5 10 192 4669\n19f05 1f 194 4669\n19f24 2 197 4669\n19f26 f 196 4669\n19f35 2 197 4669\nFUNC 19f37 e 4 _ismbbkana\n19f37 0 200 4669\n19f37 d 201 4669\n19f44 1 202 4669\nFUNC 19f45 44 4 _getbuf\n19f45 0 43 1893\n19f45 6 50 1893\n19f4b 16 58 1893\n19f61 4 61 1893\n19f65 7 62 1893\n19f6c 2 65 1893\n19f6e 4 69 1893\n19f72 6 70 1893\n19f78 7 71 1893\n19f7f 3 75 1893\n19f82 6 76 1893\n19f88 1 79 1893\nFUNC 19f89 1de 8 _fputwc_nolock\n19f89 15 90 2124\n19f9e b 93 2124\n19fa9 48 95 2124\n19ff1 6 101 2124\n19ff7 45 104 2124\n1a03c 27 115 2124\n1a063 9 116 2124\n1a06c 22 120 2124\n1a08e 2 121 2124\n1a090 8 124 2124\n1a098 42 127 2124\n1a0da 17 133 2124\n1a0f1 6 139 2124\n1a0f7 7 141 2124\n1a0fe 34 143 2124\n1a132 6 146 2124\n1a138 6 150 2124\n1a13e d 151 2124\n1a14b d 153 2124\n1a158 f 154 2124\nFUNC 1a167 78 8 fputwc\n1a167 c 48 2124\n1a173 2e 52 2124\n1a1a1 3 55 2124\n1a1a4 7 57 2124\n1a1ab 3 58 2124\n1a1ae 11 60 2124\n1a1bf c 63 2124\n1a1cb 4 67 2124\n1a1cf 6 68 2124\n1a1d5 a 64 2124\nFUNC 1a1df 5 8 putwc\n1a1df 0 162 2124\n1a1df 5 163 2124\nFUNC 1a1e4 1f7 14 wcstoxl\n1a1e4 8 82 6173\n1a1ec b 88 6173\n1a1f7 3 92 6173\n1a1fa b 95 6173\n1a205 2f 97 6173\n1a234 12 98 6173\n1a246 9 103 6173\n1a24f 2 105 6173\n1a251 18 106 6173\n1a269 6 108 6173\n1a26f 4 109 6173\n1a273 2 110 6173\n1a275 6 112 6173\n1a27b 5 113 6173\n1a280 5 115 6173\n1a285 b 118 6173\n1a290 9 119 6173\n1a299 f 120 6173\n1a2a8 9 123 6173\n1a2b1 7 121 6173\n1a2b8 6 126 6173\n1a2be 1a 128 6173\n1a2d8 2 129 6173\n1a2da 5 130 6173\n1a2df d 135 6173\n1a2ec c 141 6173\n1a2f8 15 143 6173\n1a30d 12 144 6173\n1a31f 5 148 6173\n1a324 4 152 6173\n1a328 c 159 6173\n1a334 4 165 6173\n1a338 6 166 6173\n1a33e 9 178 6173\n1a347 6 181 6173\n1a34d 3 183 6173\n1a350 4 184 6173\n1a354 2 186 6173\n1a356 c 161 6173\n1a362 5 173 6173\n1a367 2 174 6173\n1a369 24 189 6173\n1a38d 5 192 6173\n1a392 c 193 6173\n1a39e 6 194 6173\n1a3a4 10 195 6173\n1a3b4 8 201 6173\n1a3bc 2 203 6173\n1a3be 6 205 6173\n1a3c4 3 207 6173\n1a3c7 12 209 6173\n1a3d9 2 210 6173\nFUNC 1a3db 29 c wcstol\n1a3db 3 217 6173\n1a3de 8 218 6173\n1a3e6 13 220 6173\n1a3f9 9 224 6173\n1a402 2 226 6173\nFUNC 1a404 1b 10 _wcstol_l\n1a404 0 234 6173\n1a404 1a 235 6173\n1a41e 1 236 6173\nFUNC 1a41f 2a c wcstoul\n1a41f 3 243 6173\n1a422 7 244 6173\n1a429 14 246 6173\n1a43d a 250 6173\n1a447 2 252 6173\nFUNC 1a449 1b 10 _wcstoul_l\n1a449 0 260 6173\n1a449 1a 261 6173\n1a463 1 262 6173\nFUNC 1a464 9 0 _fptrap\n1a464 0 46 2503\n1a464 8 47 2503\n1a46c 1 48 2503\nFUNC 1a46d 54 8 _isalpha_l\n1a46d 6 57 6535\n1a473 b 58 6535\n1a47e 41 60 6535\n1a4bf 2 61 6535\nFUNC 1a4c1 2b 4 isalpha\n1a4c1 0 66 6535\n1a4c1 9 67 6535\n1a4ca 13 69 6535\n1a4dd 1 75 6535\n1a4de d 73 6535\n1a4eb 1 75 6535\nFUNC 1a4ec 4f 8 _isupper_l\n1a4ec 6 81 6535\n1a4f2 b 82 6535\n1a4fd 3c 84 6535\n1a539 2 85 6535\nFUNC 1a53b 29 4 isupper\n1a53b 0 90 6535\n1a53b 9 91 6535\n1a544 11 93 6535\n1a555 1 99 6535\n1a556 d 97 6535\n1a563 1 99 6535\nFUNC 1a564 4f 8 _islower_l\n1a564 6 105 6535\n1a56a b 106 6535\n1a575 3c 108 6535\n1a5b1 2 109 6535\nFUNC 1a5b3 29 4 islower\n1a5b3 0 114 6535\n1a5b3 9 115 6535\n1a5bc 11 117 6535\n1a5cd 1 123 6535\n1a5ce d 121 6535\n1a5db 1 123 6535\nFUNC 1a5dc 4f 8 _isdigit_l\n1a5dc 6 129 6535\n1a5e2 b 130 6535\n1a5ed 3c 132 6535\n1a629 2 133 6535\nFUNC 1a62b 29 4 isdigit\n1a62b 0 138 6535\n1a62b 9 139 6535\n1a634 11 141 6535\n1a645 1 147 6535\n1a646 d 145 6535\n1a653 1 147 6535\nFUNC 1a654 54 8 _isxdigit_l\n1a654 6 153 6535\n1a65a b 154 6535\n1a665 41 156 6535\n1a6a6 2 157 6535\nFUNC 1a6a8 2b 4 isxdigit\n1a6a8 0 162 6535\n1a6a8 9 163 6535\n1a6b1 13 165 6535\n1a6c4 1 171 6535\n1a6c5 d 169 6535\n1a6d2 1 171 6535\nFUNC 1a6d3 4f 8 _isspace_l\n1a6d3 6 177 6535\n1a6d9 b 178 6535\n1a6e4 3c 180 6535\n1a720 2 181 6535\nFUNC 1a722 29 4 isspace\n1a722 0 186 6535\n1a722 9 187 6535\n1a72b 11 189 6535\n1a73c 1 195 6535\n1a73d d 193 6535\n1a74a 1 195 6535\nFUNC 1a74b 4f 8 _ispunct_l\n1a74b 6 201 6535\n1a751 b 202 6535\n1a75c 3c 204 6535\n1a798 2 205 6535\nFUNC 1a79a 29 4 ispunct\n1a79a 0 210 6535\n1a79a 9 211 6535\n1a7a3 11 213 6535\n1a7b4 1 219 6535\n1a7b5 d 217 6535\n1a7c2 1 219 6535\nFUNC 1a7c3 54 8 _isalnum_l\n1a7c3 6 225 6535\n1a7c9 b 226 6535\n1a7d4 41 228 6535\n1a815 2 229 6535\nFUNC 1a817 2b 4 isalnum\n1a817 0 234 6535\n1a817 9 235 6535\n1a820 13 237 6535\n1a833 1 243 6535\n1a834 d 241 6535\n1a841 1 243 6535\nFUNC 1a842 54 8 _isprint_l\n1a842 6 249 6535\n1a848 b 250 6535\n1a853 41 252 6535\n1a894 2 253 6535\nFUNC 1a896 2b 4 isprint\n1a896 0 258 6535\n1a896 9 259 6535\n1a89f 13 261 6535\n1a8b2 1 267 6535\n1a8b3 d 265 6535\n1a8c0 1 267 6535\nFUNC 1a8c1 54 8 _isgraph_l\n1a8c1 6 273 6535\n1a8c7 b 274 6535\n1a8d2 41 276 6535\n1a913 2 277 6535\nFUNC 1a915 2b 4 isgraph\n1a915 0 282 6535\n1a915 9 283 6535\n1a91e 13 285 6535\n1a931 1 291 6535\n1a932 d 289 6535\n1a93f 1 291 6535\nFUNC 1a940 4f 8 _iscntrl_l\n1a940 6 297 6535\n1a946 b 298 6535\n1a951 3c 300 6535\n1a98d 2 301 6535\nFUNC 1a98f 29 4 iscntrl\n1a98f 0 306 6535\n1a98f 9 307 6535\n1a998 11 309 6535\n1a9a9 1 315 6535\n1a9aa d 313 6535\n1a9b7 1 315 6535\nFUNC 1a9b8 d 4 __isascii\n1a9b8 0 320 6535\n1a9b8 c 321 6535\n1a9c4 1 322 6535\nFUNC 1a9c5 8 4 __toascii\n1a9c5 0 327 6535\n1a9c5 7 328 6535\n1a9cc 1 329 6535\nFUNC 1a9cd 1f 8 _iscsymf_l\n1a9cd 0 335 6535\n1a9cd 1a 336 6535\n1a9e7 1 337 6535\n1a9e8 3 336 6535\n1a9eb 1 337 6535\nFUNC 1a9ec 1a 4 __iscsymf\n1a9ec 0 341 6535\n1a9ec 15 342 6535\n1aa01 1 343 6535\n1aa02 3 342 6535\n1aa05 1 343 6535\nFUNC 1aa06 1f 8 _iscsym_l\n1aa06 0 349 6535\n1aa06 1a 350 6535\n1aa20 1 351 6535\n1aa21 3 350 6535\n1aa24 1 351 6535\nFUNC 1aa25 1c 4 __iscsym\n1aa25 0 356 6535\n1aa25 17 357 6535\n1aa3c 1 358 6535\n1aa3d 3 357 6535\n1aa40 1 358 6535\nFUNC 1aa41 12 8 _MarkAllocaS\n1aa41 0 207 2895\n1aa41 8 208 2895\n1aa49 6 210 2895\n1aa4f 3 211 2895\n1aa52 1 214 2895\nFUNC 1aa53 1b 4 _freea\n1aa53 0 249 2895\n1aa53 8 251 2895\n1aa5b 3 253 2895\n1aa5e 8 255 2895\n1aa66 7 257 2895\n1aa6d 1 266 2895\nFUNC 1aa6e 13b 18 __crtGetLocaleInfoW_stat\n1aa6e f 60 2876\n1aa7d 14 68 2876\n1aa91 d 70 2876\n1aa9e 8 71 2876\n1aaa6 b 73 2876\n1aab1 f 74 2876\n1aac0 5 79 2876\n1aac5 13 81 2876\n1aad8 7 86 2876\n1aadf 2 140 2876\n1aae1 8 96 2876\n1aae9 b 97 2876\n1aaf4 16 100 2876\n1ab0a 7 101 2876\n1ab11 48 104 2876\n1ab59 2 105 2876\n1ab5b 2 106 2876\n1ab5d e 110 2876\n1ab6b 7 113 2876\n1ab72 2 121 2876\n1ab74 2 123 2876\n1ab76 17 130 2876\n1ab8d 6 134 2876\n1ab93 4 136 2876\n1ab97 12 141 2876\nFUNC 1aba9 3b 18 __crtGetLocaleInfoW\n1aba9 6 151 2876\n1abaf b 152 2876\n1abba 28 161 2876\n1abe2 2 162 2876\nFUNC 1abe4 13d 18 __crtGetLocaleInfoA_stat\n1abe4 f 60 4251\n1abf3 17 68 4251\n1ac0a a 70 4251\n1ac14 8 71 4251\n1ac1c b 73 4251\n1ac27 f 74 4251\n1ac36 11 79 4251\n1ac47 4 86 4251\n1ac4b 5 96 4251\n1ac50 b 97 4251\n1ac5b 13 100 4251\n1ac6e 7 101 4251\n1ac75 49 104 4251\n1acbe 2 105 4251\n1acc0 2 106 4251\n1acc2 10 110 4251\n1acd2 3 114 4251\n1acd5 6 124 4251\n1acdb 2 126 4251\n1acdd 15 135 4251\n1acf2 7 139 4251\n1acf9 4 141 4251\n1acfd 12 81 4251\n1ad0f 12 145 4251\nFUNC 1ad21 3b 18 __crtGetLocaleInfoA\n1ad21 6 155 4251\n1ad27 b 156 4251\n1ad32 28 165 4251\n1ad5a 2 166 4251\nFUNC 1ad5c 1a 4 strncnt\n1ad5c 0 48 4203\n1ad5c 6 49 4203\n1ad62 6 52 4203\n1ad68 1 53 4203\n1ad69 5 52 4203\n1ad6e 7 55 4203\n1ad75 1 56 4203\nFUNC 1ad76 3a2 20 __crtLCMapStringA_stat\n1ad76 12 99 4203\n1ad88 d 108 4203\n1ad95 1b 109 4203\n1adb0 8 110 4203\n1adb8 b 111 4203\n1adc3 a 112 4203\n1adcd 5 119 4203\n1add2 19 120 4203\n1adeb 5 124 4203\n1adf0 1 125 4203\n1adf1 3 127 4203\n1adf4 16 133 4203\n1ae0a 9 213 4203\n1ae13 8 235 4203\n1ae1b 8 236 4203\n1ae23 27 247 4203\n1ae4a 6 248 4203\n1ae50 48 251 4203\n1ae98 3 252 4203\n1ae9b 6 253 4203\n1aea1 19 262 4203\n1aeba 21 271 4203\n1aedb 8 274 4203\n1aee3 9 277 4203\n1aeec 9 279 4203\n1aef5 12 288 4203\n1af07 5 292 4203\n1af0c 4b 298 4203\n1af57 4 299 4203\n1af5b 18 309 4203\n1af73 3 312 4203\n1af76 6 322 4203\n1af7c 2 325 4203\n1af7e 17 335 4203\n1af95 7 342 4203\n1af9c 8 344 4203\n1afa4 9 346 4203\n1afad b 141 4203\n1afb8 8 142 4203\n1afc0 5 143 4203\n1afc5 8 144 4203\n1afcd 11 146 4203\n1afde 7 147 4203\n1afe5 9 153 4203\n1afee 15 155 4203\n1b003 5 156 4203\n1b008 2 157 4203\n1b00a 1b 164 4203\n1b025 7 166 4203\n1b02c 41 169 4203\n1b06d 2 170 4203\n1b06f 28 196 4203\n1b097 2 183 4203\n1b099 2 184 4203\n1b09b 25 190 4203\n1b0c0 7 198 4203\n1b0c7 2 199 4203\n1b0c9 1a 202 4203\n1b0e3 5 204 4203\n1b0e8 9 205 4203\n1b0f1 c 206 4203\n1b0fd 7 207 4203\n1b104 2 208 4203\n1b106 12 350 4203\nFUNC 1b118 43 24 __crtLCMapStringA\n1b118 6 363 4203\n1b11e b 364 4203\n1b129 30 376 4203\n1b159 2 377 4203\nFUNC 1b15b 1b8 1c __crtGetStringTypeA_stat\n1b15b f 66 4155\n1b16a 10 75 4155\n1b17a 18 79 4155\n1b192 8 80 4155\n1b19a b 82 4155\n1b1a5 f 83 4155\n1b1b4 11 88 4155\n1b1c5 9 120 4155\n1b1ce 8 141 4155\n1b1d6 8 142 4155\n1b1de 27 153 4155\n1b205 6 154 4155\n1b20b 3e 157 4155\n1b249 2 158 4155\n1b24b 2 159 4155\n1b24d f 161 4155\n1b25c 13 169 4155\n1b26f 11 174 4155\n1b280 6 176 4155\n1b286 6 178 4155\n1b28c 2 90 4155\n1b28e 5 94 4155\n1b293 8 95 4155\n1b29b 5 96 4155\n1b2a0 8 97 4155\n1b2a8 e 99 4155\n1b2b6 4 100 4155\n1b2ba 5 104 4155\n1b2bf 17 106 4155\n1b2d6 2 107 4155\n1b2d8 2 108 4155\n1b2da 3 109 4155\n1b2dd 15 112 4155\n1b2f2 6 113 4155\n1b2f8 7 114 4155\n1b2ff 2 115 4155\n1b301 12 182 4155\nFUNC 1b313 40 20 __crtGetStringTypeA\n1b313 6 194 4155\n1b319 b 195 4155\n1b324 2d 206 4155\n1b351 2 207 4155\nFUNC 1b353 6 0 __pwctype_func\n1b353 0 24 3986\n1b353 5 25 3986\n1b358 1 26 3986\nFUNC 1b359 29 0 __pctype_func\n1b359 0 29 3986\n1b359 7 35 3986\n1b360 3 36 3986\n1b363 18 38 3986\n1b37b 6 39 3986\n1b381 1 40 3986\nFUNC 1b382 419 0 _get_lc_time\n1b382 6 94 3379\n1b388 12 104 3379\n1b39a 3 105 3379\n1b39d 2 170 3379\n1b39f 9 108 3379\n1b3a8 16 112 3379\n1b3be 15 113 3379\n1b3d3 15 114 3379\n1b3e8 18 115 3379\n1b400 15 116 3379\n1b415 13 117 3379\n1b428 14 118 3379\n1b43c 18 120 3379\n1b454 15 121 3379\n1b469 15 122 3379\n1b47e 15 123 3379\n1b493 18 124 3379\n1b4ab 15 125 3379\n1b4c0 15 126 3379\n1b4d5 15 128 3379\n1b4ea 18 129 3379\n1b502 15 130 3379\n1b517 15 131 3379\n1b52c 15 132 3379\n1b541 18 133 3379\n1b559 15 134 3379\n1b56e 15 135 3379\n1b583 15 136 3379\n1b598 18 137 3379\n1b5b0 15 138 3379\n1b5c5 15 139 3379\n1b5da 15 141 3379\n1b5ef 18 142 3379\n1b607 15 143 3379\n1b61c 15 144 3379\n1b631 15 145 3379\n1b646 18 146 3379\n1b65e 18 147 3379\n1b676 18 148 3379\n1b68e 18 149 3379\n1b6a6 1b 150 3379\n1b6c1 18 151 3379\n1b6d9 18 152 3379\n1b6f1 18 154 3379\n1b709 1b 155 3379\n1b724 18 160 3379\n1b73c 18 161 3379\n1b754 1b 163 3379\n1b76f 20 165 3379\n1b78f a 169 3379\n1b799 2 170 3379\nFUNC 1b79b 190 4 __free_lc_time\n1b79b 1 179 3379\n1b79c c 180 3379\n1b7a8 8 183 3379\n1b7b0 8 184 3379\n1b7b8 8 185 3379\n1b7c0 8 186 3379\n1b7c8 8 187 3379\n1b7d0 8 188 3379\n1b7d8 7 189 3379\n1b7df 8 191 3379\n1b7e7 8 192 3379\n1b7ef 8 193 3379\n1b7f7 8 194 3379\n1b7ff 8 195 3379\n1b807 8 196 3379\n1b80f 8 197 3379\n1b817 8 199 3379\n1b81f b 200 3379\n1b82a 8 201 3379\n1b832 8 202 3379\n1b83a 8 203 3379\n1b842 8 204 3379\n1b84a 8 205 3379\n1b852 8 206 3379\n1b85a 8 207 3379\n1b862 8 208 3379\n1b86a 8 209 3379\n1b872 8 210 3379\n1b87a 8 212 3379\n1b882 8 213 3379\n1b88a 8 214 3379\n1b892 8 215 3379\n1b89a 8 216 3379\n1b8a2 b 217 3379\n1b8ad b 218 3379\n1b8b8 b 219 3379\n1b8c3 b 220 3379\n1b8ce b 221 3379\n1b8d9 b 222 3379\n1b8e4 b 223 3379\n1b8ef b 225 3379\n1b8fa b 226 3379\n1b905 b 228 3379\n1b910 b 229 3379\n1b91b f 230 3379\n1b92a 1 232 3379\nFUNC 1b92b 73 4 __init_time\n1b92b 4 56 3379\n1b92f f 60 3379\n1b93e 16 64 3379\n1b954 4 65 3379\n1b958 b 67 3379\n1b963 6 69 3379\n1b969 8 70 3379\n1b971 2 71 3379\n1b973 6 73 3379\n1b979 2 74 3379\n1b97b 2 75 3379\n1b97d 18 78 3379\n1b995 2 82 3379\n1b997 6 83 3379\n1b99d 1 84 3379\nFUNC 1b99e 33 0 fix_grouping\n1b99e 0 32 3427\n1b99e 8 40 3427\n1b9a6 a 43 3427\n1b9b0 4 45 3427\n1b9b4 1 61 3427\n1b9b5 6 40 3427\n1b9bb 1 63 3427\n1b9bc 4 50 3427\n1b9c0 2 52 3427\n1b9c2 7 55 3427\n1b9c9 6 56 3427\n1b9cf 2 60 3427\nFUNC 1b9d1 40 4 __free_lconv_num\n1b9d1 1 211 3427\n1b9d2 8 212 3427\n1b9da a 215 3427\n1b9e4 7 216 3427\n1b9eb b 218 3427\n1b9f6 7 219 3427\n1b9fd b 221 3427\n1ba08 8 222 3427\n1ba10 1 223 3427\nFUNC 1ba11 1c8 4 __init_numeric\n1ba11 7 84 3427\n1ba18 4 92 3427\n1ba1c 2 93 3427\n1ba1e 11 96 3427\n1ba2f 3 177 3427\n1ba32 3 178 3427\n1ba35 c 179 3427\n1ba41 14 102 3427\n1ba55 8 103 3427\n1ba5d 9 108 3427\n1ba66 13 113 3427\n1ba79 9 115 3427\n1ba82 2 116 3427\n1ba84 2 118 3427\n1ba86 9 120 3427\n1ba8f 12 125 3427\n1baa1 8 127 3427\n1baa9 a 128 3427\n1bab3 7 129 3427\n1baba 2 131 3427\n1babc 19 140 3427\n1bad5 15 142 3427\n1baea 1b 144 3427\n1bb05 2 146 3427\n1bb07 c 148 3427\n1bb13 1e 154 3427\n1bb31 2 156 3427\n1bb33 17 154 3427\n1bb4a b 164 3427\n1bb55 9 165 3427\n1bb5e c 166 3427\n1bb6a 8 168 3427\n1bb72 7 169 3427\n1bb79 2 170 3427\n1bb7b 13 186 3427\n1bb8e 11 191 3427\n1bb9f b 193 3427\n1bbaa d 194 3427\n1bbb7 9 197 3427\n1bbc0 9 198 3427\n1bbc9 9 200 3427\n1bbd2 5 201 3427\n1bbd7 2 202 3427\nFUNC 1bbd9 33 0 fix_grouping\n1bbd9 0 214 3470\n1bbd9 8 222 3470\n1bbe1 a 225 3470\n1bbeb 4 227 3470\n1bbef 1 243 3470\n1bbf0 6 222 3470\n1bbf6 1 245 3470\n1bbf7 4 232 3470\n1bbfb 2 234 3470\n1bbfd 7 237 3470\n1bc04 6 238 3470\n1bc0a 2 242 3470\nFUNC 1bc0c 89 4 __free_lconv_mon\n1bc0c 1 255 3470\n1bc0d 8 256 3470\n1bc15 b 259 3470\n1bc20 7 260 3470\n1bc27 b 262 3470\n1bc32 7 263 3470\n1bc39 b 265 3470\n1bc44 7 266 3470\n1bc4b b 268 3470\n1bc56 7 269 3470\n1bc5d b 271 3470\n1bc68 7 272 3470\n1bc6f b 274 3470\n1bc7a 7 275 3470\n1bc81 b 277 3470\n1bc8c 8 278 3470\n1bc94 1 279 3470\nFUNC 1bc95 2c4 4 __init_monetary\n1bc95 8 65 3470\n1bc9d 6 73 3470\n1bca3 13 77 3470\n1bcb6 3 187 3470\n1bcb9 3 188 3470\n1bcbc a 189 3470\n1bcc6 11 83 3470\n1bcd7 8 84 3470\n1bcdf f 89 3470\n1bcee 7 91 3470\n1bcf5 2 92 3470\n1bcf7 2 94 3470\n1bcf9 9 96 3470\n1bd02 f 101 3470\n1bd11 6 103 3470\n1bd17 9 104 3470\n1bd20 2 105 3470\n1bd22 2 107 3470\n1bd24 4 112 3470\n1bd28 14 117 3470\n1bd3c 14 119 3470\n1bd50 14 121 3470\n1bd64 17 123 3470\n1bd7b 14 125 3470\n1bd8f 14 128 3470\n1bda3 14 130 3470\n1bdb7 17 133 3470\n1bdce 14 135 3470\n1bde2 14 137 3470\n1bdf6 14 139 3470\n1be0a 17 141 3470\n1be21 14 143 3470\n1be35 14 145 3470\n1be49 17 147 3470\n1be60 2 149 3470\n1be62 6 150 3470\n1be68 6 151 3470\n1be6e 8 152 3470\n1be76 b 153 3470\n1be81 5 154 3470\n1be86 1c 157 3470\n1bea2 2 159 3470\n1bea4 17 157 3470\n1bebb c 169 3470\n1bec7 3 175 3470\n1beca 32 181 3470\n1befc 11 194 3470\n1bf0d 15 199 3470\n1bf22 b 201 3470\n1bf2d d 202 3470\n1bf3a 9 204 3470\n1bf43 9 205 3470\n1bf4c 6 206 3470\n1bf52 5 208 3470\n1bf57 2 209 3470\nFUNC 1bf59 395 4 __init_ctype\n1bf59 11 59 3562\n1bf6a 6 60 3562\n1bf70 1f 82 3562\n1bf8f 7 84 3562\n1bf96 20 89 3562\n1bfb6 7 94 3562\n1bfbd 10 98 3562\n1bfcd b 100 3562\n1bfd8 b 102 3562\n1bfe3 12 104 3562\n1bff5 2f 106 3562\n1c024 5 109 3562\n1c029 2 112 3562\n1c02b e 113 3562\n1c039 15 115 3562\n1c04e a 118 3562\n1c058 4 121 3562\n1c05c 8 124 3562\n1c064 e 126 3562\n1c072 9 128 3562\n1c07b b 129 3562\n1c086 b 128 3562\n1c091 2c 140 3562\n1c0bd 33 155 3562\n1c0f0 2d 166 3562\n1c11d 37 178 3562\n1c154 11 180 3562\n1c165 17 182 3562\n1c17c 15 183 3562\n1c191 d 180 3562\n1c19e 12 189 3562\n1c1b0 f 190 3562\n1c1bf 12 191 3562\n1c1d1 18 195 3562\n1c1e9 11 198 3562\n1c1fa 13 199 3562\n1c20d e 200 3562\n1c21b e 201 3562\n1c229 9 203 3562\n1c232 6 204 3562\n1c238 9 206 3562\n1c241 9 207 3562\n1c24a 9 208 3562\n1c253 9 209 3562\n1c25c 9 210 3562\n1c265 9 213 3562\n1c26e 4 214 3562\n1c272 8 217 3562\n1c27a 8 218 3562\n1c282 8 219 3562\n1c28a 10 220 3562\n1c29a 13 227 3562\n1c2ad 2 231 3562\n1c2af 6 232 3562\n1c2b5 a 233 3562\n1c2bf a 234 3562\n1c2c9 a 235 3562\n1c2d3 a 236 3562\n1c2dd 2 238 3562\n1c2df f 240 3562\nFUNC 1c2ee 29 0 ___mb_cur_max_func\n1c2ee 0 248 3562\n1c2ee 7 254 3562\n1c2f5 3 255 3562\n1c2f8 18 257 3562\n1c310 6 259 3562\n1c316 1 260 3562\nFUNC 1c317 16 4 ___mb_cur_max_l_func\n1c317 0 263 3562\n1c317 15 264 3562\n1c32c 1 265 3562\nFUNC 1c32d 26 0 ___lc_codepage_func\n1c32d 0 268 3562\n1c32d 7 274 3562\n1c334 3 275 3562\n1c337 18 277 3562\n1c34f 3 279 3562\n1c352 1 280 3562\nFUNC 1c353 26 0 ___lc_collate_cp_func\n1c353 0 284 3562\n1c353 7 290 3562\n1c35a 3 291 3562\n1c35d 18 293 3562\n1c375 3 295 3562\n1c378 1 296 3562\nFUNC 1c379 26 0 ___lc_handle_func\n1c379 0 300 3562\n1c379 7 306 3562\n1c380 3 307 3562\n1c383 18 309 3562\n1c39b 3 311 3562\n1c39e 1 312 3562\nFUNC 1c39f 3 4 __init_collate\n1c39f 0 41 3650\n1c39f 2 42 3650\n1c3a1 1 43 3650\nFUNC 1c3a2 fe 4 _Getdays_l\n1c3a2 9 111 516\n1c3ab d 115 516\n1c3b8 9 117 516\n1c3c1 9 119 516\n1c3ca 28 120 516\n1c3f2 b 121 516\n1c3fd c 123 516\n1c409 4 126 516\n1c40d 30 128 516\n1c43d 8 129 516\n1c445 31 131 516\n1c476 12 132 516\n1c488 3 134 516\n1c48b 13 137 516\n1c49e 2 138 516\nFUNC 1c4a0 9 0 _Getdays\n1c4a0 0 142 516\n1c4a0 8 143 516\n1c4a8 1 144 516\nFUNC 1c4a9 fe 4 _Getmonths_l\n1c4a9 9 150 516\n1c4b2 d 154 516\n1c4bf 16 156 516\n1c4d5 2b 159 516\n1c500 b 160 516\n1c50b 8 162 516\n1c513 a 163 516\n1c51d 2d 167 516\n1c54a 8 168 516\n1c552 2c 170 516\n1c57e 11 171 516\n1c58f 3 173 516\n1c592 13 176 516\n1c5a5 2 177 516\nFUNC 1c5a7 9 0 _Getmonths\n1c5a7 0 181 516\n1c5a7 8 182 516\n1c5af 1 183 516\nFUNC 1c5b0 355 4 _Gettnames_l\n1c5b0 9 189 516\n1c5b9 d 193 516\n1c5c6 9 195 516\n1c5cf 9 197 516\n1c5d8 28 198 516\n1c600 d 199 516\n1c60d 29 200 516\n1c636 18 201 516\n1c64e 11 202 516\n1c65f f 203 516\n1c66e f 204 516\n1c67d 7 205 516\n1c684 e 206 516\n1c692 8 208 516\n1c69a 12 212 516\n1c6ac 13 213 516\n1c6bf 6 214 516\n1c6c5 2a 215 516\n1c6ef 6 216 516\n1c6f5 d 217 516\n1c702 26 218 516\n1c728 1c 219 516\n1c744 18 221 516\n1c75c 6 222 516\n1c762 26 223 516\n1c788 a 224 516\n1c792 5 225 516\n1c797 2a 226 516\n1c7c1 18 227 516\n1c7d9 30 230 516\n1c809 a 231 516\n1c813 30 233 516\n1c843 a 234 516\n1c84d 30 236 516\n1c87d a 237 516\n1c887 30 239 516\n1c8b7 a 240 516\n1c8c1 30 242 516\n1c8f1 12 245 516\n1c903 2 246 516\nFUNC 1c905 9 0 _Gettnames\n1c905 0 250 516\n1c905 8 251 516\n1c90d 1 252 516\nFUNC 1c90e 20 0 _store_str\n1c90e 0 869 516\n1c90e f 871 516\n1c91d 7 872 516\n1c924 9 873 516\n1c92d 1 875 516\nFUNC 1c92e 36 0 _store_number\n1c92e 0 965 516\n1c92e 8 973 516\n1c936 c 976 516\n1c942 2 977 516\n1c944 b 978 516\n1c94f 2 981 516\n1c951 2 982 516\n1c953 1 983 516\n1c954 7 988 516\n1c95b 3 989 516\n1c95e 5 990 516\n1c963 1 991 516\nFUNC 1c964 79 4 _store_num\n1c964 8 909 516\n1c96c 2 910 516\n1c96e 8 912 516\n1c976 33 913 516\n1c9a9 2 914 516\n1c9ab 4 917 516\n1c9af 8 918 516\n1c9b7 b 919 516\n1c9c2 c 921 516\n1c9ce 5 923 516\n1c9d3 2 924 516\n1c9d5 2 926 516\n1c9d7 4 927 516\n1c9db 2 928 516\nFUNC 1c9dd 3e6 10 _expandtime\n1c9dd 5 548 516\n1c9e2 4f 558 516\n1ca31 16 659 516\n1ca47 5 662 516\n1ca4c 16 587 516\n1ca62 7 589 516\n1ca69 5 590 516\n1ca6e 16 571 516\n1ca84 7 573 516\n1ca8b 5 574 516\n1ca90 5 822 516\n1ca95 7 823 516\n1ca9c 5 824 516\n1caa1 16 667 516\n1cab7 10 668 516\n1cac7 2 669 516\n1cac9 5 672 516\n1cace 23 558 516\n1caf1 6 787 516\n1caf7 5 789 516\n1cafc 15 736 516\n1cb11 2 737 516\n1cb13 2 739 516\n1cb15 5 740 516\n1cb1a 15 722 516\n1cb2f 2 723 516\n1cb31 16 742 516\n1cb47 4 743 516\n1cb4b 2 744 516\n1cb4d 5 745 516\n1cb52 6 746 516\n1cb58 8 747 516\n1cb60 1 748 516\n1cb61 5 752 516\n1cb66 f 715 516\n1cb75 5 718 516\n1cb7a 3 696 516\n1cb7d 2 699 516\n1cb7f 1d 804 516\n1cb9c 6 806 516\n1cba2 d 808 516\n1cbaf 2 809 516\n1cbb1 37 558 516\n1cbe8 19 678 516\n1cc01 8 680 516\n1cc09 2 681 516\n1cc0b 15 650 516\n1cc20 13 652 516\n1cc33 5 653 516\n1cc38 1e 601 516\n1cc56 2 603 516\n1cc58 5 606 516\n1cc5d 2 607 516\n1cc5f 2 608 516\n1cc61 25 615 516\n1cc86 2 617 516\n1cc88 1 627 516\n1cc89 2 642 516\n1cc8b e 579 516\n1cc99 7 581 516\n1cca0 5 582 516\n1cca5 2d 562 516\n1ccd2 6 564 516\n1ccd8 5 565 516\n1ccdd e 687 516\n1cceb 3 689 516\n1ccee 5 690 516\n1ccf3 15 558 516\n1cd08 2 834 516\n1cd0a 5 814 516\n1cd0f 19 817 516\n1cd28 5 819 516\n1cd2d d 795 516\n1cd3a b 798 516\n1cd45 5 799 516\n1cd4a 11 762 516\n1cd5b 5 764 516\n1cd60 1 774 516\n1cd61 5 776 516\n1cd66 16 729 516\n1cd7c 6 731 516\n1cd82 5 732 516\n1cd87 16 704 516\n1cd9d 3 705 516\n1cda0 b 706 516\n1cdab 2 707 516\n1cdad e 708 516\n1cdbb 6 839 516\n1cdc1 2 840 516\nFUNC 1cdc3 45d 18 _store_winword\n1cdc3 10 1035 516\n1cdd3 5 1043 516\n1cdd8 a 1053 516\n1cde2 3 1043 516\n1cde5 6 1053 516\n1cdeb 2 1054 516\n1cded 6 1049 516\n1cdf3 2 1050 516\n1cdf5 6 1046 516\n1cdfb 10 1057 516\n1ce0b 4 1066 516\n1ce0f 8 1067 516\n1ce17 6 1069 516\n1ce1d d 1075 516\n1ce2a a 1076 516\n1ce34 8 1077 516\n1ce3c 4 1078 516\n1ce40 2a 1085 516\n1ce6a b 1087 516\n1ce75 31 1092 516\n1cea6 7 1093 516\n1cead 3 1097 516\n1ceb0 13 1100 516\n1cec3 10 1101 516\n1ced3 b 1102 516\n1cede b 1103 516\n1cee9 9 1106 516\n1cef2 3 1291 516\n1cef5 12 1292 516\n1cf07 11 1114 516\n1cf18 5 1117 516\n1cf1d b 1120 516\n1cf28 37 1125 516\n1cf5f 14 1274 516\n1cf73 c 1277 516\n1cf7f 8 1283 516\n1cf87 4 1284 516\n1cf8b 9 1286 516\n1cf94 c 1287 516\n1cfa0 5 1277 516\n1cfa5 e 1128 516\n1cfb3 7 1133 516\n1cfba 7 1132 516\n1cfc1 7 1130 516\n1cfc8 2 1131 516\n1cfca 5 1134 516\n1cfcf a 1156 516\n1cfd9 7 1158 516\n1cfe0 2 1159 516\n1cfe2 5 1160 516\n1cfe7 11 1175 516\n1cff8 5 1176 516\n1cffd 11 1177 516\n1d00e 6 1178 516\n1d014 2 1179 516\n1d016 5 1180 516\n1d01b b 1225 516\n1d026 13 1226 516\n1d039 4 1228 516\n1d03d 1a 1233 516\n1d057 9 1236 516\n1d060 8 1242 516\n1d068 4 1243 516\n1d06c 9 1246 516\n1d075 8 1247 516\n1d07d 5 1277 516\n1d082 1 1230 516\n1d083 5 1250 516\n1d088 12 1136 516\n1d09a 7 1141 516\n1d0a1 7 1140 516\n1d0a8 7 1138 516\n1d0af 2 1139 516\n1d0b1 5 1142 516\n1d0b6 29 1125 516\n1d0df e 1144 516\n1d0ed 7 1147 516\n1d0f4 2 1146 516\n1d0f6 5 1148 516\n1d0fb 7 1182 516\n1d102 b 1183 516\n1d10d 2 1184 516\n1d10f 6 1185 516\n1d115 12 1187 516\n1d127 17 1188 516\n1d13e c 1191 516\n1d14a 8 1197 516\n1d152 4 1198 516\n1d156 8 1201 516\n1d15e 2 1202 516\n1d160 5 1203 516\n1d165 9 1204 516\n1d16e 1a 1205 516\n1d188 9 1207 516\n1d191 8 1212 516\n1d199 4 1213 516\n1d19d 9 1215 516\n1d1a6 8 1216 516\n1d1ae 2 1220 516\n1d1b0 d 1168 516\n1d1bd 7 1170 516\n1d1c4 2 1171 516\n1d1c6 2 1172 516\n1d1c8 d 1162 516\n1d1d5 7 1164 516\n1d1dc 2 1165 516\n1d1de 2 1166 516\n1d1e0 d 1150 516\n1d1ed 7 1152 516\n1d1f4 2 1153 516\n1d1f6 1b 1268 516\n1d211 3 1272 516\n1d214 5 1273 516\n1d219 7 1194 516\nFUNC 1d220 1af 18 _Strftime_l\n1d220 6 356 516\n1d226 4 361 516\n1d22a 13 362 516\n1d23d 33 364 516\n1d270 33 365 516\n1d2a3 d 368 516\n1d2b0 10 375 516\n1d2c0 e 385 516\n1d2ce a 387 516\n1d2d8 1e 435 516\n1d2f6 4 438 516\n1d2fa a 446 516\n1d304 5 447 516\n1d309 b 452 516\n1d314 3 453 516\n1d317 2 454 516\n1d319 7 400 516\n1d320 1 405 516\n1d321 2 408 516\n1d323 5 409 516\n1d328 1 411 516\n1d329 1 412 516\n1d32a 1d 415 516\n1d347 1 428 516\n1d348 5 385 516\n1d34d 5 464 516\n1d352 5 469 516\n1d357 13 470 516\n1d36a 3 441 516\n1d36d f 478 516\n1d37c b 481 516\n1d387 2 483 516\n1d389 b 402 516\n1d394 2 403 516\n1d396 5 421 516\n1d39b 7 423 516\n1d3a2 2 464 516\n1d3a4 18 485 516\n1d3bc 11 488 516\n1d3cd 2 490 516\nFUNC 1d3cf 1e 14 _strftime_l\n1d3cf 3 291 516\n1d3d2 19 292 516\n1d3eb 2 293 516\nFUNC 1d3ed 1d 10 strftime\n1d3ed 0 300 516\n1d3ed 1c 301 516\n1d409 1 302 516\nFUNC 1d40a 1e 14 _Strftime\n1d40a 3 343 516\n1d40d 19 345 516\n1d426 2 346 516\nFUNC 1d428 26 0 localeconv\n1d428 0 69 3302\n1d428 5 75 3302\n1d42d 1b 78 3302\n1d448 5 79 3302\n1d44d 1 80 3302\nFUNC 1d450 46 8 strcspn\n1d450 4 191 924\n1d454 2 198 924\n1d456 1 199 924\n1d457 1 200 924\n1d458 1 201 924\n1d459 1 202 924\n1d45a 1 203 924\n1d45b 1 204 924\n1d45c 1 205 924\n1d45d 1 206 924\n1d45e 6 212 924\n1d464 2 216 924\n1d466 2 217 924\n1d468 2 218 924\n1d46a 3 219 924\n1d46d 4 220 924\n1d471 2 221 924\n1d473 3 227 924\n1d476 6 229 924\n1d47c 3 234 924\n1d47f 2 236 924\n1d481 2 237 924\n1d483 2 238 924\n1d485 3 239 924\n1d488 4 240 924\n1d48c 2 245 924\n1d48e 2 255 924\n1d490 3 257 924\n1d493 3 259 924\nFUNC 1d496 60 c TranslateName\n1d496 3 340 3849\n1d499 3 342 3849\n1d49c 3 343 3849\n1d49f b 346 3849\n1d4aa a 348 3849\n1d4b4 14 349 3849\n1d4c8 6 351 3849\n1d4ce a 352 3849\n1d4d8 2 353 3849\n1d4da 4 354 3849\n1d4de 2 355 3849\n1d4e0 3 356 3849\n1d4e3 7 346 3849\n1d4ea a 359 3849\n1d4f4 2 360 3849\nFUNC 1d4f6 14 0 GetLcidFromDefault\n1d4f6 0 761 3849\n1d4f6 7 762 3849\n1d4fd c 763 3849\n1d509 1 764 3849\nFUNC 1d50a 77 0 ProcessCodePage\n1d50a 13 784 3849\n1d51d 1a 787 3849\n1d537 11 795 3849\n1d548 8 799 3849\n1d550 2 801 3849\n1d552 18 791 3849\n1d56a 3 793 3849\n1d56d 7 805 3849\n1d574 d 806 3849\nFUNC 1d581 1e 4 TestDefaultCountry\n1d581 0 826 3849\n1d581 2 830 3849\n1d583 15 832 3849\n1d598 3 835 3849\n1d59b 1 836 3849\n1d59c 2 833 3849\n1d59e 1 836 3849\nFUNC 1d59f 32 0 LcidFromHexString\n1d59f 1 893 3849\n1d5a0 2 895 3849\n1d5a2 2 897 3849\n1d5a4 9 899 3849\n1d5ad 5 900 3849\n1d5b2 8 901 3849\n1d5ba 3 902 3849\n1d5bd 10 903 3849\n1d5cd 3 906 3849\n1d5d0 1 907 3849\nFUNC 1d5d1 1b 0 GetPrimaryLen\n1d5d1 0 926 3849\n1d5d1 2 927 3849\n1d5d3 3 930 3849\n1d5d6 12 931 3849\n1d5e8 1 933 3849\n1d5e9 2 935 3849\n1d5eb 1 938 3849\nFUNC 1d5ec 96 4 CountryEnumProc\n1d5ec 15 717 3849\n1d601 7 718 3849\n1d608 f 719 3849\n1d617 23 725 3849\n1d63a 3 728 3849\n1d63d 3 729 3849\n1d640 12 731 3849\n1d652 b 734 3849\n1d65d a 738 3849\n1d667 b 741 3849\n1d672 10 742 3849\nFUNC 1d682 72 8 TestDefaultLanguage\n1d682 11 858 3849\n1d693 22 864 3849\n1d6b5 4 865 3849\n1d6b9 d 867 3849\n1d6c6 1c 871 3849\n1d6e2 2 872 3849\n1d6e4 3 874 3849\n1d6e7 d 875 3849\nFUNC 1d6f4 1d0 4 LangCountryEnumProc\n1d6f4 16 435 3849\n1d70a 7 436 3849\n1d711 d 437 3849\n1d71e 27 444 3849\n1d745 4 447 3849\n1d749 8 448 3849\n1d751 16 450 3849\n1d767 1d 456 3849\n1d784 2 460 3849\n1d786 11 462 3849\n1d797 7 467 3849\n1d79e 5 468 3849\n1d7a3 6 472 3849\n1d7a9 1a 475 3849\n1d7c3 14 482 3849\n1d7d7 3 483 3849\n1d7da a 487 3849\n1d7e4 b 490 3849\n1d7ef 6 493 3849\n1d7f5 3 494 3849\n1d7f8 12 501 3849\n1d80a 1d 506 3849\n1d827 6 510 3849\n1d82d c 513 3849\n1d839 16 518 3849\n1d84f 8 522 3849\n1d857 14 528 3849\n1d86b 2 531 3849\n1d86d 2 540 3849\n1d86f 1b 550 3849\n1d88a f 553 3849\n1d899 7 557 3849\n1d8a0 5 558 3849\n1d8a5 3 559 3849\n1d8a8 b 566 3849\n1d8b3 11 567 3849\nFUNC 1d8c4 bf 4 LanguageEnumProc\n1d8c4 15 624 3849\n1d8d9 7 625 3849\n1d8e0 f 626 3849\n1d8ef 23 632 3849\n1d912 3 635 3849\n1d915 3 636 3849\n1d918 11 639 3849\n1d929 7 643 3849\n1d930 2 650 3849\n1d932 1d 651 3849\n1d94f f 654 3849\n1d95e a 658 3849\n1d968 b 662 3849\n1d973 10 663 3849\nFUNC 1d983 2c 0 GetLcidFromCountry\n1d983 0 686 3849\n1d983 10 687 3849\n1d993 11 689 3849\n1d9a4 6 693 3849\n1d9aa 4 694 3849\n1d9ae 1 695 3849\nFUNC 1d9af 65 0 GetLcidFromLangCountry\n1d9af 0 386 3849\n1d9af 7 388 3849\n1d9b6 1a 389 3849\n1d9d0 5 390 3849\n1d9d5 17 392 3849\n1d9ec 10 394 3849\n1d9fc 13 402 3849\n1da0f 4 403 3849\n1da13 1 404 3849\nFUNC 1da14 3c 0 GetLcidFromLanguage\n1da14 0 591 3849\n1da14 13 593 3849\n1da27 e 594 3849\n1da35 10 596 3849\n1da45 6 600 3849\n1da4b 4 601 3849\n1da4f 1 602 3849\nFUNC 1da50 1e3 c __get_qualified_locale\n1da50 4 205 3849\n1da54 5 208 3849\n1da59 12 212 3849\n1da6b 7 215 3849\n1da72 5 217 3849\n1da77 3 222 3849\n1da7a f 223 3849\n1da89 10 226 3849\n1da99 d 230 3849\n1daa6 a 232 3849\n1dab0 5 235 3849\n1dab5 2 237 3849\n1dab7 5 240 3849\n1dabc 5 243 3849\n1dac1 14 248 3849\n1dad5 a 250 3849\n1dadf 5 252 3849\n1dae4 2 254 3849\n1dae6 5 256 3849\n1daeb 2 261 3849\n1daed a 263 3849\n1daf7 28 266 3849\n1db1f 2 268 3849\n1db21 13 271 3849\n1db34 3 277 3849\n1db37 6 278 3849\n1db3d 17 281 3849\n1db54 32 285 3849\n1db86 d 289 3849\n1db93 6 290 3849\n1db99 8 293 3849\n1dba1 7 295 3849\n1dba8 8 296 3849\n1dbb0 4 297 3849\n1dbb4 8 301 3849\n1dbbc d 305 3849\n1dbc9 23 306 3849\n1dbec 2 307 3849\n1dbee f 308 3849\n1dbfd 2 309 3849\n1dbff 12 311 3849\n1dc11 2 312 3849\n1dc13 14 313 3849\n1dc27 5 315 3849\n1dc2c 6 286 3849\n1dc32 1 316 3849\nFUNC 1dc33 12 0 cmpResult\nFUNC 1dc45 18 0 cmpBYTE\nFUNC 1dc5d 40 0 cmpWORD\nFUNC 1dc9d 78 0 cmpDWORD\nFUNC 1dd15 1490 0 unaligned_memcmp\nFUNC 1f1a5 1680 c memcmp\nFUNC 20825 be c strncmp\n20825 4 42 876\n20829 5 43 876\n2082e 7 45 876\n20835 7 46 876\n2083c 6 48 876\n20842 d 51 876\n2084f 11 56 876\n20860 c 61 876\n2086c c 66 876\n20878 15 71 876\n2088d 2 81 876\n2088f a 73 876\n20899 a 68 876\n208a3 a 63 876\n208ad 10 58 876\n208bd 2 79 876\n208bf a 81 876\n208c9 1 85 876\n208ca 4 86 876\n208ce 5 79 876\n208d3 4 89 876\n208d7 2 90 876\n208d9 a 83 876\nFUNC 208f0 40 8 strpbrk\n208f0 4 191 869\n208f4 2 198 869\n208f6 1 199 869\n208f7 1 200 869\n208f8 1 201 869\n208f9 1 202 869\n208fa 1 203 869\n208fb 1 204 869\n208fc 1 205 869\n208fd 1 206 869\n208fe 6 212 869\n20904 2 216 869\n20906 2 217 869\n20908 2 218 869\n2090a 3 219 869\n2090d 4 220 869\n20911 2 221 869\n20913 5 227 869\n20918 2 236 869\n2091a 2 237 869\n2091c 2 238 869\n2091e 3 239 869\n20921 4 240 869\n20925 2 247 869\n20927 3 248 869\n2092a 3 257 869\n2092d 3 259 869\nFUNC 20930 82 c _iswctype_l\n20930 6 66 6445\n20936 8 69 6445\n2093e 6 70 6445\n20944 8 71 6445\n2094c 18 72 6445\n20964 2 73 6445\n20966 b 75 6445\n20971 25 85 6445\n20996 3 86 6445\n20999 d 87 6445\n209a6 a 89 6445\n209b0 2 90 6445\nFUNC 209b2 6e 8 iswctype\n209b2 4 96 6445\n209b6 8 97 6445\n209be 2 99 6445\n209c0 2 122 6445\n209c2 8 101 6445\n209ca 14 103 6445\n209de 2 122 6445\n209e0 9 106 6445\n209e9 25 117 6445\n20a0e 10 121 6445\n20a1e 2 122 6445\nFUNC 20a20 5 8 is_wctype\n20a20 0 148 6445\n20a20 5 149 6445\nFUNC 20a25 22b 14 strtoxl\n20a25 8 80 6309\n20a2d b 86 6309\n20a38 3 89 6309\n20a3b b 92 6309\n20a46 30 94 6309\n20a76 11 95 6309\n20a87 c 100 6309\n20a93 34 101 6309\n20ac7 5 102 6309\n20acc 5 104 6309\n20ad1 4 105 6309\n20ad5 2 106 6309\n20ad7 5 108 6309\n20adc 3 109 6309\n20adf 1d 111 6309\n20afc 4 118 6309\n20b00 5 121 6309\n20b05 9 122 6309\n20b0e a 123 6309\n20b18 9 126 6309\n20b21 7 124 6309\n20b28 2 129 6309\n20b2a 5 140 6309\n20b2f f 142 6309\n20b3e 1 143 6309\n20b3f 9 144 6309\n20b48 8 149 6309\n20b50 c 154 6309\n20b5c 8 155 6309\n20b64 7 156 6309\n20b6b 13 157 6309\n20b7e 5 160 6309\n20b83 4 164 6309\n20b87 b 171 6309\n20b92 4 177 6309\n20b96 6 178 6309\n20b9c 8 190 6309\n20ba4 6 193 6309\n20baa 3 195 6309\n20bad 4 196 6309\n20bb1 2 198 6309\n20bb3 c 173 6309\n20bbf 3 185 6309\n20bc2 2 186 6309\n20bc4 24 201 6309\n20be8 5 204 6309\n20bed c 205 6309\n20bf9 6 206 6309\n20bff 10 207 6309\n20c0f 7 213 6309\n20c16 2 215 6309\n20c18 6 217 6309\n20c1e 3 219 6309\n20c21 12 221 6309\n20c33 7 113 6309\n20c3a 2 115 6309\n20c3c 12 116 6309\n20c4e 2 222 6309\nFUNC 20c50 29 c strtol\n20c50 3 229 6309\n20c53 8 230 6309\n20c5b 13 232 6309\n20c6e 9 236 6309\n20c77 2 238 6309\nFUNC 20c79 1b 10 _strtol_l\n20c79 0 246 6309\n20c79 1a 247 6309\n20c93 1 248 6309\nFUNC 20c94 2a c strtoul\n20c94 3 255 6309\n20c97 7 256 6309\n20c9e 14 258 6309\n20cb2 a 262 6309\n20cbc 2 264 6309\nFUNC 20cbe 1b 10 _strtoul_l\n20cbe 0 272 6309\n20cbe 1a 273 6309\n20cd8 1 274 6309\nFUNC 20cd9 1f 0 __initconin\n20cd9 0 58 5008\n20cd9 1e 65 5008\n20cf7 1 67 5008\nFUNC 20cf8 1f 0 __initconout\n20cf8 0 90 5008\n20cf8 1e 97 5008\n20d16 1 98 5008\nFUNC 20d17 2d 0 __termcon\n20d17 0 120 5008\n20d17 16 121 5008\n20d2d 3 122 5008\n20d30 f 125 5008\n20d3f 4 126 5008\n20d43 1 128 5008\nFUNC 20d44 94 4 _close_nolock\n20d44 1 72 5094\n20d45 54 93 5094\n20d99 a 99 5094\n20da3 2 96 5094\n20da5 6 101 5094\n20dab b 103 5094\n20db6 11 105 5094\n20dc7 7 107 5094\n20dce 5 108 5094\n20dd3 4 111 5094\n20dd7 1 112 5094\nFUNC 20dd8 cd 4 _close\n20dd8 c 42 5094\n20de4 23 46 5094\n20e07 2f 47 5094\n20e36 20 48 5094\n20e56 7 50 5094\n20e5d 3 52 5094\n20e60 9 53 5094\n20e69 c 54 5094\n20e75 2 55 5094\n20e77 b 56 5094\n20e82 4 57 5094\n20e86 c 61 5094\n20e92 3 65 5094\n20e95 6 66 5094\n20e9b a 62 5094\nFUNC 20ea5 2c 4 _freebuf\n20ea5 1 47 1927\n20ea6 f 50 1927\n20eb5 8 52 1927\n20ebd 7 54 1927\n20ec4 8 55 1927\n20ecc 4 56 1927\n20ed0 1 58 1927\nFUNC 20ed1 2a 0 _purecall\n20ed1 0 43 3119\n20ed1 b 44 3119\n20edc 5 45 3119\n20ee1 2 47 3119\n20ee3 7 54 3119\n20eea c 56 3119\n20ef6 5 57 3119\nFUNC 20efb 22 4 _set_purecall_handler\n20efb 1 82 3119\n20efc b 85 3119\n20f07 12 86 3119\n20f19 3 88 3119\n20f1c 1 89 3119\nFUNC 20f1d d 0 _get_purecall_handler\n20f1d 0 92 3119\n20f1d c 93 3119\n20f29 1 94 3119\nFUNC 20f30 34 0 _allmul\n20f30 0 47 5116\n20f30 4 62 5116\n20f34 4 63 5116\n20f38 2 64 5116\n20f3a 4 65 5116\n20f3e 2 66 5116\n20f40 4 68 5116\n20f44 2 69 5116\n20f46 3 71 5116\n20f49 1 74 5116\n20f4a 2 81 5116\n20f4c 2 82 5116\n20f4e 4 84 5116\n20f52 4 85 5116\n20f56 2 86 5116\n20f58 4 88 5116\n20f5c 2 89 5116\n20f5e 2 90 5116\n20f60 1 92 5116\n20f61 3 94 5116\nFUNC 20f64 11 4 atol\n20f64 0 55 6631\n20f64 10 56 6631\n20f74 1 57 6631\nFUNC 20f75 15 8 _atol_l\n20f75 0 64 6631\n20f75 14 65 6631\n20f89 1 66 6631\nFUNC 20f8a 5 4 atoi\n20f8a 0 99 6631\n20f8a 5 100 6631\nFUNC 20f8f 5 8 _atoi_l\n20f8f 0 107 6631\n20f8f 5 108 6631\nFUNC 20f94 11 4 _atoi64\n20f94 0 143 6631\n20f94 10 144 6631\n20fa4 1 145 6631\nFUNC 20fa5 15 8 _atoi64_l\n20fa5 0 151 6631\n20fa5 14 152 6631\n20fb9 1 153 6631\nFUNC 20fba 50 0 has_osfxsr_set\nFUNC 2100a 60 0 _get_sse2_info\nFUNC 2106a d 0 __sse2_available_init\nFUNC 21077 170 8 _flswbuf\n21077 5 93 1980\n2107c c 104 1980\n21088 8 106 1980\n21090 b 107 1980\n2109b 4 108 1980\n2109f a 109 1980\n210a9 4 110 1980\n210ad b 111 1980\n210b8 2 113 1980\n210ba 4 124 1980\n210be 4 125 1980\n210c2 8 126 1980\n210ca 3 127 1980\n210cd 8 128 1980\n210d5 3 137 1980\n210d8 11 138 1980\n210e9 9 141 1980\n210f2 25 151 1980\n21117 7 153 1980\n2111e d 158 1980\n2112b 5 162 1980\n21130 5 163 1980\n21135 7 164 1980\n2113c 7 166 1980\n21143 10 167 1980\n21153 2 168 1980\n21155 6 131 1980\n2115b 5 132 1980\n21160 2e 169 1980\n2118e 13 171 1980\n211a1 2 174 1980\n211a3 9 181 1980\n211ac 2 186 1980\n211ae 1d 195 1980\n211cb 5 201 1980\n211d0 4 202 1980\n211d4 7 203 1980\n211db a 209 1980\n211e5 2 212 1980\nFUNC 211e7 182 4 _wchartodigit\n211e7 0 32 6613\n211e7 1b 41 6613\n21202 1 73 6613\n21203 e 42 6613\n21211 19 44 6613\n2122a 1 73 6613\n2122b 14 45 6613\n2123f 14 46 6613\n21253 14 47 6613\n21267 14 48 6613\n2127b 14 49 6613\n2128f 14 50 6613\n212a3 18 51 6613\n212bb 18 52 6613\n212d3 18 53 6613\n212eb 14 54 6613\n212ff 14 55 6613\n21313 12 56 6613\n21325 14 57 6613\n21339 14 58 6613\n2134d c 59 6613\n21359 2 62 6613\n2135b 4 67 6613\n2135f 6 69 6613\n21365 3 71 6613\n21368 1 73 6613\nFUNC 21369 b6 c _isctype_l\n21369 7 114 6399\n21370 b 118 6399\n2137b d 121 6399\n21388 f 122 6399\n21397 1f 124 6399\n213b6 3 126 6399\n213b9 d 129 6399\n213c6 2 130 6399\n213c8 a 133 6399\n213d2 26 144 6399\n213f8 10 146 6399\n21408 15 149 6399\n2141d 2 150 6399\nFUNC 2141f 2f 8 _isctype\n2141f 0 156 6399\n2141f 9 157 6399\n21428 12 159 6399\n2143a 1 165 6399\n2143b 12 163 6399\n2144d 1 165 6399\nFUNC 21450 2c 0 _alloca_probe_16\n21450 0 44 2632\n21450 1 46 2632\n21451 4 47 2632\n21455 2 48 2632\n21457 3 49 2632\n2145a 2 50 2632\n2145c 2 51 2632\n2145e 2 52 2632\n21460 1 53 2632\n21461 5 54 2632\n21466 1 59 2632\n21467 4 60 2632\n2146b 2 61 2632\n2146d 3 62 2632\n21470 2 63 2632\n21472 2 64 2632\n21474 2 65 2632\n21476 1 66 2632\n21477 5 67 2632\nPUBLIC 21466 0 _alloca_probe_8\nFUNC 2147c 47 4 __ansicp\n2147c 10 39 2934\n2148c 1c 44 2934\n214a8 3 45 2934\n214ab 2 46 2934\n214ad a 47 2934\n214b7 c 49 2934\nFUNC 214c3 1b2 18 __convertcp\n214c3 16 79 2934\n214d9 10 83 2934\n214e9 18 85 2934\n21501 17 90 2934\n21518 13 92 2934\n2152b 6 93 2934\n21531 d 99 2934\n2153e 2 101 2934\n21540 c 103 2934\n2154c 2a 115 2934\n21576 15 111 2934\n2158b 7 112 2934\n21592 1c 115 2934\n215ae 3 116 2934\n215b1 2 117 2934\n215b3 10 119 2934\n215c3 15 127 2934\n215d8 7 129 2934\n215df 18 138 2934\n215f7 3 139 2934\n215fa 2 140 2934\n215fc 1f 149 2934\n2161b 11 151 2934\n2162c 12 160 2934\n2163e 9 162 2934\n21647 3 163 2934\n2164a 2 164 2934\n2164c 6 165 2934\n21652 5 166 2934\n21657 9 174 2934\n21660 3 177 2934\n21663 12 178 2934\nFUNC 21675 34 4 _get_daylight\n21675 0 35 487\n21675 27 36 487\n2169c 1 41 487\n2169d 8 39 487\n216a5 3 40 487\n216a8 1 41 487\nFUNC 216a9 34 4 _get_dstbias\n216a9 0 44 487\n216a9 27 45 487\n216d0 1 50 487\n216d1 8 48 487\n216d9 3 49 487\n216dc 1 50 487\nFUNC 216dd 34 4 _get_timezone\n216dd 0 53 487\n216dd 27 54 487\n21704 1 59 487\n21705 8 57 487\n2170d 3 58 487\n21710 1 59 487\nFUNC 21711 a2 10 _get_tzname\n21711 3 62 487\n21714 10 63 487\n21724 4 64 487\n21728 3 66 487\n2172b 7 68 487\n21732 27 69 487\n21759 20 63 487\n21779 f 72 487\n21788 8 73 487\n21790 4 76 487\n21794 5 78 487\n21799 5 80 487\n2179e 13 82 487\n217b1 2 83 487\nFUNC 217b3 6 0 __daylight\n217b3 0 118 487\n217b3 5 119 487\n217b8 1 120 487\nFUNC 217b9 6 0 __dstbias\n217b9 0 123 487\n217b9 5 124 487\n217be 1 125 487\nFUNC 217bf 6 0 __timezone\n217bf 0 128 487\n217bf 5 129 487\n217c4 1 130 487\nFUNC 217c5 6 0 __tzname\n217c5 0 133 487\n217c5 5 134 487\n217ca 1 135 487\nFUNC 217cb c 4 _set_daylight\n217cb c 189 418\nFUNC 217d7 c 4 _set_dstbias\n217d7 c 190 418\nFUNC 217e3 c 4 _set_timezone\n217e3 c 191 418\nFUNC 217ef 349 0 _tzset_nolock\n217ef c 124 440\n217fb 5 127 440\n21800 3 129 440\n21803 3 130 440\n21806 3 131 440\n21809 3 132 440\n2180c 3 133 440\n2180f 8 135 440\n21817 3 136 440\n2181a 8 139 440\n21822 1b 142 440\n2183d 1b 143 440\n21858 1b 144 440\n21873 8 149 440\n2187b 6 154 440\n21881 f 160 440\n21890 18 165 440\n218a8 14 260 440\n218bc b 268 440\n218c7 4 274 440\n218cb 7 275 440\n218d2 16 277 440\n218e8 6 281 440\n218ee 32 283 440\n21920 9 174 440\n21929 7 175 440\n21930 6 176 440\n21936 13 179 440\n21949 9 183 440\n21952 b 188 440\n2195d 9 190 440\n21966 e 191 440\n21974 12 199 440\n21986 3 201 440\n21989 c 203 440\n21995 2 205 440\n21997 3 206 440\n2199a 3 214 440\n2199d 27 234 440\n219c4 8 235 440\n219cc 2 236 440\n219ce 7 237 440\n219d5 23 247 440\n219f8 9 248 440\n21a01 2 249 440\n21a03 8 250 440\n21a0b 7 256 440\n21a12 a 288 440\n21a1c a 289 440\n21a26 a 290 440\n21a30 c 292 440\n21a3c 9 296 440\n21a45 23 301 440\n21a68 8 310 440\n21a70 7 311 440\n21a77 1 312 440\n21a78 10 318 440\n21a88 11 320 440\n21a99 5 292 440\n21a9e 9 293 440\n21aa7 5 325 440\n21aac e 329 440\n21aba d 330 440\n21ac7 5 335 440\n21acc b 339 440\n21ad7 d 340 440\n21ae4 5 344 440\n21ae9 3 345 440\n21aec 6 350 440\n21af2 4 351 440\n21af6 21 352 440\n21b17 2 354 440\n21b19 5 355 440\n21b1e a 357 440\n21b28 a 358 440\n21b32 6 360 440\nFUNC 21b38 1f5 24 cvtdate\n21b38 6 409 440\n21b3e 4 412 440\n21b42 c 414 440\n21b4e 52 424 440\n21ba0 4c 430 440\n21bec 14 436 440\n21c00 2 437 440\n21c02 2 438 440\n21c04 46 447 440\n21c4a 3 449 440\n21c4d 2 452 440\n21c4f 3c 457 440\n21c8b 3 459 440\n21c8e 27 467 440\n21cb5 6 472 440\n21cbb 2 474 440\n21cbd 29 485 440\n21ce6 11 486 440\n21cf7 a 487 440\n21d01 8 488 440\n21d09 d 490 440\n21d16 6 491 440\n21d1c 6 492 440\n21d22 9 499 440\n21d2b 2 503 440\nFUNC 21d2d 1ae 0 _isindst_nolock\n21d2d 5 554 440\n21d32 20 558 440\n21d52 5 560 440\n21d57 7 561 440\n21d5e 1b 568 440\n21d79 c 569 440\n21d85 7 573 440\n21d8c 34 584 440\n21dc0 2 585 440\n21dc2 19 596 440\n21ddb 40 611 440\n21e1b 2 612 440\n21e1d 1e 623 440\n21e3b 2 626 440\n21e3d 14 641 440\n21e51 1a 653 440\n21e6b d 660 440\n21e78 d 664 440\n21e85 8 666 440\n21e8d 4 674 440\n21e91 2 697 440\n21e93 8 673 440\n21e9b 8 675 440\n21ea3 4 676 440\n21ea7 14 679 440\n21ebb 4 681 440\n21ebf b 682 440\n21eca 2 685 440\n21ecc d 691 440\n21ed9 2 694 440\nFUNC 21edb 4f 0 __tzset\n21edb c 85 440\n21ee7 a 88 440\n21ef1 8 90 440\n21ef9 3 91 440\n21efc 8 93 440\n21f04 5 94 440\n21f09 6 95 440\n21f0f c 98 440\n21f1b 6 103 440\n21f21 9 99 440\nFUNC 21f2a 38 0 _tzset\n21f2a c 109 440\n21f36 8 110 440\n21f3e 4 111 440\n21f42 5 113 440\n21f47 c 115 440\n21f53 6 118 440\n21f59 9 116 440\nFUNC 21f62 41 4 _isindst\n21f62 c 538 440\n21f6e 8 541 440\n21f76 4 542 440\n21f7a b 543 440\n21f85 c 544 440\n21f91 3 548 440\n21f94 6 549 440\n21f9a 9 545 440\nFUNC 21fa3 35 8 __ascii_stricmp\n21fa3 a 75 693\n21fad c 80 693\n21fb9 3 81 693\n21fbc c 82 693\n21fc8 3 83 693\n21fcb 9 85 693\n21fd4 3 87 693\n21fd7 1 88 693\nFUNC 21fd8 d3 c _stricmp_l\n21fd8 7 47 693\n21fdf b 49 693\n21fea 36 52 693\n22020 32 53 693\n22052 8 55 693\n2205a e 57 693\n22068 15 63 693\n2207d 11 64 693\n2208e 8 65 693\n22096 13 68 693\n220a9 2 69 693\nFUNC 220ab 50 8 _stricmp\n220ab 4 94 693\n220af a 95 693\n220b9 24 98 693\n220dd 6 99 693\n220e3 1 107 693\n220e4 5 101 693\n220e9 10 105 693\n220f9 2 107 693\nFUNC 220fb f0 10 _strnicmp_l\n220fb 7 51 650\n22102 d 54 650\n2210f b 56 650\n2211a 33 59 650\n2214d 7 60 650\n22154 32 61 650\n22186 8 63 650\n2218e 1d 65 650\n221ab 15 71 650\n221c0 11 72 650\n221d1 d 74 650\n221de 6 76 650\n221e4 5 79 650\n221e9 2 80 650\nFUNC 221eb 5c c _strnicmp\n221eb 4 125 650\n221ef a 127 650\n221f9 24 130 650\n2221d 5 131 650\n22222 a 132 650\n2222c 1 141 650\n2222d 5 134 650\n22232 13 138 650\n22245 2 141 650\nFUNC 22247 db c xtoa_s\n22247 8 93 6581\n2224f 24 102 6581\n22273 24 103 6581\n22297 19 105 6581\n222b0 b 106 6581\n222bb a 112 6581\n222c5 6 114 6581\n222cb 7 116 6581\n222d2 2 118 6581\n222d4 2 121 6581\n222d6 5 124 6581\n222db 5 128 6581\n222e0 3 129 6581\n222e3 2 130 6581\n222e5 6 131 6581\n222eb 3 135 6581\n222ee e 136 6581\n222fc 8 139 6581\n22304 2 141 6581\n22306 2 142 6581\n22308 3 148 6581\n2230b 6 152 6581\n22311 3 154 6581\n22314 1 155 6581\n22315 4 156 6581\n22319 5 158 6581\n2231e 4 160 6581\nFUNC 22322 28 10 _itoa_s\n22322 3 172 6581\n22325 d 175 6581\n22332 4 176 6581\n22336 2 177 6581\n22338 10 178 6581\n22348 2 181 6581\nFUNC 2234a 25 10 _ltoa_s\n2234a 3 189 6581\n2234d 20 190 6581\n2236d 2 191 6581\nFUNC 2236f 18 10 _ultoa_s\n2236f 0 199 6581\n2236f 17 200 6581\n22386 1 201 6581\nFUNC 22387 f6 14 x64toa_s\n22387 7 309 6581\n2238e 25 318 6581\n223b3 5 319 6581\n223b8 19 321 6581\n223d1 b 322 6581\n223dc 3 327 6581\n223df 20 333 6581\n223ff 3 336 6581\n22402 1e 352 6581\n22420 3 344 6581\n22423 2 345 6581\n22425 5 346 6581\n2242a 5 351 6581\n2242f 13 352 6581\n22442 5 355 6581\n22447 3 357 6581\n2244a 13 358 6581\n2245d 4 364 6581\n22461 9 368 6581\n2246a 3 370 6581\n2246d 1 371 6581\n2246e 7 372 6581\n22475 4 375 6581\n22479 4 377 6581\nFUNC 2247d 33 14 _i64toa_s\n2247d 3 390 6581\n22480 2e 391 6581\n224ae 2 392 6581\nFUNC 224b0 1d 14 _ui64toa_s\n224b0 4 400 6581\n224b4 17 401 6581\n224cb 2 402 6581\nFUNC 224cd 224 1c __crtGetStringTypeW_stat\n224cd 10 64 2828\n224dd 9 72 2828\n224e6 7 73 2828\n224ed 14 75 2828\n22501 11 79 2828\n22512 8 80 2828\n2251a b 82 2828\n22525 f 83 2828\n22534 4 88 2828\n22538 13 90 2828\n2254b 7 95 2828\n22552 2 199 2828\n22554 8 119 2828\n2255c b 120 2828\n22567 5 121 2828\n2256c b 122 2828\n22577 e 128 2828\n22585 5 130 2828\n2258a 3 131 2828\n2258d 1d 142 2828\n225aa 6 143 2828\n225b0 40 146 2828\n225f0 3 147 2828\n225f3 6 148 2828\n225f9 d 150 2828\n22606 1a 160 2828\n22620 4d 164 2828\n2266d 4 165 2828\n22671 5 170 2828\n22676 b 171 2828\n22681 3 174 2828\n22684 23 178 2828\n226a7 12 186 2828\n226b9 f 189 2828\n226c8 4 187 2828\n226cc 7 191 2828\n226d3 8 194 2828\n226db 4 196 2828\n226df 12 200 2828\nFUNC 226f1 3e 1c __crtGetStringTypeW\n226f1 6 211 2828\n226f7 b 212 2828\n22702 2b 222 2828\n2272d 2 223 2828\nFUNC 2272f 294 14 strtoxq\n2272f 8 80 6264\n22737 b 86 6264\n22742 3 89 6264\n22745 b 92 6264\n22750 31 94 6264\n22781 12 95 6264\n22793 c 100 6264\n2279f 37 102 6264\n227d6 2 103 6264\n227d8 9 105 6264\n227e1 4 106 6264\n227e5 2 107 6264\n227e7 6 109 6264\n227ed 9 110 6264\n227f6 8 112 6264\n227fe 6 115 6264\n22804 9 116 6264\n2280d a 117 6264\n22817 9 120 6264\n22820 3 118 6264\n22823 5 123 6264\n22828 10 125 6264\n22838 1 126 6264\n22839 9 127 6264\n22842 26 132 6264\n22868 e 137 6264\n22876 8 138 6264\n2287e 6 139 6264\n22884 11 140 6264\n22895 5 143 6264\n2289a 31 154 6264\n228cb 4 160 6264\n228cf 6 161 6264\n228d5 a 173 6264\n228df 7 176 6264\n228e6 6 178 6264\n228ec 6 179 6264\n228f2 5 181 6264\n228f7 19 156 6264\n22910 b 168 6264\n2291b 5 169 6264\n22920 35 184 6264\n22955 5 187 6264\n2295a c 188 6264\n22966 a 189 6264\n22970 6 190 6264\n22976 7 191 6264\n2297d 2 192 6264\n2297f 7 193 6264\n22986 8 195 6264\n2298e 5 197 6264\n22993 6 199 6264\n22999 13 201 6264\n229ac 15 203 6264\n229c1 2 204 6264\nFUNC 229c3 29 c _strtoi64\n229c3 3 211 6264\n229c6 8 212 6264\n229ce 13 214 6264\n229e1 9 218 6264\n229ea 2 220 6264\nFUNC 229ec 1b 10 _strtoi64_l\n229ec 0 227 6264\n229ec 1a 228 6264\n22a06 1 229 6264\nFUNC 22a07 2a c _strtoui64\n22a07 3 236 6264\n22a0a 7 237 6264\n22a11 14 239 6264\n22a25 a 243 6264\n22a2f 2 245 6264\nFUNC 22a31 1b 10 _strtoui64_l\n22a31 0 253 6264\n22a31 1a 254 6264\n22a4b 1 255 6264\nFUNC 22a50 2b 0 _chkstk\n22a50 0 65 2634\n22a50 1 69 2634\n22a51 4 73 2634\n22a55 2 74 2634\n22a57 2 79 2634\n22a59 2 80 2634\n22a5b 2 81 2634\n22a5d 2 83 2634\n22a5f 5 84 2634\n22a64 2 87 2634\n22a66 2 88 2634\n22a68 2 89 2634\n22a6a 1 90 2634\n22a6b 1 91 2634\n22a6c 2 92 2634\n22a6e 3 93 2634\n22a71 1 94 2634\n22a72 5 98 2634\n22a77 2 99 2634\n22a79 2 100 2634\nFUNC 22a7b 81 4 _getenv_helper_nolock\n22a7b 0 95 3904\n22a7b 10 103 3904\n22a8b 3 104 3904\n22a8e 1 169 3904\n22a8f e 128 3904\n22a9d 7 131 3904\n22aa4 2 132 3904\n22aa6 6 135 3904\n22aac c 140 3904\n22ab8 9 142 3904\n22ac1 2 150 3904\n22ac3 22 154 3904\n22ae5 3 164 3904\n22ae8 6 150 3904\n22aee 5 168 3904\n22af3 9 169 3904\nFUNC 22afc 93 c _getenv_s_helper\n22afc 7 220 3904\n22b03 21 224 3904\n22b24 15 226 3904\n22b39 4 227 3904\n22b3d 3 229 3904\n22b40 a 233 3904\n22b4a 3 234 3904\n22b4d 2 236 3904\n22b4f 7 239 3904\n22b56 6 240 3904\n22b5c 2 243 3904\n22b5e 5 246 3904\n22b63 5 251 3904\n22b68 20 254 3904\n22b88 5 256 3904\n22b8d 2 257 3904\nFUNC 22b8f a2 8 _dupenv_s_helper\n22b8f 6 339 3904\n22b95 21 344 3904\n22bb6 9 346 3904\n22bbf 2 348 3904\n22bc1 5 350 3904\n22bc6 8 352 3904\n22bce 6 353 3904\n22bd4 2 355 3904\n22bd6 9 358 3904\n22bdf b 362 3904\n22bea 6 364 3904\n22bf0 b 366 3904\n22bfb 9 367 3904\n22c04 1e 370 3904\n22c22 7 371 3904\n22c29 2 373 3904\n22c2b 4 375 3904\n22c2f 2 376 3904\nFUNC 22c31 83 4 getenv\n22c31 c 75 3904\n22c3d 2a 78 3904\n22c67 18 79 3904\n22c7f 8 81 3904\n22c87 3 82 3904\n22c8a c 83 3904\n22c96 c 85 3904\n22ca2 3 89 3904\n22ca5 6 90 3904\n22cab 9 86 3904\nFUNC 22cb4 d8 10 getenv_s\n22cb4 c 198 3904\n22cc0 8 201 3904\n22cc8 5 202 3904\n22ccd a1 203 3904\n22d6e c 205 3904\n22d7a 3 209 3904\n22d7d 6 210 3904\n22d83 9 206 3904\nFUNC 22d8c e6 c _dupenv_s\n22d8c c 303 3904\n22d98 8 306 3904\n22da0 5 307 3904\n22da5 af 311 3904\n22e54 c 314 3904\n22e60 3 318 3904\n22e63 6 319 3904\n22e69 9 315 3904\nFUNC 22e72 8 4 _tolower\n22e72 0 48 6218\n22e72 7 49 6218\n22e79 1 50 6218\nFUNC 22e7a 117 8 _tolower_l\n22e7a 8 70 6218\n22e82 b 74 6218\n22e8d c 77 6218\n22e99 31 79 6218\n22eca f 80 6218\n22ed9 14 82 6218\n22eed 2b 86 6218\n22f18 3 88 6218\n22f1b d 91 6218\n22f28 2 92 6218\n22f2a b 94 6218\n22f35 a 97 6218\n22f3f 25 110 6218\n22f64 6 112 6218\n22f6a 5 116 6218\n22f6f 6 117 6218\n22f75 1a 119 6218\n22f8f 2 120 6218\nFUNC 22f91 27 4 tolower\n22f91 0 143 6218\n22f91 9 145 6218\n22f9a f 147 6218\n22fa9 1 153 6218\n22faa d 151 6218\n22fb7 1 153 6218\nFUNC 22fc0 61 c __ascii_strnicmp\n22fc0 6 69 871\n22fc6 3 75 871\n22fc9 2 76 871\n22fcb 2 77 871\n22fcd 3 79 871\n22fd0 3 80 871\n22fd3 2 82 871\n22fd5 2 83 871\n22fd7 5 84 871\n22fdc 2 89 871\n22fde 2 91 871\n22fe0 2 93 871\n22fe2 2 95 871\n22fe4 2 97 871\n22fe6 2 98 871\n22fe8 3 100 871\n22feb 3 101 871\n22fee 2 103 871\n22ff0 2 104 871\n22ff2 2 106 871\n22ff4 2 107 871\n22ff6 2 109 871\n22ff8 2 112 871\n22ffa 2 113 871\n22ffc 2 115 871\n22ffe 2 116 871\n23000 2 118 871\n23002 2 121 871\n23004 2 122 871\n23006 3 124 871\n23009 2 125 871\n2300b 2 128 871\n2300d 2 129 871\n2300f 2 130 871\n23011 5 133 871\n23016 2 134 871\n23018 2 135 871\n2301a 2 138 871\n2301c 5 140 871\nFUNC 23021 ec 10 _mbsnbicoll_l\n23021 7 53 4518\n23028 b 55 4518\n23033 9 57 4518\n2303c 13 58 4518\n2304f 33 61 4518\n23082 6 62 4518\n23088 23 63 4518\n230ab 8 65 4518\n230b3 14 66 4518\n230c7 23 74 4518\n230ea 10 75 4518\n230fa 11 77 4518\n2310b 2 79 4518\nFUNC 2310d 17 c _mbsnbicoll\n2310d 0 85 4518\n2310d 16 86 4518\n23123 1 87 4518\nFUNC 23124 95 0 __wtomb_environ\n23124 7 43 2699\n2312b 3 44 2699\n2312e 9 45 2699\n23137 c 52 2699\n23143 12 57 2699\n23155 11 61 2699\n23166 12 65 2699\n23178 10 72 2699\n23188 5 74 2699\n2318d 9 76 2699\n23196 3 77 2699\n23199 9 81 2699\n231a2 5 84 2699\n231a7 2 85 2699\n231a9 5 58 2699\n231ae 9 67 2699\n231b7 2 68 2699\nFUNC 231b9 1a 8 strnlen\n231b9 0 38 864\n231b9 19 45 864\n231d2 1 49 864\nFUNC 231d3 1a 4 strncnt\n231d3 0 50 4345\n231d3 6 51 4345\n231d9 6 54 4345\n231df 1 55 4345\n231e0 5 54 4345\n231e5 7 57 4345\n231ec 1 58 4345\nFUNC 231ed 389 18 __crtCompareStringA_stat\n231ed 10 96 4345\n231fd 31 280 4345\n2322e c 107 4345\n2323a b 109 4345\n23245 a 110 4345\n2324f 5 118 4345\n23254 1b 119 4345\n2326f 7 122 4345\n23276 1f 123 4345\n23295 6 120 4345\n2329b 7 121 4345\n232a2 3 124 4345\n232a5 2 125 4345\n232a7 17 130 4345\n232be 7 189 4345\n232c5 8 201 4345\n232cd 8 202 4345\n232d5 d 208 4345\n232e2 5 214 4345\n232e7 8 215 4345\n232ef 2 218 4345\n232f1 6 219 4345\n232f7 5 222 4345\n232fc 4 223 4345\n23300 f 231 4345\n2330f 2 232 4345\n23311 5 237 4345\n23316 4 239 4345\n2331a 2 240 4345\n2331c 10 244 4345\n2332c a 246 4345\n23336 7 244 4345\n2333d 2 262 4345\n2333f 5 253 4345\n23344 6 255 4345\n2334a 8 256 4345\n23352 10 260 4345\n23362 11 262 4345\n23373 7 260 4345\n2337a 2 262 4345\n2337c 1a 280 4345\n23396 6 281 4345\n2339c 4d 284 4345\n233e9 4 285 4345\n233ed 6 286 4345\n233f3 19 295 4345\n2340c 17 305 4345\n23423 46 309 4345\n23469 4 310 4345\n2346d 13 320 4345\n23480 17 326 4345\n23497 7 328 4345\n2349e 8 331 4345\n234a6 9 333 4345\n234af 4 132 4345\n234b3 5 137 4345\n234b8 8 138 4345\n234c0 5 139 4345\n234c5 8 140 4345\n234cd e 142 4345\n234db 6 143 4345\n234e1 5 148 4345\n234e6 19 155 4345\n234ff 2 156 4345\n23501 6 157 4345\n23507 19 163 4345\n23520 4 164 4345\n23524 7 166 4345\n2352b 5 167 4345\n23530 3 169 4345\n23533 3 170 4345\n23536 18 178 4345\n2354e 6 179 4345\n23554 6 181 4345\n2355a 8 182 4345\n23562 2 184 4345\n23564 12 337 4345\nFUNC 23576 40 20 __crtCompareStringA\n23576 6 349 4345\n2357c b 350 4345\n23587 2d 361 4345\n235b4 2 362 4345\nFUNC 235b6 f8 10 _strnicoll_l\n235b6 7 55 603\n235bd b 57 603\n235c8 9 59 603\n235d1 13 60 603\n235e4 33 63 603\n23617 6 64 603\n2361d 23 65 603\n23640 a 67 603\n2364a 15 68 603\n2365f 21 78 603\n23680 b 80 603\n2368b 10 81 603\n2369b 11 84 603\n236ac 2 85 603\nFUNC 236ae 27 c _strnicoll\n236ae 3 92 603\n236b1 9 93 603\n236ba 1 101 603\n236bb 5 95 603\n236c0 13 99 603\n236d3 2 101 603\nFUNC 236d5 4d 4 findenv\n236d5 1 387 3036\n236d6 8 390 3036\n236de 12 394 3036\n236f0 d 399 3036\n236fd 9 390 3036\n23706 e 407 3036\n23714 1 408 3036\n23715 c 400 3036\n23721 1 408 3036\nFUNC 23722 5d 0 copy_environ\n23722 4 428 3036\n23726 2 429 3036\n23728 6 434 3036\n2372e 2 464 3036\n23730 7 438 3036\n23737 8 439 3036\n2373f 14 443 3036\n23753 8 444 3036\n2375b 6 448 3036\n23761 11 458 3036\n23772 4 448 3036\n23776 2 461 3036\n23778 5 463 3036\n2377d 2 464 3036\nFUNC 2377f 24c 8 __crtsetenv\n2377f 6 76 3036\n23785 2c 89 3036\n237b1 2 91 3036\n237b3 1c 98 3036\n237cf 5 114 3036\n237d4 13 125 3036\n237e7 c 126 3036\n237f3 4 130 3036\n237f7 d 153 3036\n23804 9 155 3036\n2380d b 100 3036\n23818 6 101 3036\n2381e 2 356 3036\n23820 3 164 3036\n23823 6 165 3036\n23829 f 171 3036\n23838 2 172 3036\n2383a 2 173 3036\n2383c 8 176 3036\n23844 f 178 3036\n23853 2 179 3036\n23855 2 180 3036\n23857 6 196 3036\n2385d 5 197 3036\n23862 2 200 3036\n23864 10 207 3036\n23874 9 210 3036\n2387d a 216 3036\n23887 6 218 3036\n2388d 5 235 3036\n23892 5 238 3036\n23897 5 241 3036\n2389c c 222 3036\n238a8 4 221 3036\n238ac 1d 230 3036\n238c9 2 233 3036\n238cb 9 245 3036\n238d4 4 250 3036\n238d8 2 251 3036\n238da 2f 255 3036\n23909 8 258 3036\n23911 3 259 3036\n23914 5 262 3036\n23919 5 264 3036\n2391e 21 287 3036\n2393f 25 289 3036\n23964 21 338 3036\n23985 4 339 3036\n23989 b 343 3036\n23994 7 346 3036\n2399b 5 349 3036\n239a0 8 351 3036\n239a8 6 352 3036\n239ae 8 355 3036\n239b6 8 271 3036\n239be 6 274 3036\n239c4 7 276 3036\nFUNC 239cb 50 4 _strdup\n239cb 1 66 901\n239cc b 70 901\n239d7 6 71 901\n239dd 9 73 901\n239e6 e 77 901\n239f4 1c 80 901\n23a10 4 81 901\n23a14 6 84 901\n23a1a 1 85 901\nFUNC 23a1b ba c _mbschr_l\n23a1b 7 53 4568\n23a22 b 55 4568\n23a2d 32 58 4568\n23a5f 8 60 4568\n23a67 d 61 4568\n23a74 a 65 4568\n23a7e 7 67 4568\n23a85 10 69 4568\n23a95 3 70 4568\n23a98 8 72 4568\n23aa0 d 63 4568\n23aad 8 76 4568\n23ab5 e 77 4568\n23ac3 10 79 4568\n23ad3 2 80 4568\nFUNC 23ad5 13 8 _mbschr\n23ad5 0 86 4568\n23ad5 12 87 4568\n23ae7 1 88 4568\nFUNC 23b00 be 8 strchr\n23b00 0 60 928\n23b00 2 68 928\n23b02 4 69 928\n23b06 1 73 928\n23b07 2 74 928\n23b09 3 75 928\n23b0c 4 76 928\n23b10 6 77 928\n23b16 2 78 928\n23b18 2 81 928\n23b1a 3 82 928\n23b1d 2 83 928\n23b1f 2 84 928\n23b21 2 85 928\n23b23 2 86 928\n23b25 6 87 928\n23b2b 2 88 928\n23b2d 2 91 928\n23b2f 1 92 928\n23b30 2 93 928\n23b32 3 94 928\n23b35 1 95 928\n23b36 2 96 928\n23b38 2 101 928\n23b3a 5 102 928\n23b3f 2 104 928\n23b41 2 105 928\n23b43 2 107 928\n23b45 2 108 928\n23b47 2 110 928\n23b49 3 111 928\n23b4c 3 113 928\n23b4f 2 114 928\n23b51 2 116 928\n23b53 3 117 928\n23b56 6 119 928\n23b5c 2 120 928\n23b5e 5 124 928\n23b63 2 125 928\n23b65 5 127 928\n23b6a 2 128 928\n23b6c 6 130 928\n23b72 2 131 928\n23b74 1 134 928\n23b75 1 135 928\n23b76 1 137 928\n23b77 2 138 928\n23b79 1 139 928\n23b7a 3 142 928\n23b7d 2 143 928\n23b7f 2 144 928\n23b81 2 145 928\n23b83 2 146 928\n23b85 2 147 928\n23b87 2 148 928\n23b89 2 149 928\n23b8b 2 150 928\n23b8d 3 151 928\n23b90 2 152 928\n23b92 2 153 928\n23b94 2 154 928\n23b96 2 155 928\n23b98 2 156 928\n23b9a 2 157 928\n23b9c 2 158 928\n23b9e 2 159 928\n23ba0 2 160 928\n23ba2 1 163 928\n23ba3 1 164 928\n23ba4 3 165 928\n23ba7 1 166 928\n23ba8 1 167 928\n23ba9 3 170 928\n23bac 1 171 928\n23bad 1 172 928\n23bae 1 173 928\n23baf 1 174 928\n23bb0 3 177 928\n23bb3 1 178 928\n23bb4 1 179 928\n23bb5 1 180 928\n23bb6 1 181 928\n23bb7 3 184 928\n23bba 1 185 928\n23bbb 1 186 928\n23bbc 1 187 928\n23bbd 1 188 928\nPUBLIC 23b06 0 __from_strstr_to_strchr\nFUNC 240b9 14 0 `operator new'::`6'::`dynamic atexit destructor for 'nomem''\nSTACK WIN 4 41b0 86 13 0 8 0 e0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4240 41 3 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4290 18 4 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 42ae 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 42af 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 42c6 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 42d1 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 42d2 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 42f3 3f c 0 0 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4332 3f c 0 0 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4371 3f c 0 0 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 43b0 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 43b1 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 43c8 af c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4464 12 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 4477 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 448d 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 44a3 14 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 44b7 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 44cd 14 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 44e1 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4506 16 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 451c f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 452b 62 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 452c 60 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 452d 5c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 454a 35 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 458d 42 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 458e 40 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 45cf da c 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 466c 15 0 0 4 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 46a0 8 0 0 4 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 46a9 53 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 46f2 9 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 46fc 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4705 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 470b b1 8 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4713 a8 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4785 33 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 47bc 20 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 47dc 3c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 47dd 3a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4818 2e 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4846 36 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 487c 2a 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 48a6 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 48bc 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 48c1 30 5 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 48c6 2b 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 48f1 7 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 48f8 7 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 48ff 7 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4906 52 8 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 490c 4c 2 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 4958 36 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 498e 36 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 49c4 36 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 49fa 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4a14 30 1 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4a15 2e 0 0 10 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4a44 d5 7 0 1c 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4a4b ce 0 0 1c 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 4b19 9d 5 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4b1e 98 0 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 4bb6 73 7 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4bbb 6c 2 0 14 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 4bbc 6a 1 0 14 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 4bbd 68 0 0 14 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 4c29 28 5 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4c2e 22 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4c51 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4c72 4c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4c73 4a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4cbe 5e 6 0 14 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4d1c 4a b 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4d26 1b 1 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4d27 16 0 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4d66 19 a 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4d67 17 9 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4d7f 6a 6 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4de9 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4df8 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e06 1c 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e07 18 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e22 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e31 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e39 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e54 1c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e70 1f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e8f 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e93 b 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e9e 5 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4ea3 11 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4eb4 4e 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4eb5 4a 8 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4eba 44 3 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4ebb 42 2 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4f02 18 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4f1a 58 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4f1b 54 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4f20 4e 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4f34 37 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4f72 56 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4f73 52 8 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4f78 4c 3 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4f79 4a 2 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4fc8 16 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4fde d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4feb 19 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4fec 15 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5004 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5005 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 501c b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5027 19 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5028 15 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5040 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5041 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5058 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5063 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5064 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 507b 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 507c 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5093 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 509e 1c 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 509f 18 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 50ba 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 50bb 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 50dc 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 50dd 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 50fe 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 50ff 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5120 7b 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5124 75 4 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5128 70 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 519b 5b 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 51a2 52 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 51a3 50 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 51f6 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5200 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 520a a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5214 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 521e a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5228 24 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 524c 41 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 528d 1b6 c 0 0 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5405 14 0 0 0 c 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 5443 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 544d a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5457 fc 1c 0 14 4 328 0 1 $T0 $ebp 680 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5553 22 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5554 20 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5575 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5582 9 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 558b 24 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 55af 10 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 55bf 9 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 55c8 96 7 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 55cf 8d 0 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 55fb 60 0 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 565e 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5678 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5694 1f 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 56b3 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 56cf 1d 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 56ec 20 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 570c 1d 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5729 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 573a 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 574b 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5761 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5777 14f c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 58bc 9 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 58c6 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 58e0 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 58fa 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5912 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 592c 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5944 f6 7 0 18 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 594b ed 0 0 18 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 5973 c4 0 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 5977 bf 0 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 5a3a 27 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5a61 28 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5a89 87 4 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5a8d 81 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5ab2 5b 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5b10 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5b2b 107 5 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5b30 100 0 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5b5b d4 0 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5b5f cf 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5c32 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5c50 27 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5c77 28 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5c9f 24 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5cc3 26 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5ce9 15 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5cfe 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d07 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d10 18 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d11 16 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d28 20 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d29 1e 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d48 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d4d 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d7f 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d84 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5dbb 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5dc0 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5df7 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5dfc 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5e33 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5e38 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5e6f 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5e74 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5ea6 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5eab 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5edd 92 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5f1b 34 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5f1c 32 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5f6f e2 c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 6039 11 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 6051 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6062 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6073 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6082 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6091 4c 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6092 4a 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 616b 33 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 619e 36 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 61d4 36 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 620a 39 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6243 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6257 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6266 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6275 96 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6276 94 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 62ba 4a 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 62bb 46 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 630b 2f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6313 26 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 633a 82 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6341 78 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 63bc e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 63ca 3 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 63cd 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6400 24 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 6404 1e 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 6424 4a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6429 44 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 642a 42 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 646e d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 647b 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 648b e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6499 994 2c 0 10 0 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 64bb 945 a 0 10 4 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 64c2 93b 3 0 10 8 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 64c5 937 0 0 10 c 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 6e2d 3b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6e68 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6e7b 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6e8e 1e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6e8f 1c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6eac 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6ec7 2a 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6ec8 28 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6ef1 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6f0c 2a 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6f0d 28 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6fa0 24 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6fd0 196 14 0 10 0 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6fd4 d3 10 0 10 4 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 24 - ^ =\nSTACK WIN 4 6fd9 cd b 0 10 8 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ =\nSTACK WIN 4 6fda cb a 0 10 c 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ =\nSTACK WIN 4 6fe4 c0 0 0 10 10 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ =\nSTACK WIN 4 7166 90 c 0 10 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 71eb a 0 0 10 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 71f6 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7210 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 722a 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7244 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 725c 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7274 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 728c 104 9 0 0 0 328 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7390 5c6 22 0 c 0 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 73b2 597 0 0 c 4 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 73fe 542 0 0 c 8 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1436 - ^ =\nSTACK WIN 4 740c 533 0 0 c c 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1436 - ^ =\nSTACK WIN 4 7956 dc c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7a28 9 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 7a32 2d 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7a37 27 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7a5f e1 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7b36 9 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 7b40 49 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7b41 3b 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7b42 39 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7b89 55 8 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7b8a 53 7 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 7b91 4b 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 7b97 2a 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 7bde 15 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7bf3 18 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7c0b c3 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7cc5 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 7cce 31 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7cd5 28 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7cff 240 c 0 0 c 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7f28 4 0 0 0 c 64 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 7f3f 4c 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f40 4a 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f41 48 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f8b 21 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f8c 1f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7fac 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7fbc 40 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7fbd 3e 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7fbe 3c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ffc 48 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ffd 46 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ffe 44 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8044 4b 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8045 49 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8046 47 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 808f 50 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8090 4e 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8091 4c 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 80df 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 80e7 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 80f1 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 80fb 8e c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8151 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8189 9f c 0 0 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 821f 8 0 0 0 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8228 19 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8229 15 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8241 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 824c 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 824d 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 826e 5c 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 826f 5a 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8270 58 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 82ca 44 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 830e e1 c 0 10 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8390 a 0 0 10 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 83ce 20 0 0 10 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 83ef 45 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8434 54 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8477 9 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8488 25 7 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 848f 1d 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 84ad 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 84c0 b3 8 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 84c7 9a 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 84c8 98 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8573 4c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 85bf 139 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 85c0 137 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 85cf 127 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 85d0 11f 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 85d1 11d 0 0 8 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 86f8 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 86fc 32 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8714 a 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 872e 33 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8747 a 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8761 32 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8779 a 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8793 3b c 0 14 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 87b4 a 0 0 14 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 87ce 79 6 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 87f0 52 0 0 4 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 87f1 50 0 0 4 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 8847 49 c 0 4 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8890 30 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8891 2a 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 8892 28 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 88c0 82 8 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 88c1 7b 7 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 88c8 73 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8942 19c 14 0 18 c 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 89d2 9 0 0 18 c 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8a62 7b 0 0 18 c 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8ade 17f c 0 10 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8c49 4 0 0 10 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8c5d 91 c 0 10 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8ce2 4 0 0 10 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8cee 143 9 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8cfe 131 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 8d02 12c 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 8d05 128 0 0 10 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 8e31 6c 3 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8e9d f2 6 0 20 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8ea3 ea 0 0 20 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8eb3 d9 0 0 20 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8f31 5a 0 0 20 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 8f8f 356 17 0 20 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8f99 34a d 0 20 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 8fa5 33d 1 0 20 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 8fa6 33b 0 0 20 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 92e5 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 92e6 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 92fd e4 6 0 20 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9301 de 2 0 20 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 9302 dc 1 0 20 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 9303 da 0 0 20 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 93e1 6c 7 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 93e7 64 1 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 93e8 62 0 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 9408 41 0 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 944d 6e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 944e 6c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 94bb 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 94c4 6e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 94c5 6c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9532 9 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 953b 15 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9550 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9556 32 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9557 30 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9588 19 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 95a1 3d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 95de bf c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9694 8 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 969d 77 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 969e 75 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 969f 71 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9714 18 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9715 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 972c 121 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9835 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9841 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 984d 69 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9857 4b 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9860 25 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 98b6 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 98bc 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 98c2 184 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 98c3 182 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 98de 166 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9a46 39 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9a66 4 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9a7f 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9a92 37 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9ab6 4 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9ac9 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9b2c b9 5 0 4 0 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9b2e b5 3 0 4 4 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 9b2f b3 2 0 4 8 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 9b30 b1 1 0 4 c 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 9b31 af 0 0 4 10 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 9be5 2f 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9be6 2d 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9c14 3c c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9c4a 5 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9c50 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9c62 4f c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9ca8 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9cb1 75 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9cf9 2c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9d26 c3 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9d27 c1 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ =\nSTACK WIN 4 9d35 9c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 9d3c 94 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 9d3d 90 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 9de9 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9df3 31 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9df4 2f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9e24 9 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9e2d d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9e3a 22 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9e5c 22 3 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9e7e 70 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9ee5 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9eee f5 c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9fd7 b 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9fe3 70 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 a04a 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 a053 31 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 a084 eb c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 a163 b 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 a16f 53 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 a1b9 8 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 a258 65 b 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 a25d 5f 6 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 a262 59 1 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 a263 57 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 aa15 3d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 aa52 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 aa60 1a0 8 0 4 0 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 aa62 19c 6 0 4 4 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 aa67 196 1 0 4 8 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 aa68 194 0 0 4 c 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 aa85 176 0 0 4 10 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 20 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 ac00 20 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ac20 39 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ac59 1 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ac5a 32 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ac65 1c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ac8c 15e 6 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ac92 156 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 acaa 13d 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 acb0 136 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 adea 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ae05 db b 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ae06 c3 a 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 ae0f b9 1 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 ae10 b7 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 ae5f 67 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 aee0 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 aeea 198 e 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 aef2 187 6 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 aef8 180 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 b082 b9 11 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b089 b0 a 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 b092 a6 1 0 0 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 b093 a4 0 0 0 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 b13b 135 b 0 0 0 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b143 12a 3 0 0 4 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ =\nSTACK WIN 4 b144 128 2 0 0 8 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ =\nSTACK WIN 4 b145 126 1 0 0 c 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ =\nSTACK WIN 4 b146 124 0 0 0 10 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ =\nSTACK WIN 4 b270 24 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b271 22 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b272 20 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b294 24 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b295 22 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b296 20 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b2b8 5b 6 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b2be 43 0 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b313 5a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b36d 74 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b36e 72 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ =\nSTACK WIN 4 b37a 53 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 b381 4b 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 b38c 30 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 b3e1 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b3e7 94 15 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b3fb 7e 1 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 b3fc 7c 0 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 b418 5f 0 0 0 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 b47b 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b483 160 5 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b488 159 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b4c5 11b 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 b52c b3 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 b5e3 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b608 25 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b60c 1f 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b62d 4f a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b632 49 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 b633 47 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 b67c 910 30 0 10 0 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b69e 8c1 e 0 10 4 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ =\nSTACK WIN 4 b6a5 8b7 7 0 10 8 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ =\nSTACK WIN 4 b6ac 8af 0 0 10 c 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ =\nSTACK WIN 4 bf8c 97 7 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 bf93 8e 0 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 bfbf 61 0 0 10 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 c023 17 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c03a 5 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c03f 55 7 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 c046 4c 0 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 c094 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c0ac 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c0c6 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c0de 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c0f8 14e c 0 14 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 c23c 9 0 0 14 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 c246 1e 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c264 1e 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c282 1e 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c2a0 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c2bc 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c2d8 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c2f4 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c319 25 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 c31d 1f 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 c33e 4f a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c343 49 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 c344 47 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 c38d 91c 2c 0 10 0 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 c3a9 8d3 10 0 10 4 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ =\nSTACK WIN 4 c3b0 8c9 9 0 10 8 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ =\nSTACK WIN 4 c3b9 8bf 0 0 10 c 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ =\nSTACK WIN 4 cca9 154 9 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ccb1 14a 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ccb2 148 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 cdfd 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ce22 25 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ce26 1f 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ce47 4f a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ce4c 49 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 ce4d 47 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 ce96 f60 2a 0 10 0 ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ceb8 f0f 8 0 10 4 ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2776 - ^ =\nSTACK WIN 4 ceb9 f0b 7 0 10 8 ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2776 - ^ =\nSTACK WIN 4 cec0 f03 0 0 10 c ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2776 - ^ =\nSTACK WIN 4 ddf6 1f 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ddf7 1d 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ddf8 1b 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 de20 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 de50 42 18 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 de5e 33 a 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 de5f 31 9 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 de68 27 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 dea0 bb 33 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 deba a1 19 0 4 10 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 df29 14 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 df5b 19 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 df74 9b c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 dfed 9 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 e00f 34 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e01a 1d 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e043 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e050 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e059 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e062 23d c 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 e257 b 0 0 8 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 e29f 1b0 c 0 4 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 e40d 14 0 0 4 c 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 e44f a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e459 104 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e45a 102 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ =\nSTACK WIN 4 e45b 100 1 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ =\nSTACK WIN 4 e45c fe 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ =\nSTACK WIN 4 e495 c4 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 16 - ^ =\nSTACK WIN 4 e55d 15a 24 0 14 0 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 e576 bc b 0 14 4 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ =\nSTACK WIN 4 e577 b8 a 0 14 8 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ =\nSTACK WIN 4 e581 ad 0 0 14 c 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ =\nSTACK WIN 4 e6b7 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e6c1 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e6cb 10 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e6db c5 c 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 e761 17 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 e7a0 5e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e7b8 45 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e7fe 2f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e82d 55 b 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e82e 53 a 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 e82f 51 9 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 e830 4f 8 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 e831 4d 7 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 e882 18a 1d 0 0 0 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 e89e 161 1 0 0 4 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1312 - ^ =\nSTACK WIN 4 e89f 15d 0 0 0 8 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1312 - ^ =\nSTACK WIN 4 ea0c a4 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 eaa4 b 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 eab0 7a 7 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 eab7 71 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 eb2a 1d9 19 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 eb3b 1c1 8 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 eb3f 1ba 4 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 eb43 1b5 0 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 ed03 3c 6 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ed3f 19a c 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 eea0 8 0 0 4 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 eed9 1e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 eef7 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 eefd 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ef03 140 12 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ef04 13e 11 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 ef05 13c 10 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 ef06 13a f 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 ef15 12a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 f043 86 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f044 84 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f045 82 6 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 f046 80 5 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 f04b 7a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 f0c9 8c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f0ca 8a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f0d3 7e 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 f0d4 7c 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 f0d5 7a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 f155 24 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f156 22 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f165 12 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f179 3e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f182 31 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f1b7 76 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f221 8 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 f22d 66 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f22e 64 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f22f 62 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f293 53 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f2e6 96 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f370 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 f37c 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f381 88 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f3fd b 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 f409 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f40e 3 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f411 3e 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f412 3c 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f413 3a 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f41e 2e 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f44f 129 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f453 123 2 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f454 121 1 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f455 11f 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f578 6b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f57c 4d 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f57d 4b 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f5e3 171 4 0 0 0 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f5e7 169 0 0 0 4 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 20 - ^ =\nSTACK WIN 4 f606 149 0 0 0 8 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 24 - ^ = $ebx $T0 20 - ^ =\nSTACK WIN 4 f607 141 0 0 0 c 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 24 - ^ = $ebx $T0 20 - ^ =\nSTACK WIN 4 f754 1d4 1e 0 18 0 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f76d 1b1 5 0 18 4 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ =\nSTACK WIN 4 f76e 1ad 4 0 18 8 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ =\nSTACK WIN 4 f772 1a8 0 0 18 c b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ =\nSTACK WIN 4 f928 2f6 17 0 4 0 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f93e 2d6 1 0 4 4 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 456 - ^ =\nSTACK WIN 4 f93f 2d2 0 0 4 8 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 456 - ^ =\nSTACK WIN 4 fc1e 1ce 18 0 4 0 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 fc37 1ab 0 0 4 4 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 fc38 1a7 0 0 4 8 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 fc3f 19f 0 0 4 c 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 fdec f3 7 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 fdf2 2c 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 fdf3 2a 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 fedf 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 fee4 170 c 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1000a 10 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 1001b b 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 1004c 7 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 10054 15f 10 0 14 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1005b a1 9 0 14 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1005c b2 8 0 14 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 10064 96 0 0 14 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 101b3 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 101ce 4f 6 0 c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1021d 30 4 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1024d 36 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 10283 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10291 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 102a7 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 102b8 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 102cb e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 102d9 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 102ec e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 102fa 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1030d e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1031b 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10331 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10342 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10355 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10363 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10376 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10384 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1039a 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 103ab 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 103c1 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 103d2 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 103e8 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 103f9 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1040c e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1041a c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10426 26 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1044c 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1046d 26 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10493 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 106ab 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 106de 24 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 106e2 1e 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 10702 4a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10707 44 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 10708 42 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1074c 9b0 2c 0 10 0 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1076e 960 a 0 10 4 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 10775 956 3 0 10 8 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 10778 952 0 0 10 c 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 110fc 129 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 11103 120 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 11104 11e 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 11225 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 11258 24 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1125c 1e 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1127c 4a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 11281 44 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 11282 42 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 112c6 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 112d6 f88 2a 0 10 0 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 112f8 f39 8 0 10 4 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2260 - ^ =\nSTACK WIN 4 112f9 f35 7 0 10 8 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2260 - ^ =\nSTACK WIN 4 11300 f2d 0 0 10 c 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2260 - ^ =\nSTACK WIN 4 1225e c2 11 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1226f 9e 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12320 9b c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 123b2 8 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 123bb 46 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 123f8 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 12401 113 8 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12408 21 1 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 12409 1f 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 12514 17 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1252b 83 13 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12534 78 a 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1253e 6d 0 0 10 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 125ae 119 c 0 10 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 126bd 9 0 0 10 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 126c7 7d 8 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 126ce 75 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 126cf 73 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 126fd 2c 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ =\nSTACK WIN 4 12744 81 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 12749 7b 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1274e 75 1 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1274f 73 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 127c5 71 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 127e6 4f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 12836 a0 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 128c8 d 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 128d6 22 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 128f8 19f c 0 0 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 129c5 e 0 0 0 c 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 12a8e 8 0 0 0 c 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 12a97 115 c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12b7f 2c 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 12bac 11e c 0 c c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12ca3 d 0 0 c c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 12cca 3f 9 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12cd3 34 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12cec 18 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12d09 21b c 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12e47 e 0 0 8 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 12f24 79 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12f2b 70 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 12f61 39 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 12f62 37 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 12f9d 21 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 12fbe 46 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 12fc9 3a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13004 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13009 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13040 48 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13088 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 130b3 314 11 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 130c0 305 4 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 130c4 300 0 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 130f1 2d2 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 133c7 b0 d 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 133cd a9 7 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 133d4 a1 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13477 106 11 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 13483 f8 5 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 13484 f6 4 0 4 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 13488 f1 0 0 4 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 1357d 2df 12 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1358a 2d0 5 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 1358b 2ce 4 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 1358f 2c9 0 0 c c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 1385c cd 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13929 2e2 f 0 0 0 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 13938 294 0 0 0 4 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ =\nSTACK WIN 4 1394d 27e 0 0 0 8 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ =\nSTACK WIN 4 13950 27a 0 0 0 c 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ =\nSTACK WIN 4 13c0b a8 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13c0c a6 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13c54 5d 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13cb3 2e3 2a 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 13cd7 2bd 6 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 13cdc 2b7 1 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 13cdd 2b5 0 0 4 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 13f96 72 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13f97 70 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 13f98 6e 5 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 13f9d 68 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 14008 7c c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14079 a 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 14084 d 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14091 d 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1409e d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 140ab f3 23 0 0 4 328 0 1 $T0 $ebp 680 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1419e 1e 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 142f3 a3 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14385 10 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 14396 6 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1439c 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 143b7 26 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 143b8 24 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 143dd 63 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14440 474 a 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14447 42e 3 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 14448 42c 2 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 14449 42a 1 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1444a 428 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 148b4 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 148bf d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 148cc e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 148da e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 148e8 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 148f6 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14904 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14916 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14924 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14932 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14940 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1494b b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14956 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14961 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1496f b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1497a e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14988 19 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 149a1 84 13 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 149a2 80 12 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 149a3 7e 11 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 149c9 57 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ =\nSTACK WIN 4 14a25 d 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14a32 12 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14a44 9c 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14a57 86 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ae0 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14aea 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14aef 7 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14af6 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b00 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b08 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b12 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b1c 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b24 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b2e 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b36 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b40 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b48 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b52 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b5a 7b 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b5d 75 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14bd5 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14bde 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c03 d 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c10 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c14 29 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c26 f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c3d 16 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c53 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c57 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c5b 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c76 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c7a 2f 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ca9 25 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14cce 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14cd2 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14cdf e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ced 20 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14d0d 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14d32 33 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14d65 34 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14d99 13 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14dac 56 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14db2 4d 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14e02 61 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14e03 5d a 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14e04 59 9 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14e63 17 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14e7a 15 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14e8f 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ea3 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14eb1 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ec5 25 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ec6 23 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ed2 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14eea 38 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14eeb 36 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14eec 32 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14f22 91 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14f26 89 3 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14f27 87 2 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14f5c 40 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 14fb3 35 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14fb6 2f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14fe8 81 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14fe9 7d a 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14fea 79 9 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15069 1e 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1506a 1c 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15087 47 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15088 43 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 150ce 47 7 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 150cf 45 6 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 150d0 43 5 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 150d1 41 4 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 15115 65 11 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15116 61 10 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1511b 5b b 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1511c 57 a 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1517a 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1518c 31 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 151bd f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 151cc f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 151db 1d 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 151f8 33 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1522b 73 7 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1522f 6b 3 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15230 5b 2 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1529e 2f 3 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 152cd f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 152dc 79 4 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 152dd 75 3 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 152de 71 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15355 68 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15356 64 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 153bd a6 3 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 153be a2 2 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 153de 81 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 153f0 6e 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 15463 26 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15464 22 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15489 31 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1548e 29 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 154ba d0 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 154be b3 3 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 154bf b1 2 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 154ce 9f 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1558a 69 13 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1559b 4f 2 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1559c 4b 1 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1559d 49 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 155f3 96 22 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15607 79 e 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15615 66 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1563a 29 0 0 8 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 15689 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1568a 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 156b7 62 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 156b8 5e 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 156b9 5a 6 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15719 8b a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1571a 87 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1571b 83 8 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 157a4 1c 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 157a5 18 8 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 157c0 2a 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 157c5 22 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 157ea a6 5 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15890 37 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 158c7 51 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 158c8 4d 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15918 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15919 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15946 6a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15947 66 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1594e 5e 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 159b0 6c a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 159b1 68 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 159b2 64 8 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15a1c e0 e 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15a23 d7 7 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15a2a cd 0 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15a45 b1 0 0 4 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 15afc 4f 6 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15b02 47 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15b4b 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15b6d 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15b8f 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15bb1 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15bb2 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15bdf 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15be0 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15c0d 141 7 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15c14 138 0 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15c95 b3 0 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 15c96 b1 0 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 15d4e d4 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15e22 c4 e 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15ee6 7e d 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15f64 125 11 0 10 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15f75 112 0 0 10 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16089 15f f 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16098 4a 0 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 160f0 b3 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 161e8 31 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16219 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1622b 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1623d 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1624f 150 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16256 147 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1639f a0 6 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1643f 50 5 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1648f 2bb 2b 0 4 0 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 164aa 296 10 0 4 4 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 164b3 28a 7 0 4 8 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 164ba 282 0 0 4 c d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 1674a d9 b 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 167b8 17 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16823 14 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 16837 1b8 18 0 4 0 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16848 1a0 7 0 4 4 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1684f 18d 0 0 4 8 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16870 168 0 0 4 c 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 108 - ^ =\nSTACK WIN 4 169ef 56f 22 0 c 0 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16a03 97 e 0 c 4 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 164 - ^ =\nSTACK WIN 4 16a11 88 0 0 c 8 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 164 - ^ =\nSTACK WIN 4 16f5e 153 10 0 8 0 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16f82 11b 0 0 8 4 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 16f89 113 0 0 8 8 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 16f92 109 0 0 8 c d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 170b1 1ea 1b 0 8 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 170cc 1c8 0 0 8 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 17154 111 0 0 8 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 64 - ^ =\nSTACK WIN 4 17155 10f 0 0 8 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 64 - ^ =\nSTACK WIN 4 1729b e4 15 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 172a2 db e 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 172b0 ca 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1737f f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1738e 100 19 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1739a f2 d 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 173a7 e4 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1748e 46 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 174d4 92 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 17566 b42 14 0 8 0 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 17571 b35 9 0 8 4 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1757a b2b 0 0 8 8 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 175e3 abe 0 0 8 c 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 120 - ^ =\nSTACK WIN 4 180a8 211 13 0 4 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 180af 208 c 0 4 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 180bb 1fb 0 0 4 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 182b9 28b 1f 0 4 0 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 182c5 27a 13 0 4 4 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 182c6 278 12 0 4 8 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 182d8 263 0 0 4 c 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 18544 341 d 0 8 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 18589 2f7 0 0 8 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 185f0 28f 0 0 8 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 185f1 28d 0 0 8 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 18885 4e4 18 0 14 0 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 18893 4d4 a 0 14 4 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ =\nSTACK WIN 4 18894 4d2 9 0 14 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ =\nSTACK WIN 4 1889d 4c8 0 0 14 c 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ =\nSTACK WIN 4 18d69 14c 6 0 0 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 18eb5 116 5 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 18ed6 59 0 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 18fcb 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 18fe6 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19001 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1901c a3 f 0 18 c 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 190b6 8 0 0 18 c 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 190bf a3 f 0 1c c 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19159 8 0 0 1c c 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 19162 387 12 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19172 350 2 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 19173 34e 1 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 19174 34c 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 194e9 13e 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 194f0 135 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19627 b1 6 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 196d8 64 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 196df 5b 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1973c 57 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19793 8f 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19822 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19836 14 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1984a 87 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 198d1 e3 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 199b4 1bd 9 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 199bb 1b4 2 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 199bc 1b2 1 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 199bd 1b0 0 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 19b71 71 b 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19b76 6b 6 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 19b7b 65 1 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 19b7c 63 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 19be2 b3 e 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19be6 1a a 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 19be7 2e 9 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 19bf0 e 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 19c95 46 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19c9a 40 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19cdb a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19ce5 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19ceb 51 6 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19d3c 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19d51 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19d64 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19d79 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19d8c 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19da1 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19db4 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19dcc 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19de2 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19dfa 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e10 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e28 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e3e 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e56 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e6c 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e81 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e94 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19ea9 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19ebc 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19ed1 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19ee4 53 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19f37 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19f45 44 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19f89 1de 1a 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19f9a 1c6 9 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 19f9b 1c2 8 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 19fa3 1b9 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1a167 78 c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a1d5 9 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 1a1df 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a1e4 1f7 8 0 14 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a1eb 1ee 1 0 14 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1a1ec 1ec 0 0 14 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1a246 174 0 0 14 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1a3db 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a404 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a41f 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a449 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a464 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a46d 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a4c1 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a4ec 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a53b 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a564 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a5b3 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a5dc 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a62b 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a654 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a6a8 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a6d3 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a722 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a74b 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a79a 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a7c3 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a817 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a842 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a896 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a8c1 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a915 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a940 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a98f 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a9b8 d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a9c5 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a9cd 1f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a9ec 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1aa06 1f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1aa25 1c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1aa41 12 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1aa53 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1aa6e 13b 1d 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1aa83 126 8 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 1aba9 3b 6 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1abe4 13d 1d 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1abf9 128 8 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 1ad21 3b 6 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1ad5c 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1ad76 3a2 1d 0 20 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1ad87 391 c 0 20 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 1b118 43 6 0 24 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1b15b 1b8 1d 0 1c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1b170 1a3 8 0 1c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 1b313 40 6 0 20 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1b353 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b359 29 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b382 419 6 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1b3a4 3f5 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1b3a5 3ed 0 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1b79b 190 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b79c 18e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b92b 73 4 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b92c 71 3 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1b92d 6f 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1b92e 6d 1 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1b92f 6b 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1b99e 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b9a5 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1b9a6 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1b9d1 40 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b9d2 3e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1ba11 1c8 11 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1ba18 1bf a 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1ba1c 1ba 6 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1ba22 1b3 0 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1bbd9 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1bbe0 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1bbe1 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1bc0c 89 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1bc0d 87 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1bc95 2c4 c 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1bc9c 2bb 5 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1bc9d 2b9 4 0 4 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1bca1 2b4 0 0 4 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1bf59 395 1b 0 4 0 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1bf6a 37d a 0 4 4 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 1bf6d 377 7 0 4 8 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 1bf74 36f 0 0 4 c 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 1c2ee 29 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c317 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c32d 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c353 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c379 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c39f 3 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c3a2 fe 9 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1c3a9 e9 2 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1c3aa e7 1 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1c3ab e5 0 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1c4a0 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c4a9 fe 9 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1c4b0 e9 2 0 4 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 1c4b1 e7 1 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 1c4b2 e5 0 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 1c5a7 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c5b0 355 9 0 4 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1c5b7 34c 2 0 4 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1c5b8 348 1 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1c5b9 346 0 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1c905 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c90e 20 6 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c912 1b 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c917 15 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c92e 36 6 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c934 2f 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1c964 79 8 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1c969 72 3 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1c96a 70 2 0 4 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1c9dd 3e6 11 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1c9e2 3df c 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1c9e9 3d7 5 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1c9ea 3d5 4 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1cdc3 45d 1d 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1cdd7 449 9 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 1d220 1af a 0 18 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d22a 1a3 0 0 18 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 1d270 15c 0 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 1d2a3 128 0 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 1d3cf 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d3ed 1d 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d40a 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d428 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d496 60 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d49c 56 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1d4a5 45 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1d4a6 43 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1d4f6 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d50a 77 11 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d51b 5f 0 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d581 1e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d59f 32 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d5a0 30 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d5d1 1b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d5ec 96 12 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d5fd 7c 1 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d5fe 78 0 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d682 72 11 0 8 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d693 5a 0 0 8 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d6cf 13 0 0 8 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d6f4 1d0 13 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d705 1b6 2 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ =\nSTACK WIN 4 1d706 1b2 1 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ =\nSTACK WIN 4 1d707 1b0 0 0 4 c 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ =\nSTACK WIN 4 1d8c4 bf 12 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d8d5 a5 1 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d8d6 a1 0 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d983 2c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d9af 65 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1da14 3c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1da50 1e3 4 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1da51 1e1 3 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1da52 1df 2 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1da53 1dd 1 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1da54 1db 0 0 c 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1dc33 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1dc45 18 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1dc5d 40 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1dc9d 78 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1dd15 1490 4 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1dd16 83f 3 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1dd17 83d 2 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1f1a5 1680 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1f1a9 15f8 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1f1aa 15f6 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1f1db 86c 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 20825 be 9 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2082e a9 0 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 20840 96 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 20930 82 6 0 c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 209b2 6e 4 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20a20 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20a25 22b 8 0 14 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20a2c 222 1 0 14 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20a2d 220 0 0 14 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20a8b 1c1 0 0 14 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 20c50 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20c79 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20c94 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20cbe 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20cd9 1f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20cf8 1f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20d17 2d 9 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20d20 23 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20d44 94 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20d45 92 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20d4a 8c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20dd8 cd c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20e9b 9 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 20ea5 2c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20ea6 2a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20ed1 2a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20efb 22 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20efc 20 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20f1d d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20f64 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20f75 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20f8a 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20f8f 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20f94 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20fa5 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20fba 50 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20fd7 1c 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 2100a 60 9 0 0 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21013 57 0 0 0 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 2106a d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 21077 170 5 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2107c 169 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 210e1 103 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 21125 be 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 211e7 182 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 21369 b6 7 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21370 ad 0 0 c 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 2141f 2f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 2147c 47 10 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 214c3 1b2 2a 0 18 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 214e0 195 d 0 18 c 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 21675 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 2167a 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 216a9 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 216ae 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 216dd 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 216e2 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 21711 a2 c 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21718 99 5 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 2171d 93 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 2172b 84 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 217b3 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217b9 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217bf 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217c5 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217cb c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217d7 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217e3 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217ef 349 c 0 0 c 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21a99 d 0 0 0 c 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 21b38 1f5 14 0 24 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21b47 1e4 5 0 24 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 21b48 1e2 4 0 24 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 21b49 1e0 3 0 24 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 21d2d 1ae 5 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21d32 15f 0 0 0 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21d62 12e 0 0 0 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 21edb 4f c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21f21 8 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 21f2a 38 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21f59 8 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 21f62 41 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21f9a 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 21fa3 35 a 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 21fa8 2f 5 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 21fad 27 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 21fd8 d3 7 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21fdf ca 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 22020 88 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 22068 33 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 220ab 50 4 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 220af 4a 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 220fb f0 e 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22102 e7 7 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 22108 e0 1 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 22109 de 0 0 10 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 221eb 5c 4 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 221ef 56 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22247 db 8 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2224c d2 3 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2224d d0 2 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 22277 a5 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 22322 28 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2234a 25 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2236f 18 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 22387 f6 c 0 14 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2238e eb 5 0 14 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 22393 e5 0 0 14 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 2247d 33 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22498 16 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 224b0 1d 4 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 224b4 17 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 224cd 224 17 0 1c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 224e2 20f 2 0 1c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 226f1 3e 6 0 1c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2272f 294 8 0 14 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22736 28b 1 0 14 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 22737 289 0 0 14 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 22793 1f9 0 0 14 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 229c3 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 229ec 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 22a07 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22a31 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 22a7b 81 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 22a83 70 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 22a92 60 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 22a93 5e 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 22afc 93 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22b00 8d 3 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 22b01 8b 2 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 22b40 4b 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 22b8f a2 6 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22b94 9b 1 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22b95 99 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22c31 83 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22cab 8 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 22cb4 d8 c 0 10 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22d83 8 0 0 10 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 22d8c e6 c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22e69 8 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 22e72 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 22e7a 117 8 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22e81 10e 1 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 22e82 10c 0 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 22f91 27 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 23021 ec 7 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 23028 e3 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 23088 82 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 2310d 17 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 23124 95 a 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2312a 7d 4 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 2312b 7b 3 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 2312e 77 0 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 231b9 1a 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 231d3 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 231ed 389 16 0 18 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 23201 375 2 0 18 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 23576 40 6 0 20 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 235b6 f8 7 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 235bd ef 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 2361d 8e 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 236ae 27 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 236d5 4d 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 236d6 48 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 23722 5d 4 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2373e 3f 0 0 0 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2373f 3d 0 0 0 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2377f 24c f 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 23789 95 5 0 8 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 2378e 8f 0 0 8 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 237b1 6b 0 0 8 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 239cb 50 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 239cc 4e 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 239d1 48 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 239dc 3c 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 239dd 3a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 23a1b ba 7 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 23a22 b1 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 23a5f 73 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 23ad5 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 240b9 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 0 1000 13 0 0 4 0 0 0 0 0\nSTACK WIN 0 1020 1b 0 0 10 0 0 0 0 0\nSTACK WIN 0 1040 1b 0 0 10 0 0 0 0 0\nSTACK WIN 0 1060 19 8 0 4 0 0 0 0 0\nSTACK WIN 0 1080 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 1090 24 3 0 4 0 0 0 0 0\nSTACK WIN 0 10c0 f 0 0 8 0 0 0 0 0\nSTACK WIN 0 10d0 17 0 0 4 0 0 0 0 0\nSTACK WIN 0 10f0 27 9 0 10 0 0 0 0 0\nSTACK WIN 0 1120 27 9 0 10 0 0 0 0 0\nSTACK WIN 0 1150 d 0 0 8 0 0 0 0 0\nSTACK WIN 0 1160 13 0 0 4 0 0 0 0 0\nSTACK WIN 0 1180 21 d 0 10 0 0 0 0 0\nSTACK WIN 0 11b0 21 d 0 10 0 0 0 0 0\nSTACK WIN 0 11e0 7 0 0 0 0 0 0 0 0\nSTACK WIN 0 11f0 6b 28 0 4 8 10 0 0 0\nSTACK WIN 0 1260 32 3 0 0 0 0 0 0 0\nSTACK WIN 0 12a0 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 12b0 47 3 0 4 0 0 0 0 0\nSTACK WIN 0 1300 19 8 0 4 0 0 0 0 0\nSTACK WIN 0 1320 32 3 0 0 0 0 0 0 0\nSTACK WIN 0 1360 47 3 0 4 0 0 0 0 0\nSTACK WIN 0 13b0 19 8 0 4 0 0 0 0 0\nSTACK WIN 0 13d0 32 3 0 0 0 0 0 0 0\nSTACK WIN 0 1410 47 3 0 4 0 0 0 0 0\nSTACK WIN 0 1460 19 8 0 4 0 0 0 0 0\nSTACK WIN 0 1480 71 29 0 4 c 10 0 0 0\nSTACK WIN 0 1500 1b 0 0 8 0 0 0 0 0\nSTACK WIN 0 1520 35 4 0 0 0 0 0 0 0\nSTACK WIN 0 1560 20b 2d 0 14 14 14 0 0 1\nSTACK WIN 0 19f0 31 0 0 0 0 0 0 0 0\nSTACK WIN 0 1a30 51 d 0 4 c 0 0 0 0\nSTACK WIN 0 1a90 c7 7 0 4 10 8 0 0 1\nSTACK WIN 0 1b60 36 0 0 0 0 0 0 0 0\nSTACK WIN 0 1ba0 3 0 0 0 0 0 0 0 0\nSTACK WIN 0 1db0 81 2 0 8 0 0 0 0 0\nSTACK WIN 0 1e40 1d 7 0 0 0 0 0 0 0\nSTACK WIN 0 1e60 a2 3a 0 4 10 c4 0 0 0\nSTACK WIN 0 1f10 142 c 0 c 0 38 0 0 1\nSTACK WIN 0 2060 138 38 0 0 8 244 0 0 0\nSTACK WIN 0 21a0 3b 7 0 4 0 0 0 0 0\nSTACK WIN 0 21e0 25 5 0 4 0 0 0 0 0\nSTACK WIN 0 2210 26 3 0 0 0 0 0 0 0\nSTACK WIN 0 2240 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 2250 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 2260 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 2280 27 3 0 0 0 0 0 0 0\nSTACK WIN 0 22b0 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 22c0 24 3 0 4 0 0 0 0 0\nSTACK WIN 0 22f0 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 2300 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 2310 26 0 0 0 0 0 0 0 0\nSTACK WIN 0 2340 1d 1 0 0 0 0 0 0 0\nSTACK WIN 0 2360 1d 1 0 0 0 0 0 0 0\nSTACK WIN 0 2380 13 0 0 0 0 0 0 0 0\nSTACK WIN 0 23a0 23 0 0 0 0 0 0 0 0\nSTACK WIN 0 23d0 56 5 0 0 8 c 0 0 0\nSTACK WIN 0 2430 47 c 0 0 c 8 0 0 0\nSTACK WIN 0 24f0 23 1 0 0 0 4 0 0 0\nSTACK WIN 0 2520 3f b 0 8 0 0 0 0 0\nSTACK WIN 0 2560 20 0 0 0 0 0 0 0 0\nSTACK WIN 0 2580 20 0 0 0 0 0 0 0 0\nSTACK WIN 0 25a0 1d 0 0 0 0 0 0 0 0\nSTACK WIN 0 25c0 da 11 0 c 0 0 0 0 1\nSTACK WIN 0 26a0 27 8 0 4 0 0 0 0 0\nSTACK WIN 0 26d0 4a d 0 8 0 0 0 0 0\nSTACK WIN 0 2720 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 2730 5 2 0 4 0 0 0 0 0\nSTACK WIN 0 2740 5 2 0 4 0 0 0 0 0\nSTACK WIN 0 2750 3 2 0 0 0 0 0 0 0\nSTACK WIN 0 2760 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 2770 ef 11 0 c 0 0 0 0 1\nSTACK WIN 0 2860 2b 8 0 4 0 0 0 0 0\nSTACK WIN 0 2890 4f d 0 8 0 0 0 0 0\nSTACK WIN 0 28e0 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 28f0 5 2 0 4 0 0 0 0 0\nSTACK WIN 0 2900 3 2 0 0 0 0 0 0 0\nSTACK WIN 0 2910 13 0 0 0 0 0 0 0 0\nSTACK WIN 0 2930 86 a 0 10 10 4 0 0 1\nSTACK WIN 0 29c0 23 0 0 0 0 0 0 0 0\nSTACK WIN 0 29f0 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 2a00 26 0 0 0 0 0 0 0 0\nSTACK WIN 0 2a30 23 0 0 0 0 0 0 0 0\nSTACK WIN 0 2a60 76 23 0 0 4 50 0 0 0\nSTACK WIN 0 2ae0 3 0 0 4 0 0 0 0 0\nSTACK WIN 0 2af0 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 2b00 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 2b30 32 6 0 4 8 0 0 0 0\nSTACK WIN 0 2b70 2f 6 0 0 8 0 0 0 0\nSTACK WIN 0 2ba0 20 0 0 0 0 0 0 0 0\nSTACK WIN 0 2bc0 20 0 0 0 0 0 0 0 0\nSTACK WIN 0 2be0 1d 0 0 0 0 0 0 0 0\nSTACK WIN 0 2c00 c1 5 0 8 0 0 0 0 1\nSTACK WIN 0 2cd0 83 8 0 8 0 0 0 0 1\nSTACK WIN 0 2d60 1f 0 0 4 0 0 0 0 0\nSTACK WIN 0 2d80 bc b 0 8 0 0 0 0 1\nSTACK WIN 0 2e40 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 2e50 5 2 0 4 0 0 0 0 0\nSTACK WIN 0 2e60 e 0 0 8 0 0 0 0 0\nSTACK WIN 0 2e70 da 4 0 8 0 0 0 0 1\nSTACK WIN 0 2f50 97 8 0 8 0 0 0 0 1\nSTACK WIN 0 2ff0 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 3000 23 0 0 4 0 0 0 0 0\nSTACK WIN 0 3030 c7 e 0 8 0 0 0 0 1\nSTACK WIN 0 3100 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 3110 5 2 0 4 0 0 0 0 0\nSTACK WIN 0 3120 e 0 0 8 0 0 0 0 0\nSTACK WIN 0 3130 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 3140 208 6 0 8 10 8 0 0 1\nSTACK WIN 0 33d0 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 33e0 8 0 0 0 0 0 0 0 0\nSTACK WIN 0 33f0 56 3 0 0 0 10 0 0 0\nSTACK WIN 0 3450 32 0 0 4 0 0 0 0 0\nSTACK WIN 0 3490 28 0 0 0 0 0 0 0 0\nSTACK WIN 0 34c0 19 0 0 0 0 0 0 0 0\nSTACK WIN 0 34e0 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 3510 19 8 0 4 0 0 0 0 0\nSTACK WIN 0 3530 7 0 0 0 0 0 0 0 0\nSTACK WIN 0 3540 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 36d0 39 8 0 4 0 0 0 0 0\nSTACK WIN 0 3710 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 38a0 3a 8 0 4 0 0 0 0 0\nSTACK WIN 0 38e0 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 38f0 32 0 0 4 0 0 0 0 0\nSTACK WIN 0 3930 19 0 0 0 0 0 0 0 0\nSTACK WIN 0 3950 56 7 0 4 0 c 0 0 0\nSTACK WIN 0 39b0 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 39c0 59 7 0 4 0 c 0 0 0\nSTACK WIN 0 3a20 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 3a30 21 d 0 10 0 0 0 0 0\nSTACK WIN 0 3a60 27 9 0 10 0 0 0 0 0\nSTACK WIN 0 3a90 24 f 0 0 0 0 0 0 0\nSTACK WIN 0 3ac0 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 3ad0 15 0 0 0 0 0 0 0 0\nSTACK WIN 0 3af0 21 d 0 10 0 0 0 0 0\nSTACK WIN 0 3b20 27 9 0 10 0 0 0 0 0\nSTACK WIN 0 3b50 22 d 0 0 0 0 0 0 0\nSTACK WIN 0 3b80 10 0 0 0 0 0 0 0 0\nSTACK WIN 0 3b90 25 11 0 0 0 0 0 0 0\nSTACK WIN 0 3bc0 4f a 0 0 0 10 0 0 0\nSTACK WIN 0 3c10 54 7 0 8 0 c 0 0 0\nSTACK WIN 0 3c70 57 7 0 8 0 c 0 0 0\nSTACK WIN 0 3cd0 19 8 0 4 0 0 0 0 0\nSTACK WIN 0 3cf0 7 1 0 0 0 4 0 0 0\nSTACK WIN 0 3d00 21 d 0 14 0 0 0 0 0\nSTACK WIN 0 3d30 7 1 0 0 0 4 0 0 0\nSTACK WIN 0 3d40 27 9 0 14 0 0 0 0 0\nSTACK WIN 0 3d70 3 0 0 0 0 0 0 0 0\nSTACK WIN 0 3d80 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 3d90 7 1 0 0 0 4 0 0 0\nSTACK WIN 0 3da0 15 0 0 4 0 0 0 0 0\nSTACK WIN 0 3dc0 1 0 0 4 0 0 0 0 0\nSTACK WIN 0 3dd0 15 0 0 8 0 0 0 0 0\nSTACK WIN 0 3df0 21 d 0 14 0 0 0 0 0\nSTACK WIN 0 3e20 27 9 0 14 0 0 0 0 0\nSTACK WIN 0 3e50 22 d 0 0 0 0 0 0 0\nSTACK WIN 0 3e80 10 0 0 0 0 0 0 0 0\nSTACK WIN 0 3e90 7 1 0 0 0 4 0 0 0\nSTACK WIN 0 3ea0 25 11 0 c 0 0 0 0 0\nSTACK WIN 0 3ed0 3 0 0 4 0 0 0 0 0\nSTACK WIN 0 3ee0 15 0 0 0 0 0 0 0 0\nSTACK WIN 0 3f00 22 d 0 8 0 0 0 0 0\nSTACK WIN 0 3f30 13 0 0 0 0 0 0 0 0\nSTACK WIN 0 3f50 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 3f60 15 0 0 8 0 0 0 0 0\nSTACK WIN 0 3f80 22 d 0 0 0 0 0 0 0\nSTACK WIN 0 3fb0 15 0 0 4 0 0 0 0 0\nSTACK WIN 0 3fd0 15 0 0 4 0 0 0 0 0\nSTACK WIN 0 3ff0 13 0 0 4 0 0 0 0 0\nSTACK WIN 0 4010 ae e 0 4 0 54 0 0 0\nSTACK WIN 0 40c0 ae e 0 4 0 4c 0 0 0\nSTACK WIN 0 4170 40 7 0 4 0 0 0 0 0\nSTACK WIN 0 4464 13 0 0 0 0 0 0 0 0\nSTACK WIN 0 466c 16 0 0 0 0 0 0 0 0\nSTACK WIN 0 46a0 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 46f2 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 5405 14 0 0 0 0 0 0 0 0\nSTACK WIN 0 58bc a 0 0 0 0 0 0 0 0\nSTACK WIN 0 6039 12 0 0 0 0 0 0 0 0\nSTACK WIN 0 60e0 8b 0 0 4 0 0 0 0 0\nSTACK WIN 0 71eb b 0 0 0 0 0 0 0 0\nSTACK WIN 0 7a28 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 7b36 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 7cc5 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 7f28 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 8151 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 821f 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 8390 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 83ce 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 8477 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 8714 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 8747 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 8779 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 87b4 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 89d2 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 8a62 7c 0 0 0 0 0 0 0 0\nSTACK WIN 0 8c49 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 8ce2 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 9694 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 9835 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 9841 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 9a66 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 9ab6 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 9ae0 4c 8 0 c 10 0 0 0 1\nSTACK WIN 0 9c4a 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 9ca8 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 9ee5 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 9fd7 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 a04a 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 a163 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 a1b9 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 a1d0 88 0 0 8 0 0 0 0 0\nSTACK WIN 0 a2c0 7a 0 0 c 0 0 0 0 0\nSTACK WIN 0 c23c a 0 0 0 0 0 0 0 0\nSTACK WIN 0 df29 14 0 0 0 0 0 0 0 0\nSTACK WIN 0 dfed a 0 0 0 0 0 0 0 0\nSTACK WIN 0 e257 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 e40d 15 0 0 0 0 0 0 0 0\nSTACK WIN 0 e761 17 0 0 0 0 0 0 0 0\nSTACK WIN 0 eaa4 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 eea0 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 f221 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 f370 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 f3fd c 0 0 0 0 0 0 0 0\nSTACK WIN 0 1000a 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 1001b c 0 0 0 0 0 0 0 0\nSTACK WIN 0 1004c 8 0 0 0 0 0 0 0 0\nSTACK WIN 0 10558 90 3 0 c c 0 0 0 0\nSTACK WIN 0 105e8 46 0 0 10 4 0 0 0 1\nSTACK WIN 0 1064a 17 4 0 0 10 0 0 0 1\nSTACK WIN 0 10661 19 0 0 0 0 0 0 0 0\nSTACK WIN 0 10694 17 1 0 8 4 0 0 0 1\nSTACK WIN 0 123b2 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 123f8 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 126bd a 0 0 0 0 0 0 0 0\nSTACK WIN 0 128c8 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 129c5 f 0 0 0 0 0 0 0 0\nSTACK WIN 0 12a8e 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 12b7f 2d 0 0 0 0 0 0 0 0\nSTACK WIN 0 12ca3 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 12e47 f 0 0 0 0 0 0 0 0\nSTACK WIN 0 14079 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 14221 84 3 0 8 c 0 0 0 0\nSTACK WIN 0 142a5 23 0 0 0 0 0 0 0 0\nSTACK WIN 0 142f0 3 0 0 0 0 0 0 0 0\nSTACK WIN 0 14385 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 190b6 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 19159 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 1a1d5 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 20e9b a 0 0 0 0 0 0 0 0\nSTACK WIN 0 20fd7 1c 0 0 0 0 0 0 0 0\nSTACK WIN 0 21a99 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 21f21 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 21f59 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 21f9a 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 22cab 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 22d83 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 22e69 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 23b00 be 0 0 8 0 0 0 0 0\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/testdata/module1.out",
    "content": "MODULE windows x86 111111111111111111111111111111111 module1.pdb\nINFO CODE_ID FFFFFFFF module1.exe\nFILE 1 file1_1.cc\nFILE 2 file1_2.cc\nFILE 3 file1_3.cc\nFUNC 1000 c 0 Function1_1\n1000 4 44 1\n1004 4 45 1\n1008 4 46 1\nFUNC 1100 8 4 Function1_2\n1100 4 65 2\n1104 4 66 2\nFUNC 1200 100 8 Function1_3\nFUNC 1300 100 c Function1_4\nFUNC 2000 0 0 Test_Zero_Size_Function_Is_Ignored\n2000 4 88 2\nPUBLIC 2800 0 PublicSymbol\nFUNC 3000 7000 42 LargeFunction\n3000 7000 4098359 3\nSTACK WIN 4 1000 c 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ =\nSTACK WIN 4 1100 8 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ =\nSTACK WIN 4 1100 100 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ =\nSTACK WIN 4 1300 100 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ =\nSTACK CFI INIT 3d40 af .cfa: $esp 4 + .ra: .cfa 4 - ^\nSTACK CFI 3d41 .cfa: $esp 8 + \nSTACK CFI 3d43 .cfa: $ebp 8 + $ebp: .cfa 8 - ^\nSTACK CFI 3d54 $ebx: .cfa 20 - ^\nSTACK CFI 3d5a $esi: .cfa 16 - ^\nSTACK CFI 3d84 $edi: .cfa 12 - ^\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/testdata/module2.out",
    "content": "MODULE windows x86 222222222 module2.pdb\nFILE 1 file2_1.cc\nFILE 2 file2_2.cc\nFILE 3 file2_3.cc\nFUNC 2000 c 4 Function2_1\n1000 4 54 1\n1004 4 55 1\n1008 4 56 1\nPUBLIC 2160 0 Public2_1\nFUNC 2170 14 4 Function2_2\n2170 6 10 2\n2176 4 12 2\n217a 6 13 2\n2180 4 21 2\nPUBLIC 21a0 0 Public2_2\nSTACK WIN 4 2000 c 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ =\nSTACK WIN 4 2170 14 1 0 0 0 0 0 1 $eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ =\nSTACK CFI INIT 3df0 af .cfa: $esp 4 + .ra: .cfa 4 - ^\nSTACK CFI 3df1 .cfa: $esp 8 +\nSTACK CFI 3df3 .cfa: $ebp 8 + $ebp: .cfa 8 - ^\nSTACK CFI 3e04 $ebx: .cfa 20 - ^\nSTACK CFI 3e0a $esi: .cfa 16 - ^\nSTACK CFI 3e34 $edi: .cfa 12 - ^\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/testdata/module3_bad.out",
    "content": "MODULE windows x86 333333333333333333333333333333333 module3.pdb\nFILE 1 file1.cc\nFUNC 1000\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/testdata/module4_bad.out",
    "content": "MODULE windows x86 444444444444444444444444444444444 module4.pdb\nFILE 1 file4_1.cc\nFILE 2 file4_2.cc\n1000 4 44 1\n1004 4 45 1\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/testdata/symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym",
    "content": "MODULE windows x86 BCE8785C57B44245A669896B6A19B9542 kernel32.pdb\nPUBLIC b5ae c BaseDllInitialize\nPUBLIC 9b47 4 CloseHandle\nPUBLIC 17826 0 BaseDllInitializeMemoryManager\nPUBLIC 55709 10 EnumResourceNamesW\nPUBLIC be41 4 BaseDllMapResourceIdA\nPUBLIC 98f4 8 BasepMapModuleHandle\nPUBLIC 936b 4 BaseSetLastNTError\nPUBLIC 92b0 4 SetLastError\nPUBLIC 30769 0 GetLastError\nPUBLIC b722 0 ConsoleApp\nPUBLIC 29d7a 18 SetUpConsoleInfo\nPUBLIC 1b069 0 InitExeName\nPUBLIC 17860 0 InitializeCtrlHandling\nPUBLIC 29f30 4 SetUpHandles\nPUBLIC 1dc03 8 SetStdHandle\nPUBLIC 12f39 4 GetStdHandle\nPUBLIC 17889 4 BaseDllInitializeIniFileMappings\nPUBLIC 17923 0 NlsServerInitialize\nPUBLIC 180a6 0 NlsProcessInitialize\nPUBLIC 1795e 0 AllocTables\nPUBLIC 179ea 0 GetUnicodeFileInfo\nPUBLIC 16e70 c GetLocaleFileInfo\nPUBLIC 18a21 0 GetDefaultSortkeyFileInfo\nPUBLIC 17cb5 0 GetDefaultSortTablesFileInfo\nPUBLIC 1839b 8 GetSortTablesFileInfo\nPUBLIC 998d 8 LocalAlloc\nPUBLIC 992f 4 LocalFree\nPUBLIC 1625 20 DeviceIoControl\nPUBLIC 32eb1 4 LocalUnlock\nPUBLIC 32e1d 4 LocalLock\nPUBLIC a03b 4 ResetEvent\nPUBLIC a017 4 SetEvent\nPUBLIC 55921 4 SetLocalTime\nPUBLIC a35e 18 CompareStringW\nPUBLIC 55a0e 4 LocalFlags\nPUBLIC 55b09 4 LocalHandle\nPUBLIC 30927 c LocalReAlloc\nPUBLIC 30bd3 c InternalFindAtom\nPUBLIC 37923 0 wcscpy\nPUBLIC 33107 14 InternalGetAtomName\nPUBLIC ffb1 c InternalAddAtom\nPUBLIC 326c1 4 AddAtomW\nPUBLIC ab78 4 BaseDllMapResourceIdW\nPUBLIC 2d9b2 0 wcslen\nPUBLIC 330e7 c GetAtomNameW\nPUBLIC a9cc 8 lstrcmpW\nPUBLIC ba64 8 lstrcpyW\nPUBLIC bbce c FindResourceW\nPUBLIC e6dc 18 SearchPathW\nPUBLIC 1021c 10 BaseCreateStack\nPUBLIC 55bb1 0 wcscat\nPUBLIC 30b7d 8 InternalDeleteAtom\nPUBLIC 2c86d 0 CloseProfileUserMapping\nPUBLIC ddfe 1c DuplicateHandle\nPUBLIC a996 8 lstrcmpiW\nPUBLIC b64c 8 BaseThreadStart\nPUBLIC 2520 8 WaitForSingleObject\nPUBLIC 1042c 1c CreateRemoteThread\nPUBLIC 98eb 0 GetCurrentThread\nPUBLIC 9766 4 InterlockedIncrement\nPUBLIC 977a 4 InterlockedDecrement\nPUBLIC 978e 8 InterlockedExchange\nPUBLIC 97a2 c InterlockedCompareExchange\nPUBLIC 97b6 8 InterlockedExchangeAdd\nPUBLIC 97c6 c MulDiv\nPUBLIC 10659 8 BaseThreadStartThunk\nPUBLIC 10665 8 BaseProcessStartThunk\nPUBLIC 10672 4 SwitchToFiber\nPUBLIC 106fa 18 _ResourceCallEnumLangRoutine\nPUBLIC 1071e 14 _ResourceCallEnumNameRoutine\nPUBLIC 1073e 10 _ResourceCallEnumTypeRoutine\nPUBLIC 2ff92 0 BaseFiberStart\nPUBLIC 103a3 14 BaseInitializeContext\nPUBLIC 55bbc 4 ResetAccessDate\nPUBLIC 55bee 4 ComputeRemainingSize\nPUBLIC 55c24 8 ComputeRequestSize\nPUBLIC 55c57 c ReportTransfer\nPUBLIC 55c83 8 BackupReadBuffer\nPUBLIC 55cd4 c BackupReadStream\nPUBLIC 55df2 4 BackupTestRestartStream\nPUBLIC 55eb4 8 BasepIsDataAttribute\nPUBLIC 55eef 18 BackupSeek\nPUBLIC 5604f c BackupWriteHeader\nPUBLIC 560f8 c BackupWriteSparse\nPUBLIC 561d4 c BackupWriteStream\nPUBLIC 5627e c BackupWriteAlternateData\nPUBLIC 56381 4 BackupAlloc\nPUBLIC 563b1 4 BackupFree\nPUBLIC 563d6 8 GrowBuffer\nPUBLIC 5643b 4 FreeBuffer\nPUBLIC 5645f 4 FreeContext\nPUBLIC 564b8 4 AllocContext\nPUBLIC 56519 c BackupGetSparseMap\nPUBLIC 5669e c BackupReadData\nPUBLIC 5676b c BackupReadAlternateData\nPUBLIC 569ec c BackupReadEaData\nPUBLIC 56ada c BackupReadObjectId\nPUBLIC 56b94 c BackupReadReparseData\nPUBLIC 56cc7 c BackupReadSecurityData\nPUBLIC 56ddf 1c BackupRead\nPUBLIC 57012 8 BackupWriteBuffer\nPUBLIC 570a4 c BackupWriteEaData\nPUBLIC 570ef c BackupWriteReparseData\nPUBLIC 5714f c BackupWriteObjectId\nPUBLIC 571c9 c BackupWriteSecurityData\nPUBLIC 572ae c BackupWriteLinkData\nPUBLIC 573fe 1c BackupWrite\nPUBLIC 37bfc 0 NotifySoundSentry\nPUBLIC 37a77 8 Beep\nPUBLIC 575f7 4 BaseValidateNetbiosName\nPUBLIC 57665 4 BaseValidateDnsNames\nPUBLIC 576da 10 BasepGetMultiValueAddr\nPUBLIC 5773b c BaseGetMultiValueIndex\nPUBLIC 577c2 c BaseRemoveMultiValue\nPUBLIC 5786b c BaseAddMultiValue\nPUBLIC 202af 10 BasepGetNameFromReg\nPUBLIC 578bb c BaseSetNameInReg\nPUBLIC 5795d 10 BaseSetMultiNameInReg\nPUBLIC 579f7 c BaseCreateMultiValue\nPUBLIC 57aa8 c BaseAddMultiNameInReg\nPUBLIC 57bae c BaseRemoveMultiNameFromReg\nPUBLIC 57c97 4 BaseSetNetbiosName\nPUBLIC 57cd4 4 BaseSetDnsName\nPUBLIC 57da5 4 BaseSetDnsDomain\nPUBLIC 57e41 4 BaseSetAltNetBiosName\nPUBLIC 57e85 4 BaseSetAltDnsFQHostname\nPUBLIC 57eb6 4 BaseIsAltDnsFQHostname\nPUBLIC 57f59 4 BaseRemoveAltNetBiosName\nPUBLIC 57f8a 8 BaseEnumAltDnsFQHostnames\nPUBLIC 57fdd 8 BaseParseDnsName\nPUBLIC 31893 10 GetNameFromValue\nPUBLIC 316c7 8 GetComputerNameW\nPUBLIC 5808d 4 SetComputerNameW\nPUBLIC 201f1 c GetComputerNameExW\nPUBLIC 581b3 8 SetComputerNameExW\nPUBLIC 216a4 8 GetComputerNameA\nPUBLIC 58234 4 SetComputerNameA\nPUBLIC 582a7 c GetComputerNameExA\nPUBLIC 5834c 8 SetComputerNameExA\nPUBLIC 583a3 10 EnumerateLocalComputerNamesW\nPUBLIC 58523 10 EnumerateLocalComputerNamesA\nPUBLIC 2ceb2 c DnsHostnameToComputerNameW\nPUBLIC 585cf c DnsHostnameToComputerNameA\nPUBLIC 5866b 10 BasepGetComputerNameFromNtPath\nPUBLIC 58bc3 8 BaseMultiByteToWideCharWithAlloc\nPUBLIC 58c3e 4 BaseConvertCharFree\nPUBLIC 58c69 4 BaseIsNetBiosNameInUse\nPUBLIC 58e0a 8 AddLocalAlternateComputerNameW\nPUBLIC 58f26 8 AddLocalAlternateComputerNameA\nPUBLIC 58f6f 8 RemoveLocalAlternateComputerNameW\nPUBLIC 59050 8 RemoveLocalAlternateComputerNameA\nPUBLIC 59099 8 SetLocalPrimaryComputerNameW\nPUBLIC 592af 8 SetLocalPrimaryComputerNameA\nPUBLIC 592f8 8 LZCopy\nPUBLIC 593ae 8 CopyLZFile\nPUBLIC b852 10 GetFullPathNameW\nPUBLIC b877 8 GetCurrentDirectoryW\nPUBLIC 30b14 0 GetLogicalDrives\nPUBLIC f272 4 CheckForSameCurdir\nPUBLIC 138fc 10 GetFullPathNameA\nPUBLIC 34ffe 8 GetCurrentDirectoryA\nPUBLIC 360dd 4 SetCurrentDirectoryA\nPUBLIC f2ee 4 SetCurrentDirectoryW\nPUBLIC 176b 4 GetSystemTime\nPUBLIC 17e5 4 GetSystemTimeAsFileTime\nPUBLIC 593be 4 SetSystemTime\nPUBLIC 929c 0 GetTickCount\nPUBLIC e7ec 8 FileTimeToSystemTime\nPUBLIC 10b1c 8 SystemTimeToFileTime\nPUBLIC e866 8 FileTimeToLocalFileTime\nPUBLIC 35524 8 LocalFileTimeToFileTime\nPUBLIC 3065d c FileTimeToDosDateTime\nPUBLIC 3214e c DosDateTimeToFileTime\nPUBLIC 10ad9 8 CompareFileTime\nPUBLIC 350bf 4 GetTimeZoneInformation\nPUBLIC 5945e 4 SetTimeZoneInformation\nPUBLIC 2d36f c GetSystemTimeAdjustment\nPUBLIC 59584 8 SetSystemTimeAdjustment\nPUBLIC 2e9c1 c SystemTimeToTzSpecificLocalTime\nPUBLIC 595c1 c TzSpecificLocalTimeToSystemTime\nPUBLIC 5983e 8 CalcClientTimeZoneIdAndBias\nPUBLIC a7d4 4 GetLocalTime\nPUBLIC 59a31 4 SetClientTimeZoneInformation\nPUBLIC 13093 0 IsDebuggerPresent\nPUBLIC 59b1e 8 CheckRemoteDebuggerPresent\nPUBLIC 59b72 0 DebugBreak\nPUBLIC 59b7c 0 CreateDBWinMutex\nPUBLIC 59d78 4 OutputDebugStringA\nPUBLIC 5a0bd 4 ProcessIdToHandle\nPUBLIC 5a123 4 DebugActiveProcess\nPUBLIC 5a176 4 DebugBreakProcess\nPUBLIC 5a19d 4 DebugSetProcessKillOnExit\nPUBLIC 5a1e8 c GetThreadSelectorEntry\nPUBLIC 5a231 c SaveThreadHandle\nPUBLIC 5a28f 8 SaveProcessHandle\nPUBLIC 5a2eb 4 MarkThreadHandle\nPUBLIC 5a31b 4 MarkProcessHandle\nPUBLIC 5a351 8 RemoveHandles\nPUBLIC 5a3c6 4 CloseAllProcessHandles\nPUBLIC 5a42d 4 OutputDebugStringW\nPUBLIC 5a480 8 WaitForDebugEvent\nPUBLIC 5a565 c ContinueDebugEvent\nPUBLIC 5a5a9 4 DebugActiveProcessStop\nPUBLIC 36f5b 4 RemoveDirectoryW\nPUBLIC 323d2 8 CreateDirectoryW\nPUBLIC 5a5f2 c CreateDirectoryExW\nPUBLIC 5b219 4 RemoveDirectoryA\nPUBLIC 217ac 8 CreateDirectoryA\nPUBLIC 5b23b c CreateDirectoryExA\nPUBLIC 2af8f 4 InitAtomTable\nPUBLIC 30cce 0 InternalInitAtomTable\nPUBLIC 360a9 4 GlobalAddAtomA\nPUBLIC 360c3 4 GlobalFindAtomA\nPUBLIC 30bbb 4 GlobalDeleteAtom\nPUBLIC 5b28b c GlobalGetAtomNameA\nPUBLIC 1006c 4 GlobalAddAtomW\nPUBLIC 34e97 4 GlobalFindAtomW\nPUBLIC 2c3be c GlobalGetAtomNameW\nPUBLIC 354ed 4 AddAtomA\nPUBLIC 30cfe 4 FindAtomA\nPUBLIC 32695 4 DeleteAtom\nPUBLIC 5b2ab c GetAtomNameA\nPUBLIC 2f827 4 FindAtomW\nPUBLIC f726 c BaseDllGetApplicationName\nPUBLIC f763 c BaseDllGetVariableName\nPUBLIC 1ee95 10 BaseDllGetVariableValue\nPUBLIC f88c 14 BaseDllAppendBufferToResultBuffer\nPUBLIC f6da 8 BaseDllIniFileNameLength\nPUBLIC f7a0 c BaseDllFindIniFileNameMapping\nPUBLIC 1c858 0 BaseDllFlushRegistryCache\nPUBLIC 1c8a6 8 BaseDllFindVarNameMapping\nPUBLIC 5b2cb 8 BaseDllCheckKeyNotEmpty\nPUBLIC 1e361 4 BaseDllOpenIniFileOnDisk\nPUBLIC 1e6e1 4 BaseDllCloseIniFileOnDisk\nPUBLIC 35889 4 BaseDllCalculateDeleteLength\nPUBLIC 1e891 8 BaseDllAdvanceTextPointer\nPUBLIC 1f18a 14 BaseDllModifyMappedFile\nPUBLIC 5b355 1c BaseDllCheckInitFromIniFile\nPUBLIC 3331f 0 OpenProfileUserMapping\nPUBLIC f460 28 BaseDllCaptureIniFileParameters\nPUBLIC f928 4 BaseDllAppendNullToResultBuffer\nPUBLIC f851 10 BaseDllAppendStringToResultBuffer\nPUBLIC 1c8db 14 BaseDllOpenMappingTarget\nPUBLIC 5b435 4 BaseDllReadApplicationNames\nPUBLIC 1b42d 8 BaseDllReadVariableNames\nPUBLIC 1cac2 10 BaseDllReadVariableValue\nPUBLIC 5b592 8 BaseDllReadApplicationVariables\nPUBLIC 2bb93 10 BaseDllWriteVariableValue\nPUBLIC 32dd3 4 BaseDllReadSectionNames\nPUBLIC 1e793 4 BaseDllFindSection\nPUBLIC 1e9c5 4 BaseDllFindKeyword\nPUBLIC 5b71c 10 QueryWin31IniFilesMappedToRegistry\nPUBLIC 2dc81 8 BaseDllDeleteApplicationVariables\nPUBLIC 2dc43 8 BaseDllWriteApplicationVariables\nPUBLIC 358ed 4 BaseDllReadKeywordNames\nPUBLIC 1ea7d 4 BaseDllReadKeywordValue\nPUBLIC 1ecd2 4 BaseDllReadSection\nPUBLIC 5b828 4 BaseDllWriteSection\nPUBLIC 1f021 8 BaseDllWriteKeywordValue\nPUBLIC 1c7f4 4 BaseDllReadWriteIniFileViaMapping\nPUBLIC 1e291 4 BaseDllReadWriteIniFileOnDisk\nPUBLIC f331 20 BaseDllReadWriteIniFile\nPUBLIC 32b56 18 GetPrivateProfileStringA\nPUBLIC 35d54 10 WritePrivateProfileStringA\nPUBLIC 35f21 10 GetPrivateProfileSectionA\nPUBLIC 5ba7c c WritePrivateProfileSectionA\nPUBLIC f95d 18 GetPrivateProfileStringW\nPUBLIC 1ee4c 10 WritePrivateProfileStringW\nPUBLIC 1edbd 10 GetPrivateProfileSectionW\nPUBLIC 5bac3 c WritePrivateProfileSectionW\nPUBLIC 32da7 c GetPrivateProfileSectionNamesA\nPUBLIC 5bb0a c GetPrivateProfileSectionNamesW\nPUBLIC 5bb2b 14 GetPrivateProfileStructA\nPUBLIC 5bc95 14 GetPrivateProfileStructW\nPUBLIC 5be23 14 WritePrivateProfileStructA\nPUBLIC 5bf65 14 WritePrivateProfileStructW\nPUBLIC 21495 14 GetProfileStringA\nPUBLIC 5c0b9 c WriteProfileStringA\nPUBLIC 5c0d7 c GetProfileSectionA\nPUBLIC 5c0f5 8 WriteProfileSectionA\nPUBLIC 213f8 14 GetProfileStringW\nPUBLIC 332b1 c WriteProfileStringW\nPUBLIC 5c110 c GetProfileSectionW\nPUBLIC 5c12e 8 WriteProfileSectionW\nPUBLIC 36434 10 GetPrivateProfileIntA\nPUBLIC 32730 10 GetPrivateProfileIntW\nPUBLIC 364a9 c GetProfileIntA\nPUBLIC 2f89a c GetProfileIntW\nPUBLIC 21f1e c DefineDosDeviceW\nPUBLIC 5c149 8 IsGlobalDeviceMap\nPUBLIC 5c269 10 FindSymbolicLinkEntry\nPUBLIC 21d8d c QueryDosDeviceW\nPUBLIC 5c2c5 c DefineDosDeviceA\nPUBLIC 5c36c c QueryDosDeviceA\nPUBLIC 31385 10 CreateIoCompletionPort\nPUBLIC 126f2 10 PostQueuedCompletionStatus\nPUBLIC a71d 14 GetQueuedCompletionStatus\nPUBLIC 315c4 10 GetOverlappedResult\nPUBLIC ac4d 0 GetErrorMode\nPUBLIC ac0f 4 SetErrorMode\nPUBLIC ef3a 8 FindNextFileW\nPUBLIC edd7 4 FindClose\nPUBLIC 5c46c 8 BaseFindFirstDevice\nPUBLIC 34bef c FindFirstChangeNotificationW\nPUBLIC 32113 4 FindNextChangeNotification\nPUBLIC 3162f 20 ReadDirectoryChangesW\nPUBLIC ee81 4 BasepInitializeFindFileHandle\nPUBLIC 34eb1 8 FindNextFileA\nPUBLIC ea7d 18 FindFirstFileExW\nPUBLIC 5c4ab c FindFirstChangeNotificationA\nPUBLIC 137d9 8 FindFirstFileA\nPUBLIC eee1 8 FindFirstFileW\nPUBLIC 5c512 18 FindFirstFileExA\nPUBLIC 180e 14 ReadFile\nPUBLIC 10d87 14 WriteFile\nPUBLIC 32044 4 SetEndOfFile\nPUBLIC 10b8e 10 SetFilePointer\nPUBLIC 21057 14 SetFilePointerEx\nPUBLIC 10c6d 8 GetFileInformationByHandle\nPUBLIC 31c45 10 GetFileTime\nPUBLIC 31cb8 10 SetFileTime\nPUBLIC 12641 4 FlushFileBuffers\nPUBLIC 32361 14 LockFile\nPUBLIC 2f569 18 LockFileEx\nPUBLIC 322fb 14 UnlockFileEx\nPUBLIC 10a09 8 GetFileSizeEx\nPUBLIC 5c64e c BasepIoCompletion\nPUBLIC 2bd84 c BasepIoCompletionSimple\nPUBLIC 2bcfb 14 ReadFileEx\nPUBLIC 5c701 14 WriteFileEx\nPUBLIC 300da 4 CancelIo\nPUBLIC 2de51 14 ReadFileScatter\nPUBLIC 2dda5 14 WriteFileGather\nPUBLIC 5c7a1 c SetFileValidData\nPUBLIC 5c7f7 8 SetFileShortNameW\nPUBLIC 5c8c4 8 SetFileShortNameA\nPUBLIC 10e51 4 GetFileType\nPUBLIC 322bc 14 UnlockFile\nPUBLIC 10a77 8 GetFileSize\nPUBLIC bada c OpenFileMappingW\nPUBLIC b896 18 MapViewOfFileEx\nPUBLIC 35971 8 FlushViewOfFile\nPUBLIC b974 4 UnmapViewOfFile\nPUBLIC 938e 18 CreateFileMappingW\nPUBLIC bb76 c OpenFileMappingA\nPUBLIC b905 14 MapViewOfFile\nPUBLIC 945c 18 CreateFileMappingA\nPUBLIC 110f5 c GetFileAttributesExW\nPUBLIC 31f31 4 DeleteFileW\nPUBLIC 5c8e9 34 BasepMoveFileCopyProgress\nPUBLIC 5c94f 10 BasepNotifyTrackingService\nPUBLIC 5cbc1 10 BasepMoveFileDelayed\nPUBLIC 5cf6b 20 BasepOpenFileForMove\nPUBLIC 5d0e9 c PrivMoveFileIdentityW\nPUBLIC 5d371 8 GetCompressedFileSizeW\nPUBLIC 314d5 8 SetFileAttributesW\nPUBLIC b74c 4 GetFileAttributesW\nPUBLIC 137b1 c GetFileAttributesExA\nPUBLIC 31eab 4 DeleteFileA\nPUBLIC 1f72e 14 MoveFileWithProgressW\nPUBLIC 5d499 8 GetCompressedFileSizeA\nPUBLIC 12782 8 SetFileAttributesA\nPUBLIC 1153c 4 GetFileAttributesA\nPUBLIC 35eae 14 MoveFileWithProgressA\nPUBLIC 21261 8 MoveFileW\nPUBLIC 3565b c MoveFileExW\nPUBLIC 35e8f 8 MoveFileA\nPUBLIC 5d4c3 c MoveFileExA\nPUBLIC 21950 4 BasepOfShareToWin32Share\nPUBLIC 5d4e3 14 LoadDuplicateEncryptionInfoFile\nPUBLIC 10978 8 BaseIsThisAConsoleName\nPUBLIC 5d539 20 CopyNameGraftNow\nPUBLIC 284bd 14 BasepProcessNameGrafting\nPUBLIC 5d9a1 8 BasepChecksum\nPUBLIC 2879d 8 BasepRemoteFile\nPUBLIC 5d9e0 8 BasepCreateDispositionToWin32\nPUBLIC 5da30 0 CheckAllowDecryptedRemoteDestinationPolicy\nPUBLIC 10760 1c CreateFileW\nPUBLIC 3719a 20 BasepCopyFileCallback\nPUBLIC 5dadd 8 BaseMarkFileForDelete\nPUBLIC 5db55 8 CopyReparsePoint\nPUBLIC 5dc16 24 BasepOpenRestartableFile\nPUBLIC 5de71 1c BasepCopyCompression\nPUBLIC 285c6 38 BasepCopyEncryption\nPUBLIC 1a24 1c CreateFileA\nPUBLIC 21982 c OpenFile\nPUBLIC 5e021 28 BasepCopySecurityInformation\nPUBLIC 27bdb 38 BaseCopyStream\nPUBLIC 36c3c 18 ReplaceFileW\nPUBLIC 27613 24 BasepCopyFileExW\nPUBLIC 27b32 18 CopyFileExW\nPUBLIC 2005f 18 PrivCopyFileExW\nPUBLIC 5e307 18 ReplaceFileA\nPUBLIC 286ee c CopyFileA\nPUBLIC 2f873 c CopyFileW\nPUBLIC 5e3c4 18 CopyFileExA\nPUBLIC 5e41d 10 GetFirmwareEnvironmentVariableW\nPUBLIC 5e4ac 10 SetFirmwareEnvironmentVariableW\nPUBLIC 5e534 10 GetFirmwareEnvironmentVariableA\nPUBLIC 5e5c7 10 SetFirmwareEnvironmentVariableA\nPUBLIC 5e65a 4 RegisterWowBaseHandlers\nPUBLIC fd2d 8 GlobalAlloc\nPUBLIC 123b9 c GlobalReAlloc\nPUBLIC ff19 4 GlobalLock\nPUBLIC 34cb9 4 GlobalHandle\nPUBLIC fe82 4 GlobalUnlock\nPUBLIC 34da1 4 GlobalSize\nPUBLIC 36772 4 GlobalFlags\nPUBLIC fc2f 4 GlobalFree\nPUBLIC 5e670 4 LocalCompact\nPUBLIC 5e686 4 GlobalFix\nPUBLIC 5e6a0 4 GlobalUnfix\nPUBLIC 5e6ba 4 GlobalWire\nPUBLIC 5e6ca 4 GlobalUnWire\nPUBLIC 310f2 4 GlobalMemoryStatus\nPUBLIC 9a72 14 VirtualAllocEx\nPUBLIC 9b02 10 VirtualFreeEx\nPUBLIC 1a5d 14 VirtualProtectEx\nPUBLIC b9a0 10 VirtualQueryEx\nPUBLIC 2b13f 8 VirtualLock\nPUBLIC 5e6da 8 VirtualUnlock\nPUBLIC 355bc c FlushInstructionCache\nPUBLIC 5e712 c AllocateUserPhysicalPages\nPUBLIC 5e740 c FreeUserPhysicalPages\nPUBLIC 5e76e c MapUserPhysicalPages\nPUBLIC 5e79c c MapUserPhysicalPagesScatter\nPUBLIC 1f992 4 GlobalMemoryStatusEx\nPUBLIC 5e7ca 18 GetWriteWatch\nPUBLIC 5e803 8 ResetWriteWatch\nPUBLIC 9a51 10 VirtualAlloc\nPUBLIC 9ae4 c VirtualFree\nPUBLIC 1ad0 10 VirtualProtect\nPUBLIC b9d1 c VirtualQuery\nPUBLIC 2e18c c SetHandleInformation\nPUBLIC 2bdb5 8 GetHandleInformation\nPUBLIC 1d07e 0 SetFileApisToOEM\nPUBLIC 365f6 0 SetFileApisToANSI\nPUBLIC 3594f 0 AreFileApisANSI\nPUBLIC 17443 0 BaseProcessInitPostImport\nPUBLIC 934b 0 BaseGetNamedObjectDirectory\nPUBLIC b5c3 c _BaseDllInitialize\nPUBLIC 5e830 8 _lopen\nPUBLIC 365a5 8 _lcreat\nPUBLIC 353ce c _lread\nPUBLIC 38ae7 c _lwrite\nPUBLIC 34e64 4 _lclose\nPUBLIC 35406 c _llseek\nPUBLIC 30d74 8 lstrcmpA\nPUBLIC baa1 8 lstrcmpiA\nPUBLIC be01 8 lstrcpyA\nPUBLIC 10111 c lstrcpynA\nPUBLIC 34d41 8 lstrcatA\nPUBLIC bdb6 4 lstrlenA\nPUBLIC b9ef c lstrcpynW\nPUBLIC 10f32 8 lstrcatW\nPUBLIC 9a09 4 lstrlenW\nPUBLIC 325bc 4 LocalSize\nPUBLIC 5e882 8 LocalShrink\nPUBLIC 12bb6 c HeapCreate\nPUBLIC 10ef8 4 HeapDestroy\nPUBLIC 5e898 10 HeapExtend\nPUBLIC 5e8c9 10 HeapCreateTagsW\nPUBLIC 5e8da 14 HeapQueryTagW\nPUBLIC 5e8eb c HeapSummary\nPUBLIC 5e947 14 HeapUsage\nPUBLIC 5e9bb c HeapValidate\nPUBLIC abc1 0 GetProcessHeap\nPUBLIC 5e9db 8 GetProcessHeaps\nPUBLIC 3611e 8 HeapCompact\nPUBLIC 5e9ec 4 HeapLock\nPUBLIC 5ea06 4 HeapUnlock\nPUBLIC 5ea20 8 HeapWalk\nPUBLIC 39469 10 HeapSetInformation\nPUBLIC 5eb25 14 HeapQueryInformation\nPUBLIC 5eb58 14 GetMailslotInfo\nPUBLIC 2cdd8 8 SetMailslotInfo\nPUBLIC 2ccdc 10 CreateMailslotW\nPUBLIC 2cc8b 10 CreateMailslotA\nPUBLIC 34932 c CreateVirtualBuffer\nPUBLIC 5ebf4 8 ExtendVirtualBuffer\nPUBLIC 5ec4e 4 TrimVirtualBuffer\nPUBLIC 34b69 4 FreeVirtualBuffer\nPUBLIC 5ec71 c VirtualBufferExceptionHandler\nPUBLIC 349d8 20 BaseDllFormatMessage\nPUBLIC 2f7a0 1c FormatMessageA\nPUBLIC 34b8f 1c FormatMessageW\nPUBLIC abde 4 FreeLibrary\nPUBLIC c170 8 FreeLibraryAndExitThread\nPUBLIC 11296 4 DisableThreadLibraryCalls\nPUBLIC 5ecb0 4 SetDllDirectoryW\nPUBLIC 5ed46 4 SetDllDirectoryA\nPUBLIC 5edd7 8 GetDllDirectoryW\nPUBLIC e477 4 GetModuleHandleForUnicodeString\nPUBLIC 1fcff c BasepGetModuleHandleExParameterValidation\nPUBLIC e4b9 10 BasepGetModuleHandleExW\nPUBLIC 111da 0 GetVersion\nPUBLIC ae65 4 GetVersionExW\nPUBLIC 1fb26 10 VerifyVersionInfoW\nPUBLIC 5ee46 10 VerifyVersionInfoA\nPUBLIC 9f81 4 BaseDllFreeResourceId\nPUBLIC 5eee3 c ReturnMem16Data\nPUBLIC 5eef0 1c UTRegister\nPUBLIC 14c3c c BasepLoadLibraryAsDataFile\nPUBLIC 1af1 c LoadLibraryExW\nPUBLIC 5ef47 8 GetDllDirectoryA\nPUBLIC b3d5 c GetModuleFileNameW\nPUBLIC b4cf c GetModuleFileNameA\nPUBLIC e43d 4 GetModuleHandleW\nPUBLIC 5efe6 c GetModuleHandleExA\nPUBLIC 1fcc1 c GetModuleHandleExW\nPUBLIC ada0 8 GetProcAddress\nPUBLIC 12ade 4 GetVersionExA\nPUBLIC be89 c FindResourceA\nPUBLIC 35f78 10 FindResourceExA\nPUBLIC 9fb5 8 LoadResource\nPUBLIC bc69 8 SizeofResource\nPUBLIC 5f03c c EnumResourceTypesA\nPUBLIC 5f229 10 EnumResourceNamesA\nPUBLIC 2e000 14 EnumResourceLanguagesA\nPUBLIC ac88 10 FindResourceExW\nPUBLIC 5f449 c EnumResourceTypesW\nPUBLIC 5f631 14 EnumResourceLanguagesW\nPUBLIC ae4b 4 LoadLibraryW\nPUBLIC 1d4f c LoadLibraryExA\nPUBLIC b6a1 4 GetModuleHandleA\nPUBLIC 1d77 4 LoadLibraryA\nPUBLIC 3145b 8 ConnectNamedPipe\nPUBLIC 1269f 4 DisconnectNamedPipe\nPUBLIC 5f781 c NpGetUserNamep\nPUBLIC 313ec 10 SetNamedPipeHandleState\nPUBLIC 5f88a 14 GetNamedPipeInfo\nPUBLIC 5f90f 18 PeekNamedPipe\nPUBLIC 312e5 1c TransactNamedPipe\nPUBLIC 2c664 8 WaitNamedPipeW\nPUBLIC 2f0d4 20 CreateNamedPipeW\nPUBLIC 5fa85 1c GetNamedPipeHandleStateW\nPUBLIC 5fb7f 1c CallNamedPipeW\nPUBLIC 5fc39 8 WaitNamedPipeA\nPUBLIC 5fc74 20 CreateNamedPipeA\nPUBLIC 5fceb 1c GetNamedPipeHandleStateA\nPUBLIC 5fdce 1c CallNamedPipeA\nPUBLIC 5fe41 4 GetNumaHighestNodeNumber\nPUBLIC 5fe8c 8 GetNumaProcessorNode\nPUBLIC 5ff19 8 GetNumaNodeProcessorMask\nPUBLIC 5ff7e c GetNumaProcessorMap\nPUBLIC 5ffc4 c GetNumaAvailableMemory\nPUBLIC 6000a 8 GetNumaAvailableMemoryNode\nPUBLIC 600d2 10 NumaVirtualQueryNode\nPUBLIC f182 8 IsThisARootDirectory\nPUBLIC 31db9 8 GetSystemDirectoryW\nPUBLIC ad29 8 GetSystemWindowsDirectoryW\nPUBLIC ad7b 8 GetWindowsDirectoryW\nPUBLIC b2d0 4 GetDriveTypeW\nPUBLIC 112d5 c BasepGetTempPathW\nPUBLIC 359b7 10 GetTempFileNameW\nPUBLIC 301af 14 GetDiskFreeSpaceW\nPUBLIC 12803 10 GetDiskFreeSpaceExW\nPUBLIC f9e5 20 GetVolumeInformationW\nPUBLIC 2c2d3 8 GetLogicalDriveStringsA\nPUBLIC 603cf 8 GetLogicalDriveStringsW\nPUBLIC 60499 8 SetVolumeLabelW\nPUBLIC 60811 14 CheckNameLegalDOS8Dot3W\nPUBLIC 14eea 8 GetSystemDirectoryA\nPUBLIC 212f1 8 GetSystemWindowsDirectoryA\nPUBLIC 21363 8 GetWindowsDirectoryA\nPUBLIC 214e3 4 GetDriveTypeA\nPUBLIC 217ea 18 SearchPathA\nPUBLIC 30789 8 GetTempPathW\nPUBLIC 608ff 10 GetTempFileNameA\nPUBLIC 302ed 14 GetDiskFreeSpaceA\nPUBLIC 3039b 10 GetDiskFreeSpaceExA\nPUBLIC 21ba5 20 GetVolumeInformationA\nPUBLIC 609ed 8 SetVolumeLabelA\nPUBLIC 60a51 14 CheckNameLegalDOS8Dot3A\nPUBLIC 35dca 8 GetTempPathA\nPUBLIC a427 4 QueryPerformanceCounter\nPUBLIC 2fa46 4 QueryPerformanceFrequency\nPUBLIC 1e0c7 10 CreatePipe\nPUBLIC 35340 4 GetSystemPowerStatus\nPUBLIC 60aab 8 SetSystemPowerState\nPUBLIC 392b5 4 SetThreadExecutionState\nPUBLIC 60af4 4 RequestWakeupLatency\nPUBLIC 60b1c 8 GetDevicePowerState\nPUBLIC 60b60 0 IsSystemResumeAutomatic\nPUBLIC 60b6f 4 RequestDeviceWakeup\nPUBLIC 60b97 4 CancelDeviceWakeupRequest\nPUBLIC 60bbf 8 SetMessageWaitingIndicator\nPUBLIC 2f3a4 4 BasepIsSetupInvokedByWinLogon\nPUBLIC 1a1cf 8 BasepIsImageVersionOk\nPUBLIC 1500c 0 IsShimInfrastructureDisabled\nPUBLIC 1930f 1c BasepCheckBadapp\nPUBLIC 16f8e 4 RegisterWaitForInputIdle\nPUBLIC 2dfa0 c StuffStdHandle\nPUBLIC 60bd3 c BasepReplaceProcessThreadTokens\nPUBLIC 309e1 c OpenProcess\nPUBLIC 1cd34 4 _ExitProcess\nPUBLIC 1cdda 4 ExitProcess\nPUBLIC 1e16 8 TerminateProcess\nPUBLIC 1ae17 8 GetExitCodeProcess\nPUBLIC 1e50 4 GetStartupInfoW\nPUBLIC 1eee 4 GetStartupInfoA\nPUBLIC 12f1d 0 GetCommandLineA\nPUBLIC 16f83 0 GetCommandLineW\nPUBLIC 1df77 4 FreeEnvironmentStringsA\nPUBLIC 12f08 0 GetEnvironmentStringsW\nPUBLIC 1cf5b 0 GetEnvironmentStrings\nPUBLIC 14af2 c GetEnvironmentVariableA\nPUBLIC 33478 8 SetEnvironmentVariableA\nPUBLIC f0f4 c GetEnvironmentVariableW\nPUBLIC 101be 8 SetEnvironmentVariableW\nPUBLIC 329d9 c ExpandEnvironmentStringsA\nPUBLIC 305f6 c ExpandEnvironmentStringsW\nPUBLIC 9920 0 GetCurrentProcessId\nPUBLIC 60c75 4 GetProcessId\nPUBLIC 21cc 14 ReadProcessMemory\nPUBLIC 220f 14 WriteProcessMemory\nPUBLIC 60caa 8 FatalAppExitW\nPUBLIC 60cf8 8 FatalAppExitA\nPUBLIC 60d46 4 FatalExit\nPUBLIC ae2a 4 IsProcessorFeaturePresent\nPUBLIC 60d58 10 BuildSubSysCommandLine\nPUBLIC 60e13 4 GetPriorityClass\nPUBLIC 9e01 8 IsBadReadPtr\nPUBLIC 3593f 8 IsBadHugeReadPtr\nPUBLIC 9e79 8 IsBadWritePtr\nPUBLIC bf9d 8 IsBadHugeWritePtr\nPUBLIC bccf 4 IsBadCodePtr\nPUBLIC 32259 8 IsBadStringPtrA\nPUBLIC a5dc 8 IsBadStringPtrW\nPUBLIC 2c8ed 8 SetProcessShutdownParameters\nPUBLIC 60e79 8 GetProcessShutdownParameters\nPUBLIC 60ee8 4 BasepIsRealtimeAllowed\nPUBLIC 60f22 c GetSystemTimes\nPUBLIC 352d9 14 GetProcessTimes\nPUBLIC 21765 c GetProcessAffinityMask\nPUBLIC 61068 c GetProcessWorkingSetSize\nPUBLIC 303d0 c SetProcessWorkingSetSize\nPUBLIC 12c23 4 GetProcessVersion\nPUBLIC 610b0 8 SetProcessAffinityMask\nPUBLIC 610e0 8 SetProcessPriorityBoost\nPUBLIC 6111b 8 GetProcessPriorityBoost\nPUBLIC 61155 8 GetProcessIoCounters\nPUBLIC 61186 8 GetProcessHandleCount\nPUBLIC 611c0 8 GetSystemRegistryQuota\nPUBLIC 6120a c BasepSaveAppCertRegistryValue\nPUBLIC 15199 8 IsWow64Process\nPUBLIC 194dd 4 BasepIsProcessAllowed\nPUBLIC 19805 18 BasepCheckWinSaferRestrictions\nPUBLIC 19513 30 CreateProcessInternalW\nPUBLIC 2332 28 CreateProcessW\nPUBLIC 12cb0 c GetSystemInfoInternal\nPUBLIC 12d56 4 GetSystemInfo\nPUBLIC 37945 4 GetNativeSystemInfo\nPUBLIC 2c338 8 SetPriorityClass\nPUBLIC 61351 18 BasepConfigureAppCertDlls\nPUBLIC 1ddd6 30 CreateProcessInternalA\nPUBLIC 2367 28 CreateProcessA\nPUBLIC 6136d 8 WinExec\nPUBLIC 6147e 8 LoadModule\nPUBLIC 3965a 4 CreateMemoryResourceNotification\nPUBLIC 395d8 8 QueryMemoryResourceNotification\nPUBLIC 2c1e7 c DosPathToSessionPathW\nPUBLIC 12f89 8 ProcessIdToSessionId\nPUBLIC 132ee 0 WTSGetActiveConsoleSessionId\nPUBLIC 61799 c DosPathToSessionPathA\nPUBLIC 92ea c BaseFormatObjectAttributes\nPUBLIC 2470 8 BaseFormatTimeOut\nPUBLIC 16fb4 4 BaseProcessStart\nPUBLIC 61901 c BaseFreeThreadStack\nPUBLIC e0df 4 BasepEndOfDirName\nPUBLIC 176db c BasepLocateExeLdrEntry\nPUBLIC 61933 4 BasepUnicodeStringToOemSize\nPUBLIC 6195c 4 BasepUnicodeStringToAnsiSize\nPUBLIC 30445 8 BasepAcquirePrivilegeEx\nPUBLIC 3053e 4 BasepReleasePrivilege\nPUBLIC e275 c BasepComputeProcessPath\nPUBLIC df9e 8 BaseComputeProcessDllPath\nPUBLIC 31d8e 0 BaseComputeProcessSearchPath\nPUBLIC e074 4 Basep8BitStringToStaticUnicodeString\nPUBLIC 114f8 8 Basep8BitStringToDynamicUnicodeString\nPUBLIC 1a2ce 34 BasePushProcessParameters\nPUBLIC 9ef1 4 InitializeCriticalSection\nPUBLIC b829 8 InitializeCriticalSectionAndSpinCount\nPUBLIC 13140 c OpenEventW\nPUBLIC 2c05e 4 PulseEvent\nPUBLIC 10086 10 CreateSemaphoreW\nPUBLIC 2e30f c OpenSemaphoreW\nPUBLIC bfad c ReleaseSemaphore\nPUBLIC e8b7 c CreateMutexW\nPUBLIC e995 c OpenMutexW\nPUBLIC 24a7 4 ReleaseMutex\nPUBLIC 2540 c WaitForSingleObjectEx\nPUBLIC 36696 10 SignalObjectAndWait\nPUBLIC 952a 14 WaitForMultipleObjectsEx\nPUBLIC 239c 8 SleepEx\nPUBLIC 2fb52 c CreateWaitableTimerW\nPUBLIC 61985 c OpenWaitableTimerW\nPUBLIC 95f9 18 SetWaitableTimer\nPUBLIC 2cc09 4 CancelWaitableTimer\nPUBLIC a6a9 10 CreateEventW\nPUBLIC 1320c c OpenEventA\nPUBLIC 12e1d 10 CreateSemaphoreA\nPUBLIC 2ca47 c OpenSemaphoreA\nPUBLIC e93f c CreateMutexA\nPUBLIC ea1b c OpenMutexA\nPUBLIC a05d 10 WaitForMultipleObjects\nPUBLIC 2442 4 Sleep\nPUBLIC 61a81 c CreateWaitableTimerA\nPUBLIC 61af0 c OpenWaitableTimerA\nPUBLIC 308ad 10 CreateEventA\nPUBLIC 33609 0 StringCopyExWorkerW(unsigned short *,unsigned int,unsigned int,unsigned short const *,unsigned short * *,unsigned int *,unsigned long)\nPUBLIC 61b64 0 StringLengthWorkerW(unsigned short const *,unsigned int,unsigned int *)\nPUBLIC 1746c 0 IsTerminalServerCompatible\nPUBLIC 17499 0 IsTSAppCompatEnabled\nPUBLIC f1fa 0 IsSystemLUID\nPUBLIC 17459 0 InitializeTermsrvFpns\nPUBLIC 1efce 0 TermsrvAppInstallMode\nPUBLIC 61ba2 4 SetTermsrvAppInstallMode\nPUBLIC 61d3f c TermsrvGetSyncTime\nPUBLIC 61ffd c TermsrvPutSyncTime\nPUBLIC 6240a 8 TermsrvCheckIniSync\nPUBLIC 62473 4 TermsrvDoesFileExist\nPUBLIC 624ba c TermsrvIniSyncLoop\nPUBLIC 17f41 8 GetPerUserWindowsDirectory\nPUBLIC 6277d 18 StringCbCopyExW\nPUBLIC 627db 1c StringCatExWorkerW\nPUBLIC 6297f 18 StringCbCatExW\nPUBLIC 1ebb1 4 TermsrvSyncUserIniFile\nPUBLIC 629dd 10 StringVPrintfWorkerW\nPUBLIC 12980 c BaseCreateThreadPoolThread\nPUBLIC 2fc00 c OpenThread\nPUBLIC c108 8 SetThreadPriority\nPUBLIC a793 4 GetThreadPriority\nPUBLIC 62a30 8 SetThreadPriorityBoost\nPUBLIC 62a6b 8 GetThreadPriorityBoost\nPUBLIC c058 4 ExitThread\nPUBLIC 1ce03 8 TerminateThread\nPUBLIC 21435 8 GetExitCodeThread\nPUBLIC 9728 0 GetCurrentThreadId\nPUBLIC 3970d 8 GetThreadContext\nPUBLIC 62aa5 8 SetThreadContext\nPUBLIC 39732 4 SuspendThread\nPUBLIC 328f7 4 ResumeThread\nPUBLIC 12a09 10 RaiseException\nPUBLIC 62ad0 8 FillUEFInfo\nPUBLIC 4479d 4 SetUnhandledExceptionFilter\nPUBLIC 62b4f 4 BasepCheckForReadOnlyResource\nPUBLIC 12d9f 0 TlsAlloc\nPUBLIC 9740 4 TlsGetValue\nPUBLIC 9bc5 8 TlsSetValue\nPUBLIC 136d7 4 TlsFree\nPUBLIC 62c9c 14 GetThreadTimes\nPUBLIC 62d09 8 GetThreadIOPendingFlag\nPUBLIC 2fa7a 8 SetThreadAffinityMask\nPUBLIC 2c0e6 c BaseDispatchAPC\nPUBLIC 2c082 c QueueUserAPC\nPUBLIC 62d48 8 SetThreadIdealProcessor\nPUBLIC 2ffcf 14 CreateFiberEx\nPUBLIC 2fe84 4 DeleteFiber\nPUBLIC 2ff16 4 ConvertThreadToFiber\nPUBLIC 2fed7 0 ConvertFiberToThread\nPUBLIC 32992 0 SwitchToThread\nPUBLIC 211cd 18 RegisterWaitForSingleObject\nPUBLIC 2b086 14 RegisterWaitForSingleObjectEx\nPUBLIC 2bff8 4 UnregisterWait\nPUBLIC 30062 8 UnregisterWaitEx\nPUBLIC 30a62 c QueueUserWorkItem\nPUBLIC 2c02c c BindIoCompletionCallback\nPUBLIC 2cba2 0 BasepCreateDefaultTimerQueue\nPUBLIC 2bfd6 0 CreateTimerQueue\nPUBLIC 2117d 1c CreateTimerQueueTimer\nPUBLIC 12723 10 ChangeTimerQueueTimer\nPUBLIC 21130 c DeleteTimerQueueTimer\nPUBLIC 62d7c 8 DeleteTimerQueueEx\nPUBLIC 2b26e 18 SetTimerQueueTimer\nPUBLIC 62dc3 4 DeleteTimerQueue\nPUBLIC 62df0 8 CancelTimerQueueTimer\nPUBLIC 62e34 0 StringCchPrintfW\nPUBLIC 10637 18 CreateThread\nPUBLIC c1e0 4 BaseExitThreadPoolThread\nPUBLIC 62e62 4 UnhandledExceptionFilter\nPUBLIC 2ffaf c CreateFiber\nPUBLIC 63999 8 Heap32ListFirst\nPUBLIC 63a47 8 Heap32ListNext\nPUBLIC 63ade c Heap32First\nPUBLIC 63bf8 4 Heap32Next\nPUBLIC 63d24 14 Toolhelp32ReadProcessMemory\nPUBLIC 63d64 8 Process32FirstW\nPUBLIC 63e1d 8 Process32First\nPUBLIC 63eef 8 Process32NextW\nPUBLIC 63f90 8 Process32Next\nPUBLIC 64062 8 Thread32First\nPUBLIC 64116 8 Thread32Next\nPUBLIC 641af 8 Module32FirstW\nPUBLIC 64268 8 Module32First\nPUBLIC 6434c 8 Module32NextW\nPUBLIC 643ed 8 Module32Next\nPUBLIC 644c8 14 ThpCreateRawSnap\nPUBLIC 64679 18 ThpAllocateSnapshotSection\nPUBLIC 6481c c ThpCopyAnsiToUnicode\nPUBLIC 64858 18 ThpProcessToSnap\nPUBLIC 64b47 8 CreateToolhelp32Snapshot\nPUBLIC 64bcf 8 GetExpandedNameA\nPUBLIC 64c7c 8 GetExpandedNameW\nPUBLIC 64d93 4 ConvertWin32FHToDos\nPUBLIC 64e03 4 ConvertDosFHToWin32\nPUBLIC 64e2a 4 LZInit\nPUBLIC 64f85 14 LZCreateFileW\nPUBLIC 65053 c LZOpenFileA\nPUBLIC 65114 c LZOpenFileW\nPUBLIC 651ab c LZSeek\nPUBLIC 65236 c LZRead\nPUBLIC 65444 4 LZCloseFile\nPUBLIC 654bb 4 LZClose\nPUBLIC 6557c c ClearCommError\nPUBLIC 656c7 c SetupComm\nPUBLIC 6578e 8 EscapeCommFunction\nPUBLIC 6588a 8 GetCommMask\nPUBLIC 65913 8 GetCommModemStatus\nPUBLIC 6599c 8 GetCommProperties\nPUBLIC 65a54 8 GetCommState\nPUBLIC 22128 8 GetCommTimeouts\nPUBLIC 65d02 8 PurgeComm\nPUBLIC 65d8c 4 SetCommBreak\nPUBLIC 65da4 8 SetCommMask\nPUBLIC 65e43 8 SetCommState\nPUBLIC 6614b 8 SetCommTimeouts\nPUBLIC 661f6 8 TransmitCommChar\nPUBLIC 66280 c WaitCommEvent\nPUBLIC 663c8 8 GetFriendlyUi\nPUBLIC 6677d c CommConfigDialogW\nPUBLIC 66871 c CommConfigDialogA\nPUBLIC 66949 c GetDefaultCommConfigW\nPUBLIC 66a41 c GetDefaultCommConfigA\nPUBLIC 66b19 c SetDefaultCommConfigW\nPUBLIC 66c11 c SetDefaultCommConfigA\nPUBLIC 66cf1 4 ClearCommBreak\nPUBLIC 66d09 c GetCommConfig\nPUBLIC 66eab c SetCommConfig\nPUBLIC 66f43 4 GetNextVDMCommand\nPUBLIC 67695 8 ExitVDM\nPUBLIC 67714 8 SetVDMCurrentDirectories\nPUBLIC 67849 8 GetVDMCurrentDirectories\nPUBLIC 2f609 4 CmdBatNotification\nPUBLIC 679a9 4 RegisterWowExec\nPUBLIC 67a01 c GetVDMConfigValue\nPUBLIC 67a4a 10 BaseUpdateVDMEntry\nPUBLIC 28b87 8 BaseIsDosApplication\nPUBLIC 1ae5e 8 BaseCheckForVDM\nPUBLIC 67b2e 8 BaseDestroyVDMEnvironment\nPUBLIC 67b70 8 BaseGetEnvNameType_U\nPUBLIC 1143f 4 SkipPathTypeIndicator_U\nPUBLIC 1f5a6 8 IsShortName_U\nPUBLIC 132f9 8 IsLongName_U\nPUBLIC 67bcc 8 GetBinaryTypeW\nPUBLIC 67e19 4 VDMOperationStarted\nPUBLIC 67e35 14 BaseGetVDMKeyword\nPUBLIC 1146a 10 FindLFNorSFN_U\nPUBLIC 6802b 8 GetBinaryTypeA\nPUBLIC 1f26e c GetShortPathNameW\nPUBLIC 680be c BaseCreateVDMEnvironment\nPUBLIC 13353 c GetLongPathNameW\nPUBLIC 28c38 24 BaseCheckVDMp\nPUBLIC 68509 24 BaseCheckVDM\nPUBLIC 35bb0 c GetShortPathNameA\nPUBLIC 68586 c GetLongPathNameA\nPUBLIC 687a1 14 BaseGetVdmConfigInfo\nPUBLIC 2cf9b c FindNextVolumeW\nPUBLIC 2cf60 4 FindVolumeClose\nPUBLIC 68abf 10 FindNextVolumeMountPointHelper\nPUBLIC 68db1 c FindFirstVolumeMountPointW\nPUBLIC 68f11 8 IsThisAVolumeName\nPUBLIC 6905d c FindNextVolumeMountPointW\nPUBLIC 357d5 4 FindCloseChangeNotification\nPUBLIC 2080d c GetVolumeNameForRoot\nPUBLIC 31b99 10 BasepGetVolumeNameFromReparsePoint\nPUBLIC 20799 10 BasepGetVolumeNameForVolumeMountPoint\nPUBLIC 1fb88 c GetVolumeNameForVolumeMountPointW\nPUBLIC 6907b 8 SetVolumeNameForRoot\nPUBLIC 69218 c NotifyMountMgr\nPUBLIC 69395 8 SetVolumeMountPointW\nPUBLIC 69778 4 DeleteVolumeNameForRoot\nPUBLIC 69930 4 DeleteVolumeMountPointW\nPUBLIC 2e61c c GetVolumePathNameW\nPUBLIC 20d14 10 GetVolumePathNamesForVolumeNameW\nPUBLIC 2d2af 8 FindFirstVolumeW\nPUBLIC 69bff c FindNextVolumeA\nPUBLIC 69d19 c FindFirstVolumeMountPointA\nPUBLIC 69e49 c FindNextVolumeMountPointA\nPUBLIC 69f61 c GetVolumeNameForVolumeMountPointA\nPUBLIC 6a091 8 SetVolumeMountPointA\nPUBLIC 6a0de 4 DeleteVolumeMountPointA\nPUBLIC 2e8b2 c GetVolumePathNameA\nPUBLIC 6a100 10 GetVolumePathNamesForVolumeNameA\nPUBLIC 6a259 8 FindFirstVolumeA\nPUBLIC 6aebf c BuildCommDCBAndTimeoutsA\nPUBLIC 6aeed 8 BuildCommDCBA\nPUBLIC 6af1f c BuildCommDCBAndTimeoutsW\nPUBLIC 6af79 8 BuildCommDCBW\nPUBLIC 6afd0 18 BasepDoTapeOperation\nPUBLIC 6b046 18 SetTapePosition\nPUBLIC 6b08c 14 GetTapePosition\nPUBLIC 6b0e8 c PrepareTape\nPUBLIC 6b11b c EraseTape\nPUBLIC 6b14e 10 CreateTapePartition\nPUBLIC 6b188 10 WriteTapemark\nPUBLIC 6b1c2 10 GetTapeParameters\nPUBLIC 6b21e c SetTapeParameters\nPUBLIC 6b25f 4 GetTapeStatus\nPUBLIC 2cb03 8 CreateJobObjectW\nPUBLIC 6b280 c OpenJobObjectW\nPUBLIC 2e44a 8 AssignProcessToJobObject\nPUBLIC 6b2f7 8 TerminateJobObject\nPUBLIC 2afc9 14 QueryInformationJobObject\nPUBLIC 2ca9f 10 SetInformationJobObject\nPUBLIC 6b324 c IsProcessInJob\nPUBLIC 6b35e c CreateJobSet\nPUBLIC 6b38c 8 CreateJobObjectA\nPUBLIC 6b3f8 c OpenJobObjectA\nPUBLIC 6b46c c CreateHardLinkW\nPUBLIC 6b629 c CreateHardLinkA\nPUBLIC 6b683 4 GetHandleContext\nPUBLIC 2146c 8 GetSystemWow64DirectoryW\nPUBLIC 6b694 0 CreateSocketHandle\nPUBLIC 1301e 18 BasepSxsActivationContextNotification\nPUBLIC 6b6a3 10 BasepSxsSuitableManifestCallback\nPUBLIC 17190 c BasepSxsFindSuitableManifestResourceFor\nPUBLIC 2bf01 4 AddRefActCtx\nPUBLIC 1305f 4 ReleaseActCtx\nPUBLIC 6b6fb 4 ZombifyActCtx\nPUBLIC a644 8 ActivateActCtx\nPUBLIC a675 8 DeactivateActCtx\nPUBLIC 300a9 4 GetCurrentActCtx\nPUBLIC 967c 10 BasepAllocateActivationContextActivationBlock\nPUBLIC 6b723 4 BasepFreeActivationContextActivationBlock\nPUBLIC 130a6 4 BasepSxsCloseHandles\nPUBLIC 15350 14 BasepSxsCreateResourceStream\nPUBLIC 6b761 8 BasepSxsOverrideStreamToMessageStream\nPUBLIC 1530d 4 BasepSxsIsStatusFileNotFoundEtc\nPUBLIC 19aaa 4 BasepSxsIsStatusResourceNotFound\nPUBLIC 1a9d9 8 BasepSxsGetProcessImageBaseAddress\nPUBLIC 15229 10 BasepSxsCreateFileStream\nPUBLIC 162db 1c QueryActCtxW\nPUBLIC 1529b 3c BasepSxsCreateStreams\nPUBLIC 1a86f 28 BasepSxsCreateProcessCsrMessage\nPUBLIC 15921 c BasepCreateActCtx\nPUBLIC 1545c 4 CreateActCtxW\nPUBLIC 11210 c BasepProbeForDllManifest\nPUBLIC 6b7a5 4 CreateActCtxA\nPUBLIC 2fe16 c BasepFindActCtxSection_FillOutReturnData\nPUBLIC 30e9a c BasepFindActCtxSection_CheckAndConvertParameters\nPUBLIC 2fd92 14 BasepFindActCtxSectionString\nPUBLIC 6bb0f 14 FindActCtxSectionStringA\nPUBLIC 2fd4c 14 FindActCtxSectionStringW\nPUBLIC 30f21 14 FindActCtxSectionGuid\nPUBLIC 38653 14 BasepQueryModuleData\nPUBLIC 3835a 14 BaseQueryModuleData\nPUBLIC 1612f 4 CsrBasepCreateActCtx\nPUBLIC 6bb65 4 SetComPlusPackageInstallStatus\nPUBLIC 6bba2 0 GetComPlusPackageInstallStatus\nPUBLIC 6bbcf 4 BasepShimCacheWrite\nPUBLIC 16763 c BasepCheckStringPrefixUnicode\nPUBLIC 16602 4 BasepInitUserTempPath\nPUBLIC 1aa2c 0 BasepShimCacheInitTempDirs\nPUBLIC 169ea c BasepShimCacheQueryFileInformation\nPUBLIC 1691d 8 BasepIsRemovableMedia\nPUBLIC 2b335 c BasepShimCacheInit\nPUBLIC 16473 10 BasepShimCacheSearch\nPUBLIC 1697f c BasepShimCacheUpdateLRUIndex\nPUBLIC 2c59b c BasepShimCacheRemoveEntry\nPUBLIC 2f70b 1c BasepShimCacheAllocateEntry\nPUBLIC 2f695 10 BasepShimCacheUpdate\nPUBLIC 1642c 8 BasepBitMapCountBits\nPUBLIC 168bb c BasepBitMapSetBit\nPUBLIC 16396 4 BasepShimCacheCheckIntegrity\nPUBLIC 165e9 0 BasepShimCacheUnlock\nPUBLIC 16b75 4 BasepCheckCacheExcludeList\nPUBLIC 164cd 0 BaseInitAppcompatCache\nPUBLIC 2b553 8 BasepShimCacheRead\nPUBLIC 16662 14 BasepShimCacheCheckBypass\nPUBLIC 16879 10 BasepShimCacheLookup\nPUBLIC 16562 8 BasepShimCacheLock\nPUBLIC 167d7 10 BaseCheckAppcompatCache\nPUBLIC 15120 c BaseUpdateAppcompatCache\nPUBLIC 6bc3f 0 BaseFlushAppcompatCache\nPUBLIC 6bcc1 0 BaseDumpAppcompatCache\nPUBLIC 2b38d 0 BaseInitAppcompatCacheSupport\nPUBLIC 6be06 0 BaseCleanupAppcompatCache\nPUBLIC 6be8a 4 BaseCleanupAppcompatCacheSupport\nPUBLIC 1204d c StringCopyWorkerW\nPUBLIC 6bec2 0 FreeOne(_RESNAME *)\nPUBLIC 6bf37 0 FreeData(_UPDATEDATA *)\nPUBLIC 6c041 0 AddStringOrID(unsigned short const *,_UPDATEDATA *)\nPUBLIC 6c1ad 0 DeleteResourceFromList(_UPDATEDATA *,_RESTYPE *,_RESNAME *,int,int,int)\nPUBLIC 6c317 0 InsertResourceIntoLangList(_UPDATEDATA *,MY_STRING *,MY_STRING *,_RESTYPE *,_RESNAME *,int,int,int,void *)\nPUBLIC 6c414 0 FilePos(int)\nPUBLIC 6c42e 0 MuMoveFilePos(int,unsigned long)\nPUBLIC 6c449 0 MuWrite(int,void *,unsigned long)\nPUBLIC 6c470 0 MuRead(int,unsigned char *,unsigned long)\nPUBLIC 6c497 0 MuCopy(int,int,unsigned long)\nPUBLIC 6c536 0 SetResdata(_IMAGE_RESOURCE_DATA_ENTRY *,unsigned long,unsigned long)\nPUBLIC 6c55d 0 SetRestab(_IMAGE_RESOURCE_DIRECTORY *,long,unsigned short,unsigned short)\nPUBLIC 6c592 0 FindSection(_IMAGE_SECTION_HEADER *,_IMAGE_SECTION_HEADER *,char *)\nPUBLIC 6c5e7 0 AssignResourceToSection(_RESNAME * *,unsigned long,unsigned long,long,long *)\nPUBLIC 6c62a 0 WriteResSection(_UPDATEDATA *,int,unsigned long,unsigned long,_RESNAME *)\nPUBLIC 6c7a6 0 PatchDebug<_IMAGE_NT_HEADERS>(int,int,_IMAGE_SECTION_HEADER *,_IMAGE_SECTION_HEADER *,_IMAGE_SECTION_HEADER *,_IMAGE_SECTION_HEADER *,_IMAGE_NT_HEADERS *,_IMAGE_NT_HEADERS *,unsigned long,unsigned long *)\nPUBLIC 6c922 0 PatchDebug<_IMAGE_NT_HEADERS64>(int,int,_IMAGE_SECTION_HEADER *,_IMAGE_SECTION_HEADER *,_IMAGE_SECTION_HEADER *,_IMAGE_SECTION_HEADER *,_IMAGE_NT_HEADERS64 *,_IMAGE_NT_HEADERS64 *,unsigned long,unsigned long *)\nPUBLIC 6ca9e 0 PatchRVAs<_IMAGE_NT_HEADERS>(int,int,_IMAGE_SECTION_HEADER *,unsigned long,_IMAGE_NT_HEADERS *,unsigned long)\nPUBLIC 6cc38 0 PatchRVAs<_IMAGE_NT_HEADERS64>(int,int,_IMAGE_SECTION_HEADER *,unsigned long,_IMAGE_NT_HEADERS64 *,unsigned long)\nPUBLIC 6cdd5 0 PEWriteResource<_IMAGE_NT_HEADERS>(int,int,unsigned long,_UPDATEDATA *,_IMAGE_NT_HEADERS *)\nPUBLIC 6df34 0 PEWriteResource<_IMAGE_NT_HEADERS64>(int,int,unsigned long,_UPDATEDATA *,_IMAGE_NT_HEADERS64 *)\nPUBLIC 335b7 0 StringCchCopyW(unsigned short *,unsigned int,unsigned short const *)\nPUBLIC 6f093 0 AddResource(MY_STRING *,MY_STRING *,unsigned short,_UPDATEDATA *,void *,unsigned long)\nPUBLIC 6f3ef 0 PEWriteResFile(int,int,unsigned long,_UPDATEDATA *)\nPUBLIC 6f49a 0 WriteResFile(void *,unsigned short *)\nPUBLIC 6f5a3 18 UpdateResourceW\nPUBLIC 6f6aa 18 UpdateResourceA\nPUBLIC 6f774 8 EndUpdateResourceW\nPUBLIC 6f949 8 EndUpdateResourceA\nPUBLIC 6f959 0 EnumLangsFunc(void *,unsigned short *,unsigned short *,unsigned short,long)\nPUBLIC 6fa8d 0 EnumNamesFunc(void *,unsigned short *,unsigned short *,long)\nPUBLIC 6fab4 0 EnumTypesFunc(void *,unsigned short *,long)\nPUBLIC 6fad8 8 BeginUpdateResourceW\nPUBLIC 6fc7b 8 BeginUpdateResourceA\nPUBLIC 6fcdc 0 __report_gsfailure\nPUBLIC 6fdca 0 __security_init_cookie_ex\nPUBLIC 189fc 0 __security_init_cookie\nPUBLIC 9702 0 __security_check_cookie\nPUBLIC 6fe51 8 GetCurrentExeName\nPUBLIC 6febb c GetExeName\nPUBLIC 6ff39 18 GetConsoleAliasInternal\nPUBLIC 70086 10 GetConsoleAliasW\nPUBLIC 700b2 10 GetConsoleAliasA\nPUBLIC 700dc 8 GetConsoleAliasesLengthInternal\nPUBLIC 701a1 4 GetConsoleAliasesLengthW\nPUBLIC 701b9 4 GetConsoleAliasesLengthA\nPUBLIC 701d1 4 GetConsoleAliasExesLengthInternal\nPUBLIC 70245 0 GetConsoleAliasExesLengthW\nPUBLIC 70252 0 GetConsoleAliasExesLengthA\nPUBLIC 7025f 10 GetConsoleAliasesInternal\nPUBLIC 703c9 c GetConsoleAliasesW\nPUBLIC 703e7 c GetConsoleAliasesA\nPUBLIC 70405 c GetConsoleAliasExesInternal\nPUBLIC 70531 8 GetConsoleAliasExesW\nPUBLIC 7054c 8 GetConsoleAliasExesA\nPUBLIC 70567 8 ExpungeConsoleCommandHistoryInternal\nPUBLIC 7060f 4 ExpungeConsoleCommandHistoryW\nPUBLIC 70627 4 ExpungeConsoleCommandHistoryA\nPUBLIC 7063f c SetConsoleNumberOfCommandsInternal\nPUBLIC 7070a 8 SetConsoleNumberOfCommandsW\nPUBLIC 70725 8 SetConsoleNumberOfCommandsA\nPUBLIC 70740 8 GetConsoleCommandHistoryLengthInternal\nPUBLIC 707ed 4 GetConsoleCommandHistoryLengthW\nPUBLIC 70805 4 GetConsoleCommandHistoryLengthA\nPUBLIC 7081d 10 GetConsoleCommandHistoryInternal\nPUBLIC 70989 c GetConsoleCommandHistoryW\nPUBLIC 709a7 c GetConsoleCommandHistoryA\nPUBLIC 709c5 4 SetConsoleCommandHistoryMode\nPUBLIC 1ba6a c GetConsoleTitleInternal\nPUBLIC 70a39 8 GetConsoleTitleA\nPUBLIC 1ba3c 8 GetConsoleTitleW\nPUBLIC 2da09 c SetConsoleTitleInternal\nPUBLIC 70a61 4 SetConsoleTitleA\nPUBLIC 2d9bd 4 SetConsoleTitleW\nPUBLIC 70ad1 8 GetConsoleInputExeNameW\nPUBLIC 1b355 4 SetConsoleInputExeNameW\nPUBLIC 70b61 18 AddConsoleAliasInternal\nPUBLIC 70c81 c AddConsoleAliasW\nPUBLIC 70cbf c AddConsoleAliasA\nPUBLIC 70cfc 8 GetConsoleInputExeNameA\nPUBLIC 70da8 4 SetConsoleInputExeNameA\nPUBLIC 1b10f 10 SetUpAppName\nPUBLIC 29ee3 8 ParseReserved\nPUBLIC 1aff3 4 GetConsoleLangId\nPUBLIC 1afd5 0 SetTEBLangID\nPUBLIC 18c64 c ConnectConsoleInternal\nPUBLIC 70e05 2c AllocConsoleInternal\nPUBLIC 71011 0 FreeConsoleInternal\nPUBLIC 7108d 0 FreeConsole\nPUBLIC 710e1 4 PropRoutine\nPUBLIC 71191 10 AttachConsoleInternal\nPUBLIC b6d7 8 ConDllInitialize\nPUBLIC 71311 0 AllocConsole\nPUBLIC 714f9 4 AttachConsole\nPUBLIC 715f9 0 GetConsoleInputWaitHandle\nPUBLIC 1ce32 14 WriteConsoleInternal\nPUBLIC 1cf25 14 WriteConsoleA\nPUBLIC 35484 14 WriteConsoleW\nPUBLIC 1dc7e 4 CloseConsoleHandle\nPUBLIC 1dd4d 10 DuplicateConsoleHandle\nPUBLIC 71604 8 GetConsoleHandleInformation\nPUBLIC 716c9 c SetConsoleHandleInformation\nPUBLIC 1aeaa 4 VerifyConsoleIoHandle\nPUBLIC 1ff5b 10 OpenConsoleWInternal\nPUBLIC 10fe1 10 OpenConsoleW\nPUBLIC 71749 20 ReadConsoleInternal\nPUBLIC 71a1d 14 ReadConsoleA\nPUBLIC 71a6c 14 ReadConsoleW\nPUBLIC 71ac2 2c RegisterConsoleVDM\nPUBLIC 71c19 c GetConsoleHardwareState\nPUBLIC 71ce9 c SetConsoleHardwareState\nPUBLIC 37c53 4 GetConsoleDisplayMode\nPUBLIC 71d69 10 SetConsoleKeyShortcuts\nPUBLIC 71e30 4 SetConsoleMenuClose\nPUBLIC 71ea4 10 WriteConsoleInputVDMA\nPUBLIC 71ec7 10 WriteConsoleInputVDMW\nPUBLIC 71eea 8 SetConsoleCursor\nPUBLIC 71f64 8 ShowConsoleCursor\nPUBLIC 71fbf c ConsoleMenuControl\nPUBLIC 72020 c SetConsolePaletteInternal\nPUBLIC 720a0 c SetConsoleDisplayMode\nPUBLIC 721c9 c SetConsolePalette\nPUBLIC 72269 18 WriteConsoleInputInternal\nPUBLIC 723c5 10 WriteConsoleInputA\nPUBLIC 723e8 10 WriteConsoleInputW\nPUBLIC 7240b 18 CopyRectangle\nPUBLIC 7254f 18 ReadConsoleOutputInternal\nPUBLIC 727e1 14 ReadConsoleOutputW\nPUBLIC 72805 14 ReadConsoleOutputA\nPUBLIC 72829 18 WriteConsoleOutputInternal\nPUBLIC 72b21 14 WriteConsoleOutputW\nPUBLIC 72b45 14 WriteConsoleOutputA\nPUBLIC 72b69 1c ReadConsoleOutputString\nPUBLIC 72cd9 14 ReadConsoleOutputCharacterA\nPUBLIC 72cff 14 ReadConsoleOutputCharacterW\nPUBLIC 72d25 14 ReadConsoleOutputAttribute\nPUBLIC 72d4b 1c WriteConsoleOutputString\nPUBLIC 72ea5 14 WriteConsoleOutputCharacterA\nPUBLIC 72ecb 14 WriteConsoleOutputCharacterW\nPUBLIC 72ef1 14 WriteConsoleOutputAttribute\nPUBLIC 72f17 18 FillConsoleOutput\nPUBLIC 72ff9 14 FillConsoleOutputCharacterA\nPUBLIC 73020 14 FillConsoleOutputCharacterW\nPUBLIC 73044 14 FillConsoleOutputAttribute\nPUBLIC 73068 14 CreateConsoleScreenBuffer\nPUBLIC 73215 8 InvalidateConsoleDIBits\nPUBLIC 732e1 18 GetConsoleInput\nPUBLIC 7348d 10 PeekConsoleInputA\nPUBLIC 734b0 10 PeekConsoleInputW\nPUBLIC 734d3 10 ReadConsoleInputA\nPUBLIC 734f6 10 ReadConsoleInputW\nPUBLIC 73519 14 ReadConsoleInputExA\nPUBLIC 7353d 14 ReadConsoleInputExW\nPUBLIC 73561 8 GetConsoleCursorInfo\nPUBLIC 73629 4 GetConsoleSelectionInfo\nPUBLIC 736e1 4 GetNumberOfConsoleMouseButtons\nPUBLIC 73799 10 GetConsoleFontInfo\nPUBLIC 738c1 8 GetConsoleFontSize\nPUBLIC 7394f c GetCurrentConsoleFont\nPUBLIC 1b1f0 8 SetConsoleMode\nPUBLIC 73a21 8 GenerateConsoleCtrlEvent\nPUBLIC 73aa8 4 SetConsoleActiveScreenBuffer\nPUBLIC 73b1c 4 FlushConsoleInputBuffer\nPUBLIC 73b90 8 SetConsoleScreenBufferSize\nPUBLIC 73c0a 8 SetConsoleCursorPosition\nPUBLIC 73c84 8 SetConsoleCursorInfo\nPUBLIC 73d51 c SetConsoleWindowInfo\nPUBLIC 73e21 18 ScrollConsoleScreenBufferInternal\nPUBLIC 73f21 14 ScrollConsoleScreenBufferA\nPUBLIC 73f45 14 ScrollConsoleScreenBufferW\nPUBLIC 73f69 8 SetConsoleTextAttribute\nPUBLIC 73fe5 8 SetConsoleFont\nPUBLIC 7405f 4 SetConsoleIcon\nPUBLIC 740d3 0 GetConsoleCP\nPUBLIC 74143 4 SetConsoleCP\nPUBLIC 1b18f 0 GetConsoleOutputCP\nPUBLIC 741fe 4 SetConsoleOutputCPInternal\nPUBLIC 74261 4 SetConsoleOutputCP\nPUBLIC 74294 8 GetConsoleKeyboardLayoutNameWorker\nPUBLIC 74329 4 GetConsoleKeyboardLayoutNameA\nPUBLIC 74341 4 GetConsoleKeyboardLayoutNameW\nPUBLIC 74359 0 GetConsoleWindow\nPUBLIC 743c5 8 GetConsoleProcessList\nPUBLIC 1af14 8 GetConsoleMode\nPUBLIC 74501 0 GetNumberOfConsoleFonts\nPUBLIC 7456d 8 GetNumberOfConsoleInputEvents\nPUBLIC 74631 4 GetLargestConsoleWindowSize\nPUBLIC 1bc2b 8 GetConsoleScreenBufferInfo\nPUBLIC 746b9 10 SetConsoleLocalEUDC\nPUBLIC 7477f c SetConsoleCursorMode\nPUBLIC 747ff c GetConsoleCursorMode\nPUBLIC 748c9 4 RegisterConsoleOS2\nPUBLIC 7493d 4 SetConsoleOS2OemFormat\nPUBLIC 749b1 14 RegisterConsoleIMEInternal\nPUBLIC 74ab9 8 RegisterConsoleIME\nPUBLIC 74b12 4 UnregisterConsoleIMEInternal\nPUBLIC 74b86 0 UnregisterConsoleIME\nPUBLIC 74b97 c MyRegOpenKey\nPUBLIC 74be9 10 MyRegQueryValue\nPUBLIC 74c8e 8 GetCommandLineString\nPUBLIC 74e13 4 ConsoleIMERoutine\nPUBLIC 74f87 8 GetConsoleNlsMode\nPUBLIC 750d9 8 SetConsoleNlsMode\nPUBLIC 751a3 c GetConsoleCharType\nPUBLIC 75271 4 DefaultHandler\nPUBLIC 1b5c6 4 SetCtrlHandler\nPUBLIC 2000c 4 RemoveCtrlHandler\nPUBLIC 1b58b 8 SetConsoleCtrlHandler\nPUBLIC 75280 4 CtrlRoutine\nPUBLIC 75489 0 SetLastConsoleEventActiveInternal\nPUBLIC 754d3 0 SetLastConsoleEventActive\nPUBLIC 754e4 8 VDMConsoleOperation\nPUBLIC 38211 10 EnumCalendarInfoA\nPUBLIC 75749 10 EnumCalendarInfoExA\nPUBLIC 7576c c EnumTimeFormatsA\nPUBLIC 7578a c EnumDateFormatsA\nPUBLIC 757aa c EnumDateFormatsExA\nPUBLIC 757ca c EnumSystemLanguageGroupsA\nPUBLIC 757e8 10 EnumLanguageGroupLocalesA\nPUBLIC 75809 c EnumUILanguagesA\nPUBLIC 37ce1 8 EnumSystemLocalesA\nPUBLIC 75827 8 EnumSystemCodePagesA\nPUBLIC 75842 14 GetGeoInfoA\nPUBLIC a459 8 NlsGetACPFromLocale\nPUBLIC cf52 18 NlsAnsiToUnicode\nPUBLIC d239 14 NlsUnicodeToAnsi\nPUBLIC 380ef c NlsEnumUnicodeToAnsi\nPUBLIC 38063 24 NlsDispatchAnsiEnumProc\nPUBLIC d077 18 CompareStringA\nPUBLIC 38de8 18 LCMapStringA\nPUBLIC d262 10 GetLocaleInfoA\nPUBLIC 758cb c SetLocaleInfoA\nPUBLIC 7596b 18 GetCalendarInfoA\nPUBLIC 75ad6 10 SetCalendarInfoA\nPUBLIC 3632d 18 GetTimeFormatA\nPUBLIC 361ee 18 GetDateFormatA\nPUBLIC 2ec56 18 GetNumberFormatA\nPUBLIC 75b79 18 GetCurrencyFormatA\nPUBLIC 38a0c 14 GetStringTypeA\nPUBLIC 75eb1 14 FoldStringA\nPUBLIC 76047 c GetCPInfoExA\nPUBLIC 760cf 14 GetStringTypeExA\nPUBLIC a490 10 GetStringTypeW\nPUBLIC 760df 3c FindJamoDifference\nPUBLIC bfef 14 GetStringTypeExW\nPUBLIC af4f 1c LongCompareStringW\nPUBLIC 763c9 0 NlsResetProcessLocale\nPUBLIC 763ef 8 IsValidLanguageGroup\nPUBLIC 1c48b 8 IsValidLocale\nPUBLIC 764fb 4 IsValidUILanguage\nPUBLIC a415 0 GetThreadLocale\nPUBLIC 13038 0 GetSystemDefaultUILanguage\nPUBLIC 13070 0 GetUserDefaultUILanguage\nPUBLIC 127b2 0 GetSystemDefaultLangID\nPUBLIC bf3d 0 GetSystemDefaultLCID\nPUBLIC 9f10 0 GetUserDefaultLCID\nPUBLIC 7668d c SetCurrentUserRegValue\nPUBLIC 76734 1c SetMultipleUserInfoInRegistry\nPUBLIC 769f2 1c SetMultipleUserInfo\nPUBLIC 39200 c GetTwoDigitYearInfo\nPUBLIC 76a53 c SetTwoDigitYearInfo\nPUBLIC 76c59 10 GetNativeLanguageName\nPUBLIC 383cf 4 ConvertDefaultLocale\nPUBLIC 1bbba 4 SetThreadLocale\nPUBLIC bf64 0 GetUserDefaultLangID\nPUBLIC 2f041 c VerLanguageNameW\nPUBLIC 2efb9 c VerLanguageNameA\nPUBLIC 11562 10 GetLocaleInfoW\nPUBLIC 39020 18 GetCalendarInfoW\nPUBLIC 76d1b 10 SetCalendarInfoW\nPUBLIC 76e34 c SetUserInfo\nPUBLIC 1b258 4 SetThreadUILanguage\nPUBLIC 76e73 c SetLocaleInfoW\nPUBLIC 77cf7 10 CreateRegKey\nPUBLIC 1bcfe 10 OpenRegKey\nPUBLIC 15047 14 QueryRegValue\nPUBLIC 77df0 10 SetRegValue\nPUBLIC 1734f 10 MapSection\nPUBLIC 77e24 4 UnMapSection\nPUBLIC 17f7d 18 GetNlsSectionName\nPUBLIC 77e43 c GetCodePageDLLPathName\nPUBLIC 2ae21 8 GetNTFileName\nPUBLIC 2ac6c c CreateNlsSecurityDescriptor\nPUBLIC 2b95b 8 AppendAccessAllowedACE\nPUBLIC 2b883 0 CreateNlsObjectDirectory\nPUBLIC 172de 14 OpenSection\nPUBLIC 2ad98 8 OpenDataFile\nPUBLIC 77f87 8 CreateSectionTemp\nPUBLIC 77fec 10 Internal_EnumSystemLanguageGroups\nPUBLIC 782c6 14 Internal_EnumLanguageGroupLocales\nPUBLIC 2a8fa 10 Internal_EnumUILanguages\nPUBLIC 37cfc c Internal_EnumSystemLocales\nPUBLIC 7849b c Internal_EnumSystemCodePages\nPUBLIC 38234 18 Internal_EnumCalendarInfo\nPUBLIC 38958 38 EnumDateTime\nPUBLIC 786e5 c EnumSystemLanguageGroupsW\nPUBLIC 78703 10 EnumLanguageGroupLocalesW\nPUBLIC 2a8dc c EnumUILanguagesW\nPUBLIC 78724 8 EnumSystemLocalesW\nPUBLIC 7873f 8 EnumSystemCodePagesW\nPUBLIC 7875a 10 EnumCalendarInfoW\nPUBLIC 7877d 10 EnumCalendarInfoExW\nPUBLIC 388dc 10 Internal_EnumTimeFormats\nPUBLIC 38801 14 Internal_EnumDateFormats\nPUBLIC 388be c EnumTimeFormatsW\nPUBLIC 387e1 c EnumDateFormatsW\nPUBLIC 787a0 c EnumDateFormatsExW\nPUBLIC 787c0 8 GetGeoLCID\nPUBLIC 78847 14 GetGeoInfoW\nPUBLIC 78bd9 c EnumSystemGeoID\nPUBLIC 3798e 4 GetUserGeoID\nPUBLIC 78c5c 4 SetUserGeoID\nPUBLIC 78db1 10 FoldCZone\nPUBLIC 78e32 10 FoldDigits\nPUBLIC 78eb3 10 FoldCZone_Digits\nPUBLIC 78f7b 10 FoldLigatures\nPUBLIC 790a7 10 FoldPreComposed\nPUBLIC 791d2 10 FoldComposite\nPUBLIC ce53 18 MapCase\nPUBLIC 2d4ad 1c MapSortKey\nPUBLIC 79269 18 MapNormalization\nPUBLIC 374eb 18 MapHalfKana\nPUBLIC 37787 18 MapFullKana\nPUBLIC 794fb 1c MapTraditionalSimplified\nPUBLIC 79636 14 FoldStringW\nPUBLIC 37693 18 MapKanaWidth\nPUBLIC cca8 18 LCMapStringW\nPUBLIC 110cb 4 IsValidCodePage\nPUBLIC 9915 0 GetACP\nPUBLIC 797c3 4 SetCPGlobal\nPUBLIC 127a7 0 GetOEMCP\nPUBLIC b7dc 4 IsDBCSLeadByte\nPUBLIC 2f540 10 GetWCCompSB\nPUBLIC 797df 1c GetWCCompMB\nPUBLIC 79866 14 GetWCCompSBErr\nPUBLIC 798c1 1c GetWCCompMBErr\nPUBLIC a1fb 18 GetMBNoDefault\nPUBLIC bd19 20 GetMBDefault\nPUBLIC 32cf3 1c GetMBCompSB\nPUBLIC 7998a 24 GetMBCompMB\nPUBLIC 7a064 0 GetMacCodePage\nPUBLIC cfd4 18 SpecialMBToWC\nPUBLIC 12e76 8 GetCPInfo\nPUBLIC 7a1cd c GetCPInfoExW\nPUBLIC 7a4ce 8 IsDBCSLeadByteEx\nPUBLIC 9bf8 18 MultiByteToWideChar\nPUBLIC 32c7b 20 GetMBDefaultComp\nPUBLIC a0d4 20 WideCharToMultiByte\nPUBLIC 7a6b5 0 GetXPSP2ResModuleHandle\nPUBLIC 7a6e2 0 GetXPSP3ResModuleHandle\nPUBLIC 35819 0 NlsGetCacheUpdateCount\nPUBLIC 34474 c IsValidSeparatorString\nPUBLIC 7a712 c IsValidGroupingString\nPUBLIC 336f6 8 IsValidCalendarType\nPUBLIC 33735 8 IsValidCalendarTypeStr\nPUBLIC 7a773 0 GetPreComposedChar\nPUBLIC 2f440 4 GetCompositeChars\nPUBLIC 7a7f3 4 InsertPreComposedForm\nPUBLIC 37834 8 InsertFullWidthPreComposedForm\nPUBLIC 2f40d 0 InsertCompositeForm\nPUBLIC 7a850 8 NlsConvertIntegerToHexStringW\nPUBLIC 124d1 8 NlsConvertStringToIntegerW\nPUBLIC 121de 0 NlsStrCpyW\nPUBLIC 1bdd2 0 NlsStrCatW\nPUBLIC a2d4 0 NlsStrLenW\nPUBLIC 7a8b2 0 NlsStrEqualW\nPUBLIC 7a962 4 NlsStrNEqualW\nPUBLIC 7aa41 4 GetDefaultSortkeySize\nPUBLIC 7aa6b 4 GetLinguistLangSize\nPUBLIC 7aa95 10 ValidateLCType\nPUBLIC 2ee51 14 GetStringTableEntry\nPUBLIC 7ad9c 0 NlsIsDll\nPUBLIC 2c16a 0 UpdateUserInfoCache\nPUBLIC 12544 c NlsStringIsInRange\nPUBLIC 2a5c3 10 GetUserInfoFromRegistry\nPUBLIC 12090 1c GetUserInfo\nPUBLIC 14f5c 14 NlsConvertIntegerToString\nPUBLIC 397f8 4 ValidateLocale\nPUBLIC 384db c GetCPFileNameFromRegistry\nPUBLIC 3440e 4 IsValidNumberFormat\nPUBLIC 7adfe 4 IsValidCurrencyFormat\nPUBLIC 7ae7f 20 GetRegIntValue\nPUBLIC 7af62 8 ConvertGroupingStringToInt\nPUBLIC 7afd9 1c GetGroupingValue\nPUBLIC 3472b 20 GetNumberString\nPUBLIC 3465d 20 ParseNumber\nPUBLIC 7b04e 20 ParseCurrency\nPUBLIC 344bc 18 GetNumberFormatW\nPUBLIC 7b6ca 18 GetCurrencyFormatW\nPUBLIC 3414d 4 IsValidTime\nPUBLIC 339dc 4 IsValidDate\nPUBLIC 7bad3 18 GetCalendarYear\nPUBLIC 7bb6e c GetAbsoluteDate\nPUBLIC 7bc59 4 GetAdvanceHijriDate\nPUBLIC 7be1b 4 DaysUpToHijriYear\nPUBLIC 7be83 c IsValidDateForHebrew\nPUBLIC 335d4 18 StringCchCopyExW\nPUBLIC 33ec8 14 ParseTime\nPUBLIC 7bf4d 8 GetHijriDate\nPUBLIC 7c04f 8 GetHebrewDate\nPUBLIC 7c86f c NumberToHebrewLetter\nPUBLIC 33fd3 18 GetTimeFormatW\nPUBLIC 33a4a 20 ParseDate\nPUBLIC 33775 18 GetDateFormatW\nPUBLIC c0ed 0 NlsThreadCleanup\nPUBLIC 17fc1 0 InitKoreanWeights\nPUBLIC 1805b c NlsDllInitialize\nPUBLIC 38617 4 IsCPHashNodeLoaded\nPUBLIC 7caa9 0 GetGeoFileInfo\nPUBLIC a557 0 GetCTypeFileInfo\nPUBLIC 7cb54 8 LoadCodePageAsDLL\nPUBLIC 188fc 14 MakeCPHashNode\nPUBLIC 16ea9 10 MakeLocHashNode\nPUBLIC 336b6 8 GetCalendar\nPUBLIC 7cc2b 4 IsValidSortId\nPUBLIC 7cd42 0 GetLanguageExceptionInfo\nPUBLIC 7cdc6 4 FindLanguageExceptionPointers\nPUBLIC 7ce1e 4 CopyLanguageExceptionInfo\nPUBLIC 184dc c FindExceptionPointers\nPUBLIC 7ceb0 8 CopyExceptionInfo\nPUBLIC 7cf53 4 WaitOnEvent\nPUBLIC 183fe 8 GetSortkeyFileInfo\nPUBLIC 3996f 8 GetCodePageFileInfo\nPUBLIC 1831e 10 MakeLangHashNode\nPUBLIC d1ae 0 GetCPHashNode\nPUBLIC 150c2 0 GetLocHashNode\nPUBLIC 7cf85 8 CreateAndCopyLanguageExceptions\nPUBLIC 7d1b9 4 GetLinguisticLanguageInfo\nPUBLIC 18297 10 GetLanguageFileInfo\nPUBLIC 7d246 0 GetLangHashNode\nPUBLIC 7d340 c UpdateJamoState\nPUBLIC 7d3aa 14 GetJamoComposition\nPUBLIC 7d4ae 18 MapOldHangulSortKey\nPUBLIC 17210 0 NlsIsInteractiveUserProcess\nPUBLIC 7d5b4 0 NlsCheckForInteractiveUser\nPUBLIC 2a25d 4 NlsGetCacheBuffer\nPUBLIC 2a41a 0 NlsInvalidateCache\nPUBLIC 7d659 4 NlsFlushProcessCache\nPUBLIC 2a855 10 NlsQueryCurrentUserInfo\nPUBLIC 11fff 18 NlsGetCurrentUserNlsInfo\nPUBLIC 2a532 4 NlsGetUserLocale\nPUBLIC 7d6b7 c CsrBasepNlsSetUserInfo\nPUBLIC 16ff1 8 CsrBasepNlsGetUserInfo\nPUBLIC 7d765 1c CsrBasepNlsSetMultipleUserInfo\nPUBLIC 7d9c9 0 CsrBasepNlsUpdateCacheCount\nPUBLIC 7da0e c UTFCPInfo\nPUBLIC 7da7f 10 UTF7ToUnicode\nPUBLIC 31054 14 UTF8ToUnicode\nPUBLIC 7dc45 10 UnicodeToUTF7\nPUBLIC 21523 10 UnicodeToUTF8\nPUBLIC 30f99 18 UTFToUnicode\nPUBLIC 215f5 20 UnicodeToUTF\nPUBLIC 2ad39 c CsrBasepNlsCreateSection\nPUBLIC 7dead 8 DelayLoadFailureHook\nPUBLIC 7debd 4 FindDll\nPUBLIC 7dfad 8 LookupHandlerByName\nPUBLIC 7e036 8 LookupHandlerByOrdinal\nPUBLIC 7e07f 8 LookupHandler\nPUBLIC 7e0cb 14 GetSSIDForAdapter\nPUBLIC 7e0ef 18 GetSignalStrengthForAdapter\nPUBLIC ddf5 0 GetCurrentProcess\nPUBLIC 7e27b 4 ntohs\nPUBLIC 7e299 c WSAEnumProtocolsW\nPUBLIC 7e2bd 24 WSAIoctl\nPUBLIC 7e313 4 GetActivePwrScheme\nPUBLIC 7e34b 28 WinStationSendMessageW\nPUBLIC 7e362 8 ReadPwrScheme\nPUBLIC 7e39e 18 SdbQueryData\nPUBLIC 14ae7 4 FreeEnvironmentStringsW\nPUBLIC 7e3a9 c mixerGetID\nPUBLIC 7e536 18 SetupDiGetDeviceInterfaceDetailA\nPUBLIC cc97 4 LockResource\nPUBLIC 7e848 8 DnsRecordCompare\nPUBLIC 7e878 10 DnsRecordSetCompare\nPUBLIC 260c2 4 DnsApiAlloc\nPUBLIC 7e8b2 c DnsRecordSetCopyEx\nPUBLIC 7e98d 4 DnsApiFree\nPUBLIC 7e9e7 0 LZStart\nPUBLIC 7ea57 c SfpInstallCatalog\nPUBLIC 7ea62 8 SfpDeleteCatalog\nPUBLIC 7eb14 10 pSetupConcatenatePaths\nPUBLIC 7eb60 c SetActivePwrScheme\nPUBLIC 7ec59 0 IsPwrShutdownAllowed\nPUBLIC 7ece6 10 UrlMkSetSessionOption\nPUBLIC 7f052 0 ldap_search_init_pageW\nPUBLIC 7f078 8 DnsFreeConfigStructure\nPUBLIC 7f0c5 c DnsSetConfigDword\nPUBLIC 7f1f1 10 WZCProviderDeleteWirelessProfile\nPUBLIC 7f1fe 0 LZDone\nPUBLIC 7f215 8 SetConsoleMaximumWindowSize\nPUBLIC 7f23b 1c MprAdminConnectionEnum\nPUBLIC 7f251 8 NPCancelConnectionForCSCAgent\nPUBLIC 7f6a5 5c LocalEnrollNoDS\nPUBLIC 328ec 0 memmove\nPUBLIC 2cf55 c RtlDnsHostNameToComputerName\nPUBLIC 11fc7 0 wcsncpy\nPUBLIC 7f853 0 wcschr\nPUBLIC 29f14 0 wcsstr\nPUBLIC a0c9 0 _allmul\nPUBLIC 7f85e 0 DbgBreakPoint\nPUBLIC 7f869 0 DbgPrint\nPUBLIC 24c6 0 _SEH_prolog\nPUBLIC 2501 0 _SEH_epilog\nPUBLIC 39aa8 0 _except_handler3\nPUBLIC 39b8e 4 _seh_longjmp_unwind\nPUBLIC 7f874 4 DbgUiDebugActiveProcess\nPUBLIC 7f87f 0 DbgUiConnectToDbg\nPUBLIC 7f88a 4 DbgUiIssueRemoteBreakin\nPUBLIC 7f895 14 NtSetInformationDebugObject\nPUBLIC 7f8a0 0 DbgUiGetThreadDebugObject\nPUBLIC 7f8ab 8 DbgUiConvertStateChangeStructure\nPUBLIC 7f8b6 8 DbgUiWaitStateChange\nPUBLIC 7f8c1 8 DbgUiContinue\nPUBLIC 7f8cc 4 DbgUiStopDebugging\nPUBLIC 7f8d7 0 strncpy\nPUBLIC 7f8e2 8 RtlFlushSecureMemoryCache\nPUBLIC de84 0 _global_unwind2\nPUBLIC dedf 0 _local_unwind2\nPUBLIC df3f 0 _NLG_Return2\nPUBLIC df4f 0 _abnormal_termination\nPUBLIC df72 0 _NLG_Notify1\nPUBLIC df7b 0 _NLG_Notify\nPUBLIC df91 0 _NLG_Dispatch2\nPUBLIC 7f8ed 18 NtQueryVirtualMemory\nPUBLIC 18045 4 LdrSetDllManifestProber\nPUBLIC 18050 8 RtlSetThreadPoolStartFunc\nPUBLIC 1017b 4 RtlEncodePointer\nPUBLIC 39493 10 RtlSetHeapInformation\nPUBLIC 7f8f8 14 RtlQueryHeapInformation\nPUBLIC abd3 4 LdrUnloadDll\nPUBLIC 14e44 4 LdrUnloadAlternateResourceModule\nPUBLIC 112bb 4 LdrDisableThreadCalloutsForDll\nPUBLIC e46c 10 LdrGetDllHandle\nPUBLIC b4c4 8 LdrUnlockLoaderLock\nPUBLIC 2129a 8 LdrAddRefDll\nPUBLIC b3ca c LdrLockLoaderLock\nPUBLIC 17779 c LdrEnumerateLoadedModules\nPUBLIC 14e0f 8 LdrLoadAlternateResourceModule\nPUBLIC e069 10 LdrLoadDll\nPUBLIC ad95 10 LdrGetProcedureAddress\nPUBLIC 9f9f 10 LdrFindResource_U\nPUBLIC 9faa 10 LdrAccessResource\nPUBLIC 1126d 10 LdrFindResourceDirectory_U\nPUBLIC 1cdf8 0 LdrShutdownProcess\nPUBLIC 7f903 8 NtTerminateProcess\nPUBLIC 1a204 18 LdrQueryImageFileExecutionOptions\nPUBLIC 7f90e 0 wcsncmp\nPUBLIC c0d1 0 LdrShutdownThread\nPUBLIC 10186 4 RtlDecodePointer\nPUBLIC 2c053 c RtlSetIoCompletionCallback\nPUBLIC 7f919 28 RtlApplicationVerifierStop\nPUBLIC 7f924 0 _alloca_probe\nPUBLIC 19a62 0 DbgPrintEx\nPUBLIC 15451 4 LdrDestroyOutOfProcessImage\nPUBLIC 162a8 14 LdrAccessOutOfProcessResource\nPUBLIC 15446 14 LdrFindCreateProcessManifest\nPUBLIC 15345 10 LdrCreateOutOfProcessImage\nPUBLIC 16912 0 _allshl\nPUBLIC 7f92f 4 RtlUnhandledExceptionFilter\nPUBLIC 7f93a 0 wcspbrk\nPUBLIC 7f945 0 _wcslwr\nPUBLIC 37a6c 0 _wtol\nPUBLIC 7f950 0 _strlwr\nPUBLIC 7f95b 0 _ValidateEH3RN\nPUBLIC 7fb82 10 RtlUnwind\nPUBLIC 7fb8d c InitGlobalBuffers\nPUBLIC 7fc40 0 InitGlobalBuffersEx\nPUBLIC 7fc57 4 FreeGlobalBuffers\nPUBLIC 7fca5 c lz_CopyFile\nPUBLIC 7fd63 c ExpandOrCopyFile\nPUBLIC 7fe21 4 ExtractFileNameW\nPUBLIC 7fe56 4 ExtractFileName\nPUBLIC 7fea2 4 ExtractExtensionW\nPUBLIC 7fed7 4 ExtractExtension\nPUBLIC 7ff1d 4 MakeCompressedNameW\nPUBLIC 7ff89 4 MakeCompressedName\nPUBLIC 7fff3 8 MakeExpandedName\nPUBLIC 800fc 8 CopyDateTimeStamp\nPUBLIC 80146 c GetHdr\nPUBLIC 801f9 4 IsCompressed\nPUBLIC 80246 18 LZDecode\nPUBLIC 804ad c ReadInBuf\nPUBLIC 80527 c WriteOutBuf\nPUBLIC 80579 4 LZIsCharLowerA\nPUBLIC 805dc 4 LZIsCharUpperA\nPUBLIC 8063f 4 LZCharNextA\nSTACK WIN 4 b5ae 16 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9b47 66 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17826 35 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 55709 1f7 c 0 10 8 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 558b4 e 0 0 10 8 4c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 be41 c7 c 0 4 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39bc8 e 0 0 4 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 98f4 2b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 936b 1e 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9371 14 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 92b0 32 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 92b6 28 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 92b7 26 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30769 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b722 20 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 29d7a 164 a 0 18 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 29d83 157 1 0 18 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 29d84 155 0 0 18 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 29dc5 8e 0 0 18 c 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 1b069 a1 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b078 90 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b079 82 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 17860 24 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 29f30 6f 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 29f36 65 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1dc03 54 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12f39 52 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12f3f 48 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17889 5c 1d 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1789f 42 7 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 178a6 38 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17923 98 7 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1792a 8f 0 0 0 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 180a6 23c 9 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 180af 231 0 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 180c5 21a 0 0 0 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1795e 89 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 17961 85 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1798a 5a 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 179ea 212 8 0 0 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17a3c 1bd 0 0 0 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17a49 1af 0 0 0 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 16e70 85 8 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 18a21 a1 e 0 0 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 18a2f 91 0 0 0 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 18a68 57 0 0 0 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17cb5 257 8 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17e09 89 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1839b d3 1b 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 183b2 b8 4 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 183b6 b3 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 998d 16b c 0 8 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39e42 e 0 0 8 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 992f 10b c 0 4 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39ea2 e 0 0 4 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39eca e 0 0 4 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1625 129 c 0 20 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1717 4 0 0 20 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32eb1 ba c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39f0b e 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32e1d bb c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39f69 e 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a03b 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a017 25 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55921 e8 8 0 4 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5595c a5 0 0 4 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5595d a3 0 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a35e b91 19 0 18 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a36a b81 d 0 18 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 132 - ^ =\nSTACK WIN 4 a36b b7f c 0 18 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 132 - ^ =\nSTACK WIN 4 a377 b72 0 0 18 c 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 132 - ^ =\nSTACK WIN 4 55a0e e0 c 0 4 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55abf e 0 0 4 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55b09 8b c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55b65 e 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30927 209 c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3a7c5 e 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30bd3 142 c 0 c 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3a824 e 0 0 c 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3a86a 19 0 0 c 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 33107 18f f 0 14 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 33110 182 6 0 14 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 33116 17b 0 0 14 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 3312f 14d 0 0 14 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 ffb1 12d c 0 c 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3a94d e 0 0 c 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3a995 19 0 0 c 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 326c1 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ab78 ff c 0 4 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3a9c6 e 0 0 4 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 330e7 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a9cc 64 a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a9d2 5a 4 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 a9d6 55 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 ba64 39 c 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3aa01 4 0 0 8 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 bbce b2 c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3aa1d e 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e6dc 185 c 0 18 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e6e8 175 0 0 18 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 e701 13c 0 0 18 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 e73a ed 0 0 18 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 1021c 1ba 9 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10225 1ad 0 0 10 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1026f 15c 0 0 10 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30b7d 3b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c86d 29 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 2c87c 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ddfe d3 c 0 1c 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3aad0 4 0 0 1c 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a996 65 a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a99c 5b 4 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 a9a0 56 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 b64c 63 c 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3ab10 11 0 0 8 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2520 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1042c 301 17 0 1c 8 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3abe7 7a 0 0 1c 8 420 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 98eb 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 2ff92 18 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 103a3 9e 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55bbc 2d 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55bee 31 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55c24 2e 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55c2c 22 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55c57 27 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55c83 4c b 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55c89 42 5 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 55c8d 3d 1 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 55c8e 3b 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 55cd4 119 15 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55cdc 10d d 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 55cdd 10b c 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 55ce9 fe 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 55df2 bd 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55df8 b3 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55e53 15 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55eb4 36 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55eef 15b 12 0 18 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55efb 14b 6 0 18 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 55f01 144 0 0 18 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5604f a4 18 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5605a 95 d 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 5605e 90 9 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 56067 86 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 560f8 d7 9 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56100 cb 1 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 56101 c9 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 5618d 3c 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 561d4 a5 16 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 561dd 98 d 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 561de 94 c 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 561ea 87 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 5627e fe 16 0 c 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56287 f1 d 0 c 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 56288 ef c 0 c 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 56294 e2 0 0 c c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 56381 2b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 563b1 20 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 563d6 60 10 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 563df 53 7 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 563e6 4b 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 56407 24 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5643b 1f 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56441 15 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5645f 54 a 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56465 4a 4 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 56469 45 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 56471 3c 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 564b8 5c 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 564be 52 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 564cf 16 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56519 180 e 0 c 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56522 173 5 0 c 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 56523 171 4 0 c 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 56527 16c 0 0 c c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 5669e c8 9 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 566a6 bc 1 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 566a7 ba 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 5676b 27b 15 0 c 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56774 26e c 0 c 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 5677f 262 1 0 c 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 56780 260 0 0 c c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 569ec e9 15 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 569f4 dd d 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 569f5 db c 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 56a01 ce 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 56ada b5 15 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56ae2 a9 d 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 56ae3 a7 c 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 56aef 9a 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 56b94 12e 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56b9c 122 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56bba 102 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56cc7 113 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56cdf f6 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56cea ea 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56ddf 22e 19 0 1c 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 56df1 2a 7 0 1c 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 56df2 28 6 0 1c 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 56df8 21 0 0 1c c 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 57012 8d 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57018 83 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5704b 45 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5704f 40 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 570a4 46 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 570ac 16 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 570ef 5b 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 570f7 16 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57112 2c 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5714f 75 e 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5715d 5e 0 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57177 35 0 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 571c9 e0 a 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 571cf d6 4 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 571d3 d1 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 572ae 14b 9 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 572b7 13e 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 572df 115 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 573fe 1f4 1c 0 1c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5740d 1b2 d 0 1c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 57411 1ad 9 0 1c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 5741a 1a3 0 0 1c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 37bfc 52 13 0 0 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 37a77 1c7 13 0 8 0 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 37a80 1ba a 0 8 4 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 37a8a 1af 0 0 8 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 575f7 69 b 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 575fd 5f 5 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 575fe 5d 4 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 57602 58 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 57665 70 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5766b 66 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 576a6 2a 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 576da 5c c 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 576e1 51 5 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 576e2 4f 4 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 576e6 4a 0 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 5773b 82 15 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57748 71 8 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 57749 6f 7 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 57750 67 0 0 c c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 577c2 a4 e 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 577cb 97 5 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 577cc 95 4 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 577d0 90 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 5786b 4b 11 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57871 41 b 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 57878 37 4 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5787c 32 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 202af 1e8 22 0 10 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 202c3 1cb e 0 10 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 202c4 1c9 d 0 10 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 202d1 1bb 0 0 10 c c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 578bb 9d 10 0 c 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 578c4 90 7 0 c 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 578cb 88 0 0 c 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5795d 95 a 0 10 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57966 88 1 0 10 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57967 86 0 0 10 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 579f7 ac 9 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 579fe a1 2 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 579ff 9d 1 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 57a00 9b 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 57aa8 101 9 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57ab0 f5 1 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 57ab1 f3 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 57ae7 93 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 57bae e4 a 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57bb7 d7 1 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 57bb8 d5 0 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 57be2 a8 0 0 c c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 57c97 38 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57cd4 b4 9 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57cdd 54 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57d07 29 0 0 4 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57da5 80 b 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57dab 76 5 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 57daf 71 1 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 57db0 6f 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 57e41 3f 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57e85 2c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57eb6 9e a 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57ebe 92 2 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 57ebf 8e 1 0 4 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 57ec0 8c 0 0 4 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 57f59 2c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57f8a 4e a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57f90 44 4 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57f94 3f 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57fdd a7 7 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 57fe4 9c 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 57ff3 8c 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 57ff4 8a 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 31893 136 22 0 10 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 318a7 119 e 0 10 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 318ab 114 a 0 10 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 318b5 109 0 0 10 c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 316c7 20b 13 0 8 0 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 316d8 139 2 0 8 4 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 68 - ^ =\nSTACK WIN 4 316d9 137 1 0 8 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 68 - ^ =\nSTACK WIN 4 316da 135 0 0 8 c 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 68 - ^ =\nSTACK WIN 4 5808d 121 15 0 4 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5809a 110 8 0 4 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 580a1 108 1 0 4 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 580a2 106 0 0 4 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 201f1 25b a 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 201fb 22d 0 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 2020a 210 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 20210 209 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 581b3 7c 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 581b9 72 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 581cc 5e 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 216a4 105 a 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 216ad f8 1 0 8 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 216ae f6 0 0 8 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 21702 84 0 0 8 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 58234 6e 8 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5827c 17 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 582a7 a0 b 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 582ad 96 5 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 582ae 94 4 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 582b2 8f 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5834c 52 8 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 58380 1a 0 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 583a3 17b 7 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 583aa 170 0 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 583d0 143 0 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 58523 a7 b 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 58529 9d 5 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5852a 9b 4 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5852e 96 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2ceb2 ae 1c 0 c 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2cec0 97 e 0 c 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ =\nSTACK WIN 4 2cec4 92 a 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ =\nSTACK WIN 4 2cece 87 0 0 c c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ =\nSTACK WIN 4 585cf 97 18 0 c 0 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 585dd 76 a 0 c 4 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 585e7 6b 0 0 c 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5866b 476 1c 0 10 0 68c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5867c 2f7 b 0 10 4 68c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1684 - ^ =\nSTACK WIN 4 58680 2f2 7 0 10 8 68c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1684 - ^ =\nSTACK WIN 4 58687 2ea 0 0 10 c 68c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1684 - ^ =\nSTACK WIN 4 58bc3 76 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 58be8 4d 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 58c3e 26 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 58c69 19c b 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 58c72 18f 2 0 4 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 58c73 18d 1 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 58c74 18b 0 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 58e0a 117 a 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 58e12 10b 2 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 58e13 109 1 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 58e14 107 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 58f26 44 6 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 58f3c 2a 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 58f6f dc 8 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 58f76 d1 1 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 58f77 cf 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 58f91 af 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 59050 44 6 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 59066 2a 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 59099 211 d 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 590a2 6d 4 0 8 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 590a6 68 0 0 8 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 592af 44 6 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 592c5 2a 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 592f8 b1 11 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 592fe a7 b 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 592ff a5 a 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 59309 9a 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 593ae b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b852 20 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b877 1a 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30b14 3a 8 0 0 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f272 79 9 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f27a 6d 1 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f27b 6b 0 0 4 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 138fc 172 d 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 13905 165 4 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 13909 160 0 0 10 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34ffe 96 12 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35006 8a a 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 35010 7f 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 360dd 63 a 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 360e3 59 4 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 360e7 54 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 360f4 46 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 f2ee 40 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 176b 75 8 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17e5 24 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 593be 9b 40 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 593ed 68 11 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 593fe 53 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 929c f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e7ec 82 8 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10b1c 77 8 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e866 5d 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e88c 22 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35524 5d 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3554a 22 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3065d 96 8 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3214e 8e 8 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10ad9 3b 11 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10aea 26 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 350bf 166 15 0 4 0 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 350d0 14c 4 0 4 4 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 350d4 147 0 0 4 8 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5945e 121 2c 0 4 0 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5946f eb 1b 0 4 4 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5948a cf 0 0 4 8 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2d36f 46 8 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 59584 38 b 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5958f 29 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2e9c1 2e7 1d 0 c 0 188 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2e9d2 29a c 0 c 4 188 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2e9de 28d 0 0 c 8 188 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 595c1 278 15 0 c 0 180 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 595d2 25e 4 0 c 4 180 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 392 - ^ =\nSTACK WIN 4 595d6 259 0 0 c 8 180 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 392 - ^ =\nSTACK WIN 4 5961c 20f 0 0 c c 180 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 392 - ^ =\nSTACK WIN 4 5983e 1ee 13 0 8 0 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 59847 1d2 a 0 8 4 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 88 - ^ =\nSTACK WIN 4 59848 1d0 9 0 8 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 88 - ^ =\nSTACK WIN 4 59851 1c6 0 0 8 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 88 - ^ =\nSTACK WIN 4 a7d4 b7 8 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a810 67 0 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a811 61 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 59a31 e8 1b 0 4 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 59a42 ce a 0 4 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 59a4b c4 1 0 4 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 59a4c c2 0 0 4 c c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 13093 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 59b1e 4f a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 59b28 41 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 59b72 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 59b7c 1ea 11 0 0 0 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 59b8a 1c5 3 0 0 4 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ =\nSTACK WIN 4 59b8d 1c1 0 0 0 8 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ =\nSTACK WIN 4 59c2c fa 0 0 0 c 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ =\nSTACK WIN 4 59d78 2ab 17 0 4 8 244 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 59dd6 4 0 0 4 8 244 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 59f9f 14 0 0 4 8 244 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a0bd 61 8 0 4 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a0d4 46 0 0 4 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a123 4e 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a13c 31 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a14b 21 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a176 22 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a19d 46 6 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a1e8 44 8 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a231 59 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a28f 57 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a2eb 2b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a31b 31 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a351 70 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a357 66 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a358 64 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a3c6 62 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a3cc 58 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a3cd 56 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a42d 4e 9 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a436 35 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a480 e0 9 0 8 0 68 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a489 42 0 0 8 4 68 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a565 3f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a56d 33 4 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a571 2e 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a5a9 44 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a5af 3a 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a5be 1a 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 36f5b 460 9 0 4 0 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 36f64 e3 0 0 4 4 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ =\nSTACK WIN 4 36f9d 98 0 0 4 8 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ =\nSTACK WIN 4 36f9e 96 0 0 4 c 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ =\nSTACK WIN 4 323d2 146 a 0 8 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 323db 139 1 0 8 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 323dc 137 0 0 8 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a5f2 c22 1d 0 c 0 2c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5a60f bfc 0 0 c 4 2c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 716 - ^ =\nSTACK WIN 4 5a689 b7e 0 0 c 8 2c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 716 - ^ =\nSTACK WIN 4 5a690 b76 0 0 c c 2c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 716 - ^ =\nSTACK WIN 4 5b219 1d 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 217ac 20 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b23b 4b 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b243 3f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2af8f 2c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30cce 1c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 360a9 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 360c3 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30bbb 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b28b 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1006c 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34e97 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c3be 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 354ed 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30cfe 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32695 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b2ab 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f827 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f726 59 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f72c 4f 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f72d 4d 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f763 59 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f769 4f 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f76a 4d 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ee95 e2 7 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ee9b d8 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ee9c d6 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f88c 181 13 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f893 176 c 0 14 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 f897 171 8 0 14 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 f89f 168 0 0 14 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 f6da 63 b 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f6e5 54 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 f7a0 124 22 0 c 0 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f7b1 10a 11 0 c 4 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 f7b5 105 d 0 c 8 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 f7c2 f7 0 0 c c 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 1c858 6a 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c85b 66 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 331f9 23 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c8a6 35 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1c8ac 27 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1c8ad 25 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b2cb 85 1b 0 8 0 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b315 2f 0 0 8 4 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e361 460 b 0 4 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e36a 453 2 0 4 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 1e36b 451 1 0 4 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 1e36c 44f 0 0 4 c 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 1e6e1 119 d 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e6ed 109 1 0 4 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 1e6ee 107 0 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 1e708 8c 0 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 35889 29 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e891 362 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e8a8 100 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e8b6 f1 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f18a 112 10 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f193 105 7 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f19a fd 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b355 db 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b36b c1 0 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b36c bf 0 0 1c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3331f 98 a 0 0 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 33328 8d 1 0 0 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 33329 8b 0 0 0 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f460 3a2 12 0 28 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f46c 392 6 0 28 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 f46d 390 5 0 28 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 f472 38a 0 0 28 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 f928 18 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f851 47 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1c8db 3b1 28 0 14 0 84 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1c8fb 388 8 0 14 4 84 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 140 - ^ =\nSTACK WIN 4 1c8fc 386 7 0 14 8 84 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 140 - ^ =\nSTACK WIN 4 1c903 37e 0 0 14 c 84 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 140 - ^ =\nSTACK WIN 4 5b435 158 1f 0 4 0 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b446 44 e 0 4 4 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 548 - ^ =\nSTACK WIN 4 5b44a 3f a 0 4 8 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 548 - ^ =\nSTACK WIN 4 5b454 34 0 0 4 c 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 548 - ^ =\nSTACK WIN 4 1b42d 157 1f 0 8 0 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b43e 46 e 0 8 4 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 548 - ^ =\nSTACK WIN 4 1b442 41 a 0 8 8 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 548 - ^ =\nSTACK WIN 4 1b44c 36 0 0 8 c 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 548 - ^ =\nSTACK WIN 4 1cac2 217 1e 0 10 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1cad0 200 10 0 10 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ =\nSTACK WIN 4 1cad4 1fb c 0 10 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ =\nSTACK WIN 4 1cae0 1ee 0 0 10 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ =\nSTACK WIN 4 5b592 185 1f 0 8 0 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b5a3 5e e 0 8 4 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ =\nSTACK WIN 4 5b5a7 59 a 0 8 8 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ =\nSTACK WIN 4 5b5b1 4e 0 0 8 c 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ =\nSTACK WIN 4 2bb93 14d 1e 0 10 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2bba1 136 10 0 10 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 2bba5 131 c 0 10 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 2bbb1 124 0 0 10 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 32dd3 40 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32dd9 36 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e793 fa e 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e79c ed 5 0 4 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1e79d eb 4 0 4 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1e7a1 e6 0 0 4 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1e9c5 fa e 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e9ce ed 5 0 4 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1e9cf eb 4 0 4 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1e9d3 e6 0 0 4 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 5b71c 107 10 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b72b f4 1 0 10 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b72c f1 0 0 10 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2dc81 13a 16 0 8 0 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2dc92 120 5 0 8 4 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ =\nSTACK WIN 4 2dc96 11b 1 0 8 8 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ =\nSTACK WIN 4 2dc97 119 0 0 8 c 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ =\nSTACK WIN 4 2dc43 3de c 0 8 8 5c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3bde2 e 0 0 8 8 5c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 358ed 48 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 358f3 3e 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ea7d 155 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ea83 14b 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ecd2 12f 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ecd8 125 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ecea 112 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b828 24f b 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5b831 242 2 0 4 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 5b832 240 1 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 5b833 23e 0 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 1f021 325 e 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f02a 318 5 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1f02b 316 4 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1f02f 311 0 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1c7f4 af c 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1c7fa a5 6 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1c800 9e 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e291 166 c 0 4 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3c06f 15 0 0 4 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f331 225 26 0 20 0 cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f34c 201 b 0 20 4 cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 f34d 1ff a 0 20 8 cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 f357 1f4 0 0 20 c cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 32b56 f5 f 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32b5c eb 9 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 32b60 e6 5 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 32b65 e0 0 0 18 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 35d54 4b 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35f21 7d b 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35f27 73 5 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 35f28 71 4 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 35f2c 6c 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5ba7c 42 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f95d d2 d 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f963 c8 7 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 f969 c1 1 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 f96a bd 0 0 18 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1ee4c 4b 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1edbd 81 b 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1edc3 77 5 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1edc4 75 4 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1edc8 70 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5bac3 42 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32da7 1c 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5bb0a 1c 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5bb2b 164 37 0 14 0 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5bb62 124 0 0 14 4 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 292 - ^ =\nSTACK WIN 4 5bb76 10c 0 0 14 8 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 292 - ^ =\nSTACK WIN 4 5bb77 10a 0 0 14 c 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 292 - ^ =\nSTACK WIN 4 5bc95 185 2d 0 14 0 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5bcb5 15c d 0 14 4 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ =\nSTACK WIN 4 5bcc2 14e 0 0 14 8 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ =\nSTACK WIN 4 5bcef 11d 0 0 14 c 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ =\nSTACK WIN 4 5be23 13d 18 0 14 0 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5be3a 11d 1 0 14 4 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5be3b 11b 0 0 14 8 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5bf65 14f 18 0 14 0 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5bf7c 12f 1 0 14 4 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5bf7d 12d 0 0 14 8 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21495 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c0b9 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c0d7 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c0f5 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 213f8 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 332b1 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c110 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c12e 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 36434 83 2f 0 10 0 108 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32730 ce 2f 0 10 0 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3277e 67 0 0 10 4 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 364a9 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f89a 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21f1e 2b9 39 0 c 0 f4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21f3c 292 1b 0 c 4 f4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 252 - ^ =\nSTACK WIN 4 21f50 27d 7 0 c 8 f4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 252 - ^ =\nSTACK WIN 4 21f57 275 0 0 c c f4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 252 - ^ =\nSTACK WIN 4 5c149 100 c 0 8 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c223 1e 0 0 8 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c269 57 d 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c26f 4d 7 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5c275 46 1 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5c276 44 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 21d8d 5b9 f 0 c 8 98 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3c77a 2c 0 0 c 8 98 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c2c5 a2 11 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c2ce 95 8 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 5c2cf 93 7 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 5c2d6 8b 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 5c36c fb d 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c379 ea 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c3ce 93 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31385 8e 9 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3138e 81 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 126f2 30 6 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 126f8 26 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a71d 74 8 0 14 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 315c4 67 6 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 315ca 5d 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ac4d 37 6 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ac0f 3e 7 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ac16 33 0 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ef3a 1bb c 0 8 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f049 e 0 0 8 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 edd7 db c 0 4 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3c85e e 0 0 4 8 34 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c46c 3a 9 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c475 2d 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34bef ec 9 0 c 0 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34bf8 df 0 0 c 4 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34c1f ac 0 0 c 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32113 3a 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32119 30 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3162f 107 15 0 20 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31638 fa c 0 20 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 31639 f8 b 0 20 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 31644 ec 0 0 20 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 ee81 6d 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ee87 63 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ee88 5f 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34eb1 10a 12 0 8 0 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34ec2 f0 1 0 8 4 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 624 - ^ =\nSTACK WIN 4 34ec3 ee 0 0 8 8 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 624 - ^ =\nSTACK WIN 4 34eea c0 0 0 8 c 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 624 - ^ =\nSTACK WIN 4 ea7d 4d7 1d 0 18 0 2cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ea92 4b9 8 0 18 4 2cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 724 - ^ =\nSTACK WIN 4 ea99 4b1 1 0 18 8 2cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 724 - ^ =\nSTACK WIN 4 ea9a 4af 0 0 18 c 2cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 724 - ^ =\nSTACK WIN 4 5c4ab 62 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c4b3 56 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 137d9 139 18 0 8 0 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 137ea 11f 7 0 8 4 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 137f1 117 0 0 8 8 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 eee1 1a 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c512 137 1c 0 18 0 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c523 11d b 0 18 4 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 624 - ^ =\nSTACK WIN 4 5c524 11b a 0 18 8 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 624 - ^ =\nSTACK WIN 4 5c52e 110 0 0 18 c 268 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 624 - ^ =\nSTACK WIN 4 180e 1cd c 0 14 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 18ef e 0 0 14 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1921 4 0 0 14 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10d87 140 c 0 14 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3cac5 4 0 0 14 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32044 98 9 0 4 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3204d 8b 0 0 4 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3207f 4f 0 0 4 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10b8e 122 8 0 10 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10bae ef 0 0 10 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10baf ed 0 0 10 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21057 e3 9 0 14 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21060 d6 0 0 14 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10c6d 11d 22 0 8 0 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10c7e 103 11 0 8 4 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 200 - ^ =\nSTACK WIN 4 10c8f f1 0 0 8 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 200 - ^ =\nSTACK WIN 4 10c99 d6 0 0 8 c c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 200 - ^ =\nSTACK WIN 4 31c45 7c 8 0 10 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31cb8 88 8 0 10 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31cd2 10 0 0 10 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12641 6d 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32361 8a 8 0 14 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3237e 5f 0 0 14 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f569 aa 8 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f5ad 41 0 0 18 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 322fb 6f 8 0 14 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10a09 40 8 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c64e 96 c 0 c 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c6de b 0 0 c 8 34 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2bd84 33 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2bd8a 29 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2bcfb 9b 13 0 14 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2bd0d 85 1 0 14 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 2bd0e 83 0 0 14 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 5c701 9b 13 0 14 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c713 85 1 0 14 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 5c714 83 0 0 14 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 300da 29 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2de51 9c c 0 14 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2dda5 99 c 0 14 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c7a1 51 7 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c7f7 c8 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c82d 8d 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c82e 8b 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c8c4 20 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10e51 de 9 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10e5a d1 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 322bc 67 12 0 14 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 322ce 51 0 0 14 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10a77 3d 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 bada c8 9 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 bae3 bb 0 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 bb47 3c 0 0 c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b896 86 7 0 18 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35971 44 8 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b974 50 d 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b97a 46 7 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b981 3e 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 938e 153 d 0 18 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 939a 143 1 0 18 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 939b 141 0 0 18 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 9402 1d 0 0 18 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 bb76 6f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 bb82 5f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b905 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 945c 73 8 0 18 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9464 67 0 0 18 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 110f5 f3 e 0 c 0 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 11102 e2 1 0 c 4 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 11103 e0 0 0 c 8 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31f31 25a 9 0 4 0 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31f3a 11e 0 0 4 4 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ =\nSTACK WIN 4 31f73 d3 0 0 4 8 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ =\nSTACK WIN 4 31f7a cb 0 0 4 c 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ =\nSTACK WIN 4 5c8e9 61 11 0 34 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5c8ef 57 b 0 34 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5c8f3 52 7 0 34 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5c8fa 4a 0 0 34 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5c94f 258 17 0 10 8 1b8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5cbad 1 0 0 10 8 1b8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5cbc1 2a4 22 0 10 0 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5cbd2 28a 11 0 10 4 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 200 - ^ =\nSTACK WIN 4 5cbd6 285 d 0 10 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 200 - ^ =\nSTACK WIN 4 5cbe3 277 0 0 10 c c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 200 - ^ =\nSTACK WIN 4 5cf6b 163 c 0 20 8 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d0d4 1 0 0 20 8 40 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d0e9 267 f 0 c 8 d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d2ff 39 0 0 c 8 d8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d371 123 11 0 8 0 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d382 109 0 0 8 4 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d3bb cb 0 0 8 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 314d5 151 9 0 8 0 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 314de d0 0 0 8 4 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 108 - ^ =\nSTACK WIN 4 31513 89 0 0 8 8 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 108 - ^ =\nSTACK WIN 4 3151a 81 0 0 8 c 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 108 - ^ =\nSTACK WIN 4 b74c ba 9 0 4 0 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b755 ad 0 0 4 4 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b77c 79 0 0 4 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 137b1 23 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31eab 1d 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f72e 537 f 0 14 8 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f951 3c 0 0 14 8 ac 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d499 25 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12782 20 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1153c 22 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35eae 72 8 0 14 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35ee1 2d 0 0 14 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35ee2 2b 0 0 14 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21261 1a 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3565b 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35e8f 1a 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d4c3 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21950 36 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d4e3 33 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10978 109 c 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3d377 4 0 0 8 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d539 44d f 0 20 8 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d93e 4d 0 0 20 8 b0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 284bd 53 8 0 14 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 284c5 33 0 0 14 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d9a1 3a 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d9a7 30 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d9b9 14 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2879d 55 d 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 287aa 44 0 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5d9e0 4b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5da30 85 17 0 0 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5da4a 5c 0 0 0 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10760 424 8 0 1c 0 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10788 3c2 0 0 1c 4 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1078c 3bd 0 0 1c 8 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3719a 9f 10 0 20 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 371a5 7a 5 0 20 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 371a6 78 4 0 20 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 371aa 73 0 0 20 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 5dadd 73 8 0 8 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5db0a 42 0 0 8 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5db13 23 0 0 8 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5db55 bc a 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5db5d b0 2 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 5db5e ae 1 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 5db5f ac 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 5dc16 23e c 0 24 8 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5de3f 1a 0 0 24 8 60 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5de71 198 c 0 1c 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e00f 1 0 0 1c 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 285c6 2c4 c 0 38 8 8c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3d7a4 10 0 0 38 8 8c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1a24 34 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21982 446 17 0 c 8 114 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3d9cf 10 0 0 c 8 114 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e021 292 9 0 28 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e02a 266 0 0 28 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e089 1f5 0 0 28 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 27bdb 1c8d 17 0 38 8 6bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3e895 11 0 0 38 8 6bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3eadf ab 0 0 38 8 6bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 36c3c f7e 17 0 18 8 3fc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3f743 134 0 0 18 8 3fc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 27613 d49 17 0 24 8 3c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3ffbd 3e 0 0 24 8 3c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 27b32 6d c 0 18 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 27b99 1d 0 0 18 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2005f 89 c 0 18 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 200d1 1d 0 0 18 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e307 b8 a 0 18 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e310 ab 1 0 18 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 5e311 a9 0 0 18 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 5e34f 5f 0 0 18 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 286ee 57 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 286f6 4b 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f873 22 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e3c4 54 8 0 18 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e3cc 48 0 0 18 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e41d 8a 1a 0 10 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e433 6b 4 0 10 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 5e437 66 0 0 10 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 5e446 25 0 0 10 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 5e4ac 83 1a 0 10 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e4c2 64 4 0 10 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 5e4c6 5f 0 0 10 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 5e4d5 25 0 0 10 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 5e534 8e 10 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e53d 81 7 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e544 79 0 0 10 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e5c7 8e 10 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e5d0 81 7 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e5d7 79 0 0 10 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e65a 11 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 fd2d 17d c 0 8 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40019 e 0 0 8 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 123b9 319 c 0 c 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 401f7 e 0 0 c 8 34 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ff19 d2 c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40258 e 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34cb9 8b c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 4029c e 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 fe82 b1 c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 402de e 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34da1 f6 c 0 4 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40327 e 0 0 4 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 36772 e9 c 0 4 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 403bd e 0 0 4 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 fc2f 11b c 0 4 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40414 e 0 0 4 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 4043c e 0 0 4 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e670 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5e686 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e6a0 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e6ba b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e6ca b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 310f2 1c6 e 0 4 0 18c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 310fe 1b6 2 0 4 4 18c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 404 - ^ =\nSTACK WIN 4 310ff 1b4 1 0 4 8 18c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 404 - ^ =\nSTACK WIN 4 31100 1b2 0 0 4 c 18c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 404 - ^ =\nSTACK WIN 4 9a72 7d c 0 14 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 404b7 e 0 0 14 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9b02 82 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9b18 5e 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9b1f 56 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1a5d 6e d 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1a63 64 7 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1a6a 5c 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b9a0 32 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2b13f 33 9 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2b148 26 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e6da 33 9 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e6e3 26 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 355bc 2b 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 355c2 21 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e712 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e740 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e76e 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e79c 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f992 16f c 0 4 0 184 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f99e 15f 0 0 4 4 184 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f9ac 141 0 0 4 8 184 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e7ca 34 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e803 28 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9a51 1c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9ae4 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ad0 1c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b9d1 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2e18c aa 7 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2e193 9f 0 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2bdb5 8b 6 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1d07e 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 365f6 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 3594f 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 17443 11 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 934b d6 e 0 0 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9359 c6 0 0 0 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 177c7 96 0 0 0 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b5c3 409 19 0 c 0 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b5d7 3ec 5 0 c 4 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1064 - ^ =\nSTACK WIN 4 b5d8 3ea 4 0 c 8 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1064 - ^ =\nSTACK WIN 4 b5dc 3e5 0 0 c c 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1064 - ^ =\nSTACK WIN 4 5e830 4d 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e836 43 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 365a5 2e 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 353ce 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 38ae7 3d 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34e64 18 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35406 36 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30d74 8b b 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30d7a 81 5 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 30d7e 7c 1 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 30d7f 7a 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 baa1 6c a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 baa7 62 4 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 baab 5d 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 be01 3e c 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 407a9 4 0 0 8 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10111 65 c 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 407c5 4 0 0 c 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34d41 5a c 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 407e1 4 0 0 8 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 bdb6 3e c 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 407fd 4 0 0 4 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b9ef 6c c 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40817 4 0 0 c 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10f32 39 c 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40833 4 0 0 8 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9a09 3b c 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 4084f 4 0 0 4 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 325bc f6 c 0 4 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40892 e 0 0 4 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e882 11 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 12bb6 69 1d 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12bd3 48 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10ef8 22 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e898 2c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e8c9 c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e8da c 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e8eb 57 9 0 c 0 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e8f4 4a 0 0 c 4 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e947 6f 6 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e94d 65 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e976 b 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e9bb 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 abc1 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5e9db c 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3611e c 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5e9ec 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ea06 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ea20 100 9 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ea29 f3 0 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ea9d 74 0 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39469 2b 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5eb25 2e 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5eb58 97 8 0 14 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5eba8 43 0 0 14 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2cdd8 5b 8 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ccdc 122 8 0 10 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2cd12 dd 0 0 10 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2cd13 db 0 0 10 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2cc8b 66 8 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2cc93 5a 0 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34932 a4 f 0 c 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3493b 97 6 0 c 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 34941 90 0 0 c 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 34976 5d 0 0 c c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 5ebf4 55 a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ebfd 48 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ebfe 46 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ec4e 1e 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34b69 1a 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ec71 3a 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 349d8 29d c 0 20 8 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40a26 16 0 0 20 8 64 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f7a0 191 c 0 1c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f7ac 181 0 0 1c 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 2f7b9 12c 0 0 1c 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 2f7ca 118 0 0 1c c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 34b8f 25 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 abde 58 d 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 abe4 4e 7 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 abeb 46 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 c170 29 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 11296 24 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1129c 1a 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ecb0 91 8 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ecfc 41 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ed46 8c 8 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ed8d 41 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5edd7 6a 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5eddd 60 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5edde 5e 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5ee15 1d 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 e477 a3 c 0 4 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40b63 e 0 0 4 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1fcff 64 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e4b9 26a 17 0 10 8 46c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40c62 17 0 0 10 8 46c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 111da 31 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ae65 4a c 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ae6b 21 6 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ae71 1a 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1fb26 52 14 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ee46 98 16 0 10 0 120 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9f81 31 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5eee3 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5eef0 3b 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 14c3c 1d2 1f 0 c 0 238 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 14c50 1b5 b 0 c 4 238 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 576 - ^ =\nSTACK WIN 4 14c5a 1aa 1 0 c 8 238 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 576 - ^ =\nSTACK WIN 4 14c5b 1a8 0 0 c c 238 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 576 - ^ =\nSTACK WIN 4 1af1 1fe c 0 c 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1c8c e 0 0 c 8 44 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ef47 9a e 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ef53 8a 2 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 5ef54 88 1 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 5ef55 86 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 b3d5 146 c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40cf3 e 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40d2a e 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b4cf cc 9 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b4d8 bf 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b503 86 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e43d 34 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5efe6 51 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5efec 47 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1fcc1 39 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1fcc7 2f 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ada0 76 9 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ada8 6a 1 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 ada9 68 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 12ade 106 1a 0 4 0 130 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12aef 27 9 0 4 4 130 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12af8 1d 0 0 4 8 130 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 be89 b2 c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40d78 e 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35f78 b6 c 0 10 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40da4 e 0 0 10 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9fb5 5f c 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40dd0 e 0 0 8 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 bc69 5f c 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40e00 e 0 0 8 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f03c 1ce c 0 c 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f1bf e 0 0 c 8 50 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f229 203 c 0 10 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f3e0 e 0 0 10 8 54 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2e000 136 c 0 14 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40e66 e 0 0 14 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ac88 b6 c 0 10 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40e92 e 0 0 10 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f449 1cb c 0 c 8 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f5c9 e 0 0 c 8 4c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f631 130 c 0 14 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f72a e 0 0 14 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ae4b 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1d4f 23 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b6a1 31 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1d77 9a b 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1d81 8c 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1d82 8a 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1dcf 3c 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 3145b 88 d 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31463 7c 5 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 31464 7a 4 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 31468 75 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 1269f 52 8 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 126a7 46 0 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f781 db c 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f78d cb 0 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f7e8 64 0 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 313ec d5 e 0 10 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 313fa c3 0 0 10 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31439 78 0 0 10 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f88a 80 8 0 14 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f90f 13f c 0 18 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5f9fa 4 0 0 18 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5fa2d 1e 0 0 18 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 312e5 119 c 0 1c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40faa 4 0 0 1c 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 40fe6 4 0 0 1c 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c664 30b 8 0 8 0 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c686 2db 0 0 8 4 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c6b1 2ad 0 0 8 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f0d4 295 12 0 20 0 5c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f0e0 285 6 0 20 4 5c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 100 - ^ =\nSTACK WIN 4 2f0e5 27f 1 0 20 8 5c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 100 - ^ =\nSTACK WIN 4 2f0e6 27d 0 0 20 c 5c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 100 - ^ =\nSTACK WIN 4 5fa85 f5 11 0 1c 0 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5fa8e e8 8 0 1c 4 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 72 - ^ =\nSTACK WIN 4 5fa8f e6 7 0 1c 8 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 72 - ^ =\nSTACK WIN 4 5fa96 de 0 0 1c c 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 72 - ^ =\nSTACK WIN 4 5fb7f a1 c 0 1c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5fc02 9 0 0 1c 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5fc39 36 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5fc51 1a 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5fc74 72 8 0 20 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5fc7c 66 0 0 20 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5fceb de b 0 1c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5fcf4 d1 2 0 1c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 5fcf5 cf 1 0 1c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 5fcf6 cd 0 0 1c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 5fdce 6e 8 0 1c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5fdd6 62 0 0 1c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5fe41 46 8 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5fe8c 88 b 0 8 0 8c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5fed6 2f 0 0 8 4 8c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ff19 60 b 0 8 0 8c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ff7e 41 9 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ff87 25 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ffc4 41 9 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 5ffcd 25 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6000a 60 b 0 8 0 8c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6006f 5e 9 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6007b 4e 0 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6008a 3d 0 0 4 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 600d2 2f8 c 0 10 0 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 600db 2eb 3 0 10 4 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 600de 2e7 0 0 10 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 6013a 28a 0 0 10 c 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 f182 110 1b 0 8 0 654 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f193 f6 a 0 8 4 654 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f19d eb 0 0 8 8 654 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31db9 55 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31ddd 2a 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ad29 4d 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ad46 2a 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ad7b 24 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b2d0 3aa 18 0 4 0 480 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b2e1 37f 7 0 4 4 480 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1160 - ^ =\nSTACK WIN 4 b2e7 378 1 0 4 8 480 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1160 - ^ =\nSTACK WIN 4 b2e8 376 0 0 4 c 480 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1160 - ^ =\nSTACK WIN 4 112d5 1d5 c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 11419 21 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 359b7 29d 26 0 10 0 ec 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 359cf 27c e 0 10 4 ec 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 244 - ^ =\nSTACK WIN 4 359dc 26e 1 0 10 8 ec 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 244 - ^ =\nSTACK WIN 4 359dd 26c 0 0 10 c ec 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 244 - ^ =\nSTACK WIN 4 301af 196 c 0 14 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 301bb 186 0 0 14 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 301e5 152 0 0 14 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 12803 1c9 c 0 10 0 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1280f 1b9 0 0 10 4 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ =\nSTACK WIN 4 12839 185 0 0 10 8 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ =\nSTACK WIN 4 1283d 180 0 0 10 c 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 84 - ^ =\nSTACK WIN 4 f9e5 37d c 0 20 8 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 4171b 4 0 0 20 8 6c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 41748 48 0 0 20 8 6c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c2d3 8f e 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c2dc 7a 5 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 2c2dd 78 4 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 2c2e1 73 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 603cf bc 1c 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 603e3 91 8 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 603ea 89 1 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 603eb 87 0 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 60499 35e 17 0 8 8 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 607cb 30 0 0 8 8 274 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60811 e9 1c 0 14 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60822 cf b 0 14 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 60826 ca 7 0 14 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 6082d c2 0 0 14 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 14eea 6e 8 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 212f1 6e 8 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21363 24 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 214e3 2b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 217ea 213 a 0 18 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 217f3 206 1 0 18 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 217f4 204 0 0 18 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30789 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 608ff e9 9 0 10 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60908 dc 0 0 10 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 302ed 36 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3039b 33 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21ba5 1d5 c 0 20 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 418d1 3f 0 0 20 8 54 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 609ed 5f 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60a02 46 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60a51 55 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35dca 172 11 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35dd6 162 5 0 8 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 35ddb 15c 0 0 8 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 35e0c 11d 0 0 8 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 a427 40 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fa46 42 8 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fa4e 36 0 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e0c7 19e 31 0 10 0 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e0df 17d 19 0 10 4 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 336 - ^ =\nSTACK WIN 4 1e0e9 172 f 0 10 8 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 336 - ^ =\nSTACK WIN 4 1e0f8 162 0 0 10 c 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 336 - ^ =\nSTACK WIN 4 35340 bd f 0 4 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3534e a6 1 0 4 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 3534f a4 0 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 35370 e 0 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 60aab 44 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 392b5 27 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60af4 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60b1c 3f 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60b60 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 60b6f 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60b97 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60bbf f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 2f3a4 86 8 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f3aa 7c 2 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2f3ab 7a 1 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2f3ac 78 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1a1cf 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1500c 90 e 0 0 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1501a 7b 0 0 0 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ac85 28 0 0 0 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1930f 29e 1a 0 1c 0 248 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 19376 228 0 0 1c 4 248 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 19377 226 0 0 1c 8 248 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 16f8e 11 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2dfa0 41 6 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60bd3 95 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60bd9 8b 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60bda 87 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 309e1 5f 12 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 309f3 3a 0 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1cd34 82 17 0 4 8 e0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 41b32 7 0 0 4 8 e0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e16 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ae17 4a 9 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ae20 3d 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e50 97 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1eee 2bc c 0 4 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21af 7 0 0 4 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12f1d 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 16f83 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1df77 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12f08 10 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1cf5b b6 9 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1cf64 ab 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 14af2 1d1 9 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 14afb 1c4 0 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 14b23 192 0 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 14b42 177 0 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 33478 b4 10 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 33481 a7 7 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 33488 9f 0 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f0f4 a5 11 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f105 90 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 f132 59 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 101be 59 9 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 101c7 4c 0 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 329d9 159 15 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 329e2 14c c 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 329e3 14a b 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 329ee 13e 0 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 305f6 6d 9 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 305ff 48 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9920 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 60c75 30 8 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21cc 3c 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 220f 10c 16 0 14 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 221a fd b 0 14 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 221e f8 7 0 14 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 2225 f0 0 0 14 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 60caa 49 8 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60cf8 49 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60d00 3d 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60d46 e 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ae2a 1c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60d58 aa 9 0 10 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60d61 9d 0 0 10 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60dbf 29 0 0 10 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60e13 61 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9e01 6f c 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 41c56 4 0 0 8 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3593f b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9e79 73 c 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 41c70 4 0 0 8 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 bf9d b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 bccf 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32259 57 c 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 41c8a 4 0 0 8 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a5dc 5d c 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 41ca4 4 0 0 8 8 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c8ed 62 13 0 8 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60e79 6a 15 0 8 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60e8a 50 4 0 8 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60e8e 4b 0 0 8 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60ee8 35 6 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60f22 141 19 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 60f36 129 5 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 60f37 127 4 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 60f3b 122 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 352d9 68 8 0 14 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21765 48 8 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61068 43 9 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61071 36 0 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 303d0 72 f 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 303de 60 1 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 303df 5c 0 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 303e9 30 0 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 12c23 13f c 0 4 8 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 41dcc 10 0 0 4 8 60 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 610b0 2b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 610e0 36 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6111b 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61155 2c 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61186 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 611c0 45 8 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6120a 12b 9 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61212 11f 1 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61213 11d 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 15199 40 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1519f 36 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 194dd 314 b 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 194e6 307 2 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 194e7 305 1 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 194e8 303 0 0 4 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 19805 8b9 26 0 18 0 1d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1981c 899 f 0 18 4 1d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 480 - ^ =\nSTACK WIN 4 1981d 897 e 0 18 8 1d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 480 - ^ =\nSTACK WIN 4 1982b 888 0 0 18 c 1d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 480 - ^ =\nSTACK WIN 4 19513 218e 17 0 30 8 a18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 43025 4 0 0 30 8 a18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1e017 2eb 0 0 30 8 a18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2332 30 5 0 28 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12cb0 e7 a 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12cb6 dd 4 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12cba d8 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12d56 44 9 0 4 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12d5f 37 0 0 4 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 37945 44 9 0 4 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3794e 37 0 0 4 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c338 91 c 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c341 84 3 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2c344 80 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2c373 33 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 61351 17 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ddd6 33f f 0 30 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 43374 14 0 0 30 8 a8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 434b2 17 0 0 30 8 a8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 434e5 60 0 0 30 8 a8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2367 30 5 0 28 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6136d ec b 0 8 0 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61376 df 2 0 8 4 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ =\nSTACK WIN 4 61377 dd 1 0 8 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ =\nSTACK WIN 4 61378 db 0 0 8 c 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ =\nSTACK WIN 4 6147e 2fa f 0 8 8 b4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61723 e 0 0 8 8 b4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3965a 77 c 0 4 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39666 67 0 0 4 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 395d8 57 c 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 395e4 47 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c1e7 127 c 0 c 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 435d2 e 0 0 c 8 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12f89 ac 9 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12f92 9f 0 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 12fa9 7d 0 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 12faa 7b 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 132ee 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 61799 148 c 0 c 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 617fd e 0 0 c 8 34 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 92ea 6d c 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 92f0 63 6 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 92f6 5c 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2470 32 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 16fb4 4f c 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 436ca 11 0 0 4 8 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61901 2d 6 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e0df 33 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e0e5 29 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 176db 28 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61933 24 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6195c 24 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30445 1c1 e 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30450 1b2 3 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 30453 1ae 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 3047d 17d 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 3053e 73 10 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30544 69 a 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 30545 67 9 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 3054e 5d 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 e275 3c7 c 0 c 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 437f5 10 0 0 c 8 54 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 438be 4a 0 0 c 8 54 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 df9e f2 13 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 dfac db 5 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 dfb0 d6 1 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 dfb1 d4 0 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 31d8e f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e074 67 8 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e07c 5b 0 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 114f8 5c 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1a2ce 6aa 17 0 34 8 2d0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1a834 36 0 0 34 8 2d0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9ef1 1d 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b829 28 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b82f 1e 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 13140 b3 9 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 13149 a6 0 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c05e 25 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10086 a7 f 0 10 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1008f 9a 6 0 10 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10095 93 0 0 10 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2e30f b3 9 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2e318 a6 0 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 bfad 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e8b7 a4 f 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e8c0 97 6 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e8c6 90 0 0 c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e995 b3 9 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e99e a6 0 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 24a7 25 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2540 e6 c 0 c 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2610 b 0 0 c 8 44 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 36696 e9 c 0 10 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 36759 b 0 0 10 8 44 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 952a 188 c 0 14 8 74 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 951a b 0 0 14 8 74 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 239c 98 c 0 8 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2432 b 0 0 8 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fb52 72 8 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61985 72 8 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 619fc 6b c 0 c 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61a61 b 0 0 c 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 95f9 93 f 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9600 88 8 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 9604 83 4 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 9608 7e 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 2cc09 25 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a6a9 ae b 0 10 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a6b2 a1 2 0 10 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 a6b3 9f 1 0 10 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 a6b4 9d 0 0 10 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 1320c 6f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 13218 5f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12e1d 6d 8 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12e25 61 0 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ca47 6f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ca53 5f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e93f 6a 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 e947 5e 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ea1b 6f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ea27 5f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a05d 1c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2442 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61a81 6a 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61a89 5e 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61af0 6f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61afc 5f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 308ad 6d 8 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 308b5 61 0 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 33609 19f 16 0 1c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 33614 190 b 0 1c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 33615 18e a 0 1c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 3361f 183 0 0 1c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 61b64 39 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61b6a 2f 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1746c 23 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 17499 ef 15 0 0 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 174a6 e0 8 0 0 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 174a7 de 7 0 0 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 174ae d6 0 0 0 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 f1fa 76 18 0 0 0 4c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17459 10e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 43ee5 e5 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1efce 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 61ba2 162 11 0 4 0 d4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61bb3 148 0 0 4 4 d4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 220 - ^ =\nSTACK WIN 4 61bec 107 0 0 4 8 d4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 220 - ^ =\nSTACK WIN 4 61bed 103 0 0 4 c d4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 220 - ^ =\nSTACK WIN 4 61d3f 2b9 1f 0 c 0 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 61d53 29c b 0 c 4 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 628 - ^ =\nSTACK WIN 4 61d5e 290 0 0 c 8 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 628 - ^ =\nSTACK WIN 4 61dee 1c7 0 0 c c 26c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 628 - ^ =\nSTACK WIN 4 61ffd 408 1a 0 c 0 280 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62017 3e5 0 0 c 4 280 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 620a4 353 0 0 c 8 280 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6240a 64 9 0 8 0 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62413 3d 0 0 8 4 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62473 42 8 0 4 0 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 624ba 2be 27 0 c 0 22c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 624d1 29e 10 0 c 4 22c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 564 - ^ =\nSTACK WIN 4 624d4 29a d 0 c 8 22c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 564 - ^ =\nSTACK WIN 4 624e1 28c 0 0 c c 22c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 564 - ^ =\nSTACK WIN 4 17f41 141 13 0 8 0 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17f52 127 2 0 8 4 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 17f53 125 1 0 8 8 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 17f54 123 0 0 8 c 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 6277d 59 b 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62788 4a 0 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 627db 19f b 0 1c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 627e4 192 2 0 1c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 627e5 190 1 0 1c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 627e6 18e 0 0 1c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 6297f 59 b 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6298a 4a 0 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ebb1 4ac 21 0 4 0 2c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ebc2 492 10 0 4 4 2c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 720 - ^ =\nSTACK WIN 4 1ebc3 490 f 0 4 8 2c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 720 - ^ =\nSTACK WIN 4 1ebd2 480 0 0 4 c 2c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 720 - ^ =\nSTACK WIN 4 629dd 4e 9 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 629e6 41 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 629f4 30 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 629f5 2e 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 12980 8e c 0 c 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 129f9 b 0 0 c 8 34 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fc00 5f 12 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fc12 3a 0 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 c108 4b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a793 44 8 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62a30 36 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62a6b 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 c058 9f c 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 44733 c 0 0 4 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ce03 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21435 38 8 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9728 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 3970d 26 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62aa5 26 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39732 28 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 328f7 28 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12a09 58 16 0 10 0 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12a1f 3e 0 0 10 4 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12a4b 6 0 0 10 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62ad0 7a 9 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62ad9 6d 0 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62af6 4b 0 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 4479d a2 15 0 4 0 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 447ae 88 4 0 4 4 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 447b2 81 0 0 4 8 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62b4f a8 c 0 4 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62be6 4 0 0 4 8 54 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62c19 7e e 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62c25 69 2 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 62c26 67 1 0 4 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 62c27 65 0 0 4 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 12d9f 10b c 0 0 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 448d9 a 0 0 0 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9740 4f 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9bc5 a7 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9bcb 9d 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9bcc 9b 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 136d7 cc c 0 4 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 13771 7 0 0 4 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62c9c 68 8 0 14 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62d09 3a 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fa7a 53 9 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fa83 46 0 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c0e6 6f c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c151 14 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c082 71 c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c08e 1e 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62d48 2f 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62d4e 25 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ffcf b8 8 0 14 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ffe2 97 0 0 14 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fe84 73 7 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fe8b 68 0 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ff16 6f 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fed7 40 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 32992 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 211cd 86 7 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 211d3 6d 1 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 211d4 6b 0 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2b086 82 7 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2b08d 68 0 0 14 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2bff8 39 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30062 42 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30a62 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c02c 28 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2cba2 8e a 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2cbaa 6e 2 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 2cbab 6c 1 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 2cbac 6a 0 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 2bfd6 23 6 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2117d 56 9 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21186 49 0 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12723 43 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 21130 4d 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62d7c 42 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2b26e 57 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62dc3 28 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62df0 3f 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62e34 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10637 22 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 c1e0 e 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 62e62 97d 17 0 4 8 684 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63421 4 0 0 4 8 684 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6362b 4 0 0 4 8 684 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 636d3 4 0 0 4 8 684 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ffaf 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63999 a9 b 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 639a2 9c 2 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 639a3 9a 1 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 639a4 98 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 63a47 92 a 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63a50 85 1 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63a51 83 0 0 8 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63ade 115 c 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63ae5 10a 5 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 63ae6 108 4 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 63aea 103 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 63bf8 127 d 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63bfe 11d 7 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 63bff 11b 6 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 63c05 114 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 63d24 3b 6 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63d2a 31 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63d3d 1d 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63d64 b4 b 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63d6d a7 2 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 63d6e a5 1 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 63d6f a3 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 63e1d cd 11 0 8 0 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63e2e b3 0 0 8 4 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63eef 9c a 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63ef8 8f 1 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63ef9 8d 0 0 8 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63f90 cd 11 0 8 0 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 63fa1 b3 0 0 8 4 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64062 af b 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6406b a2 2 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 6406c a0 1 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 6406d 9e 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 64116 94 a 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6411f 87 1 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64120 85 0 0 8 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 641af b4 b 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 641b8 a7 2 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 641b9 a5 1 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 641ba a3 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 64268 df 15 0 8 0 42c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64279 c5 4 0 8 4 42c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6427d c0 0 0 8 8 42c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6434c 9c a 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64355 8f 1 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64356 8d 0 0 8 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 643ed d6 15 0 8 0 42c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 643fe bc 4 0 8 4 42c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64402 b7 0 0 8 8 42c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 644c8 195 c 0 14 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6452a e 0 0 14 8 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64679 19e e 0 18 0 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64685 18e 2 0 18 4 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ =\nSTACK WIN 4 64686 18c 1 0 18 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ =\nSTACK WIN 4 64687 18a 0 0 18 c 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ =\nSTACK WIN 4 6481c 37 8 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64858 2c5 9 0 18 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64861 2b8 0 0 18 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6489e 24c 0 0 18 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64b47 83 9 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64b50 76 0 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64bcf a8 20 0 8 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64be7 87 8 0 8 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 64beb 82 4 0 8 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 64bef 7d 0 0 8 c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 64c7c 112 17 0 8 0 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64c93 f2 0 0 8 4 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64cf5 8c 0 0 8 8 11c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64d93 6b d 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64da0 5a 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64dc2 37 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64e03 22 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64e2a 156 11 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64e38 13f 3 0 4 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64e3b 13b 0 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64f85 c9 7 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 64f8b bf 1 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 64f8c bd 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 64fba 8e 0 0 14 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 65053 bc 11 0 c 0 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65064 a2 0 0 c 4 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 276 - ^ =\nSTACK WIN 4 6508f 73 0 0 c 8 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 276 - ^ =\nSTACK WIN 4 65090 71 0 0 c c 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 276 - ^ =\nSTACK WIN 4 65114 92 17 0 c 0 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6512b 72 0 0 c 4 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 651ab 86 b 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 651b6 77 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 651f5 32 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65236 209 13 0 c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65248 1f3 1 0 c 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 65249 1f1 0 0 c 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 652a3 9b 0 0 c c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 65444 72 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6544a 68 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6547f 32 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 654bb 72 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 654c1 68 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 654f6 32 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65532 45 10 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6553b 38 7 0 18 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65542 2e 0 0 18 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6557c 146 a 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65585 139 1 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 65586 137 0 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 655ad 10f 0 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 656c7 c2 d 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 656d3 b2 1 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 656d4 b0 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6578e f7 11 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65799 c4 6 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 6579e be 1 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 6579f bc 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 6588a 84 9 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65892 78 1 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 65893 76 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 658aa 5e 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 65913 84 9 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6591b 78 1 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 6591c 76 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 65933 5e 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 6599c b3 15 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 659a5 a6 c 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 659b0 9a 1 0 8 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 659b1 98 0 0 8 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 65a54 2a9 d 0 8 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65a5d 29c 4 0 8 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65a61 297 0 0 8 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 22128 9e a 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 22131 91 1 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 22132 8f 0 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65d02 85 9 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65d0a 79 1 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 65d0b 77 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 65d22 5f 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 65d8c 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65da4 9a 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65dac 8e 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65dc4 74 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65e43 303 b 0 8 0 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 65e4c 2ec 2 0 8 4 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ =\nSTACK WIN 4 65e4d 2ea 1 0 8 8 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ =\nSTACK WIN 4 65e4e 2e8 0 0 8 c 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ =\nSTACK WIN 4 6614b a6 f 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66159 94 1 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 6615a 92 0 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 6618c 5f 0 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 661f6 85 9 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 661fe 79 1 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 661ff 77 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 66216 5f 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 66280 d4 10 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6628b c5 5 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66290 bf 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66359 6a 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6636c 53 0 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66370 4e 0 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 663c8 2ec f 0 8 8 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6665c 1c 0 0 8 8 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66682 b 0 0 8 8 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6677d ba c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66801 3b 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66871 bc c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66918 1a 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66949 ba c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 669cd 3b 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66a41 bc c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66ae8 1a 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66b19 ba c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66b9d 3b 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66c11 c3 c 0 c 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66cbf 1a 0 0 c 8 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66cf1 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66d09 19d b 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66d12 190 2 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 66d13 18e 1 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 66d14 18c 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 66eab 93 a 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 66eb3 87 2 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 66eb4 85 1 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 66eb5 83 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 66f43 71c 17 0 4 8 ec 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67093 11 0 0 4 8 ec 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 675f4 11 0 0 4 8 ec 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67695 7a 13 0 8 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67714 114 17 0 8 8 e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 677e9 11 0 0 8 8 e4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67849 145 17 0 8 8 e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67941 11 0 0 8 8 e4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f609 58 13 0 4 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 679a9 53 13 0 4 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67a01 44 7 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67a4a df 16 0 10 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67a5b c5 5 0 10 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 67a5c c3 4 0 10 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 67a60 be 0 0 10 c c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 28b87 ad 21 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 28b95 9b 13 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 28ba8 87 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ae5e 85 15 0 8 0 cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ae6f 6b 4 0 8 4 cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ae73 66 0 0 8 8 cc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67b2e 3d 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67b70 57 c 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67b77 4c 5 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 67b7b 47 1 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 67b7c 45 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 1143f 60 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 11445 56 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f5a6 197 11 0 8 0 128 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f5b7 179 0 0 8 4 128 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f5ca 15f 0 0 8 8 128 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 132f9 54 c 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 13304 45 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 13305 43 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67bcc 231 f 0 8 8 9c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67dd6 2c 0 0 8 8 9c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67e19 17 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67e35 17e c 0 14 0 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67e3e 171 3 0 14 4 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 67e41 16d 0 0 14 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1146a 90 a 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 11470 86 4 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 11474 81 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6802b 8e 9 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 68034 81 0 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f26e 432 17 0 c 8 2b4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1f571 50 0 0 c 8 2b4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 680be 42e c 0 c 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 68496 4a 0 0 c 8 50 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 13353 406 17 0 c 8 2ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1366c 45 0 0 c 8 2ac 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 28c38 1099 17 0 24 8 2e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 29b93 127 0 0 24 8 2e4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 68509 78 6 0 24 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6850f 6c 0 0 24 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 68538 3b 0 0 24 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35bb0 1fe 17 0 c 8 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 44db3 55 0 0 c 8 254 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 68586 1fe 17 0 c 8 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 68734 55 0 0 c 8 254 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 687a1 2ab 1c 0 14 0 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 687bd 286 0 0 14 4 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 288 - ^ =\nSTACK WIN 4 68828 217 0 0 14 8 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 288 - ^ =\nSTACK WIN 4 68867 1d7 0 0 14 c 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 288 - ^ =\nSTACK WIN 4 2cf9b 28d f 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2cfa8 27c 2 0 c 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 2cfa9 27a 1 0 c 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 2cfaa 278 0 0 c c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 2cf60 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 68abf 2ed 11 0 10 0 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 68ac8 2e0 8 0 10 4 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ =\nSTACK WIN 4 68acf 2d8 1 0 10 8 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ =\nSTACK WIN 4 68ad0 2d6 0 0 10 c 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ =\nSTACK WIN 4 68db1 10d 9 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 68dba 100 0 0 c 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 68e39 80 0 0 c 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 68f11 148 8 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 68f3e 115 0 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 68f75 dd 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6905d 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 357d5 b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2080d 5f7 11 0 c 0 24c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2081e 5dd 0 0 c 4 24c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2083d 5b0 0 0 c 8 24c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31b99 1f2 7 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31ba0 1e7 0 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 31bcf 1ac 0 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 31bd0 1aa 0 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 20799 e2 e 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 207a1 d6 6 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 207a7 cf 0 0 10 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 207d8 7d 0 0 10 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 1fb88 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6907b 199 9 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 69084 18c 0 0 8 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 690b9 156 0 0 8 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 690ba 154 0 0 8 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 69218 17a 9 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 69221 16d 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 692b0 da 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 69395 3de 16 0 8 0 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 693a6 3c4 5 0 8 4 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 568 - ^ =\nSTACK WIN 4 693aa 3bf 1 0 8 8 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 568 - ^ =\nSTACK WIN 4 693ab 3bd 0 0 8 c 230 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 568 - ^ =\nSTACK WIN 4 69778 1b3 9 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 69781 1a6 0 0 4 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 697b6 170 0 0 4 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 697b7 16e 0 0 4 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 69930 2ca 9 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 69939 2bd 0 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 69983 271 0 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2e61c 39d a 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2e625 390 1 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 2e626 38e 0 0 c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 2e63e 372 0 0 c c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 20d14 3ab b 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 20d1d 39e 2 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 20d1e 39c 1 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 20d1f 39a 0 0 10 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 2d2af 13d 9 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2d2b8 130 0 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 2d2de 106 0 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 2d2df 104 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 69bff fd c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 69ce0 21 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 69d19 111 c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 69e0e 21 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 69e49 fd c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 69f2a 21 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 69f61 10f c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a054 21 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a091 48 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a099 3c 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a0de 1d 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2e8b2 10f c 0 c 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 453fe 21 0 0 c 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a100 13c c 0 10 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a220 21 0 0 10 8 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a259 fc c 0 8 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a339 21 0 0 8 8 38 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a371 172 a 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a37a 167 1 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 6a37b 165 0 0 0 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 6a4e8 11 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6a4fe c7 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6a5ca 3e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6a60d a4 10 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a613 9a a 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 6a614 98 9 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 6a61b 90 2 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 6a6b6 d0 10 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a6bc c6 a 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 6a6bd c4 9 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 6a6c4 bc 2 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 6a78b 66 8 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a7b8 33 0 0 18 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a7fb 60c e 0 8 0 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6a807 5fc 2 0 8 4 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 6a808 5fa 1 0 8 8 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 6a809 5f8 0 0 8 c 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 6aebf 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6aeed 2d 8 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6af1f 55 8 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6af53 1d 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6af79 52 8 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6afad 1a 0 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6afd0 71 9 0 18 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6afd8 65 1 0 18 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 6afd9 63 0 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 6aff2 49 0 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 6b046 41 8 0 18 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b08c 57 8 0 14 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b0e8 2e 7 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b11b 2e 7 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b14e 35 8 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b188 35 8 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b1c2 57 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b21e 3c 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b25f 1c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2cb03 69 8 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b280 72 8 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2e44a 28 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2e450 1e 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b2f7 28 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b2fd 1e 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2afc9 cc e 0 14 0 70 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2afd6 bb 1 0 14 4 70 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2afd7 b9 0 0 14 8 70 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ca9f 111 f 0 10 0 78 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2caac 100 2 0 10 4 78 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 128 - ^ =\nSTACK WIN 4 2caad fe 1 0 10 8 78 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 128 - ^ =\nSTACK WIN 4 2caae fc 0 0 10 c 78 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 128 - ^ =\nSTACK WIN 4 6b324 35 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b35e 29 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b38c 67 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b394 5b 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b3f8 6f c 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b404 5f 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b46c 19d c 0 c 8 5c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b5b5 48 0 0 c 8 5c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b629 55 8 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b631 49 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b683 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 2146c c 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6b694 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1301e 22 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b6a3 53 6 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b6a9 49 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17190 c4 13 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1719f b1 4 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 171a2 ad 1 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 171a3 a9 0 0 c c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 2bf01 c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1305f c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b6fb 23 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a644 35 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a675 38 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 300a9 33 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 300af 29 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 967c 12f c 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9684 123 4 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9688 11e 0 0 10 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b723 39 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b729 2f 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 130a6 42 e 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 130ac 38 8 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 130b4 2f 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 15350 124 16 0 14 0 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1535e 10d 8 0 14 4 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 88 - ^ =\nSTACK WIN 4 15362 108 4 0 14 8 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 88 - ^ =\nSTACK WIN 4 15366 103 0 0 14 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 88 - ^ =\nSTACK WIN 4 6b761 3f 9 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b76a 32 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1530d 47 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 19aaa 33 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1a9d9 3a 8 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 15229 170 e 0 10 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 15232 163 5 0 10 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ =\nSTACK WIN 4 15233 15f 4 0 10 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ =\nSTACK WIN 4 15237 15a 0 0 10 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 64 - ^ =\nSTACK WIN 4 162db ef b 0 1c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 162e2 e4 4 0 1c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 162e6 df 0 0 1c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 1529b af 8 0 3c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 152a1 a5 2 0 3c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 152a2 a3 1 0 3c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 152a3 a1 0 0 3c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1a86f 227 21 0 28 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1a878 21a 18 0 28 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1a879 216 17 0 28 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1a890 1fe 0 0 28 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 15921 ab5 45 0 c 0 3dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 15958 a75 e 0 c 4 3dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 996 - ^ =\nSTACK WIN 4 15965 a67 1 0 c 8 3dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 996 - ^ =\nSTACK WIN 4 15966 a65 0 0 c c 3dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 996 - ^ =\nSTACK WIN 4 1545c 910 17 0 4 8 2e0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 45f23 e 0 0 4 8 2e0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 11210 83 9 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 11219 76 0 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1123b 57 0 0 c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b7a5 32f 1d 0 4 0 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6b7bd 2c9 5 0 4 4 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 604 - ^ =\nSTACK WIN 4 6b7be 2c7 4 0 4 8 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 604 - ^ =\nSTACK WIN 4 6b7c2 2c2 0 0 4 c 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 604 - ^ =\nSTACK WIN 4 2fe16 84 3e 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fe54 1f 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30e9a a7 9 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30ea1 9c 2 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 30ea2 9a 1 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 30ea3 98 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 2fd92 73 9 0 14 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fd9b 66 0 0 14 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fdb4 2a 0 0 14 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bb0f 51 9 0 14 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bb17 45 1 0 14 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bb18 43 0 0 14 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fd4c 41 8 0 14 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2fd54 35 0 0 14 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30f21 73 9 0 14 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30f2a 66 0 0 14 4 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30f43 2a 0 0 14 8 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 38653 18e 2e 0 14 0 e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 38667 171 1a 0 14 4 e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 236 - ^ =\nSTACK WIN 4 3866b 16c 16 0 14 8 e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 236 - ^ =\nSTACK WIN 4 38681 155 0 0 14 c e4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 236 - ^ =\nSTACK WIN 4 3835a 3f 6 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1612f 113 1f 0 4 0 d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 16147 f2 7 0 4 4 d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1614e e8 0 0 4 8 d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bb65 38 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bba2 28 6 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bbcf 6b 8 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bbd7 5f 0 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bc0c 29 0 0 4 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 16763 87 16 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 16772 74 7 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 16778 6d 1 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 16779 6b 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 16602 5b 13 0 4 0 20c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 16613 41 2 0 4 4 20c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 532 - ^ =\nSTACK WIN 4 16614 3d 1 0 4 8 20c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 532 - ^ =\nSTACK WIN 4 16615 3b 0 0 4 c 20c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 532 - ^ =\nSTACK WIN 4 1aa2c ff 13 0 0 0 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1aa3d e7 2 0 0 4 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 1aa3e e4 1 0 0 8 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 1aa3f e0 0 0 0 c 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 169ea 5c 9 0 c 0 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 169f3 4f 0 0 c 4 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1691d 5c 8 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2b335 67 e 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2b33e 5a 5 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2b33f 57 4 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2b343 50 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 16473 5f 10 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 16479 47 a 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1647a 45 9 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 16483 3b 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1697f 66 7 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 16996 47 0 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1699b 39 0 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c59b 87 c 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2c5a6 78 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2c5a7 76 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2c5be 5a 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2f70b 90 6 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f711 86 0 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f737 5f 0 0 1c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f695 bd 8 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f6ca 81 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f6ce 7b 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1642c 42 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1643c 2d 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 16440 28 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 168bb 52 11 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 168c3 46 9 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 168c4 44 8 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 168cc 3b 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 16396 91 a 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1639f 5c 1 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 163a0 5a 0 0 4 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 163bf 3a 0 0 4 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 165e9 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 16b75 415 21 0 4 0 4a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 16b8c 3f5 a 0 4 4 4a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1200 - ^ =\nSTACK WIN 4 16b95 3eb 1 0 4 8 4a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1200 - ^ =\nSTACK WIN 4 16b96 3e9 0 0 4 c 4a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1200 - ^ =\nSTACK WIN 4 164cd c4 c 0 0 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 46631 e 0 0 0 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2b553 b8 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2b55b ac 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 2b57d 86 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 2b57e 82 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 16662 f2 b 0 14 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1666b e5 2 0 14 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 1666c e3 1 0 14 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 1666d e1 0 0 14 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 16879 b7 f 0 10 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 16884 a8 4 0 10 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 16888 a3 0 0 10 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 16a5c 79 0 0 10 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 16562 8d c 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 46678 4 0 0 8 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 167d7 9a c 0 10 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 466a9 4 0 0 10 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 15120 a1 c 0 c 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 466d4 4 0 0 c 8 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bc3f 63 c 0 0 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bc8a 4 0 0 0 8 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bcc1 a9 8 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bcc9 9f 0 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bcf0 77 0 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2b38d 214 e 0 0 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2b39b 1ff 0 0 0 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 2b3dd 1b6 0 0 0 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 2b3de 1b4 0 0 0 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 6be06 7f 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6be09 7b 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6be41 42 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6be8a 33 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1204d 44 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12061 1c 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bec2 70 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bec8 66 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bec9 64 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bf37 105 b 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6bf3d fb 5 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 6bf3e f9 4 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 6bf42 f4 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 6c041 167 10 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c04f 155 2 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 6c050 153 1 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 6c051 151 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 6c1ad 165 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c1c9 df 0 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c1cd da 0 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c317 f8 6 0 24 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c31d ee 0 0 24 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 6c34d bd 0 0 24 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 6c351 b6 0 0 24 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 6c414 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c42e 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c449 22 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c470 22 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c497 9a c 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c4a2 83 1 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 6c4a3 81 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 6c4d1 52 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 6c536 22 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c55d 30 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c592 50 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c598 42 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c599 40 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c5e7 3e 1a 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c601 20 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c62a 17b 15 0 14 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c639 168 6 0 14 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 6c63e 162 1 0 14 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 6c63f 15e 0 0 14 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 6c7a6 177 d 0 28 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c7ad 16c 6 0 28 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c7b3 165 0 0 28 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c922 177 d 0 28 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c929 16c 6 0 28 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6c92f 165 0 0 28 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6ca9e 195 10 0 18 0 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6caa7 188 7 0 18 4 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ =\nSTACK WIN 4 6caae 180 0 0 18 8 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ =\nSTACK WIN 4 6cabd 170 0 0 18 c 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ =\nSTACK WIN 4 6cc38 198 10 0 18 0 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6cc41 18b 7 0 18 4 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ =\nSTACK WIN 4 6cc48 183 0 0 18 8 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ =\nSTACK WIN 4 6cc57 173 0 0 18 c 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 80 - ^ =\nSTACK WIN 4 6cdd5 115c 1b 0 14 0 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6cde9 1144 7 0 14 4 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 604 - ^ =\nSTACK WIN 4 6cded 113f 3 0 14 8 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 604 - ^ =\nSTACK WIN 4 6cdf0 113b 0 0 14 c 254 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 604 - ^ =\nSTACK WIN 4 6df34 115c 1b 0 14 0 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6df48 1144 7 0 14 4 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 6df4c 113f 3 0 14 8 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 6df4f 113b 0 0 14 c 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 335b7 1d 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6f093 357 13 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6f09f 347 7 0 18 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 6f0a2 343 4 0 18 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 6f0a6 33e 0 0 18 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 6f3ef a6 c 0 10 0 f8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6f3fb 96 0 0 10 4 f8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6f49a 104 19 0 8 0 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6f4a8 ed b 0 8 4 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ =\nSTACK WIN 4 6f4a9 eb a 0 8 8 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ =\nSTACK WIN 4 6f4b3 e0 0 0 8 c 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ =\nSTACK WIN 4 6f5a3 102 8 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6f5aa f7 1 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 6f5ab f5 0 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 6f602 9d 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 6f6aa c5 1a 0 18 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6f6bc af 8 0 18 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 6f6bd ad 7 0 18 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 6f6c4 a5 0 0 18 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 6f774 1c7 16 0 8 0 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6f785 1ad 5 0 8 4 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ =\nSTACK WIN 4 6f786 1ab 4 0 8 8 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ =\nSTACK WIN 4 6f78a 1a6 0 0 8 c 220 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 552 - ^ =\nSTACK WIN 4 6f949 b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6f959 12f 7 0 14 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6f97d 107 0 0 14 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6f9f0 92 0 0 14 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6fa8d 22 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6fab4 1f 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6fad8 19e 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6fae0 192 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6fb1d 153 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6fc7b 61 8 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6fc83 55 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6fcdc e9 c 0 0 4 330 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6fdca 66 c 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6fe04 4 0 0 4 8 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 189fc 28 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6fe51 65 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6fe6d 44 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6fe6e 42 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6febb 5f c 0 c 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6ff09 4 0 0 c 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6ff39 148 15 0 18 0 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6ff4a 12e 4 0 18 4 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 6ff4e 129 0 0 18 8 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70086 27 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 700b2 25 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 700dc c0 13 0 8 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 700ed a6 2 0 8 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 700ee a4 1 0 8 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 700ef a2 0 0 8 c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 701a1 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 701b9 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 701d1 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70245 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 70252 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7025f 149 17 0 10 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70362 4 0 0 10 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 703c9 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 703e7 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70405 10c 17 0 c 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 704cb 4 0 0 c 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70531 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7054c 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70567 a3 19 0 8 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70578 89 8 0 8 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 70579 87 7 0 8 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 70580 7f 0 0 8 c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 7060f 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70627 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7063f c6 13 0 c 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70650 ac 2 0 c 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 70651 aa 1 0 c 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 70652 a8 0 0 c c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 7070a 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70725 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70740 a8 19 0 8 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70751 8e 8 0 8 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 70752 8c 7 0 8 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 70759 84 0 0 8 c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 707ed 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70805 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7081d 150 17 0 10 8 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70927 4 0 0 10 8 c8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70989 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 709a7 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 709c5 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ba6a 111 17 0 c 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 4677c 4 0 0 c 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70a39 23 9 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70a42 16 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ba3c 29 9 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ba45 1c 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2da09 a0 12 0 c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2da1a 86 1 0 c 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2da1b 84 0 0 c 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70a61 4f c 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70a99 4 0 0 4 8 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2d9bd 4b c 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 467de 4 0 0 4 8 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70ad1 75 c 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70b3f c 0 0 8 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b355 6e c 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b3c1 c 0 0 4 8 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70b61 11b 1c 0 18 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70b72 101 b 0 18 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 70b73 ff a 0 18 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 70b7d f4 0 0 18 c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 70c81 39 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70cbf 38 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70cfc a7 13 0 8 0 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70d0d 8d 2 0 8 4 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 540 - ^ =\nSTACK WIN 4 70d0e 8b 1 0 8 8 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 540 - ^ =\nSTACK WIN 4 70d0f 89 0 0 8 c 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 540 - ^ =\nSTACK WIN 4 70da8 58 8 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70db0 4c 0 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b10f 77 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b132 4f 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b13a 46 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 29ee3 70 d 0 8 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 29ef0 5f 0 0 8 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 46833 26 0 0 8 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1aff3 81 17 0 4 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 4687c 4 0 0 4 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1afd5 1f 6 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 18c64 9a b 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 18c6b 8f 4 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 18c6f 8a 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70e05 1ef 17 0 2c 8 e0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 70fe7 12 0 0 2c 8 e0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71011 77 13 0 0 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7108d 4f 4 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 71090 4b 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 71091 49 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 710e1 93 7 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 710e8 88 0 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71107 68 0 0 4 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71191 164 17 0 10 8 d0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 712e3 17 0 0 10 8 d0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b6d7 228 16 0 8 0 640 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 b6ec 20a 1 0 8 4 640 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1608 - ^ =\nSTACK WIN 4 b6ed 208 0 0 8 8 640 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1608 - ^ =\nSTACK WIN 4 71311 1cd 17 0 0 8 480 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 714d7 c 0 0 0 8 480 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 714f9 e9 17 0 4 8 128 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 715db c 0 0 4 8 128 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 715f9 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1ce32 125 17 0 14 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 468d9 4 0 0 14 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 468e9 4 0 0 14 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1cf25 1c 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 35484 1c 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1dc7e 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1dd4d 9b 1c 0 10 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71604 a3 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71674 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 716c9 7b 13 0 c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1aeaa 73 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1ff5b 82 13 0 10 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 10fe1 95 c 0 10 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 46968 4 0 0 10 8 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71749 29c 17 0 20 8 d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7189d 11 0 0 20 8 d8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7199c 4 0 0 20 8 d8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71a1d 4a 16 0 14 0 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71a2b 33 8 0 14 4 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ =\nSTACK WIN 4 71a2f 2e 4 0 14 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ =\nSTACK WIN 4 71a33 29 0 0 14 c 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 92 - ^ =\nSTACK WIN 4 71a6c 51 1c 0 14 0 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71a7a 3a e 0 14 4 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ =\nSTACK WIN 4 71a7e 35 a 0 14 8 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ =\nSTACK WIN 4 71a88 2a 0 0 14 c 58 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 96 - ^ =\nSTACK WIN 4 71ac2 139 17 0 2c 8 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71be9 4 0 0 2c 8 c8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71c19 ae 17 0 c 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71ca8 4 0 0 c 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71ce9 7b 13 0 c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 37c53 9a 17 0 4 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 469a3 4 0 0 4 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71d69 c2 19 0 10 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71d7a a8 8 0 10 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ =\nSTACK WIN 4 71d7e a3 4 0 10 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ =\nSTACK WIN 4 71d82 9e 0 0 10 c a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ =\nSTACK WIN 4 71e30 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71ea4 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71ec7 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71eea 75 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71f64 56 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 71fbf 5c 13 0 c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72020 7b 13 0 c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 720a0 107 17 0 c 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72188 4 0 0 c 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 721c9 78 8 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72269 12b 17 0 18 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7236f 4 0 0 18 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7237f 4 0 0 18 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 723c5 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 723e8 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7240b 13f 26 0 18 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72420 126 11 0 18 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 72421 124 10 0 18 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 72431 113 0 0 18 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 7254f 272 17 0 18 8 d4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72787 4 0 0 18 8 d4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 727e1 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72805 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72829 2d8 17 0 18 8 e8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72aa3 4 0 0 18 8 e8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72b21 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72b45 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72b69 151 17 0 1c 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72c86 4 0 0 1c 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72cd9 21 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72cff 21 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72d25 21 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72d4b 126 17 0 1c 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72e4c 4 0 0 1c 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72e5c 4 0 0 1c 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72ea5 21 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72ecb 21 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72ef1 21 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72f17 c3 17 0 18 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72fbb 4 0 0 18 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 72ff9 22 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73020 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73044 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73068 172 17 0 14 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7314a 4 0 0 14 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 731c9 4 0 0 14 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73215 af 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 732a4 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 732e1 17b 17 0 18 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73326 4 0 0 18 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73432 4 0 0 18 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7348d 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 734b0 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 734d3 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 734f6 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73519 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7353d 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73561 ad 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 735db 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73629 9c 17 0 4 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73692 4 0 0 4 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 736e1 9a 17 0 4 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73748 4 0 0 4 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73799 107 17 0 10 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73854 4 0 0 10 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 738c1 89 13 0 8 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7394f b5 17 0 c 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 739d1 4 0 0 c 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b1f0 75 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73a21 82 18 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73aa8 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73b1c 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73b90 75 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73c0a 75 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73c84 ac 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73d11 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73d51 b5 17 0 c 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73de7 4 0 0 c 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73e21 e1 17 0 18 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73ee3 4 0 0 18 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73f21 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73f45 1f 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73f69 77 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 73fe5 75 13 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7405f 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 740d3 6b 13 0 0 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74143 b6 15 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74154 9c 4 0 4 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74158 97 0 0 4 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b18f 6e 13 0 0 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 741fe 5e 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74261 2e 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74294 90 12 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 742a5 76 1 0 8 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 742a6 74 0 0 8 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74329 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74341 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74359 67 13 0 0 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 743c5 11c 17 0 8 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74497 4 0 0 8 8 c4 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1af14 a3 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 469dd 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74501 67 13 0 0 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7456d a3 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 745dd 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74631 83 13 0 4 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1bc2b e4 17 0 8 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 469fe 4 0 0 8 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 746b9 c1 19 0 10 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 746ca a7 8 0 10 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ =\nSTACK WIN 4 746ce a2 4 0 10 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ =\nSTACK WIN 4 746d2 9d 0 0 10 c a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ =\nSTACK WIN 4 7477f 7b 13 0 c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 747ff ae 17 0 c 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7487a 4 0 0 c 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 748c9 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7493d 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 749b1 e8 17 0 14 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74a7a 4 0 0 14 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74ab9 54 8 0 8 0 44 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74b12 6f 13 0 4 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74b86 c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 74b97 4d 8 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74be9 a0 b 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74bf2 93 2 0 10 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 74bf3 91 1 0 10 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 74bf4 8f 0 0 10 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 74c8e bd 11 0 8 0 408 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74c9f a3 0 0 8 4 408 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74e13 13d 11 0 4 0 4b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74e24 123 0 0 4 4 4b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74e74 79 0 0 4 8 4b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 74f87 135 17 0 8 8 c0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7507d 4 0 0 8 8 c0 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 750d9 c5 15 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 750ea ab 4 0 8 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 750ee a6 0 0 8 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 751a3 ac 17 0 c 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7521c 4 0 0 c 8 bc 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75271 b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b5c6 ca 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b616 17 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b61d f 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2000c 78 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 20012 3d 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b58b 39 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b591 2f 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b592 2d 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75280 1cc c 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75348 4 0 0 4 8 7c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 753b9 c 0 0 4 8 7c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75454 c 0 0 4 8 7c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75489 45 13 0 0 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 754d3 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 754e4 242 17 0 8 8 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 756a5 4 0 0 8 8 c8 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $ebp = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 38211 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75749 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7576c 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7578a 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 757aa 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 757ca 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 757e8 1c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75809 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 37ce1 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75827 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75842 84 16 0 14 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75853 6a 5 0 14 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ =\nSTACK WIN 4 75857 65 1 0 14 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ =\nSTACK WIN 4 75858 63 0 0 14 c a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ =\nSTACK WIN 4 a459 b3 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 d21d 15 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 cf52 136 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 cf63 111 0 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 cf7e f4 0 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 d239 24 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 380ef d7 c 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 380f9 c9 2 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 380fa c7 1 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 380fb c5 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 38063 f7 a 0 24 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3806c ea 1 0 24 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 3806d e8 0 0 24 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 380a9 65 0 0 24 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 d077 1a3 1e 0 18 0 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 d088 189 d 0 18 4 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ =\nSTACK WIN 4 d08f 181 6 0 18 8 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ =\nSTACK WIN 4 d095 17a 0 0 18 c 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ =\nSTACK WIN 4 38de8 204 19 0 18 0 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 38df9 1ea 8 0 18 4 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 540 - ^ =\nSTACK WIN 4 38dfd 1e5 4 0 18 8 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 540 - ^ =\nSTACK WIN 4 38e01 1e0 0 0 18 c 214 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 540 - ^ =\nSTACK WIN 4 d262 16c 1d 0 10 0 108 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 d277 14e 8 0 10 4 108 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 272 - ^ =\nSTACK WIN 4 d27e 146 1 0 10 8 108 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 272 - ^ =\nSTACK WIN 4 d27f 144 0 0 10 c 108 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 272 - ^ =\nSTACK WIN 4 758cb 9b 11 0 c 0 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 758dc 81 0 0 c 4 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75925 34 0 0 c 8 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7596b 166 21 0 18 0 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75981 47 b 0 18 4 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 276 - ^ =\nSTACK WIN 4 7598b 3c 1 0 18 8 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 276 - ^ =\nSTACK WIN 4 7598c 3a 0 0 18 c 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 276 - ^ =\nSTACK WIN 4 75ad6 9e 11 0 10 0 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75ae7 84 0 0 10 4 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75b30 37 0 0 10 8 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3632d 1a7 19 0 18 0 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3633e 18d 8 0 18 4 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ =\nSTACK WIN 4 36342 188 4 0 18 8 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ =\nSTACK WIN 4 36346 183 0 0 18 c 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ =\nSTACK WIN 4 361ee 1ea 19 0 18 0 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 361ff 1d0 8 0 18 4 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ =\nSTACK WIN 4 36203 1cb 4 0 18 8 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ =\nSTACK WIN 4 36207 1c6 0 0 18 c 218 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 544 - ^ =\nSTACK WIN 4 2ec56 2cc 16 0 18 0 234 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ec67 2b2 5 0 18 4 234 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 572 - ^ =\nSTACK WIN 4 2ec68 2b0 4 0 18 8 234 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 572 - ^ =\nSTACK WIN 4 2ec6c 2ab 0 0 18 c 234 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 572 - ^ =\nSTACK WIN 4 75b79 333 16 0 18 0 23c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75b8a 319 5 0 18 4 23c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 580 - ^ =\nSTACK WIN 4 75b8b 317 4 0 18 8 23c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 580 - ^ =\nSTACK WIN 4 75b8f 312 0 0 18 c 23c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 580 - ^ =\nSTACK WIN 4 38a0c ad 15 0 14 0 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 38a1d 93 4 0 14 4 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 38a21 8e 0 0 14 8 10c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75eb1 191 21 0 14 0 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 75ec5 174 d 0 14 4 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 536 - ^ =\nSTACK WIN 4 75ec6 172 c 0 14 8 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 536 - ^ =\nSTACK WIN 4 75ed2 165 0 0 14 c 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 536 - ^ =\nSTACK WIN 4 76047 83 11 0 c 0 224 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76058 69 0 0 c 4 224 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7606e 4f 0 0 c 8 224 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 760cf b 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a490 196 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a496 18c 2 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 a497 18a 1 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 a498 188 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 760df 2e5 11 0 3c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 760eb 2d5 5 0 3c 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 760ef 2cb 1 0 3c 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 760f0 2c9 0 0 3c c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 bfef 93 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 af4f 12e7 1d 0 1c 0 98 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 af64 12ce 8 0 1c 4 98 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 160 - ^ =\nSTACK WIN 4 af68 12c9 4 0 1c 8 98 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 160 - ^ =\nSTACK WIN 4 af6c 12c4 0 0 1c c 98 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 160 - ^ =\nSTACK WIN 4 763c9 21 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 763ef 107 1e 0 8 0 424 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76400 6b d 0 8 4 424 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1068 - ^ =\nSTACK WIN 4 7640d 5d 0 0 8 8 424 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1068 - ^ =\nSTACK WIN 4 1c48b 263 26 0 8 0 648 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1c4a3 ad e 0 8 4 648 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1616 - ^ =\nSTACK WIN 4 1c4ad a2 4 0 8 8 648 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1616 - ^ =\nSTACK WIN 4 1c4b1 9d 0 0 8 c 648 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1616 - ^ =\nSTACK WIN 4 764fb fe 18 0 4 0 140 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7650c e4 7 0 4 4 140 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76513 dc 0 0 4 8 140 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a415 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13038 2d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13070 2a 6 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 127b2 7 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 bf3d 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9f10 e2 6 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7668d a2 9 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76696 95 0 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76734 2b9 6 0 1c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7676f 27a 0 0 1c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 769f2 5c 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39200 157 15 0 c 0 43c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39211 13d 4 0 c 4 43c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39215 138 0 0 c 8 43c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76a53 195 1d 0 c 0 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76a6b 174 5 0 c 4 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 536 - ^ =\nSTACK WIN 4 76a6f 16f 1 0 c 8 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 536 - ^ =\nSTACK WIN 4 76a70 16d 0 0 c c 210 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 536 - ^ =\nSTACK WIN 4 76c59 b2 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76c5f a8 2 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 76c60 a6 1 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 76c61 a4 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 383cf 49 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1bbba ac b 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1bbc5 9d 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 bf64 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 2f041 131 11 0 c 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f052 117 0 0 c 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 2f06a ef 0 0 c 8 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 2f06b eb 0 0 c c a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 176 - ^ =\nSTACK WIN 4 2efb9 83 f 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2efc2 76 6 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2efc8 6f 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 11562 17bb 2f 0 10 0 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1157f ee5 12 0 10 4 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 196 - ^ =\nSTACK WIN 4 11582 19a f 0 10 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 196 - ^ =\nSTACK WIN 4 11591 18a 0 0 10 c bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 196 - ^ =\nSTACK WIN 4 39020 385 39 0 18 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39045 c8 14 0 18 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 39046 c6 13 0 18 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 39059 b2 0 0 18 c c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 76d1b 114 13 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76d2d fe 1 0 10 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76d2e fc 0 0 10 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76e34 3a 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76e3a 30 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b258 159 f 0 4 0 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b266 142 1 0 4 4 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1b267 140 0 0 4 8 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76e73 e22 23 0 c 0 570 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 76e84 d6c 12 0 c 4 570 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1400 - ^ =\nSTACK WIN 4 76e92 9ea 4 0 c 8 570 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1400 - ^ =\nSTACK WIN 4 76e96 9e5 0 0 c c 570 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1400 - ^ =\nSTACK WIN 4 77cf7 f4 1d 0 10 0 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 77d0b d7 9 0 10 4 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1072 - ^ =\nSTACK WIN 4 77d0f d2 5 0 10 8 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1072 - ^ =\nSTACK WIN 4 77d14 cc 0 0 10 c 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1072 - ^ =\nSTACK WIN 4 1bcfe f4 1c 0 10 0 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1bd12 d7 8 0 10 4 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1072 - ^ =\nSTACK WIN 4 1bd16 d2 4 0 10 8 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1072 - ^ =\nSTACK WIN 4 1bd1a cd 0 0 10 c 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1072 - ^ =\nSTACK WIN 4 15047 f9 7 0 14 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1505b e1 0 0 14 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1505c df 0 0 14 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 77df0 2f 7 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1734f 4a a 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17358 3d 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17359 3b 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 77e24 1a 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17f7d 3f 9 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17f86 32 0 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 77e43 13f 16 0 c 0 2a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 77e54 125 5 0 c 4 2a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 684 - ^ =\nSTACK WIN 4 77e58 120 1 0 c 8 2a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 684 - ^ =\nSTACK WIN 4 77e59 11e 0 0 c c 2a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 684 - ^ =\nSTACK WIN 4 2ae21 8d 1d 0 8 0 40c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ae3a 64 4 0 8 4 40c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ae3e 5f 0 0 8 8 40c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ac6c c8 10 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ac7a b1 2 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 2ac7b af 1 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 2ac7c ab 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 2b95b af 10 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2b969 98 2 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 2b96a 96 1 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 2b96b 94 0 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 2b883 c6 15 0 0 0 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2b8c4 7b 0 0 0 4 a8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 172de 74 10 0 14 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 172ea 64 4 0 14 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 172ee 5f 0 0 14 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ad98 b5 9 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ada1 a8 0 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2adb4 90 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 77f87 60 9 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 77f90 53 0 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 77fec 2d5 1d 0 10 0 440 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 77ffd 2bb c 0 10 4 440 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1096 - ^ =\nSTACK WIN 4 78008 2af 1 0 10 8 440 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1096 - ^ =\nSTACK WIN 4 78009 2ad 0 0 10 c 440 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1096 - ^ =\nSTACK WIN 4 782c6 19a 15 0 14 0 e3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 782d7 15b 4 0 14 4 e3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 3652 - ^ =\nSTACK WIN 4 782db 156 0 0 14 8 e3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 3652 - ^ =\nSTACK WIN 4 7838b a2 0 0 14 c e3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 3652 - ^ =\nSTACK WIN 4 2a8fa 221 12 0 10 0 430 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2a90b 1f9 1 0 10 4 430 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2a90c 1f7 0 0 10 8 430 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 37cfc 3ad 22 0 c 0 468 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 37d14 38c a 0 c 4 468 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1136 - ^ =\nSTACK WIN 4 37d1d 382 1 0 c 8 468 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1136 - ^ =\nSTACK WIN 4 37d1e 380 0 0 c c 468 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1136 - ^ =\nSTACK WIN 4 7849b 22b 1d 0 c 0 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 784ac 211 c 0 c 4 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 784ad 20f b 0 c 8 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 784b8 203 0 0 c c 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 38234 726 22 0 18 0 dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 38248 709 e 0 18 4 dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 228 - ^ =\nSTACK WIN 4 38249 707 d 0 18 8 dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 228 - ^ =\nSTACK WIN 4 38256 6f9 0 0 18 c dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 228 - ^ =\nSTACK WIN 4 38958 2ac 33 0 38 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 38970 28b 1b 0 38 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 3897a 280 11 0 38 8 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 3898b 26c 0 0 38 c c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 204 - ^ =\nSTACK WIN 4 786e5 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78703 1c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2a8dc 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78724 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7873f 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7875a 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7877d 1e 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 388dc df f 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 388e7 d0 4 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 388eb cb 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 38801 15f c 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3880c 150 1 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 3880d 14e 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 388be 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 387e1 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 787a0 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 787c0 82 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 787e7 29 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 787f2 1d 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78847 389 16 0 14 0 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78858 343 5 0 14 4 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 180 - ^ =\nSTACK WIN 4 78859 341 4 0 14 8 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 180 - ^ =\nSTACK WIN 4 7885d 33c 0 0 14 c ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 180 - ^ =\nSTACK WIN 4 78bd9 7e 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78bdf 74 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78c22 30 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3798e da 18 0 4 0 280 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3799f c0 7 0 4 4 280 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 379a6 b8 0 0 4 8 280 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78c5c 150 12 0 4 0 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78c6d 136 1 0 4 4 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 336 - ^ =\nSTACK WIN 4 78c6e 134 0 0 4 8 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 336 - ^ =\nSTACK WIN 4 78cb4 ea 0 0 4 c 148 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 336 - ^ =\nSTACK WIN 4 78db1 7c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78dd9 4c 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78ddd 47 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78e32 7c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78e5a 4c 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78e5e 47 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78eb3 c3 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78ef0 7e 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78ef3 7a 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78f7b 127 e 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 78f88 116 1 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 78f89 114 0 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 78fac f0 0 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 790a7 126 11 0 10 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 790b5 114 3 0 10 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 790b8 110 0 0 10 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 791d2 92 18 0 10 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 791e0 7b a 0 10 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 791e4 76 6 0 10 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 791ea 6f 0 0 10 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 ce53 73 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ce77 40 0 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ce7b 3b 0 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2d4ad 1ced 29 0 1c 0 de4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2d4c1 1cd0 15 0 1c 4 de4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 3564 - ^ =\nSTACK WIN 4 2d4d5 1cbb 1 0 1c 8 de4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 3564 - ^ =\nSTACK WIN 4 2d4d6 1cb9 0 0 1c c de4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 3564 - ^ =\nSTACK WIN 4 79269 289 7 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 79270 27e 0 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7928e 25e 0 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 374eb 220 1f 0 18 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 374fc 206 e 0 18 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3750a 1f7 0 0 18 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 37787 e9 23 0 18 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3779d ca d 0 18 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 377aa bc 0 0 18 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 377d2 55 0 0 18 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 794fb 136 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7952d ff 0 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7952e fd 0 0 1c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 79636 188 d 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 79641 179 2 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 79642 177 1 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 79643 175 0 0 14 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 37693 2ef a 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3769c 2e2 1 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 3769d 2e0 0 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 4acfb 1c3 0 0 18 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 cca8 3d3 13 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 ccb4 3c3 7 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 ccba 3bc 1 0 18 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 ccbb 3ba 0 0 18 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 110cb 48 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 110d1 3e 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9915 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 797c3 17 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 127a7 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b7dc 39 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f540 24 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 797df 82 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 79866 56 c 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 79872 46 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 798c1 c4 13 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 798cf 67 5 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 798d0 65 4 0 1c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 798d4 60 0 0 1c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 a1fb 2a0 13 0 18 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a20c 2c 2 0 18 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 a20d 2a 1 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 a20e 28 0 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 bd19 4ee 19 0 20 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 bd30 70 2 0 20 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 bd31 6e 1 0 20 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 bd32 48d 0 0 20 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 32cf3 1c3 1b 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32d04 1ae a 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 32d07 1aa 7 0 1c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 32d0e 1a2 0 0 1c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7998a 6d1 c 0 24 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 79991 6c6 5 0 24 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 79992 6c4 4 0 24 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 79996 6bf 0 0 24 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 7a064 158 19 0 0 0 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a07d 138 0 0 0 4 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a095 11b 0 0 0 8 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 cfd4 281 1c 0 18 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 cfe8 264 8 0 18 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 cfec 25f 4 0 18 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 cff0 25a 0 0 18 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 12e76 244 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12e7c 23a 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12e96 212 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a1cd 2fc 10 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a1d3 2f2 a 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7a1dd 2e7 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7a21d 2a6 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7a4ce 1e2 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a4d4 1d8 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a58b 81 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9bf8 87b 15 0 18 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 9c0c 85e 1 0 18 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 9c0d 85c 0 0 18 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 9c38 81d 0 0 18 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 32c7b 10b f 0 20 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 32c84 41 6 0 20 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 32c85 3f 5 0 20 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 32c8a 39 0 0 20 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 a0d4 3c5 6 0 20 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a0da 3bb 0 0 20 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a0f1 387 0 0 20 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a6b5 1b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7a6e2 1b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 35819 c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 34474 45 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a712 5c 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 336f6 3a 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 33735 3b 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a773 7b e 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7a779 74 8 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 7a77a 72 7 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 7a781 6a 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 2f440 58 1c 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f44b 3b 11 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f45c 29 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a7f3 58 9 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a7fa 4d 2 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a81b 23 0 0 4 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 37834 11f 15 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3783c 113 d 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 3783d 111 c 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 3783e 10f b 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 2f40d 7a d 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2f416 6f 4 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 2f417 6d 3 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 2f418 6b 2 0 0 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 7a850 5d 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a856 53 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a874 2c 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 124d1 109 c 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 124d7 ff 6 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 124dc f9 1 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 124dd f7 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 121de fc 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 121e1 f8 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1bdd2 1bc 9 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1bdd5 1b8 6 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1bddb 1b1 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 a2d4 85 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 a2dc 7c 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7a8b2 ab 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7a8b5 a7 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7a962 da 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a968 cc 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7a969 ca 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7aa41 25 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7aa6b 25 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7aa95 302 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ee51 3c6 d 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ee57 3bc 7 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2ee5d 3b5 1 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2ee5e 3b3 0 0 14 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7ad9c 5d 6 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ad9f 59 3 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ada0 57 2 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 2c16a 58 4 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 2c16d 54 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 2c16e 52 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 12544 32 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2a5c3 13c 15 0 10 0 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2a5d4 bf 4 0 10 4 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 2a5d8 ba 0 0 10 8 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 2a615 6f 0 0 10 c 228 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 560 - ^ =\nSTACK WIN 4 12090 cb b 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12096 c1 5 0 1c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1209a bc 1 0 1c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1209b ba 0 0 1c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 14f5c 92 27 0 14 0 40c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 14f83 62 0 0 14 4 40c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 14fbe 16 0 0 14 8 40c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 397f8 1e2 19 0 4 0 644 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39826 1a4 0 0 4 4 644 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39827 1a2 0 0 4 8 644 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 384db f1 15 0 c 0 29c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 384ec d7 4 0 c 4 29c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 676 - ^ =\nSTACK WIN 4 384f0 d2 0 0 c 8 29c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 676 - ^ =\nSTACK WIN 4 38518 a3 0 0 c c 29c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 676 - ^ =\nSTACK WIN 4 3440e 61 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34414 57 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7adfe 7c 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ae04 72 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ae7f de 2d 0 20 0 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ae9b b9 11 0 20 4 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 184 - ^ =\nSTACK WIN 4 7ae9f b4 d 0 20 8 b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 184 - ^ =\nSTACK WIN 4 7aeac a6 0 0 20 c b0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 184 - ^ =\nSTACK WIN 4 7af62 72 7 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7afd9 70 1b 0 1c 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7aff4 4c 0 0 1c 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3472b 390 15 0 20 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34740 377 0 0 20 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34777 347 0 0 20 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3465d 1d3 43 0 20 0 b8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 34695 182 b 0 20 4 b8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 192 - ^ =\nSTACK WIN 4 3469c 17a 4 0 20 8 b8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 192 - ^ =\nSTACK WIN 4 346a0 175 0 0 20 c b8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 192 - ^ =\nSTACK WIN 4 7b04e 66c 43 0 20 0 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7b086 1c3 b 0 20 4 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 196 - ^ =\nSTACK WIN 4 7b08d 3aa 4 0 20 8 bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 196 - ^ =\nSTACK WIN 4 7b091 1b6 0 0 20 c bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 196 - ^ =\nSTACK WIN 4 344bc 388 3c 0 18 0 378 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 344ea fe e 0 18 4 378 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 896 - ^ =\nSTACK WIN 4 344f7 f0 1 0 18 8 378 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 896 - ^ =\nSTACK WIN 4 344f8 ee 0 0 18 c 378 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 896 - ^ =\nSTACK WIN 4 7b6ca 404 3c 0 18 0 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7b6f8 fe e 0 18 4 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1064 - ^ =\nSTACK WIN 4 7b705 f0 1 0 18 8 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1064 - ^ =\nSTACK WIN 4 7b706 ee 0 0 18 c 420 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1064 - ^ =\nSTACK WIN 4 3414d 30 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 339dc 69 9 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 339e5 5c 0 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7bad3 96 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7bb13 4e 0 0 18 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7bb6e e6 f 0 c 0 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7bb7b d5 2 0 c 4 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 7bb7c d3 1 0 c 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 7bb7d cf 0 0 c c 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 7bc59 17d e 0 4 0 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7bc65 168 2 0 4 4 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 7bc66 166 1 0 4 8 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 7bc67 164 0 0 4 c 274 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 7be1b 63 a 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7be24 56 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7be25 52 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7be83 c5 1d 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7bef3 35 0 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 335d4 33 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 33ec8 a54 4c 0 14 0 508 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 33eef a20 25 0 14 4 508 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1296 - ^ =\nSTACK WIN 4 33efe a10 16 0 14 8 508 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1296 - ^ =\nSTACK WIN 4 33f14 9f9 0 0 14 c 508 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1296 - ^ =\nSTACK WIN 4 7bf4d fd 18 0 8 0 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7bf56 f0 f 0 8 4 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 7bf64 dd 1 0 8 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 7bf65 d7 0 0 8 c 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 7c04f 1d2 11 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7c058 1c5 8 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 7c059 1c3 7 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 7c060 1bb 0 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 7c86f 235 18 0 c 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7c887 1f0 0 0 c 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 7c8a5 1ce 0 0 c 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 7c8a6 1cc 0 0 c c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 44 - ^ =\nSTACK WIN 4 33fd3 1f2 25 0 18 0 2bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 33fea 17a e 0 18 4 2bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 708 - ^ =\nSTACK WIN 4 33ff4 16f 4 0 18 8 2bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 708 - ^ =\nSTACK WIN 4 33ff8 16a 0 0 18 c 2bc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 708 - ^ =\nSTACK WIN 4 33a4a 8c9 30 0 20 0 258 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 33a6c 50 e 0 20 4 258 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 608 - ^ =\nSTACK WIN 4 33a70 4b a 0 20 8 258 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 608 - ^ =\nSTACK WIN 4 33a7a 578 0 0 20 c 258 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 608 - ^ =\nSTACK WIN 4 33775 3fb 38 0 18 0 2d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 3379f 308 e 0 18 4 2d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 736 - ^ =\nSTACK WIN 4 337a3 303 a 0 18 8 2d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 736 - ^ =\nSTACK WIN 4 337ad 2f8 0 0 18 c 2d8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 736 - ^ =\nSTACK WIN 4 c0ed 74 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 17fc1 82 9 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 17fc8 7a 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 17fc9 78 1 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 17fca 76 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1805b 46 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 38617 37 9 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 38620 13 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7caa9 a6 9 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7cab1 9c 1 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7cab2 98 0 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a557 9b e 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 a565 8b 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17395 78 0 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7cb54 b5 1a 0 8 0 404 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7cb6d 93 1 0 8 4 404 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1036 - ^ =\nSTACK WIN 4 7cb6e 8f 0 0 8 8 404 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1036 - ^ =\nSTACK WIN 4 7cba2 57 0 0 8 c 404 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 1036 - ^ =\nSTACK WIN 4 188fc 146 7 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 18902 13c 1 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 18903 13a 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1892c 10c 0 0 14 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 16ea9 130 f 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 16eb6 11f 2 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 16eb7 11d 1 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 16eb8 11b 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 336b6 9d e 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 336c4 8b 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 336d0 7d 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 336dd 6f 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7cc2b 112 17 0 4 0 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7cc42 f2 0 0 4 4 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7cc60 d0 0 0 4 8 428 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7cd42 7f 7 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7cdc6 53 17 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7cdcc 49 11 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7cdd4 40 9 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7cddd 36 0 0 4 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7ce1e 8d e 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ce30 76 0 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ce35 70 0 0 4 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 184dc db 12 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 184e6 cd 8 0 c 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 184e9 c9 5 0 c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 18504 ad 0 0 c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 7ceb0 9e d 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7cebb 8f 2 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7cebc 8d 1 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7cebd 8b 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7cf53 2d 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 183fe 1fb 15 0 8 0 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1840f 1e1 4 0 8 4 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ =\nSTACK WIN 4 18413 1dc 0 0 8 8 a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ =\nSTACK WIN 4 1844e 196 0 0 8 c a4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 172 - ^ =\nSTACK WIN 4 3996f 176 1c 0 8 0 a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 39980 15c b 0 8 4 a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 168 - ^ =\nSTACK WIN 4 39984 157 7 0 8 8 a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 168 - ^ =\nSTACK WIN 4 3998b 14f 0 0 8 c a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 168 - ^ =\nSTACK WIN 4 1831e 16a b 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 18328 15c 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 18329 15a 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 d1ae 89 1e 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 d1b6 7f 16 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 d1c9 69 3 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 150c2 d6 20 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 150ca 9c 18 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 150cb 9a 17 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 150df 85 3 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 7cf85 204 16 0 8 0 a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7cf96 1ea 5 0 8 4 a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 168 - ^ =\nSTACK WIN 4 7cf9a 1e5 1 0 8 8 a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 168 - ^ =\nSTACK WIN 4 7cf9b 1e3 0 0 8 c a0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 168 - ^ =\nSTACK WIN 4 7d1b9 88 8 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 18297 9a e 0 10 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 182a5 88 0 0 10 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7d246 f5 24 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7d24f a2 1b 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 7d250 a0 1a 0 0 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 7d267 88 3 0 0 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 7d340 65 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7d3aa ff 1d 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7d3bd e8 a 0 14 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 7d3be e6 9 0 14 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 7d3c7 dc 0 0 14 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 7d4ae 101 e 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7d4b7 f4 5 0 18 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 7d4b8 f2 4 0 18 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 7d4bc ed 0 0 18 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 17210 6e a 0 0 0 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17219 63 1 0 0 4 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 1721a 5f 0 0 0 8 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7d5b4 a0 a 0 0 0 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7d5bd 95 1 0 0 4 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 72 - ^ =\nSTACK WIN 4 7d5be 93 0 0 0 8 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 72 - ^ =\nSTACK WIN 4 7d615 23 0 0 0 c 40 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 72 - ^ =\nSTACK WIN 4 2a25d 2a9 b 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2a268 26e 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2a41a 113 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7d659 5a 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7d65f 50 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7d690 1c 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2a855 82 14 0 10 0 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2a869 65 0 0 10 4 21c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 11fff 23f 9 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 12006 234 2 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 12007 232 1 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 12008 230 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 2a532 8e 13 0 4 0 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2a543 74 2 0 4 4 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 180 - ^ =\nSTACK WIN 4 2a544 70 1 0 4 8 ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 180 - ^ =\nSTACK WIN 4 2a545 6e 0 0 4 c ac 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 180 - ^ =\nSTACK WIN 4 7d6b7 a9 15 0 c 0 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7d6c8 8f 4 0 c 4 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 208 - ^ =\nSTACK WIN 4 7d6cc 8a 0 0 c 8 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 208 - ^ =\nSTACK WIN 4 7d700 40 0 0 c c c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 208 - ^ =\nSTACK WIN 4 16ff1 9a 16 0 8 0 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 17002 80 5 0 8 4 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 208 - ^ =\nSTACK WIN 4 17003 7e 4 0 8 8 c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 208 - ^ =\nSTACK WIN 4 17007 79 0 0 8 c c8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 208 - ^ =\nSTACK WIN 4 7d765 25f 2b 0 1c 0 dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7d77f 12f 11 0 1c 4 dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 228 - ^ =\nSTACK WIN 4 7d78c 121 4 0 1c 8 dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 228 - ^ =\nSTACK WIN 4 7d790 11c 0 0 1c c dc 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 228 - ^ =\nSTACK WIN 4 7d9c9 40 21 0 0 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7da0e 6c 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7da14 62 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7da47 15 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7da7f 13e b 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7da86 12e 4 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 7da89 12a 1 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 7da8a 128 0 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 31054 21d 13 0 14 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 31060 20d 7 0 14 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 31064 208 3 0 14 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 31067 204 0 0 14 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 7dc45 196 16 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7dc4c 17a f 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 7dc52 173 9 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 7dc5b 169 0 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 21523 2c6 d 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2152e 2b7 2 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 2152f 2b5 1 0 10 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 21530 2b3 0 0 10 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 30f99 bb 9 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 30fa0 b0 2 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 30fa1 ae 1 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 30fa2 ac 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 215f5 a1 13 0 20 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 215fc 96 c 0 20 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 215fd 94 b 0 20 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 21608 88 0 0 20 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 2ad39 5a 17 0 c 0 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 2ad50 3a 0 0 c 4 c4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7dead b 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7debd e1 1a 0 4 0 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7df16 75 0 0 4 4 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7df17 73 0 0 4 8 118 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7dfad 84 13 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7dfc0 6d 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7dfcd 5b 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e036 44 c 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e041 35 1 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7e042 31 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7e04a 28 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7e07f 47 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e085 3d 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e0cb 1f e 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e0ef 1f e 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e113 1f e 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e137 1f e 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e15b b 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e16b f 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e17f f 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e193 f 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e1a7 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e1bb f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e1cf f 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ddf5 4 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e1e3 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e1ec 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e1f9 15 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e213 15 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e22d 15 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e247 2f 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e27b 19 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e299 d 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e2ab d 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e2bd d 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e2cf 14 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e2e8 4 0 0 2c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e2f1 10 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e306 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e313 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e31d 18 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e33a c 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e34b 5 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e355 8 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e362 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e36c c 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e37d 6 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e388 6 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e393 6 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e39e 6 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ae7 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e3a9 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e3b4 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e3bf 6 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e3ca 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e3e8 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e3f5 21 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e41b 1b 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e43b 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e446 11 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e45c 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e469 c 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e47a a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e489 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e496 5 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e4a0 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e4b1 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e4be c 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e4cf c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e4e0 c 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e4f1 1d 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e513 1e 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e536 c 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e547 e 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e55a c 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e56b 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e593 8 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e5a0 17 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e5bc 8 0 0 34 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e5c9 5 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e5d3 5 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e5dd 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e5f5 a 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e604 c 0 0 30 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e615 d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e627 14 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e640 14 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e659 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e666 14 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e67f 18 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e69c 8 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e6a9 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e6b6 8 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e6c3 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e6ed 18 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e728 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 cc97 c 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e735 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e742 c 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e753 f 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e767 10 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e77c 12 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e793 14 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e7ac c 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e7bd 1b 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e7dd 10 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e7f2 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e7fd 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e808 14 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e821 15 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e83b 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e848 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e878 5 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e88d 5 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 260c2 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e897 c 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e8a8 5 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e8b2 5 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e8bc 14 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e8d5 14 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e8ee 14 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e907 15 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e90d b 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e921 1f 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e945 c 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e956 14 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e96f 19 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e975 f 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e98d 3 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e995 14 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e9ae 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e9bb 1a 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7e9da 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e9e7 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7e9f0 14 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ea09 14 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ea22 19 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ea40 8 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ea4d 5 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ea57 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ea62 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ea6d 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ea78 6 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ea83 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ea8e 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ea99 6 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eaa4 6 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eaaf 12 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7eac6 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eacf c 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eae0 d 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eaf2 d 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eb04 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eb14 23 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7eb3c d 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eb4e d 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eb60 5 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eb6a 8 0 0 38 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eb77 5 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eb81 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eb8c 8 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ebbe 8 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ebcb 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ebd8 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ebe5 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ebf2 8 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ebff 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ec0c 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ec19 3 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ec21 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ec2e 19 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ec34 f 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ec4c 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ec59 3 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ec61 15 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ec7b 18 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ec98 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eca1 19 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ecbf 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eccc 8 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ecd9 8 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ece6 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ed3f 3 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ed47 8 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ed54 5 0 0 38 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ed69 10 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ed7e 15 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ed98 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eda5 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7edb2 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7edbf 8 0 0 2c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7edcc 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7edd9 8 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ede6 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7edf3 14 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ee0c 14 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ee25 19 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ee2b f 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ee43 19 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ee49 f 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ee61 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ee6c 8 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ee79 8 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ee86 8 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ee93 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eea0 8 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eead 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eeb8 8 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eec5 8 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eed2 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eedf 8 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eeec 14 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ef05 14 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ef1e 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ef29 14 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ef42 14 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ef5b 1b 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ef61 11 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ef7b 14 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ef94 7 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7efa0 7 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7efac 7 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7efb8 7 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7efc4 7 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7efd0 7 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7efdc 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7efe7 6 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7eff2 12 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f009 12 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f020 19 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f03e f 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f052 3 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f05a 3 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f062 6 0 0 2c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f06d 6 0 0 30 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f078 3 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f093 18 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f0b0 6 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f0bb 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f0c5 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f0f5 3 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f0fd 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f108 18 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f125 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f132 5 0 0 2c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f13c 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f147 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f152 6 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f17e 18 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f19b c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f1ac 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f1d0 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f1db 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f1e6 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f1f1 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f1fe 1 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f204 c 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f215 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f220 16 5 0 20 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f23b 6 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f246 6 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f251 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f25c 18 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f279 18 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f296 27 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f2c2 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f2cd 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f2da 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f2e5 8 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f309 30 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f317 1b 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f31a 15 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f33e 3a 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f356 1b 0 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f359 15 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f37d 3e 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f399 1b 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f39c 15 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f3c0 7 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f3cc 7 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f3d8 1b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f3f8 1b 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f418 16 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f433 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f44e 16 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f469 16 5 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f484 16 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f49f 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f4aa 6 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f4b5 6 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f4c0 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f4cb 16 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f4e6 17 5 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f502 6 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f50d 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f518 19 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f51e f 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f536 6 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f541 16 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f55c 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f567 16 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f582 16 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f59d c 0 0 24 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f5ae 6 0 0 1c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f5b9 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f5c4 6 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f5cf 6 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f5da 6 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f5e5 6 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f5f0 6 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f5fb 6 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f606 f 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f61a f 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f62e d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f640 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f655 f 0 0 18 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f669 f 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f67d f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f691 f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f6a5 8 0 0 5c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f6b2 c 0 0 2c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f6c3 6 0 0 28 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f6ce 6 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f6d9 5 0 0 30 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f6e3 13 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f6fb 12 5 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f712 1a 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f731 8 0 0 20 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f73e 22 5 0 30 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f765 18 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f782 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f78f 20 5 0 24 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f7b4 16 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f7cf 20 5 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f7f4 16 5 0 20 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f80f 15 5 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f829 18 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f846 8 0 0 14 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f95b 222 a 0 4 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7f964 217 1 0 4 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 7f965 215 0 0 4 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 7f994 1e5 0 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 7fb8d ae 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fb93 a0 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fbdd 55 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fc40 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7fc57 49 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fc5d 3f 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fca5 b9 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fcab af 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7fcdd 7c 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7fceb 6d 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7fd63 b9 13 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fd71 a2 5 0 c 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 7fd72 a0 4 0 c 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 7fd76 9b 0 0 c c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 7fe21 30 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fe56 47 a 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fe5c 3d 4 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fe60 38 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fea2 30 5 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fed7 41 6 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fedd 37 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ff1d 5a 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ff23 50 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ff24 4e 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ff89 65 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7ff8f 5b 1 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7ff90 57 0 0 4 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 7fff3 104 a 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fff9 fa 4 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 7fffd f5 0 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 800fc 45 8 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 80146 ae 16 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 80154 97 8 0 c 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 80158 92 4 0 c 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 8015c 8d 0 0 c c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 801f9 3f 12 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 80207 28 4 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 8020b 22 0 0 4 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 80246 262 c 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 8024d 257 5 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 8024e 255 4 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 80252 250 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 804ad 75 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 804b3 6b 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 80527 4d 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 8052d 43 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 8052e 41 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 80579 5e 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 805dc 5e 7 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 8063f 2f e 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 4 8064d 1d 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 4 + .cbParams + =\nSTACK WIN 0 17826 35 0 0 0 0 0 0 0 0\nSTACK WIN 0 558b4 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 39bc8 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 30769 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 b722 20 0 0 0 0 0 0 0 0\nSTACK WIN 0 1b069 a1 0 0 0 0 0 0 0 0\nSTACK WIN 0 17860 24 0 0 0 0 0 0 0 0\nSTACK WIN 0 1795e 89 3 0 0 0 0 0 0 0\nSTACK WIN 0 39e42 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 39ea2 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 39eca e 0 0 0 0 0 0 0 0\nSTACK WIN 0 1717 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 39f0b e 0 0 0 0 0 0 0 0\nSTACK WIN 0 39f69 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 55abf e 0 0 0 0 0 0 0 0\nSTACK WIN 0 55b65 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 3a7c5 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 3a824 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 3a86a 19 0 0 0 0 0 0 0 0\nSTACK WIN 0 3a94d e 0 0 0 0 0 0 0 0\nSTACK WIN 0 3a995 19 0 0 0 0 0 0 0 0\nSTACK WIN 0 3a9c6 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 3aa01 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 3aa1d e 0 0 0 0 0 0 0 0\nSTACK WIN 0 2c86d 29 0 0 0 0 0 0 0 0\nSTACK WIN 0 3aad0 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 3ab10 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 3abe7 7a 0 0 0 0 0 0 0 0\nSTACK WIN 0 98eb 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 9766 11 0 0 4 0 0 0 0 0\nSTACK WIN 0 977a 11 0 0 4 0 0 0 0 0\nSTACK WIN 0 978e 13 0 0 8 0 0 0 0 0\nSTACK WIN 0 97a2 13 0 0 c 0 0 0 0 0\nSTACK WIN 0 97b6 f 0 0 8 0 0 0 0 0\nSTACK WIN 0 97c6 120 0 0 c 0 0 0 0 0\nSTACK WIN 0 2ff92 18 0 0 0 0 0 0 0 0\nSTACK WIN 0 929c f 0 0 0 0 0 0 0 0\nSTACK WIN 0 13093 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 59b72 5 0 0 0 0 0 0 0 0\nSTACK WIN 0 59dd6 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 59f9f 14 0 0 0 0 0 0 0 0\nSTACK WIN 0 30cce 1c 0 0 0 0 0 0 0 0\nSTACK WIN 0 1c858 6a 3 0 0 0 0 0 0 0\nSTACK WIN 0 3bde2 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 3c06f 15 0 0 0 0 0 0 0 0\nSTACK WIN 0 5c223 1e 0 0 0 0 0 0 0 0\nSTACK WIN 0 3c77a 2c 0 0 0 0 0 0 0 0\nSTACK WIN 0 f049 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 3c85e e 0 0 0 0 0 0 0 0\nSTACK WIN 0 18ef e 0 0 0 0 0 0 0 0\nSTACK WIN 0 1921 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 3cac5 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 5c6de b 0 0 0 0 0 0 0 0\nSTACK WIN 0 5cbad 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 5d0d4 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 5d2ff 39 0 0 0 0 0 0 0 0\nSTACK WIN 0 1f951 3c 0 0 0 0 0 0 0 0\nSTACK WIN 0 3d377 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 5d93e 4d 0 0 0 0 0 0 0 0\nSTACK WIN 0 5de3f 1a 0 0 0 0 0 0 0 0\nSTACK WIN 0 5e00f 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 3d7a4 10 0 0 0 0 0 0 0 0\nSTACK WIN 0 3d9cf 10 0 0 0 0 0 0 0 0\nSTACK WIN 0 3e895 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 3eadf ab 0 0 0 0 0 0 0 0\nSTACK WIN 0 3f743 134 0 0 0 0 0 0 0 0\nSTACK WIN 0 3ffbd 3e 0 0 0 0 0 0 0 0\nSTACK WIN 0 27b99 1d 0 0 0 0 0 0 0 0\nSTACK WIN 0 200d1 1d 0 0 0 0 0 0 0 0\nSTACK WIN 0 40019 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 401f7 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 40258 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 4029c e 0 0 0 0 0 0 0 0\nSTACK WIN 0 402de e 0 0 0 0 0 0 0 0\nSTACK WIN 0 40327 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 403bd e 0 0 0 0 0 0 0 0\nSTACK WIN 0 40414 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 4043c e 0 0 0 0 0 0 0 0\nSTACK WIN 0 5e670 11 0 0 4 0 0 0 0 0\nSTACK WIN 0 404b7 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 1d07e 8 0 0 0 0 0 0 0 0\nSTACK WIN 0 365f6 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 3594f 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 17443 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 407a9 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 407c5 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 407e1 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 407fd 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 40817 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 40833 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 4084f 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 40892 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 5e882 11 0 0 8 0 0 0 0 0\nSTACK WIN 0 abc1 d 0 0 0 0 0 0 0 0\nSTACK WIN 0 40a26 16 0 0 0 0 0 0 0 0\nSTACK WIN 0 40b63 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 40c62 17 0 0 0 0 0 0 0 0\nSTACK WIN 0 111da 31 0 0 0 0 0 0 0 0\nSTACK WIN 0 5eee3 8 0 0 c 0 0 0 0 0\nSTACK WIN 0 1c8c e 0 0 0 0 0 0 0 0\nSTACK WIN 0 40cf3 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 40d2a e 0 0 0 0 0 0 0 0\nSTACK WIN 0 40d78 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 40da4 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 40dd0 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 40e00 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 5f1bf e 0 0 0 0 0 0 0 0\nSTACK WIN 0 5f3e0 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 40e66 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 40e92 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 5f5c9 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 5f72a e 0 0 0 0 0 0 0 0\nSTACK WIN 0 5f9fa 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 5fa2d 1e 0 0 0 0 0 0 0 0\nSTACK WIN 0 40faa 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 40fe6 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 5fc02 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 11419 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 4171b 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 41748 48 0 0 0 0 0 0 0 0\nSTACK WIN 0 607cb 30 0 0 0 0 0 0 0 0\nSTACK WIN 0 418d1 3f 0 0 0 0 0 0 0 0\nSTACK WIN 0 60b60 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 60bbf f 0 0 8 0 0 0 0 0\nSTACK WIN 0 41b32 7 0 0 0 0 0 0 0 0\nSTACK WIN 0 21af 7 0 0 0 0 0 0 0 0\nSTACK WIN 0 12f1d 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 16f83 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 12f08 10 0 0 0 0 0 0 0 0\nSTACK WIN 0 9920 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 41c56 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 41c70 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 41c8a 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 41ca4 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 41dcc 10 0 0 0 0 0 0 0 0\nSTACK WIN 0 43025 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 1e017 2eb 0 0 0 0 0 0 0 0\nSTACK WIN 0 43374 14 0 0 0 0 0 0 0 0\nSTACK WIN 0 434b2 17 0 0 0 0 0 0 0 0\nSTACK WIN 0 434e5 60 0 0 0 0 0 0 0 0\nSTACK WIN 0 61723 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 435d2 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 132ee 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 617fd e 0 0 0 0 0 0 0 0\nSTACK WIN 0 436ca 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 437f5 10 0 0 0 0 0 0 0 0\nSTACK WIN 0 438be 4a 0 0 0 0 0 0 0 0\nSTACK WIN 0 31d8e f 0 0 0 0 0 0 0 0\nSTACK WIN 0 1a834 36 0 0 0 0 0 0 0 0\nSTACK WIN 0 2610 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 36759 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 951a b 0 0 0 0 0 0 0 0\nSTACK WIN 0 2432 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 61a61 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 1746c 23 0 0 0 0 0 0 0 0\nSTACK WIN 0 17459 10e 0 0 0 0 0 0 0 0\nSTACK WIN 0 1efce 12 0 0 0 0 0 0 0 0\nSTACK WIN 0 129f9 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 44733 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 9728 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 62be6 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 448d9 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 13771 7 0 0 0 0 0 0 0 0\nSTACK WIN 0 2c151 14 0 0 0 0 0 0 0 0\nSTACK WIN 0 2fed7 40 0 0 0 0 0 0 0 0\nSTACK WIN 0 32992 13 0 0 0 0 0 0 0 0\nSTACK WIN 0 63421 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 6362b 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 636d3 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 6452a e 0 0 0 0 0 0 0 0\nSTACK WIN 0 6665c 1c 0 0 0 0 0 0 0 0\nSTACK WIN 0 66682 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 66801 3b 0 0 0 0 0 0 0 0\nSTACK WIN 0 66918 1a 0 0 0 0 0 0 0 0\nSTACK WIN 0 669cd 3b 0 0 0 0 0 0 0 0\nSTACK WIN 0 66ae8 1a 0 0 0 0 0 0 0 0\nSTACK WIN 0 66b9d 3b 0 0 0 0 0 0 0 0\nSTACK WIN 0 66cbf 1a 0 0 0 0 0 0 0 0\nSTACK WIN 0 67093 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 675f4 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 677e9 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 67941 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 67dd6 2c 0 0 0 0 0 0 0 0\nSTACK WIN 0 1f571 50 0 0 0 0 0 0 0 0\nSTACK WIN 0 68496 4a 0 0 0 0 0 0 0 0\nSTACK WIN 0 1366c 45 0 0 0 0 0 0 0 0\nSTACK WIN 0 29b93 127 0 0 0 0 0 0 0 0\nSTACK WIN 0 44db3 55 0 0 0 0 0 0 0 0\nSTACK WIN 0 68734 55 0 0 0 0 0 0 0 0\nSTACK WIN 0 69ce0 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 69e0e 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 69f2a 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 6a054 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 453fe 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 6a220 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 6a339 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 6a4e8 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 6a4fe c7 0 0 0 0 0 0 0 0\nSTACK WIN 0 6a5ca 3e 0 0 0 0 0 0 0 0\nSTACK WIN 0 6b5b5 48 0 0 0 0 0 0 0 0\nSTACK WIN 0 6b683 c 0 0 4 0 0 0 0 0\nSTACK WIN 0 2146c c 0 0 8 0 0 0 0 0\nSTACK WIN 0 6b694 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 45f23 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 165e9 13 0 0 0 0 0 0 0 0\nSTACK WIN 0 46631 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 46678 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 466a9 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 466d4 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 6bc8a 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 6be06 7f 3 0 0 0 0 0 0 0\nSTACK WIN 0 6fe04 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 189fc 28 0 0 0 0 0 0 0 0\nSTACK WIN 0 6ff09 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 70245 8 0 0 0 0 0 0 0 0\nSTACK WIN 0 70252 8 0 0 0 0 0 0 0 0\nSTACK WIN 0 70362 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 704cb 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 70927 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 4677c 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 70a99 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 467de 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 70b3f c 0 0 0 0 0 0 0 0\nSTACK WIN 0 1b3c1 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 4687c 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 70fe7 12 0 0 0 0 0 0 0 0\nSTACK WIN 0 7108d 4f 4 0 0 0 0 0 0 0\nSTACK WIN 0 712e3 17 0 0 0 0 0 0 0 0\nSTACK WIN 0 714d7 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 715db c 0 0 0 0 0 0 0 0\nSTACK WIN 0 715f9 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 468d9 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 468e9 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 71674 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 46968 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 7189d 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 7199c 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 71be9 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 71ca8 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 469a3 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 72188 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 7236f 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 7237f 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 72787 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 72aa3 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 72c86 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 72e4c 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 72e5c 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 72fbb 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 7314a 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 731c9 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 732a4 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 73326 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 73432 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 735db 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 73692 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 73748 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 73854 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 739d1 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 73d11 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 73de7 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 73ee3 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 74497 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 469dd 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 745dd 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 469fe 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 7487a 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 74a7a 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 74b86 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 7507d 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 7521c 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 75271 b 0 0 4 0 0 0 0 0\nSTACK WIN 0 75348 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 753b9 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 75454 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 754d3 f 0 0 0 0 0 0 0 0\nSTACK WIN 0 756a5 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 763c9 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 a415 d 0 0 0 0 0 0 0 0\nSTACK WIN 0 13038 2d 0 0 0 0 0 0 0 0\nSTACK WIN 0 127b2 7 0 0 0 0 0 0 0 0\nSTACK WIN 0 bf3d 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 bf64 5 0 0 0 0 0 0 0 0\nSTACK WIN 0 9915 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 127a7 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 7a6b5 1b 0 0 0 0 0 0 0 0\nSTACK WIN 0 7a6e2 1b 0 0 0 0 0 0 0 0\nSTACK WIN 0 35819 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 7a773 7b e 0 0 0 0 0 0 0\nSTACK WIN 0 121de fc 3 0 0 0 0 0 0 0\nSTACK WIN 0 1bdd2 1bc 9 0 0 0 0 0 0 0\nSTACK WIN 0 a2d4 85 2 0 0 0 0 0 0 0\nSTACK WIN 0 7a8b2 ab 3 0 0 0 0 0 0 0\nSTACK WIN 0 7ad9c 5d 6 0 0 0 0 0 0 0\nSTACK WIN 0 2c16a 58 4 0 0 0 0 0 0 0\nSTACK WIN 0 c0ed 74 0 0 0 0 0 0 0 0\nSTACK WIN 0 17fc1 82 9 0 0 0 0 0 0 0\nSTACK WIN 0 2a41a 113 0 0 0 0 0 0 0 0\nSTACK WIN 0 7e16b f 0 0 c 0 0 0 0 0\nSTACK WIN 0 7e17f f 0 0 14 0 0 0 0 0\nSTACK WIN 0 7e193 f 0 0 28 0 0 0 0 0\nSTACK WIN 0 7e1a7 f 0 0 4 0 0 0 0 0\nSTACK WIN 0 7e1bb f 0 0 8 0 0 0 0 0\nSTACK WIN 0 7e1cf f 0 0 10 0 0 0 0 0\nSTACK WIN 0 ddf5 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 7e1e3 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 7e1ec 8 0 0 8 0 0 0 0 0\nSTACK WIN 0 7e299 d 0 0 c 0 0 0 0 0\nSTACK WIN 0 7e2ab d 0 0 18 0 0 0 0 0\nSTACK WIN 0 7e2bd d 0 0 24 0 0 0 0 0\nSTACK WIN 0 7e2e8 4 0 0 10 0 0 0 0 0\nSTACK WIN 0 7e306 8 0 0 c 0 0 0 0 0\nSTACK WIN 0 7e313 5 0 0 4 0 0 0 0 0\nSTACK WIN 0 7e33a c 0 0 18 0 0 0 0 0\nSTACK WIN 0 7e34b 5 0 0 28 0 0 0 0 0\nSTACK WIN 0 7e355 8 0 0 28 0 0 0 0 0\nSTACK WIN 0 7e362 5 0 0 8 0 0 0 0 0\nSTACK WIN 0 7e36c c 0 0 14 0 0 0 0 0\nSTACK WIN 0 7e37d 6 0 0 18 0 0 0 0 0\nSTACK WIN 0 7e388 6 0 0 14 0 0 0 0 0\nSTACK WIN 0 7e393 6 0 0 20 0 0 0 0 0\nSTACK WIN 0 7e39e 6 0 0 18 0 0 0 0 0\nSTACK WIN 0 14ae7 6 0 0 4 0 0 0 0 0\nSTACK WIN 0 7e3a9 6 0 0 c 0 0 0 0 0\nSTACK WIN 0 7e3b4 6 0 0 10 0 0 0 0 0\nSTACK WIN 0 7e3bf 6 0 0 14 0 0 0 0 0\nSTACK WIN 0 7e3e8 8 0 0 10 0 0 0 0 0\nSTACK WIN 0 7e43b 6 0 0 4 0 0 0 0 0\nSTACK WIN 0 7e45c 8 0 0 14 0 0 0 0 0\nSTACK WIN 0 7e469 c 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7e47a a 0 0 0 0 0 0 0 0\nSTACK WIN 0 7e489 8 0 0 10 0 0 0 0 0\nSTACK WIN 0 7e496 5 0 0 20 0 0 0 0 0\nSTACK WIN 0 7e4a0 c 0 0 4 0 0 0 0 0\nSTACK WIN 0 7e4b1 8 0 0 4 0 0 0 0 0\nSTACK WIN 0 7e4be c 0 0 8 0 0 0 0 0\nSTACK WIN 0 7e4cf c 0 0 c 0 0 0 0 0\nSTACK WIN 0 7e4e0 c 0 0 14 0 0 0 0 0\nSTACK WIN 0 7e536 c 0 0 18 0 0 0 0 0\nSTACK WIN 0 7e547 e 0 0 8 0 0 0 0 0\nSTACK WIN 0 7e55a c 0 0 28 0 0 0 0 0\nSTACK WIN 0 7e56b 8 0 0 4 0 0 0 0 0\nSTACK WIN 0 7e593 8 0 0 28 0 0 0 0 0\nSTACK WIN 0 7e5bc 8 0 0 34 0 0 0 0 0\nSTACK WIN 0 7e5c9 5 0 0 28 0 0 0 0 0\nSTACK WIN 0 7e5d3 5 0 0 24 0 0 0 0 0\nSTACK WIN 0 7e5f5 a 0 0 14 0 0 0 0 0\nSTACK WIN 0 7e604 c 0 0 30 0 0 0 0 0\nSTACK WIN 0 7e615 d 0 0 4 0 0 0 0 0\nSTACK WIN 0 7e659 8 0 0 14 0 0 0 0 0\nSTACK WIN 0 7e69c 8 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7e6a9 8 0 0 14 0 0 0 0 0\nSTACK WIN 0 7e6b6 8 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7e6c3 6 0 0 8 0 0 0 0 0\nSTACK WIN 0 7e728 8 0 0 4 0 0 0 0 0\nSTACK WIN 0 7e735 8 0 0 8 0 0 0 0 0\nSTACK WIN 0 7e7f2 6 0 0 c 0 0 0 0 0\nSTACK WIN 0 7e7fd 6 0 0 10 0 0 0 0 0\nSTACK WIN 0 7e83b 8 0 0 4 0 0 0 0 0\nSTACK WIN 0 7e848 5 0 0 8 0 0 0 0 0\nSTACK WIN 0 7e878 5 0 0 10 0 0 0 0 0\nSTACK WIN 0 7e88d 5 0 0 18 0 0 0 0 0\nSTACK WIN 0 260c2 5 0 0 4 0 0 0 0 0\nSTACK WIN 0 7e8a8 5 0 0 14 0 0 0 0 0\nSTACK WIN 0 7e8b2 5 0 0 c 0 0 0 0 0\nSTACK WIN 0 7e98d 3 0 0 4 0 0 0 0 0\nSTACK WIN 0 7e9ae 8 0 0 8 0 0 0 0 0\nSTACK WIN 0 7e9da 8 0 0 10 0 0 0 0 0\nSTACK WIN 0 7e9e7 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 7ea40 8 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7ea4d 5 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7ea57 6 0 0 c 0 0 0 0 0\nSTACK WIN 0 7ea62 6 0 0 8 0 0 0 0 0\nSTACK WIN 0 7ea6d 6 0 0 10 0 0 0 0 0\nSTACK WIN 0 7ea78 6 0 0 18 0 0 0 0 0\nSTACK WIN 0 7ea83 6 0 0 4 0 0 0 0 0\nSTACK WIN 0 7ea8e 6 0 0 c 0 0 0 0 0\nSTACK WIN 0 7ea99 6 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7eaa4 6 0 0 14 0 0 0 0 0\nSTACK WIN 0 7eac6 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 7eacf c 0 0 20 0 0 0 0 0\nSTACK WIN 0 7eae0 d 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7eaf2 d 0 0 10 0 0 0 0 0\nSTACK WIN 0 7eb04 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 7eb3c d 0 0 14 0 0 0 0 0\nSTACK WIN 0 7eb4e d 0 0 c 0 0 0 0 0\nSTACK WIN 0 7eb60 5 0 0 c 0 0 0 0 0\nSTACK WIN 0 7eb6a 8 0 0 38 0 0 0 0 0\nSTACK WIN 0 7eb77 5 0 0 14 0 0 0 0 0\nSTACK WIN 0 7eb81 6 0 0 10 0 0 0 0 0\nSTACK WIN 0 7eb8c 8 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7ebbe 8 0 0 18 0 0 0 0 0\nSTACK WIN 0 7ebcb 8 0 0 4 0 0 0 0 0\nSTACK WIN 0 7ebd8 8 0 0 14 0 0 0 0 0\nSTACK WIN 0 7ebe5 8 0 0 10 0 0 0 0 0\nSTACK WIN 0 7ebf2 8 0 0 24 0 0 0 0 0\nSTACK WIN 0 7ebff 8 0 0 8 0 0 0 0 0\nSTACK WIN 0 7ec0c 8 0 0 c 0 0 0 0 0\nSTACK WIN 0 7ec19 3 0 0 18 0 0 0 0 0\nSTACK WIN 0 7ec21 8 0 0 4 0 0 0 0 0\nSTACK WIN 0 7ec4c 8 0 0 8 0 0 0 0 0\nSTACK WIN 0 7ec59 3 0 0 0 0 0 0 0 0\nSTACK WIN 0 7ec98 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 7ecbf 8 0 0 c 0 0 0 0 0\nSTACK WIN 0 7eccc 8 0 0 18 0 0 0 0 0\nSTACK WIN 0 7ecd9 8 0 0 24 0 0 0 0 0\nSTACK WIN 0 7ece6 8 0 0 10 0 0 0 0 0\nSTACK WIN 0 7ed3f 3 0 0 10 0 0 0 0 0\nSTACK WIN 0 7ed47 8 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7ed54 5 0 0 38 0 0 0 0 0\nSTACK WIN 0 7ed98 8 0 0 8 0 0 0 0 0\nSTACK WIN 0 7eda5 8 0 0 c 0 0 0 0 0\nSTACK WIN 0 7edb2 8 0 0 4 0 0 0 0 0\nSTACK WIN 0 7edbf 8 0 0 2c 0 0 0 0 0\nSTACK WIN 0 7edcc 8 0 0 14 0 0 0 0 0\nSTACK WIN 0 7edd9 8 0 0 8 0 0 0 0 0\nSTACK WIN 0 7ede6 8 0 0 10 0 0 0 0 0\nSTACK WIN 0 7ee61 6 0 0 10 0 0 0 0 0\nSTACK WIN 0 7ee6c 8 0 0 20 0 0 0 0 0\nSTACK WIN 0 7ee79 8 0 0 20 0 0 0 0 0\nSTACK WIN 0 7ee86 8 0 0 10 0 0 0 0 0\nSTACK WIN 0 7ee93 8 0 0 c 0 0 0 0 0\nSTACK WIN 0 7eea0 8 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7eead 6 0 0 4 0 0 0 0 0\nSTACK WIN 0 7eeb8 8 0 0 24 0 0 0 0 0\nSTACK WIN 0 7eec5 8 0 0 18 0 0 0 0 0\nSTACK WIN 0 7eed2 8 0 0 14 0 0 0 0 0\nSTACK WIN 0 7eedf 8 0 0 20 0 0 0 0 0\nSTACK WIN 0 7ef1e 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 7ef94 7 0 0 4 0 0 0 0 0\nSTACK WIN 0 7efa0 7 0 0 c 0 0 0 0 0\nSTACK WIN 0 7efac 7 0 0 8 0 0 0 0 0\nSTACK WIN 0 7efb8 7 0 0 10 0 0 0 0 0\nSTACK WIN 0 7efc4 7 0 0 28 0 0 0 0 0\nSTACK WIN 0 7efd0 7 0 0 20 0 0 0 0 0\nSTACK WIN 0 7efdc 6 0 0 4 0 0 0 0 0\nSTACK WIN 0 7efe7 6 0 0 18 0 0 0 0 0\nSTACK WIN 0 7f052 3 0 0 0 0 0 0 0 0\nSTACK WIN 0 7f05a 3 0 0 c 0 0 0 0 0\nSTACK WIN 0 7f062 6 0 0 2c 0 0 0 0 0\nSTACK WIN 0 7f06d 6 0 0 30 0 0 0 0 0\nSTACK WIN 0 7f078 3 0 0 8 0 0 0 0 0\nSTACK WIN 0 7f0b0 6 0 0 20 0 0 0 0 0\nSTACK WIN 0 7f0bb 5 0 0 4 0 0 0 0 0\nSTACK WIN 0 7f0c5 6 0 0 c 0 0 0 0 0\nSTACK WIN 0 7f0f5 3 0 0 14 0 0 0 0 0\nSTACK WIN 0 7f0fd 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 7f125 8 0 0 4 0 0 0 0 0\nSTACK WIN 0 7f132 5 0 0 2c 0 0 0 0 0\nSTACK WIN 0 7f13c 6 0 0 10 0 0 0 0 0\nSTACK WIN 0 7f147 6 0 0 8 0 0 0 0 0\nSTACK WIN 0 7f152 6 0 0 14 0 0 0 0 0\nSTACK WIN 0 7f19b c 0 0 4 0 0 0 0 0\nSTACK WIN 0 7f1ac 6 0 0 c 0 0 0 0 0\nSTACK WIN 0 7f1d0 6 0 0 4 0 0 0 0 0\nSTACK WIN 0 7f1db 6 0 0 4 0 0 0 0 0\nSTACK WIN 0 7f1e6 6 0 0 4 0 0 0 0 0\nSTACK WIN 0 7f1f1 6 0 0 10 0 0 0 0 0\nSTACK WIN 0 7f1fe 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 7f204 c 0 0 10 0 0 0 0 0\nSTACK WIN 0 7f215 6 0 0 8 0 0 0 0 0\nSTACK WIN 0 7f23b 6 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7f246 6 0 0 24 0 0 0 0 0\nSTACK WIN 0 7f251 6 0 0 8 0 0 0 0 0\nSTACK WIN 0 7f2c2 6 0 0 10 0 0 0 0 0\nSTACK WIN 0 7f2cd 8 0 0 4 0 0 0 0 0\nSTACK WIN 0 7f2da 6 0 0 10 0 0 0 0 0\nSTACK WIN 0 7f2e5 8 0 0 c 0 0 0 0 0\nSTACK WIN 0 7f3c0 7 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7f3cc 7 0 0 24 0 0 0 0 0\nSTACK WIN 0 7f49f 6 0 0 4 0 0 0 0 0\nSTACK WIN 0 7f4aa 6 0 0 18 0 0 0 0 0\nSTACK WIN 0 7f4b5 6 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7f4c0 6 0 0 8 0 0 0 0 0\nSTACK WIN 0 7f502 6 0 0 24 0 0 0 0 0\nSTACK WIN 0 7f50d 6 0 0 c 0 0 0 0 0\nSTACK WIN 0 7f536 6 0 0 14 0 0 0 0 0\nSTACK WIN 0 7f55c 6 0 0 10 0 0 0 0 0\nSTACK WIN 0 7f59d c 0 0 24 0 0 0 0 0\nSTACK WIN 0 7f5ae 6 0 0 1c 0 0 0 0 0\nSTACK WIN 0 7f5b9 6 0 0 c 0 0 0 0 0\nSTACK WIN 0 7f5c4 6 0 0 10 0 0 0 0 0\nSTACK WIN 0 7f5cf 6 0 0 4 0 0 0 0 0\nSTACK WIN 0 7f5da 6 0 0 8 0 0 0 0 0\nSTACK WIN 0 7f5e5 6 0 0 14 0 0 0 0 0\nSTACK WIN 0 7f5f0 6 0 0 18 0 0 0 0 0\nSTACK WIN 0 7f5fb 6 0 0 20 0 0 0 0 0\nSTACK WIN 0 7f606 f 0 0 10 0 0 0 0 0\nSTACK WIN 0 7f61a f 0 0 14 0 0 0 0 0\nSTACK WIN 0 7f62e d 0 0 0 0 0 0 0 0\nSTACK WIN 0 7f640 10 0 0 4 0 0 0 0 0\nSTACK WIN 0 7f655 f 0 0 18 0 0 0 0 0\nSTACK WIN 0 7f669 f 0 0 c 0 0 0 0 0\nSTACK WIN 0 7f67d f 0 0 4 0 0 0 0 0\nSTACK WIN 0 7f691 f 0 0 8 0 0 0 0 0\nSTACK WIN 0 7f6a5 8 0 0 5c 0 0 0 0 0\nSTACK WIN 0 7f6b2 c 0 0 2c 0 0 0 0 0\nSTACK WIN 0 7f6c3 6 0 0 28 0 0 0 0 0\nSTACK WIN 0 7f6ce 6 0 0 c 0 0 0 0 0\nSTACK WIN 0 7f6d9 5 0 0 30 0 0 0 0 0\nSTACK WIN 0 7f731 8 0 0 20 0 0 0 0 0\nSTACK WIN 0 7f782 8 0 0 4 0 0 0 0 0\nSTACK WIN 0 7f846 8 0 0 14 0 0 0 0 0\nSTACK WIN 0 39aa8 e6 a 0 c 1c 0 0 0 1\nSTACK WIN 0 dedf 70 3 0 8 c 0 0 0 0\nSTACK WIN 0 df4f 23 0 0 0 0 0 0 0 0\nSTACK WIN 0 7fc40 12 0 0 0 0 0 0 0 0\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/testdata/symbols/test_app.pdb/5A9832E5287241C1838ED98914E9B7FF1/test_app.sym",
    "content": "MODULE windows x86 5A9832E5287241C1838ED98914E9B7FF1 test_app.pdb\nFILE 1 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winbase.h\nFILE 2 c:\\program files\\microsoft visual studio 8\\vc\\include\\typeinfo\nFILE 3 c:\\breakpad\\trunk\\src\\common\\windows\\guid_string.h\nFILE 4 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcdce.h\nFILE 5 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winreg.h\nFILE 6 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\objidl.h\nFILE 7 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wtypes.h\nFILE 8 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\tvout.h\nFILE 9 c:\\program files\\microsoft visual studio 8\\vc\\include\\malloc.h\nFILE 10 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack2.h\nFILE 11 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winuser.h\nFILE 12 c:\\breakpad\\trunk\\src\\client\\windows\\handler\\exception_handler.cc\nFILE 13 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\urlmon.h\nFILE 14 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wincon.h\nFILE 15 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\imm.h\nFILE 16 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcdcep.h\nFILE 17 c:\\program files\\microsoft visual studio 8\\vc\\include\\xstring\nFILE 18 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winver.h\nFILE 19 c:\\program files\\microsoft visual studio 8\\vc\\include\\xmemory\nFILE 20 c:\\program files\\microsoft visual studio 8\\vc\\include\\new\nFILE 21 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack4.h\nFILE 22 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\reason.h\nFILE 23 c:\\program files\\microsoft visual studio 8\\vc\\include\\vector\nFILE 24 c:\\program files\\microsoft visual studio 8\\vc\\include\\memory\nFILE 25 c:\\program files\\microsoft visual studio 8\\vc\\include\\wtime.inl\nFILE 26 c:\\program files\\microsoft visual studio 8\\vc\\include\\iterator\nFILE 27 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\propidl.h\nFILE 28 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack1.h\nFILE 29 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\specstrings.h\nFILE 30 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\basetsd.h\nFILE 31 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winerror.h\nFILE 32 c:\\program files\\microsoft visual studio 8\\vc\\include\\assert.h\nFILE 33 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\poppack.h\nFILE 34 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstdio\nFILE 35 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdio.h\nFILE 36 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcnterr.h\nFILE 37 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcasync.h\nFILE 38 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcnsi.h\nFILE 39 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdlib.h\nFILE 40 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\servprov.h\nFILE 41 c:\\program files\\microsoft visual studio 8\\vc\\include\\limits.h\nFILE 42 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcndr.h\nFILE 43 c:\\breakpad\\trunk\\src\\client\\windows\\handler\\exception_handler.h\nFILE 44 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcnsip.h\nFILE 45 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\dbghelp.h\nFILE 46 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winnetwk.h\nFILE 47 c:\\program files\\microsoft visual studio 8\\vc\\include\\share.h\nFILE 48 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack8.h\nFILE 49 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\stralign.h\nFILE 50 c:\\breakpad\\trunk\\src\\google_breakpad\\common\\minidump_format.h\nFILE 51 c:\\breakpad\\trunk\\src\\google_breakpad\\common\\breakpad_types.h\nFILE 52 c:\\program files\\microsoft visual studio 8\\vc\\include\\xdebug\nFILE 53 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdarg.h\nFILE 54 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\windef.h\nFILE 55 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winsvc.h\nFILE 56 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wingdi.h\nFILE 57 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocinfo\nFILE 58 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocinfo.h\nFILE 59 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\oleidl.h\nFILE 60 c:\\program files\\microsoft visual studio 8\\vc\\include\\locale.h\nFILE 61 c:\\program files\\microsoft visual studio 8\\vc\\include\\string\nFILE 62 c:\\program files\\microsoft visual studio 8\\vc\\include\\istream\nFILE 63 c:\\breakpad\\trunk\\src\\common\\windows\\string_utils-inl.h\nFILE 64 c:\\program files\\microsoft visual studio 8\\vc\\include\\ostream\nFILE 65 c:\\program files\\microsoft visual studio 8\\vc\\include\\xutility\nFILE 66 c:\\program files\\microsoft visual studio 8\\vc\\include\\wchar.h\nFILE 67 c:\\program files\\microsoft visual studio 8\\vc\\include\\utility\nFILE 68 c:\\program files\\microsoft visual studio 8\\vc\\include\\ios\nFILE 69 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocnum\nFILE 70 c:\\program files\\microsoft visual studio 8\\vc\\include\\iosfwd\nFILE 71 c:\\program files\\microsoft visual studio 8\\vc\\include\\swprintf.inl\nFILE 72 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\guiddef.h\nFILE 73 c:\\program files\\microsoft visual studio 8\\vc\\include\\cwchar\nFILE 74 c:\\program files\\microsoft visual studio 8\\vc\\include\\climits\nFILE 75 c:\\program files\\microsoft visual studio 8\\vc\\include\\crtdbg.h\nFILE 76 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstdlib\nFILE 77 c:\\program files\\microsoft visual studio 8\\vc\\include\\streambuf\nFILE 78 c:\\program files\\microsoft visual studio 8\\vc\\include\\xiosbase\nFILE 79 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocale\nFILE 80 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstring\nFILE 81 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\mcx.h\nFILE 82 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdexcept\nFILE 83 c:\\program files\\microsoft visual studio 8\\vc\\include\\exception\nFILE 84 c:\\program files\\microsoft visual studio 8\\vc\\include\\xstddef\nFILE 85 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\objbase.h\nFILE 86 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstddef\nFILE 87 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\unknwn.h\nFILE 88 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpc.h\nFILE 89 c:\\program files\\microsoft visual studio 8\\vc\\include\\stddef.h\nFILE 90 c:\\program files\\microsoft visual studio 8\\vc\\include\\cassert\nFILE 91 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\ole2.h\nFILE 92 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\windows.h\nFILE 93 c:\\program files\\microsoft visual studio 8\\vc\\include\\yvals.h\nFILE 94 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\oleauto.h\nFILE 95 c:\\program files\\microsoft visual studio 8\\vc\\include\\excpt.h\nFILE 96 c:\\program files\\microsoft visual studio 8\\vc\\include\\use_ansi.h\nFILE 97 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\cguid.h\nFILE 98 c:\\program files\\microsoft visual studio 8\\vc\\include\\crtdefs.h\nFILE 99 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\msxml.h\nFILE 100 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\oaidl.h\nFILE 101 c:\\program files\\microsoft visual studio 8\\vc\\include\\sal.h\nFILE 102 c:\\program files\\microsoft visual studio 8\\vc\\include\\vadefs.h\nFILE 103 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winnt.h\nFILE 104 c:\\program files\\microsoft visual studio 8\\vc\\include\\ctype.h\nFILE 105 c:\\program files\\microsoft visual studio 8\\vc\\include\\eh.h\nFILE 106 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winnls.h\nFILE 107 c:\\program files\\microsoft visual studio 8\\vc\\include\\string.h\nFILE 108 c:\\program files\\microsoft visual studio 8\\vc\\include\\ctype.h\nFILE 109 c:\\program files\\microsoft visual studio 8\\vc\\include\\xutility\nFILE 110 c:\\program files\\microsoft visual studio 8\\vc\\include\\utility\nFILE 111 c:\\program files\\microsoft visual studio 8\\vc\\include\\iosfwd\nFILE 112 c:\\program files\\microsoft visual studio 8\\vc\\include\\cwchar\nFILE 113 c:\\program files\\microsoft visual studio 8\\vc\\include\\crtdbg.h\nFILE 114 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdexcept\nFILE 115 c:\\program files\\microsoft visual studio 8\\vc\\include\\exception\nFILE 116 c:\\program files\\microsoft visual studio 8\\vc\\include\\xstddef\nFILE 117 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstddef\nFILE 118 c:\\program files\\microsoft visual studio 8\\vc\\include\\stddef.h\nFILE 119 c:\\program files\\microsoft visual studio 8\\vc\\include\\eh.h\nFILE 120 c:\\program files\\microsoft visual studio 8\\vc\\include\\streambuf\nFILE 121 c:\\program files\\microsoft visual studio 8\\vc\\include\\xiosbase\nFILE 122 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocale\nFILE 123 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstring\nFILE 124 c:\\program files\\microsoft visual studio 8\\vc\\include\\string.h\nFILE 125 c:\\program files\\microsoft visual studio 8\\vc\\include\\typeinfo\nFILE 126 c:\\breakpad\\trunk\\src\\common\\windows\\guid_string.cc\nFILE 127 c:\\breakpad\\trunk\\src\\common\\windows\\string_utils-inl.h\nFILE 128 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdarg.h\nFILE 129 c:\\program files\\microsoft visual studio 8\\vc\\include\\string\nFILE 130 c:\\program files\\microsoft visual studio 8\\vc\\include\\istream\nFILE 131 c:\\program files\\microsoft visual studio 8\\vc\\include\\ostream\nFILE 132 c:\\program files\\microsoft visual studio 8\\vc\\include\\ios\nFILE 133 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocnum\nFILE 134 c:\\program files\\microsoft visual studio 8\\vc\\include\\climits\nFILE 135 c:\\program files\\microsoft visual studio 8\\vc\\include\\yvals.h\nFILE 136 c:\\program files\\microsoft visual studio 8\\vc\\include\\use_ansi.h\nFILE 137 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstdlib\nFILE 138 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdlib.h\nFILE 139 c:\\program files\\microsoft visual studio 8\\vc\\include\\malloc.h\nFILE 140 c:\\breakpad\\trunk\\src\\common\\windows\\guid_string.h\nFILE 141 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\guiddef.h\nFILE 142 c:\\program files\\microsoft visual studio 8\\vc\\include\\share.h\nFILE 143 c:\\program files\\microsoft visual studio 8\\vc\\include\\xstring\nFILE 144 c:\\program files\\microsoft visual studio 8\\vc\\include\\xmemory\nFILE 145 c:\\program files\\microsoft visual studio 8\\vc\\include\\new\nFILE 146 c:\\program files\\microsoft visual studio 8\\vc\\include\\locale.h\nFILE 147 c:\\program files\\microsoft visual studio 8\\vc\\include\\swprintf.inl\nFILE 148 c:\\program files\\microsoft visual studio 8\\vc\\include\\limits.h\nFILE 149 c:\\program files\\microsoft visual studio 8\\vc\\include\\wchar.h\nFILE 150 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstdio\nFILE 151 c:\\program files\\microsoft visual studio 8\\vc\\include\\crtdefs.h\nFILE 152 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdio.h\nFILE 153 c:\\program files\\microsoft visual studio 8\\vc\\include\\wtime.inl\nFILE 154 c:\\program files\\microsoft visual studio 8\\vc\\include\\sal.h\nFILE 155 c:\\program files\\microsoft visual studio 8\\vc\\include\\xdebug\nFILE 156 c:\\program files\\microsoft visual studio 8\\vc\\include\\vadefs.h\nFILE 157 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocinfo\nFILE 158 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocinfo.h\nFILE 159 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winnetwk.h\nFILE 160 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\urlmon.h\nFILE 161 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack8.h\nFILE 162 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\cderr.h\nFILE 163 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\shellapi.h\nFILE 164 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\dde.h\nFILE 165 c:\\program files\\microsoft visual studio 8\\vc\\include\\vector\nFILE 166 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdio.h\nFILE 167 c:\\program files\\microsoft visual studio 8\\vc\\include\\memory\nFILE 168 c:\\program files\\microsoft visual studio 8\\vc\\include\\iterator\nFILE 169 c:\\program files\\microsoft visual studio 8\\vc\\include\\malloc.h\nFILE 170 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdarg.h\nFILE 171 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\windef.h\nFILE 172 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wingdi.h\nFILE 173 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\imm.h\nFILE 174 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\mmsystem.h\nFILE 175 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winioctl.h\nFILE 176 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\guiddef.h\nFILE 177 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winsmcrd.h\nFILE 178 c:\\test_app.cc\nFILE 179 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\oaidl.h\nFILE 180 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\nb30.h\nFILE 181 c:\\program files\\microsoft visual studio 8\\vc\\include\\xstring\nFILE 182 c:\\program files\\microsoft visual studio 8\\vc\\include\\xmemory\nFILE 183 c:\\program files\\microsoft visual studio 8\\vc\\include\\new\nFILE 184 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\oleidl.h\nFILE 185 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winnls.h\nFILE 186 c:\\breakpad\\trunk\\src\\google_breakpad\\common\\minidump_format.h\nFILE 187 c:\\program files\\microsoft visual studio 8\\vc\\include\\string.h\nFILE 188 c:\\breakpad\\trunk\\src\\google_breakpad\\common\\breakpad_types.h\nFILE 189 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winnt.h\nFILE 190 c:\\program files\\microsoft visual studio 8\\vc\\include\\ctype.h\nFILE 191 c:\\program files\\microsoft visual studio 8\\vc\\include\\wtime.inl\nFILE 192 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winbase.h\nFILE 193 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\propidl.h\nFILE 194 c:\\breakpad\\trunk\\src\\client\\windows\\handler\\exception_handler.h\nFILE 195 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdlib.h\nFILE 196 c:\\program files\\microsoft visual studio 8\\vc\\include\\swprintf.inl\nFILE 197 c:\\program files\\microsoft visual studio 8\\vc\\include\\limits.h\nFILE 198 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winreg.h\nFILE 199 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpc.h\nFILE 200 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\ole2.h\nFILE 201 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winscard.h\nFILE 202 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\objbase.h\nFILE 203 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wtypes.h\nFILE 204 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcndr.h\nFILE 205 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcdce.h\nFILE 206 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcnsip.h\nFILE 207 c:\\program files\\microsoft visual studio 8\\vc\\include\\share.h\nFILE 208 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\tvout.h\nFILE 209 c:\\program files\\microsoft visual studio 8\\vc\\include\\use_ansi.h\nFILE 210 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winefs.h\nFILE 211 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack2.h\nFILE 212 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\commdlg.h\nFILE 213 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\unknwn.h\nFILE 214 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winsock.h\nFILE 215 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\stralign.h\nFILE 216 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winuser.h\nFILE 217 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\servprov.h\nFILE 218 c:\\program files\\microsoft visual studio 8\\vc\\include\\xdebug\nFILE 219 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winsvc.h\nFILE 220 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wincon.h\nFILE 221 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocinfo\nFILE 222 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocinfo.h\nFILE 223 c:\\program files\\microsoft visual studio 8\\vc\\include\\locale.h\nFILE 224 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\cguid.h\nFILE 225 c:\\program files\\microsoft visual studio 8\\vc\\include\\string\nFILE 226 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winver.h\nFILE 227 c:\\program files\\microsoft visual studio 8\\vc\\include\\istream\nFILE 228 c:\\program files\\microsoft visual studio 8\\vc\\include\\ostream\nFILE 229 c:\\program files\\microsoft visual studio 8\\vc\\include\\xutility\nFILE 230 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winperf.h\nFILE 231 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack4.h\nFILE 232 c:\\program files\\microsoft visual studio 8\\vc\\include\\utility\nFILE 233 c:\\program files\\microsoft visual studio 8\\vc\\include\\ios\nFILE 234 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocnum\nFILE 235 c:\\program files\\microsoft visual studio 8\\vc\\include\\crtdbg.h\nFILE 236 c:\\program files\\microsoft visual studio 8\\vc\\include\\iosfwd\nFILE 237 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcdcep.h\nFILE 238 c:\\program files\\microsoft visual studio 8\\vc\\include\\cwchar\nFILE 239 c:\\program files\\microsoft visual studio 8\\vc\\include\\climits\nFILE 240 c:\\program files\\microsoft visual studio 8\\vc\\include\\wchar.h\nFILE 241 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstdlib\nFILE 242 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\mcx.h\nFILE 243 c:\\program files\\microsoft visual studio 8\\vc\\include\\streambuf\nFILE 244 c:\\program files\\microsoft visual studio 8\\vc\\include\\xiosbase\nFILE 245 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\reason.h\nFILE 246 c:\\program files\\microsoft visual studio 8\\vc\\include\\xlocale\nFILE 247 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\dlgs.h\nFILE 248 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstring\nFILE 249 c:\\program files\\microsoft visual studio 8\\vc\\include\\stdexcept\nFILE 250 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\pshpack1.h\nFILE 251 c:\\program files\\microsoft visual studio 8\\vc\\include\\exception\nFILE 252 c:\\program files\\microsoft visual studio 8\\vc\\include\\xstddef\nFILE 253 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\specstrings.h\nFILE 254 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstddef\nFILE 255 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\basetsd.h\nFILE 256 c:\\program files\\microsoft visual studio 8\\vc\\include\\stddef.h\nFILE 257 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winerror.h\nFILE 258 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\wincrypt.h\nFILE 259 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\poppack.h\nFILE 260 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\winspool.h\nFILE 261 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\oleauto.h\nFILE 262 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\prsht.h\nFILE 263 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\objidl.h\nFILE 264 c:\\program files\\microsoft visual studio 8\\vc\\include\\cstdio\nFILE 265 c:\\program files\\microsoft visual studio 8\\vc\\include\\yvals.h\nFILE 266 c:\\program files\\microsoft visual studio 8\\vc\\include\\eh.h\nFILE 267 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\lzexpand.h\nFILE 268 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\ddeml.h\nFILE 269 c:\\program files\\microsoft visual studio 8\\vc\\include\\crtdefs.h\nFILE 270 c:\\program files\\microsoft visual studio 8\\vc\\include\\sal.h\nFILE 271 c:\\program files\\microsoft visual studio 8\\vc\\include\\vadefs.h\nFILE 272 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\dbghelp.h\nFILE 273 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcnterr.h\nFILE 274 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcasync.h\nFILE 275 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\rpcnsi.h\nFILE 276 c:\\program files\\microsoft visual studio 8\\vc\\include\\typeinfo\nFILE 277 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\windows.h\nFILE 278 c:\\program files\\microsoft visual studio 8\\vc\\include\\excpt.h\nFILE 279 c:\\program files\\microsoft visual studio 8\\vc\\platformsdk\\include\\msxml.h\nFILE 280 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xdebug\nFILE 281 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\streambuf\nFILE 282 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xiosbase\nFILE 283 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xlocale\nFILE 284 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cstring\nFILE 285 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 286 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xlocinfo\nFILE 287 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xlocinfo.h\nFILE 288 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 289 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\share.h\nFILE 290 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\use_ansi.h\nFILE 291 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.cpp\nFILE 292 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\typeinfo\nFILE 293 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xutility\nFILE 294 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\utility\nFILE 295 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\iosfwd\nFILE 296 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cwchar\nFILE 297 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 298 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdexcept\nFILE 299 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\exception\nFILE 300 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xstddef\nFILE 301 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cstddef\nFILE 302 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 303 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\istream\nFILE 304 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ostream\nFILE 305 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ios\nFILE 306 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xlocnum\nFILE 307 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\eh.h\nFILE 308 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cstdlib\nFILE 309 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 310 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\climits\nFILE 311 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\yvals.h\nFILE 312 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 313 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 314 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 315 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 316 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 317 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cstdio\nFILE 318 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 319 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 320 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 321 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 322 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 323 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 324 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 325 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xstring\nFILE 326 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xmemory\nFILE 327 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\new\nFILE 328 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 329 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 330 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 331 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 332 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 333 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 334 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 335 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 336 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 337 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 338 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 339 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 340 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 341 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 342 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 343 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 344 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sect_attribs.h\nFILE 345 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 346 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 347 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 348 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 349 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 350 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\tran\\i386\\cpu_disp.c\nFILE 351 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 352 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 353 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 354 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 355 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 356 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 357 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 358 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 359 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 360 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 361 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 362 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 363 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 364 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 365 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 366 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 367 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 368 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 369 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 370 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 371 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 372 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 373 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 374 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 375 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 376 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 377 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 378 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 379 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 380 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 381 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 382 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 383 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 384 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 385 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sect_attribs.h\nFILE 386 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 387 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 388 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 389 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 390 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 391 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\tran\\i386\\mathfcns.c\nFILE 392 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 393 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 394 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 395 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 396 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 397 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 398 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 399 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 400 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 401 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 402 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 403 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 404 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 405 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 406 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 407 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 408 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 409 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 410 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 411 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 412 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 413 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 414 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 415 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 416 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctime.h\nFILE 417 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 418 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\time.h\nFILE 419 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 420 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 421 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 422 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\time.inl\nFILE 423 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 424 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 425 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 426 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 427 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 428 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 429 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 430 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 431 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 432 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 433 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 434 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 435 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 436 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 437 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 438 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 439 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 440 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tzset.c\nFILE 441 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 442 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 443 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 444 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 445 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 446 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 447 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 448 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 449 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 450 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 451 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 452 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 453 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 454 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 455 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 456 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 457 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 458 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 459 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\time.inl\nFILE 460 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 461 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 462 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 463 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 464 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 465 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 466 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 467 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 468 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 469 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 470 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 471 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 472 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 473 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 474 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 475 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 476 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 477 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 478 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 479 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 480 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 481 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 482 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 483 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 484 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 485 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 486 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 487 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\timeset.c\nFILE 488 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 489 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 490 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 491 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 492 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 493 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 494 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 495 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 496 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 497 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 498 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 499 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 500 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 501 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\time.h\nFILE 502 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 503 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 504 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\time.h\nFILE 505 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 506 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 507 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 508 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 509 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 510 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 511 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 512 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 513 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 514 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 515 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 516 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strftime.c\nFILE 517 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 518 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 519 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 520 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 521 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 522 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 523 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 524 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 525 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\time.inl\nFILE 526 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 527 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 528 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 529 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 530 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 531 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 532 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 533 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 534 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 535 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 536 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 537 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 538 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 539 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 540 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 541 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 542 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 543 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 544 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 545 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 546 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 547 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 548 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 549 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 550 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 551 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 552 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 553 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 554 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 555 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 556 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 557 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 558 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 559 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 560 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 561 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 562 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 563 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 564 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 565 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 566 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 567 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 568 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\days.c\nFILE 569 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 570 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 571 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 572 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 573 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 574 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 575 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 576 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 577 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 578 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 579 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 580 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 581 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 582 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 583 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 584 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 585 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 586 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 587 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 588 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 589 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 590 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 591 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 592 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 593 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 594 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 595 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 596 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 597 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 598 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 599 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 600 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 601 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 602 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 603 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strnicol.c\nFILE 604 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 605 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 606 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 607 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 608 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 609 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 610 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 611 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 612 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 613 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 614 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 615 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 616 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 617 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 618 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 619 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 620 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 621 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 622 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 623 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 624 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 625 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 626 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 627 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 628 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 629 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 630 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 631 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 632 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 633 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 634 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 635 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 636 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 637 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 638 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 639 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 640 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 641 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 642 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 643 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 644 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 645 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 646 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 647 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 648 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 649 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 650 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strnicmp.c\nFILE 651 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 652 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 653 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 654 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 655 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 656 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 657 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 658 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 659 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 660 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 661 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 662 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 663 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 664 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 665 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 666 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 667 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 668 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 669 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 670 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 671 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 672 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 673 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 674 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 675 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 676 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 677 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 678 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 679 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 680 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 681 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 682 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 683 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 684 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 685 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 686 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 687 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 688 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 689 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 690 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 691 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 692 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 693 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stricmp.c\nFILE 694 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 695 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 696 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 697 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 698 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 699 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 700 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 701 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 702 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 703 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 704 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 705 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 706 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 707 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 708 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 709 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 710 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 711 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 712 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 713 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 714 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 715 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 716 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 717 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 718 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 719 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 720 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 721 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 722 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 723 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 724 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 725 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 726 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 727 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 728 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 729 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 730 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 731 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wcslen.c\nFILE 732 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 733 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 734 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 735 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 736 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 737 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 738 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 739 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tcsncpy_s.inl\nFILE 740 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 741 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 742 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 743 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 744 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 745 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal_securecrt.h\nFILE 746 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 747 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 748 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 749 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 750 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 751 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 752 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 753 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 754 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 755 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 756 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 757 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 758 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strncpy_s.c\nFILE 759 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 760 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 761 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 762 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 763 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 764 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 765 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 766 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 767 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 768 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 769 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 770 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 771 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 772 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 773 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 774 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 775 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 776 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 777 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 778 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 779 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 780 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 781 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tcscpy_s.inl\nFILE 782 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 783 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 784 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 785 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 786 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 787 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal_securecrt.h\nFILE 788 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 789 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 790 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 791 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 792 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 793 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 794 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 795 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 796 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 797 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 798 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 799 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 800 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strcpy_s.c\nFILE 801 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 802 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 803 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 804 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 805 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 806 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 807 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 808 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 809 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 810 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 811 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 812 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 813 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 814 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 815 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 816 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 817 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 818 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 819 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 820 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 821 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 822 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 823 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tcscat_s.inl\nFILE 824 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 825 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 826 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 827 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 828 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 829 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal_securecrt.h\nFILE 830 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 831 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 832 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 833 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 834 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 835 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 836 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 837 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 838 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 839 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 840 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 841 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 842 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strcat_s.c\nFILE 843 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 844 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 845 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 846 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 847 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 848 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 849 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 850 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 851 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 852 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 853 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 854 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 855 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 856 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 857 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 858 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 859 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 860 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 861 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 862 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 863 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 864 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strlen_s.c\nFILE 865 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 866 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 867 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 868 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\strpbrk.asm\nFILE 869 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\Intel\\STRSPN.ASM\nFILE 870 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 871 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\_strnicm.asm\nFILE 872 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 873 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 874 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 875 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 876 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\intel\\strncmp.c\nFILE 877 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 878 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 879 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 880 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\strlen.asm\nFILE 881 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 882 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 883 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 884 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 885 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 886 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 887 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 888 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 889 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 890 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 891 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 892 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 893 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 894 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 895 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 896 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 897 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 898 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 899 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 900 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 901 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strdup.c\nFILE 902 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 903 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 904 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 905 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 906 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 907 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 908 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 909 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 910 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 911 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 912 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 913 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 914 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 915 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 916 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 917 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 918 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 919 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 920 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 921 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 922 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 923 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\strcspn.asm\nFILE 924 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\Intel\\STRSPN.ASM\nFILE 925 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 926 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\strcmp.asm\nFILE 927 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 928 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\strchr.asm\nFILE 929 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 930 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\string\\i386\\p4_memset.c\nFILE 931 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 932 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 933 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 934 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\memset.asm\nFILE 935 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 936 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 937 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 938 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 939 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 940 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 941 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 942 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 943 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 944 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 945 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 946 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 947 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 948 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 949 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 950 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 951 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 952 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 953 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 954 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 955 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\memmove_s.c\nFILE 956 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 957 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 958 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 959 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 960 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 961 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 962 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 963 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 964 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 965 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 966 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 967 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 968 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 969 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 970 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 971 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 972 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 973 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 974 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 975 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 976 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\memmove.asm\nFILE 977 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\Intel\\MEMCPY.ASM\nFILE 978 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 979 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\string\\i386\\memcmp.c\nFILE 980 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 981 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 982 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 983 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 984 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 985 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 986 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 987 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 988 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 989 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 990 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 991 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 992 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 993 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 994 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 995 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 996 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 997 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 998 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 999 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1000 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1001 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1002 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\memcpy_s.c\nFILE 1003 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1004 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1005 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1006 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1007 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1008 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1009 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1010 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1011 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1012 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1013 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1014 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1015 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1016 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1017 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1018 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1019 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1020 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1021 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1022 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1023 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\string\\i386\\p4_memcpy.c\nFILE 1024 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1025 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 1026 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 1027 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\memcpy.asm\nFILE 1028 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 1029 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1030 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1031 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1032 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1033 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1034 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1035 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1036 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1037 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1038 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1039 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1040 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\woutputs.c\nFILE 1041 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 1042 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1043 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1044 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1045 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1046 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1047 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1048 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1049 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1050 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1051 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1052 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1053 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\output.c\nFILE 1054 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1055 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1056 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1057 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1058 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1059 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1060 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1061 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1062 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1063 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1064 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1065 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1066 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1067 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1068 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1069 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1070 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cvt.h\nFILE 1071 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 1072 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1073 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1074 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 1075 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 1076 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1077 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1078 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1079 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1080 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1081 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1082 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1083 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 1084 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1085 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1086 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1087 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1088 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1089 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1090 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1091 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1092 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1093 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1094 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1095 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\woutputp.c\nFILE 1096 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 1097 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1098 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1099 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1100 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1101 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1102 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1103 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1104 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1105 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1106 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1107 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1108 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\output.c\nFILE 1109 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1110 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1111 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1112 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1113 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1114 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1115 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1116 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1117 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1118 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1119 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1120 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1121 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1122 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1123 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1124 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1125 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cvt.h\nFILE 1126 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 1127 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1128 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1129 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 1130 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 1131 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1132 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1133 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1134 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1135 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1136 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1137 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1138 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 1139 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1140 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1141 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1142 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1143 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1144 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1145 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1146 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1147 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1148 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1149 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1150 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\woutput.c\nFILE 1151 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 1152 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1153 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1154 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1155 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1156 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1157 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1158 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1159 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1160 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1161 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1162 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1163 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\output.c\nFILE 1164 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1165 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1166 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1167 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1168 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1169 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1170 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1171 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1172 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1173 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1174 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1175 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1176 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1177 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1178 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1179 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1180 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cvt.h\nFILE 1181 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 1182 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1183 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1184 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 1185 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 1186 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1187 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1188 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1189 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1190 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1191 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1192 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1193 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 1194 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1195 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1196 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1197 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1198 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1199 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1200 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1201 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1202 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1203 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1204 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1205 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 1206 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\outputs.c\nFILE 1207 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1208 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1209 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1210 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1211 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1212 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1213 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1214 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1215 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1216 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1217 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1218 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\output.c\nFILE 1219 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1220 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1221 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1222 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1223 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1224 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1225 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1226 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1227 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1228 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1229 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1230 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1231 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1232 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1233 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1234 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cvt.h\nFILE 1235 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 1236 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1237 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1238 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 1239 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 1240 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1241 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1242 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1243 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1244 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1245 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1246 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1247 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1248 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1249 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1250 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1251 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1252 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1253 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1254 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1255 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1256 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1257 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1258 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 1259 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\outputp.c\nFILE 1260 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1261 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1262 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1263 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1264 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1265 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1266 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1267 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1268 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1269 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1270 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1271 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\output.c\nFILE 1272 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1273 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1274 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1275 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1276 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1277 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1278 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1279 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1280 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1281 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1282 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1283 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1284 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1285 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1286 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1287 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cvt.h\nFILE 1288 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 1289 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1290 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1291 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 1292 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 1293 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1294 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1295 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1296 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1297 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1298 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1299 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1300 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1301 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1302 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1303 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1304 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1305 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1306 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1307 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1308 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1309 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1310 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1311 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 1312 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\output.c\nFILE 1313 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1314 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1315 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1316 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1317 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1318 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1319 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1320 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1321 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1322 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1323 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1324 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1325 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1326 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1327 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1328 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1329 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1330 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1331 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1332 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1333 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1334 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1335 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1336 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1337 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1338 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1339 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cvt.h\nFILE 1340 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 1341 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1342 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1343 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 1344 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 1345 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1346 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1347 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1348 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1349 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1350 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1351 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1352 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1353 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1354 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1355 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1356 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1357 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1358 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1359 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1360 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1361 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1362 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1363 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1364 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1365 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1366 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1367 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1368 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 1369 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1370 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1371 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1372 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1373 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1374 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vswprnc.c\nFILE 1375 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1376 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1377 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1378 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1379 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1380 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vswprint.c\nFILE 1381 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1382 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1383 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1384 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1385 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1386 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1387 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1388 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1389 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1390 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1391 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1392 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1393 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1394 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1395 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1396 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1397 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1398 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1399 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1400 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1401 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1402 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1403 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1404 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1405 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1406 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1407 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1408 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1409 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1410 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1411 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1412 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1413 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1414 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1415 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1416 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1417 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1418 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1419 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1420 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1421 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1422 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1423 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1424 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1425 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vswprint.c\nFILE 1426 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1427 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1428 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1429 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1430 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1431 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1432 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1433 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1434 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1435 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1436 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1437 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1438 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1439 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1440 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1441 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1442 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 1443 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1444 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1445 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1446 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1447 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1448 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1449 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1450 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1451 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1452 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1453 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1454 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1455 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1456 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1457 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1458 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1459 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1460 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1461 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1462 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vfprintf.c\nFILE 1463 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1464 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1465 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1466 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1467 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1468 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1469 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1470 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1471 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1472 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1473 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1474 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1475 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1476 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1477 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1478 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1479 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1480 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1481 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1482 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1483 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1484 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1485 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1486 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1487 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1488 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1489 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1490 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1491 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1492 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1493 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1494 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1495 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1496 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1497 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1498 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1499 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1500 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1501 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1502 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1503 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1504 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1505 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1506 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1507 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vprintf.c\nFILE 1508 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1509 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1510 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1511 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1512 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1513 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1514 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1515 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1516 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1517 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1518 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1519 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1520 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1521 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1522 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1523 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1524 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1525 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1526 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1527 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1528 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1529 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1530 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1531 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1532 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1533 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1534 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1535 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1536 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1537 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1538 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1539 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1540 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1541 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1542 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1543 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1544 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1545 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1546 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1547 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1548 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1549 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1550 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1551 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1552 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1553 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1554 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1555 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1556 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1557 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1558 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1559 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1560 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1561 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1562 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1563 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1564 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.c\nFILE 1565 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1566 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1567 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1568 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1569 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1570 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1571 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1572 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1573 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1574 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1575 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1576 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1577 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1578 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1579 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1580 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1581 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 1582 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1583 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1584 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1585 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1586 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1587 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1588 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1589 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1590 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1591 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1592 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1593 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1594 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1595 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1596 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1597 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1598 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1599 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1600 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1601 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\printf.c\nFILE 1602 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1603 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1604 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1605 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1606 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1607 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1608 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1609 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1610 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1611 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1612 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1613 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1614 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1615 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1616 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1617 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1618 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1619 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1620 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1621 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1622 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1623 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1624 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1625 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1626 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1627 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\process.h\nFILE 1628 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1629 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1630 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1631 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1632 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1633 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1634 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1635 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1636 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1637 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1638 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1639 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1640 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1641 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1642 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1643 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1644 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1645 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1646 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1647 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1648 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fprintf.c\nFILE 1649 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1650 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1651 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1652 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1653 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1654 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1655 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1656 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1657 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1658 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1659 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1660 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1661 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1662 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1663 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1664 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1665 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1666 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1667 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1668 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1669 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1670 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 1671 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1672 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1673 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1674 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1675 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1676 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1677 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1678 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1679 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1680 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1681 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1682 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1683 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1684 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1685 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1686 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1687 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1688 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 1689 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1690 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1691 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1692 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1693 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1694 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1695 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1696 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1697 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1698 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1699 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1700 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1701 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1702 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1703 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1704 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fflush.c\nFILE 1705 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1706 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 1707 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1708 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1709 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1710 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1711 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1712 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1713 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1714 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1715 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1716 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1717 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1718 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1719 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1720 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1721 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1722 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1723 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1724 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1725 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1726 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1727 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1728 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1729 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1730 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1731 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1732 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1733 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1734 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1735 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1736 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1737 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1738 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1739 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1740 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1741 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1742 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1743 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1744 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1745 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1746 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1747 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1748 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1749 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1750 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1751 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1752 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fclose.c\nFILE 1753 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1754 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1755 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1756 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1757 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1758 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1759 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1760 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1761 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1762 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1763 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1764 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1765 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1766 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1767 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1768 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 1769 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1770 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1771 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1772 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1773 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1774 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1775 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1776 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1777 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1778 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1779 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1780 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1781 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1782 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1783 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1784 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1785 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1786 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1787 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1788 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 1789 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1790 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1791 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1792 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\closeall.c\nFILE 1793 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1794 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1795 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1796 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1797 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1798 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1799 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1800 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1801 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1802 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1803 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1804 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1805 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1806 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1807 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1808 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1809 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1810 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1811 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1812 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1813 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1814 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1815 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1816 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1817 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1818 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1819 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1820 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1821 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1822 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1823 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1824 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1825 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1826 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1827 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1828 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1829 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1830 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1831 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1832 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1833 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1834 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 1835 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1836 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1837 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1838 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1839 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1840 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 1841 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1842 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1843 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1844 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1845 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1846 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1847 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1848 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1849 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1850 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_sftbuf.c\nFILE 1851 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1852 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1853 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1854 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1855 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1856 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1857 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1858 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1859 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1860 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1861 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1862 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1863 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1864 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1865 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1866 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1867 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1868 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1869 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1870 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1871 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1872 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1873 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 1874 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1875 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1876 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1877 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1878 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1879 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1880 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1881 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1882 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1883 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1884 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1885 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1886 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1887 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1888 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1889 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1890 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1891 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1892 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1893 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_getbuf.c\nFILE 1894 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1895 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1896 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1897 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1898 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1899 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1900 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1901 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1902 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1903 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1904 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1905 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1906 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1907 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1908 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1909 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1910 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1911 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1912 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1913 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1914 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1915 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1916 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1917 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1918 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1919 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 1920 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 1921 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1922 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1923 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1924 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 1925 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 1926 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 1927 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_freebuf.c\nFILE 1928 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1929 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1930 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 1931 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1932 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1933 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1934 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1935 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1936 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1937 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1938 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 1939 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1940 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1941 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1942 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1943 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1944 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1945 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1946 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1947 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1948 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1949 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1950 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1951 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1952 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1953 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1954 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1955 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 1956 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 1957 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 1958 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 1959 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 1960 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 1961 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 1962 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 1963 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 1964 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 1965 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 1966 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 1967 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 1968 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 1969 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 1970 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 1971 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 1972 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 1973 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 1974 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 1975 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 1976 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 1977 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 1978 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 1979 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 1980 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_flsbuf.c\nFILE 1981 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 1982 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 1983 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 1984 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 1985 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 1986 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 1987 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 1988 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 1989 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_flswbuf.c\nFILE 1990 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 1991 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 1992 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 1993 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 1994 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 1995 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 1996 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 1997 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 1998 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 1999 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2000 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2001 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 2002 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 2003 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2004 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2005 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2006 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2007 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2008 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2009 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2010 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2011 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2012 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2013 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2014 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2015 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2016 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2017 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2018 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2019 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2020 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2021 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2022 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2023 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2024 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2025 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 2026 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 2027 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2028 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 2029 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 2030 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2031 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2032 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2033 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2034 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2035 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2036 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2037 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 2038 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2039 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2040 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2041 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_flsbuf.c\nFILE 2042 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2043 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2044 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2045 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2046 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2047 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2048 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2049 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2050 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2051 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2052 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 2053 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 2054 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2055 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2056 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2057 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2058 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2059 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2060 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2061 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2062 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2063 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2064 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2065 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2066 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2067 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2068 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2069 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2070 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2071 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2072 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2073 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2074 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2075 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2076 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2077 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2078 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2079 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 2080 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 2081 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2082 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2083 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2084 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2085 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2086 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2087 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_file.c\nFILE 2088 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2089 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2090 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2091 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2092 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2093 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2094 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2095 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2096 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2097 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2098 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2099 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2100 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2101 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2102 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2103 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2104 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2105 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2106 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2107 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2108 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2109 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2110 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2111 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2112 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2113 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2114 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2115 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2116 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2117 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2118 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2119 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2120 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2121 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2122 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2123 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2124 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fputwc.c\nFILE 2125 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2126 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2127 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2128 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2129 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2130 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 2131 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2132 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2133 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 2134 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2135 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2136 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 2137 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 2138 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2139 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2140 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 2141 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2142 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2143 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2144 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2145 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2146 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2147 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2148 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2149 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2150 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2151 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2152 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 2153 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2154 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2155 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2156 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 2157 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2158 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2159 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2160 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2161 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2162 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2163 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2164 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2165 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2166 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2167 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2168 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2169 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2170 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2171 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2172 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2173 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2174 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2175 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2176 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fileno.c\nFILE 2177 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2178 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2179 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2180 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2181 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2182 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2183 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2184 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2185 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2186 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2187 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2188 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2189 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2190 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2191 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2192 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2193 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2194 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2195 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2196 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2197 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2198 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2199 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2200 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2201 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2202 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2203 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2204 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2205 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2206 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2207 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 2208 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2209 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2210 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2211 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2212 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2213 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2214 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2215 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2216 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2217 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2218 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 2219 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2220 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2221 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2222 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2223 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2224 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2225 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2226 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2227 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tidtable.c\nFILE 2228 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2229 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2230 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2231 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2232 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2233 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2234 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2235 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2236 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2237 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2238 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2239 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 2240 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2241 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2242 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2243 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2244 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 2245 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\memory.h\nFILE 2246 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2247 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 2248 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2249 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2250 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2251 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2252 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2253 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2254 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2255 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2256 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2257 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2258 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2259 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2260 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 2261 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2262 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 2263 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2264 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2265 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2266 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2267 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2268 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2269 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2270 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2271 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2272 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2273 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2274 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2275 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2276 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2277 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2278 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2279 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2280 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdenvp.c\nFILE 2281 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2282 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2283 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2284 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2285 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2286 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2287 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2288 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2289 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2290 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2291 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2292 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2293 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2294 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2295 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2296 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2297 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2298 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2299 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2300 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dos.h\nFILE 2301 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2302 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2303 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2304 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2305 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2306 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2307 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2308 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2309 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2310 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 2311 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 2312 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 2313 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2314 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2315 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2316 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2317 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2318 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2319 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2320 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2321 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2322 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdargv.c\nFILE 2323 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2324 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2325 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2326 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2327 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2328 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2329 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2330 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2331 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2332 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2333 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2334 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2335 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2336 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2337 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2338 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2339 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2340 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2341 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2342 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2343 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2344 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2345 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2346 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2347 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2348 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2349 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2350 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2351 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2352 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2353 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2354 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2355 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2356 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2357 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2358 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2359 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2360 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2361 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2362 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2363 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2364 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2365 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2366 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2367 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2368 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2369 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 2370 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2371 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mlock.c\nFILE 2372 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2373 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2374 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2375 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2376 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2377 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 2378 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2379 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2380 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2381 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2382 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2383 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2384 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2385 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2386 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2387 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2388 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2389 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2390 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2391 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2392 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2393 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2394 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2395 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2396 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2397 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 2398 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2399 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2400 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2401 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2402 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2403 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2404 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2405 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2406 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2407 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2408 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2409 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2410 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2411 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2412 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cmsgs.h\nFILE 2413 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2414 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 2415 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2416 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2417 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2418 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0msg.c\nFILE 2419 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2420 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2421 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2422 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2423 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2424 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2425 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2426 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2427 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2428 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2429 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2430 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2431 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2432 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2433 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2434 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2435 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2436 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2437 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2438 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2439 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2440 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2441 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2442 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2443 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2444 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2445 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2446 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2447 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2448 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2449 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2450 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2451 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2452 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 2453 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2454 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2455 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2456 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2457 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0init.c\nFILE 2458 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2459 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2460 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2461 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2462 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2463 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2464 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2465 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2466 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2467 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2468 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2469 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2470 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2471 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2472 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2473 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2474 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2475 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2476 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2477 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2478 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2479 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2480 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2481 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2482 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2483 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2484 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2485 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2486 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2487 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2488 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2489 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2490 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2491 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2492 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2493 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2494 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2495 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2496 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2497 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2498 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2499 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2500 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2501 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2502 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2503 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0fp.c\nFILE 2504 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2505 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2506 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2507 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2508 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2509 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2510 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2511 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2512 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2513 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2514 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2515 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2516 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2517 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2518 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2519 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2520 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2521 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2522 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2523 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2524 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2525 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2526 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2527 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2528 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\process.h\nFILE 2529 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2530 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2531 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2532 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2533 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2534 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2535 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2536 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2537 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 2538 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2539 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2540 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2541 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2542 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2543 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2544 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2545 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2546 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2547 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2548 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2549 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 2550 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 2551 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2552 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2553 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbdata.h\nFILE 2554 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 2555 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2556 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2557 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2558 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2559 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2560 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0dat.c\nFILE 2561 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2562 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2563 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2564 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 2565 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2566 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2567 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2568 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2569 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2570 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dos.h\nFILE 2571 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2572 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2573 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2574 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2575 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2576 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2577 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2578 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2579 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2580 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2581 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2582 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2583 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2584 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2585 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2586 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 2587 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2588 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 2589 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2590 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\process.h\nFILE 2591 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 2592 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 2593 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2594 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2595 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2596 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2597 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2598 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2599 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2600 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dos.h\nFILE 2601 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2602 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2603 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2604 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2605 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2606 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2607 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 2608 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crt0.c\nFILE 2609 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2610 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2611 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2612 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2613 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2614 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2615 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2616 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2617 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2618 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2619 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2620 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2621 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2622 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2623 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2624 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2625 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2626 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2627 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2628 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2629 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2630 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 2631 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2632 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\alloca16.asm\nFILE 2633 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 2634 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\chkstk.asm\nFILE 2635 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 2636 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2637 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2638 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2639 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2640 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2641 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 2642 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2643 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 2644 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2645 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2646 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\rtc\\initsect.cpp\nFILE 2647 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2648 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2649 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2650 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2651 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 2652 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2653 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2654 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2655 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 2656 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2657 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 2658 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 2659 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2660 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 2661 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sect_attribs.h\nFILE 2662 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2663 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2664 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2665 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2666 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2667 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 2668 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2669 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2670 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\rtcapi.h\nFILE 2671 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2672 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 2673 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2674 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 2675 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 2676 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\rtcpriv.h\nFILE 2677 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2678 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\malloc.h\nFILE 2679 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 2680 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2681 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2682 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2683 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2684 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2685 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2686 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2687 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2688 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2689 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2690 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2691 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2692 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2693 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2694 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2695 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2696 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2697 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2698 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2699 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtombenv.c\nFILE 2700 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2701 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2702 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2703 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2704 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2705 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2706 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2707 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2708 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2709 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2710 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2711 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2712 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2713 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2714 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2715 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2716 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2717 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2718 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2719 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2720 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2721 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2722 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2723 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2724 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2725 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2726 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2727 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2728 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2729 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2730 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2731 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\float.h\nFILE 2732 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2733 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2734 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2735 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2736 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2737 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2738 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2739 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2740 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2741 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2742 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2743 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2744 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2745 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2746 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2747 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2748 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\signal.h\nFILE 2749 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2750 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2751 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2752 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winxfltr.c\nFILE 2753 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2754 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2755 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 2756 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2757 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2758 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2759 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2760 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2761 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2762 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2763 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2764 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2765 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtwrn.h\nFILE 2766 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2767 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2768 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2769 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2770 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2771 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2772 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2773 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2774 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2775 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2776 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2777 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2778 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2779 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2780 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2781 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2782 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2783 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2784 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2785 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winsig.c\nFILE 2786 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2787 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2788 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2789 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2790 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2791 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2792 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2793 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2794 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2795 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2796 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2797 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2798 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2799 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2800 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2801 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2802 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2803 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2804 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2805 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2806 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\signal.h\nFILE 2807 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2808 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2809 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2810 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2811 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\float.h\nFILE 2812 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtwrn.h\nFILE 2813 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2814 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 2815 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2816 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2817 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2818 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2819 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2820 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2821 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2822 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2823 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2824 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2825 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2826 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2827 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2828 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\w_str.c\nFILE 2829 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2830 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2831 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2832 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 2833 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2834 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2835 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2836 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2837 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2838 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2839 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2840 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2841 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2842 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2843 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2844 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2845 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2846 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2847 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2848 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 2849 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2850 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2851 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2852 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2853 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2854 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 2855 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2856 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2857 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2858 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2859 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2860 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2861 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2862 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2863 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2864 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2865 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2866 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2867 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2868 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2869 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2870 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2871 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2872 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2873 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2874 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 2875 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2876 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\w_loc.c\nFILE 2877 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2878 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2879 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2880 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 2881 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2882 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2883 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2884 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2885 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2886 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2887 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2888 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2889 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2890 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2891 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2892 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2893 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2894 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2895 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2896 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2897 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2898 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 2899 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2900 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2901 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2902 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2903 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2904 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2905 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2906 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2907 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2908 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2909 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2910 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2911 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2912 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2913 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2914 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 2915 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2916 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2917 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2918 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2919 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 2920 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 2921 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 2922 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 2923 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 2924 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2925 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 2926 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2927 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2928 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 2929 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 2930 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 2931 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 2932 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 2933 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 2934 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\convrtcp.c\nFILE 2935 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 2936 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2937 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2938 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2939 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2940 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2941 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 2942 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 2943 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 2944 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2945 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2946 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2947 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2948 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 2949 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2950 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2951 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2952 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2953 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2954 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2955 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2956 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2957 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2958 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 2959 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2960 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2961 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 2962 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2963 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 2964 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 2965 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 2966 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 2967 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 2968 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 2969 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 2970 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 2971 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 2972 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 2973 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 2974 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 2975 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 2976 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 2977 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 2978 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 2979 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 2980 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 2981 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 2982 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 2983 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 2984 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 2985 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 2986 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 2987 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 2988 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 2989 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 2990 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 2991 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 2992 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 2993 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 2994 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 2995 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.c\nFILE 2996 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 2997 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 2998 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 2999 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3000 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3001 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3002 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3003 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3004 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3005 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3006 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3007 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3008 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3009 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3010 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3011 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3012 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3013 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3014 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 3015 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 3016 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3017 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3018 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3019 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3020 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3021 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 3022 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3023 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3024 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3025 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3026 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3027 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3028 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3029 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 3030 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3031 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3032 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3033 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3034 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3035 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3036 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setenv.c\nFILE 3037 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3038 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3039 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3040 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3041 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3042 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3043 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3044 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3045 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3046 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3047 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3048 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3049 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3050 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3051 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3052 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3053 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3054 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3055 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3056 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3057 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3058 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3059 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3060 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3061 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3062 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3063 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3064 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3065 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3066 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3067 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3068 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3069 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3070 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3071 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3072 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3073 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3074 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3075 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rand_s.c\nFILE 3076 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3077 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3078 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3079 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3080 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3081 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3082 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3083 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3084 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3085 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3086 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3087 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3088 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3089 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 3090 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3091 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3092 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3093 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3094 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3095 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3096 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3097 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3098 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3099 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3100 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3101 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3102 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3103 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 3104 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3105 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3106 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3107 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3108 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3109 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3110 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3111 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3112 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3113 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3114 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3115 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3116 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3117 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3118 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3119 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\purevirt.c\nFILE 3120 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3121 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3122 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3123 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3124 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3125 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3126 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3127 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3128 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3129 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3130 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3131 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3132 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3133 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3134 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3135 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3136 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3137 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3138 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3139 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3140 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3141 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3142 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3143 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3144 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3145 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3146 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3147 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3148 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3149 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3150 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3151 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3152 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3153 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3154 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3155 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3156 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3157 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3158 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3159 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\pesect.c\nFILE 3160 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3161 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3162 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3163 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3164 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3165 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3166 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3167 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3168 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3169 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3170 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3171 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3172 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3173 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3174 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3175 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3176 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3177 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3178 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3179 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3180 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3181 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3182 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3183 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3184 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3185 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3186 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3187 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3188 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3189 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3190 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3191 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 3192 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3193 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3194 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3195 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3196 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3197 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3198 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3199 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3200 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3201 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3202 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3203 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3204 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3205 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3206 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\nlsdata2.c\nFILE 3207 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3208 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3209 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3210 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3211 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3212 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3213 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3214 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3215 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3216 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3217 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3218 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3219 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3220 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3221 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3222 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3223 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3224 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\nlsdata1.c\nFILE 3225 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3226 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3227 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3228 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3229 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\nlsint.h\nFILE 3230 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3231 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3232 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3233 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3234 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3235 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3236 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3237 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 3238 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3239 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3240 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3241 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3242 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3243 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3244 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3245 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3246 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3247 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3248 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3249 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3250 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3251 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3252 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3253 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 3254 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3255 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3256 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3257 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3258 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 3259 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\onexit.c\nFILE 3260 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3261 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3262 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3263 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3264 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3265 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3266 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3267 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3268 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3269 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3270 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3271 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3272 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3273 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3274 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3275 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3276 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3277 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3278 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3279 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3280 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3281 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3282 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3283 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3284 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3285 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3286 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3287 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3288 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3289 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3290 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3291 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3292 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3293 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3294 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3295 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3296 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3297 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3298 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3299 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3300 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3301 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3302 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\lconv.c\nFILE 3303 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3304 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3305 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3306 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3307 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3308 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3309 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3310 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3311 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3312 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3313 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3314 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3315 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3316 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3317 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3318 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3319 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3320 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3321 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3322 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3323 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3324 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3325 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 3326 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3327 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3328 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\invarg.c\nFILE 3329 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3330 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3331 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3332 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3333 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3334 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3335 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3336 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3337 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3338 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3339 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3340 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 3341 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3342 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3343 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3344 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3345 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3346 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3347 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3348 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3349 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3350 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3351 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3352 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3353 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3354 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3355 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3356 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3357 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3358 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3359 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3360 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3361 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3362 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 3363 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3364 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3365 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3366 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3367 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3368 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3369 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3370 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3371 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3372 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3373 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3374 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3375 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3376 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3377 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3378 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3379 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\inittime.c\nFILE 3380 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3381 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3382 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3383 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3384 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3385 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3386 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3387 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3388 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3389 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3390 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3391 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3392 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3393 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3394 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3395 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3396 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3397 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3398 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3399 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3400 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3401 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3402 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3403 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3404 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3405 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3406 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 3407 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3408 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3409 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3410 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3411 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3412 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3413 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3414 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3415 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3416 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3417 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3418 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3419 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3420 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3421 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3422 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3423 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3424 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3425 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3426 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3427 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\initnum.c\nFILE 3428 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\nlsint.h\nFILE 3429 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3430 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3431 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3432 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3433 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3434 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3435 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3436 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3437 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3438 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3439 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3440 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3441 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3442 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3443 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3444 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3445 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3446 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3447 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3448 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3449 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3450 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3451 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3452 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3453 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 3454 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3455 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3456 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3457 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3458 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3459 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3460 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3461 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3462 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3463 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3464 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3465 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3466 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3467 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3468 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3469 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3470 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\initmon.c\nFILE 3471 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3472 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3473 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3474 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3475 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3476 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3477 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3478 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3479 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3480 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3481 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3482 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3483 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3484 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3485 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3486 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3487 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3488 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3489 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3490 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3491 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3492 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3493 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3494 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3495 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3496 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3497 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3498 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3499 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3500 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3501 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3502 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3503 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3504 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3505 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 3506 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3507 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3508 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3509 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3510 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3511 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3512 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3513 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3514 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3515 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3516 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3517 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3518 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3519 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3520 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3521 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3522 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3523 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\inithelp.c\nFILE 3524 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3525 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3526 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3527 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3528 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3529 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3530 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3531 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3532 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3533 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3534 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3535 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3536 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3537 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3538 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3539 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3540 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3541 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3542 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3543 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3544 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 3545 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3546 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3547 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3548 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3549 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3550 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3551 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3552 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3553 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3554 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3555 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3556 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3557 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3558 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3559 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3560 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3561 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3562 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\initctyp.c\nFILE 3563 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 3564 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3565 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3566 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3567 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3568 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3569 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3570 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3571 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3572 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3573 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3574 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3575 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3576 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3577 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3578 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3579 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3580 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3581 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3582 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3583 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3584 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3585 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3586 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3587 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3588 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3589 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3590 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3591 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 3592 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3593 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3594 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3595 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3596 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3597 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3598 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3599 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3600 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3601 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3602 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3603 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3604 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3605 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3606 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3607 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3608 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3609 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\initcrit.c\nFILE 3610 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3611 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3612 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3613 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3614 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3615 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3616 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3617 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3618 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3619 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3620 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3621 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3622 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3623 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3624 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3625 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3626 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3627 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3628 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3629 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3630 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3631 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3632 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3633 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3634 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3635 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3636 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3637 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3638 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3639 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3640 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3641 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3642 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3643 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3644 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3645 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3646 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3647 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3648 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3649 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3650 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\initcoll.c\nFILE 3651 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3652 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3653 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3654 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3655 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3656 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3657 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3658 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3659 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3660 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3661 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3662 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3663 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3664 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3665 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3666 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3667 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3668 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3669 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3670 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3671 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3672 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3673 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3674 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3675 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3676 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3677 f:\\binaries.x86ret\\vcboot\\inc\\mm3dnow.h\nFILE 3678 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3679 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 3680 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3681 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3682 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3683 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3684 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3685 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3686 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3687 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3688 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3689 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\gs_support.c\nFILE 3690 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3691 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3692 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\intrin.h\nFILE 3693 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setjmp.h\nFILE 3694 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3695 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3696 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3697 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3698 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3699 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3700 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3701 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3702 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3703 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3704 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3705 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3706 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 3707 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3708 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3709 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3710 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3711 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3712 f:\\binaries.x86ret\\vcboot\\inc\\emmintrin.h\nFILE 3713 f:\\binaries.x86ret\\vcboot\\inc\\xmmintrin.h\nFILE 3714 f:\\binaries.x86ret\\vcboot\\inc\\mmintrin.h\nFILE 3715 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3716 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3717 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3718 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3719 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3720 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3721 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3722 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3723 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3724 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3725 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3726 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3727 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3728 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3729 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3730 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3731 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\gs_report.c\nFILE 3732 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3733 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3734 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3735 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3736 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3737 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3738 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3739 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3740 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3741 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3742 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3743 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3744 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3745 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3746 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3747 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3748 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3749 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3750 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3751 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3752 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3753 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3754 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3755 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3756 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3757 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3758 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3759 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3760 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3761 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3762 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3763 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3764 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3765 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3766 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3767 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3768 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3769 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\gs_cookie.c\nFILE 3770 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3771 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3772 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3773 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3774 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3775 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3776 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3777 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3778 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3779 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3780 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3781 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3782 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3783 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3784 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3785 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3786 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3787 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3788 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3789 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3790 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3791 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3792 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3793 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3794 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3795 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3796 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3797 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3798 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3799 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3800 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3801 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3802 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3803 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3804 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 3805 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3806 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3807 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3808 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3809 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3810 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3811 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3812 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3813 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3814 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3815 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\glstatus.c\nFILE 3816 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3817 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3818 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3819 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3820 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3821 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3822 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3823 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3824 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3825 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3826 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3827 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3828 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3829 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3830 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3831 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3832 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3833 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3834 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3835 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3836 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3837 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3838 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3839 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3840 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3841 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3842 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3843 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3844 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3845 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3846 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3847 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3848 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3849 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\getqloc.c\nFILE 3850 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 3851 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3852 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3853 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3854 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3855 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3856 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3857 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3858 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3859 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3860 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3861 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3862 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3863 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3864 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3865 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3866 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3867 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3868 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3869 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3870 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3871 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3872 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3873 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3874 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3875 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3876 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3877 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3878 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3879 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3880 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3881 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3882 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3883 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3884 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3885 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3886 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3887 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3888 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3889 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3890 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3891 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3892 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3893 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3894 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 3895 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3896 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3897 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3898 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3899 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3900 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 3901 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 3902 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3903 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3904 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\getenv.c\nFILE 3905 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3906 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 3907 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3908 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3909 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3910 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3911 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3912 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3913 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3914 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3915 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3916 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3917 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3918 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3919 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3920 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3921 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3922 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 3923 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3924 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3925 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3926 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3927 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3928 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3929 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3930 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 3931 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3932 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3933 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3934 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3935 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 3936 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3937 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errmode.c\nFILE 3938 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3939 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3940 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3941 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3942 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3943 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3944 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3945 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3946 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3947 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 3948 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 3949 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3950 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 3951 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 3952 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3953 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3954 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 3955 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 3956 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 3957 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 3958 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 3959 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 3960 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 3961 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 3962 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 3963 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 3964 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3965 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3966 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbghook.c\nFILE 3967 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3968 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3969 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 3970 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 3971 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 3972 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 3973 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 3974 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 3975 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 3976 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 3977 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 3978 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 3979 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 3980 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 3981 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 3982 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 3983 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 3984 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 3985 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 3986 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.c\nFILE 3987 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 3988 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 3989 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 3990 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 3991 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 3992 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 3993 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 3994 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 3995 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 3996 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 3997 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 3998 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 3999 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4000 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4001 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4002 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4003 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4004 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 4005 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4006 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4007 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4008 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4009 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4010 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4011 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4012 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4013 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4014 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4015 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4016 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4017 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4018 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4019 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4020 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4021 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4022 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4023 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4024 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4025 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4026 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4027 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 4028 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 4029 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4030 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4031 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4032 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4033 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtmbox.c\nFILE 4034 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4035 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4036 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4037 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4038 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4039 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4040 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4041 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4042 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4043 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4044 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4045 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4046 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4047 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4048 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4049 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4050 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4051 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4052 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4053 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4054 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4055 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4056 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4057 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4058 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fltintrn.h\nFILE 4059 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4060 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4061 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4062 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4063 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4064 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4065 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4066 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4067 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4068 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4069 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4070 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4071 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4072 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4073 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4074 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cmiscdat.c\nFILE 4075 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4076 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4077 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4078 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4079 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4080 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4081 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4082 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4083 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4084 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4085 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4086 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4087 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4088 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4089 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4090 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4091 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4092 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4093 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4094 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4095 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4096 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4097 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4098 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4099 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4100 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 4101 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\signal.h\nFILE 4102 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4103 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4104 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4105 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4106 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4107 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4108 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4109 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4110 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4111 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4112 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4113 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4114 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4115 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4116 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4117 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4118 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4119 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\abort.c\nFILE 4120 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4121 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4122 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4123 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4124 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4125 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4126 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4127 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4128 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4129 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4130 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4131 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4132 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4133 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4134 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4135 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4136 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4137 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4138 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4139 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4140 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4141 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4142 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4143 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4144 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 4145 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4146 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4147 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4148 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4149 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4150 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4151 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4152 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4153 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4154 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4155 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\a_str.c\nFILE 4156 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4157 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4158 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4159 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4160 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4161 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4162 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4163 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4164 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4165 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4166 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4167 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4168 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4169 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4170 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4171 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4172 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4173 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4174 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4175 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4176 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4177 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4178 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4179 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4180 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4181 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4182 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4183 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4184 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4185 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4186 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4187 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4188 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4189 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4190 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4191 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4192 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 4193 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4194 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4195 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4196 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4197 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4198 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4199 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4200 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4201 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4202 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4203 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\a_map.c\nFILE 4204 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4205 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4206 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4207 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4208 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4209 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4210 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4211 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4212 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4213 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4214 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4215 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4216 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4217 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4218 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4219 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4220 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4221 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4222 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4223 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4224 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4225 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4226 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4227 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4228 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4229 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4230 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4231 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4232 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4233 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4234 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4235 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4236 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4237 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4238 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4239 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4240 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4241 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4242 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4243 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4244 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4245 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4246 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4247 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4248 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4249 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4250 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4251 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\a_loc.c\nFILE 4252 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4253 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4254 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4255 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4256 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4257 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4258 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4259 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4260 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4261 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4262 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4263 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4264 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4265 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4266 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4267 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4268 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4269 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4270 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 4271 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4272 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4273 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4274 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4275 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4276 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4277 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4278 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4279 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4280 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4281 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4282 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4283 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4284 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4285 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4286 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4287 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4288 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4289 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4290 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4291 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4292 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4293 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4294 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4295 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4296 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4297 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4298 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4299 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4300 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4301 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4302 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4303 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4304 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4305 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4306 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4307 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\a_env.c\nFILE 4308 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4309 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4310 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4311 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4312 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4313 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4314 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4315 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4316 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4317 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4318 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4319 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4320 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4321 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4322 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4323 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4324 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4325 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4326 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4327 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4328 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4329 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4330 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4331 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4332 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4333 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 4334 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4335 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4336 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4337 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4338 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4339 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4340 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4341 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4342 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4343 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4344 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4345 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\a_cmp.c\nFILE 4346 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4347 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4348 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4349 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4350 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4351 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4352 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4353 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4354 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4355 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4356 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4357 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4358 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4359 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4360 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4361 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4362 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4363 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4364 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4365 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4366 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4367 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4368 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4369 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4370 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4371 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4372 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4373 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4374 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4375 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4376 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4377 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4378 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4379 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4380 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4381 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\misc\\i386\\sehprolg4.asm\nFILE 4382 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4383 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4384 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4385 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4386 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4387 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4388 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4389 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4390 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4391 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4392 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4393 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4394 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4395 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4396 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4397 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\intel\\secchk.c\nFILE 4398 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4399 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4400 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\process.h\nFILE 4401 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4402 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4403 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4404 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4405 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4406 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4407 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4408 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4409 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4410 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4411 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4412 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4413 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4414 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4415 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4416 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4417 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4418 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4419 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4420 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4421 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4422 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4423 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4424 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4425 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4426 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4427 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4428 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4429 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4430 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4431 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4432 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4433 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4434 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\intel\\loadcfg.c\nFILE 4435 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4436 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4437 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4438 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4439 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4440 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4441 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4442 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4443 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4444 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4445 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4446 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4447 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4448 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4449 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4450 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4451 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4452 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4453 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4454 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4455 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\misc\\i386\\exsup4.asm\nFILE 4456 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\h\\exsup.inc\nFILE 4457 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\misc\\i386\\exsup.asm\nFILE 4458 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\h\\pversion.inc\nFILE 4459 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\h\\cmacros.inc\nFILE 4460 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\h\\exsup.inc\nFILE 4461 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\misc\\i386\\nlgsupp.asm\nFILE 4462 f:\\sp\\public\\sdk\\inc\\ntldr.h\nFILE 4463 f:\\sp\\public\\sdk\\inc\\ntpoapi.h\nFILE 4464 f:\\sp\\public\\sdk\\inc\\ntexapi.h\nFILE 4465 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4466 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4467 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 4468 f:\\sp\\public\\sdk\\inc\\ntdef.h\nFILE 4469 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 4470 f:\\sp\\public\\sdk\\inc\\mce.h\nFILE 4471 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4472 f:\\sp\\public\\sdk\\inc\\ntimage.h\nFILE 4473 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4474 f:\\sp\\public\\sdk\\inc\\ntpsapi.h\nFILE 4475 f:\\sp\\public\\sdk\\inc\\nti386.h\nFILE 4476 f:\\sp\\public\\sdk\\inc\\nt.h\nFILE 4477 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 4478 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 4479 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 4480 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4481 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4482 f:\\sp\\public\\sdk\\inc\\ntxcapi.h\nFILE 4483 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4484 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\misc\\i386\\chandler4.c\nFILE 4485 f:\\sp\\public\\sdk\\inc\\ntstatus.h\nFILE 4486 f:\\sp\\public\\sdk\\inc\\ntkeapi.h\nFILE 4487 f:\\sp\\public\\sdk\\inc\\ntconfig.h\nFILE 4488 f:\\sp\\public\\sdk\\inc\\ntregapi.h\nFILE 4489 f:\\sp\\public\\sdk\\inc\\ntmmapi.h\nFILE 4490 f:\\sp\\public\\sdk\\inc\\ntobapi.h\nFILE 4491 f:\\sp\\public\\sdk\\inc\\nxi386.h\nFILE 4492 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\process.h\nFILE 4493 f:\\sp\\public\\sdk\\inc\\ntioapi.h\nFILE 4494 f:\\sp\\public\\sdk\\inc\\devioctl.h\nFILE 4495 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 4496 f:\\sp\\public\\sdk\\inc\\ntseapi.h\nFILE 4497 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4498 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 4499 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 4500 f:\\sp\\public\\sdk\\inc\\ntnls.h\nFILE 4501 f:\\sp\\public\\sdk\\inc\\ntelfapi.h\nFILE 4502 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4503 f:\\sp\\public\\sdk\\inc\\ntiolog.h\nFILE 4504 f:\\sp\\public\\sdk\\inc\\ntlpcapi.h\nFILE 4505 f:\\sp\\public\\sdk\\inc\\ntpnpapi.h\nFILE 4506 f:\\sp\\public\\sdk\\inc\\cfg.h\nFILE 4507 f:\\sp\\public\\sdk\\inc\\pebteb.h\nFILE 4508 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4509 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4510 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4511 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4512 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4513 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4514 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4515 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4516 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbdata.h\nFILE 4517 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4518 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbsnbico.c\nFILE 4519 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4520 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4521 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4522 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4523 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 4524 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4525 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4526 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4527 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4528 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4529 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4530 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4531 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4532 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4533 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4534 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4535 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4536 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4537 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4538 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4539 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4540 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4541 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4542 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4543 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4544 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4545 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4546 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4547 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4548 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4549 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4550 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4551 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4552 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4553 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4554 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4555 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 4556 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4557 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4558 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4559 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4560 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 4561 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4562 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4563 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4564 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4565 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4566 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4567 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4568 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbschr.c\nFILE 4569 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4570 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4571 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4572 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4573 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4574 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4575 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4576 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4577 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4578 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4579 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4580 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4581 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4582 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4583 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4584 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4585 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4586 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4587 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 4588 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4589 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4590 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4591 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4592 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4593 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 4594 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4595 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4596 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4597 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4598 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4599 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4600 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4601 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4602 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4603 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbdata.h\nFILE 4604 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 4605 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4606 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4607 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4608 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4609 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4610 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4611 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4612 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4613 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 4614 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4615 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.c\nFILE 4616 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4617 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4618 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4619 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4620 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4621 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4622 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4623 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4624 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4625 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4626 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4627 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4628 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4629 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4630 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4631 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4632 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4633 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4634 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4635 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4636 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4637 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4638 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4639 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4640 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbdata.h\nFILE 4641 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4642 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 4643 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4644 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4645 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4646 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 4647 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4648 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4649 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4650 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 4651 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4652 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 4653 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4654 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4655 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4656 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4657 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4658 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4659 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4660 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4661 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4662 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4663 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 4664 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4665 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4666 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4667 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4668 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4669 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ismbbyte.c\nFILE 4670 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4671 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4672 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4673 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4674 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4675 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4676 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4677 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4678 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4679 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4680 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4681 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4682 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4683 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4684 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4685 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4686 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 4687 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4688 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4689 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4690 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4691 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4692 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4693 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4694 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4695 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4696 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4697 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4698 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4699 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4700 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbdata.h\nFILE 4701 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4702 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4703 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 4704 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4705 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 4706 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4707 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4708 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4709 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4710 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4711 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4712 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4713 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4714 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4715 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4716 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4717 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4718 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4719 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4720 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4721 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\putwch.c\nFILE 4722 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4723 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4724 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4725 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4726 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4727 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4728 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4729 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4730 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4731 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4732 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4733 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\file2.h\nFILE 4734 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4735 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4736 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4737 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 4738 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4739 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4740 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4741 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4742 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4743 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4744 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4745 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4746 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4747 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\conio.h\nFILE 4748 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4749 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4750 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4751 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 4752 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4753 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4754 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4755 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4756 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4757 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 4758 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4759 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4760 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4761 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4762 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4763 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4764 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4765 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 4766 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4767 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 4768 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4769 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4770 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4771 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4772 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4773 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4774 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4775 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4776 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4777 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\write.c\nFILE 4778 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4779 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4780 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4781 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 4782 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4783 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4784 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 4785 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4786 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4787 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4788 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4789 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4790 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4791 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4792 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4793 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 4794 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4795 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4796 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4797 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4798 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4799 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4800 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4801 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4802 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4803 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4804 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4805 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4806 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4807 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4808 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4809 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4810 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4811 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4812 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4813 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4814 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4815 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4816 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4817 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4818 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4819 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4820 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 4821 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4822 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4823 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\fcntl.h\nFILE 4824 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 4825 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\osfinfo.c\nFILE 4826 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4827 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4828 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4829 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4830 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4831 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4832 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 4833 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4834 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4835 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4836 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4837 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4838 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4839 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4840 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4841 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4842 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4843 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4844 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4845 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4846 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4847 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4848 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4849 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4850 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 4851 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4852 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4853 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4854 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4855 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4856 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4857 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4858 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4859 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4860 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 4861 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4862 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4863 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4864 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 4865 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 4866 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4867 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4868 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4869 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4870 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4871 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4872 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\lseeki64.c\nFILE 4873 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4874 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4875 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4876 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 4877 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 4878 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4879 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4880 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4881 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4882 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4883 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4884 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4885 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4886 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4887 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4888 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4889 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4890 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4891 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4892 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4893 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4894 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4895 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4896 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 4897 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4898 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4899 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4900 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4901 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4902 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4903 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4904 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 4905 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4906 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4907 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4908 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4909 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4910 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4911 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4912 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\isatty.c\nFILE 4913 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4914 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4915 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4916 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4917 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4918 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4919 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4920 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4921 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4922 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4923 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4924 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4925 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4926 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4927 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4928 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4929 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4930 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4931 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4932 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4933 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4934 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4935 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4936 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 4937 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 4938 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 4939 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 4940 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 4941 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 4942 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 4943 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 4944 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 4945 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 4946 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 4947 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 4948 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4949 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 4950 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 4951 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4952 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 4953 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 4954 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 4955 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 4956 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 4957 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 4958 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ioinit.c\nFILE 4959 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 4960 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 4961 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 4962 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4963 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4964 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4965 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 4966 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 4967 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 4968 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4969 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 4970 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4971 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4972 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4973 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4974 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4975 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4976 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4977 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4978 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4979 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4980 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4981 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 4982 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 4983 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 4984 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 4985 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 4986 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 4987 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 4988 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 4989 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 4990 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 4991 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 4992 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 4993 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 4994 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 4995 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 4996 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 4997 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 4998 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 4999 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5000 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5001 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sect_attribs.h\nFILE 5002 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 5003 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5004 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5005 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5006 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5007 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5008 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\initcon.c\nFILE 5009 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5010 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5011 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5012 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5013 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5014 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5015 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5016 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5017 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5018 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5019 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5020 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5021 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5022 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5023 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5024 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5025 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 5026 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5027 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5028 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5029 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5030 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5031 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 5032 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5033 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5034 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5035 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5036 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5037 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5038 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5039 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5040 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5041 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5042 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5043 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\commit.c\nFILE 5044 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5045 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5046 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5047 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5048 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 5049 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5050 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5051 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5052 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5053 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5054 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5055 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5056 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5057 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5058 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5059 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5060 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5061 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5062 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5063 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5064 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5065 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5066 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5067 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5068 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5069 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5070 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\io.h\nFILE 5071 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5072 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5073 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5074 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5075 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5076 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5077 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5078 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5079 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5080 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5081 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5082 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5083 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5084 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msdos.h\nFILE 5085 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5086 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 5087 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 5088 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5089 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5090 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5091 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5092 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5093 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5094 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\close.c\nFILE 5095 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5096 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5097 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5098 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5099 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5100 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5101 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5102 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5103 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5104 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5105 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5106 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5107 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5108 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5109 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5110 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5111 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5112 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5113 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\ulldvrm.asm\nFILE 5114 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 5115 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\mm.inc\nFILE 5116 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\intel\\llmul.asm\nFILE 5117 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\cruntime.inc\nFILE 5118 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\src\\mm.inc\nFILE 5119 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\use_ansi.h\nFILE 5120 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\new\nFILE 5121 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\exception\nFILE 5122 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xstddef\nFILE 5123 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\new.cpp\nFILE 5124 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cstddef\nFILE 5125 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 5126 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\eh.h\nFILE 5127 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cstdlib\nFILE 5128 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\yvals.h\nFILE 5129 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5130 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5131 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5132 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 5133 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5134 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5135 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5136 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5137 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5138 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5139 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5140 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5141 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5142 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5143 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5144 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5145 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5146 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5147 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5148 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5149 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5150 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5151 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5152 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_newmode.c\nFILE 5153 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5154 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5155 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5156 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5157 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5158 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5159 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5160 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5161 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5162 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5163 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5164 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5165 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5166 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5167 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5168 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5169 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5170 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5171 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5172 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5173 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5174 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5175 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5176 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5177 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\new.h\nFILE 5178 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5179 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcsup.h\nFILE 5180 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 5181 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5182 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5183 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5184 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\delete.cpp\nFILE 5185 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5186 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5187 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5188 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5189 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5190 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5191 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5192 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5193 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5194 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5195 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5196 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5197 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5198 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5199 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5200 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5201 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5202 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5203 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5204 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5205 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5206 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5207 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5208 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5209 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5210 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5211 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5212 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5213 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5214 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5215 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5216 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5217 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5218 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5219 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\process.h\nFILE 5220 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5221 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5222 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5223 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5224 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5225 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5226 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5227 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5228 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5229 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5230 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\handler.cpp\nFILE 5231 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5232 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 5233 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5234 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5235 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5236 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5237 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 5238 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5239 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5240 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5241 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5242 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5243 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5244 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5245 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5246 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5247 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5248 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5249 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5250 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5251 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5252 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5253 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5254 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5255 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5256 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5257 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5258 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5259 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5260 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5261 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\new.h\nFILE 5262 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5263 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5264 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5265 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5266 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5267 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5268 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5269 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5270 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5271 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5272 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 5273 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5274 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5275 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5276 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5277 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5278 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5279 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5280 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5281 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sbheap.c\nFILE 5282 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5283 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5284 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5285 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5286 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5287 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5288 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5289 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5290 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5291 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5292 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5293 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5294 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5295 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5296 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5297 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5298 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5299 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5300 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5301 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 5302 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5303 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5304 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5305 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5306 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5307 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcsup.h\nFILE 5308 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 5309 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5310 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 5311 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5312 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5313 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5314 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5315 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5316 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5317 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5318 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5319 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5320 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5321 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5322 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5323 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5324 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5325 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5326 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5327 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5328 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5329 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5330 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5331 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5332 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5333 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5334 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5335 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5336 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5337 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5338 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\realloc.c\nFILE 5339 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5340 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5341 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5342 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5343 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5344 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5345 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5346 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5347 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5348 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5349 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5350 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 5351 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5352 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5353 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5354 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5355 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5356 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5357 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5358 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5359 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5360 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5361 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5362 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5363 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5364 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5365 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 5366 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5367 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5368 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5369 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5370 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5371 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5372 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5373 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5374 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5375 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5376 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5377 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5378 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5379 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5380 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5381 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5382 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5383 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\msize.c\nFILE 5384 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5385 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5386 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5387 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5388 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5389 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5390 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5391 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5392 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5393 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5394 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5395 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5396 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5397 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5398 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5399 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5400 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5401 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5402 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5403 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5404 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5405 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5406 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5407 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5408 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5409 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5410 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5411 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5412 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5413 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5414 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5415 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5416 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5417 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5418 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5419 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5420 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5421 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5422 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5423 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 5424 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5425 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.c\nFILE 5426 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5427 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5428 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcsup.h\nFILE 5429 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 5430 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rterr.h\nFILE 5431 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5432 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5433 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5434 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5435 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5436 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5437 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5438 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5439 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5440 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5441 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5442 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5443 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5444 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5445 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 5446 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5447 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5448 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5449 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5450 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5451 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5452 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5453 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5454 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5455 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5456 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5457 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5458 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5459 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5460 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5461 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5462 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5463 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5464 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5465 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5466 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5467 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5468 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5469 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5470 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5471 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5472 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5473 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\heapinit.c\nFILE 5474 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5475 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5476 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5477 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5478 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5479 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5480 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5481 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5482 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5483 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5484 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5485 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5486 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5487 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5488 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5489 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5490 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5491 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5492 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5493 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5494 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5495 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5496 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5497 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5498 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5499 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5500 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5501 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5502 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5503 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5504 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5505 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5506 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5507 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5508 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5509 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5510 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5511 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5512 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 5513 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5514 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5515 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\free.c\nFILE 5516 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5517 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5518 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5519 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcsup.h\nFILE 5520 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 5521 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5522 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5523 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5524 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5525 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5526 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5527 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5528 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5529 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5530 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5531 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5532 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5533 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5534 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5535 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5536 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5537 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5538 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5539 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5540 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5541 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5542 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5543 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5544 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5545 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5546 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5547 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5548 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5549 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5550 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5551 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5552 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5553 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5554 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5555 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5556 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5557 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtheap.c\nFILE 5558 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5559 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5560 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5561 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5562 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5563 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5564 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5565 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5566 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5567 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5568 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5569 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5570 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5571 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5572 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5573 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 5574 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5575 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5576 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5577 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5578 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5579 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5580 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5581 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 5582 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5583 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 5584 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5585 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5586 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\malloc.h\nFILE 5587 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 5588 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 5589 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 5590 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 5591 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5592 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\calloc.c\nFILE 5593 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5594 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\winheap.h\nFILE 5595 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5596 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5597 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 5598 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5599 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5600 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcsup.h\nFILE 5601 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\rtcapi.h\nFILE 5602 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 5603 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5604 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5605 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 5606 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 5607 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5608 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5609 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5610 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 5611 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 5612 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5613 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5614 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 5615 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5616 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5617 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5618 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5619 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5620 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5621 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehhooks.h\nFILE 5622 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5623 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 5624 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5625 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehassert.h\nFILE 5626 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\setjmp.h\nFILE 5627 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\i386\\trnsctrl.cpp\nFILE 5628 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\process.h\nFILE 5629 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 5630 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5631 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5632 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5633 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5634 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5635 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\trnsctrl.h\nFILE 5636 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5637 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5638 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5639 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5640 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5641 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5642 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5643 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5644 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5645 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5646 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5647 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5648 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5649 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5650 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5651 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5652 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5653 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 5654 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5655 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 5656 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5657 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5658 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5659 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5660 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5661 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5662 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5663 f:\\sp\\vctools\\langapi\\include\\ehdata.h\nFILE 5664 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5665 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\eh\\i386\\lowhelpr.asm\nFILE 5666 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\h\\cruntime.inc\nFILE 5667 F:\\SP\\vctools\\crt_bld\\SELF_X86\\crt\\prebuild\\h\\exsup.inc\nFILE 5668 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\process.h\nFILE 5669 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5670 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5671 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\i386\\ehprolg3.c\nFILE 5672 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5673 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5674 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5675 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehassert.h\nFILE 5676 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5677 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5678 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5679 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5680 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5681 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5682 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5683 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\validate.cpp\nFILE 5684 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5685 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5686 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5687 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5688 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5689 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5690 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5691 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5692 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5693 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5694 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5695 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5696 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5697 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5698 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5699 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5700 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5701 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5702 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5703 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5704 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5705 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5706 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5707 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5708 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5709 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5710 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5711 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5712 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5713 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5714 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5715 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5716 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5717 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5718 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5719 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5720 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sect_attribs.h\nFILE 5721 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\unhandld.cpp\nFILE 5722 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5723 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 5724 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5725 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5726 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5727 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5728 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5729 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5730 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5731 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5732 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5733 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehhooks.h\nFILE 5734 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5735 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5736 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5737 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5738 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5739 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehassert.h\nFILE 5740 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5741 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5742 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 5743 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5744 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5745 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5746 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5747 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5748 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 5749 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5750 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5751 f:\\sp\\vctools\\langapi\\include\\ehdata.h\nFILE 5752 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5753 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 5754 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5755 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5756 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5757 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5758 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5759 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5760 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5761 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5762 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5763 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5764 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5765 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5766 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5767 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5768 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5769 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5770 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5771 f:\\sp\\vctools\\langapi\\undname\\undname.cxx\nFILE 5772 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5773 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5774 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5775 f:\\sp\\vctools\\langapi\\undname\\utf8.h\nFILE 5776 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5777 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5778 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5779 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5780 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5781 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\swprintf.inl\nFILE 5782 f:\\sp\\vctools\\langapi\\undname\\undname.hxx\nFILE 5783 f:\\sp\\vctools\\langapi\\undname\\undname.h\nFILE 5784 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 5785 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5786 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5787 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5788 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5789 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5790 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdio.h\nFILE 5791 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5792 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5793 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5794 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5795 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5796 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5797 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 5798 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5799 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5800 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5801 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5802 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5803 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5804 f:\\sp\\vctools\\langapi\\undname\\undname.inl\nFILE 5805 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5806 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5807 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5808 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5809 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5810 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5811 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5812 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5813 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 5814 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5815 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\typname.cpp\nFILE 5816 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 5817 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\cstddef\nFILE 5818 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5819 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5820 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5821 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5822 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5823 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5824 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5825 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5826 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5827 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5828 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 5829 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5830 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sect_attribs.h\nFILE 5831 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\dbgint.h\nFILE 5832 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5833 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5834 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5835 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\typeinfo.h\nFILE 5836 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\typeinfo\nFILE 5837 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\exception\nFILE 5838 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\xstddef\nFILE 5839 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5840 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\yvals.h\nFILE 5841 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\use_ansi.h\nFILE 5842 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5843 f:\\sp\\vctools\\langapi\\undname\\undname.h\nFILE 5844 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 5845 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5846 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5847 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5848 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5849 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5850 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 5851 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5852 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5853 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5854 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5855 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5856 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5857 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\malloc.h\nFILE 5858 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5859 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5860 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5861 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5862 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5863 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5864 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5865 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5866 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5867 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5868 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5869 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\dbgint.h\nFILE 5870 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 5871 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\cstddef\nFILE 5872 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5873 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\typinfo.cpp\nFILE 5874 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5875 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5876 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5877 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5878 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5879 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5880 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 5881 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5882 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5883 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5884 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 5885 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5886 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5887 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5888 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5889 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5890 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\typeinfo\nFILE 5891 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5892 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\exception\nFILE 5893 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\xstddef\nFILE 5894 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5895 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\yvals.h\nFILE 5896 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\use_ansi.h\nFILE 5897 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5898 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5899 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5900 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5901 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5902 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5903 f:\\sp\\vctools\\langapi\\undname\\undname.h\nFILE 5904 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5905 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\malloc.h\nFILE 5906 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5907 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5908 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5909 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5910 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5911 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5912 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\typeinfo\nFILE 5913 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5914 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\exception\nFILE 5915 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\xstddef\nFILE 5916 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\stdexcpt.cpp\nFILE 5917 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\yvals.h\nFILE 5918 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\use_ansi.h\nFILE 5919 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 5920 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5921 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5922 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5923 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\cstddef\nFILE 5924 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5925 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\malloc.h\nFILE 5926 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5927 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5928 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5929 f:\\sp\\vctools\\langapi\\include\\ehdata.h\nFILE 5930 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5931 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 5932 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 5933 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 5934 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 5935 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5936 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 5937 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 5938 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 5939 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\throw.cpp\nFILE 5940 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 5941 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 5942 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 5943 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5944 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 5945 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5946 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 5947 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5948 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5949 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5950 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5951 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5952 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5953 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5954 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehhooks.h\nFILE 5955 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5956 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehassert.h\nFILE 5957 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5958 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5959 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5960 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5961 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5962 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5963 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5964 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 5965 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5966 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 5967 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 5968 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 5969 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5970 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5971 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5972 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 5973 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 5974 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 5975 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 5976 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 5977 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 5978 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 5979 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 5980 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 5981 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 5982 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 5983 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\hooks.cpp\nFILE 5984 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 5985 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 5986 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 5987 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 5988 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 5989 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 5990 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 5991 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 5992 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 5993 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 5994 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 5995 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 5996 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 5997 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 5998 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 5999 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6000 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6001 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6002 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6003 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehhooks.h\nFILE 6004 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6005 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 6006 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6007 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehassert.h\nFILE 6008 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 6009 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6010 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6011 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6012 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6013 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 6014 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 6015 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6016 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 6017 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6018 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdbg.h\nFILE 6019 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehassert.h\nFILE 6020 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\malloc.h\nFILE 6021 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6022 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6023 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6024 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6025 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6026 f:\\sp\\vctools\\langapi\\include\\ehdata.h\nFILE 6027 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6028 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6029 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ctype.h\nFILE 6030 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdlib.h\nFILE 6031 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6032 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\limits.h\nFILE 6033 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6034 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\eh\\frame.cpp\nFILE 6035 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\exception\nFILE 6036 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\typeinfo.h\nFILE 6037 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\typeinfo\nFILE 6038 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\xstddef\nFILE 6039 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\yvals.h\nFILE 6040 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\use_ansi.h\nFILE 6041 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6042 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6043 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6044 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\errno.h\nFILE 6045 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6046 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stddef.h\nFILE 6047 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\crtdefs.h\nFILE 6048 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\sal.h\nFILE 6049 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6050 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehstate.h\nFILE 6051 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\eh.h\nFILE 6052 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6053 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6054 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\excpt.h\nFILE 6055 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6056 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6057 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\string.h\nFILE 6058 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6059 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6060 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\ehhooks.h\nFILE 6061 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6062 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6063 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6064 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\trnsctrl.h\nFILE 6065 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\internal.h\nFILE 6066 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6067 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6068 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\vadefs.h\nFILE 6069 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\stdhpp\\cstddef\nFILE 6070 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\cruntime.h\nFILE 6071 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\mtdll.h\nFILE 6072 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\prebuild\\h\\stdarg.h\nFILE 6073 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6074 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6075 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6076 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6077 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6078 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6079 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6080 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6081 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6082 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6083 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6084 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6085 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6086 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6087 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6088 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6089 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6090 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6091 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6092 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6093 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6094 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6095 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6096 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6097 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6098 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6099 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6100 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dosmap.c\nFILE 6101 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6102 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6103 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6104 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6105 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6106 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6107 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6108 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6109 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6110 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6111 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6112 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6113 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6114 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6115 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6116 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6117 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6118 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6119 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6120 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6121 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6122 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6123 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6124 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6125 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6126 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6127 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6128 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wctomb.c\nFILE 6129 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6130 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6131 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6132 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6133 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6134 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6135 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6136 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6137 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6138 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6139 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6140 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6141 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6142 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6143 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6144 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6145 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6146 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6147 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6148 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6149 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6150 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6151 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6152 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6153 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6154 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6155 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6156 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6157 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6158 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6159 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6160 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6161 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6162 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6163 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6164 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6165 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6166 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6167 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6168 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6169 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6170 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6171 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6172 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6173 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wcstol.c\nFILE 6174 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6175 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6176 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6177 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6178 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6179 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6180 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6181 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6182 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6183 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6184 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6185 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6186 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6187 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6188 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6189 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6190 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6191 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6192 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6193 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6194 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6195 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6196 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6197 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6198 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6199 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6200 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6201 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6202 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6203 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6204 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6205 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6206 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6207 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6208 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6209 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6210 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6211 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6212 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6213 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6214 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6215 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6216 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6217 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6218 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tolower.c\nFILE 6219 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6220 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6221 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6222 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6223 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6224 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6225 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6226 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stddef.h\nFILE 6227 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6228 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6229 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6230 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6231 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6232 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6233 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6234 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 6235 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6236 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6237 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6238 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6239 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6240 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6241 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6242 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6243 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6244 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6245 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6246 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6247 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6248 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6249 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6250 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6251 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6252 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6253 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6254 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6255 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6256 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6257 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6258 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6259 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6260 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6261 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6262 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6263 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6264 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strtoq.c\nFILE 6265 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6266 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6267 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6268 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6269 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6270 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6271 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6272 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6273 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6274 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6275 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6276 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6277 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6278 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6279 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6280 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6281 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6282 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6283 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6284 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6285 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6286 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6287 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6288 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6289 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6290 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6291 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6292 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6293 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6294 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6295 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6296 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6297 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6298 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6299 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6300 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6301 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6302 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6303 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6304 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6305 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6306 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6307 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6308 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6309 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\strtol.c\nFILE 6310 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6311 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6312 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6313 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6314 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6315 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6316 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6317 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6318 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6319 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6320 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6321 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6322 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6323 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6324 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6325 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6326 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6327 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6328 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6329 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6330 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6331 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6332 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6333 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6334 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6335 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6336 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6337 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6338 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6339 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6340 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6341 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6342 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6343 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6344 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6345 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6346 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6347 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6348 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6349 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6350 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6351 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6352 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6353 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6354 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6355 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbtowc.c\nFILE 6356 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6357 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6358 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6359 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6360 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6361 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6362 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6363 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6364 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6365 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6366 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6367 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6368 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6369 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6370 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6371 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6372 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6373 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 6374 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6375 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6376 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6377 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6378 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6379 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6380 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6381 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6382 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6383 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6384 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6385 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6386 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6387 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6388 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6389 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6390 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 6391 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6392 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6393 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6394 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\dbgint.h\nFILE 6395 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6396 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6397 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6398 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6399 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\isctype.c\nFILE 6400 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6401 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6402 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6403 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6404 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6405 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6406 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6407 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6408 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6409 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 6410 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6411 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6412 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6413 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6414 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6415 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6416 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6417 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6418 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6419 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6420 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6421 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6422 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6423 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6424 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6425 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6426 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 6427 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6428 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6429 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6430 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6431 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6432 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6433 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6434 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6435 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6436 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 6437 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6438 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6439 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6440 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6441 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6442 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6443 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6444 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6445 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\iswctype.c\nFILE 6446 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6447 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6448 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6449 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6450 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\awint.h\nFILE 6451 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6452 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6453 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6454 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6455 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6456 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdio.h\nFILE 6457 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6458 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6459 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6460 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6461 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6462 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6463 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6464 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6465 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6466 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6467 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6468 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6469 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6470 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6471 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6472 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6473 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6474 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6475 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6476 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6477 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6478 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6479 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6480 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6481 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6482 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6483 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6484 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6485 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6486 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6487 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6488 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6489 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6490 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_wctype.c\nFILE 6491 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6492 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6493 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6494 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6495 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6496 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6497 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6498 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6499 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6500 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6501 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6502 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6503 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6504 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6505 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6506 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6507 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 6508 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6509 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6510 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6511 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6512 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6513 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6514 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6515 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6516 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6517 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6518 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6519 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6520 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6521 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6522 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6523 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6524 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6525 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6526 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6527 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6528 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6529 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6530 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6531 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6532 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6533 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6534 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6535 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\_ctype.c\nFILE 6536 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6537 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6538 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6539 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6540 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6541 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6542 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6543 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6544 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6545 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6546 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6547 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6548 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6549 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6550 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6551 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6552 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\locale.h\nFILE 6553 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6554 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6555 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6556 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6557 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6558 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6559 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6560 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6561 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6562 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6563 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6564 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6565 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6566 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6567 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6568 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6569 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6570 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6571 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6572 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6573 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal_securecrt.h\nFILE 6574 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6575 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFILE 6576 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6577 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6578 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6579 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6580 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6581 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xtoa.c\nFILE 6582 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6583 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdbg.h\nFILE 6584 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6585 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6586 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 6587 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\xtoas.c\nFILE 6588 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6589 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6590 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\errno.h\nFILE 6591 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6592 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6593 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6594 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6595 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6596 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\internal.h\nFILE 6597 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6598 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6599 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6600 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6601 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6602 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6603 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6604 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6605 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 6606 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6607 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6608 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6609 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\swprintf.inl\nFILE 6610 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchar.h\nFILE 6611 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6612 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6613 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wchtodig.c\nFILE 6614 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6615 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6616 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6617 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\wtime.inl\nFILE 6618 f:\\sp\\public\\sdk\\inc\\poppack.h\nFILE 6619 f:\\sp\\public\\sdk\\inc\\winnetwk.h\nFILE 6620 f:\\sp\\public\\sdk\\inc\\imm.h\nFILE 6621 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdarg.h\nFILE 6622 f:\\sp\\public\\sdk\\inc\\windef.h\nFILE 6623 f:\\sp\\public\\sdk\\inc\\pshpack1.h\nFILE 6624 f:\\sp\\public\\sdk\\inc\\winver.h\nFILE 6625 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mtdll.h\nFILE 6626 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\crtdefs.h\nFILE 6627 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\sal.h\nFILE 6628 f:\\sp\\public\\sdk\\inc\\winnt.h\nFILE 6629 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\ctype.h\nFILE 6630 f:\\sp\\public\\sdk\\inc\\winreg.h\nFILE 6631 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\atox.c\nFILE 6632 f:\\sp\\public\\sdk\\inc\\winbase.h\nFILE 6633 f:\\sp\\public\\sdk\\inc\\winerror.h\nFILE 6634 f:\\sp\\public\\sdk\\inc\\pshpack8.h\nFILE 6635 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\setlocal.h\nFILE 6636 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\oscalls.h\nFILE 6637 f:\\sp\\public\\sdk\\inc\\reason.h\nFILE 6638 f:\\sp\\public\\sdk\\inc\\wincon.h\nFILE 6639 f:\\sp\\public\\sdk\\inc\\ddbanned.h\nFILE 6640 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\vadefs.h\nFILE 6641 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\cruntime.h\nFILE 6642 f:\\sp\\public\\sdk\\inc\\pshpack2.h\nFILE 6643 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\tchar.h\nFILE 6644 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\stdlib.h\nFILE 6645 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbstring.h\nFILE 6646 f:\\sp\\public\\sdk\\inc\\mcx.h\nFILE 6647 f:\\sp\\public\\sdk\\inc\\winuser.h\nFILE 6648 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\limits.h\nFILE 6649 f:\\sp\\public\\sdk\\inc\\winnls.h\nFILE 6650 f:\\sp\\public\\sdk\\inc\\guiddef.h\nFILE 6651 f:\\sp\\public\\sdk\\inc\\windows.h\nFILE 6652 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\excpt.h\nFILE 6653 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\mbctype.h\nFILE 6654 f:\\sp\\public\\sdk\\inc\\specstrings.h\nFILE 6655 f:\\sp\\public\\sdk\\inc\\basetsd.h\nFILE 6656 f:\\sp\\public\\sdk\\inc\\stralign.h\nFILE 6657 f:\\sp\\public\\sdk\\inc\\tvout.h\nFILE 6658 f:\\sp\\public\\sdk\\inc\\winsvc.h\nFILE 6659 f:\\sp\\vctools\\crt_bld\\self_x86\\crt\\src\\string.h\nFILE 6660 f:\\sp\\public\\sdk\\inc\\wingdi.h\nFILE 6661 f:\\sp\\public\\sdk\\inc\\pshpack4.h\nFUNC 1000 13 4 vswprintf\n1000 0 50 71\n1000 12 51 71\n1012 1 52 71\nFUNC 1020 1b 10 wmemcpy_s\n1020 0 1230 66\n1020 1b 1233 66\nFUNC 1040 1b 10 wmemmove_s\n1040 0 1250 66\n1040 1b 1253 66\nFUNC 1060 19 4 std::bad_alloc::bad_alloc(char const *)\n1060 13 371 83\n1073 6 372 83\nFUNC 1080 b 0 std::bad_alloc::~bad_alloc()\n1080 6 380 83\n1086 5 381 83\nFUNC 1090 24 0 std::bad_alloc::`vector deleting destructor'(unsigned int)\nFUNC 10c0 f 8 std::char_traits<wchar_t>::assign(wchar_t &,wchar_t const &)\n10c0 0 302 70\n10c0 e 303 70\n10ce 1 304 70\nFUNC 10d0 17 4 std::char_traits<wchar_t>::length(wchar_t const *)\n10d0 0 325 70\n10d0 16 327 70\n10e6 1 328 70\nFUNC 10f0 27 10 std::char_traits<wchar_t>::_Copy_s(wchar_t *,unsigned int,wchar_t const *,unsigned int)\n10f0 0 340 70\n10f0 23 343 70\n1113 3 344 70\n1116 1 345 70\nFUNC 1120 27 10 std::char_traits<wchar_t>::_Move_s(wchar_t *,unsigned int,wchar_t const *,unsigned int)\n1120 0 364 70\n1120 23 367 70\n1143 3 368 70\n1146 1 369 70\nFUNC 1150 d 8 std::char_traits<char>::assign(char &,char const &)\n1150 0 417 70\n1150 c 418 70\n115c 1 419 70\nFUNC 1160 13 4 std::char_traits<char>::length(char const *)\n1160 0 440 70\n1160 12 442 70\n1172 1 443 70\nFUNC 1180 21 10 std::char_traits<char>::_Copy_s(char *,unsigned int,char const *,unsigned int)\n1180 0 455 70\n1180 1d 458 70\n119d 3 459 70\n11a0 1 460 70\nFUNC 11b0 21 10 std::char_traits<char>::_Move_s(char *,unsigned int,char const *,unsigned int)\n11b0 0 479 70\n11b0 1d 482 70\n11cd 3 483 70\n11d0 1 484 70\nFUNC 11e0 7 0 std::_Iterator_base::_Iterator_base()\n11e0 6 441 65\n11e6 1 442 65\nFUNC 11f0 6b 4 std::logic_error::logic_error(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &)\n11f0 56 27 82\n1246 15 28 82\nFUNC 1260 32 0 std::logic_error::~logic_error()\n1260 9 31 82\n1269 29 32 82\nFUNC 12a0 e 0 std::logic_error::what()\n12a0 0 35 82\n12a0 9 36 82\n12a9 1 37 82\n12aa 3 36 82\n12ad 1 37 82\nFUNC 12b0 47 0 std::logic_error::`scalar deleting destructor'(unsigned int)\nFUNC 1300 19 4 std::length_error::length_error(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &)\n1300 13 106 82\n1313 6 107 82\nFUNC 1320 32 0 std::length_error::~length_error()\n1320 3 110 82\n1323 2f 111 82\nFUNC 1360 47 0 std::length_error::`vector deleting destructor'(unsigned int)\nFUNC 13b0 19 4 std::out_of_range::out_of_range(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &)\n13b0 13 130 82\n13c3 6 131 82\nFUNC 13d0 32 0 std::out_of_range::~out_of_range()\n13d0 3 134 82\n13d3 2f 135 82\nFUNC 1410 47 0 std::out_of_range::`vector deleting destructor'(unsigned int)\nFUNC 1460 19 4 std::out_of_range::out_of_range(std::out_of_range const &)\nFUNC 1480 71 4 std::logic_error::logic_error(std::logic_error const &)\nFUNC 1500 1b 8 google_breakpad::WindowsStringUtils::safe_swprintf(wchar_t *,unsigned int,wchar_t const *,...)\n1500 0 94 63\n1500 1a 97 63\n151a 1 105 63\nFUNC 1520 35 0 google_breakpad::ExceptionHandler::set_dump_path(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > const &)\n1520 4 137 43\n1524 f 138 43\n1533 c 139 43\n153f 7 140 43\n1546 1 141 43\n1547 6 139 43\n154d 7 140 43\n1554 1 141 43\nFUNC 1560 20b 14 google_breakpad::ExceptionHandler::ExceptionHandler(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > const &,bool (*)(void *,_EXCEPTION_POINTERS *,MDRawAssertionInfo *),bool (*)(wchar_t const *,wchar_t const *,void *,_EXCEPTION_POINTERS *,MDRawAssertionInfo *,bool),void *,bool)\n1560 6d 75 12\n15cd 90 78 12\n165d 9 86 12\n1666 d 87 12\n1673 d 88 12\n1680 1e 96 12\n169e 11 98 12\n16af 7 99 12\n16b6 f 101 12\n16c5 a 104 12\n16cf 8 105 12\n16d7 7 106 12\n16de 7 107 12\n16e5 b 110 12\n16f0 8 114 12\n16f8 25 115 12\n171d d 117 12\n172a b 118 12\n1735 10 121 12\n1745 e 124 12\n1753 18 126 12\nFUNC 1770 274 0 google_breakpad::ExceptionHandler::~ExceptionHandler()\n1770 e 128 12\n177e a 129 12\n1788 7 130 12\n178f a 133 12\n1799 b 134 12\n17a4 a 136 12\n17ae 9 139 12\n17b7 63 142 12\n181a 23 143 12\n183d 5 144 12\n1842 13 147 12\n1855 2b 149 12\n1880 2a 151 12\n18aa 17 152 12\n18c1 2c 153 12\n18ed 19 151 12\n1906 11 158 12\n1917 23 161 12\n193a 6 162 12\n1940 d 165 12\n194d f 169 12\n195c d 170 12\n1969 f 171 12\n1978 9 172 12\n1981 63 173 12\nFUNC 19f0 31 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::`scalar deleting destructor'(unsigned int)\nFUNC 1a30 51 4 google_breakpad::ExceptionHandler::ExceptionHandlerThreadMain(void *)\n1a30 13 176 12\n1a43 f 182 12\n1a52 1a 185 12\n1a6c 13 188 12\n1a7f 2 190 12\nFUNC 1a90 c7 4 google_breakpad::AutoExceptionHandler::AutoExceptionHandler()\n1a90 7 204 12\n1a97 b 221 12\n1aa2 82 224 12\n1b24 d 225 12\n1b31 c 229 12\n1b3d e 231 12\n1b4b c 233 12\nFUNC 1b60 36 0 google_breakpad::AutoExceptionHandler::~AutoExceptionHandler()\n1b60 0 235 12\n1b60 b 237 12\n1b6b d 239 12\n1b78 b 242 12\n1b83 7 243 12\n1b8a b 244 12\n1b95 1 245 12\nFUNC 1ba0 3 0 google_breakpad::AutoExceptionHandler::get_handler()\n1ba0 3 247 12\nFUNC 1bb0 c4 4 google_breakpad::ExceptionHandler::HandleException(_EXCEPTION_POINTERS *)\n1bb0 2b 254 12\n1bdb a 255 12\n1be5 f 262 12\n1bf4 1e 265 12\n1c12 5 273 12\n1c17 2 274 12\n1c19 7 283 12\n1c20 5 284 12\n1c25 2 285 12\n1c27 2 286 12\n1c29 37 290 12\n1c60 14 291 12\nFUNC 1c80 121 14 google_breakpad::ExceptionHandler::HandleInvalidParameter(wchar_t const *,wchar_t const *,wchar_t const *,unsigned int,unsigned int)\n1c80 40 299 12\n1cc0 b7 319 12\n1d77 7 320 12\n1d7e 14 323 12\n1d92 2 324 12\n1d94 5 337 12\n1d99 8 345 12\nFUNC 1db0 81 8 google_breakpad::ExceptionHandler::WriteMinidumpOnHandlerThread(_EXCEPTION_POINTERS *,MDRawAssertionInfo *)\n1db0 2 350 12\n1db2 d 351 12\n1dbf 6 354 12\n1dc5 2b 359 12\n1df0 f 362 12\n1dff 6 363 12\n1e05 26 370 12\n1e2b 3 372 12\n1e2e 3 373 12\nFUNC 1e40 1d 0 google_breakpad::ExceptionHandler::WriteMinidump()\n1e40 3 375 12\n1e43 b 376 12\n1e4e b 377 12\n1e59 3 378 12\n1e5c 1 379 12\nFUNC 1e60 a2 4 google_breakpad::ExceptionHandler::WriteMinidump(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > const &,bool (*)(wchar_t const *,wchar_t const *,void *,_EXCEPTION_POINTERS *,MDRawAssertionInfo *,bool),void *)\n1e60 41 384 12\n1ea1 10 385 12\n1eb1 2a 386 12\n1edb 27 387 12\nFUNC 1f10 142 c google_breakpad::ExceptionHandler::WriteMinidumpWithException(unsigned long,_EXCEPTION_POINTERS *,MDRawAssertionInfo *)\n1f10 0 392 12\n1f10 22 399 12\n1f32 7 466 12\n1f39 2 403 12\n1f3b e 404 12\n1f49 1f 411 12\n1f68 9 412 12\n1f71 8 414 12\n1f79 4 415 12\n1f7d 8 416 12\n1f85 8 426 12\n1f8d a 427 12\n1f97 34 440 12\n1fcb 8 441 12\n1fd3 8 442 12\n1fdb 4 443 12\n1fdf 8 444 12\n1fe7 30 454 12\n2017 c 456 12\n2023 7 460 12\n202a 1e 462 12\n2048 4 465 12\n204c 6 466 12\nFUNC 2060 138 0 google_breakpad::ExceptionHandler::UpdateNextID()\n2060 38 468 12\n2098 b 470 12\n20a3 4a 471 12\n20ed 25 472 12\n2112 1c 477 12\n212e 31 478 12\n215f 14 479 12\n2173 25 480 12\nFUNC 21a0 3b 4 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >(char const *)\n21a0 0 650 17\n21a0 35 652 17\n21d5 6 653 17\nFUNC 21e0 25 4 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &)\n21e0 1 720 17\n21e1 4 721 17\n21e5 1a 722 17\n21ff 6 723 17\nFUNC 2210 26 0 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >()\n2210 3 904 17\n2213 22 905 17\n2235 1 906 17\nFUNC 2240 e 0 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::c_str()\n2240 0 1621 17\n2240 9 1622 17\n2249 1 1623 17\n224a 3 1622 17\n224d 1 1623 17\nFUNC 2250 4 0 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::size()\n2250 0 1636 17\n2250 3 1637 17\n2253 1 1638 17\nFUNC 2260 11 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >()\n2260 0 564 17\n2260 10 565 17\n2270 1 566 17\nFUNC 2280 27 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::~basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >()\n2280 3 904 17\n2283 23 905 17\n22a6 1 906 17\nFUNC 22b0 b 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::operator=(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > const &)\n22b0 0 914 17\n22b0 a 915 17\n22ba 1 916 17\nFUNC 22c0 24 4 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::operator=(wchar_t const *)\n22c0 0 919 17\n22c0 21 920 17\n22e1 3 921 17\nFUNC 22f0 e 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::c_str()\n22f0 0 1621 17\n22f0 9 1622 17\n22f9 1 1623 17\n22fa 3 1622 17\n22fd 1 1623 17\nFUNC 2300 c 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >()\n2300 0 457 23\n2300 b 458 23\n230b 1 459 23\nFUNC 2310 26 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::~vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >()\n2310 0 545 23\n2310 25 546 23\n2335 1 547 23\nFUNC 2340 1d 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::begin()\n2340 1 627 23\n2341 1b 628 23\n235c 1 629 23\nFUNC 2360 1d 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::end()\n2360 1 637 23\n2361 1b 638 23\n237c 1 639 23\nFUNC 2380 13 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::size()\n2380 0 702 23\n2380 9 703 23\n2389 1 704 23\n238a 8 703 23\n2392 1 704 23\nFUNC 23a0 23 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::empty()\n23a0 0 712 23\n23a0 10 713 23\n23b0 1 714 23\n23b1 11 713 23\n23c2 1 714 23\nFUNC 23d0 56 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::at(unsigned int)\n23d0 b 729 23\n23db 15 730 23\n23f0 5 731 23\n23f5 29 732 23\n241e 8 733 23\nFUNC 2430 47 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::back()\n2430 c 776 23\n243c 32 777 23\n246e 9 778 23\nFUNC 2480 68 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::push_back(google_breakpad::ExceptionHandler * const &)\n2480 10 786 23\n2490 24 787 23\n24b4 d 796 23\n24c1 6 801 23\n24c7 1b 800 23\n24e2 6 801 23\nFUNC 24f0 23 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::pop_back()\n24f0 6 818 23\n24f6 15 819 23\n250b 6 822 23\n2511 2 824 23\nFUNC 2520 3f 8 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::erase(std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >)\n2520 7 996 23\n2527 24 998 23\n254b 11 1001 23\n255c 3 1002 23\nFUNC 2560 20 0 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator*()\n2560 0 325 23\n2560 1c 326 23\n257c 1 327 23\n257d 2 326 23\n257f 1 327 23\nFUNC 2580 20 0 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator++()\n2580 0 335 23\n2580 1d 336 23\n259d 2 337 23\n259f 1 338 23\nFUNC 25a0 1d 0 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator!=(std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> > const &)\n25a0 0 202 23\n25a0 1c 203 23\n25bc 1 204 23\nFUNC 25c0 da c std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,unsigned int,unsigned int)\n25c0 1 1038 17\n25c1 12 1039 17\n25d3 5 1040 17\n25d8 3 1041 17\n25db a 1042 17\n25e5 2 1043 17\n25e7 4 1045 17\n25eb 17 1046 17\n2602 5 1052 17\n2607 3 1053 17\n260a 21 1047 17\n262b b 1049 17\n2636 13 1047 17\n2649 5 1052 17\n264e 3 1053 17\n2651 7 1047 17\n2658 5 1052 17\n265d 3 1053 17\n2660 22 1049 17\n2682 10 1050 17\n2692 5 1052 17\n2697 3 1053 17\nFUNC 26a0 27 4 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(char const *)\n26a0 1 1069 17\n26a1 23 1070 17\n26c4 3 1071 17\nFUNC 26d0 4a 8 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(bool,unsigned int)\n26d0 0 2066 17\n26d0 f 2067 17\n26df 6 2069 17\n26e5 a 2072 17\n26ef d 2073 17\n26fc a 2074 17\n2706 11 2077 17\n2717 3 2078 17\nFUNC 2720 e 0 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Myptr()\n2720 0 2092 17\n2720 9 2093 17\n2729 1 2094 17\n272a 3 2093 17\n272d 1 2094 17\nFUNC 2730 5 4 std::_String_val<char,std::allocator<char> >::_String_val<char,std::allocator<char> >(std::allocator<char>)\n2730 2 471 17\n2732 3 472 17\nFUNC 2740 5 4 std::_String_val<char,std::allocator<char> >::_String_val<char,std::allocator<char> >(std::_String_val<char,std::allocator<char> > const &)\n2740 2 477 17\n2742 3 484 17\nFUNC 2750 3 0 std::allocator<char>::allocator<char>()\n2750 2 120 19\n2752 1 122 19\nFUNC 2760 b 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::assign(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > const &)\n2760 0 1032 17\n2760 a 1033 17\n276a 1 1034 17\nFUNC 2770 ef c std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::assign(std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> > const &,unsigned int,unsigned int)\n2770 1 1038 17\n2771 12 1039 17\n2783 5 1040 17\n2788 3 1041 17\n278b a 1042 17\n2795 2 1043 17\n2797 4 1045 17\n279b 17 1046 17\n27b2 5 1052 17\n27b7 3 1053 17\n27ba 24 1047 17\n27de b 1049 17\n27e9 13 1047 17\n27fc 5 1052 17\n2801 3 1053 17\n2804 9 1047 17\n280d 5 1052 17\n2812 3 1053 17\n2815 2f 1049 17\n2844 13 1050 17\n2857 5 1052 17\n285c 3 1053 17\nFUNC 2860 2b 4 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::assign(wchar_t const *)\n2860 1 1069 17\n2861 27 1070 17\n2888 3 1071 17\nFUNC 2890 4f 8 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Tidy(bool,unsigned int)\n2890 0 2066 17\n2890 f 2067 17\n289f 6 2069 17\n28a5 a 2072 17\n28af 10 2073 17\n28bf a 2074 17\n28c9 13 2077 17\n28dc 3 2078 17\nFUNC 28e0 e 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Myptr()\n28e0 0 2092 17\n28e0 9 2093 17\n28e9 1 2094 17\n28ea 3 2093 17\n28ed 1 2094 17\nFUNC 28f0 5 4 std::_String_val<wchar_t,std::allocator<wchar_t> >::_String_val<wchar_t,std::allocator<wchar_t> >(std::allocator<wchar_t>)\n28f0 2 471 17\n28f2 3 472 17\nFUNC 2900 3 0 std::allocator<wchar_t>::allocator<wchar_t>()\n2900 2 120 19\n2902 1 122 19\nFUNC 2910 13 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::capacity()\n2910 0 621 23\n2910 9 622 23\n2919 1 623 23\n291a 8 622 23\n2922 1 623 23\nFUNC 2930 86 c std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::insert(std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >,google_breakpad::ExceptionHandler * const &)\n2930 3 852 23\n2933 3e 853 23\n2971 11 854 23\n2982 2a 855 23\n29ac a 856 23\nFUNC 29c0 23 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Buy(unsigned int)\n29c0 0 1066 23\n29c0 8 1070 23\n29c8 5 1071 23\n29cd a 1074 23\n29d7 3 1075 23\n29da 6 1076 23\n29e0 2 1078 23\n29e2 1 1079 23\nFUNC 29f0 1 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Destroy(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *)\n29f0 0 1082 23\n29f0 1 1084 23\nFUNC 2a00 26 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Tidy()\n2a00 0 1087 23\n2a00 7 1088 23\n2a07 9 1096 23\n2a10 15 1098 23\n2a25 1 1099 23\nFUNC 2a30 23 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Ufill(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &)\n2a30 0 1207 23\n2a30 1f 1208 23\n2a4f 3 1209 23\n2a52 1 1210 23\nFUNC 2a60 76 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Xran()\n2a60 23 1218 23\n2a83 53 1219 23\nFUNC 2ae0 3 4 std::_Vector_val<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Vector_val<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(std::allocator<google_breakpad::ExceptionHandler *>)\n2ae0 0 412 23\n2ae0 3 413 23\nFUNC 2af0 1 0 std::allocator<google_breakpad::ExceptionHandler *>::allocator<google_breakpad::ExceptionHandler *>()\n2af0 0 120 19\n2af0 1 122 19\nFUNC 2b00 21 0 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,std::_Container_base const *)\n2b00 1e 314 23\n2b1e 3 315 23\nFUNC 2b30 32 4 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator+(int)\n2b30 1 367 23\n2b31 2 368 23\n2b33 26 369 23\n2b59 9 370 23\nFUNC 2b70 2f 0 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator-(int)\n2b70 1 378 23\n2b71 2 379 23\n2b73 25 380 23\n2b98 7 381 23\nFUNC 2ba0 20 0 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator*()\n2ba0 0 92 23\n2ba0 a 103 23\n2baa f 104 23\n2bb9 3 107 23\n2bbc 1 108 23\n2bbd 2 107 23\n2bbf 1 108 23\nFUNC 2bc0 20 0 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator++()\n2bc0 0 116 23\n2bc0 a 117 23\n2bca f 118 23\n2bd9 4 119 23\n2bdd 2 120 23\n2bdf 1 121 23\nFUNC 2be0 1d 0 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator==(std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> > const &)\n2be0 0 190 23\n2be0 f 195 23\n2bef d 198 23\n2bfc 1 199 23\nFUNC 2c00 c1 8 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(char const *,unsigned int)\n2c00 5 1056 17\n2c05 2d 1057 17\n2c32 1a 1058 17\n2c4c 4 1066 17\n2c50 25 1060 17\n2c75 c 1062 17\n2c81 f 1060 17\n2c90 8 1065 17\n2c98 3 1066 17\n2c9b e 1062 17\n2ca9 10 1063 17\n2cb9 5 1065 17\n2cbe 3 1066 17\nFUNC 2cd0 83 8 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::erase(unsigned int,unsigned int)\n2cd0 1 1240 17\n2cd1 d 1241 17\n2cde 5 1242 17\n2ce3 d 1243 17\n2cf0 2 1244 17\n2cf2 4 1245 17\n2cf6 3c 1248 17\n2d32 8 1249 17\n2d3a 12 1250 17\n2d4c 4 1252 17\n2d50 3 1253 17\nFUNC 2d60 1f 4 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Eos(unsigned int)\n2d60 0 2030 17\n2d60 14 2031 17\n2d74 3 2032 17\n2d77 5 2031 17\n2d7c 3 2032 17\nFUNC 2d80 bc 8 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Grow(unsigned int,bool)\n2d80 1 2036 17\n2d81 c 2037 17\n2d8d 5 2038 17\n2d92 7 2039 17\n2d99 c 2040 17\n2da5 a 2046 17\n2daf 3 2047 17\n2db2 d 2041 17\n2dbf 39 2043 17\n2df8 10 2046 17\n2e08 3 2047 17\n2e0b 4 2044 17\n2e0f b 2045 17\n2e1a c 2046 17\n2e26 3 2047 17\n2e29 6 2045 17\n2e2f a 2046 17\n2e39 3 2047 17\nFUNC 2e40 e 0 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Myptr()\n2e40 0 2087 17\n2e40 9 2088 17\n2e49 1 2089 17\n2e4a 3 2088 17\n2e4d 1 2089 17\nFUNC 2e50 5 4 std::allocator<char>::allocator<char>(std::allocator<char> const &)\n2e50 2 124 19\n2e52 3 126 19\nFUNC 2e60 e 8 std::allocator<char>::deallocate(char *,unsigned int)\n2e60 0 140 19\n2e60 b 141 19\n2e6b 3 142 19\nFUNC 2e70 da 8 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::assign(wchar_t const *,unsigned int)\n2e70 4 1056 17\n2e74 31 1057 17\n2ea5 1d 1058 17\n2ec2 3 1066 17\n2ec5 28 1060 17\n2eed d 1062 17\n2efa 10 1060 17\n2f0a a 1065 17\n2f14 3 1066 17\n2f17 18 1062 17\n2f2f 14 1063 17\n2f43 4 1065 17\n2f47 3 1066 17\nFUNC 2f50 97 8 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::erase(unsigned int,unsigned int)\n2f50 1 1240 17\n2f51 d 1241 17\n2f5e 5 1242 17\n2f63 d 1243 17\n2f70 2 1244 17\n2f72 4 1245 17\n2f76 4d 1248 17\n2fc3 8 1249 17\n2fcb 15 1250 17\n2fe0 4 1252 17\n2fe4 3 1253 17\nFUNC 2ff0 4 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::size()\n2ff0 0 1636 17\n2ff0 3 1637 17\n2ff3 1 1638 17\nFUNC 3000 23 4 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Eos(unsigned int)\n3000 0 2030 17\n3000 16 2031 17\n3016 3 2032 17\n3019 7 2031 17\n3020 3 2032 17\nFUNC 3030 c7 8 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Grow(unsigned int,bool)\n3030 1 2036 17\n3031 f 2037 17\n3040 5 2038 17\n3045 7 2039 17\n304c c 2040 17\n3058 a 2046 17\n3062 3 2047 17\n3065 d 2041 17\n3072 3c 2043 17\n30ae 12 2046 17\n30c0 3 2047 17\n30c3 4 2044 17\n30c7 b 2045 17\n30d2 d 2046 17\n30df 3 2047 17\n30e2 8 2045 17\n30ea a 2046 17\n30f4 3 2047 17\nFUNC 3100 e 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Myptr()\n3100 0 2087 17\n3100 9 2088 17\n3109 1 2089 17\n310a 3 2088 17\n310d 1 2089 17\nFUNC 3110 5 4 std::allocator<wchar_t>::allocator<wchar_t>(std::allocator<wchar_t> const &)\n3110 2 124 19\n3112 3 126 19\nFUNC 3120 e 8 std::allocator<wchar_t>::deallocate(wchar_t *,unsigned int)\n3120 0 140 19\n3120 b 141 19\n312b 3 142 19\nFUNC 3130 6 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::max_size()\n3130 0 707 23\n3130 5 708 23\n3135 1 709 23\nFUNC 3140 208 8 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Insert_n(std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >,unsigned int,google_breakpad::ExceptionHandler * const &)\n3140 6 1117 23\n3146 2 1125 23\n3148 1c 1126 23\n3164 1c 1130 23\n3180 5 1131 23\n3185 1b 1132 23\n31a0 23 1135 23\n31c3 17 1136 23\n31da 19 1137 23\n31f3 7 1138 23\n31fa 25 1143 23\n321f 7 1144 23\n3226 1e 1145 23\n3244 13 1152 23\n3257 4 1153 23\n325b 9 1156 23\n3264 7 1163 23\n326b a 1164 23\n3275 3 1165 23\n3278 a 1204 23\n3282 13 1167 23\n3295 17 1170 23\n32ac 1a 1174 23\n32c6 7 1180 23\n32cd 16 1187 23\n32e3 a 1204 23\n32ed 2a 1193 23\n3317 e 1200 23\n3325 19 1202 23\n333e a 1204 23\nFUNC 3350 7c 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Xlen()\n3350 29 1213 23\n3379 53 1214 23\nFUNC 33d0 1 0 std::allocator<google_breakpad::ExceptionHandler *>::allocator<google_breakpad::ExceptionHandler *>(std::allocator<google_breakpad::ExceptionHandler *> const &)\n33d0 0 124 19\n33d0 1 126 19\nFUNC 33e0 8 0 std::allocator<google_breakpad::ExceptionHandler *>::deallocate(google_breakpad::ExceptionHandler * *,unsigned int)\n33e0 0 140 19\n33e0 7 141 19\n33e7 1 142 19\nFUNC 33f0 56 0 std::allocator<google_breakpad::ExceptionHandler *>::allocate(unsigned int)\n33f0 3 145 19\n33f3 16 146 19\n3409 4 147 19\n340d 39 146 19\nFUNC 3450 32 4 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator+=(int)\n3450 0 361 23\n3450 2c 362 23\n347c 3 363 23\n347f 3 364 23\nFUNC 3490 28 0 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator-=(int)\n3490 0 373 23\n3490 27 374 23\n34b7 1 375 23\nFUNC 34c0 19 0 std::_Vector_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator-(std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> > const &)\n34c0 0 384 23\n34c0 18 385 23\n34d8 1 386 23\nFUNC 34e0 21 0 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,std::_Container_base const *)\n34e0 0 77 23\n34e0 19 79 23\n34f9 2 80 23\n34fb 3 81 23\n34fe 3 82 23\nFUNC 3510 19 4 std::length_error::length_error(std::length_error const &)\nFUNC 3530 7 0 std::_Ranit<google_breakpad::ExceptionHandler *,int,google_breakpad::ExceptionHandler * const *,google_breakpad::ExceptionHandler * const &>::_Ranit<google_breakpad::ExceptionHandler *,int,google_breakpad::ExceptionHandler * const *,google_breakpad::ExceptionHandler * const &>()\nFUNC 3540 6 0 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::max_size()\n3540 0 1641 17\n3540 5 1643 17\n3545 1 1644 17\nFUNC 3550 171 8 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Copy(unsigned int,unsigned int)\n3550 30 2000 17\n3580 8 2001 17\n3588 5 2002 17\n358d 2 2003 17\n358f 2 2004 17\n3591 1f 2005 17\n35b0 3 2006 17\n35b3 2 2009 17\n35b5 18 2010 17\n35cd 2 2019 17\n35cf 30 2010 17\n35ff 3 2012 17\n3602 19 2014 17\n361b c 2019 17\n3627 7 2021 17\n362e 20 2022 17\n364e 12 2023 17\n3660 1c 2026 17\n367c 14 2027 17\n3690 15 2016 17\n36a5 1c 2017 17\nFUNC 36d0 39 4 std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Inside(char const *)\n36d0 1 2050 17\n36d1 2b 2052 17\n36fc 3 2055 17\n36ff 4 2056 17\n3703 3 2053 17\n3706 3 2056 17\nFUNC 3710 6 0 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::max_size()\n3710 0 1641 17\n3710 5 1643 17\n3715 1 1644 17\nFUNC 3720 17b 8 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Copy(unsigned int,unsigned int)\n3720 30 2000 17\n3750 8 2001 17\n3758 8 2002 17\n3760 2 2003 17\n3762 2 2004 17\n3764 1f 2005 17\n3783 3 2006 17\n3786 2 2009 17\n3788 1b 2010 17\n37a3 2 2019 17\n37a5 30 2010 17\n37d5 3 2012 17\n37d8 19 2014 17\n37f1 c 2019 17\n37fd 7 2021 17\n3804 24 2022 17\n3828 12 2023 17\n383a 20 2026 17\n385a 14 2027 17\n386e 17 2016 17\n3885 16 2017 17\nFUNC 38a0 3a 4 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Inside(wchar_t const *)\n38a0 1 2050 17\n38a1 2c 2052 17\n38cd 3 2055 17\n38d0 4 2056 17\n38d4 3 2053 17\n38d7 3 2056 17\nFUNC 38e0 6 0 std::allocator<google_breakpad::ExceptionHandler *>::max_size()\n38e0 0 165 19\n38e0 5 167 19\n38e5 1 168 19\nFUNC 38f0 32 4 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator+=(int)\n38f0 0 146 23\n38f0 a 147 23\n38fa 1a 148 23\n3914 5 150 23\n3919 3 151 23\n391c 3 152 23\n391f 3 153 23\nFUNC 3930 19 0 std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::operator-(std::_Vector_const_iterator<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> > const &)\n3930 0 173 23\n3930 f 178 23\n393f 9 181 23\n3948 1 182 23\nFUNC 3950 56 4 std::allocator<char>::allocate(unsigned int)\n3950 0 145 19\n3950 16 146 19\n3966 6 147 19\n396c 3a 146 19\nFUNC 39b0 4 0 std::allocator<char>::max_size()\n39b0 0 165 19\n39b0 3 167 19\n39b3 1 168 19\nFUNC 39c0 59 4 std::allocator<wchar_t>::allocate(unsigned int)\n39c0 0 145 19\n39c0 19 146 19\n39d9 6 147 19\n39df 3a 146 19\nFUNC 3a20 6 0 std::allocator<wchar_t>::max_size()\n3a20 0 165 19\n3a20 5 167 19\n3a25 1 168 19\nFUNC 3a30 21 10 std::_Traits_helper::copy_s<std::char_traits<char> >(char *,unsigned int,char const *,unsigned int)\n3a30 0 581 70\n3a30 20 582 70\n3a50 1 583 70\nFUNC 3a60 27 10 std::_Traits_helper::copy_s<std::char_traits<wchar_t> >(wchar_t *,unsigned int,wchar_t const *,unsigned int)\n3a60 0 581 70\n3a60 26 582 70\n3a86 1 583 70\nFUNC 3a90 24 0 stdext::unchecked_copy<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *)\n3a90 0 3407 65\n3a90 23 3409 65\n3ab3 1 3410 65\nFUNC 3ac0 1 0 std::_Destroy_range<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> &)\n3ac0 0 225 19\n3ac0 1 227 19\nFUNC 3ad0 15 0 stdext::unchecked_uninitialized_fill_n<google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::allocator<google_breakpad::ExceptionHandler *> &)\n3ad0 0 914 24\n3ad0 14 916 24\n3ae4 1 917 24\nFUNC 3af0 21 10 std::_Traits_helper::move_s<std::char_traits<char> >(char *,unsigned int,char const *,unsigned int)\n3af0 0 608 70\n3af0 20 609 70\n3b10 1 610 70\nFUNC 3b20 27 10 std::_Traits_helper::move_s<std::char_traits<wchar_t> >(wchar_t *,unsigned int,wchar_t const *,unsigned int)\n3b20 0 608 70\n3b20 26 609 70\n3b46 1 610 70\nFUNC 3b50 22 0 std::vector<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >::_Umove<google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *)\n3b50 0 1109 23\n3b50 21 1112 23\n3b71 1 1113 23\nFUNC 3b80 10 0 std::fill<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler *>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * const &)\n3b80 0 2976 65\n3b80 f 2977 65\n3b8f 1 2978 65\nFUNC 3b90 25 0 stdext::_Unchecked_move_backward<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *)\n3b90 0 3497 65\n3b90 24 3499 65\n3bb4 1 3500 65\nFUNC 3bc0 4f 0 std::_Allocate<google_breakpad::ExceptionHandler *>(unsigned int,google_breakpad::ExceptionHandler * *)\n3bc0 0 37 19\n3bc0 f 40 19\n3bcf 2c 41 19\n3bfb 10 44 19\n3c0b 4 45 19\nFUNC 3c10 54 8 std::_Allocate<char>(unsigned int,char *)\n3c10 0 37 19\n3c10 b 38 19\n3c1b 2 39 19\n3c1d 9 44 19\n3c26 4 45 19\n3c2a c 40 19\n3c36 2e 41 19\nFUNC 3c70 57 8 std::_Allocate<wchar_t>(unsigned int,wchar_t *)\n3c70 0 37 19\n3c70 b 38 19\n3c7b 2 39 19\n3c7d c 44 19\n3c89 4 45 19\n3c8d c 40 19\n3c99 2e 41 19\nFUNC 3cd0 19 4 std::bad_alloc::bad_alloc(std::bad_alloc const &)\nFUNC 3cf0 7 0 std::_Char_traits_cat<std::char_traits<char> >()\n3cf0 1 568 70\n3cf1 4 570 70\n3cf5 2 571 70\nFUNC 3d00 21 14 std::_Traits_helper::copy_s<std::char_traits<char> >(char *,unsigned int,char const *,unsigned int,std::_Secure_char_traits_tag)\n3d00 0 589 70\n3d00 20 590 70\n3d20 1 591 70\nFUNC 3d30 7 0 std::_Char_traits_cat<std::char_traits<wchar_t> >()\n3d30 1 568 70\n3d31 4 570 70\n3d35 2 571 70\nFUNC 3d40 27 14 std::_Traits_helper::copy_s<std::char_traits<wchar_t> >(wchar_t *,unsigned int,wchar_t const *,unsigned int,std::_Secure_char_traits_tag)\n3d40 0 589 70\n3d40 26 590 70\n3d66 1 591 70\nFUNC 3d70 3 0 std::_Checked_base<google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * * &)\n3d70 0 1009 65\n3d70 2 1011 65\n3d72 1 1012 65\nFUNC 3d80 1 0 std::_Iter_random<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * * const &,google_breakpad::ExceptionHandler * * const &)\n3d80 0 839 65\n3d80 1 844 65\nFUNC 3d90 7 0 std::_Ptr_cat<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * * &,google_breakpad::ExceptionHandler * * &)\n3d90 1 1329 65\n3d91 4 1331 65\n3d95 2 1332 65\nFUNC 3da0 15 4 std::_Copy_opt<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag)\n3da0 0 2288 65\n3da0 d 2300 65\n3dad 7 2301 65\n3db4 1 2302 65\nFUNC 3dc0 1 4 std::_Destroy_range<google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> &,std::_Scalar_ptr_iterator_tag)\n3dc0 0 242 19\n3dc0 1 243 19\nFUNC 3dd0 15 8 std::_Uninit_fill_n<google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::allocator<google_breakpad::ExceptionHandler *> &,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag)\n3dd0 0 415 24\n3dd0 14 416 24\n3de4 1 417 24\nFUNC 3df0 21 14 std::_Traits_helper::move_s<std::char_traits<char> >(char *,unsigned int,char const *,unsigned int,std::_Secure_char_traits_tag)\n3df0 0 616 70\n3df0 20 617 70\n3e10 1 618 70\nFUNC 3e20 27 14 std::_Traits_helper::move_s<std::char_traits<wchar_t> >(wchar_t *,unsigned int,wchar_t const *,unsigned int,std::_Secure_char_traits_tag)\n3e20 0 616 70\n3e20 26 617 70\n3e46 1 618 70\nFUNC 3e50 22 0 stdext::_Unchecked_uninitialized_move<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> &)\n3e50 0 843 24\n3e50 21 845 24\n3e71 1 846 24\nFUNC 3e80 10 0 std::_Fill<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler *>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * const &)\n3e80 0 2946 65\n3e80 6 2948 65\n3e86 9 2949 65\n3e8f 1 2950 65\nFUNC 3e90 7 0 std::_Move_cat<google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * * const &)\n3e90 1 1046 65\n3e91 4 1048 65\n3e95 2 1049 65\nFUNC 3ea0 25 c std::_Move_backward_opt<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Undefined_move_tag>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Undefined_move_tag,std::_Range_checked_iterator_tag)\n3ea0 0 2546 65\n3ea0 24 2548 65\n3ec4 1 2549 65\nFUNC 3ed0 3 4 std::_Checked_base<google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * * &,std::_Unchanged_checked_iterator_base_type_tag)\n3ed0 0 992 65\n3ed0 2 993 65\n3ed2 1 994 65\nFUNC 3ee0 15 0 stdext::unchecked_fill_n<google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler *>(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &)\n3ee0 0 3523 65\n3ee0 14 3524 65\n3ef4 1 3525 65\nFUNC 3f00 22 8 std::_Uninit_move<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *>,std::_Undefined_move_tag>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> &,std::_Undefined_move_tag,std::_Range_checked_iterator_tag)\n3f00 0 205 24\n3f00 21 206 24\n3f21 1 207 24\nFUNC 3f30 13 0 std::_Copy_backward_opt<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag>(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::random_access_iterator_tag,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag)\n3f30 0 2492 65\n3f30 10 2506 65\n3f40 2 2507 65\n3f42 1 2508 65\nFUNC 3f50 1 0 std::_Iter_cat<google_breakpad::ExceptionHandler * *>(google_breakpad::ExceptionHandler * * const &)\n3f50 0 798 65\n3f50 1 801 65\nFUNC 3f60 15 8 std::_Fill_n<google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler *>(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::random_access_iterator_tag,std::_Range_checked_iterator_tag)\n3f60 0 3040 65\n3f60 14 3044 65\n3f74 1 3045 65\nFUNC 3f80 22 0 stdext::unchecked_uninitialized_copy<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> &)\n3f80 0 803 24\n3f80 21 805 24\n3fa1 1 806 24\nFUNC 3fb0 15 4 std::_Fill_n<google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler *>(google_breakpad::ExceptionHandler * *,unsigned int,google_breakpad::ExceptionHandler * const &,std::_Range_checked_iterator_tag)\n3fb0 0 2986 65\n3fb0 5 2987 65\n3fb5 f 2988 65\n3fc4 1 2989 65\nFUNC 3fd0 15 4 std::_Uninit_copy<google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> >(google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,google_breakpad::ExceptionHandler * *,std::allocator<google_breakpad::ExceptionHandler *> &,std::_Scalar_ptr_iterator_tag,std::_Range_checked_iterator_tag)\n3fd0 0 144 24\n3fd0 d 150 24\n3fdd 7 151 24\n3fe4 1 152 24\nFUNC 3ff0 13 4 vswprintf\n3ff0 0 50 147\n3ff0 12 51 147\n4002 1 52 147\nFUNC 4010 ae 4 google_breakpad::GUIDString::GUIDToWString(_GUID *)\n4010 12 43 126\n4022 51 51 126\n4073 3a 52 126\n40ad 11 53 126\nFUNC 40c0 ae 4 google_breakpad::GUIDString::GUIDToSymbolServerWString(_GUID *)\n40c0 12 56 126\n40d2 51 64 126\n4123 3a 65 126\n415d 11 66 126\nFUNC 4170 40 4 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >(wchar_t const *)\n4170 0 650 143\n4170 3a 652 143\n41aa 6 653 143\nFUNC 41b0 86 8 main\n41b0 13 63 178\n41c3 38 64 178\n41fb 5 65 178\n4200 d 66 178\n420d 1b 67 178\n4228 e 68 178\nFUNC 4240 41 18 `anonymous namespace'::callback\n4240 3 45 178\n4243 8 46 178\n424b 11 47 178\n425c 2 48 178\n425e d 49 178\n426b 11 51 178\n427c 3 53 178\n427f 2 54 178\nFUNC 4290 18 0 `anonymous namespace'::CrashFunction\n4290 4 56 178\n4294 7 57 178\n429b 9 58 178\n42a4 4 59 178\nFUNC 42ae 18 4 std::invalid_argument::invalid_argument(std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &)\n42ae 12 82 298\n42c0 6 83 298\nFUNC 42c6 b 0 std::invalid_argument::~invalid_argument()\n42c6 6 86 298\n42cc 5 87 298\nFUNC 42d1 22 0 std::invalid_argument::`vector deleting destructor'(unsigned int)\nFUNC 42f3 3f 0 std::_String_base::_Xlen()\n42f3 c 12 291\n42ff 33 13 291\nFUNC 4332 3f 0 std::_String_base::_Xran()\n4332 c 17 291\n433e 33 18 291\nFUNC 4371 3f 0 std::_String_base::_Xinvarg()\n4371 c 22 291\n437d 33 23 291\nFUNC 43b0 18 4 std::invalid_argument::invalid_argument(std::invalid_argument const &)\nFUNC 43c8 af 4 printf\n43c8 c 49 1601\n43d4 2b 54 1601\n43ff 14 58 1601\n4413 3 59 1601\n4416 10 61 1601\n4426 18 63 1601\n443e 11 65 1601\n444f c 68 1601\n445b 3 72 1601\n445e 6 73 1601\n4464 13 69 1601\nFUNC 4477 16 8 _printf_l\n4477 0 80 1601\n4477 15 85 1601\n448c 1 86 1601\nFUNC 448d 16 8 _printf_s_l\n448d 0 94 1601\n448d 15 99 1601\n44a2 1 100 1601\nFUNC 44a3 14 4 printf_s\n44a3 0 106 1601\n44a3 13 111 1601\n44b6 1 112 1601\nFUNC 44b7 16 8 _printf_p_l\n44b7 0 119 1601\n44b7 15 124 1601\n44cc 1 125 1601\nFUNC 44cd 14 4 _printf_p\n44cd 0 131 1601\n44cd 13 136 1601\n44e0 1 137 1601\nFUNC 44e1 25 4 _set_printf_count_output\n44e1 0 154 1601\n44e1 6 155 1601\n44e7 1e 156 1601\n4505 1 158 1601\nFUNC 4506 16 0 _get_printf_count_output\n4506 0 167 1601\n4506 15 168 1601\n451b 1 169 1601\nFUNC 451c f 0 __security_check_cookie\n451c 0 52 4397\n451c 6 55 4397\n4522 2 56 4397\n4524 2 57 4397\n4526 5 59 4397\nFUNC 452b 62 4 _flush\n452b 2 142 1704\n452d 25 152 1704\n4552 16 154 1704\n4568 7 158 1704\n456f 6 159 1704\n4575 2 161 1704\n4577 4 162 1704\n457b 4 163 1704\n457f 3 167 1704\n4582 7 168 1704\n4589 3 170 1704\n458c 1 171 1704\nFUNC 458d 42 4 _fflush_nolock\n458d 1 98 1704\n458e 8 102 1704\n4596 8 103 1704\n459e 1 116 1704\n459f b 106 1704\n45aa 4 108 1704\n45ae 1 116 1704\n45af 8 112 1704\n45b7 13 113 1704\n45ca 1 116 1704\n45cb 3 115 1704\n45ce 1 116 1704\nFUNC 45cf da 4 flsall\n45cf c 228 1704\n45db 5 230 1704\n45e0 3 231 1704\n45e3 8 233 1704\n45eb 3 234 1704\n45ee 11 236 1704\n45ff 14 238 1704\n4613 9 246 1704\n461c 6 248 1704\n4622 10 254 1704\n4632 5 256 1704\n4637 c 262 1704\n4643 3 266 1704\n4646 2 268 1704\n4648 a 269 1704\n4652 c 275 1704\n465e 3 276 1704\n4661 8 281 1704\n4669 3 236 1704\n466c 5 281 1704\n4671 11 282 1704\n4682 c 288 1704\n468e 4 292 1704\n4692 3 293 1704\n4695 2 292 1704\n4697 3 295 1704\n469a 6 296 1704\n46a0 9 289 1704\nFUNC 46a9 53 4 fflush\n46a9 c 57 1704\n46b5 7 62 1704\n46bc 9 63 1704\n46c5 9 65 1704\n46ce 3 67 1704\n46d1 c 68 1704\n46dd c 70 1704\n46e9 3 74 1704\n46ec 6 75 1704\n46f2 a 71 1704\nFUNC 46fc 9 0 _flushall\n46fc 0 193 1704\n46fc 8 194 1704\n4704 1 195 1704\nFUNC 4705 6 0 __iob_func\n4705 0 53 2087\n4705 5 54 2087\n470a 1 55 2087\nFUNC 470b b1 0 __initstdio\n470b 0 113 2087\n470b d 122 2087\n4718 7 123 2087\n471f 4 124 2087\n4723 7 125 2087\n472a 13 134 2087\n473d 19 137 2087\n4756 4 138 2087\n475a 1 163 2087\n475b e 145 2087\n4769 11 146 2087\n477a b 148 2087\n4785 24 151 2087\n47a9 2 158 2087\n47ab d 148 2087\n47b8 3 162 2087\n47bb 1 163 2087\nFUNC 47bc 20 0 __endstdio\n47bc 0 191 2087\n47bc 5 193 2087\n47c1 9 196 2087\n47ca 5 197 2087\n47cf c 198 2087\n47db 1 199 2087\nFUNC 47dc 3c 4 _lock_file\n47dc 1 221 2087\n47dd 15 226 2087\n47f2 10 231 2087\n4802 9 233 2087\n480b 1 242 2087\n480c b 241 2087\n4817 1 242 2087\nFUNC 4818 2e 8 _lock_file2\n4818 0 264 2087\n4818 9 269 2087\n4821 9 274 2087\n482a c 276 2087\n4836 1 285 2087\n4837 e 284 2087\n4845 1 285 2087\nFUNC 4846 36 4 _unlock_file\n4846 0 306 2087\n4846 14 311 2087\n485a 7 317 2087\n4861 f 318 2087\n4870 1 327 2087\n4871 a 326 2087\n487b 1 327 2087\nFUNC 487c 2a 8 _unlock_file2\n487c 0 349 2087\n487c 7 354 2087\n4883 d 360 2087\n4890 a 361 2087\n489a 1 370 2087\n489b a 369 2087\n48a5 1 370 2087\nFUNC 48a6 16 4 wcslen\n48a6 0 41 731\n48a6 4 42 731\n48aa a 44 731\n48b4 7 46 731\n48bb 1 47 731\nFUNC 48bc 5 4 operator delete(void *)\n48bc 0 20 5184\n48bc 5 23 5184\nFUNC 48c1 30 8 _JumpToContinuation(void *,EHRegistrationNode *)\n48c1 5 77 5627\n48c6 9 84 5627\n48cf 7 93 5627\n48d6 2 94 5627\n48d8 6 95 5627\n48de 3 100 5627\n48e1 3 101 5627\n48e4 3 102 5627\n48e7 3 103 5627\n48ea 2 104 5627\n48ec 5 106 5627\nFUNC 48f1 7 8 _CallMemberFunction0(void *,void *)\n48f1 0 118 5627\n48f1 1 120 5627\n48f2 1 121 5627\n48f3 3 122 5627\n48f6 2 123 5627\nFUNC 48f8 7 c _CallMemberFunction1(void *,void *,void *)\n48f8 0 139 5627\n48f8 1 141 5627\n48f9 1 142 5627\n48fa 3 143 5627\n48fd 2 144 5627\nFUNC 48ff 7 10 _CallMemberFunction2(void *,void *,void *,int)\n48ff 0 161 5627\n48ff 1 163 5627\n4900 1 164 5627\n4901 3 165 5627\n4904 2 166 5627\nFUNC 4906 52 8 _UnwindNestedFrames(EHRegistrationNode *,EHExceptionRecord *)\n4906 8 218 5627\n490e 7 232 5627\n4915 3 233 5627\n4918 7 236 5627\n491f 10 237 5627\n492f f 241 5627\n493e 7 247 5627\n4945 3 248 5627\n4948 2 249 5627\n494a 7 250 5627\n4951 7 256 5627\nFUNC 4958 36 10 __CxxFrameHandler\n4958 0 287 5627\n4958 1 295 5627\n4959 2 296 5627\n495b 3 297 5627\n495e 1 298 5627\n495f 1 299 5627\n4960 1 300 5627\n4961 1 301 5627\n4962 3 306 5627\n4965 1f 311 5627\n4984 1 316 5627\n4985 1 317 5627\n4986 1 318 5627\n4987 3 319 5627\n498a 2 320 5627\n498c 1 321 5627\n498d 1 322 5627\nFUNC 498e 36 10 __CxxFrameHandler3\n498e 0 341 5627\n498e 1 349 5627\n498f 2 350 5627\n4991 3 351 5627\n4994 1 352 5627\n4995 1 353 5627\n4996 1 354 5627\n4997 1 355 5627\n4998 3 360 5627\n499b 1f 365 5627\n49ba 1 370 5627\n49bb 1 371 5627\n49bc 1 372 5627\n49bd 3 373 5627\n49c0 2 374 5627\n49c2 1 375 5627\n49c3 1 376 5627\nFUNC 49c4 36 10 __CxxFrameHandler2\n49c4 0 391 5627\n49c4 1 399 5627\n49c5 2 400 5627\n49c7 3 401 5627\n49ca 1 402 5627\n49cb 1 403 5627\n49cc 1 404 5627\n49cd 1 405 5627\n49ce 3 410 5627\n49d1 1f 415 5627\n49f0 1 420 5627\n49f1 1 421 5627\n49f2 1 422 5627\n49f3 3 423 5627\n49f6 2 424 5627\n49f8 1 425 5627\n49f9 1 426 5627\nFUNC 49fa 1a 4 __CxxLongjmpUnwind\n49fa 0 443 5627\n49fa 17 449 5627\n4a11 3 452 5627\nFUNC 4a14 30 10 CatchGuardHandler\n4a14 1 545 5627\n4a15 1 551 5627\n4a16 e 557 5627\n4a24 1f 567 5627\n4a43 1 572 5627\nFUNC 4a44 d5 1c _CallSETranslator(EHExceptionRecord *,EHRegistrationNode *,void *,void *,_s_FuncInfo const *,int,EHRegistrationNode *)\n4a44 7 637 5627\n4a4b 9 642 5627\n4a54 5 644 5627\n4a59 3 645 5627\n4a5c 2 646 5627\n4a5e 8 648 5627\n4a66 4 656 5627\n4a6a 7 657 5627\n4a71 d 658 5627\n4a7e 6 659 5627\n4a84 6 660 5627\n4a8a 6 661 5627\n4a90 6 662 5627\n4a96 4 663 5627\n4a9a 4 664 5627\n4a9e 4 669 5627\n4aa2 3 675 5627\n4aa5 3 676 5627\n4aa8 6 681 5627\n4aae 3 682 5627\n4ab1 3 683 5627\n4ab4 6 684 5627\n4aba 7 690 5627\n4ac1 6 692 5627\n4ac7 6 693 5627\n4acd e 697 5627\n4adb e 701 5627\n4ae9 4 707 5627\n4aed 6 715 5627\n4af3 7 724 5627\n4afa 2 725 5627\n4afc 3 726 5627\n4aff 2 727 5627\n4b01 7 728 5627\n4b08 2 731 5627\n4b0a 3 737 5627\n4b0d 6 738 5627\n4b13 3 744 5627\n4b16 3 745 5627\nFUNC 4b19 9d 10 TranslatorGuardHandler\n4b19 5 770 5627\n4b1e 1 776 5627\n4b1f e 782 5627\n4b2d b 784 5627\n4b38 a 786 5627\n4b42 5 790 5627\n4b47 2 792 5627\n4b49 2a 796 5627\n4b73 9 798 5627\n4b7c b 802 5627\n4b87 1b 811 5627\n4ba2 3 818 5627\n4ba5 3 819 5627\n4ba8 3 820 5627\n4bab 3 821 5627\n4bae 2 822 5627\n4bb0 3 826 5627\n4bb3 3 828 5627\nFUNC 4bb6 73 14 _GetRangeOfTrysToCheck(_s_FuncInfo const *,int,int,unsigned int *,unsigned int *)\n4bb6 7 848 5627\n4bbd 6 849 5627\n4bc3 6 850 5627\n4bc9 2 851 5627\n4bcb 2 852 5627\n4bcd a 855 5627\n4bd7 1d 859 5627\n4bf4 3 860 5627\n4bf7 3 861 5627\n4bfa 3 862 5627\n4bfd 6 854 5627\n4c03 6 866 5627\n4c09 5 867 5627\n4c0e e 869 5627\n4c1c b 871 5627\n4c27 2 872 5627\nFUNC 4c29 28 8 _CreateFrameInfo\n4c29 0 889 5627\n4c29 b 890 5627\n4c34 e 891 5627\n4c42 b 892 5627\n4c4d 3 893 5627\n4c50 1 894 5627\nFUNC 4c51 21 4 _IsExceptionObjectToBeDestroyed\n4c51 0 907 5627\n4c51 d 910 5627\n4c5e 8 911 5627\n4c66 7 910 5627\n4c6d 1 915 5627\n4c6e 1 916 5627\n4c6f 2 912 5627\n4c71 1 916 5627\nFUNC 4c72 4c 4 _FindAndUnlinkFrame\n4c72 1 926 5627\n4c73 11 927 5627\n4c84 f 928 5627\n4c93 1 944 5627\n4c94 d 931 5627\n4ca1 7 935 5627\n4ca8 9 933 5627\n4cb1 5 943 5627\n4cb6 7 936 5627\n4cbd 1 944 5627\nFUNC 4cbe 5e 14 _CallCatchBlock2(EHRegistrationNode *,_s_FuncInfo const *,void *,int,unsigned long)\n4cbe 6 485 5627\n4cc4 e 493 5627\n4cd2 c 495 5627\n4cde 11 500 5627\n4cef 6 503 5627\n4cf5 3 504 5627\n4cf8 3 505 5627\n4cfb 6 506 5627\n4d01 e 512 5627\n4d0f 3 518 5627\n4d12 6 519 5627\n4d18 2 524 5627\n4d1a 2 525 5627\nFUNC 4d1c 4a 8 _CxxThrowException\n4d1c 6 95 5939\n4d22 15 117 5939\n4d37 3 118 5939\n4d3a 9 134 5939\n4d43 5 136 5939\n4d48 7 138 5939\n4d4f 13 159 5939\n4d62 4 161 5939\nFUNC 4d66 19 0 std::bad_alloc::bad_alloc()\n4d66 15 382 5121\n4d7b 4 383 5121\nFUNC 4d7f 6a 4 operator new(unsigned int)\n4d7f 6 57 5123\n4d85 2 59 5123\n4d87 d 60 5123\n4d94 d 59 5123\n4da1 2 67 5123\n4da3 27 62 5123\n4dca 1f 63 5123\nFUNC 4de9 f 4 type_info::name(__type_info_node *)\n4de9 0 44 5873\n4de9 c 45 5873\n4df5 3 46 5873\nFUNC 4df8 e 0 type_info::~type_info()\n4df8 0 49 5873\n4df8 d 50 5873\n4e05 1 51 5873\nFUNC 4e06 1c 0 type_info::`scalar deleting destructor'(unsigned int)\nFUNC 4e22 f 4 type_info::_name_internal_method(__type_info_node *)\n4e22 0 54 5873\n4e22 c 55 5873\n4e2e 3 56 5873\nFUNC 4e31 8 0 type_info::_type_info_dtor_internal_method()\n4e31 0 59 5873\n4e31 7 60 5873\n4e38 1 61 5873\nFUNC 4e39 1b 4 type_info::operator==(type_info const &)\n4e39 0 89 5873\n4e39 18 90 5873\n4e51 3 91 5873\nFUNC 4e54 1c 4 type_info::operator!=(type_info const &)\n4e54 0 98 5873\n4e54 19 99 5873\n4e6d 3 100 5873\nFUNC 4e70 1f 4 type_info::before(type_info const &)\n4e70 0 103 5873\n4e70 1c 104 5873\n4e8c 3 105 5873\nFUNC 4e8f 4 0 type_info::raw_name()\n4e8f 0 108 5873\n4e8f 3 109 5873\n4e92 1 110 5873\nFUNC 4e93 b 4 type_info::type_info(type_info const &)\n4e93 8 113 5873\n4e9b 3 123 5873\nFUNC 4e9e 5 4 type_info::operator=(type_info const &)\n4e9e 2 127 5873\n4ea0 3 135 5873\nFUNC 4ea3 11 0 std::exception::exception()\n4ea3 2 68 5916\n4ea5 4 69 5916\n4ea9 a 70 5916\n4eb3 1 71 5916\nFUNC 4eb4 4e 4 std::exception::exception(char const * const &)\n4eb4 1 77 5916\n4eb5 14 78 5916\n4ec9 9 80 5916\n4ed2 6 81 5916\n4ed8 9 82 5916\n4ee1 c 84 5916\n4eed 2 87 5916\n4eef 4 89 5916\n4ef3 7 91 5916\n4efa 8 92 5916\nFUNC 4f02 18 8 std::exception::exception(char const * const &,int)\n4f02 2 98 5916\n4f04 c 99 5916\n4f10 7 100 5916\n4f17 3 101 5916\nFUNC 4f1a 58 4 std::exception::exception(std::exception const &)\n4f1a 1 107 5916\n4f1b 13 108 5916\n4f2e 2 109 5916\n4f30 a 111 5916\n4f3a 9 113 5916\n4f43 6 114 5916\n4f49 9 115 5916\n4f52 d 117 5916\n4f5f 2 120 5916\n4f61 4 122 5916\n4f65 2 125 5916\n4f67 4 126 5916\n4f6b 7 127 5916\nFUNC 4f72 56 4 std::exception::operator=(std::exception const &)\n4f72 1 133 5916\n4f73 c 134 5916\n4f7f 6 136 5916\n4f85 2 137 5916\n4f87 9 139 5916\n4f90 9 141 5916\n4f99 6 144 5916\n4f9f 9 146 5916\n4fa8 d 148 5916\n4fb5 2 151 5916\n4fb7 4 153 5916\n4fbb 2 156 5916\n4fbd 3 157 5916\n4fc0 5 159 5916\n4fc5 3 160 5916\nFUNC 4fc8 16 0 std::exception::~exception()\n4fc8 0 167 5916\n4fc8 c 168 5916\n4fd4 9 169 5916\n4fdd 1 170 5916\nFUNC 4fde d 0 std::exception::what()\n4fde 0 180 5916\n4fde 5 181 5916\n4fe3 2 182 5916\n4fe5 5 184 5916\n4fea 1 185 5916\nFUNC 4feb 19 4 std::bad_cast::bad_cast(char const *)\n4feb 13 194 5916\n4ffe 6 195 5916\nFUNC 5004 18 4 std::bad_cast::bad_cast(std::bad_cast const &)\n5004 12 199 5916\n5016 6 200 5916\nFUNC 501c b 0 std::bad_cast::~bad_cast()\n501c 6 203 5916\n5022 5 204 5916\nFUNC 5027 19 4 std::bad_typeid::bad_typeid(char const *)\n5027 13 229 5916\n503a 6 230 5916\nFUNC 5040 18 4 std::bad_typeid::bad_typeid(std::bad_typeid const &)\n5040 12 234 5916\n5052 6 235 5916\nFUNC 5058 b 0 std::bad_typeid::~bad_typeid()\n5058 6 238 5916\n505e 5 239 5916\nFUNC 5063 18 4 std::__non_rtti_object::__non_rtti_object(char const *)\n5063 12 248 5916\n5075 6 249 5916\nFUNC 507b 18 4 std::__non_rtti_object::__non_rtti_object(std::__non_rtti_object const &)\n507b 12 253 5916\n508d 6 254 5916\nFUNC 5093 b 0 std::__non_rtti_object::~__non_rtti_object()\n5093 0 257 5916\n5093 b 258 5916\nFUNC 509e 1c 0 std::exception::`vector deleting destructor'(unsigned int)\nFUNC 50ba 22 0 std::bad_cast::`vector deleting destructor'(unsigned int)\nFUNC 50dc 22 0 std::bad_typeid::`scalar deleting destructor'(unsigned int)\nFUNC 50fe 22 0 std::__non_rtti_object::`scalar deleting destructor'(unsigned int)\nFUNC 5120 7b 10 memcpy_s\n5120 4 47 1002\n5124 a 48 1002\n512e 4 51 1002\n5132 20 55 1002\n5152 a 56 1002\n515c f 67 1002\n516b 2 68 1002\n516d f 59 1002\n517c 5 61 1002\n5181 13 62 1002\n5194 5 64 1002\n5199 2 69 1002\nFUNC 519b 5b 10 memmove_s\n519b 3 46 955\n519e 9 47 955\n51a7 2 50 955\n51a9 20 54 955\n51c9 5 55 955\n51ce 13 56 955\n51e1 f 58 955\n51f0 4 59 955\n51f4 2 60 955\nFUNC 51f6 a 4 _set_osplatform\n51f6 a 385 2595\nFUNC 5200 a 4 _set_osver\n5200 a 386 2595\nFUNC 520a a 4 _set_winver\n520a a 387 2595\nFUNC 5214 a 4 _set_winmajor\n5214 a 388 2595\nFUNC 521e a 4 _set_winminor\n521e a 389 2595\nFUNC 5228 24 4 fast_error_exit\n5228 0 375 2608\n5228 9 384 2608\n5231 5 386 2608\n5236 9 388 2608\n523f c 389 2608\n524b 1 390 2608\nFUNC 524c 41 0 check_managed_app\n524c 0 413 2608\n524c b 418 2608\n5257 5 422 2608\n525c a 424 2608\n5266 2 425 2608\n5268 9 427 2608\n5271 2 428 2608\n5273 7 433 2608\n527a 2 434 2608\n527c d 437 2608\n5289 1 438 2608\n528a 2 419 2608\n528c 1 438 2608\nFUNC 528d 1b6 0 __tmainCRTStartup\n528d c 203 2608\n5299 19 233 2608\n52b2 4 234 2608\n52b6 8 235 2608\n52be a 236 2608\n52c8 2 242 2608\n52ca 7 243 2608\n52d1 3 244 2608\n52d4 4 243 2608\n52d8 9 244 2608\n52e1 2 245 2608\n52e3 6 248 2608\n52e9 6 249 2608\n52ef 6 250 2608\n52f5 9 256 2608\n52fe 9 257 2608\n5307 8 258 2608\n530f 6 259 2608\n5315 d 260 2608\n5322 6 262 2608\n5328 5 263 2608\n532d 6 264 2608\n5333 6 265 2608\n5339 6 266 2608\n533f 8 271 2608\n5347 c 273 2608\n5353 8 274 2608\n535b 9 276 2608\n5364 8 277 2608\n536c 5 286 2608\n5371 4 294 2608\n5375 9 296 2608\n537e 8 297 2608\n5386 b 300 2608\n5391 a 303 2608\n539b 9 305 2608\n53a4 8 306 2608\n53ac 9 307 2608\n53b5 8 308 2608\n53bd 8 310 2608\n53c5 4 311 2608\n53c9 7 312 2608\n53d0 a 326 2608\n53da 18 327 2608\n53f2 6 330 2608\n53f8 6 331 2608\n53fe 5 333 2608\n5403 2 335 2608\n5405 17 336 2608\n541c 6 342 2608\n5422 6 344 2608\n5428 6 345 2608\n542e 5 347 2608\n5433 7 349 2608\n543a 3 351 2608\n543d 6 352 2608\nFUNC 5443 a 0 mainCRTStartup\n5443 0 186 2608\n5443 5 193 2608\n5448 5 195 2608\nFUNC 544d a 4 _initp_misc_invarg\n544d 0 38 3328\n544d 9 39 3328\n5456 1 40 3328\nFUNC 5457 fc 14 _invoke_watson\n5457 1c 111 3328\n5473 6 128 3328\n5479 6 129 3328\n547f 6 130 3328\n5485 3 131 3328\n5488 3 132 3328\n548b 3 133 3328\n548e 7 134 3328\n5495 7 135 3328\n549c 4 136 3328\n54a0 4 137 3328\n54a4 4 138 3328\n54a8 4 139 3328\n54ac 1 140 3328\n54ad 6 141 3328\n54b3 6 147 3328\n54b9 19 148 3328\n54d2 3 150 3328\n54d5 13 163 3328\n54e8 6 168 3328\n54ee 13 169 3328\n5501 6 171 3328\n5507 a 174 3328\n5511 a 176 3328\n551b 8 180 3328\n5523 8 181 3328\n552b 12 184 3328\n553d 16 185 3328\nFUNC 5553 22 4 _set_invalid_parameter_handler\n5553 1 207 3328\n5554 b 211 3328\n555f d 212 3328\n556c 5 214 3328\n5571 3 216 3328\n5574 1 217 3328\nFUNC 5575 d 0 _get_invalid_parameter_handler\n5575 0 221 3328\n5575 c 225 3328\n5581 1 228 3328\nFUNC 5582 9 14 _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)\n5582 3 266 3328\n5585 1 274 3328\n5586 5 273 3328\nFUNC 558b 24 14 _invalid_parameter\n558b 3 70 3328\n558e b 77 3328\n5599 5 78 3328\n559e 1 89 3328\n559f 2 80 3328\n55a1 8 86 3328\n55a9 1 89 3328\n55aa 5 88 3328\nFUNC 55af 10 0 _invalid_parameter_noinfo\n55af 0 98 3328\n55af f 99 3328\n55be 1 100 3328\nFUNC 55bf 9 14 _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)\n55bf 3 249 3328\n55c2 1 257 3328\n55c3 5 256 3328\nFUNC 55c8 96 8 _swprintf\n55c8 7 122 1564\n55cf 24 128 1564\n55f3 8 133 1564\n55fb 6 138 1564\n5601 22 153 1564\n5623 1d 160 1564\n5640 18 161 1564\n5658 4 163 1564\n565c 2 171 1564\nFUNC 565e 1a c __swprintf_l\n565e 0 181 1564\n565e 19 186 1564\n5677 1 188 1564\nFUNC 5678 1c c swprintf_s\n5678 0 238 1564\n5678 1b 243 1564\n5693 1 244 1564\nFUNC 5694 1f 10 _snwprintf_s\n5694 3 253 1564\n5697 1a 258 1564\n56b1 2 259 1564\nFUNC 56b3 1c c _swprintf_p\n56b3 0 267 1564\n56b3 1b 272 1564\n56ce 1 273 1564\nFUNC 56cf 1d 10 _swprintf_s_l\n56cf 3 282 1564\n56d2 18 287 1564\n56ea 2 288 1564\nFUNC 56ec 20 14 _snwprintf_s_l\n56ec 3 298 1564\n56ef 1b 303 1564\n570a 2 304 1564\nFUNC 570c 1d 10 _swprintf_p_l\n570c 3 313 1564\n570f 18 318 1564\n5727 2 319 1564\nFUNC 5729 11 4 _scwprintf\n5729 0 347 1564\n5729 10 352 1564\n5739 1 353 1564\nFUNC 573a 11 4 _scwprintf_p\n573a 0 359 1564\n573a 10 364 1564\n574a 1 365 1564\nFUNC 574b 16 8 _scwprintf_l\n574b 0 372 1564\n574b 15 376 1564\n5760 1 377 1564\nFUNC 5761 16 8 _scwprintf_p_l\n5761 0 384 1564\n5761 15 389 1564\n5776 1 390 1564\nFUNC 5777 14f 8 fprintf\n5777 c 49 1648\n5783 5 53 1648\n5788 2e 55 1648\n57b6 c 56 1648\n57c2 3 61 1648\n57c5 7 63 1648\n57cc 3 64 1648\n57cf b0 66 1648\n587f 5 67 1648\n5884 8 69 1648\n588c 11 70 1648\n589d a 71 1648\n58a7 c 75 1648\n58b3 3 79 1648\n58b6 6 80 1648\n58bc a 76 1648\nFUNC 58c6 1a c _fprintf_l\n58c6 0 88 1648\n58c6 19 93 1648\n58df 1 94 1648\nFUNC 58e0 1a c _fprintf_s_l\n58e0 0 102 1648\n58e0 19 107 1648\n58f9 1 108 1648\nFUNC 58fa 18 8 fprintf_s\n58fa 0 115 1648\n58fa 17 120 1648\n5911 1 121 1648\nFUNC 5912 1a c _fprintf_p_l\n5912 0 129 1648\n5912 19 134 1648\n592b 1 135 1648\nFUNC 592c 18 8 _fprintf_p\n592c 0 142 1648\n592c 17 147 1648\n5943 1 148 1648\nFUNC 5944 f6 18 _vswprintf_helper\n5944 7 125 1380\n594b 28 130 1380\n5973 2f 133 1380\n59a2 15 143 1380\n59b7 7 146 1380\n59be 2 148 1380\n59c0 6 150 1380\n59c6 13 157 1380\n59d9 5 160 1380\n59de 2 162 1380\n59e0 41 171 1380\n5a21 5 172 1380\n5a26 12 175 1380\n5a38 2 183 1380\nFUNC 5a3a 27 10 _vswprintf_c\n5a3a 0 241 1380\n5a3a 1f 242 1380\n5a59 7 243 1380\n5a60 1 244 1380\nFUNC 5a61 28 14 _vswprintf_c_l\n5a61 3 253 1380\n5a64 1c 254 1380\n5a80 7 255 1380\n5a87 2 256 1380\nFUNC 5a89 87 14 _vswprintf_s_l\n5a89 4 265 1380\n5a8d 25 269 1380\n5ab2 19 270 1380\n5acb 1a 272 1380\n5ae5 4 273 1380\n5ae9 3 275 1380\n5aec 5 278 1380\n5af1 1d 280 1380\n5b0e 2 288 1380\nFUNC 5b10 1b 10 vswprintf_s\n5b10 0 296 1380\n5b10 1a 297 1380\n5b2a 1 298 1380\nFUNC 5b2b 107 18 _vsnwprintf_s_l\n5b2b 5 308 1380\n5b30 27 313 1380\n5b57 13 314 1380\n5b6a 7 317 1380\n5b71 1b 319 1380\n5b8c 8 323 1380\n5b94 20 324 1380\n5bb4 5 325 1380\n5bb9 a 329 1380\n5bc3 7 331 1380\n5bca 2 333 1380\n5bcc 2 338 1380\n5bce 12 339 1380\n5be0 10 342 1380\n5bf0 a 344 1380\n5bfa a 346 1380\n5c04 2 348 1380\n5c06 4 352 1380\n5c0a 8 356 1380\n5c12 18 358 1380\n5c2a 6 360 1380\n5c30 2 366 1380\nFUNC 5c32 1e 14 _vsnwprintf_s\n5c32 3 375 1380\n5c35 19 376 1380\n5c4e 2 377 1380\nFUNC 5c50 27 10 _vswprintf_p\n5c50 0 385 1380\n5c50 1f 386 1380\n5c6f 7 387 1380\n5c76 1 388 1380\nFUNC 5c77 28 14 _vswprintf_p_l\n5c77 3 397 1380\n5c7a 1c 398 1380\n5c96 7 399 1380\n5c9d 2 400 1380\nFUNC 5c9f 24 4 _amsg_exit\n5c9f 0 446 2560\n5c9f 5 449 2560\n5ca4 9 450 2560\n5cad b 451 2560\n5cb8 a 452 2560\n5cc2 1 453 2560\nFUNC 5cc3 26 4 __crtCorExitProcess\n5cc3 0 650 2560\n5cc3 b 654 2560\n5cce 4 655 2560\n5cd2 c 656 2560\n5cde 4 657 2560\n5ce2 6 658 2560\n5ce8 1 668 2560\nFUNC 5ce9 15 4 __crtExitProcess\n5ce9 0 673 2560\n5ce9 a 674 2560\n5cf3 b 683 2560\nFUNC 5cfe 9 0 _lockexit\n5cfe 0 733 2560\n5cfe 8 734 2560\n5d06 1 735 2560\nFUNC 5d07 9 0 _unlockexit\n5d07 0 759 2560\n5d07 8 760 2560\n5d0f 1 761 2560\nFUNC 5d10 18 4 _initterm\n5d10 3 841 2560\n5d13 2 855 2560\n5d15 6 853 2560\n5d1b 2 854 2560\n5d1d 3 855 2560\n5d20 7 848 2560\n5d27 1 857 2560\nFUNC 5d28 20 8 _initterm_e\n5d28 1 890 2560\n5d29 c 899 2560\n5d35 6 904 2560\n5d3b 2 905 2560\n5d3d 3 906 2560\n5d40 7 899 2560\n5d47 1 910 2560\nFUNC 5d48 37 4 _get_osplatform\n5d48 0 929 2560\n5d48 27 931 2560\n5d6f 1 939 2560\n5d70 9 934 2560\n5d79 2 936 2560\n5d7b 3 938 2560\n5d7e 1 939 2560\nFUNC 5d7f 3c 4 _get_osver\n5d7f 0 958 2560\n5d7f 27 960 2560\n5da6 1 968 2560\n5da7 8 963 2560\n5daf 8 965 2560\n5db7 3 967 2560\n5dba 1 968 2560\nFUNC 5dbb 3c 4 _get_winver\n5dbb 0 987 2560\n5dbb 27 989 2560\n5de2 1 997 2560\n5de3 8 992 2560\n5deb 8 994 2560\n5df3 3 996 2560\n5df6 1 997 2560\nFUNC 5df7 3c 4 _get_winmajor\n5df7 0 1016 2560\n5df7 27 1018 2560\n5e1e 1 1026 2560\n5e1f 8 1021 2560\n5e27 8 1023 2560\n5e2f 3 1025 2560\n5e32 1 1026 2560\nFUNC 5e33 3c 4 _get_winminor\n5e33 0 1045 2560\n5e33 27 1047 2560\n5e5a 1 1055 2560\n5e5b 8 1050 2560\n5e63 8 1052 2560\n5e6b 3 1054 2560\n5e6e 1 1055 2560\nFUNC 5e6f 37 4 _get_wpgmptr\n5e6f 0 1074 2560\n5e6f 27 1076 2560\n5e96 1 1085 2560\n5e97 9 1080 2560\n5ea0 2 1082 2560\n5ea2 3 1084 2560\n5ea5 1 1085 2560\nFUNC 5ea6 37 4 _get_pgmptr\n5ea6 0 1104 2560\n5ea6 27 1106 2560\n5ecd 1 1115 2560\n5ece 9 1110 2560\n5ed7 2 1112 2560\n5ed9 3 1114 2560\n5edc 1 1115 2560\nFUNC 5edd 92 4 _cinit\n5edd 0 263 2560\n5edd 18 273 2560\n5ef5 b 275 2560\n5f00 5 277 2560\n5f05 f 283 2560\n5f14 4 284 2560\n5f18 4 285 2560\n5f1c a 288 2560\n5f26 20 293 2560\n5f46 1a 306 2560\n5f60 c 308 2560\n5f6c 2 312 2560\n5f6e 1 313 2560\nFUNC 5f6f e2 c doexit\n5f6f c 499 2560\n5f7b 8 517 2560\n5f83 5 518 2560\n5f88 b 520 2560\n5f93 6 521 2560\n5f99 8 524 2560\n5fa1 5 526 2560\n5fa6 e 542 2560\n5fb4 12 543 2560\n5fc6 5 545 2560\n5fcb b 546 2560\n5fd6 10 551 2560\n5fe6 9 552 2560\n5fef 2 553 2560\n5ff1 10 558 2560\n6001 10 566 2560\n6011 c 584 2560\n601d 6 588 2560\n6023 6 592 2560\n6029 8 594 2560\n6031 8 596 2560\n6039 3 584 2560\n603c 6 585 2560\n6042 9 586 2560\n604b 6 597 2560\nFUNC 6051 11 4 exit\n6051 0 397 2560\n6051 10 398 2560\n6061 1 399 2560\nFUNC 6062 11 4 _exit\n6062 0 405 2560\n6062 10 406 2560\n6072 1 407 2560\nFUNC 6073 f 0 _cexit\n6073 0 412 2560\n6073 e 413 2560\n6081 1 414 2560\nFUNC 6082 f 0 _c_exit\n6082 0 419 2560\n6082 e 420 2560\n6090 1 421 2560\nFUNC 6091 4c 0 _init_pointers\n6091 1 786 2560\n6092 7 787 2560\n6099 6 789 2560\n609f 6 790 2560\n60a5 6 791 2560\n60ab 6 792 2560\n60b1 6 793 2560\n60b7 6 794 2560\n60bd 6 795 2560\n60c3 6 796 2560\n60c9 13 799 2560\n60dc 1 800 2560\nFUNC 60e0 8b 4 strlen\n60e0 0 54 880\n60e0 4 63 880\n60e4 6 64 880\n60ea 2 65 880\n60ec 2 69 880\n60ee 3 70 880\n60f1 2 71 880\n60f3 2 72 880\n60f5 6 73 880\n60fb 2 74 880\n60fd 13 76 880\n6110 2 81 880\n6112 5 82 880\n6117 2 83 880\n6119 3 84 880\n611c 2 85 880\n611e 3 86 880\n6121 5 87 880\n6126 2 88 880\n6128 3 90 880\n612b 2 91 880\n612d 2 92 880\n612f 2 93 880\n6131 2 94 880\n6133 5 95 880\n6138 2 96 880\n613a 5 97 880\n613f 2 98 880\n6141 2 99 880\n6143 3 103 880\n6146 4 104 880\n614a 2 105 880\n614c 1 106 880\n614d 3 108 880\n6150 4 109 880\n6154 2 110 880\n6156 1 111 880\n6157 3 113 880\n615a 4 114 880\n615e 2 115 880\n6160 1 116 880\n6161 3 118 880\n6164 4 119 880\n6168 2 120 880\n616a 1 121 880\nFUNC 616b 33 4 _EH_prolog3\n616b 0 93 5671\n616b 1 101 5671\n616c 7 103 5671\n6173 4 112 5671\n6177 4 113 5671\n617b 1 114 5671\n617c 1 115 5671\n617d 1 116 5671\n617e 2 117 5671\n6180 2 118 5671\n6182 5 131 5671\n6187 2 132 5671\n6189 1 133 5671\n618a 3 134 5671\n618d 7 135 5671\n6194 3 150 5671\n6197 6 151 5671\n619d 1 153 5671\nFUNC 619e 36 4 _EH_prolog3_catch\n619e 0 206 5671\n619e 1 214 5671\n619f 7 216 5671\n61a6 4 225 5671\n61aa 4 226 5671\n61ae 1 228 5671\n61af 1 229 5671\n61b0 1 230 5671\n61b1 2 231 5671\n61b3 2 232 5671\n61b5 5 246 5671\n61ba 2 247 5671\n61bc 1 248 5671\n61bd 3 249 5671\n61c0 3 250 5671\n61c3 7 251 5671\n61ca 3 267 5671\n61cd 6 268 5671\n61d3 1 270 5671\nFUNC 61d4 36 4 _EH_prolog3_GS\n61d4 0 322 5671\n61d4 1 330 5671\n61d5 7 332 5671\n61dc 4 341 5671\n61e0 4 342 5671\n61e4 1 344 5671\n61e5 1 345 5671\n61e6 1 346 5671\n61e7 2 347 5671\n61e9 2 348 5671\n61eb 5 362 5671\n61f0 2 363 5671\n61f2 1 364 5671\n61f3 3 365 5671\n61f6 3 366 5671\n61f9 7 367 5671\n6200 3 384 5671\n6203 6 385 5671\n6209 1 387 5671\nFUNC 620a 39 4 _EH_prolog3_catch_GS\n620a 0 441 5671\n620a 1 449 5671\n620b 7 451 5671\n6212 4 460 5671\n6216 4 461 5671\n621a 1 463 5671\n621b 1 464 5671\n621c 1 465 5671\n621d 2 466 5671\n621f 2 467 5671\n6221 5 482 5671\n6226 2 483 5671\n6228 1 484 5671\n6229 3 485 5671\n622c 3 486 5671\n622f 3 487 5671\n6232 7 488 5671\n6239 3 505 5671\n623c 6 506 5671\n6242 1 508 5671\nFUNC 6243 14 0 _EH_epilog3\n6243 0 534 5671\n6243 3 537 5671\n6246 7 538 5671\n624d 1 539 5671\n624e 1 540 5671\n624f 1 541 5671\n6250 1 542 5671\n6251 1 543 5671\n6252 2 544 5671\n6254 1 545 5671\n6255 1 546 5671\n6256 1 547 5671\nFUNC 6257 f 0 _EH_epilog3_GS\n6257 0 575 5671\n6257 3 578 5671\n625a 2 579 5671\n625c 5 580 5671\n6261 5 581 5671\nFUNC 6266 f 0 _EH_epilog3_catch_GS\n6266 0 609 5671\n6266 3 612 5671\n6269 2 613 5671\n626b 5 614 5671\n6270 5 615 5671\nFUNC 6275 96 4 _stbuf\n6275 1 59 1850\n6276 14 69 1850\n628a 2 70 1850\n628c c 73 1850\n6298 4 74 1850\n629c c 75 1850\n62a8 3 76 1850\n62ab 6 82 1850\n62b1 6 86 1850\n62b7 4 87 1850\n62bb 1e 91 1850\n62d9 3 93 1850\n62dc e 94 1850\n62ea 2 96 1850\n62ec 7 98 1850\n62f3 6 99 1850\n62f9 8 102 1850\n6301 5 104 1850\n6306 1 105 1850\n6307 3 78 1850\n630a 1 105 1850\nFUNC 630b 2f 8 _ftbuf\n630b 0 138 1850\n630b 8 146 1850\n6313 c 148 1850\n631f 6 151 1850\n6325 7 152 1850\n632c 4 153 1850\n6330 9 154 1850\n6339 1 166 1850\nFUNC 633a 82 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)\n633a 0 261 1343\n633a f 262 1343\n6349 8 264 1343\n6351 5 265 1343\n6356 6 266 1343\n635c 1c 268 1343\n6378 21 269 1343\n6399 9 270 1343\n63a2 4 272 1343\n63a6 4 273 1343\n63aa 2 276 1343\n63ac a 278 1343\n63b6 6 280 1343\nFUNC 63bc e 0 _LocaleUpdate::~_LocaleUpdate()\n63bc 0 282 1343\n63bc 6 283 1343\n63c2 7 284 1343\n63c9 1 285 1343\nFUNC 63ca 3 0 _LocaleUpdate::GetLocaleT()\n63ca 2 287 1343\n63cc 1 289 1343\nFUNC 63cd 33 0 write_char\n63cd 0 2433 1312\n63cd a 2434 1312\n63d7 2 2437 1312\n63d9 21 2442 1312\n63fa 2 2444 1312\n63fc 1 2447 1312\n63fd 2 2446 1312\n63ff 1 2447 1312\nFUNC 6400 24 c write_multi_char\n6400 6 2498 1312\n6406 2 2501 1312\n6408 e 2500 1312\n6416 5 2501 1312\n641b 7 2499 1312\n6422 2 2504 1312\nFUNC 6424 4a 4 write_string\n6424 0 2563 1312\n6424 12 2564 1312\n6436 6 2566 1312\n643c 2 2567 1312\n643e e 2570 1312\n644c 5 2571 1312\n6451 a 2573 1312\n645b 9 2574 1312\n6464 9 2569 1312\n646d 1 2579 1312\nFUNC 646e d 4 get_int_arg\n646e 0 2602 1312\n646e c 2603 1312\n647a 1 2604 1312\nFUNC 647b 10 4 get_int64_arg\n647b 0 2644 1312\n647b f 2645 1312\n648a 1 2646 1312\nFUNC 648b e 4 get_short_arg\n648b 0 2671 1312\n648b d 2672 1312\n6498 1 2673 1312\nFUNC 6499 994 10 _output_l\n6499 1b 975 1312\n64b4 45 1036 1312\n64f9 2d 1031 1312\n6526 b1 1033 1312\n65d7 8 1036 1312\n65df 26 1073 1312\n6605 1d 1075 1312\n6622 8 1076 1312\n662a 18 1131 1312\n6642 13 1173 1312\n6655 3 1174 1312\n6658 5 1175 1312\n665d 1f 1179 1312\n667c 4 1193 1312\n6680 5 1194 1312\n6685 4 1181 1312\n6689 5 1182 1312\n668e 4 1184 1312\n6692 5 1185 1312\n6697 7 1190 1312\n669e 5 1191 1312\n66a3 4 1187 1312\n66a7 5 1196 1312\n66ac 5 1200 1312\n66b1 9 1206 1312\n66ba b 1233 1312\n66c5 4 1235 1312\n66c9 3 1236 1312\n66cc 5 1239 1312\n66d1 10 1241 1312\n66e1 5 1243 1312\n66e6 3 1248 1312\n66e9 5 1249 1312\n66ee 5 1253 1312\n66f3 9 1259 1312\n66fc b 1284 1312\n6707 4 1285 1312\n670b 5 1287 1312\n6710 10 1289 1312\n6720 5 1291 1312\n6725 18 1295 1312\n673d 7 1362 1312\n6744 5 1363 1312\n6749 5 1301 1312\n674e 1 1303 1312\n674f a 1304 1312\n6759 5 1306 1312\n675e 4 1308 1312\n6762 5 1310 1312\n6767 4 1358 1312\n676b 5 1359 1312\n6770 c 1322 1312\n677c 2 1324 1312\n677e f 1325 1312\n678d a 1327 1312\n6797 2 1329 1312\n6799 a 1330 1312\n67a3 5 1332 1312\n67a8 30 1337 1312\n67d8 3 1352 1312\n67db 13 1158 1312\n67ee 11 1160 1312\n67ff 3 1161 1312\n6802 b 1163 1312\n680d b 1166 1312\n6818 5 1167 1312\n681d 32 1378 1312\n684f d 1716 1312\n685c 4 1724 1312\n6860 17 1749 1312\n6877 c 1750 1312\n6883 8 1381 1312\n688b 9 1385 1312\n6894 8 1561 1312\n689c 7 1562 1312\n68a3 d 1584 1312\n68b0 3 1589 1312\n68b3 15 1635 1312\n68c8 4 1636 1312\n68cc 8 1637 1312\n68d4 f 1639 1312\n68e3 1d 1378 1312\n6900 12 1448 1312\n6912 16 1467 1312\n6928 4 1470 1312\n692c 7 1471 1312\n6933 2 1472 1312\n6935 6 1499 1312\n693b 7 1500 1312\n6942 6 1503 1312\n6948 5 1506 1312\n694d 5 1523 1312\n6952 e 1541 1312\n6960 6 1546 1312\n6966 d 1548 1312\n6973 7 1549 1312\n697a 5 1550 1312\n697f 3 1551 1312\n6982 5 1553 1312\n6987 8 1543 1312\n698f 7 1544 1312\n6996 5 1557 1312\n699b 34 1378 1312\n69cf d 1908 1312\n69dc 9 1910 1312\n69e5 8 1668 1312\n69ed d 1688 1312\n69fa 6 1702 1312\n6a00 7 1703 1312\n6a07 2 1704 1312\n6a09 5 1706 1312\n6a0e 7 1708 1312\n6a15 5 1710 1312\n6a1a 4 1864 1312\n6a1e 7 1869 1312\n6a25 c 1933 1312\n6a31 8 1939 1312\n6a39 5 1958 1312\n6a3e 7 1751 1312\n6a45 9 1752 1312\n6a4e 5 1753 1312\n6a53 3 1754 1312\n6a56 9 1756 1312\n6a5f f 1759 1312\n6a6e 2 1760 1312\n6a70 13 1765 1312\n6a83 9 1767 1312\n6a8c e 1809 1312\n6a9a 27 1828 1312\n6ac1 13 1838 1312\n6ad4 15 1840 1312\n6ae9 a 1844 1312\n6af3 15 1846 1312\n6b08 5 1852 1312\n6b0d 7 1853 1312\n6b14 4 1854 1312\n6b18 1 1857 1312\n6b19 5 1859 1312\n6b1e 7 1877 1312\n6b25 3 1887 1312\n6b28 2 1888 1312\n6b2a 1a 1378 1312\n6b44 7 1892 1312\n6b4b 11 1897 1312\n6b5c c 1900 1312\n6b68 7 1901 1312\n6b6f 5 1903 1312\n6b74 5 1961 1312\n6b79 6 1987 1312\n6b7f 14 2026 1312\n6b93 2 2045 1312\n6b95 5 2051 1312\n6b9a 2 2071 1312\n6b9c 3 2074 1312\n6b9f 6 2080 1312\n6ba5 2 2099 1312\n6ba7 5 2105 1312\n6bac f 2128 1312\n6bbb 7 2129 1312\n6bc2 7 2130 1312\n6bc9 c 2136 1312\n6bd5 2 2142 1312\n6bd7 6 2148 1312\n6bdd 7 2149 1312\n6be4 2 2150 1312\n6be6 4 2151 1312\n6bea a 2152 1312\n6bf4 3 2153 1312\n6bf7 6 2157 1312\n6bfd 3 2158 1312\n6c00 6 2163 1312\n6c06 10 2165 1312\n6c16 10 2166 1312\n6c26 c 2168 1312\n6c32 3 2170 1312\n6c35 3 2172 1312\n6c38 2 2173 1312\n6c3a 8 2175 1312\n6c42 1 2176 1312\n6c43 19 2180 1312\n6c5c 9 2181 1312\n6c65 1 2182 1312\n6c66 2 2185 1312\n6c68 6 1640 1312\n6c6e 2 1641 1312\n6c70 4 1640 1312\n6c74 5 1642 1312\n6c79 2 1644 1312\n6c7b 4 1645 1312\n6c7f 8 1646 1312\n6c87 5 1647 1312\n6c8c 6 1648 1312\n6c92 1 1649 1312\n6c93 4 1648 1312\n6c97 6 1650 1312\n6c9d a 2201 1312\n6ca7 7 2204 1312\n6cae 6 2205 1312\n6cb4 4 2207 1312\n6cb8 2 2208 1312\n6cba 4 2210 1312\n6cbe 4 2212 1312\n6cc2 2 2213 1312\n6cc4 4 2215 1312\n6cc8 4 2217 1312\n6ccc 7 2218 1312\n6cd3 9 2224 1312\n6cdc 6 2228 1312\n6ce2 11 2230 1312\n6cf3 11 2234 1312\n6d04 d 2236 1312\n6d11 f 2238 1312\n6d20 d 2243 1312\n6d2d 3 2249 1312\n6d30 3 2250 1312\n6d33 1e 2252 1312\n6d51 9 2253 1312\n6d5a 18 2257 1312\n6d72 2 1690 1312\n6d74 4 2254 1312\n6d78 2 2259 1312\n6d7a d 2260 1312\n6d87 c 2290 1312\n6d93 f 2292 1312\n6da2 6 2297 1312\n6da8 8 2298 1312\n6db0 1e 2299 1312\n6dce 17 1163 1312\n6de5 10 2376 1312\n6df5 38 2377 1312\nFUNC 6e2d 3b 4 _get_errno_from_oserr\n6e2d 0 119 6100\n6e2d 6 123 6100\n6e33 f 124 6100\n6e42 8 133 6100\n6e4a 3 134 6100\n6e4d 1 139 6100\n6e4e 7 125 6100\n6e55 1 139 6100\n6e56 11 135 6100\n6e67 1 139 6100\nFUNC 6e68 13 0 _errno\n6e68 0 280 6100\n6e68 5 281 6100\n6e6d 4 282 6100\n6e71 5 283 6100\n6e76 1 288 6100\n6e77 3 285 6100\n6e7a 1 288 6100\nFUNC 6e7b 13 0 __doserrno\n6e7b 0 293 6100\n6e7b 5 294 6100\n6e80 4 295 6100\n6e84 5 296 6100\n6e89 1 300 6100\n6e8a 3 298 6100\n6e8d 1 300 6100\nFUNC 6e8e 1e 4 _dosmaperr\n6e8e 1 110 6100\n6e8f 9 111 6100\n6e98 13 113 6100\n6eab 1 114 6100\nFUNC 6eac 1b 4 _set_errno\n6eac 0 157 6100\n6eac 5 158 6100\n6eb1 4 159 6100\n6eb5 3 161 6100\n6eb8 1 168 6100\n6eb9 b 165 6100\n6ec4 2 166 6100\n6ec6 1 168 6100\nFUNC 6ec7 2a 4 _get_errno\n6ec7 1 187 6100\n6ec8 1b 189 6100\n6ee3 1 195 6100\n6ee4 9 193 6100\n6eed 3 194 6100\n6ef0 1 195 6100\nFUNC 6ef1 1b 4 _set_doserrno\n6ef1 0 213 6100\n6ef1 5 214 6100\n6ef6 4 215 6100\n6efa 3 217 6100\n6efd 1 224 6100\n6efe b 221 6100\n6f09 2 222 6100\n6f0b 1 224 6100\nFUNC 6f0c 2a 4 _get_doserrno\n6f0c 1 243 6100\n6f0d 1b 245 6100\n6f28 1 251 6100\n6f29 9 249 6100\n6f32 3 250 6100\n6f35 1 251 6100\nFUNC 6f38 45 0 _SEH_prolog4\nFUNC 6f7d 14 0 _SEH_epilog4\nFUNC 6fa0 24 0 ValidateLocalCookies\nFUNC 6fd0 196 10 _except_handler4\nFUNC 7166 90 10 vprintf_helper\n7166 c 47 1507\n7172 d 48 1507\n717f 2b 52 1507\n71aa 7 55 1507\n71b1 3 56 1507\n71b4 8 58 1507\n71bc 10 59 1507\n71cc a 60 1507\n71d6 c 63 1507\n71e2 3 67 1507\n71e5 6 68 1507\n71eb 3 63 1507\n71ee 8 64 1507\nFUNC 71f6 1a c _vprintf_l\n71f6 0 75 1507\n71f6 19 76 1507\n720f 1 77 1507\nFUNC 7210 1a c _vprintf_s_l\n7210 0 84 1507\n7210 19 85 1507\n7229 1 86 1507\nFUNC 722a 1a c _vprintf_p_l\n722a 0 93 1507\n722a 19 94 1507\n7243 1 95 1507\nFUNC 7244 18 8 vprintf\n7244 0 101 1507\n7244 17 102 1507\n725b 1 103 1507\nFUNC 725c 18 8 vprintf_s\n725c 0 109 1507\n725c 17 110 1507\n7273 1 111 1507\nFUNC 7274 18 8 _vprintf_p\n7274 0 117 1507\n7274 17 118 1507\n728b 1 119 1507\nFUNC 728c 104 0 __report_gsfailure\n728c 9 140 3731\n7295 5 170 3731\n729a 6 171 3731\n72a0 6 172 3731\n72a6 6 173 3731\n72ac 6 174 3731\n72b2 6 175 3731\n72b8 7 176 3731\n72bf 7 177 3731\n72c6 7 178 3731\n72cd 7 179 3731\n72d4 7 180 3731\n72db 7 181 3731\n72e2 1 182 3731\n72e3 6 183 3731\n72e9 3 190 3731\n72ec 5 191 3731\n72f1 3 192 3731\n72f4 5 193 3731\n72f9 3 194 3731\n72fc 5 195 3731\n7301 6 201 3731\n7307 a 204 3731\n7311 a 206 3731\n731b a 285 3731\n7325 a 286 3731\n732f b 293 3731\n733a b 294 3731\n7345 b 297 3731\n7350 8 298 3731\n7358 8 302 3731\n7360 b 304 3731\n736b 9 313 3731\n7374 8 315 3731\n737c 12 319 3731\n738e 2 320 3731\nFUNC 7390 5c6 c _write_nolock\n7390 22 95 4777\n73b2 2 106 4777\n73b4 11 108 4777\n73c5 7 109 4777\n73cc 2b 111 4777\n73f7 27 113 4777\n741e 10 116 4777\n742e 33 119 4777\n7461 6 122 4777\n7467 f 126 4777\n7476 1c 143 4777\n7492 5 146 4777\n7497 8 147 4777\n749f 14 148 4777\n74b3 16 152 4777\n74c9 6 153 4777\n74cf 4 157 4777\n74d3 16 160 4777\n74e9 9 153 4777\n74f2 b 163 4777\n74fd 9 164 4777\n7506 11 170 4777\n7517 18 171 4777\n752f 2 173 4777\n7531 14 174 4777\n7545 18 175 4777\n755d 4 181 4777\n7561 2e 205 4777\n758f 21 212 4777\n75b0 6 213 4777\n75b6 8 214 4777\n75be a 222 4777\n75c8 29 229 4777\n75f1 a 230 4777\n75fb 3 232 4777\n75fe 3 233 4777\n7601 2 238 4777\n7603 8 186 4777\n760b 3 191 4777\n760e 9 192 4777\n7617 f 193 4777\n7626 8 240 4777\n762e 13 242 4777\n7641 3 244 4777\n7644 6 251 4777\n764a 3 254 4777\n764d 14 255 4777\n7661 3 257 4777\n7664 12 258 4777\n7676 5 236 4777\n767b e 268 4777\n7689 12 277 4777\n769b f 278 4777\n76aa d 279 4777\n76b7 8 283 4777\n76bf 9 284 4777\n76c8 5 285 4777\n76cd 3 286 4777\n76d0 7 287 4777\n76d7 f 289 4777\n76e6 25 297 4777\n770b 6 299 4777\n7711 16 300 4777\n7727 f 308 4777\n7736 f 314 4777\n7745 b 315 4777\n7750 8 319 4777\n7758 c 320 4777\n7764 6 321 4777\n776a 4 322 4777\n776e c 323 4777\n777a f 325 4777\n7789 25 333 4777\n77ae 6 335 4777\n77b4 1a 336 4777\n77ce 5 344 4777\n77d3 f 359 4777\n77e2 13 361 4777\n77f5 8 365 4777\n77fd b 366 4777\n7808 6 367 4777\n780e a 369 4777\n7818 11 371 4777\n7829 2f 382 4777\n7858 4 384 4777\n785c 25 406 4777\n7881 3 407 4777\n7884 6 412 4777\n788a 9 409 4777\n7893 4 419 4777\n7897 15 423 4777\n78ac 2 428 4777\n78ae 1b 434 4777\n78c9 a 437 4777\n78d3 2 439 4777\n78d5 9 440 4777\n78de a 443 4777\n78e8 7 447 4777\n78ef 8 449 4777\n78f7 b 452 4777\n7902 2 455 4777\n7904 9 456 4777\n790d 2 457 4777\n790f 11 459 4777\n7920 4 460 4777\n7924 b 462 4777\n792f 7 463 4777\n7936 5 464 4777\n793b 5 469 4777\n7940 16 470 4777\nFUNC 7956 dc c _write\n7956 c 61 4777\n7962 23 66 4777\n7985 2f 67 4777\n79b4 20 68 4777\n79d4 7 70 4777\n79db 3 72 4777\n79de 9 73 4777\n79e7 14 74 4777\n79fb 2 75 4777\n79fd b 76 4777\n7a08 7 77 4777\n7a0f 4 78 4777\n7a13 c 82 4777\n7a1f 3 86 4777\n7a22 6 87 4777\n7a28 a 83 4777\nFUNC 7a32 2d 4 _fileno\n7a32 0 40 2176\n7a32 27 41 2176\n7a59 1 43 2176\n7a5a 4 42 2176\n7a5e 1 43 2176\nFUNC 7a5f e1 4 _commit\n7a5f c 39 5043\n7a6b 1b 43 5043\n7a86 28 44 5043\n7aae 20 45 5043\n7ace 7 47 5043\n7ad5 3 48 5043\n7ad8 9 49 5043\n7ae1 14 51 5043\n7af5 9 52 5043\n7afe 2 54 5043\n7b00 3 55 5043\n7b03 5 59 5043\n7b08 a 62 5043\n7b12 b 66 5043\n7b1d 4 67 5043\n7b21 c 72 5043\n7b2d 3 75 5043\n7b30 6 76 5043\n7b36 a 73 5043\nFUNC 7b40 49 0 _mtinitlocks\n7b40 2 137 2371\n7b42 7 144 2371\n7b49 11 145 2371\n7b5a 2 146 2371\n7b5c 15 148 2371\n7b71 6 144 2371\n7b77 5 157 2371\n7b7c d 158 2371\nFUNC 7b89 55 0 _mtdeletelocks\n7b89 1 188 2371\n7b8a d 194 2371\n7b97 c 196 2371\n7ba3 3 200 2371\n7ba6 6 206 2371\n7bac f 207 2371\n7bbb 6 215 2371\n7bc1 c 217 2371\n7bcd 10 221 2371\n7bdd 1 224 2371\nFUNC 7bde 15 4 _unlock\n7bde 3 371 2371\n7be1 10 375 2371\n7bf1 2 376 2371\nFUNC 7bf3 18 4 _lockerr_exit\n7bf3 0 403 2371\n7bf3 c 404 2371\n7bff b 405 2371\n7c0a 1 406 2371\nFUNC 7c0b c3 4 _mtinitlocknum\n7c0b c 259 2371\n7c17 6 261 2371\n7c1d a 269 2371\n7c27 5 270 2371\n7c2c 7 271 2371\n7c33 c 272 2371\n7c3f e 276 2371\n7c4d 4 277 2371\n7c51 e 279 2371\n7c5f b 280 2371\n7c6a 4 281 2371\n7c6e 8 284 2371\n7c76 3 285 2371\n7c79 4 287 2371\n7c7d 11 288 2371\n7c8e 7 289 2371\n7c95 b 290 2371\n7ca0 3 291 2371\n7ca3 2 292 2371\n7ca5 2 293 2371\n7ca7 2 296 2371\n7ca9 7 297 2371\n7cb0 c 300 2371\n7cbc 3 304 2371\n7cbf 6 305 2371\n7cc5 9 301 2371\nFUNC 7cce 31 4 _lock\n7cce 3 333 2371\n7cd1 10 338 2371\n7ce1 b 340 2371\n7cec 8 341 2371\n7cf4 9 348 2371\n7cfd 2 349 2371\nFUNC 7cff 240 0 _ioinit\n7cff c 111 4958\n7d0b 5 122 4958\n7d10 a 127 4958\n7d1a 7 128 4958\n7d21 f 137 4958\n7d30 6 139 4958\n7d36 5 142 4958\n7d3b 6 143 4958\n7d41 8 145 4958\n7d49 4 146 4958\n7d4d 3 147 4958\n7d50 4 148 4958\n7d54 3 149 4958\n7d57 4 151 4958\n7d5b 4 152 4958\n7d5f 4 153 4958\n7d63 13 145 4958\n7d76 15 161 4958\n7d8b 2 166 4958\n7d8d 3 172 4958\n7d90 6 173 4958\n7d96 b 179 4958\n7da1 5 185 4958\n7da6 f 191 4958\n7db5 9 204 4958\n7dbe 7 205 4958\n7dc5 8 207 4958\n7dcd 4 208 4958\n7dd1 3 209 4958\n7dd4 4 210 4958\n7dd8 4 211 4958\n7ddc 4 212 4958\n7de0 4 213 4958\n7de4 4 214 4958\n7de8 f 207 4958\n7df7 9 185 4958\n7e00 2 284 4958\n7e02 6 197 4958\n7e08 8 221 4958\n7e10 24 234 4958\n7e34 15 236 4958\n7e49 7 237 4958\n7e50 5 238 4958\n7e55 18 241 4958\n7e6d 3 243 4958\n7e70 d 221 4958\n7e7d 2 253 4958\n7e7f b 255 4958\n7e8a c 258 4958\n7e96 6 306 4958\n7e9c 4 262 4958\n7ea0 30 266 4958\n7ed0 2 271 4958\n7ed2 a 277 4958\n7edc 6 278 4958\n7ee2 5 279 4958\n7ee7 4 280 4958\n7eeb 14 284 4958\n7eff 3 286 4958\n7f02 2 288 4958\n7f04 4 297 4958\n7f08 6 298 4958\n7f0e a 253 4958\n7f18 c 313 4958\n7f24 4 315 4958\n7f28 7 128 4958\n7f2f a 129 4958\n7f39 6 316 4958\nFUNC 7f3f 4c 0 _ioterm\n7f3f 2 341 4958\n7f41 5 345 4958\n7f46 6 347 4958\n7f4c 8 353 4958\n7f54 9 355 4958\n7f5d 11 356 4958\n7f6e 4 353 4958\n7f72 7 361 4958\n7f79 11 362 4958\n7f8a 1 365 4958\nFUNC 7f8b 21 4 wait_a_bit\n7f8b 1 18 5557\n7f8c b 19 5557\n7f97 6 20 5557\n7f9d 8 21 5557\n7fa5 3 22 5557\n7fa8 3 23 5557\n7fab 1 24 5557\nFUNC 7fac 10 4 _set_malloc_crt_max_wait\n7fac 0 32 5557\n7fac f 34 5557\n7fbb 1 36 5557\nFUNC 7fbc 40 4 _malloc_crt\n7fbc 2 39 5557\n7fbe 2 40 5557\n7fc0 b 44 5557\n7fcb d 45 5557\n7fd8 18 46 5557\n7ff0 7 47 5557\n7ff7 4 50 5557\n7ffb 1 51 5557\nFUNC 7ffc 48 8 _calloc_crt\n7ffc 2 54 5557\n7ffe 2 55 5557\n8000 14 61 5557\n8014 c 62 5557\n8020 18 63 5557\n8038 7 64 5557\n803f 4 67 5557\n8043 1 68 5557\nFUNC 8044 4b 8 _realloc_crt\n8044 2 71 5557\n8046 2 72 5557\n8048 f 76 5557\n8057 14 77 5557\n806b 18 78 5557\n8083 7 79 5557\n808a 4 82 5557\n808e 1 83 5557\nFUNC 808f 50 c _recalloc_crt\n808f 2 86 5557\n8091 2 87 5557\n8093 16 91 5557\n80a9 12 92 5557\n80bb 18 94 5557\n80d3 7 95 5557\n80da 4 100 5557\n80de 1 101 5557\nFUNC 80df 8 0 _malloc_crt_fastcall\n80df 0 105 5557\n80df 7 106 5557\n80e6 1 107 5557\nFUNC 80e7 a 0 _calloc_crt_fastcall\n80e7 0 110 5557\n80e7 9 111 5557\n80f0 1 112 5557\nFUNC 80f1 a 0 _realloc_crt_fastcall\n80f1 0 115 5557\n80f1 9 116 5557\n80fa 1 117 5557\nFUNC 80fb 8e 4 free\n80fb c 42 5515\n8107 7 47 5515\n810e 9 53 5515\n8117 8 57 5515\n811f 4 58 5515\n8123 e 60 5515\n8131 9 61 5515\n813a c 64 5515\n8146 6 68 5515\n814c 3 70 5515\n814f 2 106 5515\n8151 9 65 5515\n815a f 109 5515\n8169 4 110 5515\n816d 16 112 5515\n8183 6 115 5515\nFUNC 8189 9f 0 _fcloseall\n8189 c 43 1792\n8195 5 44 1792\n819a 8 47 1792\n81a2 3 48 1792\n81a5 e 50 1792\n81b3 10 52 1792\n81c3 14 57 1792\n81d7 3 58 1792\n81da 5 63 1792\n81df 12 65 1792\n81f1 e 66 1792\n81ff 8 67 1792\n8207 3 50 1792\n820a c 73 1792\n8216 3 77 1792\n8219 6 78 1792\n821f 9 74 1792\nFUNC 8228 19 4 std::bad_exception::bad_exception(char const *)\n8228 13 351 6035\n823b 6 352 6035\nFUNC 8241 b 0 std::bad_exception::~bad_exception()\n8241 6 355 6035\n8247 5 356 6035\nFUNC 824c 22 0 std::bad_exception::`vector deleting destructor'(unsigned int)\nFUNC 826e 5c c __TypeMatch\n826e 2 999 6034\n8270 13 1001 6034\n8283 1b 1008 6034\n829e 4 1009 6034\n82a2 22 1023 6034\n82c4 5 1002 6034\n82c9 1 1024 6034\nFUNC 82ca 44 4 __FrameUnwindFilter\n82ca 0 1035 6034\n82ca 6 1038 6034\n82d0 e 1040 6034\n82de 13 1076 6034\n82f1 e 1068 6034\n82ff c 1070 6034\n830b 2 1072 6034\n830d 1 1078 6034\nFUNC 830e e1 10 __FrameUnwindToState\n830e c 1105 6034\n831a 1b 1112 6034\n8335 c 1114 6034\n8341 4 1115 6034\n8345 5 1119 6034\n834a f 1123 6034\n8359 f 1126 6034\n8368 7 1128 6034\n836f 6 1131 6034\n8375 3 1138 6034\n8378 12 1145 6034\n838a 6 1149 6034\n8390 d 1151 6034\n839d d 1153 6034\n83aa 3 1155 6034\n83ad 2 1156 6034\n83af c 1157 6034\n83bb a 1169 6034\n83c5 3 1176 6034\n83c8 6 1180 6034\n83ce 6 1157 6034\n83d4 e 1158 6034\n83e2 d 1159 6034\nFUNC 83ef 45 0 ExFilterRethrow\n83ef 0 1533 6034\n83ef 2 1535 6034\n83f1 2f 1538 6034\n8420 e 1542 6034\n842e 2 1543 6034\n8430 1 1547 6034\n8431 2 1545 6034\n8433 1 1547 6034\nFUNC 8434 54 8 __DestructExceptionObject\n8434 c 1791 6034\n8440 f 1794 6034\n844f e 1801 6034\n845d 4 1803 6034\n8461 9 1810 6034\n846a 7 1814 6034\n8471 6 1824 6034\n8477 c 1815 6034\n8483 5 1819 6034\nFUNC 8488 25 8 __AdjustPointer\n8488 0 1842 6034\n8488 d 1843 6034\n8495 6 1845 6034\n849b 3 1850 6034\n849e e 1852 6034\n84ac 1 1856 6034\nFUNC 84ad 13 0 __uncaught_exception()\n84ad 0 1867 6034\n84ad 12 1868 6034\n84bf 1 1869 6034\nFUNC 84c0 b3 8 __CxxRegisterExceptionObject\n84c0 0 2077 6034\n84c0 14 2085 6034\n84d4 26 2087 6034\n84fa 6 2088 6034\n8500 b 2090 6034\n850b b 2093 6034\n8516 e 2094 6034\n8524 e 2095 6034\n8532 b 2096 6034\n853d 2 2097 6034\n853f 4 2098 6034\n8543 4 2099 6034\n8547 c 2101 6034\n8553 10 2102 6034\n8563 c 2103 6034\n856f 3 2104 6034\n8572 1 2105 6034\nFUNC 8573 4c 4 __CxxDetectRethrow\n8573 0 2117 6034\n8573 6 2119 6034\n8579 2 2120 6034\n857b 2 2121 6034\n857d 2f 2122 6034\n85ac c 2123 6034\n85b8 3 2124 6034\n85bb 1 2127 6034\n85bc 2 2126 6034\n85be 1 2127 6034\nFUNC 85bf 139 8 __CxxUnregisterExceptionObject\n85bf 1 2139 6034\n85c0 4 2143 6034\n85c4 d 2145 6034\n85d1 6 2146 6034\n85d7 85 2149 6034\n865c 14 2150 6034\n8670 5b 2152 6034\n86cb c 2153 6034\n86d7 e 2154 6034\n86e5 12 2155 6034\n86f7 1 2157 6034\nFUNC 86f8 4 0 __CxxQueryExceptionSize\n86f8 0 2167 6034\n86f8 3 2168 6034\n86fb 1 2169 6034\nFUNC 86fc 32 8 __CxxCallUnwindDtor\n86fc c 2189 6034\n8708 4 2190 6034\n870c 6 2192 6034\n8712 2 2193 6034\n8714 d 2194 6034\n8721 7 2197 6034\n8728 6 2198 6034\nFUNC 872e 33 8 __CxxCallUnwindDelDtor\n872e c 2218 6034\n873a 4 2219 6034\n873e 7 2221 6034\n8745 2 2222 6034\n8747 d 2223 6034\n8754 7 2226 6034\n875b 6 2227 6034\nFUNC 8761 32 8 __CxxCallUnwindStdDelDtor\n8761 c 2247 6034\n876d 4 2248 6034\n8771 6 2250 6034\n8777 2 2251 6034\n8779 d 2252 6034\n8786 7 2255 6034\n878d 6 2256 6034\nFUNC 8793 3b 14 __CxxCallUnwindVecDtor\n8793 c 2282 6034\n879f 4 2283 6034\n87a3 f 2285 6034\n87b2 2 2286 6034\n87b4 d 2287 6034\n87c1 7 2290 6034\n87c8 6 2291 6034\nFUNC 87ce 79 4 IsInExceptionSpec\n87ce 6 2302 6034\n87d4 9 2303 6034\n87dd 5 2307 6034\n87e2 f 2323 6034\n87f1 9 2326 6034\n87fa 2 2327 6034\n87fc 10 2328 6034\n880c 26 2335 6034\n8832 4 2337 6034\n8836 c 2323 6034\n8842 3 2343 6034\n8845 2 2344 6034\nFUNC 8847 49 4 CallUnexpected\n8847 c 2379 6034\n8853 13 2380 6034\n8866 4 2383 6034\n886a 5 2384 6034\n886f 4 2391 6034\n8873 5 2392 6034\n8878 8 2388 6034\n8880 10 2390 6034\nFUNC 8890 30 0 Is_bad_exception_allowed\n8890 2 2399 6034\n8892 8 2400 6034\n889a 1d 2402 6034\n88b7 4 2408 6034\n88bb 1 2409 6034\n88bc 4 2404 6034\nFUNC 88c0 82 8 _is_exception_typeof(type_info const &,_EXCEPTION_POINTERS *)\n88c0 1 2416 6034\n88c1 e 2417 6034\n88cf 2 2419 6034\n88d1 9 2422 6034\n88da 2b 2423 6034\n8905 6 2432 6034\n890b 7 2433 6034\n8912 2 2445 6034\n8914 20 2446 6034\n8934 4 2439 6034\n8938 4 2454 6034\n893c 6 2455 6034\nFUNC 8942 19c 18 CallCatchBlock\n8942 14 1431 6034\n8956 3 1437 6034\n8959 4 1439 6034\n895d 6 1443 6034\n8963 11 1447 6034\n8974 e 1451 6034\n8982 e 1452 6034\n8990 b 1454 6034\n899b e 1455 6034\n89a9 a 1457 6034\n89b3 3 1458 6034\n89b6 16 1463 6034\n89cc 12 1464 6034\n89de c 1465 6034\n89ea 3 1470 6034\n89ed 15 1471 6034\n8a02 3 1472 6034\n8a05 c 1474 6034\n8a11 11 1476 6034\n8a22 7 1478 6034\n8a29 d 1482 6034\n8a36 b 1486 6034\n8a41 13 1488 6034\n8a54 3 1517 6034\n8a57 6 1518 6034\n8a5d 5 1474 6034\n8a62 6 1488 6034\n8a68 6 1494 6034\n8a6e 9 1497 6034\n8a77 e 1500 6034\n8a85 e 1501 6034\n8a93 3f 1510 6034\n8ad2 c 1511 6034\nFUNC 8ade 17f 10 __BuildCatchObjectHelper\n8ade c 1575 6034\n8aea 5 1576 6034\n8aef 2a 1582 6034\n8b19 2 1588 6034\n8b1b 3 1590 6034\n8b1e 2 1588 6034\n8b20 2 1592 6034\n8b22 4 1611 6034\n8b26 3 1614 6034\n8b29 4 1622 6034\n8b2d 4 1615 6034\n8b31 26 1622 6034\n8b57 5 1623 6034\n8b5c 11 1625 6034\n8b6d 5 1628 6034\n8b72 3 1629 6034\n8b75 6 1636 6034\n8b7b 4 1629 6034\n8b7f 20 1636 6034\n8b9f 12 1637 6034\n8bb1 10 1639 6034\n8bc1 4 1641 6034\n8bc5 2 1646 6034\n8bc7 5 1649 6034\n8bcc 18 1654 6034\n8be4 1e 1656 6034\n8c02 2 1660 6034\n8c04 25 1668 6034\n8c29 d 1672 6034\n8c36 2 1677 6034\n8c38 5 1678 6034\n8c3d 7 1681 6034\n8c44 5 1688 6034\n8c49 7 1682 6034\n8c50 5 1684 6034\n8c55 2 1584 6034\n8c57 6 1689 6034\nFUNC 8c5d 91 10 __BuildCatchObject\n8c5d c 1712 6034\n8c69 b 1716 6034\n8c74 3 1718 6034\n8c77 2 1720 6034\n8c79 a 1739 6034\n8c83 4 1743 6034\n8c87 1a 1744 6034\n8ca1 1a 1756 6034\n8cbb 2 1757 6034\n8cbd 18 1750 6034\n8cd5 7 1762 6034\n8cdc 6 1769 6034\n8ce2 7 1763 6034\n8ce9 5 1765 6034\nFUNC 8cee 143 10 __CxxExceptionFilter\n8cee 3 1973 6034\n8cf1 a 1985 6034\n8cfb 3 2065 6034\n8cfe 2a 1993 6034\n8d28 32 2008 6034\n8d5a 6 2010 6034\n8d60 c 2011 6034\n8d6c 6 2012 6034\n8d72 b 2013 6034\n8d7d f 2040 6034\n8d8c a 2041 6034\n8d96 2 2047 6034\n8d98 1b 2050 6034\n8db3 4 2042 6034\n8db7 2 2050 6034\n8db9 c 2052 6034\n8dc5 6 2053 6034\n8dcb 13 2054 6034\n8dde 2 2055 6034\n8de0 25 1995 6034\n8e05 6 1997 6034\n8e0b e 1999 6034\n8e19 4 2000 6034\n8e1d c 2004 6034\n8e29 6 2005 6034\n8e2f 2 2065 6034\nFUNC 8e31 6c 20 CatchIt\n8e31 3 1217 6034\n8e34 6 1233 6034\n8e3a 10 1234 6034\n8e4a 4 1253 6034\n8e4e 6 1254 6034\n8e54 2 1255 6034\n8e56 8 1256 6034\n8e5e e 1259 6034\n8e6c 3 1265 6034\n8e6f 21 1273 6034\n8e90 4 1278 6034\n8e94 7 1280 6034\n8e9b 2 1286 6034\nFUNC 8e9d f2 20 FindHandlerForForeignException\n8e9d 6 913 6034\n8ea3 10 920 6034\n8eb3 2a 926 6034\n8edd 23 934 6034\n8f00 e 940 6034\n8f0e 17 945 6034\n8f25 c 948 6034\n8f31 29 954 6034\n8f5a 33 974 6034\n8f8d 2 984 6034\nFUNC 8f8f 356 20 FindHandler\n8f8f 6 569 6034\n8f95 20 632 6034\n8fb5 11 634 6034\n8fc6 42 637 6034\n9008 12 639 6034\n901a e 645 6034\n9028 b 646 6034\n9033 16 652 6034\n9049 2a 653 6034\n9073 12 659 6034\n9085 b 661 6034\n9090 5 662 6034\n9095 15 666 6034\n90aa 23 676 6034\n90cd 5 692 6034\n90d2 c 686 6034\n90de 30 688 6034\n910e 2b 698 6034\n9139 d 707 6034\n9146 19 715 6034\n915f c 718 6034\n916b 10 729 6034\n917b 6 735 6034\n9181 3 736 6034\n9184 7 737 6034\n918b 9 740 6034\n9194 2 741 6034\n9196 7 742 6034\n919d 23 750 6034\n91c0 d 737 6034\n91cd 2 676 6034\n91cf 33 774 6034\n9202 3 718 6034\n9205 6 795 6034\n920b a 804 6034\n9215 27 812 6034\n923c f 814 6034\n924b 5 840 6034\n9250 5 841 6034\n9255 b 843 6034\n9260 5 844 6034\n9265 d 846 6034\n9272 6 847 6034\n9278 2 848 6034\n927a 8 849 6034\n9282 14 851 6034\n9296 b 853 6034\n92a1 6 863 6034\n92a7 a 864 6034\n92b1 1c 866 6034\n92cd 16 877 6034\n92e3 2 880 6034\nFUNC 92e5 18 4 std::bad_exception::bad_exception(std::bad_exception const &)\nFUNC 92fd e4 20 __InternalCxxFrameHandler\n92fd 6 412 6034\n9303 3d 426 6034\n9340 6 432 6034\n9346 6 435 6034\n934c 10 440 6034\n935c 11 479 6034\n936d 2 482 6034\n936f 18 489 6034\n9387 19 499 6034\n93a0 1d 513 6034\n93bd 1c 524 6034\n93d9 6 533 6034\n93df 2 535 6034\nFUNC 93e1 6c 0 _use_encode_pointer\n93e1 7 66 2227\n93e8 2 72 2227\n93ea 12 75 2227\n93fc 7 76 2227\n9403 5 78 2227\n9408 7 82 2227\n940f 5 85 2227\n9414 e 91 2227\n9422 1f 93 2227\n9441 4 95 2227\n9445 6 100 2227\n944b 2 101 2227\nFUNC 944d 6e 4 _encode_pointer\n944d 1 120 2227\n944e 2b 129 2227\n9479 8 145 2227\n9481 d 133 2227\n948e d 135 2227\n949b c 138 2227\n94a7 4 148 2227\n94ab a 150 2227\n94b5 5 153 2227\n94ba 1 154 2227\nFUNC 94bb 9 0 _encoded_null\n94bb 0 173 2227\n94bb 8 174 2227\n94c3 1 175 2227\nFUNC 94c4 6e 4 _decode_pointer\n94c4 1 194 2227\n94c5 2b 203 2227\n94f0 8 219 2227\n94f8 d 207 2227\n9505 d 209 2227\n9512 c 212 2227\n951e 4 222 2227\n9522 a 224 2227\n952c 5 227 2227\n9531 1 228 2227\nFUNC 9532 9 4 __crtTlsAlloc\n9532 0 240 2227\n9532 6 241 2227\n9538 3 242 2227\nFUNC 953b 15 4 __fls_getvalue\n953b 0 258 2227\n953b 12 259 2227\n954d 3 260 2227\nFUNC 9550 6 0 __get_flsindex\n9550 0 272 2227\n9550 5 273 2227\n9555 1 274 2227\nFUNC 9556 32 0 __set_flsgetvalue\n9556 1 286 2227\n9557 e 288 2227\n9565 4 289 2227\n9569 e 291 2227\n9577 d 292 2227\n9584 3 294 2227\n9587 1 298 2227\nFUNC 9588 19 8 __fls_setvalue\n9588 0 315 2227\n9588 16 316 2227\n959e 3 317 2227\nFUNC 95a1 3d 0 _mtterm\n95a1 0 473 2227\n95a1 a 480 2227\n95ab f 481 2227\n95ba 7 482 2227\n95c1 a 485 2227\n95cb 7 486 2227\n95d2 7 487 2227\n95d9 5 494 2227\nFUNC 95de bf 8 _initptd\n95de c 521 2227\n95ea e 522 2227\n95f8 a 524 2227\n9602 6 525 2227\n9608 4 527 2227\n960c 9 529 2227\n9615 16 532 2227\n962b 10 533 2227\n963b 3 540 2227\n963e 7 544 2227\n9645 7 545 2227\n964c 8 546 2227\n9654 7 547 2227\n965b 8 551 2227\n9663 4 552 2227\n9667 6 553 2227\n966d 4 561 2227\n9671 8 562 2227\n9679 9 563 2227\n9682 c 565 2227\n968e 6 568 2227\n9694 9 566 2227\nFUNC 969d 77 0 _getptd_noexit\n969d 2 588 2227\n969f 6 592 2227\n96a5 15 600 2227\n96ba 14 608 2227\n96ce 19 610 2227\n96e7 a 616 2227\n96f1 6 618 2227\n96f7 6 619 2227\n96fd 2 621 2227\n96ff 7 627 2227\n9706 2 628 2227\n9708 8 633 2227\n9710 3 635 2227\n9713 1 636 2227\nFUNC 9714 18 0 _getptd\n9714 1 657 2227\n9715 7 658 2227\n971c 4 659 2227\n9720 8 660 2227\n9728 3 662 2227\n972b 1 663 2227\nFUNC 972c 121 4 _freefls\n972c c 691 2227\n9738 b 702 2227\n9743 7 703 2227\n974a 7 704 2227\n9751 7 706 2227\n9758 7 707 2227\n975f 7 709 2227\n9766 7 710 2227\n976d 7 712 2227\n9774 7 713 2227\n977b 7 715 2227\n9782 7 716 2227\n9789 7 718 2227\n9790 7 719 2227\n9797 a 721 2227\n97a1 7 722 2227\n97a8 8 724 2227\n97b0 4 725 2227\n97b4 1a 728 2227\n97ce 7 729 2227\n97d5 c 731 2227\n97e1 8 735 2227\n97e9 7 737 2227\n97f0 7 738 2227\n97f7 7 740 2227\n97fe 15 743 2227\n9813 7 744 2227\n981a c 747 2227\n9826 7 751 2227\n982d 8 754 2227\n9835 3 731 2227\n9838 9 732 2227\n9841 3 747 2227\n9844 9 748 2227\nFUNC 984d 69 4 _freeptd\n984d 0 778 2227\n984d a 783 2227\n9857 1b 795 2227\n9872 13 796 2227\n9885 16 802 2227\n989b 7 804 2227\n98a2 a 807 2227\n98ac 9 811 2227\n98b5 1 813 2227\nFUNC 98b6 6 0 __threadid\n98b6 0 837 2227\n98b6 6 838 2227\nFUNC 98bc 6 0 __threadhandle\n98bc 0 844 2227\n98bc 6 845 2227\nFUNC 98c2 184 0 _mtinit\n98c2 1 346 2227\n98c3 d 355 2227\n98d0 4 356 2227\n98d4 5 357 2227\n98d9 3 358 2227\n98dc 2 444 2227\n98de e 362 2227\n98ec d 365 2227\n98f9 d 368 2227\n9906 d 371 2227\n9913 2a 372 2227\n993d a 375 2227\n9947 1a 379 2227\n9961 25 388 2227\n9986 5 393 2227\n998b b 400 2227\n9996 10 401 2227\n99a6 10 402 2227\n99b6 18 403 2227\n99ce 7 410 2227\n99d5 2 412 2227\n99d7 1b 418 2227\n99f2 2 420 2227\n99f4 2d 428 2227\n9a21 a 438 2227\n9a2b 6 440 2227\n9a31 6 441 2227\n9a37 5 443 2227\n9a3c 5 430 2227\n9a41 4 389 2227\n9a45 1 444 2227\nFUNC 9a46 39 0 terminate()\n9a46 c 94 5983\n9a52 8 107 5983\n9a5a 4 111 5983\n9a5e 4 116 5983\n9a62 2 120 5983\n9a64 2 121 5983\n9a66 7 122 5983\n9a6d 7 127 5983\n9a74 5 135 5983\n9a79 6 136 5983\nFUNC 9a7f 13 0 unexpected()\n9a7f 0 149 5983\n9a7f 8 159 5983\n9a87 4 163 5983\n9a8b 2 167 5983\n9a8d 5 173 5983\nFUNC 9a92 37 0 _inconsistency()\n9a92 c 187 5983\n9a9e c 196 5983\n9aaa 4 197 5983\n9aae 4 202 5983\n9ab2 2 203 5983\n9ab4 2 204 5983\n9ab6 7 205 5983\n9abd 7 211 5983\n9ac4 5 217 5983\nFUNC 9ac9 11 4 _initp_eh_hooks\n9ac9 0 74 5983\n9ac9 10 80 5983\n9ad9 1 81 5983\nFUNC 9ae0 4c c _CallSettingFrame\n9ae0 3 48 5665\n9ae3 3 57 5665\n9ae6 1 58 5665\n9ae7 1 59 5665\n9ae8 3 60 5665\n9aeb 3 61 5665\n9aee 3 62 5665\n9af1 3 63 5665\n9af4 1 64 5665\n9af5 3 65 5665\n9af8 3 66 5665\n9afb 3 67 5665\n9afe 5 68 5665\n9b03 1 69 5665\n9b04 1 70 5665\n9b05 2 71 5665\n9b07 1 73 5665\n9b08 1 74 5665\n9b09 2 75 5665\n9b0b 1 76 5665\n9b0c 3 77 5665\n9b0f 1 78 5665\n9b10 2 79 5665\n9b12 6 80 5665\n9b18 2 81 5665\n9b1a 5 82 5665\n9b1f 1 84 5665\n9b20 5 85 5665\n9b25 1 86 5665\n9b26 1 87 5665\n9b27 1 88 5665\n9b28 4 89 5665\nPUBLIC 9b07 0 _NLG_Return\nFUNC 9b2c b9 4 _onexit_nolock\n9b2c 5 104 3259\n9b31 b 107 3259\n9b3c 13 108 3259\n9b4f 16 112 3259\n9b65 d 122 3259\n9b72 d 127 3259\n9b7f 14 129 3259\n9b93 3 134 3259\n9b96 14 136 3259\n9baa 3 147 3259\n9bad f 149 3259\n9bbc e 156 3259\n9bca c 157 3259\n9bd6 7 159 3259\n9bdd 6 114 3259\n9be3 2 160 3259\nFUNC 9be5 2f 0 __onexitinit\n9be5 1 205 3259\n9be6 b 208 3259\n9bf1 9 209 3259\n9bfa e 211 3259\n9c08 4 216 3259\n9c0c 1 221 3259\n9c0d 3 218 3259\n9c10 3 220 3259\n9c13 1 221 3259\nFUNC 9c14 3c 4 _onexit\n9c14 c 85 3259\n9c20 5 88 3259\n9c25 4 90 3259\n9c29 c 91 3259\n9c35 c 93 3259\n9c41 3 97 3259\n9c44 6 98 3259\n9c4a 6 94 3259\nFUNC 9c50 12 4 atexit\n9c50 0 165 3259\n9c50 11 166 3259\n9c61 1 167 3259\nFUNC 9c62 4f 4 V6_HeapAlloc\n9c62 c 27 5425\n9c6e 4 28 5425\n9c72 b 29 5425\n9c7d 8 31 5425\n9c85 4 32 5425\n9c89 a 33 5425\n9c93 c 35 5425\n9c9f 3 39 5425\n9ca2 6 40 5425\n9ca8 9 36 5425\nFUNC 9cb1 75 4 _heap_alloc\n9cb1 0 90 5425\n9cb1 9 95 5425\n9cba 5 96 5425\n9cbf 7 97 5425\n9cc6 c 98 5425\n9cd2 a 104 5425\n9cdc 18 105 5425\n9cf4 1 129 5425\n9cf5 a 107 5425\n9cff 9 108 5425\n9d08 2 109 5425\n9d0a 4 121 5425\n9d0e 1 122 5425\n9d0f 6 124 5425\n9d15 10 126 5425\n9d25 1 129 5425\nFUNC 9d26 c3 4 malloc\n9d26 1 155 5425\n9d27 16 159 5425\n9d3d 65 163 5425\n9da2 4 168 5425\n9da6 b 172 5425\n9db1 b 179 5425\n9dbc 2 183 5425\n9dbe 7 174 5425\n9dc5 8 193 5425\n9dcd 5 195 5425\n9dd2 1 196 5425\n9dd3 7 185 5425\n9dda b 186 5425\n9de5 3 187 5425\n9de8 1 196 5425\nFUNC 9de9 a 4 _initp_heap_handler\n9de9 0 31 5230\n9de9 9 32 5230\n9df2 1 33 5230\nFUNC 9df3 31 4 _set_new_handler(int (*)(unsigned int))\n9df3 1 53 5230\n9df4 7 57 5230\n9dfb b 59 5230\n9e06 b 60 5230\n9e11 f 63 5230\n9e20 3 65 5230\n9e23 1 66 5230\nFUNC 9e24 9 4 _set_new_handler(int)\n9e24 0 86 5230\n9e24 8 89 5230\n9e2c 1 90 5230\nFUNC 9e2d d 0 _query_new_handler()\n9e2d 0 110 5230\n9e2d c 111 5230\n9e39 1 112 5230\nFUNC 9e3a 22 4 _callnewh\n9e3a 0 131 5230\n9e3a b 133 5230\n9e45 10 135 5230\n9e55 3 138 5230\n9e58 1 139 5230\n9e59 2 136 5230\n9e5b 1 139 5230\nFUNC 9e5c 22 18 _invoke_watson_if_error\n9e5c 3 754 5850\n9e5f 6 755 5850\n9e65 17 759 5850\n9e7c 2 760 5850\nFUNC 9e7e 70 4 type_info::_Type_info_dtor(type_info *)\n9e7e c 62 5815\n9e8a 8 63 5815\n9e92 4 64 5815\n9e96 a 65 5815\n9ea0 d 70 5815\n9ead 4 72 5815\n9eb1 4 74 5815\n9eb5 6 79 5815\n9ebb 7 80 5815\n9ec2 9 94 5815\n9ecb 4 101 5815\n9ecf c 103 5815\n9edb 6 107 5815\n9ee1 2 83 5815\n9ee3 2 72 5815\n9ee5 9 104 5815\nFUNC 9eee f5 8 type_info::_Name_base(type_info const *,__type_info_node *)\n9eee c 109 5815\n9efa e 113 5815\n9f08 24 124 5815\n9f2c 7 125 5815\n9f33 16 132 5815\n9f49 2 133 5815\n9f4b 5 132 5815\n9f50 b 136 5815\n9f5b 5 142 5815\n9f60 a 149 5815\n9f6a 4 150 5815\n9f6e 11 157 5815\n9f7f 20 158 5815\n9f9f 5 159 5815\n9fa4 9 165 5815\n9fad 3 166 5815\n9fb0 2 167 5815\n9fb2 7 173 5815\n9fb9 9 180 5815\n9fc2 c 181 5815\n9fce 3 188 5815\n9fd1 6 189 5815\n9fd7 3 181 5815\n9fda 9 182 5815\nFUNC 9fe3 70 4 type_info::_Type_info_dtor_internal(type_info *)\n9fe3 c 197 5815\n9fef 8 198 5815\n9ff7 4 199 5815\n9ffb a 200 5815\na005 d 205 5815\na012 4 207 5815\na016 4 209 5815\na01a 6 214 5815\na020 7 215 5815\na027 9 229 5815\na030 4 236 5815\na034 c 238 5815\na040 6 242 5815\na046 2 218 5815\na048 2 207 5815\na04a 9 239 5815\nFUNC a053 31 10 __unDNameHelper\na053 3 249 5815\na056 7 250 5815\na05d 7 252 5815\na064 1e 260 5815\na082 2 261 5815\nFUNC a084 eb 8 type_info::_Name_base_internal(type_info const *,__type_info_node *)\na084 c 265 5815\na090 e 269 5815\na09e 1a 273 5815\na0b8 7 274 5815\na0bf 16 281 5815\na0d5 2 282 5815\na0d7 5 281 5815\na0dc b 285 5815\na0e7 5 291 5815\na0ec a 298 5815\na0f6 4 299 5815\na0fa 11 306 5815\na10b 20 307 5815\na12b 5 308 5815\na130 9 314 5815\na139 3 315 5815\na13c 2 316 5815\na13e 7 322 5815\na145 9 329 5815\na14e c 330 5815\na15a 3 337 5815\na15d 6 338 5815\na163 3 330 5815\na166 9 331 5815\nFUNC a16f 53 4 __clean_type_info_names_internal\na16f c 346 5815\na17b 8 347 5815\na183 4 348 5815\na187 6 352 5815\na18d 4 354 5815\na191 3 356 5815\na194 7 357 5815\na19b 8 358 5815\na1a3 4 354 5815\na1a7 c 359 5815\na1b3 6 363 5815\na1b9 9 361 5815\nFUNC a1d0 88 8 strcmp\na1d0 0 65 926\na1d0 4 73 926\na1d4 4 74 926\na1d8 6 76 926\na1de 2 77 926\na1e0 2 81 926\na1e2 2 83 926\na1e4 2 84 926\na1e6 2 85 926\na1e8 2 86 926\na1ea 3 87 926\na1ed 2 88 926\na1ef 2 89 926\na1f1 2 90 926\na1f3 3 92 926\na1f6 3 94 926\na1f9 2 95 926\na1fb 2 96 926\na1fd 2 97 926\na1ff 3 98 926\na202 2 99 926\na204 3 100 926\na207 3 101 926\na20a 2 102 926\na20c 4 103 926\na210 2 107 926\na212 2 108 926\na214 2 115 926\na216 2 116 926\na218 3 117 926\na21b 1 118 926\na21c 6 122 926\na222 2 123 926\na224 2 125 926\na226 3 126 926\na229 2 127 926\na22b 2 128 926\na22d 3 129 926\na230 2 130 926\na232 2 131 926\na234 6 133 926\na23a 2 134 926\na23c 3 139 926\na23f 3 140 926\na242 2 141 926\na244 2 142 926\na246 2 143 926\na248 2 144 926\na24a 3 145 926\na24d 2 146 926\na24f 2 147 926\na251 2 148 926\na253 3 149 926\na256 2 150 926\nFUNC a258 65 c strcpy_s\na258 0 13 781\na258 30 18 781\na288 c 19 781\na294 2 21 781\na296 d 23 781\na2a3 4 27 781\na2a7 2 29 781\na2a9 e 30 781\na2b7 5 33 781\na2bc 1 34 781\nFUNC a2c0 7a c memset\na2c0 0 59 934\na2c0 4 68 934\na2c4 4 69 934\na2c8 2 71 934\na2ca 2 72 934\na2cc 2 74 934\na2ce 4 75 934\na2d2 2 78 934\na2d4 2 79 934\na2d6 6 80 934\na2dc 2 81 934\na2de 7 82 934\na2e5 2 83 934\na2e7 5 85 934\na2ec 1 91 934\na2ed 2 92 934\na2ef 3 94 934\na2f2 2 95 934\na2f4 2 97 934\na2f6 3 98 934\na2f9 2 99 934\na2fb 2 101 934\na2fd 2 103 934\na2ff 3 104 934\na302 3 105 934\na305 2 106 934\na307 2 110 934\na309 3 111 934\na30c 2 113 934\na30e 2 115 934\na310 3 117 934\na313 2 119 934\na315 2 122 934\na317 3 123 934\na31a 3 124 934\na31d 2 125 934\na31f 2 127 934\na321 2 129 934\na323 2 130 934\na325 2 134 934\na327 3 135 934\na32a 3 137 934\na32d 2 138 934\na32f 4 142 934\na333 1 143 934\na334 1 145 934\na335 4 148 934\na339 1 150 934\nFUNC a340 365 c memcpy\na340 3 101 1027\na343 1 113 1027\na344 1 114 1027\na345 3 116 1027\na348 3 117 1027\na34b 3 119 1027\na34e 2 129 1027\na350 2 131 1027\na352 2 132 1027\na354 2 134 1027\na356 2 135 1027\na358 2 137 1027\na35a 6 138 1027\na360 6 147 1027\na366 2 148 1027\na368 7 150 1027\na36f 2 151 1027\na371 1 153 1027\na372 1 154 1027\na373 3 155 1027\na376 3 156 1027\na379 2 157 1027\na37b 1 158 1027\na37c 1 159 1027\na37d 2 160 1027\na37f 1 163 1027\na380 1 164 1027\na381 1 165 1027\na382 5 166 1027\na387 6 179 1027\na38d 2 180 1027\na38f 3 182 1027\na392 3 183 1027\na395 3 185 1027\na398 2 186 1027\na39a 2 188 1027\na39c 8 190 1027\na3a4 2 208 1027\na3a6 5 209 1027\na3ab 3 211 1027\na3ae 2 212 1027\na3b0 3 214 1027\na3b3 2 215 1027\na3b5 7 217 1027\na3bc 8 221 1027\na3c4 14 225 1027\na3d8 2 232 1027\na3da 2 233 1027\na3dc 2 235 1027\na3de 3 236 1027\na3e1 3 238 1027\na3e4 3 239 1027\na3e7 3 241 1027\na3ea 3 242 1027\na3ed 3 244 1027\na3f0 3 245 1027\na3f3 3 247 1027\na3f6 2 248 1027\na3f8 2 250 1027\na3fa a 252 1027\na404 2 256 1027\na406 2 257 1027\na408 2 259 1027\na40a 3 260 1027\na40d 3 262 1027\na410 3 263 1027\na413 3 265 1027\na416 3 266 1027\na419 3 268 1027\na41c 2 269 1027\na41e 2 271 1027\na420 8 273 1027\na428 2 277 1027\na42a 2 278 1027\na42c 2 280 1027\na42e 3 281 1027\na431 3 283 1027\na434 3 284 1027\na437 3 286 1027\na43a 2 287 1027\na43c 2 289 1027\na43e 2a 291 1027\na468 4 298 1027\na46c 4 300 1027\na470 4 302 1027\na474 4 304 1027\na478 4 306 1027\na47c 4 308 1027\na480 4 310 1027\na484 4 312 1027\na488 4 314 1027\na48c 4 316 1027\na490 4 318 1027\na494 4 320 1027\na498 4 322 1027\na49c 4 324 1027\na4a0 7 326 1027\na4a7 2 328 1027\na4a9 2 329 1027\na4ab 19 331 1027\na4c4 3 340 1027\na4c7 1 341 1027\na4c8 1 342 1027\na4c9 3 344 1027\na4cc 2 348 1027\na4ce 2 350 1027\na4d0 3 351 1027\na4d3 1 352 1027\na4d4 1 353 1027\na4d5 3 354 1027\na4d8 2 358 1027\na4da 2 360 1027\na4dc 3 361 1027\na4df 3 362 1027\na4e2 3 363 1027\na4e5 1 364 1027\na4e6 1 365 1027\na4e7 5 366 1027\na4ec 2 370 1027\na4ee 2 372 1027\na4f0 3 373 1027\na4f3 3 374 1027\na4f6 3 375 1027\na4f9 3 376 1027\na4fc 3 377 1027\na4ff 1 378 1027\na500 1 379 1027\na501 3 380 1027\na504 4 391 1027\na508 4 392 1027\na50c 6 397 1027\na512 2 398 1027\na514 3 400 1027\na517 3 401 1027\na51a 3 403 1027\na51d 2 404 1027\na51f 1 406 1027\na520 2 407 1027\na522 1 408 1027\na523 9 410 1027\na52c 2 414 1027\na52e a 417 1027\na538 2 422 1027\na53a 5 423 1027\na53f 3 425 1027\na542 2 426 1027\na544 3 428 1027\na547 2 429 1027\na549 7 431 1027\na550 14 435 1027\na564 3 442 1027\na567 2 443 1027\na569 3 445 1027\na56c 3 446 1027\na56f 3 448 1027\na572 3 449 1027\na575 3 451 1027\na578 2 452 1027\na57a 1 454 1027\na57b 2 455 1027\na57d 1 456 1027\na57e a 458 1027\na588 3 462 1027\na58b 2 463 1027\na58d 3 465 1027\na590 3 466 1027\na593 3 468 1027\na596 3 469 1027\na599 3 471 1027\na59c 3 472 1027\na59f 3 474 1027\na5a2 2 475 1027\na5a4 1 477 1027\na5a5 2 478 1027\na5a7 1 479 1027\na5a8 8 481 1027\na5b0 3 485 1027\na5b3 2 486 1027\na5b5 3 488 1027\na5b8 3 489 1027\na5bb 3 491 1027\na5be 3 492 1027\na5c1 3 494 1027\na5c4 3 495 1027\na5c7 3 497 1027\na5ca 3 498 1027\na5cd 3 500 1027\na5d0 6 501 1027\na5d6 1 503 1027\na5d7 2 504 1027\na5d9 1 505 1027\na5da 2a 507 1027\na604 4 516 1027\na608 4 518 1027\na60c 4 520 1027\na610 4 522 1027\na614 4 524 1027\na618 4 526 1027\na61c 4 528 1027\na620 4 530 1027\na624 4 532 1027\na628 4 534 1027\na62c 4 536 1027\na630 4 538 1027\na634 4 540 1027\na638 4 542 1027\na63c 7 544 1027\na643 2 546 1027\na645 2 547 1027\na647 19 549 1027\na660 3 558 1027\na663 1 560 1027\na664 1 561 1027\na665 3 562 1027\na668 3 566 1027\na66b 3 568 1027\na66e 3 569 1027\na671 1 570 1027\na672 1 571 1027\na673 5 572 1027\na678 3 576 1027\na67b 3 578 1027\na67e 3 579 1027\na681 3 580 1027\na684 3 581 1027\na687 1 582 1027\na688 1 583 1027\na689 3 584 1027\na68c 3 588 1027\na68f 3 590 1027\na692 3 591 1027\na695 3 592 1027\na698 3 593 1027\na69b 3 594 1027\na69e 3 595 1027\na6a1 1 596 1027\na6a2 1 597 1027\na6a3 2 598 1027\nFUNC a6b0 365 c memmove\na6b0 3 101 977\na6b3 1 113 977\na6b4 1 114 977\na6b5 3 116 977\na6b8 3 117 977\na6bb 3 119 977\na6be 2 129 977\na6c0 2 131 977\na6c2 2 132 977\na6c4 2 134 977\na6c6 2 135 977\na6c8 2 137 977\na6ca 6 138 977\na6d0 6 147 977\na6d6 2 148 977\na6d8 7 150 977\na6df 2 151 977\na6e1 1 153 977\na6e2 1 154 977\na6e3 3 155 977\na6e6 3 156 977\na6e9 2 157 977\na6eb 1 158 977\na6ec 1 159 977\na6ed 2 160 977\na6ef 1 163 977\na6f0 1 164 977\na6f1 1 165 977\na6f2 5 166 977\na6f7 6 179 977\na6fd 2 180 977\na6ff 3 182 977\na702 3 183 977\na705 3 185 977\na708 2 186 977\na70a 2 188 977\na70c 8 190 977\na714 2 208 977\na716 5 209 977\na71b 3 211 977\na71e 2 212 977\na720 3 214 977\na723 2 215 977\na725 7 217 977\na72c 8 221 977\na734 14 225 977\na748 2 232 977\na74a 2 233 977\na74c 2 235 977\na74e 3 236 977\na751 3 238 977\na754 3 239 977\na757 3 241 977\na75a 3 242 977\na75d 3 244 977\na760 3 245 977\na763 3 247 977\na766 2 248 977\na768 2 250 977\na76a a 252 977\na774 2 256 977\na776 2 257 977\na778 2 259 977\na77a 3 260 977\na77d 3 262 977\na780 3 263 977\na783 3 265 977\na786 3 266 977\na789 3 268 977\na78c 2 269 977\na78e 2 271 977\na790 8 273 977\na798 2 277 977\na79a 2 278 977\na79c 2 280 977\na79e 3 281 977\na7a1 3 283 977\na7a4 3 284 977\na7a7 3 286 977\na7aa 2 287 977\na7ac 2 289 977\na7ae 2a 291 977\na7d8 4 298 977\na7dc 4 300 977\na7e0 4 302 977\na7e4 4 304 977\na7e8 4 306 977\na7ec 4 308 977\na7f0 4 310 977\na7f4 4 312 977\na7f8 4 314 977\na7fc 4 316 977\na800 4 318 977\na804 4 320 977\na808 4 322 977\na80c 4 324 977\na810 7 326 977\na817 2 328 977\na819 2 329 977\na81b 19 331 977\na834 3 340 977\na837 1 341 977\na838 1 342 977\na839 3 344 977\na83c 2 348 977\na83e 2 350 977\na840 3 351 977\na843 1 352 977\na844 1 353 977\na845 3 354 977\na848 2 358 977\na84a 2 360 977\na84c 3 361 977\na84f 3 362 977\na852 3 363 977\na855 1 364 977\na856 1 365 977\na857 5 366 977\na85c 2 370 977\na85e 2 372 977\na860 3 373 977\na863 3 374 977\na866 3 375 977\na869 3 376 977\na86c 3 377 977\na86f 1 378 977\na870 1 379 977\na871 3 380 977\na874 4 391 977\na878 4 392 977\na87c 6 397 977\na882 2 398 977\na884 3 400 977\na887 3 401 977\na88a 3 403 977\na88d 2 404 977\na88f 1 406 977\na890 2 407 977\na892 1 408 977\na893 9 410 977\na89c 2 414 977\na89e a 417 977\na8a8 2 422 977\na8aa 5 423 977\na8af 3 425 977\na8b2 2 426 977\na8b4 3 428 977\na8b7 2 429 977\na8b9 7 431 977\na8c0 14 435 977\na8d4 3 442 977\na8d7 2 443 977\na8d9 3 445 977\na8dc 3 446 977\na8df 3 448 977\na8e2 3 449 977\na8e5 3 451 977\na8e8 2 452 977\na8ea 1 454 977\na8eb 2 455 977\na8ed 1 456 977\na8ee a 458 977\na8f8 3 462 977\na8fb 2 463 977\na8fd 3 465 977\na900 3 466 977\na903 3 468 977\na906 3 469 977\na909 3 471 977\na90c 3 472 977\na90f 3 474 977\na912 2 475 977\na914 1 477 977\na915 2 478 977\na917 1 479 977\na918 8 481 977\na920 3 485 977\na923 2 486 977\na925 3 488 977\na928 3 489 977\na92b 3 491 977\na92e 3 492 977\na931 3 494 977\na934 3 495 977\na937 3 497 977\na93a 3 498 977\na93d 3 500 977\na940 6 501 977\na946 1 503 977\na947 2 504 977\na949 1 505 977\na94a 2a 507 977\na974 4 516 977\na978 4 518 977\na97c 4 520 977\na980 4 522 977\na984 4 524 977\na988 4 526 977\na98c 4 528 977\na990 4 530 977\na994 4 532 977\na998 4 534 977\na99c 4 536 977\na9a0 4 538 977\na9a4 4 540 977\na9a8 4 542 977\na9ac 7 544 977\na9b3 2 546 977\na9b5 2 547 977\na9b7 19 549 977\na9d0 3 558 977\na9d3 1 560 977\na9d4 1 561 977\na9d5 3 562 977\na9d8 3 566 977\na9db 3 568 977\na9de 3 569 977\na9e1 1 570 977\na9e2 1 571 977\na9e3 5 572 977\na9e8 3 576 977\na9eb 3 578 977\na9ee 3 579 977\na9f1 3 580 977\na9f4 3 581 977\na9f7 1 582 977\na9f8 1 583 977\na9f9 3 584 977\na9fc 3 588 977\na9ff 3 590 977\naa02 3 591 977\naa05 3 592 977\naa08 3 593 977\naa0b 3 594 977\naa0e 3 595 977\naa11 1 596 977\naa12 1 597 977\naa13 2 598 977\nFUNC aa15 3d 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)\naa15 0 67 5721\naa15 33 68 5721\naa48 5 69 5721\naa4d 2 72 5721\naa4f 3 73 5721\nFUNC aa52 e 0 __CxxSetUnhandledExceptionFilter\naa52 0 86 5721\naa52 b 89 5721\naa5d 2 90 5721\naa5f 1 91 5721\nFUNC aa60 1a0 4 _NMSG_WRITE\naa60 2 174 2418\naa62 a 178 2418\naa6c f 179 2418\naa7b a 182 2418\naa85 2a 203 2418\naaaf c 215 2418\naabb 2a 224 2418\naae5 1e 227 2418\nab03 26 228 2418\nab29 d 231 2418\nab36 b 233 2418\nab41 2f 234 2418\nab70 20 237 2418\nab90 22 238 2418\nabb2 15 242 2418\nabc7 a 205 2418\nabd1 9 206 2418\nabda 24 212 2418\nabfe 2 245 2418\nFUNC ac00 20 4 _GET_RTERRMSG\nac00 0 268 2418\nac00 2 271 2418\nac02 13 272 2418\nac15 2 275 2418\nac17 1 276 2418\nac18 7 273 2418\nac1f 1 276 2418\nFUNC ac20 39 0 _FF_MSGBANNER\nac20 0 141 2418\nac20 22 145 2418\nac42 a 147 2418\nac4c c 148 2418\nac58 1 150 2418\nFUNC ac59 1 4 _initp_misc_winxfltr\nac59 0 105 2752\nac59 1 106 2752\nFUNC ac5a 32 4 xcptlookup\nac5a 0 410 2752\nac5a b 411 2752\nac65 14 418 2752\nac79 e 425 2752\nac87 2 428 2752\nac89 2 426 2752\nac8b 1 429 2752\nFUNC ac8c 15e 8 _XcptFilter\nac8c 6 206 2752\nac92 7 213 2752\nac99 8 214 2752\naca1 34 219 2752\nacd5 2 221 2752\nacd7 2 225 2752\nacd9 3 227 2752\nacdc 7 234 2752\nace3 7 235 2752\nacea 5 243 2752\nacef 4 248 2752\nacf3 8 249 2752\nacfb 3 255 2752\nacfe 6 259 2752\nad04 6 273 2752\nad0a 6 274 2752\nad10 c 283 2752\nad1c 17 291 2752\nad33 1e 294 2752\nad51 3 291 2752\nad54 c 321 2752\nad60 9 323 2752\nad69 7 325 2752\nad70 9 327 2752\nad79 7 329 2752\nad80 9 331 2752\nad89 7 333 2752\nad90 9 335 2752\nad99 7 337 2752\nada0 9 339 2752\nada9 7 341 2752\nadb0 9 343 2752\nadb9 7 345 2752\nadc0 7 347 2752\nadc7 8 356 2752\nadcf 3 361 2752\nadd2 2 363 2752\nadd4 4 368 2752\nadd8 3 369 2752\naddb 7 375 2752\nade2 6 377 2752\nade8 2 379 2752\nFUNC adea 1b 8 __CppXcptFilter\nadea 0 145 2752\nadea b 146 2752\nadf5 c 147 2752\nae01 1 151 2752\nae02 2 149 2752\nae04 1 151 2752\nFUNC ae05 db 0 _setenvp\nae05 1 77 2280\nae06 c 85 2280\nae12 5 86 2280\nae17 8 91 2280\nae1f 4 98 2280\nae23 8 99 2280\nae2b 4 110 2280\nae2f 1 111 2280\nae30 11 112 2280\nae41 15 117 2280\nae56 2 118 2280\nae58 9 121 2280\nae61 9 123 2280\nae6a 6 125 2280\nae70 10 127 2280\nae80 1c 133 2280\nae9c 3 134 2280\nae9f 6 121 2280\naea5 b 138 2280\naeb0 6 139 2280\naeb6 2 142 2280\naeb8 a 149 2280\naec2 7 152 2280\naec9 17 153 2280\nFUNC aee0 a 4 _set_pgmptr\naee0 a 334 2303\nFUNC aeea 198 c parse_cmdline\naeea 4 218 2322\naeee 6 226 2322\naef4 8 230 2322\naefc 14 231 2322\naf10 3 250 2322\naf13 5 252 2322\naf18 5 254 2322\naf1d 9 255 2322\naf26 2 256 2322\naf28 2 258 2322\naf2a 4 259 2322\naf2e 8 260 2322\naf36 2 262 2322\naf38 f 264 2322\naf47 2 265 2322\naf49 6 266 2322\naf4f a 267 2322\naf59 1 268 2322\naf5a 1a 272 2322\naf74 4 277 2322\naf78 4 278 2322\naf7c 4 281 2322\naf80 9 286 2322\naf89 a 287 2322\naf93 3 288 2322\naf96 1 275 2322\naf97 2 276 2322\naf99 9 291 2322\nafa2 6 295 2322\nafa8 9 296 2322\nafb1 2 297 2322\nafb3 3 311 2322\nafb6 4 315 2322\nafba 1 318 2322\nafbb 1 319 2322\nafbc 5 316 2322\nafc1 5 321 2322\nafc6 5 324 2322\nafcb e 325 2322\nafd9 2 326 2322\nafdb 2 327 2322\nafdd d 329 2322\nafea 2 332 2322\nafec 5 336 2322\naff1 4 337 2322\naff5 4 338 2322\naff9 6 339 2322\nafff 3 338 2322\nb002 14 343 2322\nb016 4 348 2322\nb01a 2 349 2322\nb01c 10 350 2322\nb02c b 351 2322\nb037 2 352 2322\nb039 a 354 2322\nb043 2 355 2322\nb045 a 356 2322\nb04f 1 357 2322\nb050 2 358 2322\nb052 5 361 2322\nb057 1 363 2322\nb058 5 372 2322\nb05d 4 376 2322\nb061 7 377 2322\nb068 2 378 2322\nb06a 8 379 2322\nb072 9 382 2322\nb07b 3 383 2322\nb07e 2 384 2322\nb080 2 385 2322\nFUNC b082 b9 0 _setargv\nb082 7 88 2322\nb089 c 97 2322\nb095 5 98 2322\nb09a 18 104 2322\nb0b2 19 120 2322\nb0cb 11 127 2322\nb0dc 15 132 2322\nb0f1 a 136 2322\nb0fb 2 138 2322\nb0fd 8 140 2322\nb105 3 141 2322\nb108 2 142 2322\nb10a 13 149 2322\nb11d c 153 2322\nb129 6 157 2322\nb12f 4 172 2322\nb133 6 134 2322\nb139 2 173 2322\nFUNC b13b 135 0 __crtGetEnvironmentStringsA\nb13b 2 43 4307\nb13d 1a 57 4307\nb157 8 59 4307\nb15f c 60 4307\nb16b b 62 4307\nb176 e 63 4307\nb184 9 68 4307\nb18d 4 71 4307\nb191 8 72 4307\nb199 7 73 4307\nb1a0 7 77 4307\nb1a7 7 78 4307\nb1ae 7 79 4307\nb1b5 1b 93 4307\nb1d0 13 97 4307\nb1e3 11 111 4307\nb1f4 a 113 4307\nb1fe 8 114 4307\nb206 7 99 4307\nb20d 4 100 4307\nb211 6 123 4307\nb217 2 152 4307\nb219 a 126 4307\nb223 6 127 4307\nb229 4 133 4307\nb22d 5 134 4307\nb232 5 135 4307\nb237 5 138 4307\nb23c d 140 4307\nb249 7 141 4307\nb250 5 142 4307\nb255 b 145 4307\nb260 7 147 4307\nb267 6 149 4307\nb26d 3 153 4307\nFUNC b270 24 0 _RTC_Initialize\nFUNC b294 24 0 _RTC_Terminate\nFUNC b2b8 5b 0 __heap_select\nb2b8 6 70 5473\nb2be 23 143 5473\nb2e1 1b 144 5473\nb2fc d 145 5473\nb309 3 146 5473\nb30c 2 164 5473\nb30e 3 161 5473\nb311 2 164 5473\nFUNC b313 5a 4 _heap_init\nb313 0 192 5473\nb313 20 199 5473\nb333 2 200 5473\nb335 1 240 5473\nb336 5 204 5473\nb33b a 206 5473\nb345 f 209 5473\nb354 c 211 5473\nb360 7 212 5473\nb367 2 213 5473\nb369 3 239 5473\nb36c 1 240 5473\nFUNC b36d 74 0 _heap_term\nb36d 1 261 5473\nb36e c 264 5473\nb37a 1b 270 5473\nb395 f 273 5473\nb3a4 b 276 5473\nb3af d 278 5473\nb3bc 11 281 5473\nb3cd c 300 5473\nb3d9 7 301 5473\nb3e0 1 302 5473\nFUNC b3e1 6 0 _get_heap_handle\nb3e1 0 320 5473\nb3e1 5 322 5473\nb3e6 1 323 5473\nFUNC b3e7 94 0 __security_init_cookie\nb3e7 6 97 3689\nb3ed 21 114 3689\nb40e 7 116 3689\nb415 3 117 3689\nb418 a 127 3689\nb422 6 132 3689\nb428 8 135 3689\nb430 8 136 3689\nb438 8 137 3689\nb440 10 139 3689\nb450 2 144 3689\nb452 4 161 3689\nb456 7 163 3689\nb45d 4 166 3689\nb461 7 168 3689\nb468 6 172 3689\nb46e b 173 3689\nb479 2 175 3689\nFUNC b47b 8 4 _crt_debugger_hook\nb47b 0 62 3966\nb47b 7 65 3966\nb482 1 66 3966\nFUNC b483 160 8 _flsbuf\nb483 5 93 2041\nb488 c 104 2041\nb494 8 106 2041\nb49c b 107 2041\nb4a7 4 108 2041\nb4ab 8 109 2041\nb4b3 4 110 2041\nb4b7 b 111 2041\nb4c2 3 113 2041\nb4c5 6 124 2041\nb4cb b 126 2041\nb4d6 3 127 2041\nb4d9 8 128 2041\nb4e1 9 137 2041\nb4ea f 141 2041\nb4f9 25 151 2041\nb51e 7 153 2041\nb525 d 158 2041\nb532 5 162 2041\nb537 5 163 2041\nb53c 6 164 2041\nb542 7 166 2041\nb549 10 167 2041\nb559 2 168 2041\nb55b 6 131 2041\nb561 5 132 2041\nb566 2e 169 2041\nb594 12 171 2041\nb5a6 2 174 2041\nb5a8 8 179 2041\nb5b0 2 186 2041\nb5b2 3 187 2041\nb5b5 13 189 2041\nb5c8 5 201 2041\nb5cd 4 202 2041\nb5d1 5 203 2041\nb5d6 b 207 2041\nb5e1 2 212 2041\nFUNC b5e3 25 4 write_char\nb5e3 0 2433 1163\nb5e3 a 2434 1163\nb5ed 2 2437 1163\nb5ef 12 2440 1163\nb601 3 2444 1163\nb604 1 2447 1163\nb605 2 2446 1163\nb607 1 2447 1163\nFUNC b608 25 c write_multi_char\nb608 6 2498 1163\nb60e 2 2501 1163\nb610 e 2500 1163\nb61e 6 2501 1163\nb624 7 2499 1163\nb62b 2 2504 1163\nFUNC b62d 4f 4 write_string\nb62d 0 2563 1163\nb62d 12 2564 1163\nb63f 6 2566 1163\nb645 2 2567 1163\nb647 11 2570 1163\nb658 6 2571 1163\nb65e a 2573 1163\nb668 a 2574 1163\nb672 9 2569 1163\nb67b 1 2579 1163\nFUNC b67c 910 10 _woutput_l\nb67c 1b 975 1163\nb697 72 1031 1163\nb709 4 1036 1163\nb70d 2c 1073 1163\nb739 1a 1075 1163\nb753 8 1076 1163\nb75b 18 1131 1163\nb773 2 1171 1163\nb775 13 1173 1163\nb788 3 1174 1163\nb78b 5 1175 1163\nb790 1f 1179 1163\nb7af 4 1193 1163\nb7b3 5 1194 1163\nb7b8 4 1181 1163\nb7bc 5 1182 1163\nb7c1 4 1184 1163\nb7c5 5 1185 1163\nb7ca 7 1190 1163\nb7d1 5 1191 1163\nb7d6 3 1187 1163\nb7d9 5 1196 1163\nb7de 6 1200 1163\nb7e4 9 1206 1163\nb7ed b 1233 1163\nb7f8 4 1235 1163\nb7fc 3 1236 1163\nb7ff 5 1239 1163\nb804 10 1241 1163\nb814 5 1243 1163\nb819 4 1248 1163\nb81d 5 1249 1163\nb822 6 1253 1163\nb828 9 1259 1163\nb831 b 1284 1163\nb83c 4 1285 1163\nb840 5 1287 1163\nb845 10 1289 1163\nb855 5 1291 1163\nb85a 1b 1295 1163\nb875 7 1362 1163\nb87c 5 1363 1163\nb881 6 1301 1163\nb887 2 1303 1163\nb889 a 1304 1163\nb893 5 1306 1163\nb898 4 1308 1163\nb89c 5 1310 1163\nb8a1 4 1358 1163\nb8a5 5 1359 1163\nb8aa 10 1322 1163\nb8ba 3 1324 1163\nb8bd f 1325 1163\nb8cc d 1327 1163\nb8d9 3 1329 1163\nb8dc a 1330 1163\nb8e6 5 1332 1163\nb8eb 3c 1337 1163\nb927 4 1352 1163\nb92b 13 1166 1163\nb93e 5 1167 1163\nb943 32 1378 1163\nb975 d 1716 1163\nb982 4 1724 1163\nb986 18 1749 1163\nb99e c 1750 1163\nb9aa c 1381 1163\nb9b6 9 1383 1163\nb9bf 8 1564 1163\nb9c7 4 1565 1163\nb9cb d 1584 1163\nb9d8 3 1589 1163\nb9db 13 1610 1163\nb9ee 4 1611 1163\nb9f2 8 1612 1163\nb9fa 19 1614 1163\nba13 13 1618 1163\nba26 1 1620 1163\nba27 9 1621 1163\nba30 5 1622 1163\nba35 1d 1378 1163\nba52 9 1397 1163\nba5b f 1415 1163\nba6a 3 1420 1163\nba6d 25 1430 1163\nba92 3 1434 1163\nba95 2 1436 1163\nba97 4 1437 1163\nba9b 6 1439 1163\nbaa1 3 1440 1163\nbaa4 5 1506 1163\nbaa9 5 1523 1163\nbaae e 1541 1163\nbabc 6 1546 1163\nbac2 b 1548 1163\nbacd 7 1549 1163\nbad4 5 1550 1163\nbad9 4 1551 1163\nbadd 5 1553 1163\nbae2 8 1543 1163\nbaea 7 1544 1163\nbaf1 5 1557 1163\nbaf6 34 1378 1163\nbb2a d 1908 1163\nbb37 9 1910 1163\nbb40 8 1668 1163\nbb48 d 1688 1163\nbb55 6 1702 1163\nbb5b 7 1703 1163\nbb62 2 1704 1163\nbb64 5 1706 1163\nbb69 7 1708 1163\nbb70 5 1710 1163\nbb75 4 1864 1163\nbb79 7 1869 1163\nbb80 c 1933 1163\nbb8c 8 1939 1163\nbb94 5 1958 1163\nbb99 8 1751 1163\nbba1 9 1752 1163\nbbaa 5 1753 1163\nbbaf 3 1754 1163\nbbb2 9 1756 1163\nbbbb f 1759 1163\nbbca 2 1760 1163\nbbcc 13 1765 1163\nbbdf 7 1767 1163\nbbe6 e 1809 1163\nbbf4 27 1828 1163\nbc1b 14 1838 1163\nbc2f 15 1840 1163\nbc44 b 1844 1163\nbc4f 15 1846 1163\nbc64 5 1852 1163\nbc69 7 1853 1163\nbc70 4 1854 1163\nbc74 1 1857 1163\nbc75 5 1859 1163\nbc7a 7 1877 1163\nbc81 3 1887 1163\nbc84 2 1888 1163\nbc86 1a 1378 1163\nbca0 7 1892 1163\nbca7 11 1897 1163\nbcb8 10 1900 1163\nbcc8 3 1901 1163\nbccb 5 1903 1163\nbcd0 6 1961 1163\nbcd6 6 1987 1163\nbcdc 16 2026 1163\nbcf2 2 2045 1163\nbcf4 5 2051 1163\nbcf9 2 2071 1163\nbcfb 4 2074 1163\nbcff 6 2080 1163\nbd05 2 2099 1163\nbd07 5 2105 1163\nbd0c 10 2128 1163\nbd1c 7 2129 1163\nbd23 7 2130 1163\nbd2a c 2136 1163\nbd36 2 2142 1163\nbd38 6 2148 1163\nbd3e 7 2149 1163\nbd45 2 2150 1163\nbd47 4 2151 1163\nbd4b a 2152 1163\nbd55 3 2153 1163\nbd58 6 2157 1163\nbd5e 3 2158 1163\nbd61 6 2163 1163\nbd67 10 2165 1163\nbd77 10 2166 1163\nbd87 c 2168 1163\nbd93 3 2170 1163\nbd96 3 2172 1163\nbd99 2 2173 1163\nbd9b 8 2175 1163\nbda3 1 2176 1163\nbda4 19 2180 1163\nbdbd 9 2181 1163\nbdc6 1 2182 1163\nbdc7 2 2185 1163\nbdc9 4 1625 1163\nbdcd 8 1626 1163\nbdd5 c 1628 1163\nbde1 7 1629 1163\nbde8 2 1630 1163\nbdea 4 1629 1163\nbdee 8 1631 1163\nbdf6 a 2201 1163\nbe00 7 2204 1163\nbe07 6 2205 1163\nbe0d 6 2207 1163\nbe13 2 2208 1163\nbe15 4 2210 1163\nbe19 6 2212 1163\nbe1f 2 2213 1163\nbe21 4 2215 1163\nbe25 6 2217 1163\nbe2b 7 2218 1163\nbe32 b 2224 1163\nbe3d 6 2228 1163\nbe43 11 2230 1163\nbe54 11 2234 1163\nbe65 d 2236 1163\nbe72 f 2238 1163\nbe81 a 2263 1163\nbe8b 3 2267 1163\nbe8e 3 2268 1163\nbe91 3 2269 1163\nbe94 1a 2276 1163\nbeae 7 2278 1163\nbeb5 e 2282 1163\nbec3 a 2283 1163\nbecd 2 1690 1163\nbecf 4 2279 1163\nbed3 2 2285 1163\nbed5 d 2286 1163\nbee2 c 2290 1163\nbeee 11 2292 1163\nbeff 6 2297 1163\nbf05 8 2298 1163\nbf0d 4 2299 1163\nbf11 1 2298 1163\nbf12 1b 1073 1163\nbf2d 17 1690 1163\nbf44 10 2376 1163\nbf54 38 2377 1163\nFUNC bf8c 97 10 _vswprintf_l\nbf8c 7 125 1425\nbf93 24 130 1425\nbfb7 8 135 1425\nbfbf 29 155 1425\nbfe8 1d 166 1425\nc005 18 167 1425\nc01d 4 169 1425\nc021 2 183 1425\nFUNC c023 17 c _vswprintf\nc023 0 192 1425\nc023 16 195 1425\nc039 1 197 1425\nFUNC c03a 5 10 __vswprintf_l\nc03a 0 205 1425\nc03a 5 208 1425\nFUNC c03f 55 10 _vscwprintf_helper\nc03f 7 430 1425\nc046 24 435 1425\nc06a 28 441 1425\nc092 2 443 1425\nFUNC c094 18 8 _vscwprintf\nc094 0 449 1425\nc094 17 450 1425\nc0ab 1 451 1425\nFUNC c0ac 1a c _vscwprintf_l\nc0ac 0 458 1425\nc0ac 19 459 1425\nc0c5 1 460 1425\nFUNC c0c6 18 8 _vscwprintf_p\nc0c6 0 466 1425\nc0c6 17 467 1425\nc0dd 1 468 1425\nFUNC c0de 1a c _vscwprintf_p_l\nc0de 0 475 1425\nc0de 19 476 1425\nc0f7 1 477 1425\nFUNC c0f8 14e 14 vfprintf_helper\nc0f8 c 51 1462\nc104 5 54 1462\nc109 2e 56 1462\nc137 c 57 1462\nc143 3 60 1462\nc146 7 62 1462\nc14d 3 63 1462\nc150 b0 65 1462\nc200 5 66 1462\nc205 8 68 1462\nc20d 10 69 1462\nc21d a 70 1462\nc227 c 74 1462\nc233 3 78 1462\nc236 6 79 1462\nc23c a 75 1462\nFUNC c246 1e 10 _vfprintf_l\nc246 0 87 1462\nc246 1d 88 1462\nc263 1 89 1462\nFUNC c264 1e 10 _vfprintf_s_l\nc264 0 97 1462\nc264 1d 98 1462\nc281 1 99 1462\nFUNC c282 1e 10 _vfprintf_p_l\nc282 0 107 1462\nc282 1d 108 1462\nc29f 1 109 1462\nFUNC c2a0 1c c vfprintf\nc2a0 0 116 1462\nc2a0 1b 117 1462\nc2bb 1 118 1462\nFUNC c2bc 1c c vfprintf_s\nc2bc 0 125 1462\nc2bc 1b 126 1462\nc2d7 1 127 1462\nFUNC c2d8 1c c _vfprintf_p\nc2d8 0 134 1462\nc2d8 1b 135 1462\nc2f3 1 136 1462\nFUNC c2f4 25 4 write_char\nc2f4 0 2433 1053\nc2f4 a 2434 1053\nc2fe 2 2437 1053\nc300 12 2440 1053\nc312 3 2444 1053\nc315 1 2447 1053\nc316 2 2446 1053\nc318 1 2447 1053\nFUNC c319 25 c write_multi_char\nc319 6 2498 1053\nc31f 2 2501 1053\nc321 e 2500 1053\nc32f 6 2501 1053\nc335 7 2499 1053\nc33c 2 2504 1053\nFUNC c33e 4f 4 write_string\nc33e 0 2563 1053\nc33e 12 2564 1053\nc350 6 2566 1053\nc356 2 2567 1053\nc358 11 2570 1053\nc369 6 2571 1053\nc36f a 2573 1053\nc379 a 2574 1053\nc383 9 2569 1053\nc38c 1 2579 1053\nFUNC c38d 91c 10 _woutput_s_l\nc38d 29 975 1053\nc3b6 3 976 1053\nc3b9 f 1007 1053\nc3c8 24 2172 1053\nc3ec 2f 1031 1053\nc41b 18 1036 1053\nc433 2e 1073 1053\nc461 16 1078 1053\nc477 e 1079 1053\nc485 11 1124 1053\nc496 10 1131 1053\nc4a6 2 1171 1053\nc4a8 13 1173 1053\nc4bb 3 1174 1053\nc4be 5 1175 1053\nc4c3 1e 1179 1053\nc4e1 3 1193 1053\nc4e4 5 1194 1053\nc4e9 4 1181 1053\nc4ed 5 1182 1053\nc4f2 4 1184 1053\nc4f6 5 1185 1053\nc4fb 7 1190 1053\nc502 5 1191 1053\nc507 3 1187 1053\nc50a 5 1196 1053\nc50f 6 1200 1053\nc515 5 1206 1053\nc51a e 1233 1053\nc528 4 1235 1053\nc52c 3 1236 1053\nc52f 5 1239 1053\nc534 10 1241 1053\nc544 5 1243 1053\nc549 4 1248 1053\nc54d 5 1249 1053\nc552 6 1253 1053\nc558 5 1259 1053\nc55d e 1284 1053\nc56b 4 1285 1053\nc56f 5 1287 1053\nc574 10 1289 1053\nc584 5 1291 1053\nc589 1b 1295 1053\nc5a4 7 1362 1053\nc5ab 5 1363 1053\nc5b0 6 1301 1053\nc5b6 2 1303 1053\nc5b8 7 1304 1053\nc5bf 5 1306 1053\nc5c4 4 1308 1053\nc5c8 5 1310 1053\nc5cd 4 1358 1053\nc5d1 5 1359 1053\nc5d6 10 1322 1053\nc5e6 3 1324 1053\nc5e9 c 1325 1053\nc5f5 d 1327 1053\nc602 3 1329 1053\nc605 7 1330 1053\nc60c 5 1332 1053\nc611 3c 1337 1053\nc64d 4 1352 1053\nc651 14 1166 1053\nc665 5 1167 1053\nc66a 32 1378 1053\nc69c d 1716 1053\nc6a9 4 1724 1053\nc6ad 18 1749 1053\nc6c5 c 1750 1053\nc6d1 c 1381 1053\nc6dd 9 1383 1053\nc6e6 8 1564 1053\nc6ee 4 1565 1053\nc6f2 d 1584 1053\nc6ff 3 1589 1053\nc702 13 1610 1053\nc715 4 1611 1053\nc719 8 1612 1053\nc721 19 1614 1053\nc73a 13 1618 1053\nc74d 1 1620 1053\nc74e 9 1621 1053\nc757 5 1622 1053\nc75c 1e 1378 1053\nc77a 9 1397 1053\nc783 f 1415 1053\nc792 3 1420 1053\nc795 25 1430 1053\nc7ba 3 1434 1053\nc7bd 2 1436 1053\nc7bf 4 1437 1053\nc7c3 6 1439 1053\nc7c9 3 1440 1053\nc7cc 5 1506 1053\nc7d1 5 1523 1053\nc7d6 e 1541 1053\nc7e4 6 1546 1053\nc7ea b 1548 1053\nc7f5 7 1549 1053\nc7fc 5 1550 1053\nc801 4 1551 1053\nc805 5 1553 1053\nc80a 8 1543 1053\nc812 7 1544 1053\nc819 5 1557 1053\nc81e 34 1378 1053\nc852 9 1908 1053\nc85b 9 1910 1053\nc864 8 1668 1053\nc86c d 1688 1053\nc879 6 1702 1053\nc87f 7 1703 1053\nc886 2 1704 1053\nc888 5 1706 1053\nc88d 7 1708 1053\nc894 5 1710 1053\nc899 4 1864 1053\nc89d 7 1869 1053\nc8a4 c 1933 1053\nc8b0 8 1939 1053\nc8b8 5 1958 1053\nc8bd 8 1751 1053\nc8c5 9 1752 1053\nc8ce 5 1753 1053\nc8d3 3 1754 1053\nc8d6 9 1756 1053\nc8df f 1759 1053\nc8ee 3 1760 1053\nc8f1 15 1765 1053\nc906 7 1767 1053\nc90d e 1809 1053\nc91b 27 1828 1053\nc942 14 1838 1053\nc956 15 1840 1053\nc96b b 1844 1053\nc976 15 1846 1053\nc98b 5 1852 1053\nc990 7 1853 1053\nc997 4 1854 1053\nc99b 1 1857 1053\nc99c 5 1859 1053\nc9a1 3 1877 1053\nc9a4 7 1887 1053\nc9ab 2 1888 1053\nc9ad 1a 1378 1053\nc9c7 7 1892 1053\nc9ce 11 1897 1053\nc9df 10 1900 1053\nc9ef 3 1901 1053\nc9f2 5 1903 1053\nc9f7 6 1961 1053\nc9fd 6 1987 1053\nca03 16 2026 1053\nca19 2 2045 1053\nca1b 5 2051 1053\nca20 2 2071 1053\nca22 4 2074 1053\nca26 6 2080 1053\nca2c 2 2099 1053\nca2e 5 2105 1053\nca33 10 2128 1053\nca43 7 2129 1053\nca4a 7 2130 1053\nca51 c 2136 1053\nca5d 2 2142 1053\nca5f 6 2148 1053\nca65 7 2149 1053\nca6c 2 2150 1053\nca6e 4 2151 1053\nca72 a 2152 1053\nca7c 3 2153 1053\nca7f 6 2157 1053\nca85 3 2158 1053\nca88 6 2163 1053\nca8e 10 2165 1053\nca9e 10 2166 1053\ncaae c 2168 1053\ncaba 3 2170 1053\ncabd 3 2172 1053\ncac0 2 2173 1053\ncac2 8 2175 1053\ncaca 1 2176 1053\ncacb 19 2180 1053\ncae4 9 2181 1053\ncaed 1 2182 1053\ncaee 2 2185 1053\ncaf0 4 1625 1053\ncaf4 8 1626 1053\ncafc c 1628 1053\ncb08 7 1629 1053\ncb0f 2 1630 1053\ncb11 4 1629 1053\ncb15 8 1631 1053\ncb1d a 2201 1053\ncb27 7 2204 1053\ncb2e 6 2205 1053\ncb34 6 2207 1053\ncb3a 2 2208 1053\ncb3c 4 2210 1053\ncb40 6 2212 1053\ncb46 2 2213 1053\ncb48 4 2215 1053\ncb4c 6 2217 1053\ncb52 7 2218 1053\ncb59 b 2224 1053\ncb64 6 2228 1053\ncb6a 11 2230 1053\ncb7b 11 2234 1053\ncb8c d 2236 1053\ncb99 f 2238 1053\ncba8 a 2263 1053\ncbb2 3 2267 1053\ncbb5 3 2268 1053\ncbb8 3 2269 1053\ncbbb 1a 2276 1053\ncbd5 7 2278 1053\ncbdc e 2282 1053\ncbea a 2283 1053\ncbf4 2 1690 1053\ncbf6 4 2279 1053\ncbfa 2 2285 1053\ncbfc d 2286 1053\ncc09 c 2290 1053\ncc15 11 2292 1053\ncc26 6 2297 1053\ncc2c 8 2298 1053\ncc34 16 2299 1053\ncc4a 7 1073 1053\ncc51 10 2310 1053\ncc61 10 2376 1053\ncc71 38 2377 1053\nFUNC cca9 154 10 _validate_param_reuseW\ncca9 3 606 1108\nccac 21 610 1108\ncccd 13 617 1108\ncce0 13 618 1108\nccf3 10 620 1108\ncd03 4a 629 1108\ncd4d 54 632 1108\ncda1 2 633 1108\ncda3 1a 639 1108\ncdbd f 645 1108\ncdcc 23 626 1108\ncdef c 614 1108\ncdfb 2 646 1108\nFUNC cdfd 25 4 write_char\ncdfd 0 2433 1108\ncdfd a 2434 1108\nce07 2 2437 1108\nce09 12 2440 1108\nce1b 3 2444 1108\nce1e 1 2447 1108\nce1f 2 2446 1108\nce21 1 2447 1108\nFUNC ce22 25 c write_multi_char\nce22 6 2498 1108\nce28 2 2501 1108\nce2a e 2500 1108\nce38 6 2501 1108\nce3e 7 2499 1108\nce45 2 2504 1108\nFUNC ce47 4f 4 write_string\nce47 0 2563 1108\nce47 12 2564 1108\nce59 6 2566 1108\nce5f 2 2567 1108\nce61 11 2570 1108\nce72 6 2571 1108\nce78 a 2573 1108\nce82 a 2574 1108\nce8c 9 2569 1108\nce95 1 2579 1108\nFUNC ce96 f60 10 _woutput_p_l\nce96 1b 975 1108\nceb1 20 1013 1108\nced1 28 2172 1108\ncef9 2c 1031 1108\ncf25 4 1036 1108\ncf29 3 1038 1108\ncf2c 3 1041 1108\ncf2f 3 1043 1108\ncf32 f 1046 1108\ncf41 44 1073 1108\ncf85 1a 1078 1108\ncf9f 11 1079 1108\ncfb0 16 1082 1108\ncfc6 6 1084 1108\ncfcc 1c 1087 1108\ncfe8 6 1089 1108\ncfee 16 1091 1108\nd004 7 1093 1108\nd00b 2 1095 1108\nd00d 7 1097 1108\nd014 6 1101 1108\nd01a c 1103 1108\nd026 7 1104 1108\nd02d f 1106 1108\nd03c 1d 1109 1108\nd059 8 1112 1108\nd061 5 1131 1108\nd066 3 1117 1108\nd069 7 1131 1108\nd070 9 1120 1108\nd079 b 1131 1108\nd084 24 1137 1108\nd0a8 5 1145 1108\nd0ad 2 1171 1108\nd0af 16 1173 1108\nd0c5 3 1174 1108\nd0c8 5 1175 1108\nd0cd 1f 1179 1108\nd0ec 7 1193 1108\nd0f3 5 1194 1108\nd0f8 7 1181 1108\nd0ff 5 1182 1108\nd104 7 1184 1108\nd10b 5 1185 1108\nd110 a 1190 1108\nd11a 5 1191 1108\nd11f 6 1187 1108\nd125 5 1196 1108\nd12a a 1200 1108\nd134 6 1203 1108\nd13a a 1206 1108\nd144 2 1209 1108\nd146 c 1211 1108\nd152 6 1212 1108\nd158 e 1214 1108\nd166 1c 1216 1108\nd182 8 1219 1108\nd18a 12 1221 1108\nd19c a 1274 1108\nd1a6 5 1275 1108\nd1ab c 1228 1108\nd1b7 b 1233 1108\nd1c2 7 1235 1108\nd1c9 3 1236 1108\nd1cc 5 1239 1108\nd1d1 10 1241 1108\nd1e1 5 1243 1108\nd1e6 4 1248 1108\nd1ea 5 1249 1108\nd1ef 6 1253 1108\nd1f5 6 1256 1108\nd1fb a 1259 1108\nd205 2 1262 1108\nd207 c 1264 1108\nd213 6 1265 1108\nd219 12 1267 1108\nd22b c 1280 1108\nd237 b 1284 1108\nd242 4 1285 1108\nd246 5 1287 1108\nd24b 22 1274 1108\nd26d 10 1289 1108\nd27d 5 1291 1108\nd282 1b 1295 1108\nd29d a 1362 1108\nd2a7 5 1363 1108\nd2ac 6 1301 1108\nd2b2 2 1303 1108\nd2b4 d 1304 1108\nd2c1 5 1306 1108\nd2c6 7 1308 1108\nd2cd 5 1310 1108\nd2d2 7 1358 1108\nd2d9 5 1359 1108\nd2de 10 1322 1108\nd2ee 3 1324 1108\nd2f1 12 1325 1108\nd303 d 1327 1108\nd310 3 1329 1108\nd313 d 1330 1108\nd320 5 1332 1108\nd325 24 1337 1108\nd349 4 1352 1108\nd34d 13 1166 1108\nd360 5 1167 1108\nd365 a 1342 1108\nd36f 5 1366 1108\nd374 36 1378 1108\nd3aa d 1716 1108\nd3b7 7 1724 1108\nd3be 14 1726 1108\nd3d2 9 1728 1108\nd3db 2a 1739 1108\nd405 b 1381 1108\nd410 9 1383 1108\nd419 b 1564 1108\nd424 7 1565 1108\nd42b d 1584 1108\nd438 b 1586 1108\nd443 a 1589 1108\nd44d 5 1592 1108\nd452 22 1378 1108\nd474 d 1394 1108\nd481 b 1397 1108\nd48c 2 1400 1108\nd48e 9 1402 1108\nd497 6 1404 1108\nd49d 24 1406 1108\nd4c1 5 1407 1108\nd4c6 d 1411 1108\nd4d3 c 1415 1108\nd4df 3 1420 1108\nd4e2 28 1430 1108\nd50a 7 1434 1108\nd511 2 1436 1108\nd513 7 1437 1108\nd51a 9 1439 1108\nd523 7 1440 1108\nd52a 5 1506 1108\nd52f 6 1520 1108\nd535 a 1523 1108\nd53f 2 1526 1108\nd541 9 1528 1108\nd54a 4 1530 1108\nd54e 6 1533 1108\nd554 c 1537 1108\nd560 b 1541 1108\nd56b 9 1546 1108\nd574 b 1548 1108\nd57f 7 1549 1108\nd586 5 1550 1108\nd58b 4 1551 1108\nd58f 5 1553 1108\nd594 8 1543 1108\nd59c 7 1544 1108\nd5a3 5 1557 1108\nd5a8 38 1378 1108\nd5e0 15 1908 1108\nd5f5 11 1910 1108\nd606 6 1665 1108\nd60c a 1668 1108\nd616 2 1671 1108\nd618 9 1673 1108\nd621 6 1675 1108\nd627 1f 1677 1108\nd646 5 1678 1108\nd64b c 1682 1108\nd657 d 1688 1108\nd664 9 1702 1108\nd66d 7 1703 1108\nd674 2 1704 1108\nd676 5 1706 1108\nd67b 7 1708 1108\nd682 5 1710 1108\nd687 7 1864 1108\nd68e 7 1869 1108\nd695 6 1910 1108\nd69b 9 1933 1108\nd6a4 a 1936 1108\nd6ae f 1939 1108\nd6bd 5 1942 1108\nd6c2 1a 1739 1108\nd6dc 21 1109 1108\nd6fd 17 1749 1108\nd714 9 1750 1108\nd71d 8 1751 1108\nd725 9 1752 1108\nd72e 5 1753 1108\nd733 3 1754 1108\nd736 a 1756 1108\nd740 f 1759 1108\nd74f 2 1760 1108\nd751 13 1765 1108\nd764 3 1767 1108\nd767 7 1806 1108\nd76e 9 1809 1108\nd777 2 1812 1108\nd779 a 1818 1108\nd783 6 1821 1108\nd789 16 1822 1108\nd79f 24 1828 1108\nd7c3 16 1838 1108\nd7d9 15 1840 1108\nd7ee b 1844 1108\nd7f9 15 1846 1108\nd80e 5 1852 1108\nd813 a 1853 1108\nd81d 4 1854 1108\nd821 1 1857 1108\nd822 5 1859 1108\nd827 7 1877 1108\nd82e 7 1887 1108\nd835 2 1888 1108\nd837 1a 1378 1108\nd851 7 1892 1108\nd858 14 1897 1108\nd86c 10 1900 1108\nd87c 3 1901 1108\nd87f 5 1903 1108\nd884 9 1944 1108\nd88d 28 1948 1108\nd8b5 5 1949 1108\nd8ba 7 1961 1108\nd8c1 4 1964 1108\nd8c5 6 1970 1108\nd8cb 9 1972 1108\nd8d4 28 1976 1108\nd8fc 5 1977 1108\nd901 c 1981 1108\nd90d 5 1987 1108\nd912 5 2019 1108\nd917 5 2020 1108\nd91c 6 2023 1108\nd922 b 2026 1108\nd92d 5 2029 1108\nd932 9 2031 1108\nd93b 4 2033 1108\nd93f 2 2036 1108\nd941 d 2040 1108\nd94e 5 2045 1108\nd953 6 2048 1108\nd959 b 2051 1108\nd964 5 2054 1108\nd969 9 2056 1108\nd972 4 2058 1108\nd976 2 2061 1108\nd978 d 2065 1108\nd985 2 2071 1108\nd987 5 2074 1108\nd98c 6 2077 1108\nd992 a 2080 1108\nd99c 2 2083 1108\nd99e 9 2085 1108\nd9a7 6 2087 1108\nd9ad 17 2089 1108\nd9c4 15 2114 1108\nd9d9 5 2115 1108\nd9de d 2094 1108\nd9eb 2 2099 1108\nd9ed 6 2102 1108\nd9f3 a 2105 1108\nd9fd 2 2108 1108\nd9ff 9 2110 1108\nda08 6 2112 1108\nda0e e 2119 1108\nda1c f 2128 1108\nda2b 7 2129 1108\nda32 c 2130 1108\nda3e c 2136 1108\nda4a 4 2142 1108\nda4e 6 2148 1108\nda54 7 2149 1108\nda5b 2 2150 1108\nda5d 1a 2114 1108\nda77 3 2151 1108\nda7a 10 2152 1108\nda8a 3 2153 1108\nda8d 7 2157 1108\nda94 3 2158 1108\nda97 6 2163 1108\nda9d 11 2165 1108\ndaae 12 2166 1108\ndac0 d 2168 1108\ndacd 3 2170 1108\ndad0 b 2173 1108\ndadb 8 2175 1108\ndae3 1 2176 1108\ndae4 20 2180 1108\ndb04 9 2181 1108\ndb0d 1 2182 1108\ndb0e 5 2185 1108\ndb13 9 1594 1108\ndb1c 9 1596 1108\ndb25 c 1603 1108\ndb31 c 1610 1108\ndb3d 4 1611 1108\ndb41 8 1612 1108\ndb49 11 1614 1108\ndb5a 13 1618 1108\ndb6d 1 1620 1108\ndb6e 9 1621 1108\ndb77 2 1622 1108\ndb79 19 1598 1108\ndb92 5 1625 1108\ndb97 8 1626 1108\ndb9f c 1628 1108\ndbab 6 1629 1108\ndbb1 2 1630 1108\ndbb3 4 1629 1108\ndbb7 8 1631 1108\ndbbf 10 2189 1108\ndbcf a 2201 1108\ndbd9 a 2204 1108\ndbe3 6 2205 1108\ndbe9 6 2207 1108\ndbef 2 2208 1108\ndbf1 4 2210 1108\ndbf5 6 2212 1108\ndbfb 2 2213 1108\ndbfd 4 2215 1108\ndc01 6 2217 1108\ndc07 7 2218 1108\ndc0e b 2224 1108\ndc19 9 2228 1108\ndc22 11 2230 1108\ndc33 11 2234 1108\ndc44 13 2236 1108\ndc57 f 2238 1108\ndc66 a 2263 1108\ndc70 3 2267 1108\ndc73 3 2268 1108\ndc76 3 2269 1108\ndc79 1a 2276 1108\ndc93 7 2278 1108\ndc9a e 2282 1108\ndca8 a 2283 1108\ndcb2 2 2310 1108\ndcb4 4 2279 1108\ndcb8 2 2285 1108\ndcba d 2286 1108\ndcc7 f 2290 1108\ndcd6 11 2292 1108\ndce7 6 2297 1108\ndced 8 2298 1108\ndcf5 4 2299 1108\ndcf9 1 2298 1108\ndcfa 12 1073 1108\ndd0c c 2310 1108\ndd18 c 2314 1108\ndd24 10 2319 1108\ndd34 16 2321 1108\ndd4a 2 2360 1108\ndd4c 9 2361 1108\ndd55 6 2362 1108\ndd5b 2 2344 1108\ndd5d 3 2345 1108\ndd60 2 2346 1108\ndd62 2 2324 1108\ndd64 6 2325 1108\ndd6a 9 2319 1108\ndd73 13 1043 1108\ndd86 17 1121 1108\ndd9d f 1818 1108\nddac 10 2376 1108\nddbc 3a 2377 1108\nFUNC ddf6 1f 0 _initp_misc_cfltcvt_tab\nddf6 2 54 4074\nddf8 8 56 4074\nde00 14 58 4074\nde14 1 60 4074\nFUNC de20 29 4 _ValidateImageBase\nde20 0 44 3159\nde20 b 50 3159\nde2b 2 52 3159\nde2d 1 68 3159\nde2e 5 55 3159\nde33 6 56 3159\nde39 2 58 3159\nde3b d 62 3159\nde48 1 68 3159\nFUNC de50 42 8 _FindPESection\nde50 0 92 3159\nde50 9 99 3159\nde59 19 108 3159\nde72 10 111 3159\nde82 a 108 3159\nde8c 5 123 3159\nde91 1 124 3159\nFUNC dea0 bb 4 _IsNonwritableInCurrentImage\ndea0 33 149 3159\nded3 7 156 3159\ndeda f 164 3159\ndee9 2 166 3159\ndeeb 8 174 3159\ndef3 e 175 3159\ndf01 2 176 3159\ndf03 2 178 3159\ndf05 12 185 3159\ndf17 12 195 3159\ndf29 17 187 3159\ndf40 9 193 3159\ndf49 12 195 3159\nFUNC df5b 19 4 _initp_misc_winsig\ndf5b 0 57 2785\ndf5b 9 58 2785\ndf64 5 59 2785\ndf69 5 60 2785\ndf6e 5 61 2785\ndf73 1 62 2785\nFUNC df74 9b 4 ctrlevent_capture\ndf74 c 89 2785\ndf80 9 94 2785\ndf89 3 95 2785\ndf8c 5 102 2785\ndf91 5 103 2785\ndf96 e 104 2785\ndfa4 7 105 2785\ndfab 2 107 2785\ndfad 5 108 2785\ndfb2 e 109 2785\ndfc0 7 110 2785\ndfc7 1 109 2785\ndfc8 9 113 2785\ndfd1 7 117 2785\ndfd8 c 120 2785\ndfe4 5 124 2785\ndfe9 4 128 2785\ndfed 2 120 2785\ndfef 8 121 2785\ndff7 6 130 2785\ndffd 7 131 2785\ne004 3 138 2785\ne007 8 139 2785\nFUNC e00f 34 4 siglookup\ne00f 0 634 2785\ne00f b 635 2785\ne01a 15 645 2785\ne02f f 649 2785\ne03e 2 653 2785\ne040 2 658 2785\ne042 1 659 2785\nFUNC e043 d 0 __get_sigabrt\ne043 0 676 2785\ne043 c 677 2785\ne04f 1 678 2785\nFUNC e050 9 0 __fpecode\ne050 0 699 2785\ne050 8 700 2785\ne058 1 701 2785\nFUNC e059 9 0 __pxcptinfoptrs\ne059 0 721 2785\ne059 8 722 2785\ne061 1 723 2785\nFUNC e062 23d 8 signal\ne062 c 219 2785\ne06e 4 224 2785\ne072 3 230 2785\ne075 3 244 2785\ne078 12 230 2785\ne08a 2f 244 2785\ne0b9 13 327 2785\ne0cc 7 334 2785\ne0d3 8 335 2785\ne0db a 342 2785\ne0e5 17 346 2785\ne0fc 10 352 2785\ne10c 13 367 2785\ne11f 3 380 2785\ne122 e 382 2785\ne130 3 395 2785\ne133 17 401 2785\ne14a 5 390 2785\ne14f 5 401 2785\ne154 8 246 2785\ne15c 4 247 2785\ne160 12 254 2785\ne172 14 257 2785\ne186 6 259 2785\ne18c 2 261 2785\ne18e f 263 2785\ne19d a 264 2785\ne1a7 18 268 2785\ne1bf f 288 2785\ne1ce 4 289 2785\ne1d2 b 291 2785\ne1dd 2 293 2785\ne1df f 279 2785\ne1ee 4 280 2785\ne1f2 b 282 2785\ne1fd 2 284 2785\ne1ff f 296 2785\ne20e 4 297 2785\ne212 b 299 2785\ne21d 2 301 2785\ne21f f 271 2785\ne22e 4 272 2785\ne232 c 274 2785\ne23e c 305 2785\ne24a 9 309 2785\ne253 4 407 2785\ne257 3 305 2785\ne25a 9 306 2785\ne263 19 410 2785\ne27c 1a 419 2785\ne296 3 417 2785\ne299 6 423 2785\nFUNC e29f 1b0 4 raise\ne29f c 452 2785\ne2ab 5 459 2785\ne2b0 3 460 2785\ne2b3 1f 462 2785\ne2d2 a 488 2785\ne2dc 4 489 2785\ne2e0 8 490 2785\ne2e8 a 465 2785\ne2f2 2 467 2785\ne2f4 11 492 2785\ne305 2 493 2785\ne307 f 462 2785\ne316 1c 500 2785\ne332 a 476 2785\ne33c 2 478 2785\ne33e a 470 2785\ne348 2 472 2785\ne34a a 481 2785\ne354 7 482 2785\ne35b a 502 2785\ne365 2 510 2785\ne367 4 509 2785\ne36b 6 510 2785\ne371 5 515 2785\ne376 7 520 2785\ne37d 5 527 2785\ne382 7 528 2785\ne389 5 530 2785\ne38e f 543 2785\ne39d 6 544 2785\ne3a3 3 545 2785\ne3a6 5 551 2785\ne3ab 6 552 2785\ne3b1 7 553 2785\ne3b8 5 561 2785\ne3bd 1c 568 2785\ne3d9 d 571 2785\ne3e6 5 568 2785\ne3eb 7 574 2785\ne3f2 c 577 2785\ne3fe 5 582 2785\ne403 8 588 2785\ne40b 2 589 2785\ne40d 6 577 2785\ne413 6 578 2785\ne419 9 579 2785\ne422 5 590 2785\ne427 f 597 2785\ne436 6 598 2785\ne43c 5 603 2785\ne441 6 604 2785\ne447 2 607 2785\ne449 6 608 2785\nFUNC e44f a 4 _initp_misc_rand_s\ne44f 0 58 3075\ne44f 9 59 3075\ne458 1 60 3075\nFUNC e459 104 4 rand_s\ne459 3 66 3075\ne45c b 67 3075\ne467 2b 68 3075\ne492 c 71 3075\ne49e d 77 3075\ne4ab 4 78 3075\ne4af 1e 80 3075\ne4cd e 83 3075\ne4db 4 84 3075\ne4df 2f 86 3075\ne50e 9 88 3075\ne517 5 89 3075\ne51c 16 94 3075\ne532 7 103 3075\ne539 9 107 3075\ne542 b 109 3075\ne54d 9 110 3075\ne556 6 112 3075\ne55c 1 113 3075\nFUNC e55d 15a 14 __getlocaleinfo\ne55d 1d 70 3523\ne57a 7 76 3523\ne581 87 109 3523\ne608 13 103 3523\ne61b 5 114 3523\ne620 7 115 3523\ne627 3 141 3523\ne62a 12 142 3523\ne63c 20 106 3523\ne65c 5 108 3523\ne661 7 109 3523\ne668 4 111 3523\ne66c 5 118 3523\ne671 1a 126 3523\ne68b 2 127 3523\ne68d 2 129 3523\ne68f 10 134 3523\ne69f 16 135 3523\ne6b5 2 139 3523\nFUNC e6b7 a 4 _initp_misc_purevirt\ne6b7 0 166 3523\ne6b7 9 167 3523\ne6c0 1 168 3523\nFUNC e6c1 a 4 _initp_misc_initcrit\ne6c1 0 47 3609\ne6c1 9 48 3609\ne6ca 1 49 3609\nFUNC e6cb 10 8 __crtInitCritSecNoSpinCount\ne6cb 0 76 3609\ne6cb a 77 3609\ne6d5 3 78 3609\ne6d8 3 79 3609\nFUNC e6db c5 8 __crtInitCritSecAndSpinCount\ne6db c 109 3609\ne6e7 5 111 3609\ne6ec e 112 3609\ne6fa 4 114 3609\ne6fe 1b 120 3609\ne719 4 121 3609\ne71d 2 129 3609\ne71f b 130 3609\ne72a 4 131 3609\ne72e e 134 3609\ne73c 4 136 3609\ne740 5 149 3609\ne745 c 152 3609\ne751 3 155 3609\ne754 b 161 3609\ne75f 2 162 3609\ne761 1a 163 3609\ne77b 9 170 3609\ne784 8 171 3609\ne78c 4 173 3609\ne790 7 174 3609\ne797 3 176 3609\ne79a 6 177 3609\nFUNC e7a0 5e 4 _isatty\ne7a0 0 37 4912\ne7a0 16 44 4912\ne7b6 2 59 4912\ne7b8 29 45 4912\ne7e1 1 59 4912\ne7e2 1b 58 4912\ne7fd 1 59 4912\nFUNC e7fe 2f 0 CPtoLCID\ne7fe 0 329 4615\ne7fe 14 330 4615\ne812 2 345 4615\ne814 1 346 4615\ne815 5 342 4615\ne81a 1 346 4615\ne81b 5 339 4615\ne820 1 346 4615\ne821 5 336 4615\ne826 1 346 4615\ne827 5 333 4615\ne82c 1 346 4615\nFUNC e82d 55 0 setSBCS\ne82d 4 363 4615\ne831 14 368 4615\ne845 3 371 4615\ne848 3 374 4615\ne84b 3 376 4615\ne84e 8 379 4615\ne856 a 381 4615\ne860 9 382 4615\ne869 b 384 4615\ne874 d 385 4615\ne881 1 386 4615\nFUNC e882 18a 0 setSBUpLow\ne882 1d 402 4615\ne89f f 412 4615\ne8ae d 415 4615\ne8bb c 416 4615\ne8c7 e 420 4615\ne8d5 3 419 4615\ne8d8 28 421 4615\ne900 1d 427 4615\ne91d 23 432 4615\ne940 25 437 4615\ne965 2 442 4615\ne967 a 443 4615\ne971 5 445 4615\ne976 9 446 4615\ne97f 5 448 4615\ne984 5 450 4615\ne989 e 451 4615\ne997 2 453 4615\ne999 8 454 4615\ne9a1 5 442 4615\ne9a6 8 456 4615\ne9ae 2c 472 4615\ne9da 5 466 4615\ne9df 5 468 4615\ne9e4 7 469 4615\ne9eb 2 471 4615\ne9ed 3 472 4615\ne9f0 5 460 4615\ne9f5 17 474 4615\nFUNC ea0c a4 0 __updatetmbcinfo\nea0c c 496 4615\nea18 7 499 4615\nea1f 10 500 4615\nea2f 3 533 4615\nea32 4 536 4615\nea36 8 538 4615\nea3e 2 541 4615\nea40 6 542 4615\nea46 8 501 4615\nea4e 4 503 4615\nea52 e 506 4615\nea60 17 512 4615\nea77 7 517 4615\nea7e 11 524 4615\nea8f 7 525 4615\nea96 11 528 4615\neaa7 9 530 4615\nFUNC eab0 7a 0 getSystemCP\neab0 7 282 4615\neab7 b 284 4615\neac2 b 289 4615\neacd a 291 4615\nead7 14 292 4615\neaeb 5 295 4615\neaf0 a 297 4615\neafa 8 298 4615\neb02 5 302 4615\neb07 12 305 4615\neb19 f 308 4615\neb28 2 309 4615\nFUNC eb2a 1d9 8 _setmbcp_nolock\neb2a 15 686 4615\neb3f b 693 4615\neb4a 9 696 4615\neb53 7 698 4615\neb5a 7 699 4615\neb61 3 703 4615\neb64 2 705 4615\neb66 19 708 4615\neb7f 2a 743 4615\neba9 13 751 4615\nebbc f 756 4615\nebcb 15 761 4615\nebe0 17 764 4615\nebf7 c 766 4615\nec03 f 712 4615\nec12 15 715 4615\nec27 9 720 4615\nec30 8 723 4615\nec38 12 724 4615\nec4a 9 723 4615\nec53 5 720 4615\nec58 12 715 4615\nec6a 20 731 4615\nec8a d 733 4615\nec97 7 736 4615\nec9e 5 737 4615\neca3 6 767 4615\neca9 10 766 4615\necb9 8 771 4615\necc1 7 772 4615\necc8 b 775 4615\necd3 3 778 4615\necd6 2 780 4615\necd8 3 782 4615\necdb 8 785 4615\nece3 2 789 4615\nece5 6 794 4615\neceb 6 797 4615\necf1 3 746 4615\necf4 f 802 4615\nFUNC ed03 3c 0 _getmbcp\ned03 6 819 4615\ned09 a 821 4615\ned13 9 822 4615\ned1c 10 823 4615\ned2c 2 826 4615\ned2e f 825 4615\ned3d 2 826 4615\nFUNC ed3f 19a 4 _setmbcp\ned3f c 574 4615\ned4b 4 575 4615\ned4f a 579 4615\ned59 5 581 4615\ned5e 3 582 4615\ned61 b 585 4615\ned6c 9 587 4615\ned75 d 593 4615\ned82 8 595 4615\ned8a c 597 4615\ned96 3 607 4615\ned99 16 612 4615\nedaf 1a 614 4615\nedc9 7 615 4615\nedd0 3 619 4615\nedd3 9 620 4615\neddc 17 622 4615\nedf3 8 624 4615\nedfb 4 625 4615\nedff 8 630 4615\nee07 8 631 4615\nee0f 8 632 4615\nee17 a 633 4615\nee21 d 634 4615\nee2e 3 633 4615\nee31 c 635 4615\nee3d a 636 4615\nee47 3 635 4615\nee4a c 637 4615\nee56 d 638 4615\nee63 3 637 4615\nee66 1c 640 4615\nee82 7 641 4615\nee89 6 645 4615\nee8f 3 646 4615\nee92 e 648 4615\neea0 9 650 4615\neea9 2 653 4615\neeab 5 654 4615\neeb0 8 660 4615\neeb8 7 661 4615\neebf b 662 4615\neeca 2 668 4615\neecc 4 673 4615\need0 3 682 4615\need3 6 683 4615\nFUNC eed9 1e 0 __initmbctable\need9 0 843 4615\need9 9 853 4615\neee2 8 854 4615\neeea a 855 4615\neef4 2 860 4615\neef6 1 861 4615\nFUNC eef7 6 0 ___setlc_active_func\neef7 0 90 2995\neef7 5 91 2995\neefc 1 92 2995\nFUNC eefd 6 0 ___unguarded_readlc_active_add_func\neefd 0 104 2995\neefd 5 105 2995\nef02 1 106 2995\nFUNC ef03 140 4 __freetlocinfo\nef03 3 144 2995\nef06 26 152 2995\nef2c e 155 2995\nef3a 6 157 2995\nef40 d 158 2995\nef4d e 162 2995\nef5b 6 164 2995\nef61 d 165 2995\nef6e b 168 2995\nef79 d 169 2995\nef86 e 176 2995\nef94 11 178 2995\nefa5 13 179 2995\nefb8 e 180 2995\nefc6 e 181 2995\nefd4 17 188 2995\nefeb 6 190 2995\neff1 9 191 2995\neffa 6 194 2995\nf000 13 197 2995\nf013 7 199 2995\nf01a 10 205 2995\nf02a d 207 2995\nf037 b 214 2995\nf042 1 215 2995\nFUNC f043 86 4 __addlocaleref\nf043 3 225 2995\nf046 e 227 2995\nf054 a 228 2995\nf05e 3 229 2995\nf061 a 231 2995\nf06b 3 232 2995\nf06e a 234 2995\nf078 3 235 2995\nf07b a 237 2995\nf085 3 238 2995\nf088 6 240 2995\nf08e f 242 2995\nf09d 3 243 2995\nf0a0 d 245 2995\nf0ad 9 246 2995\nf0b6 12 248 2995\nf0c8 1 249 2995\nFUNC f0c9 8c 4 __removelocaleref\nf0c9 1 259 2995\nf0ca b 261 2995\nf0d5 9 263 2995\nf0de a 265 2995\nf0e8 3 266 2995\nf0eb a 268 2995\nf0f5 3 269 2995\nf0f8 a 271 2995\nf102 3 272 2995\nf105 a 274 2995\nf10f 3 275 2995\nf112 6 277 2995\nf118 f 279 2995\nf127 3 280 2995\nf12a d 282 2995\nf137 9 283 2995\nf140 11 285 2995\nf151 3 287 2995\nf154 1 288 2995\nFUNC f155 24 0 _copytlocinfo_nolock\nf155 3 302 2995\nf158 d 303 2995\nf165 7 304 2995\nf16c 3 305 2995\nf16f 9 306 2995\nf178 1 308 2995\nFUNC f179 3e 0 _updatetlocinfoEx_nolock\nf179 0 321 2995\nf179 9 324 2995\nf182 2 326 2995\nf184 4 327 2995\nf188 8 334 2995\nf190 5 339 2995\nf195 6 341 2995\nf19b e 350 2995\nf1a9 7 351 2995\nf1b0 3 355 2995\nf1b3 1 356 2995\nf1b4 2 325 2995\nf1b6 1 356 2995\nFUNC f1b7 76 0 __updatetlocinfo\nf1b7 c 382 2995\nf1c3 7 384 2995\nf1ca 10 386 2995\nf1da 8 397 2995\nf1e2 4 399 2995\nf1e6 8 401 2995\nf1ee 2 404 2995\nf1f0 6 405 2995\nf1f6 8 387 2995\nf1fe 4 388 2995\nf202 11 390 2995\nf213 e 392 2995\nf221 8 394 2995\nf229 4 395 2995\nFUNC f22d 66 4 _configthreadlocale\nf22d 2 420 2995\nf22f 5 434 2995\nf234 10 435 2995\nf244 19 437 2995\nf25d 1d 456 2995\nf27a 3 444 2995\nf27d 2 445 2995\nf27f 6 440 2995\nf285 2 441 2995\nf287 7 452 2995\nf28e 4 460 2995\nf292 1 462 2995\nFUNC f293 53 0 sync_legacy_variables_lk\nf293 0 489 2995\nf293 e 490 2995\nf2a1 9 491 2995\nf2aa c 492 2995\nf2b6 c 493 2995\nf2c2 c 494 2995\nf2ce c 495 2995\nf2da b 496 2995\nf2e5 1 497 2995\nFUNC f2e6 96 4 _free_locale\nf2e6 c 517 2995\nf2f2 9 518 2995\nf2fb 1c 522 2995\nf317 7 524 2995\nf31e 4 526 2995\nf322 8 534 2995\nf32a 3 535 2995\nf32d 8 537 2995\nf335 11 540 2995\nf346 7 541 2995\nf34d c 543 2995\nf359 7 552 2995\nf360 3 553 2995\nf363 7 554 2995\nf36a 6 556 2995\nf370 3 543 2995\nf373 9 545 2995\nFUNC f37c 5 4 __free_locale\nf37c 0 562 2995\nf37c 5 563 2995\nFUNC f381 88 0 _get_current_locale\nf381 c 687 2995\nf38d 7 689 2995\nf394 14 691 2995\nf3a8 b 693 2995\nf3b3 4 694 2995\nf3b7 5 697 2995\nf3bc 5 698 2995\nf3c1 5 706 2995\nf3c6 6 707 2995\nf3cc 8 708 2995\nf3d4 4 709 2995\nf3d8 8 710 2995\nf3e0 c 712 2995\nf3ec 9 715 2995\nf3f5 2 717 2995\nf3f7 6 718 2995\nf3fd 3 712 2995\nf400 9 713 2995\nFUNC f409 5 0 __get_current_locale\nf409 0 722 2995\nf409 5 723 2995\nFUNC f40e 3 4 __init_dummy\nf40e 0 1283 2995\nf40e 2 1284 2995\nf410 1 1285 2995\nFUNC f411 3e c _strcats\nf411 2 1288 2995\nf413 f 1294 2995\nf422 26 1296 2995\nf448 6 1294 2995\nf44e 1 1299 2995\nFUNC f44f 129 8 __lc_strtolc\nf44f 6 1302 2995\nf455 11 1307 2995\nf466 c 1309 2995\nf472 7 1310 2995\nf479 b 1313 2995\nf484 25 1315 2995\nf4a9 6 1317 2995\nf4af 2 1318 2995\nf4b1 15 1323 2995\nf4c6 1d 1328 2995\nf4e3 9 1329 2995\nf4ec 10 1331 2995\nf4fc c 1332 2995\nf508 14 1334 2995\nf51c 28 1335 2995\nf544 9 1340 2995\nf54d b 1348 2995\nf558 18 1350 2995\nf570 6 1338 2995\nf576 2 1353 2995\nFUNC f578 6b c __lc_lctostr\nf578 5 1356 2995\nf57d 25 1357 2995\nf5a2 7 1358 2995\nf5a9 16 1359 2995\nf5bf c 1360 2995\nf5cb 16 1361 2995\nf5e1 2 1362 2995\nFUNC f5e3 171 0 _setlocale_get_all\nf5e3 4 1124 2995\nf5e7 3 1126 2995\nf5ea 1d 1134 2995\nf607 3 1137 2995\nf60a 3 1139 2995\nf60d 2 1140 2995\nf60f 2f 1143 2995\nf63e 26 1146 2995\nf664 10 1147 2995\nf674 5 1148 2995\nf679 4 1141 2995\nf67d 2f 1143 2995\nf6ac a 1144 2995\nf6b6 8 1152 2995\nf6be 14 1154 2995\nf6d2 9 1156 2995\nf6db e 1159 2995\nf6e9 9 1161 2995\nf6f2 7 1165 2995\nf6f9 7 1166 2995\nf700 9 1168 2995\nf709 15 1170 2995\nf71e 9 1172 2995\nf727 e 1175 2995\nf735 9 1177 2995\nf73e 12 1183 2995\nf750 4 1187 2995\nFUNC f754 1d4 18 _expandlocale\nf754 15 1198 2995\nf769 41 1230 2995\nf7aa 14 1211 2995\nf7be b 1216 2995\nf7c9 26 1219 2995\nf7ef 4 1220 2995\nf7f3 3 1222 2995\nf7f6 4 1223 2995\nf7fa 4 1224 2995\nf7fe 7 1226 2995\nf805 2 1228 2995\nf807 8 1230 2995\nf80f 6 1234 2995\nf815 2f 1236 2995\nf844 4 1241 2995\nf848 e 1243 2995\nf856 6 1244 2995\nf85c 10 1246 2995\nf86c 6 1247 2995\nf872 9 1251 2995\nf87b 10 1253 2995\nf88b a 1255 2995\nf895 2 1260 2995\nf897 8 1263 2995\nf89f 26 1267 2995\nf8c5 5 1271 2995\nf8ca e 1272 2995\nf8d8 5 1273 2995\nf8dd 10 1274 2995\nf8ed 22 1276 2995\nf90f 5 1277 2995\nf914 2 1212 2995\nf916 12 1278 2995\nFUNC f928 2f6 4 _setlocale_set_cat\nf928 19 980 2995\nf941 5 993 2995\nf946 2f 998 2995\nf975 7 1000 2995\nf97c 19 1002 2995\nf995 6 1004 2995\nf99b c 1007 2995\nf9a7 16 1008 2995\nf9bd 2 1010 2995\nf9bf 3 1013 2995\nf9c2 d 1014 2995\nf9cf 2c 1015 2995\nf9fb 3 1016 2995\nf9fe 39 1019 2995\nfa37 6 1020 2995\nfa3d 15 1021 2995\nfa52 17 1022 2995\nfa69 a 1029 2995\nfa73 6 1031 2995\nfa79 18 1037 2995\nfa91 7 1039 2995\nfa98 8 1053 2995\nfaa0 14 1054 2995\nfab4 18 1055 2995\nfacc 2 1039 2995\nface a 1044 2995\nfad8 d 1046 2995\nfae5 b 1047 2995\nfaf0 9 1058 2995\nfaf9 26 1066 2995\nfb1f 2 1069 2995\nfb21 10 1071 2995\nfb31 22 1072 2995\nfb53 2 1081 2995\nfb55 4 1082 2995\nfb59 5 1083 2995\nfb5e 9 1085 2995\nfb67 6 1088 2995\nfb6d 9 1089 2995\nfb76 12 1091 2995\nfb88 6 1094 2995\nfb8e e 1095 2995\nfb9c f 1096 2995\nfbab 9 1097 2995\nfbb4 5 1099 2995\nfbb9 24 1106 2995\nfbdd 7 1109 2995\nfbe4 8 1110 2995\nfbec 6 1111 2995\nfbf2 18 1116 2995\nfc0a 3 1118 2995\nfc0d 11 1119 2995\nFUNC fc1e 1ce 4 _setlocale_nolock\nfc1e 1a 873 2995\nfc38 7 877 2995\nfc3f 5 904 2995\nfc44 17 880 2995\nfc5b 5 882 2995\nfc60 12 888 2995\nfc72 1d 890 2995\nfc8f 2 894 2995\nfc91 d 898 2995\nfc9e 1e 900 2995\nfcbc 11 904 2995\nfccd 1d 907 2995\nfcea e 904 2995\nfcf8 1b 913 2995\nfd13 6 916 2995\nfd19 24 918 2995\nfd3d 18 922 2995\nfd55 3 923 2995\nfd58 7 925 2995\nfd5f 1 926 2995\nfd60 9 928 2995\nfd69 c 930 2995\nfd75 4 901 2995\nfd79 19 935 2995\nfd92 3 937 2995\nfd95 4 939 2995\nfd99 11 941 2995\nfdaa c 943 2995\nfdb6 2 947 2995\nfdb8 3 949 2995\nfdbb 2 952 2995\nfdbd 3 953 2995\nfdc0 9 937 2995\nfdc9 5 956 2995\nfdce 2 961 2995\nfdd0 3 962 2995\nfdd3 2 965 2995\nfdd5 5 966 2995\nfdda 12 972 2995\nFUNC fdec f3 8 _create_locale\nfdec 0 605 2995\nfdec 10 609 2995\nfdfc 13 612 2995\nfe0f b 614 2995\nfe1a 4 610 2995\nfe1e c 658 2995\nfe2a 8 617 2995\nfe32 7 619 2995\nfe39 2 621 2995\nfe3b 14 623 2995\nfe4f 7 625 2995\nfe56 7 626 2995\nfe5d 2 628 2995\nfe5f c 630 2995\nfe6b 14 632 2995\nfe7f 7 634 2995\nfe86 7 635 2995\nfe8d 9 637 2995\nfe96 2 640 2995\nfe98 13 642 2995\nfeab 8 644 2995\nfeb3 7 645 2995\nfeba 7 646 2995\nfec1 9 647 2995\nfeca 2 648 2995\nfecc 2 650 2995\nfece 5 652 2995\nfed3 5 653 2995\nfed8 7 657 2995\nFUNC fedf 5 8 __create_locale\nfedf 0 665 2995\nfedf 5 666 2995\nFUNC fee4 170 8 setlocale\nfee4 c 791 2995\nfef0 5 792 2995\nfef5 25 797 2995\nff1a a 799 2995\nff24 5 801 2995\nff29 4 806 2995\nff2d 3 807 2995\nff30 1b 808 2995\nff4b 8 818 2995\nff53 7 819 2995\nff5a a 820 2995\nff64 8 822 2995\nff6c 19 826 2995\nff85 18 834 2995\nff9d a 836 2995\nffa7 8 839 2995\nffaf 7 840 2995\nffb6 a 841 2995\nffc0 7 842 2995\nffc7 f 846 2995\nffd6 c 847 2995\nffe2 18 849 2995\nfffa 5 850 2995\nffff b 852 2995\n1000a 8 822 2995\n10012 9 823 2995\n1001b 3 852 2995\n1001e 9 853 2995\n10027 2 855 2995\n10029 6 856 2995\n1002f 8 857 2995\n10037 c 860 2995\n10043 3 865 2995\n10046 6 866 2995\n1004c 3 860 2995\n1004f 5 862 2995\nFUNC 10054 15f 14 _wctomb_s_l\n10054 8 56 6128\n1005c 11 57 6128\n1006d 7 60 6128\n10074 2 62 6128\n10076 4 64 6128\n1007a 7 67 6128\n10081 3 69 6128\n10084 23 74 6128\n100a7 b 77 6128\n100b2 c 79 6128\n100be a 81 6128\n100c8 8 83 6128\n100d0 b 85 6128\n100db b 125 6128\n100e6 13 126 6128\n100f9 5 136 6128\n100fe 4 91 6128\n10102 2c 93 6128\n1012e 2 94 6128\n10130 7 96 6128\n10137 6 98 6128\n1013d 15 100 6128\n10152 27 115 6128\n10179 7 129 6128\n10180 2 131 6128\n10182 2 133 6128\n10184 f 117 6128\n10193 10 119 6128\n101a3 b 121 6128\n101ae 5 123 6128\nFUNC 101b3 1b 10 wctomb_s\n101b3 0 144 6128\n101b3 1a 145 6128\n101cd 1 146 6128\nFUNC 101ce 4f c _wctomb_l\n101ce 6 178 6128\n101d4 f 181 6128\n101e3 1f 183 6128\n10202 19 184 6128\n1021b 2 185 6128\nFUNC 1021d 30 8 wctomb\n1021d 4 191 6128\n10221 4 192 6128\n10225 1a 195 6128\n1023f 7 196 6128\n10246 2 197 6128\n10248 3 196 6128\n1024b 2 197 6128\nFUNC 1024d 36 8 _isleadbyte_l\n1024d 6 55 6490\n10253 b 56 6490\n1025e 23 57 6490\n10281 2 58 6490\nFUNC 10283 e 4 isleadbyte\n10283 0 63 6490\n10283 d 64 6490\n10290 1 65 6490\nFUNC 10291 16 8 _iswalpha_l\n10291 0 71 6490\n10291 15 72 6490\n102a6 1 73 6490\nFUNC 102a7 11 4 iswalpha\n102a7 0 78 6490\n102a7 10 79 6490\n102b7 1 80 6490\nFUNC 102b8 13 8 _iswupper_l\n102b8 0 86 6490\n102b8 12 87 6490\n102ca 1 88 6490\nFUNC 102cb e 4 iswupper\n102cb 0 93 6490\n102cb d 94 6490\n102d8 1 95 6490\nFUNC 102d9 13 8 _iswlower_l\n102d9 0 101 6490\n102d9 12 102 6490\n102eb 1 103 6490\nFUNC 102ec e 4 iswlower\n102ec 0 108 6490\n102ec d 109 6490\n102f9 1 110 6490\nFUNC 102fa 13 8 _iswdigit_l\n102fa 0 116 6490\n102fa 12 117 6490\n1030c 1 118 6490\nFUNC 1030d e 4 iswdigit\n1030d 0 123 6490\n1030d d 124 6490\n1031a 1 125 6490\nFUNC 1031b 16 8 _iswxdigit_l\n1031b 0 131 6490\n1031b 15 132 6490\n10330 1 133 6490\nFUNC 10331 11 4 iswxdigit\n10331 0 138 6490\n10331 10 139 6490\n10341 1 140 6490\nFUNC 10342 13 8 _iswspace_l\n10342 0 146 6490\n10342 12 147 6490\n10354 1 148 6490\nFUNC 10355 e 4 iswspace\n10355 0 153 6490\n10355 d 154 6490\n10362 1 155 6490\nFUNC 10363 13 8 _iswpunct_l\n10363 0 161 6490\n10363 12 162 6490\n10375 1 163 6490\nFUNC 10376 e 4 iswpunct\n10376 0 168 6490\n10376 d 169 6490\n10383 1 170 6490\nFUNC 10384 16 8 _iswalnum_l\n10384 0 176 6490\n10384 15 177 6490\n10399 1 178 6490\nFUNC 1039a 11 4 iswalnum\n1039a 0 183 6490\n1039a 10 184 6490\n103aa 1 185 6490\nFUNC 103ab 16 8 _iswprint_l\n103ab 0 191 6490\n103ab 15 192 6490\n103c0 1 193 6490\nFUNC 103c1 11 4 iswprint\n103c1 0 198 6490\n103c1 10 199 6490\n103d1 1 200 6490\nFUNC 103d2 16 8 _iswgraph_l\n103d2 0 206 6490\n103d2 15 207 6490\n103e7 1 208 6490\nFUNC 103e8 11 4 iswgraph\n103e8 0 213 6490\n103e8 10 214 6490\n103f8 1 215 6490\nFUNC 103f9 13 8 _iswcntrl_l\n103f9 0 221 6490\n103f9 12 222 6490\n1040b 1 223 6490\nFUNC 1040c e 4 iswcntrl\n1040c 0 228 6490\n1040c d 229 6490\n10419 1 230 6490\nFUNC 1041a c 4 iswascii\n1041a 0 235 6490\n1041a b 236 6490\n10425 1 237 6490\nFUNC 10426 26 8 _iswcsym_l\n10426 0 243 6490\n10426 21 244 6490\n10447 1 245 6490\n10448 3 244 6490\n1044b 1 245 6490\nFUNC 1044c 21 4 __iswcsym\n1044c 0 250 6490\n1044c 1c 251 6490\n10468 1 252 6490\n10469 3 251 6490\n1046c 1 252 6490\nFUNC 1046d 26 8 _iswcsymf_l\n1046d 0 258 6490\n1046d 21 259 6490\n1048e 1 260 6490\n1048f 3 259 6490\n10492 1 260 6490\nFUNC 10493 21 4 __iswcsymf\n10493 0 265 6490\n10493 1c 266 6490\n104af 1 267 6490\n104b0 3 266 6490\n104b3 1 267 6490\nFUNC 104c0 95 0 _aulldvrm\n104c0 0 45 5113\n104c0 1 47 5113\n104c1 4 79 5113\n104c5 2 80 5113\n104c7 2 81 5113\n104c9 4 82 5113\n104cd 4 83 5113\n104d1 2 84 5113\n104d3 2 85 5113\n104d5 2 86 5113\n104d7 4 87 5113\n104db 2 88 5113\n104dd 2 89 5113\n104df 2 94 5113\n104e1 4 95 5113\n104e5 2 96 5113\n104e7 2 97 5113\n104e9 4 98 5113\n104ed 2 99 5113\n104ef 2 100 5113\n104f1 2 107 5113\n104f3 4 108 5113\n104f7 4 109 5113\n104fb 4 110 5113\n104ff 2 112 5113\n10501 2 113 5113\n10503 2 114 5113\n10505 2 115 5113\n10507 2 116 5113\n10509 2 117 5113\n1050b 2 118 5113\n1050d 2 119 5113\n1050f 4 128 5113\n10513 2 129 5113\n10515 4 130 5113\n10519 2 131 5113\n1051b 2 132 5113\n1051d 2 133 5113\n1051f 4 141 5113\n10523 2 142 5113\n10525 2 143 5113\n10527 4 144 5113\n1052b 2 145 5113\n1052d 1 147 5113\n1052e 4 148 5113\n10532 4 149 5113\n10536 2 151 5113\n10538 4 160 5113\n1053c 4 161 5113\n10540 2 162 5113\n10542 2 163 5113\n10544 3 164 5113\n10547 2 169 5113\n10549 2 170 5113\n1054b 2 171 5113\n1054d 2 172 5113\n1054f 2 173 5113\n10551 1 179 5113\n10552 3 181 5113\nFUNC 10558 90 0 _local_unwind4\nFUNC 105e8 46 0 _unwind_handler4\nFUNC 1062e 1c 4 _seh_longjmp_unwind4\nFUNC 1064a 17 0 _EH4_CallFilterFunc\nFUNC 10661 19 0 _EH4_TransferToHandler\nFUNC 1067a 1a 0 _EH4_GlobalUnwind\nFUNC 10694 17 8 _EH4_LocalUnwind\nFUNC 106ab 33 0 write_char\n106ab 0 2433 1218\n106ab a 2434 1218\n106b5 2 2437 1218\n106b7 21 2442 1218\n106d8 2 2444 1218\n106da 1 2447 1218\n106db 2 2446 1218\n106dd 1 2447 1218\nFUNC 106de 24 c write_multi_char\n106de 6 2498 1218\n106e4 2 2501 1218\n106e6 e 2500 1218\n106f4 5 2501 1218\n106f9 7 2499 1218\n10700 2 2504 1218\nFUNC 10702 4a 4 write_string\n10702 0 2563 1218\n10702 12 2564 1218\n10714 6 2566 1218\n1071a 2 2567 1218\n1071c e 2570 1218\n1072a 5 2571 1218\n1072f a 2573 1218\n10739 9 2574 1218\n10742 9 2569 1218\n1074b 1 2579 1218\nFUNC 1074c 9b0 10 _output_s_l\n1074c 1b 975 1218\n10767 45 1036 1218\n107ac 2d 1031 1218\n107d9 b1 1033 1218\n1088a 8 1036 1218\n10892 28 1073 1218\n108ba 17 1078 1218\n108d1 e 1079 1218\n108df 11 1124 1218\n108f0 12 1131 1218\n10902 2 1171 1218\n10904 13 1173 1218\n10917 3 1174 1218\n1091a 5 1175 1218\n1091f 1e 1179 1218\n1093d 3 1193 1218\n10940 5 1194 1218\n10945 4 1181 1218\n10949 5 1182 1218\n1094e 4 1184 1218\n10952 5 1185 1218\n10957 7 1190 1218\n1095e 5 1191 1218\n10963 4 1187 1218\n10967 5 1196 1218\n1096c 5 1200 1218\n10971 9 1206 1218\n1097a b 1233 1218\n10985 4 1235 1218\n10989 3 1236 1218\n1098c 5 1239 1218\n10991 10 1241 1218\n109a1 5 1243 1218\n109a6 4 1248 1218\n109aa 5 1249 1218\n109af 5 1253 1218\n109b4 9 1259 1218\n109bd b 1284 1218\n109c8 4 1285 1218\n109cc 5 1287 1218\n109d1 10 1289 1218\n109e1 5 1291 1218\n109e6 18 1295 1218\n109fe 7 1362 1218\n10a05 5 1363 1218\n10a0a 5 1301 1218\n10a0f 1 1303 1218\n10a10 a 1304 1218\n10a1a 5 1306 1218\n10a1f 4 1308 1218\n10a23 5 1310 1218\n10a28 4 1358 1218\n10a2c 5 1359 1218\n10a31 c 1322 1218\n10a3d 2 1324 1218\n10a3f f 1325 1218\n10a4e a 1327 1218\n10a58 2 1329 1218\n10a5a a 1330 1218\n10a64 5 1332 1218\n10a69 30 1337 1218\n10a99 4 1352 1218\n10a9d 4 1154 1218\n10aa1 10 1158 1218\n10ab1 11 1160 1218\n10ac2 3 1161 1218\n10ac5 b 1163 1218\n10ad0 b 1166 1218\n10adb 5 1167 1218\n10ae0 32 1378 1218\n10b12 d 1716 1218\n10b1f 4 1724 1218\n10b23 18 1749 1218\n10b3b c 1750 1218\n10b47 8 1381 1218\n10b4f 9 1385 1218\n10b58 8 1561 1218\n10b60 7 1562 1218\n10b67 d 1584 1218\n10b74 3 1589 1218\n10b77 15 1635 1218\n10b8c 4 1636 1218\n10b90 8 1637 1218\n10b98 f 1639 1218\n10ba7 1d 1378 1218\n10bc4 12 1448 1218\n10bd6 16 1467 1218\n10bec 4 1470 1218\n10bf0 7 1471 1218\n10bf7 2 1472 1218\n10bf9 6 1499 1218\n10bff 7 1500 1218\n10c06 6 1503 1218\n10c0c 5 1506 1218\n10c11 5 1523 1218\n10c16 e 1541 1218\n10c24 6 1546 1218\n10c2a d 1548 1218\n10c37 7 1549 1218\n10c3e 5 1550 1218\n10c43 4 1551 1218\n10c47 5 1553 1218\n10c4c 8 1543 1218\n10c54 7 1544 1218\n10c5b 5 1557 1218\n10c60 34 1378 1218\n10c94 9 1908 1218\n10c9d 9 1910 1218\n10ca6 8 1668 1218\n10cae d 1688 1218\n10cbb 6 1702 1218\n10cc1 7 1703 1218\n10cc8 2 1704 1218\n10cca 5 1706 1218\n10ccf 7 1708 1218\n10cd6 5 1710 1218\n10cdb 4 1864 1218\n10cdf 7 1869 1218\n10ce6 c 1933 1218\n10cf2 8 1939 1218\n10cfa 5 1958 1218\n10cff 7 1751 1218\n10d06 9 1752 1218\n10d0f 5 1753 1218\n10d14 3 1754 1218\n10d17 9 1756 1218\n10d20 f 1759 1218\n10d2f 2 1760 1218\n10d31 15 1765 1218\n10d46 8 1767 1218\n10d4e e 1809 1218\n10d5c 27 1828 1218\n10d83 14 1838 1218\n10d97 15 1840 1218\n10dac a 1844 1218\n10db6 15 1846 1218\n10dcb 5 1852 1218\n10dd0 7 1853 1218\n10dd7 4 1854 1218\n10ddb 1 1857 1218\n10ddc 5 1859 1218\n10de1 3 1877 1218\n10de4 3 1887 1218\n10de7 2 1888 1218\n10de9 1a 1378 1218\n10e03 7 1892 1218\n10e0a 11 1897 1218\n10e1b c 1900 1218\n10e27 7 1901 1218\n10e2e 5 1903 1218\n10e33 5 1961 1218\n10e38 6 1987 1218\n10e3e 14 2026 1218\n10e52 2 2045 1218\n10e54 5 2051 1218\n10e59 2 2071 1218\n10e5b 3 2074 1218\n10e5e 6 2080 1218\n10e64 2 2099 1218\n10e66 5 2105 1218\n10e6b f 2128 1218\n10e7a 7 2129 1218\n10e81 7 2130 1218\n10e88 c 2136 1218\n10e94 2 2142 1218\n10e96 6 2148 1218\n10e9c 7 2149 1218\n10ea3 2 2150 1218\n10ea5 4 2151 1218\n10ea9 a 2152 1218\n10eb3 3 2153 1218\n10eb6 6 2157 1218\n10ebc 3 2158 1218\n10ebf 6 2163 1218\n10ec5 10 2165 1218\n10ed5 10 2166 1218\n10ee5 c 2168 1218\n10ef1 3 2170 1218\n10ef4 3 2172 1218\n10ef7 2 2173 1218\n10ef9 8 2175 1218\n10f01 1 2176 1218\n10f02 19 2180 1218\n10f1b 9 2181 1218\n10f24 1 2182 1218\n10f25 2 2185 1218\n10f27 7 1640 1218\n10f2e 2 1641 1218\n10f30 4 1640 1218\n10f34 5 1642 1218\n10f39 2 1644 1218\n10f3b 4 1645 1218\n10f3f 8 1646 1218\n10f47 5 1647 1218\n10f4c 6 1648 1218\n10f52 1 1649 1218\n10f53 4 1648 1218\n10f57 6 1650 1218\n10f5d a 2201 1218\n10f67 7 2204 1218\n10f6e 6 2205 1218\n10f74 4 2207 1218\n10f78 2 2208 1218\n10f7a 4 2210 1218\n10f7e 4 2212 1218\n10f82 2 2213 1218\n10f84 4 2215 1218\n10f88 4 2217 1218\n10f8c 7 2218 1218\n10f93 9 2224 1218\n10f9c 6 2228 1218\n10fa2 11 2230 1218\n10fb3 11 2234 1218\n10fc4 d 2236 1218\n10fd1 f 2238 1218\n10fe0 d 2243 1218\n10fed 3 2249 1218\n10ff0 3 2250 1218\n10ff3 1e 2252 1218\n11011 9 2253 1218\n1101a 18 2257 1218\n11032 2 1690 1218\n11034 4 2254 1218\n11038 2 2259 1218\n1103a d 2260 1218\n11047 c 2290 1218\n11053 f 2292 1218\n11062 6 2297 1218\n11068 8 2298 1218\n11070 1b 2299 1218\n1108b 17 1125 1218\n110a2 2 1690 1218\n110a4 f 2310 1218\n110b3 10 2376 1218\n110c3 39 2377 1218\nFUNC 110fc 129 10 _validate_param_reuseA\n110fc 3 606 1271\n110ff 1c 610 1271\n1111b f 617 1271\n1112a 11 618 1271\n1113b 10 620 1271\n1114b 36 629 1271\n11181 46 632 1271\n111c7 2 633 1271\n111c9 17 639 1271\n111e0 c 645 1271\n111ec 2c 626 1271\n11218 b 614 1271\n11223 2 646 1271\nFUNC 11225 33 0 write_char\n11225 0 2433 1271\n11225 a 2434 1271\n1122f 2 2437 1271\n11231 21 2442 1271\n11252 2 2444 1271\n11254 1 2447 1271\n11255 2 2446 1271\n11257 1 2447 1271\nFUNC 11258 24 c write_multi_char\n11258 6 2498 1271\n1125e 2 2501 1271\n11260 e 2500 1271\n1126e 5 2501 1271\n11273 7 2499 1271\n1127a 2 2504 1271\nFUNC 1127c 4a 4 write_string\n1127c 0 2563 1271\n1127c 12 2564 1271\n1128e 6 2566 1271\n11294 2 2567 1271\n11296 e 2570 1271\n112a4 5 2571 1271\n112a9 a 2573 1271\n112b3 9 2574 1271\n112bc 9 2569 1271\n112c5 1 2579 1271\nFUNC 112c6 10 4 get_crtdouble_arg\n112c6 0 2684 1271\n112c6 f 2685 1271\n112d5 1 2686 1271\nFUNC 112d6 f88 10 _output_p_l\n112d6 1b 975 1271\n112f1 15 986 1271\n11306 b 1007 1271\n11311 2b 2172 1271\n1133c 2c 1031 1271\n11368 9b 1033 1271\n11403 8 1036 1271\n1140b 3 1038 1271\n1140e 3 1041 1271\n11411 3 1043 1271\n11414 11 1046 1271\n11425 7 1061 1271\n1142c 4 1062 1271\n11430 7 1069 1271\n11437 32 1073 1271\n11469 19 1078 1271\n11482 e 1079 1271\n11490 1a 1082 1271\n114aa 6 1084 1271\n114b0 1b 1087 1271\n114cb 5 1089 1271\n114d0 15 1091 1271\n114e5 3 1093 1271\n114e8 2 1095 1271\n114ea 6 1097 1271\n114f0 5 1101 1271\n114f5 c 1103 1271\n11501 7 1104 1271\n11508 e 1106 1271\n11516 1a 1109 1271\n11530 8 1112 1271\n11538 f 1131 1271\n11547 9 1120 1271\n11550 b 1131 1271\n1155b 21 1137 1271\n1157c 5 1145 1271\n11581 16 1173 1271\n11597 3 1174 1271\n1159a 5 1175 1271\n1159f 1f 1179 1271\n115be 7 1193 1271\n115c5 5 1194 1271\n115ca 7 1181 1271\n115d1 5 1182 1271\n115d6 6 1184 1271\n115dc 5 1185 1271\n115e1 a 1190 1271\n115eb 5 1191 1271\n115f0 7 1187 1271\n115f7 5 1196 1271\n115fc 9 1200 1271\n11605 5 1203 1271\n1160a a 1206 1271\n11614 2 1209 1271\n11616 c 1211 1271\n11622 7 1212 1271\n11629 b 1214 1271\n11634 1b 1216 1271\n1164f 8 1219 1271\n11657 12 1221 1271\n11669 9 1274 1271\n11672 5 1275 1271\n11677 c 1228 1271\n11683 b 1233 1271\n1168e 7 1235 1271\n11695 3 1236 1271\n11698 5 1239 1271\n1169d 10 1241 1271\n116ad 5 1243 1271\n116b2 3 1248 1271\n116b5 5 1249 1271\n116ba 5 1253 1271\n116bf 5 1256 1271\n116c4 a 1259 1271\n116ce 2 1262 1271\n116d0 c 1264 1271\n116dc 7 1265 1271\n116e3 f 1267 1271\n116f2 c 1280 1271\n116fe b 1284 1271\n11709 4 1285 1271\n1170d 5 1287 1271\n11712 1c 1274 1271\n1172e 10 1289 1271\n1173e 5 1291 1271\n11743 18 1295 1271\n1175b a 1362 1271\n11765 5 1363 1271\n1176a 5 1301 1271\n1176f 1 1303 1271\n11770 d 1304 1271\n1177d 5 1306 1271\n11782 7 1308 1271\n11789 5 1310 1271\n1178e 7 1358 1271\n11795 5 1359 1271\n1179a c 1322 1271\n117a6 2 1324 1271\n117a8 12 1325 1271\n117ba a 1327 1271\n117c4 2 1329 1271\n117c6 d 1330 1271\n117d3 5 1332 1271\n117d8 18 1337 1271\n117f0 3 1352 1271\n117f3 13 1158 1271\n11806 11 1160 1271\n11817 8 1161 1271\n1181f 8 1163 1271\n11827 b 1166 1271\n11832 5 1167 1271\n11837 a 1342 1271\n11841 5 1366 1271\n11846 39 1378 1271\n1187f 9 1716 1271\n11888 7 1724 1271\n1188f 12 1726 1271\n118a1 a 1728 1271\n118ab 27 1739 1271\n118d2 b 1381 1271\n118dd c 1385 1271\n118e9 b 1561 1271\n118f4 a 1562 1271\n118fe d 1584 1271\n1190b 9 1586 1271\n11914 a 1589 1271\n1191e 5 1592 1271\n11923 25 1378 1271\n11948 b 1442 1271\n11953 5 1445 1271\n11958 b 1448 1271\n11963 2 1451 1271\n11965 a 1453 1271\n1196f 27 1457 1271\n11996 5 1458 1271\n1199b a 1462 1271\n119a5 19 1467 1271\n119be 4 1470 1271\n119c2 3 1471 1271\n119c5 2 1472 1271\n119c7 5 1477 1271\n119cc b 1480 1271\n119d7 2 1483 1271\n119d9 a 1485 1271\n119e3 f 1489 1271\n119f2 a 1494 1271\n119fc 6 1499 1271\n11a02 3 1500 1271\n11a05 9 1503 1271\n11a0e 5 1506 1271\n11a13 5 1520 1271\n11a18 a 1523 1271\n11a22 2 1526 1271\n11a24 a 1528 1271\n11a2e 9 1532 1271\n11a37 6 1533 1271\n11a3d 9 1537 1271\n11a46 b 1541 1271\n11a51 9 1546 1271\n11a5a d 1548 1271\n11a67 3 1549 1271\n11a6a 5 1550 1271\n11a6f 3 1551 1271\n11a72 5 1553 1271\n11a77 8 1543 1271\n11a7f 7 1544 1271\n11a86 5 1557 1271\n11a8b 38 1378 1271\n11ac3 14 1908 1271\n11ad7 f 1910 1271\n11ae6 5 1665 1271\n11aeb a 1668 1271\n11af5 2 1671 1271\n11af7 a 1673 1271\n11b01 25 1677 1271\n11b26 5 1678 1271\n11b2b 9 1682 1271\n11b34 9 1688 1271\n11b3d 9 1702 1271\n11b46 7 1703 1271\n11b4d 2 1704 1271\n11b4f 5 1706 1271\n11b54 3 1708 1271\n11b57 5 1710 1271\n11b5c 7 1864 1271\n11b63 7 1869 1271\n11b6a f 1933 1271\n11b79 9 1936 1271\n11b82 e 1939 1271\n11b90 5 1942 1271\n11b95 1c 1739 1271\n11bb1 21 1109 1271\n11bd2 16 1749 1271\n11be8 9 1750 1271\n11bf1 7 1751 1271\n11bf8 3 1767 1271\n11bfb 5 1806 1271\n11c00 9 1809 1271\n11c09 2 1812 1271\n11c0b 5 1753 1271\n11c10 3 1754 1271\n11c13 a 1756 1271\n11c1d f 1759 1271\n11c2c 2 1760 1271\n11c2e 11 1765 1271\n11c3f a 1818 1271\n11c49 6 1821 1271\n11c4f 16 1822 1271\n11c65 26 1828 1271\n11c8b 16 1838 1271\n11ca1 17 1840 1271\n11cb8 a 1844 1271\n11cc2 17 1846 1271\n11cd9 8 1852 1271\n11ce1 a 1853 1271\n11ceb 3 1854 1271\n11cee 3 1857 1271\n11cf1 5 1859 1271\n11cf6 7 1877 1271\n11cfd 7 1887 1271\n11d04 2 1888 1271\n11d06 1a 1378 1271\n11d20 7 1892 1271\n11d27 14 1897 1271\n11d3b c 1900 1271\n11d47 7 1901 1271\n11d4e 5 1903 1271\n11d53 a 1944 1271\n11d5d 2c 1948 1271\n11d89 5 1949 1271\n11d8e 6 1961 1271\n11d94 3 1964 1271\n11d97 6 1970 1271\n11d9d a 1972 1271\n11da7 2c 1976 1271\n11dd3 5 1977 1271\n11dd8 c 1981 1271\n11de4 5 1987 1271\n11de9 4 2019 1271\n11ded 4 2020 1271\n11df1 5 2023 1271\n11df6 b 2026 1271\n11e01 5 2029 1271\n11e06 a 2031 1271\n11e10 f 2035 1271\n11e1f a 2040 1271\n11e29 2 2045 1271\n11e2b 5 2048 1271\n11e30 b 2051 1271\n11e3b 2 2054 1271\n11e3d a 2056 1271\n11e47 b 2060 1271\n11e52 a 2065 1271\n11e5c 2 2071 1271\n11e5e 4 2074 1271\n11e62 5 2077 1271\n11e67 a 2080 1271\n11e71 2 2083 1271\n11e73 a 2085 1271\n11e7d b 2089 1271\n11e88 a 2094 1271\n11e92 2 2099 1271\n11e94 5 2102 1271\n11e99 a 2105 1271\n11ea3 2 2108 1271\n11ea5 a 2110 1271\n11eaf 38 2114 1271\n11ee7 5 2115 1271\n11eec b 2119 1271\n11ef7 13 2128 1271\n11f0a 7 2129 1271\n11f11 a 2130 1271\n11f1b f 2136 1271\n11f2a 2 2142 1271\n11f2c 6 2148 1271\n11f32 7 2149 1271\n11f39 2 2150 1271\n11f3b 7 2151 1271\n11f42 a 2152 1271\n11f4c 3 2153 1271\n11f4f 6 2157 1271\n11f55 3 2158 1271\n11f58 6 2163 1271\n11f5e 10 2165 1271\n11f6e 10 2166 1271\n11f7e c 2168 1271\n11f8a 3 2170 1271\n11f8d 3 2172 1271\n11f90 2 2173 1271\n11f92 8 2175 1271\n11f9a 1 2176 1271\n11f9b 24 2180 1271\n11fbf 9 2181 1271\n11fc8 1 2182 1271\n11fc9 5 2185 1271\n11fce c 1594 1271\n11fda c 1598 1271\n11fe6 9 1603 1271\n11fef e 1635 1271\n11ffd 4 1636 1271\n12001 8 1637 1271\n12009 8 1639 1271\n12011 1c 1598 1271\n1202d 6 1640 1271\n12033 2 1641 1271\n12035 4 1640 1271\n12039 5 1642 1271\n1203e 2 1644 1271\n12040 5 1645 1271\n12045 8 1646 1271\n1204d 5 1647 1271\n12052 6 1648 1271\n12058 1 1649 1271\n12059 4 1648 1271\n1205d 6 1650 1271\n12063 10 2189 1271\n12073 a 2201 1271\n1207d a 2204 1271\n12087 6 2205 1271\n1208d 4 2207 1271\n12091 2 2208 1271\n12093 4 2210 1271\n12097 4 2212 1271\n1209b 2 2213 1271\n1209d 4 2215 1271\n120a1 4 2217 1271\n120a5 7 2218 1271\n120ac 9 2224 1271\n120b5 4 2228 1271\n120b9 11 2230 1271\n120ca 11 2234 1271\n120db 13 2236 1271\n120ee f 2238 1271\n120fd d 2243 1271\n1210a 3 2249 1271\n1210d 3 2250 1271\n12110 1e 2252 1271\n1212e 9 2253 1271\n12137 18 2257 1271\n1214f 2 2310 1271\n12151 4 2254 1271\n12155 2 2259 1271\n12157 d 2260 1271\n12164 f 2290 1271\n12173 f 2292 1271\n12182 6 2297 1271\n12188 8 2298 1271\n12190 15 2299 1271\n121a5 2 1073 1271\n121a7 f 2310 1271\n121b6 b 2314 1271\n121c1 10 2319 1271\n121d1 1d 2321 1271\n121ee 2 2360 1271\n121f0 3 2361 1271\n121f3 2 2362 1271\n121f5 2 2324 1271\n121f7 f 2325 1271\n12206 10 1043 1271\n12216 10 2376 1271\n12226 38 2377 1271\nFUNC 1225e c2 4 _putwch_nolock\n1225e 11 84 4721\n1226f a 89 4721\n12279 9 91 4721\n12282 5 92 4721\n12287 a 96 4721\n12291 6 97 4721\n12297 16 103 4721\n122ad 14 105 4721\n122c1 6 106 4721\n122c7 1c 123 4721\n122e3 1e 129 4721\n12301 2 131 4721\n12303 4 133 4721\n12307 d 134 4721\n12314 a 110 4721\n1231e 2 113 4721\nFUNC 12320 9b 4 _cputws\n12320 c 151 4721\n1232c 5 153 4721\n12331 30 155 4721\n12361 b 157 4721\n1236c 9 158 4721\n12375 3 159 4721\n12378 a 160 4721\n12382 17 162 4721\n12399 4 164 4721\n1239d c 169 4721\n123a9 3 172 4721\n123ac 6 173 4721\n123b2 9 170 4721\nFUNC 123bb 46 4 _putwch\n123bb c 49 4721\n123c7 8 52 4721\n123cf 4 53 4721\n123d3 f 55 4721\n123e2 c 58 4721\n123ee 4 62 4721\n123f2 6 63 4721\n123f8 9 59 4721\nFUNC 12401 113 10 _mbtowc_l\n12401 8 55 6355\n12409 e 56 6355\n12417 4 61 6355\n1241b 7 64 6355\n12422 3 65 6355\n12425 4 59 6355\n12429 2 116 6355\n1242b b 70 6355\n12436 8 73 6355\n1243e 7 75 6355\n12445 7 76 6355\n1244c 11 77 6355\n1245d 13 80 6355\n12470 33 90 6355\n124a3 10 93 6355\n124b3 1b 99 6355\n124ce b 95 6355\n124d9 14 96 6355\n124ed 25 108 6355\n12512 2 111 6355\nFUNC 12514 17 c mbtowc\n12514 0 123 6355\n12514 16 124 6355\n1252a 1 125 6355\nFUNC 1252b 83 10 _lseeki64_nolock\n1252b 5 120 4872\n12530 4 126 4872\n12534 1b 134 4872\n1254f b 136 4872\n1255a 6 138 4872\n12560 22 146 4872\n12582 7 148 4872\n12589 2 149 4872\n1258b 19 152 4872\n125a4 8 153 4872\n125ac 2 154 4872\nFUNC 125ae 119 10 _lseeki64\n125ae c 73 4872\n125ba 9 74 4872\n125c3 24 77 4872\n125e7 2f 78 4872\n12616 46 79 4872\n1265c 7 81 4872\n12663 3 82 4872\n12666 9 84 4872\n1266f 1a 85 4872\n12689 2 86 4872\n1268b b 87 4872\n12696 7 88 4872\n1269d 8 89 4872\n126a5 c 93 4872\n126b1 6 97 4872\n126b7 6 98 4872\n126bd a 94 4872\nFUNC 126c7 7d 8 _set_osfhnd\n126c7 0 213 4825\n126c7 2e 216 4825\n126f5 e 217 4825\n12703 b 218 4825\n1270e 3 226 4825\n12711 2 227 4825\n12713 3 223 4825\n12716 2 224 4825\n12718 9 220 4825\n12721 5 231 4825\n12726 5 232 4825\n1272b b 234 4825\n12736 8 235 4825\n1273e 5 236 4825\n12743 1 238 4825\nFUNC 12744 81 4 _free_osfhnd\n12744 0 263 4825\n12744 38 266 4825\n1277c 9 268 4825\n12785 a 269 4825\n1278f 3 277 4825\n12792 2 278 4825\n12794 3 274 4825\n12797 2 275 4825\n12799 9 271 4825\n127a2 6 282 4825\n127a8 4 283 4825\n127ac b 285 4825\n127b7 7 286 4825\n127be 6 287 4825\n127c4 1 289 4825\nFUNC 127c5 71 4 _get_osfhandle\n127c5 0 312 4825\n127c5 1f 313 4825\n127e4 2 318 4825\n127e6 e 314 4825\n127f4 3d 315 4825\n12831 1 318 4825\n12832 3 317 4825\n12835 1 318 4825\nFUNC 12836 a0 4 __lock_fhandle\n12836 c 437 4825\n12842 17 438 4825\n12859 7 439 4825\n12860 7 444 4825\n12867 8 446 4825\n1286f 3 447 4825\n12872 5 448 4825\n12877 14 449 4825\n1288b 3 453 4825\n1288e 3 455 4825\n12891 c 457 4825\n1289d 5 462 4825\n128a2 1d 464 4825\n128bf 3 467 4825\n128c2 6 468 4825\n128c8 5 457 4825\n128cd 9 458 4825\nFUNC 128d6 22 4 _unlock_fhandle\n128d6 0 489 4825\n128d6 21 490 4825\n128f7 1 491 4825\nFUNC 128f8 19f 0 _alloc_osfhnd\n128f8 c 52 4825\n12904 4 53 4825\n12908 5 56 4825\n1290d c 58 4825\n12919 8 59 4825\n12921 8 61 4825\n12929 3 62 4825\n1292c c 71 4825\n12938 f 77 4825\n12947 17 83 4825\n1295e 6 85 4825\n12964 6 89 4825\n1296a 8 90 4825\n12972 6 91 4825\n12978 6 92 4825\n1297e 14 93 4825\n12992 3 99 4825\n12995 2 101 4825\n12997 3 103 4825\n1299a 9 106 4825\n129a3 6 111 4825\n129a9 a 113 4825\n129b3 6 119 4825\n129b9 7 120 4825\n129c0 5 83 4825\n129c5 6 106 4825\n129cb 9 107 4825\n129d4 6 124 4825\n129da 4 126 4825\n129de 3 127 4825\n129e1 19 128 4825\n129fa 6 137 4825\n12a00 6 71 4825\n12a06 12 145 4825\n12a18 9 151 4825\n12a21 7 152 4825\n12a28 c 154 4825\n12a34 4 155 4825\n12a38 3 156 4825\n12a3b 4 157 4825\n12a3f 4 158 4825\n12a43 8 154 4825\n12a4b 6 165 4825\n12a51 19 166 4825\n12a6a b 167 4825\n12a75 4 171 4825\n12a79 c 178 4825\n12a85 3 186 4825\n12a88 6 187 4825\n12a8e 9 179 4825\nFUNC 12a97 115 8 _open_osfhandle\n12a97 c 343 4825\n12aa3 5 347 4825\n12aa8 2 351 4825\n12aaa 6 353 4825\n12ab0 3 354 4825\n12ab3 8 356 4825\n12abb 3 357 4825\n12abe 6 359 4825\n12ac4 3 360 4825\n12ac7 9 364 4825\n12ad0 4 365 4825\n12ad4 d 367 4825\n12ae1 3 409 4825\n12ae4 6 410 4825\n12aea 5 372 4825\n12aef 5 373 4825\n12af4 5 374 4825\n12af9 3 375 4825\n12afc f 380 4825\n12b0b b 381 4825\n12b16 7 382 4825\n12b1d 2 383 4825\n12b1f 3 385 4825\n12b22 b 391 4825\n12b2d 3 393 4825\n12b30 1a 395 4825\n12b4a 9 396 4825\n12b53 9 397 4825\n12b5c 7 399 4825\n12b63 c 401 4825\n12b6f 10 409 4825\n12b7f 5 401 4825\n12b84 5 402 4825\n12b89 1b 404 4825\n12ba4 8 406 4825\nFUNC 12bac 11e c _calloc_impl\n12bac c 23 5592\n12bb8 9 28 5592\n12bc1 2e 30 5592\n12bef 9 32 5592\n12bf8 4 36 5592\n12bfc 3 37 5592\n12bff 5 41 5592\n12c04 5 43 5592\n12c09 9 46 5592\n12c12 9 50 5592\n12c1b b 52 5592\n12c26 8 56 5592\n12c2e 3 57 5592\n12c31 c 58 5592\n12c3d c 60 5592\n12c49 7 64 5592\n12c50 d 65 5592\n12c5d 4 93 5592\n12c61 11 94 5592\n12c72 c 97 5592\n12c7e f 109 5592\n12c8d b 111 5592\n12c98 6 112 5592\n12c9e 5 113 5592\n12ca3 5 60 5592\n12ca8 9 61 5592\n12cb1 4 100 5592\n12cb5 7 102 5592\n12cbc 6 103 5592\n12cc2 2 105 5592\n12cc4 6 119 5592\nFUNC 12cca 3f 8 calloc\n12cca 4 145 5592\n12cce 5 146 5592\n12cd3 14 147 5592\n12ce7 15 149 5592\n12cfc 8 151 5592\n12d04 3 153 5592\n12d07 2 154 5592\nFUNC 12d09 21b 8 realloc\n12d09 c 64 5338\n12d15 7 69 5338\n12d1c e 70 5338\n12d2a 7 73 5338\n12d31 7 75 5338\n12d38 5 76 5338\n12d3d d 81 5338\n12d4a 5 88 5338\n12d4f 9 89 5338\n12d58 8 91 5338\n12d60 3 92 5338\n12d63 12 96 5338\n12d75 8 100 5338\n12d7d f 102 5338\n12d8c 5 103 5338\n12d91 e 104 5338\n12d9f 4 107 5338\n12da3 10 108 5338\n12db3 9 110 5338\n12dbc a 111 5338\n12dc6 5 118 5338\n12dcb 4 120 5338\n12dcf 6 121 5338\n12dd5 9 123 5338\n12dde 15 124 5338\n12df3 4 127 5338\n12df7 10 128 5338\n12e07 c 129 5338\n12e13 c 135 5338\n12e1f 6 142 5338\n12e25 4 144 5338\n12e29 1 145 5338\n12e2a 9 147 5338\n12e33 14 148 5338\n12e47 6 135 5338\n12e4d 9 137 5338\n12e56 3 148 5338\n12e59 10 158 5338\n12e69 f 181 5338\n12e78 5 186 5338\n12e7d 5 183 5338\n12e82 11 186 5338\n12e93 2 188 5338\n12e95 8 160 5338\n12e9d 5 170 5338\n12ea2 3 167 5338\n12ea5 2 172 5338\n12ea7 6 174 5338\n12ead 2 155 5338\n12eaf 4 321 5338\n12eb3 1 322 5338\n12eb4 12 323 5338\n12ec6 c 332 5338\n12ed2 b 347 5338\n12edd 5 319 5338\n12ee2 7 327 5338\n12ee9 b 328 5338\n12ef4 2 329 5338\n12ef6 6 356 5338\n12efc 5 349 5338\n12f01 5 350 5338\n12f06 4 334 5338\n12f0a 16 341 5338\n12f20 4 343 5338\nFUNC 12f24 79 c _recalloc\n12f24 3 744 5338\n12f27 a 749 5338\n12f31 28 751 5338\n12f59 4 753 5338\n12f5d 9 754 5338\n12f66 b 755 5338\n12f71 b 756 5338\n12f7c a 757 5338\n12f86 10 759 5338\n12f96 5 761 5338\n12f9b 2 762 5338\nFUNC 12f9d 21 0 _get_sbh_threshold\n12f9d 0 61 5281\n12f9d 9 64 5281\n12fa6 2 66 5281\n12fa8 1 81 5281\n12fa9 14 69 5281\n12fbd 1 81 5281\nFUNC 12fbe 46 4 _set_amblksiz\n12fbe 0 214 5281\n12fbe 2b 216 5281\n12fe9 1 224 5281\n12fea 11 217 5281\n12ffb 5 220 5281\n13000 3 223 5281\n13003 1 224 5281\nFUNC 13004 3c 4 _get_amblksiz\n13004 0 243 5281\n13004 27 245 5281\n1302b 1 253 5281\n1302c 8 246 5281\n13034 8 249 5281\n1303c 3 252 5281\n1303f 1 253 5281\nFUNC 13040 48 4 __sbh_heap_init\n13040 0 274 5281\n13040 1c 275 5281\n1305c 1 285 5281\n1305d 4 278 5281\n13061 7 280 5281\n13068 c 281 5281\n13074 13 284 5281\n13087 1 285 5281\nFUNC 13088 2b 4 __sbh_find_block\n13088 0 306 5281\n13088 12 307 5281\n1309a 7 316 5281\n130a1 8 317 5281\n130a9 3 319 5281\n130ac 4 314 5281\n130b0 2 321 5281\n130b2 1 322 5281\nFUNC 130b3 314 8 __sbh_free_block\n130b3 6 381 5281\n130b9 7 399 5281\n130c0 9 402 5281\n130c9 18 407 5281\n130e1 3 408 5281\n130e4 d 412 5281\n130f1 3 416 5281\n130f4 5 417 5281\n130f9 6 420 5281\n130ff b 424 5281\n1310a 4 429 5281\n1310e 5 430 5281\n13113 3 431 5281\n13116 8 434 5281\n1311e 3 439 5281\n13121 b 441 5281\n1312c e 442 5281\n1313a 5 443 5281\n1313f 2 445 5281\n13141 5 448 5281\n13146 11 449 5281\n13157 9 450 5281\n13160 9 455 5281\n13169 15 459 5281\n1317e 6 463 5281\n13184 5 464 5281\n13189 3 465 5281\n1318c f 468 5281\n1319b 3 474 5281\n1319e 6 477 5281\n131a4 b 478 5281\n131af 2 479 5281\n131b1 3 483 5281\n131b4 6 484 5281\n131ba 7 485 5281\n131c1 2 486 5281\n131c3 4 489 5281\n131c7 b 493 5281\n131d2 3 498 5281\n131d5 11 501 5281\n131e6 6 502 5281\n131ec 5 503 5281\n131f1 2 505 5281\n131f3 e 508 5281\n13201 6 509 5281\n13207 6 511 5281\n1320d c 516 5281\n13219 c 517 5281\n13225 8 520 5281\n1322d e 524 5281\n1323b 6 528 5281\n13241 3 529 5281\n13244 6 530 5281\n1324a 3 531 5281\n1324d 6 532 5281\n13253 8 535 5281\n1325b 18 541 5281\n13273 e 542 5281\n13281 f 543 5281\n13290 2 545 5281\n13292 6 547 5281\n13298 10 548 5281\n132a8 13 550 5281\n132bb 5 556 5281\n132c0 4 558 5281\n132c4 b 561 5281\n132cf d 564 5281\n132dc 6 568 5281\n132e2 1a 569 5281\n132fc 15 573 5281\n13311 16 577 5281\n13327 19 578 5281\n13340 9 579 5281\n13349 6 583 5281\n1334f 8 586 5281\n13357 16 589 5281\n1336d 25 595 5281\n13392 14 599 5281\n133a6 4 600 5281\n133aa a 603 5281\n133b4 8 608 5281\n133bc 9 609 5281\n133c5 2 611 5281\nFUNC 133c7 b0 0 __sbh_alloc_new_region\n133c7 0 891 5281\n133c7 13 897 5281\n133da 1e 900 5281\n133f8 4 901 5281\n133fc 12 905 5281\n1340e 9 909 5281\n13417 18 913 5281\n1342f 2 914 5281\n13431 1a 918 5281\n1344b 10 920 5281\n1345b 2 921 5281\n1345d 9 927 5281\n13466 6 930 5281\n1346c 6 933 5281\n13472 4 935 5281\n13476 1 936 5281\nFUNC 13477 106 4 __sbh_alloc_new_group\n13477 5 958 5281\n1347c 3 959 5281\n1347f 9 972 5281\n13488 4 973 5281\n1348c 2 976 5281\n1348e 1 977 5281\n1348f 4 974 5281\n13493 15 981 5281\n134a8 c 986 5281\n134b4 1f 993 5281\n134d3 8 994 5281\n134db 6 998 5281\n134e1 12 1001 5281\n134f3 4 1004 5281\n134f7 7 1005 5281\n134fe 8 1011 5281\n13506 10 1013 5281\n13516 12 1016 5281\n13528 3 1001 5281\n1352b 8 1021 5281\n13533 6 1023 5281\n13539 3 1024 5281\n1353c 6 1027 5281\n13542 3 1028 5281\n13545 5 1030 5281\n1354a a 1031 5281\n13554 9 1032 5281\n1355d b 1033 5281\n13568 e 1036 5281\n13576 5 1038 5281\n1357b 2 1039 5281\nFUNC 1357d 2df c __sbh_resize_block\n1357d 6 1061 5281\n13583 c 1080 5281\n1358f b 1083 5281\n1359a 3 1084 5281\n1359d 12 1085 5281\n135af 7 1089 5281\n135b6 14 1096 5281\n135ca 13 1099 5281\n135dd 7 1105 5281\n135e4 8 1106 5281\n135ec 6 1107 5281\n135f2 8 1110 5281\n135fa 3 1115 5281\n135fd 9 1117 5281\n13606 11 1118 5281\n13617 5 1119 5281\n1361c 2 1121 5281\n1361e 5 1124 5281\n13623 14 1125 5281\n13637 6 1126 5281\n1363d 9 1131 5281\n13646 9 1132 5281\n1364f 12 1135 5281\n13661 a 1141 5281\n1366b 9 1142 5281\n13674 3 1143 5281\n13677 9 1147 5281\n13680 6 1148 5281\n13686 6 1149 5281\n1368c 3 1150 5281\n1368f 6 1151 5281\n13695 8 1154 5281\n1369d 18 1160 5281\n136b5 e 1161 5281\n136c3 6 1162 5281\n136c9 2 1164 5281\n136cb 6 1166 5281\n136d1 10 1167 5281\n136e1 13 1169 5281\n136f4 c 1174 5281\n13700 9 1176 5281\n13709 6 1180 5281\n1370f 9 1182 5281\n13718 7 1100 5281\n1371f 6 1186 5281\n13725 3 1189 5281\n13728 d 1195 5281\n13735 7 1198 5281\n1373c b 1199 5281\n13747 3 1200 5281\n1374a a 1203 5281\n13754 7 1208 5281\n1375b 5 1209 5281\n13760 3 1210 5281\n13763 8 1213 5281\n1376b 3 1218 5281\n1376e b 1221 5281\n13779 e 1222 5281\n13787 5 1223 5281\n1378c 2 1225 5281\n1378e 5 1228 5281\n13793 11 1229 5281\n137a4 9 1231 5281\n137ad 9 1236 5281\n137b6 9 1237 5281\n137bf 9 1240 5281\n137c8 4 1241 5281\n137cc 5 1242 5281\n137d1 3 1243 5281\n137d4 6 1249 5281\n137da 3 1250 5281\n137dd 6 1251 5281\n137e3 3 1252 5281\n137e6 6 1253 5281\n137ec 8 1256 5281\n137f4 18 1262 5281\n1380c e 1263 5281\n1381a 6 1264 5281\n13820 2 1266 5281\n13822 6 1268 5281\n13828 10 1269 5281\n13838 13 1271 5281\n1384b 5 1276 5281\n13850 4 1278 5281\n13854 6 1281 5281\n1385a 2 1282 5281\nFUNC 1385c cd 0 __sbh_heapmin\n1385c 0 1302 5281\n1385c d 1306 5281\n13869 6 1310 5281\n1386f 17 1311 5281\n13886 15 1314 5281\n1389b 16 1318 5281\n138b1 19 1319 5281\n138ca 9 1320 5281\n138d3 f 1325 5281\n138e2 11 1328 5281\n138f3 28 1333 5281\n1391b 6 1334 5281\n13921 7 1338 5281\n13928 1 1340 5281\nFUNC 13929 2e2 0 __sbh_heap_check\n13929 3 1361 5281\n1392c 12 1391 5281\n1393e 8 1393 5281\n13946 16 1398 5281\n1395c 3 1401 5281\n1395f 8 1402 5281\n13967 6 1406 5281\n1396d 9 1407 5281\n13976 c 1408 5281\n13982 3 1409 5281\n13985 3 1410 5281\n13988 6 1411 5281\n1398e 4 1418 5281\n13992 1b 1421 5281\n139ad 9 1424 5281\n139b6 9 1428 5281\n139bf 1c 1438 5281\n139db 2 1445 5281\n139dd 7 1446 5281\n139e4 1 1449 5281\n139e5 c 1452 5281\n139f1 3 1456 5281\n139f4 2 1458 5281\n139f6 6 1462 5281\n139fc 5 1463 5281\n13a01 3 1464 5281\n13a04 9 1465 5281\n13a0d 1e 1470 5281\n13a2b c 1475 5281\n13a37 2 1479 5281\n13a39 4 1481 5281\n13a3d 6 1484 5281\n13a43 10 1488 5281\n13a53 e 1492 5281\n13a61 2 1498 5281\n13a63 4 1502 5281\n13a67 20 1505 5281\n13a87 19 1509 5281\n13aa0 8 1514 5281\n13aa8 3 1518 5281\n13aab 6 1520 5281\n13ab1 8 1524 5281\n13ab9 4 1527 5281\n13abd e 1532 5281\n13acb 8 1536 5281\n13ad3 6 1541 5281\n13ad9 5 1542 5281\n13ade 3 1543 5281\n13ae1 8 1544 5281\n13ae9 c 1549 5281\n13af5 11 1554 5281\n13b06 6 1559 5281\n13b0c 3 1561 5281\n13b0f e 1563 5281\n13b1d 3 1564 5281\n13b20 2 1566 5281\n13b22 8 1568 5281\n13b2a 3 1569 5281\n13b2d 1c 1575 5281\n13b49 c 1580 5281\n13b55 10 1585 5281\n13b65 17 1591 5281\n13b7c 7 1595 5281\n13b83 7 1596 5281\n13b8a 16 1597 5281\n13ba0 f 1602 5281\n13baf 18 1606 5281\n13bc7 5 1608 5281\n13bcc 2 1609 5281\n13bce 4 1403 5281\n13bd2 4 1425 5281\n13bd6 4 1453 5281\n13bda 4 1485 5281\n13bde 4 1471 5281\n13be2 4 1439 5281\n13be6 4 1493 5281\n13bea 4 1537 5281\n13bee 4 1545 5281\n13bf2 4 1550 5281\n13bf6 4 1510 5281\n13bfa 4 1581 5281\n13bfe 4 1576 5281\n13c02 4 1592 5281\n13c06 5 1603 5281\nFUNC 13c0b a8 4 _set_sbh_threshold\n13c0b 1 102 5281\n13c0c a 104 5281\n13c16 3 106 5281\n13c19 1 195 5281\n13c1a a 109 5281\n13c24 25 112 5281\n13c49 5 113 5281\n13c4e 4 114 5281\n13c52 2 195 5281\n13c54 6 173 5281\n13c5a 2 175 5281\n13c5c 5 179 5281\n13c61 2d 185 5281\n13c8e 6 186 5281\n13c94 a 187 5281\n13c9e 5 188 5281\n13ca3 b 193 5281\n13cae 4 194 5281\n13cb2 1 195 5281\nFUNC 13cb3 2e3 4 __sbh_alloc_block\n13cb3 6 632 5281\n13cb9 5 633 5281\n13cbe 15 650 5281\n13cd3 5 668 5281\n13cd8 7 669 5281\n13cdf 5 671 5281\n13ce4 4 672 5281\n13ce8 2 674 5281\n13cea d 677 5281\n13cf7 a 682 5281\n13d01 e 686 5281\n13d0f 3 688 5281\n13d12 2 683 5281\n13d14 5 688 5281\n13d19 4 692 5281\n13d1d 8 694 5281\n13d25 e 698 5281\n13d33 3 700 5281\n13d36 2 695 5281\n13d38 5 700 5281\n13d3d 6 705 5281\n13d43 6 709 5281\n13d49 6 711 5281\n13d4f 4 707 5281\n13d53 4 715 5281\n13d57 8 717 5281\n13d5f 6 720 5281\n13d65 3 722 5281\n13d68 2 718 5281\n13d6a 5 722 5281\n13d6f 4 726 5281\n13d73 e 727 5281\n13d81 7 728 5281\n13d88 12 733 5281\n13d9a 2 734 5281\n13d9c 6 737 5281\n13da2 3 739 5281\n13da5 2 740 5281\n13da7 1c 745 5281\n13dc3 4 749 5281\n13dc7 14 751 5281\n13ddb e 752 5281\n13de9 3 751 5281\n13dec 12 754 5281\n13dfe a 760 5281\n13e08 d 763 5281\n13e15 2 768 5281\n13e17 2 767 5281\n13e19 1 768 5281\n13e1a 4 765 5281\n13e1e 7 770 5281\n13e25 5 775 5281\n13e2a 6 776 5281\n13e30 8 777 5281\n13e38 3 778 5281\n13e3b 8 781 5281\n13e43 8 784 5281\n13e4b 3 788 5281\n13e4e e 791 5281\n13e5c 15 792 5281\n13e71 8 793 5281\n13e79 2 795 5281\n13e7b f 798 5281\n13e8a f 799 5281\n13e99 e 800 5281\n13ea7 1c 809 5281\n13ec3 6 813 5281\n13ec9 3 814 5281\n13ecc 6 815 5281\n13ed2 3 816 5281\n13ed5 6 817 5281\n13edb 8 820 5281\n13ee3 18 826 5281\n13efb b 827 5281\n13f06 10 829 5281\n13f16 2 831 5281\n13f18 6 833 5281\n13f1e d 835 5281\n13f2b 16 837 5281\n13f41 3 831 5281\n13f44 4 844 5281\n13f48 2 846 5281\n13f4a 9 848 5281\n13f53 a 853 5281\n13f5d 4 855 5281\n13f61 e 858 5281\n13f6f 13 862 5281\n13f82 7 863 5281\n13f89 5 866 5281\n13f8e 6 868 5281\n13f94 2 869 5281\nFUNC 13f96 72 4 _fclose_nolock\n13f96 2 86 1752\n13f98 2a 90 1752\n13fc2 6 96 1752\n13fc8 6 105 1752\n13fce 8 106 1752\n13fd6 13 108 1752\n13fe9 5 109 1752\n13fee 7 111 1752\n13ff5 7 120 1752\n13ffc 3 121 1752\n13fff 3 126 1752\n14002 5 127 1752\n14007 1 128 1752\nFUNC 14008 7c 4 fclose\n14008 c 44 1752\n14014 4 45 1752\n14018 2d 47 1752\n14045 6 50 1752\n1404b 3 51 1752\n1404e 3 64 1752\n14051 6 65 1752\n14057 7 55 1752\n1405e 3 56 1752\n14061 a 57 1752\n1406b 11 59 1752\n1407c 8 60 1752\nFUNC 14084 d 8 _ValidateRead(void const *,unsigned int)\n14084 0 63 5683\n14084 3 64 5683\n14087 7 65 5683\n1408e 2 68 5683\n14090 1 71 5683\nFUNC 14091 d 8 _ValidateWrite(void *,unsigned int)\n14091 0 74 5683\n14091 3 75 5683\n14094 7 76 5683\n1409b 2 79 5683\n1409d 1 82 5683\nFUNC 1409e d 4 _ValidateExecute(int (*)(void))\n1409e 0 85 5683\n1409e 3 86 5683\n140a1 7 87 5683\n140a8 2 90 5683\n140aa 1 93 5683\nFUNC 140ab f3 0 abort\n140ab 1b 53 4119\n140c6 a 56 4119\n140d0 8 59 4119\n140d8 5 68 4119\n140dd 4 69 4119\n140e1 8 71 4119\n140e9 d 78 4119\n140f6 6 87 4119\n140fc 6 88 4119\n14102 6 89 4119\n14108 3 90 4119\n1410b 3 91 4119\n1410e 3 92 4119\n14111 7 93 4119\n14118 7 94 4119\n1411f 4 95 4119\n14123 4 96 4119\n14127 4 97 4119\n1412b 4 98 4119\n1412f 1 99 4119\n14130 6 100 4119\n14136 6 106 4119\n1413c 19 107 4119\n14155 3 109 4119\n14158 13 117 4119\n1416b 9 122 4119\n14174 3 123 4119\n14177 15 126 4119\n1418c a 128 4119\n14196 8 137 4119\nFUNC 1419e 1e 8 _set_abort_behavior\n1419e 0 158 4119\n1419e 1d 160 4119\n141bb 1 162 4119\nFUNC 141bc 20 0 _global_unwind2\nFUNC 141dc 45 0 __unwind_handler\nFUNC 14221 84 0 _local_unwind2\nFUNC 142a5 23 0 _abnormal_termination\nFUNC 142c8 9 0 _NLG_Notify1\nFUNC 142d1 1f 0 _NLG_Notify\nPUBLIC 142e8 0 _NLG_Dispatch2\nFUNC 142f0 3 0 _NLG_Call\nPUBLIC 142f2 0 _NLG_Return2\nFUNC 142f3 a3 4 _msize\n142f3 c 43 5383\n142ff 2d 47 5383\n1432c 9 51 5383\n14335 8 55 5383\n1433d 3 56 5383\n14340 e 57 5383\n1434e e 59 5383\n1435c c 61 5383\n14368 5 64 5383\n1436d 10 88 5383\n1437d 2 91 5383\n1437f 6 93 5383\n14385 8 61 5383\n1438d 9 62 5383\nFUNC 14396 6 0 HeapManager::Block::Block()\n14396 6 90 5771\nFUNC 1439c 1b 8 HeapManager::Constructor(void * (*)(unsigned int),void (*)(void *))\n1439c 6 100 5771\n143a2 7 101 5771\n143a9 5 102 5771\n143ae 3 103 5771\n143b1 3 104 5771\n143b4 3 105 5771\nFUNC 143b7 26 0 HeapManager::Destructor()\n143b7 9 110 5771\n143c0 2 111 5771\n143c2 5 113 5771\n143c7 15 115 5771\n143dc 1 118 5771\nFUNC 143dd 63 0 UnDecorator::getNumberOfDimensions()\n143dd 0 1663 5771\n143dd c 1664 5771\n143e9 2 1665 5771\n143eb 1 1696 5771\n143ec a 1666 5771\n143f6 d 1667 5771\n14403 1 1696 5771\n14404 4 1670 5771\n14408 4 1677 5771\n1440c a 1679 5771\n14416 6 1680 5771\n1441c d 1684 5771\n14429 5 1675 5771\n1442e e 1690 5771\n1443c 3 1691 5771\n1443f 1 1696 5771\nFUNC 14440 474 0 UnDecorator::getTypeEncoding()\n14440 f 2335 5771\n1444f 2 2336 5771\n14451 5 2341 5771\n14456 9 2345 5771\n1445f c 2351 5771\n1446b 9 2423 5771\n14474 2 2426 5771\n14476 2a 2427 5771\n144a0 8 2450 5771\n144a8 2 2451 5771\n144aa 24 2454 5771\n144ce 7 2462 5771\n144d5 5 2463 5771\n144da 6 2353 5771\n144e0 8 2358 5771\n144e8 b 2362 5771\n144f3 5 2363 5771\n144f8 2 2364 5771\n144fa 5 2365 5771\n144ff 9 2369 5771\n14508 1b 2373 5771\n14523 11 2377 5771\n14534 a 2393 5771\n1453e 10 2388 5771\n1454e 2 2389 5771\n14550 18 2384 5771\n14568 2 2385 5771\n1456a 12 2380 5771\n1457c 16 2399 5771\n14592 11 2418 5771\n145a3 a 2406 5771\n145ad 5 2407 5771\n145b2 15 2410 5771\n145c7 5 2422 5771\n145cc 1b 2427 5771\n145e7 a 2430 5771\n145f1 5 2431 5771\n145f6 7 2472 5771\n145fd a 2478 5771\n14607 c 2483 5771\n14613 5 2485 5771\n14618 5 2486 5771\n1461d 5 2487 5771\n14622 5 2490 5771\n14627 5 2505 5771\n1462c 5 2508 5771\n14631 5 2509 5771\n14636 5 2434 5771\n1463b 5 2435 5771\n14640 1a 2427 5771\n1465a 30 2568 5771\n1468a 5 2529 5771\n1468f 4 2530 5771\n14693 a 2531 5771\n1469d 2 2532 5771\n1469f a 2533 5771\n146a9 5 2537 5771\n146ae 5 2538 5771\n146b3 2 2539 5771\n146b5 5 2540 5771\n146ba e 2544 5771\n146c8 6 2560 5771\n146ce 10 2555 5771\n146de 2 2556 5771\n146e0 18 2551 5771\n146f8 2 2552 5771\n146fa 12 2547 5771\n1470c 2 2564 5771\n1470e a 2442 5771\n14718 2 2443 5771\n1471a a 2438 5771\n14724 2 2439 5771\n14726 5 2445 5771\n1472b c 2574 5771\n14737 14 2577 5771\n1474b a 2579 5771\n14755 18 2586 5771\n1476d 1a 2589 5771\n14787 1b 2590 5771\n147a2 5 2591 5771\n147a7 1a 2594 5771\n147c1 1b 2595 5771\n147dc 5 2596 5771\n147e1 1a 2599 5771\n147fb 10 2600 5771\n1480b 2 2601 5771\n1480d 7 2604 5771\n14814 2 2605 5771\n14816 a 2608 5771\n14820 2 2609 5771\n14822 a 2612 5771\n1482c 2 2613 5771\n1482e a 2616 5771\n14838 2 2617 5771\n1483a a 2620 5771\n14844 2 2621 5771\n14846 a 2624 5771\n14850 7 2634 5771\n14857 7 2635 5771\n1485e 7 2637 5771\n14865 10 2639 5771\n14875 3f 2648 5771\nFUNC 148b4 b 0 UnDecorator::doUnderScore()\n148b4 b 4259 5771\nFUNC 148bf d 0 UnDecorator::doMSKeywords()\n148bf d 4260 5771\nFUNC 148cc e 0 UnDecorator::doPtr64()\n148cc e 4261 5771\nFUNC 148da e 0 UnDecorator::doFunctionReturns()\n148da e 4262 5771\nFUNC 148e8 e 0 UnDecorator::doAllocationModel()\n148e8 e 4263 5771\nFUNC 148f6 e 0 UnDecorator::doAllocationLanguage()\n148f6 e 4264 5771\nFUNC 14904 12 0 UnDecorator::doThisTypes()\n14904 12 4271 5771\nFUNC 14916 e 0 UnDecorator::doAccessSpecifiers()\n14916 e 4272 5771\nFUNC 14924 e 0 UnDecorator::doThrowTypes()\n14924 e 4273 5771\nFUNC 14932 e 0 UnDecorator::doMemberTypes()\n14932 e 4274 5771\nFUNC 14940 b 0 UnDecorator::doNameOnly()\n14940 b 4279 5771\nFUNC 1494b b 0 UnDecorator::doTypeOnly()\n1494b b 4280 5771\nFUNC 14956 b 0 UnDecorator::haveTemplateParameters()\n14956 b 4281 5771\nFUNC 14961 e 0 UnDecorator::doEcsu()\n14961 e 4282 5771\nFUNC 1496f b 0 UnDecorator::doNoIdentCharCheck()\n1496f b 4283 5771\nFUNC 1497a e 0 UnDecorator::doEllipsis()\n1497a e 4284 5771\nFUNC 14988 19 4 UnDecorator::UScore(Tokens)\n14988 0 4288 5771\n14988 9 4293 5771\n14991 d 4294 5771\n1499e 2 4296 5771\n149a0 1 4298 5771\nFUNC 149a1 84 8 HeapManager::getMemory(unsigned int,int)\n149a1 2 134 5804\n149a3 a 137 5804\n149ad 9 139 5804\n149b6 6 140 5804\n149bc 4 146 5804\n149c0 3 147 5804\n149c3 8 149 5804\n149cb 7 153 5804\n149d2 2 154 5804\n149d4 1c 159 5804\n149f0 4 164 5804\n149f4 7 168 5804\n149fb 2 169 5804\n149fd 2 170 5804\n149ff 3 171 5804\n14a02 8 175 5804\n14a0a 2 182 5804\n14a0c 4 179 5804\n14a10 5 183 5804\n14a15 d 187 5804\n14a22 3 190 5804\nFUNC 14a25 d 0 DName::DName()\n14a25 2 210 5804\n14a27 3 211 5804\n14a2a 7 220 5804\n14a31 1 221 5804\nFUNC 14a32 12 4 DName::DName(DNameNode *)\n14a32 2 224 5804\n14a34 4 225 5804\n14a38 9 234 5804\n14a41 3 235 5804\nFUNC 14a44 9c 4 DName::DName(DName const &)\n14a44 2 259 5804\n14a46 17 260 5804\n14a5d 10 261 5804\n14a6d d 262 5804\n14a7a d 263 5804\n14a87 10 264 5804\n14a97 4 265 5804\n14a9b e 266 5804\n14aa9 13 267 5804\n14abc 10 268 5804\n14acc 11 269 5804\n14add 3 270 5804\nFUNC 14ae0 a 0 DName::status()\n14ae0 a 481 5804\nFUNC 14aea 5 0 DName::clearStatus()\n14aea 5 482 5804\nFUNC 14aef 7 0 DName::setPtrRef()\n14aef 7 484 5804\nFUNC 14af6 a 0 DName::isPtrRef()\n14af6 a 485 5804\nFUNC 14b00 8 0 DName::setIsArray()\n14b00 8 490 5804\nFUNC 14b08 a 0 DName::isArray()\n14b08 a 491 5804\nFUNC 14b12 a 0 DName::isNoTE()\n14b12 a 492 5804\nFUNC 14b1c 8 0 DName::setIsNoTE()\n14b1c 8 493 5804\nFUNC 14b24 a 0 DName::isPinPtr()\n14b24 a 494 5804\nFUNC 14b2e 8 0 DName::setIsPinPtr()\n14b2e 8 495 5804\nFUNC 14b36 a 0 DName::isComArray()\n14b36 a 496 5804\nFUNC 14b40 8 0 DName::setIsComArray()\n14b40 8 497 5804\nFUNC 14b48 a 0 DName::isVCallThunk()\n14b48 a 498 5804\nFUNC 14b52 8 0 DName::setIsVCallThunk()\n14b52 8 499 5804\nFUNC 14b5a 7b 4 DName::operator=(DName const &)\n14b5a 3 879 5804\n14b5d 12 880 5804\n14b6f 17 882 5804\n14b86 d 883 5804\n14b93 d 884 5804\n14ba0 d 885 5804\n14bad 10 886 5804\n14bbd 10 887 5804\n14bcd 5 889 5804\n14bd2 3 897 5804\nFUNC 14bd5 9 0 Replicator::isFull()\n14bd5 9 1001 5804\nFUNC 14bde 25 4 Replicator::operator[](int)\n14bde 0 1028 5804\n14bde 9 1029 5804\n14be7 b 1031 5804\n14bf2 6 1034 5804\n14bf8 5 1032 5804\n14bfd 3 1030 5804\n14c00 3 1036 5804\nFUNC 14c03 d 0 DNameNode::DNameNode()\n14c03 d 1048 5804\nFUNC 14c10 4 0 DNameNode::nextNode()\n14c10 4 1052 5804\nFUNC 14c14 29 4 DNameNode::operator+=(DNameNode *)\n14c14 2 1131 5804\n14c16 8 1132 5804\n14c1e 8 1134 5804\n14c26 b 1139 5804\n14c31 4 1144 5804\n14c35 2 1147 5804\n14c37 3 1148 5804\n14c3a 3 1156 5804\nFUNC 14c3d 16 4 charNode::charNode(char)\n14c3d 16 1166 5804\nFUNC 14c53 4 0 charNode::length()\n14c53 4 1168 5804\nFUNC 14c57 4 0 charNode::getLastChar()\n14c57 4 1170 5804\nFUNC 14c5b 1b 8 charNode::getString(char *,int)\n14c5b 0 1173 5804\n14c5b f 1174 5804\n14c6a 5 1175 5804\n14c6f 2 1176 5804\n14c71 2 1177 5804\n14c73 3 1183 5804\nFUNC 14c76 4 0 pcharNode::length()\n14c76 4 1189 5804\nFUNC 14c7a 2f 4 pDNameNode::pDNameNode(DName *)\n14c7a 2f 1244 5804\nFUNC 14ca9 25 4 DNameStatusNode::DNameStatusNode(DNameStatus)\n14ca9 25 1261 5804\nFUNC 14cce 4 0 DNameStatusNode::length()\n14cce 4 1263 5804\nFUNC 14cd2 d 0 DNameStatusNode::getLastChar()\n14cd2 d 1266 5804\nFUNC 14cdf e 0 und_strlen\n14cdf 0 1283 5804\n14cdf 6 1286 5804\n14ce5 7 1287 5804\n14cec 1 1291 5804\nFUNC 14ced 20 8 und_strncpy\n14ced 0 1295 5804\n14ced 1b 1296 5804\n14d08 4 1299 5804\n14d0c 1 1301 5804\nFUNC 14d0d 25 4 und_strncmp\n14d0d 0 1304 5804\n14d0d 7 1305 5804\n14d14 2 1306 5804\n14d16 1 1315 5804\n14d17 a 1308 5804\n14d21 1 1310 5804\n14d22 1 1311 5804\n14d23 6 1308 5804\n14d29 8 1314 5804\n14d31 1 1315 5804\nFUNC 14d32 33 0 UnDecorator::getDataIndirectType()\n14d32 33 4033 5771\nFUNC 14d65 34 0 UnDecorator::getThisType()\n14d65 34 4034 5771\nFUNC 14d99 13 c operator new(unsigned int,HeapManager &,int)\n14d99 13 131 5804\nFUNC 14dac 56 4 DName::DName(DName *)\n14dac 0 274 5804\n14dac a 275 5804\n14db6 23 277 5804\n14dd9 13 278 5804\n14dec 2 281 5804\n14dee 4 283 5804\n14df2 3 284 5804\n14df5 7 295 5804\n14dfc 6 296 5804\nFUNC 14e02 61 4 DName::DName(DNameStatus)\n14e02 2 457 5804\n14e04 21 458 5804\n14e25 1e 459 5804\n14e43 7 467 5804\n14e4a 9 469 5804\n14e53 a 470 5804\n14e5d 6 472 5804\nFUNC 14e63 17 0 DName::isValid()\n14e63 17 478 5804\nFUNC 14e7a 15 0 DName::isEmpty()\n14e7a 15 479 5804\nFUNC 14e8f 14 0 DName::isUDC()\n14e8f 14 486 5804\nFUNC 14ea3 e 0 DName::setIsUDC()\n14ea3 e 487 5804\nFUNC 14eb1 14 0 DName::isUDTThunk()\n14eb1 14 488 5804\nFUNC 14ec5 25 0 DName::length()\n14ec5 1 502 5804\n14ec6 2 503 5804\n14ec8 a 506 5804\n14ed2 4 507 5804\n14ed6 b 508 5804\n14ee1 5 507 5804\n14ee6 3 510 5804\n14ee9 1 512 5804\nFUNC 14eea 38 0 DName::getLastChar()\n14eea 2 516 5804\n14eec 2 517 5804\n14eee 9 519 5804\n14ef7 6 520 5804\n14efd a 521 5804\n14f07 2 522 5804\n14f09 7 520 5804\n14f10 11 524 5804\n14f21 1 526 5804\nFUNC 14f22 91 8 DName::getString(char *,int)\n14f22 7 530 5804\n14f29 9 531 5804\n14f32 5 535 5804\n14f37 7 537 5804\n14f3e e 538 5804\n14f4c c 544 5804\n14f58 d 550 5804\n14f65 4 553 5804\n14f69 8 555 5804\n14f71 4 561 5804\n14f75 6 565 5804\n14f7b 2 566 5804\n14f7d b 570 5804\n14f88 4 574 5804\n14f8c 2 578 5804\n14f8e 3 579 5804\n14f91 3 586 5804\n14f94 4 553 5804\n14f98 4 590 5804\n14f9c 2 593 5804\n14f9e 6 594 5804\n14fa4 6 595 5804\n14faa 5 599 5804\n14faf 4 601 5804\nFUNC 14fb3 35 4 DName::operator|=(DName const &)\n14fb3 3 832 5804\n14fb6 19 835 5804\n14fcf 13 836 5804\n14fe2 3 840 5804\n14fe5 3 842 5804\nFUNC 14fe8 81 4 DName::operator=(DNameStatus)\n14fe8 2 928 5804\n14fea 10 929 5804\n14ffa 12 937 5804\n1500c 26 945 5804\n15032 6 947 5804\n15038 e 948 5804\n15046 10 933 5804\n15056 d 934 5804\n15063 3 954 5804\n15066 3 956 5804\nFUNC 15069 1e 0 Replicator::Replicator()\n15069 1e 1004 5804\nFUNC 15087 47 4 Replicator::operator+=(DName const &)\n15087 3 1009 5804\n1508a 12 1010 5804\n1509c 20 1012 5804\n150bc 4 1017 5804\n150c0 8 1018 5804\n150c8 3 1022 5804\n150cb 3 1024 5804\nFUNC 150ce 47 0 DNameNode::clone()\n150ce 3 1055 5804\n150d1 43 1056 5804\n15114 1 1057 5804\nFUNC 15115 65 8 pcharNode::pcharNode(char const *,int)\n15115 1 1197 5804\n15116 1f 1200 5804\n15135 c 1201 5804\n15141 8 1205 5804\n15149 c 1207 5804\n15155 a 1210 5804\n1515f b 1211 5804\n1516a 2 1214 5804\n1516c 3 1216 5804\n1516f 4 1217 5804\n15173 7 1220 5804\nFUNC 1517a 12 0 pcharNode::getLastChar()\n1517a 12 1191 5804\nFUNC 1518c 31 8 pcharNode::getString(char *,int)\n1518c 0 1224 5804\n1518c b 1227 5804\n15197 2 1228 5804\n15199 21 1232 5804\n151ba 3 1234 5804\nFUNC 151bd f 0 pDNameNode::length()\n151bd f 1246 5804\nFUNC 151cc f 0 pDNameNode::getLastChar()\n151cc f 1248 5804\nFUNC 151db 1d 8 pDNameNode::getString(char *,int)\n151db 1d 1251 5804\nFUNC 151f8 33 8 DNameStatusNode::getString(char *,int)\n151f8 0 1269 5804\n151f8 b 1272 5804\n15203 2 1273 5804\n15205 23 1277 5804\n15228 3 1279 5804\nFUNC 1522b 73 14 UnDecorator::UnDecorator(char *,char const *,int,char * (*)(long),unsigned long)\n1522b 16 736 5771\n15241 8 737 5771\n15249 5 738 5771\n1524e 9 740 5771\n15257 a 741 5771\n15261 5 745 5771\n15266 2 747 5771\n15268 6 748 5771\n1526e 6 749 5771\n15274 8 754 5771\n1527c 15 755 5771\n15291 d 758 5771\nFUNC 1529e 2f 4 UnDecorator::getReturnType(DName *)\n1529e 3 2906 5771\n152a1 8 2907 5771\n152a9 15 2911 5771\n152be d 2915 5771\n152cb 2 2917 5771\nFUNC 152cd f 0 UnDecorator::getStorageConvention()\n152cd f 4032 5771\nFUNC 152dc 79 4 DName::operator+=(DNameStatus)\n152dc 4 799 5804\n152e0 17 800 5804\n152f7 20 804 5804\n15317 4 807 5804\n1531b 7 809 5804\n15322 6 811 5804\n15328 8 812 5804\n15330 2 815 5804\n15332 3 816 5804\n15335 5 818 5804\n1533a e 819 5804\n15348 7 801 5804\n1534f 3 825 5804\n15352 3 827 5804\nFUNC 15355 68 4 DName::operator=(DName *)\n15355 3 901 5804\n15358 12 902 5804\n1536a 7 903 5804\n15371 29 911 5804\n1539a 6 913 5804\n153a0 c 914 5804\n153ac 2 917 5804\n153ae 9 918 5804\n153b7 3 922 5804\n153ba 3 924 5804\nFUNC 153bd a6 8 DName::doPchar(char const *,int)\n153bd 3 962 5804\n153c0 1e 963 5804\n153de 6 964 5804\n153e4 c 965 5804\n153f0 10 966 5804\n15400 5 970 5804\n15405 23 984 5804\n15428 6 986 5804\n1542e 9 987 5804\n15437 2 988 5804\n15439 1b 977 5804\n15454 c 993 5804\n15460 3 995 5804\nFUNC 15463 26 4 DName::DName(char)\n15463 3 238 5804\n15466 3 244 5804\n15469 7 248 5804\n15470 7 252 5804\n15477 c 253 5804\n15483 6 255 5804\nFUNC 15489 31 4 DName::DName(char const *)\n15489 0 300 5804\n15489 16 312 5804\n1549f 15 313 5804\n154b4 6 315 5804\nFUNC 154ba d0 8 DName::DName(char const * &,char)\n154ba 7 319 5804\n154c1 d 329 5804\n154ce f 333 5804\n154dd 8 334 5804\n154e5 9 342 5804\n154ee 40 343 5804\n1552e b 344 5804\n15539 9 355 5804\n15542 8 359 5804\n1554a 8 361 5804\n15552 9 363 5804\n1555b 3 364 5804\n1555e 2 367 5804\n15560 3 347 5804\n15563 a 378 5804\n1556d 8 380 5804\n15575 6 368 5804\n1557b 7 371 5804\n15582 6 372 5804\n15588 2 375 5804\nFUNC 1558a 69 8 DName::DName(unsigned __int64)\n1558a 15 384 5804\n1559f 3 390 5804\n155a2 a 398 5804\n155ac 4 402 5804\n155b0 13 406 5804\n155c3 3 407 5804\n155c6 c 409 5804\n155d2 e 411 5804\n155e0 13 413 5804\nFUNC 155f3 96 8 DName::DName(__int64)\n155f3 10 416 5804\n15603 26 436 5804\n15629 15 438 5804\n1563e 10 443 5804\n1564e 5 444 5804\n15653 c 446 5804\n1565f 6 448 5804\n15665 4 449 5804\n15669 e 452 5804\n15677 12 453 5804\nFUNC 15689 2e 4 DName::operator+(DNameStatus)\n15689 1 675 5804\n1568a c 676 5804\n15696 9 679 5804\n1569f b 680 5804\n156aa 2 681 5804\n156ac 5 682 5804\n156b1 3 686 5804\n156b4 3 688 5804\nFUNC 156b7 62 4 DName::operator+=(DName const &)\n156b7 2 739 5804\n156b9 f 740 5804\n156c8 13 741 5804\n156db 2 742 5804\n156dd 9 743 5804\n156e6 6 744 5804\n156ec 2 745 5804\n156ee 7 747 5804\n156f5 6 749 5804\n156fb 9 750 5804\n15704 2 751 5804\n15706 d 752 5804\n15713 3 758 5804\n15716 3 760 5804\nFUNC 15719 8b 4 DName::operator+=(DName *)\n15719 2 764 5804\n1571b a 765 5804\n15725 9 766 5804\n1572e 8 767 5804\n15736 10 768 5804\n15746 8 789 5804\n1574e 20 770 5804\n1576e 4 773 5804\n15772 7 775 5804\n15779 6 777 5804\n1577f 8 778 5804\n15787 2 781 5804\n15789 3 782 5804\n1578c 5 784 5804\n15791 d 785 5804\n1579e 3 793 5804\n157a1 3 795 5804\nFUNC 157a4 1c 4 DName::operator=(char)\n157a4 1 847 5804\n157a5 15 854 5804\n157ba 3 856 5804\n157bd 3 858 5804\nFUNC 157c0 2a 4 DName::operator=(char const *)\n157c0 0 862 5804\n157c0 24 869 5804\n157e4 3 873 5804\n157e7 3 875 5804\nFUNC 157ea a6 0 UnDecorator::getCallingConvention()\n157ea 5 2825 5771\n157ef f 2826 5771\n157fe c 2828 5771\n1580a 5 2835 5771\n1580f 1a 2845 5771\n15829 20 2852 5771\n15849 2 2875 5771\n1584b 2 2876 5771\n1584d 2 2871 5771\n1584f 2 2872 5771\n15851 2 2867 5771\n15853 2 2868 5771\n15855 2 2863 5771\n15857 2 2864 5771\n15859 1 2859 5771\n1585a 2 2860 5771\n1585c 13 2855 5771\n1586f e 2891 5771\n1587d 4 2895 5771\n15881 d 2899 5771\n1588e 2 2901 5771\nFUNC 15890 37 0 UnDecorator::getVCallThunkType()\n15890 3 4057 5771\n15893 9 4059 5771\n1589c 5 4066 5771\n158a1 4 4059 5771\n158a5 4 4066 5771\n158a9 6 4061 5771\n158af c 4062 5771\n158bb a 4064 5771\n158c5 2 4170 5771\nFUNC 158c7 51 4 DName::operator+(DName const &)\n158c7 1 639 5804\n158c8 c 640 5804\n158d4 b 643 5804\n158df b 644 5804\n158ea d 645 5804\n158f7 11 646 5804\n15908 2 647 5804\n1590a 8 648 5804\n15912 3 652 5804\n15915 3 654 5804\nFUNC 15918 2e 4 DName::operator+(DName *)\n15918 1 658 5804\n15919 c 659 5804\n15925 9 662 5804\n1592e b 663 5804\n15939 2 664 5804\n1593b 5 665 5804\n15940 3 669 5804\n15943 3 671 5804\nFUNC 15946 6a 4 DName::operator+=(char)\n15946 1 693 5804\n15947 b 694 5804\n15952 9 695 5804\n1595b 6 696 5804\n15961 2 697 5804\n15963 7 699 5804\n1596a 6 701 5804\n15970 2b 702 5804\n1599b 2 703 5804\n1599d c 704 5804\n159a9 4 710 5804\n159ad 3 712 5804\nFUNC 159b0 6c 4 DName::operator+=(char const *)\n159b0 2 716 5804\n159b2 f 717 5804\n159c1 9 718 5804\n159ca 6 719 5804\n159d0 2 720 5804\n159d2 7 722 5804\n159d9 6 724 5804\n159df 28 725 5804\n15a07 2 726 5804\n15a09 d 727 5804\n15a16 3 733 5804\n15a19 3 735 5804\nFUNC 15a1c e0 0 UnDecorator::getArgumentList()\n15a1c 7 3076 5771\n15a23 12 3078 5771\n15a35 29 3081 5771\n15a5e 6 3085 5771\n15a64 4 3086 5771\n15a68 2 3087 5771\n15a6a e 3088 5771\n15a78 6 3093 5771\n15a7e 6 3095 5771\n15a84 5 3100 5771\n15a89 1 3102 5771\n15a8a 11 3106 5771\n15a9b 2 3109 5771\n15a9d 16 3116 5771\n15ab3 19 3121 5771\n15acc 9 3122 5771\n15ad5 17 3126 5771\n15aec b 3132 5771\n15af7 3 3141 5771\n15afa 2 3143 5771\nFUNC 15afc 4f 4 UnDecorator::getVdispMapType(DName const &)\n15afc 6 4230 5771\n15b02 d 4231 5771\n15b0f c 4232 5771\n15b1b 12 4233 5771\n15b2d 9 4234 5771\n15b36 a 4236 5771\n15b40 6 4237 5771\n15b46 3 4238 5771\n15b49 2 4239 5771\nFUNC 15b4b 22 8 operator+(char,DName const &)\n15b4b 22 198 5804\nFUNC 15b6d 22 8 operator+(DNameStatus,DName const &)\n15b6d 22 201 5804\nFUNC 15b8f 22 8 operator+(char const *,DName const &)\n15b8f 22 204 5804\nFUNC 15bb1 2e 4 DName::operator+(char)\n15bb1 1 605 5804\n15bb2 c 606 5804\n15bbe 9 609 5804\n15bc7 b 610 5804\n15bd2 2 611 5804\n15bd4 5 612 5804\n15bd9 3 616 5804\n15bdc 3 618 5804\nFUNC 15bdf 2e 4 DName::operator+(char const *)\n15bdf 1 622 5804\n15be0 c 623 5804\n15bec 9 626 5804\n15bf5 b 627 5804\n15c00 2 628 5804\n15c02 5 629 5804\n15c07 3 633 5804\n15c0a 3 635 5804\nFUNC 15c0d 141 4 UnDecorator::getDimension(bool)\n15c0d 7 1616 5771\n15c14 10 1618 5771\n15c24 e 1620 5771\n15c32 6 1623 5771\n15c38 f 1624 5771\n15c47 8 1625 5771\n15c4f 47 1626 5771\n15c96 4 1629 5771\n15c9a 4 1636 5771\n15c9e 8 1638 5771\n15ca6 20 1639 5771\n15cc6 d 1643 5771\n15cd3 4 1634 5771\n15cd7 b 1649 5771\n15ce2 2 1650 5771\n15ce4 5 1652 5771\n15ce9 13 1653 5771\n15cfc c 1637 5771\n15d08 4 1641 5771\n15d0c a 1653 5771\n15d16 36 1655 5771\n15d4c 2 1659 5771\nFUNC 15d4e d4 0 UnDecorator::getEnumType()\n15d4e 6 2762 5771\n15d54 1a 2766 5771\n15d6e 12 2770 5771\n15d80 5 2774 5771\n15d85 2 2775 5771\n15d87 5 2779 5771\n15d8c 2 2780 5771\n15d8e 5 2786 5771\n15d93 2 2787 5771\n15d95 d 2791 5771\n15da2 1f 2801 5771\n15dc1 1e 2807 5771\n15ddf e 2814 5771\n15ded 4 2795 5771\n15df1 d 2818 5771\n15dfe 24 2820 5771\nFUNC 15e22 c4 0 UnDecorator::getArgumentTypes()\n15e22 3 3035 5771\n15e25 18 3036 5771\n15e3d 9 3046 5771\n15e46 7 3051 5771\n15e4d 13 3052 5771\n15e60 c 3064 5771\n15e6c 36 3058 5771\n15ea2 b 3061 5771\n15ead 21 3039 5771\n15ece 16 3042 5771\n15ee4 2 3072 5771\nFUNC 15ee6 7e 0 UnDecorator::getThrowTypes()\n15ee6 3 3148 5771\n15ee9 e 3149 5771\n15ef7 2 3150 5771\n15ef9 21 3151 5771\n15f1a 1f 3153 5771\n15f39 29 3155 5771\n15f62 2 3157 5771\nFUNC 15f64 125 c UnDecorator::getExtendedDataIndirectType(char &,bool &,int)\n15f64 6 3636 5771\n15f6a 1a 3641 5771\n15f84 1c 3643 5771\n15fa0 a 3669 5771\n15faa 6 3670 5771\n15fb0 b 3672 5771\n15fbb a 3674 5771\n15fc5 21 3675 5771\n15fe6 17 3678 5771\n15ffd a 3680 5771\n16007 6 3689 5771\n1600d 2 3691 5771\n1600f 17 3693 5771\n16026 1e 3700 5771\n16044 6 3663 5771\n1604a 2 3665 5771\n1604c 3 3656 5771\n1604f d 3657 5771\n1605c 2 3659 5771\n1605e 6 3647 5771\n16064 13 3649 5771\n16077 10 3703 5771\n16087 2 3704 5771\nFUNC 16089 15f 4 UnDecorator::getArrayType(DName const &)\n16089 3 3986 5771\n1608c 12 3987 5771\n1609e 7 3989 5771\n160a5 4 3991 5771\n160a9 2 3992 5771\n160ab 4 3994 5771\n160af 9 3995 5771\n160b8 2a 4026 5771\n160e2 2 4028 5771\n160e4 c 3998 5771\n160f0 9 4000 5771\n160f9 d 4001 5771\n16106 35 4005 5771\n1613b b 4009 5771\n16146 4 4010 5771\n1614a 8 4011 5771\n16152 2 4012 5771\n16154 2c 4013 5771\n16180 d 4017 5771\n1618d 9 4018 5771\n16196 12 4019 5771\n161a8 a 4023 5771\n161b2 36 4024 5771\nFUNC 161e8 31 0 UnDecorator::getLexicalFrame()\n161e8 31 4031 5771\nFUNC 16219 12 0 UnDecorator::getDisplacement()\n16219 12 4048 5771\nFUNC 1622b 12 0 UnDecorator::getCallIndex()\n1622b 12 4049 5771\nFUNC 1623d 12 0 UnDecorator::getGuardNumber()\n1623d 12 4050 5771\nFUNC 1624f 150 4 UnDecorator::getVfTableType(DName const &)\n1624f 7 4174 5771\n16256 d 4175 5771\n16263 1d 4178 5771\n16280 2c 4180 5771\n162ac f 4182 5771\n162bb e 4184 5771\n162c9 5 4186 5771\n162ce 11 4188 5771\n162df 2d 4190 5771\n1630c b 4194 5771\n16317 7 4195 5771\n1631e 10 4199 5771\n1632e a 4200 5771\n16338 b 4188 5771\n16343 b 4204 5771\n1634e a 4206 5771\n16358 7 4207 5771\n1635f 9 4209 5771\n16368 a 4216 5771\n16372 6 4217 5771\n16378 2 4220 5771\n1637a 9 4221 5771\n16383 17 4222 5771\n1639a 3 4224 5771\n1639d 2 4226 5771\nFUNC 1639f a0 8 UnDecorator::getStringEncoding(char *,int)\n1639f 6 1447 5771\n163a5 b 1448 5771\n163b0 22 1451 5771\n163d2 6 1456 5771\n163d8 b 1459 5771\n163e3 b 1462 5771\n163ee 13 1464 5771\n16401 c 1466 5771\n1640d 5 1469 5771\n16412 6 1470 5771\n16418 4 1471 5771\n1641c 14 1477 5771\n16430 d 1452 5771\n1643d 2 1478 5771\nFUNC 1643f 50 0 UnDecorator::getSignedDimension()\n1643f 5 1603 5771\n16444 b 1604 5771\n1644f c 1605 5771\n1645b 2 1606 5771\n1645d 23 1608 5771\n16480 d 1611 5771\n1648d 2 1612 5771\nFUNC 1648f 2bb 0 UnDecorator::getTemplateConstant()\n1648f 15 1877 5771\n164a4 f 1884 5771\n164b3 32 1885 5771\n164e5 9 1921 5771\n164ee b 1922 5771\n164f9 20 1924 5771\n16519 12 1931 5771\n1652b e 1932 5771\n16539 3 1937 5771\n1653c 7 1939 5771\n16543 6 1941 5771\n16549 4 1942 5771\n1654d 2 1944 5771\n1654f 4 1945 5771\n16553 2a 1950 5771\n1657d a 1900 5771\n16587 6 1902 5771\n1658d 11 1903 5771\n1659e 1b 1906 5771\n165b9 b 1892 5771\n165c4 6 2034 5771\n165ca 7 1954 5771\n165d1 26 1885 5771\n165f7 b 1990 5771\n16602 c 1991 5771\n1660e 10 1992 5771\n1661e 9 1966 5771\n16627 c 1968 5771\n16633 e 1971 5771\n16641 10 1973 5771\n16651 6 1975 5771\n16657 6 1976 5771\n1665d 3 1980 5771\n16660 29 1981 5771\n16689 a 1983 5771\n16693 a 2001 5771\n1669d a 2003 5771\n166a7 13 2007 5771\n166ba a 2008 5771\n166c4 11 2012 5771\n166d5 13 2015 5771\n166e8 a 2016 5771\n166f2 13 2021 5771\n16705 a 2022 5771\n1670f 13 2026 5771\n16722 d 2029 5771\n1672f 7 1913 5771\n16736 14 2041 5771\nFUNC 1674a d9 8 UnDecorator::getPtrRefDataType(DName const &,int)\n1674a 3 3937 5771\n1674d 11 3940 5771\n1675e b 3944 5771\n16769 12 3948 5771\n1677b 12 3949 5771\n1678d 10 3951 5771\n1679d 5 3957 5771\n167a2 16 3961 5771\n167b8 d 3967 5771\n167c5 c 3968 5771\n167d1 b 3970 5771\n167dc 6 3972 5771\n167e2 1e 3974 5771\n16800 e 3976 5771\n1680e 13 3980 5771\n16821 2 3982 5771\nFUNC 16823 14 4 UnDecorator::getVbTableType(DName const &)\n16823 14 4053 5771\nFUNC 16837 1b8 0 UnDecorator::getTemplateArgumentList()\n16837 14 1775 5771\n1684b c 1777 5771\n16857 7 1778 5771\n1685e 2a 1781 5771\n16888 6 1785 5771\n1688e 4 1786 5771\n16892 2 1787 5771\n16894 e 1788 5771\n168a2 8 1793 5771\n168aa 5 1798 5771\n168af 1 1800 5771\n168b0 11 1804 5771\n168c1 5 1807 5771\n168c6 7 1810 5771\n168cd 7 1816 5771\n168d4 6 1817 5771\n168da 12 1818 5771\n168ec a 1820 5771\n168f6 5 1821 5771\n168fb e 1822 5771\n16909 5 1824 5771\n1690e 9 1830 5771\n16917 c 1832 5771\n16923 e 1835 5771\n16931 10 1837 5771\n16941 6 1839 5771\n16947 1 1840 5771\n16948 2 1842 5771\n1694a 25 1843 5771\n1696f 2 1846 5771\n16971 10 1847 5771\n16981 2 1850 5771\n16983 1f 1851 5771\n169a2 17 1857 5771\n169b9 9 1858 5771\n169c2 16 1862 5771\n169d8 17 1873 5771\nFUNC 169ef 56f 8 UnDecorator::getOperatorName(bool,bool *)\n169ef b 1095 5771\n169fa 53 1103 5771\n16a4d 13 1183 5771\n16a60 c 1439 5771\n16a6c 1d 1440 5771\n16a89 11 1442 5771\n16a9a 5 1444 5771\n16a9f 3 1124 5771\n16aa2 8 1126 5771\n16aaa 21 1127 5771\n16acb c 1129 5771\n16ad7 a 1130 5771\n16ae1 a 1133 5771\n16aeb 7 1135 5771\n16af2 3 1136 5771\n16af5 9 1144 5771\n16afe 5 1145 5771\n16b03 6 1148 5771\n16b09 2 1154 5771\n16b0b 15 1156 5771\n16b20 18 1160 5771\n16b38 1a 1161 5771\n16b52 10 1166 5771\n16b62 b 1167 5771\n16b6d 5 1170 5771\n16b72 6 1106 5771\n16b78 f 1108 5771\n16b87 21 1103 5771\n16ba8 3d 1220 5771\n16be5 18 1240 5771\n16bfd b 1234 5771\n16c08 5 1235 5771\n16c0d 13 1245 5771\n16c20 7 1247 5771\n16c27 8 1249 5771\n16c2f 18 1220 5771\n16c47 13 1255 5771\n16c5a 7 1256 5771\n16c61 2 1257 5771\n16c63 16 1335 5771\n16c79 7 1356 5771\n16c80 6 1350 5771\n16c86 2 1352 5771\n16c88 25 1220 5771\n16cad 13 1290 5771\n16cc0 17 1291 5771\n16cd7 24 1292 5771\n16cfb 14 1313 5771\n16d0f 6 1316 5771\n16d15 5 1317 5771\n16d1a 10 1302 5771\n16d2a 20 1303 5771\n16d4a 20 1304 5771\n16d6a 20 1305 5771\n16d8a 22 1306 5771\n16dac 12 1307 5771\n16dbe c 1296 5771\n16dca 2b 1297 5771\n16df5 13 1281 5771\n16e08 17 1282 5771\n16e1f 1a 1283 5771\n16e39 5 1284 5771\n16e3e 2d 1220 5771\n16e6b 25 1364 5771\n16e90 10 1373 5771\n16ea0 13 1378 5771\n16eb3 a 1397 5771\n16ebd 13 1399 5771\n16ed0 a 1403 5771\n16eda 6 1405 5771\n16ee0 2 1408 5771\n16ee2 13 1410 5771\n16ef5 d 1413 5771\n16f02 5 1415 5771\n16f07 10 1278 5771\n16f17 b 1330 5771\n16f22 5 1428 5771\n16f27 3 1187 5771\n16f2a 13 1216 5771\n16f3d 8 1437 5771\n16f45 19 1438 5771\nFUNC 16f5e 153 4 UnDecorator::getTemplateName(bool)\n16f5e 5 1700 5771\n16f63 1f 1704 5771\n16f82 16 1714 5771\n16f98 1d 1716 5771\n16fb5 23 1725 5771\n16fd8 e 1729 5771\n16fe6 6 1730 5771\n16fec 12 1732 5771\n16ffe 2 1734 5771\n17000 16 1735 5771\n17016 c 1738 5771\n17022 7 1739 5771\n17029 6 1746 5771\n1702f 21 1747 5771\n17050 c 1749 5771\n1705c a 1750 5771\n17066 a 1753 5771\n17070 6 1755 5771\n17076 6 1756 5771\n1707c 23 1769 5771\n1709f d 1705 5771\n170ac 5 1771 5771\nFUNC 170b1 1ea 4 UnDecorator::getZName(bool)\n170b1 10 1007 5771\n170c1 11 1008 5771\n170d2 3 1013 5771\n170d5 26 1043 5771\n170fb b 1024 5771\n17106 5 1026 5771\n1710b 16 1028 5771\n17121 16 1030 5771\n17137 17 1031 5771\n1714e 7 1033 5771\n17155 25 1040 5771\n1717a 5 1042 5771\n1717f 29 1043 5771\n171a8 8 1045 5771\n171b0 b 1051 5771\n171bb c 1053 5771\n171c7 e 1056 5771\n171d5 10 1058 5771\n171e5 4 1060 5771\n171e9 b 1061 5771\n171f4 2 1063 5771\n171f6 a 1064 5771\n17200 10 1065 5771\n17210 2 1068 5771\n17212 d 1069 5771\n1721f 2a 1070 5771\n17249 2 1073 5771\n1724b 1a 1076 5771\n17265 11 1083 5771\n17276 9 1084 5771\n1727f f 1087 5771\n1728e d 1090 5771\nFUNC 1729b e4 0 UnDecorator::getScopedName()\n1729b 7 2727 5771\n172a2 e 2728 5771\n172b0 15 2733 5771\n172c5 1a 2737 5771\n172df 2a 2738 5771\n17309 b 2742 5771\n17314 8 2743 5771\n1731c 4 2744 5771\n17320 1b 2745 5771\n1733b b 2746 5771\n17346 7 2747 5771\n1734d 2 2748 5771\n1734f 2b 2749 5771\n1737a 3 2753 5771\n1737d 2 2755 5771\nFUNC 1737f f 0 UnDecorator::getECSUName()\n1737f f 2758 5771\nFUNC 1738e 100 0 UnDecorator::getECSUDataType()\n1738e 3 3392 5771\n17391 20 3395 5771\n173b1 37 3399 5771\n173e8 5 3424 5771\n173ed 2 3425 5771\n173ef 5 3420 5771\n173f4 2 3421 5771\n173f6 26 3431 5771\n1741c 2 3432 5771\n1741e 5 3415 5771\n17423 2 3416 5771\n17425 5 3411 5771\n1742a 2 3412 5771\n1742c d 3407 5771\n17439 7 3439 5771\n17440 4 3441 5771\n17444 c 3442 5771\n17450 16 3446 5771\n17466 e 3450 5771\n17474 18 3404 5771\n1748c 2 3452 5771\nFUNC 1748e 46 0 UnDecorator::getSymbolName()\n1748e 3 989 5771\n17491 a 990 5771\n1749b 6 991 5771\n174a1 c 992 5771\n174ad 16 997 5771\n174c3 f 1001 5771\n174d2 2 1003 5771\nFUNC 174d4 92 0 UnDecorator::getBasedType()\n174d4 6 2653 5771\n174da 13 2654 5771\n174ed a 2659 5771\n174f7 17 2661 5771\n1750e c 2707 5771\n1751a 13 2699 5771\n1752d 2 2700 5771\n1752f d 2674 5771\n1753c 2 2711 5771\n1753e a 2712 5771\n17548 d 2716 5771\n17555 f 2720 5771\n17564 2 2722 5771\nFUNC 17566 b42 4 UnDecorator::composeDeclaration(DName const &)\n17566 6 2045 5771\n1756c e 2046 5771\n1757a 5 2047 5771\n1757f a 2048 5771\n17589 b 2053 5771\n17594 f 2054 5771\n175a3 8 2055 5771\n175ab 15 2056 5771\n175c0 8 2057 5771\n175c8 10 2058 5771\n175d8 83 2075 5771\n1765b 7 2081 5771\n17662 19 2082 5771\n1767b 21 2083 5771\n1769c 2 2084 5771\n1769e 15 2085 5771\n176b3 27 2090 5771\n176da 33 2092 5771\n1770d 9 2094 5771\n17716 9 2096 5771\n1771f 2b 2098 5771\n1774a d 2101 5771\n17757 9 2103 5771\n17760 2d 2105 5771\n1778d 2e 2107 5771\n177bb 5 2111 5771\n177c0 3 2114 5771\n177c3 3 2115 5771\n177c6 3 2116 5771\n177c9 3 2117 5771\n177cc 3 2118 5771\n177cf 26 2121 5771\n177f5 12 2123 5771\n17807 19 2125 5771\n17820 19 2126 5771\n17839 2 2127 5771\n1783b 12 2129 5771\n1784d 19 2131 5771\n17866 1b 2134 5771\n17881 13 2141 5771\n17894 a 2142 5771\n1789e 15 2143 5771\n178b3 2 2144 5771\n178b5 f 2145 5771\n178c4 10 2147 5771\n178d4 9 2151 5771\n178dd 22 2152 5771\n178ff 2 2153 5771\n17901 13 2168 5771\n17914 c 2172 5771\n17920 14 2173 5771\n17934 1a 2174 5771\n1794e 2 2175 5771\n17950 b 2176 5771\n1795b 5 2182 5771\n17960 6 2185 5771\n17966 27 2187 5771\n1798d b 2189 5771\n17998 5 2190 5771\n1799d 1b 2194 5771\n179b8 15 2195 5771\n179cd 1d 2202 5771\n179ea 16 2204 5771\n17a00 55 2205 5771\n17a55 12 2206 5771\n17a67 2b 2207 5771\n17a92 2 2208 5771\n17a94 d 2209 5771\n17aa1 1a 2211 5771\n17abb 2e 2218 5771\n17ae9 12 2222 5771\n17afb c 2223 5771\n17b07 c 2227 5771\n17b13 15 2228 5771\n17b28 2 2229 5771\n17b2a f 2230 5771\n17b39 1a 2235 5771\n17b53 b 2237 5771\n17b5e 3 2238 5771\n17b61 5 2243 5771\n17b66 b 2245 5771\n17b71 1c 2250 5771\n17b8d 13 2251 5771\n17ba0 e 2252 5771\n17bae 2 2253 5771\n17bb0 10 2254 5771\n17bc0 3d 2255 5771\n17bfd c 2256 5771\n17c09 e 2257 5771\n17c17 4c 2258 5771\n17c63 a 2259 5771\n17c6d 4b 2260 5771\n17cb8 7 2261 5771\n17cbf 4b 2262 5771\n17d0a f 2263 5771\n17d19 f 2264 5771\n17d28 6 2268 5771\n17d2e 61 2277 5771\n17d8f 15 2281 5771\n17da4 2 2283 5771\n17da6 18 2285 5771\n17dbe 2d 2292 5771\n17deb 12 2294 5771\n17dfd 37 2296 5771\n17e34 23 2297 5771\n17e57 b7 2299 5771\n17f0e 23 2300 5771\n17f31 12 2306 5771\n17f43 37 2307 5771\n17f7a b 2308 5771\n17f85 37 2309 5771\n17fbc b 2310 5771\n17fc7 30 2311 5771\n17ff7 23 2312 5771\n1801a 36 2319 5771\n18050 1e 2320 5771\n1806e 8 2325 5771\n18076 1e 2326 5771\n18094 12 2329 5771\n180a6 2 2331 5771\nFUNC 180a8 211 0 UnDecorator::getDecoratedName()\n180a8 7 861 5771\n180af e 864 5771\n180bd a 868 5771\n180c7 b 873 5771\n180d2 8 874 5771\n180da 11 876 5771\n180eb 10 878 5771\n180fb 6 882 5771\n18101 9 903 5771\n1810a 9 906 5771\n18113 8 910 5771\n1811b 6 912 5771\n18121 5 910 5771\n18126 2 915 5771\n18128 a 918 5771\n18132 19 919 5771\n1814b 6 920 5771\n18151 f 924 5771\n18160 8 925 5771\n18168 17 929 5771\n1817f a 930 5771\n18189 c 932 5771\n18195 8 933 5771\n1819d 5 934 5771\n181a2 18 935 5771\n181ba a 936 5771\n181c4 13 937 5771\n181d7 b 938 5771\n181e2 2 940 5771\n181e4 29 941 5771\n1820d 4 945 5771\n18211 10 946 5771\n18221 9 948 5771\n1822a 3 950 5771\n1822d 1c 955 5771\n18249 f 959 5771\n18258 4 976 5771\n1825c 6 962 5771\n18262 14 964 5771\n18276 19 967 5771\n1828f 5 968 5771\n18294 10 971 5771\n182a4 2 979 5771\n182a6 2 980 5771\n182a8 f 982 5771\n182b7 2 984 5771\nFUNC 182b9 28b 0 UnDecorator::getScope()\n182b9 d 1482 5771\n182c6 f 1483 5771\n182d5 2a 1489 5771\n182ff 14 1492 5771\n18313 b 1495 5771\n1831e 16 1496 5771\n18334 5 1498 5771\n18339 17 1499 5771\n18350 3 1500 5771\n18353 f 1506 5771\n18362 2a 1507 5771\n1838c 10 1566 5771\n1839c 5 1567 5771\n183a1 34 1561 5771\n183d5 4 1562 5771\n183d9 5 1563 5771\n183de e 1510 5771\n183ec 5 1514 5771\n183f1 22 1515 5771\n18413 e 1518 5771\n18421 6 1519 5771\n18427 5 1522 5771\n1842c 2a 1523 5771\n18456 2 1524 5771\n18458 f 1546 5771\n18467 1a 1548 5771\n18481 b 1550 5771\n1848c 9 1551 5771\n18495 2 1554 5771\n18497 f 1530 5771\n184a6 2 1570 5771\n184a8 21 1571 5771\n184c9 a 1489 5771\n184d3 f 1577 5771\n184e2 18 1590 5771\n184fa 2 1591 5771\n184fc b 1580 5771\n18507 7 1581 5771\n1850e 2 1582 5771\n18510 2b 1583 5771\n1853b 4 1597 5771\n1853f 5 1599 5771\nFUNC 18544 341 4 UnDecorator::getFunctionIndirectType(DName const &)\n18544 3 3461 5771\n18547 e 3462 5771\n18555 15 3463 5771\n1856a f 3465 5771\n18579 10 3466 5771\n18589 7 3469 5771\n18590 a 3471 5771\n1859a 6 3473 5771\n185a0 7 3475 5771\n185a7 d 3477 5771\n185b4 17 3482 5771\n185cb 9 3485 5771\n185d4 3 3486 5771\n185d7 5 3490 5771\n185dc f 3491 5771\n185eb 6 3496 5771\n185f1 13 3497 5771\n18604 b 3501 5771\n1860f 1e 3503 5771\n1862d 8 3505 5771\n18635 29 3506 5771\n1865e 2 3507 5771\n18660 17 3508 5771\n18677 f 3510 5771\n18686 4 3511 5771\n1868a 10 3518 5771\n1869a 15 3519 5771\n186af 9 3527 5771\n186b8 d 3528 5771\n186c5 30 3529 5771\n186f5 2 3530 5771\n186f7 11 3521 5771\n18708 7 3514 5771\n1870f 16 3516 5771\n18725 13 3531 5771\n18738 d 3535 5771\n18745 22 3537 5771\n18767 2 3546 5771\n18769 13 3547 5771\n1877c c 3551 5771\n18788 28 3552 5771\n187b0 1e 3557 5771\n187ce c 3558 5771\n187da 2e 3561 5771\n18808 10 3563 5771\n18818 c 3564 5771\n18824 c 3566 5771\n18830 15 3567 5771\n18845 2 3568 5771\n18847 f 3569 5771\n18856 4 3573 5771\n1885a b 3574 5771\n18865 e 3580 5771\n18873 10 3576 5771\n18883 2 3581 5771\nFUNC 18885 4e4 10 UnDecorator::getDataIndirectType(DName const &,char,DName const &,int)\n18885 6 3707 5771\n1888b 23 3711 5771\n188ae 4 3713 5771\n188b2 17 3715 5771\n188c9 c 3717 5771\n188d5 10 3719 5771\n188e5 e 3723 5771\n188f3 6 3725 5771\n188f9 15 3726 5771\n1890e 17 3732 5771\n18925 11 3751 5771\n18936 a 3752 5771\n18940 32 3753 5771\n18972 5 3754 5771\n18977 11 3743 5771\n18988 a 3744 5771\n18992 25 3745 5771\n189b7 2 3746 5771\n189b9 8 3747 5771\n189c1 2 3749 5771\n189c3 19 3735 5771\n189dc a 3736 5771\n189e6 14 3737 5771\n189fa 5 3738 5771\n189ff 11 3739 5771\n18a10 6 3766 5771\n18a16 a 3768 5771\n18a20 17 3770 5771\n18a37 10 3772 5771\n18a47 1a 3778 5771\n18a61 5 3780 5771\n18a66 6 3782 5771\n18a6c 9 3787 5771\n18a75 b 3789 5771\n18a80 19 3791 5771\n18a99 c 3793 5771\n18aa5 24 3794 5771\n18ac9 c 3796 5771\n18ad5 22 3797 5771\n18af7 9 3801 5771\n18b00 5 3805 5771\n18b05 7 3806 5771\n18b0c 6 3810 5771\n18b12 1e 3812 5771\n18b30 8 3814 5771\n18b38 1b 3815 5771\n18b53 2 3816 5771\n18b55 16 3817 5771\n18b6b a 3819 5771\n18b75 13 3828 5771\n18b88 b 3833 5771\n18b93 c 3834 5771\n18b9f 8 3835 5771\n18ba7 6 3836 5771\n18bad b 3842 5771\n18bb8 b 3843 5771\n18bc3 3 3863 5771\n18bc6 6 3864 5771\n18bcc 22 3866 5771\n18bee 9 3871 5771\n18bf7 13 3872 5771\n18c0a 5 3876 5771\n18c0f 1e 3877 5771\n18c2d 5 3879 5771\n18c32 1e 3880 5771\n18c50 5 3884 5771\n18c55 e 3885 5771\n18c63 14 3889 5771\n18c77 28 3895 5771\n18c9f 2 3890 5771\n18ca1 b 3891 5771\n18cac 2 3892 5771\n18cae c 3898 5771\n18cba 17 3899 5771\n18cd1 4 3902 5771\n18cd5 6 3904 5771\n18cdb 7 3906 5771\n18ce2 8 3774 5771\n18cea 13 3918 5771\n18cfd 12 3922 5771\n18d0f 29 3925 5771\n18d38 10 3923 5771\n18d48 c 3928 5771\n18d54 3 3929 5771\n18d57 10 3931 5771\n18d67 2 3933 5771\nFUNC 18d69 14c 0 UnDecorator::operator char *()\n18d69 6 762 5771\n18d6f 4 763 5771\n18d73 f 764 5771\n18d82 9 770 5771\n18d8b c 772 5771\n18d97 7 775 5771\n18d9e 1d 776 5771\n18dbb 4 782 5771\n18dbf 16 783 5771\n18dd5 9 785 5771\n18dde 5 794 5771\n18de3 9 795 5771\n18dec 13 799 5771\n18dff e 808 5771\n18e0d 2 809 5771\n18e0f 2 848 5771\n18e11 1a 810 5771\n18e2b e 813 5771\n18e39 e 811 5771\n18e47 9 817 5771\n18e50 e 819 5771\n18e5e d 820 5771\n18e6b a 824 5771\n18e75 f 825 5771\n18e84 5 828 5771\n18e89 2 829 5771\n18e8b 2 830 5771\n18e8d 5 831 5771\n18e92 1 832 5771\n18e93 5 833 5771\n18e98 1 835 5771\n18e99 5 834 5771\n18e9e 2 838 5771\n18ea0 a 839 5771\n18eaa 9 841 5771\n18eb3 2 848 5771\nFUNC 18eb5 116 c UnDecorator::getPtrRefType(DName const &,DName const &,char)\n18eb5 5 3585 5771\n18eba f 3588 5771\n18ec9 d 3589 5771\n18ed6 b 3591 5771\n18ee1 20 3594 5771\n18f01 b 3595 5771\n18f0c b 3597 5771\n18f17 9 3598 5771\n18f20 14 3600 5771\n18f34 14 3606 5771\n18f48 1b 3608 5771\n18f63 a 3612 5771\n18f6d b 3615 5771\n18f78 c 3617 5771\n18f84 9 3618 5771\n18f8d c 3620 5771\n18f99 c 3622 5771\n18fa5 a 3623 5771\n18faf b 3625 5771\n18fba f 3629 5771\n18fc9 2 3632 5771\nFUNC 18fcb 1b 8 UnDecorator::getPointerType(DName const &,DName const &)\n18fcb 1b 4037 5771\nFUNC 18fe6 1b 8 UnDecorator::getPointerTypeArray(DName const &,DName const &)\n18fe6 1b 4040 5771\nFUNC 19001 1b 8 UnDecorator::getReferenceType(DName const &,DName const &)\n19001 1b 4043 5771\nFUNC 1901c a3 18 __unDName\n1901c f 604 5771\n1902b 9 606 5771\n19034 4 607 5771\n19038 a 612 5771\n19042 2 613 5771\n19044 8 614 5771\n1904c 3 615 5771\n1904f 20 618 5771\n1906f 1a 627 5771\n19089 e 628 5771\n19097 a 633 5771\n190a1 c 636 5771\n190ad 3 643 5771\n190b0 6 645 5771\n190b6 9 637 5771\nFUNC 190bf a3 1c __unDNameEx\n190bf f 684 5771\n190ce 9 687 5771\n190d7 4 688 5771\n190db a 693 5771\n190e5 2 694 5771\n190e7 8 695 5771\n190ef 3 696 5771\n190f2 20 699 5771\n19112 1a 708 5771\n1912c e 709 5771\n1913a a 714 5771\n19144 c 717 5771\n19150 3 724 5771\n19153 6 726 5771\n19159 9 718 5771\nFUNC 19162 387 4 UnDecorator::getBasicDataType(DName const &)\n19162 3 3162 5771\n19165 15 3163 5771\n1917a 6 3165 5771\n19180 4 3168 5771\n19184 35 3173 5771\n191b9 5 3178 5771\n191be 5 3179 5771\n191c3 5 3183 5771\n191c8 5 3184 5771\n191cd 5 3188 5771\n191d2 5 3189 5771\n191d7 5 3193 5771\n191dc 5 3194 5771\n191e1 5 3203 5771\n191e6 5 3204 5771\n191eb 2a 3173 5771\n19215 3c 3222 5771\n19251 5 3231 5771\n19256 5 3232 5771\n1925b 22 3273 5771\n1927d 5 3235 5771\n19282 5 3236 5771\n19287 f 3222 5771\n19296 5 3243 5771\n1929b 5 3244 5771\n192a0 5 3239 5771\n192a5 5 3240 5771\n192aa 5 3247 5771\n192af 5 3248 5771\n192b4 1b 3222 5771\n192cf 3 3264 5771\n192d2 6 3262 5771\n192d8 10 3264 5771\n192e8 10 3266 5771\n192f8 11 3267 5771\n19309 5 3275 5771\n1930e 2 3276 5771\n19310 5 3255 5771\n19315 2 3257 5771\n19317 3 3224 5771\n1931a 12 3343 5771\n1932c 9 3345 5771\n19335 7 3347 5771\n1933c 16 3348 5771\n19352 6 3352 5771\n19358 d 3353 5771\n19365 5 3355 5771\n1936a 5 3227 5771\n1936f 2 3278 5771\n19371 d 3281 5771\n1937e 2 3282 5771\n19380 5 3219 5771\n19385 2 3220 5771\n19387 3 3287 5771\n1938a 5 3290 5771\n1938f d 3207 5771\n1939c d 3212 5771\n193a9 9 3297 5771\n193b2 1f 3301 5771\n193d1 19 3314 5771\n193ea c 3322 5771\n193f6 2 3326 5771\n193f8 c 3307 5771\n19404 2 3308 5771\n19406 1e 3311 5771\n19424 10 3332 5771\n19434 18 3333 5771\n1944c 5 3337 5771\n19451 c 3360 5771\n1945d 5 3367 5771\n19462 d 3369 5771\n1946f 5 3371 5771\n19474 d 3372 5771\n19481 2 3373 5771\n19483 5 3374 5771\n19488 d 3375 5771\n19495 17 3380 5771\n194ac 16 3385 5771\n194c2 27 3387 5771\nFUNC 194e9 13e 4 UnDecorator::getPrimaryDataType(DName const &)\n194e9 7 2962 5771\n194f0 2b 2966 5771\n1951b 12 3027 5771\n1952d d 2972 5771\n1953a c 2974 5771\n19546 a 2975 5771\n19550 b 2981 5771\n1955b 6 2984 5771\n19561 1e 2986 5771\n1957f 7 2996 5771\n19586 2 2997 5771\n19588 6 2998 5771\n1958e f 3000 5771\n1959d 8 3002 5771\n195a5 10 3004 5771\n195b5 2f 3022 5771\n195e4 16 3012 5771\n195fa 17 3008 5771\n19611 14 2969 5771\n19625 2 3030 5771\nFUNC 19627 b1 4 UnDecorator::getDataType(DName *)\n19627 6 2922 5771\n1962d b 2923 5771\n19638 15 2928 5771\n1964d 10 2954 5771\n1965d 6 2934 5771\n19663 c 2936 5771\n1966f f 2937 5771\n1967e 13 2939 5771\n19691 6 2944 5771\n19697 29 2946 5771\n196c0 2 2947 5771\n196c2 14 2931 5771\n196d6 2 2957 5771\nFUNC 196d8 64 4 UnDecorator::getExternalDataType(DName const &)\n196d8 7 4244 5771\n196df 1e 4247 5771\n196fd 9 4248 5771\n19706 30 4253 5771\n19736 4 4255 5771\n1973a 2 4257 5771\nFUNC 1973c 57 8 fastzero_I\nFUNC 19793 8f c _VEC_memzero\nFUNC 19822 14 0 _sse2_mathfcns_init\nFUNC 19836 14 4 _set_SSE2_enable\nFUNC 1984a 87 c fastcopy_I\nFUNC 198d1 e3 c _VEC_memcpy\nFUNC 199b4 1bd c __crtMessageBoxA\n199b4 9 41 4033\n199bd 5 49 4033\n199c2 2 56 4033\n199c4 18 64 4033\n199dc d 66 4033\n199e9 2 67 4033\n199eb 6 69 4033\n199f1 10 76 4033\n19a01 6 78 4033\n19a07 6 80 4033\n19a0d 15 83 4033\n19a22 1a 86 4033\n19a3c 1c 88 4033\n19a58 6 89 4033\n19a5e 8 95 4033\n19a66 6 98 4033\n19a6c a 100 4033\n19a76 14 102 4033\n19a8a 14 116 4033\n19a9e 6 119 4033\n19aa4 d 120 4033\n19ab1 c 122 4033\n19abd 1f 127 4033\n19adc 1b 136 4033\n19af7 6 137 4033\n19afd 7 138 4033\n19b04 2 139 4033\n19b06 7 140 4033\n19b0d 2 142 4033\n19b0f a 144 4033\n19b19 6 146 4033\n19b1f 5 147 4033\n19b24 2 149 4033\n19b26 11 153 4033\n19b37 6 155 4033\n19b3d 5 156 4033\n19b42 8 158 4033\n19b4a b 165 4033\n19b55 5 166 4033\n19b5a 10 168 4033\n19b6a 5 173 4033\n19b6f 2 176 4033\nFUNC 19b71 71 c strcat_s\n19b71 0 13 823\n19b71 30 18 823\n19ba1 c 19 823\n19bad 2 21 823\n19baf 4 23 823\n19bb3 1 25 823\n19bb4 3 26 823\n19bb7 2 29 823\n19bb9 2 32 823\n19bbb d 35 823\n19bc8 4 39 823\n19bcc 2 41 823\n19bce e 42 823\n19bdc 5 45 823\n19be1 1 46 823\nFUNC 19be2 b3 10 strncpy_s\n19be2 5 13 739\n19be7 14 17 739\n19bfb 5 65 739\n19c00 2 66 739\n19c02 26 24 739\n19c28 5 25 739\n19c2d 2 28 739\n19c2f 2 29 739\n19c31 b 31 739\n19c3c 8 35 739\n19c44 d 37 739\n19c51 2 41 739\n19c53 12 45 739\n19c65 5 48 739\n19c6a 2 50 739\n19c6c 4 54 739\n19c70 6 56 739\n19c76 3 58 739\n19c79 c 59 739\n19c85 2 61 739\n19c87 e 62 739\nFUNC 19c95 46 4 _set_error_mode\n19c95 0 43 3937\n19c95 15 50 3937\n19caa 6 58 3937\n19cb0 1 65 3937\n19cb1 5 54 3937\n19cb6 7 55 3937\n19cbd 1 65 3937\n19cbe 1c 61 3937\n19cda 1 65 3937\nFUNC 19cdb a 4 __set_app_type\n19cdb 0 91 3937\n19cdb 9 96 3937\n19ce4 1 97 3937\nFUNC 19ce5 6 0 __get_app_type\n19ce5 0 120 3937\n19ce5 5 125 3937\n19cea 1 126 3937\nFUNC 19ceb 51 10 x_ismbbtype_l\n19ceb 6 213 4669\n19cf1 b 214 4669\n19cfc 4 219 4669\n19d00 3a 222 4669\n19d3a 2 223 4669\nFUNC 19d3c 15 8 _ismbbkalnum_l\n19d3c 0 80 4669\n19d3c 14 81 4669\n19d50 1 82 4669\nFUNC 19d51 13 4 _ismbbkalnum\n19d51 0 85 4669\n19d51 12 86 4669\n19d63 1 87 4669\nFUNC 19d64 15 8 _ismbbkprint_l\n19d64 0 90 4669\n19d64 14 91 4669\n19d78 1 92 4669\nFUNC 19d79 13 4 _ismbbkprint\n19d79 0 95 4669\n19d79 12 96 4669\n19d8b 1 97 4669\nFUNC 19d8c 15 8 _ismbbkpunct_l\n19d8c 0 100 4669\n19d8c 14 101 4669\n19da0 1 102 4669\nFUNC 19da1 13 4 _ismbbkpunct\n19da1 0 105 4669\n19da1 12 106 4669\n19db3 1 107 4669\nFUNC 19db4 18 8 _ismbbalnum_l\n19db4 0 113 4669\n19db4 17 114 4669\n19dcb 1 115 4669\nFUNC 19dcc 16 4 _ismbbalnum\n19dcc 0 118 4669\n19dcc 15 119 4669\n19de1 1 120 4669\nFUNC 19de2 18 8 _ismbbalpha_l\n19de2 0 123 4669\n19de2 17 124 4669\n19df9 1 125 4669\nFUNC 19dfa 16 4 _ismbbalpha\n19dfa 0 128 4669\n19dfa 15 129 4669\n19e0f 1 130 4669\nFUNC 19e10 18 8 _ismbbgraph_l\n19e10 0 133 4669\n19e10 17 134 4669\n19e27 1 135 4669\nFUNC 19e28 16 4 _ismbbgraph\n19e28 0 138 4669\n19e28 15 139 4669\n19e3d 1 140 4669\nFUNC 19e3e 18 8 _ismbbprint_l\n19e3e 0 143 4669\n19e3e 17 144 4669\n19e55 1 145 4669\nFUNC 19e56 16 4 _ismbbprint\n19e56 0 148 4669\n19e56 15 149 4669\n19e6b 1 150 4669\nFUNC 19e6c 15 8 _ismbbpunct_l\n19e6c 0 153 4669\n19e6c 14 154 4669\n19e80 1 155 4669\nFUNC 19e81 13 4 _ismbbpunct\n19e81 0 158 4669\n19e81 12 159 4669\n19e93 1 160 4669\nFUNC 19e94 15 8 _ismbblead_l\n19e94 0 166 4669\n19e94 14 167 4669\n19ea8 1 168 4669\nFUNC 19ea9 13 4 _ismbblead\n19ea9 0 171 4669\n19ea9 12 172 4669\n19ebb 1 173 4669\nFUNC 19ebc 15 8 _ismbbtrail_l\n19ebc 0 176 4669\n19ebc 14 177 4669\n19ed0 1 178 4669\nFUNC 19ed1 13 4 _ismbbtrail\n19ed1 0 181 4669\n19ed1 12 182 4669\n19ee3 1 183 4669\nFUNC 19ee4 53 8 _ismbbkana_l\n19ee4 6 189 4669\n19eea b 190 4669\n19ef5 10 192 4669\n19f05 1f 194 4669\n19f24 2 197 4669\n19f26 f 196 4669\n19f35 2 197 4669\nFUNC 19f37 e 4 _ismbbkana\n19f37 0 200 4669\n19f37 d 201 4669\n19f44 1 202 4669\nFUNC 19f45 44 4 _getbuf\n19f45 0 43 1893\n19f45 6 50 1893\n19f4b 16 58 1893\n19f61 4 61 1893\n19f65 7 62 1893\n19f6c 2 65 1893\n19f6e 4 69 1893\n19f72 6 70 1893\n19f78 7 71 1893\n19f7f 3 75 1893\n19f82 6 76 1893\n19f88 1 79 1893\nFUNC 19f89 1de 8 _fputwc_nolock\n19f89 15 90 2124\n19f9e b 93 2124\n19fa9 48 95 2124\n19ff1 6 101 2124\n19ff7 45 104 2124\n1a03c 27 115 2124\n1a063 9 116 2124\n1a06c 22 120 2124\n1a08e 2 121 2124\n1a090 8 124 2124\n1a098 42 127 2124\n1a0da 17 133 2124\n1a0f1 6 139 2124\n1a0f7 7 141 2124\n1a0fe 34 143 2124\n1a132 6 146 2124\n1a138 6 150 2124\n1a13e d 151 2124\n1a14b d 153 2124\n1a158 f 154 2124\nFUNC 1a167 78 8 fputwc\n1a167 c 48 2124\n1a173 2e 52 2124\n1a1a1 3 55 2124\n1a1a4 7 57 2124\n1a1ab 3 58 2124\n1a1ae 11 60 2124\n1a1bf c 63 2124\n1a1cb 4 67 2124\n1a1cf 6 68 2124\n1a1d5 a 64 2124\nFUNC 1a1df 5 8 putwc\n1a1df 0 162 2124\n1a1df 5 163 2124\nFUNC 1a1e4 1f7 14 wcstoxl\n1a1e4 8 82 6173\n1a1ec b 88 6173\n1a1f7 3 92 6173\n1a1fa b 95 6173\n1a205 2f 97 6173\n1a234 12 98 6173\n1a246 9 103 6173\n1a24f 2 105 6173\n1a251 18 106 6173\n1a269 6 108 6173\n1a26f 4 109 6173\n1a273 2 110 6173\n1a275 6 112 6173\n1a27b 5 113 6173\n1a280 5 115 6173\n1a285 b 118 6173\n1a290 9 119 6173\n1a299 f 120 6173\n1a2a8 9 123 6173\n1a2b1 7 121 6173\n1a2b8 6 126 6173\n1a2be 1a 128 6173\n1a2d8 2 129 6173\n1a2da 5 130 6173\n1a2df d 135 6173\n1a2ec c 141 6173\n1a2f8 15 143 6173\n1a30d 12 144 6173\n1a31f 5 148 6173\n1a324 4 152 6173\n1a328 c 159 6173\n1a334 4 165 6173\n1a338 6 166 6173\n1a33e 9 178 6173\n1a347 6 181 6173\n1a34d 3 183 6173\n1a350 4 184 6173\n1a354 2 186 6173\n1a356 c 161 6173\n1a362 5 173 6173\n1a367 2 174 6173\n1a369 24 189 6173\n1a38d 5 192 6173\n1a392 c 193 6173\n1a39e 6 194 6173\n1a3a4 10 195 6173\n1a3b4 8 201 6173\n1a3bc 2 203 6173\n1a3be 6 205 6173\n1a3c4 3 207 6173\n1a3c7 12 209 6173\n1a3d9 2 210 6173\nFUNC 1a3db 29 c wcstol\n1a3db 3 217 6173\n1a3de 8 218 6173\n1a3e6 13 220 6173\n1a3f9 9 224 6173\n1a402 2 226 6173\nFUNC 1a404 1b 10 _wcstol_l\n1a404 0 234 6173\n1a404 1a 235 6173\n1a41e 1 236 6173\nFUNC 1a41f 2a c wcstoul\n1a41f 3 243 6173\n1a422 7 244 6173\n1a429 14 246 6173\n1a43d a 250 6173\n1a447 2 252 6173\nFUNC 1a449 1b 10 _wcstoul_l\n1a449 0 260 6173\n1a449 1a 261 6173\n1a463 1 262 6173\nFUNC 1a464 9 0 _fptrap\n1a464 0 46 2503\n1a464 8 47 2503\n1a46c 1 48 2503\nFUNC 1a46d 54 8 _isalpha_l\n1a46d 6 57 6535\n1a473 b 58 6535\n1a47e 41 60 6535\n1a4bf 2 61 6535\nFUNC 1a4c1 2b 4 isalpha\n1a4c1 0 66 6535\n1a4c1 9 67 6535\n1a4ca 13 69 6535\n1a4dd 1 75 6535\n1a4de d 73 6535\n1a4eb 1 75 6535\nFUNC 1a4ec 4f 8 _isupper_l\n1a4ec 6 81 6535\n1a4f2 b 82 6535\n1a4fd 3c 84 6535\n1a539 2 85 6535\nFUNC 1a53b 29 4 isupper\n1a53b 0 90 6535\n1a53b 9 91 6535\n1a544 11 93 6535\n1a555 1 99 6535\n1a556 d 97 6535\n1a563 1 99 6535\nFUNC 1a564 4f 8 _islower_l\n1a564 6 105 6535\n1a56a b 106 6535\n1a575 3c 108 6535\n1a5b1 2 109 6535\nFUNC 1a5b3 29 4 islower\n1a5b3 0 114 6535\n1a5b3 9 115 6535\n1a5bc 11 117 6535\n1a5cd 1 123 6535\n1a5ce d 121 6535\n1a5db 1 123 6535\nFUNC 1a5dc 4f 8 _isdigit_l\n1a5dc 6 129 6535\n1a5e2 b 130 6535\n1a5ed 3c 132 6535\n1a629 2 133 6535\nFUNC 1a62b 29 4 isdigit\n1a62b 0 138 6535\n1a62b 9 139 6535\n1a634 11 141 6535\n1a645 1 147 6535\n1a646 d 145 6535\n1a653 1 147 6535\nFUNC 1a654 54 8 _isxdigit_l\n1a654 6 153 6535\n1a65a b 154 6535\n1a665 41 156 6535\n1a6a6 2 157 6535\nFUNC 1a6a8 2b 4 isxdigit\n1a6a8 0 162 6535\n1a6a8 9 163 6535\n1a6b1 13 165 6535\n1a6c4 1 171 6535\n1a6c5 d 169 6535\n1a6d2 1 171 6535\nFUNC 1a6d3 4f 8 _isspace_l\n1a6d3 6 177 6535\n1a6d9 b 178 6535\n1a6e4 3c 180 6535\n1a720 2 181 6535\nFUNC 1a722 29 4 isspace\n1a722 0 186 6535\n1a722 9 187 6535\n1a72b 11 189 6535\n1a73c 1 195 6535\n1a73d d 193 6535\n1a74a 1 195 6535\nFUNC 1a74b 4f 8 _ispunct_l\n1a74b 6 201 6535\n1a751 b 202 6535\n1a75c 3c 204 6535\n1a798 2 205 6535\nFUNC 1a79a 29 4 ispunct\n1a79a 0 210 6535\n1a79a 9 211 6535\n1a7a3 11 213 6535\n1a7b4 1 219 6535\n1a7b5 d 217 6535\n1a7c2 1 219 6535\nFUNC 1a7c3 54 8 _isalnum_l\n1a7c3 6 225 6535\n1a7c9 b 226 6535\n1a7d4 41 228 6535\n1a815 2 229 6535\nFUNC 1a817 2b 4 isalnum\n1a817 0 234 6535\n1a817 9 235 6535\n1a820 13 237 6535\n1a833 1 243 6535\n1a834 d 241 6535\n1a841 1 243 6535\nFUNC 1a842 54 8 _isprint_l\n1a842 6 249 6535\n1a848 b 250 6535\n1a853 41 252 6535\n1a894 2 253 6535\nFUNC 1a896 2b 4 isprint\n1a896 0 258 6535\n1a896 9 259 6535\n1a89f 13 261 6535\n1a8b2 1 267 6535\n1a8b3 d 265 6535\n1a8c0 1 267 6535\nFUNC 1a8c1 54 8 _isgraph_l\n1a8c1 6 273 6535\n1a8c7 b 274 6535\n1a8d2 41 276 6535\n1a913 2 277 6535\nFUNC 1a915 2b 4 isgraph\n1a915 0 282 6535\n1a915 9 283 6535\n1a91e 13 285 6535\n1a931 1 291 6535\n1a932 d 289 6535\n1a93f 1 291 6535\nFUNC 1a940 4f 8 _iscntrl_l\n1a940 6 297 6535\n1a946 b 298 6535\n1a951 3c 300 6535\n1a98d 2 301 6535\nFUNC 1a98f 29 4 iscntrl\n1a98f 0 306 6535\n1a98f 9 307 6535\n1a998 11 309 6535\n1a9a9 1 315 6535\n1a9aa d 313 6535\n1a9b7 1 315 6535\nFUNC 1a9b8 d 4 __isascii\n1a9b8 0 320 6535\n1a9b8 c 321 6535\n1a9c4 1 322 6535\nFUNC 1a9c5 8 4 __toascii\n1a9c5 0 327 6535\n1a9c5 7 328 6535\n1a9cc 1 329 6535\nFUNC 1a9cd 1f 8 _iscsymf_l\n1a9cd 0 335 6535\n1a9cd 1a 336 6535\n1a9e7 1 337 6535\n1a9e8 3 336 6535\n1a9eb 1 337 6535\nFUNC 1a9ec 1a 4 __iscsymf\n1a9ec 0 341 6535\n1a9ec 15 342 6535\n1aa01 1 343 6535\n1aa02 3 342 6535\n1aa05 1 343 6535\nFUNC 1aa06 1f 8 _iscsym_l\n1aa06 0 349 6535\n1aa06 1a 350 6535\n1aa20 1 351 6535\n1aa21 3 350 6535\n1aa24 1 351 6535\nFUNC 1aa25 1c 4 __iscsym\n1aa25 0 356 6535\n1aa25 17 357 6535\n1aa3c 1 358 6535\n1aa3d 3 357 6535\n1aa40 1 358 6535\nFUNC 1aa41 12 8 _MarkAllocaS\n1aa41 0 207 2895\n1aa41 8 208 2895\n1aa49 6 210 2895\n1aa4f 3 211 2895\n1aa52 1 214 2895\nFUNC 1aa53 1b 4 _freea\n1aa53 0 249 2895\n1aa53 8 251 2895\n1aa5b 3 253 2895\n1aa5e 8 255 2895\n1aa66 7 257 2895\n1aa6d 1 266 2895\nFUNC 1aa6e 13b 18 __crtGetLocaleInfoW_stat\n1aa6e f 60 2876\n1aa7d 14 68 2876\n1aa91 d 70 2876\n1aa9e 8 71 2876\n1aaa6 b 73 2876\n1aab1 f 74 2876\n1aac0 5 79 2876\n1aac5 13 81 2876\n1aad8 7 86 2876\n1aadf 2 140 2876\n1aae1 8 96 2876\n1aae9 b 97 2876\n1aaf4 16 100 2876\n1ab0a 7 101 2876\n1ab11 48 104 2876\n1ab59 2 105 2876\n1ab5b 2 106 2876\n1ab5d e 110 2876\n1ab6b 7 113 2876\n1ab72 2 121 2876\n1ab74 2 123 2876\n1ab76 17 130 2876\n1ab8d 6 134 2876\n1ab93 4 136 2876\n1ab97 12 141 2876\nFUNC 1aba9 3b 18 __crtGetLocaleInfoW\n1aba9 6 151 2876\n1abaf b 152 2876\n1abba 28 161 2876\n1abe2 2 162 2876\nFUNC 1abe4 13d 18 __crtGetLocaleInfoA_stat\n1abe4 f 60 4251\n1abf3 17 68 4251\n1ac0a a 70 4251\n1ac14 8 71 4251\n1ac1c b 73 4251\n1ac27 f 74 4251\n1ac36 11 79 4251\n1ac47 4 86 4251\n1ac4b 5 96 4251\n1ac50 b 97 4251\n1ac5b 13 100 4251\n1ac6e 7 101 4251\n1ac75 49 104 4251\n1acbe 2 105 4251\n1acc0 2 106 4251\n1acc2 10 110 4251\n1acd2 3 114 4251\n1acd5 6 124 4251\n1acdb 2 126 4251\n1acdd 15 135 4251\n1acf2 7 139 4251\n1acf9 4 141 4251\n1acfd 12 81 4251\n1ad0f 12 145 4251\nFUNC 1ad21 3b 18 __crtGetLocaleInfoA\n1ad21 6 155 4251\n1ad27 b 156 4251\n1ad32 28 165 4251\n1ad5a 2 166 4251\nFUNC 1ad5c 1a 4 strncnt\n1ad5c 0 48 4203\n1ad5c 6 49 4203\n1ad62 6 52 4203\n1ad68 1 53 4203\n1ad69 5 52 4203\n1ad6e 7 55 4203\n1ad75 1 56 4203\nFUNC 1ad76 3a2 20 __crtLCMapStringA_stat\n1ad76 12 99 4203\n1ad88 d 108 4203\n1ad95 1b 109 4203\n1adb0 8 110 4203\n1adb8 b 111 4203\n1adc3 a 112 4203\n1adcd 5 119 4203\n1add2 19 120 4203\n1adeb 5 124 4203\n1adf0 1 125 4203\n1adf1 3 127 4203\n1adf4 16 133 4203\n1ae0a 9 213 4203\n1ae13 8 235 4203\n1ae1b 8 236 4203\n1ae23 27 247 4203\n1ae4a 6 248 4203\n1ae50 48 251 4203\n1ae98 3 252 4203\n1ae9b 6 253 4203\n1aea1 19 262 4203\n1aeba 21 271 4203\n1aedb 8 274 4203\n1aee3 9 277 4203\n1aeec 9 279 4203\n1aef5 12 288 4203\n1af07 5 292 4203\n1af0c 4b 298 4203\n1af57 4 299 4203\n1af5b 18 309 4203\n1af73 3 312 4203\n1af76 6 322 4203\n1af7c 2 325 4203\n1af7e 17 335 4203\n1af95 7 342 4203\n1af9c 8 344 4203\n1afa4 9 346 4203\n1afad b 141 4203\n1afb8 8 142 4203\n1afc0 5 143 4203\n1afc5 8 144 4203\n1afcd 11 146 4203\n1afde 7 147 4203\n1afe5 9 153 4203\n1afee 15 155 4203\n1b003 5 156 4203\n1b008 2 157 4203\n1b00a 1b 164 4203\n1b025 7 166 4203\n1b02c 41 169 4203\n1b06d 2 170 4203\n1b06f 28 196 4203\n1b097 2 183 4203\n1b099 2 184 4203\n1b09b 25 190 4203\n1b0c0 7 198 4203\n1b0c7 2 199 4203\n1b0c9 1a 202 4203\n1b0e3 5 204 4203\n1b0e8 9 205 4203\n1b0f1 c 206 4203\n1b0fd 7 207 4203\n1b104 2 208 4203\n1b106 12 350 4203\nFUNC 1b118 43 24 __crtLCMapStringA\n1b118 6 363 4203\n1b11e b 364 4203\n1b129 30 376 4203\n1b159 2 377 4203\nFUNC 1b15b 1b8 1c __crtGetStringTypeA_stat\n1b15b f 66 4155\n1b16a 10 75 4155\n1b17a 18 79 4155\n1b192 8 80 4155\n1b19a b 82 4155\n1b1a5 f 83 4155\n1b1b4 11 88 4155\n1b1c5 9 120 4155\n1b1ce 8 141 4155\n1b1d6 8 142 4155\n1b1de 27 153 4155\n1b205 6 154 4155\n1b20b 3e 157 4155\n1b249 2 158 4155\n1b24b 2 159 4155\n1b24d f 161 4155\n1b25c 13 169 4155\n1b26f 11 174 4155\n1b280 6 176 4155\n1b286 6 178 4155\n1b28c 2 90 4155\n1b28e 5 94 4155\n1b293 8 95 4155\n1b29b 5 96 4155\n1b2a0 8 97 4155\n1b2a8 e 99 4155\n1b2b6 4 100 4155\n1b2ba 5 104 4155\n1b2bf 17 106 4155\n1b2d6 2 107 4155\n1b2d8 2 108 4155\n1b2da 3 109 4155\n1b2dd 15 112 4155\n1b2f2 6 113 4155\n1b2f8 7 114 4155\n1b2ff 2 115 4155\n1b301 12 182 4155\nFUNC 1b313 40 20 __crtGetStringTypeA\n1b313 6 194 4155\n1b319 b 195 4155\n1b324 2d 206 4155\n1b351 2 207 4155\nFUNC 1b353 6 0 __pwctype_func\n1b353 0 24 3986\n1b353 5 25 3986\n1b358 1 26 3986\nFUNC 1b359 29 0 __pctype_func\n1b359 0 29 3986\n1b359 7 35 3986\n1b360 3 36 3986\n1b363 18 38 3986\n1b37b 6 39 3986\n1b381 1 40 3986\nFUNC 1b382 419 0 _get_lc_time\n1b382 6 94 3379\n1b388 12 104 3379\n1b39a 3 105 3379\n1b39d 2 170 3379\n1b39f 9 108 3379\n1b3a8 16 112 3379\n1b3be 15 113 3379\n1b3d3 15 114 3379\n1b3e8 18 115 3379\n1b400 15 116 3379\n1b415 13 117 3379\n1b428 14 118 3379\n1b43c 18 120 3379\n1b454 15 121 3379\n1b469 15 122 3379\n1b47e 15 123 3379\n1b493 18 124 3379\n1b4ab 15 125 3379\n1b4c0 15 126 3379\n1b4d5 15 128 3379\n1b4ea 18 129 3379\n1b502 15 130 3379\n1b517 15 131 3379\n1b52c 15 132 3379\n1b541 18 133 3379\n1b559 15 134 3379\n1b56e 15 135 3379\n1b583 15 136 3379\n1b598 18 137 3379\n1b5b0 15 138 3379\n1b5c5 15 139 3379\n1b5da 15 141 3379\n1b5ef 18 142 3379\n1b607 15 143 3379\n1b61c 15 144 3379\n1b631 15 145 3379\n1b646 18 146 3379\n1b65e 18 147 3379\n1b676 18 148 3379\n1b68e 18 149 3379\n1b6a6 1b 150 3379\n1b6c1 18 151 3379\n1b6d9 18 152 3379\n1b6f1 18 154 3379\n1b709 1b 155 3379\n1b724 18 160 3379\n1b73c 18 161 3379\n1b754 1b 163 3379\n1b76f 20 165 3379\n1b78f a 169 3379\n1b799 2 170 3379\nFUNC 1b79b 190 4 __free_lc_time\n1b79b 1 179 3379\n1b79c c 180 3379\n1b7a8 8 183 3379\n1b7b0 8 184 3379\n1b7b8 8 185 3379\n1b7c0 8 186 3379\n1b7c8 8 187 3379\n1b7d0 8 188 3379\n1b7d8 7 189 3379\n1b7df 8 191 3379\n1b7e7 8 192 3379\n1b7ef 8 193 3379\n1b7f7 8 194 3379\n1b7ff 8 195 3379\n1b807 8 196 3379\n1b80f 8 197 3379\n1b817 8 199 3379\n1b81f b 200 3379\n1b82a 8 201 3379\n1b832 8 202 3379\n1b83a 8 203 3379\n1b842 8 204 3379\n1b84a 8 205 3379\n1b852 8 206 3379\n1b85a 8 207 3379\n1b862 8 208 3379\n1b86a 8 209 3379\n1b872 8 210 3379\n1b87a 8 212 3379\n1b882 8 213 3379\n1b88a 8 214 3379\n1b892 8 215 3379\n1b89a 8 216 3379\n1b8a2 b 217 3379\n1b8ad b 218 3379\n1b8b8 b 219 3379\n1b8c3 b 220 3379\n1b8ce b 221 3379\n1b8d9 b 222 3379\n1b8e4 b 223 3379\n1b8ef b 225 3379\n1b8fa b 226 3379\n1b905 b 228 3379\n1b910 b 229 3379\n1b91b f 230 3379\n1b92a 1 232 3379\nFUNC 1b92b 73 4 __init_time\n1b92b 4 56 3379\n1b92f f 60 3379\n1b93e 16 64 3379\n1b954 4 65 3379\n1b958 b 67 3379\n1b963 6 69 3379\n1b969 8 70 3379\n1b971 2 71 3379\n1b973 6 73 3379\n1b979 2 74 3379\n1b97b 2 75 3379\n1b97d 18 78 3379\n1b995 2 82 3379\n1b997 6 83 3379\n1b99d 1 84 3379\nFUNC 1b99e 33 0 fix_grouping\n1b99e 0 32 3427\n1b99e 8 40 3427\n1b9a6 a 43 3427\n1b9b0 4 45 3427\n1b9b4 1 61 3427\n1b9b5 6 40 3427\n1b9bb 1 63 3427\n1b9bc 4 50 3427\n1b9c0 2 52 3427\n1b9c2 7 55 3427\n1b9c9 6 56 3427\n1b9cf 2 60 3427\nFUNC 1b9d1 40 4 __free_lconv_num\n1b9d1 1 211 3427\n1b9d2 8 212 3427\n1b9da a 215 3427\n1b9e4 7 216 3427\n1b9eb b 218 3427\n1b9f6 7 219 3427\n1b9fd b 221 3427\n1ba08 8 222 3427\n1ba10 1 223 3427\nFUNC 1ba11 1c8 4 __init_numeric\n1ba11 7 84 3427\n1ba18 4 92 3427\n1ba1c 2 93 3427\n1ba1e 11 96 3427\n1ba2f 3 177 3427\n1ba32 3 178 3427\n1ba35 c 179 3427\n1ba41 14 102 3427\n1ba55 8 103 3427\n1ba5d 9 108 3427\n1ba66 13 113 3427\n1ba79 9 115 3427\n1ba82 2 116 3427\n1ba84 2 118 3427\n1ba86 9 120 3427\n1ba8f 12 125 3427\n1baa1 8 127 3427\n1baa9 a 128 3427\n1bab3 7 129 3427\n1baba 2 131 3427\n1babc 19 140 3427\n1bad5 15 142 3427\n1baea 1b 144 3427\n1bb05 2 146 3427\n1bb07 c 148 3427\n1bb13 1e 154 3427\n1bb31 2 156 3427\n1bb33 17 154 3427\n1bb4a b 164 3427\n1bb55 9 165 3427\n1bb5e c 166 3427\n1bb6a 8 168 3427\n1bb72 7 169 3427\n1bb79 2 170 3427\n1bb7b 13 186 3427\n1bb8e 11 191 3427\n1bb9f b 193 3427\n1bbaa d 194 3427\n1bbb7 9 197 3427\n1bbc0 9 198 3427\n1bbc9 9 200 3427\n1bbd2 5 201 3427\n1bbd7 2 202 3427\nFUNC 1bbd9 33 0 fix_grouping\n1bbd9 0 214 3470\n1bbd9 8 222 3470\n1bbe1 a 225 3470\n1bbeb 4 227 3470\n1bbef 1 243 3470\n1bbf0 6 222 3470\n1bbf6 1 245 3470\n1bbf7 4 232 3470\n1bbfb 2 234 3470\n1bbfd 7 237 3470\n1bc04 6 238 3470\n1bc0a 2 242 3470\nFUNC 1bc0c 89 4 __free_lconv_mon\n1bc0c 1 255 3470\n1bc0d 8 256 3470\n1bc15 b 259 3470\n1bc20 7 260 3470\n1bc27 b 262 3470\n1bc32 7 263 3470\n1bc39 b 265 3470\n1bc44 7 266 3470\n1bc4b b 268 3470\n1bc56 7 269 3470\n1bc5d b 271 3470\n1bc68 7 272 3470\n1bc6f b 274 3470\n1bc7a 7 275 3470\n1bc81 b 277 3470\n1bc8c 8 278 3470\n1bc94 1 279 3470\nFUNC 1bc95 2c4 4 __init_monetary\n1bc95 8 65 3470\n1bc9d 6 73 3470\n1bca3 13 77 3470\n1bcb6 3 187 3470\n1bcb9 3 188 3470\n1bcbc a 189 3470\n1bcc6 11 83 3470\n1bcd7 8 84 3470\n1bcdf f 89 3470\n1bcee 7 91 3470\n1bcf5 2 92 3470\n1bcf7 2 94 3470\n1bcf9 9 96 3470\n1bd02 f 101 3470\n1bd11 6 103 3470\n1bd17 9 104 3470\n1bd20 2 105 3470\n1bd22 2 107 3470\n1bd24 4 112 3470\n1bd28 14 117 3470\n1bd3c 14 119 3470\n1bd50 14 121 3470\n1bd64 17 123 3470\n1bd7b 14 125 3470\n1bd8f 14 128 3470\n1bda3 14 130 3470\n1bdb7 17 133 3470\n1bdce 14 135 3470\n1bde2 14 137 3470\n1bdf6 14 139 3470\n1be0a 17 141 3470\n1be21 14 143 3470\n1be35 14 145 3470\n1be49 17 147 3470\n1be60 2 149 3470\n1be62 6 150 3470\n1be68 6 151 3470\n1be6e 8 152 3470\n1be76 b 153 3470\n1be81 5 154 3470\n1be86 1c 157 3470\n1bea2 2 159 3470\n1bea4 17 157 3470\n1bebb c 169 3470\n1bec7 3 175 3470\n1beca 32 181 3470\n1befc 11 194 3470\n1bf0d 15 199 3470\n1bf22 b 201 3470\n1bf2d d 202 3470\n1bf3a 9 204 3470\n1bf43 9 205 3470\n1bf4c 6 206 3470\n1bf52 5 208 3470\n1bf57 2 209 3470\nFUNC 1bf59 395 4 __init_ctype\n1bf59 11 59 3562\n1bf6a 6 60 3562\n1bf70 1f 82 3562\n1bf8f 7 84 3562\n1bf96 20 89 3562\n1bfb6 7 94 3562\n1bfbd 10 98 3562\n1bfcd b 100 3562\n1bfd8 b 102 3562\n1bfe3 12 104 3562\n1bff5 2f 106 3562\n1c024 5 109 3562\n1c029 2 112 3562\n1c02b e 113 3562\n1c039 15 115 3562\n1c04e a 118 3562\n1c058 4 121 3562\n1c05c 8 124 3562\n1c064 e 126 3562\n1c072 9 128 3562\n1c07b b 129 3562\n1c086 b 128 3562\n1c091 2c 140 3562\n1c0bd 33 155 3562\n1c0f0 2d 166 3562\n1c11d 37 178 3562\n1c154 11 180 3562\n1c165 17 182 3562\n1c17c 15 183 3562\n1c191 d 180 3562\n1c19e 12 189 3562\n1c1b0 f 190 3562\n1c1bf 12 191 3562\n1c1d1 18 195 3562\n1c1e9 11 198 3562\n1c1fa 13 199 3562\n1c20d e 200 3562\n1c21b e 201 3562\n1c229 9 203 3562\n1c232 6 204 3562\n1c238 9 206 3562\n1c241 9 207 3562\n1c24a 9 208 3562\n1c253 9 209 3562\n1c25c 9 210 3562\n1c265 9 213 3562\n1c26e 4 214 3562\n1c272 8 217 3562\n1c27a 8 218 3562\n1c282 8 219 3562\n1c28a 10 220 3562\n1c29a 13 227 3562\n1c2ad 2 231 3562\n1c2af 6 232 3562\n1c2b5 a 233 3562\n1c2bf a 234 3562\n1c2c9 a 235 3562\n1c2d3 a 236 3562\n1c2dd 2 238 3562\n1c2df f 240 3562\nFUNC 1c2ee 29 0 ___mb_cur_max_func\n1c2ee 0 248 3562\n1c2ee 7 254 3562\n1c2f5 3 255 3562\n1c2f8 18 257 3562\n1c310 6 259 3562\n1c316 1 260 3562\nFUNC 1c317 16 4 ___mb_cur_max_l_func\n1c317 0 263 3562\n1c317 15 264 3562\n1c32c 1 265 3562\nFUNC 1c32d 26 0 ___lc_codepage_func\n1c32d 0 268 3562\n1c32d 7 274 3562\n1c334 3 275 3562\n1c337 18 277 3562\n1c34f 3 279 3562\n1c352 1 280 3562\nFUNC 1c353 26 0 ___lc_collate_cp_func\n1c353 0 284 3562\n1c353 7 290 3562\n1c35a 3 291 3562\n1c35d 18 293 3562\n1c375 3 295 3562\n1c378 1 296 3562\nFUNC 1c379 26 0 ___lc_handle_func\n1c379 0 300 3562\n1c379 7 306 3562\n1c380 3 307 3562\n1c383 18 309 3562\n1c39b 3 311 3562\n1c39e 1 312 3562\nFUNC 1c39f 3 4 __init_collate\n1c39f 0 41 3650\n1c39f 2 42 3650\n1c3a1 1 43 3650\nFUNC 1c3a2 fe 4 _Getdays_l\n1c3a2 9 111 516\n1c3ab d 115 516\n1c3b8 9 117 516\n1c3c1 9 119 516\n1c3ca 28 120 516\n1c3f2 b 121 516\n1c3fd c 123 516\n1c409 4 126 516\n1c40d 30 128 516\n1c43d 8 129 516\n1c445 31 131 516\n1c476 12 132 516\n1c488 3 134 516\n1c48b 13 137 516\n1c49e 2 138 516\nFUNC 1c4a0 9 0 _Getdays\n1c4a0 0 142 516\n1c4a0 8 143 516\n1c4a8 1 144 516\nFUNC 1c4a9 fe 4 _Getmonths_l\n1c4a9 9 150 516\n1c4b2 d 154 516\n1c4bf 16 156 516\n1c4d5 2b 159 516\n1c500 b 160 516\n1c50b 8 162 516\n1c513 a 163 516\n1c51d 2d 167 516\n1c54a 8 168 516\n1c552 2c 170 516\n1c57e 11 171 516\n1c58f 3 173 516\n1c592 13 176 516\n1c5a5 2 177 516\nFUNC 1c5a7 9 0 _Getmonths\n1c5a7 0 181 516\n1c5a7 8 182 516\n1c5af 1 183 516\nFUNC 1c5b0 355 4 _Gettnames_l\n1c5b0 9 189 516\n1c5b9 d 193 516\n1c5c6 9 195 516\n1c5cf 9 197 516\n1c5d8 28 198 516\n1c600 d 199 516\n1c60d 29 200 516\n1c636 18 201 516\n1c64e 11 202 516\n1c65f f 203 516\n1c66e f 204 516\n1c67d 7 205 516\n1c684 e 206 516\n1c692 8 208 516\n1c69a 12 212 516\n1c6ac 13 213 516\n1c6bf 6 214 516\n1c6c5 2a 215 516\n1c6ef 6 216 516\n1c6f5 d 217 516\n1c702 26 218 516\n1c728 1c 219 516\n1c744 18 221 516\n1c75c 6 222 516\n1c762 26 223 516\n1c788 a 224 516\n1c792 5 225 516\n1c797 2a 226 516\n1c7c1 18 227 516\n1c7d9 30 230 516\n1c809 a 231 516\n1c813 30 233 516\n1c843 a 234 516\n1c84d 30 236 516\n1c87d a 237 516\n1c887 30 239 516\n1c8b7 a 240 516\n1c8c1 30 242 516\n1c8f1 12 245 516\n1c903 2 246 516\nFUNC 1c905 9 0 _Gettnames\n1c905 0 250 516\n1c905 8 251 516\n1c90d 1 252 516\nFUNC 1c90e 20 0 _store_str\n1c90e 0 869 516\n1c90e f 871 516\n1c91d 7 872 516\n1c924 9 873 516\n1c92d 1 875 516\nFUNC 1c92e 36 0 _store_number\n1c92e 0 965 516\n1c92e 8 973 516\n1c936 c 976 516\n1c942 2 977 516\n1c944 b 978 516\n1c94f 2 981 516\n1c951 2 982 516\n1c953 1 983 516\n1c954 7 988 516\n1c95b 3 989 516\n1c95e 5 990 516\n1c963 1 991 516\nFUNC 1c964 79 4 _store_num\n1c964 8 909 516\n1c96c 2 910 516\n1c96e 8 912 516\n1c976 33 913 516\n1c9a9 2 914 516\n1c9ab 4 917 516\n1c9af 8 918 516\n1c9b7 b 919 516\n1c9c2 c 921 516\n1c9ce 5 923 516\n1c9d3 2 924 516\n1c9d5 2 926 516\n1c9d7 4 927 516\n1c9db 2 928 516\nFUNC 1c9dd 3e6 10 _expandtime\n1c9dd 5 548 516\n1c9e2 4f 558 516\n1ca31 16 659 516\n1ca47 5 662 516\n1ca4c 16 587 516\n1ca62 7 589 516\n1ca69 5 590 516\n1ca6e 16 571 516\n1ca84 7 573 516\n1ca8b 5 574 516\n1ca90 5 822 516\n1ca95 7 823 516\n1ca9c 5 824 516\n1caa1 16 667 516\n1cab7 10 668 516\n1cac7 2 669 516\n1cac9 5 672 516\n1cace 23 558 516\n1caf1 6 787 516\n1caf7 5 789 516\n1cafc 15 736 516\n1cb11 2 737 516\n1cb13 2 739 516\n1cb15 5 740 516\n1cb1a 15 722 516\n1cb2f 2 723 516\n1cb31 16 742 516\n1cb47 4 743 516\n1cb4b 2 744 516\n1cb4d 5 745 516\n1cb52 6 746 516\n1cb58 8 747 516\n1cb60 1 748 516\n1cb61 5 752 516\n1cb66 f 715 516\n1cb75 5 718 516\n1cb7a 3 696 516\n1cb7d 2 699 516\n1cb7f 1d 804 516\n1cb9c 6 806 516\n1cba2 d 808 516\n1cbaf 2 809 516\n1cbb1 37 558 516\n1cbe8 19 678 516\n1cc01 8 680 516\n1cc09 2 681 516\n1cc0b 15 650 516\n1cc20 13 652 516\n1cc33 5 653 516\n1cc38 1e 601 516\n1cc56 2 603 516\n1cc58 5 606 516\n1cc5d 2 607 516\n1cc5f 2 608 516\n1cc61 25 615 516\n1cc86 2 617 516\n1cc88 1 627 516\n1cc89 2 642 516\n1cc8b e 579 516\n1cc99 7 581 516\n1cca0 5 582 516\n1cca5 2d 562 516\n1ccd2 6 564 516\n1ccd8 5 565 516\n1ccdd e 687 516\n1cceb 3 689 516\n1ccee 5 690 516\n1ccf3 15 558 516\n1cd08 2 834 516\n1cd0a 5 814 516\n1cd0f 19 817 516\n1cd28 5 819 516\n1cd2d d 795 516\n1cd3a b 798 516\n1cd45 5 799 516\n1cd4a 11 762 516\n1cd5b 5 764 516\n1cd60 1 774 516\n1cd61 5 776 516\n1cd66 16 729 516\n1cd7c 6 731 516\n1cd82 5 732 516\n1cd87 16 704 516\n1cd9d 3 705 516\n1cda0 b 706 516\n1cdab 2 707 516\n1cdad e 708 516\n1cdbb 6 839 516\n1cdc1 2 840 516\nFUNC 1cdc3 45d 18 _store_winword\n1cdc3 10 1035 516\n1cdd3 5 1043 516\n1cdd8 a 1053 516\n1cde2 3 1043 516\n1cde5 6 1053 516\n1cdeb 2 1054 516\n1cded 6 1049 516\n1cdf3 2 1050 516\n1cdf5 6 1046 516\n1cdfb 10 1057 516\n1ce0b 4 1066 516\n1ce0f 8 1067 516\n1ce17 6 1069 516\n1ce1d d 1075 516\n1ce2a a 1076 516\n1ce34 8 1077 516\n1ce3c 4 1078 516\n1ce40 2a 1085 516\n1ce6a b 1087 516\n1ce75 31 1092 516\n1cea6 7 1093 516\n1cead 3 1097 516\n1ceb0 13 1100 516\n1cec3 10 1101 516\n1ced3 b 1102 516\n1cede b 1103 516\n1cee9 9 1106 516\n1cef2 3 1291 516\n1cef5 12 1292 516\n1cf07 11 1114 516\n1cf18 5 1117 516\n1cf1d b 1120 516\n1cf28 37 1125 516\n1cf5f 14 1274 516\n1cf73 c 1277 516\n1cf7f 8 1283 516\n1cf87 4 1284 516\n1cf8b 9 1286 516\n1cf94 c 1287 516\n1cfa0 5 1277 516\n1cfa5 e 1128 516\n1cfb3 7 1133 516\n1cfba 7 1132 516\n1cfc1 7 1130 516\n1cfc8 2 1131 516\n1cfca 5 1134 516\n1cfcf a 1156 516\n1cfd9 7 1158 516\n1cfe0 2 1159 516\n1cfe2 5 1160 516\n1cfe7 11 1175 516\n1cff8 5 1176 516\n1cffd 11 1177 516\n1d00e 6 1178 516\n1d014 2 1179 516\n1d016 5 1180 516\n1d01b b 1225 516\n1d026 13 1226 516\n1d039 4 1228 516\n1d03d 1a 1233 516\n1d057 9 1236 516\n1d060 8 1242 516\n1d068 4 1243 516\n1d06c 9 1246 516\n1d075 8 1247 516\n1d07d 5 1277 516\n1d082 1 1230 516\n1d083 5 1250 516\n1d088 12 1136 516\n1d09a 7 1141 516\n1d0a1 7 1140 516\n1d0a8 7 1138 516\n1d0af 2 1139 516\n1d0b1 5 1142 516\n1d0b6 29 1125 516\n1d0df e 1144 516\n1d0ed 7 1147 516\n1d0f4 2 1146 516\n1d0f6 5 1148 516\n1d0fb 7 1182 516\n1d102 b 1183 516\n1d10d 2 1184 516\n1d10f 6 1185 516\n1d115 12 1187 516\n1d127 17 1188 516\n1d13e c 1191 516\n1d14a 8 1197 516\n1d152 4 1198 516\n1d156 8 1201 516\n1d15e 2 1202 516\n1d160 5 1203 516\n1d165 9 1204 516\n1d16e 1a 1205 516\n1d188 9 1207 516\n1d191 8 1212 516\n1d199 4 1213 516\n1d19d 9 1215 516\n1d1a6 8 1216 516\n1d1ae 2 1220 516\n1d1b0 d 1168 516\n1d1bd 7 1170 516\n1d1c4 2 1171 516\n1d1c6 2 1172 516\n1d1c8 d 1162 516\n1d1d5 7 1164 516\n1d1dc 2 1165 516\n1d1de 2 1166 516\n1d1e0 d 1150 516\n1d1ed 7 1152 516\n1d1f4 2 1153 516\n1d1f6 1b 1268 516\n1d211 3 1272 516\n1d214 5 1273 516\n1d219 7 1194 516\nFUNC 1d220 1af 18 _Strftime_l\n1d220 6 356 516\n1d226 4 361 516\n1d22a 13 362 516\n1d23d 33 364 516\n1d270 33 365 516\n1d2a3 d 368 516\n1d2b0 10 375 516\n1d2c0 e 385 516\n1d2ce a 387 516\n1d2d8 1e 435 516\n1d2f6 4 438 516\n1d2fa a 446 516\n1d304 5 447 516\n1d309 b 452 516\n1d314 3 453 516\n1d317 2 454 516\n1d319 7 400 516\n1d320 1 405 516\n1d321 2 408 516\n1d323 5 409 516\n1d328 1 411 516\n1d329 1 412 516\n1d32a 1d 415 516\n1d347 1 428 516\n1d348 5 385 516\n1d34d 5 464 516\n1d352 5 469 516\n1d357 13 470 516\n1d36a 3 441 516\n1d36d f 478 516\n1d37c b 481 516\n1d387 2 483 516\n1d389 b 402 516\n1d394 2 403 516\n1d396 5 421 516\n1d39b 7 423 516\n1d3a2 2 464 516\n1d3a4 18 485 516\n1d3bc 11 488 516\n1d3cd 2 490 516\nFUNC 1d3cf 1e 14 _strftime_l\n1d3cf 3 291 516\n1d3d2 19 292 516\n1d3eb 2 293 516\nFUNC 1d3ed 1d 10 strftime\n1d3ed 0 300 516\n1d3ed 1c 301 516\n1d409 1 302 516\nFUNC 1d40a 1e 14 _Strftime\n1d40a 3 343 516\n1d40d 19 345 516\n1d426 2 346 516\nFUNC 1d428 26 0 localeconv\n1d428 0 69 3302\n1d428 5 75 3302\n1d42d 1b 78 3302\n1d448 5 79 3302\n1d44d 1 80 3302\nFUNC 1d450 46 8 strcspn\n1d450 4 191 924\n1d454 2 198 924\n1d456 1 199 924\n1d457 1 200 924\n1d458 1 201 924\n1d459 1 202 924\n1d45a 1 203 924\n1d45b 1 204 924\n1d45c 1 205 924\n1d45d 1 206 924\n1d45e 6 212 924\n1d464 2 216 924\n1d466 2 217 924\n1d468 2 218 924\n1d46a 3 219 924\n1d46d 4 220 924\n1d471 2 221 924\n1d473 3 227 924\n1d476 6 229 924\n1d47c 3 234 924\n1d47f 2 236 924\n1d481 2 237 924\n1d483 2 238 924\n1d485 3 239 924\n1d488 4 240 924\n1d48c 2 245 924\n1d48e 2 255 924\n1d490 3 257 924\n1d493 3 259 924\nFUNC 1d496 60 c TranslateName\n1d496 3 340 3849\n1d499 3 342 3849\n1d49c 3 343 3849\n1d49f b 346 3849\n1d4aa a 348 3849\n1d4b4 14 349 3849\n1d4c8 6 351 3849\n1d4ce a 352 3849\n1d4d8 2 353 3849\n1d4da 4 354 3849\n1d4de 2 355 3849\n1d4e0 3 356 3849\n1d4e3 7 346 3849\n1d4ea a 359 3849\n1d4f4 2 360 3849\nFUNC 1d4f6 14 0 GetLcidFromDefault\n1d4f6 0 761 3849\n1d4f6 7 762 3849\n1d4fd c 763 3849\n1d509 1 764 3849\nFUNC 1d50a 77 0 ProcessCodePage\n1d50a 13 784 3849\n1d51d 1a 787 3849\n1d537 11 795 3849\n1d548 8 799 3849\n1d550 2 801 3849\n1d552 18 791 3849\n1d56a 3 793 3849\n1d56d 7 805 3849\n1d574 d 806 3849\nFUNC 1d581 1e 4 TestDefaultCountry\n1d581 0 826 3849\n1d581 2 830 3849\n1d583 15 832 3849\n1d598 3 835 3849\n1d59b 1 836 3849\n1d59c 2 833 3849\n1d59e 1 836 3849\nFUNC 1d59f 32 0 LcidFromHexString\n1d59f 1 893 3849\n1d5a0 2 895 3849\n1d5a2 2 897 3849\n1d5a4 9 899 3849\n1d5ad 5 900 3849\n1d5b2 8 901 3849\n1d5ba 3 902 3849\n1d5bd 10 903 3849\n1d5cd 3 906 3849\n1d5d0 1 907 3849\nFUNC 1d5d1 1b 0 GetPrimaryLen\n1d5d1 0 926 3849\n1d5d1 2 927 3849\n1d5d3 3 930 3849\n1d5d6 12 931 3849\n1d5e8 1 933 3849\n1d5e9 2 935 3849\n1d5eb 1 938 3849\nFUNC 1d5ec 96 4 CountryEnumProc\n1d5ec 15 717 3849\n1d601 7 718 3849\n1d608 f 719 3849\n1d617 23 725 3849\n1d63a 3 728 3849\n1d63d 3 729 3849\n1d640 12 731 3849\n1d652 b 734 3849\n1d65d a 738 3849\n1d667 b 741 3849\n1d672 10 742 3849\nFUNC 1d682 72 8 TestDefaultLanguage\n1d682 11 858 3849\n1d693 22 864 3849\n1d6b5 4 865 3849\n1d6b9 d 867 3849\n1d6c6 1c 871 3849\n1d6e2 2 872 3849\n1d6e4 3 874 3849\n1d6e7 d 875 3849\nFUNC 1d6f4 1d0 4 LangCountryEnumProc\n1d6f4 16 435 3849\n1d70a 7 436 3849\n1d711 d 437 3849\n1d71e 27 444 3849\n1d745 4 447 3849\n1d749 8 448 3849\n1d751 16 450 3849\n1d767 1d 456 3849\n1d784 2 460 3849\n1d786 11 462 3849\n1d797 7 467 3849\n1d79e 5 468 3849\n1d7a3 6 472 3849\n1d7a9 1a 475 3849\n1d7c3 14 482 3849\n1d7d7 3 483 3849\n1d7da a 487 3849\n1d7e4 b 490 3849\n1d7ef 6 493 3849\n1d7f5 3 494 3849\n1d7f8 12 501 3849\n1d80a 1d 506 3849\n1d827 6 510 3849\n1d82d c 513 3849\n1d839 16 518 3849\n1d84f 8 522 3849\n1d857 14 528 3849\n1d86b 2 531 3849\n1d86d 2 540 3849\n1d86f 1b 550 3849\n1d88a f 553 3849\n1d899 7 557 3849\n1d8a0 5 558 3849\n1d8a5 3 559 3849\n1d8a8 b 566 3849\n1d8b3 11 567 3849\nFUNC 1d8c4 bf 4 LanguageEnumProc\n1d8c4 15 624 3849\n1d8d9 7 625 3849\n1d8e0 f 626 3849\n1d8ef 23 632 3849\n1d912 3 635 3849\n1d915 3 636 3849\n1d918 11 639 3849\n1d929 7 643 3849\n1d930 2 650 3849\n1d932 1d 651 3849\n1d94f f 654 3849\n1d95e a 658 3849\n1d968 b 662 3849\n1d973 10 663 3849\nFUNC 1d983 2c 0 GetLcidFromCountry\n1d983 0 686 3849\n1d983 10 687 3849\n1d993 11 689 3849\n1d9a4 6 693 3849\n1d9aa 4 694 3849\n1d9ae 1 695 3849\nFUNC 1d9af 65 0 GetLcidFromLangCountry\n1d9af 0 386 3849\n1d9af 7 388 3849\n1d9b6 1a 389 3849\n1d9d0 5 390 3849\n1d9d5 17 392 3849\n1d9ec 10 394 3849\n1d9fc 13 402 3849\n1da0f 4 403 3849\n1da13 1 404 3849\nFUNC 1da14 3c 0 GetLcidFromLanguage\n1da14 0 591 3849\n1da14 13 593 3849\n1da27 e 594 3849\n1da35 10 596 3849\n1da45 6 600 3849\n1da4b 4 601 3849\n1da4f 1 602 3849\nFUNC 1da50 1e3 c __get_qualified_locale\n1da50 4 205 3849\n1da54 5 208 3849\n1da59 12 212 3849\n1da6b 7 215 3849\n1da72 5 217 3849\n1da77 3 222 3849\n1da7a f 223 3849\n1da89 10 226 3849\n1da99 d 230 3849\n1daa6 a 232 3849\n1dab0 5 235 3849\n1dab5 2 237 3849\n1dab7 5 240 3849\n1dabc 5 243 3849\n1dac1 14 248 3849\n1dad5 a 250 3849\n1dadf 5 252 3849\n1dae4 2 254 3849\n1dae6 5 256 3849\n1daeb 2 261 3849\n1daed a 263 3849\n1daf7 28 266 3849\n1db1f 2 268 3849\n1db21 13 271 3849\n1db34 3 277 3849\n1db37 6 278 3849\n1db3d 17 281 3849\n1db54 32 285 3849\n1db86 d 289 3849\n1db93 6 290 3849\n1db99 8 293 3849\n1dba1 7 295 3849\n1dba8 8 296 3849\n1dbb0 4 297 3849\n1dbb4 8 301 3849\n1dbbc d 305 3849\n1dbc9 23 306 3849\n1dbec 2 307 3849\n1dbee f 308 3849\n1dbfd 2 309 3849\n1dbff 12 311 3849\n1dc11 2 312 3849\n1dc13 14 313 3849\n1dc27 5 315 3849\n1dc2c 6 286 3849\n1dc32 1 316 3849\nFUNC 1dc33 12 0 cmpResult\nFUNC 1dc45 18 0 cmpBYTE\nFUNC 1dc5d 40 0 cmpWORD\nFUNC 1dc9d 78 0 cmpDWORD\nFUNC 1dd15 1490 0 unaligned_memcmp\nFUNC 1f1a5 1680 c memcmp\nFUNC 20825 be c strncmp\n20825 4 42 876\n20829 5 43 876\n2082e 7 45 876\n20835 7 46 876\n2083c 6 48 876\n20842 d 51 876\n2084f 11 56 876\n20860 c 61 876\n2086c c 66 876\n20878 15 71 876\n2088d 2 81 876\n2088f a 73 876\n20899 a 68 876\n208a3 a 63 876\n208ad 10 58 876\n208bd 2 79 876\n208bf a 81 876\n208c9 1 85 876\n208ca 4 86 876\n208ce 5 79 876\n208d3 4 89 876\n208d7 2 90 876\n208d9 a 83 876\nFUNC 208f0 40 8 strpbrk\n208f0 4 191 869\n208f4 2 198 869\n208f6 1 199 869\n208f7 1 200 869\n208f8 1 201 869\n208f9 1 202 869\n208fa 1 203 869\n208fb 1 204 869\n208fc 1 205 869\n208fd 1 206 869\n208fe 6 212 869\n20904 2 216 869\n20906 2 217 869\n20908 2 218 869\n2090a 3 219 869\n2090d 4 220 869\n20911 2 221 869\n20913 5 227 869\n20918 2 236 869\n2091a 2 237 869\n2091c 2 238 869\n2091e 3 239 869\n20921 4 240 869\n20925 2 247 869\n20927 3 248 869\n2092a 3 257 869\n2092d 3 259 869\nFUNC 20930 82 c _iswctype_l\n20930 6 66 6445\n20936 8 69 6445\n2093e 6 70 6445\n20944 8 71 6445\n2094c 18 72 6445\n20964 2 73 6445\n20966 b 75 6445\n20971 25 85 6445\n20996 3 86 6445\n20999 d 87 6445\n209a6 a 89 6445\n209b0 2 90 6445\nFUNC 209b2 6e 8 iswctype\n209b2 4 96 6445\n209b6 8 97 6445\n209be 2 99 6445\n209c0 2 122 6445\n209c2 8 101 6445\n209ca 14 103 6445\n209de 2 122 6445\n209e0 9 106 6445\n209e9 25 117 6445\n20a0e 10 121 6445\n20a1e 2 122 6445\nFUNC 20a20 5 8 is_wctype\n20a20 0 148 6445\n20a20 5 149 6445\nFUNC 20a25 22b 14 strtoxl\n20a25 8 80 6309\n20a2d b 86 6309\n20a38 3 89 6309\n20a3b b 92 6309\n20a46 30 94 6309\n20a76 11 95 6309\n20a87 c 100 6309\n20a93 34 101 6309\n20ac7 5 102 6309\n20acc 5 104 6309\n20ad1 4 105 6309\n20ad5 2 106 6309\n20ad7 5 108 6309\n20adc 3 109 6309\n20adf 1d 111 6309\n20afc 4 118 6309\n20b00 5 121 6309\n20b05 9 122 6309\n20b0e a 123 6309\n20b18 9 126 6309\n20b21 7 124 6309\n20b28 2 129 6309\n20b2a 5 140 6309\n20b2f f 142 6309\n20b3e 1 143 6309\n20b3f 9 144 6309\n20b48 8 149 6309\n20b50 c 154 6309\n20b5c 8 155 6309\n20b64 7 156 6309\n20b6b 13 157 6309\n20b7e 5 160 6309\n20b83 4 164 6309\n20b87 b 171 6309\n20b92 4 177 6309\n20b96 6 178 6309\n20b9c 8 190 6309\n20ba4 6 193 6309\n20baa 3 195 6309\n20bad 4 196 6309\n20bb1 2 198 6309\n20bb3 c 173 6309\n20bbf 3 185 6309\n20bc2 2 186 6309\n20bc4 24 201 6309\n20be8 5 204 6309\n20bed c 205 6309\n20bf9 6 206 6309\n20bff 10 207 6309\n20c0f 7 213 6309\n20c16 2 215 6309\n20c18 6 217 6309\n20c1e 3 219 6309\n20c21 12 221 6309\n20c33 7 113 6309\n20c3a 2 115 6309\n20c3c 12 116 6309\n20c4e 2 222 6309\nFUNC 20c50 29 c strtol\n20c50 3 229 6309\n20c53 8 230 6309\n20c5b 13 232 6309\n20c6e 9 236 6309\n20c77 2 238 6309\nFUNC 20c79 1b 10 _strtol_l\n20c79 0 246 6309\n20c79 1a 247 6309\n20c93 1 248 6309\nFUNC 20c94 2a c strtoul\n20c94 3 255 6309\n20c97 7 256 6309\n20c9e 14 258 6309\n20cb2 a 262 6309\n20cbc 2 264 6309\nFUNC 20cbe 1b 10 _strtoul_l\n20cbe 0 272 6309\n20cbe 1a 273 6309\n20cd8 1 274 6309\nFUNC 20cd9 1f 0 __initconin\n20cd9 0 58 5008\n20cd9 1e 65 5008\n20cf7 1 67 5008\nFUNC 20cf8 1f 0 __initconout\n20cf8 0 90 5008\n20cf8 1e 97 5008\n20d16 1 98 5008\nFUNC 20d17 2d 0 __termcon\n20d17 0 120 5008\n20d17 16 121 5008\n20d2d 3 122 5008\n20d30 f 125 5008\n20d3f 4 126 5008\n20d43 1 128 5008\nFUNC 20d44 94 4 _close_nolock\n20d44 1 72 5094\n20d45 54 93 5094\n20d99 a 99 5094\n20da3 2 96 5094\n20da5 6 101 5094\n20dab b 103 5094\n20db6 11 105 5094\n20dc7 7 107 5094\n20dce 5 108 5094\n20dd3 4 111 5094\n20dd7 1 112 5094\nFUNC 20dd8 cd 4 _close\n20dd8 c 42 5094\n20de4 23 46 5094\n20e07 2f 47 5094\n20e36 20 48 5094\n20e56 7 50 5094\n20e5d 3 52 5094\n20e60 9 53 5094\n20e69 c 54 5094\n20e75 2 55 5094\n20e77 b 56 5094\n20e82 4 57 5094\n20e86 c 61 5094\n20e92 3 65 5094\n20e95 6 66 5094\n20e9b a 62 5094\nFUNC 20ea5 2c 4 _freebuf\n20ea5 1 47 1927\n20ea6 f 50 1927\n20eb5 8 52 1927\n20ebd 7 54 1927\n20ec4 8 55 1927\n20ecc 4 56 1927\n20ed0 1 58 1927\nFUNC 20ed1 2a 0 _purecall\n20ed1 0 43 3119\n20ed1 b 44 3119\n20edc 5 45 3119\n20ee1 2 47 3119\n20ee3 7 54 3119\n20eea c 56 3119\n20ef6 5 57 3119\nFUNC 20efb 22 4 _set_purecall_handler\n20efb 1 82 3119\n20efc b 85 3119\n20f07 12 86 3119\n20f19 3 88 3119\n20f1c 1 89 3119\nFUNC 20f1d d 0 _get_purecall_handler\n20f1d 0 92 3119\n20f1d c 93 3119\n20f29 1 94 3119\nFUNC 20f30 34 0 _allmul\n20f30 0 47 5116\n20f30 4 62 5116\n20f34 4 63 5116\n20f38 2 64 5116\n20f3a 4 65 5116\n20f3e 2 66 5116\n20f40 4 68 5116\n20f44 2 69 5116\n20f46 3 71 5116\n20f49 1 74 5116\n20f4a 2 81 5116\n20f4c 2 82 5116\n20f4e 4 84 5116\n20f52 4 85 5116\n20f56 2 86 5116\n20f58 4 88 5116\n20f5c 2 89 5116\n20f5e 2 90 5116\n20f60 1 92 5116\n20f61 3 94 5116\nFUNC 20f64 11 4 atol\n20f64 0 55 6631\n20f64 10 56 6631\n20f74 1 57 6631\nFUNC 20f75 15 8 _atol_l\n20f75 0 64 6631\n20f75 14 65 6631\n20f89 1 66 6631\nFUNC 20f8a 5 4 atoi\n20f8a 0 99 6631\n20f8a 5 100 6631\nFUNC 20f8f 5 8 _atoi_l\n20f8f 0 107 6631\n20f8f 5 108 6631\nFUNC 20f94 11 4 _atoi64\n20f94 0 143 6631\n20f94 10 144 6631\n20fa4 1 145 6631\nFUNC 20fa5 15 8 _atoi64_l\n20fa5 0 151 6631\n20fa5 14 152 6631\n20fb9 1 153 6631\nFUNC 20fba 50 0 has_osfxsr_set\nFUNC 2100a 60 0 _get_sse2_info\nFUNC 2106a d 0 __sse2_available_init\nFUNC 21077 170 8 _flswbuf\n21077 5 93 1980\n2107c c 104 1980\n21088 8 106 1980\n21090 b 107 1980\n2109b 4 108 1980\n2109f a 109 1980\n210a9 4 110 1980\n210ad b 111 1980\n210b8 2 113 1980\n210ba 4 124 1980\n210be 4 125 1980\n210c2 8 126 1980\n210ca 3 127 1980\n210cd 8 128 1980\n210d5 3 137 1980\n210d8 11 138 1980\n210e9 9 141 1980\n210f2 25 151 1980\n21117 7 153 1980\n2111e d 158 1980\n2112b 5 162 1980\n21130 5 163 1980\n21135 7 164 1980\n2113c 7 166 1980\n21143 10 167 1980\n21153 2 168 1980\n21155 6 131 1980\n2115b 5 132 1980\n21160 2e 169 1980\n2118e 13 171 1980\n211a1 2 174 1980\n211a3 9 181 1980\n211ac 2 186 1980\n211ae 1d 195 1980\n211cb 5 201 1980\n211d0 4 202 1980\n211d4 7 203 1980\n211db a 209 1980\n211e5 2 212 1980\nFUNC 211e7 182 4 _wchartodigit\n211e7 0 32 6613\n211e7 1b 41 6613\n21202 1 73 6613\n21203 e 42 6613\n21211 19 44 6613\n2122a 1 73 6613\n2122b 14 45 6613\n2123f 14 46 6613\n21253 14 47 6613\n21267 14 48 6613\n2127b 14 49 6613\n2128f 14 50 6613\n212a3 18 51 6613\n212bb 18 52 6613\n212d3 18 53 6613\n212eb 14 54 6613\n212ff 14 55 6613\n21313 12 56 6613\n21325 14 57 6613\n21339 14 58 6613\n2134d c 59 6613\n21359 2 62 6613\n2135b 4 67 6613\n2135f 6 69 6613\n21365 3 71 6613\n21368 1 73 6613\nFUNC 21369 b6 c _isctype_l\n21369 7 114 6399\n21370 b 118 6399\n2137b d 121 6399\n21388 f 122 6399\n21397 1f 124 6399\n213b6 3 126 6399\n213b9 d 129 6399\n213c6 2 130 6399\n213c8 a 133 6399\n213d2 26 144 6399\n213f8 10 146 6399\n21408 15 149 6399\n2141d 2 150 6399\nFUNC 2141f 2f 8 _isctype\n2141f 0 156 6399\n2141f 9 157 6399\n21428 12 159 6399\n2143a 1 165 6399\n2143b 12 163 6399\n2144d 1 165 6399\nFUNC 21450 2c 0 _alloca_probe_16\n21450 0 44 2632\n21450 1 46 2632\n21451 4 47 2632\n21455 2 48 2632\n21457 3 49 2632\n2145a 2 50 2632\n2145c 2 51 2632\n2145e 2 52 2632\n21460 1 53 2632\n21461 5 54 2632\n21466 1 59 2632\n21467 4 60 2632\n2146b 2 61 2632\n2146d 3 62 2632\n21470 2 63 2632\n21472 2 64 2632\n21474 2 65 2632\n21476 1 66 2632\n21477 5 67 2632\nPUBLIC 21466 0 _alloca_probe_8\nFUNC 2147c 47 4 __ansicp\n2147c 10 39 2934\n2148c 1c 44 2934\n214a8 3 45 2934\n214ab 2 46 2934\n214ad a 47 2934\n214b7 c 49 2934\nFUNC 214c3 1b2 18 __convertcp\n214c3 16 79 2934\n214d9 10 83 2934\n214e9 18 85 2934\n21501 17 90 2934\n21518 13 92 2934\n2152b 6 93 2934\n21531 d 99 2934\n2153e 2 101 2934\n21540 c 103 2934\n2154c 2a 115 2934\n21576 15 111 2934\n2158b 7 112 2934\n21592 1c 115 2934\n215ae 3 116 2934\n215b1 2 117 2934\n215b3 10 119 2934\n215c3 15 127 2934\n215d8 7 129 2934\n215df 18 138 2934\n215f7 3 139 2934\n215fa 2 140 2934\n215fc 1f 149 2934\n2161b 11 151 2934\n2162c 12 160 2934\n2163e 9 162 2934\n21647 3 163 2934\n2164a 2 164 2934\n2164c 6 165 2934\n21652 5 166 2934\n21657 9 174 2934\n21660 3 177 2934\n21663 12 178 2934\nFUNC 21675 34 4 _get_daylight\n21675 0 35 487\n21675 27 36 487\n2169c 1 41 487\n2169d 8 39 487\n216a5 3 40 487\n216a8 1 41 487\nFUNC 216a9 34 4 _get_dstbias\n216a9 0 44 487\n216a9 27 45 487\n216d0 1 50 487\n216d1 8 48 487\n216d9 3 49 487\n216dc 1 50 487\nFUNC 216dd 34 4 _get_timezone\n216dd 0 53 487\n216dd 27 54 487\n21704 1 59 487\n21705 8 57 487\n2170d 3 58 487\n21710 1 59 487\nFUNC 21711 a2 10 _get_tzname\n21711 3 62 487\n21714 10 63 487\n21724 4 64 487\n21728 3 66 487\n2172b 7 68 487\n21732 27 69 487\n21759 20 63 487\n21779 f 72 487\n21788 8 73 487\n21790 4 76 487\n21794 5 78 487\n21799 5 80 487\n2179e 13 82 487\n217b1 2 83 487\nFUNC 217b3 6 0 __daylight\n217b3 0 118 487\n217b3 5 119 487\n217b8 1 120 487\nFUNC 217b9 6 0 __dstbias\n217b9 0 123 487\n217b9 5 124 487\n217be 1 125 487\nFUNC 217bf 6 0 __timezone\n217bf 0 128 487\n217bf 5 129 487\n217c4 1 130 487\nFUNC 217c5 6 0 __tzname\n217c5 0 133 487\n217c5 5 134 487\n217ca 1 135 487\nFUNC 217cb c 4 _set_daylight\n217cb c 189 418\nFUNC 217d7 c 4 _set_dstbias\n217d7 c 190 418\nFUNC 217e3 c 4 _set_timezone\n217e3 c 191 418\nFUNC 217ef 349 0 _tzset_nolock\n217ef c 124 440\n217fb 5 127 440\n21800 3 129 440\n21803 3 130 440\n21806 3 131 440\n21809 3 132 440\n2180c 3 133 440\n2180f 8 135 440\n21817 3 136 440\n2181a 8 139 440\n21822 1b 142 440\n2183d 1b 143 440\n21858 1b 144 440\n21873 8 149 440\n2187b 6 154 440\n21881 f 160 440\n21890 18 165 440\n218a8 14 260 440\n218bc b 268 440\n218c7 4 274 440\n218cb 7 275 440\n218d2 16 277 440\n218e8 6 281 440\n218ee 32 283 440\n21920 9 174 440\n21929 7 175 440\n21930 6 176 440\n21936 13 179 440\n21949 9 183 440\n21952 b 188 440\n2195d 9 190 440\n21966 e 191 440\n21974 12 199 440\n21986 3 201 440\n21989 c 203 440\n21995 2 205 440\n21997 3 206 440\n2199a 3 214 440\n2199d 27 234 440\n219c4 8 235 440\n219cc 2 236 440\n219ce 7 237 440\n219d5 23 247 440\n219f8 9 248 440\n21a01 2 249 440\n21a03 8 250 440\n21a0b 7 256 440\n21a12 a 288 440\n21a1c a 289 440\n21a26 a 290 440\n21a30 c 292 440\n21a3c 9 296 440\n21a45 23 301 440\n21a68 8 310 440\n21a70 7 311 440\n21a77 1 312 440\n21a78 10 318 440\n21a88 11 320 440\n21a99 5 292 440\n21a9e 9 293 440\n21aa7 5 325 440\n21aac e 329 440\n21aba d 330 440\n21ac7 5 335 440\n21acc b 339 440\n21ad7 d 340 440\n21ae4 5 344 440\n21ae9 3 345 440\n21aec 6 350 440\n21af2 4 351 440\n21af6 21 352 440\n21b17 2 354 440\n21b19 5 355 440\n21b1e a 357 440\n21b28 a 358 440\n21b32 6 360 440\nFUNC 21b38 1f5 24 cvtdate\n21b38 6 409 440\n21b3e 4 412 440\n21b42 c 414 440\n21b4e 52 424 440\n21ba0 4c 430 440\n21bec 14 436 440\n21c00 2 437 440\n21c02 2 438 440\n21c04 46 447 440\n21c4a 3 449 440\n21c4d 2 452 440\n21c4f 3c 457 440\n21c8b 3 459 440\n21c8e 27 467 440\n21cb5 6 472 440\n21cbb 2 474 440\n21cbd 29 485 440\n21ce6 11 486 440\n21cf7 a 487 440\n21d01 8 488 440\n21d09 d 490 440\n21d16 6 491 440\n21d1c 6 492 440\n21d22 9 499 440\n21d2b 2 503 440\nFUNC 21d2d 1ae 0 _isindst_nolock\n21d2d 5 554 440\n21d32 20 558 440\n21d52 5 560 440\n21d57 7 561 440\n21d5e 1b 568 440\n21d79 c 569 440\n21d85 7 573 440\n21d8c 34 584 440\n21dc0 2 585 440\n21dc2 19 596 440\n21ddb 40 611 440\n21e1b 2 612 440\n21e1d 1e 623 440\n21e3b 2 626 440\n21e3d 14 641 440\n21e51 1a 653 440\n21e6b d 660 440\n21e78 d 664 440\n21e85 8 666 440\n21e8d 4 674 440\n21e91 2 697 440\n21e93 8 673 440\n21e9b 8 675 440\n21ea3 4 676 440\n21ea7 14 679 440\n21ebb 4 681 440\n21ebf b 682 440\n21eca 2 685 440\n21ecc d 691 440\n21ed9 2 694 440\nFUNC 21edb 4f 0 __tzset\n21edb c 85 440\n21ee7 a 88 440\n21ef1 8 90 440\n21ef9 3 91 440\n21efc 8 93 440\n21f04 5 94 440\n21f09 6 95 440\n21f0f c 98 440\n21f1b 6 103 440\n21f21 9 99 440\nFUNC 21f2a 38 0 _tzset\n21f2a c 109 440\n21f36 8 110 440\n21f3e 4 111 440\n21f42 5 113 440\n21f47 c 115 440\n21f53 6 118 440\n21f59 9 116 440\nFUNC 21f62 41 4 _isindst\n21f62 c 538 440\n21f6e 8 541 440\n21f76 4 542 440\n21f7a b 543 440\n21f85 c 544 440\n21f91 3 548 440\n21f94 6 549 440\n21f9a 9 545 440\nFUNC 21fa3 35 8 __ascii_stricmp\n21fa3 a 75 693\n21fad c 80 693\n21fb9 3 81 693\n21fbc c 82 693\n21fc8 3 83 693\n21fcb 9 85 693\n21fd4 3 87 693\n21fd7 1 88 693\nFUNC 21fd8 d3 c _stricmp_l\n21fd8 7 47 693\n21fdf b 49 693\n21fea 36 52 693\n22020 32 53 693\n22052 8 55 693\n2205a e 57 693\n22068 15 63 693\n2207d 11 64 693\n2208e 8 65 693\n22096 13 68 693\n220a9 2 69 693\nFUNC 220ab 50 8 _stricmp\n220ab 4 94 693\n220af a 95 693\n220b9 24 98 693\n220dd 6 99 693\n220e3 1 107 693\n220e4 5 101 693\n220e9 10 105 693\n220f9 2 107 693\nFUNC 220fb f0 10 _strnicmp_l\n220fb 7 51 650\n22102 d 54 650\n2210f b 56 650\n2211a 33 59 650\n2214d 7 60 650\n22154 32 61 650\n22186 8 63 650\n2218e 1d 65 650\n221ab 15 71 650\n221c0 11 72 650\n221d1 d 74 650\n221de 6 76 650\n221e4 5 79 650\n221e9 2 80 650\nFUNC 221eb 5c c _strnicmp\n221eb 4 125 650\n221ef a 127 650\n221f9 24 130 650\n2221d 5 131 650\n22222 a 132 650\n2222c 1 141 650\n2222d 5 134 650\n22232 13 138 650\n22245 2 141 650\nFUNC 22247 db c xtoa_s\n22247 8 93 6581\n2224f 24 102 6581\n22273 24 103 6581\n22297 19 105 6581\n222b0 b 106 6581\n222bb a 112 6581\n222c5 6 114 6581\n222cb 7 116 6581\n222d2 2 118 6581\n222d4 2 121 6581\n222d6 5 124 6581\n222db 5 128 6581\n222e0 3 129 6581\n222e3 2 130 6581\n222e5 6 131 6581\n222eb 3 135 6581\n222ee e 136 6581\n222fc 8 139 6581\n22304 2 141 6581\n22306 2 142 6581\n22308 3 148 6581\n2230b 6 152 6581\n22311 3 154 6581\n22314 1 155 6581\n22315 4 156 6581\n22319 5 158 6581\n2231e 4 160 6581\nFUNC 22322 28 10 _itoa_s\n22322 3 172 6581\n22325 d 175 6581\n22332 4 176 6581\n22336 2 177 6581\n22338 10 178 6581\n22348 2 181 6581\nFUNC 2234a 25 10 _ltoa_s\n2234a 3 189 6581\n2234d 20 190 6581\n2236d 2 191 6581\nFUNC 2236f 18 10 _ultoa_s\n2236f 0 199 6581\n2236f 17 200 6581\n22386 1 201 6581\nFUNC 22387 f6 14 x64toa_s\n22387 7 309 6581\n2238e 25 318 6581\n223b3 5 319 6581\n223b8 19 321 6581\n223d1 b 322 6581\n223dc 3 327 6581\n223df 20 333 6581\n223ff 3 336 6581\n22402 1e 352 6581\n22420 3 344 6581\n22423 2 345 6581\n22425 5 346 6581\n2242a 5 351 6581\n2242f 13 352 6581\n22442 5 355 6581\n22447 3 357 6581\n2244a 13 358 6581\n2245d 4 364 6581\n22461 9 368 6581\n2246a 3 370 6581\n2246d 1 371 6581\n2246e 7 372 6581\n22475 4 375 6581\n22479 4 377 6581\nFUNC 2247d 33 14 _i64toa_s\n2247d 3 390 6581\n22480 2e 391 6581\n224ae 2 392 6581\nFUNC 224b0 1d 14 _ui64toa_s\n224b0 4 400 6581\n224b4 17 401 6581\n224cb 2 402 6581\nFUNC 224cd 224 1c __crtGetStringTypeW_stat\n224cd 10 64 2828\n224dd 9 72 2828\n224e6 7 73 2828\n224ed 14 75 2828\n22501 11 79 2828\n22512 8 80 2828\n2251a b 82 2828\n22525 f 83 2828\n22534 4 88 2828\n22538 13 90 2828\n2254b 7 95 2828\n22552 2 199 2828\n22554 8 119 2828\n2255c b 120 2828\n22567 5 121 2828\n2256c b 122 2828\n22577 e 128 2828\n22585 5 130 2828\n2258a 3 131 2828\n2258d 1d 142 2828\n225aa 6 143 2828\n225b0 40 146 2828\n225f0 3 147 2828\n225f3 6 148 2828\n225f9 d 150 2828\n22606 1a 160 2828\n22620 4d 164 2828\n2266d 4 165 2828\n22671 5 170 2828\n22676 b 171 2828\n22681 3 174 2828\n22684 23 178 2828\n226a7 12 186 2828\n226b9 f 189 2828\n226c8 4 187 2828\n226cc 7 191 2828\n226d3 8 194 2828\n226db 4 196 2828\n226df 12 200 2828\nFUNC 226f1 3e 1c __crtGetStringTypeW\n226f1 6 211 2828\n226f7 b 212 2828\n22702 2b 222 2828\n2272d 2 223 2828\nFUNC 2272f 294 14 strtoxq\n2272f 8 80 6264\n22737 b 86 6264\n22742 3 89 6264\n22745 b 92 6264\n22750 31 94 6264\n22781 12 95 6264\n22793 c 100 6264\n2279f 37 102 6264\n227d6 2 103 6264\n227d8 9 105 6264\n227e1 4 106 6264\n227e5 2 107 6264\n227e7 6 109 6264\n227ed 9 110 6264\n227f6 8 112 6264\n227fe 6 115 6264\n22804 9 116 6264\n2280d a 117 6264\n22817 9 120 6264\n22820 3 118 6264\n22823 5 123 6264\n22828 10 125 6264\n22838 1 126 6264\n22839 9 127 6264\n22842 26 132 6264\n22868 e 137 6264\n22876 8 138 6264\n2287e 6 139 6264\n22884 11 140 6264\n22895 5 143 6264\n2289a 31 154 6264\n228cb 4 160 6264\n228cf 6 161 6264\n228d5 a 173 6264\n228df 7 176 6264\n228e6 6 178 6264\n228ec 6 179 6264\n228f2 5 181 6264\n228f7 19 156 6264\n22910 b 168 6264\n2291b 5 169 6264\n22920 35 184 6264\n22955 5 187 6264\n2295a c 188 6264\n22966 a 189 6264\n22970 6 190 6264\n22976 7 191 6264\n2297d 2 192 6264\n2297f 7 193 6264\n22986 8 195 6264\n2298e 5 197 6264\n22993 6 199 6264\n22999 13 201 6264\n229ac 15 203 6264\n229c1 2 204 6264\nFUNC 229c3 29 c _strtoi64\n229c3 3 211 6264\n229c6 8 212 6264\n229ce 13 214 6264\n229e1 9 218 6264\n229ea 2 220 6264\nFUNC 229ec 1b 10 _strtoi64_l\n229ec 0 227 6264\n229ec 1a 228 6264\n22a06 1 229 6264\nFUNC 22a07 2a c _strtoui64\n22a07 3 236 6264\n22a0a 7 237 6264\n22a11 14 239 6264\n22a25 a 243 6264\n22a2f 2 245 6264\nFUNC 22a31 1b 10 _strtoui64_l\n22a31 0 253 6264\n22a31 1a 254 6264\n22a4b 1 255 6264\nFUNC 22a50 2b 0 _chkstk\n22a50 0 65 2634\n22a50 1 69 2634\n22a51 4 73 2634\n22a55 2 74 2634\n22a57 2 79 2634\n22a59 2 80 2634\n22a5b 2 81 2634\n22a5d 2 83 2634\n22a5f 5 84 2634\n22a64 2 87 2634\n22a66 2 88 2634\n22a68 2 89 2634\n22a6a 1 90 2634\n22a6b 1 91 2634\n22a6c 2 92 2634\n22a6e 3 93 2634\n22a71 1 94 2634\n22a72 5 98 2634\n22a77 2 99 2634\n22a79 2 100 2634\nFUNC 22a7b 81 4 _getenv_helper_nolock\n22a7b 0 95 3904\n22a7b 10 103 3904\n22a8b 3 104 3904\n22a8e 1 169 3904\n22a8f e 128 3904\n22a9d 7 131 3904\n22aa4 2 132 3904\n22aa6 6 135 3904\n22aac c 140 3904\n22ab8 9 142 3904\n22ac1 2 150 3904\n22ac3 22 154 3904\n22ae5 3 164 3904\n22ae8 6 150 3904\n22aee 5 168 3904\n22af3 9 169 3904\nFUNC 22afc 93 c _getenv_s_helper\n22afc 7 220 3904\n22b03 21 224 3904\n22b24 15 226 3904\n22b39 4 227 3904\n22b3d 3 229 3904\n22b40 a 233 3904\n22b4a 3 234 3904\n22b4d 2 236 3904\n22b4f 7 239 3904\n22b56 6 240 3904\n22b5c 2 243 3904\n22b5e 5 246 3904\n22b63 5 251 3904\n22b68 20 254 3904\n22b88 5 256 3904\n22b8d 2 257 3904\nFUNC 22b8f a2 8 _dupenv_s_helper\n22b8f 6 339 3904\n22b95 21 344 3904\n22bb6 9 346 3904\n22bbf 2 348 3904\n22bc1 5 350 3904\n22bc6 8 352 3904\n22bce 6 353 3904\n22bd4 2 355 3904\n22bd6 9 358 3904\n22bdf b 362 3904\n22bea 6 364 3904\n22bf0 b 366 3904\n22bfb 9 367 3904\n22c04 1e 370 3904\n22c22 7 371 3904\n22c29 2 373 3904\n22c2b 4 375 3904\n22c2f 2 376 3904\nFUNC 22c31 83 4 getenv\n22c31 c 75 3904\n22c3d 2a 78 3904\n22c67 18 79 3904\n22c7f 8 81 3904\n22c87 3 82 3904\n22c8a c 83 3904\n22c96 c 85 3904\n22ca2 3 89 3904\n22ca5 6 90 3904\n22cab 9 86 3904\nFUNC 22cb4 d8 10 getenv_s\n22cb4 c 198 3904\n22cc0 8 201 3904\n22cc8 5 202 3904\n22ccd a1 203 3904\n22d6e c 205 3904\n22d7a 3 209 3904\n22d7d 6 210 3904\n22d83 9 206 3904\nFUNC 22d8c e6 c _dupenv_s\n22d8c c 303 3904\n22d98 8 306 3904\n22da0 5 307 3904\n22da5 af 311 3904\n22e54 c 314 3904\n22e60 3 318 3904\n22e63 6 319 3904\n22e69 9 315 3904\nFUNC 22e72 8 4 _tolower\n22e72 0 48 6218\n22e72 7 49 6218\n22e79 1 50 6218\nFUNC 22e7a 117 8 _tolower_l\n22e7a 8 70 6218\n22e82 b 74 6218\n22e8d c 77 6218\n22e99 31 79 6218\n22eca f 80 6218\n22ed9 14 82 6218\n22eed 2b 86 6218\n22f18 3 88 6218\n22f1b d 91 6218\n22f28 2 92 6218\n22f2a b 94 6218\n22f35 a 97 6218\n22f3f 25 110 6218\n22f64 6 112 6218\n22f6a 5 116 6218\n22f6f 6 117 6218\n22f75 1a 119 6218\n22f8f 2 120 6218\nFUNC 22f91 27 4 tolower\n22f91 0 143 6218\n22f91 9 145 6218\n22f9a f 147 6218\n22fa9 1 153 6218\n22faa d 151 6218\n22fb7 1 153 6218\nFUNC 22fc0 61 c __ascii_strnicmp\n22fc0 6 69 871\n22fc6 3 75 871\n22fc9 2 76 871\n22fcb 2 77 871\n22fcd 3 79 871\n22fd0 3 80 871\n22fd3 2 82 871\n22fd5 2 83 871\n22fd7 5 84 871\n22fdc 2 89 871\n22fde 2 91 871\n22fe0 2 93 871\n22fe2 2 95 871\n22fe4 2 97 871\n22fe6 2 98 871\n22fe8 3 100 871\n22feb 3 101 871\n22fee 2 103 871\n22ff0 2 104 871\n22ff2 2 106 871\n22ff4 2 107 871\n22ff6 2 109 871\n22ff8 2 112 871\n22ffa 2 113 871\n22ffc 2 115 871\n22ffe 2 116 871\n23000 2 118 871\n23002 2 121 871\n23004 2 122 871\n23006 3 124 871\n23009 2 125 871\n2300b 2 128 871\n2300d 2 129 871\n2300f 2 130 871\n23011 5 133 871\n23016 2 134 871\n23018 2 135 871\n2301a 2 138 871\n2301c 5 140 871\nFUNC 23021 ec 10 _mbsnbicoll_l\n23021 7 53 4518\n23028 b 55 4518\n23033 9 57 4518\n2303c 13 58 4518\n2304f 33 61 4518\n23082 6 62 4518\n23088 23 63 4518\n230ab 8 65 4518\n230b3 14 66 4518\n230c7 23 74 4518\n230ea 10 75 4518\n230fa 11 77 4518\n2310b 2 79 4518\nFUNC 2310d 17 c _mbsnbicoll\n2310d 0 85 4518\n2310d 16 86 4518\n23123 1 87 4518\nFUNC 23124 95 0 __wtomb_environ\n23124 7 43 2699\n2312b 3 44 2699\n2312e 9 45 2699\n23137 c 52 2699\n23143 12 57 2699\n23155 11 61 2699\n23166 12 65 2699\n23178 10 72 2699\n23188 5 74 2699\n2318d 9 76 2699\n23196 3 77 2699\n23199 9 81 2699\n231a2 5 84 2699\n231a7 2 85 2699\n231a9 5 58 2699\n231ae 9 67 2699\n231b7 2 68 2699\nFUNC 231b9 1a 8 strnlen\n231b9 0 38 864\n231b9 19 45 864\n231d2 1 49 864\nFUNC 231d3 1a 4 strncnt\n231d3 0 50 4345\n231d3 6 51 4345\n231d9 6 54 4345\n231df 1 55 4345\n231e0 5 54 4345\n231e5 7 57 4345\n231ec 1 58 4345\nFUNC 231ed 389 18 __crtCompareStringA_stat\n231ed 10 96 4345\n231fd 31 280 4345\n2322e c 107 4345\n2323a b 109 4345\n23245 a 110 4345\n2324f 5 118 4345\n23254 1b 119 4345\n2326f 7 122 4345\n23276 1f 123 4345\n23295 6 120 4345\n2329b 7 121 4345\n232a2 3 124 4345\n232a5 2 125 4345\n232a7 17 130 4345\n232be 7 189 4345\n232c5 8 201 4345\n232cd 8 202 4345\n232d5 d 208 4345\n232e2 5 214 4345\n232e7 8 215 4345\n232ef 2 218 4345\n232f1 6 219 4345\n232f7 5 222 4345\n232fc 4 223 4345\n23300 f 231 4345\n2330f 2 232 4345\n23311 5 237 4345\n23316 4 239 4345\n2331a 2 240 4345\n2331c 10 244 4345\n2332c a 246 4345\n23336 7 244 4345\n2333d 2 262 4345\n2333f 5 253 4345\n23344 6 255 4345\n2334a 8 256 4345\n23352 10 260 4345\n23362 11 262 4345\n23373 7 260 4345\n2337a 2 262 4345\n2337c 1a 280 4345\n23396 6 281 4345\n2339c 4d 284 4345\n233e9 4 285 4345\n233ed 6 286 4345\n233f3 19 295 4345\n2340c 17 305 4345\n23423 46 309 4345\n23469 4 310 4345\n2346d 13 320 4345\n23480 17 326 4345\n23497 7 328 4345\n2349e 8 331 4345\n234a6 9 333 4345\n234af 4 132 4345\n234b3 5 137 4345\n234b8 8 138 4345\n234c0 5 139 4345\n234c5 8 140 4345\n234cd e 142 4345\n234db 6 143 4345\n234e1 5 148 4345\n234e6 19 155 4345\n234ff 2 156 4345\n23501 6 157 4345\n23507 19 163 4345\n23520 4 164 4345\n23524 7 166 4345\n2352b 5 167 4345\n23530 3 169 4345\n23533 3 170 4345\n23536 18 178 4345\n2354e 6 179 4345\n23554 6 181 4345\n2355a 8 182 4345\n23562 2 184 4345\n23564 12 337 4345\nFUNC 23576 40 20 __crtCompareStringA\n23576 6 349 4345\n2357c b 350 4345\n23587 2d 361 4345\n235b4 2 362 4345\nFUNC 235b6 f8 10 _strnicoll_l\n235b6 7 55 603\n235bd b 57 603\n235c8 9 59 603\n235d1 13 60 603\n235e4 33 63 603\n23617 6 64 603\n2361d 23 65 603\n23640 a 67 603\n2364a 15 68 603\n2365f 21 78 603\n23680 b 80 603\n2368b 10 81 603\n2369b 11 84 603\n236ac 2 85 603\nFUNC 236ae 27 c _strnicoll\n236ae 3 92 603\n236b1 9 93 603\n236ba 1 101 603\n236bb 5 95 603\n236c0 13 99 603\n236d3 2 101 603\nFUNC 236d5 4d 4 findenv\n236d5 1 387 3036\n236d6 8 390 3036\n236de 12 394 3036\n236f0 d 399 3036\n236fd 9 390 3036\n23706 e 407 3036\n23714 1 408 3036\n23715 c 400 3036\n23721 1 408 3036\nFUNC 23722 5d 0 copy_environ\n23722 4 428 3036\n23726 2 429 3036\n23728 6 434 3036\n2372e 2 464 3036\n23730 7 438 3036\n23737 8 439 3036\n2373f 14 443 3036\n23753 8 444 3036\n2375b 6 448 3036\n23761 11 458 3036\n23772 4 448 3036\n23776 2 461 3036\n23778 5 463 3036\n2377d 2 464 3036\nFUNC 2377f 24c 8 __crtsetenv\n2377f 6 76 3036\n23785 2c 89 3036\n237b1 2 91 3036\n237b3 1c 98 3036\n237cf 5 114 3036\n237d4 13 125 3036\n237e7 c 126 3036\n237f3 4 130 3036\n237f7 d 153 3036\n23804 9 155 3036\n2380d b 100 3036\n23818 6 101 3036\n2381e 2 356 3036\n23820 3 164 3036\n23823 6 165 3036\n23829 f 171 3036\n23838 2 172 3036\n2383a 2 173 3036\n2383c 8 176 3036\n23844 f 178 3036\n23853 2 179 3036\n23855 2 180 3036\n23857 6 196 3036\n2385d 5 197 3036\n23862 2 200 3036\n23864 10 207 3036\n23874 9 210 3036\n2387d a 216 3036\n23887 6 218 3036\n2388d 5 235 3036\n23892 5 238 3036\n23897 5 241 3036\n2389c c 222 3036\n238a8 4 221 3036\n238ac 1d 230 3036\n238c9 2 233 3036\n238cb 9 245 3036\n238d4 4 250 3036\n238d8 2 251 3036\n238da 2f 255 3036\n23909 8 258 3036\n23911 3 259 3036\n23914 5 262 3036\n23919 5 264 3036\n2391e 21 287 3036\n2393f 25 289 3036\n23964 21 338 3036\n23985 4 339 3036\n23989 b 343 3036\n23994 7 346 3036\n2399b 5 349 3036\n239a0 8 351 3036\n239a8 6 352 3036\n239ae 8 355 3036\n239b6 8 271 3036\n239be 6 274 3036\n239c4 7 276 3036\nFUNC 239cb 50 4 _strdup\n239cb 1 66 901\n239cc b 70 901\n239d7 6 71 901\n239dd 9 73 901\n239e6 e 77 901\n239f4 1c 80 901\n23a10 4 81 901\n23a14 6 84 901\n23a1a 1 85 901\nFUNC 23a1b ba c _mbschr_l\n23a1b 7 53 4568\n23a22 b 55 4568\n23a2d 32 58 4568\n23a5f 8 60 4568\n23a67 d 61 4568\n23a74 a 65 4568\n23a7e 7 67 4568\n23a85 10 69 4568\n23a95 3 70 4568\n23a98 8 72 4568\n23aa0 d 63 4568\n23aad 8 76 4568\n23ab5 e 77 4568\n23ac3 10 79 4568\n23ad3 2 80 4568\nFUNC 23ad5 13 8 _mbschr\n23ad5 0 86 4568\n23ad5 12 87 4568\n23ae7 1 88 4568\nFUNC 23b00 be 8 strchr\n23b00 0 60 928\n23b00 2 68 928\n23b02 4 69 928\n23b06 1 73 928\n23b07 2 74 928\n23b09 3 75 928\n23b0c 4 76 928\n23b10 6 77 928\n23b16 2 78 928\n23b18 2 81 928\n23b1a 3 82 928\n23b1d 2 83 928\n23b1f 2 84 928\n23b21 2 85 928\n23b23 2 86 928\n23b25 6 87 928\n23b2b 2 88 928\n23b2d 2 91 928\n23b2f 1 92 928\n23b30 2 93 928\n23b32 3 94 928\n23b35 1 95 928\n23b36 2 96 928\n23b38 2 101 928\n23b3a 5 102 928\n23b3f 2 104 928\n23b41 2 105 928\n23b43 2 107 928\n23b45 2 108 928\n23b47 2 110 928\n23b49 3 111 928\n23b4c 3 113 928\n23b4f 2 114 928\n23b51 2 116 928\n23b53 3 117 928\n23b56 6 119 928\n23b5c 2 120 928\n23b5e 5 124 928\n23b63 2 125 928\n23b65 5 127 928\n23b6a 2 128 928\n23b6c 6 130 928\n23b72 2 131 928\n23b74 1 134 928\n23b75 1 135 928\n23b76 1 137 928\n23b77 2 138 928\n23b79 1 139 928\n23b7a 3 142 928\n23b7d 2 143 928\n23b7f 2 144 928\n23b81 2 145 928\n23b83 2 146 928\n23b85 2 147 928\n23b87 2 148 928\n23b89 2 149 928\n23b8b 2 150 928\n23b8d 3 151 928\n23b90 2 152 928\n23b92 2 153 928\n23b94 2 154 928\n23b96 2 155 928\n23b98 2 156 928\n23b9a 2 157 928\n23b9c 2 158 928\n23b9e 2 159 928\n23ba0 2 160 928\n23ba2 1 163 928\n23ba3 1 164 928\n23ba4 3 165 928\n23ba7 1 166 928\n23ba8 1 167 928\n23ba9 3 170 928\n23bac 1 171 928\n23bad 1 172 928\n23bae 1 173 928\n23baf 1 174 928\n23bb0 3 177 928\n23bb3 1 178 928\n23bb4 1 179 928\n23bb5 1 180 928\n23bb6 1 181 928\n23bb7 3 184 928\n23bba 1 185 928\n23bbb 1 186 928\n23bbc 1 187 928\n23bbd 1 188 928\nPUBLIC 23b06 0 __from_strstr_to_strchr\nFUNC 240b9 14 0 `operator new'::`6'::`dynamic atexit destructor for 'nomem''\nSTACK WIN 4 41b0 86 13 0 8 0 e0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4240 41 3 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4290 18 4 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 42ae 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 42af 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 42c6 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 42d1 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 42d2 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 42f3 3f c 0 0 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4332 3f c 0 0 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4371 3f c 0 0 c 50 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 43b0 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 43b1 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 43c8 af c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4464 12 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 4477 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 448d 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 44a3 14 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 44b7 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 44cd 14 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 44e1 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4506 16 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 451c f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 452b 62 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 452c 60 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 452d 5c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 454a 35 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 458d 42 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 458e 40 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 45cf da c 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 466c 15 0 0 4 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 46a0 8 0 0 4 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 46a9 53 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 46f2 9 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 46fc 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4705 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 470b b1 8 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4713 a8 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4785 33 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 47bc 20 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 47dc 3c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 47dd 3a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4818 2e 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4846 36 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 487c 2a 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 48a6 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 48bc 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 48c1 30 5 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 48c6 2b 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 48f1 7 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 48f8 7 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 48ff 7 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4906 52 8 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 490c 4c 2 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 4958 36 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 498e 36 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 49c4 36 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 49fa 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4a14 30 1 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4a15 2e 0 0 10 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4a44 d5 7 0 1c 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4a4b ce 0 0 1c 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 4b19 9d 5 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4b1e 98 0 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 4bb6 73 7 0 14 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4bbb 6c 2 0 14 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 4bbc 6a 1 0 14 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 4bbd 68 0 0 14 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 4c29 28 5 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4c2e 22 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4c51 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4c72 4c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4c73 4a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4cbe 5e 6 0 14 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4d1c 4a b 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4d26 1b 1 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4d27 16 0 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4d66 19 a 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4d67 17 9 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4d7f 6a 6 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 4de9 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4df8 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e06 1c 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e07 18 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e22 f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e31 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e39 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e54 1c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e70 1f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e8f 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e93 b 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4e9e 5 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4ea3 11 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4eb4 4e 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4eb5 4a 8 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4eba 44 3 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4ebb 42 2 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4f02 18 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4f1a 58 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4f1b 54 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4f20 4e 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4f34 37 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4f72 56 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4f73 52 8 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4f78 4c 3 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4f79 4a 2 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 4fc8 16 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4fde d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4feb 19 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 4fec 15 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5004 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5005 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 501c b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5027 19 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5028 15 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5040 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5041 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5058 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5063 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5064 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 507b 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 507c 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5093 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 509e 1c 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 509f 18 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 50ba 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 50bb 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 50dc 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 50dd 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 50fe 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 50ff 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5120 7b 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5124 75 4 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5128 70 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 519b 5b 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 51a2 52 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 51a3 50 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 51f6 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5200 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 520a a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5214 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 521e a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5228 24 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 524c 41 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 528d 1b6 c 0 0 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5405 14 0 0 0 c 2c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 5443 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 544d a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5457 fc 1c 0 14 4 328 0 1 $T0 $ebp 680 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5553 22 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5554 20 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5575 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5582 9 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 558b 24 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 55af 10 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 55bf 9 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 55c8 96 7 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 55cf 8d 0 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 55fb 60 0 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 565e 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5678 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5694 1f 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 56b3 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 56cf 1d 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 56ec 20 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 570c 1d 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5729 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 573a 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 574b 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5761 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5777 14f c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 58bc 9 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 58c6 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 58e0 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 58fa 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5912 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 592c 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5944 f6 7 0 18 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 594b ed 0 0 18 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 5973 c4 0 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 5977 bf 0 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 5a3a 27 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5a61 28 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5a89 87 4 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5a8d 81 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5ab2 5b 0 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5b10 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5b2b 107 5 0 18 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5b30 100 0 0 18 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5b5b d4 0 0 18 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5b5f cf 0 0 18 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 5c32 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5c50 27 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5c77 28 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 5c9f 24 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5cc3 26 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5ce9 15 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5cfe 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d07 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d10 18 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d11 16 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d28 20 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d29 1e 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d48 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d4d 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d7f 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5d84 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5dbb 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5dc0 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5df7 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5dfc 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5e33 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5e38 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5e6f 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5e74 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5ea6 37 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5eab 31 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5edd 92 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5f1b 34 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5f1c 32 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 5f6f e2 c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 6039 11 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 6051 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6062 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6073 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6082 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6091 4c 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6092 4a 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 616b 33 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 619e 36 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 61d4 36 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 620a 39 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6243 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6257 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6266 f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6275 96 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6276 94 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 62ba 4a 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 62bb 46 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 630b 2f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6313 26 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 633a 82 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6341 78 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 63bc e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 63ca 3 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 63cd 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6400 24 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 6404 1e 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 6424 4a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6429 44 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 642a 42 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 646e d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 647b 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 648b e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6499 994 2c 0 10 0 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 64bb 945 a 0 10 4 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 64c2 93b 3 0 10 8 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 64c5 937 0 0 10 c 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 6e2d 3b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6e68 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6e7b 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6e8e 1e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6e8f 1c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6eac 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6ec7 2a 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6ec8 28 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6ef1 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6f0c 2a 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6f0d 28 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6fa0 24 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6fd0 196 14 0 10 0 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 6fd4 d3 10 0 10 4 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 24 - ^ =\nSTACK WIN 4 6fd9 cd b 0 10 8 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ =\nSTACK WIN 4 6fda cb a 0 10 c 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ =\nSTACK WIN 4 6fe4 c0 0 0 10 10 14 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 28 - ^ = $ebx $T0 24 - ^ =\nSTACK WIN 4 7166 90 c 0 10 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 71eb a 0 0 10 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 71f6 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7210 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 722a 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7244 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 725c 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7274 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 728c 104 9 0 0 0 328 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7390 5c6 22 0 c 0 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 73b2 597 0 0 c 4 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 73fe 542 0 0 c 8 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1436 - ^ =\nSTACK WIN 4 740c 533 0 0 c c 594 0 1 $T0 $ebp 1304 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1436 - ^ =\nSTACK WIN 4 7956 dc c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7a28 9 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 7a32 2d 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7a37 27 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7a5f e1 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7b36 9 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 7b40 49 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7b41 3b 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7b42 39 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7b89 55 8 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7b8a 53 7 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 7b91 4b 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 7b97 2a 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 7bde 15 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7bf3 18 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7c0b c3 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7cc5 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 7cce 31 7 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7cd5 28 0 0 4 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7cff 240 c 0 0 c 64 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 7f28 4 0 0 0 c 64 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 7f3f 4c 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f40 4a 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f41 48 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f8b 21 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7f8c 1f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7fac 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7fbc 40 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7fbd 3e 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7fbe 3c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ffc 48 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ffd 46 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 7ffe 44 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8044 4b 2 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8045 49 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8046 47 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 808f 50 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8090 4e 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8091 4c 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 80df 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 80e7 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 80f1 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 80fb 8e c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8151 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8189 9f c 0 0 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 821f 8 0 0 0 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8228 19 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8229 15 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8241 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 824c 22 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 824d 1e 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 826e 5c 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 826f 5a 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8270 58 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 82ca 44 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 830e e1 c 0 10 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8390 a 0 0 10 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 83ce 20 0 0 10 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 83ef 45 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8434 54 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8477 9 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8488 25 7 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 848f 1d 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 84ad 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 84c0 b3 8 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 84c7 9a 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 84c8 98 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8573 4c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 85bf 139 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 85c0 137 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 85cf 127 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 85d0 11f 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 85d1 11d 0 0 8 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 86f8 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 86fc 32 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8714 a 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 872e 33 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8747 a 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8761 32 c 0 8 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8779 a 0 0 8 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8793 3b c 0 14 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 87b4 a 0 0 14 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 87ce 79 6 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 87f0 52 0 0 4 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 87f1 50 0 0 4 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 8847 49 c 0 4 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8890 30 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8891 2a 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 8892 28 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 88c0 82 8 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 88c1 7b 7 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 88c8 73 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 8942 19c 14 0 18 c 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 89d2 9 0 0 18 c 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8a62 7b 0 0 18 c 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8ade 17f c 0 10 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8c49 4 0 0 10 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8c5d 91 c 0 10 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8ce2 4 0 0 10 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 8cee 143 9 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8cfe 131 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 8d02 12c 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 8d05 128 0 0 10 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 8e31 6c 3 0 1c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8e9d f2 6 0 20 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8ea3 ea 0 0 20 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8eb3 d9 0 0 20 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8f31 5a 0 0 20 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 8f8f 356 17 0 20 0 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 8f99 34a d 0 20 4 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 8fa5 33d 1 0 20 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 8fa6 33b 0 0 20 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 92e5 18 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 92e6 14 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 92fd e4 6 0 20 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9301 de 2 0 20 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 9302 dc 1 0 20 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 9303 da 0 0 20 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 93e1 6c 7 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 93e7 64 1 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 93e8 62 0 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 9408 41 0 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 944d 6e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 944e 6c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 94bb 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 94c4 6e 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 94c5 6c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9532 9 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 953b 15 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9550 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9556 32 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9557 30 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9588 19 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 95a1 3d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 95de bf c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9694 8 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 969d 77 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 969e 75 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 969f 71 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9714 18 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9715 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 972c 121 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9835 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9841 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 984d 69 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9857 4b 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9860 25 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 98b6 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 98bc 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 98c2 184 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 98c3 182 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 98de 166 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9a46 39 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9a66 4 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9a7f 13 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9a92 37 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9ab6 4 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9ac9 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9b2c b9 5 0 4 0 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9b2e b5 3 0 4 4 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 9b2f b3 2 0 4 8 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 9b30 b1 1 0 4 c 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 9b31 af 0 0 4 10 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 9be5 2f 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9be6 2d 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9c14 3c c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9c4a 5 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9c50 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9c62 4f c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9ca8 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9cb1 75 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9cf9 2c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9d26 c3 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9d27 c1 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ =\nSTACK WIN 4 9d35 9c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 9d3c 94 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 9d3d 90 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 9de9 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9df3 31 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9df4 2f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9e24 9 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9e2d d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9e3a 22 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 9e5c 22 3 0 18 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9e7e 70 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9ee5 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9eee f5 c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 9fd7 b 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 9fe3 70 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 a04a 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 a053 31 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 a084 eb c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 a163 b 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 a16f 53 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 a1b9 8 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 a258 65 b 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 a25d 5f 6 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 a262 59 1 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 a263 57 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 aa15 3d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 aa52 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 aa60 1a0 8 0 4 0 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 aa62 19c 6 0 4 4 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 aa67 196 1 0 4 8 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 aa68 194 0 0 4 c 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 aa85 176 0 0 4 10 4 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 20 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 ac00 20 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ac20 39 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ac59 1 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ac5a 32 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ac65 1c 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ac8c 15e 6 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ac92 156 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 acaa 13d 0 0 8 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 acb0 136 0 0 8 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 adea 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ae05 db b 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ae06 c3 a 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 ae0f b9 1 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 ae10 b7 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 ae5f 67 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 aee0 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 aeea 198 e 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 aef2 187 6 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 aef8 180 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 b082 b9 11 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b089 b0 a 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 b092 a6 1 0 0 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 b093 a4 0 0 0 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 b13b 135 b 0 0 0 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b143 12a 3 0 0 4 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ =\nSTACK WIN 4 b144 128 2 0 0 8 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ =\nSTACK WIN 4 b145 126 1 0 0 c 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ =\nSTACK WIN 4 b146 124 0 0 0 10 8 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 16 - ^ = $ebx $T0 12 - ^ =\nSTACK WIN 4 b270 24 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b271 22 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b272 20 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b294 24 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b295 22 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b296 20 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b2b8 5b 6 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b2be 43 0 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b313 5a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b36d 74 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b36e 72 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ =\nSTACK WIN 4 b37a 53 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 b381 4b 0 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 b38c 30 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 b3e1 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b3e7 94 15 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b3fb 7e 1 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 b3fc 7c 0 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 b418 5f 0 0 0 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 b47b 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b483 160 5 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b488 159 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b4c5 11b 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 b52c b3 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 b5e3 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b608 25 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b60c 1f 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b62d 4f a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 b632 49 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 b633 47 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 b67c 910 30 0 10 0 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 b69e 8c1 e 0 10 4 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ =\nSTACK WIN 4 b6a5 8b7 7 0 10 8 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ =\nSTACK WIN 4 b6ac 8af 0 0 10 c 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ =\nSTACK WIN 4 bf8c 97 7 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 bf93 8e 0 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 bfbf 61 0 0 10 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 c023 17 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c03a 5 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c03f 55 7 0 10 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 c046 4c 0 0 10 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 c094 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c0ac 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c0c6 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c0de 1a 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c0f8 14e c 0 14 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 c23c 9 0 0 14 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 c246 1e 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c264 1e 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c282 1e 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c2a0 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c2bc 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c2d8 1c 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c2f4 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c319 25 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 c31d 1f 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 c33e 4f a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 c343 49 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 c344 47 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 c38d 91c 2c 0 10 0 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 c3a9 8d3 10 0 10 4 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ =\nSTACK WIN 4 c3b0 8c9 9 0 10 8 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ =\nSTACK WIN 4 c3b9 8bf 0 0 10 c 474 0 1 $T0 $ebp 1012 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1144 - ^ =\nSTACK WIN 4 cca9 154 9 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ccb1 14a 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ccb2 148 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 cdfd 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ce22 25 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ce26 1f 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ce47 4f a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ce4c 49 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 ce4d 47 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 ce96 f60 2a 0 10 0 ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ceb8 f0f 8 0 10 4 ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2776 - ^ =\nSTACK WIN 4 ceb9 f0b 7 0 10 8 ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2776 - ^ =\nSTACK WIN 4 cec0 f03 0 0 10 c ad4 0 1 $T0 $ebp 1160 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2776 - ^ =\nSTACK WIN 4 ddf6 1f 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ddf7 1d 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ddf8 1b 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 de20 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 de50 42 18 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 de5e 33 a 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 de5f 31 9 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 de68 27 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 dea0 bb 33 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 deba a1 19 0 4 10 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 df29 14 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 df5b 19 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 df74 9b c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 dfed 9 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 e00f 34 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e01a 1d 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e043 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e050 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e059 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e062 23d c 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 e257 b 0 0 8 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 e29f 1b0 c 0 4 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 e40d 14 0 0 4 c 30 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 e44f a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e459 104 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e45a 102 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ =\nSTACK WIN 4 e45b 100 1 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ =\nSTACK WIN 4 e45c fe 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ =\nSTACK WIN 4 e495 c4 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 4 - ^ = $ebx $T0 16 - ^ =\nSTACK WIN 4 e55d 15a 24 0 14 0 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 e576 bc b 0 14 4 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ =\nSTACK WIN 4 e577 b8 a 0 14 8 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ =\nSTACK WIN 4 e581 ad 0 0 14 c 94 0 1 $T0 $ebp 100 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 152 - ^ =\nSTACK WIN 4 e6b7 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e6c1 a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e6cb 10 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e6db c5 c 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 e761 17 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 e7a0 5e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e7b8 45 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e7fe 2f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e82d 55 b 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 e82e 53 a 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 e82f 51 9 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 e830 4f 8 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 e831 4d 7 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 e882 18a 1d 0 0 0 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 e89e 161 1 0 0 4 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1312 - ^ =\nSTACK WIN 4 e89f 15d 0 0 0 8 51c 0 1 $T0 $ebp 1180 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 1312 - ^ =\nSTACK WIN 4 ea0c a4 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 eaa4 b 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 eab0 7a 7 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 eab7 71 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 eb2a 1d9 19 0 8 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 eb3b 1c1 8 0 8 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 eb3f 1ba 4 0 8 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 eb43 1b5 0 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 ed03 3c 6 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 ed3f 19a c 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 eea0 8 0 0 4 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 eed9 1e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 eef7 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 eefd 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ef03 140 12 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 ef04 13e 11 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 ef05 13c 10 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 ef06 13a f 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 ef15 12a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 f043 86 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f044 84 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f045 82 6 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 f046 80 5 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 f04b 7a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 f0c9 8c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f0ca 8a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f0d3 7e 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 f0d4 7c 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 f0d5 7a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 12 - ^ = $ebx $T0 8 - ^ =\nSTACK WIN 4 f155 24 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f156 22 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f165 12 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f179 3e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f182 31 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f1b7 76 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f221 8 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 f22d 66 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f22e 64 1 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f22f 62 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f293 53 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f2e6 96 c 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f370 b 0 0 4 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 f37c 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f381 88 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f3fd b 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 f409 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f40e 3 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f411 3e 2 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f412 3c 1 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f413 3a 0 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f41e 2e 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f44f 129 6 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f453 123 2 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f454 121 1 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f455 11f 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f578 6b 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f57c 4d 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f57d 4b 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 f5e3 171 4 0 0 0 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 f5e7 169 0 0 0 4 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 20 - ^ =\nSTACK WIN 4 f606 149 0 0 0 8 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 24 - ^ = $ebx $T0 20 - ^ =\nSTACK WIN 4 f607 141 0 0 0 c 10 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 24 - ^ = $ebx $T0 20 - ^ =\nSTACK WIN 4 f754 1d4 1e 0 18 0 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f76d 1b1 5 0 18 4 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ =\nSTACK WIN 4 f76e 1ad 4 0 18 8 b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ =\nSTACK WIN 4 f772 1a8 0 0 18 c b4 0 1 $T0 $ebp 96 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 184 - ^ =\nSTACK WIN 4 f928 2f6 17 0 4 0 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 f93e 2d6 1 0 4 4 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 456 - ^ =\nSTACK WIN 4 f93f 2d2 0 0 4 8 1c4 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 456 - ^ =\nSTACK WIN 4 fc1e 1ce 18 0 4 0 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 fc37 1ab 0 0 4 4 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 fc38 1a7 0 0 4 8 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 fc3f 19f 0 0 4 c 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 fdec f3 7 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 fdf2 2c 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 fdf3 2a 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 fedf 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 fee4 170 c 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1000a 10 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 1001b b 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 1004c 7 0 0 8 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 10054 15f 10 0 14 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1005b a1 9 0 14 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1005c b2 8 0 14 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 10064 96 0 0 14 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 101b3 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 101ce 4f 6 0 c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1021d 30 4 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1024d 36 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 10283 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10291 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 102a7 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 102b8 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 102cb e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 102d9 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 102ec e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 102fa 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1030d e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1031b 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10331 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10342 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10355 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10363 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10376 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10384 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1039a 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 103ab 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 103c1 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 103d2 16 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 103e8 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 103f9 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1040c e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1041a c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10426 26 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1044c 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1046d 26 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10493 21 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 106ab 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 106de 24 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 106e2 1e 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 10702 4a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 10707 44 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 10708 42 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1074c 9b0 2c 0 10 0 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1076e 960 a 0 10 4 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 10775 956 3 0 10 8 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 10778 952 0 0 10 c 278 0 1 $T0 $ebp 504 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 636 - ^ =\nSTACK WIN 4 110fc 129 8 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 11103 120 1 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 11104 11e 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 11225 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 11258 24 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1125c 1e 2 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1127c 4a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 11281 44 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 11282 42 4 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 112c6 10 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 112d6 f88 2a 0 10 0 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 112f8 f39 8 0 10 4 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2260 - ^ =\nSTACK WIN 4 112f9 f35 7 0 10 8 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2260 - ^ =\nSTACK WIN 4 11300 f2d 0 0 10 c 8d0 0 1 $T0 $ebp 656 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 2260 - ^ =\nSTACK WIN 4 1225e c2 11 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1226f 9e 0 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12320 9b c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 123b2 8 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 123bb 46 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 123f8 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 12401 113 8 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12408 21 1 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 12409 1f 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 12514 17 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1252b 83 13 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12534 78 a 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1253e 6d 0 0 10 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 125ae 119 c 0 10 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 126bd 9 0 0 10 c 24 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 126c7 7d 8 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 126ce 75 1 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 126cf 73 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 126fd 2c 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ =\nSTACK WIN 4 12744 81 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 12749 7b 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1274e 75 1 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1274f 73 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 127c5 71 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 127e6 4f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 12836 a0 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 128c8 d 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 128d6 22 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 128f8 19f c 0 0 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 129c5 e 0 0 0 c 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 12a8e 8 0 0 0 c 28 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 12a97 115 c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12b7f 2c 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 12bac 11e c 0 c c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12ca3 d 0 0 c c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 12cca 3f 9 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12cd3 34 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12cec 18 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12d09 21b c 0 8 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12e47 e 0 0 8 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 12f24 79 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 12f2b 70 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 12f61 39 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 12f62 37 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 12f9d 21 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 12fbe 46 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 12fc9 3a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13004 3c 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13009 36 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13040 48 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13088 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 130b3 314 11 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 130c0 305 4 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 130c4 300 0 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 130f1 2d2 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 133c7 b0 d 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 133cd a9 7 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 133d4 a1 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13477 106 11 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 13483 f8 5 0 4 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 13484 f6 4 0 4 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 13488 f1 0 0 4 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 1357d 2df 12 0 c 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1358a 2d0 5 0 c 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 1358b 2ce 4 0 c 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 1358f 2c9 0 0 c c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 1385c cd 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13929 2e2 f 0 0 0 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 13938 294 0 0 0 4 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ =\nSTACK WIN 4 1394d 27e 0 0 0 8 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ =\nSTACK WIN 4 13950 27a 0 0 0 c 138 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 316 - ^ =\nSTACK WIN 4 13c0b a8 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13c0c a6 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13c54 5d 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13cb3 2e3 2a 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 13cd7 2bd 6 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 13cdc 2b7 1 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 13cdd 2b5 0 0 4 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 13f96 72 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 13f97 70 6 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 13f98 6e 5 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 13f9d 68 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 14008 7c c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14079 a 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 14084 d 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14091 d 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1409e d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 140ab f3 23 0 0 4 328 0 1 $T0 $ebp 680 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1419e 1e 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 142f3 a3 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14385 10 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 14396 6 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1439c 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 143b7 26 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 143b8 24 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 143dd 63 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14440 474 a 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14447 42e 3 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 14448 42c 2 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 14449 42a 1 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1444a 428 0 0 0 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 148b4 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 148bf d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 148cc e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 148da e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 148e8 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 148f6 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14904 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14916 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14924 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14932 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14940 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1494b b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14956 b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14961 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1496f b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1497a e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14988 19 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 149a1 84 13 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 149a2 80 12 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 149a3 7e 11 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 149c9 57 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 12 - ^ =\nSTACK WIN 4 14a25 d 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14a32 12 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14a44 9c 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14a57 86 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ae0 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14aea 5 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14aef 7 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14af6 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b00 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b08 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b12 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b1c 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b24 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b2e 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b36 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b40 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b48 a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b52 8 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b5a 7b 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14b5d 75 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14bd5 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14bde 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c03 d 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c10 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c14 29 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c26 f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c3d 16 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c53 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c57 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c5b 1b 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c76 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14c7a 2f 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ca9 25 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14cce 4 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14cd2 d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14cdf e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ced 20 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14d0d 25 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14d32 33 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14d65 34 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14d99 13 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14dac 56 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14db2 4d 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14e02 61 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14e03 5d a 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14e04 59 9 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14e63 17 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14e7a 15 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14e8f 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ea3 e 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14eb1 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ec5 25 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ec6 23 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14ed2 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14eea 38 2 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14eeb 36 1 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14eec 32 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14f22 91 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14f26 89 3 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14f27 87 2 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 14f5c 40 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 14fb3 35 2 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14fb6 2f 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14fe8 81 b 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14fe9 7d a 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 14fea 79 9 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15069 1e 3 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1506a 1c 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15087 47 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15088 43 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 150ce 47 7 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 150cf 45 6 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 150d0 43 5 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 150d1 41 4 0 0 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 15115 65 11 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15116 61 10 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1511b 5b b 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1511c 57 a 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1517a 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1518c 31 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 151bd f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 151cc f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 151db 1d 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 151f8 33 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1522b 73 7 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1522f 6b 3 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15230 5b 2 0 14 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1529e 2f 3 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 152cd f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 152dc 79 4 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 152dd 75 3 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 152de 71 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15355 68 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15356 64 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 153bd a6 3 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 153be a2 2 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 153de 81 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 153f0 6e 0 0 8 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 15463 26 3 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15464 22 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15489 31 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1548e 29 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 154ba d0 7 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 154be b3 3 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 154bf b1 2 0 8 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 154ce 9f 0 0 8 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1558a 69 13 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1559b 4f 2 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1559c 4b 1 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1559d 49 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 155f3 96 22 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15607 79 e 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15615 66 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1563a 29 0 0 8 c 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 15689 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1568a 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 156b7 62 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 156b8 5e 7 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 156b9 5a 6 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15719 8b a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1571a 87 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1571b 83 8 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 157a4 1c 9 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 157a5 18 8 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 157c0 2a 7 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 157c5 22 2 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 157ea a6 5 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15890 37 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 158c7 51 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 158c8 4d 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15918 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15919 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15946 6a a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15947 66 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1594e 5e 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 159b0 6c a 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 159b1 68 9 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 159b2 64 8 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15a1c e0 e 0 4 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15a23 d7 7 0 4 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15a2a cd 0 0 4 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15a45 b1 0 0 4 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 15afc 4f 6 0 8 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15b02 47 0 0 8 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15b4b 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15b6d 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15b8f 22 5 0 c 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15bb1 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15bb2 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15bdf 2e 1 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15be0 2a 0 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 15c0d 141 7 0 8 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15c14 138 0 0 8 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15c95 b3 0 0 8 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 15c96 b1 0 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 15d4e d4 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15e22 c4 e 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15ee6 7e d 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15f64 125 11 0 10 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 15f75 112 0 0 10 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16089 15f f 0 8 0 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16098 4a 0 0 8 4 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 160f0 b3 0 0 8 8 28 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 161e8 31 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16219 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1622b 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1623d 12 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1624f 150 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16256 147 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1639f a0 6 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1643f 50 5 0 4 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1648f 2bb 2b 0 4 0 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 164aa 296 10 0 4 4 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 164b3 28a 7 0 4 8 d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 164ba 282 0 0 4 c d0 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 1674a d9 b 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 167b8 17 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16823 14 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 16837 1b8 18 0 4 0 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16848 1a0 7 0 4 4 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1684f 18d 0 0 4 8 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16870 168 0 0 4 c 60 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 108 - ^ =\nSTACK WIN 4 169ef 56f 22 0 c 0 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16a03 97 e 0 c 4 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 164 - ^ =\nSTACK WIN 4 16a11 88 0 0 c 8 a0 0 1 $T0 $ebp 108 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 164 - ^ =\nSTACK WIN 4 16f5e 153 10 0 8 0 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 16f82 11b 0 0 8 4 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 16f89 113 0 0 8 8 d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 16f92 109 0 0 8 c d0 0 1 $T0 $ebp 112 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 212 - ^ =\nSTACK WIN 4 170b1 1ea 1b 0 8 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 170cc 1c8 0 0 8 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 17154 111 0 0 8 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 64 - ^ =\nSTACK WIN 4 17155 10f 0 0 8 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 64 - ^ =\nSTACK WIN 4 1729b e4 15 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 172a2 db e 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 172b0 ca 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1737f f 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1738e 100 19 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1739a f2 d 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 173a7 e4 0 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1748e 46 3 0 4 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 174d4 92 6 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 17566 b42 14 0 8 0 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 17571 b35 9 0 8 4 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1757a b2b 0 0 8 8 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 175e3 abe 0 0 8 c 6c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 120 - ^ =\nSTACK WIN 4 180a8 211 13 0 4 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 180af 208 c 0 4 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 180bb 1fb 0 0 4 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 182b9 28b 1f 0 4 0 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 182c5 27a 13 0 4 4 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 182c6 278 12 0 4 8 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 182d8 263 0 0 4 c 98 0 1 $T0 $ebp 116 + = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 156 - ^ =\nSTACK WIN 4 18544 341 d 0 8 0 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 18589 2f7 0 0 8 4 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 185f0 28f 0 0 8 8 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 185f1 28d 0 0 8 c 30 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 52 - ^ =\nSTACK WIN 4 18885 4e4 18 0 14 0 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 18893 4d4 a 0 14 4 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ =\nSTACK WIN 4 18894 4d2 9 0 14 8 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ =\nSTACK WIN 4 1889d 4c8 0 0 14 c 54 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 88 - ^ =\nSTACK WIN 4 18d69 14c 6 0 0 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 18eb5 116 5 0 10 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 18ed6 59 0 0 10 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 18fcb 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 18fe6 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19001 1b 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1901c a3 f 0 18 c 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 190b6 8 0 0 18 c 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 190bf a3 f 0 1c c 94 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19159 8 0 0 1c c 94 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 19162 387 12 0 8 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19172 350 2 0 8 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 19173 34e 1 0 8 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 19174 34c 0 0 8 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 194e9 13e 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 194f0 135 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19627 b1 6 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 196d8 64 7 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 196df 5b 0 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1973c 57 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19793 8f 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19822 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19836 14 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1984a 87 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 198d1 e3 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 199b4 1bd 9 0 c 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 199bb 1b4 2 0 c 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 199bc 1b2 1 0 c 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 199bd 1b0 0 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 19b71 71 b 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19b76 6b 6 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 19b7b 65 1 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 19b7c 63 0 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 19be2 b3 e 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19be6 1a a 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 19be7 2e 9 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 19bf0 e 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 19c95 46 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19c9a 40 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19cdb a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19ce5 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19ceb 51 6 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19d3c 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19d51 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19d64 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19d79 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19d8c 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19da1 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19db4 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19dcc 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19de2 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19dfa 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e10 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e28 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e3e 18 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e56 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e6c 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e81 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19e94 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19ea9 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19ebc 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19ed1 13 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19ee4 53 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19f37 e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19f45 44 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 19f89 1de 1a 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 19f9a 1c6 9 0 8 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 19f9b 1c2 8 0 8 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 19fa3 1b9 0 0 8 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1a167 78 c 0 8 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a1d5 9 0 0 8 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 1a1df 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a1e4 1f7 8 0 14 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a1eb 1ee 1 0 14 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1a1ec 1ec 0 0 14 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1a246 174 0 0 14 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1a3db 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a404 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a41f 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a449 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a464 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a46d 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a4c1 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a4ec 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a53b 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a564 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a5b3 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a5dc 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a62b 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a654 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a6a8 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a6d3 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a722 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a74b 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a79a 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a7c3 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a817 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a842 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a896 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a8c1 54 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a915 2b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a940 4f 6 0 8 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1a98f 29 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a9b8 d 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a9c5 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a9cd 1f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1a9ec 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1aa06 1f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1aa25 1c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1aa41 12 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1aa53 1b 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1aa6e 13b 1d 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1aa83 126 8 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 1aba9 3b 6 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1abe4 13d 1d 0 18 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1abf9 128 8 0 18 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 1ad21 3b 6 0 18 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1ad5c 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1ad76 3a2 1d 0 20 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1ad87 391 c 0 20 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 1b118 43 6 0 24 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1b15b 1b8 1d 0 1c 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1b170 1a3 8 0 1c c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 1b313 40 6 0 20 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1b353 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b359 29 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b382 419 6 0 0 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1b3a4 3f5 0 0 0 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1b3a5 3ed 0 0 0 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1b79b 190 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b79c 18e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b92b 73 4 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b92c 71 3 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1b92d 6f 2 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1b92e 6d 1 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1b92f 6b 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1b99e 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b9a5 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1b9a6 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1b9d1 40 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1b9d2 3e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1ba11 1c8 11 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1ba18 1bf a 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1ba1c 1ba 6 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1ba22 1b3 0 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1bbd9 33 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1bbe0 16 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1bbe1 14 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1bc0c 89 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1bc0d 87 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1bc95 2c4 c 0 4 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1bc9c 2bb 5 0 4 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1bc9d 2b9 4 0 4 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1bca1 2b4 0 0 4 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 1bf59 395 1b 0 4 0 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1bf6a 37d a 0 4 4 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 1bf6d 377 7 0 4 8 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 1bf74 36f 0 0 4 c 48 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 76 - ^ =\nSTACK WIN 4 1c2ee 29 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c317 16 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c32d 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c353 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c379 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c39f 3 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c3a2 fe 9 0 4 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1c3a9 e9 2 0 4 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1c3aa e7 1 0 4 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1c3ab e5 0 0 4 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 1c4a0 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c4a9 fe 9 0 4 0 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1c4b0 e9 2 0 4 4 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 1c4b1 e7 1 0 4 8 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 1c4b2 e5 0 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 1c5a7 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c5b0 355 9 0 4 0 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1c5b7 34c 2 0 4 4 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1c5b8 348 1 0 4 8 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1c5b9 346 0 0 4 c 24 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 40 - ^ =\nSTACK WIN 4 1c905 9 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c90e 20 6 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c912 1b 2 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c917 15 0 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c92e 36 6 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1c934 2f 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1c964 79 8 0 4 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1c969 72 3 0 4 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1c96a 70 2 0 4 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1c9dd 3e6 11 0 10 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1c9e2 3df c 0 10 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1c9e9 3d7 5 0 10 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1c9ea 3d5 4 0 10 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 1cdc3 45d 1d 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1cdd7 449 9 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 1d220 1af a 0 18 0 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d22a 1a3 0 0 18 4 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 1d270 15c 0 0 18 8 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 1d2a3 128 0 0 18 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 36 - ^ =\nSTACK WIN 4 1d3cf 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d3ed 1d 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d40a 1e 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d428 26 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d496 60 6 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d49c 56 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1d4a5 45 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1d4a6 43 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1d4f6 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d50a 77 11 0 0 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d51b 5f 0 0 0 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d581 1e 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d59f 32 1 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d5a0 30 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d5d1 1b 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d5ec 96 12 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d5fd 7c 1 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d5fe 78 0 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d682 72 11 0 8 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d693 5a 0 0 8 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d6cf 13 0 0 8 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d6f4 1d0 13 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d705 1b6 2 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ =\nSTACK WIN 4 1d706 1b2 1 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ =\nSTACK WIN 4 1d707 1b0 0 0 4 c 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 128 - ^ =\nSTACK WIN 4 1d8c4 bf 12 0 4 0 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d8d5 a5 1 0 4 4 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d8d6 a1 0 0 4 8 7c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1d983 2c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1d9af 65 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1da14 3c 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1da50 1e3 4 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1da51 1e1 3 0 c 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 1da52 1df 2 0 c 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1da53 1dd 1 0 c c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1da54 1db 0 0 c 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 1dc33 12 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1dc45 18 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1dc5d 40 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1dc9d 78 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1dd15 1490 4 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1dd16 83f 3 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1dd17 83d 2 0 0 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 1f1a5 1680 5 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1f1a9 15f8 1 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1f1aa 15f6 0 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 1f1db 86c 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 20825 be 9 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2082e a9 0 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 20840 96 0 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 20930 82 6 0 c 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 209b2 6e 4 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20a20 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20a25 22b 8 0 14 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20a2c 222 1 0 14 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20a2d 220 0 0 14 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20a8b 1c1 0 0 14 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 32 - ^ =\nSTACK WIN 4 20c50 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20c79 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20c94 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20cbe 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20cd9 1f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20cf8 1f 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20d17 2d 9 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20d20 23 0 0 0 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20d44 94 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20d45 92 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20d4a 8c 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20dd8 cd c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20e9b 9 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 20ea5 2c 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20ea6 2a 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20ed1 2a 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20efb 22 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20efc 20 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20f1d d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20f64 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20f75 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20f8a 5 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20f8f 5 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20f94 11 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20fa5 15 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 20fba 50 c 0 0 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 20fd7 1c 0 0 0 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 2100a 60 9 0 0 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21013 57 0 0 0 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 2106a d 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 21077 170 5 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2107c 169 0 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 210e1 103 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 21125 be 0 0 8 c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 211e7 182 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 21369 b6 7 0 c 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21370 ad 0 0 c 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 2141f 2f 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 2147c 47 10 0 4 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 214c3 1b2 2a 0 18 8 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 214e0 195 d 0 18 c 34 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 56 - ^ =\nSTACK WIN 4 21675 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 2167a 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 216a9 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 216ae 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 216dd 34 5 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 216e2 2e 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 21711 a2 c 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21718 99 5 0 10 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 2171d 93 0 0 10 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 2172b 84 0 0 10 c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 217b3 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217b9 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217bf 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217c5 6 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217cb c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217d7 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217e3 c 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 217ef 349 c 0 0 c 3c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21a99 d 0 0 0 c 3c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 21b38 1f5 14 0 24 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21b47 1e4 5 0 24 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 21b48 1e2 4 0 24 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 21b49 1e0 3 0 24 c c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 21d2d 1ae 5 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21d32 15f 0 0 0 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21d62 12e 0 0 0 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 21edb 4f c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21f21 8 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 21f2a 38 c 0 0 c 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21f59 8 0 0 0 c 18 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 21f62 41 c 0 4 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21f9a 8 0 0 4 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 21fa3 35 a 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 21fa8 2f 5 0 8 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 21fad 27 0 0 8 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 21fd8 d3 7 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 21fdf ca 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 22020 88 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 22068 33 0 0 c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 220ab 50 4 0 8 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 220af 4a 0 0 8 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 220fb f0 e 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22102 e7 7 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 22108 e0 1 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 22109 de 0 0 10 c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 221eb 5c 4 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 221ef 56 0 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22247 db 8 0 c 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2224c d2 3 0 c 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2224d d0 2 0 c 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 22277 a5 0 0 c c 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 22322 28 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2234a 25 3 0 10 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2236f 18 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 22387 f6 c 0 14 0 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2238e eb 5 0 14 4 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 22393 e5 0 0 14 8 c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 16 - ^ =\nSTACK WIN 4 2247d 33 3 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22498 16 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 224b0 1d 4 0 14 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 224b4 17 0 0 14 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 224cd 224 17 0 1c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 224e2 20f 2 0 1c c 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 226f1 3e 6 0 1c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2272f 294 8 0 14 0 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22736 28b 1 0 14 4 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 22737 289 0 0 14 8 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 22793 1f9 0 0 14 c 38 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 60 - ^ =\nSTACK WIN 4 229c3 29 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 229ec 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 22a07 2a 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22a31 1b 0 0 10 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 22a7b 81 8 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 22a83 70 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 22a92 60 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 22a93 5e 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 8 - ^ =\nSTACK WIN 4 22afc 93 7 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22b00 8d 3 0 c 4 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 22b01 8b 2 0 c 8 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 22b40 4b 0 0 c c 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 4 - ^ =\nSTACK WIN 4 22b8f a2 6 0 8 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22b94 9b 1 0 8 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22b95 99 0 0 8 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22c31 83 c 0 4 c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22cab 8 0 0 4 c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 22cb4 d8 c 0 10 c 1c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22d83 8 0 0 10 c 1c 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 22d8c e6 c 0 c c 20 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22e69 8 0 0 c c 20 0 1 $T0 $ebp = $T2 $esp = $T1 .raSearchStart = $eip $T1 ^ = $ebp $T0 = $esp $T1 4 + = $L $T0 .cbSavedRegs - = $P $T1 4 + .cbParams + =\nSTACK WIN 4 22e72 8 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 22e7a 117 8 0 8 0 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 22e81 10e 1 0 8 4 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 22e82 10c 0 0 8 8 18 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 28 - ^ =\nSTACK WIN 4 22f91 27 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 23021 ec 7 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 23028 e3 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 23088 82 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 2310d 17 0 0 c 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 23124 95 a 0 0 0 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2312a 7d 4 0 0 4 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 2312b 7b 3 0 0 8 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 2312e 77 0 0 0 c 8 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 12 - ^ =\nSTACK WIN 4 231b9 1a 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 231d3 1a 0 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 231ed 389 16 0 18 8 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 23201 375 2 0 18 c 2c 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 48 - ^ =\nSTACK WIN 4 23576 40 6 0 20 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 235b6 f8 7 0 10 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 235bd ef 0 0 10 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 2361d 8e 0 0 10 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 236ae 27 3 0 c 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 236d5 4d 1 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 236d6 48 0 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 23722 5d 4 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 2373e 3f 0 0 0 4 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2373f 3d 0 0 0 8 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 8 - ^ =\nSTACK WIN 4 2377f 24c f 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 23789 95 5 0 8 4 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 2378e 8f 0 0 8 8 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 237b1 6b 0 0 8 c 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 24 - ^ =\nSTACK WIN 4 239cb 50 6 0 4 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 239cc 4e 5 0 4 4 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebx $T0 4 - ^ =\nSTACK WIN 4 239d1 48 0 0 4 8 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 239dc 3c 0 0 4 c 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 239dd 3a 0 0 4 10 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + = $ebp $T0 8 - ^ = $ebx $T0 4 - ^ =\nSTACK WIN 4 23a1b ba 7 0 c 0 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =\nSTACK WIN 4 23a22 b1 0 0 c 4 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 23a5f 73 0 0 c 8 10 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = $L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + = $ebx $T0 20 - ^ =\nSTACK WIN 4 23ad5 13 0 0 8 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 4 240b9 14 0 0 0 0 0 0 1 $T2 $esp .cbLocals + .cbSavedRegs + = $T0 .raSearchStart = $eip $T0 ^ = $esp $T0 4 + =\nSTACK WIN 0 1000 13 0 0 4 0 0 0 0 0\nSTACK WIN 0 1020 1b 0 0 10 0 0 0 0 0\nSTACK WIN 0 1040 1b 0 0 10 0 0 0 0 0\nSTACK WIN 0 1060 19 8 0 4 0 0 0 0 0\nSTACK WIN 0 1080 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 1090 24 3 0 4 0 0 0 0 0\nSTACK WIN 0 10c0 f 0 0 8 0 0 0 0 0\nSTACK WIN 0 10d0 17 0 0 4 0 0 0 0 0\nSTACK WIN 0 10f0 27 9 0 10 0 0 0 0 0\nSTACK WIN 0 1120 27 9 0 10 0 0 0 0 0\nSTACK WIN 0 1150 d 0 0 8 0 0 0 0 0\nSTACK WIN 0 1160 13 0 0 4 0 0 0 0 0\nSTACK WIN 0 1180 21 d 0 10 0 0 0 0 0\nSTACK WIN 0 11b0 21 d 0 10 0 0 0 0 0\nSTACK WIN 0 11e0 7 0 0 0 0 0 0 0 0\nSTACK WIN 0 11f0 6b 28 0 4 8 10 0 0 0\nSTACK WIN 0 1260 32 3 0 0 0 0 0 0 0\nSTACK WIN 0 12a0 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 12b0 47 3 0 4 0 0 0 0 0\nSTACK WIN 0 1300 19 8 0 4 0 0 0 0 0\nSTACK WIN 0 1320 32 3 0 0 0 0 0 0 0\nSTACK WIN 0 1360 47 3 0 4 0 0 0 0 0\nSTACK WIN 0 13b0 19 8 0 4 0 0 0 0 0\nSTACK WIN 0 13d0 32 3 0 0 0 0 0 0 0\nSTACK WIN 0 1410 47 3 0 4 0 0 0 0 0\nSTACK WIN 0 1460 19 8 0 4 0 0 0 0 0\nSTACK WIN 0 1480 71 29 0 4 c 10 0 0 0\nSTACK WIN 0 1500 1b 0 0 8 0 0 0 0 0\nSTACK WIN 0 1520 35 4 0 0 0 0 0 0 0\nSTACK WIN 0 1560 20b 2d 0 14 14 14 0 0 1\nSTACK WIN 0 19f0 31 0 0 0 0 0 0 0 0\nSTACK WIN 0 1a30 51 d 0 4 c 0 0 0 0\nSTACK WIN 0 1a90 c7 7 0 4 10 8 0 0 1\nSTACK WIN 0 1b60 36 0 0 0 0 0 0 0 0\nSTACK WIN 0 1ba0 3 0 0 0 0 0 0 0 0\nSTACK WIN 0 1db0 81 2 0 8 0 0 0 0 0\nSTACK WIN 0 1e40 1d 7 0 0 0 0 0 0 0\nSTACK WIN 0 1e60 a2 3a 0 4 10 c4 0 0 0\nSTACK WIN 0 1f10 142 c 0 c 0 38 0 0 1\nSTACK WIN 0 2060 138 38 0 0 8 244 0 0 0\nSTACK WIN 0 21a0 3b 7 0 4 0 0 0 0 0\nSTACK WIN 0 21e0 25 5 0 4 0 0 0 0 0\nSTACK WIN 0 2210 26 3 0 0 0 0 0 0 0\nSTACK WIN 0 2240 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 2250 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 2260 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 2280 27 3 0 0 0 0 0 0 0\nSTACK WIN 0 22b0 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 22c0 24 3 0 4 0 0 0 0 0\nSTACK WIN 0 22f0 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 2300 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 2310 26 0 0 0 0 0 0 0 0\nSTACK WIN 0 2340 1d 1 0 0 0 0 0 0 0\nSTACK WIN 0 2360 1d 1 0 0 0 0 0 0 0\nSTACK WIN 0 2380 13 0 0 0 0 0 0 0 0\nSTACK WIN 0 23a0 23 0 0 0 0 0 0 0 0\nSTACK WIN 0 23d0 56 5 0 0 8 c 0 0 0\nSTACK WIN 0 2430 47 c 0 0 c 8 0 0 0\nSTACK WIN 0 24f0 23 1 0 0 0 4 0 0 0\nSTACK WIN 0 2520 3f b 0 8 0 0 0 0 0\nSTACK WIN 0 2560 20 0 0 0 0 0 0 0 0\nSTACK WIN 0 2580 20 0 0 0 0 0 0 0 0\nSTACK WIN 0 25a0 1d 0 0 0 0 0 0 0 0\nSTACK WIN 0 25c0 da 11 0 c 0 0 0 0 1\nSTACK WIN 0 26a0 27 8 0 4 0 0 0 0 0\nSTACK WIN 0 26d0 4a d 0 8 0 0 0 0 0\nSTACK WIN 0 2720 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 2730 5 2 0 4 0 0 0 0 0\nSTACK WIN 0 2740 5 2 0 4 0 0 0 0 0\nSTACK WIN 0 2750 3 2 0 0 0 0 0 0 0\nSTACK WIN 0 2760 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 2770 ef 11 0 c 0 0 0 0 1\nSTACK WIN 0 2860 2b 8 0 4 0 0 0 0 0\nSTACK WIN 0 2890 4f d 0 8 0 0 0 0 0\nSTACK WIN 0 28e0 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 28f0 5 2 0 4 0 0 0 0 0\nSTACK WIN 0 2900 3 2 0 0 0 0 0 0 0\nSTACK WIN 0 2910 13 0 0 0 0 0 0 0 0\nSTACK WIN 0 2930 86 a 0 10 10 4 0 0 1\nSTACK WIN 0 29c0 23 0 0 0 0 0 0 0 0\nSTACK WIN 0 29f0 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 2a00 26 0 0 0 0 0 0 0 0\nSTACK WIN 0 2a30 23 0 0 0 0 0 0 0 0\nSTACK WIN 0 2a60 76 23 0 0 4 50 0 0 0\nSTACK WIN 0 2ae0 3 0 0 4 0 0 0 0 0\nSTACK WIN 0 2af0 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 2b00 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 2b30 32 6 0 4 8 0 0 0 0\nSTACK WIN 0 2b70 2f 6 0 0 8 0 0 0 0\nSTACK WIN 0 2ba0 20 0 0 0 0 0 0 0 0\nSTACK WIN 0 2bc0 20 0 0 0 0 0 0 0 0\nSTACK WIN 0 2be0 1d 0 0 0 0 0 0 0 0\nSTACK WIN 0 2c00 c1 5 0 8 0 0 0 0 1\nSTACK WIN 0 2cd0 83 8 0 8 0 0 0 0 1\nSTACK WIN 0 2d60 1f 0 0 4 0 0 0 0 0\nSTACK WIN 0 2d80 bc b 0 8 0 0 0 0 1\nSTACK WIN 0 2e40 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 2e50 5 2 0 4 0 0 0 0 0\nSTACK WIN 0 2e60 e 0 0 8 0 0 0 0 0\nSTACK WIN 0 2e70 da 4 0 8 0 0 0 0 1\nSTACK WIN 0 2f50 97 8 0 8 0 0 0 0 1\nSTACK WIN 0 2ff0 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 3000 23 0 0 4 0 0 0 0 0\nSTACK WIN 0 3030 c7 e 0 8 0 0 0 0 1\nSTACK WIN 0 3100 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 3110 5 2 0 4 0 0 0 0 0\nSTACK WIN 0 3120 e 0 0 8 0 0 0 0 0\nSTACK WIN 0 3130 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 3140 208 6 0 8 10 8 0 0 1\nSTACK WIN 0 33d0 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 33e0 8 0 0 0 0 0 0 0 0\nSTACK WIN 0 33f0 56 3 0 0 0 10 0 0 0\nSTACK WIN 0 3450 32 0 0 4 0 0 0 0 0\nSTACK WIN 0 3490 28 0 0 0 0 0 0 0 0\nSTACK WIN 0 34c0 19 0 0 0 0 0 0 0 0\nSTACK WIN 0 34e0 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 3510 19 8 0 4 0 0 0 0 0\nSTACK WIN 0 3530 7 0 0 0 0 0 0 0 0\nSTACK WIN 0 3540 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 36d0 39 8 0 4 0 0 0 0 0\nSTACK WIN 0 3710 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 38a0 3a 8 0 4 0 0 0 0 0\nSTACK WIN 0 38e0 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 38f0 32 0 0 4 0 0 0 0 0\nSTACK WIN 0 3930 19 0 0 0 0 0 0 0 0\nSTACK WIN 0 3950 56 7 0 4 0 c 0 0 0\nSTACK WIN 0 39b0 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 39c0 59 7 0 4 0 c 0 0 0\nSTACK WIN 0 3a20 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 3a30 21 d 0 10 0 0 0 0 0\nSTACK WIN 0 3a60 27 9 0 10 0 0 0 0 0\nSTACK WIN 0 3a90 24 f 0 0 0 0 0 0 0\nSTACK WIN 0 3ac0 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 3ad0 15 0 0 0 0 0 0 0 0\nSTACK WIN 0 3af0 21 d 0 10 0 0 0 0 0\nSTACK WIN 0 3b20 27 9 0 10 0 0 0 0 0\nSTACK WIN 0 3b50 22 d 0 0 0 0 0 0 0\nSTACK WIN 0 3b80 10 0 0 0 0 0 0 0 0\nSTACK WIN 0 3b90 25 11 0 0 0 0 0 0 0\nSTACK WIN 0 3bc0 4f a 0 0 0 10 0 0 0\nSTACK WIN 0 3c10 54 7 0 8 0 c 0 0 0\nSTACK WIN 0 3c70 57 7 0 8 0 c 0 0 0\nSTACK WIN 0 3cd0 19 8 0 4 0 0 0 0 0\nSTACK WIN 0 3cf0 7 1 0 0 0 4 0 0 0\nSTACK WIN 0 3d00 21 d 0 14 0 0 0 0 0\nSTACK WIN 0 3d30 7 1 0 0 0 4 0 0 0\nSTACK WIN 0 3d40 27 9 0 14 0 0 0 0 0\nSTACK WIN 0 3d70 3 0 0 0 0 0 0 0 0\nSTACK WIN 0 3d80 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 3d90 7 1 0 0 0 4 0 0 0\nSTACK WIN 0 3da0 15 0 0 4 0 0 0 0 0\nSTACK WIN 0 3dc0 1 0 0 4 0 0 0 0 0\nSTACK WIN 0 3dd0 15 0 0 8 0 0 0 0 0\nSTACK WIN 0 3df0 21 d 0 14 0 0 0 0 0\nSTACK WIN 0 3e20 27 9 0 14 0 0 0 0 0\nSTACK WIN 0 3e50 22 d 0 0 0 0 0 0 0\nSTACK WIN 0 3e80 10 0 0 0 0 0 0 0 0\nSTACK WIN 0 3e90 7 1 0 0 0 4 0 0 0\nSTACK WIN 0 3ea0 25 11 0 c 0 0 0 0 0\nSTACK WIN 0 3ed0 3 0 0 4 0 0 0 0 0\nSTACK WIN 0 3ee0 15 0 0 0 0 0 0 0 0\nSTACK WIN 0 3f00 22 d 0 8 0 0 0 0 0\nSTACK WIN 0 3f30 13 0 0 0 0 0 0 0 0\nSTACK WIN 0 3f50 1 0 0 0 0 0 0 0 0\nSTACK WIN 0 3f60 15 0 0 8 0 0 0 0 0\nSTACK WIN 0 3f80 22 d 0 0 0 0 0 0 0\nSTACK WIN 0 3fb0 15 0 0 4 0 0 0 0 0\nSTACK WIN 0 3fd0 15 0 0 4 0 0 0 0 0\nSTACK WIN 0 3ff0 13 0 0 4 0 0 0 0 0\nSTACK WIN 0 4010 ae e 0 4 0 54 0 0 0\nSTACK WIN 0 40c0 ae e 0 4 0 4c 0 0 0\nSTACK WIN 0 4170 40 7 0 4 0 0 0 0 0\nSTACK WIN 0 4464 13 0 0 0 0 0 0 0 0\nSTACK WIN 0 466c 16 0 0 0 0 0 0 0 0\nSTACK WIN 0 46a0 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 46f2 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 5405 14 0 0 0 0 0 0 0 0\nSTACK WIN 0 58bc a 0 0 0 0 0 0 0 0\nSTACK WIN 0 6039 12 0 0 0 0 0 0 0 0\nSTACK WIN 0 60e0 8b 0 0 4 0 0 0 0 0\nSTACK WIN 0 71eb b 0 0 0 0 0 0 0 0\nSTACK WIN 0 7a28 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 7b36 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 7cc5 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 7f28 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 8151 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 821f 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 8390 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 83ce 21 0 0 0 0 0 0 0 0\nSTACK WIN 0 8477 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 8714 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 8747 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 8779 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 87b4 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 89d2 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 8a62 7c 0 0 0 0 0 0 0 0\nSTACK WIN 0 8c49 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 8ce2 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 9694 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 9835 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 9841 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 9a66 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 9ab6 4 0 0 0 0 0 0 0 0\nSTACK WIN 0 9ae0 4c 8 0 c 10 0 0 0 1\nSTACK WIN 0 9c4a 6 0 0 0 0 0 0 0 0\nSTACK WIN 0 9ca8 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 9ee5 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 9fd7 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 a04a 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 a163 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 a1b9 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 a1d0 88 0 0 8 0 0 0 0 0\nSTACK WIN 0 a2c0 7a 0 0 c 0 0 0 0 0\nSTACK WIN 0 c23c a 0 0 0 0 0 0 0 0\nSTACK WIN 0 df29 14 0 0 0 0 0 0 0 0\nSTACK WIN 0 dfed a 0 0 0 0 0 0 0 0\nSTACK WIN 0 e257 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 e40d 15 0 0 0 0 0 0 0 0\nSTACK WIN 0 e761 17 0 0 0 0 0 0 0 0\nSTACK WIN 0 eaa4 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 eea0 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 f221 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 f370 c 0 0 0 0 0 0 0 0\nSTACK WIN 0 f3fd c 0 0 0 0 0 0 0 0\nSTACK WIN 0 1000a 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 1001b c 0 0 0 0 0 0 0 0\nSTACK WIN 0 1004c 8 0 0 0 0 0 0 0 0\nSTACK WIN 0 10558 90 3 0 c c 0 0 0 0\nSTACK WIN 0 105e8 46 0 0 10 4 0 0 0 1\nSTACK WIN 0 1064a 17 4 0 0 10 0 0 0 1\nSTACK WIN 0 10661 19 0 0 0 0 0 0 0 0\nSTACK WIN 0 10694 17 1 0 8 4 0 0 0 1\nSTACK WIN 0 123b2 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 123f8 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 126bd a 0 0 0 0 0 0 0 0\nSTACK WIN 0 128c8 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 129c5 f 0 0 0 0 0 0 0 0\nSTACK WIN 0 12a8e 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 12b7f 2d 0 0 0 0 0 0 0 0\nSTACK WIN 0 12ca3 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 12e47 f 0 0 0 0 0 0 0 0\nSTACK WIN 0 14079 b 0 0 0 0 0 0 0 0\nSTACK WIN 0 14221 84 3 0 8 c 0 0 0 0\nSTACK WIN 0 142a5 23 0 0 0 0 0 0 0 0\nSTACK WIN 0 142f0 3 0 0 0 0 0 0 0 0\nSTACK WIN 0 14385 11 0 0 0 0 0 0 0 0\nSTACK WIN 0 190b6 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 19159 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 1a1d5 a 0 0 0 0 0 0 0 0\nSTACK WIN 0 20e9b a 0 0 0 0 0 0 0 0\nSTACK WIN 0 20fd7 1c 0 0 0 0 0 0 0 0\nSTACK WIN 0 21a99 e 0 0 0 0 0 0 0 0\nSTACK WIN 0 21f21 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 21f59 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 21f9a 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 22cab 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 22d83 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 22e69 9 0 0 0 0 0 0 0 0\nSTACK WIN 0 23b00 be 0 0 8 0 0 0 0 0\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/testdata/test_app.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This file is used to generate minidump2.dmp and minidump2.sym.\n// cl /Zi test_app.cc /Fetest_app.exe /I google_breakpad/src \\\n//   google_breakpad/src/client/windows/releasestaticcrt/exception_handler.lib\n// Then run test_app to generate a dump, and dump_syms to create the .sym file.\n\n#include <stdio.h>\n\n#include \"client/windows/handler/exception_handler.h\"\n\nnamespace {\n\nstatic bool callback(const wchar_t *dump_path, const wchar_t *id,\n                     void *context, EXCEPTION_POINTERS *exinfo,\n                     MDRawAssertionInfo *assertion,\n                     bool succeeded) {\n  if (succeeded) {\n    printf(\"dump guid is %ws\\n\", id);\n  } else {\n    printf(\"dump failed\\n\");\n  }\n  fflush(stdout);\n\n  return succeeded;\n}\n\nstatic void CrashFunction() {\n  int *i = reinterpret_cast<int*>(0x45);\n  *i = 5;  // crash!\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  google_breakpad::ExceptionHandler eh(\n      L\".\", NULL, callback, NULL,\n      google_breakpad::ExceptionHandler::HANDLER_ALL);\n  CrashFunction();\n  printf(\"did not crash?\\n\");\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/tokenize.cc",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <string.h>\n\n#include <string>\n#include <vector>\n\nnamespace google_breakpad {\n\nusing std::string;\nusing std::vector;\n\nbool Tokenize(char *line,\n\t      const char *separators,\n\t      int max_tokens,\n\t      vector<char*> *tokens) {\n  tokens->clear();\n  tokens->reserve(max_tokens);\n\n  int remaining = max_tokens;\n\n  // Split tokens on the separator character.\n  // strip them out before exhausting max_tokens.\n  char *save_ptr;\n  char *token = strtok_r(line, separators, &save_ptr);\n  while (token && --remaining > 0) {\n    tokens->push_back(token);\n    if (remaining > 1)\n      token = strtok_r(NULL, separators, &save_ptr);\n  }\n\n  // If there's anything left, just add it as a single token.\n  if (!remaining > 0) {\n    if ((token = strtok_r(NULL, \"\\r\\n\", &save_ptr))) {\n      tokens->push_back(token);\n    }\n  }\n\n  return tokens->size() == static_cast<unsigned int>(max_tokens);\n}\n\nvoid StringToVector(const string &str, vector<char> &vec) {\n  vec.resize(str.length() + 1);\n  std::copy(str.begin(), str.end(),\n\t    vec.begin());\n  vec[str.length()] = '\\0';\n}\n\n} // namespace google_breakpad\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/tokenize.h",
    "content": "// Copyright (c) 2010, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Implements a Tokenize function for splitting up strings.\n\n#ifndef GOOGLE_BREAKPAD_PROCESSOR_TOKENIZE_H_\n#define GOOGLE_BREAKPAD_PROCESSOR_TOKENIZE_H_\n\n#include <string>\n#include <vector>\n\nnamespace google_breakpad {\n\n// Splits line into at most max_tokens tokens, separated by any of the\n// characters in separators and placing them in the tokens vector.\n// line is a 0-terminated string that optionally ends with a newline\n// character or combination, which will be removed. \n// If more tokens than max_tokens are present, the final token is placed\n// into the vector without splitting it up at all.  This modifies line as\n// a side effect.  Returns true if exactly max_tokens tokens are returned,\n// and false if fewer are returned.  This is not considered a failure of\n// Tokenize, but may be treated as a failure if the caller expects an\n// exact, as opposed to maximum, number of tokens.\n\nbool Tokenize(char *line,\n\t      const char *separators,\n\t      int max_tokens,\n\t      std::vector<char*> *tokens);\n// For convenience, since you need a char* to pass to Tokenize.\n// You can call StringToVector on a std::string, and use &vec[0].\nvoid StringToVector(const std::string &str, std::vector<char> &vec);\n\n}  // namespace google_breakpad\n\n#endif  // GOOGLE_BREAKPAD_PROCESSOR_TOKENIZE_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/processor/windows_frame_info.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// windows_frame_info.h: Holds debugging information about a stack frame.\n//\n// This structure is specific to Windows debugging information obtained\n// from pdb files using the DIA API.\n//\n// Author: Mark Mentovai\n\n\n#ifndef PROCESSOR_WINDOWS_FRAME_INFO_H__\n#define PROCESSOR_WINDOWS_FRAME_INFO_H__\n\n#include <string.h>\n#include <stdlib.h>\n\n#include <string>\n#include <vector>\n\n#include \"google_breakpad/common/breakpad_types.h\"\n#include \"processor/logging.h\"\n#include \"processor/tokenize.h\"\n\nnamespace google_breakpad {\n\nstruct WindowsFrameInfo {\n public:\n  enum Validity {\n    VALID_NONE           = 0,\n    VALID_PARAMETER_SIZE = 1,\n    VALID_ALL            = -1\n  };\n\n  // The types for stack_info_.  This is equivalent to MS DIA's\n  // StackFrameTypeEnum.  Each identifies a different type of frame\n  // information, although all are represented in the symbol file in the\n  // same format.  These are used as indices to the stack_info_ array.\n  enum StackInfoTypes {\n    STACK_INFO_FPO = 0,\n    STACK_INFO_TRAP,  // not used here\n    STACK_INFO_TSS,   // not used here\n    STACK_INFO_STANDARD,\n    STACK_INFO_FRAME_DATA,\n    STACK_INFO_LAST,  // must be the last sequentially-numbered item\n    STACK_INFO_UNKNOWN = -1\n  };\n\n  WindowsFrameInfo() : type_(STACK_INFO_UNKNOWN),\n                     valid(VALID_NONE),\n                     prolog_size(0),\n                     epilog_size(0),\n                     parameter_size(0),\n                     saved_register_size(0),\n                     local_size(0),\n                     max_stack_size(0),\n                     allocates_base_pointer(0),\n                     program_string() {}\n\n  WindowsFrameInfo(StackInfoTypes type,\n                 u_int32_t set_prolog_size,\n                 u_int32_t set_epilog_size,\n                 u_int32_t set_parameter_size,\n                 u_int32_t set_saved_register_size,\n                 u_int32_t set_local_size,\n                 u_int32_t set_max_stack_size,\n                 int set_allocates_base_pointer,\n                 const std::string set_program_string)\n      : type_(type),\n        valid(VALID_ALL),\n        prolog_size(set_prolog_size),\n        epilog_size(set_epilog_size),\n        parameter_size(set_parameter_size),\n        saved_register_size(set_saved_register_size),\n        local_size(set_local_size),\n        max_stack_size(set_max_stack_size),\n        allocates_base_pointer(set_allocates_base_pointer),\n        program_string(set_program_string) {}\n\n  // Parse a textual serialization of a WindowsFrameInfo object from\n  // a string. Returns NULL if parsing fails, or a new object\n  // otherwise. type, rva and code_size are present in the STACK line,\n  // but not the StackFrameInfo structure, so return them as outparams.\n  static WindowsFrameInfo *ParseFromString(const std::string string,\n                                           int &type,\n                                           u_int64_t &rva,\n                                           u_int64_t &code_size) {\n    // The format of a STACK WIN record is documented at: \n    //\n    // http://code.google.com/p/google-breakpad/wiki/SymbolFiles\n\n    std::vector<char>  buffer;\n    StringToVector(string, buffer);\n    std::vector<char*> tokens;\n    if (!Tokenize(&buffer[0], \" \\r\\n\", 11, &tokens))\n      return NULL;\n\n    type = strtol(tokens[0], NULL, 16);\n    if (type < 0 || type > STACK_INFO_LAST - 1)\n      return NULL;\n\n    rva                           = strtoull(tokens[1],  NULL, 16);\n    code_size                     = strtoull(tokens[2],  NULL, 16);\n    u_int32_t prolog_size         =  strtoul(tokens[3],  NULL, 16);\n    u_int32_t epilog_size         =  strtoul(tokens[4],  NULL, 16);\n    u_int32_t parameter_size      =  strtoul(tokens[5],  NULL, 16);\n    u_int32_t saved_register_size =  strtoul(tokens[6],  NULL, 16);\n    u_int32_t local_size          =  strtoul(tokens[7],  NULL, 16);\n    u_int32_t max_stack_size      =  strtoul(tokens[8],  NULL, 16);\n    int has_program_string        =  strtoul(tokens[9], NULL, 16);\n\n    const char *program_string = \"\";\n    int allocates_base_pointer = 0;\n    if (has_program_string) {\n      program_string = tokens[10];\n    } else {\n      allocates_base_pointer = strtoul(tokens[10], NULL, 16);\n    }\n\n    return new WindowsFrameInfo(static_cast<StackInfoTypes>(type),\n                                prolog_size,\n                                epilog_size,\n                                parameter_size,\n                                saved_register_size,\n                                local_size,\n                                max_stack_size,\n                                allocates_base_pointer,\n                                program_string);\n  }\n\n  // CopyFrom makes \"this\" WindowsFrameInfo object identical to \"that\".\n  void CopyFrom(const WindowsFrameInfo &that) {\n    type_ = that.type_;\n    valid = that.valid;\n    prolog_size = that.prolog_size;\n    epilog_size = that.epilog_size;\n    parameter_size = that.parameter_size;\n    saved_register_size = that.saved_register_size;\n    local_size = that.local_size;\n    max_stack_size = that.max_stack_size;\n    allocates_base_pointer = that.allocates_base_pointer;\n    program_string = that.program_string;\n  }\n\n  // Clears the WindowsFrameInfo object so that users will see it as though\n  // it contains no information.\n  void Clear() {\n    type_ = STACK_INFO_UNKNOWN;\n    valid = VALID_NONE;\n    program_string.erase();\n  }\n\n  StackInfoTypes type_;\n\n  // Identifies which fields in the structure are valid.  This is of\n  // type Validity, but it is defined as an int because it's not\n  // possible to OR values into an enumerated type.  Users must check\n  // this field before using any other.\n  int valid;\n\n  // These values come from IDiaFrameData.\n  u_int32_t prolog_size;\n  u_int32_t epilog_size;\n  u_int32_t parameter_size;\n  u_int32_t saved_register_size;\n  u_int32_t local_size;\n  u_int32_t max_stack_size;\n\n  // Only one of allocates_base_pointer or program_string will be valid.\n  // If program_string is empty, use allocates_base_pointer.\n  bool allocates_base_pointer;\n  std::string program_string;\n};\n\n}  // namespace google_breakpad\n\n\n#endif  // PROCESSOR_WINDOWS_FRAME_INFO_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/curl/COPYING",
    "content": "COPYRIGHT AND PERMISSION NOTICE\n\nCopyright (c) 1996 - 2011, Daniel Stenberg, <daniel@haxx.se>.\n\nAll rights reserved.\n\nPermission to use, copy, modify, and distribute this software for any purpose\nwith or without fee is hereby granted, provided that the above copyright\nnotice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN\nNO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\nOR OTHER DEALINGS IN THE SOFTWARE.\n\nExcept as contained in this notice, the name of a copyright holder shall not\nbe used in advertising or otherwise to promote the sale, use or other dealings\nin this Software without prior written authorization of the copyright holder.\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/curl/curl.h",
    "content": "#ifndef __CURL_CURL_H\n#define __CURL_CURL_H\n/***************************************************************************\n *                                  _   _ ____  _\n *  Project                     ___| | | |  _ \\| |\n *                             / __| | | | |_) | |\n *                            | (__| |_| |  _ <| |___\n *                             \\___|\\___/|_| \\_\\_____|\n *\n * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.\n *\n * This software is licensed as described in the file COPYING, which\n * you should have received as part of this distribution. The terms\n * are also available at http://curl.haxx.se/docs/copyright.html.\n *\n * You may opt to use, copy, modify, merge, publish, distribute and/or sell\n * copies of the Software, and permit persons to whom the Software is\n * furnished to do so, under the terms of the COPYING file.\n *\n * This software is distributed on an \"AS IS\" basis, WITHOUT WARRANTY OF ANY\n * KIND, either express or implied.\n *\n * $Id: curl.h,v 1.396 2009-10-16 13:30:31 yangtse Exp $\n ***************************************************************************/\n\n/*\n * If you have libcurl problems, all docs and details are found here:\n *   http://curl.haxx.se/libcurl/\n *\n * curl-library mailing list subscription and unsubscription web interface:\n *   http://cool.haxx.se/mailman/listinfo/curl-library/\n */\n\n/*\n * Leading 'curl' path on the 'curlbuild.h' include statement is\n * required to properly allow building outside of the source tree,\n * due to the fact that in this case 'curlbuild.h' is generated in\n * a subdirectory of the build tree while 'curl.h actually remains\n * in a subdirectory of the source tree.\n */\n\n#include \"third_party/curl/curlver.h\"         /* libcurl version defines   */\n#include \"third_party/curl/curlbuild.h\"       /* libcurl build definitions */\n#include \"third_party/curl/curlrules.h\"       /* libcurl rules enforcement */\n\n/*\n * Define WIN32 when build target is Win32 API\n */\n\n#if (defined(_WIN32) || defined(__WIN32__)) && \\\n     !defined(WIN32) && !defined(__SYMBIAN32__)\n#define WIN32\n#endif\n\n#include <stdio.h>\n#include <limits.h>\n\n/* The include stuff here below is mainly for time_t! */\n#include <sys/types.h>\n#include <time.h>\n\n#if defined(WIN32) && !defined(_WIN32_WCE) && !defined(__GNUC__) && \\\n  !defined(__CYGWIN__) || defined(__MINGW32__)\n#if !(defined(_WINSOCKAPI_) || defined(_WINSOCK_H))\n/* The check above prevents the winsock2 inclusion if winsock.h already was\n   included, since they can't co-exist without problems */\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#endif\n#else\n\n/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish\n   libc5-based Linux systems. Only include it on system that are known to\n   require it! */\n#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \\\n    defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \\\n    defined(ANDROID)\n#include <sys/select.h>\n#endif\n\n#ifndef _WIN32_WCE\n#include <sys/socket.h>\n#endif\n#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__)\n#include <sys/time.h>\n#endif\n#include <sys/types.h>\n#endif\n\n#ifdef __BEOS__\n#include <support/SupportDefs.h>\n#endif\n\n#ifdef  __cplusplus\nextern \"C\" {\n#endif\n\ntypedef void CURL;\n\n/*\n * Decorate exportable functions for Win32 and Symbian OS DLL linking.\n * This avoids using a .def file for building libcurl.dll.\n */\n#if (defined(WIN32) || defined(_WIN32) || defined(__SYMBIAN32__)) && \\\n     !defined(CURL_STATICLIB)\n#if defined(BUILDING_LIBCURL)\n#define CURL_EXTERN  __declspec(dllexport)\n#else\n#define CURL_EXTERN  __declspec(dllimport)\n#endif\n#else\n\n#ifdef CURL_HIDDEN_SYMBOLS\n/*\n * This definition is used to make external definitions visible in the\n * shared library when symbols are hidden by default.  It makes no\n * difference when compiling applications whether this is set or not,\n * only when compiling the library.\n */\n#define CURL_EXTERN CURL_EXTERN_SYMBOL\n#else\n#define CURL_EXTERN\n#endif\n#endif\n\n#ifndef curl_socket_typedef\n/* socket typedef */\n#ifdef WIN32\ntypedef SOCKET curl_socket_t;\n#define CURL_SOCKET_BAD INVALID_SOCKET\n#else\ntypedef int curl_socket_t;\n#define CURL_SOCKET_BAD -1\n#endif\n#define curl_socket_typedef\n#endif /* curl_socket_typedef */\n\nstruct curl_httppost {\n  struct curl_httppost *next;       /* next entry in the list */\n  char *name;                       /* pointer to allocated name */\n  long namelength;                  /* length of name length */\n  char *contents;                   /* pointer to allocated data contents */\n  long contentslength;              /* length of contents field */\n  char *buffer;                     /* pointer to allocated buffer contents */\n  long bufferlength;                /* length of buffer field */\n  char *contenttype;                /* Content-Type */\n  struct curl_slist* contentheader; /* list of extra headers for this form */\n  struct curl_httppost *more;       /* if one field name has more than one\n                                       file, this link should link to following\n                                       files */\n  long flags;                       /* as defined below */\n#define HTTPPOST_FILENAME (1<<0)    /* specified content is a file name */\n#define HTTPPOST_READFILE (1<<1)    /* specified content is a file name */\n#define HTTPPOST_PTRNAME (1<<2)     /* name is only stored pointer\n                                       do not free in formfree */\n#define HTTPPOST_PTRCONTENTS (1<<3) /* contents is only stored pointer\n                                       do not free in formfree */\n#define HTTPPOST_BUFFER (1<<4)      /* upload file from buffer */\n#define HTTPPOST_PTRBUFFER (1<<5)   /* upload file from pointer contents */\n#define HTTPPOST_CALLBACK (1<<6)    /* upload file contents by using the\n                                       regular read callback to get the data\n                                       and pass the given pointer as custom\n                                       pointer */\n\n  char *showfilename;               /* The file name to show. If not set, the\n                                       actual file name will be used (if this\n                                       is a file part) */\n  void *userp;                      /* custom pointer used for\n                                       HTTPPOST_CALLBACK posts */\n};\n\ntypedef int (*curl_progress_callback)(void *clientp,\n                                      double dltotal,\n                                      double dlnow,\n                                      double ultotal,\n                                      double ulnow);\n\n#ifndef CURL_MAX_WRITE_SIZE\n  /* Tests have proven that 20K is a very bad buffer size for uploads on\n     Windows, while 16K for some odd reason performed a lot better.\n     We do the ifndef check to allow this value to easier be changed at build\n     time for those who feel adventurous. */\n#define CURL_MAX_WRITE_SIZE 16384\n#endif\n\n#ifndef CURL_MAX_HTTP_HEADER\n/* The only reason to have a max limit for this is to avoid the risk of a bad\n   server feeding libcurl with a never-ending header that will cause reallocs\n   infinitely */\n#define CURL_MAX_HTTP_HEADER (100*1024)\n#endif\n\n\n/* This is a magic return code for the write callback that, when returned,\n   will signal libcurl to pause receiving on the current transfer. */\n#define CURL_WRITEFUNC_PAUSE 0x10000001\ntypedef size_t (*curl_write_callback)(char *buffer,\n                                      size_t size,\n                                      size_t nitems,\n                                      void *outstream);\n\n/* These are the return codes for the seek callbacks */\n#define CURL_SEEKFUNC_OK       0\n#define CURL_SEEKFUNC_FAIL     1 /* fail the entire transfer */\n#define CURL_SEEKFUNC_CANTSEEK 2 /* tell libcurl seeking can't be done, so\n                                    libcurl might try other means instead */\ntypedef int (*curl_seek_callback)(void *instream,\n                                  curl_off_t offset,\n                                  int origin); /* 'whence' */\n\n/* This is a return code for the read callback that, when returned, will\n   signal libcurl to immediately abort the current transfer. */\n#define CURL_READFUNC_ABORT 0x10000000\n/* This is a return code for the read callback that, when returned, will\n   signal libcurl to pause sending data on the current transfer. */\n#define CURL_READFUNC_PAUSE 0x10000001\n\ntypedef size_t (*curl_read_callback)(char *buffer,\n                                      size_t size,\n                                      size_t nitems,\n                                      void *instream);\n\ntypedef enum  {\n  CURLSOCKTYPE_IPCXN, /* socket created for a specific IP connection */\n  CURLSOCKTYPE_LAST   /* never use */\n} curlsocktype;\n\ntypedef int (*curl_sockopt_callback)(void *clientp,\n                                     curl_socket_t curlfd,\n                                     curlsocktype purpose);\n\nstruct curl_sockaddr {\n  int family;\n  int socktype;\n  int protocol;\n  unsigned int addrlen; /* addrlen was a socklen_t type before 7.18.0 but it\n                           turned really ugly and painful on the systems that\n                           lack this type */\n  struct sockaddr addr;\n};\n\ntypedef curl_socket_t\n(*curl_opensocket_callback)(void *clientp,\n                            curlsocktype purpose,\n                            struct curl_sockaddr *address);\n\n#ifndef CURL_NO_OLDIES\n  /* not used since 7.10.8, will be removed in a future release */\ntypedef int (*curl_passwd_callback)(void *clientp,\n                                    const char *prompt,\n                                    char *buffer,\n                                    int buflen);\n#endif\n\ntypedef enum {\n  CURLIOE_OK,            /* I/O operation successful */\n  CURLIOE_UNKNOWNCMD,    /* command was unknown to callback */\n  CURLIOE_FAILRESTART,   /* failed to restart the read */\n  CURLIOE_LAST           /* never use */\n} curlioerr;\n\ntypedef enum  {\n  CURLIOCMD_NOP,         /* no operation */\n  CURLIOCMD_RESTARTREAD, /* restart the read stream from start */\n  CURLIOCMD_LAST         /* never use */\n} curliocmd;\n\ntypedef curlioerr (*curl_ioctl_callback)(CURL *handle,\n                                         int cmd,\n                                         void *clientp);\n\n/*\n * The following typedef's are signatures of malloc, free, realloc, strdup and\n * calloc respectively.  Function pointers of these types can be passed to the\n * curl_global_init_mem() function to set user defined memory management\n * callback routines.\n */\ntypedef void *(*curl_malloc_callback)(size_t size);\ntypedef void (*curl_free_callback)(void *ptr);\ntypedef void *(*curl_realloc_callback)(void *ptr, size_t size);\ntypedef char *(*curl_strdup_callback)(const char *str);\ntypedef void *(*curl_calloc_callback)(size_t nmemb, size_t size);\n\n/* the kind of data that is passed to information_callback*/\ntypedef enum {\n  CURLINFO_TEXT = 0,\n  CURLINFO_HEADER_IN,    /* 1 */\n  CURLINFO_HEADER_OUT,   /* 2 */\n  CURLINFO_DATA_IN,      /* 3 */\n  CURLINFO_DATA_OUT,     /* 4 */\n  CURLINFO_SSL_DATA_IN,  /* 5 */\n  CURLINFO_SSL_DATA_OUT, /* 6 */\n  CURLINFO_END\n} curl_infotype;\n\ntypedef int (*curl_debug_callback)\n       (CURL *handle,      /* the handle/transfer this concerns */\n        curl_infotype type, /* what kind of data */\n        char *data,        /* points to the data */\n        size_t size,       /* size of the data pointed to */\n        void *userptr);    /* whatever the user please */\n\n/* All possible error codes from all sorts of curl functions. Future versions\n   may return other values, stay prepared.\n\n   Always add new return codes last. Never *EVER* remove any. The return\n   codes must remain the same!\n */\n\ntypedef enum {\n  CURLE_OK = 0,\n  CURLE_UNSUPPORTED_PROTOCOL,    /* 1 */\n  CURLE_FAILED_INIT,             /* 2 */\n  CURLE_URL_MALFORMAT,           /* 3 */\n  CURLE_OBSOLETE4,               /* 4 - NOT USED */\n  CURLE_COULDNT_RESOLVE_PROXY,   /* 5 */\n  CURLE_COULDNT_RESOLVE_HOST,    /* 6 */\n  CURLE_COULDNT_CONNECT,         /* 7 */\n  CURLE_FTP_WEIRD_SERVER_REPLY,  /* 8 */\n  CURLE_REMOTE_ACCESS_DENIED,    /* 9 a service was denied by the server\n                                    due to lack of access - when login fails\n                                    this is not returned. */\n  CURLE_OBSOLETE10,              /* 10 - NOT USED */\n  CURLE_FTP_WEIRD_PASS_REPLY,    /* 11 */\n  CURLE_OBSOLETE12,              /* 12 - NOT USED */\n  CURLE_FTP_WEIRD_PASV_REPLY,    /* 13 */\n  CURLE_FTP_WEIRD_227_FORMAT,    /* 14 */\n  CURLE_FTP_CANT_GET_HOST,       /* 15 */\n  CURLE_OBSOLETE16,              /* 16 - NOT USED */\n  CURLE_FTP_COULDNT_SET_TYPE,    /* 17 */\n  CURLE_PARTIAL_FILE,            /* 18 */\n  CURLE_FTP_COULDNT_RETR_FILE,   /* 19 */\n  CURLE_OBSOLETE20,              /* 20 - NOT USED */\n  CURLE_QUOTE_ERROR,             /* 21 - quote command failure */\n  CURLE_HTTP_RETURNED_ERROR,     /* 22 */\n  CURLE_WRITE_ERROR,             /* 23 */\n  CURLE_OBSOLETE24,              /* 24 - NOT USED */\n  CURLE_UPLOAD_FAILED,           /* 25 - failed upload \"command\" */\n  CURLE_READ_ERROR,              /* 26 - couldn't open/read from file */\n  CURLE_OUT_OF_MEMORY,           /* 27 */\n  /* Note: CURLE_OUT_OF_MEMORY may sometimes indicate a conversion error\n           instead of a memory allocation error if CURL_DOES_CONVERSIONS\n           is defined\n  */\n  CURLE_OPERATION_TIMEDOUT,      /* 28 - the timeout time was reached */\n  CURLE_OBSOLETE29,              /* 29 - NOT USED */\n  CURLE_FTP_PORT_FAILED,         /* 30 - FTP PORT operation failed */\n  CURLE_FTP_COULDNT_USE_REST,    /* 31 - the REST command failed */\n  CURLE_OBSOLETE32,              /* 32 - NOT USED */\n  CURLE_RANGE_ERROR,             /* 33 - RANGE \"command\" didn't work */\n  CURLE_HTTP_POST_ERROR,         /* 34 */\n  CURLE_SSL_CONNECT_ERROR,       /* 35 - wrong when connecting with SSL */\n  CURLE_BAD_DOWNLOAD_RESUME,     /* 36 - couldn't resume download */\n  CURLE_FILE_COULDNT_READ_FILE,  /* 37 */\n  CURLE_LDAP_CANNOT_BIND,        /* 38 */\n  CURLE_LDAP_SEARCH_FAILED,      /* 39 */\n  CURLE_OBSOLETE40,              /* 40 - NOT USED */\n  CURLE_FUNCTION_NOT_FOUND,      /* 41 */\n  CURLE_ABORTED_BY_CALLBACK,     /* 42 */\n  CURLE_BAD_FUNCTION_ARGUMENT,   /* 43 */\n  CURLE_OBSOLETE44,              /* 44 - NOT USED */\n  CURLE_INTERFACE_FAILED,        /* 45 - CURLOPT_INTERFACE failed */\n  CURLE_OBSOLETE46,              /* 46 - NOT USED */\n  CURLE_TOO_MANY_REDIRECTS ,     /* 47 - catch endless re-direct loops */\n  CURLE_UNKNOWN_TELNET_OPTION,   /* 48 - User specified an unknown option */\n  CURLE_TELNET_OPTION_SYNTAX ,   /* 49 - Malformed telnet option */\n  CURLE_OBSOLETE50,              /* 50 - NOT USED */\n  CURLE_PEER_FAILED_VERIFICATION, /* 51 - peer's certificate or fingerprint\n                                     wasn't verified fine */\n  CURLE_GOT_NOTHING,             /* 52 - when this is a specific error */\n  CURLE_SSL_ENGINE_NOTFOUND,     /* 53 - SSL crypto engine not found */\n  CURLE_SSL_ENGINE_SETFAILED,    /* 54 - can not set SSL crypto engine as\n                                    default */\n  CURLE_SEND_ERROR,              /* 55 - failed sending network data */\n  CURLE_RECV_ERROR,              /* 56 - failure in receiving network data */\n  CURLE_OBSOLETE57,              /* 57 - NOT IN USE */\n  CURLE_SSL_CERTPROBLEM,         /* 58 - problem with the local certificate */\n  CURLE_SSL_CIPHER,              /* 59 - couldn't use specified cipher */\n  CURLE_SSL_CACERT,              /* 60 - problem with the CA cert (path?) */\n  CURLE_BAD_CONTENT_ENCODING,    /* 61 - Unrecognized transfer encoding */\n  CURLE_LDAP_INVALID_URL,        /* 62 - Invalid LDAP URL */\n  CURLE_FILESIZE_EXCEEDED,       /* 63 - Maximum file size exceeded */\n  CURLE_USE_SSL_FAILED,          /* 64 - Requested FTP SSL level failed */\n  CURLE_SEND_FAIL_REWIND,        /* 65 - Sending the data requires a rewind\n                                    that failed */\n  CURLE_SSL_ENGINE_INITFAILED,   /* 66 - failed to initialise ENGINE */\n  CURLE_LOGIN_DENIED,            /* 67 - user, password or similar was not\n                                    accepted and we failed to login */\n  CURLE_TFTP_NOTFOUND,           /* 68 - file not found on server */\n  CURLE_TFTP_PERM,               /* 69 - permission problem on server */\n  CURLE_REMOTE_DISK_FULL,        /* 70 - out of disk space on server */\n  CURLE_TFTP_ILLEGAL,            /* 71 - Illegal TFTP operation */\n  CURLE_TFTP_UNKNOWNID,          /* 72 - Unknown transfer ID */\n  CURLE_REMOTE_FILE_EXISTS,      /* 73 - File already exists */\n  CURLE_TFTP_NOSUCHUSER,         /* 74 - No such user */\n  CURLE_CONV_FAILED,             /* 75 - conversion failed */\n  CURLE_CONV_REQD,               /* 76 - caller must register conversion\n                                    callbacks using curl_easy_setopt options\n                                    CURLOPT_CONV_FROM_NETWORK_FUNCTION,\n                                    CURLOPT_CONV_TO_NETWORK_FUNCTION, and\n                                    CURLOPT_CONV_FROM_UTF8_FUNCTION */\n  CURLE_SSL_CACERT_BADFILE,      /* 77 - could not load CACERT file, missing\n                                    or wrong format */\n  CURLE_REMOTE_FILE_NOT_FOUND,   /* 78 - remote file not found */\n  CURLE_SSH,                     /* 79 - error from the SSH layer, somewhat\n                                    generic so the error message will be of\n                                    interest when this has happened */\n\n  CURLE_SSL_SHUTDOWN_FAILED,     /* 80 - Failed to shut down the SSL\n                                    connection */\n  CURLE_AGAIN,                   /* 81 - socket is not ready for send/recv,\n                                    wait till it's ready and try again (Added\n                                    in 7.18.2) */\n  CURLE_SSL_CRL_BADFILE,         /* 82 - could not load CRL file, missing or\n                                    wrong format (Added in 7.19.0) */\n  CURLE_SSL_ISSUER_ERROR,        /* 83 - Issuer check failed.  (Added in\n                                    7.19.0) */\n  CURL_LAST /* never use! */\n} CURLcode;\n\n#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all\n                          the obsolete stuff removed! */\n\n/* Backwards compatibility with older names */\n\n/* The following were added in 7.17.1 */\n/* These are scheduled to disappear by 2009 */\n#define CURLE_SSL_PEER_CERTIFICATE CURLE_PEER_FAILED_VERIFICATION\n\n/* The following were added in 7.17.0 */\n/* These are scheduled to disappear by 2009 */\n#define CURLE_OBSOLETE CURLE_OBSOLETE50 /* noone should be using this! */\n#define CURLE_BAD_PASSWORD_ENTERED CURLE_OBSOLETE46\n#define CURLE_BAD_CALLING_ORDER CURLE_OBSOLETE44\n#define CURLE_FTP_USER_PASSWORD_INCORRECT CURLE_OBSOLETE10\n#define CURLE_FTP_CANT_RECONNECT CURLE_OBSOLETE16\n#define CURLE_FTP_COULDNT_GET_SIZE CURLE_OBSOLETE32\n#define CURLE_FTP_COULDNT_SET_ASCII CURLE_OBSOLETE29\n#define CURLE_FTP_WEIRD_USER_REPLY CURLE_OBSOLETE12\n#define CURLE_FTP_WRITE_ERROR CURLE_OBSOLETE20\n#define CURLE_LIBRARY_NOT_FOUND CURLE_OBSOLETE40\n#define CURLE_MALFORMAT_USER CURLE_OBSOLETE24\n#define CURLE_SHARE_IN_USE CURLE_OBSOLETE57\n#define CURLE_URL_MALFORMAT_USER CURLE_OBSOLETE4\n\n#define CURLE_FTP_ACCESS_DENIED CURLE_REMOTE_ACCESS_DENIED\n#define CURLE_FTP_COULDNT_SET_BINARY CURLE_FTP_COULDNT_SET_TYPE\n#define CURLE_FTP_QUOTE_ERROR CURLE_QUOTE_ERROR\n#define CURLE_TFTP_DISKFULL CURLE_REMOTE_DISK_FULL\n#define CURLE_TFTP_EXISTS CURLE_REMOTE_FILE_EXISTS\n#define CURLE_HTTP_RANGE_ERROR CURLE_RANGE_ERROR\n#define CURLE_FTP_SSL_FAILED CURLE_USE_SSL_FAILED\n\n/* The following were added earlier */\n\n#define CURLE_OPERATION_TIMEOUTED CURLE_OPERATION_TIMEDOUT\n\n#define CURLE_HTTP_NOT_FOUND CURLE_HTTP_RETURNED_ERROR\n#define CURLE_HTTP_PORT_FAILED CURLE_INTERFACE_FAILED\n#define CURLE_FTP_COULDNT_STOR_FILE CURLE_UPLOAD_FAILED\n\n#define CURLE_FTP_PARTIAL_FILE CURLE_PARTIAL_FILE\n#define CURLE_FTP_BAD_DOWNLOAD_RESUME CURLE_BAD_DOWNLOAD_RESUME\n\n/* This was the error code 50 in 7.7.3 and a few earlier versions, this\n   is no longer used by libcurl but is instead #defined here only to not\n   make programs break */\n#define CURLE_ALREADY_COMPLETE 99999\n\n#endif /*!CURL_NO_OLDIES*/\n\n/* This prototype applies to all conversion callbacks */\ntypedef CURLcode (*curl_conv_callback)(char *buffer, size_t length);\n\ntypedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl,    /* easy handle */\n                                          void *ssl_ctx, /* actually an\n                                                            OpenSSL SSL_CTX */\n                                          void *userptr);\n\ntypedef enum {\n  CURLPROXY_HTTP = 0,   /* added in 7.10, new in 7.19.4 default is to use\n                           CONNECT HTTP/1.1 */\n  CURLPROXY_HTTP_1_0 = 1,   /* added in 7.19.4, force to use CONNECT\n                               HTTP/1.0  */\n  CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already\n                           in 7.10 */\n  CURLPROXY_SOCKS5 = 5, /* added in 7.10 */\n  CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */\n  CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the\n                                   host name rather than the IP address. added\n                                   in 7.18.0 */\n} curl_proxytype;  /* this enum was added in 7.10 */\n\n#define CURLAUTH_NONE         0       /* nothing */\n#define CURLAUTH_BASIC        (1<<0)  /* Basic (default) */\n#define CURLAUTH_DIGEST       (1<<1)  /* Digest */\n#define CURLAUTH_GSSNEGOTIATE (1<<2)  /* GSS-Negotiate */\n#define CURLAUTH_NTLM         (1<<3)  /* NTLM */\n#define CURLAUTH_DIGEST_IE    (1<<4)  /* Digest with IE flavour */\n#define CURLAUTH_ANY (~CURLAUTH_DIGEST_IE)  /* all fine types set */\n#define CURLAUTH_ANYSAFE (~(CURLAUTH_BASIC|CURLAUTH_DIGEST_IE))\n\n#define CURLSSH_AUTH_ANY       ~0     /* all types supported by the server */\n#define CURLSSH_AUTH_NONE      0      /* none allowed, silly but complete */\n#define CURLSSH_AUTH_PUBLICKEY (1<<0) /* public/private key files */\n#define CURLSSH_AUTH_PASSWORD  (1<<1) /* password */\n#define CURLSSH_AUTH_HOST      (1<<2) /* host key files */\n#define CURLSSH_AUTH_KEYBOARD  (1<<3) /* keyboard interactive */\n#define CURLSSH_AUTH_DEFAULT CURLSSH_AUTH_ANY\n\n#define CURL_ERROR_SIZE 256\n\nstruct curl_khkey {\n  const char *key; /* points to a zero-terminated string encoded with base64\n                      if len is zero, otherwise to the \"raw\" data */\n  size_t len;\n  enum type {\n    CURLKHTYPE_UNKNOWN,\n    CURLKHTYPE_RSA1,\n    CURLKHTYPE_RSA,\n    CURLKHTYPE_DSS\n  } keytype;\n};\n\n/* this is the set of return values expected from the curl_sshkeycallback\n   callback */\nenum curl_khstat {\n  CURLKHSTAT_FINE_ADD_TO_FILE,\n  CURLKHSTAT_FINE,\n  CURLKHSTAT_REJECT, /* reject the connection, return an error */\n  CURLKHSTAT_DEFER,  /* do not accept it, but we can't answer right now so\n                        this causes a CURLE_DEFER error but otherwise the\n                        connection will be left intact etc */\n  CURLKHSTAT_LAST    /* not for use, only a marker for last-in-list */\n};\n\n/* this is the set of status codes pass in to the callback */\nenum curl_khmatch {\n  CURLKHMATCH_OK,       /* match */\n  CURLKHMATCH_MISMATCH, /* host found, key mismatch! */\n  CURLKHMATCH_MISSING,  /* no matching host/key found */\n  CURLKHMATCH_LAST      /* not for use, only a marker for last-in-list */\n};\n\ntypedef int\n  (*curl_sshkeycallback) (CURL *easy,     /* easy handle */\n                          const struct curl_khkey *knownkey, /* known */\n                          const struct curl_khkey *foundkey, /* found */\n                          enum curl_khmatch, /* libcurl's view on the keys */\n                          void *clientp); /* custom pointer passed from app */\n\n/* parameter for the CURLOPT_USE_SSL option */\ntypedef enum {\n  CURLUSESSL_NONE,    /* do not attempt to use SSL */\n  CURLUSESSL_TRY,     /* try using SSL, proceed anyway otherwise */\n  CURLUSESSL_CONTROL, /* SSL for the control connection or fail */\n  CURLUSESSL_ALL,     /* SSL for all communication or fail */\n  CURLUSESSL_LAST     /* not an option, never use */\n} curl_usessl;\n\n#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all\n                          the obsolete stuff removed! */\n\n/* Backwards compatibility with older names */\n/* These are scheduled to disappear by 2009 */\n\n#define CURLFTPSSL_NONE CURLUSESSL_NONE\n#define CURLFTPSSL_TRY CURLUSESSL_TRY\n#define CURLFTPSSL_CONTROL CURLUSESSL_CONTROL\n#define CURLFTPSSL_ALL CURLUSESSL_ALL\n#define CURLFTPSSL_LAST CURLUSESSL_LAST\n#define curl_ftpssl curl_usessl\n#endif /*!CURL_NO_OLDIES*/\n\n/* parameter for the CURLOPT_FTP_SSL_CCC option */\ntypedef enum {\n  CURLFTPSSL_CCC_NONE,    /* do not send CCC */\n  CURLFTPSSL_CCC_PASSIVE, /* Let the server initiate the shutdown */\n  CURLFTPSSL_CCC_ACTIVE,  /* Initiate the shutdown */\n  CURLFTPSSL_CCC_LAST     /* not an option, never use */\n} curl_ftpccc;\n\n/* parameter for the CURLOPT_FTPSSLAUTH option */\ntypedef enum {\n  CURLFTPAUTH_DEFAULT, /* let libcurl decide */\n  CURLFTPAUTH_SSL,     /* use \"AUTH SSL\" */\n  CURLFTPAUTH_TLS,     /* use \"AUTH TLS\" */\n  CURLFTPAUTH_LAST /* not an option, never use */\n} curl_ftpauth;\n\n/* parameter for the CURLOPT_FTP_CREATE_MISSING_DIRS option */\ntypedef enum {\n  CURLFTP_CREATE_DIR_NONE,  /* do NOT create missing dirs! */\n  CURLFTP_CREATE_DIR,       /* (FTP/SFTP) if CWD fails, try MKD and then CWD\n                               again if MKD succeeded, for SFTP this does\n                               similar magic */\n  CURLFTP_CREATE_DIR_RETRY, /* (FTP only) if CWD fails, try MKD and then CWD\n                               again even if MKD failed! */\n  CURLFTP_CREATE_DIR_LAST   /* not an option, never use */\n} curl_ftpcreatedir;\n\n/* parameter for the CURLOPT_FTP_FILEMETHOD option */\ntypedef enum {\n  CURLFTPMETHOD_DEFAULT,   /* let libcurl pick */\n  CURLFTPMETHOD_MULTICWD,  /* single CWD operation for each path part */\n  CURLFTPMETHOD_NOCWD,     /* no CWD at all */\n  CURLFTPMETHOD_SINGLECWD, /* one CWD to full dir, then work on file */\n  CURLFTPMETHOD_LAST       /* not an option, never use */\n} curl_ftpmethod;\n\n/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */\n#define CURLPROTO_HTTP   (1<<0)\n#define CURLPROTO_HTTPS  (1<<1)\n#define CURLPROTO_FTP    (1<<2)\n#define CURLPROTO_FTPS   (1<<3)\n#define CURLPROTO_SCP    (1<<4)\n#define CURLPROTO_SFTP   (1<<5)\n#define CURLPROTO_TELNET (1<<6)\n#define CURLPROTO_LDAP   (1<<7)\n#define CURLPROTO_LDAPS  (1<<8)\n#define CURLPROTO_DICT   (1<<9)\n#define CURLPROTO_FILE   (1<<10)\n#define CURLPROTO_TFTP   (1<<11)\n#define CURLPROTO_ALL    (~0) /* enable everything */\n\n/* long may be 32 or 64 bits, but we should never depend on anything else\n   but 32 */\n#define CURLOPTTYPE_LONG          0\n#define CURLOPTTYPE_OBJECTPOINT   10000\n#define CURLOPTTYPE_FUNCTIONPOINT 20000\n#define CURLOPTTYPE_OFF_T         30000\n\n/* name is uppercase CURLOPT_<name>,\n   type is one of the defined CURLOPTTYPE_<type>\n   number is unique identifier */\n#ifdef CINIT\n#undef CINIT\n#endif\n\n#ifdef CURL_ISOCPP\n#define CINIT(name,type,number) CURLOPT_ ## name = CURLOPTTYPE_ ## type + number\n#else\n/* The macro \"##\" is ISO C, we assume pre-ISO C doesn't support it. */\n#define LONG          CURLOPTTYPE_LONG\n#define OBJECTPOINT   CURLOPTTYPE_OBJECTPOINT\n#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT\n#define OFF_T         CURLOPTTYPE_OFF_T\n#define CINIT(name,type,number) CURLOPT_/**/name = type + number\n#endif\n\n/*\n * This macro-mania below setups the CURLOPT_[what] enum, to be used with\n * curl_easy_setopt(). The first argument in the CINIT() macro is the [what]\n * word.\n */\n\ntypedef enum {\n  /* This is the FILE * or void * the regular output should be written to. */\n  CINIT(FILE, OBJECTPOINT, 1),\n\n  /* The full URL to get/put */\n  CINIT(URL,  OBJECTPOINT, 2),\n\n  /* Port number to connect to, if other than default. */\n  CINIT(PORT, LONG, 3),\n\n  /* Name of proxy to use. */\n  CINIT(PROXY, OBJECTPOINT, 4),\n\n  /* \"name:password\" to use when fetching. */\n  CINIT(USERPWD, OBJECTPOINT, 5),\n\n  /* \"name:password\" to use with proxy. */\n  CINIT(PROXYUSERPWD, OBJECTPOINT, 6),\n\n  /* Range to get, specified as an ASCII string. */\n  CINIT(RANGE, OBJECTPOINT, 7),\n\n  /* not used */\n\n  /* Specified file stream to upload from (use as input): */\n  CINIT(INFILE, OBJECTPOINT, 9),\n\n  /* Buffer to receive error messages in, must be at least CURL_ERROR_SIZE\n   * bytes big. If this is not used, error messages go to stderr instead: */\n  CINIT(ERRORBUFFER, OBJECTPOINT, 10),\n\n  /* Function that will be called to store the output (instead of fwrite). The\n   * parameters will use fwrite() syntax, make sure to follow them. */\n  CINIT(WRITEFUNCTION, FUNCTIONPOINT, 11),\n\n  /* Function that will be called to read the input (instead of fread). The\n   * parameters will use fread() syntax, make sure to follow them. */\n  CINIT(READFUNCTION, FUNCTIONPOINT, 12),\n\n  /* Time-out the read operation after this amount of seconds */\n  CINIT(TIMEOUT, LONG, 13),\n\n  /* If the CURLOPT_INFILE is used, this can be used to inform libcurl about\n   * how large the file being sent really is. That allows better error\n   * checking and better verifies that the upload was successful. -1 means\n   * unknown size.\n   *\n   * For large file support, there is also a _LARGE version of the key\n   * which takes an off_t type, allowing platforms with larger off_t\n   * sizes to handle larger files.  See below for INFILESIZE_LARGE.\n   */\n  CINIT(INFILESIZE, LONG, 14),\n\n  /* POST static input fields. */\n  CINIT(POSTFIELDS, OBJECTPOINT, 15),\n\n  /* Set the referrer page (needed by some CGIs) */\n  CINIT(REFERER, OBJECTPOINT, 16),\n\n  /* Set the FTP PORT string (interface name, named or numerical IP address)\n     Use i.e '-' to use default address. */\n  CINIT(FTPPORT, OBJECTPOINT, 17),\n\n  /* Set the User-Agent string (examined by some CGIs) */\n  CINIT(USERAGENT, OBJECTPOINT, 18),\n\n  /* If the download receives less than \"low speed limit\" bytes/second\n   * during \"low speed time\" seconds, the operations is aborted.\n   * You could i.e if you have a pretty high speed connection, abort if\n   * it is less than 2000 bytes/sec during 20 seconds.\n   */\n\n  /* Set the \"low speed limit\" */\n  CINIT(LOW_SPEED_LIMIT, LONG, 19),\n\n  /* Set the \"low speed time\" */\n  CINIT(LOW_SPEED_TIME, LONG, 20),\n\n  /* Set the continuation offset.\n   *\n   * Note there is also a _LARGE version of this key which uses\n   * off_t types, allowing for large file offsets on platforms which\n   * use larger-than-32-bit off_t's.  Look below for RESUME_FROM_LARGE.\n   */\n  CINIT(RESUME_FROM, LONG, 21),\n\n  /* Set cookie in request: */\n  CINIT(COOKIE, OBJECTPOINT, 22),\n\n  /* This points to a linked list of headers, struct curl_slist kind */\n  CINIT(HTTPHEADER, OBJECTPOINT, 23),\n\n  /* This points to a linked list of post entries, struct curl_httppost */\n  CINIT(HTTPPOST, OBJECTPOINT, 24),\n\n  /* name of the file keeping your private SSL-certificate */\n  CINIT(SSLCERT, OBJECTPOINT, 25),\n\n  /* password for the SSL or SSH private key */\n  CINIT(KEYPASSWD, OBJECTPOINT, 26),\n\n  /* send TYPE parameter? */\n  CINIT(CRLF, LONG, 27),\n\n  /* send linked-list of QUOTE commands */\n  CINIT(QUOTE, OBJECTPOINT, 28),\n\n  /* send FILE * or void * to store headers to, if you use a callback it\n     is simply passed to the callback unmodified */\n  CINIT(WRITEHEADER, OBJECTPOINT, 29),\n\n  /* point to a file to read the initial cookies from, also enables\n     \"cookie awareness\" */\n  CINIT(COOKIEFILE, OBJECTPOINT, 31),\n\n  /* What version to specifically try to use.\n     See CURL_SSLVERSION defines below. */\n  CINIT(SSLVERSION, LONG, 32),\n\n  /* What kind of HTTP time condition to use, see defines */\n  CINIT(TIMECONDITION, LONG, 33),\n\n  /* Time to use with the above condition. Specified in number of seconds\n     since 1 Jan 1970 */\n  CINIT(TIMEVALUE, LONG, 34),\n\n  /* 35 = OBSOLETE */\n\n  /* Custom request, for customizing the get command like\n     HTTP: DELETE, TRACE and others\n     FTP: to use a different list command\n     */\n  CINIT(CUSTOMREQUEST, OBJECTPOINT, 36),\n\n  /* HTTP request, for odd commands like DELETE, TRACE and others */\n  CINIT(STDERR, OBJECTPOINT, 37),\n\n  /* 38 is not used */\n\n  /* send linked-list of post-transfer QUOTE commands */\n  CINIT(POSTQUOTE, OBJECTPOINT, 39),\n\n  /* Pass a pointer to string of the output using full variable-replacement\n     as described elsewhere. */\n  CINIT(WRITEINFO, OBJECTPOINT, 40),\n\n  CINIT(VERBOSE, LONG, 41),      /* talk a lot */\n  CINIT(HEADER, LONG, 42),       /* throw the header out too */\n  CINIT(NOPROGRESS, LONG, 43),   /* shut off the progress meter */\n  CINIT(NOBODY, LONG, 44),       /* use HEAD to get http document */\n  CINIT(FAILONERROR, LONG, 45),  /* no output on http error codes >= 300 */\n  CINIT(UPLOAD, LONG, 46),       /* this is an upload */\n  CINIT(POST, LONG, 47),         /* HTTP POST method */\n  CINIT(DIRLISTONLY, LONG, 48),  /* return bare names when listing directories */\n\n  CINIT(APPEND, LONG, 50),       /* Append instead of overwrite on upload! */\n\n  /* Specify whether to read the user+password from the .netrc or the URL.\n   * This must be one of the CURL_NETRC_* enums below. */\n  CINIT(NETRC, LONG, 51),\n\n  CINIT(FOLLOWLOCATION, LONG, 52),  /* use Location: Luke! */\n\n  CINIT(TRANSFERTEXT, LONG, 53), /* transfer data in text/ASCII format */\n  CINIT(PUT, LONG, 54),          /* HTTP PUT */\n\n  /* 55 = OBSOLETE */\n\n  /* Function that will be called instead of the internal progress display\n   * function. This function should be defined as the curl_progress_callback\n   * prototype defines. */\n  CINIT(PROGRESSFUNCTION, FUNCTIONPOINT, 56),\n\n  /* Data passed to the progress callback */\n  CINIT(PROGRESSDATA, OBJECTPOINT, 57),\n\n  /* We want the referrer field set automatically when following locations */\n  CINIT(AUTOREFERER, LONG, 58),\n\n  /* Port of the proxy, can be set in the proxy string as well with:\n     \"[host]:[port]\" */\n  CINIT(PROXYPORT, LONG, 59),\n\n  /* size of the POST input data, if strlen() is not good to use */\n  CINIT(POSTFIELDSIZE, LONG, 60),\n\n  /* tunnel non-http operations through a HTTP proxy */\n  CINIT(HTTPPROXYTUNNEL, LONG, 61),\n\n  /* Set the interface string to use as outgoing network interface */\n  CINIT(INTERFACE, OBJECTPOINT, 62),\n\n  /* Set the krb4/5 security level, this also enables krb4/5 awareness.  This\n   * is a string, 'clear', 'safe', 'confidential' or 'private'.  If the string\n   * is set but doesn't match one of these, 'private' will be used.  */\n  CINIT(KRBLEVEL, OBJECTPOINT, 63),\n\n  /* Set if we should verify the peer in ssl handshake, set 1 to verify. */\n  CINIT(SSL_VERIFYPEER, LONG, 64),\n\n  /* The CApath or CAfile used to validate the peer certificate\n     this option is used only if SSL_VERIFYPEER is true */\n  CINIT(CAINFO, OBJECTPOINT, 65),\n\n  /* 66 = OBSOLETE */\n  /* 67 = OBSOLETE */\n\n  /* Maximum number of http redirects to follow */\n  CINIT(MAXREDIRS, LONG, 68),\n\n  /* Pass a long set to 1 to get the date of the requested document (if\n     possible)! Pass a zero to shut it off. */\n  CINIT(FILETIME, LONG, 69),\n\n  /* This points to a linked list of telnet options */\n  CINIT(TELNETOPTIONS, OBJECTPOINT, 70),\n\n  /* Max amount of cached alive connections */\n  CINIT(MAXCONNECTS, LONG, 71),\n\n  /* What policy to use when closing connections when the cache is filled\n     up */\n  CINIT(CLOSEPOLICY, LONG, 72),\n\n  /* 73 = OBSOLETE */\n\n  /* Set to explicitly use a new connection for the upcoming transfer.\n     Do not use this unless you're absolutely sure of this, as it makes the\n     operation slower and is less friendly for the network. */\n  CINIT(FRESH_CONNECT, LONG, 74),\n\n  /* Set to explicitly forbid the upcoming transfer's connection to be re-used\n     when done. Do not use this unless you're absolutely sure of this, as it\n     makes the operation slower and is less friendly for the network. */\n  CINIT(FORBID_REUSE, LONG, 75),\n\n  /* Set to a file name that contains random data for libcurl to use to\n     seed the random engine when doing SSL connects. */\n  CINIT(RANDOM_FILE, OBJECTPOINT, 76),\n\n  /* Set to the Entropy Gathering Daemon socket pathname */\n  CINIT(EGDSOCKET, OBJECTPOINT, 77),\n\n  /* Time-out connect operations after this amount of seconds, if connects\n     are OK within this time, then fine... This only aborts the connect\n     phase. [Only works on unix-style/SIGALRM operating systems] */\n  CINIT(CONNECTTIMEOUT, LONG, 78),\n\n  /* Function that will be called to store headers (instead of fwrite). The\n   * parameters will use fwrite() syntax, make sure to follow them. */\n  CINIT(HEADERFUNCTION, FUNCTIONPOINT, 79),\n\n  /* Set this to force the HTTP request to get back to GET. Only really usable\n     if POST, PUT or a custom request have been used first.\n   */\n  CINIT(HTTPGET, LONG, 80),\n\n  /* Set if we should verify the Common name from the peer certificate in ssl\n   * handshake, set 1 to check existence, 2 to ensure that it matches the\n   * provided hostname. */\n  CINIT(SSL_VERIFYHOST, LONG, 81),\n\n  /* Specify which file name to write all known cookies in after completed\n     operation. Set file name to \"-\" (dash) to make it go to stdout. */\n  CINIT(COOKIEJAR, OBJECTPOINT, 82),\n\n  /* Specify which SSL ciphers to use */\n  CINIT(SSL_CIPHER_LIST, OBJECTPOINT, 83),\n\n  /* Specify which HTTP version to use! This must be set to one of the\n     CURL_HTTP_VERSION* enums set below. */\n  CINIT(HTTP_VERSION, LONG, 84),\n\n  /* Specifically switch on or off the FTP engine's use of the EPSV command. By\n     default, that one will always be attempted before the more traditional\n     PASV command. */\n  CINIT(FTP_USE_EPSV, LONG, 85),\n\n  /* type of the file keeping your SSL-certificate (\"DER\", \"PEM\", \"ENG\") */\n  CINIT(SSLCERTTYPE, OBJECTPOINT, 86),\n\n  /* name of the file keeping your private SSL-key */\n  CINIT(SSLKEY, OBJECTPOINT, 87),\n\n  /* type of the file keeping your private SSL-key (\"DER\", \"PEM\", \"ENG\") */\n  CINIT(SSLKEYTYPE, OBJECTPOINT, 88),\n\n  /* crypto engine for the SSL-sub system */\n  CINIT(SSLENGINE, OBJECTPOINT, 89),\n\n  /* set the crypto engine for the SSL-sub system as default\n     the param has no meaning...\n   */\n  CINIT(SSLENGINE_DEFAULT, LONG, 90),\n\n  /* Non-zero value means to use the global dns cache */\n  CINIT(DNS_USE_GLOBAL_CACHE, LONG, 91), /* To become OBSOLETE soon */\n\n  /* DNS cache timeout */\n  CINIT(DNS_CACHE_TIMEOUT, LONG, 92),\n\n  /* send linked-list of pre-transfer QUOTE commands */\n  CINIT(PREQUOTE, OBJECTPOINT, 93),\n\n  /* set the debug function */\n  CINIT(DEBUGFUNCTION, FUNCTIONPOINT, 94),\n\n  /* set the data for the debug function */\n  CINIT(DEBUGDATA, OBJECTPOINT, 95),\n\n  /* mark this as start of a cookie session */\n  CINIT(COOKIESESSION, LONG, 96),\n\n  /* The CApath directory used to validate the peer certificate\n     this option is used only if SSL_VERIFYPEER is true */\n  CINIT(CAPATH, OBJECTPOINT, 97),\n\n  /* Instruct libcurl to use a smaller receive buffer */\n  CINIT(BUFFERSIZE, LONG, 98),\n\n  /* Instruct libcurl to not use any signal/alarm handlers, even when using\n     timeouts. This option is useful for multi-threaded applications.\n     See libcurl-the-guide for more background information. */\n  CINIT(NOSIGNAL, LONG, 99),\n\n  /* Provide a CURLShare for mutexing non-ts data */\n  CINIT(SHARE, OBJECTPOINT, 100),\n\n  /* indicates type of proxy. accepted values are CURLPROXY_HTTP (default),\n     CURLPROXY_SOCKS4, CURLPROXY_SOCKS4A and CURLPROXY_SOCKS5. */\n  CINIT(PROXYTYPE, LONG, 101),\n\n  /* Set the Accept-Encoding string. Use this to tell a server you would like\n     the response to be compressed. */\n  CINIT(ENCODING, OBJECTPOINT, 102),\n\n  /* Set pointer to private data */\n  CINIT(PRIVATE, OBJECTPOINT, 103),\n\n  /* Set aliases for HTTP 200 in the HTTP Response header */\n  CINIT(HTTP200ALIASES, OBJECTPOINT, 104),\n\n  /* Continue to send authentication (user+password) when following locations,\n     even when hostname changed. This can potentially send off the name\n     and password to whatever host the server decides. */\n  CINIT(UNRESTRICTED_AUTH, LONG, 105),\n\n  /* Specifically switch on or off the FTP engine's use of the EPRT command ( it\n     also disables the LPRT attempt). By default, those ones will always be\n     attempted before the good old traditional PORT command. */\n  CINIT(FTP_USE_EPRT, LONG, 106),\n\n  /* Set this to a bitmask value to enable the particular authentications\n     methods you like. Use this in combination with CURLOPT_USERPWD.\n     Note that setting multiple bits may cause extra network round-trips. */\n  CINIT(HTTPAUTH, LONG, 107),\n\n  /* Set the ssl context callback function, currently only for OpenSSL ssl_ctx\n     in second argument. The function must be matching the\n     curl_ssl_ctx_callback proto. */\n  CINIT(SSL_CTX_FUNCTION, FUNCTIONPOINT, 108),\n\n  /* Set the userdata for the ssl context callback function's third\n     argument */\n  CINIT(SSL_CTX_DATA, OBJECTPOINT, 109),\n\n  /* FTP Option that causes missing dirs to be created on the remote server.\n     In 7.19.4 we introduced the convenience enums for this option using the\n     CURLFTP_CREATE_DIR prefix.\n  */\n  CINIT(FTP_CREATE_MISSING_DIRS, LONG, 110),\n\n  /* Set this to a bitmask value to enable the particular authentications\n     methods you like. Use this in combination with CURLOPT_PROXYUSERPWD.\n     Note that setting multiple bits may cause extra network round-trips. */\n  CINIT(PROXYAUTH, LONG, 111),\n\n  /* FTP option that changes the timeout, in seconds, associated with\n     getting a response.  This is different from transfer timeout time and\n     essentially places a demand on the FTP server to acknowledge commands\n     in a timely manner. */\n  CINIT(FTP_RESPONSE_TIMEOUT, LONG, 112),\n\n  /* Set this option to one of the CURL_IPRESOLVE_* defines (see below) to\n     tell libcurl to resolve names to those IP versions only. This only has\n     affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */\n  CINIT(IPRESOLVE, LONG, 113),\n\n  /* Set this option to limit the size of a file that will be downloaded from\n     an HTTP or FTP server.\n\n     Note there is also _LARGE version which adds large file support for\n     platforms which have larger off_t sizes.  See MAXFILESIZE_LARGE below. */\n  CINIT(MAXFILESIZE, LONG, 114),\n\n  /* See the comment for INFILESIZE above, but in short, specifies\n   * the size of the file being uploaded.  -1 means unknown.\n   */\n  CINIT(INFILESIZE_LARGE, OFF_T, 115),\n\n  /* Sets the continuation offset.  There is also a LONG version of this;\n   * look above for RESUME_FROM.\n   */\n  CINIT(RESUME_FROM_LARGE, OFF_T, 116),\n\n  /* Sets the maximum size of data that will be downloaded from\n   * an HTTP or FTP server.  See MAXFILESIZE above for the LONG version.\n   */\n  CINIT(MAXFILESIZE_LARGE, OFF_T, 117),\n\n  /* Set this option to the file name of your .netrc file you want libcurl\n     to parse (using the CURLOPT_NETRC option). If not set, libcurl will do\n     a poor attempt to find the user's home directory and check for a .netrc\n     file in there. */\n  CINIT(NETRC_FILE, OBJECTPOINT, 118),\n\n  /* Enable SSL/TLS for FTP, pick one of:\n     CURLFTPSSL_TRY     - try using SSL, proceed anyway otherwise\n     CURLFTPSSL_CONTROL - SSL for the control connection or fail\n     CURLFTPSSL_ALL     - SSL for all communication or fail\n  */\n  CINIT(USE_SSL, LONG, 119),\n\n  /* The _LARGE version of the standard POSTFIELDSIZE option */\n  CINIT(POSTFIELDSIZE_LARGE, OFF_T, 120),\n\n  /* Enable/disable the TCP Nagle algorithm */\n  CINIT(TCP_NODELAY, LONG, 121),\n\n  /* 122 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */\n  /* 123 OBSOLETE. Gone in 7.16.0 */\n  /* 124 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */\n  /* 125 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */\n  /* 126 OBSOLETE, used in 7.12.3. Gone in 7.13.0 */\n  /* 127 OBSOLETE. Gone in 7.16.0 */\n  /* 128 OBSOLETE. Gone in 7.16.0 */\n\n  /* When FTP over SSL/TLS is selected (with CURLOPT_USE_SSL), this option\n     can be used to change libcurl's default action which is to first try\n     \"AUTH SSL\" and then \"AUTH TLS\" in this order, and proceed when a OK\n     response has been received.\n\n     Available parameters are:\n     CURLFTPAUTH_DEFAULT - let libcurl decide\n     CURLFTPAUTH_SSL     - try \"AUTH SSL\" first, then TLS\n     CURLFTPAUTH_TLS     - try \"AUTH TLS\" first, then SSL\n  */\n  CINIT(FTPSSLAUTH, LONG, 129),\n\n  CINIT(IOCTLFUNCTION, FUNCTIONPOINT, 130),\n  CINIT(IOCTLDATA, OBJECTPOINT, 131),\n\n  /* 132 OBSOLETE. Gone in 7.16.0 */\n  /* 133 OBSOLETE. Gone in 7.16.0 */\n\n  /* zero terminated string for pass on to the FTP server when asked for\n     \"account\" info */\n  CINIT(FTP_ACCOUNT, OBJECTPOINT, 134),\n\n  /* feed cookies into cookie engine */\n  CINIT(COOKIELIST, OBJECTPOINT, 135),\n\n  /* ignore Content-Length */\n  CINIT(IGNORE_CONTENT_LENGTH, LONG, 136),\n\n  /* Set to non-zero to skip the IP address received in a 227 PASV FTP server\n     response. Typically used for FTP-SSL purposes but is not restricted to\n     that. libcurl will then instead use the same IP address it used for the\n     control connection. */\n  CINIT(FTP_SKIP_PASV_IP, LONG, 137),\n\n  /* Select \"file method\" to use when doing FTP, see the curl_ftpmethod\n     above. */\n  CINIT(FTP_FILEMETHOD, LONG, 138),\n\n  /* Local port number to bind the socket to */\n  CINIT(LOCALPORT, LONG, 139),\n\n  /* Number of ports to try, including the first one set with LOCALPORT.\n     Thus, setting it to 1 will make no additional attempts but the first.\n  */\n  CINIT(LOCALPORTRANGE, LONG, 140),\n\n  /* no transfer, set up connection and let application use the socket by\n     extracting it with CURLINFO_LASTSOCKET */\n  CINIT(CONNECT_ONLY, LONG, 141),\n\n  /* Function that will be called to convert from the\n     network encoding (instead of using the iconv calls in libcurl) */\n  CINIT(CONV_FROM_NETWORK_FUNCTION, FUNCTIONPOINT, 142),\n\n  /* Function that will be called to convert to the\n     network encoding (instead of using the iconv calls in libcurl) */\n  CINIT(CONV_TO_NETWORK_FUNCTION, FUNCTIONPOINT, 143),\n\n  /* Function that will be called to convert from UTF8\n     (instead of using the iconv calls in libcurl)\n     Note that this is used only for SSL certificate processing */\n  CINIT(CONV_FROM_UTF8_FUNCTION, FUNCTIONPOINT, 144),\n\n  /* if the connection proceeds too quickly then need to slow it down */\n  /* limit-rate: maximum number of bytes per second to send or receive */\n  CINIT(MAX_SEND_SPEED_LARGE, OFF_T, 145),\n  CINIT(MAX_RECV_SPEED_LARGE, OFF_T, 146),\n\n  /* Pointer to command string to send if USER/PASS fails. */\n  CINIT(FTP_ALTERNATIVE_TO_USER, OBJECTPOINT, 147),\n\n  /* callback function for setting socket options */\n  CINIT(SOCKOPTFUNCTION, FUNCTIONPOINT, 148),\n  CINIT(SOCKOPTDATA, OBJECTPOINT, 149),\n\n  /* set to 0 to disable session ID re-use for this transfer, default is\n     enabled (== 1) */\n  CINIT(SSL_SESSIONID_CACHE, LONG, 150),\n\n  /* allowed SSH authentication methods */\n  CINIT(SSH_AUTH_TYPES, LONG, 151),\n\n  /* Used by scp/sftp to do public/private key authentication */\n  CINIT(SSH_PUBLIC_KEYFILE, OBJECTPOINT, 152),\n  CINIT(SSH_PRIVATE_KEYFILE, OBJECTPOINT, 153),\n\n  /* Send CCC (Clear Command Channel) after authentication */\n  CINIT(FTP_SSL_CCC, LONG, 154),\n\n  /* Same as TIMEOUT and CONNECTTIMEOUT, but with ms resolution */\n  CINIT(TIMEOUT_MS, LONG, 155),\n  CINIT(CONNECTTIMEOUT_MS, LONG, 156),\n\n  /* set to zero to disable the libcurl's decoding and thus pass the raw body\n     data to the application even when it is encoded/compressed */\n  CINIT(HTTP_TRANSFER_DECODING, LONG, 157),\n  CINIT(HTTP_CONTENT_DECODING, LONG, 158),\n\n  /* Permission used when creating new files and directories on the remote\n     server for protocols that support it, SFTP/SCP/FILE */\n  CINIT(NEW_FILE_PERMS, LONG, 159),\n  CINIT(NEW_DIRECTORY_PERMS, LONG, 160),\n\n  /* Set the behaviour of POST when redirecting. Values must be set to one\n     of CURL_REDIR* defines below. This used to be called CURLOPT_POST301 */\n  CINIT(POSTREDIR, LONG, 161),\n\n  /* used by scp/sftp to verify the host's public key */\n  CINIT(SSH_HOST_PUBLIC_KEY_MD5, OBJECTPOINT, 162),\n\n  /* Callback function for opening socket (instead of socket(2)). Optionally,\n     callback is able change the address or refuse to connect returning\n     CURL_SOCKET_BAD.  The callback should have type\n     curl_opensocket_callback */\n  CINIT(OPENSOCKETFUNCTION, FUNCTIONPOINT, 163),\n  CINIT(OPENSOCKETDATA, OBJECTPOINT, 164),\n\n  /* POST volatile input fields. */\n  CINIT(COPYPOSTFIELDS, OBJECTPOINT, 165),\n\n  /* set transfer mode (;type=<a|i>) when doing FTP via an HTTP proxy */\n  CINIT(PROXY_TRANSFER_MODE, LONG, 166),\n\n  /* Callback function for seeking in the input stream */\n  CINIT(SEEKFUNCTION, FUNCTIONPOINT, 167),\n  CINIT(SEEKDATA, OBJECTPOINT, 168),\n\n  /* CRL file */\n  CINIT(CRLFILE, OBJECTPOINT, 169),\n\n  /* Issuer certificate */\n  CINIT(ISSUERCERT, OBJECTPOINT, 170),\n\n  /* (IPv6) Address scope */\n  CINIT(ADDRESS_SCOPE, LONG, 171),\n\n  /* Collect certificate chain info and allow it to get retrievable with\n     CURLINFO_CERTINFO after the transfer is complete. (Unfortunately) only\n     working with OpenSSL-powered builds. */\n  CINIT(CERTINFO, LONG, 172),\n\n  /* \"name\" and \"pwd\" to use when fetching. */\n  CINIT(USERNAME, OBJECTPOINT, 173),\n  CINIT(PASSWORD, OBJECTPOINT, 174),\n\n    /* \"name\" and \"pwd\" to use with Proxy when fetching. */\n  CINIT(PROXYUSERNAME, OBJECTPOINT, 175),\n  CINIT(PROXYPASSWORD, OBJECTPOINT, 176),\n\n  /* Comma separated list of hostnames defining no-proxy zones. These should\n     match both hostnames directly, and hostnames within a domain. For\n     example, local.com will match local.com and www.local.com, but NOT\n     notlocal.com or www.notlocal.com. For compatibility with other\n     implementations of this, .local.com will be considered to be the same as\n     local.com. A single * is the only valid wildcard, and effectively\n     disables the use of proxy. */\n  CINIT(NOPROXY, OBJECTPOINT, 177),\n\n  /* block size for TFTP transfers */\n  CINIT(TFTP_BLKSIZE, LONG, 178),\n\n  /* Socks Service */\n  CINIT(SOCKS5_GSSAPI_SERVICE, OBJECTPOINT, 179),\n\n  /* Socks Service */\n  CINIT(SOCKS5_GSSAPI_NEC, LONG, 180),\n\n  /* set the bitmask for the protocols that are allowed to be used for the\n     transfer, which thus helps the app which takes URLs from users or other\n     external inputs and want to restrict what protocol(s) to deal\n     with. Defaults to CURLPROTO_ALL. */\n  CINIT(PROTOCOLS, LONG, 181),\n\n  /* set the bitmask for the protocols that libcurl is allowed to follow to,\n     as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs\n     to be set in both bitmasks to be allowed to get redirected to. Defaults\n     to all protocols except FILE and SCP. */\n  CINIT(REDIR_PROTOCOLS, LONG, 182),\n\n  /* set the SSH knownhost file name to use */\n  CINIT(SSH_KNOWNHOSTS, OBJECTPOINT, 183),\n\n  /* set the SSH host key callback, must point to a curl_sshkeycallback\n     function */\n  CINIT(SSH_KEYFUNCTION, FUNCTIONPOINT, 184),\n\n  /* set the SSH host key callback custom pointer */\n  CINIT(SSH_KEYDATA, OBJECTPOINT, 185),\n\n  CURLOPT_LASTENTRY /* the last unused */\n} CURLoption;\n\n#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all\n                          the obsolete stuff removed! */\n\n/* Backwards compatibility with older names */\n/* These are scheduled to disappear by 2011 */\n\n/* This was added in version 7.19.1 */\n#define CURLOPT_POST301 CURLOPT_POSTREDIR\n\n/* These are scheduled to disappear by 2009 */\n\n/* The following were added in 7.17.0 */\n#define CURLOPT_SSLKEYPASSWD CURLOPT_KEYPASSWD\n#define CURLOPT_FTPAPPEND CURLOPT_APPEND\n#define CURLOPT_FTPLISTONLY CURLOPT_DIRLISTONLY\n#define CURLOPT_FTP_SSL CURLOPT_USE_SSL\n\n/* The following were added earlier */\n\n#define CURLOPT_SSLCERTPASSWD CURLOPT_KEYPASSWD\n#define CURLOPT_KRB4LEVEL CURLOPT_KRBLEVEL\n\n#else\n/* This is set if CURL_NO_OLDIES is defined at compile-time */\n#undef CURLOPT_DNS_USE_GLOBAL_CACHE /* soon obsolete */\n#endif\n\n\n  /* Below here follows defines for the CURLOPT_IPRESOLVE option. If a host\n     name resolves addresses using more than one IP protocol version, this\n     option might be handy to force libcurl to use a specific IP version. */\n#define CURL_IPRESOLVE_WHATEVER 0 /* default, resolves addresses to all IP\n                                     versions that your system allows */\n#define CURL_IPRESOLVE_V4       1 /* resolve to ipv4 addresses */\n#define CURL_IPRESOLVE_V6       2 /* resolve to ipv6 addresses */\n\n  /* three convenient \"aliases\" that follow the name scheme better */\n#define CURLOPT_WRITEDATA CURLOPT_FILE\n#define CURLOPT_READDATA  CURLOPT_INFILE\n#define CURLOPT_HEADERDATA CURLOPT_WRITEHEADER\n\n  /* These enums are for use with the CURLOPT_HTTP_VERSION option. */\nenum {\n  CURL_HTTP_VERSION_NONE, /* setting this means we don't care, and that we'd\n                             like the library to choose the best possible\n                             for us! */\n  CURL_HTTP_VERSION_1_0,  /* please use HTTP 1.0 in the request */\n  CURL_HTTP_VERSION_1_1,  /* please use HTTP 1.1 in the request */\n\n  CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */\n};\n\n  /* These enums are for use with the CURLOPT_NETRC option. */\nenum CURL_NETRC_OPTION {\n  CURL_NETRC_IGNORED,     /* The .netrc will never be read.\n                           * This is the default. */\n  CURL_NETRC_OPTIONAL,    /* A user:password in the URL will be preferred\n                           * to one in the .netrc. */\n  CURL_NETRC_REQUIRED,    /* A user:password in the URL will be ignored.\n                           * Unless one is set programmatically, the .netrc\n                           * will be queried. */\n  CURL_NETRC_LAST\n};\n\nenum {\n  CURL_SSLVERSION_DEFAULT,\n  CURL_SSLVERSION_TLSv1,\n  CURL_SSLVERSION_SSLv2,\n  CURL_SSLVERSION_SSLv3,\n\n  CURL_SSLVERSION_LAST /* never use, keep last */\n};\n\n/* symbols to use with CURLOPT_POSTREDIR.\n   CURL_REDIR_POST_301 and CURL_REDIR_POST_302 can be bitwise ORed so that\n   CURL_REDIR_POST_301 | CURL_REDIR_POST_302 == CURL_REDIR_POST_ALL */\n\n#define CURL_REDIR_GET_ALL  0\n#define CURL_REDIR_POST_301 1\n#define CURL_REDIR_POST_302 2\n#define CURL_REDIR_POST_ALL (CURL_REDIR_POST_301|CURL_REDIR_POST_302)\n\ntypedef enum {\n  CURL_TIMECOND_NONE,\n\n  CURL_TIMECOND_IFMODSINCE,\n  CURL_TIMECOND_IFUNMODSINCE,\n  CURL_TIMECOND_LASTMOD,\n\n  CURL_TIMECOND_LAST\n} curl_TimeCond;\n\n\n/* curl_strequal() and curl_strnequal() are subject for removal in a future\n   libcurl, see lib/README.curlx for details */\nCURL_EXTERN int (curl_strequal)(const char *s1, const char *s2);\nCURL_EXTERN int (curl_strnequal)(const char *s1, const char *s2, size_t n);\n\n/* name is uppercase CURLFORM_<name> */\n#ifdef CFINIT\n#undef CFINIT\n#endif\n\n#ifdef CURL_ISOCPP\n#define CFINIT(name) CURLFORM_ ## name\n#else\n/* The macro \"##\" is ISO C, we assume pre-ISO C doesn't support it. */\n#define CFINIT(name) CURLFORM_/**/name\n#endif\n\ntypedef enum {\n  CFINIT(NOTHING),        /********* the first one is unused ************/\n\n  /*  */\n  CFINIT(COPYNAME),\n  CFINIT(PTRNAME),\n  CFINIT(NAMELENGTH),\n  CFINIT(COPYCONTENTS),\n  CFINIT(PTRCONTENTS),\n  CFINIT(CONTENTSLENGTH),\n  CFINIT(FILECONTENT),\n  CFINIT(ARRAY),\n  CFINIT(OBSOLETE),\n  CFINIT(FILE),\n\n  CFINIT(BUFFER),\n  CFINIT(BUFFERPTR),\n  CFINIT(BUFFERLENGTH),\n\n  CFINIT(CONTENTTYPE),\n  CFINIT(CONTENTHEADER),\n  CFINIT(FILENAME),\n  CFINIT(END),\n  CFINIT(OBSOLETE2),\n\n  CFINIT(STREAM),\n\n  CURLFORM_LASTENTRY /* the last unused */\n} CURLformoption;\n\n#undef CFINIT /* done */\n\n/* structure to be used as parameter for CURLFORM_ARRAY */\nstruct curl_forms {\n  CURLformoption option;\n  const char     *value;\n};\n\n/* use this for multipart formpost building */\n/* Returns code for curl_formadd()\n *\n * Returns:\n * CURL_FORMADD_OK             on success\n * CURL_FORMADD_MEMORY         if the FormInfo allocation fails\n * CURL_FORMADD_OPTION_TWICE   if one option is given twice for one Form\n * CURL_FORMADD_NULL           if a null pointer was given for a char\n * CURL_FORMADD_MEMORY         if the allocation of a FormInfo struct failed\n * CURL_FORMADD_UNKNOWN_OPTION if an unknown option was used\n * CURL_FORMADD_INCOMPLETE     if the some FormInfo is not complete (or error)\n * CURL_FORMADD_MEMORY         if a curl_httppost struct cannot be allocated\n * CURL_FORMADD_MEMORY         if some allocation for string copying failed.\n * CURL_FORMADD_ILLEGAL_ARRAY  if an illegal option is used in an array\n *\n ***************************************************************************/\ntypedef enum {\n  CURL_FORMADD_OK, /* first, no error */\n\n  CURL_FORMADD_MEMORY,\n  CURL_FORMADD_OPTION_TWICE,\n  CURL_FORMADD_NULL,\n  CURL_FORMADD_UNKNOWN_OPTION,\n  CURL_FORMADD_INCOMPLETE,\n  CURL_FORMADD_ILLEGAL_ARRAY,\n  CURL_FORMADD_DISABLED, /* libcurl was built with this disabled */\n\n  CURL_FORMADD_LAST /* last */\n} CURLFORMcode;\n\n/*\n * NAME curl_formadd()\n *\n * DESCRIPTION\n *\n * Pretty advanced function for building multi-part formposts. Each invoke\n * adds one part that together construct a full post. Then use\n * CURLOPT_HTTPPOST to send it off to libcurl.\n */\nCURL_EXTERN CURLFORMcode curl_formadd(struct curl_httppost **httppost,\n                                      struct curl_httppost **last_post,\n                                      ...);\n\n/*\n * callback function for curl_formget()\n * The void *arg pointer will be the one passed as second argument to\n *   curl_formget().\n * The character buffer passed to it must not be freed.\n * Should return the buffer length passed to it as the argument \"len\" on\n *   success.\n */\ntypedef size_t (*curl_formget_callback)(void *arg, const char *buf, size_t len);\n\n/*\n * NAME curl_formget()\n *\n * DESCRIPTION\n *\n * Serialize a curl_httppost struct built with curl_formadd().\n * Accepts a void pointer as second argument which will be passed to\n * the curl_formget_callback function.\n * Returns 0 on success.\n */\nCURL_EXTERN int curl_formget(struct curl_httppost *form, void *arg,\n                             curl_formget_callback append);\n/*\n * NAME curl_formfree()\n *\n * DESCRIPTION\n *\n * Free a multipart formpost previously built with curl_formadd().\n */\nCURL_EXTERN void curl_formfree(struct curl_httppost *form);\n\n/*\n * NAME curl_getenv()\n *\n * DESCRIPTION\n *\n * Returns a malloc()'ed string that MUST be curl_free()ed after usage is\n * complete. DEPRECATED - see lib/README.curlx\n */\nCURL_EXTERN char *curl_getenv(const char *variable);\n\n/*\n * NAME curl_version()\n *\n * DESCRIPTION\n *\n * Returns a static ascii string of the libcurl version.\n */\nCURL_EXTERN char *curl_version(void);\n\n/*\n * NAME curl_easy_escape()\n *\n * DESCRIPTION\n *\n * Escapes URL strings (converts all letters consider illegal in URLs to their\n * %XX versions). This function returns a new allocated string or NULL if an\n * error occurred.\n */\nCURL_EXTERN char *curl_easy_escape(CURL *handle,\n                                   const char *string,\n                                   int length);\n\n/* the previous version: */\nCURL_EXTERN char *curl_escape(const char *string,\n                              int length);\n\n\n/*\n * NAME curl_easy_unescape()\n *\n * DESCRIPTION\n *\n * Unescapes URL encoding in strings (converts all %XX codes to their 8bit\n * versions). This function returns a new allocated string or NULL if an error\n * occurred.\n * Conversion Note: On non-ASCII platforms the ASCII %XX codes are\n * converted into the host encoding.\n */\nCURL_EXTERN char *curl_easy_unescape(CURL *handle,\n                                     const char *string,\n                                     int length,\n                                     int *outlength);\n\n/* the previous version */\nCURL_EXTERN char *curl_unescape(const char *string,\n                                int length);\n\n/*\n * NAME curl_free()\n *\n * DESCRIPTION\n *\n * Provided for de-allocation in the same translation unit that did the\n * allocation. Added in libcurl 7.10\n */\nCURL_EXTERN void curl_free(void *p);\n\n/*\n * NAME curl_global_init()\n *\n * DESCRIPTION\n *\n * curl_global_init() should be invoked exactly once for each application that\n * uses libcurl and before any call of other libcurl functions.\n *\n * This function is not thread-safe!\n */\nCURL_EXTERN CURLcode curl_global_init(long flags);\n\n/*\n * NAME curl_global_init_mem()\n *\n * DESCRIPTION\n *\n * curl_global_init() or curl_global_init_mem() should be invoked exactly once\n * for each application that uses libcurl.  This function can be used to\n * initialize libcurl and set user defined memory management callback\n * functions.  Users can implement memory management routines to check for\n * memory leaks, check for mis-use of the curl library etc.  User registered\n * callback routines with be invoked by this library instead of the system\n * memory management routines like malloc, free etc.\n */\nCURL_EXTERN CURLcode curl_global_init_mem(long flags,\n                                          curl_malloc_callback m,\n                                          curl_free_callback f,\n                                          curl_realloc_callback r,\n                                          curl_strdup_callback s,\n                                          curl_calloc_callback c);\n\n/*\n * NAME curl_global_cleanup()\n *\n * DESCRIPTION\n *\n * curl_global_cleanup() should be invoked exactly once for each application\n * that uses libcurl\n */\nCURL_EXTERN void curl_global_cleanup(void);\n\n/* linked-list structure for the CURLOPT_QUOTE option (and other) */\nstruct curl_slist {\n  char *data;\n  struct curl_slist *next;\n};\n\n/*\n * NAME curl_slist_append()\n *\n * DESCRIPTION\n *\n * Appends a string to a linked list. If no list exists, it will be created\n * first. Returns the new list, after appending.\n */\nCURL_EXTERN struct curl_slist *curl_slist_append(struct curl_slist *,\n                                                 const char *);\n\n/*\n * NAME curl_slist_free_all()\n *\n * DESCRIPTION\n *\n * free a previously built curl_slist.\n */\nCURL_EXTERN void curl_slist_free_all(struct curl_slist *);\n\n/*\n * NAME curl_getdate()\n *\n * DESCRIPTION\n *\n * Returns the time, in seconds since 1 Jan 1970 of the time string given in\n * the first argument. The time argument in the second parameter is unused\n * and should be set to NULL.\n */\nCURL_EXTERN time_t curl_getdate(const char *p, const time_t *unused);\n\n/* info about the certificate chain, only for OpenSSL builds. Asked\n   for with CURLOPT_CERTINFO / CURLINFO_CERTINFO */\nstruct curl_certinfo {\n  int num_of_certs;             /* number of certificates with information */\n  struct curl_slist **certinfo; /* for each index in this array, there's a\n                                   linked list with textual information in the\n                                   format \"name: value\" */\n};\n\n#define CURLINFO_STRING   0x100000\n#define CURLINFO_LONG     0x200000\n#define CURLINFO_DOUBLE   0x300000\n#define CURLINFO_SLIST    0x400000\n#define CURLINFO_MASK     0x0fffff\n#define CURLINFO_TYPEMASK 0xf00000\n\ntypedef enum {\n  CURLINFO_NONE, /* first, never use this */\n  CURLINFO_EFFECTIVE_URL    = CURLINFO_STRING + 1,\n  CURLINFO_RESPONSE_CODE    = CURLINFO_LONG   + 2,\n  CURLINFO_TOTAL_TIME       = CURLINFO_DOUBLE + 3,\n  CURLINFO_NAMELOOKUP_TIME  = CURLINFO_DOUBLE + 4,\n  CURLINFO_CONNECT_TIME     = CURLINFO_DOUBLE + 5,\n  CURLINFO_PRETRANSFER_TIME = CURLINFO_DOUBLE + 6,\n  CURLINFO_SIZE_UPLOAD      = CURLINFO_DOUBLE + 7,\n  CURLINFO_SIZE_DOWNLOAD    = CURLINFO_DOUBLE + 8,\n  CURLINFO_SPEED_DOWNLOAD   = CURLINFO_DOUBLE + 9,\n  CURLINFO_SPEED_UPLOAD     = CURLINFO_DOUBLE + 10,\n  CURLINFO_HEADER_SIZE      = CURLINFO_LONG   + 11,\n  CURLINFO_REQUEST_SIZE     = CURLINFO_LONG   + 12,\n  CURLINFO_SSL_VERIFYRESULT = CURLINFO_LONG   + 13,\n  CURLINFO_FILETIME         = CURLINFO_LONG   + 14,\n  CURLINFO_CONTENT_LENGTH_DOWNLOAD   = CURLINFO_DOUBLE + 15,\n  CURLINFO_CONTENT_LENGTH_UPLOAD     = CURLINFO_DOUBLE + 16,\n  CURLINFO_STARTTRANSFER_TIME = CURLINFO_DOUBLE + 17,\n  CURLINFO_CONTENT_TYPE     = CURLINFO_STRING + 18,\n  CURLINFO_REDIRECT_TIME    = CURLINFO_DOUBLE + 19,\n  CURLINFO_REDIRECT_COUNT   = CURLINFO_LONG   + 20,\n  CURLINFO_PRIVATE          = CURLINFO_STRING + 21,\n  CURLINFO_HTTP_CONNECTCODE = CURLINFO_LONG   + 22,\n  CURLINFO_HTTPAUTH_AVAIL   = CURLINFO_LONG   + 23,\n  CURLINFO_PROXYAUTH_AVAIL  = CURLINFO_LONG   + 24,\n  CURLINFO_OS_ERRNO         = CURLINFO_LONG   + 25,\n  CURLINFO_NUM_CONNECTS     = CURLINFO_LONG   + 26,\n  CURLINFO_SSL_ENGINES      = CURLINFO_SLIST  + 27,\n  CURLINFO_COOKIELIST       = CURLINFO_SLIST  + 28,\n  CURLINFO_LASTSOCKET       = CURLINFO_LONG   + 29,\n  CURLINFO_FTP_ENTRY_PATH   = CURLINFO_STRING + 30,\n  CURLINFO_REDIRECT_URL     = CURLINFO_STRING + 31,\n  CURLINFO_PRIMARY_IP       = CURLINFO_STRING + 32,\n  CURLINFO_APPCONNECT_TIME  = CURLINFO_DOUBLE + 33,\n  CURLINFO_CERTINFO         = CURLINFO_SLIST  + 34,\n  CURLINFO_CONDITION_UNMET  = CURLINFO_LONG   + 35,\n  /* Fill in new entries below here! */\n\n  CURLINFO_LASTONE          = 35\n} CURLINFO;\n\n/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as\n   CURLINFO_HTTP_CODE */\n#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE\n\ntypedef enum {\n  CURLCLOSEPOLICY_NONE, /* first, never use this */\n\n  CURLCLOSEPOLICY_OLDEST,\n  CURLCLOSEPOLICY_LEAST_RECENTLY_USED,\n  CURLCLOSEPOLICY_LEAST_TRAFFIC,\n  CURLCLOSEPOLICY_SLOWEST,\n  CURLCLOSEPOLICY_CALLBACK,\n\n  CURLCLOSEPOLICY_LAST /* last, never use this */\n} curl_closepolicy;\n\n#define CURL_GLOBAL_SSL (1<<0)\n#define CURL_GLOBAL_WIN32 (1<<1)\n#define CURL_GLOBAL_ALL (CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32)\n#define CURL_GLOBAL_NOTHING 0\n#define CURL_GLOBAL_DEFAULT CURL_GLOBAL_ALL\n\n\n/*****************************************************************************\n * Setup defines, protos etc for the sharing stuff.\n */\n\n/* Different data locks for a single share */\ntypedef enum {\n  CURL_LOCK_DATA_NONE = 0,\n  /*  CURL_LOCK_DATA_SHARE is used internally to say that\n   *  the locking is just made to change the internal state of the share\n   *  itself.\n   */\n  CURL_LOCK_DATA_SHARE,\n  CURL_LOCK_DATA_COOKIE,\n  CURL_LOCK_DATA_DNS,\n  CURL_LOCK_DATA_SSL_SESSION,\n  CURL_LOCK_DATA_CONNECT,\n  CURL_LOCK_DATA_LAST\n} curl_lock_data;\n\n/* Different lock access types */\ntypedef enum {\n  CURL_LOCK_ACCESS_NONE = 0,   /* unspecified action */\n  CURL_LOCK_ACCESS_SHARED = 1, /* for read perhaps */\n  CURL_LOCK_ACCESS_SINGLE = 2, /* for write perhaps */\n  CURL_LOCK_ACCESS_LAST        /* never use */\n} curl_lock_access;\n\ntypedef void (*curl_lock_function)(CURL *handle,\n                                   curl_lock_data data,\n                                   curl_lock_access locktype,\n                                   void *userptr);\ntypedef void (*curl_unlock_function)(CURL *handle,\n                                     curl_lock_data data,\n                                     void *userptr);\n\ntypedef void CURLSH;\n\ntypedef enum {\n  CURLSHE_OK,  /* all is fine */\n  CURLSHE_BAD_OPTION, /* 1 */\n  CURLSHE_IN_USE,     /* 2 */\n  CURLSHE_INVALID,    /* 3 */\n  CURLSHE_NOMEM,      /* out of memory */\n  CURLSHE_LAST /* never use */\n} CURLSHcode;\n\ntypedef enum {\n  CURLSHOPT_NONE,  /* don't use */\n  CURLSHOPT_SHARE,   /* specify a data type to share */\n  CURLSHOPT_UNSHARE, /* specify which data type to stop sharing */\n  CURLSHOPT_LOCKFUNC,   /* pass in a 'curl_lock_function' pointer */\n  CURLSHOPT_UNLOCKFUNC, /* pass in a 'curl_unlock_function' pointer */\n  CURLSHOPT_USERDATA,   /* pass in a user data pointer used in the lock/unlock\n                           callback functions */\n  CURLSHOPT_LAST  /* never use */\n} CURLSHoption;\n\nCURL_EXTERN CURLSH *curl_share_init(void);\nCURL_EXTERN CURLSHcode curl_share_setopt(CURLSH *, CURLSHoption option, ...);\nCURL_EXTERN CURLSHcode curl_share_cleanup(CURLSH *);\n\n/****************************************************************************\n * Structures for querying information about the curl library at runtime.\n */\n\ntypedef enum {\n  CURLVERSION_FIRST,\n  CURLVERSION_SECOND,\n  CURLVERSION_THIRD,\n  CURLVERSION_FOURTH,\n  CURLVERSION_LAST /* never actually use this */\n} CURLversion;\n\n/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by\n   basically all programs ever that want to get version information. It is\n   meant to be a built-in version number for what kind of struct the caller\n   expects. If the struct ever changes, we redefine the NOW to another enum\n   from above. */\n#define CURLVERSION_NOW CURLVERSION_FOURTH\n\ntypedef struct {\n  CURLversion age;          /* age of the returned struct */\n  const char *version;      /* LIBCURL_VERSION */\n  unsigned int version_num; /* LIBCURL_VERSION_NUM */\n  const char *host;         /* OS/host/cpu/machine when configured */\n  int features;             /* bitmask, see defines below */\n  const char *ssl_version;  /* human readable string */\n  long ssl_version_num;     /* not used anymore, always 0 */\n  const char *libz_version; /* human readable string */\n  /* protocols is terminated by an entry with a NULL protoname */\n  const char * const *protocols;\n\n  /* The fields below this were added in CURLVERSION_SECOND */\n  const char *ares;\n  int ares_num;\n\n  /* This field was added in CURLVERSION_THIRD */\n  const char *libidn;\n\n  /* These field were added in CURLVERSION_FOURTH */\n\n  /* Same as '_libiconv_version' if built with HAVE_ICONV */\n  int iconv_ver_num;\n\n  const char *libssh_version; /* human readable string */\n\n} curl_version_info_data;\n\n#define CURL_VERSION_IPV6      (1<<0)  /* IPv6-enabled */\n#define CURL_VERSION_KERBEROS4 (1<<1)  /* kerberos auth is supported */\n#define CURL_VERSION_SSL       (1<<2)  /* SSL options are present */\n#define CURL_VERSION_LIBZ      (1<<3)  /* libz features are present */\n#define CURL_VERSION_NTLM      (1<<4)  /* NTLM auth is supported */\n#define CURL_VERSION_GSSNEGOTIATE (1<<5) /* Negotiate auth support */\n#define CURL_VERSION_DEBUG     (1<<6)  /* built with debug capabilities */\n#define CURL_VERSION_ASYNCHDNS (1<<7)  /* asynchronous dns resolves */\n#define CURL_VERSION_SPNEGO    (1<<8)  /* SPNEGO auth */\n#define CURL_VERSION_LARGEFILE (1<<9)  /* supports files bigger than 2GB */\n#define CURL_VERSION_IDN       (1<<10) /* International Domain Names support */\n#define CURL_VERSION_SSPI      (1<<11) /* SSPI is supported */\n#define CURL_VERSION_CONV      (1<<12) /* character conversions supported */\n#define CURL_VERSION_CURLDEBUG (1<<13) /* debug memory tracking supported */\n\n/*\n * NAME curl_version_info()\n *\n * DESCRIPTION\n *\n * This function returns a pointer to a static copy of the version info\n * struct. See above.\n */\nCURL_EXTERN curl_version_info_data *curl_version_info(CURLversion);\n\n/*\n * NAME curl_easy_strerror()\n *\n * DESCRIPTION\n *\n * The curl_easy_strerror function may be used to turn a CURLcode value\n * into the equivalent human readable error string.  This is useful\n * for printing meaningful error messages.\n */\nCURL_EXTERN const char *curl_easy_strerror(CURLcode);\n\n/*\n * NAME curl_share_strerror()\n *\n * DESCRIPTION\n *\n * The curl_share_strerror function may be used to turn a CURLSHcode value\n * into the equivalent human readable error string.  This is useful\n * for printing meaningful error messages.\n */\nCURL_EXTERN const char *curl_share_strerror(CURLSHcode);\n\n/*\n * NAME curl_easy_pause()\n *\n * DESCRIPTION\n *\n * The curl_easy_pause function pauses or unpauses transfers. Select the new\n * state by setting the bitmask, use the convenience defines below.\n *\n */\nCURL_EXTERN CURLcode curl_easy_pause(CURL *handle, int bitmask);\n\n#define CURLPAUSE_RECV      (1<<0)\n#define CURLPAUSE_RECV_CONT (0)\n\n#define CURLPAUSE_SEND      (1<<2)\n#define CURLPAUSE_SEND_CONT (0)\n\n#define CURLPAUSE_ALL       (CURLPAUSE_RECV|CURLPAUSE_SEND)\n#define CURLPAUSE_CONT      (CURLPAUSE_RECV_CONT|CURLPAUSE_SEND_CONT)\n\n#ifdef  __cplusplus\n}\n#endif\n\n/* unfortunately, the easy.h and multi.h include files need options and info\n  stuff before they can be included! */\n#include \"easy.h\" /* nothing in curl is fun without the easy stuff */\n#include \"multi.h\"\n\n/* the typechecker doesn't work in C++ (yet) */\n#if defined(__GNUC__) && defined(__GNUC_MINOR__) && \\\n    ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) && \\\n    !defined(__cplusplus) && !defined(CURL_DISABLE_TYPECHECK)\n#include \"typecheck-gcc.h\"\n#else\n#if defined(__STDC__) && (__STDC__ >= 1)\n/* This preprocessor magic that replaces a call with the exact same call is\n   only done to make sure application authors pass exactly three arguments\n   to these functions. */\n#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param)\n#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg)\n#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param)\n#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param)\n#endif /* __STDC__ >= 1 */\n#endif /* gcc >= 4.3 && !__cplusplus */\n\n#endif /* __CURL_CURL_H */\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/curl/curlbuild.h",
    "content": "/* include/curl/curlbuild.h.  Generated from curlbuild.h.in by configure.  */\n#ifndef __CURL_CURLBUILD_H\n#define __CURL_CURLBUILD_H\n/***************************************************************************\n *                                  _   _ ____  _\n *  Project                     ___| | | |  _ \\| |\n *                             / __| | | | |_) | |\n *                            | (__| |_| |  _ <| |___\n *                             \\___|\\___/|_| \\_\\_____|\n *\n * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.\n *\n * This software is licensed as described in the file COPYING, which\n * you should have received as part of this distribution. The terms\n * are also available at http://curl.haxx.se/docs/copyright.html.\n *\n * You may opt to use, copy, modify, merge, publish, distribute and/or sell\n * copies of the Software, and permit persons to whom the Software is\n * furnished to do so, under the terms of the COPYING file.\n *\n * This software is distributed on an \"AS IS\" basis, WITHOUT WARRANTY OF ANY\n * KIND, either express or implied.\n *\n * $Id: curlbuild.h.in,v 1.8 2009-04-29 15:15:38 yangtse Exp $\n ***************************************************************************/\n\n/* ================================================================ */\n/*               NOTES FOR CONFIGURE CAPABLE SYSTEMS                */\n/* ================================================================ */\n\n/*\n * NOTE 1:\n * -------\n *\n * Nothing in this file is intended to be modified or adjusted by the\n * curl library user nor by the curl library builder.\n *\n * If you think that something actually needs to be changed, adjusted\n * or fixed in this file, then, report it on the libcurl development\n * mailing list: http://cool.haxx.se/mailman/listinfo/curl-library/\n *\n * This header file shall only export symbols which are 'curl' or 'CURL'\n * prefixed, otherwise public name space would be polluted.\n *\n * NOTE 2:\n * -------\n *\n * Right now you might be staring at file include/curl/curlbuild.h.in or\n * at file include/curl/curlbuild.h, this is due to the following reason:\n *\n * On systems capable of running the configure script, the configure process\n * will overwrite the distributed include/curl/curlbuild.h file with one that\n * is suitable and specific to the library being configured and built, which\n * is generated from the include/curl/curlbuild.h.in template file.\n *\n */\n\n/* ================================================================ */\n/*  DEFINITION OF THESE SYMBOLS SHALL NOT TAKE PLACE ANYWHERE ELSE  */\n/* ================================================================ */\n\n#ifdef CURL_SIZEOF_LONG\n#  error \"CURL_SIZEOF_LONG shall not be defined except in curlbuild.h\"\n   Error Compilation_aborted_CURL_SIZEOF_LONG_already_defined\n#endif\n\n#ifdef CURL_TYPEOF_CURL_SOCKLEN_T\n#  error \"CURL_TYPEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h\"\n   Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_already_defined\n#endif\n\n#ifdef CURL_SIZEOF_CURL_SOCKLEN_T\n#  error \"CURL_SIZEOF_CURL_SOCKLEN_T shall not be defined except in curlbuild.h\"\n   Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_already_defined\n#endif\n\n#ifdef CURL_TYPEOF_CURL_OFF_T\n#  error \"CURL_TYPEOF_CURL_OFF_T shall not be defined except in curlbuild.h\"\n   Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_already_defined\n#endif\n\n#ifdef CURL_FORMAT_CURL_OFF_T\n#  error \"CURL_FORMAT_CURL_OFF_T shall not be defined except in curlbuild.h\"\n   Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_already_defined\n#endif\n\n#ifdef CURL_FORMAT_CURL_OFF_TU\n#  error \"CURL_FORMAT_CURL_OFF_TU shall not be defined except in curlbuild.h\"\n   Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_already_defined\n#endif\n\n#ifdef CURL_FORMAT_OFF_T\n#  error \"CURL_FORMAT_OFF_T shall not be defined except in curlbuild.h\"\n   Error Compilation_aborted_CURL_FORMAT_OFF_T_already_defined\n#endif\n\n#ifdef CURL_SIZEOF_CURL_OFF_T\n#  error \"CURL_SIZEOF_CURL_OFF_T shall not be defined except in curlbuild.h\"\n   Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_already_defined\n#endif\n\n#ifdef CURL_SUFFIX_CURL_OFF_T\n#  error \"CURL_SUFFIX_CURL_OFF_T shall not be defined except in curlbuild.h\"\n   Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_already_defined\n#endif\n\n#ifdef CURL_SUFFIX_CURL_OFF_TU\n#  error \"CURL_SUFFIX_CURL_OFF_TU shall not be defined except in curlbuild.h\"\n   Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_already_defined\n#endif\n\n/* ================================================================ */\n/*  EXTERNAL INTERFACE SETTINGS FOR CONFIGURE CAPABLE SYSTEMS ONLY  */\n/* ================================================================ */\n\n/* Configure process defines this to 1 when it finds out that system  */\n/* header file ws2tcpip.h must be included by the external interface. */\n/* #undef CURL_PULL_WS2TCPIP_H */\n#ifdef CURL_PULL_WS2TCPIP_H\n#  ifndef WIN32_LEAN_AND_MEAN\n#    define WIN32_LEAN_AND_MEAN\n#  endif\n#  include <windows.h>\n#  include <winsock2.h>\n#  include <ws2tcpip.h>\n#endif\n\n/* Configure process defines this to 1 when it finds out that system   */\n/* header file sys/types.h must be included by the external interface. */\n#define CURL_PULL_SYS_TYPES_H 1\n#ifdef CURL_PULL_SYS_TYPES_H\n#  include <sys/types.h>\n#endif\n\n/* Configure process defines this to 1 when it finds out that system */\n/* header file stdint.h must be included by the external interface.  */\n/* #undef CURL_PULL_STDINT_H */\n#ifdef CURL_PULL_STDINT_H\n#  include <stdint.h>\n#endif\n\n/* Configure process defines this to 1 when it finds out that system  */\n/* header file inttypes.h must be included by the external interface. */\n/* #undef CURL_PULL_INTTYPES_H */\n#ifdef CURL_PULL_INTTYPES_H\n#  include <inttypes.h>\n#endif\n\n/* Configure process defines this to 1 when it finds out that system    */\n/* header file sys/socket.h must be included by the external interface. */\n#define CURL_PULL_SYS_SOCKET_H 1\n#ifdef CURL_PULL_SYS_SOCKET_H\n#  include <sys/socket.h>\n#endif\n\n/* The size of `long', as computed by sizeof. */\n#if defined(_M_X64) || defined(__x86_64__)\n#define CURL_SIZEOF_LONG 8\n#else\n#define CURL_SIZEOF_LONG 4\n#endif\n\n/* Integral data type used for curl_socklen_t. */\n#define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t\n\n/* The size of `curl_socklen_t', as computed by sizeof. */\n#define CURL_SIZEOF_CURL_SOCKLEN_T 4\n\n/* Data type definition of curl_socklen_t. */\ntypedef CURL_TYPEOF_CURL_SOCKLEN_T curl_socklen_t;\n\n/* Signed integral data type used for curl_off_t. */\n#if defined(_M_X64) || defined(__x86_64__)\n#define CURL_TYPEOF_CURL_OFF_T long\n#else\n#define CURL_TYPEOF_CURL_OFF_T int64_t\n#endif\n\n/* Data type definition of curl_off_t. */\ntypedef CURL_TYPEOF_CURL_OFF_T curl_off_t;\n\n/* curl_off_t formatting string directive without \"%\" conversion specifier. */\n#define CURL_FORMAT_CURL_OFF_T \"ld\"\n\n/* unsigned curl_off_t formatting string without \"%\" conversion specifier. */\n#define CURL_FORMAT_CURL_OFF_TU \"lu\"\n\n/* curl_off_t formatting string directive with \"%\" conversion specifier. */\n#define CURL_FORMAT_OFF_T \"%ld\"\n\n/* The size of `curl_off_t', as computed by sizeof. */\n#define CURL_SIZEOF_CURL_OFF_T 8\n\n/* curl_off_t constant suffix. */\n#define CURL_SUFFIX_CURL_OFF_T L\n\n/* unsigned curl_off_t constant suffix. */\n#define CURL_SUFFIX_CURL_OFF_TU UL\n\n#endif /* __CURL_CURLBUILD_H */\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/curl/curlrules.h",
    "content": "#ifndef __CURL_CURLRULES_H\n#define __CURL_CURLRULES_H\n/***************************************************************************\n *                                  _   _ ____  _\n *  Project                     ___| | | |  _ \\| |\n *                             / __| | | | |_) | |\n *                            | (__| |_| |  _ <| |___\n *                             \\___|\\___/|_| \\_\\_____|\n *\n * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.\n *\n * This software is licensed as described in the file COPYING, which\n * you should have received as part of this distribution. The terms\n * are also available at http://curl.haxx.se/docs/copyright.html.\n *\n * You may opt to use, copy, modify, merge, publish, distribute and/or sell\n * copies of the Software, and permit persons to whom the Software is\n * furnished to do so, under the terms of the COPYING file.\n *\n * This software is distributed on an \"AS IS\" basis, WITHOUT WARRANTY OF ANY\n * KIND, either express or implied.\n *\n * $Id: curlrules.h,v 1.7 2009-10-27 16:56:20 yangtse Exp $\n ***************************************************************************/\n\n/* ================================================================ */\n/*                    COMPILE TIME SANITY CHECKS                    */\n/* ================================================================ */\n\n/*\n * NOTE 1:\n * -------\n *\n * All checks done in this file are intentionally placed in a public\n * header file which is pulled by curl/curl.h when an application is\n * being built using an already built libcurl library. Additionally\n * this file is also included and used when building the library.\n *\n * If compilation fails on this file it is certainly sure that the\n * problem is elsewhere. It could be a problem in the curlbuild.h\n * header file, or simply that you are using different compilation\n * settings than those used to build the library.\n *\n * Nothing in this file is intended to be modified or adjusted by the\n * curl library user nor by the curl library builder.\n *\n * Do not deactivate any check, these are done to make sure that the\n * library is properly built and used.\n *\n * You can find further help on the libcurl development mailing list:\n * http://cool.haxx.se/mailman/listinfo/curl-library/\n *\n * NOTE 2\n * ------\n *\n * Some of the following compile time checks are based on the fact\n * that the dimension of a constant array can not be a negative one.\n * In this way if the compile time verification fails, the compilation\n * will fail issuing an error. The error description wording is compiler\n * dependent but it will be quite similar to one of the following:\n *\n *   \"negative subscript or subscript is too large\"\n *   \"array must have at least one element\"\n *   \"-1 is an illegal array size\"\n *   \"size of array is negative\"\n *\n * If you are building an application which tries to use an already\n * built libcurl library and you are getting this kind of errors on\n * this file, it is a clear indication that there is a mismatch between\n * how the library was built and how you are trying to use it for your\n * application. Your already compiled or binary library provider is the\n * only one who can give you the details you need to properly use it.\n */\n\n/*\n * Verify that some macros are actually defined.\n */\n\n#ifndef CURL_SIZEOF_LONG\n#  error \"CURL_SIZEOF_LONG definition is missing!\"\n   Error Compilation_aborted_CURL_SIZEOF_LONG_is_missing\n#endif\n\n#ifndef CURL_TYPEOF_CURL_SOCKLEN_T\n#  error \"CURL_TYPEOF_CURL_SOCKLEN_T definition is missing!\"\n   Error Compilation_aborted_CURL_TYPEOF_CURL_SOCKLEN_T_is_missing\n#endif\n\n#ifndef CURL_SIZEOF_CURL_SOCKLEN_T\n#  error \"CURL_SIZEOF_CURL_SOCKLEN_T definition is missing!\"\n   Error Compilation_aborted_CURL_SIZEOF_CURL_SOCKLEN_T_is_missing\n#endif\n\n#ifndef CURL_TYPEOF_CURL_OFF_T\n#  error \"CURL_TYPEOF_CURL_OFF_T definition is missing!\"\n   Error Compilation_aborted_CURL_TYPEOF_CURL_OFF_T_is_missing\n#endif\n\n#ifndef CURL_FORMAT_CURL_OFF_T\n#  error \"CURL_FORMAT_CURL_OFF_T definition is missing!\"\n   Error Compilation_aborted_CURL_FORMAT_CURL_OFF_T_is_missing\n#endif\n\n#ifndef CURL_FORMAT_CURL_OFF_TU\n#  error \"CURL_FORMAT_CURL_OFF_TU definition is missing!\"\n   Error Compilation_aborted_CURL_FORMAT_CURL_OFF_TU_is_missing\n#endif\n\n#ifndef CURL_FORMAT_OFF_T\n#  error \"CURL_FORMAT_OFF_T definition is missing!\"\n   Error Compilation_aborted_CURL_FORMAT_OFF_T_is_missing\n#endif\n\n#ifndef CURL_SIZEOF_CURL_OFF_T\n#  error \"CURL_SIZEOF_CURL_OFF_T definition is missing!\"\n   Error Compilation_aborted_CURL_SIZEOF_CURL_OFF_T_is_missing\n#endif\n\n#ifndef CURL_SUFFIX_CURL_OFF_T\n#  error \"CURL_SUFFIX_CURL_OFF_T definition is missing!\"\n   Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_T_is_missing\n#endif\n\n#ifndef CURL_SUFFIX_CURL_OFF_TU\n#  error \"CURL_SUFFIX_CURL_OFF_TU definition is missing!\"\n   Error Compilation_aborted_CURL_SUFFIX_CURL_OFF_TU_is_missing\n#endif\n\n/*\n * Macros private to this header file.\n */\n\n#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1\n\n#define CurlchkszGE(t1, t2) sizeof(t1) >= sizeof(t2) ? 1 : -1\n\n/*\n * Verify that the size previously defined and expected for long\n * is the same as the one reported by sizeof() at compile time.\n */\n\ntypedef char\n  __curl_rule_01__\n    [CurlchkszEQ(long, CURL_SIZEOF_LONG)];\n\n/*\n * Verify that the size previously defined and expected for\n * curl_off_t is actually the the same as the one reported\n * by sizeof() at compile time.\n */\n\ntypedef char\n  __curl_rule_02__\n    [CurlchkszEQ(curl_off_t, CURL_SIZEOF_CURL_OFF_T)];\n\n/*\n * Verify at compile time that the size of curl_off_t as reported\n * by sizeof() is greater or equal than the one reported for long\n * for the current compilation.\n */\n\ntypedef char\n  __curl_rule_03__\n    [CurlchkszGE(curl_off_t, long)];\n\n/*\n * Verify that the size previously defined and expected for\n * curl_socklen_t is actually the the same as the one reported\n * by sizeof() at compile time.\n */\n\ntypedef char\n  __curl_rule_04__\n    [CurlchkszEQ(curl_socklen_t, CURL_SIZEOF_CURL_SOCKLEN_T)];\n\n/*\n * Verify at compile time that the size of curl_socklen_t as reported\n * by sizeof() is greater or equal than the one reported for int for\n * the current compilation.\n */\n\ntypedef char\n  __curl_rule_05__\n    [CurlchkszGE(curl_socklen_t, int)];\n\n/* ================================================================ */\n/*          EXTERNALLY AND INTERNALLY VISIBLE DEFINITIONS           */\n/* ================================================================ */\n\n/* \n * CURL_ISOCPP and CURL_OFF_T_C definitions are done here in order to allow\n * these to be visible and exported by the external libcurl interface API,\n * while also making them visible to the library internals, simply including\n * setup.h, without actually needing to include curl.h internally.\n * If some day this section would grow big enough, all this should be moved\n * to its own header file.\n */\n\n/*\n * Figure out if we can use the ## preprocessor operator, which is supported\n * by ISO/ANSI C and C++. Some compilers support it without setting __STDC__\n * or  __cplusplus so we need to carefully check for them too.\n */\n\n#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) || \\\n  defined(__HP_aCC) || defined(__BORLANDC__) || defined(__LCC__) || \\\n  defined(__POCC__) || defined(__SALFORDC__) || defined(__HIGHC__) || \\\n  defined(__ILEC400__)\n  /* This compiler is believed to have an ISO compatible preprocessor */\n#define CURL_ISOCPP\n#else\n  /* This compiler is believed NOT to have an ISO compatible preprocessor */\n#undef CURL_ISOCPP\n#endif\n\n/*\n * Macros for minimum-width signed and unsigned curl_off_t integer constants.\n */\n\n#ifdef CURL_ISOCPP\n#  define __CURL_OFF_T_C_HELPER2(Val,Suffix) Val ## Suffix\n#else\n#  define __CURL_OFF_T_C_HELPER2(Val,Suffix) Val/**/Suffix\n#endif\n#define __CURL_OFF_T_C_HELPER1(Val,Suffix) __CURL_OFF_T_C_HELPER2(Val,Suffix)\n#define CURL_OFF_T_C(Val)  __CURL_OFF_T_C_HELPER1(Val,CURL_SUFFIX_CURL_OFF_T)\n#define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HELPER1(Val,CURL_SUFFIX_CURL_OFF_TU)\n\n/*\n * Get rid of macros private to this header file.\n */\n\n#undef CurlchkszEQ\n#undef CurlchkszGE\n\n/*\n * Get rid of macros not intended to exist beyond this point.\n */\n\n#undef CURL_PULL_WS2TCPIP_H\n#undef CURL_PULL_SYS_TYPES_H\n#undef CURL_PULL_SYS_SOCKET_H\n#undef CURL_PULL_STDINT_H\n#undef CURL_PULL_INTTYPES_H\n\n#undef CURL_TYPEOF_CURL_SOCKLEN_T\n#undef CURL_TYPEOF_CURL_OFF_T\n\n#endif /* __CURL_CURLRULES_H */\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/curl/curlver.h",
    "content": "#ifndef __CURL_CURLVER_H\n#define __CURL_CURLVER_H\n/***************************************************************************\n *                                  _   _ ____  _\n *  Project                     ___| | | |  _ \\| |\n *                             / __| | | | |_) | |\n *                            | (__| |_| |  _ <| |___\n *                             \\___|\\___/|_| \\_\\_____|\n *\n * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.\n *\n * This software is licensed as described in the file COPYING, which\n * you should have received as part of this distribution. The terms\n * are also available at http://curl.haxx.se/docs/copyright.html.\n *\n * You may opt to use, copy, modify, merge, publish, distribute and/or sell\n * copies of the Software, and permit persons to whom the Software is\n * furnished to do so, under the terms of the COPYING file.\n *\n * This software is distributed on an \"AS IS\" basis, WITHOUT WARRANTY OF ANY\n * KIND, either express or implied.\n *\n * $Id: curlver.h,v 1.48 2009-08-12 11:24:52 bagder Exp $\n ***************************************************************************/\n\n/* This header file contains nothing but libcurl version info, generated by\n   a script at release-time. This was made its own header file in 7.11.2 */\n\n/* This is the global package copyright */\n#define LIBCURL_COPYRIGHT \"1996 - 2009 Daniel Stenberg, <daniel@haxx.se>.\"\n\n/* This is the version number of the libcurl package from which this header\n   file origins: */\n#define LIBCURL_VERSION \"7.19.7\"\n\n/* The numeric version number is also available \"in parts\" by using these\n   defines: */\n#define LIBCURL_VERSION_MAJOR 7\n#define LIBCURL_VERSION_MINOR 19\n#define LIBCURL_VERSION_PATCH 7\n\n/* This is the numeric version of the libcurl version number, meant for easier\n   parsing and comparions by programs. The LIBCURL_VERSION_NUM define will\n   always follow this syntax:\n\n         0xXXYYZZ\n\n   Where XX, YY and ZZ are the main version, release and patch numbers in\n   hexadecimal (using 8 bits each). All three numbers are always represented\n   using two digits.  1.2 would appear as \"0x010200\" while version 9.11.7\n   appears as \"0x090b07\".\n\n   This 6-digit (24 bits) hexadecimal number does not show pre-release number,\n   and it is always a greater number in a more recent release. It makes\n   comparisons with greater than and less than work.\n*/\n#define LIBCURL_VERSION_NUM 0x071307\n\n/*\n * This is the date and time when the full source package was created. The\n * timestamp is not stored in CVS, as the timestamp is properly set in the\n * tarballs by the maketgz script.\n *\n * The format of the date should follow this template:\n *\n * \"Mon Feb 12 11:35:33 UTC 2007\"\n */\n#define LIBCURL_TIMESTAMP \"Wed Nov  4 12:34:59 UTC 2009\"\n\n#endif /* __CURL_CURLVER_H */\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/curl/easy.h",
    "content": "#ifndef __CURL_EASY_H\n#define __CURL_EASY_H\n/***************************************************************************\n *                                  _   _ ____  _\n *  Project                     ___| | | |  _ \\| |\n *                             / __| | | | |_) | |\n *                            | (__| |_| |  _ <| |___\n *                             \\___|\\___/|_| \\_\\_____|\n *\n * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.\n *\n * This software is licensed as described in the file COPYING, which\n * you should have received as part of this distribution. The terms\n * are also available at http://curl.haxx.se/docs/copyright.html.\n *\n * You may opt to use, copy, modify, merge, publish, distribute and/or sell\n * copies of the Software, and permit persons to whom the Software is\n * furnished to do so, under the terms of the COPYING file.\n *\n * This software is distributed on an \"AS IS\" basis, WITHOUT WARRANTY OF ANY\n * KIND, either express or implied.\n *\n * $Id: easy.h,v 1.14 2008-05-12 21:43:28 bagder Exp $\n ***************************************************************************/\n#ifdef  __cplusplus\nextern \"C\" {\n#endif\n\nCURL_EXTERN CURL *curl_easy_init(void);\nCURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);\nCURL_EXTERN CURLcode curl_easy_perform(CURL *curl);\nCURL_EXTERN void curl_easy_cleanup(CURL *curl);\n\n/*\n * NAME curl_easy_getinfo()\n *\n * DESCRIPTION\n *\n * Request internal information from the curl session with this function.  The\n * third argument MUST be a pointer to a long, a pointer to a char * or a\n * pointer to a double (as the documentation describes elsewhere).  The data\n * pointed to will be filled in accordingly and can be relied upon only if the\n * function returns CURLE_OK.  This function is intended to get used *AFTER* a\n * performed transfer, all results from this function are undefined until the\n * transfer is completed.\n */\nCURL_EXTERN CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);\n\n\n/*\n * NAME curl_easy_duphandle()\n *\n * DESCRIPTION\n *\n * Creates a new curl session handle with the same options set for the handle\n * passed in. Duplicating a handle could only be a matter of cloning data and\n * options, internal state info and things like persistant connections cannot\n * be transfered. It is useful in multithreaded applications when you can run\n * curl_easy_duphandle() for each new thread to avoid a series of identical\n * curl_easy_setopt() invokes in every thread.\n */\nCURL_EXTERN CURL* curl_easy_duphandle(CURL *curl);\n\n/*\n * NAME curl_easy_reset()\n *\n * DESCRIPTION\n *\n * Re-initializes a CURL handle to the default values. This puts back the\n * handle to the same state as it was in when it was just created.\n *\n * It does keep: live connections, the Session ID cache, the DNS cache and the\n * cookies.\n */\nCURL_EXTERN void curl_easy_reset(CURL *curl);\n\n/*\n * NAME curl_easy_recv()\n *\n * DESCRIPTION\n *\n * Receives data from the connected socket. Use after successful\n * curl_easy_perform() with CURLOPT_CONNECT_ONLY option.\n */\nCURL_EXTERN CURLcode curl_easy_recv(CURL *curl, void *buffer, size_t buflen,\n                                    size_t *n);\n\n/*\n * NAME curl_easy_send()\n *\n * DESCRIPTION\n *\n * Sends data over the connected socket. Use after successful\n * curl_easy_perform() with CURLOPT_CONNECT_ONLY option.\n */\nCURL_EXTERN CURLcode curl_easy_send(CURL *curl, const void *buffer,\n                                    size_t buflen, size_t *n);\n\n#ifdef  __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/curl/mprintf.h",
    "content": "#ifndef __CURL_MPRINTF_H\n#define __CURL_MPRINTF_H\n/***************************************************************************\n *                                  _   _ ____  _\n *  Project                     ___| | | |  _ \\| |\n *                             / __| | | | |_) | |\n *                            | (__| |_| |  _ <| |___\n *                             \\___|\\___/|_| \\_\\_____|\n *\n * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al.\n *\n * This software is licensed as described in the file COPYING, which\n * you should have received as part of this distribution. The terms\n * are also available at http://curl.haxx.se/docs/copyright.html.\n *\n * You may opt to use, copy, modify, merge, publish, distribute and/or sell\n * copies of the Software, and permit persons to whom the Software is\n * furnished to do so, under the terms of the COPYING file.\n *\n * This software is distributed on an \"AS IS\" basis, WITHOUT WARRANTY OF ANY\n * KIND, either express or implied.\n *\n * $Id: mprintf.h,v 1.16 2008-05-20 10:21:50 patrickm Exp $\n ***************************************************************************/\n\n#include <stdarg.h>\n#include <stdio.h> /* needed for FILE */\n\n#include \"curl.h\"\n\n#ifdef  __cplusplus\nextern \"C\" {\n#endif\n\nCURL_EXTERN int curl_mprintf(const char *format, ...);\nCURL_EXTERN int curl_mfprintf(FILE *fd, const char *format, ...);\nCURL_EXTERN int curl_msprintf(char *buffer, const char *format, ...);\nCURL_EXTERN int curl_msnprintf(char *buffer, size_t maxlength,\n                               const char *format, ...);\nCURL_EXTERN int curl_mvprintf(const char *format, va_list args);\nCURL_EXTERN int curl_mvfprintf(FILE *fd, const char *format, va_list args);\nCURL_EXTERN int curl_mvsprintf(char *buffer, const char *format, va_list args);\nCURL_EXTERN int curl_mvsnprintf(char *buffer, size_t maxlength,\n                                const char *format, va_list args);\nCURL_EXTERN char *curl_maprintf(const char *format, ...);\nCURL_EXTERN char *curl_mvaprintf(const char *format, va_list args);\n\n#ifdef _MPRINTF_REPLACE\n# undef printf\n# undef fprintf\n# undef sprintf\n# undef vsprintf\n# undef snprintf\n# undef vprintf\n# undef vfprintf\n# undef vsnprintf\n# undef aprintf\n# undef vaprintf\n# define printf curl_mprintf\n# define fprintf curl_mfprintf\n#ifdef CURLDEBUG\n/* When built with CURLDEBUG we define away the sprintf() functions since we\n   don't want internal code to be using them */\n# define sprintf sprintf_was_used\n# define vsprintf vsprintf_was_used\n#else\n# define sprintf curl_msprintf\n# define vsprintf curl_mvsprintf\n#endif\n# define snprintf curl_msnprintf\n# define vprintf curl_mvprintf\n# define vfprintf curl_mvfprintf\n# define vsnprintf curl_mvsnprintf\n# define aprintf curl_maprintf\n# define vaprintf curl_mvaprintf\n#endif\n\n#ifdef  __cplusplus\n}\n#endif\n\n#endif /* __CURL_MPRINTF_H */\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/curl/multi.h",
    "content": "#ifndef __CURL_MULTI_H\n#define __CURL_MULTI_H\n/***************************************************************************\n *                                  _   _ ____  _\n *  Project                     ___| | | |  _ \\| |\n *                             / __| | | | |_) | |\n *                            | (__| |_| |  _ <| |___\n *                             \\___|\\___/|_| \\_\\_____|\n *\n * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.\n *\n * This software is licensed as described in the file COPYING, which\n * you should have received as part of this distribution. The terms\n * are also available at http://curl.haxx.se/docs/copyright.html.\n *\n * You may opt to use, copy, modify, merge, publish, distribute and/or sell\n * copies of the Software, and permit persons to whom the Software is\n * furnished to do so, under the terms of the COPYING file.\n *\n * This software is distributed on an \"AS IS\" basis, WITHOUT WARRANTY OF ANY\n * KIND, either express or implied.\n *\n * $Id: multi.h,v 1.45 2008-05-20 10:21:50 patrickm Exp $\n ***************************************************************************/\n/*\n  This is an \"external\" header file. Don't give away any internals here!\n\n  GOALS\n\n  o Enable a \"pull\" interface. The application that uses libcurl decides where\n    and when to ask libcurl to get/send data.\n\n  o Enable multiple simultaneous transfers in the same thread without making it\n    complicated for the application.\n\n  o Enable the application to select() on its own file descriptors and curl's\n    file descriptors simultaneous easily.\n\n*/\n\n/*\n * This header file should not really need to include \"curl.h\" since curl.h\n * itself includes this file and we expect user applications to do #include\n * <curl/curl.h> without the need for especially including multi.h.\n *\n * For some reason we added this include here at one point, and rather than to\n * break existing (wrongly written) libcurl applications, we leave it as-is\n * but with this warning attached.\n */\n#include \"curl.h\"\n\n#ifdef  __cplusplus\nextern \"C\" {\n#endif\n\ntypedef void CURLM;\n\ntypedef enum {\n  CURLM_CALL_MULTI_PERFORM = -1, /* please call curl_multi_perform() or\n                                    curl_multi_socket*() soon */\n  CURLM_OK,\n  CURLM_BAD_HANDLE,      /* the passed-in handle is not a valid CURLM handle */\n  CURLM_BAD_EASY_HANDLE, /* an easy handle was not good/valid */\n  CURLM_OUT_OF_MEMORY,   /* if you ever get this, you're in deep sh*t */\n  CURLM_INTERNAL_ERROR,  /* this is a libcurl bug */\n  CURLM_BAD_SOCKET,      /* the passed in socket argument did not match */\n  CURLM_UNKNOWN_OPTION,  /* curl_multi_setopt() with unsupported option */\n  CURLM_LAST\n} CURLMcode;\n\n/* just to make code nicer when using curl_multi_socket() you can now check\n   for CURLM_CALL_MULTI_SOCKET too in the same style it works for\n   curl_multi_perform() and CURLM_CALL_MULTI_PERFORM */\n#define CURLM_CALL_MULTI_SOCKET CURLM_CALL_MULTI_PERFORM\n\ntypedef enum {\n  CURLMSG_NONE, /* first, not used */\n  CURLMSG_DONE, /* This easy handle has completed. 'result' contains\n                   the CURLcode of the transfer */\n  CURLMSG_LAST /* last, not used */\n} CURLMSG;\n\nstruct CURLMsg {\n  CURLMSG msg;       /* what this message means */\n  CURL *easy_handle; /* the handle it concerns */\n  union {\n    void *whatever;    /* message-specific data */\n    CURLcode result;   /* return code for transfer */\n  } data;\n};\ntypedef struct CURLMsg CURLMsg;\n\n/*\n * Name:    curl_multi_init()\n *\n * Desc:    inititalize multi-style curl usage\n *\n * Returns: a new CURLM handle to use in all 'curl_multi' functions.\n */\nCURL_EXTERN CURLM *curl_multi_init(void);\n\n/*\n * Name:    curl_multi_add_handle()\n *\n * Desc:    add a standard curl handle to the multi stack\n *\n * Returns: CURLMcode type, general multi error code.\n */\nCURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle,\n                                            CURL *curl_handle);\n\n /*\n  * Name:    curl_multi_remove_handle()\n  *\n  * Desc:    removes a curl handle from the multi stack again\n  *\n  * Returns: CURLMcode type, general multi error code.\n  */\nCURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle,\n                                               CURL *curl_handle);\n\n /*\n  * Name:    curl_multi_fdset()\n  *\n  * Desc:    Ask curl for its fd_set sets. The app can use these to select() or\n  *          poll() on. We want curl_multi_perform() called as soon as one of\n  *          them are ready.\n  *\n  * Returns: CURLMcode type, general multi error code.\n  */\nCURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle,\n                                       fd_set *read_fd_set,\n                                       fd_set *write_fd_set,\n                                       fd_set *exc_fd_set,\n                                       int *max_fd);\n\n /*\n  * Name:    curl_multi_perform()\n  *\n  * Desc:    When the app thinks there's data available for curl it calls this\n  *          function to read/write whatever there is right now. This returns\n  *          as soon as the reads and writes are done. This function does not\n  *          require that there actually is data available for reading or that\n  *          data can be written, it can be called just in case. It returns\n  *          the number of handles that still transfer data in the second\n  *          argument's integer-pointer.\n  *\n  * Returns: CURLMcode type, general multi error code. *NOTE* that this only\n  *          returns errors etc regarding the whole multi stack. There might\n  *          still have occurred problems on invidual transfers even when this\n  *          returns OK.\n  */\nCURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle,\n                                         int *running_handles);\n\n /*\n  * Name:    curl_multi_cleanup()\n  *\n  * Desc:    Cleans up and removes a whole multi stack. It does not free or\n  *          touch any individual easy handles in any way. We need to define\n  *          in what state those handles will be if this function is called\n  *          in the middle of a transfer.\n  *\n  * Returns: CURLMcode type, general multi error code.\n  */\nCURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);\n\n/*\n * Name:    curl_multi_info_read()\n *\n * Desc:    Ask the multi handle if there's any messages/informationals from\n *          the individual transfers. Messages include informationals such as\n *          error code from the transfer or just the fact that a transfer is\n *          completed. More details on these should be written down as well.\n *\n *          Repeated calls to this function will return a new struct each\n *          time, until a special \"end of msgs\" struct is returned as a signal\n *          that there is no more to get at this point.\n *\n *          The data the returned pointer points to will not survive calling\n *          curl_multi_cleanup().\n *\n *          The 'CURLMsg' struct is meant to be very simple and only contain\n *          very basic informations. If more involved information is wanted,\n *          we will provide the particular \"transfer handle\" in that struct\n *          and that should/could/would be used in subsequent\n *          curl_easy_getinfo() calls (or similar). The point being that we\n *          must never expose complex structs to applications, as then we'll\n *          undoubtably get backwards compatibility problems in the future.\n *\n * Returns: A pointer to a filled-in struct, or NULL if it failed or ran out\n *          of structs. It also writes the number of messages left in the\n *          queue (after this read) in the integer the second argument points\n *          to.\n */\nCURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,\n                                          int *msgs_in_queue);\n\n/*\n * Name:    curl_multi_strerror()\n *\n * Desc:    The curl_multi_strerror function may be used to turn a CURLMcode\n *          value into the equivalent human readable error string.  This is\n *          useful for printing meaningful error messages.\n *\n * Returns: A pointer to a zero-terminated error message.\n */\nCURL_EXTERN const char *curl_multi_strerror(CURLMcode);\n\n/*\n * Name:    curl_multi_socket() and\n *          curl_multi_socket_all()\n *\n * Desc:    An alternative version of curl_multi_perform() that allows the\n *          application to pass in one of the file descriptors that have been\n *          detected to have \"action\" on them and let libcurl perform.\n *          See man page for details.\n */\n#define CURL_POLL_NONE   0\n#define CURL_POLL_IN     1\n#define CURL_POLL_OUT    2\n#define CURL_POLL_INOUT  3\n#define CURL_POLL_REMOVE 4\n\n#define CURL_SOCKET_TIMEOUT CURL_SOCKET_BAD\n\n#define CURL_CSELECT_IN   0x01\n#define CURL_CSELECT_OUT  0x02\n#define CURL_CSELECT_ERR  0x04\n\ntypedef int (*curl_socket_callback)(CURL *easy,      /* easy handle */\n                                    curl_socket_t s, /* socket */\n                                    int what,        /* see above */\n                                    void *userp,     /* private callback\n                                                        pointer */\n                                    void *socketp);  /* private socket\n                                                        pointer */\n/*\n * Name:    curl_multi_timer_callback\n *\n * Desc:    Called by libcurl whenever the library detects a change in the\n *          maximum number of milliseconds the app is allowed to wait before\n *          curl_multi_socket() or curl_multi_perform() must be called\n *          (to allow libcurl's timed events to take place).\n *\n * Returns: The callback should return zero.\n */\ntypedef int (*curl_multi_timer_callback)(CURLM *multi,    /* multi handle */\n                                         long timeout_ms, /* see above */\n                                         void *userp);    /* private callback\n                                                             pointer */\n\nCURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s,\n                                        int *running_handles);\n\nCURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle,\n                                               curl_socket_t s,\n                                               int ev_bitmask,\n                                               int *running_handles);\n\nCURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle,\n                                            int *running_handles);\n\n#ifndef CURL_ALLOW_OLD_MULTI_SOCKET\n/* This macro below was added in 7.16.3 to push users who recompile to use\n   the new curl_multi_socket_action() instead of the old curl_multi_socket()\n*/\n#define curl_multi_socket(x,y,z) curl_multi_socket_action(x,y,0,z)\n#endif\n\n/*\n * Name:    curl_multi_timeout()\n *\n * Desc:    Returns the maximum number of milliseconds the app is allowed to\n *          wait before curl_multi_socket() or curl_multi_perform() must be\n *          called (to allow libcurl's timed events to take place).\n *\n * Returns: CURLM error code.\n */\nCURL_EXTERN CURLMcode curl_multi_timeout(CURLM *multi_handle,\n                                         long *milliseconds);\n\n#undef CINIT /* re-using the same name as in curl.h */\n\n#ifdef CURL_ISOCPP\n#define CINIT(name,type,num) CURLMOPT_ ## name = CURLOPTTYPE_ ## type + num\n#else\n/* The macro \"##\" is ISO C, we assume pre-ISO C doesn't support it. */\n#define LONG          CURLOPTTYPE_LONG\n#define OBJECTPOINT   CURLOPTTYPE_OBJECTPOINT\n#define FUNCTIONPOINT CURLOPTTYPE_FUNCTIONPOINT\n#define OFF_T         CURLOPTTYPE_OFF_T\n#define CINIT(name,type,number) CURLMOPT_/**/name = type + number\n#endif\n\ntypedef enum {\n  /* This is the socket callback function pointer */\n  CINIT(SOCKETFUNCTION, FUNCTIONPOINT, 1),\n\n  /* This is the argument passed to the socket callback */\n  CINIT(SOCKETDATA, OBJECTPOINT, 2),\n\n    /* set to 1 to enable pipelining for this multi handle */\n  CINIT(PIPELINING, LONG, 3),\n\n   /* This is the timer callback function pointer */\n  CINIT(TIMERFUNCTION, FUNCTIONPOINT, 4),\n\n  /* This is the argument passed to the timer callback */\n  CINIT(TIMERDATA, OBJECTPOINT, 5),\n\n  /* maximum number of entries in the connection cache */\n  CINIT(MAXCONNECTS, LONG, 6),\n\n  CURLMOPT_LASTENTRY /* the last unused */\n} CURLMoption;\n\n\n/*\n * Name:    curl_multi_setopt()\n *\n * Desc:    Sets options for the multi handle.\n *\n * Returns: CURLM error code.\n */\nCURL_EXTERN CURLMcode curl_multi_setopt(CURLM *multi_handle,\n                                        CURLMoption option, ...);\n\n\n/*\n * Name:    curl_multi_assign()\n *\n * Desc:    This function sets an association in the multi handle between the\n *          given socket and a private pointer of the application. This is\n *          (only) useful for curl_multi_socket uses.\n *\n * Returns: CURLM error code.\n */\nCURL_EXTERN CURLMcode curl_multi_assign(CURLM *multi_handle,\n                                        curl_socket_t sockfd, void *sockp);\n\n#ifdef __cplusplus\n} /* end of extern \"C\" */\n#endif\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/curl/stdcheaders.h",
    "content": "#ifndef __STDC_HEADERS_H\n#define __STDC_HEADERS_H\n/***************************************************************************\n *                                  _   _ ____  _     \n *  Project                     ___| | | |  _ \\| |    \n *                             / __| | | | |_) | |    \n *                            | (__| |_| |  _ <| |___ \n *                             \\___|\\___/|_| \\_\\_____|\n *\n * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.\n *\n * This software is licensed as described in the file COPYING, which\n * you should have received as part of this distribution. The terms\n * are also available at http://curl.haxx.se/docs/copyright.html.\n * \n * You may opt to use, copy, modify, merge, publish, distribute and/or sell\n * copies of the Software, and permit persons to whom the Software is\n * furnished to do so, under the terms of the COPYING file.\n *\n * This software is distributed on an \"AS IS\" basis, WITHOUT WARRANTY OF ANY\n * KIND, either express or implied.\n *\n * $Id: stdcheaders.h,v 1.9 2009-05-18 12:25:45 yangtse Exp $\n ***************************************************************************/\n\n#include <sys/types.h>\n\nsize_t fread (void *, size_t, size_t, FILE *);\nsize_t fwrite (const void *, size_t, size_t, FILE *);\n\nint strcasecmp(const char *, const char *);\nint strncasecmp(const char *, const char *, size_t);\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/curl/typecheck-gcc.h",
    "content": "#ifndef __CURL_TYPECHECK_GCC_H\n#define __CURL_TYPECHECK_GCC_H\n/***************************************************************************\n *                                  _   _ ____  _\n *  Project                     ___| | | |  _ \\| |\n *                             / __| | | | |_) | |\n *                            | (__| |_| |  _ <| |___\n *                             \\___|\\___/|_| \\_\\_____|\n *\n * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.\n *\n * This software is licensed as described in the file COPYING, which\n * you should have received as part of this distribution. The terms\n * are also available at http://curl.haxx.se/docs/copyright.html.\n *\n * You may opt to use, copy, modify, merge, publish, distribute and/or sell\n * copies of the Software, and permit persons to whom the Software is\n * furnished to do so, under the terms of the COPYING file.\n *\n * This software is distributed on an \"AS IS\" basis, WITHOUT WARRANTY OF ANY\n * KIND, either express or implied.\n *\n * $Id: typecheck-gcc.h,v 1.9 2009-01-25 23:26:31 bagder Exp $\n ***************************************************************************/\n\n/* wraps curl_easy_setopt() with typechecking */\n\n/* To add a new kind of warning, add an\n *   if(_curl_is_sometype_option(_curl_opt) && ! _curl_is_sometype(value))\n *     _curl_easy_setopt_err_sometype();\n * block and define _curl_is_sometype_option, _curl_is_sometype and\n * _curl_easy_setopt_err_sometype below\n *\n * To add an option that uses the same type as an existing option, you'll just\n * need to extend the appropriate _curl_*_option macro\n */\n#define curl_easy_setopt(handle, option, value)                               \\\n__extension__ ({                                                              \\\n  __typeof__ (option) _curl_opt = option;                                     \\\n  if (__builtin_constant_p(_curl_opt)) {                                      \\\n    if (_curl_is_long_option(_curl_opt) && !_curl_is_long(value))             \\\n      _curl_easy_setopt_err_long();                                           \\\n    if (_curl_is_off_t_option(_curl_opt) && !_curl_is_off_t(value))           \\\n      _curl_easy_setopt_err_curl_off_t();                                     \\\n    if (_curl_is_string_option(_curl_opt) && !_curl_is_string(value))         \\\n      _curl_easy_setopt_err_string();                                         \\\n    if (_curl_is_write_cb_option(_curl_opt) && !_curl_is_write_cb(value))     \\\n      _curl_easy_setopt_err_write_callback();                                 \\\n    if ((_curl_opt) == CURLOPT_READFUNCTION && !_curl_is_read_cb(value))      \\\n      _curl_easy_setopt_err_read_cb();                                        \\\n    if ((_curl_opt) == CURLOPT_IOCTLFUNCTION && !_curl_is_ioctl_cb(value))    \\\n      _curl_easy_setopt_err_ioctl_cb();                                       \\\n    if ((_curl_opt) == CURLOPT_SOCKOPTFUNCTION && !_curl_is_sockopt_cb(value))\\\n      _curl_easy_setopt_err_sockopt_cb();                                     \\\n    if ((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION &&                          \\\n            !_curl_is_opensocket_cb(value))                                   \\\n      _curl_easy_setopt_err_opensocket_cb();                                  \\\n    if ((_curl_opt) == CURLOPT_PROGRESSFUNCTION &&                            \\\n            !_curl_is_progress_cb(value))                                     \\\n      _curl_easy_setopt_err_progress_cb();                                    \\\n    if ((_curl_opt) == CURLOPT_DEBUGFUNCTION && !_curl_is_debug_cb(value))    \\\n      _curl_easy_setopt_err_debug_cb();                                       \\\n    if ((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION &&                            \\\n            !_curl_is_ssl_ctx_cb(value))                                      \\\n      _curl_easy_setopt_err_ssl_ctx_cb();                                     \\\n    if (_curl_is_conv_cb_option(_curl_opt) && !_curl_is_conv_cb(value))       \\\n      _curl_easy_setopt_err_conv_cb();                                        \\\n    if ((_curl_opt) == CURLOPT_SEEKFUNCTION && !_curl_is_seek_cb(value))      \\\n      _curl_easy_setopt_err_seek_cb();                                        \\\n    if (_curl_is_cb_data_option(_curl_opt) && !_curl_is_cb_data(value))       \\\n      _curl_easy_setopt_err_cb_data();                                        \\\n    if ((_curl_opt) == CURLOPT_ERRORBUFFER && !_curl_is_error_buffer(value))  \\\n      _curl_easy_setopt_err_error_buffer();                                   \\\n    if ((_curl_opt) == CURLOPT_STDERR && !_curl_is_FILE(value))               \\\n      _curl_easy_setopt_err_FILE();                                           \\\n    if (_curl_is_postfields_option(_curl_opt) && !_curl_is_postfields(value)) \\\n      _curl_easy_setopt_err_postfields();                                     \\\n    if ((_curl_opt) == CURLOPT_HTTPPOST &&                                    \\\n            !_curl_is_arr((value), struct curl_httppost))                     \\\n      _curl_easy_setopt_err_curl_httpost();                                   \\\n    if (_curl_is_slist_option(_curl_opt) &&                                   \\\n            !_curl_is_arr((value), struct curl_slist))                        \\\n      _curl_easy_setopt_err_curl_slist();                                     \\\n    if ((_curl_opt) == CURLOPT_SHARE && !_curl_is_ptr((value), CURLSH))       \\\n      _curl_easy_setopt_err_CURLSH();                                         \\\n  }                                                                           \\\n  curl_easy_setopt(handle, _curl_opt, value);                                 \\\n})\n\n/* wraps curl_easy_getinfo() with typechecking */\n/* FIXME: don't allow const pointers */\n#define curl_easy_getinfo(handle, info, arg)                                  \\\n__extension__ ({                                                              \\\n  __typeof__ (info) _curl_info = info;                                        \\\n  if (__builtin_constant_p(_curl_info)) {                                     \\\n    if (_curl_is_string_info(_curl_info) && !_curl_is_arr((arg), char *))     \\\n      _curl_easy_getinfo_err_string();                                        \\\n    if (_curl_is_long_info(_curl_info) && !_curl_is_arr((arg), long))         \\\n      _curl_easy_getinfo_err_long();                                          \\\n    if (_curl_is_double_info(_curl_info) && !_curl_is_arr((arg), double))     \\\n      _curl_easy_getinfo_err_double();                                        \\\n    if (_curl_is_slist_info(_curl_info) &&                                    \\\n           !_curl_is_arr((arg), struct curl_slist *))                         \\\n      _curl_easy_getinfo_err_curl_slist();                                    \\\n  }                                                                           \\\n  curl_easy_getinfo(handle, _curl_info, arg);                                 \\\n})\n\n/* TODO: typechecking for curl_share_setopt() and curl_multi_setopt(),\n * for now just make sure that the functions are called with three\n * arguments\n */\n#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param)\n#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param)\n\n\n/* the actual warnings, triggered by calling the _curl_easy_setopt_err*\n * functions */\n\n/* To define a new warning, use _CURL_WARNING(identifier, \"message\") */\n#define _CURL_WARNING(id, message)                                            \\\n  static void __attribute__((warning(message))) __attribute__((unused))       \\\n  __attribute__((noinline)) id(void) { __asm__(\"\"); }\n\n_CURL_WARNING(_curl_easy_setopt_err_long,\n  \"curl_easy_setopt expects a long argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_curl_off_t,\n  \"curl_easy_setopt expects a curl_off_t argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_string,\n  \"curl_easy_setopt expects a string (char* or char[]) argument for this option\"\n  )\n_CURL_WARNING(_curl_easy_setopt_err_write_callback,\n  \"curl_easy_setopt expects a curl_write_callback argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_read_cb,\n  \"curl_easy_setopt expects a curl_read_callback argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb,\n  \"curl_easy_setopt expects a curl_ioctl_callback argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb,\n  \"curl_easy_setopt expects a curl_sockopt_callback argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb,\n  \"curl_easy_setopt expects a curl_opensocket_callback argument for this option\"\n  )\n_CURL_WARNING(_curl_easy_setopt_err_progress_cb,\n  \"curl_easy_setopt expects a curl_progress_callback argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_debug_cb,\n  \"curl_easy_setopt expects a curl_debug_callback argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb,\n  \"curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_conv_cb,\n  \"curl_easy_setopt expects a curl_conv_callback argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_seek_cb,\n  \"curl_easy_setopt expects a curl_seek_callback argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_cb_data,\n  \"curl_easy_setopt expects a private data pointer as argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_error_buffer,\n  \"curl_easy_setopt expects a char buffer of CURL_ERROR_SIZE as argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_FILE,\n  \"curl_easy_setopt expects a FILE* argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_postfields,\n  \"curl_easy_setopt expects a void* or char* argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_curl_httpost,\n  \"curl_easy_setopt expects a struct curl_httppost* argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_curl_slist,\n  \"curl_easy_setopt expects a struct curl_slist* argument for this option\")\n_CURL_WARNING(_curl_easy_setopt_err_CURLSH,\n  \"curl_easy_setopt expects a CURLSH* argument for this option\")\n\n_CURL_WARNING(_curl_easy_getinfo_err_string,\n  \"curl_easy_getinfo expects a pointer to char * for this info\")\n_CURL_WARNING(_curl_easy_getinfo_err_long,\n  \"curl_easy_getinfo expects a pointer to long for this info\")\n_CURL_WARNING(_curl_easy_getinfo_err_double,\n  \"curl_easy_getinfo expects a pointer to double for this info\")\n_CURL_WARNING(_curl_easy_getinfo_err_curl_slist,\n  \"curl_easy_getinfo expects a pointer to struct curl_slist * for this info\")\n\n/* groups of curl_easy_setops options that take the same type of argument */\n\n/* To add a new option to one of the groups, just add\n *   (option) == CURLOPT_SOMETHING\n * to the or-expression. If the option takes a long or curl_off_t, you don't\n * have to do anything\n */\n\n/* evaluates to true if option takes a long argument */\n#define _curl_is_long_option(option)                                          \\\n  (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT)\n\n#define _curl_is_off_t_option(option)                                         \\\n  ((option) > CURLOPTTYPE_OFF_T)\n\n/* evaluates to true if option takes a char* argument */\n#define _curl_is_string_option(option)                                        \\\n  ((option) == CURLOPT_URL ||                                                 \\\n   (option) == CURLOPT_PROXY ||                                               \\\n   (option) == CURLOPT_INTERFACE ||                                           \\\n   (option) == CURLOPT_NETRC_FILE ||                                          \\\n   (option) == CURLOPT_USERPWD ||                                             \\\n   (option) == CURLOPT_USERNAME ||                                            \\\n   (option) == CURLOPT_PASSWORD ||                                            \\\n   (option) == CURLOPT_PROXYUSERPWD ||                                        \\\n   (option) == CURLOPT_PROXYUSERNAME ||                                       \\\n   (option) == CURLOPT_PROXYPASSWORD ||                                       \\\n   (option) == CURLOPT_NOPROXY ||                                             \\\n   (option) == CURLOPT_ENCODING ||                                            \\\n   (option) == CURLOPT_REFERER ||                                             \\\n   (option) == CURLOPT_USERAGENT ||                                           \\\n   (option) == CURLOPT_COOKIE ||                                              \\\n   (option) == CURLOPT_COOKIEFILE ||                                          \\\n   (option) == CURLOPT_COOKIEJAR ||                                           \\\n   (option) == CURLOPT_COOKIELIST ||                                          \\\n   (option) == CURLOPT_FTPPORT ||                                             \\\n   (option) == CURLOPT_FTP_ALTERNATIVE_TO_USER ||                             \\\n   (option) == CURLOPT_FTP_ACCOUNT ||                                         \\\n   (option) == CURLOPT_RANGE ||                                               \\\n   (option) == CURLOPT_CUSTOMREQUEST ||                                       \\\n   (option) == CURLOPT_SSLCERT ||                                             \\\n   (option) == CURLOPT_SSLCERTTYPE ||                                         \\\n   (option) == CURLOPT_SSLKEY ||                                              \\\n   (option) == CURLOPT_SSLKEYTYPE ||                                          \\\n   (option) == CURLOPT_KEYPASSWD ||                                           \\\n   (option) == CURLOPT_SSLENGINE ||                                           \\\n   (option) == CURLOPT_CAINFO ||                                              \\\n   (option) == CURLOPT_CAPATH ||                                              \\\n   (option) == CURLOPT_RANDOM_FILE ||                                         \\\n   (option) == CURLOPT_EGDSOCKET ||                                           \\\n   (option) == CURLOPT_SSL_CIPHER_LIST ||                                     \\\n   (option) == CURLOPT_KRBLEVEL ||                                            \\\n   (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 ||                             \\\n   (option) == CURLOPT_SSH_PUBLIC_KEYFILE ||                                  \\\n   (option) == CURLOPT_SSH_PRIVATE_KEYFILE ||                                 \\\n   (option) == CURLOPT_CRLFILE ||                                             \\\n   (option) == CURLOPT_ISSUERCERT ||                                          \\\n   0)\n\n/* evaluates to true if option takes a curl_write_callback argument */\n#define _curl_is_write_cb_option(option)                                      \\\n  ((option) == CURLOPT_HEADERFUNCTION ||                                      \\\n   (option) == CURLOPT_WRITEFUNCTION)\n\n/* evaluates to true if option takes a curl_conv_callback argument */\n#define _curl_is_conv_cb_option(option)                                       \\\n  ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION ||                            \\\n   (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION ||                          \\\n   (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION)\n\n/* evaluates to true if option takes a data argument to pass to a callback */\n#define _curl_is_cb_data_option(option)                                       \\\n  ((option) == CURLOPT_WRITEDATA ||                                           \\\n   (option) == CURLOPT_READDATA ||                                            \\\n   (option) == CURLOPT_IOCTLDATA ||                                           \\\n   (option) == CURLOPT_SOCKOPTDATA ||                                         \\\n   (option) == CURLOPT_OPENSOCKETDATA ||                                      \\\n   (option) == CURLOPT_PROGRESSDATA ||                                        \\\n   (option) == CURLOPT_WRITEHEADER ||                                         \\\n   (option) == CURLOPT_DEBUGDATA ||                                           \\\n   (option) == CURLOPT_SSL_CTX_DATA ||                                        \\\n   (option) == CURLOPT_SEEKDATA ||                                            \\\n   (option) == CURLOPT_PRIVATE ||                                             \\\n   0)\n\n/* evaluates to true if option takes a POST data argument (void* or char*) */\n#define _curl_is_postfields_option(option)                                    \\\n  ((option) == CURLOPT_POSTFIELDS ||                                          \\\n   (option) == CURLOPT_COPYPOSTFIELDS ||                                      \\\n   0)\n\n/* evaluates to true if option takes a struct curl_slist * argument */\n#define _curl_is_slist_option(option)                                         \\\n  ((option) == CURLOPT_HTTPHEADER ||                                          \\\n   (option) == CURLOPT_HTTP200ALIASES ||                                      \\\n   (option) == CURLOPT_QUOTE ||                                               \\\n   (option) == CURLOPT_POSTQUOTE ||                                           \\\n   (option) == CURLOPT_PREQUOTE ||                                            \\\n   (option) == CURLOPT_TELNETOPTIONS ||                                       \\\n   0)\n\n/* groups of curl_easy_getinfo infos that take the same type of argument */\n\n/* evaluates to true if info expects a pointer to char * argument */\n#define _curl_is_string_info(info)                                            \\\n  (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG)\n\n/* evaluates to true if info expects a pointer to long argument */\n#define _curl_is_long_info(info)                                              \\\n  (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE)\n\n/* evaluates to true if info expects a pointer to double argument */\n#define _curl_is_double_info(info)                                            \\\n  (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST)\n\n/* true if info expects a pointer to struct curl_slist * argument */\n#define _curl_is_slist_info(info)                                             \\\n  (CURLINFO_SLIST < (info))\n\n\n/* typecheck helpers -- check whether given expression has requested type*/\n\n/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros,\n * otherwise define a new macro. Search for __builtin_types_compatible_p\n * in the GCC manual.\n * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is\n * the actual expression passed to the curl_easy_setopt macro. This\n * means that you can only apply the sizeof and __typeof__ operators, no\n * == or whatsoever.\n */\n\n/* XXX: should evaluate to true iff expr is a pointer */\n#define _curl_is_any_ptr(expr)                                                \\\n  (sizeof(expr) == sizeof(void*))\n\n/* evaluates to true if expr is NULL */\n/* XXX: must not evaluate expr, so this check is not accurate */\n#define _curl_is_NULL(expr)                                                   \\\n  (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL)))\n\n/* evaluates to true if expr is type*, const type* or NULL */\n#define _curl_is_ptr(expr, type)                                              \\\n  (_curl_is_NULL(expr) ||                                                     \\\n   __builtin_types_compatible_p(__typeof__(expr), type *) ||                  \\\n   __builtin_types_compatible_p(__typeof__(expr), const type *))\n\n/* evaluates to true if expr is one of type[], type*, NULL or const type* */\n#define _curl_is_arr(expr, type)                                              \\\n  (_curl_is_ptr((expr), type) ||                                              \\\n   __builtin_types_compatible_p(__typeof__(expr), type []))\n\n/* evaluates to true if expr is a string */\n#define _curl_is_string(expr)                                                 \\\n  (_curl_is_arr((expr), char) ||                                              \\\n   _curl_is_arr((expr), signed char) ||                                       \\\n   _curl_is_arr((expr), unsigned char))\n\n/* evaluates to true if expr is a long (no matter the signedness)\n * XXX: for now, int is also accepted (and therefore short and char, which\n * are promoted to int when passed to a variadic function) */\n#define _curl_is_long(expr)                                                   \\\n  (__builtin_types_compatible_p(__typeof__(expr), long) ||                    \\\n   __builtin_types_compatible_p(__typeof__(expr), signed long) ||             \\\n   __builtin_types_compatible_p(__typeof__(expr), unsigned long) ||           \\\n   __builtin_types_compatible_p(__typeof__(expr), int) ||                     \\\n   __builtin_types_compatible_p(__typeof__(expr), signed int) ||              \\\n   __builtin_types_compatible_p(__typeof__(expr), unsigned int) ||            \\\n   __builtin_types_compatible_p(__typeof__(expr), short) ||                   \\\n   __builtin_types_compatible_p(__typeof__(expr), signed short) ||            \\\n   __builtin_types_compatible_p(__typeof__(expr), unsigned short) ||          \\\n   __builtin_types_compatible_p(__typeof__(expr), char) ||                    \\\n   __builtin_types_compatible_p(__typeof__(expr), signed char) ||             \\\n   __builtin_types_compatible_p(__typeof__(expr), unsigned char))\n\n/* evaluates to true if expr is of type curl_off_t */\n#define _curl_is_off_t(expr)                                                  \\\n  (__builtin_types_compatible_p(__typeof__(expr), curl_off_t))\n\n/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */\n/* XXX: also check size of an char[] array? */\n#define _curl_is_error_buffer(expr)                                           \\\n  (__builtin_types_compatible_p(__typeof__(expr), char *) ||                  \\\n   __builtin_types_compatible_p(__typeof__(expr), char[]))\n\n/* evaluates to true if expr is of type (const) void* or (const) FILE* */\n#if 0\n#define _curl_is_cb_data(expr)                                                \\\n  (_curl_is_ptr((expr), void) ||                                              \\\n   _curl_is_ptr((expr), FILE))\n#else /* be less strict */\n#define _curl_is_cb_data(expr)                                                \\\n  _curl_is_any_ptr(expr)\n#endif\n\n/* evaluates to true if expr is of type FILE* */\n#define _curl_is_FILE(expr)                                                   \\\n  (__builtin_types_compatible_p(__typeof__(expr), FILE *))\n\n/* evaluates to true if expr can be passed as POST data (void* or char*) */\n#define _curl_is_postfields(expr)                                             \\\n  (_curl_is_ptr((expr), void) ||                                              \\\n   _curl_is_arr((expr), char))\n\n/* FIXME: the whole callback checking is messy...\n * The idea is to tolerate char vs. void and const vs. not const\n * pointers in arguments at least\n */\n/* helper: __builtin_types_compatible_p distinguishes between functions and\n * function pointers, hide it */\n#define _curl_callback_compatible(func, type)                                 \\\n  (__builtin_types_compatible_p(__typeof__(func), type) ||                    \\\n   __builtin_types_compatible_p(__typeof__(func), type*))\n\n/* evaluates to true if expr is of type curl_read_callback or \"similar\" */\n#define _curl_is_read_cb(expr)                                          \\\n  (_curl_is_NULL(expr) ||                                                     \\\n   __builtin_types_compatible_p(__typeof__(expr), __typeof__(fread)) ||       \\\n   __builtin_types_compatible_p(__typeof__(expr), curl_read_callback) ||      \\\n   _curl_callback_compatible((expr), _curl_read_callback1) ||                 \\\n   _curl_callback_compatible((expr), _curl_read_callback2) ||                 \\\n   _curl_callback_compatible((expr), _curl_read_callback3) ||                 \\\n   _curl_callback_compatible((expr), _curl_read_callback4) ||                 \\\n   _curl_callback_compatible((expr), _curl_read_callback5) ||                 \\\n   _curl_callback_compatible((expr), _curl_read_callback6))\ntypedef size_t (_curl_read_callback1)(char *, size_t, size_t, void*);\ntypedef size_t (_curl_read_callback2)(char *, size_t, size_t, const void*);\ntypedef size_t (_curl_read_callback3)(char *, size_t, size_t, FILE*);\ntypedef size_t (_curl_read_callback4)(void *, size_t, size_t, void*);\ntypedef size_t (_curl_read_callback5)(void *, size_t, size_t, const void*);\ntypedef size_t (_curl_read_callback6)(void *, size_t, size_t, FILE*);\n\n/* evaluates to true if expr is of type curl_write_callback or \"similar\" */\n#define _curl_is_write_cb(expr)                                               \\\n  (_curl_is_read_cb(expr) ||                                            \\\n   __builtin_types_compatible_p(__typeof__(expr), __typeof__(fwrite)) ||      \\\n   __builtin_types_compatible_p(__typeof__(expr), curl_write_callback) ||     \\\n   _curl_callback_compatible((expr), _curl_write_callback1) ||                \\\n   _curl_callback_compatible((expr), _curl_write_callback2) ||                \\\n   _curl_callback_compatible((expr), _curl_write_callback3) ||                \\\n   _curl_callback_compatible((expr), _curl_write_callback4) ||                \\\n   _curl_callback_compatible((expr), _curl_write_callback5) ||                \\\n   _curl_callback_compatible((expr), _curl_write_callback6))\ntypedef size_t (_curl_write_callback1)(const char *, size_t, size_t, void*);\ntypedef size_t (_curl_write_callback2)(const char *, size_t, size_t,\n                                       const void*);\ntypedef size_t (_curl_write_callback3)(const char *, size_t, size_t, FILE*);\ntypedef size_t (_curl_write_callback4)(const void *, size_t, size_t, void*);\ntypedef size_t (_curl_write_callback5)(const void *, size_t, size_t,\n                                       const void*);\ntypedef size_t (_curl_write_callback6)(const void *, size_t, size_t, FILE*);\n\n/* evaluates to true if expr is of type curl_ioctl_callback or \"similar\" */\n#define _curl_is_ioctl_cb(expr)                                         \\\n  (_curl_is_NULL(expr) ||                                                     \\\n   __builtin_types_compatible_p(__typeof__(expr), curl_ioctl_callback) ||     \\\n   _curl_callback_compatible((expr), _curl_ioctl_callback1) ||                \\\n   _curl_callback_compatible((expr), _curl_ioctl_callback2) ||                \\\n   _curl_callback_compatible((expr), _curl_ioctl_callback3) ||                \\\n   _curl_callback_compatible((expr), _curl_ioctl_callback4))\ntypedef curlioerr (_curl_ioctl_callback1)(CURL *, int, void*);\ntypedef curlioerr (_curl_ioctl_callback2)(CURL *, int, const void*);\ntypedef curlioerr (_curl_ioctl_callback3)(CURL *, curliocmd, void*);\ntypedef curlioerr (_curl_ioctl_callback4)(CURL *, curliocmd, const void*);\n\n/* evaluates to true if expr is of type curl_sockopt_callback or \"similar\" */\n#define _curl_is_sockopt_cb(expr)                                       \\\n  (_curl_is_NULL(expr) ||                                                     \\\n   __builtin_types_compatible_p(__typeof__(expr), curl_sockopt_callback) ||   \\\n   _curl_callback_compatible((expr), _curl_sockopt_callback1) ||              \\\n   _curl_callback_compatible((expr), _curl_sockopt_callback2))\ntypedef int (_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype);\ntypedef int (_curl_sockopt_callback2)(const void *, curl_socket_t,\n                                      curlsocktype);\n\n/* evaluates to true if expr is of type curl_opensocket_callback or \"similar\" */\n#define _curl_is_opensocket_cb(expr)                                    \\\n  (_curl_is_NULL(expr) ||                                                     \\\n   __builtin_types_compatible_p(__typeof__(expr), curl_opensocket_callback) ||\\\n   _curl_callback_compatible((expr), _curl_opensocket_callback1) ||           \\\n   _curl_callback_compatible((expr), _curl_opensocket_callback2) ||           \\\n   _curl_callback_compatible((expr), _curl_opensocket_callback3) ||           \\\n   _curl_callback_compatible((expr), _curl_opensocket_callback4))\ntypedef curl_socket_t (_curl_opensocket_callback1)\n  (void *, curlsocktype, struct curl_sockaddr *);\ntypedef curl_socket_t (_curl_opensocket_callback2)\n  (void *, curlsocktype, const struct curl_sockaddr *);\ntypedef curl_socket_t (_curl_opensocket_callback3)\n  (const void *, curlsocktype, struct curl_sockaddr *);\ntypedef curl_socket_t (_curl_opensocket_callback4)\n  (const void *, curlsocktype, const struct curl_sockaddr *);\n\n/* evaluates to true if expr is of type curl_progress_callback or \"similar\" */\n#define _curl_is_progress_cb(expr)                                      \\\n  (_curl_is_NULL(expr) ||                                                     \\\n   __builtin_types_compatible_p(__typeof__(expr), curl_progress_callback) ||  \\\n   _curl_callback_compatible((expr), _curl_progress_callback1) ||             \\\n   _curl_callback_compatible((expr), _curl_progress_callback2))\ntypedef int (_curl_progress_callback1)(void *,\n    double, double, double, double);\ntypedef int (_curl_progress_callback2)(const void *,\n    double, double, double, double);\n\n/* evaluates to true if expr is of type curl_debug_callback or \"similar\" */\n#define _curl_is_debug_cb(expr)                                         \\\n  (_curl_is_NULL(expr) ||                                                     \\\n   __builtin_types_compatible_p(__typeof__(expr), curl_debug_callback) ||     \\\n   _curl_callback_compatible((expr), _curl_debug_callback1) ||                \\\n   _curl_callback_compatible((expr), _curl_debug_callback2) ||                \\\n   _curl_callback_compatible((expr), _curl_debug_callback3) ||                \\\n   _curl_callback_compatible((expr), _curl_debug_callback4))\ntypedef int (_curl_debug_callback1) (CURL *,\n    curl_infotype, char *, size_t, void *);\ntypedef int (_curl_debug_callback2) (CURL *,\n    curl_infotype, char *, size_t, const void *);\ntypedef int (_curl_debug_callback3) (CURL *,\n    curl_infotype, const char *, size_t, void *);\ntypedef int (_curl_debug_callback4) (CURL *,\n    curl_infotype, const char *, size_t, const void *);\n\n/* evaluates to true if expr is of type curl_ssl_ctx_callback or \"similar\" */\n/* this is getting even messier... */\n#define _curl_is_ssl_ctx_cb(expr)                                       \\\n  (_curl_is_NULL(expr) ||                                                     \\\n   __builtin_types_compatible_p(__typeof__(expr), curl_ssl_ctx_callback) ||   \\\n   _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) ||              \\\n   _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) ||              \\\n   _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) ||              \\\n   _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) ||              \\\n   _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) ||              \\\n   _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) ||              \\\n   _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) ||              \\\n   _curl_callback_compatible((expr), _curl_ssl_ctx_callback8))\ntypedef CURLcode (_curl_ssl_ctx_callback1)(CURL *, void *, void *);\ntypedef CURLcode (_curl_ssl_ctx_callback2)(CURL *, void *, const void *);\ntypedef CURLcode (_curl_ssl_ctx_callback3)(CURL *, const void *, void *);\ntypedef CURLcode (_curl_ssl_ctx_callback4)(CURL *, const void *, const void *);\n#ifdef HEADER_SSL_H\n/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX\n * this will of course break if we're included before OpenSSL headers...\n */\ntypedef CURLcode (_curl_ssl_ctx_callback5)(CURL *, SSL_CTX, void *);\ntypedef CURLcode (_curl_ssl_ctx_callback6)(CURL *, SSL_CTX, const void *);\ntypedef CURLcode (_curl_ssl_ctx_callback7)(CURL *, const SSL_CTX, void *);\ntypedef CURLcode (_curl_ssl_ctx_callback8)(CURL *, const SSL_CTX, const void *);\n#else\ntypedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5;\ntypedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6;\ntypedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7;\ntypedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8;\n#endif\n\n/* evaluates to true if expr is of type curl_conv_callback or \"similar\" */\n#define _curl_is_conv_cb(expr)                                          \\\n  (_curl_is_NULL(expr) ||                                                     \\\n   __builtin_types_compatible_p(__typeof__(expr), curl_conv_callback) ||      \\\n   _curl_callback_compatible((expr), _curl_conv_callback1) ||                 \\\n   _curl_callback_compatible((expr), _curl_conv_callback2) ||                 \\\n   _curl_callback_compatible((expr), _curl_conv_callback3) ||                 \\\n   _curl_callback_compatible((expr), _curl_conv_callback4))\ntypedef CURLcode (*_curl_conv_callback1)(char *, size_t length);\ntypedef CURLcode (*_curl_conv_callback2)(const char *, size_t length);\ntypedef CURLcode (*_curl_conv_callback3)(void *, size_t length);\ntypedef CURLcode (*_curl_conv_callback4)(const void *, size_t length);\n\n/* evaluates to true if expr is of type curl_seek_callback or \"similar\" */\n#define _curl_is_seek_cb(expr)                                          \\\n  (_curl_is_NULL(expr) ||                                                     \\\n   __builtin_types_compatible_p(__typeof__(expr), curl_seek_callback) ||      \\\n   _curl_callback_compatible((expr), _curl_seek_callback1) ||                 \\\n   _curl_callback_compatible((expr), _curl_seek_callback2))\ntypedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int);\ntypedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int);\n\n\n#endif /* __CURL_TYPECHECK_GCC_H */\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/curl/types.h",
    "content": "/* not used */\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/AUTHORS",
    "content": "opensource@google.com\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/COPYING",
    "content": "Copyright (c) 2008, Google Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n    * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\nA function gettimeofday in utilities.cc is based on\n\nhttp://www.google.com/codesearch/p?hl=en#dR3YEbitojA/COPYING&q=GetSystemTimeAsFileTime%20license:bsd\n\nThe license of this code is:\n\nCopyright (c) 2003-2008, Jouni Malinen <j@w1.fi> and contributors\nAll Rights Reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\n3. Neither the name(s) of the above-listed copyright holder(s) nor the\n   names of its contributors may be used to endorse or promote products\n   derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/ChangeLog",
    "content": "2010-06-15  Google Inc. <opensource@google.com>\n\n\t* google-glog: version 0.3.1\n\t* GLOG_* environment variables now work even when gflags is installed.\n\t* Snow leopard support.\n\t* Now we can build and test from out side tree.\n\t* Add DCHECK_NOTNULL.\n\t* Add ShutdownGoogleLogging to close syslog (thanks DGunchev)\n\t* Fix --enable-frame-pointers option (thanks kazuki.ohta)\n\t* Fix libunwind detection (thanks giantchen)\n\n2009-07-30  Google Inc. <opensource@google.com>\n\n\t* google-glog: version 0.3.0\n\t* Fix a deadlock happened when user uses glog with recent gflags.\n\t* Suppress several unnecessary warnings (thanks keir).\n\t* NetBSD and OpenBSD support.\n\t* Use Win32API GetComputeNameA properly (thanks magila).\n\t* Fix user name detection for Windows (thanks ademin).\n\t* Fix several minor bugs.\n\n2009-04-10  Google Inc. <opensource@google.com>\n\t* google-glog: version 0.2.1\n\t* Fix timestamps of VC++ version.\n\t* Add pkg-config support (thanks Tomasz)\n\t* Fix build problem when building with gtest (thanks Michael)\n\t* Add --with-gflags option for configure (thanks Michael)\n\t* Fixes for GCC 4.4 (thanks John)\n\n2009-01-23  Google Inc. <opensource@google.com>\n\t* google-glog: version 0.2\n\t* Add initial Windows VC++ support.\n\t* Google testing/mocking frameworks integration.\n\t* Link pthread library automatically.\n\t* Flush logs in signal handlers.\n\t* Add macros LOG_TO_STRING, LOG_AT_LEVEL, DVLOG, and LOG_TO_SINK_ONLY.\n\t* Log microseconds.\n\t* Add --log_backtrace_at option.\n\t* Fix some minor bugs.\n\n2008-11-18  Google Inc. <opensource@google.com>\n\t* google-glog: version 0.1.2\n\t* Add InstallFailureSignalHandler(). (satorux)\n\t* Re-organize the way to produce stacktraces.\n\t* Don't define unnecessary macro DISALLOW_EVIL_CONSTRUCTORS.\n\n2008-10-15  Google Inc. <opensource@google.com>\n\t* google-glog: version 0.1.1\n\t* Support symbolize for MacOSX 10.5.\n\t* BUG FIX: --vmodule didn't work with gflags.\n\t* BUG FIX: symbolize_unittest failed with GCC 4.3.\n\t* Several fixes on the document.\n\n2008-10-07  Google Inc. <opensource@google.com>\n\n\t* google-glog: initial release:\n\tThe glog package contains a library that implements application-level\n\tlogging.  This library provides logging APIs based on C++-style\n\tstreams and various helper macros.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/INSTALL",
    "content": "Installation Instructions\n*************************\n\nCopyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,\n2006, 2007 Free Software Foundation, Inc.\n\nThis file is free documentation; the Free Software Foundation gives\nunlimited permission to copy, distribute and modify it.\n\nGlog-Specific Install Notes\n================================\n\n*** NOTE FOR 64-BIT LINUX SYSTEMS\n\nThe glibc built-in stack-unwinder on 64-bit systems has some problems\nwith the glog libraries.  (In particular, if you are using\nInstallFailureSignalHandler(), the signal may be raised in the middle\nof malloc, holding some malloc-related locks when they invoke the\nstack unwinder.  The built-in stack unwinder may call malloc\nrecursively, which may require the thread to acquire a lock it already\nholds: deadlock.)\n\nFor that reason, if you use a 64-bit system and you need\nInstallFailureSignalHandler(), we strongly recommend you install\nlibunwind before trying to configure or install google glog.\nlibunwind can be found at\n\n   http://download.savannah.nongnu.org/releases/libunwind/libunwind-snap-070410.tar.gz\n\nEven if you already have libunwind installed, you will probably still\nneed to install from the snapshot to get the latest version.\n\nCAUTION: if you install libunwind from the URL above, be aware that\nyou may have trouble if you try to statically link your binary with\nglog: that is, if you link with 'gcc -static -lgcc_eh ...'.  This\nis because both libunwind and libgcc implement the same C++ exception\nhandling APIs, but they implement them differently on some platforms.\nThis is not likely to be a problem on ia64, but may be on x86-64.\n\nAlso, if you link binaries statically, make sure that you add\n-Wl,--eh-frame-hdr to your linker options. This is required so that\nlibunwind can find the information generated by the compiler required\nfor stack unwinding.\n\nUsing -static is rare, though, so unless you know this will affect you\nit probably won't.\n\nIf you cannot or do not wish to install libunwind, you can still try\nto use two kinds of stack-unwinder: 1. glibc built-in stack-unwinder\nand 2. frame pointer based stack-unwinder.\n\n1. As we already mentioned, glibc's unwinder has a deadlock issue.\nHowever, if you don't use InstallFailureSignalHandler() or you don't\nworry about the rare possibilities of deadlocks, you can use this\nstack-unwinder.  If you specify no options and libunwind isn't\ndetected on your system, the configure script chooses this unwinder by\ndefault.\n\n2. The frame pointer based stack unwinder requires that your\napplication, the glog library, and system libraries like libc, all be\ncompiled with a frame pointer.  This is *not* the default for x86-64.\n\nIf you are on x86-64 system, know that you have a set of system\nlibraries with frame-pointers enabled, and compile all your\napplications with -fno-omit-frame-pointer, then you can enable the\nframe pointer based stack unwinder by passing the\n--enable-frame-pointers flag to configure.\n\n\nBasic Installation\n==================\n\nBriefly, the shell commands `./configure; make; make install' should\nconfigure, build, and install this package.  The following\nmore-detailed instructions are generic; see the `README' file for\ninstructions specific to this package.\n\n   The `configure' shell script attempts to guess correct values for\nvarious system-dependent variables used during compilation.  It uses\nthose values to create a `Makefile' in each directory of the package.\nIt may also create one or more `.h' files containing system-dependent\ndefinitions.  Finally, it creates a shell script `config.status' that\nyou can run in the future to recreate the current configuration, and a\nfile `config.log' containing compiler output (useful mainly for\ndebugging `configure').\n\n   It can also use an optional file (typically called `config.cache'\nand enabled with `--cache-file=config.cache' or simply `-C') that saves\nthe results of its tests to speed up reconfiguring.  Caching is\ndisabled by default to prevent problems with accidental use of stale\ncache files.\n\n   If you need to do unusual things to compile the package, please try\nto figure out how `configure' could check whether to do them, and mail\ndiffs or instructions to the address given in the `README' so they can\nbe considered for the next release.  If you are using the cache, and at\nsome point `config.cache' contains results you don't want to keep, you\nmay remove or edit it.\n\n   The file `configure.ac' (or `configure.in') is used to create\n`configure' by a program called `autoconf'.  You need `configure.ac' if\nyou want to change it or regenerate `configure' using a newer version\nof `autoconf'.\n\nThe simplest way to compile this package is:\n\n  1. `cd' to the directory containing the package's source code and type\n     `./configure' to configure the package for your system.\n\n     Running `configure' might take a while.  While running, it prints\n     some messages telling which features it is checking for.\n\n  2. Type `make' to compile the package.\n\n  3. Optionally, type `make check' to run any self-tests that come with\n     the package.\n\n  4. Type `make install' to install the programs and any data files and\n     documentation.\n\n  5. You can remove the program binaries and object files from the\n     source code directory by typing `make clean'.  To also remove the\n     files that `configure' created (so you can compile the package for\n     a different kind of computer), type `make distclean'.  There is\n     also a `make maintainer-clean' target, but that is intended mainly\n     for the package's developers.  If you use it, you may have to get\n     all sorts of other programs in order to regenerate files that came\n     with the distribution.\n\n  6. Often, you can also type `make uninstall' to remove the installed\n     files again.\n\nCompilers and Options\n=====================\n\nSome systems require unusual options for compilation or linking that the\n`configure' script does not know about.  Run `./configure --help' for\ndetails on some of the pertinent environment variables.\n\n   You can give `configure' initial values for configuration parameters\nby setting variables in the command line or in the environment.  Here\nis an example:\n\n     ./configure CC=c99 CFLAGS=-g LIBS=-lposix\n\n   *Note Defining Variables::, for more details.\n\nCompiling For Multiple Architectures\n====================================\n\nYou can compile the package for more than one kind of computer at the\nsame time, by placing the object files for each architecture in their\nown directory.  To do this, you can use GNU `make'.  `cd' to the\ndirectory where you want the object files and executables to go and run\nthe `configure' script.  `configure' automatically checks for the\nsource code in the directory that `configure' is in and in `..'.\n\n   With a non-GNU `make', it is safer to compile the package for one\narchitecture at a time in the source code directory.  After you have\ninstalled the package for one architecture, use `make distclean' before\nreconfiguring for another architecture.\n\nInstallation Names\n==================\n\nBy default, `make install' installs the package's commands under\n`/usr/local/bin', include files under `/usr/local/include', etc.  You\ncan specify an installation prefix other than `/usr/local' by giving\n`configure' the option `--prefix=PREFIX'.\n\n   You can specify separate installation prefixes for\narchitecture-specific files and architecture-independent files.  If you\npass the option `--exec-prefix=PREFIX' to `configure', the package uses\nPREFIX as the prefix for installing programs and libraries.\nDocumentation and other data files still use the regular prefix.\n\n   In addition, if you use an unusual directory layout you can give\noptions like `--bindir=DIR' to specify different values for particular\nkinds of files.  Run `configure --help' for a list of the directories\nyou can set and what kinds of files go in them.\n\n   If the package supports it, you can cause programs to be installed\nwith an extra prefix or suffix on their names by giving `configure' the\noption `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.\n\nOptional Features\n=================\n\nSome packages pay attention to `--enable-FEATURE' options to\n`configure', where FEATURE indicates an optional part of the package.\nThey may also pay attention to `--with-PACKAGE' options, where PACKAGE\nis something like `gnu-as' or `x' (for the X Window System).  The\n`README' should mention any `--enable-' and `--with-' options that the\npackage recognizes.\n\n   For packages that use the X Window System, `configure' can usually\nfind the X include and library files automatically, but if it doesn't,\nyou can use the `configure' options `--x-includes=DIR' and\n`--x-libraries=DIR' to specify their locations.\n\nSpecifying the System Type\n==========================\n\nThere may be some features `configure' cannot figure out automatically,\nbut needs to determine by the type of machine the package will run on.\nUsually, assuming the package is built to be run on the _same_\narchitectures, `configure' can figure that out, but if it prints a\nmessage saying it cannot guess the machine type, give it the\n`--build=TYPE' option.  TYPE can either be a short name for the system\ntype, such as `sun4', or a canonical name which has the form:\n\n     CPU-COMPANY-SYSTEM\n\nwhere SYSTEM can have one of these forms:\n\n     OS KERNEL-OS\n\n   See the file `config.sub' for the possible values of each field.  If\n`config.sub' isn't included in this package, then this package doesn't\nneed to know the machine type.\n\n   If you are _building_ compiler tools for cross-compiling, you should\nuse the option `--target=TYPE' to select the type of system they will\nproduce code for.\n\n   If you want to _use_ a cross compiler, that generates code for a\nplatform different from the build platform, you should specify the\n\"host\" platform (i.e., that on which the generated programs will\neventually be run) with `--host=TYPE'.\n\nSharing Defaults\n================\n\nIf you want to set default values for `configure' scripts to share, you\ncan create a site shell script called `config.site' that gives default\nvalues for variables like `CC', `cache_file', and `prefix'.\n`configure' looks for `PREFIX/share/config.site' if it exists, then\n`PREFIX/etc/config.site' if it exists.  Or, you can set the\n`CONFIG_SITE' environment variable to the location of the site script.\nA warning: not all `configure' scripts look for a site script.\n\nDefining Variables\n==================\n\nVariables not defined in a site shell script can be set in the\nenvironment passed to `configure'.  However, some packages may run\nconfigure again during the build, and the customized values of these\nvariables may be lost.  In order to avoid this problem, you should set\nthem in the `configure' command line, using `VAR=value'.  For example:\n\n     ./configure CC=/usr/local2/bin/gcc\n\ncauses the specified `gcc' to be used as the C compiler (unless it is\noverridden in the site shell script).\n\nUnfortunately, this technique does not work for `CONFIG_SHELL' due to\nan Autoconf bug.  Until the bug is fixed you can use this workaround:\n\n     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash\n\n`configure' Invocation\n======================\n\n`configure' recognizes the following options to control how it operates.\n\n`--help'\n`-h'\n     Print a summary of the options to `configure', and exit.\n\n`--version'\n`-V'\n     Print the version of Autoconf used to generate the `configure'\n     script, and exit.\n\n`--cache-file=FILE'\n     Enable the cache: use and save the results of the tests in FILE,\n     traditionally `config.cache'.  FILE defaults to `/dev/null' to\n     disable caching.\n\n`--config-cache'\n`-C'\n     Alias for `--cache-file=config.cache'.\n\n`--quiet'\n`--silent'\n`-q'\n     Do not print messages saying which checks are being made.  To\n     suppress all normal output, redirect it to `/dev/null' (any error\n     messages will still be shown).\n\n`--srcdir=DIR'\n     Look for the package's source code in directory DIR.  Usually\n     `configure' can determine that directory automatically.\n\n`configure' also accepts some other, not widely useful, options.  Run\n`configure --help' for more details.\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/NEWS",
    "content": ""
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/README",
    "content": "This repository contains a C++ implementation of the Google logging\nmodule.  Documentation for the implementation is in doc/.\n\nSee INSTALL for (generic) installation instructions for C++: basically\n   ./configure && make && make install\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/README.windows",
    "content": "This project has begun being ported to Windows.  A working solution\nfile exists in this directory:\n    google-glog.sln\n\nYou can load this solution file into VC++ 9.0 (Visual Studio\n2008).  You may also be able to use this solution file with older\nVisual Studios by converting the solution file.\n\nNote that stack tracing and some unittests are not ported\nyet.\n\nYou can also link glog code in statically -- see the example project\nlibglog_static and logging_unittest_static, which does this.  For this\nto work, you'll need to add \"/D GOOGLE_GLOG_DLL_DECL=\" to the compile\nline of every glog's .cc file.\n\nI have little experience with Windows programming, so there may be\nbetter ways to set this up than I've done!  If you run across any\nproblems, please post to the google-glog Google Group, or report\nthem on the google-glog Google Code site:\n   http://groups.google.com/group/google-glog\n   http://code.google.com/p/google-glog/issues/list\n\n-- Shinichiro Hamaji\n\nLast modified: 23 January 2009\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/aclocal.m4",
    "content": "# generated automatically by aclocal 1.11.1 -*- Autoconf -*-\n\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\nm4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],,\n[m4_warning([this file was generated for autoconf 2.65.\nYou have another version of autoconf.  It may work, but is not guaranteed to.\nIf you have problems, you may need to regenerate the build system entirely.\nTo do so, use the procedure documented by the package, typically `autoreconf'.])])\n\n# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_AUTOMAKE_VERSION(VERSION)\n# ----------------------------\n# Automake X.Y traces this macro to ensure aclocal.m4 has been\n# generated from the m4 files accompanying Automake X.Y.\n# (This private macro should not be called outside this file.)\nAC_DEFUN([AM_AUTOMAKE_VERSION],\n[am__api_version='1.11'\ndnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to\ndnl require some minimum version.  Point them to the right macro.\nm4_if([$1], [1.11.1], [],\n      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl\n])\n\n# _AM_AUTOCONF_VERSION(VERSION)\n# -----------------------------\n# aclocal traces this macro to find the Autoconf version.\n# This is a private macro too.  Using m4_define simplifies\n# the logic in aclocal, which can simply ignore this definition.\nm4_define([_AM_AUTOCONF_VERSION], [])\n\n# AM_SET_CURRENT_AUTOMAKE_VERSION\n# -------------------------------\n# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.\n# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.\nAC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],\n[AM_AUTOMAKE_VERSION([1.11.1])dnl\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\n_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])\n\n# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-\n\n# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets\n# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to\n# `$srcdir', `$srcdir/..', or `$srcdir/../..'.\n#\n# Of course, Automake must honor this variable whenever it calls a\n# tool from the auxiliary directory.  The problem is that $srcdir (and\n# therefore $ac_aux_dir as well) can be either absolute or relative,\n# depending on how configure is run.  This is pretty annoying, since\n# it makes $ac_aux_dir quite unusable in subdirectories: in the top\n# source directory, any form will work fine, but in subdirectories a\n# relative path needs to be adjusted first.\n#\n# $ac_aux_dir/missing\n#    fails when called from a subdirectory if $ac_aux_dir is relative\n# $top_srcdir/$ac_aux_dir/missing\n#    fails if $ac_aux_dir is absolute,\n#    fails when called from a subdirectory in a VPATH build with\n#          a relative $ac_aux_dir\n#\n# The reason of the latter failure is that $top_srcdir and $ac_aux_dir\n# are both prefixed by $srcdir.  In an in-source build this is usually\n# harmless because $srcdir is `.', but things will broke when you\n# start a VPATH build or use an absolute $srcdir.\n#\n# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,\n# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:\n#   am_aux_dir='\\$(top_srcdir)/'`expr \"$ac_aux_dir\" : \"$srcdir//*\\(.*\\)\"`\n# and then we would define $MISSING as\n#   MISSING=\"\\${SHELL} $am_aux_dir/missing\"\n# This will work as long as MISSING is not called from configure, because\n# unfortunately $(top_srcdir) has no meaning in configure.\n# However there are other variables, like CC, which are often used in\n# configure, and could therefore not use this \"fixed\" $ac_aux_dir.\n#\n# Another solution, used here, is to always expand $ac_aux_dir to an\n# absolute PATH.  The drawback is that using absolute paths prevent a\n# configured tree to be moved without reconfiguration.\n\nAC_DEFUN([AM_AUX_DIR_EXPAND],\n[dnl Rely on autoconf to set up CDPATH properly.\nAC_PREREQ([2.50])dnl\n# expand $ac_aux_dir to an absolute path\nam_aux_dir=`cd $ac_aux_dir && pwd`\n])\n\n# AM_CONDITIONAL                                            -*- Autoconf -*-\n\n# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 9\n\n# AM_CONDITIONAL(NAME, SHELL-CONDITION)\n# -------------------------------------\n# Define a conditional.\nAC_DEFUN([AM_CONDITIONAL],\n[AC_PREREQ(2.52)dnl\n ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],\n\t[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl\nAC_SUBST([$1_TRUE])dnl\nAC_SUBST([$1_FALSE])dnl\n_AM_SUBST_NOTMAKE([$1_TRUE])dnl\n_AM_SUBST_NOTMAKE([$1_FALSE])dnl\nm4_define([_AM_COND_VALUE_$1], [$2])dnl\nif $2; then\n  $1_TRUE=\n  $1_FALSE='#'\nelse\n  $1_TRUE='#'\n  $1_FALSE=\nfi\nAC_CONFIG_COMMANDS_PRE(\n[if test -z \"${$1_TRUE}\" && test -z \"${$1_FALSE}\"; then\n  AC_MSG_ERROR([[conditional \"$1\" was never defined.\nUsually this means the macro was only invoked conditionally.]])\nfi])])\n\n# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 10\n\n# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be\n# written in clear, in which case automake, when reading aclocal.m4,\n# will think it sees a *use*, and therefore will trigger all it's\n# C support machinery.  Also note that it means that autoscan, seeing\n# CC etc. in the Makefile, will ask for an AC_PROG_CC use...\n\n\n# _AM_DEPENDENCIES(NAME)\n# ----------------------\n# See how the compiler implements dependency checking.\n# NAME is \"CC\", \"CXX\", \"GCJ\", or \"OBJC\".\n# We try a few techniques and use that to set a single cache variable.\n#\n# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was\n# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular\n# dependency, and given that the user is not expected to run this macro,\n# just rely on AC_PROG_CC.\nAC_DEFUN([_AM_DEPENDENCIES],\n[AC_REQUIRE([AM_SET_DEPDIR])dnl\nAC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl\nAC_REQUIRE([AM_MAKE_INCLUDE])dnl\nAC_REQUIRE([AM_DEP_TRACK])dnl\n\nifelse([$1], CC,   [depcc=\"$CC\"   am_compiler_list=],\n       [$1], CXX,  [depcc=\"$CXX\"  am_compiler_list=],\n       [$1], OBJC, [depcc=\"$OBJC\" am_compiler_list='gcc3 gcc'],\n       [$1], UPC,  [depcc=\"$UPC\"  am_compiler_list=],\n       [$1], GCJ,  [depcc=\"$GCJ\"  am_compiler_list='gcc3 gcc'],\n                   [depcc=\"$$1\"   am_compiler_list=])\n\nAC_CACHE_CHECK([dependency style of $depcc],\n               [am_cv_$1_dependencies_compiler_type],\n[if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_$1_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n ['s/^#*\\([a-zA-Z0-9]*\\))$/\\1/p'] < ./depcomp`\n  fi\n  am__universal=false\n  m4_case([$1], [CC],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac],\n    [CXX],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac])\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_$1_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_$1_dependencies_compiler_type=none\nfi\n])\nAC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])\nAM_CONDITIONAL([am__fastdep$1], [\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_$1_dependencies_compiler_type\" = gcc3])\n])\n\n\n# AM_SET_DEPDIR\n# -------------\n# Choose a directory name for dependency files.\n# This macro is AC_REQUIREd in _AM_DEPENDENCIES\nAC_DEFUN([AM_SET_DEPDIR],\n[AC_REQUIRE([AM_SET_LEADING_DOT])dnl\nAC_SUBST([DEPDIR], [\"${am__leading_dot}deps\"])dnl\n])\n\n\n# AM_DEP_TRACK\n# ------------\nAC_DEFUN([AM_DEP_TRACK],\n[AC_ARG_ENABLE(dependency-tracking,\n[  --disable-dependency-tracking  speeds up one-time build\n  --enable-dependency-tracking   do not reject slow dependency extractors])\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\nfi\nAM_CONDITIONAL([AMDEP], [test \"x$enable_dependency_tracking\" != xno])\nAC_SUBST([AMDEPBACKSLASH])dnl\n_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl\n])\n\n# Generate code to set up dependency tracking.              -*- Autoconf -*-\n\n# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n#serial 5\n\n# _AM_OUTPUT_DEPENDENCY_COMMANDS\n# ------------------------------\nAC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],\n[{\n  # Autoconf 2.62 quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  case $CONFIG_FILES in\n  *\\'*) eval set x \"$CONFIG_FILES\" ;;\n  *)   set x $CONFIG_FILES ;;\n  esac\n  shift\n  for mf\n  do\n    # Strip MF so we end up with the name of the file.\n    mf=`echo \"$mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile or not.\n    # We used to match only the files named `Makefile.in', but\n    # some people rename them; so instead we look at the file content.\n    # Grep'ing the first line is not enough: some people post-process\n    # each Makefile.in and add a new line on top of each file to say so.\n    # Grep'ing the whole file is not good either: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    if sed -n 's,^#.*generated by automake.*,X,p' \"$mf\" | grep X >/dev/null 2>&1; then\n      dirpart=`AS_DIRNAME(\"$mf\")`\n    else\n      continue\n    fi\n    # Extract the definition of DEPDIR, am__include, and am__quote\n    # from the Makefile without running `make'.\n    DEPDIR=`sed -n 's/^DEPDIR = //p' < \"$mf\"`\n    test -z \"$DEPDIR\" && continue\n    am__include=`sed -n 's/^am__include = //p' < \"$mf\"`\n    test -z \"am__include\" && continue\n    am__quote=`sed -n 's/^am__quote = //p' < \"$mf\"`\n    # When using ansi2knr, U may be empty or an underscore; expand it\n    U=`sed -n 's/^U = //p' < \"$mf\"`\n    # Find all dependency output files, they are included files with\n    # $(DEPDIR) in their names.  We invoke sed twice because it is the\n    # simplest approach to changing $(DEPDIR) to its actual value in the\n    # expansion.\n    for file in `sed -n \"\n      s/^$am__include $am__quote\\(.*(DEPDIR).*\\)$am__quote\"'$/\\1/p' <\"$mf\" | \\\n\t sed -e 's/\\$(DEPDIR)/'\"$DEPDIR\"'/g' -e 's/\\$U/'\"$U\"'/g'`; do\n      # Make sure the directory exists.\n      test -f \"$dirpart/$file\" && continue\n      fdir=`AS_DIRNAME([\"$file\"])`\n      AS_MKDIR_P([$dirpart/$fdir])\n      # echo \"creating $dirpart/$file\"\n      echo '# dummy' > \"$dirpart/$file\"\n    done\n  done\n}\n])# _AM_OUTPUT_DEPENDENCY_COMMANDS\n\n\n# AM_OUTPUT_DEPENDENCY_COMMANDS\n# -----------------------------\n# This macro should only be invoked once -- use via AC_REQUIRE.\n#\n# This code is only required when automatic dependency tracking\n# is enabled.  FIXME.  This creates each `.P' file that we will\n# need in order to bootstrap the dependency handling code.\nAC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],\n[AC_CONFIG_COMMANDS([depfiles],\n     [test x\"$AMDEP_TRUE\" != x\"\" || _AM_OUTPUT_DEPENDENCY_COMMANDS],\n     [AMDEP_TRUE=\"$AMDEP_TRUE\" ac_aux_dir=\"$ac_aux_dir\"])\n])\n\n# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 8\n\n# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.\nAU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])\n\n# Do all the work for Automake.                             -*- Autoconf -*-\n\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 16\n\n# This macro actually does too much.  Some checks are only needed if\n# your package does certain things.  But this isn't really a big deal.\n\n# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])\n# AM_INIT_AUTOMAKE([OPTIONS])\n# -----------------------------------------------\n# The call with PACKAGE and VERSION arguments is the old style\n# call (pre autoconf-2.50), which is being phased out.  PACKAGE\n# and VERSION should now be passed to AC_INIT and removed from\n# the call to AM_INIT_AUTOMAKE.\n# We support both call styles for the transition.  After\n# the next Automake release, Autoconf can make the AC_INIT\n# arguments mandatory, and then we can depend on a new Autoconf\n# release and drop the old call support.\nAC_DEFUN([AM_INIT_AUTOMAKE],\n[AC_PREREQ([2.62])dnl\ndnl Autoconf wants to disallow AM_ names.  We explicitly allow\ndnl the ones we care about.\nm4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl\nAC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl\nAC_REQUIRE([AC_PROG_INSTALL])dnl\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    AC_MSG_ERROR([source directory already configured; run \"make distclean\" there first])\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\nAC_SUBST([CYGPATH_W])\n\n# Define the identity of the package.\ndnl Distinguish between old-style and new-style calls.\nm4_ifval([$2],\n[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl\n AC_SUBST([PACKAGE], [$1])dnl\n AC_SUBST([VERSION], [$2])],\n[_AM_SET_OPTIONS([$1])dnl\ndnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.\nm4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,\n  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl\n AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl\n AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl\n\n_AM_IF_OPTION([no-define],,\n[AC_DEFINE_UNQUOTED(PACKAGE, \"$PACKAGE\", [Name of package])\n AC_DEFINE_UNQUOTED(VERSION, \"$VERSION\", [Version number of package])])dnl\n\n# Some tools Automake needs.\nAC_REQUIRE([AM_SANITY_CHECK])dnl\nAC_REQUIRE([AC_ARG_PROGRAM])dnl\nAM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})\nAM_MISSING_PROG(AUTOCONF, autoconf)\nAM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})\nAM_MISSING_PROG(AUTOHEADER, autoheader)\nAM_MISSING_PROG(MAKEINFO, makeinfo)\nAC_REQUIRE([AM_PROG_INSTALL_SH])dnl\nAC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl\nAC_REQUIRE([AM_PROG_MKDIR_P])dnl\n# We need awk for the \"check\" target.  The system \"awk\" is bad on\n# some platforms.\nAC_REQUIRE([AC_PROG_AWK])dnl\nAC_REQUIRE([AC_PROG_MAKE_SET])dnl\nAC_REQUIRE([AM_SET_LEADING_DOT])dnl\n_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],\n\t      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],\n\t\t\t     [_AM_PROG_TAR([v7])])])\n_AM_IF_OPTION([no-dependencies],,\n[AC_PROVIDE_IFELSE([AC_PROG_CC],\n\t\t  [_AM_DEPENDENCIES(CC)],\n\t\t  [define([AC_PROG_CC],\n\t\t\t  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_CXX],\n\t\t  [_AM_DEPENDENCIES(CXX)],\n\t\t  [define([AC_PROG_CXX],\n\t\t\t  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_OBJC],\n\t\t  [_AM_DEPENDENCIES(OBJC)],\n\t\t  [define([AC_PROG_OBJC],\n\t\t\t  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl\n])\n_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl\ndnl The `parallel-tests' driver may need to know about EXEEXT, so add the\ndnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro\ndnl is hooked onto _AC_COMPILER_EXEEXT early, see below.\nAC_CONFIG_COMMANDS_PRE(dnl\n[m4_provide_if([_AM_COMPILER_EXEEXT],\n  [AM_CONDITIONAL([am__EXEEXT], [test -n \"$EXEEXT\"])])])dnl\n])\n\ndnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not\ndnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further\ndnl mangled by Autoconf and run in a shell conditional statement.\nm4_define([_AC_COMPILER_EXEEXT],\nm4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])\n\n\n# When config.status generates a header, we must update the stamp-h file.\n# This file resides in the same directory as the config header\n# that is generated.  The stamp files are numbered to have different names.\n\n# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the\n# loop where config.status creates the headers, so we can generate\n# our stamp files there.\nAC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],\n[# Compute $1's index in $config_headers.\n_am_arg=$1\n_am_stamp_count=1\nfor _am_header in $config_headers :; do\n  case $_am_header in\n    $_am_arg | $_am_arg:* )\n      break ;;\n    * )\n      _am_stamp_count=`expr $_am_stamp_count + 1` ;;\n  esac\ndone\necho \"timestamp for $_am_arg\" >`AS_DIRNAME([\"$_am_arg\"])`/stamp-h[]$_am_stamp_count])\n\n# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_INSTALL_SH\n# ------------------\n# Define $install_sh.\nAC_DEFUN([AM_PROG_INSTALL_SH],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nif test x\"${install_sh}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\nAC_SUBST(install_sh)])\n\n# Copyright (C) 2003, 2005  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 2\n\n# Check whether the underlying file-system supports filenames\n# with a leading dot.  For instance MS-DOS doesn't.\nAC_DEFUN([AM_SET_LEADING_DOT],\n[rm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\nAC_SUBST([am__leading_dot])])\n\n# Check to see how 'make' treats includes.\t            -*- Autoconf -*-\n\n# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 4\n\n# AM_MAKE_INCLUDE()\n# -----------------\n# Check to see how make treats includes.\nAC_DEFUN([AM_MAKE_INCLUDE],\n[am_make=${MAKE-make}\ncat > confinc << 'END'\nam__doit:\n\t@echo this is the am__doit target\n.PHONY: am__doit\nEND\n# If we don't find an include directive, just comment out the code.\nAC_MSG_CHECKING([for style of include used by $am_make])\nam__include=\"#\"\nam__quote=\n_am_result=none\n# First try GNU make style include.\necho \"include confinc\" > confmf\n# Ignore all kinds of additional output from `make'.\ncase `$am_make -s -f confmf 2> /dev/null` in #(\n*the\\ am__doit\\ target*)\n  am__include=include\n  am__quote=\n  _am_result=GNU\n  ;;\nesac\n# Now try BSD make style include.\nif test \"$am__include\" = \"#\"; then\n   echo '.include \"confinc\"' > confmf\n   case `$am_make -s -f confmf 2> /dev/null` in #(\n   *the\\ am__doit\\ target*)\n     am__include=.include\n     am__quote=\"\\\"\"\n     _am_result=BSD\n     ;;\n   esac\nfi\nAC_SUBST([am__include])\nAC_SUBST([am__quote])\nAC_MSG_RESULT([$_am_result])\nrm -f confinc confmf\n])\n\n# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-\n\n# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 6\n\n# AM_MISSING_PROG(NAME, PROGRAM)\n# ------------------------------\nAC_DEFUN([AM_MISSING_PROG],\n[AC_REQUIRE([AM_MISSING_HAS_RUN])\n$1=${$1-\"${am_missing_run}$2\"}\nAC_SUBST($1)])\n\n\n# AM_MISSING_HAS_RUN\n# ------------------\n# Define MISSING if not defined so far and test if it supports --run.\n# If it does, set am_missing_run to use it, otherwise, to nothing.\nAC_DEFUN([AM_MISSING_HAS_RUN],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nAC_REQUIRE_AUX_FILE([missing])dnl\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --run true\"; then\n  am_missing_run=\"$MISSING --run \"\nelse\n  am_missing_run=\n  AC_MSG_WARN([`missing' script is too old or missing])\nfi\n])\n\n# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_MKDIR_P\n# ---------------\n# Check for `mkdir -p'.\nAC_DEFUN([AM_PROG_MKDIR_P],\n[AC_PREREQ([2.60])dnl\nAC_REQUIRE([AC_PROG_MKDIR_P])dnl\ndnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,\ndnl while keeping a definition of mkdir_p for backward compatibility.\ndnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.\ndnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of\ndnl Makefile.ins that do not define MKDIR_P, so we do our own\ndnl adjustment using top_builddir (which is defined more often than\ndnl MKDIR_P).\nAC_SUBST([mkdir_p], [\"$MKDIR_P\"])dnl\ncase $mkdir_p in\n  [[\\\\/$]]* | ?:[[\\\\/]]*) ;;\n  */*) mkdir_p=\"\\$(top_builddir)/$mkdir_p\" ;;\nesac\n])\n\n# Helper functions for option handling.                     -*- Autoconf -*-\n\n# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 4\n\n# _AM_MANGLE_OPTION(NAME)\n# -----------------------\nAC_DEFUN([_AM_MANGLE_OPTION],\n[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])\n\n# _AM_SET_OPTION(NAME)\n# ------------------------------\n# Set option NAME.  Presently that only means defining a flag for this option.\nAC_DEFUN([_AM_SET_OPTION],\n[m4_define(_AM_MANGLE_OPTION([$1]), 1)])\n\n# _AM_SET_OPTIONS(OPTIONS)\n# ----------------------------------\n# OPTIONS is a space-separated list of Automake options.\nAC_DEFUN([_AM_SET_OPTIONS],\n[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])\n\n# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])\n# -------------------------------------------\n# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.\nAC_DEFUN([_AM_IF_OPTION],\n[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])\n\n# Check to make sure that the build environment is sane.    -*- Autoconf -*-\n\n# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 5\n\n# AM_SANITY_CHECK\n# ---------------\nAC_DEFUN([AM_SANITY_CHECK],\n[AC_MSG_CHECKING([whether build environment is sane])\n# Just in case\nsleep 1\necho timestamp > conftest.file\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]]*)\n    AC_MSG_ERROR([unsafe absolute working directory name]);;\nesac\ncase $srcdir in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]]*)\n    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;\nesac\n\n# Do `set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n   if test \"$[*]\" = \"X\"; then\n      # -L didn't work.\n      set X `ls -t \"$srcdir/configure\" conftest.file`\n   fi\n   rm -f conftest.file\n   if test \"$[*]\" != \"X $srcdir/configure conftest.file\" \\\n      && test \"$[*]\" != \"X conftest.file $srcdir/configure\"; then\n\n      # If neither matched, then we have a broken ls.  This can happen\n      # if, for instance, CONFIG_SHELL is bash and it inherits a\n      # broken ls alias from the environment.  This has actually\n      # happened.  Such a system could not be considered \"sane\".\n      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken\nalias in your environment])\n   fi\n\n   test \"$[2]\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   AC_MSG_ERROR([newly created file is older than distributed files!\nCheck your system clock])\nfi\nAC_MSG_RESULT(yes)])\n\n# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_INSTALL_STRIP\n# ---------------------\n# One issue with vendor `install' (even GNU) is that you can't\n# specify the program used to strip binaries.  This is especially\n# annoying in cross-compiling environments, where the build's strip\n# is unlikely to handle the host's binaries.\n# Fortunately install-sh will honor a STRIPPROG variable, so we\n# always use install-sh in `make install-strip', and initialize\n# STRIPPROG with the value of the STRIP variable (set by the user).\nAC_DEFUN([AM_PROG_INSTALL_STRIP],\n[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl\n# Installed binaries are usually stripped using `strip' when the user\n# run `make install-strip'.  However `strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the `STRIP' environment variable to overrule this program.\ndnl Don't test for $cross_compiling = yes, because it might be `maybe'.\nif test \"$cross_compiling\" != no; then\n  AC_CHECK_TOOL([STRIP], [strip], :)\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\nAC_SUBST([INSTALL_STRIP_PROGRAM])])\n\n# Copyright (C) 2006, 2008  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 2\n\n# _AM_SUBST_NOTMAKE(VARIABLE)\n# ---------------------------\n# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.\n# This macro is traced by Automake.\nAC_DEFUN([_AM_SUBST_NOTMAKE])\n\n# AM_SUBST_NOTMAKE(VARIABLE)\n# ---------------------------\n# Public sister of _AM_SUBST_NOTMAKE.\nAC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])\n\n# Check how to create a tarball.                            -*- Autoconf -*-\n\n# Copyright (C) 2004, 2005  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 2\n\n# _AM_PROG_TAR(FORMAT)\n# --------------------\n# Check how to create a tarball in format FORMAT.\n# FORMAT should be one of `v7', `ustar', or `pax'.\n#\n# Substitute a variable $(am__tar) that is a command\n# writing to stdout a FORMAT-tarball containing the directory\n# $tardir.\n#     tardir=directory && $(am__tar) > result.tar\n#\n# Substitute a variable $(am__untar) that extract such\n# a tarball read from stdin.\n#     $(am__untar) < result.tar\nAC_DEFUN([_AM_PROG_TAR],\n[# Always define AMTAR for backward compatibility.\nAM_MISSING_PROG([AMTAR], [tar])\nm4_if([$1], [v7],\n     [am__tar='${AMTAR} chof - \"$$tardir\"'; am__untar='${AMTAR} xf -'],\n     [m4_case([$1], [ustar],, [pax],,\n              [m4_fatal([Unknown tar format])])\nAC_MSG_CHECKING([how to create a $1 tar archive])\n# Loop over all known methods to create a tar archive until one works.\n_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'\n_am_tools=${am_cv_prog_tar_$1-$_am_tools}\n# Do not fold the above two line into one, because Tru64 sh and\n# Solaris sh will not grok spaces in the rhs of `-'.\nfor _am_tool in $_am_tools\ndo\n  case $_am_tool in\n  gnutar)\n    for _am_tar in tar gnutar gtar;\n    do\n      AM_RUN_LOG([$_am_tar --version]) && break\n    done\n    am__tar=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$$tardir\"'\n    am__tar_=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$tardir\"'\n    am__untar=\"$_am_tar -xf -\"\n    ;;\n  plaintar)\n    # Must skip GNU tar: if it does not support --format= it doesn't create\n    # ustar tarball either.\n    (tar --version) >/dev/null 2>&1 && continue\n    am__tar='tar chf - \"$$tardir\"'\n    am__tar_='tar chf - \"$tardir\"'\n    am__untar='tar xf -'\n    ;;\n  pax)\n    am__tar='pax -L -x $1 -w \"$$tardir\"'\n    am__tar_='pax -L -x $1 -w \"$tardir\"'\n    am__untar='pax -r'\n    ;;\n  cpio)\n    am__tar='find \"$$tardir\" -print | cpio -o -H $1 -L'\n    am__tar_='find \"$tardir\" -print | cpio -o -H $1 -L'\n    am__untar='cpio -i -H $1 -d'\n    ;;\n  none)\n    am__tar=false\n    am__tar_=false\n    am__untar=false\n    ;;\n  esac\n\n  # If the value was cached, stop now.  We just wanted to have am__tar\n  # and am__untar set.\n  test -n \"${am_cv_prog_tar_$1}\" && break\n\n  # tar/untar a dummy directory, and stop if the command works\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  echo GrepMe > conftest.dir/file\n  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])\n  rm -rf conftest.dir\n  if test -s conftest.tar; then\n    AM_RUN_LOG([$am__untar <conftest.tar])\n    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break\n  fi\ndone\nrm -rf conftest.dir\n\nAC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])\nAC_MSG_RESULT([$am_cv_prog_tar_$1])])\nAC_SUBST([am__tar])\nAC_SUBST([am__untar])\n]) # _AM_PROG_TAR\n\nm4_include([m4/ac_have_attribute.m4])\nm4_include([m4/ac_have_builtin_expect.m4])\nm4_include([m4/ac_have_sync_val_compare_and_swap.m4])\nm4_include([m4/ac_rwlock.m4])\nm4_include([m4/acx_pthread.m4])\nm4_include([m4/google_namespace.m4])\nm4_include([m4/libtool.m4])\nm4_include([m4/ltoptions.m4])\nm4_include([m4/ltsugar.m4])\nm4_include([m4/ltversion.m4])\nm4_include([m4/lt~obsolete.m4])\nm4_include([m4/namespaces.m4])\nm4_include([m4/pc_from_ucontext.m4])\nm4_include([m4/stl_namespace.m4])\nm4_include([m4/using_operator.m4])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/compile",
    "content": "#! /bin/sh\n\n# Wrapper for compilers which do not understand `-c -o'.\n\n# Copyright 1999, 2000 Free Software Foundation, Inc.\n# Written by Tom Tromey <tromey@cygnus.com>.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Usage:\n# compile PROGRAM [ARGS]...\n# `-o FOO.o' is removed from the args passed to the actual compile.\n\nprog=$1\nshift\n\nofile=\ncfile=\nargs=\nwhile test $# -gt 0; do\n   case \"$1\" in\n    -o)\n       # configure might choose to run compile as `compile cc -o foo foo.c'.\n       # So we do something ugly here.\n       ofile=$2\n       shift\n       case \"$ofile\" in\n\t*.o | *.obj)\n\t   ;;\n\t*)\n\t   args=\"$args -o $ofile\"\n\t   ofile=\n\t   ;;\n       esac\n       ;;\n    *.c)\n       cfile=$1\n       args=\"$args $1\"\n       ;;\n    *)\n       args=\"$args $1\"\n       ;;\n   esac\n   shift\ndone\n\nif test -z \"$ofile\" || test -z \"$cfile\"; then\n   # If no `-o' option was seen then we might have been invoked from a\n   # pattern rule where we don't need one.  That is ok -- this is a\n   # normal compilation that the losing compiler can handle.  If no\n   # `.c' file was seen then we are probably linking.  That is also\n   # ok.\n   exec \"$prog\" $args\nfi\n\n# Name of file we expect compiler to create.\ncofile=`echo $cfile | sed -e 's|^.*/||' -e 's/\\.c$/.o/'`\n\n# Create the lock directory.\n# Note: use `[/.-]' here to ensure that we don't use the same name\n# that we are using for the .o file.  Also, base the name on the expected\n# object file name, since that is what matters with a parallel build.\nlockdir=`echo $cofile | sed -e 's|[/.-]|_|g'`.d\nwhile true; do\n   if mkdir $lockdir > /dev/null 2>&1; then\n      break\n   fi\n   sleep 1\ndone\n# FIXME: race condition here if user kills between mkdir and trap.\ntrap \"rmdir $lockdir; exit 1\" 1 2 15\n\n# Run the compile.\n\"$prog\" $args\nstatus=$?\n\nif test -f \"$cofile\"; then\n   mv \"$cofile\" \"$ofile\"\nfi\n\nrmdir $lockdir\nexit $status\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/config.guess",
    "content": "#! /bin/sh\n# Attempt to guess a canonical system name.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,\n#   Inc.\n\ntimestamp='2007-07-22'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA\n# 02110-1301, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n\n# Originally written by Per Bothner <per@bothner.com>.\n# Please send patches to <config-patches@gnu.org>.  Submit a context\n# diff and a properly formatted ChangeLog entry.\n#\n# This script attempts to guess a canonical system name similar to\n# config.sub.  If it succeeds, it prints the system name on stdout, and\n# exits with 0.  Otherwise, it exits with 1.\n#\n# The plan is that this can be called by configure scripts if you\n# don't specify an explicit build system type.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION]\n\nOutput the configuration name of the system \\`$me' is run on.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.guess ($timestamp)\n\nOriginally written by Per Bothner.\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005\nFree Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\" >&2\n       exit 1 ;;\n    * )\n       break ;;\n  esac\ndone\n\nif test $# != 0; then\n  echo \"$me: too many arguments$help\" >&2\n  exit 1\nfi\n\ntrap 'exit 1' 1 2 15\n\n# CC_FOR_BUILD -- compiler used by this script. Note that the use of a\n# compiler to aid in system detection is discouraged as it requires\n# temporary files to be created and, as you can see below, it is a\n# headache to deal with in a portable fashion.\n\n# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still\n# use `HOST_CC' if defined, but it is deprecated.\n\n# Portable tmp directory creation inspired by the Autoconf team.\n\nset_cc_for_build='\ntrap \"exitcode=\\$?; (rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null) && exit \\$exitcode\" 0 ;\ntrap \"rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null; exit 1\" 1 2 13 15 ;\n: ${TMPDIR=/tmp} ;\n { tmp=`(umask 077 && mktemp -d \"$TMPDIR/cgXXXXXX\") 2>/dev/null` && test -n \"$tmp\" && test -d \"$tmp\" ; } ||\n { test -n \"$RANDOM\" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||\n { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo \"Warning: creating insecure temp directory\" >&2 ; } ||\n { echo \"$me: cannot create a temporary directory in $TMPDIR\" >&2 ; exit 1 ; } ;\ndummy=$tmp/dummy ;\ntmpfiles=\"$dummy.c $dummy.o $dummy.rel $dummy\" ;\ncase $CC_FOR_BUILD,$HOST_CC,$CC in\n ,,)    echo \"int x;\" > $dummy.c ;\n\tfor c in cc gcc c89 c99 ; do\n\t  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then\n\t     CC_FOR_BUILD=\"$c\"; break ;\n\t  fi ;\n\tdone ;\n\tif test x\"$CC_FOR_BUILD\" = x ; then\n\t  CC_FOR_BUILD=no_compiler_found ;\n\tfi\n\t;;\n ,,*)   CC_FOR_BUILD=$CC ;;\n ,*,*)  CC_FOR_BUILD=$HOST_CC ;;\nesac ; set_cc_for_build= ;'\n\n# This is needed to find uname on a Pyramid OSx when run in the BSD universe.\n# (ghazi@noc.rutgers.edu 1994-08-24)\nif (test -f /.attbin/uname) >/dev/null 2>&1 ; then\n\tPATH=$PATH:/.attbin ; export PATH\nfi\n\nUNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown\nUNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown\nUNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown\nUNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown\n\n# Note: order is significant - the case branches are not exclusive.\n\ncase \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" in\n    *:NetBSD:*:*)\n\t# NetBSD (nbsd) targets should (where applicable) match one or\n\t# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,\n\t# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently\n\t# switched to ELF, *-*-netbsd* would select the old\n\t# object file format.  This provides both forward\n\t# compatibility and a consistent mechanism for selecting the\n\t# object file format.\n\t#\n\t# Note: NetBSD doesn't particularly care about the vendor\n\t# portion of the name.  We always set it to \"unknown\".\n\tsysctl=\"sysctl -n hw.machine_arch\"\n\tUNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \\\n\t    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    armeb) machine=armeb-unknown ;;\n\t    arm*) machine=arm-unknown ;;\n\t    sh3el) machine=shl-unknown ;;\n\t    sh3eb) machine=sh-unknown ;;\n\t    sh5el) machine=sh5le-unknown ;;\n\t    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;\n\tesac\n\t# The Operating System including object format, if it has switched\n\t# to ELF recently, or will in the future.\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    arm*|i386|m68k|ns32k|sh3*|sparc|vax)\n\t\teval $set_cc_for_build\n\t\tif echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t\t| grep __ELF__ >/dev/null\n\t\tthen\n\t\t    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).\n\t\t    # Return netbsd for either.  FIX?\n\t\t    os=netbsd\n\t\telse\n\t\t    os=netbsdelf\n\t\tfi\n\t\t;;\n\t    *)\n\t        os=netbsd\n\t\t;;\n\tesac\n\t# The OS release\n\t# Debian GNU/NetBSD machines have a different userland, and\n\t# thus, need a distinct triplet. However, they do not need\n\t# kernel version information, so it can be replaced with a\n\t# suitable tag, in the style of linux-gnu.\n\tcase \"${UNAME_VERSION}\" in\n\t    Debian*)\n\t\trelease='-gnu'\n\t\t;;\n\t    *)\n\t\trelease=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\\./'`\n\t\t;;\n\tesac\n\t# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:\n\t# contains redundant information, the shorter form:\n\t# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.\n\techo \"${machine}-${os}${release}\"\n\texit ;;\n    *:OpenBSD:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`\n\techo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}\n\texit ;;\n    *:ekkoBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}\n\texit ;;\n    *:SolidBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}\n\texit ;;\n    macppc:MirBSD:*:*)\n\techo powerpc-unknown-mirbsd${UNAME_RELEASE}\n\texit ;;\n    *:MirBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}\n\texit ;;\n    alpha:OSF1:*:*)\n\tcase $UNAME_RELEASE in\n\t*4.0)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`\n\t\t;;\n\t*5.*)\n\t        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`\n\t\t;;\n\tesac\n\t# According to Compaq, /usr/sbin/psrinfo has been available on\n\t# OSF/1 and Tru64 systems produced since 1995.  I hope that\n\t# covers most systems running today.  This code pipes the CPU\n\t# types through head -n 1, so we only detect the type of CPU 0.\n\tALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \\(.*\\) processor.*$/\\1/p' | head -n 1`\n\tcase \"$ALPHA_CPU_TYPE\" in\n\t    \"EV4 (21064)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"EV4.5 (21064)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"LCA4 (21066/21068)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"EV5 (21164)\")\n\t\tUNAME_MACHINE=\"alphaev5\" ;;\n\t    \"EV5.6 (21164A)\")\n\t\tUNAME_MACHINE=\"alphaev56\" ;;\n\t    \"EV5.6 (21164PC)\")\n\t\tUNAME_MACHINE=\"alphapca56\" ;;\n\t    \"EV5.7 (21164PC)\")\n\t\tUNAME_MACHINE=\"alphapca57\" ;;\n\t    \"EV6 (21264)\")\n\t\tUNAME_MACHINE=\"alphaev6\" ;;\n\t    \"EV6.7 (21264A)\")\n\t\tUNAME_MACHINE=\"alphaev67\" ;;\n\t    \"EV6.8CB (21264C)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.8AL (21264B)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.8CX (21264D)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.9A (21264/EV69A)\")\n\t\tUNAME_MACHINE=\"alphaev69\" ;;\n\t    \"EV7 (21364)\")\n\t\tUNAME_MACHINE=\"alphaev7\" ;;\n\t    \"EV7.9 (21364A)\")\n\t\tUNAME_MACHINE=\"alphaev79\" ;;\n\tesac\n\t# A Pn.n version is a patched version.\n\t# A Vn.n version is a released version.\n\t# A Tn.n version is a released field test version.\n\t# A Xn.n version is an unreleased experimental baselevel.\n\t# 1.2 uses \"1.2\" for uname -r.\n\techo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n\texit ;;\n    Alpha\\ *:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# Should we change UNAME_MACHINE based on the output of uname instead\n\t# of the specific Alpha model?\n\techo alpha-pc-interix\n\texit ;;\n    21064:Windows_NT:50:3)\n\techo alpha-dec-winnt3.5\n\texit ;;\n    Amiga*:UNIX_System_V:4.0:*)\n\techo m68k-unknown-sysv4\n\texit ;;\n    *:[Aa]miga[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-amigaos\n\texit ;;\n    *:[Mm]orph[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-morphos\n\texit ;;\n    *:OS/390:*:*)\n\techo i370-ibm-openedition\n\texit ;;\n    *:z/VM:*:*)\n\techo s390-ibm-zvmoe\n\texit ;;\n    *:OS400:*:*)\n        echo powerpc-ibm-os400\n\texit ;;\n    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)\n\techo arm-acorn-riscix${UNAME_RELEASE}\n\texit ;;\n    arm:riscos:*:*|arm:RISCOS:*:*)\n\techo arm-unknown-riscos\n\texit ;;\n    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)\n\techo hppa1.1-hitachi-hiuxmpp\n\texit ;;\n    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)\n\t# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.\n\tif test \"`(/bin/universe) 2>/dev/null`\" = att ; then\n\t\techo pyramid-pyramid-sysv3\n\telse\n\t\techo pyramid-pyramid-bsd\n\tfi\n\texit ;;\n    NILE*:*:*:dcosx)\n\techo pyramid-pyramid-svr4\n\texit ;;\n    DRS?6000:unix:4.0:6*)\n\techo sparc-icl-nx6\n\texit ;;\n    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)\n\tcase `/usr/bin/uname -p` in\n\t    sparc) echo sparc-icl-nx7; exit ;;\n\tesac ;;\n    sun4H:SunOS:5.*:*)\n\techo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)\n\techo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)\n\techo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:6*:*)\n\t# According to config.sub, this is the proper way to canonicalize\n\t# SunOS6.  Hard to guess exactly what SunOS6 will be like, but\n\t# it's likely to be more like Solaris than SunOS4.\n\techo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:*:*)\n\tcase \"`/usr/bin/arch -k`\" in\n\t    Series*|S4*)\n\t\tUNAME_RELEASE=`uname -v`\n\t\t;;\n\tesac\n\t# Japanese Language versions have a version number like `4.1.3-JL'.\n\techo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`\n\texit ;;\n    sun3*:SunOS:*:*)\n\techo m68k-sun-sunos${UNAME_RELEASE}\n\texit ;;\n    sun*:*:4.2BSD:*)\n\tUNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`\n\ttest \"x${UNAME_RELEASE}\" = \"x\" && UNAME_RELEASE=3\n\tcase \"`/bin/arch`\" in\n\t    sun3)\n\t\techo m68k-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\t    sun4)\n\t\techo sparc-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\tesac\n\texit ;;\n    aushp:SunOS:*:*)\n\techo sparc-auspex-sunos${UNAME_RELEASE}\n\texit ;;\n    # The situation for MiNT is a little confusing.  The machine name\n    # can be virtually everything (everything which is not\n    # \"atarist\" or \"atariste\" at least should have a processor\n    # > m68000).  The system name ranges from \"MiNT\" over \"FreeMiNT\"\n    # to the lowercase version \"mint\" (or \"freemint\").  Finally\n    # the system name \"TOS\" denotes a system which is actually not\n    # MiNT.  But MiNT is downward compatible to TOS, so this should\n    # be no problem.\n    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)\n        echo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n        exit ;;\n    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)\n        echo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)\n        echo m68k-milan-mint${UNAME_RELEASE}\n        exit ;;\n    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)\n        echo m68k-hades-mint${UNAME_RELEASE}\n        exit ;;\n    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)\n        echo m68k-unknown-mint${UNAME_RELEASE}\n        exit ;;\n    m68k:machten:*:*)\n\techo m68k-apple-machten${UNAME_RELEASE}\n\texit ;;\n    powerpc:machten:*:*)\n\techo powerpc-apple-machten${UNAME_RELEASE}\n\texit ;;\n    RISC*:Mach:*:*)\n\techo mips-dec-mach_bsd4.3\n\texit ;;\n    RISC*:ULTRIX:*:*)\n\techo mips-dec-ultrix${UNAME_RELEASE}\n\texit ;;\n    VAX*:ULTRIX*:*:*)\n\techo vax-dec-ultrix${UNAME_RELEASE}\n\texit ;;\n    2020:CLIX:*:* | 2430:CLIX:*:*)\n\techo clipper-intergraph-clix${UNAME_RELEASE}\n\texit ;;\n    mips:*:*:UMIPS | mips:*:*:RISCos)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n#ifdef __cplusplus\n#include <stdio.h>  /* for printf() prototype */\n\tint main (int argc, char *argv[]) {\n#else\n\tint main (argc, argv) int argc; char *argv[]; {\n#endif\n\t#if defined (host_mips) && defined (MIPSEB)\n\t#if defined (SYSTYPE_SYSV)\n\t  printf (\"mips-mips-riscos%ssysv\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_SVR4)\n\t  printf (\"mips-mips-riscos%ssvr4\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)\n\t  printf (\"mips-mips-riscos%sbsd\\n\", argv[1]); exit (0);\n\t#endif\n\t#endif\n\t  exit (-1);\n\t}\nEOF\n\t$CC_FOR_BUILD -o $dummy $dummy.c &&\n\t  dummyarg=`echo \"${UNAME_RELEASE}\" | sed -n 's/\\([0-9]*\\).*/\\1/p'` &&\n\t  SYSTEM_NAME=`$dummy $dummyarg` &&\n\t    { echo \"$SYSTEM_NAME\"; exit; }\n\techo mips-mips-riscos${UNAME_RELEASE}\n\texit ;;\n    Motorola:PowerMAX_OS:*:*)\n\techo powerpc-motorola-powermax\n\texit ;;\n    Motorola:*:4.3:PL8-*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:Power_UNIX:*:*)\n\techo powerpc-harris-powerunix\n\texit ;;\n    m88k:CX/UX:7*:*)\n\techo m88k-harris-cxux7\n\texit ;;\n    m88k:*:4*:R4*)\n\techo m88k-motorola-sysv4\n\texit ;;\n    m88k:*:3*:R3*)\n\techo m88k-motorola-sysv3\n\texit ;;\n    AViiON:dgux:*:*)\n        # DG/UX returns AViiON for all architectures\n        UNAME_PROCESSOR=`/usr/bin/uname -p`\n\tif [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]\n\tthen\n\t    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \\\n\t       [ ${TARGET_BINARY_INTERFACE}x = x ]\n\t    then\n\t\techo m88k-dg-dgux${UNAME_RELEASE}\n\t    else\n\t\techo m88k-dg-dguxbcs${UNAME_RELEASE}\n\t    fi\n\telse\n\t    echo i586-dg-dgux${UNAME_RELEASE}\n\tfi\n \texit ;;\n    M88*:DolphinOS:*:*)\t# DolphinOS (SVR3)\n\techo m88k-dolphin-sysv3\n\texit ;;\n    M88*:*:R3*:*)\n\t# Delta 88k system running SVR3\n\techo m88k-motorola-sysv3\n\texit ;;\n    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)\n\techo m88k-tektronix-sysv3\n\texit ;;\n    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)\n\techo m68k-tektronix-bsd\n\texit ;;\n    *:IRIX*:*:*)\n\techo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`\n\texit ;;\n    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.\n\techo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id\n\texit ;;               # Note that: echo \"'`uname -s`'\" gives 'AIX '\n    i*86:AIX:*:*)\n\techo i386-ibm-aix\n\texit ;;\n    ia64:AIX:*:*)\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${UNAME_MACHINE}-ibm-aix${IBM_REV}\n\texit ;;\n    *:AIX:2:3)\n\tif grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\teval $set_cc_for_build\n\t\tsed 's/^\t\t//' << EOF >$dummy.c\n\t\t#include <sys/systemcfg.h>\n\n\t\tmain()\n\t\t\t{\n\t\t\tif (!__power_pc())\n\t\t\t\texit(1);\n\t\t\tputs(\"powerpc-ibm-aix3.2.5\");\n\t\t\texit(0);\n\t\t\t}\nEOF\n\t\tif $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`\n\t\tthen\n\t\t\techo \"$SYSTEM_NAME\"\n\t\telse\n\t\t\techo rs6000-ibm-aix3.2.5\n\t\tfi\n\telif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\techo rs6000-ibm-aix3.2.4\n\telse\n\t\techo rs6000-ibm-aix3.2\n\tfi\n\texit ;;\n    *:AIX:*:[45])\n\tIBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`\n\tif /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then\n\t\tIBM_ARCH=rs6000\n\telse\n\t\tIBM_ARCH=powerpc\n\tfi\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${IBM_ARCH}-ibm-aix${IBM_REV}\n\texit ;;\n    *:AIX:*:*)\n\techo rs6000-ibm-aix\n\texit ;;\n    ibmrt:4.4BSD:*|romp-ibm:BSD:*)\n\techo romp-ibm-bsd4.4\n\texit ;;\n    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and\n\techo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to\n\texit ;;                             # report: romp-ibm BSD 4.3\n    *:BOSX:*:*)\n\techo rs6000-bull-bosx\n\texit ;;\n    DPX/2?00:B.O.S.:*:*)\n\techo m68k-bull-sysv3\n\texit ;;\n    9000/[34]??:4.3bsd:1.*:*)\n\techo m68k-hp-bsd\n\texit ;;\n    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)\n\techo m68k-hp-bsd4.4\n\texit ;;\n    9000/[34678]??:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\tcase \"${UNAME_MACHINE}\" in\n\t    9000/31? )            HP_ARCH=m68000 ;;\n\t    9000/[34]?? )         HP_ARCH=m68k ;;\n\t    9000/[678][0-9][0-9])\n\t\tif [ -x /usr/bin/getconf ]; then\n\t\t    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`\n                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`\n                    case \"${sc_cpu_version}\" in\n                      523) HP_ARCH=\"hppa1.0\" ;; # CPU_PA_RISC1_0\n                      528) HP_ARCH=\"hppa1.1\" ;; # CPU_PA_RISC1_1\n                      532)                      # CPU_PA_RISC2_0\n                        case \"${sc_kernel_bits}\" in\n                          32) HP_ARCH=\"hppa2.0n\" ;;\n                          64) HP_ARCH=\"hppa2.0w\" ;;\n\t\t\t  '') HP_ARCH=\"hppa2.0\" ;;   # HP-UX 10.20\n                        esac ;;\n                    esac\n\t\tfi\n\t\tif [ \"${HP_ARCH}\" = \"\" ]; then\n\t\t    eval $set_cc_for_build\n\t\t    sed 's/^              //' << EOF >$dummy.c\n\n              #define _HPUX_SOURCE\n              #include <stdlib.h>\n              #include <unistd.h>\n\n              int main ()\n              {\n              #if defined(_SC_KERNEL_BITS)\n                  long bits = sysconf(_SC_KERNEL_BITS);\n              #endif\n                  long cpu  = sysconf (_SC_CPU_VERSION);\n\n                  switch (cpu)\n              \t{\n              \tcase CPU_PA_RISC1_0: puts (\"hppa1.0\"); break;\n              \tcase CPU_PA_RISC1_1: puts (\"hppa1.1\"); break;\n              \tcase CPU_PA_RISC2_0:\n              #if defined(_SC_KERNEL_BITS)\n              \t    switch (bits)\n              \t\t{\n              \t\tcase 64: puts (\"hppa2.0w\"); break;\n              \t\tcase 32: puts (\"hppa2.0n\"); break;\n              \t\tdefault: puts (\"hppa2.0\"); break;\n              \t\t} break;\n              #else  /* !defined(_SC_KERNEL_BITS) */\n              \t    puts (\"hppa2.0\"); break;\n              #endif\n              \tdefault: puts (\"hppa1.0\"); break;\n              \t}\n                  exit (0);\n              }\nEOF\n\t\t    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`\n\t\t    test -z \"$HP_ARCH\" && HP_ARCH=hppa\n\t\tfi ;;\n\tesac\n\tif [ ${HP_ARCH} = \"hppa2.0w\" ]\n\tthen\n\t    eval $set_cc_for_build\n\n\t    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating\n\t    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler\n\t    # generating 64-bit code.  GNU and HP use different nomenclature:\n\t    #\n\t    # $ CC_FOR_BUILD=cc ./config.guess\n\t    # => hppa2.0w-hp-hpux11.23\n\t    # $ CC_FOR_BUILD=\"cc +DA2.0w\" ./config.guess\n\t    # => hppa64-hp-hpux11.23\n\n\t    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |\n\t\tgrep __LP64__ >/dev/null\n\t    then\n\t\tHP_ARCH=\"hppa2.0w\"\n\t    else\n\t\tHP_ARCH=\"hppa64\"\n\t    fi\n\tfi\n\techo ${HP_ARCH}-hp-hpux${HPUX_REV}\n\texit ;;\n    ia64:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\techo ia64-hp-hpux${HPUX_REV}\n\texit ;;\n    3050*:HI-UX:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#include <unistd.h>\n\tint\n\tmain ()\n\t{\n\t  long cpu = sysconf (_SC_CPU_VERSION);\n\t  /* The order matters, because CPU_IS_HP_MC68K erroneously returns\n\t     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct\n\t     results, however.  */\n\t  if (CPU_IS_PA_RISC (cpu))\n\t    {\n\t      switch (cpu)\n\t\t{\n\t\t  case CPU_PA_RISC1_0: puts (\"hppa1.0-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC1_1: puts (\"hppa1.1-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC2_0: puts (\"hppa2.0-hitachi-hiuxwe2\"); break;\n\t\t  default: puts (\"hppa-hitachi-hiuxwe2\"); break;\n\t\t}\n\t    }\n\t  else if (CPU_IS_HP_MC68K (cpu))\n\t    puts (\"m68k-hitachi-hiuxwe2\");\n\t  else puts (\"unknown-hitachi-hiuxwe2\");\n\t  exit (0);\n\t}\nEOF\n\t$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&\n\t\t{ echo \"$SYSTEM_NAME\"; exit; }\n\techo unknown-hitachi-hiuxwe2\n\texit ;;\n    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )\n\techo hppa1.1-hp-bsd\n\texit ;;\n    9000/8??:4.3bsd:*:*)\n\techo hppa1.0-hp-bsd\n\texit ;;\n    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)\n\techo hppa1.0-hp-mpeix\n\texit ;;\n    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )\n\techo hppa1.1-hp-osf\n\texit ;;\n    hp8??:OSF1:*:*)\n\techo hppa1.0-hp-osf\n\texit ;;\n    i*86:OSF1:*:*)\n\tif [ -x /usr/sbin/sysversion ] ; then\n\t    echo ${UNAME_MACHINE}-unknown-osf1mk\n\telse\n\t    echo ${UNAME_MACHINE}-unknown-osf1\n\tfi\n\texit ;;\n    parisc*:Lites*:*:*)\n\techo hppa1.1-hp-lites\n\texit ;;\n    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)\n\techo c1-convex-bsd\n        exit ;;\n    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n        exit ;;\n    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)\n\techo c34-convex-bsd\n        exit ;;\n    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)\n\techo c38-convex-bsd\n        exit ;;\n    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)\n\techo c4-convex-bsd\n        exit ;;\n    CRAY*Y-MP:*:*:*)\n\techo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*[A-Z]90:*:*:*)\n\techo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \\\n\t| sed -e 's/CRAY.*\\([A-Z]90\\)/\\1/' \\\n\t      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \\\n\t      -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*TS:*:*:*)\n\techo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*T3E:*:*:*)\n\techo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*SV1:*:*:*)\n\techo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    *:UNICOS/mp:*:*)\n\techo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)\n\tFUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`\n        echo \"${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n        exit ;;\n    5000:UNIX_System_V:4.*:*)\n        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`\n        echo \"sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n\texit ;;\n    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\\ Embedded/OS:*:*)\n\techo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}\n\texit ;;\n    sparc*:BSD/OS:*:*)\n\techo sparc-unknown-bsdi${UNAME_RELEASE}\n\texit ;;\n    *:BSD/OS:*:*)\n\techo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}\n\texit ;;\n    *:FreeBSD:*:*)\n\tcase ${UNAME_MACHINE} in\n\t    pc98)\n\t\techo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\t    amd64)\n\t\techo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\t    *)\n\t\techo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\tesac\n\texit ;;\n    i*:CYGWIN*:*)\n\techo ${UNAME_MACHINE}-pc-cygwin\n\texit ;;\n    *:MINGW*:*)\n\techo ${UNAME_MACHINE}-pc-mingw32\n\texit ;;\n    i*:windows32*:*)\n    \t# uname -m includes \"-pc\" on this system.\n    \techo ${UNAME_MACHINE}-mingw32\n\texit ;;\n    i*:PW*:*)\n\techo ${UNAME_MACHINE}-pc-pw32\n\texit ;;\n    *:Interix*:[3456]*)\n    \tcase ${UNAME_MACHINE} in\n\t    x86)\n\t\techo i586-pc-interix${UNAME_RELEASE}\n\t\texit ;;\n\t    EM64T | authenticamd)\n\t\techo x86_64-unknown-interix${UNAME_RELEASE}\n\t\texit ;;\n\tesac ;;\n    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)\n\techo i${UNAME_MACHINE}-pc-mks\n\texit ;;\n    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we\n\t# UNAME_MACHINE based on the output of uname instead of i386?\n\techo i586-pc-interix\n\texit ;;\n    i*:UWIN*:*)\n\techo ${UNAME_MACHINE}-pc-uwin\n\texit ;;\n    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)\n\techo x86_64-unknown-cygwin\n\texit ;;\n    p*:CYGWIN*:*)\n\techo powerpcle-unknown-cygwin\n\texit ;;\n    prep*:SunOS:5.*:*)\n\techo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    *:GNU:*:*)\n\t# the GNU system\n\techo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`\n\texit ;;\n    *:GNU/*:*:*)\n\t# other systems with GNU libc and userland\n\techo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu\n\texit ;;\n    i*86:Minix:*:*)\n\techo ${UNAME_MACHINE}-pc-minix\n\texit ;;\n    arm*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    avr32*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    cris:Linux:*:*)\n\techo cris-axis-linux-gnu\n\texit ;;\n    crisv32:Linux:*:*)\n\techo crisv32-axis-linux-gnu\n\texit ;;\n    frv:Linux:*:*)\n    \techo frv-unknown-linux-gnu\n\texit ;;\n    ia64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    m32r*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    m68*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    mips:Linux:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#undef CPU\n\t#undef mips\n\t#undef mipsel\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\n\tCPU=mipsel\n\t#else\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\n\tCPU=mips\n\t#else\n\tCPU=\n\t#endif\n\t#endif\nEOF\n\teval \"`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '\n\t    /^CPU/{\n\t\ts: ::g\n\t\tp\n\t    }'`\"\n\ttest x\"${CPU}\" != x && { echo \"${CPU}-unknown-linux-gnu\"; exit; }\n\t;;\n    mips64:Linux:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#undef CPU\n\t#undef mips64\n\t#undef mips64el\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\n\tCPU=mips64el\n\t#else\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\n\tCPU=mips64\n\t#else\n\tCPU=\n\t#endif\n\t#endif\nEOF\n\teval \"`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '\n\t    /^CPU/{\n\t\ts: ::g\n\t\tp\n\t    }'`\"\n\ttest x\"${CPU}\" != x && { echo \"${CPU}-unknown-linux-gnu\"; exit; }\n\t;;\n    or32:Linux:*:*)\n\techo or32-unknown-linux-gnu\n\texit ;;\n    ppc:Linux:*:*)\n\techo powerpc-unknown-linux-gnu\n\texit ;;\n    ppc64:Linux:*:*)\n\techo powerpc64-unknown-linux-gnu\n\texit ;;\n    alpha:Linux:*:*)\n\tcase `sed -n '/^cpu model/s/^.*: \\(.*\\)/\\1/p' < /proc/cpuinfo` in\n\t  EV5)   UNAME_MACHINE=alphaev5 ;;\n\t  EV56)  UNAME_MACHINE=alphaev56 ;;\n\t  PCA56) UNAME_MACHINE=alphapca56 ;;\n\t  PCA57) UNAME_MACHINE=alphapca56 ;;\n\t  EV6)   UNAME_MACHINE=alphaev6 ;;\n\t  EV67)  UNAME_MACHINE=alphaev67 ;;\n\t  EV68*) UNAME_MACHINE=alphaev68 ;;\n        esac\n\tobjdump --private-headers /bin/sh | grep ld.so.1 >/dev/null\n\tif test \"$?\" = 0 ; then LIBC=\"libc1\" ; else LIBC=\"\" ; fi\n\techo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}\n\texit ;;\n    parisc:Linux:*:* | hppa:Linux:*:*)\n\t# Look for CPU level\n\tcase `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in\n\t  PA7*) echo hppa1.1-unknown-linux-gnu ;;\n\t  PA8*) echo hppa2.0-unknown-linux-gnu ;;\n\t  *)    echo hppa-unknown-linux-gnu ;;\n\tesac\n\texit ;;\n    parisc64:Linux:*:* | hppa64:Linux:*:*)\n\techo hppa64-unknown-linux-gnu\n\texit ;;\n    s390:Linux:*:* | s390x:Linux:*:*)\n\techo ${UNAME_MACHINE}-ibm-linux\n\texit ;;\n    sh64*:Linux:*:*)\n    \techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    sh*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    sparc:Linux:*:* | sparc64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    vax:Linux:*:*)\n\techo ${UNAME_MACHINE}-dec-linux-gnu\n\texit ;;\n    x86_64:Linux:*:*)\n\techo x86_64-unknown-linux-gnu\n\texit ;;\n    xtensa:Linux:*:*)\n    \techo xtensa-unknown-linux-gnu\n\texit ;;\n    i*86:Linux:*:*)\n\t# The BFD linker knows what the default object file format is, so\n\t# first see if it will tell us. cd to the root directory to prevent\n\t# problems with other programs or directories called `ld' in the path.\n\t# Set LC_ALL=C to ensure ld outputs messages in English.\n\tld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \\\n\t\t\t | sed -ne '/supported targets:/!d\n\t\t\t\t    s/[ \t][ \t]*/ /g\n\t\t\t\t    s/.*supported targets: *//\n\t\t\t\t    s/ .*//\n\t\t\t\t    p'`\n        case \"$ld_supported_targets\" in\n\t  elf32-i386)\n\t\tTENTATIVE=\"${UNAME_MACHINE}-pc-linux-gnu\"\n\t\t;;\n\t  a.out-i386-linux)\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnuaout\"\n\t\texit ;;\n\t  coff-i386)\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnucoff\"\n\t\texit ;;\n\t  \"\")\n\t\t# Either a pre-BFD a.out linker (linux-gnuoldld) or\n\t\t# one that does not give us useful --help.\n\t\techo \"${UNAME_MACHINE}-pc-linux-gnuoldld\"\n\t\texit ;;\n\tesac\n\t# Determine whether the default compiler is a.out or elf\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#include <features.h>\n\t#ifdef __ELF__\n\t# ifdef __GLIBC__\n\t#  if __GLIBC__ >= 2\n\tLIBC=gnu\n\t#  else\n\tLIBC=gnulibc1\n\t#  endif\n\t# else\n\tLIBC=gnulibc1\n\t# endif\n\t#else\n\t#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)\n\tLIBC=gnu\n\t#else\n\tLIBC=gnuaout\n\t#endif\n\t#endif\n\t#ifdef __dietlibc__\n\tLIBC=dietlibc\n\t#endif\nEOF\n\teval \"`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '\n\t    /^LIBC/{\n\t\ts: ::g\n\t\tp\n\t    }'`\"\n\ttest x\"${LIBC}\" != x && {\n\t\techo \"${UNAME_MACHINE}-pc-linux-${LIBC}\"\n\t\texit\n\t}\n\ttest x\"${TENTATIVE}\" != x && { echo \"${TENTATIVE}\"; exit; }\n\t;;\n    i*86:DYNIX/ptx:4*:*)\n\t# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.\n\t# earlier versions are messed up and put the nodename in both\n\t# sysname and nodename.\n\techo i386-sequent-sysv4\n\texit ;;\n    i*86:UNIX_SV:4.2MP:2.*)\n        # Unixware is an offshoot of SVR4, but it has its own version\n        # number series starting with 2...\n        # I am not positive that other SVR4 systems won't match this,\n\t# I just have to hope.  -- rms.\n        # Use sysv4.2uw... so that sysv4* matches it.\n\techo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}\n\texit ;;\n    i*86:OS/2:*:*)\n\t# If we were able to find `uname', then EMX Unix compatibility\n\t# is probably installed.\n\techo ${UNAME_MACHINE}-pc-os2-emx\n\texit ;;\n    i*86:XTS-300:*:STOP)\n\techo ${UNAME_MACHINE}-unknown-stop\n\texit ;;\n    i*86:atheos:*:*)\n\techo ${UNAME_MACHINE}-unknown-atheos\n\texit ;;\n    i*86:syllable:*:*)\n\techo ${UNAME_MACHINE}-pc-syllable\n\texit ;;\n    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)\n\techo i386-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    i*86:*DOS:*:*)\n\techo ${UNAME_MACHINE}-pc-msdosdjgpp\n\texit ;;\n    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)\n\tUNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\\/MP$//'`\n\tif grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then\n\t\techo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}\n\tfi\n\texit ;;\n    i*86:*:5:[678]*)\n    \t# UnixWare 7.x, OpenUNIX and OpenServer 6.\n\tcase `/bin/uname -X | grep \"^Machine\"` in\n\t    *486*)\t     UNAME_MACHINE=i486 ;;\n\t    *Pentium)\t     UNAME_MACHINE=i586 ;;\n\t    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;\n\tesac\n\techo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}\n\texit ;;\n    i*86:*:3.2:*)\n\tif test -f /usr/options/cb.name; then\n\t\tUNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`\n\t\techo ${UNAME_MACHINE}-pc-isc$UNAME_REL\n\telif /bin/uname -X 2>/dev/null >/dev/null ; then\n\t\tUNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`\n\t\t(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486\n\t\t(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i586\n\t\t(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\t(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\techo ${UNAME_MACHINE}-pc-sco$UNAME_REL\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv32\n\tfi\n\texit ;;\n    pc:*:*:*)\n\t# Left here for compatibility:\n        # uname -m prints for DJGPP always 'pc', but it prints nothing about\n        # the processor, so we play safe by assuming i386.\n\techo i386-pc-msdosdjgpp\n        exit ;;\n    Intel:Mach:3*:*)\n\techo i386-pc-mach3\n\texit ;;\n    paragon:*:*:*)\n\techo i860-intel-osf1\n\texit ;;\n    i860:*:4.*:*) # i860-SVR4\n\tif grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then\n\t  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4\n\telse # Add other i860-SVR4 vendors below as they are discovered.\n\t  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4\n\tfi\n\texit ;;\n    mini*:CTIX:SYS*5:*)\n\t# \"miniframe\"\n\techo m68010-convergent-sysv\n\texit ;;\n    mc68k:UNIX:SYSTEM5:3.51m)\n\techo m68k-convergent-sysv\n\texit ;;\n    M680?0:D-NIX:5.3:*)\n\techo m68k-diab-dnix\n\texit ;;\n    M68*:*:R3V[5678]*:*)\n\ttest -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;\n    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)\n\tOS_REL=''\n\ttest -r /etc/.relid \\\n\t&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;\n    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)\n        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n          && { echo i486-ncr-sysv4; exit; } ;;\n    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)\n\techo m68k-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    mc68030:UNIX_System_V:4.*:*)\n\techo m68k-atari-sysv4\n\texit ;;\n    TSUNAMI:LynxOS:2.*:*)\n\techo sparc-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    rs6000:LynxOS:2.*:*)\n\techo rs6000-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)\n\techo powerpc-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    SM[BE]S:UNIX_SV:*:*)\n\techo mips-dde-sysv${UNAME_RELEASE}\n\texit ;;\n    RM*:ReliantUNIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    RM*:SINIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    *:SINIX-*:*:*)\n\tif uname -p 2>/dev/null >/dev/null ; then\n\t\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\t\techo ${UNAME_MACHINE}-sni-sysv4\n\telse\n\t\techo ns32k-sni-sysv\n\tfi\n\texit ;;\n    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort\n                      # says <Richard.M.Bartel@ccMail.Census.GOV>\n        echo i586-unisys-sysv4\n        exit ;;\n    *:UNIX_System_V:4*:FTX*)\n\t# From Gerald Hewes <hewes@openmarket.com>.\n\t# How about differentiating between stratus architectures? -djm\n\techo hppa1.1-stratus-sysv4\n\texit ;;\n    *:*:*:FTX*)\n\t# From seanf@swdc.stratus.com.\n\techo i860-stratus-sysv4\n\texit ;;\n    i*86:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo ${UNAME_MACHINE}-stratus-vos\n\texit ;;\n    *:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo hppa1.1-stratus-vos\n\texit ;;\n    mc68*:A/UX:*:*)\n\techo m68k-apple-aux${UNAME_RELEASE}\n\texit ;;\n    news*:NEWS-OS:6*:*)\n\techo mips-sony-newsos6\n\texit ;;\n    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)\n\tif [ -d /usr/nec ]; then\n\t        echo mips-nec-sysv${UNAME_RELEASE}\n\telse\n\t        echo mips-unknown-sysv${UNAME_RELEASE}\n\tfi\n        exit ;;\n    BeBox:BeOS:*:*)\t# BeOS running on hardware made by Be, PPC only.\n\techo powerpc-be-beos\n\texit ;;\n    BeMac:BeOS:*:*)\t# BeOS running on Mac or Mac clone, PPC only.\n\techo powerpc-apple-beos\n\texit ;;\n    BePC:BeOS:*:*)\t# BeOS running on Intel PC compatible.\n\techo i586-pc-beos\n\texit ;;\n    SX-4:SUPER-UX:*:*)\n\techo sx4-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-5:SUPER-UX:*:*)\n\techo sx5-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-6:SUPER-UX:*:*)\n\techo sx6-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-7:SUPER-UX:*:*)\n\techo sx7-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-8:SUPER-UX:*:*)\n\techo sx8-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-8R:SUPER-UX:*:*)\n\techo sx8r-nec-superux${UNAME_RELEASE}\n\texit ;;\n    Power*:Rhapsody:*:*)\n\techo powerpc-apple-rhapsody${UNAME_RELEASE}\n\texit ;;\n    *:Rhapsody:*:*)\n\techo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}\n\texit ;;\n    *:Darwin:*:*)\n\tUNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown\n\tcase $UNAME_PROCESSOR in\n\t    unknown) UNAME_PROCESSOR=powerpc ;;\n\tesac\n\techo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}\n\texit ;;\n    *:procnto*:*:* | *:QNX:[0123456789]*:*)\n\tUNAME_PROCESSOR=`uname -p`\n\tif test \"$UNAME_PROCESSOR\" = \"x86\"; then\n\t\tUNAME_PROCESSOR=i386\n\t\tUNAME_MACHINE=pc\n\tfi\n\techo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}\n\texit ;;\n    *:QNX:*:4*)\n\techo i386-pc-qnx\n\texit ;;\n    NSE-?:NONSTOP_KERNEL:*:*)\n\techo nse-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    NSR-?:NONSTOP_KERNEL:*:*)\n\techo nsr-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    *:NonStop-UX:*:*)\n\techo mips-compaq-nonstopux\n\texit ;;\n    BS2000:POSIX*:*:*)\n\techo bs2000-siemens-sysv\n\texit ;;\n    DS/*:UNIX_System_V:*:*)\n\techo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}\n\texit ;;\n    *:Plan9:*:*)\n\t# \"uname -m\" is not consistent, so use $cputype instead. 386\n\t# is converted to i386 for consistency with other x86\n\t# operating systems.\n\tif test \"$cputype\" = \"386\"; then\n\t    UNAME_MACHINE=i386\n\telse\n\t    UNAME_MACHINE=\"$cputype\"\n\tfi\n\techo ${UNAME_MACHINE}-unknown-plan9\n\texit ;;\n    *:TOPS-10:*:*)\n\techo pdp10-unknown-tops10\n\texit ;;\n    *:TENEX:*:*)\n\techo pdp10-unknown-tenex\n\texit ;;\n    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)\n\techo pdp10-dec-tops20\n\texit ;;\n    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)\n\techo pdp10-xkl-tops20\n\texit ;;\n    *:TOPS-20:*:*)\n\techo pdp10-unknown-tops20\n\texit ;;\n    *:ITS:*:*)\n\techo pdp10-unknown-its\n\texit ;;\n    SEI:*:*:SEIUX)\n        echo mips-sei-seiux${UNAME_RELEASE}\n\texit ;;\n    *:DragonFly:*:*)\n\techo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`\n\texit ;;\n    *:*VMS:*:*)\n    \tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\tcase \"${UNAME_MACHINE}\" in\n\t    A*) echo alpha-dec-vms ; exit ;;\n\t    I*) echo ia64-dec-vms ; exit ;;\n\t    V*) echo vax-dec-vms ; exit ;;\n\tesac ;;\n    *:XENIX:*:SysV)\n\techo i386-pc-xenix\n\texit ;;\n    i*86:skyos:*:*)\n\techo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'\n\texit ;;\n    i*86:rdos:*:*)\n\techo ${UNAME_MACHINE}-pc-rdos\n\texit ;;\nesac\n\n#echo '(No uname command or uname output not recognized.)' 1>&2\n#echo \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" 1>&2\n\neval $set_cc_for_build\ncat >$dummy.c <<EOF\n#ifdef _SEQUENT_\n# include <sys/types.h>\n# include <sys/utsname.h>\n#endif\nmain ()\n{\n#if defined (sony)\n#if defined (MIPSEB)\n  /* BFD wants \"bsd\" instead of \"newsos\".  Perhaps BFD should be changed,\n     I don't know....  */\n  printf (\"mips-sony-bsd\\n\"); exit (0);\n#else\n#include <sys/param.h>\n  printf (\"m68k-sony-newsos%s\\n\",\n#ifdef NEWSOS4\n          \"4\"\n#else\n\t  \"\"\n#endif\n         ); exit (0);\n#endif\n#endif\n\n#if defined (__arm) && defined (__acorn) && defined (__unix)\n  printf (\"arm-acorn-riscix\\n\"); exit (0);\n#endif\n\n#if defined (hp300) && !defined (hpux)\n  printf (\"m68k-hp-bsd\\n\"); exit (0);\n#endif\n\n#if defined (NeXT)\n#if !defined (__ARCHITECTURE__)\n#define __ARCHITECTURE__ \"m68k\"\n#endif\n  int version;\n  version=`(hostinfo | sed -n 's/.*NeXT Mach \\([0-9]*\\).*/\\1/p') 2>/dev/null`;\n  if (version < 4)\n    printf (\"%s-next-nextstep%d\\n\", __ARCHITECTURE__, version);\n  else\n    printf (\"%s-next-openstep%d\\n\", __ARCHITECTURE__, version);\n  exit (0);\n#endif\n\n#if defined (MULTIMAX) || defined (n16)\n#if defined (UMAXV)\n  printf (\"ns32k-encore-sysv\\n\"); exit (0);\n#else\n#if defined (CMU)\n  printf (\"ns32k-encore-mach\\n\"); exit (0);\n#else\n  printf (\"ns32k-encore-bsd\\n\"); exit (0);\n#endif\n#endif\n#endif\n\n#if defined (__386BSD__)\n  printf (\"i386-pc-bsd\\n\"); exit (0);\n#endif\n\n#if defined (sequent)\n#if defined (i386)\n  printf (\"i386-sequent-dynix\\n\"); exit (0);\n#endif\n#if defined (ns32000)\n  printf (\"ns32k-sequent-dynix\\n\"); exit (0);\n#endif\n#endif\n\n#if defined (_SEQUENT_)\n    struct utsname un;\n\n    uname(&un);\n\n    if (strncmp(un.version, \"V2\", 2) == 0) {\n\tprintf (\"i386-sequent-ptx2\\n\"); exit (0);\n    }\n    if (strncmp(un.version, \"V1\", 2) == 0) { /* XXX is V1 correct? */\n\tprintf (\"i386-sequent-ptx1\\n\"); exit (0);\n    }\n    printf (\"i386-sequent-ptx\\n\"); exit (0);\n\n#endif\n\n#if defined (vax)\n# if !defined (ultrix)\n#  include <sys/param.h>\n#  if defined (BSD)\n#   if BSD == 43\n      printf (\"vax-dec-bsd4.3\\n\"); exit (0);\n#   else\n#    if BSD == 199006\n      printf (\"vax-dec-bsd4.3reno\\n\"); exit (0);\n#    else\n      printf (\"vax-dec-bsd\\n\"); exit (0);\n#    endif\n#   endif\n#  else\n    printf (\"vax-dec-bsd\\n\"); exit (0);\n#  endif\n# else\n    printf (\"vax-dec-ultrix\\n\"); exit (0);\n# endif\n#endif\n\n#if defined (alliant) && defined (i860)\n  printf (\"i860-alliant-bsd\\n\"); exit (0);\n#endif\n\n  exit (1);\n}\nEOF\n\n$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&\n\t{ echo \"$SYSTEM_NAME\"; exit; }\n\n# Apollos put the system type in the environment.\n\ntest -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }\n\n# Convex versions that predate uname can use getsysinfo(1)\n\nif [ -x /usr/convex/getsysinfo ]\nthen\n    case `getsysinfo -f cpu_type` in\n    c1*)\n\techo c1-convex-bsd\n\texit ;;\n    c2*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit ;;\n    c34*)\n\techo c34-convex-bsd\n\texit ;;\n    c38*)\n\techo c38-convex-bsd\n\texit ;;\n    c4*)\n\techo c4-convex-bsd\n\texit ;;\n    esac\nfi\n\ncat >&2 <<EOF\n$0: unable to guess system type\n\nThis script, last modified $timestamp, has failed to recognize\nthe operating system you are using. It is advised that you\ndownload the most up to date version of the config scripts from\n\n  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess\nand\n  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub\n\nIf the version you run ($0) is already up to date, please\nsend the following data and any information you think might be\npertinent to <config-patches@gnu.org> in order to provide the needed\ninformation to handle your system.\n\nconfig.guess timestamp = $timestamp\n\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`\n\nhostinfo               = `(hostinfo) 2>/dev/null`\n/bin/universe          = `(/bin/universe) 2>/dev/null`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`\n/bin/arch              = `(/bin/arch) 2>/dev/null`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`\n\nUNAME_MACHINE = ${UNAME_MACHINE}\nUNAME_RELEASE = ${UNAME_RELEASE}\nUNAME_SYSTEM  = ${UNAME_SYSTEM}\nUNAME_VERSION = ${UNAME_VERSION}\nEOF\n\nexit 1\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/config.sub",
    "content": "#! /bin/sh\n# Configuration validation subroutine script.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,\n#   Inc.\n\ntimestamp='2007-06-28'\n\n# This file is (in principle) common to ALL GNU software.\n# The presence of a machine in this file suggests that SOME GNU software\n# can handle that machine.  It does not imply ALL GNU software can.\n#\n# This file is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA\n# 02110-1301, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n\n# Please send patches to <config-patches@gnu.org>.  Submit a context\n# diff and a properly formatted ChangeLog entry.\n#\n# Configuration subroutine to validate and canonicalize a configuration type.\n# Supply the specified configuration type as an argument.\n# If it is invalid, we print an error message on stderr and exit with code 1.\n# Otherwise, we print the canonical config type on stdout and succeed.\n\n# This file is supposed to be the same for all GNU packages\n# and recognize all the CPU types, system types and aliases\n# that are meaningful with *any* GNU software.\n# Each package is responsible for reporting which valid configurations\n# it does not support.  The user should be able to distinguish\n# a failure to support a valid configuration from a meaningless\n# configuration.\n\n# The goal of this file is to map all the various variations of a given\n# machine specification into a single specification in the form:\n#\tCPU_TYPE-MANUFACTURER-OPERATING_SYSTEM\n# or in some cases, the newer four-part form:\n#\tCPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM\n# It is wrong to echo any other type of specification.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION] CPU-MFR-OPSYS\n       $0 [OPTION] ALIAS\n\nCanonicalize a configuration name.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.sub ($timestamp)\n\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005\nFree Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\"\n       exit 1 ;;\n\n    *local*)\n       # First pass through any local machine types.\n       echo $1\n       exit ;;\n\n    * )\n       break ;;\n  esac\ndone\n\ncase $# in\n 0) echo \"$me: missing argument$help\" >&2\n    exit 1;;\n 1) ;;\n *) echo \"$me: too many arguments$help\" >&2\n    exit 1;;\nesac\n\n# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).\n# Here we must recognize all the valid KERNEL-OS combinations.\nmaybe_os=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\2/'`\ncase $maybe_os in\n  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \\\n  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \\\n  storm-chaos* | os2-emx* | rtmk-nova*)\n    os=-$maybe_os\n    basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`\n    ;;\n  *)\n    basic_machine=`echo $1 | sed 's/-[^-]*$//'`\n    if [ $basic_machine != $1 ]\n    then os=`echo $1 | sed 's/.*-/-/'`\n    else os=; fi\n    ;;\nesac\n\n### Let's recognize common machines as not being operating systems so\n### that things like config.sub decstation-3100 work.  We also\n### recognize some manufacturers as not being operating systems, so we\n### can provide default operating systems below.\ncase $os in\n\t-sun*os*)\n\t\t# Prevent following clause from handling this invalid input.\n\t\t;;\n\t-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \\\n\t-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \\\n\t-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \\\n\t-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\\\n\t-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \\\n\t-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \\\n\t-apple | -axis | -knuth | -cray)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-sim | -cisco | -oki | -wec | -winbond)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-scout)\n\t\t;;\n\t-wrs)\n\t\tos=-vxworks\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusos*)\n\t\tos=-chorusos\n\t\tbasic_machine=$1\n\t\t;;\n \t-chorusrdb)\n \t\tos=-chorusrdb\n\t\tbasic_machine=$1\n \t\t;;\n\t-hiux*)\n\t\tos=-hiuxwe2\n\t\t;;\n\t-sco6)\n\t\tos=-sco5v6\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5)\n\t\tos=-sco3.2v5\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco4)\n\t\tos=-sco3.2v4\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2.[4-9]*)\n\t\tos=`echo $os | sed -e 's/sco3.2./sco3.2v/'`\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2v[4-9]*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5v6*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco*)\n\t\tos=-sco3.2v2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-udk*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-isc)\n\t\tos=-isc2.2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-clix*)\n\t\tbasic_machine=clipper-intergraph\n\t\t;;\n\t-isc*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-lynx*)\n\t\tos=-lynxos\n\t\t;;\n\t-ptx*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`\n\t\t;;\n\t-windowsnt*)\n\t\tos=`echo $os | sed -e 's/windowsnt/winnt/'`\n\t\t;;\n\t-psos*)\n\t\tos=-psos\n\t\t;;\n\t-mint | -mint[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\nesac\n\n# Decode aliases for certain CPU-COMPANY combinations.\ncase $basic_machine in\n\t# Recognize the basic CPU types without company name.\n\t# Some are omitted here because they have special meanings below.\n\t1750a | 580 \\\n\t| a29k \\\n\t| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \\\n\t| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \\\n\t| am33_2.0 \\\n\t| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \\\n\t| bfin \\\n\t| c4x | clipper \\\n\t| d10v | d30v | dlx | dsp16xx \\\n\t| fido | fr30 | frv \\\n\t| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \\\n\t| i370 | i860 | i960 | ia64 \\\n\t| ip2k | iq2000 \\\n\t| m32c | m32r | m32rle | m68000 | m68k | m88k \\\n\t| maxq | mb | microblaze | mcore | mep \\\n\t| mips | mipsbe | mipseb | mipsel | mipsle \\\n\t| mips16 \\\n\t| mips64 | mips64el \\\n\t| mips64vr | mips64vrel \\\n\t| mips64orion | mips64orionel \\\n\t| mips64vr4100 | mips64vr4100el \\\n\t| mips64vr4300 | mips64vr4300el \\\n\t| mips64vr5000 | mips64vr5000el \\\n\t| mips64vr5900 | mips64vr5900el \\\n\t| mipsisa32 | mipsisa32el \\\n\t| mipsisa32r2 | mipsisa32r2el \\\n\t| mipsisa64 | mipsisa64el \\\n\t| mipsisa64r2 | mipsisa64r2el \\\n\t| mipsisa64sb1 | mipsisa64sb1el \\\n\t| mipsisa64sr71k | mipsisa64sr71kel \\\n\t| mipstx39 | mipstx39el \\\n\t| mn10200 | mn10300 \\\n\t| mt \\\n\t| msp430 \\\n\t| nios | nios2 \\\n\t| ns16k | ns32k \\\n\t| or32 \\\n\t| pdp10 | pdp11 | pj | pjl \\\n\t| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \\\n\t| pyramid \\\n\t| score \\\n\t| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \\\n\t| sh64 | sh64le \\\n\t| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \\\n\t| sparcv8 | sparcv9 | sparcv9b | sparcv9v \\\n\t| spu | strongarm \\\n\t| tahoe | thumb | tic4x | tic80 | tron \\\n\t| v850 | v850e \\\n\t| we32k \\\n\t| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \\\n\t| z8k)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\tm6811 | m68hc11 | m6812 | m68hc12)\n\t\t# Motorola 68HC11/12.\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\tm88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)\n\t\t;;\n\tms1)\n\t\tbasic_machine=mt-unknown\n\t\t;;\n\n\t# We use `pc' rather than `unknown'\n\t# because (1) that's what they normally are, and\n\t# (2) the word \"unknown\" tends to confuse beginning users.\n\ti*86 | x86_64)\n\t  basic_machine=$basic_machine-pc\n\t  ;;\n\t# Object if more than one company name word.\n\t*-*-*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\n\t# Recognize the basic CPU types with company name.\n\t580-* \\\n\t| a29k-* \\\n\t| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \\\n\t| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \\\n\t| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \\\n\t| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \\\n\t| avr-* | avr32-* \\\n\t| bfin-* | bs2000-* \\\n\t| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \\\n\t| clipper-* | craynv-* | cydra-* \\\n\t| d10v-* | d30v-* | dlx-* \\\n\t| elxsi-* \\\n\t| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \\\n\t| h8300-* | h8500-* \\\n\t| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \\\n\t| i*86-* | i860-* | i960-* | ia64-* \\\n\t| ip2k-* | iq2000-* \\\n\t| m32c-* | m32r-* | m32rle-* \\\n\t| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \\\n\t| m88110-* | m88k-* | maxq-* | mcore-* \\\n\t| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \\\n\t| mips16-* \\\n\t| mips64-* | mips64el-* \\\n\t| mips64vr-* | mips64vrel-* \\\n\t| mips64orion-* | mips64orionel-* \\\n\t| mips64vr4100-* | mips64vr4100el-* \\\n\t| mips64vr4300-* | mips64vr4300el-* \\\n\t| mips64vr5000-* | mips64vr5000el-* \\\n\t| mips64vr5900-* | mips64vr5900el-* \\\n\t| mipsisa32-* | mipsisa32el-* \\\n\t| mipsisa32r2-* | mipsisa32r2el-* \\\n\t| mipsisa64-* | mipsisa64el-* \\\n\t| mipsisa64r2-* | mipsisa64r2el-* \\\n\t| mipsisa64sb1-* | mipsisa64sb1el-* \\\n\t| mipsisa64sr71k-* | mipsisa64sr71kel-* \\\n\t| mipstx39-* | mipstx39el-* \\\n\t| mmix-* \\\n\t| mt-* \\\n\t| msp430-* \\\n\t| nios-* | nios2-* \\\n\t| none-* | np1-* | ns16k-* | ns32k-* \\\n\t| orion-* \\\n\t| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \\\n\t| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \\\n\t| pyramid-* \\\n\t| romp-* | rs6000-* \\\n\t| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \\\n\t| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \\\n\t| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \\\n\t| sparclite-* \\\n\t| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \\\n\t| tahoe-* | thumb-* \\\n\t| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \\\n\t| tron-* \\\n\t| v850-* | v850e-* | vax-* \\\n\t| we32k-* \\\n\t| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \\\n\t| xstormy16-* | xtensa-* \\\n\t| ymp-* \\\n\t| z8k-*)\n\t\t;;\n\t# Recognize the various machine names and aliases which stand\n\t# for a CPU type and a company and sometimes even an OS.\n\t386bsd)\n\t\tbasic_machine=i386-unknown\n\t\tos=-bsd\n\t\t;;\n\t3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)\n\t\tbasic_machine=m68000-att\n\t\t;;\n\t3b*)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\ta29khif)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n    \tabacus)\n\t\tbasic_machine=abacus-unknown\n\t\t;;\n\tadobe68k)\n\t\tbasic_machine=m68010-adobe\n\t\tos=-scout\n\t\t;;\n\talliant | fx80)\n\t\tbasic_machine=fx80-alliant\n\t\t;;\n\taltos | altos3068)\n\t\tbasic_machine=m68k-altos\n\t\t;;\n\tam29k)\n\t\tbasic_machine=a29k-none\n\t\tos=-bsd\n\t\t;;\n\tamd64)\n\t\tbasic_machine=x86_64-pc\n\t\t;;\n\tamd64-*)\n\t\tbasic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tamdahl)\n\t\tbasic_machine=580-amdahl\n\t\tos=-sysv\n\t\t;;\n\tamiga | amiga-*)\n\t\tbasic_machine=m68k-unknown\n\t\t;;\n\tamigaos | amigados)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-amigaos\n\t\t;;\n\tamigaunix | amix)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-sysv4\n\t\t;;\n\tapollo68)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-sysv\n\t\t;;\n\tapollo68bsd)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-bsd\n\t\t;;\n\taux)\n\t\tbasic_machine=m68k-apple\n\t\tos=-aux\n\t\t;;\n\tbalance)\n\t\tbasic_machine=ns32k-sequent\n\t\tos=-dynix\n\t\t;;\n\tc90)\n\t\tbasic_machine=c90-cray\n\t\tos=-unicos\n\t\t;;\n\tconvex-c1)\n\t\tbasic_machine=c1-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c2)\n\t\tbasic_machine=c2-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c32)\n\t\tbasic_machine=c32-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c34)\n\t\tbasic_machine=c34-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c38)\n\t\tbasic_machine=c38-convex\n\t\tos=-bsd\n\t\t;;\n\tcray | j90)\n\t\tbasic_machine=j90-cray\n\t\tos=-unicos\n\t\t;;\n\tcraynv)\n\t\tbasic_machine=craynv-cray\n\t\tos=-unicosmp\n\t\t;;\n\tcr16)\n\t\tbasic_machine=cr16-unknown\n\t\tos=-elf\n\t\t;;\n\tcrds | unos)\n\t\tbasic_machine=m68k-crds\n\t\t;;\n\tcrisv32 | crisv32-* | etraxfs*)\n\t\tbasic_machine=crisv32-axis\n\t\t;;\n\tcris | cris-* | etrax*)\n\t\tbasic_machine=cris-axis\n\t\t;;\n\tcrx)\n\t\tbasic_machine=crx-unknown\n\t\tos=-elf\n\t\t;;\n\tda30 | da30-*)\n\t\tbasic_machine=m68k-da30\n\t\t;;\n\tdecstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)\n\t\tbasic_machine=mips-dec\n\t\t;;\n\tdecsystem10* | dec10*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops10\n\t\t;;\n\tdecsystem20* | dec20*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops20\n\t\t;;\n\tdelta | 3300 | motorola-3300 | motorola-delta \\\n\t      | 3300-motorola | delta-motorola)\n\t\tbasic_machine=m68k-motorola\n\t\t;;\n\tdelta88)\n\t\tbasic_machine=m88k-motorola\n\t\tos=-sysv3\n\t\t;;\n\tdjgpp)\n\t\tbasic_machine=i586-pc\n\t\tos=-msdosdjgpp\n\t\t;;\n\tdpx20 | dpx20-*)\n\t\tbasic_machine=rs6000-bull\n\t\tos=-bosx\n\t\t;;\n\tdpx2* | dpx2*-bull)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv3\n\t\t;;\n\tebmon29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-ebmon\n\t\t;;\n\telxsi)\n\t\tbasic_machine=elxsi-elxsi\n\t\tos=-bsd\n\t\t;;\n\tencore | umax | mmax)\n\t\tbasic_machine=ns32k-encore\n\t\t;;\n\tes1800 | OSE68k | ose68k | ose | OSE)\n\t\tbasic_machine=m68k-ericsson\n\t\tos=-ose\n\t\t;;\n\tfx2800)\n\t\tbasic_machine=i860-alliant\n\t\t;;\n\tgenix)\n\t\tbasic_machine=ns32k-ns\n\t\t;;\n\tgmicro)\n\t\tbasic_machine=tron-gmicro\n\t\tos=-sysv\n\t\t;;\n\tgo32)\n\t\tbasic_machine=i386-pc\n\t\tos=-go32\n\t\t;;\n\th3050r* | hiux*)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\th8300hms)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-hms\n\t\t;;\n\th8300xray)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-xray\n\t\t;;\n\th8500hms)\n\t\tbasic_machine=h8500-hitachi\n\t\tos=-hms\n\t\t;;\n\tharris)\n\t\tbasic_machine=m88k-harris\n\t\tos=-sysv3\n\t\t;;\n\thp300-*)\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp300bsd)\n\t\tbasic_machine=m68k-hp\n\t\tos=-bsd\n\t\t;;\n\thp300hpux)\n\t\tbasic_machine=m68k-hp\n\t\tos=-hpux\n\t\t;;\n\thp3k9[0-9][0-9] | hp9[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k2[0-9][0-9] | hp9k31[0-9])\n\t\tbasic_machine=m68000-hp\n\t\t;;\n\thp9k3[2-9][0-9])\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp9k6[0-9][0-9] | hp6[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k7[0-79][0-9] | hp7[0-79][0-9])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k78[0-9] | hp78[0-9])\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][13679] | hp8[0-9][13679])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][0-9] | hp8[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thppa-next)\n\t\tos=-nextstep3\n\t\t;;\n\thppaosf)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-osf\n\t\t;;\n\thppro)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-proelf\n\t\t;;\n\ti370-ibm* | ibm*)\n\t\tbasic_machine=i370-ibm\n\t\t;;\n# I'm not sure what \"Sysv32\" means.  Should this be sysv3.2?\n\ti*86v32)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv32\n\t\t;;\n\ti*86v4*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv4\n\t\t;;\n\ti*86v)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv\n\t\t;;\n\ti*86sol2)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-solaris2\n\t\t;;\n\ti386mach)\n\t\tbasic_machine=i386-mach\n\t\tos=-mach\n\t\t;;\n\ti386-vsta | vsta)\n\t\tbasic_machine=i386-unknown\n\t\tos=-vsta\n\t\t;;\n\tiris | iris4d)\n\t\tbasic_machine=mips-sgi\n\t\tcase $os in\n\t\t    -irix*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-irix4\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tisi68 | isi)\n\t\tbasic_machine=m68k-isi\n\t\tos=-sysv\n\t\t;;\n\tm88k-omron*)\n\t\tbasic_machine=m88k-omron\n\t\t;;\n\tmagnum | m3230)\n\t\tbasic_machine=mips-mips\n\t\tos=-sysv\n\t\t;;\n\tmerlin)\n\t\tbasic_machine=ns32k-utek\n\t\tos=-sysv\n\t\t;;\n\tmingw32)\n\t\tbasic_machine=i386-pc\n\t\tos=-mingw32\n\t\t;;\n\tmingw32ce)\n\t\tbasic_machine=arm-unknown\n\t\tos=-mingw32ce\n\t\t;;\n\tminiframe)\n\t\tbasic_machine=m68000-convergent\n\t\t;;\n\t*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\n\tmips3*-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`\n\t\t;;\n\tmips3*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown\n\t\t;;\n\tmonitor)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\tmorphos)\n\t\tbasic_machine=powerpc-unknown\n\t\tos=-morphos\n\t\t;;\n\tmsdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-msdos\n\t\t;;\n\tms1-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`\n\t\t;;\n\tmvs)\n\t\tbasic_machine=i370-ibm\n\t\tos=-mvs\n\t\t;;\n\tncr3000)\n\t\tbasic_machine=i486-ncr\n\t\tos=-sysv4\n\t\t;;\n\tnetbsd386)\n\t\tbasic_machine=i386-unknown\n\t\tos=-netbsd\n\t\t;;\n\tnetwinder)\n\t\tbasic_machine=armv4l-rebel\n\t\tos=-linux\n\t\t;;\n\tnews | news700 | news800 | news900)\n\t\tbasic_machine=m68k-sony\n\t\tos=-newsos\n\t\t;;\n\tnews1000)\n\t\tbasic_machine=m68030-sony\n\t\tos=-newsos\n\t\t;;\n\tnews-3600 | risc-news)\n\t\tbasic_machine=mips-sony\n\t\tos=-newsos\n\t\t;;\n\tnecv70)\n\t\tbasic_machine=v70-nec\n\t\tos=-sysv\n\t\t;;\n\tnext | m*-next )\n\t\tbasic_machine=m68k-next\n\t\tcase $os in\n\t\t    -nextstep* )\n\t\t\t;;\n\t\t    -ns2*)\n\t\t      os=-nextstep2\n\t\t\t;;\n\t\t    *)\n\t\t      os=-nextstep3\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tnh3000)\n\t\tbasic_machine=m68k-harris\n\t\tos=-cxux\n\t\t;;\n\tnh[45]000)\n\t\tbasic_machine=m88k-harris\n\t\tos=-cxux\n\t\t;;\n\tnindy960)\n\t\tbasic_machine=i960-intel\n\t\tos=-nindy\n\t\t;;\n\tmon960)\n\t\tbasic_machine=i960-intel\n\t\tos=-mon960\n\t\t;;\n\tnonstopux)\n\t\tbasic_machine=mips-compaq\n\t\tos=-nonstopux\n\t\t;;\n\tnp1)\n\t\tbasic_machine=np1-gould\n\t\t;;\n\tnsr-tandem)\n\t\tbasic_machine=nsr-tandem\n\t\t;;\n\top50n-* | op60c-*)\n\t\tbasic_machine=hppa1.1-oki\n\t\tos=-proelf\n\t\t;;\n\topenrisc | openrisc-*)\n\t\tbasic_machine=or32-unknown\n\t\t;;\n\tos400)\n\t\tbasic_machine=powerpc-ibm\n\t\tos=-os400\n\t\t;;\n\tOSE68000 | ose68000)\n\t\tbasic_machine=m68000-ericsson\n\t\tos=-ose\n\t\t;;\n\tos68k)\n\t\tbasic_machine=m68k-none\n\t\tos=-os68k\n\t\t;;\n\tpa-hitachi)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\tparagon)\n\t\tbasic_machine=i860-intel\n\t\tos=-osf\n\t\t;;\n\tpbd)\n\t\tbasic_machine=sparc-tti\n\t\t;;\n\tpbb)\n\t\tbasic_machine=m68k-tti\n\t\t;;\n\tpc532 | pc532-*)\n\t\tbasic_machine=ns32k-pc532\n\t\t;;\n\tpc98)\n\t\tbasic_machine=i386-pc\n\t\t;;\n\tpc98-*)\n\t\tbasic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium | p5 | k5 | k6 | nexgen | viac3)\n\t\tbasic_machine=i586-pc\n\t\t;;\n\tpentiumpro | p6 | 6x86 | athlon | athlon_*)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentiumii | pentium2 | pentiumiii | pentium3)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentium4)\n\t\tbasic_machine=i786-pc\n\t\t;;\n\tpentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)\n\t\tbasic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumpro-* | p6-* | 6x86-* | athlon-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium4-*)\n\t\tbasic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpn)\n\t\tbasic_machine=pn-gould\n\t\t;;\n\tpower)\tbasic_machine=power-ibm\n\t\t;;\n\tppc)\tbasic_machine=powerpc-unknown\n\t\t;;\n\tppc-*)\tbasic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppcle | powerpclittle | ppc-le | powerpc-little)\n\t\tbasic_machine=powerpcle-unknown\n\t\t;;\n\tppcle-* | powerpclittle-*)\n\t\tbasic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64)\tbasic_machine=powerpc64-unknown\n\t\t;;\n\tppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64le | powerpc64little | ppc64-le | powerpc64-little)\n\t\tbasic_machine=powerpc64le-unknown\n\t\t;;\n\tppc64le-* | powerpc64little-*)\n\t\tbasic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tps2)\n\t\tbasic_machine=i386-ibm\n\t\t;;\n\tpw32)\n\t\tbasic_machine=i586-unknown\n\t\tos=-pw32\n\t\t;;\n\trdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-rdos\n\t\t;;\n\trom68k)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\trm[46]00)\n\t\tbasic_machine=mips-siemens\n\t\t;;\n\trtpc | rtpc-*)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\ts390 | s390-*)\n\t\tbasic_machine=s390-ibm\n\t\t;;\n\ts390x | s390x-*)\n\t\tbasic_machine=s390x-ibm\n\t\t;;\n\tsa29200)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tsb1)\n\t\tbasic_machine=mipsisa64sb1-unknown\n\t\t;;\n\tsb1el)\n\t\tbasic_machine=mipsisa64sb1el-unknown\n\t\t;;\n\tsde)\n\t\tbasic_machine=mipsisa32-sde\n\t\tos=-elf\n\t\t;;\n\tsei)\n\t\tbasic_machine=mips-sei\n\t\tos=-seiux\n\t\t;;\n\tsequent)\n\t\tbasic_machine=i386-sequent\n\t\t;;\n\tsh)\n\t\tbasic_machine=sh-hitachi\n\t\tos=-hms\n\t\t;;\n\tsh5el)\n\t\tbasic_machine=sh5le-unknown\n\t\t;;\n\tsh64)\n\t\tbasic_machine=sh64-unknown\n\t\t;;\n\tsparclite-wrs | simso-wrs)\n\t\tbasic_machine=sparclite-wrs\n\t\tos=-vxworks\n\t\t;;\n\tsps7)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv2\n\t\t;;\n\tspur)\n\t\tbasic_machine=spur-unknown\n\t\t;;\n\tst2000)\n\t\tbasic_machine=m68k-tandem\n\t\t;;\n\tstratus)\n\t\tbasic_machine=i860-stratus\n\t\tos=-sysv4\n\t\t;;\n\tsun2)\n\t\tbasic_machine=m68000-sun\n\t\t;;\n\tsun2os3)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun2os4)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun3os3)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun3os4)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4os3)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun4os4)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4sol2)\n\t\tbasic_machine=sparc-sun\n\t\tos=-solaris2\n\t\t;;\n\tsun3 | sun3-*)\n\t\tbasic_machine=m68k-sun\n\t\t;;\n\tsun4)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tsun386 | sun386i | roadrunner)\n\t\tbasic_machine=i386-sun\n\t\t;;\n\tsv1)\n\t\tbasic_machine=sv1-cray\n\t\tos=-unicos\n\t\t;;\n\tsymmetry)\n\t\tbasic_machine=i386-sequent\n\t\tos=-dynix\n\t\t;;\n\tt3e)\n\t\tbasic_machine=alphaev5-cray\n\t\tos=-unicos\n\t\t;;\n\tt90)\n\t\tbasic_machine=t90-cray\n\t\tos=-unicos\n\t\t;;\n\ttic54x | c54x*)\n\t\tbasic_machine=tic54x-unknown\n\t\tos=-coff\n\t\t;;\n\ttic55x | c55x*)\n\t\tbasic_machine=tic55x-unknown\n\t\tos=-coff\n\t\t;;\n\ttic6x | c6x*)\n\t\tbasic_machine=tic6x-unknown\n\t\tos=-coff\n\t\t;;\n\ttx39)\n\t\tbasic_machine=mipstx39-unknown\n\t\t;;\n\ttx39el)\n\t\tbasic_machine=mipstx39el-unknown\n\t\t;;\n\ttoad1)\n\t\tbasic_machine=pdp10-xkl\n\t\tos=-tops20\n\t\t;;\n\ttower | tower-32)\n\t\tbasic_machine=m68k-ncr\n\t\t;;\n\ttpf)\n\t\tbasic_machine=s390x-ibm\n\t\tos=-tpf\n\t\t;;\n\tudi29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tultra3)\n\t\tbasic_machine=a29k-nyu\n\t\tos=-sym1\n\t\t;;\n\tv810 | necv810)\n\t\tbasic_machine=v810-nec\n\t\tos=-none\n\t\t;;\n\tvaxv)\n\t\tbasic_machine=vax-dec\n\t\tos=-sysv\n\t\t;;\n\tvms)\n\t\tbasic_machine=vax-dec\n\t\tos=-vms\n\t\t;;\n\tvpp*|vx|vx-*)\n\t\tbasic_machine=f301-fujitsu\n\t\t;;\n\tvxworks960)\n\t\tbasic_machine=i960-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks68)\n\t\tbasic_machine=m68k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks29k)\n\t\tbasic_machine=a29k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tw65*)\n\t\tbasic_machine=w65-wdc\n\t\tos=-none\n\t\t;;\n\tw89k-*)\n\t\tbasic_machine=hppa1.1-winbond\n\t\tos=-proelf\n\t\t;;\n\txbox)\n\t\tbasic_machine=i686-pc\n\t\tos=-mingw32\n\t\t;;\n\txps | xps100)\n\t\tbasic_machine=xps100-honeywell\n\t\t;;\n\tymp)\n\t\tbasic_machine=ymp-cray\n\t\tos=-unicos\n\t\t;;\n\tz8k-*-coff)\n\t\tbasic_machine=z8k-unknown\n\t\tos=-sim\n\t\t;;\n\tnone)\n\t\tbasic_machine=none-none\n\t\tos=-none\n\t\t;;\n\n# Here we handle the default manufacturer of certain CPU types.  It is in\n# some cases the only manufacturer, in others, it is the most popular.\n\tw89k)\n\t\tbasic_machine=hppa1.1-winbond\n\t\t;;\n\top50n)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\top60c)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\tromp)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\tmmix)\n\t\tbasic_machine=mmix-knuth\n\t\t;;\n\trs6000)\n\t\tbasic_machine=rs6000-ibm\n\t\t;;\n\tvax)\n\t\tbasic_machine=vax-dec\n\t\t;;\n\tpdp10)\n\t\t# there are many clones, so DEC is not a safe bet\n\t\tbasic_machine=pdp10-unknown\n\t\t;;\n\tpdp11)\n\t\tbasic_machine=pdp11-dec\n\t\t;;\n\twe32k)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\tsh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)\n\t\tbasic_machine=sh-unknown\n\t\t;;\n\tsparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tcydra)\n\t\tbasic_machine=cydra-cydrome\n\t\t;;\n\torion)\n\t\tbasic_machine=orion-highlevel\n\t\t;;\n\torion105)\n\t\tbasic_machine=clipper-highlevel\n\t\t;;\n\tmac | mpw | mac-mpw)\n\t\tbasic_machine=m68k-apple\n\t\t;;\n\tpmac | pmac-mpw)\n\t\tbasic_machine=powerpc-apple\n\t\t;;\n\t*-unknown)\n\t\t# Make sure to match an already-canonicalized machine name.\n\t\t;;\n\t*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\n\n# Here we canonicalize certain aliases for manufacturers.\ncase $basic_machine in\n\t*-digital*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`\n\t\t;;\n\t*-commodore*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`\n\t\t;;\n\t*)\n\t\t;;\nesac\n\n# Decode manufacturer-specific aliases for certain operating systems.\n\nif [ x\"$os\" != x\"\" ]\nthen\ncase $os in\n        # First match some system type aliases\n        # that might get confused with valid system types.\n\t# -solaris* is a basic system type, with this one exception.\n\t-solaris1 | -solaris1.*)\n\t\tos=`echo $os | sed -e 's|solaris1|sunos4|'`\n\t\t;;\n\t-solaris)\n\t\tos=-solaris2\n\t\t;;\n\t-svr4*)\n\t\tos=-sysv4\n\t\t;;\n\t-unixware*)\n\t\tos=-sysv4.2uw\n\t\t;;\n\t-gnu/linux*)\n\t\tos=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`\n\t\t;;\n\t# First accept the basic system types.\n\t# The portable systems comes first.\n\t# Each alternative MUST END IN A *, to match a version number.\n\t# -sysv* is not here because it comes later, after sysvr4.\n\t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n\t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\\\n\t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \\\n\t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n\t      | -aos* \\\n\t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\\n\t      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \\\n\t      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \\\n\t      | -openbsd* | -solidbsd* \\\n\t      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \\\n\t      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \\\n\t      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \\\n\t      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \\\n\t      | -chorusos* | -chorusrdb* \\\n\t      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \\\n\t      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \\\n\t      | -uxpv* | -beos* | -mpeix* | -udk* \\\n\t      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \\\n\t      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \\\n\t      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \\\n\t      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \\\n\t      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \\\n\t      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \\\n\t      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)\n\t# Remember, each alternative MUST END IN *, to match a version number.\n\t\t;;\n\t-qnx*)\n\t\tcase $basic_machine in\n\t\t    x86-* | i*86-*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-nto$os\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t-nto-qnx*)\n\t\t;;\n\t-nto*)\n\t\tos=`echo $os | sed -e 's|nto|nto-qnx|'`\n\t\t;;\n\t-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \\\n\t      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \\\n\t      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)\n\t\t;;\n\t-mac*)\n\t\tos=`echo $os | sed -e 's|mac|macos|'`\n\t\t;;\n\t-linux-dietlibc)\n\t\tos=-linux-dietlibc\n\t\t;;\n\t-linux*)\n\t\tos=`echo $os | sed -e 's|linux|linux-gnu|'`\n\t\t;;\n\t-sunos5*)\n\t\tos=`echo $os | sed -e 's|sunos5|solaris2|'`\n\t\t;;\n\t-sunos6*)\n\t\tos=`echo $os | sed -e 's|sunos6|solaris3|'`\n\t\t;;\n\t-opened*)\n\t\tos=-openedition\n\t\t;;\n        -os400*)\n\t\tos=-os400\n\t\t;;\n\t-wince*)\n\t\tos=-wince\n\t\t;;\n\t-osfrose*)\n\t\tos=-osfrose\n\t\t;;\n\t-osf*)\n\t\tos=-osf\n\t\t;;\n\t-utek*)\n\t\tos=-bsd\n\t\t;;\n\t-dynix*)\n\t\tos=-bsd\n\t\t;;\n\t-acis*)\n\t\tos=-aos\n\t\t;;\n\t-atheos*)\n\t\tos=-atheos\n\t\t;;\n\t-syllable*)\n\t\tos=-syllable\n\t\t;;\n\t-386bsd)\n\t\tos=-bsd\n\t\t;;\n\t-ctix* | -uts*)\n\t\tos=-sysv\n\t\t;;\n\t-nova*)\n\t\tos=-rtmk-nova\n\t\t;;\n\t-ns2 )\n\t\tos=-nextstep2\n\t\t;;\n\t-nsk*)\n\t\tos=-nsk\n\t\t;;\n\t# Preserve the version number of sinix5.\n\t-sinix5.*)\n\t\tos=`echo $os | sed -e 's|sinix|sysv|'`\n\t\t;;\n\t-sinix*)\n\t\tos=-sysv4\n\t\t;;\n        -tpf*)\n\t\tos=-tpf\n\t\t;;\n\t-triton*)\n\t\tos=-sysv3\n\t\t;;\n\t-oss*)\n\t\tos=-sysv3\n\t\t;;\n\t-svr4)\n\t\tos=-sysv4\n\t\t;;\n\t-svr3)\n\t\tos=-sysv3\n\t\t;;\n\t-sysvr4)\n\t\tos=-sysv4\n\t\t;;\n\t# This must come after -sysvr4.\n\t-sysv*)\n\t\t;;\n\t-ose*)\n\t\tos=-ose\n\t\t;;\n\t-es1800*)\n\t\tos=-ose\n\t\t;;\n\t-xenix)\n\t\tos=-xenix\n\t\t;;\n\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\tos=-mint\n\t\t;;\n\t-aros*)\n\t\tos=-aros\n\t\t;;\n\t-kaos*)\n\t\tos=-kaos\n\t\t;;\n\t-zvmoe)\n\t\tos=-zvmoe\n\t\t;;\n\t-none)\n\t\t;;\n\t*)\n\t\t# Get rid of the `-' at the beginning of $os.\n\t\tos=`echo $os | sed 's/[^-]*-//'`\n\t\techo Invalid configuration \\`$1\\': system \\`$os\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\nelse\n\n# Here we handle the default operating systems that come with various machines.\n# The value should be what the vendor currently ships out the door with their\n# machine or put another way, the most popular os provided with the machine.\n\n# Note that if you're going to try to match \"-MANUFACTURER\" here (say,\n# \"-sun\"), then you have to tell the case statement up towards the top\n# that MANUFACTURER isn't an operating system.  Otherwise, code above\n# will signal an error saying that MANUFACTURER isn't an operating\n# system, and we'll never get to this point.\n\ncase $basic_machine in\n        score-*)\n\t\tos=-elf\n\t\t;;\n        spu-*)\n\t\tos=-elf\n\t\t;;\n\t*-acorn)\n\t\tos=-riscix1.2\n\t\t;;\n\tarm*-rebel)\n\t\tos=-linux\n\t\t;;\n\tarm*-semi)\n\t\tos=-aout\n\t\t;;\n        c4x-* | tic4x-*)\n        \tos=-coff\n\t\t;;\n\t# This must come before the *-dec entry.\n\tpdp10-*)\n\t\tos=-tops20\n\t\t;;\n\tpdp11-*)\n\t\tos=-none\n\t\t;;\n\t*-dec | vax-*)\n\t\tos=-ultrix4.2\n\t\t;;\n\tm68*-apollo)\n\t\tos=-domain\n\t\t;;\n\ti386-sun)\n\t\tos=-sunos4.0.2\n\t\t;;\n\tm68000-sun)\n\t\tos=-sunos3\n\t\t# This also exists in the configure program, but was not the\n\t\t# default.\n\t\t# os=-sunos4\n\t\t;;\n\tm68*-cisco)\n\t\tos=-aout\n\t\t;;\n        mep-*)\n\t\tos=-elf\n\t\t;;\n\tmips*-cisco)\n\t\tos=-elf\n\t\t;;\n\tmips*-*)\n\t\tos=-elf\n\t\t;;\n\tor32-*)\n\t\tos=-coff\n\t\t;;\n\t*-tti)\t# must be before sparc entry or we get the wrong os.\n\t\tos=-sysv3\n\t\t;;\n\tsparc-* | *-sun)\n\t\tos=-sunos4.1.1\n\t\t;;\n\t*-be)\n\t\tos=-beos\n\t\t;;\n\t*-haiku)\n\t\tos=-haiku\n\t\t;;\n\t*-ibm)\n\t\tos=-aix\n\t\t;;\n    \t*-knuth)\n\t\tos=-mmixware\n\t\t;;\n\t*-wec)\n\t\tos=-proelf\n\t\t;;\n\t*-winbond)\n\t\tos=-proelf\n\t\t;;\n\t*-oki)\n\t\tos=-proelf\n\t\t;;\n\t*-hp)\n\t\tos=-hpux\n\t\t;;\n\t*-hitachi)\n\t\tos=-hiux\n\t\t;;\n\ti860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)\n\t\tos=-sysv\n\t\t;;\n\t*-cbm)\n\t\tos=-amigaos\n\t\t;;\n\t*-dg)\n\t\tos=-dgux\n\t\t;;\n\t*-dolphin)\n\t\tos=-sysv3\n\t\t;;\n\tm68k-ccur)\n\t\tos=-rtu\n\t\t;;\n\tm88k-omron*)\n\t\tos=-luna\n\t\t;;\n\t*-next )\n\t\tos=-nextstep\n\t\t;;\n\t*-sequent)\n\t\tos=-ptx\n\t\t;;\n\t*-crds)\n\t\tos=-unos\n\t\t;;\n\t*-ns)\n\t\tos=-genix\n\t\t;;\n\ti370-*)\n\t\tos=-mvs\n\t\t;;\n\t*-next)\n\t\tos=-nextstep3\n\t\t;;\n\t*-gould)\n\t\tos=-sysv\n\t\t;;\n\t*-highlevel)\n\t\tos=-bsd\n\t\t;;\n\t*-encore)\n\t\tos=-bsd\n\t\t;;\n\t*-sgi)\n\t\tos=-irix\n\t\t;;\n\t*-siemens)\n\t\tos=-sysv4\n\t\t;;\n\t*-masscomp)\n\t\tos=-rtu\n\t\t;;\n\tf30[01]-fujitsu | f700-fujitsu)\n\t\tos=-uxpv\n\t\t;;\n\t*-rom68k)\n\t\tos=-coff\n\t\t;;\n\t*-*bug)\n\t\tos=-coff\n\t\t;;\n\t*-apple)\n\t\tos=-macos\n\t\t;;\n\t*-atari*)\n\t\tos=-mint\n\t\t;;\n\t*)\n\t\tos=-none\n\t\t;;\nesac\nfi\n\n# Here we handle the case where we know the os, and the CPU type, but not the\n# manufacturer.  We pick the logical manufacturer.\nvendor=unknown\ncase $basic_machine in\n\t*-unknown)\n\t\tcase $os in\n\t\t\t-riscix*)\n\t\t\t\tvendor=acorn\n\t\t\t\t;;\n\t\t\t-sunos*)\n\t\t\t\tvendor=sun\n\t\t\t\t;;\n\t\t\t-aix*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-beos*)\n\t\t\t\tvendor=be\n\t\t\t\t;;\n\t\t\t-hpux*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-mpeix*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-hiux*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-unos*)\n\t\t\t\tvendor=crds\n\t\t\t\t;;\n\t\t\t-dgux*)\n\t\t\t\tvendor=dg\n\t\t\t\t;;\n\t\t\t-luna*)\n\t\t\t\tvendor=omron\n\t\t\t\t;;\n\t\t\t-genix*)\n\t\t\t\tvendor=ns\n\t\t\t\t;;\n\t\t\t-mvs* | -opened*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-os400*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-ptx*)\n\t\t\t\tvendor=sequent\n\t\t\t\t;;\n\t\t\t-tpf*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-vxsim* | -vxworks* | -windiss*)\n\t\t\t\tvendor=wrs\n\t\t\t\t;;\n\t\t\t-aux*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-hms*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-mpw* | -macos*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\t\t\tvendor=atari\n\t\t\t\t;;\n\t\t\t-vos*)\n\t\t\t\tvendor=stratus\n\t\t\t\t;;\n\t\tesac\n\t\tbasic_machine=`echo $basic_machine | sed \"s/unknown/$vendor/\"`\n\t\t;;\nesac\n\necho $basic_machine$os\nexit\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/configure",
    "content": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.65 for glog 0.3.1.\n#\n# Report bugs to <opensource@google.com>.\n#\n#\n# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,\n# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,\n# Inc.\n#\n#\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nif test \"x$CONFIG_SHELL\" = x; then\n  as_bourne_compatible=\"if test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\"\n  as_required=\"as_fn_return () { (exit \\$1); }\nas_fn_success () { as_fn_return 0; }\nas_fn_failure () { as_fn_return 1; }\nas_fn_ret_success () { return 0; }\nas_fn_ret_failure () { return 1; }\n\nexitcode=0\nas_fn_success || { exitcode=1; echo as_fn_success failed.; }\nas_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }\nas_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }\nas_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }\nif ( set x; as_fn_ret_success y && test x = \\\"\\$1\\\" ); then :\n\nelse\n  exitcode=1; echo positional parameters were not saved.\nfi\ntest x\\$exitcode = x0 || exit 1\"\n  as_suggested=\"  as_lineno_1=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_1a=\\$LINENO\n  as_lineno_2=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_2a=\\$LINENO\n  eval 'test \\\"x\\$as_lineno_1'\\$as_run'\\\" != \\\"x\\$as_lineno_2'\\$as_run'\\\" &&\n  test \\\"x\\`expr \\$as_lineno_1'\\$as_run' + 1\\`\\\" = \\\"x\\$as_lineno_2'\\$as_run'\\\"' || exit 1\ntest \\$(( 1 + 1 )) = 2 || exit 1\"\n  if (eval \"$as_required\") 2>/dev/null; then :\n  as_have_required=yes\nelse\n  as_have_required=no\nfi\n  if test x$as_have_required = xyes && (eval \"$as_suggested\") 2>/dev/null; then :\n\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nas_found=false\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  as_found=:\n  case $as_dir in #(\n\t /*)\n\t   for as_base in sh bash ksh sh5; do\n\t     # Try only shells that exist, to save several forks.\n\t     as_shell=$as_dir/$as_base\n\t     if { test -f \"$as_shell\" || test -f \"$as_shell.exe\"; } &&\n\t\t    { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$as_shell as_have_required=yes\n\t\t   if { $as_echo \"$as_bourne_compatible\"\"$as_suggested\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  break 2\nfi\nfi\n\t   done;;\n       esac\n  as_found=false\ndone\n$as_found || { if { test -f \"$SHELL\" || test -f \"$SHELL.exe\"; } &&\n\t      { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$SHELL\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$SHELL as_have_required=yes\nfi; }\nIFS=$as_save_IFS\n\n\n      if test \"x$CONFIG_SHELL\" != x; then :\n  # We cannot yet assume a decent shell, so we have to provide a\n\t# neutralization value for shells without unset; and this also\n\t# works around shells that cannot unset nonexistent variables.\n\tBASH_ENV=/dev/null\n\tENV=/dev/null\n\t(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\n\texport CONFIG_SHELL\n\texec \"$CONFIG_SHELL\" \"$as_myself\" ${1+\"$@\"}\nfi\n\n    if test x$as_have_required = xno; then :\n  $as_echo \"$0: This script requires a shell more modern than all\"\n  $as_echo \"$0: the shells that I found on your system.\"\n  if test x${ZSH_VERSION+set} = xset ; then\n    $as_echo \"$0: In particular, zsh $ZSH_VERSION has bugs and should\"\n    $as_echo \"$0: be upgraded to zsh 4.3.4 or later.\"\n  else\n    $as_echo \"$0: Please tell bug-autoconf@gnu.org and\n$0: opensource@google.com about your system, including any\n$0: error possibly output before this message. Then install\n$0: a modern shell, or manually run the script under such a\n$0: shell if you do have one.\"\n  fi\n  exit 1\nfi\nfi\nfi\nSHELL=${CONFIG_SHELL-/bin/sh}\nexport SHELL\n# Unset more variables known to interfere with behavior of common tools.\nCLICOLOR_FORCE= GREP_OPTIONS=\nunset CLICOLOR_FORCE GREP_OPTIONS\n\n## --------------------- ##\n## M4sh Shell Functions. ##\n## --------------------- ##\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\n# as_fn_error ERROR [LINENO LOG_FD]\n# ---------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with status $?, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$?; test $as_status -eq 0 && as_status=1\n  if test \"$3\"; then\n    as_lineno=${as_lineno-\"$2\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $1\" >&$3\n  fi\n  $as_echo \"$as_me: error: $1\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n\n  as_lineno_1=$LINENO as_lineno_1a=$LINENO\n  as_lineno_2=$LINENO as_lineno_2a=$LINENO\n  eval 'test \"x$as_lineno_1'$as_run'\" != \"x$as_lineno_2'$as_run'\" &&\n  test \"x`expr $as_lineno_1'$as_run' + 1`\" = \"x$as_lineno_2'$as_run'\"' || {\n  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)\n  sed -n '\n    p\n    /[$]LINENO/=\n  ' <$as_myself |\n    sed '\n      s/[$]LINENO.*/&-/\n      t lineno\n      b\n      :lineno\n      N\n      :loop\n      s/[$]LINENO\\([^'$as_cr_alnum'_].*\\n\\)\\(.*\\)/\\2\\1\\2/\n      t loop\n      s/-\\n.*//\n    ' >$as_me.lineno &&\n  chmod +x \"$as_me.lineno\" ||\n    { $as_echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2; as_fn_exit 1; }\n\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensitive to this).\n  . \"./$as_me.lineno\"\n  # Exit status is that of the last command.\n  exit\n}\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -p'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -p'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -p'\n  fi\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nif test -x / >/dev/null 2>&1; then\n  as_test_x='test -x'\nelse\n  if ls -dL / >/dev/null 2>&1; then\n    as_ls_L_option=L\n  else\n    as_ls_L_option=\n  fi\n  as_test_x='\n    eval sh -c '\\''\n      if test -d \"$1\"; then\n\ttest -d \"$1/.\";\n      else\n\tcase $1 in #(\n\t-*)set \"./$1\";;\n\tesac;\n\tcase `ls -ld'$as_ls_L_option' \"$1\" 2>/dev/null` in #((\n\t???[sx]*):;;*)false;;esac;fi\n    '\\'' sh\n  '\nfi\nas_executable_p=$as_test_x\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\n\n# Check that we are running under the correct shell.\nSHELL=${CONFIG_SHELL-/bin/sh}\n\ncase X$lt_ECHO in\nX*--fallback-echo)\n  # Remove one level of quotation (which was required for Make).\n  ECHO=`echo \"$lt_ECHO\" | sed 's,\\\\\\\\\\$\\\\$0,'$0','`\n  ;;\nesac\n\nECHO=${lt_ECHO-echo}\nif test \"X$1\" = X--no-reexec; then\n  # Discard the --no-reexec flag, and continue.\n  shift\nelif test \"X$1\" = X--fallback-echo; then\n  # Avoid inline document here, it may be left over\n  :\nelif test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t' ; then\n  # Yippee, $ECHO works!\n  :\nelse\n  # Restart under the correct shell.\n  exec $SHELL \"$0\" --no-reexec ${1+\"$@\"}\nfi\n\nif test \"X$1\" = X--fallback-echo; then\n  # used as fallback echo\n  shift\n  cat <<_LT_EOF\n$*\n_LT_EOF\n  exit 0\nfi\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nif test -z \"$lt_ECHO\"; then\n  if test \"X${echo_test_string+set}\" != Xset; then\n    # find a string as large as possible, as long as the shell can cope with it\n    for cmd in 'sed 50q \"$0\"' 'sed 20q \"$0\"' 'sed 10q \"$0\"' 'sed 2q \"$0\"' 'echo test'; do\n      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...\n      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&\n\t { test \"X$echo_test_string\" = \"X$echo_test_string\"; } 2>/dev/null\n      then\n        break\n      fi\n    done\n  fi\n\n  if test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t' &&\n     echo_testing_string=`{ $ECHO \"$echo_test_string\"; } 2>/dev/null` &&\n     test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n    :\n  else\n    # The Solaris, AIX, and Digital Unix default echo programs unquote\n    # backslashes.  This makes it impossible to quote backslashes using\n    #   echo \"$something\" | sed 's/\\\\/\\\\\\\\/g'\n    #\n    # So, first we look for a working echo in the user's PATH.\n\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for dir in $PATH /usr/ucb; do\n      IFS=\"$lt_save_ifs\"\n      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&\n         test \"X`($dir/echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n         echo_testing_string=`($dir/echo \"$echo_test_string\") 2>/dev/null` &&\n         test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n        ECHO=\"$dir/echo\"\n        break\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n\n    if test \"X$ECHO\" = Xecho; then\n      # We didn't find a better echo, so look for alternatives.\n      if test \"X`{ print -r '\\t'; } 2>/dev/null`\" = 'X\\t' &&\n         echo_testing_string=`{ print -r \"$echo_test_string\"; } 2>/dev/null` &&\n         test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n        # This shell has a builtin print -r that does the trick.\n        ECHO='print -r'\n      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&\n\t   test \"X$CONFIG_SHELL\" != X/bin/ksh; then\n        # If we have ksh, try running configure again with it.\n        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}\n        export ORIGINAL_CONFIG_SHELL\n        CONFIG_SHELL=/bin/ksh\n        export CONFIG_SHELL\n        exec $CONFIG_SHELL \"$0\" --no-reexec ${1+\"$@\"}\n      else\n        # Try using printf.\n        ECHO='printf %s\\n'\n        if test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t' &&\n\t   echo_testing_string=`{ $ECHO \"$echo_test_string\"; } 2>/dev/null` &&\n\t   test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t  # Cool, printf works\n\t  :\n        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL \"$0\" --fallback-echo '\\t') 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = 'X\\t' &&\n\t     echo_testing_string=`($ORIGINAL_CONFIG_SHELL \"$0\" --fallback-echo \"$echo_test_string\") 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL\n\t  export CONFIG_SHELL\n\t  SHELL=\"$CONFIG_SHELL\"\n\t  export SHELL\n\t  ECHO=\"$CONFIG_SHELL $0 --fallback-echo\"\n        elif echo_testing_string=`($CONFIG_SHELL \"$0\" --fallback-echo '\\t') 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = 'X\\t' &&\n\t     echo_testing_string=`($CONFIG_SHELL \"$0\" --fallback-echo \"$echo_test_string\") 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t  ECHO=\"$CONFIG_SHELL $0 --fallback-echo\"\n        else\n\t  # maybe with a smaller string...\n\t  prev=:\n\n\t  for cmd in 'echo test' 'sed 2q \"$0\"' 'sed 10q \"$0\"' 'sed 20q \"$0\"' 'sed 50q \"$0\"'; do\n\t    if { test \"X$echo_test_string\" = \"X`eval $cmd`\"; } 2>/dev/null\n\t    then\n\t      break\n\t    fi\n\t    prev=\"$cmd\"\n\t  done\n\n\t  if test \"$prev\" != 'sed 50q \"$0\"'; then\n\t    echo_test_string=`eval $prev`\n\t    export echo_test_string\n\t    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} \"$0\" ${1+\"$@\"}\n\t  else\n\t    # Oops.  We lost completely, so just stick with echo.\n\t    ECHO=echo\n\t  fi\n        fi\n      fi\n    fi\n  fi\nfi\n\n# Copy echo and quote the copy suitably for passing to libtool from\n# the Makefile, instead of quoting the original, which is used later.\nlt_ECHO=$ECHO\nif test \"X$lt_ECHO\" = \"X$CONFIG_SHELL $0 --fallback-echo\"; then\n   lt_ECHO=\"$CONFIG_SHELL \\\\\\$\\$0 --fallback-echo\"\nfi\n\n\n\n\ntest -n \"$DJDIR\" || exec 7<&0 </dev/null\nexec 6>&1\n\n# Name of the host.\n# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_clean_files=\nac_config_libobj_dir=.\nLIBOBJS=\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\n\n# Identity of this package.\nPACKAGE_NAME='glog'\nPACKAGE_TARNAME='glog'\nPACKAGE_VERSION='0.3.1'\nPACKAGE_STRING='glog 0.3.1'\nPACKAGE_BUGREPORT='opensource@google.com'\nPACKAGE_URL=''\n\nac_unique_file=\"README\"\n# Factoring default headers for most tests.\nac_includes_default=\"\\\n#include <stdio.h>\n#ifdef HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#ifdef STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# ifdef HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#ifdef HAVE_STRING_H\n# if !defined STDC_HEADERS && defined HAVE_MEMORY_H\n#  include <memory.h>\n# endif\n# include <string.h>\n#endif\n#ifdef HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n#ifdef HAVE_STDINT_H\n# include <stdint.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\"\n\nac_subst_vars='am__EXEEXT_FALSE\nam__EXEEXT_TRUE\nLTLIBOBJS\nLIBOBJS\nGMOCK_LIBS\nGTEST_LIBS\nGFLAGS_LIBS\nGMOCK_CFLAGS\nGTEST_CFLAGS\nGFLAGS_CFLAGS\nac_cv_have_libgflags\nac_cv_have___uint16\nac_cv_have_u_int16_t\nac_cv_have_uint16_t\nac_cv_have_unistd_h\nac_cv_have_inttypes_h\nac_cv_have_systypes_h\nac_cv_have_stdint_h\nac_cv_have___builtin_expect\nac_cv___attribute___printf_4_5\nac_cv___attribute___noreturn\nac_cv_cxx_using_operator\nac_google_namespace\nac_google_end_namespace\nac_google_start_namespace\nUNWIND_LIBS\nHAVE_GMOCK_FALSE\nHAVE_GMOCK_TRUE\nGMOCK_CONFIG\nGTEST_CONFIG\nPTHREAD_CFLAGS\nPTHREAD_LIBS\nPTHREAD_CC\nacx_pthread_config\nX86_64_FALSE\nX86_64_TRUE\nENABLE_FRAME_POINTERS_FALSE\nENABLE_FRAME_POINTERS_TRUE\nLIBTOOL_DEPS\nCXXCPP\nOTOOL64\nOTOOL\nLIPO\nNMEDIT\nDSYMUTIL\nlt_ECHO\nRANLIB\nAR\nOBJDUMP\nLN_S\nNM\nac_ct_DUMPBIN\nDUMPBIN\nLD\nFGREP\nEGREP\nGREP\nSED\nhost_os\nhost_vendor\nhost_cpu\nhost\nbuild_os\nbuild_vendor\nbuild_cpu\nbuild\nLIBTOOL\nGCC_FALSE\nGCC_TRUE\nam__fastdepCXX_FALSE\nam__fastdepCXX_TRUE\nCXXDEPMODE\nac_ct_CXX\nCXXFLAGS\nCXX\nCPP\nam__fastdepCC_FALSE\nam__fastdepCC_TRUE\nCCDEPMODE\nAMDEPBACKSLASH\nAMDEP_FALSE\nAMDEP_TRUE\nam__quote\nam__include\nDEPDIR\nOBJEXT\nEXEEXT\nac_ct_CC\nCPPFLAGS\nLDFLAGS\nCFLAGS\nCC\nam__untar\nam__tar\nAMTAR\nam__leading_dot\nSET_MAKE\nAWK\nmkdir_p\nMKDIR_P\nINSTALL_STRIP_PROGRAM\nSTRIP\ninstall_sh\nMAKEINFO\nAUTOHEADER\nAUTOMAKE\nAUTOCONF\nACLOCAL\nVERSION\nPACKAGE\nCYGPATH_W\nam__isrc\nINSTALL_DATA\nINSTALL_SCRIPT\nINSTALL_PROGRAM\ntarget_alias\nhost_alias\nbuild_alias\nLIBS\nECHO_T\nECHO_N\nECHO_C\nDEFS\nmandir\nlocaledir\nlibdir\npsdir\npdfdir\ndvidir\nhtmldir\ninfodir\ndocdir\noldincludedir\nincludedir\nlocalstatedir\nsharedstatedir\nsysconfdir\ndatadir\ndatarootdir\nlibexecdir\nsbindir\nbindir\nprogram_transform_name\nprefix\nexec_prefix\nPACKAGE_URL\nPACKAGE_BUGREPORT\nPACKAGE_STRING\nPACKAGE_VERSION\nPACKAGE_TARNAME\nPACKAGE_NAME\nPATH_SEPARATOR\nSHELL'\nac_subst_files=''\nac_user_opts='\nenable_option_checking\nenable_dependency_tracking\nenable_shared\nenable_static\nwith_pic\nenable_fast_install\nwith_gnu_ld\nenable_libtool_lock\nenable_frame_pointers\nwith_gflags\nenable_namespace\n'\n      ac_precious_vars='build_alias\nhost_alias\ntarget_alias\nCC\nCFLAGS\nLDFLAGS\nLIBS\nCPPFLAGS\nCPP\nCXX\nCXXFLAGS\nCCC\nCXXCPP'\n\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\nac_unrecognized_opts=\nac_unrecognized_sep=\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\n# (The list follows the same order as the GNU Coding Standards.)\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatarootdir='${prefix}/share'\ndatadir='${datarootdir}'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ndocdir='${datarootdir}/doc/${PACKAGE_TARNAME}'\ninfodir='${datarootdir}/info'\nhtmldir='${docdir}'\ndvidir='${docdir}'\npdfdir='${docdir}'\npsdir='${docdir}'\nlibdir='${exec_prefix}/lib'\nlocaledir='${datarootdir}/locale'\nmandir='${datarootdir}/man'\n\nac_prev=\nac_dashdash=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval $ac_prev=\\$ac_option\n    ac_prev=\n    continue\n  fi\n\n  case $ac_option in\n  *=*)\tac_optarg=`expr \"X$ac_option\" : '[^=]*=\\(.*\\)'` ;;\n  *)\tac_optarg=yes ;;\n  esac\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case $ac_dashdash$ac_option in\n  --)\n    ac_dashdash=yes ;;\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=*)\n    datadir=$ac_optarg ;;\n\n  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \\\n  | --dataroo | --dataro | --datar)\n    ac_prev=datarootdir ;;\n  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \\\n  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)\n    datarootdir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=no ;;\n\n  -docdir | --docdir | --docdi | --doc | --do)\n    ac_prev=docdir ;;\n  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)\n    docdir=$ac_optarg ;;\n\n  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)\n    ac_prev=dvidir ;;\n  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)\n    dvidir=$ac_optarg ;;\n\n  -enable-* | --enable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=\\$ac_optarg ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)\n    ac_prev=htmldir ;;\n  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \\\n  | --ht=*)\n    htmldir=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localedir | --localedir | --localedi | --localed | --locale)\n    ac_prev=localedir ;;\n  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)\n    localedir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst | --locals)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)\n    ac_prev=pdfdir ;;\n  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)\n    pdfdir=$ac_optarg ;;\n\n  -psdir | --psdir | --psdi | --psd | --ps)\n    ac_prev=psdir ;;\n  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)\n    psdir=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=\\$ac_optarg ;;\n\n  -without-* | --without-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=no ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) as_fn_error \"unrecognized option: \\`$ac_option'\nTry \\`$0 --help' for more information.\"\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    case $ac_envvar in #(\n      '' | [0-9]* | *[!_$as_cr_alnum]* )\n      as_fn_error \"invalid variable name: \\`$ac_envvar'\" ;;\n    esac\n    eval $ac_envvar=\\$ac_optarg\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    $as_echo \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      $as_echo \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  as_fn_error \"missing argument to $ac_option\"\nfi\n\nif test -n \"$ac_unrecognized_opts\"; then\n  case $enable_option_checking in\n    no) ;;\n    fatal) as_fn_error \"unrecognized options: $ac_unrecognized_opts\" ;;\n    *)     $as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2 ;;\n  esac\nfi\n\n# Check all directory arguments for consistency.\nfor ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n\t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n\t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n\t\tlibdir localedir mandir\ndo\n  eval ac_val=\\$$ac_var\n  # Remove trailing slashes.\n  case $ac_val in\n    */ )\n      ac_val=`expr \"X$ac_val\" : 'X\\(.*[^/]\\)' \\| \"X$ac_val\" : 'X\\(.*\\)'`\n      eval $ac_var=\\$ac_val;;\n  esac\n  # Be sure to have absolute directory names.\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* )  continue;;\n    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;\n  esac\n  as_fn_error \"expected an absolute directory name for --$ac_var: $ac_val\"\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n    $as_echo \"$as_me: WARNING: If you wanted to set the --build type, don't use --host.\n    If a cross compiler is detected then cross compile mode will be used.\" >&2\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\nac_pwd=`pwd` && test -n \"$ac_pwd\" &&\nac_ls_di=`ls -di .` &&\nac_pwd_ls_di=`cd \"$ac_pwd\" && ls -di .` ||\n  as_fn_error \"working directory cannot be determined\"\ntest \"X$ac_ls_di\" = \"X$ac_pwd_ls_di\" ||\n  as_fn_error \"pwd does not report name of working directory\"\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then the parent directory.\n  ac_confdir=`$as_dirname -- \"$as_myself\" ||\n$as_expr X\"$as_myself\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_myself\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_myself\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r \"$srcdir/$ac_unique_file\"; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r \"$srcdir/$ac_unique_file\"; then\n  test \"$ac_srcdir_defaulted\" = yes && srcdir=\"$ac_confdir or ..\"\n  as_fn_error \"cannot find sources ($ac_unique_file) in $srcdir\"\nfi\nac_msg=\"sources are in $srcdir, but \\`cd $srcdir' does not work\"\nac_abs_confdir=`(\n\tcd \"$srcdir\" && test -r \"./$ac_unique_file\" || as_fn_error \"$ac_msg\"\n\tpwd)`\n# When building in place, set srcdir=.\nif test \"$ac_abs_confdir\" = \"$ac_pwd\"; then\n  srcdir=.\nfi\n# Remove unnecessary trailing slashes from srcdir.\n# Double slashes in file names in object file debugging info\n# mess up M-x gdb in Emacs.\ncase $srcdir in\n*/) srcdir=`expr \"X$srcdir\" : 'X\\(.*[^/]\\)' \\| \"X$srcdir\" : 'X\\(.*\\)'`;;\nesac\nfor ac_var in $ac_precious_vars; do\n  eval ac_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_env_${ac_var}_value=\\$${ac_var}\n  eval ac_cv_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_cv_env_${ac_var}_value=\\$${ac_var}\ndone\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures glog 0.3.1 to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR            user executables [EPREFIX/bin]\n  --sbindir=DIR           system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR        program executables [EPREFIX/libexec]\n  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n  --libdir=DIR            object code libraries [EPREFIX/lib]\n  --includedir=DIR        C header files [PREFIX/include]\n  --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]\n  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]\n  --infodir=DIR           info documentation [DATAROOTDIR/info]\n  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]\n  --mandir=DIR            man documentation [DATAROOTDIR/man]\n  --docdir=DIR            documentation root [DATAROOTDIR/doc/glog]\n  --htmldir=DIR           html documentation [DOCDIR]\n  --dvidir=DIR            dvi documentation [DOCDIR]\n  --pdfdir=DIR            pdf documentation [DOCDIR]\n  --psdir=DIR             ps documentation [DOCDIR]\n_ACEOF\n\n  cat <<\\_ACEOF\n\nProgram names:\n  --program-prefix=PREFIX            prepend PREFIX to installed program names\n  --program-suffix=SUFFIX            append SUFFIX to installed program names\n  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names\n\nSystem types:\n  --build=BUILD     configure for building on BUILD [guessed]\n  --host=HOST       cross-compile to build programs to run on HOST [BUILD]\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n  case $ac_init_help in\n     short | recursive ) echo \"Configuration of glog 0.3.1:\";;\n   esac\n  cat <<\\_ACEOF\n\nOptional Features:\n  --disable-option-checking  ignore unrecognized --enable/--with options\n  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)\n  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]\n  --disable-dependency-tracking  speeds up one-time build\n  --enable-dependency-tracking   do not reject slow dependency extractors\n  --enable-shared[=PKGS]  build shared libraries [default=yes]\n  --enable-static[=PKGS]  build static libraries [default=yes]\n  --enable-fast-install[=PKGS]\n                          optimize for fast installation [default=yes]\n  --disable-libtool-lock  avoid locking (might break parallel builds)\n  --enable-frame-pointers On x86_64 systems, compile with\n                          -fno-omit-frame-pointer (see INSTALL)\n  --enable-namespace=FOO to define these Google\n                             classes in the FOO namespace. --disable-namespace\n                             to define them in the global namespace. Default\n                             is to define them in namespace google.\n\nOptional Packages:\n  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]\n  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)\n  --with-pic              try to use only PIC/non-PIC objects [default=use\n                          both]\n  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]\n                          --with-gflags=GFLAGS_DIR\n\nSome influential environment variables:\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  LIBS        libraries to pass to the linker, e.g. -l<library>\n  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if\n              you have headers in a nonstandard directory <include dir>\n  CPP         C preprocessor\n  CXX         C++ compiler command\n  CXXFLAGS    C++ compiler flags\n  CXXCPP      C++ preprocessor\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\nReport bugs to <opensource@google.com>.\n_ACEOF\nac_status=$?\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d \"$ac_dir\" ||\n      { cd \"$srcdir\" && ac_pwd=`pwd` && srcdir=. && test -d \"$ac_dir\"; } ||\n      continue\n    ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n    cd \"$ac_dir\" || { ac_status=$?; continue; }\n    # Check for guested configure.\n    if test -f \"$ac_srcdir/configure.gnu\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure.gnu\" --help=recursive\n    elif test -f \"$ac_srcdir/configure\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure\" --help=recursive\n    else\n      $as_echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi || ac_status=$?\n    cd \"$ac_pwd\" || { ac_status=$?; break; }\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit $ac_status\nif $ac_init_version; then\n  cat <<\\_ACEOF\nglog configure 0.3.1\ngenerated by GNU Autoconf 2.65\n\nCopyright (C) 2009 Free Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit\nfi\n\n## ------------------------ ##\n## Autoconf initialization. ##\n## ------------------------ ##\n\n# ac_fn_c_try_compile LINENO\n# --------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_compile\n\n# ac_fn_c_try_cpp LINENO\n# ----------------------\n# Try to preprocess conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_cpp ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } >/dev/null && {\n\t test -z \"$ac_c_preproc_warn_flag$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n    ac_retval=1\nfi\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_cpp\n\n# ac_fn_cxx_try_compile LINENO\n# ----------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_cxx_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_compile\n\n# ac_fn_c_try_link LINENO\n# -----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_link ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest$ac_exeext\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t $as_test_x conftest$ac_exeext\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information\n  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would\n  # interfere with the next link command; also delete a directory that is\n  # left behind by Apple's compiler.  We do this before executing the actions.\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_link\n\n# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists and can be compiled using the include files in\n# INCLUDES, setting the cache variable VAR accordingly.\nac_fn_c_check_header_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif { as_var=$3; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n\n} # ac_fn_c_check_header_compile\n\n# ac_fn_c_try_run LINENO\n# ----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes\n# that executables *can* be run.\nac_fn_c_try_run ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: program exited with status $ac_status\" >&5\n       $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n       ac_retval=$ac_status\nfi\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_run\n\n# ac_fn_c_check_func LINENO FUNC VAR\n# ----------------------------------\n# Tests whether FUNC exists, setting the cache variable VAR accordingly\nac_fn_c_check_func ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif { as_var=$3; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n/* Define $2 to an innocuous variant, in case <limits.h> declares $2.\n   For example, HP-UX 11i <limits.h> declares gettimeofday.  */\n#define $2 innocuous_$2\n\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $2 (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\n#undef $2\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar $2 ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined __stub_$2 || defined __stub___$2\nchoke me\n#endif\n\nint\nmain ()\n{\nreturn $2 ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n\n} # ac_fn_c_check_func\n\n# ac_fn_cxx_try_cpp LINENO\n# ------------------------\n# Try to preprocess conftest.$ac_ext, and return whether this succeeded.\nac_fn_cxx_try_cpp ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } >/dev/null && {\n\t test -z \"$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n    ac_retval=1\nfi\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_cpp\n\n# ac_fn_cxx_try_link LINENO\n# -------------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded.\nac_fn_cxx_try_link ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest$ac_exeext\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_cxx_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t $as_test_x conftest$ac_exeext\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information\n  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would\n  # interfere with the next link command; also delete a directory that is\n  # left behind by Apple's compiler.  We do this before executing the actions.\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_link\n\n# ac_fn_cxx_try_run LINENO\n# ------------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes\n# that executables *can* be run.\nac_fn_cxx_try_run ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: program exited with status $ac_status\" >&5\n       $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n       ac_retval=$ac_status\nfi\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_try_run\n\n# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES\n# ---------------------------------------------------------\n# Tests whether HEADER exists, giving a warning if it cannot be compiled using\n# the include files in INCLUDES and setting the cache variable VAR\n# accordingly.\nac_fn_cxx_check_header_mongrel ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { as_var=$3; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif { as_var=$3; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nelse\n  # Is the header compilable?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 usability\" >&5\n$as_echo_n \"checking $2 usability... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_header_compiler=yes\nelse\n  ac_header_compiler=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler\" >&5\n$as_echo \"$ac_header_compiler\" >&6; }\n\n# Is the header present?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 presence\" >&5\n$as_echo_n \"checking $2 presence... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <$2>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  ac_header_preproc=yes\nelse\n  ac_header_preproc=no\nfi\nrm -f conftest.err conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc\" >&5\n$as_echo \"$ac_header_preproc\" >&6; }\n\n# So?  What about this header?\ncase $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((\n  yes:no: )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&5\n$as_echo \"$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\n  no:yes:* )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled\" >&5\n$as_echo \"$as_me: WARNING: $2: present but cannot be compiled\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?\" >&5\n$as_echo \"$as_me: WARNING: $2:     check for missing prerequisite headers?\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation\" >&5\n$as_echo \"$as_me: WARNING: $2: see the Autoconf documentation\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&5\n$as_echo \"$as_me: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n( cat <<\\_ASBOX\n## ------------------------------------ ##\n## Report this to opensource@google.com ##\n## ------------------------------------ ##\n_ASBOX\n     ) | sed \"s/^/$as_me: WARNING:     /\" >&2\n    ;;\nesac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif { as_var=$3; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=\\$ac_header_compiler\"\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nfi\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n\n} # ac_fn_cxx_check_header_mongrel\n\n# ac_fn_cxx_compute_int LINENO EXPR VAR INCLUDES\n# ----------------------------------------------\n# Tries to find the compile-time value of EXPR in a program that includes\n# INCLUDES, setting VAR accordingly. Returns whether the value could be\n# computed\nac_fn_cxx_compute_int ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if test \"$cross_compiling\" = yes; then\n    # Depending upon the size, compute the lo and hi bounds.\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nstatic int test_array [1 - 2 * !(($2) >= 0)];\ntest_array [0] = 0\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_lo=0 ac_mid=0\n  while :; do\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nstatic int test_array [1 - 2 * !(($2) <= $ac_mid)];\ntest_array [0] = 0\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_hi=$ac_mid; break\nelse\n  as_fn_arith $ac_mid + 1 && ac_lo=$as_val\n\t\t\tif test $ac_lo -le $ac_mid; then\n\t\t\t  ac_lo= ac_hi=\n\t\t\t  break\n\t\t\tfi\n\t\t\tas_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  done\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nstatic int test_array [1 - 2 * !(($2) < 0)];\ntest_array [0] = 0\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_hi=-1 ac_mid=-1\n  while :; do\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nstatic int test_array [1 - 2 * !(($2) >= $ac_mid)];\ntest_array [0] = 0\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_lo=$ac_mid; break\nelse\n  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val\n\t\t\tif test $ac_mid -le $ac_hi; then\n\t\t\t  ac_lo= ac_hi=\n\t\t\t  break\n\t\t\tfi\n\t\t\tas_fn_arith 2 '*' $ac_mid && ac_mid=$as_val\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  done\nelse\n  ac_lo= ac_hi=\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n# Binary search between lo and hi bounds.\nwhile test \"x$ac_lo\" != \"x$ac_hi\"; do\n  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nstatic int test_array [1 - 2 * !(($2) <= $ac_mid)];\ntest_array [0] = 0\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_hi=$ac_mid\nelse\n  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\ndone\ncase $ac_lo in #((\n?*) eval \"$3=\\$ac_lo\"; ac_retval=0 ;;\n'') ac_retval=1 ;;\nesac\n  else\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nstatic long int longval () { return $2; }\nstatic unsigned long int ulongval () { return $2; }\n#include <stdio.h>\n#include <stdlib.h>\nint\nmain ()\n{\n\n  FILE *f = fopen (\"conftest.val\", \"w\");\n  if (! f)\n    return 1;\n  if (($2) < 0)\n    {\n      long int i = longval ();\n      if (i != ($2))\n\treturn 1;\n      fprintf (f, \"%ld\", i);\n    }\n  else\n    {\n      unsigned long int i = ulongval ();\n      if (i != ($2))\n\treturn 1;\n      fprintf (f, \"%lu\", i);\n    }\n  /* Do not output a trailing newline, as this causes \\r\\n confusion\n     on some platforms.  */\n  return ferror (f) || fclose (f) != 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_run \"$LINENO\"; then :\n  echo >>conftest.val; read $3 <conftest.val; ac_retval=0\nelse\n  ac_retval=1\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nrm -f conftest.val\n\n  fi\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_cxx_compute_int\n\n# ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES\n# ---------------------------------------------\n# Tests whether TYPE exists after having included INCLUDES, setting cache\n# variable VAR accordingly.\nac_fn_cxx_check_type ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif { as_var=$3; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=no\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nif (sizeof ($2))\n\t return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nif (sizeof (($2)))\n\t    return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\nelse\n  eval \"$3=yes\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n\n} # ac_fn_cxx_check_type\n\n# ac_fn_cxx_check_func LINENO FUNC VAR\n# ------------------------------------\n# Tests whether FUNC exists, setting the cache variable VAR accordingly\nac_fn_cxx_check_func ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif { as_var=$3; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n/* Define $2 to an innocuous variant, in case <limits.h> declares $2.\n   For example, HP-UX 11i <limits.h> declares gettimeofday.  */\n#define $2 innocuous_$2\n\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $2 (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\n#undef $2\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar $2 ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined __stub_$2 || defined __stub___$2\nchoke me\n#endif\n\nint\nmain ()\n{\nreturn $2 ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n\n} # ac_fn_cxx_check_func\ncat >config.log <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by glog $as_me 0.3.1, which was\ngenerated by GNU Autoconf 2.65.  Invocation command line was\n\n  $ $0 $@\n\n_ACEOF\nexec 5>>config.log\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\n/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    $as_echo \"PATH: $as_dir\"\n  done\nIFS=$as_save_IFS\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\\'*)\n      ac_arg=`$as_echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) as_fn_append ac_configure_args0 \" '$ac_arg'\" ;;\n    2)\n      as_fn_append ac_configure_args1 \" '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n\tac_must_keep_next=false # Got value, back to normal.\n      else\n\tcase $ac_arg in\n\t  *=* | --config-cache | -C | -disable-* | --disable-* \\\n\t  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n\t  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n\t  | -with-* | --with-* | -without-* | --without-* | --x)\n\t    case \"$ac_configure_args0 \" in\n\t      \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n\t    esac\n\t    ;;\n\t  -* ) ac_must_keep_next=true ;;\n\tesac\n      fi\n      as_fn_append ac_configure_args \" '$ac_arg'\"\n      ;;\n    esac\n  done\ndone\n{ ac_configure_args0=; unset ac_configure_args0;}\n{ ac_configure_args1=; unset ac_configure_args1;}\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Use '\\'' to represent an apostrophe within the trap.\n# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.\ntrap 'exit_status=$?\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    cat <<\\_ASBOX\n## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\n_ASBOX\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n(\n  for ac_var in `(set) 2>&1 | sed -n '\\''s/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'\\''`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n  (set) 2>&1 |\n    case $as_nl`(ac_space='\\'' '\\''; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      sed -n \\\n\t\"s/'\\''/'\\''\\\\\\\\'\\'''\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\''\\\\2'\\''/p\"\n      ;; #(\n    *)\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n)\n    echo\n\n    cat <<\\_ASBOX\n## ----------------- ##\n## Output variables. ##\n## ----------------- ##\n_ASBOX\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=\\$$ac_var\n      case $ac_val in\n      *\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n      esac\n      $as_echo \"$ac_var='\\''$ac_val'\\''\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      cat <<\\_ASBOX\n## ------------------- ##\n## File substitutions. ##\n## ------------------- ##\n_ASBOX\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=\\$$ac_var\n\tcase $ac_val in\n\t*\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n\tesac\n\t$as_echo \"$ac_var='\\''$ac_val'\\''\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      cat <<\\_ASBOX\n## ----------- ##\n## confdefs.h. ##\n## ----------- ##\n_ASBOX\n      echo\n      cat confdefs.h\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      $as_echo \"$as_me: caught signal $ac_signal\"\n    $as_echo \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core *.core core.conftest.* &&\n    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -f -r conftest* confdefs.h\n\n$as_echo \"/* confdefs.h */\" > confdefs.h\n\n# Predefined preprocessor variables.\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_NAME \"$PACKAGE_NAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_VERSION \"$PACKAGE_VERSION\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_STRING \"$PACKAGE_STRING\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_URL \"$PACKAGE_URL\"\n_ACEOF\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer an explicitly selected file to automatically selected ones.\nac_site_file1=NONE\nac_site_file2=NONE\nif test -n \"$CONFIG_SITE\"; then\n  ac_site_file1=$CONFIG_SITE\nelif test \"x$prefix\" != xNONE; then\n  ac_site_file1=$prefix/share/config.site\n  ac_site_file2=$prefix/etc/config.site\nelse\n  ac_site_file1=$ac_default_prefix/share/config.site\n  ac_site_file2=$ac_default_prefix/etc/config.site\nfi\nfor ac_site_file in \"$ac_site_file1\" \"$ac_site_file2\"\ndo\n  test \"x$ac_site_file\" = xNONE && continue\n  if test /dev/null != \"$ac_site_file\" && test -r \"$ac_site_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file\" >&5\n$as_echo \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\"\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special files\n  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.\n  if test /dev/null != \"$cache_file\" && test -f \"$cache_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading cache $cache_file\" >&5\n$as_echo \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: creating cache $cache_file\" >&5\n$as_echo \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in $ac_precious_vars; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\\$ac_cv_env_${ac_var}_value\n  eval ac_new_val=\\$ac_env_${ac_var}_value\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was not set in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n\t# differences in whitespace do not lead to failure.\n\tac_old_val_w=`echo x $ac_old_val`\n\tac_new_val_w=`echo x $ac_new_val`\n\tif test \"$ac_old_val_w\" != \"$ac_new_val_w\"; then\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' has changed since the previous run:\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n\t  ac_cache_corrupted=:\n\telse\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&5\n$as_echo \"$as_me: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&2;}\n\t  eval $ac_var=\\$ac_old_val\n\tfi\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   former value:  \\`$ac_old_val'\" >&5\n$as_echo \"$as_me:   former value:  \\`$ac_old_val'\" >&2;}\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   current value: \\`$ac_new_val'\" >&5\n$as_echo \"$as_me:   current value: \\`$ac_new_val'\" >&2;}\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\\'*) ac_arg=$ac_var=`$as_echo \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) as_fn_append ac_configure_args \" '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build\" >&5\n$as_echo \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  as_fn_error \"run \\`make distclean' and/or \\`rm $cache_file' and start over\" \"$LINENO\" 5\nfi\n## -------------------- ##\n## Main body of script. ##\n## -------------------- ##\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n# The argument here is just something that should be in the current directory\n# (for sanity checking)\n\n\nam__api_version='1.11'\n\nac_aux_dir=\nfor ac_dir in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"; do\n  for ac_t in install-sh install.sh shtool; do\n    if test -f \"$ac_dir/$ac_t\"; then\n      ac_aux_dir=$ac_dir\n      ac_install_sh=\"$ac_aux_dir/$ac_t -c\"\n      break 2\n    fi\n  done\ndone\nif test -z \"$ac_aux_dir\"; then\n  as_fn_error \"cannot find install-sh, install.sh, or shtool in \\\"$srcdir\\\" \\\"$srcdir/..\\\" \\\"$srcdir/../..\\\"\" \"$LINENO\" 5\nfi\n\n# These three variables are undocumented and unsupported,\n# and are intended to be withdrawn in a future Autoconf release.\n# They can cause serious problems if a builder's source tree is in a directory\n# whose full name contains unusual characters.\nac_config_guess=\"$SHELL $ac_aux_dir/config.guess\"  # Please don't use this var.\nac_config_sub=\"$SHELL $ac_aux_dir/config.sub\"  # Please don't use this var.\nac_configure=\"$SHELL $ac_aux_dir/configure\"  # Please don't use this var.\n\n\n# Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AmigaOS /C/install, which installs bootblocks on floppy discs\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# OS/2's system install, which has a completely different semantic\n# ./install, which can be erroneously created by make from ./install.sh.\n# Reject install programs that cannot install multiple files.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install\" >&5\n$as_echo_n \"checking for a BSD-compatible install... \" >&6; }\nif test -z \"$INSTALL\"; then\nif test \"${ac_cv_path_install+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    # Account for people who put trailing slashes in PATH elements.\ncase $as_dir/ in #((\n  ./ | .// | /[cC]/* | \\\n  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \\\n  ?:[\\\\/]os2[\\\\/]install[\\\\/]* | ?:[\\\\/]OS2[\\\\/]INSTALL[\\\\/]* | \\\n  /usr/ucb/* ) ;;\n  *)\n    # OSF1 and SCO ODT 3.0 have their own names for install.\n    # Don't use installbsd from OSF since it installs stuff as root\n    # by default.\n    for ac_prog in ginstall scoinst install; do\n      for ac_exec_ext in '' $ac_executable_extensions; do\n\tif { test -f \"$as_dir/$ac_prog$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_prog$ac_exec_ext\"; }; then\n\t  if test $ac_prog = install &&\n\t    grep dspmsg \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  elif test $ac_prog = install &&\n\t    grep pwplus \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # program-specific install script used by HP pwplus--don't use.\n\t    :\n\t  else\n\t    rm -rf conftest.one conftest.two conftest.dir\n\t    echo one > conftest.one\n\t    echo two > conftest.two\n\t    mkdir conftest.dir\n\t    if \"$as_dir/$ac_prog$ac_exec_ext\" -c conftest.one conftest.two \"`pwd`/conftest.dir\" &&\n\t      test -s conftest.one && test -s conftest.two &&\n\t      test -s conftest.dir/conftest.one &&\n\t      test -s conftest.dir/conftest.two\n\t    then\n\t      ac_cv_path_install=\"$as_dir/$ac_prog$ac_exec_ext -c\"\n\t      break 3\n\t    fi\n\t  fi\n\tfi\n      done\n    done\n    ;;\nesac\n\n  done\nIFS=$as_save_IFS\n\nrm -rf conftest.one conftest.two conftest.dir\n\nfi\n  if test \"${ac_cv_path_install+set}\" = set; then\n    INSTALL=$ac_cv_path_install\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    INSTALL=$ac_install_sh\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INSTALL\" >&5\n$as_echo \"$INSTALL\" >&6; }\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether build environment is sane\" >&5\n$as_echo_n \"checking whether build environment is sane... \" >&6; }\n# Just in case\nsleep 1\necho timestamp > conftest.file\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]*)\n    as_fn_error \"unsafe absolute working directory name\" \"$LINENO\" 5;;\nesac\ncase $srcdir in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]*)\n    as_fn_error \"unsafe srcdir value: \\`$srcdir'\" \"$LINENO\" 5;;\nesac\n\n# Do `set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n   if test \"$*\" = \"X\"; then\n      # -L didn't work.\n      set X `ls -t \"$srcdir/configure\" conftest.file`\n   fi\n   rm -f conftest.file\n   if test \"$*\" != \"X $srcdir/configure conftest.file\" \\\n      && test \"$*\" != \"X conftest.file $srcdir/configure\"; then\n\n      # If neither matched, then we have a broken ls.  This can happen\n      # if, for instance, CONFIG_SHELL is bash and it inherits a\n      # broken ls alias from the environment.  This has actually\n      # happened.  Such a system could not be considered \"sane\".\n      as_fn_error \"ls -t appears to fail.  Make sure there is not a broken\nalias in your environment\" \"$LINENO\" 5\n   fi\n\n   test \"$2\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   as_fn_error \"newly created file is older than distributed files!\nCheck your system clock\" \"$LINENO\" 5\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\ntest \"$program_prefix\" != NONE &&\n  program_transform_name=\"s&^&$program_prefix&;$program_transform_name\"\n# Use a double $ so make ignores it.\ntest \"$program_suffix\" != NONE &&\n  program_transform_name=\"s&\\$&$program_suffix&;$program_transform_name\"\n# Double any \\ or $.\n# By default was `s,x,x', remove it if useless.\nac_script='s/[\\\\$]/&&/g;s/;s,x,x,$//'\nprogram_transform_name=`$as_echo \"$program_transform_name\" | sed \"$ac_script\"`\n\n# expand $ac_aux_dir to an absolute path\nam_aux_dir=`cd $ac_aux_dir && pwd`\n\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --run true\"; then\n  am_missing_run=\"$MISSING --run \"\nelse\n  am_missing_run=\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: \\`missing' script is too old or missing\" >&5\n$as_echo \"$as_me: WARNING: \\`missing' script is too old or missing\" >&2;}\nfi\n\nif test x\"${install_sh}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\n\n# Installed binaries are usually stripped using `strip' when the user\n# run `make install-strip'.  However `strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the `STRIP' environment variable to overrule this program.\nif test \"$cross_compiling\" != no; then\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_STRIP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_STRIP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p\" >&5\n$as_echo_n \"checking for a thread-safe mkdir -p... \" >&6; }\nif test -z \"$MKDIR_P\"; then\n  if test \"${ac_cv_path_mkdir+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in mkdir gmkdir; do\n\t for ac_exec_ext in '' $ac_executable_extensions; do\n\t   { test -f \"$as_dir/$ac_prog$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_prog$ac_exec_ext\"; } || continue\n\t   case `\"$as_dir/$ac_prog$ac_exec_ext\" --version 2>&1` in #(\n\t     'mkdir (GNU coreutils) '* | \\\n\t     'mkdir (coreutils) '* | \\\n\t     'mkdir (fileutils) '4.1*)\n\t       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext\n\t       break 3;;\n\t   esac\n\t done\n       done\n  done\nIFS=$as_save_IFS\n\nfi\n\n  test -d ./--version && rmdir ./--version\n  if test \"${ac_cv_path_mkdir+set}\" = set; then\n    MKDIR_P=\"$ac_cv_path_mkdir -p\"\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for MKDIR_P within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    MKDIR_P=\"$ac_install_sh -d\"\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MKDIR_P\" >&5\n$as_echo \"$MKDIR_P\" >&6; }\n\nmkdir_p=\"$MKDIR_P\"\ncase $mkdir_p in\n  [\\\\/$]* | ?:[\\\\/]*) ;;\n  */*) mkdir_p=\"\\$(top_builddir)/$mkdir_p\" ;;\nesac\n\nfor ac_prog in gawk mawk nawk awk\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_AWK+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AWK\"; then\n  ac_cv_prog_AWK=\"$AWK\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_AWK=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAWK=$ac_cv_prog_AWK\nif test -n \"$AWK\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AWK\" >&5\n$as_echo \"$AWK\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$AWK\" && break\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \\$(MAKE)\" >&5\n$as_echo_n \"checking whether ${MAKE-make} sets \\$(MAKE)... \" >&6; }\nset x ${MAKE-make}\nac_make=`$as_echo \"$2\" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`\nif { as_var=ac_cv_prog_make_${ac_make}_set; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.make <<\\_ACEOF\nSHELL = /bin/sh\nall:\n\t@echo '@@@%%%=$(MAKE)=@@@%%%'\n_ACEOF\n# GNU make sometimes prints \"make[1]: Entering...\", which would confuse us.\ncase `${MAKE-make} -f conftest.make 2>/dev/null` in\n  *@@@%%%=?*=@@@%%%*)\n    eval ac_cv_prog_make_${ac_make}_set=yes;;\n  *)\n    eval ac_cv_prog_make_${ac_make}_set=no;;\nesac\nrm -f conftest.make\nfi\nif eval test \\$ac_cv_prog_make_${ac_make}_set = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  SET_MAKE=\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n  SET_MAKE=\"MAKE=${MAKE-make}\"\nfi\n\nrm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\n\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  am__isrc=' -I$(srcdir)'\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    as_fn_error \"source directory already configured; run \\\"make distclean\\\" there first\" \"$LINENO\" 5\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\n\n\n# Define the identity of the package.\n PACKAGE='glog'\n VERSION='0.3.1'\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE \"$PACKAGE\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define VERSION \"$VERSION\"\n_ACEOF\n\n# Some tools Automake needs.\n\nACLOCAL=${ACLOCAL-\"${am_missing_run}aclocal-${am__api_version}\"}\n\n\nAUTOCONF=${AUTOCONF-\"${am_missing_run}autoconf\"}\n\n\nAUTOMAKE=${AUTOMAKE-\"${am_missing_run}automake-${am__api_version}\"}\n\n\nAUTOHEADER=${AUTOHEADER-\"${am_missing_run}autoheader\"}\n\n\nMAKEINFO=${MAKEINFO-\"${am_missing_run}makeinfo\"}\n\n# We need awk for the \"check\" target.  The system \"awk\" is bad on\n# some platforms.\n# Always define AMTAR for backward compatibility.\n\nAMTAR=${AMTAR-\"${am_missing_run}tar\"}\n\nam__tar='${AMTAR} chof - \"$$tardir\"'; am__untar='${AMTAR} xf -'\n\n\n\n\n\nac_config_headers=\"$ac_config_headers src/config.h\"\n\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n\n# Checks for programs.\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CC+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_CC+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CC+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CC+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CC+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_CC+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.out.dSYM a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler works\" >&5\n$as_echo_n \"checking whether the C compiler works... \" >&6; }\nac_link_default=`$as_echo \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\n\n# The possible output files:\nac_files=\"a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*\"\n\nac_rmfiles=\nfor ac_file in $ac_files\ndo\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    * ) ac_rmfiles=\"$ac_rmfiles $ac_file\";;\n  esac\ndone\nrm -f $ac_rmfiles\n\nif { { ac_try=\"$ac_link_default\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link_default\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.\n# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'\n# in a Makefile.  We should not override ac_cv_exeext if it was cached,\n# so that the user can short-circuit this test for compilers unknown to\n# Autoconf.\nfor ac_file in $ac_files ''\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )\n\t;;\n    [ab].out )\n\t# We found the default executable, but exeext='' is most\n\t# certainly right.\n\tbreak;;\n    *.* )\n\tif test \"${ac_cv_exeext+set}\" = set && test \"$ac_cv_exeext\" != no;\n\tthen :; else\n\t   ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\tfi\n\t# We set ac_cv_exeext here because the later test for it is not\n\t# safe: cross compilers may not add the suffix if given an `-o'\n\t# argument, so we may need to know it at that point already.\n\t# Even if this section looks crufty: it has the advantage of\n\t# actually working.\n\tbreak;;\n    * )\n\tbreak;;\n  esac\ndone\ntest \"$ac_cv_exeext\" = no && ac_cv_exeext=\n\nelse\n  ac_file=''\nfi\nif test -z \"$ac_file\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n$as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n{ as_fn_set_status 77\nas_fn_error \"C compiler cannot create executables\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name\" >&5\n$as_echo_n \"checking for C compiler default output file name... \" >&6; }\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_file\" >&5\n$as_echo \"$ac_file\" >&6; }\nac_exeext=$ac_cv_exeext\n\nrm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of executables\" >&5\n$as_echo_n \"checking for suffix of executables... \" >&6; }\nif { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t  break;;\n    * ) break;;\n  esac\ndone\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error \"cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }\nfi\nrm -f conftest conftest$ac_cv_exeext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext\" >&5\n$as_echo \"$ac_cv_exeext\" >&6; }\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nFILE *f = fopen (\"conftest.out\", \"w\");\n return ferror (f) || fclose (f) != 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files=\"$ac_clean_files conftest.out\"\n# Check that the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling\" >&5\n$as_echo_n \"checking whether we are cross compiling... \" >&6; }\nif test \"$cross_compiling\" != yes; then\n  { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n  if { ac_try='./conftest$ac_cv_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error \"cannot run C compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }\n    fi\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $cross_compiling\" >&5\n$as_echo \"$cross_compiling\" >&6; }\n\nrm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of object files\" >&5\n$as_echo_n \"checking for suffix of object files... \" >&6; }\nif test \"${ac_cv_objext+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  for ac_file in conftest.o conftest.obj conftest.*; do\n  test -f \"$ac_file\" || continue;\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error \"cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }\nfi\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext\" >&5\n$as_echo \"$ac_cv_objext\" >&6; }\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C compiler... \" >&6; }\nif test \"${ac_cv_c_compiler_gnu+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\n$as_echo \"$ac_cv_c_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\n$as_echo_n \"checking whether $CC accepts -g... \" >&6; }\nif test \"${ac_cv_prog_cc_g+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nelse\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\n$as_echo \"$ac_cv_prog_cc_g\" >&6; }\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif test \"${ac_cv_prog_cc_c89+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c89\" != xno; then :\n\nfi\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\nDEPDIR=\"${am__leading_dot}deps\"\n\nac_config_commands=\"$ac_config_commands depfiles\"\n\n\nam_make=${MAKE-make}\ncat > confinc << 'END'\nam__doit:\n\t@echo this is the am__doit target\n.PHONY: am__doit\nEND\n# If we don't find an include directive, just comment out the code.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make\" >&5\n$as_echo_n \"checking for style of include used by $am_make... \" >&6; }\nam__include=\"#\"\nam__quote=\n_am_result=none\n# First try GNU make style include.\necho \"include confinc\" > confmf\n# Ignore all kinds of additional output from `make'.\ncase `$am_make -s -f confmf 2> /dev/null` in #(\n*the\\ am__doit\\ target*)\n  am__include=include\n  am__quote=\n  _am_result=GNU\n  ;;\nesac\n# Now try BSD make style include.\nif test \"$am__include\" = \"#\"; then\n   echo '.include \"confinc\"' > confmf\n   case `$am_make -s -f confmf 2> /dev/null` in #(\n   *the\\ am__doit\\ target*)\n     am__include=.include\n     am__quote=\"\\\"\"\n     _am_result=BSD\n     ;;\n   esac\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $_am_result\" >&5\n$as_echo \"$_am_result\" >&6; }\nrm -f confinc confmf\n\n# Check whether --enable-dependency-tracking was given.\nif test \"${enable_dependency_tracking+set}\" = set; then :\n  enableval=$enable_dependency_tracking;\nfi\n\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\nfi\n if test \"x$enable_dependency_tracking\" != xno; then\n  AMDEP_TRUE=\n  AMDEP_FALSE='#'\nelse\n  AMDEP_TRUE='#'\n  AMDEP_FALSE=\nfi\n\n\n\ndepcc=\"$CC\"   am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif test \"${am_cv_CC_dependencies_compiler_type+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CC_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CC_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CC_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CC_dependencies_compiler_type\" >&6; }\nCCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CC_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCC_TRUE=\n  am__fastdepCC_FALSE='#'\nelse\n  am__fastdepCC_TRUE='#'\n  am__fastdepCC_FALSE=\nfi\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor\" >&5\n$as_echo_n \"checking how to run the C preprocessor... \" >&6; }\n# On Suns, sometimes $CPP names a directory.\nif test -n \"$CPP\" && test -d \"$CPP\"; then\n  CPP=\nfi\nif test -z \"$CPP\"; then\n  if test \"${ac_cv_prog_CPP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CPP needs to be expanded\n    for CPP in \"$CC -E\" \"$CC -E -traditional-cpp\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CPP=$CPP\n\nfi\n  CPP=$ac_cv_prog_CPP\nelse\n  ac_cv_prog_CPP=$CPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CPP\" >&5\n$as_echo \"$CPP\" >&6; }\nac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error \"C preprocessor \\\"$CPP\\\" fails sanity check\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }\nfi\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\nif test -z \"$CXX\"; then\n  if test -n \"$CCC\"; then\n    CXX=$CCC\n  else\n    if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CXX+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CXX\"; then\n  ac_cv_prog_CXX=\"$CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CXX=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCXX=$ac_cv_prog_CXX\nif test -n \"$CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CXX\" >&5\n$as_echo \"$CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CXX\" && break\n  done\nfi\nif test -z \"$CXX\"; then\n  ac_ct_CXX=$CXX\n  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_CXX+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CXX\"; then\n  ac_cv_prog_ac_ct_CXX=\"$ac_ct_CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CXX=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CXX=$ac_cv_prog_ac_ct_CXX\nif test -n \"$ac_ct_CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX\" >&5\n$as_echo \"$ac_ct_CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CXX\" && break\ndone\n\n  if test \"x$ac_ct_CXX\" = x; then\n    CXX=\"g++\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CXX=$ac_ct_CXX\n  fi\nfi\n\n  fi\nfi\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C++ compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C++ compiler... \" >&6; }\nif test \"${ac_cv_cxx_compiler_gnu+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_cxx_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu\" >&5\n$as_echo \"$ac_cv_cxx_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GXX=yes\nelse\n  GXX=\nfi\nac_test_CXXFLAGS=${CXXFLAGS+set}\nac_save_CXXFLAGS=$CXXFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g\" >&5\n$as_echo_n \"checking whether $CXX accepts -g... \" >&6; }\nif test \"${ac_cv_prog_cxx_g+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_cxx_werror_flag=$ac_cxx_werror_flag\n   ac_cxx_werror_flag=yes\n   ac_cv_prog_cxx_g=no\n   CXXFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cxx_g=yes\nelse\n  CXXFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\nelse\n  ac_cxx_werror_flag=$ac_save_cxx_werror_flag\n\t CXXFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cxx_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_cxx_werror_flag=$ac_save_cxx_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g\" >&5\n$as_echo \"$ac_cv_prog_cxx_g\" >&6; }\nif test \"$ac_test_CXXFLAGS\" = set; then\n  CXXFLAGS=$ac_save_CXXFLAGS\nelif test $ac_cv_prog_cxx_g = yes; then\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-g -O2\"\n  else\n    CXXFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-O2\"\n  else\n    CXXFLAGS=\n  fi\nfi\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\ndepcc=\"$CXX\"  am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif test \"${am_cv_CXX_dependencies_compiler_type+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CXX_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CXX_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CXX_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CXX_dependencies_compiler_type\" >&6; }\nCXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CXX_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCXX_TRUE=\n  am__fastdepCXX_FALSE='#'\nelse\n  am__fastdepCXX_TRUE='#'\n  am__fastdepCXX_FALSE=\nfi\n\n\n if test \"$GCC\" = yes; then\n  GCC_TRUE=\n  GCC_FALSE='#'\nelse\n  GCC_TRUE='#'\n  GCC_FALSE=\nfi\n   # let the Makefile know if we're gcc\n\ncase `pwd` in\n  *\\ * | *\\\t*)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \\`pwd\\`\" >&5\n$as_echo \"$as_me: WARNING: Libtool does not cope well with whitespace in \\`pwd\\`\" >&2;} ;;\nesac\n\n\n\nmacro_version='2.2.6b'\nmacro_revision='1.3017'\n\n\n\n\n\n\n\n\n\n\n\n\n\nltmain=\"$ac_aux_dir/ltmain.sh\"\n\n# Make sure we can run config.sub.\n$SHELL \"$ac_aux_dir/config.sub\" sun4 >/dev/null 2>&1 ||\n  as_fn_error \"cannot run $SHELL $ac_aux_dir/config.sub\" \"$LINENO\" 5\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking build system type\" >&5\n$as_echo_n \"checking build system type... \" >&6; }\nif test \"${ac_cv_build+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_build_alias=$build_alias\ntest \"x$ac_build_alias\" = x &&\n  ac_build_alias=`$SHELL \"$ac_aux_dir/config.guess\"`\ntest \"x$ac_build_alias\" = x &&\n  as_fn_error \"cannot guess build type; you must specify one\" \"$LINENO\" 5\nac_cv_build=`$SHELL \"$ac_aux_dir/config.sub\" $ac_build_alias` ||\n  as_fn_error \"$SHELL $ac_aux_dir/config.sub $ac_build_alias failed\" \"$LINENO\" 5\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_build\" >&5\n$as_echo \"$ac_cv_build\" >&6; }\ncase $ac_cv_build in\n*-*-*) ;;\n*) as_fn_error \"invalid value of canonical build\" \"$LINENO\" 5;;\nesac\nbuild=$ac_cv_build\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_build\nshift\nbuild_cpu=$1\nbuild_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nbuild_os=$*\nIFS=$ac_save_IFS\ncase $build_os in *\\ *) build_os=`echo \"$build_os\" | sed 's/ /-/g'`;; esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking host system type\" >&5\n$as_echo_n \"checking host system type... \" >&6; }\nif test \"${ac_cv_host+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"x$host_alias\" = x; then\n  ac_cv_host=$ac_cv_build\nelse\n  ac_cv_host=`$SHELL \"$ac_aux_dir/config.sub\" $host_alias` ||\n    as_fn_error \"$SHELL $ac_aux_dir/config.sub $host_alias failed\" \"$LINENO\" 5\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_host\" >&5\n$as_echo \"$ac_cv_host\" >&6; }\ncase $ac_cv_host in\n*-*-*) ;;\n*) as_fn_error \"invalid value of canonical host\" \"$LINENO\" 5;;\nesac\nhost=$ac_cv_host\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_host\nshift\nhost_cpu=$1\nhost_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nhost_os=$*\nIFS=$ac_save_IFS\ncase $host_os in *\\ *) host_os=`echo \"$host_os\" | sed 's/ /-/g'`;; esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output\" >&5\n$as_echo_n \"checking for a sed that does not truncate output... \" >&6; }\nif test \"${ac_cv_path_SED+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/\n     for ac_i in 1 2 3 4 5 6 7; do\n       ac_script=\"$ac_script$as_nl$ac_script\"\n     done\n     echo \"$ac_script\" 2>/dev/null | sed 99q >conftest.sed\n     { ac_script=; unset ac_script;}\n     if test -z \"$SED\"; then\n  ac_path_SED_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in sed gsed; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_SED=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_SED\" && $as_test_x \"$ac_path_SED\"; } || continue\n# Check for GNU ac_path_SED and select it if it is found.\n  # Check for GNU $ac_path_SED\ncase `\"$ac_path_SED\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_SED=\"$ac_path_SED\" ac_path_SED_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo '' >> \"conftest.nl\"\n    \"$ac_path_SED\" -f conftest.sed < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_SED_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_SED=\"$ac_path_SED\"\n      ac_path_SED_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_SED_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_SED\"; then\n    as_fn_error \"no acceptable sed could be found in \\$PATH\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_SED=$SED\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED\" >&5\n$as_echo \"$ac_cv_path_SED\" >&6; }\n SED=\"$ac_cv_path_SED\"\n  rm -f conftest.sed\n\ntest -z \"$SED\" && SED=sed\nXsed=\"$SED -e 1s/^X//\"\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e\" >&5\n$as_echo_n \"checking for grep that handles long lines and -e... \" >&6; }\nif test \"${ac_cv_path_GREP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$GREP\"; then\n  ac_path_GREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in grep ggrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_GREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_GREP\" && $as_test_x \"$ac_path_GREP\"; } || continue\n# Check for GNU ac_path_GREP and select it if it is found.\n  # Check for GNU $ac_path_GREP\ncase `\"$ac_path_GREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_GREP=\"$ac_path_GREP\" ac_path_GREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'GREP' >> \"conftest.nl\"\n    \"$ac_path_GREP\" -e 'GREP$' -e '-(cannot match)-' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_GREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_GREP=\"$ac_path_GREP\"\n      ac_path_GREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_GREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_GREP\"; then\n    as_fn_error \"no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_GREP=$GREP\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP\" >&5\n$as_echo \"$ac_cv_path_GREP\" >&6; }\n GREP=\"$ac_cv_path_GREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for egrep\" >&5\n$as_echo_n \"checking for egrep... \" >&6; }\nif test \"${ac_cv_path_EGREP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1\n   then ac_cv_path_EGREP=\"$GREP -E\"\n   else\n     if test -z \"$EGREP\"; then\n  ac_path_EGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in egrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_EGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_EGREP\" && $as_test_x \"$ac_path_EGREP\"; } || continue\n# Check for GNU ac_path_EGREP and select it if it is found.\n  # Check for GNU $ac_path_EGREP\ncase `\"$ac_path_EGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_EGREP=\"$ac_path_EGREP\" ac_path_EGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'EGREP' >> \"conftest.nl\"\n    \"$ac_path_EGREP\" 'EGREP$' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_EGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_EGREP=\"$ac_path_EGREP\"\n      ac_path_EGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_EGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_EGREP\"; then\n    as_fn_error \"no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_EGREP=$EGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP\" >&5\n$as_echo \"$ac_cv_path_EGREP\" >&6; }\n EGREP=\"$ac_cv_path_EGREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for fgrep\" >&5\n$as_echo_n \"checking for fgrep... \" >&6; }\nif test \"${ac_cv_path_FGREP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1\n   then ac_cv_path_FGREP=\"$GREP -F\"\n   else\n     if test -z \"$FGREP\"; then\n  ac_path_FGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in fgrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_FGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_FGREP\" && $as_test_x \"$ac_path_FGREP\"; } || continue\n# Check for GNU ac_path_FGREP and select it if it is found.\n  # Check for GNU $ac_path_FGREP\ncase `\"$ac_path_FGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_FGREP=\"$ac_path_FGREP\" ac_path_FGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'FGREP' >> \"conftest.nl\"\n    \"$ac_path_FGREP\" FGREP < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_FGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_FGREP=\"$ac_path_FGREP\"\n      ac_path_FGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_FGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_FGREP\"; then\n    as_fn_error \"no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_FGREP=$FGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP\" >&5\n$as_echo \"$ac_cv_path_FGREP\" >&6; }\n FGREP=\"$ac_cv_path_FGREP\"\n\n\ntest -z \"$GREP\" && GREP=grep\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# Check whether --with-gnu-ld was given.\nif test \"${with_gnu_ld+set}\" = set; then :\n  withval=$with_gnu_ld; test \"$withval\" = no || with_gnu_ld=yes\nelse\n  with_gnu_ld=no\nfi\n\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ld used by $CC\" >&5\n$as_echo_n \"checking for ld used by $CC... \" >&6; }\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [\\\\/]* | ?:[\\\\/]*)\n      re_direlt='/[^/][^/]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GNU ld\" >&5\n$as_echo_n \"checking for GNU ld... \" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for non-GNU ld\" >&5\n$as_echo_n \"checking for non-GNU ld... \" >&6; }\nfi\nif test \"${lt_cv_path_LD+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$LD\"; then\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break\n\t;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break\n\t;;\n      esac\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi\nfi\n\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LD\" >&5\n$as_echo \"$LD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\ntest -z \"$LD\" && as_fn_error \"no acceptable ld found in \\$PATH\" \"$LINENO\" 5\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld\" >&5\n$as_echo_n \"checking if the linker ($LD) is GNU ld... \" >&6; }\nif test \"${lt_cv_prog_gnu_ld+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  # I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld\" >&5\n$as_echo \"$lt_cv_prog_gnu_ld\" >&6; }\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)\" >&5\n$as_echo_n \"checking for BSD- or MS-compatible name lister (nm)... \" >&6; }\nif test \"${lt_cv_path_NM+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=\"$NM\"\nelse\n  lt_nm_to_check=\"${ac_tool_prefix}nm\"\n  if test -n \"$ac_tool_prefix\" && test \"$build\" = \"$host\"; then\n    lt_nm_to_check=\"$lt_nm_to_check nm\"\n  fi\n  for lt_tmp_nm in $lt_nm_to_check; do\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do\n      IFS=\"$lt_save_ifs\"\n      test -z \"$ac_dir\" && ac_dir=.\n      tmp_nm=\"$ac_dir/$lt_tmp_nm\"\n      if test -f \"$tmp_nm\" || test -f \"$tmp_nm$ac_exeext\" ; then\n\t# Check to see if the nm accepts a BSD-compat flag.\n\t# Adding the `sed 1q' prevents false positives on HP-UX, which says:\n\t#   nm: unknown option \"B\" ignored\n\t# Tru64's nm complains that /dev/null is an invalid object file\n\tcase `\"$tmp_nm\" -B /dev/null 2>&1 | sed '1q'` in\n\t*/dev/null* | *'Invalid file or object type'*)\n\t  lt_cv_path_NM=\"$tmp_nm -B\"\n\t  break\n\t  ;;\n\t*)\n\t  case `\"$tmp_nm\" -p /dev/null 2>&1 | sed '1q'` in\n\t  */dev/null*)\n\t    lt_cv_path_NM=\"$tmp_nm -p\"\n\t    break\n\t    ;;\n\t  *)\n\t    lt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\t    continue # so that we can try to find one that supports BSD flags\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n  done\n  : ${lt_cv_path_NM=no}\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM\" >&5\n$as_echo \"$lt_cv_path_NM\" >&6; }\nif test \"$lt_cv_path_NM\" != \"no\"; then\n  NM=\"$lt_cv_path_NM\"\nelse\n  # Didn't find any BSD compatible name lister, look for dumpbin.\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in \"dumpbin -symbols\" \"link -dump -symbols\"\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_DUMPBIN+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DUMPBIN\"; then\n  ac_cv_prog_DUMPBIN=\"$DUMPBIN\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_DUMPBIN=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDUMPBIN=$ac_cv_prog_DUMPBIN\nif test -n \"$DUMPBIN\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DUMPBIN\" >&5\n$as_echo \"$DUMPBIN\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$DUMPBIN\" && break\n  done\nfi\nif test -z \"$DUMPBIN\"; then\n  ac_ct_DUMPBIN=$DUMPBIN\n  for ac_prog in \"dumpbin -symbols\" \"link -dump -symbols\"\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_DUMPBIN+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DUMPBIN\"; then\n  ac_cv_prog_ac_ct_DUMPBIN=\"$ac_ct_DUMPBIN\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_DUMPBIN=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN\nif test -n \"$ac_ct_DUMPBIN\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN\" >&5\n$as_echo \"$ac_ct_DUMPBIN\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_DUMPBIN\" && break\ndone\n\n  if test \"x$ac_ct_DUMPBIN\" = x; then\n    DUMPBIN=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DUMPBIN=$ac_ct_DUMPBIN\n  fi\nfi\n\n\n  if test \"$DUMPBIN\" != \":\"; then\n    NM=\"$DUMPBIN\"\n  fi\nfi\ntest -z \"$NM\" && NM=nm\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface\" >&5\n$as_echo_n \"checking the name lister ($NM) interface... \" >&6; }\nif test \"${lt_cv_nm_interface+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_nm_interface=\"BSD nm\"\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  (eval echo \"\\\"\\$as_me:5532: $ac_compile\\\"\" >&5)\n  (eval \"$ac_compile\" 2>conftest.err)\n  cat conftest.err >&5\n  (eval echo \"\\\"\\$as_me:5535: $NM \\\\\\\"conftest.$ac_objext\\\\\\\"\\\"\" >&5)\n  (eval \"$NM \\\"conftest.$ac_objext\\\"\" 2>conftest.err > conftest.out)\n  cat conftest.err >&5\n  (eval echo \"\\\"\\$as_me:5538: output\\\"\" >&5)\n  cat conftest.out >&5\n  if $GREP 'External.*some_variable' conftest.out > /dev/null; then\n    lt_cv_nm_interface=\"MS dumpbin\"\n  fi\n  rm -f conftest*\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface\" >&5\n$as_echo \"$lt_cv_nm_interface\" >&6; }\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ln -s works\" >&5\n$as_echo_n \"checking whether ln -s works... \" >&6; }\nLN_S=$as_ln_s\nif test \"$LN_S\" = \"ln -s\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no, using $LN_S\" >&5\n$as_echo \"no, using $LN_S\" >&6; }\nfi\n\n# find the maximum length of command line arguments\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments\" >&5\n$as_echo_n \"checking the maximum length of command line arguments... \" >&6; }\nif test \"${lt_cv_sys_max_cmd_len+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n    i=0\n  teststring=\"ABCD\"\n\n  case $build_os in\n  msdosdjgpp*)\n    # On DJGPP, this test can blow up pretty badly due to problems in libc\n    # (any single argument exceeding 2000 bytes causes a buffer overrun\n    # during glob expansion).  Even if it were fixed, the result of this\n    # check would be larger than it should be.\n    lt_cv_sys_max_cmd_len=12288;    # 12K is about right\n    ;;\n\n  gnu*)\n    # Under GNU Hurd, this test is not required because there is\n    # no limit to the length of command line arguments.\n    # Libtool will interpret -1 as no limit whatsoever\n    lt_cv_sys_max_cmd_len=-1;\n    ;;\n\n  cygwin* | mingw* | cegcc*)\n    # On Win9x/ME, this test blows up -- it succeeds, but takes\n    # about 5 minutes as the teststring grows exponentially.\n    # Worse, since 9x/ME are not pre-emptively multitasking,\n    # you end up with a \"frozen\" computer, even though with patience\n    # the test eventually succeeds (with a max line length of 256k).\n    # Instead, let's just punt: use the minimum linelength reported by\n    # all of the supported platforms: 8192 (on NT/2K/XP).\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  amigaos*)\n    # On AmigaOS with pdksh, this test takes hours, literally.\n    # So we just punt and use a minimum line length of 8192.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)\n    # This has been around since 386BSD, at least.  Likely further.\n    if test -x /sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`\n    elif test -x /usr/sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`\n    else\n      lt_cv_sys_max_cmd_len=65536\t# usable default for all BSDs\n    fi\n    # And add a safety zone\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    ;;\n\n  interix*)\n    # We know the value 262144 and hardcode it with a safety zone (like BSD)\n    lt_cv_sys_max_cmd_len=196608\n    ;;\n\n  osf*)\n    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure\n    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not\n    # nice to cause kernel panics so lets avoid the loop below.\n    # First set a reasonable default.\n    lt_cv_sys_max_cmd_len=16384\n    #\n    if test -x /sbin/sysconfig; then\n      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in\n        *1*) lt_cv_sys_max_cmd_len=-1 ;;\n      esac\n    fi\n    ;;\n  sco3.2v5*)\n    lt_cv_sys_max_cmd_len=102400\n    ;;\n  sysv5* | sco5v6* | sysv4.2uw2*)\n    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`\n    if test -n \"$kargmax\"; then\n      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[\t ]//'`\n    else\n      lt_cv_sys_max_cmd_len=32768\n    fi\n    ;;\n  *)\n    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`\n    if test -n \"$lt_cv_sys_max_cmd_len\"; then\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    else\n      # Make teststring a little bigger before we do anything with it.\n      # a 1K string should be a reasonable start.\n      for i in 1 2 3 4 5 6 7 8 ; do\n        teststring=$teststring$teststring\n      done\n      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}\n      # If test is not a shell built-in, we'll probably end up computing a\n      # maximum length that is only half of the actual maximum length, but\n      # we can't tell.\n      while { test \"X\"`$SHELL $0 --fallback-echo \"X$teststring$teststring\" 2>/dev/null` \\\n\t         = \"XX$teststring$teststring\"; } >/dev/null 2>&1 &&\n\t      test $i != 17 # 1/2 MB should be enough\n      do\n        i=`expr $i + 1`\n        teststring=$teststring$teststring\n      done\n      # Only check the string length outside the loop.\n      lt_cv_sys_max_cmd_len=`expr \"X$teststring\" : \".*\" 2>&1`\n      teststring=\n      # Add a significant safety factor because C++ compilers can tack on\n      # massive amounts of additional arguments before passing them to the\n      # linker.  It appears as though 1/2 is a usable value.\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 2`\n    fi\n    ;;\n  esac\n\nfi\n\nif test -n $lt_cv_sys_max_cmd_len ; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len\" >&5\n$as_echo \"$lt_cv_sys_max_cmd_len\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none\" >&5\n$as_echo \"none\" >&6; }\nfi\nmax_cmd_len=$lt_cv_sys_max_cmd_len\n\n\n\n\n\n\n: ${CP=\"cp -f\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs\" >&5\n$as_echo_n \"checking whether the shell understands some XSI constructs... \" >&6; }\n# Try some XSI features\nxsi_shell=no\n( _lt_dummy=\"a/b/c\"\n  test \"${_lt_dummy##*/},${_lt_dummy%/*},\"${_lt_dummy%\"$_lt_dummy\"}, \\\n      = c,a/b,, \\\n    && eval 'test $(( 1 + 1 )) -eq 2 \\\n    && test \"${#_lt_dummy}\" -eq 5' ) >/dev/null 2>&1 \\\n  && xsi_shell=yes\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $xsi_shell\" >&5\n$as_echo \"$xsi_shell\" >&6; }\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the shell understands \\\"+=\\\"\" >&5\n$as_echo_n \"checking whether the shell understands \\\"+=\\\"... \" >&6; }\nlt_shell_append=no\n( foo=bar; set foo baz; eval \"$1+=\\$2\" && test \"$foo\" = barbaz ) \\\n    >/dev/null 2>&1 \\\n  && lt_shell_append=yes\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_shell_append\" >&5\n$as_echo \"$lt_shell_append\" >&6; }\n\n\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  lt_unset=unset\nelse\n  lt_unset=false\nfi\n\n\n\n\n\n# test EBCDIC or ASCII\ncase `echo X|tr X '\\101'` in\n A) # ASCII based system\n    # \\n is not interpreted correctly by Solaris 8 /usr/ucb/tr\n  lt_SP2NL='tr \\040 \\012'\n  lt_NL2SP='tr \\015\\012 \\040\\040'\n  ;;\n *) # EBCDIC based system\n  lt_SP2NL='tr \\100 \\n'\n  lt_NL2SP='tr \\r\\n \\100\\100'\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files\" >&5\n$as_echo_n \"checking for $LD option to reload object files... \" >&6; }\nif test \"${lt_cv_ld_reload_flag+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_reload_flag='-r'\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag\" >&5\n$as_echo \"$lt_cv_ld_reload_flag\" >&6; }\nreload_flag=$lt_cv_ld_reload_flag\ncase $reload_flag in\n\"\" | \" \"*) ;;\n*) reload_flag=\" $reload_flag\" ;;\nesac\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ncase $host_os in\n  darwin*)\n    if test \"$GCC\" = yes; then\n      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'\n    else\n      reload_cmds='$LD$reload_flag -o $output$reload_objs'\n    fi\n    ;;\nesac\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}objdump\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_OBJDUMP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OBJDUMP\"; then\n  ac_cv_prog_OBJDUMP=\"$OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_OBJDUMP=\"${ac_tool_prefix}objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOBJDUMP=$ac_cv_prog_OBJDUMP\nif test -n \"$OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OBJDUMP\" >&5\n$as_echo \"$OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OBJDUMP\"; then\n  ac_ct_OBJDUMP=$OBJDUMP\n  # Extract the first word of \"objdump\", so it can be a program name with args.\nset dummy objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_OBJDUMP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OBJDUMP\"; then\n  ac_cv_prog_ac_ct_OBJDUMP=\"$ac_ct_OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_OBJDUMP=\"objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP\nif test -n \"$ac_ct_OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP\" >&5\n$as_echo \"$ac_ct_OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OBJDUMP\" = x; then\n    OBJDUMP=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OBJDUMP=$ac_ct_OBJDUMP\n  fi\nelse\n  OBJDUMP=\"$ac_cv_prog_OBJDUMP\"\nfi\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries\" >&5\n$as_echo_n \"checking how to recognize dependent libraries... \" >&6; }\nif test \"${lt_cv_deplibs_check_method+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# `unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# which responds to the $file_magic_cmd with a given extended regex.\n# If you have `file' or equivalent on your system and you're not sure\n# whether `pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix[4-9]*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi[45]*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin*)\n  # func_win32_libid is a shell function defined in ltmain.sh\n  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n  lt_cv_file_magic_cmd='func_win32_libid'\n  ;;\n\nmingw* | pw32*)\n  # Base MSYS/MinGW do not provide the 'file' command needed by\n  # func_win32_libid shell function, so use a weaker test based on 'objdump',\n  # unless we find 'file', for example because we are cross-compiling.\n  if ( file / ) >/dev/null 2>&1; then\n    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n    lt_cv_file_magic_cmd='func_win32_libid'\n  else\n    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'\n    lt_cv_file_magic_cmd='$OBJDUMP -f'\n  fi\n  ;;\n\ncegcc)\n  # use the weaker test based on 'objdump'. See mingw*.\n  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nfreebsd* | dragonfly*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\ngnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20* | hpux11*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  case $host_cpu in\n  ia64*)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'\n    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so\n    ;;\n  hppa*64*)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'\n    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl\n    ;;\n  *)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'\n    lt_cv_file_magic_test_file=/usr/lib/libc.sl\n    ;;\n  esac\n  ;;\n\ninterix[3-9]*)\n  # PIC code is broken on Interix 3.x, that's why |\\.a not |_pic\\.a here\n  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so|\\.a)$'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $LD in\n  *-32|*\"-32 \") libmagic=32-bit;;\n  *-n32|*\"-n32 \") libmagic=N32;;\n  *-64|*\"-64 \") libmagic=64-bit;;\n  *) libmagic=never-match;;\n  esac\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be Linux ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nnetbsd* | netbsdelf*-gnu)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so|_pic\\.a)$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\n*nto* | *qnx*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nopenbsd*)\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|\\.so|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|_pic\\.a)$'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nrdos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.3*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  siemens)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  pc)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  esac\n  ;;\n\ntpf*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nesac\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method\" >&5\n$as_echo \"$lt_cv_deplibs_check_method\" >&6; }\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ar\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ar; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_AR+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AR\"; then\n  ac_cv_prog_AR=\"$AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_AR=\"${ac_tool_prefix}ar\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAR=$ac_cv_prog_AR\nif test -n \"$AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AR\" >&5\n$as_echo \"$AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_AR\"; then\n  ac_ct_AR=$AR\n  # Extract the first word of \"ar\", so it can be a program name with args.\nset dummy ar; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_AR+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_AR\"; then\n  ac_cv_prog_ac_ct_AR=\"$ac_ct_AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_AR=\"ar\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_AR=$ac_cv_prog_ac_ct_AR\nif test -n \"$ac_ct_AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR\" >&5\n$as_echo \"$ac_ct_AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_AR\" = x; then\n    AR=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    AR=$ac_ct_AR\n  fi\nelse\n  AR=\"$ac_cv_prog_AR\"\nfi\n\ntest -z \"$AR\" && AR=ar\ntest -z \"$AR_FLAGS\" && AR_FLAGS=cru\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_STRIP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_STRIP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\ntest -z \"$STRIP\" && STRIP=:\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ranlib\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_RANLIB+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_RANLIB=\"${ac_tool_prefix}ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nRANLIB=$ac_cv_prog_RANLIB\nif test -n \"$RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $RANLIB\" >&5\n$as_echo \"$RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_RANLIB\"; then\n  ac_ct_RANLIB=$RANLIB\n  # Extract the first word of \"ranlib\", so it can be a program name with args.\nset dummy ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_RANLIB+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_RANLIB\"; then\n  ac_cv_prog_ac_ct_RANLIB=\"$ac_ct_RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_RANLIB=\"ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB\nif test -n \"$ac_ct_RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB\" >&5\n$as_echo \"$ac_ct_RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_RANLIB\" = x; then\n    RANLIB=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    RANLIB=$ac_ct_RANLIB\n  fi\nelse\n  RANLIB=\"$ac_cv_prog_RANLIB\"\nfi\n\ntest -z \"$RANLIB\" && RANLIB=:\n\n\n\n\n\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  openbsd*)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB -t \\$oldlib\"\n    ;;\n  *)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB \\$oldlib\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$oldlib\"\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object\" >&5\n$as_echo_n \"checking command to parse $NM output from $compiler object... \" >&6; }\nif test \"${lt_cv_sys_global_symbol_pipe+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[BCDEGRST]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([_A-Za-z][_A-Za-z0-9]*\\)'\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[BCDT]'\n  ;;\ncygwin* | mingw* | pw32* | cegcc*)\n  symcode='[ABCDGISTW]'\n  ;;\nhpux*)\n  if test \"$host_cpu\" = ia64; then\n    symcode='[ABCDEGRST]'\n  fi\n  ;;\nirix* | nonstopux*)\n  symcode='[BCDEGRST]'\n  ;;\nosf*)\n  symcode='[BCDEGQRST]'\n  ;;\nsolaris*)\n  symcode='[BDRT]'\n  ;;\nsco3.2v5*)\n  symcode='[DT]'\n  ;;\nsysv4.2uw2*)\n  symcode='[DT]'\n  ;;\nsysv5* | sco5v6* | unixware* | OpenUNIX*)\n  symcode='[ABDT]'\n  ;;\nsysv4)\n  symcode='[DFNSTU]'\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\ncase `$NM -V 2>&1` in\n*GNU* | *'with BFD'*)\n  symcode='[ABCDGIRSTW]' ;;\nesac\n\n# Transform an extracted symbol line into a proper C declaration.\n# Some systems (esp. on ia64) link data and code symbols differently,\n# so use this general approach.\nlt_cv_sys_global_symbol_to_cdecl=\"sed -n -e 's/^T .* \\(.*\\)$/extern int \\1();/p' -e 's/^$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_sys_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([^ ]*\\) $/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([^ ]*\\) \\([^ ]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p'\"\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix=\"sed -n -e 's/^: \\([^ ]*\\) $/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([^ ]*\\) \\(lib[^ ]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p' -e 's/^$symcode* \\([^ ]*\\) \\([^ ]*\\)$/  {\\\"lib\\2\\\", (void *) \\&\\2},/p'\"\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $build_os in\nmingw*)\n  opt_cr=`$ECHO 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# Try without a prefix underscore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.\n  symxfrm=\"\\\\1 $ac_symprfx\\\\2 \\\\2\"\n\n  # Write the raw and C identifiers.\n  if test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n    # Fake it for dumpbin and say T for any non-static function\n    # and D for any global variable.\n    # Also find C++ and __fastcall symbols from MSVC++,\n    # which start with @ or ?.\n    lt_cv_sys_global_symbol_pipe=\"$AWK '\"\\\n\"     {last_section=section; section=\\$ 3};\"\\\n\"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};\"\\\n\"     \\$ 0!~/External *\\|/{next};\"\\\n\"     / 0+ UNDEF /{next}; / UNDEF \\([^|]\\)*()/{next};\"\\\n\"     {if(hide[section]) next};\"\\\n\"     {f=0}; \\$ 0~/\\(\\).*\\|/{f=1}; {printf f ? \\\"T \\\" : \\\"D \\\"};\"\\\n\"     {split(\\$ 0, a, /\\||\\r/); split(a[2], s)};\"\\\n\"     s[1]~/^[@?]/{print s[1], s[1]; next};\"\\\n\"     s[1]~prfx {split(s[1],t,\\\"@\\\"); print t[1], substr(t[1],length(prfx))}\"\\\n\"     ' prfx=^$ac_symprfx\"\n  else\n    lt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[\t ]\\($symcode$symcode*\\)[\t ][\t ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'\"\n  fi\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n\n  rm -f conftest*\n  cat > conftest.$ac_ext <<_LT_EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(void);\nvoid nm_test_func(void){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\n_LT_EOF\n\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$NM conftest.$ac_objext \\| $lt_cv_sys_global_symbol_pipe \\> $nlist\\\"\"; } >&5\n  (eval $NM conftest.$ac_objext \\| $lt_cv_sys_global_symbol_pipe \\> $nlist) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if $GREP ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif $GREP ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<_LT_EOF > conftest.$ac_ext\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_LT_EOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_sys_global_symbol_to_cdecl\"' < \"$nlist\" | $GREP -v main >> conftest.$ac_ext'\n\n\t  cat <<_LT_EOF >> conftest.$ac_ext\n\n/* The mapping between symbol names and symbols.  */\nconst struct {\n  const char *name;\n  void       *address;\n}\nlt__PROGRAM__LTX_preloaded_symbols[] =\n{\n  { \"@PROGRAM@\", (void *) 0 },\n_LT_EOF\n\t  $SED \"s/^$symcode$symcode* \\(.*\\) \\(.*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/\" < \"$nlist\" | $GREP -v main >> conftest.$ac_ext\n\t  cat <<\\_LT_EOF >> conftest.$ac_ext\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt__PROGRAM__LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n_LT_EOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  lt_save_LIBS=\"$LIBS\"\n\t  lt_save_CFLAGS=\"$CFLAGS\"\n\t  LIBS=\"conftstm.$ac_objext\"\n\t  CFLAGS=\"$CFLAGS$lt_prog_compiler_no_builtin_flag\"\n\t  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext}; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=\"$lt_save_LIBS\"\n\t  CFLAGS=\"$lt_save_CFLAGS\"\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&5\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&5\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&5\n    fi\n  else\n    echo \"$progname: failed program was:\" >&5\n    cat conftest.$ac_ext >&5\n  fi\n  rm -rf conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test \"$pipe_works\" = yes; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n\nfi\n\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  lt_cv_sys_global_symbol_to_cdecl=\nfi\nif test -z \"$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: failed\" >&5\n$as_echo \"failed\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# Check whether --enable-libtool-lock was given.\nif test \"${enable_libtool_lock+set}\" = set; then :\n  enableval=$enable_libtool_lock;\nfi\n\ntest \"x$enable_libtool_lock\" != xno && enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\nia64-*-hpux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.$ac_objext` in\n      *ELF-32*)\n\tHPUX_IA64_MODE=\"32\"\n\t;;\n      *ELF-64*)\n\tHPUX_IA64_MODE=\"64\"\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n*-*-irix6*)\n  # Find out which ABI we are using.\n  echo '#line 6744 \"configure\"' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    if test \"$lt_cv_prog_gnu_ld\" = yes; then\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -melf32bsmip\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -melf32bmipn32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -melf64bmip\"\n\t;;\n      esac\n    else\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -32\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -n32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -64\"\n\t  ;;\n      esac\n    fi\n  fi\n  rm -rf conftest*\n  ;;\n\nx86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \\\ns390*-*linux*|s390*-*tpf*|sparc*-*linux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.o` in\n      *32-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_i386_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_i386\"\n\t    ;;\n\t  ppc64-*linux*|powerpc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32ppclinux\"\n\t    ;;\n\t  s390x-*linux*)\n\t    LD=\"${LD-ld} -m elf_s390\"\n\t    ;;\n\t  sparc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32_sparc\"\n\t    ;;\n\tesac\n\t;;\n      *64-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_x86_64_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_x86_64\"\n\t    ;;\n\t  ppc*-*linux*|powerpc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64ppc\"\n\t    ;;\n\t  s390*-*linux*|s390*-*tpf*)\n\t    LD=\"${LD-ld} -m elf64_s390\"\n\t    ;;\n\t  sparc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64_sparc\"\n\t    ;;\n\tesac\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -belf\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf\" >&5\n$as_echo_n \"checking whether the C compiler needs -belf... \" >&6; }\nif test \"${lt_cv_cc_needs_belf+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n     cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_cc_needs_belf=yes\nelse\n  lt_cv_cc_needs_belf=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n     ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf\" >&5\n$as_echo \"$lt_cv_cc_needs_belf\" >&6; }\n  if test x\"$lt_cv_cc_needs_belf\" != x\"yes\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=\"$SAVE_CFLAGS\"\n  fi\n  ;;\nsparc*-*solaris*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.o` in\n    *64-bit*)\n      case $lt_cv_prog_gnu_ld in\n      yes*) LD=\"${LD-ld} -m elf64_sparc\" ;;\n      *)\n\tif ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then\n\t  LD=\"${LD-ld} -64\"\n\tfi\n\t;;\n      esac\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\nesac\n\nneed_locks=\"$enable_libtool_lock\"\n\n\n  case $host_os in\n    rhapsody* | darwin*)\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}dsymutil\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}dsymutil; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_DSYMUTIL+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DSYMUTIL\"; then\n  ac_cv_prog_DSYMUTIL=\"$DSYMUTIL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_DSYMUTIL=\"${ac_tool_prefix}dsymutil\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDSYMUTIL=$ac_cv_prog_DSYMUTIL\nif test -n \"$DSYMUTIL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL\" >&5\n$as_echo \"$DSYMUTIL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_DSYMUTIL\"; then\n  ac_ct_DSYMUTIL=$DSYMUTIL\n  # Extract the first word of \"dsymutil\", so it can be a program name with args.\nset dummy dsymutil; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_DSYMUTIL+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DSYMUTIL\"; then\n  ac_cv_prog_ac_ct_DSYMUTIL=\"$ac_ct_DSYMUTIL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_DSYMUTIL=\"dsymutil\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL\nif test -n \"$ac_ct_DSYMUTIL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL\" >&5\n$as_echo \"$ac_ct_DSYMUTIL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_DSYMUTIL\" = x; then\n    DSYMUTIL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DSYMUTIL=$ac_ct_DSYMUTIL\n  fi\nelse\n  DSYMUTIL=\"$ac_cv_prog_DSYMUTIL\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}nmedit\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}nmedit; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_NMEDIT+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$NMEDIT\"; then\n  ac_cv_prog_NMEDIT=\"$NMEDIT\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_NMEDIT=\"${ac_tool_prefix}nmedit\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nNMEDIT=$ac_cv_prog_NMEDIT\nif test -n \"$NMEDIT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $NMEDIT\" >&5\n$as_echo \"$NMEDIT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_NMEDIT\"; then\n  ac_ct_NMEDIT=$NMEDIT\n  # Extract the first word of \"nmedit\", so it can be a program name with args.\nset dummy nmedit; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_NMEDIT+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_NMEDIT\"; then\n  ac_cv_prog_ac_ct_NMEDIT=\"$ac_ct_NMEDIT\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_NMEDIT=\"nmedit\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT\nif test -n \"$ac_ct_NMEDIT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT\" >&5\n$as_echo \"$ac_ct_NMEDIT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_NMEDIT\" = x; then\n    NMEDIT=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    NMEDIT=$ac_ct_NMEDIT\n  fi\nelse\n  NMEDIT=\"$ac_cv_prog_NMEDIT\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}lipo\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}lipo; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_LIPO+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$LIPO\"; then\n  ac_cv_prog_LIPO=\"$LIPO\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_LIPO=\"${ac_tool_prefix}lipo\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nLIPO=$ac_cv_prog_LIPO\nif test -n \"$LIPO\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LIPO\" >&5\n$as_echo \"$LIPO\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_LIPO\"; then\n  ac_ct_LIPO=$LIPO\n  # Extract the first word of \"lipo\", so it can be a program name with args.\nset dummy lipo; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_LIPO+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_LIPO\"; then\n  ac_cv_prog_ac_ct_LIPO=\"$ac_ct_LIPO\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_LIPO=\"lipo\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO\nif test -n \"$ac_ct_LIPO\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO\" >&5\n$as_echo \"$ac_ct_LIPO\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_LIPO\" = x; then\n    LIPO=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    LIPO=$ac_ct_LIPO\n  fi\nelse\n  LIPO=\"$ac_cv_prog_LIPO\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}otool\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}otool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_OTOOL+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OTOOL\"; then\n  ac_cv_prog_OTOOL=\"$OTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_OTOOL=\"${ac_tool_prefix}otool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOTOOL=$ac_cv_prog_OTOOL\nif test -n \"$OTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OTOOL\" >&5\n$as_echo \"$OTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OTOOL\"; then\n  ac_ct_OTOOL=$OTOOL\n  # Extract the first word of \"otool\", so it can be a program name with args.\nset dummy otool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_OTOOL+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OTOOL\"; then\n  ac_cv_prog_ac_ct_OTOOL=\"$ac_ct_OTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_OTOOL=\"otool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL\nif test -n \"$ac_ct_OTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL\" >&5\n$as_echo \"$ac_ct_OTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OTOOL\" = x; then\n    OTOOL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OTOOL=$ac_ct_OTOOL\n  fi\nelse\n  OTOOL=\"$ac_cv_prog_OTOOL\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}otool64\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}otool64; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_OTOOL64+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OTOOL64\"; then\n  ac_cv_prog_OTOOL64=\"$OTOOL64\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_OTOOL64=\"${ac_tool_prefix}otool64\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOTOOL64=$ac_cv_prog_OTOOL64\nif test -n \"$OTOOL64\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OTOOL64\" >&5\n$as_echo \"$OTOOL64\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OTOOL64\"; then\n  ac_ct_OTOOL64=$OTOOL64\n  # Extract the first word of \"otool64\", so it can be a program name with args.\nset dummy otool64; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_OTOOL64+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OTOOL64\"; then\n  ac_cv_prog_ac_ct_OTOOL64=\"$ac_ct_OTOOL64\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_OTOOL64=\"otool64\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64\nif test -n \"$ac_ct_OTOOL64\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64\" >&5\n$as_echo \"$ac_ct_OTOOL64\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OTOOL64\" = x; then\n    OTOOL64=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OTOOL64=$ac_ct_OTOOL64\n  fi\nelse\n  OTOOL64=\"$ac_cv_prog_OTOOL64\"\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag\" >&5\n$as_echo_n \"checking for -single_module linker flag... \" >&6; }\nif test \"${lt_cv_apple_cc_single_mod+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_apple_cc_single_mod=no\n      if test -z \"${LT_MULTI_MODULE}\"; then\n\t# By default we will add the -single_module flag. You can override\n\t# by either setting the environment variable LT_MULTI_MODULE\n\t# non-empty at configure time, or by adding -multi_module to the\n\t# link flags.\n\trm -rf libconftest.dylib*\n\techo \"int foo(void){return 1;}\" > conftest.c\n\techo \"$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n-dynamiclib -Wl,-single_module conftest.c\" >&5\n\t$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n\t  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err\n        _lt_result=$?\n\tif test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then\n\t  lt_cv_apple_cc_single_mod=yes\n\telse\n\t  cat conftest.err >&5\n\tfi\n\trm -rf libconftest.dylib*\n\trm -f conftest.*\n      fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod\" >&5\n$as_echo \"$lt_cv_apple_cc_single_mod\" >&6; }\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag\" >&5\n$as_echo_n \"checking for -exported_symbols_list linker flag... \" >&6; }\nif test \"${lt_cv_ld_exported_symbols_list+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_exported_symbols_list=no\n      save_LDFLAGS=$LDFLAGS\n      echo \"_main\" > conftest.sym\n      LDFLAGS=\"$LDFLAGS -Wl,-exported_symbols_list,conftest.sym\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_ld_exported_symbols_list=yes\nelse\n  lt_cv_ld_exported_symbols_list=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\tLDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list\" >&5\n$as_echo \"$lt_cv_ld_exported_symbols_list\" >&6; }\n    case $host_os in\n    rhapsody* | darwin1.[012])\n      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;\n    darwin1.*)\n      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n    darwin*) # darwin 5.x on\n      # if running on 10.5 or later, the deployment target defaults\n      # to the OS version, if on x86, and 10.4, the deployment\n      # target defaults to 10.4. Don't you love it?\n      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in\n\t10.0,*86*-darwin8*|10.0,*-darwin[91]*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n\t10.[012]*)\n\t  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n\t10.*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n      esac\n    ;;\n  esac\n    if test \"$lt_cv_apple_cc_single_mod\" = \"yes\"; then\n      _lt_dar_single_mod='$single_module'\n    fi\n    if test \"$lt_cv_ld_exported_symbols_list\" = \"yes\"; then\n      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'\n    else\n      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'\n    fi\n    if test \"$DSYMUTIL\" != \":\"; then\n      _lt_dsymutil='~$DSYMUTIL $lib || :'\n    else\n      _lt_dsymutil=\n    fi\n    ;;\n  esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif test \"${ac_cv_header_stdc+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_stdc=yes\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then :\n  :\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\n$as_echo \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\n# On IRIX 5.3, sys/types and inttypes.h are conflicting.\nfor ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \\\n\t\t  inttypes.h stdint.h unistd.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_compile \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\n\"\neval as_val=\\$$as_ac_Header\n   if test \"x$as_val\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\nfor ac_header in dlfcn.h\ndo :\n  ac_fn_c_check_header_compile \"$LINENO\" \"dlfcn.h\" \"ac_cv_header_dlfcn_h\" \"$ac_includes_default\n\"\nif test \"x$ac_cv_header_dlfcn_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_DLFCN_H 1\n_ACEOF\n\nfi\n\ndone\n\n\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\nif test -z \"$CXX\"; then\n  if test -n \"$CCC\"; then\n    CXX=$CCC\n  else\n    if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CXX+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CXX\"; then\n  ac_cv_prog_CXX=\"$CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CXX=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCXX=$ac_cv_prog_CXX\nif test -n \"$CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CXX\" >&5\n$as_echo \"$CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CXX\" && break\n  done\nfi\nif test -z \"$CXX\"; then\n  ac_ct_CXX=$CXX\n  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_CXX+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CXX\"; then\n  ac_cv_prog_ac_ct_CXX=\"$ac_ct_CXX\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CXX=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CXX=$ac_cv_prog_ac_ct_CXX\nif test -n \"$ac_ct_CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX\" >&5\n$as_echo \"$ac_ct_CXX\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CXX\" && break\ndone\n\n  if test \"x$ac_ct_CXX\" = x; then\n    CXX=\"g++\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CXX=$ac_ct_CXX\n  fi\nfi\n\n  fi\nfi\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C++ compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C++ compiler... \" >&6; }\nif test \"${ac_cv_cxx_compiler_gnu+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_cxx_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu\" >&5\n$as_echo \"$ac_cv_cxx_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GXX=yes\nelse\n  GXX=\nfi\nac_test_CXXFLAGS=${CXXFLAGS+set}\nac_save_CXXFLAGS=$CXXFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g\" >&5\n$as_echo_n \"checking whether $CXX accepts -g... \" >&6; }\nif test \"${ac_cv_prog_cxx_g+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_cxx_werror_flag=$ac_cxx_werror_flag\n   ac_cxx_werror_flag=yes\n   ac_cv_prog_cxx_g=no\n   CXXFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cxx_g=yes\nelse\n  CXXFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\nelse\n  ac_cxx_werror_flag=$ac_save_cxx_werror_flag\n\t CXXFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cxx_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_cxx_werror_flag=$ac_save_cxx_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g\" >&5\n$as_echo \"$ac_cv_prog_cxx_g\" >&6; }\nif test \"$ac_test_CXXFLAGS\" = set; then\n  CXXFLAGS=$ac_save_CXXFLAGS\nelif test $ac_cv_prog_cxx_g = yes; then\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-g -O2\"\n  else\n    CXXFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GXX\" = yes; then\n    CXXFLAGS=\"-O2\"\n  else\n    CXXFLAGS=\n  fi\nfi\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\ndepcc=\"$CXX\"  am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif test \"${am_cv_CXX_dependencies_compiler_type+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CXX_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CXX_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CXX_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CXX_dependencies_compiler_type\" >&6; }\nCXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CXX_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCXX_TRUE=\n  am__fastdepCXX_FALSE='#'\nelse\n  am__fastdepCXX_TRUE='#'\n  am__fastdepCXX_FALSE=\nfi\n\n\nif test -n \"$CXX\" && ( test \"X$CXX\" != \"Xno\" &&\n    ( (test \"X$CXX\" = \"Xg++\" && `g++ -v >/dev/null 2>&1` ) ||\n    (test \"X$CXX\" != \"Xg++\"))) ; then\n  ac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor\" >&5\n$as_echo_n \"checking how to run the C++ preprocessor... \" >&6; }\nif test -z \"$CXXCPP\"; then\n  if test \"${ac_cv_prog_CXXCPP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CXXCPP needs to be expanded\n    for CXXCPP in \"$CXX -E\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_cxx_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CXXCPP=$CXXCPP\n\nfi\n  CXXCPP=$ac_cv_prog_CXXCPP\nelse\n  ac_cv_prog_CXXCPP=$CXXCPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CXXCPP\" >&5\n$as_echo \"$CXXCPP\" >&6; }\nac_preproc_ok=false\nfor ac_cxx_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_cxx_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n_lt_caught_CXX_error=yes; }\nfi\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\nelse\n  _lt_caught_CXX_error=yes\nfi\n\n\n\n\n\n# Set options\n\n\n\n        enable_dlopen=no\n\n\n  enable_win32_dll=no\n\n\n            # Check whether --enable-shared was given.\nif test \"${enable_shared+set}\" = set; then :\n  enableval=$enable_shared; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_shared=yes ;;\n    no) enable_shared=no ;;\n    *)\n      enable_shared=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_shared=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_shared=yes\nfi\n\n\n\n\n\n\n\n\n\n  # Check whether --enable-static was given.\nif test \"${enable_static+set}\" = set; then :\n  enableval=$enable_static; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_static=yes ;;\n    no) enable_static=no ;;\n    *)\n     enable_static=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_static=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_static=yes\nfi\n\n\n\n\n\n\n\n\n\n\n# Check whether --with-pic was given.\nif test \"${with_pic+set}\" = set; then :\n  withval=$with_pic; pic_mode=\"$withval\"\nelse\n  pic_mode=default\nfi\n\n\ntest -z \"$pic_mode\" && pic_mode=default\n\n\n\n\n\n\n\n  # Check whether --enable-fast-install was given.\nif test \"${enable_fast_install+set}\" = set; then :\n  enableval=$enable_fast_install; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_fast_install=yes ;;\n    no) enable_fast_install=no ;;\n    *)\n      enable_fast_install=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_fast_install=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_fast_install=yes\nfi\n\n\n\n\n\n\n\n\n\n\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=\"$ltmain\"\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for objdir\" >&5\n$as_echo_n \"checking for objdir... \" >&6; }\nif test \"${lt_cv_objdir+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  rm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  lt_cv_objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  lt_cv_objdir=_libs\nfi\nrmdir .libs 2>/dev/null\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir\" >&5\n$as_echo \"$lt_cv_objdir\" >&6; }\nobjdir=$lt_cv_objdir\n\n\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define LT_OBJDIR \"$lt_cv_objdir/\"\n_ACEOF\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test \"X${COLLECT_NAMES+set}\" != Xset; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nsed_quote_subst='s/\\([\"`$\\\\]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([\"`\\\\]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Sed substitution to delay expansion of an escaped single quote.\ndelay_single_quote_subst='s/'\\''/'\\'\\\\\\\\\\\\\\'\\''/g'\n\n# Sed substitution to avoid accidental globbing in evaled expressions\nno_glob_subst='s/\\*/\\\\\\*/g'\n\n# Global variables:\nofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a `.a' archive for static linking (except MSVC,\n# which needs '.lib').\nlibext=a\n\nwith_gnu_ld=\"$lt_cv_prog_gnu_ld\"\n\nold_CC=\"$CC\"\nold_CFLAGS=\"$CFLAGS\"\n\n# Set sane defaults for various variables\ntest -z \"$CC\" && CC=cc\ntest -z \"$LTCC\" && LTCC=$CC\ntest -z \"$LTCFLAGS\" && LTCFLAGS=$CFLAGS\ntest -z \"$LD\" && LD=ld\ntest -z \"$ac_objext\" && ac_objext=o\n\nfor cc_temp in $compiler\"\"; do\n  case $cc_temp in\n    compile | *[\\\\/]compile | ccache | *[\\\\/]ccache ) ;;\n    distcc | *[\\\\/]distcc | purify | *[\\\\/]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`$ECHO \"X$cc_temp\" | $Xsed -e 's%.*/%%' -e \"s%^$host_alias-%%\"`\n\n\n# Only perform the check for file, if the check method requires it\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file\" >&5\n$as_echo_n \"checking for ${ac_tool_prefix}file... \" >&6; }\nif test \"${lt_cv_path_MAGIC_CMD+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MAGIC_CMD in\n[\\\\/*] |  ?:[\\\\/]*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  ac_dummy=\"/usr/bin$PATH_SEPARATOR$PATH\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/${ac_tool_prefix}file; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/${ac_tool_prefix}file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac\nfi\n\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD\" >&5\n$as_echo \"$MAGIC_CMD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n\n\n\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for file\" >&5\n$as_echo_n \"checking for file... \" >&6; }\nif test \"${lt_cv_path_MAGIC_CMD+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MAGIC_CMD in\n[\\\\/*] |  ?:[\\\\/]*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  ac_dummy=\"/usr/bin$PATH_SEPARATOR$PATH\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/file; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac\nfi\n\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD\" >&5\n$as_echo \"$MAGIC_CMD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  else\n    MAGIC_CMD=:\n  fi\nfi\n\n  fi\n  ;;\nesac\n\n# Use C for the default configuration in the libtool script\n\nlt_save_CC=\"$CC\"\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n# Source file extension for C test sources.\nac_ext=c\n\n# Object file extension for compiled C test sources.\nobjext=o\nobjext=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"int some_variable = 0;\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='int main(){return(0);}'\n\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n# Save the default compiler, since it gets overwritten when the other\n# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.\ncompiler_DEFAULT=$CC\n\n# save warnings/boilerplate of simple test code\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n\nlt_prog_compiler_no_builtin_flag=\n\nif test \"$GCC\" = yes; then\n  lt_prog_compiler_no_builtin_flag=' -fno-builtin'\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions\" >&5\n$as_echo_n \"checking if $compiler supports -fno-rtti -fno-exceptions... \" >&6; }\nif test \"${lt_cv_prog_compiler_rtti_exceptions+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_rtti_exceptions=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"-fno-rtti -fno-exceptions\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:8664: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:8668: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_rtti_exceptions=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions\" >&5\n$as_echo \"$lt_cv_prog_compiler_rtti_exceptions\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_rtti_exceptions\" = xyes; then\n    lt_prog_compiler_no_builtin_flag=\"$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions\"\nelse\n    :\nfi\n\nfi\n\n\n\n\n\n\n  lt_prog_compiler_wl=\nlt_prog_compiler_pic=\nlt_prog_compiler_static=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC\" >&5\n$as_echo_n \"checking for $compiler option to produce PIC... \" >&6; }\n\n  if test \"$GCC\" = yes; then\n    lt_prog_compiler_wl='-Wl,'\n    lt_prog_compiler_static='-static'\n\n    case $host_os in\n      aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            lt_prog_compiler_pic='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      lt_prog_compiler_pic='-DDLL_EXPORT'\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      lt_prog_compiler_pic='-fno-common'\n      ;;\n\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t# +Z the default\n\t;;\n      *)\n\tlt_prog_compiler_pic='-fPIC'\n\t;;\n      esac\n      ;;\n\n    interix[3-9]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n\n    msdosdjgpp*)\n      # Just because we use GCC doesn't mean we suddenly get shared libraries\n      # on systems that don't support them.\n      lt_prog_compiler_can_build_shared=no\n      enable_shared=no\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic='-fPIC -shared'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tlt_prog_compiler_pic=-Kconform_pic\n      fi\n      ;;\n\n    *)\n      lt_prog_compiler_pic='-fPIC'\n      ;;\n    esac\n  else\n    # PORTME Check for flag to pass linker flags through the system compiler.\n    case $host_os in\n    aix*)\n      lt_prog_compiler_wl='-Wl,'\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static='-Bstatic'\n      else\n\tlt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      lt_prog_compiler_pic='-DDLL_EXPORT'\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      lt_prog_compiler_wl='-Wl,'\n      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but\n      # not for PA HP-UX.\n      case $host_cpu in\n      hppa*64*|ia64*)\n\t# +Z the default\n\t;;\n      *)\n\tlt_prog_compiler_pic='+Z'\n\t;;\n      esac\n      # Is there a better lt_prog_compiler_static that works with the bundled CC?\n      lt_prog_compiler_static='${wl}-a ${wl}archive'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      lt_prog_compiler_wl='-Wl,'\n      # PIC (with -KPIC) is the default.\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    linux* | k*bsd*-gnu | kopensolaris*-gnu)\n      case $cc_basename in\n      # old Intel for x86_64 which still supported -KPIC.\n      ecc*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-KPIC'\n\tlt_prog_compiler_static='-static'\n        ;;\n      # icc used to be incompatible with GCC.\n      # ICC 10 doesn't accept -KPIC any more.\n      icc* | ifort*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-fPIC'\n\tlt_prog_compiler_static='-static'\n        ;;\n      # Lahey Fortran 8.1.\n      lf95*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='--shared'\n\tlt_prog_compiler_static='--static'\n\t;;\n      pgcc* | pgf77* | pgf90* | pgf95*)\n        # Portland Group compilers (*not* the Pentium gcc compiler,\n\t# which looks to be a dead project)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-fpic'\n\tlt_prog_compiler_static='-Bstatic'\n        ;;\n      ccc*)\n        lt_prog_compiler_wl='-Wl,'\n        # All Alpha code is PIC.\n        lt_prog_compiler_static='-non_shared'\n        ;;\n      xl*)\n\t# IBM XL C 8.0/Fortran 10.1 on PPC\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-qpic'\n\tlt_prog_compiler_static='-qstaticlink'\n\t;;\n      *)\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\n\t  # Sun C 5.9\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl='-Wl,'\n\t  ;;\n\t*Sun\\ F*)\n\t  # Sun Fortran 8.3 passes all unrecognized flags to the linker\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl=''\n\t  ;;\n\tesac\n\t;;\n      esac\n      ;;\n\n    newsos6)\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic='-fPIC -shared'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      lt_prog_compiler_wl='-Wl,'\n      # All OSF/1 code is PIC.\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    rdos*)\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    solaris*)\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      case $cc_basename in\n      f77* | f90* | f95*)\n\tlt_prog_compiler_wl='-Qoption ld ';;\n      *)\n\tlt_prog_compiler_wl='-Wl,';;\n      esac\n      ;;\n\n    sunos4*)\n      lt_prog_compiler_wl='-Qoption ld '\n      lt_prog_compiler_pic='-PIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec ;then\n\tlt_prog_compiler_pic='-Kconform_pic'\n\tlt_prog_compiler_static='-Bstatic'\n      fi\n      ;;\n\n    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    unicos*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_can_build_shared=no\n      ;;\n\n    uts4*)\n      lt_prog_compiler_pic='-pic'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    *)\n      lt_prog_compiler_can_build_shared=no\n      ;;\n    esac\n  fi\n\ncase $host_os in\n  # For platforms which do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    lt_prog_compiler_pic=\n    ;;\n  *)\n    lt_prog_compiler_pic=\"$lt_prog_compiler_pic -DPIC\"\n    ;;\nesac\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic\" >&5\n$as_echo \"$lt_prog_compiler_pic\" >&6; }\n\n\n\n\n\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$lt_prog_compiler_pic\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works\" >&5\n$as_echo_n \"checking if $compiler PIC flag $lt_prog_compiler_pic works... \" >&6; }\nif test \"${lt_cv_prog_compiler_pic_works+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic_works=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$lt_prog_compiler_pic -DPIC\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:9003: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:9007: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_pic_works=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic_works\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_pic_works\" = xyes; then\n    case $lt_prog_compiler_pic in\n     \"\" | \" \"*) ;;\n     *) lt_prog_compiler_pic=\" $lt_prog_compiler_pic\" ;;\n     esac\nelse\n    lt_prog_compiler_pic=\n     lt_prog_compiler_can_build_shared=no\nfi\n\nfi\n\n\n\n\n\n\n#\n# Check to make sure the static flag actually works.\n#\nwl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\\\"$lt_prog_compiler_static\\\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works\" >&5\n$as_echo_n \"checking if $compiler static flag $lt_tmp_static_flag works... \" >&6; }\nif test \"${lt_cv_prog_compiler_static_works+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_static_works=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS $lt_tmp_static_flag\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&5\n       $ECHO \"X$_lt_linker_boilerplate\" | $Xsed -e '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         lt_cv_prog_compiler_static_works=yes\n       fi\n     else\n       lt_cv_prog_compiler_static_works=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works\" >&5\n$as_echo \"$lt_cv_prog_compiler_static_works\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_static_works\" = xyes; then\n    :\nelse\n    lt_prog_compiler_static=\nfi\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif test \"${lt_cv_prog_compiler_c_o+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:9108: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:9112: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o\" >&6; }\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif test \"${lt_cv_prog_compiler_c_o+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:9163: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:9167: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o\" >&6; }\n\n\n\n\nhard_links=\"nottested\"\nif test \"$lt_cv_prog_compiler_c_o\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links\" >&5\n$as_echo_n \"checking if we can lock with hard links... \" >&6; }\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hard_links\" >&5\n$as_echo \"$hard_links\" >&6; }\n  if test \"$hard_links\" = no; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&5\n$as_echo \"$as_me: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&2;}\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries\" >&5\n$as_echo_n \"checking whether the $compiler linker ($LD) supports shared libraries... \" >&6; }\n\n  runpath_var=\n  allow_undefined_flag=\n  always_export_symbols=no\n  archive_cmds=\n  archive_expsym_cmds=\n  compiler_needs_object=no\n  enable_shared_with_static_runtimes=no\n  export_dynamic_flag_spec=\n  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  hardcode_automatic=no\n  hardcode_direct=no\n  hardcode_direct_absolute=no\n  hardcode_libdir_flag_spec=\n  hardcode_libdir_flag_spec_ld=\n  hardcode_libdir_separator=\n  hardcode_minus_L=no\n  hardcode_shlibpath_var=unsupported\n  inherit_rpath=no\n  link_all_deplibs=unknown\n  module_cmds=\n  module_expsym_cmds=\n  old_archive_from_new_cmds=\n  old_archive_from_expsyms_cmds=\n  thread_safe_flag_spec=\n  whole_archive_flag_spec=\n  # include_expsyms should be a list of space-separated symbols to be *always*\n  # included in the symbol list\n  include_expsyms=\n  # exclude_expsyms can be an extended regexp of symbols to exclude\n  # it will be wrapped by ` (' and `)$', so one must not match beginning or\n  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',\n  # as well as any symbol that contains `d'.\n  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'\n  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n  # platforms (ab)use it in PIC code, but their linkers get confused if\n  # the symbol is explicitly referenced.  Since portable code cannot\n  # rely on this symbol name, it's probably fine to never include it in\n  # preloaded symbol tables.\n  # Exclude shared library initialization/finalization symbols.\n  extract_expsyms_cmds=\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    # FIXME: the MSVC++ port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    if test \"$GCC\" != yes; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++)\n    with_gnu_ld=yes\n    ;;\n  openbsd*)\n    with_gnu_ld=no\n    ;;\n  linux* | k*bsd*-gnu)\n    link_all_deplibs=no\n    ;;\n  esac\n\n  ld_shlibs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    # If archive_cmds runs LD, not CC, wlarc should be empty\n    wlarc='${wl}'\n\n    # Set some defaults for GNU ld with shared library support. These\n    # are reset later if shared libraries are not supported. Putting them\n    # here allows them to be overridden if necessary.\n    runpath_var=LD_RUN_PATH\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    export_dynamic_flag_spec='${wl}--export-dynamic'\n    # ancient GNU ld didn't support --whole-archive et. al.\n    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then\n      whole_archive_flag_spec=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n    else\n      whole_archive_flag_spec=\n    fi\n    supports_anon_versioning=no\n    case `$LD -v 2>&1` in\n      *GNU\\ gold*) supports_anon_versioning=yes ;;\n      *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.10.*) ;; # catch versions < 2.11\n      *\\ 2.11.93.0.2\\ *) supports_anon_versioning=yes ;; # RH7.3 ...\n      *\\ 2.11.92.0.12\\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...\n      *\\ 2.11.*) ;; # other 2.11 versions\n      *) supports_anon_versioning=yes ;;\n    esac\n\n    # See if GNU ld supports shared libraries.\n    case $host_os in\n    aix[3-9]*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test \"$host_cpu\" != ia64; then\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.9.1, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to modify your PATH\n*** so that a non-GNU linker is found, and then restart.\n\n_LT_EOF\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            archive_expsym_cmds=''\n        ;;\n      m68k)\n            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_minus_L=yes\n        ;;\n      esac\n      ;;\n\n    beos*)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tallow_undefined_flag=unsupported\n\t# Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t# support --undefined.  This deserves some investigation.  FIXME\n\tarchive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,\n      # as there is no search path for DLLs.\n      hardcode_libdir_flag_spec='-L$libdir'\n      allow_undefined_flag=unsupported\n      always_export_symbols=no\n      enable_shared_with_static_runtimes=yes\n      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[BCDGRS][ ]/s/.*[ ]\\([^ ]*\\)/\\1 DATA/'\\'' | $SED -e '\\''/^[AITW][ ]/s/.*[ ]//'\\'' | sort | uniq > $export_symbols'\n\n      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t# If the export-symbols file already is a .def file (1st line\n\t# is EXPORTS), use it as is; otherwise, prepend...\n\tarchive_expsym_cmds='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t  cp $export_symbols $output_objdir/$soname.def;\n\telse\n\t  echo EXPORTS > $output_objdir/$soname.def;\n\t  cat $export_symbols >> $output_objdir/$soname.def;\n\tfi~\n\t$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    interix[3-9]*)\n      hardcode_direct=no\n      hardcode_shlibpath_var=no\n      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n      export_dynamic_flag_spec='${wl}-E'\n      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n      # Instead, shared libraries are loaded at an image base (0x10000000 by\n      # default) and relocated if they conflict, which is a slow very memory\n      # consuming and fragmenting process.  To avoid this, we pick a random,\n      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      archive_expsym_cmds='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      ;;\n\n    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)\n      tmp_diet=no\n      if test \"$host_os\" = linux-dietlibc; then\n\tcase $cc_basename in\n\t  diet\\ *) tmp_diet=yes;;\t# linux-dietlibc with static linking (!diet-dyn)\n\tesac\n      fi\n      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \\\n\t && test \"$tmp_diet\" = no\n      then\n\ttmp_addflag=\n\ttmp_sharedflag='-shared'\n\tcase $cc_basename,$host_cpu in\n        pgcc*)\t\t\t\t# Portland Group C compiler\n\t  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag'\n\t  ;;\n\tpgf77* | pgf90* | pgf95*)\t# Portland Group f77 and f90 compilers\n\t  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag -Mnomain' ;;\n\tecc*,ia64* | icc*,ia64*)\t# Intel C compiler on ia64\n\t  tmp_addflag=' -i_dynamic' ;;\n\tefc*,ia64* | ifort*,ia64*)\t# Intel Fortran compiler on ia64\n\t  tmp_addflag=' -i_dynamic -nofor_main' ;;\n\tifc* | ifort*)\t\t\t# Intel Fortran compiler\n\t  tmp_addflag=' -nofor_main' ;;\n\tlf95*)\t\t\t\t# Lahey Fortran 8.1\n\t  whole_archive_flag_spec=\n\t  tmp_sharedflag='--shared' ;;\n\txl[cC]*)\t\t\t# IBM XL C 8.0 on PPC (deal with xlf below)\n\t  tmp_sharedflag='-qmkshrobj'\n\t  tmp_addflag= ;;\n\tesac\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\t\t\t# Sun C 5.9\n\t  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  compiler_needs_object=yes\n\t  tmp_sharedflag='-G' ;;\n\t*Sun\\ F*)\t\t\t# Sun Fortran 8.3\n\t  tmp_sharedflag='-G' ;;\n\tesac\n\tarchive_cmds='$CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\n        if test \"x$supports_anon_versioning\" = xyes; then\n          archive_expsym_cmds='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t    cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t    echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t    $CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n        fi\n\n\tcase $cc_basename in\n\txlf*)\n\t  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself\n\t  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'\n\t  hardcode_libdir_flag_spec=\n\t  hardcode_libdir_flag_spec_ld='-rpath $libdir'\n\t  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'\n\t  if test \"x$supports_anon_versioning\" = xyes; then\n\t    archive_expsym_cmds='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t      cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t      echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'\n\t  fi\n\t  ;;\n\tesac\n      else\n        ld_shlibs=no\n      fi\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\tarchive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n\twlarc=\n      else\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      fi\n      ;;\n\n    solaris*)\n      if $LD -v 2>&1 | $GREP 'BFD 2\\.8' > /dev/null; then\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.1[0-5].*)\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not\n*** reliably create shared libraries on SCO systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n\t;;\n\t*)\n\t  # For security reasons, it is highly recommended that you always\n\t  # use absolute paths for naming shared libraries, and exclude the\n\t  # DT_RUNPATH tag from executables and libraries.  But doing so\n\t  # requires that you compile everything twice, which is a pain.\n\t  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n\t    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t  else\n\t    ld_shlibs=no\n\t  fi\n\t;;\n      esac\n      ;;\n\n    sunos4*)\n      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      wlarc=\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    *)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n    esac\n\n    if test \"$ld_shlibs\" = no; then\n      runpath_var=\n      hardcode_libdir_flag_spec=\n      export_dynamic_flag_spec=\n      whole_archive_flag_spec=\n    fi\n  else\n    # PORTME fill in a description of your system's linker (not GNU ld)\n    case $host_os in\n    aix3*)\n      allow_undefined_flag=unsupported\n      always_export_symbols=yes\n      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      hardcode_minus_L=yes\n      if test \"$GCC\" = yes && test -z \"$lt_prog_compiler_static\"; then\n\t# Neither direct hardcoding nor static linking is supported with a\n\t# broken collect2.\n\thardcode_direct=unsupported\n      fi\n      ;;\n\n    aix[4-9]*)\n      if test \"$host_cpu\" = ia64; then\n\t# On IA64, the linker does run time linking by default, so we don't\n\t# have to do anything special.\n\taix_use_runtimelinking=no\n\texp_sym_flag='-Bexport'\n\tno_entry_flag=\"\"\n      else\n\t# If we're using GNU nm, then we don't want the \"-C\" option.\n\t# -C means demangle to AIX nm, but means don't demangle with GNU nm\n\tif $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n\t  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\telse\n\t  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\tfi\n\taix_use_runtimelinking=no\n\n\t# Test if we are trying to use run time linking or normal\n\t# AIX style linking. If -brtl is somewhere in LDFLAGS, we\n\t# need to do runtime linking.\n\tcase $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)\n\t  for ld_flag in $LDFLAGS; do\n\t  if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\t  done\n\t  ;;\n\tesac\n\n\texp_sym_flag='-bexport'\n\tno_entry_flag='-bnoentry'\n      fi\n\n      # When large executables or shared objects are built, AIX ld can\n      # have problems creating the table of contents.  If linking a library\n      # or program results in \"error TOC overflow\" add -mminimal-toc to\n      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n      archive_cmds=''\n      hardcode_direct=yes\n      hardcode_direct_absolute=yes\n      hardcode_libdir_separator=':'\n      link_all_deplibs=yes\n      file_list_spec='${wl}-f,'\n\n      if test \"$GCC\" = yes; then\n\tcase $host_os in aix4.[012]|aix4.[012].*)\n\t# We only want to do this on AIX 4.2 and lower, the check\n\t# below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t   strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t  # We have reworked collect2\n\t  :\n\t  else\n\t  # We have old collect2\n\t  hardcode_direct=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  hardcode_minus_L=yes\n\t  hardcode_libdir_flag_spec='-L$libdir'\n\t  hardcode_libdir_separator=\n\t  fi\n\t  ;;\n\tesac\n\tshared_flag='-shared'\n\tif test \"$aix_use_runtimelinking\" = yes; then\n\t  shared_flag=\"$shared_flag \"'${wl}-G'\n\tfi\n\tlink_all_deplibs=no\n      else\n\t# not using gcc\n\tif test \"$host_cpu\" = ia64; then\n\t# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t# chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n\telse\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag='${wl}-G'\n\t  else\n\t    shared_flag='${wl}-bM:SRE'\n\t  fi\n\tfi\n      fi\n\n      export_dynamic_flag_spec='${wl}-bexpall'\n      # It seems that -bexpall does not export symbols beginning with\n      # underscore (_), so it is better to generate a list of symbols to export.\n      always_export_symbols=yes\n      if test \"$aix_use_runtimelinking\" = yes; then\n\t# Warning - without using the other runtime loading flags (-brtl),\n\t# -berok will link without error, but may produce a broken library.\n\tallow_undefined_flag='-berok'\n        # Determine the default libpath from the value encoded in an\n        # empty executable.\n        cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\nlt_aix_libpath_sed='\n    /Import File Strings/,/^$/ {\n\t/^0/ {\n\t    s/^0  *\\(.*\\)$/\\1/\n\t    p\n\t}\n    }'\naix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n# Check for a 64-bit object if we didn't find anything.\nif test -z \"$aix_libpath\"; then\n  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nif test -z \"$aix_libpath\"; then aix_libpath=\"/usr/lib:/lib\"; fi\n\n        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then $ECHO \"X${wl}${allow_undefined_flag}\" | $Xsed; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n      else\n\tif test \"$host_cpu\" = ia64; then\n\t  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'\n\t  allow_undefined_flag=\"-z nodefs\"\n\t  archive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n\telse\n\t # Determine the default libpath from the value encoded in an\n\t # empty executable.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\nlt_aix_libpath_sed='\n    /Import File Strings/,/^$/ {\n\t/^0/ {\n\t    s/^0  *\\(.*\\)$/\\1/\n\t    p\n\t}\n    }'\naix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n# Check for a 64-bit object if we didn't find anything.\nif test -z \"$aix_libpath\"; then\n  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nif test -z \"$aix_libpath\"; then aix_libpath=\"/usr/lib:/lib\"; fi\n\n\t hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t  # Warning - without using the other run time loading flags,\n\t  # -berok will link without error, but may produce a broken library.\n\t  no_undefined_flag=' ${wl}-bernotok'\n\t  allow_undefined_flag=' ${wl}-berok'\n\t  # Exported symbols can be pulled into shared objects from archives\n\t  whole_archive_flag_spec='$convenience'\n\t  archive_cmds_need_lc=yes\n\t  # This is similar to how AIX traditionally builds its shared libraries.\n\t  archive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n\tfi\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            archive_expsym_cmds=''\n        ;;\n      m68k)\n            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_minus_L=yes\n        ;;\n      esac\n      ;;\n\n    bsdi[45]*)\n      export_dynamic_flag_spec=-rdynamic\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      hardcode_libdir_flag_spec=' '\n      allow_undefined_flag=unsupported\n      # Tell ltmain to make .lib files, not .a files.\n      libext=lib\n      # Tell ltmain to make .dll files, not .so files.\n      shrext_cmds=\".dll\"\n      # FIXME: Setting linknames here is a bad hack.\n      archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO \"X$deplibs\" | $Xsed -e '\\''s/ -lc$//'\\''` -link -dll~linknames='\n      # The linker will automatically build a .lib file if we build a DLL.\n      old_archive_from_new_cmds='true'\n      # FIXME: Should let the user specify the lib program.\n      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'\n      fix_srcfile_path='`cygpath -w \"$srcfile\"`'\n      enable_shared_with_static_runtimes=yes\n      ;;\n\n    darwin* | rhapsody*)\n\n\n  archive_cmds_need_lc=no\n  hardcode_direct=no\n  hardcode_automatic=yes\n  hardcode_shlibpath_var=unsupported\n  whole_archive_flag_spec=''\n  link_all_deplibs=yes\n  allow_undefined_flag=\"$_lt_dar_allow_undefined\"\n  case $cc_basename in\n     ifort*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test \"$_lt_dar_can_shared\" = \"yes\"; then\n    output_verbose_link_cmd=echo\n    archive_cmds=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod${_lt_dsymutil}\"\n    module_cmds=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dsymutil}\"\n    archive_expsym_cmds=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}\"\n    module_expsym_cmds=\"sed -e 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}\"\n\n  else\n  ld_shlibs=no\n  fi\n\n      ;;\n\n    dgux*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_shlibpath_var=no\n      ;;\n\n    freebsd1*)\n      ld_shlibs=no\n      ;;\n\n    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n    # support.  Future versions do this automatically, but an explicit c++rt0.o\n    # does not break anything, and helps significantly (at the cost of a little\n    # extra space).\n    freebsd2.2*)\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n    freebsd2*)\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n    freebsd* | dragonfly*)\n      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    hpux9*)\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      else\n\tarchive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      fi\n      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n      hardcode_libdir_separator=:\n      hardcode_direct=yes\n\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      hardcode_minus_L=yes\n      export_dynamic_flag_spec='${wl}-E'\n      ;;\n\n    hpux10*)\n      if test \"$GCC\" = yes -a \"$with_gnu_ld\" = no; then\n\tarchive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\thardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n\thardcode_libdir_flag_spec_ld='+b $libdir'\n\thardcode_libdir_separator=:\n\thardcode_direct=yes\n\thardcode_direct_absolute=yes\n\texport_dynamic_flag_spec='${wl}-E'\n\t# hardcode_minus_L: Not really in the search PATH,\n\t# but as the default location of the library.\n\thardcode_minus_L=yes\n      fi\n      ;;\n\n    hpux11*)\n      if test \"$GCC\" = yes -a \"$with_gnu_ld\" = no; then\n\tcase $host_cpu in\n\thppa*64*)\n\t  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      else\n\tcase $host_cpu in\n\thppa*64*)\n\t  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\thardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n\thardcode_libdir_separator=:\n\n\tcase $host_cpu in\n\thppa*64*|ia64*)\n\t  hardcode_direct=no\n\t  hardcode_shlibpath_var=no\n\t  ;;\n\t*)\n\t  hardcode_direct=yes\n\t  hardcode_direct_absolute=yes\n\t  export_dynamic_flag_spec='${wl}-E'\n\n\t  # hardcode_minus_L: Not really in the search PATH,\n\t  # but as the default location of the library.\n\t  hardcode_minus_L=yes\n\t  ;;\n\tesac\n      fi\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t# Try to use the -exported_symbol ld option, if it does not\n\t# work, assume that -exports_file does not work either and\n\t# implicitly export all symbols.\n        save_LDFLAGS=\"$LDFLAGS\"\n        LDFLAGS=\"$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null\"\n        cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nint foo(void) {}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'\n\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n        LDFLAGS=\"$save_LDFLAGS\"\n      else\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\tarchive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      inherit_rpath=yes\n      link_all_deplibs=yes\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\tarchive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n      else\n\tarchive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n      fi\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    newsos6)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      hardcode_shlibpath_var=no\n      ;;\n\n    *nto* | *qnx*)\n      ;;\n\n    openbsd*)\n      if test -f /usr/libexec/ld.so; then\n\thardcode_direct=yes\n\thardcode_shlibpath_var=no\n\thardcode_direct_absolute=yes\n\tif test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'\n\t  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n\t  export_dynamic_flag_spec='${wl}-E'\n\telse\n\t  case $host_os in\n\t   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)\n\t     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n\t     hardcode_libdir_flag_spec='-R$libdir'\n\t     ;;\n\t   *)\n\t     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n\t     ;;\n\t  esac\n\tfi\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    os2*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_minus_L=yes\n      allow_undefined_flag=unsupported\n      archive_cmds='$ECHO \"LIBRARY $libname INITINSTANCE\" > $output_objdir/$libname.def~$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO \" SINGLE NONSHARED\" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'\n      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'\n      ;;\n\n    osf3*)\n      if test \"$GCC\" = yes; then\n\tallow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n      else\n\tallow_undefined_flag=' -expect_unresolved \\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      ;;\n\n    osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n      if test \"$GCC\" = yes; then\n\tallow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\thardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      else\n\tallow_undefined_flag=' -expect_unresolved \\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\tarchive_expsym_cmds='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done; printf \"%s\\\\n\" \"-hidden\">> $lib.exp~\n\t$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'\n\n\t# Both c and cxx compiler support -rpath directly\n\thardcode_libdir_flag_spec='-rpath $libdir'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_separator=:\n      ;;\n\n    solaris*)\n      no_undefined_flag=' -z defs'\n      if test \"$GCC\" = yes; then\n\twlarc='${wl}'\n\tarchive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n      else\n\tcase `$CC -V 2>&1` in\n\t*\"Compilers 5.0\"*)\n\t  wlarc=''\n\t  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  archive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'\n\t  ;;\n\t*)\n\t  wlarc='${wl}'\n\t  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n\t  ;;\n\tesac\n      fi\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_shlibpath_var=no\n      case $host_os in\n      solaris2.[0-5] | solaris2.[0-5].*) ;;\n      *)\n\t# The compiler driver will combine and reorder linker options,\n\t# but understands `-z linker_flag'.  GCC discards it without `$wl',\n\t# but is careful enough not to reorder.\n\t# Supported since Solaris 2.6 (maybe 2.5.1?)\n\tif test \"$GCC\" = yes; then\n\t  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\telse\n\t  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'\n\tfi\n\t;;\n      esac\n      link_all_deplibs=yes\n      ;;\n\n    sunos4*)\n      if test \"x$host_vendor\" = xsequent; then\n\t# Use $CC to link under sequent, because it throws in some extra .o\n\t# files that make .init and .fini sections work.\n\tarchive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    sysv4)\n      case $host_vendor in\n\tsni)\n\t  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  hardcode_direct=yes # is this really true???\n\t;;\n\tsiemens)\n\t  ## LD is ld it makes a PLAMLIB\n\t  ## CC just makes a GrossModule.\n\t  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n\t  reload_cmds='$CC -r -o $output$reload_objs'\n\t  hardcode_direct=no\n        ;;\n\tmotorola)\n\t  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  hardcode_direct=no #Motorola manual says yes, but my tests say they lie\n\t;;\n      esac\n      runpath_var='LD_RUN_PATH'\n      hardcode_shlibpath_var=no\n      ;;\n\n    sysv4.3*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_shlibpath_var=no\n      export_dynamic_flag_spec='-Bexport'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tarchive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\thardcode_shlibpath_var=no\n\trunpath_var=LD_RUN_PATH\n\thardcode_runpath_var=yes\n\tld_shlibs=yes\n      fi\n      ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)\n      no_undefined_flag='${wl}-z,text'\n      archive_cmds_need_lc=no\n      hardcode_shlibpath_var=no\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6*)\n      # Note: We can NOT use -z defs as we might desire, because we do not\n      # link with -lc, and that would cause any symbols used from libc to\n      # always be unresolved, which means just about no library would\n      # ever link correctly.  If we're not using GNU ld we use -z text\n      # though, which does catch some bad symbols but isn't as heavy-handed\n      # as -z defs.\n      no_undefined_flag='${wl}-z,text'\n      allow_undefined_flag='${wl}-z,nodefs'\n      archive_cmds_need_lc=no\n      hardcode_shlibpath_var=no\n      hardcode_libdir_flag_spec='${wl}-R,$libdir'\n      hardcode_libdir_separator=':'\n      link_all_deplibs=yes\n      export_dynamic_flag_spec='${wl}-Bexport'\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    uts4*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_shlibpath_var=no\n      ;;\n\n    *)\n      ld_shlibs=no\n      ;;\n    esac\n\n    if test x$host_vendor = xsni; then\n      case $host in\n      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n\texport_dynamic_flag_spec='${wl}-Blargedynsym'\n\t;;\n      esac\n    fi\n  fi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ld_shlibs\" >&5\n$as_echo \"$ld_shlibs\" >&6; }\ntest \"$ld_shlibs\" = no && can_build_shared=no\n\nwith_gnu_ld=$with_gnu_ld\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$archive_cmds_need_lc\" in\nx|xyes)\n  # Assume -lc should be added\n  archive_cmds_need_lc=yes\n\n  if test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n    case $archive_cmds in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in\" >&5\n$as_echo_n \"checking whether -lc should be explicitly linked in... \" >&6; }\n      $RM conftest*\n      echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n      if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } 2>conftest.err; then\n        soname=conftest\n        lib=conftest\n        libobjs=conftest.$ac_objext\n        deplibs=\n        wl=$lt_prog_compiler_wl\n\tpic_flag=$lt_prog_compiler_pic\n        compiler_flags=-v\n        linker_flags=-v\n        verstring=\n        output_objdir=.\n        libname=conftest\n        lt_save_allow_undefined_flag=$allow_undefined_flag\n        allow_undefined_flag=\n        if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$archive_cmds 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1\\\"\"; } >&5\n  (eval $archive_cmds 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n        then\n\t  archive_cmds_need_lc=no\n        else\n\t  archive_cmds_need_lc=yes\n        fi\n        allow_undefined_flag=$lt_save_allow_undefined_flag\n      else\n        cat conftest.err 1>&5\n      fi\n      $RM conftest*\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc\" >&5\n$as_echo \"$archive_cmds_need_lc\" >&6; }\n      ;;\n    esac\n  fi\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics\" >&5\n$as_echo_n \"checking dynamic linker characteristics... \" >&6; }\n\nif test \"$GCC\" = yes; then\n  case $host_os in\n    darwin*) lt_awk_arg=\"/^libraries:/,/LR/\" ;;\n    *) lt_awk_arg=\"/^libraries:/\" ;;\n  esac\n  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e \"s/^libraries://\" -e \"s,=/,/,g\"`\n  if $ECHO \"$lt_search_path_spec\" | $GREP ';' >/dev/null ; then\n    # if the path contains \";\" then we assume it to be the separator\n    # otherwise default to the standard path separator (i.e. \":\") - it is\n    # assumed that no part of a normal pathname contains \";\" but that should\n    # okay in the real world where \";\" in dirpaths is itself problematic.\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED -e 's/;/ /g'`\n  else\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED  -e \"s/$PATH_SEPARATOR/ /g\"`\n  fi\n  # Ok, now we have the path, separated by spaces, we can step through it\n  # and add multilib dir if necessary.\n  lt_tmp_lt_search_path_spec=\n  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`\n  for lt_sys_path in $lt_search_path_spec; do\n    if test -d \"$lt_sys_path/$lt_multi_os_dir\"; then\n      lt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir\"\n    else\n      test -d \"$lt_sys_path\" && \\\n\tlt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path\"\n    fi\n  done\n  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '\nBEGIN {RS=\" \"; FS=\"/|\\n\";} {\n  lt_foo=\"\";\n  lt_count=0;\n  for (lt_i = NF; lt_i > 0; lt_i--) {\n    if ($lt_i != \"\" && $lt_i != \".\") {\n      if ($lt_i == \"..\") {\n        lt_count++;\n      } else {\n        if (lt_count == 0) {\n          lt_foo=\"/\" $lt_i lt_foo;\n        } else {\n          lt_count--;\n        }\n      }\n    }\n  }\n  if (lt_foo != \"\") { lt_freq[lt_foo]++; }\n  if (lt_freq[lt_foo] == 1) { print lt_foo; }\n}'`\n  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`\nelse\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\nfi\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=\".so\"\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\ncase $host_os in\naix3*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}${shared_ext}$major'\n  ;;\n\naix[4-9]*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[01] | aix4.[01].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}${shared_ext}$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO \"X$lib\" | $Xsed -e '\\''s%^.*/\\([^/]*\\)\\.ixlibrary$%\\1%'\\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='${libname}${shared_ext}'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[45]*)\n  version_type=linux\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=\".dll\"\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$host_os in\n  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      sys_lib_search_path_spec=\"/usr/lib /lib/w32api /lib /usr/local/lib\"\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP \"^libraries:\" | $SED -e \"s/^libraries://\" -e \"s,=/,/,g\"`\n      if $ECHO \"$sys_lib_search_path_spec\" | $GREP ';[c-zC-Z]:/' >/dev/null; then\n        # It is most probably a Windows format PATH printed by\n        # mingw gcc, but we are running on Cygwin. Gcc prints its search\n        # path with ; separators, and with drive letters. We can handle the\n        # drive letters (cygwin fileutils understands them), so leave them,\n        # especially as we might pass files found there to a mingw objdump,\n        # which wouldn't understand a cygwinified path. Ahh.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED  -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    esac\n    ;;\n\n  *)\n    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'\n    ;;\n  esac\n  dynamic_linker='Win32 ld.exe'\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'\n  soname_spec='${libname}${release}${major}$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\n\n  sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/local/lib\"\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd1*)\n  dynamic_linker=no\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[123]*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[01]* | freebsdelf3.[01]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \\\n  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\ngnu*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    if test \"X$HPUX_IA64_MODE\" = X32; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n    fi\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555.\n  postinstall_cmds='chmod 555 $lib'\n  ;;\n\ninterix[3-9]*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test \"$lt_cv_prog_gnu_ld\" = yes; then\n\t\tversion_type=linux\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\n# This must be Linux ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  # Some binutils ld are patched to set DT_RUNPATH\n  save_LDFLAGS=$LDFLAGS\n  save_libdir=$libdir\n  eval \"libdir=/foo; wl=\\\"$lt_prog_compiler_wl\\\"; \\\n       LDFLAGS=\\\"\\$LDFLAGS $hardcode_libdir_flag_spec\\\"\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null; then :\n  shlibpath_overrides_runpath=yes\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  LDFLAGS=$save_LDFLAGS\n  libdir=$save_libdir\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Append ld.so.conf contents to the search path\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\$2)); skip = 1; } { if (!skip) print \\$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsdelf*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='NetBSD ld.elf_so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=\"/usr/lib\"\n  need_lib_prefix=no\n  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.\n  case $host_os in\n    openbsd3.3 | openbsd3.3.*)\tneed_version=yes ;;\n    *)\t\t\t\tneed_version=no  ;;\n  esac\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case $host_os in\n      openbsd2.[89] | openbsd2.[89].*)\n\tshlibpath_overrides_runpath=no\n\t;;\n      *)\n\tshlibpath_overrides_runpath=yes\n\t;;\n      esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  ;;\n\nos2*)\n  libname_spec='$name'\n  shrext_cmds=\".dll\"\n  need_lib_prefix=no\n  library_names_spec='$libname${shared_ext} $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux\n    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'\n    soname_spec='$libname${shared_ext}.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=freebsd-elf\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $dynamic_linker\" >&5\n$as_echo \"$dynamic_linker\" >&6; }\ntest \"$dynamic_linker\" = no && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test \"${lt_cv_sys_lib_search_path_spec+set}\" = set; then\n  sys_lib_search_path_spec=\"$lt_cv_sys_lib_search_path_spec\"\nfi\nif test \"${lt_cv_sys_lib_dlsearch_path_spec+set}\" = set; then\n  sys_lib_dlsearch_path_spec=\"$lt_cv_sys_lib_dlsearch_path_spec\"\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs\" >&5\n$as_echo_n \"checking how to hardcode library paths into programs... \" >&6; }\nhardcode_action=\nif test -n \"$hardcode_libdir_flag_spec\" ||\n   test -n \"$runpath_var\" ||\n   test \"X$hardcode_automatic\" = \"Xyes\" ; then\n\n  # We can hardcode non-existent directories.\n  if test \"$hardcode_direct\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$_LT_TAGVAR(hardcode_shlibpath_var, )\" != no &&\n     test \"$hardcode_minus_L\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    hardcode_action=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    hardcode_action=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  hardcode_action=unsupported\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hardcode_action\" >&5\n$as_echo \"$hardcode_action\" >&6; }\n\nif test \"$hardcode_action\" = relink ||\n   test \"$inherit_rpath\" = yes; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n\n\n\n\n\n\n  if test \"x$enable_dlopen\" != xyes; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=\"load_add_on\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  mingw* | pw32* | cegcc*)\n    lt_cv_dlopen=\"LoadLibrary\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  cygwin*)\n    lt_cv_dlopen=\"dlopen\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  darwin*)\n  # if libdl is installed we need to link against it\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl\" >&5\n$as_echo_n \"checking for dlopen in -ldl... \" >&6; }\nif test \"${ac_cv_lib_dl_dlopen+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_dlopen=yes\nelse\n  ac_cv_lib_dl_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen\" >&5\n$as_echo \"$ac_cv_lib_dl_dlopen\" >&6; }\nif test \"x$ac_cv_lib_dl_dlopen\" = x\"\"yes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"\nelse\n\n    lt_cv_dlopen=\"dyld\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n\nfi\n\n    ;;\n\n  *)\n    ac_fn_c_check_func \"$LINENO\" \"shl_load\" \"ac_cv_func_shl_load\"\nif test \"x$ac_cv_func_shl_load\" = x\"\"yes; then :\n  lt_cv_dlopen=\"shl_load\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld\" >&5\n$as_echo_n \"checking for shl_load in -ldld... \" >&6; }\nif test \"${ac_cv_lib_dld_shl_load+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar shl_load ();\nint\nmain ()\n{\nreturn shl_load ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dld_shl_load=yes\nelse\n  ac_cv_lib_dld_shl_load=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load\" >&5\n$as_echo \"$ac_cv_lib_dld_shl_load\" >&6; }\nif test \"x$ac_cv_lib_dld_shl_load\" = x\"\"yes; then :\n  lt_cv_dlopen=\"shl_load\" lt_cv_dlopen_libs=\"-ldld\"\nelse\n  ac_fn_c_check_func \"$LINENO\" \"dlopen\" \"ac_cv_func_dlopen\"\nif test \"x$ac_cv_func_dlopen\" = x\"\"yes; then :\n  lt_cv_dlopen=\"dlopen\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl\" >&5\n$as_echo_n \"checking for dlopen in -ldl... \" >&6; }\nif test \"${ac_cv_lib_dl_dlopen+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_dlopen=yes\nelse\n  ac_cv_lib_dl_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen\" >&5\n$as_echo \"$ac_cv_lib_dl_dlopen\" >&6; }\nif test \"x$ac_cv_lib_dl_dlopen\" = x\"\"yes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld\" >&5\n$as_echo_n \"checking for dlopen in -lsvld... \" >&6; }\nif test \"${ac_cv_lib_svld_dlopen+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lsvld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_svld_dlopen=yes\nelse\n  ac_cv_lib_svld_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen\" >&5\n$as_echo \"$ac_cv_lib_svld_dlopen\" >&6; }\nif test \"x$ac_cv_lib_svld_dlopen\" = x\"\"yes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-lsvld\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld\" >&5\n$as_echo_n \"checking for dld_link in -ldld... \" >&6; }\nif test \"${ac_cv_lib_dld_dld_link+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dld_link ();\nint\nmain ()\n{\nreturn dld_link ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dld_dld_link=yes\nelse\n  ac_cv_lib_dld_dld_link=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link\" >&5\n$as_echo \"$ac_cv_lib_dld_dld_link\" >&6; }\nif test \"x$ac_cv_lib_dld_dld_link\" = x\"\"yes; then :\n  lt_cv_dlopen=\"dld_link\" lt_cv_dlopen_libs=\"-ldld\"\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n    ;;\n  esac\n\n  if test \"x$lt_cv_dlopen\" != xno; then\n    enable_dlopen=yes\n  else\n    enable_dlopen=no\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=\"$CPPFLAGS\"\n    test \"x$ac_cv_header_dlfcn_h\" = xyes && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=\"$LDFLAGS\"\n    wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=\"$LIBS\"\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself\" >&5\n$as_echo_n \"checking whether a program can dlopen itself... \" >&6; }\nif test \"${lt_cv_dlopen_self+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  \t  if test \"$cross_compiling\" = yes; then :\n  lt_cv_dlopen_self=cross\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n#line 11547 \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\nvoid fnord() { int i=42;}\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else if (dlsym( self,\"_fnord\")) status = $lt_dlneed_uscore;\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}\n_LT_EOF\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&5 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self=no\n  fi\nfi\nrm -fr conftest*\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self\" >&5\n$as_echo \"$lt_cv_dlopen_self\" >&6; }\n\n    if test \"x$lt_cv_dlopen_self\" = xyes; then\n      wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $lt_prog_compiler_static\\\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself\" >&5\n$as_echo_n \"checking whether a statically linked program can dlopen itself... \" >&6; }\nif test \"${lt_cv_dlopen_self_static+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  \t  if test \"$cross_compiling\" = yes; then :\n  lt_cv_dlopen_self_static=cross\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n#line 11643 \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\nvoid fnord() { int i=42;}\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else if (dlsym( self,\"_fnord\")) status = $lt_dlneed_uscore;\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}\n_LT_EOF\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&5 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self_static=no\n  fi\nfi\nrm -fr conftest*\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static\" >&5\n$as_echo \"$lt_cv_dlopen_self_static\" >&6; }\n    fi\n\n    CPPFLAGS=\"$save_CPPFLAGS\"\n    LDFLAGS=\"$save_LDFLAGS\"\n    LIBS=\"$save_LIBS\"\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nstriplib=\nold_striplib=\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible\" >&5\n$as_echo_n \"checking whether stripping libraries is possible... \" >&6; }\nif test -n \"$STRIP\" && $STRIP -V 2>&1 | $GREP \"GNU strip\" >/dev/null; then\n  test -z \"$old_striplib\" && old_striplib=\"$STRIP --strip-debug\"\n  test -z \"$striplib\" && striplib=\"$STRIP --strip-unneeded\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n# FIXME - insert some real tests, host_os isn't really good enough\n  case $host_os in\n  darwin*)\n    if test -n \"$STRIP\" ; then\n      striplib=\"$STRIP -x\"\n      old_striplib=\"$STRIP -S\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n    else\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    fi\n    ;;\n  *)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    ;;\n  esac\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n  # Report which library types will actually be built\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries\" >&5\n$as_echo_n \"checking if libtool supports shared libraries... \" >&6; }\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $can_build_shared\" >&5\n$as_echo \"$can_build_shared\" >&6; }\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries\" >&5\n$as_echo_n \"checking whether to build shared libraries... \" >&6; }\n  test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n  # On AIX, shared libraries and static libraries use the same namespace, and\n  # are all built from PIC.\n  case $host_os in\n  aix3*)\n    test \"$enable_shared\" = yes && enable_static=no\n    if test -n \"$RANLIB\"; then\n      archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n      postinstall_cmds='$RANLIB $lib'\n    fi\n    ;;\n\n  aix[4-9]*)\n    if test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n      test \"$enable_shared\" = yes && enable_static=no\n    fi\n    ;;\n  esac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $enable_shared\" >&5\n$as_echo \"$enable_shared\" >&6; }\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to build static libraries\" >&5\n$as_echo_n \"checking whether to build static libraries... \" >&6; }\n  # Make sure either enable_shared or enable_static is yes.\n  test \"$enable_shared\" = yes || enable_static=yes\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $enable_static\" >&5\n$as_echo \"$enable_static\" >&6; }\n\n\n\n\nfi\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\nCC=\"$lt_save_CC\"\n\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\narchive_cmds_need_lc_CXX=no\nallow_undefined_flag_CXX=\nalways_export_symbols_CXX=no\narchive_expsym_cmds_CXX=\ncompiler_needs_object_CXX=no\nexport_dynamic_flag_spec_CXX=\nhardcode_direct_CXX=no\nhardcode_direct_absolute_CXX=no\nhardcode_libdir_flag_spec_CXX=\nhardcode_libdir_flag_spec_ld_CXX=\nhardcode_libdir_separator_CXX=\nhardcode_minus_L_CXX=no\nhardcode_shlibpath_var_CXX=unsupported\nhardcode_automatic_CXX=no\ninherit_rpath_CXX=no\nmodule_cmds_CXX=\nmodule_expsym_cmds_CXX=\nlink_all_deplibs_CXX=unknown\nold_archive_cmds_CXX=$old_archive_cmds\nno_undefined_flag_CXX=\nwhole_archive_flag_spec_CXX=\nenable_shared_with_static_runtimes_CXX=no\n\n# Source file extension for C++ test sources.\nac_ext=cpp\n\n# Object file extension for compiled C++ test sources.\nobjext=o\nobjext_CXX=$objext\n\n# No sense in running all these tests if we already determined that\n# the CXX compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_caught_CXX_error\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"int some_variable = 0;\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n\n  # save warnings/boilerplate of simple test code\n  ac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n\n  ac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=$CC\n  lt_save_LD=$LD\n  lt_save_GCC=$GCC\n  GCC=$GXX\n  lt_save_with_gnu_ld=$with_gnu_ld\n  lt_save_path_LD=$lt_cv_path_LD\n  if test -n \"${lt_cv_prog_gnu_ldcxx+set}\"; then\n    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx\n  else\n    $as_unset lt_cv_prog_gnu_ld\n  fi\n  if test -n \"${lt_cv_path_LDCXX+set}\"; then\n    lt_cv_path_LD=$lt_cv_path_LDCXX\n  else\n    $as_unset lt_cv_path_LD\n  fi\n  test -z \"${LDCXX+set}\" || LD=$LDCXX\n  CC=${CXX-\"c++\"}\n  compiler=$CC\n  compiler_CXX=$CC\n  for cc_temp in $compiler\"\"; do\n  case $cc_temp in\n    compile | *[\\\\/]compile | ccache | *[\\\\/]ccache ) ;;\n    distcc | *[\\\\/]distcc | purify | *[\\\\/]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`$ECHO \"X$cc_temp\" | $Xsed -e 's%.*/%%' -e \"s%^$host_alias-%%\"`\n\n\n  if test -n \"$compiler\"; then\n    # We don't want -fno-exception when compiling C++ code, so set the\n    # no_builtin_flag separately\n    if test \"$GXX\" = yes; then\n      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'\n    else\n      lt_prog_compiler_no_builtin_flag_CXX=\n    fi\n\n    if test \"$GXX\" = yes; then\n      # Set up default GNU C++ configuration\n\n\n\n# Check whether --with-gnu-ld was given.\nif test \"${with_gnu_ld+set}\" = set; then :\n  withval=$with_gnu_ld; test \"$withval\" = no || with_gnu_ld=yes\nelse\n  with_gnu_ld=no\nfi\n\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ld used by $CC\" >&5\n$as_echo_n \"checking for ld used by $CC... \" >&6; }\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [\\\\/]* | ?:[\\\\/]*)\n      re_direlt='/[^/][^/]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GNU ld\" >&5\n$as_echo_n \"checking for GNU ld... \" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for non-GNU ld\" >&5\n$as_echo_n \"checking for non-GNU ld... \" >&6; }\nfi\nif test \"${lt_cv_path_LD+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$LD\"; then\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break\n\t;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break\n\t;;\n      esac\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi\nfi\n\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LD\" >&5\n$as_echo \"$LD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\ntest -z \"$LD\" && as_fn_error \"no acceptable ld found in \\$PATH\" \"$LINENO\" 5\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld\" >&5\n$as_echo_n \"checking if the linker ($LD) is GNU ld... \" >&6; }\nif test \"${lt_cv_prog_gnu_ld+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  # I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld\" >&5\n$as_echo \"$lt_cv_prog_gnu_ld\" >&6; }\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n\n\n\n\n\n\n\n      # Check if GNU C++ uses GNU ld as the underlying linker, since the\n      # archiving commands below assume that GNU ld is being used.\n      if test \"$with_gnu_ld\" = yes; then\n        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n        archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\n        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'\n        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'\n\n        # If archive_cmds runs LD, not CC, wlarc should be empty\n        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to\n        #     investigate it a little bit more. (MM)\n        wlarc='${wl}'\n\n        # ancient GNU ld didn't support --whole-archive et. al.\n        if eval \"`$CC -print-prog-name=ld` --help 2>&1\" |\n\t  $GREP 'no-whole-archive' > /dev/null; then\n          whole_archive_flag_spec_CXX=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n        else\n          whole_archive_flag_spec_CXX=\n        fi\n      else\n        with_gnu_ld=no\n        wlarc=\n\n        # A generic and very simple default shared library creation\n        # command for GNU C++ for the case where it uses the native\n        # linker, instead of GNU ld.  If possible, this setting should\n        # overridden to take advantage of the native linker features on\n        # the platform it is being used on.\n        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n      fi\n\n      # Commands to make compiler produce verbose output that lists\n      # what \"hidden\" libraries, object files and flags are used when\n      # linking a shared library.\n      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"\\-L\"'\n\n    else\n      GXX=no\n      with_gnu_ld=no\n      wlarc=\n    fi\n\n    # PORTME: fill in a description of your system's C++ link characteristics\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries\" >&5\n$as_echo_n \"checking whether the $compiler linker ($LD) supports shared libraries... \" >&6; }\n    ld_shlibs_CXX=yes\n    case $host_os in\n      aix3*)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n        ;;\n      aix[4-9]*)\n        if test \"$host_cpu\" = ia64; then\n          # On IA64, the linker does run time linking by default, so we don't\n          # have to do anything special.\n          aix_use_runtimelinking=no\n          exp_sym_flag='-Bexport'\n          no_entry_flag=\"\"\n        else\n          aix_use_runtimelinking=no\n\n          # Test if we are trying to use run time linking or normal\n          # AIX style linking. If -brtl is somewhere in LDFLAGS, we\n          # need to do runtime linking.\n          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)\n\t    for ld_flag in $LDFLAGS; do\n\t      case $ld_flag in\n\t      *-brtl*)\n\t        aix_use_runtimelinking=yes\n\t        break\n\t        ;;\n\t      esac\n\t    done\n\t    ;;\n          esac\n\n          exp_sym_flag='-bexport'\n          no_entry_flag='-bnoentry'\n        fi\n\n        # When large executables or shared objects are built, AIX ld can\n        # have problems creating the table of contents.  If linking a library\n        # or program results in \"error TOC overflow\" add -mminimal-toc to\n        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n        archive_cmds_CXX=''\n        hardcode_direct_CXX=yes\n        hardcode_direct_absolute_CXX=yes\n        hardcode_libdir_separator_CXX=':'\n        link_all_deplibs_CXX=yes\n        file_list_spec_CXX='${wl}-f,'\n\n        if test \"$GXX\" = yes; then\n          case $host_os in aix4.[012]|aix4.[012].*)\n          # We only want to do this on AIX 4.2 and lower, the check\n          # below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t     strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t    # We have reworked collect2\n\t    :\n\t  else\n\t    # We have old collect2\n\t    hardcode_direct_CXX=unsupported\n\t    # It fails to find uninstalled libraries when the uninstalled\n\t    # path is not listed in the libpath.  Setting hardcode_minus_L\n\t    # to unsupported forces relinking\n\t    hardcode_minus_L_CXX=yes\n\t    hardcode_libdir_flag_spec_CXX='-L$libdir'\n\t    hardcode_libdir_separator_CXX=\n\t  fi\n          esac\n          shared_flag='-shared'\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag=\"$shared_flag \"'${wl}-G'\n\t  fi\n        else\n          # not using gcc\n          if test \"$host_cpu\" = ia64; then\n\t  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t  # chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n          else\n\t    if test \"$aix_use_runtimelinking\" = yes; then\n\t      shared_flag='${wl}-G'\n\t    else\n\t      shared_flag='${wl}-bM:SRE'\n\t    fi\n          fi\n        fi\n\n        export_dynamic_flag_spec_CXX='${wl}-bexpall'\n        # It seems that -bexpall does not export symbols beginning with\n        # underscore (_), so it is better to generate a list of symbols to\n\t# export.\n        always_export_symbols_CXX=yes\n        if test \"$aix_use_runtimelinking\" = yes; then\n          # Warning - without using the other runtime loading flags (-brtl),\n          # -berok will link without error, but may produce a broken library.\n          allow_undefined_flag_CXX='-berok'\n          # Determine the default libpath from the value encoded in an empty\n          # executable.\n          cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n\nlt_aix_libpath_sed='\n    /Import File Strings/,/^$/ {\n\t/^0/ {\n\t    s/^0  *\\(.*\\)$/\\1/\n\t    p\n\t}\n    }'\naix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n# Check for a 64-bit object if we didn't find anything.\nif test -z \"$aix_libpath\"; then\n  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nif test -z \"$aix_libpath\"; then aix_libpath=\"/usr/lib:/lib\"; fi\n\n          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\n          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then $ECHO \"X${wl}${allow_undefined_flag}\" | $Xsed; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n        else\n          if test \"$host_cpu\" = ia64; then\n\t    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'\n\t    allow_undefined_flag_CXX=\"-z nodefs\"\n\t    archive_expsym_cmds_CXX=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n          else\n\t    # Determine the default libpath from the value encoded in an\n\t    # empty executable.\n\t    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n\nlt_aix_libpath_sed='\n    /Import File Strings/,/^$/ {\n\t/^0/ {\n\t    s/^0  *\\(.*\\)$/\\1/\n\t    p\n\t}\n    }'\naix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n# Check for a 64-bit object if we didn't find anything.\nif test -z \"$aix_libpath\"; then\n  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nif test -z \"$aix_libpath\"; then aix_libpath=\"/usr/lib:/lib\"; fi\n\n\t    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t    # Warning - without using the other run time loading flags,\n\t    # -berok will link without error, but may produce a broken library.\n\t    no_undefined_flag_CXX=' ${wl}-bernotok'\n\t    allow_undefined_flag_CXX=' ${wl}-berok'\n\t    # Exported symbols can be pulled into shared objects from archives\n\t    whole_archive_flag_spec_CXX='$convenience'\n\t    archive_cmds_need_lc_CXX=yes\n\t    # This is similar to how AIX traditionally builds its shared\n\t    # libraries.\n\t    archive_expsym_cmds_CXX=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n          fi\n        fi\n        ;;\n\n      beos*)\n\tif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t  allow_undefined_flag_CXX=unsupported\n\t  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t  # support --undefined.  This deserves some investigation.  FIXME\n\t  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\telse\n\t  ld_shlibs_CXX=no\n\tfi\n\t;;\n\n      chorus*)\n        case $cc_basename in\n          *)\n\t  # FIXME: insert proper C++ library support\n\t  ld_shlibs_CXX=no\n\t  ;;\n        esac\n        ;;\n\n      cygwin* | mingw* | pw32* | cegcc*)\n        # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,\n        # as there is no search path for DLLs.\n        hardcode_libdir_flag_spec_CXX='-L$libdir'\n        allow_undefined_flag_CXX=unsupported\n        always_export_symbols_CXX=no\n        enable_shared_with_static_runtimes_CXX=yes\n\n        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n          archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n          # If the export-symbols file already is a .def file (1st line\n          # is EXPORTS), use it as is; otherwise, prepend...\n          archive_expsym_cmds_CXX='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t    cp $export_symbols $output_objdir/$soname.def;\n          else\n\t    echo EXPORTS > $output_objdir/$soname.def;\n\t    cat $export_symbols >> $output_objdir/$soname.def;\n          fi~\n          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n        else\n          ld_shlibs_CXX=no\n        fi\n        ;;\n      darwin* | rhapsody*)\n\n\n  archive_cmds_need_lc_CXX=no\n  hardcode_direct_CXX=no\n  hardcode_automatic_CXX=yes\n  hardcode_shlibpath_var_CXX=unsupported\n  whole_archive_flag_spec_CXX=''\n  link_all_deplibs_CXX=yes\n  allow_undefined_flag_CXX=\"$_lt_dar_allow_undefined\"\n  case $cc_basename in\n     ifort*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test \"$_lt_dar_can_shared\" = \"yes\"; then\n    output_verbose_link_cmd=echo\n    archive_cmds_CXX=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod${_lt_dsymutil}\"\n    module_cmds_CXX=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dsymutil}\"\n    archive_expsym_cmds_CXX=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}\"\n    module_expsym_cmds_CXX=\"sed -e 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}\"\n       if test \"$lt_cv_apple_cc_single_mod\" != \"yes\"; then\n      archive_cmds_CXX=\"\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dsymutil}\"\n      archive_expsym_cmds_CXX=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dar_export_syms}${_lt_dsymutil}\"\n    fi\n\n  else\n  ld_shlibs_CXX=no\n  fi\n\n\t;;\n\n      dgux*)\n        case $cc_basename in\n          ec++*)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          ghcx*)\n\t    # Green Hills C++ Compiler\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n        esac\n        ;;\n\n      freebsd[12]*)\n        # C++ shared libraries reported to be fairly broken before\n\t# switch to ELF\n        ld_shlibs_CXX=no\n        ;;\n\n      freebsd-elf*)\n        archive_cmds_need_lc_CXX=no\n        ;;\n\n      freebsd* | dragonfly*)\n        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF\n        # conventions\n        ld_shlibs_CXX=yes\n        ;;\n\n      gnu*)\n        ;;\n\n      hpux9*)\n        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'\n        hardcode_libdir_separator_CXX=:\n        export_dynamic_flag_spec_CXX='${wl}-E'\n        hardcode_direct_CXX=yes\n        hardcode_minus_L_CXX=yes # Not in the search PATH,\n\t\t\t\t             # but as the default\n\t\t\t\t             # location of the library.\n\n        case $cc_basename in\n          CC*)\n            # FIXME: insert proper C++ library support\n            ld_shlibs_CXX=no\n            ;;\n          aCC*)\n            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            # Commands to make compiler produce verbose output that lists\n            # what \"hidden\" libraries, object files and flags are used when\n            # linking a shared library.\n            #\n            # There doesn't appear to be a way to prevent this compiler from\n            # explicitly linking system object files so we need to strip them\n            # from the output so that they don't get included in the library\n            # dependencies.\n            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n            ;;\n          *)\n            if test \"$GXX\" = yes; then\n              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            else\n              # FIXME: insert proper C++ library support\n              ld_shlibs_CXX=no\n            fi\n            ;;\n        esac\n        ;;\n\n      hpux10*|hpux11*)\n        if test $with_gnu_ld = no; then\n\t  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'\n\t  hardcode_libdir_separator_CXX=:\n\n          case $host_cpu in\n            hppa*64*|ia64*)\n              ;;\n            *)\n\t      export_dynamic_flag_spec_CXX='${wl}-E'\n              ;;\n          esac\n        fi\n        case $host_cpu in\n          hppa*64*|ia64*)\n            hardcode_direct_CXX=no\n            hardcode_shlibpath_var_CXX=no\n            ;;\n          *)\n            hardcode_direct_CXX=yes\n            hardcode_direct_absolute_CXX=yes\n            hardcode_minus_L_CXX=yes # Not in the search PATH,\n\t\t\t\t\t         # but as the default\n\t\t\t\t\t         # location of the library.\n            ;;\n        esac\n\n        case $cc_basename in\n          CC*)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          aCC*)\n\t    case $host_cpu in\n\t      hppa*64*)\n\t        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      ia64*)\n\t        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      *)\n\t        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t    esac\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test $with_gnu_ld = no; then\n\t        case $host_cpu in\n\t          hppa*64*)\n\t            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          ia64*)\n\t            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          *)\n\t            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t        esac\n\t      fi\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      ld_shlibs_CXX=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      interix[3-9]*)\n\thardcode_direct_CXX=no\n\thardcode_shlibpath_var_CXX=no\n\thardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'\n\texport_dynamic_flag_spec_CXX='${wl}-E'\n\t# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n\t# Instead, shared libraries are loaded at an image base (0x10000000 by\n\t# default) and relocated if they conflict, which is a slow very memory\n\t# consuming and fragmenting process.  To avoid this, we pick a random,\n\t# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n\t# time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n\tarchive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\tarchive_expsym_cmds_CXX='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t;;\n      irix5* | irix6*)\n        case $cc_basename in\n          CC*)\n\t    # SGI C++\n\t    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -ar\", where \"CC\" is the IRIX C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test \"$with_gnu_ld\" = no; then\n\t        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t      else\n\t        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` -o $lib'\n\t      fi\n\t    fi\n\t    link_all_deplibs_CXX=yes\n\t    ;;\n        esac\n        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'\n        hardcode_libdir_separator_CXX=:\n        inherit_rpath_CXX=yes\n        ;;\n\n      linux* | k*bsd*-gnu | kopensolaris*-gnu)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\\''s/\\([^()0-9A-Za-z{}]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\t    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\\''s/\\([^()0-9A-Za-z{}]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib ${wl}-retain-symbols-file,$export_symbols; mv \\$templib $lib'\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP \"ld\"`; rm -f libconftest$shared_ext; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n\n\t    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'\n\t    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -Bstatic\", where \"CC\" is the KAI C++ compiler.\n\t    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'\n\t    ;;\n\t  icpc* | ecpc* )\n\t    # Intel C++\n\t    with_gnu_ld=yes\n\t    # version 8.0 and above of icpc choke on multiply defined symbols\n\t    # if we add $predep_objects and $postdep_objects, however 7.1 and\n\t    # earlier do not add the objects themselves.\n\t    case `$CC -V 2>&1` in\n\t      *\"Version 7.\"*)\n\t        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\tarchive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t      *)  # Version 8.0 or newer\n\t        tmp_idyn=\n\t        case $host_cpu in\n\t\t  ia64*) tmp_idyn=' -i_dynamic';;\n\t\tesac\n\t        archive_cmds_CXX='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\tarchive_expsym_cmds_CXX='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t    esac\n\t    archive_cmds_need_lc_CXX=no\n\t    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'\n\t    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'\n\t    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t    ;;\n          pgCC* | pgcpp*)\n            # Portland Group C++ compiler\n\t    case `$CC -V` in\n\t    *pgCC\\ [1-5]* | *pgcpp\\ [1-5]*)\n\t      prelink_cmds_CXX='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~\n\t\tcompile_command=\"$compile_command `find $tpldir -name \\*.o | $NL2SP`\"'\n\t      old_archive_cmds_CXX='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~\n\t\t$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \\*.o | $NL2SP`~\n\t\t$RANLIB $oldlib'\n\t      archive_cmds_CXX='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      archive_expsym_cmds_CXX='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    *) # Version 6 will use weak symbols\n\t      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    esac\n\n\t    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'\n\t    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'\n\t    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n            ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'\n\n\t    runpath_var=LD_RUN_PATH\n\t    hardcode_libdir_flag_spec_CXX='-rpath $libdir'\n\t    hardcode_libdir_separator_CXX=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\"`; templist=`$ECHO \"X$templist\" | $Xsed -e \"s/\\(^.*ld.*\\)\\( .*ld .*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n\t    ;;\n\t  xl*)\n\t    # IBM XL 8.0 on PPC, with GNU ld\n\t    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'\n\t    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'\n\t    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    if test \"x$supports_anon_versioning\" = xyes; then\n\t      archive_expsym_cmds_CXX='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t\tcat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t\techo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t\t$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n\t    fi\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      no_undefined_flag_CXX=' -zdefs'\n\t      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'\n\t      hardcode_libdir_flag_spec_CXX='-R$libdir'\n\t      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t      compiler_needs_object_CXX=yes\n\n\t      # Not sure whether something based on\n\t      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1\n\t      # would be better.\n\t      output_verbose_link_cmd='echo'\n\n\t      # Archives containing C++ object files must be created using\n\t      # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t      # necessary to make sure instantiated templates are included\n\t      # in the archive.\n\t      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n\n      lynxos*)\n        # FIXME: insert proper C++ library support\n\tld_shlibs_CXX=no\n\t;;\n\n      m88k*)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n\t;;\n\n      mvs*)\n        case $cc_basename in\n          cxx*)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n\t  *)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n\tesac\n\t;;\n\n      netbsd*)\n        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'\n\t  wlarc=\n\t  hardcode_libdir_flag_spec_CXX='-R$libdir'\n\t  hardcode_direct_CXX=yes\n\t  hardcode_shlibpath_var_CXX=no\n\tfi\n\t# Workaround some broken pre-1.5 toolchains\n\toutput_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e \"s:-lgcc -lc -lgcc::\"'\n\t;;\n\n      *nto* | *qnx*)\n        ld_shlibs_CXX=yes\n\t;;\n\n      openbsd2*)\n        # C++ shared libraries are fairly broken\n\tld_shlibs_CXX=no\n\t;;\n\n      openbsd*)\n\tif test -f /usr/libexec/ld.so; then\n\t  hardcode_direct_CXX=yes\n\t  hardcode_shlibpath_var_CXX=no\n\t  hardcode_direct_absolute_CXX=yes\n\t  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n\t  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'\n\t  if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'\n\t    export_dynamic_flag_spec_CXX='${wl}-E'\n\t    whole_archive_flag_spec_CXX=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n\t  fi\n\t  output_verbose_link_cmd=echo\n\telse\n\t  ld_shlibs_CXX=no\n\tfi\n\t;;\n\n      osf3* | osf4* | osf5*)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\\''s/\\([^()0-9A-Za-z{}]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo \"$lib\" | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\n\t    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'\n\t    hardcode_libdir_separator_CXX=:\n\n\t    # Archives containing C++ object files must be created using\n\t    # the KAI C++ compiler.\n\t    case $host in\n\t      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;\n\t      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;\n\t    esac\n\t    ;;\n          RCC*)\n\t    # Rational C++ 2.4.1\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          cxx*)\n\t    case $host in\n\t      osf3*)\n\t        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\\*'\n\t        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'\n\t\t;;\n\t      *)\n\t        allow_undefined_flag_CXX=' -expect_unresolved \\*'\n\t        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done~\n\t          echo \"-hidden\">> $lib.exp~\n\t          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~\n\t          $RM $lib.exp'\n\t        hardcode_libdir_flag_spec_CXX='-rpath $libdir'\n\t\t;;\n\t    esac\n\n\t    hardcode_libdir_separator_CXX=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\" | $GREP -v \"ld:\"`; templist=`$ECHO \"X$templist\" | $Xsed -e \"s/\\(^.*ld.*\\)\\( .*ld.*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n\t    ;;\n\t  *)\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\\*'\n\t      case $host in\n\t        osf3*)\n\t          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t        *)\n\t          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t      esac\n\n\t      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'\n\t      hardcode_libdir_separator_CXX=:\n\n\t      # Commands to make compiler produce verbose output that lists\n\t      # what \"hidden\" libraries, object files and flags are used when\n\t      # linking a shared library.\n\t      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"\\-L\"'\n\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      ld_shlibs_CXX=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      psos*)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n        ;;\n\n      sunos4*)\n        case $cc_basename in\n          CC*)\n\t    # Sun C++ 4.x\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          lcc*)\n\t    # Lucid\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n        esac\n        ;;\n\n      solaris*)\n        case $cc_basename in\n          CC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n            archive_cmds_need_lc_CXX=yes\n\t    no_undefined_flag_CXX=' -zdefs'\n\t    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t    archive_expsym_cmds_CXX='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t    hardcode_libdir_flag_spec_CXX='-R$libdir'\n\t    hardcode_shlibpath_var_CXX=no\n\t    case $host_os in\n\t      solaris2.[0-5] | solaris2.[0-5].*) ;;\n\t      *)\n\t\t# The compiler driver will combine and reorder linker options,\n\t\t# but understands `-z linker_flag'.\n\t        # Supported since Solaris 2.6 (maybe 2.5.1?)\n\t\twhole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'\n\t        ;;\n\t    esac\n\t    link_all_deplibs_CXX=yes\n\n\t    output_verbose_link_cmd='echo'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'\n\t    ;;\n          gcx*)\n\t    # Green Hills C++ Compiler\n\t    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\n\t    # The C++ compiler must be used to create the archive.\n\t    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    # GNU C++ compiler with Solaris linker\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'\n\t      if $CC --version | $GREP -v '^2\\.7' > /dev/null; then\n\t        archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        archive_expsym_cmds_CXX='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"\\-L\"'\n\t      else\n\t        # g++ 2.7 appears to require `-G' NOT `-shared' on this\n\t        # platform.\n\t        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        archive_expsym_cmds_CXX='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP \"\\-L\"'\n\t      fi\n\n\t      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'\n\t      case $host_os in\n\t\tsolaris2.[0-5] | solaris2.[0-5].*) ;;\n\t\t*)\n\t\t  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\t\t  ;;\n\t      esac\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)\n      no_undefined_flag_CXX='${wl}-z,text'\n      archive_cmds_need_lc_CXX=no\n      hardcode_shlibpath_var_CXX=no\n      runpath_var='LD_RUN_PATH'\n\n      case $cc_basename in\n        CC*)\n\t  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n      esac\n      ;;\n\n      sysv5* | sco3.2v5* | sco5v6*)\n\t# Note: We can NOT use -z defs as we might desire, because we do not\n\t# link with -lc, and that would cause any symbols used from libc to\n\t# always be unresolved, which means just about no library would\n\t# ever link correctly.  If we're not using GNU ld we use -z text\n\t# though, which does catch some bad symbols but isn't as heavy-handed\n\t# as -z defs.\n\tno_undefined_flag_CXX='${wl}-z,text'\n\tallow_undefined_flag_CXX='${wl}-z,nodefs'\n\tarchive_cmds_need_lc_CXX=no\n\thardcode_shlibpath_var_CXX=no\n\thardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'\n\thardcode_libdir_separator_CXX=':'\n\tlink_all_deplibs_CXX=yes\n\texport_dynamic_flag_spec_CXX='${wl}-Bexport'\n\trunpath_var='LD_RUN_PATH'\n\n\tcase $cc_basename in\n          CC*)\n\t    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    ;;\n\t  *)\n\t    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    ;;\n\tesac\n      ;;\n\n      tandem*)\n        case $cc_basename in\n          NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    ld_shlibs_CXX=no\n\t    ;;\n        esac\n        ;;\n\n      vxworks*)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n        ;;\n\n      *)\n        # FIXME: insert proper C++ library support\n        ld_shlibs_CXX=no\n        ;;\n    esac\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX\" >&5\n$as_echo \"$ld_shlibs_CXX\" >&6; }\n    test \"$ld_shlibs_CXX\" = no && can_build_shared=no\n\n    GCC_CXX=\"$GXX\"\n    LD_CXX=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    # Dependencies to place before and after the object being linked:\npredep_objects_CXX=\npostdep_objects_CXX=\npredeps_CXX=\npostdeps_CXX=\ncompiler_lib_search_path_CXX=\n\ncat > conftest.$ac_ext <<_LT_EOF\nclass Foo\n{\npublic:\n  Foo (void) { a = 0; }\nprivate:\n  int a;\n};\n_LT_EOF\n\nif { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n  # Parse the compiler output and extract the necessary\n  # objects, libraries and library flags.\n\n  # Sentinel used to keep track of whether or not we are before\n  # the conftest object file.\n  pre_test_object_deps_done=no\n\n  for p in `eval \"$output_verbose_link_cmd\"`; do\n    case $p in\n\n    -L* | -R* | -l*)\n       # Some compilers place space between \"-{L,R}\" and the path.\n       # Remove the space.\n       if test $p = \"-L\" ||\n          test $p = \"-R\"; then\n\t prev=$p\n\t continue\n       else\n\t prev=\n       fi\n\n       if test \"$pre_test_object_deps_done\" = no; then\n\t case $p in\n\t -L* | -R*)\n\t   # Internal compiler library paths should come after those\n\t   # provided the user.  The postdeps already come after the\n\t   # user supplied libs so there is no need to process them.\n\t   if test -z \"$compiler_lib_search_path_CXX\"; then\n\t     compiler_lib_search_path_CXX=\"${prev}${p}\"\n\t   else\n\t     compiler_lib_search_path_CXX=\"${compiler_lib_search_path_CXX} ${prev}${p}\"\n\t   fi\n\t   ;;\n\t # The \"-l\" case would never come before the object being\n\t # linked, so don't bother handling this case.\n\t esac\n       else\n\t if test -z \"$postdeps_CXX\"; then\n\t   postdeps_CXX=\"${prev}${p}\"\n\t else\n\t   postdeps_CXX=\"${postdeps_CXX} ${prev}${p}\"\n\t fi\n       fi\n       ;;\n\n    *.$objext)\n       # This assumes that the test object file only shows up\n       # once in the compiler output.\n       if test \"$p\" = \"conftest.$objext\"; then\n\t pre_test_object_deps_done=yes\n\t continue\n       fi\n\n       if test \"$pre_test_object_deps_done\" = no; then\n\t if test -z \"$predep_objects_CXX\"; then\n\t   predep_objects_CXX=\"$p\"\n\t else\n\t   predep_objects_CXX=\"$predep_objects_CXX $p\"\n\t fi\n       else\n\t if test -z \"$postdep_objects_CXX\"; then\n\t   postdep_objects_CXX=\"$p\"\n\t else\n\t   postdep_objects_CXX=\"$postdep_objects_CXX $p\"\n\t fi\n       fi\n       ;;\n\n    *) ;; # Ignore the rest.\n\n    esac\n  done\n\n  # Clean up.\n  rm -f a.out a.exe\nelse\n  echo \"libtool.m4: error: problem compiling CXX test program\"\nfi\n\n$RM -f confest.$objext\n\n# PORTME: override above test on systems where it is broken\ncase $host_os in\ninterix[3-9]*)\n  # Interix 3.5 installs completely hosed .la files for C++, so rather than\n  # hack all around it, let's just trust \"g++\" to DTRT.\n  predep_objects_CXX=\n  postdep_objects_CXX=\n  postdeps_CXX=\n  ;;\n\nlinux*)\n  case `$CC -V 2>&1 | sed 5q` in\n  *Sun\\ C*)\n    # Sun C++ 5.9\n\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    if test \"$solaris_use_stlport4\" != yes; then\n      postdeps_CXX='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\n\nsolaris*)\n  case $cc_basename in\n  CC*)\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    # Adding this requires a known-good setup of shared libraries for\n    # Sun compiler versions before 5.6, else PIC objects from an old\n    # archive will be linked into the output, leading to subtle bugs.\n    if test \"$solaris_use_stlport4\" != yes; then\n      postdeps_CXX='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\nesac\n\n\ncase \" $postdeps_CXX \" in\n*\" -lc \"*) archive_cmds_need_lc_CXX=no ;;\nesac\n compiler_lib_search_dirs_CXX=\nif test -n \"${compiler_lib_search_path_CXX}\"; then\n compiler_lib_search_dirs_CXX=`echo \" ${compiler_lib_search_path_CXX}\" | ${SED} -e 's! -L! !g' -e 's!^ !!'`\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    lt_prog_compiler_wl_CXX=\nlt_prog_compiler_pic_CXX=\nlt_prog_compiler_static_CXX=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC\" >&5\n$as_echo_n \"checking for $compiler option to produce PIC... \" >&6; }\n\n  # C++ specific cases for pic, static, wl, etc.\n  if test \"$GXX\" = yes; then\n    lt_prog_compiler_wl_CXX='-Wl,'\n    lt_prog_compiler_static_CXX='-static'\n\n    case $host_os in\n    aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static_CXX='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            lt_prog_compiler_pic_CXX='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n    mingw* | cygwin* | os2* | pw32* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'\n      ;;\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      lt_prog_compiler_pic_CXX='-fno-common'\n      ;;\n    *djgpp*)\n      # DJGPP does not support shared libraries at all\n      lt_prog_compiler_pic_CXX=\n      ;;\n    interix[3-9]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tlt_prog_compiler_pic_CXX=-Kconform_pic\n      fi\n      ;;\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t;;\n      *)\n\tlt_prog_compiler_pic_CXX='-fPIC'\n\t;;\n      esac\n      ;;\n    *qnx* | *nto*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic_CXX='-fPIC -shared'\n      ;;\n    *)\n      lt_prog_compiler_pic_CXX='-fPIC'\n      ;;\n    esac\n  else\n    case $host_os in\n      aix[4-9]*)\n\t# All AIX code is PIC.\n\tif test \"$host_cpu\" = ia64; then\n\t  # AIX 5 now supports IA64 processor\n\t  lt_prog_compiler_static_CXX='-Bstatic'\n\telse\n\t  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'\n\tfi\n\t;;\n      chorus*)\n\tcase $cc_basename in\n\tcxch68*)\n\t  # Green Hills C++ Compiler\n\t  # _LT_TAGVAR(lt_prog_compiler_static, CXX)=\"--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a\"\n\t  ;;\n\tesac\n\t;;\n      dgux*)\n\tcase $cc_basename in\n\t  ec++*)\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    ;;\n\t  ghcx*)\n\t    # Green Hills C++ Compiler\n\t    lt_prog_compiler_pic_CXX='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      freebsd* | dragonfly*)\n\t# FreeBSD uses GNU C++\n\t;;\n      hpux9* | hpux10* | hpux11*)\n\tcase $cc_basename in\n\t  CC*)\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'\n\t    if test \"$host_cpu\" != ia64; then\n\t      lt_prog_compiler_pic_CXX='+Z'\n\t    fi\n\t    ;;\n\t  aCC*)\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'\n\t    case $host_cpu in\n\t    hppa*64*|ia64*)\n\t      # +Z the default\n\t      ;;\n\t    *)\n\t      lt_prog_compiler_pic_CXX='+Z'\n\t      ;;\n\t    esac\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      interix*)\n\t# This is c89, which is MS Visual C++ (no shared libs)\n\t# Anyone wants to do a port?\n\t;;\n      irix5* | irix6* | nonstopux*)\n\tcase $cc_basename in\n\t  CC*)\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_static_CXX='-non_shared'\n\t    # CC pic flag -KPIC is the default.\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      linux* | k*bsd*-gnu | kopensolaris*-gnu)\n\tcase $cc_basename in\n\t  KCC*)\n\t    # KAI C++ Compiler\n\t    lt_prog_compiler_wl_CXX='--backend -Wl,'\n\t    lt_prog_compiler_pic_CXX='-fPIC'\n\t    ;;\n\t  ecpc* )\n\t    # old Intel C++ for x86_64 which still supported -KPIC.\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    lt_prog_compiler_static_CXX='-static'\n\t    ;;\n\t  icpc* )\n\t    # Intel C++, used to be incompatible with GCC.\n\t    # ICC 10 doesn't accept -KPIC any more.\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-fPIC'\n\t    lt_prog_compiler_static_CXX='-static'\n\t    ;;\n\t  pgCC* | pgcpp*)\n\t    # Portland Group C++ compiler\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-fpic'\n\t    lt_prog_compiler_static_CXX='-Bstatic'\n\t    ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    lt_prog_compiler_pic_CXX=\n\t    lt_prog_compiler_static_CXX='-non_shared'\n\t    ;;\n\t  xlc* | xlC*)\n\t    # IBM XL 8.0 on PPC\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-qpic'\n\t    lt_prog_compiler_static_CXX='-qstaticlink'\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      lt_prog_compiler_pic_CXX='-KPIC'\n\t      lt_prog_compiler_static_CXX='-Bstatic'\n\t      lt_prog_compiler_wl_CXX='-Qoption ld '\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n      lynxos*)\n\t;;\n      m88k*)\n\t;;\n      mvs*)\n\tcase $cc_basename in\n\t  cxx*)\n\t    lt_prog_compiler_pic_CXX='-W c,exportall'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      netbsd* | netbsdelf*-gnu)\n\t;;\n      *qnx* | *nto*)\n        # QNX uses GNU C++, but need to define -shared option too, otherwise\n        # it will coredump.\n        lt_prog_compiler_pic_CXX='-fPIC -shared'\n        ;;\n      osf3* | osf4* | osf5*)\n\tcase $cc_basename in\n\t  KCC*)\n\t    lt_prog_compiler_wl_CXX='--backend -Wl,'\n\t    ;;\n\t  RCC*)\n\t    # Rational C++ 2.4.1\n\t    lt_prog_compiler_pic_CXX='-pic'\n\t    ;;\n\t  cxx*)\n\t    # Digital/Compaq C++\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    lt_prog_compiler_pic_CXX=\n\t    lt_prog_compiler_static_CXX='-non_shared'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      psos*)\n\t;;\n      solaris*)\n\tcase $cc_basename in\n\t  CC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    lt_prog_compiler_static_CXX='-Bstatic'\n\t    lt_prog_compiler_wl_CXX='-Qoption ld '\n\t    ;;\n\t  gcx*)\n\t    # Green Hills C++ Compiler\n\t    lt_prog_compiler_pic_CXX='-PIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sunos4*)\n\tcase $cc_basename in\n\t  CC*)\n\t    # Sun C++ 4.x\n\t    lt_prog_compiler_pic_CXX='-pic'\n\t    lt_prog_compiler_static_CXX='-Bstatic'\n\t    ;;\n\t  lcc*)\n\t    # Lucid\n\t    lt_prog_compiler_pic_CXX='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n\tcase $cc_basename in\n\t  CC*)\n\t    lt_prog_compiler_wl_CXX='-Wl,'\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    lt_prog_compiler_static_CXX='-Bstatic'\n\t    ;;\n\tesac\n\t;;\n      tandem*)\n\tcase $cc_basename in\n\t  NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    lt_prog_compiler_pic_CXX='-KPIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      vxworks*)\n\t;;\n      *)\n\tlt_prog_compiler_can_build_shared_CXX=no\n\t;;\n    esac\n  fi\n\ncase $host_os in\n  # For platforms which do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    lt_prog_compiler_pic_CXX=\n    ;;\n  *)\n    lt_prog_compiler_pic_CXX=\"$lt_prog_compiler_pic_CXX -DPIC\"\n    ;;\nesac\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX\" >&5\n$as_echo \"$lt_prog_compiler_pic_CXX\" >&6; }\n\n\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$lt_prog_compiler_pic_CXX\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works\" >&5\n$as_echo_n \"checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... \" >&6; }\nif test \"${lt_cv_prog_compiler_pic_works_CXX+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic_works_CXX=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$lt_prog_compiler_pic_CXX -DPIC\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:13599: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:13603: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_pic_works_CXX=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic_works_CXX\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_pic_works_CXX\" = xyes; then\n    case $lt_prog_compiler_pic_CXX in\n     \"\" | \" \"*) ;;\n     *) lt_prog_compiler_pic_CXX=\" $lt_prog_compiler_pic_CXX\" ;;\n     esac\nelse\n    lt_prog_compiler_pic_CXX=\n     lt_prog_compiler_can_build_shared_CXX=no\nfi\n\nfi\n\n\n\n#\n# Check to make sure the static flag actually works.\n#\nwl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\\\"$lt_prog_compiler_static_CXX\\\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works\" >&5\n$as_echo_n \"checking if $compiler static flag $lt_tmp_static_flag works... \" >&6; }\nif test \"${lt_cv_prog_compiler_static_works_CXX+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_static_works_CXX=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS $lt_tmp_static_flag\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&5\n       $ECHO \"X$_lt_linker_boilerplate\" | $Xsed -e '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         lt_cv_prog_compiler_static_works_CXX=yes\n       fi\n     else\n       lt_cv_prog_compiler_static_works_CXX=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_static_works_CXX\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_static_works_CXX\" = xyes; then\n    :\nelse\n    lt_prog_compiler_static_CXX=\nfi\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif test \"${lt_cv_prog_compiler_c_o_CXX+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o_CXX=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:13698: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:13702: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o_CXX=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o_CXX\" >&6; }\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif test \"${lt_cv_prog_compiler_c_o_CXX+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o_CXX=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:13750: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:13754: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o_CXX=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o_CXX\" >&6; }\n\n\n\n\nhard_links=\"nottested\"\nif test \"$lt_cv_prog_compiler_c_o_CXX\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links\" >&5\n$as_echo_n \"checking if we can lock with hard links... \" >&6; }\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hard_links\" >&5\n$as_echo \"$hard_links\" >&6; }\n  if test \"$hard_links\" = no; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&5\n$as_echo \"$as_me: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&2;}\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries\" >&5\n$as_echo_n \"checking whether the $compiler linker ($LD) supports shared libraries... \" >&6; }\n\n  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  case $host_os in\n  aix[4-9]*)\n    # If we're using GNU nm, then we don't want the \"-C\" option.\n    # -C means demangle to AIX nm, but means don't demangle with GNU nm\n    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    else\n      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    fi\n    ;;\n  pw32*)\n    export_symbols_cmds_CXX=\"$ltdll_cmds\"\n  ;;\n  cygwin* | mingw* | cegcc*)\n    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[BCDGRS][ ]/s/.*[ ]\\([^ ]*\\)/\\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\\([^ ]*\\)[ ][^ ]*/\\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\\'' | sort | uniq > $export_symbols'\n  ;;\n  linux* | k*bsd*-gnu)\n    link_all_deplibs_CXX=no\n  ;;\n  *)\n    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  ;;\n  esac\n  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX\" >&5\n$as_echo \"$ld_shlibs_CXX\" >&6; }\ntest \"$ld_shlibs_CXX\" = no && can_build_shared=no\n\nwith_gnu_ld_CXX=$with_gnu_ld\n\n\n\n\n\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$archive_cmds_need_lc_CXX\" in\nx|xyes)\n  # Assume -lc should be added\n  archive_cmds_need_lc_CXX=yes\n\n  if test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n    case $archive_cmds_CXX in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in\" >&5\n$as_echo_n \"checking whether -lc should be explicitly linked in... \" >&6; }\n      $RM conftest*\n      echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n      if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } 2>conftest.err; then\n        soname=conftest\n        lib=conftest\n        libobjs=conftest.$ac_objext\n        deplibs=\n        wl=$lt_prog_compiler_wl_CXX\n\tpic_flag=$lt_prog_compiler_pic_CXX\n        compiler_flags=-v\n        linker_flags=-v\n        verstring=\n        output_objdir=.\n        libname=conftest\n        lt_save_allow_undefined_flag=$allow_undefined_flag_CXX\n        allow_undefined_flag_CXX=\n        if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$archive_cmds_CXX 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1\\\"\"; } >&5\n  (eval $archive_cmds_CXX 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n        then\n\t  archive_cmds_need_lc_CXX=no\n        else\n\t  archive_cmds_need_lc_CXX=yes\n        fi\n        allow_undefined_flag_CXX=$lt_save_allow_undefined_flag\n      else\n        cat conftest.err 1>&5\n      fi\n      $RM conftest*\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_CXX\" >&5\n$as_echo \"$archive_cmds_need_lc_CXX\" >&6; }\n      ;;\n    esac\n  fi\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics\" >&5\n$as_echo_n \"checking dynamic linker characteristics... \" >&6; }\n\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=\".so\"\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\ncase $host_os in\naix3*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}${shared_ext}$major'\n  ;;\n\naix[4-9]*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[01] | aix4.[01].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}${shared_ext}$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO \"X$lib\" | $Xsed -e '\\''s%^.*/\\([^/]*\\)\\.ixlibrary$%\\1%'\\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='${libname}${shared_ext}'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[45]*)\n  version_type=linux\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=\".dll\"\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$host_os in\n  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      sys_lib_search_path_spec=\"/usr/lib /lib/w32api /lib /usr/local/lib\"\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP \"^libraries:\" | $SED -e \"s/^libraries://\" -e \"s,=/,/,g\"`\n      if $ECHO \"$sys_lib_search_path_spec\" | $GREP ';[c-zC-Z]:/' >/dev/null; then\n        # It is most probably a Windows format PATH printed by\n        # mingw gcc, but we are running on Cygwin. Gcc prints its search\n        # path with ; separators, and with drive letters. We can handle the\n        # drive letters (cygwin fileutils understands them), so leave them,\n        # especially as we might pass files found there to a mingw objdump,\n        # which wouldn't understand a cygwinified path. Ahh.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED  -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    esac\n    ;;\n\n  *)\n    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'\n    ;;\n  esac\n  dynamic_linker='Win32 ld.exe'\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'\n  soname_spec='${libname}${release}${major}$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\n\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd1*)\n  dynamic_linker=no\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[123]*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[01]* | freebsdelf3.[01]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \\\n  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\ngnu*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    if test \"X$HPUX_IA64_MODE\" = X32; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n    fi\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555.\n  postinstall_cmds='chmod 555 $lib'\n  ;;\n\ninterix[3-9]*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test \"$lt_cv_prog_gnu_ld\" = yes; then\n\t\tversion_type=linux\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\n# This must be Linux ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  # Some binutils ld are patched to set DT_RUNPATH\n  save_LDFLAGS=$LDFLAGS\n  save_libdir=$libdir\n  eval \"libdir=/foo; wl=\\\"$lt_prog_compiler_wl_CXX\\\"; \\\n       LDFLAGS=\\\"\\$LDFLAGS $hardcode_libdir_flag_spec_CXX\\\"\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null; then :\n  shlibpath_overrides_runpath=yes\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  LDFLAGS=$save_LDFLAGS\n  libdir=$save_libdir\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Append ld.so.conf contents to the search path\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\$2)); skip = 1; } { if (!skip) print \\$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsdelf*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='NetBSD ld.elf_so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=\"/usr/lib\"\n  need_lib_prefix=no\n  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.\n  case $host_os in\n    openbsd3.3 | openbsd3.3.*)\tneed_version=yes ;;\n    *)\t\t\t\tneed_version=no  ;;\n  esac\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case $host_os in\n      openbsd2.[89] | openbsd2.[89].*)\n\tshlibpath_overrides_runpath=no\n\t;;\n      *)\n\tshlibpath_overrides_runpath=yes\n\t;;\n      esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  ;;\n\nos2*)\n  libname_spec='$name'\n  shrext_cmds=\".dll\"\n  need_lib_prefix=no\n  library_names_spec='$libname${shared_ext} $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux\n    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'\n    soname_spec='$libname${shared_ext}.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=freebsd-elf\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $dynamic_linker\" >&5\n$as_echo \"$dynamic_linker\" >&6; }\ntest \"$dynamic_linker\" = no && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test \"${lt_cv_sys_lib_search_path_spec+set}\" = set; then\n  sys_lib_search_path_spec=\"$lt_cv_sys_lib_search_path_spec\"\nfi\nif test \"${lt_cv_sys_lib_dlsearch_path_spec+set}\" = set; then\n  sys_lib_dlsearch_path_spec=\"$lt_cv_sys_lib_dlsearch_path_spec\"\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs\" >&5\n$as_echo_n \"checking how to hardcode library paths into programs... \" >&6; }\nhardcode_action_CXX=\nif test -n \"$hardcode_libdir_flag_spec_CXX\" ||\n   test -n \"$runpath_var_CXX\" ||\n   test \"X$hardcode_automatic_CXX\" = \"Xyes\" ; then\n\n  # We can hardcode non-existent directories.\n  if test \"$hardcode_direct_CXX\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$_LT_TAGVAR(hardcode_shlibpath_var, CXX)\" != no &&\n     test \"$hardcode_minus_L_CXX\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    hardcode_action_CXX=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    hardcode_action_CXX=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  hardcode_action_CXX=unsupported\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX\" >&5\n$as_echo \"$hardcode_action_CXX\" >&6; }\n\nif test \"$hardcode_action_CXX\" = relink ||\n   test \"$inherit_rpath_CXX\" = yes; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n\n\n\n\n\n\n\n  fi # test -n \"$compiler\"\n\n  CC=$lt_save_CC\n  LDCXX=$LD\n  LD=$lt_save_LD\n  GCC=$lt_save_GCC\n  with_gnu_ld=$lt_save_with_gnu_ld\n  lt_cv_path_LDCXX=$lt_cv_path_LD\n  lt_cv_path_LD=$lt_save_path_LD\n  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld\n  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld\nfi # test \"$_lt_caught_CXX_error\" != yes\n\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n\n\n\n\n\n\n\n\n\n\n\n\n        ac_config_commands=\"$ac_config_commands libtool\"\n\n\n\n\n# Only expand once:\n\n\n\n\n# Check whether some low-level functions/files are available\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif test \"${ac_cv_header_stdc+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_header_stdc=yes\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then :\n  :\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_run \"$LINENO\"; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\n$as_echo \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\n\n# These are tested for by AC_HEADER_STDC, but I check again to set the var\nac_fn_cxx_check_header_mongrel \"$LINENO\" \"stdint.h\" \"ac_cv_header_stdint_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_stdint_h\" = x\"\"yes; then :\n  ac_cv_have_stdint_h=1\nelse\n  ac_cv_have_stdint_h=0\nfi\n\n\nac_fn_cxx_check_header_mongrel \"$LINENO\" \"sys/types.h\" \"ac_cv_header_sys_types_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_sys_types_h\" = x\"\"yes; then :\n  ac_cv_have_systypes_h=1\nelse\n  ac_cv_have_systypes_h=0\nfi\n\n\nac_fn_cxx_check_header_mongrel \"$LINENO\" \"inttypes.h\" \"ac_cv_header_inttypes_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_inttypes_h\" = x\"\"yes; then :\n  ac_cv_have_inttypes_h=1\nelse\n  ac_cv_have_inttypes_h=0\nfi\n\n\nfor ac_header in unistd.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"unistd.h\" \"ac_cv_header_unistd_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_unistd_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_UNISTD_H 1\n_ACEOF\n ac_cv_have_unistd_h=1\nelse\n  ac_cv_have_unistd_h=0\nfi\n\ndone\n\nfor ac_header in syscall.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"syscall.h\" \"ac_cv_header_syscall_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_syscall_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_SYSCALL_H 1\n_ACEOF\n\nfi\n\ndone\n\nfor ac_header in sys/syscall.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"sys/syscall.h\" \"ac_cv_header_sys_syscall_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_sys_syscall_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_SYS_SYSCALL_H 1\n_ACEOF\n\nfi\n\ndone\n\n# For backtrace with glibc.\nfor ac_header in execinfo.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"execinfo.h\" \"ac_cv_header_execinfo_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_execinfo_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_EXECINFO_H 1\n_ACEOF\n\nfi\n\ndone\n\n# For backtrace with libunwind.\nfor ac_header in libunwind.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"libunwind.h\" \"ac_cv_header_libunwind_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_libunwind_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBUNWIND_H 1\n_ACEOF\n ac_cv_have_libunwind_h=1\nelse\n  ac_cv_have_libunwind_h=0\nfi\n\ndone\n\nfor ac_header in ucontext.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"ucontext.h\" \"ac_cv_header_ucontext_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_ucontext_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_UCONTEXT_H 1\n_ACEOF\n\nfi\n\ndone\n\nfor ac_header in sys/utsname.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"sys/utsname.h\" \"ac_cv_header_sys_utsname_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_sys_utsname_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_SYS_UTSNAME_H 1\n_ACEOF\n\nfi\n\ndone\n\nfor ac_header in pwd.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"pwd.h\" \"ac_cv_header_pwd_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_pwd_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_PWD_H 1\n_ACEOF\n\nfi\n\ndone\n\nfor ac_header in syslog.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"syslog.h\" \"ac_cv_header_syslog_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_syslog_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_SYSLOG_H 1\n_ACEOF\n\nfi\n\ndone\n\nfor ac_header in sys/time.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"sys/time.h\" \"ac_cv_header_sys_time_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_sys_time_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_SYS_TIME_H 1\n_ACEOF\n\nfi\n\ndone\n\nfor ac_header in glob.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"glob.h\" \"ac_cv_header_glob_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_glob_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_GLOB_H 1\n_ACEOF\n\nfi\n\ndone\n\n\n# The cast to long int works around a bug in the HP C Compiler\n# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects\n# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.\n# This bug is HP SR number 8606223364.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking size of void *\" >&5\n$as_echo_n \"checking size of void *... \" >&6; }\nif test \"${ac_cv_sizeof_void_p+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if ac_fn_cxx_compute_int \"$LINENO\" \"(long int) (sizeof (void *))\" \"ac_cv_sizeof_void_p\"        \"$ac_includes_default\"; then :\n\nelse\n  if test \"$ac_cv_type_void_p\" = yes; then\n     { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n{ as_fn_set_status 77\nas_fn_error \"cannot compute sizeof (void *)\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }; }\n   else\n     ac_cv_sizeof_void_p=0\n   fi\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p\" >&5\n$as_echo \"$ac_cv_sizeof_void_p\" >&6; }\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define SIZEOF_VOID_P $ac_cv_sizeof_void_p\n_ACEOF\n\n\n\n# These are the types I need.  We look for them in either stdint.h,\n# sys/types.h, or inttypes.h, all of which are part of the default-includes.\nac_fn_cxx_check_type \"$LINENO\" \"uint16_t\" \"ac_cv_type_uint16_t\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_uint16_t\" = x\"\"yes; then :\n  ac_cv_have_uint16_t=1\nelse\n  ac_cv_have_uint16_t=0\nfi\n\nac_fn_cxx_check_type \"$LINENO\" \"u_int16_t\" \"ac_cv_type_u_int16_t\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_u_int16_t\" = x\"\"yes; then :\n  ac_cv_have_u_int16_t=1\nelse\n  ac_cv_have_u_int16_t=0\nfi\n\nac_fn_cxx_check_type \"$LINENO\" \"__uint16\" \"ac_cv_type___uint16\" \"$ac_includes_default\"\nif test \"x$ac_cv_type___uint16\" = x\"\"yes; then :\n  ac_cv_have___uint16=1\nelse\n  ac_cv_have___uint16=0\nfi\n\n\nac_fn_cxx_check_func \"$LINENO\" \"sigaltstack\" \"ac_cv_func_sigaltstack\"\nif test \"x$ac_cv_func_sigaltstack\" = x\"\"yes; then :\n\n$as_echo \"#define HAVE_SIGALTSTACK 1\" >>confdefs.h\n\nfi\n\nac_fn_cxx_check_func \"$LINENO\" \"dladdr\" \"ac_cv_func_dladdr\"\nif test \"x$ac_cv_func_dladdr\" = x\"\"yes; then :\n\n$as_echo \"#define HAVE_DLADDR 1\" >>confdefs.h\n\nfi\n\nac_fn_cxx_check_func \"$LINENO\" \"fcntl\" \"ac_cv_func_fcntl\"\nif test \"x$ac_cv_func_fcntl\" = x\"\"yes; then :\n\n$as_echo \"#define HAVE_FCNTL 1\" >>confdefs.h\n\nfi\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for __attribute__\" >&5\n$as_echo_n \"checking for __attribute__... \" >&6; }\n  if test \"${ac_cv___attribute__+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n       static void foo(void) __attribute__ ((unused));\n       void foo(void) { exit(1); }\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv___attribute__=yes\nelse\n  ac_cv___attribute__=no\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n\n  if test \"$ac_cv___attribute__\" = \"yes\"; then\n\n$as_echo \"#define HAVE___ATTRIBUTE__ 1\" >>confdefs.h\n\n  fi\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv___attribute__\" >&5\n$as_echo \"$ac_cv___attribute__\" >&6; }\n\n# We only care about these two attributes.\nif test x\"$ac_cv___attribute__\" = x\"yes\"; then\n  ac_cv___attribute___noreturn=\"__attribute__ ((noreturn))\"\n  ac_cv___attribute___printf_4_5=\"__attribute__((__format__ (__printf__, 4, 5)))\"\nelse\n  ac_cv___attribute___noreturn=\n  ac_cv___attribute___printf_4_5=\nfi\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for __builtin_expect\" >&5\n$as_echo_n \"checking for __builtin_expect... \" >&6; }\n  if test \"${ac_cv___builtin_expect+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nint foo(void) { if (__builtin_expect(0, 0)) return 1; return 0; }\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv___builtin_expect=yes\nelse\n  ac_cv___builtin_expect=no\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n\n  if test \"$ac_cv___builtin_expect\" = \"yes\"; then\n\n$as_echo \"#define HAVE___BUILTIN_EXPECT 1\" >>confdefs.h\n\n  fi\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv___builtin_expect\" >&5\n$as_echo \"$ac_cv___builtin_expect\" >&6; }\n\nif test x\"$ac_cv___builtin_expect\" = x\"yes\"; then\n  ac_cv_have___builtin_expect=1\nelse\n  ac_cv_have___builtin_expect=0\nfi\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for __sync_val_compare_and_swap\" >&5\n$as_echo_n \"checking for __sync_val_compare_and_swap... \" >&6; }\n  if test \"${ac_cv___sync_val_compare_and_swap+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nint main() { int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0; }\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  ac_cv___sync_val_compare_and_swap=yes\nelse\n  ac_cv___sync_val_compare_and_swap=no\n\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\n\n  if test \"$ac_cv___sync_val_compare_and_swap\" = \"yes\"; then\n\n$as_echo \"#define HAVE___SYNC_VAL_COMPARE_AND_SWAP 1\" >>confdefs.h\n\n  fi\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv___sync_val_compare_and_swap\" >&5\n$as_echo \"$ac_cv___sync_val_compare_and_swap\" >&6; }\n\n\n# On x86_64, instead of libunwind, we can choose to compile with frame-pointers\n# (This isn't needed on i386, where -fno-omit-frame-pointer is the default).\n# Check whether --enable-frame_pointers was given.\nif test \"${enable_frame_pointers+set}\" = set; then :\n  enableval=$enable_frame_pointers;\nelse\n  enable_frame_pointers=no\nfi\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\nreturn __x86_64__ == 1 ? 0 : 1\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  is_x86_64=yes\nelse\n  is_x86_64=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n if test \"$enable_frame_pointers\" = yes; then\n  ENABLE_FRAME_POINTERS_TRUE=\n  ENABLE_FRAME_POINTERS_FALSE='#'\nelse\n  ENABLE_FRAME_POINTERS_TRUE='#'\n  ENABLE_FRAME_POINTERS_FALSE=\nfi\n\n if test \"$is_x86_64\" = yes; then\n  X86_64_TRUE=\n  X86_64_FALSE='#'\nelse\n  X86_64_TRUE='#'\n  X86_64_FALSE=\nfi\n\n\n# Some of the code in this directory depends on pthreads\n\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nacx_pthread_ok=no\n\n# We used to check for pthread.h first, but this fails if pthread.h\n# requires special compiler flags (e.g. on True64 or Sequent).\n# It gets checked for in the link test anyway.\n\n# First of all, check if the user has set any of the PTHREAD_LIBS,\n# etcetera environment variables, and if threads linking works using\n# them:\nif test x\"$PTHREAD_LIBS$PTHREAD_CFLAGS\" != x; then\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS\" >&5\n$as_echo_n \"checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... \" >&6; }\n        cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar pthread_join ();\nint\nmain ()\n{\nreturn pthread_join ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  acx_pthread_ok=yes\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok\" >&5\n$as_echo \"$acx_pthread_ok\" >&6; }\n        if test x\"$acx_pthread_ok\" = xno; then\n                PTHREAD_LIBS=\"\"\n                PTHREAD_CFLAGS=\"\"\n        fi\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\nfi\n\n# We must check for the threads library under a number of different\n# names; the ordering is very important because some systems\n# (e.g. DEC) have both -lpthread and -lpthreads, where one of the\n# libraries is broken (non-POSIX).\n\n# Create a list of thread flags to try.  Items starting with a \"-\" are\n# C compiler flags, and other items are library names, except for \"none\"\n# which indicates that we try without any flags at all, and \"pthread-config\"\n# which is a program returning the flags for the Pth emulation library.\n\nacx_pthread_flags=\"pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config\"\n\n# The ordering *is* (sometimes) important.  Some notes on the\n# individual items follow:\n\n# pthreads: AIX (must check this before -lpthread)\n# none: in case threads are in libc; should be tried before -Kthread and\n#       other compiler flags to prevent continual compiler warnings\n# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)\n# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)\n# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)\n# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)\n# -pthreads: Solaris/gcc\n# -mthreads: Mingw32/gcc, Lynx/gcc\n# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it\n#      doesn't hurt to check since this sometimes defines pthreads too;\n#      also defines -D_REENTRANT)\n#      ... -mt is also the pthreads flag for HP/aCC\n# pthread: Linux, etcetera\n# --thread-safe: KAI C++\n# pthread-config: use pthread-config program (for GNU Pth library)\n\ncase \"${host_cpu}-${host_os}\" in\n        *solaris*)\n\n        # On Solaris (at least, for some versions), libc contains stubbed\n        # (non-functional) versions of the pthreads routines, so link-based\n        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/\n        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather\n        # a function called by this macro, so we could check for that, but\n        # who knows whether they'll stub that too in a future libc.)  So,\n        # we'll just look for -pthreads and -lpthread first:\n\n        acx_pthread_flags=\"-pthreads pthread -mt -pthread $acx_pthread_flags\"\n        ;;\nesac\n\nif test x\"$acx_pthread_ok\" = xno; then\nfor flag in $acx_pthread_flags; do\n\n        case $flag in\n                none)\n                { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags\" >&5\n$as_echo_n \"checking whether pthreads work without any flags... \" >&6; }\n                ;;\n\n                -*)\n                { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag\" >&5\n$as_echo_n \"checking whether pthreads work with $flag... \" >&6; }\n                PTHREAD_CFLAGS=\"$flag\"\n                ;;\n\n\t\tpthread-config)\n\t\t# Extract the first word of \"pthread-config\", so it can be a program name with args.\nset dummy pthread-config; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_acx_pthread_config+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$acx_pthread_config\"; then\n  ac_cv_prog_acx_pthread_config=\"$acx_pthread_config\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_acx_pthread_config=\"yes\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  test -z \"$ac_cv_prog_acx_pthread_config\" && ac_cv_prog_acx_pthread_config=\"no\"\nfi\nfi\nacx_pthread_config=$ac_cv_prog_acx_pthread_config\nif test -n \"$acx_pthread_config\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config\" >&5\n$as_echo \"$acx_pthread_config\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n\t\tif test x\"$acx_pthread_config\" = xno; then continue; fi\n\t\tPTHREAD_CFLAGS=\"`pthread-config --cflags`\"\n\t\tPTHREAD_LIBS=\"`pthread-config --ldflags` `pthread-config --libs`\"\n\t\t;;\n\n                *)\n                { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag\" >&5\n$as_echo_n \"checking for the pthreads library -l$flag... \" >&6; }\n                PTHREAD_LIBS=\"-l$flag\"\n                ;;\n        esac\n\n        save_LIBS=\"$LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Check for various functions.  We must include pthread.h,\n        # since some functions may be macros.  (On the Sequent, we\n        # need a special flag -Kthread to make this header compile.)\n        # We check for pthread_join because it is in -lpthread on IRIX\n        # while pthread_create is in libc.  We check for pthread_attr_init\n        # due to DEC craziness with -lpthreads.  We check for\n        # pthread_cleanup_push because it is one of the few pthread\n        # functions on Solaris that doesn't have a non-functional libc stub.\n        # We try pthread_create on general principles.\n        cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <pthread.h>\nint\nmain ()\n{\npthread_t th; pthread_join(th, 0);\n                     pthread_attr_init(0); pthread_cleanup_push(0, 0);\n                     pthread_create(0,0,0,0); pthread_cleanup_pop(0);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  acx_pthread_ok=yes\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok\" >&5\n$as_echo \"$acx_pthread_ok\" >&6; }\n        if test \"x$acx_pthread_ok\" = xyes; then\n                break;\n        fi\n\n        PTHREAD_LIBS=\"\"\n        PTHREAD_CFLAGS=\"\"\ndone\nfi\n\n# Various other checks:\nif test \"x$acx_pthread_ok\" = xyes; then\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute\" >&5\n$as_echo_n \"checking for joinable pthread attribute... \" >&6; }\n\tattr_name=unknown\n\tfor attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do\n\t    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <pthread.h>\nint\nmain ()\n{\nint attr=$attr; return attr;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  attr_name=$attr; break\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\tdone\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $attr_name\" >&5\n$as_echo \"$attr_name\" >&6; }\n        if test \"$attr_name\" != PTHREAD_CREATE_JOINABLE; then\n\ncat >>confdefs.h <<_ACEOF\n#define PTHREAD_CREATE_JOINABLE $attr_name\n_ACEOF\n\n        fi\n\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads\" >&5\n$as_echo_n \"checking if more special flags are required for pthreads... \" >&6; }\n        flag=no\n        case \"${host_cpu}-${host_os}\" in\n            *-aix* | *-freebsd* | *-darwin*) flag=\"-D_THREAD_SAFE\";;\n            *solaris* | *-osf* | *-hpux*) flag=\"-D_REENTRANT\";;\n        esac\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ${flag}\" >&5\n$as_echo \"${flag}\" >&6; }\n        if test \"x$flag\" != xno; then\n            PTHREAD_CFLAGS=\"$flag $PTHREAD_CFLAGS\"\n        fi\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n        # More AIX lossage: must compile with xlc_r or cc_r\n\tif test x\"$GCC\" != xyes; then\n          for ac_prog in xlc_r cc_r\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_PTHREAD_CC+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$PTHREAD_CC\"; then\n  ac_cv_prog_PTHREAD_CC=\"$PTHREAD_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_PTHREAD_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nPTHREAD_CC=$ac_cv_prog_PTHREAD_CC\nif test -n \"$PTHREAD_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC\" >&5\n$as_echo \"$PTHREAD_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$PTHREAD_CC\" && break\ndone\ntest -n \"$PTHREAD_CC\" || PTHREAD_CC=\"${CC}\"\n\n        else\n          PTHREAD_CC=$CC\n\tfi\n\n\t# The next part tries to detect GCC inconsistency with -shared on some\n\t# architectures and systems. The problem is that in certain\n\t# configurations, when -shared is specified, GCC \"forgets\" to\n\t# internally use various flags which are still necessary.\n\n\t#\n\t# Prepare the flags\n\t#\n\tsave_CFLAGS=\"$CFLAGS\"\n\tsave_LIBS=\"$LIBS\"\n\tsave_CC=\"$CC\"\n\n\t# Try with the flags determined by the earlier checks.\n\t#\n\t# -Wl,-z,defs forces link-time symbol resolution, so that the\n\t# linking checks with -shared actually have any value\n\t#\n\t# FIXME: -fPIC is required for -shared on many architectures,\n\t# so we specify it here, but the right way would probably be to\n\t# properly detect whether it is actually required.\n\tCFLAGS=\"-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS\"\n\tLIBS=\"$PTHREAD_LIBS $LIBS\"\n\tCC=\"$PTHREAD_CC\"\n\n\t# In order not to create several levels of indentation, we test\n\t# the value of \"$done\" until we find the cure or run out of ideas.\n\tdone=\"no\"\n\n\t# First, make sure the CFLAGS we added are actually accepted by our\n\t# compiler.  If not (and OS X's ld, for instance, does not accept -z),\n\t# then we can't do this test.\n\tif test x\"$done\" = xno; then\n\t   { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to check for GCC pthread/shared inconsistencies\" >&5\n$as_echo_n \"checking whether to check for GCC pthread/shared inconsistencies... \" >&6; }\n\t   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\nelse\n  done=yes\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\n\t   if test \"x$done\" = xyes ; then\n\t      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\t   else\n\t      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\t   fi\n\tfi\n\n\tif test x\"$done\" = xno; then\n\t   { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether -pthread is sufficient with -shared\" >&5\n$as_echo_n \"checking whether -pthread is sufficient with -shared... \" >&6; }\n\t   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <pthread.h>\nint\nmain ()\n{\npthread_t th; pthread_join(th, 0);\n\t      pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t      pthread_create(0,0,0,0); pthread_cleanup_pop(0);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  done=yes\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\n\t   if test \"x$done\" = xyes; then\n\t      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\t   else\n\t      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\t   fi\n\tfi\n\n\t#\n\t# Linux gcc on some architectures such as mips/mipsel forgets\n\t# about -lpthread\n\t#\n\tif test x\"$done\" = xno; then\n\t   { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether -lpthread fixes that\" >&5\n$as_echo_n \"checking whether -lpthread fixes that... \" >&6; }\n\t   LIBS=\"-lpthread $PTHREAD_LIBS $save_LIBS\"\n\t   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <pthread.h>\nint\nmain ()\n{\npthread_t th; pthread_join(th, 0);\n\t      pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t      pthread_create(0,0,0,0); pthread_cleanup_pop(0);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  done=yes\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\n\t   if test \"x$done\" = xyes; then\n\t      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\t      PTHREAD_LIBS=\"-lpthread $PTHREAD_LIBS\"\n\t   else\n\t      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\t   fi\n\tfi\n\t#\n\t# FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc\n\t#\n\tif test x\"$done\" = xno; then\n\t   { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether -lc_r fixes that\" >&5\n$as_echo_n \"checking whether -lc_r fixes that... \" >&6; }\n\t   LIBS=\"-lc_r $PTHREAD_LIBS $save_LIBS\"\n\t   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <pthread.h>\nint\nmain ()\n{\npthread_t th; pthread_join(th, 0);\n\t        pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t        pthread_create(0,0,0,0); pthread_cleanup_pop(0);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  done=yes\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\n\t   if test \"x$done\" = xyes; then\n\t      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\t      PTHREAD_LIBS=\"-lc_r $PTHREAD_LIBS\"\n\t   else\n\t      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\t   fi\n\tfi\n\tif test x\"$done\" = xno; then\n\t   # OK, we have run out of ideas\n\t   { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: Impossible to determine how to use pthreads with shared libraries\" >&5\n$as_echo \"$as_me: WARNING: Impossible to determine how to use pthreads with shared libraries\" >&2;}\n\n\t   # so it's not safe to assume that we may use pthreads\n\t   acx_pthread_ok=no\n\tfi\n\n\tCFLAGS=\"$save_CFLAGS\"\n\tLIBS=\"$save_LIBS\"\n\tCC=\"$save_CC\"\nelse\n        PTHREAD_CC=\"$CC\"\nfi\n\n\n\n\n\n# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:\nif test x\"$acx_pthread_ok\" = xyes; then\n\n$as_echo \"#define HAVE_PTHREAD 1\" >>confdefs.h\n\n        :\nelse\n        acx_pthread_ok=no\n\nfi\nac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n\nif test x\"$acx_pthread_ok\" = x\"yes\"; then\n  # To make libglog depend on libpthread on Linux, we need to add\n  # -lpthread in addition to -pthread.\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lpthread\" >&5\n$as_echo_n \"checking for pthread_self in -lpthread... \" >&6; }\nif test \"${ac_cv_lib_pthread_pthread_self+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lpthread  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar pthread_self ();\nint\nmain ()\n{\nreturn pthread_self ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  ac_cv_lib_pthread_pthread_self=yes\nelse\n  ac_cv_lib_pthread_pthread_self=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_self\" >&5\n$as_echo \"$ac_cv_lib_pthread_pthread_self\" >&6; }\nif test \"x$ac_cv_lib_pthread_pthread_self\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBPTHREAD 1\n_ACEOF\n\n  LIBS=\"-lpthread $LIBS\"\n\nfi\n\nfi\n\n# Check if there is google-gflags library installed.\nSAVE_CFLAGS=\"$CFLAGS\"\nSAVE_LIBS=\"$LIBS\"\n\n# Check whether --with-gflags was given.\nif test \"${with_gflags+set}\" = set; then :\n  withval=$with_gflags; GFLAGS_CFLAGS=\"-I${with_gflags}/include\"\n  GFLAGS_LIBS=\"-L${with_gflags}/lib -lgflags\"\n  CFLAGS=\"$CFLAGS $GFLAGS_CFLAGS\"\n  LIBS=\"$LIBS $GFLAGS_LIBS\"\n\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for main in -lgflags\" >&5\n$as_echo_n \"checking for main in -lgflags... \" >&6; }\nif test \"${ac_cv_lib_gflags_main+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lgflags  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n\nint\nmain ()\n{\nreturn main ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  ac_cv_lib_gflags_main=yes\nelse\n  ac_cv_lib_gflags_main=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gflags_main\" >&5\n$as_echo \"$ac_cv_lib_gflags_main\" >&6; }\nif test \"x$ac_cv_lib_gflags_main\" = x\"\"yes; then :\n  ac_cv_have_libgflags=1\nelse\n  ac_cv_have_libgflags=0\nfi\n\nif test x\"$ac_cv_have_libgflags\" = x\"1\"; then\n\n$as_echo \"#define HAVE_LIB_GFLAGS 1\" >>confdefs.h\n\n  if test x\"$GFLAGS_LIBS\" = x\"\"; then\n    GFLAGS_LIBS=\"-lgflags\"\n  fi\nelse\n  GFLAGS_CFLAGS=\n  GFLAGS_LIBS=\nfi\nCFLAGS=\"$SAVE_CFLAGS\"\nLIBS=\"$SAVE_LIBS\"\n\n# TODO(hamaji): Use official m4 macros provided by testing libraries\n#               once the m4 macro of Google Mocking becomes ready.\n# Check if there is Google Test library installed.\n# Extract the first word of \"gtest-config\", so it can be a program name with args.\nset dummy gtest-config; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_GTEST_CONFIG+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$GTEST_CONFIG\"; then\n  ac_cv_prog_GTEST_CONFIG=\"$GTEST_CONFIG\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_GTEST_CONFIG=\"\"yes\"\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nGTEST_CONFIG=$ac_cv_prog_GTEST_CONFIG\nif test -n \"$GTEST_CONFIG\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $GTEST_CONFIG\" >&5\n$as_echo \"$GTEST_CONFIG\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nif test x\"$GTEST_CONFIG\" = \"xyes\"; then\n  GTEST_CFLAGS=`gtest-config --cppflags --cxxflags`\n  GTEST_LIBS=`gtest-config --ldflags --libs`\n\n$as_echo \"#define HAVE_LIB_GTEST 1\" >>confdefs.h\n\n\n  # Check if there is Google Mocking library installed.\n  # Extract the first word of \"gmock-config\", so it can be a program name with args.\nset dummy gmock-config; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_GMOCK_CONFIG+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$GMOCK_CONFIG\"; then\n  ac_cv_prog_GMOCK_CONFIG=\"$GMOCK_CONFIG\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_GMOCK_CONFIG=\"\"yes\"\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nGMOCK_CONFIG=$ac_cv_prog_GMOCK_CONFIG\nif test -n \"$GMOCK_CONFIG\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $GMOCK_CONFIG\" >&5\n$as_echo \"$GMOCK_CONFIG\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  if test x\"$GMOCK_CONFIG\" = \"xyes\"; then\n    GMOCK_CFLAGS=`gmock-config --cppflags --cxxflags`\n    GMOCK_LIBS=`gmock-config --ldflags --libs`\n\n$as_echo \"#define HAVE_LIB_GMOCK 1\" >>confdefs.h\n\n  else\n    # We don't run test cases which use Google Mocking framework.\n    GMOCK_CFLAGS=\n    GMOCK_LIBS=\n  fi\nelse\n  # We'll use src/googletest.h for our unittests.\n  GTEST_CFLAGS=\n  GTEST_LIBS=\nfi\n if test x\"$GMOCK_CONFIG\" = \"xyes\"; then\n  HAVE_GMOCK_TRUE=\n  HAVE_GMOCK_FALSE='#'\nelse\n  HAVE_GMOCK_TRUE='#'\n  HAVE_GMOCK_FALSE=\nfi\n\n\n# We want to link in libunwind if it exists\nUNWIND_LIBS=\n# Unfortunately, we need to check the header file in addition to the\n# lib file to check if libunwind is available since libunwind-0.98\n# doesn't install all necessary header files.\nif test x\"$ac_cv_have_libunwind_h\" = x\"1\"; then\n { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for backtrace in -lunwind\" >&5\n$as_echo_n \"checking for backtrace in -lunwind... \" >&6; }\nif test \"${ac_cv_lib_unwind_backtrace+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lunwind  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar backtrace ();\nint\nmain ()\n{\nreturn backtrace ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_link \"$LINENO\"; then :\n  ac_cv_lib_unwind_backtrace=yes\nelse\n  ac_cv_lib_unwind_backtrace=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_unwind_backtrace\" >&5\n$as_echo \"$ac_cv_lib_unwind_backtrace\" >&6; }\nif test \"x$ac_cv_lib_unwind_backtrace\" = x\"\"yes; then :\n  UNWIND_LIBS=-lunwind\nfi\n\nfi\n\nif test x\"$UNWIND_LIBS\" != x\"\"; then\n\n$as_echo \"#define HAVE_LIB_UNWIND 1\" >>confdefs.h\n\nfi\n\n# We'd like to use read/write locks in several places in the code.\n# See if our pthreads support extends to that.  Note: for linux, it\n# does as long as you define _XOPEN_SOURCE appropriately.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking support for pthread_rwlock_* functions\" >&5\n$as_echo_n \"checking support for pthread_rwlock_* functions... \" >&6; }\nif test \"${ac_cv_rwlock+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#define _XOPEN_SOURCE 500\n                 #include <pthread.h>\nint\nmain ()\n{\npthread_rwlock_t l; pthread_rwlock_init(&l, NULL);\n                 pthread_rwlock_rdlock(&l);\n                 return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_rwlock=yes\nelse\n  ac_cv_rwlock=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n ac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_rwlock\" >&5\n$as_echo \"$ac_cv_rwlock\" >&6; }\nif test \"$ac_cv_rwlock\" = yes; then\n\n$as_echo \"#define HAVE_RWLOCK 1\" >>confdefs.h\n\nfi\n\n\n# Find out what namespace 'normal' STL code lives in, and also what namespace\n# the user wants our classes to be defined in\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the compiler implements namespaces\" >&5\n$as_echo_n \"checking whether the compiler implements namespaces... \" >&6; }\nif test \"${ac_cv_cxx_namespaces+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n                  ac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n                  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nnamespace Outer {\n                                    namespace Inner { int i = 0; }}\nint\nmain ()\n{\nusing namespace Outer::Inner; return i;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_cxx_namespaces=yes\nelse\n  ac_cv_cxx_namespaces=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n                  ac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_namespaces\" >&5\n$as_echo \"$ac_cv_cxx_namespaces\" >&6; }\n  if test \"$ac_cv_cxx_namespaces\" = yes; then\n\n$as_echo \"#define HAVE_NAMESPACES 1\" >>confdefs.h\n\n  fi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking what namespace STL code is in\" >&5\n$as_echo_n \"checking what namespace STL code is in... \" >&6; }\nif test \"${ac_cv_cxx_stl_namespace+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n\n      ac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <vector>\nint\nmain ()\n{\nvector<int> t; return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_cxx_stl_namespace=none\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <vector>\nint\nmain ()\n{\nstd::vector<int> t; return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_cxx_stl_namespace=std\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n      ac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_stl_namespace\" >&5\n$as_echo \"$ac_cv_cxx_stl_namespace\" >&6; }\n   if test \"$ac_cv_cxx_stl_namespace\" = none; then\n\n$as_echo \"#define STL_NAMESPACE /**/\" >>confdefs.h\n\n   fi\n   if test \"$ac_cv_cxx_stl_namespace\" = std; then\n\n$as_echo \"#define STL_NAMESPACE std\" >>confdefs.h\n\n   fi\n\ngoogle_namespace_default=google\n   # Check whether --enable-namespace was given.\nif test \"${enable_namespace+set}\" = set; then :\n  enableval=$enable_namespace; case \"$enableval\" in\n                    yes) google_namespace=\"$google_namespace_default\" ;;\n                     no) google_namespace=\"\" ;;\n                      *) google_namespace=\"$enableval\" ;;\n                  esac\nelse\n  google_namespace=\"$google_namespace_default\"\nfi\n\n   if test -n \"$google_namespace\"; then\n     ac_google_namespace=\"$google_namespace\"\n     ac_google_start_namespace=\"namespace $google_namespace {\"\n     ac_google_end_namespace=\"}\"\n   else\n     ac_google_namespace=\"\"\n     ac_google_start_namespace=\"\"\n     ac_google_end_namespace=\"\"\n   fi\n\ncat >>confdefs.h <<_ACEOF\n#define GOOGLE_NAMESPACE $ac_google_namespace\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define _START_GOOGLE_NAMESPACE_ $ac_google_start_namespace\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define _END_GOOGLE_NAMESPACE_ $ac_google_end_namespace\n_ACEOF\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether compiler supports using ::operator<<\" >&5\n$as_echo_n \"checking whether compiler supports using ::operator<<... \" >&6; }\nif test \"${ac_cv_cxx_using_operator+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n       ac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\n       cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <iostream>\n                       std::ostream& operator<<(std::ostream&, struct s);\nint\nmain ()\n{\nusing ::operator<<; return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n  ac_cv_cxx_using_operator=1\nelse\n  ac_cv_cxx_using_operator=0\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n      ac_ext=cpp\nac_cpp='$CXXCPP $CPPFLAGS'\nac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_cxx_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_using_operator\" >&5\n$as_echo \"$ac_cv_cxx_using_operator\" >&6; }\n  if test \"$ac_cv_cxx_using_operator\" = 1; then\n\n$as_echo \"#define HAVE_USING_OPERATOR 1\" >>confdefs.h\n\n  fi\n\nfor ac_header in ucontext.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"ucontext.h\" \"ac_cv_header_ucontext_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_ucontext_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_UCONTEXT_H 1\n_ACEOF\n\nfi\n\ndone\n\n   for ac_header in sys/ucontext.h\ndo :\n  ac_fn_cxx_check_header_mongrel \"$LINENO\" \"sys/ucontext.h\" \"ac_cv_header_sys_ucontext_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_sys_ucontext_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_SYS_UCONTEXT_H 1\n_ACEOF\n\nfi\n\ndone\n       # ucontext on OS X 10.6 (at least)\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to access the program counter from a struct ucontext\" >&5\n$as_echo_n \"checking how to access the program counter from a struct ucontext... \" >&6; }\n   pc_fields=\"           uc_mcontext.gregs[REG_PC]\"  # Solaris x86 (32 + 64 bit)\n   pc_fields=\"$pc_fields uc_mcontext.gregs[REG_EIP]\" # Linux (i386)\n   pc_fields=\"$pc_fields uc_mcontext.gregs[REG_RIP]\" # Linux (x86_64)\n   pc_fields=\"$pc_fields uc_mcontext.sc_ip\"            # Linux (ia64)\n   pc_fields=\"$pc_fields uc_mcontext.uc_regs->gregs[PT_NIP]\" # Linux (ppc)\n   pc_fields=\"$pc_fields uc_mcontext.gregs[R15]\"     # Linux (arm old [untested])\n   pc_fields=\"$pc_fields uc_mcontext.arm_pc\"           # Linux (arm new [untested])\n   pc_fields=\"$pc_fields uc_mcontext.mc_eip\"           # FreeBSD (i386)\n   pc_fields=\"$pc_fields uc_mcontext.mc_rip\"           # FreeBSD (x86_64 [untested])\n   pc_fields=\"$pc_fields uc_mcontext.__gregs[_REG_EIP]\"  # NetBSD (i386)\n   pc_fields=\"$pc_fields uc_mcontext.__gregs[_REG_RIP]\"  # NetBSD (x86_64)\n   pc_fields=\"$pc_fields uc_mcontext->ss.eip\"          # OS X (i386, <=10.4)\n   pc_fields=\"$pc_fields uc_mcontext->__ss.__eip\"      # OS X (i386, >=10.5)\n   pc_fields=\"$pc_fields uc_mcontext->ss.rip\"          # OS X (x86_64)\n   pc_fields=\"$pc_fields uc_mcontext->__ss.__rip\"      # OS X (>=10.5 [untested])\n   pc_fields=\"$pc_fields uc_mcontext->ss.srr0\"         # OS X (ppc, ppc64 [untested])\n   pc_fields=\"$pc_fields uc_mcontext->__ss.__srr0\"     # OS X (>=10.5 [untested])\n   pc_field_found=false\n   for pc_field in $pc_fields; do\n     if ! $pc_field_found; then\n       if test \"x$ac_cv_header_sys_ucontext_h\" = xyes; then\n         cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#define _GNU_SOURCE 1\n                         #include <sys/ucontext.h>\nint\nmain ()\n{\nucontext_t u; return u.$pc_field == 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\ncat >>confdefs.h <<_ACEOF\n#define PC_FROM_UCONTEXT $pc_field\n_ACEOF\n\n                        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $pc_field\" >&5\n$as_echo \"$pc_field\" >&6; }\n                        pc_field_found=true\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n       else\n         cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#define _GNU_SOURCE 1\n                         #include <ucontext.h>\nint\nmain ()\n{\nucontext_t u; return u.$pc_field == 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\ncat >>confdefs.h <<_ACEOF\n#define PC_FROM_UCONTEXT $pc_field\n_ACEOF\n\n                        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $pc_field\" >&5\n$as_echo \"$pc_field\" >&6; }\n                        pc_field_found=true\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n       fi\n     fi\n   done\n   if ! $pc_field_found; then\n     pc_fields=\"           sc_eip\"  # OpenBSD (i386)\n     pc_fields=\"$pc_fields sc_rip\"  # OpenBSD (x86_64)\n     for pc_field in $pc_fields; do\n       if ! $pc_field_found; then\n         cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <signal.h>\nint\nmain ()\n{\nucontext_t u; return u.$pc_field == 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_cxx_try_compile \"$LINENO\"; then :\n\ncat >>confdefs.h <<_ACEOF\n#define PC_FROM_UCONTEXT $pc_field\n_ACEOF\n\n                        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $pc_field\" >&5\n$as_echo \"$pc_field\" >&6; }\n                        pc_field_found=true\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n       fi\n     done\n   fi\n   if ! $pc_field_found; then\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: Could not find the PC.  Will not output failed addresses...\" >&5\n$as_echo \"$as_me: WARNING: Could not find the PC.  Will not output failed addresses...\" >&2;}\n   fi\n\n\ncat >>confdefs.h <<_ACEOF\n#define TEST_SRC_DIR \"$srcdir\"\n_ACEOF\n\n\n# These are what's needed by logging.h.in and raw_logging.h.in\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# Write generated configuration file\nac_config_files=\"$ac_config_files Makefile src/glog/logging.h src/glog/raw_logging.h src/glog/vlog_is_on.h src/glog/stl_logging.h\"\n\nac_config_files=\"$ac_config_files libglog.pc\"\n\ncat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes: double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\.\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    test \"x$cache_file\" != \"x/dev/null\" &&\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: updating cache $cache_file\" >&5\n$as_echo \"$as_me: updating cache $cache_file\" >&6;}\n    cat confcache >$cache_file\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file\" >&5\n$as_echo \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\nDEFS=-DHAVE_CONFIG_H\n\nac_libobjs=\nac_ltlibobjs=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_script='s/\\$U\\././;s/\\.o$//;s/\\.obj$//'\n  ac_i=`$as_echo \"$ac_i\" | sed \"$ac_script\"`\n  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR\n  #    will be set to the directory where LIBOBJS objects are built.\n  as_fn_append ac_libobjs \" \\${LIBOBJDIR}$ac_i\\$U.$ac_objext\"\n  as_fn_append ac_ltlibobjs \" \\${LIBOBJDIR}$ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n if test -n \"$EXEEXT\"; then\n  am__EXEEXT_TRUE=\n  am__EXEEXT_FALSE='#'\nelse\n  am__EXEEXT_TRUE='#'\n  am__EXEEXT_FALSE=\nfi\n\nif test -z \"${AMDEP_TRUE}\" && test -z \"${AMDEP_FALSE}\"; then\n  as_fn_error \"conditional \\\"AMDEP\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCC_TRUE}\" && test -z \"${am__fastdepCC_FALSE}\"; then\n  as_fn_error \"conditional \\\"am__fastdepCC\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCXX_TRUE}\" && test -z \"${am__fastdepCXX_FALSE}\"; then\n  as_fn_error \"conditional \\\"am__fastdepCXX\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${GCC_TRUE}\" && test -z \"${GCC_FALSE}\"; then\n  as_fn_error \"conditional \\\"GCC\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCXX_TRUE}\" && test -z \"${am__fastdepCXX_FALSE}\"; then\n  as_fn_error \"conditional \\\"am__fastdepCXX\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${ENABLE_FRAME_POINTERS_TRUE}\" && test -z \"${ENABLE_FRAME_POINTERS_FALSE}\"; then\n  as_fn_error \"conditional \\\"ENABLE_FRAME_POINTERS\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${X86_64_TRUE}\" && test -z \"${X86_64_FALSE}\"; then\n  as_fn_error \"conditional \\\"X86_64\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${HAVE_GMOCK_TRUE}\" && test -z \"${HAVE_GMOCK_FALSE}\"; then\n  as_fn_error \"conditional \\\"HAVE_GMOCK\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\n\n: ${CONFIG_STATUS=./config.status}\nac_write_fail=0\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: creating $CONFIG_STATUS\" >&6;}\nas_write_fail=0\ncat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\n\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$CONFIG_STATUS <<\\_ASEOF || as_write_fail=1\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n\n# as_fn_error ERROR [LINENO LOG_FD]\n# ---------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with status $?, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$?; test $as_status -eq 0 && as_status=1\n  if test \"$3\"; then\n    as_lineno=${as_lineno-\"$2\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $1\" >&$3\n  fi\n  $as_echo \"$as_me: error: $1\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -p'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -p'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -p'\n  fi\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nif test -x / >/dev/null 2>&1; then\n  as_test_x='test -x'\nelse\n  if ls -dL / >/dev/null 2>&1; then\n    as_ls_L_option=L\n  else\n    as_ls_L_option=\n  fi\n  as_test_x='\n    eval sh -c '\\''\n      if test -d \"$1\"; then\n\ttest -d \"$1/.\";\n      else\n\tcase $1 in #(\n\t-*)set \"./$1\";;\n\tesac;\n\tcase `ls -ld'$as_ls_L_option' \"$1\" 2>/dev/null` in #((\n\t???[sx]*):;;*)false;;esac;fi\n    '\\'' sh\n  '\nfi\nas_executable_p=$as_test_x\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\nexec 6>&1\n## ----------------------------------- ##\n## Main body of $CONFIG_STATUS script. ##\n## ----------------------------------- ##\n_ASEOF\ntest $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# Save the log message, to keep $0 and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.\nac_log=\"\nThis file was extended by glog $as_me 0.3.1, which was\ngenerated by GNU Autoconf 2.65.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\non `(hostname || uname -n) 2>/dev/null | sed 1q`\n\"\n\n_ACEOF\n\ncase $ac_config_files in *\"\n\"*) set x $ac_config_files; shift; ac_config_files=$*;;\nesac\n\ncase $ac_config_headers in *\"\n\"*) set x $ac_config_headers; shift; ac_config_headers=$*;;\nesac\n\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n# Files that config.status was made for.\nconfig_files=\"$ac_config_files\"\nconfig_headers=\"$ac_config_headers\"\nconfig_commands=\"$ac_config_commands\"\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nac_cs_usage=\"\\\n\\`$as_me' instantiates files and other configuration actions\nfrom templates according to the current configuration.  Unless the files\nand actions are specified as TAGs, all are instantiated by default.\n\nUsage: $0 [OPTION]... [TAG]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number and configuration settings, then exit\n      --config     print configuration, then exit\n  -q, --quiet, --silent\n                   do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n      --file=FILE[:TEMPLATE]\n                   instantiate the configuration file FILE\n      --header=FILE[:TEMPLATE]\n                   instantiate the configuration header FILE\n\nConfiguration files:\n$config_files\n\nConfiguration headers:\n$config_headers\n\nConfiguration commands:\n$config_commands\n\nReport bugs to <opensource@google.com>.\"\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_cs_config=\"`$as_echo \"$ac_configure_args\" | sed 's/^ //; s/[\\\\\"\"\\`\\$]/\\\\\\\\&/g'`\"\nac_cs_version=\"\\\\\nglog config.status 0.3.1\nconfigured by $0, generated by GNU Autoconf 2.65,\n  with options \\\\\"\\$ac_cs_config\\\\\"\n\nCopyright (C) 2009 Free Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\n\nac_pwd='$ac_pwd'\nsrcdir='$srcdir'\nINSTALL='$INSTALL'\nMKDIR_P='$MKDIR_P'\nAWK='$AWK'\ntest -n \"\\$AWK\" || AWK=awk\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# The default lists apply if the user does not specify any file.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=*)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=`expr \"X$1\" : 'X[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  *)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )\n    $as_echo \"$ac_cs_version\"; exit ;;\n  --config | --confi | --conf | --con | --co | --c )\n    $as_echo \"$ac_cs_config\"; exit ;;\n  --debug | --debu | --deb | --de | --d | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    as_fn_append CONFIG_FILES \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --header | --heade | --head | --hea )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    as_fn_append CONFIG_HEADERS \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --he | --h)\n    # Conflict between --help and --header\n    as_fn_error \"ambiguous option: \\`$1'\nTry \\`$0 --help' for more information.\";;\n  --help | --hel | -h )\n    $as_echo \"$ac_cs_usage\"; exit ;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) as_fn_error \"unrecognized option: \\`$1'\nTry \\`$0 --help' for more information.\" ;;\n\n  *) as_fn_append ac_config_targets \" $1\"\n     ac_need_defaults=false ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nif \\$ac_cs_recheck; then\n  set X '$SHELL' '$0' $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\n  shift\n  \\$as_echo \"running CONFIG_SHELL=$SHELL \\$*\" >&6\n  CONFIG_SHELL='$SHELL'\n  export CONFIG_SHELL\n  exec \"\\$@\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n  $as_echo \"$ac_log\"\n} >&5\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n#\n# INIT-COMMANDS\n#\nAMDEP_TRUE=\"$AMDEP_TRUE\" ac_aux_dir=\"$ac_aux_dir\"\n\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nsed_quote_subst='$sed_quote_subst'\ndouble_quote_subst='$double_quote_subst'\ndelay_variable_subst='$delay_variable_subst'\nmacro_version='`$ECHO \"X$macro_version\" | $Xsed -e \"$delay_single_quote_subst\"`'\nmacro_revision='`$ECHO \"X$macro_revision\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_shared='`$ECHO \"X$enable_shared\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_static='`$ECHO \"X$enable_static\" | $Xsed -e \"$delay_single_quote_subst\"`'\npic_mode='`$ECHO \"X$pic_mode\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_fast_install='`$ECHO \"X$enable_fast_install\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhost_alias='`$ECHO \"X$host_alias\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhost='`$ECHO \"X$host\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhost_os='`$ECHO \"X$host_os\" | $Xsed -e \"$delay_single_quote_subst\"`'\nbuild_alias='`$ECHO \"X$build_alias\" | $Xsed -e \"$delay_single_quote_subst\"`'\nbuild='`$ECHO \"X$build\" | $Xsed -e \"$delay_single_quote_subst\"`'\nbuild_os='`$ECHO \"X$build_os\" | $Xsed -e \"$delay_single_quote_subst\"`'\nSED='`$ECHO \"X$SED\" | $Xsed -e \"$delay_single_quote_subst\"`'\nXsed='`$ECHO \"X$Xsed\" | $Xsed -e \"$delay_single_quote_subst\"`'\nGREP='`$ECHO \"X$GREP\" | $Xsed -e \"$delay_single_quote_subst\"`'\nEGREP='`$ECHO \"X$EGREP\" | $Xsed -e \"$delay_single_quote_subst\"`'\nFGREP='`$ECHO \"X$FGREP\" | $Xsed -e \"$delay_single_quote_subst\"`'\nLD='`$ECHO \"X$LD\" | $Xsed -e \"$delay_single_quote_subst\"`'\nNM='`$ECHO \"X$NM\" | $Xsed -e \"$delay_single_quote_subst\"`'\nLN_S='`$ECHO \"X$LN_S\" | $Xsed -e \"$delay_single_quote_subst\"`'\nmax_cmd_len='`$ECHO \"X$max_cmd_len\" | $Xsed -e \"$delay_single_quote_subst\"`'\nac_objext='`$ECHO \"X$ac_objext\" | $Xsed -e \"$delay_single_quote_subst\"`'\nexeext='`$ECHO \"X$exeext\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_unset='`$ECHO \"X$lt_unset\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_SP2NL='`$ECHO \"X$lt_SP2NL\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_NL2SP='`$ECHO \"X$lt_NL2SP\" | $Xsed -e \"$delay_single_quote_subst\"`'\nreload_flag='`$ECHO \"X$reload_flag\" | $Xsed -e \"$delay_single_quote_subst\"`'\nreload_cmds='`$ECHO \"X$reload_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nOBJDUMP='`$ECHO \"X$OBJDUMP\" | $Xsed -e \"$delay_single_quote_subst\"`'\ndeplibs_check_method='`$ECHO \"X$deplibs_check_method\" | $Xsed -e \"$delay_single_quote_subst\"`'\nfile_magic_cmd='`$ECHO \"X$file_magic_cmd\" | $Xsed -e \"$delay_single_quote_subst\"`'\nAR='`$ECHO \"X$AR\" | $Xsed -e \"$delay_single_quote_subst\"`'\nAR_FLAGS='`$ECHO \"X$AR_FLAGS\" | $Xsed -e \"$delay_single_quote_subst\"`'\nSTRIP='`$ECHO \"X$STRIP\" | $Xsed -e \"$delay_single_quote_subst\"`'\nRANLIB='`$ECHO \"X$RANLIB\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_postinstall_cmds='`$ECHO \"X$old_postinstall_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_postuninstall_cmds='`$ECHO \"X$old_postuninstall_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_archive_cmds='`$ECHO \"X$old_archive_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nCC='`$ECHO \"X$CC\" | $Xsed -e \"$delay_single_quote_subst\"`'\nCFLAGS='`$ECHO \"X$CFLAGS\" | $Xsed -e \"$delay_single_quote_subst\"`'\ncompiler='`$ECHO \"X$compiler\" | $Xsed -e \"$delay_single_quote_subst\"`'\nGCC='`$ECHO \"X$GCC\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_pipe='`$ECHO \"X$lt_cv_sys_global_symbol_pipe\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_cdecl='`$ECHO \"X$lt_cv_sys_global_symbol_to_cdecl\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_c_name_address='`$ECHO \"X$lt_cv_sys_global_symbol_to_c_name_address\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO \"X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix\" | $Xsed -e \"$delay_single_quote_subst\"`'\nobjdir='`$ECHO \"X$objdir\" | $Xsed -e \"$delay_single_quote_subst\"`'\nSHELL='`$ECHO \"X$SHELL\" | $Xsed -e \"$delay_single_quote_subst\"`'\nECHO='`$ECHO \"X$ECHO\" | $Xsed -e \"$delay_single_quote_subst\"`'\nMAGIC_CMD='`$ECHO \"X$MAGIC_CMD\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_prog_compiler_no_builtin_flag='`$ECHO \"X$lt_prog_compiler_no_builtin_flag\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_prog_compiler_wl='`$ECHO \"X$lt_prog_compiler_wl\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_prog_compiler_pic='`$ECHO \"X$lt_prog_compiler_pic\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_prog_compiler_static='`$ECHO \"X$lt_prog_compiler_static\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_cv_prog_compiler_c_o='`$ECHO \"X$lt_cv_prog_compiler_c_o\" | $Xsed -e \"$delay_single_quote_subst\"`'\nneed_locks='`$ECHO \"X$need_locks\" | $Xsed -e \"$delay_single_quote_subst\"`'\nDSYMUTIL='`$ECHO \"X$DSYMUTIL\" | $Xsed -e \"$delay_single_quote_subst\"`'\nNMEDIT='`$ECHO \"X$NMEDIT\" | $Xsed -e \"$delay_single_quote_subst\"`'\nLIPO='`$ECHO \"X$LIPO\" | $Xsed -e \"$delay_single_quote_subst\"`'\nOTOOL='`$ECHO \"X$OTOOL\" | $Xsed -e \"$delay_single_quote_subst\"`'\nOTOOL64='`$ECHO \"X$OTOOL64\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlibext='`$ECHO \"X$libext\" | $Xsed -e \"$delay_single_quote_subst\"`'\nshrext_cmds='`$ECHO \"X$shrext_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nextract_expsyms_cmds='`$ECHO \"X$extract_expsyms_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\narchive_cmds_need_lc='`$ECHO \"X$archive_cmds_need_lc\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_shared_with_static_runtimes='`$ECHO \"X$enable_shared_with_static_runtimes\" | $Xsed -e \"$delay_single_quote_subst\"`'\nexport_dynamic_flag_spec='`$ECHO \"X$export_dynamic_flag_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nwhole_archive_flag_spec='`$ECHO \"X$whole_archive_flag_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\ncompiler_needs_object='`$ECHO \"X$compiler_needs_object\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_archive_from_new_cmds='`$ECHO \"X$old_archive_from_new_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_archive_from_expsyms_cmds='`$ECHO \"X$old_archive_from_expsyms_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\narchive_cmds='`$ECHO \"X$archive_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\narchive_expsym_cmds='`$ECHO \"X$archive_expsym_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nmodule_cmds='`$ECHO \"X$module_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nmodule_expsym_cmds='`$ECHO \"X$module_expsym_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nwith_gnu_ld='`$ECHO \"X$with_gnu_ld\" | $Xsed -e \"$delay_single_quote_subst\"`'\nallow_undefined_flag='`$ECHO \"X$allow_undefined_flag\" | $Xsed -e \"$delay_single_quote_subst\"`'\nno_undefined_flag='`$ECHO \"X$no_undefined_flag\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_libdir_flag_spec='`$ECHO \"X$hardcode_libdir_flag_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_libdir_flag_spec_ld='`$ECHO \"X$hardcode_libdir_flag_spec_ld\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_libdir_separator='`$ECHO \"X$hardcode_libdir_separator\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_direct='`$ECHO \"X$hardcode_direct\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_direct_absolute='`$ECHO \"X$hardcode_direct_absolute\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_minus_L='`$ECHO \"X$hardcode_minus_L\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_shlibpath_var='`$ECHO \"X$hardcode_shlibpath_var\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_automatic='`$ECHO \"X$hardcode_automatic\" | $Xsed -e \"$delay_single_quote_subst\"`'\ninherit_rpath='`$ECHO \"X$inherit_rpath\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlink_all_deplibs='`$ECHO \"X$link_all_deplibs\" | $Xsed -e \"$delay_single_quote_subst\"`'\nfix_srcfile_path='`$ECHO \"X$fix_srcfile_path\" | $Xsed -e \"$delay_single_quote_subst\"`'\nalways_export_symbols='`$ECHO \"X$always_export_symbols\" | $Xsed -e \"$delay_single_quote_subst\"`'\nexport_symbols_cmds='`$ECHO \"X$export_symbols_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nexclude_expsyms='`$ECHO \"X$exclude_expsyms\" | $Xsed -e \"$delay_single_quote_subst\"`'\ninclude_expsyms='`$ECHO \"X$include_expsyms\" | $Xsed -e \"$delay_single_quote_subst\"`'\nprelink_cmds='`$ECHO \"X$prelink_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nfile_list_spec='`$ECHO \"X$file_list_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nvariables_saved_for_relink='`$ECHO \"X$variables_saved_for_relink\" | $Xsed -e \"$delay_single_quote_subst\"`'\nneed_lib_prefix='`$ECHO \"X$need_lib_prefix\" | $Xsed -e \"$delay_single_quote_subst\"`'\nneed_version='`$ECHO \"X$need_version\" | $Xsed -e \"$delay_single_quote_subst\"`'\nversion_type='`$ECHO \"X$version_type\" | $Xsed -e \"$delay_single_quote_subst\"`'\nrunpath_var='`$ECHO \"X$runpath_var\" | $Xsed -e \"$delay_single_quote_subst\"`'\nshlibpath_var='`$ECHO \"X$shlibpath_var\" | $Xsed -e \"$delay_single_quote_subst\"`'\nshlibpath_overrides_runpath='`$ECHO \"X$shlibpath_overrides_runpath\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlibname_spec='`$ECHO \"X$libname_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlibrary_names_spec='`$ECHO \"X$library_names_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nsoname_spec='`$ECHO \"X$soname_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\npostinstall_cmds='`$ECHO \"X$postinstall_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\npostuninstall_cmds='`$ECHO \"X$postuninstall_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nfinish_cmds='`$ECHO \"X$finish_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nfinish_eval='`$ECHO \"X$finish_eval\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_into_libs='`$ECHO \"X$hardcode_into_libs\" | $Xsed -e \"$delay_single_quote_subst\"`'\nsys_lib_search_path_spec='`$ECHO \"X$sys_lib_search_path_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nsys_lib_dlsearch_path_spec='`$ECHO \"X$sys_lib_dlsearch_path_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_action='`$ECHO \"X$hardcode_action\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_dlopen='`$ECHO \"X$enable_dlopen\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_dlopen_self='`$ECHO \"X$enable_dlopen_self\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_dlopen_self_static='`$ECHO \"X$enable_dlopen_self_static\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_striplib='`$ECHO \"X$old_striplib\" | $Xsed -e \"$delay_single_quote_subst\"`'\nstriplib='`$ECHO \"X$striplib\" | $Xsed -e \"$delay_single_quote_subst\"`'\ncompiler_lib_search_dirs='`$ECHO \"X$compiler_lib_search_dirs\" | $Xsed -e \"$delay_single_quote_subst\"`'\npredep_objects='`$ECHO \"X$predep_objects\" | $Xsed -e \"$delay_single_quote_subst\"`'\npostdep_objects='`$ECHO \"X$postdep_objects\" | $Xsed -e \"$delay_single_quote_subst\"`'\npredeps='`$ECHO \"X$predeps\" | $Xsed -e \"$delay_single_quote_subst\"`'\npostdeps='`$ECHO \"X$postdeps\" | $Xsed -e \"$delay_single_quote_subst\"`'\ncompiler_lib_search_path='`$ECHO \"X$compiler_lib_search_path\" | $Xsed -e \"$delay_single_quote_subst\"`'\nLD_CXX='`$ECHO \"X$LD_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_archive_cmds_CXX='`$ECHO \"X$old_archive_cmds_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\ncompiler_CXX='`$ECHO \"X$compiler_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nGCC_CXX='`$ECHO \"X$GCC_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_prog_compiler_no_builtin_flag_CXX='`$ECHO \"X$lt_prog_compiler_no_builtin_flag_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_prog_compiler_wl_CXX='`$ECHO \"X$lt_prog_compiler_wl_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_prog_compiler_pic_CXX='`$ECHO \"X$lt_prog_compiler_pic_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_prog_compiler_static_CXX='`$ECHO \"X$lt_prog_compiler_static_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_cv_prog_compiler_c_o_CXX='`$ECHO \"X$lt_cv_prog_compiler_c_o_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\narchive_cmds_need_lc_CXX='`$ECHO \"X$archive_cmds_need_lc_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_shared_with_static_runtimes_CXX='`$ECHO \"X$enable_shared_with_static_runtimes_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nexport_dynamic_flag_spec_CXX='`$ECHO \"X$export_dynamic_flag_spec_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nwhole_archive_flag_spec_CXX='`$ECHO \"X$whole_archive_flag_spec_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\ncompiler_needs_object_CXX='`$ECHO \"X$compiler_needs_object_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_archive_from_new_cmds_CXX='`$ECHO \"X$old_archive_from_new_cmds_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_archive_from_expsyms_cmds_CXX='`$ECHO \"X$old_archive_from_expsyms_cmds_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\narchive_cmds_CXX='`$ECHO \"X$archive_cmds_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\narchive_expsym_cmds_CXX='`$ECHO \"X$archive_expsym_cmds_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nmodule_cmds_CXX='`$ECHO \"X$module_cmds_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nmodule_expsym_cmds_CXX='`$ECHO \"X$module_expsym_cmds_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nwith_gnu_ld_CXX='`$ECHO \"X$with_gnu_ld_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nallow_undefined_flag_CXX='`$ECHO \"X$allow_undefined_flag_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nno_undefined_flag_CXX='`$ECHO \"X$no_undefined_flag_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_libdir_flag_spec_CXX='`$ECHO \"X$hardcode_libdir_flag_spec_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_libdir_flag_spec_ld_CXX='`$ECHO \"X$hardcode_libdir_flag_spec_ld_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_libdir_separator_CXX='`$ECHO \"X$hardcode_libdir_separator_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_direct_CXX='`$ECHO \"X$hardcode_direct_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_direct_absolute_CXX='`$ECHO \"X$hardcode_direct_absolute_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_minus_L_CXX='`$ECHO \"X$hardcode_minus_L_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_shlibpath_var_CXX='`$ECHO \"X$hardcode_shlibpath_var_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_automatic_CXX='`$ECHO \"X$hardcode_automatic_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\ninherit_rpath_CXX='`$ECHO \"X$inherit_rpath_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlink_all_deplibs_CXX='`$ECHO \"X$link_all_deplibs_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nfix_srcfile_path_CXX='`$ECHO \"X$fix_srcfile_path_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nalways_export_symbols_CXX='`$ECHO \"X$always_export_symbols_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nexport_symbols_cmds_CXX='`$ECHO \"X$export_symbols_cmds_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nexclude_expsyms_CXX='`$ECHO \"X$exclude_expsyms_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\ninclude_expsyms_CXX='`$ECHO \"X$include_expsyms_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nprelink_cmds_CXX='`$ECHO \"X$prelink_cmds_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nfile_list_spec_CXX='`$ECHO \"X$file_list_spec_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_action_CXX='`$ECHO \"X$hardcode_action_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\ncompiler_lib_search_dirs_CXX='`$ECHO \"X$compiler_lib_search_dirs_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\npredep_objects_CXX='`$ECHO \"X$predep_objects_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\npostdep_objects_CXX='`$ECHO \"X$postdep_objects_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\npredeps_CXX='`$ECHO \"X$predeps_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\npostdeps_CXX='`$ECHO \"X$postdeps_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\ncompiler_lib_search_path_CXX='`$ECHO \"X$compiler_lib_search_path_CXX\" | $Xsed -e \"$delay_single_quote_subst\"`'\n\nLTCC='$LTCC'\nLTCFLAGS='$LTCFLAGS'\ncompiler='$compiler_DEFAULT'\n\n# Quote evaled strings.\nfor var in SED \\\nGREP \\\nEGREP \\\nFGREP \\\nLD \\\nNM \\\nLN_S \\\nlt_SP2NL \\\nlt_NL2SP \\\nreload_flag \\\nOBJDUMP \\\ndeplibs_check_method \\\nfile_magic_cmd \\\nAR \\\nAR_FLAGS \\\nSTRIP \\\nRANLIB \\\nCC \\\nCFLAGS \\\ncompiler \\\nlt_cv_sys_global_symbol_pipe \\\nlt_cv_sys_global_symbol_to_cdecl \\\nlt_cv_sys_global_symbol_to_c_name_address \\\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix \\\nSHELL \\\nECHO \\\nlt_prog_compiler_no_builtin_flag \\\nlt_prog_compiler_wl \\\nlt_prog_compiler_pic \\\nlt_prog_compiler_static \\\nlt_cv_prog_compiler_c_o \\\nneed_locks \\\nDSYMUTIL \\\nNMEDIT \\\nLIPO \\\nOTOOL \\\nOTOOL64 \\\nshrext_cmds \\\nexport_dynamic_flag_spec \\\nwhole_archive_flag_spec \\\ncompiler_needs_object \\\nwith_gnu_ld \\\nallow_undefined_flag \\\nno_undefined_flag \\\nhardcode_libdir_flag_spec \\\nhardcode_libdir_flag_spec_ld \\\nhardcode_libdir_separator \\\nfix_srcfile_path \\\nexclude_expsyms \\\ninclude_expsyms \\\nfile_list_spec \\\nvariables_saved_for_relink \\\nlibname_spec \\\nlibrary_names_spec \\\nsoname_spec \\\nfinish_eval \\\nold_striplib \\\nstriplib \\\ncompiler_lib_search_dirs \\\npredep_objects \\\npostdep_objects \\\npredeps \\\npostdeps \\\ncompiler_lib_search_path \\\nLD_CXX \\\ncompiler_CXX \\\nlt_prog_compiler_no_builtin_flag_CXX \\\nlt_prog_compiler_wl_CXX \\\nlt_prog_compiler_pic_CXX \\\nlt_prog_compiler_static_CXX \\\nlt_cv_prog_compiler_c_o_CXX \\\nexport_dynamic_flag_spec_CXX \\\nwhole_archive_flag_spec_CXX \\\ncompiler_needs_object_CXX \\\nwith_gnu_ld_CXX \\\nallow_undefined_flag_CXX \\\nno_undefined_flag_CXX \\\nhardcode_libdir_flag_spec_CXX \\\nhardcode_libdir_flag_spec_ld_CXX \\\nhardcode_libdir_separator_CXX \\\nfix_srcfile_path_CXX \\\nexclude_expsyms_CXX \\\ninclude_expsyms_CXX \\\nfile_list_spec_CXX \\\ncompiler_lib_search_dirs_CXX \\\npredep_objects_CXX \\\npostdep_objects_CXX \\\npredeps_CXX \\\npostdeps_CXX \\\ncompiler_lib_search_path_CXX; do\n    case \\`eval \\\\\\\\\\$ECHO \"X\\\\\\\\\\$\\$var\"\\` in\n    *[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"X\\\\\\$\\$var\\\\\" | \\\\\\$Xsed -e \\\\\"\\\\\\$sed_quote_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Double-quote double-evaled strings.\nfor var in reload_cmds \\\nold_postinstall_cmds \\\nold_postuninstall_cmds \\\nold_archive_cmds \\\nextract_expsyms_cmds \\\nold_archive_from_new_cmds \\\nold_archive_from_expsyms_cmds \\\narchive_cmds \\\narchive_expsym_cmds \\\nmodule_cmds \\\nmodule_expsym_cmds \\\nexport_symbols_cmds \\\nprelink_cmds \\\npostinstall_cmds \\\npostuninstall_cmds \\\nfinish_cmds \\\nsys_lib_search_path_spec \\\nsys_lib_dlsearch_path_spec \\\nold_archive_cmds_CXX \\\nold_archive_from_new_cmds_CXX \\\nold_archive_from_expsyms_cmds_CXX \\\narchive_cmds_CXX \\\narchive_expsym_cmds_CXX \\\nmodule_cmds_CXX \\\nmodule_expsym_cmds_CXX \\\nexport_symbols_cmds_CXX \\\nprelink_cmds_CXX; do\n    case \\`eval \\\\\\\\\\$ECHO \"X\\\\\\\\\\$\\$var\"\\` in\n    *[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"X\\\\\\$\\$var\\\\\" | \\\\\\$Xsed -e \\\\\"\\\\\\$double_quote_subst\\\\\" -e \\\\\"\\\\\\$sed_quote_subst\\\\\" -e \\\\\"\\\\\\$delay_variable_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Fix-up fallback echo if it was mangled by the above quoting rules.\ncase \\$lt_ECHO in\n*'\\\\\\$0 --fallback-echo\"')  lt_ECHO=\\`\\$ECHO \"X\\$lt_ECHO\" | \\$Xsed -e 's/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$0 --fallback-echo\"\\$/\\$0 --fallback-echo\"/'\\`\n  ;;\nesac\n\nac_aux_dir='$ac_aux_dir'\nxsi_shell='$xsi_shell'\nlt_shell_append='$lt_shell_append'\n\n# See if we are running on zsh, and set the options which allow our\n# commands through without removal of \\ escapes INIT.\nif test -n \"\\${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n\n    PACKAGE='$PACKAGE'\n    VERSION='$VERSION'\n    TIMESTAMP='$TIMESTAMP'\n    RM='$RM'\n    ofile='$ofile'\n\n\n\n\n\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n\n# Handling of arguments.\nfor ac_config_target in $ac_config_targets\ndo\n  case $ac_config_target in\n    \"src/config.h\") CONFIG_HEADERS=\"$CONFIG_HEADERS src/config.h\" ;;\n    \"depfiles\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS depfiles\" ;;\n    \"libtool\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS libtool\" ;;\n    \"Makefile\") CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n    \"src/glog/logging.h\") CONFIG_FILES=\"$CONFIG_FILES src/glog/logging.h\" ;;\n    \"src/glog/raw_logging.h\") CONFIG_FILES=\"$CONFIG_FILES src/glog/raw_logging.h\" ;;\n    \"src/glog/vlog_is_on.h\") CONFIG_FILES=\"$CONFIG_FILES src/glog/vlog_is_on.h\" ;;\n    \"src/glog/stl_logging.h\") CONFIG_FILES=\"$CONFIG_FILES src/glog/stl_logging.h\" ;;\n    \"libglog.pc\") CONFIG_FILES=\"$CONFIG_FILES libglog.pc\" ;;\n\n  *) as_fn_error \"invalid argument: \\`$ac_config_target'\" \"$LINENO\" 5;;\n  esac\ndone\n\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test \"${CONFIG_FILES+set}\" = set || CONFIG_FILES=$config_files\n  test \"${CONFIG_HEADERS+set}\" = set || CONFIG_HEADERS=$config_headers\n  test \"${CONFIG_COMMANDS+set}\" = set || CONFIG_COMMANDS=$config_commands\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason against having it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Hook for its removal unless debugging.\n# Note that there is a small window in which the directory will not be cleaned:\n# after its creation but before its name has been assigned to `$tmp'.\n$debug ||\n{\n  tmp=\n  trap 'exit_status=$?\n  { test -z \"$tmp\" || test ! -d \"$tmp\" || rm -fr \"$tmp\"; } && exit $exit_status\n' 0\n  trap 'as_fn_exit 1' 1 2 13 15\n}\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d \"./confXXXXXX\") 2>/dev/null` &&\n  test -n \"$tmp\" && test -d \"$tmp\"\n}  ||\n{\n  tmp=./conf$$-$RANDOM\n  (umask 077 && mkdir \"$tmp\")\n} || as_fn_error \"cannot create a temporary directory in .\" \"$LINENO\" 5\n\n# Set up the scripts for CONFIG_FILES section.\n# No need to generate them if there are no CONFIG_FILES.\n# This happens for instance with `./config.status config.h'.\nif test -n \"$CONFIG_FILES\"; then\n\n\nac_cr=`echo X | tr X '\\015'`\n# On cygwin, bash can eat \\r inside `` if the user requested igncr.\n# But we know of no other shell where ac_cr would be empty at this\n# point, so we can use a bashism as a fallback.\nif test \"x$ac_cr\" = x; then\n  eval ac_cr=\\$\\'\\\\r\\'\nfi\nac_cs_awk_cr=`$AWK 'BEGIN { print \"a\\rb\" }' </dev/null 2>/dev/null`\nif test \"$ac_cs_awk_cr\" = \"a${ac_cr}b\"; then\n  ac_cs_awk_cr='\\r'\nelse\n  ac_cs_awk_cr=$ac_cr\nfi\n\necho 'BEGIN {' >\"$tmp/subs1.awk\" &&\n_ACEOF\n\n\n{\n  echo \"cat >conf$$subs.awk <<_ACEOF\" &&\n  echo \"$ac_subst_vars\" | sed 's/.*/&!$&$ac_delim/' &&\n  echo \"_ACEOF\"\n} >conf$$subs.sh ||\n  as_fn_error \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\nac_delim_num=`echo \"$ac_subst_vars\" | grep -c '$'`\nac_delim='%!_!# '\nfor ac_last_try in false false false false false :; do\n  . ./conf$$subs.sh ||\n    as_fn_error \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n\n  ac_delim_n=`sed -n \"s/.*$ac_delim\\$/X/p\" conf$$subs.awk | grep -c X`\n  if test $ac_delim_n = $ac_delim_num; then\n    break\n  elif $ac_last_try; then\n    as_fn_error \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\nrm -f conf$$subs.sh\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\ncat >>\"\\$tmp/subs1.awk\" <<\\\\_ACAWK &&\n_ACEOF\nsed -n '\nh\ns/^/S[\"/; s/!.*/\"]=/\np\ng\ns/^[^!]*!//\n:repl\nt repl\ns/'\"$ac_delim\"'$//\nt delim\n:nl\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\n\"\\\\/\np\nn\nb repl\n:more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt nl\n:delim\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/\np\nb\n:more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt delim\n' <conf$$subs.awk | sed '\n/^[^\"\"]/{\n  N\n  s/\\n//\n}\n' >>$CONFIG_STATUS || ac_write_fail=1\nrm -f conf$$subs.awk\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACAWK\ncat >>\"\\$tmp/subs1.awk\" <<_ACAWK &&\n  for (key in S) S_is_set[key] = 1\n  FS = \"\u0007\"\n\n}\n{\n  line = $ 0\n  nfields = split(line, field, \"@\")\n  substed = 0\n  len = length(field[1])\n  for (i = 2; i < nfields; i++) {\n    key = field[i]\n    keylen = length(key)\n    if (S_is_set[key]) {\n      value = S[key]\n      line = substr(line, 1, len) \"\" value \"\" substr(line, len + keylen + 3)\n      len += length(value) + length(field[++i])\n      substed = 1\n    } else\n      len += 1 + keylen\n  }\n\n  print line\n}\n\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nif sed \"s/$ac_cr//\" < /dev/null > /dev/null 2>&1; then\n  sed \"s/$ac_cr\\$//; s/$ac_cr/$ac_cs_awk_cr/g\"\nelse\n  cat\nfi < \"$tmp/subs1.awk\" > \"$tmp/subs.awk\" \\\n  || as_fn_error \"could not setup config files machinery\" \"$LINENO\" 5\n_ACEOF\n\n# VPATH may cause trouble with some makes, so we remove $(srcdir),\n# ${srcdir} and @srcdir@ from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[\t ]*VPATH[\t ]*=/{\ns/:*\\$(srcdir):*/:/\ns/:*\\${srcdir}:*/:/\ns/:*@srcdir@:*/:/\ns/^\\([^=]*=[\t ]*\\):*/\\1/\ns/:*$//\ns/^[^=]*=[\t ]*$//\n}'\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nfi # test -n \"$CONFIG_FILES\"\n\n# Set up the scripts for CONFIG_HEADERS section.\n# No need to generate them if there are no CONFIG_HEADERS.\n# This happens for instance with `./config.status Makefile'.\nif test -n \"$CONFIG_HEADERS\"; then\ncat >\"$tmp/defines.awk\" <<\\_ACAWK ||\nBEGIN {\n_ACEOF\n\n# Transform confdefs.h into an awk script `defines.awk', embedded as\n# here-document in config.status, that substitutes the proper values into\n# config.h.in to produce config.h.\n\n# Create a delimiter string that does not exist in confdefs.h, to ease\n# handling of long lines.\nac_delim='%!_!# '\nfor ac_last_try in false false :; do\n  ac_t=`sed -n \"/$ac_delim/p\" confdefs.h`\n  if test -z \"$ac_t\"; then\n    break\n  elif $ac_last_try; then\n    as_fn_error \"could not make $CONFIG_HEADERS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\n\n# For the awk script, D is an array of macro values keyed by name,\n# likewise P contains macro parameters if any.  Preserve backslash\n# newline sequences.\n\nac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*\nsed -n '\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt rset\n:rset\ns/^[\t ]*#[\t ]*define[\t ][\t ]*/ /\nt def\nd\n:def\ns/\\\\$//\nt bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\"/p\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\"/p\nd\n:bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\\\\\\\\\\\\n\"\\\\/p\nt cont\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\\\\\\\\\\\\n\"\\\\/p\nt cont\nd\n:cont\nn\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt clear\n:clear\ns/\\\\$//\nt bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/p\nd\n:bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\\\\\\\\\n\"\\\\/p\nb cont\n' <confdefs.h | sed '\ns/'\"$ac_delim\"'/\"\\\\\\\n\"/g' >>$CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  for (key in D) D_is_set[key] = 1\n  FS = \"\u0007\"\n}\n/^[\\t ]*#[\\t ]*(define|undef)[\\t ]+$ac_word_re([\\t (]|\\$)/ {\n  line = \\$ 0\n  split(line, arg, \" \")\n  if (arg[1] == \"#\") {\n    defundef = arg[2]\n    mac1 = arg[3]\n  } else {\n    defundef = substr(arg[1], 2)\n    mac1 = arg[2]\n  }\n  split(mac1, mac2, \"(\") #)\n  macro = mac2[1]\n  prefix = substr(line, 1, index(line, defundef) - 1)\n  if (D_is_set[macro]) {\n    # Preserve the white space surrounding the \"#\".\n    print prefix \"define\", macro P[macro] D[macro]\n    next\n  } else {\n    # Replace #undef with comments.  This is necessary, for example,\n    # in the case of _POSIX_SOURCE, which is predefined and required\n    # on some systems where configure will not decide to define it.\n    if (defundef == \"undef\") {\n      print \"/*\", prefix defundef, macro, \"*/\"\n      next\n    }\n  }\n}\n{ print }\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n  as_fn_error \"could not setup config headers machinery\" \"$LINENO\" 5\nfi # test -n \"$CONFIG_HEADERS\"\n\n\neval set X \"  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS\"\nshift\nfor ac_tag\ndo\n  case $ac_tag in\n  :[FHLC]) ac_mode=$ac_tag; continue;;\n  esac\n  case $ac_mode$ac_tag in\n  :[FHL]*:*);;\n  :L* | :C*:*) as_fn_error \"invalid tag \\`$ac_tag'\" \"$LINENO\" 5;;\n  :[FH]-) ac_tag=-:-;;\n  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;\n  esac\n  ac_save_IFS=$IFS\n  IFS=:\n  set x $ac_tag\n  IFS=$ac_save_IFS\n  shift\n  ac_file=$1\n  shift\n\n  case $ac_mode in\n  :L) ac_source=$1;;\n  :[FH])\n    ac_file_inputs=\n    for ac_f\n    do\n      case $ac_f in\n      -) ac_f=\"$tmp/stdin\";;\n      *) # Look for the file first in the build tree, then in the source tree\n\t # (if the path is not absolute).  The absolute path cannot be DOS-style,\n\t # because $ac_f cannot contain `:'.\n\t test -f \"$ac_f\" ||\n\t   case $ac_f in\n\t   [\\\\/$]*) false;;\n\t   *) test -f \"$srcdir/$ac_f\" && ac_f=\"$srcdir/$ac_f\";;\n\t   esac ||\n\t   as_fn_error \"cannot find input file: \\`$ac_f'\" \"$LINENO\" 5;;\n      esac\n      case $ac_f in *\\'*) ac_f=`$as_echo \"$ac_f\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; esac\n      as_fn_append ac_file_inputs \" '$ac_f'\"\n    done\n\n    # Let's still pretend it is `configure' which instantiates (i.e., don't\n    # use $as_me), people would be surprised to read:\n    #    /* config.h.  Generated by config.status.  */\n    configure_input='Generated from '`\n\t  $as_echo \"$*\" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'\n\t`' by configure.'\n    if test x\"$ac_file\" != x-; then\n      configure_input=\"$ac_file.  $configure_input\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: creating $ac_file\" >&5\n$as_echo \"$as_me: creating $ac_file\" >&6;}\n    fi\n    # Neutralize special characters interpreted by sed in replacement strings.\n    case $configure_input in #(\n    *\\&* | *\\|* | *\\\\* )\n       ac_sed_conf_input=`$as_echo \"$configure_input\" |\n       sed 's/[\\\\\\\\&|]/\\\\\\\\&/g'`;; #(\n    *) ac_sed_conf_input=$configure_input;;\n    esac\n\n    case $ac_tag in\n    *:-:* | *:-) cat >\"$tmp/stdin\" \\\n      || as_fn_error \"could not create $ac_file\" \"$LINENO\" 5 ;;\n    esac\n    ;;\n  esac\n\n  ac_dir=`$as_dirname -- \"$ac_file\" ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  as_dir=\"$ac_dir\"; as_fn_mkdir_p\n  ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n\n  case $ac_mode in\n  :F)\n  #\n  # CONFIG_FILE\n  #\n\n  case $INSTALL in\n  [\\\\/$]* | ?:[\\\\/]* ) ac_INSTALL=$INSTALL ;;\n  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;\n  esac\n  ac_MKDIR_P=$MKDIR_P\n  case $MKDIR_P in\n  [\\\\/$]* | ?:[\\\\/]* ) ;;\n  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;\n  esac\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# If the template does not know about datarootdir, expand it.\n# FIXME: This hack should be removed a few years after 2.60.\nac_datarootdir_hack=; ac_datarootdir_seen=\nac_sed_dataroot='\n/datarootdir/ {\n  p\n  q\n}\n/@datadir@/p\n/@docdir@/p\n/@infodir@/p\n/@localedir@/p\n/@mandir@/p'\ncase `eval \"sed -n \\\"\\$ac_sed_dataroot\\\" $ac_file_inputs\"` in\n*datarootdir*) ac_datarootdir_seen=yes;;\n*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&5\n$as_echo \"$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&2;}\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  ac_datarootdir_hack='\n  s&@datadir@&$datadir&g\n  s&@docdir@&$docdir&g\n  s&@infodir@&$infodir&g\n  s&@localedir@&$localedir&g\n  s&@mandir@&$mandir&g\n  s&\\\\\\${datarootdir}&$datarootdir&g' ;;\nesac\n_ACEOF\n\n# Neutralize VPATH when `$srcdir' = `.'.\n# Shell code in configure.ac might set extrasub.\n# FIXME: do we really want to maintain this feature?\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_sed_extra=\"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns|@configure_input@|$ac_sed_conf_input|;t t\ns&@top_builddir@&$ac_top_builddir_sub&;t t\ns&@top_build_prefix@&$ac_top_build_prefix&;t t\ns&@srcdir@&$ac_srcdir&;t t\ns&@abs_srcdir@&$ac_abs_srcdir&;t t\ns&@top_srcdir@&$ac_top_srcdir&;t t\ns&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t\ns&@builddir@&$ac_builddir&;t t\ns&@abs_builddir@&$ac_abs_builddir&;t t\ns&@abs_top_builddir@&$ac_abs_top_builddir&;t t\ns&@INSTALL@&$ac_INSTALL&;t t\ns&@MKDIR_P@&$ac_MKDIR_P&;t t\n$ac_datarootdir_hack\n\"\neval sed \\\"\\$ac_sed_extra\\\" \"$ac_file_inputs\" | $AWK -f \"$tmp/subs.awk\" >$tmp/out \\\n  || as_fn_error \"could not create $ac_file\" \"$LINENO\" 5\n\ntest -z \"$ac_datarootdir_hack$ac_datarootdir_seen\" &&\n  { ac_out=`sed -n '/\\${datarootdir}/p' \"$tmp/out\"`; test -n \"$ac_out\"; } &&\n  { ac_out=`sed -n '/^[\t ]*datarootdir[\t ]*:*=/p' \"$tmp/out\"`; test -z \"$ac_out\"; } &&\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined.\" >&5\n$as_echo \"$as_me: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined.\" >&2;}\n\n  rm -f \"$tmp/stdin\"\n  case $ac_file in\n  -) cat \"$tmp/out\" && rm -f \"$tmp/out\";;\n  *) rm -f \"$ac_file\" && mv \"$tmp/out\" \"$ac_file\";;\n  esac \\\n  || as_fn_error \"could not create $ac_file\" \"$LINENO\" 5\n ;;\n  :H)\n  #\n  # CONFIG_HEADER\n  #\n  if test x\"$ac_file\" != x-; then\n    {\n      $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$tmp/defines.awk\"' \"$ac_file_inputs\"\n    } >\"$tmp/config.h\" \\\n      || as_fn_error \"could not create $ac_file\" \"$LINENO\" 5\n    if diff \"$ac_file\" \"$tmp/config.h\" >/dev/null 2>&1; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: $ac_file is unchanged\" >&5\n$as_echo \"$as_me: $ac_file is unchanged\" >&6;}\n    else\n      rm -f \"$ac_file\"\n      mv \"$tmp/config.h\" \"$ac_file\" \\\n\t|| as_fn_error \"could not create $ac_file\" \"$LINENO\" 5\n    fi\n  else\n    $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$tmp/defines.awk\"' \"$ac_file_inputs\" \\\n      || as_fn_error \"could not create -\" \"$LINENO\" 5\n  fi\n# Compute \"$ac_file\"'s index in $config_headers.\n_am_arg=\"$ac_file\"\n_am_stamp_count=1\nfor _am_header in $config_headers :; do\n  case $_am_header in\n    $_am_arg | $_am_arg:* )\n      break ;;\n    * )\n      _am_stamp_count=`expr $_am_stamp_count + 1` ;;\n  esac\ndone\necho \"timestamp for $_am_arg\" >`$as_dirname -- \"$_am_arg\" ||\n$as_expr X\"$_am_arg\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$_am_arg\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$_am_arg\" : 'X\\(//\\)$' \\| \\\n\t X\"$_am_arg\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$_am_arg\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`/stamp-h$_am_stamp_count\n ;;\n\n  :C)  { $as_echo \"$as_me:${as_lineno-$LINENO}: executing $ac_file commands\" >&5\n$as_echo \"$as_me: executing $ac_file commands\" >&6;}\n ;;\n  esac\n\n\n  case $ac_file$ac_mode in\n    \"depfiles\":C) test x\"$AMDEP_TRUE\" != x\"\" || {\n  # Autoconf 2.62 quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  case $CONFIG_FILES in\n  *\\'*) eval set x \"$CONFIG_FILES\" ;;\n  *)   set x $CONFIG_FILES ;;\n  esac\n  shift\n  for mf\n  do\n    # Strip MF so we end up with the name of the file.\n    mf=`echo \"$mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile or not.\n    # We used to match only the files named `Makefile.in', but\n    # some people rename them; so instead we look at the file content.\n    # Grep'ing the first line is not enough: some people post-process\n    # each Makefile.in and add a new line on top of each file to say so.\n    # Grep'ing the whole file is not good either: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    if sed -n 's,^#.*generated by automake.*,X,p' \"$mf\" | grep X >/dev/null 2>&1; then\n      dirpart=`$as_dirname -- \"$mf\" ||\n$as_expr X\"$mf\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$mf\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$mf\" : 'X\\(//\\)$' \\| \\\n\t X\"$mf\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$mf\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n    else\n      continue\n    fi\n    # Extract the definition of DEPDIR, am__include, and am__quote\n    # from the Makefile without running `make'.\n    DEPDIR=`sed -n 's/^DEPDIR = //p' < \"$mf\"`\n    test -z \"$DEPDIR\" && continue\n    am__include=`sed -n 's/^am__include = //p' < \"$mf\"`\n    test -z \"am__include\" && continue\n    am__quote=`sed -n 's/^am__quote = //p' < \"$mf\"`\n    # When using ansi2knr, U may be empty or an underscore; expand it\n    U=`sed -n 's/^U = //p' < \"$mf\"`\n    # Find all dependency output files, they are included files with\n    # $(DEPDIR) in their names.  We invoke sed twice because it is the\n    # simplest approach to changing $(DEPDIR) to its actual value in the\n    # expansion.\n    for file in `sed -n \"\n      s/^$am__include $am__quote\\(.*(DEPDIR).*\\)$am__quote\"'$/\\1/p' <\"$mf\" | \\\n\t sed -e 's/\\$(DEPDIR)/'\"$DEPDIR\"'/g' -e 's/\\$U/'\"$U\"'/g'`; do\n      # Make sure the directory exists.\n      test -f \"$dirpart/$file\" && continue\n      fdir=`$as_dirname -- \"$file\" ||\n$as_expr X\"$file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$file\" : 'X\\(//\\)$' \\| \\\n\t X\"$file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      as_dir=$dirpart/$fdir; as_fn_mkdir_p\n      # echo \"creating $dirpart/$file\"\n      echo '# dummy' > \"$dirpart/$file\"\n    done\n  done\n}\n ;;\n    \"libtool\":C)\n\n    # See if we are running on zsh, and set the options which allow our\n    # commands through without removal of \\ escapes.\n    if test -n \"${ZSH_VERSION+set}\" ; then\n      setopt NO_GLOB_SUBST\n    fi\n\n    cfgfile=\"${ofile}T\"\n    trap \"$RM \\\"$cfgfile\\\"; exit 1\" 1 2 15\n    $RM \"$cfgfile\"\n\n    cat <<_LT_EOF >> \"$cfgfile\"\n#! $SHELL\n\n# `$ECHO \"$ofile\" | sed 's%^.*/%%'` - Provide generalized library-building support services.\n# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n#\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008 Free Software Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n#   This file is part of GNU Libtool.\n#\n# GNU Libtool is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License as\n# published by the Free Software Foundation; either version 2 of\n# the License, or (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html, or\n# obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\n\n# The names of the tagged configurations supported by this script.\navailable_tags=\"CXX \"\n\n# ### BEGIN LIBTOOL CONFIG\n\n# Which release of libtool.m4 was used?\nmacro_version=$macro_version\nmacro_revision=$macro_revision\n\n# Whether or not to build shared libraries.\nbuild_libtool_libs=$enable_shared\n\n# Whether or not to build static libraries.\nbuild_old_libs=$enable_static\n\n# What type of objects to build.\npic_mode=$pic_mode\n\n# Whether or not to optimize for fast installation.\nfast_install=$enable_fast_install\n\n# The host system.\nhost_alias=$host_alias\nhost=$host\nhost_os=$host_os\n\n# The build system.\nbuild_alias=$build_alias\nbuild=$build\nbuild_os=$build_os\n\n# A sed program that does not truncate output.\nSED=$lt_SED\n\n# Sed that helps us avoid accidentally triggering echo(1) options like -n.\nXsed=\"\\$SED -e 1s/^X//\"\n\n# A grep program that handles long lines.\nGREP=$lt_GREP\n\n# An ERE matcher.\nEGREP=$lt_EGREP\n\n# A literal string matcher.\nFGREP=$lt_FGREP\n\n# A BSD- or MS-compatible name lister.\nNM=$lt_NM\n\n# Whether we need soft or hard links.\nLN_S=$lt_LN_S\n\n# What is the maximum length of a command?\nmax_cmd_len=$max_cmd_len\n\n# Object file suffix (normally \"o\").\nobjext=$ac_objext\n\n# Executable file suffix (normally \"\").\nexeext=$exeext\n\n# whether the shell understands \"unset\".\nlt_unset=$lt_unset\n\n# turn spaces into newlines.\nSP2NL=$lt_lt_SP2NL\n\n# turn newlines into spaces.\nNL2SP=$lt_lt_NL2SP\n\n# How to create reloadable object files.\nreload_flag=$lt_reload_flag\nreload_cmds=$lt_reload_cmds\n\n# An object symbol dumper.\nOBJDUMP=$lt_OBJDUMP\n\n# Method to check whether dependent libraries are shared objects.\ndeplibs_check_method=$lt_deplibs_check_method\n\n# Command to use when deplibs_check_method == \"file_magic\".\nfile_magic_cmd=$lt_file_magic_cmd\n\n# The archiver.\nAR=$lt_AR\nAR_FLAGS=$lt_AR_FLAGS\n\n# A symbol stripping program.\nSTRIP=$lt_STRIP\n\n# Commands used to install an old-style archive.\nRANLIB=$lt_RANLIB\nold_postinstall_cmds=$lt_old_postinstall_cmds\nold_postuninstall_cmds=$lt_old_postuninstall_cmds\n\n# A C compiler.\nLTCC=$lt_CC\n\n# LTCC compiler flags.\nLTCFLAGS=$lt_CFLAGS\n\n# Take the output of nm and produce a listing of raw symbols and C names.\nglobal_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe\n\n# Transform the output of nm in a proper C declaration.\nglobal_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl\n\n# Transform the output of nm in a C name address pair.\nglobal_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address\n\n# Transform the output of nm in a C name address pair when lib prefix is needed.\nglobal_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix\n\n# The name of the directory that contains temporary libtool files.\nobjdir=$objdir\n\n# Shell to use when invoking shell scripts.\nSHELL=$lt_SHELL\n\n# An echo program that does not interpret backslashes.\nECHO=$lt_ECHO\n\n# Used to examine libraries when file_magic_cmd begins with \"file\".\nMAGIC_CMD=$MAGIC_CMD\n\n# Must we lock files when doing compilation?\nneed_locks=$lt_need_locks\n\n# Tool to manipulate archived DWARF debug symbol files on Mac OS X.\nDSYMUTIL=$lt_DSYMUTIL\n\n# Tool to change global to local symbols on Mac OS X.\nNMEDIT=$lt_NMEDIT\n\n# Tool to manipulate fat objects and archives on Mac OS X.\nLIPO=$lt_LIPO\n\n# ldd/readelf like tool for Mach-O binaries on Mac OS X.\nOTOOL=$lt_OTOOL\n\n# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.\nOTOOL64=$lt_OTOOL64\n\n# Old archive suffix (normally \"a\").\nlibext=$libext\n\n# Shared library suffix (normally \".so\").\nshrext_cmds=$lt_shrext_cmds\n\n# The commands to extract the exported symbol list from a shared archive.\nextract_expsyms_cmds=$lt_extract_expsyms_cmds\n\n# Variables whose values should be saved in libtool wrapper scripts and\n# restored at link time.\nvariables_saved_for_relink=$lt_variables_saved_for_relink\n\n# Do we need the \"lib\" prefix for modules?\nneed_lib_prefix=$need_lib_prefix\n\n# Do we need a version for libraries?\nneed_version=$need_version\n\n# Library versioning type.\nversion_type=$version_type\n\n# Shared library runtime path variable.\nrunpath_var=$runpath_var\n\n# Shared library path variable.\nshlibpath_var=$shlibpath_var\n\n# Is shlibpath searched before the hard-coded library search path?\nshlibpath_overrides_runpath=$shlibpath_overrides_runpath\n\n# Format of library name prefix.\nlibname_spec=$lt_libname_spec\n\n# List of archive names.  First name is the real one, the rest are links.\n# The last name is the one that the linker finds with -lNAME\nlibrary_names_spec=$lt_library_names_spec\n\n# The coded name of the library, if different from the real name.\nsoname_spec=$lt_soname_spec\n\n# Command to use after installation of a shared archive.\npostinstall_cmds=$lt_postinstall_cmds\n\n# Command to use after uninstallation of a shared archive.\npostuninstall_cmds=$lt_postuninstall_cmds\n\n# Commands used to finish a libtool library installation in a directory.\nfinish_cmds=$lt_finish_cmds\n\n# As \"finish_cmds\", except a single script fragment to be evaled but\n# not shown.\nfinish_eval=$lt_finish_eval\n\n# Whether we should hardcode library paths into libraries.\nhardcode_into_libs=$hardcode_into_libs\n\n# Compile-time system search path for libraries.\nsys_lib_search_path_spec=$lt_sys_lib_search_path_spec\n\n# Run-time system search path for libraries.\nsys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec\n\n# Whether dlopen is supported.\ndlopen_support=$enable_dlopen\n\n# Whether dlopen of programs is supported.\ndlopen_self=$enable_dlopen_self\n\n# Whether dlopen of statically linked programs is supported.\ndlopen_self_static=$enable_dlopen_self_static\n\n# Commands to strip libraries.\nold_striplib=$lt_old_striplib\nstriplib=$lt_striplib\n\n\n# The linker used to build libraries.\nLD=$lt_LD\n\n# Commands used to build an old-style archive.\nold_archive_cmds=$lt_old_archive_cmds\n\n# A language specific compiler.\nCC=$lt_compiler\n\n# Is the compiler the GNU compiler?\nwith_gcc=$GCC\n\n# Compiler flag to turn off builtin functions.\nno_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag\n\n# How to pass a linker flag through the compiler.\nwl=$lt_lt_prog_compiler_wl\n\n# Additional compiler flags for building library objects.\npic_flag=$lt_lt_prog_compiler_pic\n\n# Compiler flag to prevent dynamic linking.\nlink_static_flag=$lt_lt_prog_compiler_static\n\n# Does compiler simultaneously support -c and -o options?\ncompiler_c_o=$lt_lt_cv_prog_compiler_c_o\n\n# Whether or not to add -lc for building shared libraries.\nbuild_libtool_need_lc=$archive_cmds_need_lc\n\n# Whether or not to disallow shared libs when runtime libs are static.\nallow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes\n\n# Compiler flag to allow reflexive dlopens.\nexport_dynamic_flag_spec=$lt_export_dynamic_flag_spec\n\n# Compiler flag to generate shared objects directly from archives.\nwhole_archive_flag_spec=$lt_whole_archive_flag_spec\n\n# Whether the compiler copes with passing no objects directly.\ncompiler_needs_object=$lt_compiler_needs_object\n\n# Create an old-style archive from a shared archive.\nold_archive_from_new_cmds=$lt_old_archive_from_new_cmds\n\n# Create a temporary old-style archive to link instead of a shared archive.\nold_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds\n\n# Commands used to build a shared archive.\narchive_cmds=$lt_archive_cmds\narchive_expsym_cmds=$lt_archive_expsym_cmds\n\n# Commands used to build a loadable module if different from building\n# a shared archive.\nmodule_cmds=$lt_module_cmds\nmodule_expsym_cmds=$lt_module_expsym_cmds\n\n# Whether we are building with GNU ld or not.\nwith_gnu_ld=$lt_with_gnu_ld\n\n# Flag that allows shared libraries with undefined symbols to be built.\nallow_undefined_flag=$lt_allow_undefined_flag\n\n# Flag that enforces no undefined symbols.\nno_undefined_flag=$lt_no_undefined_flag\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist\nhardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec\n\n# If ld is used when linking, flag to hardcode \\$libdir into a binary\n# during linking.  This must work even if \\$libdir does not exist.\nhardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld\n\n# Whether we need a single \"-rpath\" flag with a separated argument.\nhardcode_libdir_separator=$lt_hardcode_libdir_separator\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary.\nhardcode_direct=$hardcode_direct\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary and the resulting library dependency is\n# \"absolute\",i.e impossible to change by setting \\${shlibpath_var} if the\n# library is relocated.\nhardcode_direct_absolute=$hardcode_direct_absolute\n\n# Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n# into the resulting binary.\nhardcode_minus_L=$hardcode_minus_L\n\n# Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n# into the resulting binary.\nhardcode_shlibpath_var=$hardcode_shlibpath_var\n\n# Set to \"yes\" if building a shared library automatically hardcodes DIR\n# into the library and all subsequent libraries and executables linked\n# against it.\nhardcode_automatic=$hardcode_automatic\n\n# Set to yes if linker adds runtime paths of dependent libraries\n# to runtime path list.\ninherit_rpath=$inherit_rpath\n\n# Whether libtool must link a program against all its dependency libraries.\nlink_all_deplibs=$link_all_deplibs\n\n# Fix the shell variable \\$srcfile for the compiler.\nfix_srcfile_path=$lt_fix_srcfile_path\n\n# Set to \"yes\" if exported symbols are required.\nalways_export_symbols=$always_export_symbols\n\n# The commands to list exported symbols.\nexport_symbols_cmds=$lt_export_symbols_cmds\n\n# Symbols that should not be listed in the preloaded symbols.\nexclude_expsyms=$lt_exclude_expsyms\n\n# Symbols that must always be exported.\ninclude_expsyms=$lt_include_expsyms\n\n# Commands necessary for linking programs (against libraries) with templates.\nprelink_cmds=$lt_prelink_cmds\n\n# Specify filename containing input files.\nfile_list_spec=$lt_file_list_spec\n\n# How to hardcode a shared library path into an executable.\nhardcode_action=$hardcode_action\n\n# The directories searched by this compiler when creating a shared library.\ncompiler_lib_search_dirs=$lt_compiler_lib_search_dirs\n\n# Dependencies to place before and after the objects being linked to\n# create a shared library.\npredep_objects=$lt_predep_objects\npostdep_objects=$lt_postdep_objects\npredeps=$lt_predeps\npostdeps=$lt_postdeps\n\n# The library search path used internally by the compiler when linking\n# a shared library.\ncompiler_lib_search_path=$lt_compiler_lib_search_path\n\n# ### END LIBTOOL CONFIG\n\n_LT_EOF\n\n  case $host_os in\n  aix3*)\n    cat <<\\_LT_EOF >> \"$cfgfile\"\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test \"X${COLLECT_NAMES+set}\" != Xset; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\n_LT_EOF\n    ;;\n  esac\n\n\nltmain=\"$ac_aux_dir/ltmain.sh\"\n\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '/^# Generated shell functions inserted here/q' \"$ltmain\" >> \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\"; exit 1)\n\n  case $xsi_shell in\n  yes)\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_dirname file append nondir_replacement\n# Compute the dirname of FILE.  If nonempty, add APPEND to the result,\n# otherwise set result to NONDIR_REPLACEMENT.\nfunc_dirname ()\n{\n  case ${1} in\n    */*) func_dirname_result=\"${1%/*}${2}\" ;;\n    *  ) func_dirname_result=\"${3}\" ;;\n  esac\n}\n\n# func_basename file\nfunc_basename ()\n{\n  func_basename_result=\"${1##*/}\"\n}\n\n# func_dirname_and_basename file append nondir_replacement\n# perform func_basename and func_dirname in a single function\n# call:\n#   dirname:  Compute the dirname of FILE.  If nonempty,\n#             add APPEND to the result, otherwise set result\n#             to NONDIR_REPLACEMENT.\n#             value returned in \"$func_dirname_result\"\n#   basename: Compute filename of FILE.\n#             value retuned in \"$func_basename_result\"\n# Implementation must be kept synchronized with func_dirname\n# and func_basename. For efficiency, we do not delegate to\n# those functions but instead duplicate the functionality here.\nfunc_dirname_and_basename ()\n{\n  case ${1} in\n    */*) func_dirname_result=\"${1%/*}${2}\" ;;\n    *  ) func_dirname_result=\"${3}\" ;;\n  esac\n  func_basename_result=\"${1##*/}\"\n}\n\n# func_stripname prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\nfunc_stripname ()\n{\n  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\n  # positional parameters, so assign one to ordinary parameter first.\n  func_stripname_result=${3}\n  func_stripname_result=${func_stripname_result#\"${1}\"}\n  func_stripname_result=${func_stripname_result%\"${2}\"}\n}\n\n# func_opt_split\nfunc_opt_split ()\n{\n  func_opt_split_opt=${1%%=*}\n  func_opt_split_arg=${1#*=}\n}\n\n# func_lo2o object\nfunc_lo2o ()\n{\n  case ${1} in\n    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\n    *)    func_lo2o_result=${1} ;;\n  esac\n}\n\n# func_xform libobj-or-source\nfunc_xform ()\n{\n  func_xform_result=${1%.*}.lo\n}\n\n# func_arith arithmetic-term...\nfunc_arith ()\n{\n  func_arith_result=$(( $* ))\n}\n\n# func_len string\n# STRING may not start with a hyphen.\nfunc_len ()\n{\n  func_len_result=${#1}\n}\n\n_LT_EOF\n    ;;\n  *) # Bourne compatible functions.\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_dirname file append nondir_replacement\n# Compute the dirname of FILE.  If nonempty, add APPEND to the result,\n# otherwise set result to NONDIR_REPLACEMENT.\nfunc_dirname ()\n{\n  # Extract subdirectory from the argument.\n  func_dirname_result=`$ECHO \"X${1}\" | $Xsed -e \"$dirname\"`\n  if test \"X$func_dirname_result\" = \"X${1}\"; then\n    func_dirname_result=\"${3}\"\n  else\n    func_dirname_result=\"$func_dirname_result${2}\"\n  fi\n}\n\n# func_basename file\nfunc_basename ()\n{\n  func_basename_result=`$ECHO \"X${1}\" | $Xsed -e \"$basename\"`\n}\n\n\n# func_stripname prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\n# func_strip_suffix prefix name\nfunc_stripname ()\n{\n  case ${2} in\n    .*) func_stripname_result=`$ECHO \"X${3}\" \\\n           | $Xsed -e \"s%^${1}%%\" -e \"s%\\\\\\\\${2}\\$%%\"`;;\n    *)  func_stripname_result=`$ECHO \"X${3}\" \\\n           | $Xsed -e \"s%^${1}%%\" -e \"s%${2}\\$%%\"`;;\n  esac\n}\n\n# sed scripts:\nmy_sed_long_opt='1s/^\\(-[^=]*\\)=.*/\\1/;q'\nmy_sed_long_arg='1s/^-[^=]*=//'\n\n# func_opt_split\nfunc_opt_split ()\n{\n  func_opt_split_opt=`$ECHO \"X${1}\" | $Xsed -e \"$my_sed_long_opt\"`\n  func_opt_split_arg=`$ECHO \"X${1}\" | $Xsed -e \"$my_sed_long_arg\"`\n}\n\n# func_lo2o object\nfunc_lo2o ()\n{\n  func_lo2o_result=`$ECHO \"X${1}\" | $Xsed -e \"$lo2o\"`\n}\n\n# func_xform libobj-or-source\nfunc_xform ()\n{\n  func_xform_result=`$ECHO \"X${1}\" | $Xsed -e 's/\\.[^.]*$/.lo/'`\n}\n\n# func_arith arithmetic-term...\nfunc_arith ()\n{\n  func_arith_result=`expr \"$@\"`\n}\n\n# func_len string\n# STRING may not start with a hyphen.\nfunc_len ()\n{\n  func_len_result=`expr \"$1\" : \".*\" 2>/dev/null || echo $max_cmd_len`\n}\n\n_LT_EOF\nesac\n\ncase $lt_shell_append in\n  yes)\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_append var value\n# Append VALUE to the end of shell variable VAR.\nfunc_append ()\n{\n  eval \"$1+=\\$2\"\n}\n_LT_EOF\n    ;;\n  *)\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_append var value\n# Append VALUE to the end of shell variable VAR.\nfunc_append ()\n{\n  eval \"$1=\\$$1\\$2\"\n}\n\n_LT_EOF\n    ;;\n  esac\n\n\n  sed -n '/^# Generated shell functions inserted here/,$p' \"$ltmain\" >> \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\"; exit 1)\n\n  mv -f \"$cfgfile\" \"$ofile\" ||\n    (rm -f \"$ofile\" && cp \"$cfgfile\" \"$ofile\" && rm -f \"$cfgfile\")\n  chmod +x \"$ofile\"\n\n\n    cat <<_LT_EOF >> \"$ofile\"\n\n# ### BEGIN LIBTOOL TAG CONFIG: CXX\n\n# The linker used to build libraries.\nLD=$lt_LD_CXX\n\n# Commands used to build an old-style archive.\nold_archive_cmds=$lt_old_archive_cmds_CXX\n\n# A language specific compiler.\nCC=$lt_compiler_CXX\n\n# Is the compiler the GNU compiler?\nwith_gcc=$GCC_CXX\n\n# Compiler flag to turn off builtin functions.\nno_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX\n\n# How to pass a linker flag through the compiler.\nwl=$lt_lt_prog_compiler_wl_CXX\n\n# Additional compiler flags for building library objects.\npic_flag=$lt_lt_prog_compiler_pic_CXX\n\n# Compiler flag to prevent dynamic linking.\nlink_static_flag=$lt_lt_prog_compiler_static_CXX\n\n# Does compiler simultaneously support -c and -o options?\ncompiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX\n\n# Whether or not to add -lc for building shared libraries.\nbuild_libtool_need_lc=$archive_cmds_need_lc_CXX\n\n# Whether or not to disallow shared libs when runtime libs are static.\nallow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX\n\n# Compiler flag to allow reflexive dlopens.\nexport_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX\n\n# Compiler flag to generate shared objects directly from archives.\nwhole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX\n\n# Whether the compiler copes with passing no objects directly.\ncompiler_needs_object=$lt_compiler_needs_object_CXX\n\n# Create an old-style archive from a shared archive.\nold_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX\n\n# Create a temporary old-style archive to link instead of a shared archive.\nold_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX\n\n# Commands used to build a shared archive.\narchive_cmds=$lt_archive_cmds_CXX\narchive_expsym_cmds=$lt_archive_expsym_cmds_CXX\n\n# Commands used to build a loadable module if different from building\n# a shared archive.\nmodule_cmds=$lt_module_cmds_CXX\nmodule_expsym_cmds=$lt_module_expsym_cmds_CXX\n\n# Whether we are building with GNU ld or not.\nwith_gnu_ld=$lt_with_gnu_ld_CXX\n\n# Flag that allows shared libraries with undefined symbols to be built.\nallow_undefined_flag=$lt_allow_undefined_flag_CXX\n\n# Flag that enforces no undefined symbols.\nno_undefined_flag=$lt_no_undefined_flag_CXX\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist\nhardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX\n\n# If ld is used when linking, flag to hardcode \\$libdir into a binary\n# during linking.  This must work even if \\$libdir does not exist.\nhardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX\n\n# Whether we need a single \"-rpath\" flag with a separated argument.\nhardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary.\nhardcode_direct=$hardcode_direct_CXX\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary and the resulting library dependency is\n# \"absolute\",i.e impossible to change by setting \\${shlibpath_var} if the\n# library is relocated.\nhardcode_direct_absolute=$hardcode_direct_absolute_CXX\n\n# Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n# into the resulting binary.\nhardcode_minus_L=$hardcode_minus_L_CXX\n\n# Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n# into the resulting binary.\nhardcode_shlibpath_var=$hardcode_shlibpath_var_CXX\n\n# Set to \"yes\" if building a shared library automatically hardcodes DIR\n# into the library and all subsequent libraries and executables linked\n# against it.\nhardcode_automatic=$hardcode_automatic_CXX\n\n# Set to yes if linker adds runtime paths of dependent libraries\n# to runtime path list.\ninherit_rpath=$inherit_rpath_CXX\n\n# Whether libtool must link a program against all its dependency libraries.\nlink_all_deplibs=$link_all_deplibs_CXX\n\n# Fix the shell variable \\$srcfile for the compiler.\nfix_srcfile_path=$lt_fix_srcfile_path_CXX\n\n# Set to \"yes\" if exported symbols are required.\nalways_export_symbols=$always_export_symbols_CXX\n\n# The commands to list exported symbols.\nexport_symbols_cmds=$lt_export_symbols_cmds_CXX\n\n# Symbols that should not be listed in the preloaded symbols.\nexclude_expsyms=$lt_exclude_expsyms_CXX\n\n# Symbols that must always be exported.\ninclude_expsyms=$lt_include_expsyms_CXX\n\n# Commands necessary for linking programs (against libraries) with templates.\nprelink_cmds=$lt_prelink_cmds_CXX\n\n# Specify filename containing input files.\nfile_list_spec=$lt_file_list_spec_CXX\n\n# How to hardcode a shared library path into an executable.\nhardcode_action=$hardcode_action_CXX\n\n# The directories searched by this compiler when creating a shared library.\ncompiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX\n\n# Dependencies to place before and after the objects being linked to\n# create a shared library.\npredep_objects=$lt_predep_objects_CXX\npostdep_objects=$lt_postdep_objects_CXX\npredeps=$lt_predeps_CXX\npostdeps=$lt_postdeps_CXX\n\n# The library search path used internally by the compiler when linking\n# a shared library.\ncompiler_lib_search_path=$lt_compiler_lib_search_path_CXX\n\n# ### END LIBTOOL TAG CONFIG: CXX\n_LT_EOF\n\n ;;\n\n  esac\ndone # for ac_tag\n\n\nas_fn_exit 0\n_ACEOF\nac_clean_files=$ac_clean_files_save\n\ntest $ac_write_fail = 0 ||\n  as_fn_error \"write failure creating $CONFIG_STATUS\" \"$LINENO\" 5\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || as_fn_exit $?\nfi\nif test -n \"$ac_unrecognized_opts\" && test \"$enable_option_checking\" != no; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts\" >&5\n$as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2;}\nfi\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/configure.ac",
    "content": "## Process this file with autoconf to produce configure.\n## In general, the safest way to proceed is to run the following:\n##    % aclocal -I . -I `pwd`/../autoconf && autoheader && autoconf && automake\n\n# make sure we're interpreted by some minimal autoconf\nAC_PREREQ(2.57)\n\nAC_INIT(glog, 0.3.1, opensource@google.com)\n# The argument here is just something that should be in the current directory\n# (for sanity checking)\nAC_CONFIG_SRCDIR(README)\nAC_CONFIG_MACRO_DIR([m4])\nAM_INIT_AUTOMAKE\nAM_CONFIG_HEADER(src/config.h)\n\nAC_LANG(C++)\n\n# Checks for programs.\nAC_PROG_CC\nAC_PROG_CPP\nAC_PROG_CXX\nAM_CONDITIONAL(GCC, test \"$GCC\" = yes)   # let the Makefile know if we're gcc\n\nAC_PROG_LIBTOOL\nAC_SUBST(LIBTOOL_DEPS)\n\n# Check whether some low-level functions/files are available\nAC_HEADER_STDC\n\n# These are tested for by AC_HEADER_STDC, but I check again to set the var\nAC_CHECK_HEADER(stdint.h, ac_cv_have_stdint_h=1, ac_cv_have_stdint_h=0)\nAC_CHECK_HEADER(sys/types.h, ac_cv_have_systypes_h=1, ac_cv_have_systypes_h=0)\nAC_CHECK_HEADER(inttypes.h, ac_cv_have_inttypes_h=1, ac_cv_have_inttypes_h=0)\nAC_CHECK_HEADERS(unistd.h, ac_cv_have_unistd_h=1, ac_cv_have_unistd_h=0)\nAC_CHECK_HEADERS(syscall.h)\nAC_CHECK_HEADERS(sys/syscall.h)\n# For backtrace with glibc.\nAC_CHECK_HEADERS(execinfo.h)\n# For backtrace with libunwind.\nAC_CHECK_HEADERS(libunwind.h, ac_cv_have_libunwind_h=1, ac_cv_have_libunwind_h=0)\nAC_CHECK_HEADERS(ucontext.h)\nAC_CHECK_HEADERS(sys/utsname.h)\nAC_CHECK_HEADERS(pwd.h)\nAC_CHECK_HEADERS(syslog.h)\nAC_CHECK_HEADERS(sys/time.h)\nAC_CHECK_HEADERS(glob.h)\n\nAC_CHECK_SIZEOF(void *)\n\n# These are the types I need.  We look for them in either stdint.h,\n# sys/types.h, or inttypes.h, all of which are part of the default-includes.\nAC_CHECK_TYPE(uint16_t, ac_cv_have_uint16_t=1, ac_cv_have_uint16_t=0)\nAC_CHECK_TYPE(u_int16_t, ac_cv_have_u_int16_t=1, ac_cv_have_u_int16_t=0)\nAC_CHECK_TYPE(__uint16, ac_cv_have___uint16=1, ac_cv_have___uint16=0)\n\nAC_CHECK_FUNC(sigaltstack,\n              AC_DEFINE(HAVE_SIGALTSTACK, 1,\n                        [Define if you have the `sigaltstack' function]))\nAC_CHECK_FUNC(dladdr,\n              AC_DEFINE(HAVE_DLADDR, 1,\n                        [Define if you have the `dladdr' function]))\nAC_CHECK_FUNC(fcntl,\n              AC_DEFINE(HAVE_FCNTL, 1,\n                        [Define if you have the `fcntl' function]))\n\nAX_C___ATTRIBUTE__\n# We only care about these two attributes.\nif test x\"$ac_cv___attribute__\" = x\"yes\"; then\n  ac_cv___attribute___noreturn=\"__attribute__ ((noreturn))\"\n  ac_cv___attribute___printf_4_5=\"__attribute__((__format__ (__printf__, 4, 5)))\"\nelse\n  ac_cv___attribute___noreturn=\n  ac_cv___attribute___printf_4_5=\nfi\n\nAX_C___BUILTIN_EXPECT\nif test x\"$ac_cv___builtin_expect\" = x\"yes\"; then\n  ac_cv_have___builtin_expect=1\nelse\n  ac_cv_have___builtin_expect=0\nfi\n\nAX_C___SYNC_VAL_COMPARE_AND_SWAP\n\n# On x86_64, instead of libunwind, we can choose to compile with frame-pointers\n# (This isn't needed on i386, where -fno-omit-frame-pointer is the default).\nAC_ARG_ENABLE(frame_pointers,\n              AS_HELP_STRING([--enable-frame-pointers],\n                             [On x86_64 systems, compile with -fno-omit-frame-pointer (see INSTALL)]),,\n              enable_frame_pointers=no)\nAC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [return __x86_64__ == 1 ? 0 : 1])],\n                  [is_x86_64=yes], [is_x86_64=no])\nAM_CONDITIONAL(ENABLE_FRAME_POINTERS, test \"$enable_frame_pointers\" = yes)\nAM_CONDITIONAL(X86_64, test \"$is_x86_64\" = yes)\n\n# Some of the code in this directory depends on pthreads\nACX_PTHREAD\nif test x\"$acx_pthread_ok\" = x\"yes\"; then\n  # To make libglog depend on libpthread on Linux, we need to add\n  # -lpthread in addition to -pthread.\n  AC_CHECK_LIB(pthread, pthread_self)\nfi\n\n# Check if there is google-gflags library installed.\nSAVE_CFLAGS=\"$CFLAGS\"\nSAVE_LIBS=\"$LIBS\"\nAC_ARG_WITH(gflags, AS_HELP_STRING[--with-gflags=GFLAGS_DIR],\n  GFLAGS_CFLAGS=\"-I${with_gflags}/include\"\n  GFLAGS_LIBS=\"-L${with_gflags}/lib -lgflags\"\n  CFLAGS=\"$CFLAGS $GFLAGS_CFLAGS\"\n  LIBS=\"$LIBS $GFLAGS_LIBS\"\n)\nAC_CHECK_LIB(gflags, main, ac_cv_have_libgflags=1, ac_cv_have_libgflags=0)\nif test x\"$ac_cv_have_libgflags\" = x\"1\"; then\n  AC_DEFINE(HAVE_LIB_GFLAGS, 1, [define if you have google gflags library])\n  if test x\"$GFLAGS_LIBS\" = x\"\"; then\n    GFLAGS_LIBS=\"-lgflags\"\n  fi\nelse\n  GFLAGS_CFLAGS=\n  GFLAGS_LIBS=\nfi\nCFLAGS=\"$SAVE_CFLAGS\"\nLIBS=\"$SAVE_LIBS\"\n\n# TODO(hamaji): Use official m4 macros provided by testing libraries\n#               once the m4 macro of Google Mocking becomes ready.\n# Check if there is Google Test library installed.\nAC_CHECK_PROG(GTEST_CONFIG, gtest-config, \"yes\")\nif test x\"$GTEST_CONFIG\" = \"xyes\"; then\n  GTEST_CFLAGS=`gtest-config --cppflags --cxxflags`\n  GTEST_LIBS=`gtest-config --ldflags --libs`\n  AC_DEFINE(HAVE_LIB_GTEST, 1, [define if you have google gtest library])\n\n  # Check if there is Google Mocking library installed.\n  AC_CHECK_PROG(GMOCK_CONFIG, gmock-config, \"yes\")\n  if test x\"$GMOCK_CONFIG\" = \"xyes\"; then\n    GMOCK_CFLAGS=`gmock-config --cppflags --cxxflags`\n    GMOCK_LIBS=`gmock-config --ldflags --libs`\n    AC_DEFINE(HAVE_LIB_GMOCK, 1, [define if you have google gmock library])\n  else\n    # We don't run test cases which use Google Mocking framework.\n    GMOCK_CFLAGS=\n    GMOCK_LIBS=\n  fi\nelse\n  # We'll use src/googletest.h for our unittests.\n  GTEST_CFLAGS=\n  GTEST_LIBS=\nfi\nAM_CONDITIONAL(HAVE_GMOCK, test x\"$GMOCK_CONFIG\" = \"xyes\")\n\n# We want to link in libunwind if it exists\nUNWIND_LIBS=\n# Unfortunately, we need to check the header file in addition to the\n# lib file to check if libunwind is available since libunwind-0.98\n# doesn't install all necessary header files.\nif test x\"$ac_cv_have_libunwind_h\" = x\"1\"; then\n AC_CHECK_LIB(unwind, backtrace, UNWIND_LIBS=-lunwind)\nfi\nAC_SUBST(UNWIND_LIBS)\nif test x\"$UNWIND_LIBS\" != x\"\"; then\n  AC_DEFINE(HAVE_LIB_UNWIND, 1, [define if you have libunwind])\nfi\n\n# We'd like to use read/write locks in several places in the code.\n# See if our pthreads support extends to that.  Note: for linux, it\n# does as long as you define _XOPEN_SOURCE appropriately.\nAC_RWLOCK\n\n# Find out what namespace 'normal' STL code lives in, and also what namespace\n# the user wants our classes to be defined in\nAC_CXX_STL_NAMESPACE\nAC_DEFINE_GOOGLE_NAMESPACE(google)\n\nAC_CXX_USING_OPERATOR\n\nAC_PC_FROM_UCONTEXT(AC_MSG_WARN(Could not find the PC.  Will not output failed addresses...))\n\nAC_DEFINE_UNQUOTED(TEST_SRC_DIR, \"$srcdir\", [location of source code])\n\n# These are what's needed by logging.h.in and raw_logging.h.in\nAC_SUBST(ac_google_start_namespace)\nAC_SUBST(ac_google_end_namespace)\nAC_SUBST(ac_google_namespace)\nAC_SUBST(ac_cv_cxx_using_operator)\nAC_SUBST(ac_cv___attribute___noreturn)\nAC_SUBST(ac_cv___attribute___printf_4_5)\nAC_SUBST(ac_cv_have___builtin_expect)\nAC_SUBST(ac_cv_have_stdint_h)\nAC_SUBST(ac_cv_have_systypes_h)\nAC_SUBST(ac_cv_have_inttypes_h)\nAC_SUBST(ac_cv_have_unistd_h)\nAC_SUBST(ac_cv_have_uint16_t)\nAC_SUBST(ac_cv_have_u_int16_t)\nAC_SUBST(ac_cv_have___uint16)\nAC_SUBST(ac_cv_have_libgflags)\nAC_SUBST(GFLAGS_CFLAGS)\nAC_SUBST(GTEST_CFLAGS)\nAC_SUBST(GMOCK_CFLAGS)\nAC_SUBST(GFLAGS_LIBS)\nAC_SUBST(GTEST_LIBS)\nAC_SUBST(GMOCK_LIBS)\n\n# Write generated configuration file\nAC_CONFIG_FILES([Makefile src/glog/logging.h src/glog/raw_logging.h src/glog/vlog_is_on.h src/glog/stl_logging.h])\nAC_OUTPUT(libglog.pc)\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/depcomp",
    "content": "#! /bin/sh\n# depcomp - compile a program generating dependencies as side-effects\n\nscriptversion=2007-03-29.01\n\n# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software\n# Foundation, Inc.\n\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\n# 02110-1301, USA.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.\n\ncase $1 in\n  '')\n     echo \"$0: No command.  Try \\`$0 --help' for more information.\" 1>&2\n     exit 1;\n     ;;\n  -h | --h*)\n    cat <<\\EOF\nUsage: depcomp [--help] [--version] PROGRAM [ARGS]\n\nRun PROGRAMS ARGS to compile a file, generating dependencies\nas side-effects.\n\nEnvironment variables:\n  depmode     Dependency tracking mode.\n  source      Source file read by `PROGRAMS ARGS'.\n  object      Object file output by `PROGRAMS ARGS'.\n  DEPDIR      directory where to store dependencies.\n  depfile     Dependency file to output.\n  tmpdepfile  Temporary file to use when outputing dependencies.\n  libtool     Whether libtool is used (yes/no).\n\nReport bugs to <bug-automake@gnu.org>.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"depcomp $scriptversion\"\n    exit $?\n    ;;\nesac\n\nif test -z \"$depmode\" || test -z \"$source\" || test -z \"$object\"; then\n  echo \"depcomp: Variables source, object and depmode must be set\" 1>&2\n  exit 1\nfi\n\n# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.\ndepfile=${depfile-`echo \"$object\" |\n  sed 's|[^\\\\/]*$|'${DEPDIR-.deps}'/&|;s|\\.\\([^.]*\\)$|.P\\1|;s|Pobj$|Po|'`}\ntmpdepfile=${tmpdepfile-`echo \"$depfile\" | sed 's/\\.\\([^.]*\\)$/.T\\1/'`}\n\nrm -f \"$tmpdepfile\"\n\n# Some modes work just like other modes, but use different flags.  We\n# parameterize here, but still list the modes in the big case below,\n# to make depend.m4 easier to write.  Note that we *cannot* use a case\n# here, because this file can only contain one case statement.\nif test \"$depmode\" = hp; then\n  # HP compiler uses -M and no extra arg.\n  gccflag=-M\n  depmode=gcc\nfi\n\nif test \"$depmode\" = dashXmstdout; then\n   # This is just like dashmstdout with a different argument.\n   dashmflag=-xM\n   depmode=dashmstdout\nfi\n\ncase \"$depmode\" in\ngcc3)\n## gcc 3 implements dependency tracking that does exactly what\n## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like\n## it if -MD -MP comes after the -MF stuff.  Hmm.\n## Unfortunately, FreeBSD c89 acceptance of flags depends upon\n## the command line argument order; so add the flags where they\n## appear in depend2.am.  Note that the slowdown incurred here\n## affects only configure: in makefiles, %FASTDEP% shortcuts this.\n  for arg\n  do\n    case $arg in\n    -c) set fnord \"$@\" -MT \"$object\" -MD -MP -MF \"$tmpdepfile\" \"$arg\" ;;\n    *)  set fnord \"$@\" \"$arg\" ;;\n    esac\n    shift # fnord\n    shift # $arg\n  done\n  \"$@\"\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  mv \"$tmpdepfile\" \"$depfile\"\n  ;;\n\ngcc)\n## There are various ways to get dependency output from gcc.  Here's\n## why we pick this rather obscure method:\n## - Don't want to use -MD because we'd like the dependencies to end\n##   up in a subdir.  Having to rename by hand is ugly.\n##   (We might end up doing this anyway to support other compilers.)\n## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like\n##   -MM, not -M (despite what the docs say).\n## - Using -M directly means running the compiler twice (even worse\n##   than renaming).\n  if test -z \"$gccflag\"; then\n    gccflag=-MD,\n  fi\n  \"$@\" -Wp,\"$gccflag$tmpdepfile\"\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\n## The second -e expression handles DOS-style file names with drive letters.\n  sed -e 's/^[^:]*: / /' \\\n      -e 's/^['$alpha']:\\/[^:]*: / /' < \"$tmpdepfile\" >> \"$depfile\"\n## This next piece of magic avoids the `deleted header file' problem.\n## The problem is that when a header file which appears in a .P file\n## is deleted, the dependency causes make to die (because there is\n## typically no way to rebuild the header).  We avoid this by adding\n## dummy dependencies for each header file.  Too bad gcc doesn't do\n## this for us directly.\n  tr ' ' '\n' < \"$tmpdepfile\" |\n## Some versions of gcc put a space before the `:'.  On the theory\n## that the space means something, we add a space to the output as\n## well.\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n    sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\nsgi)\n  if test \"$libtool\" = yes; then\n    \"$@\" \"-Wp,-MDupdate,$tmpdepfile\"\n  else\n    \"$@\" -MDupdate \"$tmpdepfile\"\n  fi\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n\n  if test -f \"$tmpdepfile\"; then  # yes, the sourcefile depend on other files\n    echo \"$object : \\\\\" > \"$depfile\"\n\n    # Clip off the initial element (the dependent).  Don't try to be\n    # clever and replace this with sed code, as IRIX sed won't handle\n    # lines with more than a fixed number of characters (4096 in\n    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;\n    # the IRIX cc adds comments like `#:fec' to the end of the\n    # dependency line.\n    tr ' ' '\n' < \"$tmpdepfile\" \\\n    | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' | \\\n    tr '\n' ' ' >> $depfile\n    echo >> $depfile\n\n    # The second pass generates a dummy entry for each header file.\n    tr ' ' '\n' < \"$tmpdepfile\" \\\n   | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \\\n   >> $depfile\n  else\n    # The sourcefile does not contain any dependencies, so just\n    # store a dummy comment line, to avoid errors with the Makefile\n    # \"include basename.Plo\" scheme.\n    echo \"#dummy\" > \"$depfile\"\n  fi\n  rm -f \"$tmpdepfile\"\n  ;;\n\naix)\n  # The C for AIX Compiler uses -M and outputs the dependencies\n  # in a .u file.  In older versions, this file always lives in the\n  # current directory.  Also, the AIX compiler puts `$object:' at the\n  # start of each line; $object doesn't have directory information.\n  # Version 6 uses the directory in both cases.\n  dir=`echo \"$object\" | sed -e 's|/[^/]*$|/|'`\n  test \"x$dir\" = \"x$object\" && dir=\n  base=`echo \"$object\" | sed -e 's|^.*/||' -e 's/\\.o$//' -e 's/\\.lo$//'`\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$base.u\n    tmpdepfile3=$dir.libs/$base.u\n    \"$@\" -Wc,-M\n  else\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$dir$base.u\n    tmpdepfile3=$dir$base.u\n    \"$@\" -M\n  fi\n  stat=$?\n\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n    exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  if test -f \"$tmpdepfile\"; then\n    # Each line is of the form `foo.o: dependent.h'.\n    # Do two passes, one to just change these to\n    # `$object: dependent.h' and one to simply `dependent.h:'.\n    sed -e \"s,^.*\\.[a-z]*:,$object:,\" < \"$tmpdepfile\" > \"$depfile\"\n    # That's a tab and a space in the [].\n    sed -e 's,^.*\\.[a-z]*:[\t ]*,,' -e 's,$,:,' < \"$tmpdepfile\" >> \"$depfile\"\n  else\n    # The sourcefile does not contain any dependencies, so just\n    # store a dummy comment line, to avoid errors with the Makefile\n    # \"include basename.Plo\" scheme.\n    echo \"#dummy\" > \"$depfile\"\n  fi\n  rm -f \"$tmpdepfile\"\n  ;;\n\nicc)\n  # Intel's C compiler understands `-MD -MF file'.  However on\n  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c\n  # ICC 7.0 will fill foo.d with something like\n  #    foo.o: sub/foo.c\n  #    foo.o: sub/foo.h\n  # which is wrong.  We want:\n  #    sub/foo.o: sub/foo.c\n  #    sub/foo.o: sub/foo.h\n  #    sub/foo.c:\n  #    sub/foo.h:\n  # ICC 7.1 will output\n  #    foo.o: sub/foo.c sub/foo.h\n  # and will wrap long lines using \\ :\n  #    foo.o: sub/foo.c ... \\\n  #     sub/foo.h ... \\\n  #     ...\n\n  \"$@\" -MD -MF \"$tmpdepfile\"\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  # Each line is of the form `foo.o: dependent.h',\n  # or `foo.o: dep1.h dep2.h \\', or ` dep3.h dep4.h \\'.\n  # Do two passes, one to just change these to\n  # `$object: dependent.h' and one to simply `dependent.h:'.\n  sed \"s,^[^:]*:,$object :,\" < \"$tmpdepfile\" > \"$depfile\"\n  # Some versions of the HPUX 10.20 sed can't process this invocation\n  # correctly.  Breaking it into two sed invocations is a workaround.\n  sed 's,^[^:]*: \\(.*\\)$,\\1,;s/^\\\\$//;/^$/d;/:$/d' < \"$tmpdepfile\" |\n    sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp2)\n  # The \"hp\" stanza above does not work with aCC (C++) and HP's ia64\n  # compilers, which have integrated preprocessors.  The correct option\n  # to use with these is +Maked; it writes dependencies to a file named\n  # 'foo.d', which lands next to the object file, wherever that\n  # happens to be.\n  # Much of this is similar to the tru64 case; see comments there.\n  dir=`echo \"$object\" | sed -e 's|/[^/]*$|/|'`\n  test \"x$dir\" = \"x$object\" && dir=\n  base=`echo \"$object\" | sed -e 's|^.*/||' -e 's/\\.o$//' -e 's/\\.lo$//'`\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir.libs/$base.d\n    \"$@\" -Wc,+Maked\n  else\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir$base.d\n    \"$@\" +Maked\n  fi\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n     rm -f \"$tmpdepfile1\" \"$tmpdepfile2\"\n     exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  if test -f \"$tmpdepfile\"; then\n    sed -e \"s,^.*\\.[a-z]*:,$object:,\" \"$tmpdepfile\" > \"$depfile\"\n    # Add `dependent.h:' lines.\n    sed -ne '2,${; s/^ *//; s/ \\\\*$//; s/$/:/; p;}' \"$tmpdepfile\" >> \"$depfile\"\n  else\n    echo \"#dummy\" > \"$depfile\"\n  fi\n  rm -f \"$tmpdepfile\" \"$tmpdepfile2\"\n  ;;\n\ntru64)\n   # The Tru64 compiler uses -MD to generate dependencies as a side\n   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.\n   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put\n   # dependencies in `foo.d' instead, so we check for that too.\n   # Subdirectories are respected.\n   dir=`echo \"$object\" | sed -e 's|/[^/]*$|/|'`\n   test \"x$dir\" = \"x$object\" && dir=\n   base=`echo \"$object\" | sed -e 's|^.*/||' -e 's/\\.o$//' -e 's/\\.lo$//'`\n\n   if test \"$libtool\" = yes; then\n      # With Tru64 cc, shared objects can also be used to make a\n      # static library.  This mechanism is used in libtool 1.4 series to\n      # handle both shared and static libraries in a single compilation.\n      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.\n      #\n      # With libtool 1.5 this exception was removed, and libtool now\n      # generates 2 separate objects for the 2 libraries.  These two\n      # compilations output dependencies in $dir.libs/$base.o.d and\n      # in $dir$base.o.d.  We have to check for both files, because\n      # one of the two compilations can be disabled.  We should prefer\n      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is\n      # automatically cleaned when .libs/ is deleted, while ignoring\n      # the former would cause a distcleancheck panic.\n      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4\n      tmpdepfile2=$dir$base.o.d          # libtool 1.5\n      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5\n      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504\n      \"$@\" -Wc,-MD\n   else\n      tmpdepfile1=$dir$base.o.d\n      tmpdepfile2=$dir$base.d\n      tmpdepfile3=$dir$base.d\n      tmpdepfile4=$dir$base.d\n      \"$@\" -MD\n   fi\n\n   stat=$?\n   if test $stat -eq 0; then :\n   else\n      rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\" \"$tmpdepfile4\"\n      exit $stat\n   fi\n\n   for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\" \"$tmpdepfile4\"\n   do\n     test -f \"$tmpdepfile\" && break\n   done\n   if test -f \"$tmpdepfile\"; then\n      sed -e \"s,^.*\\.[a-z]*:,$object:,\" < \"$tmpdepfile\" > \"$depfile\"\n      # That's a tab and a space in the [].\n      sed -e 's,^.*\\.[a-z]*:[\t ]*,,' -e 's,$,:,' < \"$tmpdepfile\" >> \"$depfile\"\n   else\n      echo \"#dummy\" > \"$depfile\"\n   fi\n   rm -f \"$tmpdepfile\"\n   ;;\n\n#nosideeffect)\n  # This comment above is used by automake to tell side-effect\n  # dependency tracking mechanisms from slower ones.\n\ndashmstdout)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout, regardless of -o.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test $1 != '--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove `-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  test -z \"$dashmflag\" && dashmflag=-M\n  # Require at least two characters before searching for `:'\n  # in the target name.  This is to cope with DOS-style filenames:\n  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.\n  \"$@\" $dashmflag |\n    sed 's:^[  ]*[^: ][^:][^:]*\\:[    ]*:'\"$object\"'\\: :' > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  cat < \"$tmpdepfile\" > \"$depfile\"\n  tr ' ' '\n' < \"$tmpdepfile\" | \\\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n    sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\ndashXmstdout)\n  # This case only exists to satisfy depend.m4.  It is never actually\n  # run, as this mode is specially recognized in the preamble.\n  exit 1\n  ;;\n\nmakedepend)\n  \"$@\" || exit $?\n  # Remove any Libtool call\n  if test \"$libtool\" = yes; then\n    while test $1 != '--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n  # X makedepend\n  shift\n  cleared=no\n  for arg in \"$@\"; do\n    case $cleared in\n    no)\n      set \"\"; shift\n      cleared=yes ;;\n    esac\n    case \"$arg\" in\n    -D*|-I*)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    # Strip any option that makedepend may not understand.  Remove\n    # the object too, otherwise makedepend will parse it as a source file.\n    -*|$object)\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    esac\n  done\n  obj_suffix=\"`echo $object | sed 's/^.*\\././'`\"\n  touch \"$tmpdepfile\"\n  ${MAKEDEPEND-makedepend} -o\"$obj_suffix\" -f\"$tmpdepfile\" \"$@\"\n  rm -f \"$depfile\"\n  cat < \"$tmpdepfile\" > \"$depfile\"\n  sed '1,2d' \"$tmpdepfile\" | tr ' ' '\n' | \\\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n    sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\" \"$tmpdepfile\".bak\n  ;;\n\ncpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test $1 != '--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove `-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  \"$@\" -E |\n    sed -n -e '/^# [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' \\\n       -e '/^#line [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' |\n    sed '$ s: \\\\$::' > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  cat < \"$tmpdepfile\" >> \"$depfile\"\n  sed < \"$tmpdepfile\" '/^$/d;s/^ //;s/ \\\\$//;s/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvisualcpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout, regardless of -o,\n  # because we must use -o when running libtool.\n  \"$@\" || exit $?\n  IFS=\" \"\n  for arg\n  do\n    case \"$arg\" in\n    \"-Gm\"|\"/Gm\"|\"-Gi\"|\"/Gi\"|\"-ZI\"|\"/ZI\")\n\tset fnord \"$@\"\n\tshift\n\tshift\n\t;;\n    *)\n\tset fnord \"$@\" \"$arg\"\n\tshift\n\tshift\n\t;;\n    esac\n  done\n  \"$@\" -E |\n  sed -n '/^#line [0-9][0-9]* \"\\([^\"]*\\)\"/ s::echo \"`cygpath -u \\\\\"\\1\\\\\"`\":p' | sort | uniq > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  . \"$tmpdepfile\" | sed 's% %\\\\ %g' | sed -n '/^\\(.*\\)$/ s::\t\\1 \\\\:p' >> \"$depfile\"\n  echo \"\t\" >> \"$depfile\"\n  . \"$tmpdepfile\" | sed 's% %\\\\ %g' | sed -n '/^\\(.*\\)$/ s::\\1\\::p' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nnone)\n  exec \"$@\"\n  ;;\n\n*)\n  echo \"Unknown depmode $depmode\" 1>&2\n  exit 1\n  ;;\nesac\n\nexit 0\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-end: \"$\"\n# End:\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/doc/designstyle.css",
    "content": "body {\n  background-color: #ffffff;\n  color: black;\n  margin-right: 1in;\n  margin-left: 1in;\n}\n\n\nh1, h2, h3, h4, h5, h6 {\n  color: #3366ff;\n  font-family: sans-serif;\n}\n@media print {\n  /* Darker version for printing */\n  h1, h2, h3, h4, h5, h6 {\n    color: #000080;\n    font-family: helvetica, sans-serif;\n  }\n}\n\nh1 { \n  text-align: center;\n  font-size: 18pt;\n}\nh2 {\n  margin-left: -0.5in;\n}\nh3 {\n  margin-left: -0.25in;\n}\nh4 {\n  margin-left: -0.125in;\n}\nhr {\n  margin-left: -1in;\n}\n\n/* Definition lists: definition term bold */\ndt {\n  font-weight: bold;\n}\n\naddress {\n  text-align: right;\n}\n/* Use the <code> tag for bits of code and <var> for variables and objects. */\ncode,pre,samp,var {\n  color: #006000;\n}\n/* Use the <file> tag for file and directory paths and names. */\nfile {\n  color: #905050;\n  font-family: monospace;\n}\n/* Use the <kbd> tag for stuff the user should type. */\nkbd {\n  color: #600000;\n}\ndiv.note p {\n  float: right;\n  width: 3in;\n  margin-right: 0%;\n  padding: 1px;\n  border: 2px solid #6060a0;\n  background-color: #fffff0;\n}\n\nUL.nobullets {\n  list-style-type: none;\n  list-style-image: none;\n  margin-left: -1em;\n}\n\n/*\nbody:after {\n  content: \"Google Confidential\";\n}\n*/\n\n/* pretty printing styles.  See prettify.js */\n.str { color: #080; }\n.kwd { color: #008; }\n.com { color: #800; }\n.typ { color: #606; }\n.lit { color: #066; }\n.pun { color: #660; }\n.pln { color: #000; }\n.tag { color: #008; }\n.atn { color: #606; }\n.atv { color: #080; }\npre.prettyprint { padding: 2px; border: 1px solid #888; }\n\n.embsrc { background: #eee; }\n\n@media print {\n  .str { color: #060; }\n  .kwd { color: #006; font-weight: bold; }\n  .com { color: #600; font-style: italic; }\n  .typ { color: #404; font-weight: bold; }\n  .lit { color: #044; }\n  .pun { color: #440; }\n  .pln { color: #000; }\n  .tag { color: #006; font-weight: bold; }\n  .atn { color: #404; }\n  .atv { color: #060; }\n}\n\n/* Table Column Headers */\n.hdr { \n  color: #006; \n  font-weight: bold; \n  background-color: #dddddd; }\n.hdr2 { \n  color: #006; \n  background-color: #eeeeee; }"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/doc/glog.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n\n<html>\n<head>\n<title>How To Use Google Logging Library (glog)</title>\n\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n<link href=\"http://www.google.com/favicon.ico\" type=\"image/x-icon\"\n      rel=\"shortcut icon\">\n<link href=\"designstyle.css\" type=\"text/css\" rel=\"stylesheet\">\n<style type=\"text/css\">\n<!--\n  ol.bluelist li {\n    color: #3366ff;\n    font-family: sans-serif;\n  }\n  ol.bluelist li p {\n    color: #000;\n    font-family: \"Times Roman\", times, serif;\n  }\n  ul.blacklist li {\n    color: #000;\n    font-family: \"Times Roman\", times, serif;\n  }\n//-->\n</style>\n</head>\n\n<body>\n\n<h1>How To Use Google Logging Library (glog)</h1>\n<small>(as of\n<script type=text/javascript>\n  var lm = new Date(document.lastModified);\n  document.write(lm.toDateString());\n</script>)\n</small>\n<br>\n\n<h2> <A NAME=intro>Introduction</A> </h2>\n\n<p><b>Google glog</b> is a library that implements application-level\nlogging.  This library provides logging APIs based on C++-style\nstreams and various helper macros.\nYou can log a message by simply streaming things to LOG(&lt;a\nparticular <a href=\"#severity\">severity level</a>&gt;), e.g.\n\n<pre>\n   #include &lt;glog/logging.h&gt;\n\n   int main(int argc, char* argv[]) {\n     // Initialize Google's logging library.\n     google::InitGoogleLogging(argv[0]);\n\n     // ...\n     LOG(INFO) &lt;&lt; \"Found \" &lt;&lt; num_cookies &lt;&lt; \" cookies\";\n   }\n</pre>\n\n<p>Google glog defines a series of macros that simplify many common logging\ntasks.  You can log messages by severity level, control logging\nbehavior from the command line, log based on conditionals, abort the\nprogram when expected conditions are not met, introduce your own\nverbose logging levels, and more.  This document describes the\nfunctionality supported by glog.  Please note that this document\ndoesn't describe all features in this library, but the most useful\nones.  If you want to find less common features, please check\nheader files under <code>src/glog</code> directory.\n\n<h2> <A NAME=severity>Severity Level</A> </h2>\n\n<p>\nYou can specify one of the following severity levels (in\nincreasing order of severity): <code>INFO</code>, <code>WARNING</code>,\n<code>ERROR</code>, and <code>FATAL</code>.\nLogging a <code>FATAL</code> message terminates the program (after the\nmessage is logged).\nNote that messages of a given severity are logged not only in the\nlogfile for that severity, but also in all logfiles of lower severity.\nE.g., a message of severity <code>FATAL</code> will be logged to the\nlogfiles of severity <code>FATAL</code>, <code>ERROR</code>,\n<code>WARNING</code>, and <code>INFO</code>.\n\n<p>\nThe <code>DFATAL</code> severity logs a <code>FATAL</code> error in\ndebug mode (i.e., there is no <code>NDEBUG</code> macro defined), but\navoids halting the program in production by automatically reducing the\nseverity to <code>ERROR</code>.\n\n<p>Unless otherwise specified, glog writes to the filename\n\"/tmp/&lt;program name&gt;.&lt;hostname&gt;.&lt;user name&gt;.log.&lt;severity level&gt;.&lt;date&gt;.&lt;time&gt;.&lt;pid&gt;\"\n(e.g., \"/tmp/hello_world.example.com.hamaji.log.INFO.20080709-222411.10474\").\nBy default, glog copies the log messages of severity level\n<code>ERROR</code> or <code>FATAL</code> to standard error (stderr)\nin addition to log files.\n\n<h2><A NAME=flags>Setting Flags</A></h2>\n\n<p>Several flags influence glog's output behavior.\nIf the <a href=\"http://code.google.com/p/google-gflags/\">Google\ngflags library</a> is installed on your machine, the\n<code>configure</code> script (see the INSTALL file in the package for\ndetail of this script) will automatically detect and use it,\nallowing you to pass flags on the command line.  For example, if you\nwant to turn the flag <code>--logtostderr</code> on, you can start\nyour application with the following command line:\n\n<pre>\n   ./your_application --logtostderr=1\n</pre>\n\nIf the Google gflags library isn't installed, you set flags via\nenvironment variables, prefixing the flag name with \"GLOG_\", e.g.\n\n<pre>\n   GLOG_logtostderr=1 ./your_application\n</pre>\n\n<!-- TODO(hamaji): Fill the version number\n<p>By glog version 0.x.x, you can use GLOG_* environment variables\neven if you have gflags. If both an environment variable and a flag\nare specified, the value specified by a flag wins. E.g., if GLOG_v=0\nand --v=1, the verbosity will be 1, not 0.\n-->\n\n<p>The following flags are most commonly used:\n\n<dl>\n<dt><code>logtostderr</code> (<code>bool</code>, default=<code>false</code>)\n<dd>Log messages to stderr instead of logfiles.<br>\nNote: you can set binary flags to <code>true</code> by specifying\n<code>1</code>, <code>true</code>, or <code>yes</code> (case\ninsensitive).\nAlso, you can set binary flags to <code>false</code> by specifying\n<code>0</code>, <code>false</code>, or <code>no</code> (again, case\ninsensitive).\n<dt><code>stderrthreshold</code> (<code>int</code>, default=2, which\nis <code>ERROR</code>)\n<dd>Copy log messages at or above this level to stderr in\naddition to logfiles.  The numbers of severity levels\n<code>INFO</code>, <code>WARNING</code>, <code>ERROR</code>, and\n<code>FATAL</code> are 0, 1, 2, and 3, respectively.\n<dt><code>minloglevel</code> (<code>int</code>, default=0, which\nis <code>INFO</code>)\n<dd>Log messages at or above this level.  Again, the numbers of\nseverity levels <code>INFO</code>, <code>WARNING</code>,\n<code>ERROR</code>, and <code>FATAL</code> are 0, 1, 2, and 3,\nrespectively.\n<dt><code>log_dir</code> (<code>string</code>, default=\"\")\n<dd>If specified, logfiles are written into this directory instead\nof the default logging directory.\n<dt><code>v</code> (<code>int</code>, default=0)\n<dd>Show all <code>VLOG(m)</code> messages for <code>m</code> less or\nequal the value of this flag.  Overridable by --vmodule.\nSee <a href=\"#verbose\">the section about verbose logging</a> for more\ndetail.\n<dt><code>vmodule</code> (<code>string</code>, default=\"\")\n<dd>Per-module verbose level.  The argument has to contain a\ncomma-separated list of &lt;module name&gt;=&lt;log level&gt;.\n&lt;module name&gt;\nis a glob pattern (e.g., <code>gfs*</code> for all modules whose name\nstarts with \"gfs\"), matched against the filename base\n(that is, name ignoring .cc/.h./-inl.h).\n&lt;log level&gt; overrides any value given by --v.\nSee also <a href=\"#verbose\">the section about verbose logging</a>.\n</dl>\n\n<p>There are some other flags defined in logging.cc.  Please grep the\nsource code for \"DEFINE_\" to see a complete list of all flags.\n\n<h2><A NAME=conditional>Conditional / Occasional Logging</A></h2>\n\n<p>Sometimes, you may only want to log a message under certain\nconditions. You can use the following macros to perform conditional\nlogging:\n\n<pre>\n   LOG_IF(INFO, num_cookies &gt; 10) &lt;&lt; \"Got lots of cookies\";\n</pre>\n\nThe \"Got lots of cookies\" message is logged only when the variable\n<code>num_cookies</code> exceeds 10.\n\nIf a line of code is executed many times, it may be useful to only log\na message at certain intervals.  This kind of logging is most useful\nfor informational messages.\n\n<pre>\n   LOG_EVERY_N(INFO, 10) &lt;&lt; \"Got the \" &lt;&lt; google::COUNTER &lt;&lt; \"th cookie\";\n</pre>\n\n<p>The above line outputs a log messages on the 1st, 11th,\n21st, ... times it is executed.  Note that the special\n<code>google::COUNTER</code> value is used to identify which repetition is\nhappening.\n\n<p>You can combine conditional and occasional logging with the\nfollowing macro.\n\n<pre>\n   LOG_IF_EVERY_N(INFO, (size &gt; 1024), 10) &lt;&lt; \"Got the \" &lt;&lt; google::COUNTER\n                                           &lt;&lt; \"th big cookie\";\n</pre>\n\n<p>Instead of outputting a message every nth time, you can also limit\nthe output to the first n occurrences:\n\n<pre>\n   LOG_FIRST_N(INFO, 20) &lt;&lt; \"Got the \" &lt;&lt; google::COUNTER &lt;&lt; \"th cookie\";\n</pre>\n\n<p>Outputs log messages for the first 20 times it is executed.  Again,\nthe <code>google::COUNTER</code> identifier indicates which repetition is\nhappening.\n\n<h2><A NAME=debug>Debug Mode Support</A></h2>\n\n<p>Special \"debug mode\" logging macros only have an effect in debug\nmode and are compiled away to nothing for non-debug mode\ncompiles.  Use these macros to avoid slowing down your production\napplication due to excessive logging.\n\n<pre>\n   DLOG(INFO) &lt;&lt; \"Found cookies\";\n\n   DLOG_IF(INFO, num_cookies &gt; 10) &lt;&lt; \"Got lots of cookies\";\n\n   DLOG_EVERY_N(INFO, 10) &lt;&lt; \"Got the \" &lt;&lt; google::COUNTER &lt;&lt; \"th cookie\";\n</pre>\n\n<h2><A NAME=check>CHECK Macros</A></h2>\n\n<p>It is a good practice to check expected conditions in your program\nfrequently to detect errors as early as possible. The\n<code>CHECK</code> macro provides the ability to abort the application\nwhen a condition is not met, similar to the <code>assert</code> macro\ndefined in the standard C library.\n\n<p><code>CHECK</code> aborts the application if a condition is not\ntrue.  Unlike <code>assert</code>, it is *not* controlled by\n<code>NDEBUG</code>, so the check will be executed regardless of\ncompilation mode.  Therefore, <code>fp-&gt;Write(x)</code> in the\nfollowing example is always executed:\n\n<pre>\n   CHECK(fp-&gt;Write(x) == 4) &lt;&lt; \"Write failed!\";\n</pre>\n\n<p>There are various helper macros for\nequality/inequality checks - <code>CHECK_EQ</code>,\n<code>CHECK_NE</code>, <code>CHECK_LE</code>, <code>CHECK_LT</code>,\n<code>CHECK_GE</code>, and <code>CHECK_GT</code>.\nThey compare two values, and log a\n<code>FATAL</code> message including the two values when the result is\nnot as expected.  The values must have <code>operator&lt;&lt;(ostream,\n...)</code> defined.\n\n<p>You may append to the error message like so:\n\n<pre>\n   CHECK_NE(1, 2) &lt;&lt; \": The world must be ending!\";\n</pre>\n\n<p>We are very careful to ensure that each argument is evaluated exactly\nonce, and that anything which is legal to pass as a function argument is\nlegal here.  In particular, the arguments may be temporary expressions\nwhich will end up being destroyed at the end of the apparent statement,\nfor example:\n\n<pre>\n   CHECK_EQ(string(\"abc\")[1], 'b');\n</pre>\n\n<p>The compiler reports an error if one of the arguments is a\npointer and the other is NULL. To work around this, simply static_cast\nNULL to the type of the desired pointer.\n\n<pre>\n   CHECK_EQ(some_ptr, static_cast&lt;SomeType*&gt;(NULL));\n</pre>\n\n<p>Better yet, use the CHECK_NOTNULL macro:\n\n<pre>\n   CHECK_NOTNULL(some_ptr);\n   some_ptr-&gt;DoSomething();\n</pre>\n\n<p>Since this macro returns the given pointer, this is very useful in\nconstructor initializer lists.\n\n<pre>\n   struct S {\n     S(Something* ptr) : ptr_(CHECK_NOTNULL(ptr)) {}\n     Something* ptr_;\n   };\n</pre>\n\n<p>Note that you cannot use this macro as a C++ stream due to this\nfeature.  Please use <code>CHECK_EQ</code> described above to log a\ncustom message before aborting the application.\n\n<p>If you are comparing C strings (char *), a handy set of macros\nperforms case sensitive as well as case insensitive comparisons -\n<code>CHECK_STREQ</code>, <code>CHECK_STRNE</code>,\n<code>CHECK_STRCASEEQ</code>, and <code>CHECK_STRCASENE</code>.  The\nCASE versions are case-insensitive.  You can safely pass <code>NULL</code>\npointers for this macro.  They treat <code>NULL</code> and any\nnon-<code>NULL</code> string as not equal.  Two <code>NULL</code>s are\nequal.\n\n<p>Note that both arguments may be temporary strings which are\ndestructed at the end of the current \"full expression\"\n(e.g., <code>CHECK_STREQ(Foo().c_str(), Bar().c_str())</code> where\n<code>Foo</code> and <code>Bar</code> return C++'s\n<code>std::string</code>).\n\n<p>The <code>CHECK_DOUBLE_EQ</code> macro checks the equality of two\nfloating point values, accepting a small error margin.\n<code>CHECK_NEAR</code> accepts a third floating point argument, which\nspecifies the acceptable error margin.\n\n<h2><A NAME=verbose>Verbose Logging</A></h2>\n\n<p>When you are chasing difficult bugs, thorough log messages are very\nuseful.  However, you may want to ignore too verbose messages in usual\ndevelopment.  For such verbose logging, glog provides the\n<code>VLOG</code> macro, which allows you to define your own numeric\nlogging levels.  The <code>--v</code> command line option controls\nwhich verbose messages are logged:\n\n<pre>\n   VLOG(1) &lt;&lt; \"I'm printed when you run the program with --v=1 or higher\";\n   VLOG(2) &lt;&lt; \"I'm printed when you run the program with --v=2 or higher\";\n</pre>\n\n<p>With <code>VLOG</code>, the lower the verbose level, the more\nlikely messages are to be logged.  For example, if\n<code>--v==1</code>, <code>VLOG(1)</code> will log, but\n<code>VLOG(2)</code> will not log.  This is opposite of the severity\nlevel, where <code>INFO</code> is 0, and <code>ERROR</code> is 2.\n<code>--minloglevel</code> of 1 will log <code>WARNING</code> and\nabove.  Though you can specify any integers for both <code>VLOG</code>\nmacro and <code>--v</code> flag, the common values for them are small\npositive integers.  For example, if you write <code>VLOG(0)</code>,\nyou should specify <code>--v=-1</code> or lower to silence it.  This\nis less useful since we may not want verbose logs by default in most\ncases.  The <code>VLOG</code> macros always log at the\n<code>INFO</code> log level (when they log at all).\n\n<p>Verbose logging can be controlled from the command line on a\nper-module basis:\n\n<pre>\n   --vmodule=mapreduce=2,file=1,gfs*=3 --v=0\n</pre>\n\n<p>will:\n\n<ul>\n  <li>a. Print VLOG(2) and lower messages from mapreduce.{h,cc}\n  <li>b. Print VLOG(1) and lower messages from file.{h,cc}\n  <li>c. Print VLOG(3) and lower messages from files prefixed with \"gfs\"\n  <li>d. Print VLOG(0) and lower messages from elsewhere\n</ul>\n\n<p>The wildcarding functionality shown by (c) supports both '*'\n(matches 0 or more characters) and '?' (matches any single character)\nwildcards.  Please also check the section about <a\nhref=\"#flags\">command line flags</a>.\n\n<p>There's also <code>VLOG_IS_ON(n)</code> \"verbose level\" condition\nmacro.  This macro returns true when the <code>--v</code> is equal or\ngreater than <code>n</code>.  To be used as\n\n<pre>\n   if (VLOG_IS_ON(2)) {\n     // do some logging preparation and logging\n     // that can't be accomplished with just VLOG(2) &lt;&lt; ...;\n   }\n</pre>\n\n<p>Verbose level condition macros <code>VLOG_IF</code>,\n<code>VLOG_EVERY_N</code> and <code>VLOG_IF_EVERY_N</code> behave\nanalogous to <code>LOG_IF</code>, <code>LOG_EVERY_N</code>,\n<code>LOF_IF_EVERY</code>, but accept a numeric verbosity level as\nopposed to a severity level.\n\n<pre>\n   VLOG_IF(1, (size &gt; 1024))\n      &lt;&lt; \"I'm printed when size is more than 1024 and when you run the \"\n         \"program with --v=1 or more\";\n   VLOG_EVERY_N(1, 10)\n      &lt;&lt; \"I'm printed every 10th occurrence, and when you run the program \"\n         \"with --v=1 or more. Present occurence is \" &lt;&lt; google::COUNTER;\n   VLOG_IF_EVERY_N(1, (size &gt; 1024), 10)\n      &lt;&lt; \"I'm printed on every 10th occurence of case when size is more \"\n         \" than 1024, when you run the program with --v=1 or more. \";\n         \"Present occurence is \" &lt;&lt; google::COUNTER;\n</pre>\n\n<h2> <A name=\"signal\">Failure Signal Handler</A> </h2>\n\n<p>\nThe library provides a convenient signal handler that will dump useful\ninformation when the program crashes on certain signals such as SIGSEGV.\nThe signal handler can be installed by\ngoogle::InstallFailureSignalHandler().  The following is an example of output\nfrom the signal handler.\n\n<pre>\n*** Aborted at 1225095260 (unix time) try \"date -d @1225095260\" if you are using GNU date ***\n*** SIGSEGV (@0x0) received by PID 17711 (TID 0x7f893090a6f0) from PID 0; stack trace: ***\nPC: @           0x412eb1 TestWaitingLogSink::send()\n    @     0x7f892fb417d0 (unknown)\n    @           0x412eb1 TestWaitingLogSink::send()\n    @     0x7f89304f7f06 google::LogMessage::SendToLog()\n    @     0x7f89304f35af google::LogMessage::Flush()\n    @     0x7f89304f3739 google::LogMessage::~LogMessage()\n    @           0x408cf4 TestLogSinkWaitTillSent()\n    @           0x4115de main\n    @     0x7f892f7ef1c4 (unknown)\n    @           0x4046f9 (unknown)\n</pre>\n\n<p>\nBy default, the signal handler writes the failure dump to the standard\nerror.  You can customize the destination by InstallFailureWriter().\n\n<h2> <A name=\"misc\">Miscellaneous Notes</A> </h2>\n\n<h3><A NAME=message>Performance of Messages</A></h3>\n\n<p>The conditional logging macros provided by glog (e.g.,\n<code>CHECK</code>, <code>LOG_IF</code>, <code>VLOG</code>, ...) are\ncarefully implemented and don't execute the right hand side\nexpressions when the conditions are false.  So, the following check\nmay not sacrifice the performance of your application.\n\n<pre>\n   CHECK(obj.ok) &lt;&lt; obj.CreatePrettyFormattedStringButVerySlow();\n</pre>\n\n<h3><A NAME=failure>User-defined Failure Function</A></h3>\n\n<p><code>FATAL</code> severity level messages or unsatisfied\n<code>CHECK</code> condition terminate your program.  You can change\nthe behavior of the termination by\n<code>InstallFailureFunction</code>.\n\n<pre>\n   void YourFailureFunction() {\n     // Reports something...\n     exit(1);\n   }\n\n   int main(int argc, char* argv[]) {\n     google::InstallFailureFunction(&amp;YourFailureFunction);\n   }\n</pre>\n\n<p>By default, glog tries to dump stacktrace and makes the program\nexit with status 1.  The stacktrace is produced only when you run the\nprogram on an architecture for which glog supports stack tracing (as\nof September 2008, glog supports stack tracing for x86 and x86_64).\n\n<h3><A NAME=raw>Raw Logging</A></h3>\n\n<p>The header file <code>&lt;glog/raw_logging.h&gt;</code> can be\nused for thread-safe logging, which does not allocate any memory or\nacquire any locks.  Therefore, the macros defined in this\nheader file can be used by low-level memory allocation and\nsynchronization code.\nPlease check <code>src/glog/raw_logging.h.in</code> for detail.\n</p>\n\n<h3><A NAME=plog>Google Style perror()</A></h3>\n\n<p><code>PLOG()</code> and <code>PLOG_IF()</code> and\n<code>PCHECK()</code> behave exactly like their <code>LOG*</code> and\n<code>CHECK</code> equivalents with the addition that they append a\ndescription of the current state of errno to their output lines.\nE.g.\n\n<pre>\n   PCHECK(write(1, NULL, 2) &gt;= 0) &lt;&lt; \"Write NULL failed\";\n</pre>\n\n<p>This check fails with the following error message.\n\n<pre>\n   F0825 185142 test.cc:22] Check failed: write(1, NULL, 2) &gt;= 0 Write NULL failed: Bad address [14]\n</pre>\n\n<h3><A NAME=syslog>Syslog</A></h3>\n\n<p><code>SYSLOG</code>, <code>SYSLOG_IF</code>, and\n<code>SYSLOG_EVERY_N</code> macros are available.\nThese log to syslog in addition to the normal logs.  Be aware that\nlogging to syslog can drastically impact performance, especially if\nsyslog is configured for remote logging!  Make sure you understand the\nimplications of outputting to syslog before you use these macros. In\ngeneral, it's wise to use these macros sparingly.\n\n<h3><A NAME=strip>Strip Logging Messages</A></h3>\n\n<p>Strings used in log messages can increase the size of your binary\nand present a privacy concern.  You can therefore instruct glog to\nremove all strings which fall below a certain severity level by using\nthe GOOGLE_STRIP_LOG macro:\n\n<p>If your application has code like this:\n\n<pre>\n   #define GOOGLE_STRIP_LOG 1    // this must go before the #include!\n   #include &lt;glog/logging.h&gt;\n</pre>\n\n<p>The compiler will remove the log messages whose severities are less\nthan the specified integer value.  Since\n<code>VLOG</code> logs at the severity level <code>INFO</code>\n(numeric value <code>0</code>),\nsetting <code>GOOGLE_STRIP_LOG</code> to 1 or greater removes\nall log messages associated with <code>VLOG</code>s as well as\n<code>INFO</code> log statements.\n\n<h3><A NAME=windows>Notes for Windows users</A></h3>\n\n<p>Google glog defines a severity level <code>ERROR</code>, which is\nalso defined in <code>windows.h</code>\nThere are two known workarounds to avoid this conflict:\n\n<ul>\n  <li>#define <code>WIN32_LEAN_AND_MEAN</code> or <code>NOGDI</code>\n      <strong>before</strong> you #include <code>windows.h</code> .\n  <li>#undef <code>ERROR</code> <strong>after</strong> you #include\n      <code>windows.h</code> .\n</ul>\n\n<p>See <a href=\"http://code.google.com/p/google-glog/issues/detail?id=33\">\nthis issue</a> for more detail.\n\n<hr>\n<address>\nShinichiro Hamaji<br>\nGregor Hohpe<br>\n<script type=text/javascript>\n  var lm = new Date(document.lastModified);\n  document.write(lm.toDateString());\n</script>\n</address>\n\n</body>\n</html>\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/google-glog.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual C++ Express 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libglog\", \"vsprojects\\libglog\\libglog.vcproj\", \"{34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"logging_unittest\", \"vsprojects\\logging_unittest\\logging_unittest.vcproj\", \"{DD0690AA-5E09-46B5-83FD-4B28604CABA8}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1} = {34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libglog_static\", \"vsprojects\\libglog_static\\libglog_static.vcproj\", \"{772C2111-BBBF-49E6-B912-198A7F7A88E5}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"logging_unittest_static\", \"vsprojects\\logging_unittest_static\\logging_unittest_static.vcproj\", \"{9B239B45-84A9-4E06-AC46-8E220CD43974}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{772C2111-BBBF-49E6-B912-198A7F7A88E5} = {772C2111-BBBF-49E6-B912-198A7F7A88E5}\r\n\tEndProjectSection\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{DD0690AA-5E09-46B5-83FD-4B28604CABA8}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{DD0690AA-5E09-46B5-83FD-4B28604CABA8}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{DD0690AA-5E09-46B5-83FD-4B28604CABA8}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{DD0690AA-5E09-46B5-83FD-4B28604CABA8}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{772C2111-BBBF-49E6-B912-198A7F7A88E5}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{772C2111-BBBF-49E6-B912-198A7F7A88E5}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{772C2111-BBBF-49E6-B912-198A7F7A88E5}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{772C2111-BBBF-49E6-B912-198A7F7A88E5}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{9B239B45-84A9-4E06-AC46-8E220CD43974}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{9B239B45-84A9-4E06-AC46-8E220CD43974}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{9B239B45-84A9-4E06-AC46-8E220CD43974}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{9B239B45-84A9-4E06-AC46-8E220CD43974}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/install-sh",
    "content": "#!/bin/sh\n# install - install a program, script, or datafile\n\nscriptversion=2006-12-25.00\n\n# This originates from X11R5 (mit/util/scripts/install.sh), which was\n# later released in X11R6 (xc/config/util/install.sh) with the\n# following copyright and license.\n#\n# Copyright (C) 1994 X Consortium\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to\n# deal in the Software without restriction, including without limitation the\n# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n# sell copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-\n# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#\n# Except as contained in this notice, the name of the X Consortium shall not\n# be used in advertising or otherwise to promote the sale, use or other deal-\n# ings in this Software without prior written authorization from the X Consor-\n# tium.\n#\n#\n# FSF changes to this file are in the public domain.\n#\n# Calling this script install-sh is preferred over install.sh, to prevent\n# `make' implicit rules from creating a file called install from it\n# when there is no Makefile.\n#\n# This script is compatible with the BSD install script, but was written\n# from scratch.\n\nnl='\n'\nIFS=\" \"\"\t$nl\"\n\n# set DOITPROG to echo to test this script\n\n# Don't use :- since 4.3BSD and earlier shells don't like it.\ndoit=${DOITPROG-}\nif test -z \"$doit\"; then\n  doit_exec=exec\nelse\n  doit_exec=$doit\nfi\n\n# Put in absolute file names if you don't have them in your path;\n# or use environment vars.\n\nchgrpprog=${CHGRPPROG-chgrp}\nchmodprog=${CHMODPROG-chmod}\nchownprog=${CHOWNPROG-chown}\ncmpprog=${CMPPROG-cmp}\ncpprog=${CPPROG-cp}\nmkdirprog=${MKDIRPROG-mkdir}\nmvprog=${MVPROG-mv}\nrmprog=${RMPROG-rm}\nstripprog=${STRIPPROG-strip}\n\nposix_glob='?'\ninitialize_posix_glob='\n  test \"$posix_glob\" != \"?\" || {\n    if (set -f) 2>/dev/null; then\n      posix_glob=\n    else\n      posix_glob=:\n    fi\n  }\n'\n\nposix_mkdir=\n\n# Desired mode of installed file.\nmode=0755\n\nchgrpcmd=\nchmodcmd=$chmodprog\nchowncmd=\nmvcmd=$mvprog\nrmcmd=\"$rmprog -f\"\nstripcmd=\n\nsrc=\ndst=\ndir_arg=\ndst_arg=\n\ncopy_on_change=false\nno_target_directory=\n\nusage=\"\\\nUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE\n   or: $0 [OPTION]... SRCFILES... DIRECTORY\n   or: $0 [OPTION]... -t DIRECTORY SRCFILES...\n   or: $0 [OPTION]... -d DIRECTORIES...\n\nIn the 1st form, copy SRCFILE to DSTFILE.\nIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.\nIn the 4th, create DIRECTORIES.\n\nOptions:\n     --help     display this help and exit.\n     --version  display version info and exit.\n\n  -c            (ignored)\n  -C            install only if different (preserve the last data modification time)\n  -d            create directories instead of installing files.\n  -g GROUP      $chgrpprog installed files to GROUP.\n  -m MODE       $chmodprog installed files to MODE.\n  -o USER       $chownprog installed files to USER.\n  -s            $stripprog installed files.\n  -t DIRECTORY  install into DIRECTORY.\n  -T            report an error if DSTFILE is a directory.\n\nEnvironment variables override the default commands:\n  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG\n  RMPROG STRIPPROG\n\"\n\nwhile test $# -ne 0; do\n  case $1 in\n    -c) ;;\n\n    -C) copy_on_change=true;;\n\n    -d) dir_arg=true;;\n\n    -g) chgrpcmd=\"$chgrpprog $2\"\n\tshift;;\n\n    --help) echo \"$usage\"; exit $?;;\n\n    -m) mode=$2\n\tcase $mode in\n\t  *' '* | *'\t'* | *'\n'*\t  | *'*'* | *'?'* | *'['*)\n\t    echo \"$0: invalid mode: $mode\" >&2\n\t    exit 1;;\n\tesac\n\tshift;;\n\n    -o) chowncmd=\"$chownprog $2\"\n\tshift;;\n\n    -s) stripcmd=$stripprog;;\n\n    -t) dst_arg=$2\n\tshift;;\n\n    -T) no_target_directory=true;;\n\n    --version) echo \"$0 $scriptversion\"; exit $?;;\n\n    --)\tshift\n\tbreak;;\n\n    -*)\techo \"$0: invalid option: $1\" >&2\n\texit 1;;\n\n    *)  break;;\n  esac\n  shift\ndone\n\nif test $# -ne 0 && test -z \"$dir_arg$dst_arg\"; then\n  # When -d is used, all remaining arguments are directories to create.\n  # When -t is used, the destination is already specified.\n  # Otherwise, the last argument is the destination.  Remove it from $@.\n  for arg\n  do\n    if test -n \"$dst_arg\"; then\n      # $@ is not empty: it contains at least $arg.\n      set fnord \"$@\" \"$dst_arg\"\n      shift # fnord\n    fi\n    shift # arg\n    dst_arg=$arg\n  done\nfi\n\nif test $# -eq 0; then\n  if test -z \"$dir_arg\"; then\n    echo \"$0: no input file specified.\" >&2\n    exit 1\n  fi\n  # It's OK to call `install-sh -d' without argument.\n  # This can happen when creating conditional directories.\n  exit 0\nfi\n\nif test -z \"$dir_arg\"; then\n  trap '(exit $?); exit' 1 2 13 15\n\n  # Set umask so as not to create temps with too-generous modes.\n  # However, 'strip' requires both read and write access to temps.\n  case $mode in\n    # Optimize common cases.\n    *644) cp_umask=133;;\n    *755) cp_umask=22;;\n\n    *[0-7])\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw='% 200'\n      fi\n      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;\n    *)\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw=,u+rw\n      fi\n      cp_umask=$mode$u_plus_rw;;\n  esac\nfi\n\nfor src\ndo\n  # Protect names starting with `-'.\n  case $src in\n    -*) src=./$src;;\n  esac\n\n  if test -n \"$dir_arg\"; then\n    dst=$src\n    dstdir=$dst\n    test -d \"$dstdir\"\n    dstdir_status=$?\n  else\n\n    # Waiting for this to be detected by the \"$cpprog $src $dsttmp\" command\n    # might cause directories to be created, which would be especially bad\n    # if $src (and thus $dsttmp) contains '*'.\n    if test ! -f \"$src\" && test ! -d \"$src\"; then\n      echo \"$0: $src does not exist.\" >&2\n      exit 1\n    fi\n\n    if test -z \"$dst_arg\"; then\n      echo \"$0: no destination specified.\" >&2\n      exit 1\n    fi\n\n    dst=$dst_arg\n    # Protect names starting with `-'.\n    case $dst in\n      -*) dst=./$dst;;\n    esac\n\n    # If destination is a directory, append the input filename; won't work\n    # if double slashes aren't ignored.\n    if test -d \"$dst\"; then\n      if test -n \"$no_target_directory\"; then\n\techo \"$0: $dst_arg: Is a directory\" >&2\n\texit 1\n      fi\n      dstdir=$dst\n      dst=$dstdir/`basename \"$src\"`\n      dstdir_status=0\n    else\n      # Prefer dirname, but fall back on a substitute if dirname fails.\n      dstdir=`\n\t(dirname \"$dst\") 2>/dev/null ||\n\texpr X\"$dst\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)[^/]' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)$' \\| \\\n\t     X\"$dst\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n\techo X\"$dst\" |\n\t    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)[^/].*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\).*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t s/.*/./; q'\n      `\n\n      test -d \"$dstdir\"\n      dstdir_status=$?\n    fi\n  fi\n\n  obsolete_mkdir_used=false\n\n  if test $dstdir_status != 0; then\n    case $posix_mkdir in\n      '')\n\t# Create intermediate dirs using mode 755 as modified by the umask.\n\t# This is like FreeBSD 'install' as of 1997-10-28.\n\tumask=`umask`\n\tcase $stripcmd.$umask in\n\t  # Optimize common cases.\n\t  *[2367][2367]) mkdir_umask=$umask;;\n\t  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;\n\n\t  *[0-7])\n\t    mkdir_umask=`expr $umask + 22 \\\n\t      - $umask % 100 % 40 + $umask % 20 \\\n\t      - $umask % 10 % 4 + $umask % 2\n\t    `;;\n\t  *) mkdir_umask=$umask,go-w;;\n\tesac\n\n\t# With -d, create the new directory with the user-specified mode.\n\t# Otherwise, rely on $mkdir_umask.\n\tif test -n \"$dir_arg\"; then\n\t  mkdir_mode=-m$mode\n\telse\n\t  mkdir_mode=\n\tfi\n\n\tposix_mkdir=false\n\tcase $umask in\n\t  *[123567][0-7][0-7])\n\t    # POSIX mkdir -p sets u+wx bits regardless of umask, which\n\t    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.\n\t    ;;\n\t  *)\n\t    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$\n\t    trap 'ret=$?; rmdir \"$tmpdir/d\" \"$tmpdir\" 2>/dev/null; exit $ret' 0\n\n\t    if (umask $mkdir_umask &&\n\t\texec $mkdirprog $mkdir_mode -p -- \"$tmpdir/d\") >/dev/null 2>&1\n\t    then\n\t      if test -z \"$dir_arg\" || {\n\t\t   # Check for POSIX incompatibilities with -m.\n\t\t   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or\n\t\t   # other-writeable bit of parent directory when it shouldn't.\n\t\t   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.\n\t\t   ls_ld_tmpdir=`ls -ld \"$tmpdir\"`\n\t\t   case $ls_ld_tmpdir in\n\t\t     d????-?r-*) different_mode=700;;\n\t\t     d????-?--*) different_mode=755;;\n\t\t     *) false;;\n\t\t   esac &&\n\t\t   $mkdirprog -m$different_mode -p -- \"$tmpdir\" && {\n\t\t     ls_ld_tmpdir_1=`ls -ld \"$tmpdir\"`\n\t\t     test \"$ls_ld_tmpdir\" = \"$ls_ld_tmpdir_1\"\n\t\t   }\n\t\t }\n\t      then posix_mkdir=:\n\t      fi\n\t      rmdir \"$tmpdir/d\" \"$tmpdir\"\n\t    else\n\t      # Remove any dirs left behind by ancient mkdir implementations.\n\t      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null\n\t    fi\n\t    trap '' 0;;\n\tesac;;\n    esac\n\n    if\n      $posix_mkdir && (\n\tumask $mkdir_umask &&\n\t$doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\"\n      )\n    then :\n    else\n\n      # The umask is ridiculous, or mkdir does not conform to POSIX,\n      # or it failed possibly due to a race condition.  Create the\n      # directory the slow way, step by step, checking for races as we go.\n\n      case $dstdir in\n\t/*) prefix='/';;\n\t-*) prefix='./';;\n\t*)  prefix='';;\n      esac\n\n      eval \"$initialize_posix_glob\"\n\n      oIFS=$IFS\n      IFS=/\n      $posix_glob set -f\n      set fnord $dstdir\n      shift\n      $posix_glob set +f\n      IFS=$oIFS\n\n      prefixes=\n\n      for d\n      do\n\ttest -z \"$d\" && continue\n\n\tprefix=$prefix$d\n\tif test -d \"$prefix\"; then\n\t  prefixes=\n\telse\n\t  if $posix_mkdir; then\n\t    (umask=$mkdir_umask &&\n\t     $doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\") && break\n\t    # Don't fail if two instances are running concurrently.\n\t    test -d \"$prefix\" || exit 1\n\t  else\n\t    case $prefix in\n\t      *\\'*) qprefix=`echo \"$prefix\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;;\n\t      *) qprefix=$prefix;;\n\t    esac\n\t    prefixes=\"$prefixes '$qprefix'\"\n\t  fi\n\tfi\n\tprefix=$prefix/\n      done\n\n      if test -n \"$prefixes\"; then\n\t# Don't fail if two instances are running concurrently.\n\t(umask $mkdir_umask &&\n\t eval \"\\$doit_exec \\$mkdirprog $prefixes\") ||\n\t  test -d \"$dstdir\" || exit 1\n\tobsolete_mkdir_used=true\n      fi\n    fi\n  fi\n\n  if test -n \"$dir_arg\"; then\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dst\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dst\"; } &&\n    { test \"$obsolete_mkdir_used$chowncmd$chgrpcmd\" = false ||\n      test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dst\"; } || exit 1\n  else\n\n    # Make a couple of temp file names in the proper directory.\n    dsttmp=$dstdir/_inst.$$_\n    rmtmp=$dstdir/_rm.$$_\n\n    # Trap to clean up those temp files at exit.\n    trap 'ret=$?; rm -f \"$dsttmp\" \"$rmtmp\" && exit $ret' 0\n\n    # Copy the file name to the temp name.\n    (umask $cp_umask && $doit_exec $cpprog \"$src\" \"$dsttmp\") &&\n\n    # and set any options; do chmod last to preserve setuid bits.\n    #\n    # If any of these fail, we abort the whole thing.  If we want to\n    # ignore errors from any of these, just make sure not to ignore\n    # errors from the above \"$doit $cpprog $src $dsttmp\" command.\n    #\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dsttmp\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dsttmp\"; } &&\n    { test -z \"$stripcmd\" || $doit $stripcmd \"$dsttmp\"; } &&\n    { test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dsttmp\"; } &&\n\n    # If -C, don't bother to copy if it wouldn't change the file.\n    if $copy_on_change &&\n       old=`LC_ALL=C ls -dlL \"$dst\"\t2>/dev/null` &&\n       new=`LC_ALL=C ls -dlL \"$dsttmp\"\t2>/dev/null` &&\n\n       eval \"$initialize_posix_glob\" &&\n       $posix_glob set -f &&\n       set X $old && old=:$2:$4:$5:$6 &&\n       set X $new && new=:$2:$4:$5:$6 &&\n       $posix_glob set +f &&\n\n       test \"$old\" = \"$new\" &&\n       $cmpprog \"$dst\" \"$dsttmp\" >/dev/null 2>&1\n    then\n      rm -f \"$dsttmp\"\n    else\n      # Rename the file to the real destination.\n      $doit $mvcmd -f \"$dsttmp\" \"$dst\" 2>/dev/null ||\n\n      # The rename failed, perhaps because mv can't rename something else\n      # to itself, or perhaps because mv is so ancient that it does not\n      # support -f.\n      {\n\t# Now remove or move aside any old file at destination location.\n\t# We try this two ways since rm can't unlink itself on some\n\t# systems and the destination file might be busy for other\n\t# reasons.  In this case, the final cleanup might fail but the new\n\t# file should still install successfully.\n\t{\n\t  test ! -f \"$dst\" ||\n\t  $doit $rmcmd -f \"$dst\" 2>/dev/null ||\n\t  { $doit $mvcmd -f \"$dst\" \"$rmtmp\" 2>/dev/null &&\n\t    { $doit $rmcmd -f \"$rmtmp\" 2>/dev/null; :; }\n\t  } ||\n\t  { echo \"$0: cannot unlink or rename $dst\" >&2\n\t    (exit 1); exit 1\n\t  }\n\t} &&\n\n\t# Now rename the file to the real destination.\n\t$doit $mvcmd \"$dsttmp\" \"$dst\"\n      }\n    fi || exit 1\n\n    trap '' 0\n  fi\ndone\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-end: \"$\"\n# End:\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/libglog.pc.in",
    "content": "prefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: libglog\nDescription: Google Log (glog) C++ logging framework\nVersion: @VERSION@\nLibs: -L${libdir} -lglog\nCflags: -I${includedir}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/ltmain.sh",
    "content": "# Generated from ltmain.m4sh.\n\n# ltmain.sh (GNU libtool) 2.2.6b\n# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc.\n# This is free software; see the source for copying conditions.  There is NO\n# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n# GNU Libtool is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html,\n# or obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\n# Usage: $progname [OPTION]... [MODE-ARG]...\n#\n# Provide generalized library-building support services.\n#\n#     --config             show all configuration variables\n#     --debug              enable verbose shell tracing\n# -n, --dry-run            display commands without modifying any files\n#     --features           display basic configuration information and exit\n#     --mode=MODE          use operation mode MODE\n#     --preserve-dup-deps  don't remove duplicate dependency libraries\n#     --quiet, --silent    don't print informational messages\n#     --tag=TAG            use configuration variables from tag TAG\n# -v, --verbose            print informational messages (default)\n#     --version            print version information\n# -h, --help               print short or long help message\n#\n# MODE must be one of the following:\n#\n#       clean              remove files from the build directory\n#       compile            compile a source file into a libtool object\n#       execute            automatically set library path, then run a program\n#       finish             complete the installation of libtool libraries\n#       install            install libraries or executables\n#       link               create a library or an executable\n#       uninstall          remove libraries from an installed directory\n#\n# MODE-ARGS vary depending on the MODE.\n# Try `$progname --help --mode=MODE' for a more detailed description of MODE.\n#\n# When reporting a bug, please describe a test case to reproduce it and\n# include the following information:\n#\n#       host-triplet:\t$host\n#       shell:\t\t$SHELL\n#       compiler:\t\t$LTCC\n#       compiler flags:\t\t$LTCFLAGS\n#       linker:\t\t$LD (gnu? $with_gnu_ld)\n#       $progname:\t\t(GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1\n#       automake:\t\t$automake_version\n#       autoconf:\t\t$autoconf_version\n#\n# Report bugs to <bug-libtool@gnu.org>.\n\nPROGRAM=ltmain.sh\nPACKAGE=libtool\nVERSION=\"2.2.6b Debian-2.2.6b-2ubuntu1\"\nTIMESTAMP=\"\"\npackage_revision=1.3017\n\n# Be Bourne compatible\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac\nfi\nBIN_SH=xpg4; export BIN_SH # for Tru64\nDUALCASE=1; export DUALCASE # for MKS sh\n\n# NLS nuisances: We save the old values to restore during execute mode.\n# Only set LANG and LC_ALL to C if already set.\n# These must not be set unconditionally because not all systems understand\n# e.g. LANG=C (notably SCO).\nlt_user_locale=\nlt_safe_locale=\nfor lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES\ndo\n  eval \"if test \\\"\\${$lt_var+set}\\\" = set; then\n          save_$lt_var=\\$$lt_var\n          $lt_var=C\n\t  export $lt_var\n\t  lt_user_locale=\\\"$lt_var=\\\\\\$save_\\$lt_var; \\$lt_user_locale\\\"\n\t  lt_safe_locale=\\\"$lt_var=C; \\$lt_safe_locale\\\"\n\tfi\"\ndone\n\n$lt_unset CDPATH\n\n\n\n\n\n: ${CP=\"cp -f\"}\n: ${ECHO=\"echo\"}\n: ${EGREP=\"/bin/grep -E\"}\n: ${FGREP=\"/bin/grep -F\"}\n: ${GREP=\"/bin/grep\"}\n: ${LN_S=\"ln -s\"}\n: ${MAKE=\"make\"}\n: ${MKDIR=\"mkdir\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n: ${SED=\"/bin/sed\"}\n: ${SHELL=\"${CONFIG_SHELL-/bin/sh}\"}\n: ${Xsed=\"$SED -e 1s/^X//\"}\n\n# Global variables:\nEXIT_SUCCESS=0\nEXIT_FAILURE=1\nEXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.\nEXIT_SKIP=77\t  # $? = 77 is used to indicate a skipped test to automake.\n\nexit_status=$EXIT_SUCCESS\n\n# Make sure IFS has a sensible default\nlt_nl='\n'\nIFS=\" \t$lt_nl\"\n\ndirname=\"s,/[^/]*$,,\"\nbasename=\"s,^.*/,,\"\n\n# func_dirname_and_basename file append nondir_replacement\n# perform func_basename and func_dirname in a single function\n# call:\n#   dirname:  Compute the dirname of FILE.  If nonempty,\n#             add APPEND to the result, otherwise set result\n#             to NONDIR_REPLACEMENT.\n#             value returned in \"$func_dirname_result\"\n#   basename: Compute filename of FILE.\n#             value retuned in \"$func_basename_result\"\n# Implementation must be kept synchronized with func_dirname\n# and func_basename. For efficiency, we do not delegate to\n# those functions but instead duplicate the functionality here.\nfunc_dirname_and_basename ()\n{\n  # Extract subdirectory from the argument.\n  func_dirname_result=`$ECHO \"X${1}\" | $Xsed -e \"$dirname\"`\n  if test \"X$func_dirname_result\" = \"X${1}\"; then\n    func_dirname_result=\"${3}\"\n  else\n    func_dirname_result=\"$func_dirname_result${2}\"\n  fi\n  func_basename_result=`$ECHO \"X${1}\" | $Xsed -e \"$basename\"`\n}\n\n# Generated shell functions inserted here.\n\n# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh\n# is ksh but when the shell is invoked as \"sh\" and the current value of\n# the _XPG environment variable is not equal to 1 (one), the special\n# positional parameter $0, within a function call, is the name of the\n# function.\nprogpath=\"$0\"\n\n# The name of this program:\n# In the unlikely event $progname began with a '-', it would play havoc with\n# func_echo (imagine progname=-n), so we prepend ./ in that case:\nfunc_dirname_and_basename \"$progpath\"\nprogname=$func_basename_result\ncase $progname in\n  -*) progname=./$progname ;;\nesac\n\n# Make sure we have an absolute path for reexecution:\ncase $progpath in\n  [\\\\/]*|[A-Za-z]:\\\\*) ;;\n  *[\\\\/]*)\n     progdir=$func_dirname_result\n     progdir=`cd \"$progdir\" && pwd`\n     progpath=\"$progdir/$progname\"\n     ;;\n  *)\n     save_IFS=\"$IFS\"\n     IFS=:\n     for progdir in $PATH; do\n       IFS=\"$save_IFS\"\n       test -x \"$progdir/$progname\" && break\n     done\n     IFS=\"$save_IFS\"\n     test -n \"$progdir\" || progdir=`pwd`\n     progpath=\"$progdir/$progname\"\n     ;;\nesac\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed=\"${SED}\"' -e 1s/^X//'\nsed_quote_subst='s/\\([`\"$\\\\]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([\"`\\\\]\\)/\\\\\\1/g'\n\n# Re-`\\' parameter expansions in output of double_quote_subst that were\n# `\\'-ed in input to the same.  If an odd number of `\\' preceded a '$'\n# in input to double_quote_subst, that '$' was protected from expansion.\n# Since each input `\\' is now two `\\'s, look for any number of runs of\n# four `\\'s followed by two `\\'s and then a '$'.  `\\' that '$'.\nbs='\\\\'\nbs2='\\\\\\\\'\nbs4='\\\\\\\\\\\\\\\\'\ndollar='\\$'\nsed_double_backslash=\"\\\n  s/$bs4/&\\\\\n/g\n  s/^$bs2$dollar/$bs&/\n  s/\\\\([^$bs]\\\\)$bs2$dollar/\\\\1$bs2$bs$dollar/g\n  s/\\n//g\"\n\n# Standard options:\nopt_dry_run=false\nopt_help=false\nopt_quiet=false\nopt_verbose=false\nopt_warning=:\n\n# func_echo arg...\n# Echo program name prefixed message, along with the current mode\n# name if it has been set yet.\nfunc_echo ()\n{\n    $ECHO \"$progname${mode+: }$mode: $*\"\n}\n\n# func_verbose arg...\n# Echo program name prefixed message in verbose mode only.\nfunc_verbose ()\n{\n    $opt_verbose && func_echo ${1+\"$@\"}\n\n    # A bug in bash halts the script if the last line of a function\n    # fails when set -e is in force, so we need another command to\n    # work around that:\n    :\n}\n\n# func_error arg...\n# Echo program name prefixed message to standard error.\nfunc_error ()\n{\n    $ECHO \"$progname${mode+: }$mode: \"${1+\"$@\"} 1>&2\n}\n\n# func_warning arg...\n# Echo program name prefixed warning message to standard error.\nfunc_warning ()\n{\n    $opt_warning && $ECHO \"$progname${mode+: }$mode: warning: \"${1+\"$@\"} 1>&2\n\n    # bash bug again:\n    :\n}\n\n# func_fatal_error arg...\n# Echo program name prefixed message to standard error, and exit.\nfunc_fatal_error ()\n{\n    func_error ${1+\"$@\"}\n    exit $EXIT_FAILURE\n}\n\n# func_fatal_help arg...\n# Echo program name prefixed message to standard error, followed by\n# a help hint, and exit.\nfunc_fatal_help ()\n{\n    func_error ${1+\"$@\"}\n    func_fatal_error \"$help\"\n}\nhelp=\"Try \\`$progname --help' for more information.\"  ## default\n\n\n# func_grep expression filename\n# Check whether EXPRESSION matches any line of FILENAME, without output.\nfunc_grep ()\n{\n    $GREP \"$1\" \"$2\" >/dev/null 2>&1\n}\n\n\n# func_mkdir_p directory-path\n# Make sure the entire path to DIRECTORY-PATH is available.\nfunc_mkdir_p ()\n{\n    my_directory_path=\"$1\"\n    my_dir_list=\n\n    if test -n \"$my_directory_path\" && test \"$opt_dry_run\" != \":\"; then\n\n      # Protect directory names starting with `-'\n      case $my_directory_path in\n        -*) my_directory_path=\"./$my_directory_path\" ;;\n      esac\n\n      # While some portion of DIR does not yet exist...\n      while test ! -d \"$my_directory_path\"; do\n        # ...make a list in topmost first order.  Use a colon delimited\n\t# list incase some portion of path contains whitespace.\n        my_dir_list=\"$my_directory_path:$my_dir_list\"\n\n        # If the last portion added has no slash in it, the list is done\n        case $my_directory_path in */*) ;; *) break ;; esac\n\n        # ...otherwise throw away the child directory and loop\n        my_directory_path=`$ECHO \"X$my_directory_path\" | $Xsed -e \"$dirname\"`\n      done\n      my_dir_list=`$ECHO \"X$my_dir_list\" | $Xsed -e 's,:*$,,'`\n\n      save_mkdir_p_IFS=\"$IFS\"; IFS=':'\n      for my_dir in $my_dir_list; do\n\tIFS=\"$save_mkdir_p_IFS\"\n        # mkdir can fail with a `File exist' error if two processes\n        # try to create one of the directories concurrently.  Don't\n        # stop in that case!\n        $MKDIR \"$my_dir\" 2>/dev/null || :\n      done\n      IFS=\"$save_mkdir_p_IFS\"\n\n      # Bail out if we (or some other process) failed to create a directory.\n      test -d \"$my_directory_path\" || \\\n        func_fatal_error \"Failed to create \\`$1'\"\n    fi\n}\n\n\n# func_mktempdir [string]\n# Make a temporary directory that won't clash with other running\n# libtool processes, and avoids race conditions if possible.  If\n# given, STRING is the basename for that directory.\nfunc_mktempdir ()\n{\n    my_template=\"${TMPDIR-/tmp}/${1-$progname}\"\n\n    if test \"$opt_dry_run\" = \":\"; then\n      # Return a directory name, but don't create it in dry-run mode\n      my_tmpdir=\"${my_template}-$$\"\n    else\n\n      # If mktemp works, use that first and foremost\n      my_tmpdir=`mktemp -d \"${my_template}-XXXXXXXX\" 2>/dev/null`\n\n      if test ! -d \"$my_tmpdir\"; then\n        # Failing that, at least try and use $RANDOM to avoid a race\n        my_tmpdir=\"${my_template}-${RANDOM-0}$$\"\n\n        save_mktempdir_umask=`umask`\n        umask 0077\n        $MKDIR \"$my_tmpdir\"\n        umask $save_mktempdir_umask\n      fi\n\n      # If we're not in dry-run mode, bomb out on failure\n      test -d \"$my_tmpdir\" || \\\n        func_fatal_error \"cannot create temporary directory \\`$my_tmpdir'\"\n    fi\n\n    $ECHO \"X$my_tmpdir\" | $Xsed\n}\n\n\n# func_quote_for_eval arg\n# Aesthetically quote ARG to be evaled later.\n# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT\n# is double-quoted, suitable for a subsequent eval, whereas\n# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters\n# which are still active within double quotes backslashified.\nfunc_quote_for_eval ()\n{\n    case $1 in\n      *[\\\\\\`\\\"\\$]*)\n\tfunc_quote_for_eval_unquoted_result=`$ECHO \"X$1\" | $Xsed -e \"$sed_quote_subst\"` ;;\n      *)\n        func_quote_for_eval_unquoted_result=\"$1\" ;;\n    esac\n\n    case $func_quote_for_eval_unquoted_result in\n      # Double-quote args containing shell metacharacters to delay\n      # word splitting, command substitution and and variable\n      # expansion for a subsequent eval.\n      # Many Bourne shells cannot handle close brackets correctly\n      # in scan sets, so we specify it separately.\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n        func_quote_for_eval_result=\"\\\"$func_quote_for_eval_unquoted_result\\\"\"\n        ;;\n      *)\n        func_quote_for_eval_result=\"$func_quote_for_eval_unquoted_result\"\n    esac\n}\n\n\n# func_quote_for_expand arg\n# Aesthetically quote ARG to be evaled later; same as above,\n# but do not quote variable references.\nfunc_quote_for_expand ()\n{\n    case $1 in\n      *[\\\\\\`\\\"]*)\n\tmy_arg=`$ECHO \"X$1\" | $Xsed \\\n\t    -e \"$double_quote_subst\" -e \"$sed_double_backslash\"` ;;\n      *)\n        my_arg=\"$1\" ;;\n    esac\n\n    case $my_arg in\n      # Double-quote args containing shell metacharacters to delay\n      # word splitting and command substitution for a subsequent eval.\n      # Many Bourne shells cannot handle close brackets correctly\n      # in scan sets, so we specify it separately.\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n        my_arg=\"\\\"$my_arg\\\"\"\n        ;;\n    esac\n\n    func_quote_for_expand_result=\"$my_arg\"\n}\n\n\n# func_show_eval cmd [fail_exp]\n# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is\n# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP\n# is given, then evaluate it.\nfunc_show_eval ()\n{\n    my_cmd=\"$1\"\n    my_fail_exp=\"${2-:}\"\n\n    ${opt_silent-false} || {\n      func_quote_for_expand \"$my_cmd\"\n      eval \"func_echo $func_quote_for_expand_result\"\n    }\n\n    if ${opt_dry_run-false}; then :; else\n      eval \"$my_cmd\"\n      my_status=$?\n      if test \"$my_status\" -eq 0; then :; else\n\teval \"(exit $my_status); $my_fail_exp\"\n      fi\n    fi\n}\n\n\n# func_show_eval_locale cmd [fail_exp]\n# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is\n# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP\n# is given, then evaluate it.  Use the saved locale for evaluation.\nfunc_show_eval_locale ()\n{\n    my_cmd=\"$1\"\n    my_fail_exp=\"${2-:}\"\n\n    ${opt_silent-false} || {\n      func_quote_for_expand \"$my_cmd\"\n      eval \"func_echo $func_quote_for_expand_result\"\n    }\n\n    if ${opt_dry_run-false}; then :; else\n      eval \"$lt_user_locale\n\t    $my_cmd\"\n      my_status=$?\n      eval \"$lt_safe_locale\"\n      if test \"$my_status\" -eq 0; then :; else\n\teval \"(exit $my_status); $my_fail_exp\"\n      fi\n    fi\n}\n\n\n\n\n\n# func_version\n# Echo version message to standard output and exit.\nfunc_version ()\n{\n    $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {\n        s/^# //\n\ts/^# *$//\n        s/\\((C)\\)[ 0-9,-]*\\( [1-9][0-9]*\\)/\\1\\2/\n        p\n     }' < \"$progpath\"\n     exit $?\n}\n\n# func_usage\n# Echo short help message to standard output and exit.\nfunc_usage ()\n{\n    $SED -n '/^# Usage:/,/# -h/ {\n        s/^# //\n\ts/^# *$//\n\ts/\\$progname/'$progname'/\n\tp\n    }' < \"$progpath\"\n    $ECHO\n    $ECHO \"run \\`$progname --help | more' for full usage\"\n    exit $?\n}\n\n# func_help\n# Echo long help message to standard output and exit.\nfunc_help ()\n{\n    $SED -n '/^# Usage:/,/# Report bugs to/ {\n        s/^# //\n\ts/^# *$//\n\ts*\\$progname*'$progname'*\n\ts*\\$host*'\"$host\"'*\n\ts*\\$SHELL*'\"$SHELL\"'*\n\ts*\\$LTCC*'\"$LTCC\"'*\n\ts*\\$LTCFLAGS*'\"$LTCFLAGS\"'*\n\ts*\\$LD*'\"$LD\"'*\n\ts/\\$with_gnu_ld/'\"$with_gnu_ld\"'/\n\ts/\\$automake_version/'\"`(automake --version) 2>/dev/null |$SED 1q`\"'/\n\ts/\\$autoconf_version/'\"`(autoconf --version) 2>/dev/null |$SED 1q`\"'/\n\tp\n     }' < \"$progpath\"\n    exit $?\n}\n\n# func_missing_arg argname\n# Echo program name prefixed message to standard error and set global\n# exit_cmd.\nfunc_missing_arg ()\n{\n    func_error \"missing argument for $1\"\n    exit_cmd=exit\n}\n\nexit_cmd=:\n\n\n\n\n\n# Check that we have a working $ECHO.\nif test \"X$1\" = X--no-reexec; then\n  # Discard the --no-reexec flag, and continue.\n  shift\nelif test \"X$1\" = X--fallback-echo; then\n  # Avoid inline document here, it may be left over\n  :\nelif test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t'; then\n  # Yippee, $ECHO works!\n  :\nelse\n  # Restart under the correct shell, and then maybe $ECHO will work.\n  exec $SHELL \"$progpath\" --no-reexec ${1+\"$@\"}\nfi\n\nif test \"X$1\" = X--fallback-echo; then\n  # used as fallback echo\n  shift\n  cat <<EOF\n$*\nEOF\n  exit $EXIT_SUCCESS\nfi\n\nmagic=\"%%%MAGIC variable%%%\"\nmagic_exe=\"%%%MAGIC EXE variable%%%\"\n\n# Global variables.\n# $mode is unset\nnonopt=\nexecute_dlfiles=\npreserve_args=\nlo2o=\"s/\\\\.lo\\$/.${objext}/\"\no2lo=\"s/\\\\.${objext}\\$/.lo/\"\nextracted_archives=\nextracted_serial=0\n\nopt_dry_run=false\nopt_duplicate_deps=false\nopt_silent=false\nopt_debug=:\n\n# If this variable is set in any of the actions, the command in it\n# will be execed at the end.  This prevents here-documents from being\n# left over by shells.\nexec_cmd=\n\n# func_fatal_configuration arg...\n# Echo program name prefixed message to standard error, followed by\n# a configuration failure hint, and exit.\nfunc_fatal_configuration ()\n{\n    func_error ${1+\"$@\"}\n    func_error \"See the $PACKAGE documentation for more information.\"\n    func_fatal_error \"Fatal configuration error.\"\n}\n\n\n# func_config\n# Display the configuration for all the tags in this script.\nfunc_config ()\n{\n    re_begincf='^# ### BEGIN LIBTOOL'\n    re_endcf='^# ### END LIBTOOL'\n\n    # Default configuration.\n    $SED \"1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\\$d\" < \"$progpath\"\n\n    # Now print the configurations for the tags.\n    for tagname in $taglist; do\n      $SED -n \"/$re_begincf TAG CONFIG: $tagname\\$/,/$re_endcf TAG CONFIG: $tagname\\$/p\" < \"$progpath\"\n    done\n\n    exit $?\n}\n\n# func_features\n# Display the features supported by this script.\nfunc_features ()\n{\n    $ECHO \"host: $host\"\n    if test \"$build_libtool_libs\" = yes; then\n      $ECHO \"enable shared libraries\"\n    else\n      $ECHO \"disable shared libraries\"\n    fi\n    if test \"$build_old_libs\" = yes; then\n      $ECHO \"enable static libraries\"\n    else\n      $ECHO \"disable static libraries\"\n    fi\n\n    exit $?\n}\n\n# func_enable_tag tagname\n# Verify that TAGNAME is valid, and either flag an error and exit, or\n# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist\n# variable here.\nfunc_enable_tag ()\n{\n  # Global variable:\n  tagname=\"$1\"\n\n  re_begincf=\"^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\\$\"\n  re_endcf=\"^# ### END LIBTOOL TAG CONFIG: $tagname\\$\"\n  sed_extractcf=\"/$re_begincf/,/$re_endcf/p\"\n\n  # Validate tagname.\n  case $tagname in\n    *[!-_A-Za-z0-9,/]*)\n      func_fatal_error \"invalid tag name: $tagname\"\n      ;;\n  esac\n\n  # Don't test for the \"default\" C tag, as we know it's\n  # there but not specially marked.\n  case $tagname in\n    CC) ;;\n    *)\n      if $GREP \"$re_begincf\" \"$progpath\" >/dev/null 2>&1; then\n\ttaglist=\"$taglist $tagname\"\n\n\t# Evaluate the configuration.  Be careful to quote the path\n\t# and the sed script, to avoid splitting on whitespace, but\n\t# also don't use non-portable quotes within backquotes within\n\t# quotes we have to do it in 2 steps:\n\textractedcf=`$SED -n -e \"$sed_extractcf\" < \"$progpath\"`\n\teval \"$extractedcf\"\n      else\n\tfunc_error \"ignoring unknown tag $tagname\"\n      fi\n      ;;\n  esac\n}\n\n# Parse options once, thoroughly.  This comes as soon as possible in\n# the script to make things like `libtool --version' happen quickly.\n{\n\n  # Shorthand for --mode=foo, only valid as the first argument\n  case $1 in\n  clean|clea|cle|cl)\n    shift; set dummy --mode clean ${1+\"$@\"}; shift\n    ;;\n  compile|compil|compi|comp|com|co|c)\n    shift; set dummy --mode compile ${1+\"$@\"}; shift\n    ;;\n  execute|execut|execu|exec|exe|ex|e)\n    shift; set dummy --mode execute ${1+\"$@\"}; shift\n    ;;\n  finish|finis|fini|fin|fi|f)\n    shift; set dummy --mode finish ${1+\"$@\"}; shift\n    ;;\n  install|instal|insta|inst|ins|in|i)\n    shift; set dummy --mode install ${1+\"$@\"}; shift\n    ;;\n  link|lin|li|l)\n    shift; set dummy --mode link ${1+\"$@\"}; shift\n    ;;\n  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)\n    shift; set dummy --mode uninstall ${1+\"$@\"}; shift\n    ;;\n  esac\n\n  # Parse non-mode specific arguments:\n  while test \"$#\" -gt 0; do\n    opt=\"$1\"\n    shift\n\n    case $opt in\n      --config)\t\tfunc_config\t\t\t\t\t;;\n\n      --debug)\t\tpreserve_args=\"$preserve_args $opt\"\n\t\t\tfunc_echo \"enabling shell trace mode\"\n\t\t\topt_debug='set -x'\n\t\t\t$opt_debug\n\t\t\t;;\n\n      -dlopen)\t\ttest \"$#\" -eq 0 && func_missing_arg \"$opt\" && break\n\t\t\texecute_dlfiles=\"$execute_dlfiles $1\"\n\t\t\tshift\n\t\t\t;;\n\n      --dry-run | -n)\topt_dry_run=:\t\t\t\t\t;;\n      --features)       func_features\t\t\t\t\t;;\n      --finish)\t\tmode=\"finish\"\t\t\t\t\t;;\n\n      --mode)\t\ttest \"$#\" -eq 0 && func_missing_arg \"$opt\" && break\n\t\t\tcase $1 in\n\t\t\t  # Valid mode arguments:\n\t\t\t  clean)\t;;\n\t\t\t  compile)\t;;\n\t\t\t  execute)\t;;\n\t\t\t  finish)\t;;\n\t\t\t  install)\t;;\n\t\t\t  link)\t\t;;\n\t\t\t  relink)\t;;\n\t\t\t  uninstall)\t;;\n\n\t\t\t  # Catch anything else as an error\n\t\t\t  *) func_error \"invalid argument for $opt\"\n\t\t\t     exit_cmd=exit\n\t\t\t     break\n\t\t\t     ;;\n\t\t        esac\n\n\t\t\tmode=\"$1\"\n\t\t\tshift\n\t\t\t;;\n\n      --preserve-dup-deps)\n\t\t\topt_duplicate_deps=:\t\t\t\t;;\n\n      --quiet|--silent)\tpreserve_args=\"$preserve_args $opt\"\n\t\t\topt_silent=:\n\t\t\t;;\n\n      --verbose| -v)\tpreserve_args=\"$preserve_args $opt\"\n\t\t\topt_silent=false\n\t\t\t;;\n\n      --tag)\t\ttest \"$#\" -eq 0 && func_missing_arg \"$opt\" && break\n\t\t\tpreserve_args=\"$preserve_args $opt $1\"\n\t\t\tfunc_enable_tag \"$1\"\t# tagname is set here\n\t\t\tshift\n\t\t\t;;\n\n      # Separate optargs to long options:\n      -dlopen=*|--mode=*|--tag=*)\n\t\t\tfunc_opt_split \"$opt\"\n\t\t\tset dummy \"$func_opt_split_opt\" \"$func_opt_split_arg\" ${1+\"$@\"}\n\t\t\tshift\n\t\t\t;;\n\n      -\\?|-h)\t\tfunc_usage\t\t\t\t\t;;\n      --help)\t\topt_help=:\t\t\t\t\t;;\n      --version)\tfunc_version\t\t\t\t\t;;\n\n      -*)\t\tfunc_fatal_help \"unrecognized option \\`$opt'\"\t;;\n\n      *)\t\tnonopt=\"$opt\"\n\t\t\tbreak\n\t\t\t;;\n    esac\n  done\n\n\n  case $host in\n    *cygwin* | *mingw* | *pw32* | *cegcc*)\n      # don't eliminate duplications in $postdeps and $predeps\n      opt_duplicate_compiler_generated_deps=:\n      ;;\n    *)\n      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps\n      ;;\n  esac\n\n  # Having warned about all mis-specified options, bail out if\n  # anything was wrong.\n  $exit_cmd $EXIT_FAILURE\n}\n\n# func_check_version_match\n# Ensure that we are using m4 macros, and libtool script from the same\n# release of libtool.\nfunc_check_version_match ()\n{\n  if test \"$package_revision\" != \"$macro_revision\"; then\n    if test \"$VERSION\" != \"$macro_version\"; then\n      if test -z \"$macro_version\"; then\n        cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the\n$progname: definition of this LT_INIT comes from an older release.\n$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION\n$progname: and run autoconf again.\n_LT_EOF\n      else\n        cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the\n$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.\n$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION\n$progname: and run autoconf again.\n_LT_EOF\n      fi\n    else\n      cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,\n$progname: but the definition of this LT_INIT comes from revision $macro_revision.\n$progname: You should recreate aclocal.m4 with macros from revision $package_revision\n$progname: of $PACKAGE $VERSION and run autoconf again.\n_LT_EOF\n    fi\n\n    exit $EXIT_MISMATCH\n  fi\n}\n\n\n## ----------- ##\n##    Main.    ##\n## ----------- ##\n\n$opt_help || {\n  # Sanity checks first:\n  func_check_version_match\n\n  if test \"$build_libtool_libs\" != yes && test \"$build_old_libs\" != yes; then\n    func_fatal_configuration \"not configured to build any kind of library\"\n  fi\n\n  test -z \"$mode\" && func_fatal_error \"error: you must specify a MODE.\"\n\n\n  # Darwin sucks\n  eval std_shrext=\\\"$shrext_cmds\\\"\n\n\n  # Only execute mode is allowed to have -dlopen flags.\n  if test -n \"$execute_dlfiles\" && test \"$mode\" != execute; then\n    func_error \"unrecognized option \\`-dlopen'\"\n    $ECHO \"$help\" 1>&2\n    exit $EXIT_FAILURE\n  fi\n\n  # Change the help message to a mode-specific one.\n  generic_help=\"$help\"\n  help=\"Try \\`$progname --help --mode=$mode' for more information.\"\n}\n\n\n# func_lalib_p file\n# True iff FILE is a libtool `.la' library or `.lo' object file.\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_lalib_p ()\n{\n    test -f \"$1\" &&\n      $SED -e 4q \"$1\" 2>/dev/null \\\n        | $GREP \"^# Generated by .*$PACKAGE\" > /dev/null 2>&1\n}\n\n# func_lalib_unsafe_p file\n# True iff FILE is a libtool `.la' library or `.lo' object file.\n# This function implements the same check as func_lalib_p without\n# resorting to external programs.  To this end, it redirects stdin and\n# closes it afterwards, without saving the original file descriptor.\n# As a safety measure, use it only where a negative result would be\n# fatal anyway.  Works if `file' does not exist.\nfunc_lalib_unsafe_p ()\n{\n    lalib_p=no\n    if test -f \"$1\" && test -r \"$1\" && exec 5<&0 <\"$1\"; then\n\tfor lalib_p_l in 1 2 3 4\n\tdo\n\t    read lalib_p_line\n\t    case \"$lalib_p_line\" in\n\t\t\\#\\ Generated\\ by\\ *$PACKAGE* ) lalib_p=yes; break;;\n\t    esac\n\tdone\n\texec 0<&5 5<&-\n    fi\n    test \"$lalib_p\" = yes\n}\n\n# func_ltwrapper_script_p file\n# True iff FILE is a libtool wrapper script\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_script_p ()\n{\n    func_lalib_p \"$1\"\n}\n\n# func_ltwrapper_executable_p file\n# True iff FILE is a libtool wrapper executable\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_executable_p ()\n{\n    func_ltwrapper_exec_suffix=\n    case $1 in\n    *.exe) ;;\n    *) func_ltwrapper_exec_suffix=.exe ;;\n    esac\n    $GREP \"$magic_exe\" \"$1$func_ltwrapper_exec_suffix\" >/dev/null 2>&1\n}\n\n# func_ltwrapper_scriptname file\n# Assumes file is an ltwrapper_executable\n# uses $file to determine the appropriate filename for a\n# temporary ltwrapper_script.\nfunc_ltwrapper_scriptname ()\n{\n    func_ltwrapper_scriptname_result=\"\"\n    if func_ltwrapper_executable_p \"$1\"; then\n\tfunc_dirname_and_basename \"$1\" \"\" \".\"\n\tfunc_stripname '' '.exe' \"$func_basename_result\"\n\tfunc_ltwrapper_scriptname_result=\"$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper\"\n    fi\n}\n\n# func_ltwrapper_p file\n# True iff FILE is a libtool wrapper script or wrapper executable\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_p ()\n{\n    func_ltwrapper_script_p \"$1\" || func_ltwrapper_executable_p \"$1\"\n}\n\n\n# func_execute_cmds commands fail_cmd\n# Execute tilde-delimited COMMANDS.\n# If FAIL_CMD is given, eval that upon failure.\n# FAIL_CMD may read-access the current command in variable CMD!\nfunc_execute_cmds ()\n{\n    $opt_debug\n    save_ifs=$IFS; IFS='~'\n    for cmd in $1; do\n      IFS=$save_ifs\n      eval cmd=\\\"$cmd\\\"\n      func_show_eval \"$cmd\" \"${2-:}\"\n    done\n    IFS=$save_ifs\n}\n\n\n# func_source file\n# Source FILE, adding directory component if necessary.\n# Note that it is not necessary on cygwin/mingw to append a dot to\n# FILE even if both FILE and FILE.exe exist: automatic-append-.exe\n# behavior happens only for exec(3), not for open(2)!  Also, sourcing\n# `FILE.' does not work on cygwin managed mounts.\nfunc_source ()\n{\n    $opt_debug\n    case $1 in\n    */* | *\\\\*)\t. \"$1\" ;;\n    *)\t\t. \"./$1\" ;;\n    esac\n}\n\n\n# func_infer_tag arg\n# Infer tagged configuration to use if any are available and\n# if one wasn't chosen via the \"--tag\" command line option.\n# Only attempt this if the compiler in the base compile\n# command doesn't match the default compiler.\n# arg is usually of the form 'gcc ...'\nfunc_infer_tag ()\n{\n    $opt_debug\n    if test -n \"$available_tags\" && test -z \"$tagname\"; then\n      CC_quoted=\n      for arg in $CC; do\n        func_quote_for_eval \"$arg\"\n\tCC_quoted=\"$CC_quoted $func_quote_for_eval_result\"\n      done\n      case $@ in\n      # Blanks in the command may have been stripped by the calling shell,\n      # but not from the CC environment variable when configure was run.\n      \" $CC \"* | \"$CC \"* | \" `$ECHO $CC` \"* | \"`$ECHO $CC` \"* | \" $CC_quoted\"* | \"$CC_quoted \"* | \" `$ECHO $CC_quoted` \"* | \"`$ECHO $CC_quoted` \"*) ;;\n      # Blanks at the start of $base_compile will cause this to fail\n      # if we don't check for them as well.\n      *)\n\tfor z in $available_tags; do\n\t  if $GREP \"^# ### BEGIN LIBTOOL TAG CONFIG: $z$\" < \"$progpath\" > /dev/null; then\n\t    # Evaluate the configuration.\n\t    eval \"`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`\"\n\t    CC_quoted=\n\t    for arg in $CC; do\n\t      # Double-quote args containing other shell metacharacters.\n\t      func_quote_for_eval \"$arg\"\n\t      CC_quoted=\"$CC_quoted $func_quote_for_eval_result\"\n\t    done\n\t    case \"$@ \" in\n\t      \" $CC \"* | \"$CC \"* | \" `$ECHO $CC` \"* | \"`$ECHO $CC` \"* | \" $CC_quoted\"* | \"$CC_quoted \"* | \" `$ECHO $CC_quoted` \"* | \"`$ECHO $CC_quoted` \"*)\n\t      # The compiler in the base compile command matches\n\t      # the one in the tagged configuration.\n\t      # Assume this is the tagged configuration we want.\n\t      tagname=$z\n\t      break\n\t      ;;\n\t    esac\n\t  fi\n\tdone\n\t# If $tagname still isn't set, then no tagged configuration\n\t# was found and let the user know that the \"--tag\" command\n\t# line option must be used.\n\tif test -z \"$tagname\"; then\n\t  func_echo \"unable to infer tagged configuration\"\n\t  func_fatal_error \"specify a tag with \\`--tag'\"\n#\telse\n#\t  func_verbose \"using $tagname tagged configuration\"\n\tfi\n\t;;\n      esac\n    fi\n}\n\n\n\n# func_write_libtool_object output_name pic_name nonpic_name\n# Create a libtool object file (analogous to a \".la\" file),\n# but don't create it if we're doing a dry run.\nfunc_write_libtool_object ()\n{\n    write_libobj=${1}\n    if test \"$build_libtool_libs\" = yes; then\n      write_lobj=\\'${2}\\'\n    else\n      write_lobj=none\n    fi\n\n    if test \"$build_old_libs\" = yes; then\n      write_oldobj=\\'${3}\\'\n    else\n      write_oldobj=none\n    fi\n\n    $opt_dry_run || {\n      cat >${write_libobj}T <<EOF\n# $write_libobj - a libtool object file\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# Name of the PIC object.\npic_object=$write_lobj\n\n# Name of the non-PIC object\nnon_pic_object=$write_oldobj\n\nEOF\n      $MV \"${write_libobj}T\" \"${write_libobj}\"\n    }\n}\n\n# func_mode_compile arg...\nfunc_mode_compile ()\n{\n    $opt_debug\n    # Get the compilation command and the source file.\n    base_compile=\n    srcfile=\"$nonopt\"  #  always keep a non-empty value in \"srcfile\"\n    suppress_opt=yes\n    suppress_output=\n    arg_mode=normal\n    libobj=\n    later=\n    pie_flag=\n\n    for arg\n    do\n      case $arg_mode in\n      arg  )\n\t# do not \"continue\".  Instead, add this to base_compile\n\tlastarg=\"$arg\"\n\targ_mode=normal\n\t;;\n\n      target )\n\tlibobj=\"$arg\"\n\targ_mode=normal\n\tcontinue\n\t;;\n\n      normal )\n\t# Accept any command-line options.\n\tcase $arg in\n\t-o)\n\t  test -n \"$libobj\" && \\\n\t    func_fatal_error \"you cannot specify \\`-o' more than once\"\n\t  arg_mode=target\n\t  continue\n\t  ;;\n\n\t-pie | -fpie | -fPIE)\n          pie_flag=\"$pie_flag $arg\"\n\t  continue\n\t  ;;\n\n\t-shared | -static | -prefer-pic | -prefer-non-pic)\n\t  later=\"$later $arg\"\n\t  continue\n\t  ;;\n\n\t-no-suppress)\n\t  suppress_opt=no\n\t  continue\n\t  ;;\n\n\t-Xcompiler)\n\t  arg_mode=arg  #  the next one goes into the \"base_compile\" arg list\n\t  continue      #  The current \"srcfile\" will either be retained or\n\t  ;;            #  replaced later.  I would guess that would be a bug.\n\n\t-Wc,*)\n\t  func_stripname '-Wc,' '' \"$arg\"\n\t  args=$func_stripname_result\n\t  lastarg=\n\t  save_ifs=\"$IFS\"; IFS=','\n\t  for arg in $args; do\n\t    IFS=\"$save_ifs\"\n\t    func_quote_for_eval \"$arg\"\n\t    lastarg=\"$lastarg $func_quote_for_eval_result\"\n\t  done\n\t  IFS=\"$save_ifs\"\n\t  func_stripname ' ' '' \"$lastarg\"\n\t  lastarg=$func_stripname_result\n\n\t  # Add the arguments to base_compile.\n\t  base_compile=\"$base_compile $lastarg\"\n\t  continue\n\t  ;;\n\n\t*)\n\t  # Accept the current argument as the source file.\n\t  # The previous \"srcfile\" becomes the current argument.\n\t  #\n\t  lastarg=\"$srcfile\"\n\t  srcfile=\"$arg\"\n\t  ;;\n\tesac  #  case $arg\n\t;;\n      esac    #  case $arg_mode\n\n      # Aesthetically quote the previous argument.\n      func_quote_for_eval \"$lastarg\"\n      base_compile=\"$base_compile $func_quote_for_eval_result\"\n    done # for arg\n\n    case $arg_mode in\n    arg)\n      func_fatal_error \"you must specify an argument for -Xcompile\"\n      ;;\n    target)\n      func_fatal_error \"you must specify a target with \\`-o'\"\n      ;;\n    *)\n      # Get the name of the library object.\n      test -z \"$libobj\" && {\n\tfunc_basename \"$srcfile\"\n\tlibobj=\"$func_basename_result\"\n      }\n      ;;\n    esac\n\n    # Recognize several different file suffixes.\n    # If the user specifies -o file.o, it is replaced with file.lo\n    case $libobj in\n    *.[cCFSifmso] | \\\n    *.ada | *.adb | *.ads | *.asm | \\\n    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \\\n    *.[fF][09]? | *.for | *.java | *.obj | *.sx)\n      func_xform \"$libobj\"\n      libobj=$func_xform_result\n      ;;\n    esac\n\n    case $libobj in\n    *.lo) func_lo2o \"$libobj\"; obj=$func_lo2o_result ;;\n    *)\n      func_fatal_error \"cannot determine name of library object from \\`$libobj'\"\n      ;;\n    esac\n\n    func_infer_tag $base_compile\n\n    for arg in $later; do\n      case $arg in\n      -shared)\n\ttest \"$build_libtool_libs\" != yes && \\\n\t  func_fatal_configuration \"can not build a shared library\"\n\tbuild_old_libs=no\n\tcontinue\n\t;;\n\n      -static)\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tcontinue\n\t;;\n\n      -prefer-pic)\n\tpic_mode=yes\n\tcontinue\n\t;;\n\n      -prefer-non-pic)\n\tpic_mode=no\n\tcontinue\n\t;;\n      esac\n    done\n\n    func_quote_for_eval \"$libobj\"\n    test \"X$libobj\" != \"X$func_quote_for_eval_result\" \\\n      && $ECHO \"X$libobj\" | $GREP '[]~#^*{};<>?\"'\"'\"'\t &()|`$[]' \\\n      && func_warning \"libobj name \\`$libobj' may not contain shell special characters.\"\n    func_dirname_and_basename \"$obj\" \"/\" \"\"\n    objname=\"$func_basename_result\"\n    xdir=\"$func_dirname_result\"\n    lobj=${xdir}$objdir/$objname\n\n    test -z \"$base_compile\" && \\\n      func_fatal_help \"you must specify a compilation command\"\n\n    # Delete any leftover library objects.\n    if test \"$build_old_libs\" = yes; then\n      removelist=\"$obj $lobj $libobj ${libobj}T\"\n    else\n      removelist=\"$lobj $libobj ${libobj}T\"\n    fi\n\n    # On Cygwin there's no \"real\" PIC flag so we must build both object types\n    case $host_os in\n    cygwin* | mingw* | pw32* | os2* | cegcc*)\n      pic_mode=default\n      ;;\n    esac\n    if test \"$pic_mode\" = no && test \"$deplibs_check_method\" != pass_all; then\n      # non-PIC code in shared libraries is not supported\n      pic_mode=default\n    fi\n\n    # Calculate the filename of the output object if compiler does\n    # not support -o with -c\n    if test \"$compiler_c_o\" = no; then\n      output_obj=`$ECHO \"X$srcfile\" | $Xsed -e 's%^.*/%%' -e 's%\\.[^.]*$%%'`.${objext}\n      lockfile=\"$output_obj.lock\"\n    else\n      output_obj=\n      need_locks=no\n      lockfile=\n    fi\n\n    # Lock this critical section if it is needed\n    # We use this script file to make the link, it avoids creating a new file\n    if test \"$need_locks\" = yes; then\n      until $opt_dry_run || ln \"$progpath\" \"$lockfile\" 2>/dev/null; do\n\tfunc_echo \"Waiting for $lockfile to be removed\"\n\tsleep 2\n      done\n    elif test \"$need_locks\" = warn; then\n      if test -f \"$lockfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile exists and contains:\n`cat $lockfile 2>/dev/null`\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n      removelist=\"$removelist $output_obj\"\n      $ECHO \"$srcfile\" > \"$lockfile\"\n    fi\n\n    $opt_dry_run || $RM $removelist\n    removelist=\"$removelist $lockfile\"\n    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15\n\n    if test -n \"$fix_srcfile_path\"; then\n      eval srcfile=\\\"$fix_srcfile_path\\\"\n    fi\n    func_quote_for_eval \"$srcfile\"\n    qsrcfile=$func_quote_for_eval_result\n\n    # Only build a PIC object if we are building libtool libraries.\n    if test \"$build_libtool_libs\" = yes; then\n      # Without this assignment, base_compile gets emptied.\n      fbsd_hideous_sh_bug=$base_compile\n\n      if test \"$pic_mode\" != no; then\n\tcommand=\"$base_compile $qsrcfile $pic_flag\"\n      else\n\t# Don't build PIC code\n\tcommand=\"$base_compile $qsrcfile\"\n      fi\n\n      func_mkdir_p \"$xdir$objdir\"\n\n      if test -z \"$output_obj\"; then\n\t# Place PIC objects in $objdir\n\tcommand=\"$command -o $lobj\"\n      fi\n\n      func_show_eval_locale \"$command\"\t\\\n          'test -n \"$output_obj\" && $RM $removelist; exit $EXIT_FAILURE'\n\n      if test \"$need_locks\" = warn &&\n\t test \"X`cat $lockfile 2>/dev/null`\" != \"X$srcfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n\n      # Just move the object if needed, then go on to compile the next one\n      if test -n \"$output_obj\" && test \"X$output_obj\" != \"X$lobj\"; then\n\tfunc_show_eval '$MV \"$output_obj\" \"$lobj\"' \\\n\t  'error=$?; $opt_dry_run || $RM $removelist; exit $error'\n      fi\n\n      # Allow error messages only from the first compilation.\n      if test \"$suppress_opt\" = yes; then\n\tsuppress_output=' >/dev/null 2>&1'\n      fi\n    fi\n\n    # Only build a position-dependent object if we build old libraries.\n    if test \"$build_old_libs\" = yes; then\n      if test \"$pic_mode\" != yes; then\n\t# Don't build PIC code\n\tcommand=\"$base_compile $qsrcfile$pie_flag\"\n      else\n\tcommand=\"$base_compile $qsrcfile $pic_flag\"\n      fi\n      if test \"$compiler_c_o\" = yes; then\n\tcommand=\"$command -o $obj\"\n      fi\n\n      # Suppress compiler output if we already did a PIC compilation.\n      command=\"$command$suppress_output\"\n      func_show_eval_locale \"$command\" \\\n        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'\n\n      if test \"$need_locks\" = warn &&\n\t test \"X`cat $lockfile 2>/dev/null`\" != \"X$srcfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n\n      # Just move the object if needed\n      if test -n \"$output_obj\" && test \"X$output_obj\" != \"X$obj\"; then\n\tfunc_show_eval '$MV \"$output_obj\" \"$obj\"' \\\n\t  'error=$?; $opt_dry_run || $RM $removelist; exit $error'\n      fi\n    fi\n\n    $opt_dry_run || {\n      func_write_libtool_object \"$libobj\" \"$objdir/$objname\" \"$objname\"\n\n      # Unlock the critical section if it was locked\n      if test \"$need_locks\" != no; then\n\tremovelist=$lockfile\n        $RM \"$lockfile\"\n      fi\n    }\n\n    exit $EXIT_SUCCESS\n}\n\n$opt_help || {\ntest \"$mode\" = compile && func_mode_compile ${1+\"$@\"}\n}\n\nfunc_mode_help ()\n{\n    # We need to display help for each of the modes.\n    case $mode in\n      \"\")\n        # Generic help is extracted from the usage comments\n        # at the start of this file.\n        func_help\n        ;;\n\n      clean)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...\n\nRemove files from the build directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, object or program, all the files associated\nwith it are deleted. Otherwise, only FILE itself is deleted using RM.\"\n        ;;\n\n      compile)\n      $ECHO \\\n\"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE\n\nCompile a source file into a libtool library object.\n\nThis mode accepts the following additional options:\n\n  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE\n  -no-suppress      do not suppress compiler output for multiple passes\n  -prefer-pic       try to building PIC objects only\n  -prefer-non-pic   try to building non-PIC objects only\n  -shared           do not build a \\`.o' file suitable for static linking\n  -static           only build a \\`.o' file suitable for static linking\n\nCOMPILE-COMMAND is a command to be used in creating a \\`standard' object file\nfrom the given SOURCEFILE.\n\nThe output file name is determined by removing the directory component from\nSOURCEFILE, then substituting the C source code suffix \\`.c' with the\nlibrary object suffix, \\`.lo'.\"\n        ;;\n\n      execute)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...\n\nAutomatically set library path, then run a program.\n\nThis mode accepts the following additional options:\n\n  -dlopen FILE      add the directory containing FILE to the library path\n\nThis mode sets the library path environment variable according to \\`-dlopen'\nflags.\n\nIf any of the ARGS are libtool executable wrappers, then they are translated\ninto their corresponding uninstalled binary, and any of their required library\ndirectories are added to the library path.\n\nThen, COMMAND is executed, with ARGS as arguments.\"\n        ;;\n\n      finish)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...\n\nComplete the installation of libtool libraries.\n\nEach LIBDIR is a directory that contains libtool libraries.\n\nThe commands that this mode executes may require superuser privileges.  Use\nthe \\`--dry-run' option if you just want to see what would be executed.\"\n        ;;\n\n      install)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...\n\nInstall executables or libraries.\n\nINSTALL-COMMAND is the installation command.  The first component should be\neither the \\`install' or \\`cp' program.\n\nThe following components of INSTALL-COMMAND are treated specially:\n\n  -inst-prefix PREFIX-DIR  Use PREFIX-DIR as a staging area for installation\n\nThe rest of the components are interpreted as arguments to that command (only\nBSD-compatible install options are recognized).\"\n        ;;\n\n      link)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...\n\nLink object files or libraries together to form another library, or to\ncreate an executable program.\n\nLINK-COMMAND is a command using the C compiler that you would use to create\na program from several object files.\n\nThe following components of LINK-COMMAND are treated specially:\n\n  -all-static       do not do any dynamic linking at all\n  -avoid-version    do not add a version suffix if possible\n  -dlopen FILE      \\`-dlpreopen' FILE if it cannot be dlopened at runtime\n  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols\n  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)\n  -export-symbols SYMFILE\n                    try to export only the symbols listed in SYMFILE\n  -export-symbols-regex REGEX\n                    try to export only the symbols matching REGEX\n  -LLIBDIR          search LIBDIR for required installed libraries\n  -lNAME            OUTPUT-FILE requires the installed library libNAME\n  -module           build a library that can dlopened\n  -no-fast-install  disable the fast-install mode\n  -no-install       link a not-installable executable\n  -no-undefined     declare that a library does not refer to external symbols\n  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects\n  -objectlist FILE  Use a list of object files found in FILE to specify objects\n  -precious-files-regex REGEX\n                    don't remove output files matching REGEX\n  -release RELEASE  specify package release information\n  -rpath LIBDIR     the created library will eventually be installed in LIBDIR\n  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries\n  -shared           only do dynamic linking of libtool libraries\n  -shrext SUFFIX    override the standard shared library file extension\n  -static           do not do any dynamic linking of uninstalled libtool libraries\n  -static-libtool-libs\n                    do not do any dynamic linking of libtool libraries\n  -version-info CURRENT[:REVISION[:AGE]]\n                    specify library version info [each variable defaults to 0]\n  -weak LIBNAME     declare that the target provides the LIBNAME interface\n\nAll other options (arguments beginning with \\`-') are ignored.\n\nEvery other argument is treated as a filename.  Files ending in \\`.la' are\ntreated as uninstalled libtool libraries, other files are standard or library\nobject files.\n\nIf the OUTPUT-FILE ends in \\`.la', then a libtool library is created,\nonly library objects (\\`.lo' files) may be specified, and \\`-rpath' is\nrequired, except when creating a convenience library.\n\nIf OUTPUT-FILE ends in \\`.a' or \\`.lib', then a standard library is created\nusing \\`ar' and \\`ranlib', or on Windows using \\`lib'.\n\nIf OUTPUT-FILE ends in \\`.lo' or \\`.${objext}', then a reloadable object file\nis created, otherwise an executable program is created.\"\n        ;;\n\n      uninstall)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...\n\nRemove libraries from an installation directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, all the files associated with it are deleted.\nOtherwise, only FILE itself is deleted using RM.\"\n        ;;\n\n      *)\n        func_fatal_help \"invalid operation mode \\`$mode'\"\n        ;;\n    esac\n\n    $ECHO\n    $ECHO \"Try \\`$progname --help' for more information about other modes.\"\n\n    exit $?\n}\n\n  # Now that we've collected a possible --mode arg, show help if necessary\n  $opt_help && func_mode_help\n\n\n# func_mode_execute arg...\nfunc_mode_execute ()\n{\n    $opt_debug\n    # The first argument is the command name.\n    cmd=\"$nonopt\"\n    test -z \"$cmd\" && \\\n      func_fatal_help \"you must specify a COMMAND\"\n\n    # Handle -dlopen flags immediately.\n    for file in $execute_dlfiles; do\n      test -f \"$file\" \\\n\t|| func_fatal_help \"\\`$file' is not a file\"\n\n      dir=\n      case $file in\n      *.la)\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$file\" \\\n\t  || func_fatal_help \"\\`$lib' is not a valid libtool archive\"\n\n\t# Read the libtool library.\n\tdlname=\n\tlibrary_names=\n\tfunc_source \"$file\"\n\n\t# Skip this library if it cannot be dlopened.\n\tif test -z \"$dlname\"; then\n\t  # Warn if it was a shared library.\n\t  test -n \"$library_names\" && \\\n\t    func_warning \"\\`$file' was not linked with \\`-export-dynamic'\"\n\t  continue\n\tfi\n\n\tfunc_dirname \"$file\" \"\" \".\"\n\tdir=\"$func_dirname_result\"\n\n\tif test -f \"$dir/$objdir/$dlname\"; then\n\t  dir=\"$dir/$objdir\"\n\telse\n\t  if test ! -f \"$dir/$dlname\"; then\n\t    func_fatal_error \"cannot find \\`$dlname' in \\`$dir' or \\`$dir/$objdir'\"\n\t  fi\n\tfi\n\t;;\n\n      *.lo)\n\t# Just add the directory containing the .lo file.\n\tfunc_dirname \"$file\" \"\" \".\"\n\tdir=\"$func_dirname_result\"\n\t;;\n\n      *)\n\tfunc_warning \"\\`-dlopen' is ignored for non-libtool libraries and objects\"\n\tcontinue\n\t;;\n      esac\n\n      # Get the absolute pathname.\n      absdir=`cd \"$dir\" && pwd`\n      test -n \"$absdir\" && dir=\"$absdir\"\n\n      # Now add the directory to shlibpath_var.\n      if eval \"test -z \\\"\\$$shlibpath_var\\\"\"; then\n\teval \"$shlibpath_var=\\\"\\$dir\\\"\"\n      else\n\teval \"$shlibpath_var=\\\"\\$dir:\\$$shlibpath_var\\\"\"\n      fi\n    done\n\n    # This variable tells wrapper scripts just to set shlibpath_var\n    # rather than running their programs.\n    libtool_execute_magic=\"$magic\"\n\n    # Check if any of the arguments is a wrapper script.\n    args=\n    for file\n    do\n      case $file in\n      -*) ;;\n      *)\n\t# Do a test to see if this is really a libtool program.\n\tif func_ltwrapper_script_p \"$file\"; then\n\t  func_source \"$file\"\n\t  # Transform arg to wrapped name.\n\t  file=\"$progdir/$program\"\n\telif func_ltwrapper_executable_p \"$file\"; then\n\t  func_ltwrapper_scriptname \"$file\"\n\t  func_source \"$func_ltwrapper_scriptname_result\"\n\t  # Transform arg to wrapped name.\n\t  file=\"$progdir/$program\"\n\tfi\n\t;;\n      esac\n      # Quote arguments (to preserve shell metacharacters).\n      func_quote_for_eval \"$file\"\n      args=\"$args $func_quote_for_eval_result\"\n    done\n\n    if test \"X$opt_dry_run\" = Xfalse; then\n      if test -n \"$shlibpath_var\"; then\n\t# Export the shlibpath_var.\n\teval \"export $shlibpath_var\"\n      fi\n\n      # Restore saved environment variables\n      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES\n      do\n\teval \"if test \\\"\\${save_$lt_var+set}\\\" = set; then\n                $lt_var=\\$save_$lt_var; export $lt_var\n\t      else\n\t\t$lt_unset $lt_var\n\t      fi\"\n      done\n\n      # Now prepare to actually exec the command.\n      exec_cmd=\"\\$cmd$args\"\n    else\n      # Display what would be done.\n      if test -n \"$shlibpath_var\"; then\n\teval \"\\$ECHO \\\"\\$shlibpath_var=\\$$shlibpath_var\\\"\"\n\t$ECHO \"export $shlibpath_var\"\n      fi\n      $ECHO \"$cmd$args\"\n      exit $EXIT_SUCCESS\n    fi\n}\n\ntest \"$mode\" = execute && func_mode_execute ${1+\"$@\"}\n\n\n# func_mode_finish arg...\nfunc_mode_finish ()\n{\n    $opt_debug\n    libdirs=\"$nonopt\"\n    admincmds=\n\n    if test -n \"$finish_cmds$finish_eval\" && test -n \"$libdirs\"; then\n      for dir\n      do\n\tlibdirs=\"$libdirs $dir\"\n      done\n\n      for libdir in $libdirs; do\n\tif test -n \"$finish_cmds\"; then\n\t  # Do each command in the finish commands.\n\t  func_execute_cmds \"$finish_cmds\" 'admincmds=\"$admincmds\n'\"$cmd\"'\"'\n\tfi\n\tif test -n \"$finish_eval\"; then\n\t  # Do the single finish_eval.\n\t  eval cmds=\\\"$finish_eval\\\"\n\t  $opt_dry_run || eval \"$cmds\" || admincmds=\"$admincmds\n       $cmds\"\n\tfi\n      done\n    fi\n\n    # Exit here if they wanted silent mode.\n    $opt_silent && exit $EXIT_SUCCESS\n\n    $ECHO \"X----------------------------------------------------------------------\" | $Xsed\n    $ECHO \"Libraries have been installed in:\"\n    for libdir in $libdirs; do\n      $ECHO \"   $libdir\"\n    done\n    $ECHO\n    $ECHO \"If you ever happen to want to link against installed libraries\"\n    $ECHO \"in a given directory, LIBDIR, you must either use libtool, and\"\n    $ECHO \"specify the full pathname of the library, or use the \\`-LLIBDIR'\"\n    $ECHO \"flag during linking and do at least one of the following:\"\n    if test -n \"$shlibpath_var\"; then\n      $ECHO \"   - add LIBDIR to the \\`$shlibpath_var' environment variable\"\n      $ECHO \"     during execution\"\n    fi\n    if test -n \"$runpath_var\"; then\n      $ECHO \"   - add LIBDIR to the \\`$runpath_var' environment variable\"\n      $ECHO \"     during linking\"\n    fi\n    if test -n \"$hardcode_libdir_flag_spec\"; then\n      libdir=LIBDIR\n      eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\n      $ECHO \"   - use the \\`$flag' linker flag\"\n    fi\n    if test -n \"$admincmds\"; then\n      $ECHO \"   - have your system administrator run these commands:$admincmds\"\n    fi\n    if test -f /etc/ld.so.conf; then\n      $ECHO \"   - have your system administrator add LIBDIR to \\`/etc/ld.so.conf'\"\n    fi\n    $ECHO\n\n    $ECHO \"See any operating system documentation about shared libraries for\"\n    case $host in\n      solaris2.[6789]|solaris2.1[0-9])\n        $ECHO \"more information, such as the ld(1), crle(1) and ld.so(8) manual\"\n\t$ECHO \"pages.\"\n\t;;\n      *)\n        $ECHO \"more information, such as the ld(1) and ld.so(8) manual pages.\"\n        ;;\n    esac\n    $ECHO \"X----------------------------------------------------------------------\" | $Xsed\n    exit $EXIT_SUCCESS\n}\n\ntest \"$mode\" = finish && func_mode_finish ${1+\"$@\"}\n\n\n# func_mode_install arg...\nfunc_mode_install ()\n{\n    $opt_debug\n    # There may be an optional sh(1) argument at the beginning of\n    # install_prog (especially on Windows NT).\n    if test \"$nonopt\" = \"$SHELL\" || test \"$nonopt\" = /bin/sh ||\n       # Allow the use of GNU shtool's install command.\n       $ECHO \"X$nonopt\" | $GREP shtool >/dev/null; then\n      # Aesthetically quote it.\n      func_quote_for_eval \"$nonopt\"\n      install_prog=\"$func_quote_for_eval_result \"\n      arg=$1\n      shift\n    else\n      install_prog=\n      arg=$nonopt\n    fi\n\n    # The real first argument should be the name of the installation program.\n    # Aesthetically quote it.\n    func_quote_for_eval \"$arg\"\n    install_prog=\"$install_prog$func_quote_for_eval_result\"\n\n    # We need to accept at least all the BSD install flags.\n    dest=\n    files=\n    opts=\n    prev=\n    install_type=\n    isdir=no\n    stripme=\n    for arg\n    do\n      if test -n \"$dest\"; then\n\tfiles=\"$files $dest\"\n\tdest=$arg\n\tcontinue\n      fi\n\n      case $arg in\n      -d) isdir=yes ;;\n      -f)\n\tcase \" $install_prog \" in\n\t*[\\\\\\ /]cp\\ *) ;;\n\t*) prev=$arg ;;\n\tesac\n\t;;\n      -g | -m | -o)\n\tprev=$arg\n\t;;\n      -s)\n\tstripme=\" -s\"\n\tcontinue\n\t;;\n      -*)\n\t;;\n      *)\n\t# If the previous option needed an argument, then skip it.\n\tif test -n \"$prev\"; then\n\t  prev=\n\telse\n\t  dest=$arg\n\t  continue\n\tfi\n\t;;\n      esac\n\n      # Aesthetically quote the argument.\n      func_quote_for_eval \"$arg\"\n      install_prog=\"$install_prog $func_quote_for_eval_result\"\n    done\n\n    test -z \"$install_prog\" && \\\n      func_fatal_help \"you must specify an install program\"\n\n    test -n \"$prev\" && \\\n      func_fatal_help \"the \\`$prev' option requires an argument\"\n\n    if test -z \"$files\"; then\n      if test -z \"$dest\"; then\n\tfunc_fatal_help \"no file or destination specified\"\n      else\n\tfunc_fatal_help \"you must specify a destination\"\n      fi\n    fi\n\n    # Strip any trailing slash from the destination.\n    func_stripname '' '/' \"$dest\"\n    dest=$func_stripname_result\n\n    # Check to see that the destination is a directory.\n    test -d \"$dest\" && isdir=yes\n    if test \"$isdir\" = yes; then\n      destdir=\"$dest\"\n      destname=\n    else\n      func_dirname_and_basename \"$dest\" \"\" \".\"\n      destdir=\"$func_dirname_result\"\n      destname=\"$func_basename_result\"\n\n      # Not a directory, so check to see that there is only one file specified.\n      set dummy $files; shift\n      test \"$#\" -gt 1 && \\\n\tfunc_fatal_help \"\\`$dest' is not a directory\"\n    fi\n    case $destdir in\n    [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n    *)\n      for file in $files; do\n\tcase $file in\n\t*.lo) ;;\n\t*)\n\t  func_fatal_help \"\\`$destdir' must be an absolute directory name\"\n\t  ;;\n\tesac\n      done\n      ;;\n    esac\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    staticlibs=\n    future_libdirs=\n    current_libdirs=\n    for file in $files; do\n\n      # Do each installation.\n      case $file in\n      *.$libext)\n\t# Do the static libraries later.\n\tstaticlibs=\"$staticlibs $file\"\n\t;;\n\n      *.la)\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$file\" \\\n\t  || func_fatal_help \"\\`$file' is not a valid libtool archive\"\n\n\tlibrary_names=\n\told_library=\n\trelink_command=\n\tfunc_source \"$file\"\n\n\t# Add the libdir to current_libdirs if it is the destination.\n\tif test \"X$destdir\" = \"X$libdir\"; then\n\t  case \"$current_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) current_libdirs=\"$current_libdirs $libdir\" ;;\n\t  esac\n\telse\n\t  # Note the libdir as a future libdir.\n\t  case \"$future_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) future_libdirs=\"$future_libdirs $libdir\" ;;\n\t  esac\n\tfi\n\n\tfunc_dirname \"$file\" \"/\" \"\"\n\tdir=\"$func_dirname_result\"\n\tdir=\"$dir$objdir\"\n\n\tif test -n \"$relink_command\"; then\n\t  # Determine the prefix the user has applied to our future dir.\n\t  inst_prefix_dir=`$ECHO \"X$destdir\" | $Xsed -e \"s%$libdir\\$%%\"`\n\n\t  # Don't allow the user to place us outside of our expected\n\t  # location b/c this prevents finding dependent libraries that\n\t  # are installed to the same prefix.\n\t  # At present, this check doesn't affect windows .dll's that\n\t  # are installed into $libdir/../bin (currently, that works fine)\n\t  # but it's something to keep an eye on.\n\t  test \"$inst_prefix_dir\" = \"$destdir\" && \\\n\t    func_fatal_error \"error: cannot install \\`$file' to a directory not ending in $libdir\"\n\n\t  if test -n \"$inst_prefix_dir\"; then\n\t    # Stick the inst_prefix_dir data into the link command.\n\t    relink_command=`$ECHO \"X$relink_command\" | $Xsed -e \"s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%\"`\n\t  else\n\t    relink_command=`$ECHO \"X$relink_command\" | $Xsed -e \"s%@inst_prefix_dir@%%\"`\n\t  fi\n\n\t  func_warning \"relinking \\`$file'\"\n\t  func_show_eval \"$relink_command\" \\\n\t    'func_fatal_error \"error: relink \\`$file'\\'' with the above command before installing it\"'\n\tfi\n\n\t# See the names of the shared library.\n\tset dummy $library_names; shift\n\tif test -n \"$1\"; then\n\t  realname=\"$1\"\n\t  shift\n\n\t  srcname=\"$realname\"\n\t  test -n \"$relink_command\" && srcname=\"$realname\"T\n\n\t  # Install the shared library and build the symlinks.\n\t  func_show_eval \"$install_prog $dir/$srcname $destdir/$realname\" \\\n\t      'exit $?'\n\t  tstripme=\"$stripme\"\n\t  case $host_os in\n\t  cygwin* | mingw* | pw32* | cegcc*)\n\t    case $realname in\n\t    *.dll.a)\n\t      tstripme=\"\"\n\t      ;;\n\t    esac\n\t    ;;\n\t  esac\n\t  if test -n \"$tstripme\" && test -n \"$striplib\"; then\n\t    func_show_eval \"$striplib $destdir/$realname\" 'exit $?'\n\t  fi\n\n\t  if test \"$#\" -gt 0; then\n\t    # Delete the old symlinks, and create new ones.\n\t    # Try `ln -sf' first, because the `ln' binary might depend on\n\t    # the symlink we replace!  Solaris /bin/ln does not understand -f,\n\t    # so we also need to try rm && ln -s.\n\t    for linkname\n\t    do\n\t      test \"$linkname\" != \"$realname\" \\\n\t\t&& func_show_eval \"(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })\"\n\t    done\n\t  fi\n\n\t  # Do each command in the postinstall commands.\n\t  lib=\"$destdir/$realname\"\n\t  func_execute_cmds \"$postinstall_cmds\" 'exit $?'\n\tfi\n\n\t# Install the pseudo-library for information purposes.\n\tfunc_basename \"$file\"\n\tname=\"$func_basename_result\"\n\tinstname=\"$dir/$name\"i\n\tfunc_show_eval \"$install_prog $instname $destdir/$name\" 'exit $?'\n\n\t# Maybe install the static library, too.\n\ttest -n \"$old_library\" && staticlibs=\"$staticlibs $dir/$old_library\"\n\t;;\n\n      *.lo)\n\t# Install (i.e. copy) a libtool object.\n\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  func_basename \"$file\"\n\t  destfile=\"$func_basename_result\"\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# Deduce the name of the destination old-style object file.\n\tcase $destfile in\n\t*.lo)\n\t  func_lo2o \"$destfile\"\n\t  staticdest=$func_lo2o_result\n\t  ;;\n\t*.$objext)\n\t  staticdest=\"$destfile\"\n\t  destfile=\n\t  ;;\n\t*)\n\t  func_fatal_help \"cannot copy a libtool object to \\`$destfile'\"\n\t  ;;\n\tesac\n\n\t# Install the libtool object if requested.\n\ttest -n \"$destfile\" && \\\n\t  func_show_eval \"$install_prog $file $destfile\" 'exit $?'\n\n\t# Install the old object if enabled.\n\tif test \"$build_old_libs\" = yes; then\n\t  # Deduce the name of the old-style object file.\n\t  func_lo2o \"$file\"\n\t  staticobj=$func_lo2o_result\n\t  func_show_eval \"$install_prog \\$staticobj \\$staticdest\" 'exit $?'\n\tfi\n\texit $EXIT_SUCCESS\n\t;;\n\n      *)\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  func_basename \"$file\"\n\t  destfile=\"$func_basename_result\"\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# If the file is missing, and there is a .exe on the end, strip it\n\t# because it is most likely a libtool script we actually want to\n\t# install\n\tstripped_ext=\"\"\n\tcase $file in\n\t  *.exe)\n\t    if test ! -f \"$file\"; then\n\t      func_stripname '' '.exe' \"$file\"\n\t      file=$func_stripname_result\n\t      stripped_ext=\".exe\"\n\t    fi\n\t    ;;\n\tesac\n\n\t# Do a test to see if this is really a libtool program.\n\tcase $host in\n\t*cygwin* | *mingw*)\n\t    if func_ltwrapper_executable_p \"$file\"; then\n\t      func_ltwrapper_scriptname \"$file\"\n\t      wrapper=$func_ltwrapper_scriptname_result\n\t    else\n\t      func_stripname '' '.exe' \"$file\"\n\t      wrapper=$func_stripname_result\n\t    fi\n\t    ;;\n\t*)\n\t    wrapper=$file\n\t    ;;\n\tesac\n\tif func_ltwrapper_script_p \"$wrapper\"; then\n\t  notinst_deplibs=\n\t  relink_command=\n\n\t  func_source \"$wrapper\"\n\n\t  # Check the variables that should have been set.\n\t  test -z \"$generated_by_libtool_version\" && \\\n\t    func_fatal_error \"invalid libtool wrapper script \\`$wrapper'\"\n\n\t  finalize=yes\n\t  for lib in $notinst_deplibs; do\n\t    # Check to see that each library is installed.\n\t    libdir=\n\t    if test -f \"$lib\"; then\n\t      func_source \"$lib\"\n\t    fi\n\t    libfile=\"$libdir/\"`$ECHO \"X$lib\" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test\n\t    if test -n \"$libdir\" && test ! -f \"$libfile\"; then\n\t      func_warning \"\\`$lib' has not been installed in \\`$libdir'\"\n\t      finalize=no\n\t    fi\n\t  done\n\n\t  relink_command=\n\t  func_source \"$wrapper\"\n\n\t  outputname=\n\t  if test \"$fast_install\" = no && test -n \"$relink_command\"; then\n\t    $opt_dry_run || {\n\t      if test \"$finalize\" = yes; then\n\t        tmpdir=`func_mktempdir`\n\t\tfunc_basename \"$file$stripped_ext\"\n\t\tfile=\"$func_basename_result\"\n\t        outputname=\"$tmpdir/$file\"\n\t        # Replace the output file specification.\n\t        relink_command=`$ECHO \"X$relink_command\" | $Xsed -e 's%@OUTPUT@%'\"$outputname\"'%g'`\n\n\t        $opt_silent || {\n\t          func_quote_for_expand \"$relink_command\"\n\t\t  eval \"func_echo $func_quote_for_expand_result\"\n\t        }\n\t        if eval \"$relink_command\"; then :\n\t          else\n\t\t  func_error \"error: relink \\`$file' with the above command before installing it\"\n\t\t  $opt_dry_run || ${RM}r \"$tmpdir\"\n\t\t  continue\n\t        fi\n\t        file=\"$outputname\"\n\t      else\n\t        func_warning \"cannot relink \\`$file'\"\n\t      fi\n\t    }\n\t  else\n\t    # Install the binary that we compiled earlier.\n\t    file=`$ECHO \"X$file$stripped_ext\" | $Xsed -e \"s%\\([^/]*\\)$%$objdir/\\1%\"`\n\t  fi\n\tfi\n\n\t# remove .exe since cygwin /usr/bin/install will append another\n\t# one anyway\n\tcase $install_prog,$host in\n\t*/usr/bin/install*,*cygwin*)\n\t  case $file:$destfile in\n\t  *.exe:*.exe)\n\t    # this is ok\n\t    ;;\n\t  *.exe:*)\n\t    destfile=$destfile.exe\n\t    ;;\n\t  *:*.exe)\n\t    func_stripname '' '.exe' \"$destfile\"\n\t    destfile=$func_stripname_result\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tfunc_show_eval \"$install_prog\\$stripme \\$file \\$destfile\" 'exit $?'\n\t$opt_dry_run || if test -n \"$outputname\"; then\n\t  ${RM}r \"$tmpdir\"\n\tfi\n\t;;\n      esac\n    done\n\n    for file in $staticlibs; do\n      func_basename \"$file\"\n      name=\"$func_basename_result\"\n\n      # Set up the ranlib parameters.\n      oldlib=\"$destdir/$name\"\n\n      func_show_eval \"$install_prog \\$file \\$oldlib\" 'exit $?'\n\n      if test -n \"$stripme\" && test -n \"$old_striplib\"; then\n\tfunc_show_eval \"$old_striplib $oldlib\" 'exit $?'\n      fi\n\n      # Do each command in the postinstall commands.\n      func_execute_cmds \"$old_postinstall_cmds\" 'exit $?'\n    done\n\n    test -n \"$future_libdirs\" && \\\n      func_warning \"remember to run \\`$progname --finish$future_libdirs'\"\n\n    if test -n \"$current_libdirs\"; then\n      # Maybe just do a dry run.\n      $opt_dry_run && current_libdirs=\" -n$current_libdirs\"\n      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'\n    else\n      exit $EXIT_SUCCESS\n    fi\n}\n\ntest \"$mode\" = install && func_mode_install ${1+\"$@\"}\n\n\n# func_generate_dlsyms outputname originator pic_p\n# Extract symbols from dlprefiles and create ${outputname}S.o with\n# a dlpreopen symbol table.\nfunc_generate_dlsyms ()\n{\n    $opt_debug\n    my_outputname=\"$1\"\n    my_originator=\"$2\"\n    my_pic_p=\"${3-no}\"\n    my_prefix=`$ECHO \"$my_originator\" | sed 's%[^a-zA-Z0-9]%_%g'`\n    my_dlsyms=\n\n    if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n      if test -n \"$NM\" && test -n \"$global_symbol_pipe\"; then\n\tmy_dlsyms=\"${my_outputname}S.c\"\n      else\n\tfunc_error \"not configured to extract global symbols from dlpreopened files\"\n      fi\n    fi\n\n    if test -n \"$my_dlsyms\"; then\n      case $my_dlsyms in\n      \"\") ;;\n      *.c)\n\t# Discover the nlist of each of the dlfiles.\n\tnlist=\"$output_objdir/${my_outputname}.nm\"\n\n\tfunc_show_eval \"$RM $nlist ${nlist}S ${nlist}T\"\n\n\t# Parse the name list into a source file.\n\tfunc_verbose \"creating $output_objdir/$my_dlsyms\"\n\n\t$opt_dry_run || $ECHO > \"$output_objdir/$my_dlsyms\" \"\\\n/* $my_dlsyms - symbol resolution table for \\`$my_outputname' dlsym emulation. */\n/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */\n\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n/* External symbol declarations for the compiler. */\\\n\"\n\n\tif test \"$dlself\" = yes; then\n\t  func_verbose \"generating symbol list for \\`$output'\"\n\n\t  $opt_dry_run || echo ': @PROGRAM@ ' > \"$nlist\"\n\n\t  # Add our own program objects to the symbol list.\n\t  progfiles=`$ECHO \"X$objs$old_deplibs\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n\t  for progfile in $progfiles; do\n\t    func_verbose \"extracting global C symbols from \\`$progfile'\"\n\t    $opt_dry_run || eval \"$NM $progfile | $global_symbol_pipe >> '$nlist'\"\n\t  done\n\n\t  if test -n \"$exclude_expsyms\"; then\n\t    $opt_dry_run || {\n\t      eval '$EGREP -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t    }\n\t  fi\n\n\t  if test -n \"$export_symbols_regex\"; then\n\t    $opt_dry_run || {\n\t      eval '$EGREP -e \"$export_symbols_regex\" \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t    }\n\t  fi\n\n\t  # Prepare the list of exported symbols\n\t  if test -z \"$export_symbols\"; then\n\t    export_symbols=\"$output_objdir/$outputname.exp\"\n\t    $opt_dry_run || {\n\t      $RM $export_symbols\n\t      eval \"${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \\(.*\\)$/\\1/p' \"'< \"$nlist\" > \"$export_symbols\"'\n\t      case $host in\n\t      *cygwin* | *mingw* | *cegcc* )\n                eval \"echo EXPORTS \"'> \"$output_objdir/$outputname.def\"'\n                eval 'cat \"$export_symbols\" >> \"$output_objdir/$outputname.def\"'\n\t        ;;\n\t      esac\n\t    }\n\t  else\n\t    $opt_dry_run || {\n\t      eval \"${SED} -e 's/\\([].[*^$]\\)/\\\\\\\\\\1/g' -e 's/^/ /' -e 's/$/$/'\"' < \"$export_symbols\" > \"$output_objdir/$outputname.exp\"'\n\t      eval '$GREP -f \"$output_objdir/$outputname.exp\" < \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t      case $host in\n\t        *cygwin | *mingw* | *cegcc* )\n\t          eval \"echo EXPORTS \"'> \"$output_objdir/$outputname.def\"'\n\t          eval 'cat \"$nlist\" >> \"$output_objdir/$outputname.def\"'\n\t          ;;\n\t      esac\n\t    }\n\t  fi\n\tfi\n\n\tfor dlprefile in $dlprefiles; do\n\t  func_verbose \"extracting global C symbols from \\`$dlprefile'\"\n\t  func_basename \"$dlprefile\"\n\t  name=\"$func_basename_result\"\n\t  $opt_dry_run || {\n\t    eval '$ECHO \": $name \" >> \"$nlist\"'\n\t    eval \"$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'\"\n\t  }\n\tdone\n\n\t$opt_dry_run || {\n\t  # Make sure we have at least an empty file.\n\t  test -f \"$nlist\" || : > \"$nlist\"\n\n\t  if test -n \"$exclude_expsyms\"; then\n\t    $EGREP -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T\n\t    $MV \"$nlist\"T \"$nlist\"\n\t  fi\n\n\t  # Try sorting and uniquifying the output.\n\t  if $GREP -v \"^: \" < \"$nlist\" |\n\t      if sort -k 3 </dev/null >/dev/null 2>&1; then\n\t\tsort -k 3\n\t      else\n\t\tsort +2\n\t      fi |\n\t      uniq > \"$nlist\"S; then\n\t    :\n\t  else\n\t    $GREP -v \"^: \" < \"$nlist\" > \"$nlist\"S\n\t  fi\n\n\t  if test -f \"$nlist\"S; then\n\t    eval \"$global_symbol_to_cdecl\"' < \"$nlist\"S >> \"$output_objdir/$my_dlsyms\"'\n\t  else\n\t    $ECHO '/* NONE */' >> \"$output_objdir/$my_dlsyms\"\n\t  fi\n\n\t  $ECHO >> \"$output_objdir/$my_dlsyms\" \"\\\n\n/* The mapping between symbol names and symbols.  */\ntypedef struct {\n  const char *name;\n  void *address;\n} lt_dlsymlist;\n\"\n\t  case $host in\n\t  *cygwin* | *mingw* | *cegcc* )\n\t    $ECHO >> \"$output_objdir/$my_dlsyms\" \"\\\n/* DATA imports from DLLs on WIN32 con't be const, because\n   runtime relocations are performed -- see ld's documentation\n   on pseudo-relocs.  */\"\n\t    lt_dlsym_const= ;;\n\t  *osf5*)\n\t    echo >> \"$output_objdir/$my_dlsyms\" \"\\\n/* This system does not cope well with relocations in const data */\"\n\t    lt_dlsym_const= ;;\n\t  *)\n\t    lt_dlsym_const=const ;;\n\t  esac\n\n\t  $ECHO >> \"$output_objdir/$my_dlsyms\" \"\\\nextern $lt_dlsym_const lt_dlsymlist\nlt_${my_prefix}_LTX_preloaded_symbols[];\n$lt_dlsym_const lt_dlsymlist\nlt_${my_prefix}_LTX_preloaded_symbols[] =\n{\\\n  { \\\"$my_originator\\\", (void *) 0 },\"\n\n\t  case $need_lib_prefix in\n\t  no)\n\t    eval \"$global_symbol_to_c_name_address\" < \"$nlist\" >> \"$output_objdir/$my_dlsyms\"\n\t    ;;\n\t  *)\n\t    eval \"$global_symbol_to_c_name_address_lib_prefix\" < \"$nlist\" >> \"$output_objdir/$my_dlsyms\"\n\t    ;;\n\t  esac\n\t  $ECHO >> \"$output_objdir/$my_dlsyms\" \"\\\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt_${my_prefix}_LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\\\n\"\n\t} # !$opt_dry_run\n\n\tpic_flag_for_symtable=\n\tcase \"$compile_command \" in\n\t*\" -static \"*) ;;\n\t*)\n\t  case $host in\n\t  # compiling the symbol table file with pic_flag works around\n\t  # a FreeBSD bug that causes programs to crash when -lm is\n\t  # linked before any other PIC object.  But we must not use\n\t  # pic_flag when linking with -static.  The problem exists in\n\t  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.\n\t  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)\n\t    pic_flag_for_symtable=\" $pic_flag -DFREEBSD_WORKAROUND\" ;;\n\t  *-*-hpux*)\n\t    pic_flag_for_symtable=\" $pic_flag\"  ;;\n\t  *)\n\t    if test \"X$my_pic_p\" != Xno; then\n\t      pic_flag_for_symtable=\" $pic_flag\"\n\t    fi\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tsymtab_cflags=\n\tfor arg in $LTCFLAGS; do\n\t  case $arg in\n\t  -pie | -fpie | -fPIE) ;;\n\t  *) symtab_cflags=\"$symtab_cflags $arg\" ;;\n\t  esac\n\tdone\n\n\t# Now compile the dynamic symbol file.\n\tfunc_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable \"$my_dlsyms\")' 'exit $?'\n\n\t# Clean up the generated files.\n\tfunc_show_eval '$RM \"$output_objdir/$my_dlsyms\" \"$nlist\" \"${nlist}S\" \"${nlist}T\"'\n\n\t# Transform the symbol file into the correct name.\n\tsymfileobj=\"$output_objdir/${my_outputname}S.$objext\"\n\tcase $host in\n\t*cygwin* | *mingw* | *cegcc* )\n\t  if test -f \"$output_objdir/$my_outputname.def\"; then\n\t    compile_command=`$ECHO \"X$compile_command\" | $Xsed -e \"s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%\"`\n\t    finalize_command=`$ECHO \"X$finalize_command\" | $Xsed -e \"s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%\"`\n\t  else\n\t    compile_command=`$ECHO \"X$compile_command\" | $Xsed -e \"s%@SYMFILE@%$symfileobj%\"`\n\t    finalize_command=`$ECHO \"X$finalize_command\" | $Xsed -e \"s%@SYMFILE@%$symfileobj%\"`\n\t  fi\n\t  ;;\n\t*)\n\t  compile_command=`$ECHO \"X$compile_command\" | $Xsed -e \"s%@SYMFILE@%$symfileobj%\"`\n\t  finalize_command=`$ECHO \"X$finalize_command\" | $Xsed -e \"s%@SYMFILE@%$symfileobj%\"`\n\t  ;;\n\tesac\n\t;;\n      *)\n\tfunc_fatal_error \"unknown suffix for \\`$my_dlsyms'\"\n\t;;\n      esac\n    else\n      # We keep going just in case the user didn't refer to\n      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe\n      # really was required.\n\n      # Nullify the symbol file.\n      compile_command=`$ECHO \"X$compile_command\" | $Xsed -e \"s% @SYMFILE@%%\"`\n      finalize_command=`$ECHO \"X$finalize_command\" | $Xsed -e \"s% @SYMFILE@%%\"`\n    fi\n}\n\n# func_win32_libid arg\n# return the library type of file 'arg'\n#\n# Need a lot of goo to handle *both* DLLs and import libs\n# Has to be a shell function in order to 'eat' the argument\n# that is supplied when $file_magic_command is called.\nfunc_win32_libid ()\n{\n  $opt_debug\n  win32_libid_type=\"unknown\"\n  win32_fileres=`file -L $1 2>/dev/null`\n  case $win32_fileres in\n  *ar\\ archive\\ import\\ library*) # definitely import\n    win32_libid_type=\"x86 archive import\"\n    ;;\n  *ar\\ archive*) # could be an import, or static\n    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |\n       $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then\n      win32_nmres=`eval $NM -f posix -A $1 |\n\t$SED -n -e '\n\t    1,100{\n\t\t/ I /{\n\t\t    s,.*,import,\n\t\t    p\n\t\t    q\n\t\t}\n\t    }'`\n      case $win32_nmres in\n      import*)  win32_libid_type=\"x86 archive import\";;\n      *)        win32_libid_type=\"x86 archive static\";;\n      esac\n    fi\n    ;;\n  *DLL*)\n    win32_libid_type=\"x86 DLL\"\n    ;;\n  *executable*) # but shell scripts are \"executable\" too...\n    case $win32_fileres in\n    *MS\\ Windows\\ PE\\ Intel*)\n      win32_libid_type=\"x86 DLL\"\n      ;;\n    esac\n    ;;\n  esac\n  $ECHO \"$win32_libid_type\"\n}\n\n\n\n# func_extract_an_archive dir oldlib\nfunc_extract_an_archive ()\n{\n    $opt_debug\n    f_ex_an_ar_dir=\"$1\"; shift\n    f_ex_an_ar_oldlib=\"$1\"\n    func_show_eval \"(cd \\$f_ex_an_ar_dir && $AR x \\\"\\$f_ex_an_ar_oldlib\\\")\" 'exit $?'\n    if ($AR t \"$f_ex_an_ar_oldlib\" | sort | sort -uc >/dev/null 2>&1); then\n     :\n    else\n      func_fatal_error \"object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib\"\n    fi\n}\n\n\n# func_extract_archives gentop oldlib ...\nfunc_extract_archives ()\n{\n    $opt_debug\n    my_gentop=\"$1\"; shift\n    my_oldlibs=${1+\"$@\"}\n    my_oldobjs=\"\"\n    my_xlib=\"\"\n    my_xabs=\"\"\n    my_xdir=\"\"\n\n    for my_xlib in $my_oldlibs; do\n      # Extract the objects.\n      case $my_xlib in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) my_xabs=\"$my_xlib\" ;;\n\t*) my_xabs=`pwd`\"/$my_xlib\" ;;\n      esac\n      func_basename \"$my_xlib\"\n      my_xlib=\"$func_basename_result\"\n      my_xlib_u=$my_xlib\n      while :; do\n        case \" $extracted_archives \" in\n\t*\" $my_xlib_u \"*)\n\t  func_arith $extracted_serial + 1\n\t  extracted_serial=$func_arith_result\n\t  my_xlib_u=lt$extracted_serial-$my_xlib ;;\n\t*) break ;;\n\tesac\n      done\n      extracted_archives=\"$extracted_archives $my_xlib_u\"\n      my_xdir=\"$my_gentop/$my_xlib_u\"\n\n      func_mkdir_p \"$my_xdir\"\n\n      case $host in\n      *-darwin*)\n\tfunc_verbose \"Extracting $my_xabs\"\n\t# Do not bother doing anything if just a dry run\n\t$opt_dry_run || {\n\t  darwin_orig_dir=`pwd`\n\t  cd $my_xdir || exit $?\n\t  darwin_archive=$my_xabs\n\t  darwin_curdir=`pwd`\n\t  darwin_base_archive=`basename \"$darwin_archive\"`\n\t  darwin_arches=`$LIPO -info \"$darwin_archive\" 2>/dev/null | $GREP Architectures 2>/dev/null || true`\n\t  if test -n \"$darwin_arches\"; then\n\t    darwin_arches=`$ECHO \"$darwin_arches\" | $SED -e 's/.*are://'`\n\t    darwin_arch=\n\t    func_verbose \"$darwin_base_archive has multiple architectures $darwin_arches\"\n\t    for darwin_arch in  $darwin_arches ; do\n\t      func_mkdir_p \"unfat-$$/${darwin_base_archive}-${darwin_arch}\"\n\t      $LIPO -thin $darwin_arch -output \"unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}\" \"${darwin_archive}\"\n\t      cd \"unfat-$$/${darwin_base_archive}-${darwin_arch}\"\n\t      func_extract_an_archive \"`pwd`\" \"${darwin_base_archive}\"\n\t      cd \"$darwin_curdir\"\n\t      $RM \"unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}\"\n\t    done # $darwin_arches\n            ## Okay now we've a bunch of thin objects, gotta fatten them up :)\n\t    darwin_filelist=`find unfat-$$ -type f -name \\*.o -print -o -name \\*.lo -print | $SED -e \"$basename\" | sort -u`\n\t    darwin_file=\n\t    darwin_files=\n\t    for darwin_file in $darwin_filelist; do\n\t      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`\n\t      $LIPO -create -output \"$darwin_file\" $darwin_files\n\t    done # $darwin_filelist\n\t    $RM -rf unfat-$$\n\t    cd \"$darwin_orig_dir\"\n\t  else\n\t    cd $darwin_orig_dir\n\t    func_extract_an_archive \"$my_xdir\" \"$my_xabs\"\n\t  fi # $darwin_arches\n\t} # !$opt_dry_run\n\t;;\n      *)\n        func_extract_an_archive \"$my_xdir\" \"$my_xabs\"\n\t;;\n      esac\n      my_oldobjs=\"$my_oldobjs \"`find $my_xdir -name \\*.$objext -print -o -name \\*.lo -print | $NL2SP`\n    done\n\n    func_extract_archives_result=\"$my_oldobjs\"\n}\n\n\n\n# func_emit_wrapper_part1 [arg=no]\n#\n# Emit the first part of a libtool wrapper script on stdout.\n# For more information, see the description associated with\n# func_emit_wrapper(), below.\nfunc_emit_wrapper_part1 ()\n{\n\tfunc_emit_wrapper_part1_arg1=no\n\tif test -n \"$1\" ; then\n\t  func_emit_wrapper_part1_arg1=$1\n\tfi\n\n\t$ECHO \"\\\n#! $SHELL\n\n# $output - temporary wrapper script for $objdir/$outputname\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# The $output program cannot be directly executed until all the libtool\n# libraries that it depends on are installed.\n#\n# This wrapper script should never be moved out of the build directory.\n# If it is, it will not operate correctly.\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed='${SED} -e 1s/^X//'\nsed_quote_subst='$sed_quote_subst'\n\n# Be Bourne compatible\nif test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in *posix*) set -o posix;; esac\nfi\nBIN_SH=xpg4; export BIN_SH # for Tru64\nDUALCASE=1; export DUALCASE # for MKS sh\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nrelink_command=\\\"$relink_command\\\"\n\n# This environment variable determines our operation mode.\nif test \\\"\\$libtool_install_magic\\\" = \\\"$magic\\\"; then\n  # install mode needs the following variables:\n  generated_by_libtool_version='$macro_version'\n  notinst_deplibs='$notinst_deplibs'\nelse\n  # When we are sourced in execute mode, \\$file and \\$ECHO are already set.\n  if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n    ECHO=\\\"$qecho\\\"\n    file=\\\"\\$0\\\"\n    # Make sure echo works.\n    if test \\\"X\\$1\\\" = X--no-reexec; then\n      # Discard the --no-reexec flag, and continue.\n      shift\n    elif test \\\"X\\`{ \\$ECHO '\\t'; } 2>/dev/null\\`\\\" = 'X\\t'; then\n      # Yippee, \\$ECHO works!\n      :\n    else\n      # Restart under the correct shell, and then maybe \\$ECHO will work.\n      exec $SHELL \\\"\\$0\\\" --no-reexec \\${1+\\\"\\$@\\\"}\n    fi\n  fi\\\n\"\n\t$ECHO \"\\\n\n  # Find the directory that this script lives in.\n  thisdir=\\`\\$ECHO \\\"X\\$file\\\" | \\$Xsed -e 's%/[^/]*$%%'\\`\n  test \\\"x\\$thisdir\\\" = \\\"x\\$file\\\" && thisdir=.\n\n  # Follow symbolic links until we get to the real thisdir.\n  file=\\`ls -ld \\\"\\$file\\\" | ${SED} -n 's/.*-> //p'\\`\n  while test -n \\\"\\$file\\\"; do\n    destdir=\\`\\$ECHO \\\"X\\$file\\\" | \\$Xsed -e 's%/[^/]*\\$%%'\\`\n\n    # If there was a directory component, then change thisdir.\n    if test \\\"x\\$destdir\\\" != \\\"x\\$file\\\"; then\n      case \\\"\\$destdir\\\" in\n      [\\\\\\\\/]* | [A-Za-z]:[\\\\\\\\/]*) thisdir=\\\"\\$destdir\\\" ;;\n      *) thisdir=\\\"\\$thisdir/\\$destdir\\\" ;;\n      esac\n    fi\n\n    file=\\`\\$ECHO \\\"X\\$file\\\" | \\$Xsed -e 's%^.*/%%'\\`\n    file=\\`ls -ld \\\"\\$thisdir/\\$file\\\" | ${SED} -n 's/.*-> //p'\\`\n  done\n\"\n}\n# end: func_emit_wrapper_part1\n\n# func_emit_wrapper_part2 [arg=no]\n#\n# Emit the second part of a libtool wrapper script on stdout.\n# For more information, see the description associated with\n# func_emit_wrapper(), below.\nfunc_emit_wrapper_part2 ()\n{\n\tfunc_emit_wrapper_part2_arg1=no\n\tif test -n \"$1\" ; then\n\t  func_emit_wrapper_part2_arg1=$1\n\tfi\n\n\t$ECHO \"\\\n\n  # Usually 'no', except on cygwin/mingw when embedded into\n  # the cwrapper.\n  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1\n  if test \\\"\\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\\\" = \\\"yes\\\"; then\n    # special case for '.'\n    if test \\\"\\$thisdir\\\" = \\\".\\\"; then\n      thisdir=\\`pwd\\`\n    fi\n    # remove .libs from thisdir\n    case \\\"\\$thisdir\\\" in\n    *[\\\\\\\\/]$objdir ) thisdir=\\`\\$ECHO \\\"X\\$thisdir\\\" | \\$Xsed -e 's%[\\\\\\\\/][^\\\\\\\\/]*$%%'\\` ;;\n    $objdir )   thisdir=. ;;\n    esac\n  fi\n\n  # Try to get the absolute directory name.\n  absdir=\\`cd \\\"\\$thisdir\\\" && pwd\\`\n  test -n \\\"\\$absdir\\\" && thisdir=\\\"\\$absdir\\\"\n\"\n\n\tif test \"$fast_install\" = yes; then\n\t  $ECHO \"\\\n  program=lt-'$outputname'$exeext\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\n  if test ! -f \\\"\\$progdir/\\$program\\\" ||\n     { file=\\`ls -1dt \\\"\\$progdir/\\$program\\\" \\\"\\$progdir/../\\$program\\\" 2>/dev/null | ${SED} 1q\\`; \\\\\n       test \\\"X\\$file\\\" != \\\"X\\$progdir/\\$program\\\"; }; then\n\n    file=\\\"\\$\\$-\\$program\\\"\n\n    if test ! -d \\\"\\$progdir\\\"; then\n      $MKDIR \\\"\\$progdir\\\"\n    else\n      $RM \\\"\\$progdir/\\$file\\\"\n    fi\"\n\n\t  $ECHO \"\\\n\n    # relink executable if necessary\n    if test -n \\\"\\$relink_command\\\"; then\n      if relink_command_output=\\`eval \\$relink_command 2>&1\\`; then :\n      else\n\t$ECHO \\\"\\$relink_command_output\\\" >&2\n\t$RM \\\"\\$progdir/\\$file\\\"\n\texit 1\n      fi\n    fi\n\n    $MV \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\" 2>/dev/null ||\n    { $RM \\\"\\$progdir/\\$program\\\";\n      $MV \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\"; }\n    $RM \\\"\\$progdir/\\$file\\\"\n  fi\"\n\telse\n\t  $ECHO \"\\\n  program='$outputname'\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\"\n\tfi\n\n\t$ECHO \"\\\n\n  if test -f \\\"\\$progdir/\\$program\\\"; then\"\n\n\t# Export our shlibpath_var if we have one.\n\tif test \"$shlibpath_overrides_runpath\" = yes && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n\t  $ECHO \"\\\n    # Add our own library path to $shlibpath_var\n    $shlibpath_var=\\\"$temp_rpath\\$$shlibpath_var\\\"\n\n    # Some systems cannot cope with colon-terminated $shlibpath_var\n    # The second colon is a workaround for a bug in BeOS R4 sed\n    $shlibpath_var=\\`\\$ECHO \\\"X\\$$shlibpath_var\\\" | \\$Xsed -e 's/::*\\$//'\\`\n\n    export $shlibpath_var\n\"\n\tfi\n\n\t# fixup the dll searchpath if we need to.\n\tif test -n \"$dllsearchpath\"; then\n\t  $ECHO \"\\\n    # Add the dll search path components to the executable PATH\n    PATH=$dllsearchpath:\\$PATH\n\"\n\tfi\n\n\t$ECHO \"\\\n    if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n      # Run the actual program with our arguments.\n\"\n\tcase $host in\n\t# Backslashes separate directories on plain windows\n\t*-*-mingw | *-*-os2* | *-cegcc*)\n\t  $ECHO \"\\\n      exec \\\"\\$progdir\\\\\\\\\\$program\\\" \\${1+\\\"\\$@\\\"}\n\"\n\t  ;;\n\n\t*)\n\t  $ECHO \"\\\n      exec \\\"\\$progdir/\\$program\\\" \\${1+\\\"\\$@\\\"}\n\"\n\t  ;;\n\tesac\n\t$ECHO \"\\\n      \\$ECHO \\\"\\$0: cannot exec \\$program \\$*\\\" 1>&2\n      exit 1\n    fi\n  else\n    # The program doesn't exist.\n    \\$ECHO \\\"\\$0: error: \\\\\\`\\$progdir/\\$program' does not exist\\\" 1>&2\n    \\$ECHO \\\"This script is just a wrapper for \\$program.\\\" 1>&2\n    $ECHO \\\"See the $PACKAGE documentation for more information.\\\" 1>&2\n    exit 1\n  fi\nfi\\\n\"\n}\n# end: func_emit_wrapper_part2\n\n\n# func_emit_wrapper [arg=no]\n#\n# Emit a libtool wrapper script on stdout.\n# Don't directly open a file because we may want to\n# incorporate the script contents within a cygwin/mingw\n# wrapper executable.  Must ONLY be called from within\n# func_mode_link because it depends on a number of variables\n# set therein.\n#\n# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\n# variable will take.  If 'yes', then the emitted script\n# will assume that the directory in which it is stored is\n# the $objdir directory.  This is a cygwin/mingw-specific\n# behavior.\nfunc_emit_wrapper ()\n{\n\tfunc_emit_wrapper_arg1=no\n\tif test -n \"$1\" ; then\n\t  func_emit_wrapper_arg1=$1\n\tfi\n\n\t# split this up so that func_emit_cwrapperexe_src\n\t# can call each part independently.\n\tfunc_emit_wrapper_part1 \"${func_emit_wrapper_arg1}\"\n\tfunc_emit_wrapper_part2 \"${func_emit_wrapper_arg1}\"\n}\n\n\n# func_to_host_path arg\n#\n# Convert paths to host format when used with build tools.\n# Intended for use with \"native\" mingw (where libtool itself\n# is running under the msys shell), or in the following cross-\n# build environments:\n#    $build          $host\n#    mingw (msys)    mingw  [e.g. native]\n#    cygwin          mingw\n#    *nix + wine     mingw\n# where wine is equipped with the `winepath' executable.\n# In the native mingw case, the (msys) shell automatically\n# converts paths for any non-msys applications it launches,\n# but that facility isn't available from inside the cwrapper.\n# Similar accommodations are necessary for $host mingw and\n# $build cygwin.  Calling this function does no harm for other\n# $host/$build combinations not listed above.\n#\n# ARG is the path (on $build) that should be converted to\n# the proper representation for $host. The result is stored\n# in $func_to_host_path_result.\nfunc_to_host_path ()\n{\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\" ; then\n    case $host in\n      *mingw* )\n        lt_sed_naive_backslashify='s|\\\\\\\\*|\\\\|g;s|/|\\\\|g;s|\\\\|\\\\\\\\|g'\n        case $build in\n          *mingw* ) # actually, msys\n            # awkward: cmd appends spaces to result\n            lt_sed_strip_trailing_spaces=\"s/[ ]*\\$//\"\n            func_to_host_path_tmp1=`( cmd //c echo \"$1\" |\\\n              $SED -e \"$lt_sed_strip_trailing_spaces\" ) 2>/dev/null || echo \"\"`\n            func_to_host_path_result=`echo \"$func_to_host_path_tmp1\" |\\\n              $SED -e \"$lt_sed_naive_backslashify\"`\n            ;;\n          *cygwin* )\n            func_to_host_path_tmp1=`cygpath -w \"$1\"`\n            func_to_host_path_result=`echo \"$func_to_host_path_tmp1\" |\\\n              $SED -e \"$lt_sed_naive_backslashify\"`\n            ;;\n          * )\n            # Unfortunately, winepath does not exit with a non-zero\n            # error code, so we are forced to check the contents of\n            # stdout. On the other hand, if the command is not\n            # found, the shell will set an exit code of 127 and print\n            # *an error message* to stdout. So we must check for both\n            # error code of zero AND non-empty stdout, which explains\n            # the odd construction:\n            func_to_host_path_tmp1=`winepath -w \"$1\" 2>/dev/null`\n            if test \"$?\" -eq 0 && test -n \"${func_to_host_path_tmp1}\"; then\n              func_to_host_path_result=`echo \"$func_to_host_path_tmp1\" |\\\n                $SED -e \"$lt_sed_naive_backslashify\"`\n            else\n              # Allow warning below.\n              func_to_host_path_result=\"\"\n            fi\n            ;;\n        esac\n        if test -z \"$func_to_host_path_result\" ; then\n          func_error \"Could not determine host path corresponding to\"\n          func_error \"  '$1'\"\n          func_error \"Continuing, but uninstalled executables may not work.\"\n          # Fallback:\n          func_to_host_path_result=\"$1\"\n        fi\n        ;;\n    esac\n  fi\n}\n# end: func_to_host_path\n\n# func_to_host_pathlist arg\n#\n# Convert pathlists to host format when used with build tools.\n# See func_to_host_path(), above. This function supports the\n# following $build/$host combinations (but does no harm for\n# combinations not listed here):\n#    $build          $host\n#    mingw (msys)    mingw  [e.g. native]\n#    cygwin          mingw\n#    *nix + wine     mingw\n#\n# Path separators are also converted from $build format to\n# $host format. If ARG begins or ends with a path separator\n# character, it is preserved (but converted to $host format)\n# on output.\n#\n# ARG is a pathlist (on $build) that should be converted to\n# the proper representation on $host. The result is stored\n# in $func_to_host_pathlist_result.\nfunc_to_host_pathlist ()\n{\n  func_to_host_pathlist_result=\"$1\"\n  if test -n \"$1\" ; then\n    case $host in\n      *mingw* )\n        lt_sed_naive_backslashify='s|\\\\\\\\*|\\\\|g;s|/|\\\\|g;s|\\\\|\\\\\\\\|g'\n        # Remove leading and trailing path separator characters from\n        # ARG. msys behavior is inconsistent here, cygpath turns them\n        # into '.;' and ';.', and winepath ignores them completely.\n        func_to_host_pathlist_tmp2=\"$1\"\n        # Once set for this call, this variable should not be\n        # reassigned. It is used in tha fallback case.\n        func_to_host_pathlist_tmp1=`echo \"$func_to_host_pathlist_tmp2\" |\\\n          $SED -e 's|^:*||' -e 's|:*$||'`\n        case $build in\n          *mingw* ) # Actually, msys.\n            # Awkward: cmd appends spaces to result.\n            lt_sed_strip_trailing_spaces=\"s/[ ]*\\$//\"\n            func_to_host_pathlist_tmp2=`( cmd //c echo \"$func_to_host_pathlist_tmp1\" |\\\n              $SED -e \"$lt_sed_strip_trailing_spaces\" ) 2>/dev/null || echo \"\"`\n            func_to_host_pathlist_result=`echo \"$func_to_host_pathlist_tmp2\" |\\\n              $SED -e \"$lt_sed_naive_backslashify\"`\n            ;;\n          *cygwin* )\n            func_to_host_pathlist_tmp2=`cygpath -w -p \"$func_to_host_pathlist_tmp1\"`\n            func_to_host_pathlist_result=`echo \"$func_to_host_pathlist_tmp2\" |\\\n              $SED -e \"$lt_sed_naive_backslashify\"`\n            ;;\n          * )\n            # unfortunately, winepath doesn't convert pathlists\n            func_to_host_pathlist_result=\"\"\n            func_to_host_pathlist_oldIFS=$IFS\n            IFS=:\n            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do\n              IFS=$func_to_host_pathlist_oldIFS\n              if test -n \"$func_to_host_pathlist_f\" ; then\n                func_to_host_path \"$func_to_host_pathlist_f\"\n                if test -n \"$func_to_host_path_result\" ; then\n                  if test -z \"$func_to_host_pathlist_result\" ; then\n                    func_to_host_pathlist_result=\"$func_to_host_path_result\"\n                  else\n                    func_to_host_pathlist_result=\"$func_to_host_pathlist_result;$func_to_host_path_result\"\n                  fi\n                fi\n              fi\n              IFS=:\n            done\n            IFS=$func_to_host_pathlist_oldIFS\n            ;;\n        esac\n        if test -z \"$func_to_host_pathlist_result\" ; then\n          func_error \"Could not determine the host path(s) corresponding to\"\n          func_error \"  '$1'\"\n          func_error \"Continuing, but uninstalled executables may not work.\"\n          # Fallback. This may break if $1 contains DOS-style drive\n          # specifications. The fix is not to complicate the expression\n          # below, but for the user to provide a working wine installation\n          # with winepath so that path translation in the cross-to-mingw\n          # case works properly.\n          lt_replace_pathsep_nix_to_dos=\"s|:|;|g\"\n          func_to_host_pathlist_result=`echo \"$func_to_host_pathlist_tmp1\" |\\\n            $SED -e \"$lt_replace_pathsep_nix_to_dos\"`\n        fi\n        # Now, add the leading and trailing path separators back\n        case \"$1\" in\n          :* ) func_to_host_pathlist_result=\";$func_to_host_pathlist_result\"\n            ;;\n        esac\n        case \"$1\" in\n          *: ) func_to_host_pathlist_result=\"$func_to_host_pathlist_result;\"\n            ;;\n        esac\n        ;;\n    esac\n  fi\n}\n# end: func_to_host_pathlist\n\n# func_emit_cwrapperexe_src\n# emit the source code for a wrapper executable on stdout\n# Must ONLY be called from within func_mode_link because\n# it depends on a number of variable set therein.\nfunc_emit_cwrapperexe_src ()\n{\n\tcat <<EOF\n\n/* $cwrappersource - temporary wrapper executable for $objdir/$outputname\n   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n\n   The $output program cannot be directly executed until all the libtool\n   libraries that it depends on are installed.\n\n   This wrapper executable should never be moved out of the build directory.\n   If it is, it will not operate correctly.\n\n   Currently, it simply execs the wrapper *script* \"$SHELL $output\",\n   but could eventually absorb all of the scripts functionality and\n   exec $objdir/$outputname directly.\n*/\nEOF\n\t    cat <<\"EOF\"\n#include <stdio.h>\n#include <stdlib.h>\n#ifdef _MSC_VER\n# include <direct.h>\n# include <process.h>\n# include <io.h>\n# define setmode _setmode\n#else\n# include <unistd.h>\n# include <stdint.h>\n# ifdef __CYGWIN__\n#  include <io.h>\n#  define HAVE_SETENV\n#  ifdef __STRICT_ANSI__\nchar *realpath (const char *, char *);\nint putenv (char *);\nint setenv (const char *, const char *, int);\n#  endif\n# endif\n#endif\n#include <malloc.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <string.h>\n#include <ctype.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#if defined(PATH_MAX)\n# define LT_PATHMAX PATH_MAX\n#elif defined(MAXPATHLEN)\n# define LT_PATHMAX MAXPATHLEN\n#else\n# define LT_PATHMAX 1024\n#endif\n\n#ifndef S_IXOTH\n# define S_IXOTH 0\n#endif\n#ifndef S_IXGRP\n# define S_IXGRP 0\n#endif\n\n#ifdef _MSC_VER\n# define S_IXUSR _S_IEXEC\n# define stat _stat\n# ifndef _INTPTR_T_DEFINED\n#  define intptr_t int\n# endif\n#endif\n\n#ifndef DIR_SEPARATOR\n# define DIR_SEPARATOR '/'\n# define PATH_SEPARATOR ':'\n#endif\n\n#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \\\n  defined (__OS2__)\n# define HAVE_DOS_BASED_FILE_SYSTEM\n# define FOPEN_WB \"wb\"\n# ifndef DIR_SEPARATOR_2\n#  define DIR_SEPARATOR_2 '\\\\'\n# endif\n# ifndef PATH_SEPARATOR_2\n#  define PATH_SEPARATOR_2 ';'\n# endif\n#endif\n\n#ifndef DIR_SEPARATOR_2\n# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)\n#else /* DIR_SEPARATOR_2 */\n# define IS_DIR_SEPARATOR(ch) \\\n\t(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))\n#endif /* DIR_SEPARATOR_2 */\n\n#ifndef PATH_SEPARATOR_2\n# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)\n#else /* PATH_SEPARATOR_2 */\n# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)\n#endif /* PATH_SEPARATOR_2 */\n\n#ifdef __CYGWIN__\n# define FOPEN_WB \"wb\"\n#endif\n\n#ifndef FOPEN_WB\n# define FOPEN_WB \"w\"\n#endif\n#ifndef _O_BINARY\n# define _O_BINARY 0\n#endif\n\n#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))\n#define XFREE(stale) do { \\\n  if (stale) { free ((void *) stale); stale = 0; } \\\n} while (0)\n\n#undef LTWRAPPER_DEBUGPRINTF\n#if defined DEBUGWRAPPER\n# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args\nstatic void\nltwrapper_debugprintf (const char *fmt, ...)\n{\n    va_list args;\n    va_start (args, fmt);\n    (void) vfprintf (stderr, fmt, args);\n    va_end (args);\n}\n#else\n# define LTWRAPPER_DEBUGPRINTF(args)\n#endif\n\nconst char *program_name = NULL;\n\nvoid *xmalloc (size_t num);\nchar *xstrdup (const char *string);\nconst char *base_name (const char *name);\nchar *find_executable (const char *wrapper);\nchar *chase_symlinks (const char *pathspec);\nint make_executable (const char *path);\nint check_executable (const char *path);\nchar *strendzap (char *str, const char *pat);\nvoid lt_fatal (const char *message, ...);\nvoid lt_setenv (const char *name, const char *value);\nchar *lt_extend_str (const char *orig_value, const char *add, int to_end);\nvoid lt_opt_process_env_set (const char *arg);\nvoid lt_opt_process_env_prepend (const char *arg);\nvoid lt_opt_process_env_append (const char *arg);\nint lt_split_name_value (const char *arg, char** name, char** value);\nvoid lt_update_exe_path (const char *name, const char *value);\nvoid lt_update_lib_path (const char *name, const char *value);\n\nstatic const char *script_text_part1 =\nEOF\n\n\t    func_emit_wrapper_part1 yes |\n\t        $SED -e 's/\\([\\\\\"]\\)/\\\\\\1/g' \\\n\t             -e 's/^/  \"/' -e 's/$/\\\\n\"/'\n\t    echo \";\"\n\t    cat <<EOF\n\nstatic const char *script_text_part2 =\nEOF\n\t    func_emit_wrapper_part2 yes |\n\t        $SED -e 's/\\([\\\\\"]\\)/\\\\\\1/g' \\\n\t             -e 's/^/  \"/' -e 's/$/\\\\n\"/'\n\t    echo \";\"\n\n\t    cat <<EOF\nconst char * MAGIC_EXE = \"$magic_exe\";\nconst char * LIB_PATH_VARNAME = \"$shlibpath_var\";\nEOF\n\n\t    if test \"$shlibpath_overrides_runpath\" = yes && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n              func_to_host_pathlist \"$temp_rpath\"\n\t      cat <<EOF\nconst char * LIB_PATH_VALUE   = \"$func_to_host_pathlist_result\";\nEOF\n\t    else\n\t      cat <<\"EOF\"\nconst char * LIB_PATH_VALUE   = \"\";\nEOF\n\t    fi\n\n\t    if test -n \"$dllsearchpath\"; then\n              func_to_host_pathlist \"$dllsearchpath:\"\n\t      cat <<EOF\nconst char * EXE_PATH_VARNAME = \"PATH\";\nconst char * EXE_PATH_VALUE   = \"$func_to_host_pathlist_result\";\nEOF\n\t    else\n\t      cat <<\"EOF\"\nconst char * EXE_PATH_VARNAME = \"\";\nconst char * EXE_PATH_VALUE   = \"\";\nEOF\n\t    fi\n\n\t    if test \"$fast_install\" = yes; then\n\t      cat <<EOF\nconst char * TARGET_PROGRAM_NAME = \"lt-$outputname\"; /* hopefully, no .exe */\nEOF\n\t    else\n\t      cat <<EOF\nconst char * TARGET_PROGRAM_NAME = \"$outputname\"; /* hopefully, no .exe */\nEOF\n\t    fi\n\n\n\t    cat <<\"EOF\"\n\n#define LTWRAPPER_OPTION_PREFIX         \"--lt-\"\n#define LTWRAPPER_OPTION_PREFIX_LENGTH  5\n\nstatic const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;\nstatic const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;\n\nstatic const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX \"dump-script\";\n\nstatic const size_t env_set_opt_len     = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;\nstatic const char *env_set_opt          = LTWRAPPER_OPTION_PREFIX \"env-set\";\n  /* argument is putenv-style \"foo=bar\", value of foo is set to bar */\n\nstatic const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;\nstatic const char *env_prepend_opt      = LTWRAPPER_OPTION_PREFIX \"env-prepend\";\n  /* argument is putenv-style \"foo=bar\", new value of foo is bar${foo} */\n\nstatic const size_t env_append_opt_len  = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;\nstatic const char *env_append_opt       = LTWRAPPER_OPTION_PREFIX \"env-append\";\n  /* argument is putenv-style \"foo=bar\", new value of foo is ${foo}bar */\n\nint\nmain (int argc, char *argv[])\n{\n  char **newargz;\n  int  newargc;\n  char *tmp_pathspec;\n  char *actual_cwrapper_path;\n  char *actual_cwrapper_name;\n  char *target_name;\n  char *lt_argv_zero;\n  intptr_t rval = 127;\n\n  int i;\n\n  program_name = (char *) xstrdup (base_name (argv[0]));\n  LTWRAPPER_DEBUGPRINTF ((\"(main) argv[0]      : %s\\n\", argv[0]));\n  LTWRAPPER_DEBUGPRINTF ((\"(main) program_name : %s\\n\", program_name));\n\n  /* very simple arg parsing; don't want to rely on getopt */\n  for (i = 1; i < argc; i++)\n    {\n      if (strcmp (argv[i], dumpscript_opt) == 0)\n\t{\nEOF\n\t    case \"$host\" in\n\t      *mingw* | *cygwin* )\n\t\t# make stdout use \"unix\" line endings\n\t\techo \"          setmode(1,_O_BINARY);\"\n\t\t;;\n\t      esac\n\n\t    cat <<\"EOF\"\n\t  printf (\"%s\", script_text_part1);\n\t  printf (\"%s\", script_text_part2);\n\t  return 0;\n\t}\n    }\n\n  newargz = XMALLOC (char *, argc + 1);\n  tmp_pathspec = find_executable (argv[0]);\n  if (tmp_pathspec == NULL)\n    lt_fatal (\"Couldn't find %s\", argv[0]);\n  LTWRAPPER_DEBUGPRINTF ((\"(main) found exe (before symlink chase) at : %s\\n\",\n\t\t\t  tmp_pathspec));\n\n  actual_cwrapper_path = chase_symlinks (tmp_pathspec);\n  LTWRAPPER_DEBUGPRINTF ((\"(main) found exe (after symlink chase) at : %s\\n\",\n\t\t\t  actual_cwrapper_path));\n  XFREE (tmp_pathspec);\n\n  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));\n  strendzap (actual_cwrapper_path, actual_cwrapper_name);\n\n  /* wrapper name transforms */\n  strendzap (actual_cwrapper_name, \".exe\");\n  tmp_pathspec = lt_extend_str (actual_cwrapper_name, \".exe\", 1);\n  XFREE (actual_cwrapper_name);\n  actual_cwrapper_name = tmp_pathspec;\n  tmp_pathspec = 0;\n\n  /* target_name transforms -- use actual target program name; might have lt- prefix */\n  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));\n  strendzap (target_name, \".exe\");\n  tmp_pathspec = lt_extend_str (target_name, \".exe\", 1);\n  XFREE (target_name);\n  target_name = tmp_pathspec;\n  tmp_pathspec = 0;\n\n  LTWRAPPER_DEBUGPRINTF ((\"(main) libtool target name: %s\\n\",\n\t\t\t  target_name));\nEOF\n\n\t    cat <<EOF\n  newargz[0] =\n    XMALLOC (char, (strlen (actual_cwrapper_path) +\n\t\t    strlen (\"$objdir\") + 1 + strlen (actual_cwrapper_name) + 1));\n  strcpy (newargz[0], actual_cwrapper_path);\n  strcat (newargz[0], \"$objdir\");\n  strcat (newargz[0], \"/\");\nEOF\n\n\t    cat <<\"EOF\"\n  /* stop here, and copy so we don't have to do this twice */\n  tmp_pathspec = xstrdup (newargz[0]);\n\n  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */\n  strcat (newargz[0], actual_cwrapper_name);\n\n  /* DO want the lt- prefix here if it exists, so use target_name */\n  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);\n  XFREE (tmp_pathspec);\n  tmp_pathspec = NULL;\nEOF\n\n\t    case $host_os in\n\t      mingw*)\n\t    cat <<\"EOF\"\n  {\n    char* p;\n    while ((p = strchr (newargz[0], '\\\\')) != NULL)\n      {\n\t*p = '/';\n      }\n    while ((p = strchr (lt_argv_zero, '\\\\')) != NULL)\n      {\n\t*p = '/';\n      }\n  }\nEOF\n\t    ;;\n\t    esac\n\n\t    cat <<\"EOF\"\n  XFREE (target_name);\n  XFREE (actual_cwrapper_path);\n  XFREE (actual_cwrapper_name);\n\n  lt_setenv (\"BIN_SH\", \"xpg4\"); /* for Tru64 */\n  lt_setenv (\"DUALCASE\", \"1\");  /* for MSK sh */\n  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);\n  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);\n\n  newargc=0;\n  for (i = 1; i < argc; i++)\n    {\n      if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)\n        {\n          if (argv[i][env_set_opt_len] == '=')\n            {\n              const char *p = argv[i] + env_set_opt_len + 1;\n              lt_opt_process_env_set (p);\n            }\n          else if (argv[i][env_set_opt_len] == '\\0' && i + 1 < argc)\n            {\n              lt_opt_process_env_set (argv[++i]); /* don't copy */\n            }\n          else\n            lt_fatal (\"%s missing required argument\", env_set_opt);\n          continue;\n        }\n      if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)\n        {\n          if (argv[i][env_prepend_opt_len] == '=')\n            {\n              const char *p = argv[i] + env_prepend_opt_len + 1;\n              lt_opt_process_env_prepend (p);\n            }\n          else if (argv[i][env_prepend_opt_len] == '\\0' && i + 1 < argc)\n            {\n              lt_opt_process_env_prepend (argv[++i]); /* don't copy */\n            }\n          else\n            lt_fatal (\"%s missing required argument\", env_prepend_opt);\n          continue;\n        }\n      if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)\n        {\n          if (argv[i][env_append_opt_len] == '=')\n            {\n              const char *p = argv[i] + env_append_opt_len + 1;\n              lt_opt_process_env_append (p);\n            }\n          else if (argv[i][env_append_opt_len] == '\\0' && i + 1 < argc)\n            {\n              lt_opt_process_env_append (argv[++i]); /* don't copy */\n            }\n          else\n            lt_fatal (\"%s missing required argument\", env_append_opt);\n          continue;\n        }\n      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)\n        {\n          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX\n             namespace, but it is not one of the ones we know about and\n             have already dealt with, above (inluding dump-script), then\n             report an error. Otherwise, targets might begin to believe\n             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX\n             namespace. The first time any user complains about this, we'll\n             need to make LTWRAPPER_OPTION_PREFIX a configure-time option\n             or a configure.ac-settable value.\n           */\n          lt_fatal (\"Unrecognized option in %s namespace: '%s'\",\n                    ltwrapper_option_prefix, argv[i]);\n        }\n      /* otherwise ... */\n      newargz[++newargc] = xstrdup (argv[i]);\n    }\n  newargz[++newargc] = NULL;\n\n  LTWRAPPER_DEBUGPRINTF     ((\"(main) lt_argv_zero : %s\\n\", (lt_argv_zero ? lt_argv_zero : \"<NULL>\")));\n  for (i = 0; i < newargc; i++)\n    {\n      LTWRAPPER_DEBUGPRINTF ((\"(main) newargz[%d]   : %s\\n\", i, (newargz[i] ? newargz[i] : \"<NULL>\")));\n    }\n\nEOF\n\n\t    case $host_os in\n\t      mingw*)\n\t\tcat <<\"EOF\"\n  /* execv doesn't actually work on mingw as expected on unix */\n  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);\n  if (rval == -1)\n    {\n      /* failed to start process */\n      LTWRAPPER_DEBUGPRINTF ((\"(main) failed to launch target \\\"%s\\\": errno = %d\\n\", lt_argv_zero, errno));\n      return 127;\n    }\n  return rval;\nEOF\n\t\t;;\n\t      *)\n\t\tcat <<\"EOF\"\n  execv (lt_argv_zero, newargz);\n  return rval; /* =127, but avoids unused variable warning */\nEOF\n\t\t;;\n\t    esac\n\n\t    cat <<\"EOF\"\n}\n\nvoid *\nxmalloc (size_t num)\n{\n  void *p = (void *) malloc (num);\n  if (!p)\n    lt_fatal (\"Memory exhausted\");\n\n  return p;\n}\n\nchar *\nxstrdup (const char *string)\n{\n  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),\n\t\t\t  string) : NULL;\n}\n\nconst char *\nbase_name (const char *name)\n{\n  const char *base;\n\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n  /* Skip over the disk name in MSDOS pathnames. */\n  if (isalpha ((unsigned char) name[0]) && name[1] == ':')\n    name += 2;\n#endif\n\n  for (base = name; *name; name++)\n    if (IS_DIR_SEPARATOR (*name))\n      base = name + 1;\n  return base;\n}\n\nint\ncheck_executable (const char *path)\n{\n  struct stat st;\n\n  LTWRAPPER_DEBUGPRINTF ((\"(check_executable)  : %s\\n\",\n\t\t\t  path ? (*path ? path : \"EMPTY!\") : \"NULL!\"));\n  if ((!path) || (!*path))\n    return 0;\n\n  if ((stat (path, &st) >= 0)\n      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))\n    return 1;\n  else\n    return 0;\n}\n\nint\nmake_executable (const char *path)\n{\n  int rval = 0;\n  struct stat st;\n\n  LTWRAPPER_DEBUGPRINTF ((\"(make_executable)   : %s\\n\",\n\t\t\t  path ? (*path ? path : \"EMPTY!\") : \"NULL!\"));\n  if ((!path) || (!*path))\n    return 0;\n\n  if (stat (path, &st) >= 0)\n    {\n      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);\n    }\n  return rval;\n}\n\n/* Searches for the full path of the wrapper.  Returns\n   newly allocated full path name if found, NULL otherwise\n   Does not chase symlinks, even on platforms that support them.\n*/\nchar *\nfind_executable (const char *wrapper)\n{\n  int has_slash = 0;\n  const char *p;\n  const char *p_next;\n  /* static buffer for getcwd */\n  char tmp[LT_PATHMAX + 1];\n  int tmp_len;\n  char *concat_name;\n\n  LTWRAPPER_DEBUGPRINTF ((\"(find_executable)   : %s\\n\",\n\t\t\t  wrapper ? (*wrapper ? wrapper : \"EMPTY!\") : \"NULL!\"));\n\n  if ((wrapper == NULL) || (*wrapper == '\\0'))\n    return NULL;\n\n  /* Absolute path? */\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')\n    {\n      concat_name = xstrdup (wrapper);\n      if (check_executable (concat_name))\n\treturn concat_name;\n      XFREE (concat_name);\n    }\n  else\n    {\n#endif\n      if (IS_DIR_SEPARATOR (wrapper[0]))\n\t{\n\t  concat_name = xstrdup (wrapper);\n\t  if (check_executable (concat_name))\n\t    return concat_name;\n\t  XFREE (concat_name);\n\t}\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n    }\n#endif\n\n  for (p = wrapper; *p; p++)\n    if (*p == '/')\n      {\n\thas_slash = 1;\n\tbreak;\n      }\n  if (!has_slash)\n    {\n      /* no slashes; search PATH */\n      const char *path = getenv (\"PATH\");\n      if (path != NULL)\n\t{\n\t  for (p = path; *p; p = p_next)\n\t    {\n\t      const char *q;\n\t      size_t p_len;\n\t      for (q = p; *q; q++)\n\t\tif (IS_PATH_SEPARATOR (*q))\n\t\t  break;\n\t      p_len = q - p;\n\t      p_next = (*q == '\\0' ? q : q + 1);\n\t      if (p_len == 0)\n\t\t{\n\t\t  /* empty path: current directory */\n\t\t  if (getcwd (tmp, LT_PATHMAX) == NULL)\n\t\t    lt_fatal (\"getcwd failed\");\n\t\t  tmp_len = strlen (tmp);\n\t\t  concat_name =\n\t\t    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);\n\t\t  memcpy (concat_name, tmp, tmp_len);\n\t\t  concat_name[tmp_len] = '/';\n\t\t  strcpy (concat_name + tmp_len + 1, wrapper);\n\t\t}\n\t      else\n\t\t{\n\t\t  concat_name =\n\t\t    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);\n\t\t  memcpy (concat_name, p, p_len);\n\t\t  concat_name[p_len] = '/';\n\t\t  strcpy (concat_name + p_len + 1, wrapper);\n\t\t}\n\t      if (check_executable (concat_name))\n\t\treturn concat_name;\n\t      XFREE (concat_name);\n\t    }\n\t}\n      /* not found in PATH; assume curdir */\n    }\n  /* Relative path | not found in path: prepend cwd */\n  if (getcwd (tmp, LT_PATHMAX) == NULL)\n    lt_fatal (\"getcwd failed\");\n  tmp_len = strlen (tmp);\n  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);\n  memcpy (concat_name, tmp, tmp_len);\n  concat_name[tmp_len] = '/';\n  strcpy (concat_name + tmp_len + 1, wrapper);\n\n  if (check_executable (concat_name))\n    return concat_name;\n  XFREE (concat_name);\n  return NULL;\n}\n\nchar *\nchase_symlinks (const char *pathspec)\n{\n#ifndef S_ISLNK\n  return xstrdup (pathspec);\n#else\n  char buf[LT_PATHMAX];\n  struct stat s;\n  char *tmp_pathspec = xstrdup (pathspec);\n  char *p;\n  int has_symlinks = 0;\n  while (strlen (tmp_pathspec) && !has_symlinks)\n    {\n      LTWRAPPER_DEBUGPRINTF ((\"checking path component for symlinks: %s\\n\",\n\t\t\t      tmp_pathspec));\n      if (lstat (tmp_pathspec, &s) == 0)\n\t{\n\t  if (S_ISLNK (s.st_mode) != 0)\n\t    {\n\t      has_symlinks = 1;\n\t      break;\n\t    }\n\n\t  /* search backwards for last DIR_SEPARATOR */\n\t  p = tmp_pathspec + strlen (tmp_pathspec) - 1;\n\t  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))\n\t    p--;\n\t  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))\n\t    {\n\t      /* no more DIR_SEPARATORS left */\n\t      break;\n\t    }\n\t  *p = '\\0';\n\t}\n      else\n\t{\n\t  char *errstr = strerror (errno);\n\t  lt_fatal (\"Error accessing file %s (%s)\", tmp_pathspec, errstr);\n\t}\n    }\n  XFREE (tmp_pathspec);\n\n  if (!has_symlinks)\n    {\n      return xstrdup (pathspec);\n    }\n\n  tmp_pathspec = realpath (pathspec, buf);\n  if (tmp_pathspec == 0)\n    {\n      lt_fatal (\"Could not follow symlinks for %s\", pathspec);\n    }\n  return xstrdup (tmp_pathspec);\n#endif\n}\n\nchar *\nstrendzap (char *str, const char *pat)\n{\n  size_t len, patlen;\n\n  assert (str != NULL);\n  assert (pat != NULL);\n\n  len = strlen (str);\n  patlen = strlen (pat);\n\n  if (patlen <= len)\n    {\n      str += len - patlen;\n      if (strcmp (str, pat) == 0)\n\t*str = '\\0';\n    }\n  return str;\n}\n\nstatic void\nlt_error_core (int exit_status, const char *mode,\n\t       const char *message, va_list ap)\n{\n  fprintf (stderr, \"%s: %s: \", program_name, mode);\n  vfprintf (stderr, message, ap);\n  fprintf (stderr, \".\\n\");\n\n  if (exit_status >= 0)\n    exit (exit_status);\n}\n\nvoid\nlt_fatal (const char *message, ...)\n{\n  va_list ap;\n  va_start (ap, message);\n  lt_error_core (EXIT_FAILURE, \"FATAL\", message, ap);\n  va_end (ap);\n}\n\nvoid\nlt_setenv (const char *name, const char *value)\n{\n  LTWRAPPER_DEBUGPRINTF ((\"(lt_setenv) setting '%s' to '%s'\\n\",\n                          (name ? name : \"<NULL>\"),\n                          (value ? value : \"<NULL>\")));\n  {\n#ifdef HAVE_SETENV\n    /* always make a copy, for consistency with !HAVE_SETENV */\n    char *str = xstrdup (value);\n    setenv (name, str, 1);\n#else\n    int len = strlen (name) + 1 + strlen (value) + 1;\n    char *str = XMALLOC (char, len);\n    sprintf (str, \"%s=%s\", name, value);\n    if (putenv (str) != EXIT_SUCCESS)\n      {\n        XFREE (str);\n      }\n#endif\n  }\n}\n\nchar *\nlt_extend_str (const char *orig_value, const char *add, int to_end)\n{\n  char *new_value;\n  if (orig_value && *orig_value)\n    {\n      int orig_value_len = strlen (orig_value);\n      int add_len = strlen (add);\n      new_value = XMALLOC (char, add_len + orig_value_len + 1);\n      if (to_end)\n        {\n          strcpy (new_value, orig_value);\n          strcpy (new_value + orig_value_len, add);\n        }\n      else\n        {\n          strcpy (new_value, add);\n          strcpy (new_value + add_len, orig_value);\n        }\n    }\n  else\n    {\n      new_value = xstrdup (add);\n    }\n  return new_value;\n}\n\nint\nlt_split_name_value (const char *arg, char** name, char** value)\n{\n  const char *p;\n  int len;\n  if (!arg || !*arg)\n    return 1;\n\n  p = strchr (arg, (int)'=');\n\n  if (!p)\n    return 1;\n\n  *value = xstrdup (++p);\n\n  len = strlen (arg) - strlen (*value);\n  *name = XMALLOC (char, len);\n  strncpy (*name, arg, len-1);\n  (*name)[len - 1] = '\\0';\n\n  return 0;\n}\n\nvoid\nlt_opt_process_env_set (const char *arg)\n{\n  char *name = NULL;\n  char *value = NULL;\n\n  if (lt_split_name_value (arg, &name, &value) != 0)\n    {\n      XFREE (name);\n      XFREE (value);\n      lt_fatal (\"bad argument for %s: '%s'\", env_set_opt, arg);\n    }\n\n  lt_setenv (name, value);\n  XFREE (name);\n  XFREE (value);\n}\n\nvoid\nlt_opt_process_env_prepend (const char *arg)\n{\n  char *name = NULL;\n  char *value = NULL;\n  char *new_value = NULL;\n\n  if (lt_split_name_value (arg, &name, &value) != 0)\n    {\n      XFREE (name);\n      XFREE (value);\n      lt_fatal (\"bad argument for %s: '%s'\", env_prepend_opt, arg);\n    }\n\n  new_value = lt_extend_str (getenv (name), value, 0);\n  lt_setenv (name, new_value);\n  XFREE (new_value);\n  XFREE (name);\n  XFREE (value);\n}\n\nvoid\nlt_opt_process_env_append (const char *arg)\n{\n  char *name = NULL;\n  char *value = NULL;\n  char *new_value = NULL;\n\n  if (lt_split_name_value (arg, &name, &value) != 0)\n    {\n      XFREE (name);\n      XFREE (value);\n      lt_fatal (\"bad argument for %s: '%s'\", env_append_opt, arg);\n    }\n\n  new_value = lt_extend_str (getenv (name), value, 1);\n  lt_setenv (name, new_value);\n  XFREE (new_value);\n  XFREE (name);\n  XFREE (value);\n}\n\nvoid\nlt_update_exe_path (const char *name, const char *value)\n{\n  LTWRAPPER_DEBUGPRINTF ((\"(lt_update_exe_path) modifying '%s' by prepending '%s'\\n\",\n                          (name ? name : \"<NULL>\"),\n                          (value ? value : \"<NULL>\")));\n\n  if (name && *name && value && *value)\n    {\n      char *new_value = lt_extend_str (getenv (name), value, 0);\n      /* some systems can't cope with a ':'-terminated path #' */\n      int len = strlen (new_value);\n      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))\n        {\n          new_value[len-1] = '\\0';\n        }\n      lt_setenv (name, new_value);\n      XFREE (new_value);\n    }\n}\n\nvoid\nlt_update_lib_path (const char *name, const char *value)\n{\n  LTWRAPPER_DEBUGPRINTF ((\"(lt_update_lib_path) modifying '%s' by prepending '%s'\\n\",\n                          (name ? name : \"<NULL>\"),\n                          (value ? value : \"<NULL>\")));\n\n  if (name && *name && value && *value)\n    {\n      char *new_value = lt_extend_str (getenv (name), value, 0);\n      lt_setenv (name, new_value);\n      XFREE (new_value);\n    }\n}\n\n\nEOF\n}\n# end: func_emit_cwrapperexe_src\n\n# func_mode_link arg...\nfunc_mode_link ()\n{\n    $opt_debug\n    case $host in\n    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n      # It is impossible to link a dll without this setting, and\n      # we shouldn't force the makefile maintainer to figure out\n      # which system we are compiling for in order to pass an extra\n      # flag for every libtool invocation.\n      # allow_undefined=no\n\n      # FIXME: Unfortunately, there are problems with the above when trying\n      # to make a dll which has undefined symbols, in which case not\n      # even a static library is built.  For now, we need to specify\n      # -no-undefined on the libtool link line when we can be certain\n      # that all symbols are satisfied, otherwise we get a static library.\n      allow_undefined=yes\n      ;;\n    *)\n      allow_undefined=yes\n      ;;\n    esac\n    libtool_args=$nonopt\n    base_compile=\"$nonopt $@\"\n    compile_command=$nonopt\n    finalize_command=$nonopt\n\n    compile_rpath=\n    finalize_rpath=\n    compile_shlibpath=\n    finalize_shlibpath=\n    convenience=\n    old_convenience=\n    deplibs=\n    old_deplibs=\n    compiler_flags=\n    linker_flags=\n    dllsearchpath=\n    lib_search_path=`pwd`\n    inst_prefix_dir=\n    new_inherited_linker_flags=\n\n    avoid_version=no\n    dlfiles=\n    dlprefiles=\n    dlself=no\n    export_dynamic=no\n    export_symbols=\n    export_symbols_regex=\n    generated=\n    libobjs=\n    ltlibs=\n    module=no\n    no_install=no\n    objs=\n    non_pic_objects=\n    precious_files_regex=\n    prefer_static_libs=no\n    preload=no\n    prev=\n    prevarg=\n    release=\n    rpath=\n    xrpath=\n    perm_rpath=\n    temp_rpath=\n    thread_safe=no\n    vinfo=\n    vinfo_number=no\n    weak_libs=\n    single_module=\"${wl}-single_module\"\n    func_infer_tag $base_compile\n\n    # We need to know -static, to get the right output filenames.\n    for arg\n    do\n      case $arg in\n      -shared)\n\ttest \"$build_libtool_libs\" != yes && \\\n\t  func_fatal_configuration \"can not build a shared library\"\n\tbuild_old_libs=no\n\tbreak\n\t;;\n      -all-static | -static | -static-libtool-libs)\n\tcase $arg in\n\t-all-static)\n\t  if test \"$build_libtool_libs\" = yes && test -z \"$link_static_flag\"; then\n\t    func_warning \"complete static linking is impossible in this configuration\"\n\t  fi\n\t  if test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=yes\n\t  ;;\n\t-static)\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=built\n\t  ;;\n\t-static-libtool-libs)\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=yes\n\t  ;;\n\tesac\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tbreak\n\t;;\n      esac\n    done\n\n    # See if our shared archives depend on static archives.\n    test -n \"$old_archive_from_new_cmds\" && build_old_libs=yes\n\n    # Go through the arguments, transforming them on the way.\n    while test \"$#\" -gt 0; do\n      arg=\"$1\"\n      shift\n      func_quote_for_eval \"$arg\"\n      qarg=$func_quote_for_eval_unquoted_result\n      func_append libtool_args \" $func_quote_for_eval_result\"\n\n      # If the previous option needs an argument, assign it.\n      if test -n \"$prev\"; then\n\tcase $prev in\n\toutput)\n\t  func_append compile_command \" @OUTPUT@\"\n\t  func_append finalize_command \" @OUTPUT@\"\n\t  ;;\n\tesac\n\n\tcase $prev in\n\tdlfiles|dlprefiles)\n\t  if test \"$preload\" = no; then\n\t    # Add the symbol object into the linking commands.\n\t    func_append compile_command \" @SYMFILE@\"\n\t    func_append finalize_command \" @SYMFILE@\"\n\t    preload=yes\n\t  fi\n\t  case $arg in\n\t  *.la | *.lo) ;;  # We handle these cases below.\n\t  force)\n\t    if test \"$dlself\" = no; then\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  self)\n\t    if test \"$prev\" = dlprefiles; then\n\t      dlself=yes\n\t    elif test \"$prev\" = dlfiles && test \"$dlopen_self\" != yes; then\n\t      dlself=yes\n\t    else\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  *)\n\t    if test \"$prev\" = dlfiles; then\n\t      dlfiles=\"$dlfiles $arg\"\n\t    else\n\t      dlprefiles=\"$dlprefiles $arg\"\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  esac\n\t  ;;\n\texpsyms)\n\t  export_symbols=\"$arg\"\n\t  test -f \"$arg\" \\\n\t    || func_fatal_error \"symbol file \\`$arg' does not exist\"\n\t  prev=\n\t  continue\n\t  ;;\n\texpsyms_regex)\n\t  export_symbols_regex=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tframework)\n\t  case $host in\n\t    *-*-darwin*)\n\t      case \"$deplibs \" in\n\t\t*\" $qarg.ltframework \"*) ;;\n\t\t*) deplibs=\"$deplibs $qarg.ltframework\" # this is fixed later\n\t\t   ;;\n\t      esac\n\t      ;;\n\t  esac\n\t  prev=\n\t  continue\n\t  ;;\n\tinst_prefix)\n\t  inst_prefix_dir=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tobjectlist)\n\t  if test -f \"$arg\"; then\n\t    save_arg=$arg\n\t    moreargs=\n\t    for fil in `cat \"$save_arg\"`\n\t    do\n#\t      moreargs=\"$moreargs $fil\"\n\t      arg=$fil\n\t      # A libtool-controlled object.\n\n\t      # Check to see that this really is a libtool object.\n\t      if func_lalib_unsafe_p \"$arg\"; then\n\t\tpic_object=\n\t\tnon_pic_object=\n\n\t\t# Read the .lo file\n\t\tfunc_source \"$arg\"\n\n\t\tif test -z \"$pic_object\" ||\n\t\t   test -z \"$non_pic_object\" ||\n\t\t   test \"$pic_object\" = none &&\n\t\t   test \"$non_pic_object\" = none; then\n\t\t  func_fatal_error \"cannot find name of object for \\`$arg'\"\n\t\tfi\n\n\t\t# Extract subdirectory from the argument.\n\t\tfunc_dirname \"$arg\" \"/\" \"\"\n\t\txdir=\"$func_dirname_result\"\n\n\t\tif test \"$pic_object\" != none; then\n\t\t  # Prepend the subdirectory the object is found in.\n\t\t  pic_object=\"$xdir$pic_object\"\n\n\t\t  if test \"$prev\" = dlfiles; then\n\t\t    if test \"$build_libtool_libs\" = yes && test \"$dlopen_support\" = yes; then\n\t\t      dlfiles=\"$dlfiles $pic_object\"\n\t\t      prev=\n\t\t      continue\n\t\t    else\n\t\t      # If libtool objects are unsupported, then we need to preload.\n\t\t      prev=dlprefiles\n\t\t    fi\n\t\t  fi\n\n\t\t  # CHECK ME:  I think I busted this.  -Ossama\n\t\t  if test \"$prev\" = dlprefiles; then\n\t\t    # Preload the old-style object.\n\t\t    dlprefiles=\"$dlprefiles $pic_object\"\n\t\t    prev=\n\t\t  fi\n\n\t\t  # A PIC object.\n\t\t  func_append libobjs \" $pic_object\"\n\t\t  arg=\"$pic_object\"\n\t\tfi\n\n\t\t# Non-PIC object.\n\t\tif test \"$non_pic_object\" != none; then\n\t\t  # Prepend the subdirectory the object is found in.\n\t\t  non_pic_object=\"$xdir$non_pic_object\"\n\n\t\t  # A standard non-PIC object\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t\t  if test -z \"$pic_object\" || test \"$pic_object\" = none ; then\n\t\t    arg=\"$non_pic_object\"\n\t\t  fi\n\t\telse\n\t\t  # If the PIC object exists, use it instead.\n\t\t  # $xdir was prepended to $pic_object above.\n\t\t  non_pic_object=\"$pic_object\"\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t\tfi\n\t      else\n\t\t# Only an error if not doing a dry-run.\n\t\tif $opt_dry_run; then\n\t\t  # Extract subdirectory from the argument.\n\t\t  func_dirname \"$arg\" \"/\" \"\"\n\t\t  xdir=\"$func_dirname_result\"\n\n\t\t  func_lo2o \"$arg\"\n\t\t  pic_object=$xdir$objdir/$func_lo2o_result\n\t\t  non_pic_object=$xdir$func_lo2o_result\n\t\t  func_append libobjs \" $pic_object\"\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t        else\n\t\t  func_fatal_error \"\\`$arg' is not a valid libtool object\"\n\t\tfi\n\t      fi\n\t    done\n\t  else\n\t    func_fatal_error \"link input file \\`$arg' does not exist\"\n\t  fi\n\t  arg=$save_arg\n\t  prev=\n\t  continue\n\t  ;;\n\tprecious_regex)\n\t  precious_files_regex=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trelease)\n\t  release=\"-$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trpath | xrpath)\n\t  # We need an absolute path.\n\t  case $arg in\n\t  [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t  *)\n\t    func_fatal_error \"only absolute run-paths are allowed\"\n\t    ;;\n\t  esac\n\t  if test \"$prev\" = rpath; then\n\t    case \"$rpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) rpath=\"$rpath $arg\" ;;\n\t    esac\n\t  else\n\t    case \"$xrpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) xrpath=\"$xrpath $arg\" ;;\n\t    esac\n\t  fi\n\t  prev=\n\t  continue\n\t  ;;\n\tshrext)\n\t  shrext_cmds=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tweak)\n\t  weak_libs=\"$weak_libs $arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\txcclinker)\n\t  linker_flags=\"$linker_flags $qarg\"\n\t  compiler_flags=\"$compiler_flags $qarg\"\n\t  prev=\n\t  func_append compile_command \" $qarg\"\n\t  func_append finalize_command \" $qarg\"\n\t  continue\n\t  ;;\n\txcompiler)\n\t  compiler_flags=\"$compiler_flags $qarg\"\n\t  prev=\n\t  func_append compile_command \" $qarg\"\n\t  func_append finalize_command \" $qarg\"\n\t  continue\n\t  ;;\n\txlinker)\n\t  linker_flags=\"$linker_flags $qarg\"\n\t  compiler_flags=\"$compiler_flags $wl$qarg\"\n\t  prev=\n\t  func_append compile_command \" $wl$qarg\"\n\t  func_append finalize_command \" $wl$qarg\"\n\t  continue\n\t  ;;\n\t*)\n\t  eval \"$prev=\\\"\\$arg\\\"\"\n\t  prev=\n\t  continue\n\t  ;;\n\tesac\n      fi # test -n \"$prev\"\n\n      prevarg=\"$arg\"\n\n      case $arg in\n      -all-static)\n\tif test -n \"$link_static_flag\"; then\n\t  # See comment for -static flag below, for more details.\n\t  func_append compile_command \" $link_static_flag\"\n\t  func_append finalize_command \" $link_static_flag\"\n\tfi\n\tcontinue\n\t;;\n\n      -allow-undefined)\n\t# FIXME: remove this flag sometime in the future.\n\tfunc_fatal_error \"\\`-allow-undefined' must not be used because it is the default\"\n\t;;\n\n      -avoid-version)\n\tavoid_version=yes\n\tcontinue\n\t;;\n\n      -dlopen)\n\tprev=dlfiles\n\tcontinue\n\t;;\n\n      -dlpreopen)\n\tprev=dlprefiles\n\tcontinue\n\t;;\n\n      -export-dynamic)\n\texport_dynamic=yes\n\tcontinue\n\t;;\n\n      -export-symbols | -export-symbols-regex)\n\tif test -n \"$export_symbols\" || test -n \"$export_symbols_regex\"; then\n\t  func_fatal_error \"more than one -exported-symbols argument is not allowed\"\n\tfi\n\tif test \"X$arg\" = \"X-export-symbols\"; then\n\t  prev=expsyms\n\telse\n\t  prev=expsyms_regex\n\tfi\n\tcontinue\n\t;;\n\n      -framework)\n\tprev=framework\n\tcontinue\n\t;;\n\n      -inst-prefix-dir)\n\tprev=inst_prefix\n\tcontinue\n\t;;\n\n      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*\n      # so, if we see these flags be careful not to treat them like -L\n      -L[A-Z][A-Z]*:*)\n\tcase $with_gcc/$host in\n\tno/*-*-irix* | /*-*-irix*)\n\t  func_append compile_command \" $arg\"\n\t  func_append finalize_command \" $arg\"\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -L*)\n\tfunc_stripname '-L' '' \"$arg\"\n\tdir=$func_stripname_result\n\tif test -z \"$dir\"; then\n\t  if test \"$#\" -gt 0; then\n\t    func_fatal_error \"require no space between \\`-L' and \\`$1'\"\n\t  else\n\t    func_fatal_error \"need path for \\`-L' option\"\n\t  fi\n\tfi\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t*)\n\t  absdir=`cd \"$dir\" && pwd`\n\t  test -z \"$absdir\" && \\\n\t    func_fatal_error \"cannot determine absolute directory name of \\`$dir'\"\n\t  dir=\"$absdir\"\n\t  ;;\n\tesac\n\tcase \"$deplibs \" in\n\t*\" -L$dir \"*) ;;\n\t*)\n\t  deplibs=\"$deplibs -L$dir\"\n\t  lib_search_path=\"$lib_search_path $dir\"\n\t  ;;\n\tesac\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n\t  testbindir=`$ECHO \"X$dir\" | $Xsed -e 's*/lib$*/bin*'`\n\t  case :$dllsearchpath: in\n\t  *\":$dir:\"*) ;;\n\t  ::) dllsearchpath=$dir;;\n\t  *) dllsearchpath=\"$dllsearchpath:$dir\";;\n\t  esac\n\t  case :$dllsearchpath: in\n\t  *\":$testbindir:\"*) ;;\n\t  ::) dllsearchpath=$testbindir;;\n\t  *) dllsearchpath=\"$dllsearchpath:$testbindir\";;\n\t  esac\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -l*)\n\tif test \"X$arg\" = \"X-lc\" || test \"X$arg\" = \"X-lm\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)\n\t    # These systems don't actually have a C or math library (as such)\n\t    continue\n\t    ;;\n\t  *-*-os2*)\n\t    # These systems don't actually have a C library (as such)\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C and math libraries are in the System framework\n\t    deplibs=\"$deplibs System.ltframework\"\n\t    continue\n\t    ;;\n\t  *-*-sco3.2v5* | *-*-sco5v6*)\n\t    # Causes problems with __ctype\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)\n\t    # Compiler inserts libc in the correct place for threads to work\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  esac\n\telif test \"X$arg\" = \"X-lc_r\"; then\n\t case $host in\n\t *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t   # Do not include libc_r directly, use -pthread flag.\n\t   continue\n\t   ;;\n\t esac\n\tfi\n\tdeplibs=\"$deplibs $arg\"\n\tcontinue\n\t;;\n\n      -module)\n\tmodule=yes\n\tcontinue\n\t;;\n\n      # Tru64 UNIX uses -model [arg] to determine the layout of C++\n      # classes, name mangling, and exception handling.\n      # Darwin uses the -arch flag to determine output architecture.\n      -model|-arch|-isysroot)\n\tcompiler_flags=\"$compiler_flags $arg\"\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)\n\tcompiler_flags=\"$compiler_flags $arg\"\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n\tcase \"$new_inherited_linker_flags \" in\n\t    *\" $arg \"*) ;;\n\t    * ) new_inherited_linker_flags=\"$new_inherited_linker_flags $arg\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -multi_module)\n\tsingle_module=\"${wl}-multi_module\"\n\tcontinue\n\t;;\n\n      -no-fast-install)\n\tfast_install=no\n\tcontinue\n\t;;\n\n      -no-install)\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)\n\t  # The PATH hackery in wrapper scripts is required on Windows\n\t  # and Darwin in order for the loader to find any dlls it needs.\n\t  func_warning \"\\`-no-install' is ignored for $host\"\n\t  func_warning \"assuming \\`-no-fast-install' instead\"\n\t  fast_install=no\n\t  ;;\n\t*) no_install=yes ;;\n\tesac\n\tcontinue\n\t;;\n\n      -no-undefined)\n\tallow_undefined=no\n\tcontinue\n\t;;\n\n      -objectlist)\n\tprev=objectlist\n\tcontinue\n\t;;\n\n      -o) prev=output ;;\n\n      -precious-files-regex)\n\tprev=precious_regex\n\tcontinue\n\t;;\n\n      -release)\n\tprev=release\n\tcontinue\n\t;;\n\n      -rpath)\n\tprev=rpath\n\tcontinue\n\t;;\n\n      -R)\n\tprev=xrpath\n\tcontinue\n\t;;\n\n      -R*)\n\tfunc_stripname '-R' '' \"$arg\"\n\tdir=$func_stripname_result\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t*)\n\t  func_fatal_error \"only absolute run-paths are allowed\"\n\t  ;;\n\tesac\n\tcase \"$xrpath \" in\n\t*\" $dir \"*) ;;\n\t*) xrpath=\"$xrpath $dir\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -shared)\n\t# The effects of -shared are defined in a previous loop.\n\tcontinue\n\t;;\n\n      -shrext)\n\tprev=shrext\n\tcontinue\n\t;;\n\n      -static | -static-libtool-libs)\n\t# The effects of -static are defined in a previous loop.\n\t# We used to do the same as -all-static on platforms that\n\t# didn't have a PIC flag, but the assumption that the effects\n\t# would be equivalent was wrong.  It would break on at least\n\t# Digital Unix and AIX.\n\tcontinue\n\t;;\n\n      -thread-safe)\n\tthread_safe=yes\n\tcontinue\n\t;;\n\n      -version-info)\n\tprev=vinfo\n\tcontinue\n\t;;\n\n      -version-number)\n\tprev=vinfo\n\tvinfo_number=yes\n\tcontinue\n\t;;\n\n      -weak)\n        prev=weak\n\tcontinue\n\t;;\n\n      -Wc,*)\n\tfunc_stripname '-Wc,' '' \"$arg\"\n\targs=$func_stripname_result\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n          func_quote_for_eval \"$flag\"\n\t  arg=\"$arg $wl$func_quote_for_eval_result\"\n\t  compiler_flags=\"$compiler_flags $func_quote_for_eval_result\"\n\tdone\n\tIFS=\"$save_ifs\"\n\tfunc_stripname ' ' '' \"$arg\"\n\targ=$func_stripname_result\n\t;;\n\n      -Wl,*)\n\tfunc_stripname '-Wl,' '' \"$arg\"\n\targs=$func_stripname_result\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n          func_quote_for_eval \"$flag\"\n\t  arg=\"$arg $wl$func_quote_for_eval_result\"\n\t  compiler_flags=\"$compiler_flags $wl$func_quote_for_eval_result\"\n\t  linker_flags=\"$linker_flags $func_quote_for_eval_result\"\n\tdone\n\tIFS=\"$save_ifs\"\n\tfunc_stripname ' ' '' \"$arg\"\n\targ=$func_stripname_result\n\t;;\n\n      -Xcompiler)\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -Xlinker)\n\tprev=xlinker\n\tcontinue\n\t;;\n\n      -XCClinker)\n\tprev=xcclinker\n\tcontinue\n\t;;\n\n      # -msg_* for osf cc\n      -msg_*)\n\tfunc_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n\n      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler\n      # -r[0-9][0-9]* specifies the processor on the SGI compiler\n      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler\n      # +DA*, +DD* enable 64-bit mode on the HP compiler\n      # -q* pass through compiler args for the IBM compiler\n      # -m*, -t[45]*, -txscale* pass through architecture-specific\n      # compiler args for GCC\n      # -F/path gives path to uninstalled frameworks, gcc on darwin\n      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC\n      # @file GCC response files\n      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \\\n      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)\n        func_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n        func_append compile_command \" $arg\"\n        func_append finalize_command \" $arg\"\n        compiler_flags=\"$compiler_flags $arg\"\n        continue\n        ;;\n\n      # Some other compiler flag.\n      -* | +*)\n        func_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n\n      *.$objext)\n\t# A standard object.\n\tobjs=\"$objs $arg\"\n\t;;\n\n      *.lo)\n\t# A libtool-controlled object.\n\n\t# Check to see that this really is a libtool object.\n\tif func_lalib_unsafe_p \"$arg\"; then\n\t  pic_object=\n\t  non_pic_object=\n\n\t  # Read the .lo file\n\t  func_source \"$arg\"\n\n\t  if test -z \"$pic_object\" ||\n\t     test -z \"$non_pic_object\" ||\n\t     test \"$pic_object\" = none &&\n\t     test \"$non_pic_object\" = none; then\n\t    func_fatal_error \"cannot find name of object for \\`$arg'\"\n\t  fi\n\n\t  # Extract subdirectory from the argument.\n\t  func_dirname \"$arg\" \"/\" \"\"\n\t  xdir=\"$func_dirname_result\"\n\n\t  if test \"$pic_object\" != none; then\n\t    # Prepend the subdirectory the object is found in.\n\t    pic_object=\"$xdir$pic_object\"\n\n\t    if test \"$prev\" = dlfiles; then\n\t      if test \"$build_libtool_libs\" = yes && test \"$dlopen_support\" = yes; then\n\t\tdlfiles=\"$dlfiles $pic_object\"\n\t\tprev=\n\t\tcontinue\n\t      else\n\t\t# If libtool objects are unsupported, then we need to preload.\n\t\tprev=dlprefiles\n\t      fi\n\t    fi\n\n\t    # CHECK ME:  I think I busted this.  -Ossama\n\t    if test \"$prev\" = dlprefiles; then\n\t      # Preload the old-style object.\n\t      dlprefiles=\"$dlprefiles $pic_object\"\n\t      prev=\n\t    fi\n\n\t    # A PIC object.\n\t    func_append libobjs \" $pic_object\"\n\t    arg=\"$pic_object\"\n\t  fi\n\n\t  # Non-PIC object.\n\t  if test \"$non_pic_object\" != none; then\n\t    # Prepend the subdirectory the object is found in.\n\t    non_pic_object=\"$xdir$non_pic_object\"\n\n\t    # A standard non-PIC object\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t    if test -z \"$pic_object\" || test \"$pic_object\" = none ; then\n\t      arg=\"$non_pic_object\"\n\t    fi\n\t  else\n\t    # If the PIC object exists, use it instead.\n\t    # $xdir was prepended to $pic_object above.\n\t    non_pic_object=\"$pic_object\"\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t  fi\n\telse\n\t  # Only an error if not doing a dry-run.\n\t  if $opt_dry_run; then\n\t    # Extract subdirectory from the argument.\n\t    func_dirname \"$arg\" \"/\" \"\"\n\t    xdir=\"$func_dirname_result\"\n\n\t    func_lo2o \"$arg\"\n\t    pic_object=$xdir$objdir/$func_lo2o_result\n\t    non_pic_object=$xdir$func_lo2o_result\n\t    func_append libobjs \" $pic_object\"\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t  else\n\t    func_fatal_error \"\\`$arg' is not a valid libtool object\"\n\t  fi\n\tfi\n\t;;\n\n      *.$libext)\n\t# An archive.\n\tdeplibs=\"$deplibs $arg\"\n\told_deplibs=\"$old_deplibs $arg\"\n\tcontinue\n\t;;\n\n      *.la)\n\t# A libtool-controlled library.\n\n\tif test \"$prev\" = dlfiles; then\n\t  # This library was specified with -dlopen.\n\t  dlfiles=\"$dlfiles $arg\"\n\t  prev=\n\telif test \"$prev\" = dlprefiles; then\n\t  # The library was specified with -dlpreopen.\n\t  dlprefiles=\"$dlprefiles $arg\"\n\t  prev=\n\telse\n\t  deplibs=\"$deplibs $arg\"\n\tfi\n\tcontinue\n\t;;\n\n      # Some other compiler argument.\n      *)\n\t# Unknown arguments in both finalize_command and compile_command need\n\t# to be aesthetically quoted because they are evaled later.\n\tfunc_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n      esac # arg\n\n      # Now actually substitute the argument into the commands.\n      if test -n \"$arg\"; then\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n      fi\n    done # argument parsing loop\n\n    test -n \"$prev\" && \\\n      func_fatal_help \"the \\`$prevarg' option requires an argument\"\n\n    if test \"$export_dynamic\" = yes && test -n \"$export_dynamic_flag_spec\"; then\n      eval arg=\\\"$export_dynamic_flag_spec\\\"\n      func_append compile_command \" $arg\"\n      func_append finalize_command \" $arg\"\n    fi\n\n    oldlibs=\n    # calculate the name of the file, without its directory\n    func_basename \"$output\"\n    outputname=\"$func_basename_result\"\n    libobjs_save=\"$libobjs\"\n\n    if test -n \"$shlibpath_var\"; then\n      # get the directories listed in $shlibpath_var\n      eval shlib_search_path=\\`\\$ECHO \\\"X\\${$shlibpath_var}\\\" \\| \\$Xsed -e \\'s/:/ /g\\'\\`\n    else\n      shlib_search_path=\n    fi\n    eval sys_lib_search_path=\\\"$sys_lib_search_path_spec\\\"\n    eval sys_lib_dlsearch_path=\\\"$sys_lib_dlsearch_path_spec\\\"\n\n    func_dirname \"$output\" \"/\" \"\"\n    output_objdir=\"$func_dirname_result$objdir\"\n    # Create the object directory.\n    func_mkdir_p \"$output_objdir\"\n\n    # Determine the type of output\n    case $output in\n    \"\")\n      func_fatal_help \"you must specify an output file\"\n      ;;\n    *.$libext) linkmode=oldlib ;;\n    *.lo | *.$objext) linkmode=obj ;;\n    *.la) linkmode=lib ;;\n    *) linkmode=prog ;; # Anything else should be a program.\n    esac\n\n    specialdeplibs=\n\n    libs=\n    # Find all interdependent deplibs by searching for libraries\n    # that are linked more than once (e.g. -la -lb -la)\n    for deplib in $deplibs; do\n      if $opt_duplicate_deps ; then\n\tcase \"$libs \" in\n\t*\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\tesac\n      fi\n      libs=\"$libs $deplib\"\n    done\n\n    if test \"$linkmode\" = lib; then\n      libs=\"$predeps $libs $compiler_lib_search_path $postdeps\"\n\n      # Compute libraries that are listed more than once in $predeps\n      # $postdeps and mark them as special (i.e., whose duplicates are\n      # not to be eliminated).\n      pre_post_deps=\n      if $opt_duplicate_compiler_generated_deps; then\n\tfor pre_post_dep in $predeps $postdeps; do\n\t  case \"$pre_post_deps \" in\n\t  *\" $pre_post_dep \"*) specialdeplibs=\"$specialdeplibs $pre_post_deps\" ;;\n\t  esac\n\t  pre_post_deps=\"$pre_post_deps $pre_post_dep\"\n\tdone\n      fi\n      pre_post_deps=\n    fi\n\n    deplibs=\n    newdependency_libs=\n    newlib_search_path=\n    need_relink=no # whether we're linking any uninstalled libtool libraries\n    notinst_deplibs= # not-installed libtool libraries\n    notinst_path= # paths that contain not-installed libtool libraries\n\n    case $linkmode in\n    lib)\n\tpasses=\"conv dlpreopen link\"\n\tfor file in $dlfiles $dlprefiles; do\n\t  case $file in\n\t  *.la) ;;\n\t  *)\n\t    func_fatal_help \"libraries can \\`-dlopen' only libtool libraries: $file\"\n\t    ;;\n\t  esac\n\tdone\n\t;;\n    prog)\n\tcompile_deplibs=\n\tfinalize_deplibs=\n\talldeplibs=no\n\tnewdlfiles=\n\tnewdlprefiles=\n\tpasses=\"conv scan dlopen dlpreopen link\"\n\t;;\n    *)  passes=\"conv\"\n\t;;\n    esac\n\n    for pass in $passes; do\n      # The preopen pass in lib mode reverses $deplibs; put it back here\n      # so that -L comes before libs that need it for instance...\n      if test \"$linkmode,$pass\" = \"lib,link\"; then\n\t## FIXME: Find the place where the list is rebuilt in the wrong\n\t##        order, and fix it there properly\n        tmp_deplibs=\n\tfor deplib in $deplibs; do\n\t  tmp_deplibs=\"$deplib $tmp_deplibs\"\n\tdone\n\tdeplibs=\"$tmp_deplibs\"\n      fi\n\n      if test \"$linkmode,$pass\" = \"lib,link\" ||\n\t test \"$linkmode,$pass\" = \"prog,scan\"; then\n\tlibs=\"$deplibs\"\n\tdeplibs=\n      fi\n      if test \"$linkmode\" = prog; then\n\tcase $pass in\n\tdlopen) libs=\"$dlfiles\" ;;\n\tdlpreopen) libs=\"$dlprefiles\" ;;\n\tlink)\n\t  libs=\"$deplibs %DEPLIBS%\"\n\t  test \"X$link_all_deplibs\" != Xno && libs=\"$libs $dependency_libs\"\n\t  ;;\n\tesac\n      fi\n      if test \"$linkmode,$pass\" = \"lib,dlpreopen\"; then\n\t# Collect and forward deplibs of preopened libtool libs\n\tfor lib in $dlprefiles; do\n\t  # Ignore non-libtool-libs\n\t  dependency_libs=\n\t  case $lib in\n\t  *.la)\tfunc_source \"$lib\" ;;\n\t  esac\n\n\t  # Collect preopened libtool deplibs, except any this library\n\t  # has declared as weak libs\n\t  for deplib in $dependency_libs; do\n            deplib_base=`$ECHO \"X$deplib\" | $Xsed -e \"$basename\"`\n\t    case \" $weak_libs \" in\n\t    *\" $deplib_base \"*) ;;\n\t    *) deplibs=\"$deplibs $deplib\" ;;\n\t    esac\n\t  done\n\tdone\n\tlibs=\"$dlprefiles\"\n      fi\n      if test \"$pass\" = dlopen; then\n\t# Collect dlpreopened libraries\n\tsave_deplibs=\"$deplibs\"\n\tdeplibs=\n      fi\n\n      for deplib in $libs; do\n\tlib=\n\tfound=no\n\tcase $deplib in\n\t-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)\n\t  if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    compiler_flags=\"$compiler_flags $deplib\"\n\t    if test \"$linkmode\" = lib ; then\n\t\tcase \"$new_inherited_linker_flags \" in\n\t\t    *\" $deplib \"*) ;;\n\t\t    * ) new_inherited_linker_flags=\"$new_inherited_linker_flags $deplib\" ;;\n\t\tesac\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t-l*)\n\t  if test \"$linkmode\" != lib && test \"$linkmode\" != prog; then\n\t    func_warning \"\\`-l' is ignored for archives/objects\"\n\t    continue\n\t  fi\n\t  func_stripname '-l' '' \"$deplib\"\n\t  name=$func_stripname_result\n\t  if test \"$linkmode\" = lib; then\n\t    searchdirs=\"$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path\"\n\t  else\n\t    searchdirs=\"$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path\"\n\t  fi\n\t  for searchdir in $searchdirs; do\n\t    for search_ext in .la $std_shrext .so .a; do\n\t      # Search the libtool library\n\t      lib=\"$searchdir/lib${name}${search_ext}\"\n\t      if test -f \"$lib\"; then\n\t\tif test \"$search_ext\" = \".la\"; then\n\t\t  found=yes\n\t\telse\n\t\t  found=no\n\t\tfi\n\t\tbreak 2\n\t      fi\n\t    done\n\t  done\n\t  if test \"$found\" != yes; then\n\t    # deplib doesn't seem to be a libtool library\n\t    if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      deplibs=\"$deplib $deplibs\"\n\t      test \"$linkmode\" = lib && newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    continue\n\t  else # deplib is a libtool library\n\t    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,\n\t    # We need to do some special things here, and not later.\n\t    if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t      case \" $predeps $postdeps \" in\n\t      *\" $deplib \"*)\n\t\tif func_lalib_p \"$lib\"; then\n\t\t  library_names=\n\t\t  old_library=\n\t\t  func_source \"$lib\"\n\t\t  for l in $old_library $library_names; do\n\t\t    ll=\"$l\"\n\t\t  done\n\t\t  if test \"X$ll\" = \"X$old_library\" ; then # only static version available\n\t\t    found=no\n\t\t    func_dirname \"$lib\" \"\" \".\"\n\t\t    ladir=\"$func_dirname_result\"\n\t\t    lib=$ladir/$old_library\n\t\t    if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t\t    else\n\t\t      deplibs=\"$deplib $deplibs\"\n\t\t      test \"$linkmode\" = lib && newdependency_libs=\"$deplib $newdependency_libs\"\n\t\t    fi\n\t\t    continue\n\t\t  fi\n\t\tfi\n\t\t;;\n\t      *) ;;\n\t      esac\n\t    fi\n\t  fi\n\t  ;; # -l\n\t*.ltframework)\n\t  if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$deplib $deplibs\"\n\t    if test \"$linkmode\" = lib ; then\n\t\tcase \"$new_inherited_linker_flags \" in\n\t\t    *\" $deplib \"*) ;;\n\t\t    * ) new_inherited_linker_flags=\"$new_inherited_linker_flags $deplib\" ;;\n\t\tesac\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t-L*)\n\t  case $linkmode in\n\t  lib)\n\t    deplibs=\"$deplib $deplibs\"\n\t    test \"$pass\" = conv && continue\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    func_stripname '-L' '' \"$deplib\"\n\t    newlib_search_path=\"$newlib_search_path $func_stripname_result\"\n\t    ;;\n\t  prog)\n\t    if test \"$pass\" = conv; then\n\t      deplibs=\"$deplib $deplibs\"\n\t      continue\n\t    fi\n\t    if test \"$pass\" = scan; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    func_stripname '-L' '' \"$deplib\"\n\t    newlib_search_path=\"$newlib_search_path $func_stripname_result\"\n\t    ;;\n\t  *)\n\t    func_warning \"\\`-L' is ignored for archives/objects\"\n\t    ;;\n\t  esac # linkmode\n\t  continue\n\t  ;; # -L\n\t-R*)\n\t  if test \"$pass\" = link; then\n\t    func_stripname '-R' '' \"$deplib\"\n\t    dir=$func_stripname_result\n\t    # Make sure the xrpath contains only unique directories.\n\t    case \"$xrpath \" in\n\t    *\" $dir \"*) ;;\n\t    *) xrpath=\"$xrpath $dir\" ;;\n\t    esac\n\t  fi\n\t  deplibs=\"$deplib $deplibs\"\n\t  continue\n\t  ;;\n\t*.la) lib=\"$deplib\" ;;\n\t*.$libext)\n\t  if test \"$pass\" = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t    continue\n\t  fi\n\t  case $linkmode in\n\t  lib)\n\t    # Linking convenience modules into shared libraries is allowed,\n\t    # but linking other static libraries is non-portable.\n\t    case \" $dlpreconveniencelibs \" in\n\t    *\" $deplib \"*) ;;\n\t    *)\n\t      valid_a_lib=no\n\t      case $deplibs_check_method in\n\t\tmatch_pattern*)\n\t\t  set dummy $deplibs_check_method; shift\n\t\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t\t  if eval \"\\$ECHO \\\"X$deplib\\\"\" 2>/dev/null | $Xsed -e 10q \\\n\t\t    | $EGREP \"$match_pattern_regex\" > /dev/null; then\n\t\t    valid_a_lib=yes\n\t\t  fi\n\t\t;;\n\t\tpass_all)\n\t\t  valid_a_lib=yes\n\t\t;;\n\t      esac\n\t      if test \"$valid_a_lib\" != yes; then\n\t\t$ECHO\n\t\t$ECHO \"*** Warning: Trying to link with static lib archive $deplib.\"\n\t\t$ECHO \"*** I have the capability to make that library automatically link in when\"\n\t\t$ECHO \"*** you link to this library.  But I can only do this if you have a\"\n\t\t$ECHO \"*** shared version of the library, which you do not appear to have\"\n\t\t$ECHO \"*** because the file extensions .$libext of this argument makes me believe\"\n\t\t$ECHO \"*** that it is just a static archive that I should not use here.\"\n\t      else\n\t\t$ECHO\n\t\t$ECHO \"*** Warning: Linking the shared library $output against the\"\n\t\t$ECHO \"*** static library $deplib is not portable!\"\n\t\tdeplibs=\"$deplib $deplibs\"\n\t      fi\n\t      ;;\n\t    esac\n\t    continue\n\t    ;;\n\t  prog)\n\t    if test \"$pass\" != link; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    continue\n\t    ;;\n\t  esac # linkmode\n\t  ;; # *.$libext\n\t*.lo | *.$objext)\n\t  if test \"$pass\" = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t  elif test \"$linkmode\" = prog; then\n\t    if test \"$pass\" = dlpreopen || test \"$dlopen_support\" != yes || test \"$build_libtool_libs\" = no; then\n\t      # If there is no dlopen support or we're linking statically,\n\t      # we need to preload.\n\t      newdlprefiles=\"$newdlprefiles $deplib\"\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      newdlfiles=\"$newdlfiles $deplib\"\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t%DEPLIBS%)\n\t  alldeplibs=yes\n\t  continue\n\t  ;;\n\tesac # case $deplib\n\n\tif test \"$found\" = yes || test -f \"$lib\"; then :\n\telse\n\t  func_fatal_error \"cannot find the library \\`$lib' or unhandled argument \\`$deplib'\"\n\tfi\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$lib\" \\\n\t  || func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\n\tfunc_dirname \"$lib\" \"\" \".\"\n\tladir=\"$func_dirname_result\"\n\n\tdlname=\n\tdlopen=\n\tdlpreopen=\n\tlibdir=\n\tlibrary_names=\n\told_library=\n\tinherited_linker_flags=\n\t# If the library was installed with an old release of libtool,\n\t# it will not redefine variables installed, or shouldnotlink\n\tinstalled=yes\n\tshouldnotlink=no\n\tavoidtemprpath=\n\n\n\t# Read the .la file\n\tfunc_source \"$lib\"\n\n\t# Convert \"-framework foo\" to \"foo.ltframework\"\n\tif test -n \"$inherited_linker_flags\"; then\n\t  tmp_inherited_linker_flags=`$ECHO \"X$inherited_linker_flags\" | $Xsed -e 's/-framework \\([^ $]*\\)/\\1.ltframework/g'`\n\t  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do\n\t    case \" $new_inherited_linker_flags \" in\n\t      *\" $tmp_inherited_linker_flag \"*) ;;\n\t      *) new_inherited_linker_flags=\"$new_inherited_linker_flags $tmp_inherited_linker_flag\";;\n\t    esac\n\t  done\n\tfi\n\tdependency_libs=`$ECHO \"X $dependency_libs\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tif test \"$linkmode,$pass\" = \"lib,link\" ||\n\t   test \"$linkmode,$pass\" = \"prog,scan\" ||\n\t   { test \"$linkmode\" != prog && test \"$linkmode\" != lib; }; then\n\t  test -n \"$dlopen\" && dlfiles=\"$dlfiles $dlopen\"\n\t  test -n \"$dlpreopen\" && dlprefiles=\"$dlprefiles $dlpreopen\"\n\tfi\n\n\tif test \"$pass\" = conv; then\n\t  # Only check for convenience libraries\n\t  deplibs=\"$lib $deplibs\"\n\t  if test -z \"$libdir\"; then\n\t    if test -z \"$old_library\"; then\n\t      func_fatal_error \"cannot find name of link library for \\`$lib'\"\n\t    fi\n\t    # It is a libtool convenience library, so add in its objects.\n\t    convenience=\"$convenience $ladir/$objdir/$old_library\"\n\t    old_convenience=\"$old_convenience $ladir/$objdir/$old_library\"\n\t    tmp_libs=\n\t    for deplib in $dependency_libs; do\n\t      deplibs=\"$deplib $deplibs\"\n\t      if $opt_duplicate_deps ; then\n\t\tcase \"$tmp_libs \" in\n\t\t*\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\t\tesac\n\t      fi\n\t      tmp_libs=\"$tmp_libs $deplib\"\n\t    done\n\t  elif test \"$linkmode\" != prog && test \"$linkmode\" != lib; then\n\t    func_fatal_error \"\\`$lib' is not a convenience library\"\n\t  fi\n\t  continue\n\tfi # $pass = conv\n\n\n\t# Get the name of the library we link against.\n\tlinklib=\n\tfor l in $old_library $library_names; do\n\t  linklib=\"$l\"\n\tdone\n\tif test -z \"$linklib\"; then\n\t  func_fatal_error \"cannot find name of link library for \\`$lib'\"\n\tfi\n\n\t# This library was specified with -dlopen.\n\tif test \"$pass\" = dlopen; then\n\t  if test -z \"$libdir\"; then\n\t    func_fatal_error \"cannot -dlopen a convenience library: \\`$lib'\"\n\t  fi\n\t  if test -z \"$dlname\" ||\n\t     test \"$dlopen_support\" != yes ||\n\t     test \"$build_libtool_libs\" = no; then\n\t    # If there is no dlname, no dlopen support or we're linking\n\t    # statically, we need to preload.  We also need to preload any\n\t    # dependent libraries so libltdl's deplib preloader doesn't\n\t    # bomb out in the load deplibs phase.\n\t    dlprefiles=\"$dlprefiles $lib $dependency_libs\"\n\t  else\n\t    newdlfiles=\"$newdlfiles $lib\"\n\t  fi\n\t  continue\n\tfi # $pass = dlopen\n\n\t# We need an absolute path.\n\tcase $ladir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs_ladir=\"$ladir\" ;;\n\t*)\n\t  abs_ladir=`cd \"$ladir\" && pwd`\n\t  if test -z \"$abs_ladir\"; then\n\t    func_warning \"cannot determine absolute directory name of \\`$ladir'\"\n\t    func_warning \"passing it literally to the linker, although it might fail\"\n\t    abs_ladir=\"$ladir\"\n\t  fi\n\t  ;;\n\tesac\n\tfunc_basename \"$lib\"\n\tlaname=\"$func_basename_result\"\n\n\t# Find the relevant object directory and library name.\n\tif test \"X$installed\" = Xyes; then\n\t  if test ! -f \"$libdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    func_warning \"library \\`$lib' was moved.\"\n\t    dir=\"$ladir\"\n\t    absdir=\"$abs_ladir\"\n\t    libdir=\"$abs_ladir\"\n\t  else\n\t    dir=\"$libdir\"\n\t    absdir=\"$libdir\"\n\t  fi\n\t  test \"X$hardcode_automatic\" = Xyes && avoidtemprpath=yes\n\telse\n\t  if test ! -f \"$ladir/$objdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    dir=\"$ladir\"\n\t    absdir=\"$abs_ladir\"\n\t    # Remove this search path later\n\t    notinst_path=\"$notinst_path $abs_ladir\"\n\t  else\n\t    dir=\"$ladir/$objdir\"\n\t    absdir=\"$abs_ladir/$objdir\"\n\t    # Remove this search path later\n\t    notinst_path=\"$notinst_path $abs_ladir\"\n\t  fi\n\tfi # $installed = yes\n\tfunc_stripname 'lib' '.la' \"$laname\"\n\tname=$func_stripname_result\n\n\t# This library was specified with -dlpreopen.\n\tif test \"$pass\" = dlpreopen; then\n\t  if test -z \"$libdir\" && test \"$linkmode\" = prog; then\n\t    func_fatal_error \"only libraries may -dlpreopen a convenience library: \\`$lib'\"\n\t  fi\n\t  # Prefer using a static library (so that no silly _DYNAMIC symbols\n\t  # are required to link).\n\t  if test -n \"$old_library\"; then\n\t    newdlprefiles=\"$newdlprefiles $dir/$old_library\"\n\t    # Keep a list of preopened convenience libraries to check\n\t    # that they are being used correctly in the link pass.\n\t    test -z \"$libdir\" && \\\n\t\tdlpreconveniencelibs=\"$dlpreconveniencelibs $dir/$old_library\"\n\t  # Otherwise, use the dlname, so that lt_dlopen finds it.\n\t  elif test -n \"$dlname\"; then\n\t    newdlprefiles=\"$newdlprefiles $dir/$dlname\"\n\t  else\n\t    newdlprefiles=\"$newdlprefiles $dir/$linklib\"\n\t  fi\n\tfi # $pass = dlpreopen\n\n\tif test -z \"$libdir\"; then\n\t  # Link the convenience library\n\t  if test \"$linkmode\" = lib; then\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t  elif test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$dir/$old_library $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$old_library $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$lib $deplibs\" # used for prog,scan pass\n\t  fi\n\t  continue\n\tfi\n\n\n\tif test \"$linkmode\" = prog && test \"$pass\" != link; then\n\t  newlib_search_path=\"$newlib_search_path $ladir\"\n\t  deplibs=\"$lib $deplibs\"\n\n\t  linkalldeplibs=no\n\t  if test \"$link_all_deplibs\" != no || test -z \"$library_names\" ||\n\t     test \"$build_libtool_libs\" = no; then\n\t    linkalldeplibs=yes\n\t  fi\n\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    case $deplib in\n\t    -L*) func_stripname '-L' '' \"$deplib\"\n\t         newlib_search_path=\"$newlib_search_path $func_stripname_result\"\n\t\t ;;\n\t    esac\n\t    # Need to link against all dependency_libs?\n\t    if test \"$linkalldeplibs\" = yes; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      # Need to hardcode shared library paths\n\t      # or/and link against static libraries\n\t      newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    if $opt_duplicate_deps ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\t      esac\n\t    fi\n\t    tmp_libs=\"$tmp_libs $deplib\"\n\t  done # for deplib\n\t  continue\n\tfi # $linkmode = prog...\n\n\tif test \"$linkmode,$pass\" = \"prog,link\"; then\n\t  if test -n \"$library_names\" &&\n\t     { { test \"$prefer_static_libs\" = no ||\n\t         test \"$prefer_static_libs,$installed\" = \"built,yes\"; } ||\n\t       test -z \"$old_library\"; }; then\n\t    # We need to hardcode the library path\n\t    if test -n \"$shlibpath_var\" && test -z \"$avoidtemprpath\" ; then\n\t      # Make sure the rpath contains only unique directories.\n\t      case \"$temp_rpath:\" in\n\t      *\"$absdir:\"*) ;;\n\t      *) temp_rpath=\"$temp_rpath$absdir:\" ;;\n\t      esac\n\t    fi\n\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) compile_rpath=\"$compile_rpath $absdir\"\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) finalize_rpath=\"$finalize_rpath $libdir\"\n\t      esac\n\t      ;;\n\t    esac\n\t  fi # $linkmode,$pass = prog,link...\n\n\t  if test \"$alldeplibs\" = yes &&\n\t     { test \"$deplibs_check_method\" = pass_all ||\n\t       { test \"$build_libtool_libs\" = yes &&\n\t\t test -n \"$library_names\"; }; }; then\n\t    # We only need to search for static libraries\n\t    continue\n\t  fi\n\tfi\n\n\tlink_static=no # Whether the deplib will be linked statically\n\tuse_static_libs=$prefer_static_libs\n\tif test \"$use_static_libs\" = built && test \"$installed\" = yes; then\n\t  use_static_libs=no\n\tfi\n\tif test -n \"$library_names\" &&\n\t   { test \"$use_static_libs\" = no || test -z \"$old_library\"; }; then\n\t  case $host in\n\t  *cygwin* | *mingw* | *cegcc*)\n\t      # No point in relinking DLLs because paths are not encoded\n\t      notinst_deplibs=\"$notinst_deplibs $lib\"\n\t      need_relink=no\n\t    ;;\n\t  *)\n\t    if test \"$installed\" = no; then\n\t      notinst_deplibs=\"$notinst_deplibs $lib\"\n\t      need_relink=yes\n\t    fi\n\t    ;;\n\t  esac\n\t  # This is a shared library\n\n\t  # Warn about portability, can't link against -module's on some\n\t  # systems (darwin).  Don't bleat about dlopened modules though!\n\t  dlopenmodule=\"\"\n\t  for dlpremoduletest in $dlprefiles; do\n\t    if test \"X$dlpremoduletest\" = \"X$lib\"; then\n\t      dlopenmodule=\"$dlpremoduletest\"\n\t      break\n\t    fi\n\t  done\n\t  if test -z \"$dlopenmodule\" && test \"$shouldnotlink\" = yes && test \"$pass\" = link; then\n\t    $ECHO\n\t    if test \"$linkmode\" = prog; then\n\t      $ECHO \"*** Warning: Linking the executable $output against the loadable module\"\n\t    else\n\t      $ECHO \"*** Warning: Linking the shared library $output against the loadable module\"\n\t    fi\n\t    $ECHO \"*** $linklib is not portable!\"\n\t  fi\n\t  if test \"$linkmode\" = lib &&\n\t     test \"$hardcode_into_libs\" = yes; then\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) compile_rpath=\"$compile_rpath $absdir\"\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) finalize_rpath=\"$finalize_rpath $libdir\"\n\t      esac\n\t      ;;\n\t    esac\n\t  fi\n\n\t  if test -n \"$old_archive_from_expsyms_cmds\"; then\n\t    # figure out the soname\n\t    set dummy $library_names\n\t    shift\n\t    realname=\"$1\"\n\t    shift\n\t    libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t    # use dlname if we got it. it's perfectly good, no?\n\t    if test -n \"$dlname\"; then\n\t      soname=\"$dlname\"\n\t    elif test -n \"$soname_spec\"; then\n\t      # bleh windows\n\t      case $host in\n\t      *cygwin* | mingw* | *cegcc*)\n\t        func_arith $current - $age\n\t\tmajor=$func_arith_result\n\t\tversuffix=\"-$major\"\n\t\t;;\n\t      esac\n\t      eval soname=\\\"$soname_spec\\\"\n\t    else\n\t      soname=\"$realname\"\n\t    fi\n\n\t    # Make a new name for the extract_expsyms_cmds to use\n\t    soroot=\"$soname\"\n\t    func_basename \"$soroot\"\n\t    soname=\"$func_basename_result\"\n\t    func_stripname 'lib' '.dll' \"$soname\"\n\t    newlib=libimp-$func_stripname_result.a\n\n\t    # If the library has no export list, then create one now\n\t    if test -f \"$output_objdir/$soname-def\"; then :\n\t    else\n\t      func_verbose \"extracting exported symbol list from \\`$soname'\"\n\t      func_execute_cmds \"$extract_expsyms_cmds\" 'exit $?'\n\t    fi\n\n\t    # Create $newlib\n\t    if test -f \"$output_objdir/$newlib\"; then :; else\n\t      func_verbose \"generating import library for \\`$soname'\"\n\t      func_execute_cmds \"$old_archive_from_expsyms_cmds\" 'exit $?'\n\t    fi\n\t    # make sure the library variables are pointing to the new library\n\t    dir=$output_objdir\n\t    linklib=$newlib\n\t  fi # test -n \"$old_archive_from_expsyms_cmds\"\n\n\t  if test \"$linkmode\" = prog || test \"$mode\" != relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    lib_linked=yes\n\t    case $hardcode_action in\n\t    immediate | unsupported)\n\t      if test \"$hardcode_direct\" = no; then\n\t\tadd=\"$dir/$linklib\"\n\t\tcase $host in\n\t\t  *-*-sco3.2v5.0.[024]*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-sysv4*uw2*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \\\n\t\t    *-*-unixware7*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-darwin* )\n\t\t    # if the lib is a (non-dlopened) module then we can not\n\t\t    # link against it, someone is ignoring the earlier warnings\n\t\t    if /usr/bin/file -L $add 2> /dev/null |\n\t\t\t $GREP \": [^:]* bundle\" >/dev/null ; then\n\t\t      if test \"X$dlopenmodule\" != \"X$lib\"; then\n\t\t\t$ECHO \"*** Warning: lib $linklib is a module, not a shared library\"\n\t\t\tif test -z \"$old_library\" ; then\n\t\t\t  $ECHO\n\t\t\t  $ECHO \"*** And there doesn't seem to be a static archive available\"\n\t\t\t  $ECHO \"*** The link will probably fail, sorry\"\n\t\t\telse\n\t\t\t  add=\"$dir/$old_library\"\n\t\t\tfi\n\t\t      elif test -n \"$old_library\"; then\n\t\t\tadd=\"$dir/$old_library\"\n\t\t      fi\n\t\t    fi\n\t\tesac\n\t      elif test \"$hardcode_minus_L\" = no; then\n\t\tcase $host in\n\t\t*-*-sunos*) add_shlibpath=\"$dir\" ;;\n\t\tesac\n\t\tadd_dir=\"-L$dir\"\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = no; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    relink)\n\t      if test \"$hardcode_direct\" = yes &&\n\t         test \"$hardcode_direct_absolute\" = no; then\n\t\tadd=\"$dir/$linklib\"\n\t      elif test \"$hardcode_minus_L\" = yes; then\n\t\tadd_dir=\"-L$dir\"\n\t\t# Try looking first in the location we're being installed to.\n\t\tif test -n \"$inst_prefix_dir\"; then\n\t\t  case $libdir in\n\t\t    [\\\\/]*)\n\t\t      add_dir=\"$add_dir -L$inst_prefix_dir$libdir\"\n\t\t      ;;\n\t\t  esac\n\t\tfi\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = yes; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    *) lib_linked=no ;;\n\t    esac\n\n\t    if test \"$lib_linked\" != yes; then\n\t      func_fatal_configuration \"unsupported hardcode properties\"\n\t    fi\n\n\t    if test -n \"$add_shlibpath\"; then\n\t      case :$compile_shlibpath: in\n\t      *\":$add_shlibpath:\"*) ;;\n\t      *) compile_shlibpath=\"$compile_shlibpath$add_shlibpath:\" ;;\n\t      esac\n\t    fi\n\t    if test \"$linkmode\" = prog; then\n\t      test -n \"$add_dir\" && compile_deplibs=\"$add_dir $compile_deplibs\"\n\t      test -n \"$add\" && compile_deplibs=\"$add $compile_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t      if test \"$hardcode_direct\" != yes &&\n\t\t test \"$hardcode_minus_L\" != yes &&\n\t\t test \"$hardcode_shlibpath_var\" = yes; then\n\t\tcase :$finalize_shlibpath: in\n\t\t*\":$libdir:\"*) ;;\n\t\t*) finalize_shlibpath=\"$finalize_shlibpath$libdir:\" ;;\n\t\tesac\n\t      fi\n\t    fi\n\t  fi\n\n\t  if test \"$linkmode\" = prog || test \"$mode\" = relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    # Finalize command for both is simple: just hardcode it.\n\t    if test \"$hardcode_direct\" = yes &&\n\t       test \"$hardcode_direct_absolute\" = no; then\n\t      add=\"$libdir/$linklib\"\n\t    elif test \"$hardcode_minus_L\" = yes; then\n\t      add_dir=\"-L$libdir\"\n\t      add=\"-l$name\"\n\t    elif test \"$hardcode_shlibpath_var\" = yes; then\n\t      case :$finalize_shlibpath: in\n\t      *\":$libdir:\"*) ;;\n\t      *) finalize_shlibpath=\"$finalize_shlibpath$libdir:\" ;;\n\t      esac\n\t      add=\"-l$name\"\n\t    elif test \"$hardcode_automatic\" = yes; then\n\t      if test -n \"$inst_prefix_dir\" &&\n\t\t test -f \"$inst_prefix_dir$libdir/$linklib\" ; then\n\t\tadd=\"$inst_prefix_dir$libdir/$linklib\"\n\t      else\n\t\tadd=\"$libdir/$linklib\"\n\t      fi\n\t    else\n\t      # We cannot seem to hardcode it, guess we'll fake it.\n\t      add_dir=\"-L$libdir\"\n\t      # Try looking first in the location we're being installed to.\n\t      if test -n \"$inst_prefix_dir\"; then\n\t\tcase $libdir in\n\t\t  [\\\\/]*)\n\t\t    add_dir=\"$add_dir -L$inst_prefix_dir$libdir\"\n\t\t    ;;\n\t\tesac\n\t      fi\n\t      add=\"-l$name\"\n\t    fi\n\n\t    if test \"$linkmode\" = prog; then\n\t      test -n \"$add_dir\" && finalize_deplibs=\"$add_dir $finalize_deplibs\"\n\t      test -n \"$add\" && finalize_deplibs=\"$add $finalize_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t    fi\n\t  fi\n\telif test \"$linkmode\" = prog; then\n\t  # Here we assume that one of hardcode_direct or hardcode_minus_L\n\t  # is not unsupported.  This is valid on all known static and\n\t  # shared platforms.\n\t  if test \"$hardcode_direct\" != unsupported; then\n\t    test -n \"$old_library\" && linklib=\"$old_library\"\n\t    compile_deplibs=\"$dir/$linklib $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$linklib $finalize_deplibs\"\n\t  else\n\t    compile_deplibs=\"-l$name -L$dir $compile_deplibs\"\n\t    finalize_deplibs=\"-l$name -L$dir $finalize_deplibs\"\n\t  fi\n\telif test \"$build_libtool_libs\" = yes; then\n\t  # Not a shared library\n\t  if test \"$deplibs_check_method\" != pass_all; then\n\t    # We're trying link a shared library against a static one\n\t    # but the system doesn't support it.\n\n\t    # Just print a warning and add the library to dependency_libs so\n\t    # that the program can be linked against the static library.\n\t    $ECHO\n\t    $ECHO \"*** Warning: This system can not link to static lib archive $lib.\"\n\t    $ECHO \"*** I have the capability to make that library automatically link in when\"\n\t    $ECHO \"*** you link to this library.  But I can only do this if you have a\"\n\t    $ECHO \"*** shared version of the library, which you do not appear to have.\"\n\t    if test \"$module\" = yes; then\n\t      $ECHO \"*** But as you try to build a module library, libtool will still create \"\n\t      $ECHO \"*** a static module, that should work as long as the dlopening application\"\n\t      $ECHO \"*** is linked with the -dlopen flag to resolve symbols at runtime.\"\n\t      if test -z \"$global_symbol_pipe\"; then\n\t\t$ECHO\n\t\t$ECHO \"*** However, this would only work if libtool was able to extract symbol\"\n\t\t$ECHO \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t\t$ECHO \"*** not find such a program.  So, this module is probably useless.\"\n\t\t$ECHO \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t      fi\n\t      if test \"$build_old_libs\" = no; then\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  else\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t    link_static=yes\n\t  fi\n\tfi # link shared/static library?\n\n\tif test \"$linkmode\" = lib; then\n\t  if test -n \"$dependency_libs\" &&\n\t     { test \"$hardcode_into_libs\" != yes ||\n\t       test \"$build_old_libs\" = yes ||\n\t       test \"$link_static\" = yes; }; then\n\t    # Extract -R from dependency_libs\n\t    temp_deplibs=\n\t    for libdir in $dependency_libs; do\n\t      case $libdir in\n\t      -R*) func_stripname '-R' '' \"$libdir\"\n\t           temp_xrpath=$func_stripname_result\n\t\t   case \" $xrpath \" in\n\t\t   *\" $temp_xrpath \"*) ;;\n\t\t   *) xrpath=\"$xrpath $temp_xrpath\";;\n\t\t   esac;;\n\t      *) temp_deplibs=\"$temp_deplibs $libdir\";;\n\t      esac\n\t    done\n\t    dependency_libs=\"$temp_deplibs\"\n\t  fi\n\n\t  newlib_search_path=\"$newlib_search_path $absdir\"\n\t  # Link against this library\n\t  test \"$link_static\" = no && newdependency_libs=\"$abs_ladir/$laname $newdependency_libs\"\n\t  # ... and its dependency_libs\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    if $opt_duplicate_deps ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\t      esac\n\t    fi\n\t    tmp_libs=\"$tmp_libs $deplib\"\n\t  done\n\n\t  if test \"$link_all_deplibs\" != no; then\n\t    # Add the search paths of all dependency libraries\n\t    for deplib in $dependency_libs; do\n\t      path=\n\t      case $deplib in\n\t      -L*) path=\"$deplib\" ;;\n\t      *.la)\n\t        func_dirname \"$deplib\" \"\" \".\"\n\t\tdir=\"$func_dirname_result\"\n\t\t# We need an absolute path.\n\t\tcase $dir in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) absdir=\"$dir\" ;;\n\t\t*)\n\t\t  absdir=`cd \"$dir\" && pwd`\n\t\t  if test -z \"$absdir\"; then\n\t\t    func_warning \"cannot determine absolute directory name of \\`$dir'\"\n\t\t    absdir=\"$dir\"\n\t\t  fi\n\t\t  ;;\n\t\tesac\n\t\tif $GREP \"^installed=no\" $deplib > /dev/null; then\n\t\tcase $host in\n\t\t*-*-darwin*)\n\t\t  depdepl=\n\t\t  eval deplibrary_names=`${SED} -n -e 's/^library_names=\\(.*\\)$/\\1/p' $deplib`\n\t\t  if test -n \"$deplibrary_names\" ; then\n\t\t    for tmp in $deplibrary_names ; do\n\t\t      depdepl=$tmp\n\t\t    done\n\t\t    if test -f \"$absdir/$objdir/$depdepl\" ; then\n\t\t      depdepl=\"$absdir/$objdir/$depdepl\"\n\t\t      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`\n                      if test -z \"$darwin_install_name\"; then\n                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`\n                      fi\n\t\t      compiler_flags=\"$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}\"\n\t\t      linker_flags=\"$linker_flags -dylib_file ${darwin_install_name}:${depdepl}\"\n\t\t      path=\n\t\t    fi\n\t\t  fi\n\t\t  ;;\n\t\t*)\n\t\t  path=\"-L$absdir/$objdir\"\n\t\t  ;;\n\t\tesac\n\t\telse\n\t\t  eval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $deplib`\n\t\t  test -z \"$libdir\" && \\\n\t\t    func_fatal_error \"\\`$deplib' is not a valid libtool archive\"\n\t\t  test \"$absdir\" != \"$libdir\" && \\\n\t\t    func_warning \"\\`$deplib' seems to be moved\"\n\n\t\t  path=\"-L$absdir\"\n\t\tfi\n\t\t;;\n\t      esac\n\t      case \" $deplibs \" in\n\t      *\" $path \"*) ;;\n\t      *) deplibs=\"$path $deplibs\" ;;\n\t      esac\n\t    done\n\t  fi # link_all_deplibs != no\n\tfi # linkmode = lib\n      done # for deplib in $libs\n      if test \"$pass\" = link; then\n\tif test \"$linkmode\" = \"prog\"; then\n\t  compile_deplibs=\"$new_inherited_linker_flags $compile_deplibs\"\n\t  finalize_deplibs=\"$new_inherited_linker_flags $finalize_deplibs\"\n\telse\n\t  compiler_flags=\"$compiler_flags \"`$ECHO \"X $new_inherited_linker_flags\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tfi\n      fi\n      dependency_libs=\"$newdependency_libs\"\n      if test \"$pass\" = dlpreopen; then\n\t# Link the dlpreopened libraries before other libraries\n\tfor deplib in $save_deplibs; do\n\t  deplibs=\"$deplib $deplibs\"\n\tdone\n      fi\n      if test \"$pass\" != dlopen; then\n\tif test \"$pass\" != conv; then\n\t  # Make sure lib_search_path contains only unique directories.\n\t  lib_search_path=\n\t  for dir in $newlib_search_path; do\n\t    case \"$lib_search_path \" in\n\t    *\" $dir \"*) ;;\n\t    *) lib_search_path=\"$lib_search_path $dir\" ;;\n\t    esac\n\t  done\n\t  newlib_search_path=\n\tfi\n\n\tif test \"$linkmode,$pass\" != \"prog,link\"; then\n\t  vars=\"deplibs\"\n\telse\n\t  vars=\"compile_deplibs finalize_deplibs\"\n\tfi\n\tfor var in $vars dependency_libs; do\n\t  # Add libraries to $var in reverse order\n\t  eval tmp_libs=\\\"\\$$var\\\"\n\t  new_libs=\n\t  for deplib in $tmp_libs; do\n\t    # FIXME: Pedantically, this is the right thing to do, so\n\t    #        that some nasty dependency loop isn't accidentally\n\t    #        broken:\n\t    #new_libs=\"$deplib $new_libs\"\n\t    # Pragmatically, this seems to cause very few problems in\n\t    # practice:\n\t    case $deplib in\n\t    -L*) new_libs=\"$deplib $new_libs\" ;;\n\t    -R*) ;;\n\t    *)\n\t      # And here is the reason: when a library appears more\n\t      # than once as an explicit dependence of a library, or\n\t      # is implicitly linked in more than once by the\n\t      # compiler, it is considered special, and multiple\n\t      # occurrences thereof are not removed.  Compare this\n\t      # with having the same library being listed as a\n\t      # dependency of multiple other libraries: in this case,\n\t      # we know (pedantically, we assume) the library does not\n\t      # need to be listed more than once, so we keep only the\n\t      # last copy.  This is not always right, but it is rare\n\t      # enough that we require users that really mean to play\n\t      # such unportable linking tricks to link the library\n\t      # using -Wl,-lname, so that libtool does not consider it\n\t      # for duplicate removal.\n\t      case \" $specialdeplibs \" in\n\t      *\" $deplib \"*) new_libs=\"$deplib $new_libs\" ;;\n\t      *)\n\t\tcase \" $new_libs \" in\n\t\t*\" $deplib \"*) ;;\n\t\t*) new_libs=\"$deplib $new_libs\" ;;\n\t\tesac\n\t\t;;\n\t      esac\n\t      ;;\n\t    esac\n\t  done\n\t  tmp_libs=\n\t  for deplib in $new_libs; do\n\t    case $deplib in\n\t    -L*)\n\t      case \" $tmp_libs \" in\n\t      *\" $deplib \"*) ;;\n\t      *) tmp_libs=\"$tmp_libs $deplib\" ;;\n\t      esac\n\t      ;;\n\t    *) tmp_libs=\"$tmp_libs $deplib\" ;;\n\t    esac\n\t  done\n\t  eval $var=\\\"$tmp_libs\\\"\n\tdone # for var\n      fi\n      # Last step: remove runtime libs from dependency_libs\n      # (they stay in deplibs)\n      tmp_libs=\n      for i in $dependency_libs ; do\n\tcase \" $predeps $postdeps $compiler_lib_search_path \" in\n\t*\" $i \"*)\n\t  i=\"\"\n\t  ;;\n\tesac\n\tif test -n \"$i\" ; then\n\t  tmp_libs=\"$tmp_libs $i\"\n\tfi\n      done\n      dependency_libs=$tmp_libs\n    done # for pass\n    if test \"$linkmode\" = prog; then\n      dlfiles=\"$newdlfiles\"\n    fi\n    if test \"$linkmode\" = prog || test \"$linkmode\" = lib; then\n      dlprefiles=\"$newdlprefiles\"\n    fi\n\n    case $linkmode in\n    oldlib)\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\tfunc_warning \"\\`-dlopen' is ignored for archives\"\n      fi\n\n      case \" $deplibs\" in\n      *\\ -l* | *\\ -L*)\n\tfunc_warning \"\\`-l' and \\`-L' are ignored for archives\" ;;\n      esac\n\n      test -n \"$rpath\" && \\\n\tfunc_warning \"\\`-rpath' is ignored for archives\"\n\n      test -n \"$xrpath\" && \\\n\tfunc_warning \"\\`-R' is ignored for archives\"\n\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info/-version-number' is ignored for archives\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for archives\"\n\n      test -n \"$export_symbols$export_symbols_regex\" && \\\n\tfunc_warning \"\\`-export-symbols' is ignored for archives\"\n\n      # Now set the variables for building old libraries.\n      build_libtool_libs=no\n      oldlibs=\"$output\"\n      objs=\"$objs$old_deplibs\"\n      ;;\n\n    lib)\n      # Make sure we only generate libraries of the form `libNAME.la'.\n      case $outputname in\n      lib*)\n\tfunc_stripname 'lib' '.la' \"$outputname\"\n\tname=$func_stripname_result\n\teval shared_ext=\\\"$shrext_cmds\\\"\n\teval libname=\\\"$libname_spec\\\"\n\t;;\n      *)\n\ttest \"$module\" = no && \\\n\t  func_fatal_help \"libtool library \\`$output' must begin with \\`lib'\"\n\n\tif test \"$need_lib_prefix\" != no; then\n\t  # Add the \"lib\" prefix for modules if required\n\t  func_stripname '' '.la' \"$outputname\"\n\t  name=$func_stripname_result\n\t  eval shared_ext=\\\"$shrext_cmds\\\"\n\t  eval libname=\\\"$libname_spec\\\"\n\telse\n\t  func_stripname '' '.la' \"$outputname\"\n\t  libname=$func_stripname_result\n\tfi\n\t;;\n      esac\n\n      if test -n \"$objs\"; then\n\tif test \"$deplibs_check_method\" != pass_all; then\n\t  func_fatal_error \"cannot build libtool library \\`$output' from non-libtool objects on this host:$objs\"\n\telse\n\t  $ECHO\n\t  $ECHO \"*** Warning: Linking the shared library $output against the non-libtool\"\n\t  $ECHO \"*** objects $objs is not portable!\"\n\t  libobjs=\"$libobjs $objs\"\n\tfi\n      fi\n\n      test \"$dlself\" != no && \\\n\tfunc_warning \"\\`-dlopen self' is ignored for libtool libraries\"\n\n      set dummy $rpath\n      shift\n      test \"$#\" -gt 1 && \\\n\tfunc_warning \"ignoring multiple \\`-rpath's for a libtool library\"\n\n      install_libdir=\"$1\"\n\n      oldlibs=\n      if test -z \"$rpath\"; then\n\tif test \"$build_libtool_libs\" = yes; then\n\t  # Building a libtool convenience library.\n\t  # Some compilers have problems with a `.al' extension so\n\t  # convenience libraries should have the same extension an\n\t  # archive normally would.\n\t  oldlibs=\"$output_objdir/$libname.$libext $oldlibs\"\n\t  build_libtool_libs=convenience\n\t  build_old_libs=yes\n\tfi\n\n\ttest -n \"$vinfo\" && \\\n\t  func_warning \"\\`-version-info/-version-number' is ignored for convenience libraries\"\n\n\ttest -n \"$release\" && \\\n\t  func_warning \"\\`-release' is ignored for convenience libraries\"\n      else\n\n\t# Parse the version information argument.\n\tsave_ifs=\"$IFS\"; IFS=':'\n\tset dummy $vinfo 0 0 0\n\tshift\n\tIFS=\"$save_ifs\"\n\n\ttest -n \"$7\" && \\\n\t  func_fatal_help \"too many parameters to \\`-version-info'\"\n\n\t# convert absolute version numbers to libtool ages\n\t# this retains compatibility with .la files and attempts\n\t# to make the code below a bit more comprehensible\n\n\tcase $vinfo_number in\n\tyes)\n\t  number_major=\"$1\"\n\t  number_minor=\"$2\"\n\t  number_revision=\"$3\"\n\t  #\n\t  # There are really only two kinds -- those that\n\t  # use the current revision as the major version\n\t  # and those that subtract age and use age as\n\t  # a minor version.  But, then there is irix\n\t  # which has an extra 1 added just for fun\n\t  #\n\t  case $version_type in\n\t  darwin|linux|osf|windows|none)\n\t    func_arith $number_major + $number_minor\n\t    current=$func_arith_result\n\t    age=\"$number_minor\"\n\t    revision=\"$number_revision\"\n\t    ;;\n\t  freebsd-aout|freebsd-elf|sunos)\n\t    current=\"$number_major\"\n\t    revision=\"$number_minor\"\n\t    age=\"0\"\n\t    ;;\n\t  irix|nonstopux)\n\t    func_arith $number_major + $number_minor\n\t    current=$func_arith_result\n\t    age=\"$number_minor\"\n\t    revision=\"$number_minor\"\n\t    lt_irix_increment=no\n\t    ;;\n\t  *)\n\t    func_fatal_configuration \"$modename: unknown library version type \\`$version_type'\"\n\t    ;;\n\t  esac\n\t  ;;\n\tno)\n\t  current=\"$1\"\n\t  revision=\"$2\"\n\t  age=\"$3\"\n\t  ;;\n\tesac\n\n\t# Check that each of the things are valid numbers.\n\tcase $current in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"CURRENT \\`$current' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tcase $revision in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"REVISION \\`$revision' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tcase $age in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"AGE \\`$age' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tif test \"$age\" -gt \"$current\"; then\n\t  func_error \"AGE \\`$age' is greater than the current interface number \\`$current'\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\tfi\n\n\t# Calculate the version variables.\n\tmajor=\n\tversuffix=\n\tverstring=\n\tcase $version_type in\n\tnone) ;;\n\n\tdarwin)\n\t  # Like Linux, but with the current version available in\n\t  # verstring for coding it into the library header\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\"$major.$age.$revision\"\n\t  # Darwin ld doesn't like 0 for these options...\n\t  func_arith $current + 1\n\t  minor_current=$func_arith_result\n\t  xlcverstring=\"${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision\"\n\t  verstring=\"-compatibility_version $minor_current -current_version $minor_current.$revision\"\n\t  ;;\n\n\tfreebsd-aout)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\";\n\t  ;;\n\n\tfreebsd-elf)\n\t  major=\".$current\"\n\t  versuffix=\".$current\"\n\t  ;;\n\n\tirix | nonstopux)\n\t  if test \"X$lt_irix_increment\" = \"Xno\"; then\n\t    func_arith $current - $age\n\t  else\n\t    func_arith $current - $age + 1\n\t  fi\n\t  major=$func_arith_result\n\n\t  case $version_type in\n\t    nonstopux) verstring_prefix=nonstopux ;;\n\t    *)         verstring_prefix=sgi ;;\n\t  esac\n\t  verstring=\"$verstring_prefix$major.$revision\"\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$revision\n\t  while test \"$loop\" -ne 0; do\n\t    func_arith $revision - $loop\n\t    iface=$func_arith_result\n\t    func_arith $loop - 1\n\t    loop=$func_arith_result\n\t    verstring=\"$verstring_prefix$major.$iface:$verstring\"\n\t  done\n\n\t  # Before this point, $major must not contain `.'.\n\t  major=.$major\n\t  versuffix=\"$major.$revision\"\n\t  ;;\n\n\tlinux)\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\"$major.$age.$revision\"\n\t  ;;\n\n\tosf)\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\".$current.$age.$revision\"\n\t  verstring=\"$current.$age.$revision\"\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$age\n\t  while test \"$loop\" -ne 0; do\n\t    func_arith $current - $loop\n\t    iface=$func_arith_result\n\t    func_arith $loop - 1\n\t    loop=$func_arith_result\n\t    verstring=\"$verstring:${iface}.0\"\n\t  done\n\n\t  # Make executables depend on our current version.\n\t  verstring=\"$verstring:${current}.0\"\n\t  ;;\n\n\tqnx)\n\t  major=\".$current\"\n\t  versuffix=\".$current\"\n\t  ;;\n\n\tsunos)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\"\n\t  ;;\n\n\twindows)\n\t  # Use '-' rather than '.', since we only want one\n\t  # extension on DOS 8.3 filesystems.\n\t  func_arith $current - $age\n\t  major=$func_arith_result\n\t  versuffix=\"-$major\"\n\t  ;;\n\n\t*)\n\t  func_fatal_configuration \"unknown library version type \\`$version_type'\"\n\t  ;;\n\tesac\n\n\t# Clear the version info if we defaulted, and they specified a release.\n\tif test -z \"$vinfo\" && test -n \"$release\"; then\n\t  major=\n\t  case $version_type in\n\t  darwin)\n\t    # we can't check for \"0.0\" in archive_cmds due to quoting\n\t    # problems, so we reset it completely\n\t    verstring=\n\t    ;;\n\t  *)\n\t    verstring=\"0.0\"\n\t    ;;\n\t  esac\n\t  if test \"$need_version\" = no; then\n\t    versuffix=\n\t  else\n\t    versuffix=\".0.0\"\n\t  fi\n\tfi\n\n\t# Remove version info from name if versioning should be avoided\n\tif test \"$avoid_version\" = yes && test \"$need_version\" = no; then\n\t  major=\n\t  versuffix=\n\t  verstring=\"\"\n\tfi\n\n\t# Check to see if the archive will have undefined symbols.\n\tif test \"$allow_undefined\" = yes; then\n\t  if test \"$allow_undefined_flag\" = unsupported; then\n\t    func_warning \"undefined symbols not allowed in $host shared libraries\"\n\t    build_libtool_libs=no\n\t    build_old_libs=yes\n\t  fi\n\telse\n\t  # Don't allow undefined symbols.\n\t  allow_undefined_flag=\"$no_undefined_flag\"\n\tfi\n\n      fi\n\n      func_generate_dlsyms \"$libname\" \"$libname\" \"yes\"\n      libobjs=\"$libobjs $symfileobj\"\n      test \"X$libobjs\" = \"X \" && libobjs=\n\n      if test \"$mode\" != relink; then\n\t# Remove our outputs, but don't remove object files since they\n\t# may have been created when compiling PIC objects.\n\tremovelist=\n\ttempremovelist=`$ECHO \"$output_objdir/*\"`\n\tfor p in $tempremovelist; do\n\t  case $p in\n\t    *.$objext | *.gcno)\n\t       ;;\n\t    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)\n\t       if test \"X$precious_files_regex\" != \"X\"; then\n\t\t if $ECHO \"$p\" | $EGREP -e \"$precious_files_regex\" >/dev/null 2>&1\n\t\t then\n\t\t   continue\n\t\t fi\n\t       fi\n\t       removelist=\"$removelist $p\"\n\t       ;;\n\t    *) ;;\n\t  esac\n\tdone\n\ttest -n \"$removelist\" && \\\n\t  func_show_eval \"${RM}r \\$removelist\"\n      fi\n\n      # Now set the variables for building old libraries.\n      if test \"$build_old_libs\" = yes && test \"$build_libtool_libs\" != convenience ; then\n\toldlibs=\"$oldlibs $output_objdir/$libname.$libext\"\n\n\t# Transform .lo files to .o files.\n\toldobjs=\"$objs \"`$ECHO \"X$libobjs\" | $SP2NL | $Xsed -e '/\\.'${libext}'$/d' -e \"$lo2o\" | $NL2SP`\n      fi\n\n      # Eliminate all temporary directories.\n      #for path in $notinst_path; do\n      #\tlib_search_path=`$ECHO \"X$lib_search_path \" | $Xsed -e \"s% $path % %g\"`\n      #\tdeplibs=`$ECHO \"X$deplibs \" | $Xsed -e \"s% -L$path % %g\"`\n      #\tdependency_libs=`$ECHO \"X$dependency_libs \" | $Xsed -e \"s% -L$path % %g\"`\n      #done\n\n      if test -n \"$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\ttemp_xrpath=\n\tfor libdir in $xrpath; do\n\t  temp_xrpath=\"$temp_xrpath -R$libdir\"\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) finalize_rpath=\"$finalize_rpath $libdir\" ;;\n\t  esac\n\tdone\n\tif test \"$hardcode_into_libs\" != yes || test \"$build_old_libs\" = yes; then\n\t  dependency_libs=\"$temp_xrpath $dependency_libs\"\n\tfi\n      fi\n\n      # Make sure dlfiles contains only unique files that won't be dlpreopened\n      old_dlfiles=\"$dlfiles\"\n      dlfiles=\n      for lib in $old_dlfiles; do\n\tcase \" $dlprefiles $dlfiles \" in\n\t*\" $lib \"*) ;;\n\t*) dlfiles=\"$dlfiles $lib\" ;;\n\tesac\n      done\n\n      # Make sure dlprefiles contains only unique files\n      old_dlprefiles=\"$dlprefiles\"\n      dlprefiles=\n      for lib in $old_dlprefiles; do\n\tcase \"$dlprefiles \" in\n\t*\" $lib \"*) ;;\n\t*) dlprefiles=\"$dlprefiles $lib\" ;;\n\tesac\n      done\n\n      if test \"$build_libtool_libs\" = yes; then\n\tif test -n \"$rpath\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)\n\t    # these systems don't actually have a c library (as such)!\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C library is in the System framework\n\t    deplibs=\"$deplibs System.ltframework\"\n\t    ;;\n\t  *-*-netbsd*)\n\t    # Don't link with libc until the a.out ld.so is fixed.\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    ;;\n\t  *-*-sco3.2v5* | *-*-sco5v6*)\n\t    # Causes problems with __ctype\n\t    ;;\n\t  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)\n\t    # Compiler inserts libc in the correct place for threads to work\n\t    ;;\n\t  *)\n\t    # Add libc to deplibs on all other systems if necessary.\n\t    if test \"$build_libtool_need_lc\" = \"yes\"; then\n\t      deplibs=\"$deplibs -lc\"\n\t    fi\n\t    ;;\n\t  esac\n\tfi\n\n\t# Transform deplibs into only deplibs that can be linked in shared.\n\tname_save=$name\n\tlibname_save=$libname\n\trelease_save=$release\n\tversuffix_save=$versuffix\n\tmajor_save=$major\n\t# I'm not sure if I'm treating the release correctly.  I think\n\t# release should show up in the -l (ie -lgmp5) so we don't want to\n\t# add it in twice.  Is that correct?\n\trelease=\"\"\n\tversuffix=\"\"\n\tmajor=\"\"\n\tnewdeplibs=\n\tdroppeddeps=no\n\tcase $deplibs_check_method in\n\tpass_all)\n\t  # Don't check for shared/static.  Everything works.\n\t  # This might be a little naive.  We might want to check\n\t  # whether the library exists or not.  But this is on\n\t  # osf3 & osf4 and I'm not really sure... Just\n\t  # implementing what was already the behavior.\n\t  newdeplibs=$deplibs\n\t  ;;\n\ttest_compile)\n\t  # This code stresses the \"libraries are programs\" paradigm to its\n\t  # limits. Maybe even breaks it.  We compile a program, linking it\n\t  # against the deplibs as a proxy for the library.  Then we can check\n\t  # whether they linked in statically or dynamically with ldd.\n\t  $opt_dry_run || $RM conftest.c\n\t  cat > conftest.c <<EOF\n\t  int main() { return 0; }\nEOF\n\t  $opt_dry_run || $RM conftest\n\t  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then\n\t    ldd_output=`ldd conftest`\n\t    for i in $deplibs; do\n\t      case $i in\n\t      -l*)\n\t\tfunc_stripname -l '' \"$i\"\n\t\tname=$func_stripname_result\n\t\tif test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\t  case \" $predeps $postdeps \" in\n\t\t  *\" $i \"*)\n\t\t    newdeplibs=\"$newdeplibs $i\"\n\t\t    i=\"\"\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t\tif test -n \"$i\" ; then\n\t\t  libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\t  deplib_matches=`eval \"\\\\$ECHO \\\"$library_names_spec\\\"\"`\n\t\t  set dummy $deplib_matches; shift\n\t\t  deplib_match=$1\n\t\t  if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t    newdeplibs=\"$newdeplibs $i\"\n\t\t  else\n\t\t    droppeddeps=yes\n\t\t    $ECHO\n\t\t    $ECHO \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t    $ECHO \"*** I have the capability to make that library automatically link in when\"\n\t\t    $ECHO \"*** you link to this library.  But I can only do this if you have a\"\n\t\t    $ECHO \"*** shared version of the library, which I believe you do not have\"\n\t\t    $ECHO \"*** because a test_compile did reveal that the linker did not use it for\"\n\t\t    $ECHO \"*** its dynamic dependency list that programs get resolved with at runtime.\"\n\t\t  fi\n\t\tfi\n\t\t;;\n\t      *)\n\t\tnewdeplibs=\"$newdeplibs $i\"\n\t\t;;\n\t      esac\n\t    done\n\t  else\n\t    # Error occurred in the first compile.  Let's try to salvage\n\t    # the situation: Compile a separate program for each library.\n\t    for i in $deplibs; do\n\t      case $i in\n\t      -l*)\n\t\tfunc_stripname -l '' \"$i\"\n\t\tname=$func_stripname_result\n\t\t$opt_dry_run || $RM conftest\n\t\tif $LTCC $LTCFLAGS -o conftest conftest.c $i; then\n\t\t  ldd_output=`ldd conftest`\n\t\t  if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\t    case \" $predeps $postdeps \" in\n\t\t    *\" $i \"*)\n\t\t      newdeplibs=\"$newdeplibs $i\"\n\t\t      i=\"\"\n\t\t      ;;\n\t\t    esac\n\t\t  fi\n\t\t  if test -n \"$i\" ; then\n\t\t    libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\t    deplib_matches=`eval \"\\\\$ECHO \\\"$library_names_spec\\\"\"`\n\t\t    set dummy $deplib_matches; shift\n\t\t    deplib_match=$1\n\t\t    if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t      newdeplibs=\"$newdeplibs $i\"\n\t\t    else\n\t\t      droppeddeps=yes\n\t\t      $ECHO\n\t\t      $ECHO \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t      $ECHO \"*** I have the capability to make that library automatically link in when\"\n\t\t      $ECHO \"*** you link to this library.  But I can only do this if you have a\"\n\t\t      $ECHO \"*** shared version of the library, which you do not appear to have\"\n\t\t      $ECHO \"*** because a test_compile did reveal that the linker did not use this one\"\n\t\t      $ECHO \"*** as a dynamic dependency that programs can get resolved with at runtime.\"\n\t\t    fi\n\t\t  fi\n\t\telse\n\t\t  droppeddeps=yes\n\t\t  $ECHO\n\t\t  $ECHO \"*** Warning!  Library $i is needed by this library but I was not able to\"\n\t\t  $ECHO \"*** make it link in!  You will probably need to install it or some\"\n\t\t  $ECHO \"*** library that it depends on before this library will be fully\"\n\t\t  $ECHO \"*** functional.  Installing it before continuing would be even better.\"\n\t\tfi\n\t\t;;\n\t      *)\n\t\tnewdeplibs=\"$newdeplibs $i\"\n\t\t;;\n\t      esac\n\t    done\n\t  fi\n\t  ;;\n\tfile_magic*)\n\t  set dummy $deplibs_check_method; shift\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    case $a_deplib in\n\t    -l*)\n\t      func_stripname -l '' \"$a_deplib\"\n\t      name=$func_stripname_result\n\t      if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\tcase \" $predeps $postdeps \" in\n\t\t*\" $a_deplib \"*)\n\t\t  newdeplibs=\"$newdeplibs $a_deplib\"\n\t\t  a_deplib=\"\"\n\t\t  ;;\n\t\tesac\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tlibname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\tfor i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`\n\t\t  for potent_lib in $potential_libs; do\n\t\t      # Follow soft links.\n\t\t      if ls -lLd \"$potent_lib\" 2>/dev/null |\n\t\t\t $GREP \" -> \" >/dev/null; then\n\t\t\tcontinue\n\t\t      fi\n\t\t      # The statement above tries to avoid entering an\n\t\t      # endless loop below, in case of cyclic links.\n\t\t      # We might still enter an endless loop, since a link\n\t\t      # loop can be closed while we follow links,\n\t\t      # but so what?\n\t\t      potlib=\"$potent_lib\"\n\t\t      while test -h \"$potlib\" 2>/dev/null; do\n\t\t\tpotliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`\n\t\t\tcase $potliblink in\n\t\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) potlib=\"$potliblink\";;\n\t\t\t*) potlib=`$ECHO \"X$potlib\" | $Xsed -e 's,[^/]*$,,'`\"$potliblink\";;\n\t\t\tesac\n\t\t      done\n\t\t      if eval $file_magic_cmd \\\"\\$potlib\\\" 2>/dev/null |\n\t\t\t $SED -e 10q |\n\t\t\t $EGREP \"$file_magic_regex\" > /dev/null; then\n\t\t\tnewdeplibs=\"$newdeplibs $a_deplib\"\n\t\t\ta_deplib=\"\"\n\t\t\tbreak 2\n\t\t      fi\n\t\t  done\n\t\tdone\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\t$ECHO\n\t\t$ECHO \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\t$ECHO \"*** I have the capability to make that library automatically link in when\"\n\t\t$ECHO \"*** you link to this library.  But I can only do this if you have a\"\n\t\t$ECHO \"*** shared version of the library, which you do not appear to have\"\n\t\t$ECHO \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  $ECHO \"*** with $libname but no candidates were found. (...for file magic test)\"\n\t\telse\n\t\t  $ECHO \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  $ECHO \"*** using a file magic. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t      ;;\n\t    *)\n\t      # Add a -L argument.\n\t      newdeplibs=\"$newdeplibs $a_deplib\"\n\t      ;;\n\t    esac\n\t  done # Gone through all deplibs.\n\t  ;;\n\tmatch_pattern*)\n\t  set dummy $deplibs_check_method; shift\n\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    case $a_deplib in\n\t    -l*)\n\t      func_stripname -l '' \"$a_deplib\"\n\t      name=$func_stripname_result\n\t      if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\tcase \" $predeps $postdeps \" in\n\t\t*\" $a_deplib \"*)\n\t\t  newdeplibs=\"$newdeplibs $a_deplib\"\n\t\t  a_deplib=\"\"\n\t\t  ;;\n\t\tesac\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tlibname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\tfor i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`\n\t\t  for potent_lib in $potential_libs; do\n\t\t    potlib=\"$potent_lib\" # see symlink-check above in file_magic test\n\t\t    if eval \"\\$ECHO \\\"X$potent_lib\\\"\" 2>/dev/null | $Xsed -e 10q | \\\n\t\t       $EGREP \"$match_pattern_regex\" > /dev/null; then\n\t\t      newdeplibs=\"$newdeplibs $a_deplib\"\n\t\t      a_deplib=\"\"\n\t\t      break 2\n\t\t    fi\n\t\t  done\n\t\tdone\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\t$ECHO\n\t\t$ECHO \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\t$ECHO \"*** I have the capability to make that library automatically link in when\"\n\t\t$ECHO \"*** you link to this library.  But I can only do this if you have a\"\n\t\t$ECHO \"*** shared version of the library, which you do not appear to have\"\n\t\t$ECHO \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  $ECHO \"*** with $libname but no candidates were found. (...for regex pattern test)\"\n\t\telse\n\t\t  $ECHO \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  $ECHO \"*** using a regex pattern. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t      ;;\n\t    *)\n\t      # Add a -L argument.\n\t      newdeplibs=\"$newdeplibs $a_deplib\"\n\t      ;;\n\t    esac\n\t  done # Gone through all deplibs.\n\t  ;;\n\tnone | unknown | *)\n\t  newdeplibs=\"\"\n\t  tmp_deplibs=`$ECHO \"X $deplibs\" | $Xsed \\\n\t      -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`\n\t  if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t    for i in $predeps $postdeps ; do\n\t      # can't use Xsed below, because $i might contain '/'\n\t      tmp_deplibs=`$ECHO \"X $tmp_deplibs\" | $Xsed -e \"s,$i,,\"`\n\t    done\n\t  fi\n\t  if $ECHO \"X $tmp_deplibs\" | $Xsed -e 's/[\t ]//g' |\n\t     $GREP . >/dev/null; then\n\t    $ECHO\n\t    if test \"X$deplibs_check_method\" = \"Xnone\"; then\n\t      $ECHO \"*** Warning: inter-library dependencies are not supported in this platform.\"\n\t    else\n\t      $ECHO \"*** Warning: inter-library dependencies are not known to be supported.\"\n\t    fi\n\t    $ECHO \"*** All declared inter-library dependencies are being dropped.\"\n\t    droppeddeps=yes\n\t  fi\n\t  ;;\n\tesac\n\tversuffix=$versuffix_save\n\tmajor=$major_save\n\trelease=$release_save\n\tlibname=$libname_save\n\tname=$name_save\n\n\tcase $host in\n\t*-*-rhapsody* | *-*-darwin1.[012])\n\t  # On Rhapsody replace the C library with the System framework\n\t  newdeplibs=`$ECHO \"X $newdeplibs\" | $Xsed -e 's/ -lc / System.ltframework /'`\n\t  ;;\n\tesac\n\n\tif test \"$droppeddeps\" = yes; then\n\t  if test \"$module\" = yes; then\n\t    $ECHO\n\t    $ECHO \"*** Warning: libtool could not satisfy all declared inter-library\"\n\t    $ECHO \"*** dependencies of module $libname.  Therefore, libtool will create\"\n\t    $ECHO \"*** a static module, that should work as long as the dlopening\"\n\t    $ECHO \"*** application is linked with the -dlopen flag.\"\n\t    if test -z \"$global_symbol_pipe\"; then\n\t      $ECHO\n\t      $ECHO \"*** However, this would only work if libtool was able to extract symbol\"\n\t      $ECHO \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t      $ECHO \"*** not find such a program.  So, this module is probably useless.\"\n\t      $ECHO \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t    fi\n\t    if test \"$build_old_libs\" = no; then\n\t      oldlibs=\"$output_objdir/$libname.$libext\"\n\t      build_libtool_libs=module\n\t      build_old_libs=yes\n\t    else\n\t      build_libtool_libs=no\n\t    fi\n\t  else\n\t    $ECHO \"*** The inter-library dependencies that have been dropped here will be\"\n\t    $ECHO \"*** automatically added whenever a program is linked with this library\"\n\t    $ECHO \"*** or is declared to -dlopen it.\"\n\n\t    if test \"$allow_undefined\" = no; then\n\t      $ECHO\n\t      $ECHO \"*** Since this library must not contain undefined symbols,\"\n\t      $ECHO \"*** because either the platform does not support them or\"\n\t      $ECHO \"*** it was explicitly requested with -no-undefined,\"\n\t      $ECHO \"*** libtool will only create a static version of it.\"\n\t      if test \"$build_old_libs\" = no; then\n\t\toldlibs=\"$output_objdir/$libname.$libext\"\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  fi\n\tfi\n\t# Done checking deplibs!\n\tdeplibs=$newdeplibs\n      fi\n      # Time to change all our \"foo.ltframework\" stuff back to \"-framework foo\"\n      case $host in\n\t*-*-darwin*)\n\t  newdeplibs=`$ECHO \"X $newdeplibs\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  new_inherited_linker_flags=`$ECHO \"X $new_inherited_linker_flags\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  deplibs=`$ECHO \"X $deplibs\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  ;;\n      esac\n\n      # move library search paths that coincide with paths to not yet\n      # installed libraries to the beginning of the library search list\n      new_libs=\n      for path in $notinst_path; do\n\tcase \" $new_libs \" in\n\t*\" -L$path/$objdir \"*) ;;\n\t*)\n\t  case \" $deplibs \" in\n\t  *\" -L$path/$objdir \"*)\n\t    new_libs=\"$new_libs -L$path/$objdir\" ;;\n\t  esac\n\t  ;;\n\tesac\n      done\n      for deplib in $deplibs; do\n\tcase $deplib in\n\t-L*)\n\t  case \" $new_libs \" in\n\t  *\" $deplib \"*) ;;\n\t  *) new_libs=\"$new_libs $deplib\" ;;\n\t  esac\n\t  ;;\n\t*) new_libs=\"$new_libs $deplib\" ;;\n\tesac\n      done\n      deplibs=\"$new_libs\"\n\n      # All the library-specific variables (install_libdir is set above).\n      library_names=\n      old_library=\n      dlname=\n\n      # Test again, we may have decided not to build it any more\n      if test \"$build_libtool_libs\" = yes; then\n\tif test \"$hardcode_into_libs\" = yes; then\n\t  # Hardcode the library paths\n\t  hardcode_libdirs=\n\t  dep_rpath=\n\t  rpath=\"$finalize_rpath\"\n\t  test \"$mode\" != relink && rpath=\"$compile_rpath$rpath\"\n\t  for libdir in $rpath; do\n\t    if test -n \"$hardcode_libdir_flag_spec\"; then\n\t      if test -n \"$hardcode_libdir_separator\"; then\n\t\tif test -z \"$hardcode_libdirs\"; then\n\t\t  hardcode_libdirs=\"$libdir\"\n\t\telse\n\t\t  # Just accumulate the unique libdirs.\n\t\t  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t\t  *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t    ;;\n\t\t  *)\n\t\t    hardcode_libdirs=\"$hardcode_libdirs$hardcode_libdir_separator$libdir\"\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t      else\n\t\teval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t\tdep_rpath=\"$dep_rpath $flag\"\n\t      fi\n\t    elif test -n \"$runpath_var\"; then\n\t      case \"$perm_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) perm_rpath=\"$perm_rpath $libdir\" ;;\n\t      esac\n\t    fi\n\t  done\n\t  # Substitute the hardcoded libdirs into the rpath.\n\t  if test -n \"$hardcode_libdir_separator\" &&\n\t     test -n \"$hardcode_libdirs\"; then\n\t    libdir=\"$hardcode_libdirs\"\n\t    if test -n \"$hardcode_libdir_flag_spec_ld\"; then\n\t      eval dep_rpath=\\\"$hardcode_libdir_flag_spec_ld\\\"\n\t    else\n\t      eval dep_rpath=\\\"$hardcode_libdir_flag_spec\\\"\n\t    fi\n\t  fi\n\t  if test -n \"$runpath_var\" && test -n \"$perm_rpath\"; then\n\t    # We should set the runpath_var.\n\t    rpath=\n\t    for dir in $perm_rpath; do\n\t      rpath=\"$rpath$dir:\"\n\t    done\n\t    eval \"$runpath_var='$rpath\\$$runpath_var'; export $runpath_var\"\n\t  fi\n\t  test -n \"$dep_rpath\" && deplibs=\"$dep_rpath $deplibs\"\n\tfi\n\n\tshlibpath=\"$finalize_shlibpath\"\n\ttest \"$mode\" != relink && shlibpath=\"$compile_shlibpath$shlibpath\"\n\tif test -n \"$shlibpath\"; then\n\t  eval \"$shlibpath_var='$shlibpath\\$$shlibpath_var'; export $shlibpath_var\"\n\tfi\n\n\t# Get the real and link names of the library.\n\teval shared_ext=\\\"$shrext_cmds\\\"\n\teval library_names=\\\"$library_names_spec\\\"\n\tset dummy $library_names\n\tshift\n\trealname=\"$1\"\n\tshift\n\n\tif test -n \"$soname_spec\"; then\n\t  eval soname=\\\"$soname_spec\\\"\n\telse\n\t  soname=\"$realname\"\n\tfi\n\tif test -z \"$dlname\"; then\n\t  dlname=$soname\n\tfi\n\n\tlib=\"$output_objdir/$realname\"\n\tlinknames=\n\tfor link\n\tdo\n\t  linknames=\"$linknames $link\"\n\tdone\n\n\t# Use standard objects if they are pic\n\ttest -z \"$pic_flag\" && libobjs=`$ECHO \"X$libobjs\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n\ttest \"X$libobjs\" = \"X \" && libobjs=\n\n\tdelfiles=\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  $opt_dry_run || cp \"$export_symbols\" \"$output_objdir/$libname.uexp\"\n\t  export_symbols=\"$output_objdir/$libname.uexp\"\n\t  delfiles=\"$delfiles $export_symbols\"\n\tfi\n\n\torig_export_symbols=\n\tcase $host_os in\n\tcygwin* | mingw* | cegcc*)\n\t  if test -n \"$export_symbols\" && test -z \"$export_symbols_regex\"; then\n\t    # exporting using user supplied symfile\n\t    if test \"x`$SED 1q $export_symbols`\" != xEXPORTS; then\n\t      # and it's NOT already a .def file. Must figure out\n\t      # which of the given symbols are data symbols and tag\n\t      # them as such. So, trigger use of export_symbols_cmds.\n\t      # export_symbols gets reassigned inside the \"prepare\n\t      # the list of exported symbols\" if statement, so the\n\t      # include_expsyms logic still works.\n\t      orig_export_symbols=\"$export_symbols\"\n\t      export_symbols=\n\t      always_export_symbols=yes\n\t    fi\n\t  fi\n\t  ;;\n\tesac\n\n\t# Prepare the list of exported symbols\n\tif test -z \"$export_symbols\"; then\n\t  if test \"$always_export_symbols\" = yes || test -n \"$export_symbols_regex\"; then\n\t    func_verbose \"generating symbol list for \\`$libname.la'\"\n\t    export_symbols=\"$output_objdir/$libname.exp\"\n\t    $opt_dry_run || $RM $export_symbols\n\t    cmds=$export_symbols_cmds\n\t    save_ifs=\"$IFS\"; IFS='~'\n\t    for cmd in $cmds; do\n\t      IFS=\"$save_ifs\"\n\t      eval cmd=\\\"$cmd\\\"\n\t      func_len \" $cmd\"\n\t      len=$func_len_result\n\t      if test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t\tfunc_show_eval \"$cmd\" 'exit $?'\n\t\tskipped_export=false\n\t      else\n\t\t# The command line is too long to execute in one step.\n\t\tfunc_verbose \"using reloadable object file for export list...\"\n\t\tskipped_export=:\n\t\t# Break out early, otherwise skipped_export may be\n\t\t# set to false by a later but shorter cmd.\n\t\tbreak\n\t      fi\n\t    done\n\t    IFS=\"$save_ifs\"\n\t    if test -n \"$export_symbols_regex\" && test \"X$skipped_export\" != \"X:\"; then\n\t      func_show_eval '$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      func_show_eval '$MV \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  tmp_export_symbols=\"$export_symbols\"\n\t  test -n \"$orig_export_symbols\" && tmp_export_symbols=\"$orig_export_symbols\"\n\t  $opt_dry_run || eval '$ECHO \"X$include_expsyms\" | $Xsed | $SP2NL >> \"$tmp_export_symbols\"'\n\tfi\n\n\tif test \"X$skipped_export\" != \"X:\" && test -n \"$orig_export_symbols\"; then\n\t  # The given exports_symbols file has to be filtered, so filter it.\n\t  func_verbose \"filter symbol list for \\`$libname.la' to tag DATA exports\"\n\t  # FIXME: $output_objdir/$libname.filter potentially contains lots of\n\t  # 's' commands which not all seds can handle. GNU sed should be fine\n\t  # though. Also, the filter scales superlinearly with the number of\n\t  # global variables. join(1) would be nice here, but unfortunately\n\t  # isn't a blessed tool.\n\t  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\\(.*\\)\\([ \\,].*\\),s|^\\1$|\\1\\2|,' < $export_symbols > $output_objdir/$libname.filter\n\t  delfiles=\"$delfiles $export_symbols $output_objdir/$libname.filter\"\n\t  export_symbols=$output_objdir/$libname.def\n\t  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols\n\tfi\n\n\ttmp_deplibs=\n\tfor test_deplib in $deplibs; do\n\t  case \" $convenience \" in\n\t  *\" $test_deplib \"*) ;;\n\t  *)\n\t    tmp_deplibs=\"$tmp_deplibs $test_deplib\"\n\t    ;;\n\t  esac\n\tdone\n\tdeplibs=\"$tmp_deplibs\"\n\n\tif test -n \"$convenience\"; then\n\t  if test -n \"$whole_archive_flag_spec\" &&\n\t    test \"$compiler_needs_object\" = yes &&\n\t    test -z \"$libobjs\"; then\n\t    # extract the archives, so we have objects to list.\n\t    # TODO: could optimize this to just extract one archive.\n\t    whole_archive_flag_spec=\n\t  fi\n\t  if test -n \"$whole_archive_flag_spec\"; then\n\t    save_libobjs=$libobjs\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  else\n\t    gentop=\"$output_objdir/${outputname}x\"\n\t    generated=\"$generated $gentop\"\n\n\t    func_extract_archives $gentop $convenience\n\t    libobjs=\"$libobjs $func_extract_archives_result\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  fi\n\tfi\n\n\tif test \"$thread_safe\" = yes && test -n \"$thread_safe_flag_spec\"; then\n\t  eval flag=\\\"$thread_safe_flag_spec\\\"\n\t  linker_flags=\"$linker_flags $flag\"\n\tfi\n\n\t# Make a backup of the uninstalled library when relinking\n\tif test \"$mode\" = relink; then\n\t  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?\n\tfi\n\n\t# Do each of the archive commands.\n\tif test \"$module\" = yes && test -n \"$module_cmds\" ; then\n\t  if test -n \"$export_symbols\" && test -n \"$module_expsym_cmds\"; then\n\t    eval test_cmds=\\\"$module_expsym_cmds\\\"\n\t    cmds=$module_expsym_cmds\n\t  else\n\t    eval test_cmds=\\\"$module_cmds\\\"\n\t    cmds=$module_cmds\n\t  fi\n\telse\n\t  if test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t    eval test_cmds=\\\"$archive_expsym_cmds\\\"\n\t    cmds=$archive_expsym_cmds\n\t  else\n\t    eval test_cmds=\\\"$archive_cmds\\\"\n\t    cmds=$archive_cmds\n\t  fi\n\tfi\n\n\tif test \"X$skipped_export\" != \"X:\" &&\n\t   func_len \" $test_cmds\" &&\n\t   len=$func_len_result &&\n\t   test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t  :\n\telse\n\t  # The command line is too long to link in one step, link piecewise\n\t  # or, if using GNU ld and skipped_export is not :, use a linker\n\t  # script.\n\n\t  # Save the value of $output and $libobjs because we want to\n\t  # use them later.  If we have whole_archive_flag_spec, we\n\t  # want to use save_libobjs as it was before\n\t  # whole_archive_flag_spec was expanded, because we can't\n\t  # assume the linker understands whole_archive_flag_spec.\n\t  # This may have to be revisited, in case too many\n\t  # convenience libraries get linked in and end up exceeding\n\t  # the spec.\n\t  if test -z \"$convenience\" || test -z \"$whole_archive_flag_spec\"; then\n\t    save_libobjs=$libobjs\n\t  fi\n\t  save_output=$output\n\t  output_la=`$ECHO \"X$output\" | $Xsed -e \"$basename\"`\n\n\t  # Clear the reloadable object creation command queue and\n\t  # initialize k to one.\n\t  test_cmds=\n\t  concat_cmds=\n\t  objlist=\n\t  last_robj=\n\t  k=1\n\n\t  if test -n \"$save_libobjs\" && test \"X$skipped_export\" != \"X:\" && test \"$with_gnu_ld\" = yes; then\n\t    output=${output_objdir}/${output_la}.lnkscript\n\t    func_verbose \"creating GNU ld script: $output\"\n\t    $ECHO 'INPUT (' > $output\n\t    for obj in $save_libobjs\n\t    do\n\t      $ECHO \"$obj\" >> $output\n\t    done\n\t    $ECHO ')' >> $output\n\t    delfiles=\"$delfiles $output\"\n\t  elif test -n \"$save_libobjs\" && test \"X$skipped_export\" != \"X:\" && test \"X$file_list_spec\" != X; then\n\t    output=${output_objdir}/${output_la}.lnk\n\t    func_verbose \"creating linker input file list: $output\"\n\t    : > $output\n\t    set x $save_libobjs\n\t    shift\n\t    firstobj=\n\t    if test \"$compiler_needs_object\" = yes; then\n\t      firstobj=\"$1 \"\n\t      shift\n\t    fi\n\t    for obj\n\t    do\n\t      $ECHO \"$obj\" >> $output\n\t    done\n\t    delfiles=\"$delfiles $output\"\n\t    output=$firstobj\\\"$file_list_spec$output\\\"\n\t  else\n\t    if test -n \"$save_libobjs\"; then\n\t      func_verbose \"creating reloadable object files...\"\n\t      output=$output_objdir/$output_la-${k}.$objext\n\t      eval test_cmds=\\\"$reload_cmds\\\"\n\t      func_len \" $test_cmds\"\n\t      len0=$func_len_result\n\t      len=$len0\n\n\t      # Loop over the list of objects to be linked.\n\t      for obj in $save_libobjs\n\t      do\n\t\tfunc_len \" $obj\"\n\t\tfunc_arith $len + $func_len_result\n\t\tlen=$func_arith_result\n\t\tif test \"X$objlist\" = X ||\n\t\t   test \"$len\" -lt \"$max_cmd_len\"; then\n\t\t  func_append objlist \" $obj\"\n\t\telse\n\t\t  # The command $test_cmds is almost too long, add a\n\t\t  # command to the queue.\n\t\t  if test \"$k\" -eq 1 ; then\n\t\t    # The first file doesn't have a previous command to add.\n\t\t    eval concat_cmds=\\\"$reload_cmds $objlist $last_robj\\\"\n\t\t  else\n\t\t    # All subsequent reloadable object files will link in\n\t\t    # the last one created.\n\t\t    eval concat_cmds=\\\"\\$concat_cmds~$reload_cmds $objlist $last_robj~\\$RM $last_robj\\\"\n\t\t  fi\n\t\t  last_robj=$output_objdir/$output_la-${k}.$objext\n\t\t  func_arith $k + 1\n\t\t  k=$func_arith_result\n\t\t  output=$output_objdir/$output_la-${k}.$objext\n\t\t  objlist=$obj\n\t\t  func_len \" $last_robj\"\n\t\t  func_arith $len0 + $func_len_result\n\t\t  len=$func_arith_result\n\t\tfi\n\t      done\n\t      # Handle the remaining objects by creating one last\n\t      # reloadable object file.  All subsequent reloadable object\n\t      # files will link in the last one created.\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\${concat_cmds}$reload_cmds $objlist $last_robj\\\"\n\t      if test -n \"$last_robj\"; then\n\t        eval concat_cmds=\\\"\\${concat_cmds}~\\$RM $last_robj\\\"\n\t      fi\n\t      delfiles=\"$delfiles $output\"\n\n\t    else\n\t      output=\n\t    fi\n\n\t    if ${skipped_export-false}; then\n\t      func_verbose \"generating symbol list for \\`$libname.la'\"\n\t      export_symbols=\"$output_objdir/$libname.exp\"\n\t      $opt_dry_run || $RM $export_symbols\n\t      libobjs=$output\n\t      # Append the command to create the export file.\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\$concat_cmds$export_symbols_cmds\\\"\n\t      if test -n \"$last_robj\"; then\n\t\teval concat_cmds=\\\"\\$concat_cmds~\\$RM $last_robj\\\"\n\t      fi\n\t    fi\n\n\t    test -n \"$save_libobjs\" &&\n\t      func_verbose \"creating a temporary reloadable object file: $output\"\n\n\t    # Loop through the commands generated above and execute them.\n\t    save_ifs=\"$IFS\"; IFS='~'\n\t    for cmd in $concat_cmds; do\n\t      IFS=\"$save_ifs\"\n\t      $opt_silent || {\n\t\t  func_quote_for_expand \"$cmd\"\n\t\t  eval \"func_echo $func_quote_for_expand_result\"\n\t      }\n\t      $opt_dry_run || eval \"$cmd\" || {\n\t\tlt_exit=$?\n\n\t\t# Restore the uninstalled library and exit\n\t\tif test \"$mode\" = relink; then\n\t\t  ( cd \"$output_objdir\" && \\\n\t\t    $RM \"${realname}T\" && \\\n\t\t    $MV \"${realname}U\" \"$realname\" )\n\t\tfi\n\n\t\texit $lt_exit\n\t      }\n\t    done\n\t    IFS=\"$save_ifs\"\n\n\t    if test -n \"$export_symbols_regex\" && ${skipped_export-false}; then\n\t      func_show_eval '$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      func_show_eval '$MV \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\n          if ${skipped_export-false}; then\n\t    if test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t      tmp_export_symbols=\"$export_symbols\"\n\t      test -n \"$orig_export_symbols\" && tmp_export_symbols=\"$orig_export_symbols\"\n\t      $opt_dry_run || eval '$ECHO \"X$include_expsyms\" | $Xsed | $SP2NL >> \"$tmp_export_symbols\"'\n\t    fi\n\n\t    if test -n \"$orig_export_symbols\"; then\n\t      # The given exports_symbols file has to be filtered, so filter it.\n\t      func_verbose \"filter symbol list for \\`$libname.la' to tag DATA exports\"\n\t      # FIXME: $output_objdir/$libname.filter potentially contains lots of\n\t      # 's' commands which not all seds can handle. GNU sed should be fine\n\t      # though. Also, the filter scales superlinearly with the number of\n\t      # global variables. join(1) would be nice here, but unfortunately\n\t      # isn't a blessed tool.\n\t      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\\(.*\\)\\([ \\,].*\\),s|^\\1$|\\1\\2|,' < $export_symbols > $output_objdir/$libname.filter\n\t      delfiles=\"$delfiles $export_symbols $output_objdir/$libname.filter\"\n\t      export_symbols=$output_objdir/$libname.def\n\t      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols\n\t    fi\n\t  fi\n\n\t  libobjs=$output\n\t  # Restore the value of output.\n\t  output=$save_output\n\n\t  if test -n \"$convenience\" && test -n \"$whole_archive_flag_spec\"; then\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  fi\n\t  # Expand the library linking commands again to reset the\n\t  # value of $libobjs for piecewise linking.\n\n\t  # Do each of the archive commands.\n\t  if test \"$module\" = yes && test -n \"$module_cmds\" ; then\n\t    if test -n \"$export_symbols\" && test -n \"$module_expsym_cmds\"; then\n\t      cmds=$module_expsym_cmds\n\t    else\n\t      cmds=$module_cmds\n\t    fi\n\t  else\n\t    if test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t      cmds=$archive_expsym_cmds\n\t    else\n\t      cmds=$archive_cmds\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$delfiles\"; then\n\t  # Append the command to remove temporary files to $cmds.\n\t  eval cmds=\\\"\\$cmds~\\$RM $delfiles\\\"\n\tfi\n\n\t# Add any objects from preloaded convenience libraries\n\tif test -n \"$dlprefiles\"; then\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  generated=\"$generated $gentop\"\n\n\t  func_extract_archives $gentop $dlprefiles\n\t  libobjs=\"$libobjs $func_extract_archives_result\"\n\t  test \"X$libobjs\" = \"X \" && libobjs=\n\tfi\n\n\tsave_ifs=\"$IFS\"; IFS='~'\n\tfor cmd in $cmds; do\n\t  IFS=\"$save_ifs\"\n\t  eval cmd=\\\"$cmd\\\"\n\t  $opt_silent || {\n\t    func_quote_for_expand \"$cmd\"\n\t    eval \"func_echo $func_quote_for_expand_result\"\n\t  }\n\t  $opt_dry_run || eval \"$cmd\" || {\n\t    lt_exit=$?\n\n\t    # Restore the uninstalled library and exit\n\t    if test \"$mode\" = relink; then\n\t      ( cd \"$output_objdir\" && \\\n\t        $RM \"${realname}T\" && \\\n\t\t$MV \"${realname}U\" \"$realname\" )\n\t    fi\n\n\t    exit $lt_exit\n\t  }\n\tdone\n\tIFS=\"$save_ifs\"\n\n\t# Restore the uninstalled library and exit\n\tif test \"$mode\" = relink; then\n\t  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?\n\n\t  if test -n \"$convenience\"; then\n\t    if test -z \"$whole_archive_flag_spec\"; then\n\t      func_show_eval '${RM}r \"$gentop\"'\n\t    fi\n\t  fi\n\n\t  exit $EXIT_SUCCESS\n\tfi\n\n\t# Create links to the real library.\n\tfor linkname in $linknames; do\n\t  if test \"$realname\" != \"$linkname\"; then\n\t    func_show_eval '(cd \"$output_objdir\" && $RM \"$linkname\" && $LN_S \"$realname\" \"$linkname\")' 'exit $?'\n\t  fi\n\tdone\n\n\t# If -module or -export-dynamic was specified, set the dlname.\n\tif test \"$module\" = yes || test \"$export_dynamic\" = yes; then\n\t  # On all known operating systems, these are identical.\n\t  dlname=\"$soname\"\n\tfi\n      fi\n      ;;\n\n    obj)\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\tfunc_warning \"\\`-dlopen' is ignored for objects\"\n      fi\n\n      case \" $deplibs\" in\n      *\\ -l* | *\\ -L*)\n\tfunc_warning \"\\`-l' and \\`-L' are ignored for objects\" ;;\n      esac\n\n      test -n \"$rpath\" && \\\n\tfunc_warning \"\\`-rpath' is ignored for objects\"\n\n      test -n \"$xrpath\" && \\\n\tfunc_warning \"\\`-R' is ignored for objects\"\n\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info' is ignored for objects\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for objects\"\n\n      case $output in\n      *.lo)\n\ttest -n \"$objs$old_deplibs\" && \\\n\t  func_fatal_error \"cannot build library object \\`$output' from non-libtool objects\"\n\n\tlibobj=$output\n\tfunc_lo2o \"$libobj\"\n\tobj=$func_lo2o_result\n\t;;\n      *)\n\tlibobj=\n\tobj=\"$output\"\n\t;;\n      esac\n\n      # Delete the old objects.\n      $opt_dry_run || $RM $obj $libobj\n\n      # Objects from convenience libraries.  This assumes\n      # single-version convenience libraries.  Whenever we create\n      # different ones for PIC/non-PIC, this we'll have to duplicate\n      # the extraction.\n      reload_conv_objs=\n      gentop=\n      # reload_cmds runs $LD directly, so let us get rid of\n      # -Wl from whole_archive_flag_spec and hope we can get by with\n      # turning comma into space..\n      wl=\n\n      if test -n \"$convenience\"; then\n\tif test -n \"$whole_archive_flag_spec\"; then\n\t  eval tmp_whole_archive_flags=\\\"$whole_archive_flag_spec\\\"\n\t  reload_conv_objs=$reload_objs\\ `$ECHO \"X$tmp_whole_archive_flags\" | $Xsed -e 's|,| |g'`\n\telse\n\t  gentop=\"$output_objdir/${obj}x\"\n\t  generated=\"$generated $gentop\"\n\n\t  func_extract_archives $gentop $convenience\n\t  reload_conv_objs=\"$reload_objs $func_extract_archives_result\"\n\tfi\n      fi\n\n      # Create the old-style object.\n      reload_objs=\"$objs$old_deplibs \"`$ECHO \"X$libobjs\" | $SP2NL | $Xsed -e '/\\.'${libext}$'/d' -e '/\\.lib$/d' -e \"$lo2o\" | $NL2SP`\" $reload_conv_objs\" ### testsuite: skip nested quoting test\n\n      output=\"$obj\"\n      func_execute_cmds \"$reload_cmds\" 'exit $?'\n\n      # Exit if we aren't doing a library object file.\n      if test -z \"$libobj\"; then\n\tif test -n \"$gentop\"; then\n\t  func_show_eval '${RM}r \"$gentop\"'\n\tfi\n\n\texit $EXIT_SUCCESS\n      fi\n\n      if test \"$build_libtool_libs\" != yes; then\n\tif test -n \"$gentop\"; then\n\t  func_show_eval '${RM}r \"$gentop\"'\n\tfi\n\n\t# Create an invalid libtool object if no PIC, so that we don't\n\t# accidentally link it into a program.\n\t# $show \"echo timestamp > $libobj\"\n\t# $opt_dry_run || eval \"echo timestamp > $libobj\" || exit $?\n\texit $EXIT_SUCCESS\n      fi\n\n      if test -n \"$pic_flag\" || test \"$pic_mode\" != default; then\n\t# Only do commands if we really have different PIC objects.\n\treload_objs=\"$libobjs $reload_conv_objs\"\n\toutput=\"$libobj\"\n\tfunc_execute_cmds \"$reload_cmds\" 'exit $?'\n      fi\n\n      if test -n \"$gentop\"; then\n\tfunc_show_eval '${RM}r \"$gentop\"'\n      fi\n\n      exit $EXIT_SUCCESS\n      ;;\n\n    prog)\n      case $host in\n\t*cygwin*) func_stripname '' '.exe' \"$output\"\n\t          output=$func_stripname_result.exe;;\n      esac\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info' is ignored for programs\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for programs\"\n\n      test \"$preload\" = yes \\\n        && test \"$dlopen_support\" = unknown \\\n\t&& test \"$dlopen_self\" = unknown \\\n\t&& test \"$dlopen_self_static\" = unknown && \\\n\t  func_warning \"\\`LT_INIT([dlopen])' not used. Assuming no dlopen support.\"\n\n      case $host in\n      *-*-rhapsody* | *-*-darwin1.[012])\n\t# On Rhapsody replace the C library is the System framework\n\tcompile_deplibs=`$ECHO \"X $compile_deplibs\" | $Xsed -e 's/ -lc / System.ltframework /'`\n\tfinalize_deplibs=`$ECHO \"X $finalize_deplibs\" | $Xsed -e 's/ -lc / System.ltframework /'`\n\t;;\n      esac\n\n      case $host in\n      *-*-darwin*)\n\t# Don't allow lazy linking, it breaks C++ global constructors\n\t# But is supposedly fixed on 10.4 or later (yay!).\n\tif test \"$tagname\" = CXX ; then\n\t  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in\n\t    10.[0123])\n\t      compile_command=\"$compile_command ${wl}-bind_at_load\"\n\t      finalize_command=\"$finalize_command ${wl}-bind_at_load\"\n\t    ;;\n\t  esac\n\tfi\n\t# Time to change all our \"foo.ltframework\" stuff back to \"-framework foo\"\n\tcompile_deplibs=`$ECHO \"X $compile_deplibs\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tfinalize_deplibs=`$ECHO \"X $finalize_deplibs\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t;;\n      esac\n\n\n      # move library search paths that coincide with paths to not yet\n      # installed libraries to the beginning of the library search list\n      new_libs=\n      for path in $notinst_path; do\n\tcase \" $new_libs \" in\n\t*\" -L$path/$objdir \"*) ;;\n\t*)\n\t  case \" $compile_deplibs \" in\n\t  *\" -L$path/$objdir \"*)\n\t    new_libs=\"$new_libs -L$path/$objdir\" ;;\n\t  esac\n\t  ;;\n\tesac\n      done\n      for deplib in $compile_deplibs; do\n\tcase $deplib in\n\t-L*)\n\t  case \" $new_libs \" in\n\t  *\" $deplib \"*) ;;\n\t  *) new_libs=\"$new_libs $deplib\" ;;\n\t  esac\n\t  ;;\n\t*) new_libs=\"$new_libs $deplib\" ;;\n\tesac\n      done\n      compile_deplibs=\"$new_libs\"\n\n\n      compile_command=\"$compile_command $compile_deplibs\"\n      finalize_command=\"$finalize_command $finalize_deplibs\"\n\n      if test -n \"$rpath$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\tfor libdir in $rpath $xrpath; do\n\t  # This is the magic to use -rpath.\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) finalize_rpath=\"$finalize_rpath $libdir\" ;;\n\t  esac\n\tdone\n      fi\n\n      # Now hardcode the library paths\n      rpath=\n      hardcode_libdirs=\n      for libdir in $compile_rpath $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\thardcode_libdirs=\"$hardcode_libdirs$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    rpath=\"$rpath $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) perm_rpath=\"$perm_rpath $libdir\" ;;\n\t  esac\n\tfi\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n\t  testbindir=`${ECHO} \"$libdir\" | ${SED} -e 's*/lib$*/bin*'`\n\t  case :$dllsearchpath: in\n\t  *\":$libdir:\"*) ;;\n\t  ::) dllsearchpath=$libdir;;\n\t  *) dllsearchpath=\"$dllsearchpath:$libdir\";;\n\t  esac\n\t  case :$dllsearchpath: in\n\t  *\":$testbindir:\"*) ;;\n\t  ::) dllsearchpath=$testbindir;;\n\t  *) dllsearchpath=\"$dllsearchpath:$testbindir\";;\n\t  esac\n\t  ;;\n\tesac\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      compile_rpath=\"$rpath\"\n\n      rpath=\n      hardcode_libdirs=\n      for libdir in $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\thardcode_libdirs=\"$hardcode_libdirs$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    rpath=\"$rpath $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$finalize_perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) finalize_perm_rpath=\"$finalize_perm_rpath $libdir\" ;;\n\t  esac\n\tfi\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      finalize_rpath=\"$rpath\"\n\n      if test -n \"$libobjs\" && test \"$build_old_libs\" = yes; then\n\t# Transform all the library objects into standard objects.\n\tcompile_command=`$ECHO \"X$compile_command\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n\tfinalize_command=`$ECHO \"X$finalize_command\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n      fi\n\n      func_generate_dlsyms \"$outputname\" \"@PROGRAM@\" \"no\"\n\n      # template prelinking step\n      if test -n \"$prelink_cmds\"; then\n\tfunc_execute_cmds \"$prelink_cmds\" 'exit $?'\n      fi\n\n      wrappers_required=yes\n      case $host in\n      *cygwin* | *mingw* )\n        if test \"$build_libtool_libs\" != yes; then\n          wrappers_required=no\n        fi\n        ;;\n      *cegcc)\n        # Disable wrappers for cegcc, we are cross compiling anyway.\n        wrappers_required=no\n        ;;\n      *)\n        if test \"$need_relink\" = no || test \"$build_libtool_libs\" != yes; then\n          wrappers_required=no\n        fi\n        ;;\n      esac\n      if test \"$wrappers_required\" = no; then\n\t# Replace the output file specification.\n\tcompile_command=`$ECHO \"X$compile_command\" | $Xsed -e 's%@OUTPUT@%'\"$output\"'%g'`\n\tlink_command=\"$compile_command$compile_rpath\"\n\n\t# We have no uninstalled library dependencies, so finalize right now.\n\texit_status=0\n\tfunc_show_eval \"$link_command\" 'exit_status=$?'\n\n\t# Delete the generated files.\n\tif test -f \"$output_objdir/${outputname}S.${objext}\"; then\n\t  func_show_eval '$RM \"$output_objdir/${outputname}S.${objext}\"'\n\tfi\n\n\texit $exit_status\n      fi\n\n      if test -n \"$compile_shlibpath$finalize_shlibpath\"; then\n\tcompile_command=\"$shlibpath_var=\\\"$compile_shlibpath$finalize_shlibpath\\$$shlibpath_var\\\" $compile_command\"\n      fi\n      if test -n \"$finalize_shlibpath\"; then\n\tfinalize_command=\"$shlibpath_var=\\\"$finalize_shlibpath\\$$shlibpath_var\\\" $finalize_command\"\n      fi\n\n      compile_var=\n      finalize_var=\n      if test -n \"$runpath_var\"; then\n\tif test -n \"$perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $perm_rpath; do\n\t    rpath=\"$rpath$dir:\"\n\t  done\n\t  compile_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n\tif test -n \"$finalize_perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $finalize_perm_rpath; do\n\t    rpath=\"$rpath$dir:\"\n\t  done\n\t  finalize_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n      fi\n\n      if test \"$no_install\" = yes; then\n\t# We don't need to create a wrapper script.\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\t# Replace the output file specification.\n\tlink_command=`$ECHO \"X$link_command\" | $Xsed -e 's%@OUTPUT@%'\"$output\"'%g'`\n\t# Delete the old output file.\n\t$opt_dry_run || $RM $output\n\t# Link the executable and exit\n\tfunc_show_eval \"$link_command\" 'exit $?'\n\texit $EXIT_SUCCESS\n      fi\n\n      if test \"$hardcode_action\" = relink; then\n\t# Fast installation is not supported\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\trelink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\n\tfunc_warning \"this platform does not like uninstalled shared libraries\"\n\tfunc_warning \"\\`$output' will be relinked during installation\"\n      else\n\tif test \"$fast_install\" != no; then\n\t  link_command=\"$finalize_var$compile_command$finalize_rpath\"\n\t  if test \"$fast_install\" = yes; then\n\t    relink_command=`$ECHO \"X$compile_var$compile_command$compile_rpath\" | $Xsed -e 's%@OUTPUT@%\\$progdir/\\$file%g'`\n\t  else\n\t    # fast_install is set to needless\n\t    relink_command=\n\t  fi\n\telse\n\t  link_command=\"$compile_var$compile_command$compile_rpath\"\n\t  relink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\tfi\n      fi\n\n      # Replace the output file specification.\n      link_command=`$ECHO \"X$link_command\" | $Xsed -e 's%@OUTPUT@%'\"$output_objdir/$outputname\"'%g'`\n\n      # Delete the old output files.\n      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname\n\n      func_show_eval \"$link_command\" 'exit $?'\n\n      # Now create the wrapper script.\n      func_verbose \"creating $output\"\n\n      # Quote the relink command for shipping.\n      if test -n \"$relink_command\"; then\n\t# Preserve any variables that may affect compiler behavior\n\tfor var in $variables_saved_for_relink; do\n\t  if eval test -z \\\"\\${$var+set}\\\"; then\n\t    relink_command=\"{ test -z \\\"\\${$var+set}\\\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command\"\n\t  elif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t    relink_command=\"$var=; export $var; $relink_command\"\n\t  else\n\t    func_quote_for_eval \"$var_value\"\n\t    relink_command=\"$var=$func_quote_for_eval_result; export $var; $relink_command\"\n\t  fi\n\tdone\n\trelink_command=\"(cd `pwd`; $relink_command)\"\n\trelink_command=`$ECHO \"X$relink_command\" | $Xsed -e \"$sed_quote_subst\"`\n      fi\n\n      # Quote $ECHO for shipping.\n      if test \"X$ECHO\" = \"X$SHELL $progpath --fallback-echo\"; then\n\tcase $progpath in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) qecho=\"$SHELL $progpath --fallback-echo\";;\n\t*) qecho=\"$SHELL `pwd`/$progpath --fallback-echo\";;\n\tesac\n\tqecho=`$ECHO \"X$qecho\" | $Xsed -e \"$sed_quote_subst\"`\n      else\n\tqecho=`$ECHO \"X$ECHO\" | $Xsed -e \"$sed_quote_subst\"`\n      fi\n\n      # Only actually do things if not in dry run mode.\n      $opt_dry_run || {\n\t# win32 will think the script is a binary if it has\n\t# a .exe suffix, so we strip it off here.\n\tcase $output in\n\t  *.exe) func_stripname '' '.exe' \"$output\"\n\t         output=$func_stripname_result ;;\n\tesac\n\t# test for cygwin because mv fails w/o .exe extensions\n\tcase $host in\n\t  *cygwin*)\n\t    exeext=.exe\n\t    func_stripname '' '.exe' \"$outputname\"\n\t    outputname=$func_stripname_result ;;\n\t  *) exeext= ;;\n\tesac\n\tcase $host in\n\t  *cygwin* | *mingw* )\n\t    func_dirname_and_basename \"$output\" \"\" \".\"\n\t    output_name=$func_basename_result\n\t    output_path=$func_dirname_result\n\t    cwrappersource=\"$output_path/$objdir/lt-$output_name.c\"\n\t    cwrapper=\"$output_path/$output_name.exe\"\n\t    $RM $cwrappersource $cwrapper\n\t    trap \"$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE\" 1 2 15\n\n\t    func_emit_cwrapperexe_src > $cwrappersource\n\n\t    # The wrapper executable is built using the $host compiler,\n\t    # because it contains $host paths and files. If cross-\n\t    # compiling, it, like the target executable, must be\n\t    # executed on the $host or under an emulation environment.\n\t    $opt_dry_run || {\n\t      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource\n\t      $STRIP $cwrapper\n\t    }\n\n\t    # Now, create the wrapper script for func_source use:\n\t    func_ltwrapper_scriptname $cwrapper\n\t    $RM $func_ltwrapper_scriptname_result\n\t    trap \"$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE\" 1 2 15\n\t    $opt_dry_run || {\n\t      # note: this script will not be executed, so do not chmod.\n\t      if test \"x$build\" = \"x$host\" ; then\n\t\t$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result\n\t      else\n\t\tfunc_emit_wrapper no > $func_ltwrapper_scriptname_result\n\t      fi\n\t    }\n\t  ;;\n\t  * )\n\t    $RM $output\n\t    trap \"$RM $output; exit $EXIT_FAILURE\" 1 2 15\n\n\t    func_emit_wrapper no > $output\n\t    chmod +x $output\n\t  ;;\n\tesac\n      }\n      exit $EXIT_SUCCESS\n      ;;\n    esac\n\n    # See if we need to build an old-fashioned archive.\n    for oldlib in $oldlibs; do\n\n      if test \"$build_libtool_libs\" = convenience; then\n\toldobjs=\"$libobjs_save $symfileobj\"\n\taddlibs=\"$convenience\"\n\tbuild_libtool_libs=no\n      else\n\tif test \"$build_libtool_libs\" = module; then\n\t  oldobjs=\"$libobjs_save\"\n\t  build_libtool_libs=no\n\telse\n\t  oldobjs=\"$old_deplibs $non_pic_objects\"\n\t  if test \"$preload\" = yes && test -f \"$symfileobj\"; then\n\t    oldobjs=\"$oldobjs $symfileobj\"\n\t  fi\n\tfi\n\taddlibs=\"$old_convenience\"\n      fi\n\n      if test -n \"$addlibs\"; then\n\tgentop=\"$output_objdir/${outputname}x\"\n\tgenerated=\"$generated $gentop\"\n\n\tfunc_extract_archives $gentop $addlibs\n\toldobjs=\"$oldobjs $func_extract_archives_result\"\n      fi\n\n      # Do each command in the archive commands.\n      if test -n \"$old_archive_from_new_cmds\" && test \"$build_libtool_libs\" = yes; then\n\tcmds=$old_archive_from_new_cmds\n      else\n\n\t# Add any objects from preloaded convenience libraries\n\tif test -n \"$dlprefiles\"; then\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  generated=\"$generated $gentop\"\n\n\t  func_extract_archives $gentop $dlprefiles\n\t  oldobjs=\"$oldobjs $func_extract_archives_result\"\n\tfi\n\n\t# POSIX demands no paths to be encoded in archives.  We have\n\t# to avoid creating archives with duplicate basenames if we\n\t# might have to extract them afterwards, e.g., when creating a\n\t# static archive out of a convenience library, or when linking\n\t# the entirety of a libtool archive into another (currently\n\t# not supported by libtool).\n\tif (for obj in $oldobjs\n\t    do\n\t      func_basename \"$obj\"\n\t      $ECHO \"$func_basename_result\"\n\t    done | sort | sort -uc >/dev/null 2>&1); then\n\t  :\n\telse\n\t  $ECHO \"copying selected object files to avoid basename conflicts...\"\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  generated=\"$generated $gentop\"\n\t  func_mkdir_p \"$gentop\"\n\t  save_oldobjs=$oldobjs\n\t  oldobjs=\n\t  counter=1\n\t  for obj in $save_oldobjs\n\t  do\n\t    func_basename \"$obj\"\n\t    objbase=\"$func_basename_result\"\n\t    case \" $oldobjs \" in\n\t    \" \") oldobjs=$obj ;;\n\t    *[\\ /]\"$objbase \"*)\n\t      while :; do\n\t\t# Make sure we don't pick an alternate name that also\n\t\t# overlaps.\n\t\tnewobj=lt$counter-$objbase\n\t\tfunc_arith $counter + 1\n\t\tcounter=$func_arith_result\n\t\tcase \" $oldobjs \" in\n\t\t*[\\ /]\"$newobj \"*) ;;\n\t\t*) if test ! -f \"$gentop/$newobj\"; then break; fi ;;\n\t\tesac\n\t      done\n\t      func_show_eval \"ln $obj $gentop/$newobj || cp $obj $gentop/$newobj\"\n\t      oldobjs=\"$oldobjs $gentop/$newobj\"\n\t      ;;\n\t    *) oldobjs=\"$oldobjs $obj\" ;;\n\t    esac\n\t  done\n\tfi\n\teval cmds=\\\"$old_archive_cmds\\\"\n\n\tfunc_len \" $cmds\"\n\tlen=$func_len_result\n\tif test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t  cmds=$old_archive_cmds\n\telse\n\t  # the command line is too long to link in one step, link in parts\n\t  func_verbose \"using piecewise archive linking...\"\n\t  save_RANLIB=$RANLIB\n\t  RANLIB=:\n\t  objlist=\n\t  concat_cmds=\n\t  save_oldobjs=$oldobjs\n\t  oldobjs=\n\t  # Is there a better way of finding the last object in the list?\n\t  for obj in $save_oldobjs\n\t  do\n\t    last_oldobj=$obj\n\t  done\n\t  eval test_cmds=\\\"$old_archive_cmds\\\"\n\t  func_len \" $test_cmds\"\n\t  len0=$func_len_result\n\t  len=$len0\n\t  for obj in $save_oldobjs\n\t  do\n\t    func_len \" $obj\"\n\t    func_arith $len + $func_len_result\n\t    len=$func_arith_result\n\t    func_append objlist \" $obj\"\n\t    if test \"$len\" -lt \"$max_cmd_len\"; then\n\t      :\n\t    else\n\t      # the above command should be used before it gets too long\n\t      oldobjs=$objlist\n\t      if test \"$obj\" = \"$last_oldobj\" ; then\n\t\tRANLIB=$save_RANLIB\n\t      fi\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\${concat_cmds}$old_archive_cmds\\\"\n\t      objlist=\n\t      len=$len0\n\t    fi\n\t  done\n\t  RANLIB=$save_RANLIB\n\t  oldobjs=$objlist\n\t  if test \"X$oldobjs\" = \"X\" ; then\n\t    eval cmds=\\\"\\$concat_cmds\\\"\n\t  else\n\t    eval cmds=\\\"\\$concat_cmds~\\$old_archive_cmds\\\"\n\t  fi\n\tfi\n      fi\n      func_execute_cmds \"$cmds\" 'exit $?'\n    done\n\n    test -n \"$generated\" && \\\n      func_show_eval \"${RM}r$generated\"\n\n    # Now create the libtool archive.\n    case $output in\n    *.la)\n      old_library=\n      test \"$build_old_libs\" = yes && old_library=\"$libname.$libext\"\n      func_verbose \"creating $output\"\n\n      # Preserve any variables that may affect compiler behavior\n      for var in $variables_saved_for_relink; do\n\tif eval test -z \\\"\\${$var+set}\\\"; then\n\t  relink_command=\"{ test -z \\\"\\${$var+set}\\\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command\"\n\telif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t  relink_command=\"$var=; export $var; $relink_command\"\n\telse\n\t  func_quote_for_eval \"$var_value\"\n\t  relink_command=\"$var=$func_quote_for_eval_result; export $var; $relink_command\"\n\tfi\n      done\n      # Quote the link command for shipping.\n      relink_command=\"(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)\"\n      relink_command=`$ECHO \"X$relink_command\" | $Xsed -e \"$sed_quote_subst\"`\n      if test \"$hardcode_automatic\" = yes ; then\n\trelink_command=\n      fi\n\n      # Only create the output if not a dry run.\n      $opt_dry_run || {\n\tfor installed in no yes; do\n\t  if test \"$installed\" = yes; then\n\t    if test -z \"$install_libdir\"; then\n\t      break\n\t    fi\n\t    output=\"$output_objdir/$outputname\"i\n\t    # Replace all uninstalled libtool libraries with the installed ones\n\t    newdependency_libs=\n\t    for deplib in $dependency_libs; do\n\t      case $deplib in\n\t      *.la)\n\t\tfunc_basename \"$deplib\"\n\t\tname=\"$func_basename_result\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $deplib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$deplib' is not a valid libtool archive\"\n\t\tnewdependency_libs=\"$newdependency_libs $libdir/$name\"\n\t\t;;\n\t      *) newdependency_libs=\"$newdependency_libs $deplib\" ;;\n\t      esac\n\t    done\n\t    dependency_libs=\"$newdependency_libs\"\n\t    newdlfiles=\n\n\t    for lib in $dlfiles; do\n\t      case $lib in\n\t      *.la)\n\t        func_basename \"$lib\"\n\t\tname=\"$func_basename_result\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\t\tnewdlfiles=\"$newdlfiles $libdir/$name\"\n\t\t;;\n\t      *) newdlfiles=\"$newdlfiles $lib\" ;;\n\t      esac\n\t    done\n\t    dlfiles=\"$newdlfiles\"\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      case $lib in\n\t      *.la)\n\t\t# Only pass preopened files to the pseudo-archive (for\n\t\t# eventual linking with the app. that links it) if we\n\t\t# didn't already link the preopened objects directly into\n\t\t# the library:\n\t\tfunc_basename \"$lib\"\n\t\tname=\"$func_basename_result\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\t\tnewdlprefiles=\"$newdlprefiles $libdir/$name\"\n\t\t;;\n\t      esac\n\t    done\n\t    dlprefiles=\"$newdlprefiles\"\n\t  else\n\t    newdlfiles=\n\t    for lib in $dlfiles; do\n\t      case $lib in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs=\"$lib\" ;;\n\t\t*) abs=`pwd`\"/$lib\" ;;\n\t      esac\n\t      newdlfiles=\"$newdlfiles $abs\"\n\t    done\n\t    dlfiles=\"$newdlfiles\"\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      case $lib in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs=\"$lib\" ;;\n\t\t*) abs=`pwd`\"/$lib\" ;;\n\t      esac\n\t      newdlprefiles=\"$newdlprefiles $abs\"\n\t    done\n\t    dlprefiles=\"$newdlprefiles\"\n\t  fi\n\t  $RM $output\n\t  # place dlname in correct position for cygwin\n\t  tdlname=$dlname\n\t  case $host,$output,$installed,$module,$dlname in\n\t    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;\n\t  esac\n\t  $ECHO > $output \"\\\n# $outputname - a libtool library file\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# The name that we can dlopen(3).\ndlname='$tdlname'\n\n# Names of this library.\nlibrary_names='$library_names'\n\n# The name of the static archive.\nold_library='$old_library'\n\n# Linker flags that can not go in dependency_libs.\ninherited_linker_flags='$new_inherited_linker_flags'\n\n# Libraries that this one depends upon.\ndependency_libs='$dependency_libs'\n\n# Names of additional weak libraries provided by this library\nweak_library_names='$weak_libs'\n\n# Version information for $libname.\ncurrent=$current\nage=$age\nrevision=$revision\n\n# Is this an already installed library?\ninstalled=$installed\n\n# Should we warn about portability when linking against -modules?\nshouldnotlink=$module\n\n# Files to dlopen/dlpreopen\ndlopen='$dlfiles'\ndlpreopen='$dlprefiles'\n\n# Directory that this library needs to be installed in:\nlibdir='$install_libdir'\"\n\t  if test \"$installed\" = no && test \"$need_relink\" = yes; then\n\t    $ECHO >> $output \"\\\nrelink_command=\\\"$relink_command\\\"\"\n\t  fi\n\tdone\n      }\n\n      # Do a symbolic link so that the libtool archive can be found in\n      # LD_LIBRARY_PATH before the program is installed.\n      func_show_eval '( cd \"$output_objdir\" && $RM \"$outputname\" && $LN_S \"../$outputname\" \"$outputname\" )' 'exit $?'\n      ;;\n    esac\n    exit $EXIT_SUCCESS\n}\n\n{ test \"$mode\" = link || test \"$mode\" = relink; } &&\n    func_mode_link ${1+\"$@\"}\n\n\n# func_mode_uninstall arg...\nfunc_mode_uninstall ()\n{\n    $opt_debug\n    RM=\"$nonopt\"\n    files=\n    rmforce=\n    exit_status=0\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    for arg\n    do\n      case $arg in\n      -f) RM=\"$RM $arg\"; rmforce=yes ;;\n      -*) RM=\"$RM $arg\" ;;\n      *) files=\"$files $arg\" ;;\n      esac\n    done\n\n    test -z \"$RM\" && \\\n      func_fatal_help \"you must specify an RM program\"\n\n    rmdirs=\n\n    origobjdir=\"$objdir\"\n    for file in $files; do\n      func_dirname \"$file\" \"\" \".\"\n      dir=\"$func_dirname_result\"\n      if test \"X$dir\" = X.; then\n\tobjdir=\"$origobjdir\"\n      else\n\tobjdir=\"$dir/$origobjdir\"\n      fi\n      func_basename \"$file\"\n      name=\"$func_basename_result\"\n      test \"$mode\" = uninstall && objdir=\"$dir\"\n\n      # Remember objdir for removal later, being careful to avoid duplicates\n      if test \"$mode\" = clean; then\n\tcase \" $rmdirs \" in\n\t  *\" $objdir \"*) ;;\n\t  *) rmdirs=\"$rmdirs $objdir\" ;;\n\tesac\n      fi\n\n      # Don't error if the file doesn't exist and rm -f was used.\n      if { test -L \"$file\"; } >/dev/null 2>&1 ||\n\t { test -h \"$file\"; } >/dev/null 2>&1 ||\n\t test -f \"$file\"; then\n\t:\n      elif test -d \"$file\"; then\n\texit_status=1\n\tcontinue\n      elif test \"$rmforce\" = yes; then\n\tcontinue\n      fi\n\n      rmfiles=\"$file\"\n\n      case $name in\n      *.la)\n\t# Possibly a libtool archive, so verify it.\n\tif func_lalib_p \"$file\"; then\n\t  func_source $dir/$name\n\n\t  # Delete the libtool libraries and symlinks.\n\t  for n in $library_names; do\n\t    rmfiles=\"$rmfiles $objdir/$n\"\n\t  done\n\t  test -n \"$old_library\" && rmfiles=\"$rmfiles $objdir/$old_library\"\n\n\t  case \"$mode\" in\n\t  clean)\n\t    case \"  $library_names \" in\n\t    # \"  \" in the beginning catches empty $dlname\n\t    *\" $dlname \"*) ;;\n\t    *) rmfiles=\"$rmfiles $objdir/$dlname\" ;;\n\t    esac\n\t    test -n \"$libdir\" && rmfiles=\"$rmfiles $objdir/$name $objdir/${name}i\"\n\t    ;;\n\t  uninstall)\n\t    if test -n \"$library_names\"; then\n\t      # Do each command in the postuninstall commands.\n\t      func_execute_cmds \"$postuninstall_cmds\" 'test \"$rmforce\" = yes || exit_status=1'\n\t    fi\n\n\t    if test -n \"$old_library\"; then\n\t      # Do each command in the old_postuninstall commands.\n\t      func_execute_cmds \"$old_postuninstall_cmds\" 'test \"$rmforce\" = yes || exit_status=1'\n\t    fi\n\t    # FIXME: should reinstall the best remaining shared library.\n\t    ;;\n\t  esac\n\tfi\n\t;;\n\n      *.lo)\n\t# Possibly a libtool object, so verify it.\n\tif func_lalib_p \"$file\"; then\n\n\t  # Read the .lo file\n\t  func_source $dir/$name\n\n\t  # Add PIC object to the list of files to remove.\n\t  if test -n \"$pic_object\" &&\n\t     test \"$pic_object\" != none; then\n\t    rmfiles=\"$rmfiles $dir/$pic_object\"\n\t  fi\n\n\t  # Add non-PIC object to the list of files to remove.\n\t  if test -n \"$non_pic_object\" &&\n\t     test \"$non_pic_object\" != none; then\n\t    rmfiles=\"$rmfiles $dir/$non_pic_object\"\n\t  fi\n\tfi\n\t;;\n\n      *)\n\tif test \"$mode\" = clean ; then\n\t  noexename=$name\n\t  case $file in\n\t  *.exe)\n\t    func_stripname '' '.exe' \"$file\"\n\t    file=$func_stripname_result\n\t    func_stripname '' '.exe' \"$name\"\n\t    noexename=$func_stripname_result\n\t    # $file with .exe has already been added to rmfiles,\n\t    # add $file without .exe\n\t    rmfiles=\"$rmfiles $file\"\n\t    ;;\n\t  esac\n\t  # Do a test to see if this is a libtool program.\n\t  if func_ltwrapper_p \"$file\"; then\n\t    if func_ltwrapper_executable_p \"$file\"; then\n\t      func_ltwrapper_scriptname \"$file\"\n\t      relink_command=\n\t      func_source $func_ltwrapper_scriptname_result\n\t      rmfiles=\"$rmfiles $func_ltwrapper_scriptname_result\"\n\t    else\n\t      relink_command=\n\t      func_source $dir/$noexename\n\t    fi\n\n\t    # note $name still contains .exe if it was in $file originally\n\t    # as does the version of $file that was added into $rmfiles\n\t    rmfiles=\"$rmfiles $objdir/$name $objdir/${name}S.${objext}\"\n\t    if test \"$fast_install\" = yes && test -n \"$relink_command\"; then\n\t      rmfiles=\"$rmfiles $objdir/lt-$name\"\n\t    fi\n\t    if test \"X$noexename\" != \"X$name\" ; then\n\t      rmfiles=\"$rmfiles $objdir/lt-${noexename}.c\"\n\t    fi\n\t  fi\n\tfi\n\t;;\n      esac\n      func_show_eval \"$RM $rmfiles\" 'exit_status=1'\n    done\n    objdir=\"$origobjdir\"\n\n    # Try to remove the ${objdir}s in the directories where we deleted files\n    for dir in $rmdirs; do\n      if test -d \"$dir\"; then\n\tfunc_show_eval \"rmdir $dir >/dev/null 2>&1\"\n      fi\n    done\n\n    exit $exit_status\n}\n\n{ test \"$mode\" = uninstall || test \"$mode\" = clean; } &&\n    func_mode_uninstall ${1+\"$@\"}\n\ntest -z \"$mode\" && {\n  help=\"$generic_help\"\n  func_fatal_help \"you must specify a MODE\"\n}\n\ntest -z \"$exec_cmd\" && \\\n  func_fatal_help \"invalid operation mode \\`$mode'\"\n\nif test -n \"$exec_cmd\"; then\n  eval exec \"$exec_cmd\"\n  exit $EXIT_FAILURE\nfi\n\nexit $exit_status\n\n\n# The TAGs below are defined such that we never get into a situation\n# in which we disable both kinds of libraries.  Given conflicting\n# choices, we go for a static library, that is the most portable,\n# since we can't tell whether shared libraries were disabled because\n# the user asked for that or because the platform doesn't support\n# them.  This is particularly important on AIX, because we don't\n# support having both static and shared libraries enabled at the same\n# time on that platform, so we default to a shared-only configuration.\n# If a disable-shared tag is given, we'll fallback to a static-only\n# configuration.  But we'll never go from static-only to shared-only.\n\n# ### BEGIN LIBTOOL TAG CONFIG: disable-shared\nbuild_libtool_libs=no\nbuild_old_libs=yes\n# ### END LIBTOOL TAG CONFIG: disable-shared\n\n# ### BEGIN LIBTOOL TAG CONFIG: disable-static\nbuild_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`\n# ### END LIBTOOL TAG CONFIG: disable-static\n\n# Local Variables:\n# mode:shell-script\n# sh-indentation:2\n# End:\n# vi:sw=2\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/ac_have_attribute.m4",
    "content": "AC_DEFUN([AX_C___ATTRIBUTE__], [\n  AC_MSG_CHECKING(for __attribute__)\n  AC_CACHE_VAL(ac_cv___attribute__, [\n    AC_TRY_COMPILE(\n      [#include <stdlib.h>\n       static void foo(void) __attribute__ ((unused));\n       void foo(void) { exit(1); }],\n      [],\n      ac_cv___attribute__=yes,\n      ac_cv___attribute__=no\n    )])\n  if test \"$ac_cv___attribute__\" = \"yes\"; then\n    AC_DEFINE(HAVE___ATTRIBUTE__, 1, [define if your compiler has __attribute__])\n  fi\n  AC_MSG_RESULT($ac_cv___attribute__)\n])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/ac_have_builtin_expect.m4",
    "content": "AC_DEFUN([AX_C___BUILTIN_EXPECT], [\n  AC_MSG_CHECKING(for __builtin_expect)\n  AC_CACHE_VAL(ac_cv___builtin_expect, [\n    AC_TRY_COMPILE(\n      [int foo(void) { if (__builtin_expect(0, 0)) return 1; return 0; }],\n      [],\n      ac_cv___builtin_expect=yes,\n      ac_cv___builtin_expect=no\n    )])\n  if test \"$ac_cv___builtin_expect\" = \"yes\"; then\n    AC_DEFINE(HAVE___BUILTIN_EXPECT, 1, [define if your compiler has __builtin_expect])\n  fi\n  AC_MSG_RESULT($ac_cv___builtin_expect)\n])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/ac_have_sync_val_compare_and_swap.m4",
    "content": "AC_DEFUN([AX_C___SYNC_VAL_COMPARE_AND_SWAP], [\n  AC_MSG_CHECKING(for __sync_val_compare_and_swap)\n  AC_CACHE_VAL(ac_cv___sync_val_compare_and_swap, [\n    AC_TRY_LINK(\n      [int main() { int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0; }],\n      [],\n      ac_cv___sync_val_compare_and_swap=yes,\n      ac_cv___sync_val_compare_and_swap=no\n    )])\n  if test \"$ac_cv___sync_val_compare_and_swap\" = \"yes\"; then\n    AC_DEFINE(HAVE___SYNC_VAL_COMPARE_AND_SWAP, 1, [define if your compiler has __sync_val_compare_and_swap])\n  fi\n  AC_MSG_RESULT($ac_cv___sync_val_compare_and_swap)\n])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/ac_rwlock.m4",
    "content": "# TODO(csilvers): it would be better to actually try to link against\n# -pthreads, to make sure it defines these methods, but that may be\n# too hard, since pthread support is really tricky.\n\n# Check for support for pthread_rwlock_init() etc.\n# These aren't posix, but are widely supported.  To get them on linux,\n# you need to define _XOPEN_SOURCE first, so this check assumes your\n# application does that.\n#\n# Note: OS X (as of 6/1/06) seems to support pthread_rwlock, but\n# doesn't define PTHREAD_RWLOCK_INITIALIZER.  Therefore, we don't test\n# that particularly macro.  It's probably best if you don't use that\n# macro in your code either.\n\nAC_DEFUN([AC_RWLOCK],\n[AC_CACHE_CHECK(support for pthread_rwlock_* functions,\nac_cv_rwlock,\n[AC_LANG_SAVE\n AC_LANG_C\n AC_TRY_COMPILE([#define _XOPEN_SOURCE 500\n                 #include <pthread.h>],\n\t\t[pthread_rwlock_t l; pthread_rwlock_init(&l, NULL);\n                 pthread_rwlock_rdlock(&l); \n                 return 0;],\n                ac_cv_rwlock=yes, ac_cv_rwlock=no)\n AC_LANG_RESTORE\n])\nif test \"$ac_cv_rwlock\" = yes; then\n  AC_DEFINE(HAVE_RWLOCK,1,[define if the compiler implements pthread_rwlock_*])\nfi\n])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/acx_pthread.m4",
    "content": "# This was retrieved from\n#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi\n# See also (perhaps for new versions?)\n#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi\n#\n# We've rewritten the inconsistency check code (from avahi), to work\n# more broadly.  In particular, it no longer assumes ld accepts -zdefs.\n# This caused a restructing of the code, but the functionality has only\n# changed a little.\n\ndnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])\ndnl\ndnl @summary figure out how to build C programs using POSIX threads\ndnl\ndnl This macro figures out how to build C programs using POSIX threads.\ndnl It sets the PTHREAD_LIBS output variable to the threads library and\ndnl linker flags, and the PTHREAD_CFLAGS output variable to any special\ndnl C compiler flags that are needed. (The user can also force certain\ndnl compiler flags/libs to be tested by setting these environment\ndnl variables.)\ndnl\ndnl Also sets PTHREAD_CC to any special C compiler that is needed for\ndnl multi-threaded programs (defaults to the value of CC otherwise).\ndnl (This is necessary on AIX to use the special cc_r compiler alias.)\ndnl\ndnl NOTE: You are assumed to not only compile your program with these\ndnl flags, but also link it with them as well. e.g. you should link\ndnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS\ndnl $LIBS\ndnl\ndnl If you are only building threads programs, you may wish to use\ndnl these variables in your default LIBS, CFLAGS, and CC:\ndnl\ndnl        LIBS=\"$PTHREAD_LIBS $LIBS\"\ndnl        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\ndnl        CC=\"$PTHREAD_CC\"\ndnl\ndnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute\ndnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to\ndnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).\ndnl\ndnl ACTION-IF-FOUND is a list of shell commands to run if a threads\ndnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to\ndnl run it if it is not found. If ACTION-IF-FOUND is not specified, the\ndnl default action will define HAVE_PTHREAD.\ndnl\ndnl Please let the authors know if this macro fails on any platform, or\ndnl if you have any other suggestions or comments. This macro was based\ndnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with\ndnl help from M. Frigo), as well as ac_pthread and hb_pthread macros\ndnl posted by Alejandro Forero Cuervo to the autoconf macro repository.\ndnl We are also grateful for the helpful feedback of numerous users.\ndnl\ndnl @category InstalledPackages\ndnl @author Steven G. Johnson <stevenj@alum.mit.edu>\ndnl @version 2006-05-29\ndnl @license GPLWithACException\ndnl \ndnl Checks for GCC shared/pthread inconsistency based on work by\ndnl Marcin Owsiany <marcin@owsiany.pl>\n\n\nAC_DEFUN([ACX_PTHREAD], [\nAC_REQUIRE([AC_CANONICAL_HOST])\nAC_LANG_SAVE\nAC_LANG_C\nacx_pthread_ok=no\n\n# We used to check for pthread.h first, but this fails if pthread.h\n# requires special compiler flags (e.g. on True64 or Sequent).\n# It gets checked for in the link test anyway.\n\n# First of all, check if the user has set any of the PTHREAD_LIBS,\n# etcetera environment variables, and if threads linking works using\n# them:\nif test x\"$PTHREAD_LIBS$PTHREAD_CFLAGS\" != x; then\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])\n        AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)\n        AC_MSG_RESULT($acx_pthread_ok)\n        if test x\"$acx_pthread_ok\" = xno; then\n                PTHREAD_LIBS=\"\"\n                PTHREAD_CFLAGS=\"\"\n        fi\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\nfi\n\n# We must check for the threads library under a number of different\n# names; the ordering is very important because some systems\n# (e.g. DEC) have both -lpthread and -lpthreads, where one of the\n# libraries is broken (non-POSIX).\n\n# Create a list of thread flags to try.  Items starting with a \"-\" are\n# C compiler flags, and other items are library names, except for \"none\"\n# which indicates that we try without any flags at all, and \"pthread-config\"\n# which is a program returning the flags for the Pth emulation library.\n\nacx_pthread_flags=\"pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config\"\n\n# The ordering *is* (sometimes) important.  Some notes on the\n# individual items follow:\n\n# pthreads: AIX (must check this before -lpthread)\n# none: in case threads are in libc; should be tried before -Kthread and\n#       other compiler flags to prevent continual compiler warnings\n# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)\n# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)\n# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)\n# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)\n# -pthreads: Solaris/gcc\n# -mthreads: Mingw32/gcc, Lynx/gcc\n# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it\n#      doesn't hurt to check since this sometimes defines pthreads too;\n#      also defines -D_REENTRANT)\n#      ... -mt is also the pthreads flag for HP/aCC\n# pthread: Linux, etcetera\n# --thread-safe: KAI C++\n# pthread-config: use pthread-config program (for GNU Pth library)\n\ncase \"${host_cpu}-${host_os}\" in\n        *solaris*)\n\n        # On Solaris (at least, for some versions), libc contains stubbed\n        # (non-functional) versions of the pthreads routines, so link-based\n        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/\n        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather\n        # a function called by this macro, so we could check for that, but\n        # who knows whether they'll stub that too in a future libc.)  So,\n        # we'll just look for -pthreads and -lpthread first:\n\n        acx_pthread_flags=\"-pthreads pthread -mt -pthread $acx_pthread_flags\"\n        ;;\nesac\n\nif test x\"$acx_pthread_ok\" = xno; then\nfor flag in $acx_pthread_flags; do\n\n        case $flag in\n                none)\n                AC_MSG_CHECKING([whether pthreads work without any flags])\n                ;;\n\n                -*)\n                AC_MSG_CHECKING([whether pthreads work with $flag])\n                PTHREAD_CFLAGS=\"$flag\"\n                ;;\n\n\t\tpthread-config)\n\t\tAC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)\n\t\tif test x\"$acx_pthread_config\" = xno; then continue; fi\n\t\tPTHREAD_CFLAGS=\"`pthread-config --cflags`\"\n\t\tPTHREAD_LIBS=\"`pthread-config --ldflags` `pthread-config --libs`\"\n\t\t;;\n\n                *)\n                AC_MSG_CHECKING([for the pthreads library -l$flag])\n                PTHREAD_LIBS=\"-l$flag\"\n                ;;\n        esac\n\n        save_LIBS=\"$LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Check for various functions.  We must include pthread.h,\n        # since some functions may be macros.  (On the Sequent, we\n        # need a special flag -Kthread to make this header compile.)\n        # We check for pthread_join because it is in -lpthread on IRIX\n        # while pthread_create is in libc.  We check for pthread_attr_init\n        # due to DEC craziness with -lpthreads.  We check for\n        # pthread_cleanup_push because it is one of the few pthread\n        # functions on Solaris that doesn't have a non-functional libc stub.\n        # We try pthread_create on general principles.\n        AC_TRY_LINK([#include <pthread.h>],\n                    [pthread_t th; pthread_join(th, 0);\n                     pthread_attr_init(0); pthread_cleanup_push(0, 0);\n                     pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n                    [acx_pthread_ok=yes])\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n\n        AC_MSG_RESULT($acx_pthread_ok)\n        if test \"x$acx_pthread_ok\" = xyes; then\n                break;\n        fi\n\n        PTHREAD_LIBS=\"\"\n        PTHREAD_CFLAGS=\"\"\ndone\nfi\n\n# Various other checks:\nif test \"x$acx_pthread_ok\" = xyes; then\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.\n\tAC_MSG_CHECKING([for joinable pthread attribute])\n\tattr_name=unknown\n\tfor attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do\n\t    AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],\n                        [attr_name=$attr; break])\n\tdone\n        AC_MSG_RESULT($attr_name)\n        if test \"$attr_name\" != PTHREAD_CREATE_JOINABLE; then\n            AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,\n                               [Define to necessary symbol if this constant\n                                uses a non-standard name on your system.])\n        fi\n\n        AC_MSG_CHECKING([if more special flags are required for pthreads])\n        flag=no\n        case \"${host_cpu}-${host_os}\" in\n            *-aix* | *-freebsd* | *-darwin*) flag=\"-D_THREAD_SAFE\";;\n            *solaris* | *-osf* | *-hpux*) flag=\"-D_REENTRANT\";;\n        esac\n        AC_MSG_RESULT(${flag})\n        if test \"x$flag\" != xno; then\n            PTHREAD_CFLAGS=\"$flag $PTHREAD_CFLAGS\"\n        fi\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n        # More AIX lossage: must compile with xlc_r or cc_r\n\tif test x\"$GCC\" != xyes; then\n          AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})\n        else\n          PTHREAD_CC=$CC\n\tfi\n\n\t# The next part tries to detect GCC inconsistency with -shared on some\n\t# architectures and systems. The problem is that in certain\n\t# configurations, when -shared is specified, GCC \"forgets\" to\n\t# internally use various flags which are still necessary.\n\t\n\t#\n\t# Prepare the flags\n\t#\n\tsave_CFLAGS=\"$CFLAGS\"\n\tsave_LIBS=\"$LIBS\"\n\tsave_CC=\"$CC\"\n\t\n\t# Try with the flags determined by the earlier checks.\n\t#\n\t# -Wl,-z,defs forces link-time symbol resolution, so that the\n\t# linking checks with -shared actually have any value\n\t#\n\t# FIXME: -fPIC is required for -shared on many architectures,\n\t# so we specify it here, but the right way would probably be to\n\t# properly detect whether it is actually required.\n\tCFLAGS=\"-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS\"\n\tLIBS=\"$PTHREAD_LIBS $LIBS\"\n\tCC=\"$PTHREAD_CC\"\n\t\n\t# In order not to create several levels of indentation, we test\n\t# the value of \"$done\" until we find the cure or run out of ideas.\n\tdone=\"no\"\n\t\n\t# First, make sure the CFLAGS we added are actually accepted by our\n\t# compiler.  If not (and OS X's ld, for instance, does not accept -z),\n\t# then we can't do this test.\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies])\n\t   AC_TRY_LINK(,, , [done=yes])\n\t\n\t   if test \"x$done\" = xyes ; then\n\t      AC_MSG_RESULT([no])\n\t   else\n\t      AC_MSG_RESULT([yes])\n\t   fi\n\tfi\n\t\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether -pthread is sufficient with -shared])\n\t   AC_TRY_LINK([#include <pthread.h>],\n\t      [pthread_t th; pthread_join(th, 0);\n\t      pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t      [done=yes])\n\t   \n\t   if test \"x$done\" = xyes; then\n\t      AC_MSG_RESULT([yes])\n\t   else\n\t      AC_MSG_RESULT([no])\n\t   fi\n\tfi\n\t\n\t#\n\t# Linux gcc on some architectures such as mips/mipsel forgets\n\t# about -lpthread\n\t#\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether -lpthread fixes that])\n\t   LIBS=\"-lpthread $PTHREAD_LIBS $save_LIBS\"\n\t   AC_TRY_LINK([#include <pthread.h>],\n\t      [pthread_t th; pthread_join(th, 0);\n\t      pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t      [done=yes])\n\t\n\t   if test \"x$done\" = xyes; then\n\t      AC_MSG_RESULT([yes])\n\t      PTHREAD_LIBS=\"-lpthread $PTHREAD_LIBS\"\n\t   else\n\t      AC_MSG_RESULT([no])\n\t   fi\n\tfi\n\t#\n\t# FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc\n\t#\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether -lc_r fixes that])\n\t   LIBS=\"-lc_r $PTHREAD_LIBS $save_LIBS\"\n\t   AC_TRY_LINK([#include <pthread.h>],\n\t       [pthread_t th; pthread_join(th, 0);\n\t        pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t        pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t       [done=yes])\n\t\n\t   if test \"x$done\" = xyes; then\n\t      AC_MSG_RESULT([yes])\n\t      PTHREAD_LIBS=\"-lc_r $PTHREAD_LIBS\"\n\t   else\n\t      AC_MSG_RESULT([no])\n\t   fi\n\tfi\n\tif test x\"$done\" = xno; then\n\t   # OK, we have run out of ideas\n\t   AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries])\n\t\n\t   # so it's not safe to assume that we may use pthreads\n\t   acx_pthread_ok=no\n\tfi\n\t\n\tCFLAGS=\"$save_CFLAGS\"\n\tLIBS=\"$save_LIBS\"\n\tCC=\"$save_CC\"\nelse\n        PTHREAD_CC=\"$CC\"\nfi\n\nAC_SUBST(PTHREAD_LIBS)\nAC_SUBST(PTHREAD_CFLAGS)\nAC_SUBST(PTHREAD_CC)\n\n# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:\nif test x\"$acx_pthread_ok\" = xyes; then\n        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])\n        :\nelse\n        acx_pthread_ok=no\n        $2\nfi\nAC_LANG_RESTORE\n])dnl ACX_PTHREAD\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/google_namespace.m4",
    "content": "# Allow users to override the namespace we define our application's classes in\n# Arg $1 is the default namespace to use if --enable-namespace isn't present.\n\n# In general, $1 should be 'google', so we put all our exported symbols in a\n# unique namespace that is not likely to conflict with anyone else.  However,\n# when it makes sense -- for instance, when publishing stl-like code -- you\n# may want to go with a different default, like 'std'.\n\nAC_DEFUN([AC_DEFINE_GOOGLE_NAMESPACE],\n  [google_namespace_default=[$1]\n   AC_ARG_ENABLE(namespace, [  --enable-namespace=FOO to define these Google\n                             classes in the FOO namespace. --disable-namespace\n                             to define them in the global namespace. Default\n                             is to define them in namespace $1.],\n                 [case \"$enableval\" in\n                    yes) google_namespace=\"$google_namespace_default\" ;;\n                     no) google_namespace=\"\" ;;\n                      *) google_namespace=\"$enableval\" ;;\n                  esac],\n                 [google_namespace=\"$google_namespace_default\"])\n   if test -n \"$google_namespace\"; then\n     ac_google_namespace=\"$google_namespace\"\n     ac_google_start_namespace=\"namespace $google_namespace {\"\n     ac_google_end_namespace=\"}\"\n   else\n     ac_google_namespace=\"\"\n     ac_google_start_namespace=\"\"\n     ac_google_end_namespace=\"\"\n   fi\n   AC_DEFINE_UNQUOTED(GOOGLE_NAMESPACE, $ac_google_namespace,\n                      Namespace for Google classes)\n   AC_DEFINE_UNQUOTED(_START_GOOGLE_NAMESPACE_, $ac_google_start_namespace,\n                      Puts following code inside the Google namespace)\n   AC_DEFINE_UNQUOTED(_END_GOOGLE_NAMESPACE_,  $ac_google_end_namespace,\n                      Stops putting the code inside the Google namespace)\n])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/libtool.m4",
    "content": "# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-\n#\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008 Free Software Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\nm4_define([_LT_COPYING], [dnl\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008 Free Software Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n#   This file is part of GNU Libtool.\n#\n# GNU Libtool is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License as\n# published by the Free Software Foundation; either version 2 of\n# the License, or (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html, or\n# obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n])\n\n# serial 56 LT_INIT\n\n\n# LT_PREREQ(VERSION)\n# ------------------\n# Complain and exit if this libtool version is less that VERSION.\nm4_defun([LT_PREREQ],\n[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,\n       [m4_default([$3],\n\t\t   [m4_fatal([Libtool version $1 or higher is required],\n\t\t             63)])],\n       [$2])])\n\n\n# _LT_CHECK_BUILDDIR\n# ------------------\n# Complain if the absolute build directory name contains unusual characters\nm4_defun([_LT_CHECK_BUILDDIR],\n[case `pwd` in\n  *\\ * | *\\\t*)\n    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;\nesac\n])\n\n\n# LT_INIT([OPTIONS])\n# ------------------\nAC_DEFUN([LT_INIT],\n[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT\nAC_BEFORE([$0], [LT_LANG])dnl\nAC_BEFORE([$0], [LT_OUTPUT])dnl\nAC_BEFORE([$0], [LTDL_INIT])dnl\nm4_require([_LT_CHECK_BUILDDIR])dnl\n\ndnl Autoconf doesn't catch unexpanded LT_ macros by default:\nm4_pattern_forbid([^_?LT_[A-Z_]+$])dnl\nm4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl\ndnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4\ndnl unless we require an AC_DEFUNed macro:\nAC_REQUIRE([LTOPTIONS_VERSION])dnl\nAC_REQUIRE([LTSUGAR_VERSION])dnl\nAC_REQUIRE([LTVERSION_VERSION])dnl\nAC_REQUIRE([LTOBSOLETE_VERSION])dnl\nm4_require([_LT_PROG_LTMAIN])dnl\n\ndnl Parse OPTIONS\n_LT_SET_OPTIONS([$0], [$1])\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=\"$ltmain\"\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\nAC_SUBST(LIBTOOL)dnl\n\n_LT_SETUP\n\n# Only expand once:\nm4_define([LT_INIT])\n])# LT_INIT\n\n# Old names:\nAU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])\nAU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_PROG_LIBTOOL], [])\ndnl AC_DEFUN([AM_PROG_LIBTOOL], [])\n\n\n# _LT_CC_BASENAME(CC)\n# -------------------\n# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.\nm4_defun([_LT_CC_BASENAME],\n[for cc_temp in $1\"\"; do\n  case $cc_temp in\n    compile | *[[\\\\/]]compile | ccache | *[[\\\\/]]ccache ) ;;\n    distcc | *[[\\\\/]]distcc | purify | *[[\\\\/]]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`$ECHO \"X$cc_temp\" | $Xsed -e 's%.*/%%' -e \"s%^$host_alias-%%\"`\n])\n\n\n# _LT_FILEUTILS_DEFAULTS\n# ----------------------\n# It is okay to use these file commands and assume they have been set\n# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.\nm4_defun([_LT_FILEUTILS_DEFAULTS],\n[: ${CP=\"cp -f\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n])# _LT_FILEUTILS_DEFAULTS\n\n\n# _LT_SETUP\n# ---------\nm4_defun([_LT_SETUP],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\n_LT_DECL([], [host_alias], [0], [The host system])dnl\n_LT_DECL([], [host], [0])dnl\n_LT_DECL([], [host_os], [0])dnl\ndnl\n_LT_DECL([], [build_alias], [0], [The build system])dnl\n_LT_DECL([], [build], [0])dnl\n_LT_DECL([], [build_os], [0])dnl\ndnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([LT_PATH_LD])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\ndnl\nAC_REQUIRE([AC_PROG_LN_S])dnl\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\n_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl\ndnl\nAC_REQUIRE([LT_CMD_MAX_LEN])dnl\n_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally \"o\")])dnl\n_LT_DECL([], [exeext], [0], [Executable file suffix (normally \"\")])dnl\ndnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_CHECK_SHELL_FEATURES])dnl\nm4_require([_LT_CMD_RELOAD])dnl\nm4_require([_LT_CHECK_MAGIC_METHOD])dnl\nm4_require([_LT_CMD_OLD_ARCHIVE])dnl\nm4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl\n\n_LT_CONFIG_LIBTOOL_INIT([\n# See if we are running on zsh, and set the options which allow our\n# commands through without removal of \\ escapes INIT.\nif test -n \"\\${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n])\nif test -n \"${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n_LT_CHECK_OBJDIR\n\nm4_require([_LT_TAG_COMPILER])dnl\n_LT_PROG_ECHO_BACKSLASH\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test \"X${COLLECT_NAMES+set}\" != Xset; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nsed_quote_subst='s/\\([[\"`$\\\\]]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([[\"`\\\\]]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Sed substitution to delay expansion of an escaped single quote.\ndelay_single_quote_subst='s/'\\''/'\\'\\\\\\\\\\\\\\'\\''/g'\n\n# Sed substitution to avoid accidental globbing in evaled expressions\nno_glob_subst='s/\\*/\\\\\\*/g'\n\n# Global variables:\nofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a `.a' archive for static linking (except MSVC,\n# which needs '.lib').\nlibext=a\n\nwith_gnu_ld=\"$lt_cv_prog_gnu_ld\"\n\nold_CC=\"$CC\"\nold_CFLAGS=\"$CFLAGS\"\n\n# Set sane defaults for various variables\ntest -z \"$CC\" && CC=cc\ntest -z \"$LTCC\" && LTCC=$CC\ntest -z \"$LTCFLAGS\" && LTCFLAGS=$CFLAGS\ntest -z \"$LD\" && LD=ld\ntest -z \"$ac_objext\" && ac_objext=o\n\n_LT_CC_BASENAME([$compiler])\n\n# Only perform the check for file, if the check method requires it\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    _LT_PATH_MAGIC\n  fi\n  ;;\nesac\n\n# Use C for the default configuration in the libtool script\nLT_SUPPORTED_TAG([CC])\n_LT_LANG_C_CONFIG\n_LT_LANG_DEFAULT_CONFIG\n_LT_CONFIG_COMMANDS\n])# _LT_SETUP\n\n\n# _LT_PROG_LTMAIN\n# ---------------\n# Note that this code is called both from `configure', and `config.status'\n# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,\n# `config.status' has no value for ac_aux_dir unless we are using Automake,\n# so we pass a copy along to make sure it has a sensible value anyway.\nm4_defun([_LT_PROG_LTMAIN],\n[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl\n_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])\nltmain=\"$ac_aux_dir/ltmain.sh\"\n])# _LT_PROG_LTMAIN\n\n\n## ------------------------------------- ##\n## Accumulate code for creating libtool. ##\n## ------------------------------------- ##\n\n# So that we can recreate a full libtool script including additional\n# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS\n# in macros and then make a single call at the end using the `libtool'\n# label.\n\n\n# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])\n# ----------------------------------------\n# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.\nm4_define([_LT_CONFIG_LIBTOOL_INIT],\n[m4_ifval([$1],\n          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],\n                     [$1\n])])])\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_INIT])\n\n\n# _LT_CONFIG_LIBTOOL([COMMANDS])\n# ------------------------------\n# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.\nm4_define([_LT_CONFIG_LIBTOOL],\n[m4_ifval([$1],\n          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],\n                     [$1\n])])])\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])\n\n\n# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])\n# -----------------------------------------------------\nm4_defun([_LT_CONFIG_SAVE_COMMANDS],\n[_LT_CONFIG_LIBTOOL([$1])\n_LT_CONFIG_LIBTOOL_INIT([$2])\n])\n\n\n# _LT_FORMAT_COMMENT([COMMENT])\n# -----------------------------\n# Add leading comment marks to the start of each line, and a trailing\n# full-stop to the whole comment if one is not present already.\nm4_define([_LT_FORMAT_COMMENT],\n[m4_ifval([$1], [\nm4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],\n              [['`$\\]], [\\\\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])\n)])\n\n\n\n## ------------------------ ##\n## FIXME: Eliminate VARNAME ##\n## ------------------------ ##\n\n\n# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])\n# -------------------------------------------------------------------\n# CONFIGNAME is the name given to the value in the libtool script.\n# VARNAME is the (base) name used in the configure script.\n# VALUE may be 0, 1 or 2 for a computed quote escaped value based on\n# VARNAME.  Any other value will be used directly.\nm4_define([_LT_DECL],\n[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],\n    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],\n\t[m4_ifval([$1], [$1], [$2])])\n    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])\n    m4_ifval([$4],\n\t[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])\n    lt_dict_add_subkey([lt_decl_dict], [$2],\n\t[tagged?], [m4_ifval([$5], [yes], [no])])])\n])\n\n\n# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])\n# --------------------------------------------------------\nm4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])\n\n\n# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])\n# ------------------------------------------------\nm4_define([lt_decl_tag_varnames],\n[_lt_decl_filter([tagged?], [yes], $@)])\n\n\n# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])\n# ---------------------------------------------------------\nm4_define([_lt_decl_filter],\n[m4_case([$#],\n  [0], [m4_fatal([$0: too few arguments: $#])],\n  [1], [m4_fatal([$0: too few arguments: $#: $1])],\n  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],\n  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],\n  [lt_dict_filter([lt_decl_dict], $@)])[]dnl\n])\n\n\n# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])\n# --------------------------------------------------\nm4_define([lt_decl_quote_varnames],\n[_lt_decl_filter([value], [1], $@)])\n\n\n# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])\n# ---------------------------------------------------\nm4_define([lt_decl_dquote_varnames],\n[_lt_decl_filter([value], [2], $@)])\n\n\n# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])\n# ---------------------------------------------------\nm4_define([lt_decl_varnames_tagged],\n[m4_assert([$# <= 2])dnl\n_$0(m4_quote(m4_default([$1], [[, ]])),\n    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),\n    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])\nm4_define([_lt_decl_varnames_tagged],\n[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])\n\n\n# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])\n# ------------------------------------------------\nm4_define([lt_decl_all_varnames],\n[_$0(m4_quote(m4_default([$1], [[, ]])),\n     m4_if([$2], [],\n\t   m4_quote(lt_decl_varnames),\n\tm4_quote(m4_shift($@))))[]dnl\n])\nm4_define([_lt_decl_all_varnames],\n[lt_join($@, lt_decl_varnames_tagged([$1],\n\t\t\tlt_decl_tag_varnames([[, ]], m4_shift($@))))dnl\n])\n\n\n# _LT_CONFIG_STATUS_DECLARE([VARNAME])\n# ------------------------------------\n# Quote a variable value, and forward it to `config.status' so that its\n# declaration there will have the same value as in `configure'.  VARNAME\n# must have a single quote delimited value for this to work.\nm4_define([_LT_CONFIG_STATUS_DECLARE],\n[$1='`$ECHO \"X$][$1\" | $Xsed -e \"$delay_single_quote_subst\"`'])\n\n\n# _LT_CONFIG_STATUS_DECLARATIONS\n# ------------------------------\n# We delimit libtool config variables with single quotes, so when\n# we write them to config.status, we have to be sure to quote all\n# embedded single quotes properly.  In configure, this macro expands\n# each variable declared with _LT_DECL (and _LT_TAGDECL) into:\n#\n#    <var>='`$ECHO \"X$<var>\" | $Xsed -e \"$delay_single_quote_subst\"`'\nm4_defun([_LT_CONFIG_STATUS_DECLARATIONS],\n[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),\n    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])\n\n\n# _LT_LIBTOOL_TAGS\n# ----------------\n# Output comment and list of tags supported by the script\nm4_defun([_LT_LIBTOOL_TAGS],\n[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl\navailable_tags=\"_LT_TAGS\"dnl\n])\n\n\n# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])\n# -----------------------------------\n# Extract the dictionary values for VARNAME (optionally with TAG) and\n# expand to a commented shell variable setting:\n#\n#    # Some comment about what VAR is for.\n#    visible_name=$lt_internal_name\nm4_define([_LT_LIBTOOL_DECLARE],\n[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],\n\t\t\t\t\t   [description])))[]dnl\nm4_pushdef([_libtool_name],\n    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl\nm4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),\n    [0], [_libtool_name=[$]$1],\n    [1], [_libtool_name=$lt_[]$1],\n    [2], [_libtool_name=$lt_[]$1],\n    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl\nm4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl\n])\n\n\n# _LT_LIBTOOL_CONFIG_VARS\n# -----------------------\n# Produce commented declarations of non-tagged libtool config variables\n# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'\n# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG\n# section) are produced by _LT_LIBTOOL_TAG_VARS.\nm4_defun([_LT_LIBTOOL_CONFIG_VARS],\n[m4_foreach([_lt_var],\n    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),\n    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])\n\n\n# _LT_LIBTOOL_TAG_VARS(TAG)\n# -------------------------\nm4_define([_LT_LIBTOOL_TAG_VARS],\n[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),\n    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])\n\n\n# _LT_TAGVAR(VARNAME, [TAGNAME])\n# ------------------------------\nm4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])\n\n\n# _LT_CONFIG_COMMANDS\n# -------------------\n# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of\n# variables for single and double quote escaping we saved from calls\n# to _LT_DECL, we can put quote escaped variables declarations\n# into `config.status', and then the shell code to quote escape them in\n# for loops in `config.status'.  Finally, any additional code accumulated\n# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.\nm4_defun([_LT_CONFIG_COMMANDS],\n[AC_PROVIDE_IFELSE([LT_OUTPUT],\n\tdnl If the libtool generation code has been placed in $CONFIG_LT,\n\tdnl instead of duplicating it all over again into config.status,\n\tdnl then we will have config.status run $CONFIG_LT later, so it\n\tdnl needs to know what name is stored there:\n        [AC_CONFIG_COMMANDS([libtool],\n            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],\n    dnl If the libtool generation code is destined for config.status,\n    dnl expand the accumulated commands and init code now:\n    [AC_CONFIG_COMMANDS([libtool],\n        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])\n])#_LT_CONFIG_COMMANDS\n\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],\n[\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nsed_quote_subst='$sed_quote_subst'\ndouble_quote_subst='$double_quote_subst'\ndelay_variable_subst='$delay_variable_subst'\n_LT_CONFIG_STATUS_DECLARATIONS\nLTCC='$LTCC'\nLTCFLAGS='$LTCFLAGS'\ncompiler='$compiler_DEFAULT'\n\n# Quote evaled strings.\nfor var in lt_decl_all_varnames([[ \\\n]], lt_decl_quote_varnames); do\n    case \\`eval \\\\\\\\\\$ECHO \"X\\\\\\\\\\$\\$var\"\\` in\n    *[[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"X\\\\\\$\\$var\\\\\" | \\\\\\$Xsed -e \\\\\"\\\\\\$sed_quote_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Double-quote double-evaled strings.\nfor var in lt_decl_all_varnames([[ \\\n]], lt_decl_dquote_varnames); do\n    case \\`eval \\\\\\\\\\$ECHO \"X\\\\\\\\\\$\\$var\"\\` in\n    *[[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"X\\\\\\$\\$var\\\\\" | \\\\\\$Xsed -e \\\\\"\\\\\\$double_quote_subst\\\\\" -e \\\\\"\\\\\\$sed_quote_subst\\\\\" -e \\\\\"\\\\\\$delay_variable_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Fix-up fallback echo if it was mangled by the above quoting rules.\ncase \\$lt_ECHO in\n*'\\\\\\[$]0 --fallback-echo\"')dnl \"\n  lt_ECHO=\\`\\$ECHO \"X\\$lt_ECHO\" | \\$Xsed -e 's/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[$]0 --fallback-echo\"\\[$]/\\[$]0 --fallback-echo\"/'\\`\n  ;;\nesac\n\n_LT_OUTPUT_LIBTOOL_INIT\n])\n\n\n# LT_OUTPUT\n# ---------\n# This macro allows early generation of the libtool script (before\n# AC_OUTPUT is called), incase it is used in configure for compilation\n# tests.\nAC_DEFUN([LT_OUTPUT],\n[: ${CONFIG_LT=./config.lt}\nAC_MSG_NOTICE([creating $CONFIG_LT])\ncat >\"$CONFIG_LT\" <<_LTEOF\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate a libtool stub with the current configuration.\n\nlt_cl_silent=false\nSHELL=\\${CONFIG_SHELL-$SHELL}\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<\\_LTEOF\nAS_SHELL_SANITIZE\n_AS_PREPARE\n\nexec AS_MESSAGE_FD>&1\nexec AS_MESSAGE_LOG_FD>>config.log\n{\n  echo\n  AS_BOX([Running $as_me.])\n} >&AS_MESSAGE_LOG_FD\n\nlt_cl_help=\"\\\n\\`$as_me' creates a local libtool stub from the current configuration,\nfor use in further configure time tests before the real libtool is\ngenerated.\n\nUsage: $[0] [[OPTIONS]]\n\n  -h, --help      print this help, then exit\n  -V, --version   print version number, then exit\n  -q, --quiet     do not print progress messages\n  -d, --debug     don't remove temporary files\n\nReport bugs to <bug-libtool@gnu.org>.\"\n\nlt_cl_version=\"\\\nm4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl\nm4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])\nconfigured by $[0], generated by m4_PACKAGE_STRING.\n\nCopyright (C) 2008 Free Software Foundation, Inc.\nThis config.lt script is free software; the Free Software Foundation\ngives unlimited permision to copy, distribute and modify it.\"\n\nwhile test $[#] != 0\ndo\n  case $[1] in\n    --version | --v* | -V )\n      echo \"$lt_cl_version\"; exit 0 ;;\n    --help | --h* | -h )\n      echo \"$lt_cl_help\"; exit 0 ;;\n    --debug | --d* | -d )\n      debug=: ;;\n    --quiet | --q* | --silent | --s* | -q )\n      lt_cl_silent=: ;;\n\n    -*) AC_MSG_ERROR([unrecognized option: $[1]\nTry \\`$[0] --help' for more information.]) ;;\n\n    *) AC_MSG_ERROR([unrecognized argument: $[1]\nTry \\`$[0] --help' for more information.]) ;;\n  esac\n  shift\ndone\n\nif $lt_cl_silent; then\n  exec AS_MESSAGE_FD>/dev/null\nfi\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<_LTEOF\n_LT_OUTPUT_LIBTOOL_COMMANDS_INIT\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<\\_LTEOF\nAC_MSG_NOTICE([creating $ofile])\n_LT_OUTPUT_LIBTOOL_COMMANDS\nAS_EXIT(0)\n_LTEOF\nchmod +x \"$CONFIG_LT\"\n\n# configure is writing to config.log, but config.lt does its own redirection,\n# appending to config.log, which fails on DOS, as config.log is still kept\n# open by configure.  Here we exec the FD to /dev/null, effectively closing\n# config.log, so it can be properly (re)opened and appended to by config.lt.\nif test \"$no_create\" != yes; then\n  lt_cl_success=:\n  test \"$silent\" = yes &&\n    lt_config_lt_args=\"$lt_config_lt_args --quiet\"\n  exec AS_MESSAGE_LOG_FD>/dev/null\n  $SHELL \"$CONFIG_LT\" $lt_config_lt_args || lt_cl_success=false\n  exec AS_MESSAGE_LOG_FD>>config.log\n  $lt_cl_success || AS_EXIT(1)\nfi\n])# LT_OUTPUT\n\n\n# _LT_CONFIG(TAG)\n# ---------------\n# If TAG is the built-in tag, create an initial libtool script with a\n# default configuration from the untagged config vars.  Otherwise add code\n# to config.status for appending the configuration named by TAG from the\n# matching tagged config vars.\nm4_defun([_LT_CONFIG],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\n_LT_CONFIG_SAVE_COMMANDS([\n  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl\n  m4_if(_LT_TAG, [C], [\n    # See if we are running on zsh, and set the options which allow our\n    # commands through without removal of \\ escapes.\n    if test -n \"${ZSH_VERSION+set}\" ; then\n      setopt NO_GLOB_SUBST\n    fi\n\n    cfgfile=\"${ofile}T\"\n    trap \"$RM \\\"$cfgfile\\\"; exit 1\" 1 2 15\n    $RM \"$cfgfile\"\n\n    cat <<_LT_EOF >> \"$cfgfile\"\n#! $SHELL\n\n# `$ECHO \"$ofile\" | sed 's%^.*/%%'` - Provide generalized library-building support services.\n# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n#\n_LT_COPYING\n_LT_LIBTOOL_TAGS\n\n# ### BEGIN LIBTOOL CONFIG\n_LT_LIBTOOL_CONFIG_VARS\n_LT_LIBTOOL_TAG_VARS\n# ### END LIBTOOL CONFIG\n\n_LT_EOF\n\n  case $host_os in\n  aix3*)\n    cat <<\\_LT_EOF >> \"$cfgfile\"\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test \"X${COLLECT_NAMES+set}\" != Xset; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\n_LT_EOF\n    ;;\n  esac\n\n  _LT_PROG_LTMAIN\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '/^# Generated shell functions inserted here/q' \"$ltmain\" >> \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\"; exit 1)\n\n  _LT_PROG_XSI_SHELLFNS\n\n  sed -n '/^# Generated shell functions inserted here/,$p' \"$ltmain\" >> \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\"; exit 1)\n\n  mv -f \"$cfgfile\" \"$ofile\" ||\n    (rm -f \"$ofile\" && cp \"$cfgfile\" \"$ofile\" && rm -f \"$cfgfile\")\n  chmod +x \"$ofile\"\n],\n[cat <<_LT_EOF >> \"$ofile\"\n\ndnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded\ndnl in a comment (ie after a #).\n# ### BEGIN LIBTOOL TAG CONFIG: $1\n_LT_LIBTOOL_TAG_VARS(_LT_TAG)\n# ### END LIBTOOL TAG CONFIG: $1\n_LT_EOF\n])dnl /m4_if\n],\n[m4_if([$1], [], [\n    PACKAGE='$PACKAGE'\n    VERSION='$VERSION'\n    TIMESTAMP='$TIMESTAMP'\n    RM='$RM'\n    ofile='$ofile'], [])\n])dnl /_LT_CONFIG_SAVE_COMMANDS\n])# _LT_CONFIG\n\n\n# LT_SUPPORTED_TAG(TAG)\n# ---------------------\n# Trace this macro to discover what tags are supported by the libtool\n# --tag option, using:\n#    autoconf --trace 'LT_SUPPORTED_TAG:$1'\nAC_DEFUN([LT_SUPPORTED_TAG], [])\n\n\n# C support is built-in for now\nm4_define([_LT_LANG_C_enabled], [])\nm4_define([_LT_TAGS], [])\n\n\n# LT_LANG(LANG)\n# -------------\n# Enable libtool support for the given language if not already enabled.\nAC_DEFUN([LT_LANG],\n[AC_BEFORE([$0], [LT_OUTPUT])dnl\nm4_case([$1],\n  [C],\t\t\t[_LT_LANG(C)],\n  [C++],\t\t[_LT_LANG(CXX)],\n  [Java],\t\t[_LT_LANG(GCJ)],\n  [Fortran 77],\t\t[_LT_LANG(F77)],\n  [Fortran],\t\t[_LT_LANG(FC)],\n  [Windows Resource],\t[_LT_LANG(RC)],\n  [m4_ifdef([_LT_LANG_]$1[_CONFIG],\n    [_LT_LANG($1)],\n    [m4_fatal([$0: unsupported language: \"$1\"])])])dnl\n])# LT_LANG\n\n\n# _LT_LANG(LANGNAME)\n# ------------------\nm4_defun([_LT_LANG],\n[m4_ifdef([_LT_LANG_]$1[_enabled], [],\n  [LT_SUPPORTED_TAG([$1])dnl\n  m4_append([_LT_TAGS], [$1 ])dnl\n  m4_define([_LT_LANG_]$1[_enabled], [])dnl\n  _LT_LANG_$1_CONFIG($1)])dnl\n])# _LT_LANG\n\n\n# _LT_LANG_DEFAULT_CONFIG\n# -----------------------\nm4_defun([_LT_LANG_DEFAULT_CONFIG],\n[AC_PROVIDE_IFELSE([AC_PROG_CXX],\n  [LT_LANG(CXX)],\n  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])\n\nAC_PROVIDE_IFELSE([AC_PROG_F77],\n  [LT_LANG(F77)],\n  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])\n\nAC_PROVIDE_IFELSE([AC_PROG_FC],\n  [LT_LANG(FC)],\n  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])\n\ndnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal\ndnl pulling things in needlessly.\nAC_PROVIDE_IFELSE([AC_PROG_GCJ],\n  [LT_LANG(GCJ)],\n  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],\n    [LT_LANG(GCJ)],\n    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],\n      [LT_LANG(GCJ)],\n      [m4_ifdef([AC_PROG_GCJ],\n\t[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])\n       m4_ifdef([A][M_PROG_GCJ],\n\t[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])\n       m4_ifdef([LT_PROG_GCJ],\n\t[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])\n\nAC_PROVIDE_IFELSE([LT_PROG_RC],\n  [LT_LANG(RC)],\n  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])\n])# _LT_LANG_DEFAULT_CONFIG\n\n# Obsolete macros:\nAU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])\nAU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])\nAU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])\nAU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_CXX], [])\ndnl AC_DEFUN([AC_LIBTOOL_F77], [])\ndnl AC_DEFUN([AC_LIBTOOL_FC], [])\ndnl AC_DEFUN([AC_LIBTOOL_GCJ], [])\n\n\n# _LT_TAG_COMPILER\n# ----------------\nm4_defun([_LT_TAG_COMPILER],\n[AC_REQUIRE([AC_PROG_CC])dnl\n\n_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl\n_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl\n_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl\n_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n])# _LT_TAG_COMPILER\n\n\n# _LT_COMPILER_BOILERPLATE\n# ------------------------\n# Check for compiler boilerplate output or warnings with\n# the simple compiler test code.\nm4_defun([_LT_COMPILER_BOILERPLATE],\n[m4_require([_LT_DECL_SED])dnl\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n])# _LT_COMPILER_BOILERPLATE\n\n\n# _LT_LINKER_BOILERPLATE\n# ----------------------\n# Check for linker boilerplate output or warnings with\n# the simple link test code.\nm4_defun([_LT_LINKER_BOILERPLATE],\n[m4_require([_LT_DECL_SED])dnl\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n])# _LT_LINKER_BOILERPLATE\n\n# _LT_REQUIRED_DARWIN_CHECKS\n# -------------------------\nm4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[\n  case $host_os in\n    rhapsody* | darwin*)\n    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])\n    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])\n    AC_CHECK_TOOL([LIPO], [lipo], [:])\n    AC_CHECK_TOOL([OTOOL], [otool], [:])\n    AC_CHECK_TOOL([OTOOL64], [otool64], [:])\n    _LT_DECL([], [DSYMUTIL], [1],\n      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])\n    _LT_DECL([], [NMEDIT], [1],\n      [Tool to change global to local symbols on Mac OS X])\n    _LT_DECL([], [LIPO], [1],\n      [Tool to manipulate fat objects and archives on Mac OS X])\n    _LT_DECL([], [OTOOL], [1],\n      [ldd/readelf like tool for Mach-O binaries on Mac OS X])\n    _LT_DECL([], [OTOOL64], [1],\n      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])\n\n    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],\n      [lt_cv_apple_cc_single_mod=no\n      if test -z \"${LT_MULTI_MODULE}\"; then\n\t# By default we will add the -single_module flag. You can override\n\t# by either setting the environment variable LT_MULTI_MODULE\n\t# non-empty at configure time, or by adding -multi_module to the\n\t# link flags.\n\trm -rf libconftest.dylib*\n\techo \"int foo(void){return 1;}\" > conftest.c\n\techo \"$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n-dynamiclib -Wl,-single_module conftest.c\" >&AS_MESSAGE_LOG_FD\n\t$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n\t  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err\n        _lt_result=$?\n\tif test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then\n\t  lt_cv_apple_cc_single_mod=yes\n\telse\n\t  cat conftest.err >&AS_MESSAGE_LOG_FD\n\tfi\n\trm -rf libconftest.dylib*\n\trm -f conftest.*\n      fi])\n    AC_CACHE_CHECK([for -exported_symbols_list linker flag],\n      [lt_cv_ld_exported_symbols_list],\n      [lt_cv_ld_exported_symbols_list=no\n      save_LDFLAGS=$LDFLAGS\n      echo \"_main\" > conftest.sym\n      LDFLAGS=\"$LDFLAGS -Wl,-exported_symbols_list,conftest.sym\"\n      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],\n\t[lt_cv_ld_exported_symbols_list=yes],\n\t[lt_cv_ld_exported_symbols_list=no])\n\tLDFLAGS=\"$save_LDFLAGS\"\n    ])\n    case $host_os in\n    rhapsody* | darwin1.[[012]])\n      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;\n    darwin1.*)\n      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n    darwin*) # darwin 5.x on\n      # if running on 10.5 or later, the deployment target defaults\n      # to the OS version, if on x86, and 10.4, the deployment\n      # target defaults to 10.4. Don't you love it?\n      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in\n\t10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n\t10.[[012]]*)\n\t  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n\t10.*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n      esac\n    ;;\n  esac\n    if test \"$lt_cv_apple_cc_single_mod\" = \"yes\"; then\n      _lt_dar_single_mod='$single_module'\n    fi\n    if test \"$lt_cv_ld_exported_symbols_list\" = \"yes\"; then\n      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'\n    else\n      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'\n    fi\n    if test \"$DSYMUTIL\" != \":\"; then\n      _lt_dsymutil='~$DSYMUTIL $lib || :'\n    else\n      _lt_dsymutil=\n    fi\n    ;;\n  esac\n])\n\n\n# _LT_DARWIN_LINKER_FEATURES\n# --------------------------\n# Checks for linker and compiler features on darwin\nm4_defun([_LT_DARWIN_LINKER_FEATURES],\n[\n  m4_require([_LT_REQUIRED_DARWIN_CHECKS])\n  _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n  _LT_TAGVAR(hardcode_direct, $1)=no\n  _LT_TAGVAR(hardcode_automatic, $1)=yes\n  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n  _LT_TAGVAR(whole_archive_flag_spec, $1)=''\n  _LT_TAGVAR(link_all_deplibs, $1)=yes\n  _LT_TAGVAR(allow_undefined_flag, $1)=\"$_lt_dar_allow_undefined\"\n  case $cc_basename in\n     ifort*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test \"$_lt_dar_can_shared\" = \"yes\"; then\n    output_verbose_link_cmd=echo\n    _LT_TAGVAR(archive_cmds, $1)=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod${_lt_dsymutil}\"\n    _LT_TAGVAR(module_cmds, $1)=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dsymutil}\"\n    _LT_TAGVAR(archive_expsym_cmds, $1)=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}\"\n    _LT_TAGVAR(module_expsym_cmds, $1)=\"sed -e 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}\"\n    m4_if([$1], [CXX],\n[   if test \"$lt_cv_apple_cc_single_mod\" != \"yes\"; then\n      _LT_TAGVAR(archive_cmds, $1)=\"\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dsymutil}\"\n      _LT_TAGVAR(archive_expsym_cmds, $1)=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dar_export_syms}${_lt_dsymutil}\"\n    fi\n],[])\n  else\n  _LT_TAGVAR(ld_shlibs, $1)=no\n  fi\n])\n\n# _LT_SYS_MODULE_PATH_AIX\n# -----------------------\n# Links a minimal program and checks the executable\n# for the system default hardcoded library path. In most cases,\n# this is /usr/lib:/lib, but when the MPI compilers are used\n# the location of the communication and MPI libs are included too.\n# If we don't find anything, use the default library path according\n# to the aix ld manual.\nm4_defun([_LT_SYS_MODULE_PATH_AIX],\n[m4_require([_LT_DECL_SED])dnl\nAC_LINK_IFELSE(AC_LANG_PROGRAM,[\nlt_aix_libpath_sed='\n    /Import File Strings/,/^$/ {\n\t/^0/ {\n\t    s/^0  *\\(.*\\)$/\\1/\n\t    p\n\t}\n    }'\naix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n# Check for a 64-bit object if we didn't find anything.\nif test -z \"$aix_libpath\"; then\n  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\nfi],[])\nif test -z \"$aix_libpath\"; then aix_libpath=\"/usr/lib:/lib\"; fi\n])# _LT_SYS_MODULE_PATH_AIX\n\n\n# _LT_SHELL_INIT(ARG)\n# -------------------\nm4_define([_LT_SHELL_INIT],\n[ifdef([AC_DIVERSION_NOTICE],\n\t     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],\n\t [AC_DIVERT_PUSH(NOTICE)])\n$1\nAC_DIVERT_POP\n])# _LT_SHELL_INIT\n\n\n# _LT_PROG_ECHO_BACKSLASH\n# -----------------------\n# Add some code to the start of the generated configure script which\n# will find an echo command which doesn't interpret backslashes.\nm4_defun([_LT_PROG_ECHO_BACKSLASH],\n[_LT_SHELL_INIT([\n# Check that we are running under the correct shell.\nSHELL=${CONFIG_SHELL-/bin/sh}\n\ncase X$lt_ECHO in\nX*--fallback-echo)\n  # Remove one level of quotation (which was required for Make).\n  ECHO=`echo \"$lt_ECHO\" | sed 's,\\\\\\\\\\[$]\\\\[$]0,'[$]0','`\n  ;;\nesac\n\nECHO=${lt_ECHO-echo}\nif test \"X[$]1\" = X--no-reexec; then\n  # Discard the --no-reexec flag, and continue.\n  shift\nelif test \"X[$]1\" = X--fallback-echo; then\n  # Avoid inline document here, it may be left over\n  :\nelif test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t' ; then\n  # Yippee, $ECHO works!\n  :\nelse\n  # Restart under the correct shell.\n  exec $SHELL \"[$]0\" --no-reexec ${1+\"[$]@\"}\nfi\n\nif test \"X[$]1\" = X--fallback-echo; then\n  # used as fallback echo\n  shift\n  cat <<_LT_EOF\n[$]*\n_LT_EOF\n  exit 0\nfi\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nif test -z \"$lt_ECHO\"; then\n  if test \"X${echo_test_string+set}\" != Xset; then\n    # find a string as large as possible, as long as the shell can cope with it\n    for cmd in 'sed 50q \"[$]0\"' 'sed 20q \"[$]0\"' 'sed 10q \"[$]0\"' 'sed 2q \"[$]0\"' 'echo test'; do\n      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...\n      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&\n\t { test \"X$echo_test_string\" = \"X$echo_test_string\"; } 2>/dev/null\n      then\n        break\n      fi\n    done\n  fi\n\n  if test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t' &&\n     echo_testing_string=`{ $ECHO \"$echo_test_string\"; } 2>/dev/null` &&\n     test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n    :\n  else\n    # The Solaris, AIX, and Digital Unix default echo programs unquote\n    # backslashes.  This makes it impossible to quote backslashes using\n    #   echo \"$something\" | sed 's/\\\\/\\\\\\\\/g'\n    #\n    # So, first we look for a working echo in the user's PATH.\n\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for dir in $PATH /usr/ucb; do\n      IFS=\"$lt_save_ifs\"\n      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&\n         test \"X`($dir/echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n         echo_testing_string=`($dir/echo \"$echo_test_string\") 2>/dev/null` &&\n         test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n        ECHO=\"$dir/echo\"\n        break\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n\n    if test \"X$ECHO\" = Xecho; then\n      # We didn't find a better echo, so look for alternatives.\n      if test \"X`{ print -r '\\t'; } 2>/dev/null`\" = 'X\\t' &&\n         echo_testing_string=`{ print -r \"$echo_test_string\"; } 2>/dev/null` &&\n         test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n        # This shell has a builtin print -r that does the trick.\n        ECHO='print -r'\n      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&\n\t   test \"X$CONFIG_SHELL\" != X/bin/ksh; then\n        # If we have ksh, try running configure again with it.\n        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}\n        export ORIGINAL_CONFIG_SHELL\n        CONFIG_SHELL=/bin/ksh\n        export CONFIG_SHELL\n        exec $CONFIG_SHELL \"[$]0\" --no-reexec ${1+\"[$]@\"}\n      else\n        # Try using printf.\n        ECHO='printf %s\\n'\n        if test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t' &&\n\t   echo_testing_string=`{ $ECHO \"$echo_test_string\"; } 2>/dev/null` &&\n\t   test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t  # Cool, printf works\n\t  :\n        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL \"[$]0\" --fallback-echo '\\t') 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = 'X\\t' &&\n\t     echo_testing_string=`($ORIGINAL_CONFIG_SHELL \"[$]0\" --fallback-echo \"$echo_test_string\") 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL\n\t  export CONFIG_SHELL\n\t  SHELL=\"$CONFIG_SHELL\"\n\t  export SHELL\n\t  ECHO=\"$CONFIG_SHELL [$]0 --fallback-echo\"\n        elif echo_testing_string=`($CONFIG_SHELL \"[$]0\" --fallback-echo '\\t') 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = 'X\\t' &&\n\t     echo_testing_string=`($CONFIG_SHELL \"[$]0\" --fallback-echo \"$echo_test_string\") 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t  ECHO=\"$CONFIG_SHELL [$]0 --fallback-echo\"\n        else\n\t  # maybe with a smaller string...\n\t  prev=:\n\n\t  for cmd in 'echo test' 'sed 2q \"[$]0\"' 'sed 10q \"[$]0\"' 'sed 20q \"[$]0\"' 'sed 50q \"[$]0\"'; do\n\t    if { test \"X$echo_test_string\" = \"X`eval $cmd`\"; } 2>/dev/null\n\t    then\n\t      break\n\t    fi\n\t    prev=\"$cmd\"\n\t  done\n\n\t  if test \"$prev\" != 'sed 50q \"[$]0\"'; then\n\t    echo_test_string=`eval $prev`\n\t    export echo_test_string\n\t    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} \"[$]0\" ${1+\"[$]@\"}\n\t  else\n\t    # Oops.  We lost completely, so just stick with echo.\n\t    ECHO=echo\n\t  fi\n        fi\n      fi\n    fi\n  fi\nfi\n\n# Copy echo and quote the copy suitably for passing to libtool from\n# the Makefile, instead of quoting the original, which is used later.\nlt_ECHO=$ECHO\nif test \"X$lt_ECHO\" = \"X$CONFIG_SHELL [$]0 --fallback-echo\"; then\n   lt_ECHO=\"$CONFIG_SHELL \\\\\\$\\[$]0 --fallback-echo\"\nfi\n\nAC_SUBST(lt_ECHO)\n])\n_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])\n_LT_DECL([], [ECHO], [1],\n    [An echo program that does not interpret backslashes])\n])# _LT_PROG_ECHO_BACKSLASH\n\n\n# _LT_ENABLE_LOCK\n# ---------------\nm4_defun([_LT_ENABLE_LOCK],\n[AC_ARG_ENABLE([libtool-lock],\n  [AS_HELP_STRING([--disable-libtool-lock],\n    [avoid locking (might break parallel builds)])])\ntest \"x$enable_libtool_lock\" != xno && enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\nia64-*-hpux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.$ac_objext` in\n      *ELF-32*)\n\tHPUX_IA64_MODE=\"32\"\n\t;;\n      *ELF-64*)\n\tHPUX_IA64_MODE=\"64\"\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n*-*-irix6*)\n  # Find out which ABI we are using.\n  echo '[#]line __oline__ \"configure\"' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    if test \"$lt_cv_prog_gnu_ld\" = yes; then\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -melf32bsmip\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -melf32bmipn32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -melf64bmip\"\n\t;;\n      esac\n    else\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -32\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -n32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -64\"\n\t  ;;\n      esac\n    fi\n  fi\n  rm -rf conftest*\n  ;;\n\nx86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \\\ns390*-*linux*|s390*-*tpf*|sparc*-*linux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.o` in\n      *32-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_i386_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_i386\"\n\t    ;;\n\t  ppc64-*linux*|powerpc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32ppclinux\"\n\t    ;;\n\t  s390x-*linux*)\n\t    LD=\"${LD-ld} -m elf_s390\"\n\t    ;;\n\t  sparc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32_sparc\"\n\t    ;;\n\tesac\n\t;;\n      *64-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_x86_64_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_x86_64\"\n\t    ;;\n\t  ppc*-*linux*|powerpc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64ppc\"\n\t    ;;\n\t  s390*-*linux*|s390*-*tpf*)\n\t    LD=\"${LD-ld} -m elf64_s390\"\n\t    ;;\n\t  sparc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64_sparc\"\n\t    ;;\n\tesac\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -belf\"\n  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,\n    [AC_LANG_PUSH(C)\n     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])\n     AC_LANG_POP])\n  if test x\"$lt_cv_cc_needs_belf\" != x\"yes\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=\"$SAVE_CFLAGS\"\n  fi\n  ;;\nsparc*-*solaris*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.o` in\n    *64-bit*)\n      case $lt_cv_prog_gnu_ld in\n      yes*) LD=\"${LD-ld} -m elf64_sparc\" ;;\n      *)\n\tif ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then\n\t  LD=\"${LD-ld} -64\"\n\tfi\n\t;;\n      esac\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\nesac\n\nneed_locks=\"$enable_libtool_lock\"\n])# _LT_ENABLE_LOCK\n\n\n# _LT_CMD_OLD_ARCHIVE\n# -------------------\nm4_defun([_LT_CMD_OLD_ARCHIVE],\n[AC_CHECK_TOOL(AR, ar, false)\ntest -z \"$AR\" && AR=ar\ntest -z \"$AR_FLAGS\" && AR_FLAGS=cru\n_LT_DECL([], [AR], [1], [The archiver])\n_LT_DECL([], [AR_FLAGS], [1])\n\nAC_CHECK_TOOL(STRIP, strip, :)\ntest -z \"$STRIP\" && STRIP=:\n_LT_DECL([], [STRIP], [1], [A symbol stripping program])\n\nAC_CHECK_TOOL(RANLIB, ranlib, :)\ntest -z \"$RANLIB\" && RANLIB=:\n_LT_DECL([], [RANLIB], [1],\n    [Commands used to install an old-style archive])\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  openbsd*)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB -t \\$oldlib\"\n    ;;\n  *)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB \\$oldlib\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$oldlib\"\nfi\n_LT_DECL([], [old_postinstall_cmds], [2])\n_LT_DECL([], [old_postuninstall_cmds], [2])\n_LT_TAGDECL([], [old_archive_cmds], [2],\n    [Commands used to build an old-style archive])\n])# _LT_CMD_OLD_ARCHIVE\n\n\n# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,\n#\t\t[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])\n# ----------------------------------------------------------------\n# Check whether the given compiler option works\nAC_DEFUN([_LT_COMPILER_OPTION],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_CACHE_CHECK([$1], [$2],\n  [$2=no\n   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$3\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [[^ ]]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:__oline__: $lt_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&AS_MESSAGE_LOG_FD\n   echo \"$as_me:__oline__: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       $2=yes\n     fi\n   fi\n   $RM conftest*\n])\n\nif test x\"[$]$2\" = xyes; then\n    m4_if([$5], , :, [$5])\nelse\n    m4_if([$6], , :, [$6])\nfi\n])# _LT_COMPILER_OPTION\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])\n\n\n# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,\n#                  [ACTION-SUCCESS], [ACTION-FAILURE])\n# ----------------------------------------------------\n# Check whether the given linker option works\nAC_DEFUN([_LT_LINKER_OPTION],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_CACHE_CHECK([$1], [$2],\n  [$2=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS $3\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&AS_MESSAGE_LOG_FD\n       $ECHO \"X$_lt_linker_boilerplate\" | $Xsed -e '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         $2=yes\n       fi\n     else\n       $2=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n])\n\nif test x\"[$]$2\" = xyes; then\n    m4_if([$4], , :, [$4])\nelse\n    m4_if([$5], , :, [$5])\nfi\n])# _LT_LINKER_OPTION\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])\n\n\n# LT_CMD_MAX_LEN\n#---------------\nAC_DEFUN([LT_CMD_MAX_LEN],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\n# find the maximum length of command line arguments\nAC_MSG_CHECKING([the maximum length of command line arguments])\nAC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl\n  i=0\n  teststring=\"ABCD\"\n\n  case $build_os in\n  msdosdjgpp*)\n    # On DJGPP, this test can blow up pretty badly due to problems in libc\n    # (any single argument exceeding 2000 bytes causes a buffer overrun\n    # during glob expansion).  Even if it were fixed, the result of this\n    # check would be larger than it should be.\n    lt_cv_sys_max_cmd_len=12288;    # 12K is about right\n    ;;\n\n  gnu*)\n    # Under GNU Hurd, this test is not required because there is\n    # no limit to the length of command line arguments.\n    # Libtool will interpret -1 as no limit whatsoever\n    lt_cv_sys_max_cmd_len=-1;\n    ;;\n\n  cygwin* | mingw* | cegcc*)\n    # On Win9x/ME, this test blows up -- it succeeds, but takes\n    # about 5 minutes as the teststring grows exponentially.\n    # Worse, since 9x/ME are not pre-emptively multitasking,\n    # you end up with a \"frozen\" computer, even though with patience\n    # the test eventually succeeds (with a max line length of 256k).\n    # Instead, let's just punt: use the minimum linelength reported by\n    # all of the supported platforms: 8192 (on NT/2K/XP).\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  amigaos*)\n    # On AmigaOS with pdksh, this test takes hours, literally.\n    # So we just punt and use a minimum line length of 8192.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)\n    # This has been around since 386BSD, at least.  Likely further.\n    if test -x /sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`\n    elif test -x /usr/sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`\n    else\n      lt_cv_sys_max_cmd_len=65536\t# usable default for all BSDs\n    fi\n    # And add a safety zone\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    ;;\n\n  interix*)\n    # We know the value 262144 and hardcode it with a safety zone (like BSD)\n    lt_cv_sys_max_cmd_len=196608\n    ;;\n\n  osf*)\n    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure\n    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not\n    # nice to cause kernel panics so lets avoid the loop below.\n    # First set a reasonable default.\n    lt_cv_sys_max_cmd_len=16384\n    #\n    if test -x /sbin/sysconfig; then\n      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in\n        *1*) lt_cv_sys_max_cmd_len=-1 ;;\n      esac\n    fi\n    ;;\n  sco3.2v5*)\n    lt_cv_sys_max_cmd_len=102400\n    ;;\n  sysv5* | sco5v6* | sysv4.2uw2*)\n    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`\n    if test -n \"$kargmax\"; then\n      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[\t ]]//'`\n    else\n      lt_cv_sys_max_cmd_len=32768\n    fi\n    ;;\n  *)\n    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`\n    if test -n \"$lt_cv_sys_max_cmd_len\"; then\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    else\n      # Make teststring a little bigger before we do anything with it.\n      # a 1K string should be a reasonable start.\n      for i in 1 2 3 4 5 6 7 8 ; do\n        teststring=$teststring$teststring\n      done\n      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}\n      # If test is not a shell built-in, we'll probably end up computing a\n      # maximum length that is only half of the actual maximum length, but\n      # we can't tell.\n      while { test \"X\"`$SHELL [$]0 --fallback-echo \"X$teststring$teststring\" 2>/dev/null` \\\n\t         = \"XX$teststring$teststring\"; } >/dev/null 2>&1 &&\n\t      test $i != 17 # 1/2 MB should be enough\n      do\n        i=`expr $i + 1`\n        teststring=$teststring$teststring\n      done\n      # Only check the string length outside the loop.\n      lt_cv_sys_max_cmd_len=`expr \"X$teststring\" : \".*\" 2>&1`\n      teststring=\n      # Add a significant safety factor because C++ compilers can tack on\n      # massive amounts of additional arguments before passing them to the\n      # linker.  It appears as though 1/2 is a usable value.\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 2`\n    fi\n    ;;\n  esac\n])\nif test -n $lt_cv_sys_max_cmd_len ; then\n  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)\nelse\n  AC_MSG_RESULT(none)\nfi\nmax_cmd_len=$lt_cv_sys_max_cmd_len\n_LT_DECL([], [max_cmd_len], [0],\n    [What is the maximum length of a command?])\n])# LT_CMD_MAX_LEN\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])\n\n\n# _LT_HEADER_DLFCN\n# ----------------\nm4_defun([_LT_HEADER_DLFCN],\n[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl\n])# _LT_HEADER_DLFCN\n\n\n# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,\n#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)\n# ----------------------------------------------------------------\nm4_defun([_LT_TRY_DLOPEN_SELF],\n[m4_require([_LT_HEADER_DLFCN])dnl\nif test \"$cross_compiling\" = yes; then :\n  [$4]\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n[#line __oline__ \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\nvoid fnord() { int i=42;}\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else if (dlsym( self,\"_fnord\")) status = $lt_dlneed_uscore;\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}]\n_LT_EOF\n  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) $1 ;;\n      x$lt_dlneed_uscore) $2 ;;\n      x$lt_dlunknown|x*) $3 ;;\n    esac\n  else :\n    # compilation failed\n    $3\n  fi\nfi\nrm -fr conftest*\n])# _LT_TRY_DLOPEN_SELF\n\n\n# LT_SYS_DLOPEN_SELF\n# ------------------\nAC_DEFUN([LT_SYS_DLOPEN_SELF],\n[m4_require([_LT_HEADER_DLFCN])dnl\nif test \"x$enable_dlopen\" != xyes; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=\"load_add_on\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  mingw* | pw32* | cegcc*)\n    lt_cv_dlopen=\"LoadLibrary\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  cygwin*)\n    lt_cv_dlopen=\"dlopen\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  darwin*)\n  # if libdl is installed we need to link against it\n    AC_CHECK_LIB([dl], [dlopen],\n\t\t[lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"],[\n    lt_cv_dlopen=\"dyld\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ])\n    ;;\n\n  *)\n    AC_CHECK_FUNC([shl_load],\n\t  [lt_cv_dlopen=\"shl_load\"],\n      [AC_CHECK_LIB([dld], [shl_load],\n\t    [lt_cv_dlopen=\"shl_load\" lt_cv_dlopen_libs=\"-ldld\"],\n\t[AC_CHECK_FUNC([dlopen],\n\t      [lt_cv_dlopen=\"dlopen\"],\n\t  [AC_CHECK_LIB([dl], [dlopen],\n\t\t[lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"],\n\t    [AC_CHECK_LIB([svld], [dlopen],\n\t\t  [lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-lsvld\"],\n\t      [AC_CHECK_LIB([dld], [dld_link],\n\t\t    [lt_cv_dlopen=\"dld_link\" lt_cv_dlopen_libs=\"-ldld\"])\n\t      ])\n\t    ])\n\t  ])\n\t])\n      ])\n    ;;\n  esac\n\n  if test \"x$lt_cv_dlopen\" != xno; then\n    enable_dlopen=yes\n  else\n    enable_dlopen=no\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=\"$CPPFLAGS\"\n    test \"x$ac_cv_header_dlfcn_h\" = xyes && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=\"$LDFLAGS\"\n    wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=\"$LIBS\"\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    AC_CACHE_CHECK([whether a program can dlopen itself],\n\t  lt_cv_dlopen_self, [dnl\n\t  _LT_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,\n\t    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)\n    ])\n\n    if test \"x$lt_cv_dlopen_self\" = xyes; then\n      wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $lt_prog_compiler_static\\\"\n      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],\n\t  lt_cv_dlopen_self_static, [dnl\n\t  _LT_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,\n\t    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)\n      ])\n    fi\n\n    CPPFLAGS=\"$save_CPPFLAGS\"\n    LDFLAGS=\"$save_LDFLAGS\"\n    LIBS=\"$save_LIBS\"\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n_LT_DECL([dlopen_support], [enable_dlopen], [0],\n\t [Whether dlopen is supported])\n_LT_DECL([dlopen_self], [enable_dlopen_self], [0],\n\t [Whether dlopen of programs is supported])\n_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],\n\t [Whether dlopen of statically linked programs is supported])\n])# LT_SYS_DLOPEN_SELF\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])\n\n\n# _LT_COMPILER_C_O([TAGNAME])\n# ---------------------------\n# Check to see if options -c and -o are simultaneously supported by compiler.\n# This macro does not hard code the compiler like AC_PROG_CC_C_O.\nm4_defun([_LT_COMPILER_C_O],\n[m4_require([_LT_DECL_SED])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_TAG_COMPILER])dnl\nAC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],\n  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],\n  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [[^ ]]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:__oline__: $lt_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&AS_MESSAGE_LOG_FD\n   echo \"$as_me:__oline__: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes\n     fi\n   fi\n   chmod u+w . 2>&AS_MESSAGE_LOG_FD\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n])\n_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],\n\t[Does compiler simultaneously support -c and -o options?])\n])# _LT_COMPILER_C_O\n\n\n# _LT_COMPILER_FILE_LOCKS([TAGNAME])\n# ----------------------------------\n# Check to see if we can do hard links to lock some files if needed\nm4_defun([_LT_COMPILER_FILE_LOCKS],\n[m4_require([_LT_ENABLE_LOCK])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\n_LT_COMPILER_C_O([$1])\n\nhard_links=\"nottested\"\nif test \"$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  AC_MSG_CHECKING([if we can lock with hard links])\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  AC_MSG_RESULT([$hard_links])\n  if test \"$hard_links\" = no; then\n    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])\n])# _LT_COMPILER_FILE_LOCKS\n\n\n# _LT_CHECK_OBJDIR\n# ----------------\nm4_defun([_LT_CHECK_OBJDIR],\n[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],\n[rm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  lt_cv_objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  lt_cv_objdir=_libs\nfi\nrmdir .libs 2>/dev/null])\nobjdir=$lt_cv_objdir\n_LT_DECL([], [objdir], [0],\n         [The name of the directory that contains temporary libtool files])dnl\nm4_pattern_allow([LT_OBJDIR])dnl\nAC_DEFINE_UNQUOTED(LT_OBJDIR, \"$lt_cv_objdir/\",\n  [Define to the sub-directory in which libtool stores uninstalled libraries.])\n])# _LT_CHECK_OBJDIR\n\n\n# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])\n# --------------------------------------\n# Check hardcoding attributes.\nm4_defun([_LT_LINKER_HARDCODE_LIBPATH],\n[AC_MSG_CHECKING([how to hardcode library paths into programs])\n_LT_TAGVAR(hardcode_action, $1)=\nif test -n \"$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\" ||\n   test -n \"$_LT_TAGVAR(runpath_var, $1)\" ||\n   test \"X$_LT_TAGVAR(hardcode_automatic, $1)\" = \"Xyes\" ; then\n\n  # We can hardcode non-existent directories.\n  if test \"$_LT_TAGVAR(hardcode_direct, $1)\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$_LT_TAGVAR(hardcode_shlibpath_var, $1)\" != no &&\n     test \"$_LT_TAGVAR(hardcode_minus_L, $1)\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    _LT_TAGVAR(hardcode_action, $1)=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    _LT_TAGVAR(hardcode_action, $1)=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  _LT_TAGVAR(hardcode_action, $1)=unsupported\nfi\nAC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])\n\nif test \"$_LT_TAGVAR(hardcode_action, $1)\" = relink ||\n   test \"$_LT_TAGVAR(inherit_rpath, $1)\" = yes; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n_LT_TAGDECL([], [hardcode_action], [0],\n    [How to hardcode a shared library path into an executable])\n])# _LT_LINKER_HARDCODE_LIBPATH\n\n\n# _LT_CMD_STRIPLIB\n# ----------------\nm4_defun([_LT_CMD_STRIPLIB],\n[m4_require([_LT_DECL_EGREP])\nstriplib=\nold_striplib=\nAC_MSG_CHECKING([whether stripping libraries is possible])\nif test -n \"$STRIP\" && $STRIP -V 2>&1 | $GREP \"GNU strip\" >/dev/null; then\n  test -z \"$old_striplib\" && old_striplib=\"$STRIP --strip-debug\"\n  test -z \"$striplib\" && striplib=\"$STRIP --strip-unneeded\"\n  AC_MSG_RESULT([yes])\nelse\n# FIXME - insert some real tests, host_os isn't really good enough\n  case $host_os in\n  darwin*)\n    if test -n \"$STRIP\" ; then\n      striplib=\"$STRIP -x\"\n      old_striplib=\"$STRIP -S\"\n      AC_MSG_RESULT([yes])\n    else\n      AC_MSG_RESULT([no])\n    fi\n    ;;\n  *)\n    AC_MSG_RESULT([no])\n    ;;\n  esac\nfi\n_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])\n_LT_DECL([], [striplib], [1])\n])# _LT_CMD_STRIPLIB\n\n\n# _LT_SYS_DYNAMIC_LINKER([TAG])\n# -----------------------------\n# PORTME Fill in your ld.so characteristics\nm4_defun([_LT_SYS_DYNAMIC_LINKER],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_OBJDUMP])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_MSG_CHECKING([dynamic linker characteristics])\nm4_if([$1],\n\t[], [\nif test \"$GCC\" = yes; then\n  case $host_os in\n    darwin*) lt_awk_arg=\"/^libraries:/,/LR/\" ;;\n    *) lt_awk_arg=\"/^libraries:/\" ;;\n  esac\n  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e \"s/^libraries://\" -e \"s,=/,/,g\"`\n  if $ECHO \"$lt_search_path_spec\" | $GREP ';' >/dev/null ; then\n    # if the path contains \";\" then we assume it to be the separator\n    # otherwise default to the standard path separator (i.e. \":\") - it is\n    # assumed that no part of a normal pathname contains \";\" but that should\n    # okay in the real world where \";\" in dirpaths is itself problematic.\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED -e 's/;/ /g'`\n  else\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED  -e \"s/$PATH_SEPARATOR/ /g\"`\n  fi\n  # Ok, now we have the path, separated by spaces, we can step through it\n  # and add multilib dir if necessary.\n  lt_tmp_lt_search_path_spec=\n  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`\n  for lt_sys_path in $lt_search_path_spec; do\n    if test -d \"$lt_sys_path/$lt_multi_os_dir\"; then\n      lt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir\"\n    else\n      test -d \"$lt_sys_path\" && \\\n\tlt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path\"\n    fi\n  done\n  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '\nBEGIN {RS=\" \"; FS=\"/|\\n\";} {\n  lt_foo=\"\";\n  lt_count=0;\n  for (lt_i = NF; lt_i > 0; lt_i--) {\n    if ($lt_i != \"\" && $lt_i != \".\") {\n      if ($lt_i == \"..\") {\n        lt_count++;\n      } else {\n        if (lt_count == 0) {\n          lt_foo=\"/\" $lt_i lt_foo;\n        } else {\n          lt_count--;\n        }\n      }\n    }\n  }\n  if (lt_foo != \"\") { lt_freq[[lt_foo]]++; }\n  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }\n}'`\n  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`\nelse\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\nfi])\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=\".so\"\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\ncase $host_os in\naix3*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}${shared_ext}$major'\n  ;;\n\naix[[4-9]]*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[[01]] | aix4.[[01]].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}${shared_ext}$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO \"X$lib\" | $Xsed -e '\\''s%^.*/\\([[^/]]*\\)\\.ixlibrary$%\\1%'\\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='${libname}${shared_ext}'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[[45]]*)\n  version_type=linux\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=\".dll\"\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$host_os in\n  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n      sys_lib_search_path_spec=\"/usr/lib /lib/w32api /lib /usr/local/lib\"\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP \"^libraries:\" | $SED -e \"s/^libraries://\" -e \"s,=/,/,g\"`\n      if $ECHO \"$sys_lib_search_path_spec\" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then\n        # It is most probably a Windows format PATH printed by\n        # mingw gcc, but we are running on Cygwin. Gcc prints its search\n        # path with ; separators, and with drive letters. We can handle the\n        # drive letters (cygwin fileutils understands them), so leave them,\n        # especially as we might pass files found there to a mingw objdump,\n        # which wouldn't understand a cygwinified path. Ahh.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED  -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    esac\n    ;;\n\n  *)\n    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'\n    ;;\n  esac\n  dynamic_linker='Win32 ld.exe'\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'\n  soname_spec='${libname}${release}${major}$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\nm4_if([$1], [],[\n  sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/local/lib\"])\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd1*)\n  dynamic_linker=no\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[[123]]*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[[01]]* | freebsdelf3.[[01]]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \\\n  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\ngnu*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    if test \"X$HPUX_IA64_MODE\" = X32; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n    fi\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555.\n  postinstall_cmds='chmod 555 $lib'\n  ;;\n\ninterix[[3-9]]*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test \"$lt_cv_prog_gnu_ld\" = yes; then\n\t\tversion_type=linux\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\n# This must be Linux ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  # Some binutils ld are patched to set DT_RUNPATH\n  save_LDFLAGS=$LDFLAGS\n  save_libdir=$libdir\n  eval \"libdir=/foo; wl=\\\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\\\"; \\\n       LDFLAGS=\\\"\\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\\\"\"\n  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],\n    [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null],\n       [shlibpath_overrides_runpath=yes])])\n  LDFLAGS=$save_LDFLAGS\n  libdir=$save_libdir\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Append ld.so.conf contents to the search path\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\[$]2)); skip = 1; } { if (!skip) print \\[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsdelf*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='NetBSD ld.elf_so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=\"/usr/lib\"\n  need_lib_prefix=no\n  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.\n  case $host_os in\n    openbsd3.3 | openbsd3.3.*)\tneed_version=yes ;;\n    *)\t\t\t\tneed_version=no  ;;\n  esac\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case $host_os in\n      openbsd2.[[89]] | openbsd2.[[89]].*)\n\tshlibpath_overrides_runpath=no\n\t;;\n      *)\n\tshlibpath_overrides_runpath=yes\n\t;;\n      esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  ;;\n\nos2*)\n  libname_spec='$name'\n  shrext_cmds=\".dll\"\n  need_lib_prefix=no\n  library_names_spec='$libname${shared_ext} $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux\n    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'\n    soname_spec='$libname${shared_ext}.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=freebsd-elf\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\nAC_MSG_RESULT([$dynamic_linker])\ntest \"$dynamic_linker\" = no && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test \"${lt_cv_sys_lib_search_path_spec+set}\" = set; then\n  sys_lib_search_path_spec=\"$lt_cv_sys_lib_search_path_spec\"\nfi\nif test \"${lt_cv_sys_lib_dlsearch_path_spec+set}\" = set; then\n  sys_lib_dlsearch_path_spec=\"$lt_cv_sys_lib_dlsearch_path_spec\"\nfi\n\n_LT_DECL([], [variables_saved_for_relink], [1],\n    [Variables whose values should be saved in libtool wrapper scripts and\n    restored at link time])\n_LT_DECL([], [need_lib_prefix], [0],\n    [Do we need the \"lib\" prefix for modules?])\n_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])\n_LT_DECL([], [version_type], [0], [Library versioning type])\n_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])\n_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])\n_LT_DECL([], [shlibpath_overrides_runpath], [0],\n    [Is shlibpath searched before the hard-coded library search path?])\n_LT_DECL([], [libname_spec], [1], [Format of library name prefix])\n_LT_DECL([], [library_names_spec], [1],\n    [[List of archive names.  First name is the real one, the rest are links.\n    The last name is the one that the linker finds with -lNAME]])\n_LT_DECL([], [soname_spec], [1],\n    [[The coded name of the library, if different from the real name]])\n_LT_DECL([], [postinstall_cmds], [2],\n    [Command to use after installation of a shared archive])\n_LT_DECL([], [postuninstall_cmds], [2],\n    [Command to use after uninstallation of a shared archive])\n_LT_DECL([], [finish_cmds], [2],\n    [Commands used to finish a libtool library installation in a directory])\n_LT_DECL([], [finish_eval], [1],\n    [[As \"finish_cmds\", except a single script fragment to be evaled but\n    not shown]])\n_LT_DECL([], [hardcode_into_libs], [0],\n    [Whether we should hardcode library paths into libraries])\n_LT_DECL([], [sys_lib_search_path_spec], [2],\n    [Compile-time system search path for libraries])\n_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],\n    [Run-time system search path for libraries])\n])# _LT_SYS_DYNAMIC_LINKER\n\n\n# _LT_PATH_TOOL_PREFIX(TOOL)\n# --------------------------\n# find a file program which can recognize shared library\nAC_DEFUN([_LT_PATH_TOOL_PREFIX],\n[m4_require([_LT_DECL_EGREP])dnl\nAC_MSG_CHECKING([for $1])\nAC_CACHE_VAL(lt_cv_path_MAGIC_CMD,\n[case $MAGIC_CMD in\n[[\\\\/*] |  ?:[\\\\/]*])\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\ndnl $ac_dummy forces splitting on constant user-supplied paths.\ndnl POSIX.2 word splitting is done only on the output of word expansions,\ndnl not every word.  This closes a longstanding sh security hole.\n  ac_dummy=\"m4_if([$2], , $PATH, [$2])\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$1; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/$1\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac])\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  AC_MSG_RESULT($MAGIC_CMD)\nelse\n  AC_MSG_RESULT(no)\nfi\n_LT_DECL([], [MAGIC_CMD], [0],\n\t [Used to examine libraries when file_magic_cmd begins with \"file\"])dnl\n])# _LT_PATH_TOOL_PREFIX\n\n# Old name:\nAU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])\n\n\n# _LT_PATH_MAGIC\n# --------------\n# find a file program which can recognize a shared library\nm4_defun([_LT_PATH_MAGIC],\n[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)\n  else\n    MAGIC_CMD=:\n  fi\nfi\n])# _LT_PATH_MAGIC\n\n\n# LT_PATH_LD\n# ----------\n# find the pathname to the GNU or non-GNU linker\nAC_DEFUN([LT_PATH_LD],\n[AC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_DECL_EGREP])dnl\n\nAC_ARG_WITH([gnu-ld],\n    [AS_HELP_STRING([--with-gnu-ld],\n\t[assume the C compiler uses GNU ld @<:@default=no@:>@])],\n    [test \"$withval\" = no || with_gnu_ld=yes],\n    [with_gnu_ld=no])dnl\n\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  AC_MSG_CHECKING([for ld used by $CC])\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [[\\\\/]]* | ?:[[\\\\/]]*)\n      re_direlt='/[[^/]][[^/]]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  AC_MSG_CHECKING([for GNU ld])\nelse\n  AC_MSG_CHECKING([for non-GNU ld])\nfi\nAC_CACHE_VAL(lt_cv_path_LD,\n[if test -z \"$LD\"; then\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break\n\t;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break\n\t;;\n      esac\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi])\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  AC_MSG_RESULT($LD)\nelse\n  AC_MSG_RESULT(no)\nfi\ntest -z \"$LD\" && AC_MSG_ERROR([no acceptable ld found in \\$PATH])\n_LT_PATH_LD_GNU\nAC_SUBST([LD])\n\n_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])\n])# LT_PATH_LD\n\n# Old names:\nAU_ALIAS([AM_PROG_LD], [LT_PATH_LD])\nAU_ALIAS([AC_PROG_LD], [LT_PATH_LD])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_PROG_LD], [])\ndnl AC_DEFUN([AC_PROG_LD], [])\n\n\n# _LT_PATH_LD_GNU\n#- --------------\nm4_defun([_LT_PATH_LD_GNU],\n[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,\n[# I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac])\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n])# _LT_PATH_LD_GNU\n\n\n# _LT_CMD_RELOAD\n# --------------\n# find reload flag for linker\n#   -- PORTME Some linkers may need a different reload flag.\nm4_defun([_LT_CMD_RELOAD],\n[AC_CACHE_CHECK([for $LD option to reload object files],\n  lt_cv_ld_reload_flag,\n  [lt_cv_ld_reload_flag='-r'])\nreload_flag=$lt_cv_ld_reload_flag\ncase $reload_flag in\n\"\" | \" \"*) ;;\n*) reload_flag=\" $reload_flag\" ;;\nesac\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ncase $host_os in\n  darwin*)\n    if test \"$GCC\" = yes; then\n      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'\n    else\n      reload_cmds='$LD$reload_flag -o $output$reload_objs'\n    fi\n    ;;\nesac\n_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl\n_LT_DECL([], [reload_cmds], [2])dnl\n])# _LT_CMD_RELOAD\n\n\n# _LT_CHECK_MAGIC_METHOD\n# ----------------------\n# how to check for library dependencies\n#  -- PORTME fill in with the dynamic library characteristics\nm4_defun([_LT_CHECK_MAGIC_METHOD],\n[m4_require([_LT_DECL_EGREP])\nm4_require([_LT_DECL_OBJDUMP])\nAC_CACHE_CHECK([how to recognize dependent libraries],\nlt_cv_deplibs_check_method,\n[lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# `unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# which responds to the $file_magic_cmd with a given extended regex.\n# If you have `file' or equivalent on your system and you're not sure\n# whether `pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix[[4-9]]*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi[[45]]*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin*)\n  # func_win32_libid is a shell function defined in ltmain.sh\n  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n  lt_cv_file_magic_cmd='func_win32_libid'\n  ;;\n\nmingw* | pw32*)\n  # Base MSYS/MinGW do not provide the 'file' command needed by\n  # func_win32_libid shell function, so use a weaker test based on 'objdump',\n  # unless we find 'file', for example because we are cross-compiling.\n  if ( file / ) >/dev/null 2>&1; then\n    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n    lt_cv_file_magic_cmd='func_win32_libid'\n  else\n    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'\n    lt_cv_file_magic_cmd='$OBJDUMP -f'\n  fi\n  ;;\n\ncegcc)\n  # use the weaker test based on 'objdump'. See mingw*.\n  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nfreebsd* | dragonfly*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\ngnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20* | hpux11*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  case $host_cpu in\n  ia64*)\n    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'\n    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so\n    ;;\n  hppa*64*)\n    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']\n    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl\n    ;;\n  *)\n    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'\n    lt_cv_file_magic_test_file=/usr/lib/libc.sl\n    ;;\n  esac\n  ;;\n\ninterix[[3-9]]*)\n  # PIC code is broken on Interix 3.x, that's why |\\.a not |_pic\\.a here\n  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so|\\.a)$'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $LD in\n  *-32|*\"-32 \") libmagic=32-bit;;\n  *-n32|*\"-n32 \") libmagic=N32;;\n  *-64|*\"-64 \") libmagic=64-bit;;\n  *) libmagic=never-match;;\n  esac\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be Linux ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nnetbsd* | netbsdelf*-gnu)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so|_pic\\.a)$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\n*nto* | *qnx*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nopenbsd*)\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|\\.so|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|_pic\\.a)$'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nrdos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.3*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  siemens)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  pc)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  esac\n  ;;\n\ntpf*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nesac\n])\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n_LT_DECL([], [deplibs_check_method], [1],\n    [Method to check whether dependent libraries are shared objects])\n_LT_DECL([], [file_magic_cmd], [1],\n    [Command to use when deplibs_check_method == \"file_magic\"])\n])# _LT_CHECK_MAGIC_METHOD\n\n\n# LT_PATH_NM\n# ----------\n# find the pathname to a BSD- or MS-compatible name lister\nAC_DEFUN([LT_PATH_NM],\n[AC_REQUIRE([AC_PROG_CC])dnl\nAC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,\n[if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=\"$NM\"\nelse\n  lt_nm_to_check=\"${ac_tool_prefix}nm\"\n  if test -n \"$ac_tool_prefix\" && test \"$build\" = \"$host\"; then\n    lt_nm_to_check=\"$lt_nm_to_check nm\"\n  fi\n  for lt_tmp_nm in $lt_nm_to_check; do\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do\n      IFS=\"$lt_save_ifs\"\n      test -z \"$ac_dir\" && ac_dir=.\n      tmp_nm=\"$ac_dir/$lt_tmp_nm\"\n      if test -f \"$tmp_nm\" || test -f \"$tmp_nm$ac_exeext\" ; then\n\t# Check to see if the nm accepts a BSD-compat flag.\n\t# Adding the `sed 1q' prevents false positives on HP-UX, which says:\n\t#   nm: unknown option \"B\" ignored\n\t# Tru64's nm complains that /dev/null is an invalid object file\n\tcase `\"$tmp_nm\" -B /dev/null 2>&1 | sed '1q'` in\n\t*/dev/null* | *'Invalid file or object type'*)\n\t  lt_cv_path_NM=\"$tmp_nm -B\"\n\t  break\n\t  ;;\n\t*)\n\t  case `\"$tmp_nm\" -p /dev/null 2>&1 | sed '1q'` in\n\t  */dev/null*)\n\t    lt_cv_path_NM=\"$tmp_nm -p\"\n\t    break\n\t    ;;\n\t  *)\n\t    lt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\t    continue # so that we can try to find one that supports BSD flags\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n  done\n  : ${lt_cv_path_NM=no}\nfi])\nif test \"$lt_cv_path_NM\" != \"no\"; then\n  NM=\"$lt_cv_path_NM\"\nelse\n  # Didn't find any BSD compatible name lister, look for dumpbin.\n  AC_CHECK_TOOLS(DUMPBIN, [\"dumpbin -symbols\" \"link -dump -symbols\"], :)\n  AC_SUBST([DUMPBIN])\n  if test \"$DUMPBIN\" != \":\"; then\n    NM=\"$DUMPBIN\"\n  fi\nfi\ntest -z \"$NM\" && NM=nm\nAC_SUBST([NM])\n_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl\n\nAC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],\n  [lt_cv_nm_interface=\"BSD nm\"\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  (eval echo \"\\\"\\$as_me:__oline__: $ac_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n  (eval \"$ac_compile\" 2>conftest.err)\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  (eval echo \"\\\"\\$as_me:__oline__: $NM \\\\\\\"conftest.$ac_objext\\\\\\\"\\\"\" >&AS_MESSAGE_LOG_FD)\n  (eval \"$NM \\\"conftest.$ac_objext\\\"\" 2>conftest.err > conftest.out)\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  (eval echo \"\\\"\\$as_me:__oline__: output\\\"\" >&AS_MESSAGE_LOG_FD)\n  cat conftest.out >&AS_MESSAGE_LOG_FD\n  if $GREP 'External.*some_variable' conftest.out > /dev/null; then\n    lt_cv_nm_interface=\"MS dumpbin\"\n  fi\n  rm -f conftest*])\n])# LT_PATH_NM\n\n# Old names:\nAU_ALIAS([AM_PROG_NM], [LT_PATH_NM])\nAU_ALIAS([AC_PROG_NM], [LT_PATH_NM])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_PROG_NM], [])\ndnl AC_DEFUN([AC_PROG_NM], [])\n\n\n# LT_LIB_M\n# --------\n# check for math library\nAC_DEFUN([LT_LIB_M],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nLIBM=\ncase $host in\n*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)\n  # These system don't have libm, or don't need it\n  ;;\n*-ncr-sysv4.3*)\n  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=\"-lmw\")\n  AC_CHECK_LIB(m, cos, LIBM=\"$LIBM -lm\")\n  ;;\n*)\n  AC_CHECK_LIB(m, cos, LIBM=\"-lm\")\n  ;;\nesac\nAC_SUBST([LIBM])\n])# LT_LIB_M\n\n# Old name:\nAU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_CHECK_LIBM], [])\n\n\n# _LT_COMPILER_NO_RTTI([TAGNAME])\n# -------------------------------\nm4_defun([_LT_COMPILER_NO_RTTI],\n[m4_require([_LT_TAG_COMPILER])dnl\n\n_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\n\nif test \"$GCC\" = yes; then\n  _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'\n\n  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],\n    lt_cv_prog_compiler_rtti_exceptions,\n    [-fno-rtti -fno-exceptions], [],\n    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\"$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions\"])\nfi\n_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],\n\t[Compiler flag to turn off builtin functions])\n])# _LT_COMPILER_NO_RTTI\n\n\n# _LT_CMD_GLOBAL_SYMBOLS\n# ----------------------\nm4_defun([_LT_CMD_GLOBAL_SYMBOLS],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\nAC_REQUIRE([LT_PATH_LD])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_TAG_COMPILER])dnl\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\nAC_MSG_CHECKING([command to parse $NM output from $compiler object])\nAC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],\n[\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[[BCDEGRST]]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([[_A-Za-z]][[_A-Za-z0-9]]*\\)'\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[[BCDT]]'\n  ;;\ncygwin* | mingw* | pw32* | cegcc*)\n  symcode='[[ABCDGISTW]]'\n  ;;\nhpux*)\n  if test \"$host_cpu\" = ia64; then\n    symcode='[[ABCDEGRST]]'\n  fi\n  ;;\nirix* | nonstopux*)\n  symcode='[[BCDEGRST]]'\n  ;;\nosf*)\n  symcode='[[BCDEGQRST]]'\n  ;;\nsolaris*)\n  symcode='[[BDRT]]'\n  ;;\nsco3.2v5*)\n  symcode='[[DT]]'\n  ;;\nsysv4.2uw2*)\n  symcode='[[DT]]'\n  ;;\nsysv5* | sco5v6* | unixware* | OpenUNIX*)\n  symcode='[[ABDT]]'\n  ;;\nsysv4)\n  symcode='[[DFNSTU]]'\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\ncase `$NM -V 2>&1` in\n*GNU* | *'with BFD'*)\n  symcode='[[ABCDGIRSTW]]' ;;\nesac\n\n# Transform an extracted symbol line into a proper C declaration.\n# Some systems (esp. on ia64) link data and code symbols differently,\n# so use this general approach.\nlt_cv_sys_global_symbol_to_cdecl=\"sed -n -e 's/^T .* \\(.*\\)$/extern int \\1();/p' -e 's/^$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_sys_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([[^ ]]*\\) $/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\([[^ ]]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p'\"\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix=\"sed -n -e 's/^: \\([[^ ]]*\\) $/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\(lib[[^ ]]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\([[^ ]]*\\)$/  {\\\"lib\\2\\\", (void *) \\&\\2},/p'\"\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $build_os in\nmingw*)\n  opt_cr=`$ECHO 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# Try without a prefix underscore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.\n  symxfrm=\"\\\\1 $ac_symprfx\\\\2 \\\\2\"\n\n  # Write the raw and C identifiers.\n  if test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n    # Fake it for dumpbin and say T for any non-static function\n    # and D for any global variable.\n    # Also find C++ and __fastcall symbols from MSVC++,\n    # which start with @ or ?.\n    lt_cv_sys_global_symbol_pipe=\"$AWK ['\"\\\n\"     {last_section=section; section=\\$ 3};\"\\\n\"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};\"\\\n\"     \\$ 0!~/External *\\|/{next};\"\\\n\"     / 0+ UNDEF /{next}; / UNDEF \\([^|]\\)*()/{next};\"\\\n\"     {if(hide[section]) next};\"\\\n\"     {f=0}; \\$ 0~/\\(\\).*\\|/{f=1}; {printf f ? \\\"T \\\" : \\\"D \\\"};\"\\\n\"     {split(\\$ 0, a, /\\||\\r/); split(a[2], s)};\"\\\n\"     s[1]~/^[@?]/{print s[1], s[1]; next};\"\\\n\"     s[1]~prfx {split(s[1],t,\\\"@\\\"); print t[1], substr(t[1],length(prfx))}\"\\\n\"     ' prfx=^$ac_symprfx]\"\n  else\n    lt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[[\t ]]\\($symcode$symcode*\\)[[\t ]][[\t ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'\"\n  fi\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n\n  rm -f conftest*\n  cat > conftest.$ac_ext <<_LT_EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(void);\nvoid nm_test_func(void){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\n_LT_EOF\n\n  if AC_TRY_EVAL(ac_compile); then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if AC_TRY_EVAL(NM conftest.$ac_objext \\| $lt_cv_sys_global_symbol_pipe \\> $nlist) && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if $GREP ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif $GREP ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<_LT_EOF > conftest.$ac_ext\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_LT_EOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_sys_global_symbol_to_cdecl\"' < \"$nlist\" | $GREP -v main >> conftest.$ac_ext'\n\n\t  cat <<_LT_EOF >> conftest.$ac_ext\n\n/* The mapping between symbol names and symbols.  */\nconst struct {\n  const char *name;\n  void       *address;\n}\nlt__PROGRAM__LTX_preloaded_symbols[[]] =\n{\n  { \"@PROGRAM@\", (void *) 0 },\n_LT_EOF\n\t  $SED \"s/^$symcode$symcode* \\(.*\\) \\(.*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/\" < \"$nlist\" | $GREP -v main >> conftest.$ac_ext\n\t  cat <<\\_LT_EOF >> conftest.$ac_ext\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt__PROGRAM__LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n_LT_EOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  lt_save_LIBS=\"$LIBS\"\n\t  lt_save_CFLAGS=\"$CFLAGS\"\n\t  LIBS=\"conftstm.$ac_objext\"\n\t  CFLAGS=\"$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)\"\n\t  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=\"$lt_save_LIBS\"\n\t  CFLAGS=\"$lt_save_CFLAGS\"\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&AS_MESSAGE_LOG_FD\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&AS_MESSAGE_LOG_FD\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&AS_MESSAGE_LOG_FD\n    fi\n  else\n    echo \"$progname: failed program was:\" >&AS_MESSAGE_LOG_FD\n    cat conftest.$ac_ext >&5\n  fi\n  rm -rf conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test \"$pipe_works\" = yes; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n])\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  lt_cv_sys_global_symbol_to_cdecl=\nfi\nif test -z \"$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl\"; then\n  AC_MSG_RESULT(failed)\nelse\n  AC_MSG_RESULT(ok)\nfi\n\n_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],\n    [Take the output of nm and produce a listing of raw symbols and C names])\n_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],\n    [Transform the output of nm in a proper C declaration])\n_LT_DECL([global_symbol_to_c_name_address],\n    [lt_cv_sys_global_symbol_to_c_name_address], [1],\n    [Transform the output of nm in a C name address pair])\n_LT_DECL([global_symbol_to_c_name_address_lib_prefix],\n    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],\n    [Transform the output of nm in a C name address pair when lib prefix is needed])\n]) # _LT_CMD_GLOBAL_SYMBOLS\n\n\n# _LT_COMPILER_PIC([TAGNAME])\n# ---------------------------\nm4_defun([_LT_COMPILER_PIC],\n[m4_require([_LT_TAG_COMPILER])dnl\n_LT_TAGVAR(lt_prog_compiler_wl, $1)=\n_LT_TAGVAR(lt_prog_compiler_pic, $1)=\n_LT_TAGVAR(lt_prog_compiler_static, $1)=\n\nAC_MSG_CHECKING([for $compiler option to produce PIC])\nm4_if([$1], [CXX], [\n  # C++ specific cases for pic, static, wl, etc.\n  if test \"$GXX\" = yes; then\n    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\n    case $host_os in\n    aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n    mingw* | cygwin* | os2* | pw32* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'\n      ;;\n    *djgpp*)\n      # DJGPP does not support shared libraries at all\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n      ;;\n    interix[[3-9]]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic\n      fi\n      ;;\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t;;\n      esac\n      ;;\n    *qnx* | *nto*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n    *)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n    esac\n  else\n    case $host_os in\n      aix[[4-9]]*)\n\t# All AIX code is PIC.\n\tif test \"$host_cpu\" = ia64; then\n\t  # AIX 5 now supports IA64 processor\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\telse\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'\n\tfi\n\t;;\n      chorus*)\n\tcase $cc_basename in\n\tcxch68*)\n\t  # Green Hills C++ Compiler\n\t  # _LT_TAGVAR(lt_prog_compiler_static, $1)=\"--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a\"\n\t  ;;\n\tesac\n\t;;\n      dgux*)\n\tcase $cc_basename in\n\t  ec++*)\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    ;;\n\t  ghcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      freebsd* | dragonfly*)\n\t# FreeBSD uses GNU C++\n\t;;\n      hpux9* | hpux10* | hpux11*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n\t    if test \"$host_cpu\" != ia64; then\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t    fi\n\t    ;;\n\t  aCC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n\t    case $host_cpu in\n\t    hppa*64*|ia64*)\n\t      # +Z the default\n\t      ;;\n\t    *)\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t      ;;\n\t    esac\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      interix*)\n\t# This is c89, which is MS Visual C++ (no shared libs)\n\t# Anyone wants to do a port?\n\t;;\n      irix5* | irix6* | nonstopux*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    # CC pic flag -KPIC is the default.\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      linux* | k*bsd*-gnu | kopensolaris*-gnu)\n\tcase $cc_basename in\n\t  KCC*)\n\t    # KAI C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t    ;;\n\t  ecpc* )\n\t    # old Intel C++ for x86_64 which still supported -KPIC.\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t    ;;\n\t  icpc* )\n\t    # Intel C++, used to be incompatible with GCC.\n\t    # ICC 10 doesn't accept -KPIC any more.\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t    ;;\n\t  pgCC* | pgcpp*)\n\t    # Portland Group C++ compiler\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    ;;\n\t  xlc* | xlC*)\n\t    # IBM XL 8.0 on PPC\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n      lynxos*)\n\t;;\n      m88k*)\n\t;;\n      mvs*)\n\tcase $cc_basename in\n\t  cxx*)\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      netbsd* | netbsdelf*-gnu)\n\t;;\n      *qnx* | *nto*)\n        # QNX uses GNU C++, but need to define -shared option too, otherwise\n        # it will coredump.\n        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n        ;;\n      osf3* | osf4* | osf5*)\n\tcase $cc_basename in\n\t  KCC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'\n\t    ;;\n\t  RCC*)\n\t    # Rational C++ 2.4.1\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  cxx*)\n\t    # Digital/Compaq C++\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      psos*)\n\t;;\n      solaris*)\n\tcase $cc_basename in\n\t  CC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t    ;;\n\t  gcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sunos4*)\n\tcase $cc_basename in\n\t  CC*)\n\t    # Sun C++ 4.x\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\t  lcc*)\n\t    # Lucid\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\tesac\n\t;;\n      tandem*)\n\tcase $cc_basename in\n\t  NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      vxworks*)\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n\t;;\n    esac\n  fi\n],\n[\n  if test \"$GCC\" = yes; then\n    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\n    case $host_os in\n      aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'\n      ;;\n\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t# +Z the default\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t;;\n      esac\n      ;;\n\n    interix[[3-9]]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n\n    msdosdjgpp*)\n      # Just because we use GCC doesn't mean we suddenly get shared libraries\n      # on systems that don't support them.\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      enable_shared=no\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic\n      fi\n      ;;\n\n    *)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n    esac\n  else\n    # PORTME Check for flag to pass linker flags through the system compiler.\n    case $host_os in\n    aix*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      else\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but\n      # not for PA HP-UX.\n      case $host_cpu in\n      hppa*64*|ia64*)\n\t# +Z the default\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t;;\n      esac\n      # Is there a better lt_prog_compiler_static that works with the bundled CC?\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # PIC (with -KPIC) is the default.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    linux* | k*bsd*-gnu | kopensolaris*-gnu)\n      case $cc_basename in\n      # old Intel for x86_64 which still supported -KPIC.\n      ecc*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n        ;;\n      # icc used to be incompatible with GCC.\n      # ICC 10 doesn't accept -KPIC any more.\n      icc* | ifort*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n        ;;\n      # Lahey Fortran 8.1.\n      lf95*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'\n\t;;\n      pgcc* | pgf77* | pgf90* | pgf95*)\n        # Portland Group compilers (*not* the Pentium gcc compiler,\n\t# which looks to be a dead project)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n        ;;\n      ccc*)\n        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n        # All Alpha code is PIC.\n        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n        ;;\n      xl*)\n\t# IBM XL C 8.0/Fortran 10.1 on PPC\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'\n\t;;\n      *)\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\n\t  # Sun C 5.9\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  ;;\n\t*Sun\\ F*)\n\t  # Sun Fortran 8.3 passes all unrecognized flags to the linker\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''\n\t  ;;\n\tesac\n\t;;\n      esac\n      ;;\n\n    newsos6)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # All OSF/1 code is PIC.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    rdos*)\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    solaris*)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      case $cc_basename in\n      f77* | f90* | f95*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;\n      esac\n      ;;\n\n    sunos4*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec ;then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    unicos*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      ;;\n\n    uts4*)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    *)\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      ;;\n    esac\n  fi\n])\ncase $host_os in\n  # For platforms which do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n    ;;\n  *)\n    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\"$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])\"\n    ;;\nesac\nAC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])\n_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],\n\t[How to pass a linker flag through the compiler])\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$_LT_TAGVAR(lt_prog_compiler_pic, $1)\"; then\n  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],\n    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],\n    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],\n    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in\n     \"\" | \" \"*) ;;\n     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=\" $_LT_TAGVAR(lt_prog_compiler_pic, $1)\" ;;\n     esac],\n    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=\n     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])\nfi\n_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],\n\t[Additional compiler flags for building library objects])\n\n#\n# Check to make sure the static flag actually works.\n#\nwl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\\\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\\\"\n_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],\n  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),\n  $lt_tmp_static_flag,\n  [],\n  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])\n_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],\n\t[Compiler flag to prevent dynamic linking])\n])# _LT_COMPILER_PIC\n\n\n# _LT_LINKER_SHLIBS([TAGNAME])\n# ----------------------------\n# See if the linker supports building shared libraries.\nm4_defun([_LT_LINKER_SHLIBS],\n[AC_REQUIRE([LT_PATH_LD])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl\nm4_require([_LT_TAG_COMPILER])dnl\nAC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])\nm4_if([$1], [CXX], [\n  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  case $host_os in\n  aix[[4-9]]*)\n    # If we're using GNU nm, then we don't want the \"-C\" option.\n    # -C means demangle to AIX nm, but means don't demangle with GNU nm\n    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    else\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    fi\n    ;;\n  pw32*)\n    _LT_TAGVAR(export_symbols_cmds, $1)=\"$ltdll_cmds\"\n  ;;\n  cygwin* | mingw* | cegcc*)\n    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\\([[^ ]]*\\)[[ ]][[^ ]]*/\\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\\'' | sort | uniq > $export_symbols'\n  ;;\n  linux* | k*bsd*-gnu)\n    _LT_TAGVAR(link_all_deplibs, $1)=no\n  ;;\n  *)\n    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  ;;\n  esac\n  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']\n], [\n  runpath_var=\n  _LT_TAGVAR(allow_undefined_flag, $1)=\n  _LT_TAGVAR(always_export_symbols, $1)=no\n  _LT_TAGVAR(archive_cmds, $1)=\n  _LT_TAGVAR(archive_expsym_cmds, $1)=\n  _LT_TAGVAR(compiler_needs_object, $1)=no\n  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n  _LT_TAGVAR(export_dynamic_flag_spec, $1)=\n  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  _LT_TAGVAR(hardcode_automatic, $1)=no\n  _LT_TAGVAR(hardcode_direct, $1)=no\n  _LT_TAGVAR(hardcode_direct_absolute, $1)=no\n  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=\n  _LT_TAGVAR(hardcode_libdir_separator, $1)=\n  _LT_TAGVAR(hardcode_minus_L, $1)=no\n  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n  _LT_TAGVAR(inherit_rpath, $1)=no\n  _LT_TAGVAR(link_all_deplibs, $1)=unknown\n  _LT_TAGVAR(module_cmds, $1)=\n  _LT_TAGVAR(module_expsym_cmds, $1)=\n  _LT_TAGVAR(old_archive_from_new_cmds, $1)=\n  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=\n  _LT_TAGVAR(thread_safe_flag_spec, $1)=\n  _LT_TAGVAR(whole_archive_flag_spec, $1)=\n  # include_expsyms should be a list of space-separated symbols to be *always*\n  # included in the symbol list\n  _LT_TAGVAR(include_expsyms, $1)=\n  # exclude_expsyms can be an extended regexp of symbols to exclude\n  # it will be wrapped by ` (' and `)$', so one must not match beginning or\n  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',\n  # as well as any symbol that contains `d'.\n  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']\n  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n  # platforms (ab)use it in PIC code, but their linkers get confused if\n  # the symbol is explicitly referenced.  Since portable code cannot\n  # rely on this symbol name, it's probably fine to never include it in\n  # preloaded symbol tables.\n  # Exclude shared library initialization/finalization symbols.\ndnl Note also adjust exclude_expsyms for C++ above.\n  extract_expsyms_cmds=\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    # FIXME: the MSVC++ port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    if test \"$GCC\" != yes; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++)\n    with_gnu_ld=yes\n    ;;\n  openbsd*)\n    with_gnu_ld=no\n    ;;\n  linux* | k*bsd*-gnu)\n    _LT_TAGVAR(link_all_deplibs, $1)=no\n    ;;\n  esac\n\n  _LT_TAGVAR(ld_shlibs, $1)=yes\n  if test \"$with_gnu_ld\" = yes; then\n    # If archive_cmds runs LD, not CC, wlarc should be empty\n    wlarc='${wl}'\n\n    # Set some defaults for GNU ld with shared library support. These\n    # are reset later if shared libraries are not supported. Putting them\n    # here allows them to be overridden if necessary.\n    runpath_var=LD_RUN_PATH\n    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n    # ancient GNU ld didn't support --whole-archive et. al.\n    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n    else\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\n    fi\n    supports_anon_versioning=no\n    case `$LD -v 2>&1` in\n      *GNU\\ gold*) supports_anon_versioning=yes ;;\n      *\\ [[01]].* | *\\ 2.[[0-9]].* | *\\ 2.10.*) ;; # catch versions < 2.11\n      *\\ 2.11.93.0.2\\ *) supports_anon_versioning=yes ;; # RH7.3 ...\n      *\\ 2.11.92.0.12\\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...\n      *\\ 2.11.*) ;; # other 2.11 versions\n      *) supports_anon_versioning=yes ;;\n    esac\n\n    # See if GNU ld supports shared libraries.\n    case $host_os in\n    aix[[3-9]]*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test \"$host_cpu\" != ia64; then\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.9.1, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to modify your PATH\n*** so that a non-GNU linker is found, and then restart.\n\n_LT_EOF\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            _LT_TAGVAR(archive_expsym_cmds, $1)=''\n        ;;\n      m68k)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes\n        ;;\n      esac\n      ;;\n\n    beos*)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t# Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t# support --undefined.  This deserves some investigation.  FIXME\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,\n      # as there is no search path for DLLs.\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(always_export_symbols, $1)=no\n      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1 DATA/'\\'' | $SED -e '\\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\\'' | sort | uniq > $export_symbols'\n\n      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t# If the export-symbols file already is a .def file (1st line\n\t# is EXPORTS), use it as is; otherwise, prepend...\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t  cp $export_symbols $output_objdir/$soname.def;\n\telse\n\t  echo EXPORTS > $output_objdir/$soname.def;\n\t  cat $export_symbols >> $output_objdir/$soname.def;\n\tfi~\n\t$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    interix[[3-9]]*)\n      _LT_TAGVAR(hardcode_direct, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n      # Instead, shared libraries are loaded at an image base (0x10000000 by\n      # default) and relocated if they conflict, which is a slow very memory\n      # consuming and fragmenting process.  To avoid this, we pick a random,\n      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      _LT_TAGVAR(archive_expsym_cmds, $1)='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      ;;\n\n    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)\n      tmp_diet=no\n      if test \"$host_os\" = linux-dietlibc; then\n\tcase $cc_basename in\n\t  diet\\ *) tmp_diet=yes;;\t# linux-dietlibc with static linking (!diet-dyn)\n\tesac\n      fi\n      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \\\n\t && test \"$tmp_diet\" = no\n      then\n\ttmp_addflag=\n\ttmp_sharedflag='-shared'\n\tcase $cc_basename,$host_cpu in\n        pgcc*)\t\t\t\t# Portland Group C compiler\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag'\n\t  ;;\n\tpgf77* | pgf90* | pgf95*)\t# Portland Group f77 and f90 compilers\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag -Mnomain' ;;\n\tecc*,ia64* | icc*,ia64*)\t# Intel C compiler on ia64\n\t  tmp_addflag=' -i_dynamic' ;;\n\tefc*,ia64* | ifort*,ia64*)\t# Intel Fortran compiler on ia64\n\t  tmp_addflag=' -i_dynamic -nofor_main' ;;\n\tifc* | ifort*)\t\t\t# Intel Fortran compiler\n\t  tmp_addflag=' -nofor_main' ;;\n\tlf95*)\t\t\t\t# Lahey Fortran 8.1\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)=\n\t  tmp_sharedflag='--shared' ;;\n\txl[[cC]]*)\t\t\t# IBM XL C 8.0 on PPC (deal with xlf below)\n\t  tmp_sharedflag='-qmkshrobj'\n\t  tmp_addflag= ;;\n\tesac\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\t\t\t# Sun C 5.9\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  _LT_TAGVAR(compiler_needs_object, $1)=yes\n\t  tmp_sharedflag='-G' ;;\n\t*Sun\\ F*)\t\t\t# Sun Fortran 8.3\n\t  tmp_sharedflag='-G' ;;\n\tesac\n\t_LT_TAGVAR(archive_cmds, $1)='$CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\n        if test \"x$supports_anon_versioning\" = xyes; then\n          _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t    cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t    echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t    $CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n        fi\n\n\tcase $cc_basename in\n\txlf*)\n\t  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'\n\t  if test \"x$supports_anon_versioning\" = xyes; then\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t      cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t      echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'\n\t  fi\n\t  ;;\n\tesac\n      else\n        _LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n\twlarc=\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      fi\n      ;;\n\n    solaris*)\n      if $LD -v 2>&1 | $GREP 'BFD 2\\.8' > /dev/null; then\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [[01]].* | *\\ 2.[[0-9]].* | *\\ 2.1[[0-5]].*)\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not\n*** reliably create shared libraries on SCO systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n\t;;\n\t*)\n\t  # For security reasons, it is highly recommended that you always\n\t  # use absolute paths for naming shared libraries, and exclude the\n\t  # DT_RUNPATH tag from executables and libraries.  But doing so\n\t  # requires that you compile everything twice, which is a pain.\n\t  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t  else\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t  fi\n\t;;\n      esac\n      ;;\n\n    sunos4*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      wlarc=\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n    esac\n\n    if test \"$_LT_TAGVAR(ld_shlibs, $1)\" = no; then\n      runpath_var=\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)=\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\n    fi\n  else\n    # PORTME fill in a description of your system's linker (not GNU ld)\n    case $host_os in\n    aix3*)\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(always_export_symbols, $1)=yes\n      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      if test \"$GCC\" = yes && test -z \"$lt_prog_compiler_static\"; then\n\t# Neither direct hardcoding nor static linking is supported with a\n\t# broken collect2.\n\t_LT_TAGVAR(hardcode_direct, $1)=unsupported\n      fi\n      ;;\n\n    aix[[4-9]]*)\n      if test \"$host_cpu\" = ia64; then\n\t# On IA64, the linker does run time linking by default, so we don't\n\t# have to do anything special.\n\taix_use_runtimelinking=no\n\texp_sym_flag='-Bexport'\n\tno_entry_flag=\"\"\n      else\n\t# If we're using GNU nm, then we don't want the \"-C\" option.\n\t# -C means demangle to AIX nm, but means don't demangle with GNU nm\n\tif $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n\t  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\telse\n\t  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\tfi\n\taix_use_runtimelinking=no\n\n\t# Test if we are trying to use run time linking or normal\n\t# AIX style linking. If -brtl is somewhere in LDFLAGS, we\n\t# need to do runtime linking.\n\tcase $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)\n\t  for ld_flag in $LDFLAGS; do\n\t  if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\t  done\n\t  ;;\n\tesac\n\n\texp_sym_flag='-bexport'\n\tno_entry_flag='-bnoentry'\n      fi\n\n      # When large executables or shared objects are built, AIX ld can\n      # have problems creating the table of contents.  If linking a library\n      # or program results in \"error TOC overflow\" add -mminimal-toc to\n      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n      _LT_TAGVAR(archive_cmds, $1)=''\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'\n\n      if test \"$GCC\" = yes; then\n\tcase $host_os in aix4.[[012]]|aix4.[[012]].*)\n\t# We only want to do this on AIX 4.2 and lower, the check\n\t# below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t   strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t  # We have reworked collect2\n\t  :\n\t  else\n\t  # We have old collect2\n\t  _LT_TAGVAR(hardcode_direct, $1)=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t  _LT_TAGVAR(hardcode_libdir_separator, $1)=\n\t  fi\n\t  ;;\n\tesac\n\tshared_flag='-shared'\n\tif test \"$aix_use_runtimelinking\" = yes; then\n\t  shared_flag=\"$shared_flag \"'${wl}-G'\n\tfi\n\t_LT_TAGVAR(link_all_deplibs, $1)=no\n      else\n\t# not using gcc\n\tif test \"$host_cpu\" = ia64; then\n\t# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t# chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n\telse\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag='${wl}-G'\n\t  else\n\t    shared_flag='${wl}-bM:SRE'\n\t  fi\n\tfi\n      fi\n\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'\n      # It seems that -bexpall does not export symbols beginning with\n      # underscore (_), so it is better to generate a list of symbols to export.\n      _LT_TAGVAR(always_export_symbols, $1)=yes\n      if test \"$aix_use_runtimelinking\" = yes; then\n\t# Warning - without using the other runtime loading flags (-brtl),\n\t# -berok will link without error, but may produce a broken library.\n\t_LT_TAGVAR(allow_undefined_flag, $1)='-berok'\n        # Determine the default libpath from the value encoded in an\n        # empty executable.\n        _LT_SYS_MODULE_PATH_AIX\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then $ECHO \"X${wl}${allow_undefined_flag}\" | $Xsed; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n      else\n\tif test \"$host_cpu\" = ia64; then\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=\"-z nodefs\"\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n\telse\n\t # Determine the default libpath from the value encoded in an\n\t # empty executable.\n\t _LT_SYS_MODULE_PATH_AIX\n\t _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t  # Warning - without using the other run time loading flags,\n\t  # -berok will link without error, but may produce a broken library.\n\t  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'\n\t  # Exported symbols can be pulled into shared objects from archives\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'\n\t  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t  # This is similar to how AIX traditionally builds its shared libraries.\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n\tfi\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            _LT_TAGVAR(archive_expsym_cmds, $1)=''\n        ;;\n      m68k)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes\n        ;;\n      esac\n      ;;\n\n    bsdi[[45]]*)\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      # Tell ltmain to make .lib files, not .a files.\n      libext=lib\n      # Tell ltmain to make .dll files, not .so files.\n      shrext_cmds=\".dll\"\n      # FIXME: Setting linknames here is a bad hack.\n      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO \"X$deplibs\" | $Xsed -e '\\''s/ -lc$//'\\''` -link -dll~linknames='\n      # The linker will automatically build a .lib file if we build a DLL.\n      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n      # FIXME: Should let the user specify the lib program.\n      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'\n      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w \"$srcfile\"`'\n      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n      ;;\n\n    darwin* | rhapsody*)\n      _LT_DARWIN_LINKER_FEATURES($1)\n      ;;\n\n    dgux*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    freebsd1*)\n      _LT_TAGVAR(ld_shlibs, $1)=no\n      ;;\n\n    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n    # support.  Future versions do this automatically, but an explicit c++rt0.o\n    # does not break anything, and helps significantly (at the cost of a little\n    # extra space).\n    freebsd2.2*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n    freebsd2*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n    freebsd* | dragonfly*)\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    hpux9*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n      ;;\n\n    hpux10*)\n      if test \"$GCC\" = yes -a \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\t_LT_TAGVAR(hardcode_direct, $1)=yes\n\t_LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t# hardcode_minus_L: Not really in the search PATH,\n\t# but as the default location of the library.\n\t_LT_TAGVAR(hardcode_minus_L, $1)=yes\n      fi\n      ;;\n\n    hpux11*)\n      if test \"$GCC\" = yes -a \"$with_gnu_ld\" = no; then\n\tcase $host_cpu in\n\thppa*64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      else\n\tcase $host_cpu in\n\thppa*64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\tcase $host_cpu in\n\thppa*64*|ia64*)\n\t  _LT_TAGVAR(hardcode_direct, $1)=no\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\n\t  # hardcode_minus_L: Not really in the search PATH,\n\t  # but as the default location of the library.\n\t  _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t  ;;\n\tesac\n      fi\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t# Try to use the -exported_symbol ld option, if it does not\n\t# work, assume that -exports_file does not work either and\n\t# implicitly export all symbols.\n        save_LDFLAGS=\"$LDFLAGS\"\n        LDFLAGS=\"$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null\"\n        AC_LINK_IFELSE(int foo(void) {},\n          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'\n        )\n        LDFLAGS=\"$save_LDFLAGS\"\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(inherit_rpath, $1)=yes\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    newsos6)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *nto* | *qnx*)\n      ;;\n\n    openbsd*)\n      if test -f /usr/libexec/ld.so; then\n\t_LT_TAGVAR(hardcode_direct, $1)=yes\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\tif test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\telse\n\t  case $host_os in\n\t   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)\n\t     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n\t     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t     ;;\n\t   *)\n\t     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t     ;;\n\t  esac\n\tfi\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    os2*)\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(archive_cmds, $1)='$ECHO \"LIBRARY $libname INITINSTANCE\" > $output_objdir/$libname.def~$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO \" SINGLE NONSHARED\" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'\n      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'\n      ;;\n\n    osf3*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n      else\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      ;;\n\n    osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      else\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done; printf \"%s\\\\n\" \"-hidden\">> $lib.exp~\n\t$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'\n\n\t# Both c and cxx compiler support -rpath directly\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      ;;\n\n    solaris*)\n      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'\n      if test \"$GCC\" = yes; then\n\twlarc='${wl}'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n      else\n\tcase `$CC -V 2>&1` in\n\t*\"Compilers 5.0\"*)\n\t  wlarc=''\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'\n\t  ;;\n\t*)\n\t  wlarc='${wl}'\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n\t  ;;\n\tesac\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      case $host_os in\n      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n      *)\n\t# The compiler driver will combine and reorder linker options,\n\t# but understands `-z linker_flag'.  GCC discards it without `$wl',\n\t# but is careful enough not to reorder.\n\t# Supported since Solaris 2.6 (maybe 2.5.1?)\n\tif test \"$GCC\" = yes; then\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\telse\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'\n\tfi\n\t;;\n      esac\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    sunos4*)\n      if test \"x$host_vendor\" = xsequent; then\n\t# Use $CC to link under sequent, because it throws in some extra .o\n\t# files that make .init and .fini sections work.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    sysv4)\n      case $host_vendor in\n\tsni)\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???\n\t;;\n\tsiemens)\n\t  ## LD is ld it makes a PLAMLIB\n\t  ## CC just makes a GrossModule.\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'\n\t  _LT_TAGVAR(hardcode_direct, $1)=no\n        ;;\n\tmotorola)\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie\n\t;;\n      esac\n      runpath_var='LD_RUN_PATH'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    sysv4.3*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\trunpath_var=LD_RUN_PATH\n\thardcode_runpath_var=yes\n\t_LT_TAGVAR(ld_shlibs, $1)=yes\n      fi\n      ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6*)\n      # Note: We can NOT use -z defs as we might desire, because we do not\n      # link with -lc, and that would cause any symbols used from libc to\n      # always be unresolved, which means just about no library would\n      # ever link correctly.  If we're not using GNU ld we use -z text\n      # though, which does catch some bad symbols but isn't as heavy-handed\n      # as -z defs.\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    uts4*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *)\n      _LT_TAGVAR(ld_shlibs, $1)=no\n      ;;\n    esac\n\n    if test x$host_vendor = xsni; then\n      case $host in\n      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'\n\t;;\n      esac\n    fi\n  fi\n])\nAC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])\ntest \"$_LT_TAGVAR(ld_shlibs, $1)\" = no && can_build_shared=no\n\n_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld\n\n_LT_DECL([], [libext], [0], [Old archive suffix (normally \"a\")])dnl\n_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally \".so\")])dnl\n_LT_DECL([], [extract_expsyms_cmds], [2],\n    [The commands to extract the exported symbol list from a shared archive])\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$_LT_TAGVAR(archive_cmds_need_lc, $1)\" in\nx|xyes)\n  # Assume -lc should be added\n  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\n  if test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n    case $_LT_TAGVAR(archive_cmds, $1) in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      AC_MSG_CHECKING([whether -lc should be explicitly linked in])\n      $RM conftest*\n      echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then\n        soname=conftest\n        lib=conftest\n        libobjs=conftest.$ac_objext\n        deplibs=\n        wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)\n\tpic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)\n        compiler_flags=-v\n        linker_flags=-v\n        verstring=\n        output_objdir=.\n        libname=conftest\n        lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)\n        _LT_TAGVAR(allow_undefined_flag, $1)=\n        if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1)\n        then\n\t  _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n        else\n\t  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n        fi\n        _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag\n      else\n        cat conftest.err 1>&5\n      fi\n      $RM conftest*\n      AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)])\n      ;;\n    esac\n  fi\n  ;;\nesac\n\n_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],\n    [Whether or not to add -lc for building shared libraries])\n_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],\n    [enable_shared_with_static_runtimes], [0],\n    [Whether or not to disallow shared libs when runtime libs are static])\n_LT_TAGDECL([], [export_dynamic_flag_spec], [1],\n    [Compiler flag to allow reflexive dlopens])\n_LT_TAGDECL([], [whole_archive_flag_spec], [1],\n    [Compiler flag to generate shared objects directly from archives])\n_LT_TAGDECL([], [compiler_needs_object], [1],\n    [Whether the compiler copes with passing no objects directly])\n_LT_TAGDECL([], [old_archive_from_new_cmds], [2],\n    [Create an old-style archive from a shared archive])\n_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],\n    [Create a temporary old-style archive to link instead of a shared archive])\n_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])\n_LT_TAGDECL([], [archive_expsym_cmds], [2])\n_LT_TAGDECL([], [module_cmds], [2],\n    [Commands used to build a loadable module if different from building\n    a shared archive.])\n_LT_TAGDECL([], [module_expsym_cmds], [2])\n_LT_TAGDECL([], [with_gnu_ld], [1],\n    [Whether we are building with GNU ld or not])\n_LT_TAGDECL([], [allow_undefined_flag], [1],\n    [Flag that allows shared libraries with undefined symbols to be built])\n_LT_TAGDECL([], [no_undefined_flag], [1],\n    [Flag that enforces no undefined symbols])\n_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],\n    [Flag to hardcode $libdir into a binary during linking.\n    This must work even if $libdir does not exist])\n_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],\n    [[If ld is used when linking, flag to hardcode $libdir into a binary\n    during linking.  This must work even if $libdir does not exist]])\n_LT_TAGDECL([], [hardcode_libdir_separator], [1],\n    [Whether we need a single \"-rpath\" flag with a separated argument])\n_LT_TAGDECL([], [hardcode_direct], [0],\n    [Set to \"yes\" if using DIR/libNAME${shared_ext} during linking hardcodes\n    DIR into the resulting binary])\n_LT_TAGDECL([], [hardcode_direct_absolute], [0],\n    [Set to \"yes\" if using DIR/libNAME${shared_ext} during linking hardcodes\n    DIR into the resulting binary and the resulting library dependency is\n    \"absolute\", i.e impossible to change by setting ${shlibpath_var} if the\n    library is relocated])\n_LT_TAGDECL([], [hardcode_minus_L], [0],\n    [Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n    into the resulting binary])\n_LT_TAGDECL([], [hardcode_shlibpath_var], [0],\n    [Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n    into the resulting binary])\n_LT_TAGDECL([], [hardcode_automatic], [0],\n    [Set to \"yes\" if building a shared library automatically hardcodes DIR\n    into the library and all subsequent libraries and executables linked\n    against it])\n_LT_TAGDECL([], [inherit_rpath], [0],\n    [Set to yes if linker adds runtime paths of dependent libraries\n    to runtime path list])\n_LT_TAGDECL([], [link_all_deplibs], [0],\n    [Whether libtool must link a program against all its dependency libraries])\n_LT_TAGDECL([], [fix_srcfile_path], [1],\n    [Fix the shell variable $srcfile for the compiler])\n_LT_TAGDECL([], [always_export_symbols], [0],\n    [Set to \"yes\" if exported symbols are required])\n_LT_TAGDECL([], [export_symbols_cmds], [2],\n    [The commands to list exported symbols])\n_LT_TAGDECL([], [exclude_expsyms], [1],\n    [Symbols that should not be listed in the preloaded symbols])\n_LT_TAGDECL([], [include_expsyms], [1],\n    [Symbols that must always be exported])\n_LT_TAGDECL([], [prelink_cmds], [2],\n    [Commands necessary for linking programs (against libraries) with templates])\n_LT_TAGDECL([], [file_list_spec], [1],\n    [Specify filename containing input files])\ndnl FIXME: Not yet implemented\ndnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],\ndnl    [Compiler flag to generate thread safe objects])\n])# _LT_LINKER_SHLIBS\n\n\n# _LT_LANG_C_CONFIG([TAG])\n# ------------------------\n# Ensure that the configuration variables for a C compiler are suitably\n# defined.  These variables are subsequently used by _LT_CONFIG to write\n# the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_C_CONFIG],\n[m4_require([_LT_DECL_EGREP])dnl\nlt_save_CC=\"$CC\"\nAC_LANG_PUSH(C)\n\n# Source file extension for C test sources.\nac_ext=c\n\n# Object file extension for compiled C test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"int some_variable = 0;\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='int main(){return(0);}'\n\n_LT_TAG_COMPILER\n# Save the default compiler, since it gets overwritten when the other\n# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.\ncompiler_DEFAULT=$CC\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_SYS_DYNAMIC_LINKER($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n  LT_SYS_DLOPEN_SELF\n  _LT_CMD_STRIPLIB\n\n  # Report which library types will actually be built\n  AC_MSG_CHECKING([if libtool supports shared libraries])\n  AC_MSG_RESULT([$can_build_shared])\n\n  AC_MSG_CHECKING([whether to build shared libraries])\n  test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n  # On AIX, shared libraries and static libraries use the same namespace, and\n  # are all built from PIC.\n  case $host_os in\n  aix3*)\n    test \"$enable_shared\" = yes && enable_static=no\n    if test -n \"$RANLIB\"; then\n      archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n      postinstall_cmds='$RANLIB $lib'\n    fi\n    ;;\n\n  aix[[4-9]]*)\n    if test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n      test \"$enable_shared\" = yes && enable_static=no\n    fi\n    ;;\n  esac\n  AC_MSG_RESULT([$enable_shared])\n\n  AC_MSG_CHECKING([whether to build static libraries])\n  # Make sure either enable_shared or enable_static is yes.\n  test \"$enable_shared\" = yes || enable_static=yes\n  AC_MSG_RESULT([$enable_static])\n\n  _LT_CONFIG($1)\nfi\nAC_LANG_POP\nCC=\"$lt_save_CC\"\n])# _LT_LANG_C_CONFIG\n\n\n# _LT_PROG_CXX\n# ------------\n# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++\n# compiler, we have our own version here.\nm4_defun([_LT_PROG_CXX],\n[\npushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])\nAC_PROG_CXX\nif test -n \"$CXX\" && ( test \"X$CXX\" != \"Xno\" &&\n    ( (test \"X$CXX\" = \"Xg++\" && `g++ -v >/dev/null 2>&1` ) ||\n    (test \"X$CXX\" != \"Xg++\"))) ; then\n  AC_PROG_CXXCPP\nelse\n  _lt_caught_CXX_error=yes\nfi\npopdef([AC_MSG_ERROR])\n])# _LT_PROG_CXX\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([_LT_PROG_CXX], [])\n\n\n# _LT_LANG_CXX_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for a C++ compiler are suitably\n# defined.  These variables are subsequently used by _LT_CONFIG to write\n# the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_CXX_CONFIG],\n[AC_REQUIRE([_LT_PROG_CXX])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_EGREP])dnl\n\nAC_LANG_PUSH(C++)\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(compiler_needs_object, $1)=no\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for C++ test sources.\nac_ext=cpp\n\n# Object file extension for compiled C++ test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the CXX compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_caught_CXX_error\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"int some_variable = 0;\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=$CC\n  lt_save_LD=$LD\n  lt_save_GCC=$GCC\n  GCC=$GXX\n  lt_save_with_gnu_ld=$with_gnu_ld\n  lt_save_path_LD=$lt_cv_path_LD\n  if test -n \"${lt_cv_prog_gnu_ldcxx+set}\"; then\n    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx\n  else\n    $as_unset lt_cv_prog_gnu_ld\n  fi\n  if test -n \"${lt_cv_path_LDCXX+set}\"; then\n    lt_cv_path_LD=$lt_cv_path_LDCXX\n  else\n    $as_unset lt_cv_path_LD\n  fi\n  test -z \"${LDCXX+set}\" || LD=$LDCXX\n  CC=${CXX-\"c++\"}\n  compiler=$CC\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n\n  if test -n \"$compiler\"; then\n    # We don't want -fno-exception when compiling C++ code, so set the\n    # no_builtin_flag separately\n    if test \"$GXX\" = yes; then\n      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'\n    else\n      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\n    fi\n\n    if test \"$GXX\" = yes; then\n      # Set up default GNU C++ configuration\n\n      LT_PATH_LD\n\n      # Check if GNU C++ uses GNU ld as the underlying linker, since the\n      # archiving commands below assume that GNU ld is being used.\n      if test \"$with_gnu_ld\" = yes; then\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\n        # If archive_cmds runs LD, not CC, wlarc should be empty\n        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to\n        #     investigate it a little bit more. (MM)\n        wlarc='${wl}'\n\n        # ancient GNU ld didn't support --whole-archive et. al.\n        if eval \"`$CC -print-prog-name=ld` --help 2>&1\" |\n\t  $GREP 'no-whole-archive' > /dev/null; then\n          _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n        else\n          _LT_TAGVAR(whole_archive_flag_spec, $1)=\n        fi\n      else\n        with_gnu_ld=no\n        wlarc=\n\n        # A generic and very simple default shared library creation\n        # command for GNU C++ for the case where it uses the native\n        # linker, instead of GNU ld.  If possible, this setting should\n        # overridden to take advantage of the native linker features on\n        # the platform it is being used on.\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n      fi\n\n      # Commands to make compiler produce verbose output that lists\n      # what \"hidden\" libraries, object files and flags are used when\n      # linking a shared library.\n      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"\\-L\"'\n\n    else\n      GXX=no\n      with_gnu_ld=no\n      wlarc=\n    fi\n\n    # PORTME: fill in a description of your system's C++ link characteristics\n    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])\n    _LT_TAGVAR(ld_shlibs, $1)=yes\n    case $host_os in\n      aix3*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n      aix[[4-9]]*)\n        if test \"$host_cpu\" = ia64; then\n          # On IA64, the linker does run time linking by default, so we don't\n          # have to do anything special.\n          aix_use_runtimelinking=no\n          exp_sym_flag='-Bexport'\n          no_entry_flag=\"\"\n        else\n          aix_use_runtimelinking=no\n\n          # Test if we are trying to use run time linking or normal\n          # AIX style linking. If -brtl is somewhere in LDFLAGS, we\n          # need to do runtime linking.\n          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)\n\t    for ld_flag in $LDFLAGS; do\n\t      case $ld_flag in\n\t      *-brtl*)\n\t        aix_use_runtimelinking=yes\n\t        break\n\t        ;;\n\t      esac\n\t    done\n\t    ;;\n          esac\n\n          exp_sym_flag='-bexport'\n          no_entry_flag='-bnoentry'\n        fi\n\n        # When large executables or shared objects are built, AIX ld can\n        # have problems creating the table of contents.  If linking a library\n        # or program results in \"error TOC overflow\" add -mminimal-toc to\n        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n        _LT_TAGVAR(archive_cmds, $1)=''\n        _LT_TAGVAR(hardcode_direct, $1)=yes\n        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n        _LT_TAGVAR(link_all_deplibs, $1)=yes\n        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'\n\n        if test \"$GXX\" = yes; then\n          case $host_os in aix4.[[012]]|aix4.[[012]].*)\n          # We only want to do this on AIX 4.2 and lower, the check\n          # below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t     strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t    # We have reworked collect2\n\t    :\n\t  else\n\t    # We have old collect2\n\t    _LT_TAGVAR(hardcode_direct, $1)=unsupported\n\t    # It fails to find uninstalled libraries when the uninstalled\n\t    # path is not listed in the libpath.  Setting hardcode_minus_L\n\t    # to unsupported forces relinking\n\t    _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=\n\t  fi\n          esac\n          shared_flag='-shared'\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag=\"$shared_flag \"'${wl}-G'\n\t  fi\n        else\n          # not using gcc\n          if test \"$host_cpu\" = ia64; then\n\t  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t  # chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n          else\n\t    if test \"$aix_use_runtimelinking\" = yes; then\n\t      shared_flag='${wl}-G'\n\t    else\n\t      shared_flag='${wl}-bM:SRE'\n\t    fi\n          fi\n        fi\n\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'\n        # It seems that -bexpall does not export symbols beginning with\n        # underscore (_), so it is better to generate a list of symbols to\n\t# export.\n        _LT_TAGVAR(always_export_symbols, $1)=yes\n        if test \"$aix_use_runtimelinking\" = yes; then\n          # Warning - without using the other runtime loading flags (-brtl),\n          # -berok will link without error, but may produce a broken library.\n          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'\n          # Determine the default libpath from the value encoded in an empty\n          # executable.\n          _LT_SYS_MODULE_PATH_AIX\n          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\n          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then $ECHO \"X${wl}${allow_undefined_flag}\" | $Xsed; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n        else\n          if test \"$host_cpu\" = ia64; then\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'\n\t    _LT_TAGVAR(allow_undefined_flag, $1)=\"-z nodefs\"\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n          else\n\t    # Determine the default libpath from the value encoded in an\n\t    # empty executable.\n\t    _LT_SYS_MODULE_PATH_AIX\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t    # Warning - without using the other run time loading flags,\n\t    # -berok will link without error, but may produce a broken library.\n\t    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'\n\t    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'\n\t    # Exported symbols can be pulled into shared objects from archives\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'\n\t    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t    # This is similar to how AIX traditionally builds its shared\n\t    # libraries.\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n          fi\n        fi\n        ;;\n\n      beos*)\n\tif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t  # support --undefined.  This deserves some investigation.  FIXME\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\telse\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\tfi\n\t;;\n\n      chorus*)\n        case $cc_basename in\n          *)\n\t  # FIXME: insert proper C++ library support\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\t  ;;\n        esac\n        ;;\n\n      cygwin* | mingw* | pw32* | cegcc*)\n        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,\n        # as there is no search path for DLLs.\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n        _LT_TAGVAR(always_export_symbols, $1)=no\n        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\n        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n          # If the export-symbols file already is a .def file (1st line\n          # is EXPORTS), use it as is; otherwise, prepend...\n          _LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t    cp $export_symbols $output_objdir/$soname.def;\n          else\n\t    echo EXPORTS > $output_objdir/$soname.def;\n\t    cat $export_symbols >> $output_objdir/$soname.def;\n          fi~\n          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n        else\n          _LT_TAGVAR(ld_shlibs, $1)=no\n        fi\n        ;;\n      darwin* | rhapsody*)\n        _LT_DARWIN_LINKER_FEATURES($1)\n\t;;\n\n      dgux*)\n        case $cc_basename in\n          ec++*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          ghcx*)\n\t    # Green Hills C++ Compiler\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      freebsd[[12]]*)\n        # C++ shared libraries reported to be fairly broken before\n\t# switch to ELF\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      freebsd-elf*)\n        _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n        ;;\n\n      freebsd* | dragonfly*)\n        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF\n        # conventions\n        _LT_TAGVAR(ld_shlibs, $1)=yes\n        ;;\n\n      gnu*)\n        ;;\n\n      hpux9*)\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n        _LT_TAGVAR(hardcode_direct, $1)=yes\n        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,\n\t\t\t\t             # but as the default\n\t\t\t\t             # location of the library.\n\n        case $cc_basename in\n          CC*)\n            # FIXME: insert proper C++ library support\n            _LT_TAGVAR(ld_shlibs, $1)=no\n            ;;\n          aCC*)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            # Commands to make compiler produce verbose output that lists\n            # what \"hidden\" libraries, object files and flags are used when\n            # linking a shared library.\n            #\n            # There doesn't appear to be a way to prevent this compiler from\n            # explicitly linking system object files so we need to strip them\n            # from the output so that they don't get included in the library\n            # dependencies.\n            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n            ;;\n          *)\n            if test \"$GXX\" = yes; then\n              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            else\n              # FIXME: insert proper C++ library support\n              _LT_TAGVAR(ld_shlibs, $1)=no\n            fi\n            ;;\n        esac\n        ;;\n\n      hpux10*|hpux11*)\n        if test $with_gnu_ld = no; then\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t  _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n          case $host_cpu in\n            hppa*64*|ia64*)\n              ;;\n            *)\n\t      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n              ;;\n          esac\n        fi\n        case $host_cpu in\n          hppa*64*|ia64*)\n            _LT_TAGVAR(hardcode_direct, $1)=no\n            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n            ;;\n          *)\n            _LT_TAGVAR(hardcode_direct, $1)=yes\n            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,\n\t\t\t\t\t         # but as the default\n\t\t\t\t\t         # location of the library.\n            ;;\n        esac\n\n        case $cc_basename in\n          CC*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          aCC*)\n\t    case $host_cpu in\n\t      hppa*64*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      ia64*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      *)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t    esac\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test $with_gnu_ld = no; then\n\t        case $host_cpu in\n\t          hppa*64*)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          ia64*)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          *)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t        esac\n\t      fi\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      _LT_TAGVAR(ld_shlibs, $1)=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      interix[[3-9]]*)\n\t_LT_TAGVAR(hardcode_direct, $1)=no\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n\t# Instead, shared libraries are loaded at an image base (0x10000000 by\n\t# default) and relocated if they conflict, which is a slow very memory\n\t# consuming and fragmenting process.  To avoid this, we pick a random,\n\t# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n\t# time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t;;\n      irix5* | irix6*)\n        case $cc_basename in\n          CC*)\n\t    # SGI C++\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -ar\", where \"CC\" is the IRIX C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test \"$with_gnu_ld\" = no; then\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t      else\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` -o $lib'\n\t      fi\n\t    fi\n\t    _LT_TAGVAR(link_all_deplibs, $1)=yes\n\t    ;;\n        esac\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n        _LT_TAGVAR(inherit_rpath, $1)=yes\n        ;;\n\n      linux* | k*bsd*-gnu | kopensolaris*-gnu)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib ${wl}-retain-symbols-file,$export_symbols; mv \\$templib $lib'\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP \"ld\"`; rm -f libconftest$shared_ext; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -Bstatic\", where \"CC\" is the KAI C++ compiler.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'\n\t    ;;\n\t  icpc* | ecpc* )\n\t    # Intel C++\n\t    with_gnu_ld=yes\n\t    # version 8.0 and above of icpc choke on multiply defined symbols\n\t    # if we add $predep_objects and $postdep_objects, however 7.1 and\n\t    # earlier do not add the objects themselves.\n\t    case `$CC -V 2>&1` in\n\t      *\"Version 7.\"*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t      *)  # Version 8.0 or newer\n\t        tmp_idyn=\n\t        case $host_cpu in\n\t\t  ia64*) tmp_idyn=' -i_dynamic';;\n\t\tesac\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t    esac\n\t    _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t    ;;\n          pgCC* | pgcpp*)\n            # Portland Group C++ compiler\n\t    case `$CC -V` in\n\t    *pgCC\\ [[1-5]]* | *pgcpp\\ [[1-5]]*)\n\t      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~\n\t\tcompile_command=\"$compile_command `find $tpldir -name \\*.o | $NL2SP`\"'\n\t      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~\n\t\t$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \\*.o | $NL2SP`~\n\t\t$RANLIB $oldlib'\n\t      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    *) # Version 6 will use weak symbols\n\t      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    esac\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n            ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'\n\n\t    runpath_var=LD_RUN_PATH\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\"`; templist=`$ECHO \"X$templist\" | $Xsed -e \"s/\\(^.*ld.*\\)\\( .*ld .*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n\t    ;;\n\t  xl*)\n\t    # IBM XL 8.0 on PPC, with GNU ld\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    if test \"x$supports_anon_versioning\" = xyes; then\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t\tcat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t\techo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t\t$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n\t    fi\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'\n\t      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t      _LT_TAGVAR(compiler_needs_object, $1)=yes\n\n\t      # Not sure whether something based on\n\t      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1\n\t      # would be better.\n\t      output_verbose_link_cmd='echo'\n\n\t      # Archives containing C++ object files must be created using\n\t      # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t      # necessary to make sure instantiated templates are included\n\t      # in the archive.\n\t      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n\n      lynxos*)\n        # FIXME: insert proper C++ library support\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      m88k*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      mvs*)\n        case $cc_basename in\n          cxx*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n\t  *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n\tesac\n\t;;\n\n      netbsd*)\n        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'\n\t  wlarc=\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\tfi\n\t# Workaround some broken pre-1.5 toolchains\n\toutput_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e \"s:-lgcc -lc -lgcc::\"'\n\t;;\n\n      *nto* | *qnx*)\n        _LT_TAGVAR(ld_shlibs, $1)=yes\n\t;;\n\n      openbsd2*)\n        # C++ shared libraries are fairly broken\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      openbsd*)\n\tif test -f /usr/libexec/ld.so; then\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t  if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n\t  fi\n\t  output_verbose_link_cmd=echo\n\telse\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\tfi\n\t;;\n\n      osf3* | osf4* | osf5*)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo \"$lib\" | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Archives containing C++ object files must be created using\n\t    # the KAI C++ compiler.\n\t    case $host in\n\t      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;\n\t      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;\n\t    esac\n\t    ;;\n          RCC*)\n\t    # Rational C++ 2.4.1\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          cxx*)\n\t    case $host in\n\t      osf3*)\n\t        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t\t;;\n\t      *)\n\t        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done~\n\t          echo \"-hidden\">> $lib.exp~\n\t          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~\n\t          $RM $lib.exp'\n\t        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n\t\t;;\n\t    esac\n\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\" | $GREP -v \"ld:\"`; templist=`$ECHO \"X$templist\" | $Xsed -e \"s/\\(^.*ld.*\\)\\( .*ld.*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n\t    ;;\n\t  *)\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t      case $host in\n\t        osf3*)\n\t          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t        *)\n\t          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t      esac\n\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t      # Commands to make compiler produce verbose output that lists\n\t      # what \"hidden\" libraries, object files and flags are used when\n\t      # linking a shared library.\n\t      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"\\-L\"'\n\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      _LT_TAGVAR(ld_shlibs, $1)=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      psos*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      sunos4*)\n        case $cc_basename in\n          CC*)\n\t    # Sun C++ 4.x\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          lcc*)\n\t    # Lucid\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      solaris*)\n        case $cc_basename in\n          CC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes\n\t    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t    case $host_os in\n\t      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n\t      *)\n\t\t# The compiler driver will combine and reorder linker options,\n\t\t# but understands `-z linker_flag'.\n\t        # Supported since Solaris 2.6 (maybe 2.5.1?)\n\t\t_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'\n\t        ;;\n\t    esac\n\t    _LT_TAGVAR(link_all_deplibs, $1)=yes\n\n\t    output_verbose_link_cmd='echo'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'\n\t    ;;\n          gcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\n\t    # The C++ compiler must be used to create the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    # GNU C++ compiler with Solaris linker\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'\n\t      if $CC --version | $GREP -v '^2\\.7' > /dev/null; then\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"\\-L\"'\n\t      else\n\t        # g++ 2.7 appears to require `-G' NOT `-shared' on this\n\t        # platform.\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP \"\\-L\"'\n\t      fi\n\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'\n\t      case $host_os in\n\t\tsolaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n\t\t*)\n\t\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\t\t  ;;\n\t      esac\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      runpath_var='LD_RUN_PATH'\n\n      case $cc_basename in\n        CC*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n      esac\n      ;;\n\n      sysv5* | sco3.2v5* | sco5v6*)\n\t# Note: We can NOT use -z defs as we might desire, because we do not\n\t# link with -lc, and that would cause any symbols used from libc to\n\t# always be unresolved, which means just about no library would\n\t# ever link correctly.  If we're not using GNU ld we use -z text\n\t# though, which does catch some bad symbols but isn't as heavy-handed\n\t# as -z defs.\n\t_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n\t_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'\n\t_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n\t_LT_TAGVAR(link_all_deplibs, $1)=yes\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'\n\trunpath_var='LD_RUN_PATH'\n\n\tcase $cc_basename in\n          CC*)\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    ;;\n\t  *)\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    ;;\n\tesac\n      ;;\n\n      tandem*)\n        case $cc_basename in\n          NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      vxworks*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      *)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n    esac\n\n    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])\n    test \"$_LT_TAGVAR(ld_shlibs, $1)\" = no && can_build_shared=no\n\n    _LT_TAGVAR(GCC, $1)=\"$GXX\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_SYS_HIDDEN_LIBDEPS($1)\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  CC=$lt_save_CC\n  LDCXX=$LD\n  LD=$lt_save_LD\n  GCC=$lt_save_GCC\n  with_gnu_ld=$lt_save_with_gnu_ld\n  lt_cv_path_LDCXX=$lt_cv_path_LD\n  lt_cv_path_LD=$lt_save_path_LD\n  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld\n  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld\nfi # test \"$_lt_caught_CXX_error\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_CXX_CONFIG\n\n\n# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])\n# ---------------------------------\n# Figure out \"hidden\" library dependencies from verbose\n# compiler output when linking a shared library.\n# Parse the compiler output and extract the necessary\n# objects, libraries and library flags.\nm4_defun([_LT_SYS_HIDDEN_LIBDEPS],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\n# Dependencies to place before and after the object being linked:\n_LT_TAGVAR(predep_objects, $1)=\n_LT_TAGVAR(postdep_objects, $1)=\n_LT_TAGVAR(predeps, $1)=\n_LT_TAGVAR(postdeps, $1)=\n_LT_TAGVAR(compiler_lib_search_path, $1)=\n\ndnl we can't use the lt_simple_compile_test_code here,\ndnl because it contains code intended for an executable,\ndnl not a library.  It's possible we should let each\ndnl tag define a new lt_????_link_test_code variable,\ndnl but it's only used here...\nm4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF\nint a;\nvoid foo (void) { a = 0; }\n_LT_EOF\n], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF\nclass Foo\n{\npublic:\n  Foo (void) { a = 0; }\nprivate:\n  int a;\n};\n_LT_EOF\n], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF\n      subroutine foo\n      implicit none\n      integer*4 a\n      a=0\n      return\n      end\n_LT_EOF\n], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF\n      subroutine foo\n      implicit none\n      integer a\n      a=0\n      return\n      end\n_LT_EOF\n], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF\npublic class foo {\n  private int a;\n  public void bar (void) {\n    a = 0;\n  }\n};\n_LT_EOF\n])\ndnl Parse the compiler output and extract the necessary\ndnl objects, libraries and library flags.\nif AC_TRY_EVAL(ac_compile); then\n  # Parse the compiler output and extract the necessary\n  # objects, libraries and library flags.\n\n  # Sentinel used to keep track of whether or not we are before\n  # the conftest object file.\n  pre_test_object_deps_done=no\n\n  for p in `eval \"$output_verbose_link_cmd\"`; do\n    case $p in\n\n    -L* | -R* | -l*)\n       # Some compilers place space between \"-{L,R}\" and the path.\n       # Remove the space.\n       if test $p = \"-L\" ||\n          test $p = \"-R\"; then\n\t prev=$p\n\t continue\n       else\n\t prev=\n       fi\n\n       if test \"$pre_test_object_deps_done\" = no; then\n\t case $p in\n\t -L* | -R*)\n\t   # Internal compiler library paths should come after those\n\t   # provided the user.  The postdeps already come after the\n\t   # user supplied libs so there is no need to process them.\n\t   if test -z \"$_LT_TAGVAR(compiler_lib_search_path, $1)\"; then\n\t     _LT_TAGVAR(compiler_lib_search_path, $1)=\"${prev}${p}\"\n\t   else\n\t     _LT_TAGVAR(compiler_lib_search_path, $1)=\"${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}\"\n\t   fi\n\t   ;;\n\t # The \"-l\" case would never come before the object being\n\t # linked, so don't bother handling this case.\n\t esac\n       else\n\t if test -z \"$_LT_TAGVAR(postdeps, $1)\"; then\n\t   _LT_TAGVAR(postdeps, $1)=\"${prev}${p}\"\n\t else\n\t   _LT_TAGVAR(postdeps, $1)=\"${_LT_TAGVAR(postdeps, $1)} ${prev}${p}\"\n\t fi\n       fi\n       ;;\n\n    *.$objext)\n       # This assumes that the test object file only shows up\n       # once in the compiler output.\n       if test \"$p\" = \"conftest.$objext\"; then\n\t pre_test_object_deps_done=yes\n\t continue\n       fi\n\n       if test \"$pre_test_object_deps_done\" = no; then\n\t if test -z \"$_LT_TAGVAR(predep_objects, $1)\"; then\n\t   _LT_TAGVAR(predep_objects, $1)=\"$p\"\n\t else\n\t   _LT_TAGVAR(predep_objects, $1)=\"$_LT_TAGVAR(predep_objects, $1) $p\"\n\t fi\n       else\n\t if test -z \"$_LT_TAGVAR(postdep_objects, $1)\"; then\n\t   _LT_TAGVAR(postdep_objects, $1)=\"$p\"\n\t else\n\t   _LT_TAGVAR(postdep_objects, $1)=\"$_LT_TAGVAR(postdep_objects, $1) $p\"\n\t fi\n       fi\n       ;;\n\n    *) ;; # Ignore the rest.\n\n    esac\n  done\n\n  # Clean up.\n  rm -f a.out a.exe\nelse\n  echo \"libtool.m4: error: problem compiling $1 test program\"\nfi\n\n$RM -f confest.$objext\n\n# PORTME: override above test on systems where it is broken\nm4_if([$1], [CXX],\n[case $host_os in\ninterix[[3-9]]*)\n  # Interix 3.5 installs completely hosed .la files for C++, so rather than\n  # hack all around it, let's just trust \"g++\" to DTRT.\n  _LT_TAGVAR(predep_objects,$1)=\n  _LT_TAGVAR(postdep_objects,$1)=\n  _LT_TAGVAR(postdeps,$1)=\n  ;;\n\nlinux*)\n  case `$CC -V 2>&1 | sed 5q` in\n  *Sun\\ C*)\n    # Sun C++ 5.9\n\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    if test \"$solaris_use_stlport4\" != yes; then\n      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\n\nsolaris*)\n  case $cc_basename in\n  CC*)\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    # Adding this requires a known-good setup of shared libraries for\n    # Sun compiler versions before 5.6, else PIC objects from an old\n    # archive will be linked into the output, leading to subtle bugs.\n    if test \"$solaris_use_stlport4\" != yes; then\n      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\nesac\n])\n\ncase \" $_LT_TAGVAR(postdeps, $1) \" in\n*\" -lc \"*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;\nesac\n _LT_TAGVAR(compiler_lib_search_dirs, $1)=\nif test -n \"${_LT_TAGVAR(compiler_lib_search_path, $1)}\"; then\n _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo \" ${_LT_TAGVAR(compiler_lib_search_path, $1)}\" | ${SED} -e 's! -L! !g' -e 's!^ !!'`\nfi\n_LT_TAGDECL([], [compiler_lib_search_dirs], [1],\n    [The directories searched by this compiler when creating a shared library])\n_LT_TAGDECL([], [predep_objects], [1],\n    [Dependencies to place before and after the objects being linked to\n    create a shared library])\n_LT_TAGDECL([], [postdep_objects], [1])\n_LT_TAGDECL([], [predeps], [1])\n_LT_TAGDECL([], [postdeps], [1])\n_LT_TAGDECL([], [compiler_lib_search_path], [1],\n    [The library search path used internally by the compiler when linking\n    a shared library])\n])# _LT_SYS_HIDDEN_LIBDEPS\n\n\n# _LT_PROG_F77\n# ------------\n# Since AC_PROG_F77 is broken, in that it returns the empty string\n# if there is no fortran compiler, we have our own version here.\nm4_defun([_LT_PROG_F77],\n[\npushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])\nAC_PROG_F77\nif test -z \"$F77\" || test \"X$F77\" = \"Xno\"; then\n  _lt_disable_F77=yes\nfi\npopdef([AC_MSG_ERROR])\n])# _LT_PROG_F77\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([_LT_PROG_F77], [])\n\n\n# _LT_LANG_F77_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for a Fortran 77 compiler are\n# suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_F77_CONFIG],\n[AC_REQUIRE([_LT_PROG_F77])dnl\nAC_LANG_PUSH(Fortran 77)\n\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for f77 test sources.\nac_ext=f\n\n# Object file extension for compiled f77 test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the F77 compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_disable_F77\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"\\\n      subroutine t\n      return\n      end\n\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code=\"\\\n      program t\n      end\n\"\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=\"$CC\"\n  lt_save_GCC=$GCC\n  CC=${F77-\"f77\"}\n  compiler=$CC\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n  GCC=$G77\n  if test -n \"$compiler\"; then\n    AC_MSG_CHECKING([if libtool supports shared libraries])\n    AC_MSG_RESULT([$can_build_shared])\n\n    AC_MSG_CHECKING([whether to build shared libraries])\n    test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n    # On AIX, shared libraries and static libraries use the same namespace, and\n    # are all built from PIC.\n    case $host_os in\n      aix3*)\n        test \"$enable_shared\" = yes && enable_static=no\n        if test -n \"$RANLIB\"; then\n          archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n          postinstall_cmds='$RANLIB $lib'\n        fi\n        ;;\n      aix[[4-9]]*)\n\tif test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n\t  test \"$enable_shared\" = yes && enable_static=no\n\tfi\n        ;;\n    esac\n    AC_MSG_RESULT([$enable_shared])\n\n    AC_MSG_CHECKING([whether to build static libraries])\n    # Make sure either enable_shared or enable_static is yes.\n    test \"$enable_shared\" = yes || enable_static=yes\n    AC_MSG_RESULT([$enable_static])\n\n    _LT_TAGVAR(GCC, $1)=\"$G77\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  GCC=$lt_save_GCC\n  CC=\"$lt_save_CC\"\nfi # test \"$_lt_disable_F77\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_F77_CONFIG\n\n\n# _LT_PROG_FC\n# -----------\n# Since AC_PROG_FC is broken, in that it returns the empty string\n# if there is no fortran compiler, we have our own version here.\nm4_defun([_LT_PROG_FC],\n[\npushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])\nAC_PROG_FC\nif test -z \"$FC\" || test \"X$FC\" = \"Xno\"; then\n  _lt_disable_FC=yes\nfi\npopdef([AC_MSG_ERROR])\n])# _LT_PROG_FC\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([_LT_PROG_FC], [])\n\n\n# _LT_LANG_FC_CONFIG([TAG])\n# -------------------------\n# Ensure that the configuration variables for a Fortran compiler are\n# suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_FC_CONFIG],\n[AC_REQUIRE([_LT_PROG_FC])dnl\nAC_LANG_PUSH(Fortran)\n\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for fc test sources.\nac_ext=${ac_fc_srcext-f}\n\n# Object file extension for compiled fc test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the FC compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_disable_FC\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"\\\n      subroutine t\n      return\n      end\n\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code=\"\\\n      program t\n      end\n\"\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=\"$CC\"\n  lt_save_GCC=$GCC\n  CC=${FC-\"f95\"}\n  compiler=$CC\n  GCC=$ac_cv_fc_compiler_gnu\n\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n\n  if test -n \"$compiler\"; then\n    AC_MSG_CHECKING([if libtool supports shared libraries])\n    AC_MSG_RESULT([$can_build_shared])\n\n    AC_MSG_CHECKING([whether to build shared libraries])\n    test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n    # On AIX, shared libraries and static libraries use the same namespace, and\n    # are all built from PIC.\n    case $host_os in\n      aix3*)\n        test \"$enable_shared\" = yes && enable_static=no\n        if test -n \"$RANLIB\"; then\n          archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n          postinstall_cmds='$RANLIB $lib'\n        fi\n        ;;\n      aix[[4-9]]*)\n\tif test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n\t  test \"$enable_shared\" = yes && enable_static=no\n\tfi\n        ;;\n    esac\n    AC_MSG_RESULT([$enable_shared])\n\n    AC_MSG_CHECKING([whether to build static libraries])\n    # Make sure either enable_shared or enable_static is yes.\n    test \"$enable_shared\" = yes || enable_static=yes\n    AC_MSG_RESULT([$enable_static])\n\n    _LT_TAGVAR(GCC, $1)=\"$ac_cv_fc_compiler_gnu\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_SYS_HIDDEN_LIBDEPS($1)\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  GCC=$lt_save_GCC\n  CC=\"$lt_save_CC\"\nfi # test \"$_lt_disable_FC\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_FC_CONFIG\n\n\n# _LT_LANG_GCJ_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for the GNU Java Compiler compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_GCJ_CONFIG],\n[AC_REQUIRE([LT_PROG_GCJ])dnl\nAC_LANG_SAVE\n\n# Source file extension for Java test sources.\nac_ext=java\n\n# Object file extension for compiled Java test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"class foo {}\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=\"$CC\"\nlt_save_GCC=$GCC\nGCC=yes\nCC=${GCJ-\"gcj\"}\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_TAGVAR(LD, $1)=\"$LD\"\n_LT_CC_BASENAME([$compiler])\n\n# GCJ did not exist at the time GCC didn't implicitly link libc in.\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n\n  _LT_CONFIG($1)\nfi\n\nAC_LANG_RESTORE\n\nGCC=$lt_save_GCC\nCC=\"$lt_save_CC\"\n])# _LT_LANG_GCJ_CONFIG\n\n\n# _LT_LANG_RC_CONFIG([TAG])\n# -------------------------\n# Ensure that the configuration variables for the Windows resource compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_RC_CONFIG],\n[AC_REQUIRE([LT_PROG_RC])dnl\nAC_LANG_SAVE\n\n# Source file extension for RC test sources.\nac_ext=rc\n\n# Object file extension for compiled RC test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code='sample MENU { MENUITEM \"&Soup\", 100, CHECKED }'\n\n# Code to be used in simple link tests\nlt_simple_link_test_code=\"$lt_simple_compile_test_code\"\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=\"$CC\"\nlt_save_GCC=$GCC\nGCC=\nCC=${RC-\"windres\"}\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_CC_BASENAME([$compiler])\n_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes\n\nif test -n \"$compiler\"; then\n  :\n  _LT_CONFIG($1)\nfi\n\nGCC=$lt_save_GCC\nAC_LANG_RESTORE\nCC=\"$lt_save_CC\"\n])# _LT_LANG_RC_CONFIG\n\n\n# LT_PROG_GCJ\n# -----------\nAC_DEFUN([LT_PROG_GCJ],\n[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],\n  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],\n    [AC_CHECK_TOOL(GCJ, gcj,)\n      test \"x${GCJFLAGS+set}\" = xset || GCJFLAGS=\"-g -O2\"\n      AC_SUBST(GCJFLAGS)])])[]dnl\n])\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_GCJ], [])\n\n\n# LT_PROG_RC\n# ----------\nAC_DEFUN([LT_PROG_RC],\n[AC_CHECK_TOOL(RC, windres,)\n])\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_RC], [])\n\n\n# _LT_DECL_EGREP\n# --------------\n# If we don't have a new enough Autoconf to choose the best grep\n# available, choose the one first in the user's PATH.\nm4_defun([_LT_DECL_EGREP],\n[AC_REQUIRE([AC_PROG_EGREP])dnl\nAC_REQUIRE([AC_PROG_FGREP])dnl\ntest -z \"$GREP\" && GREP=grep\n_LT_DECL([], [GREP], [1], [A grep program that handles long lines])\n_LT_DECL([], [EGREP], [1], [An ERE matcher])\n_LT_DECL([], [FGREP], [1], [A literal string matcher])\ndnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too\nAC_SUBST([GREP])\n])\n\n\n# _LT_DECL_OBJDUMP\n# --------------\n# If we don't have a new enough Autoconf to choose the best objdump\n# available, choose the one first in the user's PATH.\nm4_defun([_LT_DECL_OBJDUMP],\n[AC_CHECK_TOOL(OBJDUMP, objdump, false)\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])\nAC_SUBST([OBJDUMP])\n])\n\n\n# _LT_DECL_SED\n# ------------\n# Check for a fully-functional sed program, that truncates\n# as few characters as possible.  Prefer GNU sed if found.\nm4_defun([_LT_DECL_SED],\n[AC_PROG_SED\ntest -z \"$SED\" && SED=sed\nXsed=\"$SED -e 1s/^X//\"\n_LT_DECL([], [SED], [1], [A sed program that does not truncate output])\n_LT_DECL([], [Xsed], [\"\\$SED -e 1s/^X//\"],\n    [Sed that helps us avoid accidentally triggering echo(1) options like -n])\n])# _LT_DECL_SED\n\nm4_ifndef([AC_PROG_SED], [\n############################################################\n# NOTE: This macro has been submitted for inclusion into   #\n#  GNU Autoconf as AC_PROG_SED.  When it is available in   #\n#  a released version of Autoconf we should remove this    #\n#  macro and use it instead.                               #\n############################################################\n\nm4_defun([AC_PROG_SED],\n[AC_MSG_CHECKING([for a sed that does not truncate output])\nAC_CACHE_VAL(lt_cv_path_SED,\n[# Loop through the user's path and test for sed and gsed.\n# Then use that list of sed's as ones to test for truncation.\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for lt_ac_prog in sed gsed; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      if $as_executable_p \"$as_dir/$lt_ac_prog$ac_exec_ext\"; then\n        lt_ac_sed_list=\"$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext\"\n      fi\n    done\n  done\ndone\nIFS=$as_save_IFS\nlt_ac_max=0\nlt_ac_count=0\n# Add /usr/xpg4/bin/sed as it is typically found on Solaris\n# along with /bin/sed that truncates output.\nfor lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do\n  test ! -f $lt_ac_sed && continue\n  cat /dev/null > conftest.in\n  lt_ac_count=0\n  echo $ECHO_N \"0123456789$ECHO_C\" >conftest.in\n  # Check for GNU sed and select it if it is found.\n  if \"$lt_ac_sed\" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then\n    lt_cv_path_SED=$lt_ac_sed\n    break\n  fi\n  while true; do\n    cat conftest.in conftest.in >conftest.tmp\n    mv conftest.tmp conftest.in\n    cp conftest.in conftest.nl\n    echo >>conftest.nl\n    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break\n    cmp -s conftest.out conftest.nl || break\n    # 10000 chars as input seems more than enough\n    test $lt_ac_count -gt 10 && break\n    lt_ac_count=`expr $lt_ac_count + 1`\n    if test $lt_ac_count -gt $lt_ac_max; then\n      lt_ac_max=$lt_ac_count\n      lt_cv_path_SED=$lt_ac_sed\n    fi\n  done\ndone\n])\nSED=$lt_cv_path_SED\nAC_SUBST([SED])\nAC_MSG_RESULT([$SED])\n])#AC_PROG_SED\n])#m4_ifndef\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_SED], [])\n\n\n# _LT_CHECK_SHELL_FEATURES\n# ------------------------\n# Find out whether the shell is Bourne or XSI compatible,\n# or has some other useful features.\nm4_defun([_LT_CHECK_SHELL_FEATURES],\n[AC_MSG_CHECKING([whether the shell understands some XSI constructs])\n# Try some XSI features\nxsi_shell=no\n( _lt_dummy=\"a/b/c\"\n  test \"${_lt_dummy##*/},${_lt_dummy%/*},\"${_lt_dummy%\"$_lt_dummy\"}, \\\n      = c,a/b,, \\\n    && eval 'test $(( 1 + 1 )) -eq 2 \\\n    && test \"${#_lt_dummy}\" -eq 5' ) >/dev/null 2>&1 \\\n  && xsi_shell=yes\nAC_MSG_RESULT([$xsi_shell])\n_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])\n\nAC_MSG_CHECKING([whether the shell understands \"+=\"])\nlt_shell_append=no\n( foo=bar; set foo baz; eval \"$[1]+=\\$[2]\" && test \"$foo\" = barbaz ) \\\n    >/dev/null 2>&1 \\\n  && lt_shell_append=yes\nAC_MSG_RESULT([$lt_shell_append])\n_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])\n\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  lt_unset=unset\nelse\n  lt_unset=false\nfi\n_LT_DECL([], [lt_unset], [0], [whether the shell understands \"unset\"])dnl\n\n# test EBCDIC or ASCII\ncase `echo X|tr X '\\101'` in\n A) # ASCII based system\n    # \\n is not interpreted correctly by Solaris 8 /usr/ucb/tr\n  lt_SP2NL='tr \\040 \\012'\n  lt_NL2SP='tr \\015\\012 \\040\\040'\n  ;;\n *) # EBCDIC based system\n  lt_SP2NL='tr \\100 \\n'\n  lt_NL2SP='tr \\r\\n \\100\\100'\n  ;;\nesac\n_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl\n_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl\n])# _LT_CHECK_SHELL_FEATURES\n\n\n# _LT_PROG_XSI_SHELLFNS\n# ---------------------\n# Bourne and XSI compatible variants of some useful shell functions.\nm4_defun([_LT_PROG_XSI_SHELLFNS],\n[case $xsi_shell in\n  yes)\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_dirname file append nondir_replacement\n# Compute the dirname of FILE.  If nonempty, add APPEND to the result,\n# otherwise set result to NONDIR_REPLACEMENT.\nfunc_dirname ()\n{\n  case ${1} in\n    */*) func_dirname_result=\"${1%/*}${2}\" ;;\n    *  ) func_dirname_result=\"${3}\" ;;\n  esac\n}\n\n# func_basename file\nfunc_basename ()\n{\n  func_basename_result=\"${1##*/}\"\n}\n\n# func_dirname_and_basename file append nondir_replacement\n# perform func_basename and func_dirname in a single function\n# call:\n#   dirname:  Compute the dirname of FILE.  If nonempty,\n#             add APPEND to the result, otherwise set result\n#             to NONDIR_REPLACEMENT.\n#             value returned in \"$func_dirname_result\"\n#   basename: Compute filename of FILE.\n#             value retuned in \"$func_basename_result\"\n# Implementation must be kept synchronized with func_dirname\n# and func_basename. For efficiency, we do not delegate to\n# those functions but instead duplicate the functionality here.\nfunc_dirname_and_basename ()\n{\n  case ${1} in\n    */*) func_dirname_result=\"${1%/*}${2}\" ;;\n    *  ) func_dirname_result=\"${3}\" ;;\n  esac\n  func_basename_result=\"${1##*/}\"\n}\n\n# func_stripname prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\nfunc_stripname ()\n{\n  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\n  # positional parameters, so assign one to ordinary parameter first.\n  func_stripname_result=${3}\n  func_stripname_result=${func_stripname_result#\"${1}\"}\n  func_stripname_result=${func_stripname_result%\"${2}\"}\n}\n\n# func_opt_split\nfunc_opt_split ()\n{\n  func_opt_split_opt=${1%%=*}\n  func_opt_split_arg=${1#*=}\n}\n\n# func_lo2o object\nfunc_lo2o ()\n{\n  case ${1} in\n    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\n    *)    func_lo2o_result=${1} ;;\n  esac\n}\n\n# func_xform libobj-or-source\nfunc_xform ()\n{\n  func_xform_result=${1%.*}.lo\n}\n\n# func_arith arithmetic-term...\nfunc_arith ()\n{\n  func_arith_result=$(( $[*] ))\n}\n\n# func_len string\n# STRING may not start with a hyphen.\nfunc_len ()\n{\n  func_len_result=${#1}\n}\n\n_LT_EOF\n    ;;\n  *) # Bourne compatible functions.\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_dirname file append nondir_replacement\n# Compute the dirname of FILE.  If nonempty, add APPEND to the result,\n# otherwise set result to NONDIR_REPLACEMENT.\nfunc_dirname ()\n{\n  # Extract subdirectory from the argument.\n  func_dirname_result=`$ECHO \"X${1}\" | $Xsed -e \"$dirname\"`\n  if test \"X$func_dirname_result\" = \"X${1}\"; then\n    func_dirname_result=\"${3}\"\n  else\n    func_dirname_result=\"$func_dirname_result${2}\"\n  fi\n}\n\n# func_basename file\nfunc_basename ()\n{\n  func_basename_result=`$ECHO \"X${1}\" | $Xsed -e \"$basename\"`\n}\n\ndnl func_dirname_and_basename\ndnl A portable version of this function is already defined in general.m4sh\ndnl so there is no need for it here.\n\n# func_stripname prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\n# func_strip_suffix prefix name\nfunc_stripname ()\n{\n  case ${2} in\n    .*) func_stripname_result=`$ECHO \"X${3}\" \\\n           | $Xsed -e \"s%^${1}%%\" -e \"s%\\\\\\\\${2}\\$%%\"`;;\n    *)  func_stripname_result=`$ECHO \"X${3}\" \\\n           | $Xsed -e \"s%^${1}%%\" -e \"s%${2}\\$%%\"`;;\n  esac\n}\n\n# sed scripts:\nmy_sed_long_opt='1s/^\\(-[[^=]]*\\)=.*/\\1/;q'\nmy_sed_long_arg='1s/^-[[^=]]*=//'\n\n# func_opt_split\nfunc_opt_split ()\n{\n  func_opt_split_opt=`$ECHO \"X${1}\" | $Xsed -e \"$my_sed_long_opt\"`\n  func_opt_split_arg=`$ECHO \"X${1}\" | $Xsed -e \"$my_sed_long_arg\"`\n}\n\n# func_lo2o object\nfunc_lo2o ()\n{\n  func_lo2o_result=`$ECHO \"X${1}\" | $Xsed -e \"$lo2o\"`\n}\n\n# func_xform libobj-or-source\nfunc_xform ()\n{\n  func_xform_result=`$ECHO \"X${1}\" | $Xsed -e 's/\\.[[^.]]*$/.lo/'`\n}\n\n# func_arith arithmetic-term...\nfunc_arith ()\n{\n  func_arith_result=`expr \"$[@]\"`\n}\n\n# func_len string\n# STRING may not start with a hyphen.\nfunc_len ()\n{\n  func_len_result=`expr \"$[1]\" : \".*\" 2>/dev/null || echo $max_cmd_len`\n}\n\n_LT_EOF\nesac\n\ncase $lt_shell_append in\n  yes)\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_append var value\n# Append VALUE to the end of shell variable VAR.\nfunc_append ()\n{\n  eval \"$[1]+=\\$[2]\"\n}\n_LT_EOF\n    ;;\n  *)\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_append var value\n# Append VALUE to the end of shell variable VAR.\nfunc_append ()\n{\n  eval \"$[1]=\\$$[1]\\$[2]\"\n}\n\n_LT_EOF\n    ;;\n  esac\n])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/ltoptions.m4",
    "content": "# Helper functions for option handling.                    -*- Autoconf -*-\n#\n#   Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.\n#   Written by Gary V. Vaughan, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 6 ltoptions.m4\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])\n\n\n# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)\n# ------------------------------------------\nm4_define([_LT_MANGLE_OPTION],\n[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])\n\n\n# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)\n# ---------------------------------------\n# Set option OPTION-NAME for macro MACRO-NAME, and if there is a\n# matching handler defined, dispatch to it.  Other OPTION-NAMEs are\n# saved as a flag.\nm4_define([_LT_SET_OPTION],\n[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl\nm4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),\n        _LT_MANGLE_DEFUN([$1], [$2]),\n    [m4_warning([Unknown $1 option `$2'])])[]dnl\n])\n\n\n# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])\n# ------------------------------------------------------------\n# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.\nm4_define([_LT_IF_OPTION],\n[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])\n\n\n# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)\n# -------------------------------------------------------\n# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME\n# are set.\nm4_define([_LT_UNLESS_OPTIONS],\n[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),\n\t    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),\n\t\t      [m4_define([$0_found])])])[]dnl\nm4_ifdef([$0_found], [m4_undefine([$0_found])], [$3\n])[]dnl\n])\n\n\n# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)\n# ----------------------------------------\n# OPTION-LIST is a space-separated list of Libtool options associated\n# with MACRO-NAME.  If any OPTION has a matching handler declared with\n# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about\n# the unknown option and exit.\nm4_defun([_LT_SET_OPTIONS],\n[# Set options\nm4_foreach([_LT_Option], m4_split(m4_normalize([$2])),\n    [_LT_SET_OPTION([$1], _LT_Option)])\n\nm4_if([$1],[LT_INIT],[\n  dnl\n  dnl Simply set some default values (i.e off) if boolean options were not\n  dnl specified:\n  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no\n  ])\n  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no\n  ])\n  dnl\n  dnl If no reference was made to various pairs of opposing options, then\n  dnl we run the default mode handler for the pair.  For example, if neither\n  dnl `shared' nor `disable-shared' was passed, we enable building of shared\n  dnl archives by default:\n  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])\n  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])\n  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])\n  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],\n  \t\t   [_LT_ENABLE_FAST_INSTALL])\n  ])\n])# _LT_SET_OPTIONS\n\n\n## --------------------------------- ##\n## Macros to handle LT_INIT options. ##\n## --------------------------------- ##\n\n# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)\n# -----------------------------------------\nm4_define([_LT_MANGLE_DEFUN],\n[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])\n\n\n# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)\n# -----------------------------------------------\nm4_define([LT_OPTION_DEFINE],\n[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl\n])# LT_OPTION_DEFINE\n\n\n# dlopen\n# ------\nLT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes\n])\n\nAU_DEFUN([AC_LIBTOOL_DLOPEN],\n[_LT_SET_OPTION([LT_INIT], [dlopen])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `dlopen' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])\n\n\n# win32-dll\n# ---------\n# Declare package support for building win32 dll's.\nLT_OPTION_DEFINE([LT_INIT], [win32-dll],\n[enable_win32_dll=yes\n\ncase $host in\n*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)\n  AC_CHECK_TOOL(AS, as, false)\n  AC_CHECK_TOOL(DLLTOOL, dlltool, false)\n  AC_CHECK_TOOL(OBJDUMP, objdump, false)\n  ;;\nesac\n\ntest -z \"$AS\" && AS=as\n_LT_DECL([], [AS],      [0], [Assembler program])dnl\n\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl\n])# win32-dll\n\nAU_DEFUN([AC_LIBTOOL_WIN32_DLL],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\n_LT_SET_OPTION([LT_INIT], [win32-dll])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `win32-dll' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])\n\n\n# _LT_ENABLE_SHARED([DEFAULT])\n# ----------------------------\n# implement the --enable-shared flag, and supports the `shared' and\n# `disable-shared' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_SHARED],\n[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([shared],\n    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],\n\t[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_shared=yes ;;\n    no) enable_shared=no ;;\n    *)\n      enable_shared=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_shared=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)\n\n    _LT_DECL([build_libtool_libs], [enable_shared], [0],\n\t[Whether or not to build shared libraries])\n])# _LT_ENABLE_SHARED\n\nLT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])\n\n# Old names:\nAC_DEFUN([AC_ENABLE_SHARED],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])\n])\n\nAC_DEFUN([AC_DISABLE_SHARED],\n[_LT_SET_OPTION([LT_INIT], [disable-shared])\n])\n\nAU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])\nAU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_ENABLE_SHARED], [])\ndnl AC_DEFUN([AM_DISABLE_SHARED], [])\n\n\n\n# _LT_ENABLE_STATIC([DEFAULT])\n# ----------------------------\n# implement the --enable-static flag, and support the `static' and\n# `disable-static' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_STATIC],\n[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([static],\n    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],\n\t[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_static=yes ;;\n    no) enable_static=no ;;\n    *)\n     enable_static=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_static=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)\n\n    _LT_DECL([build_old_libs], [enable_static], [0],\n\t[Whether or not to build static libraries])\n])# _LT_ENABLE_STATIC\n\nLT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])\n\n# Old names:\nAC_DEFUN([AC_ENABLE_STATIC],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])\n])\n\nAC_DEFUN([AC_DISABLE_STATIC],\n[_LT_SET_OPTION([LT_INIT], [disable-static])\n])\n\nAU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])\nAU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_ENABLE_STATIC], [])\ndnl AC_DEFUN([AM_DISABLE_STATIC], [])\n\n\n\n# _LT_ENABLE_FAST_INSTALL([DEFAULT])\n# ----------------------------------\n# implement the --enable-fast-install flag, and support the `fast-install'\n# and `disable-fast-install' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_FAST_INSTALL],\n[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([fast-install],\n    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],\n    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_fast_install=yes ;;\n    no) enable_fast_install=no ;;\n    *)\n      enable_fast_install=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_fast_install=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)\n\n_LT_DECL([fast_install], [enable_fast_install], [0],\n\t [Whether or not to optimize for fast installation])dnl\n])# _LT_ENABLE_FAST_INSTALL\n\nLT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])\n\n# Old names:\nAU_DEFUN([AC_ENABLE_FAST_INSTALL],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you put\nthe `fast-install' option into LT_INIT's first parameter.])\n])\n\nAU_DEFUN([AC_DISABLE_FAST_INSTALL],\n[_LT_SET_OPTION([LT_INIT], [disable-fast-install])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you put\nthe `disable-fast-install' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])\ndnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])\n\n\n# _LT_WITH_PIC([MODE])\n# --------------------\n# implement the --with-pic flag, and support the `pic-only' and `no-pic'\n# LT_INIT options.\n# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.\nm4_define([_LT_WITH_PIC],\n[AC_ARG_WITH([pic],\n    [AS_HELP_STRING([--with-pic],\n\t[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],\n    [pic_mode=\"$withval\"],\n    [pic_mode=default])\n\ntest -z \"$pic_mode\" && pic_mode=m4_default([$1], [default])\n\n_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl\n])# _LT_WITH_PIC\n\nLT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])\nLT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])\n\n# Old name:\nAU_DEFUN([AC_LIBTOOL_PICMODE],\n[_LT_SET_OPTION([LT_INIT], [pic-only])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `pic-only' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])\n\n## ----------------- ##\n## LTDL_INIT Options ##\n## ----------------- ##\n\nm4_define([_LTDL_MODE], [])\nLT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],\n\t\t [m4_define([_LTDL_MODE], [nonrecursive])])\nLT_OPTION_DEFINE([LTDL_INIT], [recursive],\n\t\t [m4_define([_LTDL_MODE], [recursive])])\nLT_OPTION_DEFINE([LTDL_INIT], [subproject],\n\t\t [m4_define([_LTDL_MODE], [subproject])])\n\nm4_define([_LTDL_TYPE], [])\nLT_OPTION_DEFINE([LTDL_INIT], [installable],\n\t\t [m4_define([_LTDL_TYPE], [installable])])\nLT_OPTION_DEFINE([LTDL_INIT], [convenience],\n\t\t [m4_define([_LTDL_TYPE], [convenience])])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/ltsugar.m4",
    "content": "# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-\n#\n# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.\n# Written by Gary V. Vaughan, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 6 ltsugar.m4\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])\n\n\n# lt_join(SEP, ARG1, [ARG2...])\n# -----------------------------\n# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their\n# associated separator.\n# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier\n# versions in m4sugar had bugs.\nm4_define([lt_join],\n[m4_if([$#], [1], [],\n       [$#], [2], [[$2]],\n       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])\nm4_define([_lt_join],\n[m4_if([$#$2], [2], [],\n       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])\n\n\n# lt_car(LIST)\n# lt_cdr(LIST)\n# ------------\n# Manipulate m4 lists.\n# These macros are necessary as long as will still need to support\n# Autoconf-2.59 which quotes differently.\nm4_define([lt_car], [[$1]])\nm4_define([lt_cdr],\n[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],\n       [$#], 1, [],\n       [m4_dquote(m4_shift($@))])])\nm4_define([lt_unquote], $1)\n\n\n# lt_append(MACRO-NAME, STRING, [SEPARATOR])\n# ------------------------------------------\n# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.\n# Note that neither SEPARATOR nor STRING are expanded; they are appended\n# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).\n# No SEPARATOR is output if MACRO-NAME was previously undefined (different\n# than defined and empty).\n#\n# This macro is needed until we can rely on Autoconf 2.62, since earlier\n# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.\nm4_define([lt_append],\n[m4_define([$1],\n\t   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])\n\n\n\n# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])\n# ----------------------------------------------------------\n# Produce a SEP delimited list of all paired combinations of elements of\n# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list\n# has the form PREFIXmINFIXSUFFIXn.\n# Needed until we can rely on m4_combine added in Autoconf 2.62.\nm4_define([lt_combine],\n[m4_if(m4_eval([$# > 3]), [1],\n       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl\n[[m4_foreach([_Lt_prefix], [$2],\n\t     [m4_foreach([_Lt_suffix],\n\t\t]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,\n\t[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])\n\n\n# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])\n# -----------------------------------------------------------------------\n# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited\n# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.\nm4_define([lt_if_append_uniq],\n[m4_ifdef([$1],\n\t  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],\n\t\t [lt_append([$1], [$2], [$3])$4],\n\t\t [$5])],\n\t  [lt_append([$1], [$2], [$3])$4])])\n\n\n# lt_dict_add(DICT, KEY, VALUE)\n# -----------------------------\nm4_define([lt_dict_add],\n[m4_define([$1($2)], [$3])])\n\n\n# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)\n# --------------------------------------------\nm4_define([lt_dict_add_subkey],\n[m4_define([$1($2:$3)], [$4])])\n\n\n# lt_dict_fetch(DICT, KEY, [SUBKEY])\n# ----------------------------------\nm4_define([lt_dict_fetch],\n[m4_ifval([$3],\n\tm4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),\n    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])\n\n\n# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])\n# -----------------------------------------------------------------\nm4_define([lt_if_dict_fetch],\n[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],\n\t[$5],\n    [$6])])\n\n\n# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])\n# --------------------------------------------------------------\nm4_define([lt_dict_filter],\n[m4_if([$5], [], [],\n  [lt_join(m4_quote(m4_default([$4], [[, ]])),\n           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),\n\t\t      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl\n])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/ltversion.m4",
    "content": "# ltversion.m4 -- version numbers\t\t\t-*- Autoconf -*-\n#\n#   Copyright (C) 2004 Free Software Foundation, Inc.\n#   Written by Scott James Remnant, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# Generated from ltversion.in.\n\n# serial 3017 ltversion.m4\n# This file is part of GNU Libtool\n\nm4_define([LT_PACKAGE_VERSION], [2.2.6b])\nm4_define([LT_PACKAGE_REVISION], [1.3017])\n\nAC_DEFUN([LTVERSION_VERSION],\n[macro_version='2.2.6b'\nmacro_revision='1.3017'\n_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])\n_LT_DECL(, macro_revision, 0)\n])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/lt~obsolete.m4",
    "content": "# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-\n#\n#   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.\n#   Written by Scott James Remnant, 2004.\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 4 lt~obsolete.m4\n\n# These exist entirely to fool aclocal when bootstrapping libtool.\n#\n# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)\n# which have later been changed to m4_define as they aren't part of the\n# exported API, or moved to Autoconf or Automake where they belong.\n#\n# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN\n# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us\n# using a macro with the same name in our local m4/libtool.m4 it'll\n# pull the old libtool.m4 in (it doesn't see our shiny new m4_define\n# and doesn't know about Autoconf macros at all.)\n#\n# So we provide this file, which has a silly filename so it's always\n# included after everything else.  This provides aclocal with the\n# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything\n# because those macros already exist, or will be overwritten later.\n# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. \n#\n# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.\n# Yes, that means every name once taken will need to remain here until\n# we give up compatibility with versions before 1.7, at which point\n# we need to keep only those names which we still refer to.\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])\n\nm4_ifndef([AC_LIBTOOL_LINKER_OPTION],\t[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])\nm4_ifndef([AC_PROG_EGREP],\t\t[AC_DEFUN([AC_PROG_EGREP])])\nm4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],\t[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])\nm4_ifndef([_LT_AC_SHELL_INIT],\t\t[AC_DEFUN([_LT_AC_SHELL_INIT])])\nm4_ifndef([_LT_AC_SYS_LIBPATH_AIX],\t[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])\nm4_ifndef([_LT_PROG_LTMAIN],\t\t[AC_DEFUN([_LT_PROG_LTMAIN])])\nm4_ifndef([_LT_AC_TAGVAR],\t\t[AC_DEFUN([_LT_AC_TAGVAR])])\nm4_ifndef([AC_LTDL_ENABLE_INSTALL],\t[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])\nm4_ifndef([AC_LTDL_PREOPEN],\t\t[AC_DEFUN([AC_LTDL_PREOPEN])])\nm4_ifndef([_LT_AC_SYS_COMPILER],\t[AC_DEFUN([_LT_AC_SYS_COMPILER])])\nm4_ifndef([_LT_AC_LOCK],\t\t[AC_DEFUN([_LT_AC_LOCK])])\nm4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],\t[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])\nm4_ifndef([_LT_AC_TRY_DLOPEN_SELF],\t[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])\nm4_ifndef([AC_LIBTOOL_PROG_CC_C_O],\t[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])\nm4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])\nm4_ifndef([AC_LIBTOOL_OBJDIR],\t\t[AC_DEFUN([AC_LIBTOOL_OBJDIR])])\nm4_ifndef([AC_LTDL_OBJDIR],\t\t[AC_DEFUN([AC_LTDL_OBJDIR])])\nm4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])\nm4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],\t[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])\nm4_ifndef([AC_PATH_MAGIC],\t\t[AC_DEFUN([AC_PATH_MAGIC])])\nm4_ifndef([AC_PROG_LD_GNU],\t\t[AC_DEFUN([AC_PROG_LD_GNU])])\nm4_ifndef([AC_PROG_LD_RELOAD_FLAG],\t[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])\nm4_ifndef([AC_DEPLIBS_CHECK_METHOD],\t[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])\nm4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])\nm4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])\nm4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])\nm4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],\t[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])\nm4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],\t[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])\nm4_ifndef([LT_AC_PROG_EGREP],\t\t[AC_DEFUN([LT_AC_PROG_EGREP])])\nm4_ifndef([LT_AC_PROG_SED],\t\t[AC_DEFUN([LT_AC_PROG_SED])])\nm4_ifndef([_LT_CC_BASENAME],\t\t[AC_DEFUN([_LT_CC_BASENAME])])\nm4_ifndef([_LT_COMPILER_BOILERPLATE],\t[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])\nm4_ifndef([_LT_LINKER_BOILERPLATE],\t[AC_DEFUN([_LT_LINKER_BOILERPLATE])])\nm4_ifndef([_AC_PROG_LIBTOOL],\t\t[AC_DEFUN([_AC_PROG_LIBTOOL])])\nm4_ifndef([AC_LIBTOOL_SETUP],\t\t[AC_DEFUN([AC_LIBTOOL_SETUP])])\nm4_ifndef([_LT_AC_CHECK_DLFCN],\t\t[AC_DEFUN([_LT_AC_CHECK_DLFCN])])\nm4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],\t[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])\nm4_ifndef([_LT_AC_TAGCONFIG],\t\t[AC_DEFUN([_LT_AC_TAGCONFIG])])\nm4_ifndef([AC_DISABLE_FAST_INSTALL],\t[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])\nm4_ifndef([_LT_AC_LANG_CXX],\t\t[AC_DEFUN([_LT_AC_LANG_CXX])])\nm4_ifndef([_LT_AC_LANG_F77],\t\t[AC_DEFUN([_LT_AC_LANG_F77])])\nm4_ifndef([_LT_AC_LANG_GCJ],\t\t[AC_DEFUN([_LT_AC_LANG_GCJ])])\nm4_ifndef([AC_LIBTOOL_RC],\t\t[AC_DEFUN([AC_LIBTOOL_RC])])\nm4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])\nm4_ifndef([_LT_AC_LANG_C_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])\nm4_ifndef([_LT_AC_LANG_CXX_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])\nm4_ifndef([_LT_AC_LANG_F77_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])\nm4_ifndef([_LT_AC_LANG_GCJ_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])\nm4_ifndef([_LT_AC_LANG_RC_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])\nm4_ifndef([AC_LIBTOOL_CONFIG],\t\t[AC_DEFUN([AC_LIBTOOL_CONFIG])])\nm4_ifndef([_LT_AC_FILE_LTDLL_C],\t[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/namespaces.m4",
    "content": "# Checks whether the compiler implements namespaces\nAC_DEFUN([AC_CXX_NAMESPACES],\n [AC_CACHE_CHECK(whether the compiler implements namespaces,\n                 ac_cv_cxx_namespaces,\n                 [AC_LANG_SAVE\n                  AC_LANG_CPLUSPLUS\n                  AC_TRY_COMPILE([namespace Outer {\n                                    namespace Inner { int i = 0; }}],\n                                 [using namespace Outer::Inner; return i;],\n                                 ac_cv_cxx_namespaces=yes,\n                                 ac_cv_cxx_namespaces=no)\n                  AC_LANG_RESTORE])\n  if test \"$ac_cv_cxx_namespaces\" = yes; then\n    AC_DEFINE(HAVE_NAMESPACES, 1, [define if the compiler implements namespaces])\n  fi])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/pc_from_ucontext.m4",
    "content": "# We want to access the \"PC\" (Program Counter) register from a struct\n# ucontext.  Every system has its own way of doing that.  We try all the\n# possibilities we know about.  Note REG_PC should come first (REG_RIP\n# is also defined on solaris, but does the wrong thing).\n\n# OpenBSD doesn't have ucontext.h, but we can get PC from ucontext_t\n# by using signal.h.\n\n# The first argument of AC_PC_FROM_UCONTEXT will be invoked when we\n# cannot find a way to obtain PC from ucontext.\n\nAC_DEFUN([AC_PC_FROM_UCONTEXT],\n  [AC_CHECK_HEADERS(ucontext.h)\n   AC_CHECK_HEADERS(sys/ucontext.h)       # ucontext on OS X 10.6 (at least)\n   AC_MSG_CHECKING([how to access the program counter from a struct ucontext])\n   pc_fields=\"           uc_mcontext.gregs[[REG_PC]]\"  # Solaris x86 (32 + 64 bit)\n   pc_fields=\"$pc_fields uc_mcontext.gregs[[REG_EIP]]\" # Linux (i386)\n   pc_fields=\"$pc_fields uc_mcontext.gregs[[REG_RIP]]\" # Linux (x86_64)\n   pc_fields=\"$pc_fields uc_mcontext.sc_ip\"            # Linux (ia64)\n   pc_fields=\"$pc_fields uc_mcontext.uc_regs->gregs[[PT_NIP]]\" # Linux (ppc)\n   pc_fields=\"$pc_fields uc_mcontext.gregs[[R15]]\"     # Linux (arm old [untested])\n   pc_fields=\"$pc_fields uc_mcontext.arm_pc\"           # Linux (arm new [untested])\n   pc_fields=\"$pc_fields uc_mcontext.mc_eip\"           # FreeBSD (i386)\n   pc_fields=\"$pc_fields uc_mcontext.mc_rip\"           # FreeBSD (x86_64 [untested])\n   pc_fields=\"$pc_fields uc_mcontext.__gregs[[_REG_EIP]]\"  # NetBSD (i386)\n   pc_fields=\"$pc_fields uc_mcontext.__gregs[[_REG_RIP]]\"  # NetBSD (x86_64)\n   pc_fields=\"$pc_fields uc_mcontext->ss.eip\"          # OS X (i386, <=10.4)\n   pc_fields=\"$pc_fields uc_mcontext->__ss.__eip\"      # OS X (i386, >=10.5)\n   pc_fields=\"$pc_fields uc_mcontext->ss.rip\"          # OS X (x86_64)\n   pc_fields=\"$pc_fields uc_mcontext->__ss.__rip\"      # OS X (>=10.5 [untested])\n   pc_fields=\"$pc_fields uc_mcontext->ss.srr0\"         # OS X (ppc, ppc64 [untested])\n   pc_fields=\"$pc_fields uc_mcontext->__ss.__srr0\"     # OS X (>=10.5 [untested])\n   pc_field_found=false\n   for pc_field in $pc_fields; do\n     if ! $pc_field_found; then\n       if test \"x$ac_cv_header_sys_ucontext_h\" = xyes; then\n         AC_TRY_COMPILE([#define _GNU_SOURCE 1\n                         #include <sys/ucontext.h>],\n                        [ucontext_t u; return u.$pc_field == 0;],\n                        AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field,\n                                           How to access the PC from a struct ucontext)\n                        AC_MSG_RESULT([$pc_field])\n                        pc_field_found=true)\n       else\n         AC_TRY_COMPILE([#define _GNU_SOURCE 1\n                         #include <ucontext.h>],\n                        [ucontext_t u; return u.$pc_field == 0;],\n                        AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field,\n                                           How to access the PC from a struct ucontext)\n                        AC_MSG_RESULT([$pc_field])\n                        pc_field_found=true)\n       fi\n     fi\n   done\n   if ! $pc_field_found; then\n     pc_fields=\"           sc_eip\"  # OpenBSD (i386)\n     pc_fields=\"$pc_fields sc_rip\"  # OpenBSD (x86_64)\n     for pc_field in $pc_fields; do\n       if ! $pc_field_found; then\n         AC_TRY_COMPILE([#include <signal.h>],\n                        [ucontext_t u; return u.$pc_field == 0;],\n                        AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field,\n                                           How to access the PC from a struct ucontext)\n                        AC_MSG_RESULT([$pc_field])\n                        pc_field_found=true)\n       fi\n     done\n   fi\n   if ! $pc_field_found; then\n     [$1]\n   fi])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/stl_namespace.m4",
    "content": "# We check what namespace stl code like vector expects to be executed in\n\nAC_DEFUN([AC_CXX_STL_NAMESPACE],\n  [AC_CACHE_CHECK(\n      what namespace STL code is in,\n      ac_cv_cxx_stl_namespace,\n      [AC_REQUIRE([AC_CXX_NAMESPACES])\n      AC_LANG_SAVE\n      AC_LANG_CPLUSPLUS\n      AC_TRY_COMPILE([#include <vector>],\n                     [vector<int> t; return 0;],\n                     ac_cv_cxx_stl_namespace=none)\n      AC_TRY_COMPILE([#include <vector>],\n                     [std::vector<int> t; return 0;],\n                     ac_cv_cxx_stl_namespace=std)\n      AC_LANG_RESTORE])\n   if test \"$ac_cv_cxx_stl_namespace\" = none; then\n      AC_DEFINE(STL_NAMESPACE,,\n                [the namespace where STL code like vector<> is defined])\n   fi\n   if test \"$ac_cv_cxx_stl_namespace\" = std; then\n      AC_DEFINE(STL_NAMESPACE,std,\n                [the namespace where STL code like vector<> is defined])\n   fi\n])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/m4/using_operator.m4",
    "content": "AC_DEFUN([AC_CXX_USING_OPERATOR],\n  [AC_CACHE_CHECK(\n      whether compiler supports using ::operator<<,\n      ac_cv_cxx_using_operator,\n      [AC_LANG_SAVE\n       AC_LANG_CPLUSPLUS\n       AC_TRY_COMPILE([#include <iostream>\n                       std::ostream& operator<<(std::ostream&, struct s);],\n                      [using ::operator<<; return 0;],\n                      ac_cv_cxx_using_operator=1,\n\t\t      ac_cv_cxx_using_operator=0)\n      AC_LANG_RESTORE])\n  if test \"$ac_cv_cxx_using_operator\" = 1; then\n    AC_DEFINE(HAVE_USING_OPERATOR, 1, [define if the compiler supports using expression for operator])\n  fi])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/missing",
    "content": "#! /bin/sh\n# Common stub for a few missing GNU programs while installing.\n\nscriptversion=2006-05-10.23\n\n# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006\n#   Free Software Foundation, Inc.\n# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.\n\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\n# 02110-1301, USA.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\nif test $# -eq 0; then\n  echo 1>&2 \"Try \\`$0 --help' for more information\"\n  exit 1\nfi\n\nrun=:\nsed_output='s/.* --output[ =]\\([^ ]*\\).*/\\1/p'\nsed_minuso='s/.* -o \\([^ ]*\\).*/\\1/p'\n\n# In the cases where this matters, `missing' is being run in the\n# srcdir already.\nif test -f configure.ac; then\n  configure_ac=configure.ac\nelse\n  configure_ac=configure.in\nfi\n\nmsg=\"missing on your system\"\n\ncase $1 in\n--run)\n  # Try to run requested program, and just exit if it succeeds.\n  run=\n  shift\n  \"$@\" && exit 0\n  # Exit code 63 means version mismatch.  This often happens\n  # when the user try to use an ancient version of a tool on\n  # a file that requires a minimum version.  In this case we\n  # we should proceed has if the program had been absent, or\n  # if --run hadn't been passed.\n  if test $? = 63; then\n    run=:\n    msg=\"probably too old\"\n  fi\n  ;;\n\n  -h|--h|--he|--hel|--help)\n    echo \"\\\n$0 [OPTION]... PROGRAM [ARGUMENT]...\n\nHandle \\`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an\nerror status if there is no known handling for PROGRAM.\n\nOptions:\n  -h, --help      display this help and exit\n  -v, --version   output version information and exit\n  --run           try to run the given command, and emulate it if it fails\n\nSupported PROGRAM values:\n  aclocal      touch file \\`aclocal.m4'\n  autoconf     touch file \\`configure'\n  autoheader   touch file \\`config.h.in'\n  autom4te     touch the output file, or create a stub one\n  automake     touch all \\`Makefile.in' files\n  bison        create \\`y.tab.[ch]', if possible, from existing .[ch]\n  flex         create \\`lex.yy.c', if possible, from existing .c\n  help2man     touch the output file\n  lex          create \\`lex.yy.c', if possible, from existing .c\n  makeinfo     touch the output file\n  tar          try tar, gnutar, gtar, then tar without non-portable flags\n  yacc         create \\`y.tab.[ch]', if possible, from existing .[ch]\n\nSend bug reports to <bug-automake@gnu.org>.\"\n    exit $?\n    ;;\n\n  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)\n    echo \"missing $scriptversion (GNU Automake)\"\n    exit $?\n    ;;\n\n  -*)\n    echo 1>&2 \"$0: Unknown \\`$1' option\"\n    echo 1>&2 \"Try \\`$0 --help' for more information\"\n    exit 1\n    ;;\n\nesac\n\n# Now exit if we have it, but it failed.  Also exit now if we\n# don't have it and --version was passed (most likely to detect\n# the program).\ncase $1 in\n  lex|yacc)\n    # Not GNU programs, they don't have --version.\n    ;;\n\n  tar)\n    if test -n \"$run\"; then\n       echo 1>&2 \"ERROR: \\`tar' requires --run\"\n       exit 1\n    elif test \"x$2\" = \"x--version\" || test \"x$2\" = \"x--help\"; then\n       exit 1\n    fi\n    ;;\n\n  *)\n    if test -z \"$run\" && ($1 --version) > /dev/null 2>&1; then\n       # We have it, but it failed.\n       exit 1\n    elif test \"x$2\" = \"x--version\" || test \"x$2\" = \"x--help\"; then\n       # Could not run --version or --help.  This is probably someone\n       # running `$TOOL --version' or `$TOOL --help' to check whether\n       # $TOOL exists and not knowing $TOOL uses missing.\n       exit 1\n    fi\n    ;;\nesac\n\n# If it does not exist, or fails to run (possibly an outdated version),\n# try to emulate it.\ncase $1 in\n  aclocal*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`acinclude.m4' or \\`${configure_ac}'.  You might want\n         to install the \\`Automake' and \\`Perl' packages.  Grab them from\n         any GNU archive site.\"\n    touch aclocal.m4\n    ;;\n\n  autoconf)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`${configure_ac}'.  You might want to install the\n         \\`Autoconf' and \\`GNU m4' packages.  Grab them from any GNU\n         archive site.\"\n    touch configure\n    ;;\n\n  autoheader)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`acconfig.h' or \\`${configure_ac}'.  You might want\n         to install the \\`Autoconf' and \\`GNU m4' packages.  Grab them\n         from any GNU archive site.\"\n    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\\([^)]*\\)).*/\\1/p' ${configure_ac}`\n    test -z \"$files\" && files=\"config.h\"\n    touch_files=\n    for f in $files; do\n      case $f in\n      *:*) touch_files=\"$touch_files \"`echo \"$f\" |\n\t\t\t\t       sed -e 's/^[^:]*://' -e 's/:.*//'`;;\n      *) touch_files=\"$touch_files $f.in\";;\n      esac\n    done\n    touch $touch_files\n    ;;\n\n  automake*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`Makefile.am', \\`acinclude.m4' or \\`${configure_ac}'.\n         You might want to install the \\`Automake' and \\`Perl' packages.\n         Grab them from any GNU archive site.\"\n    find . -type f -name Makefile.am -print |\n\t   sed 's/\\.am$/.in/' |\n\t   while read f; do touch \"$f\"; done\n    ;;\n\n  autom4te)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is needed, but is $msg.\n         You might have modified some files without having the\n         proper tools for further handling them.\n         You can get \\`$1' as part of \\`Autoconf' from any GNU\n         archive site.\"\n\n    file=`echo \"$*\" | sed -n \"$sed_output\"`\n    test -z \"$file\" && file=`echo \"$*\" | sed -n \"$sed_minuso\"`\n    if test -f \"$file\"; then\n\ttouch $file\n    else\n\ttest -z \"$file\" || exec >$file\n\techo \"#! /bin/sh\"\n\techo \"# Created by GNU Automake missing as a replacement of\"\n\techo \"#  $ $@\"\n\techo \"exit 0\"\n\tchmod +x $file\n\texit 1\n    fi\n    ;;\n\n  bison|yacc)\n    echo 1>&2 \"\\\nWARNING: \\`$1' $msg.  You should only need it if\n         you modified a \\`.y' file.  You may need the \\`Bison' package\n         in order for those modifications to take effect.  You can get\n         \\`Bison' from any GNU archive site.\"\n    rm -f y.tab.c y.tab.h\n    if test $# -ne 1; then\n        eval LASTARG=\"\\${$#}\"\n\tcase $LASTARG in\n\t*.y)\n\t    SRCFILE=`echo \"$LASTARG\" | sed 's/y$/c/'`\n\t    if test -f \"$SRCFILE\"; then\n\t         cp \"$SRCFILE\" y.tab.c\n\t    fi\n\t    SRCFILE=`echo \"$LASTARG\" | sed 's/y$/h/'`\n\t    if test -f \"$SRCFILE\"; then\n\t         cp \"$SRCFILE\" y.tab.h\n\t    fi\n\t  ;;\n\tesac\n    fi\n    if test ! -f y.tab.h; then\n\techo >y.tab.h\n    fi\n    if test ! -f y.tab.c; then\n\techo 'main() { return 0; }' >y.tab.c\n    fi\n    ;;\n\n  lex|flex)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified a \\`.l' file.  You may need the \\`Flex' package\n         in order for those modifications to take effect.  You can get\n         \\`Flex' from any GNU archive site.\"\n    rm -f lex.yy.c\n    if test $# -ne 1; then\n        eval LASTARG=\"\\${$#}\"\n\tcase $LASTARG in\n\t*.l)\n\t    SRCFILE=`echo \"$LASTARG\" | sed 's/l$/c/'`\n\t    if test -f \"$SRCFILE\"; then\n\t         cp \"$SRCFILE\" lex.yy.c\n\t    fi\n\t  ;;\n\tesac\n    fi\n    if test ! -f lex.yy.c; then\n\techo 'main() { return 0; }' >lex.yy.c\n    fi\n    ;;\n\n  help2man)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n\t you modified a dependency of a manual page.  You may need the\n\t \\`Help2man' package in order for those modifications to take\n\t effect.  You can get \\`Help2man' from any GNU archive site.\"\n\n    file=`echo \"$*\" | sed -n \"$sed_output\"`\n    test -z \"$file\" && file=`echo \"$*\" | sed -n \"$sed_minuso\"`\n    if test -f \"$file\"; then\n\ttouch $file\n    else\n\ttest -z \"$file\" || exec >$file\n\techo \".ab help2man is required to generate this page\"\n\texit 1\n    fi\n    ;;\n\n  makeinfo)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified a \\`.texi' or \\`.texinfo' file, or any other file\n         indirectly affecting the aspect of the manual.  The spurious\n         call might also be the consequence of using a buggy \\`make' (AIX,\n         DU, IRIX).  You might want to install the \\`Texinfo' package or\n         the \\`GNU make' package.  Grab either from any GNU archive site.\"\n    # The file to touch is that specified with -o ...\n    file=`echo \"$*\" | sed -n \"$sed_output\"`\n    test -z \"$file\" && file=`echo \"$*\" | sed -n \"$sed_minuso\"`\n    if test -z \"$file\"; then\n      # ... or it is the one specified with @setfilename ...\n      infile=`echo \"$*\" | sed 's/.* \\([^ ]*\\) *$/\\1/'`\n      file=`sed -n '\n\t/^@setfilename/{\n\t  s/.* \\([^ ]*\\) *$/\\1/\n\t  p\n\t  q\n\t}' $infile`\n      # ... or it is derived from the source name (dir/f.texi becomes f.info)\n      test -z \"$file\" && file=`echo \"$infile\" | sed 's,.*/,,;s,.[^.]*$,,'`.info\n    fi\n    # If the file does not exist, the user really needs makeinfo;\n    # let's fail without touching anything.\n    test -f $file || exit 1\n    touch $file\n    ;;\n\n  tar)\n    shift\n\n    # We have already tried tar in the generic part.\n    # Look for gnutar/gtar before invocation to avoid ugly error\n    # messages.\n    if (gnutar --version > /dev/null 2>&1); then\n       gnutar \"$@\" && exit 0\n    fi\n    if (gtar --version > /dev/null 2>&1); then\n       gtar \"$@\" && exit 0\n    fi\n    firstarg=\"$1\"\n    if shift; then\n\tcase $firstarg in\n\t*o*)\n\t    firstarg=`echo \"$firstarg\" | sed s/o//`\n\t    tar \"$firstarg\" \"$@\" && exit 0\n\t    ;;\n\tesac\n\tcase $firstarg in\n\t*h*)\n\t    firstarg=`echo \"$firstarg\" | sed s/h//`\n\t    tar \"$firstarg\" \"$@\" && exit 0\n\t    ;;\n\tesac\n    fi\n\n    echo 1>&2 \"\\\nWARNING: I can't seem to be able to run \\`tar' with the given arguments.\n         You may want to install GNU tar or Free paxutils, or check the\n         command line arguments.\"\n    exit 1\n    ;;\n\n  *)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is needed, and is $msg.\n         You might have modified some files without having the\n         proper tools for further handling them.  Check the \\`README' file,\n         it often tells you about the needed prerequisites for installing\n         this package.  You may also peek at any GNU archive site, in case\n         some other package would contain this missing \\`$1' program.\"\n    exit 1\n    ;;\nesac\n\nexit 0\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-end: \"$\"\n# End:\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/mkinstalldirs",
    "content": "#! /bin/sh\n# mkinstalldirs --- make directory hierarchy\n\nscriptversion=2006-05-11.19\n\n# Original author: Noah Friedman <friedman@prep.ai.mit.edu>\n# Created: 1993-05-16\n# Public domain.\n#\n# This file is maintained in Automake, please report\n# bugs to <bug-automake@gnu.org> or send patches to\n# <automake-patches@gnu.org>.\n\nnl='\n'\nIFS=\" \"\"\t$nl\"\nerrstatus=0\ndirmode=\n\nusage=\"\\\nUsage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...\n\nCreate each directory DIR (with mode MODE, if specified), including all\nleading file name components.\n\nReport bugs to <bug-automake@gnu.org>.\"\n\n# process command line arguments\nwhile test $# -gt 0 ; do\n  case $1 in\n    -h | --help | --h*)         # -h for help\n      echo \"$usage\"\n      exit $?\n      ;;\n    -m)                         # -m PERM arg\n      shift\n      test $# -eq 0 && { echo \"$usage\" 1>&2; exit 1; }\n      dirmode=$1\n      shift\n      ;;\n    --version)\n      echo \"$0 $scriptversion\"\n      exit $?\n      ;;\n    --)                         # stop option processing\n      shift\n      break\n      ;;\n    -*)                         # unknown option\n      echo \"$usage\" 1>&2\n      exit 1\n      ;;\n    *)                          # first non-opt arg\n      break\n      ;;\n  esac\ndone\n\nfor file\ndo\n  if test -d \"$file\"; then\n    shift\n  else\n    break\n  fi\ndone\n\ncase $# in\n  0) exit 0 ;;\nesac\n\n# Solaris 8's mkdir -p isn't thread-safe.  If you mkdir -p a/b and\n# mkdir -p a/c at the same time, both will detect that a is missing,\n# one will create a, then the other will try to create a and die with\n# a \"File exists\" error.  This is a problem when calling mkinstalldirs\n# from a parallel make.  We use --version in the probe to restrict\n# ourselves to GNU mkdir, which is thread-safe.\ncase $dirmode in\n  '')\n    if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then\n      echo \"mkdir -p -- $*\"\n      exec mkdir -p -- \"$@\"\n    else\n      # On NextStep and OpenStep, the `mkdir' command does not\n      # recognize any option.  It will interpret all options as\n      # directories to create, and then abort because `.' already\n      # exists.\n      test -d ./-p && rmdir ./-p\n      test -d ./--version && rmdir ./--version\n    fi\n    ;;\n  *)\n    if mkdir -m \"$dirmode\" -p --version . >/dev/null 2>&1 &&\n       test ! -d ./--version; then\n      echo \"mkdir -m $dirmode -p -- $*\"\n      exec mkdir -m \"$dirmode\" -p -- \"$@\"\n    else\n      # Clean up after NextStep and OpenStep mkdir.\n      for d in ./-m ./-p ./--version \"./$dirmode\";\n      do\n        test -d $d && rmdir $d\n      done\n    fi\n    ;;\nesac\n\nfor file\ndo\n  case $file in\n    /*) pathcomp=/ ;;\n    *)  pathcomp= ;;\n  esac\n  oIFS=$IFS\n  IFS=/\n  set fnord $file\n  shift\n  IFS=$oIFS\n\n  for d\n  do\n    test \"x$d\" = x && continue\n\n    pathcomp=$pathcomp$d\n    case $pathcomp in\n      -*) pathcomp=./$pathcomp ;;\n    esac\n\n    if test ! -d \"$pathcomp\"; then\n      echo \"mkdir $pathcomp\"\n\n      mkdir \"$pathcomp\" || lasterr=$?\n\n      if test ! -d \"$pathcomp\"; then\n\terrstatus=$lasterr\n      else\n\tif test ! -z \"$dirmode\"; then\n\t  echo \"chmod $dirmode $pathcomp\"\n\t  lasterr=\n\t  chmod \"$dirmode\" \"$pathcomp\" || lasterr=$?\n\n\t  if test ! -z \"$lasterr\"; then\n\t    errstatus=$lasterr\n\t  fi\n\tfi\n      fi\n    fi\n\n    pathcomp=$pathcomp/\n  done\ndone\n\nexit $errstatus\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-end: \"$\"\n# End:\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/deb/README",
    "content": "The list of files here isn't complete.  For a step-by-step guide on\nhow to set this package up correctly, check out\n    http://www.debian.org/doc/maint-guide/\n\nMost of the files that are in this directory are boilerplate.\nHowever, you may need to change the list of binary-arch dependencies\nin 'rules'.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/deb/changelog",
    "content": "google-glog (0.3.1-1) unstable; urgency=low\n\n  * New upstream release.\n\n -- Google Inc. <opensource@google.com>  Tue, 15 Jun 2010 13:50:47 +0900\n\ngoogle-glog (0.3-1) unstable; urgency=low\n\n  * New upstream release.\n\n -- Google Inc. <opensource@google.com>  Thu, 30 Jul 2009 21:31:35 +0900\n\ngoogle-glog (0.2.1-1) unstable; urgency=low\n\n  * New upstream release.\n\n -- Google Inc. <opensource@google.com>  Fri, 10 Apr 2009 15:24:17 +0900\n\ngoogle-glog (0.2-1) unstable; urgency=low\n\n  * New upstream release.\n\n -- Google Inc. <opensource@google.com>  Fri, 23 Jan 2009 03:14:29 +0900\n\ngoogle-glog (0.1.2-1) unstable; urgency=low\n\n  * New upstream release.\n\n -- Google Inc. <opensource@google.com>  Tue, 18 Nov 2008 20:37:00 +0900\n\ngoogle-glog (0.1.1-1) unstable; urgency=low\n\n  * New upstream release.\n\n -- Google Inc. <opensource@google.com>  Wed, 15 Oct 2008 20:38:19 +0900\n\ngoogle-glog (0.1-1) unstable; urgency=low\n\n  * Initial release.\n\n -- Google Inc. <opensource@google.com>  Sat, 10 May 2008 12:31:10 +0900\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/deb/compat",
    "content": "4\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/deb/control",
    "content": "Source: google-glog\nPriority: optional\nMaintainer: Google Inc. <opensource@google.com>\nBuild-Depends: debhelper (>= 4.0.0), binutils\nStandards-Version: 3.6.1\n\nPackage: libgoogle-glog-dev\nSection: libdevel\nArchitecture: any\nDepends: libgoogle-glog0 (= ${Source-Version})\nDescription:  a library that implements application-level logging.\n This library provides logging APIs based on C++-style streams and\n various helper macros.  The devel package contains static and debug\n libraries and header files for developing applications that use the\n google-glog package.\n\nPackage: libgoogle-glog0\nSection: libs\nArchitecture: any\nDepends: ${shlibs:Depends}\nDescription:  a library that implements application-level logging.\n This library provides logging APIs based on C++-style streams and\n various helper macros.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/deb/copyright",
    "content": "This package was debianized by Google Inc. <opensource@google.com> on\n13 June 2008.\n\nIt was downloaded from http://code.google.com/\n\nUpstream Author: opensource@google.com\n\nCopyright (c) 2008, Google Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n    * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/deb/docs",
    "content": "AUTHORS\nCOPYING\nChangeLog\nINSTALL\nNEWS\nREADME\ndoc/designstyle.css\ndoc/glog.html\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.dirs",
    "content": "usr/lib\nusr/lib/pkgconfig\nusr/include\nusr/include/glog\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.install",
    "content": "usr/include/glog/*\nusr/lib/lib*.so\nusr/lib/lib*.a\nusr/lib/*.la\nusr/lib/pkgconfig/*\ndebian/tmp/usr/include/glog/*\ndebian/tmp/usr/lib/lib*.so\ndebian/tmp/usr/lib/lib*.a\ndebian/tmp/usr/lib/*.la\ndebian/tmp/usr/lib/pkgconfig/*\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.dirs",
    "content": "usr/lib\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.install",
    "content": "usr/lib/lib*.so.*\ndebian/tmp/usr/lib/lib*.so.*\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/deb/rules",
    "content": "#!/usr/bin/make -f\n# -*- makefile -*-\n# Sample debian/rules that uses debhelper.\n# This file was originally written by Joey Hess and Craig Small.\n# As a special exception, when this file is copied by dh-make into a\n# dh-make output file, you may use that output file without restriction.\n# This special exception was added by Craig Small in version 0.37 of dh-make.\n\n# Uncomment this to turn on verbose mode.\n#export DH_VERBOSE=1\n\n\n# These are used for cross-compiling and for saving the configure script\n# from having to guess our platform (since we know it already)\nDEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)\nDEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)\n\n\nCFLAGS = -Wall -g\n\nifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))\n\tCFLAGS += -O0\nelse\n\tCFLAGS += -O2\nendif\nifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))\n\tINSTALL_PROGRAM += -s\nendif\n\n# shared library versions, option 1\n#version=2.0.5\n#major=2\n# option 2, assuming the library is created as src/.libs/libfoo.so.2.0.5 or so\nversion=`ls src/.libs/lib*.so.* | \\\n awk '{if (match($$0,/[0-9]+\\.[0-9]+\\.[0-9]+$$/)) print substr($$0,RSTART)}'`\nmajor=`ls src/.libs/lib*.so.* | \\\n awk '{if (match($$0,/\\.so\\.[0-9]+$$/)) print substr($$0,RSTART+4)}'`\n\nconfig.status: configure\n\tdh_testdir\n\t# Add here commands to configure the package.\n\tCFLAGS=\"$(CFLAGS)\" ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --mandir=\\$${prefix}/share/man --infodir=\\$${prefix}/share/info\n\n\nbuild: build-stamp\nbuild-stamp:  config.status\n\tdh_testdir\n\n\t# Add here commands to compile the package.\n\t$(MAKE)\n\n\ttouch build-stamp\n\nclean:\n\tdh_testdir\n\tdh_testroot\n\trm -f build-stamp \n\n\t# Add here commands to clean up after the build process.\n\t-$(MAKE) distclean\nifneq \"$(wildcard /usr/share/misc/config.sub)\" \"\"\n\tcp -f /usr/share/misc/config.sub config.sub\nendif\nifneq \"$(wildcard /usr/share/misc/config.guess)\" \"\"\n\tcp -f /usr/share/misc/config.guess config.guess\nendif\n\n\n\tdh_clean \n\ninstall: build\n\tdh_testdir\n\tdh_testroot\n\tdh_clean -k \n\tdh_installdirs\n\n\t# Add here commands to install the package into debian/tmp\n\t$(MAKE) install DESTDIR=$(CURDIR)/debian/tmp\n\n\n# Build architecture-independent files here.\nbinary-indep: build install\n# We have nothing to do by default.\n\n# Build architecture-dependent files here.\nbinary-arch: build install\n\tdh_testdir\n\tdh_testroot\n\tdh_installchangelogs ChangeLog\n\tdh_installdocs\n\tdh_installexamples\n\tdh_install --sourcedir=debian/tmp\n#\tdh_installmenu\n#\tdh_installdebconf\t\n#\tdh_installlogrotate\n#\tdh_installemacsen\n#\tdh_installpam\n#\tdh_installmime\n#\tdh_installinit\n#\tdh_installcron\n#\tdh_installinfo\n\tdh_installman\n\tdh_link\n\tdh_strip\n\tdh_compress\n\tdh_fixperms\n#\tdh_perl\n#\tdh_python\n\tdh_makeshlibs\n\tdh_installdeb\n\tdh_shlibdeps\n\tdh_gencontrol\n\tdh_md5sums\n\tdh_builddeb\n\nbinary: binary-indep binary-arch\n.PHONY: build clean binary-indep binary-arch binary install \n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/deb.sh",
    "content": "#!/bin/bash -e\n\n# This takes one commandline argument, the name of the package.  If no\n# name is given, then we'll end up just using the name associated with\n# an arbitrary .tar.gz file in the rootdir.  That's fine: there's probably\n# only one.\n#\n# Run this from the 'packages' directory, just under rootdir\n\n## Set LIB to lib if exporting a library, empty-string else\nLIB=\n#LIB=lib\n\nPACKAGE=\"$1\"\nVERSION=\"$2\"\n\n# We can only build Debian packages, if the Debian build tools are installed\nif [ \\! -x /usr/bin/debuild ]; then\n  echo \"Cannot find /usr/bin/debuild. Not building Debian packages.\" 1>&2\n  exit 0\nfi\n\n# Double-check we're in the packages directory, just under rootdir\nif [ \\! -r ../Makefile -a \\! -r ../INSTALL ]; then\n  echo \"Must run $0 in the 'packages' directory, under the root directory.\" 1>&2\n  echo \"Also, you must run \\\"make dist\\\" before running this script.\" 1>&2\n  exit 0\nfi\n\n# Find the top directory for this package\ntopdir=\"${PWD%/*}\"\n\n# Find the tar archive built by \"make dist\"\narchive=\"$PACKAGE-$VERSION\"\nif [ -z \"${archive}\" ]; then\n  echo \"Cannot find ../$PACKAGE*.tar.gz. Run \\\"make dist\\\" first.\" 1>&2\n  exit 0\nfi\n\n# Create a pristine directory for building the Debian package files\ntrap 'rm -rf '`pwd`/tmp'; exit $?' EXIT SIGHUP SIGINT SIGTERM\n\nrm -rf tmp\nmkdir -p tmp\ncd tmp\n\n# Debian has very specific requirements about the naming of build\n# directories, and tar archives. It also wants to write all generated\n# packages to the parent of the source directory. We accommodate these\n# requirements by building directly from the tar file.\nln -s \"${topdir}/${archive}.tar.gz\" \"${LIB}${archive}.orig.tar.gz\"\ntar zfx \"${LIB}${archive}.orig.tar.gz\"\n[ -n \"${LIB}\" ] && mv \"${archive}\" \"${LIB}${archive}\"\ncd \"${LIB}${archive}\"\n# This is one of those 'specific requirements': where the deb control files live\nln -s \"packages/deb\" \"debian\"\n\n# Now, we can call Debian's standard build tool\ndebuild -uc -us\ncd ../..                            # get back to the original top-level dir\n\n# We'll put the result in a subdirectory that's named after the OS version\n# we've made this .deb file for.\ndestdir=\"debian-$(cat /etc/debian_version 2>/dev/null || echo UNKNOWN)\"\n\nrm -rf \"$destdir\"\nmkdir -p \"$destdir\"\nmv $(find tmp -mindepth 1 -maxdepth 1 -type f) \"$destdir\"\n\necho\necho \"The Debian package files are located in $PWD/$destdir\"\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/rpm/rpm.spec",
    "content": "%define\tRELEASE\t1\n%define rel     %{?CUSTOM_RELEASE} %{!?CUSTOM_RELEASE:%RELEASE}\n%define\tprefix\t/usr\n\nName: %NAME\nSummary: A C++ application logging library\nVersion: %VERSION\nRelease: %rel\nGroup: Development/Libraries\nURL: http://code.google.com/p/google-glog\nLicense: BSD\nVendor: Google\nPackager: Google Inc. <opensource@google.com>\nSource: http://%{NAME}.googlecode.com/files/%{NAME}-%{VERSION}.tar.gz\nDistribution: Redhat 7 and above.\nBuildroot: %{_tmppath}/%{name}-root\nPrefix: %prefix\n\n%description\nThe %name package contains a library that implements application-level\nlogging.  This library provides logging APIs based on C++-style\nstreams and various helper macros.\n\n%package devel\nSummary: A C++ application logging library\nGroup: Development/Libraries\nRequires: %{NAME} = %{VERSION}\n\n%description devel\nThe %name-devel package contains static and debug libraries and header\nfiles for developing applications that use the %name package.\n\n%changelog\n    * Wed Mar 26 2008 <opensource@google.com>\n    - First draft\n\n%prep\n%setup\n\n%build\n./configure\nmake prefix=%prefix\n\n%install\nrm -rf $RPM_BUILD_ROOT\nmake prefix=$RPM_BUILD_ROOT%{prefix} install\n\n%clean\nrm -rf $RPM_BUILD_ROOT\n\n%files\n%defattr(-,root,root)\n\n## Mark all installed files within /usr/share/doc/{package name} as\n## documentation.  This depends on the following two lines appearing in\n## Makefile.am:\n##     docdir = $(prefix)/share/doc/$(PACKAGE)-$(VERSION)\n##     dist_doc_DATA = AUTHORS COPYING ChangeLog INSTALL NEWS README\n%docdir %{prefix}/share/doc/%{NAME}-%{VERSION}\n%{prefix}/share/doc/%{NAME}-%{VERSION}/*\n\n%{prefix}/lib/libglog.so.0\n%{prefix}/lib/libglog.so.0.0.0\n\n%files devel\n%defattr(-,root,root)\n\n%{prefix}/include/glog\n%{prefix}/lib/libglog.a\n%{prefix}/lib/libglog.la\n%{prefix}/lib/libglog.so\n%{prefix}/lib/pkgconfig/libglog.pc\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/packages/rpm.sh",
    "content": "#!/bin/sh -e\n\n# Run this from the 'packages' directory, just under rootdir\n\n# We can only build rpm packages, if the rpm build tools are installed\nif [ \\! -x /usr/bin/rpmbuild ]\nthen\n  echo \"Cannot find /usr/bin/rpmbuild. Not building an rpm.\" 1>&2\n  exit 0\nfi\n\n# Check the commandline flags\nPACKAGE=\"$1\"\nVERSION=\"$2\"\nfullname=\"${PACKAGE}-${VERSION}\"\narchive=../$fullname.tar.gz\n\nif [ -z \"$1\" -o -z \"$2\" ]\nthen\n  echo \"Usage: $0 <package name> <package version>\" 1>&2\n  exit 0\nfi\n\n# Double-check we're in the packages directory, just under rootdir\nif [ \\! -r ../Makefile -a \\! -r ../INSTALL ]\nthen\n  echo \"Must run $0 in the 'packages' directory, under the root directory.\" 1>&2\n  echo \"Also, you must run \\\"make dist\\\" before running this script.\" 1>&2\n  exit 0\nfi\n\nif [ \\! -r \"$archive\" ]\nthen\n  echo \"Cannot find $archive. Run \\\"make dist\\\" first.\" 1>&2\n  exit 0\nfi\n\n# Create the directory where the input lives, and where the output should live\nRPM_SOURCE_DIR=\"/tmp/rpmsource-$fullname\"\nRPM_BUILD_DIR=\"/tmp/rpmbuild-$fullname\"\n\ntrap 'rm -rf $RPM_SOURCE_DIR $RPM_BUILD_DIR; exit $?' EXIT SIGHUP SIGINT SIGTERM\n\nrm -rf \"$RPM_SOURCE_DIR\" \"$RPM_BUILD_DIR\"\nmkdir \"$RPM_SOURCE_DIR\"\nmkdir \"$RPM_BUILD_DIR\"\n\ncp \"$archive\" \"$RPM_SOURCE_DIR\"\n\nrpmbuild -bb rpm/rpm.spec \\\n  --define \"NAME $PACKAGE\" \\\n  --define \"VERSION $VERSION\" \\\n  --define \"_sourcedir $RPM_SOURCE_DIR\" \\\n  --define \"_builddir $RPM_BUILD_DIR\" \\\n  --define \"_rpmdir $RPM_SOURCE_DIR\"\n\n# We put the output in a directory based on what system we've built for\ndestdir=rpm-unknown\nif [ -r /etc/issue ]\nthen\n   grep \"Red Hat.*release 7\" /etc/issue >/dev/null 2>&1 && destdir=rh7\n   grep \"Red Hat.*release 8\" /etc/issue >/dev/null 2>&1 && destdir=rh8\n   grep \"Red Hat.*release 9\" /etc/issue >/dev/null 2>&1 && destdir=rh9\n   if grep Fedora /etc/issue >/dev/null; then \n\tdestdir=fc`grep Fedora /etc/issue | cut -d' ' -f 4`;\n   fi\nfi\n\nrm -rf \"$destdir\"\nmkdir -p \"$destdir\"\n# We want to get not only the main package but devel etc, hence the middle *\nmv \"$RPM_SOURCE_DIR\"/*/\"${PACKAGE}\"-*\"${VERSION}\"*.rpm \"$destdir\"\n\necho\necho \"The rpm package file(s) are located in $PWD/$destdir\"\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/base/commandlineflags.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n// \n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// ---\n// This file is a compatibility layer that defines Google's version of\n// command line flags that are used for configuration.\n//\n// We put flags into their own namespace.  It is purposefully\n// named in an opaque way that people should have trouble typing\n// directly.  The idea is that DEFINE puts the flag in the weird\n// namespace, and DECLARE imports the flag from there into the\n// current namespace.  The net result is to force people to use\n// DECLARE to get access to a flag, rather than saying\n//   extern bool FLAGS_logtostderr;\n// or some such instead.  We want this so we can put extra\n// functionality (like sanity-checking) in DECLARE if we want,\n// and make sure it is picked up everywhere.\n//\n// We also put the type of the variable in the namespace, so that\n// people can't DECLARE_int32 something that they DEFINE_bool'd\n// elsewhere.\n#ifndef BASE_COMMANDLINEFLAGS_H__\n#define BASE_COMMANDLINEFLAGS_H__\n\n#include \"config.h\"\n#include <string>\n#include <string.h>               // for memchr\n#include <stdlib.h>               // for getenv\n\n#ifdef HAVE_LIB_GFLAGS\n\n#include <gflags/gflags.h>\n\n#else\n\n#include \"glog/logging.h\"\n\n#define DECLARE_VARIABLE(type, name, tn)                                      \\\n  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead {  \\\n  extern GOOGLE_GLOG_DLL_DECL type FLAGS_##name;                              \\\n  }                                                                           \\\n  using FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead::FLAGS_##name\n#define DEFINE_VARIABLE(type, name, value, meaning, tn) \\\n  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead {  \\\n  GOOGLE_GLOG_DLL_DECL type FLAGS_##name(value);                              \\\n  char FLAGS_no##name;                                                        \\\n  }                                                                           \\\n  using FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead::FLAGS_##name\n\n// bool specialization\n#define DECLARE_bool(name) \\\n  DECLARE_VARIABLE(bool, name, bool)\n#define DEFINE_bool(name, value, meaning) \\\n  DEFINE_VARIABLE(bool, name, value, meaning, bool)\n\n// int32 specialization\n#define DECLARE_int32(name) \\\n  DECLARE_VARIABLE(GOOGLE_NAMESPACE::int32, name, int32)\n#define DEFINE_int32(name, value, meaning) \\\n  DEFINE_VARIABLE(GOOGLE_NAMESPACE::int32, name, value, meaning, int32)\n\n// Special case for string, because we have to specify the namespace\n// std::string, which doesn't play nicely with our FLAG__namespace hackery.\n#define DECLARE_string(name)                                          \\\n  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead {  \\\n  extern GOOGLE_GLOG_DLL_DECL std::string FLAGS_##name;                       \\\n  }                                                                           \\\n  using FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead::FLAGS_##name\n#define DEFINE_string(name, value, meaning)                                   \\\n  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead {  \\\n  GOOGLE_GLOG_DLL_DECL std::string FLAGS_##name(value);                       \\\n  char FLAGS_no##name;                                                        \\\n  }                                                                           \\\n  using FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead::FLAGS_##name\n\n#endif  // HAVE_LIB_GFLAGS\n\n// Define GLOG_DEFINE_* using DEFINE_* . By using these macros, we\n// have GLOG_* environ variables even if we have gflags installed.\n//\n// If both an environment variable and a flag are specified, the value\n// specified by a flag wins. E.g., if GLOG_v=0 and --v=1, the\n// verbosity will be 1, not 0.\n\n#define GLOG_DEFINE_bool(name, value, meaning) \\\n  DEFINE_bool(name, EnvToBool(\"GLOG_\" #name, value), meaning)\n\n#define GLOG_DEFINE_int32(name, value, meaning) \\\n  DEFINE_int32(name, EnvToInt(\"GLOG_\" #name, value), meaning)\n\n#define GLOG_DEFINE_string(name, value, meaning) \\\n  DEFINE_string(name, EnvToString(\"GLOG_\" #name, value), meaning)\n\n// These macros (could be functions, but I don't want to bother with a .cc\n// file), make it easier to initialize flags from the environment.\n\n#define EnvToString(envname, dflt)   \\\n  (!getenv(envname) ? (dflt) : getenv(envname))\n\n#define EnvToBool(envname, dflt)   \\\n  (!getenv(envname) ? (dflt) : memchr(\"tTyY1\\0\", getenv(envname)[0], 6) != NULL)\n\n#define EnvToInt(envname, dflt)  \\\n  (!getenv(envname) ? (dflt) : strtol(getenv(envname), NULL, 10))\n\n#endif  // BASE_COMMANDLINEFLAGS_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/base/googleinit.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n// \n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// ---\n// Author: Jacob Hoffman-Andrews\n\n#ifndef _GOOGLEINIT_H\n#define _GOOGLEINIT_H\n\nclass GoogleInitializer {\n public:\n  typedef void (*void_function)(void);\n  GoogleInitializer(const char* name, void_function f) {\n    f();\n  }\n};\n\n#define REGISTER_MODULE_INITIALIZER(name, body)                 \\\n  namespace {                                                   \\\n    static void google_init_module_##name () { body; }          \\\n    GoogleInitializer google_initializer_module_##name(#name,   \\\n            google_init_module_##name);                         \\\n  }\n\n#endif /* _GOOGLEINIT_H */\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/base/mutex.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n// \n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// \n// ---\n// Author: Craig Silverstein.\n//\n// A simple mutex wrapper, supporting locks and read-write locks.\n// You should assume the locks are *not* re-entrant.\n//\n// To use: you should define the following macros in your configure.ac:\n//   ACX_PTHREAD\n//   AC_RWLOCK\n// The latter is defined in ../autoconf.\n//\n// This class is meant to be internal-only and should be wrapped by an\n// internal namespace.  Before you use this module, please give the\n// name of your internal namespace for this module.  Or, if you want\n// to expose it, you'll want to move it to the Google namespace.  We\n// cannot put this class in global namespace because there can be some\n// problems when we have multiple versions of Mutex in each shared object.\n//\n// NOTE: by default, we have #ifdef'ed out the TryLock() method.\n//       This is for two reasons:\n// 1) TryLock() under Windows is a bit annoying (it requires a\n//    #define to be defined very early).\n// 2) TryLock() is broken for NO_THREADS mode, at least in NDEBUG\n//    mode.\n// If you need TryLock(), and either these two caveats are not a\n// problem for you, or you're willing to work around them, then\n// feel free to #define GMUTEX_TRYLOCK, or to remove the #ifdefs\n// in the code below.\n//\n// CYGWIN NOTE: Cygwin support for rwlock seems to be buggy:\n//    http://www.cygwin.com/ml/cygwin/2008-12/msg00017.html\n// Because of that, we might as well use windows locks for\n// cygwin.  They seem to be more reliable than the cygwin pthreads layer.\n//\n// TRICKY IMPLEMENTATION NOTE:\n// This class is designed to be safe to use during\n// dynamic-initialization -- that is, by global constructors that are\n// run before main() starts.  The issue in this case is that\n// dynamic-initialization happens in an unpredictable order, and it\n// could be that someone else's dynamic initializer could call a\n// function that tries to acquire this mutex -- but that all happens\n// before this mutex's constructor has run.  (This can happen even if\n// the mutex and the function that uses the mutex are in the same .cc\n// file.)  Basically, because Mutex does non-trivial work in its\n// constructor, it's not, in the naive implementation, safe to use\n// before dynamic initialization has run on it.\n//\n// The solution used here is to pair the actual mutex primitive with a\n// bool that is set to true when the mutex is dynamically initialized.\n// (Before that it's false.)  Then we modify all mutex routines to\n// look at the bool, and not try to lock/unlock until the bool makes\n// it to true (which happens after the Mutex constructor has run.)\n//\n// This works because before main() starts -- particularly, during\n// dynamic initialization -- there are no threads, so a) it's ok that\n// the mutex operations are a no-op, since we don't need locking then\n// anyway; and b) we can be quite confident our bool won't change\n// state between a call to Lock() and a call to Unlock() (that would\n// require a global constructor in one translation unit to call Lock()\n// and another global constructor in another translation unit to call\n// Unlock() later, which is pretty perverse).\n//\n// That said, it's tricky, and can conceivably fail; it's safest to\n// avoid trying to acquire a mutex in a global constructor, if you\n// can.  One way it can fail is that a really smart compiler might\n// initialize the bool to true at static-initialization time (too\n// early) rather than at dynamic-initialization time.  To discourage\n// that, we set is_safe_ to true in code (not the constructor\n// colon-initializer) and set it to true via a function that always\n// evaluates to true, but that the compiler can't know always\n// evaluates to true.  This should be good enough.\n\n#ifndef GOOGLE_MUTEX_H_\n#define GOOGLE_MUTEX_H_\n\n#include \"config.h\"           // to figure out pthreads support\n\n#if defined(NO_THREADS)\n  typedef int MutexType;      // to keep a lock-count\n#elif defined(_WIN32) || defined(__CYGWIN32__) || defined(__CYGWIN64__)\n# define WIN32_LEAN_AND_MEAN  // We only need minimal includes\n# ifdef GMUTEX_TRYLOCK\n  // We need Windows NT or later for TryEnterCriticalSection().  If you\n  // don't need that functionality, you can remove these _WIN32_WINNT\n  // lines, and change TryLock() to assert(0) or something.\n#   ifndef _WIN32_WINNT\n#     define _WIN32_WINNT 0x0400\n#   endif\n# endif\n// To avoid macro definition of ERROR.\n# define NOGDI\n// To avoid macro definition of min/max.\n# define NOMINMAX\n# include <windows.h>\n  typedef CRITICAL_SECTION MutexType;\n#elif defined(HAVE_PTHREAD) && defined(HAVE_RWLOCK)\n  // Needed for pthread_rwlock_*.  If it causes problems, you could take it\n  // out, but then you'd have to unset HAVE_RWLOCK (at least on linux -- it\n  // *does* cause problems for FreeBSD, or MacOSX, but isn't needed\n  // for locking there.)\n# ifdef __linux__\n#   define _XOPEN_SOURCE 500  // may be needed to get the rwlock calls\n# endif\n# include <pthread.h>\n  typedef pthread_rwlock_t MutexType;\n#elif defined(HAVE_PTHREAD)\n# include <pthread.h>\n  typedef pthread_mutex_t MutexType;\n#else\n# error Need to implement mutex.h for your architecture, or #define NO_THREADS\n#endif\n\n// We need to include these header files after defining _XOPEN_SOURCE\n// as they may define the _XOPEN_SOURCE macro.\n#include <assert.h>\n#include <stdlib.h>      // for abort()\n\n#define MUTEX_NAMESPACE glog_internal_namespace_\n\nnamespace MUTEX_NAMESPACE {\n\nclass Mutex {\n public:\n  // Create a Mutex that is not held by anybody.  This constructor is\n  // typically used for Mutexes allocated on the heap or the stack.\n  // See below for a recommendation for constructing global Mutex\n  // objects.\n  inline Mutex();\n\n  // Destructor\n  inline ~Mutex();\n\n  inline void Lock();    // Block if needed until free then acquire exclusively\n  inline void Unlock();  // Release a lock acquired via Lock()\n#ifdef GMUTEX_TRYLOCK\n  inline bool TryLock(); // If free, Lock() and return true, else return false\n#endif\n  // Note that on systems that don't support read-write locks, these may\n  // be implemented as synonyms to Lock() and Unlock().  So you can use\n  // these for efficiency, but don't use them anyplace where being able\n  // to do shared reads is necessary to avoid deadlock.\n  inline void ReaderLock();   // Block until free or shared then acquire a share\n  inline void ReaderUnlock(); // Release a read share of this Mutex\n  inline void WriterLock() { Lock(); }     // Acquire an exclusive lock\n  inline void WriterUnlock() { Unlock(); } // Release a lock from WriterLock()\n\n  // TODO(hamaji): Do nothing, implement correctly.\n  inline void AssertHeld() {}\n\n private:\n  MutexType mutex_;\n  // We want to make sure that the compiler sets is_safe_ to true only\n  // when we tell it to, and never makes assumptions is_safe_ is\n  // always true.  volatile is the most reliable way to do that.\n  volatile bool is_safe_;\n\n  inline void SetIsSafe() { is_safe_ = true; }\n\n  // Catch the error of writing Mutex when intending MutexLock.\n  Mutex(Mutex* /*ignored*/) {}\n  // Disallow \"evil\" constructors\n  Mutex(const Mutex&);\n  void operator=(const Mutex&);\n};\n\n// Now the implementation of Mutex for various systems\n#if defined(NO_THREADS)\n\n// When we don't have threads, we can be either reading or writing,\n// but not both.  We can have lots of readers at once (in no-threads\n// mode, that's most likely to happen in recursive function calls),\n// but only one writer.  We represent this by having mutex_ be -1 when\n// writing and a number > 0 when reading (and 0 when no lock is held).\n//\n// In debug mode, we assert these invariants, while in non-debug mode\n// we do nothing, for efficiency.  That's why everything is in an\n// assert.\n\nMutex::Mutex() : mutex_(0) { }\nMutex::~Mutex()            { assert(mutex_ == 0); }\nvoid Mutex::Lock()         { assert(--mutex_ == -1); }\nvoid Mutex::Unlock()       { assert(mutex_++ == -1); }\n#ifdef GMUTEX_TRYLOCK\nbool Mutex::TryLock()      { if (mutex_) return false; Lock(); return true; }\n#endif\nvoid Mutex::ReaderLock()   { assert(++mutex_ > 0); }\nvoid Mutex::ReaderUnlock() { assert(mutex_-- > 0); }\n\n#elif defined(_WIN32) || defined(__CYGWIN32__) || defined(__CYGWIN64__)\n\nMutex::Mutex()             { InitializeCriticalSection(&mutex_); SetIsSafe(); }\nMutex::~Mutex()            { DeleteCriticalSection(&mutex_); }\nvoid Mutex::Lock()         { if (is_safe_) EnterCriticalSection(&mutex_); }\nvoid Mutex::Unlock()       { if (is_safe_) LeaveCriticalSection(&mutex_); }\n#ifdef GMUTEX_TRYLOCK\nbool Mutex::TryLock()      { return is_safe_ ?\n                                 TryEnterCriticalSection(&mutex_) != 0 : true; }\n#endif\nvoid Mutex::ReaderLock()   { Lock(); }      // we don't have read-write locks\nvoid Mutex::ReaderUnlock() { Unlock(); }\n\n#elif defined(HAVE_PTHREAD) && defined(HAVE_RWLOCK)\n\n#define SAFE_PTHREAD(fncall)  do {   /* run fncall if is_safe_ is true */  \\\n  if (is_safe_ && fncall(&mutex_) != 0) abort();                           \\\n} while (0)\n\nMutex::Mutex() {\n  SetIsSafe();\n  if (is_safe_ && pthread_rwlock_init(&mutex_, NULL) != 0) abort();\n}\nMutex::~Mutex()            { SAFE_PTHREAD(pthread_rwlock_destroy); }\nvoid Mutex::Lock()         { SAFE_PTHREAD(pthread_rwlock_wrlock); }\nvoid Mutex::Unlock()       { SAFE_PTHREAD(pthread_rwlock_unlock); }\n#ifdef GMUTEX_TRYLOCK\nbool Mutex::TryLock()      { return is_safe_ ?\n                                    pthread_rwlock_trywrlock(&mutex_) == 0 :\n                                    true; }\n#endif\nvoid Mutex::ReaderLock()   { SAFE_PTHREAD(pthread_rwlock_rdlock); }\nvoid Mutex::ReaderUnlock() { SAFE_PTHREAD(pthread_rwlock_unlock); }\n#undef SAFE_PTHREAD\n\n#elif defined(HAVE_PTHREAD)\n\n#define SAFE_PTHREAD(fncall)  do {   /* run fncall if is_safe_ is true */  \\\n  if (is_safe_ && fncall(&mutex_) != 0) abort();                           \\\n} while (0)\n\nMutex::Mutex()             {\n  SetIsSafe();\n  if (is_safe_ && pthread_mutex_init(&mutex_, NULL) != 0) abort();\n}\nMutex::~Mutex()            { SAFE_PTHREAD(pthread_mutex_destroy); }\nvoid Mutex::Lock()         { SAFE_PTHREAD(pthread_mutex_lock); }\nvoid Mutex::Unlock()       { SAFE_PTHREAD(pthread_mutex_unlock); }\n#ifdef GMUTEX_TRYLOCK\nbool Mutex::TryLock()      { return is_safe_ ?\n                                 pthread_mutex_trylock(&mutex_) == 0 : true; }\n#endif\nvoid Mutex::ReaderLock()   { Lock(); }\nvoid Mutex::ReaderUnlock() { Unlock(); }\n#undef SAFE_PTHREAD\n\n#endif\n\n// --------------------------------------------------------------------------\n// Some helper classes\n\n// MutexLock(mu) acquires mu when constructed and releases it when destroyed.\nclass MutexLock {\n public:\n  explicit MutexLock(Mutex *mu) : mu_(mu) { mu_->Lock(); }\n  ~MutexLock() { mu_->Unlock(); }\n private:\n  Mutex * const mu_;\n  // Disallow \"evil\" constructors\n  MutexLock(const MutexLock&);\n  void operator=(const MutexLock&);\n};\n\n// ReaderMutexLock and WriterMutexLock do the same, for rwlocks\nclass ReaderMutexLock {\n public:\n  explicit ReaderMutexLock(Mutex *mu) : mu_(mu) { mu_->ReaderLock(); }\n  ~ReaderMutexLock() { mu_->ReaderUnlock(); }\n private:\n  Mutex * const mu_;\n  // Disallow \"evil\" constructors\n  ReaderMutexLock(const ReaderMutexLock&);\n  void operator=(const ReaderMutexLock&);\n};\n\nclass WriterMutexLock {\n public:\n  explicit WriterMutexLock(Mutex *mu) : mu_(mu) { mu_->WriterLock(); }\n  ~WriterMutexLock() { mu_->WriterUnlock(); }\n private:\n  Mutex * const mu_;\n  // Disallow \"evil\" constructors\n  WriterMutexLock(const WriterMutexLock&);\n  void operator=(const WriterMutexLock&);\n};\n\n// Catch bug where variable name is omitted, e.g. MutexLock (&mu);\n#define MutexLock(x) COMPILE_ASSERT(0, mutex_lock_decl_missing_var_name)\n#define ReaderMutexLock(x) COMPILE_ASSERT(0, rmutex_lock_decl_missing_var_name)\n#define WriterMutexLock(x) COMPILE_ASSERT(0, wmutex_lock_decl_missing_var_name)\n\n}  // namespace MUTEX_NAMESPACE\n\nusing namespace MUTEX_NAMESPACE;\n\n#undef MUTEX_NAMESPACE\n\n#endif  /* #define GOOGLE_MUTEX_H__ */\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/config.h.in",
    "content": "/* src/config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* Namespace for Google classes */\n#undef GOOGLE_NAMESPACE\n\n/* Define if you have the `dladdr' function */\n#undef HAVE_DLADDR\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#undef HAVE_DLFCN_H\n\n/* Define to 1 if you have the <execinfo.h> header file. */\n#undef HAVE_EXECINFO_H\n\n/* Define if you have the `fcntl' function */\n#undef HAVE_FCNTL\n\n/* Define to 1 if you have the <glob.h> header file. */\n#undef HAVE_GLOB_H\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#undef HAVE_INTTYPES_H\n\n/* Define to 1 if you have the `pthread' library (-lpthread). */\n#undef HAVE_LIBPTHREAD\n\n/* Define to 1 if you have the <libunwind.h> header file. */\n#undef HAVE_LIBUNWIND_H\n\n/* define if you have google gflags library */\n#undef HAVE_LIB_GFLAGS\n\n/* define if you have google gmock library */\n#undef HAVE_LIB_GMOCK\n\n/* define if you have google gtest library */\n#undef HAVE_LIB_GTEST\n\n/* define if you have libunwind */\n#undef HAVE_LIB_UNWIND\n\n/* Define to 1 if you have the <memory.h> header file. */\n#undef HAVE_MEMORY_H\n\n/* define if the compiler implements namespaces */\n#undef HAVE_NAMESPACES\n\n/* Define if you have POSIX threads libraries and header files. */\n#undef HAVE_PTHREAD\n\n/* Define to 1 if you have the <pwd.h> header file. */\n#undef HAVE_PWD_H\n\n/* define if the compiler implements pthread_rwlock_* */\n#undef HAVE_RWLOCK\n\n/* Define if you have the `sigaltstack' function */\n#undef HAVE_SIGALTSTACK\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#undef HAVE_STDINT_H\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#undef HAVE_STDLIB_H\n\n/* Define to 1 if you have the <strings.h> header file. */\n#undef HAVE_STRINGS_H\n\n/* Define to 1 if you have the <string.h> header file. */\n#undef HAVE_STRING_H\n\n/* Define to 1 if you have the <syscall.h> header file. */\n#undef HAVE_SYSCALL_H\n\n/* Define to 1 if you have the <syslog.h> header file. */\n#undef HAVE_SYSLOG_H\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#undef HAVE_SYS_STAT_H\n\n/* Define to 1 if you have the <sys/syscall.h> header file. */\n#undef HAVE_SYS_SYSCALL_H\n\n/* Define to 1 if you have the <sys/time.h> header file. */\n#undef HAVE_SYS_TIME_H\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#undef HAVE_SYS_TYPES_H\n\n/* Define to 1 if you have the <sys/ucontext.h> header file. */\n#undef HAVE_SYS_UCONTEXT_H\n\n/* Define to 1 if you have the <sys/utsname.h> header file. */\n#undef HAVE_SYS_UTSNAME_H\n\n/* Define to 1 if you have the <ucontext.h> header file. */\n#undef HAVE_UCONTEXT_H\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#undef HAVE_UNISTD_H\n\n/* define if the compiler supports using expression for operator */\n#undef HAVE_USING_OPERATOR\n\n/* define if your compiler has __attribute__ */\n#undef HAVE___ATTRIBUTE__\n\n/* define if your compiler has __builtin_expect */\n#undef HAVE___BUILTIN_EXPECT\n\n/* define if your compiler has __sync_val_compare_and_swap */\n#undef HAVE___SYNC_VAL_COMPARE_AND_SWAP\n\n/* Define to the sub-directory in which libtool stores uninstalled libraries.\n   */\n#undef LT_OBJDIR\n\n/* Name of package */\n#undef PACKAGE\n\n/* Define to the address where bug reports for this package should be sent. */\n#undef PACKAGE_BUGREPORT\n\n/* Define to the full name of this package. */\n#undef PACKAGE_NAME\n\n/* Define to the full name and version of this package. */\n#undef PACKAGE_STRING\n\n/* Define to the one symbol short name of this package. */\n#undef PACKAGE_TARNAME\n\n/* Define to the home page for this package. */\n#undef PACKAGE_URL\n\n/* Define to the version of this package. */\n#undef PACKAGE_VERSION\n\n/* How to access the PC from a struct ucontext */\n#undef PC_FROM_UCONTEXT\n\n/* Define to necessary symbol if this constant uses a non-standard name on\n   your system. */\n#undef PTHREAD_CREATE_JOINABLE\n\n/* The size of `void *', as computed by sizeof. */\n#undef SIZEOF_VOID_P\n\n/* Define to 1 if you have the ANSI C header files. */\n#undef STDC_HEADERS\n\n/* the namespace where STL code like vector<> is defined */\n#undef STL_NAMESPACE\n\n/* location of source code */\n#undef TEST_SRC_DIR\n\n/* Version number of package */\n#undef VERSION\n\n/* Stops putting the code inside the Google namespace */\n#undef _END_GOOGLE_NAMESPACE_\n\n/* Puts following code inside the Google namespace */\n#undef _START_GOOGLE_NAMESPACE_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/config_for_unittests.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// ---\n// All Rights Reserved.\n//\n// Author: Craig Silverstein\n// Copied from google-perftools and modified by Shinichiro Hamaji\n//\n// This file is needed for windows -- unittests are not part of the\n// glog dll, but still want to include config.h just like the\n// dll does, so they can use internal tools and APIs for testing.\n//\n// The problem is that config.h declares GOOGLE_GLOG_DLL_DECL to be\n// for exporting symbols, but the unittest needs to *import* symbols\n// (since it's not the dll).\n//\n// The solution is to have this file, which is just like config.h but\n// sets GOOGLE_GLOG_DLL_DECL to do a dllimport instead of a dllexport.\n//\n// The reason we need this extra GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS\n// variable is in case people want to set GOOGLE_GLOG_DLL_DECL explicitly\n// to something other than __declspec(dllexport).  In that case, they\n// may want to use something other than __declspec(dllimport) for the\n// unittest case.  For that, we allow folks to define both\n// GOOGLE_GLOG_DLL_DECL and GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS explicitly.\n//\n// NOTE: This file is equivalent to config.h on non-windows systems,\n// which never defined GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS and always\n// define GOOGLE_GLOG_DLL_DECL to the empty string.\n\n#include \"config.h\"\n\n#undef GOOGLE_GLOG_DLL_DECL\n#ifdef GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS\n# define GOOGLE_GLOG_DLL_DECL  GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS\n#else\n// if DLL_DECL_FOR_UNITTESTS isn't defined, use \"\"\n# define GOOGLE_GLOG_DLL_DECL\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/demangle.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Satoru Takabayashi\n//\n// For reference check out:\n// http://www.codesourcery.com/public/cxx-abi/abi.html#mangling\n//\n// Note that we only have partial C++0x support yet.\n\n#include <stdio.h>  // for NULL\n#include \"demangle.h\"\n\n_START_GOOGLE_NAMESPACE_\n\ntypedef struct {\n  const char *abbrev;\n  const char *real_name;\n} AbbrevPair;\n\n// List of operators from Itanium C++ ABI.\nstatic const AbbrevPair kOperatorList[] = {\n  { \"nw\", \"new\" },\n  { \"na\", \"new[]\" },\n  { \"dl\", \"delete\" },\n  { \"da\", \"delete[]\" },\n  { \"ps\", \"+\" },\n  { \"ng\", \"-\" },\n  { \"ad\", \"&\" },\n  { \"de\", \"*\" },\n  { \"co\", \"~\" },\n  { \"pl\", \"+\" },\n  { \"mi\", \"-\" },\n  { \"ml\", \"*\" },\n  { \"dv\", \"/\" },\n  { \"rm\", \"%\" },\n  { \"an\", \"&\" },\n  { \"or\", \"|\" },\n  { \"eo\", \"^\" },\n  { \"aS\", \"=\" },\n  { \"pL\", \"+=\" },\n  { \"mI\", \"-=\" },\n  { \"mL\", \"*=\" },\n  { \"dV\", \"/=\" },\n  { \"rM\", \"%=\" },\n  { \"aN\", \"&=\" },\n  { \"oR\", \"|=\" },\n  { \"eO\", \"^=\" },\n  { \"ls\", \"<<\" },\n  { \"rs\", \">>\" },\n  { \"lS\", \"<<=\" },\n  { \"rS\", \">>=\" },\n  { \"eq\", \"==\" },\n  { \"ne\", \"!=\" },\n  { \"lt\", \"<\" },\n  { \"gt\", \">\" },\n  { \"le\", \"<=\" },\n  { \"ge\", \">=\" },\n  { \"nt\", \"!\" },\n  { \"aa\", \"&&\" },\n  { \"oo\", \"||\" },\n  { \"pp\", \"++\" },\n  { \"mm\", \"--\" },\n  { \"cm\", \",\" },\n  { \"pm\", \"->*\" },\n  { \"pt\", \"->\" },\n  { \"cl\", \"()\" },\n  { \"ix\", \"[]\" },\n  { \"qu\", \"?\" },\n  { \"st\", \"sizeof\" },\n  { \"sz\", \"sizeof\" },\n  { NULL, NULL },\n};\n\n// List of builtin types from Itanium C++ ABI.\nstatic const AbbrevPair kBuiltinTypeList[] = {\n  { \"v\", \"void\" },\n  { \"w\", \"wchar_t\" },\n  { \"b\", \"bool\" },\n  { \"c\", \"char\" },\n  { \"a\", \"signed char\" },\n  { \"h\", \"unsigned char\" },\n  { \"s\", \"short\" },\n  { \"t\", \"unsigned short\" },\n  { \"i\", \"int\" },\n  { \"j\", \"unsigned int\" },\n  { \"l\", \"long\" },\n  { \"m\", \"unsigned long\" },\n  { \"x\", \"long long\" },\n  { \"y\", \"unsigned long long\" },\n  { \"n\", \"__int128\" },\n  { \"o\", \"unsigned __int128\" },\n  { \"f\", \"float\" },\n  { \"d\", \"double\" },\n  { \"e\", \"long double\" },\n  { \"g\", \"__float128\" },\n  { \"z\", \"ellipsis\" },\n  { NULL, NULL }\n};\n\n// List of substitutions Itanium C++ ABI.\nstatic const AbbrevPair kSubstitutionList[] = {\n  { \"St\", \"\" },\n  { \"Sa\", \"allocator\" },\n  { \"Sb\", \"basic_string\" },\n  // std::basic_string<char, std::char_traits<char>,std::allocator<char> >\n  { \"Ss\", \"string\"},\n  // std::basic_istream<char, std::char_traits<char> >\n  { \"Si\", \"istream\" },\n  // std::basic_ostream<char, std::char_traits<char> >\n  { \"So\", \"ostream\" },\n  // std::basic_iostream<char, std::char_traits<char> >\n  { \"Sd\", \"iostream\" },\n  { NULL, NULL }\n};\n\n// State needed for demangling.\ntypedef struct {\n  const char *mangled_cur;  // Cursor of mangled name.\n  char *out_cur;            // Cursor of output string.\n  const char *out_begin;    // Beginning of output string.\n  const char *out_end;      // End of output string.\n  const char *prev_name;    // For constructors/destructors.\n  int prev_name_length;     // For constructors/destructors.\n  short nest_level;         // For nested names.\n  bool append;              // Append flag.\n  bool overflowed;          // True if output gets overflowed.\n} State;\n\n// We don't use strlen() in libc since it's not guaranteed to be async\n// signal safe.\nstatic size_t StrLen(const char *str) {\n  size_t len = 0;\n  while (*str != '\\0') {\n    ++str;\n    ++len;\n  }\n  return len;\n}\n\n// Returns true if \"str\" has at least \"n\" characters remaining.\nstatic bool AtLeastNumCharsRemaining(const char *str, int n) {\n  for (int i = 0; i < n; ++i) {\n    if (str == '\\0') {\n      return false;\n    }\n  }\n  return true;\n}\n\n// Returns true if \"str\" has \"prefix\" as a prefix.\nstatic bool StrPrefix(const char *str, const char *prefix) {\n  size_t i = 0;\n  while (str[i] != '\\0' && prefix[i] != '\\0' &&\n         str[i] == prefix[i]) {\n    ++i;\n  }\n  return prefix[i] == '\\0';  // Consumed everything in \"prefix\".\n}\n\nstatic void InitState(State *state, const char *mangled,\n                      char *out, int out_size) {\n  state->mangled_cur = mangled;\n  state->out_cur = out;\n  state->out_begin = out;\n  state->out_end = out + out_size;\n  state->prev_name  = NULL;\n  state->prev_name_length = -1;\n  state->nest_level = -1;\n  state->append = true;\n  state->overflowed = false;\n}\n\n// Returns true and advances \"mangled_cur\" if we find \"one_char_token\"\n// at \"mangled_cur\" position.  It is assumed that \"one_char_token\" does\n// not contain '\\0'.\nstatic bool ParseOneCharToken(State *state, const char one_char_token) {\n  if (state->mangled_cur[0] == one_char_token) {\n    ++state->mangled_cur;\n    return true;\n  }\n  return false;\n}\n\n// Returns true and advances \"mangled_cur\" if we find \"two_char_token\"\n// at \"mangled_cur\" position.  It is assumed that \"two_char_token\" does\n// not contain '\\0'.\nstatic bool ParseTwoCharToken(State *state, const char *two_char_token) {\n  if (state->mangled_cur[0] == two_char_token[0] &&\n      state->mangled_cur[1] == two_char_token[1]) {\n    state->mangled_cur += 2;\n    return true;\n  }\n  return false;\n}\n\n// Returns true and advances \"mangled_cur\" if we find any character in\n// \"char_class\" at \"mangled_cur\" position.\nstatic bool ParseCharClass(State *state, const char *char_class) {\n  if (state->mangled_cur == '\\0') {\n    return false;\n  }\n  const char *p = char_class;\n  for (; *p != '\\0'; ++p) {\n    if (state->mangled_cur[0] == *p) {\n      ++state->mangled_cur;\n      return true;\n    }\n  }\n  return false;\n}\n\n// This function is used for handling an optional non-terminal.\nstatic bool Optional(bool status) {\n  return true;\n}\n\n// This function is used for handling <non-terminal>+ syntax.\ntypedef bool (*ParseFunc)(State *);\nstatic bool OneOrMore(ParseFunc parse_func, State *state) {\n  if (parse_func(state)) {\n    while (parse_func(state)) {\n    }\n    return true;\n  }\n  return false;\n}\n\n// This function is used for handling <non-terminal>* syntax. The function\n// always returns true and must be followed by a termination token or a\n// terminating sequence not handled by parse_func (e.g.\n// ParseOneCharToken(state, 'E')).\nstatic bool ZeroOrMore(ParseFunc parse_func, State *state) {\n  while (parse_func(state)) {\n  }\n  return true;\n}\n\n// Append \"str\" at \"out_cur\".  If there is an overflow, \"overflowed\"\n// is set to true for later use.  The output string is ensured to\n// always terminate with '\\0' as long as there is no overflow.\nstatic void Append(State *state, const char * const str, const int length) {\n  int i;\n  for (i = 0; i < length; ++i) {\n    if (state->out_cur + 1 < state->out_end) {  // +1 for '\\0'\n      *state->out_cur = str[i];\n      ++state->out_cur;\n    } else {\n      state->overflowed = true;\n      break;\n    }\n  }\n  if (!state->overflowed) {\n    *state->out_cur = '\\0';  // Terminate it with '\\0'\n  }\n}\n\n// We don't use equivalents in libc to avoid locale issues.\nstatic bool IsLower(char c) {\n  return c >= 'a' && c <= 'z';\n}\n\nstatic bool IsAlpha(char c) {\n  return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');\n}\n\nstatic bool IsDigit(char c) {\n  return c >= '0' && c <= '9';\n}\n\n// Returns true if \"str\" is a function clone suffix.  These suffixes are used\n// by GCC 4.5.x and later versions to indicate functions which have been\n// cloned during optimization.  We treat any sequence (.<alpha>+.<digit>+)+ as\n// a function clone suffix.\nstatic bool IsFunctionCloneSuffix(const char *str) {\n  size_t i = 0;\n  while (str[i] != '\\0') {\n    // Consume a single .<alpha>+.<digit>+ sequence.\n    if (str[i] != '.' || !IsAlpha(str[i + 1])) {\n      return false;\n    }\n    i += 2;\n    while (IsAlpha(str[i])) {\n      ++i;\n    }\n    if (str[i] != '.' || !IsDigit(str[i + 1])) {\n      return false;\n    }\n    i += 2;\n    while (IsDigit(str[i])) {\n      ++i;\n    }\n  }\n  return true;  // Consumed everything in \"str\".\n}\n\n// Append \"str\" with some tweaks, iff \"append\" state is true.\n// Returns true so that it can be placed in \"if\" conditions.\nstatic void MaybeAppendWithLength(State *state, const char * const str,\n                                  const int length) {\n  if (state->append && length > 0) {\n    // Append a space if the output buffer ends with '<' and \"str\"\n    // starts with '<' to avoid <<<.\n    if (str[0] == '<' && state->out_begin < state->out_cur  &&\n        state->out_cur[-1] == '<') {\n      Append(state, \" \", 1);\n    }\n    // Remember the last identifier name for ctors/dtors.\n    if (IsAlpha(str[0]) || str[0] == '_') {\n      state->prev_name = state->out_cur;\n      state->prev_name_length = length;\n    }\n    Append(state, str, length);\n  }\n}\n\n// A convenient wrapper arount MaybeAppendWithLength().\nstatic bool MaybeAppend(State *state, const char * const str) {\n  if (state->append) {\n    int length = StrLen(str);\n    MaybeAppendWithLength(state, str, length);\n  }\n  return true;\n}\n\n// This function is used for handling nested names.\nstatic bool EnterNestedName(State *state) {\n  state->nest_level = 0;\n  return true;\n}\n\n// This function is used for handling nested names.\nstatic bool LeaveNestedName(State *state, short prev_value) {\n  state->nest_level = prev_value;\n  return true;\n}\n\n// Disable the append mode not to print function parameters, etc.\nstatic bool DisableAppend(State *state) {\n  state->append = false;\n  return true;\n}\n\n// Restore the append mode to the previous state.\nstatic bool RestoreAppend(State *state, bool prev_value) {\n  state->append = prev_value;\n  return true;\n}\n\n// Increase the nest level for nested names.\nstatic void MaybeIncreaseNestLevel(State *state) {\n  if (state->nest_level > -1) {\n    ++state->nest_level;\n  }\n}\n\n// Appends :: for nested names if necessary.\nstatic void MaybeAppendSeparator(State *state) {\n  if (state->nest_level >= 1) {\n    MaybeAppend(state, \"::\");\n  }\n}\n\n// Cancel the last separator if necessary.\nstatic void MaybeCancelLastSeparator(State *state) {\n  if (state->nest_level >= 1 && state->append &&\n      state->out_begin <= state->out_cur - 2) {\n    state->out_cur -= 2;\n    *state->out_cur = '\\0';\n  }\n}\n\n// Returns true if the identifier of the given length pointed to by\n// \"mangled_cur\" is anonymous namespace.\nstatic bool IdentifierIsAnonymousNamespace(State *state, int length) {\n  static const char anon_prefix[] = \"_GLOBAL__N_\";\n  return (length > sizeof(anon_prefix) - 1 &&  // Should be longer.\n          StrPrefix(state->mangled_cur, anon_prefix));\n}\n\n// Forward declarations of our parsing functions.\nstatic bool ParseMangledName(State *state);\nstatic bool ParseEncoding(State *state);\nstatic bool ParseName(State *state);\nstatic bool ParseUnscopedName(State *state);\nstatic bool ParseUnscopedTemplateName(State *state);\nstatic bool ParseNestedName(State *state);\nstatic bool ParsePrefix(State *state);\nstatic bool ParseUnqualifiedName(State *state);\nstatic bool ParseSourceName(State *state);\nstatic bool ParseLocalSourceName(State *state);\nstatic bool ParseNumber(State *state, int *number_out);\nstatic bool ParseFloatNumber(State *state);\nstatic bool ParseSeqId(State *state);\nstatic bool ParseIdentifier(State *state, int length);\nstatic bool ParseOperatorName(State *state);\nstatic bool ParseSpecialName(State *state);\nstatic bool ParseCallOffset(State *state);\nstatic bool ParseNVOffset(State *state);\nstatic bool ParseVOffset(State *state);\nstatic bool ParseCtorDtorName(State *state);\nstatic bool ParseType(State *state);\nstatic bool ParseCVQualifiers(State *state);\nstatic bool ParseBuiltinType(State *state);\nstatic bool ParseFunctionType(State *state);\nstatic bool ParseBareFunctionType(State *state);\nstatic bool ParseClassEnumType(State *state);\nstatic bool ParseArrayType(State *state);\nstatic bool ParsePointerToMemberType(State *state);\nstatic bool ParseTemplateParam(State *state);\nstatic bool ParseTemplateTemplateParam(State *state);\nstatic bool ParseTemplateArgs(State *state);\nstatic bool ParseTemplateArg(State *state);\nstatic bool ParseExpression(State *state);\nstatic bool ParseExprPrimary(State *state);\nstatic bool ParseLocalName(State *state);\nstatic bool ParseDiscriminator(State *state);\nstatic bool ParseSubstitution(State *state);\n\n// Implementation note: the following code is a straightforward\n// translation of the Itanium C++ ABI defined in BNF with a couple of\n// exceptions.\n//\n// - Support GNU extensions not defined in the Itanium C++ ABI\n// - <prefix> and <template-prefix> are combined to avoid infinite loop\n// - Reorder patterns to shorten the code\n// - Reorder patterns to give greedier functions precedence\n//   We'll mark \"Less greedy than\" for these cases in the code\n//\n// Each parsing function changes the state and returns true on\n// success.  Otherwise, don't change the state and returns false.  To\n// ensure that the state isn't changed in the latter case, we save the\n// original state before we call more than one parsing functions\n// consecutively with &&, and restore the state if unsuccessful.  See\n// ParseEncoding() as an example of this convention.  We follow the\n// convention throughout the code.\n//\n// Originally we tried to do demangling without following the full ABI\n// syntax but it turned out we needed to follow the full syntax to\n// parse complicated cases like nested template arguments.  Note that\n// implementing a full-fledged demangler isn't trivial (libiberty's\n// cp-demangle.c has +4300 lines).\n//\n// Note that (foo) in <(foo) ...> is a modifier to be ignored.\n//\n// Reference:\n// - Itanium C++ ABI\n//   <http://www.codesourcery.com/cxx-abi/abi.html#mangling>\n\n// <mangled-name> ::= _Z <encoding>\nstatic bool ParseMangledName(State *state) {\n  return ParseTwoCharToken(state, \"_Z\") && ParseEncoding(state);\n}\n\n// <encoding> ::= <(function) name> <bare-function-type>\n//            ::= <(data) name>\n//            ::= <special-name>\nstatic bool ParseEncoding(State *state) {\n  State copy = *state;\n  if (ParseName(state) && ParseBareFunctionType(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseName(state) || ParseSpecialName(state)) {\n    return true;\n  }\n  return false;\n}\n\n// <name> ::= <nested-name>\n//        ::= <unscoped-template-name> <template-args>\n//        ::= <unscoped-name>\n//        ::= <local-name>\nstatic bool ParseName(State *state) {\n  if (ParseNestedName(state) || ParseLocalName(state)) {\n    return true;\n  }\n\n  State copy = *state;\n  if (ParseUnscopedTemplateName(state) &&\n      ParseTemplateArgs(state)) {\n    return true;\n  }\n  *state = copy;\n\n  // Less greedy than <unscoped-template-name> <template-args>.\n  if (ParseUnscopedName(state)) {\n    return true;\n  }\n  return false;\n}\n\n// <unscoped-name> ::= <unqualified-name>\n//                 ::= St <unqualified-name>\nstatic bool ParseUnscopedName(State *state) {\n  if (ParseUnqualifiedName(state)) {\n    return true;\n  }\n\n  State copy = *state;\n  if (ParseTwoCharToken(state, \"St\") &&\n      MaybeAppend(state, \"std::\") &&\n      ParseUnqualifiedName(state)) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <unscoped-template-name> ::= <unscoped-name>\n//                          ::= <substitution>\nstatic bool ParseUnscopedTemplateName(State *state) {\n  return ParseUnscopedName(state) || ParseSubstitution(state);\n}\n\n// <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E\n//               ::= N [<CV-qualifiers>] <template-prefix> <template-args> E\nstatic bool ParseNestedName(State *state) {\n  State copy = *state;\n  if (ParseOneCharToken(state, 'N') &&\n      EnterNestedName(state) &&\n      Optional(ParseCVQualifiers(state)) &&\n      ParsePrefix(state) &&\n      LeaveNestedName(state, copy.nest_level) &&\n      ParseOneCharToken(state, 'E')) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// This part is tricky.  If we literally translate them to code, we'll\n// end up infinite loop.  Hence we merge them to avoid the case.\n//\n// <prefix> ::= <prefix> <unqualified-name>\n//          ::= <template-prefix> <template-args>\n//          ::= <template-param>\n//          ::= <substitution>\n//          ::= # empty\n// <template-prefix> ::= <prefix> <(template) unqualified-name>\n//                   ::= <template-param>\n//                   ::= <substitution>\nstatic bool ParsePrefix(State *state) {\n  bool has_something = false;\n  while (true) {\n    MaybeAppendSeparator(state);\n    if (ParseTemplateParam(state) ||\n        ParseSubstitution(state) ||\n        ParseUnscopedName(state)) {\n      has_something = true;\n      MaybeIncreaseNestLevel(state);\n      continue;\n    }\n    MaybeCancelLastSeparator(state);\n    if (has_something && ParseTemplateArgs(state)) {\n      return ParsePrefix(state);\n    } else {\n      break;\n    }\n  }\n  return true;\n}\n\n// <unqualified-name> ::= <operator-name>\n//                    ::= <ctor-dtor-name>\n//                    ::= <source-name>\n//                    ::= <local-source-name>\nstatic bool ParseUnqualifiedName(State *state) {\n  return (ParseOperatorName(state) ||\n          ParseCtorDtorName(state) ||\n          ParseSourceName(state) ||\n          ParseLocalSourceName(state));\n}\n\n// <source-name> ::= <positive length number> <identifier>\nstatic bool ParseSourceName(State *state) {\n  State copy = *state;\n  int length = -1;\n  if (ParseNumber(state, &length) && ParseIdentifier(state, length)) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <local-source-name> ::= L <source-name> [<discriminator>]\n//\n// References:\n//   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31775\n//   http://gcc.gnu.org/viewcvs?view=rev&revision=124467\nstatic bool ParseLocalSourceName(State *state) {\n  State copy = *state;\n  if (ParseOneCharToken(state, 'L') && ParseSourceName(state) &&\n      Optional(ParseDiscriminator(state))) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <number> ::= [n] <non-negative decimal integer>\n// If \"number_out\" is non-null, then *number_out is set to the value of the\n// parsed number on success.\nstatic bool ParseNumber(State *state, int *number_out) {\n  int sign = 1;\n  if (ParseOneCharToken(state, 'n')) {\n    sign = -1;\n  }\n  const char *p = state->mangled_cur;\n  int number = 0;\n  for (;*p != '\\0'; ++p) {\n    if (IsDigit(*p)) {\n      number = number * 10 + (*p - '0');\n    } else {\n      break;\n    }\n  }\n  if (p != state->mangled_cur) {  // Conversion succeeded.\n    state->mangled_cur = p;\n    if (number_out != NULL) {\n      *number_out = number * sign;\n    }\n    return true;\n  }\n  return false;\n}\n\n// Floating-point literals are encoded using a fixed-length lowercase\n// hexadecimal string.\nstatic bool ParseFloatNumber(State *state) {\n  const char *p = state->mangled_cur;\n  for (;*p != '\\0'; ++p) {\n    if (!IsDigit(*p) && !(*p >= 'a' && *p <= 'f')) {\n      break;\n    }\n  }\n  if (p != state->mangled_cur) {  // Conversion succeeded.\n    state->mangled_cur = p;\n    return true;\n  }\n  return false;\n}\n\n// The <seq-id> is a sequence number in base 36,\n// using digits and upper case letters\nstatic bool ParseSeqId(State *state) {\n  const char *p = state->mangled_cur;\n  for (;*p != '\\0'; ++p) {\n    if (!IsDigit(*p) && !(*p >= 'A' && *p <= 'Z')) {\n      break;\n    }\n  }\n  if (p != state->mangled_cur) {  // Conversion succeeded.\n    state->mangled_cur = p;\n    return true;\n  }\n  return false;\n}\n\n// <identifier> ::= <unqualified source code identifier> (of given length)\nstatic bool ParseIdentifier(State *state, int length) {\n  if (length == -1 ||\n      !AtLeastNumCharsRemaining(state->mangled_cur, length)) {\n    return false;\n  }\n  if (IdentifierIsAnonymousNamespace(state, length)) {\n    MaybeAppend(state, \"(anonymous namespace)\");\n  } else {\n    MaybeAppendWithLength(state, state->mangled_cur, length);\n  }\n  state->mangled_cur += length;\n  return true;\n}\n\n// <operator-name> ::= nw, and other two letters cases\n//                 ::= cv <type>  # (cast)\n//                 ::= v  <digit> <source-name> # vendor extended operator\nstatic bool ParseOperatorName(State *state) {\n  if (!AtLeastNumCharsRemaining(state->mangled_cur, 2)) {\n    return false;\n  }\n  // First check with \"cv\" (cast) case.\n  State copy = *state;\n  if (ParseTwoCharToken(state, \"cv\") &&\n      MaybeAppend(state, \"operator \") &&\n      EnterNestedName(state) &&\n      ParseType(state) &&\n      LeaveNestedName(state, copy.nest_level)) {\n    return true;\n  }\n  *state = copy;\n\n  // Then vendor extended operators.\n  if (ParseOneCharToken(state, 'v') && ParseCharClass(state, \"0123456789\") &&\n      ParseSourceName(state)) {\n    return true;\n  }\n  *state = copy;\n\n  // Other operator names should start with a lower alphabet followed\n  // by a lower/upper alphabet.\n  if (!(IsLower(state->mangled_cur[0]) &&\n        IsAlpha(state->mangled_cur[1]))) {\n    return false;\n  }\n  // We may want to perform a binary search if we really need speed.\n  const AbbrevPair *p;\n  for (p = kOperatorList; p->abbrev != NULL; ++p) {\n    if (state->mangled_cur[0] == p->abbrev[0] &&\n        state->mangled_cur[1] == p->abbrev[1]) {\n      MaybeAppend(state, \"operator\");\n      if (IsLower(*p->real_name)) {  // new, delete, etc.\n        MaybeAppend(state, \" \");\n      }\n      MaybeAppend(state, p->real_name);\n      state->mangled_cur += 2;\n      return true;\n    }\n  }\n  return false;\n}\n\n// <special-name> ::= TV <type>\n//                ::= TT <type>\n//                ::= TI <type>\n//                ::= TS <type>\n//                ::= Tc <call-offset> <call-offset> <(base) encoding>\n//                ::= GV <(object) name>\n//                ::= T <call-offset> <(base) encoding>\n// G++ extensions:\n//                ::= TC <type> <(offset) number> _ <(base) type>\n//                ::= TF <type>\n//                ::= TJ <type>\n//                ::= GR <name>\n//                ::= GA <encoding>\n//                ::= Th <call-offset> <(base) encoding>\n//                ::= Tv <call-offset> <(base) encoding>\n//\n// Note: we don't care much about them since they don't appear in\n// stack traces.  The are special data.\nstatic bool ParseSpecialName(State *state) {\n  State copy = *state;\n  if (ParseOneCharToken(state, 'T') &&\n      ParseCharClass(state, \"VTIS\") &&\n      ParseType(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseTwoCharToken(state, \"Tc\") && ParseCallOffset(state) &&\n      ParseCallOffset(state) && ParseEncoding(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseTwoCharToken(state, \"GV\") &&\n      ParseName(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOneCharToken(state, 'T') && ParseCallOffset(state) &&\n      ParseEncoding(state)) {\n    return true;\n  }\n  *state = copy;\n\n  // G++ extensions\n  if (ParseTwoCharToken(state, \"TC\") && ParseType(state) &&\n      ParseNumber(state, NULL) && ParseOneCharToken(state, '_') &&\n      DisableAppend(state) &&\n      ParseType(state)) {\n    RestoreAppend(state, copy.append);\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOneCharToken(state, 'T') && ParseCharClass(state, \"FJ\") &&\n      ParseType(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseTwoCharToken(state, \"GR\") && ParseName(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseTwoCharToken(state, \"GA\") && ParseEncoding(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOneCharToken(state, 'T') && ParseCharClass(state, \"hv\") &&\n      ParseCallOffset(state) && ParseEncoding(state)) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <call-offset> ::= h <nv-offset> _\n//               ::= v <v-offset> _\nstatic bool ParseCallOffset(State *state) {\n  State copy = *state;\n  if (ParseOneCharToken(state, 'h') &&\n      ParseNVOffset(state) && ParseOneCharToken(state, '_')) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOneCharToken(state, 'v') &&\n      ParseVOffset(state) && ParseOneCharToken(state, '_')) {\n    return true;\n  }\n  *state = copy;\n\n  return false;\n}\n\n// <nv-offset> ::= <(offset) number>\nstatic bool ParseNVOffset(State *state) {\n  return ParseNumber(state, NULL);\n}\n\n// <v-offset>  ::= <(offset) number> _ <(virtual offset) number>\nstatic bool ParseVOffset(State *state) {\n  State copy = *state;\n  if (ParseNumber(state, NULL) && ParseOneCharToken(state, '_') &&\n      ParseNumber(state, NULL)) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <ctor-dtor-name> ::= C1 | C2 | C3\n//                  ::= D0 | D1 | D2\nstatic bool ParseCtorDtorName(State *state) {\n  State copy = *state;\n  if (ParseOneCharToken(state, 'C') &&\n      ParseCharClass(state, \"123\")) {\n    const char * const prev_name = state->prev_name;\n    const int prev_name_length = state->prev_name_length;\n    MaybeAppendWithLength(state, prev_name, prev_name_length);\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOneCharToken(state, 'D') &&\n      ParseCharClass(state, \"012\")) {\n    const char * const prev_name = state->prev_name;\n    const int prev_name_length = state->prev_name_length;\n    MaybeAppend(state, \"~\");\n    MaybeAppendWithLength(state, prev_name, prev_name_length);\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <type> ::= <CV-qualifiers> <type>\n//        ::= P <type>   # pointer-to\n//        ::= R <type>   # reference-to\n//        ::= O <type>   # rvalue reference-to (C++0x)\n//        ::= C <type>   # complex pair (C 2000)\n//        ::= G <type>   # imaginary (C 2000)\n//        ::= U <source-name> <type>  # vendor extended type qualifier\n//        ::= <builtin-type>\n//        ::= <function-type>\n//        ::= <class-enum-type>\n//        ::= <array-type>\n//        ::= <pointer-to-member-type>\n//        ::= <template-template-param> <template-args>\n//        ::= <template-param>\n//        ::= <substitution>\n//        ::= Dp <type>          # pack expansion of (C++0x)\n//        ::= Dt <expression> E  # decltype of an id-expression or class\n//                               # member access (C++0x)\n//        ::= DT <expression> E  # decltype of an expression (C++0x)\n//\nstatic bool ParseType(State *state) {\n  // We should check CV-qualifers, and PRGC things first.\n  State copy = *state;\n  if (ParseCVQualifiers(state) && ParseType(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseCharClass(state, \"OPRCG\") && ParseType(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseTwoCharToken(state, \"Dp\") && ParseType(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOneCharToken(state, 'D') && ParseCharClass(state, \"tT\") &&\n      ParseExpression(state) && ParseOneCharToken(state, 'E')) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOneCharToken(state, 'U') && ParseSourceName(state) &&\n      ParseType(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseBuiltinType(state) ||\n      ParseFunctionType(state) ||\n      ParseClassEnumType(state) ||\n      ParseArrayType(state) ||\n      ParsePointerToMemberType(state) ||\n      ParseSubstitution(state)) {\n    return true;\n  }\n\n  if (ParseTemplateTemplateParam(state) &&\n      ParseTemplateArgs(state)) {\n    return true;\n  }\n  *state = copy;\n\n  // Less greedy than <template-template-param> <template-args>.\n  if (ParseTemplateParam(state)) {\n    return true;\n  }\n\n  return false;\n}\n\n// <CV-qualifiers> ::= [r] [V] [K]\n// We don't allow empty <CV-qualifiers> to avoid infinite loop in\n// ParseType().\nstatic bool ParseCVQualifiers(State *state) {\n  int num_cv_qualifiers = 0;\n  num_cv_qualifiers += ParseOneCharToken(state, 'r');\n  num_cv_qualifiers += ParseOneCharToken(state, 'V');\n  num_cv_qualifiers += ParseOneCharToken(state, 'K');\n  return num_cv_qualifiers > 0;\n}\n\n// <builtin-type> ::= v, etc.\n//                ::= u <source-name>\nstatic bool ParseBuiltinType(State *state) {\n  const AbbrevPair *p;\n  for (p = kBuiltinTypeList; p->abbrev != NULL; ++p) {\n    if (state->mangled_cur[0] == p->abbrev[0]) {\n      MaybeAppend(state, p->real_name);\n      ++state->mangled_cur;\n      return true;\n    }\n  }\n\n  State copy = *state;\n  if (ParseOneCharToken(state, 'u') && ParseSourceName(state)) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <function-type> ::= F [Y] <bare-function-type> E\nstatic bool ParseFunctionType(State *state) {\n  State copy = *state;\n  if (ParseOneCharToken(state, 'F') &&\n      Optional(ParseOneCharToken(state, 'Y')) &&\n      ParseBareFunctionType(state) && ParseOneCharToken(state, 'E')) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <bare-function-type> ::= <(signature) type>+\nstatic bool ParseBareFunctionType(State *state) {\n  State copy = *state;\n  DisableAppend(state);\n  if (OneOrMore(ParseType, state)) {\n    RestoreAppend(state, copy.append);\n    MaybeAppend(state, \"()\");\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <class-enum-type> ::= <name>\nstatic bool ParseClassEnumType(State *state) {\n  return ParseName(state);\n}\n\n// <array-type> ::= A <(positive dimension) number> _ <(element) type>\n//              ::= A [<(dimension) expression>] _ <(element) type>\nstatic bool ParseArrayType(State *state) {\n  State copy = *state;\n  if (ParseOneCharToken(state, 'A') && ParseNumber(state, NULL) &&\n      ParseOneCharToken(state, '_') && ParseType(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOneCharToken(state, 'A') && Optional(ParseExpression(state)) &&\n      ParseOneCharToken(state, '_') && ParseType(state)) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <pointer-to-member-type> ::= M <(class) type> <(member) type>\nstatic bool ParsePointerToMemberType(State *state) {\n  State copy = *state;\n  if (ParseOneCharToken(state, 'M') && ParseType(state) &&\n      ParseType(state)) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <template-param> ::= T_\n//                  ::= T <parameter-2 non-negative number> _\nstatic bool ParseTemplateParam(State *state) {\n  if (ParseTwoCharToken(state, \"T_\")) {\n    MaybeAppend(state, \"?\");  // We don't support template substitutions.\n    return true;\n  }\n\n  State copy = *state;\n  if (ParseOneCharToken(state, 'T') && ParseNumber(state, NULL) &&\n      ParseOneCharToken(state, '_')) {\n    MaybeAppend(state, \"?\");  // We don't support template substitutions.\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n\n// <template-template-param> ::= <template-param>\n//                           ::= <substitution>\nstatic bool ParseTemplateTemplateParam(State *state) {\n  return (ParseTemplateParam(state) ||\n          ParseSubstitution(state));\n}\n\n// <template-args> ::= I <template-arg>+ E\nstatic bool ParseTemplateArgs(State *state) {\n  State copy = *state;\n  DisableAppend(state);\n  if (ParseOneCharToken(state, 'I') &&\n      OneOrMore(ParseTemplateArg, state) &&\n      ParseOneCharToken(state, 'E')) {\n    RestoreAppend(state, copy.append);\n    MaybeAppend(state, \"<>\");\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <template-arg>  ::= <type>\n//                 ::= <expr-primary>\n//                 ::= I <template-arg>* E        # argument pack\n//                 ::= X <expression> E\nstatic bool ParseTemplateArg(State *state) {\n  State copy = *state;\n  if (ParseOneCharToken(state, 'I') &&\n      ZeroOrMore(ParseTemplateArg, state) &&\n      ParseOneCharToken(state, 'E')) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseType(state) ||\n      ParseExprPrimary(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOneCharToken(state, 'X') && ParseExpression(state) &&\n      ParseOneCharToken(state, 'E')) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <expression> ::= <template-param>\n//              ::= <expr-primary>\n//              ::= <unary operator-name> <expression>\n//              ::= <binary operator-name> <expression> <expression>\n//              ::= <trinary operator-name> <expression> <expression>\n//                  <expression>\n//              ::= st <type>\n//              ::= sr <type> <unqualified-name> <template-args>\n//              ::= sr <type> <unqualified-name>\nstatic bool ParseExpression(State *state) {\n  if (ParseTemplateParam(state) || ParseExprPrimary(state)) {\n    return true;\n  }\n\n  State copy = *state;\n  if (ParseOperatorName(state) &&\n      ParseExpression(state) &&\n      ParseExpression(state) &&\n      ParseExpression(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOperatorName(state) &&\n      ParseExpression(state) &&\n      ParseExpression(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOperatorName(state) &&\n      ParseExpression(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseTwoCharToken(state, \"st\") && ParseType(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseTwoCharToken(state, \"sr\") && ParseType(state) &&\n      ParseUnqualifiedName(state) &&\n      ParseTemplateArgs(state)) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseTwoCharToken(state, \"sr\") && ParseType(state) &&\n      ParseUnqualifiedName(state)) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <expr-primary> ::= L <type> <(value) number> E\n//                ::= L <type> <(value) float> E\n//                ::= L <mangled-name> E\n//                // A bug in g++'s C++ ABI version 2 (-fabi-version=2).\n//                ::= LZ <encoding> E\nstatic bool ParseExprPrimary(State *state) {\n  State copy = *state;\n  if (ParseOneCharToken(state, 'L') && ParseType(state) &&\n      ParseNumber(state, NULL) &&\n      ParseOneCharToken(state, 'E')) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOneCharToken(state, 'L') && ParseType(state) &&\n      ParseFloatNumber(state) &&\n      ParseOneCharToken(state, 'E')) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOneCharToken(state, 'L') && ParseMangledName(state) &&\n      ParseOneCharToken(state, 'E')) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseTwoCharToken(state, \"LZ\") && ParseEncoding(state) &&\n      ParseOneCharToken(state, 'E')) {\n    return true;\n  }\n  *state = copy;\n\n  return false;\n}\n\n// <local-name> := Z <(function) encoding> E <(entity) name>\n//                 [<discriminator>]\n//              := Z <(function) encoding> E s [<discriminator>]\nstatic bool ParseLocalName(State *state) {\n  State copy = *state;\n  if (ParseOneCharToken(state, 'Z') && ParseEncoding(state) &&\n      ParseOneCharToken(state, 'E') && MaybeAppend(state, \"::\") &&\n      ParseName(state) && Optional(ParseDiscriminator(state))) {\n    return true;\n  }\n  *state = copy;\n\n  if (ParseOneCharToken(state, 'Z') && ParseEncoding(state) &&\n      ParseTwoCharToken(state, \"Es\") && Optional(ParseDiscriminator(state))) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <discriminator> := _ <(non-negative) number>\nstatic bool ParseDiscriminator(State *state) {\n  State copy = *state;\n  if (ParseOneCharToken(state, '_') && ParseNumber(state, NULL)) {\n    return true;\n  }\n  *state = copy;\n  return false;\n}\n\n// <substitution> ::= S_\n//                ::= S <seq-id> _\n//                ::= St, etc.\nstatic bool ParseSubstitution(State *state) {\n  if (ParseTwoCharToken(state, \"S_\")) {\n    MaybeAppend(state, \"?\");  // We don't support substitutions.\n    return true;\n  }\n\n  State copy = *state;\n  if (ParseOneCharToken(state, 'S') && ParseSeqId(state) &&\n      ParseOneCharToken(state, '_')) {\n    MaybeAppend(state, \"?\");  // We don't support substitutions.\n    return true;\n  }\n  *state = copy;\n\n  // Expand abbreviations like \"St\" => \"std\".\n  if (ParseOneCharToken(state, 'S')) {\n    const AbbrevPair *p;\n    for (p = kSubstitutionList; p->abbrev != NULL; ++p) {\n      if (state->mangled_cur[0] == p->abbrev[1]) {\n        MaybeAppend(state, \"std\");\n        if (p->real_name[0] != '\\0') {\n          MaybeAppend(state, \"::\");\n          MaybeAppend(state, p->real_name);\n        }\n        ++state->mangled_cur;\n        return true;\n      }\n    }\n  }\n  *state = copy;\n  return false;\n}\n\n// Parse <mangled-name>, optionally followed by either a function-clone suffix\n// or version suffix.  Returns true only if all of \"mangled_cur\" was consumed.\nstatic bool ParseTopLevelMangledName(State *state) {\n  if (ParseMangledName(state)) {\n    if (state->mangled_cur[0] != '\\0') {\n      // Drop trailing function clone suffix, if any.\n      if (IsFunctionCloneSuffix(state->mangled_cur)) {\n        return true;\n      }\n      // Append trailing version suffix if any.\n      // ex. _Z3foo@@GLIBCXX_3.4\n      if (state->mangled_cur[0] == '@') {\n        MaybeAppend(state, state->mangled_cur);\n        return true;\n      }\n      return false;  // Unconsumed suffix.\n    }\n    return true;\n  }\n  return false;\n}\n\n// The demangler entry point.\nbool Demangle(const char *mangled, char *out, int out_size) {\n  State state;\n  InitState(&state, mangled, out, out_size);\n  return ParseTopLevelMangledName(&state) && !state.overflowed;\n}\n\n_END_GOOGLE_NAMESPACE_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/demangle.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Satoru Takabayashi\n//\n// An async-signal-safe and thread-safe demangler for Itanium C++ ABI\n// (aka G++ V3 ABI).\n\n// The demangler is implemented to be used in async signal handlers to\n// symbolize stack traces.  We cannot use libstdc++'s\n// abi::__cxa_demangle() in such signal handlers since it's not async\n// signal safe (it uses malloc() internally).\n//\n// Note that this demangler doesn't support full demangling.  More\n// specifically, it doesn't print types of function parameters and\n// types of template arguments.  It just skips them.  However, it's\n// still very useful to extract basic information such as class,\n// function, constructor, destructor, and operator names.\n//\n// See the implementation note in demangle.cc if you are interested.\n//\n// Example:\n//\n// | Mangled Name  | The Demangler | abi::__cxa_demangle()\n// |---------------|---------------|-----------------------\n// | _Z1fv         | f()           | f()\n// | _Z1fi         | f()           | f(int)\n// | _Z3foo3bar    | foo()         | foo(bar)\n// | _Z1fIiEvi     | f<>()         | void f<int>(int)\n// | _ZN1N1fE      | N::f          | N::f\n// | _ZN3Foo3BarEv | Foo::Bar()    | Foo::Bar()\n// | _Zrm1XS_\"     | operator%()   | operator%(X, X)\n// | _ZN3FooC1Ev   | Foo::Foo()    | Foo::Foo()\n// | _Z1fSs        | f()           | f(std::basic_string<char,\n// |               |               |   std::char_traits<char>,\n// |               |               |   std::allocator<char> >)\n//\n// See the unit test for more examples.\n//\n// Note: we might want to write demanglers for ABIs other than Itanium\n// C++ ABI in the future.\n//\n\n#ifndef BASE_DEMANGLE_H_\n#define BASE_DEMANGLE_H_\n\n#include \"config.h\"\n\n_START_GOOGLE_NAMESPACE_\n\n// Demangle \"mangled\".  On success, return true and write the\n// demangled symbol name to \"out\".  Otherwise, return false.\n// \"out\" is modified even if demangling is unsuccessful.\nbool Demangle(const char *mangled, char *out, int out_size);\n\n_END_GOOGLE_NAMESPACE_\n\n#endif  // BASE_DEMANGLE_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/demangle_unittest.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Satoru Takabayashi\n//\n// Unit tests for functions in demangle.c.\n\n#include \"utilities.h\"\n\n#include <iostream>\n#include <fstream>\n#include <string>\n#include \"glog/logging.h\"\n#include \"demangle.h\"\n#include \"googletest.h\"\n#include \"config.h\"\n\nGLOG_DEFINE_bool(demangle_filter, false,\n                 \"Run demangle_unittest in filter mode\");\n\nusing namespace std;\nusing namespace GOOGLE_NAMESPACE;\n\n// A wrapper function for Demangle() to make the unit test simple.\nstatic const char *DemangleIt(const char * const mangled) {\n  static char demangled[4096];\n  if (Demangle(mangled, demangled, sizeof(demangled))) {\n    return demangled;\n  } else {\n    return mangled;\n  }\n}\n\n// Test corner cases of bounary conditions.\nTEST(Demangle, CornerCases) {\n  char tmp[10];\n  EXPECT_TRUE(Demangle(\"_Z6foobarv\", tmp, sizeof(tmp)));\n  // sizeof(\"foobar()\") == 9\n  EXPECT_STREQ(\"foobar()\", tmp);\n  EXPECT_TRUE(Demangle(\"_Z6foobarv\", tmp, 9));\n  EXPECT_STREQ(\"foobar()\", tmp);\n  EXPECT_FALSE(Demangle(\"_Z6foobarv\", tmp, 8));  // Not enough.\n  EXPECT_FALSE(Demangle(\"_Z6foobarv\", tmp, 1));\n  EXPECT_FALSE(Demangle(\"_Z6foobarv\", tmp, 0));\n  EXPECT_FALSE(Demangle(\"_Z6foobarv\", NULL, 0));  // Should not cause SEGV.\n}\n\n// Test handling of functions suffixed with .clone.N, which is used by GCC\n// 4.5.x, and .constprop.N and .isra.N, which are used by GCC 4.6.x.  These\n// suffixes are used to indicate functions which have been cloned during\n// optimization.  We ignore these suffixes.\nTEST(Demangle, Clones) {\n  char tmp[20];\n  EXPECT_TRUE(Demangle(\"_ZL3Foov\", tmp, sizeof(tmp)));\n  EXPECT_STREQ(\"Foo()\", tmp);\n  EXPECT_TRUE(Demangle(\"_ZL3Foov.clone.3\", tmp, sizeof(tmp)));\n  EXPECT_STREQ(\"Foo()\", tmp);\n  EXPECT_TRUE(Demangle(\"_ZL3Foov.constprop.80\", tmp, sizeof(tmp)));\n  EXPECT_STREQ(\"Foo()\", tmp);\n  EXPECT_TRUE(Demangle(\"_ZL3Foov.isra.18\", tmp, sizeof(tmp)));\n  EXPECT_STREQ(\"Foo()\", tmp);\n  EXPECT_TRUE(Demangle(\"_ZL3Foov.isra.2.constprop.18\", tmp, sizeof(tmp)));\n  EXPECT_STREQ(\"Foo()\", tmp);\n  // Invalid (truncated), should not demangle.\n  EXPECT_FALSE(Demangle(\"_ZL3Foov.clo\", tmp, sizeof(tmp)));\n  // Invalid (.clone. not followed by number), should not demangle.\n  EXPECT_FALSE(Demangle(\"_ZL3Foov.clone.\", tmp, sizeof(tmp)));\n  // Invalid (.clone. followed by non-number), should not demangle.\n  EXPECT_FALSE(Demangle(\"_ZL3Foov.clone.foo\", tmp, sizeof(tmp)));\n  // Invalid (.constprop. not followed by number), should not demangle.\n  EXPECT_FALSE(Demangle(\"_ZL3Foov.isra.2.constprop.\", tmp, sizeof(tmp)));\n}\n\nTEST(Demangle, FromFile) {\n  string test_file = FLAGS_test_srcdir + \"/src/demangle_unittest.txt\";\n  ifstream f(test_file.c_str());  // The file should exist.\n  EXPECT_FALSE(f.fail());\n\n  string line;\n  while (getline(f, line)) {\n    // Lines start with '#' are considered as comments.\n    if (line.empty() || line[0] == '#') {\n      continue;\n    }\n    // Each line should contain a mangled name and a demangled name\n    // separated by '\\t'.  Example: \"_Z3foo\\tfoo\"\n    string::size_type tab_pos = line.find('\\t');\n    EXPECT_NE(string::npos, tab_pos);\n    string mangled = line.substr(0, tab_pos);\n    string demangled = line.substr(tab_pos + 1);\n    EXPECT_EQ(demangled, DemangleIt(mangled.c_str()));\n  }\n}\n\nint main(int argc, char **argv) {\n#ifdef HAVE_LIB_GFLAGS\n  ParseCommandLineFlags(&argc, &argv, true);\n#endif\n  InitGoogleTest(&argc, argv);\n\n  FLAGS_logtostderr = true;\n  InitGoogleLogging(argv[0]);\n  if (FLAGS_demangle_filter) {\n    // Read from cin and write to cout.\n    string line;\n    while (getline(cin, line, '\\n')) {\n      cout << DemangleIt(line.c_str()) << endl;\n    }\n    return 0;\n  } else if (argc > 1) {\n    cout << DemangleIt(argv[1]) << endl;\n    return 0;\n  } else {\n    return RUN_ALL_TESTS();\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/demangle_unittest.sh",
    "content": "#! /bin/sh\n#\n# Copyright (c) 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# Author: Satoru Takabayashi\n#\n# Unit tests for demangle.c with a real binary.\n\nset -e\n\ndie () {\n    echo $1\n    exit 1\n}\n\nBINDIR=\".libs\"\nLIBGLOG=\"$BINDIR/libglog.so\"\n\nDEMANGLER=\"$BINDIR/demangle_unittest\"\n\nif test -e \"$DEMANGLER\"; then\n  # We need shared object.\n  export LD_LIBRARY_PATH=$BINDIR\n  export DYLD_LIBRARY_PATH=$BINDIR\nelse\n  # For windows\n  DEMANGLER=\"./demangle_unittest.exe\"\n  if ! test -e \"$DEMANGLER\"; then\n    echo \"We coundn't find demangle_unittest binary.\"\n    exit 1\n  fi\nfi\n\n# Extract C++ mangled symbols from libbase.so.\nNM_OUTPUT=\"demangle.nm\"\nnm \"$LIBGLOG\" | perl -nle 'print $1 if /\\s(_Z\\S+$)/' > \"$NM_OUTPUT\"\n\n# Check if mangled symbols exist. If there are none, we quit.\n# The binary is more likely compiled with GCC 2.95 or something old.\nif ! grep --quiet '^_Z' \"$NM_OUTPUT\"; then\n    echo \"PASS\"\n    exit 0\nfi\n\n# Demangle the symbols using our demangler.\nDM_OUTPUT=\"demangle.dm\"\nGLOG_demangle_filter=1 \"$DEMANGLER\" --demangle_filter < \"$NM_OUTPUT\" > \"$DM_OUTPUT\"\n\n# Calculate the numbers of lines.\nNM_LINES=`wc -l \"$NM_OUTPUT\" | awk '{ print $1 }'`\nDM_LINES=`wc -l \"$DM_OUTPUT\" | awk '{ print $1 }'`\n\n# Compare the numbers of lines.  They must be the same.\nif test \"$NM_LINES\" != \"$DM_LINES\"; then\n    die \"$NM_OUTPUT and $DM_OUTPUT don't have the same numbers of lines\"\nfi\n\n# Check if mangled symbols exist.  They must not exist.\nif grep --quiet '^_Z' \"$DM_OUTPUT\"; then\n    MANGLED=`grep '^_Z' \"$DM_OUTPUT\" | wc -l | awk '{ print \\$1 }'`\n    echo \"Mangled symbols ($MANGLED out of $NM_LINES) found in $DM_OUTPUT:\"\n    grep '^_Z' \"$DM_OUTPUT\"\n    die \"Mangled symbols ($MANGLED out of $NM_LINES) found in $DM_OUTPUT\"\nfi\n\n# All C++ symbols are demangled successfully.\necho \"PASS\"\nexit 0\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/demangle_unittest.txt",
    "content": "# Test caces for demangle_unittest.  Each line consists of a\n# tab-separated pair of mangled and demangled symbol names.\n\n# Constructors and destructors.\n_ZN3FooC1Ev\tFoo::Foo()\n_ZN3FooD1Ev\tFoo::~Foo()\n_ZNSoD0Ev\tstd::ostream::~ostream()\n\n# G++ extensions.\n_ZTCN10LogMessage9LogStreamE0_So\tLogMessage::LogStream\n_ZTv0_n12_N10LogMessage9LogStreamD0Ev\tLogMessage::LogStream::~LogStream()\n_ZThn4_N7icu_3_410UnicodeSetD0Ev\ticu_3_4::UnicodeSet::~UnicodeSet()\n\n# A bug in g++'s C++ ABI version 2 (-fabi-version=2).\n_ZN7NSSInfoI5groupjjXadL_Z10getgrgid_rEELZ19nss_getgrgid_r_nameEEC1Ei\tNSSInfo<>::NSSInfo()\n\n# C linkage symbol names.  Should keep them untouched.\nmain\tmain\nDemangle\tDemangle\n_ZERO\t_ZERO\n\n# Cast operator.\n_Zcviv\toperator int()\n_ZN3foocviEv\tfoo::operator int()\n\n# Versioned symbols.\n_Z3Foo@GLIBCXX_3.4\tFoo@GLIBCXX_3.4\n_Z3Foo@@GLIBCXX_3.4\tFoo@@GLIBCXX_3.4\n\n# Abbreviations.\n_ZNSaE\tstd::allocator\n_ZNSbE\tstd::basic_string\n_ZNSdE\tstd::iostream\n_ZNSiE\tstd::istream\n_ZNSoE\tstd::ostream\n_ZNSsE\tstd::string\n\n# Substitutions.  We just replace them with ?.\n_ZN3fooS_E\tfoo::?\n_ZN3foo3barS0_E\tfoo::bar::?\n_ZNcvT_IiEEv\toperator ?<>()\n\n# \"<< <\" case.\n_ZlsI3fooE\toperator<< <>\n\n# Random things we found interesting.\n_ZN3FooISt6vectorISsSaISsEEEclEv\tFoo<>::operator()()\n_ZTI9Callback1IiE\tCallback1<>\n_ZN7icu_3_47UMemorynwEj\ticu_3_4::UMemory::operator new()\n_ZNSt6vectorIbE9push_backE\tstd::vector<>::push_back\n_ZNSt6vectorIbSaIbEE9push_backEb\tstd::vector<>::push_back()\n_ZlsRSoRK15PRIVATE_Counter\toperator<<()\n_ZSt6fill_nIPPN9__gnu_cxx15_Hashtable_nodeISt4pairIKPKcjEEEjS8_ET_SA_T0_RKT1_\tstd::fill_n<>()\n_ZZ3FoovE3Bar\tFoo()::Bar\n_ZGVZ7UpTimervE8up_timer\tUpTimer()::up_timer\n\n# Test cases from gcc-4.1.0/libstdc++-v3/testsuite/demangle.\n# Collected by:\n# % grep verify_demangle **/*.cc | perl -nle 'print $1 if /\"(_Z.*?)\"/' |\n#   sort | uniq\n#\n# Note that the following symbols are invalid.\n# That's why they are not demangled.\n# - _ZNZN1N1fEiE1X1gE\n# - _ZNZN1N1fEiE1X1gEv\n# - _Z1xINiEE\n_Z1fA37_iPS_\tf()\n_Z1fAszL_ZZNK1N1A1fEvE3foo_0E_i\tf()\n_Z1fI1APS0_PKS0_EvT_T0_T1_PA4_S3_M1CS8_\tf<>()\n_Z1fI1XENT_1tES2_\tf<>()\n_Z1fI1XEvPVN1AIT_E1TE\tf<>()\n_Z1fILi1ELc120EEv1AIXplT_cviLd4028ae147ae147aeEEE\tf<>()\n_Z1fILi1ELc120EEv1AIXplT_cviLf3f800000EEE\tf<>()\n_Z1fILi5E1AEvN1CIXqugtT_Li0ELi1ELi2EEE1qE\tf<>()\n_Z1fILi5E1AEvN1CIXstN1T1tEEXszsrS2_1tEE1qE\tf<>()\n_Z1fILi5EEvN1AIXcvimlT_Li22EEE1qE\tf<>()\n_Z1fIiEvi\tf<>()\n_Z1fKPFiiE\tf()\n_Z1fM1AFivEPS0_\tf()\n_Z1fM1AKFivE\tf()\n_Z1fM1AKFvvE\tf()\n_Z1fPFPA1_ivE\tf()\n_Z1fPFYPFiiEiE\tf()\n_Z1fPFvvEM1SFvvE\tf()\n_Z1fPKM1AFivE\tf()\n_Z1fi\tf()\n_Z1fv\tf()\n_Z1jM1AFivEPS1_\tj()\n_Z1rM1GFivEMS_KFivES_M1HFivES1_4whatIKS_E5what2IS8_ES3_\tr()\n_Z1sPA37_iPS0_\ts()\n_Z1xINiEE\t_Z1xINiEE\n_Z3absILi11EEvv\tabs<>()\n_Z3foo3bar\tfoo()\n_Z3foo5Hello5WorldS0_S_\tfoo()\n_Z3fooA30_A_i\tfoo()\n_Z3fooIA6_KiEvA9_KT_rVPrS4_\tfoo<>()\n_Z3fooILi2EEvRAplT_Li1E_i\tfoo<>()\n_Z3fooIiFvdEiEvv\tfoo<>()\n_Z3fooPM2ABi\tfoo()\n_Z3fooc\tfoo()\n_Z3fooiPiPS_PS0_PS1_PS2_PS3_PS4_PS5_PS6_PS7_PS8_PS9_PSA_PSB_PSC_\tfoo()\n_Z3kooPA28_A30_i\tkoo()\n_Z4makeI7FactoryiET_IT0_Ev\tmake<>()\n_Z5firstI3DuoEvS0_\tfirst<>()\n_Z5firstI3DuoEvT_\tfirst<>()\n_Z9hairyfuncM1YKFPVPFrPA2_PM1XKFKPA3_ilEPcEiE\thairyfunc()\n_ZGVN5libcw24_GLOBAL__N_cbll.cc0ZhUKa23compiler_bug_workaroundISt6vectorINS_13omanip_id_tctINS_5debug32memblk_types_manipulator_data_ctEEESaIS6_EEE3idsE\tlibcw::(anonymous namespace)::compiler_bug_workaround<>::ids\n_ZN12libcw_app_ct10add_optionIS_EEvMT_FvPKcES3_cS3_S3_\tlibcw_app_ct::add_option<>()\n_ZN1AIfEcvT_IiEEv\tA<>::operator ?<>()\n_ZN1N1TIiiE2mfES0_IddE\tN::T<>::mf()\n_ZN1N1fE\tN::f\n_ZN1f1fE\tf::f\n_ZN3FooIA4_iE3barE\tFoo<>::bar\n_ZN5Arena5levelE\tArena::level\n_ZN5StackIiiE5levelE\tStack<>::level\n_ZN5libcw5debug13cwprint_usingINS_9_private_12GlobalObjectEEENS0_17cwprint_using_tctIT_EERKS5_MS5_KFvRSt7ostreamE\tlibcw::debug::cwprint_using<>()\n_ZN6System5Sound4beepEv\tSystem::Sound::beep()\n_ZNKSt14priority_queueIP27timer_event_request_base_ctSt5dequeIS1_SaIS1_EE13timer_greaterE3topEv\tstd::priority_queue<>::top()\n_ZNKSt15_Deque_iteratorIP15memory_block_stRKS1_PS2_EeqERKS5_\tstd::_Deque_iterator<>::operator==()\n_ZNKSt17__normal_iteratorIPK6optionSt6vectorIS0_SaIS0_EEEmiERKS6_\tstd::__normal_iterator<>::operator-()\n_ZNSbIcSt11char_traitsIcEN5libcw5debug27no_alloc_checking_allocatorEE12_S_constructIPcEES6_T_S7_RKS3_\tstd::basic_string<>::_S_construct<>()\n_ZNSt13_Alloc_traitsISbIcSt18string_char_traitsIcEN5libcw5debug9_private_17allocator_adaptorIcSt24__default_alloc_templateILb0ELi327664EELb1EEEENS5_IS9_S7_Lb1EEEE15_S_instancelessE\tstd::_Alloc_traits<>::_S_instanceless\n_ZNSt3_In4wardE\tstd::_In::ward\n_ZNZN1N1fEiE1X1gE\t_ZNZN1N1fEiE1X1gE\n_ZNZN1N1fEiE1X1gEv\t_ZNZN1N1fEiE1X1gEv\n_ZSt1BISt1DIP1ARKS2_PS3_ES0_IS2_RS2_PS2_ES2_ET0_T_SB_SA_PT1_\tstd::B<>()\n_ZSt5state\tstd::state\n_ZTI7a_class\ta_class\n_ZZN1N1fEiE1p\tN::f()::p\n_ZZN1N1fEiEs\tN::f()\n_ZlsRK1XS1_\toperator<<()\n_ZlsRKU3fooU4bart1XS0_\toperator<<()\n_ZlsRKU3fooU4bart1XS2_\toperator<<()\n_ZlsRSoRKSs\toperator<<()\n_ZngILi42EEvN1AIXplT_Li2EEE1TE\toperator-<>()\n_ZplR1XS0_\toperator+()\n_Zrm1XS_\toperator%()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/glog/log_severity.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef BASE_LOG_SEVERITY_H__\n#define BASE_LOG_SEVERITY_H__\n\n// Annoying stuff for windows -- makes sure clients can import these functions\n#ifndef GOOGLE_GLOG_DLL_DECL\n# if defined(_WIN32) && !defined(__CYGWIN__)\n#   define GOOGLE_GLOG_DLL_DECL  __declspec(dllimport)\n# else\n#   define GOOGLE_GLOG_DLL_DECL\n# endif\n#endif\n\n// Variables of type LogSeverity are widely taken to lie in the range\n// [0, NUM_SEVERITIES-1].  Be careful to preserve this assumption if\n// you ever need to change their values or add a new severity.\ntypedef int LogSeverity;\n\nconst int INFO = 0, WARNING = 1, ERROR = 2, FATAL = 3, NUM_SEVERITIES = 4;\n\n// DFATAL is FATAL in debug mode, ERROR in normal mode\n#ifdef NDEBUG\n#define DFATAL_LEVEL ERROR\n#else\n#define DFATAL_LEVEL FATAL\n#endif\n\nextern GOOGLE_GLOG_DLL_DECL const char* const LogSeverityNames[NUM_SEVERITIES];\n\n// NDEBUG usage helpers related to (RAW_)DCHECK:\n//\n// DEBUG_MODE is for small !NDEBUG uses like\n//   if (DEBUG_MODE) foo.CheckThatFoo();\n// instead of substantially more verbose\n//   #ifndef NDEBUG\n//     foo.CheckThatFoo();\n//   #endif\n//\n// IF_DEBUG_MODE is for small !NDEBUG uses like\n//   IF_DEBUG_MODE( string error; )\n//   DCHECK(Foo(&error)) << error;\n// instead of substantially more verbose\n//   #ifndef NDEBUG\n//     string error;\n//     DCHECK(Foo(&error)) << error;\n//   #endif\n//\n#ifdef NDEBUG\nenum { DEBUG_MODE = 0 };\n#define IF_DEBUG_MODE(x)\n#else\nenum { DEBUG_MODE = 1 };\n#define IF_DEBUG_MODE(x) x\n#endif\n\n#endif  // BASE_LOG_SEVERITY_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/glog/logging.h.in",
    "content": "// Copyright (c) 1999, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Ray Sidney\n//\n// This file contains #include information about logging-related stuff.\n// Pretty much everybody needs to #include this file so that they can\n// log various happenings.\n//\n#ifndef _LOGGING_H_\n#define _LOGGING_H_\n\n#include <errno.h>\n#include <string.h>\n#include <time.h>\n#include <string>\n#if @ac_cv_have_unistd_h@\n# include <unistd.h>\n#endif\n#ifdef __DEPRECATED\n// Make GCC quiet.\n# undef __DEPRECATED\n# include <strstream>\n# define __DEPRECATED\n#else\n# include <strstream>\n#endif\n#include <vector>\n\n// Annoying stuff for windows -- makes sure clients can import these functions\n#ifndef GOOGLE_GLOG_DLL_DECL\n# if defined(_WIN32) && !defined(__CYGWIN__)\n#   define GOOGLE_GLOG_DLL_DECL  __declspec(dllimport)\n# else\n#   define GOOGLE_GLOG_DLL_DECL\n# endif\n#endif\n\n// We care a lot about number of bits things take up.  Unfortunately,\n// systems define their bit-specific ints in a lot of different ways.\n// We use our own way, and have a typedef to get there.\n// Note: these commands below may look like \"#if 1\" or \"#if 0\", but\n// that's because they were constructed that way at ./configure time.\n// Look at logging.h.in to see how they're calculated (based on your config).\n#if @ac_cv_have_stdint_h@\n#include <stdint.h>             // the normal place uint16_t is defined\n#endif\n#if @ac_cv_have_systypes_h@\n#include <sys/types.h>          // the normal place u_int16_t is defined\n#endif\n#if @ac_cv_have_inttypes_h@\n#include <inttypes.h>           // a third place for uint16_t or u_int16_t\n#endif\n\n#if @ac_cv_have_libgflags@\n#include <gflags/gflags.h>\n#endif\n\n@ac_google_start_namespace@\n\n#if @ac_cv_have_uint16_t@      // the C99 format\ntypedef int32_t int32;\ntypedef uint32_t uint32;\ntypedef int64_t int64;\ntypedef uint64_t uint64;\n#elif @ac_cv_have_u_int16_t@   // the BSD format\ntypedef int32_t int32;\ntypedef u_int32_t uint32;\ntypedef int64_t int64;\ntypedef u_int64_t uint64;\n#elif @ac_cv_have___uint16@    // the windows (vc7) format\ntypedef __int32 int32;\ntypedef unsigned __int32 uint32;\ntypedef __int64 int64;\ntypedef unsigned __int64 uint64;\n#else\n#error Do not know how to define a 32-bit integer quantity on your system\n#endif\n\n@ac_google_end_namespace@\n\n// The global value of GOOGLE_STRIP_LOG. All the messages logged to\n// LOG(XXX) with severity less than GOOGLE_STRIP_LOG will not be displayed.\n// If it can be determined at compile time that the message will not be\n// printed, the statement will be compiled out.\n//\n// Example: to strip out all INFO and WARNING messages, use the value\n// of 2 below. To make an exception for WARNING messages from a single\n// file, add \"#define GOOGLE_STRIP_LOG 1\" to that file _before_ including\n// base/logging.h\n#ifndef GOOGLE_STRIP_LOG\n#define GOOGLE_STRIP_LOG 0\n#endif\n\n// GCC can be told that a certain branch is not likely to be taken (for\n// instance, a CHECK failure), and use that information in static analysis.\n// Giving it this information can help it optimize for the common case in\n// the absence of better information (ie. -fprofile-arcs).\n//\n#ifndef GOOGLE_PREDICT_BRANCH_NOT_TAKEN\n#if @ac_cv_have___builtin_expect@\n#define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) (__builtin_expect(x, 0))\n#else\n#define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) x\n#endif\n#endif\n\n// Make a bunch of macros for logging.  The way to log things is to stream\n// things to LOG(<a particular severity level>).  E.g.,\n//\n//   LOG(INFO) << \"Found \" << num_cookies << \" cookies\";\n//\n// You can capture log messages in a string, rather than reporting them\n// immediately:\n//\n//   vector<string> errors;\n//   LOG_STRING(ERROR, &errors) << \"Couldn't parse cookie #\" << cookie_num;\n//\n// This pushes back the new error onto 'errors'; if given a NULL pointer,\n// it reports the error via LOG(ERROR).\n//\n// You can also do conditional logging:\n//\n//   LOG_IF(INFO, num_cookies > 10) << \"Got lots of cookies\";\n//\n// You can also do occasional logging (log every n'th occurrence of an\n// event):\n//\n//   LOG_EVERY_N(INFO, 10) << \"Got the \" << google::COUNTER << \"th cookie\";\n//\n// The above will cause log messages to be output on the 1st, 11th, 21st, ...\n// times it is executed.  Note that the special google::COUNTER value is used\n// to identify which repetition is happening.\n//\n// You can also do occasional conditional logging (log every n'th\n// occurrence of an event, when condition is satisfied):\n//\n//   LOG_IF_EVERY_N(INFO, (size > 1024), 10) << \"Got the \" << google::COUNTER\n//                                           << \"th big cookie\";\n//\n// You can log messages the first N times your code executes a line. E.g.\n//\n//   LOG_FIRST_N(INFO, 20) << \"Got the \" << google::COUNTER << \"th cookie\";\n//\n// Outputs log messages for the first 20 times it is executed.\n//\n// Analogous SYSLOG, SYSLOG_IF, and SYSLOG_EVERY_N macros are available.\n// These log to syslog as well as to the normal logs.  If you use these at\n// all, you need to be aware that syslog can drastically reduce performance,\n// especially if it is configured for remote logging!  Don't use these\n// unless you fully understand this and have a concrete need to use them.\n// Even then, try to minimize your use of them.\n//\n// There are also \"debug mode\" logging macros like the ones above:\n//\n//   DLOG(INFO) << \"Found cookies\";\n//\n//   DLOG_IF(INFO, num_cookies > 10) << \"Got lots of cookies\";\n//\n//   DLOG_EVERY_N(INFO, 10) << \"Got the \" << google::COUNTER << \"th cookie\";\n//\n// All \"debug mode\" logging is compiled away to nothing for non-debug mode\n// compiles.\n//\n// We also have\n//\n//   LOG_ASSERT(assertion);\n//   DLOG_ASSERT(assertion);\n//\n// which is syntactic sugar for {,D}LOG_IF(FATAL, assert fails) << assertion;\n//\n// There are \"verbose level\" logging macros.  They look like\n//\n//   VLOG(1) << \"I'm printed when you run the program with --v=1 or more\";\n//   VLOG(2) << \"I'm printed when you run the program with --v=2 or more\";\n//\n// These always log at the INFO log level (when they log at all).\n// The verbose logging can also be turned on module-by-module.  For instance,\n//    --vmodule=mapreduce=2,file=1,gfs*=3 --v=0\n// will cause:\n//   a. VLOG(2) and lower messages to be printed from mapreduce.{h,cc}\n//   b. VLOG(1) and lower messages to be printed from file.{h,cc}\n//   c. VLOG(3) and lower messages to be printed from files prefixed with \"gfs\"\n//   d. VLOG(0) and lower messages to be printed from elsewhere\n//\n// The wildcarding functionality shown by (c) supports both '*' (match\n// 0 or more characters) and '?' (match any single character) wildcards.\n//\n// There's also VLOG_IS_ON(n) \"verbose level\" condition macro. To be used as\n//\n//   if (VLOG_IS_ON(2)) {\n//     // do some logging preparation and logging\n//     // that can't be accomplished with just VLOG(2) << ...;\n//   }\n//\n// There are also VLOG_IF, VLOG_EVERY_N and VLOG_IF_EVERY_N \"verbose level\"\n// condition macros for sample cases, when some extra computation and\n// preparation for logs is not needed.\n//   VLOG_IF(1, (size > 1024))\n//      << \"I'm printed when size is more than 1024 and when you run the \"\n//         \"program with --v=1 or more\";\n//   VLOG_EVERY_N(1, 10)\n//      << \"I'm printed every 10th occurrence, and when you run the program \"\n//         \"with --v=1 or more. Present occurence is \" << google::COUNTER;\n//   VLOG_IF_EVERY_N(1, (size > 1024), 10)\n//      << \"I'm printed on every 10th occurence of case when size is more \"\n//         \" than 1024, when you run the program with --v=1 or more. \";\n//         \"Present occurence is \" << google::COUNTER;\n//\n// The supported severity levels for macros that allow you to specify one\n// are (in increasing order of severity) INFO, WARNING, ERROR, and FATAL.\n// Note that messages of a given severity are logged not only in the\n// logfile for that severity, but also in all logfiles of lower severity.\n// E.g., a message of severity FATAL will be logged to the logfiles of\n// severity FATAL, ERROR, WARNING, and INFO.\n//\n// There is also the special severity of DFATAL, which logs FATAL in\n// debug mode, ERROR in normal mode.\n//\n// Very important: logging a message at the FATAL severity level causes\n// the program to terminate (after the message is logged).\n//\n// Unless otherwise specified, logs will be written to the filename\n// \"<program name>.<hostname>.<user name>.log.<severity level>.\", followed\n// by the date, time, and pid (you can't prevent the date, time, and pid\n// from being in the filename).\n//\n// The logging code takes two flags:\n//     --v=#           set the verbose level\n//     --logtostderr   log all the messages to stderr instead of to logfiles\n\n// LOG LINE PREFIX FORMAT\n//\n// Log lines have this form:\n//\n//     Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg...\n//\n// where the fields are defined as follows:\n//\n//   L                A single character, representing the log level\n//                    (eg 'I' for INFO)\n//   mm               The month (zero padded; ie May is '05')\n//   dd               The day (zero padded)\n//   hh:mm:ss.uuuuuu  Time in hours, minutes and fractional seconds\n//   threadid         The space-padded thread ID as returned by GetTID()\n//                    (this matches the PID on Linux)\n//   file             The file name\n//   line             The line number\n//   msg              The user-supplied message\n//\n// Example:\n//\n//   I1103 11:57:31.739339 24395 google.cc:2341] Command line: ./some_prog\n//   I1103 11:57:31.739403 24395 google.cc:2342] Process id 24395\n//\n// NOTE: although the microseconds are useful for comparing events on\n// a single machine, clocks on different machines may not be well\n// synchronized.  Hence, use caution when comparing the low bits of\n// timestamps from different machines.\n\n#ifndef DECLARE_VARIABLE\n#define MUST_UNDEF_GFLAGS_DECLARE_MACROS\n#define DECLARE_VARIABLE(type, name, tn)                                      \\\n  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead {  \\\n  extern GOOGLE_GLOG_DLL_DECL type FLAGS_##name;                              \\\n  }                                                                           \\\n  using FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead::FLAGS_##name\n\n// bool specialization\n#define DECLARE_bool(name) \\\n  DECLARE_VARIABLE(bool, name, bool)\n\n// int32 specialization\n#define DECLARE_int32(name) \\\n  DECLARE_VARIABLE(@ac_google_namespace@::int32, name, int32)\n\n// Special case for string, because we have to specify the namespace\n// std::string, which doesn't play nicely with our FLAG__namespace hackery.\n#define DECLARE_string(name)                                          \\\n  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead {  \\\n  extern GOOGLE_GLOG_DLL_DECL std::string FLAGS_##name;                       \\\n  }                                                                           \\\n  using FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead::FLAGS_##name\n#endif\n\n// Set whether log messages go to stderr instead of logfiles\nDECLARE_bool(logtostderr);\n\n// Set whether log messages go to stderr in addition to logfiles.\nDECLARE_bool(alsologtostderr);\n\n// Log messages at a level >= this flag are automatically sent to\n// stderr in addition to log files.\nDECLARE_int32(stderrthreshold);\n\n// Set whether the log prefix should be prepended to each line of output.\nDECLARE_bool(log_prefix);\n\n// Log messages at a level <= this flag are buffered.\n// Log messages at a higher level are flushed immediately.\nDECLARE_int32(logbuflevel);\n\n// Sets the maximum number of seconds which logs may be buffered for.\nDECLARE_int32(logbufsecs);\n\n// Log suppression level: messages logged at a lower level than this\n// are suppressed.\nDECLARE_int32(minloglevel);\n\n// If specified, logfiles are written into this directory instead of the\n// default logging directory.\nDECLARE_string(log_dir);\n\n// Sets the path of the directory into which to put additional links\n// to the log files.\nDECLARE_string(log_link);\n\nDECLARE_int32(v);  // in vlog_is_on.cc\n\n// Sets the maximum log file size (in MB).\nDECLARE_int32(max_log_size);\n\n// Sets whether to avoid logging to the disk if the disk is full.\nDECLARE_bool(stop_logging_if_full_disk);\n\n#ifdef MUST_UNDEF_GFLAGS_DECLARE_MACROS\n#undef MUST_UNDEF_GFLAGS_DECLARE_MACROS\n#undef DECLARE_VARIABLE\n#undef DECLARE_bool\n#undef DECLARE_int32\n#undef DECLARE_string\n#endif\n\n// Log messages below the GOOGLE_STRIP_LOG level will be compiled away for\n// security reasons. See LOG(severtiy) below.\n\n// A few definitions of macros that don't generate much code.  Since\n// LOG(INFO) and its ilk are used all over our code, it's\n// better to have compact code for these operations.\n\n#if GOOGLE_STRIP_LOG == 0\n#define COMPACT_GOOGLE_LOG_INFO @ac_google_namespace@::LogMessage( \\\n      __FILE__, __LINE__)\n#define LOG_TO_STRING_INFO(message) @ac_google_namespace@::LogMessage( \\\n      __FILE__, __LINE__, @ac_google_namespace@::INFO, message)\n#else\n#define COMPACT_GOOGLE_LOG_INFO @ac_google_namespace@::NullStream()\n#define LOG_TO_STRING_INFO(message) @ac_google_namespace@::NullStream()\n#endif\n\n#if GOOGLE_STRIP_LOG <= 1\n#define COMPACT_GOOGLE_LOG_WARNING @ac_google_namespace@::LogMessage( \\\n      __FILE__, __LINE__, @ac_google_namespace@::WARNING)\n#define LOG_TO_STRING_WARNING(message) @ac_google_namespace@::LogMessage( \\\n      __FILE__, __LINE__, @ac_google_namespace@::WARNING, message)\n#else\n#define COMPACT_GOOGLE_LOG_WARNING @ac_google_namespace@::NullStream()\n#define LOG_TO_STRING_WARNING(message) @ac_google_namespace@::NullStream()\n#endif\n\n#if GOOGLE_STRIP_LOG <= 2\n#define COMPACT_GOOGLE_LOG_ERROR @ac_google_namespace@::LogMessage( \\\n      __FILE__, __LINE__, @ac_google_namespace@::ERROR)\n#define LOG_TO_STRING_ERROR(message) @ac_google_namespace@::LogMessage( \\\n      __FILE__, __LINE__, @ac_google_namespace@::ERROR, message)\n#else\n#define COMPACT_GOOGLE_LOG_ERROR @ac_google_namespace@::NullStream()\n#define LOG_TO_STRING_ERROR(message) @ac_google_namespace@::NullStream()\n#endif\n\n#if GOOGLE_STRIP_LOG <= 3\n#define COMPACT_GOOGLE_LOG_FATAL @ac_google_namespace@::LogMessageFatal( \\\n      __FILE__, __LINE__)\n#define LOG_TO_STRING_FATAL(message) @ac_google_namespace@::LogMessage( \\\n      __FILE__, __LINE__, @ac_google_namespace@::FATAL, message)\n#else\n#define COMPACT_GOOGLE_LOG_FATAL @ac_google_namespace@::NullStreamFatal()\n#define LOG_TO_STRING_FATAL(message) @ac_google_namespace@::NullStreamFatal()\n#endif\n\n// For DFATAL, we want to use LogMessage (as opposed to\n// LogMessageFatal), to be consistent with the original behavior.\n#ifdef NDEBUG\n#define COMPACT_GOOGLE_LOG_DFATAL COMPACT_GOOGLE_LOG_ERROR\n#elif GOOGLE_STRIP_LOG <= 3\n#define COMPACT_GOOGLE_LOG_DFATAL @ac_google_namespace@::LogMessage( \\\n      __FILE__, __LINE__, @ac_google_namespace@::FATAL)\n#else\n#define COMPACT_GOOGLE_LOG_DFATAL @ac_google_namespace@::NullStreamFatal()\n#endif\n\n#define GOOGLE_LOG_INFO(counter) @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::INFO, counter, &@ac_google_namespace@::LogMessage::SendToLog)\n#define SYSLOG_INFO(counter) \\\n  @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::INFO, counter, \\\n  &@ac_google_namespace@::LogMessage::SendToSyslogAndLog)\n#define GOOGLE_LOG_WARNING(counter)  \\\n  @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::WARNING, counter, \\\n  &@ac_google_namespace@::LogMessage::SendToLog)\n#define SYSLOG_WARNING(counter)  \\\n  @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::WARNING, counter, \\\n  &@ac_google_namespace@::LogMessage::SendToSyslogAndLog)\n#define GOOGLE_LOG_ERROR(counter)  \\\n  @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::ERROR, counter, \\\n  &@ac_google_namespace@::LogMessage::SendToLog)\n#define SYSLOG_ERROR(counter)  \\\n  @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::ERROR, counter, \\\n  &@ac_google_namespace@::LogMessage::SendToSyslogAndLog)\n#define GOOGLE_LOG_FATAL(counter) \\\n  @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::FATAL, counter, \\\n  &@ac_google_namespace@::LogMessage::SendToLog)\n#define SYSLOG_FATAL(counter) \\\n  @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::FATAL, counter, \\\n  &@ac_google_namespace@::LogMessage::SendToSyslogAndLog)\n#define GOOGLE_LOG_DFATAL(counter) \\\n  @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::DFATAL_LEVEL, counter, \\\n  &@ac_google_namespace@::LogMessage::SendToLog)\n#define SYSLOG_DFATAL(counter) \\\n  @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::DFATAL_LEVEL, counter, \\\n  &@ac_google_namespace@::LogMessage::SendToSyslogAndLog)\n\n#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) || defined(__CYGWIN32__)\n// A very useful logging macro to log windows errors:\n#define LOG_SYSRESULT(result) \\\n  if (FAILED(result)) { \\\n    LPTSTR message = NULL; \\\n    LPTSTR msg = reinterpret_cast<LPTSTR>(&message); \\\n    DWORD message_length = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | \\\n                         FORMAT_MESSAGE_FROM_SYSTEM, \\\n                         0, result, 0, msg, 100, NULL); \\\n    if (message_length > 0) { \\\n      @ac_google_namespace@::LogMessage(__FILE__, __LINE__, ERROR, 0, \\\n          &@ac_google_namespace@::LogMessage::SendToLog).stream() << message; \\\n      LocalFree(message); \\\n    } \\\n  }\n#endif\n\n// We use the preprocessor's merging operator, \"##\", so that, e.g.,\n// LOG(INFO) becomes the token GOOGLE_LOG_INFO.  There's some funny\n// subtle difference between ostream member streaming functions (e.g.,\n// ostream::operator<<(int) and ostream non-member streaming functions\n// (e.g., ::operator<<(ostream&, string&): it turns out that it's\n// impossible to stream something like a string directly to an unnamed\n// ostream. We employ a neat hack by calling the stream() member\n// function of LogMessage which seems to avoid the problem.\n#define LOG(severity) COMPACT_GOOGLE_LOG_ ## severity.stream()\n#define SYSLOG(severity) SYSLOG_ ## severity(0).stream()\n\n@ac_google_start_namespace@\n\n// They need the definitions of integer types.\n#include \"glog/log_severity.h\"\n#include \"glog/vlog_is_on.h\"\n\n// Initialize google's logging library. You will see the program name\n// specified by argv0 in log outputs.\nGOOGLE_GLOG_DLL_DECL void InitGoogleLogging(const char* argv0);\n\n// Shutdown google's logging library.\nGOOGLE_GLOG_DLL_DECL void ShutdownGoogleLogging();\n\n// Install a function which will be called after LOG(FATAL).\nGOOGLE_GLOG_DLL_DECL void InstallFailureFunction(void (*fail_func)());\n\nclass LogSink;  // defined below\n\n// If a non-NULL sink pointer is given, we push this message to that sink.\n// For LOG_TO_SINK we then do normal LOG(severity) logging as well.\n// This is useful for capturing messages and passing/storing them\n// somewhere more specific than the global log of the process.\n// Argument types:\n//   LogSink* sink;\n//   LogSeverity severity;\n// The cast is to disambiguate NULL arguments.\n#define LOG_TO_SINK(sink, severity) \\\n  @ac_google_namespace@::LogMessage(                                    \\\n      __FILE__, __LINE__,                                               \\\n      @ac_google_namespace@::severity,                                  \\\n      static_cast<@ac_google_namespace@::LogSink*>(sink), true).stream()\n#define LOG_TO_SINK_BUT_NOT_TO_LOGFILE(sink, severity)                  \\\n  @ac_google_namespace@::LogMessage(                                    \\\n      __FILE__, __LINE__,                                               \\\n      @ac_google_namespace@::severity,                                  \\\n      static_cast<@ac_google_namespace@::LogSink*>(sink), false).stream()\n\n// If a non-NULL string pointer is given, we write this message to that string.\n// We then do normal LOG(severity) logging as well.\n// This is useful for capturing messages and storing them somewhere more\n// specific than the global log of the process.\n// Argument types:\n//   string* message;\n//   LogSeverity severity;\n// The cast is to disambiguate NULL arguments.\n// NOTE: LOG(severity) expands to LogMessage().stream() for the specified\n// severity.\n#define LOG_TO_STRING(severity, message) \\\n  LOG_TO_STRING_##severity(static_cast<string*>(message)).stream()\n\n// If a non-NULL pointer is given, we push the message onto the end\n// of a vector of strings; otherwise, we report it with LOG(severity).\n// This is handy for capturing messages and perhaps passing them back\n// to the caller, rather than reporting them immediately.\n// Argument types:\n//   LogSeverity severity;\n//   vector<string> *outvec;\n// The cast is to disambiguate NULL arguments.\n#define LOG_STRING(severity, outvec) \\\n  LOG_TO_STRING_##severity(static_cast<vector<string>*>(outvec)).stream()\n\n#define LOG_IF(severity, condition) \\\n  !(condition) ? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & LOG(severity)\n#define SYSLOG_IF(severity, condition) \\\n  !(condition) ? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & SYSLOG(severity)\n\n#define LOG_ASSERT(condition)  \\\n  LOG_IF(FATAL, !(condition)) << \"Assert failed: \" #condition\n#define SYSLOG_ASSERT(condition) \\\n  SYSLOG_IF(FATAL, !(condition)) << \"Assert failed: \" #condition\n\n// CHECK dies with a fatal error if condition is not true.  It is *not*\n// controlled by NDEBUG, so the check will be executed regardless of\n// compilation mode.  Therefore, it is safe to do things like:\n//    CHECK(fp->Write(x) == 4)\n#define CHECK(condition)  \\\n      LOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \\\n             << \"Check failed: \" #condition \" \"\n\n// A container for a string pointer which can be evaluated to a bool -\n// true iff the pointer is NULL.\nstruct CheckOpString {\n  CheckOpString(std::string* str) : str_(str) { }\n  // No destructor: if str_ is non-NULL, we're about to LOG(FATAL),\n  // so there's no point in cleaning up str_.\n  operator bool() const {\n    return GOOGLE_PREDICT_BRANCH_NOT_TAKEN(str_ != NULL);\n  }\n  std::string* str_;\n};\n\n// Function is overloaded for integral types to allow static const\n// integrals declared in classes and not defined to be used as arguments to\n// CHECK* macros. It's not encouraged though.\ntemplate <class T>\ninline const T&       GetReferenceableValue(const T&           t) { return t; }\ninline char           GetReferenceableValue(char               t) { return t; }\ninline unsigned char  GetReferenceableValue(unsigned char      t) { return t; }\ninline signed char    GetReferenceableValue(signed char        t) { return t; }\ninline short          GetReferenceableValue(short              t) { return t; }\ninline unsigned short GetReferenceableValue(unsigned short     t) { return t; }\ninline int            GetReferenceableValue(int                t) { return t; }\ninline unsigned int   GetReferenceableValue(unsigned int       t) { return t; }\ninline long           GetReferenceableValue(long               t) { return t; }\ninline unsigned long  GetReferenceableValue(unsigned long      t) { return t; }\ninline long long      GetReferenceableValue(long long          t) { return t; }\ninline unsigned long long GetReferenceableValue(unsigned long long t) {\n  return t;\n}\n\n// This is a dummy class to define the following operator.\nstruct DummyClassToDefineOperator {};\n\n@ac_google_end_namespace@\n\n// Define global operator<< to declare using ::operator<<.\n// This declaration will allow use to use CHECK macros for user\n// defined classes which have operator<< (e.g., stl_logging.h).\ninline std::ostream& operator<<(\n    std::ostream& out, const google::DummyClassToDefineOperator&) {\n  return out;\n}\n\n@ac_google_start_namespace@\n\n// Build the error message string.\ntemplate<class t1, class t2>\nstd::string* MakeCheckOpString(const t1& v1, const t2& v2, const char* names) {\n  // It means that we cannot use stl_logging if compiler doesn't\n  // support using expression for operator.\n  // TODO(hamaji): Figure out a way to fix.\n#if @ac_cv_cxx_using_operator@\n  using ::operator<<;\n#endif\n  std::strstream ss;\n  ss << names << \" (\" << v1 << \" vs. \" << v2 << \")\";\n  return new std::string(ss.str(), ss.pcount());\n}\n\n// Helper functions for CHECK_OP macro.\n// The (int, int) specialization works around the issue that the compiler\n// will not instantiate the template version of the function on values of\n// unnamed enum type - see comment below.\n#define DEFINE_CHECK_OP_IMPL(name, op) \\\n  template <class t1, class t2> \\\n  inline std::string* Check##name##Impl(const t1& v1, const t2& v2, \\\n                                        const char* names) { \\\n    if (v1 op v2) return NULL; \\\n    else return MakeCheckOpString(v1, v2, names); \\\n  } \\\n  inline std::string* Check##name##Impl(int v1, int v2, const char* names) { \\\n    return Check##name##Impl<int, int>(v1, v2, names); \\\n  }\n\n// Use _EQ, _NE, _LE, etc. in case the file including base/logging.h\n// provides its own #defines for the simpler names EQ, NE, LE, etc.\n// This happens if, for example, those are used as token names in a\n// yacc grammar.\nDEFINE_CHECK_OP_IMPL(_EQ, ==)\nDEFINE_CHECK_OP_IMPL(_NE, !=)\nDEFINE_CHECK_OP_IMPL(_LE, <=)\nDEFINE_CHECK_OP_IMPL(_LT, < )\nDEFINE_CHECK_OP_IMPL(_GE, >=)\nDEFINE_CHECK_OP_IMPL(_GT, > )\n#undef DEFINE_CHECK_OP_IMPL\n\n// Helper macro for binary operators.\n// Don't use this macro directly in your code, use CHECK_EQ et al below.\n\n#if defined(STATIC_ANALYSIS)\n// Only for static analysis tool to know that it is equivalent to assert\n#define CHECK_OP_LOG(name, op, val1, val2, log) CHECK((val1) op (val2))\n#elif !defined(NDEBUG)\n// In debug mode, avoid constructing CheckOpStrings if possible,\n// to reduce the overhead of CHECK statments by 2x.\n// Real DCHECK-heavy tests have seen 1.5x speedups.\n\n// The meaning of \"string\" might be different between now and \n// when this macro gets invoked (e.g., if someone is experimenting\n// with other string implementations that get defined after this\n// file is included).  Save the current meaning now and use it \n// in the macro.\ntypedef std::string _Check_string;\n#define CHECK_OP_LOG(name, op, val1, val2, log)                         \\\n  while (@ac_google_namespace@::_Check_string* _result =                \\\n         @ac_google_namespace@::Check##name##Impl(                      \\\n             @ac_google_namespace@::GetReferenceableValue(val1),        \\\n             @ac_google_namespace@::GetReferenceableValue(val2),        \\\n             #val1 \" \" #op \" \" #val2))                                  \\\n    log(__FILE__, __LINE__,                                             \\\n        @ac_google_namespace@::CheckOpString(_result)).stream()\n#else\n// In optimized mode, use CheckOpString to hint to compiler that\n// the while condition is unlikely.\n#define CHECK_OP_LOG(name, op, val1, val2, log)                         \\\n  while (@ac_google_namespace@::CheckOpString _result =                 \\\n         @ac_google_namespace@::Check##name##Impl(                      \\\n             @ac_google_namespace@::GetReferenceableValue(val1),        \\\n             @ac_google_namespace@::GetReferenceableValue(val2),        \\\n             #val1 \" \" #op \" \" #val2))                                  \\\n    log(__FILE__, __LINE__, _result).stream()\n#endif  // STATIC_ANALYSIS, !NDEBUG\n\n#if GOOGLE_STRIP_LOG <= 3\n#define CHECK_OP(name, op, val1, val2) \\\n  CHECK_OP_LOG(name, op, val1, val2, @ac_google_namespace@::LogMessageFatal)\n#else\n#define CHECK_OP(name, op, val1, val2) \\\n  CHECK_OP_LOG(name, op, val1, val2, @ac_google_namespace@::NullStreamFatal)\n#endif // STRIP_LOG <= 3\n\n// Equality/Inequality checks - compare two values, and log a FATAL message\n// including the two values when the result is not as expected.  The values\n// must have operator<<(ostream, ...) defined.\n//\n// You may append to the error message like so:\n//   CHECK_NE(1, 2) << \": The world must be ending!\";\n//\n// We are very careful to ensure that each argument is evaluated exactly\n// once, and that anything which is legal to pass as a function argument is\n// legal here.  In particular, the arguments may be temporary expressions\n// which will end up being destroyed at the end of the apparent statement,\n// for example:\n//   CHECK_EQ(string(\"abc\")[1], 'b');\n//\n// WARNING: These don't compile correctly if one of the arguments is a pointer\n// and the other is NULL. To work around this, simply static_cast NULL to the\n// type of the desired pointer.\n\n#define CHECK_EQ(val1, val2) CHECK_OP(_EQ, ==, val1, val2)\n#define CHECK_NE(val1, val2) CHECK_OP(_NE, !=, val1, val2)\n#define CHECK_LE(val1, val2) CHECK_OP(_LE, <=, val1, val2)\n#define CHECK_LT(val1, val2) CHECK_OP(_LT, < , val1, val2)\n#define CHECK_GE(val1, val2) CHECK_OP(_GE, >=, val1, val2)\n#define CHECK_GT(val1, val2) CHECK_OP(_GT, > , val1, val2)\n\n// Check that the input is non NULL.  This very useful in constructor\n// initializer lists.\n\n#define CHECK_NOTNULL(val) \\\n  @ac_google_namespace@::CheckNotNull(__FILE__, __LINE__, \"'\" #val \"' Must be non NULL\", (val))\n\n// Helper functions for string comparisons.\n// To avoid bloat, the definitions are in logging.cc.\n#define DECLARE_CHECK_STROP_IMPL(func, expected) \\\n  GOOGLE_GLOG_DLL_DECL std::string* Check##func##expected##Impl( \\\n      const char* s1, const char* s2, const char* names);\nDECLARE_CHECK_STROP_IMPL(strcmp, true)\nDECLARE_CHECK_STROP_IMPL(strcmp, false)\nDECLARE_CHECK_STROP_IMPL(strcasecmp, true)\nDECLARE_CHECK_STROP_IMPL(strcasecmp, false)\n#undef DECLARE_CHECK_STROP_IMPL\n\n// Helper macro for string comparisons.\n// Don't use this macro directly in your code, use CHECK_STREQ et al below.\n#define CHECK_STROP(func, op, expected, s1, s2) \\\n  while (@ac_google_namespace@::CheckOpString _result = \\\n         @ac_google_namespace@::Check##func##expected##Impl((s1), (s2), \\\n                                     #s1 \" \" #op \" \" #s2)) \\\n    LOG(FATAL) << *_result.str_\n\n\n// String (char*) equality/inequality checks.\n// CASE versions are case-insensitive.\n//\n// Note that \"s1\" and \"s2\" may be temporary strings which are destroyed\n// by the compiler at the end of the current \"full expression\"\n// (e.g. CHECK_STREQ(Foo().c_str(), Bar().c_str())).\n\n#define CHECK_STREQ(s1, s2) CHECK_STROP(strcmp, ==, true, s1, s2)\n#define CHECK_STRNE(s1, s2) CHECK_STROP(strcmp, !=, false, s1, s2)\n#define CHECK_STRCASEEQ(s1, s2) CHECK_STROP(strcasecmp, ==, true, s1, s2)\n#define CHECK_STRCASENE(s1, s2) CHECK_STROP(strcasecmp, !=, false, s1, s2)\n\n#define CHECK_INDEX(I,A) CHECK(I < (sizeof(A)/sizeof(A[0])))\n#define CHECK_BOUND(B,A) CHECK(B <= (sizeof(A)/sizeof(A[0])))\n\n#define CHECK_DOUBLE_EQ(val1, val2)              \\\n  do {                                           \\\n    CHECK_LE((val1), (val2)+0.000000000000001L); \\\n    CHECK_GE((val1), (val2)-0.000000000000001L); \\\n  } while (0)\n\n#define CHECK_NEAR(val1, val2, margin)           \\\n  do {                                           \\\n    CHECK_LE((val1), (val2)+(margin));           \\\n    CHECK_GE((val1), (val2)-(margin));           \\\n  } while (0)\n\n// perror()..googly style!\n//\n// PLOG() and PLOG_IF() and PCHECK() behave exactly like their LOG* and\n// CHECK equivalents with the addition that they postpend a description\n// of the current state of errno to their output lines.\n\n#define PLOG(severity) GOOGLE_PLOG(severity, 0).stream()\n\n#define GOOGLE_PLOG(severity, counter)  \\\n  @ac_google_namespace@::ErrnoLogMessage( \\\n      __FILE__, __LINE__, @ac_google_namespace@::severity, counter, \\\n      &@ac_google_namespace@::LogMessage::SendToLog)\n\n#define PLOG_IF(severity, condition) \\\n  !(condition) ? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & PLOG(severity)\n\n// A CHECK() macro that postpends errno if the condition is false. E.g.\n//\n// if (poll(fds, nfds, timeout) == -1) { PCHECK(errno == EINTR); ... }\n#define PCHECK(condition)  \\\n      PLOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \\\n              << \"Check failed: \" #condition \" \"\n\n// A CHECK() macro that lets you assert the success of a function that\n// returns -1 and sets errno in case of an error. E.g.\n//\n// CHECK_ERR(mkdir(path, 0700));\n//\n// or\n//\n// int fd = open(filename, flags); CHECK_ERR(fd) << \": open \" << filename;\n#define CHECK_ERR(invocation)                                          \\\nPLOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN((invocation) == -1))    \\\n        << #invocation\n\n// Use macro expansion to create, for each use of LOG_EVERY_N(), static\n// variables with the __LINE__ expansion as part of the variable name.\n#define LOG_EVERY_N_VARNAME(base, line) LOG_EVERY_N_VARNAME_CONCAT(base, line)\n#define LOG_EVERY_N_VARNAME_CONCAT(base, line) base ## line\n\n#define LOG_OCCURRENCES LOG_EVERY_N_VARNAME(occurrences_, __LINE__)\n#define LOG_OCCURRENCES_MOD_N LOG_EVERY_N_VARNAME(occurrences_mod_n_, __LINE__)\n\n#define SOME_KIND_OF_LOG_EVERY_N(severity, n, what_to_do) \\\n  static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \\\n  ++LOG_OCCURRENCES; \\\n  if (++LOG_OCCURRENCES_MOD_N > n) LOG_OCCURRENCES_MOD_N -= n; \\\n  if (LOG_OCCURRENCES_MOD_N == 1) \\\n    @ac_google_namespace@::LogMessage( \\\n        __FILE__, __LINE__, @ac_google_namespace@::severity, LOG_OCCURRENCES, \\\n        &what_to_do).stream()\n\n#define SOME_KIND_OF_LOG_IF_EVERY_N(severity, condition, n, what_to_do) \\\n  static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \\\n  ++LOG_OCCURRENCES; \\\n  if (condition && \\\n      ((LOG_OCCURRENCES_MOD_N=(LOG_OCCURRENCES_MOD_N + 1) % n) == (1 % n))) \\\n    @ac_google_namespace@::LogMessage( \\\n        __FILE__, __LINE__, @ac_google_namespace@::severity, LOG_OCCURRENCES, \\\n                 &what_to_do).stream()\n\n#define SOME_KIND_OF_PLOG_EVERY_N(severity, n, what_to_do) \\\n  static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \\\n  ++LOG_OCCURRENCES; \\\n  if (++LOG_OCCURRENCES_MOD_N > n) LOG_OCCURRENCES_MOD_N -= n; \\\n  if (LOG_OCCURRENCES_MOD_N == 1) \\\n    @ac_google_namespace@::ErrnoLogMessage( \\\n        __FILE__, __LINE__, @ac_google_namespace@::severity, LOG_OCCURRENCES, \\\n        &what_to_do).stream()\n\n#define SOME_KIND_OF_LOG_FIRST_N(severity, n, what_to_do) \\\n  static int LOG_OCCURRENCES = 0; \\\n  if (LOG_OCCURRENCES <= n) \\\n    ++LOG_OCCURRENCES; \\\n  if (LOG_OCCURRENCES <= n) \\\n    @ac_google_namespace@::LogMessage( \\\n        __FILE__, __LINE__, @ac_google_namespace@::severity, LOG_OCCURRENCES, \\\n        &what_to_do).stream()\n\nnamespace glog_internal_namespace_ {\ntemplate <bool>\nstruct CompileAssert {\n};\nstruct CrashReason;\n}  // namespace glog_internal_namespace_\n\n#define GOOGLE_GLOG_COMPILE_ASSERT(expr, msg) \\\n  typedef @ac_google_namespace@::glog_internal_namespace_::CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]\n\n#define LOG_EVERY_N(severity, n)                                        \\\n  GOOGLE_GLOG_COMPILE_ASSERT(@ac_google_namespace@::severity <          \\\n                             @ac_google_namespace@::NUM_SEVERITIES,     \\\n                             INVALID_REQUESTED_LOG_SEVERITY);           \\\n  SOME_KIND_OF_LOG_EVERY_N(severity, (n), @ac_google_namespace@::LogMessage::SendToLog)\n\n#define SYSLOG_EVERY_N(severity, n) \\\n  SOME_KIND_OF_LOG_EVERY_N(severity, (n), @ac_google_namespace@::LogMessage::SendToSyslogAndLog)\n\n#define PLOG_EVERY_N(severity, n) \\\n  SOME_KIND_OF_PLOG_EVERY_N(severity, (n), @ac_google_namespace@::LogMessage::SendToLog)\n\n#define LOG_FIRST_N(severity, n) \\\n  SOME_KIND_OF_LOG_FIRST_N(severity, (n), @ac_google_namespace@::LogMessage::SendToLog)\n\n#define LOG_IF_EVERY_N(severity, condition, n) \\\n  SOME_KIND_OF_LOG_IF_EVERY_N(severity, (condition), (n), @ac_google_namespace@::LogMessage::SendToLog)\n\n// We want the special COUNTER value available for LOG_EVERY_X()'ed messages\nenum PRIVATE_Counter {COUNTER};\n\n\n// Plus some debug-logging macros that get compiled to nothing for production\n\n#ifndef NDEBUG\n\n#define DLOG(severity) LOG(severity)\n#define DVLOG(verboselevel) VLOG(verboselevel)\n#define DLOG_IF(severity, condition) LOG_IF(severity, condition)\n#define DLOG_EVERY_N(severity, n) LOG_EVERY_N(severity, n)\n#define DLOG_IF_EVERY_N(severity, condition, n) \\\n  LOG_IF_EVERY_N(severity, condition, n)\n#define DLOG_ASSERT(condition) LOG_ASSERT(condition)\n\n// debug-only checking.  not executed in NDEBUG mode.\n#define DCHECK(condition) CHECK(condition)\n#define DCHECK_EQ(val1, val2) CHECK_EQ(val1, val2)\n#define DCHECK_NE(val1, val2) CHECK_NE(val1, val2)\n#define DCHECK_LE(val1, val2) CHECK_LE(val1, val2)\n#define DCHECK_LT(val1, val2) CHECK_LT(val1, val2)\n#define DCHECK_GE(val1, val2) CHECK_GE(val1, val2)\n#define DCHECK_GT(val1, val2) CHECK_GT(val1, val2)\n#define DCHECK_NOTNULL(val) CHECK_NOTNULL(val)\n#define DCHECK_STREQ(str1, str2) CHECK_STREQ(str1, str2)\n#define DCHECK_STRCASEEQ(str1, str2) CHECK_STRCASEEQ(str1, str2)\n#define DCHECK_STRNE(str1, str2) CHECK_STRNE(str1, str2)\n#define DCHECK_STRCASENE(str1, str2) CHECK_STRCASENE(str1, str2)\n\n#else  // NDEBUG\n\n#define DLOG(severity) \\\n  true ? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & LOG(severity)\n\n#define DVLOG(verboselevel) \\\n  (true || !VLOG_IS_ON(verboselevel)) ?\\\n    (void) 0 : @ac_google_namespace@::LogMessageVoidify() & LOG(INFO)\n\n#define DLOG_IF(severity, condition) \\\n  (true || !(condition)) ? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & LOG(severity)\n\n#define DLOG_EVERY_N(severity, n) \\\n  true ? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & LOG(severity)\n\n#define DLOG_IF_EVERY_N(severity, condition, n) \\\n  (true || !(condition))? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & LOG(severity)\n\n#define DLOG_ASSERT(condition) \\\n  true ? (void) 0 : LOG_ASSERT(condition)\n\n#define DCHECK(condition) \\\n  while (false) \\\n    CHECK(condition)\n\n#define DCHECK_EQ(val1, val2) \\\n  while (false) \\\n    CHECK_EQ(val1, val2)\n\n#define DCHECK_NE(val1, val2) \\\n  while (false) \\\n    CHECK_NE(val1, val2)\n\n#define DCHECK_LE(val1, val2) \\\n  while (false) \\\n    CHECK_LE(val1, val2)\n\n#define DCHECK_LT(val1, val2) \\\n  while (false) \\\n    CHECK_LT(val1, val2)\n\n#define DCHECK_GE(val1, val2) \\\n  while (false) \\\n    CHECK_GE(val1, val2)\n\n#define DCHECK_GT(val1, val2) \\\n  while (false) \\\n    CHECK_GT(val1, val2)\n\n#define DCHECK_NOTNULL(val) (val)\n\n#define DCHECK_STREQ(str1, str2) \\\n  while (false) \\\n    CHECK_STREQ(str1, str2)\n\n#define DCHECK_STRCASEEQ(str1, str2) \\\n  while (false) \\\n    CHECK_STRCASEEQ(str1, str2)\n\n#define DCHECK_STRNE(str1, str2) \\\n  while (false) \\\n    CHECK_STRNE(str1, str2)\n\n#define DCHECK_STRCASENE(str1, str2) \\\n  while (false) \\\n    CHECK_STRCASENE(str1, str2)\n\n\n#endif  // NDEBUG\n\n// Log only in verbose mode.\n\n#define VLOG(verboselevel) LOG_IF(INFO, VLOG_IS_ON(verboselevel))\n\n#define VLOG_IF(verboselevel, condition) \\\n  LOG_IF(INFO, (condition) && VLOG_IS_ON(verboselevel))\n\n#define VLOG_EVERY_N(verboselevel, n) \\\n  LOG_IF_EVERY_N(INFO, VLOG_IS_ON(verboselevel), n)\n\n#define VLOG_IF_EVERY_N(verboselevel, condition, n) \\\n  LOG_IF_EVERY_N(INFO, (condition) && VLOG_IS_ON(verboselevel), n)\n\n//\n// This class more or less represents a particular log message.  You\n// create an instance of LogMessage and then stream stuff to it.\n// When you finish streaming to it, ~LogMessage is called and the\n// full message gets streamed to the appropriate destination.\n//\n// You shouldn't actually use LogMessage's constructor to log things,\n// though.  You should use the LOG() macro (and variants thereof)\n// above.\nclass GOOGLE_GLOG_DLL_DECL LogMessage {\npublic:\n  enum {\n    // Passing kNoLogPrefix for the line number disables the\n    // log-message prefix. Useful for using the LogMessage\n    // infrastructure as a printing utility. See also the --log_prefix\n    // flag for controlling the log-message prefix on an\n    // application-wide basis.\n    kNoLogPrefix = -1\n  };\n\n  // LogStream inherit from non-DLL-exported class (std::ostrstream)\n  // and VC++ produces a warning for this situation.\n  // However, MSDN says \"C4275 can be ignored in Microsoft Visual C++\n  // 2005 if you are deriving from a type in the Standard C++ Library\"\n  // http://msdn.microsoft.com/en-us/library/3tdb471s(VS.80).aspx\n  // Let's just ignore the warning.\n#ifdef _MSC_VER\n# pragma warning(disable: 4275)\n#endif\n  class GOOGLE_GLOG_DLL_DECL LogStream : public std::ostrstream {\n#ifdef _MSC_VER\n# pragma warning(default: 4275)\n#endif\n  public:\n    LogStream(char *buf, int len, int ctr)\n      : ostrstream(buf, len),\n        ctr_(ctr) {\n      self_ = this;\n    }\n\n    int ctr() const { return ctr_; }\n    void set_ctr(int ctr) { ctr_ = ctr; }\n    LogStream* self() const { return self_; }\n\n  private:\n    int ctr_;  // Counter hack (for the LOG_EVERY_X() macro)\n    LogStream *self_;  // Consistency check hack\n  };\n\npublic:\n  // icc 8 requires this typedef to avoid an internal compiler error.\n  typedef void (LogMessage::*SendMethod)();\n\n  LogMessage(const char* file, int line, LogSeverity severity, int ctr,\n             SendMethod send_method);\n\n  // Two special constructors that generate reduced amounts of code at\n  // LOG call sites for common cases.\n\n  // Used for LOG(INFO): Implied are:\n  // severity = INFO, ctr = 0, send_method = &LogMessage::SendToLog.\n  //\n  // Using this constructor instead of the more complex constructor above\n  // saves 19 bytes per call site.\n  LogMessage(const char* file, int line);\n\n  // Used for LOG(severity) where severity != INFO.  Implied\n  // are: ctr = 0, send_method = &LogMessage::SendToLog\n  //\n  // Using this constructor instead of the more complex constructor above\n  // saves 17 bytes per call site.\n  LogMessage(const char* file, int line, LogSeverity severity);\n\n  // Constructor to log this message to a specified sink (if not NULL).\n  // Implied are: ctr = 0, send_method = &LogMessage::SendToSinkAndLog if\n  // also_send_to_log is true, send_method = &LogMessage::SendToSink otherwise.\n  LogMessage(const char* file, int line, LogSeverity severity, LogSink* sink,\n             bool also_send_to_log);\n\n  // Constructor where we also give a vector<string> pointer\n  // for storing the messages (if the pointer is not NULL).\n  // Implied are: ctr = 0, send_method = &LogMessage::SaveOrSendToLog.\n  LogMessage(const char* file, int line, LogSeverity severity,\n             std::vector<std::string>* outvec);\n\n  // Constructor where we also give a string pointer for storing the\n  // message (if the pointer is not NULL).  Implied are: ctr = 0,\n  // send_method = &LogMessage::WriteToStringAndLog.\n  LogMessage(const char* file, int line, LogSeverity severity,\n             std::string* message);\n\n  // A special constructor used for check failures\n  LogMessage(const char* file, int line, const CheckOpString& result);\n\n  ~LogMessage();\n\n  // Flush a buffered message to the sink set in the constructor.  Always\n  // called by the destructor, it may also be called from elsewhere if\n  // needed.  Only the first call is actioned; any later ones are ignored.\n  void Flush();\n\n  // An arbitrary limit on the length of a single log message.  This\n  // is so that streaming can be done more efficiently.\n  static const size_t kMaxLogMessageLen;\n\n  // Theses should not be called directly outside of logging.*,\n  // only passed as SendMethod arguments to other LogMessage methods:\n  void SendToLog();  // Actually dispatch to the logs\n  void SendToSyslogAndLog();  // Actually dispatch to syslog and the logs\n\n  // Call abort() or similar to perform LOG(FATAL) crash.\n  static void Fail() @ac_cv___attribute___noreturn@;\n\n  std::ostream& stream() { return *(data_->stream_); }\n\n  int preserved_errno() const { return data_->preserved_errno_; }\n\n  // Must be called without the log_mutex held.  (L < log_mutex)\n  static int64 num_messages(int severity);\n\nprivate:\n  // Fully internal SendMethod cases:\n  void SendToSinkAndLog();  // Send to sink if provided and dispatch to the logs\n  void SendToSink();  // Send to sink if provided, do nothing otherwise.\n\n  // Write to string if provided and dispatch to the logs.\n  void WriteToStringAndLog();\n\n  void SaveOrSendToLog();  // Save to stringvec if provided, else to logs\n\n  void Init(const char* file, int line, LogSeverity severity,\n            void (LogMessage::*send_method)());\n\n  // Used to fill in crash information during LOG(FATAL) failures.\n  void RecordCrashReason(glog_internal_namespace_::CrashReason* reason);\n\n  // Counts of messages sent at each priority:\n  static int64 num_messages_[NUM_SEVERITIES];  // under log_mutex\n\n  // We keep the data in a separate struct so that each instance of\n  // LogMessage uses less stack space.\n  struct GOOGLE_GLOG_DLL_DECL LogMessageData {\n    LogMessageData() {};\n\n    int preserved_errno_;      // preserved errno\n    char* buf_;\n    char* message_text_;  // Complete message text (points to selected buffer)\n    LogStream* stream_alloc_;\n    LogStream* stream_;\n    char severity_;      // What level is this LogMessage logged at?\n    int line_;                 // line number where logging call is.\n    void (LogMessage::*send_method_)();  // Call this in destructor to send\n    union {  // At most one of these is used: union to keep the size low.\n      LogSink* sink_;             // NULL or sink to send message to\n      std::vector<std::string>* outvec_; // NULL or vector to push message onto\n      std::string* message_;             // NULL or string to write message into\n    };\n    time_t timestamp_;            // Time of creation of LogMessage\n    struct ::tm tm_time_;         // Time of creation of LogMessage\n    size_t num_prefix_chars_;     // # of chars of prefix in this message\n    size_t num_chars_to_log_;     // # of chars of msg to send to log\n    size_t num_chars_to_syslog_;  // # of chars of msg to send to syslog\n    const char* basename_;        // basename of file that called LOG\n    const char* fullname_;        // fullname of file that called LOG\n    bool has_been_flushed_;       // false => data has not been flushed\n    bool first_fatal_;            // true => this was first fatal msg\n\n    ~LogMessageData();\n   private:\n    LogMessageData(const LogMessageData&);\n    void operator=(const LogMessageData&);\n  };\n\n  static LogMessageData fatal_msg_data_exclusive_;\n  static LogMessageData fatal_msg_data_shared_;\n\n  LogMessageData* allocated_;\n  LogMessageData* data_;\n\n  friend class LogDestination;\n\n  LogMessage(const LogMessage&);\n  void operator=(const LogMessage&);\n};\n\n// This class happens to be thread-hostile because all instances share\n// a single data buffer, but since it can only be created just before\n// the process dies, we don't worry so much.\nclass GOOGLE_GLOG_DLL_DECL LogMessageFatal : public LogMessage {\n public:\n  LogMessageFatal(const char* file, int line);\n  LogMessageFatal(const char* file, int line, const CheckOpString& result);\n  ~LogMessageFatal() @ac_cv___attribute___noreturn@;\n};\n\n// A non-macro interface to the log facility; (useful\n// when the logging level is not a compile-time constant).\ninline void LogAtLevel(int const severity, std::string const &msg) {\n  LogMessage(__FILE__, __LINE__, severity).stream() << msg;\n}\n\n// A macro alternative of LogAtLevel. New code may want to use this\n// version since there are two advantages: 1. this version outputs the\n// file name and the line number where this macro is put like other\n// LOG macros, 2. this macro can be used as C++ stream.\n#define LOG_AT_LEVEL(severity) @ac_google_namespace@::LogMessage(__FILE__, __LINE__, severity).stream()\n\n// A small helper for CHECK_NOTNULL().\ntemplate <typename T>\nT* CheckNotNull(const char *file, int line, const char *names, T* t) {\n  if (t == NULL) {\n    LogMessageFatal(file, line, new std::string(names));\n  }\n  return t;\n}\n\n// Allow folks to put a counter in the LOG_EVERY_X()'ed messages. This\n// only works if ostream is a LogStream. If the ostream is not a\n// LogStream you'll get an assert saying as much at runtime.\nGOOGLE_GLOG_DLL_DECL std::ostream& operator<<(std::ostream &os,\n                                              const PRIVATE_Counter&);\n\n\n// Derived class for PLOG*() above.\nclass GOOGLE_GLOG_DLL_DECL ErrnoLogMessage : public LogMessage {\n public:\n\n  ErrnoLogMessage(const char* file, int line, LogSeverity severity, int ctr,\n                  void (LogMessage::*send_method)());\n\n  // Postpends \": strerror(errno) [errno]\".\n  ~ErrnoLogMessage();\n\n private:\n  ErrnoLogMessage(const ErrnoLogMessage&);\n  void operator=(const ErrnoLogMessage&);\n};\n\n\n// This class is used to explicitly ignore values in the conditional\n// logging macros.  This avoids compiler warnings like \"value computed\n// is not used\" and \"statement has no effect\".\n\nclass GOOGLE_GLOG_DLL_DECL LogMessageVoidify {\n public:\n  LogMessageVoidify() { }\n  // This has to be an operator with a precedence lower than << but\n  // higher than ?:\n  void operator&(std::ostream&) { }\n};\n\n\n// Flushes all log files that contains messages that are at least of\n// the specified severity level.  Thread-safe.\nGOOGLE_GLOG_DLL_DECL void FlushLogFiles(LogSeverity min_severity);\n\n// Flushes all log files that contains messages that are at least of\n// the specified severity level. Thread-hostile because it ignores\n// locking -- used for catastrophic failures.\nGOOGLE_GLOG_DLL_DECL void FlushLogFilesUnsafe(LogSeverity min_severity);\n\n//\n// Set the destination to which a particular severity level of log\n// messages is sent.  If base_filename is \"\", it means \"don't log this\n// severity\".  Thread-safe.\n//\nGOOGLE_GLOG_DLL_DECL void SetLogDestination(LogSeverity severity,\n                                            const char* base_filename);\n\n//\n// Set the basename of the symlink to the latest log file at a given\n// severity.  If symlink_basename is empty, do not make a symlink.  If\n// you don't call this function, the symlink basename is the\n// invocation name of the program.  Thread-safe.\n//\nGOOGLE_GLOG_DLL_DECL void SetLogSymlink(LogSeverity severity,\n                                        const char* symlink_basename);\n\n//\n// Used to send logs to some other kind of destination\n// Users should subclass LogSink and override send to do whatever they want.\n// Implementations must be thread-safe because a shared instance will\n// be called from whichever thread ran the LOG(XXX) line.\nclass GOOGLE_GLOG_DLL_DECL LogSink {\n public:\n  virtual ~LogSink();\n\n  // Sink's logging logic (message_len is such as to exclude '\\n' at the end).\n  // This method can't use LOG() or CHECK() as logging system mutex(s) are held\n  // during this call.\n  virtual void send(LogSeverity severity, const char* full_filename,\n                    const char* base_filename, int line,\n                    const struct ::tm* tm_time,\n                    const char* message, size_t message_len) = 0;\n\n  // Redefine this to implement waiting for\n  // the sink's logging logic to complete.\n  // It will be called after each send() returns,\n  // but before that LogMessage exits or crashes.\n  // By default this function does nothing.\n  // Using this function one can implement complex logic for send()\n  // that itself involves logging; and do all this w/o causing deadlocks and\n  // inconsistent rearrangement of log messages.\n  // E.g. if a LogSink has thread-specific actions, the send() method\n  // can simply add the message to a queue and wake up another thread that\n  // handles real logging while itself making some LOG() calls;\n  // WaitTillSent() can be implemented to wait for that logic to complete.\n  // See our unittest for an example.\n  virtual void WaitTillSent();\n\n  // Returns the normal text output of the log message.\n  // Can be useful to implement send().\n  static std::string ToString(LogSeverity severity, const char* file, int line,\n                              const struct ::tm* tm_time,\n                              const char* message, size_t message_len);\n};\n\n// Add or remove a LogSink as a consumer of logging data.  Thread-safe.\nGOOGLE_GLOG_DLL_DECL void AddLogSink(LogSink *destination);\nGOOGLE_GLOG_DLL_DECL void RemoveLogSink(LogSink *destination);\n\n//\n// Specify an \"extension\" added to the filename specified via\n// SetLogDestination.  This applies to all severity levels.  It's\n// often used to append the port we're listening on to the logfile\n// name.  Thread-safe.\n//\nGOOGLE_GLOG_DLL_DECL void SetLogFilenameExtension(\n    const char* filename_extension);\n\n//\n// Make it so that all log messages of at least a particular severity\n// are logged to stderr (in addition to logging to the usual log\n// file(s)).  Thread-safe.\n//\nGOOGLE_GLOG_DLL_DECL void SetStderrLogging(LogSeverity min_severity);\n\n//\n// Make it so that all log messages go only to stderr.  Thread-safe.\n//\nGOOGLE_GLOG_DLL_DECL void LogToStderr();\n\n//\n// Make it so that all log messages of at least a particular severity are\n// logged via email to a list of addresses (in addition to logging to the\n// usual log file(s)).  The list of addresses is just a string containing\n// the email addresses to send to (separated by spaces, say).  Thread-safe.\n//\nGOOGLE_GLOG_DLL_DECL void SetEmailLogging(LogSeverity min_severity,\n                                          const char* addresses);\n\n// A simple function that sends email. dest is a commma-separated\n// list of addressess.  Thread-safe.\nGOOGLE_GLOG_DLL_DECL bool SendEmail(const char *dest,\n                                    const char *subject, const char *body);\n\nGOOGLE_GLOG_DLL_DECL const std::vector<std::string>& GetLoggingDirectories();\n\n// For tests only:  Clear the internal [cached] list of logging directories to\n// force a refresh the next time GetLoggingDirectories is called.\n// Thread-hostile.\nvoid TestOnly_ClearLoggingDirectoriesList();\n\n// Returns a set of existing temporary directories, which will be a\n// subset of the directories returned by GetLogginDirectories().\n// Thread-safe.\nGOOGLE_GLOG_DLL_DECL void GetExistingTempDirectories(\n    std::vector<std::string>* list);\n\n// Print any fatal message again -- useful to call from signal handler\n// so that the last thing in the output is the fatal message.\n// Thread-hostile, but a race is unlikely.\nGOOGLE_GLOG_DLL_DECL void ReprintFatalMessage();\n\n// Truncate a log file that may be the append-only output of multiple\n// processes and hence can't simply be renamed/reopened (typically a\n// stdout/stderr).  If the file \"path\" is > \"limit\" bytes, copy the\n// last \"keep\" bytes to offset 0 and truncate the rest. Since we could\n// be racing with other writers, this approach has the potential to\n// lose very small amounts of data. For security, only follow symlinks\n// if the path is /proc/self/fd/*\nGOOGLE_GLOG_DLL_DECL void TruncateLogFile(const char *path,\n                                          int64 limit, int64 keep);\n\n// Truncate stdout and stderr if they are over the value specified by\n// --max_log_size; keep the final 1MB.  This function has the same\n// race condition as TruncateLogFile.\nGOOGLE_GLOG_DLL_DECL void TruncateStdoutStderr();\n\n// Return the string representation of the provided LogSeverity level.\n// Thread-safe.\nGOOGLE_GLOG_DLL_DECL const char* GetLogSeverityName(LogSeverity severity);\n\n// ---------------------------------------------------------------------\n// Implementation details that are not useful to most clients\n// ---------------------------------------------------------------------\n\n// A Logger is the interface used by logging modules to emit entries\n// to a log.  A typical implementation will dump formatted data to a\n// sequence of files.  We also provide interfaces that will forward\n// the data to another thread so that the invoker never blocks.\n// Implementations should be thread-safe since the logging system\n// will write to them from multiple threads.\n\nnamespace base {\n\nclass GOOGLE_GLOG_DLL_DECL Logger {\n public:\n  virtual ~Logger();\n\n  // Writes \"message[0,message_len-1]\" corresponding to an event that\n  // occurred at \"timestamp\".  If \"force_flush\" is true, the log file\n  // is flushed immediately.\n  //\n  // The input message has already been formatted as deemed\n  // appropriate by the higher level logging facility.  For example,\n  // textual log messages already contain timestamps, and the\n  // file:linenumber header.\n  virtual void Write(bool force_flush,\n                     time_t timestamp,\n                     const char* message,\n                     int message_len) = 0;\n\n  // Flush any buffered messages\n  virtual void Flush() = 0;\n\n  // Get the current LOG file size.\n  // The returned value is approximate since some\n  // logged data may not have been flushed to disk yet.\n  virtual uint32 LogSize() = 0;\n};\n\n// Get the logger for the specified severity level.  The logger\n// remains the property of the logging module and should not be\n// deleted by the caller.  Thread-safe.\nextern GOOGLE_GLOG_DLL_DECL Logger* GetLogger(LogSeverity level);\n\n// Set the logger for the specified severity level.  The logger\n// becomes the property of the logging module and should not\n// be deleted by the caller.  Thread-safe.\nextern GOOGLE_GLOG_DLL_DECL void SetLogger(LogSeverity level, Logger* logger);\n\n}\n\n// glibc has traditionally implemented two incompatible versions of\n// strerror_r(). There is a poorly defined convention for picking the\n// version that we want, but it is not clear whether it even works with\n// all versions of glibc.\n// So, instead, we provide this wrapper that automatically detects the\n// version that is in use, and then implements POSIX semantics.\n// N.B. In addition to what POSIX says, we also guarantee that \"buf\" will\n// be set to an empty string, if this function failed. This means, in most\n// cases, you do not need to check the error code and you can directly\n// use the value of \"buf\". It will never have an undefined value.\nGOOGLE_GLOG_DLL_DECL int posix_strerror_r(int err, char *buf, size_t len);\n\n\n// A class for which we define operator<<, which does nothing.\nclass GOOGLE_GLOG_DLL_DECL NullStream : public LogMessage::LogStream {\n public:\n  // Initialize the LogStream so the messages can be written somewhere\n  // (they'll never be actually displayed). This will be needed if a\n  // NullStream& is implicitly converted to LogStream&, in which case\n  // the overloaded NullStream::operator<< will not be invoked.\n  NullStream() : LogMessage::LogStream(message_buffer_, 1, 0) { }\n  NullStream(const char* /*file*/, int /*line*/,\n             const CheckOpString& /*result*/) :\n      LogMessage::LogStream(message_buffer_, 1, 0) { }\n  NullStream &stream() { return *this; }\n private:\n  // A very short buffer for messages (which we discard anyway). This\n  // will be needed if NullStream& converted to LogStream& (e.g. as a\n  // result of a conditional expression).\n  char message_buffer_[2];\n};\n\n// Do nothing. This operator is inline, allowing the message to be\n// compiled away. The message will not be compiled away if we do\n// something like (flag ? LOG(INFO) : LOG(ERROR)) << message; when\n// SKIP_LOG=WARNING. In those cases, NullStream will be implicitly\n// converted to LogStream and the message will be computed and then\n// quietly discarded.\ntemplate<class T>\ninline NullStream& operator<<(NullStream &str, const T &value) { return str; }\n\n// Similar to NullStream, but aborts the program (without stack\n// trace), like LogMessageFatal.\nclass GOOGLE_GLOG_DLL_DECL NullStreamFatal : public NullStream {\n public:\n  NullStreamFatal() { }\n  NullStreamFatal(const char* file, int line, const CheckOpString& result) :\n      NullStream(file, line, result) { }\n  @ac_cv___attribute___noreturn@ ~NullStreamFatal() { _exit(1); }\n};\n\n// Install a signal handler that will dump signal information and a stack\n// trace when the program crashes on certain signals.  We'll install the\n// signal handler for the following signals.\n//\n// SIGSEGV, SIGILL, SIGFPE, SIGABRT, SIGBUS, and SIGTERM.\n//\n// By default, the signal handler will write the failure dump to the\n// standard error.  You can customize the destination by installing your\n// own writer function by InstallFailureWriter() below.\n//\n// Note on threading:\n//\n// The function should be called before threads are created, if you want\n// to use the failure signal handler for all threads.  The stack trace\n// will be shown only for the thread that receives the signal.  In other\n// words, stack traces of other threads won't be shown.\nGOOGLE_GLOG_DLL_DECL void InstallFailureSignalHandler();\n\n// Installs a function that is used for writing the failure dump.  \"data\"\n// is the pointer to the beginning of a message to be written, and \"size\"\n// is the size of the message.  You should not expect the data is\n// terminated with '\\0'.\nGOOGLE_GLOG_DLL_DECL void InstallFailureWriter(\n    void (*writer)(const char* data, int size));\n\n@ac_google_end_namespace@\n\n#endif // _LOGGING_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/glog/raw_logging.h.in",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Maxim Lifantsev\n//\n// Thread-safe logging routines that do not allocate any memory or\n// acquire any locks, and can therefore be used by low-level memory\n// allocation and synchronization code.\n\n#ifndef BASE_RAW_LOGGING_H_\n#define BASE_RAW_LOGGING_H_\n\n#include <time.h>\n\n@ac_google_start_namespace@\n\n#include \"glog/log_severity.h\"\n#include \"glog/vlog_is_on.h\"\n\n// Annoying stuff for windows -- makes sure clients can import these functions\n#ifndef GOOGLE_GLOG_DLL_DECL\n# if defined(_WIN32) && !defined(__CYGWIN__)\n#   define GOOGLE_GLOG_DLL_DECL  __declspec(dllimport)\n# else\n#   define GOOGLE_GLOG_DLL_DECL\n# endif\n#endif\n\n// This is similar to LOG(severity) << format... and VLOG(level) << format..,\n// but\n// * it is to be used ONLY by low-level modules that can't use normal LOG()\n// * it is desiged to be a low-level logger that does not allocate any\n//   memory and does not need any locks, hence:\n// * it logs straight and ONLY to STDERR w/o buffering\n// * it uses an explicit format and arguments list\n// * it will silently chop off really long message strings\n// Usage example:\n//   RAW_LOG(ERROR, \"Failed foo with %i: %s\", status, error);\n//   RAW_VLOG(3, \"status is %i\", status);\n// These will print an almost standard log lines like this to stderr only:\n//   E0821 211317 file.cc:123] RAW: Failed foo with 22: bad_file\n//   I0821 211317 file.cc:142] RAW: status is 20\n#define RAW_LOG(severity, ...) \\\n  do { \\\n    switch (@ac_google_namespace@::severity) {  \\\n      case 0: \\\n        RAW_LOG_INFO(__VA_ARGS__); \\\n        break; \\\n      case 1: \\\n        RAW_LOG_WARNING(__VA_ARGS__); \\\n        break; \\\n      case 2: \\\n        RAW_LOG_ERROR(__VA_ARGS__); \\\n        break; \\\n      case 3: \\\n        RAW_LOG_FATAL(__VA_ARGS__); \\\n        break; \\\n      default: \\\n        break; \\\n    } \\\n  } while (0)\n\n// The following STRIP_LOG testing is performed in the header file so that it's\n// possible to completely compile out the logging code and the log messages.\n#if STRIP_LOG == 0\n#define RAW_VLOG(verboselevel, ...) \\\n  do { \\\n    if (VLOG_IS_ON(verboselevel)) { \\\n      RAW_LOG_INFO(__VA_ARGS__); \\\n    } \\\n  } while (0)\n#else\n#define RAW_VLOG(verboselevel, ...) RawLogStub__(0, __VA_ARGS__)\n#endif // STRIP_LOG == 0\n\n#if STRIP_LOG == 0\n#define RAW_LOG_INFO(...) @ac_google_namespace@::RawLog__(@ac_google_namespace@::INFO, \\\n                                   __FILE__, __LINE__, __VA_ARGS__)\n#else\n#define RAW_LOG_INFO(...) @ac_google_namespace@::RawLogStub__(0, __VA_ARGS__)\n#endif // STRIP_LOG == 0\n\n#if STRIP_LOG <= 1\n#define RAW_LOG_WARNING(...) @ac_google_namespace@::RawLog__(@ac_google_namespace@::WARNING,   \\\n                                      __FILE__, __LINE__, __VA_ARGS__)\n#else\n#define RAW_LOG_WARNING(...) @ac_google_namespace@::RawLogStub__(0, __VA_ARGS__)\n#endif // STRIP_LOG <= 1\n\n#if STRIP_LOG <= 2\n#define RAW_LOG_ERROR(...) @ac_google_namespace@::RawLog__(@ac_google_namespace@::ERROR,       \\\n                                    __FILE__, __LINE__, __VA_ARGS__)\n#else\n#define RAW_LOG_ERROR(...) @ac_google_namespace@::RawLogStub__(0, __VA_ARGS__)\n#endif // STRIP_LOG <= 2\n\n#if STRIP_LOG <= 3\n#define RAW_LOG_FATAL(...) @ac_google_namespace@::RawLog__(@ac_google_namespace@::FATAL,       \\\n                                    __FILE__, __LINE__, __VA_ARGS__)\n#else\n#define RAW_LOG_FATAL(...) \\\n  do { \\\n    @ac_google_namespace@::RawLogStub__(0, __VA_ARGS__);        \\\n    exit(1); \\\n  } while (0)\n#endif // STRIP_LOG <= 3\n\n// Similar to CHECK(condition) << message,\n// but for low-level modules: we use only RAW_LOG that does not allocate memory.\n// We do not want to provide args list here to encourage this usage:\n//   if (!cond)  RAW_LOG(FATAL, \"foo ...\", hard_to_compute_args);\n// so that the args are not computed when not needed.\n#define RAW_CHECK(condition, message)                                   \\\n  do {                                                                  \\\n    if (!(condition)) {                                                 \\\n      RAW_LOG(FATAL, \"Check %s failed: %s\", #condition, message);       \\\n    }                                                                   \\\n  } while (0)\n\n// Debug versions of RAW_LOG and RAW_CHECK\n#ifndef NDEBUG\n\n#define RAW_DLOG(severity, ...) RAW_LOG(severity, __VA_ARGS__)\n#define RAW_DCHECK(condition, message) RAW_CHECK(condition, message)\n\n#else  // NDEBUG\n\n#define RAW_DLOG(severity, ...)                                 \\\n  while (false)                                                 \\\n    RAW_LOG(severity, __VA_ARGS__)\n#define RAW_DCHECK(condition, message) \\\n  while (false) \\\n    RAW_CHECK(condition, message)\n\n#endif  // NDEBUG\n\n// Stub log function used to work around for unused variable warnings when\n// building with STRIP_LOG > 0.\nstatic inline void RawLogStub__(int ignored, ...) {\n}\n\n// Helper function to implement RAW_LOG and RAW_VLOG\n// Logs format... at \"severity\" level, reporting it\n// as called from file:line.\n// This does not allocate memory or acquire locks.\nGOOGLE_GLOG_DLL_DECL void RawLog__(LogSeverity severity,\n                                   const char* file,\n                                   int line,\n                                   const char* format, ...)\n   @ac_cv___attribute___printf_4_5@;\n\n// Hack to propagate time information into this module so that\n// this module does not have to directly call localtime_r(),\n// which could allocate memory.\nGOOGLE_GLOG_DLL_DECL void RawLog__SetLastTime(const struct tm& t, int usecs);\n\n@ac_google_end_namespace@\n\n#endif  // BASE_RAW_LOGGING_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/glog/stl_logging.h.in",
    "content": "// Copyright (c) 2003, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Stream output operators for STL containers; to be used for logging *only*.\n// Inclusion of this file lets you do:\n//\n// list<string> x;\n// LOG(INFO) << \"data: \" << x;\n// vector<int> v1, v2;\n// CHECK_EQ(v1, v2);\n//\n// Note that if you want to use these operators from the non-global namespace,\n// you may get an error since they are not in namespace std (and they are not\n// in namespace std since that would result in undefined behavior). You may\n// need to write\n//\n//   using ::operator<<;\n//\n// to fix these errors.\n\n#ifndef UTIL_GTL_STL_LOGGING_INL_H_\n#define UTIL_GTL_STL_LOGGING_INL_H_\n\n#if !@ac_cv_cxx_using_operator@\n# error We do not support stl_logging for this compiler\n#endif\n\n#include <deque>\n#include <list>\n#include <map>\n#include <ostream>\n#include <set>\n#include <utility>\n#include <vector>\n\n#ifdef __GNUC__\n# include <ext/hash_set>\n# include <ext/hash_map>\n# include <ext/slist>\n#endif\n\ntemplate<class First, class Second>\ninline std::ostream& operator<<(std::ostream& out,\n                                const std::pair<First, Second>& p) {\n  out << '(' << p.first << \", \" << p.second << ')';\n  return out;\n}\n\n@ac_google_start_namespace@\n\ntemplate<class Iter>\ninline void PrintSequence(std::ostream& out, Iter begin, Iter end) {\n  using ::operator<<;\n  // Output at most 100 elements -- appropriate if used for logging.\n  for (int i = 0; begin != end && i < 100; ++i, ++begin) {\n    if (i > 0) out << ' ';\n    out << *begin;\n  }\n  if (begin != end) {\n    out << \" ...\";\n  }\n}\n\n@ac_google_end_namespace@\n\n#define OUTPUT_TWO_ARG_CONTAINER(Sequence) \\\ntemplate<class T1, class T2> \\\ninline std::ostream& operator<<(std::ostream& out, \\\n                                const Sequence<T1, T2>& seq) { \\\n  @ac_google_namespace@::PrintSequence(out, seq.begin(), seq.end()); \\\n  return out; \\\n}\n\nOUTPUT_TWO_ARG_CONTAINER(std::vector)\nOUTPUT_TWO_ARG_CONTAINER(std::deque)\nOUTPUT_TWO_ARG_CONTAINER(std::list)\n#ifdef __GNUC__\nOUTPUT_TWO_ARG_CONTAINER(__gnu_cxx::slist)\n#endif\n\n#undef OUTPUT_TWO_ARG_CONTAINER\n\n#define OUTPUT_THREE_ARG_CONTAINER(Sequence) \\\ntemplate<class T1, class T2, class T3> \\\ninline std::ostream& operator<<(std::ostream& out, \\\n                                const Sequence<T1, T2, T3>& seq) { \\\n  @ac_google_namespace@::PrintSequence(out, seq.begin(), seq.end()); \\\n  return out; \\\n}\n\nOUTPUT_THREE_ARG_CONTAINER(std::set)\nOUTPUT_THREE_ARG_CONTAINER(std::multiset)\n\n#undef OUTPUT_THREE_ARG_CONTAINER\n\n#define OUTPUT_FOUR_ARG_CONTAINER(Sequence) \\\ntemplate<class T1, class T2, class T3, class T4> \\\ninline std::ostream& operator<<(std::ostream& out, \\\n                                const Sequence<T1, T2, T3, T4>& seq) { \\\n  @ac_google_namespace@::PrintSequence(out, seq.begin(), seq.end()); \\\n  return out; \\\n}\n\nOUTPUT_FOUR_ARG_CONTAINER(std::map)\nOUTPUT_FOUR_ARG_CONTAINER(std::multimap)\n#ifdef __GNUC__\nOUTPUT_FOUR_ARG_CONTAINER(__gnu_cxx::hash_set)\nOUTPUT_FOUR_ARG_CONTAINER(__gnu_cxx::hash_multiset)\n#endif\n\n#undef OUTPUT_FOUR_ARG_CONTAINER\n\n#define OUTPUT_FIVE_ARG_CONTAINER(Sequence) \\\ntemplate<class T1, class T2, class T3, class T4, class T5> \\\ninline std::ostream& operator<<(std::ostream& out, \\\n                                const Sequence<T1, T2, T3, T4, T5>& seq) { \\\n  @ac_google_namespace@::PrintSequence(out, seq.begin(), seq.end()); \\\n  return out; \\\n}\n\n#ifdef __GNUC__\nOUTPUT_FIVE_ARG_CONTAINER(__gnu_cxx::hash_map)\nOUTPUT_FIVE_ARG_CONTAINER(__gnu_cxx::hash_multimap)\n#endif\n\n#undef OUTPUT_FIVE_ARG_CONTAINER\n\n#endif  // UTIL_GTL_STL_LOGGING_INL_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/glog/vlog_is_on.h.in",
    "content": "// Copyright (c) 1999, 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Ray Sidney and many others\n//\n// Defines the VLOG_IS_ON macro that controls the variable-verbosity\n// conditional logging.\n//\n// It's used by VLOG and VLOG_IF in logging.h\n// and by RAW_VLOG in raw_logging.h to trigger the logging.\n//\n// It can also be used directly e.g. like this:\n//   if (VLOG_IS_ON(2)) {\n//     // do some logging preparation and logging\n//     // that can't be accomplished e.g. via just VLOG(2) << ...;\n//   }\n//\n// The truth value that VLOG_IS_ON(level) returns is determined by \n// the three verbosity level flags:\n//   --v=<n>  Gives the default maximal active V-logging level;\n//            0 is the default.\n//            Normally positive values are used for V-logging levels.\n//   --vmodule=<str>  Gives the per-module maximal V-logging levels to override\n//                    the value given by --v.\n//                    E.g. \"my_module=2,foo*=3\" would change the logging level\n//                    for all code in source files \"my_module.*\" and \"foo*.*\"\n//                    (\"-inl\" suffixes are also disregarded for this matching).\n//\n// SetVLOGLevel helper function is provided to do limited dynamic control over\n// V-logging by overriding the per-module settings given via --vmodule flag.\n//\n// CAVEAT: --vmodule functionality is not available in non gcc compilers.\n//\n\n#ifndef BASE_VLOG_IS_ON_H_\n#define BASE_VLOG_IS_ON_H_\n\n#include \"glog/log_severity.h\"\n\n// Annoying stuff for windows -- makes sure clients can import these functions\n#ifndef GOOGLE_GLOG_DLL_DECL\n# if defined(_WIN32) && !defined(__CYGWIN__)\n#   define GOOGLE_GLOG_DLL_DECL  __declspec(dllimport)\n# else\n#   define GOOGLE_GLOG_DLL_DECL\n# endif\n#endif\n\n#if defined(__GNUC__)\n// We emit an anonymous static int* variable at every VLOG_IS_ON(n) site.\n// (Normally) the first time every VLOG_IS_ON(n) site is hit,\n// we determine what variable will dynamically control logging at this site:\n// it's either FLAGS_v or an appropriate internal variable\n// matching the current source file that represents results of\n// parsing of --vmodule flag and/or SetVLOGLevel calls.\n#define VLOG_IS_ON(verboselevel)                                \\\n  __extension__  \\\n  ({ static @ac_google_namespace@::int32* vlocal__ = &@ac_google_namespace@::kLogSiteUninitialized;           \\\n     @ac_google_namespace@::int32 verbose_level__ = (verboselevel);                    \\\n     (*vlocal__ >= verbose_level__) &&                          \\\n     ((vlocal__ != &@ac_google_namespace@::kLogSiteUninitialized) ||                   \\\n      (@ac_google_namespace@::InitVLOG3__(&vlocal__, &FLAGS_v,                         \\\n                   __FILE__, verbose_level__))); })\n#else\n// GNU extensions not available, so we do not support --vmodule.\n// Dynamic value of FLAGS_v always controls the logging level.\n#define VLOG_IS_ON(verboselevel) (FLAGS_v >= (verboselevel))\n#endif\n\n// Set VLOG(_IS_ON) level for module_pattern to log_level.\n// This lets us dynamically control what is normally set by the --vmodule flag.\n// Returns the level that previously applied to module_pattern.\n// NOTE: To change the log level for VLOG(_IS_ON) sites\n//\t that have already executed after/during InitGoogleLogging,\n//\t one needs to supply the exact --vmodule pattern that applied to them.\n//       (If no --vmodule pattern applied to them\n//       the value of FLAGS_v will continue to control them.)\nextern GOOGLE_GLOG_DLL_DECL int SetVLOGLevel(const char* module_pattern,\n                                             int log_level);\n\n// Various declarations needed for VLOG_IS_ON above: =========================\n\n// Special value used to indicate that a VLOG_IS_ON site has not been\n// initialized.  We make this a large value, so the common-case check\n// of \"*vlocal__ >= verbose_level__\" in VLOG_IS_ON definition\n// passes in such cases and InitVLOG3__ is then triggered.\nextern @ac_google_namespace@::int32 kLogSiteUninitialized;\n\n// Helper routine which determines the logging info for a particalur VLOG site.\n//   site_flag     is the address of the site-local pointer to the controlling\n//                 verbosity level\n//   site_default  is the default to use for *site_flag\n//   fname         is the current source file name\n//   verbose_level is the argument to VLOG_IS_ON\n// We will return the return value for VLOG_IS_ON\n// and if possible set *site_flag appropriately.\nextern GOOGLE_GLOG_DLL_DECL bool InitVLOG3__(\n    @ac_google_namespace@::int32** site_flag,\n    @ac_google_namespace@::int32* site_default,\n    const char* fname,\n    @ac_google_namespace@::int32 verbose_level);\n\n#endif  // BASE_VLOG_IS_ON_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/googletest.h",
    "content": "// Copyright (c) 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Shinichiro Hamaji\n//   (based on googletest: http://code.google.com/p/googletest/)\n\n#ifdef GOOGLETEST_H__\n#error You must not include this file twice.\n#endif\n#define GOOGLETEST_H__\n\n#include \"utilities.h\"\n\n#include <ctype.h>\n#include <setjmp.h>\n#include <time.h>\n\n#include <map>\n#include <sstream>\n#include <string>\n#include <vector>\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\n\n#include \"base/commandlineflags.h\"\n\nusing std::map;\nusing std::string;\nusing std::vector;\n\n_START_GOOGLE_NAMESPACE_\n\nextern GOOGLE_GLOG_DLL_DECL void (*g_logging_fail_func)();\n\n_END_GOOGLE_NAMESPACE_\n\n#undef GOOGLE_GLOG_DLL_DECL\n#define GOOGLE_GLOG_DLL_DECL\n\nstatic inline string GetTempDir() {\n#ifndef OS_WINDOWS\n  return \"/tmp\";\n#else\n  char tmp[MAX_PATH];\n  GetTempPathA(MAX_PATH, tmp);\n  return tmp;\n#endif\n}\n\n#ifdef OS_WINDOWS\n// The test will run in glog/vsproject/<project name>\n// (e.g., glog/vsproject/logging_unittest).\nstatic const char TEST_SRC_DIR[] = \"../..\";\n#elif !defined(TEST_SRC_DIR)\n# warning TEST_SRC_DIR should be defined in config.h\nstatic const char TEST_SRC_DIR[] = \".\";\n#endif\n\nDEFINE_string(test_tmpdir, GetTempDir(), \"Dir we use for temp files\");\nDEFINE_string(test_srcdir, TEST_SRC_DIR,\n              \"Source-dir root, needed to find glog_unittest_flagfile\");\nDEFINE_bool(run_benchmark, false, \"If true, run benchmarks\");\n#ifdef NDEBUG\nDEFINE_int32(benchmark_iters, 100000000, \"Number of iterations per benchmark\");\n#else\nDEFINE_int32(benchmark_iters, 100000, \"Number of iterations per benchmark\");\n#endif\n\n#ifdef HAVE_LIB_GTEST\n# include <gtest/gtest.h>\n// Use our ASSERT_DEATH implementation.\n# undef ASSERT_DEATH\n# undef ASSERT_DEBUG_DEATH\nusing testing::InitGoogleTest;\n#else\n\n_START_GOOGLE_NAMESPACE_\n\nvoid InitGoogleTest(int* argc, char** argv) {}\n\n// The following is some bare-bones testing infrastructure\n\n#define EXPECT_TRUE(cond)                               \\\n  do {                                                  \\\n    if (!(cond)) {                                      \\\n      fprintf(stderr, \"Check failed: %s\\n\", #cond);     \\\n      exit(1);                                          \\\n    }                                                   \\\n  } while (0)\n\n#define EXPECT_FALSE(cond)  EXPECT_TRUE(!(cond))\n\n#define EXPECT_OP(op, val1, val2)                                       \\\n  do {                                                                  \\\n    if (!((val1) op (val2))) {                                          \\\n      fprintf(stderr, \"Check failed: %s %s %s\\n\", #val1, #op, #val2);   \\\n      exit(1);                                                          \\\n    }                                                                   \\\n  } while (0)\n\n#define EXPECT_EQ(val1, val2)  EXPECT_OP(==, val1, val2)\n#define EXPECT_NE(val1, val2)  EXPECT_OP(!=, val1, val2)\n#define EXPECT_GT(val1, val2)  EXPECT_OP(>, val1, val2)\n#define EXPECT_LT(val1, val2)  EXPECT_OP(<, val1, val2)\n\n#define EXPECT_NAN(arg)                                         \\\n  do {                                                          \\\n    if (!isnan(arg)) {                                          \\\n      fprintf(stderr, \"Check failed: isnan(%s)\\n\", #arg);       \\\n      exit(1);                                                  \\\n    }                                                           \\\n  } while (0)\n\n#define EXPECT_INF(arg)                                         \\\n  do {                                                          \\\n    if (!isinf(arg)) {                                          \\\n      fprintf(stderr, \"Check failed: isinf(%s)\\n\", #arg);       \\\n      exit(1);                                                  \\\n    }                                                           \\\n  } while (0)\n\n#define EXPECT_DOUBLE_EQ(val1, val2)                                    \\\n  do {                                                                  \\\n    if (((val1) < (val2) - 0.001 || (val1) > (val2) + 0.001)) {         \\\n      fprintf(stderr, \"Check failed: %s == %s\\n\", #val1, #val2);        \\\n      exit(1);                                                          \\\n    }                                                                   \\\n  } while (0)\n\n#define EXPECT_STREQ(val1, val2)                                        \\\n  do {                                                                  \\\n    if (strcmp((val1), (val2)) != 0) {                                  \\\n      fprintf(stderr, \"Check failed: streq(%s, %s)\\n\", #val1, #val2);   \\\n      exit(1);                                                          \\\n    }                                                                   \\\n  } while (0)\n\nvector<void (*)()> g_testlist;  // the tests to run\n\n#define TEST(a, b)                                      \\\n  struct Test_##a##_##b {                               \\\n    Test_##a##_##b() { g_testlist.push_back(&Run); }    \\\n    static void Run() { FlagSaver fs; RunTest(); }      \\\n    static void RunTest();                              \\\n  };                                                    \\\n  static Test_##a##_##b g_test_##a##_##b;               \\\n  void Test_##a##_##b::RunTest()\n\n\nstatic inline int RUN_ALL_TESTS() {\n  vector<void (*)()>::const_iterator it;\n  for (it = g_testlist.begin(); it != g_testlist.end(); ++it) {\n    (*it)();\n  }\n  fprintf(stderr, \"Passed %d tests\\n\\nPASS\\n\", (int)g_testlist.size());\n  return 0;\n}\n\n_END_GOOGLE_NAMESPACE_\n\n#endif  // ! HAVE_LIB_GTEST\n\n_START_GOOGLE_NAMESPACE_\n\nstatic bool g_called_abort;\nstatic jmp_buf g_jmp_buf;\nstatic inline void CalledAbort() {\n  g_called_abort = true;\n  longjmp(g_jmp_buf, 1);\n}\n\n#ifdef OS_WINDOWS\n// TODO(hamaji): Death test somehow doesn't work in Windows.\n#define ASSERT_DEATH(fn, msg)\n#else\n#define ASSERT_DEATH(fn, msg)                                           \\\n  do {                                                                  \\\n    g_called_abort = false;                                             \\\n    /* in logging.cc */                                                 \\\n    void (*original_logging_fail_func)() = g_logging_fail_func;         \\\n    g_logging_fail_func = &CalledAbort;                                 \\\n    if (!setjmp(g_jmp_buf)) fn;                                         \\\n    /* set back to their default */                                     \\\n    g_logging_fail_func = original_logging_fail_func;                   \\\n    if (!g_called_abort) {                                              \\\n      fprintf(stderr, \"Function didn't die (%s): %s\\n\", msg, #fn);      \\\n      exit(1);                                                          \\\n    }                                                                   \\\n  } while (0)\n#endif\n\n#ifdef NDEBUG\n#define ASSERT_DEBUG_DEATH(fn, msg)\n#else\n#define ASSERT_DEBUG_DEATH(fn, msg) ASSERT_DEATH(fn, msg)\n#endif  // NDEBUG\n\n// Benchmark tools.\n\n#define BENCHMARK(n) static BenchmarkRegisterer __benchmark_ ## n (#n, &n);\n\nmap<string, void (*)(int)> g_benchlist;  // the benchmarks to run\n\nclass BenchmarkRegisterer {\n public:\n  BenchmarkRegisterer(const char* name, void (*function)(int iters)) {\n    EXPECT_TRUE(g_benchlist.insert(std::make_pair(name, function)).second);\n  }\n};\n\nstatic inline void RunSpecifiedBenchmarks() {\n  if (!FLAGS_run_benchmark) {\n    return;\n  }\n\n  int iter_cnt = FLAGS_benchmark_iters;\n  puts(\"Benchmark\\tTime(ns)\\tIterations\");\n  for (map<string, void (*)(int)>::const_iterator iter = g_benchlist.begin();\n       iter != g_benchlist.end();\n       ++iter) {\n    clock_t start = clock();\n    iter->second(iter_cnt);\n    double elapsed_ns =\n        ((double)clock() - start) / CLOCKS_PER_SEC * 1000*1000*1000;\n    printf(\"%s\\t%8.2lf\\t%10d\\n\",\n           iter->first.c_str(), elapsed_ns / iter_cnt, iter_cnt);\n  }\n  puts(\"\");\n}\n\n// ----------------------------------------------------------------------\n// Golden file functions\n// ----------------------------------------------------------------------\n\nclass CapturedStream {\n public:\n  CapturedStream(int fd, const string & filename) :\n    fd_(fd),\n    uncaptured_fd_(-1),\n    filename_(filename) {\n    Capture();\n  }\n\n  ~CapturedStream() {\n    if (uncaptured_fd_ != -1) {\n      CHECK(close(uncaptured_fd_) != -1);\n    }\n  }\n\n  // Start redirecting output to a file\n  void Capture() {\n    // Keep original stream for later\n    CHECK(uncaptured_fd_ == -1) << \", Stream \" << fd_ << \" already captured!\";\n    uncaptured_fd_ = dup(fd_);\n    CHECK(uncaptured_fd_ != -1);\n\n    // Open file to save stream to\n    int cap_fd = open(filename_.c_str(),\n                      O_CREAT | O_TRUNC | O_WRONLY,\n                      S_IRUSR | S_IWUSR);\n    CHECK(cap_fd != -1);\n\n    // Send stdout/stderr to this file\n    fflush(NULL);\n    CHECK(dup2(cap_fd, fd_) != -1);\n    CHECK(close(cap_fd) != -1);\n  }\n\n  // Remove output redirection\n  void StopCapture() {\n    // Restore original stream\n    if (uncaptured_fd_ != -1) {\n      fflush(NULL);\n      CHECK(dup2(uncaptured_fd_, fd_) != -1);\n    }\n  }\n\n  const string & filename() const { return filename_; }\n\n private:\n  int fd_;             // file descriptor being captured\n  int uncaptured_fd_;  // where the stream was originally being sent to\n  string filename_;    // file where stream is being saved\n};\nstatic CapturedStream * s_captured_streams[STDERR_FILENO+1];\n// Redirect a file descriptor to a file.\n//   fd       - Should be STDOUT_FILENO or STDERR_FILENO\n//   filename - File where output should be stored\nstatic inline void CaptureTestOutput(int fd, const string & filename) {\n  CHECK((fd == STDOUT_FILENO) || (fd == STDERR_FILENO));\n  CHECK(s_captured_streams[fd] == NULL);\n  s_captured_streams[fd] = new CapturedStream(fd, filename);\n}\nstatic inline void CaptureTestStderr() {\n  CaptureTestOutput(STDERR_FILENO, FLAGS_test_tmpdir + \"/captured.err\");\n}\n// Return the size (in bytes) of a file\nstatic inline size_t GetFileSize(FILE * file) {\n  fseek(file, 0, SEEK_END);\n  return static_cast<size_t>(ftell(file));\n}\n// Read the entire content of a file as a string\nstatic inline string ReadEntireFile(FILE * file) {\n  const size_t file_size = GetFileSize(file);\n  char * const buffer = new char[file_size];\n\n  size_t bytes_last_read = 0;  // # of bytes read in the last fread()\n  size_t bytes_read = 0;       // # of bytes read so far\n\n  fseek(file, 0, SEEK_SET);\n\n  // Keep reading the file until we cannot read further or the\n  // pre-determined file size is reached.\n  do {\n    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);\n    bytes_read += bytes_last_read;\n  } while (bytes_last_read > 0 && bytes_read < file_size);\n\n  const string content = string(buffer, buffer+bytes_read);\n  delete[] buffer;\n\n  return content;\n}\n// Get the captured stdout (when fd is STDOUT_FILENO) or stderr (when\n// fd is STDERR_FILENO) as a string\nstatic inline string GetCapturedTestOutput(int fd) {\n  CHECK(fd == STDOUT_FILENO || fd == STDERR_FILENO);\n  CapturedStream * const cap = s_captured_streams[fd];\n  CHECK(cap)\n    << \": did you forget CaptureTestStdout() or CaptureTestStderr()?\";\n\n  // Make sure everything is flushed.\n  cap->StopCapture();\n\n  // Read the captured file.\n  FILE * const file = fopen(cap->filename().c_str(), \"r\");\n  const string content = ReadEntireFile(file);\n  fclose(file);\n\n  delete cap;\n  s_captured_streams[fd] = NULL;\n\n  return content;\n}\n// Get the captured stderr of a test as a string.\nstatic inline string GetCapturedTestStderr() {\n  return GetCapturedTestOutput(STDERR_FILENO);\n}\n\n// Check if the string is [IWEF](\\d{4}|DATE)\nstatic inline bool IsLoggingPrefix(const string& s) {\n  if (s.size() != 5) return false;\n  if (!strchr(\"IWEF\", s[0])) return false;\n  for (int i = 1; i <= 4; ++i) {\n    if (!isdigit(s[i]) && s[i] != \"DATE\"[i-1]) return false;\n  }\n  return true;\n}\n\n// Convert log output into normalized form.\n//\n// Example:\n//     I0102 030405 logging_unittest.cc:345] RAW: vlog -1\n//  => IDATE TIME__ logging_unittest.cc:LINE] RAW: vlog -1\nstatic inline string MungeLine(const string& line) {\n  std::istringstream iss(line);\n  string before, logcode_date, time, thread_lineinfo;\n  iss >> logcode_date;\n  while (!IsLoggingPrefix(logcode_date)) {\n    before += \" \" + logcode_date;\n    if (!(iss >> logcode_date)) {\n      // We cannot find the header of log output.\n      return before;\n    }\n  }\n  if (!before.empty()) before += \" \";\n  iss >> time;\n  iss >> thread_lineinfo;\n  CHECK(!thread_lineinfo.empty());\n  if (thread_lineinfo[thread_lineinfo.size() - 1] != ']') {\n    // We found thread ID.\n    string tmp;\n    iss >> tmp;\n    CHECK(!tmp.empty());\n    CHECK_EQ(']', tmp[tmp.size() - 1]);\n    thread_lineinfo = \"THREADID \" + tmp;\n  }\n  size_t index = thread_lineinfo.find(':');\n  CHECK_NE(string::npos, index);\n  thread_lineinfo = thread_lineinfo.substr(0, index+1) + \"LINE]\";\n  string rest;\n  std::getline(iss, rest);\n  return (before + logcode_date[0] + \"DATE TIME__ \" + thread_lineinfo +\n          MungeLine(rest));\n}\n\nstatic inline void StringReplace(string* str,\n                          const string& oldsub,\n                          const string& newsub) {\n  size_t pos = str->find(oldsub);\n  if (pos != string::npos) {\n    str->replace(pos, oldsub.size(), newsub.c_str());\n  }\n}\n\nstatic inline string Munge(const string& filename) {\n  FILE* fp = fopen(filename.c_str(), \"rb\");\n  CHECK(fp != NULL) << filename << \": couldn't open\";\n  char buf[4096];\n  string result;\n  while (fgets(buf, 4095, fp)) {\n    string line = MungeLine(buf);\n    char null_str[256];\n    sprintf(null_str, \"%p\", static_cast<void*>(NULL));\n    StringReplace(&line, \"__NULLP__\", null_str);\n    // Remove 0x prefix produced by %p. VC++ doesn't put the prefix.\n    StringReplace(&line, \" 0x\", \" \");\n\n    char errmsg_buf[100];\n    posix_strerror_r(0, errmsg_buf, sizeof(errmsg_buf));\n    if (*errmsg_buf == '\\0') {\n      // MacOSX 10.4 and FreeBSD return empty string for errno=0.\n      // In such case, the we need to remove an extra space.\n      StringReplace(&line, \"__SUCCESS__ \", \"\");\n    } else {\n      StringReplace(&line, \"__SUCCESS__\", errmsg_buf);\n    }\n    StringReplace(&line, \"__ENOENT__\", strerror(ENOENT));\n    StringReplace(&line, \"__EINTR__\", strerror(EINTR));\n    StringReplace(&line, \"__ENXIO__\", strerror(ENXIO));\n    StringReplace(&line, \"__ENOEXEC__\", strerror(ENOEXEC));\n    result += line + \"\\n\";\n  }\n  fclose(fp);\n  return result;\n}\n\nstatic inline void WriteToFile(const string& body, const string& file) {\n  FILE* fp = fopen(file.c_str(), \"wb\");\n  fwrite(body.data(), 1, body.size(), fp);\n  fclose(fp);\n}\n\nstatic inline bool MungeAndDiffTestStderr(const string& golden_filename) {\n  CapturedStream* cap = s_captured_streams[STDERR_FILENO];\n  CHECK(cap) << \": did you forget CaptureTestStderr()?\";\n\n  cap->StopCapture();\n\n  // Run munge\n  const string captured = Munge(cap->filename());\n  const string golden = Munge(golden_filename);\n  if (captured != golden) {\n    fprintf(stderr,\n            \"Test with golden file failed. We'll try to show the diff:\\n\");\n    string munged_golden = golden_filename + \".munged\";\n    WriteToFile(golden, munged_golden);\n    string munged_captured = cap->filename() + \".munged\";\n    WriteToFile(captured, munged_captured);\n    string diffcmd(\"diff -u \" + munged_golden + \" \" + munged_captured);\n    if (system(diffcmd.c_str()) != 0) {\n      fprintf(stderr, \"diff command was failed.\\n\");\n    }\n    unlink(munged_golden.c_str());\n    unlink(munged_captured.c_str());\n    return false;\n  }\n  LOG(INFO) << \"Diff was successful\";\n  return true;\n}\n\n// Save flags used from logging_unittest.cc.\n#ifndef HAVE_LIB_GFLAGS\nstruct FlagSaver {\n  FlagSaver()\n      : v_(FLAGS_v),\n        stderrthreshold_(FLAGS_stderrthreshold),\n        logtostderr_(FLAGS_logtostderr),\n        alsologtostderr_(FLAGS_alsologtostderr) {}\n  ~FlagSaver() {\n    FLAGS_v = v_;\n    FLAGS_stderrthreshold = stderrthreshold_;\n    FLAGS_logtostderr = logtostderr_;\n    FLAGS_alsologtostderr = alsologtostderr_;\n  }\n  int v_;\n  int stderrthreshold_;\n  bool logtostderr_;\n  bool alsologtostderr_;\n};\n#endif\n\nclass Thread {\n public:\n  virtual ~Thread() {}\n\n  void SetJoinable(bool joinable) {}\n#if defined(OS_WINDOWS) || defined(OS_CYGWIN)\n  void Start() {\n    handle_ = CreateThread(NULL,\n                           0,\n                           (LPTHREAD_START_ROUTINE)&Thread::InvokeThread,\n                           (LPVOID)this,\n                           0,\n                           &th_);\n    CHECK(handle_) << \"CreateThread\";\n  }\n  void Join() {\n    WaitForSingleObject(handle_, INFINITE);\n  }\n#elif defined(HAVE_PTHREAD)\n  void Start() {\n    pthread_create(&th_, NULL, &Thread::InvokeThread, this);\n  }\n  void Join() {\n    pthread_join(th_, NULL);\n  }\n#else\n# error No thread implementation.\n#endif\n\n protected:\n  virtual void Run() = 0;\n\n private:\n  static void* InvokeThread(void* self) {\n    ((Thread*)self)->Run();\n    return NULL;\n  }\n\n#if defined(OS_WINDOWS) || defined(OS_CYGWIN)\n  HANDLE handle_;\n  DWORD th_;\n#else\n  pthread_t th_;\n#endif\n};\n\nstatic inline void SleepForMilliseconds(int t) {\n#ifndef OS_WINDOWS\n  usleep(t * 1000);\n#else\n  Sleep(t);\n#endif\n}\n\n// Add hook for operator new to ensure there are no memory allocation.\n\nvoid (*g_new_hook)() = NULL;\n\n_END_GOOGLE_NAMESPACE_\n\nvoid* operator new(size_t size) {\n  if (GOOGLE_NAMESPACE::g_new_hook) {\n    GOOGLE_NAMESPACE::g_new_hook();\n  }\n  return malloc(size);\n}\n\nvoid* operator new[](size_t size) {\n  return ::operator new(size);\n}\n\nvoid operator delete(void* p) {\n  free(p);\n}\n\nvoid operator delete[](void* p) {\n  ::operator delete(p);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/logging.cc",
    "content": "// Copyright (c) 1999, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#define _GNU_SOURCE 1 // needed for O_NOFOLLOW and pread()/pwrite()\n\n#include \"utilities.h\"\n\n#include <assert.h>\n#include <iomanip>\n#include <string>\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>  // For _exit.\n#endif\n#include <climits>\n#include <sys/types.h>\n#include <sys/stat.h>\n#ifdef HAVE_SYS_UTSNAME_H\n# include <sys/utsname.h>  // For uname.\n#endif\n#include <fcntl.h>\n#include <cstdio>\n#include <iostream>\n#include <stdarg.h>\n#include <stdlib.h>\n#ifdef HAVE_PWD_H\n# include <pwd.h>\n#endif\n#ifdef HAVE_SYSLOG_H\n# include <syslog.h>\n#endif\n#include <vector>\n#include <errno.h>                   // for errno\n#include <sstream>\n#include \"base/commandlineflags.h\"        // to get the program name\n#include \"glog/logging.h\"\n#include \"glog/raw_logging.h\"\n#include \"base/googleinit.h\"\n\n#ifdef HAVE_STACKTRACE\n# include \"stacktrace.h\"\n#endif\n\nusing std::string;\nusing std::vector;\nusing std::ostrstream;\nusing std::setw;\nusing std::setfill;\nusing std::hex;\nusing std::dec;\nusing std::min;\nusing std::ostream;\nusing std::ostringstream;\nusing std::strstream;\n\n// There is no thread annotation support.\n#define EXCLUSIVE_LOCKS_REQUIRED(mu)\n\nstatic bool BoolFromEnv(const char *varname, bool defval) {\n  const char* const valstr = getenv(varname);\n  if (!valstr) {\n    return defval;\n  }\n  return memchr(\"tTyY1\\0\", valstr[0], 6) != NULL;\n}\n\nGLOG_DEFINE_bool(logtostderr, BoolFromEnv(\"GOOGLE_LOGTOSTDERR\", false),\n                 \"log messages go to stderr instead of logfiles\");\nGLOG_DEFINE_bool(alsologtostderr, BoolFromEnv(\"GOOGLE_ALSOLOGTOSTDERR\", false),\n                 \"log messages go to stderr in addition to logfiles\");\n#ifdef OS_LINUX\nGLOG_DEFINE_bool(drop_log_memory, true, \"Drop in-memory buffers of log contents. \"\n                 \"Logs can grow very quickly and they are rarely read before they \"\n                 \"need to be evicted from memory. Instead, drop them from memory \"\n                 \"as soon as they are flushed to disk.\");\n_START_GOOGLE_NAMESPACE_\nnamespace logging {\nstatic const int64 kPageSize = getpagesize();\n}\n_END_GOOGLE_NAMESPACE_\n#endif\n\n// By default, errors (including fatal errors) get logged to stderr as\n// well as the file.\n//\n// The default is ERROR instead of FATAL so that users can see problems\n// when they run a program without having to look in another file.\nDEFINE_int32(stderrthreshold,\n             GOOGLE_NAMESPACE::ERROR,\n             \"log messages at or above this level are copied to stderr in \"\n             \"addition to logfiles.  This flag obsoletes --alsologtostderr.\");\n\nGLOG_DEFINE_string(alsologtoemail, \"\",\n                   \"log messages go to these email addresses \"\n                   \"in addition to logfiles\");\nGLOG_DEFINE_bool(log_prefix, true,\n                 \"Prepend the log prefix to the start of each log line\");\nGLOG_DEFINE_int32(minloglevel, 0, \"Messages logged at a lower level than this don't \"\n                  \"actually get logged anywhere\");\nGLOG_DEFINE_int32(logbuflevel, 0,\n                  \"Buffer log messages logged at this level or lower\"\n                  \" (-1 means don't buffer; 0 means buffer INFO only;\"\n                  \" ...)\");\nGLOG_DEFINE_int32(logbufsecs, 30,\n                  \"Buffer log messages for at most this many seconds\");\nGLOG_DEFINE_int32(logemaillevel, 999,\n                  \"Email log messages logged at this level or higher\"\n                  \" (0 means email all; 3 means email FATAL only;\"\n                  \" ...)\");\nGLOG_DEFINE_string(logmailer, \"/bin/mail\",\n                   \"Mailer used to send logging email\");\n\n// Compute the default value for --log_dir\nstatic const char* DefaultLogDir() {\n  const char* env;\n  env = getenv(\"GOOGLE_LOG_DIR\");\n  if (env != NULL && env[0] != '\\0') {\n    return env;\n  }\n  env = getenv(\"TEST_TMPDIR\");\n  if (env != NULL && env[0] != '\\0') {\n    return env;\n  }\n  return \"\";\n}\n\nGLOG_DEFINE_string(log_dir, DefaultLogDir(),\n                   \"If specified, logfiles are written into this directory instead \"\n                   \"of the default logging directory.\");\nGLOG_DEFINE_string(log_link, \"\", \"Put additional links to the log \"\n                   \"files in this directory\");\n\nGLOG_DEFINE_int32(max_log_size, 1800,\n                  \"approx. maximum log file size (in MB). A value of 0 will \"\n                  \"be silently overridden to 1.\");\n\nGLOG_DEFINE_bool(stop_logging_if_full_disk, false,\n                 \"Stop attempting to log to disk if the disk is full.\");\n\nGLOG_DEFINE_string(log_backtrace_at, \"\",\n                   \"Emit a backtrace when logging at file:linenum.\");\n\n// TODO(hamaji): consider windows\n#define PATH_SEPARATOR '/'\n\nstatic void GetHostName(string* hostname) {\n#if defined(HAVE_SYS_UTSNAME_H)\n  struct utsname buf;\n  if (0 != uname(&buf)) {\n    // ensure null termination on failure\n    *buf.nodename = '\\0';\n  }\n  *hostname = buf.nodename;\n#elif defined(OS_WINDOWS)\n  char buf[MAX_COMPUTERNAME_LENGTH + 1];\n  DWORD len = MAX_COMPUTERNAME_LENGTH + 1;\n  if (GetComputerNameA(buf, &len)) {\n    *hostname = buf;\n  } else {\n    hostname->clear();\n  }\n#else\n# warning There is no way to retrieve the host name.\n  *hostname = \"(unknown)\";\n#endif\n}\n\n_START_GOOGLE_NAMESPACE_\n\n// Safely get max_log_size, overriding to 1 if it somehow gets defined as 0\nstatic int32 MaxLogSize() {\n  return (FLAGS_max_log_size > 0 ? FLAGS_max_log_size : 1);\n}\n\n// A mutex that allows only one thread to log at a time, to keep things from\n// getting jumbled.  Some other very uncommon logging operations (like\n// changing the destination file for log messages of a given severity) also\n// lock this mutex.  Please be sure that anybody who might possibly need to\n// lock it does so.\nstatic Mutex log_mutex;\n\n// Number of messages sent at each severity.  Under log_mutex.\nint64 LogMessage::num_messages_[NUM_SEVERITIES] = {0, 0, 0, 0};\n\n// Globally disable log writing (if disk is full)\nstatic bool stop_writing = false;\n\nconst char*const LogSeverityNames[NUM_SEVERITIES] = {\n  \"INFO\", \"WARNING\", \"ERROR\", \"FATAL\"\n};\n\n// Has the user called SetExitOnDFatal(true)?\nstatic bool exit_on_dfatal = true;\n\nconst char* GetLogSeverityName(LogSeverity severity) {\n  return LogSeverityNames[severity];\n}\n\nstatic bool SendEmailInternal(const char*dest, const char *subject,\n                              const char*body, bool use_logging);\n\nbase::Logger::~Logger() {\n}\n\nnamespace {\n\n// Encapsulates all file-system related state\nclass LogFileObject : public base::Logger {\n public:\n  LogFileObject(LogSeverity severity, const char* base_filename);\n  ~LogFileObject();\n\n  virtual void Write(bool force_flush, // Should we force a flush here?\n                     time_t timestamp,  // Timestamp for this entry\n                     const char* message,\n                     int message_len);\n\n  // Configuration options\n  void SetBasename(const char* basename);\n  void SetExtension(const char* ext);\n  void SetSymlinkBasename(const char* symlink_basename);\n\n  // Normal flushing routine\n  virtual void Flush();\n\n  // It is the actual file length for the system loggers,\n  // i.e., INFO, ERROR, etc.\n  virtual uint32 LogSize() {\n    MutexLock l(&lock_);\n    return file_length_;\n  }\n\n  // Internal flush routine.  Exposed so that FlushLogFilesUnsafe()\n  // can avoid grabbing a lock.  Usually Flush() calls it after\n  // acquiring lock_.\n  void FlushUnlocked();\n\n private:\n  static const uint32 kRolloverAttemptFrequency = 0x20;\n\n  Mutex lock_;\n  bool base_filename_selected_;\n  string base_filename_;\n  string symlink_basename_;\n  string filename_extension_;     // option users can specify (eg to add port#)\n  FILE* file_;\n  LogSeverity severity_;\n  uint32 bytes_since_flush_;\n  uint32 file_length_;\n  unsigned int rollover_attempt_;\n  int64 next_flush_time_;         // cycle count at which to flush log\n\n  // Actually create a logfile using the value of base_filename_ and the\n  // supplied argument time_pid_string\n  // REQUIRES: lock_ is held\n  bool CreateLogfile(const char* time_pid_string);\n};\n\n}  // namespace\n\nclass LogDestination {\n public:\n  friend class LogMessage;\n  friend void ReprintFatalMessage();\n  friend base::Logger* base::GetLogger(LogSeverity);\n  friend void base::SetLogger(LogSeverity, base::Logger*);\n\n  // These methods are just forwarded to by their global versions.\n  static void SetLogDestination(LogSeverity severity,\n\t\t\t\tconst char* base_filename);\n  static void SetLogSymlink(LogSeverity severity,\n                            const char* symlink_basename);\n  static void AddLogSink(LogSink *destination);\n  static void RemoveLogSink(LogSink *destination);\n  static void SetLogFilenameExtension(const char* filename_extension);\n  static void SetStderrLogging(LogSeverity min_severity);\n  static void SetEmailLogging(LogSeverity min_severity, const char* addresses);\n  static void LogToStderr();\n  // Flush all log files that are at least at the given severity level\n  static void FlushLogFiles(int min_severity);\n  static void FlushLogFilesUnsafe(int min_severity);\n\n  // we set the maximum size of our packet to be 1400, the logic being\n  // to prevent fragmentation.\n  // Really this number is arbitrary.\n  static const int kNetworkBytes = 1400;\n\n  static const string& hostname();\n\n  static void DeleteLogDestinations();\n\n private:\n  LogDestination(LogSeverity severity, const char* base_filename);\n  ~LogDestination() { }\n\n  // Take a log message of a particular severity and log it to stderr\n  // iff it's of a high enough severity to deserve it.\n  static void MaybeLogToStderr(LogSeverity severity, const char* message,\n\t\t\t       size_t len);\n\n  // Take a log message of a particular severity and log it to email\n  // iff it's of a high enough severity to deserve it.\n  static void MaybeLogToEmail(LogSeverity severity, const char* message,\n\t\t\t      size_t len);\n  // Take a log message of a particular severity and log it to a file\n  // iff the base filename is not \"\" (which means \"don't log to me\")\n  static void MaybeLogToLogfile(LogSeverity severity,\n                                time_t timestamp,\n\t\t\t\tconst char* message, size_t len);\n  // Take a log message of a particular severity and log it to the file\n  // for that severity and also for all files with severity less than\n  // this severity.\n  static void LogToAllLogfiles(LogSeverity severity,\n                               time_t timestamp,\n                               const char* message, size_t len);\n\n  // Send logging info to all registered sinks.\n  static void LogToSinks(LogSeverity severity,\n                         const char *full_filename,\n                         const char *base_filename,\n                         int line,\n                         const struct ::tm* tm_time,\n                         const char* message,\n                         size_t message_len);\n\n  // Wait for all registered sinks via WaitTillSent\n  // including the optional one in \"data\".\n  static void WaitForSinks(LogMessage::LogMessageData* data);\n\n  static LogDestination* log_destination(LogSeverity severity);\n\n  LogFileObject fileobject_;\n  base::Logger* logger_;      // Either &fileobject_, or wrapper around it\n\n  static LogDestination* log_destinations_[NUM_SEVERITIES];\n  static LogSeverity email_logging_severity_;\n  static string addresses_;\n  static string hostname_;\n\n  // arbitrary global logging destinations.\n  static vector<LogSink*>* sinks_;\n\n  // Protects the vector sinks_,\n  // but not the LogSink objects its elements reference.\n  static Mutex sink_mutex_;\n\n  // Disallow\n  LogDestination(const LogDestination&);\n  LogDestination& operator=(const LogDestination&);\n};\n\n// Errors do not get logged to email by default.\nLogSeverity LogDestination::email_logging_severity_ = 99999;\n\nstring LogDestination::addresses_;\nstring LogDestination::hostname_;\n\nvector<LogSink*>* LogDestination::sinks_ = NULL;\nMutex LogDestination::sink_mutex_;\n\n/* static */\nconst string& LogDestination::hostname() {\n  if (hostname_.empty()) {\n    GetHostName(&hostname_);\n    if (hostname_.empty()) {\n      hostname_ = \"(unknown)\";\n    }\n  }\n  return hostname_;\n}\n\nLogDestination::LogDestination(LogSeverity severity,\n                               const char* base_filename)\n  : fileobject_(severity, base_filename),\n    logger_(&fileobject_) {\n}\n\ninline void LogDestination::FlushLogFilesUnsafe(int min_severity) {\n  // assume we have the log_mutex or we simply don't care\n  // about it\n  for (int i = min_severity; i < NUM_SEVERITIES; i++) {\n    LogDestination* log = log_destination(i);\n    if (log != NULL) {\n      // Flush the base fileobject_ logger directly instead of going\n      // through any wrappers to reduce chance of deadlock.\n      log->fileobject_.FlushUnlocked();\n    }\n  }\n}\n\ninline void LogDestination::FlushLogFiles(int min_severity) {\n  // Prevent any subtle race conditions by wrapping a mutex lock around\n  // all this stuff.\n  MutexLock l(&log_mutex);\n  for (int i = min_severity; i < NUM_SEVERITIES; i++) {\n    LogDestination* log = log_destination(i);\n    if (log != NULL) {\n      log->logger_->Flush();\n    }\n  }\n}\n\ninline void LogDestination::SetLogDestination(LogSeverity severity,\n\t\t\t\t\t      const char* base_filename) {\n  assert(severity >= 0 && severity < NUM_SEVERITIES);\n  // Prevent any subtle race conditions by wrapping a mutex lock around\n  // all this stuff.\n  MutexLock l(&log_mutex);\n  log_destination(severity)->fileobject_.SetBasename(base_filename);\n}\n\ninline void LogDestination::SetLogSymlink(LogSeverity severity,\n                                          const char* symlink_basename) {\n  CHECK_GE(severity, 0);\n  CHECK_LT(severity, NUM_SEVERITIES);\n  MutexLock l(&log_mutex);\n  log_destination(severity)->fileobject_.SetSymlinkBasename(symlink_basename);\n}\n\ninline void LogDestination::AddLogSink(LogSink *destination) {\n  // Prevent any subtle race conditions by wrapping a mutex lock around\n  // all this stuff.\n  MutexLock l(&sink_mutex_);\n  if (!sinks_)  sinks_ = new vector<LogSink*>;\n  sinks_->push_back(destination);\n}\n\ninline void LogDestination::RemoveLogSink(LogSink *destination) {\n  // Prevent any subtle race conditions by wrapping a mutex lock around\n  // all this stuff.\n  MutexLock l(&sink_mutex_);\n  // This doesn't keep the sinks in order, but who cares?\n  if (sinks_) {\n    for (int i = sinks_->size() - 1; i >= 0; i--) {\n      if ((*sinks_)[i] == destination) {\n        (*sinks_)[i] = (*sinks_)[sinks_->size() - 1];\n        sinks_->pop_back();\n        break;\n      }\n    }\n  }\n}\n\ninline void LogDestination::SetLogFilenameExtension(const char* ext) {\n  // Prevent any subtle race conditions by wrapping a mutex lock around\n  // all this stuff.\n  MutexLock l(&log_mutex);\n  for ( int severity = 0; severity < NUM_SEVERITIES; ++severity ) {\n    log_destination(severity)->fileobject_.SetExtension(ext);\n  }\n}\n\ninline void LogDestination::SetStderrLogging(LogSeverity min_severity) {\n  assert(min_severity >= 0 && min_severity < NUM_SEVERITIES);\n  // Prevent any subtle race conditions by wrapping a mutex lock around\n  // all this stuff.\n  MutexLock l(&log_mutex);\n  FLAGS_stderrthreshold = min_severity;\n}\n\ninline void LogDestination::LogToStderr() {\n  // *Don't* put this stuff in a mutex lock, since SetStderrLogging &\n  // SetLogDestination already do the locking!\n  SetStderrLogging(0);            // thus everything is \"also\" logged to stderr\n  for ( int i = 0; i < NUM_SEVERITIES; ++i ) {\n    SetLogDestination(i, \"\");     // \"\" turns off logging to a logfile\n  }\n}\n\ninline void LogDestination::SetEmailLogging(LogSeverity min_severity,\n\t\t\t\t\t    const char* addresses) {\n  assert(min_severity >= 0 && min_severity < NUM_SEVERITIES);\n  // Prevent any subtle race conditions by wrapping a mutex lock around\n  // all this stuff.\n  MutexLock l(&log_mutex);\n  LogDestination::email_logging_severity_ = min_severity;\n  LogDestination::addresses_ = addresses;\n}\n\nstatic void WriteToStderr(const char* message, size_t len) {\n  // Avoid using cerr from this module since we may get called during\n  // exit code, and cerr may be partially or fully destroyed by then.\n  fwrite(message, len, 1, stderr);\n}\n\ninline void LogDestination::MaybeLogToStderr(LogSeverity severity,\n\t\t\t\t\t     const char* message, size_t len) {\n  if ((severity >= FLAGS_stderrthreshold) || FLAGS_alsologtostderr) {\n    WriteToStderr(message, len);\n#ifdef OS_WINDOWS\n    // On Windows, also output to the debugger\n    ::OutputDebugStringA(string(message,len).c_str());\n#endif\n  }\n}\n\n\ninline void LogDestination::MaybeLogToEmail(LogSeverity severity,\n\t\t\t\t\t    const char* message, size_t len) {\n  if (severity >= email_logging_severity_ ||\n      severity >= FLAGS_logemaillevel) {\n    string to(FLAGS_alsologtoemail);\n    if (!addresses_.empty()) {\n      if (!to.empty()) {\n        to += \",\";\n      }\n      to += addresses_;\n    }\n    const string subject(string(\"[LOG] \") + LogSeverityNames[severity] + \": \" +\n                         glog_internal_namespace_::ProgramInvocationShortName());\n    string body(hostname());\n    body += \"\\n\\n\";\n    body.append(message, len);\n\n    // should NOT use SendEmail().  The caller of this function holds the\n    // log_mutex and SendEmail() calls LOG/VLOG which will block trying to\n    // acquire the log_mutex object.  Use SendEmailInternal() and set\n    // use_logging to false.\n    SendEmailInternal(to.c_str(), subject.c_str(), body.c_str(), false);\n  }\n}\n\n\ninline void LogDestination::MaybeLogToLogfile(LogSeverity severity,\n                                              time_t timestamp,\n\t\t\t\t\t      const char* message,\n\t\t\t\t\t      size_t len) {\n  const bool should_flush = severity > FLAGS_logbuflevel;\n  LogDestination* destination = log_destination(severity);\n  destination->logger_->Write(should_flush, timestamp, message, len);\n}\n\ninline void LogDestination::LogToAllLogfiles(LogSeverity severity,\n                                             time_t timestamp,\n                                             const char* message,\n                                             size_t len) {\n\n  if ( FLAGS_logtostderr )            // global flag: never log to file\n    WriteToStderr(message, len);\n  else\n    for (int i = severity; i >= 0; --i)\n      LogDestination::MaybeLogToLogfile(i, timestamp, message, len);\n\n}\n\ninline void LogDestination::LogToSinks(LogSeverity severity,\n                                       const char *full_filename,\n                                       const char *base_filename,\n                                       int line,\n                                       const struct ::tm* tm_time,\n                                       const char* message,\n                                       size_t message_len) {\n  ReaderMutexLock l(&sink_mutex_);\n  if (sinks_) {\n    for (int i = sinks_->size() - 1; i >= 0; i--) {\n      (*sinks_)[i]->send(severity, full_filename, base_filename,\n                         line, tm_time, message, message_len);\n    }\n  }\n}\n\ninline void LogDestination::WaitForSinks(LogMessage::LogMessageData* data) {\n  ReaderMutexLock l(&sink_mutex_);\n  if (sinks_) {\n    for (int i = sinks_->size() - 1; i >= 0; i--) {\n      (*sinks_)[i]->WaitTillSent();\n    }\n  }\n  const bool send_to_sink =\n      (data->send_method_ == &LogMessage::SendToSink) ||\n      (data->send_method_ == &LogMessage::SendToSinkAndLog);\n  if (send_to_sink && data->sink_ != NULL) {\n    data->sink_->WaitTillSent();\n  }\n}\n\nLogDestination* LogDestination::log_destinations_[NUM_SEVERITIES];\n\ninline LogDestination* LogDestination::log_destination(LogSeverity severity) {\n  assert(severity >=0 && severity < NUM_SEVERITIES);\n  if (!log_destinations_[severity]) {\n    log_destinations_[severity] = new LogDestination(severity, NULL);\n  }\n  return log_destinations_[severity];\n}\n\nvoid LogDestination::DeleteLogDestinations() {\n  for (int severity = 0; severity < NUM_SEVERITIES; ++severity) {\n    delete log_destinations_[severity];\n    log_destinations_[severity] = NULL;\n  }\n}\n\nnamespace {\n\nLogFileObject::LogFileObject(LogSeverity severity,\n                             const char* base_filename)\n  : base_filename_selected_(base_filename != NULL),\n    base_filename_((base_filename != NULL) ? base_filename : \"\"),\n    symlink_basename_(glog_internal_namespace_::ProgramInvocationShortName()),\n    filename_extension_(),\n    file_(NULL),\n    severity_(severity),\n    bytes_since_flush_(0),\n    file_length_(0),\n    rollover_attempt_(kRolloverAttemptFrequency-1),\n    next_flush_time_(0) {\n  assert(severity >= 0);\n  assert(severity < NUM_SEVERITIES);\n}\n\nLogFileObject::~LogFileObject() {\n  MutexLock l(&lock_);\n  if (file_ != NULL) {\n    fclose(file_);\n    file_ = NULL;\n  }\n}\n\nvoid LogFileObject::SetBasename(const char* basename) {\n  MutexLock l(&lock_);\n  base_filename_selected_ = true;\n  if (base_filename_ != basename) {\n    // Get rid of old log file since we are changing names\n    if (file_ != NULL) {\n      fclose(file_);\n      file_ = NULL;\n      rollover_attempt_ = kRolloverAttemptFrequency-1;\n    }\n    base_filename_ = basename;\n  }\n}\n\nvoid LogFileObject::SetExtension(const char* ext) {\n  MutexLock l(&lock_);\n  if (filename_extension_ != ext) {\n    // Get rid of old log file since we are changing names\n    if (file_ != NULL) {\n      fclose(file_);\n      file_ = NULL;\n      rollover_attempt_ = kRolloverAttemptFrequency-1;\n    }\n    filename_extension_ = ext;\n  }\n}\n\nvoid LogFileObject::SetSymlinkBasename(const char* symlink_basename) {\n  MutexLock l(&lock_);\n  symlink_basename_ = symlink_basename;\n}\n\nvoid LogFileObject::Flush() {\n  MutexLock l(&lock_);\n  FlushUnlocked();\n}\n\nvoid LogFileObject::FlushUnlocked(){\n  if (file_ != NULL) {\n    fflush(file_);\n    bytes_since_flush_ = 0;\n  }\n  // Figure out when we are due for another flush.\n  const int64 next = (FLAGS_logbufsecs\n                      * static_cast<int64>(1000000));  // in usec\n  next_flush_time_ = CycleClock_Now() + UsecToCycles(next);\n}\n\nbool LogFileObject::CreateLogfile(const char* time_pid_string) {\n  string string_filename = base_filename_+filename_extension_+\n                           time_pid_string;\n  const char* filename = string_filename.c_str();\n  int fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0664);\n  if (fd == -1) return false;\n#ifdef HAVE_FCNTL\n  // Mark the file close-on-exec. We don't really care if this fails\n  fcntl(fd, F_SETFD, FD_CLOEXEC);\n#endif\n\n  file_ = fdopen(fd, \"a\");  // Make a FILE*.\n  if (file_ == NULL) {  // Man, we're screwed!\n    close(fd);\n    unlink(filename);  // Erase the half-baked evidence: an unusable log file\n    return false;\n  }\n\n  // We try to create a symlink called <program_name>.<severity>,\n  // which is easier to use.  (Every time we create a new logfile,\n  // we destroy the old symlink and create a new one, so it always\n  // points to the latest logfile.)  If it fails, we're sad but it's\n  // no error.\n  if (!symlink_basename_.empty()) {\n    // take directory from filename\n    const char* slash = strrchr(filename, PATH_SEPARATOR);\n    const string linkname =\n      symlink_basename_ + '.' + LogSeverityNames[severity_];\n    string linkpath;\n    if ( slash ) linkpath = string(filename, slash-filename+1);  // get dirname\n    linkpath += linkname;\n    unlink(linkpath.c_str());                    // delete old one if it exists\n\n    // We must have unistd.h.\n#ifdef HAVE_UNISTD_H\n    // Make the symlink be relative (in the same dir) so that if the\n    // entire log directory gets relocated the link is still valid.\n    const char *linkdest = slash ? (slash + 1) : filename;\n    if (symlink(linkdest, linkpath.c_str()) != 0) {\n      // silently ignore failures\n    }\n\n    // Make an additional link to the log file in a place specified by\n    // FLAGS_log_link, if indicated\n    if (!FLAGS_log_link.empty()) {\n      linkpath = FLAGS_log_link + \"/\" + linkname;\n      unlink(linkpath.c_str());                  // delete old one if it exists\n      if (symlink(filename, linkpath.c_str()) != 0) {\n        // silently ignore failures\n      }\n    }\n#endif\n  }\n\n  return true;  // Everything worked\n}\n\nvoid LogFileObject::Write(bool force_flush,\n                          time_t timestamp,\n                          const char* message,\n                          int message_len) {\n  MutexLock l(&lock_);\n\n  // We don't log if the base_name_ is \"\" (which means \"don't write\")\n  if (base_filename_selected_ && base_filename_.empty()) {\n    return;\n  }\n\n  if (static_cast<int>(file_length_ >> 20) >= MaxLogSize() ||\n      PidHasChanged()) {\n    if (file_ != NULL) fclose(file_);\n    file_ = NULL;\n    file_length_ = bytes_since_flush_ = 0;\n    rollover_attempt_ = kRolloverAttemptFrequency-1;\n  }\n\n  // If there's no destination file, make one before outputting\n  if (file_ == NULL) {\n    // Try to rollover the log file every 32 log messages.  The only time\n    // this could matter would be when we have trouble creating the log\n    // file.  If that happens, we'll lose lots of log messages, of course!\n    if (++rollover_attempt_ != kRolloverAttemptFrequency) return;\n    rollover_attempt_ = 0;\n\n    struct ::tm tm_time;\n    localtime_r(&timestamp, &tm_time);\n\n    // The logfile's filename will have the date/time & pid in it\n    char time_pid_string[256];  // More than enough chars for time, pid, \\0\n    ostrstream time_pid_stream(time_pid_string, sizeof(time_pid_string));\n    time_pid_stream.fill('0');\n    time_pid_stream << 1900+tm_time.tm_year\n\t\t    << setw(2) << 1+tm_time.tm_mon\n\t\t    << setw(2) << tm_time.tm_mday\n\t\t    << '-'\n\t\t    << setw(2) << tm_time.tm_hour\n\t\t    << setw(2) << tm_time.tm_min\n\t\t    << setw(2) << tm_time.tm_sec\n\t\t    << '.'\n\t\t    << GetMainThreadPid()\n\t\t    << '\\0';\n\n    if (base_filename_selected_) {\n      if (!CreateLogfile(time_pid_string)) {\n        perror(\"Could not create log file\");\n        fprintf(stderr, \"COULD NOT CREATE LOGFILE '%s'!\\n\", time_pid_string);\n        return;\n      }\n    } else {\n      // If no base filename for logs of this severity has been set, use a\n      // default base filename of\n      // \"<program name>.<hostname>.<user name>.log.<severity level>.\".  So\n      // logfiles will have names like\n      // webserver.examplehost.root.log.INFO.19990817-150000.4354, where\n      // 19990817 is a date (1999 August 17), 150000 is a time (15:00:00),\n      // and 4354 is the pid of the logging process.  The date & time reflect\n      // when the file was created for output.\n      //\n      // Where does the file get put?  Successively try the directories\n      // \"/tmp\", and \".\"\n      string stripped_filename(\n          glog_internal_namespace_::ProgramInvocationShortName());\n      string hostname;\n      GetHostName(&hostname);\n\n      string uidname = MyUserName();\n      // We should not call CHECK() here because this function can be\n      // called after holding on to log_mutex. We don't want to\n      // attempt to hold on to the same mutex, and get into a\n      // deadlock. Simply use a name like invalid-user.\n      if (uidname.empty()) uidname = \"invalid-user\";\n\n      stripped_filename = stripped_filename+'.'+hostname+'.'\n                          +uidname+\".log.\"\n                          +LogSeverityNames[severity_]+'.';\n      // We're going to (potentially) try to put logs in several different dirs\n      const vector<string> & log_dirs = GetLoggingDirectories();\n\n      // Go through the list of dirs, and try to create the log file in each\n      // until we succeed or run out of options\n      bool success = false;\n      for (vector<string>::const_iterator dir = log_dirs.begin();\n           dir != log_dirs.end();\n           ++dir) {\n        base_filename_ = *dir + \"/\" + stripped_filename;\n        if ( CreateLogfile(time_pid_string) ) {\n          success = true;\n          break;\n        }\n      }\n      // If we never succeeded, we have to give up\n      if ( success == false ) {\n        perror(\"Could not create logging file\");\n        fprintf(stderr, \"COULD NOT CREATE A LOGGINGFILE %s!\", time_pid_string);\n        return;\n      }\n    }\n\n    // Write a header message into the log file\n    char file_header_string[512];  // Enough chars for time and binary info\n    ostrstream file_header_stream(file_header_string,\n                                  sizeof(file_header_string));\n    file_header_stream.fill('0');\n    file_header_stream << \"Log file created at: \"\n                       << 1900+tm_time.tm_year << '/'\n                       << setw(2) << 1+tm_time.tm_mon << '/'\n                       << setw(2) << tm_time.tm_mday\n                       << ' '\n                       << setw(2) << tm_time.tm_hour << ':'\n                       << setw(2) << tm_time.tm_min << ':'\n                       << setw(2) << tm_time.tm_sec << '\\n'\n                       << \"Running on machine: \"\n                       << LogDestination::hostname() << '\\n'\n                       << \"Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu \"\n                       << \"threadid file:line] msg\" << '\\n'\n                       << '\\0';\n    int header_len = strlen(file_header_string);\n    fwrite(file_header_string, 1, header_len, file_);\n    file_length_ += header_len;\n    bytes_since_flush_ += header_len;\n  }\n\n  // Write to LOG file\n  if ( !stop_writing ) {\n    // fwrite() doesn't return an error when the disk is full, for\n    // messages that are less than 4096 bytes. When the disk is full,\n    // it returns the message length for messages that are less than\n    // 4096 bytes. fwrite() returns 4096 for message lengths that are\n    // greater than 4096, thereby indicating an error.\n    errno = 0;\n    fwrite(message, 1, message_len, file_);\n    if ( FLAGS_stop_logging_if_full_disk &&\n         errno == ENOSPC ) {  // disk full, stop writing to disk\n      stop_writing = true;  // until the disk is\n      return;\n    } else {\n      file_length_ += message_len;\n      bytes_since_flush_ += message_len;\n    }\n  } else {\n    if ( CycleClock_Now() >= next_flush_time_ )\n      stop_writing = false;  // check to see if disk has free space.\n    return;  // no need to flush\n  }\n\n  // See important msgs *now*.  Also, flush logs at least every 10^6 chars,\n  // or every \"FLAGS_logbufsecs\" seconds.\n  if ( force_flush ||\n       (bytes_since_flush_ >= 1000000) ||\n       (CycleClock_Now() >= next_flush_time_) ) {\n    FlushUnlocked();\n#ifdef OS_LINUX\n    if (FLAGS_drop_log_memory) {\n      if (file_length_ >= logging::kPageSize) {\n        // don't evict the most recent page\n        uint32 len = file_length_ & ~(logging::kPageSize - 1);\n        posix_fadvise(fileno(file_), 0, len, POSIX_FADV_DONTNEED);\n      }\n    }\n#endif\n  }\n}\n\n}  // namespace\n\n// An arbitrary limit on the length of a single log message.  This\n// is so that streaming can be done more efficiently.\nconst size_t LogMessage::kMaxLogMessageLen = 30000;\n\n// Static log data space to avoid alloc failures in a LOG(FATAL)\n//\n// Since multiple threads may call LOG(FATAL), and we want to preserve\n// the data from the first call, we allocate two sets of space.  One\n// for exclusive use by the first thread, and one for shared use by\n// all other threads.\nstatic Mutex fatal_msg_lock;\nstatic CrashReason crash_reason;\nstatic bool fatal_msg_exclusive = true;\nstatic char fatal_msg_buf_exclusive[LogMessage::kMaxLogMessageLen+1];\nstatic char fatal_msg_buf_shared[LogMessage::kMaxLogMessageLen+1];\nstatic LogMessage::LogStream fatal_msg_stream_exclusive(\n    fatal_msg_buf_exclusive, LogMessage::kMaxLogMessageLen, 0);\nstatic LogMessage::LogStream fatal_msg_stream_shared(\n    fatal_msg_buf_shared, LogMessage::kMaxLogMessageLen, 0);\nLogMessage::LogMessageData LogMessage::fatal_msg_data_exclusive_;\nLogMessage::LogMessageData LogMessage::fatal_msg_data_shared_;\n\nLogMessage::LogMessageData::~LogMessageData() {\n  delete[] buf_;\n  delete stream_alloc_;\n}\n\nLogMessage::LogMessage(const char* file, int line, LogSeverity severity,\n\t\t       int ctr, void (LogMessage::*send_method)()) {\n  Init(file, line, severity, send_method);\n  data_->stream_->set_ctr(ctr);\n}\n\nLogMessage::LogMessage(const char* file, int line,\n                       const CheckOpString& result) {\n  Init(file, line, FATAL, &LogMessage::SendToLog);\n  stream() << \"Check failed: \" << (*result.str_) << \" \";\n}\n\nLogMessage::LogMessage(const char* file, int line) {\n  Init(file, line, INFO, &LogMessage::SendToLog);\n}\n\nLogMessage::LogMessage(const char* file, int line, LogSeverity severity) {\n  Init(file, line, severity, &LogMessage::SendToLog);\n}\n\nLogMessage::LogMessage(const char* file, int line, LogSeverity severity,\n                       LogSink* sink, bool also_send_to_log) {\n  Init(file, line, severity, also_send_to_log ? &LogMessage::SendToSinkAndLog :\n                                                &LogMessage::SendToSink);\n  data_->sink_ = sink;  // override Init()'s setting to NULL\n}\n\nLogMessage::LogMessage(const char* file, int line, LogSeverity severity,\n                       vector<string> *outvec) {\n  Init(file, line, severity, &LogMessage::SaveOrSendToLog);\n  data_->outvec_ = outvec; // override Init()'s setting to NULL\n}\n\nLogMessage::LogMessage(const char* file, int line, LogSeverity severity,\n                       string *message) {\n  Init(file, line, severity, &LogMessage::WriteToStringAndLog);\n  data_->message_ = message;  // override Init()'s setting to NULL\n}\n\nvoid LogMessage::Init(const char* file,\n                      int line,\n                      LogSeverity severity,\n                      void (LogMessage::*send_method)()) {\n  allocated_ = NULL;\n  if (severity != FATAL || !exit_on_dfatal) {\n    allocated_ = new LogMessageData();\n    data_ = allocated_;\n    data_->buf_ = new char[kMaxLogMessageLen+1];\n    data_->message_text_ = data_->buf_;\n    data_->stream_alloc_ =\n        new LogStream(data_->message_text_, kMaxLogMessageLen, 0);\n    data_->stream_ = data_->stream_alloc_;\n    data_->first_fatal_ = false;\n  } else {\n    MutexLock l(&fatal_msg_lock);\n    if (fatal_msg_exclusive) {\n      fatal_msg_exclusive = false;\n      data_ = &fatal_msg_data_exclusive_;\n      data_->message_text_ = fatal_msg_buf_exclusive;\n      data_->stream_ = &fatal_msg_stream_exclusive;\n      data_->first_fatal_ = true;\n    } else {\n      data_ = &fatal_msg_data_shared_;\n      data_->message_text_ = fatal_msg_buf_shared;\n      data_->stream_ = &fatal_msg_stream_shared;\n      data_->first_fatal_ = false;\n    }\n    data_->stream_alloc_ = NULL;\n  }\n\n  stream().fill('0');\n  data_->preserved_errno_ = errno;\n  data_->severity_ = severity;\n  data_->line_ = line;\n  data_->send_method_ = send_method;\n  data_->sink_ = NULL;\n  data_->outvec_ = NULL;\n  WallTime now = WallTime_Now();\n  data_->timestamp_ = static_cast<time_t>(now);\n  localtime_r(&data_->timestamp_, &data_->tm_time_);\n  int usecs = static_cast<int>((now - data_->timestamp_) * 1000000);\n  RawLog__SetLastTime(data_->tm_time_, usecs);\n\n  data_->num_chars_to_log_ = 0;\n  data_->num_chars_to_syslog_ = 0;\n  data_->basename_ = const_basename(file);\n  data_->fullname_ = file;\n  data_->has_been_flushed_ = false;\n\n  // If specified, prepend a prefix to each line.  For example:\n  //    I1018 160715 f5d4fbb0 logging.cc:1153]\n  //    (log level, GMT month, date, time, thread_id, file basename, line)\n  // We exclude the thread_id for the default thread.\n  if (FLAGS_log_prefix && (line != kNoLogPrefix)) {\n    stream() << LogSeverityNames[severity][0]\n             << setw(2) << 1+data_->tm_time_.tm_mon\n             << setw(2) << data_->tm_time_.tm_mday\n             << ' '\n             << setw(2) << data_->tm_time_.tm_hour  << ':'\n             << setw(2) << data_->tm_time_.tm_min   << ':'\n             << setw(2) << data_->tm_time_.tm_sec   << \".\"\n             << setw(6) << usecs\n             << ' '\n             << setfill(' ') << setw(5)\n             << static_cast<unsigned int>(GetTID()) << setfill('0')\n             << ' '\n             << data_->basename_ << ':' << data_->line_ << \"] \";\n  }\n  data_->num_prefix_chars_ = data_->stream_->pcount();\n\n  if (!FLAGS_log_backtrace_at.empty()) {\n    char fileline[128];\n    snprintf(fileline, sizeof(fileline), \"%s:%d\", data_->basename_, line);\n#ifdef HAVE_STACKTRACE\n    if (!strcmp(FLAGS_log_backtrace_at.c_str(), fileline)) {\n      string stacktrace;\n      DumpStackTraceToString(&stacktrace);\n      stream() << \" (stacktrace:\\n\" << stacktrace << \") \";\n    }\n#endif\n  }\n}\n\nLogMessage::~LogMessage() {\n  Flush();\n  delete allocated_;\n}\n\n// Flush buffered message, called by the destructor, or any other function\n// that needs to synchronize the log.\nvoid LogMessage::Flush() {\n  if (data_->has_been_flushed_ || data_->severity_ < FLAGS_minloglevel)\n    return;\n\n  data_->num_chars_to_log_ = data_->stream_->pcount();\n  data_->num_chars_to_syslog_ =\n    data_->num_chars_to_log_ - data_->num_prefix_chars_;\n\n  // Do we need to add a \\n to the end of this message?\n  bool append_newline =\n      (data_->message_text_[data_->num_chars_to_log_-1] != '\\n');\n  char original_final_char = '\\0';\n\n  // If we do need to add a \\n, we'll do it by violating the memory of the\n  // ostrstream buffer.  This is quick, and we'll make sure to undo our\n  // modification before anything else is done with the ostrstream.  It\n  // would be preferable not to do things this way, but it seems to be\n  // the best way to deal with this.\n  if (append_newline) {\n    original_final_char = data_->message_text_[data_->num_chars_to_log_];\n    data_->message_text_[data_->num_chars_to_log_++] = '\\n';\n  }\n\n  // Prevent any subtle race conditions by wrapping a mutex lock around\n  // the actual logging action per se.\n  {\n    MutexLock l(&log_mutex);\n    (this->*(data_->send_method_))();\n    ++num_messages_[static_cast<int>(data_->severity_)];\n  }\n  LogDestination::WaitForSinks(data_);\n\n  if (append_newline) {\n    // Fix the ostrstream back how it was before we screwed with it.\n    // It's 99.44% certain that we don't need to worry about doing this.\n    data_->message_text_[data_->num_chars_to_log_-1] = original_final_char;\n  }\n\n  // If errno was already set before we enter the logging call, we'll\n  // set it back to that value when we return from the logging call.\n  // It happens often that we log an error message after a syscall\n  // failure, which can potentially set the errno to some other\n  // values.  We would like to preserve the original errno.\n  if (data_->preserved_errno_ != 0) {\n    errno = data_->preserved_errno_;\n  }\n\n  // Note that this message is now safely logged.  If we're asked to flush\n  // again, as a result of destruction, say, we'll do nothing on future calls.\n  data_->has_been_flushed_ = true;\n}\n\n// Copy of first FATAL log message so that we can print it out again\n// after all the stack traces.  To preserve legacy behavior, we don't\n// use fatal_msg_buf_exclusive.\nstatic time_t fatal_time;\nstatic char fatal_message[256];\n\nvoid ReprintFatalMessage() {\n  if (fatal_message[0]) {\n    const int n = strlen(fatal_message);\n    if (!FLAGS_logtostderr) {\n      // Also write to stderr\n      WriteToStderr(fatal_message, n);\n    }\n    LogDestination::LogToAllLogfiles(ERROR, fatal_time, fatal_message, n);\n  }\n}\n\n// L >= log_mutex (callers must hold the log_mutex).\nvoid LogMessage::SendToLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {\n  static bool already_warned_before_initgoogle = false;\n\n  log_mutex.AssertHeld();\n\n  RAW_DCHECK(data_->num_chars_to_log_ > 0 &&\n             data_->message_text_[data_->num_chars_to_log_-1] == '\\n', \"\");\n\n  // Messages of a given severity get logged to lower severity logs, too\n\n  if (!already_warned_before_initgoogle && !IsGoogleLoggingInitialized()) {\n    const char w[] = \"WARNING: Logging before InitGoogleLogging() is \"\n                     \"written to STDERR\\n\";\n    WriteToStderr(w, strlen(w));\n    already_warned_before_initgoogle = true;\n  }\n\n  // global flag: never log to file if set.  Also -- don't log to a\n  // file if we haven't parsed the command line flags to get the\n  // program name.\n  if (FLAGS_logtostderr || !IsGoogleLoggingInitialized()) {\n    WriteToStderr(data_->message_text_, data_->num_chars_to_log_);\n\n    // this could be protected by a flag if necessary.\n    LogDestination::LogToSinks(data_->severity_,\n                               data_->fullname_, data_->basename_,\n                               data_->line_, &data_->tm_time_,\n                               data_->message_text_ + data_->num_prefix_chars_,\n                               (data_->num_chars_to_log_ -\n                                data_->num_prefix_chars_ - 1));\n  } else {\n\n    // log this message to all log files of severity <= severity_\n    LogDestination::LogToAllLogfiles(data_->severity_, data_->timestamp_,\n                                     data_->message_text_,\n                                     data_->num_chars_to_log_);\n\n    LogDestination::MaybeLogToStderr(data_->severity_, data_->message_text_,\n                                     data_->num_chars_to_log_);\n    LogDestination::MaybeLogToEmail(data_->severity_, data_->message_text_,\n                                    data_->num_chars_to_log_);\n    LogDestination::LogToSinks(data_->severity_,\n                               data_->fullname_, data_->basename_,\n                               data_->line_, &data_->tm_time_,\n                               data_->message_text_ + data_->num_prefix_chars_,\n                               (data_->num_chars_to_log_\n                                - data_->num_prefix_chars_ - 1));\n    // NOTE: -1 removes trailing \\n\n  }\n\n  // If we log a FATAL message, flush all the log destinations, then toss\n  // a signal for others to catch. We leave the logs in a state that\n  // someone else can use them (as long as they flush afterwards)\n  if (data_->severity_ == FATAL && exit_on_dfatal) {\n    if (data_->first_fatal_) {\n      // Store crash information so that it is accessible from within signal\n      // handlers that may be invoked later.\n      RecordCrashReason(&crash_reason);\n      SetCrashReason(&crash_reason);\n\n      // Store shortened fatal message for other logs and GWQ status\n      const int copy = min<int>(data_->num_chars_to_log_,\n                                sizeof(fatal_message)-1);\n      memcpy(fatal_message, data_->message_text_, copy);\n      fatal_message[copy] = '\\0';\n      fatal_time = data_->timestamp_;\n    }\n\n    if (!FLAGS_logtostderr) {\n      for (int i = 0; i < NUM_SEVERITIES; ++i) {\n        if ( LogDestination::log_destinations_[i] )\n          LogDestination::log_destinations_[i]->logger_->Write(true, 0, \"\", 0);\n      }\n    }\n\n    // release the lock that our caller (directly or indirectly)\n    // LogMessage::~LogMessage() grabbed so that signal handlers\n    // can use the logging facility. Alternately, we could add\n    // an entire unsafe logging interface to bypass locking\n    // for signal handlers but this seems simpler.\n    log_mutex.Unlock();\n    LogDestination::WaitForSinks(data_);\n\n    const char* message = \"*** Check failure stack trace: ***\\n\";\n    if (write(STDERR_FILENO, message, strlen(message)) < 0) {\n      // Ignore errors.\n    }\n    Fail();\n  }\n}\n\nvoid LogMessage::RecordCrashReason(\n    glog_internal_namespace_::CrashReason* reason) {\n  reason->filename = fatal_msg_data_exclusive_.fullname_;\n  reason->line_number = fatal_msg_data_exclusive_.line_;\n  reason->message = fatal_msg_buf_exclusive +\n                    fatal_msg_data_exclusive_.num_prefix_chars_;\n#ifdef HAVE_STACKTRACE\n  // Retrieve the stack trace, omitting the logging frames that got us here.\n  reason->depth = GetStackTrace(reason->stack, ARRAYSIZE(reason->stack), 4);\n#else\n  reason->depth = 0;\n#endif\n}\n\nstatic void logging_fail() {\n#if defined(_DEBUG) && defined(_MSC_VER)\n  // When debugging on windows, avoid the obnoxious dialog and make\n  // it possible to continue past a LOG(FATAL) in the debugger\n  _asm int 3\n#else\n  abort();\n#endif\n}\n\n#ifdef HAVE___ATTRIBUTE__\nGOOGLE_GLOG_DLL_DECL\nvoid (*g_logging_fail_func)() __attribute__((noreturn)) = &logging_fail;\n#else\nGOOGLE_GLOG_DLL_DECL void (*g_logging_fail_func)() = &logging_fail;\n#endif\n\nvoid InstallFailureFunction(void (*fail_func)()) {\n  g_logging_fail_func = fail_func;\n}\n\nvoid LogMessage::Fail() {\n  g_logging_fail_func();\n}\n\n// L >= log_mutex (callers must hold the log_mutex).\nvoid LogMessage::SendToSink() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {\n  if (data_->sink_ != NULL) {\n    RAW_DCHECK(data_->num_chars_to_log_ > 0 &&\n               data_->message_text_[data_->num_chars_to_log_-1] == '\\n', \"\");\n    data_->sink_->send(data_->severity_, data_->fullname_, data_->basename_,\n                       data_->line_, &data_->tm_time_,\n                       data_->message_text_ + data_->num_prefix_chars_,\n                       (data_->num_chars_to_log_ -\n                        data_->num_prefix_chars_ - 1));\n  }\n}\n\n// L >= log_mutex (callers must hold the log_mutex).\nvoid LogMessage::SendToSinkAndLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {\n  SendToSink();\n  SendToLog();\n}\n\n// L >= log_mutex (callers must hold the log_mutex).\nvoid LogMessage::SaveOrSendToLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {\n  if (data_->outvec_ != NULL) {\n    RAW_DCHECK(data_->num_chars_to_log_ > 0 &&\n               data_->message_text_[data_->num_chars_to_log_-1] == '\\n', \"\");\n    // Omit prefix of message and trailing newline when recording in outvec_.\n    const char *start = data_->message_text_ + data_->num_prefix_chars_;\n    int len = data_->num_chars_to_log_ - data_->num_prefix_chars_ - 1;\n    data_->outvec_->push_back(string(start, len));\n  } else {\n    SendToLog();\n  }\n}\n\nvoid LogMessage::WriteToStringAndLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {\n  if (data_->message_ != NULL) {\n    RAW_DCHECK(data_->num_chars_to_log_ > 0 &&\n               data_->message_text_[data_->num_chars_to_log_-1] == '\\n', \"\");\n    // Omit prefix of message and trailing newline when writing to message_.\n    const char *start = data_->message_text_ + data_->num_prefix_chars_;\n    int len = data_->num_chars_to_log_ - data_->num_prefix_chars_ - 1;\n    data_->message_->assign(start, len);\n  }\n  SendToLog();\n}\n\n// L >= log_mutex (callers must hold the log_mutex).\nvoid LogMessage::SendToSyslogAndLog() {\n#ifdef HAVE_SYSLOG_H\n  // Before any calls to syslog(), make a single call to openlog()\n  static bool openlog_already_called = false;\n  if (!openlog_already_called) {\n    openlog(glog_internal_namespace_::ProgramInvocationShortName(),\n            LOG_CONS | LOG_NDELAY | LOG_PID,\n            LOG_USER);\n    openlog_already_called = true;\n  }\n\n  // This array maps Google severity levels to syslog levels\n  const int SEVERITY_TO_LEVEL[] = { LOG_INFO, LOG_WARNING, LOG_ERR, LOG_EMERG };\n  syslog(LOG_USER | SEVERITY_TO_LEVEL[static_cast<int>(data_->severity_)], \"%.*s\",\n         int(data_->num_chars_to_syslog_),\n         data_->message_text_ + data_->num_prefix_chars_);\n  SendToLog();\n#else\n  LOG(ERROR) << \"No syslog support: message=\" << data_->message_text_;\n#endif\n}\n\nbase::Logger* base::GetLogger(LogSeverity severity) {\n  MutexLock l(&log_mutex);\n  return LogDestination::log_destination(severity)->logger_;\n}\n\nvoid base::SetLogger(LogSeverity severity, base::Logger* logger) {\n  MutexLock l(&log_mutex);\n  LogDestination::log_destination(severity)->logger_ = logger;\n}\n\n// L < log_mutex.  Acquires and releases mutex_.\nint64 LogMessage::num_messages(int severity) {\n  MutexLock l(&log_mutex);\n  return num_messages_[severity];\n}\n\n// Output the COUNTER value. This is only valid if ostream is a\n// LogStream.\nostream& operator<<(ostream &os, const PRIVATE_Counter&) {\n  LogMessage::LogStream *log = dynamic_cast<LogMessage::LogStream*>(&os);\n  CHECK(log == log->self());\n  os << log->ctr();\n  return os;\n}\n\nErrnoLogMessage::ErrnoLogMessage(const char* file, int line,\n                                 LogSeverity severity, int ctr,\n                                 void (LogMessage::*send_method)())\n    : LogMessage(file, line, severity, ctr, send_method) {\n}\n\nErrnoLogMessage::~ErrnoLogMessage() {\n  // Don't access errno directly because it may have been altered\n  // while streaming the message.\n  char buf[100];\n  posix_strerror_r(preserved_errno(), buf, sizeof(buf));\n  stream() << \": \" << buf << \" [\" << preserved_errno() << \"]\";\n}\n\nvoid FlushLogFiles(LogSeverity min_severity) {\n  LogDestination::FlushLogFiles(min_severity);\n}\n\nvoid FlushLogFilesUnsafe(LogSeverity min_severity) {\n  LogDestination::FlushLogFilesUnsafe(min_severity);\n}\n\nvoid SetLogDestination(LogSeverity severity, const char* base_filename) {\n  LogDestination::SetLogDestination(severity, base_filename);\n}\n\nvoid SetLogSymlink(LogSeverity severity, const char* symlink_basename) {\n  LogDestination::SetLogSymlink(severity, symlink_basename);\n}\n\nLogSink::~LogSink() {\n}\n\nvoid LogSink::WaitTillSent() {\n  // noop default\n}\n\nstring LogSink::ToString(LogSeverity severity, const char* file, int line,\n                         const struct ::tm* tm_time,\n                         const char* message, size_t message_len) {\n  ostringstream stream(string(message, message_len));\n  stream.fill('0');\n\n  // FIXME(jrvb): Updating this to use the correct value for usecs\n  // requires changing the signature for both this method and\n  // LogSink::send().  This change needs to be done in a separate CL\n  // so subclasses of LogSink can be updated at the same time.\n  int usecs = 0;\n\n  stream << LogSeverityNames[severity][0]\n         << setw(2) << 1+tm_time->tm_mon\n         << setw(2) << tm_time->tm_mday\n         << ' '\n         << setw(2) << tm_time->tm_hour << ':'\n         << setw(2) << tm_time->tm_min << ':'\n         << setw(2) << tm_time->tm_sec << '.'\n         << setw(6) << usecs\n         << ' '\n         << setfill(' ') << setw(5) << GetTID() << setfill('0')\n         << ' '\n         << file << ':' << line << \"] \";\n\n  stream << string(message, message_len);\n  return stream.str();\n}\n\nvoid AddLogSink(LogSink *destination) {\n  LogDestination::AddLogSink(destination);\n}\n\nvoid RemoveLogSink(LogSink *destination) {\n  LogDestination::RemoveLogSink(destination);\n}\n\nvoid SetLogFilenameExtension(const char* ext) {\n  LogDestination::SetLogFilenameExtension(ext);\n}\n\nvoid SetStderrLogging(LogSeverity min_severity) {\n  LogDestination::SetStderrLogging(min_severity);\n}\n\nvoid SetEmailLogging(LogSeverity min_severity, const char* addresses) {\n  LogDestination::SetEmailLogging(min_severity, addresses);\n}\n\nvoid LogToStderr() {\n  LogDestination::LogToStderr();\n}\n\nnamespace base {\nnamespace internal {\n\nbool GetExitOnDFatal() {\n  MutexLock l(&log_mutex);\n  return exit_on_dfatal;\n}\n\n// Determines whether we exit the program for a LOG(DFATAL) message in\n// debug mode.  It does this by skipping the call to Fail/FailQuietly.\n// This is intended for testing only.\n//\n// This can have some effects on LOG(FATAL) as well.  Failure messages\n// are always allocated (rather than sharing a buffer), the crash\n// reason is not recorded, the \"gwq\" status message is not updated,\n// and the stack trace is not recorded.  The LOG(FATAL) *will* still\n// exit the program.  Since this function is used only in testing,\n// these differences are acceptable.\nvoid SetExitOnDFatal(bool value) {\n  MutexLock l(&log_mutex);\n  exit_on_dfatal = value;\n}\n\n}  // namespace internal\n}  // namespace base\n\n// use_logging controls whether the logging functions LOG/VLOG are used\n// to log errors.  It should be set to false when the caller holds the\n// log_mutex.\nstatic bool SendEmailInternal(const char*dest, const char *subject,\n                              const char*body, bool use_logging) {\n  if (dest && *dest) {\n    if ( use_logging ) {\n      VLOG(1) << \"Trying to send TITLE:\" << subject\n              << \" BODY:\" << body << \" to \" << dest;\n    } else {\n      fprintf(stderr, \"Trying to send TITLE: %s BODY: %s to %s\\n\",\n              subject, body, dest);\n    }\n\n    string cmd =\n        FLAGS_logmailer + \" -s\\\"\" + subject + \"\\\" \" + dest;\n    FILE* pipe = popen(cmd.c_str(), \"w\");\n    if (pipe != NULL) {\n      // Add the body if we have one\n      if (body)\n        fwrite(body, sizeof(char), strlen(body), pipe);\n      bool ok = pclose(pipe) != -1;\n      if ( !ok ) {\n        if ( use_logging ) {\n          char buf[100];\n          posix_strerror_r(errno, buf, sizeof(buf));\n          LOG(ERROR) << \"Problems sending mail to \" << dest << \": \" << buf;\n        } else {\n          char buf[100];\n          posix_strerror_r(errno, buf, sizeof(buf));\n          fprintf(stderr, \"Problems sending mail to %s: %s\\n\", dest, buf);\n        }\n      }\n      return ok;\n    } else {\n      if ( use_logging ) {\n        LOG(ERROR) << \"Unable to send mail to \" << dest;\n      } else {\n        fprintf(stderr, \"Unable to send mail to %s\\n\", dest);\n      }\n    }\n  }\n  return false;\n}\n\nbool SendEmail(const char*dest, const char *subject, const char*body){\n  return SendEmailInternal(dest, subject, body, true);\n}\n\nstatic void GetTempDirectories(vector<string>* list) {\n  list->clear();\n#ifdef OS_WINDOWS\n  // On windows we'll try to find a directory in this order:\n  //   C:/Documents & Settings/whomever/TEMP (or whatever GetTempPath() is)\n  //   C:/TMP/\n  //   C:/TEMP/\n  //   C:/WINDOWS/ or C:/WINNT/\n  //   .\n  char tmp[MAX_PATH];\n  if (GetTempPathA(MAX_PATH, tmp))\n    list->push_back(tmp);\n  list->push_back(\"C:\\\\tmp\\\\\");\n  list->push_back(\"C:\\\\temp\\\\\");\n#else\n  // Directories, in order of preference. If we find a dir that\n  // exists, we stop adding other less-preferred dirs\n  const char * candidates[] = {\n    // Non-null only during unittest/regtest\n    getenv(\"TEST_TMPDIR\"),\n\n    // Explicitly-supplied temp dirs\n    getenv(\"TMPDIR\"), getenv(\"TMP\"),\n\n    // If all else fails\n    \"/tmp\",\n  };\n\n  for (int i = 0; i < ARRAYSIZE(candidates); i++) {\n    const char *d = candidates[i];\n    if (!d) continue;  // Empty env var\n\n    // Make sure we don't surprise anyone who's expecting a '/'\n    string dstr = d;\n    if (dstr[dstr.size() - 1] != '/') {\n      dstr += \"/\";\n    }\n    list->push_back(dstr);\n\n    struct stat statbuf;\n    if (!stat(d, &statbuf) && S_ISDIR(statbuf.st_mode)) {\n      // We found a dir that exists - we're done.\n      return;\n    }\n  }\n\n#endif\n}\n\nstatic vector<string>* logging_directories_list;\n\nconst vector<string>& GetLoggingDirectories() {\n  // Not strictly thread-safe but we're called early in InitGoogle().\n  if (logging_directories_list == NULL) {\n    logging_directories_list = new vector<string>;\n\n    if ( !FLAGS_log_dir.empty() ) {\n      // A dir was specified, we should use it\n      logging_directories_list->push_back(FLAGS_log_dir.c_str());\n    } else {\n      GetTempDirectories(logging_directories_list);\n#ifdef OS_WINDOWS\n      char tmp[MAX_PATH];\n      if (GetWindowsDirectoryA(tmp, MAX_PATH))\n        logging_directories_list->push_back(tmp);\n      logging_directories_list->push_back(\".\\\\\");\n#else\n      logging_directories_list->push_back(\"./\");\n#endif\n    }\n  }\n  return *logging_directories_list;\n}\n\nvoid TestOnly_ClearLoggingDirectoriesList() {\n  fprintf(stderr, \"TestOnly_ClearLoggingDirectoriesList should only be \"\n          \"called from test code.\\n\");\n  delete logging_directories_list;\n  logging_directories_list = NULL;\n}\n\nvoid GetExistingTempDirectories(vector<string>* list) {\n  GetTempDirectories(list);\n  vector<string>::iterator i_dir = list->begin();\n  while( i_dir != list->end() ) {\n    // zero arg to access means test for existence; no constant\n    // defined on windows\n    if ( access(i_dir->c_str(), 0) ) {\n      i_dir = list->erase(i_dir);\n    } else {\n      ++i_dir;\n    }\n  }\n}\n\nvoid TruncateLogFile(const char *path, int64 limit, int64 keep) {\n#ifdef HAVE_UNISTD_H\n  struct stat statbuf;\n  const int kCopyBlockSize = 8 << 10;\n  char copybuf[kCopyBlockSize];\n  int64 read_offset, write_offset;\n  // Don't follow symlinks unless they're our own fd symlinks in /proc\n  int flags = O_RDWR;\n  const char *procfd_prefix = \"/proc/self/fd/\";\n  if (strncmp(procfd_prefix, path, strlen(procfd_prefix))) flags |= O_NOFOLLOW;\n\n  int fd = open(path, flags);\n  if (fd == -1) {\n    if (errno == EFBIG) {\n      // The log file in question has got too big for us to open. The\n      // real fix for this would be to compile logging.cc (or probably\n      // all of base/...) with -D_FILE_OFFSET_BITS=64 but that's\n      // rather scary.\n      // Instead just truncate the file to something we can manage\n      if (truncate(path, 0) == -1) {\n\tPLOG(ERROR) << \"Unable to truncate \" << path;\n      } else {\n\tLOG(ERROR) << \"Truncated \" << path << \" due to EFBIG error\";\n      }\n    } else {\n      PLOG(ERROR) << \"Unable to open \" << path;\n    }\n    return;\n  }\n\n  if (fstat(fd, &statbuf) == -1) {\n    PLOG(ERROR) << \"Unable to fstat()\";\n    goto out_close_fd;\n  }\n\n  // See if the path refers to a regular file bigger than the\n  // specified limit\n  if (!S_ISREG(statbuf.st_mode)) goto out_close_fd;\n  if (statbuf.st_size <= limit)  goto out_close_fd;\n  if (statbuf.st_size <= keep) goto out_close_fd;\n\n  // This log file is too large - we need to truncate it\n  LOG(INFO) << \"Truncating \" << path << \" to \" << keep << \" bytes\";\n\n  // Copy the last \"keep\" bytes of the file to the beginning of the file\n  read_offset = statbuf.st_size - keep;\n  write_offset = 0;\n  int bytesin, bytesout;\n  while ((bytesin = pread(fd, copybuf, sizeof(copybuf), read_offset)) > 0) {\n    bytesout = pwrite(fd, copybuf, bytesin, write_offset);\n    if (bytesout == -1) {\n      PLOG(ERROR) << \"Unable to write to \" << path;\n      break;\n    } else if (bytesout != bytesin) {\n      LOG(ERROR) << \"Expected to write \" << bytesin << \", wrote \" << bytesout;\n    }\n    read_offset += bytesin;\n    write_offset += bytesout;\n  }\n  if (bytesin == -1) PLOG(ERROR) << \"Unable to read from \" << path;\n\n  // Truncate the remainder of the file. If someone else writes to the\n  // end of the file after our last read() above, we lose their latest\n  // data. Too bad ...\n  if (ftruncate(fd, write_offset) == -1) {\n    PLOG(ERROR) << \"Unable to truncate \" << path;\n  }\n\n out_close_fd:\n  close(fd);\n#else\n  LOG(ERROR) << \"No log truncation support.\";\n#endif\n}\n\nvoid TruncateStdoutStderr() {\n#ifdef HAVE_UNISTD_H\n  int64 limit = MaxLogSize() << 20;\n  int64 keep = 1 << 20;\n  TruncateLogFile(\"/proc/self/fd/1\", limit, keep);\n  TruncateLogFile(\"/proc/self/fd/2\", limit, keep);\n#else\n  LOG(ERROR) << \"No log truncation support.\";\n#endif\n}\n\n\n// Helper functions for string comparisons.\n#define DEFINE_CHECK_STROP_IMPL(name, func, expected)                   \\\n  string* Check##func##expected##Impl(const char* s1, const char* s2,   \\\n                                      const char* names) {              \\\n    bool equal = s1 == s2 || (s1 && s2 && !func(s1, s2));               \\\n    if (equal == expected) return NULL;                                 \\\n    else {                                                              \\\n      strstream ss;                                                     \\\n      if (!s1) s1 = \"\";                                                 \\\n      if (!s2) s2 = \"\";                                                 \\\n      ss << #name \" failed: \" << names << \" (\" << s1 << \" vs. \" << s2 << \")\"; \\\n      return new string(ss.str(), ss.pcount());                         \\\n    }                                                                   \\\n  }\nDEFINE_CHECK_STROP_IMPL(CHECK_STREQ, strcmp, true)\nDEFINE_CHECK_STROP_IMPL(CHECK_STRNE, strcmp, false)\nDEFINE_CHECK_STROP_IMPL(CHECK_STRCASEEQ, strcasecmp, true)\nDEFINE_CHECK_STROP_IMPL(CHECK_STRCASENE, strcasecmp, false)\n#undef DEFINE_CHECK_STROP_IMPL\n\nint posix_strerror_r(int err, char *buf, size_t len) {\n  // Sanity check input parameters\n  if (buf == NULL || len <= 0) {\n    errno = EINVAL;\n    return -1;\n  }\n\n  // Reset buf and errno, and try calling whatever version of strerror_r()\n  // is implemented by glibc\n  buf[0] = '\\000';\n  int old_errno = errno;\n  errno = 0;\n  char *rc = reinterpret_cast<char *>(strerror_r(err, buf, len));\n\n  // Both versions set errno on failure\n  if (errno) {\n    // Should already be there, but better safe than sorry\n    buf[0]     = '\\000';\n    return -1;\n  }\n  errno = old_errno;\n\n  // POSIX is vague about whether the string will be terminated, although\n  // is indirectly implies that typically ERANGE will be returned, instead\n  // of truncating the string. This is different from the GNU implementation.\n  // We play it safe by always terminating the string explicitly.\n  buf[len-1] = '\\000';\n\n  // If the function succeeded, we can use its exit code to determine the\n  // semantics implemented by glibc\n  if (!rc) {\n    return 0;\n  } else {\n    // GNU semantics detected\n    if (rc == buf) {\n      return 0;\n    } else {\n      buf[0] = '\\000';\n#if defined(OS_MACOSX) || defined(OS_FREEBSD) || defined(OS_OPENBSD)\n      if (reinterpret_cast<intptr_t>(rc) < sys_nerr) {\n        // This means an error on MacOSX or FreeBSD.\n        return -1;\n      }\n#endif\n      strncat(buf, rc, len-1);\n      return 0;\n    }\n  }\n}\n\nLogMessageFatal::LogMessageFatal(const char* file, int line) :\n    LogMessage(file, line, FATAL) {}\n\nLogMessageFatal::LogMessageFatal(const char* file, int line,\n                                 const CheckOpString& result) :\n    LogMessage(file, line, result) {}\n\nLogMessageFatal::~LogMessageFatal() {\n    Flush();\n    LogMessage::Fail();\n}\n\nvoid InitGoogleLogging(const char* argv0) {\n  glog_internal_namespace_::InitGoogleLoggingUtilities(argv0);\n}\n\nvoid ShutdownGoogleLogging() {\n  glog_internal_namespace_::ShutdownGoogleLoggingUtilities();\n  LogDestination::DeleteLogDestinations();\n  delete logging_directories_list;\n  logging_directories_list = NULL;\n}\n\n_END_GOOGLE_NAMESPACE_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/logging_striplog_test.sh",
    "content": "#! /bin/sh\n#\n# Copyright (c) 2007, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# Author: Sergey Ioffe\n\nget_strings () {\n    if test -e \".libs/$1\"; then\n        binary=\".libs/$1\"\n    elif test -e \"$1.exe\"; then\n        binary=\"$1.exe\"\n    else\n        echo \"We coundn't find $1 binary.\"\n        exit 1\n    fi\n    \n    strings -n 10 $binary | sort | awk '/TESTMESSAGE/ {printf \"%s \", $2}'\n}\n\n# Die if \"$1\" != \"$2\", print $3 as death reason\ncheck_eq () {\n    if [ \"$1\" != \"$2\" ]; then\n        echo \"Check failed: '$1' == '$2' ${3:+ ($3)}\"\n        exit 1\n    fi\n}\n\ndie () {\n    echo $1\n    exit 1\n}\n\n# Check that the string literals are appropriately stripped. This will\n# not be the case in debug mode.\n\ncheck_eq \"`get_strings logging_striptest0`\" \"COND ERROR FATAL INFO WARNING \"\ncheck_eq \"`get_strings logging_striptest2`\" \"COND ERROR FATAL \"\ncheck_eq \"`get_strings logging_striptest10`\" \"\"\n\n# Check that LOG(FATAL) aborts even for large STRIP_LOG\n\n./logging_striptest2 2>/dev/null && die \"Did not abort for STRIP_LOG=2\"\n./logging_striptest10 2>/dev/null && die \"Did not abort for STRIP_LOG=10\"\n\necho \"PASS\"\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/logging_striptest10.cc",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Sergey Ioffe\n\n#define GOOGLE_STRIP_LOG 10\n\n// Include the actual test.\n#include \"logging_striptest_main.cc\"\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/logging_striptest2.cc",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Sergey Ioffe\n\n#define GOOGLE_STRIP_LOG 2\n\n// Include the actual test.\n#include \"logging_striptest_main.cc\"\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/logging_striptest_main.cc",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Sergey Ioffe\n\n// The common part of the striplog tests.\n\n#include <stdio.h>\n#include <string>\n#include <iosfwd>\n#include \"glog/logging.h\"\n#include \"base/commandlineflags.h\"\n#include \"config.h\"\n\nDECLARE_bool(logtostderr);\n\nusing std::string;\nusing namespace GOOGLE_NAMESPACE;\n\nint CheckNoReturn(bool b) {\n  string s;\n  if (b) {\n    LOG(FATAL) << \"Fatal\";\n  } else {\n    return 0;\n  }\n}\n\nstruct A { };\nstd::ostream &operator<<(std::ostream &str, const A&) {return str;}\n\nint main(int argc, char* argv[]) {\n  FLAGS_logtostderr = true;\n  InitGoogleLogging(argv[0]);\n  LOG(INFO) << \"TESTMESSAGE INFO\";\n  LOG(WARNING) << 2 << \"something\" << \"TESTMESSAGE WARNING\"\n               << 1 << 'c' << A() << std::endl;\n  LOG(ERROR) << \"TESTMESSAGE ERROR\";\n  bool flag = true;\n  (flag ? LOG(INFO) : LOG(ERROR)) << \"TESTMESSAGE COND\";\n  LOG(FATAL) << \"TESTMESSAGE FATAL\";\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/logging_unittest.cc",
    "content": "// Copyright (c) 2002, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Ray Sidney\n\n#include \"config_for_unittests.h\"\n#include \"utilities.h\"\n\n#include <fcntl.h>\n#ifdef HAVE_GLOB_H\n# include <glob.h>\n#endif\n#include <sys/stat.h>\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\n\n#include <iomanip>\n#include <iostream>\n#include <memory>\n#include <queue>\n#include <sstream>\n#include <string>\n#include <vector>\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include \"base/commandlineflags.h\"\n#include \"glog/logging.h\"\n#include \"glog/raw_logging.h\"\n#include \"googletest.h\"\n\nDECLARE_string(log_backtrace_at);  // logging.cc\n\n#ifdef HAVE_LIB_GFLAGS\n#include <gflags/gflags.h>\n#endif\n\n#ifdef HAVE_LIB_GMOCK\n#include <gmock/gmock.h>\n#include \"mock-log.h\"\n// Introduce several symbols from gmock.\nusing testing::_;\nusing testing::AnyNumber;\nusing testing::HasSubstr;\nusing testing::AllOf;\nusing testing::StrNe;\nusing testing::StrictMock;\nusing testing::InitGoogleMock;\nusing GOOGLE_NAMESPACE::glog_testing::ScopedMockLog;\n#endif\n\nusing namespace std;\nusing namespace GOOGLE_NAMESPACE;\n\n// Some non-advertised functions that we want to test or use.\n_START_GOOGLE_NAMESPACE_\nnamespace base {\nnamespace internal {\nbool GetExitOnDFatal();\nvoid SetExitOnDFatal(bool value);\n}  // namespace internal\n}  // namespace base\n_END_GOOGLE_NAMESPACE_\n\nstatic void TestLogging(bool check_counts);\nstatic void TestRawLogging();\nstatic void LogWithLevels(int v, int severity, bool err, bool alsoerr);\nstatic void TestLoggingLevels();\nstatic void TestLogString();\nstatic void TestLogSink();\nstatic void TestLogToString();\nstatic void TestLogSinkWaitTillSent();\nstatic void TestCHECK();\nstatic void TestDCHECK();\nstatic void TestSTREQ();\nstatic void TestBasename();\nstatic void TestSymlink();\nstatic void TestExtension();\nstatic void TestWrapper();\nstatic void TestErrno();\nstatic void TestTruncate();\n\nstatic int x = -1;\nstatic void BM_Check1(int n) {\n  while (n-- > 0) {\n    CHECK_GE(n, x);\n    CHECK_GE(n, x);\n    CHECK_GE(n, x);\n    CHECK_GE(n, x);\n    CHECK_GE(n, x);\n    CHECK_GE(n, x);\n    CHECK_GE(n, x);\n    CHECK_GE(n, x);\n  }\n}\nBENCHMARK(BM_Check1);\n\nstatic void CheckFailure(int a, int b, const char* file, int line, const char* msg);\nstatic void BM_Check3(int n) {\n  while (n-- > 0) {\n    if (n < x) CheckFailure(n, x, __FILE__, __LINE__, \"n < x\");\n    if (n < x) CheckFailure(n, x, __FILE__, __LINE__, \"n < x\");\n    if (n < x) CheckFailure(n, x, __FILE__, __LINE__, \"n < x\");\n    if (n < x) CheckFailure(n, x, __FILE__, __LINE__, \"n < x\");\n    if (n < x) CheckFailure(n, x, __FILE__, __LINE__, \"n < x\");\n    if (n < x) CheckFailure(n, x, __FILE__, __LINE__, \"n < x\");\n    if (n < x) CheckFailure(n, x, __FILE__, __LINE__, \"n < x\");\n    if (n < x) CheckFailure(n, x, __FILE__, __LINE__, \"n < x\");\n  }\n}\nBENCHMARK(BM_Check3);\n\nstatic void BM_Check2(int n) {\n  if (n == 17) {\n    x = 5;\n  }\n  while (n-- > 0) {\n    CHECK(n >= x);\n    CHECK(n >= x);\n    CHECK(n >= x);\n    CHECK(n >= x);\n    CHECK(n >= x);\n    CHECK(n >= x);\n    CHECK(n >= x);\n    CHECK(n >= x);\n  }\n}\nBENCHMARK(BM_Check2);\n\nstatic void CheckFailure(int a, int b, const char* file, int line, const char* msg) {\n}\n\nstatic void BM_logspeed(int n) {\n  while (n-- > 0) {\n    LOG(INFO) << \"test message\";\n  }\n}\nBENCHMARK(BM_logspeed);\n\nstatic void BM_vlog(int n) {\n  while (n-- > 0) {\n    VLOG(1) << \"test message\";\n  }\n}\nBENCHMARK(BM_vlog);\n\nint main(int argc, char **argv) {\n#ifdef HAVE_LIB_GFLAGS\n  ParseCommandLineFlags(&argc, &argv, true);\n#endif\n\n  // Test some basics before InitGoogleLogging:\n  CaptureTestStderr();\n  LogWithLevels(FLAGS_v, FLAGS_stderrthreshold,\n                FLAGS_logtostderr, FLAGS_alsologtostderr);\n  LogWithLevels(0, 0, 0, 0);  // simulate \"before global c-tors\"\n  const string early_stderr = GetCapturedTestStderr();\n\n  InitGoogleLogging(argv[0]);\n\n  RunSpecifiedBenchmarks();\n\n  FLAGS_logtostderr = true;\n\n  InitGoogleTest(&argc, argv);\n#ifdef HAVE_LIB_GMOCK\n  InitGoogleMock(&argc, argv);\n#endif\n\n  // so that death tests run before we use threads\n  CHECK_EQ(RUN_ALL_TESTS(), 0);\n\n  CaptureTestStderr();\n\n  // re-emit early_stderr\n  LogMessage(\"dummy\", LogMessage::kNoLogPrefix, INFO).stream() << early_stderr;\n\n  TestLogging(true);\n  TestRawLogging();\n  TestLoggingLevels();\n  TestLogString();\n  TestLogSink();\n  TestLogToString();\n  TestLogSinkWaitTillSent();\n  TestCHECK();\n  TestDCHECK();\n  TestSTREQ();\n\n  // TODO: The golden test portion of this test is very flakey.\n  EXPECT_TRUE(\n      MungeAndDiffTestStderr(FLAGS_test_srcdir + \"/src/logging_unittest.err\"));\n\n  FLAGS_logtostderr = false;\n\n  TestBasename();\n  TestSymlink();\n  TestExtension();\n  TestWrapper();\n  TestErrno();\n  TestTruncate();\n\n  ShutdownGoogleLogging();\n\n  fprintf(stdout, \"PASS\\n\");\n  return 0;\n}\n\nvoid TestLogging(bool check_counts) {\n  int64 base_num_infos   = LogMessage::num_messages(INFO);\n  int64 base_num_warning = LogMessage::num_messages(WARNING);\n  int64 base_num_errors  = LogMessage::num_messages(ERROR);\n\n  LOG(INFO) << string(\"foo \") << \"bar \" << 10 << ' ' << 3.4;\n  for ( int i = 0; i < 10; ++i ) {\n    int old_errno = errno;\n    errno = i;\n    PLOG_EVERY_N(ERROR, 2) << \"Plog every 2, iteration \" << COUNTER;\n    errno = old_errno;\n\n    LOG_EVERY_N(ERROR, 3) << \"Log every 3, iteration \" << COUNTER << endl;\n    LOG_EVERY_N(ERROR, 4) << \"Log every 4, iteration \" << COUNTER << endl;\n\n    LOG_IF_EVERY_N(WARNING, true, 5) << \"Log if every 5, iteration \" << COUNTER;\n    LOG_IF_EVERY_N(WARNING, false, 3)\n        << \"Log if every 3, iteration \" << COUNTER;\n    LOG_IF_EVERY_N(INFO, true, 1) << \"Log if every 1, iteration \" << COUNTER;\n    LOG_IF_EVERY_N(ERROR, (i < 3), 2)\n        << \"Log if less than 3 every 2, iteration \" << COUNTER;\n  }\n  LOG_IF(WARNING, true) << \"log_if this\";\n  LOG_IF(WARNING, false) << \"don't log_if this\";\n\n  char s[] = \"array\";\n  LOG(INFO) << s;\n  const char const_s[] = \"const array\";\n  LOG(INFO) << const_s;\n  int j = 1000;\n  LOG(ERROR) << string(\"foo\") << ' '<< j << ' ' << setw(10) << j << \" \"\n             << setw(1) << hex << j;\n\n  LogMessage(\"foo\", LogMessage::kNoLogPrefix, INFO).stream() << \"no prefix\";\n\n  if (check_counts) {\n    CHECK_EQ(base_num_infos   + 14, LogMessage::num_messages(INFO));\n    CHECK_EQ(base_num_warning + 3,  LogMessage::num_messages(WARNING));\n    CHECK_EQ(base_num_errors  + 15, LogMessage::num_messages(ERROR));\n  }\n}\n\nstatic void NoAllocNewHook() {\n  CHECK(false) << \"unexpected new\";\n}\n\nstruct NewHook {\n  NewHook() {\n    g_new_hook = &NoAllocNewHook;\n  }\n  ~NewHook() {\n    g_new_hook = NULL;\n  }\n};\n\nTEST(DeathNoAllocNewHook, logging) {\n  // tests that NewHook used below works\n  NewHook new_hook;\n  ASSERT_DEATH({\n    new int;\n  }, \"unexpected new\");\n}\n\nvoid TestRawLogging() {\n  string* foo = new string(\"foo \");\n  string huge_str(50000, 'a');\n\n  FlagSaver saver;\n\n  // Check that RAW loggging does not use mallocs.\n  NewHook new_hook;\n\n  RAW_LOG(INFO, \"%s%s%d%c%f\", foo->c_str(), \"bar \", 10, ' ', 3.4);\n  char s[] = \"array\";\n  RAW_LOG(WARNING, \"%s\", s);\n  const char const_s[] = \"const array\";\n  RAW_LOG(INFO, \"%s\", const_s);\n  void* p = reinterpret_cast<void*>(0x12345678);\n  RAW_LOG(INFO, \"ptr %p\", p);\n  p = NULL;\n  RAW_LOG(INFO, \"ptr %p\", p);\n  int j = 1000;\n  RAW_LOG(ERROR, \"%s%d%c%010d%s%1x\", foo->c_str(), j, ' ', j, \" \", j);\n  RAW_VLOG(0, \"foo %d\", j);\n\n#ifdef NDEBUG\n  RAW_LOG(INFO, \"foo %d\", j);  // so that have same stderr to compare\n#else\n  RAW_DLOG(INFO, \"foo %d\", j);  // test RAW_DLOG in debug mode\n#endif\n\n  // test how long messages are chopped:\n  RAW_LOG(WARNING, \"Huge string: %s\", huge_str.c_str());\n  RAW_VLOG(0, \"Huge string: %s\", huge_str.c_str());\n\n  FLAGS_v = 0;\n  RAW_LOG(INFO, \"log\");\n  RAW_VLOG(0, \"vlog 0 on\");\n  RAW_VLOG(1, \"vlog 1 off\");\n  RAW_VLOG(2, \"vlog 2 off\");\n  RAW_VLOG(3, \"vlog 3 off\");\n  FLAGS_v = 2;\n  RAW_LOG(INFO, \"log\");\n  RAW_VLOG(1, \"vlog 1 on\");\n  RAW_VLOG(2, \"vlog 2 on\");\n  RAW_VLOG(3, \"vlog 3 off\");\n\n#ifdef NDEBUG\n  RAW_DCHECK(1 == 2, \" RAW_DCHECK's shouldn't be compiled in normal mode\");\n#endif\n\n  RAW_CHECK(1 == 1, \"should be ok\");\n  RAW_DCHECK(true, \"should be ok\");\n\n  delete foo;\n}\n\nvoid LogWithLevels(int v, int severity, bool err, bool alsoerr) {\n  RAW_LOG(INFO,\n          \"Test: v=%d stderrthreshold=%d logtostderr=%d alsologtostderr=%d\",\n          v, severity, err, alsoerr);\n\n  FlagSaver saver;\n\n  FLAGS_v = v;\n  FLAGS_stderrthreshold = severity;\n  FLAGS_logtostderr = err;\n  FLAGS_alsologtostderr = alsoerr;\n\n  RAW_VLOG(-1, \"vlog -1\");\n  RAW_VLOG(0, \"vlog 0\");\n  RAW_VLOG(1, \"vlog 1\");\n  RAW_LOG(INFO, \"log info\");\n  RAW_LOG(WARNING, \"log warning\");\n  RAW_LOG(ERROR, \"log error\");\n\n  VLOG(-1) << \"vlog -1\";\n  VLOG(0) << \"vlog 0\";\n  VLOG(1) << \"vlog 1\";\n  LOG(INFO) << \"log info\";\n  LOG(WARNING) << \"log warning\";\n  LOG(ERROR) << \"log error\";\n\n  VLOG_IF(-1, true) << \"vlog_if -1\";\n  VLOG_IF(-1, false) << \"don't vlog_if -1\";\n  VLOG_IF(0, true) << \"vlog_if 0\";\n  VLOG_IF(0, false) << \"don't vlog_if 0\";\n  VLOG_IF(1, true) << \"vlog_if 1\";\n  VLOG_IF(1, false) << \"don't vlog_if 1\";\n  LOG_IF(INFO, true) << \"log_if info\";\n  LOG_IF(INFO, false) << \"don't log_if info\";\n  LOG_IF(WARNING, true) << \"log_if warning\";\n  LOG_IF(WARNING, false) << \"don't log_if warning\";\n  LOG_IF(ERROR, true) << \"log_if error\";\n  LOG_IF(ERROR, false) << \"don't log_if error\";\n\n  int c;\n  c = 1; VLOG_IF(100, c -= 2) << \"vlog_if 100 expr\"; EXPECT_EQ(c, -1);\n  c = 1; VLOG_IF(0, c -= 2) << \"vlog_if 0 expr\"; EXPECT_EQ(c, -1);\n  c = 1; LOG_IF(INFO, c -= 2) << \"log_if info expr\"; EXPECT_EQ(c, -1);\n  c = 1; LOG_IF(ERROR, c -= 2) << \"log_if error expr\"; EXPECT_EQ(c, -1);\n  c = 2; VLOG_IF(0, c -= 2) << \"don't vlog_if 0 expr\"; EXPECT_EQ(c, 0);\n  c = 2; LOG_IF(ERROR, c -= 2) << \"don't log_if error expr\"; EXPECT_EQ(c, 0);\n\n  c = 3; LOG_IF_EVERY_N(INFO, c -= 4, 1) << \"log_if info every 1 expr\";\n  EXPECT_EQ(c, -1);\n  c = 3; LOG_IF_EVERY_N(ERROR, c -= 4, 1) << \"log_if error every 1 expr\";\n  EXPECT_EQ(c, -1);\n  c = 4; LOG_IF_EVERY_N(ERROR, c -= 4, 3) << \"don't log_if info every 3 expr\";\n  EXPECT_EQ(c, 0);\n  c = 4; LOG_IF_EVERY_N(ERROR, c -= 4, 3) << \"don't log_if error every 3 expr\";\n  EXPECT_EQ(c, 0);\n  c = 5; VLOG_IF_EVERY_N(0, c -= 4, 1) << \"vlog_if 0 every 1 expr\";\n  EXPECT_EQ(c, 1);\n  c = 5; VLOG_IF_EVERY_N(100, c -= 4, 3) << \"vlog_if 100 every 3 expr\";\n  EXPECT_EQ(c, 1);\n  c = 6; VLOG_IF_EVERY_N(0, c -= 6, 1) << \"don't vlog_if 0 every 1 expr\";\n  EXPECT_EQ(c, 0);\n  c = 6; VLOG_IF_EVERY_N(100, c -= 6, 3) << \"don't vlog_if 100 every 1 expr\";\n  EXPECT_EQ(c, 0);\n}\n\nvoid TestLoggingLevels() {\n  LogWithLevels(0, INFO, false, false);\n  LogWithLevels(1, INFO, false, false);\n  LogWithLevels(-1, INFO, false, false);\n  LogWithLevels(0, WARNING, false, false);\n  LogWithLevels(0, ERROR, false, false);\n  LogWithLevels(0, FATAL, false, false);\n  LogWithLevels(0, FATAL, true, false);\n  LogWithLevels(0, FATAL, false, true);\n  LogWithLevels(1, WARNING, false, false);\n  LogWithLevels(1, FATAL, false, true);\n}\n\nTEST(DeathRawCHECK, logging) {\n  ASSERT_DEATH(RAW_CHECK(false, \"failure 1\"),\n               \"RAW: Check false failed: failure 1\");\n  ASSERT_DEBUG_DEATH(RAW_DCHECK(1 == 2, \"failure 2\"),\n               \"RAW: Check 1 == 2 failed: failure 2\");\n}\n\nvoid TestLogString() {\n  vector<string> errors;\n  vector<string> *no_errors = NULL;\n\n  LOG_STRING(INFO, &errors) << \"LOG_STRING: \" << \"collected info\";\n  LOG_STRING(WARNING, &errors) << \"LOG_STRING: \" << \"collected warning\";\n  LOG_STRING(ERROR, &errors) << \"LOG_STRING: \" << \"collected error\";\n\n  LOG_STRING(INFO, no_errors) << \"LOG_STRING: \" << \"reported info\";\n  LOG_STRING(WARNING, no_errors) << \"LOG_STRING: \" << \"reported warning\";\n  LOG_STRING(ERROR, NULL) << \"LOG_STRING: \" << \"reported error\";\n\n  for (size_t i = 0; i < errors.size(); ++i) {\n    LOG(INFO) << \"Captured by LOG_STRING:  \" << errors[i];\n  }\n}\n\nvoid TestLogToString() {\n  string error;\n  string* no_error = NULL;\n\n  LOG_TO_STRING(INFO, &error) << \"LOG_TO_STRING: \" << \"collected info\";\n  LOG(INFO) << \"Captured by LOG_TO_STRING:  \" << error;\n  LOG_TO_STRING(WARNING, &error) << \"LOG_TO_STRING: \" << \"collected warning\";\n  LOG(INFO) << \"Captured by LOG_TO_STRING:  \" << error;\n  LOG_TO_STRING(ERROR, &error) << \"LOG_TO_STRING: \" << \"collected error\";\n  LOG(INFO) << \"Captured by LOG_TO_STRING:  \" << error;\n\n  LOG_TO_STRING(INFO, no_error) << \"LOG_TO_STRING: \" << \"reported info\";\n  LOG_TO_STRING(WARNING, no_error) << \"LOG_TO_STRING: \" << \"reported warning\";\n  LOG_TO_STRING(ERROR, NULL) << \"LOG_TO_STRING: \" << \"reported error\";\n}\n\nclass TestLogSinkImpl : public LogSink {\n public:\n  vector<string> errors;\n  virtual void send(LogSeverity severity, const char* full_filename,\n                    const char* base_filename, int line,\n                    const struct tm* tm_time,\n                    const char* message, size_t message_len) {\n    errors.push_back(\n      ToString(severity, base_filename, line, tm_time, message, message_len));\n  }\n};\n\nvoid TestLogSink() {\n  TestLogSinkImpl sink;\n  LogSink *no_sink = NULL;\n\n  LOG_TO_SINK(&sink, INFO) << \"LOG_TO_SINK: \" << \"collected info\";\n  LOG_TO_SINK(&sink, WARNING) << \"LOG_TO_SINK: \" << \"collected warning\";\n  LOG_TO_SINK(&sink, ERROR) << \"LOG_TO_SINK: \" << \"collected error\";\n\n  LOG_TO_SINK(no_sink, INFO) << \"LOG_TO_SINK: \" << \"reported info\";\n  LOG_TO_SINK(no_sink, WARNING) << \"LOG_TO_SINK: \" << \"reported warning\";\n  LOG_TO_SINK(NULL, ERROR) << \"LOG_TO_SINK: \" << \"reported error\";\n\n  LOG_TO_SINK_BUT_NOT_TO_LOGFILE(&sink, INFO)\n      << \"LOG_TO_SINK_BUT_NOT_TO_LOGFILE: \" << \"collected info\";\n  LOG_TO_SINK_BUT_NOT_TO_LOGFILE(&sink, WARNING)\n      << \"LOG_TO_SINK_BUT_NOT_TO_LOGFILE: \" << \"collected warning\";\n  LOG_TO_SINK_BUT_NOT_TO_LOGFILE(&sink, ERROR)\n      << \"LOG_TO_SINK_BUT_NOT_TO_LOGFILE: \" << \"collected error\";\n\n  LOG_TO_SINK_BUT_NOT_TO_LOGFILE(no_sink, INFO)\n      << \"LOG_TO_SINK_BUT_NOT_TO_LOGFILE: \" << \"thrashed info\";\n  LOG_TO_SINK_BUT_NOT_TO_LOGFILE(no_sink, WARNING)\n      << \"LOG_TO_SINK_BUT_NOT_TO_LOGFILE: \" << \"thrashed warning\";\n  LOG_TO_SINK_BUT_NOT_TO_LOGFILE(NULL, ERROR)\n      << \"LOG_TO_SINK_BUT_NOT_TO_LOGFILE: \" << \"thrashed error\";\n\n  LOG(INFO) << \"Captured by LOG_TO_SINK:\";\n  for (size_t i = 0; i < sink.errors.size(); ++i) {\n    LogMessage(\"foo\", LogMessage::kNoLogPrefix, INFO).stream()\n      << sink.errors[i];\n  }\n}\n\n// For testing using CHECK*() on anonymous enums.\nenum {\n  CASE_A,\n  CASE_B\n};\n\nvoid TestCHECK() {\n  // Tests using CHECK*() on int values.\n  CHECK(1 == 1);\n  CHECK_EQ(1, 1);\n  CHECK_NE(1, 2);\n  CHECK_GE(1, 1);\n  CHECK_GE(2, 1);\n  CHECK_LE(1, 1);\n  CHECK_LE(1, 2);\n  CHECK_GT(2, 1);\n  CHECK_LT(1, 2);\n\n  // Tests using CHECK*() on anonymous enums.\n  // Apple's GCC doesn't like this.\n#if !defined(OS_MACOSX)\n  CHECK_EQ(CASE_A, CASE_A);\n  CHECK_NE(CASE_A, CASE_B);\n  CHECK_GE(CASE_A, CASE_A);\n  CHECK_GE(CASE_B, CASE_A);\n  CHECK_LE(CASE_A, CASE_A);\n  CHECK_LE(CASE_A, CASE_B);\n  CHECK_GT(CASE_B, CASE_A);\n  CHECK_LT(CASE_A, CASE_B);\n#endif\n}\n\nvoid TestDCHECK() {\n#ifdef NDEBUG\n  DCHECK( 1 == 2 ) << \" DCHECK's shouldn't be compiled in normal mode\";\n#endif\n  DCHECK( 1 == 1 );\n  DCHECK_EQ(1, 1);\n  DCHECK_NE(1, 2);\n  DCHECK_GE(1, 1);\n  DCHECK_GE(2, 1);\n  DCHECK_LE(1, 1);\n  DCHECK_LE(1, 2);\n  DCHECK_GT(2, 1);\n  DCHECK_LT(1, 2);\n\n  auto_ptr<int64> sptr(new int64);\n  int64* ptr = DCHECK_NOTNULL(sptr.get());\n  CHECK_EQ(ptr, sptr.get());\n}\n\nvoid TestSTREQ() {\n  CHECK_STREQ(\"this\", \"this\");\n  CHECK_STREQ(NULL, NULL);\n  CHECK_STRCASEEQ(\"this\", \"tHiS\");\n  CHECK_STRCASEEQ(NULL, NULL);\n  CHECK_STRNE(\"this\", \"tHiS\");\n  CHECK_STRNE(\"this\", NULL);\n  CHECK_STRCASENE(\"this\", \"that\");\n  CHECK_STRCASENE(NULL, \"that\");\n  CHECK_STREQ((string(\"a\")+\"b\").c_str(), \"ab\");\n  CHECK_STREQ(string(\"test\").c_str(),\n              (string(\"te\") + string(\"st\")).c_str());\n}\n\nTEST(DeathSTREQ, logging) {\n  ASSERT_DEATH(CHECK_STREQ(NULL, \"this\"), \"\");\n  ASSERT_DEATH(CHECK_STREQ(\"this\", \"siht\"), \"\");\n  ASSERT_DEATH(CHECK_STRCASEEQ(NULL, \"siht\"), \"\");\n  ASSERT_DEATH(CHECK_STRCASEEQ(\"this\", \"siht\"), \"\");\n  ASSERT_DEATH(CHECK_STRNE(NULL, NULL), \"\");\n  ASSERT_DEATH(CHECK_STRNE(\"this\", \"this\"), \"\");\n  ASSERT_DEATH(CHECK_STREQ((string(\"a\")+\"b\").c_str(), \"abc\"), \"\");\n}\n\nTEST(CheckNOTNULL, Simple) {\n  int64 t;\n  void *ptr = static_cast<void *>(&t);\n  void *ref = CHECK_NOTNULL(ptr);\n  EXPECT_EQ(ptr, ref);\n  CHECK_NOTNULL(reinterpret_cast<char *>(ptr));\n  CHECK_NOTNULL(reinterpret_cast<unsigned char *>(ptr));\n  CHECK_NOTNULL(reinterpret_cast<int *>(ptr));\n  CHECK_NOTNULL(reinterpret_cast<int64 *>(ptr));\n}\n\nTEST(DeathCheckNN, Simple) {\n  ASSERT_DEATH(CHECK_NOTNULL(static_cast<void *>(NULL)), \"\");\n}\n\n// Get list of file names that match pattern\nstatic void GetFiles(const string& pattern, vector<string>* files) {\n  files->clear();\n#if defined(HAVE_GLOB_H)\n  glob_t g;\n  const int r = glob(pattern.c_str(), 0, NULL, &g);\n  CHECK((r == 0) || (r == GLOB_NOMATCH)) << \": error matching \" << pattern;\n  for (int i = 0; i < g.gl_pathc; i++) {\n    files->push_back(string(g.gl_pathv[i]));\n  }\n  globfree(&g);\n#elif defined(OS_WINDOWS)\n  WIN32_FIND_DATAA data;\n  HANDLE handle = FindFirstFileA(pattern.c_str(), &data);\n  size_t index = pattern.rfind('\\\\');\n  if (index == string::npos) {\n    LOG(FATAL) << \"No directory separator.\";\n  }\n  const string dirname = pattern.substr(0, index + 1);\n  if (FAILED(handle)) {\n    // Finding no files is OK.\n    return;\n  }\n  do {\n    files->push_back(dirname + data.cFileName);\n  } while (FindNextFileA(handle, &data));\n  LOG_SYSRESULT(FindClose(handle));\n#else\n# error There is no way to do glob.\n#endif\n}\n\n// Delete files patching pattern\nstatic void DeleteFiles(const string& pattern) {\n  vector<string> files;\n  GetFiles(pattern, &files);\n  for (size_t i = 0; i < files.size(); i++) {\n    CHECK(unlink(files[i].c_str()) == 0) << \": \" << strerror(errno);\n  }\n}\n\nstatic void CheckFile(const string& name, const string& expected_string) {\n  vector<string> files;\n  GetFiles(name + \"*\", &files);\n  CHECK_EQ(files.size(), 1);\n\n  FILE* file = fopen(files[0].c_str(), \"r\");\n  CHECK(file != NULL) << \": could not open \" << files[0];\n  char buf[1000];\n  while (fgets(buf, sizeof(buf), file) != NULL) {\n    if (strstr(buf, expected_string.c_str()) != NULL) {\n      fclose(file);\n      return;\n    }\n  }\n  fclose(file);\n  LOG(FATAL) << \"Did not find \" << expected_string << \" in \" << files[0];\n}\n\nstatic void TestBasename() {\n  fprintf(stderr, \"==== Test setting log file basename\\n\");\n  const string dest = FLAGS_test_tmpdir + \"/logging_test_basename\";\n  DeleteFiles(dest + \"*\");\n\n  SetLogDestination(INFO, dest.c_str());\n  LOG(INFO) << \"message to new base\";\n  FlushLogFiles(INFO);\n\n  CheckFile(dest, \"message to new base\");\n\n  // Release file handle for the destination file to unlock the file in Windows.\n  LogToStderr();\n  DeleteFiles(dest + \"*\");\n}\n\nstatic void TestSymlink() {\n#ifndef OS_WINDOWS\n  fprintf(stderr, \"==== Test setting log file symlink\\n\");\n  string dest = FLAGS_test_tmpdir + \"/logging_test_symlink\";\n  string sym = FLAGS_test_tmpdir + \"/symlinkbase\";\n  DeleteFiles(dest + \"*\");\n  DeleteFiles(sym + \"*\");\n\n  SetLogSymlink(INFO, \"symlinkbase\");\n  SetLogDestination(INFO, dest.c_str());\n  LOG(INFO) << \"message to new symlink\";\n  FlushLogFiles(INFO);\n  CheckFile(sym, \"message to new symlink\");\n\n  DeleteFiles(dest + \"*\");\n  DeleteFiles(sym + \"*\");\n#endif\n}\n\nstatic void TestExtension() {\n  fprintf(stderr, \"==== Test setting log file extension\\n\");\n  string dest = FLAGS_test_tmpdir + \"/logging_test_extension\";\n  DeleteFiles(dest + \"*\");\n\n  SetLogDestination(INFO, dest.c_str());\n  SetLogFilenameExtension(\"specialextension\");\n  LOG(INFO) << \"message to new extension\";\n  FlushLogFiles(INFO);\n  CheckFile(dest, \"message to new extension\");\n\n  // Check that file name ends with extension\n  vector<string> filenames;\n  GetFiles(dest + \"*\", &filenames);\n  CHECK_EQ(filenames.size(), 1);\n  CHECK(strstr(filenames[0].c_str(), \"specialextension\") != NULL);\n\n  // Release file handle for the destination file to unlock the file in Windows.\n  LogToStderr();\n  DeleteFiles(dest + \"*\");\n}\n\nstruct MyLogger : public base::Logger {\n  string data;\n\n  virtual void Write(bool should_flush,\n                     time_t timestamp,\n                     const char* message,\n                     int length) {\n    data.append(message, length);\n  }\n\n  virtual void Flush() { }\n\n  virtual uint32 LogSize() { return data.length(); }\n};\n\nstatic void TestWrapper() {\n  fprintf(stderr, \"==== Test log wrapper\\n\");\n\n  MyLogger my_logger;\n  base::Logger* old_logger = base::GetLogger(INFO);\n  base::SetLogger(INFO, &my_logger);\n  LOG(INFO) << \"Send to wrapped logger\";\n  FlushLogFiles(INFO);\n  base::SetLogger(INFO, old_logger);\n\n  CHECK(strstr(my_logger.data.c_str(), \"Send to wrapped logger\") != NULL);\n}\n\nstatic void TestErrno() {\n  fprintf(stderr, \"==== Test errno preservation\\n\");\n\n  errno = ENOENT;\n  TestLogging(false);\n  CHECK_EQ(errno, ENOENT);\n}\n\nstatic void TestOneTruncate(const char *path, int64 limit, int64 keep,\n                            int64 dsize, int64 ksize, int64 expect) {\n  int fd;\n  CHECK_ERR(fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0600));\n\n  const char *discardstr = \"DISCARDME!\", *keepstr = \"KEEPME!\";\n\n  // Fill the file with the requested data; first discard data, then kept data\n  int64 written = 0;\n  while (written < dsize) {\n    int bytes = min<int64>(dsize - written, strlen(discardstr));\n    CHECK_ERR(write(fd, discardstr, bytes));\n    written += bytes;\n  }\n  written = 0;\n  while (written < ksize) {\n    int bytes = min<int64>(ksize - written, strlen(keepstr));\n    CHECK_ERR(write(fd, keepstr, bytes));\n    written += bytes;\n  }\n\n  TruncateLogFile(path, limit, keep);\n\n  // File should now be shorter\n  struct stat statbuf;\n  CHECK_ERR(fstat(fd, &statbuf));\n  CHECK_EQ(statbuf.st_size, expect);\n  CHECK_ERR(lseek(fd, 0, SEEK_SET));\n\n  // File should contain the suffix of the original file\n  int buf_size = statbuf.st_size + 1;\n  char* buf = new char[buf_size];\n  memset(buf, 0, sizeof(buf));\n  CHECK_ERR(read(fd, buf, buf_size));\n\n  const char *p = buf;\n  int64 checked = 0;\n  while (checked < expect) {\n    int bytes = min<int64>(expect - checked, strlen(keepstr));\n    CHECK(!memcmp(p, keepstr, bytes));\n    checked += bytes;\n  }\n  close(fd);\n  delete[] buf;\n}\n\nstatic void TestTruncate() {\n#ifdef HAVE_UNISTD_H\n  fprintf(stderr, \"==== Test log truncation\\n\");\n  string path = FLAGS_test_tmpdir + \"/truncatefile\";\n\n  // Test on a small file\n  TestOneTruncate(path.c_str(), 10, 10, 10, 10, 10);\n\n  // And a big file (multiple blocks to copy)\n  TestOneTruncate(path.c_str(), 2<<20, 4<<10, 3<<20, 4<<10, 4<<10);\n\n  // Check edge-case limits\n  TestOneTruncate(path.c_str(), 10, 20, 0, 20, 20);\n  TestOneTruncate(path.c_str(), 10, 0, 0, 0, 0);\n  TestOneTruncate(path.c_str(), 10, 50, 0, 10, 10);\n  TestOneTruncate(path.c_str(), 50, 100, 0, 30, 30);\n\n  // MacOSX 10.4 doesn't fail in this case.\n  // Windows doesn't have symlink.\n  // Let's just ignore this test for these cases.\n#if !defined(OS_MACOSX) && !defined(OS_WINDOWS)\n  // Through a symlink should fail to truncate\n  string linkname = path + \".link\";\n  unlink(linkname.c_str());\n  CHECK_ERR(symlink(path.c_str(), linkname.c_str()));\n  TestOneTruncate(linkname.c_str(), 10, 10, 0, 30, 30);\n#endif\n\n  // The /proc/self path makes sense only for linux.\n#if defined(OS_LINUX)\n  // Through an open fd symlink should work\n  int fd;\n  CHECK_ERR(fd = open(path.c_str(), O_APPEND | O_WRONLY));\n  char fdpath[64];\n  snprintf(fdpath, sizeof(fdpath), \"/proc/self/fd/%d\", fd);\n  TestOneTruncate(fdpath, 10, 10, 10, 10, 10);\n#endif\n\n#endif\n}\n\n_START_GOOGLE_NAMESPACE_\nnamespace glog_internal_namespace_ {\nextern  // in logging.cc\nbool SafeFNMatch_(const char* pattern, size_t patt_len,\n                  const char* str, size_t str_len);\n} // namespace glog_internal_namespace_\nusing glog_internal_namespace_::SafeFNMatch_;\n_END_GOOGLE_NAMESPACE_\n\nstatic bool WrapSafeFNMatch(string pattern, string str) {\n  pattern += \"abc\";\n  str += \"defgh\";\n  return SafeFNMatch_(pattern.data(), pattern.size() - 3,\n                      str.data(), str.size() - 5);\n}\n\nTEST(SafeFNMatch, logging) {\n  CHECK(WrapSafeFNMatch(\"foo\", \"foo\"));\n  CHECK(!WrapSafeFNMatch(\"foo\", \"bar\"));\n  CHECK(!WrapSafeFNMatch(\"foo\", \"fo\"));\n  CHECK(!WrapSafeFNMatch(\"foo\", \"foo2\"));\n  CHECK(WrapSafeFNMatch(\"bar/foo.ext\", \"bar/foo.ext\"));\n  CHECK(WrapSafeFNMatch(\"*ba*r/fo*o.ext*\", \"bar/foo.ext\"));\n  CHECK(!WrapSafeFNMatch(\"bar/foo.ext\", \"bar/baz.ext\"));\n  CHECK(!WrapSafeFNMatch(\"bar/foo.ext\", \"bar/foo\"));\n  CHECK(!WrapSafeFNMatch(\"bar/foo.ext\", \"bar/foo.ext.zip\"));\n  CHECK(WrapSafeFNMatch(\"ba?/*.ext\", \"bar/foo.ext\"));\n  CHECK(WrapSafeFNMatch(\"ba?/*.ext\", \"baZ/FOO.ext\"));\n  CHECK(!WrapSafeFNMatch(\"ba?/*.ext\", \"barr/foo.ext\"));\n  CHECK(!WrapSafeFNMatch(\"ba?/*.ext\", \"bar/foo.ext2\"));\n  CHECK(WrapSafeFNMatch(\"ba?/*\", \"bar/foo.ext2\"));\n  CHECK(WrapSafeFNMatch(\"ba?/*\", \"bar/\"));\n  CHECK(!WrapSafeFNMatch(\"ba?/?\", \"bar/\"));\n  CHECK(!WrapSafeFNMatch(\"ba?/*\", \"bar\"));\n}\n\n// TestWaitingLogSink will save messages here\n// No lock: Accessed only by TestLogSinkWriter thread\n// and after its demise by its creator.\nstatic vector<string> global_messages;\n\n// helper for TestWaitingLogSink below.\n// Thread that does the logic of TestWaitingLogSink\n// It's free to use LOG() itself.\nclass TestLogSinkWriter : public Thread {\n public:\n\n  TestLogSinkWriter() : should_exit_(false) {\n    SetJoinable(true);\n    Start();\n  }\n\n  // Just buffer it (can't use LOG() here).\n  void Buffer(const string& message) {\n    mutex_.Lock();\n    RAW_LOG(INFO, \"Buffering\");\n    messages_.push(message);\n    mutex_.Unlock();\n    RAW_LOG(INFO, \"Buffered\");\n  }\n\n  // Wait for the buffer to clear (can't use LOG() here).\n  void Wait() {\n    RAW_LOG(INFO, \"Waiting\");\n    mutex_.Lock();\n    while (!NoWork()) {\n      mutex_.Unlock();\n      SleepForMilliseconds(1);\n      mutex_.Lock();\n    }\n    RAW_LOG(INFO, \"Waited\");\n    mutex_.Unlock();\n  }\n\n  // Trigger thread exit.\n  void Stop() {\n    MutexLock l(&mutex_);\n    should_exit_ = true;\n  }\n\n private:\n\n  // helpers ---------------\n\n  // For creating a \"Condition\".\n  bool NoWork() { return messages_.empty(); }\n  bool HaveWork() { return !messages_.empty() || should_exit_; }\n\n  // Thread body; CAN use LOG() here!\n  virtual void Run() {\n    while (1) {\n      mutex_.Lock();\n      while (!HaveWork()) {\n        mutex_.Unlock();\n        SleepForMilliseconds(1);\n        mutex_.Lock();\n      }\n      if (should_exit_ && messages_.empty()) {\n        mutex_.Unlock();\n        break;\n      }\n      // Give the main thread time to log its message,\n      // so that we get a reliable log capture to compare to golden file.\n      // Same for the other sleep below.\n      SleepForMilliseconds(20);\n      RAW_LOG(INFO, \"Sink got a messages\");  // only RAW_LOG under mutex_ here\n      string message = messages_.front();\n      messages_.pop();\n      // Normally this would be some more real/involved logging logic\n      // where LOG() usage can't be eliminated,\n      // e.g. pushing the message over with an RPC:\n      int messages_left = messages_.size();\n      mutex_.Unlock();\n      SleepForMilliseconds(20);\n      // May not use LOG while holding mutex_, because Buffer()\n      // acquires mutex_, and Buffer is called from LOG(),\n      // which has its own internal mutex:\n      // LOG()->LogToSinks()->TestWaitingLogSink::send()->Buffer()\n      LOG(INFO) << \"Sink is sending out a message: \" << message;\n      LOG(INFO) << \"Have \" << messages_left << \" left\";\n      global_messages.push_back(message);\n    }\n  }\n\n  // data ---------------\n\n  Mutex mutex_;\n  bool should_exit_;\n  queue<string> messages_;  // messages to be logged\n};\n\n// A log sink that exercises WaitTillSent:\n// it pushes data to a buffer and wakes up another thread to do the logging\n// (that other thread can than use LOG() itself),\nclass TestWaitingLogSink : public LogSink {\n public:\n\n  TestWaitingLogSink() {\n    tid_ = pthread_self();  // for thread-specific behavior\n    AddLogSink(this);\n  }\n  ~TestWaitingLogSink() {\n    RemoveLogSink(this);\n    writer_.Stop();\n    writer_.Join();\n  }\n\n  // (re)define LogSink interface\n\n  virtual void send(LogSeverity severity, const char* full_filename,\n                    const char* base_filename, int line,\n                    const struct tm* tm_time,\n                    const char* message, size_t message_len) {\n    // Push it to Writer thread if we are the original logging thread.\n    // Note: Something like ThreadLocalLogSink is a better choice\n    //       to do thread-specific LogSink logic for real.\n    if (pthread_equal(tid_, pthread_self())) {\n      writer_.Buffer(ToString(severity, base_filename, line,\n                              tm_time, message, message_len));\n    }\n  }\n  virtual void WaitTillSent() {\n    // Wait for Writer thread if we are the original logging thread.\n    if (pthread_equal(tid_, pthread_self()))  writer_.Wait();\n  }\n\n private:\n\n  pthread_t tid_;\n  TestLogSinkWriter writer_;\n};\n\n// Check that LogSink::WaitTillSent can be used in the advertised way.\n// We also do golden-stderr comparison.\nstatic void TestLogSinkWaitTillSent() {\n  { TestWaitingLogSink sink;\n    // Sleeps give the sink threads time to do all their work,\n    // so that we get a reliable log capture to compare to the golden file.\n    LOG(INFO) << \"Message 1\";\n    SleepForMilliseconds(60);\n    LOG(ERROR) << \"Message 2\";\n    SleepForMilliseconds(60);\n    LOG(WARNING) << \"Message 3\";\n    SleepForMilliseconds(60);\n  }\n  for (size_t i = 0; i < global_messages.size(); ++i) {\n    LOG(INFO) << \"Sink capture: \" << global_messages[i];\n  }\n  CHECK_EQ(global_messages.size(), 3);\n}\n\nTEST(Strerror, logging) {\n  int errcode = EINTR;\n  char *msg = strdup(strerror(errcode));\n  int buf_size = strlen(msg) + 1;\n  char *buf = new char[buf_size];\n  CHECK_EQ(posix_strerror_r(errcode, NULL, 0), -1);\n  buf[0] = 'A';\n  CHECK_EQ(posix_strerror_r(errcode, buf, 0), -1);\n  CHECK_EQ(buf[0], 'A');\n  CHECK_EQ(posix_strerror_r(errcode, NULL, buf_size), -1);\n#if defined(OS_MACOSX) || defined(OS_FREEBSD) || defined(OS_OPENBSD)\n  // MacOSX or FreeBSD considers this case is an error since there is\n  // no enough space.\n  CHECK_EQ(posix_strerror_r(errcode, buf, 1), -1);\n#else\n  CHECK_EQ(posix_strerror_r(errcode, buf, 1), 0);\n#endif\n  CHECK_STREQ(buf, \"\");\n  CHECK_EQ(posix_strerror_r(errcode, buf, buf_size), 0);\n  CHECK_STREQ(buf, msg);\n  free(msg);\n  delete[] buf;\n}\n\n// Simple routines to look at the sizes of generated code for LOG(FATAL) and\n// CHECK(..) via objdump\nvoid MyFatal() {\n  LOG(FATAL) << \"Failed\";\n}\nvoid MyCheck(bool a, bool b) {\n  CHECK_EQ(a, b);\n}\n\n#ifdef HAVE_LIB_GMOCK\n\nTEST(DVLog, Basic) {\n  ScopedMockLog log;\n\n#if NDEBUG\n  // We are expecting that nothing is logged.\n  EXPECT_CALL(log, Log(_, _, _)).Times(0);\n#else\n  EXPECT_CALL(log, Log(INFO, __FILE__, \"debug log\"));\n#endif\n\n  FLAGS_v = 1;\n  DVLOG(1) << \"debug log\";\n}\n\nTEST(DVLog, V0) {\n  ScopedMockLog log;\n\n  // We are expecting that nothing is logged.\n  EXPECT_CALL(log, Log(_, _, _)).Times(0);\n\n  FLAGS_v = 0;\n  DVLOG(1) << \"debug log\";\n}\n\nTEST(LogAtLevel, Basic) {\n  ScopedMockLog log;\n\n  // The function version outputs \"logging.h\" as a file name.\n  EXPECT_CALL(log, Log(WARNING, StrNe(__FILE__), \"function version\"));\n  EXPECT_CALL(log, Log(INFO, __FILE__, \"macro version\"));\n\n  int severity = WARNING;\n  LogAtLevel(severity, \"function version\");\n\n  severity = INFO;\n  // We can use the macro version as a C++ stream.\n  LOG_AT_LEVEL(severity) << \"macro\" << ' ' << \"version\";\n}\n\nTEST(TestExitOnDFatal, ToBeOrNotToBe) {\n  // Check the default setting...\n  EXPECT_TRUE(base::internal::GetExitOnDFatal());\n\n  // Turn off...\n  base::internal::SetExitOnDFatal(false);\n  EXPECT_FALSE(base::internal::GetExitOnDFatal());\n\n  // We don't die.\n  {\n    ScopedMockLog log;\n    //EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber());\n    // LOG(DFATAL) has severity FATAL if debugging, but is\n    // downgraded to ERROR if not debugging.\n    const LogSeverity severity =\n#ifdef NDEBUG\n        ERROR;\n#else\n        FATAL;\n#endif\n    EXPECT_CALL(log, Log(severity, __FILE__, \"This should not be fatal\"));\n    LOG(DFATAL) << \"This should not be fatal\";\n  }\n\n  // Turn back on...\n  base::internal::SetExitOnDFatal(true);\n  EXPECT_TRUE(base::internal::GetExitOnDFatal());\n\n#ifdef GTEST_HAS_DEATH_TEST\n  // Death comes on little cats' feet.\n  EXPECT_DEBUG_DEATH({\n      LOG(DFATAL) << \"This should be fatal in debug mode\";\n    }, \"This should be fatal in debug mode\");\n#endif\n}\n\n#ifdef HAVE_STACKTRACE\n\nstatic void BacktraceAtHelper() {\n  LOG(INFO) << \"Not me\";\n\n// The vertical spacing of the next 3 lines is significant.\n  LOG(INFO) << \"Backtrace me\";\n}\nstatic int kBacktraceAtLine = __LINE__ - 2;  // The line of the LOG(INFO) above\n\nTEST(LogBacktraceAt, DoesNotBacktraceWhenDisabled) {\n  StrictMock<ScopedMockLog> log;\n\n  FLAGS_log_backtrace_at = \"\";\n\n  EXPECT_CALL(log, Log(_, _, \"Backtrace me\"));\n  EXPECT_CALL(log, Log(_, _, \"Not me\"));\n\n  BacktraceAtHelper();\n}\n\nTEST(LogBacktraceAt, DoesBacktraceAtRightLineWhenEnabled) {\n  StrictMock<ScopedMockLog> log;\n\n  char where[100];\n  snprintf(where, 100, \"%s:%d\", const_basename(__FILE__), kBacktraceAtLine);\n  FLAGS_log_backtrace_at = where;\n\n  // The LOG at the specified line should include a stacktrace which includes\n  // the name of the containing function, followed by the log message.\n  // We use HasSubstr()s instead of ContainsRegex() for environments\n  // which don't have regexp.\n  EXPECT_CALL(log, Log(_, _, AllOf(HasSubstr(\"stacktrace:\"),\n                                   HasSubstr(\"BacktraceAtHelper\"),\n                                   HasSubstr(\"main\"),\n                                   HasSubstr(\"Backtrace me\"))));\n  // Other LOGs should not include a backtrace.\n  EXPECT_CALL(log, Log(_, _, \"Not me\"));\n\n  BacktraceAtHelper();\n}\n\n#endif // HAVE_STACKTRACE\n\n#endif // HAVE_LIB_GMOCK\n\nstruct UserDefinedClass {\n  bool operator==(const UserDefinedClass& rhs) const { return true; }\n};\n\ninline ostream& operator<<(ostream& out, const UserDefinedClass& u) {\n  out << \"OK\";\n  return out;\n}\n\nTEST(UserDefinedClass, logging) {\n  UserDefinedClass u;\n  vector<string> buf;\n  LOG_STRING(INFO, &buf) << u;\n  CHECK_EQ(1, buf.size());\n  CHECK(buf[0].find(\"OK\") != string::npos);\n\n  // We must be able to compile this.\n  CHECK_EQ(u, u);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/logging_unittest.err",
    "content": "IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=2 logtostderr=0 alsologtostderr=0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error\nWARNING: Logging before InitGoogleLogging() is written to STDERR\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=0 logtostderr=0 alsologtostderr=0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] foo bar 10 3.4\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Plog every 2, iteration 1: __SUCCESS__ [0]\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 3, iteration 1\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 4, iteration 1\nWDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 5, iteration 1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 1\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Log if less than 3 every 2, iteration 1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 2\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Plog every 2, iteration 3: __ENOENT__ [2]\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 3\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Log if less than 3 every 2, iteration 3\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 3, iteration 4\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 4\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Plog every 2, iteration 5: __EINTR__ [4]\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 4, iteration 5\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 5\nWDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 5, iteration 6\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 6\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Plog every 2, iteration 7: __ENXIO__ [6]\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 3, iteration 7\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 7\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 8\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Plog every 2, iteration 9: __ENOEXEC__ [8]\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 4, iteration 9\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 9\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 3, iteration 10\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 10\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log_if this\nIDATE TIME__ THREADID logging_unittest.cc:LINE] array\nIDATE TIME__ THREADID logging_unittest.cc:LINE] const array\nEDATE TIME__ THREADID logging_unittest.cc:LINE] foo 1000 0000001000 3e8\nno prefix\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: foo bar 10 3.400000\nWDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: array\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: const array\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: ptr 0x12345678\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: ptr __NULLP__\nEDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: foo 1000 0000001000 3e8\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: foo 1000\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: foo 1000\nWDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: RAW_LOG ERROR: The Message was too long!\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: RAW_LOG ERROR: The Message was too long!\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0 on\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 1 on\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 2 on\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=0 logtostderr=0 alsologtostderr=0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=1 stderrthreshold=0 logtostderr=0 alsologtostderr=0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=-1 stderrthreshold=0 logtostderr=0 alsologtostderr=0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=1 logtostderr=0 alsologtostderr=0\nWDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log error\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=2 logtostderr=0 alsologtostderr=0\nEDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log error\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=3 logtostderr=0 alsologtostderr=0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=3 logtostderr=1 alsologtostderr=0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=3 logtostderr=0 alsologtostderr=1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=1 stderrthreshold=1 logtostderr=0 alsologtostderr=0\nWDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log error\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=1 stderrthreshold=3 logtostderr=0 alsologtostderr=1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr\nEDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr\nIDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_STRING: reported info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_STRING: reported warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_STRING: reported error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_STRING:  LOG_STRING: collected info\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_STRING:  LOG_STRING: collected warning\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_STRING:  LOG_STRING: collected error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: collected info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: collected warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: collected error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: reported info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: reported warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: reported error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_TO_SINK:\nIDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: collected info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: collected warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: collected error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK_BUT_NOT_TO_LOGFILE: collected info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK_BUT_NOT_TO_LOGFILE: collected warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK_BUT_NOT_TO_LOGFILE: collected error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_STRING: collected info\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_TO_STRING:  LOG_TO_STRING: collected info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_STRING: collected warning\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_TO_STRING:  LOG_TO_STRING: collected warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_STRING: collected error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_TO_STRING:  LOG_TO_STRING: collected error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_STRING: reported info\nWDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_STRING: reported warning\nEDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_STRING: reported error\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Message 1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Buffering\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Buffered\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Waiting\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Sink got a messages\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Waited\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Sink is sending out a message: IDATE TIME__ THREADID logging_unittest.cc:LINE] Message 1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Have 0 left\nEDATE TIME__ THREADID logging_unittest.cc:LINE] Message 2\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Buffering\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Buffered\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Waiting\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Sink got a messages\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Waited\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Sink is sending out a message: EDATE TIME__ THREADID logging_unittest.cc:LINE] Message 2\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Have 0 left\nWDATE TIME__ THREADID logging_unittest.cc:LINE] Message 3\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Buffering\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Buffered\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Waiting\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Sink got a messages\nIDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Waited\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Sink is sending out a message: WDATE TIME__ THREADID logging_unittest.cc:LINE] Message 3\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Have 0 left\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Sink capture: IDATE TIME__ THREADID logging_unittest.cc:LINE] Message 1\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Sink capture: EDATE TIME__ THREADID logging_unittest.cc:LINE] Message 2\nIDATE TIME__ THREADID logging_unittest.cc:LINE] Sink capture: WDATE TIME__ THREADID logging_unittest.cc:LINE] Message 3\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/mock-log.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Zhanyong Wan\n//\n// Defines the ScopedMockLog class (using Google C++ Mocking\n// Framework), which is convenient for testing code that uses LOG().\n\n#ifndef GLOG_SRC_MOCK_LOG_H_\n#define GLOG_SRC_MOCK_LOG_H_\n\n// For GOOGLE_NAMESPACE. This must go first so we get _XOPEN_SOURCE.\n#include \"utilities.h\"\n\n#include <string>\n\n#include <gmock/gmock.h>\n\n#include \"glog/logging.h\"\n\n_START_GOOGLE_NAMESPACE_\nnamespace glog_testing {\n\n// A ScopedMockLog object intercepts LOG() messages issued during its\n// lifespan.  Using this together with Google C++ Mocking Framework,\n// it's very easy to test how a piece of code calls LOG().  The\n// typical usage:\n//\n//   TEST(FooTest, LogsCorrectly) {\n//     ScopedMockLog log;\n//\n//     // We expect the WARNING \"Something bad!\" exactly twice.\n//     EXPECT_CALL(log, Log(WARNING, _, \"Something bad!\"))\n//         .Times(2);\n//\n//     // We allow foo.cc to call LOG(INFO) any number of times.\n//     EXPECT_CALL(log, Log(INFO, HasSubstr(\"/foo.cc\"), _))\n//         .Times(AnyNumber());\n//\n//     Foo();  // Exercises the code under test.\n//   }\nclass ScopedMockLog : public GOOGLE_NAMESPACE::LogSink {\n public:\n  // When a ScopedMockLog object is constructed, it starts to\n  // intercept logs.\n  ScopedMockLog() { AddLogSink(this); }\n\n  // When the object is destructed, it stops intercepting logs.\n  virtual ~ScopedMockLog() { RemoveLogSink(this); }\n\n  // Implements the mock method:\n  //\n  //   void Log(LogSeverity severity, const string& file_path,\n  //            const string& message);\n  //\n  // The second argument to Send() is the full path of the source file\n  // in which the LOG() was issued.\n  //\n  // Note, that in a multi-threaded environment, all LOG() messages from a\n  // single thread will be handled in sequence, but that cannot be guaranteed\n  // for messages from different threads. In fact, if the same or multiple\n  // expectations are matched on two threads concurrently, their actions will\n  // be executed concurrently as well and may interleave.\n  MOCK_METHOD3(Log, void(GOOGLE_NAMESPACE::LogSeverity severity,\n                         const std::string& file_path,\n                         const std::string& message));\n\n private:\n  // Implements the send() virtual function in class LogSink.\n  // Whenever a LOG() statement is executed, this function will be\n  // invoked with information presented in the LOG().\n  //\n  // The method argument list is long and carries much information a\n  // test usually doesn't care about, so we trim the list before\n  // forwarding the call to Log(), which is much easier to use in\n  // tests.\n  //\n  // We still cannot call Log() directly, as it may invoke other LOG()\n  // messages, either due to Invoke, or due to an error logged in\n  // Google C++ Mocking Framework code, which would trigger a deadlock\n  // since a lock is held during send().\n  //\n  // Hence, we save the message for WaitTillSent() which will be called after\n  // the lock on send() is released, and we'll call Log() inside\n  // WaitTillSent(). Since while a single send() call may be running at a\n  // time, multiple WaitTillSent() calls (along with the one send() call) may\n  // be running simultaneously, we ensure thread-safety of the exchange between\n  // send() and WaitTillSent(), and that for each message, LOG(), send(),\n  // WaitTillSent() and Log() are executed in the same thread.\n  virtual void send(GOOGLE_NAMESPACE::LogSeverity severity,\n                    const char* full_filename,\n                    const char* base_filename, int line, const tm* tm_time,\n                    const char* message, size_t message_len) {\n    // We are only interested in the log severity, full file name, and\n    // log message.\n    message_info_.severity = severity;\n    message_info_.file_path = full_filename;\n    message_info_.message = std::string(message, message_len);\n  }\n\n  // Implements the WaitTillSent() virtual function in class LogSink.\n  // It will be executed after send() and after the global logging lock is\n  // released, so calls within it (or rather within the Log() method called\n  // within) may also issue LOG() statements.\n  //\n  // LOG(), send(), WaitTillSent() and Log() will occur in the same thread for\n  // a given log message.\n  virtual void WaitTillSent() {\n    // First, and very importantly, we save a copy of the message being\n    // processed before calling Log(), since Log() may indirectly call send()\n    // and WaitTillSent() in the same thread again.\n    MessageInfo message_info = message_info_;\n    Log(message_info.severity, message_info.file_path, message_info.message);\n  }\n\n  // All relevant information about a logged message that needs to be passed\n  // from send() to WaitTillSent().\n  struct MessageInfo {\n    GOOGLE_NAMESPACE::LogSeverity severity;\n    std::string file_path;\n    std::string message;\n  };\n  MessageInfo message_info_;\n};\n\n}  // namespace glog_testing\n_END_GOOGLE_NAMESPACE_\n\n#endif  // GLOG_SRC_MOCK_LOG_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/mock-log_test.cc",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Zhanyong Wan\n\n// Tests the ScopedMockLog class.\n\n#include \"mock-log.h\"\n\n#include <string>\n\n#include <gmock/gmock.h>\n#include <gtest/gtest.h>\n\nnamespace {\n\nusing GOOGLE_NAMESPACE::INFO;\nusing GOOGLE_NAMESPACE::WARNING;\nusing GOOGLE_NAMESPACE::ERROR;\nusing GOOGLE_NAMESPACE::glog_testing::ScopedMockLog;\nusing std::string;\nusing testing::_;\nusing testing::HasSubstr;\nusing testing::InSequence;\nusing testing::InvokeWithoutArgs;\n\n// Tests that ScopedMockLog intercepts LOG()s when it's alive.\nTEST(ScopedMockLogTest, InterceptsLog) {\n  ScopedMockLog log;\n\n  InSequence s;\n  EXPECT_CALL(log, Log(WARNING, HasSubstr(\"/mock-log_test.cc\"), \"Fishy.\"));\n  EXPECT_CALL(log, Log(INFO, _, \"Working...\"))\n      .Times(2);\n  EXPECT_CALL(log, Log(ERROR, _, \"Bad!!\"));\n\n  LOG(WARNING) << \"Fishy.\";\n  LOG(INFO) << \"Working...\";\n  LOG(INFO) << \"Working...\";\n  LOG(ERROR) << \"Bad!!\";\n}\n\nvoid LogBranch() {\n  LOG(INFO) << \"Logging a branch...\";\n}\n\nvoid LogTree() {\n  LOG(INFO) << \"Logging the whole tree...\";\n}\n\nvoid LogForest() {\n  LOG(INFO) << \"Logging the entire forest.\";\n  LOG(INFO) << \"Logging the entire forest..\";\n  LOG(INFO) << \"Logging the entire forest...\";\n}\n\n// The purpose of the following test is to verify that intercepting logging\n// continues to work properly if a LOG statement is executed within the scope\n// of a mocked call.\nTEST(ScopedMockLogTest, LogDuringIntercept) {\n  ScopedMockLog log;\n  InSequence s;\n  EXPECT_CALL(log, Log(INFO, __FILE__, \"Logging a branch...\"))\n      .WillOnce(InvokeWithoutArgs(LogTree));\n  EXPECT_CALL(log, Log(INFO, __FILE__, \"Logging the whole tree...\"))\n      .WillOnce(InvokeWithoutArgs(LogForest));\n  EXPECT_CALL(log, Log(INFO, __FILE__, \"Logging the entire forest.\"));\n  EXPECT_CALL(log, Log(INFO, __FILE__, \"Logging the entire forest..\"));\n  EXPECT_CALL(log, Log(INFO, __FILE__, \"Logging the entire forest...\"));\n  LogBranch();\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  GOOGLE_NAMESPACE::InitGoogleLogging(argv[0]);\n  testing::InitGoogleMock(&argc, argv);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/raw_logging.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Maxim Lifantsev\n//\n// logging_unittest.cc covers the functionality herein\n\n#include \"utilities.h\"\n\n#include <stdarg.h>\n#include <stdio.h>\n#include <errno.h>\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>               // for close() and write()\n#endif\n#include <fcntl.h>                 // for open()\n#include <time.h>\n#include \"config.h\"\n#include \"glog/logging.h\"          // To pick up flag settings etc.\n#include \"glog/raw_logging.h\"\n#include \"base/commandlineflags.h\"\n\n#ifdef HAVE_STACKTRACE\n# include \"stacktrace.h\"\n#endif\n\n#if defined(HAVE_SYSCALL_H)\n#include <syscall.h>                 // for syscall()\n#elif defined(HAVE_SYS_SYSCALL_H)\n#include <sys/syscall.h>                 // for syscall()\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\n\n#if defined(HAVE_SYSCALL_H) || defined(HAVE_SYS_SYSCALL_H)\n# define safe_write(fd, s, len)  syscall(SYS_write, fd, s, len)\n#else\n  // Not so safe, but what can you do?\n# define safe_write(fd, s, len)  write(fd, s, len)\n#endif\n\n_START_GOOGLE_NAMESPACE_\n\n// Data for RawLog__ below. We simply pick up the latest\n// time data created by a normal log message to avoid calling\n// localtime_r which can allocate memory.\nstatic struct ::tm last_tm_time_for_raw_log;\nstatic int last_usecs_for_raw_log;\n\nvoid RawLog__SetLastTime(const struct ::tm& t, int usecs) {\n  memcpy(&last_tm_time_for_raw_log, &t, sizeof(last_tm_time_for_raw_log));\n  last_usecs_for_raw_log = usecs;\n}\n\n// CAVEAT: vsnprintf called from *DoRawLog below has some (exotic) code paths\n// that invoke malloc() and getenv() that might acquire some locks.\n// If this becomes a problem we should reimplement a subset of vsnprintf\n// that does not need locks and malloc.\n\n// Helper for RawLog__ below.\n// *DoRawLog writes to *buf of *size and move them past the written portion.\n// It returns true iff there was no overflow or error.\nstatic bool DoRawLog(char** buf, int* size, const char* format, ...) {\n  va_list ap;\n  va_start(ap, format);\n  int n = vsnprintf(*buf, *size, format, ap);\n  va_end(ap);\n  if (n < 0 || n > *size) return false;\n  *size -= n;\n  *buf += n;\n  return true;\n}\n\n// Helper for RawLog__ below.\ninline static bool VADoRawLog(char** buf, int* size,\n                              const char* format, va_list ap) {\n  int n = vsnprintf(*buf, *size, format, ap);\n  if (n < 0 || n > *size) return false;\n  *size -= n;\n  *buf += n;\n  return true;\n}\n\nstatic const int kLogBufSize = 3000;\nstatic bool crashed = false;\nstatic CrashReason crash_reason;\nstatic char crash_buf[kLogBufSize + 1] = { 0 };  // Will end in '\\0'\n\nvoid RawLog__(LogSeverity severity, const char* file, int line,\n              const char* format, ...) {\n  if (!(FLAGS_logtostderr || severity >= FLAGS_stderrthreshold ||\n        FLAGS_alsologtostderr || !IsGoogleLoggingInitialized())) {\n    return;  // this stderr log message is suppressed\n  }\n  // can't call localtime_r here: it can allocate\n  struct ::tm& t = last_tm_time_for_raw_log;\n  char buffer[kLogBufSize];\n  char* buf = buffer;\n  int size = sizeof(buffer);\n\n  // NOTE: this format should match the specification in base/logging.h\n  DoRawLog(&buf, &size, \"%c%02d%02d %02d:%02d:%02d.%06d %5u %s:%d] RAW: \",\n           LogSeverityNames[severity][0],\n           1 + t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec,\n           last_usecs_for_raw_log,\n           static_cast<unsigned int>(GetTID()),\n           const_basename(const_cast<char *>(file)), line);\n\n  // Record the position and size of the buffer after the prefix\n  const char* msg_start = buf;\n  const int msg_size = size;\n\n  va_list ap;\n  va_start(ap, format);\n  bool no_chop = VADoRawLog(&buf, &size, format, ap);\n  va_end(ap);\n  if (no_chop) {\n    DoRawLog(&buf, &size, \"\\n\");\n  } else {\n    DoRawLog(&buf, &size, \"RAW_LOG ERROR: The Message was too long!\\n\");\n  }\n  // We make a raw syscall to write directly to the stderr file descriptor,\n  // avoiding FILE buffering (to avoid invoking malloc()), and bypassing\n  // libc (to side-step any libc interception).\n  // We write just once to avoid races with other invocations of RawLog__.\n  safe_write(STDERR_FILENO, buffer, strlen(buffer));\n  if (severity == FATAL)  {\n    if (!sync_val_compare_and_swap(&crashed, false, true)) {\n      crash_reason.filename = file;\n      crash_reason.line_number = line;\n      memcpy(crash_buf, msg_start, msg_size);  // Don't include prefix\n      crash_reason.message = crash_buf;\n#ifdef HAVE_STACKTRACE\n      crash_reason.depth =\n          GetStackTrace(crash_reason.stack, ARRAYSIZE(crash_reason.stack), 1);\n#else\n      crash_reason.depth = 0;\n#endif\n      SetCrashReason(&crash_reason);\n    }\n    LogMessage::Fail();  // abort()\n  }\n}\n\n_END_GOOGLE_NAMESPACE_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/signalhandler.cc",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Satoru Takabayashi\n//\n// Implementation of InstallFailureSignalHandler().\n\n#include \"utilities.h\"\n#include \"stacktrace.h\"\n#include \"symbolize.h\"\n#include \"glog/logging.h\"\n\n#include <signal.h>\n#include <time.h>\n#ifdef HAVE_UCONTEXT_H\n# include <ucontext.h>\n#endif\n#ifdef HAVE_SYS_UCONTEXT_H\n# include <sys/ucontext.h>\n#endif\n#include <algorithm>\n\n_START_GOOGLE_NAMESPACE_\n\nnamespace {\n\n// We'll install the failure signal handler for these signals.  We could\n// use strsignal() to get signal names, but we don't use it to avoid\n// introducing yet another #ifdef complication.\n//\n// The list should be synced with the comment in signalhandler.h.\nconst struct {\n  int number;\n  const char *name;\n} kFailureSignals[] = {\n  { SIGSEGV, \"SIGSEGV\" },\n  { SIGILL, \"SIGILL\" },\n  { SIGFPE, \"SIGFPE\" },\n  { SIGABRT, \"SIGABRT\" },\n  { SIGBUS, \"SIGBUS\" },\n  { SIGTERM, \"SIGTERM\" },\n};\n\n// Returns the program counter from signal context, NULL if unknown.\nvoid* GetPC(void* ucontext_in_void) {\n#if (defined(HAVE_UCONTEXT_H) || defined(HAVE_SYS_UCONTEXT_H)) && defined(PC_FROM_UCONTEXT)\n  if (ucontext_in_void != NULL) {\n    ucontext_t *context = reinterpret_cast<ucontext_t *>(ucontext_in_void);\n    return (void*)context->PC_FROM_UCONTEXT;\n  }\n#endif\n  return NULL;\n}\n\n// The class is used for formatting error messages.  We don't use printf()\n// as it's not async signal safe.\nclass MinimalFormatter {\n public:\n  MinimalFormatter(char *buffer, int size)\n      : buffer_(buffer),\n        cursor_(buffer),\n        end_(buffer + size) {\n  }\n\n  // Returns the number of bytes written in the buffer.\n  int num_bytes_written() const { return cursor_ - buffer_; }\n\n  // Appends string from \"str\" and updates the internal cursor.\n  void AppendString(const char* str) {\n    int i = 0;\n    while (str[i] != '\\0' && cursor_ + i < end_) {\n      cursor_[i] = str[i];\n      ++i;\n    }\n    cursor_ += i;\n  }\n\n  // Formats \"number\" in \"radix\" and updates the internal cursor.\n  // Lowercase letters are used for 'a' - 'z'.\n  void AppendUint64(uint64 number, int radix) {\n    int i = 0;\n    while (cursor_ + i < end_) {\n      const int tmp = number % radix;\n      number /= radix;\n      cursor_[i] = (tmp < 10 ? '0' + tmp : 'a' + tmp - 10);\n      ++i;\n      if (number == 0) {\n        break;\n      }\n    }\n    // Reverse the bytes written.\n    std::reverse(cursor_, cursor_ + i);\n    cursor_ += i;\n  }\n\n  // Formats \"number\" as hexadecimal number, and updates the internal\n  // cursor.  Padding will be added in front if needed.\n  void AppendHexWithPadding(uint64 number, int width) {\n    char* start = cursor_;\n    AppendString(\"0x\");\n    AppendUint64(number, 16);\n    // Move to right and add padding in front if needed.\n    if (cursor_ < start + width) {\n      const int64 delta = start + width - cursor_;\n      std::copy(start, cursor_, start + delta);\n      std::fill(start, start + delta, ' ');\n      cursor_ = start + width;\n    }\n  }\n\n private:\n  char *buffer_;\n  char *cursor_;\n  const char * const end_;\n};\n\n// Writes the given data with the size to the standard error.\nvoid WriteToStderr(const char* data, int size) {\n  if (write(STDERR_FILENO, data, size) < 0) {\n    // Ignore errors.\n  }\n}\n\n// The writer function can be changed by InstallFailureWriter().\nvoid (*g_failure_writer)(const char* data, int size) = WriteToStderr;\n\n// Dumps time information.  We don't dump human-readable time information\n// as localtime() is not guaranteed to be async signal safe.\nvoid DumpTimeInfo() {\n  time_t time_in_sec = time(NULL);\n  char buf[256];  // Big enough for time info.\n  MinimalFormatter formatter(buf, sizeof(buf));\n  formatter.AppendString(\"*** Aborted at \");\n  formatter.AppendUint64(time_in_sec, 10);\n  formatter.AppendString(\" (unix time)\");\n  formatter.AppendString(\" try \\\"date -d @\");\n  formatter.AppendUint64(time_in_sec, 10);\n  formatter.AppendString(\"\\\" if you are using GNU date ***\\n\");\n  g_failure_writer(buf, formatter.num_bytes_written());\n}\n\n// Dumps information about the signal to STDERR.\nvoid DumpSignalInfo(int signal_number, siginfo_t *siginfo) {\n  // Get the signal name.\n  const char* signal_name = NULL;\n  for (int i = 0; i < ARRAYSIZE(kFailureSignals); ++i) {\n    if (signal_number == kFailureSignals[i].number) {\n      signal_name = kFailureSignals[i].name;\n    }\n  }\n\n  char buf[256];  // Big enough for signal info.\n  MinimalFormatter formatter(buf, sizeof(buf));\n\n  formatter.AppendString(\"*** \");\n  if (signal_name) {\n    formatter.AppendString(signal_name);\n  } else {\n    // Use the signal number if the name is unknown.  The signal name\n    // should be known, but just in case.\n    formatter.AppendString(\"Signal \");\n    formatter.AppendUint64(signal_number, 10);\n  }\n  formatter.AppendString(\" (@0x\");\n  formatter.AppendUint64(reinterpret_cast<uintptr_t>(siginfo->si_addr), 16);\n  formatter.AppendString(\")\");\n  formatter.AppendString(\" received by PID \");\n  formatter.AppendUint64(getpid(), 10);\n  formatter.AppendString(\" (TID 0x\");\n  // We assume pthread_t is an integral number or a pointer, rather\n  // than a complex struct.  In some environments, pthread_self()\n  // returns an uint64 but in some other environments pthread_self()\n  // returns a pointer.  Hence we use C-style cast here, rather than\n  // reinterpret/static_cast, to support both types of environments.\n  formatter.AppendUint64((uintptr_t)pthread_self(), 16);\n  formatter.AppendString(\") \");\n  // Only linux has the PID of the signal sender in si_pid.\n#ifdef OS_LINUX\n  formatter.AppendString(\"from PID \");\n  formatter.AppendUint64(siginfo->si_pid, 10);\n  formatter.AppendString(\"; \");\n#endif\n  formatter.AppendString(\"stack trace: ***\\n\");\n  g_failure_writer(buf, formatter.num_bytes_written());\n}\n\n// Dumps information about the stack frame to STDERR.\nvoid DumpStackFrameInfo(const char* prefix, void* pc) {\n  // Get the symbol name.\n  const char *symbol = \"(unknown)\";\n  char symbolized[1024];  // Big enough for a sane symbol.\n  // Symbolizes the previous address of pc because pc may be in the\n  // next function.\n  if (Symbolize(reinterpret_cast<char *>(pc) - 1,\n                symbolized, sizeof(symbolized))) {\n    symbol = symbolized;\n  }\n\n  char buf[1024];  // Big enough for stack frame info.\n  MinimalFormatter formatter(buf, sizeof(buf));\n\n  formatter.AppendString(prefix);\n  formatter.AppendString(\"@ \");\n  const int width = 2 * sizeof(void*) + 2;  // + 2  for \"0x\".\n  formatter.AppendHexWithPadding(reinterpret_cast<uintptr_t>(pc), width);\n  formatter.AppendString(\" \");\n  formatter.AppendString(symbol);\n  formatter.AppendString(\"\\n\");\n  g_failure_writer(buf, formatter.num_bytes_written());\n}\n\n// Invoke the default signal handler.\nvoid InvokeDefaultSignalHandler(int signal_number) {\n  struct sigaction sig_action;\n  memset(&sig_action, 0, sizeof(sig_action));\n  sigemptyset(&sig_action.sa_mask);\n  sig_action.sa_handler = SIG_DFL;\n  sigaction(signal_number, &sig_action, NULL);\n  kill(getpid(), signal_number);\n}\n\n// This variable is used for protecting FailureSignalHandler() from\n// dumping stuff while another thread is doing it.  Our policy is to let\n// the first thread dump stuff and let other threads wait.\n// See also comments in FailureSignalHandler().\nstatic pthread_t* g_entered_thread_id_pointer = NULL;\n\n// Dumps signal and stack frame information, and invokes the default\n// signal handler once our job is done.\nvoid FailureSignalHandler(int signal_number,\n                          siginfo_t *signal_info,\n                          void *ucontext) {\n  // First check if we've already entered the function.  We use an atomic\n  // compare and swap operation for platforms that support it.  For other\n  // platforms, we use a naive method that could lead to a subtle race.\n\n  // We assume pthread_self() is async signal safe, though it's not\n  // officially guaranteed.\n  pthread_t my_thread_id = pthread_self();\n  // NOTE: We could simply use pthread_t rather than pthread_t* for this,\n  // if pthread_self() is guaranteed to return non-zero value for thread\n  // ids, but there is no such guarantee.  We need to distinguish if the\n  // old value (value returned from __sync_val_compare_and_swap) is\n  // different from the original value (in this case NULL).\n  pthread_t* old_thread_id_pointer =\n      glog_internal_namespace_::sync_val_compare_and_swap(\n          &g_entered_thread_id_pointer,\n          static_cast<pthread_t*>(NULL),\n          &my_thread_id);\n  if (old_thread_id_pointer != NULL) {\n    // We've already entered the signal handler.  What should we do?\n    if (pthread_equal(my_thread_id, *g_entered_thread_id_pointer)) {\n      // It looks the current thread is reentering the signal handler.\n      // Something must be going wrong (maybe we are reentering by another\n      // type of signal?).  Kill ourself by the default signal handler.\n      InvokeDefaultSignalHandler(signal_number);\n    }\n    // Another thread is dumping stuff.  Let's wait until that thread\n    // finishes the job and kills the process.\n    while (true) {\n      sleep(1);\n    }\n  }\n  // This is the first time we enter the signal handler.  We are going to\n  // do some interesting stuff from here.\n  // TODO(satorux): We might want to set timeout here using alarm(), but\n  // mixing alarm() and sleep() can be a bad idea.\n\n  // First dump time info.\n  DumpTimeInfo();\n\n  // Get the program counter from ucontext.\n  void *pc = GetPC(ucontext);\n  DumpStackFrameInfo(\"PC: \", pc);\n\n#ifdef HAVE_STACKTRACE\n  // Get the stack traces.\n  void *stack[32];\n  // +1 to exclude this function.\n  const int depth = GetStackTrace(stack, ARRAYSIZE(stack), 1);\n  DumpSignalInfo(signal_number, signal_info);\n  // Dump the stack traces.\n  for (int i = 0; i < depth; ++i) {\n    DumpStackFrameInfo(\"    \", stack[i]);\n  }\n#endif\n\n  // *** TRANSITION ***\n  //\n  // BEFORE this point, all code must be async-termination-safe!\n  // (See WARNING above.)\n  //\n  // AFTER this point, we do unsafe things, like using LOG()!\n  // The process could be terminated or hung at any time.  We try to\n  // do more useful things first and riskier things later.\n\n  // Flush the logs before we do anything in case 'anything'\n  // causes problems.\n  FlushLogFilesUnsafe(0);\n\n  // Kill ourself by the default signal handler.\n  InvokeDefaultSignalHandler(signal_number);\n}\n\n}  // namespace\n\nvoid InstallFailureSignalHandler() {\n  // Build the sigaction struct.\n  struct sigaction sig_action;\n  memset(&sig_action, 0, sizeof(sig_action));\n  sigemptyset(&sig_action.sa_mask);\n  sig_action.sa_flags |= SA_SIGINFO;\n  sig_action.sa_sigaction = &FailureSignalHandler;\n\n  for (int i = 0; i < ARRAYSIZE(kFailureSignals); ++i) {\n    CHECK_ERR(sigaction(kFailureSignals[i].number, &sig_action, NULL));\n  }\n}\n\nvoid InstallFailureWriter(void (*writer)(const char* data, int size)) {\n  g_failure_writer = writer;\n}\n\n_END_GOOGLE_NAMESPACE_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/signalhandler_unittest.cc",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Satoru Takabayashi\n//\n// This is a helper binary for testing signalhandler.cc.  The actual test\n// is done in signalhandler_unittest.sh.\n\n#include \"utilities.h\"\n\n#include <pthread.h>\n#include <signal.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string>\n#include \"glog/logging.h\"\n\nusing namespace GOOGLE_NAMESPACE;\n\nvoid* DieInThread(void*) {\n  // We assume pthread_t is an integral number or a pointer, rather\n  // than a complex struct.  In some environments, pthread_self()\n  // returns an uint64 but in some other environments pthread_self()\n  // returns a pointer.  Hence we use C-style cast here, rather than\n  // reinterpret/static_cast, to support both types of environments.\n  fprintf(stderr, \"0x%lx is dying\\n\", (long)pthread_self());\n  // Use volatile to prevent from these to be optimized away.\n  volatile int a = 0;\n  volatile int b = 1 / a;\n  fprintf(stderr, \"We should have died: b=%d\\n\", b);\n  return NULL;\n}\n\nvoid WriteToStdout(const char* data, int size) {\n  if (write(STDOUT_FILENO, data, size) < 0) {\n    // Ignore errors.\n  }\n}\n\nint main(int argc, char **argv) {\n#if defined(HAVE_STACKTRACE) && defined(HAVE_SYMBOLIZE)\n  InitGoogleLogging(argv[0]);\n#ifdef HAVE_LIB_GFLAGS\n  ParseCommandLineFlags(&argc, &argv, true);\n#endif\n  InstallFailureSignalHandler();\n  const std::string command = argc > 1 ? argv[1] : \"none\";\n  if (command == \"segv\") {\n    // We'll check if this is outputted.\n    LOG(INFO) << \"create the log file\";\n    LOG(INFO) << \"a message before segv\";\n    // We assume 0xDEAD is not writable.\n    int *a = (int*)0xDEAD;\n    *a = 0;\n  } else if (command == \"loop\") {\n    fprintf(stderr, \"looping\\n\");\n    while (true);\n  } else if (command == \"die_in_thread\") {\n    pthread_t thread;\n    pthread_create(&thread, NULL, &DieInThread, NULL);\n    pthread_join(thread, NULL);\n  } else if (command == \"dump_to_stdout\") {\n    InstallFailureWriter(WriteToStdout);\n    abort();\n  } else {\n    // Tell the shell script\n    puts(\"OK\");\n  }\n#endif\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/signalhandler_unittest.sh",
    "content": "#! /bin/sh\n#\n# Copyright (c) 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# Author: Satoru Takabayashi\n#\n# Unit tests for signalhandler.cc.\n\ndie () {\n    echo $1\n    exit 1\n}\n\nBINDIR=\".libs\"\nLIBGLOG=\"$BINDIR/libglog.so\"\n\nBINARY=\"$BINDIR/signalhandler_unittest\"\nLOG_INFO=\"./signalhandler_unittest.INFO\"\n\n# Remove temporary files.\nrm -f signalhandler.out*\n\nif test -e \"$BINARY\"; then\n  # We need shared object.\n  export LD_LIBRARY_PATH=$BINDIR\n  export DYLD_LIBRARY_PATH=$BINDIR\nelse\n  # For windows\n  BINARY=\"./signalhandler_unittest.exe\"\n  if ! test -e \"$BINARY\"; then\n    echo \"We coundn't find demangle_unittest binary.\"\n    exit 1\n  fi\nfi\n\nif [ x`$BINARY` != 'xOK' ]; then\n  echo \"PASS (No stacktrace support. We don't run this test.)\"\n  exit 0\nfi\n\n# The PC cannot be obtained in signal handlers on PowerPC correctly.\n# We just skip the test for PowerPC.\nif [ x`uname -p` = x\"powerpc\" ]; then\n  echo \"PASS (We don't test the signal handler on PowerPC.)\"\n  exit 0\nfi\n\n# Test for a case the program kills itself by SIGSEGV.\nGOOGLE_LOG_DIR=. $BINARY segv 2> signalhandler.out1\nfor pattern in SIGSEGV 0xdead main \"Aborted at [0-9]\"; do\n  if ! grep --quiet \"$pattern\" signalhandler.out1; then\n    die \"'$pattern' should appear in the output\"\n  fi\ndone\nif ! grep --quiet \"a message before segv\" $LOG_INFO; then\n  die \"'a message before segv' should appear in the INFO log\"\nfi\nrm -f $LOG_INFO\n\n# Test for a case the program is killed by this shell script.\n# $! = the process id of the last command run in the background.\n# $$ = the process id of this shell.\n$BINARY loop 2> signalhandler.out2 &\n# Wait until \"looping\" is written in the file.  This indicates the program\n# is ready to accept signals.\nwhile true; do\n  if grep --quiet looping signalhandler.out2; then\n    break\n  fi\ndone\nkill -TERM $!\nwait $!\n\nfrom_pid=''\n# Only linux has the process ID of the signal sender.\nif [ x`uname` = \"xLinux\" ]; then\n  from_pid=\"from PID $$\"\nfi\nfor pattern in SIGTERM \"by PID $!\" \"$from_pid\" main \"Aborted at [0-9]\"; do\n  if ! grep --quiet \"$pattern\" signalhandler.out2; then\n    die \"'$pattern' should appear in the output\"\n  fi\ndone\n\n# Test for a case the program dies in a non-main thread.\n$BINARY die_in_thread 2> signalhandler.out3\nEXPECTED_TID=\"`sed 's/ .*//' signalhandler.out3`\"\n\nfor pattern in SIGFPE DieInThread \"TID $EXPECTED_TID\" \"Aborted at [0-9]\"; do\n  if ! grep --quiet \"$pattern\" signalhandler.out3; then\n    die \"'$pattern' should appear in the output\"\n  fi\ndone\n\n# Test for a case the program installs a custom failure writer that writes\n# stuff to stdout instead of stderr.\n$BINARY dump_to_stdout 1> signalhandler.out4\nfor pattern in SIGABRT main \"Aborted at [0-9]\"; do\n  if ! grep --quiet \"$pattern\" signalhandler.out4; then\n    die \"'$pattern' should appear in the output\"\n  fi\ndone\n\necho PASS\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/stacktrace.h",
    "content": "// Copyright (c) 2000 - 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Routines to extract the current stack trace.  These functions are\n// thread-safe.\n\n#ifndef BASE_STACKTRACE_H_\n#define BASE_STACKTRACE_H_\n\n#include \"config.h\"\n\n_START_GOOGLE_NAMESPACE_\n\n// This is similar to the GetStackFrames routine, except that it returns\n// the stack trace only, and not the stack frame sizes as well.\n// Example:\n//      main() { foo(); }\n//      foo() { bar(); }\n//      bar() {\n//        void* result[10];\n//        int depth = GetStackFrames(result, 10, 1);\n//      }\n//\n// This produces:\n//      result[0]       foo\n//      result[1]       main\n//           ....       ...\n//\n// \"result\" must not be NULL.\nextern int GetStackTrace(void** result, int max_depth, int skip_count);\n\n_END_GOOGLE_NAMESPACE_\n\n#endif  // BASE_STACKTRACE_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/stacktrace_generic-inl.h",
    "content": "// Copyright (c) 2000 - 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Portable implementation - just use glibc\n//\n// Note:  The glibc implementation may cause a call to malloc.\n// This can cause a deadlock in HeapProfiler.\n#include <execinfo.h>\n#include <string.h>\n#include \"stacktrace.h\"\n\n_START_GOOGLE_NAMESPACE_\n\n// If you change this function, also change GetStackFrames below.\nint GetStackTrace(void** result, int max_depth, int skip_count) {\n  static const int kStackLength = 64;\n  void * stack[kStackLength];\n  int size;\n\n  size = backtrace(stack, kStackLength);\n  skip_count++;  // we want to skip the current frame as well\n  int result_count = size - skip_count;\n  if (result_count < 0)\n    result_count = 0;\n  if (result_count > max_depth)\n    result_count = max_depth;\n  for (int i = 0; i < result_count; i++)\n    result[i] = stack[i + skip_count];\n\n  return result_count;\n}\n\n_END_GOOGLE_NAMESPACE_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/stacktrace_libunwind-inl.h",
    "content": "// Copyright (c) 2005 - 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Arun Sharma\n//\n// Produce stack trace using libunwind\n\n#include \"utilities.h\"\n\nextern \"C\" {\n#define UNW_LOCAL_ONLY\n#include <libunwind.h>\n}\n#include \"glog/raw_logging.h\"\n#include \"stacktrace.h\"\n\n_START_GOOGLE_NAMESPACE_\n\n// Sometimes, we can try to get a stack trace from within a stack\n// trace, because libunwind can call mmap (maybe indirectly via an\n// internal mmap based memory allocator), and that mmap gets trapped\n// and causes a stack-trace request.  If were to try to honor that\n// recursive request, we'd end up with infinite recursion or deadlock.\n// Luckily, it's safe to ignore those subsequent traces.  In such\n// cases, we return 0 to indicate the situation.\nstatic bool g_now_entering = false;\n\n// If you change this function, also change GetStackFrames below.\nint GetStackTrace(void** result, int max_depth, int skip_count) {\n  void *ip;\n  int n = 0;\n  unw_cursor_t cursor;\n  unw_context_t uc;\n\n  if (sync_val_compare_and_swap(&g_now_entering, false, true)) {\n    return 0;\n  }\n\n  unw_getcontext(&uc);\n  RAW_CHECK(unw_init_local(&cursor, &uc) >= 0, \"unw_init_local failed\");\n  skip_count++;         // Do not include the \"GetStackTrace\" frame\n\n  while (n < max_depth) {\n    int ret = unw_get_reg(&cursor, UNW_REG_IP, (unw_word_t *) &ip);\n    if (ret < 0)\n      break;\n    if (skip_count > 0) {\n      skip_count--;\n    } else {\n      result[n++] = ip;\n    }\n    ret = unw_step(&cursor);\n    if (ret <= 0)\n      break;\n  }\n\n  g_now_entering = false;\n  return n;\n}\n\n_END_GOOGLE_NAMESPACE_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/stacktrace_powerpc-inl.h",
    "content": "// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Craig Silverstein\n//\n// Produce stack trace.  I'm guessing (hoping!) the code is much like\n// for x86.  For apple machines, at least, it seems to be; see\n//    http://developer.apple.com/documentation/mac/runtimehtml/RTArch-59.html\n//    http://www.linux-foundation.org/spec/ELF/ppc64/PPC-elf64abi-1.9.html#STACK\n// Linux has similar code: http://patchwork.ozlabs.org/linuxppc/patch?id=8882\n\n#include <stdio.h>\n#include <stdint.h>   // for uintptr_t\n#include \"stacktrace.h\"\n\n_START_GOOGLE_NAMESPACE_\n\n// Given a pointer to a stack frame, locate and return the calling\n// stackframe, or return NULL if no stackframe can be found. Perform sanity\n// checks (the strictness of which is controlled by the boolean parameter\n// \"STRICT_UNWINDING\") to reduce the chance that a bad pointer is returned.\ntemplate<bool STRICT_UNWINDING>\nstatic void **NextStackFrame(void **old_sp) {\n  void **new_sp = (void **) *old_sp;\n\n  // Check that the transition from frame pointer old_sp to frame\n  // pointer new_sp isn't clearly bogus\n  if (STRICT_UNWINDING) {\n    // With the stack growing downwards, older stack frame must be\n    // at a greater address that the current one.\n    if (new_sp <= old_sp) return NULL;\n    // Assume stack frames larger than 100,000 bytes are bogus.\n    if ((uintptr_t)new_sp - (uintptr_t)old_sp > 100000) return NULL;\n  } else {\n    // In the non-strict mode, allow discontiguous stack frames.\n    // (alternate-signal-stacks for example).\n    if (new_sp == old_sp) return NULL;\n    // And allow frames upto about 1MB.\n    if ((new_sp > old_sp)\n        && ((uintptr_t)new_sp - (uintptr_t)old_sp > 1000000)) return NULL;\n  }\n  if ((uintptr_t)new_sp & (sizeof(void *) - 1)) return NULL;\n  return new_sp;\n}\n\n// This ensures that GetStackTrace stes up the Link Register properly.\nvoid StacktracePowerPCDummyFunction() __attribute__((noinline));\nvoid StacktracePowerPCDummyFunction() { __asm__ volatile(\"\"); }\n\n// If you change this function, also change GetStackFrames below.\nint GetStackTrace(void** result, int max_depth, int skip_count) {\n  void **sp;\n  // Apple OS X uses an old version of gnu as -- both Darwin 7.9.0 (Panther)\n  // and Darwin 8.8.1 (Tiger) use as 1.38.  This means we have to use a\n  // different asm syntax.  I don't know quite the best way to discriminate\n  // systems using the old as from the new one; I've gone with __APPLE__.\n#ifdef __APPLE__\n  __asm__ volatile (\"mr %0,r1\" : \"=r\" (sp));\n#else\n  __asm__ volatile (\"mr %0,1\" : \"=r\" (sp));\n#endif\n\n  // On PowerPC, the \"Link Register\" or \"Link Record\" (LR), is a stack\n  // entry that holds the return address of the subroutine call (what\n  // instruction we run after our function finishes).  This is the\n  // same as the stack-pointer of our parent routine, which is what we\n  // want here.  While the compiler will always(?) set up LR for\n  // subroutine calls, it may not for leaf functions (such as this one).\n  // This routine forces the compiler (at least gcc) to push it anyway.\n  StacktracePowerPCDummyFunction();\n\n  // The LR save area is used by the callee, so the top entry is bogus.\n  skip_count++;\n\n  int n = 0;\n  while (sp && n < max_depth) {\n    if (skip_count > 0) {\n      skip_count--;\n    } else {\n      // PowerPC has 3 main ABIs, which say where in the stack the\n      // Link Register is.  For DARWIN and AIX (used by apple and\n      // linux ppc64), it's in sp[2].  For SYSV (used by linux ppc),\n      // it's in sp[1].\n#if defined(_CALL_AIX) || defined(_CALL_DARWIN)\n      result[n++] = *(sp+2);\n#elif defined(_CALL_SYSV)\n      result[n++] = *(sp+1);\n#elif defined(__APPLE__) || (defined(__linux) && defined(__PPC64__))\n      // This check is in case the compiler doesn't define _CALL_AIX/etc.\n      result[n++] = *(sp+2);\n#elif defined(__linux)\n      // This check is in case the compiler doesn't define _CALL_SYSV.\n      result[n++] = *(sp+1);\n#else\n#error Need to specify the PPC ABI for your archiecture.\n#endif\n    }\n    // Use strict unwinding rules.\n    sp = NextStackFrame<true>(sp);\n  }\n  return n;\n}\n\n_END_GOOGLE_NAMESPACE_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/stacktrace_unittest.cc",
    "content": "// Copyright (c) 2004, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"utilities.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include \"config.h\"\n#include \"base/commandlineflags.h\"\n#include \"glog/logging.h\"\n#include \"stacktrace.h\"\n\n#ifdef HAVE_EXECINFO_H\n# include <execinfo.h>\n#endif\n\nusing namespace GOOGLE_NAMESPACE;\n\n#ifdef HAVE_STACKTRACE\n\n// Obtain a backtrace, verify that the expected callers are present in the\n// backtrace, and maybe print the backtrace to stdout.\n\n//-----------------------------------------------------------------------//\nvoid CheckStackTraceLeaf();\nvoid CheckStackTrace4(int i);\nvoid CheckStackTrace3(int i);\nvoid CheckStackTrace2(int i);\nvoid CheckStackTrace1(int i);\nvoid CheckStackTrace(int i);\n//-----------------------------------------------------------------------//\n\n// The sequence of functions whose return addresses we expect to see in the\n// backtrace.\nconst int BACKTRACE_STEPS = 6;\nvoid * expected_stack[BACKTRACE_STEPS] = {\n  (void *) &CheckStackTraceLeaf,\n  (void *) &CheckStackTrace4,\n  (void *) &CheckStackTrace3,\n  (void *) &CheckStackTrace2,\n  (void *) &CheckStackTrace1,\n  (void *) &CheckStackTrace,\n};\n\n// Depending on the architecture/compiler/libraries, (not sure which)\n// the current function may or may not appear in the backtrace.\n// For gcc-2:\n//\n// stack[0] is ret addr within CheckStackTrace4\n// stack[1] is ret addr within CheckStackTrace3\n// stack[2] is ret addr within CheckStackTrace2\n// stack[3] is ret addr within CheckStackTrace1\n// stack[4] is ret addr within CheckStackTrace\n//\n// For gcc3-k8:\n//\n// stack[0] is ret addr within CheckStackTraceLeaf\n// stack[1] is ret addr within CheckStackTrace4\n// ...\n// stack[5] is ret addr within CheckStackTrace\n\n//-----------------------------------------------------------------------//\n\nconst int kMaxFnLen = 0x40; // assume relevant functions are only this long\n\nvoid CheckRetAddrIsInFunction( void * ret_addr, void * function_start_addr)\n{\n  CHECK_GE(ret_addr, function_start_addr);\n  CHECK_LE(ret_addr, (void *) ((char *) function_start_addr + kMaxFnLen));\n}\n\n//-----------------------------------------------------------------------//\n\nvoid CheckStackTraceLeaf(void) {\n  const int STACK_LEN = 10;\n  void *stack[STACK_LEN];\n  int size;\n\n  size = GetStackTrace(stack, STACK_LEN, 0);\n  printf(\"Obtained %d stack frames.\\n\", size);\n  CHECK_LE(size, STACK_LEN);\n\n  if (1) {\n#ifdef HAVE_EXECINFO_H\n    char **strings = backtrace_symbols(stack, size);\n    printf(\"Obtained %d stack frames.\\n\", size);\n    for (int i = 0; i < size; i++)\n      printf(\"%s %p\\n\", strings[i], stack[i]);\n    printf(\"CheckStackTrace() addr: %p\\n\", &CheckStackTrace);\n    free(strings);\n#endif\n  }\n  for (int i = 0; i < BACKTRACE_STEPS; i++) {\n    printf(\"Backtrace %d: expected: %p..%p  actual: %p ... \",\n           i, expected_stack[i],\n           reinterpret_cast<char*>(expected_stack[i]) + kMaxFnLen, stack[i]);\n    CheckRetAddrIsInFunction(stack[i], expected_stack[i]);\n    printf(\"OK\\n\");\n  }\n\n  // Check if the second stacktrace returns the same size.\n  CHECK_EQ(size, GetStackTrace(stack, STACK_LEN, 0));\n}\n\n//-----------------------------------------------------------------------//\n\n/* Dummy functions to make the backtrace more interesting. */\nvoid CheckStackTrace4(int i) { for (int j = i; j >= 0; j--) CheckStackTraceLeaf(); }\nvoid CheckStackTrace3(int i) { for (int j = i; j >= 0; j--) CheckStackTrace4(j); }\nvoid CheckStackTrace2(int i) { for (int j = i; j >= 0; j--) CheckStackTrace3(j); }\nvoid CheckStackTrace1(int i) { for (int j = i; j >= 0; j--) CheckStackTrace2(j); }\nvoid CheckStackTrace(int i)  { for (int j = i; j >= 0; j--) CheckStackTrace1(j); }\n\n//-----------------------------------------------------------------------//\n\nint main(int argc, char ** argv) {\n  FLAGS_logtostderr = true;\n  InitGoogleLogging(argv[0]);\n  \n  CheckStackTrace(0);\n  \n  printf(\"PASS\\n\");\n  return 0;\n}\n\n#else\nint main() {\n  printf(\"PASS (no stacktrace support)\\n\");\n  return 0;\n}\n#endif  // HAVE_STACKTRACE\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/stacktrace_x86-inl.h",
    "content": "// Copyright (c) 2000 - 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Produce stack trace\n\n#include <stdint.h>   // for uintptr_t\n\n#include \"utilities.h\"   // for OS_* macros\n\n#if !defined(OS_WINDOWS)\n#include <unistd.h>\n#include <sys/mman.h>\n#endif\n\n#include <stdio.h>  // for NULL\n#include \"stacktrace.h\"\n\n_START_GOOGLE_NAMESPACE_\n\n// Given a pointer to a stack frame, locate and return the calling\n// stackframe, or return NULL if no stackframe can be found. Perform sanity\n// checks (the strictness of which is controlled by the boolean parameter\n// \"STRICT_UNWINDING\") to reduce the chance that a bad pointer is returned.\ntemplate<bool STRICT_UNWINDING>\nstatic void **NextStackFrame(void **old_sp) {\n  void **new_sp = (void **) *old_sp;\n\n  // Check that the transition from frame pointer old_sp to frame\n  // pointer new_sp isn't clearly bogus\n  if (STRICT_UNWINDING) {\n    // With the stack growing downwards, older stack frame must be\n    // at a greater address that the current one.\n    if (new_sp <= old_sp) return NULL;\n    // Assume stack frames larger than 100,000 bytes are bogus.\n    if ((uintptr_t)new_sp - (uintptr_t)old_sp > 100000) return NULL;\n  } else {\n    // In the non-strict mode, allow discontiguous stack frames.\n    // (alternate-signal-stacks for example).\n    if (new_sp == old_sp) return NULL;\n    // And allow frames upto about 1MB.\n    if ((new_sp > old_sp)\n        && ((uintptr_t)new_sp - (uintptr_t)old_sp > 1000000)) return NULL;\n  }\n  if ((uintptr_t)new_sp & (sizeof(void *) - 1)) return NULL;\n#ifdef __i386__\n  // On 64-bit machines, the stack pointer can be very close to\n  // 0xffffffff, so we explicitly check for a pointer into the\n  // last two pages in the address space\n  if ((uintptr_t)new_sp >= 0xffffe000) return NULL;\n#endif\n#if !defined(OS_WINDOWS)\n  if (!STRICT_UNWINDING) {\n    // Lax sanity checks cause a crash in 32-bit tcmalloc/crash_reason_test\n    // on AMD-based machines with VDSO-enabled kernels.\n    // Make an extra sanity check to insure new_sp is readable.\n    // Note: NextStackFrame<false>() is only called while the program\n    //       is already on its last leg, so it's ok to be slow here.\n    static int page_size = getpagesize();\n    void *new_sp_aligned = (void *)((uintptr_t)new_sp & ~(page_size - 1));\n    if (msync(new_sp_aligned, page_size, MS_ASYNC) == -1)\n      return NULL;\n  }\n#endif\n  return new_sp;\n}\n\n// If you change this function, also change GetStackFrames below.\nint GetStackTrace(void** result, int max_depth, int skip_count) {\n  void **sp;\n#ifdef __i386__\n  // Stack frame format:\n  //    sp[0]   pointer to previous frame\n  //    sp[1]   caller address\n  //    sp[2]   first argument\n  //    ...\n  sp = (void **)&result - 2;\n#endif\n\n#ifdef __x86_64__\n  // __builtin_frame_address(0) can return the wrong address on gcc-4.1.0-k8\n  unsigned long rbp;\n  // Move the value of the register %rbp into the local variable rbp.\n  // We need 'volatile' to prevent this instruction from getting moved\n  // around during optimization to before function prologue is done.\n  // An alternative way to achieve this\n  // would be (before this __asm__ instruction) to call Noop() defined as\n  //   static void Noop() __attribute__ ((noinline));  // prevent inlining\n  //   static void Noop() { asm(\"\"); }  // prevent optimizing-away\n  __asm__ volatile (\"mov %%rbp, %0\" : \"=r\" (rbp));\n  // Arguments are passed in registers on x86-64, so we can't just\n  // offset from &result\n  sp = (void **) rbp;\n#endif\n\n  int n = 0;\n  while (sp && n < max_depth) {\n    if (*(sp+1) == (void *)0) {\n      // In 64-bit code, we often see a frame that\n      // points to itself and has a return address of 0.\n      break;\n    }\n    if (skip_count > 0) {\n      skip_count--;\n    } else {\n      result[n++] = *(sp+1);\n    }\n    // Use strict unwinding rules.\n    sp = NextStackFrame<true>(sp);\n  }\n  return n;\n}\n\n_END_GOOGLE_NAMESPACE_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/stacktrace_x86_64-inl.h",
    "content": "// Copyright (c) 2005 - 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Arun Sharma\n//\n// Produce stack trace using libgcc\n\nextern \"C\" {\n#include <stdlib.h> // for NULL\n#include <unwind.h> // ABI defined unwinder\n}\n#include \"stacktrace.h\"\n\n_START_GOOGLE_NAMESPACE_\n\ntypedef struct {\n  void **result;\n  int max_depth;\n  int skip_count;\n  int count;\n} trace_arg_t;\n\n\n// Workaround for the malloc() in _Unwind_Backtrace() issue.\nstatic _Unwind_Reason_Code nop_backtrace(struct _Unwind_Context *uc, void *opq) {\n  return _URC_NO_REASON;\n}\n\n\n// This code is not considered ready to run until\n// static initializers run so that we are guaranteed\n// that any malloc-related initialization is done.\nstatic bool ready_to_run = false;\nclass StackTraceInit {\n public:\n   StackTraceInit() {\n     // Extra call to force initialization\n     _Unwind_Backtrace(nop_backtrace, NULL);\n     ready_to_run = true;\n   }\n};\n\nstatic StackTraceInit module_initializer;  // Force initialization\n\nstatic _Unwind_Reason_Code GetOneFrame(struct _Unwind_Context *uc, void *opq) {\n  trace_arg_t *targ = (trace_arg_t *) opq;\n\n  if (targ->skip_count > 0) {\n    targ->skip_count--;\n  } else {\n    targ->result[targ->count++] = (void *) _Unwind_GetIP(uc);\n  }\n\n  if (targ->count == targ->max_depth)\n    return _URC_END_OF_STACK;\n\n  return _URC_NO_REASON;\n}\n\n// If you change this function, also change GetStackFrames below.\nint GetStackTrace(void** result, int max_depth, int skip_count) {\n  if (!ready_to_run)\n    return 0;\n\n  trace_arg_t targ;\n\n  skip_count += 1;         // Do not include the \"GetStackTrace\" frame\n\n  targ.result = result;\n  targ.max_depth = max_depth;\n  targ.skip_count = skip_count;\n  targ.count = 0;\n\n  _Unwind_Backtrace(GetOneFrame, &targ);\n\n  return targ.count;\n}\n\n_END_GOOGLE_NAMESPACE_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/stl_logging_unittest.cc",
    "content": "// Copyright (c) 2003, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"utilities.h\"\n#include \"config.h\"\n\n#ifdef HAVE_USING_OPERATOR\n\n#include \"glog/stl_logging.h\"\n\n#include <iostream>\n#include <map>\n#include <string>\n#include <strstream>\n#include <vector>\n\n#ifdef __GNUC__\n# include <ext/hash_map>\n# include <ext/hash_set>\n#endif\n\n#include \"glog/logging.h\"\n#include \"googletest.h\"\n\nusing namespace std;\n#ifdef __GNUC__\nusing namespace __gnu_cxx;\n#endif\n\nstruct user_hash {\n  size_t operator()(int x) const { return x; }\n};\n\nvoid TestSTLLogging() {\n  {\n    // Test a sequence.\n    vector<int> v;\n    v.push_back(10);\n    v.push_back(20);\n    v.push_back(30);\n    char ss_buf[1000];\n    ostrstream ss(ss_buf, sizeof(ss_buf));\n    // Just ostrstream s1; leaks heap.\n    ss << v << ends;\n    CHECK_STREQ(ss.str(), \"10 20 30\");\n    vector<int> copied_v(v);\n    CHECK_EQ(v, copied_v);  // This must compile.\n  }\n\n  {\n    // Test a sorted pair associative container.\n    map< int, string > m;\n    m[20] = \"twenty\";\n    m[10] = \"ten\";\n    m[30] = \"thirty\";\n    char ss_buf[1000];\n    ostrstream ss(ss_buf, sizeof(ss_buf));\n    ss << m << ends;\n    CHECK_STREQ(ss.str(), \"(10, ten) (20, twenty) (30, thirty)\");\n    map< int, string > copied_m(m);\n    CHECK_EQ(m, copied_m);  // This must compile.\n  }\n\n#ifdef __GNUC__\n  {\n    // Test a hashed simple associative container.\n    hash_set<int> hs;\n    hs.insert(10);\n    hs.insert(20);\n    hs.insert(30);\n    char ss_buf[1000];\n    ostrstream ss(ss_buf, sizeof(ss_buf));\n    ss << hs << ends;\n    CHECK_STREQ(ss.str(), \"10 20 30\");\n    hash_set<int> copied_hs(hs);\n    CHECK_EQ(hs, copied_hs);  // This must compile.\n  }\n#endif\n\n#ifdef __GNUC__\n  {\n    // Test a hashed pair associative container.\n    hash_map<int, string> hm;\n    hm[10] = \"ten\";\n    hm[20] = \"twenty\";\n    hm[30] = \"thirty\";\n    char ss_buf[1000];\n    ostrstream ss(ss_buf, sizeof(ss_buf));\n    ss << hm << ends;\n    CHECK_STREQ(ss.str(), \"(10, ten) (20, twenty) (30, thirty)\");\n    hash_map<int, string> copied_hm(hm);\n    CHECK_EQ(hm, copied_hm);  // this must compile\n  }\n#endif\n\n  {\n    // Test a long sequence.\n    vector<int> v;\n    string expected;\n    for (int i = 0; i < 100; i++) {\n      v.push_back(i);\n      if (i > 0) expected += ' ';\n      char buf[256];\n      sprintf(buf, \"%d\", i);\n      expected += buf;\n    }\n    v.push_back(100);\n    expected += \" ...\";\n    char ss_buf[1000];\n    ostrstream ss(ss_buf, sizeof(ss_buf));\n    ss << v << ends;\n    CHECK_STREQ(ss.str(), expected.c_str());\n  }\n\n  {\n    // Test a sorted pair associative container.\n    // Use a non-default comparison functor.\n    map< int, string, greater<int> > m;\n    m[20] = \"twenty\";\n    m[10] = \"ten\";\n    m[30] = \"thirty\";\n    char ss_buf[1000];\n    ostrstream ss(ss_buf, sizeof(ss_buf));\n    ss << m << ends;\n    CHECK_STREQ(ss.str(), \"(30, thirty) (20, twenty) (10, ten)\");\n    map< int, string, greater<int> > copied_m(m);\n    CHECK_EQ(m, copied_m);  // This must compile.\n  }\n\n#ifdef __GNUC__\n  {\n    // Test a hashed simple associative container.\n    // Use a user defined hash function.\n    hash_set<int, user_hash> hs;\n    hs.insert(10);\n    hs.insert(20);\n    hs.insert(30);\n    char ss_buf[1000];\n    ostrstream ss(ss_buf, sizeof(ss_buf));\n    ss << hs << ends;\n    CHECK_STREQ(ss.str(), \"10 20 30\");\n    hash_set<int, user_hash> copied_hs(hs);\n    CHECK_EQ(hs, copied_hs);  // This must compile.\n  }\n#endif\n}\n\nint main(int argc, char** argv) {\n  TestSTLLogging();\n  std::cout << \"PASS\\n\";\n  return 0;\n}\n\n#else\n\n#include <iostream>\n\nint main(int argc, char** argv) {\n  std::cout << \"We don't support stl_logging for this compiler.\\n\"\n            << \"(we need compiler support of 'using ::operator<<' \"\n            << \"for this feature.)\\n\";\n  return 0;\n}\n\n#endif  // HAVE_USING_OPERATOR\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/symbolize.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Satoru Takabayashi\n// Stack-footprint reduction work done by Raksit Ashok\n//\n// Implementation note:\n//\n// We don't use heaps but only use stacks.  We want to reduce the\n// stack consumption so that the symbolizer can run on small stacks.\n//\n// Here are some numbers collected with GCC 4.1.0 on x86:\n// - sizeof(Elf32_Sym)  = 16\n// - sizeof(Elf32_Shdr) = 40\n// - sizeof(Elf64_Sym)  = 24\n// - sizeof(Elf64_Shdr) = 64\n//\n// This implementation is intended to be async-signal-safe but uses\n// some functions which are not guaranteed to be so, such as memchr()\n// and memmove().  We assume they are async-signal-safe.\n//\n\n#include \"utilities.h\"\n\n#if defined(HAVE_SYMBOLIZE)\n\n#include <limits>\n\n#include \"symbolize.h\"\n#include \"demangle.h\"\n\n_START_GOOGLE_NAMESPACE_\n\n// We don't use assert() since it's not guaranteed to be\n// async-signal-safe.  Instead we define a minimal assertion\n// macro. So far, we don't need pretty printing for __FILE__, etc.\n\n// A wrapper for abort() to make it callable in ? :.\nstatic int AssertFail() {\n  abort();\n  return 0;  // Should not reach.\n}\n\n#define SAFE_ASSERT(expr) ((expr) ? 0 : AssertFail())\n\nstatic SymbolizeCallback g_symbolize_callback = NULL;\nvoid InstallSymbolizeCallback(SymbolizeCallback callback) {\n  g_symbolize_callback = callback;\n}\n\n// This function wraps the Demangle function to provide an interface\n// where the input symbol is demangled in-place.\n// To keep stack consumption low, we would like this function to not\n// get inlined.\nstatic ATTRIBUTE_NOINLINE void DemangleInplace(char *out, int out_size) {\n  char demangled[256];  // Big enough for sane demangled symbols.\n  if (Demangle(out, demangled, sizeof(demangled))) {\n    // Demangling succeeded. Copy to out if the space allows.\n    int len = strlen(demangled);\n    if (len + 1 <= out_size) {  // +1 for '\\0'.\n      SAFE_ASSERT(len < sizeof(demangled));\n      memmove(out, demangled, len + 1);\n    }\n  }\n}\n\n_END_GOOGLE_NAMESPACE_\n\n#if defined(__ELF__)\n\n#include <dlfcn.h>\n#include <elf.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <link.h>  // For ElfW() macro.\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <stddef.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <unistd.h>\n\n#include \"symbolize.h\"\n#include \"config.h\"\n#include \"glog/raw_logging.h\"\n\n// Re-runs fn until it doesn't cause EINTR.\n#define NO_INTR(fn)   do {} while ((fn) < 0 && errno == EINTR)\n\n_START_GOOGLE_NAMESPACE_\n\n// Read up to \"count\" bytes from file descriptor \"fd\" into the buffer\n// starting at \"buf\" while handling short reads and EINTR.  On\n// success, return the number of bytes read.  Otherwise, return -1.\nstatic ssize_t ReadPersistent(const int fd, void *buf, const size_t count) {\n  SAFE_ASSERT(fd >= 0);\n  SAFE_ASSERT(count >= 0 && count <= std::numeric_limits<ssize_t>::max());\n  char *buf0 = reinterpret_cast<char *>(buf);\n  ssize_t num_bytes = 0;\n  while (num_bytes < count) {\n    ssize_t len;\n    NO_INTR(len = read(fd, buf0 + num_bytes, count - num_bytes));\n    if (len < 0) {  // There was an error other than EINTR.\n      return -1;\n    }\n    if (len == 0) {  // Reached EOF.\n      break;\n    }\n    num_bytes += len;\n  }\n  SAFE_ASSERT(num_bytes <= count);\n  return num_bytes;\n}\n\n// Read up to \"count\" bytes from \"offset\" in the file pointed by file\n// descriptor \"fd\" into the buffer starting at \"buf\".  On success,\n// return the number of bytes read.  Otherwise, return -1.\nstatic ssize_t ReadFromOffset(const int fd, void *buf,\n                              const size_t count, const off_t offset) {\n  off_t off = lseek(fd, offset, SEEK_SET);\n  if (off == (off_t)-1) {\n    return -1;\n  }\n  return ReadPersistent(fd, buf, count);\n}\n\n// Try reading exactly \"count\" bytes from \"offset\" bytes in a file\n// pointed by \"fd\" into the buffer starting at \"buf\" while handling\n// short reads and EINTR.  On success, return true. Otherwise, return\n// false.\nstatic bool ReadFromOffsetExact(const int fd, void *buf,\n                                const size_t count, const off_t offset) {\n  ssize_t len = ReadFromOffset(fd, buf, count, offset);\n  return len == count;\n}\n\n// Returns elf_header.e_type if the file pointed by fd is an ELF binary.\nstatic int FileGetElfType(const int fd) {\n  ElfW(Ehdr) elf_header;\n  if (!ReadFromOffsetExact(fd, &elf_header, sizeof(elf_header), 0)) {\n    return -1;\n  }\n  if (memcmp(elf_header.e_ident, ELFMAG, SELFMAG) != 0) {\n    return -1;\n  }\n  return elf_header.e_type;\n}\n\n// Read the section headers in the given ELF binary, and if a section\n// of the specified type is found, set the output to this section header\n// and return true.  Otherwise, return false.\n// To keep stack consumption low, we would like this function to not get\n// inlined.\nstatic ATTRIBUTE_NOINLINE bool\nGetSectionHeaderByType(const int fd, ElfW(Half) sh_num, const off_t sh_offset,\n                       ElfW(Word) type, ElfW(Shdr) *out) {\n  // Read at most 16 section headers at a time to save read calls.\n  ElfW(Shdr) buf[16];\n  for (int i = 0; i < sh_num;) {\n    const ssize_t num_bytes_left = (sh_num - i) * sizeof(buf[0]);\n    const ssize_t num_bytes_to_read =\n        (sizeof(buf) > num_bytes_left) ? num_bytes_left : sizeof(buf);\n    const ssize_t len = ReadFromOffset(fd, buf, num_bytes_to_read,\n                                       sh_offset + i * sizeof(buf[0]));\n    SAFE_ASSERT(len % sizeof(buf[0]) == 0);\n    const ssize_t num_headers_in_buf = len / sizeof(buf[0]);\n    SAFE_ASSERT(num_headers_in_buf <= sizeof(buf) / sizeof(buf[0]));\n    for (int j = 0; j < num_headers_in_buf; ++j) {\n      if (buf[j].sh_type == type) {\n        *out = buf[j];\n        return true;\n      }\n    }\n    i += num_headers_in_buf;\n  }\n  return false;\n}\n\n// There is no particular reason to limit section name to 63 characters,\n// but there has (as yet) been no need for anything longer either.\nconst int kMaxSectionNameLen = 64;\n\n// name_len should include terminating '\\0'.\nbool GetSectionHeaderByName(int fd, const char *name, size_t name_len,\n                            ElfW(Shdr) *out) {\n  ElfW(Ehdr) elf_header;\n  if (!ReadFromOffsetExact(fd, &elf_header, sizeof(elf_header), 0)) {\n    return false;\n  }\n\n  ElfW(Shdr) shstrtab;\n  off_t shstrtab_offset = (elf_header.e_shoff +\n                           elf_header.e_shentsize * elf_header.e_shstrndx);\n  if (!ReadFromOffsetExact(fd, &shstrtab, sizeof(shstrtab), shstrtab_offset)) {\n    return false;\n  }\n\n  for (int i = 0; i < elf_header.e_shnum; ++i) {\n    off_t section_header_offset = (elf_header.e_shoff +\n                                   elf_header.e_shentsize * i);\n    if (!ReadFromOffsetExact(fd, out, sizeof(*out), section_header_offset)) {\n      return false;\n    }\n    char header_name[kMaxSectionNameLen];\n    if (sizeof(header_name) < name_len) {\n      RAW_LOG(WARNING, \"Section name '%s' is too long (%\"PRIuS\"); \"\n              \"section will not be found (even if present).\", name, name_len);\n      // No point in even trying.\n      return false;\n    }\n    off_t name_offset = shstrtab.sh_offset + out->sh_name;\n    ssize_t n_read = ReadFromOffset(fd, &header_name, name_len, name_offset);\n    if (n_read == -1) {\n      return false;\n    } else if (n_read != name_len) {\n      // Short read -- name could be at end of file.\n      continue;\n    }\n    if (memcmp(header_name, name, name_len) == 0) {\n      return true;\n    }\n  }\n  return false;\n}\n\n// Read a symbol table and look for the symbol containing the\n// pc. Iterate over symbols in a symbol table and look for the symbol\n// containing \"pc\".  On success, return true and write the symbol name\n// to out.  Otherwise, return false.\n// To keep stack consumption low, we would like this function to not get\n// inlined.\nstatic ATTRIBUTE_NOINLINE bool\nFindSymbol(uint64_t pc, const int fd, char *out, int out_size,\n           uint64_t symbol_offset, const ElfW(Shdr) *strtab,\n           const ElfW(Shdr) *symtab) {\n  if (symtab == NULL) {\n    return false;\n  }\n  const int num_symbols = symtab->sh_size / symtab->sh_entsize;\n  for (int i = 0; i < num_symbols;) {\n    off_t offset = symtab->sh_offset + i * symtab->sh_entsize;\n\n    // If we are reading Elf64_Sym's, we want to limit this array to\n    // 32 elements (to keep stack consumption low), otherwise we can\n    // have a 64 element Elf32_Sym array.\n#if __WORDSIZE == 64\n#define NUM_SYMBOLS 32\n#else\n#define NUM_SYMBOLS 64\n#endif\n\n    // Read at most NUM_SYMBOLS symbols at once to save read() calls.\n    ElfW(Sym) buf[NUM_SYMBOLS];\n    const ssize_t len = ReadFromOffset(fd, &buf, sizeof(buf), offset);\n    SAFE_ASSERT(len % sizeof(buf[0]) == 0);\n    const ssize_t num_symbols_in_buf = len / sizeof(buf[0]);\n    SAFE_ASSERT(num_symbols_in_buf <= sizeof(buf)/sizeof(buf[0]));\n    for (int j = 0; j < num_symbols_in_buf; ++j) {\n      const ElfW(Sym)& symbol = buf[j];\n      uint64_t start_address = symbol.st_value;\n      start_address += symbol_offset;\n      uint64_t end_address = start_address + symbol.st_size;\n      if (symbol.st_value != 0 &&  // Skip null value symbols.\n          symbol.st_shndx != 0 &&  // Skip undefined symbols.\n          start_address <= pc && pc < end_address) {\n        ssize_t len1 = ReadFromOffset(fd, out, out_size,\n                                      strtab->sh_offset + symbol.st_name);\n        if (len1 <= 0 || memchr(out, '\\0', out_size) == NULL) {\n          return false;\n        }\n        return true;  // Obtained the symbol name.\n      }\n    }\n    i += num_symbols_in_buf;\n  }\n  return false;\n}\n\n// Get the symbol name of \"pc\" from the file pointed by \"fd\".  Process\n// both regular and dynamic symbol tables if necessary.  On success,\n// write the symbol name to \"out\" and return true.  Otherwise, return\n// false.\nstatic bool GetSymbolFromObjectFile(const int fd, uint64_t pc,\n                                    char *out, int out_size,\n                                    uint64_t map_start_address) {\n  // Read the ELF header.\n  ElfW(Ehdr) elf_header;\n  if (!ReadFromOffsetExact(fd, &elf_header, sizeof(elf_header), 0)) {\n    return false;\n  }\n\n  uint64_t symbol_offset = 0;\n  if (elf_header.e_type == ET_DYN) {  // DSO needs offset adjustment.\n    symbol_offset = map_start_address;\n  }\n\n  ElfW(Shdr) symtab, strtab;\n\n  // Consult a regular symbol table first.\n  if (!GetSectionHeaderByType(fd, elf_header.e_shnum, elf_header.e_shoff,\n                              SHT_SYMTAB, &symtab)) {\n    return false;\n  }\n  if (!ReadFromOffsetExact(fd, &strtab, sizeof(strtab), elf_header.e_shoff +\n                           symtab.sh_link * sizeof(symtab))) {\n    return false;\n  }\n  if (FindSymbol(pc, fd, out, out_size, symbol_offset,\n                 &strtab, &symtab)) {\n    return true;  // Found the symbol in a regular symbol table.\n  }\n\n  // If the symbol is not found, then consult a dynamic symbol table.\n  if (!GetSectionHeaderByType(fd, elf_header.e_shnum, elf_header.e_shoff,\n                              SHT_DYNSYM, &symtab)) {\n    return false;\n  }\n  if (!ReadFromOffsetExact(fd, &strtab, sizeof(strtab), elf_header.e_shoff +\n                           symtab.sh_link * sizeof(symtab))) {\n    return false;\n  }\n  if (FindSymbol(pc, fd, out, out_size, symbol_offset,\n                 &strtab, &symtab)) {\n    return true;  // Found the symbol in a dynamic symbol table.\n  }\n\n  return false;\n}\n\nnamespace {\n// Thin wrapper around a file descriptor so that the file descriptor\n// gets closed for sure.\nstruct FileDescriptor {\n  const int fd_;\n  explicit FileDescriptor(int fd) : fd_(fd) {}\n  ~FileDescriptor() {\n    if (fd_ >= 0) {\n      NO_INTR(close(fd_));\n    }\n  }\n  int get() { return fd_; }\n\n private:\n  explicit FileDescriptor(const FileDescriptor&);\n  void operator=(const FileDescriptor&);\n};\n\n// Helper class for reading lines from file.\n//\n// Note: we don't use ProcMapsIterator since the object is big (it has\n// a 5k array member) and uses async-unsafe functions such as sscanf()\n// and snprintf().\nclass LineReader {\n public:\n  explicit LineReader(int fd, char *buf, int buf_len) : fd_(fd),\n    buf_(buf), buf_len_(buf_len), bol_(buf), eol_(buf), eod_(buf) {\n  }\n\n  // Read '\\n'-terminated line from file.  On success, modify \"bol\"\n  // and \"eol\", then return true.  Otherwise, return false.\n  //\n  // Note: if the last line doesn't end with '\\n', the line will be\n  // dropped.  It's an intentional behavior to make the code simple.\n  bool ReadLine(const char **bol, const char **eol) {\n    if (BufferIsEmpty()) {  // First time.\n      const ssize_t num_bytes = ReadPersistent(fd_, buf_, buf_len_);\n      if (num_bytes <= 0) {  // EOF or error.\n        return false;\n      }\n      eod_ = buf_ + num_bytes;\n      bol_ = buf_;\n    } else {\n      bol_ = eol_ + 1;  // Advance to the next line in the buffer.\n      SAFE_ASSERT(bol_ <= eod_);  // \"bol_\" can point to \"eod_\".\n      if (!HasCompleteLine()) {\n        const int incomplete_line_length = eod_ - bol_;\n        // Move the trailing incomplete line to the beginning.\n        memmove(buf_, bol_, incomplete_line_length);\n        // Read text from file and append it.\n        char * const append_pos = buf_ + incomplete_line_length;\n        const int capacity_left = buf_len_ - incomplete_line_length;\n        const ssize_t num_bytes = ReadPersistent(fd_, append_pos,\n                                                 capacity_left);\n        if (num_bytes <= 0) {  // EOF or error.\n          return false;\n        }\n        eod_ = append_pos + num_bytes;\n        bol_ = buf_;\n      }\n    }\n    eol_ = FindLineFeed();\n    if (eol_ == NULL) {  // '\\n' not found.  Malformed line.\n      return false;\n    }\n    *eol_ = '\\0';  // Replace '\\n' with '\\0'.\n\n    *bol = bol_;\n    *eol = eol_;\n    return true;\n  }\n\n  // Beginning of line.\n  const char *bol() {\n    return bol_;\n  }\n\n  // End of line.\n  const char *eol() {\n    return eol_;\n  }\n\n private:\n  explicit LineReader(const LineReader&);\n  void operator=(const LineReader&);\n\n  char *FindLineFeed() {\n    return reinterpret_cast<char *>(memchr(bol_, '\\n', eod_ - bol_));\n  }\n\n  bool BufferIsEmpty() {\n    return buf_ == eod_;\n  }\n\n  bool HasCompleteLine() {\n    return !BufferIsEmpty() && FindLineFeed() != NULL;\n  }\n\n  const int fd_;\n  char * const buf_;\n  const int buf_len_;\n  char *bol_;\n  char *eol_;\n  const char *eod_;  // End of data in \"buf_\".\n};\n}  // namespace\n\n// Place the hex number read from \"start\" into \"*hex\".  The pointer to\n// the first non-hex character or \"end\" is returned.\nstatic char *GetHex(const char *start, const char *end, uint64_t *hex) {\n  *hex = 0;\n  const char *p;\n  for (p = start; p < end; ++p) {\n    int ch = *p;\n    if ((ch >= '0' && ch <= '9') ||\n        (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) {\n      *hex = (*hex << 4) | (ch < 'A' ? ch - '0' : (ch & 0xF) + 9);\n    } else {  // Encountered the first non-hex character.\n      break;\n    }\n  }\n  SAFE_ASSERT(p <= end);\n  return const_cast<char *>(p);\n}\n\n// Search for the object file (from /proc/self/maps) that contains\n// the specified pc. If found, open this file and return the file handle,\n// and also set start_address to the start address of where this object\n// file is mapped to in memory. Otherwise, return -1.\nstatic ATTRIBUTE_NOINLINE int\nOpenObjectFileContainingPcAndGetStartAddress(uint64_t pc,\n                                             uint64_t &start_address) {\n  int object_fd;\n\n  // Open /proc/self/maps.\n  int maps_fd;\n  NO_INTR(maps_fd = open(\"/proc/self/maps\", O_RDONLY));\n  FileDescriptor wrapped_maps_fd(maps_fd);\n  if (wrapped_maps_fd.get() < 0) {\n    return -1;\n  }\n\n  // Iterate over maps and look for the map containing the pc.  Then\n  // look into the symbol tables inside.\n  char buf[1024];  // Big enough for line of sane /proc/self/maps\n  LineReader reader(wrapped_maps_fd.get(), buf, sizeof(buf));\n  while (true) {\n    const char *cursor;\n    const char *eol;\n    if (!reader.ReadLine(&cursor, &eol)) {  // EOF or malformed line.\n      return -1;\n    }\n\n    // Start parsing line in /proc/self/maps.  Here is an example:\n    //\n    // 08048000-0804c000 r-xp 00000000 08:01 2142121    /bin/cat\n    //\n    // We want start address (08048000), end address (0804c000), flags\n    // (r-xp) and file name (/bin/cat).\n\n    // Read start address.\n    cursor = GetHex(cursor, eol, &start_address);\n    if (cursor == eol || *cursor != '-') {\n      return -1;  // Malformed line.\n    }\n    ++cursor;  // Skip '-'.\n\n    // Read end address.\n    uint64_t end_address;\n    cursor = GetHex(cursor, eol, &end_address);\n    if (cursor == eol || *cursor != ' ') {\n      return -1;  // Malformed line.\n    }\n    ++cursor;  // Skip ' '.\n\n    // Check start and end addresses.\n    if (!(start_address <= pc && pc < end_address)) {\n      continue;  // We skip this map.  PC isn't in this map.\n    }\n\n    // Read flags.  Skip flags until we encounter a space or eol.\n    const char * const flags_start = cursor;\n    while (cursor < eol && *cursor != ' ') {\n      ++cursor;\n    }\n    // We expect at least four letters for flags (ex. \"r-xp\").\n    if (cursor == eol || cursor < flags_start + 4) {\n      return -1;  // Malformed line.\n    }\n\n    // Check flags.  We are only interested in \"r-x\" maps.\n    if (memcmp(flags_start, \"r-x\", 3) != 0) {  // Not a \"r-x\" map.\n      continue;  // We skip this map.\n    }\n    ++cursor;  // Skip ' '.\n\n    // Skip to file name.  \"cursor\" now points to file offset.  We need to\n    // skip at least three spaces for file offset, dev, and inode.\n    int num_spaces = 0;\n    while (cursor < eol) {\n      if (*cursor == ' ') {\n        ++num_spaces;\n      } else if (num_spaces >= 3) {\n        // The first non-space character after  skipping three spaces\n        // is the beginning of the file name.\n        break;\n      }\n      ++cursor;\n    }\n    if (cursor == eol) {\n      return -1;  // Malformed line.\n    }\n\n    // Finally, \"cursor\" now points to file name of our interest.\n    NO_INTR(object_fd = open(cursor, O_RDONLY));\n    if (object_fd < 0) {\n      return -1;\n    }\n    return object_fd;\n  }\n}\n\n// The implementation of our symbolization routine.  If it\n// successfully finds the symbol containing \"pc\" and obtains the\n// symbol name, returns true and write the symbol name to \"out\".\n// Otherwise, returns false. If Callback function is installed via\n// InstallSymbolizeCallback(), the function is also called in this function,\n// and \"out\" is used as its output.\n// To keep stack consumption low, we would like this function to not\n// get inlined.\nstatic ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void *pc, char *out,\n                                                    int out_size) {\n  uint64_t pc0 = reinterpret_cast<uintptr_t>(pc);\n  uint64_t start_address = 0;\n\n  int object_fd = OpenObjectFileContainingPcAndGetStartAddress(pc0,\n                                                               start_address);\n  if (object_fd == -1) {\n    return false;\n  }\n  FileDescriptor wrapped_object_fd(object_fd);\n  int elf_type = FileGetElfType(wrapped_object_fd.get());\n  if (elf_type == -1) {\n    return false;\n  }\n  if (g_symbolize_callback) {\n    // Run the call back if it's installed.\n    // Note: relocation (and much of the rest of this code) will be\n    // wrong for prelinked shared libraries and PIE executables.\n    uint64 relocation = (elf_type == ET_DYN) ? start_address : 0;\n    int num_bytes_written = g_symbolize_callback(wrapped_object_fd.get(),\n                                                 pc, out, out_size,\n                                                 relocation);\n    if (num_bytes_written > 0) {\n      out += num_bytes_written;\n      out_size -= num_bytes_written;\n    }\n  }\n  if (!GetSymbolFromObjectFile(wrapped_object_fd.get(), pc0,\n                               out, out_size, start_address)) {\n    return false;\n  }\n\n  // Symbolization succeeded.  Now we try to demangle the symbol.\n  DemangleInplace(out, out_size);\n  return true;\n}\n\n_END_GOOGLE_NAMESPACE_\n\n#elif defined(OS_MACOSX) && defined(HAVE_DLADDR)\n\n#include <dlfcn.h>\n#include <string.h>\n\n_START_GOOGLE_NAMESPACE_\n\nstatic ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void *pc, char *out,\n                                                    int out_size) {\n  Dl_info info;\n  if (dladdr(pc, &info)) {\n    if (strlen(info.dli_sname) < out_size) {\n      strcpy(out, info.dli_sname);\n      // Symbolization succeeded.  Now we try to demangle the symbol.\n      DemangleInplace(out, out_size);\n      return true;\n    }\n  }\n  return false;\n}\n\n_END_GOOGLE_NAMESPACE_\n\n#else\n# error BUG: HAVE_SYMBOLIZE was wrongly set\n#endif\n\n_START_GOOGLE_NAMESPACE_\n\nbool Symbolize(void *pc, char *out, int out_size) {\n  SAFE_ASSERT(out_size >= 0);\n  return SymbolizeAndDemangle(pc, out, out_size);\n}\n\n_END_GOOGLE_NAMESPACE_\n\n#else  /* HAVE_SYMBOLIZE */\n\n#include <assert.h>\n\n#include \"config.h\"\n\n_START_GOOGLE_NAMESPACE_\n\n// TODO: Support other environments.\nbool Symbolize(void *pc, char *out, int out_size) {\n  assert(0);\n  return false;\n}\n\n_END_GOOGLE_NAMESPACE_\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/symbolize.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Satoru Takabayashi\n//\n// This library provides Symbolize() function that symbolizes program\n// counters to their corresponding symbol names on linux platforms.\n// This library has a minimal implementation of an ELF symbol table\n// reader (i.e. it doesn't depend on libelf, etc.).\n//\n// The algorithm used in Symbolize() is as follows.\n//\n//   1. Go through a list of maps in /proc/self/maps and find the map\n//   containing the program counter.\n//\n//   2. Open the mapped file and find a regular symbol table inside.\n//   Iterate over symbols in the symbol table and look for the symbol\n//   containing the program counter.  If such a symbol is found,\n//   obtain the symbol name, and demangle the symbol if possible.\n//   If the symbol isn't found in the regular symbol table (binary is\n//   stripped), try the same thing with a dynamic symbol table.\n//\n// Note that Symbolize() is originally implemented to be used in\n// FailureSignalHandler() in base/google.cc.  Hence it doesn't use\n// malloc() and other unsafe operations.  It should be both\n// thread-safe and async-signal-safe.\n\n#ifndef BASE_SYMBOLIZE_H_\n#define BASE_SYMBOLIZE_H_\n\n#include \"utilities.h\"\n#include \"config.h\"\n#include \"glog/logging.h\"\n\n#ifdef HAVE_SYMBOLIZE\n\n#if defined(__ELF__)  // defined by gcc on Linux\n#include <elf.h>\n#include <link.h>  // For ElfW() macro.\n\n// If there is no ElfW macro, let's define it by ourself.\n#ifndef ElfW\n# if SIZEOF_VOID_P == 4\n#  define ElfW(type) Elf32_##type\n# elif SIZEOF_VOID_P == 8\n#  define ElfW(type) Elf64_##type\n# else\n#  error \"Unknown sizeof(void *)\"\n# endif\n#endif\n\n_START_GOOGLE_NAMESPACE_\n\n// Gets the section header for the given name, if it exists. Returns true on\n// success. Otherwise, returns false.\nbool GetSectionHeaderByName(int fd, const char *name, size_t name_len,\n                            ElfW(Shdr) *out);\n\n_END_GOOGLE_NAMESPACE_\n\n#endif  /* __ELF__ */\n\n_START_GOOGLE_NAMESPACE_\n\n// Installs a callback function, which will be called right before a symbol name\n// is printed. The callback is intended to be used for showing a file name and a\n// line number preceding a symbol name.\n// \"fd\" is a file descriptor of the object file containing the program\n// counter \"pc\". The callback function should write output to \"out\"\n// and return the size of the output written. On error, the callback\n// function should return -1.\ntypedef int (*SymbolizeCallback)(int fd, void *pc, char *out, size_t out_size,\n                                 uint64 relocation);\nvoid InstallSymbolizeCallback(SymbolizeCallback callback);\n\n_END_GOOGLE_NAMESPACE_\n\n#endif\n\n_START_GOOGLE_NAMESPACE_\n\n// Symbolizes a program counter.  On success, returns true and write the\n// symbol name to \"out\".  The symbol name is demangled if possible\n// (supports symbols generated by GCC 3.x or newer).  Otherwise,\n// returns false.\nbool Symbolize(void *pc, char *out, int out_size);\n\n_END_GOOGLE_NAMESPACE_\n\n#endif  // BASE_SYMBOLIZE_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/symbolize_unittest.cc",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Satoru Takabayashi\n//\n// Unit tests for functions in symbolize.cc.\n\n#include \"utilities.h\"\n\n#include <signal.h>\n#include <iostream>\n\n#include \"glog/logging.h\"\n#include \"symbolize.h\"\n#include \"googletest.h\"\n#include \"config.h\"\n\nusing namespace std;\nusing namespace GOOGLE_NAMESPACE;\n\n#if defined(HAVE_STACKTRACE) && defined(__ELF__)\n\n#define always_inline\n\n// This unit tests make sense only with GCC.\n// Uses lots of GCC specific features.\n#if defined(__GNUC__) && !defined(__OPENCC__)\n#  if __GNUC__ >= 4\n#    define TEST_WITH_MODERN_GCC\n#    if __i386__  // always_inline isn't supported for x86_64 with GCC 4.1.0.\n#      undef always_inline\n#      define always_inline __attribute__((always_inline))\n#      define HAVE_ALWAYS_INLINE\n#    endif  // __i386__\n#  else\n#  endif  // __GNUC__ >= 4\n#  if defined(__i386__) || defined(__x86_64__)\n#    define TEST_X86_32_AND_64 1\n#  endif  // defined(__i386__) || defined(__x86_64__)\n#endif\n\n// A wrapper function for Symbolize() to make the unit test simple.\nstatic const char *TrySymbolize(void *pc) {\n  static char symbol[4096];\n  if (Symbolize(pc, symbol, sizeof(symbol))) {\n    return symbol;\n  } else {\n    return NULL;\n  }\n}\n\n// Make them C linkage to avoid mangled names.\nextern \"C\" {\nvoid nonstatic_func() {\n  volatile int a = 0;\n  ++a;\n}\n\nstatic void static_func() {\n  volatile int a = 0;\n  ++a;\n}\n}\n\nTEST(Symbolize, Symbolize) {\n  // We do C-style cast since GCC 2.95.3 doesn't allow\n  // reinterpret_cast<void *>(&func).\n\n  // Compilers should give us pointers to them.\n  EXPECT_STREQ(\"nonstatic_func\", TrySymbolize((void *)(&nonstatic_func)));\n  EXPECT_STREQ(\"static_func\", TrySymbolize((void *)(&static_func)));\n\n  EXPECT_TRUE(NULL == TrySymbolize(NULL));\n}\n\nstruct Foo {\n  static void func(int x);\n};\n\nvoid ATTRIBUTE_NOINLINE Foo::func(int x) {\n  volatile int a = x;\n  ++a;\n}\n\n// With a modern GCC, Symbolize() should return demangled symbol\n// names.  Function parameters should be omitted.\n#ifdef TEST_WITH_MODERN_GCC\nTEST(Symbolize, SymbolizeWithDemangling) {\n  Foo::func(100);\n  EXPECT_STREQ(\"Foo::func()\", TrySymbolize((void *)(&Foo::func)));\n}\n#endif\n\n// Tests that verify that Symbolize footprint is within some limit.\n\n// To measure the stack footprint of the Symbolize function, we create\n// a signal handler (for SIGUSR1 say) that calls the Symbolize function\n// on an alternate stack. This alternate stack is initialized to some\n// known pattern (0x55, 0x55, 0x55, ...). We then self-send this signal,\n// and after the signal handler returns, look at the alternate stack\n// buffer to see what portion has been touched.\n//\n// This trick gives us the the stack footprint of the signal handler.\n// But the signal handler, even before the call to Symbolize, consumes\n// some stack already. We however only want the stack usage of the\n// Symbolize function. To measure this accurately, we install two signal\n// handlers: one that does nothing and just returns, and another that\n// calls Symbolize. The difference between the stack consumption of these\n// two signals handlers should give us the Symbolize stack foorprint.\n\nstatic void *g_pc_to_symbolize;\nstatic char g_symbolize_buffer[4096];\nstatic char *g_symbolize_result;\n\nstatic void EmptySignalHandler(int signo) {}\n\nstatic void SymbolizeSignalHandler(int signo) {\n  if (Symbolize(g_pc_to_symbolize, g_symbolize_buffer,\n                sizeof(g_symbolize_buffer))) {\n    g_symbolize_result = g_symbolize_buffer;\n  } else {\n    g_symbolize_result = NULL;\n  }\n}\n\nconst int kAlternateStackSize = 8096;\nconst char kAlternateStackFillValue = 0x55;\n\n// These helper functions look at the alternate stack buffer, and figure\n// out what portion of this buffer has been touched - this is the stack\n// consumption of the signal handler running on this alternate stack.\nstatic ATTRIBUTE_NOINLINE bool StackGrowsDown(int *x) {\n  int y;\n  return &y < x;\n}\nstatic int GetStackConsumption(const char* alt_stack) {\n  int x;\n  if (StackGrowsDown(&x)) {\n    for (int i = 0; i < kAlternateStackSize; i++) {\n      if (alt_stack[i] != kAlternateStackFillValue) {\n        return (kAlternateStackSize - i);\n      }\n    }\n  } else {\n    for (int i = (kAlternateStackSize - 1); i >= 0; i--) {\n      if (alt_stack[i] != kAlternateStackFillValue) {\n        return i;\n      }\n    }\n  }\n  return -1;\n}\n\n#ifdef HAVE_SIGALTSTACK\n\n// Call Symbolize and figure out the stack footprint of this call.\nstatic const char *SymbolizeStackConsumption(void *pc, int *stack_consumed) {\n\n  g_pc_to_symbolize = pc;\n\n  // The alt-signal-stack cannot be heap allocated because there is a\n  // bug in glibc-2.2 where some signal handler setup code looks at the\n  // current stack pointer to figure out what thread is currently running.\n  // Therefore, the alternate stack must be allocated from the main stack\n  // itself.\n  char altstack[kAlternateStackSize];\n  memset(altstack, kAlternateStackFillValue, kAlternateStackSize);\n\n  // Set up the alt-signal-stack (and save the older one).\n  stack_t sigstk;\n  memset(&sigstk, 0, sizeof(stack_t));\n  stack_t old_sigstk;\n  sigstk.ss_sp = altstack;\n  sigstk.ss_size = kAlternateStackSize;\n  sigstk.ss_flags = 0;\n  CHECK_ERR(sigaltstack(&sigstk, &old_sigstk));\n\n  // Set up SIGUSR1 and SIGUSR2 signal handlers (and save the older ones).\n  struct sigaction sa;\n  memset(&sa, 0, sizeof(struct sigaction));\n  struct sigaction old_sa1, old_sa2;\n  sigemptyset(&sa.sa_mask);\n  sa.sa_flags = SA_ONSTACK;\n\n  // SIGUSR1 maps to EmptySignalHandler.\n  sa.sa_handler = EmptySignalHandler;\n  CHECK_ERR(sigaction(SIGUSR1, &sa, &old_sa1));\n\n  // SIGUSR2 maps to SymbolizeSignalHanlder.\n  sa.sa_handler = SymbolizeSignalHandler;\n  CHECK_ERR(sigaction(SIGUSR2, &sa, &old_sa2));\n\n  // Send SIGUSR1 signal and measure the stack consumption of the empty\n  // signal handler.\n  CHECK_ERR(kill(getpid(), SIGUSR1));\n  int stack_consumption1 = GetStackConsumption(altstack);\n\n  // Send SIGUSR2 signal and measure the stack consumption of the symbolize\n  // signal handler.\n  CHECK_ERR(kill(getpid(), SIGUSR2));\n  int stack_consumption2 = GetStackConsumption(altstack);\n\n  // The difference between the two stack consumption values is the\n  // stack footprint of the Symbolize function.\n  if (stack_consumption1 != -1 && stack_consumption2 != -1) {\n    *stack_consumed = stack_consumption2 - stack_consumption1;\n  } else {\n    *stack_consumed = -1;\n  }\n\n  // Log the stack consumption values.\n  LOG(INFO) << \"Stack consumption of empty signal handler: \"\n            << stack_consumption1;\n  LOG(INFO) << \"Stack consumption of symbolize signal handler: \"\n            << stack_consumption2;\n  LOG(INFO) << \"Stack consumption of Symbolize: \" << *stack_consumed;\n\n  // Now restore the old alt-signal-stack and signal handlers.\n  CHECK_ERR(sigaltstack(&old_sigstk, NULL));\n  CHECK_ERR(sigaction(SIGUSR1, &old_sa1, NULL));\n  CHECK_ERR(sigaction(SIGUSR2, &old_sa2, NULL));\n\n  return g_symbolize_result;\n}\n\n// Symbolize stack consumption should be within 2kB.\nconst int kStackConsumptionUpperLimit = 2048;\n\nTEST(Symbolize, SymbolizeStackConsumption) {\n  int stack_consumed;\n  const char* symbol;\n\n  symbol = SymbolizeStackConsumption((void *)(&nonstatic_func),\n                                     &stack_consumed);\n  EXPECT_STREQ(\"nonstatic_func\", symbol);\n  EXPECT_GT(stack_consumed, 0);\n  EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);\n\n  symbol = SymbolizeStackConsumption((void *)(&static_func),\n                                     &stack_consumed);\n  EXPECT_STREQ(\"static_func\", symbol);\n  EXPECT_GT(stack_consumed, 0);\n  EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);\n}\n\n#ifdef TEST_WITH_MODERN_GCC\nTEST(Symbolize, SymbolizeWithDemanglingStackConsumption) {\n  Foo::func(100);\n  int stack_consumed;\n  const char* symbol;\n\n  symbol = SymbolizeStackConsumption((void *)(&Foo::func), &stack_consumed);\n\n  EXPECT_STREQ(\"Foo::func()\", symbol);\n  EXPECT_GT(stack_consumed, 0);\n  EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);\n}\n#endif\n\n#endif  // HAVE_SIGALTSTACK\n\n// x86 specific tests.  Uses some inline assembler.\nextern \"C\" {\ninline void* always_inline inline_func() {\n  register void *pc = NULL;\n#ifdef TEST_X86_32_AND_64\n  __asm__ __volatile__(\"call 1f; 1: pop %0\" : \"=r\"(pc));\n#endif\n  return pc;\n}\n\nvoid* ATTRIBUTE_NOINLINE non_inline_func() {\n  register void *pc = NULL;\n#ifdef TEST_X86_32_AND_64\n  __asm__ __volatile__(\"call 1f; 1: pop %0\" : \"=r\"(pc));\n#endif\n  return pc;\n}\n\nvoid ATTRIBUTE_NOINLINE TestWithPCInsideNonInlineFunction() {\n#if defined(TEST_X86_32_AND_64) && defined(HAVE_ATTRIBUTE_NOINLINE)\n  void *pc = non_inline_func();\n  const char *symbol = TrySymbolize(pc);\n  CHECK(symbol != NULL);\n  CHECK_STREQ(symbol, \"non_inline_func\");\n  cout << \"Test case TestWithPCInsideNonInlineFunction passed.\" << endl;\n#endif\n}\n\nvoid ATTRIBUTE_NOINLINE TestWithPCInsideInlineFunction() {\n#if defined(TEST_X86_32_AND_64) && defined(HAVE_ALWAYS_INLINE)\n  void *pc = inline_func();  // Must be inlined.\n  const char *symbol = TrySymbolize(pc);\n  CHECK(symbol != NULL);\n  CHECK_STREQ(symbol, __FUNCTION__);\n  cout << \"Test case TestWithPCInsideInlineFunction passed.\" << endl;\n#endif\n}\n}\n\n// Test with a return address.\nvoid ATTRIBUTE_NOINLINE TestWithReturnAddress() {\n#if defined(HAVE_ATTRIBUTE_NOINLINE)\n  void *return_address = __builtin_return_address(0);\n  const char *symbol = TrySymbolize(return_address);\n  CHECK(symbol != NULL);\n  CHECK_STREQ(symbol, \"main\");\n  cout << \"Test case TestWithReturnAddress passed.\" << endl;\n#endif\n}\n\nint main(int argc, char **argv) {\n  FLAGS_logtostderr = true;\n  InitGoogleLogging(argv[0]);\n  InitGoogleTest(&argc, argv);\n#ifdef HAVE_SYMBOLIZE\n  // We don't want to get affected by the callback interface, that may be\n  // used to install some callback function at InitGoogle() time.\n  InstallSymbolizeCallback(NULL);\n\n  TestWithPCInsideInlineFunction();\n  TestWithPCInsideNonInlineFunction();\n  TestWithReturnAddress();\n  return RUN_ALL_TESTS();\n#else\n  return 0;\n#endif\n}\n\n#else\nint main() {\n#ifdef HAVE_SYMBOLIZE\n  printf(\"PASS (no symbolize_unittest support)\\n\");\n#else\n  printf(\"PASS (no symbolize support)\\n\");\n#endif\n  return 0;\n}\n#endif  // HAVE_STACKTRACE\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/utilities.cc",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Shinichiro Hamaji\n\n#include \"utilities.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include <signal.h>\n#ifdef HAVE_SYS_TIME_H\n# include <sys/time.h>\n#endif\n#include <time.h>\n#if defined(HAVE_SYSCALL_H)\n#include <syscall.h>                 // for syscall()\n#elif defined(HAVE_SYS_SYSCALL_H)\n#include <sys/syscall.h>                 // for syscall()\n#endif\n#ifdef HAVE_SYSLOG_H\n# include <syslog.h>\n#endif\n\n#include \"base/googleinit.h\"\n\nusing std::string;\n\n_START_GOOGLE_NAMESPACE_\n\nstatic const char* g_program_invocation_short_name = NULL;\nstatic pthread_t g_main_thread_id;\n\n_END_GOOGLE_NAMESPACE_\n\n// The following APIs are all internal.\n#ifdef HAVE_STACKTRACE\n\n#include \"stacktrace.h\"\n#include \"symbolize.h\"\n#include \"base/commandlineflags.h\"\n\nGLOG_DEFINE_bool(symbolize_stacktrace, true,\n                 \"Symbolize the stack trace in the tombstone\");\n\n_START_GOOGLE_NAMESPACE_\n\ntypedef void DebugWriter(const char*, void*);\n\n// The %p field width for printf() functions is two characters per byte.\n// For some environments, add two extra bytes for the leading \"0x\".\nstatic const int kPrintfPointerFieldWidth = 2 + 2 * sizeof(void*);\n\nstatic void DebugWriteToStderr(const char* data, void *unused) {\n  // This one is signal-safe.\n  if (write(STDERR_FILENO, data, strlen(data)) < 0) {\n    // Ignore errors.\n  }\n}\n\nvoid DebugWriteToString(const char* data, void *arg) {\n  reinterpret_cast<string*>(arg)->append(data);\n}\n\n#ifdef HAVE_SYMBOLIZE\n// Print a program counter and its symbol name.\nstatic void DumpPCAndSymbol(DebugWriter *writerfn, void *arg, void *pc,\n                            const char * const prefix) {\n  char tmp[1024];\n  const char *symbol = \"(unknown)\";\n  // Symbolizes the previous address of pc because pc may be in the\n  // next function.  The overrun happens when the function ends with\n  // a call to a function annotated noreturn (e.g. CHECK).\n  if (Symbolize(reinterpret_cast<char *>(pc) - 1, tmp, sizeof(tmp))) {\n      symbol = tmp;\n  }\n  char buf[1024];\n  snprintf(buf, sizeof(buf), \"%s@ %*p  %s\\n\",\n           prefix, kPrintfPointerFieldWidth, pc, symbol);\n  writerfn(buf, arg);\n}\n#endif\n\nstatic void DumpPC(DebugWriter *writerfn, void *arg, void *pc,\n                   const char * const prefix) {\n  char buf[100];\n  snprintf(buf, sizeof(buf), \"%s@ %*p\\n\",\n           prefix, kPrintfPointerFieldWidth, pc);\n  writerfn(buf, arg);\n}\n\n// Dump current stack trace as directed by writerfn\nstatic void DumpStackTrace(int skip_count, DebugWriter *writerfn, void *arg) {\n  // Print stack trace\n  void* stack[32];\n  int depth = GetStackTrace(stack, ARRAYSIZE(stack), skip_count+1);\n  for (int i = 0; i < depth; i++) {\n#if defined(HAVE_SYMBOLIZE)\n    if (FLAGS_symbolize_stacktrace) {\n      DumpPCAndSymbol(writerfn, arg, stack[i], \"    \");\n    } else {\n      DumpPC(writerfn, arg, stack[i], \"    \");\n    }\n#else\n    DumpPC(writerfn, arg, stack[i], \"    \");\n#endif\n  }\n}\n\nstatic void DumpStackTraceAndExit() {\n  DumpStackTrace(1, DebugWriteToStderr, NULL);\n\n  // Set the default signal handler for SIGABRT, to avoid invoking our\n  // own signal handler installed by InstallFailedSignalHandler().\n  struct sigaction sig_action;\n  memset(&sig_action, 0, sizeof(sig_action));\n  sigemptyset(&sig_action.sa_mask);\n  sig_action.sa_handler = SIG_DFL;\n  sigaction(SIGABRT, &sig_action, NULL);\n\n  abort();\n}\n\n_END_GOOGLE_NAMESPACE_\n\n#endif  // HAVE_STACKTRACE\n\n_START_GOOGLE_NAMESPACE_\n\nnamespace glog_internal_namespace_ {\n\nconst char* ProgramInvocationShortName() {\n  if (g_program_invocation_short_name != NULL) {\n    return g_program_invocation_short_name;\n  } else {\n    // TODO(hamaji): Use /proc/self/cmdline and so?\n    return \"UNKNOWN\";\n  }\n}\n\nbool IsGoogleLoggingInitialized() {\n  return g_program_invocation_short_name != NULL;\n}\n\nbool is_default_thread() {\n  if (g_program_invocation_short_name == NULL) {\n    // InitGoogleLogging() not yet called, so unlikely to be in a different\n    // thread\n    return true;\n  } else {\n    return pthread_equal(pthread_self(), g_main_thread_id);\n  }\n}\n\n#ifdef OS_WINDOWS\nstruct timeval {\n  long tv_sec, tv_usec;\n};\n\n// Based on: http://www.google.com/codesearch/p?hl=en#dR3YEbitojA/os_win32.c&q=GetSystemTimeAsFileTime%20license:bsd\n// See COPYING for copyright information.\nstatic int gettimeofday(struct timeval *tv, void* tz) {\n#define EPOCHFILETIME (116444736000000000ULL)\n  FILETIME ft;\n  LARGE_INTEGER li;\n  uint64 tt;\n\n  GetSystemTimeAsFileTime(&ft);\n  li.LowPart = ft.dwLowDateTime;\n  li.HighPart = ft.dwHighDateTime;\n  tt = (li.QuadPart - EPOCHFILETIME) / 10;\n  tv->tv_sec = tt / 1000000;\n  tv->tv_usec = tt % 1000000;\n\n  return 0;\n}\n#endif\n\nint64 CycleClock_Now() {\n  // TODO(hamaji): temporary impementation - it might be too slow.\n  struct timeval tv;\n  gettimeofday(&tv, NULL);\n  return static_cast<int64>(tv.tv_sec) * 1000000 + tv.tv_usec;\n}\n\nint64 UsecToCycles(int64 usec) {\n  return usec;\n}\n\nWallTime WallTime_Now() {\n  // Now, cycle clock is retuning microseconds since the epoch.\n  return CycleClock_Now() * 0.000001;\n}\n\nstatic int32 g_main_thread_pid = getpid();\nint32 GetMainThreadPid() {\n  return g_main_thread_pid;\n}\n\nbool PidHasChanged() {\n  int32 pid = getpid();\n  if (g_main_thread_pid == pid) {\n    return false;\n  }\n  g_main_thread_pid = pid;\n  return true;\n}\n\npid_t GetTID() {\n  // On Linux and FreeBSD, we try to use gettid().\n#if defined OS_LINUX || defined OS_FREEBSD || defined OS_MACOSX\n#ifndef __NR_gettid\n#ifdef OS_MACOSX\n#define __NR_gettid SYS_gettid\n#elif ! defined __i386__\n#error \"Must define __NR_gettid for non-x86 platforms\"\n#else\n#define __NR_gettid 224\n#endif\n#endif\n  static bool lacks_gettid = false;\n  if (!lacks_gettid) {\n    pid_t tid = syscall(__NR_gettid);\n    if (tid != -1) {\n      return tid;\n    }\n    // Technically, this variable has to be volatile, but there is a small\n    // performance penalty in accessing volatile variables and there should\n    // not be any serious adverse effect if a thread does not immediately see\n    // the value change to \"true\".\n    lacks_gettid = true;\n  }\n#endif  // OS_LINUX || OS_FREEBSD\n\n  // If gettid() could not be used, we use one of the following.\n#if defined OS_LINUX\n  return getpid();  // Linux:  getpid returns thread ID when gettid is absent\n#elif defined OS_WINDOWS || defined OS_CYGWIN\n  return GetCurrentThreadId();\n#else\n  // If none of the techniques above worked, we use pthread_self().\n  return (pid_t)(uintptr_t)pthread_self();\n#endif\n}\n\nconst char* const_basename(const char* filepath) {\n  const char* base = strrchr(filepath, '/');\n#ifdef OS_WINDOWS  // Look for either path separator in Windows\n  if (!base)\n    base = strrchr(filepath, '\\\\');\n#endif\n  return base ? (base+1) : filepath;\n}\n\nstatic string g_my_user_name;\nconst string& MyUserName() {\n  return g_my_user_name;\n}\nstatic void MyUserNameInitializer() {\n  // TODO(hamaji): Probably this is not portable.\n#if defined(OS_WINDOWS)\n  const char* user = getenv(\"USERNAME\");\n#else\n  const char* user = getenv(\"USER\");\n#endif\n  if (user != NULL) {\n    g_my_user_name = user;\n  } else {\n    g_my_user_name = \"invalid-user\";\n  }\n}\nREGISTER_MODULE_INITIALIZER(utilities, MyUserNameInitializer());\n\n#ifdef HAVE_STACKTRACE\nvoid DumpStackTraceToString(string* stacktrace) {\n  DumpStackTrace(1, DebugWriteToString, stacktrace);\n}\n#endif\n\n// We use an atomic operation to prevent problems with calling CrashReason\n// from inside the Mutex implementation (potentially through RAW_CHECK).\nstatic const CrashReason* g_reason = 0;\n\nvoid SetCrashReason(const CrashReason* r) {\n  sync_val_compare_and_swap(&g_reason,\n                            reinterpret_cast<const CrashReason*>(0),\n                            r);\n}\n\nvoid InitGoogleLoggingUtilities(const char* argv0) {\n  CHECK(!IsGoogleLoggingInitialized())\n      << \"You called InitGoogleLogging() twice!\";\n  const char* slash = strrchr(argv0, '/');\n#ifdef OS_WINDOWS\n  if (!slash)  slash = strrchr(argv0, '\\\\');\n#endif\n  g_program_invocation_short_name = slash ? slash + 1 : argv0;\n  g_main_thread_id = pthread_self();\n\n#ifdef HAVE_STACKTRACE\n  InstallFailureFunction(&DumpStackTraceAndExit);\n#endif\n}\n\nvoid ShutdownGoogleLoggingUtilities() {\n  CHECK(IsGoogleLoggingInitialized())\n      << \"You called ShutdownGoogleLogging() without calling InitGoogleLogging() first!\";\n#ifdef HAVE_SYSLOG_H\n  closelog();\n#endif\n}\n\n}  // namespace glog_internal_namespace_\n\n_END_GOOGLE_NAMESPACE_\n\n// Make an implementation of stacktrace compiled.\n#ifdef STACKTRACE_H\n# include STACKTRACE_H\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/utilities.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Shinichiro Hamaji\n//\n// Define utilties for glog internal usage.\n\n#ifndef UTILITIES_H__\n#define UTILITIES_H__\n\n#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)\n# define OS_WINDOWS\n#elif defined(__CYGWIN__) || defined(__CYGWIN32__)\n# define OS_CYGWIN\n#elif defined(linux) || defined(__linux) || defined(__linux__)\n# define OS_LINUX\n#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)\n# define OS_MACOSX\n#elif defined(__FreeBSD__)\n# define OS_FREEBSD\n#elif defined(__NetBSD__)\n# define OS_NETBSD\n#elif defined(__OpenBSD__)\n# define OS_OPENBSD\n#else\n// TODO(hamaji): Add other platforms.\n#endif\n\n// printf macros for size_t, in the style of inttypes.h\n#ifdef _LP64\n#define __PRIS_PREFIX \"z\"\n#else\n#define __PRIS_PREFIX\n#endif\n\n// Use these macros after a % in a printf format string\n// to get correct 32/64 bit behavior, like this:\n// size_t size = records.size();\n// printf(\"%\"PRIuS\"\\n\", size);\n\n#define PRIdS __PRIS_PREFIX \"d\"\n#define PRIxS __PRIS_PREFIX \"x\"\n#define PRIuS __PRIS_PREFIX \"u\"\n#define PRIXS __PRIS_PREFIX \"X\"\n#define PRIoS __PRIS_PREFIX \"o\"\n\n#include \"base/mutex.h\"  // This must go first so we get _XOPEN_SOURCE\n\n#include <string>\n\n#if defined(OS_WINDOWS)\n# include \"port.h\"\n#endif\n\n#include \"config.h\"\n#include \"glog/logging.h\"\n\n// There are three different ways we can try to get the stack trace:\n//\n// 1) The libunwind library.  This is still in development, and as a\n//    separate library adds a new dependency, but doesn't need a frame\n//    pointer.  It also doesn't call malloc.\n//\n// 2) Our hand-coded stack-unwinder.  This depends on a certain stack\n//    layout, which is used by gcc (and those systems using a\n//    gcc-compatible ABI) on x86 systems, at least since gcc 2.95.\n//    It uses the frame pointer to do its work.\n//\n// 3) The gdb unwinder -- also the one used by the c++ exception code.\n//    It's obviously well-tested, but has a fatal flaw: it can call\n//    malloc() from the unwinder.  This is a problem because we're\n//    trying to use the unwinder to instrument malloc().\n//\n// Note: if you add a new implementation here, make sure it works\n// correctly when GetStackTrace() is called with max_depth == 0.\n// Some code may do that.\n\n#if defined(HAVE_LIB_UNWIND)\n# define STACKTRACE_H \"stacktrace_libunwind-inl.h\"\n#elif !defined(NO_FRAME_POINTER)\n# if defined(__i386__) && __GNUC__ >= 2\n#  define STACKTRACE_H \"stacktrace_x86-inl.h\"\n# elif defined(__x86_64__) && __GNUC__ >= 2\n#  define STACKTRACE_H \"stacktrace_x86_64-inl.h\"\n# elif (defined(__ppc__) || defined(__PPC__)) && __GNUC__ >= 2\n#  define STACKTRACE_H \"stacktrace_powerpc-inl.h\"\n# endif\n#endif\n\n#if !defined(STACKTRACE_H) && defined(HAVE_EXECINFO_H)\n# define STACKTRACE_H \"stacktrace_generic-inl.h\"\n#endif\n\n#if defined(STACKTRACE_H)\n# define HAVE_STACKTRACE\n#endif\n\n// defined by gcc\n#if defined(__ELF__) && defined(OS_LINUX)\n# define HAVE_SYMBOLIZE\n#elif defined(OS_MACOSX) && defined(HAVE_DLADDR)\n// Use dladdr to symbolize.\n# define HAVE_SYMBOLIZE\n#endif\n\n#ifndef ARRAYSIZE\n// There is a better way, but this is good enough for our purpose.\n# define ARRAYSIZE(a) (sizeof(a) / sizeof(*(a)))\n#endif\n\n_START_GOOGLE_NAMESPACE_\n\nnamespace glog_internal_namespace_ {\n\n#ifdef HAVE___ATTRIBUTE__\n# define ATTRIBUTE_NOINLINE __attribute__ ((noinline))\n# define HAVE_ATTRIBUTE_NOINLINE\n#else\n# define ATTRIBUTE_NOINLINE\n#endif\n\nconst char* ProgramInvocationShortName();\n\nbool IsGoogleLoggingInitialized();\n\nbool is_default_thread();\n\nint64 CycleClock_Now();\n\nint64 UsecToCycles(int64 usec);\n\ntypedef double WallTime;\nWallTime WallTime_Now();\n\nint32 GetMainThreadPid();\nbool PidHasChanged();\n\npid_t GetTID();\n\nconst std::string& MyUserName();\n\n// Get the part of filepath after the last path separator.\n// (Doesn't modify filepath, contrary to basename() in libgen.h.)\nconst char* const_basename(const char* filepath);\n\n// Wrapper of __sync_val_compare_and_swap. If the GCC extension isn't\n// defined, we try the CPU specific logics (we only support x86 and\n// x86_64 for now) first, then use a naive implementation, which has a\n// race condition.\ntemplate<typename T>\ninline T sync_val_compare_and_swap(T* ptr, T oldval, T newval) {\n#if defined(HAVE___SYNC_VAL_COMPARE_AND_SWAP)\n  return __sync_val_compare_and_swap(ptr, oldval, newval);\n#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))\n  T ret;\n  __asm__ __volatile__(\"lock; cmpxchg %1, (%2);\"\n                       :\"=a\"(ret)\n                        // GCC may produces %sil or %dil for\n                        // constraint \"r\", but some of apple's gas\n                        // dosn't know the 8 bit registers.\n                        // We use \"q\" to avoid these registers.\n                       :\"q\"(newval), \"q\"(ptr), \"a\"(oldval)\n                       :\"memory\", \"cc\");\n  return ret;\n#else\n  T ret = *ptr;\n  if (ret == oldval) {\n    *ptr = newval;\n  }\n  return ret;\n#endif\n}\n\nvoid DumpStackTraceToString(std::string* stacktrace);\n\nstruct CrashReason {\n  CrashReason() : filename(0), line_number(0), message(0), depth(0) {}\n\n  const char* filename;\n  int line_number;\n  const char* message;\n\n  // We'll also store a bit of stack trace context at the time of crash as\n  // it may not be available later on.\n  void* stack[32];\n  int depth;\n};\n\nvoid SetCrashReason(const CrashReason* r);\n\nvoid InitGoogleLoggingUtilities(const char* argv0);\nvoid ShutdownGoogleLoggingUtilities();\n\n}  // namespace glog_internal_namespace_\n\n_END_GOOGLE_NAMESPACE_\n\nusing namespace GOOGLE_NAMESPACE::glog_internal_namespace_;\n\n#endif  // UTILITIES_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/utilities_unittest.cc",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Shinichiro Hamaji\n\n#include \"utilities.h\"\n#include \"googletest.h\"\n#include \"glog/logging.h\"\n\nusing namespace GOOGLE_NAMESPACE;\n\nTEST(utilities, sync_val_compare_and_swap) {\n  bool now_entering = false;\n  EXPECT_FALSE(sync_val_compare_and_swap(&now_entering, false, true));\n  EXPECT_TRUE(sync_val_compare_and_swap(&now_entering, false, true));\n  EXPECT_TRUE(sync_val_compare_and_swap(&now_entering, false, true));\n}\n\nTEST(utilities, InitGoogleLoggingDeathTest) {\n  ASSERT_DEATH(InitGoogleLogging(\"foobar\"), \"\");\n}\n\nint main(int argc, char **argv) {\n  InitGoogleLogging(argv[0]);\n  InitGoogleTest(&argc, argv);\n\n  CHECK_EQ(RUN_ALL_TESTS(), 0);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/vlog_is_on.cc",
    "content": "// Copyright (c) 1999, 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Ray Sidney and many others\n//\n// Broken out from logging.cc by Soren Lassen\n// logging_unittest.cc covers the functionality herein\n\n#include \"utilities.h\"\n\n#include <string.h>\n#include <stdlib.h>\n#include <errno.h>\n#include <cstdio>\n#include <string>\n#include \"base/commandlineflags.h\"\n#include \"glog/logging.h\"\n#include \"glog/raw_logging.h\"\n#include \"base/googleinit.h\"\n\n// glog doesn't have annotation\n#define ANNOTATE_BENIGN_RACE(address, description)\n\nusing std::string;\n\nGLOG_DEFINE_int32(v, 0, \"Show all VLOG(m) messages for m <= this.\"\n\" Overridable by --vmodule.\");\n\nGLOG_DEFINE_string(vmodule, \"\", \"per-module verbose level.\"\n\" Argument is a comma-separated list of <module name>=<log level>.\"\n\" <module name> is a glob pattern, matched against the filename base\"\n\" (that is, name ignoring .cc/.h./-inl.h).\"\n\" <log level> overrides any value given by --v.\");\n\n_START_GOOGLE_NAMESPACE_\n\nnamespace glog_internal_namespace_ {\n\n// Implementation of fnmatch that does not need 0-termination\n// of arguments and does not allocate any memory,\n// but we only support \"*\" and \"?\" wildcards, not the \"[...]\" patterns.\n// It's not a static function for the unittest.\nGOOGLE_GLOG_DLL_DECL bool SafeFNMatch_(const char* pattern,\n                                       size_t patt_len,\n                                       const char* str,\n                                       size_t str_len) {\n  int p = 0;\n  int s = 0;\n  while (1) {\n    if (p == patt_len  &&  s == str_len) return true;\n    if (p == patt_len) return false;\n    if (s == str_len) return p+1 == patt_len  &&  pattern[p] == '*';\n    if (pattern[p] == str[s]  ||  pattern[p] == '?') {\n      p += 1;\n      s += 1;\n      continue;\n    }\n    if (pattern[p] == '*') {\n      if (p+1 == patt_len) return true;\n      do {\n        if (SafeFNMatch_(pattern+(p+1), patt_len-(p+1), str+s, str_len-s)) {\n          return true;\n        }\n        s += 1;\n      } while (s != str_len);\n      return false;\n    }\n    return false;\n  }\n}\n\n}  // namespace glog_internal_namespace_\n\nusing glog_internal_namespace_::SafeFNMatch_;\n\nint32 kLogSiteUninitialized = 1000;\n\n// List of per-module log levels from FLAGS_vmodule.\n// Once created each element is never deleted/modified\n// except for the vlog_level: other threads will read VModuleInfo blobs\n// w/o locks and we'll store pointers to vlog_level at VLOG locations\n// that will never go away.\n// We can't use an STL struct here as we wouldn't know\n// when it's safe to delete/update it: other threads need to use it w/o locks.\nstruct VModuleInfo {\n  string module_pattern;\n  mutable int32 vlog_level;  // Conceptually this is an AtomicWord, but it's\n                             // too much work to use AtomicWord type here\n                             // w/o much actual benefit.\n  const VModuleInfo* next;\n};\n\n// This protects the following global variables.\nstatic Mutex vmodule_lock;\n// Pointer to head of the VModuleInfo list.\n// It's a map from module pattern to logging level for those module(s).\nstatic VModuleInfo* vmodule_list = 0;\n// Boolean initialization flag.\nstatic bool inited_vmodule = false;\n\n// L >= vmodule_lock.\nstatic void VLOG2Initializer() {\n  vmodule_lock.AssertHeld();\n  // Can now parse --vmodule flag and initialize mapping of module-specific\n  // logging levels.\n  inited_vmodule = false;\n  const char* vmodule = FLAGS_vmodule.c_str();\n  const char* sep;\n  VModuleInfo* head = NULL;\n  VModuleInfo* tail = NULL;\n  while ((sep = strchr(vmodule, '=')) != NULL) {\n    string pattern(vmodule, sep - vmodule);\n    int module_level;\n    if (sscanf(sep, \"=%d\", &module_level) == 1) {\n      VModuleInfo* info = new VModuleInfo;\n      info->module_pattern = pattern;\n      info->vlog_level = module_level;\n      if (head)  tail->next = info;\n      else  head = info;\n      tail = info;\n    }\n    // Skip past this entry\n    vmodule = strchr(sep, ',');\n    if (vmodule == NULL) break;\n    vmodule++;  // Skip past \",\"\n  }\n  if (head) {  // Put them into the list at the head:\n    tail->next = vmodule_list;\n    vmodule_list = head;\n  }\n  inited_vmodule = true;\n}\n\n// This can be called very early, so we use SpinLock and RAW_VLOG here.\nint SetVLOGLevel(const char* module_pattern, int log_level) {\n  int result = FLAGS_v;\n  int const pattern_len = strlen(module_pattern);\n  bool found = false;\n  MutexLock l(&vmodule_lock);  // protect whole read-modify-write\n  for (const VModuleInfo* info = vmodule_list;\n       info != NULL; info = info->next) {\n    if (info->module_pattern == module_pattern) {\n      if (!found) {\n        result = info->vlog_level;\n        found = true;\n      }\n      info->vlog_level = log_level;\n    } else if (!found  &&\n               SafeFNMatch_(info->module_pattern.c_str(),\n                            info->module_pattern.size(),\n                            module_pattern, pattern_len)) {\n      result = info->vlog_level;\n      found = true;\n    }\n  }\n  if (!found) {\n    VModuleInfo* info = new VModuleInfo;\n    info->module_pattern = module_pattern;\n    info->vlog_level = log_level;\n    info->next = vmodule_list;\n    vmodule_list = info;\n  }\n  RAW_VLOG(1, \"Set VLOG level for \\\"%s\\\" to %d\", module_pattern, log_level);\n  return result;\n}\n\n// NOTE: Individual VLOG statements cache the integer log level pointers.\n// NOTE: This function must not allocate memory or require any locks.\nbool InitVLOG3__(int32** site_flag, int32* site_default,\n                 const char* fname, int32 verbose_level) {\n  MutexLock l(&vmodule_lock);\n  bool read_vmodule_flag = inited_vmodule;\n  if (!read_vmodule_flag) {\n    VLOG2Initializer();\n  }\n\n  // protect the errno global in case someone writes:\n  // VLOG(..) << \"The last error was \" << strerror(errno)\n  int old_errno = errno;\n\n  // site_default normally points to FLAGS_v\n  int32* site_flag_value = site_default;\n\n  // Get basename for file\n  const char* base = strrchr(fname, '/');\n  base = base ? (base+1) : fname;\n  const char* base_end = strchr(base, '.');\n  size_t base_length = base_end ? (base_end - base) : strlen(base);\n\n  // Trim out trailing \"-inl\" if any\n  if (base_length >= 4 && (memcmp(base+base_length-4, \"-inl\", 4) == 0)) {\n    base_length -= 4;\n  }\n\n  // TODO: Trim out _unittest suffix?  Perhaps it is better to have\n  // the extra control and just leave it there.\n\n  // find target in vector of modules, replace site_flag_value with\n  // a module-specific verbose level, if any.\n  for (const VModuleInfo* info = vmodule_list;\n       info != NULL; info = info->next) {\n    if (SafeFNMatch_(info->module_pattern.c_str(), info->module_pattern.size(),\n                     base, base_length)) {\n      site_flag_value = &info->vlog_level;\n        // value at info->vlog_level is now what controls\n        // the VLOG at the caller site forever\n      break;\n    }\n  }\n\n  // Cache the vlog value pointer if --vmodule flag has been parsed.\n  ANNOTATE_BENIGN_RACE(site_flag,\n                       \"*site_flag may be written by several threads,\"\n                       \" but the value will be the same\");\n  if (read_vmodule_flag) *site_flag = site_flag_value;\n\n  // restore the errno in case something recoverable went wrong during\n  // the initialization of the VLOG mechanism (see above note \"protect the..\")\n  errno = old_errno;\n  return *site_flag_value >= verbose_level;\n}\n\n_END_GOOGLE_NAMESPACE_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/windows/config.h",
    "content": "/* src/config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* Namespace for Google classes */\n#define GOOGLE_NAMESPACE google\n\n/* Define if you have the `dladdr' function */\n#undef HAVE_DLADDR\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#undef HAVE_DLFCN_H\n\n/* Define to 1 if you have the <execinfo.h> header file. */\n#undef HAVE_EXECINFO_H\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#undef HAVE_INTTYPES_H\n\n/* Define to 1 if you have the <libunwind.h> header file. */\n#undef HAVE_LIBUNWIND_H\n\n/* define if you have google gflags library */\n#undef HAVE_LIB_GFLAGS\n\n/* define if you have libunwind */\n#undef HAVE_LIB_UNWIND\n\n/* Define to 1 if you have the <memory.h> header file. */\n#undef HAVE_MEMORY_H\n\n/* define if the compiler implements namespaces */\n#undef HAVE_NAMESPACES\n\n/* Define if you have POSIX threads libraries and header files. */\n#undef HAVE_PTHREAD\n\n/* define if the compiler implements pthread_rwlock_* */\n#undef HAVE_RWLOCK\n\n/* Define if you have the `sigaltstack' function */\n#undef HAVE_SIGALTSTACK\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#undef HAVE_STDINT_H\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#undef HAVE_STDLIB_H\n\n/* Define to 1 if you have the <strings.h> header file. */\n#undef HAVE_STRINGS_H\n\n/* Define to 1 if you have the <string.h> header file. */\n#undef HAVE_STRING_H\n\n/* Define to 1 if you have the <syscall.h> header file. */\n#undef HAVE_SYSCALL_H\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#undef HAVE_SYS_STAT_H\n\n/* Define to 1 if you have the <sys/syscall.h> header file. */\n#undef HAVE_SYS_SYSCALL_H\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#undef HAVE_SYS_TYPES_H\n\n/* Define to 1 if you have the <ucontext.h> header file. */\n#undef HAVE_UCONTEXT_H\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#undef HAVE_UNISTD_H\n\n/* define if the compiler supports using expression for operator */\n#undef HAVE_USING_OPERATOR\n\n/* define if your compiler has __attribute__ */\n#undef HAVE___ATTRIBUTE__\n\n/* define if your compiler has __builtin_expect */\n#undef HAVE___BUILTIN_EXPECT\n\n/* define if your compiler has __sync_val_compare_and_swap */\n#undef HAVE___SYNC_VAL_COMPARE_AND_SWAP\n\n/* Name of package */\n#undef PACKAGE\n\n/* Define to the address where bug reports for this package should be sent. */\n#undef PACKAGE_BUGREPORT\n\n/* Define to the full name of this package. */\n#undef PACKAGE_NAME\n\n/* Define to the full name and version of this package. */\n#undef PACKAGE_STRING\n\n/* Define to the one symbol short name of this package. */\n#undef PACKAGE_TARNAME\n\n/* Define to the version of this package. */\n#undef PACKAGE_VERSION\n\n/* How to access the PC from a struct ucontext */\n#undef PC_FROM_UCONTEXT\n\n/* Define to necessary symbol if this constant uses a non-standard name on\n   your system. */\n#undef PTHREAD_CREATE_JOINABLE\n\n/* The size of `void *', as computed by sizeof. */\n#undef SIZEOF_VOID_P\n\n/* Define to 1 if you have the ANSI C header files. */\n#undef STDC_HEADERS\n\n/* the namespace where STL code like vector<> is defined */\n#undef STL_NAMESPACE\n\n/* Version number of package */\n#undef VERSION\n\n/* Stops putting the code inside the Google namespace */\n#define _END_GOOGLE_NAMESPACE_ }\n\n/* Puts following code inside the Google namespace */\n#define _START_GOOGLE_NAMESPACE_ namespace google {\n\n/* Always the empty-string on non-windows systems. On windows, should be\n   \"__declspec(dllexport)\". This way, when we compile the dll, we export our\n   functions/classes. It's safe to define this here because config.h is only\n   used internally, to compile the DLL, and every DLL source file #includes\n   \"config.h\" before anything else. */\n#ifndef GOOGLE_GLOG_DLL_DECL\n# define GOOGLE_GLOG_IS_A_DLL  1   /* not set if you're statically linking */\n# define GOOGLE_GLOG_DLL_DECL  __declspec(dllexport)\n# define GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS  __declspec(dllimport)\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/windows/glog/log_severity.h",
    "content": "// This file is automatically generated from src/glog/log_severity.h\n// using src/windows/preprocess.sh.\n// DO NOT EDIT!\n\n// Copyright (c) 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#ifndef BASE_LOG_SEVERITY_H__\n#define BASE_LOG_SEVERITY_H__\n\n// Annoying stuff for windows -- makes sure clients can import these functions\n#ifndef GOOGLE_GLOG_DLL_DECL\n# if defined(_WIN32) && !defined(__CYGWIN__)\n#   define GOOGLE_GLOG_DLL_DECL  __declspec(dllimport)\n# else\n#   define GOOGLE_GLOG_DLL_DECL\n# endif\n#endif\n\n// Variables of type LogSeverity are widely taken to lie in the range\n// [0, NUM_SEVERITIES-1].  Be careful to preserve this assumption if\n// you ever need to change their values or add a new severity.\ntypedef int LogSeverity;\n\nconst int INFO = 0, WARNING = 1, ERROR = 2, FATAL = 3, NUM_SEVERITIES = 4;\n\n// DFATAL is FATAL in debug mode, ERROR in normal mode\n#ifdef NDEBUG\n#define DFATAL_LEVEL ERROR\n#else\n#define DFATAL_LEVEL FATAL\n#endif\n\nextern GOOGLE_GLOG_DLL_DECL const char* const LogSeverityNames[NUM_SEVERITIES];\n\n// NDEBUG usage helpers related to (RAW_)DCHECK:\n//\n// DEBUG_MODE is for small !NDEBUG uses like\n//   if (DEBUG_MODE) foo.CheckThatFoo();\n// instead of substantially more verbose\n//   #ifndef NDEBUG\n//     foo.CheckThatFoo();\n//   #endif\n//\n// IF_DEBUG_MODE is for small !NDEBUG uses like\n//   IF_DEBUG_MODE( string error; )\n//   DCHECK(Foo(&error)) << error;\n// instead of substantially more verbose\n//   #ifndef NDEBUG\n//     string error;\n//     DCHECK(Foo(&error)) << error;\n//   #endif\n//\n#ifdef NDEBUG\nenum { DEBUG_MODE = 0 };\n#define IF_DEBUG_MODE(x)\n#else\nenum { DEBUG_MODE = 1 };\n#define IF_DEBUG_MODE(x) x\n#endif\n\n#endif  // BASE_LOG_SEVERITY_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/windows/glog/logging.h",
    "content": "// This file is automatically generated from src/glog/logging.h.in\n// using src/windows/preprocess.sh.\n// DO NOT EDIT!\n\n// Copyright (c) 1999, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Ray Sidney\n//\n// This file contains #include information about logging-related stuff.\n// Pretty much everybody needs to #include this file so that they can\n// log various happenings.\n//\n#ifndef _LOGGING_H_\n#define _LOGGING_H_\n\n#include <errno.h>\n#include <string.h>\n#include <time.h>\n#include <string>\n#if 0\n# include <unistd.h>\n#endif\n#ifdef __DEPRECATED\n// Make GCC quiet.\n# undef __DEPRECATED\n# include <strstream>\n# define __DEPRECATED\n#else\n# include <strstream>\n#endif\n#include <vector>\n\n// Annoying stuff for windows -- makes sure clients can import these functions\n#ifndef GOOGLE_GLOG_DLL_DECL\n# if defined(_WIN32) && !defined(__CYGWIN__)\n#   define GOOGLE_GLOG_DLL_DECL  __declspec(dllimport)\n# else\n#   define GOOGLE_GLOG_DLL_DECL\n# endif\n#endif\n\n// We care a lot about number of bits things take up.  Unfortunately,\n// systems define their bit-specific ints in a lot of different ways.\n// We use our own way, and have a typedef to get there.\n// Note: these commands below may look like \"#if 1\" or \"#if 0\", but\n// that's because they were constructed that way at ./configure time.\n// Look at logging.h.in to see how they're calculated (based on your config).\n#if 0\n#include <stdint.h>             // the normal place uint16_t is defined\n#endif\n#if 0\n#include <sys/types.h>          // the normal place u_int16_t is defined\n#endif\n#if 0\n#include <inttypes.h>           // a third place for uint16_t or u_int16_t\n#endif\n\n#if 0\n#include <gflags/gflags.h>\n#endif\n\nnamespace google {\n\n#if 0      // the C99 format\ntypedef int32_t int32;\ntypedef uint32_t uint32;\ntypedef int64_t int64;\ntypedef uint64_t uint64;\n#elif 0   // the BSD format\ntypedef int32_t int32;\ntypedef u_int32_t uint32;\ntypedef int64_t int64;\ntypedef u_int64_t uint64;\n#elif 1    // the windows (vc7) format\ntypedef __int32 int32;\ntypedef unsigned __int32 uint32;\ntypedef __int64 int64;\ntypedef unsigned __int64 uint64;\n#else\n#error Do not know how to define a 32-bit integer quantity on your system\n#endif\n\n}\n\n// The global value of GOOGLE_STRIP_LOG. All the messages logged to\n// LOG(XXX) with severity less than GOOGLE_STRIP_LOG will not be displayed.\n// If it can be determined at compile time that the message will not be\n// printed, the statement will be compiled out.\n//\n// Example: to strip out all INFO and WARNING messages, use the value\n// of 2 below. To make an exception for WARNING messages from a single\n// file, add \"#define GOOGLE_STRIP_LOG 1\" to that file _before_ including\n// base/logging.h\n#ifndef GOOGLE_STRIP_LOG\n#define GOOGLE_STRIP_LOG 0\n#endif\n\n// GCC can be told that a certain branch is not likely to be taken (for\n// instance, a CHECK failure), and use that information in static analysis.\n// Giving it this information can help it optimize for the common case in\n// the absence of better information (ie. -fprofile-arcs).\n//\n#ifndef GOOGLE_PREDICT_BRANCH_NOT_TAKEN\n#if 0\n#define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) (__builtin_expect(x, 0))\n#else\n#define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) x\n#endif\n#endif\n\n// Make a bunch of macros for logging.  The way to log things is to stream\n// things to LOG(<a particular severity level>).  E.g.,\n//\n//   LOG(INFO) << \"Found \" << num_cookies << \" cookies\";\n//\n// You can capture log messages in a string, rather than reporting them\n// immediately:\n//\n//   vector<string> errors;\n//   LOG_STRING(ERROR, &errors) << \"Couldn't parse cookie #\" << cookie_num;\n//\n// This pushes back the new error onto 'errors'; if given a NULL pointer,\n// it reports the error via LOG(ERROR).\n//\n// You can also do conditional logging:\n//\n//   LOG_IF(INFO, num_cookies > 10) << \"Got lots of cookies\";\n//\n// You can also do occasional logging (log every n'th occurrence of an\n// event):\n//\n//   LOG_EVERY_N(INFO, 10) << \"Got the \" << COUNTER << \"th cookie\";\n//\n// The above will cause log messages to be output on the 1st, 11th, 21st, ...\n// times it is executed.  Note that the special COUNTER value is used to\n// identify which repetition is happening.\n//\n// You can also do occasional conditional logging (log every n'th\n// occurrence of an event, when condition is satisfied):\n//\n//   LOG_IF_EVERY_N(INFO, (size > 1024), 10) << \"Got the \" << COUNTER\n//                                           << \"th big cookie\";\n//\n// You can log messages the first N times your code executes a line. E.g.\n//\n//   LOG_FIRST_N(INFO, 20) << \"Got the \" << COUNTER << \"th cookie\";\n//\n// Outputs log messages for the first 20 times it is executed.\n//\n// Analogous SYSLOG, SYSLOG_IF, and SYSLOG_EVERY_N macros are available.\n// These log to syslog as well as to the normal logs.  If you use these at\n// all, you need to be aware that syslog can drastically reduce performance,\n// especially if it is configured for remote logging!  Don't use these\n// unless you fully understand this and have a concrete need to use them.\n// Even then, try to minimize your use of them.\n//\n// There are also \"debug mode\" logging macros like the ones above:\n//\n//   DLOG(INFO) << \"Found cookies\";\n//\n//   DLOG_IF(INFO, num_cookies > 10) << \"Got lots of cookies\";\n//\n//   DLOG_EVERY_N(INFO, 10) << \"Got the \" << COUNTER << \"th cookie\";\n//\n// All \"debug mode\" logging is compiled away to nothing for non-debug mode\n// compiles.\n//\n// We also have\n//\n//   LOG_ASSERT(assertion);\n//   DLOG_ASSERT(assertion);\n//\n// which is syntactic sugar for {,D}LOG_IF(FATAL, assert fails) << assertion;\n//\n// There are \"verbose level\" logging macros.  They look like\n//\n//   VLOG(1) << \"I'm printed when you run the program with --v=1 or more\";\n//   VLOG(2) << \"I'm printed when you run the program with --v=2 or more\";\n//\n// These always log at the INFO log level (when they log at all).\n// The verbose logging can also be turned on module-by-module.  For instance,\n//    --vmodule=mapreduce=2,file=1,gfs*=3 --v=0\n// will cause:\n//   a. VLOG(2) and lower messages to be printed from mapreduce.{h,cc}\n//   b. VLOG(1) and lower messages to be printed from file.{h,cc}\n//   c. VLOG(3) and lower messages to be printed from files prefixed with \"gfs\"\n//   d. VLOG(0) and lower messages to be printed from elsewhere\n//\n// The wildcarding functionality shown by (c) supports both '*' (match\n// 0 or more characters) and '?' (match any single character) wildcards.\n//\n// There's also VLOG_IS_ON(n) \"verbose level\" condition macro. To be used as\n//\n//   if (VLOG_IS_ON(2)) {\n//     // do some logging preparation and logging\n//     // that can't be accomplished with just VLOG(2) << ...;\n//   }\n//\n// There are also VLOG_IF, VLOG_EVERY_N and VLOG_IF_EVERY_N \"verbose level\"\n// condition macros for sample cases, when some extra computation and\n// preparation for logs is not needed.\n//   VLOG_IF(1, (size > 1024))\n//      << \"I'm printed when size is more than 1024 and when you run the \"\n//         \"program with --v=1 or more\";\n//   VLOG_EVERY_N(1, 10)\n//      << \"I'm printed every 10th occurrence, and when you run the program \"\n//         \"with --v=1 or more. Present occurence is \" << COUNTER;\n//   VLOG_IF_EVERY_N(1, (size > 1024), 10)\n//      << \"I'm printed on every 10th occurence of case when size is more \"\n//         \" than 1024, when you run the program with --v=1 or more. \";\n//         \"Present occurence is \" << COUNTER;\n//\n// The supported severity levels for macros that allow you to specify one\n// are (in increasing order of severity) INFO, WARNING, ERROR, and FATAL.\n// Note that messages of a given severity are logged not only in the\n// logfile for that severity, but also in all logfiles of lower severity.\n// E.g., a message of severity FATAL will be logged to the logfiles of\n// severity FATAL, ERROR, WARNING, and INFO.\n//\n// There is also the special severity of DFATAL, which logs FATAL in\n// debug mode, ERROR in normal mode.\n//\n// Very important: logging a message at the FATAL severity level causes\n// the program to terminate (after the message is logged).\n//\n// Unless otherwise specified, logs will be written to the filename\n// \"<program name>.<hostname>.<user name>.log.<severity level>.\", followed\n// by the date, time, and pid (you can't prevent the date, time, and pid\n// from being in the filename).\n//\n// The logging code takes two flags:\n//     --v=#           set the verbose level\n//     --logtostderr   log all the messages to stderr instead of to logfiles\n\n// LOG LINE PREFIX FORMAT\n//\n// Log lines have this form:\n//\n//     Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg...\n//\n// where the fields are defined as follows:\n//\n//   L                A single character, representing the log level\n//                    (eg 'I' for INFO)\n//   mm               The month (zero padded; ie May is '05')\n//   dd               The day (zero padded)\n//   hh:mm:ss.uuuuuu  Time in hours, minutes and fractional seconds\n//   threadid         The space-padded thread ID as returned by GetTID()\n//                    (this matches the PID on Linux)\n//   file             The file name\n//   line             The line number\n//   msg              The user-supplied message\n//\n// Example:\n//\n//   I1103 11:57:31.739339 24395 google.cc:2341] Command line: ./some_prog\n//   I1103 11:57:31.739403 24395 google.cc:2342] Process id 24395\n//\n// NOTE: although the microseconds are useful for comparing events on\n// a single machine, clocks on different machines may not be well\n// synchronized.  Hence, use caution when comparing the low bits of\n// timestamps from different machines.\n\n#ifndef DECLARE_VARIABLE\n#define MUST_UNDEF_GFLAGS_DECLARE_MACROS\n#define DECLARE_VARIABLE(type, name, tn)                                      \\\n  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead {  \\\n  extern GOOGLE_GLOG_DLL_DECL type FLAGS_##name;                              \\\n  }                                                                           \\\n  using FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead::FLAGS_##name\n\n// bool specialization\n#define DECLARE_bool(name) \\\n  DECLARE_VARIABLE(bool, name, bool)\n\n// int32 specialization\n#define DECLARE_int32(name) \\\n  DECLARE_VARIABLE(google::int32, name, int32)\n\n// Special case for string, because we have to specify the namespace\n// std::string, which doesn't play nicely with our FLAG__namespace hackery.\n#define DECLARE_string(name)                                          \\\n  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead {  \\\n  extern GOOGLE_GLOG_DLL_DECL std::string FLAGS_##name;                       \\\n  }                                                                           \\\n  using FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead::FLAGS_##name\n#endif\n\n// Set whether log messages go to stderr instead of logfiles\nDECLARE_bool(logtostderr);\n\n// Set whether log messages go to stderr in addition to logfiles.\nDECLARE_bool(alsologtostderr);\n\n// Log messages at a level >= this flag are automatically sent to\n// stderr in addition to log files.\nDECLARE_int32(stderrthreshold);\n\n// Set whether the log prefix should be prepended to each line of output.\nDECLARE_bool(log_prefix);\n\n// Log messages at a level <= this flag are buffered.\n// Log messages at a higher level are flushed immediately.\nDECLARE_int32(logbuflevel);\n\n// Sets the maximum number of seconds which logs may be buffered for.\nDECLARE_int32(logbufsecs);\n\n// Log suppression level: messages logged at a lower level than this\n// are suppressed.\nDECLARE_int32(minloglevel);\n\n// If specified, logfiles are written into this directory instead of the\n// default logging directory.\nDECLARE_string(log_dir);\n\n// Sets the path of the directory into which to put additional links\n// to the log files.\nDECLARE_string(log_link);\n\nDECLARE_int32(v);  // in vlog_is_on.cc\n\n// Sets the maximum log file size (in MB).\nDECLARE_int32(max_log_size);\n\n// Sets whether to avoid logging to the disk if the disk is full.\nDECLARE_bool(stop_logging_if_full_disk);\n\n#ifdef MUST_UNDEF_GFLAGS_DECLARE_MACROS\n#undef MUST_UNDEF_GFLAGS_DECLARE_MACROS\n#undef DECLARE_VARIABLE\n#undef DECLARE_bool\n#undef DECLARE_int32\n#undef DECLARE_string\n#endif\n\n// Log messages below the GOOGLE_STRIP_LOG level will be compiled away for\n// security reasons. See LOG(severtiy) below.\n\n// A few definitions of macros that don't generate much code.  Since\n// LOG(INFO) and its ilk are used all over our code, it's\n// better to have compact code for these operations.\n\n#if GOOGLE_STRIP_LOG == 0\n#define COMPACT_GOOGLE_LOG_INFO google::LogMessage( \\\n      __FILE__, __LINE__)\n#define LOG_TO_STRING_INFO(message) google::LogMessage( \\\n      __FILE__, __LINE__, google::INFO, message)\n#else\n#define COMPACT_GOOGLE_LOG_INFO google::NullStream()\n#define LOG_TO_STRING_INFO(message) google::NullStream()\n#endif\n\n#if GOOGLE_STRIP_LOG <= 1\n#define COMPACT_GOOGLE_LOG_WARNING google::LogMessage( \\\n      __FILE__, __LINE__, google::WARNING)\n#define LOG_TO_STRING_WARNING(message) google::LogMessage( \\\n      __FILE__, __LINE__, google::WARNING, message)\n#else\n#define COMPACT_GOOGLE_LOG_WARNING google::NullStream()\n#define LOG_TO_STRING_WARNING(message) google::NullStream()\n#endif\n\n#if GOOGLE_STRIP_LOG <= 2\n#define COMPACT_GOOGLE_LOG_ERROR google::LogMessage( \\\n      __FILE__, __LINE__, google::ERROR)\n#define LOG_TO_STRING_ERROR(message) google::LogMessage( \\\n      __FILE__, __LINE__, google::ERROR, message)\n#else\n#define COMPACT_GOOGLE_LOG_ERROR google::NullStream()\n#define LOG_TO_STRING_ERROR(message) google::NullStream()\n#endif\n\n#if GOOGLE_STRIP_LOG <= 3\n#define COMPACT_GOOGLE_LOG_FATAL google::LogMessageFatal( \\\n      __FILE__, __LINE__)\n#define LOG_TO_STRING_FATAL(message) google::LogMessage( \\\n      __FILE__, __LINE__, google::FATAL, message)\n#else\n#define COMPACT_GOOGLE_LOG_FATAL google::NullStreamFatal()\n#define LOG_TO_STRING_FATAL(message) google::NullStreamFatal()\n#endif\n\n// For DFATAL, we want to use LogMessage (as opposed to\n// LogMessageFatal), to be consistent with the original behavior.\n#ifdef NDEBUG\n#define COMPACT_GOOGLE_LOG_DFATAL COMPACT_GOOGLE_LOG_ERROR\n#elif GOOGLE_STRIP_LOG <= 3\n#define COMPACT_GOOGLE_LOG_DFATAL google::LogMessage( \\\n      __FILE__, __LINE__, google::FATAL)\n#else\n#define COMPACT_GOOGLE_LOG_DFATAL google::NullStreamFatal()\n#endif\n\n#define GOOGLE_LOG_INFO(counter) google::LogMessage(__FILE__, __LINE__, google::INFO, counter, &google::LogMessage::SendToLog)\n#define SYSLOG_INFO(counter) \\\n  google::LogMessage(__FILE__, __LINE__, google::INFO, counter, \\\n  &google::LogMessage::SendToSyslogAndLog)\n#define GOOGLE_LOG_WARNING(counter)  \\\n  google::LogMessage(__FILE__, __LINE__, google::WARNING, counter, \\\n  &google::LogMessage::SendToLog)\n#define SYSLOG_WARNING(counter)  \\\n  google::LogMessage(__FILE__, __LINE__, google::WARNING, counter, \\\n  &google::LogMessage::SendToSyslogAndLog)\n#define GOOGLE_LOG_ERROR(counter)  \\\n  google::LogMessage(__FILE__, __LINE__, google::ERROR, counter, \\\n  &google::LogMessage::SendToLog)\n#define SYSLOG_ERROR(counter)  \\\n  google::LogMessage(__FILE__, __LINE__, google::ERROR, counter, \\\n  &google::LogMessage::SendToSyslogAndLog)\n#define GOOGLE_LOG_FATAL(counter) \\\n  google::LogMessage(__FILE__, __LINE__, google::FATAL, counter, \\\n  &google::LogMessage::SendToLog)\n#define SYSLOG_FATAL(counter) \\\n  google::LogMessage(__FILE__, __LINE__, google::FATAL, counter, \\\n  &google::LogMessage::SendToSyslogAndLog)\n#define GOOGLE_LOG_DFATAL(counter) \\\n  google::LogMessage(__FILE__, __LINE__, google::DFATAL_LEVEL, counter, \\\n  &google::LogMessage::SendToLog)\n#define SYSLOG_DFATAL(counter) \\\n  google::LogMessage(__FILE__, __LINE__, google::DFATAL_LEVEL, counter, \\\n  &google::LogMessage::SendToSyslogAndLog)\n\n#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) || defined(__CYGWIN32__)\n// A very useful logging macro to log windows errors:\n#define LOG_SYSRESULT(result) \\\n  if (FAILED(result)) { \\\n    LPTSTR message = NULL; \\\n    LPTSTR msg = reinterpret_cast<LPTSTR>(&message); \\\n    DWORD message_length = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | \\\n                         FORMAT_MESSAGE_FROM_SYSTEM, \\\n                         0, result, 0, msg, 100, NULL); \\\n    if (message_length > 0) { \\\n      google::LogMessage(__FILE__, __LINE__, ERROR, 0, \\\n          &google::LogMessage::SendToLog).stream() << message; \\\n      LocalFree(message); \\\n    } \\\n  }\n#endif\n\n// We use the preprocessor's merging operator, \"##\", so that, e.g.,\n// LOG(INFO) becomes the token GOOGLE_LOG_INFO.  There's some funny\n// subtle difference between ostream member streaming functions (e.g.,\n// ostream::operator<<(int) and ostream non-member streaming functions\n// (e.g., ::operator<<(ostream&, string&): it turns out that it's\n// impossible to stream something like a string directly to an unnamed\n// ostream. We employ a neat hack by calling the stream() member\n// function of LogMessage which seems to avoid the problem.\n#define LOG(severity) COMPACT_GOOGLE_LOG_ ## severity.stream()\n#define SYSLOG(severity) SYSLOG_ ## severity(0).stream()\n\nnamespace google {\n\n// They need the definitions of integer types.\n#include \"glog/log_severity.h\"\n#include \"glog/vlog_is_on.h\"\n\n// Initialize google's logging library. You will see the program name\n// specified by argv0 in log outputs.\nGOOGLE_GLOG_DLL_DECL void InitGoogleLogging(const char* argv0);\n\n// Shutdown google's logging library.\nGOOGLE_GLOG_DLL_DECL void ShutdownGoogleLogging();\n\n// Install a function which will be called after LOG(FATAL).\nGOOGLE_GLOG_DLL_DECL void InstallFailureFunction(void (*fail_func)());\n\nclass LogSink;  // defined below\n\n// If a non-NULL sink pointer is given, we push this message to that sink.\n// For LOG_TO_SINK we then do normal LOG(severity) logging as well.\n// This is useful for capturing messages and passing/storing them\n// somewhere more specific than the global log of the process.\n// Argument types:\n//   LogSink* sink;\n//   LogSeverity severity;\n// The cast is to disambiguate NULL arguments.\n#define LOG_TO_SINK(sink, severity) \\\n  google::LogMessage(                                    \\\n      __FILE__, __LINE__,                                               \\\n      google::severity,                                  \\\n      static_cast<google::LogSink*>(sink), true).stream()\n#define LOG_TO_SINK_BUT_NOT_TO_LOGFILE(sink, severity)                  \\\n  google::LogMessage(                                    \\\n      __FILE__, __LINE__,                                               \\\n      google::severity,                                  \\\n      static_cast<google::LogSink*>(sink), false).stream()\n\n// If a non-NULL string pointer is given, we write this message to that string.\n// We then do normal LOG(severity) logging as well.\n// This is useful for capturing messages and storing them somewhere more\n// specific than the global log of the process.\n// Argument types:\n//   string* message;\n//   LogSeverity severity;\n// The cast is to disambiguate NULL arguments.\n// NOTE: LOG(severity) expands to LogMessage().stream() for the specified\n// severity.\n#define LOG_TO_STRING(severity, message) \\\n  LOG_TO_STRING_##severity(static_cast<string*>(message)).stream()\n\n// If a non-NULL pointer is given, we push the message onto the end\n// of a vector of strings; otherwise, we report it with LOG(severity).\n// This is handy for capturing messages and perhaps passing them back\n// to the caller, rather than reporting them immediately.\n// Argument types:\n//   LogSeverity severity;\n//   vector<string> *outvec;\n// The cast is to disambiguate NULL arguments.\n#define LOG_STRING(severity, outvec) \\\n  LOG_TO_STRING_##severity(static_cast<vector<string>*>(outvec)).stream()\n\n#define LOG_IF(severity, condition) \\\n  !(condition) ? (void) 0 : google::LogMessageVoidify() & LOG(severity)\n#define SYSLOG_IF(severity, condition) \\\n  !(condition) ? (void) 0 : google::LogMessageVoidify() & SYSLOG(severity)\n\n#define LOG_ASSERT(condition)  \\\n  LOG_IF(FATAL, !(condition)) << \"Assert failed: \" #condition\n#define SYSLOG_ASSERT(condition) \\\n  SYSLOG_IF(FATAL, !(condition)) << \"Assert failed: \" #condition\n\n// CHECK dies with a fatal error if condition is not true.  It is *not*\n// controlled by NDEBUG, so the check will be executed regardless of\n// compilation mode.  Therefore, it is safe to do things like:\n//    CHECK(fp->Write(x) == 4)\n#define CHECK(condition)  \\\n      LOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \\\n             << \"Check failed: \" #condition \" \"\n\n// A container for a string pointer which can be evaluated to a bool -\n// true iff the pointer is NULL.\nstruct CheckOpString {\n  CheckOpString(std::string* str) : str_(str) { }\n  // No destructor: if str_ is non-NULL, we're about to LOG(FATAL),\n  // so there's no point in cleaning up str_.\n  operator bool() const {\n    return GOOGLE_PREDICT_BRANCH_NOT_TAKEN(str_ != NULL);\n  }\n  std::string* str_;\n};\n\n// Function is overloaded for integral types to allow static const\n// integrals declared in classes and not defined to be used as arguments to\n// CHECK* macros. It's not encouraged though.\ntemplate <class T>\ninline const T&       GetReferenceableValue(const T&           t) { return t; }\ninline char           GetReferenceableValue(char               t) { return t; }\ninline unsigned char  GetReferenceableValue(unsigned char      t) { return t; }\ninline signed char    GetReferenceableValue(signed char        t) { return t; }\ninline short          GetReferenceableValue(short              t) { return t; }\ninline unsigned short GetReferenceableValue(unsigned short     t) { return t; }\ninline int            GetReferenceableValue(int                t) { return t; }\ninline unsigned int   GetReferenceableValue(unsigned int       t) { return t; }\ninline long           GetReferenceableValue(long               t) { return t; }\ninline unsigned long  GetReferenceableValue(unsigned long      t) { return t; }\ninline long long      GetReferenceableValue(long long          t) { return t; }\ninline unsigned long long GetReferenceableValue(unsigned long long t) {\n  return t;\n}\n\n// This is a dummy class to define the following operator.\nstruct DummyClassToDefineOperator {};\n\n}\n\n// Define global operator<< to declare using ::operator<<.\n// This declaration will allow use to use CHECK macros for user\n// defined classes which have operator<< (e.g., stl_logging.h).\ninline std::ostream& operator<<(\n    std::ostream& out, const google::DummyClassToDefineOperator&) {\n  return out;\n}\n\nnamespace google {\n\n// Build the error message string.\ntemplate<class t1, class t2>\nstd::string* MakeCheckOpString(const t1& v1, const t2& v2, const char* names) {\n  // It means that we cannot use stl_logging if compiler doesn't\n  // support using expression for operator.\n  // TODO(hamaji): Figure out a way to fix.\n#if 1\n  using ::operator<<;\n#endif\n  std::strstream ss;\n  ss << names << \" (\" << v1 << \" vs. \" << v2 << \")\";\n  return new std::string(ss.str(), ss.pcount());\n}\n\n// Helper functions for CHECK_OP macro.\n// The (int, int) specialization works around the issue that the compiler\n// will not instantiate the template version of the function on values of\n// unnamed enum type - see comment below.\n#define DEFINE_CHECK_OP_IMPL(name, op) \\\n  template <class t1, class t2> \\\n  inline std::string* Check##name##Impl(const t1& v1, const t2& v2, \\\n                                        const char* names) { \\\n    if (v1 op v2) return NULL; \\\n    else return MakeCheckOpString(v1, v2, names); \\\n  } \\\n  inline std::string* Check##name##Impl(int v1, int v2, const char* names) { \\\n    return Check##name##Impl<int, int>(v1, v2, names); \\\n  }\n\n// Use _EQ, _NE, _LE, etc. in case the file including base/logging.h\n// provides its own #defines for the simpler names EQ, NE, LE, etc.\n// This happens if, for example, those are used as token names in a\n// yacc grammar.\nDEFINE_CHECK_OP_IMPL(_EQ, ==)\nDEFINE_CHECK_OP_IMPL(_NE, !=)\nDEFINE_CHECK_OP_IMPL(_LE, <=)\nDEFINE_CHECK_OP_IMPL(_LT, < )\nDEFINE_CHECK_OP_IMPL(_GE, >=)\nDEFINE_CHECK_OP_IMPL(_GT, > )\n#undef DEFINE_CHECK_OP_IMPL\n\n// Helper macro for binary operators.\n// Don't use this macro directly in your code, use CHECK_EQ et al below.\n\n#if defined(STATIC_ANALYSIS)\n// Only for static analysis tool to know that it is equivalent to assert\n#define CHECK_OP_LOG(name, op, val1, val2, log) CHECK((val1) op (val2))\n#elif !defined(NDEBUG)\n// In debug mode, avoid constructing CheckOpStrings if possible,\n// to reduce the overhead of CHECK statments by 2x.\n// Real DCHECK-heavy tests have seen 1.5x speedups.\n\n// The meaning of \"string\" might be different between now and \n// when this macro gets invoked (e.g., if someone is experimenting\n// with other string implementations that get defined after this\n// file is included).  Save the current meaning now and use it \n// in the macro.\ntypedef std::string _Check_string;\n#define CHECK_OP_LOG(name, op, val1, val2, log)                         \\\n  while (google::_Check_string* _result =                \\\n         google::Check##name##Impl(                      \\\n             google::GetReferenceableValue(val1),        \\\n             google::GetReferenceableValue(val2),        \\\n             #val1 \" \" #op \" \" #val2))                                  \\\n    log(__FILE__, __LINE__,                                             \\\n        google::CheckOpString(_result)).stream()\n#else\n// In optimized mode, use CheckOpString to hint to compiler that\n// the while condition is unlikely.\n#define CHECK_OP_LOG(name, op, val1, val2, log)                         \\\n  while (google::CheckOpString _result =                 \\\n         google::Check##name##Impl(                      \\\n             google::GetReferenceableValue(val1),        \\\n             google::GetReferenceableValue(val2),        \\\n             #val1 \" \" #op \" \" #val2))                                  \\\n    log(__FILE__, __LINE__, _result).stream()\n#endif  // STATIC_ANALYSIS, !NDEBUG\n\n#if GOOGLE_STRIP_LOG <= 3\n#define CHECK_OP(name, op, val1, val2) \\\n  CHECK_OP_LOG(name, op, val1, val2, google::LogMessageFatal)\n#else\n#define CHECK_OP(name, op, val1, val2) \\\n  CHECK_OP_LOG(name, op, val1, val2, google::NullStreamFatal)\n#endif // STRIP_LOG <= 3\n\n// Equality/Inequality checks - compare two values, and log a FATAL message\n// including the two values when the result is not as expected.  The values\n// must have operator<<(ostream, ...) defined.\n//\n// You may append to the error message like so:\n//   CHECK_NE(1, 2) << \": The world must be ending!\";\n//\n// We are very careful to ensure that each argument is evaluated exactly\n// once, and that anything which is legal to pass as a function argument is\n// legal here.  In particular, the arguments may be temporary expressions\n// which will end up being destroyed at the end of the apparent statement,\n// for example:\n//   CHECK_EQ(string(\"abc\")[1], 'b');\n//\n// WARNING: These don't compile correctly if one of the arguments is a pointer\n// and the other is NULL. To work around this, simply static_cast NULL to the\n// type of the desired pointer.\n\n#define CHECK_EQ(val1, val2) CHECK_OP(_EQ, ==, val1, val2)\n#define CHECK_NE(val1, val2) CHECK_OP(_NE, !=, val1, val2)\n#define CHECK_LE(val1, val2) CHECK_OP(_LE, <=, val1, val2)\n#define CHECK_LT(val1, val2) CHECK_OP(_LT, < , val1, val2)\n#define CHECK_GE(val1, val2) CHECK_OP(_GE, >=, val1, val2)\n#define CHECK_GT(val1, val2) CHECK_OP(_GT, > , val1, val2)\n\n// Check that the input is non NULL.  This very useful in constructor\n// initializer lists.\n\n#define CHECK_NOTNULL(val) \\\n  google::CheckNotNull(__FILE__, __LINE__, \"'\" #val \"' Must be non NULL\", (val))\n\n// Helper functions for string comparisons.\n// To avoid bloat, the definitions are in logging.cc.\n#define DECLARE_CHECK_STROP_IMPL(func, expected) \\\n  GOOGLE_GLOG_DLL_DECL std::string* Check##func##expected##Impl( \\\n      const char* s1, const char* s2, const char* names);\nDECLARE_CHECK_STROP_IMPL(strcmp, true)\nDECLARE_CHECK_STROP_IMPL(strcmp, false)\nDECLARE_CHECK_STROP_IMPL(strcasecmp, true)\nDECLARE_CHECK_STROP_IMPL(strcasecmp, false)\n#undef DECLARE_CHECK_STROP_IMPL\n\n// Helper macro for string comparisons.\n// Don't use this macro directly in your code, use CHECK_STREQ et al below.\n#define CHECK_STROP(func, op, expected, s1, s2) \\\n  while (google::CheckOpString _result = \\\n         google::Check##func##expected##Impl((s1), (s2), \\\n                                     #s1 \" \" #op \" \" #s2)) \\\n    LOG(FATAL) << *_result.str_\n\n\n// String (char*) equality/inequality checks.\n// CASE versions are case-insensitive.\n//\n// Note that \"s1\" and \"s2\" may be temporary strings which are destroyed\n// by the compiler at the end of the current \"full expression\"\n// (e.g. CHECK_STREQ(Foo().c_str(), Bar().c_str())).\n\n#define CHECK_STREQ(s1, s2) CHECK_STROP(strcmp, ==, true, s1, s2)\n#define CHECK_STRNE(s1, s2) CHECK_STROP(strcmp, !=, false, s1, s2)\n#define CHECK_STRCASEEQ(s1, s2) CHECK_STROP(strcasecmp, ==, true, s1, s2)\n#define CHECK_STRCASENE(s1, s2) CHECK_STROP(strcasecmp, !=, false, s1, s2)\n\n#define CHECK_INDEX(I,A) CHECK(I < (sizeof(A)/sizeof(A[0])))\n#define CHECK_BOUND(B,A) CHECK(B <= (sizeof(A)/sizeof(A[0])))\n\n#define CHECK_DOUBLE_EQ(val1, val2)              \\\n  do {                                           \\\n    CHECK_LE((val1), (val2)+0.000000000000001L); \\\n    CHECK_GE((val1), (val2)-0.000000000000001L); \\\n  } while (0)\n\n#define CHECK_NEAR(val1, val2, margin)           \\\n  do {                                           \\\n    CHECK_LE((val1), (val2)+(margin));           \\\n    CHECK_GE((val1), (val2)-(margin));           \\\n  } while (0)\n\n// perror()..googly style!\n//\n// PLOG() and PLOG_IF() and PCHECK() behave exactly like their LOG* and\n// CHECK equivalents with the addition that they postpend a description\n// of the current state of errno to their output lines.\n\n#define PLOG(severity) GOOGLE_PLOG(severity, 0).stream()\n\n#define GOOGLE_PLOG(severity, counter)  \\\n  google::ErrnoLogMessage( \\\n      __FILE__, __LINE__, google::severity, counter, \\\n      &google::LogMessage::SendToLog)\n\n#define PLOG_IF(severity, condition) \\\n  !(condition) ? (void) 0 : google::LogMessageVoidify() & PLOG(severity)\n\n// A CHECK() macro that postpends errno if the condition is false. E.g.\n//\n// if (poll(fds, nfds, timeout) == -1) { PCHECK(errno == EINTR); ... }\n#define PCHECK(condition)  \\\n      PLOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \\\n              << \"Check failed: \" #condition \" \"\n\n// A CHECK() macro that lets you assert the success of a function that\n// returns -1 and sets errno in case of an error. E.g.\n//\n// CHECK_ERR(mkdir(path, 0700));\n//\n// or\n//\n// int fd = open(filename, flags); CHECK_ERR(fd) << \": open \" << filename;\n#define CHECK_ERR(invocation)                                          \\\nPLOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN((invocation) == -1))    \\\n        << #invocation\n\n// Use macro expansion to create, for each use of LOG_EVERY_N(), static\n// variables with the __LINE__ expansion as part of the variable name.\n#define LOG_EVERY_N_VARNAME(base, line) LOG_EVERY_N_VARNAME_CONCAT(base, line)\n#define LOG_EVERY_N_VARNAME_CONCAT(base, line) base ## line\n\n#define LOG_OCCURRENCES LOG_EVERY_N_VARNAME(occurrences_, __LINE__)\n#define LOG_OCCURRENCES_MOD_N LOG_EVERY_N_VARNAME(occurrences_mod_n_, __LINE__)\n\n#define SOME_KIND_OF_LOG_EVERY_N(severity, n, what_to_do) \\\n  static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \\\n  ++LOG_OCCURRENCES; \\\n  if (++LOG_OCCURRENCES_MOD_N > n) LOG_OCCURRENCES_MOD_N -= n; \\\n  if (LOG_OCCURRENCES_MOD_N == 1) \\\n    google::LogMessage( \\\n        __FILE__, __LINE__, google::severity, LOG_OCCURRENCES, \\\n        &what_to_do).stream()\n\n#define SOME_KIND_OF_LOG_IF_EVERY_N(severity, condition, n, what_to_do) \\\n  static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \\\n  ++LOG_OCCURRENCES; \\\n  if (condition && \\\n      ((LOG_OCCURRENCES_MOD_N=(LOG_OCCURRENCES_MOD_N + 1) % n) == (1 % n))) \\\n    google::LogMessage( \\\n        __FILE__, __LINE__, google::severity, LOG_OCCURRENCES, \\\n                 &what_to_do).stream()\n\n#define SOME_KIND_OF_PLOG_EVERY_N(severity, n, what_to_do) \\\n  static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \\\n  ++LOG_OCCURRENCES; \\\n  if (++LOG_OCCURRENCES_MOD_N > n) LOG_OCCURRENCES_MOD_N -= n; \\\n  if (LOG_OCCURRENCES_MOD_N == 1) \\\n    google::ErrnoLogMessage( \\\n        __FILE__, __LINE__, google::severity, LOG_OCCURRENCES, \\\n        &what_to_do).stream()\n\n#define SOME_KIND_OF_LOG_FIRST_N(severity, n, what_to_do) \\\n  static int LOG_OCCURRENCES = 0; \\\n  if (LOG_OCCURRENCES <= n) \\\n    ++LOG_OCCURRENCES; \\\n  if (LOG_OCCURRENCES <= n) \\\n    google::LogMessage( \\\n        __FILE__, __LINE__, google::severity, LOG_OCCURRENCES, \\\n        &what_to_do).stream()\n\nnamespace glog_internal_namespace_ {\ntemplate <bool>\nstruct CompileAssert {\n};\nstruct CrashReason;\n}  // namespace glog_internal_namespace_\n\n#define GOOGLE_GLOG_COMPILE_ASSERT(expr, msg) \\\n  typedef google::glog_internal_namespace_::CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]\n\n#define LOG_EVERY_N(severity, n)                                        \\\n  GOOGLE_GLOG_COMPILE_ASSERT(google::severity <          \\\n                             google::NUM_SEVERITIES,     \\\n                             INVALID_REQUESTED_LOG_SEVERITY);           \\\n  SOME_KIND_OF_LOG_EVERY_N(severity, (n), google::LogMessage::SendToLog)\n\n#define SYSLOG_EVERY_N(severity, n) \\\n  SOME_KIND_OF_LOG_EVERY_N(severity, (n), google::LogMessage::SendToSyslogAndLog)\n\n#define PLOG_EVERY_N(severity, n) \\\n  SOME_KIND_OF_PLOG_EVERY_N(severity, (n), google::LogMessage::SendToLog)\n\n#define LOG_FIRST_N(severity, n) \\\n  SOME_KIND_OF_LOG_FIRST_N(severity, (n), google::LogMessage::SendToLog)\n\n#define LOG_IF_EVERY_N(severity, condition, n) \\\n  SOME_KIND_OF_LOG_IF_EVERY_N(severity, (condition), (n), google::LogMessage::SendToLog)\n\n// We want the special COUNTER value available for LOG_EVERY_X()'ed messages\nenum PRIVATE_Counter {COUNTER};\n\n\n// Plus some debug-logging macros that get compiled to nothing for production\n\n#ifndef NDEBUG\n\n#define DLOG(severity) LOG(severity)\n#define DVLOG(verboselevel) VLOG(verboselevel)\n#define DLOG_IF(severity, condition) LOG_IF(severity, condition)\n#define DLOG_EVERY_N(severity, n) LOG_EVERY_N(severity, n)\n#define DLOG_IF_EVERY_N(severity, condition, n) \\\n  LOG_IF_EVERY_N(severity, condition, n)\n#define DLOG_ASSERT(condition) LOG_ASSERT(condition)\n\n// debug-only checking.  not executed in NDEBUG mode.\n#define DCHECK(condition) CHECK(condition)\n#define DCHECK_EQ(val1, val2) CHECK_EQ(val1, val2)\n#define DCHECK_NE(val1, val2) CHECK_NE(val1, val2)\n#define DCHECK_LE(val1, val2) CHECK_LE(val1, val2)\n#define DCHECK_LT(val1, val2) CHECK_LT(val1, val2)\n#define DCHECK_GE(val1, val2) CHECK_GE(val1, val2)\n#define DCHECK_GT(val1, val2) CHECK_GT(val1, val2)\n#define DCHECK_NOTNULL(val) CHECK_NOTNULL(val)\n#define DCHECK_STREQ(str1, str2) CHECK_STREQ(str1, str2)\n#define DCHECK_STRCASEEQ(str1, str2) CHECK_STRCASEEQ(str1, str2)\n#define DCHECK_STRNE(str1, str2) CHECK_STRNE(str1, str2)\n#define DCHECK_STRCASENE(str1, str2) CHECK_STRCASENE(str1, str2)\n\n#else  // NDEBUG\n\n#define DLOG(severity) \\\n  true ? (void) 0 : google::LogMessageVoidify() & LOG(severity)\n\n#define DVLOG(verboselevel) \\\n  (true || !VLOG_IS_ON(verboselevel)) ?\\\n    (void) 0 : google::LogMessageVoidify() & LOG(INFO)\n\n#define DLOG_IF(severity, condition) \\\n  (true || !(condition)) ? (void) 0 : google::LogMessageVoidify() & LOG(severity)\n\n#define DLOG_EVERY_N(severity, n) \\\n  true ? (void) 0 : google::LogMessageVoidify() & LOG(severity)\n\n#define DLOG_IF_EVERY_N(severity, condition, n) \\\n  (true || !(condition))? (void) 0 : google::LogMessageVoidify() & LOG(severity)\n\n#define DLOG_ASSERT(condition) \\\n  true ? (void) 0 : LOG_ASSERT(condition)\n\n#define DCHECK(condition) \\\n  while (false) \\\n    CHECK(condition)\n\n#define DCHECK_EQ(val1, val2) \\\n  while (false) \\\n    CHECK_EQ(val1, val2)\n\n#define DCHECK_NE(val1, val2) \\\n  while (false) \\\n    CHECK_NE(val1, val2)\n\n#define DCHECK_LE(val1, val2) \\\n  while (false) \\\n    CHECK_LE(val1, val2)\n\n#define DCHECK_LT(val1, val2) \\\n  while (false) \\\n    CHECK_LT(val1, val2)\n\n#define DCHECK_GE(val1, val2) \\\n  while (false) \\\n    CHECK_GE(val1, val2)\n\n#define DCHECK_GT(val1, val2) \\\n  while (false) \\\n    CHECK_GT(val1, val2)\n\n#define DCHECK_NOTNULL(val) (val)\n\n#define DCHECK_STREQ(str1, str2) \\\n  while (false) \\\n    CHECK_STREQ(str1, str2)\n\n#define DCHECK_STRCASEEQ(str1, str2) \\\n  while (false) \\\n    CHECK_STRCASEEQ(str1, str2)\n\n#define DCHECK_STRNE(str1, str2) \\\n  while (false) \\\n    CHECK_STRNE(str1, str2)\n\n#define DCHECK_STRCASENE(str1, str2) \\\n  while (false) \\\n    CHECK_STRCASENE(str1, str2)\n\n\n#endif  // NDEBUG\n\n// Log only in verbose mode.\n\n#define VLOG(verboselevel) LOG_IF(INFO, VLOG_IS_ON(verboselevel))\n\n#define VLOG_IF(verboselevel, condition) \\\n  LOG_IF(INFO, (condition) && VLOG_IS_ON(verboselevel))\n\n#define VLOG_EVERY_N(verboselevel, n) \\\n  LOG_IF_EVERY_N(INFO, VLOG_IS_ON(verboselevel), n)\n\n#define VLOG_IF_EVERY_N(verboselevel, condition, n) \\\n  LOG_IF_EVERY_N(INFO, (condition) && VLOG_IS_ON(verboselevel), n)\n\n//\n// This class more or less represents a particular log message.  You\n// create an instance of LogMessage and then stream stuff to it.\n// When you finish streaming to it, ~LogMessage is called and the\n// full message gets streamed to the appropriate destination.\n//\n// You shouldn't actually use LogMessage's constructor to log things,\n// though.  You should use the LOG() macro (and variants thereof)\n// above.\nclass GOOGLE_GLOG_DLL_DECL LogMessage {\npublic:\n  enum {\n    // Passing kNoLogPrefix for the line number disables the\n    // log-message prefix. Useful for using the LogMessage\n    // infrastructure as a printing utility. See also the --log_prefix\n    // flag for controlling the log-message prefix on an\n    // application-wide basis.\n    kNoLogPrefix = -1\n  };\n\n  // LogStream inherit from non-DLL-exported class (std::ostrstream)\n  // and VC++ produces a warning for this situation.\n  // However, MSDN says \"C4275 can be ignored in Microsoft Visual C++\n  // 2005 if you are deriving from a type in the Standard C++ Library\"\n  // http://msdn.microsoft.com/en-us/library/3tdb471s(VS.80).aspx\n  // Let's just ignore the warning.\n#ifdef _MSC_VER\n# pragma warning(disable: 4275)\n#endif\n  class GOOGLE_GLOG_DLL_DECL LogStream : public std::ostrstream {\n#ifdef _MSC_VER\n# pragma warning(default: 4275)\n#endif\n  public:\n    LogStream(char *buf, int len, int ctr)\n      : ostrstream(buf, len),\n        ctr_(ctr) {\n      self_ = this;\n    }\n\n    int ctr() const { return ctr_; }\n    void set_ctr(int ctr) { ctr_ = ctr; }\n    LogStream* self() const { return self_; }\n\n  private:\n    int ctr_;  // Counter hack (for the LOG_EVERY_X() macro)\n    LogStream *self_;  // Consistency check hack\n  };\n\npublic:\n  // icc 8 requires this typedef to avoid an internal compiler error.\n  typedef void (LogMessage::*SendMethod)();\n\n  LogMessage(const char* file, int line, LogSeverity severity, int ctr,\n             SendMethod send_method);\n\n  // Two special constructors that generate reduced amounts of code at\n  // LOG call sites for common cases.\n\n  // Used for LOG(INFO): Implied are:\n  // severity = INFO, ctr = 0, send_method = &LogMessage::SendToLog.\n  //\n  // Using this constructor instead of the more complex constructor above\n  // saves 19 bytes per call site.\n  LogMessage(const char* file, int line);\n\n  // Used for LOG(severity) where severity != INFO.  Implied\n  // are: ctr = 0, send_method = &LogMessage::SendToLog\n  //\n  // Using this constructor instead of the more complex constructor above\n  // saves 17 bytes per call site.\n  LogMessage(const char* file, int line, LogSeverity severity);\n\n  // Constructor to log this message to a specified sink (if not NULL).\n  // Implied are: ctr = 0, send_method = &LogMessage::SendToSinkAndLog if\n  // also_send_to_log is true, send_method = &LogMessage::SendToSink otherwise.\n  LogMessage(const char* file, int line, LogSeverity severity, LogSink* sink,\n             bool also_send_to_log);\n\n  // Constructor where we also give a vector<string> pointer\n  // for storing the messages (if the pointer is not NULL).\n  // Implied are: ctr = 0, send_method = &LogMessage::SaveOrSendToLog.\n  LogMessage(const char* file, int line, LogSeverity severity,\n             std::vector<std::string>* outvec);\n\n  // Constructor where we also give a string pointer for storing the\n  // message (if the pointer is not NULL).  Implied are: ctr = 0,\n  // send_method = &LogMessage::WriteToStringAndLog.\n  LogMessage(const char* file, int line, LogSeverity severity,\n             std::string* message);\n\n  // A special constructor used for check failures\n  LogMessage(const char* file, int line, const CheckOpString& result);\n\n  ~LogMessage();\n\n  // Flush a buffered message to the sink set in the constructor.  Always\n  // called by the destructor, it may also be called from elsewhere if\n  // needed.  Only the first call is actioned; any later ones are ignored.\n  void Flush();\n\n  // An arbitrary limit on the length of a single log message.  This\n  // is so that streaming can be done more efficiently.\n  static const size_t kMaxLogMessageLen;\n\n  // Theses should not be called directly outside of logging.*,\n  // only passed as SendMethod arguments to other LogMessage methods:\n  void SendToLog();  // Actually dispatch to the logs\n  void SendToSyslogAndLog();  // Actually dispatch to syslog and the logs\n\n  // Call abort() or similar to perform LOG(FATAL) crash.\n  static void Fail() ;\n\n  std::ostream& stream() { return *(data_->stream_); }\n\n  int preserved_errno() const { return data_->preserved_errno_; }\n\n  // Must be called without the log_mutex held.  (L < log_mutex)\n  static int64 num_messages(int severity);\n\nprivate:\n  // Fully internal SendMethod cases:\n  void SendToSinkAndLog();  // Send to sink if provided and dispatch to the logs\n  void SendToSink();  // Send to sink if provided, do nothing otherwise.\n\n  // Write to string if provided and dispatch to the logs.\n  void WriteToStringAndLog();\n\n  void SaveOrSendToLog();  // Save to stringvec if provided, else to logs\n\n  void Init(const char* file, int line, LogSeverity severity,\n            void (LogMessage::*send_method)());\n\n  // Used to fill in crash information during LOG(FATAL) failures.\n  void RecordCrashReason(glog_internal_namespace_::CrashReason* reason);\n\n  // Counts of messages sent at each priority:\n  static int64 num_messages_[NUM_SEVERITIES];  // under log_mutex\n\n  // We keep the data in a separate struct so that each instance of\n  // LogMessage uses less stack space.\n  struct GOOGLE_GLOG_DLL_DECL LogMessageData {\n    LogMessageData() {};\n\n    int preserved_errno_;      // preserved errno\n    char* buf_;\n    char* message_text_;  // Complete message text (points to selected buffer)\n    LogStream* stream_alloc_;\n    LogStream* stream_;\n    char severity_;      // What level is this LogMessage logged at?\n    int line_;                 // line number where logging call is.\n    void (LogMessage::*send_method_)();  // Call this in destructor to send\n    union {  // At most one of these is used: union to keep the size low.\n      LogSink* sink_;             // NULL or sink to send message to\n      std::vector<std::string>* outvec_; // NULL or vector to push message onto\n      std::string* message_;             // NULL or string to write message into\n    };\n    time_t timestamp_;            // Time of creation of LogMessage\n    struct ::tm tm_time_;         // Time of creation of LogMessage\n    size_t num_prefix_chars_;     // # of chars of prefix in this message\n    size_t num_chars_to_log_;     // # of chars of msg to send to log\n    size_t num_chars_to_syslog_;  // # of chars of msg to send to syslog\n    const char* basename_;        // basename of file that called LOG\n    const char* fullname_;        // fullname of file that called LOG\n    bool has_been_flushed_;       // false => data has not been flushed\n    bool first_fatal_;            // true => this was first fatal msg\n\n    ~LogMessageData();\n   private:\n    LogMessageData(const LogMessageData&);\n    void operator=(const LogMessageData&);\n  };\n\n  static LogMessageData fatal_msg_data_exclusive_;\n  static LogMessageData fatal_msg_data_shared_;\n\n  LogMessageData* allocated_;\n  LogMessageData* data_;\n\n  friend class LogDestination;\n\n  LogMessage(const LogMessage&);\n  void operator=(const LogMessage&);\n};\n\n// This class happens to be thread-hostile because all instances share\n// a single data buffer, but since it can only be created just before\n// the process dies, we don't worry so much.\nclass GOOGLE_GLOG_DLL_DECL LogMessageFatal : public LogMessage {\n public:\n  LogMessageFatal(const char* file, int line);\n  LogMessageFatal(const char* file, int line, const CheckOpString& result);\n  ~LogMessageFatal() ;\n};\n\n// A non-macro interface to the log facility; (useful\n// when the logging level is not a compile-time constant).\ninline void LogAtLevel(int const severity, std::string const &msg) {\n  LogMessage(__FILE__, __LINE__, severity).stream() << msg;\n}\n\n// A macro alternative of LogAtLevel. New code may want to use this\n// version since there are two advantages: 1. this version outputs the\n// file name and the line number where this macro is put like other\n// LOG macros, 2. this macro can be used as C++ stream.\n#define LOG_AT_LEVEL(severity) google::LogMessage(__FILE__, __LINE__, severity).stream()\n\n// A small helper for CHECK_NOTNULL().\ntemplate <typename T>\nT* CheckNotNull(const char *file, int line, const char *names, T* t) {\n  if (t == NULL) {\n    LogMessageFatal(file, line, new std::string(names));\n  }\n  return t;\n}\n\n// Allow folks to put a counter in the LOG_EVERY_X()'ed messages. This\n// only works if ostream is a LogStream. If the ostream is not a\n// LogStream you'll get an assert saying as much at runtime.\nGOOGLE_GLOG_DLL_DECL std::ostream& operator<<(std::ostream &os,\n                                              const PRIVATE_Counter&);\n\n\n// Derived class for PLOG*() above.\nclass GOOGLE_GLOG_DLL_DECL ErrnoLogMessage : public LogMessage {\n public:\n\n  ErrnoLogMessage(const char* file, int line, LogSeverity severity, int ctr,\n                  void (LogMessage::*send_method)());\n\n  // Postpends \": strerror(errno) [errno]\".\n  ~ErrnoLogMessage();\n\n private:\n  ErrnoLogMessage(const ErrnoLogMessage&);\n  void operator=(const ErrnoLogMessage&);\n};\n\n\n// This class is used to explicitly ignore values in the conditional\n// logging macros.  This avoids compiler warnings like \"value computed\n// is not used\" and \"statement has no effect\".\n\nclass GOOGLE_GLOG_DLL_DECL LogMessageVoidify {\n public:\n  LogMessageVoidify() { }\n  // This has to be an operator with a precedence lower than << but\n  // higher than ?:\n  void operator&(std::ostream&) { }\n};\n\n\n// Flushes all log files that contains messages that are at least of\n// the specified severity level.  Thread-safe.\nGOOGLE_GLOG_DLL_DECL void FlushLogFiles(LogSeverity min_severity);\n\n// Flushes all log files that contains messages that are at least of\n// the specified severity level. Thread-hostile because it ignores\n// locking -- used for catastrophic failures.\nGOOGLE_GLOG_DLL_DECL void FlushLogFilesUnsafe(LogSeverity min_severity);\n\n//\n// Set the destination to which a particular severity level of log\n// messages is sent.  If base_filename is \"\", it means \"don't log this\n// severity\".  Thread-safe.\n//\nGOOGLE_GLOG_DLL_DECL void SetLogDestination(LogSeverity severity,\n                                            const char* base_filename);\n\n//\n// Set the basename of the symlink to the latest log file at a given\n// severity.  If symlink_basename is empty, do not make a symlink.  If\n// you don't call this function, the symlink basename is the\n// invocation name of the program.  Thread-safe.\n//\nGOOGLE_GLOG_DLL_DECL void SetLogSymlink(LogSeverity severity,\n                                        const char* symlink_basename);\n\n//\n// Used to send logs to some other kind of destination\n// Users should subclass LogSink and override send to do whatever they want.\n// Implementations must be thread-safe because a shared instance will\n// be called from whichever thread ran the LOG(XXX) line.\nclass GOOGLE_GLOG_DLL_DECL LogSink {\n public:\n  virtual ~LogSink();\n\n  // Sink's logging logic (message_len is such as to exclude '\\n' at the end).\n  // This method can't use LOG() or CHECK() as logging system mutex(s) are held\n  // during this call.\n  virtual void send(LogSeverity severity, const char* full_filename,\n                    const char* base_filename, int line,\n                    const struct ::tm* tm_time,\n                    const char* message, size_t message_len) = 0;\n\n  // Redefine this to implement waiting for\n  // the sink's logging logic to complete.\n  // It will be called after each send() returns,\n  // but before that LogMessage exits or crashes.\n  // By default this function does nothing.\n  // Using this function one can implement complex logic for send()\n  // that itself involves logging; and do all this w/o causing deadlocks and\n  // inconsistent rearrangement of log messages.\n  // E.g. if a LogSink has thread-specific actions, the send() method\n  // can simply add the message to a queue and wake up another thread that\n  // handles real logging while itself making some LOG() calls;\n  // WaitTillSent() can be implemented to wait for that logic to complete.\n  // See our unittest for an example.\n  virtual void WaitTillSent();\n\n  // Returns the normal text output of the log message.\n  // Can be useful to implement send().\n  static std::string ToString(LogSeverity severity, const char* file, int line,\n                              const struct ::tm* tm_time,\n                              const char* message, size_t message_len);\n};\n\n// Add or remove a LogSink as a consumer of logging data.  Thread-safe.\nGOOGLE_GLOG_DLL_DECL void AddLogSink(LogSink *destination);\nGOOGLE_GLOG_DLL_DECL void RemoveLogSink(LogSink *destination);\n\n//\n// Specify an \"extension\" added to the filename specified via\n// SetLogDestination.  This applies to all severity levels.  It's\n// often used to append the port we're listening on to the logfile\n// name.  Thread-safe.\n//\nGOOGLE_GLOG_DLL_DECL void SetLogFilenameExtension(\n    const char* filename_extension);\n\n//\n// Make it so that all log messages of at least a particular severity\n// are logged to stderr (in addition to logging to the usual log\n// file(s)).  Thread-safe.\n//\nGOOGLE_GLOG_DLL_DECL void SetStderrLogging(LogSeverity min_severity);\n\n//\n// Make it so that all log messages go only to stderr.  Thread-safe.\n//\nGOOGLE_GLOG_DLL_DECL void LogToStderr();\n\n//\n// Make it so that all log messages of at least a particular severity are\n// logged via email to a list of addresses (in addition to logging to the\n// usual log file(s)).  The list of addresses is just a string containing\n// the email addresses to send to (separated by spaces, say).  Thread-safe.\n//\nGOOGLE_GLOG_DLL_DECL void SetEmailLogging(LogSeverity min_severity,\n                                          const char* addresses);\n\n// A simple function that sends email. dest is a commma-separated\n// list of addressess.  Thread-safe.\nGOOGLE_GLOG_DLL_DECL bool SendEmail(const char *dest,\n                                    const char *subject, const char *body);\n\nGOOGLE_GLOG_DLL_DECL const std::vector<std::string>& GetLoggingDirectories();\n\n// For tests only:  Clear the internal [cached] list of logging directories to\n// force a refresh the next time GetLoggingDirectories is called.\n// Thread-hostile.\nvoid TestOnly_ClearLoggingDirectoriesList();\n\n// Returns a set of existing temporary directories, which will be a\n// subset of the directories returned by GetLogginDirectories().\n// Thread-safe.\nGOOGLE_GLOG_DLL_DECL void GetExistingTempDirectories(\n    std::vector<std::string>* list);\n\n// Print any fatal message again -- useful to call from signal handler\n// so that the last thing in the output is the fatal message.\n// Thread-hostile, but a race is unlikely.\nGOOGLE_GLOG_DLL_DECL void ReprintFatalMessage();\n\n// Truncate a log file that may be the append-only output of multiple\n// processes and hence can't simply be renamed/reopened (typically a\n// stdout/stderr).  If the file \"path\" is > \"limit\" bytes, copy the\n// last \"keep\" bytes to offset 0 and truncate the rest. Since we could\n// be racing with other writers, this approach has the potential to\n// lose very small amounts of data. For security, only follow symlinks\n// if the path is /proc/self/fd/*\nGOOGLE_GLOG_DLL_DECL void TruncateLogFile(const char *path,\n                                          int64 limit, int64 keep);\n\n// Truncate stdout and stderr if they are over the value specified by\n// --max_log_size; keep the final 1MB.  This function has the same\n// race condition as TruncateLogFile.\nGOOGLE_GLOG_DLL_DECL void TruncateStdoutStderr();\n\n// Return the string representation of the provided LogSeverity level.\n// Thread-safe.\nGOOGLE_GLOG_DLL_DECL const char* GetLogSeverityName(LogSeverity severity);\n\n// ---------------------------------------------------------------------\n// Implementation details that are not useful to most clients\n// ---------------------------------------------------------------------\n\n// A Logger is the interface used by logging modules to emit entries\n// to a log.  A typical implementation will dump formatted data to a\n// sequence of files.  We also provide interfaces that will forward\n// the data to another thread so that the invoker never blocks.\n// Implementations should be thread-safe since the logging system\n// will write to them from multiple threads.\n\nnamespace base {\n\nclass GOOGLE_GLOG_DLL_DECL Logger {\n public:\n  virtual ~Logger();\n\n  // Writes \"message[0,message_len-1]\" corresponding to an event that\n  // occurred at \"timestamp\".  If \"force_flush\" is true, the log file\n  // is flushed immediately.\n  //\n  // The input message has already been formatted as deemed\n  // appropriate by the higher level logging facility.  For example,\n  // textual log messages already contain timestamps, and the\n  // file:linenumber header.\n  virtual void Write(bool force_flush,\n                     time_t timestamp,\n                     const char* message,\n                     int message_len) = 0;\n\n  // Flush any buffered messages\n  virtual void Flush() = 0;\n\n  // Get the current LOG file size.\n  // The returned value is approximate since some\n  // logged data may not have been flushed to disk yet.\n  virtual uint32 LogSize() = 0;\n};\n\n// Get the logger for the specified severity level.  The logger\n// remains the property of the logging module and should not be\n// deleted by the caller.  Thread-safe.\nextern GOOGLE_GLOG_DLL_DECL Logger* GetLogger(LogSeverity level);\n\n// Set the logger for the specified severity level.  The logger\n// becomes the property of the logging module and should not\n// be deleted by the caller.  Thread-safe.\nextern GOOGLE_GLOG_DLL_DECL void SetLogger(LogSeverity level, Logger* logger);\n\n}\n\n// glibc has traditionally implemented two incompatible versions of\n// strerror_r(). There is a poorly defined convention for picking the\n// version that we want, but it is not clear whether it even works with\n// all versions of glibc.\n// So, instead, we provide this wrapper that automatically detects the\n// version that is in use, and then implements POSIX semantics.\n// N.B. In addition to what POSIX says, we also guarantee that \"buf\" will\n// be set to an empty string, if this function failed. This means, in most\n// cases, you do not need to check the error code and you can directly\n// use the value of \"buf\". It will never have an undefined value.\nGOOGLE_GLOG_DLL_DECL int posix_strerror_r(int err, char *buf, size_t len);\n\n\n// A class for which we define operator<<, which does nothing.\nclass GOOGLE_GLOG_DLL_DECL NullStream : public LogMessage::LogStream {\n public:\n  // Initialize the LogStream so the messages can be written somewhere\n  // (they'll never be actually displayed). This will be needed if a\n  // NullStream& is implicitly converted to LogStream&, in which case\n  // the overloaded NullStream::operator<< will not be invoked.\n  NullStream() : LogMessage::LogStream(message_buffer_, 1, 0) { }\n  NullStream(const char* /*file*/, int /*line*/,\n             const CheckOpString& /*result*/) :\n      LogMessage::LogStream(message_buffer_, 1, 0) { }\n  NullStream &stream() { return *this; }\n private:\n  // A very short buffer for messages (which we discard anyway). This\n  // will be needed if NullStream& converted to LogStream& (e.g. as a\n  // result of a conditional expression).\n  char message_buffer_[2];\n};\n\n// Do nothing. This operator is inline, allowing the message to be\n// compiled away. The message will not be compiled away if we do\n// something like (flag ? LOG(INFO) : LOG(ERROR)) << message; when\n// SKIP_LOG=WARNING. In those cases, NullStream will be implicitly\n// converted to LogStream and the message will be computed and then\n// quietly discarded.\ntemplate<class T>\ninline NullStream& operator<<(NullStream &str, const T &value) { return str; }\n\n// Similar to NullStream, but aborts the program (without stack\n// trace), like LogMessageFatal.\nclass GOOGLE_GLOG_DLL_DECL NullStreamFatal : public NullStream {\n public:\n  NullStreamFatal() { }\n  NullStreamFatal(const char* file, int line, const CheckOpString& result) :\n      NullStream(file, line, result) { }\n   ~NullStreamFatal() { _exit(1); }\n};\n\n// Install a signal handler that will dump signal information and a stack\n// trace when the program crashes on certain signals.  We'll install the\n// signal handler for the following signals.\n//\n// SIGSEGV, SIGILL, SIGFPE, SIGABRT, SIGBUS, and SIGTERM.\n//\n// By default, the signal handler will write the failure dump to the\n// standard error.  You can customize the destination by installing your\n// own writer function by InstallFailureWriter() below.\n//\n// Note on threading:\n//\n// The function should be called before threads are created, if you want\n// to use the failure signal handler for all threads.  The stack trace\n// will be shown only for the thread that receives the signal.  In other\n// words, stack traces of other threads won't be shown.\nGOOGLE_GLOG_DLL_DECL void InstallFailureSignalHandler();\n\n// Installs a function that is used for writing the failure dump.  \"data\"\n// is the pointer to the beginning of a message to be written, and \"size\"\n// is the size of the message.  You should not expect the data is\n// terminated with '\\0'.\nGOOGLE_GLOG_DLL_DECL void InstallFailureWriter(\n    void (*writer)(const char* data, int size));\n\n}\n\n#endif // _LOGGING_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/windows/glog/raw_logging.h",
    "content": "// This file is automatically generated from src/glog/raw_logging.h.in\n// using src/windows/preprocess.sh.\n// DO NOT EDIT!\n\n// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Maxim Lifantsev\n//\n// Thread-safe logging routines that do not allocate any memory or\n// acquire any locks, and can therefore be used by low-level memory\n// allocation and synchronization code.\n\n#ifndef BASE_RAW_LOGGING_H_\n#define BASE_RAW_LOGGING_H_\n\n#include <time.h>\n\nnamespace google {\n\n#include \"glog/log_severity.h\"\n#include \"glog/vlog_is_on.h\"\n\n// Annoying stuff for windows -- makes sure clients can import these functions\n#ifndef GOOGLE_GLOG_DLL_DECL\n# if defined(_WIN32) && !defined(__CYGWIN__)\n#   define GOOGLE_GLOG_DLL_DECL  __declspec(dllimport)\n# else\n#   define GOOGLE_GLOG_DLL_DECL\n# endif\n#endif\n\n// This is similar to LOG(severity) << format... and VLOG(level) << format..,\n// but\n// * it is to be used ONLY by low-level modules that can't use normal LOG()\n// * it is desiged to be a low-level logger that does not allocate any\n//   memory and does not need any locks, hence:\n// * it logs straight and ONLY to STDERR w/o buffering\n// * it uses an explicit format and arguments list\n// * it will silently chop off really long message strings\n// Usage example:\n//   RAW_LOG(ERROR, \"Failed foo with %i: %s\", status, error);\n//   RAW_VLOG(3, \"status is %i\", status);\n// These will print an almost standard log lines like this to stderr only:\n//   E0821 211317 file.cc:123] RAW: Failed foo with 22: bad_file\n//   I0821 211317 file.cc:142] RAW: status is 20\n#define RAW_LOG(severity, ...) \\\n  do { \\\n    switch (google::severity) {  \\\n      case 0: \\\n        RAW_LOG_INFO(__VA_ARGS__); \\\n        break; \\\n      case 1: \\\n        RAW_LOG_WARNING(__VA_ARGS__); \\\n        break; \\\n      case 2: \\\n        RAW_LOG_ERROR(__VA_ARGS__); \\\n        break; \\\n      case 3: \\\n        RAW_LOG_FATAL(__VA_ARGS__); \\\n        break; \\\n      default: \\\n        break; \\\n    } \\\n  } while (0)\n\n// The following STRIP_LOG testing is performed in the header file so that it's\n// possible to completely compile out the logging code and the log messages.\n#if STRIP_LOG == 0\n#define RAW_VLOG(verboselevel, ...) \\\n  do { \\\n    if (VLOG_IS_ON(verboselevel)) { \\\n      RAW_LOG_INFO(__VA_ARGS__); \\\n    } \\\n  } while (0)\n#else\n#define RAW_VLOG(verboselevel, ...) RawLogStub__(0, __VA_ARGS__)\n#endif // STRIP_LOG == 0\n\n#if STRIP_LOG == 0\n#define RAW_LOG_INFO(...) google::RawLog__(google::INFO, \\\n                                   __FILE__, __LINE__, __VA_ARGS__)\n#else\n#define RAW_LOG_INFO(...) google::RawLogStub__(0, __VA_ARGS__)\n#endif // STRIP_LOG == 0\n\n#if STRIP_LOG <= 1\n#define RAW_LOG_WARNING(...) google::RawLog__(google::WARNING,   \\\n                                      __FILE__, __LINE__, __VA_ARGS__)\n#else\n#define RAW_LOG_WARNING(...) google::RawLogStub__(0, __VA_ARGS__)\n#endif // STRIP_LOG <= 1\n\n#if STRIP_LOG <= 2\n#define RAW_LOG_ERROR(...) google::RawLog__(google::ERROR,       \\\n                                    __FILE__, __LINE__, __VA_ARGS__)\n#else\n#define RAW_LOG_ERROR(...) google::RawLogStub__(0, __VA_ARGS__)\n#endif // STRIP_LOG <= 2\n\n#if STRIP_LOG <= 3\n#define RAW_LOG_FATAL(...) google::RawLog__(google::FATAL,       \\\n                                    __FILE__, __LINE__, __VA_ARGS__)\n#else\n#define RAW_LOG_FATAL(...) \\\n  do { \\\n    google::RawLogStub__(0, __VA_ARGS__);        \\\n    exit(1); \\\n  } while (0)\n#endif // STRIP_LOG <= 3\n\n// Similar to CHECK(condition) << message,\n// but for low-level modules: we use only RAW_LOG that does not allocate memory.\n// We do not want to provide args list here to encourage this usage:\n//   if (!cond)  RAW_LOG(FATAL, \"foo ...\", hard_to_compute_args);\n// so that the args are not computed when not needed.\n#define RAW_CHECK(condition, message)                                   \\\n  do {                                                                  \\\n    if (!(condition)) {                                                 \\\n      RAW_LOG(FATAL, \"Check %s failed: %s\", #condition, message);       \\\n    }                                                                   \\\n  } while (0)\n\n// Debug versions of RAW_LOG and RAW_CHECK\n#ifndef NDEBUG\n\n#define RAW_DLOG(severity, ...) RAW_LOG(severity, __VA_ARGS__)\n#define RAW_DCHECK(condition, message) RAW_CHECK(condition, message)\n\n#else  // NDEBUG\n\n#define RAW_DLOG(severity, ...)                                 \\\n  while (false)                                                 \\\n    RAW_LOG(severity, __VA_ARGS__)\n#define RAW_DCHECK(condition, message) \\\n  while (false) \\\n    RAW_CHECK(condition, message)\n\n#endif  // NDEBUG\n\n// Stub log function used to work around for unused variable warnings when\n// building with STRIP_LOG > 0.\nstatic inline void RawLogStub__(int ignored, ...) {\n}\n\n// Helper function to implement RAW_LOG and RAW_VLOG\n// Logs format... at \"severity\" level, reporting it\n// as called from file:line.\n// This does not allocate memory or acquire locks.\nGOOGLE_GLOG_DLL_DECL void RawLog__(LogSeverity severity,\n                                   const char* file,\n                                   int line,\n                                   const char* format, ...)\n   ;\n\n// Hack to propagate time information into this module so that\n// this module does not have to directly call localtime_r(),\n// which could allocate memory.\nGOOGLE_GLOG_DLL_DECL void RawLog__SetLastTime(const struct tm& t, int usecs);\n\n}\n\n#endif  // BASE_RAW_LOGGING_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/windows/glog/stl_logging.h",
    "content": "// This file is automatically generated from src/glog/stl_logging.h.in\n// using src/windows/preprocess.sh.\n// DO NOT EDIT!\n\n// Copyright (c) 2003, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Stream output operators for STL containers; to be used for logging *only*.\n// Inclusion of this file lets you do:\n//\n// list<string> x;\n// LOG(INFO) << \"data: \" << x;\n// vector<int> v1, v2;\n// CHECK_EQ(v1, v2);\n//\n// Note that if you want to use these operators from the non-global namespace,\n// you may get an error since they are not in namespace std (and they are not\n// in namespace std since that would result in undefined behavior). You may\n// need to write\n//\n//   using ::operator<<;\n//\n// to fix these errors.\n\n#ifndef UTIL_GTL_STL_LOGGING_INL_H_\n#define UTIL_GTL_STL_LOGGING_INL_H_\n\n#if !1\n# error We do not support stl_logging for this compiler\n#endif\n\n#include <deque>\n#include <list>\n#include <map>\n#include <ostream>\n#include <set>\n#include <utility>\n#include <vector>\n\n#ifdef __GNUC__\n# include <ext/hash_set>\n# include <ext/hash_map>\n# include <ext/slist>\n#endif\n\ntemplate<class First, class Second>\ninline std::ostream& operator<<(std::ostream& out,\n                                const std::pair<First, Second>& p) {\n  out << '(' << p.first << \", \" << p.second << ')';\n  return out;\n}\n\nnamespace google {\n\ntemplate<class Iter>\ninline void PrintSequence(std::ostream& out, Iter begin, Iter end) {\n  using ::operator<<;\n  // Output at most 100 elements -- appropriate if used for logging.\n  for (int i = 0; begin != end && i < 100; ++i, ++begin) {\n    if (i > 0) out << ' ';\n    out << *begin;\n  }\n  if (begin != end) {\n    out << \" ...\";\n  }\n}\n\n}\n\n#define OUTPUT_TWO_ARG_CONTAINER(Sequence) \\\ntemplate<class T1, class T2> \\\ninline std::ostream& operator<<(std::ostream& out, \\\n                                const Sequence<T1, T2>& seq) { \\\n  google::PrintSequence(out, seq.begin(), seq.end()); \\\n  return out; \\\n}\n\nOUTPUT_TWO_ARG_CONTAINER(std::vector)\nOUTPUT_TWO_ARG_CONTAINER(std::deque)\nOUTPUT_TWO_ARG_CONTAINER(std::list)\n#ifdef __GNUC__\nOUTPUT_TWO_ARG_CONTAINER(__gnu_cxx::slist)\n#endif\n\n#undef OUTPUT_TWO_ARG_CONTAINER\n\n#define OUTPUT_THREE_ARG_CONTAINER(Sequence) \\\ntemplate<class T1, class T2, class T3> \\\ninline std::ostream& operator<<(std::ostream& out, \\\n                                const Sequence<T1, T2, T3>& seq) { \\\n  google::PrintSequence(out, seq.begin(), seq.end()); \\\n  return out; \\\n}\n\nOUTPUT_THREE_ARG_CONTAINER(std::set)\nOUTPUT_THREE_ARG_CONTAINER(std::multiset)\n\n#undef OUTPUT_THREE_ARG_CONTAINER\n\n#define OUTPUT_FOUR_ARG_CONTAINER(Sequence) \\\ntemplate<class T1, class T2, class T3, class T4> \\\ninline std::ostream& operator<<(std::ostream& out, \\\n                                const Sequence<T1, T2, T3, T4>& seq) { \\\n  google::PrintSequence(out, seq.begin(), seq.end()); \\\n  return out; \\\n}\n\nOUTPUT_FOUR_ARG_CONTAINER(std::map)\nOUTPUT_FOUR_ARG_CONTAINER(std::multimap)\n#ifdef __GNUC__\nOUTPUT_FOUR_ARG_CONTAINER(__gnu_cxx::hash_set)\nOUTPUT_FOUR_ARG_CONTAINER(__gnu_cxx::hash_multiset)\n#endif\n\n#undef OUTPUT_FOUR_ARG_CONTAINER\n\n#define OUTPUT_FIVE_ARG_CONTAINER(Sequence) \\\ntemplate<class T1, class T2, class T3, class T4, class T5> \\\ninline std::ostream& operator<<(std::ostream& out, \\\n                                const Sequence<T1, T2, T3, T4, T5>& seq) { \\\n  google::PrintSequence(out, seq.begin(), seq.end()); \\\n  return out; \\\n}\n\n#ifdef __GNUC__\nOUTPUT_FIVE_ARG_CONTAINER(__gnu_cxx::hash_map)\nOUTPUT_FIVE_ARG_CONTAINER(__gnu_cxx::hash_multimap)\n#endif\n\n#undef OUTPUT_FIVE_ARG_CONTAINER\n\n#endif  // UTIL_GTL_STL_LOGGING_INL_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/windows/glog/vlog_is_on.h",
    "content": "// This file is automatically generated from src/glog/vlog_is_on.h.in\n// using src/windows/preprocess.sh.\n// DO NOT EDIT!\n\n// Copyright (c) 1999, 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: Ray Sidney and many others\n//\n// Defines the VLOG_IS_ON macro that controls the variable-verbosity\n// conditional logging.\n//\n// It's used by VLOG and VLOG_IF in logging.h\n// and by RAW_VLOG in raw_logging.h to trigger the logging.\n//\n// It can also be used directly e.g. like this:\n//   if (VLOG_IS_ON(2)) {\n//     // do some logging preparation and logging\n//     // that can't be accomplished e.g. via just VLOG(2) << ...;\n//   }\n//\n// The truth value that VLOG_IS_ON(level) returns is determined by \n// the three verbosity level flags:\n//   --v=<n>  Gives the default maximal active V-logging level;\n//            0 is the default.\n//            Normally positive values are used for V-logging levels.\n//   --vmodule=<str>  Gives the per-module maximal V-logging levels to override\n//                    the value given by --v.\n//                    E.g. \"my_module=2,foo*=3\" would change the logging level\n//                    for all code in source files \"my_module.*\" and \"foo*.*\"\n//                    (\"-inl\" suffixes are also disregarded for this matching).\n//\n// SetVLOGLevel helper function is provided to do limited dynamic control over\n// V-logging by overriding the per-module settings given via --vmodule flag.\n//\n// CAVEAT: --vmodule functionality is not available in non gcc compilers.\n//\n\n#ifndef BASE_VLOG_IS_ON_H_\n#define BASE_VLOG_IS_ON_H_\n\n#include \"glog/log_severity.h\"\n\n// Annoying stuff for windows -- makes sure clients can import these functions\n#ifndef GOOGLE_GLOG_DLL_DECL\n# if defined(_WIN32) && !defined(__CYGWIN__)\n#   define GOOGLE_GLOG_DLL_DECL  __declspec(dllimport)\n# else\n#   define GOOGLE_GLOG_DLL_DECL\n# endif\n#endif\n\n#if defined(__GNUC__)\n// We emit an anonymous static int* variable at every VLOG_IS_ON(n) site.\n// (Normally) the first time every VLOG_IS_ON(n) site is hit,\n// we determine what variable will dynamically control logging at this site:\n// it's either FLAGS_v or an appropriate internal variable\n// matching the current source file that represents results of\n// parsing of --vmodule flag and/or SetVLOGLevel calls.\n#define VLOG_IS_ON(verboselevel)                                \\\n  __extension__  \\\n  ({ static google::int32* vlocal__ = &google::kLogSiteUninitialized;           \\\n     google::int32 verbose_level__ = (verboselevel);                    \\\n     (*vlocal__ >= verbose_level__) &&                          \\\n     ((vlocal__ != &google::kLogSiteUninitialized) ||                   \\\n      (google::InitVLOG3__(&vlocal__, &FLAGS_v,                         \\\n                   __FILE__, verbose_level__))); })\n#else\n// GNU extensions not available, so we do not support --vmodule.\n// Dynamic value of FLAGS_v always controls the logging level.\n#define VLOG_IS_ON(verboselevel) (FLAGS_v >= (verboselevel))\n#endif\n\n// Set VLOG(_IS_ON) level for module_pattern to log_level.\n// This lets us dynamically control what is normally set by the --vmodule flag.\n// Returns the level that previously applied to module_pattern.\n// NOTE: To change the log level for VLOG(_IS_ON) sites\n//\t that have already executed after/during InitGoogleLogging,\n//\t one needs to supply the exact --vmodule pattern that applied to them.\n//       (If no --vmodule pattern applied to them\n//       the value of FLAGS_v will continue to control them.)\nextern GOOGLE_GLOG_DLL_DECL int SetVLOGLevel(const char* module_pattern,\n                                             int log_level);\n\n// Various declarations needed for VLOG_IS_ON above: =========================\n\n// Special value used to indicate that a VLOG_IS_ON site has not been\n// initialized.  We make this a large value, so the common-case check\n// of \"*vlocal__ >= verbose_level__\" in VLOG_IS_ON definition\n// passes in such cases and InitVLOG3__ is then triggered.\nextern google::int32 kLogSiteUninitialized;\n\n// Helper routine which determines the logging info for a particalur VLOG site.\n//   site_flag     is the address of the site-local pointer to the controlling\n//                 verbosity level\n//   site_default  is the default to use for *site_flag\n//   fname         is the current source file name\n//   verbose_level is the argument to VLOG_IS_ON\n// We will return the return value for VLOG_IS_ON\n// and if possible set *site_flag appropriately.\nextern GOOGLE_GLOG_DLL_DECL bool InitVLOG3__(\n    google::int32** site_flag,\n    google::int32* site_default,\n    const char* fname,\n    google::int32 verbose_level);\n\n#endif  // BASE_VLOG_IS_ON_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/windows/port.cc",
    "content": "/* Copyright (c) 2008, Google Inc.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n * \n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ---\n * Author: Craig Silverstein\n * Copied from google-perftools and modified by Shinichiro Hamaji\n */\n\n#ifndef _WIN32\n# error You should only be including windows/port.cc in a windows environment!\n#endif\n\n#include \"config.h\"\n#include <stdarg.h>    // for va_list, va_start, va_end\n#include <string.h>    // for strstr()\n#include <assert.h>\n#include <string>\n#include <vector>\n#include \"port.h\"\n\nusing std::string;\nusing std::vector;\n\n// These call the windows _vsnprintf, but always NUL-terminate.\nint safe_vsnprintf(char *str, size_t size, const char *format, va_list ap) {\n  if (size == 0)        // not even room for a \\0?\n    return -1;          // not what C99 says to do, but what windows does\n  str[size-1] = '\\0';\n  return _vsnprintf(str, size-1, format, ap);\n}\n\nint snprintf(char *str, size_t size, const char *format, ...) {\n  va_list ap;\n  va_start(ap, format);\n  const int r = vsnprintf(str, size, format, ap);\n  va_end(ap);\n  return r;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/windows/port.h",
    "content": "/* Copyright (c) 2008, Google Inc.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n * \n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ---\n * Author: Craig Silverstein\n * Copied from google-perftools and modified by Shinichiro Hamaji\n *\n * These are some portability typedefs and defines to make it a bit\n * easier to compile this code under VC++.\n *\n * Several of these are taken from glib:\n *    http://developer.gnome.org/doc/API/glib/glib-windows-compatability-functions.html\n */\n\n#ifndef CTEMPLATE_WINDOWS_PORT_H_\n#define CTEMPLATE_WINDOWS_PORT_H_\n\n#include \"config.h\"\n\n#ifdef _WIN32\n\n#define WIN32_LEAN_AND_MEAN  /* We always want minimal includes */\n#include <windows.h>\n#include <winsock.h>         /* for gethostname */\n#include <io.h>              /* because we so often use open/close/etc */\n#include <direct.h>          /* for _getcwd() */\n#include <process.h>         /* for _getpid() */\n#include <stdio.h>           /* read in vsnprintf decl. before redifining it */\n#include <stdarg.h>          /* template_dictionary.cc uses va_copy */\n#include <string.h>          /* for _strnicmp(), strerror_s() */\n#include <time.h>            /* for localtime_s() */\n/* Note: the C++ #includes are all together at the bottom.  This file is\n * used by both C and C++ code, so we put all the C++ together.\n */\n\n/* 4244: otherwise we get problems when substracting two size_t's to an int\n * 4251: it's complaining about a private struct I've chosen not to dllexport\n * 4355: we use this in a constructor, but we do it safely\n * 4715: for some reason VC++ stopped realizing you can't return after abort()\n * 4800: we know we're casting ints/char*'s to bools, and we're ok with that\n * 4996: Yes, we're ok using \"unsafe\" functions like fopen() and strerror()\n */\n#pragma warning(disable:4244 4251 4355 4715 4800 4996)\n\n/* file I/O */\n#define PATH_MAX 1024\n#define access  _access\n#define getcwd  _getcwd\n#define open    _open\n#define read    _read\n#define write   _write\n#define lseek   _lseek\n#define close   _close\n#define popen   _popen\n#define pclose  _pclose\n#define R_OK    04           /* read-only (for access()) */\n#define S_ISDIR(m)  (((m) & _S_IFMT) == _S_IFDIR)\n#ifndef __MINGW32__\nenum { STDIN_FILENO = 0, STDOUT_FILENO = 1, STDERR_FILENO = 2 };\n#endif\n#define S_IRUSR S_IREAD\n#define S_IWUSR S_IWRITE\n\n/* Not quite as lightweight as a hard-link, but more than good enough for us. */\n#define link(oldpath, newpath)  CopyFileA(oldpath, newpath, false)\n\n#define strcasecmp   _stricmp\n#define strncasecmp  _strnicmp\n\n/* In windows-land, hash<> is called hash_compare<> (from xhash.h) */\n#define hash  hash_compare\n\n/* Sleep is in ms, on windows */\n#define sleep(secs)  Sleep((secs) * 1000)\n\n/* We can't just use _vsnprintf and _snprintf as drop-in-replacements,\n * because they don't always NUL-terminate. :-(  We also can't use the\n * name vsnprintf, since windows defines that (but not snprintf (!)).\n */\nextern int snprintf(char *str, size_t size,\n                                       const char *format, ...);\nextern int safe_vsnprintf(char *str, size_t size,\n                          const char *format, va_list ap);\n#define vsnprintf(str, size, format, ap)  safe_vsnprintf(str, size, format, ap)\n#define va_copy(dst, src)  (dst) = (src)\n\n/* Windows doesn't support specifying the number of buckets as a\n * hash_map constructor arg, so we leave this blank.\n */\n#define CTEMPLATE_SMALL_HASHTABLE\n\n#define DEFAULT_TEMPLATE_ROOTDIR  \"..\"\n\n// ----------------------------------- SYSTEM/PROCESS\ntypedef int pid_t;\n#define getpid  _getpid\n\n// ----------------------------------- THREADS\ntypedef DWORD pthread_t;\ntypedef DWORD pthread_key_t;\ntypedef LONG pthread_once_t;\nenum { PTHREAD_ONCE_INIT = 0 };   // important that this be 0! for SpinLock\n#define pthread_self  GetCurrentThreadId\n#define pthread_equal(pthread_t_1, pthread_t_2)  ((pthread_t_1)==(pthread_t_2))\n\ninline struct tm* localtime_r(const time_t* timep, struct tm* result) {\n  localtime_s(result, timep);\n  return result;\n}\n\ninline char* strerror_r(int errnum, char* buf, size_t buflen) {\n  strerror_s(buf, buflen, errnum);\n  return buf;\n}\n\n#ifndef __cplusplus\n/* I don't see how to get inlining for C code in MSVC.  Ah well. */\n#define inline\n#endif\n\n#endif  /* _WIN32 */\n\n#endif  /* CTEMPLATE_WINDOWS_PORT_H_ */\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/src/windows/preprocess.sh",
    "content": "#!/bin/sh\n\n# Copyright (c) 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# ---\n# Author: Craig Silverstein\n# Copied from google-perftools and modified by Shinichiro Hamaji\n#\n# This script is meant to be run at distribution-generation time, for\n# instance by autogen.sh.  It does some of the work configure would\n# normally do, for windows systems.  In particular, it expands all the\n# @...@ variables found in .in files, and puts them here, in the windows\n# directory.\n#\n# This script should be run before any new release.\n\nif [ -z \"$1\" ]; then\n   echo \"USAGE: $0 <src/ directory>\"\n   exit 1\nfi\n\nDLLDEF_MACRO_NAME=\"GLOG_DLL_DECL\"\n\n# The text we put in every .h files we create.  As a courtesy, we'll\n# include a helpful comment for windows users as to how to use\n# GLOG_DLL_DECL.  Apparently sed expands \\n into a newline.  Good!\nDLLDEF_DEFINES=\"\\\n// NOTE: if you are statically linking the template library into your binary\\n\\\n// (rather than using the template .dll), set '/D $DLLDEF_MACRO_NAME='\\n\\\n// as a compiler flag in your project file to turn off the dllimports.\\n\\\n#ifndef $DLLDEF_MACRO_NAME\\n\\\n# define $DLLDEF_MACRO_NAME  __declspec(dllimport)\\n\\\n#endif\"\n\n# Read all the windows config info into variables\n# In order for the 'set' to take, this requires putting all in a subshell.\n(\n  while read define varname value; do\n    [ \"$define\" != \"#define\" ] && continue\n    eval \"$varname='$value'\"\n  done\n\n  # Process all the .in files in the \"glog\" subdirectory\n  mkdir -p \"$1/windows/glog\"\n  for file in `echo \"$1\"/glog/*.in`; do\n     echo \"Processing $file\"\n     outfile=\"$1/windows/glog/`basename $file .in`\"\n\n     echo \"\\\n// This file is automatically generated from $file\n// using src/windows/preprocess.sh.\n// DO NOT EDIT!\n\" > \"$outfile\"\n     # Besides replacing @...@, we also need to turn on dllimport\n     # We also need to replace hash by hash_compare (annoying we hard-code :-( )\n     sed -e \"s!@ac_windows_dllexport@!$DLLDEF_MACRO_NAME!g\" \\\n         -e \"s!@ac_windows_dllexport_defines@!$DLLDEF_DEFINES!g\" \\\n         -e \"s!@ac_cv_cxx_hash_map@!$HASH_MAP_H!g\" \\\n         -e \"s!@ac_cv_cxx_hash_namespace@!$HASH_NAMESPACE!g\" \\\n         -e \"s!@ac_cv_cxx_hash_set@!$HASH_SET_H!g\" \\\n         -e \"s!@ac_cv_have_stdint_h@!0!g\" \\\n         -e \"s!@ac_cv_have_systypes_h@!0!g\" \\\n         -e \"s!@ac_cv_have_inttypes_h@!0!g\" \\\n         -e \"s!@ac_cv_have_unistd_h@!0!g\" \\\n         -e \"s!@ac_cv_have_uint16_t@!0!g\" \\\n         -e \"s!@ac_cv_have_u_int16_t@!0!g\" \\\n         -e \"s!@ac_cv_have___uint16@!1!g\" \\\n         -e \"s!@ac_cv_have_libgflags@!0!g\" \\\n         -e \"s!@ac_cv_have___builtin_expect@!0!g\" \\\n         -e \"s!@ac_cv_cxx_using_operator@!1!g\" \\\n         -e \"s!@ac_cv___attribute___noreturn@!!g\" \\\n         -e \"s!@ac_cv___attribute___printf_4_5@!!g\" \\\n         -e \"s!@ac_google_attribute@!${HAVE___ATTRIBUTE__:-0}!g\" \\\n         -e \"s!@ac_google_end_namespace@!$_END_GOOGLE_NAMESPACE_!g\" \\\n         -e \"s!@ac_google_namespace@!$GOOGLE_NAMESPACE!g\" \\\n         -e \"s!@ac_google_start_namespace@!$_START_GOOGLE_NAMESPACE_!g\" \\\n         -e \"s!@ac_htmlparser_namespace@!$HTMLPARSER_NAMESPACE!g\" \\\n         -e \"s!\\\\bhash\\\\b!hash_compare!g\" \\\n         \"$file\" >> \"$outfile\"\n  done\n) < \"$1/windows/config.h\"\n\n# log_severity.h isn't a .in file.\necho \"\\\n// This file is automatically generated from $1/glog/log_severity.h\n// using src/windows/preprocess.sh.\n// DO NOT EDIT!\n\" > \"$1/windows/glog/log_severity.h\"\ncat \"$1/glog/log_severity.h\" >> \"$1/windows/glog/log_severity.h\"\n\necho \"DONE\"\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/vsprojects/libglog/libglog.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"shift_jis\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9.00\"\r\n\tName=\"libglog\"\r\n\tProjectGUID=\"{34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1}\"\r\n\tRootNamespace=\"libglog\"\r\n\tKeyword=\"Win32Proj\"\r\n\tTargetFrameworkVersion=\"196613\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"..\\..\\src\\windows\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBGLOG_EXPORTS\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"2\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"..\\..\\src\\windows\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBGLOG_EXPORTS\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tEnableFunctionLevelLinking=\"true\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"2\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\logging.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\port.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\raw_logging.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\utilities.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\vlog_is_on.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\base\\commandlineflags.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\config.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\base\\googleinit.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\glog\\log_severity.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\glog\\logging.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\base\\mutex.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\port.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\glog\\raw_logging.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\glog\\stl_logging.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\utilities.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\glog\\vlog_is_on.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/vsprojects/libglog_static/libglog_static.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"shift_jis\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9.00\"\r\n\tName=\"libglog_static\"\r\n\tProjectGUID=\"{772C2111-BBBF-49E6-B912-198A7F7A88E5}\"\r\n\tRootNamespace=\"libglog_static\"\r\n\tTargetFrameworkVersion=\"196613\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"2\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"..\\..\\src\\windows\"\r\n\t\t\t\tPreprocessorDefinitions=\"GOOGLE_GLOG_DLL_DECL=\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"2\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"..\\..\\src\\windows\"\r\n\t\t\t\tPreprocessorDefinitions=\"GOOGLE_GLOG_DLL_DECL=\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tEnableFunctionLevelLinking=\"true\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\logging.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\port.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\raw_logging.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\utilities.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\vlog_is_on.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\base\\commandlineflags.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\config.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\base\\googleinit.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\glog\\log_severity.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\glog\\logging.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\base\\mutex.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\port.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\glog\\raw_logging.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\glog\\stl_logging.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\utilities.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\windows\\glog\\vlog_is_on.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/vsprojects/logging_unittest/logging_unittest.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9.00\"\r\n\tName=\"logging_unittest\"\r\n\tProjectGUID=\"{DD0690AA-5E09-46B5-83FD-4B28604CABA8}\"\r\n\tRootNamespace=\"logging_unittest\"\r\n\tKeyword=\"Win32Proj\"\r\n\tTargetFrameworkVersion=\"196613\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"..\\..\\src\\windows\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"..\\..\\src\\windows\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tEnableFunctionLevelLinking=\"true\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\logging_unittest.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\googletest.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/glog/vsprojects/logging_unittest_static/logging_unittest_static.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"shift_jis\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9.00\"\r\n\tName=\"logging_unittest_static\"\r\n\tProjectGUID=\"{9B239B45-84A9-4E06-AC46-8E220CD43974}\"\r\n\tRootNamespace=\"logging_unittest_static\"\r\n\tTargetFrameworkVersion=\"196613\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"2\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"..\\..\\src\\windows\"\r\n\t\t\t\tPreprocessorDefinitions=\"GOOGLE_GLOG_DLL_DECL=\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"2\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"..\\..\\src\\windows\"\r\n\t\t\t\tPreprocessorDefinitions=\"GOOGLE_GLOG_DLL_DECL=\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tEnableFunctionLevelLinking=\"true\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\googletest.h\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\src\\logging_unittest.cc\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/TODO",
    "content": "x86_format.c\n------------\nintel: jmpf -> jmp, callf -> call\natt: jmpf -> ljmp, callf -> lcall\n\nopcode table\n------------\nfinish typing instructions\nfix flag clear/set/toggle types\n\nix64 stuff\n----------\ndocument output file formats in web page\nfeatures doc: register aliases, implicit operands, stack mods,\nring0 flags, eflags, cpu model/isa\n\nia32_handle_* implementation\n\nfix operand 0F C2\nCMPPS\n\n* sysenter, sysexit as CALL types -- preceded by MSR writes\n* SYSENTER/SYSEXIT stack : overwrites SS, ESP\n* stos, cmps, scas, movs, ins, outs, lods -> OP_PTR\n* OP_SIZE in implicit operands\n* use OP_SIZE to choose reg sizes!\n\nDONE?? :\nimplicit operands: provide action ?\ne.g. add/inc for stach, write, etc \nreplace table numbers in opcodes.dat with\n#defines for table names\n\nreplace 0  with INSN_INVALID   [or maybe FF for imnvalid and 00 for Not Applicable */\nno wait that is only for prefix tables -- n/p\n\nif ( prefx) only use if insn != invalid\n\nthese should cover all the wacky disasm exceptions \n\nfor the rep one we can chet, match only a 0x90\n\ntodo: privilege | ring\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_implicit.c",
    "content": "#include <stdlib.h>\n\n#include \"ia32_implicit.h\"\n#include \"ia32_insn.h\"\n#include \"ia32_reg.h\"\n#include \"x86_operand_list.h\"\n\n/* Conventions: Register operands which are aliases of another register \n *   operand (e.g. AX in one operand and AL in another) assume that the\n *   operands are different registers and that alias tracking will resolve\n *   data flow. This means that something like\n *   \tmov ax, al\n *   would have 'write only' access for AX and 'read only' access for AL,\n *   even though both AL and AX are read and written */\ntypedef struct {\n\tuint32_t type;\n\tuint32_t operand;\n} op_implicit_list_t;\n\nstatic op_implicit_list_t list_aaa[] = \n\t/* 37 : AAA : rw AL */\n\t/* 3F : AAS : rw AL */\n\t{{ OP_R | OP_W, REG_BYTE_OFFSET }, {0}};\t/* aaa */\n\nstatic op_implicit_list_t list_aad[] = \n\t/* D5 0A, D5 (ib) : AAD : rw AX */\n\t/* D4 0A, D4 (ib) : AAM : rw AX */\n\t{{ OP_R | OP_W, REG_WORD_OFFSET }, {0}};\t/* aad */\n\nstatic op_implicit_list_t list_call[] = \n\t/* E8, FF, 9A, FF : CALL : rw ESP, rw EIP */\n\t/* C2, C3, CA, CB : RET  : rw ESP, rw EIP */\n\t{{ OP_R | OP_W, REG_EIP_INDEX }, \n\t { OP_R | OP_W, REG_ESP_INDEX }, {0}};\t/* call, ret */\n\nstatic op_implicit_list_t list_cbw[] = \n\t/* 98 : CBW : r AL, rw AX */\n\t{{ OP_R | OP_W, REG_WORD_OFFSET },\n\t { OP_R, REG_BYTE_OFFSET}, {0}};\t\t/* cbw */\n\nstatic op_implicit_list_t list_cwde[] = \n\t/* 98 : CWDE : r AX, rw EAX */\n\t{{ OP_R | OP_W, REG_DWORD_OFFSET },\n\t { OP_R, REG_WORD_OFFSET }, {0}};\t\t/* cwde */\n\nstatic op_implicit_list_t list_clts[] = \n\t/* 0F 06 : CLTS : rw CR0 */\n\t{{ OP_R | OP_W, REG_CTRL_OFFSET}, {0}};\t/* clts */\n\nstatic op_implicit_list_t list_cmpxchg[] = \n\t/* 0F B0 : CMPXCHG : rw AL */\n\t{{ OP_R | OP_W, REG_BYTE_OFFSET }, {0}};\t/* cmpxchg */\n\nstatic op_implicit_list_t list_cmpxchgb[] = \n\t/* 0F B1 : CMPXCHG : rw EAX */\n\t{{ OP_R | OP_W, REG_DWORD_OFFSET }, {0}};\t/* cmpxchg */\n\nstatic op_implicit_list_t list_cmpxchg8b[] = \n\t/* 0F C7 : CMPXCHG8B : rw EDX, rw EAX, r ECX, r EBX */\n\t{{ OP_R | OP_W, REG_DWORD_OFFSET }, \n\t { OP_R | OP_W, REG_DWORD_OFFSET + 2 }, \n\t { OP_R, REG_DWORD_OFFSET + 1 }, \n\t { OP_R, REG_DWORD_OFFSET + 3 }, {0}};\t/* cmpxchg8b */\n\nstatic op_implicit_list_t list_cpuid[] = \n\t/* 0F A2 : CPUID : rw EAX, w EBX, w ECX, w EDX */\n\t{{ OP_R | OP_W, REG_DWORD_OFFSET }, \n\t { OP_W, REG_DWORD_OFFSET + 1 }, \n\t { OP_W, REG_DWORD_OFFSET + 2 }, \n\t { OP_W, REG_DWORD_OFFSET + 3 }, {0}};\t/* cpuid */\n\nstatic op_implicit_list_t list_cwd[] = \n\t/* 99 : CWD/CWQ : rw EAX, w EDX */\n\t{{ OP_R | OP_W, REG_DWORD_OFFSET }, \n\t { OP_W, REG_DWORD_OFFSET + 2 }, {0}};\t/* cwd */\n\nstatic op_implicit_list_t list_daa[] = \n\t/* 27 : DAA : rw AL */\n\t/* 2F : DAS : rw AL */\n\t{{ OP_R | OP_W, REG_BYTE_OFFSET }, {0}};\t/* daa */\n\nstatic op_implicit_list_t list_idiv[] = \n\t/* F6 : DIV, IDIV : r AX, w AL, w AH */\n\t/* FIXED: first op was EAX, not Aw. TODO: verify! */\n\t{{ OP_R, REG_WORD_OFFSET }, \n\t  { OP_W, REG_BYTE_OFFSET },\n\t  { OP_W, REG_BYTE_OFFSET + 4 }, {0}};\t/* div */\n\nstatic op_implicit_list_t list_div[] = \n\t/* F7 : DIV, IDIV : rw EDX, rw EAX */\n\t{{ OP_R | OP_W, REG_DWORD_OFFSET + 2 }, \n\t  { OP_R | OP_W, REG_DWORD_OFFSET }, {0}};\t/* div */\n\nstatic op_implicit_list_t list_enter[] = \n\t/* C8 : ENTER : rw ESP w EBP */\n\t{{ OP_R | OP_W, REG_DWORD_OFFSET + 4 }, \n\t { OP_R, REG_DWORD_OFFSET + 5 }, {0}};\t/* enter */\n\nstatic op_implicit_list_t list_f2xm1[] = \n\t/* D9 F0 : F2XM1 : rw ST(0) */\n\t/* D9 E1 : FABS : rw ST(0) */\n\t/* D9 E0 : FCHS : rw ST(0) */\n\t/* D9 FF : FCOS : rw ST(0)*/\n\t/* D8, DA : FDIV : rw ST(0) */\n\t/* D8, DA : FDIVR : rw ST(0) */\n\t/* D9 F2 : FPTAN : rw ST(0) */\n\t/* D9 FC : FRNDINT : rw ST(0) */\n\t/* D9 FB : FSINCOS : rw ST(0) */\n\t/* D9 FE : FSIN : rw ST(0) */\n\t/* D9 FA : FSQRT : rw ST(0) */\n\t/* D9 F4 : FXTRACT : rw ST(0) */\n\t{{ OP_R | OP_W, REG_FPU_OFFSET }, {0}};\t/* f2xm1 */\n\nstatic op_implicit_list_t list_fcom[] = \n\t/* D8, DC, DE D9 : FCOM : r ST(0) */\n\t/* DE, DA : FICOM : r ST(0) */\n\t/* DF, D8 : FIST : r ST(0) */\n\t/* D9 E4 : FTST : r ST(0) */\n\t/* D9 E5 : FXAM : r ST(0) */\n\t{{ OP_R, REG_FPU_OFFSET }, {0}};\t\t/* fcom */\n\nstatic op_implicit_list_t list_fpatan[] = \n\t/* D9 F3 : FPATAN : r ST(0), rw ST(1) */\n\t{{ OP_R, REG_FPU_OFFSET }, {0}};\t\t/* fpatan */\n\nstatic op_implicit_list_t list_fprem[] = \n\t/* D9 F8, D9 F5 : FPREM : rw ST(0) r ST(1) */\n\t/* D9 FD : FSCALE : rw ST(0), r ST(1) */\n\t{{ OP_R | OP_W, REG_FPU_OFFSET }, \t\n\t { OP_R, REG_FPU_OFFSET + 1 }, {0}};\t/* fprem */\n\nstatic op_implicit_list_t list_faddp[] = \n\t/* DE C1 : FADDP : r ST(0), rw ST(1) */\n\t/* DE E9 : FSUBP : r ST(0), rw ST(1) */\n\t/* D9 F1 : FYL2X : r ST(0), rw ST(1) */\n\t/* D9 F9 : FYL2XP1 : r ST(0), rw ST(1) */\n\t{{ OP_R, REG_FPU_OFFSET },\n\t { OP_R | OP_W, REG_FPU_OFFSET + 1 }, {0}};\t/* faddp */\n\nstatic op_implicit_list_t list_fucompp[] = \n\t/* DA E9 : FUCOMPP : r ST(0), r ST(1) */\n\t{{ OP_R, REG_FPU_OFFSET },\n\t { OP_R, REG_FPU_OFFSET + 1 }, {0}};\t/* fucompp */\n\nstatic op_implicit_list_t list_imul[] = \n\t/* F6 : IMUL : r AL, w AX */\n\t/* F6 : MUL : r AL, w AX */\n\t{{ OP_R, REG_BYTE_OFFSET },\n\t { OP_W, REG_WORD_OFFSET }, {0}};\t\t/* imul */\n\nstatic op_implicit_list_t list_mul[] = \n\t/* F7 : IMUL : rw EAX, w EDX */\n\t/* F7 : MUL : rw EAX, w EDX */\n\t{{ OP_R | OP_W, REG_DWORD_OFFSET },\n\t { OP_W, REG_DWORD_OFFSET + 2 }, {0}};\t/* imul */\n\nstatic op_implicit_list_t list_lahf[] = \n\t/* 9F : LAHF : r EFLAGS, w AH */\n\t{{ OP_R, REG_FLAGS_INDEX },\n\t { OP_W, REG_BYTE_OFFSET + 4 }, {0}};\t/* lahf */\n\nstatic op_implicit_list_t list_ldmxcsr[] = \n\t/* 0F AE : LDMXCSR : w MXCSR SSE Control Status Reg */\n\t{{ OP_W, REG_MXCSG_INDEX }, {0}};\t\t/* ldmxcsr */\n\nstatic op_implicit_list_t list_leave[] = \n\t/* C9 : LEAVE :  rw ESP, w EBP */\n\t{{ OP_R | OP_W, REG_ESP_INDEX },\n\t { OP_W, REG_DWORD_OFFSET + 5 }, {0}};\t/* leave */\n\nstatic op_implicit_list_t list_lgdt[] = \n\t/* 0F 01 : LGDT : w GDTR */\n\t{{ OP_W, REG_GDTR_INDEX }, {0}};\t\t/* lgdt */\n\nstatic op_implicit_list_t list_lidt[] = \n\t/* 0F 01 : LIDT : w IDTR */\n\t{{ OP_W, REG_IDTR_INDEX }, {0}};\t\t/* lidt */\n\nstatic op_implicit_list_t list_lldt[] = \n\t/* 0F 00 : LLDT : w LDTR */\n\t{{ OP_W, REG_LDTR_INDEX }, {0}};\t\t/* lldt */\n\nstatic op_implicit_list_t list_lmsw[] = \n\t/* 0F 01 : LMSW : w CR0 */\n\t{{ OP_W, REG_CTRL_OFFSET }, {0}};\t\t/* lmsw */\n\nstatic op_implicit_list_t list_loop[] = \n\t/* E0, E1, E2 : LOOP : rw ECX */\n\t{{ OP_R | OP_W, REG_DWORD_OFFSET + 1 }, {0}};/* loop */\n\nstatic op_implicit_list_t list_ltr[] = \n\t/* 0F 00 : LTR : w Task Register */\n\t{{ OP_W, REG_TR_INDEX }, {0}};\t\t/* ltr */\n\nstatic op_implicit_list_t list_pop[] = \n\t/* 8F, 58, 1F, 07, 17, 0F A1, 0F A9 : POP : rw ESP */\n\t/* FF, 50, 6A, 68, 0E, 16, 1E, 06, 0F A0, 0F A8 : PUSH : rw ESP */\n\t{{ OP_R | OP_W, REG_ESP_INDEX }, {0}};\t/* pop, push */\n\nstatic op_implicit_list_t list_popad[] = \n\t/* 61 : POPAD : rw esp, w edi esi ebp ebx edx ecx eax */\n\t{{ OP_R | OP_W, REG_ESP_INDEX },\n\t { OP_W, REG_DWORD_OFFSET + 7 },\n\t { OP_W, REG_DWORD_OFFSET + 6 },\n\t { OP_W, REG_DWORD_OFFSET + 5 },\n\t { OP_W, REG_DWORD_OFFSET + 3 },\n\t { OP_W, REG_DWORD_OFFSET + 2 },\n\t { OP_W, REG_DWORD_OFFSET + 1 },\n\t { OP_W, REG_DWORD_OFFSET }, {0}};\t\t/* popad */\n\nstatic op_implicit_list_t list_popfd[] = \n\t/* 9D : POPFD : rw esp, w eflags */\n\t{{ OP_R | OP_W, REG_ESP_INDEX },\n\t { OP_W, REG_FLAGS_INDEX }, {0}};\t\t/* popfd */\n\nstatic op_implicit_list_t list_pushad[] = \n\t/* FF, 50, 6A, 68, 0E, 16, 1E, 06, 0F A0, 0F A8 : PUSH : rw ESP */\n\t/* 60 : PUSHAD : rw esp, r eax ecx edx ebx esp ebp esi edi */\n\t{{ OP_R | OP_W, REG_ESP_INDEX },\n\t { OP_R, REG_DWORD_OFFSET },\n\t { OP_R, REG_DWORD_OFFSET + 1 },\n\t { OP_R, REG_DWORD_OFFSET + 2 },\n\t { OP_R, REG_DWORD_OFFSET + 3 },\n\t { OP_R, REG_DWORD_OFFSET + 5 },\n\t { OP_R, REG_DWORD_OFFSET + 6 },\n\t { OP_R, REG_DWORD_OFFSET + 7 }, {0}};\t/* pushad */\n\nstatic op_implicit_list_t list_pushfd[] = \n\t/* 9C : PUSHFD : rw esp, r eflags */\n\t{{ OP_R | OP_W, REG_ESP_INDEX },\n\t { OP_R, REG_FLAGS_INDEX }, {0}};\t\t/* pushfd */\n\nstatic op_implicit_list_t list_rdmsr[] = \n\t/* 0F 32 : RDMSR : r ECX, w EDX, w EAX */\n\t{{ OP_R, REG_DWORD_OFFSET + 1 },\n\t { OP_W, REG_DWORD_OFFSET + 2 },\n\t { OP_W, REG_DWORD_OFFSET }, {0}};\t/* rdmsr */\n\nstatic op_implicit_list_t list_rdpmc[] = \n\t/* 0F 33 : RDPMC : r ECX, w EDX, w EAX */\n\t{{ OP_R, REG_DWORD_OFFSET + 1 },\n\t { OP_W, REG_DWORD_OFFSET + 2 },\n\t { OP_W, REG_DWORD_OFFSET }, {0}};\t\t/* rdpmc */\n\nstatic op_implicit_list_t list_rdtsc[] = \n\t/* 0F 31 : RDTSC : rw EDX, rw EAX */\n\t{{ OP_R | OP_W, REG_DWORD_OFFSET + 2 },\n\t { OP_R | OP_W, REG_DWORD_OFFSET }, {0}};\t/* rdtsc */\n\nstatic op_implicit_list_t list_rep[] = \n\t/* F3, F2 ... : REP : rw ECX */\n\t{{ OP_R | OP_W, REG_DWORD_OFFSET + 1 }, {0}};/* rep */\n\nstatic op_implicit_list_t list_rsm[] = \n\t/* 0F AA : RSM : r CR4, r CR0 */\n\t{{ OP_R, REG_CTRL_OFFSET + 4 }, \n\t { OP_R, REG_CTRL_OFFSET }, {0}};\t\t/* rsm */\n\nstatic op_implicit_list_t list_sahf[] = \n\t/* 9E : SAHF : r ah, rw eflags (set SF ZF AF PF CF) */\n\t{{ OP_R, REG_DWORD_OFFSET }, {0}};\t\t/* sahf */\n\nstatic op_implicit_list_t list_sgdt[] = \n\t/* 0F : SGDT : r gdtr */\n\t/* TODO: finish this! */\n\t{{ OP_R, REG_DWORD_OFFSET }, {0}};\t\t/* sgdt */\n\nstatic op_implicit_list_t list_sidt[] = \n\t/* 0F : SIDT : r idtr */\n\t/* TODO: finish this! */\n\t{{ OP_R, REG_DWORD_OFFSET }, {0}};\t\t/* sidt */\n\nstatic op_implicit_list_t list_sldt[] = \n\t/* 0F : SLDT : r ldtr */\n\t/* TODO: finish this! */\n\t{{ OP_R, REG_DWORD_OFFSET }, {0}};\t\t/* sldt */\n\nstatic op_implicit_list_t list_smsw[] = \n\t/* 0F : SMSW : r CR0 */\n\t/* TODO: finish this! */\n\t{{ OP_R, REG_DWORD_OFFSET }, {0}};\t\t/* smsw */\n\nstatic op_implicit_list_t list_stmxcsr[] = \n\t/* 0F AE : STMXCSR : r MXCSR */\n\t/* TODO: finish this! */\n\t{{ OP_R, REG_DWORD_OFFSET }, {0}};\t\t/* stmxcsr */\n\nstatic op_implicit_list_t list_str[] = \n\t/* 0F 00 : STR : r TR (task register) */\n\t/* TODO: finish this! */\n\t{{ OP_R, REG_DWORD_OFFSET }, {0}};\t\t/* str */\n\nstatic op_implicit_list_t list_sysenter[] = \n\t/* 0F 34 : SYSENTER : w cs, w eip, w ss, w esp, r CR0, w eflags\n\t *         r sysenter_cs_msr, sysenter_esp_msr, sysenter_eip_msr */\n\t/* TODO: finish this! */\n\t{{ OP_R, REG_DWORD_OFFSET }, {0}};\t\t/* sysenter */\n\nstatic op_implicit_list_t list_sysexit[] = \n\t/* 0F 35 : SYSEXIT : r edx, r ecx, w cs, w eip, w ss, w esp\n\t * \t   r sysenter_cs_msr */\n\t/* TODO: finish this! */\n\t{{ OP_R, REG_DWORD_OFFSET }, {0}};\t\t/* sysexit */\n\nstatic op_implicit_list_t list_wrmsr[] = \n\t/* 0F 30 : WRMST : r edx, r eax, r ecx */\n\t/* TODO: finish this! */\n\t{{ OP_R, REG_DWORD_OFFSET }, {0}};\t\t/* wrmsr */\n\nstatic op_implicit_list_t list_xlat[] = \n\t/* D7 : XLAT : rw al r ebx (ptr) */\n\t/* TODO: finish this! */\n\t{{ OP_R, REG_DWORD_OFFSET }, {0}};\t\t/* xlat */\n/* TODO:\n * monitor 0f 01 c8 eax OP_R ecx OP_R edx OP_R\n * mwait 0f 01 c9 eax OP_R ecx OP_R\n */\nstatic op_implicit_list_t list_monitor[] = \n\t{{ OP_R, REG_DWORD_OFFSET }, {0}};\t\t/* monitor */\nstatic op_implicit_list_t list_mwait[] = \n\t{{ OP_R, REG_DWORD_OFFSET }, {0}};\t\t/* mwait */\n\nop_implicit_list_t *op_implicit_list[] = {\n\t/* This is a list of implicit operands which are read/written by\n\t * various x86 instructions. Note that modifications to the stack\n\t * register are mentioned here, but that additional information on\n\t * the effect an instruction has on the stack is contained in the\n\t * x86_insn_t 'stack_mod' and 'stack_mod_val' fields. Use of the\n\t * eflags register, i.e. setting, clearing, and testing flags, is\n\t * not recorded here but rather in the flags_set and flags_tested\n\t * fields of the x86_insn_t.*/\n\tNULL,\n\tlist_aaa, list_aad, list_call, list_cbw,\t\t/* 1 - 4 */\n\tlist_cwde, list_clts, list_cmpxchg, list_cmpxchgb,\t/* 5 - 8 */\n\tlist_cmpxchg8b, list_cpuid, list_cwd, list_daa,\t\t/* 9 - 12 */\n\tlist_idiv, list_div, list_enter, list_f2xm1,\t\t/* 13 - 16 */\n\tlist_fcom, list_fpatan, list_fprem, list_faddp,\t\t/* 17 - 20 */\n\tlist_fucompp, list_imul, list_mul, list_lahf,\t\t/* 21 - 24 */\n\tlist_ldmxcsr, list_leave, list_lgdt, list_lidt,\t\t/* 25 - 28 */\n\tlist_lldt, list_lmsw, list_loop, list_ltr,\t\t/* 29 - 32 */\n\tlist_pop, list_popad, list_popfd, list_pushad,\t\t/* 33 - 36 */\n\tlist_pushfd, list_rdmsr, list_rdpmc, list_rdtsc,\t/* 37 - 40 */\n\t/* NOTE: 'REP' is a hack since it is a prefix: if its position\n\t * in the table changes, then change IDX_IMPLICIT_REP in the .h */\n\tlist_rep, list_rsm, list_sahf, list_sgdt,\t\t/* 41 - 44 */\n\tlist_sidt, list_sldt, list_smsw, list_stmxcsr,\t\t/* 45 - 48 */\n\tlist_str, list_sysenter, list_sysexit, list_wrmsr,\t/* 49 - 52 */\n\tlist_xlat, list_monitor, list_mwait,\t\t\t/* 53 - 55*/\n\tNULL\t\t\t\t\t\t/* end of list */\n };\n\n#define LAST_IMPL_IDX 55\n\nstatic void handle_impl_reg( x86_op_t *op, uint32_t val ) {\n\tx86_reg_t *reg = &op->data.reg;\n\top->type = op_register;\n\tia32_handle_register( reg, (unsigned int) val );\n\tswitch (reg->size) {\n\t\tcase 1:\n\t\t\top->datatype = op_byte; break;\n\t\tcase 2:\n\t\t\top->datatype = op_word; break;\n\t\tcase 4:\n\t\t\top->datatype = op_dword; break;\n\t\tcase 8:\n\t\t\top->datatype = op_qword; break;\n\t\tcase 10:\n\t\t\top->datatype = op_extreal; break;\n\t\tcase 16:\n\t\t\top->datatype = op_dqword; break;\n\t}\n\treturn;\n}\n\n/* 'impl_idx' is the value from the opcode table: between 1 and LAST_IMPL_IDX */\n/* returns number of operands added */\nunsigned int ia32_insn_implicit_ops( x86_insn_t *insn, unsigned int impl_idx ) {\n\top_implicit_list_t *list;\n\tx86_op_t *op;\n\tunsigned int num = 0;\n\n\tif (! impl_idx || impl_idx > LAST_IMPL_IDX ) {\n\t\treturn 0;\n\t}\n\n\tfor ( list = op_implicit_list[impl_idx]; list->type; list++, num++ ) {\n\t\tenum x86_op_access access = (enum x86_op_access) OP_PERM(list->type);\n\t\tenum x86_op_flags  flags  = (enum x86_op_flags) (OP_FLAGS(list->type) >> 12);\n\n\t\top = NULL;\n\t\t/* In some cases (MUL), EAX is an implicit operand hardcoded in\n                 * the instruction without being explicitly listed in assembly.\n                 * For this situation, find the hardcoded operand and add the\n                 * implied flag rather than adding a new implicit operand. */\n\t\tx86_oplist_t * existing;\n\t\tif (ia32_true_register_id(list->operand) == REG_DWORD_OFFSET) {\n\t\t\tfor ( existing = insn->operands; existing; existing = existing->next ) {\n\t\t\t\tif (existing->op.type == op_register &&\n\t                            existing->op.data.reg.id == list->operand) {\n\t\t\t\t\top = &existing->op;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!op) {\n\t\t\top = x86_operand_new( insn );\n\t\t\t/* all implicit operands are registers */\n\t\t\thandle_impl_reg( op, list->operand );\n\t\t\t/* decrement the 'explicit count' incremented by default in\n\t\t\t * x86_operand_new */\n\t\t\tinsn->explicit_count = insn->explicit_count -1;\n\t\t}\n\t\tif (!op) {\n\t\t\treturn num;\t/* gah! return early */\n\t\t}\n\t\top->access |= access;\n\t\top->flags |= flags;\n\t\top->flags |= op_implied;\n\t}\n\t\n\treturn num;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_implicit.h",
    "content": "#ifndef IA32_IMPLICIT_H\n#define IA32_IMPLICIT_H\n\n#include \"libdis.h\"\n\n/* OK, this is a hack to deal with prefixes having implicit operands...\n * thought I had removed all the old hackishness ;( */\n\n#define IDX_IMPLICIT_REP 41\t/* change this if the table changes! */\n\nunsigned int ia32_insn_implicit_ops( x86_insn_t *insn, unsigned int impl_idx );\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_insn.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include \"qword.h\"\n\n#include \"ia32_insn.h\"\n#include \"ia32_opcode_tables.h\"\n\n#include \"ia32_reg.h\"\n#include \"ia32_operand.h\"\n#include \"ia32_implicit.h\"\n#include \"ia32_settings.h\"\n\n#include \"libdis.h\"\n\nextern ia32_table_desc_t ia32_tables[];\nextern ia32_settings_t ia32_settings;\n\n#define IS_SP( op )  (op->type == op_register && \t\\\n\t\t(op->data.reg.id == REG_ESP_INDEX || \t\\\n\t\t op->data.reg.alias == REG_ESP_INDEX) )\n#define IS_IMM( op ) (op->type == op_immediate )\n\n#ifdef WIN32\n#  define INLINE \n#else\n#  define INLINE inline\n#endif\n\n/* for calculating stack modification based on an operand */\nstatic INLINE int32_t long_from_operand( x86_op_t *op ) {\n\n\tif (! IS_IMM(op) ) {\n\t\treturn 0L;\n\t}\n\n\tswitch ( op->datatype ) {\n\t\tcase op_byte:\n\t\t\treturn (int32_t) op->data.sbyte;\n\t\tcase op_word:\n\t\t\treturn (int32_t) op->data.sword;\n\t\tcase op_qword:\n\t\t\treturn (int32_t) op->data.sqword;\n\t\tcase op_dword:\n\t\t\treturn op->data.sdword;\n\t\tdefault:\n\t\t\t/* these are not used in stack insn */\n\t\t\tbreak;\n\t}\n\n\treturn 0L;\n}\n\t\t\n\n/* determine what this insn does to the stack */\nstatic void ia32_stack_mod(x86_insn_t *insn) {\n\tx86_op_t *dest, *src = NULL;\n\n\tif (! insn || ! insn->operands ) {\n\t\treturn;\n\t}\n       \n\tdest = &insn->operands->op;\n\tif ( dest ) {\n\t\tsrc = &insn->operands->next->op;\n\t}\n\n\tinsn->stack_mod = 0; \n\tinsn->stack_mod_val = 0;\n\n\tswitch ( insn->type ) {\n\t\tcase insn_call:\n\t\tcase insn_callcc:\n\t\t\tinsn->stack_mod = 1;\n\t\t\tinsn->stack_mod_val = insn->addr_size * -1;\n\t\t\tbreak;\n\t\tcase insn_push:\n\t\t\tinsn->stack_mod = 1;\n\t\t\tinsn->stack_mod_val = insn->addr_size * -1;\n\t\t\tbreak;\n\t\tcase insn_return:\n\t\t\tinsn->stack_mod = 1;\n\t\t\tinsn->stack_mod_val = insn->addr_size;\n\t\tcase insn_int: case insn_intcc:\n\t\tcase insn_iret:\n\t\t\tbreak;\n\t\tcase insn_pop:\n\t\t\tinsn->stack_mod = 1;\n\t\t\tif (! IS_SP( dest ) ) {\n\t\t\t\tinsn->stack_mod_val = insn->op_size;\n\t\t\t} /* else we don't know the stack change in a pop esp */\n\t\t\tbreak;\n\t\tcase insn_enter:\n\t\t\tinsn->stack_mod = 1;\n\t\t\tinsn->stack_mod_val = 0; /* TODO : FIX */\n\t\t\tbreak;\n\t\tcase insn_leave:\n\t\t\tinsn->stack_mod = 1;\n\t\t\tinsn->stack_mod_val = 0; /* TODO : FIX */\n\t\t\tbreak;\n\t\tcase insn_pushregs:\n\t\t\tinsn->stack_mod = 1;\n\t\t\tinsn->stack_mod_val = 0; /* TODO : FIX */\n\t\t\tbreak;\n\t\tcase insn_popregs:\n\t\t\tinsn->stack_mod = 1;\n\t\t\tinsn->stack_mod_val = 0; /* TODO : FIX */\n\t\t\tbreak;\n\t\tcase insn_pushflags:\n\t\t\tinsn->stack_mod = 1;\n\t\t\tinsn->stack_mod_val = 0; /* TODO : FIX */\n\t\t\tbreak;\n\t\tcase insn_popflags:\n\t\t\tinsn->stack_mod = 1;\n\t\t\tinsn->stack_mod_val = 0; /* TODO : FIX */\n\t\t\tbreak;\n\t\tcase insn_add:\n\t\t\tif ( IS_SP( dest ) ) {\n\t\t\t\tinsn->stack_mod = 1;\n\t\t\t\tinsn->stack_mod_val = long_from_operand( src ); \n\t\t\t}\n\t\t\tbreak;\n\t\tcase insn_sub:\n\t\t\tif ( IS_SP( dest ) ) {\n\t\t\t\tinsn->stack_mod = 1;\n\t\t\t\tinsn->stack_mod_val = long_from_operand( src ); \n\t\t\t\tinsn->stack_mod_val *= -1;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase insn_inc:\n\t\t\tif ( IS_SP( dest ) ) {\n\t\t\t\tinsn->stack_mod = 1;\n\t\t\t\tinsn->stack_mod_val = 1;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase insn_dec:\n\t\t\tif ( IS_SP( dest ) ) {\n\t\t\t\tinsn->stack_mod = 1;\n\t\t\t\tinsn->stack_mod_val = 1;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase insn_mov: case insn_movcc:\n\t\tcase insn_xchg: case insn_xchgcc:\n\t\tcase insn_mul: case insn_div:\n\t\tcase insn_shl: case insn_shr:\n\t\tcase insn_rol: case insn_ror:\n\t\tcase insn_and: case insn_or:\n\t\tcase insn_not: case insn_neg:\n\t\tcase insn_xor:\n\t\t\tif ( IS_SP( dest ) ) {\n\t\t\t\tinsn->stack_mod = 1;\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\tif (! strcmp(\"enter\", insn->mnemonic) ) {\n\t\tinsn->stack_mod = 1;\n\t} else if (! strcmp(\"leave\", insn->mnemonic) ) {\n\t\tinsn->stack_mod = 1;\n\t}\n\n\t/* for mov, etc we return 0 -- unknown stack mod */\n\n\treturn;\n}\n\n/* get the cpu details for this insn from cpu flags int */\nstatic void ia32_handle_cpu( x86_insn_t *insn, unsigned int cpu ) {\n\tinsn->cpu = (enum x86_insn_cpu) CPU_MODEL(cpu);\n\tinsn->isa = (enum x86_insn_isa) (ISA_SUBSET(cpu)) >> 16;\n\treturn;\n}\n\n/* handle mnemonic type and group */\nstatic void ia32_handle_mnemtype(x86_insn_t *insn, unsigned int mnemtype) {\n\tunsigned int type = mnemtype & ~INS_FLAG_MASK;\n        insn->group = (enum x86_insn_group) (INS_GROUP(type)) >> 12;\n        insn->type = (enum x86_insn_type) INS_TYPE(type);\n\n\treturn;\n}\n\nstatic void ia32_handle_notes(x86_insn_t *insn, unsigned int notes) {\n\tinsn->note = (enum x86_insn_note) notes;\n\treturn;\n}\n\nstatic void ia32_handle_eflags( x86_insn_t *insn, unsigned int eflags) {\n        unsigned int flags;\n\n        /* handle flags effected */\n        flags = INS_FLAGS_TEST(eflags);\n        /* handle weird OR cases */\n        /* these are either JLE (ZF | SF<>OF) or JBE (CF | ZF) */\n        if (flags & INS_TEST_OR) {\n                flags &= ~INS_TEST_OR;\n                if ( flags & INS_TEST_ZERO ) {\n                        flags &= ~INS_TEST_ZERO;\n                        if ( flags & INS_TEST_CARRY ) {\n                                flags &= ~INS_TEST_CARRY ;\n                                flags |= (int)insn_carry_or_zero_set;\n                        } else if ( flags & INS_TEST_SFNEOF ) {\n                                flags &= ~INS_TEST_SFNEOF;\n                                flags |= (int)insn_zero_set_or_sign_ne_oflow;\n                        }\n                }\n        }\n        insn->flags_tested = (enum x86_flag_status) flags;\n\n        insn->flags_set = (enum x86_flag_status) INS_FLAGS_SET(eflags) >> 16;\n\n\treturn;\n}\n\nstatic void ia32_handle_prefix( x86_insn_t *insn, unsigned int prefixes ) {\n\n        insn->prefix = (enum x86_insn_prefix) prefixes & PREFIX_MASK; // >> 20;\n        if (! (insn->prefix & PREFIX_PRINT_MASK) ) {\n\t\t/* no printable prefixes */\n                insn->prefix = insn_no_prefix;\n        }\n\n        /* concat all prefix strings */\n        if ( (unsigned int)insn->prefix & PREFIX_LOCK ) {\n                strncat(insn->prefix_string, \"lock \", 32 - \n\t\t\t\tstrlen(insn->prefix_string));\n        }\n\n        if ( (unsigned int)insn->prefix & PREFIX_REPNZ ) {\n                strncat(insn->prefix_string, \"repnz \", 32  - \n\t\t\t\tstrlen(insn->prefix_string));\n        } else if ( (unsigned int)insn->prefix & PREFIX_REPZ ) {\n                strncat(insn->prefix_string, \"repz \", 32 - \n\t\t\t\tstrlen(insn->prefix_string));\n        }\n\n        return;\n}\n\n\nstatic void reg_32_to_16( x86_op_t *op, x86_insn_t *insn, void *arg ) {\n\n\t/* if this is a 32-bit register and it is a general register ... */\n\tif ( op->type == op_register && op->data.reg.size == 4 && \n\t     (op->data.reg.type & reg_gen) ) {\n\t\t/* WORD registers are 8 indices off from DWORD registers */\n\t\tia32_handle_register( &(op->data.reg), \n\t\t\t\top->data.reg.id + 8 );\n\t}\n}\n\nstatic void handle_insn_metadata( x86_insn_t *insn, ia32_insn_t *raw_insn ) {\n\tia32_handle_mnemtype( insn, raw_insn->mnem_flag );\n\tia32_handle_notes( insn, raw_insn->notes );\n\tia32_handle_eflags( insn, raw_insn->flags_effected );\n\tia32_handle_cpu( insn, raw_insn->cpu );\n\tia32_stack_mod( insn );\n}\n\nstatic size_t ia32_decode_insn( unsigned char *buf, size_t buf_len, \n\t\t\t   ia32_insn_t *raw_insn, x86_insn_t *insn,\n\t\t\t   unsigned int prefixes ) {\n\tsize_t size, op_size;\n\tunsigned char modrm;\n\n\t/* this should never happen, but just in case... */\n\tif ( raw_insn->mnem_flag == INS_INVALID ) {\n\t\treturn 0;\n\t}\n\n\tif (ia32_settings.options & opt_16_bit) {\n\t\tinsn->op_size = ( prefixes & PREFIX_OP_SIZE ) ? 4 : 2;\n\t\tinsn->addr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 4 : 2;\n\t} else {\n\t\tinsn->op_size = ( prefixes & PREFIX_OP_SIZE ) ? 2 : 4;\n\t\tinsn->addr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 2 : 4;\n\t}\n\n\n\t/*  ++++   1. Copy mnemonic and mnemonic-flags to CODE struct */\n\tif ((ia32_settings.options & opt_att_mnemonics) && raw_insn->mnemonic_att[0]) {\n\t\tstrncpy( insn->mnemonic, raw_insn->mnemonic_att, 16 );\n\t}\n\telse {\n\t\tstrncpy( insn->mnemonic, raw_insn->mnemonic, 16 );\n\t}\n\tia32_handle_prefix( insn, prefixes );\n\n\thandle_insn_metadata( insn, raw_insn );\n\n\t/* prefetch the next byte in case it is a modr/m byte -- saves\n\t * worrying about whether the 'mod/rm' operand or the 'reg' operand\n\t * occurs first */\n\tmodrm = GET_BYTE( buf, buf_len );\n\n\t/*  ++++   2. Decode Explicit Operands */\n\t/* Intel uses up to 3 explicit operands in its instructions;\n\t * the first is 'dest', the second is 'src', and the third\n\t * is an additional source value (usually an immediate value,\n\t * e.g. in the MUL instructions). These three explicit operands\n\t * are encoded in the opcode tables, even if they are not used \n\t * by the instruction. Additional implicit operands are stored\n\t * in a supplemental table and are handled later. */\n\n\top_size = ia32_decode_operand( buf, buf_len, insn, raw_insn->dest, \n\t\t\t\t\traw_insn->dest_flag, prefixes, modrm );\n\t/* advance buffer, increase size if necessary */\n\tbuf += op_size;\n\tbuf_len -= op_size;\n\tsize = op_size;\n\n\top_size = ia32_decode_operand( buf, buf_len, insn, raw_insn->src, \n\t\t\t\t\traw_insn->src_flag, prefixes, modrm );\n\tbuf += op_size;\n\tbuf_len -= op_size;\n\tsize += op_size;\n\n\top_size = ia32_decode_operand( buf, buf_len, insn, raw_insn->aux, \n\t\t\t\t\traw_insn->aux_flag, prefixes, modrm );\n\tsize += op_size;\n\n\n\t/*  ++++   3. Decode Implicit Operands */\n\t/* apply implicit operands */\n\tia32_insn_implicit_ops( insn, raw_insn->implicit_ops );\n\t/* we have one small inelegant hack here, to deal with \n\t * the two prefixes that have implicit operands. If Intel\n\t * adds more, we'll change the algorithm to suit :) */\n\tif ( (prefixes & PREFIX_REPZ) || (prefixes & PREFIX_REPNZ) ) {\n\t\tia32_insn_implicit_ops( insn, IDX_IMPLICIT_REP );\n\t}\n\n\n\t/* 16-bit hack: foreach operand, if 32-bit reg, make 16-bit reg */\n\tif ( insn->op_size == 2 ) {\n\t\tx86_operand_foreach( insn, reg_32_to_16, NULL, op_any );\n\t}\n\n\treturn size;\n}\n\n\n/* convenience routine */\n#define USES_MOD_RM(flag) \\\n\t(flag == ADDRMETH_E || flag == ADDRMETH_M || flag == ADDRMETH_Q || \\\n\t flag == ADDRMETH_W || flag == ADDRMETH_R)\n\nstatic int uses_modrm_flag( unsigned int flag ) {\n\tunsigned int meth;\n\tif ( flag == ARG_NONE ) {\n\t\treturn 0;\n\t}\n\tmeth = (flag & ADDRMETH_MASK);\n\tif ( USES_MOD_RM(meth) ) {\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n/* This routine performs the actual byte-by-byte opcode table lookup.\n * Originally it was pretty simple: get a byte, adjust it to a proper\n * index into the table, then check the table row at that index to\n * determine what to do next. But is anything that simple with Intel?\n * This is now a huge, convoluted mess, mostly of bitter comments. */\n/* buf: pointer to next byte to read from stream \n * buf_len: length of buf\n * table: index of table to use for lookups\n * raw_insn: output pointer that receives opcode definition\n * prefixes: output integer that is encoded with prefixes in insn \n * returns : number of bytes consumed from stream during lookup */ \nsize_t ia32_table_lookup( unsigned char *buf, size_t buf_len,\n\t\t\t\t unsigned int table, ia32_insn_t **raw_insn,\n\t\t\t\t unsigned int *prefixes ) {\n\tunsigned char *next, op = buf[0];\t/* byte value -- 'opcode' */\n\tsize_t size = 1, sub_size = 0, next_len;\n\tia32_table_desc_t *table_desc;\n\tunsigned int subtable, prefix = 0, recurse_table = 0;\n\n\ttable_desc = &ia32_tables[table];\n\n\top = GET_BYTE( buf, buf_len );\n\n\tif ( table_desc->type == tbl_fpu && op > table_desc->maxlim) {\n\t\t/* one of the fucking FPU tables out of the 00-BH range */\n\t\t/* OK,. this is a bit of a hack -- the proper way would\n\t\t * have been to use subtables in the 00-BF FPU opcode tables,\n\t\t * but that is rather wasteful of space... */\n\t\ttable_desc = &ia32_tables[table +1];\n\t}\n\n\t/* PERFORM TABLE LOOKUP */\n\n\t/* ModR/M trick: shift extension bits into lowest bits of byte */\n\t/* Note: non-ModR/M tables have a shift value of 0 */\n\top >>= table_desc->shift;\n\n\t/* ModR/M trick: mask out high bits to turn extension into an index */\n\t/* Note: non-ModR/M tables have a mask value of 0xFF */\n\top &= table_desc->mask;\n\n\n\t/* Sparse table trick: check that byte is <= max value */\n\t/* Note: full (256-entry) tables have a maxlim of 155 */\n\tif ( op > table_desc->maxlim ) {\n\t\t/* this is a partial table, truncated at the tail,\n\t\t   and op is out of range! */\n\t\treturn INVALID_INSN;\n\t}\n\n\t/* Sparse table trick: check that byte is >= min value */\n\t/* Note: full (256-entry) tables have a minlim of 0 */\n\tif ( table_desc->minlim > op ) {\n\t\t/* this is a partial table, truncated at the head,\n\t\t   and op is out of range! */\n\t\treturn INVALID_INSN;\n\t}\n\t/* adjust op to be an offset from table index 0 */\n\top -= table_desc->minlim;\n\n\t/* Yay! 'op' is now fully adjusted to be an index into 'table' */\n\t*raw_insn = &(table_desc->table[op]);\n\t//printf(\"BYTE %X TABLE %d OP %X\\n\", buf[0], table, op ); \n\n\tif ( (*raw_insn)->mnem_flag & INS_FLAG_PREFIX ) {\n\t\tprefix = (*raw_insn)->mnem_flag & PREFIX_MASK;\n\t}\n\n\n\t/* handle escape to a multibyte/coproc/extension/etc table */\n\t/* NOTE: if insn is a prefix and has a subtable, then we\n\t *       only recurse if this is the first prefix byte --\n\t *       that is, if *prefixes is 0. \n\t * NOTE also that suffix tables are handled later */\n\tsubtable = (*raw_insn)->table;\n\n\tif ( subtable && ia32_tables[subtable].type != tbl_suffix &&\n\t     (! prefix || ! *prefixes) ) {\n\n\t     \tif ( ia32_tables[subtable].type == tbl_ext_ext ||\n\t     \t     ia32_tables[subtable].type == tbl_fpu_ext ) {\n\t\t\t/* opcode extension: reuse current byte in buffer */\n\t\t\tnext = buf;\n\t\t\tnext_len = buf_len;\n\t\t} else {\n\t\t\t/* \"normal\" opcode: advance to next byte in buffer */\n\t\t\tif ( buf_len > 1 ) {\n\t\t\t\tnext = &buf[1];\n\t\t\t\tnext_len = buf_len - 1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// buffer is truncated \n\t\t\t\treturn INVALID_INSN;\n\t\t\t}\n\t\t}\n\t\t/* we encountered a multibyte opcode: recurse using the\n\t\t * table specified in the opcode definition */\n\t\tsub_size = ia32_table_lookup( next, next_len, subtable, \n\t\t\t\traw_insn, prefixes );\n\n\t\t/* SSE/prefix hack: if the original opcode def was a \n\t\t * prefix that specified a subtable, and the subtable\n\t\t * lookup returned a valid insn, then we have encountered\n\t\t * an SSE opcode definition; otherwise, we pretend we\n\t\t * never did the subtable lookup, and deal with the \n\t\t * prefix normally later */\n\t\tif ( prefix && ( sub_size == INVALID_INSN  ||\n\t\t       INS_TYPE((*raw_insn)->mnem_flag) == INS_INVALID ) ) {\n\t\t\t/* this is a prefix, not an SSE insn :\n\t\t\t * lookup next byte in main table,\n\t\t\t * subsize will be reset during the\n\t\t\t * main table lookup */\n\t\t\trecurse_table = 1;\n\t\t} else {\n\t\t\t/* this is either a subtable (two-byte) insn\n\t\t\t * or an invalid insn: either way, set prefix\n\t\t\t * to NULL and end the opcode lookup */\n\t\t\tprefix = 0;\n\t\t\t// short-circuit lookup on invalid insn\n\t\t\tif (sub_size == INVALID_INSN) return INVALID_INSN;\n\t\t}\n\t} else if ( prefix ) {\n\t\trecurse_table = 1;\n\t}\n\n\t/* by default, we assume that we have the opcode definition,\n\t * and there is no need to recurse on the same table, but\n\t * if we do then a prefix was encountered... */\n\tif ( recurse_table ) {\n\t\t/* this must have been a prefix: use the same table for\n\t\t * lookup of the next byte */\n\t\tsub_size = ia32_table_lookup( &buf[1], buf_len - 1, table, \n\t\t\t\traw_insn, prefixes );\n\n\t\t// short-circuit lookup on invalid insn\n\t\tif (sub_size == INVALID_INSN) return INVALID_INSN;\n\n\t\t/* a bit of a hack for branch hints */\n\t\tif ( prefix & BRANCH_HINT_MASK ) {\n\t\t\tif ( INS_GROUP((*raw_insn)->mnem_flag) == INS_EXEC ) {\n\t\t\t\t/* segment override prefixes are invalid for\n\t\t\t \t* all branch instructions, so delete them */\n\t\t\t\tprefix &= ~PREFIX_REG_MASK;\n\t\t\t} else {\n\t\t\t\tprefix &= ~BRANCH_HINT_MASK;\n\t\t\t}\n\t\t}\n\n\t\t/* apply prefix to instruction */\n\n\t\t/* TODO: implement something enforcing prefix groups */\n\t\t(*prefixes) |= prefix;\n\t}\n\n\t/* if this lookup was in a ModR/M table, then an opcode byte is \n\t * NOT consumed: subtract accordingly. NOTE that if none of the\n\t * operands used the ModR/M, then we need to consume the byte\n\t * here, but ONLY in the 'top-level' opcode extension table */\n\n\tif ( table_desc->type == tbl_ext_ext ) {\n\t\t/* extensions-to-extensions never consume a byte */\n\t\t--size;\n\t} else if ( (table_desc->type == tbl_extension || \n\t       \t     table_desc->type == tbl_fpu ||\n\t\t     table_desc->type == tbl_fpu_ext ) && \n\t\t/* extensions that have an operand encoded in ModR/M\n\t\t * never consume a byte */\n\t      \t    (uses_modrm_flag((*raw_insn)->dest_flag) || \n\t             uses_modrm_flag((*raw_insn)->src_flag) )  \t) {\n\t\t--size;\n\t}\n\n\tsize += sub_size;\n\n\treturn size;\n}\n\nstatic size_t handle_insn_suffix( unsigned char *buf, size_t buf_len,\n\t\t\t   ia32_insn_t *raw_insn, x86_insn_t * insn ) {\n\tia32_table_desc_t *table_desc;\n\tia32_insn_t *sfx_insn;\n\tsize_t size;\n\tunsigned int prefixes = 0;\n\n\ttable_desc = &ia32_tables[raw_insn->table]; \n\tsize = ia32_table_lookup( buf, buf_len, raw_insn->table, &sfx_insn,\n\t\t\t\t &prefixes );\n\tif (size == INVALID_INSN || sfx_insn->mnem_flag == INS_INVALID ) {\n\t\treturn 0;\n\t}\n\n\tstrncpy( insn->mnemonic, sfx_insn->mnemonic, 16 );\n\thandle_insn_metadata( insn, sfx_insn );\n\n\treturn 1;\n}\n\n/* invalid instructions are handled by returning 0 [error] from the\n * function, setting the size of the insn to 1 byte, and copying\n * the byte at the start of the invalid insn into the x86_insn_t.\n * if the caller is saving the x86_insn_t for invalid instructions,\n * instead of discarding them, this will maintain a consistent\n * address space in the x86_insn_ts */\n\n/* this function is called by the controlling disassembler, so its name and\n * calling convention cannot be changed */\n/*    buf   points to the loc of the current opcode (start of the \n *          instruction) in the instruction stream. The instruction \n *          stream is assumed to be a buffer of bytes read directly \n *          from the file for the purpose of disassembly; a mem-mapped \n *          file is ideal for *        this.\n *    insn points to a code structure to be filled by instr_decode\n *    returns the size of the decoded instruction in bytes */\nsize_t ia32_disasm_addr( unsigned char * buf, size_t buf_len, \n\t\tx86_insn_t *insn ) {\n\tia32_insn_t *raw_insn = NULL;\n\tunsigned int prefixes = 0;\n\tsize_t size, sfx_size;\n\t\n\tif ( (ia32_settings.options & opt_ignore_nulls) && buf_len > 3 &&\n\t    !buf[0] && !buf[1] && !buf[2] && !buf[3]) {\n\t\t/* IF IGNORE_NULLS is set AND\n\t\t * first 4 bytes in the intruction stream are NULL\n\t\t * THEN return 0 (END_OF_DISASSEMBLY) */\n\t\t/* TODO: set errno */\n\t\tMAKE_INVALID( insn, buf );\n\t\treturn 0;\t/* 4 00 bytes in a row? This isn't code! */\n\t}\n\n\t/* Perform recursive table lookup starting with main table (0) */\n\tsize = ia32_table_lookup(buf, buf_len, idx_Main, &raw_insn, &prefixes);\n\tif ( size == INVALID_INSN || size > buf_len || raw_insn->mnem_flag == INS_INVALID ) {\n\t\tMAKE_INVALID( insn, buf );\n\t\t/* TODO: set errno */\n\t\treturn 0;\n\t}\n\n\t/* We now have the opcode itself figured out: we can decode\n\t * the rest of the instruction. */\n\tsize += ia32_decode_insn( &buf[size], buf_len - size, raw_insn, insn, \n\t\t\t\t  prefixes );\n\tif ( raw_insn->mnem_flag & INS_FLAG_SUFFIX ) {\n\t\t/* AMD 3DNow! suffix -- get proper operand type here */\n\t\tsfx_size = handle_insn_suffix( &buf[size], buf_len - size,\n\t\t\t\traw_insn, insn );\n\t\tif (! sfx_size ) {\n\t\t\t/* TODO: set errno */\n\t\t\tMAKE_INVALID( insn, buf );\n\t\t\treturn 0;\n\t\t}\n\n\t\tsize += sfx_size;\n\t}\n\n\tif (! size ) {\n\t\t/* invalid insn */\n\t\tMAKE_INVALID( insn, buf );\n\t\treturn 0;\n\t}\n\n\n\tinsn->size = size;\n\treturn size;\t\t/* return size of instruction in bytes */\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_insn.h",
    "content": "#ifndef IA32_INSN_H\n#define IA32_INSN_H\n/* this file contains the structure of opcode definitions and the\n * constants they use */\n\n#include <sys/types.h>\n#include \"libdis.h\"\n\n\n#define GET_BYTE( buf, buf_len ) buf_len ? *buf : 0\n\n#define OP_SIZE_16\t1\n#define OP_SIZE_32\t2\n#define ADDR_SIZE_16\t4\n#define ADDR_SIZE_32\t8\n\n#define MAX_INSTRUCTION_SIZE 20\n\n/* invalid instructions are handled by returning 0 [error] from the\n * function, setting the size of the insn to 1 byte, and copying\n * the byte at the start of the invalid insn into the x86_insn_t.\n * if the caller is saving the x86_insn_t for invalid instructions,\n * instead of discarding them, this will maintain a consistent\n * address space in the x86_insn_ts */\n\n#define INVALID_INSN ((size_t) -1)\t/* return value for invalid insn */\n#define MAKE_INVALID( i, buf )                          \\\n                strcpy( i->mnemonic, \"invalid\" );       \\\n                x86_oplist_free( i );                   \\\n                i->size = 1;                            \\\n                i->group = insn_none;                   \\\n                i->type = insn_invalid;                 \\\n                memcpy( i->bytes, buf, 1 );\n\n\nsize_t ia32_disasm_addr( unsigned char * buf, size_t buf_len, \n\t\tx86_insn_t *insn);\n\n\n/* --------------------------------------------------------- Table Lookup */\n/* IA32 Instruction defintion for ia32_opcodes.c */\ntypedef struct {\n   unsigned int table;          /* escape to this sub-table */\n   unsigned int mnem_flag;      /* Flags referring to mnemonic */\n   unsigned int notes;          /* Notes for this instruction */\n   unsigned int dest_flag, src_flag, aux_flag; /* and for specific operands */\n   unsigned int cpu;            /* minimumCPU [AND with clocks?? */\n   char mnemonic[16];           /* buffers for building instruction */\n   char mnemonic_att[16];       /* at&t style mnemonic name */\n   int32_t dest;\n   int32_t src;\n   int32_t aux;\n   unsigned int flags_effected;\n   unsigned int implicit_ops;\t/* implicit operands */\n} ia32_insn_t;\n\n\n\n/* --------------------------------------------------------- Prefixes */\n/* Prefix Flags */\n/* Prefixes, same order as in the manual */\n/* had to reverse the values of the first three as they were entered into\n * libdis.h incorrectly. */\n#define PREFIX_LOCK       0x0004\n#define PREFIX_REPNZ      0x0002\n#define PREFIX_REPZ       0x0001\n#define PREFIX_OP_SIZE    0x0010\n#define PREFIX_ADDR_SIZE  0x0020\n#define PREFIX_CS         0x0100\n#define PREFIX_SS         0x0200\n#define PREFIX_DS         0x0300\n#define PREFIX_ES         0x0400\n#define PREFIX_FS         0x0500\n#define PREFIX_GS         0x0600\n#define PREFIX_TAKEN      0x1000\t/* branch taken */\n#define PREFIX_NOTTAKEN   0x2000\t/* branch not taken */\n#define PREFIX_REG_MASK   0x0F00\n#define BRANCH_HINT_MASK  0x3000 \n#define PREFIX_PRINT_MASK 0x000F\t/* printable prefixes */\n#define PREFIX_MASK       0xFFFF\n\n/* ---------------------------------------------------------- CPU Type */\n\n#define cpu_8086         0x0001\n#define cpu_80286        0x0002\n#define cpu_80386        0x0003\n#define cpu_80387        0x0004 /* originally these were a co-proc */\n#define cpu_80486        0x0005\n#define cpu_PENTIUM      0x0006\n#define cpu_PENTPRO      0x0007\n#define cpu_PENTIUM2     0x0008\n#define cpu_PENTIUM3     0x0009\n#define cpu_PENTIUM4     0x000A\n#define cpu_K6\t\t 0x0010\n#define cpu_K7\t\t 0x0020\n#define cpu_ATHLON\t 0x0030\n#define CPU_MODEL_MASK\t 0xFFFF\n#define CPU_MODEL(cpu)\t (cpu & CPU_MODEL_MASK)\n/* intel instruction subsets */\n#define isa_GP\t\t 0x10000\t/* General Purpose Instructions */\n#define isa_FPU\t\t 0x20000\t/* FPU instructions */\n#define isa_FPUMGT\t 0x30000\t/* FPU/SIMD Management */\n#define isa_MMX\t\t 0x40000\t/* MMX */\n#define isa_SSE1\t 0x50000\t/* SSE */\n#define isa_SSE2\t 0x60000\t/* SSE 2 */\n#define isa_SSE3\t 0x70000\t/* SSE 3 */\n#define isa_3DNOW\t 0x80000\t/* AMD 3d Now */\n#define isa_SYS\t\t 0x90000\t/* System Instructions */\n#define ISA_SUBSET_MASK\t 0xFFFF0000\n#define ISA_SUBSET(isa)\t(isa & ISA_SUBSET_MASK)\n\n\n/* ------------------------------------------------------ Operand Decoding */\n#define ARG_NONE         0\n\n/* Using a mask allows us to store info such as OP_SIGNED in the\n * operand flags field */\n#define   OPFLAGS_MASK \t0x0000FFFF\n\n/* Operand Addressing Methods, per intel manual */\n#define   ADDRMETH_MASK\t0x00FF0000\n\n/* note: for instructions with implied operands, use no ADDRMETH */\n#define   ADDRMETH_A  \t0x00010000   \n#define   ADDRMETH_C   \t0x00020000\n#define   ADDRMETH_D   \t0x00030000\n#define   ADDRMETH_E   \t0x00040000\n#define   ADDRMETH_F   \t0x00050000\n#define   ADDRMETH_G   \t0x00060000\n#define   ADDRMETH_I   \t0x00070000\n#define   ADDRMETH_J   \t0x00080000\n#define   ADDRMETH_M   \t0x00090000\n#define   ADDRMETH_O   \t0x000A0000\n#define   ADDRMETH_P   \t0x000B0000\n#define   ADDRMETH_Q   \t0x000C0000\n#define   ADDRMETH_R   \t0x000D0000\n#define   ADDRMETH_S   \t0x000E0000\n#define   ADDRMETH_T   \t0x000F0000\n#define   ADDRMETH_V   \t0x00100000\n#define   ADDRMETH_W   \t0x00110000\n#define   ADDRMETH_X   \t0x00120000\n#define   ADDRMETH_Y   \t0x00130000\n#define\t  ADDRMETH_RR  \t0x00140000\t/* gen reg hard-coded in opcode */\n#define\t  ADDRMETH_RS  \t0x00150000\t/* seg reg hard-coded in opcode */\n#define\t  ADDRMETH_RT  \t0x00160000\t/* test reg hard-coded in opcode */\n#define\t  ADDRMETH_RF  \t0x00170000\t/* fpu reg hard-coded in opcode */\n#define\t  ADDRMETH_II  \t0x00180000\t/* immediate hard-coded in opcode */\n#define   ADDRMETH_PP   0x00190000\t/* mm reg ONLY in modr/m field */\n#define   ADDRMETH_VV   0x001A0000\t/* xmm reg ONLY in mod/rm field */\n\n/* Operand Types, per intel manual */\n#define OPTYPE_MASK\t0xFF000000\n\n#define OPTYPE_a\t0x01000000 /* BOUND: h:h or w:w */\n#define OPTYPE_b   \t0x02000000 /* byte */\n#define OPTYPE_c   \t0x03000000 /* byte or word */\n#define OPTYPE_d   \t0x04000000 /* word */\n#define OPTYPE_dq   \t0x05000000 /* qword */\n#define OPTYPE_p   \t0x06000000 /* 16:16 or 16:32 pointer */\n#define OPTYPE_pi   \t0x07000000 /* dword MMX reg */\n#define OPTYPE_ps   \t0x08000000 /* 128-bit single fp */\n#define OPTYPE_q   \t0x09000000 /* dword */\n#define OPTYPE_s   \t0x0A000000 /* 6-byte descriptor */\n#define OPTYPE_ss   \t0x0B000000 /* scalar of 128-bit single fp */\n#define OPTYPE_si   \t0x0C000000 /* word general register */\n#define OPTYPE_v   \t0x0D000000 /* hword or word */\n#define OPTYPE_w   \t0x0E000000 /* hword */\n#define OPTYPE_m   \t0x0F000000\t/* to handle LEA */\n#define OPTYPE_none 0xFF000000 /* no valid operand size, INVLPG */\n\n/* custom ones for FPU instructions */\n#define OPTYPE_fs\t0x10000000\t/* pointer to single-real*/\n#define OPTYPE_fd\t0x20000000\t/* pointer to double real */\n#define OPTYPE_fe\t0x30000000\t/* pointer to extended real */\n#define OPTYPE_fb\t0x40000000\t/* pointer to packed BCD */\n#define OPTYPE_fv\t0x50000000\t/* pointer to FPU env: 14|28-bytes */\n#define OPTYPE_ft\t0x60000000\t/* pointer to FPU state: 94|108-bytes */\n#define OPTYPE_fx       0x70000000      /* pointer to FPU regs: 512 bites */\n#define OPTYPE_fp       0x80000000      /* general fpu register: dbl ext */\n\n/* SSE2 operand types */\n#define OPTYPE_sd\t0x90000000\t/* scalar of 128-bit double fp */\n#define OPTYPE_pd\t0xA0000000\t/* 128-bit double fp */\n\n\n\n/* ---------------------------------------------- Opcode Table Descriptions */\n/* the table type describes how to handle byte/size increments before \n * and after lookup. Some tables re-use the current byte, others\n * consume a byte only if the ModR/M encodes no operands, etc */\nenum ia32_tbl_type_id {\n\ttbl_opcode = 0,\t/* standard opcode table: no surprises */\n\ttbl_prefix,\t/* Prefix Override, e.g. 66/F2/F3 */\n\ttbl_suffix,\t/* 3D Now style */\n\ttbl_extension,\t/* ModR/M extension: 00-FF -> 00-07 */\n\ttbl_ext_ext,\t/* extension of modr/m using R/M field */\n\ttbl_fpu,\t/* fpu table: 00-BF -> 00-0F */\n\ttbl_fpu_ext\t/* fpu extension : C0-FF -> 00-1F */\n };\n\n/* How it works:\n * Bytes are 'consumed' if the next table lookup requires that the byte\n * pointer be advanced in the instruction stream. 'Does not consume' means\n * that, when the lookup function recurses, the same byte it re-used in the\n * new table. It also means that size is not decremented, for example when\n * a ModR/M byte is used. Note that tbl_extension (ModR/M) instructions that\n * do not increase the size of an insn with their operands have a forced\n 3 size increase in the lookup algo. Weird, yes, confusing, yes, welcome\n * to the Intel ISA. Another note: tbl_prefix is used as an override, so an\n * empty insn in a prefix table causes the instruction in the original table\n * to be used, rather than an invalid insn being generated.\n * \ttbl_opcode uses current byte and consumes it\n * \ttbl_prefix uses current byte but does not consume it\n * \ttbl_suffix uses and consumes last byte in insn\n * \ttbl_extension uses current byte but does not consume it\n * \ttbl_ext_ext uses current byte but does not consume it\n * \ttbl_fpu uses current byte and consumes it\n * \ttbl_fpu_ext uses current byte but does not consume it \n */\n\n/* Convenience struct for opcode tables : these will be stored in a \n * 'table of tables' so we can use a table index instead of a pointer */\ntypedef struct {\t\t/* Assembly instruction tables */\n   ia32_insn_t *table;\t\t/* Pointer to table of instruction encodings */\n   enum ia32_tbl_type_id type;\n   unsigned char shift;\t\t/* amount to shift modrm byte */\n   unsigned char mask;\t\t/* bit mask for look up */\n   unsigned char minlim,maxlim;\t/* limits on min/max entries. */\n} ia32_table_desc_t;\n\n\n/* ---------------------------------------------- 'Cooked' Operand Type Info */\n/*                   Permissions: */\n#define OP_R         0x001      /* operand is READ */\n#define OP_W         0x002      /* operand is WRITTEN */\n#define OP_RW        0x003\t/* (OP_R|OP_W): convenience macro */\n#define OP_X         0x004      /* operand is EXECUTED */\n\n#define OP_PERM_MASK 0x0000007  /* perms are NOT mutually exclusive */\n#define OP_PERM( type )       (type & OP_PERM_MASK)\n\n/* Flags */\n#define OP_SIGNED    0x010   \t/* operand is signed */\n\n#define OP_FLAG_MASK  0x0F0  /* mods are NOT mutually exclusive */\n#define OP_FLAGS( type )        (type & OP_FLAG_MASK)\n\n#define OP_REG_MASK    0x0000FFFF /* lower WORD is register ID */\n#define OP_REGTBL_MASK 0xFFFF0000 /* higher word is register type [gen/dbg] */\n#define OP_REGID( type )      (type & OP_REG_MASK)\n#define OP_REGTYPE( type )    (type & OP_REGTBL_MASK)\n\n/* ------------------------------------------'Cooked' Instruction Type Info */\n/* high-bit opcode types/insn meta-types */\n#define INS_FLAG_PREFIX\t\t0x10000000\t/* insn is a prefix */\n#define INS_FLAG_SUFFIX\t\t0x20000000\t/* followed by a suffix byte */\n#define INS_FLAG_MASK    \t0xFF000000\n\n/* insn notes */\n#define INS_NOTE_RING0\t\t0x00000001\t/* insn is privileged */\n#define INS_NOTE_SMM\t\t0x00000002\t/* Sys Mgt Mode only */\n#define INS_NOTE_SERIAL\t\t0x00000004\t/* serializes */\n#define INS_NOTE_NONSWAP    0x00000008  /* insn is not swapped in att format */ // could be separate field?\n#define INS_NOTE_NOSUFFIX   0x00000010  /* insn has no size suffix in att format */ // could be separate field?\n//#define INS_NOTE_NMI\t\t\n\n#define INS_INVALID \t0\n\n/* instruction groups */\n#define INS_EXEC\t0x1000\n#define INS_ARITH\t0x2000\n#define INS_LOGIC\t0x3000\n#define INS_STACK\t0x4000\n#define INS_COND\t0x5000\n#define INS_LOAD\t0x6000\n#define INS_ARRAY\t0x7000\n#define INS_BIT\t\t0x8000\n#define INS_FLAG\t0x9000\n#define INS_FPU\t\t0xA000\n#define INS_TRAPS\t0xD000\n#define INS_SYSTEM\t0xE000\n#define INS_OTHER\t0xF000\n\n#define INS_GROUP_MASK\t0xF000\n#define INS_GROUP( type )     ( type & INS_GROUP_MASK )\n\n/* INS_EXEC group */\n#define INS_BRANCH\t(INS_EXEC | 0x01)\t/* Unconditional branch */\n#define INS_BRANCHCC\t(INS_EXEC | 0x02)\t/* Conditional branch */\n#define INS_CALL\t(INS_EXEC | 0x03)\t/* Jump to subroutine */\n#define INS_CALLCC\t(INS_EXEC | 0x04)\t/* Jump to subroutine */\n#define INS_RET\t\t(INS_EXEC | 0x05)\t/* Return from subroutine */\n\n/* INS_ARITH group */\n#define INS_ADD \t(INS_ARITH | 0x01)\n#define INS_SUB\t\t(INS_ARITH | 0x02)\n#define INS_MUL\t\t(INS_ARITH | 0x03)\n#define INS_DIV\t\t(INS_ARITH | 0x04)\n#define INS_INC\t\t(INS_ARITH | 0x05)\t/* increment */\n#define INS_DEC\t\t(INS_ARITH | 0x06)\t/* decrement */\n#define INS_SHL\t\t(INS_ARITH | 0x07)\t/* shift right */\n#define INS_SHR\t\t(INS_ARITH | 0x08)\t/* shift left */\n#define INS_ROL\t\t(INS_ARITH | 0x09)\t/* rotate left */\n#define INS_ROR\t\t(INS_ARITH | 0x0A)\t/* rotate right */\n#define INS_MIN\t\t(INS_ARITH | 0x0B)\t/* min func */\n#define INS_MAX\t\t(INS_ARITH | 0x0C)\t/* max func */\n#define INS_AVG\t\t(INS_ARITH | 0x0D)\t/* avg func */\n#define INS_FLR\t\t(INS_ARITH | 0x0E)\t/* floor func */\n#define INS_CEIL\t(INS_ARITH | 0x0F)\t/* ceiling func */\n\n/* INS_LOGIC group */\n#define INS_AND\t\t(INS_LOGIC | 0x01)\n#define INS_OR\t\t(INS_LOGIC | 0x02)\n#define INS_XOR\t\t(INS_LOGIC | 0x03)\n#define INS_NOT\t\t(INS_LOGIC | 0x04)\n#define INS_NEG\t\t(INS_LOGIC | 0x05)\n#define INS_NAND\t(INS_LOGIC | 0x06)\n\n/* INS_STACK group */\n#define INS_PUSH\t(INS_STACK | 0x01)\n#define INS_POP\t\t(INS_STACK | 0x02)\n#define INS_PUSHREGS\t(INS_STACK | 0x03)\t/* push register context */\n#define INS_POPREGS\t(INS_STACK | 0x04)\t/* pop register context */\n#define INS_PUSHFLAGS\t(INS_STACK | 0x05)\t/* push all flags */\n#define INS_POPFLAGS\t(INS_STACK | 0x06)\t/* pop all flags */\n#define INS_ENTER\t(INS_STACK | 0x07)\t/* enter stack frame */\n#define INS_LEAVE\t(INS_STACK | 0x08)\t/* leave stack frame */\n\n/* INS_COND group */\n#define INS_TEST\t(INS_COND | 0x01)\n#define INS_CMP\t\t(INS_COND | 0x02)\n\n/* INS_LOAD group */\n#define INS_MOV\t\t(INS_LOAD | 0x01)\n#define INS_MOVCC\t(INS_LOAD | 0x02)\n#define INS_XCHG\t(INS_LOAD | 0x03)\n#define INS_XCHGCC\t(INS_LOAD | 0x04)\n#define INS_CONV\t(INS_LOAD | 0x05)\t/* move and convert type */\n\n/* INS_ARRAY group */\n#define INS_STRCMP\t(INS_ARRAY | 0x01)\n#define INS_STRLOAD\t(INS_ARRAY | 0x02)\n#define INS_STRMOV\t(INS_ARRAY | 0x03)\n#define INS_STRSTOR\t(INS_ARRAY | 0x04)\n#define INS_XLAT\t(INS_ARRAY | 0x05)\n\n/* INS_BIT group */\n#define INS_BITTEST\t(INS_BIT | 0x01)\n#define INS_BITSET\t(INS_BIT | 0x02)\n#define INS_BITCLR\t(INS_BIT | 0x03)\n\n/* INS_FLAG group */\n#define INS_CLEARCF\t(INS_FLAG | 0x01)\t/* clear Carry flag */\n#define INS_CLEARZF\t(INS_FLAG | 0x02)\t/* clear Zero flag */\n#define INS_CLEAROF\t(INS_FLAG | 0x03)\t/* clear Overflow flag */\n#define INS_CLEARDF\t(INS_FLAG | 0x04)\t/* clear Direction flag */\n#define INS_CLEARSF\t(INS_FLAG | 0x05)\t/* clear Sign flag */\n#define INS_CLEARPF\t(INS_FLAG | 0x06)\t/* clear Parity flag */\n#define INS_SETCF\t(INS_FLAG | 0x07)\n#define INS_SETZF\t(INS_FLAG | 0x08)\n#define INS_SETOF\t(INS_FLAG | 0x09)\n#define INS_SETDF\t(INS_FLAG | 0x0A)\n#define INS_SETSF\t(INS_FLAG | 0x0B)\n#define INS_SETPF\t(INS_FLAG | 0x0C)\n#define INS_TOGCF\t(INS_FLAG | 0x10)\t/* toggle */\n#define INS_TOGZF\t(INS_FLAG | 0x20)\n#define INS_TOGOF\t(INS_FLAG | 0x30)\n#define INS_TOGDF\t(INS_FLAG | 0x40)\n#define INS_TOGSF\t(INS_FLAG | 0x50)\n#define INS_TOGPF\t(INS_FLAG | 0x60)\n\n/* INS_FPU */\n#define INS_FMOV       (INS_FPU | 0x1)\n#define INS_FMOVCC     (INS_FPU | 0x2)\n#define INS_FNEG       (INS_FPU | 0x3)\n#define INS_FABS       (INS_FPU | 0x4)\n#define INS_FADD       (INS_FPU | 0x5)\n#define INS_FSUB       (INS_FPU | 0x6)\n#define INS_FMUL       (INS_FPU | 0x7)\n#define INS_FDIV       (INS_FPU | 0x8)\n#define INS_FSQRT      (INS_FPU | 0x9)\n#define INS_FCMP       (INS_FPU | 0xA)\n#define INS_FCOS       (INS_FPU | 0xC)               /* cosine */\n#define INS_FLDPI      (INS_FPU | 0xD)               /* load pi */\n#define INS_FLDZ       (INS_FPU | 0xE)               /* load 0 */\n#define INS_FTAN       (INS_FPU | 0xF)               /* tanget */\n#define INS_FSINE      (INS_FPU | 0x10)              /* sine */\n#define INS_FSYS       (INS_FPU | 0x20)              /* misc */\n\n/* INS_TRAP */\n#define INS_TRAP\t(INS_TRAPS | 0x01)\t/* generate trap */\n#define INS_TRAPCC\t(INS_TRAPS | 0x02)\t/* conditional trap gen */\n#define INS_TRET\t(INS_TRAPS | 0x03)\t/* return from trap */\n#define INS_BOUNDS\t(INS_TRAPS | 0x04)\t/* gen bounds trap */\n#define INS_DEBUG\t(INS_TRAPS | 0x05)\t/* gen breakpoint trap */\n#define INS_TRACE\t(INS_TRAPS | 0x06)\t/* gen single step trap */\n#define INS_INVALIDOP\t(INS_TRAPS | 0x07)\t/* gen invalid insn */\n#define INS_OFLOW\t(INS_TRAPS | 0x08)\t/* gen overflow trap */\n#define INS_ICEBP\t(INS_TRAPS | 0x09)\t/* ICE breakpoint */\n\n/* INS_SYSTEM */\n#define INS_HALT\t(INS_SYSTEM | 0x01)\t/* halt machine */\n#define INS_IN\t\t(INS_SYSTEM | 0x02)\t/* input form port */\n#define INS_OUT\t\t(INS_SYSTEM | 0x03)\t/* output to port */\n#define INS_CPUID\t(INS_SYSTEM | 0x04)\t/* identify cpu */\n\n/* INS_OTHER */\n#define INS_NOP\t\t(INS_OTHER | 0x01)\n#define INS_BCDCONV\t(INS_OTHER | 0x02)\t/* convert to/from BCD */\n#define INS_SZCONV\t(INS_OTHER | 0x03)\t/* convert size of operand */\n#define INS_SALC\t(INS_OTHER | 0x04)\t/* set %al on carry */\n#define INS_UNKNOWN\t(INS_OTHER | 0x05)\n \n\n#define INS_TYPE_MASK\t0xFFFF\n#define INS_TYPE( type )      ( type & INS_TYPE_MASK )\n\n   /* flags effected by instruction */\n#define INS_TEST_CARRY        0x01    /* carry */\n#define INS_TEST_ZERO         0x02    /* zero/equal */\n#define INS_TEST_OFLOW        0x04    /* overflow */\n#define INS_TEST_DIR          0x08    /* direction */\n#define INS_TEST_SIGN         0x10    /* negative */\n#define INS_TEST_PARITY       0x20    /* parity */\n#define INS_TEST_OR           0x40    /* used in jle */\n#define INS_TEST_NCARRY       0x100\t/* ! carry */\n#define INS_TEST_NZERO        0x200\t/* ! zero */\n#define INS_TEST_NOFLOW       0x400\t/* ! oflow */\n#define INS_TEST_NDIR         0x800\t/* ! dir */\n#define INS_TEST_NSIGN        0x100\t/* ! sign */\n#define INS_TEST_NPARITY      0x2000\t/* ! parity */\n/* SF == OF */\n#define INS_TEST_SFEQOF       0x4000\n/* SF != OF */\n#define INS_TEST_SFNEOF       0x8000\n\n#define INS_TEST_ALL\t\tINS_TEST_CARRY | INS_TEST_ZERO | \\\n\t\t\t\tINS_TEST_OFLOW | INS_TEST_SIGN | \\\n\t\t\t\tINS_TEST_PARITY\n\n#define INS_SET_CARRY        0x010000    /* carry */\n#define INS_SET_ZERO         0x020000    /* zero/equal */\n#define INS_SET_OFLOW        0x040000    /* overflow */\n#define INS_SET_DIR          0x080000    /* direction */\n#define INS_SET_SIGN         0x100000    /* negative */\n#define INS_SET_PARITY       0x200000    /* parity */\n#define INS_SET_NCARRY       0x1000000 \n#define INS_SET_NZERO        0x2000000\n#define INS_SET_NOFLOW       0x4000000\n#define INS_SET_NDIR         0x8000000\n#define INS_SET_NSIGN        0x10000000\n#define INS_SET_NPARITY      0x20000000\n#define INS_SET_SFEQOF       0x40000000\n#define INS_SET_SFNEOF       0x80000000\n\n#define INS_SET_ALL\t\tINS_SET_CARRY | INS_SET_ZERO | \\\n\t\t\t\tINS_SET_OFLOW | INS_SET_SIGN | \\\n\t\t\t\tINS_SET_PARITY\n\n#define INS_TEST_MASK          0x0000FFFF\n#define INS_FLAGS_TEST(x)      (x & INS_TEST_MASK)\n#define INS_SET_MASK           0xFFFF0000\n#define INS_FLAGS_SET(x)       (x & INS_SET_MASK)\n\n#if 0\n/* TODO: actually start using these */\n#define X86_PAIR_NP\t1\t\t/* not pairable; execs in U */\n#define X86_PAIR_PU\t2\t\t/* pairable in U pipe */\n#define X86_PAIR_PV\t3\t\t/* pairable in V pipe */\n#define X86_PAIR_UV\t4\t\t/* pairable in UV pipe */\n#define X86_PAIR_FX\t5\t\t/* pairable with FXCH */\n\n#define X86_EXEC_PORT_0\t1\n#define X86_EXEC_PORT_1\t2\n#define X86_EXEC_PORT_2\t4\n#define X86_EXEC_PORT_3\t8\n#define X86_EXEC_PORT_4\t16\n\n#define X86_EXEC_UNITS\n\ntypedef struct {\t/* representation of an insn during decoding */\n\tuint32_t flags;\t\t/* runtime settings */\n\t/* instruction prefixes and other foolishness */\n\tuint32_t prefix;\t\t/* encoding of prefix */\n\tchar prefix_str[16];\t\t/* mnemonics for prefix */\n\tuint32_t branch_hint;\t/* gah! */\n\tunsigned int cpu_ver;\t\t/* TODO: cpu version */\n\tunsigned int clocks;\t\t/* TODO: clock cycles: min/max */\n\tunsigned char last_prefix;\n\t/* runtime intruction decoding helpers */\n\tunsigned char mode;\t\t/* 16, 32, 64 */\n\tunsigned char gen_regs;\t\t/* offset of default general reg set */\n\tunsigned char sz_operand;\t/* operand size for insn */\n\tunsigned char sz_address;\t/* address size for insn */\n\tunsigned char uops;\t\t/* uops per insn */\n\tunsigned char pairing;\t\t/* np,pu,pv.lv */\n\tunsigned char exec_unit;\n\tunsigned char exec_port;\n\tunsigned char latency;\n} ia32_info_t;\n#define MODE_32 0\t/* default */\n#define MODE_16 1\n#define MODE_64 2\n#endif\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_invariant.c",
    "content": "#include <stdlib.h>\n#include <string.h>\n\n#include \"ia32_invariant.h\"\n#include \"ia32_insn.h\"\n#include \"ia32_settings.h\"\n\nextern ia32_table_desc_t *ia32_tables;\nextern ia32_settings_t ia32_settings;\n\nextern size_t ia32_table_lookup( unsigned char *buf, size_t buf_len,\n\t\tunsigned int table, ia32_insn_t **raw_insn,\n\t\t unsigned int *prefixes );\n\n\n/* -------------------------------- ModR/M, SIB */\n/* Convenience flags */\n#define MODRM_EA  1                     /* ModR/M is an effective addr */\n#define MODRM_reg 2                     /* ModR/M is a register */\n\n/* ModR/M flags */\n#define MODRM_RM_SIB            0x04    /* R/M == 100 */\n#define MODRM_RM_NOREG          0x05    /* R/B == 101 */\n/* if (MODRM.MOD_NODISP && MODRM.RM_NOREG) then just disp32 */\n#define MODRM_MOD_NODISP        0x00    /* mod == 00 */\n#define MODRM_MOD_DISP8         0x01    /* mod == 01 */\n#define MODRM_MOD_DISP32        0x02    /* mod == 10 */\n#define MODRM_MOD_NOEA          0x03    /* mod == 11 */\n/* 16-bit modrm flags */\n#define MOD16_MOD_NODISP      0\n#define MOD16_MOD_DISP8       1\n#define MOD16_MOD_DISP16      2\n#define MOD16_MOD_REG         3\n\n#define MOD16_RM_BXSI         0\n#define MOD16_RM_BXDI         1\n#define MOD16_RM_BPSI         2\n#define MOD16_RM_BPDI         3\n#define MOD16_RM_SI           4\n#define MOD16_RM_DI           5\n#define MOD16_RM_BP           6\n#define MOD16_RM_BX           7\n\n/* SIB flags */\n#define SIB_INDEX_NONE       0x04\n#define SIB_BASE_EBP       0x05\n#define SIB_SCALE_NOBASE    0x00\n\n/* Convenience struct for modR/M bitfield */\nstruct modRM_byte {  \n   unsigned int mod : 2;\n   unsigned int reg : 3;\n   unsigned int rm  : 3; \n};\n\n/* Convenience struct for SIB bitfield */\nstruct SIB_byte {\n   unsigned int scale : 2;\n   unsigned int index : 3;\n   unsigned int base  : 3;\n};\n\n#ifdef WIN32\nstatic void byte_decode(unsigned char b, struct modRM_byte *modrm) {\n#else\nstatic inline void byte_decode(unsigned char b, struct modRM_byte *modrm) {\n#endif\n\t/* generic bitfield-packing routine */\n\n\tmodrm->mod = b >> 6;\t/* top 2 bits */\n\tmodrm->reg = (b & 56) >> 3;\t/* middle 3 bits */\n\tmodrm->rm = b & 7;\t/* bottom 3 bits */\n}\nstatic int ia32_invariant_modrm( unsigned char *in, unsigned char *out,\n\t\t\t\t unsigned int mode_16, x86_invariant_op_t *op) {\n\tstruct modRM_byte modrm;\n\tstruct SIB_byte sib;\n\tunsigned char *c, *cin;\n\tunsigned short *s;\n\tunsigned int *i;\n\tint size = 0;\t/* modrm byte is already counted */\n\n\n\tbyte_decode(*in, &modrm);\t/* get bitfields */\n\n\tout[0] = in[0];\t/* save modrm byte */\n\tcin = &in[1];\n\tc = &out[1];\n\ts = (unsigned short *)&out[1];\n\ti = (unsigned int *)&out[1];\n\n\top->type = op_expression;\n\top->flags |= op_pointer;\n\tif ( ! mode_16 && modrm.rm == MODRM_RM_SIB && \n\t\t\t      modrm.mod != MODRM_MOD_NOEA ) {\n\t\tsize ++;\n\t\tbyte_decode(*cin, (struct modRM_byte *)(void*)&sib);\n\n\t\tout[1] = in[1];\t/* save sib byte */\n\t\tcin = &in[2];\n\t\tc = &out[2];\n\t\ts = (unsigned short *)&out[2];\n\t\ti = (unsigned int *)&out[2];\n\n\t\tif ( sib.base == SIB_BASE_EBP && ! modrm.mod ) {\n\t\t\t/* disp 32 is variant! */\n\t\t\tmemset( i, X86_WILDCARD_BYTE, 4 );\n\t\t\tsize += 4;\n\t\t}\n\t}\n\n\tif (! modrm.mod && modrm.rm == 101) {\n\t\tif ( mode_16 ) {\t/* straight RVA in disp */\n\t\t\tmemset( s, X86_WILDCARD_BYTE, 2 );\n\t\t\tsize += 2;\n\t\t} else {\n\t\t\tmemset( i, X86_WILDCARD_BYTE, 2 );\n\t\t\tsize += 4;\n\t\t}\n\t} else if (modrm.mod && modrm.mod < 3) {\n\t\tif (modrm.mod == MODRM_MOD_DISP8) {\t /* offset in disp */\n\t\t\t*c = *cin;\t\n\t\t\tsize += 1;\n\t\t} else if ( mode_16 ) {\n\t\t\t*s = (* ((unsigned short *) cin));\n\t\t\tsize += 2;\n\t\t} else {\n\t\t\t*i = (*((unsigned int *) cin));\n\t\t\tsize += 4;\n\t\t}\n\t} else if ( modrm.mod == 3 ) {\n\t\top->type = op_register;\n\t\top->flags &= ~op_pointer;\n\t}\n\n\treturn (size);\n}\n\n\nstatic int ia32_decode_invariant( unsigned char *buf, size_t buf_len, \n\t\t\t\tia32_insn_t *t, unsigned char *out, \n\t\t\t\tunsigned int prefixes, x86_invariant_t *inv) {\n\n\tunsigned int addr_size, op_size, mode_16;\n\tunsigned int op_flags[3] = { t->dest_flag, t->src_flag, t->aux_flag };\n\tint x, type, bytes = 0, size = 0, modrm = 0;\n\n\t/* set addressing mode */\n\tif (ia32_settings.options & opt_16_bit) {\n\t\top_size = ( prefixes & PREFIX_OP_SIZE ) ? 4 : 2;\n\t\taddr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 4 : 2;\n\t\tmode_16 = ( prefixes & PREFIX_ADDR_SIZE ) ? 0 : 1;\n\t} else {\n\t\top_size = ( prefixes & PREFIX_OP_SIZE ) ? 2 : 4;\n\t\taddr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 2 : 4;\n\t\tmode_16 = ( prefixes & PREFIX_ADDR_SIZE ) ? 1 : 0;\n\t}\n\n\tfor (x = 0; x < 3; x++) {\n\t\tinv->operands[x].access = (enum x86_op_access) \n\t\t\t\t\t\tOP_PERM(op_flags[x]);\n\t\tinv->operands[x].flags = (enum x86_op_flags) \n\t\t\t\t\t\t(OP_FLAGS(op_flags[x]) >> 12);\n\n\t\tswitch (op_flags[x] & OPTYPE_MASK) {\n\t\t\tcase OPTYPE_c:\n\t\t\t\tsize = (op_size == 4) ? 2 : 1;\n\t\t\t\tbreak;\n\t\t\tcase OPTYPE_a: case OPTYPE_v:\n\t\t\t\tsize = (op_size == 4) ? 4 : 2;\n\t\t\t\tbreak;\n\t\t\tcase OPTYPE_p:\n\t\t\t\tsize = (op_size == 4) ? 6 : 4;\n\t\t\t\tbreak;\n\t\t\tcase OPTYPE_b:\n\t\t\t\tsize = 1;\n\t\t\t\tbreak;\n\t\t\tcase OPTYPE_w:\n\t\t\t\tsize = 2;\n\t\t\t\tbreak;\n\t\t\tcase OPTYPE_d: case OPTYPE_fs: case OPTYPE_fd:\n\t\t\tcase OPTYPE_fe: case OPTYPE_fb: case OPTYPE_fv:\n\t\t\tcase OPTYPE_si: case OPTYPE_fx:\n\t\t\t\tsize = 4;\n\t\t\t\tbreak;\n\t\t\tcase OPTYPE_s:\n\t\t\t\tsize = 6;\n\t\t\t\tbreak;\n\t\t\tcase OPTYPE_q: case OPTYPE_pi:\n\t\t\t\tsize = 8;\n\t\t\t\tbreak;\n\t\t\tcase OPTYPE_dq: case OPTYPE_ps: case OPTYPE_ss:\n\t\t\tcase OPTYPE_pd: case OPTYPE_sd:\n\t\t\t\tsize = 16;\n\t\t\t\tbreak;\n\t\t\tcase OPTYPE_m:\t\n\t\t\t\tsize = (addr_size == 4) ? 4 : 2;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\ttype = op_flags[x] & ADDRMETH_MASK;\n\t\tswitch (type) {\n\t\t\tcase ADDRMETH_E: case ADDRMETH_M: case ADDRMETH_Q:\n\t\t\tcase ADDRMETH_R: case ADDRMETH_W:\n\t\t\t\tmodrm = 1;\t\n\t\t\t\tbytes += ia32_invariant_modrm( buf, out, \n\t\t\t\t\t\tmode_16, &inv->operands[x]);\n\t\t\t\tbreak;\n\t\t\tcase ADDRMETH_C: case ADDRMETH_D: case ADDRMETH_G:\n\t\t\tcase ADDRMETH_P: case ADDRMETH_S: case ADDRMETH_T:\n\t\t\tcase ADDRMETH_V:\n\t\t\t\tinv->operands[x].type = op_register;\n\t\t\t\tmodrm = 1;\n\t\t\t\tbreak;\n\t\t\tcase ADDRMETH_A: case ADDRMETH_O:\n\t\t\t\t/* pad with xF4's */\n\t\t\t\tmemset( &out[bytes + modrm], X86_WILDCARD_BYTE, \n\t\t\t\t\tsize );\n\t\t\t\tbytes += size;\n\t\t\t\tinv->operands[x].type = op_offset;\n\t\t\t\tif ( type == ADDRMETH_O ) {\n\t\t\t\t\tinv->operands[x].flags |= op_signed |\n\t\t\t\t\t\t\t\t  op_pointer;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase ADDRMETH_I: case ADDRMETH_J:\n\t\t\t\t/* grab imm value */\n\t\t\t\tif ((op_flags[x] & OPTYPE_MASK) == OPTYPE_v) {\n\t\t\t\t\t/* assume this is an address */\n\t\t\t\t\tmemset( &out[bytes + modrm], \n\t\t\t\t\t\tX86_WILDCARD_BYTE, size );\n\t\t\t\t} else {\n\t\t\t\t\tmemcpy( &out[bytes + modrm], \n\t\t\t\t\t\t&buf[bytes + modrm], size );\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\tbytes += size;\n\t\t\t\tif ( type == ADDRMETH_J ) {\n\t\t\t\t\tif ( size == 1 ) {\n\t\t\t\t\t\tinv->operands[x].type = \n\t\t\t\t\t\t\top_relative_near;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinv->operands[x].type = \n\t\t\t\t\t\t\top_relative_far;\n\t\t\t\t\t}\n\t\t\t\t\tinv->operands[x].flags |= op_signed;\n\t\t\t\t} else {\n\t\t\t\t\tinv->operands[x].type = op_immediate;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase ADDRMETH_F:\n\t\t\t\tinv->operands[x].type = op_register;\n\t\t\t\tbreak;\n\t\t\tcase ADDRMETH_X:\n\t\t\t\tinv->operands[x].flags |= op_signed |\n\t\t\t\t\t  op_pointer | op_ds_seg | op_string;\n\t\t\t\tbreak;\n\t\t\tcase ADDRMETH_Y:\n\t\t\t\tinv->operands[x].flags |= op_signed |\n\t\t\t\t\t  op_pointer | op_es_seg | op_string;\n\t\t\t\tbreak;\n\t\t\tcase ADDRMETH_RR:\t\n\t\t\t\tinv->operands[x].type = op_register;\n\t\t\t\tbreak;\n\t\t\tcase ADDRMETH_II:\t\n\t\t\t\tinv->operands[x].type = op_immediate;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tinv->operands[x].type = op_unused;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn (bytes + modrm);\n}\n\nsize_t ia32_disasm_invariant( unsigned char * buf, size_t buf_len, \n\t\tx86_invariant_t *inv ) {\n\tia32_insn_t *raw_insn = NULL;\n\tunsigned int prefixes;\n\tunsigned int type;\n\tsize_t size;\n\t\n\t/* Perform recursive table lookup starting with main table (0) */\n\tsize = ia32_table_lookup( buf, buf_len, 0, &raw_insn, &prefixes );\n\tif ( size == INVALID_INSN || size > buf_len ) {\n\t\t/* TODO: set errno */\n\t\treturn 0;\n\t}\n\n\t/* copy opcode bytes to buffer */\n\tmemcpy( inv->bytes, buf, size );\n\n\t/* set mnemonic type and group */\n\ttype = raw_insn->mnem_flag & ~INS_FLAG_MASK;\n        inv->group = (enum x86_insn_group) (INS_GROUP(type)) >> 12;\n        inv->type = (enum x86_insn_type) INS_TYPE(type);\n\n\t/* handle operands */\n\tsize += ia32_decode_invariant( buf + size, buf_len - size, raw_insn, \n\t\t\t\t\t&buf[size - 1], prefixes, inv );\n\n\tinv->size = size;\n\n\treturn size;\t\t/* return size of instruction in bytes */\n}\n\nsize_t ia32_disasm_size( unsigned char *buf, size_t buf_len ) {\n\tx86_invariant_t inv = { {0} };\n\treturn( ia32_disasm_invariant( buf, buf_len, &inv ) );\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_invariant.h",
    "content": "#ifndef IA32_INVARIANT_H\n#define IA32_INVARIANT_H\n\n#include \"libdis.h\"\n\nsize_t ia32_disasm_invariant( unsigned char *buf, size_t buf_len, \n\t\tx86_invariant_t *inv);\n\nsize_t ia32_disasm_size( unsigned char *buf, size_t buf_len );\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_modrm.c",
    "content": "#include \"ia32_modrm.h\"\n#include \"ia32_reg.h\"\n#include \"x86_imm.h\"\n\n/* NOTE: when decoding ModR/M and SIB, we have to add 1 to all register\n * values obtained from decoding the ModR/M or SIB byte, since they\n * are encoded with eAX = 0 and the tables in ia32_reg.c use eAX = 1.\n * ADDENDUM: this is only the case when the register value is used\n * directly as an index into the register table, not when it is added to\n * a genregs offset. */\n\n/* -------------------------------- ModR/M, SIB */\n/* ModR/M flags */\n#define MODRM_RM_SIB            0x04    /* R/M == 100 */\n#define MODRM_RM_NOREG          0x05    /* R/B == 101 */\n\n/* if (MODRM.MOD_NODISP && MODRM.RM_NOREG) then just disp32 */\n#define MODRM_MOD_NODISP        0x00    /* mod == 00 */\n#define MODRM_MOD_DISP8         0x01    /* mod == 01 */\n#define MODRM_MOD_DISP32        0x02    /* mod == 10 */\n#define MODRM_MOD_NOEA          0x03    /* mod == 11 */\n\n/* 16-bit modrm flags */\n#define MOD16_MOD_NODISP      0\n#define MOD16_MOD_DISP8       1\n#define MOD16_MOD_DISP16      2\n#define MOD16_MOD_REG         3\n\n#define MOD16_RM_BXSI         0\n#define MOD16_RM_BXDI         1\n#define MOD16_RM_BPSI         2\n#define MOD16_RM_BPDI         3\n#define MOD16_RM_SI           4\n#define MOD16_RM_DI           5\n#define MOD16_RM_BP           6\n#define MOD16_RM_BX           7\n\n/* SIB flags */\n#define SIB_INDEX_NONE       0x04\n#define SIB_BASE_EBP       0x05\n#define SIB_SCALE_NOBASE    0x00\n\n/* Convenience struct for modR/M bitfield */\nstruct modRM_byte {  \n   unsigned int mod : 2;\n   unsigned int reg : 3;\n   unsigned int rm  : 3; \n};\n\n/* Convenience struct for SIB bitfield */\nstruct SIB_byte {\n   unsigned int scale : 2;\n   unsigned int index : 3;\n   unsigned int base  : 3;\n};\n\n\n#if 0\nint modrm_rm[] = {0,1,2,3,MODRM_RM_SIB,MODRM_MOD_DISP32,6,7};\nint modrm_reg[] = {0, 1, 2, 3, 4, 5, 6, 7};\nint modrm_mod[]  = {0, MODRM_MOD_DISP8, MODRM_MOD_DISP32, MODRM_MOD_NOEA};\nint sib_scl[] = {0, 2, 4, 8};\nint sib_idx[] = {0, 1, 2, 3, SIB_INDEX_NONE, 5, 6, 7 };\nint sib_bas[] = {0, 1, 2, 3, 4, SIB_SCALE_NOBASE, 6, 7 };\n#endif\n\n/* this is needed to replace x86_imm_signsized() which does not sign-extend\n * to dest */\nstatic unsigned int imm32_signsized( unsigned char *buf, size_t buf_len,\n\t\t\t\t     int32_t *dest, unsigned int size ) {\n\tif ( size > buf_len ) {\n\t\treturn 0;\n\t}\n\n\tswitch (size) {\n\t\tcase 1:\n\t\t\t*dest = *((signed char *) buf);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\t*dest = *((signed short *) buf);\n\t\t\tbreak;\n\t\tcase 4:\n\t\tdefault:\n\t\t\t*dest = *((signed int *) buf);\n\t\t\tbreak;\n\t}\n\n\treturn size;\n}\n\n\n\nstatic void byte_decode(unsigned char b, struct modRM_byte *modrm) {\n\t/* generic bitfield-packing routine */\n\n\tmodrm->mod = b >> 6;\t/* top 2 bits */\n\tmodrm->reg = (b & 56) >> 3;\t/* middle 3 bits */\n\tmodrm->rm = b & 7;\t/* bottom 3 bits */\n}\n\n\nstatic size_t sib_decode( unsigned char *buf, size_t buf_len, x86_ea_t *ea, \n\t\t\t  unsigned int mod ) {\n\t/* set Address Expression fields (scale, index, base, disp) \n\t * according to the contents of the SIB byte.\n\t *  b points to the SIB byte in the instruction-stream buffer; the\n\t *    byte after b[0] is therefore the byte after the SIB\n\t *  returns number of bytes 'used', including the SIB byte */\n\tsize_t size = 1;\t\t/* start at 1 for SIB byte */\n\tstruct SIB_byte sib;\n\n\tif ( buf_len < 1 ) {\n\t\treturn 0;\n\t}\n\n\tbyte_decode( *buf, (struct modRM_byte *)(void*)&sib );  /* get bit-fields */\n\n\tif ( sib.base == SIB_BASE_EBP && ! mod ) {  /* if base == 101 (ebp) */\n\t    /* IF BASE == EBP, deal with exception */\n\t\t/* IF (ModR/M did not create a Disp */\n\t\t/* ... create a 32-bit Displacement */\n\t\timm32_signsized( &buf[1], buf_len, &ea->disp, sizeof(int32_t));\n\t\tea->disp_size = sizeof(int32_t);\n\t\tea->disp_sign = (ea->disp < 0) ? 1 : 0;\n\t\tsize += 4;\t/* add sizeof disp to count */\n\n\t} else {\n\t\t/* ELSE BASE refers to a General Register */\n\t\tia32_handle_register( &ea->base, sib.base + 1 );\n\t}\n\n\t/* set scale to 1, 2, 4, 8 */\n\tea->scale = 1 << sib.scale;\n\n\tif (sib.index != SIB_INDEX_NONE) {\n\t\t/* IF INDEX is not 'ESP' (100) */\n\t\tia32_handle_register( &ea->index, sib.index + 1 );\n\t}\n\n\treturn (size);\t\t/* return number of bytes processed */\n}\n\nstatic size_t modrm_decode16( unsigned char *buf, unsigned int buf_len,\n\t\t\t    x86_op_t *op, struct modRM_byte *modrm ) {\n\t/* 16-bit mode: hackish, but not as hackish as 32-bit mode ;) */\n\tsize_t size = 1; /* # of bytes decoded [1 for modR/M byte] */\n\tx86_ea_t * ea = &op->data.expression;\n\n\tswitch( modrm->rm ) {\n\t\tcase MOD16_RM_BXSI:\n\t\t\tia32_handle_register(&ea->base, REG_WORD_OFFSET + 3);\n\t\t\tia32_handle_register(&ea->index, REG_WORD_OFFSET + 6);\n\t\t\tbreak;\n\t\tcase MOD16_RM_BXDI:\n\t\t\tia32_handle_register(&ea->base, REG_WORD_OFFSET + 3);\n\t\t\tia32_handle_register(&ea->index, REG_WORD_OFFSET + 7);\n\t\tcase MOD16_RM_BPSI:\n\t\t\top->flags |= op_ss_seg;\n\t\t\tia32_handle_register(&ea->base, REG_WORD_OFFSET + 5);\n\t\t\tia32_handle_register(&ea->index, REG_WORD_OFFSET + 6);\n\t\t\tbreak;\n\t\tcase MOD16_RM_BPDI:\n\t\t\top->flags |= op_ss_seg;\n\t\t\tia32_handle_register(&ea->base, REG_WORD_OFFSET + 5);\n\t\t\tia32_handle_register(&ea->index, REG_WORD_OFFSET + 7);\n\t\t\tbreak;\n\t\tcase MOD16_RM_SI:\n\t\t\tia32_handle_register(&ea->base, REG_WORD_OFFSET + 6);\n\t\t\tbreak;\n\t\tcase MOD16_RM_DI:\n\t\t\tia32_handle_register(&ea->base, REG_WORD_OFFSET + 7);\n\t\t\tbreak;\n\t\tcase MOD16_RM_BP:\n\t\t\tif ( modrm->mod != MOD16_MOD_NODISP ) {\n\t\t\t\top->flags |= op_ss_seg;\n\t\t\t\tia32_handle_register(&ea->base, \n\t\t\t\t\t\t     REG_WORD_OFFSET + 5);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase MOD16_RM_BX:\n\t\t\tia32_handle_register(&ea->base, REG_WORD_OFFSET + 3);\n\t\t\tbreak;\n\t}\n\n\t/* move to byte after ModR/M */\n\t++buf;\n\t--buf_len;\n\n\tif ( modrm->mod == MOD16_MOD_DISP8 ) {\n\t\timm32_signsized( buf, buf_len, &ea->disp, sizeof(char) );\n\t\tea->disp_sign = (ea->disp < 0) ? 1 : 0;\n\t\tea->disp_size = sizeof(char);\n\t\tsize += sizeof(char);\n\t} else if ( modrm->mod == MOD16_MOD_DISP16 ) {\n\t\timm32_signsized( buf, buf_len, &ea->disp, sizeof(short) );\n\t\tea->disp_sign = (ea->disp < 0) ? 1 : 0;\n\t\tea->disp_size = sizeof(short);\n\t\tsize += sizeof(short);\n\t} \n\n\treturn size;\n}\n\n/* TODO : Mark index modes\n    Use addressing mode flags to imply arrays (index), structure (disp),\n    two-dimensional arrays [disp + index], classes [ea reg], and so on.\n*/\nsize_t ia32_modrm_decode( unsigned char *buf, unsigned int buf_len,\n\t\t\t    x86_op_t *op, x86_insn_t *insn, size_t gen_regs ) {\n\t/* create address expression and/or fill operand based on value of\n\t * ModR/M byte. Calls sib_decode as appropriate.\n\t *    flags specifies whether Reg or mod+R/M fields are being decoded\n\t *  returns the number of bytes in the instruction, including modR/M */\n\tstruct modRM_byte modrm;\n\tsize_t size = 1;\t/* # of bytes decoded [1 for modR/M byte] */\n\tx86_ea_t * ea;\n\n\n\tbyte_decode(*buf, &modrm);\t/* get bitfields */\n\n\t/* first, handle the case where the mod field is a register only */\n\tif ( modrm.mod == MODRM_MOD_NOEA ) {\n\t\top->type = op_register;\n\t\tia32_handle_register(&op->data.reg, modrm.rm + gen_regs);\n                /* increase insn size by 1 for modrm byte */\n \t\treturn 1;\n \t}\n \n\t/* then deal with cases where there is an effective address */\n\tea = &op->data.expression;\n\top->type = op_expression;\n\top->flags |= op_pointer;\n\n\tif ( insn->addr_size == 2 ) {\n\t\t/* gah! 16 bit mode! */\n\t\treturn modrm_decode16( buf, buf_len, op, &modrm);\n\t}\n\n\t/* move to byte after ModR/M */\n\t++buf;\n\t--buf_len;\n\n\tif (modrm.mod == MODRM_MOD_NODISP) {\t/* if mod == 00 */\n\n\t\t/* IF MOD == No displacement, just Indirect Register */\n\t\tif (modrm.rm == MODRM_RM_NOREG) {\t/* if r/m == 101 */\n\t\t\t/* IF RM == No Register, just Displacement */\n\t\t\t/* This is an Intel Moronic Exception TM */\n\t\t\timm32_signsized( buf, buf_len, &ea->disp, \n\t\t\t\t\tsizeof(int32_t) );\n\t\t\tea->disp_size = sizeof(int32_t);\n\t\t\tea->disp_sign = (ea->disp < 0) ? 1 : 0;\n\t\t\tsize += 4;\t/* add sizeof disp to count */\n\n\t\t} else if (modrm.rm == MODRM_RM_SIB) {\t/* if r/m == 100 */\n\t\t\t/* ELSE IF an SIB byte is present */\n\t\t\t/* TODO: check for 0 retval */\n\t\t\tsize += sib_decode( buf, buf_len, ea, modrm.mod);\n\t\t\t/* move to byte after SIB for displacement */\n\t\t\t++buf;\n\t\t\t--buf_len;\n\t\t} else {\t/* modR/M specifies base register */\n\t\t\t/* ELSE RM encodes a general register */\n\t\t\tia32_handle_register( &ea->base, modrm.rm + 1 );\n\t\t}\n\t} else { \t\t\t\t\t/* mod is 01 or 10 */\n\t\tif (modrm.rm == MODRM_RM_SIB) {\t/* rm == 100 */\n\t\t\t/* IF base is an AddrExpr specified by an SIB byte */\n\t\t\t/* TODO: check for 0 retval */\n\t\t\tsize += sib_decode( buf, buf_len, ea, modrm.mod);\n\t\t\t/* move to byte after SIB for displacement */\n\t\t\t++buf;\n\t\t\t--buf_len;\n\t\t} else {\n\t\t\t/* ELSE base is a general register */\n\t\t\tia32_handle_register( &ea->base, modrm.rm + 1 );\n\t\t}\n\n\t\t/* ELSE mod + r/m specify a disp##[base] or disp##(SIB) */\n\t\tif (modrm.mod == MODRM_MOD_DISP8) {\t\t/* mod == 01 */\n\t\t\t/* If this is an 8-bit displacement */\n\t\t\timm32_signsized( buf, buf_len, &ea->disp, \n\t\t\t\t\tsizeof(char));\n\t\t\tea->disp_size = sizeof(char);\n\t\t\tea->disp_sign = (ea->disp < 0) ? 1 : 0;\n\t\t\tsize += 1;\t/* add sizeof disp to count */\n\n\t\t} else {\n\t\t\t/* Displacement is dependent on address size */\n\t\t\timm32_signsized( buf, buf_len, &ea->disp, \n\t\t\t\t\tinsn->addr_size);\n\t\t\tea->disp_size = insn->addr_size;\n\t\t\tea->disp_sign = (ea->disp < 0) ? 1 : 0;\n\t\t\tsize += 4;\n\t\t}\n\t}\n\n\treturn size;\t\t/* number of bytes found in instruction */\n}\n\nvoid ia32_reg_decode( unsigned char byte, x86_op_t *op, size_t gen_regs ) {\n\tstruct modRM_byte modrm;\n\tbyte_decode( byte, &modrm );\t/* get bitfields */\n\n \t/* set operand to register ID */\n\top->type = op_register;\n\tia32_handle_register(&op->data.reg, modrm.reg + gen_regs);\n\n\treturn;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_modrm.h",
    "content": "#ifndef IA32_MODRM_H\n#define IA32_MODRM_H\n\n#include \"libdis.h\"\n#include \"ia32_insn.h\"\n\nsize_t ia32_modrm_decode( unsigned char *buf, unsigned int buf_len,\n\t\t\t    x86_op_t *op, x86_insn_t *insn,\n\t\t\t    size_t gen_regs );\n\nvoid ia32_reg_decode( unsigned char byte, x86_op_t *op, size_t gen_regs );\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.c",
    "content": "#include \"ia32_insn.h\"\n\n#include \"ia32_reg.h\"\n\n#include \"ia32_opcode_tables.h\"\n\nstatic ia32_insn_t tbl_Main[] = {\t/* One-byte Opcodes */\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_G | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"add\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"add\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_G | OPTYPE_b | OP_W | OP_R,   ADDRMETH_E | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"add\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_G | OPTYPE_v | OP_W | OP_R,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"add\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_RR | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"add\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"add\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RS | OPTYPE_w | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   0,   0,   0,  0 , 33 },\n\t { 0,   INS_POP,  0,   ADDRMETH_RS | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   0,   0,   0,  0 , 33 },\n\t { 0,   INS_OR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_G | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"or\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_OR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"or\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_OR,  0,   ADDRMETH_G | OPTYPE_b | OP_W | OP_R,   ADDRMETH_E | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"or\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_OR,  0,   ADDRMETH_G | OPTYPE_v | OP_W | OP_R,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"or\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_OR,  0,   ADDRMETH_RR | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"or\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_OR,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"or\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RS | OPTYPE_w | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   1,   0,   0,  0 , 33 },\n\t { idx_0F,   0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n/* 0x10 */\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_G | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"adc\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"adc\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_G | OPTYPE_b | OP_W | OP_R,   ADDRMETH_E | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"adc\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_G | OPTYPE_v | OP_W | OP_R,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"adc\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_RR | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"adc\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"adc\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RS | OPTYPE_w | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   2,   0,   0,  0 , 33 },\n\t { 0,   INS_POP,  0,   ADDRMETH_RS | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   2,   0,   0,  0 , 33 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R,   ADDRMETH_G | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sbb\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sbb\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_G | OPTYPE_b | OP_W | OP_SIGNED | OP_R,   ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sbb\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_W | OP_R,   ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sbb\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_RR | OPTYPE_b | OP_SIGNED | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sbb\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_RR | OPTYPE_v | OP_SIGNED | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sbb\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RS | OPTYPE_w | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   3,   0,   0,  0 , 33 },\n\t { 0,   INS_POP,  0,   ADDRMETH_RS | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   3,   0,   0,  0 , 33 },\n/* 0x20 */\n\t { 0,   INS_AND,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_G | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"and\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_AND,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"and\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_AND,  0,   ADDRMETH_G | OPTYPE_b | OP_W | OP_R,   ADDRMETH_E | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"and\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_AND,  0,   ADDRMETH_G | OPTYPE_v | OP_W | OP_R,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"and\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_AND,  0,   ADDRMETH_RR | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"and\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_AND,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"and\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_FLAG_PREFIX | PREFIX_ES,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_BCDCONV,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"daa\", \"\",   0,   0,   0,  INS_SET_SIGN|INS_SET_ZERO|INS_SET_CARRY|INS_SET_PARITY|INS_TEST_CARRY, 12 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R,   ADDRMETH_G | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sub\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sub\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_G | OPTYPE_b | OP_SIGNED | OP_W | OP_R,   ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sub\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_W | OP_R,   ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sub\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_RR | OPTYPE_b | OP_SIGNED | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sub\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_RR | OPTYPE_v | OP_SIGNED | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sub\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_FLAG_PREFIX | PREFIX_CS | PREFIX_NOTTAKEN,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_BCDCONV,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"das\", \"\",   0,   0,   0,  INS_SET_SIGN|INS_SET_ZERO|INS_SET_CARRY|INS_SET_PARITY|INS_TEST_CARRY, 0 },\n/* 0x30 */\n\t { 0,   INS_XOR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_G | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xor\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_XOR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xor\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_XOR,  0,   ADDRMETH_G | OPTYPE_b | OP_W | OP_R,   ADDRMETH_E | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xor\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_XOR,  0,   ADDRMETH_G | OPTYPE_v | OP_W | OP_R,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xor\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_XOR,  0,   ADDRMETH_RR | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xor\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_XOR,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xor\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_FLAG_PREFIX | PREFIX_SS,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_BCDCONV,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"aaa\", \"\",   0,   0,   0,  INS_SET_CARRY, 1 },\n\t { 0,   INS_CMP,  0,   ADDRMETH_E | OPTYPE_b | OP_R,   ADDRMETH_G | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"cmp\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_CMP,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"cmp\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_CMP,  0,   ADDRMETH_G | OPTYPE_b | OP_R,   ADDRMETH_E | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"cmp\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_CMP,  0,   ADDRMETH_G | OPTYPE_v | OP_R,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"cmp\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_CMP,  0,   ADDRMETH_RR | OPTYPE_b | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"cmp\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_CMP,  0,   ADDRMETH_RR | OPTYPE_v | OP_R,   ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"cmp\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_FLAG_PREFIX | PREFIX_DS | PREFIX_TAKEN,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_BCDCONV,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"aas\", \"\",   0,   0,   0,  INS_SET_CARRY, 0 },\n/* 0x40 */\n\t { 0,   INS_INC,  0,   ADDRMETH_RR | OPTYPE_v | OP_R | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"inc\", \"\",   0,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_INC,  0,   ADDRMETH_RR | OPTYPE_v | OP_R | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"inc\", \"\",   1,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_INC,  0,   ADDRMETH_RR | OPTYPE_v | OP_R | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"inc\", \"\",   2,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_INC,  0,   ADDRMETH_RR | OPTYPE_v | OP_R | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"inc\", \"\",   3,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_INC,  0,   ADDRMETH_RR | OPTYPE_v | OP_R | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"inc\", \"\",   4,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_INC,  0,   ADDRMETH_RR | OPTYPE_v | OP_R | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"inc\", \"\",   5,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_INC,  0,   ADDRMETH_RR | OPTYPE_v | OP_R | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"inc\", \"\",   6,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_INC,  0,   ADDRMETH_RR | OPTYPE_v | OP_R | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"inc\", \"\",   7,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_DEC,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"dec\", \"\",   0,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_DEC,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"dec\", \"\",   1,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_DEC,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"dec\", \"\",   2,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_DEC,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"dec\", \"\",   3,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_DEC,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"dec\", \"\",   4,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_DEC,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"dec\", \"\",   5,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_DEC,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"dec\", \"\",   6,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_DEC,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"dec\", \"\",   7,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n/* 0x50 */\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RR | OPTYPE_v | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   0,   0,   0,  0 , 33 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RR | OPTYPE_v | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   1,   0,   0,  0 , 33 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RR | OPTYPE_v | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   2,   0,   0,  0 , 33 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RR | OPTYPE_v | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   3,   0,   0,  0 , 33 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RR | OPTYPE_v | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   4,   0,   0,  0 , 33 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RR | OPTYPE_v | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   5,   0,   0,  0 , 33 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RR | OPTYPE_v | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   6,   0,   0,  0 , 33 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RR | OPTYPE_v | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   7,   0,   0,  0 , 33 },\n\t { 0,   INS_POP,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   0,   0,   0,  0 , 33 },\n\t { 0,   INS_POP,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   1,   0,   0,  0 , 33 },\n\t { 0,   INS_POP,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   2,   0,   0,  0 , 33 },\n\t { 0,   INS_POP,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   3,   0,   0,  0 , 33 },\n\t { 0,   INS_POP,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   4,   0,   0,  0 , 33 },\n\t { 0,   INS_POP,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   5,   0,   0,  0 , 33 },\n\t { 0,   INS_POP,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   6,   0,   0,  0 , 33 },\n\t { 0,   INS_POP,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   7,   0,   0,  0 , 33 },\n/* 0x60 */\n\t { 0,   INS_PUSHREGS,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pusha\", \"\",   0,   0,   0,  0 , 36 },\n\t { 0,   INS_POPREGS,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"popa\", \"\",   0,   0,   0,  0 , 34 },\n\t { 0,   INS_BOUNDS, INS_NOTE_NONSWAP,   ADDRMETH_G | OPTYPE_v | OP_R,   ADDRMETH_M | OPTYPE_a | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"bound\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_R | OP_W,   ADDRMETH_G | OPTYPE_w | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"arpl\", \"\",   0,   0,   0,  INS_SET_ZERO, 0 },\n\t { 0,   INS_FLAG_PREFIX | PREFIX_FS,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_FLAG_PREFIX | PREFIX_GS,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_66,   INS_FLAG_PREFIX | PREFIX_OP_SIZE,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_FLAG_PREFIX | PREFIX_ADDR_SIZE,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   0,   0,   0,  0 , 33 },\n\t { 0,   INS_MUL,  0,   ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R | OP_W,   ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R,   ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R,   cpu_80386 | isa_GP,   \"imul\", \"\",   0,   0,   0,  INS_SET_OFLOW|INS_SET_CARRY, 0 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   0,   0,   0,  0 , 33 },\n\t { 0,   INS_MUL,  0,   ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R | OP_W,   ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R,   ADDRMETH_I |  OPTYPE_b | OP_SIGNED | OP_R,   cpu_80386 | isa_GP,   \"imul\", \"\",   0,   0,   0,  INS_SET_OFLOW|INS_SET_CARRY, 0 },\n\t { 0,   INS_IN,  0,    ADDRMETH_Y | OPTYPE_b | OP_W,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"ins\", \"\",   0,   2,   0,  0 , 0 },\n\t { 0,   INS_IN,  0,    ADDRMETH_Y | OPTYPE_v | OP_W,   ADDRMETH_RR | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"ins\", \"\",   0,   2,   0,  0 , 0 },\n\t { 0,   INS_OUT,  0,    ADDRMETH_RR | OPTYPE_b | OP_R,   ADDRMETH_X | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"outs\", \"\",   2,   0,   0,  0 , 0 },\n\t { 0,   INS_OUT,  0,    ADDRMETH_RR | OPTYPE_v | OP_R,   ADDRMETH_X | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"outs\", \"\",   2,   0,   0,  0 , 0 },\n/* 0x70 */\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jo\", \"\",   0,   0,   0,  INS_TEST_OFLOW, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jno\", \"\",   0,   0,   0,  INS_TEST_NOFLOW, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jc\", \"\",   0,   0,   0,  INS_TEST_CARRY, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jnc\", \"\",   0,   0,   0,  INS_TEST_NCARRY, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jz\", \"\",   0,   0,   0,  INS_TEST_ZERO, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jnz\", \"\",   0,   0,   0,  INS_TEST_NZERO, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jbe\", \"\",   0,   0,   0,  INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"ja\", \"\",   0,   0,   0,  INS_TEST_NCARRY|INS_TEST_NZERO, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"js\", \"\",   0,   0,   0,  INS_TEST_SIGN, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jns\", \"\",   0,   0,   0,  INS_TEST_NSIGN, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jpe\", \"\",   0,   0,   0,  INS_TEST_PARITY, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jpo\", \"\",   0,   0,   0,  INS_TEST_NPARITY, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jl\", \"\",   0,   0,   0,  INS_TEST_SFNEOF, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jge\", \"\",   0,   0,   0,  INS_TEST_SFEQOF, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jle\", \"\",   0,   0,   0,  INS_TEST_ZERO|INS_TEST_OR|INS_TEST_SFNEOF, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jg\", \"\",   0,   0,   0,  INS_TEST_NZERO|INS_TEST_SFEQOF, 0 },\n/* 0x80 */\n\t { idx_80,   0,   0,   ADDRMETH_E | OPTYPE_b,   ADDRMETH_I | OPTYPE_b,   ARG_NONE,  cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_81,   0,   0,   ADDRMETH_E | OPTYPE_v,   ADDRMETH_I | OPTYPE_v,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_82,   0,   0,   ADDRMETH_E | OPTYPE_b,   ADDRMETH_I | OPTYPE_b,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_83,   0,   0,   ADDRMETH_E | OPTYPE_v,   ADDRMETH_I | OPTYPE_b,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_TEST,  0,   ADDRMETH_E | OPTYPE_b | OP_R,   ADDRMETH_G | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"test\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_TEST,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"test\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_G | OPTYPE_b | OP_W | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xchg\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xchg\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ADDRMETH_G | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_E | OPTYPE_v | OP_W,   ADDRMETH_G | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_G | OPTYPE_b | OP_W,   ADDRMETH_E | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_E | OPTYPE_w | OP_W,   ADDRMETH_S | OPTYPE_w | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_M | OPTYPE_m | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"lea\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_S | OPTYPE_w | OP_W,   ADDRMETH_E | OPTYPE_w | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_POP,  0,   ADDRMETH_E | OPTYPE_v | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   0,   0,   0,  0 , 33 },\n/* 0x90 */\n\t { 0,   INS_NOP,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"nop\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xchg\", \"\",   0,   1,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xchg\", \"\",   0,   2,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xchg\", \"\",   0,   3,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xchg\", \"\",   0,   4,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xchg\", \"\",   0,   5,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xchg\", \"\",   0,   6,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xchg\", \"\",   0,   7,   0,  0 , 0 },\n\t { 0,   INS_SZCONV,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"cwde\", \"\",   0,   0,   0,  0 , 5 },\n\t { 0,   INS_SZCONV,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"cdq\", \"\",   0,   0,   0,  0 , 11 },\n\t { 0,   INS_CALL,  0,   ADDRMETH_A | OPTYPE_p | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"callf\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"wait\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_PUSHFLAGS,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pushf\", \"\",   0,   0,   0,  0 , 37 },\n\t { 0,   INS_POPFLAGS,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"popf\", \"\",   0,   0,   0,  0 , 35 },\n\t { 0,   INS_MOV,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"sahf\", \"\",   0,   0,   0,  INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 43 },\n\t { 0,   INS_MOV,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"lahf\", \"\",   0,   0,   0,  0 , 24 },\n/* 0xa0 */\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_b | OP_W,   ADDRMETH_O | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ADDRMETH_O | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_O | OPTYPE_b | OP_W,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_O | OPTYPE_v | OP_W,   ADDRMETH_RR | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_STRMOV,  0,   ADDRMETH_Y | OPTYPE_b | OP_W,   ADDRMETH_X | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"movs\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_STRMOV,  0,   ADDRMETH_Y | OPTYPE_v | OP_W,   ADDRMETH_X | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"movs\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_STRCMP,  0,   ADDRMETH_Y | OPTYPE_b | OP_R,   ADDRMETH_X | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"cmps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_STRCMP,  0,   ADDRMETH_X | OPTYPE_v | OP_R,   ADDRMETH_Y | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"cmps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_TEST,  0,   ADDRMETH_RR | OPTYPE_b | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"test\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_TEST,  0,   ADDRMETH_RR | OPTYPE_v | OP_R,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"test\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_STRSTOR,  0,   ADDRMETH_Y | OPTYPE_b | OP_W,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"stos\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_STRSTOR,  0,   ADDRMETH_Y | OPTYPE_v | OP_W,   ADDRMETH_RR | OPTYPE_v |OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"stos\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_STRLOAD,  0,   ADDRMETH_RR | OPTYPE_b | OP_W,   ADDRMETH_X| OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"lods\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_STRLOAD,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ADDRMETH_X| OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"lods\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_STRCMP,  0,   ADDRMETH_RR | OPTYPE_b | OP_R,   ADDRMETH_Y | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"scas\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_STRCMP,  0,   ADDRMETH_RR | OPTYPE_v | OP_R,   ADDRMETH_Y | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"scas\", \"\",   0,   0,   0,  0 , 0 },\n/* 0xb0 */\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_b | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_b | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   1,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_b | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   2,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_b | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   3,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_b | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   4,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_b | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   5,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_b | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   6,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_b | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   7,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   1,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   2,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   3,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   4,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   5,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   6,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   7,   0,   0,  0 , 0 },\n/* 0xc0 */\n\t { idx_C0,  0,   0,    ADDRMETH_E | OPTYPE_b,   ADDRMETH_I | OPTYPE_b,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_C1,  0,   0,    ADDRMETH_E | OPTYPE_v,   ADDRMETH_I | OPTYPE_b,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_RET,  0,   ADDRMETH_I | OPTYPE_w | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"ret\", \"\",   0,   0,   0,  0 , 3 },\n\t { 0,   INS_RET,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"ret\", \"\",   0,   0,   0,  0 , 3 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_M | OPTYPE_p | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"les\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_M | OPTYPE_p | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"lds\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_C6,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_C7,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ENTER, INS_NOTE_NONSWAP,   ADDRMETH_I | OPTYPE_w | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"enter\", \"\",   0,   0,   0,  0 , 15 },\n\t { 0,   INS_LEAVE,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"leave\", \"\",   0,   0,   0,  0 , 26 },\n\t { 0,   INS_RET,  0,   ADDRMETH_I | OPTYPE_w | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"retf\", \"lret\",   0,   0,   0,  0 , 3 },\n\t { 0,   INS_RET,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"retf\", \"lret\",   0,   0,   0,  0 , 3 },\n\t { 0,   INS_DEBUG,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"int3\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_TRAP,  0,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"int\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OFLOW,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"into\", \"\",   0,   0,   0,  INS_TEST_OFLOW, 0 },\n\t { 0,   INS_TRET,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"iret\", \"\",   0,   0,   0,  INS_SET_ALL|INS_SET_DIR, 0 },\n/* 0xd0 */\n\t { idx_D0,  0,   0,    ADDRMETH_E | OPTYPE_b,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   1,   0,  0 , 0 },\n\t { idx_D1,  0,   0,   ADDRMETH_E | OPTYPE_v,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   1,   0,  0 , 0 },\n\t { idx_D2,  0,   0,   ADDRMETH_E | OPTYPE_b,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   1,   0,  0 , 0 },\n\t { idx_D3,  0,   0,   ADDRMETH_E | OPTYPE_v,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   1,   0,  0 , 0 },\n\t { 0,   INS_BCDCONV,  0,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"aam\", \"\",   0,   0,   0,  INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_BCDCONV,  0,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"aad\", \"\",   0,   0,   0,  INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 2 },\n\t { 0,   INS_SALC,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"salc\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_XLAT,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"xlat\", \"\",   0,   0,   0,  0 , 53 },\n\t { idx_D8,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_D9,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_DA,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_DB,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_DC,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_DD,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_DE,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_DF,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n/* 0xe0 */\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"loopnz\", \"\",   0,   0,   0,  INS_TEST_NZERO, 31 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"loopz\", \"\",   0,   0,   0,  INS_TEST_ZERO, 31 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"loop\", \"\",   0,   0,   0,  0 , 31 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_b | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jcxz\", \"\",   0,   0,   0,  0 , 31 },\n\t { 0,   INS_IN,  0,   ADDRMETH_RR | OPTYPE_b | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"in\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_IN,  0,   ADDRMETH_RR | OPTYPE_b | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"in\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OUT,  0,   ADDRMETH_I | OPTYPE_b | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"out\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OUT,  0,   ADDRMETH_I | OPTYPE_b | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"out\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_CALL,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"call\", \"\",   0,   0,   0,  0 , 3 },\n\t { 0,   INS_BRANCH,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jmp\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_BRANCH,  0,   ADDRMETH_A | OPTYPE_p | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jmp\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_BRANCH,  0,   ADDRMETH_J | OPTYPE_b | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jmp\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_IN,  0,   ADDRMETH_RR | OPTYPE_b| OP_W,   ADDRMETH_RR | OPTYPE_w| OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"in\", \"\",   0,   2,   0,  0 , 0 },\n\t { 0,   INS_IN,  0,   ADDRMETH_RR | OPTYPE_v | OP_W,   ADDRMETH_RR | OPTYPE_w| OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"in\", \"\",   0,   2,   0,  0 , 0 },\n\t { 0,   INS_OUT,  0,   ADDRMETH_RR | OPTYPE_w| OP_R,   ADDRMETH_RR | OPTYPE_b| OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"out\", \"\",   2,   0,   0,  0 , 0 },\n\t { 0,   INS_OUT,  0,   ADDRMETH_RR | OPTYPE_w| OP_R,   ADDRMETH_RR | OPTYPE_v| OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"out\", \"\",   2,   0,   0,  0 , 0 },\n/* 0xf0 */\n\t { 0,   INS_FLAG_PREFIX | PREFIX_LOCK,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_ICEBP,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"icebp\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_F2,   INS_FLAG_PREFIX | PREFIX_REPNZ,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_F3,   INS_FLAG_PREFIX | PREFIX_REPZ,  0, ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_HALT,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"hlt\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_TOGCF,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"cmc\", \"\",   0,   0,   0,  INS_SET_CARRY, 0 },\n\t { idx_F6,  0,   0,    ADDRMETH_E | OPTYPE_b,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_F7,  0,   0,   ADDRMETH_E | OPTYPE_v,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_CLEARCF,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"clc\", \"\",   0,   0,   0,  INS_SET_NCARRY, 0 },\n\t { 0,   INS_SETCF,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"stc\", \"\",   0,   0,   0,  INS_SET_CARRY, 0 },\n\t { 0,   INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"cli\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"sti\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_CLEARDF,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"cld\", \"\",   0,   0,   0,  INS_SET_NDIR, 0 },\n\t { 0,   INS_SETDF,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"std\", \"\",   0,   0,   0,  INS_SET_DIR, 0 },\n\t { idx_FE,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_FF,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_66[] = {\t/* SIMD 66 one-byte Opcodes */\n\t { idx_660F,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_F2[] = {\t/* SIMD F2 one-byte Opcodes */\n\t { idx_F20F,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_F3[] = {\t/* SIMD F3 one-byte Opcodes */\n\t { idx_F30F,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_SYSTEM,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pause\", \"\", 0, 0, 0, 0, 0 }\n};\n\n\nstatic ia32_insn_t tbl_0F[] = {\t/* Two-byte Opcodes */\n\t { idx_0F00,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_0F01,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_w | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"lar\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_w | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"lsl\", \"\",   0,   0,   0,  INS_SET_ZERO, 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"clts\", \"\",   0,   0,   0,  0 , 6 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80486 | isa_GP,   \"invd\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80486 | isa_GP,   \"wbinvd\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_UNKNOWN,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"ud2\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_SYSTEM,  0, ADDRMETH_M | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"prefetch\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_SYSTEM,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"femms\", \"\", 0, 0, 0, 0, 0 },\n\t { idx_0F0F, INS_FLAG_SUFFIX,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movups\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_W | OPTYPE_ps | OP_W,   ADDRMETH_V | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movups\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_0F12,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  INS_NOTE_NOSUFFIX,   ADDRMETH_V | OPTYPE_q | OP_W,   ADDRMETH_W | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movlps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"unpcklps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"unpckhps\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_0F16,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_W | OPTYPE_q | OP_W,   ADDRMETH_V | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movhps\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_0F18,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_R | OPTYPE_d | OP_W,   ADDRMETH_C | OPTYPE_d | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_R | OPTYPE_d | OP_W,   ADDRMETH_D | OPTYPE_d | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_C | OPTYPE_d | OP_W,   ADDRMETH_R | OPTYPE_d | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_D | OPTYPE_d | OP_W,   ADDRMETH_R | OPTYPE_d | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_R | OPTYPE_d | OP_W,   ADDRMETH_T | OPTYPE_d | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_T | OPTYPE_d | OP_W,   ADDRMETH_R | OPTYPE_d | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movaps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_MOV,  0, ADDRMETH_W | OPTYPE_ps | OP_W,   ADDRMETH_V | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movaps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_MOV,  0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, \"cvtpi2ps\", \"\", 0, 0, 0, 0, 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_W | OPTYPE_ps | OP_W,   ADDRMETH_V | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movntps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_MOV,  0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, \"cvttps2pi\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MOV,  0, ADDRMETH_P | OPTYPE_q | OP_W , ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, \"cvtps2pi\", \"\", 0, 0, 0, 0, 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_V | OPTYPE_ss | OP_W,   ADDRMETH_W | OPTYPE_ss | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"ucomiss\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ss | OP_W,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"comiss\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_GP,   \"wrmsr\", \"\",   0,   0,   0,  0 , 52 },\n\t { 0,   INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_GP,   \"rdtsc\", \"\",   0,   0,   0,  0 , 40 },\n\t { 0,   INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_GP,   \"rdmsr\", \"\",   0,   0,   0,  0 , 38 },\n\t { 0,   INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"rdpmc\", \"\",   0,   0,   0,  0 , 39 },\n\t { 0,   INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"sysenter\", \"\",   0,   0,   0,  0 , 50 },\n\t { 0,   INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"sysexit\", \"\",   0,   0,   0,  0 , 51 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovo\", \"\",   0,   0,   0,  INS_TEST_OFLOW, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovno\", \"\",   0,   0,   0,  INS_TEST_NOFLOW, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovc\", \"\",   0,   0,   0,  INS_TEST_CARRY, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovnc\", \"\",   0,   0,   0,  INS_TEST_NCARRY, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovz\", \"\",   0,   0,   0,  INS_TEST_ZERO, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovnz\", \"\",   0,   0,   0,  INS_TEST_NZERO, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovbe\", \"\",   0,   0,   0,  INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmova\", \"\",   0,   0,   0,  INS_TEST_NZERO|INS_TEST_NCARRY, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovs\", \"\",   0,   0,   0,  INS_TEST_SIGN, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovns\", \"\",   0,   0,   0,  INS_TEST_NSIGN, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovp\", \"\",   0,   0,   0,  INS_TEST_PARITY, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovnp\", \"\",   0,   0,   0,  INS_TEST_NPARITY, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovl\", \"\",   0,   0,   0,  INS_TEST_SFNEOF, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovge\", \"\",   0,   0,   0,  INS_TEST_SFEQOF, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovle\", \"\",   0,   0,   0,  INS_TEST_ZERO|INS_TEST_OR|INS_TEST_SFNEOF, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_PENTPRO | isa_GP,   \"cmovg\", \"\",   0,   0,   0,  INS_TEST_NZERO|INS_TEST_SFEQOF, 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_G | OPTYPE_d | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movmskps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ARITH,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"sqrtps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ARITH,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"rsqrtps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"rcpps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_AND,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"andps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_AND,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"andnps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OR,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"orps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_XOR,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"xorps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"addps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MUL,  0,   ADDRMETH_V | OPTYPE_ps | OP_R,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"mulps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_MOV,  0, ADDRMETH_V | OPTYPE_pd, ADDRMETH_W | OPTYPE_q, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtps2pd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MOV,  0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtdq2ps\", \"\", 0, 0, 0, 0, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"subps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ARITH,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"minps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_DIV,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"divps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ARITH,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"maxps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"punpcklbw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"punpcklwd\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"punpckldq\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"packsswb\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pcmpgtb\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pcmpgtw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pcmpgtd\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"packuswb\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"punpckhbw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"punpckhwd\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"punpckhdq\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"packssdw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_P | OPTYPE_d | OP_W,   ADDRMETH_E | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"movd\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"movq\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_MOV,  0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM2 | isa_GP, \"pshufw\", \"\", 0, 0, 0, 0, 0 },\n\t { idx_0F71,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_0F72,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_0F73,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pcmpeqb\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_CMP,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pcmpeqw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_CMP,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pcmpeqd\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"emms\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_E | OPTYPE_d | OP_W,   ADDRMETH_P | OPTYPE_d | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"movd\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_Q | OPTYPE_q | OP_W,   ADDRMETH_P | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"movq\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jo\", \"\",   0,   0,   0,  INS_TEST_OFLOW, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jno\", \"\",   0,   0,   0,  INS_TEST_NOFLOW, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jc\", \"\",   0,   0,   0,  INS_TEST_CARRY, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jnc\", \"\",   0,   0,   0,  INS_TEST_NCARRY, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jz\", \"\",   0,   0,   0,  INS_TEST_ZERO, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jnz\", \"\",   0,   0,   0,  INS_TEST_NZERO, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jbe\", \"\",   0,   0,   0,  INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"ja\", \"\",   0,   0,   0,  INS_TEST_NCARRY|INS_TEST_NZERO, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"js\", \"\",   0,   0,   0,  INS_TEST_SIGN, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jns\", \"\",   0,   0,   0,  INS_TEST_NSIGN, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jpe\", \"\",   0,   0,   0,  INS_TEST_PARITY, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jpo\", \"\",   0,   0,   0,  INS_TEST_NPARITY, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jl\", \"\",   0,   0,   0,  INS_TEST_SFNEOF, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jge\", \"\",   0,   0,   0,  INS_TEST_SFEQOF, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jle\", \"\",   0,   0,   0,  INS_TEST_ZERO|INS_TEST_OR|INS_TEST_SFNEOF, 0 },\n\t { 0,   INS_BRANCHCC,  0,   ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jg\", \"\",   0,   0,   0,  INS_TEST_NZERO|INS_TEST_SFEQOF, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"seto\", \"\",   0,   0,   0,  INS_TEST_OFLOW, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"setno\", \"\",   0,   0,   0,  INS_TEST_OFLOW, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"setc\", \"\",   0,   0,   0,  INS_TEST_CARRY, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"setnc\", \"\",   0,   0,   0,  INS_TEST_NCARRY, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"setz\", \"\",   0,   0,   0,  INS_TEST_ZERO, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"setnz\", \"\",   0,   0,   0,  INS_TEST_NZERO, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"setbe\", \"\",   0,   0,   0,  INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"seta\", \"\",   0,   0,   0,  INS_TEST_NCARRY|INS_TEST_NZERO, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"sets\", \"\",   0,   0,   0,  INS_TEST_SIGN, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"setns\", \"\",   0,   0,   0,  INS_TEST_NSIGN, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"setpe\", \"\",   0,   0,   0,  INS_TEST_PARITY, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"setpo\", \"\",   0,   0,   0,  INS_TEST_NPARITY, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"setl\", \"\",   0,   0,   0,  INS_TEST_SFNEOF, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"setge\", \"\",   0,   0,   0,  INS_TEST_SFEQOF, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"setle\", \"\",   0,   0,   0,  INS_TEST_ZERO|INS_TEST_OR|INS_TEST_SFNEOF, 0 },\n\t { 0,   INS_MOVCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"setg\", \"\",   0,   0,   0,  INS_TEST_NZERO|INS_TEST_SFEQOF, 0 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RS | OPTYPE_w | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   4,   0,   0,  0 , 33 },\n\t { 0,   INS_POP,  0,   ADDRMETH_RS | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   4,   0,   0,  0 , 33 },\n\t { 0,   INS_CPUID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_GP,   \"cpuid\", \"\",   0,   0,   0,  0 , 10 },\n\t { 0,   INS_BITTEST,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"bt\", \"\",   0,   0,   0,  INS_SET_CARRY, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   cpu_80386 | isa_GP,   \"shld\", \"\",   0,   0,   0,  INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t //{ 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ADDRMETH_I | OP_R | OPTYPE_b | ADDRMETH_RR,   cpu_80386 | isa_GP,   \"shld\", \"\",   0,   0,   1,  INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ADDRMETH_RR | OP_R | OPTYPE_b,   cpu_80386 | isa_GP,   \"shld\", \"\",   0,   0,   1,  INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_RS | OPTYPE_w | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   5,   0,   0,  0 , 33 },\n\t { 0,   INS_POP,  0,   ADDRMETH_RS | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"pop\", \"\",   5,   0,   0,  0 , 33 },\n\t { 0,   INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"rsm\", \"\",   0,   0,   0,  INS_SET_ALL|INS_SET_DIR, 42 },\n\t { 0,   INS_BITTEST,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"bts\", \"\",   0,   0,   0,  INS_SET_CARRY, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   cpu_80386 | isa_GP,   \"shrd\", \"\",   0,   0,   0,  INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ADDRMETH_RR | OP_R | OPTYPE_b ,   cpu_80386 | isa_GP,   \"shrd\", \"\",   0,   0,   1,  INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { idx_0FAE,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MUL,  0,   ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R | OP_W,   ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"imul\", \"\",   0,   0,   0,  INS_SET_OFLOW|INS_SET_CARRY,  },\n\t { 0,   INS_XCHGCC,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_G | OPTYPE_b | OP_W,   ARG_NONE,   cpu_80486 | isa_GP,   \"cmpxchg\", \"\",   0,   0,   0,  INS_SET_ALL, 8 },\n\t { 0,   INS_XCHGCC,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_W,   ARG_NONE,   cpu_80486 | isa_GP,   \"cmpxchg\", \"\",   0,   0,   0,  INS_SET_ALL, 7 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_p | OP_W,   ARG_NONE,   cpu_80386 | isa_GP,   \"lss\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_BITTEST,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"btr\", \"\",   0,   0,   0,  INS_SET_CARRY, 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_p | OP_W,   ARG_NONE,   cpu_80386 | isa_GP,   \"lfs\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_p | OP_W,   ARG_NONE,   cpu_80386 | isa_GP,   \"lgs\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"movzx\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_w | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"movzx\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_UNKNOWN,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"ud1\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_0FBA,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_BITTEST,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_G | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"btc\", \"\",   0,   0,   0,  INS_SET_CARRY, 0 },\n\t { 0,   INS_BITTEST,  0,   ADDRMETH_G | OPTYPE_v | OP_R | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"bsf\", \"\",   0,   0,   0,  INS_SET_ZERO, 0 },\n\t { 0,   INS_BITTEST,  0,   ADDRMETH_G | OPTYPE_v | OP_R | OP_W,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"bsr\", \"\",   0,   0,   0,  INS_SET_ZERO, 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"movsx\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_G | OPTYPE_v | OP_W,   ADDRMETH_E | OPTYPE_w | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"movsx\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_G | OPTYPE_b | OP_W,   ARG_NONE,   cpu_80486 | isa_GP,   \"xadd\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_G | OPTYPE_v | OP_W,   ARG_NONE,   cpu_80486 | isa_GP,   \"xadd\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0, INS_CMP,  0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, \"cmpps\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MOV,  0, ADDRMETH_M | OPTYPE_d | OP_W, ADDRMETH_G | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movnti\", \"\", 0, 0, 0, 0, 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_E | OPTYPE_d | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   cpu_PENTIUM2 | isa_GP,   \"pinsrw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_G | OPTYPE_d | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   cpu_PENTIUM2 | isa_GP,   \"pextrw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_V | OPTYPE_ps | OP_W,   ADDRMETH_W | OPTYPE_ps | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   cpu_PENTIUM2 | isa_GP,   \"shufps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_XCHGCC,  0, ADDRMETH_M | OPTYPE_q | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, \"cmpxchg8b\", \"\", 0, 0, 0, 0, 9 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_d | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80486 | isa_GP,   \"bswap\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_d | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80486 | isa_GP,   \"bswap\", \"\",   1,   0,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_d | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80486 | isa_GP,   \"bswap\", \"\",   2,   0,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_d | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80486 | isa_GP,   \"bswap\", \"\",   3,   0,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_d | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80486 | isa_GP,   \"bswap\", \"\",   4,   0,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_d | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80486 | isa_GP,   \"bswap\", \"\",   5,   0,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_d | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80486 | isa_GP,   \"bswap\", \"\",   6,   0,   0,  0 , 0 },\n\t { 0,   INS_XCHG,  0,   ADDRMETH_RR | OPTYPE_d | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80486 | isa_GP,   \"bswap\", \"\",   7,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psrlw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psrld\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psrlq\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_ADD,  0, ADDRMETH_P | OPTYPE_q | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"paddq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pmullw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_G | OPTYPE_d | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"pmovmskb\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psubusb\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psubusw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"pminub\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_AND,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pand\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"paddusb\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"paddusw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ARITH,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"pmaxub\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_AND,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pandn\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"pavgb\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psraw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psrad\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"pavgw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MUL,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"pmulhuw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MUL,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pmulhw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  INS_NOTE_NOSUFFIX,   ADDRMETH_W | OPTYPE_q | OP_W,   ADDRMETH_V | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movntq\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psubsb\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psubsw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ARITH,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"pminsw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OR,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"por\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"paddsb\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"paddsw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ARITH,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"pmaxsw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_XOR,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pxor\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psllw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pslld\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psllq\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_MUL,  0, ADDRMETH_P | OPTYPE_q | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pmuludq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pmaddwd\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"psadbw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  0,   ADDRMETH_P | OPTYPE_pi | OP_W,   ADDRMETH_Q | OPTYPE_pi | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"maskmovq\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psubb\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psubw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psubd\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_SUB,  0, ADDRMETH_P | OPTYPE_q | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psubq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"paddb\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"paddw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_Q | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"paddd\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_660F[] = {\t/* SIMD 66 Two-byte Opcodes */\n\t { 0, INS_MOV,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movupd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MOV,  0, ADDRMETH_W | OPTYPE_pd | OP_R, ADDRMETH_V | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movupd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MOV,  INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_R, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movlpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MOV,  INS_NOTE_NOSUFFIX, ADDRMETH_M | OPTYPE_q | OP_R, ADDRMETH_V | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movlpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"unpcklpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"unpckhpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MOV,  INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_R, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movhpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MOV,  INS_NOTE_NOSUFFIX, ADDRMETH_M | OPTYPE_q | OP_R, ADDRMETH_V | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movhpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MOV,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movapd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MOV,  0, ADDRMETH_W | OPTYPE_pd | OP_R, ADDRMETH_V | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movapd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtpi2pd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_M | OPTYPE_pd | OP_R, ADDRMETH_V | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movntpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_P | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvttpd2pi\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_P | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtpd2pi\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"ucomisd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"comisd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movmskpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_FSQRT,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"sqrtpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_AND,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"andpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_AND,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"andnpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_OR,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"orpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_XOR,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"xorpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_ADD,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"addpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MUL,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"mulpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtpd2ps\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtps2dq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"subpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"minpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"divpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"maxpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"punpcklbw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"punpcklwd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"punpckldq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"packsswb\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pcmpgtb\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pcmpgtw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pcmpgtd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"packuswb\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"punpckhbw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"punpckhwd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"punpckhdq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"packssdw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"punpcklqdq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"punpckhqdq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_d | OP_R, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movdqa\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, \"pshufd\", \"\", 0, 0, 0, 0, 0 },\n\t { idx_660F71, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { idx_660F72, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { idx_660F73, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pcmpeqb\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pcmpeqw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pcmpeqd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"haddpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"hsubpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_E | OPTYPE_d | OP_R, ADDRMETH_V | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_V | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movdqa\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, \"cmppd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_w | OP_R, ADDRMETH_E | OPTYPE_d | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, \"pinsrw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_w | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, \"pextrw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, \"shufpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"addsubpd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psrlw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psrld\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psrlq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"paddq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pmullw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_W | OPTYPE_q | OP_R, ADDRMETH_V | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pmovmskb\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psubusb\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psubusw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pminub\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pand\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"paddusb\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"paddusw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pmaxub\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pandn\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pavgb\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psraw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psrad\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pavgw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pmulhuw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pmulhw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvttpd2dq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_M | OPTYPE_dq | OP_R, ADDRMETH_V | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movntdq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psubsb\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psubsw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pminsw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"por\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"paddsb\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"paddsw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pmaxsw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pxor\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psllw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pslld\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psllq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pmuludq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"pmaddwd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psadbw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"maskmovdqu\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psubb\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psubw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psubd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"psubq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"paddb\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"paddw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"paddd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 }\n};\n\n\nstatic ia32_insn_t tbl_F20F[] = {\t/* SIMD F2 Two-byte Opcodes */\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movsd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_W | OPTYPE_sd | OP_R, ADDRMETH_V | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movsd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movddup\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtsi2sd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvttsd2si\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtsd2si\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"sqrtsd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"addsd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"mulsd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtsd2ss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"subsd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"minsd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"divsd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"maxsd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, \"pshuflw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"haddps\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"hsubps\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, \"cmpsd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"addsubps\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_P | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movdq2q\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtpd2dq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_M | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"lddqu\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 }\n};\n\n\nstatic ia32_insn_t tbl_F30F[] = {\t/* SIMD F3 Two-byte Opcodes */\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_W | OPTYPE_ss | OP_R, ADDRMETH_V | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movsldup\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movshdup\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtsi2ss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvttss2si\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtss2si\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"sqrtss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"rsqrtss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"rcpss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"addss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"mulss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtss2sd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvttps2dq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"subss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"minss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"divss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"maxss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movdqu\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, \"pshufhw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_V | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movdqu\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, \"cmpss\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movq2dq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_UNKNOWN,  0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"cvtdq2pd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"\", \"\", 0, 0, 0, 0, 0 }\n};\n\n\nstatic ia32_insn_t tbl_0F00[] = {\t/* Group 6 */\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"sldt\", \"\",   0,   0,   0,  0 , 46 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"str\", \"\",   0,   0,   0,  0 , 49 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"lldt\", \"\",   0,   0,   0,  0 , 29 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"ltr\", \"\",   0,   0,   0,  0 , 32 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"verr\", \"\",   0,   0,   0,  INS_SET_ZERO, 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"verw\", \"\",   0,   0,   0,  INS_SET_ZERO, 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_0F01[] = {\t/* Group 7 */\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_s | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"sgdt\", \"\",   0,   0,   0,  0 , 44 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_s | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"sidt\", \"\",   0,   0,   0,  0 , 45 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_s | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"lgdt\", \"\",   0,   0,   0,  0 , 27 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_s | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"lidt\", \"\",   0,   0,   0,  0 , 28 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"smsw\", \"\",   0,   0,   0,  0 , 47 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"lmsw\", \"\",   0,   0,   0,  0 , 30 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_none | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80486 | isa_GP,   \"invlpg\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_s | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"sgdt\", \"\",   0,   0,   0,  0 , 44 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_s | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"sidt\", \"\",   0,   0,   0,  0 , 45 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_s | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"lgdt\", \"\",   0,   0,   0,  0 , 27 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_s | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"lidt\", \"\",   0,   0,   0,  0 , 28 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"smsw\", \"\",   0,   0,   0,  0 , 47 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"lmsw\", \"\",   0,   0,   0,  0 , 30 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_none | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80486 | isa_GP,   \"invlpg\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_s | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"sgdt\", \"\",   0,   0,   0,  0 , 44 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_s | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"sidt\", \"\",   0,   0,   0,  0 , 45 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_s | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"lgdt\", \"\",   0,   0,   0,  0 , 27 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_s | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"lidt\", \"\",   0,   0,   0,  0 , 28 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"smsw\", \"\",   0,   0,   0,  0 , 47 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"lmsw\", \"\",   0,   0,   0,  0 , 30 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_M | OPTYPE_none | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80486 | isa_GP,   \"invlpg\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { idx_0F0111,  0,   0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"smsw\", \"\",   0,   0,   0,  0 , 47 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_w | OP_W,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"lmsw\", \"\",   0,   0,   0,  0 , 30 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_0F0111[] = {\t/* Monitor/MWait opcode */\n\t { 0, INS_SYSTEM,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"monitor\", \"\", 0, 0, 0, 0, 54 },\n\t { 0, INS_SYSTEM,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"mwait\", \"\", 0, 0, 0, 0, 55 }\n};\n\n\nstatic ia32_insn_t tbl_0F12[] = {\t/* Movlps Opcode */\n\t { 0,   INS_MOV,  INS_NOTE_NOSUFFIX,   ADDRMETH_V | OPTYPE_q | OP_W,   ADDRMETH_M | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movlps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  INS_NOTE_NOSUFFIX,   ADDRMETH_V | OPTYPE_q | OP_W,   ADDRMETH_M | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movlps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_MOV,  INS_NOTE_NOSUFFIX,   ADDRMETH_V | OPTYPE_q | OP_W,   ADDRMETH_M | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movlps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_MOV,  0, ADDRMETH_V | OPTYPE_ps | OP_R | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R , ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movhlps\", \"\", 0, 0, 0, 0, 0 }\n};\n\n\nstatic ia32_insn_t tbl_0F16[] = {\t/* Movhps Opcode */\n\t { 0,   INS_OTHER,  0,   ADDRMETH_V | OPTYPE_q | OP_W,   ADDRMETH_M | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movhps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_V | OPTYPE_q | OP_W,   ADDRMETH_M | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movhps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_V | OPTYPE_q | OP_W,   ADDRMETH_M | OPTYPE_q | OP_R,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"movhps\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_MOV,  0, ADDRMETH_V | OPTYPE_ps | OP_R | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R , ARG_NONE, cpu_PENTIUM4 | isa_GP, \"movlhps\", \"\", 0, 0, 0, 0, 0 }\n};\n\n\nstatic ia32_insn_t tbl_0F18[] = {\t/* Group 16 */\n\t { 0,   INS_SYSTEM,  0,    OP_W | OPTYPE_b | ADDRMETH_M,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"prefetchnta\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"prefetcht0\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"prefetcht1\", \"\",   1,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"prefetcht2\", \"\",   2,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,    OP_W | OPTYPE_b | ADDRMETH_M,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"prefetchnta\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"prefetcht0\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"prefetcht1\", \"\",   1,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"prefetcht2\", \"\",   2,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,    OP_W | OPTYPE_b | ADDRMETH_M,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"prefetchnta\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"prefetcht0\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"prefetcht1\", \"\",   1,   0,   0,  0 , 0 },\n\t { 0,   INS_SYSTEM,  0,   ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE,   ARG_NONE,   cpu_PENTIUM2 | isa_GP,   \"prefetcht2\", \"\",   2,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_0F71[] = {\t/* Group 12 */\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psrlw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psraw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psllw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_660F71[] = {\t/* Group 12 SSE */\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_dq | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psrlw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_dq | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psraw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_dq | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psllw\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_0F72[] = {\t/* Group 13 */\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psrld\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psrad\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pslld\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_660F72[] = {\t/* Group 13 SSE */\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_W | OPTYPE_dq | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psrld\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_W | OPTYPE_dq | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psrad\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_W | OPTYPE_dq | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pslld\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_0F73[] = {\t/* Group 14 */\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psrlq\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_P | OPTYPE_q | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psllq\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_660F73[] = {\t/* Group 14 SSE */\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_W | OPTYPE_dq | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psrlq\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_W | OPTYPE_dq | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psrldq\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_W | OPTYPE_dq | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"psllq\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_OTHER,  0,   ADDRMETH_W | OPTYPE_dq | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"pslldq\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_0FAE[] = {\t/* Group 15 */\n\t { 0, INS_FPU,  0,   ADDRMETH_E | OPTYPE_fx | OP_W,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"fxsave\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_FPU,  0,   ADDRMETH_E | OPTYPE_fx | OP_R,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"fxrstor\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_d | OP_R,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM2,   \"ldmxcsr\", \"\",   0,   0,   0,  0 , 25 },\n\t { 0, INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_d | OP_W,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM2,   \"stmxcsr\", \"\",   0,   0,   0 ,  0, 48 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_SYSTEM,  0, ADDRMETH_M | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"clflush\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_FPU,  0,   ADDRMETH_E | OPTYPE_fx | OP_W,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"fxsave\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_FPU,  0,   ADDRMETH_E | OPTYPE_fx | OP_R,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"fxrstor\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_d | OP_R,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM2,   \"ldmxcsr\", \"\",   0,   0,   0,  0 , 25 },\n\t { 0, INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_d | OP_W,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM2,   \"stmxcsr\", \"\",   0,   0,   0 ,  0, 48 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_SYSTEM,  0, ADDRMETH_M | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"clflush\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_FPU,  0,   ADDRMETH_E | OPTYPE_fx | OP_W,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"fxsave\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_FPU,  0,   ADDRMETH_E | OPTYPE_fx | OP_R,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_MMX,   \"fxrstor\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_d | OP_R,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM2,   \"ldmxcsr\", \"\",   0,   0,   0,  0 , 25 },\n\t { 0, INS_SYSTEM,  0,   ADDRMETH_E | OPTYPE_d | OP_W,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM2,   \"stmxcsr\", \"\",   0,   0,   0 ,  0, 48 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_SYSTEM,  0, ADDRMETH_M | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"clflush\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"lfence\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"mfence\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"sfence\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_0FBA[] = {\t/* Group 8 */\n\t { 0,   INS_BITTEST,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"bt\", \"\",   0,   0,   0,  INS_SET_CARRY, 0 },\n\t { 0,   INS_BITTEST,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"bts\", \"\",   0,   0,   0,  INS_SET_CARRY, 0 },\n\t { 0,   INS_BITTEST,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"btr\", \"\",   0,   0,   0,  INS_SET_CARRY, 0 },\n\t { 0,   INS_BITTEST,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"btc\", \"\",   0,   0,   0   ,  INS_SET_CARRY, 0 }\n};\n\n\nstatic ia32_insn_t tbl_0FC7[] = {\t/* Group 9 */\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_XCHGCC,  0,   ADDRMETH_M | OPTYPE_q | OP_W,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_GP,   \"cmpxch8b\", \"\",   0,   0,   0   ,  0 , 9 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_XCHGCC,  0,   ADDRMETH_M | OPTYPE_q | OP_W,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_GP,   \"cmpxch8b\", \"\",   0,   0,   0   ,  0 , 9 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0, INS_INVALID,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_XCHGCC,  0,   ADDRMETH_M | OPTYPE_q | OP_W,   ARG_NONE,   ARG_NONE,   cpu_PENTIUM | isa_GP,   \"cmpxch8b\", \"\",   0,   0,   0   ,  0 , 9 }\n};\n\n\nstatic ia32_insn_t tbl_0FB9[] = {\t/* Group 10 */\n\t { 0, INS_SYSTEM,  0,   ARG_NONE,   ARG_NONE,   ARG_NONE,   0,   \"fxsave\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_C6[] = {\t/* Group 11a */\n\t { 0,   INS_MOV,  0,   ADDRMETH_E | OPTYPE_b | OP_W,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_C7[] = {\t/* Group 11b */\n\t { 0,   INS_MOV,  0,   ADDRMETH_E | OPTYPE_v | OP_W,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mov\", \"\",   0,   0,   0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_80[] = {\t/* Group 1a */\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"add\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_OR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"or\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"adc\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sbb\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_AND,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"and\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sub\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_XOR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xor\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_CMP,  0,   ADDRMETH_E | OPTYPE_b | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"cmp\", \"\",   0,   0,   0   ,  INS_SET_ALL, 0 }\n};\n\n\nstatic ia32_insn_t tbl_81[] = {\t/* Group 1b */\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"add\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_OR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"or\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"adc\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sbb\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_AND,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"and\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sub\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_XOR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xor\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_CMP,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"cmp\", \"\",   0,   0,   0   ,  INS_SET_ALL, 0 }\n};\n\n\nstatic ia32_insn_t tbl_82[] = {\t/* Group 1c */\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"add\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_OR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"or\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"adc\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sbb\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_AND,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"and\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sub\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_XOR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xor\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_CMP,  0,   ADDRMETH_E | OPTYPE_b | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"cmp\", \"\",   0,   0,   0   ,  INS_SET_ALL, 0 }\n};\n\n\nstatic ia32_insn_t tbl_83[] = {\t/* Group 1d */\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"add\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_OR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"or\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_ADD,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"adc\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sbb\", \"\",   0,   0,   0,  INS_SET_ALL|INS_TEST_CARRY, 0 },\n\t { 0,   INS_AND,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"and\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SUB,  0,   ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sub\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_XOR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"xor\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_CMP,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"cmp\", \"\",   0,   0,   0   ,  INS_SET_ALL, 0 }\n};\n\n\nstatic ia32_insn_t tbl_C0[] = {\t/* Group 2a */\n\t { 0,   INS_ROL,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rol\", \"\",   0,   0,   0,  INS_SET_CARRY|INS_SET_OFLOW, 0 },\n\t { 0,   INS_ROR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"ror\", \"\",   0,   0,   0,  INS_SET_CARRY|INS_SET_OFLOW, 0 },\n\t { 0,   INS_ROL,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rcl\", \"\",   0,   0,   0,  INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 },\n\t { 0,   INS_ROR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rcr\", \"\",   0,   0,   0,  INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"shl\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"shr\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sal\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sar\", \"\",   0,   0,   0   ,  INS_SET_ALL, 0 }\n};\n\n\nstatic ia32_insn_t tbl_C1[] = {\t/* Group 2b */\n\t { 0,   INS_ROL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rol\", \"\",   0,   0,   0,  INS_SET_CARRY|INS_SET_OFLOW, 0 },\n\t { 0,   INS_ROR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"ror\", \"\",   0,   0,   0,  INS_SET_CARRY|INS_SET_OFLOW, 0 },\n\t { 0,   INS_ROL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rcl\", \"\",   0,   0,   0,  INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 },\n\t { 0,   INS_ROR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rcr\", \"\",   0,   0,   0,  INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"shl\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"shr\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sal\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_I | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sar\", \"\",   0,   0,   0   ,  INS_SET_ALL, 0 }\n};\n\n\nstatic ia32_insn_t tbl_D0[] = {\t/* Group 2c */\n\t { 0,   INS_ROL,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_II | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rol\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW, 0 },\n\t { 0,   INS_ROR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_II | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"ror\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW, 0 },\n\t { 0,   INS_ROL,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_II | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rcl\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 },\n\t { 0,   INS_ROR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_II | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rcr\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_II | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"shl\", \"\",   0,   1,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_II | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"shr\", \"\",   0,   1,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_II | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sal\", \"\",   0,   1,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_II | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sar\", \"\",   0,   1,   0   ,  INS_SET_ALL, 0 }\n};\n\n\nstatic ia32_insn_t tbl_D1[] = {\t/* Group 2d */\n\t { 0,   INS_ROL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_II | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rol\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW, 0 },\n\t { 0,   INS_ROR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_II | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"ror\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW, 0 },\n\t { 0,   INS_ROL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_II | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rcl\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 },\n\t { 0,   INS_ROR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_II | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rcr\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_II | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"shl\", \"\",   0,   1,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_II | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"shr\", \"\",   0,   1,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_II | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sal\", \"\",   0,   1,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_II | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sar\", \"\",   0,   1,   0   ,  INS_SET_ALL, 0 }\n};\n\n\nstatic ia32_insn_t tbl_D2[] = {\t/* Group 2e */\n\t { 0,   INS_ROL,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rol\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW, 0 },\n\t { 0,   INS_ROR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"ror\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW, 0 },\n\t { 0,   INS_ROL,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rcl\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 },\n\t { 0,   INS_ROR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rcr\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"shl\", \"\",   0,   1,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"shr\", \"\",   0,   1,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sal\", \"\",   0,   1,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sar\", \"\",   0,   1,   0   ,  INS_SET_ALL, 0 }\n};\n\n\nstatic ia32_insn_t tbl_D3[] = {\t/* Group 2f */\n\t { 0,   INS_ROL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rol\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW, 0 },\n\t { 0,   INS_ROR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"ror\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW, 0 },\n\t { 0,   INS_ROL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rcl\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 },\n\t { 0,   INS_ROR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"rcr\", \"\",   0,   1,   0,  INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"shl\", \"\",   0,   1,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"shr\", \"\",   0,   1,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHL,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sal\", \"\",   0,   1,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_SHR,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ADDRMETH_RR | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"sar\", \"\",   0,   1,   0   ,  INS_SET_ALL, 0 }\n};\n\n\nstatic ia32_insn_t tbl_F6[] = {\t/* Group 3a */\n\t { 0,   INS_TEST,  0,   ADDRMETH_E | OPTYPE_b | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"test\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_TEST,  0,   ADDRMETH_E | OPTYPE_b | OP_R,   ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"test\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_NOT,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"not\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_NEG,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"neg\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_MUL,  0,   OPTYPE_b | ADDRMETH_RR | OP_W | OP_R,   ADDRMETH_E | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mul\", \"\",   0,   0,   0,  INS_SET_OFLOW|INS_SET_CARRY, 22 },\n\t { 0,   INS_MUL,  0,   OPTYPE_b | ADDRMETH_RR | OP_W | OP_SIGNED | OP_R,   ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"imul\", \"\",   0,   0,   0,  INS_SET_OFLOW|INS_SET_CARRY, 22 },\n\t { 0,   INS_DIV,  0,   ADDRMETH_RR | OPTYPE_b | OP_W | OP_R,   ADDRMETH_E | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"div\", \"\",   0,   0,   0,  0 , 13 },\n\t { 0,   INS_DIV,  0,   ADDRMETH_RR | OPTYPE_b | OP_W | OP_R,   ADDRMETH_E | OPTYPE_b | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"idiv\", \"\",   0,   0,   0   ,  0 , 13 }\n};\n\n\nstatic ia32_insn_t tbl_F7[] = {\t/* Group 3b */\n\t { 0,   INS_TEST,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"test\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_TEST,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"test\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_NOT,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"not\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_NEG,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"neg\", \"\",   0,   0,   0,  INS_SET_ALL, 0 },\n\t { 0,   INS_MUL,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"mul\", \"\",   0,   0,   0,  INS_SET_OFLOW|INS_SET_CARRY, 23 },\n\t { 0,   INS_MUL,  0,   ADDRMETH_RR | OPTYPE_v | OP_SIGNED | OP_W | OP_R,   ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"imul\", \"\",   0,   0,   0,  INS_SET_OFLOW|INS_SET_CARRY, 23 },\n\t { 0,   INS_DIV,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"div\", \"\",   0,   0,   0,  0 , 14 },\n\t { 0,   INS_DIV,  0,   ADDRMETH_RR | OPTYPE_v | OP_W | OP_R,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   cpu_80386 | isa_GP,   \"idiv\", \"\",   0,   0,   0,  0 , 14 }\n};\n\n\nstatic ia32_insn_t tbl_FE[] = {\t/* Group 4 */\n\t { 0,   INS_INC,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"inc\", \"\",   0,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_DEC,  0,   ADDRMETH_E | OPTYPE_b | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"dec\", \"\",   0,   0,   0   ,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }\n};\n\n\nstatic ia32_insn_t tbl_FF[] = {\t/* Group 5 */\n\t { 0,   INS_INC,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"inc\", \"\",   0,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_DEC,  0,   ADDRMETH_E | OPTYPE_v | OP_W | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"dec\", \"\",   0,   0,   0,  INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 },\n\t { 0,   INS_CALL,  0,   ADDRMETH_E | OPTYPE_v | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"call\", \"\",   0,   0,   0,  0 , 3 },\n\t { 0,   INS_CALL,  0,   ADDRMETH_M | OPTYPE_p | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"call\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_BRANCH,  0,   ADDRMETH_E | OPTYPE_v | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jmp\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_BRANCH,  0,   ADDRMETH_M | OPTYPE_p | OP_X,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"jmp\", \"\",   0,   0,   0,  0 , 0 },\n\t { 0,   INS_PUSH,  0,   ADDRMETH_E | OPTYPE_v | OP_R,   ARG_NONE,   ARG_NONE,   cpu_80386 | isa_GP,   \"push\", \"\",   0,   0,   0,  0 , 33 }\n};\n\n\nstatic ia32_insn_t tbl_D8[] = {\t/* FPU D8 */\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fs|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fs|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fs|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcom\", \"\",  0,  0,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fs|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomp\", \"\",  0,  0,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fs|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fs|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fs|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fs|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  0,  0,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_D8C0[] = {\t/* FPU D8 C0 */\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  0,  1,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  0,  2,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  0,  3,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  0,  4,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  0,  5,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  0,  6,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  0,  7,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  0,  1,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  0,  2,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  0,  3,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  0,  4,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  0,  5,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  0,  6,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  0,  7,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcom\", \"\",  0,  0,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcom\", \"\",  0,  1,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcom\", \"\",  0,  2,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcom\", \"\",  0,  3,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcom\", \"\",  0,  4,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcom\", \"\",  0,  5,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcom\", \"\",  0,  6,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcom\", \"\",  0,  7,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomp\", \"\",  0,  0,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomp\", \"\",  0,  1,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomp\", \"\",  0,  2,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomp\", \"\",  0,  3,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomp\", \"\",  0,  4,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomp\", \"\",  0,  5,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomp\", \"\",  0,  6,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomp\", \"\",  0,  7,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  0,  1,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  0,  2,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  0,  3,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  0,  4,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  0,  5,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  0,  6,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  0,  7,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  0,  1,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  0,  2,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  0,  3,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  0,  4,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  0,  5,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  0,  6,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  0,  7,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  0,  1,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  0,  2,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  0,  3,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  0,  4,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  0,  5,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  0,  6,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  0,  7,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  0,  1,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  0,  2,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  0,  3,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  0,  4,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  0,  5,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  0,  6,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  0,  7,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_D9[] = {\t/* FPU D9 */\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fs|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fld\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fs|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fst\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fs|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fstp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fv|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fldenv\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fldcw\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fv|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fnstenv\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fnstcw\", \"\",  0,  0,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_D9C0[] = {\t/* FPU D9 C0 */\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fld\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fld\", \"\",  0,  1,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fld\", \"\",  0,  2,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fld\", \"\",  0,  3,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fld\", \"\",  0,  4,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fld\", \"\",  0,  5,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fld\", \"\",  0,  6,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fld\", \"\",  0,  7,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fxch\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fxch\", \"\",  0,  1,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fxch\", \"\",  0,  2,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fxch\", \"\",  0,  3,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fxch\", \"\",  0,  4,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fxch\", \"\",  0,  5,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fxch\", \"\",  0,  6,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fxch\", \"\",  0,  7,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fnop\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fchs\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fabs\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"ftst\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fxam\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fld1\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fldl2t\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fldl2e\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fldpi\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fldlg2\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fldln2\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fldz\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"f2xm1\", \"\",  0,  0,  0 ,  0 , 16 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fyl2x\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fptan\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fpatan\", \"\",  0,  0,  0 ,  0 , 18 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fxtract\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fprem1\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdecstp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fincstp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fprem\", \"\",  0,  0,  0 ,  0 , 19 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fyl2xp1\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsqrt\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsincos\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"frndint\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fscale\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsin\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcos\", \"\",  0,  0,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_DA[] = {\t/* FPU DA */\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_d|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fiadd\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_d|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fimul\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_d|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"ficom\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_d|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"ficomp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_d|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fisub\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_d|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fisubr\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_d|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fidiv\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_d|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fidivr\", \"\",  0,  0,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_DAC0[] = {\t/* FPU DA C0 */\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovb\", \"\",  0,  0,  0 ,  INS_TEST_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovb\", \"\",  0,  1,  0 ,  INS_TEST_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovb\", \"\",  0,  2,  0 ,  INS_TEST_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovb\", \"\",  0,  3,  0 ,  INS_TEST_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovb\", \"\",  0,  4,  0 ,  INS_TEST_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovb\", \"\",  0,  5,  0 ,  INS_TEST_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovb\", \"\",  0,  6,  0 ,  INS_TEST_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovb\", \"\",  0,  7,  0 ,  INS_TEST_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmove\", \"\",  0,  0,  0 ,  INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmove\", \"\",  0,  1,  0 ,  INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmove\", \"\",  0,  2,  0 ,  INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmove\", \"\",  0,  3,  0 ,  INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmove\", \"\",  0,  4,  0 ,  INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmove\", \"\",  0,  5,  0 ,  INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmove\", \"\",  0,  6,  0 ,  INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmove\", \"\",  0,  7,  0 ,  INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovbe\", \"\",  0,  0,  0 ,  INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovbe\", \"\",  0,  1,  0 ,  INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovbe\", \"\",  0,  2,  0 ,  INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovbe\", \"\",  0,  3,  0 ,  INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovbe\", \"\",  0,  4,  0 ,  INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovbe\", \"\",  0,  5,  0 ,  INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovbe\", \"\",  0,  6,  0 ,  INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovbe\", \"\",  0,  7,  0 ,  INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovu\", \"\",  0,  0,  0 ,  INS_TEST_PARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovu\", \"\",  0,  1,  0 ,  INS_TEST_PARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovu\", \"\",  0,  2,  0 ,  INS_TEST_PARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovu\", \"\",  0,  3,  0 ,  INS_TEST_PARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovu\", \"\",  0,  4,  0 ,  INS_TEST_PARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovu\", \"\",  0,  5,  0 ,  INS_TEST_PARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovu\", \"\",  0,  6,  0 ,  INS_TEST_PARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcmovu\", \"\",  0,  7,  0 ,  INS_TEST_PARITY, 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucompp\", \"\",  0,  0,  0 ,  0 , 21 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_DB[] = {\t/* FPU DB */\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_d|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fild\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_FPU,  0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"fisttp\", \"\", 0, 0, 0, 0, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_d|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fist\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_d|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fistp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fe|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fld\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fe|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fstp\", \"\",  0,  0,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_DBC0[] = {\t/* FPU DB C0 */\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnb\", \"\",  0,  0,  0 ,  INS_TEST_NCARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnb\", \"\",  0,  1,  0 ,  INS_TEST_NCARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnb\", \"\",  0,  2,  0 ,  INS_TEST_NCARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnb\", \"\",  0,  3,  0 ,  INS_TEST_NCARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnb\", \"\",  0,  4,  0 ,  INS_TEST_NCARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnb\", \"\",  0,  5,  0 ,  INS_TEST_NCARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnb\", \"\",  0,  6,  0 ,  INS_TEST_NCARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnb\", \"\",  0,  7,  0 ,  INS_TEST_NCARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovne\", \"\",  0,  0,  0 ,  INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovne\", \"\",  0,  1,  0 ,  INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovne\", \"\",  0,  2,  0 ,  INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovne\", \"\",  0,  3,  0 ,  INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovne\", \"\",  0,  4,  0 ,  INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovne\", \"\",  0,  5,  0 ,  INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovne\", \"\",  0,  6,  0 ,  INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovne\", \"\",  0,  7,  0 ,  INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnbe\", \"\",  0,  0,  0 ,  INS_TEST_NCARRY|INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnbe\", \"\",  0,  1,  0 ,  INS_TEST_NCARRY|INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnbe\", \"\",  0,  2,  0 ,  INS_TEST_NCARRY|INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnbe\", \"\",  0,  3,  0 ,  INS_TEST_NCARRY|INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnbe\", \"\",  0,  4,  0 ,  INS_TEST_NCARRY|INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnbe\", \"\",  0,  5,  0 ,  INS_TEST_NCARRY|INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnbe\", \"\",  0,  6,  0 ,  INS_TEST_NCARRY|INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnbe\", \"\",  0,  7,  0 ,  INS_TEST_NCARRY|INS_TEST_NZERO, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnu\", \"\",  0,  0,  0 ,  INS_TEST_NPARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnu\", \"\",  0,  1,  0 ,  INS_TEST_NPARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnu\", \"\",  0,  2,  0 ,  INS_TEST_NPARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnu\", \"\",  0,  3,  0 ,  INS_TEST_NPARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnu\", \"\",  0,  4,  0 ,  INS_TEST_NPARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnu\", \"\",  0,  5,  0 ,  INS_TEST_NPARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnu\", \"\",  0,  6,  0 ,  INS_TEST_NPARITY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcmovnu\", \"\",  0,  7,  0 ,  INS_TEST_NPARITY, 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fnclex\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fninit\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomi\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomi\", \"\",  0,  1,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomi\", \"\",  0,  2,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomi\", \"\",  0,  3,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomi\", \"\",  0,  4,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomi\", \"\",  0,  5,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomi\", \"\",  0,  6,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomi\", \"\",  0,  7,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcomi\", \"\",  0,  0,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY,  0,  },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcomi\", \"\",  0,  1,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcomi\", \"\",  0,  2,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcomi\", \"\",  0,  3,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcomi\", \"\",  0,  4,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcomi\", \"\",  0,  5,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcomi\", \"\",  0,  6,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_PENTPRO | isa_GP,  \"fcomi\", \"\",  0,  7,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_DC[] = {\t/* FPU DC */\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fd|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fd|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fd|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcom\", \"\",  0,  0,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fd|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomp\", \"\",  0,  0,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fd|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fd|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fd|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fd|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  0,  0,  0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_DCC0[] = {\t/* FPU DC C0 */\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fadd\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmul\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubr\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsub\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivr\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdiv\", \"\",  7,  0,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_DD[] = {\t/* FPU DD */\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fd|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fld\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_FPU,  0, ADDRMETH_M|OPTYPE_q|OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"fisttp\", \"\", 0, 0, 0, 0, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fd|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fst\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fd|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fstp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_ft|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"frstor\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_ft|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fnsave\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fnstsw\", \"\",  0,  0,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_DDC0[] = {\t/* FPU DD C0 */\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"ffree\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"ffree\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"ffree\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"ffree\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"ffree\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"ffree\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"ffree\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"ffree\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fst\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fst\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fst\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fst\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fst\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fst\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fst\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fst\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fstp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fstp\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fstp\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fstp\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fstp\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fstp\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fstp\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fstp\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucom\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucom\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucom\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucom\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucom\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucom\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucom\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucom\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomp\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomp\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomp\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomp\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomp\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomp\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomp\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_DE[] = {\t/* FPU DE */\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fiadd\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fimul\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"ficom\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"ficomp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fisub\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fisubr\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fidiv\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fidivr\", \"\",  0,  0,  0,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_DEC0[] = {\t/* FPU DE C0 */\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"faddp\", \"\",  0,  0,  0 ,  0 , 20 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"faddp\", \"\",  1,  0,  0 ,  0 , 20 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"faddp\", \"\",  2,  0,  0 ,  0 , 20 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"faddp\", \"\",  3,  0,  0 ,  0 , 20 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"faddp\", \"\",  4,  0,  0 ,  0 , 20 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"faddp\", \"\",  5,  0,  0 ,  0 , 20 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"faddp\", \"\",  6,  0,  0 ,  0 , 20 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"faddp\", \"\",  7,  0,  0 ,  0 , 20 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmulp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmulp\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmulp\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmulp\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmulp\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmulp\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmulp\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fmulp\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcompp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubrp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubrp\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubrp\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubrp\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubrp\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubrp\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubrp\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubrp\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubp\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubp\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubp\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubp\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubp\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubp\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fsubp\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivrp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivrp\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivrp\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivrp\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivrp\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivrp\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivrp\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivrp\", \"\",  7,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivp\", \"\",  1,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivp\", \"\",  2,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivp\", \"\",  3,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivp\", \"\",  4,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivp\", \"\",  5,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivp\", \"\",  6,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fdivp\", \"\",  7,  0,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_DF[] = {\t/* FPU DF */\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fild\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_FPU,  0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, \"fisttp\", \"\", 0, 0, 0, 0, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fist\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_w|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fistp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fb|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fbld\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_q|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fild\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_fb|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fbstp\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_M|OPTYPE_q|OP_W,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fistp\", \"\",  0,  0,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_DFC0[] = {\t/* FPU DF C0 */\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RR | OPTYPE_w | OP_R,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fnstsw\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomip\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomip\", \"\",  0,  1,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomip\", \"\",  0,  2,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomip\", \"\",  0,  3,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomip\", \"\",  0,  4,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomip\", \"\",  0,  5,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomip\", \"\",  0,  6,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fucomip\", \"\",  0,  7,  0 ,  0 , 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomip\", \"\",  0,  0,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomip\", \"\",  0,  1,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomip\", \"\",  0,  2,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomip\", \"\",  0,  3,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomip\", \"\",  0,  4,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomip\", \"\",  0,  5,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomip\", \"\",  0,  6,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0,  INS_FPU,  0,  ADDRMETH_RF | OPTYPE_fp | OP_W,  ADDRMETH_RF | OPTYPE_fp | OP_R,  ARG_NONE,  cpu_80387 | isa_FPU,  \"fcomip\", \"\",  0,  7,  0 ,  INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 },\n\t { 0, INS_INVALID,  0,  ARG_NONE,  ARG_NONE,  ARG_NONE,  cpu_80387 | isa_FPU,  \"\", \"\",  0,  0,  0 ,  0 , 0 }\n};\n\n\nstatic ia32_insn_t tbl_0F0F[] = {\t/* 3D Now! 0F Suffix */\n\t/* 00 */ { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_CONV,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pi2fd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t/* 10 */ { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_CONV,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pf2id\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t/* 20 */ { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t/* 30 */ { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t/* 40 */ { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t/* 50 */ { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t/* 60 */ { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t/* 70 */ { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t/* 80 */ { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_CMP,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfcmpge\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MIN,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfmin\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_ARITH,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfrcp\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_ARITH,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfrsqrt\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_SUB,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfsub\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_ADD,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfadd\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_CMP,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfcmpgt\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MAX,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfmax\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_ARITH,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfrcpit1\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_ARITH,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfrsqit1\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_SUB,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfsubr\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_ADD,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfacc\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_CMP,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfcmpeq\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MUL,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfmul\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_ARITH,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pfrcpit2\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_MUL,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pmulhrw\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_INVALID,  0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, \"\", \"\", 0, 0, 0, 0, 0 },\n\t { 0, INS_AVG,  0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, \"pavgusb\", \"\", 0, 0, 0, 0, 0 }\n};\n\n\n\n/* ================== Table of Opcode Tables ================== */\nia32_table_desc_t ia32_tables[] = {\n\t/* table, prefix table, type, shift, mask, min, max */\n\t{ tbl_Main, tbl_opcode, 0x00, 0xFF, 0x00, 0xFF },\n\t{ tbl_66, tbl_prefix, 0x00, 0xFF, 0x0F, 0x0F },\n\t{ tbl_F2, tbl_prefix, 0x00, 0xFF, 0x0F, 0x0F },\n\t{ tbl_F3, tbl_prefix, 0x00, 0xFF, 0x0F, 0x90 },\n\t{ tbl_0F, tbl_opcode, 0x00, 0xFF, 0x00, 0xFF },\n\t/* 5 */\n\t{ tbl_660F, tbl_prefix, 0x00, 0xFF, 0x10, 0xFF },\n\t{ tbl_F20F, tbl_prefix, 0x00, 0xFF, 0x10, 0xFF },\n\t{ tbl_F30F, tbl_prefix, 0x00, 0xFF, 0x10, 0xFF },\n\t{ tbl_0F00, tbl_extension, 0x03, 0x07, 0x00, 0x07 },\n\t{ tbl_0F01, tbl_extension, 0x03, 0x1F, 0x00, 0x1F },\n\t/* 10 */\n\t{ tbl_0F0111, tbl_ext_ext, 0x00, 0x01, 0x00, 0x01 },\n\t{ tbl_0F12, tbl_extension, 0x06, 0x03, 0x00, 0x03 },\n\t{ tbl_0F16, tbl_extension, 0x06, 0x03, 0x00, 0x03 },\n\t{ tbl_0F18, tbl_extension, 0x03, 0x1F, 0x00, 0x13 },\n\t{ tbl_0F71, tbl_extension, 0x03, 0x1F, 0x00, 0x1F },\n\t/* 15 */\n\t{ tbl_660F71, tbl_extension, 0x03, 0x1F, 0x00, 0x1F },\n\t{ tbl_0F72, tbl_extension, 0x03, 0x1F, 0x00, 0x1F },\n\t{ tbl_660F72, tbl_extension, 0x03, 0x1F, 0x00, 0x1F },\n\t{ tbl_0F73, tbl_extension, 0x00, 0x00, 0x00, 0x00 },\n\t{ tbl_660F73, tbl_extension, 0x03, 0x1F, 0x00, 0x1F },\n\t/* 20 */\n\t{ tbl_0FAE, tbl_extension, 0x03, 0x1F, 0x00, 0x1F },\n\t{ tbl_0FBA, tbl_extension, 0x03, 0x07, 0x04, 0x07 },\n\t{ tbl_0FC7, tbl_extension, 0x03, 0x1F, 0x00, 0x11 },\n\t{ tbl_0FB9, tbl_extension, 0x03, 0x07, 0x00, 0x00 },\n\t{ tbl_C6, tbl_extension, 0x03, 0x07, 0x00, 0x00 },\n\t/* 25 */\n\t{ tbl_C7, tbl_extension, 0x03, 0x07, 0x00, 0x00 },\n\t{ tbl_80, tbl_extension, 0x03, 0x07, 0x00, 0x07 },\n\t{ tbl_81, tbl_extension, 0x03, 0x07, 0x00, 0x07 },\n\t{ tbl_82, tbl_extension, 0x03, 0x07, 0x00, 0x07 },\n\t{ tbl_83, tbl_extension, 0x03, 0x07, 0x00, 0x07 },\n\t/* 30 */\n\t{ tbl_C0, tbl_extension, 0x03, 0x07, 0x00, 0x07 },\n\t{ tbl_C1, tbl_extension, 0x03, 0x07, 0x00, 0x07 },\n\t{ tbl_D0, tbl_extension, 0x03, 0x07, 0x00, 0x07 },\n\t{ tbl_D1, tbl_extension, 0x03, 0x07, 0x00, 0x07 },\n\t{ tbl_D2, tbl_extension, 0x03, 0x07, 0x00, 0x07 },\n\t/* 35 */\n\t{ tbl_D3, tbl_extension, 0x03, 0x07, 0x00, 0x07 },\n\t{ tbl_F6, tbl_extension, 0x03, 0x07, 0x00, 0x07 },\n\t{ tbl_F7, tbl_extension, 0x03, 0x07, 0x00, 0x07 },\n\t{ tbl_FE, tbl_extension, 0x03, 0x07, 0x00, 0x01 },\n\t{ tbl_FF, tbl_extension, 0x03, 0x07, 0x00, 0x06 },\n\t/* 40 */\n\t{ tbl_D8, tbl_fpu, 0x03, 0x07, 0x00, 0xBF },\n\t{ tbl_D8C0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF },\n\t{ tbl_D9, tbl_fpu, 0x03, 0x07, 0x00, 0xBF },\n\t{ tbl_D9C0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF },\n\t{ tbl_DA, tbl_fpu, 0x03, 0x07, 0x00, 0xBF },\n\t/* 45 */\n\t{ tbl_DAC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF },\n\t{ tbl_DB, tbl_fpu, 0x03, 0x07, 0x00, 0xBF },\n\t{ tbl_DBC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF },\n\t{ tbl_DC, tbl_fpu, 0x03, 0x07, 0x00, 0xBF },\n\t{ tbl_DCC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF },\n\t/* 50 */\n\t{ tbl_DD, tbl_fpu, 0x03, 0x07, 0x00, 0xBF },\n\t{ tbl_DDC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF },\n\t{ tbl_DE, tbl_fpu, 0x03, 0x07, 0x00, 0xBF },\n\t{ tbl_DEC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF },\n\t{ tbl_DF, tbl_fpu, 0x03, 0x07, 0x00, 0xBF },\n\t/* 55 */\n\t{ tbl_DFC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF },\n\t{ tbl_0F0F, tbl_suffix, 0x00, 0xFF, 0x00, 0xBF }\n};\n/* ia32_opcode_tables.h */\n/* Table index constants: \n#define idx_Main 0\n#define idx_66 1\n#define idx_F2 2\n#define idx_F3 3\n#define idx_0F 4\n#define idx_660F 5\n#define idx_F20F 6\n#define idx_F30F 7\n#define idx_0F00 8\n#define idx_0F01 9\n#define idx_0F0111 10\n#define idx_0F12 11\n#define idx_0F16 12\n#define idx_0F18 13\n#define idx_0F71 14\n#define idx_660F71 15\n#define idx_0F72 16\n#define idx_660F72 17\n#define idx_0F73 18\n#define idx_660F73 19\n#define idx_0FAE 20\n#define idx_0FBA 21\n#define idx_0FC7 22\n#define idx_0FB9 23\n#define idx_C6 24\n#define idx_C7 25\n#define idx_80 26\n#define idx_81 27\n#define idx_82 28\n#define idx_83 29\n#define idx_C0 30\n#define idx_C1 31\n#define idx_D0 32\n#define idx_D1 33\n#define idx_D2 34\n#define idx_D3 35\n#define idx_F6 36\n#define idx_F7 37\n#define idx_FE 38\n#define idx_FF 39\n#define idx_D8 40\n#define idx_D8C0 41\n#define idx_D9 42\n#define idx_D9C0 43\n#define idx_DA 44\n#define idx_DAC0 45\n#define idx_DB 46\n#define idx_DBC0 47\n#define idx_DC 48\n#define idx_DCC0 49\n#define idx_DD 50\n#define idx_DDC0 51\n#define idx_DE 52\n#define idx_DEC0 53\n#define idx_DF 54\n#define idx_DFC0 55\n#define idx_0F0F 56\n*/ \n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.h",
    "content": "#define idx_Main 0\n#define idx_66 1\n#define idx_F2 2\n#define idx_F3 3\n#define idx_0F 4\n#define idx_660F 5\n#define idx_F20F 6\n#define idx_F30F 7\n#define idx_0F00 8\n#define idx_0F01 9\n#define idx_0F0111 10\n#define idx_0F12 11\n#define idx_0F16 12\n#define idx_0F18 13\n#define idx_0F71 14\n#define idx_660F71 15\n#define idx_0F72 16\n#define idx_660F72 17\n#define idx_0F73 18\n#define idx_660F73 19\n#define idx_0FAE 20\n#define idx_0FBA 21\n#define idx_0FC7 22\n#define idx_0FB9 23\n#define idx_C6 24\n#define idx_C7 25\n#define idx_80 26\n#define idx_81 27\n#define idx_82 28\n#define idx_83 29\n#define idx_C0 30\n#define idx_C1 31\n#define idx_D0 32\n#define idx_D1 33\n#define idx_D2 34\n#define idx_D3 35\n#define idx_F6 36\n#define idx_F7 37\n#define idx_FE 38\n#define idx_FF 39\n#define idx_D8 40\n#define idx_D8C0 41\n#define idx_D9 42\n#define idx_D9C0 43\n#define idx_DA 44\n#define idx_DAC0 45\n#define idx_DB 46\n#define idx_DBC0 47\n#define idx_DC 48\n#define idx_DCC0 49\n#define idx_DD 50\n#define idx_DDC0 51\n#define idx_DE 52\n#define idx_DEC0 53\n#define idx_DF 54\n#define idx_DFC0 55\n#define idx_0F0F 56\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_operand.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"libdis.h\"\n#include \"ia32_insn.h\"\n#include \"ia32_operand.h\"\n#include \"ia32_modrm.h\"\n#include \"ia32_reg.h\"\n#include \"x86_imm.h\"\n#include \"x86_operand_list.h\"\n\n\n\n/* apply segment override to memory operand in insn */\nstatic void apply_seg( x86_op_t *op, unsigned int prefixes ) {\n\tif (! prefixes ) return;\n\n\t/* apply overrides from prefix */\n\tswitch ( prefixes & PREFIX_REG_MASK ) {\n\t\tcase PREFIX_CS:\n\t\t\top->flags |= op_cs_seg; break;\n\t\tcase PREFIX_SS:\n\t\t\top->flags |= op_ss_seg; break;\n\t\tcase PREFIX_DS:\n\t\t\top->flags |= op_ds_seg; break;\n\t\tcase PREFIX_ES:\n\t\t\top->flags |= op_es_seg; break;\n\t\tcase PREFIX_FS:\n\t\t\top->flags |= op_fs_seg; break;\n\t\tcase PREFIX_GS:\n\t\t\top->flags |= op_gs_seg; break;\n\t}\n\n\treturn;\n}\n\nstatic size_t decode_operand_value( unsigned char *buf, size_t buf_len,\n\t\t\t    x86_op_t *op, x86_insn_t *insn, \n\t\t\t    unsigned int addr_meth, size_t op_size, \n\t\t\t    unsigned int op_value, unsigned char modrm, \n\t\t\t    size_t gen_regs ) {\n\tsize_t size = 0;\n\n\t/* ++ Do Operand Addressing Method / Decode operand ++ */\n\tswitch (addr_meth) {\n\t\t/* This sets the operand Size based on the Intel Opcode Map\n\t\t * (Vol 2, Appendix A). Letter encodings are from section\n\t\t * A.1.1, 'Codes for Addressing Method' */\n\n\t\t/* ---------------------- Addressing Method -------------- */\n\t\t/* Note that decoding mod ModR/M operand adjusts the size of\n\t\t * the instruction, but decoding the reg operand does not. \n\t\t * This should not cause any problems, as every 'reg' operand \n\t\t * has an associated 'mod' operand. \n\t\t * Goddamn-Intel-Note:\n\t\t *   Some Intel addressing methods [M, R] specify that modR/M\n\t\t *   byte may only refer to a memory address/may only refer to\n\t\t *   a register -- however Intel provides no clues on what to do\n\t\t *   if, say, the modR/M for an M opcode decodes to a register\n\t\t *   rather than a memory address ... returning 0 is out of the\n\t\t *   question, as this would be an Immediate or a RelOffset, so\n\t\t *   instead these modR/Ms are decoded with total disregard to \n\t\t *   the M, R constraints. */\n\n\t\t/* MODRM -- mod operand. sets size to at least 1! */\n\t\tcase ADDRMETH_E:\t/* ModR/M present, Gen reg or memory  */\n\t\t\tsize = ia32_modrm_decode( buf, buf_len, op, insn, \n\t\t\t\t\t\t  gen_regs );\n\t\t\tbreak;\n\t\tcase ADDRMETH_M:\t/* ModR/M only refers to memory */\n\t\t\tsize = ia32_modrm_decode( buf, buf_len, op, insn, \n\t\t\t\t\t\t  gen_regs );\n\t\t\tbreak;\n\t\tcase ADDRMETH_Q:\t/* ModR/M present, MMX or Memory */\n\t\t\tsize = ia32_modrm_decode( buf, buf_len, op, insn, \n\t\t\t\t\t\t  REG_MMX_OFFSET );\n\t\t\tbreak;\n\t\tcase ADDRMETH_R:\t/* ModR/M mod == gen reg */\n\t\t\tsize = ia32_modrm_decode( buf, buf_len, op, insn, \n\t\t\t\t\t\t  gen_regs );\n\t\t\tbreak;\n\t\tcase ADDRMETH_W:\t/* ModR/M present, mem or SIMD reg */\n\t\t\tsize = ia32_modrm_decode( buf, buf_len, op, insn, \n\t\t\t\t\t\t  REG_SIMD_OFFSET );\n\t\t\tbreak;\n\n\t\t/* MODRM -- reg operand. does not effect size! */\n\t\tcase ADDRMETH_C:\t/* ModR/M reg == control reg */\n\t\t\tia32_reg_decode( modrm, op, REG_CTRL_OFFSET );\n\t\t\tbreak;\n\t\tcase ADDRMETH_D:\t/* ModR/M reg == debug reg */\n\t\t\tia32_reg_decode( modrm, op, REG_DEBUG_OFFSET );\n\t\t\tbreak;\n\t\tcase ADDRMETH_G:\t/* ModR/M reg == gen-purpose reg */\n\t\t\tia32_reg_decode( modrm, op, gen_regs );\n\t\t\tbreak;\n\t\tcase ADDRMETH_P:\t/* ModR/M reg == qword MMX reg */\n\t\t\tia32_reg_decode( modrm, op, REG_MMX_OFFSET );\n\t\t\tbreak;\n\t\tcase ADDRMETH_S:\t/* ModR/M reg == segment reg */\n\t\t\tia32_reg_decode( modrm, op, REG_SEG_OFFSET );\n\t\t\tbreak;\n\t\tcase ADDRMETH_T:\t/* ModR/M reg == test reg */\n\t\t\tia32_reg_decode( modrm, op, REG_TEST_OFFSET );\n\t\t\tbreak;\n\t\tcase ADDRMETH_V:\t/* ModR/M reg == SIMD reg */\n\t\t\tia32_reg_decode( modrm, op, REG_SIMD_OFFSET );\n\t\t\tbreak;\n\n\t\t/* No MODRM : note these set operand type explicitly */\n\t\tcase ADDRMETH_A:\t/* No modR/M -- direct addr */\n\t\t\top->type = op_absolute;\n\n\t\t\t/* segment:offset address used in far calls */\n\t\t\tx86_imm_sized( buf, buf_len, \n\t\t\t\t       &op->data.absolute.segment, 2 );\n\t\t\tif ( insn->addr_size == 4 ) {\n\t\t\t\tx86_imm_sized( buf, buf_len, \n\t\t\t\t    &op->data.absolute.offset.off32, 4 );\n\t\t\t\tsize = 6;\n\t\t\t} else {\n\t\t\t\tx86_imm_sized( buf, buf_len, \n\t\t\t\t    &op->data.absolute.offset.off16, 2 );\n\t\t\t\tsize = 4;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase ADDRMETH_I:\t/* Immediate val */\n\t\t\top->type = op_immediate;\n\t\t\t/* if it ever becomes legal to have imm as dest and\n\t\t\t * there is a src ModR/M operand, we are screwed! */\n\t\t\tif ( op->flags & op_signed ) {\n\t\t\t\tx86_imm_signsized(buf, buf_len, &op->data.byte, \n\t\t\t\t\t\top_size);\n\t\t\t} else {\n\t\t\t\tx86_imm_sized(buf, buf_len, &op->data.byte, \n\t\t\t\t\t\top_size);\n\t\t\t}\n\t\t\tsize = op_size;\n\t\t\tbreak;\n\t\tcase ADDRMETH_J:\t/* Rel offset to add to IP [jmp] */\n\t\t\t/* this fills op->data.near_offset or\n\t\t\t   op->data.far_offset depending on the size of\n\t\t\t   the operand */\n\t\t\top->flags |= op_signed;\n\t\t\tif ( op_size == 1 ) {\n\t\t\t\t/* one-byte near offset */\n\t\t\t\top->type = op_relative_near;\n\t\t\t\tx86_imm_signsized(buf, buf_len, \n\t\t\t\t\t\t&op->data.relative_near, 1);\n\t\t\t} else {\n\t\t\t\t/* far offset...is this truly signed? */\n\t\t\t\top->type = op_relative_far;\n\t\t\t\tx86_imm_signsized(buf, buf_len, \n\t\t\t\t\t&op->data.relative_far, op_size );\n\t\t\t}\n\t\t\tsize = op_size;\n\t\t\tbreak;\n\t\tcase ADDRMETH_O:\t/* No ModR/M; op is word/dword offset */\n\t\t\t/* NOTE: these are actually RVAs not offsets to seg!! */\n\t\t\t/* note bene: 'O' ADDR_METH uses addr_size  to\n\t\t\t   determine operand size */\n\t\t\top->type = op_offset;\n\t\t\top->flags |= op_pointer;\n\t\t\tx86_imm_sized( buf, buf_len, &op->data.offset, \n\t\t\t\t\tinsn->addr_size );\n\n\t\t\tsize = insn->addr_size;\n\t\t\tbreak;\n\n\t\t/* Hard-coded: these are specified in the insn definition */\n\t\tcase ADDRMETH_F:\t/* EFLAGS register */\n\t\t\top->type = op_register;\n\t\t\top->flags |= op_hardcode;\n\t\t\tia32_handle_register( &op->data.reg, REG_FLAGS_INDEX );\n\t\t\tbreak;\n\t\tcase ADDRMETH_X:\t/* Memory addressed by DS:SI [string] */\n\t\t\top->type = op_expression;\n\t\t\top->flags |= op_hardcode;\n\t\t\top->flags |= op_ds_seg | op_pointer | op_string;\n\t\t\tia32_handle_register( &op->data.expression.base, \n\t\t\t\t\t     REG_DWORD_OFFSET + 6 );\n\t\t\tbreak;\n\t\tcase ADDRMETH_Y:\t/* Memory addressed by ES:DI [string] */\n\t\t\top->type = op_expression;\n\t\t\top->flags |= op_hardcode;\n\t\t\top->flags |= op_es_seg | op_pointer | op_string;\n\t\t\tia32_handle_register( &op->data.expression.base, \n\t\t\t\t\t     REG_DWORD_OFFSET + 7 );\n\t\t\tbreak;\n\t\tcase ADDRMETH_RR:\t/* Gen Register hard-coded in opcode */\n\t\t\top->type = op_register;\n\t\t\top->flags |= op_hardcode;\n\t\t\tia32_handle_register( &op->data.reg, \n\t\t\t\t\t\top_value + gen_regs );\n\t\t\tbreak;\n\t\tcase ADDRMETH_RS:\t/* Seg Register hard-coded in opcode */\n\t\t\top->type = op_register;\n\t\t\top->flags |= op_hardcode;\n\t\t\tia32_handle_register( &op->data.reg, \n\t\t\t\t\t\top_value + REG_SEG_OFFSET );\n\t\t\tbreak;\n\t\tcase ADDRMETH_RF:\t/* FPU Register hard-coded in opcode */\n\t\t\top->type = op_register;\n\t\t\top->flags |= op_hardcode;\n\t\t\tia32_handle_register( &op->data.reg, \n\t\t\t\t\t\top_value + REG_FPU_OFFSET );\n\t\t\tbreak;\n\t\tcase ADDRMETH_RT:\t/* TST Register hard-coded in opcode */\n\t\t\top->type = op_register;\n\t\t\top->flags |= op_hardcode;\n\t\t\tia32_handle_register( &op->data.reg, \n\t\t\t\t\t\top_value + REG_TEST_OFFSET );\n\t\t\tbreak;\n\t\tcase ADDRMETH_II:\t/* Immediate hard-coded in opcode */\n\t\t\top->type = op_immediate;\n\t\t\top->data.dword = op_value;\n\t\t\top->flags |= op_hardcode;\n\t\t\tbreak;\n\n\t\tcase 0:\t/* Operand is not used */\n\t\tdefault:\n\t\t\t/* ignore -- operand not used in this insn */\n\t\t\top->type = op_unused;\t/* this shouldn't happen! */\n\t\t\tbreak;\n\t}\n\n\treturn size;\n}\n\nstatic size_t decode_operand_size( unsigned int op_type, x86_insn_t *insn, \n\t\t\t\t   x86_op_t *op ){\n\tsize_t size;\n\n\t/* ++ Do Operand Type ++ */\n\tswitch (op_type) {\n\t\t/* This sets the operand Size based on the Intel Opcode Map\n\t\t * (Vol 2, Appendix A). Letter encodings are from section\n\t\t * A.1.2, 'Codes for Operand Type' */\n\t\t/* NOTE: in this routines, 'size' refers to the size\n\t\t *       of the operand in the raw (encoded) instruction;\n\t\t *       'datatype' stores the actual size and datatype\n\t\t *       of the operand */\n\n\t\t/* ------------------------ Operand Type ----------------- */\n\t\tcase OPTYPE_c:\t/* byte or word [op size attr] */\n\t\t\tsize = (insn->op_size == 4) ? 2 : 1;\n\t\t\top->datatype = (size == 4) ? op_word : op_byte;\n\t\t\tbreak;\n\t\tcase OPTYPE_a:\t/* 2 word or 2 dword [op size attr] */\n\t\t\t/* pointer to a 16:16 or 32:32 BOUNDS operand */\n\t\t\tsize = (insn->op_size == 4) ? 8 : 4;\n\t\t\top->datatype = (size == 4) ? op_bounds32 : op_bounds16;\n\t\t\tbreak;\n\t\tcase OPTYPE_v:\t/* word or dword [op size attr] */\n\t\t\tsize = (insn->op_size == 4) ? 4 : 2;\n\t\t\top->datatype = (size == 4) ? op_dword : op_word;\n\t\t\tbreak;\n\t\tcase OPTYPE_p:\t/* 32/48-bit ptr [op size attr] */\n\t\t\t/* technically these flags are not accurate: the\n\t\t\t * value s a 16:16 pointer or a 16:32 pointer, where\n\t\t\t * the first '16' is a segment */\n\t\t\tsize = (insn->addr_size == 4) ? 6 : 4;\n\t\t\top->datatype = (size == 4) ? op_descr32 : op_descr16;\n\t\t\tbreak;\n\t\tcase OPTYPE_b:\t/* byte, ignore op-size */\n\t\t\tsize = 1;\n\t\t\top->datatype = op_byte;\n\t\t\tbreak;\n\t\tcase OPTYPE_w:\t/* word, ignore op-size */\n\t\t\tsize = 2;\n\t\t\top->datatype = op_word;\n\t\t\tbreak;\n\t\tcase OPTYPE_d:\t/* dword , ignore op-size */\n\t\t\tsize = 4;\n\t\t\top->datatype = op_dword;\n\t\t\tbreak;\n\t\tcase OPTYPE_s:\t/* 6-byte psuedo-descriptor */\n\t\t\t/* ptr to 6-byte value which is 32:16 in 32-bit\n\t\t\t * mode, or 8:24:16 in 16-bit mode. The high byte\n\t\t\t * is ignored in 16-bit mode. */\n\t\t\tsize = 6;\n\t\t\top->datatype = (insn->addr_size == 4) ? \n\t\t\t\top_pdescr32 : op_pdescr16;\n\t\t\tbreak;\n\t\tcase OPTYPE_q:\t/* qword, ignore op-size */\n\t\t\tsize = 8;\n\t\t\top->datatype = op_qword;\n\t\t\tbreak;\n\t\tcase OPTYPE_dq:\t/* d-qword, ignore op-size */\n\t\t\tsize = 16;\n\t\t\top->datatype = op_dqword;\n\t\t\tbreak;\n\t\tcase OPTYPE_ps:\t/* 128-bit FP data */\n\t\t\tsize = 16;\n\t\t\t/* really this is 4 packed SP FP values */\n\t\t\top->datatype = op_ssimd;\n\t\t\tbreak;\n\t\tcase OPTYPE_pd:\t/* 128-bit FP data */\n\t\t\tsize = 16;\n\t\t\t/* really this is 2 packed DP FP values */\n\t\t\top->datatype = op_dsimd;\n\t\t\tbreak;\n\t\tcase OPTYPE_ss:\t/* Scalar elem of 128-bit FP data */\n\t\t\tsize = 16;\n\t\t\t/* this only looks at the low dword (4 bytes)\n\t\t\t * of the xmmm register passed as a param. \n\t\t\t * This is a 16-byte register where only 4 bytes\n\t\t\t * are used in the insn. Painful, ain't it? */\n\t\t\top->datatype = op_sssimd;\n\t\t\tbreak;\n\t\tcase OPTYPE_sd:\t/* Scalar elem of 128-bit FP data */\n\t\t\tsize = 16;\n\t\t\t/* this only looks at the low qword (8 bytes)\n\t\t\t * of the xmmm register passed as a param. \n\t\t\t * This is a 16-byte register where only 8 bytes\n\t\t\t * are used in the insn. Painful, again... */\n\t\t\top->datatype = op_sdsimd;\n\t\t\tbreak;\n\t\tcase OPTYPE_pi:\t/* qword mmx register */\n\t\t\tsize = 8;\n\t\t\top->datatype = op_qword;\n\t\t\tbreak;\n\t\tcase OPTYPE_si:\t/* dword integer register */\n\t\t\tsize = 4;\n\t\t\top->datatype = op_dword;\n\t\t\tbreak;\n\t\tcase OPTYPE_fs:\t/* single-real */\n\t\t\tsize = 4;\n\t\t\top->datatype = op_sreal;\n\t\t\tbreak;\n\t\tcase OPTYPE_fd:\t/* double real */\n\t\t\tsize = 8;\n\t\t\top->datatype = op_dreal;\n\t\t\tbreak;\n\t\tcase OPTYPE_fe:\t/* extended real */\n\t\t\tsize = 10;\n\t\t\top->datatype = op_extreal;\n\t\t\tbreak;\n\t\tcase OPTYPE_fb:\t/* packed BCD */\n\t\t\tsize = 10;\n\t\t\top->datatype = op_bcd;\n\t\t\tbreak;\n\t\tcase OPTYPE_fv:\t/* pointer to FPU env: 14 or 28-bytes */\n\t\t\tsize = (insn->addr_size == 4)? 28 : 14;\n\t\t\top->datatype = (size == 28)?  op_fpuenv32: op_fpuenv16;\n\t\t\tbreak;\n\t\tcase OPTYPE_ft:\t/* pointer to FPU env: 94 or 108 bytes */\n\t\t\tsize = (insn->addr_size == 4)? 108 : 94;\n\t\t\top->datatype = (size == 108)? \n\t\t\t\top_fpustate32: op_fpustate16;\n\t\t\tbreak;\n\t\tcase OPTYPE_fx:\t/* 512-byte register stack */\n\t\t\tsize = 512;\n\t\t\top->datatype = op_fpregset;\n\t\t\tbreak;\n\t\tcase OPTYPE_fp:\t/* floating point register */\n\t\t\tsize = 10;\t/* double extended precision */\n\t\t\top->datatype = op_fpreg;\n\t\t\tbreak;\n\t\tcase OPTYPE_m:\t/* fake operand type used for \"lea Gv, M\" */\n\t\t\tsize = insn->addr_size;\n\t\t\top->datatype = (size == 4) ?  op_dword : op_word;\n\t\t\tbreak;\n\t\tcase OPTYPE_none: /* handle weird instructions that have no encoding but use a dword datatype, like invlpg */\n\t\t\tsize = 0;\n\t\t\top->datatype = op_none;\n\t\t\tbreak;\n\t\tcase 0:\n\t\tdefault:\n\t\t\tsize = insn->op_size;\n\t\t\top->datatype = (size == 4) ? op_dword : op_word;\n\t\t\tbreak;\n\t\t}\n\treturn size;\n}\n\nsize_t ia32_decode_operand( unsigned char *buf, size_t buf_len,\n\t\t\t      x86_insn_t *insn, unsigned int raw_op, \n\t\t\t      unsigned int raw_flags, unsigned int prefixes, \n\t\t\t      unsigned char modrm ) {\n\tunsigned int addr_meth, op_type, op_size, gen_regs;\n\tx86_op_t *op;\n\tsize_t size;\n\n\t/* ++ Yank optype and addr mode out of operand flags */\n\taddr_meth = raw_flags & ADDRMETH_MASK;\n\top_type = raw_flags & OPTYPE_MASK;\n\n\tif ( raw_flags == ARG_NONE ) {\n\t\t/* operand is not used in this instruction */\n\t\treturn 0;\n\t}\n\n\t/* allocate a new operand */\n\top = x86_operand_new( insn );\n\n\t/* ++ Copy flags from opcode table to x86_insn_t */\n\top->access = (enum x86_op_access) OP_PERM(raw_flags);\n\top->flags = (enum x86_op_flags) (OP_FLAGS(raw_flags) >> 12);\n\n\t/* Get size (for decoding)  and datatype of operand */\n\top_size = decode_operand_size(op_type, insn, op);\n\n\t/* override default register set based on Operand Type */\n\t/* this allows mixing of 8, 16, and 32 bit regs in insn */\n\tif (op_size == 1) {\n\t\tgen_regs = REG_BYTE_OFFSET;\n\t} else if (op_size == 2) {\n\t\tgen_regs = REG_WORD_OFFSET;\n\t} else {\n\t\tgen_regs = REG_DWORD_OFFSET;\n\t}\n\n\tsize = decode_operand_value( buf, buf_len, op, insn, addr_meth, \n\t\t\t\t      op_size, raw_op, modrm, gen_regs );\n\n\t/* if operand is an address, apply any segment override prefixes */\n\tif ( op->type == op_expression || op->type == op_offset ) {\n\t\tapply_seg(op, prefixes);\n\t}\n\n\treturn size;\t\t/* return number of bytes in instruction */\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_operand.h",
    "content": "#ifndef IA32_OPERAND_H\n#define IA32_OPERAND_H\n\n#include \"libdis.h\"\n#include \"ia32_insn.h\"\n\nsize_t ia32_decode_operand( unsigned char *buf, size_t buf_len,\n\t\t\t      x86_insn_t *insn, unsigned int raw_op, \n\t\t\t      unsigned int raw_flags, unsigned int prefixes,\n\t\t\t      unsigned char modrm );\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_reg.c",
    "content": "#include <stdlib.h>\n#include <string.h>\n\n#include \"ia32_reg.h\"\n#include \"ia32_insn.h\"\n\n#define NUM_X86_REGS\t92\n\n/* register sizes */\n#define REG_DWORD_SIZE 4\n#define REG_WORD_SIZE 2\n#define REG_BYTE_SIZE 1\n#define REG_MMX_SIZE 8\n#define REG_SIMD_SIZE 16\n#define REG_DEBUG_SIZE 4\n#define REG_CTRL_SIZE 4\n#define REG_TEST_SIZE 4\n#define REG_SEG_SIZE 2\n#define REG_FPU_SIZE 10\n#define REG_FLAGS_SIZE 4\n#define REG_FPCTRL_SIZE 2\n#define REG_FPSTATUS_SIZE 2\n#define REG_FPTAG_SIZE 2\n#define REG_EIP_SIZE 4\n#define REG_IP_SIZE 2\n\n/* REGISTER ALIAS TABLE:\n *\n * NOTE: the MMX register mapping is fixed to the physical registers\n * used by the FPU. The floating FP stack does not effect the location\n * of the MMX registers, so this aliasing is not 100% accurate.\n * */\nstatic struct {\n\tunsigned char alias;\t/* id of register this is an alias for */\n\tunsigned char shift;\t/* # of bits register must be shifted */\n} ia32_reg_aliases[] = {\n\t{ 0,0 },\n\t{ REG_DWORD_OFFSET,\t0 }, \t/* al :  1 */\n\t{ REG_DWORD_OFFSET,\t8 }, \t/* ah :  2 */\n\t{ REG_DWORD_OFFSET,\t0 }, \t/* ax :  3 */\n\t{ REG_DWORD_OFFSET + 1,\t0 }, \t/* cl :  4 */\n\t{ REG_DWORD_OFFSET + 1,\t8 }, \t/* ch :  5 */\n\t{ REG_DWORD_OFFSET + 1,\t0 }, \t/* cx :  6 */\n\t{ REG_DWORD_OFFSET + 2,\t0 }, \t/* dl :  7 */\n\t{ REG_DWORD_OFFSET + 2,\t8 }, \t/* dh :  8 */\n\t{ REG_DWORD_OFFSET + 2,\t0 }, \t/* dx :  9 */\n\t{ REG_DWORD_OFFSET + 3,\t0 }, \t/* bl : 10 */\n\t{ REG_DWORD_OFFSET + 3,\t8 }, \t/* bh : 11 */\n\t{ REG_DWORD_OFFSET + 3,\t0 }, \t/* bx : 12 */\n\t{ REG_DWORD_OFFSET + 4,\t0 }, \t/* sp : 13 */\n\t{ REG_DWORD_OFFSET + 5,\t0 }, \t/* bp : 14 */\n\t{ REG_DWORD_OFFSET + 6,\t0 }, \t/* si : 15 */\n\t{ REG_DWORD_OFFSET + 7,\t0 }, \t/* di : 16 */\n\t{ REG_EIP_INDEX,\t0 }, \t/* ip : 17 */\n\t{ REG_FPU_OFFSET,\t0 }, \t/* mm0 : 18 */\n\t{ REG_FPU_OFFSET + 1,\t0 }, \t/* mm1 : 19 */\n\t{ REG_FPU_OFFSET + 2,\t0 }, \t/* mm2 : 20 */\n\t{ REG_FPU_OFFSET + 3,\t0 }, \t/* mm3 : 21 */\n\t{ REG_FPU_OFFSET + 4,\t0 }, \t/* mm4 : 22 */\n\t{ REG_FPU_OFFSET + 5,\t0 }, \t/* mm5 : 23 */\n\t{ REG_FPU_OFFSET + 6,\t0 }, \t/* mm6 : 24 */\n\t{ REG_FPU_OFFSET + 7,\t0 } \t/* mm7 : 25 */\n };\n\n/* REGISTER TABLE: size, type, and name of every register in the \n *                 CPU. Does not include MSRs since the are, after all,\n *                 model specific. */\nstatic struct {\n\tunsigned int size;\n\tenum x86_reg_type type;\n\tunsigned int alias;\n\tchar mnemonic[8];\n} ia32_reg_table[NUM_X86_REGS + 2] = {\n\t{ 0, 0, 0, \"\" },\n\t/* REG_DWORD_OFFSET */\n\t{ REG_DWORD_SIZE, reg_gen | reg_ret, 0, \"eax\" },\n\t{ REG_DWORD_SIZE, reg_gen | reg_count, 0, \"ecx\" },\n\t{ REG_DWORD_SIZE, reg_gen, 0, \"edx\" },\n\t{ REG_DWORD_SIZE, reg_gen, 0, \"ebx\" },\n\t/* REG_ESP_INDEX */\n\t{ REG_DWORD_SIZE, reg_gen | reg_sp, 0, \"esp\" },\n\t{ REG_DWORD_SIZE, reg_gen | reg_fp, 0, \"ebp\" },\n\t{ REG_DWORD_SIZE, reg_gen | reg_src, 0, \"esi\" },\n\t{ REG_DWORD_SIZE, reg_gen | reg_dest, 0, \"edi\" },\n\t/* REG_WORD_OFFSET */\n\t{ REG_WORD_SIZE, reg_gen | reg_ret, 3, \"ax\" },\n\t{ REG_WORD_SIZE, reg_gen | reg_count, 6, \"cx\" },\n\t{ REG_WORD_SIZE, reg_gen, 9, \"dx\" },\n\t{ REG_WORD_SIZE, reg_gen, 12, \"bx\" },\n\t{ REG_WORD_SIZE, reg_gen | reg_sp, 13, \"sp\" },\n\t{ REG_WORD_SIZE, reg_gen | reg_fp, 14, \"bp\" },\n\t{ REG_WORD_SIZE, reg_gen | reg_src, 15, \"si\" },\n\t{ REG_WORD_SIZE, reg_gen | reg_dest, 16, \"di\" },\n\t/* REG_BYTE_OFFSET */\n\t{ REG_BYTE_SIZE, reg_gen, 1, \"al\" },\n\t{ REG_BYTE_SIZE, reg_gen, 4, \"cl\" },\n\t{ REG_BYTE_SIZE, reg_gen, 7, \"dl\" },\n\t{ REG_BYTE_SIZE, reg_gen, 10, \"bl\" },\n\t{ REG_BYTE_SIZE, reg_gen, 2, \"ah\" },\n\t{ REG_BYTE_SIZE, reg_gen, 5, \"ch\" },\n\t{ REG_BYTE_SIZE, reg_gen, 8, \"dh\" },\n\t{ REG_BYTE_SIZE, reg_gen, 11, \"bh\" },\n\t/* REG_MMX_OFFSET */\n\t{ REG_MMX_SIZE, reg_simd, 18, \"mm0\" },\n\t{ REG_MMX_SIZE, reg_simd, 19, \"mm1\" },\n\t{ REG_MMX_SIZE, reg_simd, 20, \"mm2\" },\n\t{ REG_MMX_SIZE, reg_simd, 21, \"mm3\" },\n\t{ REG_MMX_SIZE, reg_simd, 22, \"mm4\" },\n\t{ REG_MMX_SIZE, reg_simd, 23, \"mm5\" },\n\t{ REG_MMX_SIZE, reg_simd, 24, \"mm6\" },\n\t{ REG_MMX_SIZE, reg_simd, 25, \"mm7\" },\n\t/* REG_SIMD_OFFSET */\n\t{ REG_SIMD_SIZE, reg_simd, 0, \"xmm0\" },\n\t{ REG_SIMD_SIZE, reg_simd, 0, \"xmm1\" },\n\t{ REG_SIMD_SIZE, reg_simd, 0, \"xmm2\" },\n\t{ REG_SIMD_SIZE, reg_simd, 0, \"xmm3\" },\n\t{ REG_SIMD_SIZE, reg_simd, 0, \"xmm4\" },\n\t{ REG_SIMD_SIZE, reg_simd, 0, \"xmm5\" },\n\t{ REG_SIMD_SIZE, reg_simd, 0, \"xmm6\" },\n\t{ REG_SIMD_SIZE, reg_simd, 0, \"xmm7\" },\n\t/* REG_DEBUG_OFFSET */\n\t{ REG_DEBUG_SIZE, reg_sys, 0, \"dr0\" },\n\t{ REG_DEBUG_SIZE, reg_sys, 0, \"dr1\" },\n\t{ REG_DEBUG_SIZE, reg_sys, 0, \"dr2\" },\n\t{ REG_DEBUG_SIZE, reg_sys, 0, \"dr3\" },\n\t{ REG_DEBUG_SIZE, reg_sys, 0, \"dr4\" },\n\t{ REG_DEBUG_SIZE, reg_sys, 0, \"dr5\" },\n\t{ REG_DEBUG_SIZE, reg_sys, 0, \"dr6\" },\n\t{ REG_DEBUG_SIZE, reg_sys, 0, \"dr7\" },\n\t/* REG_CTRL_OFFSET */\n\t{ REG_CTRL_SIZE, reg_sys, 0, \"cr0\" },\n\t{ REG_CTRL_SIZE, reg_sys, 0, \"cr1\" },\n\t{ REG_CTRL_SIZE, reg_sys, 0, \"cr2\" },\n\t{ REG_CTRL_SIZE, reg_sys, 0, \"cr3\" },\n\t{ REG_CTRL_SIZE, reg_sys, 0, \"cr4\" },\n\t{ REG_CTRL_SIZE, reg_sys, 0, \"cr5\" },\n\t{ REG_CTRL_SIZE, reg_sys, 0, \"cr6\" },\n\t{ REG_CTRL_SIZE, reg_sys, 0, \"cr7\" },\n\t/* REG_TEST_OFFSET */\n\t{ REG_TEST_SIZE, reg_sys, 0, \"tr0\" },\n\t{ REG_TEST_SIZE, reg_sys, 0, \"tr1\" },\n\t{ REG_TEST_SIZE, reg_sys, 0, \"tr2\" },\n\t{ REG_TEST_SIZE, reg_sys, 0, \"tr3\" },\n\t{ REG_TEST_SIZE, reg_sys, 0, \"tr4\" },\n\t{ REG_TEST_SIZE, reg_sys, 0, \"tr5\" },\n\t{ REG_TEST_SIZE, reg_sys, 0, \"tr6\" },\n\t{ REG_TEST_SIZE, reg_sys, 0, \"tr7\" },\n\t/* REG_SEG_OFFSET */\n\t{ REG_SEG_SIZE, reg_seg, 0, \"es\" },\n\t{ REG_SEG_SIZE, reg_seg, 0, \"cs\" },\n\t{ REG_SEG_SIZE, reg_seg, 0, \"ss\" },\n\t{ REG_SEG_SIZE, reg_seg, 0, \"ds\" },\n\t{ REG_SEG_SIZE, reg_seg, 0, \"fs\" },\n\t{ REG_SEG_SIZE, reg_seg, 0, \"gs\" },\n\t/* REG_LDTR_INDEX */\n\t{ REG_DWORD_SIZE, reg_sys, 0, \"ldtr\" },\n\t/* REG_GDTR_INDEX */\n\t{ REG_DWORD_SIZE, reg_sys, 0, \"gdtr\" },\n\t/* REG_FPU_OFFSET */\n\t{ REG_FPU_SIZE, reg_fpu, 0, \"st(0)\" },\n\t{ REG_FPU_SIZE, reg_fpu, 0, \"st(1)\" },\n\t{ REG_FPU_SIZE, reg_fpu, 0, \"st(2)\" },\n\t{ REG_FPU_SIZE, reg_fpu, 0, \"st(3)\" },\n\t{ REG_FPU_SIZE, reg_fpu, 0, \"st(4)\" },\n\t{ REG_FPU_SIZE, reg_fpu, 0, \"st(5)\" },\n\t{ REG_FPU_SIZE, reg_fpu, 0, \"st(6)\" },\n\t{ REG_FPU_SIZE, reg_fpu, 0, \"st(7)\" },\n\t/* REG_FLAGS_INDEX : 81 */\n\t{ REG_FLAGS_SIZE, reg_cond, 0, \"eflags\" }, \n\t/* REG_FPCTRL_INDEX  : 82*/\n\t{ REG_FPCTRL_SIZE, reg_fpu | reg_sys, 0, \"fpctrl\" }, \n\t/* REG_FPSTATUS_INDEX : 83*/\n\t{ REG_FPSTATUS_SIZE, reg_fpu | reg_sys, 0, \"fpstat\" },\n\t/* REG_FPTAG_INDEX : 84 */\n\t{ REG_FPTAG_SIZE, reg_fpu | reg_sys, 0, \"fptag\" }, \n\t/* REG_EIP_INDEX : 85 */\n\t{ REG_EIP_SIZE, reg_pc, 0, \"eip\" },\n\t/* REG_IP_INDEX : 86 */\n\t{ REG_IP_SIZE, reg_pc, 17, \"ip\" },\n\t/* REG_IDTR_INDEX : 87 */\n\t{ REG_DWORD_SIZE, reg_sys, 0, \"idtr\" },\n\t/* REG_MXCSG_INDEX : SSE Control Reg : 88 */\n\t{ REG_DWORD_SIZE, reg_sys | reg_simd, 0, \"mxcsr\" },\n\t/* REG_TR_INDEX : Task Register : 89 */\n\t{ 16 + 64, reg_sys, 0, \"tr\" },\n\t/* REG_CSMSR_INDEX : SYSENTER_CS_MSR : 90 */\n\t{ REG_DWORD_SIZE, reg_sys, 0, \"cs_msr\" },\n\t/* REG_ESPMSR_INDEX : SYSENTER_ESP_MSR : 91 */\n\t{ REG_DWORD_SIZE, reg_sys, 0, \"esp_msr\" },\n\t/* REG_EIPMSR_INDEX : SYSENTER_EIP_MSR : 92 */\n\t{ REG_DWORD_SIZE, reg_sys, 0, \"eip_msr\" },\n\t{ 0 }\n };\n\n\nstatic size_t sz_regtable = NUM_X86_REGS + 1;\n\n\nvoid ia32_handle_register( x86_reg_t *reg, size_t id ) {\n\tunsigned int alias;\n\tif (! id || id > sz_regtable ) {\n\t\treturn;\n\t}\n\n\tmemset( reg, 0, sizeof(x86_reg_t) );\n\n        strncpy( reg->name, ia32_reg_table[id].mnemonic, MAX_REGNAME );\n\n        reg->type = ia32_reg_table[id].type;\n        reg->size = ia32_reg_table[id].size;\n\n\talias = ia32_reg_table[id].alias;\n\tif ( alias ) {\n\t\treg->alias = ia32_reg_aliases[alias].alias;\n\t\treg->shift = ia32_reg_aliases[alias].shift;\n\t}\n        reg->id = id;\n\n\treturn;\n}\n\nsize_t ia32_true_register_id( size_t id ) {\n\tsize_t reg;\n\n\tif (! id || id > sz_regtable ) {\n\t\treturn 0;\n\t}\n\n\treg = id;\n\tif (ia32_reg_table[reg].alias) {\n\t\treg = ia32_reg_aliases[ia32_reg_table[reg].alias].alias;\n\t}\n\treturn reg;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_reg.h",
    "content": "#ifndef IA32_REG_H\n#define IA32_REG_H\n\n#include <sys/types.h>\t/* for size_t */\n#include \"libdis.h\"\t/* for x86_reg_t */\n\n/* NOTE these are used in opcode tables for hard-coded registers */\n#define REG_DWORD_OFFSET \t 1\t/* 0 + 1 */\n#define REG_ECX_INDEX\t\t 2\t/* 0 + 1 + 1 */\n#define REG_ESP_INDEX\t\t 5\t/* 0 + 4 + 1 */\n#define REG_EBP_INDEX\t\t 6\t/* 0 + 5 + 1 */\n#define REG_ESI_INDEX\t\t 7\t/* 0 + 6 + 1 */\n#define REG_EDI_INDEX\t\t 8\t/* 0 + 7 + 1 */\n#define REG_WORD_OFFSET \t 9\t/* 1 * 8 + 1 */\n#define REG_BYTE_OFFSET \t17\t/* 2 * 8 + 1 */\n#define REG_MMX_OFFSET \t\t25\t/* 3 * 8 + 1 */\n#define REG_SIMD_OFFSET \t33\t/* 4 * 8 + 1 */\n#define REG_DEBUG_OFFSET \t41\t/* 5 * 8 + 1 */\n#define REG_CTRL_OFFSET \t49\t/* 6 * 8 + 1 */\n#define REG_TEST_OFFSET \t57\t/* 7 * 8 + 1 */\n#define REG_SEG_OFFSET \t\t65\t/* 8 * 8 + 1 */\n#define REG_LDTR_INDEX\t\t71\t/* 8 * 8 + 1 + 1 */\n#define REG_GDTR_INDEX\t\t72\t/* 8 * 8 + 2 + 1 */\n#define REG_FPU_OFFSET \t\t73\t/* 9 * 8 + 1 */\n#define REG_FLAGS_INDEX \t81\t/* 10 * 8 + 1 */\n#define REG_FPCTRL_INDEX \t82\t/* 10 * 8 + 1 + 1 */\n#define REG_FPSTATUS_INDEX \t83\t/* 10 * 8 + 2 + 1 */\n#define REG_FPTAG_INDEX \t84\t/* 10 * 8 + 3 + 1 */\n#define REG_EIP_INDEX \t\t85\t/* 10 * 8 + 4 + 1 */\n#define REG_IP_INDEX \t\t86\t/* 10 * 8 + 5 + 1 */\n#define REG_IDTR_INDEX\t\t87\t/* 10 * 8 + 6 + 1 */\n#define REG_MXCSG_INDEX\t\t88\t/* 10 * 8 + 7 + 1 */\n#define REG_TR_INDEX\t\t89\t/* 10 * 8 + 8 + 1 */\n#define REG_CSMSR_INDEX\t\t90\t/* 10 * 8 + 9 + 1 */\n#define REG_ESPMSR_INDEX\t91\t/* 10 * 8 + 10 + 1 */\n#define REG_EIPMSR_INDEX\t92\t/* 10 * 8 + 11 + 1 */\n\nvoid ia32_handle_register( x86_reg_t *reg, size_t id );\nsize_t ia32_true_register_id( size_t id );\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_settings.c",
    "content": "#include \"libdis.h\"\n#include \"ia32_settings.h\"\n#include \"ia32_reg.h\"\n#include \"ia32_insn.h\"\n\nia32_settings_t ia32_settings = {\n\t1, 0xF4, \n\tMAX_INSTRUCTION_SIZE,\n\t4, 4, 8, 4, 8,\n\tREG_ESP_INDEX, REG_EBP_INDEX, REG_EIP_INDEX, REG_FLAGS_INDEX,\n\tREG_DWORD_OFFSET, REG_SEG_OFFSET, REG_FPU_OFFSET,\n\topt_none\n};\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/ia32_settings.h",
    "content": "#ifndef IA32_SETTINGS_H\n#define IA32_SETTINGS_H\n\n#include \"libdis.h\"\n\ntypedef struct {\n\t/* options */\n\tunsigned char endian,\t\t/* 0 = big, 1 = little */\n\t\t      wc_byte,\t\t/* wildcard byte */\n\t\t      max_insn,\t\t/* max insn size */\n\t\t      sz_addr,\t\t/* default address size */\n\t\t      sz_oper,\t\t/* default operand size */\n\t\t      sz_byte,\t\t/* # bits in byte */\n\t\t      sz_word,\t\t/* # bytes in machine word */\n\t\t      sz_dword;\t\t/* # bytes in machine dword */\n\tunsigned int id_sp_reg,\t\t/* id of stack pointer */\n\t\t     id_fp_reg,\t\t/* id of frame pointer */\n\t\t     id_ip_reg,\t\t/* id of instruction pointer */\n\t\t     id_flag_reg,\t/* id of flags register */\n\t\t     offset_gen_regs,\t/* start of general regs */\n\t\t     offset_seg_regs,\t/* start of segment regs */\n\t\t     offset_fpu_regs;\t/* start of floating point regs */\n\t/* user-controlled settings */\n\tenum x86_options options;\n} ia32_settings_t;\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/libdis.h",
    "content": "#ifndef LIBDISASM_H\n#define LIBDISASM_H\n\n#ifdef WIN32\n#include <windows.h>\n#endif\n\n#include <stdint.h>\n\n/* 'NEW\" types\n * __________________________________________________________________________*/\n#ifndef LIBDISASM_QWORD_H       /* do not interfere with qword.h */\n        #define LIBDISASM_QWORD_H\n        #ifdef _MSC_VER\n                typedef __int64         qword_t;\n        #else\n                typedef int64_t         qword_t;\n        #endif\n#endif\n\n#include <sys/types.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* 'NEW\" x86 API\n * __________________________________________________________________________*/\n\n\n/* ========================================= Error Reporting */\n/* REPORT CODES\n *      These are passed to a reporter function passed at initialization.\n *      Each code determines the type of the argument passed to the reporter;\n *      this allows the report to recover from errors, or just log them.\n */\nenum x86_report_codes {\n        report_disasm_bounds,   /* RVA OUT OF BOUNDS : The disassembler could\n                                   not disassemble the supplied RVA as it is\n                                   out of the range of the buffer. The\n                                   application should store the address and\n                                   attempt to determine what section of the\n                                   binary it is in, then disassemble the\n                                   address from the bytes in that section.\n                                        data: uint32_t rva */\n        report_insn_bounds,     /* INSTRUCTION OUT OF BOUNDS: The disassembler\n                                   could not disassemble the instruction as\n                                   the instruction would require bytes beyond\n                                   the end of the current buffer. This usually\n                                   indicated garbage bytes at the end of a\n                                   buffer, or an incorrectly-sized buffer.\n                                        data: uint32_t rva */\n        report_invalid_insn,    /* INVALID INSTRUCTION: The disassembler could\n                                   not disassemble the instruction as it has an\n                                   invalid combination of opcodes and operands.\n                                   This will stop automated disassembly; the\n                                   application can restart the disassembly\n                                   after the invalid instruction.\n                                        data: uint32_t rva */\n        report_unknown\n};\n\n/* 'arg' is optional arbitrary data provided by the code passing the \n *       callback -- for example, it could be 'this' or 'self' in OOP code.\n * 'code' is provided by libdisasm, it is one of the above\n * 'data' is provided by libdisasm and is context-specific, per the enums */\ntypedef void (*DISASM_REPORTER)( enum x86_report_codes code, \n\t\t\t\t void *data, void *arg );\n\n\n/* x86_report_error : Call the register reporter to report an error */\nvoid x86_report_error( enum x86_report_codes code, void *data );\n\n/* ========================================= Libdisasm Management Routines */\nenum x86_options {\t\t/* these can be ORed together */\n        opt_none= 0,\n        opt_ignore_nulls=1,     /* ignore sequences of > 4 NULL bytes */\n        opt_16_bit=2,           /* 16-bit/DOS disassembly */\n        opt_att_mnemonics=4,    /* use AT&T syntax names for alternate opcode mnemonics */\n};\n\n/* management routines */\n/* 'arg' is caller-specific data which is passed as the first argument\n * to the reporter callback routine */\nint x86_init( enum x86_options options, DISASM_REPORTER reporter, void *arg);\nvoid x86_set_reporter( DISASM_REPORTER reporter, void *arg);\nvoid x86_set_options( enum x86_options options );\nenum x86_options x86_get_options( void );\nint x86_cleanup(void);\n\n\n/* ========================================= Instruction Representation */\n/* these defines are only intended for use in the array decl's */\n#define MAX_REGNAME 8\n\n#define MAX_PREFIX_STR 32\n#define MAX_MNEM_STR 16\n#define MAX_INSN_SIZE 20        /* same as in i386.h */\n#define MAX_OP_STRING 32        /* max possible operand size in string form */\n#define MAX_OP_RAW_STRING 64    /* max possible operand size in raw form */\n#define MAX_OP_XML_STRING 256   /* max possible operand size in xml form */\n#define MAX_NUM_OPERANDS 8\t/* max # implicit and explicit operands */\n/* in these, the '2 *' is arbitrary: the max # of operands should require\n * more space than the rest of the insn */\n#define MAX_INSN_STRING 512        /* 2 * 8 * MAX_OP_STRING */\n#define MAX_INSN_RAW_STRING 1024   /* 2 * 8 * MAX_OP_RAW_STRING */\n#define MAX_INSN_XML_STRING 4096   /* 2 * 8 * MAX_OP_XML_STRING */\n\nenum x86_reg_type {     /* NOTE: these may be ORed together */\n        reg_gen         = 0x00001,      /* general purpose */\n        reg_in          = 0x00002,      /* incoming args, ala RISC */\n        reg_out         = 0x00004,      /* args to calls, ala RISC */\n        reg_local       = 0x00008,      /* local vars, ala RISC */\n        reg_fpu         = 0x00010,      /* FPU data register */\n        reg_seg         = 0x00020,      /* segment register */\n        reg_simd        = 0x00040,      /* SIMD/MMX reg */\n        reg_sys         = 0x00080,      /* restricted/system register */\n        reg_sp          = 0x00100,      /* stack pointer */\n        reg_fp          = 0x00200,      /* frame pointer */\n        reg_pc          = 0x00400,      /* program counter */\n        reg_retaddr     = 0x00800,      /* return addr for func */\n        reg_cond        = 0x01000,      /* condition code / flags */\n        reg_zero        = 0x02000,      /* zero register, ala RISC */\n        reg_ret         = 0x04000,      /* return value */\n        reg_src         = 0x10000,      /* array/rep source */\n        reg_dest        = 0x20000,      /* array/rep destination */\n        reg_count       = 0x40000       /* array/rep/loop counter */\n};\n\n/* x86_reg_t : an X86 CPU register */\ntypedef struct {\n        char name[MAX_REGNAME];\n        enum x86_reg_type type;         /* what register is used for */\n        unsigned int size;              /* size of register in bytes */\n        unsigned int id;                /* register ID #, for quick compares */\n\tunsigned int alias;\t\t/* ID of reg this is an alias for */\n\tunsigned int shift;\t\t/* amount to shift aliased reg by */\n} x86_reg_t;\n\n/* x86_ea_t : an X86 effective address (address expression) */\ntypedef struct {\n        unsigned int     scale;         /* scale factor */\n        x86_reg_t        index, base;   /* index, base registers */\n        int32_t          disp;          /* displacement */\n        char             disp_sign;     /* is negative? 1/0 */\n        char             disp_size;     /* 0, 1, 2, 4 */\n} x86_ea_t;\n\n/* x86_absolute_t : an X86 segment:offset address (descriptor) */\ntypedef struct {\n\tunsigned short\tsegment;\t/* loaded directly into CS */\n\tunion {\n\t\tunsigned short\toff16;\t/* loaded directly into IP */\n\t\tuint32_t\t\toff32;\t/* loaded directly into EIP */\n\t} offset;\t\n} x86_absolute_t;\n\nenum x86_op_type {      /* mutually exclusive */\n        op_unused = 0,          /* empty/unused operand: should never occur */\n        op_register = 1,        /* CPU register */\n        op_immediate = 2,       /* Immediate Value */\n        op_relative_near = 3,   /* Relative offset from IP */\n        op_relative_far = 4,    /* Relative offset from IP */\n        op_absolute = 5,        /* Absolute address (ptr16:32) */\n        op_expression = 6,      /* Address expression (scale/index/base/disp) */\n        op_offset = 7,          /* Offset from start of segment (m32) */\n        op_unknown\n};\n\n#define x86_optype_is_address( optype ) \\\n\t( optype == op_absolute || optype == op_offset )\n#define x86_optype_is_relative( optype ) \\\n\t( optype == op_relative_near || optype == op_relative_far )\n#define x86_optype_is_memory( optype ) \\\n\t( optype > op_immediate && optype < op_unknown )\n\nenum x86_op_datatype {          /* these use Intel's lame terminology */\n        op_byte = 1,            /* 1 byte integer */\n        op_word = 2,            /* 2 byte integer */\n        op_dword = 3,           /* 4 byte integer */\n        op_qword = 4,           /* 8 byte integer */\n        op_dqword = 5,          /* 16 byte integer */\n        op_sreal = 6,           /* 4 byte real (single real) */\n        op_dreal = 7,           /* 8 byte real (double real) */\n        op_extreal = 8,         /* 10 byte real (extended real) */\n        op_bcd = 9,             /* 10 byte binary-coded decimal */\n        op_ssimd = 10,          /* 16 byte : 4 packed single FP (SIMD, MMX) */\n        op_dsimd = 11,          /* 16 byte : 2 packed double FP (SIMD, MMX) */\n        op_sssimd = 12,         /* 4 byte : scalar single FP (SIMD, MMX) */\n        op_sdsimd = 13,         /* 8 byte : scalar double FP (SIMD, MMX) */\n\top_descr32 = 14,\t/* 6 byte Intel descriptor 2:4 */\n\top_descr16 = 15,\t/* 4 byte Intel descriptor 2:2 */\n\top_pdescr32 = 16,\t/* 6 byte Intel pseudo-descriptor 32:16 */\n\top_pdescr16 = 17,\t/* 6 byte Intel pseudo-descriptor 8:24:16 */\n\top_bounds16 = 18,\t/* signed 16:16 lower:upper bounds */\n\top_bounds32 = 19,\t/* signed 32:32 lower:upper bounds */\n        op_fpuenv16 = 20,\t/* 14 byte FPU control/environment data */\n        op_fpuenv32 = 21,\t/* 28 byte FPU control/environment data */\n\top_fpustate16 = 22,\t/* 94 byte FPU state (env & reg stack) */\n\top_fpustate32 = 23,\t/* 108 byte FPU state (env & reg stack) */\n\top_fpregset = 24,\t/* 512 bytes: register set */\n\top_fpreg = 25,\t\t/* FPU register */\n    op_none = 0xFF,     /* operand without a datatype (INVLPG) */\n};\n\nenum x86_op_access {    /* ORed together */\n        op_read = 1,\n        op_write = 2,\n        op_execute = 4\n};\n\nenum x86_op_flags {     /* ORed together, but segs are mutually exclusive */\n        op_signed = 1,          /* signed integer */\n        op_string = 2,          /* possible string or array */\n        op_constant = 4,        /* symbolic constant */\n        op_pointer = 8,         /* operand points to a memory address */\n\top_sysref = 0x010,\t/* operand is a syscall number */\n\top_implied = 0x020,\t/* operand is implicit in the insn */\n\top_hardcode = 0x40,\t/* operand is hardcoded in insn definition */\n\t/* NOTE: an 'implied' operand is one which can be considered a side\n\t * effect of the insn, e.g. %esp being modified by PUSH or POP. A\n\t * 'hard-coded' operand is one which is specified in the instruction\n\t * definition, e.g. %es:%edi in MOVSB or 1 in ROL Eb, 1. The difference\n\t * is that hard-coded operands are printed by disassemblers and are\n\t * required to re-assemble, while implicit operands are invisible. */\n        op_es_seg = 0x100,      /* ES segment override */\n        op_cs_seg = 0x200,      /* CS segment override */\n        op_ss_seg = 0x300,      /* SS segment override */\n        op_ds_seg = 0x400,      /* DS segment override */\n        op_fs_seg = 0x500,      /* FS segment override */\n        op_gs_seg = 0x600       /* GS segment override */\n};\n\n/* x86_op_t : an X86 instruction operand */\ntypedef struct {\n        enum x86_op_type        type;           /* operand type */\n        enum x86_op_datatype    datatype;       /* operand size */\n        enum x86_op_access      access;         /* operand access [RWX] */\n        enum x86_op_flags       flags;          /* misc flags */\n        union {\n\t\t/* sizeof will have to work on these union members! */\n                /* immediate values */\n                char            sbyte;\n                short           sword;\n                int32_t         sdword;\n                qword_t         sqword;\n                unsigned char   byte;\n                unsigned short  word;\n                uint32_t        dword;\n                qword_t         qword;\n                float           sreal;\n                double          dreal;\n                /* misc large/non-native types */\n                unsigned char   extreal[10];\n                unsigned char   bcd[10];\n                qword_t         dqword[2];\n                unsigned char   simd[16];\n                unsigned char   fpuenv[28];\n                /* offset from segment */\n                uint32_t        offset;\n                /* ID of CPU register */\n                x86_reg_t       reg;\n                /* offsets from current insn */\n                char            relative_near;\n                int32_t         relative_far;\n\t\t/* segment:offset */\n\t\tx86_absolute_t\tabsolute;\n                /* effective address [expression] */\n                x86_ea_t        expression;\n        } data;\n\t/* this is needed to make formatting operands more sane */\n\tvoid * insn;\t\t/* pointer to x86_insn_t owning operand */\n} x86_op_t;\n\n/* Linked list of x86_op_t; provided for manual traversal of the operand\n * list in an insn. Users wishing to add operands to this list, e.g. to add\n * implicit operands, should use x86_operand_new in x86_operand_list.h */\ntypedef struct x86_operand_list {\n\tx86_op_t op;\n\tstruct x86_operand_list *next;\n} x86_oplist_t;\n\nenum x86_insn_group {\n\tinsn_none = 0,\t\t/* invalid instruction */\n        insn_controlflow = 1,\n        insn_arithmetic = 2,\n        insn_logic = 3,\n        insn_stack = 4,\n        insn_comparison = 5,\n        insn_move = 6,\n        insn_string = 7,\n        insn_bit_manip = 8,\n        insn_flag_manip = 9,\n        insn_fpu = 10,\n        insn_interrupt = 13,\n        insn_system = 14,\n        insn_other = 15\n};\n\nenum x86_insn_type {\n\tinsn_invalid = 0,\t/* invalid instruction */\n        /* insn_controlflow */\n        insn_jmp = 0x1001,\n        insn_jcc = 0x1002,\n        insn_call = 0x1003,\n        insn_callcc = 0x1004,\n        insn_return = 0x1005,\n        /* insn_arithmetic */\n        insn_add = 0x2001,\n        insn_sub = 0x2002,\n        insn_mul = 0x2003,\n        insn_div = 0x2004,\n        insn_inc = 0x2005,\n        insn_dec = 0x2006,\n        insn_shl = 0x2007,\n        insn_shr = 0x2008,\n        insn_rol = 0x2009,\n        insn_ror = 0x200A,\n        /* insn_logic */\n        insn_and = 0x3001,\n        insn_or = 0x3002,\n        insn_xor = 0x3003,\n        insn_not = 0x3004,\n        insn_neg = 0x3005,\n        /* insn_stack */\n        insn_push = 0x4001,\n        insn_pop = 0x4002,\n        insn_pushregs = 0x4003,\n        insn_popregs = 0x4004,\n        insn_pushflags = 0x4005,\n        insn_popflags = 0x4006,\n        insn_enter = 0x4007,\n        insn_leave = 0x4008,\n        /* insn_comparison */\n        insn_test = 0x5001,\n        insn_cmp = 0x5002,\n        /* insn_move */\n        insn_mov = 0x6001,      /* move */\n        insn_movcc = 0x6002,    /* conditional move */\n        insn_xchg = 0x6003,     /* exchange */\n        insn_xchgcc = 0x6004,   /* conditional exchange */\n        /* insn_string */\n        insn_strcmp = 0x7001,\n        insn_strload = 0x7002,\n        insn_strmov = 0x7003,\n        insn_strstore = 0x7004,\n        insn_translate = 0x7005,        /* xlat */\n        /* insn_bit_manip */\n        insn_bittest = 0x8001,\n        insn_bitset = 0x8002,\n        insn_bitclear = 0x8003,\n        /* insn_flag_manip */\n        insn_clear_carry = 0x9001,\n        insn_clear_zero = 0x9002,\n        insn_clear_oflow = 0x9003,\n        insn_clear_dir = 0x9004,\n        insn_clear_sign = 0x9005,\n        insn_clear_parity = 0x9006,\n        insn_set_carry = 0x9007,\n        insn_set_zero = 0x9008,\n        insn_set_oflow = 0x9009,\n        insn_set_dir = 0x900A,\n        insn_set_sign = 0x900B,\n        insn_set_parity = 0x900C,\n        insn_tog_carry = 0x9010,\n        insn_tog_zero = 0x9020,\n        insn_tog_oflow = 0x9030,\n        insn_tog_dir = 0x9040,\n        insn_tog_sign = 0x9050,\n        insn_tog_parity = 0x9060,\n        /* insn_fpu */\n        insn_fmov = 0xA001,\n        insn_fmovcc = 0xA002,\n        insn_fneg = 0xA003,\n        insn_fabs = 0xA004,\n        insn_fadd = 0xA005,\n        insn_fsub = 0xA006,\n        insn_fmul = 0xA007,\n        insn_fdiv = 0xA008,\n        insn_fsqrt = 0xA009,\n        insn_fcmp = 0xA00A,\n        insn_fcos = 0xA00C,\n        insn_fldpi = 0xA00D,\n        insn_fldz = 0xA00E,\n        insn_ftan = 0xA00F,\n        insn_fsine = 0xA010,\n        insn_fsys = 0xA020,\n        /* insn_interrupt */\n        insn_int = 0xD001,\n        insn_intcc = 0xD002,    /* not present in x86 ISA */\n        insn_iret = 0xD003,\n        insn_bound = 0xD004,\n        insn_debug = 0xD005,\n        insn_trace = 0xD006,\n        insn_invalid_op = 0xD007,\n        insn_oflow = 0xD008,\n        /* insn_system */\n        insn_halt = 0xE001,\n        insn_in = 0xE002,       /* input from port/bus */\n        insn_out = 0xE003,      /* output to port/bus */\n        insn_cpuid = 0xE004,\n        /* insn_other */\n        insn_nop = 0xF001,\n        insn_bcdconv = 0xF002,  /* convert to or from BCD */\n        insn_szconv = 0xF003    /* change size of operand */\n};\n\n/* These flags specify special characteristics of the instruction, such as\n * whether the inatruction is privileged or whether it serializes the\n * pipeline.\n * NOTE : These may not be accurate for all instructions; updates to the\n * opcode tables have not been completed. */\nenum x86_insn_note {\n\tinsn_note_ring0\t\t= 1,\t/* Only available in ring 0 */\n\tinsn_note_smm\t\t= 2,\t/* \"\" in System Management Mode */\n\tinsn_note_serial\t= 4,\t/* Serializing instruction */\n\tinsn_note_nonswap\t= 8,\t/* Does not swap arguments in att-style formatting */\n\tinsn_note_nosuffix  = 16,\t/* Does not have size suffix in att-style formatting */\n};\n\n/* This specifies what effects the instruction has on the %eflags register */\nenum x86_flag_status {\n        insn_carry_set = 0x1,\t\t\t/* CF */\n        insn_zero_set = 0x2,\t\t\t/* ZF */\n        insn_oflow_set = 0x4,\t\t\t/* OF */\n        insn_dir_set = 0x8,\t\t\t/* DF */\n        insn_sign_set = 0x10,\t\t\t/* SF */\n        insn_parity_set = 0x20,\t\t\t/* PF */\n        insn_carry_or_zero_set = 0x40,\n        insn_zero_set_or_sign_ne_oflow = 0x80,\n        insn_carry_clear = 0x100,\n        insn_zero_clear = 0x200,\n        insn_oflow_clear = 0x400,\n        insn_dir_clear = 0x800,\n        insn_sign_clear = 0x1000,\n        insn_parity_clear = 0x2000,\n        insn_sign_eq_oflow = 0x4000,\n        insn_sign_ne_oflow = 0x8000\n};\n\n/* The CPU model in which the insturction first appeared; this can be used\n * to mask out instructions appearing in earlier or later models or to\n * check the portability of a binary.\n * NOTE : These may not be accurate for all instructions; updates to the\n * opcode tables have not been completed. */\nenum x86_insn_cpu {\n\tcpu_8086 \t= 1,\t/* Intel */\n\tcpu_80286\t= 2,\n\tcpu_80386\t= 3,\n\tcpu_80387\t= 4,\n\tcpu_80486\t= 5,\n\tcpu_pentium\t= 6,\n\tcpu_pentiumpro\t= 7,\n\tcpu_pentium2\t= 8,\n\tcpu_pentium3\t= 9,\n\tcpu_pentium4\t= 10,\n\tcpu_k6\t\t= 16,\t/* AMD */\n\tcpu_k7\t\t= 32,\n\tcpu_athlon\t= 48\n};\n\n/* CPU ISA subsets: These are derived from the Instruction Groups in\n * Intel Vol 1 Chapter 5; they represent subsets of the IA32 ISA but\n * do not reflect the 'type' of the instruction in the same way that\n * x86_insn_group does. In short, these are AMD/Intel's somewhat useless \n * designations.\n * NOTE : These may not be accurate for all instructions; updates to the\n * opcode tables have not been completed. */\nenum x86_insn_isa {\n\tisa_gp\t\t= 1,\t/* general purpose */\n\tisa_fp\t\t= 2,\t/* floating point */\n\tisa_fpumgt\t= 3,\t/* FPU/SIMD management */\n\tisa_mmx\t\t= 4,\t/* Intel MMX */\n\tisa_sse1\t= 5,\t/* Intel SSE SIMD */\n\tisa_sse2\t= 6,\t/* Intel SSE2 SIMD */\n\tisa_sse3\t= 7,\t/* Intel SSE3 SIMD */\n\tisa_3dnow\t= 8,\t/* AMD 3DNow! SIMD */\n\tisa_sys\t\t= 9\t/* system instructions */\n};\n\nenum x86_insn_prefix {\n        insn_no_prefix = 0,\n        insn_rep_zero = 1,\t/* REPZ and REPE */\n        insn_rep_notzero = 2,\t/* REPNZ and REPNZ */\n        insn_lock = 4\t\t/* LOCK: */\n};\n\n/* TODO: maybe provide insn_new/free(), and have disasm return new insn_t */\n/* x86_insn_t : an X86 instruction */\ntypedef struct {\n        /* information about the instruction */\n        uint32_t addr;             /* load address */\n        uint32_t offset;           /* offset into file/buffer */\n        enum x86_insn_group group;      /* meta-type, e.g. INS_EXEC */\n        enum x86_insn_type type;        /* type, e.g. INS_BRANCH */\n\tenum x86_insn_note note;\t/* note, e.g. RING0 */\n        unsigned char bytes[MAX_INSN_SIZE];\n        unsigned char size;             /* size of insn in bytes */\n\t/* 16/32-bit mode settings */\n\tunsigned char addr_size;\t/* default address size : 2 or 4 */\n\tunsigned char op_size;\t\t/* default operand size : 2 or 4 */\n\t/* CPU/instruction set */\n\tenum x86_insn_cpu cpu;\n\tenum x86_insn_isa isa;\n\t/* flags */\n        enum x86_flag_status flags_set; /* flags set or tested by insn */\n        enum x86_flag_status flags_tested;\n\t/* stack */\n\tunsigned char stack_mod;\t/* 0 or 1 : is the stack modified? */\n\tint32_t stack_mod_val;\t\t/* val stack is modified by if known */\n\n        /* the instruction proper */\n        enum x86_insn_prefix prefix;\t/* prefixes ORed together */\n        char prefix_string[MAX_PREFIX_STR]; /* prefixes [might be truncated] */\n        char mnemonic[MAX_MNEM_STR];\n        x86_oplist_t *operands;\t\t/* list of explicit/implicit operands */\n\tsize_t operand_count;\t\t/* total number of operands */\n\tsize_t explicit_count;\t\t/* number of explicit operands */\n        /* convenience fields for user */\n        void *block;                    /* code block containing this insn */\n        void *function;                 /* function containing this insn */\n        int tag;\t\t\t/* tag the insn as seen/processed */\n} x86_insn_t;\n\n\n/* returns 0 if an instruction is invalid, 1 if valid */\nint x86_insn_is_valid( x86_insn_t *insn );\n\n/* DISASSEMBLY ROUTINES\n *      Canonical order of arguments is\n *        (buf, buf_len, buf_rva, offset, len, insn, func, arg, resolve_func)\n *      ...but of course all of these are not used at the same time.\n */\n\n\n/* Function prototype for caller-supplied callback routine\n *      These callbacks are intended to process 'insn' further, e.g. by\n *      adding it to a linked list, database, etc */\ntypedef void (*DISASM_CALLBACK)( x86_insn_t *insn, void * arg );\n\n/* Function prototype for caller-supplied address resolver.\n *      This routine is used to determine the rva to disassemble next, given\n *      the 'dest' operand of a jump/call. This allows the caller to resolve\n *      jump/call targets stored in a register or on the stack, and also allows\n *      the caller to prevent endless loops by checking if an address has\n *      already been disassembled. If an address cannot be resolved from the\n *      operand, or if the address has already been disassembled, this routine\n *      should return -1; in all other cases the RVA to be disassembled next\n *      should be returned. */\ntypedef int32_t (*DISASM_RESOLVER)( x86_op_t *op, x86_insn_t * current_insn,\n\t\t\t\t void *arg );\n\n\n/* x86_disasm: Disassemble a single instruction from a buffer of bytes.\n *             Returns size of instruction in bytes.\n *             Caller is responsible for calling x86_oplist_free() on\n *             a reused \"insn\" to avoid leaking memory when calling this\n *             function repeatedly.\n *      buf     : Buffer of bytes to disassemble\n *      buf_len : Length of the buffer\n *      buf_rva : Load address of the start of the buffer\n *      offset  : Offset in buffer to disassemble\n *      insn    : Structure to fill with disassembled instruction\n */\nunsigned int x86_disasm( unsigned char *buf, unsigned int buf_len,\n                \t uint32_t buf_rva, unsigned int offset,\n                \t x86_insn_t * insn );\n\n/* x86_disasm_range: Sequential disassembly of a range of bytes in a buffer,\n *                   invoking a callback function each time an instruction\n *                   is successfully disassembled. The 'range' refers to the\n *                   bytes between 'offset' and 'offset + len' in the buffer;\n *                   'len' is assumed to be less than the length of the buffer.\n *                   Returns number of instructions processed.\n *      buf     : Buffer of bytes to disassemble (e.g. .text section)\n *      buf_rva : Load address of buffer (e.g. ELF Virtual Address)\n *      offset  : Offset in buffer to start disassembly at\n *      len     : Number of bytes to disassemble\n *      func    : Callback function to invoke (may be NULL)\n *      arg     : Arbitrary data to pass to callback (may be NULL)\n */\nunsigned int x86_disasm_range( unsigned char *buf, uint32_t buf_rva,\n\t                       unsigned int offset, unsigned int len,\n\t                       DISASM_CALLBACK func, void *arg );\n\n/* x86_disasm_forward: Flow-of-execution disassembly of the bytes in a buffer,\n *                     invoking a callback function each time an instruction\n *                     is successfully disassembled.\n *      buf     : Buffer to disassemble (e.g. .text section)\n *      buf_len : Number of bytes in buffer\n *      buf_rva : Load address of buffer (e.g. ELF Virtual Address)\n *      offset  : Offset in buffer to start disassembly at (e.g. entry point)\n *      func    : Callback function to invoke (may be NULL)\n *      arg     : Arbitrary data to pass to callback (may be NULL)\n *      resolver: Caller-supplied address resolver. If no resolver is\n *                supplied, a default internal one is used -- however the\n *                internal resolver does NOT catch loops and could end up\n *                disassembling forever..\n *      r_arg\t: Arbitrary data to pass to resolver (may be NULL)\n */\nunsigned int x86_disasm_forward( unsigned char *buf, unsigned int buf_len,\n\t                         uint32_t buf_rva, unsigned int offset,\n\t                         DISASM_CALLBACK func, void *arg,\n\t                         DISASM_RESOLVER resolver, void *r_arg );\n\n/* Instruction operands: these are stored as a list of explicit and\n * implicit operands. It is recommended that the 'foreach' routines\n * be used to when examining operands for purposes of data flow analysis */\n\n/* Operand FOREACH callback: 'arg' is an abritrary parameter passed to the\n * foreach routine, 'insn' is the x86_insn_t whose operands are being\n * iterated over, and 'op' is the current x86_op_t */\ntypedef void (*x86_operand_fn)(x86_op_t *op, x86_insn_t *insn, void *arg);\n\n/* FOREACH types: these are used to limit the foreach results to \n * operands which match a certain \"type\" (implicit or explicit)\n * or which are accessed in certain ways (e.g. read or write). Note\n * that this operates on the operand list of single instruction, so\n * specifying the 'real' operand type (register, memory, etc) is not\n * useful. Note also that by definition Execute Access implies Read\n * Access and implies Not Write Access.\n * The \"type\" (implicit or explicit) and the access method can\n * be ORed together, e.g. op_wo | op_explicit */\nenum x86_op_foreach_type {\n\top_any \t= 0,\t\t/* ALL operands (explicit, implicit, rwx) */\n\top_dest = 1,\t\t/* operands with Write access */\n\top_src \t= 2,\t\t/* operands with Read access */\n\top_ro \t= 3,\t\t/* operands with Read but not Write access */\n\top_wo \t= 4,\t\t/* operands with Write but not Read access */\n\top_xo \t= 5,\t\t/* operands with Execute access */\n\top_rw \t= 6,\t\t/* operands with Read AND Write access */\n\top_implicit = 0x10,\t/* operands that are implied by the opcode */\n\top_explicit = 0x20\t/* operands that are not side-effects */\n};\n\n\n/* free the operand list associated with an instruction -- useful for\n * preventing memory leaks when free()ing an x86_insn_t */\nvoid x86_oplist_free( x86_insn_t *insn );\n\n/* Operand foreach: invokes 'func' with 'insn' and 'arg' as arguments. The\n * 'type' parameter is used to select only operands matching specific\n * criteria. */\nint x86_operand_foreach( x86_insn_t *insn, x86_operand_fn func, void *arg,\n\t       \t  \t enum x86_op_foreach_type type);\n\n/* convenience routine: returns count of operands matching 'type' */\nsize_t x86_operand_count( x86_insn_t *insn, enum x86_op_foreach_type type );\n\n/* accessor functions for the operands */\nx86_op_t * x86_operand_1st( x86_insn_t *insn );\nx86_op_t * x86_operand_2nd( x86_insn_t *insn );\nx86_op_t * x86_operand_3rd( x86_insn_t *insn );\n\n/* these allow libdisasm 2.0 accessor functions to still be used */\n#define x86_get_dest_operand( insn ) x86_operand_1st( insn )\n#define x86_get_src_operand( insn ) x86_operand_2nd( insn )\n#define x86_get_imm_operand( insn ) x86_operand_3rd( insn )\n\n/* get size of operand data in bytes */\nunsigned int x86_operand_size( x86_op_t *op );\n\n/* Operand Convenience Routines: the following three routines are common\n * operations on operands, intended to ease the burden of the programmer. */\n\n/* Get Address: return the value of an offset operand, or the offset of\n * a segment:offset absolute address */\nuint32_t x86_get_address( x86_insn_t *insn );\n\n/* Get Relative Offset: return as a sign-extended int32_t the near or far\n * relative offset operand, or 0 if there is none. There can be only one\n * relaive offset operand in an instruction. */\nint32_t x86_get_rel_offset( x86_insn_t *insn );\n\n/* Get Branch Target: return the x86_op_t containing the target of\n * a jump or call operand, or NULL if there is no branch target. \n * Internally, a 'branch target' is defined as any operand with\n * Execute Access set. There can be only one branch target per instruction. */\nx86_op_t * x86_get_branch_target( x86_insn_t *insn );\n\n/* Get Immediate: return the x86_op_t containing the immediate operand\n * for this instruction, or NULL if there is no immediate operand. There\n * can be only one immediate operand per instruction */\nx86_op_t * x86_get_imm( x86_insn_t *insn );\n\n/* Get Raw Immediate Data: returns a pointer to the immediate data encoded\n * in the instruction. This is useful for large data types [>32 bits] currently\n * not supported by libdisasm, or for determining if the disassembler\n * screwed up the conversion of the immediate data. Note that 'imm' in this\n * context refers to immediate data encoded at the end of an instruction as\n * detailed in the Intel Manual Vol II Chapter 2; it does not refer to the\n * 'op_imm' operand (the third operand in instructions like 'mul' */\nunsigned char * x86_get_raw_imm( x86_insn_t *insn );\n\n\n/* More accessor fuctions, this time for user-defined info... */\n/* set the address (usually RVA) of the insn */\nvoid x86_set_insn_addr( x86_insn_t *insn, uint32_t addr );\n\n/* set the offset (usually offset into file) of the insn */\nvoid x86_set_insn_offset( x86_insn_t *insn, unsigned int offset );\n\n/* set a pointer to the function owning the instruction. The \n * type of 'func' is user-defined; libdisasm does not use the func field. */\nvoid x86_set_insn_function( x86_insn_t *insn, void * func );\n\n/* set a pointer to the block of code owning the instruction. The \n * type of 'block' is user-defined; libdisasm does not use the block field. */\nvoid x86_set_insn_block( x86_insn_t *insn, void * block );\n\n/* instruction tagging: these routines allow the programmer to mark\n * instructions as \"seen\" in a DFS, for example. libdisasm does not use\n * the tag field.*/ \n/* set insn->tag to 1 */\nvoid x86_tag_insn( x86_insn_t *insn );\n/* set insn->tag to 0 */\nvoid x86_untag_insn( x86_insn_t *insn );\n/* return insn->tag */\nint x86_insn_is_tagged( x86_insn_t *insn );\n\n\n/* Disassembly formats:\n *      AT&T is standard AS/GAS-style: \"mnemonic\\tsrc, dest, imm\"\n *      Intel is standard MASM/NASM/TASM: \"mnemonic\\tdest,src, imm\"\n *      Native is tab-delimited: \"RVA\\tbytes\\tmnemonic\\tdest\\tsrc\\timm\"\n *      XML is your typical <insn> ... </insn>\n *      Raw is addr|offset|size|bytes|prefix... see libdisasm_formats.7\n */\nenum x86_asm_format { \n\tunknown_syntax = 0,\t\t/* never use! */\n\tnative_syntax, \t\t\t/* header: 35 bytes */\n\tintel_syntax, \t\t\t/* header: 23 bytes */\n\tatt_syntax,  \t\t\t/* header: 23 bytes */\n\txml_syntax,\t\t\t/* header: 679 bytes */\n\traw_syntax\t\t\t/* header: 172 bytes */\n};\n\n/* format (sprintf) an operand into 'buf' using specified syntax */\nint x86_format_operand(x86_op_t *op, char *buf, int len,\n                  enum x86_asm_format format);\n\n/* format (sprintf) an instruction mnemonic into 'buf' using specified syntax */\nint x86_format_mnemonic(x86_insn_t *insn, char *buf, int len,\n                        enum x86_asm_format format);\n\n/* format (sprintf) an instruction into 'buf' using specified syntax;\n * this includes formatting all operands */\nint x86_format_insn(x86_insn_t *insn, char *buf, int len, enum x86_asm_format);\n\n/* fill 'buf' with a description of the format's syntax */\nint x86_format_header( char *buf, int len, enum x86_asm_format format);\n\n/* Endianness of an x86 CPU : 0 is big, 1 is little; always returns 1 */\nunsigned int x86_endian(void);\n\n/* Default address and operand size in bytes */\nunsigned int x86_addr_size(void);\nunsigned int x86_op_size(void);\n\n/* Size of a machine word in bytes */\nunsigned int x86_word_size(void);\n\n/* maximum size of a code instruction */\n#define x86_max_inst_size(x) x86_max_insn_size(x)\nunsigned int x86_max_insn_size(void);\n\n/* register IDs of Stack, Frame, Instruction pointer and Flags register */\nunsigned int x86_sp_reg(void);\nunsigned int x86_fp_reg(void);\nunsigned int x86_ip_reg(void);\nunsigned int x86_flag_reg(void);\n\n/* fill 'reg' struct with details of register 'id' */\nvoid x86_reg_from_id( unsigned int id, x86_reg_t * reg );\n\n/* convenience macro demonstrating how to get an aliased register; proto is\n *   void x86_get_aliased_reg( x86_reg_t *alias_reg, x86_reg_t *output_reg )\n * where 'alias_reg' is a reg operand and 'output_reg' is filled with the\n * register that the operand is an alias for */\n#define x86_get_aliased_reg( alias_reg, output_reg )\t\t\t\\\n\tx86_reg_from_id( alias_reg->alias, output_reg )\n\n\n/* ================================== Invariant Instruction Representation */\n/* Invariant instructions are used for generating binary signatures; \n * the instruction is modified so that all variant bytes in an instruction\n * are replaced with a wildcard byte. \n *\n * A 'variant byte' is one that is expected to be modified by either the \n * static or the dynamic linker: for example, an address encoded in an \n * instruction. \n *\n * By comparing the invariant representation of one instruction [or of a\n * sequence of instructions] with the invariant representation of another,\n * one determine whether the two invariant representations are from the same\n * relocatable object [.o] file. Thus one can use binary signatures [which\n * are just sequences of invariant instruction representations] to look for\n * library routines which have been statically-linked into a binary.\n *\n * The invariant routines are faster and smaller than the disassembly\n * routines; they can be used to determine the size of an instruction \n * without all of the overhead of a full instruction disassembly.\n */\n\n/* This byte is used to replace variant bytes */\n#define X86_WILDCARD_BYTE 0xF4\n\ntypedef struct {\n        enum x86_op_type        type;           /* operand type */\n        enum x86_op_datatype    datatype;       /* operand size */\n        enum x86_op_access      access;         /* operand access [RWX] */\n        enum x86_op_flags       flags;          /* misc flags */\n} x86_invariant_op_t;\n\ntypedef struct {\n\tunsigned char bytes[64];\t/* invariant representation */\n\tunsigned int  size;\t\t/* number of bytes in insn */\n        enum x86_insn_group group;      /* meta-type, e.g. INS_EXEC */\n        enum x86_insn_type type;        /* type, e.g. INS_BRANCH */\n\tx86_invariant_op_t operands[3];\t/* operands: dest, src, imm */\n} x86_invariant_t;\n \n\n/* return a version of the instruction with the variant bytes masked out */\nsize_t x86_invariant_disasm( unsigned char *buf, int buf_len, \n\t\t\t  x86_invariant_t *inv );\n/* return the size in bytes of the intruction pointed to by 'buf';\n * this used x86_invariant_disasm since it faster than x86_disasm */\nsize_t x86_size_disasm( unsigned char *buf, unsigned int buf_len );\n\n#ifdef __cplusplus\n}\n#endif\n\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/qword.h",
    "content": "#ifndef LIBDISASM_QWORD_H\n#define LIBDISASM_QWORD_H\n\n#include <stdint.h>\n\n/* platform independent data types */\n\n#ifdef _MSC_VER\n\ttypedef __int64         qword_t;\n#else\n\ttypedef int64_t         qword_t;\n#endif\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/swig/README",
    "content": "\t\t\tLibdisasm SWIG README\n\nThe SWIG utility (www.swig.org) can be used to generate \n\n\nBuilding SWIG Modules\n---------------------\n\n\tmake\n\tmake install\n\nMake and Install both build Python, Perl, Ruby, and Tcl modules. If you\ndo not have one of these languages installed, comment out the relevant\ntarget in the main Makefile.\n\nInstall uses 'sudo' to put files in the correct locations; if you\ndo not have sudo installed, change the install targets.\n\nThe Module API\n--------------\n\nThe OOP API\n-----------\n\n\nThe Python Module\n-----------------\n\nTo test that the module loads:\n\n\tbash# python\n\t>>> import x86disasm\n\t>>> x86disasm.version_string()\n\t'0.21-pre'\n\t>>>^D\n\tbash#\n\n\t>>> import x86disasm\n\t>>> import array\n\t>>> disasm = x86disasm.X86_Disasm( )\n\t>>> tgt = open( \"/tmp/a.out\", \"rb\" )\n\t>>> tgt.seek( 0, 2 )\n\t>>> size = tgt.tell()\n\t>>> tgt.seek( 0, 0 )\n\t>>> buf = array.array( 'B' )\n\t>>> buf.fromfile( tgt, size )\n\t>>> tgt.close()\n\t>>> data = x86disasm.byteArray( size )\n\t>>> for i in range( size ):\n\t...     data[i] = buf.pop(0)\n\t...\n\t>>> del buf\n\t>>> del tgt\n\t>>> insn = disasm.disasm( data, size - 1, 0, 0 )\n\t>>> insn.format( x86disasm.att_syntax )\n\t 'jg\\t0x00000047'\n\t>>> insn.format( x86disasm.raw_syntax )\n\t'0x00000000|0x00000000|2|7F 45 |||controlflow|jcc|jg|80386|General Purpose|||zero_clear sign_eq_oflow |0|0|relative|sbyte|00000047|'\n\t>>> ops = insn.operand_list()\n\t>>> node = ops.first()\n\t>>> while node is not None:\n\t...     s = node.op.format(x86disasm.raw_syntax)\n\t...     print s\n\t...     node = ops.next()\n\t... \n\trelative|sbyte|00000047|\n\n\n\n\n\n\nThe Perl Module\n---------------\n\nTo test that the module loads:\n\n\tbash# perl\n\tuse x86disasm;\n\tprint x86disasm::version_string() . \"\\n\";\n\t^D\n\t0.21-pre\n\tbash#\n\nThe Ruby Module\n---------------\n\nTo test that the module loads:\n\n\tbash# irb\n\tirb(main):001:0> require 'x86disasm'\n\t=> true\n\tirb(main):002:0> X86disasm.version_string()\n\t=> \"0.21-pre\"\n\tirb(main):003:0> x = X86disasm::X86_Disasm.new\n\t=> #<X86disasm::X86_Disasm:0xb7d624a4>\n\tirb(main):004:0> x.max_register_string()\n\t=> 8\n\tirb(main):003:0> ^D\n\tbash#\n\nThe Tcl Module\n---------------\n\nTo test that the module loads:\n\n\tbash# tclsh\n\t% load /usr/lib/tcl8.3/x86disasm.so X86disasm\n\t% version_string\n\t0.21-pre\n\t% ^D\n\tbash#\n\n\t% x86_init 0 NULL NULL\n\t\tOR\n\t% x86disasm dis\n\t_486b0708_p_x86disasm\n\t%  puts \"[dis cget -last_error]\"\n\t0\n\n\n\n\nThe Interface Files\n-------------------\n\n\tlibdisasm.i\t-- interface file without shadow classes\n\tlibdisasm_oop.i\t-- interface file with shadow classes\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/swig/libdisasm.i",
    "content": "%module x86disasm\n%{\n#include \"../../libdis.h\"\n#include \"../../../config.h\"\n%}\n\n%rename(version_string) x86_version_string;\n%include \"../../libdis.h\"\n#include \"../../../config.h\"\n\n%inline %{\n\tconst char * x86_version_string( void ) {\n\t\treturn PACKAGE_VERSION;\n\t}\n%}\n\n%rename(report_codes) x86_report_codes;\n%rename(report_error) x86_report_error;\n%rename(options) x86_options;\n%rename(init) x86_init;\n%rename(set_reporter) x86_set_reporter;\n%rename(set_options) x86_set_options;\n%rename(options) x86_get_options;\n%rename(cleanup) x86_cleanup;\n%rename(reg_type) x86_reg_type;\n%rename(reg) x86_reg_t;\n%rename(eaddr) x86_ea_t;\n%rename(op_type) x86_op_type;\n%rename(optype_is_address) x86_optype_is_address;\n%rename(optype_is_relative) x86_optype_is_relative;\n%rename(op_datatype) x86_op_datatype;\n%rename(op_access) x86_op_access;\n%rename(op_flags) x86_op_flags;\n%rename(operand) x86_op_t;\n%rename(insn_group) x86_insn_group; \n%rename(insn_type) x86_insn_type;\n%rename(insn_note) x86_insn_note ;\n%rename(flag_status) x86_flag_status; \n%rename(insn_cpu) x86_insn_cpu ;\n%rename(insn_isa) x86_insn_isa ;\n%rename(insn_prefix) x86_insn_prefix ;\n%rename(insn) x86_insn_t;\n%rename(insn_is_valid) x86_insn_is_valid;\n%rename(i_disasm) x86_disasm;\n%rename(i_disasm_range) x86_disasm_range;\n%rename(i_disasm_forward) x86_disasm_forward;\n%rename(insn_operand_count) x86_operand_count;\n%rename(insn_operand_1st) x86_operand_1st;\n%rename(insn_operand_2nd) x86_operand_2nd;\n%rename(insn_operand_3rd) x86_operand_3rd;\n%rename(insn_dest_operand) x86_get_dest_operand;\n%rename(insn_src_operand) x86_get_src_operand;\n%rename(insn_imm_operand) x86_get_imm_operand;\n%rename(operand_size) x86_operand_size;\n%rename(insn_rel_offset) x86_get_rel_offset;\n%rename(insn_branch_target) x86_get_branch_target;\n%rename(insn_imm) x86_get_imm;\n%rename(insn_raw_imm) x86_get_raw_imm;\n%rename(insn_set_addr) x86_set_insn_addr;\n%rename(insn_set_offset) x86_set_insn_offset;\n%rename(insn_set_function) x86_set_insn_function;\n%rename(insn_set_block) x86_set_insn_block;\n%rename(insn_tag) x86_tag_insn;\n%rename(insn_untag) x86_untag_insn;\n%rename(insn_is_tagged) x86_insn_is_tagged;\n%rename(asm_format) x86_asm_format;\n%rename(operand_format) x86_format_operand;\n%rename(insn_format_mnemonic) x86_format_mnemonic;\n%rename(insn_format) x86_format_insn;\n%rename(header_format) x86_format_header;\n%rename(endian) x86_endian;\n%rename(size_default_address) x86_addr_size;\n%rename(size_default_operand) x86_op_size;\n%rename(size_machine_word) x86_word_size;\n%rename(size_max_insn) x86_max_insn_size;\n%rename(reg_sp) x86_sp_reg;\n%rename(reg_fp) x86_fp_reg;\n%rename(reg_ip) x86_ip_reg;\n%rename(reg_from_id) x86_reg_from_id;\n%rename(reg_from_alias) x86_get_aliased_reg;\n%rename(invariant_op) x86_invariant_op_t;\n%rename(invariant) x86_invariant_t;\n%rename(disasm_invariant) x86_invariant_disasm;\n%rename(disasm_size) x86_size_disasm;\n\n%include \"carrays.i\"\n\n%array_class( unsigned char, byteArray );\n\n\n%apply (unsigned char *STRING, int LENGTH) { \n\t(unsigned char *buf, size_t buf_len) \n};\n\n\n%newobject x86_op_copy;\n%inline %{\n\tx86_op_t * x86_op_copy( x86_op_t * src ) {\n\t\tx86_op_t *op;\n\t\t\n\t\tif (! src ) {\n\t\t\treturn NULL;\n\t\t}\n\n\t\top = (x86_op_t *) calloc( sizeof(x86_op_t), 1 );\n\t\tif ( op ) {\n\t\t\tmemcpy( op, src, sizeof(x86_op_t) );\n\t\t}\n\n\t\treturn op;\n\t}\n\n\ttypedef struct x86_op_list_node {\n\t\tx86_op_t *op;\n\t\tstruct x86_op_list_node *next, *prev;\n\t} x86_op_list_node;\n\n\ttypedef struct x86_op_list {\n\t\tsize_t count;\n\t\tx86_op_list_node *head, *tail, *curr;\n\t} x86_op_list;\n\n\tx86_op_list * x86_op_list_new () {\n\t\tx86_op_list *list = (x86_op_list *) \n\t\t\t\tcalloc( sizeof(x86_op_list), 1 );\n\t\tlist->count = 0;\n\t\treturn list;\n\t}\n\n\tvoid x86_op_list_free(x86_op_list *list) {\n\t\tx86_op_list_node *node, *next;\n\n\t\tnode = list->head;\n\t\twhile ( node ) {\n\t\t\tnext = node->next;\n\t\t\t/* free( node->insn ); */\n\t\t\tfree( node );\n\t\t\tnode = next;\n\t\t}\n\n\t\tfree( list );\n\t}\n\n\tx86_op_list_node * x86_op_list_first(x86_op_list *list) { \n\t\treturn list->head; \n\t}\n\n\tx86_op_list_node * x86_op_list_last(x86_op_list *list) { \n\t\treturn list->tail; \n\t}\n\n\tx86_op_list_node * x86_op_list_next(x86_op_list *list) { \n\t\tif (! list->curr ) {\n\t\t\tlist->curr = list->head;\n\t\t\treturn list->head;\n\t\t}\n\n\t\tlist->curr = list->curr->next;\n\t\treturn list->curr;\n\t}\n\n\tx86_op_list_node * x86_op_list_prev(x86_op_list *list) { \n\t\tif (! list->curr ) {\n\t\t\tlist->curr = list->tail;\n\t\t\treturn list->tail;\n\t\t}\n\n\t\tlist->curr = list->curr->prev;\n\t\treturn list->curr;\n\t}\n\n%}\n\n%newobject x86_op_list_append;\n\n%inline %{\n\tvoid x86_op_list_append( x86_op_list * list, x86_op_t *op ) {\n\t\tx86_op_list_node *node = (x86_op_list_node *)\n\t\t\t\t\tcalloc( sizeof(x86_op_list_node) , 1 );\n\t\tif (! node ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlist->count++;\n\t\tif ( ! list->tail ) {\n\t\t\tlist->head = list->tail = node;\n\t\t} else {\n\t\t\tlist->tail->next = node;\n\t\t\tnode->prev = list->tail;\n\t\t\tlist->tail = node;\n\t\t}\n\n\t\tnode->op = x86_op_copy( op );\n\t}\n\n\tx86_oplist_t * x86_op_list_node_copy( x86_oplist_t * list ) {\n\t\tx86_oplist_t *ptr;\n\t\tptr = (x86_oplist_t *) calloc( sizeof(x86_oplist_t), 1 );\n\t\tif ( ptr ) {\n\t\t\tmemcpy( &ptr->op, &list->op, sizeof(x86_op_t) );\n\t\t}\n\n\t\treturn ptr;\n\t}\n\n\tx86_insn_t * x86_insn_new() {\n\t\tx86_insn_t *insn = (x86_insn_t *)\n\t\t\t\t   calloc( sizeof(x86_insn_t), 1 );\n\t\treturn insn;\n\t}\n\n\tvoid x86_insn_free( x86_insn_t *insn ) {\n\t\tx86_oplist_free( insn );\n\t\tfree( insn );\n\t}\n%}\n\n%newobject x86_insn_copy;\n\n%inline %{\n\tx86_insn_t * x86_insn_copy( x86_insn_t *src) {\n\t\tx86_oplist_t *ptr, *list, *last = NULL;\n\t\tx86_insn_t *insn = (x86_insn_t *)\n\t\t\t\t   calloc( sizeof(x86_insn_t), 1 );\n\n\t\tif ( insn ) {\n\t\t\tmemcpy( insn, src, sizeof(x86_insn_t) );\n\t\t\tinsn->operands = NULL;\n\t\t\tinsn->block = NULL;\n\t\t\tinsn->function = NULL;\n\n\t\t\t/* copy operand list */\n\t\t\tfor ( list = src->operands; list; list = list->next ) {\n\t\t\t\tptr = x86_op_list_node_copy( list );\n\n\t\t\t\tif (! ptr ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( insn->operands ) {\n\t\t\t\t\tlast->next = ptr;\n\t\t\t\t} else {\n\t\t\t\t\tinsn->operands = ptr;\n\t\t\t\t}\n\t\t\t\tlast = ptr;\n\t\t\t}\n\t\t}\n\n\t\treturn insn;\n\t}\n\n\tx86_op_list * x86_insn_op_list( x86_insn_t *insn ) {\n\t\tx86_oplist_t *list = insn->operands;\n\t\tx86_op_list *op_list = x86_op_list_new();\n\n\t\tfor ( list = insn->operands; list; list = list->next ) {\n\t\t\tx86_op_list_append( op_list, &list->op );\n\t\t}\n\n\t\treturn op_list;\n\t}\n\n\ttypedef struct x86_insn_list_node {\n\t\tx86_insn_t *insn;\n\t\tstruct x86_insn_list_node *next, *prev;\n\t} x86_insn_list_node;\n\n\ttypedef struct x86_insn_list {\n\t\tsize_t count;\n\t\tx86_insn_list_node *head, *tail, *curr;\n\t} x86_insn_list;\n\n%}\n\n%newobject x86_insn_list_new;\n\n%inline %{\n\tx86_insn_list * x86_insn_list_new () {\n\t\tx86_insn_list *list = (x86_insn_list *) \n\t\t\t\tcalloc( sizeof(x86_insn_list), 1 );\n\t\tlist->count = 0;\n\t\treturn list;\n\t}\n\n\tvoid x86_insn_list_free( x86_insn_list * list ) {\n\t\tx86_insn_list_node *node, *next;\n\n\t\tif (! list ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnode = list->head;\n\t\twhile ( node ) {\n\t\t\tnext = node->next;\n\t\t\t/* free( node->insn ); */\n\t\t\tfree( node );\n\t\t\tnode = next;\n\t\t}\n\n\t\tfree( list );\n\t}\n\n\tx86_insn_list_node * x86_insn_list_first( x86_insn_list *list ) { \n\t\tif (! list ) {\n\t\t\treturn NULL;\n\t\t}\n\t\treturn list->head; \n\t}\n\n\tx86_insn_list_node * x86_insn_list_last( x86_insn_list *list ) { \n\t\tif (! list ) {\n\t\t\treturn NULL;\n\t\t}\n\t\treturn list->tail; \n\t}\n\n\tx86_insn_list_node * x86_insn_list_next( x86_insn_list *list ) { \n\t\tif (! list ) {\n\t\t\treturn NULL;\n\t\t}\n\t\tif (! list->curr ) {\n\t\t\tlist->curr = list->head;\n\t\t\treturn list->head;\n\t\t}\n\n\t\tlist->curr = list->curr->next;\n\t\treturn list->curr;\n\t}\n\n\tx86_insn_list_node * x86_insn_list_prev( x86_insn_list *list ) { \n\t\tif (! list ) {\n\t\t\treturn NULL;\n\t\t}\n\t\tif (! list->curr ) {\n\t\t\tlist->curr = list->tail;\n\t\t\treturn list->tail;\n\t\t}\n\n\t\tlist->curr = list->curr->prev;\n\t\treturn list->curr;\n\t}\n\n%}\n\n%newobject x86_insn_list_append;\n\n%inline %{\n\tvoid x86_insn_list_append( x86_insn_list *list, x86_insn_t *insn ) {\n\t\tx86_insn_list_node *node;\n\t\tif (! list ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnode = (x86_insn_list_node *)\n\t\t\t\t\tcalloc( sizeof(x86_insn_list_node) , 1 );\n\n\t\tif (! node ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlist->count++;\n\t\tif ( ! list->tail ) {\n\t\t\tlist->head = list->tail = node;\n\t\t} else {\n\t\t\tlist->tail->next = node;\n\t\t\tnode->prev = list->tail;\n\t\t\tlist->tail = node;\n\t\t}\n\n\t\tnode->insn = x86_insn_copy( insn );\n\t}\n\n\ttypedef struct {\n\t\tenum x86_report_codes last_error;\n\t\tvoid * last_error_data;\n\t\tvoid * disasm_callback;\n\t\tvoid * disasm_resolver;\n\t} x86disasm;\n\n\tvoid x86_default_reporter( enum x86_report_codes code, \n\t\t\t\t   void *data, void *arg ) {\n\t\tx86disasm *dis = (x86disasm *) arg;\n\t\tif ( dis ) {\n\t\t\tdis->last_error = code;\n\t\t\tdis->last_error_data = data;\n\t\t}\n\t}\n\n\tvoid x86_default_callback( x86_insn_t *insn, void *arg ) {\n\t\tx86_insn_list *list = (x86_insn_list *) arg;\n\t\tif ( list ) {\n\t\t\tx86_insn_list_append( list, insn );\n\t\t}\n\t}\n\n\t/* TODO: resolver stack, maybe a callback */\n\tlong x86_default_resolver( x86_op_t *op, x86_insn_t *insn, void *arg ) {\n\t\tx86disasm *dis = (x86disasm *) arg;\n\t\tif ( dis ) {\n\t\t\t//return dis->resolver( op, insn );\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\t\n%}\n\n%newobject x86disasm_new;\n\n%inline %{\n\tx86disasm * x86disasm_new ( enum x86_options options ) {\n\t\tx86disasm * dis = (x86disasm *)\n\t\t\t\tcalloc( sizeof( x86disasm ), 1 );\n\t\tx86_init( options, x86_default_reporter, dis );\n\t\treturn dis;\n\t}\n\n\tvoid x86disasm_free( x86disasm * dis ) {\n\t\tx86_cleanup();\n\t\tfree( dis );\n\t}\n%}\n\n%newobject x86_disasm;\n\n%inline %{\n\tx86_insn_t * disasm( unsigned char *buf, size_t buf_len, \n\t\t           unsigned long buf_rva, unsigned int offset ) {\n\t\tx86_insn_t *insn = calloc( sizeof( x86_insn_t ), 1 );\n\t\tx86_disasm( buf, buf_len, buf_rva, offset, insn );\n\t\treturn insn;\n\t}\n\n\tint disasm_range( unsigned char *buf, size_t buf_len, \n\t              unsigned long buf_rva, unsigned int offset,\n\t\t      unsigned int len ) {\n\n\t\tx86_insn_list *list = x86_insn_list_new();\n\n\t\tif ( len > buf_len ) {\n\t\t\tlen = buf_len;\n\t\t}\n\n\t\treturn x86_disasm_range( buf, buf_rva, offset, len, \n\t\t\t\tx86_default_callback, list );\n\t}\n\n\tint disasm_forward( unsigned char *buf, size_t buf_len,\n\t\t\t    unsigned long buf_rva, unsigned int offset ) {\n\t\tx86_insn_list *list = x86_insn_list_new();\n\n\t\t/* use default resolver: damn SWIG callbacks! */\n\t\treturn x86_disasm_forward( buf, buf_len, buf_rva, offset,\n\t\t\t                   x86_default_callback, list, \n\t\t\t\t\t   x86_default_resolver, NULL );\n\t}\n\n\tsize_t disasm_invariant( unsigned char *buf, size_t buf_len, \n\t\t\t  x86_invariant_t *inv ) {\n\t\treturn x86_invariant_disasm( buf, buf_len, inv );\n\t}\n\n\tsize_t disasm_size( unsigned char *buf, size_t buf_len ) {\n\t\treturn x86_size_disasm( buf, buf_len );\n\t}\n\n\tint x86_max_operand_string( enum x86_asm_format format ) {\n\t\tswitch ( format ) {\n\t\t\tcase xml_syntax:\n\t\t\t\treturn  MAX_OP_XML_STRING;\n\t\t\t\tbreak;\n\t\t\tcase raw_syntax:\n\t\t\t\treturn MAX_OP_RAW_STRING;\n\t\t\t\tbreak;\n\t\t\tcase native_syntax:\n\t\t\tcase intel_syntax:\n\t\t\tcase att_syntax:\n\t\t\tcase unknown_syntax:\n\t\t\tdefault:\n\t\t\t\treturn MAX_OP_STRING;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\n\tint x86_max_insn_string( enum x86_asm_format format ) {\n\t\tswitch ( format ) {\n\t\t\tcase xml_syntax:\n\t\t\t\treturn  MAX_INSN_XML_STRING;\n\t\t\t\tbreak;\n\t\t\tcase raw_syntax:\n\t\t\t\treturn MAX_INSN_RAW_STRING;\n\t\t\t\tbreak;\n\t\t\tcase native_syntax:\n\t\t\tcase intel_syntax:\n\t\t\tcase att_syntax:\n\t\t\tcase unknown_syntax:\n\t\t\tdefault:\n\t\t\t\treturn MAX_INSN_STRING;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tint x86_max_num_operands( ) { return MAX_NUM_OPERANDS; }\n%}\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/swig/libdisasm_oop.i",
    "content": "%module x86disasm\n%{\n#ifdef _MSC_VER\n\ttypedef __int64         qword;\n#else\n\ttypedef long long       qword;\n#endif\n\n#include <sys/types.h>\n\n#define MAX_REGNAME 8\n#define MAX_PREFIX_STR 32\n#define MAX_MNEM_STR 16\n#define MAX_INSN_SIZE 20\n#define MAX_OP_STRING 32\n#define MAX_OP_RAW_STRING 64\n#define MAX_OP_XML_STRING 256\n#define MAX_NUM_OPERANDS 8\n#define MAX_INSN_STRING 512\n#define MAX_INSN_RAW_STRING 1024\n#define MAX_INSN_XML_STRING 4096\n\n#include \"../../../config.h\"\n\n\nconst char * version_string( void ) {\n\treturn PACKAGE_VERSION;\n}\n\n%}\n\nconst char * version_string( void );\n\n%rename(X86_Register) x86_reg_t;\n%rename(X86_EAddr) x86_ea_t;\n%rename(X86_Operand) x86_op_t;\n//%rename(X86_OpList) x86_oplist_t;\n%rename(X86_Insn) x86_insn_t;\n%rename(X86_InvOperand) x86_invariant_op_t;\n%rename(X86_Invariant) x86_invariant_t;\n\n%include \"carrays.i\"\n\n%array_class( unsigned char, byteArray );\n\n\n%apply (unsigned char *STRING, int LENGTH) { \n\t(unsigned char *buf, size_t buf_len) \n};\n\n\n%inline %{\n\n\nenum x86_asm_format { \n\tunknown_syntax = 0,\t\t/* never use! */\n\tnative_syntax, \t\t\t/* header: 35 bytes */\n\tintel_syntax, \t\t\t/* header: 23 bytes */\n\tatt_syntax,  \t\t\t/* header: 23 bytes */\n\txml_syntax,\t\t\t/* header: 679 bytes */\n\traw_syntax\t\t\t/* header: 172 bytes */\n};\n%}\n\n/* ================================================================== */\n/* operand class */\n%inline %{\n\tenum x86_reg_type {\n\t        reg_gen         = 0x00001, reg_in          = 0x00002,\n\t        reg_out         = 0x00004, reg_local       = 0x00008,\n\t        reg_fpu         = 0x00010, reg_seg         = 0x00020,\n\t        reg_simd        = 0x00040, reg_sys         = 0x00080,\n\t        reg_sp          = 0x00100, reg_fp          = 0x00200,\n\t        reg_pc          = 0x00400, reg_retaddr     = 0x00800,\n\t        reg_cond        = 0x01000, reg_zero        = 0x02000,\n\t        reg_ret         = 0x04000, reg_src         = 0x10000,\n\t        reg_dest        = 0x20000, reg_count       = 0x40000\n\t};\n\n\ttypedef struct {\n       \t \tchar name[MAX_REGNAME];\n\t        enum x86_reg_type type;\n\t        unsigned int size;\n\t        unsigned int id;\n\t\tunsigned int alias;\n\t\tunsigned int shift;\n\t} x86_reg_t;\n\n\tvoid x86_reg_from_id( unsigned int id, x86_reg_t * reg );\n\n\ttypedef struct {\n\t        unsigned int     scale;\n\t        x86_reg_t        index, base;\n\t        long             disp;\n\t        char             disp_sign;\n\t        char             disp_size;\n\t} x86_ea_t;\n\n\tenum x86_op_type {\n\t        op_unused = 0,\n\t        op_register = 1,\n\t        op_immediate = 2,\n\t        op_relative_near = 3,\n\t        op_relative_far = 4,\n\t        op_absolute = 5, \n\t        op_expression = 6,\n\t        op_offset = 7,\n\t        op_unknown\n\t};\n\n\tenum x86_op_datatype {\n\t       \top_byte = 1, op_word = 2,\n\t        op_dword = 3, op_qword = 4,\n\t        op_dqword = 5, op_sreal = 6,\n\t        op_dreal = 7, op_extreal = 8,\n\t        op_bcd = 9,  op_ssimd = 10,\n\t        op_dsimd = 11, op_sssimd = 12,\n\t        op_sdsimd = 13, op_descr32 = 14,\n\t\top_descr16 = 15, op_pdescr32 = 16,\n\t\top_pdescr16 = 17, op_fpuenv = 18,\n\t\top_fpregset = 19,\n\t};\n\n\tenum x86_op_access {\n\t        op_read = 1,\n\t        op_write = 2,\n\t        op_execute = 4\n\t};\n\n\tenum x86_op_flags {\n\t        op_signed = 1, op_string = 2, \n\t        op_constant = 4, op_pointer = 8,  \n\t\top_sysref = 0x010, op_implied = 0x020,\n\t\top_hardcode = 0x40, op_es_seg = 0x100,\n\t        op_cs_seg = 0x200, op_ss_seg = 0x300,\n\t        op_ds_seg = 0x400, op_fs_seg = 0x500,\n\t        op_gs_seg = 0x600\n\t};\n\n\ttypedef struct {\n\t        enum x86_op_type        type;\n\t        enum x86_op_datatype    datatype;\n\t        enum x86_op_access      access;\n\t        enum x86_op_flags       flags;\n\t        union {\n\t                char            sbyte;\n\t                short           sword;\n\t                long            sdword;\n\t                qword           sqword;\n\t                unsigned char   byte;\n\t       \t         unsigned short  word;\n\t                unsigned long   dword;\n\t                qword           qword;\n\t                float           sreal;\n\t                double          dreal;\n\t                unsigned char   extreal[10];\n\t                unsigned char   bcd[10];\n\t                qword           dqword[2];\n\t                unsigned char   simd[16];\n\t                unsigned char   fpuenv[28];\n\t                void            * address;\n\t                unsigned long   offset;\n\t                x86_reg_t       reg;\n\t                char            relative_near;\n\t       \t         long            relative_far;\n       \t         \tx86_ea_t        expression;\n        \t} data;\n\t\tvoid * insn;\n\t} x86_op_t;\n\n\tunsigned int x86_operand_size( x86_op_t *op );\n\n\tint x86_format_operand(x86_op_t *op, char *buf, int len,\n        \t          enum x86_asm_format format);\n%}\n\n%extend x86_reg_t{\n\tx86_reg_t * aliased_reg( ) {\n\t\tx86_reg_t * reg = (x86_reg_t * )\n\t\t\t\t  calloc( sizeof(x86_reg_t), 1 );\n\t\tx86_reg_from_id( self->id, reg );\n\t\treturn reg;\n\t}\n}\n\n%extend x86_op_t{\n\tsize_t size() {\n\t\treturn x86_operand_size( self );\n\t}\n\tchar * format( enum x86_asm_format format ) {\n\t\tchar *buf, *str;\n\t\tsize_t len;\n\n\t\tswitch ( format ) {\n\t\t\tcase xml_syntax:\n\t\t\t\tlen = MAX_OP_XML_STRING;\n\t\t\t\tbreak;\n\t\t\tcase raw_syntax:\n\t\t\t\tlen = MAX_OP_RAW_STRING;\n\t\t\t\tbreak;\n\t\t\tcase native_syntax:\n\t\t\tcase intel_syntax:\n\t\t\tcase att_syntax:\n\t\t\tcase unknown_syntax:\n\t\t\tdefault:\n\t\t\t\tlen = MAX_OP_STRING;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tbuf = (char * ) calloc( len + 1, 1 );\n\t\tx86_format_operand( self, buf, len, format );\n\n\t\t/* drop buffer down to a reasonable size */\n\t\tstr = strdup( buf );\n\t\tfree(buf);\n\t\treturn str;\n\t}\n\t\n\tint is_address( ) {\n\t\tif ( self->type == op_absolute ||\n\t\t     self->type == op_offset ) {\n\t\t     return 1;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\tint is_relative( ) {\n\t\tif ( self->type == op_relative_near ||\n\t\t     self->type == op_relative_far ) {\n\t\t     return 1;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\t%newobject copy;\n\tx86_op_t * copy() {\n\t\tx86_op_t *op = (x86_op_t *) calloc( sizeof(x86_op_t), 1 );\n\n\t\tif ( op ) {\n\t\t\tmemcpy( op, self, sizeof(x86_op_t) );\n\t\t}\n\n\t\treturn op;\n\t}\n}\n\n/* ================================================================== */\n/* operand list class */\n%inline %{\n\ttypedef struct X86_OpListNode {\n\t\tx86_op_t *op;\n\t\tstruct X86_OpListNode *next, *prev;\n\t} X86_OpListNode;\n\n\ttypedef struct X86_OpList {\n\t\tsize_t count;\n\t\tX86_OpListNode *head, *tail, *curr;\n\t} X86_OpList;\n%}\n\n%extend X86_OpList {\n\tX86_OpList () {\n\t\tX86_OpList *list = (X86_OpList *) \n\t\t\t\tcalloc( sizeof(X86_OpList), 1 );\n\t\tlist->count = 0;\n\t\treturn list;\n\t}\n\n\t~X86_OpList() {\n\t\tX86_OpListNode *node, *next;\n\n\t\tnode = self->head;\n\t\twhile ( node ) {\n\t\t\tnext = node->next;\n\t\t\t/* free( node->insn ); */\n\t\t\tfree( node );\n\t\t\tnode = next;\n\t\t}\n\n\t\tfree( self );\n\t}\n\n\tX86_OpListNode * first() { \n\t\tself->curr = self->head;\n\t\treturn self->head; \n\t}\n\n\tX86_OpListNode * last() { \n\t\tself->curr = self->tail;\n\t\treturn self->tail; \n\t}\n\n\tX86_OpListNode * next() { \n\t\tif (! self->curr ) {\n\t\t\tself->curr = self->head;\n\t\t\treturn self->head;\n\t\t}\n\n\t\tself->curr = self->curr->next;\n\t\treturn self->curr;\n\t}\n\n\tX86_OpListNode * prev() { \n\t\tif (! self->curr ) {\n\t\t\tself->curr = self->tail;\n\t\t\treturn self->tail;\n\t\t}\n\n\t\tself->curr = self->curr->prev;\n\t\treturn self->curr;\n\t}\n\n\t%newobject append;\n\tvoid append( x86_op_t *op ) {\n\t\tX86_OpListNode *node = (X86_OpListNode *)\n\t\t\t\t\tcalloc( sizeof(X86_OpListNode) , 1 );\n\t\tif (! node ) {\n\t\t\treturn;\n\t\t}\n\n\t\tself->count++;\n\t\tif ( ! self->tail ) {\n\t\t\tself->head = self->tail = node;\n\t\t} else {\n\t\t\tself->tail->next = node;\n\t\t\tnode->prev = self->tail;\n\t\t\tself->tail = node;\n\t\t}\n\n\t\tnode->op = x86_op_t_copy( op );\n\t}\n}\n\n%inline %{\n\ttypedef struct x86_operand_list {\n\t\tx86_op_t op;\n\t\tstruct x86_operand_list *next;\n\t} x86_oplist_t;\n%}\n\n%extend x86_oplist_t {\n\t%newobject x86_oplist_node_copy;\n}\n\n/* ================================================================== */\n/* instruction class */\n%inline %{\n\tx86_oplist_t * x86_oplist_node_copy( x86_oplist_t * list ) {\n\t\tx86_oplist_t *ptr;\n\t\tptr = (x86_oplist_t *) calloc( sizeof(x86_oplist_t), 1 );\n\t\tif ( ptr ) {\n\t\t\tmemcpy( &ptr->op, &list->op, sizeof(x86_op_t) );\n\t\t}\n\n\t\treturn ptr;\n\t}\n\n\tenum x86_insn_group {\n\t\tinsn_none = 0, insn_controlflow = 1,\n\t        insn_arithmetic = 2, insn_logic = 3,\n\t        insn_stack = 4, insn_comparison = 5,\n\t        insn_move = 6, insn_string = 7,\n\t        insn_bit_manip = 8, insn_flag_manip = 9,\n\t        insn_fpu = 10, insn_interrupt = 13,\n\t        insn_system = 14, insn_other = 15\n\t};\n\n\tenum x86_insn_type {\n\t\tinsn_invalid = 0, insn_jmp = 0x1001,\n\t        insn_jcc = 0x1002, insn_call = 0x1003,\n\t        insn_callcc = 0x1004, insn_return = 0x1005,\n\t        insn_add = 0x2001, insn_sub = 0x2002,\n\t        insn_mul = 0x2003, insn_div = 0x2004,\n\t        insn_inc = 0x2005, insn_dec = 0x2006,\n\t        insn_shl = 0x2007, insn_shr = 0x2008,\n\t        insn_rol = 0x2009, insn_ror = 0x200A,\n\t        insn_and = 0x3001, insn_or = 0x3002,\n\t        insn_xor = 0x3003, insn_not = 0x3004,\n\t        insn_neg = 0x3005, insn_push = 0x4001,\n\t        insn_pop = 0x4002, insn_pushregs = 0x4003,\n\t        insn_popregs = 0x4004, insn_pushflags = 0x4005,\n\t        insn_popflags = 0x4006, insn_enter = 0x4007,\n\t        insn_leave = 0x4008, insn_test = 0x5001,\n\t        insn_cmp = 0x5002, insn_mov = 0x6001,\n\t        insn_movcc = 0x6002, insn_xchg = 0x6003,\n\t        insn_xchgcc = 0x6004, insn_strcmp = 0x7001,\n\t        insn_strload = 0x7002, insn_strmov = 0x7003,\n\t        insn_strstore = 0x7004, insn_translate = 0x7005,\n\t        insn_bittest = 0x8001, insn_bitset = 0x8002,\n\t        insn_bitclear = 0x8003, insn_clear_carry = 0x9001,\n\t        insn_clear_zero = 0x9002, insn_clear_oflow = 0x9003,\n\t        insn_clear_dir = 0x9004, insn_clear_sign = 0x9005,\n\t        insn_clear_parity = 0x9006, insn_set_carry = 0x9007,\n\t        insn_set_zero = 0x9008, insn_set_oflow = 0x9009,\n\t        insn_set_dir = 0x900A, insn_set_sign = 0x900B,\n\t        insn_set_parity = 0x900C, insn_tog_carry = 0x9010,\n\t        insn_tog_zero = 0x9020, insn_tog_oflow = 0x9030,\n\t        insn_tog_dir = 0x9040, insn_tog_sign = 0x9050,\n\t        insn_tog_parity = 0x9060, insn_fmov = 0xA001,\n\t        insn_fmovcc = 0xA002, insn_fneg = 0xA003,\n\t       \tinsn_fabs = 0xA004, insn_fadd = 0xA005,\n\t        insn_fsub = 0xA006, insn_fmul = 0xA007,\n\t        insn_fdiv = 0xA008, insn_fsqrt = 0xA009,\n\t        insn_fcmp = 0xA00A, insn_fcos = 0xA00C,\n\t        insn_fldpi = 0xA00D, insn_fldz = 0xA00E,\n\t        insn_ftan = 0xA00F, insn_fsine = 0xA010,\n\t        insn_fsys = 0xA020, insn_int = 0xD001,\n\t        insn_intcc = 0xD002,   insn_iret = 0xD003,\n\t        insn_bound = 0xD004, insn_debug = 0xD005,\n\t        insn_trace = 0xD006, insn_invalid_op = 0xD007,\n\t        insn_oflow = 0xD008, insn_halt = 0xE001,\n\t        insn_in = 0xE002, insn_out = 0xE003, \n\t        insn_cpuid = 0xE004, insn_nop = 0xF001,\n\t        insn_bcdconv = 0xF002, insn_szconv = 0xF003 \n\t};\n\n\tenum x86_insn_note {\n\t\tinsn_note_ring0\t\t= 1,\n\t\tinsn_note_smm\t\t= 2,\n\t\tinsn_note_serial\t= 4\n\t};\n\n\tenum x86_flag_status {\n\t        insn_carry_set = 0x1,\n\t        insn_zero_set = 0x2,\n\t        insn_oflow_set = 0x4,\n\t        insn_dir_set = 0x8,\n\t        insn_sign_set = 0x10,\n\t        insn_parity_set = 0x20,\t\n\t        insn_carry_or_zero_set = 0x40,\n\t        insn_zero_set_or_sign_ne_oflow = 0x80,\n\t        insn_carry_clear = 0x100,\n\t        insn_zero_clear = 0x200,\n\t        insn_oflow_clear = 0x400,\n\t        insn_dir_clear = 0x800,\n\t        insn_sign_clear = 0x1000,\n\t        insn_parity_clear = 0x2000,\n\t        insn_sign_eq_oflow = 0x4000,\n\t        insn_sign_ne_oflow = 0x8000\n\t};\n\n\tenum x86_insn_cpu {\n\t\tcpu_8086 \t= 1, cpu_80286\t= 2,\n\t\tcpu_80386\t= 3, cpu_80387\t= 4,\n\t\tcpu_80486\t= 5, cpu_pentium\t= 6,\n\t\tcpu_pentiumpro\t= 7, cpu_pentium2\t= 8,\n\t\tcpu_pentium3\t= 9, cpu_pentium4\t= 10,\n\t\tcpu_k6\t\t= 16, cpu_k7\t\t= 32,\n\t\tcpu_athlon\t= 48\n\t};\n\n\tenum x86_insn_isa {\n\t\tisa_gp\t\t= 1, isa_fp\t\t= 2,\n\t\tisa_fpumgt\t= 3, isa_mmx\t\t= 4,\n\t\tisa_sse1\t= 5, isa_sse2\t= 6,\n\t\tisa_sse3\t= 7, isa_3dnow\t= 8,\n\t\tisa_sys\t\t= 9\t\n\t};\n\t\n\tenum x86_insn_prefix {\n\t        insn_no_prefix = 0,\n\t        insn_rep_zero = 1,\n\t        insn_rep_notzero = 2,\n\t        insn_lock = 4\n\t};\n\n\n\ttypedef struct {\n        \tunsigned long addr;\n\t        unsigned long offset;\n\t        enum x86_insn_group group;\n\t        enum x86_insn_type type;\n\t\tenum x86_insn_note note;\n\t        unsigned char bytes[MAX_INSN_SIZE];\n\t        unsigned char size;\n\t\tunsigned char addr_size;\n\t\tunsigned char op_size;\n\t\tenum x86_insn_cpu cpu;\n\t\tenum x86_insn_isa isa;\n\t        enum x86_flag_status flags_set;\n\t        enum x86_flag_status flags_tested;\n\t\tunsigned char stack_mod;\n\t\tlong stack_mod_val;\n\t        enum x86_insn_prefix prefix;\n\t        char prefix_string[MAX_PREFIX_STR];\n\t        char mnemonic[MAX_MNEM_STR];\n\t        x86_oplist_t *operands;\n\t\tsize_t operand_count;\n\t\tsize_t explicit_count;\n\t        void *block;\n\t        void *function;\n\t        int tag;\n\t} x86_insn_t;\n\n\ttypedef void (*x86_operand_fn)(x86_op_t *op, x86_insn_t *insn, \n\t\t      void *arg);\n\n\tenum x86_op_foreach_type {\n\t\top_any \t= 0,\n\t\top_dest = 1,\n\t\top_src \t= 2,\n\t\top_ro \t= 3,\n\t\top_wo \t= 4,\n\t\top_xo \t= 5,\n\t\top_rw \t= 6,\n\t\top_implicit = 0x10,\n\t\top_explicit = 0x20\n\t};\n\n\tsize_t x86_operand_count( x86_insn_t *insn, \n\t\t\t\tenum x86_op_foreach_type type );\n\tx86_op_t * x86_operand_1st( x86_insn_t *insn );\n\tx86_op_t * x86_operand_2nd( x86_insn_t *insn );\n\tx86_op_t * x86_operand_3rd( x86_insn_t *insn );\n\tlong x86_get_rel_offset( x86_insn_t *insn );\n\tx86_op_t * x86_get_branch_target( x86_insn_t *insn );\n\tx86_op_t * x86_get_imm( x86_insn_t *insn );\n\tunsigned char * x86_get_raw_imm( x86_insn_t *insn );\n\tvoid x86_set_insn_addr( x86_insn_t *insn, unsigned long addr );\n\tint x86_format_mnemonic(x86_insn_t *insn, char *buf, int len,\n                        enum x86_asm_format format);\n\tint x86_format_insn(x86_insn_t *insn, char *buf, int len, \n\t\t\t\tenum x86_asm_format);\n\tvoid x86_oplist_free( x86_insn_t *insn );\n\tint x86_insn_is_valid( x86_insn_t *insn );\n%}\n\n%extend x86_insn_t {\n\tx86_insn_t() {\n\t\tx86_insn_t *insn = (x86_insn_t *)\n\t\t\t\t   calloc( sizeof(x86_insn_t), 1 );\n\t\treturn insn;\n\t}\n\t~x86_insn_t() {\n\t\tx86_oplist_free( self );\n\t\tfree( self );\n\t}\n\n\tint is_valid( ) {\n\t\treturn x86_insn_is_valid( self );\n\t}\n\n\tx86_op_t * operand_1st() {\n\t\treturn x86_operand_1st( self );\n\t}\n\n\tx86_op_t * operand_2nd() {\n\t\treturn x86_operand_2nd( self );\n\t}\n\n\tx86_op_t * operand_3rd() {\n\t\treturn x86_operand_3rd( self );\n\t}\n\n\tx86_op_t * operand_dest() {\n\t\treturn x86_operand_1st( self );\n\t}\n\n\tx86_op_t * operand_src() {\n\t\treturn x86_operand_2nd( self );\n\t}\n\n\tsize_t num_operands( enum x86_op_foreach_type type ) {\n\t\treturn x86_operand_count( self, type );\n\t}\n\n\tlong rel_offset() {\n\t\treturn x86_get_rel_offset( self );\n\t}\n\n\tx86_op_t * branch_target() {\n\t\treturn x86_get_branch_target( self );\n\t}\n\n\tx86_op_t * imm() {\n\t\treturn x86_get_imm( self );\n\t}\n\n\tunsigned char * raw_imm() {\n\t\treturn x86_get_raw_imm( self );\n\t}\n\n\t%newobject format;\n\tchar * format( enum x86_asm_format format ) {\n\t\tchar *buf, *str;\n\t\tsize_t len;\n\n\t\tswitch ( format ) {\n\t\t\tcase xml_syntax:\n\t\t\t\tlen = MAX_INSN_XML_STRING;\n\t\t\t\tbreak;\n\t\t\tcase raw_syntax:\n\t\t\t\tlen = MAX_INSN_RAW_STRING;\n\t\t\t\tbreak;\n\t\t\tcase native_syntax:\n\t\t\tcase intel_syntax:\n\t\t\tcase att_syntax:\n\t\t\tcase unknown_syntax:\n\t\t\tdefault:\n\t\t\t\tlen = MAX_INSN_STRING;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tbuf = (char * ) calloc( len + 1, 1 );\n\t\tx86_format_insn( self, buf, len, format );\n\n\t\t/* drop buffer down to a reasonable size */\n\t\tstr = strdup( buf );\n\t\tfree(buf);\n\t\treturn str;\n\t}\n\n\t%newobject format_mnemonic;\n\tchar * format_mnemonic( enum x86_asm_format format ) {\n\t\tchar *buf, *str;\n\t\tsize_t len = MAX_MNEM_STR + MAX_PREFIX_STR + 4;\n\n\t\tbuf = (char * ) calloc( len, 1 );\n\t\tx86_format_mnemonic( self, buf, len, format );\n\n\t\t/* drop buffer down to a reasonable size */\n\t\tstr = strdup( buf );\n\t\tfree(buf);\n\n\t\treturn str;\n\t}\n\n\t%newobject copy;\n\tx86_insn_t * copy() {\n\t\tx86_oplist_t *ptr, *list, *last = NULL;\n\t\tx86_insn_t *insn = (x86_insn_t *)\n\t\t\t\t   calloc( sizeof(x86_insn_t), 1 );\n\n\t\tif ( insn ) {\n\t\t\tmemcpy( insn, self, sizeof(x86_insn_t) );\n\t\t\tinsn->operands = NULL;\n\t\t\tinsn->block = NULL;\n\t\t\tinsn->function = NULL;\n\n\t\t\t/* copy operand list */\n\t\t\tfor ( list = self->operands; list; list = list->next ) {\n\t\t\t\tptr = x86_oplist_node_copy( list );\n\n\t\t\t\tif (! ptr ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( insn->operands ) {\n\t\t\t\t\tlast->next = ptr;\n\t\t\t\t} else {\n\t\t\t\t\tinsn->operands = ptr;\n\t\t\t\t}\n\t\t\t\tlast = ptr;\n\t\t\t}\n\t\t}\n\n\t\treturn insn;\n\t}\n\n\tX86_OpList * operand_list( ) {\n\t\tx86_oplist_t *list = self->operands;\n\t\tX86_OpList *op_list = new_X86_OpList();\n\n\t\tfor ( list = self->operands; list; list = list->next ) {\n\t\t\tX86_OpList_append( op_list, &list->op );\n\t\t}\n\n\t\treturn op_list;\n\t}\n}\n\n/* ================================================================== */\n/* invariant instruction class */\n%inline %{\n\t#define X86_WILDCARD_BYTE 0xF4\n\n\ttypedef struct {\n        \tenum x86_op_type        type;\n        \tenum x86_op_datatype    datatype;\n        \tenum x86_op_access      access;\n        \tenum x86_op_flags       flags;\n\t} x86_invariant_op_t;\n\n\ttypedef struct {\n\t\tunsigned char bytes[64];\n\t\tunsigned int  size;\n        \tenum x86_insn_group group;\n        \tenum x86_insn_type type;\n\t\tx86_invariant_op_t operands[3];\n\t} x86_invariant_t;\n%}\n\n%extend x86_invariant_t {\n\n\tx86_invariant_t() {\n\t\tx86_invariant_t *inv = (x86_invariant_t *)\n\t\t\t\tcalloc( sizeof(x86_invariant_t), 1 );\n\t\treturn inv;\n\t}\n\n\t~x86_invariant_t() {\n\t\tfree( self );\n\t}\n}\n\n/* ================================================================== */\n/* instruction list class */\n%inline %{\n\ttypedef struct X86_InsnListNode {\n\t\tx86_insn_t *insn;\n\t\tstruct X86_InsnListNode *next, *prev;\n\t} X86_InsnListNode;\n\n\ttypedef struct X86_InsnList {\n\t\tsize_t count;\n\t\tX86_InsnListNode *head, *tail, *curr;\n\t} X86_InsnList;\n%}\n\n%extend X86_InsnList {\n\tX86_InsnList () {\n\t\tX86_InsnList *list = (X86_InsnList *) \n\t\t\t\tcalloc( sizeof(X86_InsnList), 1 );\n\t\tlist->count = 0;\n\t\treturn list;\n\t}\n\n\t~X86_InsnList() {\n\t\tX86_InsnListNode *node, *next;\n\n\t\tnode = self->head;\n\t\twhile ( node ) {\n\t\t\tnext = node->next;\n\t\t\t/* free( node->insn ); */\n\t\t\tfree( node );\n\t\t\tnode = next;\n\t\t}\n\n\t\tfree( self );\n\t}\n\n\tX86_InsnListNode * first() { return self->head; }\n\n\tX86_InsnListNode * last() { return self->tail; }\n\n\tX86_InsnListNode * next() { \n\t\tif (! self->curr ) {\n\t\t\tself->curr = self->head;\n\t\t\treturn self->head;\n\t\t}\n\n\t\tself->curr = self->curr->next;\n\t\treturn self->curr;\n\t}\n\n\tX86_InsnListNode * prev() { \n\t\tif (! self->curr ) {\n\t\t\tself->curr = self->tail;\n\t\t\treturn self->tail;\n\t\t}\n\n\t\tself->curr = self->curr->prev;\n\t\treturn self->curr;\n\t}\n\n\t%newobject append;\n\tvoid append( x86_insn_t *insn ) {\n\t\tX86_InsnListNode *node = (X86_InsnListNode *)\n\t\t\t\t\tcalloc( sizeof(X86_InsnListNode) , 1 );\n\t\tif (! node ) {\n\t\t\treturn;\n\t\t}\n\n\t\tself->count++;\n\t\tif ( ! self->tail ) {\n\t\t\tself->head = self->tail = node;\n\t\t} else {\n\t\t\tself->tail->next = node;\n\t\t\tnode->prev = self->tail;\n\t\t\tself->tail = node;\n\t\t}\n\n\t\tnode->insn = x86_insn_t_copy( insn );\n\t}\n}\n\n/* ================================================================== */\n/* address table class */\n/* slight TODO */\n\n/* ================================================================== */\n/* Main disassembler class */\n%inline %{\n\n\tenum x86_options {\n\t\topt_none= 0,\n\t\topt_ignore_nulls=1,\n\t\topt_16_bit=2\n\t\t};\n\tenum x86_report_codes {\n        \treport_disasm_bounds,\n        \treport_insn_bounds,\n        \treport_invalid_insn,\n        \treport_unknown\n\t};\n\n\n\ttypedef struct {\n\t\tenum x86_report_codes last_error;\n\t\tvoid * last_error_data;\n\t\tvoid * disasm_callback;\n\t\tvoid * disasm_resolver;\n\t} X86_Disasm;\n\n\ttypedef void (*DISASM_REPORTER)( enum x86_report_codes code, \n\t\t\t\t \t void *data, void *arg );\n\ttypedef void (*DISASM_CALLBACK)( x86_insn_t *insn, void * arg );\n\ttypedef long (*DISASM_RESOLVER)( x86_op_t *op, \n\t\t\t\t\t x86_insn_t * current_insn,\n\t\t\t\t \t void *arg );\n\n\tvoid x86_report_error( enum x86_report_codes code, void *data );\n\tint x86_init( enum x86_options options, DISASM_REPORTER reporter, \n\t\t      void *arg);\n\tvoid x86_set_reporter( DISASM_REPORTER reporter, void *arg);\n\tvoid x86_set_options( enum x86_options options );\n\tenum x86_options x86_get_options( void );\n\tint x86_cleanup(void);\n\tint x86_format_header( char *buf, int len, enum x86_asm_format format);\n\tunsigned int x86_endian(void);\n\tunsigned int x86_addr_size(void);\n\tunsigned int x86_op_size(void);\n\tunsigned int x86_word_size(void);\n\tunsigned int x86_max_insn_size(void);\n\tunsigned int x86_sp_reg(void);\n\tunsigned int x86_fp_reg(void);\n\tunsigned int x86_ip_reg(void);\n\tsize_t x86_invariant_disasm( unsigned char *buf, int buf_len, \n\t\t\t  x86_invariant_t *inv );\n\tsize_t x86_size_disasm( unsigned char *buf, unsigned int buf_len );\n\tint x86_disasm( unsigned char *buf, unsigned int buf_len,\n\t                unsigned long buf_rva, unsigned int offset,\n\t                x86_insn_t * insn );\n\tint x86_disasm_range( unsigned char *buf, unsigned long buf_rva,\n\t                      unsigned int offset, unsigned int len,\n\t                      DISASM_CALLBACK func, void *arg );\n\tint x86_disasm_forward( unsigned char *buf, unsigned int buf_len,\n\t                        unsigned long buf_rva, unsigned int offset,\n\t                        DISASM_CALLBACK func, void *arg,\n\t                        DISASM_RESOLVER resolver, void *r_arg );\n\t\n\tvoid x86_default_reporter( enum x86_report_codes code, \n\t\t\t\t   void *data, void *arg ) {\n\t\tX86_Disasm *dis = (X86_Disasm *) arg;\n\t\tif ( dis ) {\n\t\t\tdis->last_error = code;\n\t\t\tdis->last_error_data = data;\n\t\t}\n\t}\n\n\tvoid x86_default_callback( x86_insn_t *insn, void *arg ) {\n\t\tX86_InsnList *list = (X86_InsnList *) arg;\n\t\tif ( list ) {\n\t\t\tX86_InsnList_append( list, insn );\n\t\t}\n\t}\n\n\t/* TODO: resolver stack, maybe a callback */\n\tlong x86_default_resolver( x86_op_t *op, x86_insn_t *insn, void *arg ) {\n\t\tX86_Disasm *dis = (X86_Disasm *) arg;\n\t\tif ( dis ) {\n\t\t\t//return dis->resolver( op, insn );\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n%}\n\n%extend X86_Disasm { \n\t\n\tX86_Disasm( ) {\n\t\tX86_Disasm * dis = (X86_Disasm *)\n\t\t\t\tcalloc( sizeof( X86_Disasm ), 1 );\n\t\tx86_init( opt_none, x86_default_reporter, dis );\n\t\treturn dis;\n\t}\n\n\tX86_Disasm( enum x86_options options ) {\n\t\tX86_Disasm * dis = (X86_Disasm *)\n\t\t\t\tcalloc( sizeof( X86_Disasm ), 1 );\n\t\tx86_init( options, x86_default_reporter, dis );\n\t\treturn dis;\n\t}\n\n\tX86_Disasm( enum x86_options options, DISASM_REPORTER reporter ) {\n\t\tX86_Disasm * dis = (X86_Disasm *)\n\t\t\t\tcalloc( sizeof( X86_Disasm ), 1 );\n\t\tx86_init( options, reporter, NULL );\n\t\treturn dis;\n\t}\n\n\tX86_Disasm( enum x86_options options, DISASM_REPORTER reporter,\n\t\t    void * arg ) {\n\t\tX86_Disasm * dis = (X86_Disasm *)\n\t\t\t\tcalloc( sizeof( X86_Disasm ), 1 );\n\t\tx86_init( options, reporter, arg );\n\t\treturn dis;\n\t}\n\n\t~X86_Disasm() {\n\t\tx86_cleanup();\n\t\tfree( self );\n\t}\n\n\tvoid set_options( enum x86_options options ) {\n\t\treturn x86_set_options( options );\n\t}\n\n\tenum x86_options options() {\n\t\treturn x86_get_options();\n\t}\n\n\tvoid set_callback( void * callback ) {\n\t\tself->disasm_callback = callback;\n\t}\n\n\tvoid set_resolver( void * callback ) {\n\t\tself->disasm_resolver = callback;\n\t}\n\n\tvoid report_error( enum x86_report_codes code ) {\n\t\tx86_report_error( code, NULL );\n\t}\n\n\t%newobject disasm;\n\tx86_insn_t * disasm( unsigned char *buf, size_t buf_len, \n\t\t           unsigned long buf_rva, unsigned int offset ) {\n\t\tx86_insn_t *insn = calloc( sizeof( x86_insn_t ), 1 );\n\t\tx86_disasm( buf, buf_len, buf_rva, offset, insn );\n\t\treturn insn;\n\t}\n\n\tint disasm_range( unsigned char *buf, size_t buf_len, \n\t              unsigned long buf_rva, unsigned int offset,\n\t\t      unsigned int len ) {\n\n\t\tX86_InsnList *list = new_X86_InsnList();\n\n\t\tif ( len > buf_len ) {\n\t\t\tlen = buf_len;\n\t\t}\n\n\t\treturn x86_disasm_range( buf, buf_rva, offset, len, \n\t\t\t\tx86_default_callback, list );\n\t}\n\n\tint disasm_forward( unsigned char *buf, size_t buf_len,\n\t\t\t    unsigned long buf_rva, unsigned int offset ) {\n\t\tX86_InsnList *list = new_X86_InsnList();\n\n\t\t/* use default resolver: damn SWIG callbacks! */\n\t\treturn x86_disasm_forward( buf, buf_len, buf_rva, offset,\n\t\t\t                   x86_default_callback, list, \n\t\t\t\t\t   x86_default_resolver, NULL );\n\t}\n\n\tsize_t disasm_invariant( unsigned char *buf, size_t buf_len, \n\t\t\t  x86_invariant_t *inv ) {\n\t\treturn x86_invariant_disasm( buf, buf_len, inv );\n\t}\n\n\tsize_t disasm_size( unsigned char *buf, size_t buf_len ) {\n\t\treturn x86_size_disasm( buf, buf_len );\n\t}\n\n\t%newobject format_header;\n\tchar * format_header( enum x86_asm_format format) {\n\t\tchar *buf, *str;\n\t\tsize_t len;\n\n\t\tswitch ( format ) {\n\t\t\t/* these were obtained from x86_format.c */\n\t\t\tcase xml_syntax:\n\t\t\t\tlen = 679; break;\n\t\t\tcase raw_syntax:\n\t\t\t\tlen = 172; break;\n\t\t\tcase native_syntax:\n\t\t\t\tlen = 35; break;\n\t\t\tcase intel_syntax:\n\t\t\t\tlen = 23; break;\n\t\t\tcase att_syntax:\n\t\t\t\tlen = 23; break;\n\t\t\tcase unknown_syntax:\n\t\t\tdefault:\n\t\t\t\tlen = 23; break;\n\t\t}\n\n\t\tbuf = (char * ) calloc( len + 1, 1 );\n\t\tx86_format_header( buf, len, format );\n\n\t\treturn buf;\n\t}\n\n\tunsigned int endian() {\n\t\treturn x86_endian();\n\t}\n\n\tunsigned int addr_size() {\n\t\treturn x86_addr_size();\n\t}\n\n\tunsigned int op_size() {\n\t\treturn x86_op_size();\n\t}\n\n\tunsigned int word_size() {\n\t\treturn x86_word_size();\n\t}\n\n\tunsigned int max_insn_size() {\n\t\treturn x86_max_insn_size();\n\t}\n\n\tunsigned int sp_reg() {\n\t\treturn x86_sp_reg();\n\t}\n\n\tunsigned int fp_reg() {\n\t\treturn x86_fp_reg();\n\t}\n\n\tunsigned int ip_reg() {\n\t\treturn x86_ip_reg();\n\t}\n\n\t%newobject reg_from_id;\n\tx86_reg_t * reg_from_id( unsigned int id ) {\n\t\tx86_reg_t * reg = calloc( sizeof(x86_reg_t), 1 );\n\t\tx86_reg_from_id( id, reg );\n\t\treturn reg;\n\t}\n\n\tunsigned char wildcard_byte() { return X86_WILDCARD_BYTE; }\n\n\tint max_register_string() { return MAX_REGNAME; }\n\n\tint max_prefix_string() { return MAX_PREFIX_STR; }\n\n\tint max_mnemonic_string() { return MAX_MNEM_STR; }\n\n\tint max_operand_string( enum x86_asm_format format ) {\n\t\tswitch ( format ) {\n\t\t\tcase xml_syntax:\n\t\t\t\treturn  MAX_OP_XML_STRING;\n\t\t\t\tbreak;\n\t\t\tcase raw_syntax:\n\t\t\t\treturn MAX_OP_RAW_STRING;\n\t\t\t\tbreak;\n\t\t\tcase native_syntax:\n\t\t\tcase intel_syntax:\n\t\t\tcase att_syntax:\n\t\t\tcase unknown_syntax:\n\t\t\tdefault:\n\t\t\t\treturn MAX_OP_STRING;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\n\tint max_insn_string( enum x86_asm_format format ) {\n\t\tswitch ( format ) {\n\t\t\tcase xml_syntax:\n\t\t\t\treturn  MAX_INSN_XML_STRING;\n\t\t\t\tbreak;\n\t\t\tcase raw_syntax:\n\t\t\t\treturn MAX_INSN_RAW_STRING;\n\t\t\t\tbreak;\n\t\t\tcase native_syntax:\n\t\t\tcase intel_syntax:\n\t\t\tcase att_syntax:\n\t\t\tcase unknown_syntax:\n\t\t\tdefault:\n\t\t\t\treturn MAX_INSN_STRING;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tint max_num_operands( ) { return MAX_NUM_OPERANDS; }\n}\n\n/* python callback, per the manual */\n/*%typemap(python,in) PyObject *pyfunc {\n\tif (!PyCallable_Check($source)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"Need a callable object!\");\n \t\treturn NULL;\n\t}\n\t$target = $source;\n}*/\n\n/* python FILE * callback, per the manual */\n/*\n%typemap(python,in) FILE * {\n  if (!PyFile_Check($source)) {\n      PyErr_SetString(PyExc_TypeError, \"Need a file!\");\n      return NULL;\n  }\n  $target = PyFile_AsFile($source);\n}*/\n\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/swig/ruby/extconf.rb",
    "content": "require 'mkmf'\nfind_library('disasm', 'x86_init', \"/usr/local/lib\", \"../..\")\ncreate_makefile('x86disasm')\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/x86_disasm.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"libdis.h\"\n#include \"ia32_insn.h\"\n#include \"ia32_invariant.h\"\n#include \"x86_operand_list.h\"\n\n\n#ifdef _MSC_VER\n        #define snprintf        _snprintf\n        #define inline          __inline\n#endif\n\nunsigned int x86_disasm( unsigned char *buf, unsigned int buf_len,\n                uint32_t buf_rva, unsigned int offset,\n                x86_insn_t *insn ){\n        int len, size;\n\tunsigned char bytes[MAX_INSTRUCTION_SIZE];\n\n        if ( ! buf || ! insn || ! buf_len ) {\n                /* caller screwed up somehow */\n                return 0;\n        }\n\n\n\t/* ensure we are all NULLed up */\n\tmemset( insn, 0, sizeof(x86_insn_t) );\n        insn->addr = buf_rva + offset;\n        insn->offset = offset;\n\t/* default to invalid insn */\n\tinsn->type = insn_invalid;\n\tinsn->group = insn_none;\n\n        if ( offset >= buf_len ) {\n                /* another caller screwup ;) */\n                x86_report_error(report_disasm_bounds, (void*)(long)buf_rva+offset);\n                return 0;\n        }\n\n        len = buf_len - offset;\n\n\t/* copy enough bytes for disassembly into buffer : this\n\t * helps prevent buffer overruns at the end of a file */\n\tmemset( bytes, 0, MAX_INSTRUCTION_SIZE );\n\tmemcpy( bytes, &buf[offset], (len < MAX_INSTRUCTION_SIZE) ? len : \n\t\tMAX_INSTRUCTION_SIZE );\n\n        /* actually do the disassembly */\n\t/* TODO: allow switching when more disassemblers are added */\n        size = ia32_disasm_addr( bytes, len, insn);\n\n        /* check and see if we had an invalid instruction */\n        if (! size ) {\n                x86_report_error(report_invalid_insn, (void*)(long)buf_rva+offset );\n                return 0;\n        }\n\n        /* check if we overran the end of the buffer */\n        if ( size > len ) {\n                x86_report_error( report_insn_bounds, (void*)(long)buf_rva + offset );\n\t\tMAKE_INVALID( insn, bytes );\n\t\treturn 0;\n\t}\n\n        /* fill bytes field of insn */\n        memcpy( insn->bytes, bytes, size );\n\n        return size;\n}\n\nunsigned int x86_disasm_range( unsigned char *buf, uint32_t buf_rva,\n                      unsigned int offset, unsigned int len,\n                      DISASM_CALLBACK func, void *arg ) {\n        x86_insn_t insn;\n        unsigned int buf_len, size, count = 0, bytes = 0;\n\n        /* buf_len is implied by the arguments */\n        buf_len = len + offset;\n\n        while ( bytes < len ) {\n                size = x86_disasm( buf, buf_len, buf_rva, offset + bytes,\n                                   &insn );\n                if ( size ) {\n                        /* invoke callback if it exists */\n                        if ( func ) {\n                                (*func)( &insn, arg );\n                        }\n                        bytes += size;\n                        count ++;\n                } else {\n                        /* error */\n                        bytes++;        /* try next byte */\n                }\n\n\t\tx86_oplist_free( &insn );\n        }\n\n        return( count );\n}\n\nstatic inline int follow_insn_dest( x86_insn_t *insn ) {\n        if ( insn->type == insn_jmp || insn->type == insn_jcc ||\n             insn->type == insn_call || insn->type == insn_callcc ) {\n                return(1);\n        }\n        return(0);\n}\n\nstatic inline int insn_doesnt_return( x86_insn_t *insn ) {\n        return( (insn->type == insn_jmp || insn->type == insn_return) ? 1: 0 );\n}\n\nstatic int32_t internal_resolver( x86_op_t *op, x86_insn_t *insn ){\n        int32_t next_addr = -1;\n        if ( x86_optype_is_address(op->type) ) {\n                next_addr = op->data.sdword;\n        } else if ( op->type == op_relative_near ) {\n\t\tnext_addr = insn->addr + insn->size + op->data.relative_near;\n        } else if ( op->type == op_relative_far ) {\n\t\tnext_addr = insn->addr + insn->size + op->data.relative_far;\n        }\n        return( next_addr );\n}\n\nunsigned int x86_disasm_forward( unsigned char *buf, unsigned int buf_len,\n                        uint32_t buf_rva, unsigned int offset,\n                        DISASM_CALLBACK func, void *arg,\n                        DISASM_RESOLVER resolver, void *r_arg ){\n        x86_insn_t insn;\n        x86_op_t *op;\n        int32_t next_addr;\n        uint32_t next_offset;\n        unsigned int size, count = 0, bytes = 0, cont = 1;\n\n        while ( cont && bytes < buf_len ) {\n                size = x86_disasm( buf, buf_len, buf_rva, offset + bytes,\n                           &insn );\n\n                if ( size ) {\n                        /* invoke callback if it exists */\n                        if ( func ) {\n                                (*func)( &insn, arg );\n                        }\n                        bytes += size;\n                        count ++;\n                } else {\n                        /* error */\n                        bytes++;        /* try next byte */\n                }\n\n                if ( follow_insn_dest(&insn) ) {\n                        op = x86_get_dest_operand( &insn );\n                        next_addr = -1;\n\n                        /* if caller supplied a resolver, use it to determine\n                         * the address to disassemble */\n                        if ( resolver ) {\n                                next_addr = resolver(op, &insn, r_arg);\n                        } else {\n                                next_addr = internal_resolver(op, &insn);\n                        }\n\n                        if (next_addr != -1 ) {\n                                next_offset = next_addr - buf_rva;\n                                /* if offset is in this buffer... */\n                                if ( next_offset >= 0 &&\n                                     next_offset < buf_len ) {\n                                        /* go ahead and disassemble */\n                                        count += x86_disasm_forward( buf,\n                                                            buf_len,\n                                                            buf_rva,\n                                                            next_offset,\n                                                            func, arg,\n                                                            resolver, r_arg );\n                                } else  {\n                                        /* report unresolved address */\n                                        x86_report_error( report_disasm_bounds,\n                                                     (void*)(long)next_addr );\n                                }\n                        }\n                } /* end follow_insn */\n\n                if ( insn_doesnt_return(&insn) ) {\n                        /* stop disassembling */\n                        cont = 0;\n                }\n\n\t\tx86_oplist_free( &insn );\n        }\n        return( count );\n}\n\n/* invariant instruction representation */\nsize_t x86_invariant_disasm( unsigned char *buf, int buf_len, \n\t\tx86_invariant_t *inv ){\n\tif (! buf || ! buf_len || ! inv  ) {\n\t\treturn(0);\n\t}\n\n\treturn ia32_disasm_invariant(buf, buf_len, inv);\n}\nsize_t x86_size_disasm( unsigned char *buf, unsigned int buf_len ) {\n\tif (! buf || ! buf_len  ) {\n\t\treturn(0);\n\t}\n\n\treturn ia32_disasm_size(buf, buf_len);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/x86_format.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"libdis.h\"\n#include <inttypes.h>\n\n#ifdef _MSC_VER\n        #define snprintf        _snprintf\n        #define inline          __inline\n#endif\n\n\n/*\n * concatenation macros.  STRNCATF concatenates a format string, buf\n * only with one argument.\n */\n#define STRNCAT( buf, str, len ) do {   \t\t\t\t\\\n\tint _i = strlen(str), _blen = strlen(buf), _len = len - 1;  \t\\\n\tif ( len ) {\t\t\t\t\t\t\t\\\n        \tstrncat( buf, str, _len );  \t\t\t\t\\\n\t\tif ( _len <= _i ) {\t\t\t\t\t\\\n\t\t\tbuf[_blen+_len] = '\\0';\t\t\t\t\\\n\t\t\tlen = 0;\t\t\t\t\t\\\n\t\t} else {\t\t\t\t\t\t\\\n\t\t\tlen -= _i;\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\\\n} while( 0 )\n\n#define STRNCATF( buf, fmt, data, len ) do {        \\\n        char _tmp[MAX_OP_STRING];                   \\\n                                                    \\\n        snprintf( _tmp, sizeof _tmp, fmt, data );   \\\n        STRNCAT( buf, _tmp, len );                  \\\n} while( 0 )\n\n\n#define PRINT_DISPLACEMENT( ea ) do {                            \\\n        if ( ea->disp_size && ea->disp ) {                       \\\n                if ( ea->disp_sign ) {    \\\n                        STRNCATF( buf, \"-0x%\" PRIX32, -ea->disp, len );    \\\n                } else {                                         \\\n                        STRNCATF( buf, \"0x%\" PRIX32, ea->disp, len );  \\\n                }                                                \\\n        }                                                        \\\n} while( 0 )\n\nstatic const char *prefix_strings[] = {\n\t\"\",     /* no prefix */\n\t\"repz \", /* the trailing spaces make it easy to prepend to mnemonic */\n\t\"repnz \",\n\t\"lock \",\n\t\"branch delay \" /* unused in x86 */\n};\n\nstatic int format_insn_prefix_str( enum x86_insn_prefix prefix, char *buf,\n                                   int len ) {\n\n        int len_orig = len;\n\n        /* concat all prefix strings */\n        if ( prefix & 1 ) { STRNCAT( buf, prefix_strings[1], len ); }\n        if ( prefix & 2 ) { STRNCAT( buf, prefix_strings[2], len ); }\n        if ( prefix & 4 ) { STRNCAT( buf, prefix_strings[3], len ); }\n        if ( prefix & 8 ) { STRNCAT( buf, prefix_strings[4], len ); }\n\n        /* return the number of characters added */\n        return (len_orig - len);\n}\n\n/*\n * sprint's an operand's data to string str.\n */\nstatic void get_operand_data_str( x86_op_t *op, char *str, int len ){\n\n        if ( op->flags & op_signed ) {\n                switch ( op->datatype ) {\n                        case op_byte:\n                                snprintf( str, len, \"%\" PRId8, op->data.sbyte );\n                                return;\n                        case op_word:\n                                snprintf( str, len, \"%\" PRId16, op->data.sword );\n                                return;\n                        case op_qword:\n                                snprintf( str, len, \"%\" PRId64, op->data.sqword );\n                                return;\n                        default:\n                                snprintf( str, len, \"%\" PRId32, op->data.sdword );\n                                return;\n                }\n        }\n\n        //else\n        switch ( op->datatype ) {\n                case op_byte:\n                        snprintf( str, len, \"0x%02\" PRIX8, op->data.byte );\n                        return;\n                case op_word:\n                        snprintf( str, len, \"0x%04\" PRIX16, op->data.word );\n                        return;\n                case op_qword:\n                        snprintf( str, len, \"0x%08\" PRIX64,op->data.sqword );\n                        return;\n                default:\n                        snprintf( str, len, \"0x%08\" PRIX32, op->data.dword );\n                        return;\n        }\n}\n\n/*\n * sprints register types to a string.  the register types can be ORed\n * together.\n */\nstatic void get_operand_regtype_str( int regtype, char *str, int len )\n{\n        static struct {\n                const char *name;\n                int value;\n        } operand_regtypes[] = {\n                {\"reg_gen\"    , 0x00001},\n                {\"reg_in\"     , 0x00002},\n                {\"reg_out\"    , 0x00004},\n                {\"reg_local\"  , 0x00008},\n                {\"reg_fpu\"    , 0x00010},\n                {\"reg_seg\"    , 0x00020},\n                {\"reg_simd\"   , 0x00040},\n                {\"reg_sys\"    , 0x00080},\n                {\"reg_sp\"     , 0x00100},\n                {\"reg_fp\"     , 0x00200},\n                {\"reg_pc\"     , 0x00400},\n                {\"reg_retaddr\", 0x00800},\n                {\"reg_cond\"   , 0x01000},\n                {\"reg_zero\"   , 0x02000},\n                {\"reg_ret\"    , 0x04000},\n                {\"reg_src\"    , 0x10000},\n                {\"reg_dest\"   , 0x20000},\n                {\"reg_count\"  , 0x40000},\n                {NULL, 0}, //end\n        };\n\n        unsigned int i;\n\n        memset( str, 0, len );\n\n        //go thru every type in the enum\n        for ( i = 0; operand_regtypes[i].name; i++ ) {\n                //skip if type is not set\n                if(! (regtype & operand_regtypes[i].value) )\n                        continue;\n\n                //not the first time around\n                if( str[0] ) {\n                        STRNCAT( str, \" \", len );\n                }\n\n                STRNCAT(str, operand_regtypes[i].name, len );\n        }\n}\n\nstatic int format_expr( x86_ea_t *ea, char *buf, int len,\n                        enum x86_asm_format format ) {\n        char str[MAX_OP_STRING];\n\n        if ( format == att_syntax ) {\n\t\tif (ea->base.name[0] || ea->index.name[0] || ea->scale) {\n               \t\tPRINT_DISPLACEMENT(ea);\n\t                STRNCAT( buf, \"(\", len );\n\n\t                if ( ea->base.name[0]) {\n\t                        STRNCATF( buf, \"%%%s\", ea->base.name, len );\n\t                }\n\t                if ( ea->index.name[0]) {\n\t                        STRNCATF( buf, \",%%%s\", ea->index.name, len );\n\t                        if ( ea->scale > 1 ) {\n\t                                STRNCATF( buf, \",%d\", ea->scale, len );\n\t                        }\n\t                }\n\t                /* handle the syntactic exception */\n\t                if ( ! ea->base.name[0] &&\n\t                     ! ea->index.name[0]   ) {\n\t                        STRNCATF( buf, \",%d\", ea->scale, len );\n\t                }\n\n\t                STRNCAT( buf, \")\", len );\n\t\t} else\n\t\t\tSTRNCATF( buf, \"0x%\" PRIX32, ea->disp, len );\n\n        } else if ( format == xml_syntax ){\n\n                if ( ea->base.name[0]) {\n                        STRNCAT (buf, \"\\t\\t\\t<base>\\n\", len);\n\n                        get_operand_regtype_str (ea->base.type, str,\n                                                 sizeof str);\n                        STRNCAT (buf, \"\\t\\t\\t\\t<register \", len);\n                        STRNCATF (buf, \"name=\\\"%s\\\" \", ea->base.name, len);\n                        STRNCATF (buf, \"type=\\\"%s\\\" \", str, len);\n                        STRNCATF (buf, \"size=%d/>\\n\", ea->base.size, len);\n\n                        STRNCAT (buf, \"\\t\\t\\t</base>\\n\", len);\n                }\n\n                if ( ea->index.name[0]) {\n                        STRNCAT (buf, \"\\t\\t\\t<index>\\n\", len);\n\n                        get_operand_regtype_str (ea->index.type, str,\n                                                 sizeof str);\n\n                        STRNCAT (buf, \"\\t\\t\\t\\t<register \", len);\n                        STRNCATF (buf, \"name=\\\"%s\\\" \", ea->index.name, len);\n                        STRNCATF (buf, \"type=\\\"%s\\\" \", str, len);\n                        STRNCATF (buf, \"size=%d/>\\n\", ea->index.size, len);\n\n                        STRNCAT (buf, \"\\t\\t\\t</index>\\n\", len);\n                }\n\n                //scale\n                STRNCAT (buf, \"\\t\\t\\t<scale>\\n\", len);\n                STRNCAT (buf, \"\\t\\t\\t\\t<immediate \", len);\n                STRNCATF (buf, \"value=\\\"%d\\\"/>\\n\", ea->scale, len);\n                STRNCAT (buf, \"\\t\\t\\t</scale>\\n\", len);\n\n                if ( ea->disp_size ) {\n\n                        STRNCAT (buf, \"\\t\\t\\t<displacement>\\n\", len);\n\n                        if ( ea->disp_size > 1 && ! ea->disp_sign ) {\n                                STRNCAT (buf, \"\\t\\t\\t\\t<address \", len);\n                                STRNCATF (buf, \"value=\\\"0x%\" PRIX32 \"\\\"/>\\n\", ea->disp,\n                                          len);\n                        } else {\n                                STRNCAT (buf, \"\\t\\t\\t\\t<immediate \", len);\n                                STRNCATF (buf, \"value=%\" PRId32 \"/>\\n\", ea->disp, len);\n                        }\n\n                        STRNCAT (buf, \"\\t\\t\\t</displacement>\\n\", len);\n                }\n\n        } else if ( format == raw_syntax ) {\n\n                PRINT_DISPLACEMENT(ea);\n                STRNCAT( buf, \"(\", len );\n\n                STRNCATF( buf, \"%s,\", ea->base.name, len );\n                STRNCATF( buf, \"%s,\", ea->index.name, len );\n                STRNCATF( buf, \"%d\", ea->scale, len );\n                STRNCAT( buf, \")\", len );\n\n        } else {\n\n                STRNCAT( buf, \"[\", len );\n\n                if ( ea->base.name[0] ) {\n                        STRNCAT( buf, ea->base.name, len );\n                        if ( ea->index.name[0] ||\n                             (ea->disp_size && ! ea->disp_sign) ) {\n                                STRNCAT( buf, \"+\", len );\n                        }\n                }\n                if ( ea->index.name[0] ) {\n                        STRNCAT( buf, ea->index.name, len );\n                        if ( ea->scale > 1 )\n                        {\n                                STRNCATF( buf, \"*%\" PRId32, ea->scale, len );\n                        }\n                        if ( ea->disp_size && ! ea->disp_sign )\n                        {\n                                STRNCAT( buf, \"+\", len );\n                        }\n                }\n\n                if ( ea->disp_size || (! ea->index.name[0] && \n\t\t\t\t\t! ea->base.name[0] ) )\n                {\n                        PRINT_DISPLACEMENT(ea);\n                }\n\n                STRNCAT( buf, \"]\", len );\n        }\n\n        return( strlen(buf) );\n}\n\nstatic int format_seg( x86_op_t *op, char *buf, int len,\n                       enum x86_asm_format format ) {\n        int len_orig = len;\n        const char *reg = \"\";\n\n        if (! op || ! buf || ! len || ! op->flags) {\n                return(0);\n        }\n        if ( op->type != op_offset && op->type != op_expression ){\n                return(0);\n        }\n        if (! ((int) op->flags & 0xF00) ) {\n                return(0);\n        }\n\n        switch (op->flags & 0xF00) {\n                case op_es_seg: reg = \"es\"; break;\n                case op_cs_seg: reg = \"cs\"; break;\n                case op_ss_seg: reg = \"ss\"; break;\n                case op_ds_seg: reg = \"ds\"; break;\n                case op_fs_seg: reg = \"fs\"; break;\n                case op_gs_seg: reg = \"gs\"; break;\n                default:\n                        break;\n        }\n\n        if (! reg[0] ) {\n                return( 0 );\n        }\n\n        switch( format ) {\n                case xml_syntax:\n                        STRNCAT( buf, \"\\t\\t\\t<segment \", len );\n                        STRNCATF( buf, \"value=\\\"%s\\\"/>\\n\", reg, len );\n                        break;\n                case att_syntax:\n                        STRNCATF( buf, \"%%%s:\", reg, len );\n                        break;\n\n                default:\n                        STRNCATF( buf, \"%s:\", reg, len );\n                        break;\n        }\n\n        return( len_orig - len ); /* return length of appended string */\n}\n\nstatic const char *get_operand_datatype_str( x86_op_t *op ){\n\n        static const char *types[] = {\n                \"sbyte\",\t\t/* 0 */\n                \"sword\",\n                \"sqword\",\n                \"sdword\",\n                \"sdqword\",\t\t/* 4 */\n                \"byte\",\n                \"word\",\n                \"qword\",\n                \"dword\",\t\t/* 8 */\n                \"dqword\",\n\t\t\"sreal\",\n\t\t\"dreal\",\n\t\t\"extreal\",\t\t/* 12 */\n\t\t\"bcd\",\n\t\t\"ssimd\",\n\t\t\"dsimd\",\n\t\t\"sssimd\",\t\t/* 16 */\n\t\t\"sdsimd\",\n\t\t\"descr32\",\n\t\t\"descr16\",\n\t\t\"pdescr32\",\t\t/* 20 */\n\t\t\"pdescr16\",\n\t\t\"bounds16\",\n\t\t\"bounds32\",\n\t\t\"fpu_env16\",\n\t\t\"fpu_env32\",\t\t/* 25 */\n\t\t\"fpu_state16\",\n\t\t\"fpu_state32\",\n\t\t\"fp_reg_set\"\n        };\n\n\t/* handle signed values first */\n        if ( op->flags & op_signed ) {\n                switch (op->datatype) {\n                        case op_byte:  return types[0];\n                        case op_word:  return types[1];\n                        case op_qword: return types[2];\n                \tcase op_dqword: return types[4];\n                        default:       return types[3];\n                }\n        }\n\n        switch (op->datatype) {\n                case op_byte:   \treturn types[5];\n                case op_word:   \treturn types[6];\n                case op_qword:  \treturn types[7];\n                case op_dqword: \treturn types[9];\n\t\tcase op_sreal:\t\treturn types[10];\n\t\tcase op_dreal:\t\treturn types[11];\n\t\tcase op_extreal:\treturn types[12];\n\t\tcase op_bcd:\t\treturn types[13];\n\t\tcase op_ssimd:\t\treturn types[14];\n\t\tcase op_dsimd:\t\treturn types[15];\n\t\tcase op_sssimd:\t\treturn types[16];\n\t\tcase op_sdsimd:\t\treturn types[17];\n\t\tcase op_descr32:\treturn types[18];\n\t\tcase op_descr16:\treturn types[19];\n\t\tcase op_pdescr32:\treturn types[20];\n\t\tcase op_pdescr16:\treturn types[21];\n\t\tcase op_bounds16:\treturn types[22];\n\t\tcase op_bounds32:\treturn types[23];\n\t\tcase op_fpustate16: \treturn types[24];\n\t\tcase op_fpustate32: \treturn types[25];\n\t\tcase op_fpuenv16: \treturn types[26];\n\t\tcase op_fpuenv32: \treturn types[27];\n\t\tcase op_fpregset: \treturn types[28];\n                default:        \treturn types[8];\n        }\n}\n\nstatic int format_insn_eflags_str( enum x86_flag_status flags, char *buf,\n                                   int len) {\n\n        static struct {\n                const char *name;\n                int  value;\n        } insn_flags[] = {\n                { \"carry_set \",                 0x0001 },\n                { \"zero_set \",                  0x0002 },\n                { \"oflow_set \",                 0x0004 },\n                { \"dir_set \",                   0x0008 },\n                { \"sign_set \",                  0x0010 },\n                { \"parity_set \",                0x0020 },\n                { \"carry_or_zero_set \",         0x0040 },\n                { \"zero_set_or_sign_ne_oflow \", 0x0080 },\n                { \"carry_clear \",               0x0100 },\n                { \"zero_clear \",                0x0200 },\n                { \"oflow_clear \",               0x0400 },\n                { \"dir_clear \",                 0x0800 },\n                { \"sign_clear \",                0x1000 },\n                { \"parity_clear \",              0x2000 },\n                { \"sign_eq_oflow \",             0x4000 },\n                { \"sign_ne_oflow \",             0x8000 },\n                { NULL,                         0x0000 }, //end\n        };\n\n        unsigned int i;\n        int len_orig = len;\n\n        for (i = 0; insn_flags[i].name; i++) {\n                if (! (flags & insn_flags[i].value) )\n                        continue;\n\n                STRNCAT( buf, insn_flags[i].name, len );\n        }\n\n        return( len_orig - len );\n}\n\nstatic const char *get_insn_group_str( enum x86_insn_group gp ) {\n\n        static const char *types[] = {\n                \"\",           // 0\n                \"controlflow\",// 1\n                \"arithmetic\", // 2\n                \"logic\",      // 3\n                \"stack\",      // 4\n                \"comparison\", // 5\n                \"move\",       // 6\n                \"string\",     // 7\n                \"bit_manip\",  // 8\n                \"flag_manip\", // 9\n                \"fpu\",        // 10\n                \"\",           // 11\n                \"\",           // 12\n                \"interrupt\",  // 13\n                \"system\",     // 14\n                \"other\",      // 15\n        };\n\n        if ( gp > sizeof (types)/sizeof(types[0]) )\n                return \"\";\n\n        return types[gp];\n}\n\nstatic const char *get_insn_type_str( enum x86_insn_type type ) {\n\n        static struct {\n                const char *name;\n                int  value;\n        } types[] = {\n                /* insn_controlflow */\n                { \"jmp\", 0x1001 },\n                { \"jcc\", 0x1002 },\n                { \"call\", 0x1003 },\n                { \"callcc\", 0x1004 },\n                { \"return\", 0x1005 },\n                { \"loop\", 0x1006 },\n                /* insn_arithmetic */\n                { \"add\", 0x2001 },\n                { \"sub\", 0x2002 },\n                { \"mul\", 0x2003 },\n                { \"div\", 0x2004 },\n                { \"inc\", 0x2005 },\n                { \"dec\", 0x2006 },\n                { \"shl\", 0x2007 },\n                { \"shr\", 0x2008 },\n                { \"rol\", 0x2009 },\n                { \"ror\", 0x200A },\n                /* insn_logic */\n                { \"and\", 0x3001 },\n                { \"or\", 0x3002 },\n                { \"xor\", 0x3003 },\n                { \"not\", 0x3004 },\n                { \"neg\", 0x3005 },\n                /* insn_stack */\n                { \"push\", 0x4001 },\n                { \"pop\", 0x4002 },\n                { \"pushregs\", 0x4003 },\n                { \"popregs\", 0x4004 },\n                { \"pushflags\", 0x4005 },\n                { \"popflags\", 0x4006 },\n                { \"enter\", 0x4007 },\n                { \"leave\", 0x4008 },\n                /* insn_comparison */\n                { \"test\", 0x5001 },\n                { \"cmp\", 0x5002 },\n                /* insn_move */\n                { \"mov\", 0x6001 },      /* move */\n                { \"movcc\", 0x6002 },    /* conditional move */\n                { \"xchg\", 0x6003 },     /* exchange */\n                { \"xchgcc\", 0x6004 },   /* conditional exchange */\n                /* insn_string */\n                { \"strcmp\", 0x7001 },\n                { \"strload\", 0x7002 },\n                { \"strmov\", 0x7003 },\n                { \"strstore\", 0x7004 },\n                { \"translate\", 0x7005 },        /* xlat */\n                /* insn_bit_manip */\n                { \"bittest\", 0x8001 },\n                { \"bitset\", 0x8002 },\n                { \"bitclear\", 0x8003 },\n                /* insn_flag_manip */\n                { \"clear_carry\", 0x9001 },\n                { \"clear_zero\", 0x9002 },\n                { \"clear_oflow\", 0x9003 },\n                { \"clear_dir\", 0x9004 },\n                { \"clear_sign\", 0x9005 },\n                { \"clear_parity\", 0x9006 },\n                { \"set_carry\", 0x9007 },\n                { \"set_zero\", 0x9008 },\n                { \"set_oflow\", 0x9009 },\n                { \"set_dir\", 0x900A },\n                { \"set_sign\", 0x900B },\n                { \"set_parity\", 0x900C },\n                { \"tog_carry\", 0x9010 },\n                { \"tog_zero\", 0x9020 },\n                { \"tog_oflow\", 0x9030 },\n                { \"tog_dir\", 0x9040 },\n                { \"tog_sign\", 0x9050 },\n                { \"tog_parity\", 0x9060 },\n                /* insn_fpu */\n                { \"fmov\", 0xA001 },\n                { \"fmovcc\", 0xA002 },\n                { \"fneg\", 0xA003 },\n                { \"fabs\", 0xA004 },\n                { \"fadd\", 0xA005 },\n                { \"fsub\", 0xA006 },\n                { \"fmul\", 0xA007 },\n                { \"fdiv\", 0xA008 },\n                { \"fsqrt\", 0xA009 },\n                { \"fcmp\", 0xA00A },\n                { \"fcos\", 0xA00C },\n                { \"fldpi\", 0xA00D },\n                { \"fldz\", 0xA00E },\n                { \"ftan\", 0xA00F },\n                { \"fsine\", 0xA010 },\n                { \"fsys\", 0xA020 },\n                /* insn_interrupt */\n                { \"int\", 0xD001 },\n                { \"intcc\", 0xD002 },    /* not present in x86 ISA */\n                { \"iret\", 0xD003 },\n                { \"bound\", 0xD004 },\n                { \"debug\", 0xD005 },\n                { \"trace\", 0xD006 },\n                { \"invalid_op\", 0xD007 },\n                { \"oflow\", 0xD008 },\n                /* insn_system */\n                { \"halt\", 0xE001 },\n                { \"in\", 0xE002 },       /* input from port/bus */\n                { \"out\", 0xE003 },      /* output to port/bus */\n                { \"cpuid\", 0xE004 },\n                /* insn_other */\n                { \"nop\", 0xF001 },\n                { \"bcdconv\", 0xF002 },  /* convert to or from BCD */\n                { \"szconv\", 0xF003 },   /* change size of operand */\n                { NULL, 0 }, //end\n        };\n\n        unsigned int i;\n\n        //go thru every type in the enum\n        for ( i = 0; types[i].name; i++ ) {\n                if ( types[i].value == type )\n                        return types[i].name;\n        }\n\n        return \"\";\n}\n\nstatic const char *get_insn_cpu_str( enum x86_insn_cpu cpu ) {\n        static const char *intel[] = {\n                \"\",           \t\t// 0\n                \"8086\",           \t// 1\n                \"80286\",           \t// 2\n                \"80386\",           \t// 3\n                \"80387\",           \t// 4\n                \"80486\",           \t// 5\n                \"Pentium\",           \t// 6\n                \"Pentium Pro\",          // 7\n                \"Pentium 2\",           \t// 8\n                \"Pentium 3\",           \t// 9\n                \"Pentium 4\"           \t// 10\n        };\n\n        if ( cpu < sizeof(intel)/sizeof(intel[0]) ) {\n\t\treturn intel[cpu];\n\t} else if ( cpu == 16 ) {\n\t\treturn \"K6\";\n\t} else if ( cpu == 32 ) {\n\t\treturn \"K7\";\n\t} else if ( cpu == 48 ) {\n\t\treturn \"Athlon\";\n\t}\n\n        return \"\";\n}\n\nstatic const char *get_insn_isa_str( enum x86_insn_isa isa ) {\n        static const char *subset[] = {\n\t\tNULL,\t\t\t\t// 0\n                \"General Purpose\",           \t// 1\n                \"Floating Point\",           \t// 2\n                \"FPU Management\",           \t// 3\n                \"MMX\",           \t\t// 4\n                \"SSE\",           \t\t// 5\n                \"SSE2\",           \t\t// 6\n                \"SSE3\",           \t\t// 7\n                \"3DNow!\",           \t\t// 8\n                \"System\"           \t\t// 9\n        };\n\n        if ( isa > sizeof (subset)/sizeof(subset[0]) ) {\n                return \"\";\n\t}\n\n        return subset[isa];\n}\n\nstatic int format_operand_att( x86_op_t *op, x86_insn_t *insn, char *buf,\n                               int len){\n\n        char str[MAX_OP_STRING];\n\n        memset (str, 0, sizeof str);\n\n        switch ( op->type ) {\n                case op_register:\n                        STRNCATF( buf, \"%%%s\", op->data.reg.name, len );\n                        break;\n\n                case op_immediate:\n                        get_operand_data_str( op, str, sizeof str );\n                        STRNCATF( buf, \"$%s\", str, len );\n                        break;\n\n                case op_relative_near: \n                        STRNCATF( buf, \"0x%08X\",\n                                 (unsigned int)(op->data.sbyte +\n                                 insn->addr + insn->size), len );\n                        break;\n\n\t\tcase op_relative_far:\n                        if (op->datatype == op_word) {\n                                STRNCATF( buf, \"0x%08X\",\n                                          (unsigned int)(op->data.sword +\n                                          insn->addr + insn->size), len );\n                        } else {\n                        \tSTRNCATF( buf, \"0x%08X\",\n                                  \t(unsigned int)(op->data.sdword +\n                                  \tinsn->addr + insn->size), len );\n\t\t\t}\n                        break;\n\n                case op_absolute:\n\t\t\t/* ATT uses the syntax $section, $offset */\n                        STRNCATF( buf, \"$0x%04\" PRIX16 \", \", op->data.absolute.segment,\n\t\t\t\tlen );\n\t\t\tif (op->datatype == op_descr16) {\n                        \tSTRNCATF( buf, \"$0x%04\" PRIX16, \n\t\t\t\t\top->data.absolute.offset.off16, len );\n\t\t\t} else {\n                        \tSTRNCATF( buf, \"$0x%08\" PRIX32, \n\t\t\t\t\top->data.absolute.offset.off32, len );\n\t\t\t}\n                        break;\n                case op_offset:\n                        /* ATT requires a '*' before JMP/CALL ops */\n                        if (insn->type == insn_jmp || insn->type == insn_call)\n                                STRNCAT( buf, \"*\", len );\n\n                        len -= format_seg( op, buf, len, att_syntax );\n                        STRNCATF( buf, \"0x%08\" PRIX32, op->data.sdword, len );\n                        break;\n\n                case op_expression:\n                        /* ATT requires a '*' before JMP/CALL ops */\n                        if (insn->type == insn_jmp || insn->type == insn_call)\n                                STRNCAT( buf, \"*\", len );\n\n                        len -= format_seg( op, buf, len, att_syntax );\n                        len -= format_expr( &op->data.expression, buf, len,\n                                     att_syntax );\n                        break;\n                case op_unused:\n                case op_unknown:\n                        /* return 0-truncated buffer */\n                        break;\n        }\n\n        return ( strlen( buf ) );\n}\n\nstatic int format_operand_native( x86_op_t *op, x86_insn_t *insn, char *buf,\n                                  int len){\n\n        char str[MAX_OP_STRING];\n\n        switch (op->type) {\n                case op_register:\n                        STRNCAT( buf, op->data.reg.name, len );\n                        break;\n\n                case op_immediate:\n                        get_operand_data_str( op, str, sizeof str );\n                        STRNCAT( buf, str, len );\n                        break;\n\n                case op_relative_near:\n                        STRNCATF( buf, \"0x%08\" PRIX32,\n                                  (unsigned int)(op->data.sbyte +\n                                  insn->addr + insn->size), len );\n                        break;\n\n                case op_relative_far:\n                        if ( op->datatype == op_word ) {\n                                STRNCATF( buf, \"0x%08\" PRIX32,\n                                          (unsigned int)(op->data.sword +\n                                          insn->addr + insn->size), len );\n                                break;\n                        } else {\n                        \tSTRNCATF( buf, \"0x%08\" PRIX32, op->data.sdword +\n                                \t  insn->addr + insn->size, len );\n\t\t\t}\n                        break;\n\n                case op_absolute:\n                        STRNCATF( buf, \"$0x%04\" PRIX16 \":\", op->data.absolute.segment,\n\t\t\t\tlen );\n\t\t\tif (op->datatype == op_descr16) {\n                        \tSTRNCATF( buf, \"0x%04\" PRIX16, \n\t\t\t\t\top->data.absolute.offset.off16, len );\n\t\t\t} else {\n                        \tSTRNCATF( buf, \"0x%08\" PRIX32, \n\t\t\t\t\top->data.absolute.offset.off32, len );\n\t\t\t}\n                        break;\n\n                case op_offset:\n                        len -= format_seg( op, buf, len, native_syntax );\n                        STRNCATF( buf, \"[0x%08\" PRIX32 \"]\", op->data.sdword, len );\n                        break;\n\n                case op_expression:\n                        len -= format_seg( op, buf, len, native_syntax );\n                        len -= format_expr( &op->data.expression, buf, len,\n                                     native_syntax );\n                        break;\n                case op_unused:\n                case op_unknown:\n                        /* return 0-truncated buffer */\n                        break;\n        }\n\n        return( strlen( buf ) );\n}\n\nstatic int format_operand_xml( x86_op_t *op, x86_insn_t *insn, char *buf,\n                               int len){\n\n        char str[MAX_OP_STRING] = \"\\0\";\n\n        switch (op->type) {\n                case op_register:\n\n                        get_operand_regtype_str( op->data.reg.type, str,\n                                                 sizeof str );\n\n                        STRNCAT( buf, \"\\t\\t<register \", len );\n                        STRNCATF( buf, \"name=\\\"%s\\\" \", op->data.reg.name, len );\n                        STRNCATF( buf, \"type=\\\"%s\\\" \", str, len );\n                        STRNCATF( buf, \"size=%d/>\\n\", op->data.reg.size, len );\n                        break;\n\n                case op_immediate:\n\n                        get_operand_data_str( op, str, sizeof str );\n\n                        STRNCAT( buf, \"\\t\\t<immediate \", len );\n                        STRNCATF( buf, \"type=\\\"%s\\\" \",\n                                  get_operand_datatype_str (op), len );\n                        STRNCATF( buf, \"value=\\\"%s\\\"/>\\n\", str, len );\n                        break;\n\n                case op_relative_near:\n                        STRNCAT( buf, \"\\t\\t<relative_offset \", len );\n\n                        STRNCATF( buf, \"value=\\\"0x%08\" PRIX32 \"\\\"/>\\n\",\n                                  (unsigned int)(op->data.sbyte +\n                                  insn->addr + insn->size), len );\n                        break;\n\n                case op_relative_far:\n                        STRNCAT( buf, \"\\t\\t<relative_offset \", len );\n\n                        if (op->datatype == op_word) {\n                                STRNCATF( buf, \"value=\\\"0x%08\" PRIX32 \"\\\"/>\\n\",\n                                          (unsigned int)(op->data.sword +\n                                          insn->addr + insn->size), len);\n                                break;\n                        } else {\n\n                        \tSTRNCATF( buf, \"value=\\\"0x%08\" PRIX32 \"\\\"/>\\n\",\n                                      op->data.sdword + insn->addr + insn->size,\n                                      len );\n\t\t\t}\n                        break;\n\n                case op_absolute:\n\n                        STRNCATF( buf, \n\t\t\t\t\"\\t\\t<absolute_address segment=\\\"0x%04\" PRIX16 \"\\\"\",\n                        \top->data.absolute.segment, len );\n\n\t\t\tif (op->datatype == op_descr16) {\n                        \tSTRNCATF( buf, \"offset=\\\"0x%04\" PRIX16 \"\\\">\", \n\t\t\t\t\top->data.absolute.offset.off16, len );\n\t\t\t} else {\n                        \tSTRNCATF( buf, \"offset=\\\"0x%08\" PRIX32 \"\\\">\", \n\t\t\t\t\top->data.absolute.offset.off32, len );\n\t\t\t}\n\n                        STRNCAT( buf, \"\\t\\t</absolute_address>\\n\", len );\n                        break;\n\n                case op_expression:\n\t\t\t\n\n                        STRNCAT( buf, \"\\t\\t<address_expression>\\n\", len );\n\n                        len -= format_seg( op, buf, len, xml_syntax );\n                        len -= format_expr( &op->data.expression, buf, len,\n                                     xml_syntax );\n\n                        STRNCAT( buf, \"\\t\\t</address_expression>\\n\", len );\n                        break;\n\n                case op_offset:\n\n                        STRNCAT( buf, \"\\t\\t<segment_offset>\\n\", len );\n\n                        len -= format_seg( op, buf, len, xml_syntax );\n\n                        STRNCAT( buf, \"\\t\\t\\t<address \", len);\n                        STRNCATF( buf, \"value=\\\"0x%08\" PRIX32 \"\\\"/>\\n\",\n                                          op->data.sdword, len );\n                        STRNCAT( buf, \"\\t\\t</segment_offset>\\n\", len );\n                        break;\n\n                case op_unused:\n                case op_unknown:\n                        /* return 0-truncated buffer */\n                        break;\n        }\n\n        return( strlen( buf ) );\n}\n\nstatic int format_operand_raw( x86_op_t *op, x86_insn_t *insn, char *buf,\n                               int len){\n\n        char str[MAX_OP_RAW_STRING];\n\tconst char *datatype = get_operand_datatype_str(op);\n\n        switch (op->type) {\n                case op_register:\n\n                        get_operand_regtype_str( op->data.reg.type, str,\n                                                 sizeof str );\n\n                        STRNCAT( buf, \"reg|\", len );\n                        STRNCATF( buf, \"%s|\", datatype, len );\n                        STRNCATF( buf, \"%s:\", op->data.reg.name, len );\n                        STRNCATF( buf, \"%s:\", str, len );\n                        STRNCATF( buf, \"%d|\", op->data.reg.size, len );\n                        break;\n\n                case op_immediate:\n\n                        get_operand_data_str( op, str, sizeof str );\n\n                        STRNCAT( buf, \"immediate|\", len );\n                        STRNCATF( buf, \"%s|\", datatype, len );\n                        STRNCATF( buf, \"%s|\", str, len );\n                        break;\n\n                case op_relative_near:\n\t\t\t/* NOTE: in raw format, we print the\n\t\t\t * relative offset, not the actual\n\t\t\t * address of the jump target */\n\n                        STRNCAT( buf, \"relative|\", len );\n                        STRNCATF( buf, \"%s|\", datatype, len );\n                        STRNCATF( buf, \"%\" PRId8 \"|\", op->data.sbyte, len );\n                        break;\n\n                case op_relative_far:\n\n                        STRNCAT( buf, \"relative|\", len );\n                        STRNCATF( buf, \"%s|\", datatype, len );\n\n                        if (op->datatype == op_word) {\n                                STRNCATF( buf, \"%\" PRId16 \"|\", op->data.sword, len);\n                                break;\n                        } else {\n                        \tSTRNCATF( buf, \"%\" PRId32 \"|\", op->data.sdword, len );\n\t\t\t}\n                        break;\n\n                case op_absolute:\n\n                        STRNCAT( buf, \"absolute_address|\", len );\n                        STRNCATF( buf, \"%s|\", datatype, len );\n\n                        STRNCATF( buf, \"$0x%04\" PRIX16 \":\", op->data.absolute.segment,\n\t\t\t\tlen );\n\t\t\tif (op->datatype == op_descr16) {\n                        \tSTRNCATF( buf, \"0x%04\" PRIX16 \"|\", \n\t\t\t\t\top->data.absolute.offset.off16, len );\n\t\t\t} else {\n                        \tSTRNCATF( buf, \"0x%08\" PRIX32 \"|\", \n\t\t\t\t\top->data.absolute.offset.off32, len );\n\t\t\t}\n\n                        break;\n\n                case op_expression:\n\n                        STRNCAT( buf, \"address_expression|\", len );\n                        STRNCATF( buf, \"%s|\", datatype, len );\n\n                        len -= format_seg( op, buf, len, native_syntax );\n                        len -= format_expr( &op->data.expression, buf, len,\n                                     raw_syntax );\n\n                        STRNCAT( buf, \"|\", len );\n                        break;\n\n                case op_offset:\n\n                        STRNCAT( buf, \"segment_offset|\", len );\n                        STRNCATF( buf, \"%s|\", datatype, len );\n\n                        len -= format_seg( op, buf, len, xml_syntax );\n\n                        STRNCATF( buf, \"%08\" PRIX32 \"|\", op->data.sdword, len );\n                        break;\n\n                case op_unused:\n                case op_unknown:\n                        /* return 0-truncated buffer */\n                        break;\n        }\n\n        return( strlen( buf ) );\n}\n\nint x86_format_operand( x86_op_t *op, char *buf, int len,\n                        enum x86_asm_format format ){\n\tx86_insn_t *insn;\n\n        if ( ! op || ! buf || len < 1 ) {\n                return(0);\n        }\n\n\t/* insn is stored in x86_op_t since .21-pre3 */\n\tinsn = (x86_insn_t *) op->insn;\n\n        memset( buf, 0, len );\n\n        switch ( format ) {\n                case att_syntax:\n                        return format_operand_att( op, insn, buf, len );\n                case xml_syntax:\n                        return format_operand_xml( op, insn, buf, len );\n                case raw_syntax:\n                        return format_operand_raw( op, insn, buf, len );\n                case native_syntax:\n                case intel_syntax:\n                default:\n                        return format_operand_native( op, insn, buf, len );\n        }\n}\n\n#define is_imm_jmp(op)   (op->type == op_absolute   || \\\n                          op->type == op_immediate  || \\\n                          op->type == op_offset)\n#define is_memory_op(op) (op->type == op_absolute   || \\\n                          op->type == op_expression || \\\n                          op->type == op_offset)\n\nstatic int format_att_mnemonic( x86_insn_t *insn, char *buf, int len) {\n        int size = 0;\n        const char *suffix;\n\n        if (! insn || ! buf || ! len )\n                return(0);\n\n        memset( buf, 0, len );\n\n        /* do long jump/call prefix */\n        if ( insn->type == insn_jmp || insn->type == insn_call ) {\n                if (! is_imm_jmp( x86_operand_1st(insn) ) ||\n                     (x86_operand_1st(insn))->datatype != op_byte ) {\n                    /* far jump/call, use \"l\" prefix */\n                    STRNCAT( buf, \"l\", len );\n                }\n                STRNCAT( buf, insn->mnemonic, len );\n\n                return ( strlen( buf ) );\n        }\n\n        /* do mnemonic */\n        STRNCAT( buf, insn->mnemonic, len );\n\n        /* do suffixes for memory operands */\n        if (!(insn->note & insn_note_nosuffix) &&\n            (insn->group == insn_arithmetic ||\n             insn->group == insn_logic ||\n             insn->group == insn_move ||\n             insn->group == insn_stack ||\n             insn->group == insn_string ||\n             insn->group == insn_comparison ||\n             insn->type == insn_in ||\n             insn->type == insn_out\n            )) {\n            if ( x86_operand_count( insn, op_explicit ) > 0 &&\n                 is_memory_op( x86_operand_1st(insn) ) ){\n                size = x86_operand_size( x86_operand_1st( insn ) );\n            } else if ( x86_operand_count( insn, op_explicit ) > 1 &&\n                        is_memory_op( x86_operand_2nd(insn) ) ){\n                size = x86_operand_size( x86_operand_2nd( insn ) );\n            }\n        }\n\n        if ( size == 1 ) suffix = \"b\";\n        else if ( size == 2 ) suffix = \"w\";\n        else if ( size == 4 ) suffix = \"l\";\n        else if ( size == 8 ) suffix = \"q\";\n        else suffix = \"\";\n\n        STRNCAT( buf, suffix, len );\n        return ( strlen( buf ) );\n}\n\nint x86_format_mnemonic(x86_insn_t *insn, char *buf, int len,\n                        enum x86_asm_format format){\n        char str[MAX_OP_STRING];\n\n        memset( buf, 0, len );\n        STRNCAT( buf, insn->prefix_string, len );\n        if ( format == att_syntax ) {\n                format_att_mnemonic( insn, str, sizeof str );\n                STRNCAT( buf, str, len );\n        } else {\n                STRNCAT( buf, insn->mnemonic, len );\n        }\n\n        return( strlen( buf ) );\n}\n\nstruct op_string { char *buf; size_t len; };\n\nstatic void format_op_raw( x86_op_t *op, x86_insn_t *insn, void *arg ) {\n\tstruct op_string * opstr = (struct op_string *) arg;\n\n        format_operand_raw(op, insn, opstr->buf, opstr->len);\n}\n\nstatic int format_insn_note(x86_insn_t *insn, char *buf, int len){\n\tchar note[32] = {0};\n\tint len_orig = len, note_len = 32;\n\n\tif ( insn->note & insn_note_ring0 ) {\n        \tSTRNCATF( note, \"%s\", \"Ring0 \", note_len );\n\t}\n\tif ( insn->note & insn_note_smm ) {\n        \tSTRNCATF( note, \"%s\", \"SMM \", note_len );\n\t}\n\tif ( insn->note & insn_note_serial ) {\n        \tSTRNCATF(note, \"%s\", \"Serialize \", note_len );\n\t}\n        STRNCATF( buf, \"%s|\", note, len );\n\n        return( len_orig - len );\n}\n\nstatic int format_raw_insn( x86_insn_t *insn, char *buf, int len ){\n\tstruct op_string opstr = { buf, len };\n        int i;\n\n        /* RAW style:\n         * ADDRESS|OFFSET|SIZE|BYTES|\n         * PREFIX|PREFIX_STRING|GROUP|TYPE|NOTES|\n\t * MNEMONIC|CPU|ISA|FLAGS_SET|FLAGS_TESTED|\n\t * STACK_MOD|STACK_MOD_VAL\n\t * [|OP_TYPE|OP_DATATYPE|OP_ACCESS|OP_FLAGS|OP]*\n         *\n         * Register values are encoded as:\n         * NAME:TYPE:SIZE\n         *\n         * Effective addresses are encoded as:\n         * disp(base_reg,index_reg,scale)\n         */\n        STRNCATF( buf, \"0x%08\" PRIX32 \"|\", insn->addr  , len );\n        STRNCATF( buf, \"0x%08\" PRIX32 \"|\", insn->offset, len );\n        STRNCATF( buf, \"%d|\"    , insn->size  , len );\n\n        /* print bytes */\n        for ( i = 0; i < insn->size; i++ ) {\n                STRNCATF( buf, \"%02X \", insn->bytes[i], len );\n        }\n        STRNCAT( buf, \"|\", len );\n\n        len -= format_insn_prefix_str( insn->prefix, buf, len );\n        STRNCATF( buf, \"|%s|\", insn->prefix_string             , len );\n        STRNCATF( buf, \"%s|\", get_insn_group_str( insn->group ), len );\n        STRNCATF( buf, \"%s|\", get_insn_type_str( insn->type )  , len );\n        STRNCATF( buf, \"%s|\", insn->mnemonic                   , len );\n        STRNCATF( buf, \"%s|\", get_insn_cpu_str( insn->cpu )  , len );\n        STRNCATF( buf, \"%s|\", get_insn_isa_str( insn->isa )  , len );\n\n\t/* insn note */\n\tlen -= format_insn_note( insn, buf, len );\n\n        len -= format_insn_eflags_str( insn->flags_set, buf, len );\n        STRNCAT( buf, \"|\", len );\n        len -= format_insn_eflags_str( insn->flags_tested, buf, len );\n        STRNCAT( buf, \"|\", len );\n        STRNCATF( buf, \"%d|\", insn->stack_mod, len );\n        STRNCATF( buf, \"%\" PRId32 \"|\", insn->stack_mod_val, len );\n\n\topstr.len = len;\n\tx86_operand_foreach( insn, format_op_raw, &opstr, op_any );\n\n        return( strlen (buf) );\n}\n\nstatic int format_xml_insn( x86_insn_t *insn, char *buf, int len ) {\n        char str[MAX_OP_XML_STRING];\n        int i;\n\n        STRNCAT( buf, \"<x86_insn>\\n\", len );\n\n        STRNCATF( buf, \"\\t<address rva=\\\"0x%08\" PRIX32 \"\\\" \", insn->addr, len );\n        STRNCATF( buf, \"offset=\\\"0x%08\" PRIX32 \"\\\" \", insn->offset, len );\n        STRNCATF( buf, \"size=%d bytes=\\\"\", insn->size, len );\n\n        for ( i = 0; i < insn->size; i++ ) {\n                STRNCATF( buf, \"%02X \", insn->bytes[i], len );\n        }\n        STRNCAT( buf, \"\\\"/>\\n\", len );\n\n        STRNCAT( buf, \"\\t<prefix type=\\\"\", len );\n        len -= format_insn_prefix_str( insn->prefix, buf, len );\n        STRNCATF( buf, \"\\\" string=\\\"%s\\\"/>\\n\", insn->prefix_string, len );\n\n        STRNCATF( buf, \"\\t<mnemonic group=\\\"%s\\\" \",\n                  get_insn_group_str (insn->group), len );\n        STRNCATF( buf, \"type=\\\"%s\\\" \", get_insn_type_str (insn->type), len );\n        STRNCATF( buf, \"string=\\\"%s\\\"/>\\n\", insn->mnemonic, len );\n\n        STRNCAT( buf, \"\\t<flags type=set>\\n\", len );\n        STRNCAT( buf, \"\\t\\t<flag name=\\\"\", len );\n        len -= format_insn_eflags_str( insn->flags_set, buf, len );\n        STRNCAT( buf, \"\\\"/>\\n\\t</flags>\\n\", len );\n\n\n        STRNCAT( buf, \"\\t<flags type=tested>\\n\", len );\n        STRNCAT( buf, \"\\t\\t<flag name=\\\"\", len );\n        len -= format_insn_eflags_str( insn->flags_tested, buf, len );\n        STRNCAT( buf, \"\\\"/>\\n\\t</flags>\\n\", len );\n\n\tif ( x86_operand_1st( insn ) ) {\n        \tx86_format_operand( x86_operand_1st(insn), str,\n                           sizeof str, xml_syntax);\n        \tSTRNCAT( buf, \"\\t<operand name=dest>\\n\", len );\n        \tSTRNCAT( buf, str, len );\n        \tSTRNCAT( buf, \"\\t</operand>\\n\", len );\n\t}\n\n\tif ( x86_operand_2nd( insn ) ) {\n        \tx86_format_operand( x86_operand_2nd( insn ), str,\n                           sizeof str, xml_syntax);\n        \tSTRNCAT( buf, \"\\t<operand name=src>\\n\", len );\n        \tSTRNCAT( buf, str, len );\n        \tSTRNCAT( buf, \"\\t</operand>\\n\", len );\n\t}\n\n\tif ( x86_operand_3rd( insn ) ) {\n        \tx86_format_operand( x86_operand_3rd(insn), str,\n                           sizeof str, xml_syntax);\n        \tSTRNCAT( buf, \"\\t<operand name=imm>\\n\", len );\n        \tSTRNCAT( buf, str, len );\n        \tSTRNCAT( buf, \"\\t</operand>\\n\", len );\n\t}\n\n        STRNCAT( buf, \"</x86_insn>\\n\", len );\n\n        return strlen (buf);\n}\n\nint x86_format_header( char *buf, int len, enum x86_asm_format format ) {\n        switch (format) {\n                case att_syntax:\n                        snprintf( buf, len, \"MNEMONIC\\tSRC, DEST, IMM\" );\n                        break;\n                case intel_syntax:\n                        snprintf( buf, len, \"MNEMONIC\\tDEST, SRC, IMM\" );\n                        break;\n                case native_syntax:\n                        snprintf( buf, len, \"ADDRESS\\tBYTES\\tMNEMONIC\\t\"\n                                            \"DEST\\tSRC\\tIMM\" );\n                        break;\n                case raw_syntax:\n                        snprintf( buf, len, \"ADDRESS|OFFSET|SIZE|BYTES|\"\n                               \"PREFIX|PREFIX_STRING|GROUP|TYPE|NOTES|\"\n\t\t\t       \"MNEMONIC|CPU|ISA|FLAGS_SET|FLAGS_TESTED|\"\n\t\t\t       \"STACK_MOD|STACK_MOD_VAL\"\n\t\t\t       \"[|OP_TYPE|OP_DATATYPE|OP_ACCESS|OP_FLAGS|OP]*\"\n                                );\n                        break;\n                case xml_syntax:\n                        snprintf( buf, len,\n                                  \"<x86_insn>\"\n                                      \"<address rva= offset= size= bytes=/>\"\n                                      \"<prefix type= string=/>\"\n                                      \"<mnemonic group= type= string= \"\n\t\t\t\t      \"cpu= isa= note= />\"\n                                      \"<flags type=set>\"\n                                          \"<flag name=>\"\n                                      \"</flags>\"\n\t\t\t\t      \"<stack_mod val= >\"\n                                      \"<flags type=tested>\"\n                                          \"<flag name=>\"\n                                      \"</flags>\"\n                                      \"<operand name=>\"\n                                          \"<register name= type= size=/>\"\n                                          \"<immediate type= value=/>\"\n                                          \"<relative_offset value=/>\"\n                                          \"<absolute_address value=>\"\n                                              \"<segment value=/>\"\n                                          \"</absolute_address>\"\n                                          \"<address_expression>\"\n                                              \"<segment value=/>\"\n                                              \"<base>\"\n                                                  \"<register name= type= size=/>\"\n                                              \"</base>\"\n                                              \"<index>\"\n                                                  \"<register name= type= size=/>\"\n                                              \"</index>\"\n                                              \"<scale>\"\n                                                  \"<immediate value=/>\"\n                                              \"</scale>\"\n                                              \"<displacement>\"\n                                                  \"<immediate value=/>\"\n                                                  \"<address value=/>\"\n                                              \"</displacement>\"\n                                          \"</address_expression>\"\n                                          \"<segment_offset>\"\n                                              \"<address value=/>\"\n                                          \"</segment_offset>\"\n                                      \"</operand>\"\n                                  \"</x86_insn>\"\n                                );\n                        break;\n\t\tcase unknown_syntax:\n\t\t\tif ( len ) {\n\t\t\t\tbuf[0] = '\\0';\n\t\t\t}\n\t\t\tbreak;\n        }\n\n        return( strlen(buf) );\n}\n\nint x86_format_insn( x86_insn_t *insn, char *buf, int len,\n                     enum x86_asm_format format ){\n        char str[MAX_OP_STRING];\n        x86_op_t *src, *dst;\n        int i;\n\n        memset(buf, 0, len);\n        if ( format == intel_syntax ) {\n                /* INTEL STYLE: mnemonic dest, src, imm */\n                STRNCAT( buf, insn->prefix_string, len );\n                STRNCAT( buf, insn->mnemonic, len );\n                STRNCAT( buf, \"\\t\", len );\n\n                /* dest */\n\t\tif ( (dst = x86_operand_1st( insn )) && !(dst->flags & op_implied) ) {\n        \t\tx86_format_operand( dst, str, MAX_OP_STRING, format);\n                \tSTRNCAT( buf, str, len );\n                }\n\n                /* src */\n\t\tif ( (src = x86_operand_2nd( insn )) ) {\n                        if ( !(dst->flags & op_implied) ) {\n                \t        STRNCAT( buf, \", \", len );\n                        }\n        \t\tx86_format_operand( src, str, MAX_OP_STRING, format);\n                \tSTRNCAT( buf, str, len );\n                }\n\n                /* imm */\n\t\tif ( x86_operand_3rd( insn )) {\n                \tSTRNCAT( buf, \", \", len );\n        \t\tx86_format_operand( x86_operand_3rd( insn ), \n\t\t\t\tstr, MAX_OP_STRING, format);\n                \tSTRNCAT( buf, str, len );\n\t\t}\n\n        } else if ( format == att_syntax ) {\n                /* ATT STYLE: mnemonic src, dest, imm */\n                STRNCAT( buf, insn->prefix_string, len );\n                format_att_mnemonic(insn, str, MAX_OP_STRING);\n                STRNCATF( buf, \"%s\\t\", str, len);\n\n\n\t\t/* not sure which is correct? sometimes GNU as requires\n\t\t * an imm as the first operand, sometimes as the third... */\n                /* imm */\n\t\tif ( x86_operand_3rd( insn ) ) {\n        \t\tx86_format_operand(x86_operand_3rd( insn ), \n\t\t\t\tstr, MAX_OP_STRING, format);\n                \tSTRNCAT( buf, str, len );\n\t\t\t/* there is always 'dest' operand if there is 'src' */\n\t\t\tSTRNCAT( buf, \", \", len );\n\t\t}\n\n                if ( (insn->note & insn_note_nonswap ) == 0 ) {\n                        /* regular AT&T style swap */\n                        src = x86_operand_2nd( insn );\n                        dst = x86_operand_1st( insn );\n                }\n                else {\n                        /* special-case instructions */\n                        src = x86_operand_1st( insn );\n                        dst = x86_operand_2nd( insn );\n                }\n\n                /* src */\n                if ( src ) {\n                        x86_format_operand(src, str, MAX_OP_STRING, format);\n                        STRNCAT( buf, str, len );\n                        /* there is always 'dest' operand if there is 'src' */\n                        if ( dst && !(dst->flags & op_implied) ) {\n                                STRNCAT( buf, \", \", len );\n                        }\n                }\n\n                /* dest */\n                if ( dst && !(dst->flags & op_implied) ) {\n                        x86_format_operand( dst, str, MAX_OP_STRING, format);\n                        STRNCAT( buf, str, len );\n                }\n\n\n        } else if ( format == raw_syntax ) {\n                format_raw_insn( insn, buf, len );\n        } else if ( format == xml_syntax ) {\n                format_xml_insn( insn, buf, len );\n        } else { /* default to native */\n                /* NATIVE style: RVA\\tBYTES\\tMNEMONIC\\tOPERANDS */\n                /* print address */\n                STRNCATF( buf, \"%08\" PRIX32 \"\\t\", insn->addr, len );\n\n                /* print bytes */\n                for ( i = 0; i < insn->size; i++ ) {\n                        STRNCATF( buf, \"%02X \", insn->bytes[i], len );\n                }\n\n                STRNCAT( buf, \"\\t\", len );\n\n                /* print mnemonic */\n                STRNCAT( buf, insn->prefix_string, len );\n                STRNCAT( buf, insn->mnemonic, len );\n                STRNCAT( buf, \"\\t\", len );\n\n                /* print operands */\n                /* dest */\n\t\tif ( x86_operand_1st( insn )  ) {\n        \t\tx86_format_operand( x86_operand_1st( insn ), \n\t\t\t\tstr, MAX_OP_STRING, format);\n                \tSTRNCATF( buf, \"%s\\t\", str, len );\n\t\t}\n\n                /* src */\n\t\tif ( x86_operand_2nd( insn ) ) {\n        \t\tx86_format_operand(x86_operand_2nd( insn ), \n\t\t\t\tstr, MAX_OP_STRING, format);\n                \tSTRNCATF( buf, \"%s\\t\", str, len );\n\t\t}\n\n                /* imm */\n\t\tif ( x86_operand_3rd( insn )) {\n        \t\tx86_format_operand( x86_operand_3rd( insn ), \n\t\t\t\tstr, MAX_OP_STRING, format);\n                \tSTRNCAT( buf, str, len );\n\t\t}\n        }\n\n        return( strlen( buf ) );\n}\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/x86_imm.c",
    "content": "#include \"qword.h\"\n#include \"x86_imm.h\"\n\n#include <stdio.h>\n\nunsigned int x86_imm_signsized( unsigned char * buf, size_t buf_len,\n\t\t\t\tvoid *dest, unsigned int size ) {\n\tsigned char *cp = (signed char *) dest;\n\tsigned short *sp = (signed short *) dest;\n\tint32_t *lp = (int32_t *) dest;\n\tqword_t *qp = (qword_t *) dest;\n\n\tif ( size > buf_len ) {\n\t\treturn 0;\n\t}\n\n\t/* Copy 'size' bytes from *buf to *op\n\t * return number of bytes copied */\n\tswitch (size) {\n\t\tcase 1:\t\t/* BYTE */\n\t\t\t*cp =  *((signed char *) buf);\n\t\t\tbreak;\n\t\tcase 2:\t\t/* WORD */\n\t\t\t*sp =  *((signed short *) buf);\n\t\t\tbreak;\n\t\tcase 6:\n\t\tcase 8:\t\t/* QWORD */\n\t\t\t*qp = *((qword_t *) buf);\n\t\t\tbreak;\n\t\tcase 4:\t\t/* DWORD */\n\t\tdefault:\n\t\t\t*lp = *((int32_t *) buf);\n\t\t\tbreak;\n\t}\n\treturn (size);\n}\n\nunsigned int x86_imm_sized( unsigned char * buf, size_t buf_len, void *dest,\n\t\t\t    unsigned int size ) {\n\tunsigned char *cp = (unsigned char *) dest;\n\tunsigned short *sp = (unsigned short *) dest;\n\tuint32_t *lp = (uint32_t *) dest;\n\tqword_t *qp = (qword_t *) dest;\n\n\tif ( size > buf_len ) {\n\t\treturn 0;\n\t}\n\n\t/* Copy 'size' bytes from *buf to *op\n\t * return number of bytes copied */\n\tswitch (size) {\n\t\tcase 1:\t\t/* BYTE */\n\t\t\t*cp =  *((unsigned char *) buf);\n\t\t\tbreak;\n\t\tcase 2:\t\t/* WORD */\n\t\t\t*sp =  *((unsigned short *) buf);\n\t\t\tbreak;\n\t\tcase 6:\n\t\tcase 8:\t\t/* QWORD */\n\t\t\t*qp = *((qword_t *) buf);\n\t\t\tbreak;\n\t\tcase 4:\t\t/* DWORD */\n\t\tdefault:\n\t\t\t*lp = *((uint32_t *) buf);\n\t\t\tbreak;\n\t}\n\n\treturn (size);\n}\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/x86_imm.h",
    "content": "#ifndef x86_IMM_H\n#define x86_IMM_H\n\n#include \"./qword.h\"\n#include <sys/types.h>\n\n#ifdef WIN32\n#include <windows.h>\n#endif\n\n/* these are in the global x86 namespace but are not a part of the\n * official API */\nunsigned int x86_imm_sized( unsigned char *buf, size_t buf_len, void *dest,\n\t\t\t    unsigned int size );\n\nunsigned int x86_imm_signsized( unsigned char *buf, size_t buf_len, void *dest,\n\t\t\t\tunsigned int size );\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/x86_insn.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n\n#include \"libdis.h\"\n\n#ifdef _MSC_VER\n        #define snprintf        _snprintf\n        #define inline          __inline\n#endif\n\nint x86_insn_is_valid( x86_insn_t *insn ) {\n\tif ( insn && insn->type != insn_invalid && insn->size > 0 ) {\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\nuint32_t x86_get_address( x86_insn_t *insn ) {\n\tx86_oplist_t *op_lst;\n        if (! insn || ! insn->operands ) {\n        \treturn 0;\n        }\n\n\tfor (op_lst = insn->operands; op_lst; op_lst = op_lst->next ) {\n\t\tif ( op_lst->op.type == op_offset ) {\n\t\t\treturn op_lst->op.data.offset;\n\t\t} else if ( op_lst->op.type == op_absolute ) {\n\t\t\tif ( op_lst->op.datatype == op_descr16 ) {\n\t\t\t\treturn (uint32_t)\n\t\t\t\t\top_lst->op.data.absolute.offset.off16;\n\t\t\t}\n\t\t\treturn op_lst->op.data.absolute.offset.off32;\n\t\t}\n\t}\n\t\n\treturn 0;\n}\n\nint32_t x86_get_rel_offset( x86_insn_t *insn ) {\n\tx86_oplist_t *op_lst;\n        if (! insn || ! insn->operands ) {\n        \treturn 0;\n        }\n\n\tfor (op_lst = insn->operands; op_lst; op_lst = op_lst->next ) {\n\t\tif ( op_lst->op.type == op_relative_near ) {\n\t\t\treturn (int32_t) op_lst->op.data.relative_near;\n\t\t} else if ( op_lst->op.type == op_relative_far ) {\n\t\t\treturn op_lst->op.data.relative_far;\n\t\t}\n\t}\n\t\n\treturn 0;\n}\n\nx86_op_t * x86_get_branch_target( x86_insn_t *insn ) {\n\tx86_oplist_t *op_lst;\n        if (! insn || ! insn->operands ) {\n        \treturn NULL;\n        }\n\n\tfor (op_lst = insn->operands; op_lst; op_lst = op_lst->next ) {\n\t\tif ( op_lst->op.access & op_execute ) {\n\t\t\treturn &(op_lst->op);\n\t\t}\n\t}\n\t\n\treturn NULL;\n}\nx86_op_t * x86_get_imm( x86_insn_t *insn ) {\n\tx86_oplist_t *op_lst;\n        if (! insn || ! insn->operands ) {\n        \treturn NULL;\n        }\n\n\tfor (op_lst = insn->operands; op_lst; op_lst = op_lst->next ) {\n\t\tif ( op_lst->op.type == op_immediate ) {\n\t\t\treturn &(op_lst->op);\n\t\t}\n\t}\n\t\n\treturn NULL;\n}\n\n#define IS_PROPER_IMM( x ) \\\n\tx->op.type == op_immediate && ! (x->op.flags & op_hardcode)\n\t\t\t\t\t\t\t   \n\n/* if there is an immediate value in the instruction, return a pointer to\n * it */\nunsigned char * x86_get_raw_imm( x86_insn_t *insn ) {\n        int size, offset;\n        x86_op_t *op  = NULL;\n\n        if (! insn || ! insn->operands ) {\n        \treturn(NULL);\n        }\n\n\t/* a bit inelegant, but oh well... */\n\tif ( IS_PROPER_IMM( insn->operands ) ) {\n\t\top = &insn->operands->op;\n\t} else if ( insn->operands->next ) {\n\t\tif ( IS_PROPER_IMM( insn->operands->next ) ) {\n\t\t\top = &insn->operands->next->op;\n\t\t} else if ( insn->operands->next->next && \n\t\t\t    IS_PROPER_IMM( insn->operands->next->next ) ) {\n\t\t\top = &insn->operands->next->next->op;\n\t\t}\n\t}\n\t\n\tif (! op ) {\n\t\treturn( NULL );\n\t}\n\n\t/* immediate data is at the end of the insn */\n\tsize = x86_operand_size( op );\n\toffset = insn->size - size;\n\treturn( &insn->bytes[offset] );\n}\n\n\nunsigned int x86_operand_size( x86_op_t *op ) {\n        switch (op->datatype ) {\n                case op_byte:    return 1;\n                case op_word:    return 2;\n                case op_dword:   return 4;\n                case op_qword:   return 8;\n                case op_dqword:  return 16;\n                case op_sreal:   return 4;\n                case op_dreal:   return 8;\n                case op_extreal: return 10;\n                case op_bcd:     return 10;\n                case op_ssimd:   return 16;\n                case op_dsimd:   return 16;\n                case op_sssimd:  return 4;\n                case op_sdsimd:  return 8;\n                case op_descr32: return 6;\n                case op_descr16: return 4;\n                case op_pdescr32: return 6;\n                case op_pdescr16: return 6;\n\t\tcase op_bounds16: return 4;\n\t\tcase op_bounds32: return 8;\n                case op_fpuenv16:  return 14;\n                case op_fpuenv32:  return 28;\n                case op_fpustate16:  return 94;\n                case op_fpustate32:  return 108;\n                case op_fpregset: return 512;\n\t\tcase op_fpreg: return 10;\n\t\tcase op_none: return 0;\n        }\n        return(4);      /* default size */\n}\n\nvoid x86_set_insn_addr( x86_insn_t *insn, uint32_t addr ) {\n        if ( insn ) insn->addr = addr;\n}\n\nvoid x86_set_insn_offset( x86_insn_t *insn, unsigned int offset ){\n        if ( insn ) insn->offset = offset;\n}\n\nvoid x86_set_insn_function( x86_insn_t *insn, void * func ){\n        if ( insn ) insn->function = func;\n}\n\nvoid x86_set_insn_block( x86_insn_t *insn, void * block ){\n        if ( insn ) insn->block = block;\n}\n\nvoid x86_tag_insn( x86_insn_t *insn ){\n        if ( insn ) insn->tag = 1;\n}\n\nvoid x86_untag_insn( x86_insn_t *insn ){\n        if ( insn ) insn->tag = 0;\n}\n\nint x86_insn_is_tagged( x86_insn_t *insn ){\n        return insn->tag;\n}\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/x86_misc.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"libdis.h\"\n#include \"ia32_insn.h\"\n#include \"ia32_reg.h\"\t\t/* for ia32_reg wrapper */\n#include \"ia32_settings.h\"\nextern ia32_settings_t ia32_settings;\n\n#ifdef _MSC_VER\n        #define snprintf        _snprintf\n        #define inline          __inline\n#endif\n\n\n/* =========================================================== INIT/TERM */\nstatic DISASM_REPORTER __x86_reporter_func = NULL;\nstatic void * __x86_reporter_arg = NULL;\n\nint x86_init( enum x86_options options, DISASM_REPORTER reporter, void * arg )\n{\n        ia32_settings.options = options;\n        __x86_reporter_func = reporter;\n\t__x86_reporter_arg = arg;\n\n        return 1;\n}\n\nvoid x86_set_reporter( DISASM_REPORTER reporter, void * arg ) {\n        __x86_reporter_func = reporter;\n\t__x86_reporter_arg = arg;\n}\n\nvoid x86_set_options( enum x86_options options ){\n        ia32_settings.options = options;\n}\n\nenum x86_options x86_get_options( void ) {\n        return ia32_settings.options;\n}\n\nint x86_cleanup( void )\n{\n        return 1;\n}\n\n/* =========================================================== ERRORS */\nvoid x86_report_error( enum x86_report_codes code, void *data ) {\n        if ( __x86_reporter_func ) {\n                (*__x86_reporter_func)(code, data, __x86_reporter_arg);\n        }\n}\n\n\n/* =========================================================== MISC */\nunsigned int x86_endian(void)        { return ia32_settings.endian;  }\nunsigned int x86_addr_size(void)     { return ia32_settings.sz_addr; }\nunsigned int x86_op_size(void)       { return ia32_settings.sz_oper; }\nunsigned int x86_word_size(void)     { return ia32_settings.sz_word; }\nunsigned int x86_max_insn_size(void) { return ia32_settings.max_insn; }\nunsigned int x86_sp_reg(void)        { return ia32_settings.id_sp_reg;      }\nunsigned int x86_fp_reg(void)        { return ia32_settings.id_fp_reg;      }\nunsigned int x86_ip_reg(void)        { return ia32_settings.id_ip_reg;      }\nunsigned int x86_flag_reg(void)        { return ia32_settings.id_flag_reg;  }\n\n/* wrapper function to hide the IA32 register fn */\nvoid x86_reg_from_id( unsigned int id, x86_reg_t * reg ) {\n\tia32_handle_register( reg, id );\n\treturn;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/x86_operand_list.c",
    "content": "#include <stdlib.h>\n#include \"libdis.h\"\n\n\nstatic void x86_oplist_append( x86_insn_t *insn, x86_oplist_t *op ) {\n\tx86_oplist_t *list;\n\n\tif (! insn ) {\t\n\t\treturn;\n\t}\n\n\tlist = insn->operands;\n\tif (! list ) {\n\t\tinsn->operand_count = 1;\n\t\t/* Note that we have no way of knowing if this is an\n\t\t * exlicit operand or not, since the caller fills \n\t\t * the x86_op_t after we return. We increase the\n\t\t * explicit count automatically, and ia32_insn_implicit_ops\n\t\t * decrements it */\n\t\tinsn->explicit_count = 1;\n\t\tinsn->operands = op;\n\t\treturn;\n\t}\n\n\t/* get to end of list */\n\tfor ( ; list->next; list = list->next ) \n\t\t;\n\n\tinsn->operand_count = insn->operand_count + 1;\n\tinsn->explicit_count = insn->explicit_count + 1;\n\tlist->next = op;\n\n\treturn;\n}\n\t\nx86_op_t * x86_operand_new( x86_insn_t *insn ) {\n\tx86_oplist_t *op;\n\n\tif (! insn ) {\t\n\t\treturn(NULL);\n\t}\n\top = calloc( sizeof(x86_oplist_t), 1 );\n\top->op.insn = insn;\n\tx86_oplist_append( insn, op );\n\treturn( &(op->op) );\n}\n\nvoid x86_oplist_free( x86_insn_t *insn ) {\n\tx86_oplist_t *op, *list;\n\n\tif (! insn ) {\n\t\treturn;\n\t}\n\n\tfor ( list = insn->operands; list; ) {\n\t\top = list;\n\t\tlist = list->next;\n\t\tfree(op);\n\t}\n\n\tinsn->operands = NULL;\n\tinsn->operand_count = 0;\n\tinsn->explicit_count = 0;\n\n\treturn;\n}\n\n/* ================================================== LIBDISASM API */\n/* these could probably just be #defines, but that means exposing the\n   enum... yet one more confusing thing in the API */\nint x86_operand_foreach( x86_insn_t *insn, x86_operand_fn func, void *arg, \n\t       \t\tenum x86_op_foreach_type type ){\n\tx86_oplist_t *list;\n\tchar explicit = 1, implicit = 1;\n\n\tif (! insn || ! func ) {\n\t\treturn 0;\n\t}\n\t\n\t/* note: explicit and implicit can be ORed together to\n\t * allow an \"all\" limited by access type, even though the\n\t * user is stupid to do this since it is default behavior :) */\n\tif ( (type & op_explicit) && ! (type & op_implicit) ) {\n\t\timplicit = 0;\n\t}\n\tif ( (type & op_implicit) && ! (type & op_explicit) ) {\n\t\texplicit = 0;\n\t}\n\n\ttype = type & 0x0F; /* mask out explicit/implicit operands */\n\n\tfor ( list = insn->operands; list; list = list->next ) {\n\t\tif (! implicit && (list->op.flags & op_implied) ) {\n\t\t\t/* operand is implicit */\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (! explicit && ! (list->op.flags & op_implied) ) {\n\t\t\t/* operand is not implicit */\n\t\t\tcontinue;\n\t\t}\n\n\t\tswitch ( type ) {\n\t\t\tcase op_any:\n\t\t\t\tbreak;\n\t\t\tcase op_dest:\n\t\t\t\tif (! (list->op.access & op_write) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase op_src:\n\t\t\t\tif (! (list->op.access & op_read) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase op_ro:\n\t\t\t\tif (! (list->op.access & op_read) ||\n\t\t\t\t      (list->op.access & op_write ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase op_wo:\n\t\t\t\tif (! (list->op.access & op_write) ||\n\t\t\t\t      (list->op.access & op_read ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase op_xo:\n\t\t\t\tif (! (list->op.access & op_execute) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase op_rw:\n\t\t\t\tif (! (list->op.access & op_write) ||\n\t\t\t\t    ! (list->op.access & op_read ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase op_implicit: case op_explicit: /* make gcc happy */\n\t\t\t\t\t  break;\n\t\t}\n\t\t/* any non-continue ends up here: invoke the callback */\n\t\t(*func)( &list->op, insn, arg );\n\t}\n\n\treturn 1;\n}\n\nstatic void count_operand( x86_op_t *op, x86_insn_t *insn, void *arg ) {\n\tsize_t * count = (size_t *) arg;\n\t*count = *count + 1;\n}\n\nsize_t x86_operand_count( x86_insn_t *insn, enum x86_op_foreach_type type ) {\n\tsize_t count = 0;\n\t\n\t/* save us a list traversal for common counts... */\n\tif ( type == op_any ) {\n\t\treturn insn->operand_count;\n\t} else if ( type == op_explicit ) {\n\t\treturn insn->explicit_count;\n\t}\n\n\tx86_operand_foreach( insn, count_operand, &count, type );\n\treturn count;\n}\n\n/* accessor functions */\nx86_op_t * x86_operand_1st( x86_insn_t *insn ) {\n\tif (! insn->explicit_count ) {\n\t\treturn NULL;\n\t}\n\n\treturn &(insn->operands->op);\n}\n\nx86_op_t * x86_operand_2nd( x86_insn_t *insn ) {\n\tif ( insn->explicit_count < 2 ) {\n\t\treturn NULL;\n\t}\n\n\treturn &(insn->operands->next->op);\n}\n\nx86_op_t * x86_operand_3rd( x86_insn_t *insn ) {\n\tif ( insn->explicit_count < 3 ) {\n\t\treturn NULL;\n\t}\n\n\treturn &(insn->operands->next->next->op);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/libdisasm/x86_operand_list.h",
    "content": "#ifndef X86_OPERAND_LIST_H\n#define X86_OPERAND_LIST_H\n#include \"libdis.h\"\n\n\nx86_op_t * x86_operand_new( x86_insn_t *insn );\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/linux/include/gflags/gflags.h",
    "content": "// Copyright (c) 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// ---\n// Author: Ray Sidney\n// Revamped and reorganized by Craig Silverstein\n//\n// This is the file that should be included by any file which declares\n// or defines a command line flag or wants to parse command line flags\n// or print a program usage message (which will include information about\n// flags).  Executive summary, in the form of an example foo.cc file:\n//\n//    #include \"foo.h\"         // foo.h has a line \"DECLARE_int32(start);\"\n//\n//    DEFINE_int32(end, 1000, \"The last record to read\");\n//    DECLARE_bool(verbose);   // some other file has a DEFINE_bool(verbose, ...)\n//\n//    void MyFunc() {\n//      if (FLAGS_verbose) printf(\"Records %d-%d\\n\", FLAGS_start, FLAGS_end);\n//    }\n//\n// Then, at the command-line:\n//    ./foo --noverbose --start=5 --end=100\n//\n// For more details, see\n//    doc/gflags.html\n//\n// --- A note about thread-safety:\n//\n// We describe many functions in this routine as being thread-hostile,\n// thread-compatible, or thread-safe.  Here are the meanings we use:\n//\n// thread-safe: it is safe for multiple threads to call this routine\n//   (or, when referring to a class, methods of this class)\n//   concurrently.\n// thread-hostile: it is not safe for multiple threads to call this\n//   routine (or methods of this class) concurrently.  In gflags,\n//   most thread-hostile routines are intended to be called early in,\n//   or even before, main() -- that is, before threads are spawned.\n// thread-compatible: it is safe for multiple threads to read from\n//   this variable (when applied to variables), or to call const\n//   methods of this class (when applied to classes), as long as no\n//   other thread is writing to the variable or calling non-const\n//   methods of this class.\n\n#ifndef GOOGLE_GFLAGS_H_\n#define GOOGLE_GFLAGS_H_\n\n#include <string>\n#include <vector>\n\n// We care a lot about number of bits things take up.  Unfortunately,\n// systems define their bit-specific ints in a lot of different ways.\n// We use our own way, and have a typedef to get there.\n// Note: these commands below may look like \"#if 1\" or \"#if 0\", but\n// that's because they were constructed that way at ./configure time.\n// Look at gflags.h.in to see how they're calculated (based on your config).\n#if 1\n#include <stdint.h>             // the normal place uint16_t is defined\n#endif\n#if 1\n#include <sys/types.h>          // the normal place u_int16_t is defined\n#endif\n#if 1\n#include <inttypes.h>           // a third place for uint16_t or u_int16_t\n#endif\n\nnamespace google {\n\n#if 1      // the C99 format\ntypedef int32_t int32;\ntypedef uint32_t uint32;\ntypedef int64_t int64;\ntypedef uint64_t uint64;\n#elif 1   // the BSD format\ntypedef int32_t int32;\ntypedef u_int32_t uint32;\ntypedef int64_t int64;\ntypedef u_int64_t uint64;\n#elif 0     // the windows (vc7) format\ntypedef __int32 int32;\ntypedef unsigned __int32 uint32;\ntypedef __int64 int64;\ntypedef unsigned __int64 uint64;\n#else\n#error Do not know how to define a 32-bit integer quantity on your system\n#endif\n\n// --------------------------------------------------------------------\n// To actually define a flag in a file, use DEFINE_bool,\n// DEFINE_string, etc. at the bottom of this file.  You may also find\n// it useful to register a validator with the flag.  This ensures that\n// when the flag is parsed from the commandline, or is later set via\n// SetCommandLineOption, we call the validation function.\n//\n// The validation function should return true if the flag value is valid, and\n// false otherwise. If the function returns false for the new setting of the\n// flag, the flag will retain its current value. If it returns false for the\n// default value, InitGoogle will die.\n//\n// This function is safe to call at global construct time (as in the\n// example below).\n//\n// Example use:\n//    static bool ValidatePort(const char* flagname, int32 value) {\n//       if (value > 0 && value < 32768)   // value is ok\n//         return true;\n//       printf(\"Invalid value for --%s: %d\\n\", flagname, (int)value);\n//       return false;\n//    }\n//    DEFINE_int32(port, 0, \"What port to listen on\");\n//    static bool dummy = RegisterFlagValidator(&FLAGS_port, &ValidatePort);\n\n// Returns true if successfully registered, false if not (because the\n// first argument doesn't point to a command-line flag, or because a\n// validator is already registered for this flag).\nbool RegisterFlagValidator(const bool* flag,\n                           bool (*validate_fn)(const char*, bool));\nbool RegisterFlagValidator(const int32* flag,\n                           bool (*validate_fn)(const char*, int32));\nbool RegisterFlagValidator(const int64* flag,\n                           bool (*validate_fn)(const char*, int64));\nbool RegisterFlagValidator(const uint64* flag,\n                           bool (*validate_fn)(const char*, uint64));\nbool RegisterFlagValidator(const double* flag,\n                           bool (*validate_fn)(const char*, double));\nbool RegisterFlagValidator(const std::string* flag,\n                           bool (*validate_fn)(const char*, const std::string&));\n\n\n// --------------------------------------------------------------------\n// These methods are the best way to get access to info about the\n// list of commandline flags.  Note that these routines are pretty slow.\n//   GetAllFlags: mostly-complete info about the list, sorted by file.\n//   ShowUsageWithFlags: pretty-prints the list to stdout (what --help does)\n//   ShowUsageWithFlagsRestrict: limit to filenames with restrict as a substr\n//\n// In addition to accessing flags, you can also access argv[0] (the program\n// name) and argv (the entire commandline), which we sock away a copy of.\n// These variables are static, so you should only set them once.\n\nstruct CommandLineFlagInfo {\n  std::string name;           // the name of the flag\n  std::string type;           // the type of the flag: int32, etc\n  std::string description;    // the \"help text\" associated with the flag\n  std::string current_value;  // the current value, as a string\n  std::string default_value;  // the default value, as a string\n  std::string filename;       // 'cleaned' version of filename holding the flag\n  bool has_validator_fn;      // true if RegisterFlagValidator called on flag\n  bool is_default;            // true if the flag has default value\n};\n\nextern void GetAllFlags(std::vector<CommandLineFlagInfo>* OUTPUT);\n// These two are actually defined in commandlineflags_reporting.cc.\nextern void ShowUsageWithFlags(const char *argv0);  // what --help does\nextern void ShowUsageWithFlagsRestrict(const char *argv0, const char *restrict);\n\n// Create a descriptive string for a flag.\n// Goes to some trouble to make pretty line breaks.\nextern std::string DescribeOneFlag(const CommandLineFlagInfo& flag);\n\n// Thread-hostile; meant to be called before any threads are spawned.\nextern void SetArgv(int argc, const char** argv);\n// The following functions are thread-safe as long as SetArgv() is\n// only called before any threads start.\nextern const std::vector<std::string>& GetArgvs();  // all of argv as a vector\nextern const char* GetArgv();               // all of argv as a string\nextern const char* GetArgv0();              // only argv0\nextern uint32 GetArgvSum();                 // simple checksum of argv\nextern const char* ProgramInvocationName(); // argv0, or \"UNKNOWN\" if not set\nextern const char* ProgramInvocationShortName();   // basename(argv0)\n// ProgramUsage() is thread-safe as long as SetUsageMessage() is only\n// called before any threads start.\nextern const char* ProgramUsage();          // string set by SetUsageMessage()\n\n\n// --------------------------------------------------------------------\n// Normally you access commandline flags by just saying \"if (FLAGS_foo)\"\n// or whatever, and set them by calling \"FLAGS_foo = bar\" (or, more\n// commonly, via the DEFINE_foo macro).  But if you need a bit more\n// control, we have programmatic ways to get/set the flags as well.\n// These programmatic ways to access flags are thread-safe, but direct\n// access is only thread-compatible.\n\n// Return true iff the flagname was found.\n// OUTPUT is set to the flag's value, or unchanged if we return false.\nextern bool GetCommandLineOption(const char* name, std::string* OUTPUT);\n\n// Return true iff the flagname was found. OUTPUT is set to the flag's\n// CommandLineFlagInfo or unchanged if we return false.\nextern bool GetCommandLineFlagInfo(const char* name,\n                                   CommandLineFlagInfo* OUTPUT);\n\n// Return the CommandLineFlagInfo of the flagname.  exit() if name not found.\n// Example usage, to check if a flag's value is currently the default value:\n//   if (GetCommandLineFlagInfoOrDie(\"foo\").is_default) ...\nextern CommandLineFlagInfo GetCommandLineFlagInfoOrDie(const char* name);\n\nenum FlagSettingMode {\n  // update the flag's value (can call this multiple times).\n  SET_FLAGS_VALUE,\n  // update the flag's value, but *only if* it has not yet been updated\n  // with SET_FLAGS_VALUE, SET_FLAG_IF_DEFAULT, or \"FLAGS_xxx = nondef\".\n  SET_FLAG_IF_DEFAULT,\n  // set the flag's default value to this.  If the flag has not yet updated\n  // yet (via SET_FLAGS_VALUE, SET_FLAG_IF_DEFAULT, or \"FLAGS_xxx = nondef\")\n  // change the flag's current value to the new default value as well.\n  SET_FLAGS_DEFAULT\n};\n\n// Set a particular flag (\"command line option\").  Returns a string\n// describing the new value that the option has been set to.  The\n// return value API is not well-specified, so basically just depend on\n// it to be empty if the setting failed for some reason -- the name is\n// not a valid flag name, or the value is not a valid value -- and\n// non-empty else.\n\n// SetCommandLineOption uses set_mode == SET_FLAGS_VALUE (the common case)\nextern std::string SetCommandLineOption(const char* name, const char* value);\nextern std::string SetCommandLineOptionWithMode(const char* name, const char* value,\n                                                FlagSettingMode set_mode);\n\n\n// --------------------------------------------------------------------\n// Saves the states (value, default value, whether the user has set\n// the flag, registered validators, etc) of all flags, and restores\n// them when the FlagSaver is destroyed.  This is very useful in\n// tests, say, when you want to let your tests change the flags, but\n// make sure that they get reverted to the original states when your\n// test is complete.\n//\n// Example usage:\n//   void TestFoo() {\n//     FlagSaver s1;\n//     FLAG_foo = false;\n//     FLAG_bar = \"some value\";\n//\n//     // test happens here.  You can return at any time\n//     // without worrying about restoring the FLAG values.\n//   }\n//\n// Note: This class is marked with __attribute__((unused)) because all the\n// work is done in the constructor and destructor, so in the standard\n// usage example above, the compiler would complain that it's an\n// unused variable.\n//\n// This class is thread-safe.\n\nclass FlagSaver {\n public:\n  FlagSaver();\n  ~FlagSaver();\n\n private:\n  class FlagSaverImpl* impl_;   // we use pimpl here to keep API steady\n\n  FlagSaver(const FlagSaver&);  // no copying!\n  void operator=(const FlagSaver&);\n} __attribute__ ((unused));\n\n// --------------------------------------------------------------------\n// Some deprecated or hopefully-soon-to-be-deprecated functions.\n\n// This is often used for logging.  TODO(csilvers): figure out a better way\nextern std::string CommandlineFlagsIntoString();\n// Usually where this is used, a FlagSaver should be used instead.\nextern bool ReadFlagsFromString(const std::string& flagfilecontents,\n                                const char* prog_name,\n                                bool errors_are_fatal); // uses SET_FLAGS_VALUE\n\n// These let you manually implement --flagfile functionality.\n// DEPRECATED.\nextern bool AppendFlagsIntoFile(const std::string& filename, const char* prog_name);\nextern bool SaveCommandFlags();  // actually defined in google.cc !\nextern bool ReadFromFlagsFile(const std::string& filename, const char* prog_name,\n                              bool errors_are_fatal);   // uses SET_FLAGS_VALUE\n\n\n// --------------------------------------------------------------------\n// Useful routines for initializing flags from the environment.\n// In each case, if 'varname' does not exist in the environment\n// return defval.  If 'varname' does exist but is not valid\n// (e.g., not a number for an int32 flag), abort with an error.\n// Otherwise, return the value.  NOTE: for booleans, for true use\n// 't' or 'T' or 'true' or '1', for false 'f' or 'F' or 'false' or '0'.\n\nextern bool BoolFromEnv(const char *varname, bool defval);\nextern int32 Int32FromEnv(const char *varname, int32 defval);\nextern int64 Int64FromEnv(const char *varname, int64 defval);\nextern uint64 Uint64FromEnv(const char *varname, uint64 defval);\nextern double DoubleFromEnv(const char *varname, double defval);\nextern const char *StringFromEnv(const char *varname, const char *defval);\n\n\n// --------------------------------------------------------------------\n// The next two functions parse commandlineflags from main():\n\n// Set the \"usage\" message for this program.  For example:\n//   string usage(\"This program does nothing.  Sample usage:\\n\");\n//   usage += argv[0] + \" <uselessarg1> <uselessarg2>\";\n//   SetUsageMessage(usage);\n// Do not include commandline flags in the usage: we do that for you!\n// Thread-hostile; meant to be called before any threads are spawned.\nextern void SetUsageMessage(const std::string& usage);\n\n// Looks for flags in argv and parses them.  Rearranges argv to put\n// flags first, or removes them entirely if remove_flags is true.\n// If a flag is defined more than once in the command line or flag\n// file, the last definition is used.\n// See top-of-file for more details on this function.\n#ifndef SWIG   // In swig, use ParseCommandLineFlagsScript() instead.\nextern uint32 ParseCommandLineFlags(int *argc, char*** argv,\n                                    bool remove_flags);\n#endif\n\n\n// Calls to ParseCommandLineNonHelpFlags and then to\n// HandleCommandLineHelpFlags can be used instead of a call to\n// ParseCommandLineFlags during initialization, in order to allow for\n// changing default values for some FLAGS (via\n// e.g. SetCommandLineOptionWithMode calls) between the time of\n// command line parsing and the time of dumping help information for\n// the flags as a result of command line parsing.\n// If a flag is defined more than once in the command line or flag\n// file, the last definition is used.\nextern uint32 ParseCommandLineNonHelpFlags(int *argc, char*** argv,\n                                           bool remove_flags);\n// This is actually defined in commandlineflags_reporting.cc.\n// This function is misnamed (it also handles --version, etc.), but\n// it's too late to change that now. :-(\nextern void HandleCommandLineHelpFlags();   // in commandlineflags_reporting.cc\n\n// Allow command line reparsing.  Disables the error normally\n// generated when an unknown flag is found, since it may be found in a\n// later parse.  Thread-hostile; meant to be called before any threads\n// are spawned.\nextern void AllowCommandLineReparsing();\n\n// Reparse the flags that have not yet been recognized.\n// Only flags registered since the last parse will be recognized.\n// Any flag value must be provided as part of the argument using \"=\",\n// not as a separate command line argument that follows the flag argument.\n// Intended for handling flags from dynamically loaded libraries,\n// since their flags are not registered until they are loaded.\nextern uint32 ReparseCommandLineNonHelpFlags();\n\n\n// --------------------------------------------------------------------\n// Now come the command line flag declaration/definition macros that\n// will actually be used.  They're kind of hairy.  A major reason\n// for this is initialization: we want people to be able to access\n// variables in global constructors and have that not crash, even if\n// their global constructor runs before the global constructor here.\n// (Obviously, we can't guarantee the flags will have the correct\n// default value in that case, but at least accessing them is safe.)\n// The only way to do that is have flags point to a static buffer.\n// So we make one, using a union to ensure proper alignment, and\n// then use placement-new to actually set up the flag with the\n// correct default value.  In the same vein, we have to worry about\n// flag access in global destructors, so FlagRegisterer has to be\n// careful never to destroy the flag-values it constructs.\n//\n// Note that when we define a flag variable FLAGS_<name>, we also\n// preemptively define a junk variable, FLAGS_no<name>.  This is to\n// cause a link-time error if someone tries to define 2 flags with\n// names like \"logging\" and \"nologging\".  We do this because a bool\n// flag FLAG can be set from the command line to true with a \"-FLAG\"\n// argument, and to false with a \"-noFLAG\" argument, and so this can\n// potentially avert confusion.\n//\n// We also put flags into their own namespace.  It is purposefully\n// named in an opaque way that people should have trouble typing\n// directly.  The idea is that DEFINE puts the flag in the weird\n// namespace, and DECLARE imports the flag from there into the current\n// namespace.  The net result is to force people to use DECLARE to get\n// access to a flag, rather than saying \"extern bool FLAGS_whatever;\"\n// or some such instead.  We want this so we can put extra\n// functionality (like sanity-checking) in DECLARE if we want, and\n// make sure it is picked up everywhere.\n//\n// We also put the type of the variable in the namespace, so that\n// people can't DECLARE_int32 something that they DEFINE_bool'd\n// elsewhere.\n\nclass FlagRegisterer {\n public:\n  FlagRegisterer(const char* name, const char* type,\n                 const char* help, const char* filename,\n                 void* current_storage, void* defvalue_storage);\n};\n\nextern bool FlagsTypeWarn(const char *name);\n\n// If your application #defines STRIP_FLAG_HELP to a non-zero value\n// before #including this file, we remove the help message from the\n// binary file. This can reduce the size of the resulting binary\n// somewhat, and may also be useful for security reasons.\n\nextern const char kStrippedFlagHelp[];\n\n}\n\n#ifndef SWIG  // In swig, ignore the main flag declarations\n\n#if defined(STRIP_FLAG_HELP) && STRIP_FLAG_HELP > 0\n// Need this construct to avoid the 'defined but not used' warning.\n#define MAYBE_STRIPPED_HELP(txt) (false ? (txt) : kStrippedFlagHelp)\n#else\n#define MAYBE_STRIPPED_HELP(txt) txt\n#endif\n\n// Each command-line flag has two variables associated with it: one\n// with the current value, and one with the default value.  However,\n// we have a third variable, which is where value is assigned; it's a\n// constant.  This guarantees that FLAG_##value is initialized at\n// static initialization time (e.g. before program-start) rather than\n// than global construction time (which is after program-start but\n// before main), at least when 'value' is a compile-time constant.  We\n// use a small trick for the \"default value\" variable, and call it\n// FLAGS_no<name>.  This serves the second purpose of assuring a\n// compile error if someone tries to define a flag named no<name>\n// which is illegal (--foo and --nofoo both affect the \"foo\" flag).\n#define DEFINE_VARIABLE(type, shorttype, name, value, help) \\\n  namespace fL##shorttype {                                     \\\n    static const type FLAGS_nono##name = value;                 \\\n    type FLAGS_##name = FLAGS_nono##name;                       \\\n    type FLAGS_no##name = FLAGS_nono##name;                     \\\n    static ::google::FlagRegisterer o_##name(      \\\n      #name, #type, MAYBE_STRIPPED_HELP(help), __FILE__,        \\\n      &FLAGS_##name, &FLAGS_no##name);                          \\\n  }                                                             \\\n  using fL##shorttype::FLAGS_##name\n\n#define DECLARE_VARIABLE(type, shorttype, name) \\\n  namespace fL##shorttype {                     \\\n    extern type FLAGS_##name;                   \\\n  }                                             \\\n  using fL##shorttype::FLAGS_##name\n\n// For DEFINE_bool, we want to do the extra check that the passed-in\n// value is actually a bool, and not a string or something that can be\n// coerced to a bool.  These declarations (no definition needed!) will\n// help us do that, and never evaluate From, which is important.\n// We'll use 'sizeof(IsBool(val))' to distinguish. This code requires\n// that the compiler have different sizes for bool & double. Since\n// this is not guaranteed by the standard, we check it with a\n// compile-time assert (msg[-1] will give a compile-time error).\nnamespace fLB {\nstruct CompileAssert {};\ntypedef CompileAssert expected_sizeof_double_neq_sizeof_bool[\n                      (sizeof(double) != sizeof(bool)) ? 1 : -1];\ntemplate<typename From> double IsBoolFlag(const From& from);\nbool IsBoolFlag(bool from);\n}  // namespace fLB\n\n#define DECLARE_bool(name)          DECLARE_VARIABLE(bool,B, name)\n#define DEFINE_bool(name,val,txt)                                         \\\n  namespace fLB {                                                         \\\n    typedef CompileAssert FLAG_##name##_value_is_not_a_bool[              \\\n            (sizeof(::fLB::IsBoolFlag(val)) != sizeof(double)) ? 1 : -1]; \\\n  }                                                                       \\\n  DEFINE_VARIABLE(bool,B, name, val, txt)\n\n#define DECLARE_int32(name)         DECLARE_VARIABLE(::google::int32,I, name)\n#define DEFINE_int32(name,val,txt)  DEFINE_VARIABLE(::google::int32,I, name, val, txt)\n\n#define DECLARE_int64(name)         DECLARE_VARIABLE(::google::int64,I64, name)\n#define DEFINE_int64(name,val,txt)  DEFINE_VARIABLE(::google::int64,I64, name, val, txt)\n\n#define DECLARE_uint64(name)        DECLARE_VARIABLE(::google::uint64,U64, name)\n#define DEFINE_uint64(name,val,txt) DEFINE_VARIABLE(::google::uint64,U64, name, val, txt)\n\n#define DECLARE_double(name)        DECLARE_VARIABLE(double,D, name)\n#define DEFINE_double(name,val,txt) DEFINE_VARIABLE(double,D, name, val, txt)\n\n// Strings are trickier, because they're not a POD, so we can't\n// construct them at static-initialization time (instead they get\n// constructed at global-constructor time, which is much later).  To\n// try to avoid crashes in that case, we use a char buffer to store\n// the string, which we can static-initialize, and then placement-new\n// into it later.  It's not perfect, but the best we can do.\n#define DECLARE_string(name)  namespace fLS { extern std::string& FLAGS_##name; } \\\n                              using fLS::FLAGS_##name\n\n// We need to define a var named FLAGS_no##name so people don't define\n// --string and --nostring.  And we need a temporary place to put val\n// so we don't have to evaluate it twice.  Two great needs that go\n// great together!\n// The weird 'using' + 'extern' inside the fLS namespace is to work around\n// an unknown compiler bug/issue with the gcc 4.2.1 on SUSE 10.  See\n//    http://code.google.com/p/google-gflags/issues/detail?id=20\n#define DEFINE_string(name, val, txt)                                     \\\n  namespace fLS {                                                         \\\n    static union { void* align; char s[sizeof(std::string)]; } s_##name[2]; \\\n    const std::string* const FLAGS_no##name = new (s_##name[0].s) std::string(val); \\\n    static ::google::FlagRegisterer o_##name(                \\\n      #name, \"string\", MAYBE_STRIPPED_HELP(txt), __FILE__,                \\\n      s_##name[0].s, new (s_##name[1].s) std::string(*FLAGS_no##name));   \\\n    extern std::string& FLAGS_##name;                                     \\\n    using fLS::FLAGS_##name;                                              \\\n    std::string& FLAGS_##name = *(reinterpret_cast<std::string*>(s_##name[0].s));   \\\n  }                                                                       \\\n  using fLS::FLAGS_##name\n\n#endif  // SWIG\n\n#endif  // GOOGLE_GFLAGS_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/linux/include/gflags/gflags_completions.h",
    "content": "// Copyright (c) 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// ---\n// Author: Dave Nicponski\n//\n// Implement helpful bash-style command line flag completions\n//\n// ** Functional API:\n// HandleCommandLineCompletions() should be called early during\n// program startup, but after command line flag code has been\n// initialized, such as the beginning of HandleCommandLineHelpFlags().\n// It checks the value of the flag --tab_completion_word.  If this\n// flag is empty, nothing happens here.  If it contains a string,\n// however, then HandleCommandLineCompletions() will hijack the\n// process, attempting to identify the intention behind this\n// completion.  Regardless of the outcome of this deduction, the\n// process will be terminated, similar to --helpshort flag\n// handling.\n//\n// ** Overview of Bash completions:\n// Bash can be told to programatically determine completions for the\n// current 'cursor word'.  It does this by (in this case) invoking a\n// command with some additional arguments identifying the command\n// being executed, the word being completed, and the previous word\n// (if any).  Bash then expects a sequence of output lines to be\n// printed to stdout.  If these lines all contain a common prefix\n// longer than the cursor word, bash will replace the cursor word\n// with that common prefix, and display nothing.  If there isn't such\n// a common prefix, bash will display the lines in pages using 'more'.\n//\n// ** Strategy taken for command line completions:\n// If we can deduce either the exact flag intended, or a common flag\n// prefix, we'll output exactly that.  Otherwise, if information\n// must be displayed to the user, we'll take the opportunity to add\n// some helpful information beyond just the flag name (specifically,\n// we'll include the default flag value and as much of the flag's\n// description as can fit on a single terminal line width, as specified\n// by the flag --tab_completion_columns).  Furthermore, we'll try to\n// make bash order the output such that the most useful or relevent\n// flags are the most likely to be shown at the top.\n//\n// ** Additional features:\n// To assist in finding that one really useful flag, substring matching\n// was implemented.  Before pressing a <TAB> to get completion for the\n// current word, you can append one or more '?' to the flag to do\n// substring matching.  Here's the semantics:\n//   --foo<TAB>     Show me all flags with names prefixed by 'foo'\n//   --foo?<TAB>    Show me all flags with 'foo' somewhere in the name\n//   --foo??<TAB>   Same as prior case, but also search in module\n//                  definition path for 'foo'\n//   --foo???<TAB>  Same as prior case, but also search in flag\n//                  descriptions for 'foo'\n// Finally, we'll trim the output to a relatively small number of\n// flags to keep bash quiet about the verbosity of output.  If one\n// really wanted to see all possible matches, appending a '+' to the\n// search word will force the exhaustive list of matches to be printed.\n//\n// ** How to have bash accept completions from a binary:\n// Bash requires that it be informed about each command that programmatic\n// completion should be enabled for.  Example addition to a .bashrc\n// file would be (your path to gflags_completions.sh file may differ):\n\n/*\n$ complete -o bashdefault -o default -o nospace -C                        \\\n '/usr/local/bin/gflags_completions.sh --tab_completion_columns $COLUMNS' \\\n  time  env  binary_name  another_binary  [...]\n*/\n\n// This would allow the following to work:\n//   $ /path/to/binary_name --vmodule<TAB>\n// Or:\n//   $ ./bin/path/another_binary --gfs_u<TAB>\n// (etc)\n//\n// Sadly, it appears that bash gives no easy way to force this behavior for\n// all commands.  That's where the \"time\" in the above example comes in.\n// If you haven't specifically added a command to the list of completion\n// supported commands, you can still get completions by prefixing the\n// entire command with \"env\".\n//   $ env /some/brand/new/binary --vmod<TAB>\n// Assuming that \"binary\" is a newly compiled binary, this should still\n// produce the expected completion output.\n\n\n#ifndef GOOGLE_GFLAGS_COMPLETIONS_H_\n#define GOOGLE_GFLAGS_COMPLETIONS_H_\n\nnamespace google {\n\nvoid HandleCommandLineCompletions(void);\n\n}\n\n#endif  // GOOGLE_GFLAGS_COMPLETIONS_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/lss/linux_syscall_support.h",
    "content": "/* Copyright (c) 2005-2010, Google Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *     * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following disclaimer\n * in the documentation and/or other materials provided with the\n * distribution.\n *     * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * ---\n * Author: Markus Gutschke\n */\n\n/* This file includes Linux-specific support functions common to the\n * coredumper and the thread lister; primarily, this is a collection\n * of direct system calls, and a couple of symbols missing from\n * standard header files.\n * There are a few options that the including file can set to control\n * the behavior of this file:\n *\n * SYS_CPLUSPLUS:\n *   The entire header file will normally be wrapped in 'extern \"C\" { }\",\n *   making it suitable for compilation as both C and C++ source. If you\n *   do not want to do this, you can set the SYS_CPLUSPLUS macro to inhibit\n *   the wrapping. N.B. doing so will suppress inclusion of all prerequisite\n *   system header files, too. It is the caller's responsibility to provide\n *   the necessary definitions.\n *\n * SYS_ERRNO:\n *   All system calls will update \"errno\" unless overriden by setting the\n *   SYS_ERRNO macro prior to including this file. SYS_ERRNO should be\n *   an l-value.\n *\n * SYS_INLINE:\n *   New symbols will be defined \"static inline\", unless overridden by\n *   the SYS_INLINE macro.\n *\n * SYS_LINUX_SYSCALL_SUPPORT_H\n *   This macro is used to avoid multiple inclusions of this header file.\n *   If you need to include this file more than once, make sure to\n *   unset SYS_LINUX_SYSCALL_SUPPORT_H before each inclusion.\n *\n * SYS_PREFIX:\n *   New system calls will have a prefix of \"sys_\" unless overridden by\n *   the SYS_PREFIX macro. Valid values for this macro are [0..9] which\n *   results in prefixes \"sys[0..9]_\". It is also possible to set this\n *   macro to -1, which avoids all prefixes.\n *\n * SYS_SYSCALL_ENTRYPOINT:\n *   Some applications (such as sandboxes that filter system calls), need\n *   to be able to run custom-code each time a system call is made. If this\n *   macro is defined, it expands to the name of a \"common\" symbol. If\n *   this symbol is assigned a non-NULL pointer value, it is used as the\n *   address of the system call entrypoint.\n *   A pointer to this symbol can be obtained by calling\n *   get_syscall_entrypoint()\n *\n * This file defines a few internal symbols that all start with \"LSS_\".\n * Do not access these symbols from outside this file. They are not part\n * of the supported API.\n */\n#ifndef SYS_LINUX_SYSCALL_SUPPORT_H\n#define SYS_LINUX_SYSCALL_SUPPORT_H\n\n/* We currently only support x86-32, x86-64, ARM, MIPS, and PPC on Linux.\n * Porting to other related platforms should not be difficult.\n */\n#if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) ||   \\\n     defined(__mips__) || defined(__PPC__) || defined(__ARM_EABI__)) \\\n  && (defined(__linux) || defined(__ANDROID__))\n\n#ifndef SYS_CPLUSPLUS\n#ifdef __cplusplus\n/* Some system header files in older versions of gcc neglect to properly\n * handle being included from C++. As it appears to be harmless to have\n * multiple nested 'extern \"C\"' blocks, just add another one here.\n */\nextern \"C\" {\n#endif\n\n#include <errno.h>\n#include <fcntl.h>\n#include <signal.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <string.h>\n#include <sys/ptrace.h>\n#include <sys/resource.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <sys/syscall.h>\n#include <unistd.h>\n#include <linux/unistd.h>\n#include <endian.h>\n\n#ifdef __mips__\n/* Include definitions of the ABI currently in use.                          */\n#include <sgidefs.h>\n#endif\n#endif\n\n/* As glibc often provides subtly incompatible data structures (and implicit\n * wrapper functions that convert them), we provide our own kernel data\n * structures for use by the system calls.\n * These structures have been developed by using Linux 2.6.23 headers for\n * reference. Note though, we do not care about exact API compatibility\n * with the kernel, and in fact the kernel often does not have a single\n * API that works across architectures. Instead, we try to mimic the glibc\n * API where reasonable, and only guarantee ABI compatibility with the\n * kernel headers.\n * Most notably, here are a few changes that were made to the structures\n * defined by kernel headers:\n *\n * - we only define structures, but not symbolic names for kernel data\n *   types. For the latter, we directly use the native C datatype\n *   (i.e. \"unsigned\" instead of \"mode_t\").\n * - in a few cases, it is possible to define identical structures for\n *   both 32bit (e.g. i386) and 64bit (e.g. x86-64) platforms by\n *   standardizing on the 64bit version of the data types. In particular,\n *   this means that we use \"unsigned\" where the 32bit headers say\n *   \"unsigned long\".\n * - overall, we try to minimize the number of cases where we need to\n *   conditionally define different structures.\n * - the \"struct kernel_sigaction\" class of structures have been\n *   modified to more closely mimic glibc's API by introducing an\n *   anonymous union for the function pointer.\n * - a small number of field names had to have an underscore appended to\n *   them, because glibc defines a global macro by the same name.\n */\n\n/* include/linux/dirent.h                                                    */\nstruct kernel_dirent64 {\n  unsigned long long d_ino;\n  long long          d_off;\n  unsigned short     d_reclen;\n  unsigned char      d_type;\n  char               d_name[256];\n};\n\n/* include/linux/dirent.h                                                    */\nstruct kernel_dirent {\n  long               d_ino;\n  long               d_off;\n  unsigned short     d_reclen;\n  char               d_name[256];\n};\n\n/* include/linux/uio.h                                                       */\nstruct kernel_iovec {\n  void               *iov_base;\n  unsigned long      iov_len;\n};\n\n/* include/linux/socket.h                                                    */\nstruct kernel_msghdr {\n  void               *msg_name;\n  int                msg_namelen;\n  struct kernel_iovec*msg_iov;\n  unsigned long      msg_iovlen;\n  void               *msg_control;\n  unsigned long      msg_controllen;\n  unsigned           msg_flags;\n};\n\n/* include/asm-generic/poll.h                                                */\nstruct kernel_pollfd {\n  int                fd;\n  short              events;\n  short              revents;\n};\n\n/* include/linux/resource.h                                                  */\nstruct kernel_rlimit {\n  unsigned long      rlim_cur;\n  unsigned long      rlim_max;\n};\n\n/* include/linux/time.h                                                      */\nstruct kernel_timespec {\n  long               tv_sec;\n  long               tv_nsec;\n};\n\n/* include/linux/time.h                                                      */\nstruct kernel_timeval {\n  long               tv_sec;\n  long               tv_usec;\n};\n\n/* include/linux/resource.h                                                  */\nstruct kernel_rusage {\n  struct kernel_timeval ru_utime;\n  struct kernel_timeval ru_stime;\n  long               ru_maxrss;\n  long               ru_ixrss;\n  long               ru_idrss;\n  long               ru_isrss;\n  long               ru_minflt;\n  long               ru_majflt;\n  long               ru_nswap;\n  long               ru_inblock;\n  long               ru_oublock;\n  long               ru_msgsnd;\n  long               ru_msgrcv;\n  long               ru_nsignals;\n  long               ru_nvcsw;\n  long               ru_nivcsw;\n};\n\nstruct siginfo;\n#if defined(__i386__) || defined(__ARM_EABI__) || defined(__ARM_ARCH_3__) \\\n  || defined(__PPC__)\n\n/* include/asm-{arm,i386,mips,ppc}/signal.h                                  */\nstruct kernel_old_sigaction {\n  union {\n    void             (*sa_handler_)(int);\n    void             (*sa_sigaction_)(int, struct siginfo *, void *);\n  };\n  unsigned long      sa_mask;\n  unsigned long      sa_flags;\n  void               (*sa_restorer)(void);\n} __attribute__((packed,aligned(4)));\n#elif (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32)\n  #define kernel_old_sigaction kernel_sigaction\n#endif\n\n/* Some kernel functions (e.g. sigaction() in 2.6.23) require that the\n * exactly match the size of the signal set, even though the API was\n * intended to be extensible. We define our own KERNEL_NSIG to deal with\n * this.\n * Please note that glibc provides signals [1.._NSIG-1], whereas the\n * kernel (and this header) provides the range [1..KERNEL_NSIG]. The\n * actual number of signals is obviously the same, but the constants\n * differ by one.\n */\n#ifdef __mips__\n#define KERNEL_NSIG 128\n#else\n#define KERNEL_NSIG  64\n#endif\n\n/* include/asm-{arm,i386,mips,x86_64}/signal.h                               */\nstruct kernel_sigset_t {\n  unsigned long sig[(KERNEL_NSIG + 8*sizeof(unsigned long) - 1)/\n                    (8*sizeof(unsigned long))];\n};\n\n/* include/asm-{arm,i386,mips,x86_64,ppc}/signal.h                           */\nstruct kernel_sigaction {\n#ifdef __mips__\n  unsigned long      sa_flags;\n  union {\n    void             (*sa_handler_)(int);\n    void             (*sa_sigaction_)(int, struct siginfo *, void *);\n  };\n  struct kernel_sigset_t sa_mask;\n#else\n  union {\n    void             (*sa_handler_)(int);\n    void             (*sa_sigaction_)(int, struct siginfo *, void *);\n  };\n  unsigned long      sa_flags;\n  void               (*sa_restorer)(void);\n  struct kernel_sigset_t sa_mask;\n#endif\n};\n\n/* include/linux/socket.h                                                    */\nstruct kernel_sockaddr {\n  unsigned short     sa_family;\n  char               sa_data[14];\n};\n\n/* include/asm-{arm,i386,mips,ppc}/stat.h                                    */\n#ifdef __mips__\n#if _MIPS_SIM == _MIPS_SIM_ABI64\nstruct kernel_stat {\n#else\nstruct kernel_stat64 {\n#endif\n  unsigned           st_dev;\n  unsigned           __pad0[3];\n  unsigned long long st_ino;\n  unsigned           st_mode;\n  unsigned           st_nlink;\n  unsigned           st_uid;\n  unsigned           st_gid;\n  unsigned           st_rdev;\n  unsigned           __pad1[3];\n  long long          st_size;\n  unsigned           st_atime_;\n  unsigned           st_atime_nsec_;\n  unsigned           st_mtime_;\n  unsigned           st_mtime_nsec_;\n  unsigned           st_ctime_;\n  unsigned           st_ctime_nsec_;\n  unsigned           st_blksize;\n  unsigned           __pad2;\n  unsigned long long st_blocks;\n};\n#elif defined __PPC__\nstruct kernel_stat64 {\n  unsigned long long st_dev;\n  unsigned long long st_ino;\n  unsigned           st_mode;\n  unsigned           st_nlink;\n  unsigned           st_uid;\n  unsigned           st_gid;\n  unsigned long long st_rdev;\n  unsigned short int __pad2;\n  long long          st_size;\n  long               st_blksize;\n  long long          st_blocks;\n  long               st_atime_;\n  unsigned long      st_atime_nsec_;\n  long               st_mtime_;\n  unsigned long      st_mtime_nsec_;\n  long               st_ctime_;\n  unsigned long      st_ctime_nsec_;\n  unsigned long      __unused4;\n  unsigned long      __unused5;\n};\n#else\nstruct kernel_stat64 {\n  unsigned long long st_dev;\n  unsigned char      __pad0[4];\n  unsigned           __st_ino;\n  unsigned           st_mode;\n  unsigned           st_nlink;\n  unsigned           st_uid;\n  unsigned           st_gid;\n  unsigned long long st_rdev;\n  unsigned char      __pad3[4];\n  long long          st_size;\n  unsigned           st_blksize;\n  unsigned long long st_blocks;\n  unsigned           st_atime_;\n  unsigned           st_atime_nsec_;\n  unsigned           st_mtime_;\n  unsigned           st_mtime_nsec_;\n  unsigned           st_ctime_;\n  unsigned           st_ctime_nsec_;\n  unsigned long long st_ino;\n};\n#endif\n\n/* include/asm-{arm,i386,mips,x86_64,ppc}/stat.h                             */\n#if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__)\nstruct kernel_stat {\n  /* The kernel headers suggest that st_dev and st_rdev should be 32bit\n   * quantities encoding 12bit major and 20bit minor numbers in an interleaved\n   * format. In reality, we do not see useful data in the top bits. So,\n   * we'll leave the padding in here, until we find a better solution.\n   */\n  unsigned short     st_dev;\n  short              pad1;\n  unsigned           st_ino;\n  unsigned short     st_mode;\n  unsigned short     st_nlink;\n  unsigned short     st_uid;\n  unsigned short     st_gid;\n  unsigned short     st_rdev;\n  short              pad2;\n  unsigned           st_size;\n  unsigned           st_blksize;\n  unsigned           st_blocks;\n  unsigned           st_atime_;\n  unsigned           st_atime_nsec_;\n  unsigned           st_mtime_;\n  unsigned           st_mtime_nsec_;\n  unsigned           st_ctime_;\n  unsigned           st_ctime_nsec_;\n  unsigned           __unused4;\n  unsigned           __unused5;\n};\n#elif defined(__x86_64__)\nstruct kernel_stat {\n  unsigned long      st_dev;\n  unsigned long      st_ino;\n  unsigned long      st_nlink;\n  unsigned           st_mode;\n  unsigned           st_uid;\n  unsigned           st_gid;\n  unsigned           __pad0;\n  unsigned long      st_rdev;\n  long               st_size;\n  long               st_blksize;\n  long               st_blocks;\n  unsigned long      st_atime_;\n  unsigned long      st_atime_nsec_;\n  unsigned long      st_mtime_;\n  unsigned long      st_mtime_nsec_;\n  unsigned long      st_ctime_;\n  unsigned long      st_ctime_nsec_;\n  long               __unused[3];\n};\n#elif defined(__PPC__)\nstruct kernel_stat {\n  unsigned           st_dev;\n  unsigned long      st_ino;      // ino_t\n  unsigned long      st_mode;     // mode_t\n  unsigned short     st_nlink;    // nlink_t\n  unsigned           st_uid;      // uid_t\n  unsigned           st_gid;      // gid_t\n  unsigned           st_rdev;\n  long               st_size;     // off_t\n  unsigned long      st_blksize;\n  unsigned long      st_blocks;\n  unsigned long      st_atime_;\n  unsigned long      st_atime_nsec_;\n  unsigned long      st_mtime_;\n  unsigned long      st_mtime_nsec_;\n  unsigned long      st_ctime_;\n  unsigned long      st_ctime_nsec_;\n  unsigned long      __unused4;\n  unsigned long      __unused5;\n};\n#elif (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64)\nstruct kernel_stat {\n  unsigned           st_dev;\n  int                st_pad1[3];\n  unsigned           st_ino;\n  unsigned           st_mode;\n  unsigned           st_nlink;\n  unsigned           st_uid;\n  unsigned           st_gid;\n  unsigned           st_rdev;\n  int                st_pad2[2];\n  long               st_size;\n  int                st_pad3;\n  long               st_atime_;\n  long               st_atime_nsec_;\n  long               st_mtime_;\n  long               st_mtime_nsec_;\n  long               st_ctime_;\n  long               st_ctime_nsec_;\n  int                st_blksize;\n  int                st_blocks;\n  int                st_pad4[14];\n};\n#endif\n\n/* include/asm-{arm,i386,mips,x86_64,ppc}/statfs.h                           */\n#ifdef __mips__\n#if _MIPS_SIM != _MIPS_SIM_ABI64\nstruct kernel_statfs64 {\n  unsigned long      f_type;\n  unsigned long      f_bsize;\n  unsigned long      f_frsize;\n  unsigned long      __pad;\n  unsigned long long f_blocks;\n  unsigned long long f_bfree;\n  unsigned long long f_files;\n  unsigned long long f_ffree;\n  unsigned long long f_bavail;\n  struct { int val[2]; } f_fsid;\n  unsigned long      f_namelen;\n  unsigned long      f_spare[6];\n};\n#endif\n#elif !defined(__x86_64__)\nstruct kernel_statfs64 {\n  unsigned long      f_type;\n  unsigned long      f_bsize;\n  unsigned long long f_blocks;\n  unsigned long long f_bfree;\n  unsigned long long f_bavail;\n  unsigned long long f_files;\n  unsigned long long f_ffree;\n  struct { int val[2]; } f_fsid;\n  unsigned long      f_namelen;\n  unsigned long      f_frsize;\n  unsigned long      f_spare[5];\n};\n#endif\n\n/* include/asm-{arm,i386,mips,x86_64,ppc,generic}/statfs.h                   */\n#ifdef __mips__\nstruct kernel_statfs {\n  long               f_type;\n  long               f_bsize;\n  long               f_frsize;\n  long               f_blocks;\n  long               f_bfree;\n  long               f_files;\n  long               f_ffree;\n  long               f_bavail;\n  struct { int val[2]; } f_fsid;\n  long               f_namelen;\n  long               f_spare[6];\n};\n#else\nstruct kernel_statfs {\n  /* x86_64 actually defines all these fields as signed, whereas all other  */\n  /* platforms define them as unsigned. Leaving them at unsigned should not */\n  /* cause any problems.                                                    */\n  unsigned long      f_type;\n  unsigned long      f_bsize;\n  unsigned long      f_blocks;\n  unsigned long      f_bfree;\n  unsigned long      f_bavail;\n  unsigned long      f_files;\n  unsigned long      f_ffree;\n  struct { int val[2]; } f_fsid;\n  unsigned long      f_namelen;\n  unsigned long      f_frsize;\n  unsigned long      f_spare[5];\n};\n#endif\n\n\n/* Definitions missing from the standard header files                        */\n#ifndef O_DIRECTORY\n#if defined(__ARM_ARCH_3__) || defined(__ARM_EABI__)\n#define O_DIRECTORY             0040000\n#else\n#define O_DIRECTORY             0200000\n#endif\n#endif\n#ifndef NT_PRXFPREG\n#define NT_PRXFPREG             0x46e62b7f\n#endif\n#ifndef PTRACE_GETFPXREGS\n#define PTRACE_GETFPXREGS       ((enum __ptrace_request)18)\n#endif\n#ifndef PR_GET_DUMPABLE\n#define PR_GET_DUMPABLE         3\n#endif\n#ifndef PR_SET_DUMPABLE\n#define PR_SET_DUMPABLE         4\n#endif\n#ifndef PR_GET_SECCOMP\n#define PR_GET_SECCOMP          21\n#endif\n#ifndef PR_SET_SECCOMP\n#define PR_SET_SECCOMP          22\n#endif\n#ifndef AT_FDCWD\n#define AT_FDCWD                (-100)\n#endif\n#ifndef AT_SYMLINK_NOFOLLOW\n#define AT_SYMLINK_NOFOLLOW     0x100\n#endif\n#ifndef AT_REMOVEDIR\n#define AT_REMOVEDIR            0x200\n#endif\n#ifndef MREMAP_FIXED\n#define MREMAP_FIXED            2\n#endif\n#ifndef SA_RESTORER\n#define SA_RESTORER             0x04000000\n#endif\n#ifndef CPUCLOCK_PROF\n#define CPUCLOCK_PROF           0\n#endif\n#ifndef CPUCLOCK_VIRT\n#define CPUCLOCK_VIRT           1\n#endif\n#ifndef CPUCLOCK_SCHED\n#define CPUCLOCK_SCHED          2\n#endif\n#ifndef CPUCLOCK_PERTHREAD_MASK\n#define CPUCLOCK_PERTHREAD_MASK 4\n#endif\n#ifndef MAKE_PROCESS_CPUCLOCK\n#define MAKE_PROCESS_CPUCLOCK(pid, clock)                                     \\\n        ((~(int)(pid) << 3) | (int)(clock))\n#endif\n#ifndef MAKE_THREAD_CPUCLOCK\n#define MAKE_THREAD_CPUCLOCK(tid, clock)                                      \\\n        ((~(int)(tid) << 3) | (int)((clock) | CPUCLOCK_PERTHREAD_MASK))\n#endif\n\n#ifndef FUTEX_WAIT\n#define FUTEX_WAIT                0\n#endif\n#ifndef FUTEX_WAKE\n#define FUTEX_WAKE                1\n#endif\n#ifndef FUTEX_FD\n#define FUTEX_FD                  2\n#endif\n#ifndef FUTEX_REQUEUE\n#define FUTEX_REQUEUE             3\n#endif\n#ifndef FUTEX_CMP_REQUEUE\n#define FUTEX_CMP_REQUEUE         4\n#endif\n#ifndef FUTEX_WAKE_OP\n#define FUTEX_WAKE_OP             5\n#endif\n#ifndef FUTEX_LOCK_PI\n#define FUTEX_LOCK_PI             6\n#endif\n#ifndef FUTEX_UNLOCK_PI\n#define FUTEX_UNLOCK_PI           7\n#endif\n#ifndef FUTEX_TRYLOCK_PI\n#define FUTEX_TRYLOCK_PI          8\n#endif\n#ifndef FUTEX_PRIVATE_FLAG\n#define FUTEX_PRIVATE_FLAG        128\n#endif\n#ifndef FUTEX_CMD_MASK\n#define FUTEX_CMD_MASK            ~FUTEX_PRIVATE_FLAG\n#endif\n#ifndef FUTEX_WAIT_PRIVATE\n#define FUTEX_WAIT_PRIVATE        (FUTEX_WAIT | FUTEX_PRIVATE_FLAG)\n#endif\n#ifndef FUTEX_WAKE_PRIVATE\n#define FUTEX_WAKE_PRIVATE        (FUTEX_WAKE | FUTEX_PRIVATE_FLAG)\n#endif\n#ifndef FUTEX_REQUEUE_PRIVATE\n#define FUTEX_REQUEUE_PRIVATE     (FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG)\n#endif\n#ifndef FUTEX_CMP_REQUEUE_PRIVATE\n#define FUTEX_CMP_REQUEUE_PRIVATE (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG)\n#endif\n#ifndef FUTEX_WAKE_OP_PRIVATE\n#define FUTEX_WAKE_OP_PRIVATE     (FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG)\n#endif\n#ifndef FUTEX_LOCK_PI_PRIVATE\n#define FUTEX_LOCK_PI_PRIVATE     (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG)\n#endif\n#ifndef FUTEX_UNLOCK_PI_PRIVATE\n#define FUTEX_UNLOCK_PI_PRIVATE   (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG)\n#endif\n#ifndef FUTEX_TRYLOCK_PI_PRIVATE\n#define FUTEX_TRYLOCK_PI_PRIVATE  (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG)\n#endif\n\n\n#if defined(__x86_64__)\n#ifndef ARCH_SET_GS\n#define ARCH_SET_GS             0x1001\n#endif\n#ifndef ARCH_GET_GS\n#define ARCH_GET_GS             0x1004\n#endif\n#endif\n\n#if defined(__i386__)\n#ifndef __NR_quotactl\n#define __NR_quotactl           131\n#endif\n#ifndef __NR_setresuid\n#define __NR_setresuid          164\n#define __NR_getresuid          165\n#define __NR_setresgid          170\n#define __NR_getresgid          171\n#endif\n#ifndef __NR_rt_sigaction\n#define __NR_rt_sigreturn       173\n#define __NR_rt_sigaction       174\n#define __NR_rt_sigprocmask     175\n#define __NR_rt_sigpending      176\n#define __NR_rt_sigsuspend      179\n#endif\n#ifndef __NR_pread64\n#define __NR_pread64            180\n#endif\n#ifndef __NR_pwrite64\n#define __NR_pwrite64           181\n#endif\n#ifndef __NR_ugetrlimit\n#define __NR_ugetrlimit         191\n#endif\n#ifndef __NR_stat64\n#define __NR_stat64             195\n#endif\n#ifndef __NR_fstat64\n#define __NR_fstat64            197\n#endif\n#ifndef __NR_setresuid32\n#define __NR_setresuid32        208\n#define __NR_getresuid32        209\n#define __NR_setresgid32        210\n#define __NR_getresgid32        211\n#endif\n#ifndef __NR_setfsuid32\n#define __NR_setfsuid32         215\n#define __NR_setfsgid32         216\n#endif\n#ifndef __NR_getdents64\n#define __NR_getdents64         220\n#endif\n#ifndef __NR_gettid\n#define __NR_gettid             224\n#endif\n#ifndef __NR_readahead\n#define __NR_readahead          225\n#endif\n#ifndef __NR_setxattr\n#define __NR_setxattr           226\n#endif\n#ifndef __NR_lsetxattr\n#define __NR_lsetxattr          227\n#endif\n#ifndef __NR_getxattr\n#define __NR_getxattr           229\n#endif\n#ifndef __NR_lgetxattr\n#define __NR_lgetxattr          230\n#endif\n#ifndef __NR_listxattr\n#define __NR_listxattr          232\n#endif\n#ifndef __NR_llistxattr\n#define __NR_llistxattr         233\n#endif\n#ifndef __NR_tkill\n#define __NR_tkill              238\n#endif\n#ifndef __NR_futex\n#define __NR_futex              240\n#endif\n#ifndef __NR_sched_setaffinity\n#define __NR_sched_setaffinity  241\n#define __NR_sched_getaffinity  242\n#endif\n#ifndef __NR_set_tid_address\n#define __NR_set_tid_address    258\n#endif\n#ifndef __NR_clock_gettime\n#define __NR_clock_gettime      265\n#endif\n#ifndef __NR_clock_getres\n#define __NR_clock_getres       266\n#endif\n#ifndef __NR_statfs64\n#define __NR_statfs64           268\n#endif\n#ifndef __NR_fstatfs64\n#define __NR_fstatfs64          269\n#endif\n#ifndef __NR_fadvise64_64\n#define __NR_fadvise64_64       272\n#endif\n#ifndef __NR_ioprio_set\n#define __NR_ioprio_set         289\n#endif\n#ifndef __NR_ioprio_get\n#define __NR_ioprio_get         290\n#endif\n#ifndef __NR_openat\n#define __NR_openat             295\n#endif\n#ifndef __NR_fstatat64\n#define __NR_fstatat64          300\n#endif\n#ifndef __NR_unlinkat\n#define __NR_unlinkat           301\n#endif\n#ifndef __NR_move_pages\n#define __NR_move_pages         317\n#endif\n#ifndef __NR_getcpu\n#define __NR_getcpu             318\n#endif\n#ifndef __NR_fallocate\n#define __NR_fallocate          324\n#endif\n/* End of i386 definitions                                                   */\n#elif defined(__ARM_ARCH_3__) || defined(__ARM_EABI__)\n#ifndef __NR_setresuid\n#define __NR_setresuid          (__NR_SYSCALL_BASE + 164)\n#define __NR_getresuid          (__NR_SYSCALL_BASE + 165)\n#define __NR_setresgid          (__NR_SYSCALL_BASE + 170)\n#define __NR_getresgid          (__NR_SYSCALL_BASE + 171)\n#endif\n#ifndef __NR_rt_sigaction\n#define __NR_rt_sigreturn       (__NR_SYSCALL_BASE + 173)\n#define __NR_rt_sigaction       (__NR_SYSCALL_BASE + 174)\n#define __NR_rt_sigprocmask     (__NR_SYSCALL_BASE + 175)\n#define __NR_rt_sigpending      (__NR_SYSCALL_BASE + 176)\n#define __NR_rt_sigsuspend      (__NR_SYSCALL_BASE + 179)\n#endif\n#ifndef __NR_pread64\n#define __NR_pread64            (__NR_SYSCALL_BASE + 180)\n#endif\n#ifndef __NR_pwrite64\n#define __NR_pwrite64           (__NR_SYSCALL_BASE + 181)\n#endif\n#ifndef __NR_ugetrlimit\n#define __NR_ugetrlimit         (__NR_SYSCALL_BASE + 191)\n#endif\n#ifndef __NR_stat64\n#define __NR_stat64             (__NR_SYSCALL_BASE + 195)\n#endif\n#ifndef __NR_fstat64\n#define __NR_fstat64            (__NR_SYSCALL_BASE + 197)\n#endif\n#ifndef __NR_setresuid32\n#define __NR_setresuid32        (__NR_SYSCALL_BASE + 208)\n#define __NR_getresuid32        (__NR_SYSCALL_BASE + 209)\n#define __NR_setresgid32        (__NR_SYSCALL_BASE + 210)\n#define __NR_getresgid32        (__NR_SYSCALL_BASE + 211)\n#endif\n#ifndef __NR_setfsuid32\n#define __NR_setfsuid32         (__NR_SYSCALL_BASE + 215)\n#define __NR_setfsgid32         (__NR_SYSCALL_BASE + 216)\n#endif\n#ifndef __NR_getdents64\n#define __NR_getdents64         (__NR_SYSCALL_BASE + 217)\n#endif\n#ifndef __NR_gettid\n#define __NR_gettid             (__NR_SYSCALL_BASE + 224)\n#endif\n#ifndef __NR_readahead\n#define __NR_readahead          (__NR_SYSCALL_BASE + 225)\n#endif\n#ifndef __NR_setxattr\n#define __NR_setxattr           (__NR_SYSCALL_BASE + 226)\n#endif\n#ifndef __NR_lsetxattr\n#define __NR_lsetxattr          (__NR_SYSCALL_BASE + 227)\n#endif\n#ifndef __NR_getxattr\n#define __NR_getxattr           (__NR_SYSCALL_BASE + 229)\n#endif\n#ifndef __NR_lgetxattr\n#define __NR_lgetxattr          (__NR_SYSCALL_BASE + 230)\n#endif\n#ifndef __NR_listxattr\n#define __NR_listxattr          (__NR_SYSCALL_BASE + 232)\n#endif\n#ifndef __NR_llistxattr\n#define __NR_llistxattr         (__NR_SYSCALL_BASE + 233)\n#endif\n#ifndef __NR_tkill\n#define __NR_tkill              (__NR_SYSCALL_BASE + 238)\n#endif\n#ifndef __NR_futex\n#define __NR_futex              (__NR_SYSCALL_BASE + 240)\n#endif\n#ifndef __NR_sched_setaffinity\n#define __NR_sched_setaffinity  (__NR_SYSCALL_BASE + 241)\n#define __NR_sched_getaffinity  (__NR_SYSCALL_BASE + 242)\n#endif\n#ifndef __NR_set_tid_address\n#define __NR_set_tid_address    (__NR_SYSCALL_BASE + 256)\n#endif\n#ifndef __NR_clock_gettime\n#define __NR_clock_gettime      (__NR_SYSCALL_BASE + 263)\n#endif\n#ifndef __NR_clock_getres\n#define __NR_clock_getres       (__NR_SYSCALL_BASE + 264)\n#endif\n#ifndef __NR_statfs64\n#define __NR_statfs64           (__NR_SYSCALL_BASE + 266)\n#endif\n#ifndef __NR_fstatfs64\n#define __NR_fstatfs64          (__NR_SYSCALL_BASE + 267)\n#endif\n#ifndef __NR_ioprio_set\n#define __NR_ioprio_set         (__NR_SYSCALL_BASE + 314)\n#endif\n#ifndef __NR_ioprio_get\n#define __NR_ioprio_get         (__NR_SYSCALL_BASE + 315)\n#endif\n#ifndef __NR_move_pages\n#define __NR_move_pages         (__NR_SYSCALL_BASE + 344)\n#endif\n#ifndef __NR_getcpu\n#define __NR_getcpu             (__NR_SYSCALL_BASE + 345)\n#endif\n/* End of ARM 3/EABI definitions                                                */\n#elif defined(__x86_64__)\n#ifndef __NR_pread64\n#define __NR_pread64             17\n#endif\n#ifndef __NR_pwrite64\n#define __NR_pwrite64            18\n#endif\n#ifndef __NR_setresuid\n#define __NR_setresuid          117\n#define __NR_getresuid          118\n#define __NR_setresgid          119\n#define __NR_getresgid          120\n#endif\n#ifndef __NR_quotactl\n#define __NR_quotactl           179\n#endif\n#ifndef __NR_gettid\n#define __NR_gettid             186\n#endif\n#ifndef __NR_readahead\n#define __NR_readahead          187\n#endif\n#ifndef __NR_setxattr\n#define __NR_setxattr           188\n#endif\n#ifndef __NR_lsetxattr\n#define __NR_lsetxattr          189\n#endif\n#ifndef __NR_getxattr\n#define __NR_getxattr           191\n#endif\n#ifndef __NR_lgetxattr\n#define __NR_lgetxattr          192\n#endif\n#ifndef __NR_listxattr\n#define __NR_listxattr          194\n#endif\n#ifndef __NR_llistxattr\n#define __NR_llistxattr         195\n#endif\n#ifndef __NR_tkill\n#define __NR_tkill              200\n#endif\n#ifndef __NR_futex\n#define __NR_futex              202\n#endif\n#ifndef __NR_sched_setaffinity\n#define __NR_sched_setaffinity  203\n#define __NR_sched_getaffinity  204\n#endif\n#ifndef __NR_getdents64\n#define __NR_getdents64         217\n#endif\n#ifndef __NR_set_tid_address\n#define __NR_set_tid_address    218\n#endif\n#ifndef __NR_fadvise64\n#define __NR_fadvise64          221\n#endif\n#ifndef __NR_clock_gettime\n#define __NR_clock_gettime      228\n#endif\n#ifndef __NR_clock_getres\n#define __NR_clock_getres       229\n#endif\n#ifndef __NR_ioprio_set\n#define __NR_ioprio_set         251\n#endif\n#ifndef __NR_ioprio_get\n#define __NR_ioprio_get         252\n#endif\n#ifndef __NR_openat\n#define __NR_openat             257\n#endif\n#ifndef __NR_newfstatat\n#define __NR_newfstatat         262\n#endif\n#ifndef __NR_unlinkat\n#define __NR_unlinkat           263\n#endif\n#ifndef __NR_move_pages\n#define __NR_move_pages         279\n#endif\n#ifndef __NR_fallocate\n#define __NR_fallocate          285\n#endif\n/* End of x86-64 definitions                                                 */\n#elif defined(__mips__)\n#if _MIPS_SIM == _MIPS_SIM_ABI32\n#ifndef __NR_setresuid\n#define __NR_setresuid          (__NR_Linux + 185)\n#define __NR_getresuid          (__NR_Linux + 186)\n#define __NR_setresgid          (__NR_Linux + 190)\n#define __NR_getresgid          (__NR_Linux + 191)\n#endif\n#ifndef __NR_rt_sigaction\n#define __NR_rt_sigreturn       (__NR_Linux + 193)\n#define __NR_rt_sigaction       (__NR_Linux + 194)\n#define __NR_rt_sigprocmask     (__NR_Linux + 195)\n#define __NR_rt_sigpending      (__NR_Linux + 196)\n#define __NR_rt_sigsuspend      (__NR_Linux + 199)\n#endif\n#ifndef __NR_pread64\n#define __NR_pread64            (__NR_Linux + 200)\n#endif\n#ifndef __NR_pwrite64\n#define __NR_pwrite64           (__NR_Linux + 201)\n#endif\n#ifndef __NR_stat64\n#define __NR_stat64             (__NR_Linux + 213)\n#endif\n#ifndef __NR_fstat64\n#define __NR_fstat64            (__NR_Linux + 215)\n#endif\n#ifndef __NR_getdents64\n#define __NR_getdents64         (__NR_Linux + 219)\n#endif\n#ifndef __NR_gettid\n#define __NR_gettid             (__NR_Linux + 222)\n#endif\n#ifndef __NR_readahead\n#define __NR_readahead          (__NR_Linux + 223)\n#endif\n#ifndef __NR_setxattr\n#define __NR_setxattr           (__NR_Linux + 224)\n#endif\n#ifndef __NR_lsetxattr\n#define __NR_lsetxattr          (__NR_Linux + 225)\n#endif\n#ifndef __NR_getxattr\n#define __NR_getxattr           (__NR_Linux + 227)\n#endif\n#ifndef __NR_lgetxattr\n#define __NR_lgetxattr          (__NR_Linux + 228)\n#endif\n#ifndef __NR_listxattr\n#define __NR_listxattr          (__NR_Linux + 230)\n#endif\n#ifndef __NR_llistxattr\n#define __NR_llistxattr         (__NR_Linux + 231)\n#endif\n#ifndef __NR_tkill\n#define __NR_tkill              (__NR_Linux + 236)\n#endif\n#ifndef __NR_futex\n#define __NR_futex              (__NR_Linux + 238)\n#endif\n#ifndef __NR_sched_setaffinity\n#define __NR_sched_setaffinity  (__NR_Linux + 239)\n#define __NR_sched_getaffinity  (__NR_Linux + 240)\n#endif\n#ifndef __NR_set_tid_address\n#define __NR_set_tid_address    (__NR_Linux + 252)\n#endif\n#ifndef __NR_statfs64\n#define __NR_statfs64           (__NR_Linux + 255)\n#endif\n#ifndef __NR_fstatfs64\n#define __NR_fstatfs64          (__NR_Linux + 256)\n#endif\n#ifndef __NR_clock_gettime\n#define __NR_clock_gettime      (__NR_Linux + 263)\n#endif\n#ifndef __NR_clock_getres\n#define __NR_clock_getres       (__NR_Linux + 264)\n#endif\n#ifndef __NR_openat\n#define __NR_openat             (__NR_Linux + 288)\n#endif\n#ifndef __NR_fstatat\n#define __NR_fstatat            (__NR_Linux + 293)\n#endif\n#ifndef __NR_unlinkat\n#define __NR_unlinkat           (__NR_Linux + 294)\n#endif\n#ifndef __NR_move_pages\n#define __NR_move_pages         (__NR_Linux + 308)\n#endif\n#ifndef __NR_getcpu\n#define __NR_getcpu             (__NR_Linux + 312)\n#endif\n#ifndef __NR_ioprio_set\n#define __NR_ioprio_set         (__NR_Linux + 314)\n#endif\n#ifndef __NR_ioprio_get\n#define __NR_ioprio_get         (__NR_Linux + 315)\n#endif\n/* End of MIPS (old 32bit API) definitions */\n#elif  _MIPS_SIM == _MIPS_SIM_ABI64\n#ifndef __NR_pread64\n#define __NR_pread64            (__NR_Linux +  16)\n#endif\n#ifndef __NR_pwrite64\n#define __NR_pwrite64           (__NR_Linux +  17)\n#endif\n#ifndef __NR_setresuid\n#define __NR_setresuid          (__NR_Linux + 115)\n#define __NR_getresuid          (__NR_Linux + 116)\n#define __NR_setresgid          (__NR_Linux + 117)\n#define __NR_getresgid          (__NR_Linux + 118)\n#endif\n#ifndef __NR_gettid\n#define __NR_gettid             (__NR_Linux + 178)\n#endif\n#ifndef __NR_readahead\n#define __NR_readahead          (__NR_Linux + 179)\n#endif\n#ifndef __NR_setxattr\n#define __NR_setxattr           (__NR_Linux + 180)\n#endif\n#ifndef __NR_lsetxattr\n#define __NR_lsetxattr          (__NR_Linux + 181)\n#endif\n#ifndef __NR_getxattr\n#define __NR_getxattr           (__NR_Linux + 183)\n#endif\n#ifndef __NR_lgetxattr\n#define __NR_lgetxattr          (__NR_Linux + 184)\n#endif\n#ifndef __NR_listxattr\n#define __NR_listxattr          (__NR_Linux + 186)\n#endif\n#ifndef __NR_llistxattr\n#define __NR_llistxattr         (__NR_Linux + 187)\n#endif\n#ifndef __NR_tkill\n#define __NR_tkill              (__NR_Linux + 192)\n#endif\n#ifndef __NR_futex\n#define __NR_futex              (__NR_Linux + 194)\n#endif\n#ifndef __NR_sched_setaffinity\n#define __NR_sched_setaffinity  (__NR_Linux + 195)\n#define __NR_sched_getaffinity  (__NR_Linux + 196)\n#endif\n#ifndef __NR_set_tid_address\n#define __NR_set_tid_address    (__NR_Linux + 212)\n#endif\n#ifndef __NR_clock_gettime\n#define __NR_clock_gettime      (__NR_Linux + 222)\n#endif\n#ifndef __NR_clock_getres\n#define __NR_clock_getres       (__NR_Linux + 223)\n#endif\n#ifndef __NR_openat\n#define __NR_openat             (__NR_Linux + 247)\n#endif\n#ifndef __NR_fstatat\n#define __NR_fstatat            (__NR_Linux + 252)\n#endif\n#ifndef __NR_unlinkat\n#define __NR_unlinkat           (__NR_Linux + 253)\n#endif\n#ifndef __NR_move_pages\n#define __NR_move_pages         (__NR_Linux + 267)\n#endif\n#ifndef __NR_getcpu\n#define __NR_getcpu             (__NR_Linux + 271)\n#endif\n#ifndef __NR_ioprio_set\n#define __NR_ioprio_set         (__NR_Linux + 273)\n#endif\n#ifndef __NR_ioprio_get\n#define __NR_ioprio_get         (__NR_Linux + 274)\n#endif\n/* End of MIPS (64bit API) definitions */\n#else\n#ifndef __NR_setresuid\n#define __NR_setresuid          (__NR_Linux + 115)\n#define __NR_getresuid          (__NR_Linux + 116)\n#define __NR_setresgid          (__NR_Linux + 117)\n#define __NR_getresgid          (__NR_Linux + 118)\n#endif\n#ifndef __NR_gettid\n#define __NR_gettid             (__NR_Linux + 178)\n#endif\n#ifndef __NR_readahead\n#define __NR_readahead          (__NR_Linux + 179)\n#endif\n#ifndef __NR_setxattr\n#define __NR_setxattr           (__NR_Linux + 180)\n#endif\n#ifndef __NR_lsetxattr\n#define __NR_lsetxattr          (__NR_Linux + 181)\n#endif\n#ifndef __NR_getxattr\n#define __NR_getxattr           (__NR_Linux + 183)\n#endif\n#ifndef __NR_lgetxattr\n#define __NR_lgetxattr          (__NR_Linux + 184)\n#endif\n#ifndef __NR_listxattr\n#define __NR_listxattr          (__NR_Linux + 186)\n#endif\n#ifndef __NR_llistxattr\n#define __NR_llistxattr         (__NR_Linux + 187)\n#endif\n#ifndef __NR_tkill\n#define __NR_tkill              (__NR_Linux + 192)\n#endif\n#ifndef __NR_futex\n#define __NR_futex              (__NR_Linux + 194)\n#endif\n#ifndef __NR_sched_setaffinity\n#define __NR_sched_setaffinity  (__NR_Linux + 195)\n#define __NR_sched_getaffinity  (__NR_Linux + 196)\n#endif\n#ifndef __NR_set_tid_address\n#define __NR_set_tid_address    (__NR_Linux + 213)\n#endif\n#ifndef __NR_statfs64\n#define __NR_statfs64           (__NR_Linux + 217)\n#endif\n#ifndef __NR_fstatfs64\n#define __NR_fstatfs64          (__NR_Linux + 218)\n#endif\n#ifndef __NR_clock_gettime\n#define __NR_clock_gettime      (__NR_Linux + 226)\n#endif\n#ifndef __NR_clock_getres\n#define __NR_clock_getres       (__NR_Linux + 227)\n#endif\n#ifndef __NR_openat\n#define __NR_openat             (__NR_Linux + 251)\n#endif\n#ifndef __NR_fstatat\n#define __NR_fstatat            (__NR_Linux + 256)\n#endif\n#ifndef __NR_unlinkat\n#define __NR_unlinkat           (__NR_Linux + 257)\n#endif\n#ifndef __NR_move_pages\n#define __NR_move_pages         (__NR_Linux + 271)\n#endif\n#ifndef __NR_getcpu\n#define __NR_getcpu             (__NR_Linux + 275)\n#endif\n#ifndef __NR_ioprio_set\n#define __NR_ioprio_set         (__NR_Linux + 277)\n#endif\n#ifndef __NR_ioprio_get\n#define __NR_ioprio_get         (__NR_Linux + 278)\n#endif\n/* End of MIPS (new 32bit API) definitions                                   */\n#endif\n/* End of MIPS definitions                                                   */\n#elif defined(__PPC__)\n#ifndef __NR_setfsuid\n#define __NR_setfsuid           138\n#define __NR_setfsgid           139\n#endif\n#ifndef __NR_setresuid\n#define __NR_setresuid          164\n#define __NR_getresuid          165\n#define __NR_setresgid          169\n#define __NR_getresgid          170\n#endif\n#ifndef __NR_rt_sigaction\n#define __NR_rt_sigreturn       172\n#define __NR_rt_sigaction       173\n#define __NR_rt_sigprocmask     174\n#define __NR_rt_sigpending      175\n#define __NR_rt_sigsuspend      178\n#endif\n#ifndef __NR_pread64\n#define __NR_pread64            179\n#endif\n#ifndef __NR_pwrite64\n#define __NR_pwrite64           180\n#endif\n#ifndef __NR_ugetrlimit\n#define __NR_ugetrlimit         190\n#endif\n#ifndef __NR_readahead\n#define __NR_readahead          191\n#endif\n#ifndef __NR_stat64\n#define __NR_stat64             195\n#endif\n#ifndef __NR_fstat64\n#define __NR_fstat64            197\n#endif\n#ifndef __NR_getdents64\n#define __NR_getdents64         202\n#endif\n#ifndef __NR_gettid\n#define __NR_gettid             207\n#endif\n#ifndef __NR_tkill\n#define __NR_tkill              208\n#endif\n#ifndef __NR_setxattr\n#define __NR_setxattr           209\n#endif\n#ifndef __NR_lsetxattr\n#define __NR_lsetxattr          210\n#endif\n#ifndef __NR_getxattr\n#define __NR_getxattr           212\n#endif\n#ifndef __NR_lgetxattr\n#define __NR_lgetxattr          213\n#endif\n#ifndef __NR_listxattr\n#define __NR_listxattr          215\n#endif\n#ifndef __NR_llistxattr\n#define __NR_llistxattr         216\n#endif\n#ifndef __NR_futex\n#define __NR_futex              221\n#endif\n#ifndef __NR_sched_setaffinity\n#define __NR_sched_setaffinity  222\n#define __NR_sched_getaffinity  223\n#endif\n#ifndef __NR_set_tid_address\n#define __NR_set_tid_address    232\n#endif\n#ifndef __NR_clock_gettime\n#define __NR_clock_gettime      246\n#endif\n#ifndef __NR_clock_getres\n#define __NR_clock_getres       247\n#endif\n#ifndef __NR_statfs64\n#define __NR_statfs64           252\n#endif\n#ifndef __NR_fstatfs64\n#define __NR_fstatfs64          253\n#endif\n#ifndef __NR_fadvise64_64\n#define __NR_fadvise64_64       254\n#endif\n#ifndef __NR_ioprio_set\n#define __NR_ioprio_set         273\n#endif\n#ifndef __NR_ioprio_get\n#define __NR_ioprio_get         274\n#endif\n#ifndef __NR_openat\n#define __NR_openat             286\n#endif\n#ifndef __NR_fstatat64\n#define __NR_fstatat64          291\n#endif\n#ifndef __NR_unlinkat\n#define __NR_unlinkat           292\n#endif\n#ifndef __NR_move_pages\n#define __NR_move_pages         301\n#endif\n#ifndef __NR_getcpu\n#define __NR_getcpu             302\n#endif\n/* End of powerpc defininitions                                              */\n#endif\n\n\n/* After forking, we must make sure to only call system calls.               */\n#if defined __BOUNDED_POINTERS__\n  #error \"Need to port invocations of syscalls for bounded ptrs\"\n#else\n  /* The core dumper and the thread lister get executed after threads\n   * have been suspended. As a consequence, we cannot call any functions\n   * that acquire locks. Unfortunately, libc wraps most system calls\n   * (e.g. in order to implement pthread_atfork, and to make calls\n   * cancellable), which means we cannot call these functions. Instead,\n   * we have to call syscall() directly.\n   */\n  #undef LSS_ERRNO\n  #ifdef SYS_ERRNO\n    /* Allow the including file to override the location of errno. This can\n     * be useful when using clone() with the CLONE_VM option.\n     */\n    #define LSS_ERRNO SYS_ERRNO\n  #else\n    #define LSS_ERRNO errno\n  #endif\n\n  #undef LSS_INLINE\n  #ifdef SYS_INLINE\n    #define LSS_INLINE SYS_INLINE\n  #else\n    #define LSS_INLINE static inline\n  #endif\n\n  /* Allow the including file to override the prefix used for all new\n   * system calls. By default, it will be set to \"sys_\".\n   */\n  #undef LSS_NAME\n  #ifndef SYS_PREFIX\n    #define LSS_NAME(name) sys_##name\n  #elif defined SYS_PREFIX && SYS_PREFIX < 0\n    #define LSS_NAME(name) name\n  #elif defined SYS_PREFIX && SYS_PREFIX == 0\n    #define LSS_NAME(name) sys0_##name\n  #elif defined SYS_PREFIX && SYS_PREFIX == 1\n    #define LSS_NAME(name) sys1_##name\n  #elif defined SYS_PREFIX && SYS_PREFIX == 2\n    #define LSS_NAME(name) sys2_##name\n  #elif defined SYS_PREFIX && SYS_PREFIX == 3\n    #define LSS_NAME(name) sys3_##name\n  #elif defined SYS_PREFIX && SYS_PREFIX == 4\n    #define LSS_NAME(name) sys4_##name\n  #elif defined SYS_PREFIX && SYS_PREFIX == 5\n    #define LSS_NAME(name) sys5_##name\n  #elif defined SYS_PREFIX && SYS_PREFIX == 6\n    #define LSS_NAME(name) sys6_##name\n  #elif defined SYS_PREFIX && SYS_PREFIX == 7\n    #define LSS_NAME(name) sys7_##name\n  #elif defined SYS_PREFIX && SYS_PREFIX == 8\n    #define LSS_NAME(name) sys8_##name\n  #elif defined SYS_PREFIX && SYS_PREFIX == 9\n    #define LSS_NAME(name) sys9_##name\n  #endif\n\n  #undef  LSS_RETURN\n  #if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) \\\n       || defined(__ARM_EABI__))\n  /* Failing system calls return a negative result in the range of\n   * -1..-4095. These are \"errno\" values with the sign inverted.\n   */\n  #define LSS_RETURN(type, res)                                               \\\n    do {                                                                      \\\n      if ((unsigned long)(res) >= (unsigned long)(-4095)) {                   \\\n        LSS_ERRNO = -(res);                                                   \\\n        res = -1;                                                             \\\n      }                                                                       \\\n      return (type) (res);                                                    \\\n    } while (0)\n  #elif defined(__mips__)\n  /* On MIPS, failing system calls return -1, and set errno in a\n   * separate CPU register.\n   */\n  #define LSS_RETURN(type, res, err)                                          \\\n    do {                                                                      \\\n      if (err) {                                                              \\\n        LSS_ERRNO = (res);                                                    \\\n        res = -1;                                                             \\\n      }                                                                       \\\n      return (type) (res);                                                    \\\n    } while (0)\n  #elif defined(__PPC__)\n  /* On PPC, failing system calls return -1, and set errno in a\n   * separate CPU register. See linux/unistd.h.\n   */\n  #define LSS_RETURN(type, res, err)                                          \\\n   do {                                                                       \\\n     if (err & 0x10000000 ) {                                                 \\\n       LSS_ERRNO = (res);                                                     \\\n       res = -1;                                                              \\\n     }                                                                        \\\n     return (type) (res);                                                     \\\n   } while (0)\n  #endif\n  #if defined(__i386__)\n    /* In PIC mode (e.g. when building shared libraries), gcc for i386\n     * reserves ebx. Unfortunately, most distribution ship with implementations\n     * of _syscallX() which clobber ebx.\n     * Also, most definitions of _syscallX() neglect to mark \"memory\" as being\n     * clobbered. This causes problems with compilers, that do a better job\n     * at optimizing across __asm__ calls.\n     * So, we just have to redefine all of the _syscallX() macros.\n     */\n    #undef LSS_ENTRYPOINT\n    #ifdef SYS_SYSCALL_ENTRYPOINT\n    static inline void (**LSS_NAME(get_syscall_entrypoint)(void))(void) {\n      void (**entrypoint)(void);\n      asm volatile(\".bss\\n\"\n                   \".align 8\\n\"\n                   \".globl \"SYS_SYSCALL_ENTRYPOINT\"\\n\"\n                   \".common \"SYS_SYSCALL_ENTRYPOINT\",8,8\\n\"\n                   \".previous\\n\"\n                   /* This logically does 'lea \"SYS_SYSCALL_ENTRYPOINT\", %0' */\n                   \"call 0f\\n\"\n                 \"0:pop  %0\\n\"\n                   \"add  $_GLOBAL_OFFSET_TABLE_+[.-0b], %0\\n\"\n                   \"mov  \"SYS_SYSCALL_ENTRYPOINT\"@GOT(%0), %0\\n\"\n                   : \"=r\"(entrypoint));\n      return entrypoint;\n    }\n\n    #define LSS_ENTRYPOINT \".bss\\n\"                                           \\\n                           \".align 8\\n\"                                       \\\n                           \".globl \"SYS_SYSCALL_ENTRYPOINT\"\\n\"                \\\n                           \".common \"SYS_SYSCALL_ENTRYPOINT\",8,8\\n\"           \\\n                           \".previous\\n\"                                      \\\n                           /* Check the SYS_SYSCALL_ENTRYPOINT vector      */ \\\n                           \"push %%eax\\n\"                                     \\\n                           \"call 10000f\\n\"                                    \\\n                     \"10000:pop  %%eax\\n\"                                     \\\n                           \"add  $_GLOBAL_OFFSET_TABLE_+[.-10000b], %%eax\\n\"  \\\n                           \"mov  \"SYS_SYSCALL_ENTRYPOINT\"@GOT(%%eax), %%eax\\n\"\\\n                           \"mov  0(%%eax), %%eax\\n\"                           \\\n                           \"test %%eax, %%eax\\n\"                              \\\n                           \"jz   10001f\\n\"                                    \\\n                           \"push %%eax\\n\"                                     \\\n                           \"lea  10002f, %%eax\\n\"                             \\\n                           \"xchg 4(%%esp), %%eax\\n\"                           \\\n                           \"ret\\n\"                                            \\\n                     \"10001:pop  %%eax\\n\"                                     \\\n                           \"int $0x80\\n\"                                      \\\n                     \"10002:\\n\"\n    #else\n    #define LSS_ENTRYPOINT \"int $0x80\\n\"\n    #endif\n    #undef  LSS_BODY\n    #define LSS_BODY(type,args...)                                            \\\n      long __res;                                                             \\\n      __asm__ __volatile__(\"push %%ebx\\n\"                                     \\\n                           \"movl %2,%%ebx\\n\"                                  \\\n                           LSS_ENTRYPOINT                                     \\\n                           \"pop %%ebx\"                                        \\\n                           args                                               \\\n                           : \"esp\", \"memory\");                                \\\n      LSS_RETURN(type,__res)\n    #undef  _syscall0\n    #define _syscall0(type,name)                                              \\\n      type LSS_NAME(name)(void) {                                             \\\n        long __res;                                                           \\\n        __asm__ volatile(LSS_ENTRYPOINT                                       \\\n                         : \"=a\" (__res)                                       \\\n                         : \"0\" (__NR_##name)                                  \\\n                         : \"esp\", \"memory\");                                  \\\n        LSS_RETURN(type,__res);                                               \\\n      }\n    #undef  _syscall1\n    #define _syscall1(type,name,type1,arg1)                                   \\\n      type LSS_NAME(name)(type1 arg1) {                                       \\\n        LSS_BODY(type,                                                        \\\n             : \"=a\" (__res)                                                   \\\n             : \"0\" (__NR_##name), \"ri\" ((long)(arg1)));                       \\\n      }\n    #undef  _syscall2\n    #define _syscall2(type,name,type1,arg1,type2,arg2)                        \\\n      type LSS_NAME(name)(type1 arg1,type2 arg2) {                            \\\n        LSS_BODY(type,                                                        \\\n             : \"=a\" (__res)                                                   \\\n             : \"0\" (__NR_##name),\"ri\" ((long)(arg1)), \"c\" ((long)(arg2)));    \\\n      }\n    #undef  _syscall3\n    #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)             \\\n      type LSS_NAME(name)(type1 arg1,type2 arg2,type3 arg3) {                 \\\n        LSS_BODY(type,                                                        \\\n             : \"=a\" (__res)                                                   \\\n             : \"0\" (__NR_##name), \"ri\" ((long)(arg1)), \"c\" ((long)(arg2)),    \\\n               \"d\" ((long)(arg3)));                                           \\\n      }\n    #undef  _syscall4\n    #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)  \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {   \\\n        LSS_BODY(type,                                                        \\\n             : \"=a\" (__res)                                                   \\\n             : \"0\" (__NR_##name), \"ri\" ((long)(arg1)), \"c\" ((long)(arg2)),    \\\n               \"d\" ((long)(arg3)),\"S\" ((long)(arg4)));                        \\\n      }\n    #undef  _syscall5\n    #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \\\n                      type5,arg5)                                             \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \\\n                          type5 arg5) {                                       \\\n        long __res;                                                           \\\n        __asm__ __volatile__(\"push %%ebx\\n\"                                   \\\n                             \"movl %2,%%ebx\\n\"                                \\\n                             \"movl %1,%%eax\\n\"                                \\\n                             LSS_ENTRYPOINT                                   \\\n                             \"pop  %%ebx\"                                     \\\n                             : \"=a\" (__res)                                   \\\n                             : \"i\" (__NR_##name), \"ri\" ((long)(arg1)),        \\\n                               \"c\" ((long)(arg2)), \"d\" ((long)(arg3)),        \\\n                               \"S\" ((long)(arg4)), \"D\" ((long)(arg5))         \\\n                             : \"esp\", \"memory\");                              \\\n        LSS_RETURN(type,__res);                                               \\\n      }\n    #undef  _syscall6\n    #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \\\n                      type5,arg5,type6,arg6)                                  \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \\\n                          type5 arg5, type6 arg6) {                           \\\n        long __res;                                                           \\\n        struct { long __a1; long __a6; } __s = { (long)arg1, (long) arg6 };   \\\n        __asm__ __volatile__(\"push %%ebp\\n\"                                   \\\n                             \"push %%ebx\\n\"                                   \\\n                             \"movl 4(%2),%%ebp\\n\"                             \\\n                             \"movl 0(%2), %%ebx\\n\"                            \\\n                             \"movl %1,%%eax\\n\"                                \\\n                             LSS_ENTRYPOINT                                   \\\n                             \"pop  %%ebx\\n\"                                   \\\n                             \"pop  %%ebp\"                                     \\\n                             : \"=a\" (__res)                                   \\\n                             : \"i\" (__NR_##name),  \"0\" ((long)(&__s)),        \\\n                               \"c\" ((long)(arg2)), \"d\" ((long)(arg3)),        \\\n                               \"S\" ((long)(arg4)), \"D\" ((long)(arg5))         \\\n                             : \"esp\", \"memory\");                              \\\n        LSS_RETURN(type,__res);                                               \\\n      }\n    LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,\n                                   int flags, void *arg, int *parent_tidptr,\n                                   void *newtls, int *child_tidptr) {\n      long __res;\n      __asm__ __volatile__(/* if (fn == NULL)\n                            *   return -EINVAL;\n                            */\n                           \"movl   %3,%%ecx\\n\"\n                           \"jecxz  1f\\n\"\n\n                           /* if (child_stack == NULL)\n                            *   return -EINVAL;\n                            */\n                           \"movl   %4,%%ecx\\n\"\n                           \"jecxz  1f\\n\"\n\n                           /* Set up alignment of the child stack:\n                            * child_stack = (child_stack & ~0xF) - 20;\n                            */\n                           \"andl   $-16,%%ecx\\n\"\n                           \"subl   $20,%%ecx\\n\"\n\n                           /* Push \"arg\" and \"fn\" onto the stack that will be\n                            * used by the child.\n                            */\n                           \"movl   %6,%%eax\\n\"\n                           \"movl   %%eax,4(%%ecx)\\n\"\n                           \"movl   %3,%%eax\\n\"\n                           \"movl   %%eax,(%%ecx)\\n\"\n\n                           /* %eax = syscall(%eax = __NR_clone,\n                            *                %ebx = flags,\n                            *                %ecx = child_stack,\n                            *                %edx = parent_tidptr,\n                            *                %esi = newtls,\n                            *                %edi = child_tidptr)\n                            * Also, make sure that %ebx gets preserved as it is\n                            * used in PIC mode.\n                            */\n                           \"movl   %8,%%esi\\n\"\n                           \"movl   %7,%%edx\\n\"\n                           \"movl   %5,%%eax\\n\"\n                           \"movl   %9,%%edi\\n\"\n                           \"pushl  %%ebx\\n\"\n                           \"movl   %%eax,%%ebx\\n\"\n                           \"movl   %2,%%eax\\n\"\n                           LSS_ENTRYPOINT\n\n                           /* In the parent: restore %ebx\n                            * In the child:  move \"fn\" into %ebx\n                            */\n                           \"popl   %%ebx\\n\"\n\n                           /* if (%eax != 0)\n                            *   return %eax;\n                            */\n                           \"test   %%eax,%%eax\\n\"\n                           \"jnz    1f\\n\"\n\n                           /* In the child, now. Terminate frame pointer chain.\n                            */\n                           \"movl   $0,%%ebp\\n\"\n\n                           /* Call \"fn\". \"arg\" is already on the stack.\n                            */\n                           \"call   *%%ebx\\n\"\n\n                           /* Call _exit(%ebx). Unfortunately older versions\n                            * of gcc restrict the number of arguments that can\n                            * be passed to asm(). So, we need to hard-code the\n                            * system call number.\n                            */\n                           \"movl   %%eax,%%ebx\\n\"\n                           \"movl   $1,%%eax\\n\"\n                           LSS_ENTRYPOINT\n\n                           /* Return to parent.\n                            */\n                         \"1:\\n\"\n                           : \"=a\" (__res)\n                           : \"0\"(-EINVAL), \"i\"(__NR_clone),\n                             \"m\"(fn), \"m\"(child_stack), \"m\"(flags), \"m\"(arg),\n                             \"m\"(parent_tidptr), \"m\"(newtls), \"m\"(child_tidptr)\n                           : \"esp\", \"memory\", \"ecx\", \"edx\", \"esi\", \"edi\");\n      LSS_RETURN(int, __res);\n    }\n\n    #define __NR__fadvise64_64 __NR_fadvise64_64\n    LSS_INLINE _syscall6(int, _fadvise64_64, int, fd,\n                         unsigned, offset_lo, unsigned, offset_hi,\n                         unsigned, len_lo, unsigned, len_hi,\n                         int, advice)\n\n    LSS_INLINE int LSS_NAME(fadvise64)(int fd, loff_t offset,\n                                       loff_t len, int advice) {\n      return LSS_NAME(_fadvise64_64)(fd,\n                                     (unsigned)offset, (unsigned)(offset >>32),\n                                     (unsigned)len, (unsigned)(len >> 32),\n                                     advice);\n    }\n\n    #define __NR__fallocate __NR_fallocate\n    LSS_INLINE _syscall6(int, _fallocate, int, fd,\n                         int, mode,\n                         unsigned, offset_lo, unsigned, offset_hi,\n                         unsigned, len_lo, unsigned, len_hi)\n\n    LSS_INLINE int LSS_NAME(fallocate)(int fd, int mode,\n                                       loff_t offset, loff_t len) {\n      union { loff_t off; unsigned w[2]; } o = { offset }, l = { len };\n      return LSS_NAME(_fallocate)(fd, mode, o.w[0], o.w[1], l.w[0], l.w[1]);\n    }\n\n    LSS_INLINE _syscall1(int, set_thread_area, void *, u)\n    LSS_INLINE _syscall1(int, get_thread_area, void *, u)\n\n    LSS_INLINE void (*LSS_NAME(restore_rt)(void))(void) {\n      /* On i386, the kernel does not know how to return from a signal\n       * handler. Instead, it relies on user space to provide a\n       * restorer function that calls the {rt_,}sigreturn() system call.\n       * Unfortunately, we cannot just reference the glibc version of this\n       * function, as glibc goes out of its way to make it inaccessible.\n       */\n      void (*res)(void);\n      __asm__ __volatile__(\"call   2f\\n\"\n                         \"0:.align 16\\n\"\n                         \"1:movl   %1,%%eax\\n\"\n                           LSS_ENTRYPOINT\n                         \"2:popl   %0\\n\"\n                           \"addl   $(1b-0b),%0\\n\"\n                           : \"=a\" (res)\n                           : \"i\"  (__NR_rt_sigreturn));\n      return res;\n    }\n    LSS_INLINE void (*LSS_NAME(restore)(void))(void) {\n      /* On i386, the kernel does not know how to return from a signal\n       * handler. Instead, it relies on user space to provide a\n       * restorer function that calls the {rt_,}sigreturn() system call.\n       * Unfortunately, we cannot just reference the glibc version of this\n       * function, as glibc goes out of its way to make it inaccessible.\n       */\n      void (*res)(void);\n      __asm__ __volatile__(\"call   2f\\n\"\n                         \"0:.align 16\\n\"\n                         \"1:pop    %%eax\\n\"\n                           \"movl   %1,%%eax\\n\"\n                           LSS_ENTRYPOINT\n                         \"2:popl   %0\\n\"\n                           \"addl   $(1b-0b),%0\\n\"\n                           : \"=a\" (res)\n                           : \"i\"  (__NR_sigreturn));\n      return res;\n    }\n  #elif defined(__x86_64__)\n    /* There are no known problems with any of the _syscallX() macros\n     * currently shipping for x86_64, but we still need to be able to define\n     * our own version so that we can override the location of the errno\n     * location (e.g. when using the clone() system call with the CLONE_VM\n     * option).\n     */\n    #undef LSS_ENTRYPOINT\n    #ifdef SYS_SYSCALL_ENTRYPOINT\n    static inline void (**LSS_NAME(get_syscall_entrypoint)(void))(void) {\n      void (**entrypoint)(void);\n      asm volatile(\".bss\\n\"\n                   \".align 8\\n\"\n                   \".globl \"SYS_SYSCALL_ENTRYPOINT\"\\n\"\n                   \".common \"SYS_SYSCALL_ENTRYPOINT\",8,8\\n\"\n                   \".previous\\n\"\n                   \"mov \"SYS_SYSCALL_ENTRYPOINT\"@GOTPCREL(%%rip), %0\\n\"\n                   : \"=r\"(entrypoint));\n      return entrypoint;\n    }\n\n    #define LSS_ENTRYPOINT                                                    \\\n              \".bss\\n\"                                                        \\\n              \".align 8\\n\"                                                    \\\n              \".globl \"SYS_SYSCALL_ENTRYPOINT\"\\n\"                             \\\n              \".common \"SYS_SYSCALL_ENTRYPOINT\",8,8\\n\"                        \\\n              \".previous\\n\"                                                   \\\n              \"mov \"SYS_SYSCALL_ENTRYPOINT\"@GOTPCREL(%%rip), %%rcx\\n\"         \\\n              \"mov  0(%%rcx), %%rcx\\n\"                                        \\\n              \"test %%rcx, %%rcx\\n\"                                           \\\n              \"jz   10001f\\n\"                                                 \\\n              \"call *%%rcx\\n\"                                                 \\\n              \"jmp  10002f\\n\"                                                 \\\n        \"10001:syscall\\n\"                                                     \\\n        \"10002:\\n\"\n\n    #else\n    #define LSS_ENTRYPOINT \"syscall\\n\"\n    #endif\n    #undef  LSS_BODY\n    #define LSS_BODY(type,name, ...)                                          \\\n          long __res;                                                         \\\n          __asm__ __volatile__(LSS_ENTRYPOINT                                 \\\n            : \"=a\" (__res) : \"0\" (__NR_##name),                               \\\n            ##__VA_ARGS__ : \"r11\", \"rcx\", \"memory\");                          \\\n          LSS_RETURN(type, __res)\n    #undef _syscall0\n    #define _syscall0(type,name)                                              \\\n      type LSS_NAME(name)() {                                                 \\\n        LSS_BODY(type, name);                                                 \\\n      }\n    #undef _syscall1\n    #define _syscall1(type,name,type1,arg1)                                   \\\n      type LSS_NAME(name)(type1 arg1) {                                       \\\n        LSS_BODY(type, name, \"D\" ((long)(arg1)));                             \\\n      }\n    #undef _syscall2\n    #define _syscall2(type,name,type1,arg1,type2,arg2)                        \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2) {                           \\\n        LSS_BODY(type, name, \"D\" ((long)(arg1)), \"S\" ((long)(arg2)));         \\\n      }\n    #undef _syscall3\n    #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)             \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) {               \\\n        LSS_BODY(type, name, \"D\" ((long)(arg1)), \"S\" ((long)(arg2)),          \\\n                             \"d\" ((long)(arg3)));                             \\\n      }\n    #undef _syscall4\n    #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)  \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {   \\\n          long __res;                                                         \\\n          __asm__ __volatile__(\"movq %5,%%r10;\" LSS_ENTRYPOINT :              \\\n            \"=a\" (__res) : \"0\" (__NR_##name),                                 \\\n            \"D\" ((long)(arg1)), \"S\" ((long)(arg2)), \"d\" ((long)(arg3)),       \\\n            \"r\" ((long)(arg4)) : \"r10\", \"r11\", \"rcx\", \"memory\");              \\\n          LSS_RETURN(type, __res);                                            \\\n      }\n    #undef _syscall5\n    #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \\\n                      type5,arg5)                                             \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \\\n                          type5 arg5) {                                       \\\n          long __res;                                                         \\\n          __asm__ __volatile__(\"movq %5,%%r10; movq %6,%%r8;\" LSS_ENTRYPOINT :\\\n            \"=a\" (__res) : \"0\" (__NR_##name),                                 \\\n            \"D\" ((long)(arg1)), \"S\" ((long)(arg2)), \"d\" ((long)(arg3)),       \\\n            \"r\" ((long)(arg4)), \"r\" ((long)(arg5)) :                          \\\n            \"r8\", \"r10\", \"r11\", \"rcx\", \"memory\");                             \\\n          LSS_RETURN(type, __res);                                            \\\n      }\n    #undef _syscall6\n    #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \\\n                      type5,arg5,type6,arg6)                                  \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \\\n                          type5 arg5, type6 arg6) {                           \\\n          long __res;                                                         \\\n          __asm__ __volatile__(\"movq %5,%%r10; movq %6,%%r8; movq %7,%%r9;\"   \\\n                               LSS_ENTRYPOINT :                               \\\n            \"=a\" (__res) : \"0\" (__NR_##name),                                 \\\n            \"D\" ((long)(arg1)), \"S\" ((long)(arg2)), \"d\" ((long)(arg3)),       \\\n            \"r\" ((long)(arg4)), \"r\" ((long)(arg5)), \"r\" ((long)(arg6)) :      \\\n            \"r8\", \"r9\", \"r10\", \"r11\", \"rcx\", \"memory\");                       \\\n          LSS_RETURN(type, __res);                                            \\\n      }\n    LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,\n                                   int flags, void *arg, int *parent_tidptr,\n                                   void *newtls, int *child_tidptr) {\n      long __res;\n      {\n        __asm__ __volatile__(/* if (fn == NULL)\n                              *   return -EINVAL;\n                              */\n                             \"testq  %4,%4\\n\"\n                             \"jz     1f\\n\"\n\n                             /* if (child_stack == NULL)\n                              *   return -EINVAL;\n                              */\n                             \"testq  %5,%5\\n\"\n                             \"jz     1f\\n\"\n\n                             /* childstack -= 2*sizeof(void *);\n                              */\n                             \"subq   $16,%5\\n\"\n\n                             /* Push \"arg\" and \"fn\" onto the stack that will be\n                              * used by the child.\n                              */\n                             \"movq   %7,8(%5)\\n\"\n                             \"movq   %4,0(%5)\\n\"\n\n                             /* %rax = syscall(%rax = __NR_clone,\n                              *                %rdi = flags,\n                              *                %rsi = child_stack,\n                              *                %rdx = parent_tidptr,\n                              *                %r8  = new_tls,\n                              *                %r10 = child_tidptr)\n                              */\n                             \"movq   %2,%%rax\\n\"\n                             \"movq   %9,%%r8\\n\"\n                             \"movq   %10,%%r10\\n\"\n                             LSS_ENTRYPOINT\n\n                             /* if (%rax != 0)\n                              *   return;\n                              */\n                             \"testq  %%rax,%%rax\\n\"\n                             \"jnz    1f\\n\"\n\n                             /* In the child. Terminate frame pointer chain.\n                              */\n                             \"xorq   %%rbp,%%rbp\\n\"\n\n                             /* Call \"fn(arg)\".\n                              */\n                             \"popq   %%rax\\n\"\n                             \"popq   %%rdi\\n\"\n                             \"call   *%%rax\\n\"\n\n                             /* Call _exit(%ebx).\n                              */\n                             \"movq   %%rax,%%rdi\\n\"\n                             \"movq   %3,%%rax\\n\"\n                             LSS_ENTRYPOINT\n\n                             /* Return to parent.\n                              */\n                           \"1:\\n\"\n                             : \"=a\" (__res)\n                             : \"0\"(-EINVAL), \"i\"(__NR_clone), \"i\"(__NR_exit),\n                               \"r\"(fn), \"S\"(child_stack), \"D\"(flags), \"r\"(arg),\n                               \"d\"(parent_tidptr), \"r\"(newtls),\n                               \"r\"(child_tidptr)\n                             : \"rsp\", \"memory\", \"r8\", \"r10\", \"r11\", \"rcx\");\n      }\n      LSS_RETURN(int, __res);\n    }\n    LSS_INLINE _syscall2(int, arch_prctl, int, c, void *, a)\n    LSS_INLINE _syscall4(int, fadvise64, int, fd, loff_t, offset, loff_t, len,\n                         int,  advice)\n\n    LSS_INLINE void (*LSS_NAME(restore_rt)(void))(void) {\n      /* On x86-64, the kernel does not know how to return from\n       * a signal handler. Instead, it relies on user space to provide a\n       * restorer function that calls the rt_sigreturn() system call.\n       * Unfortunately, we cannot just reference the glibc version of this\n       * function, as glibc goes out of its way to make it inaccessible.\n       */\n      void (*res)(void);\n      __asm__ __volatile__(\"call   2f\\n\"\n                         \"0:.align 16\\n\"\n                         \"1:movq   %1,%%rax\\n\"\n                           LSS_ENTRYPOINT\n                         \"2:popq   %0\\n\"\n                           \"addq   $(1b-0b),%0\\n\"\n                           : \"=a\" (res)\n                           : \"i\"  (__NR_rt_sigreturn));\n      return res;\n    }\n  #elif defined(__ARM_ARCH_3__)\n    /* Most definitions of _syscallX() neglect to mark \"memory\" as being\n     * clobbered. This causes problems with compilers, that do a better job\n     * at optimizing across __asm__ calls.\n     * So, we just have to redefine all of the _syscallX() macros.\n     */\n    #undef LSS_REG\n    #define LSS_REG(r,a) register long __r##r __asm__(\"r\"#r) = (long)a\n    #undef  LSS_BODY\n    #define LSS_BODY(type,name,args...)                                       \\\n          register long __res_r0 __asm__(\"r0\");                               \\\n          long __res;                                                         \\\n          __asm__ __volatile__ (__syscall(name)                               \\\n                                : \"=r\"(__res_r0) : args : \"lr\", \"memory\");    \\\n          __res = __res_r0;                                                   \\\n          LSS_RETURN(type, __res)\n    #undef _syscall0\n    #define _syscall0(type, name)                                             \\\n      type LSS_NAME(name)() {                                                 \\\n        LSS_BODY(type, name);                                                 \\\n      }\n    #undef _syscall1\n    #define _syscall1(type, name, type1, arg1)                                \\\n      type LSS_NAME(name)(type1 arg1) {                                       \\\n        LSS_REG(0, arg1); LSS_BODY(type, name, \"r\"(__r0));                    \\\n      }\n    #undef _syscall2\n    #define _syscall2(type, name, type1, arg1, type2, arg2)                   \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2) {                           \\\n        LSS_REG(0, arg1); LSS_REG(1, arg2);                                   \\\n        LSS_BODY(type, name, \"r\"(__r0), \"r\"(__r1));                           \\\n      }\n    #undef _syscall3\n    #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3)      \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) {               \\\n        LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3);                 \\\n        LSS_BODY(type, name, \"r\"(__r0), \"r\"(__r1), \"r\"(__r2));                \\\n      }\n    #undef _syscall4\n    #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)  \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {   \\\n        LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3);                 \\\n        LSS_REG(3, arg4);                                                     \\\n        LSS_BODY(type, name, \"r\"(__r0), \"r\"(__r1), \"r\"(__r2), \"r\"(__r3));     \\\n      }\n    #undef _syscall5\n    #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \\\n                      type5,arg5)                                             \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \\\n                          type5 arg5) {                                       \\\n        LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3);                 \\\n        LSS_REG(3, arg4); LSS_REG(4, arg5);                                   \\\n        LSS_BODY(type, name, \"r\"(__r0), \"r\"(__r1), \"r\"(__r2), \"r\"(__r3),      \\\n                             \"r\"(__r4));                                      \\\n      }\n    #undef _syscall6\n    #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \\\n                      type5,arg5,type6,arg6)                                  \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \\\n                          type5 arg5, type6 arg6) {                           \\\n        LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3);                 \\\n        LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6);                 \\\n        LSS_BODY(type, name, \"r\"(__r0), \"r\"(__r1), \"r\"(__r2), \"r\"(__r3),      \\\n                             \"r\"(__r4), \"r\"(__r5));                           \\\n      }\n    LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,\n                                   int flags, void *arg, int *parent_tidptr,\n                                   void *newtls, int *child_tidptr) {\n      long __res;\n      {\n        register int   __flags __asm__(\"r0\") = flags;\n        register void *__stack __asm__(\"r1\") = child_stack;\n        register void *__ptid  __asm__(\"r2\") = parent_tidptr;\n        register void *__tls   __asm__(\"r3\") = newtls;\n        register int  *__ctid  __asm__(\"r4\") = child_tidptr;\n        __asm__ __volatile__(/* if (fn == NULL || child_stack == NULL)\n                              *   return -EINVAL;\n                              */\n                             \"cmp   %2,#0\\n\"\n                             \"cmpne %3,#0\\n\"\n                             \"moveq %0,%1\\n\"\n                             \"beq   1f\\n\"\n\n                             /* Push \"arg\" and \"fn\" onto the stack that will be\n                              * used by the child.\n                              */\n                             \"str   %5,[%3,#-4]!\\n\"\n                             \"str   %2,[%3,#-4]!\\n\"\n\n                             /* %r0 = syscall(%r0 = flags,\n                              *               %r1 = child_stack,\n                              *               %r2 = parent_tidptr,\n                              *               %r3 = newtls,\n                              *               %r4 = child_tidptr)\n                              */\n                             __syscall(clone)\"\\n\"\n\n                             /* if (%r0 != 0)\n                              *   return %r0;\n                              */\n                             \"movs  %0,r0\\n\"\n                             \"bne   1f\\n\"\n\n                             /* In the child, now. Call \"fn(arg)\".\n                              */\n                             \"ldr   r0,[sp, #4]\\n\"\n                             \"mov   lr,pc\\n\"\n                             \"ldr   pc,[sp]\\n\"\n\n                             /* Call _exit(%r0).\n                              */\n                             __syscall(exit)\"\\n\"\n                           \"1:\\n\"\n                             : \"=r\" (__res)\n                             : \"i\"(-EINVAL),\n                               \"r\"(fn), \"r\"(__stack), \"r\"(__flags), \"r\"(arg),\n                               \"r\"(__ptid), \"r\"(__tls), \"r\"(__ctid)\n                             : \"cc\", \"lr\", \"memory\");\n      }\n      LSS_RETURN(int, __res);\n    }\n  #elif defined(__ARM_EABI__)\n    /* Most definitions of _syscallX() neglect to mark \"memory\" as being\n     * clobbered. This causes problems with compilers, that do a better job\n     * at optimizing across __asm__ calls.\n     * So, we just have to redefine all fo the _syscallX() macros.\n     */\n    #undef LSS_REG\n    #define LSS_REG(r,a) register long __r##r __asm__(\"r\"#r) = (long)a\n    #undef  LSS_BODY\n    #define LSS_BODY(type,name,args...)                                       \\\n          register long __res_r0 __asm__(\"r0\");                               \\\n          long __res;                                                         \\\n          __asm__ __volatile__ (\"push {r7}\\n\"                                 \\\n                                \"mov r7, %1\\n\"                                \\\n                                \"swi 0x0\\n\"                                   \\\n                                \"pop {r7}\\n\"                                  \\\n                                : \"=r\"(__res_r0)                              \\\n                                : \"i\"(__NR_##name) , ## args                  \\\n                                : \"lr\", \"memory\");                            \\\n          __res = __res_r0;                                                   \\\n          LSS_RETURN(type, __res)\n    #undef _syscall0\n    #define _syscall0(type, name)                                             \\\n      type LSS_NAME(name)() {                                                 \\\n        LSS_BODY(type, name);                                                 \\\n      }\n    #undef _syscall1\n    #define _syscall1(type, name, type1, arg1)                                \\\n      type LSS_NAME(name)(type1 arg1) {                                       \\\n        LSS_REG(0, arg1); LSS_BODY(type, name, \"r\"(__r0));                    \\\n      }\n    #undef _syscall2\n    #define _syscall2(type, name, type1, arg1, type2, arg2)                   \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2) {                           \\\n        LSS_REG(0, arg1); LSS_REG(1, arg2);                                   \\\n        LSS_BODY(type, name, \"r\"(__r0), \"r\"(__r1));                           \\\n      }\n    #undef _syscall3\n    #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3)      \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) {               \\\n        LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3);                 \\\n        LSS_BODY(type, name, \"r\"(__r0), \"r\"(__r1), \"r\"(__r2));                \\\n      }\n    #undef _syscall4\n    #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)  \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {   \\\n        LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3);                 \\\n        LSS_REG(3, arg4);                                                     \\\n        LSS_BODY(type, name, \"r\"(__r0), \"r\"(__r1), \"r\"(__r2), \"r\"(__r3));     \\\n      }\n    #undef _syscall5\n    #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \\\n                      type5,arg5)                                             \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \\\n                          type5 arg5) {                                       \\\n        LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3);                 \\\n        LSS_REG(3, arg4); LSS_REG(4, arg5);                                   \\\n        LSS_BODY(type, name, \"r\"(__r0), \"r\"(__r1), \"r\"(__r2), \"r\"(__r3),      \\\n                             \"r\"(__r4));                                      \\\n      }\n    #undef _syscall6\n    #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \\\n                      type5,arg5,type6,arg6)                                  \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \\\n                          type5 arg5, type6 arg6) {                           \\\n        LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3);                 \\\n        LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6);                 \\\n        LSS_BODY(type, name, \"r\"(__r0), \"r\"(__r1), \"r\"(__r2), \"r\"(__r3),      \\\n                             \"r\"(__r4), \"r\"(__r5));                           \\\n      }\n    LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,\n                                   int flags, void *arg, int *parent_tidptr,\n                                   void *newtls, int *child_tidptr) {\n      long __res;\n      {\n        register int   __flags __asm__(\"r0\") = flags;\n        register void *__stack __asm__(\"r1\") = child_stack;\n        register void *__ptid  __asm__(\"r2\") = parent_tidptr;\n        register void *__tls   __asm__(\"r3\") = newtls;\n        register int  *__ctid  __asm__(\"r4\") = child_tidptr;\n        __asm__ __volatile__(/* if (fn == NULL || child_stack == NULL)\n                              *   return -EINVAL;\n                              */\n                             \"cmp   %2,#0\\n\"\n                             \"it    ne\\n\"\n                             \"cmpne %3,#0\\n\"\n                             \"it    eq\\n\"\n                             \"moveq %0,%1\\n\"\n                             \"beq   1f\\n\"\n\n                             /* Push \"arg\" and \"fn\" onto the stack that will be\n                              * used by the child.\n                              */\n                             \"str   %5,[%3,#-4]!\\n\"\n                             \"str   %2,[%3,#-4]!\\n\"\n\n                             /* %r0 = syscall(%r0 = flags,\n                              *               %r1 = child_stack,\n                              *               %r2 = parent_tidptr,\n                              *               %r3 = newtls,\n                              *               %r4 = child_tidptr)\n                              */\n                             \"mov r7, %9\\n\"\n                             \"swi 0x0\\n\"\n\n                             /* if (%r0 != 0)\n                              *   return %r0;\n                              */\n                             \"movs  %0,r0\\n\"\n                             \"bne   1f\\n\"\n\n                             /* In the child, now. Call \"fn(arg)\".\n                              */\n                             \"ldr   r0,[sp, #4]\\n\"\n\n                             /* When compiling for Thumb-2 the \"MOV LR,PC\" here\n                              * won't work because it loads PC+4 into LR,\n                              * whereas the LDR is a 4-byte instruction.\n                              * This results in the child thread always\n                              * crashing with an \"Illegal Instruction\" when it\n                              * returned into the middle of the LDR instruction\n                              * The instruction sequence used instead was\n                              * recommended by\n                              * \"https://wiki.edubuntu.org/ARM/Thumb2PortingHowto#Quick_Reference\".\n                              */\n                           #ifdef __thumb2__\n                             \"ldr   r7,[sp]\\n\"\n                             \"blx   r7\\n\"\n                           #else\n                             \"mov   lr,pc\\n\"\n                             \"ldr   pc,[sp]\\n\"\n                           #endif\n\n                             /* Call _exit(%r0).\n                              */\n                             \"mov r7, %10\\n\"\n                             \"swi 0x0\\n\"\n                           \"1:\\n\"\n                             : \"=r\" (__res)\n                             : \"i\"(-EINVAL),\n                               \"r\"(fn), \"r\"(__stack), \"r\"(__flags), \"r\"(arg),\n                               \"r\"(__ptid), \"r\"(__tls), \"r\"(__ctid),\n                               \"i\"(__NR_clone), \"i\"(__NR_exit)\n                             : \"cc\", \"r7\", \"lr\", \"memory\");\n      }\n      LSS_RETURN(int, __res);\n    }\n  #elif defined(__mips__)\n    #undef LSS_REG\n    #define LSS_REG(r,a) register unsigned long __r##r __asm__(\"$\"#r) =       \\\n                                 (unsigned long)(a)\n    #undef  LSS_BODY\n    #define LSS_BODY(type,name,r7,...)                                        \\\n          register unsigned long __v0 __asm__(\"$2\") = __NR_##name;            \\\n          __asm__ __volatile__ (\"syscall\\n\"                                   \\\n                                : \"=&r\"(__v0), r7 (__r7)                      \\\n                                : \"0\"(__v0), ##__VA_ARGS__                    \\\n                                : \"$8\", \"$9\", \"$10\", \"$11\", \"$12\",            \\\n                                  \"$13\", \"$14\", \"$15\", \"$24\", \"memory\");      \\\n          LSS_RETURN(type, __v0, __r7)\n    #undef _syscall0\n    #define _syscall0(type, name)                                             \\\n      type LSS_NAME(name)() {                                                 \\\n        register unsigned long __r7 __asm__(\"$7\");                            \\\n        LSS_BODY(type, name, \"=r\");                                           \\\n      }\n    #undef _syscall1\n    #define _syscall1(type, name, type1, arg1)                                \\\n      type LSS_NAME(name)(type1 arg1) {                                       \\\n        register unsigned long __r7 __asm__(\"$7\");                            \\\n        LSS_REG(4, arg1); LSS_BODY(type, name, \"=r\", \"r\"(__r4));              \\\n      }\n    #undef _syscall2\n    #define _syscall2(type, name, type1, arg1, type2, arg2)                   \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2) {                           \\\n        register unsigned long __r7 __asm__(\"$7\");                            \\\n        LSS_REG(4, arg1); LSS_REG(5, arg2);                                   \\\n        LSS_BODY(type, name, \"=r\", \"r\"(__r4), \"r\"(__r5));                     \\\n      }\n    #undef _syscall3\n    #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3)      \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) {               \\\n        register unsigned long __r7 __asm__(\"$7\");                            \\\n        LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \\\n        LSS_BODY(type, name, \"=r\", \"r\"(__r4), \"r\"(__r5), \"r\"(__r6));          \\\n      }\n    #undef _syscall4\n    #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)  \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {   \\\n        LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \\\n        LSS_REG(7, arg4);                                                     \\\n        LSS_BODY(type, name, \"+r\", \"r\"(__r4), \"r\"(__r5), \"r\"(__r6));          \\\n      }\n    #undef _syscall5\n    #if _MIPS_SIM == _MIPS_SIM_ABI32\n    /* The old 32bit MIPS system call API passes the fifth and sixth argument\n     * on the stack, whereas the new APIs use registers \"r8\" and \"r9\".\n     */\n    #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \\\n                      type5,arg5)                                             \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \\\n                          type5 arg5) {                                       \\\n        LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \\\n        LSS_REG(7, arg4);                                                     \\\n        register unsigned long __v0 __asm__(\"$2\");                            \\\n        __asm__ __volatile__ (\".set noreorder\\n\"                              \\\n                              \"lw    $2, %6\\n\"                                \\\n                              \"subu  $29, 32\\n\"                               \\\n                              \"sw    $2, 16($29)\\n\"                           \\\n                              \"li    $2, %2\\n\"                                \\\n                              \"syscall\\n\"                                     \\\n                              \"addiu $29, 32\\n\"                               \\\n                              \".set reorder\\n\"                                \\\n                              : \"=&r\"(__v0), \"+r\" (__r7)                      \\\n                              : \"i\" (__NR_##name), \"r\"(__r4), \"r\"(__r5),      \\\n                                \"r\"(__r6), \"m\" ((unsigned long)arg5)          \\\n                              : \"$8\", \"$9\", \"$10\", \"$11\", \"$12\",              \\\n                                \"$13\", \"$14\", \"$15\", \"$24\", \"memory\");        \\\n        LSS_RETURN(type, __v0, __r7);                                         \\\n      }\n    #else\n    #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \\\n                      type5,arg5)                                             \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \\\n                          type5 arg5) {                                       \\\n        LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \\\n        LSS_REG(7, arg4); LSS_REG(8, arg5);                                   \\\n        LSS_BODY(type, name, \"+r\", \"r\"(__r4), \"r\"(__r5), \"r\"(__r6),           \\\n                 \"r\"(__r8));                                                  \\\n      }\n    #endif\n    #undef _syscall6\n    #if _MIPS_SIM == _MIPS_SIM_ABI32\n    /* The old 32bit MIPS system call API passes the fifth and sixth argument\n     * on the stack, whereas the new APIs use registers \"r8\" and \"r9\".\n     */\n    #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \\\n                      type5,arg5,type6,arg6)                                  \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \\\n                          type5 arg5, type6 arg6) {                           \\\n        LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \\\n        LSS_REG(7, arg4);                                                     \\\n        register unsigned long __v0 __asm__(\"$2\");                            \\\n        __asm__ __volatile__ (\".set noreorder\\n\"                              \\\n                              \"lw    $2, %6\\n\"                                \\\n                              \"lw    $8, %7\\n\"                                \\\n                              \"subu  $29, 32\\n\"                               \\\n                              \"sw    $2, 16($29)\\n\"                           \\\n                              \"sw    $8, 20($29)\\n\"                           \\\n                              \"li    $2, %2\\n\"                                \\\n                              \"syscall\\n\"                                     \\\n                              \"addiu $29, 32\\n\"                               \\\n                              \".set reorder\\n\"                                \\\n                              : \"=&r\"(__v0), \"+r\" (__r7)                      \\\n                              : \"i\" (__NR_##name), \"r\"(__r4), \"r\"(__r5),      \\\n                                \"r\"(__r6), \"r\" ((unsigned long)arg5),         \\\n                                \"r\" ((unsigned long)arg6)                     \\\n                              : \"$8\", \"$9\", \"$10\", \"$11\", \"$12\",              \\\n                                \"$13\", \"$14\", \"$15\", \"$24\", \"memory\");        \\\n        LSS_RETURN(type, __v0, __r7);                                         \\\n      }\n    #else\n    #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \\\n                      type5,arg5,type6,arg6)                                  \\\n      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \\\n                          type5 arg5,type6 arg6) {                            \\\n        LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \\\n        LSS_REG(7, arg4); LSS_REG(8, arg5); LSS_REG(9, arg6);                 \\\n        LSS_BODY(type, name, \"+r\", \"r\"(__r4), \"r\"(__r5), \"r\"(__r6),           \\\n                 \"r\"(__r8), \"r\"(__r9));                                       \\\n      }\n    #endif\n    LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,\n                                   int flags, void *arg, int *parent_tidptr,\n                                   void *newtls, int *child_tidptr) {\n      register unsigned long __v0 __asm__(\"$2\");\n      register unsigned long __r7 __asm__(\"$7\") = (unsigned long)newtls;\n      {\n        register int   __flags __asm__(\"$4\") = flags;\n        register void *__stack __asm__(\"$5\") = child_stack;\n        register void *__ptid  __asm__(\"$6\") = parent_tidptr;\n        register int  *__ctid  __asm__(\"$8\") = child_tidptr;\n        __asm__ __volatile__(\n          #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32\n                             \"subu  $29,24\\n\"\n          #elif _MIPS_SIM == _MIPS_SIM_NABI32\n                             \"sub   $29,16\\n\"\n          #else\n                             \"dsubu $29,16\\n\"\n          #endif\n\n                             /* if (fn == NULL || child_stack == NULL)\n                              *   return -EINVAL;\n                              */\n                             \"li    %0,%2\\n\"\n                             \"beqz  %5,1f\\n\"\n                             \"beqz  %6,1f\\n\"\n\n                             /* Push \"arg\" and \"fn\" onto the stack that will be\n                              * used by the child.\n                              */\n          #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32\n                             \"subu  %6,32\\n\"\n                             \"sw    %5,0(%6)\\n\"\n                             \"sw    %8,4(%6)\\n\"\n          #elif _MIPS_SIM == _MIPS_SIM_NABI32\n                             \"sub   %6,32\\n\"\n                             \"sw    %5,0(%6)\\n\"\n                             \"sw    %8,8(%6)\\n\"\n          #else\n                             \"dsubu %6,32\\n\"\n                             \"sd    %5,0(%6)\\n\"\n                             \"sd    %8,8(%6)\\n\"\n          #endif\n\n                             /* $7 = syscall($4 = flags,\n                              *              $5 = child_stack,\n                              *              $6 = parent_tidptr,\n                              *              $7 = newtls,\n                              *              $8 = child_tidptr)\n                              */\n                             \"li    $2,%3\\n\"\n                             \"syscall\\n\"\n\n                             /* if ($7 != 0)\n                              *   return $2;\n                              */\n                             \"bnez  $7,1f\\n\"\n                             \"bnez  $2,1f\\n\"\n\n                             /* In the child, now. Call \"fn(arg)\".\n                              */\n          #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32\n                            \"lw    $25,0($29)\\n\"\n                            \"lw    $4,4($29)\\n\"\n          #elif _MIPS_SIM == _MIPS_SIM_NABI32\n                            \"lw    $25,0($29)\\n\"\n                            \"lw    $4,8($29)\\n\"\n          #else\n                            \"ld    $25,0($29)\\n\"\n                            \"ld    $4,8($29)\\n\"\n          #endif\n                            \"jalr  $25\\n\"\n\n                             /* Call _exit($2)\n                              */\n                            \"move  $4,$2\\n\"\n                            \"li    $2,%4\\n\"\n                            \"syscall\\n\"\n\n                           \"1:\\n\"\n          #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32\n                             \"addu  $29, 24\\n\"\n          #elif _MIPS_SIM == _MIPS_SIM_NABI32\n                             \"add   $29, 16\\n\"\n          #else\n                             \"daddu $29,16\\n\"\n          #endif\n                             : \"=&r\" (__v0), \"=r\" (__r7)\n                             : \"i\"(-EINVAL), \"i\"(__NR_clone), \"i\"(__NR_exit),\n                               \"r\"(fn), \"r\"(__stack), \"r\"(__flags), \"r\"(arg),\n                               \"r\"(__ptid), \"r\"(__r7), \"r\"(__ctid)\n                             : \"$9\", \"$10\", \"$11\", \"$12\", \"$13\", \"$14\", \"$15\",\n                               \"$24\", \"memory\");\n      }\n      LSS_RETURN(int, __v0, __r7);\n    }\n  #elif defined (__PPC__)\n    #undef  LSS_LOADARGS_0\n    #define LSS_LOADARGS_0(name, dummy...)                                    \\\n        __sc_0 = __NR_##name\n    #undef  LSS_LOADARGS_1\n    #define LSS_LOADARGS_1(name, arg1)                                        \\\n            LSS_LOADARGS_0(name);                                             \\\n            __sc_3 = (unsigned long) (arg1)\n    #undef  LSS_LOADARGS_2\n    #define LSS_LOADARGS_2(name, arg1, arg2)                                  \\\n            LSS_LOADARGS_1(name, arg1);                                       \\\n            __sc_4 = (unsigned long) (arg2)\n    #undef  LSS_LOADARGS_3\n    #define LSS_LOADARGS_3(name, arg1, arg2, arg3)                            \\\n            LSS_LOADARGS_2(name, arg1, arg2);                                 \\\n            __sc_5 = (unsigned long) (arg3)\n    #undef  LSS_LOADARGS_4\n    #define LSS_LOADARGS_4(name, arg1, arg2, arg3, arg4)                      \\\n            LSS_LOADARGS_3(name, arg1, arg2, arg3);                           \\\n            __sc_6 = (unsigned long) (arg4)\n    #undef  LSS_LOADARGS_5\n    #define LSS_LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5)                \\\n            LSS_LOADARGS_4(name, arg1, arg2, arg3, arg4);                     \\\n            __sc_7 = (unsigned long) (arg5)\n    #undef  LSS_LOADARGS_6\n    #define LSS_LOADARGS_6(name, arg1, arg2, arg3, arg4, arg5, arg6)          \\\n            LSS_LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5);               \\\n            __sc_8 = (unsigned long) (arg6)\n    #undef  LSS_ASMINPUT_0\n    #define LSS_ASMINPUT_0 \"0\" (__sc_0)\n    #undef  LSS_ASMINPUT_1\n    #define LSS_ASMINPUT_1 LSS_ASMINPUT_0, \"1\" (__sc_3)\n    #undef  LSS_ASMINPUT_2\n    #define LSS_ASMINPUT_2 LSS_ASMINPUT_1, \"2\" (__sc_4)\n    #undef  LSS_ASMINPUT_3\n    #define LSS_ASMINPUT_3 LSS_ASMINPUT_2, \"3\" (__sc_5)\n    #undef  LSS_ASMINPUT_4\n    #define LSS_ASMINPUT_4 LSS_ASMINPUT_3, \"4\" (__sc_6)\n    #undef  LSS_ASMINPUT_5\n    #define LSS_ASMINPUT_5 LSS_ASMINPUT_4, \"5\" (__sc_7)\n    #undef  LSS_ASMINPUT_6\n    #define LSS_ASMINPUT_6 LSS_ASMINPUT_5, \"6\" (__sc_8)\n    #undef  LSS_BODY\n    #define LSS_BODY(nr, type, name, args...)                                 \\\n        long __sc_ret, __sc_err;                                              \\\n        {                                                                     \\\n                        register unsigned long __sc_0 __asm__ (\"r0\");         \\\n                        register unsigned long __sc_3 __asm__ (\"r3\");         \\\n                        register unsigned long __sc_4 __asm__ (\"r4\");         \\\n                        register unsigned long __sc_5 __asm__ (\"r5\");         \\\n                        register unsigned long __sc_6 __asm__ (\"r6\");         \\\n                        register unsigned long __sc_7 __asm__ (\"r7\");         \\\n                        register unsigned long __sc_8 __asm__ (\"r8\");         \\\n                                                                              \\\n            LSS_LOADARGS_##nr(name, args);                                    \\\n            __asm__ __volatile__                                              \\\n                (\"sc\\n\\t\"                                                     \\\n                 \"mfcr %0\"                                                    \\\n                 : \"=&r\" (__sc_0),                                            \\\n                   \"=&r\" (__sc_3), \"=&r\" (__sc_4),                            \\\n                   \"=&r\" (__sc_5), \"=&r\" (__sc_6),                            \\\n                   \"=&r\" (__sc_7), \"=&r\" (__sc_8)                             \\\n                 : LSS_ASMINPUT_##nr                                          \\\n                 : \"cr0\", \"ctr\", \"memory\",                                    \\\n                   \"r9\", \"r10\", \"r11\", \"r12\");                                \\\n            __sc_ret = __sc_3;                                                \\\n            __sc_err = __sc_0;                                                \\\n        }                                                                     \\\n        LSS_RETURN(type, __sc_ret, __sc_err)\n    #undef _syscall0\n    #define _syscall0(type, name)                                             \\\n       type LSS_NAME(name)(void) {                                            \\\n          LSS_BODY(0, type, name);                                            \\\n       }\n    #undef _syscall1\n    #define _syscall1(type, name, type1, arg1)                                \\\n       type LSS_NAME(name)(type1 arg1) {                                      \\\n          LSS_BODY(1, type, name, arg1);                                      \\\n       }\n    #undef _syscall2\n    #define _syscall2(type, name, type1, arg1, type2, arg2)                   \\\n       type LSS_NAME(name)(type1 arg1, type2 arg2) {                          \\\n          LSS_BODY(2, type, name, arg1, arg2);                                \\\n       }\n    #undef _syscall3\n    #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3)      \\\n       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) {              \\\n          LSS_BODY(3, type, name, arg1, arg2, arg3);                          \\\n       }\n    #undef _syscall4\n    #define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3,      \\\n                                  type4, arg4)                                \\\n       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {  \\\n          LSS_BODY(4, type, name, arg1, arg2, arg3, arg4);                    \\\n       }\n    #undef _syscall5\n    #define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3,      \\\n                                  type4, arg4, type5, arg5)                   \\\n       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,    \\\n                                               type5 arg5) {                  \\\n          LSS_BODY(5, type, name, arg1, arg2, arg3, arg4, arg5);              \\\n       }\n    #undef _syscall6\n    #define _syscall6(type, name, type1, arg1, type2, arg2, type3, arg3,      \\\n                                  type4, arg4, type5, arg5, type6, arg6)      \\\n       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,    \\\n                                               type5 arg5, type6 arg6) {      \\\n          LSS_BODY(6, type, name, arg1, arg2, arg3, arg4, arg5, arg6);        \\\n       }\n    /* clone function adapted from glibc 2.3.6 clone.S                       */\n    /* TODO(csilvers): consider wrapping some args up in a struct, like we\n     * do for i386's _syscall6, so we can compile successfully on gcc 2.95\n     */\n    LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,\n                                   int flags, void *arg, int *parent_tidptr,\n                                   void *newtls, int *child_tidptr) {\n      long __ret, __err;\n      {\n        register int (*__fn)(void *)    __asm__ (\"r8\")  = fn;\n        register void *__cstack                 __asm__ (\"r4\")  = child_stack;\n        register int __flags                    __asm__ (\"r3\")  = flags;\n        register void * __arg                   __asm__ (\"r9\")  = arg;\n        register int * __ptidptr                __asm__ (\"r5\")  = parent_tidptr;\n        register void * __newtls                __asm__ (\"r6\")  = newtls;\n        register int * __ctidptr                __asm__ (\"r7\")  = child_tidptr;\n        __asm__ __volatile__(\n            /* check for fn == NULL\n             * and child_stack == NULL\n             */\n            \"cmpwi cr0, %6, 0\\n\\t\"\n            \"cmpwi cr1, %7, 0\\n\\t\"\n            \"cror cr0*4+eq, cr1*4+eq, cr0*4+eq\\n\\t\"\n            \"beq- cr0, 1f\\n\\t\"\n\n            /* set up stack frame for child                                  */\n            \"clrrwi %7, %7, 4\\n\\t\"\n            \"li 0, 0\\n\\t\"\n            \"stwu 0, -16(%7)\\n\\t\"\n\n            /* fn, arg, child_stack are saved across the syscall: r28-30     */\n            \"mr 28, %6\\n\\t\"\n            \"mr 29, %7\\n\\t\"\n            \"mr 27, %9\\n\\t\"\n\n            /* syscall                                                       */\n            \"li 0, %4\\n\\t\"\n            /* flags already in r3\n             * child_stack already in r4\n             * ptidptr already in r5\n             * newtls already in r6\n             * ctidptr already in r7\n             */\n            \"sc\\n\\t\"\n\n            /* Test if syscall was successful                                */\n            \"cmpwi cr1, 3, 0\\n\\t\"\n            \"crandc cr1*4+eq, cr1*4+eq, cr0*4+so\\n\\t\"\n            \"bne- cr1, 1f\\n\\t\"\n\n            /* Do the function call                                          */\n            \"mtctr 28\\n\\t\"\n            \"mr 3, 27\\n\\t\"\n            \"bctrl\\n\\t\"\n\n            /* Call _exit(r3)                                                */\n            \"li 0, %5\\n\\t\"\n            \"sc\\n\\t\"\n\n            /* Return to parent                                              */\n            \"1:\\n\"\n            \"mfcr %1\\n\\t\"\n            \"mr %0, 3\\n\\t\"\n              : \"=r\" (__ret), \"=r\" (__err)\n              : \"0\" (-1), \"1\" (EINVAL),\n                \"i\" (__NR_clone), \"i\" (__NR_exit),\n                \"r\" (__fn), \"r\" (__cstack), \"r\" (__flags),\n                \"r\" (__arg), \"r\" (__ptidptr), \"r\" (__newtls),\n                \"r\" (__ctidptr)\n              : \"cr0\", \"cr1\", \"memory\", \"ctr\",\n                \"r0\", \"r29\", \"r27\", \"r28\");\n      }\n      LSS_RETURN(int, __ret, __err);\n    }\n  #endif\n  #define __NR__exit   __NR_exit\n  #define __NR__gettid __NR_gettid\n  #define __NR__mremap __NR_mremap\n  LSS_INLINE _syscall1(int,     brk,             void *,      e)\n  LSS_INLINE _syscall1(int,     chdir,           const char *,p)\n  LSS_INLINE _syscall1(int,     close,           int,         f)\n  LSS_INLINE _syscall2(int,     clock_getres,    int,         c,\n                       struct kernel_timespec*, t)\n  LSS_INLINE _syscall2(int,     clock_gettime,   int,         c,\n                       struct kernel_timespec*, t)\n  LSS_INLINE _syscall1(int,     dup,             int,         f)\n  LSS_INLINE _syscall2(int,     dup2,            int,         s,\n                       int,            d)\n  LSS_INLINE _syscall3(int,     execve,          const char*, f,\n                       const char*const*,a,const char*const*, e)\n  LSS_INLINE _syscall1(int,     _exit,           int,         e)\n  LSS_INLINE _syscall1(int,     exit_group,      int,         e)\n  LSS_INLINE _syscall3(int,     fcntl,           int,         f,\n                       int,            c, long,   a)\n  LSS_INLINE _syscall0(pid_t,   fork)\n  LSS_INLINE _syscall2(int,     fstat,           int,         f,\n                      struct kernel_stat*,   b)\n  LSS_INLINE _syscall2(int,     fstatfs,         int,         f,\n                      struct kernel_statfs*, b)\n  LSS_INLINE _syscall2(int, ftruncate,           int,         f,\n                       off_t,          l)\n  LSS_INLINE _syscall4(int,     futex,           int*,        a,\n                       int,            o, int,    v,\n                      struct kernel_timespec*, t)\n  LSS_INLINE _syscall3(int,     getdents,        int,         f,\n                      struct kernel_dirent*, d, int,    c)\n  LSS_INLINE _syscall3(int,     getdents64,      int,         f,\n                      struct kernel_dirent64*, d, int,    c)\n  LSS_INLINE _syscall0(gid_t,   getegid)\n  LSS_INLINE _syscall0(uid_t,   geteuid)\n  LSS_INLINE _syscall0(pid_t,   getpgrp)\n  LSS_INLINE _syscall0(pid_t,   getpid)\n  LSS_INLINE _syscall0(pid_t,   getppid)\n  LSS_INLINE _syscall2(int,     getpriority,     int,         a,\n                       int,            b)\n  LSS_INLINE _syscall3(int,     getresgid,       gid_t *,     r,\n                       gid_t *,         e,       gid_t *,     s)\n  LSS_INLINE _syscall3(int,     getresuid,       uid_t *,     r,\n                       uid_t *,         e,       uid_t *,     s)\n#if !defined(__ARM_EABI__)\n  LSS_INLINE _syscall2(int,     getrlimit,       int,         r,\n                      struct kernel_rlimit*, l)\n#endif\n  LSS_INLINE _syscall1(pid_t,   getsid,          pid_t,       p)\n  LSS_INLINE _syscall0(pid_t,   _gettid)\n  LSS_INLINE _syscall2(pid_t,   gettimeofday,    struct kernel_timeval*, t,\n                       void*, tz)\n  LSS_INLINE _syscall5(int,     setxattr,        const char *,p,\n                       const char *,   n,        const void *,v,\n                       size_t,         s,        int,         f)\n  LSS_INLINE _syscall5(int,     lsetxattr,       const char *,p,\n                       const char *,   n,        const void *,v,\n                       size_t,         s,        int,         f)\n  LSS_INLINE _syscall4(ssize_t, getxattr,        const char *,p,\n                       const char *,   n,        void *,      v, size_t, s)\n  LSS_INLINE _syscall4(ssize_t, lgetxattr,       const char *,p,\n                       const char *,   n,        void *,      v, size_t, s)\n  LSS_INLINE _syscall3(ssize_t, listxattr,       const char *,p,\n                       char *,   l,              size_t,      s)\n  LSS_INLINE _syscall3(ssize_t, llistxattr,      const char *,p,\n                       char *,   l,              size_t,      s)\n  LSS_INLINE _syscall3(int,     ioctl,           int,         d,\n                       int,     r,               void *,      a)\n  LSS_INLINE _syscall2(int,     ioprio_get,      int,         which,\n                       int,     who)\n  LSS_INLINE _syscall3(int,     ioprio_set,      int,         which,\n                       int,     who,             int,         ioprio)\n  LSS_INLINE _syscall2(int,     kill,            pid_t,       p,\n                       int,            s)\n  LSS_INLINE _syscall3(off_t,   lseek,           int,         f,\n                       off_t,          o, int,    w)\n  LSS_INLINE _syscall2(int,     munmap,          void*,       s,\n                       size_t,         l)\n  LSS_INLINE _syscall6(long,    move_pages,      pid_t,       p,\n                       unsigned long,  n, void **,g, int *,   d,\n                       int *,          s, int,    f)\n  LSS_INLINE _syscall3(int,     mprotect,        const void *,a,\n                       size_t,         l,        int,         p)\n  LSS_INLINE _syscall5(void*,   _mremap,         void*,       o,\n                       size_t,         os,       size_t,      ns,\n                       unsigned long,  f, void *, a)\n  LSS_INLINE _syscall3(int,     open,            const char*, p,\n                       int,            f, int,    m)\n  LSS_INLINE _syscall3(int,     poll,           struct kernel_pollfd*, u,\n                       unsigned int,   n, int,    t)\n  LSS_INLINE _syscall2(int,     prctl,           int,         o,\n                       long,           a)\n  LSS_INLINE _syscall4(long,    ptrace,          int,         r,\n                       pid_t,          p, void *, a, void *, d)\n  #if defined(__NR_quotactl)\n    // Defined on x86_64 / i386 only\n    LSS_INLINE _syscall4(int,  quotactl,  int,  cmd,  const char *, special,\n                         int, id, caddr_t, addr)\n  #endif\n  LSS_INLINE _syscall3(ssize_t, read,            int,         f,\n                       void *,         b, size_t, c)\n  LSS_INLINE _syscall3(int,     readlink,        const char*, p,\n                       char*,          b, size_t, s)\n  LSS_INLINE _syscall4(int,     rt_sigaction,    int,         s,\n                       const struct kernel_sigaction*, a,\n                       struct kernel_sigaction*, o, size_t,   c)\n  LSS_INLINE _syscall2(int, rt_sigpending, struct kernel_sigset_t *, s,\n                       size_t,         c)\n  LSS_INLINE _syscall4(int, rt_sigprocmask,      int,         h,\n                       const struct kernel_sigset_t*,  s,\n                       struct kernel_sigset_t*,        o, size_t, c)\n  LSS_INLINE _syscall2(int, rt_sigsuspend,\n                       const struct kernel_sigset_t*, s,  size_t, c)\n  LSS_INLINE _syscall3(int,     sched_getaffinity,pid_t,      p,\n                       unsigned int,   l, unsigned long *, m)\n  LSS_INLINE _syscall3(int,     sched_setaffinity,pid_t,      p,\n                       unsigned int,   l, unsigned long *, m)\n  LSS_INLINE _syscall0(int,     sched_yield)\n  LSS_INLINE _syscall1(long,    set_tid_address, int *,       t)\n  LSS_INLINE _syscall1(int,     setfsgid,        gid_t,       g)\n  LSS_INLINE _syscall1(int,     setfsuid,        uid_t,       u)\n  LSS_INLINE _syscall1(int,     setuid,          uid_t,       u)\n  LSS_INLINE _syscall1(int,     setgid,          gid_t,       g)\n  LSS_INLINE _syscall2(int,     setpgid,         pid_t,       p,\n                       pid_t,          g)\n  LSS_INLINE _syscall3(int,     setpriority,     int,         a,\n                       int,            b, int,    p)\n  LSS_INLINE _syscall3(int,     setresgid,       gid_t,       r,\n                       gid_t,          e, gid_t,  s)\n  LSS_INLINE _syscall3(int,     setresuid,       uid_t,       r,\n                       uid_t,          e, uid_t,  s)\n  LSS_INLINE _syscall2(int,     setrlimit,       int,         r,\n                       const struct kernel_rlimit*, l)\n  LSS_INLINE _syscall0(pid_t,    setsid)\n  LSS_INLINE _syscall2(int,     sigaltstack,     const stack_t*, s,\n                       const stack_t*, o)\n  #if defined(__NR_sigreturn)\n  LSS_INLINE _syscall1(int,     sigreturn,       unsigned long, u)\n  #endif\n  LSS_INLINE _syscall2(int,     stat,            const char*, f,\n                      struct kernel_stat*,   b)\n  LSS_INLINE _syscall2(int,     statfs,          const char*, f,\n                      struct kernel_statfs*, b)\n  LSS_INLINE _syscall3(int,     tgkill,          pid_t,       p,\n                       pid_t,          t, int,            s)\n  LSS_INLINE _syscall2(int,     tkill,           pid_t,       p,\n                       int,            s)\n  LSS_INLINE _syscall1(int,     unlink,           const char*, f)\n  LSS_INLINE _syscall3(ssize_t, write,            int,        f,\n                       const void *,   b, size_t, c)\n  LSS_INLINE _syscall3(ssize_t, writev,           int,        f,\n                       const struct kernel_iovec*, v, size_t, c)\n  #if defined(__NR_getcpu)\n    LSS_INLINE _syscall3(long, getcpu, unsigned *, cpu,\n                         unsigned *, node, void *, unused)\n  #endif\n  #if defined(__x86_64__) ||                                                  \\\n     (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32)\n    LSS_INLINE _syscall3(int, recvmsg,            int,   s,\n                        struct kernel_msghdr*,     m, int, f)\n    LSS_INLINE _syscall3(int, sendmsg,            int,   s,\n                         const struct kernel_msghdr*, m, int, f)\n    LSS_INLINE _syscall6(int, sendto,             int,   s,\n                         const void*,             m, size_t, l,\n                         int,                     f,\n                         const struct kernel_sockaddr*, a, int, t)\n    LSS_INLINE _syscall2(int, shutdown,           int,   s,\n                         int,                     h)\n    LSS_INLINE _syscall3(int, socket,             int,   d,\n                         int,                     t, int,       p)\n    LSS_INLINE _syscall4(int, socketpair,         int,   d,\n                         int,                     t, int,       p, int*, s)\n  #endif\n  #if defined(__x86_64__)\n    LSS_INLINE _syscall4(int, fallocate, int, fd, int, mode,\n                         loff_t, offset, loff_t, len)\n\n    LSS_INLINE int LSS_NAME(getresgid32)(gid_t *rgid,\n                                         gid_t *egid,\n                                         gid_t *sgid) {\n      return LSS_NAME(getresgid)(rgid, egid, sgid);\n    }\n\n    LSS_INLINE int LSS_NAME(getresuid32)(uid_t *ruid,\n                                         uid_t *euid,\n                                         uid_t *suid) {\n      return LSS_NAME(getresuid)(ruid, euid, suid);\n    }\n\n    LSS_INLINE _syscall6(void*, mmap,              void*, s,\n                         size_t,                   l, int,               p,\n                         int,                      f, int,               d,\n                         __off64_t,                o)\n\n    LSS_INLINE _syscall4(int, newfstatat,         int,   d,\n                         const char *,            p,\n                        struct kernel_stat*,       b, int, f)\n\n    LSS_INLINE int LSS_NAME(setfsgid32)(gid_t gid) {\n      return LSS_NAME(setfsgid)(gid);\n    }\n\n    LSS_INLINE int LSS_NAME(setfsuid32)(uid_t uid) {\n      return LSS_NAME(setfsuid)(uid);\n    }\n\n    LSS_INLINE int LSS_NAME(setresgid32)(gid_t rgid, gid_t egid, gid_t sgid) {\n      return LSS_NAME(setresgid)(rgid, egid, sgid);\n    }\n\n    LSS_INLINE int LSS_NAME(setresuid32)(uid_t ruid, uid_t euid, uid_t suid) {\n      return LSS_NAME(setresuid)(ruid, euid, suid);\n    }\n\n    LSS_INLINE int LSS_NAME(sigaction)(int signum,\n                                       const struct kernel_sigaction *act,\n                                       struct kernel_sigaction *oldact) {\n      /* On x86_64, the kernel requires us to always set our own\n       * SA_RESTORER in order to be able to return from a signal handler.\n       * This function must have a \"magic\" signature that the \"gdb\"\n       * (and maybe the kernel?) can recognize.\n       */\n      if (act != NULL && !(act->sa_flags & SA_RESTORER)) {\n        struct kernel_sigaction a = *act;\n        a.sa_flags   |= SA_RESTORER;\n        a.sa_restorer = LSS_NAME(restore_rt)();\n        return LSS_NAME(rt_sigaction)(signum, &a, oldact,\n                                      (KERNEL_NSIG+7)/8);\n      } else {\n        return LSS_NAME(rt_sigaction)(signum, act, oldact,\n                                      (KERNEL_NSIG+7)/8);\n      }\n    }\n\n    LSS_INLINE int LSS_NAME(sigpending)(struct kernel_sigset_t *set) {\n      return LSS_NAME(rt_sigpending)(set, (KERNEL_NSIG+7)/8);\n    }\n\n    LSS_INLINE int LSS_NAME(sigprocmask)(int how,\n                                         const struct kernel_sigset_t *set,\n                                         struct kernel_sigset_t *oldset) {\n      return LSS_NAME(rt_sigprocmask)(how, set, oldset, (KERNEL_NSIG+7)/8);\n    }\n\n    LSS_INLINE int LSS_NAME(sigsuspend)(const struct kernel_sigset_t *set) {\n      return LSS_NAME(rt_sigsuspend)(set, (KERNEL_NSIG+7)/8);\n    }\n  #endif\n  #if defined(__x86_64__) || defined(__ARM_ARCH_3__) ||                       \\\n      defined(__ARM_EABI__) ||                                             \\\n     (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32)\n    LSS_INLINE _syscall4(pid_t, wait4,            pid_t, p,\n                         int*,                    s, int,       o,\n                        struct kernel_rusage*,     r)\n\n    LSS_INLINE pid_t LSS_NAME(waitpid)(pid_t pid, int *status, int options){\n      return LSS_NAME(wait4)(pid, status, options, 0);\n    }\n  #endif\n  #if defined(__i386__) || defined(__x86_64__)\n    LSS_INLINE _syscall4(int, openat, int, d, const char *, p, int, f, int, m)\n    LSS_INLINE _syscall3(int, unlinkat, int, d, const char *, p, int, f)\n  #endif\n  #if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__)\n    #define __NR__getresgid32 __NR_getresgid32\n    #define __NR__getresuid32 __NR_getresuid32\n    #define __NR__setfsgid32  __NR_setfsgid32\n    #define __NR__setfsuid32  __NR_setfsuid32\n    #define __NR__setresgid32 __NR_setresgid32\n    #define __NR__setresuid32 __NR_setresuid32\n#if defined(__ARM_EABI__)\n    LSS_INLINE _syscall2(int,   ugetrlimit,        int,          r,\n                        struct kernel_rlimit*, l)\n#endif\n    LSS_INLINE _syscall3(int,     _getresgid32,    gid_t *,      r,\n                         gid_t *,            e,    gid_t *,      s)\n    LSS_INLINE _syscall3(int,     _getresuid32,    uid_t *,      r,\n                         uid_t *,            e,    uid_t *,      s)\n    LSS_INLINE _syscall1(int,     _setfsgid32,     gid_t,        f)\n    LSS_INLINE _syscall1(int,     _setfsuid32,     uid_t,        f)\n    LSS_INLINE _syscall3(int,     _setresgid32,    gid_t,        r,\n                         gid_t,              e,    gid_t,        s)\n    LSS_INLINE _syscall3(int,     _setresuid32,    uid_t,        r,\n                         uid_t,              e,    uid_t,        s)\n\n    LSS_INLINE int LSS_NAME(getresgid32)(gid_t *rgid,\n                                         gid_t *egid,\n                                         gid_t *sgid) {\n      int rc;\n      if ((rc = LSS_NAME(_getresgid32)(rgid, egid, sgid)) < 0 &&\n          LSS_ERRNO == ENOSYS) {\n        if ((rgid == NULL) || (egid == NULL) || (sgid == NULL)) {\n          return EFAULT;\n        }\n        // Clear the high bits first, since getresgid only sets 16 bits\n        *rgid = *egid = *sgid = 0;\n        rc = LSS_NAME(getresgid)(rgid, egid, sgid);\n      }\n      return rc;\n    }\n\n    LSS_INLINE int LSS_NAME(getresuid32)(uid_t *ruid,\n                                         uid_t *euid,\n                                         uid_t *suid) {\n      int rc;\n      if ((rc = LSS_NAME(_getresuid32)(ruid, euid, suid)) < 0 &&\n          LSS_ERRNO == ENOSYS) {\n        if ((ruid == NULL) || (euid == NULL) || (suid == NULL)) {\n          return EFAULT;\n        }\n        // Clear the high bits first, since getresuid only sets 16 bits\n        *ruid = *euid = *suid = 0;\n        rc = LSS_NAME(getresuid)(ruid, euid, suid);\n      }\n      return rc;\n    }\n\n    LSS_INLINE int LSS_NAME(setfsgid32)(gid_t gid) {\n      int rc;\n      if ((rc = LSS_NAME(_setfsgid32)(gid)) < 0 &&\n          LSS_ERRNO == ENOSYS) {\n        if ((unsigned int)gid & ~0xFFFFu) {\n          rc = EINVAL;\n        } else {\n          rc = LSS_NAME(setfsgid)(gid);\n        }\n      }\n      return rc;\n    }\n\n    LSS_INLINE int LSS_NAME(setfsuid32)(uid_t uid) {\n      int rc;\n      if ((rc = LSS_NAME(_setfsuid32)(uid)) < 0 &&\n          LSS_ERRNO == ENOSYS) {\n        if ((unsigned int)uid & ~0xFFFFu) {\n          rc = EINVAL;\n        } else {\n          rc = LSS_NAME(setfsuid)(uid);\n        }\n      }\n      return rc;\n    }\n\n    LSS_INLINE int LSS_NAME(setresgid32)(gid_t rgid, gid_t egid, gid_t sgid) {\n      int rc;\n      if ((rc = LSS_NAME(_setresgid32)(rgid, egid, sgid)) < 0 &&\n          LSS_ERRNO == ENOSYS) {\n        if ((unsigned int)rgid & ~0xFFFFu ||\n            (unsigned int)egid & ~0xFFFFu ||\n            (unsigned int)sgid & ~0xFFFFu) {\n          rc = EINVAL;\n        } else {\n          rc = LSS_NAME(setresgid)(rgid, egid, sgid);\n        }\n      }\n      return rc;\n    }\n\n    LSS_INLINE int LSS_NAME(setresuid32)(uid_t ruid, uid_t euid, uid_t suid) {\n      int rc;\n      if ((rc = LSS_NAME(_setresuid32)(ruid, euid, suid)) < 0 &&\n          LSS_ERRNO == ENOSYS) {\n        if ((unsigned int)ruid & ~0xFFFFu ||\n            (unsigned int)euid & ~0xFFFFu ||\n            (unsigned int)suid & ~0xFFFFu) {\n          rc = EINVAL;\n        } else {\n          rc = LSS_NAME(setresuid)(ruid, euid, suid);\n        }\n      }\n      return rc;\n    }\n  #endif\n  LSS_INLINE int LSS_NAME(sigemptyset)(struct kernel_sigset_t *set) {\n    memset(&set->sig, 0, sizeof(set->sig));\n    return 0;\n  }\n\n  LSS_INLINE int LSS_NAME(sigfillset)(struct kernel_sigset_t *set) {\n    memset(&set->sig, -1, sizeof(set->sig));\n    return 0;\n  }\n\n  LSS_INLINE int LSS_NAME(sigaddset)(struct kernel_sigset_t *set,\n                                     int signum) {\n    if (signum < 1 || signum > (int)(8*sizeof(set->sig))) {\n      LSS_ERRNO = EINVAL;\n      return -1;\n    } else {\n      set->sig[(signum - 1)/(8*sizeof(set->sig[0]))]\n          |= 1UL << ((signum - 1) % (8*sizeof(set->sig[0])));\n      return 0;\n    }\n  }\n\n  LSS_INLINE int LSS_NAME(sigdelset)(struct kernel_sigset_t *set,\n                                        int signum) {\n    if (signum < 1 || signum > (int)(8*sizeof(set->sig))) {\n      LSS_ERRNO = EINVAL;\n      return -1;\n    } else {\n      set->sig[(signum - 1)/(8*sizeof(set->sig[0]))]\n          &= ~(1UL << ((signum - 1) % (8*sizeof(set->sig[0]))));\n      return 0;\n    }\n  }\n  \n  LSS_INLINE int LSS_NAME(sigismember)(struct kernel_sigset_t *set,\n                                          int signum) {\n    if (signum < 1 || signum > (int)(8*sizeof(set->sig))) {\n      LSS_ERRNO = EINVAL;\n      return -1;\n    } else {\n      return !!(set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] &\n                (1UL << ((signum - 1) % (8*sizeof(set->sig[0])))));\n    }\n  }\n  #if defined(__i386__) || defined(__ARM_ARCH_3__) ||                         \\\n      defined(__ARM_EABI__) ||                                             \\\n     (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || defined(__PPC__)\n    #define __NR__sigaction   __NR_sigaction\n    #define __NR__sigpending  __NR_sigpending\n    #define __NR__sigprocmask __NR_sigprocmask\n    #define __NR__sigsuspend  __NR_sigsuspend\n    #define __NR__socketcall  __NR_socketcall\n#if ! defined(__ANDROID__)\n    /* The Android NDK #defines stat64 stat, so avoid multiple-definition */\n    LSS_INLINE _syscall2(int, fstat64,             int, f,\n                         struct kernel_stat64 *, b)\n#endif\n    LSS_INLINE _syscall5(int, _llseek,     uint, fd,\n                         unsigned long, hi, unsigned long, lo,\n                         loff_t *, res, uint, wh)\n#if !defined(__ARM_EABI__)\n    LSS_INLINE _syscall1(void*, mmap,              void*, a)\n#endif\n    LSS_INLINE _syscall6(void*, mmap2,             void*, s,\n                         size_t,                   l, int,               p,\n                         int,                      f, int,               d,\n                         off_t,                o)\n    LSS_INLINE _syscall3(int,   _sigaction,        int,   s,\n                         const struct kernel_old_sigaction*,  a,\n                         struct kernel_old_sigaction*,        o)\n    LSS_INLINE _syscall1(int,   _sigpending, unsigned long*, s)\n    LSS_INLINE _syscall3(int,   _sigprocmask,      int,   h,\n                         const unsigned long*,     s,\n                         unsigned long*,           o)\n    #ifdef __PPC__\n    LSS_INLINE _syscall1(int, _sigsuspend,         unsigned long, s)\n    #else\n    LSS_INLINE _syscall3(int, _sigsuspend,         const void*, a,\n                         int,                      b,\n                         unsigned long,            s)\n    #endif\n#if ! defined(__ANDROID__)\n    /* The Android NDK #defines stat64 stat, so avoid multiple-definition */\n    LSS_INLINE _syscall2(int, stat64,              const char *, p,\n                         struct kernel_stat64 *, b)\n#endif\n\n    LSS_INLINE int LSS_NAME(sigaction)(int signum,\n                                       const struct kernel_sigaction *act,\n                                       struct kernel_sigaction *oldact) {\n      int old_errno = LSS_ERRNO;\n      int rc;\n      struct kernel_sigaction a;\n      if (act != NULL) {\n        a             = *act;\n        #ifdef __i386__\n        /* On i386, the kernel requires us to always set our own\n         * SA_RESTORER when using realtime signals. Otherwise, it does not\n         * know how to return from a signal handler. This function must have\n         * a \"magic\" signature that the \"gdb\" (and maybe the kernel?) can\n         * recognize.\n         * Apparently, a SA_RESTORER is implicitly set by the kernel, when\n         * using non-realtime signals.\n         *\n         * TODO: Test whether ARM needs a restorer\n         */\n        if (!(a.sa_flags & SA_RESTORER)) {\n          a.sa_flags   |= SA_RESTORER;\n          a.sa_restorer = (a.sa_flags & SA_SIGINFO)\n                          ? LSS_NAME(restore_rt)() : LSS_NAME(restore)();\n        }\n        #endif\n      }\n      rc = LSS_NAME(rt_sigaction)(signum, act ? &a : act, oldact,\n                                  (KERNEL_NSIG+7)/8);\n      if (rc < 0 && LSS_ERRNO == ENOSYS) {\n        struct kernel_old_sigaction oa, ooa, *ptr_a = &oa, *ptr_oa = &ooa;\n        if (!act) {\n          ptr_a            = NULL;\n        } else {\n          oa.sa_handler_   = act->sa_handler_;\n          memcpy(&oa.sa_mask, &act->sa_mask, sizeof(oa.sa_mask));\n          #ifndef __mips__\n          oa.sa_restorer   = act->sa_restorer;\n          #endif\n          oa.sa_flags      = act->sa_flags;\n        }\n        if (!oldact) {\n          ptr_oa           = NULL;\n        }\n        LSS_ERRNO = old_errno;\n        rc = LSS_NAME(_sigaction)(signum, ptr_a, ptr_oa);\n        if (rc == 0 && oldact) {\n          if (act) {\n            memcpy(oldact, act, sizeof(*act));\n          } else {\n            memset(oldact, 0, sizeof(*oldact));\n          }\n          oldact->sa_handler_    = ptr_oa->sa_handler_;\n          oldact->sa_flags       = ptr_oa->sa_flags;\n          memcpy(&oldact->sa_mask, &ptr_oa->sa_mask, sizeof(ptr_oa->sa_mask));\n          #ifndef __mips__\n          oldact->sa_restorer    = ptr_oa->sa_restorer;\n          #endif\n        }\n      }\n      return rc;\n    }\n\n    LSS_INLINE int LSS_NAME(sigpending)(struct kernel_sigset_t *set) {\n      int old_errno = LSS_ERRNO;\n      int rc = LSS_NAME(rt_sigpending)(set, (KERNEL_NSIG+7)/8);\n      if (rc < 0 && LSS_ERRNO == ENOSYS) {\n        LSS_ERRNO = old_errno;\n        LSS_NAME(sigemptyset)(set);\n        rc = LSS_NAME(_sigpending)(&set->sig[0]);\n      }\n      return rc;\n    }\n\n    LSS_INLINE int LSS_NAME(sigprocmask)(int how,\n                                         const struct kernel_sigset_t *set,\n                                         struct kernel_sigset_t *oldset) {\n      int olderrno = LSS_ERRNO;\n      int rc = LSS_NAME(rt_sigprocmask)(how, set, oldset, (KERNEL_NSIG+7)/8);\n      if (rc < 0 && LSS_ERRNO == ENOSYS) {\n        LSS_ERRNO = olderrno;\n        if (oldset) {\n          LSS_NAME(sigemptyset)(oldset);\n        }\n        rc = LSS_NAME(_sigprocmask)(how,\n                                    set ? &set->sig[0] : NULL,\n                                    oldset ? &oldset->sig[0] : NULL);\n      }\n      return rc;\n    }\n\n    LSS_INLINE int LSS_NAME(sigsuspend)(const struct kernel_sigset_t *set) {\n      int olderrno = LSS_ERRNO;\n      int rc = LSS_NAME(rt_sigsuspend)(set, (KERNEL_NSIG+7)/8);\n      if (rc < 0 && LSS_ERRNO == ENOSYS) {\n        LSS_ERRNO = olderrno;\n        rc = LSS_NAME(_sigsuspend)(\n        #ifndef __PPC__\n                                   set, 0,\n        #endif\n                                   set->sig[0]);\n      }\n      return rc;\n    }\n  #endif\n  #if defined(__PPC__)\n    #undef LSS_SC_LOADARGS_0\n    #define LSS_SC_LOADARGS_0(dummy...)\n    #undef LSS_SC_LOADARGS_1\n    #define LSS_SC_LOADARGS_1(arg1)                                           \\\n        __sc_4  = (unsigned long) (arg1)\n    #undef LSS_SC_LOADARGS_2\n    #define LSS_SC_LOADARGS_2(arg1, arg2)                                     \\\n        LSS_SC_LOADARGS_1(arg1);                                              \\\n        __sc_5  = (unsigned long) (arg2)\n    #undef LSS_SC_LOADARGS_3\n    #define LSS_SC_LOADARGS_3(arg1, arg2, arg3)                               \\\n        LSS_SC_LOADARGS_2(arg1, arg2);                                        \\\n        __sc_6  = (unsigned long) (arg3)\n    #undef LSS_SC_LOADARGS_4\n    #define LSS_SC_LOADARGS_4(arg1, arg2, arg3, arg4)                         \\\n        LSS_SC_LOADARGS_3(arg1, arg2, arg3);                                  \\\n        __sc_7  = (unsigned long) (arg4)\n    #undef LSS_SC_LOADARGS_5\n    #define LSS_SC_LOADARGS_5(arg1, arg2, arg3, arg4, arg5)                   \\\n        LSS_SC_LOADARGS_4(arg1, arg2, arg3, arg4);                            \\\n        __sc_8  = (unsigned long) (arg5)\n    #undef LSS_SC_BODY\n    #define LSS_SC_BODY(nr, type, opt, args...)                               \\\n        long __sc_ret, __sc_err;                                              \\\n        {                                                                     \\\n          register unsigned long __sc_0 __asm__ (\"r0\") = __NR_socketcall;     \\\n          register unsigned long __sc_3 __asm__ (\"r3\") = opt;                 \\\n          register unsigned long __sc_4 __asm__ (\"r4\");                       \\\n          register unsigned long __sc_5 __asm__ (\"r5\");                       \\\n          register unsigned long __sc_6 __asm__ (\"r6\");                       \\\n          register unsigned long __sc_7 __asm__ (\"r7\");                       \\\n          register unsigned long __sc_8 __asm__ (\"r8\");                       \\\n          LSS_SC_LOADARGS_##nr(args);                                         \\\n          __asm__ __volatile__                                                \\\n              (\"stwu 1, -48(1)\\n\\t\"                                           \\\n               \"stw 4, 20(1)\\n\\t\"                                             \\\n               \"stw 5, 24(1)\\n\\t\"                                             \\\n               \"stw 6, 28(1)\\n\\t\"                                             \\\n               \"stw 7, 32(1)\\n\\t\"                                             \\\n               \"stw 8, 36(1)\\n\\t\"                                             \\\n               \"addi 4, 1, 20\\n\\t\"                                            \\\n               \"sc\\n\\t\"                                                       \\\n               \"mfcr %0\"                                                      \\\n                 : \"=&r\" (__sc_0),                                            \\\n                   \"=&r\" (__sc_3), \"=&r\" (__sc_4),                            \\\n                   \"=&r\" (__sc_5), \"=&r\" (__sc_6),                            \\\n                   \"=&r\" (__sc_7), \"=&r\" (__sc_8)                             \\\n                 : LSS_ASMINPUT_##nr                                          \\\n                 : \"cr0\", \"ctr\", \"memory\");                                   \\\n          __sc_ret = __sc_3;                                                  \\\n          __sc_err = __sc_0;                                                  \\\n        }                                                                     \\\n        LSS_RETURN(type, __sc_ret, __sc_err)\n\n    LSS_INLINE ssize_t LSS_NAME(recvmsg)(int s,struct kernel_msghdr *msg,\n                                         int flags){\n      LSS_SC_BODY(3, ssize_t, 17, s, msg, flags);\n    }\n\n    LSS_INLINE ssize_t LSS_NAME(sendmsg)(int s,\n                                         const struct kernel_msghdr *msg,\n                                         int flags) {\n      LSS_SC_BODY(3, ssize_t, 16, s, msg, flags);\n    }\n\n    // TODO(csilvers): why is this ifdef'ed out?\n#if 0\n    LSS_INLINE ssize_t LSS_NAME(sendto)(int s, const void *buf, size_t len,\n                                        int flags,\n                                        const struct kernel_sockaddr *to,\n                                        unsigned int tolen) {\n      LSS_BODY(6, ssize_t, 11, s, buf, len, flags, to, tolen);\n    }\n#endif\n\n    LSS_INLINE int LSS_NAME(shutdown)(int s, int how) {\n      LSS_SC_BODY(2, int, 13, s, how);\n    }\n\n    LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) {\n      LSS_SC_BODY(3, int, 1, domain, type, protocol);\n    }\n\n    LSS_INLINE int LSS_NAME(socketpair)(int d, int type, int protocol,\n                                        int sv[2]) {\n      LSS_SC_BODY(4, int, 8, d, type, protocol, sv);\n    }\n  #endif\n  #if defined(__ARM_EABI__)\n    LSS_INLINE _syscall3(ssize_t, recvmsg, int, s, struct kernel_msghdr*, msg,\n                         int, flags)\n    LSS_INLINE _syscall3(ssize_t, sendmsg, int, s, const struct kernel_msghdr*,\n                         msg, int, flags)\n    LSS_INLINE _syscall6(ssize_t, sendto, int, s, const void*, buf, size_t,len,\n                         int, flags, const struct kernel_sockaddr*, to,\n                         unsigned int, tolen)\n    LSS_INLINE _syscall2(int, shutdown, int, s, int, how)\n    LSS_INLINE _syscall3(int, socket, int, domain, int, type, int, protocol)\n    LSS_INLINE _syscall4(int, socketpair, int, d, int, type, int, protocol,\n                         int*, sv)\n  #endif\n  #if defined(__i386__) || defined(__ARM_ARCH_3__) ||                         \\\n      (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32)\n    #define __NR__socketcall  __NR_socketcall\n    LSS_INLINE _syscall2(int,      _socketcall,    int,   c,\n                         va_list,                  a)\n    LSS_INLINE int LSS_NAME(socketcall)(int op, ...) {\n      int rc;\n      va_list ap;\n      va_start(ap, op);\n      rc = LSS_NAME(_socketcall)(op, ap);\n      va_end(ap);\n      return rc;\n    }\n\n    LSS_INLINE ssize_t LSS_NAME(recvmsg)(int s,struct kernel_msghdr *msg,\n                                         int flags){\n      return (ssize_t)LSS_NAME(socketcall)(17, s, msg, flags);\n    }\n\n    LSS_INLINE ssize_t LSS_NAME(sendmsg)(int s,\n                                         const struct kernel_msghdr *msg,\n                                         int flags) {\n      return (ssize_t)LSS_NAME(socketcall)(16, s, msg, flags);\n    }\n\n    LSS_INLINE ssize_t LSS_NAME(sendto)(int s, const void *buf, size_t len,\n                                        int flags,\n                                        const struct kernel_sockaddr *to,\n                                        unsigned int tolen) {\n      return (ssize_t)LSS_NAME(socketcall)(11, s, buf, len, flags, to, tolen);\n    }\n\n    LSS_INLINE int LSS_NAME(shutdown)(int s, int how) {\n      return LSS_NAME(socketcall)(13, s, how);\n    }\n\n    LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) {\n      return LSS_NAME(socketcall)(1, domain, type, protocol);\n    }\n\n    LSS_INLINE int LSS_NAME(socketpair)(int d, int type, int protocol,\n                                        int sv[2]) {\n      return LSS_NAME(socketcall)(8, d, type, protocol, sv);\n    }\n  #endif\n  #if defined(__i386__) || defined(__PPC__)\n    LSS_INLINE _syscall4(int,   fstatat64,        int,   d,\n                         const char *,      p,\n                         struct kernel_stat64 *,   b,    int,   f)\n  #endif\n  #if defined(__i386__) || defined(__PPC__) ||                                \\\n     (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32)\n    LSS_INLINE _syscall3(pid_t, waitpid,          pid_t, p,\n                         int*,              s,    int,   o)\n  #endif\n  #if defined(__mips__)\n    /* sys_pipe() on MIPS has non-standard calling conventions, as it returns\n     * both file handles through CPU registers.\n     */\n    LSS_INLINE int LSS_NAME(pipe)(int *p) {\n      register unsigned long __v0 __asm__(\"$2\") = __NR_pipe;\n      register unsigned long __v1 __asm__(\"$3\");\n      register unsigned long __r7 __asm__(\"$7\");\n      __asm__ __volatile__ (\"syscall\\n\"\n                            : \"=&r\"(__v0), \"=&r\"(__v1), \"+r\" (__r7)\n                            : \"0\"(__v0)\n                            : \"$8\", \"$9\", \"$10\", \"$11\", \"$12\",\n                              \"$13\", \"$14\", \"$15\", \"$24\", \"memory\");\n      if (__r7) {\n        LSS_ERRNO = __v0;\n        return -1;\n      } else {\n        p[0] = __v0;\n        p[1] = __v1;\n        return 0;\n      }\n    }\n  #else\n    LSS_INLINE _syscall1(int,     pipe,           int *, p)\n  #endif\n  /* TODO(csilvers): see if ppc can/should support this as well              */\n  #if defined(__i386__) || defined(__ARM_ARCH_3__) ||                         \\\n      defined(__ARM_EABI__) ||                                             \\\n     (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64)\n    #define __NR__statfs64  __NR_statfs64\n    #define __NR__fstatfs64 __NR_fstatfs64\n    LSS_INLINE _syscall3(int, _statfs64,     const char*, p,\n                         size_t, s,struct kernel_statfs64*, b)\n    LSS_INLINE _syscall3(int, _fstatfs64,          int,   f,\n                         size_t, s,struct kernel_statfs64*, b)\n    LSS_INLINE int LSS_NAME(statfs64)(const char *p,\n                                     struct kernel_statfs64 *b) {\n      return LSS_NAME(_statfs64)(p, sizeof(*b), b);\n    }\n    LSS_INLINE int LSS_NAME(fstatfs64)(int f,struct kernel_statfs64 *b) {\n      return LSS_NAME(_fstatfs64)(f, sizeof(*b), b);\n    }\n  #endif\n\n  LSS_INLINE int LSS_NAME(execv)(const char *path, const char *const argv[]) {\n    extern char **environ;\n    return LSS_NAME(execve)(path, argv, (const char *const *)environ);\n  }\n\n  LSS_INLINE pid_t LSS_NAME(gettid)() {\n    pid_t tid = LSS_NAME(_gettid)();\n    if (tid != -1) {\n      return tid;\n    }\n    return LSS_NAME(getpid)();\n  }\n\n  LSS_INLINE void *LSS_NAME(mremap)(void *old_address, size_t old_size,\n                                    size_t new_size, int flags, ...) {\n    va_list ap;\n    void *new_address, *rc;\n    va_start(ap, flags);\n    new_address = va_arg(ap, void *);\n    rc = LSS_NAME(_mremap)(old_address, old_size, new_size,\n                           flags, new_address);\n    va_end(ap);\n    return rc;\n  }\n\n  LSS_INLINE int LSS_NAME(ptrace_detach)(pid_t pid) {\n    /* PTRACE_DETACH can sometimes forget to wake up the tracee and it\n     * then sends job control signals to the real parent, rather than to\n     * the tracer. We reduce the risk of this happening by starting a\n     * whole new time slice, and then quickly sending a SIGCONT signal\n     * right after detaching from the tracee.\n     *\n     * We use tkill to ensure that we only issue a wakeup for the thread being\n     * detached.  Large multi threaded apps can take a long time in the kernel\n     * processing SIGCONT.\n     */\n    int rc, err;\n    LSS_NAME(sched_yield)();\n    rc = LSS_NAME(ptrace)(PTRACE_DETACH, pid, (void *)0, (void *)0);\n    err = LSS_ERRNO;\n    LSS_NAME(tkill)(pid, SIGCONT);\n    /* Old systems don't have tkill */\n    if (LSS_ERRNO == ENOSYS)\n      LSS_NAME(kill)(pid, SIGCONT);\n    LSS_ERRNO = err;\n    return rc;\n  }\n\n  LSS_INLINE int LSS_NAME(raise)(int sig) {\n    return LSS_NAME(kill)(LSS_NAME(getpid)(), sig);\n  }\n\n  LSS_INLINE int LSS_NAME(setpgrp)() {\n    return LSS_NAME(setpgid)(0, 0);\n  }\n\n  LSS_INLINE int LSS_NAME(sysconf)(int name) {\n    extern int __getpagesize(void);\n    switch (name) {\n      case _SC_OPEN_MAX: {\n        struct kernel_rlimit limit;\n#if defined(__ARM_EABI__)\n        return LSS_NAME(ugetrlimit)(RLIMIT_NOFILE, &limit) < 0\n            ? 8192 : limit.rlim_cur;\n#else\n        return LSS_NAME(getrlimit)(RLIMIT_NOFILE, &limit) < 0\n            ? 8192 : limit.rlim_cur;\n#endif\n      }\n      case _SC_PAGESIZE:\n        return __getpagesize();\n      default:\n        LSS_ERRNO = ENOSYS;\n        return -1;\n    }\n  }\n  #if defined(__x86_64__) ||                                                  \\\n     (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI64)\n    LSS_INLINE _syscall4(ssize_t, pread64,        int,         f,\n                         void *,         b, size_t,   c,\n                         loff_t,         o)\n    LSS_INLINE _syscall4(ssize_t, pwrite64,       int,         f,\n                         const void *,   b, size_t,   c,\n                         loff_t,         o)\n    LSS_INLINE _syscall3(int,     readahead,      int,         f,\n                         loff_t,         o, unsigned, c)\n  #else\n    #define __NR__pread64   __NR_pread64\n    #define __NR__pwrite64  __NR_pwrite64\n    #define __NR__readahead __NR_readahead\n    LSS_INLINE _syscall5(ssize_t, _pread64,        int,         f,\n                         void *,         b, size_t, c, unsigned, o1,\n                         unsigned, o2)\n    LSS_INLINE _syscall5(ssize_t, _pwrite64,       int,         f,\n                         const void *,   b, size_t, c, unsigned, o1,\n                         long, o2)\n    LSS_INLINE _syscall4(int, _readahead,          int,         f,\n                         unsigned,       o1, unsigned, o2, size_t, c)\n    /* We force 64bit-wide parameters onto the stack, then access each\n     * 32-bit component individually. This guarantees that we build the\n     * correct parameters independent of the native byte-order of the\n     * underlying architecture.\n     */\n    LSS_INLINE ssize_t LSS_NAME(pread64)(int fd, void *buf, size_t count,\n                                         loff_t off) {\n      union { loff_t off; unsigned arg[2]; } o = { off };\n      return LSS_NAME(_pread64)(fd, buf, count, o.arg[0], o.arg[1]);\n    }\n    LSS_INLINE ssize_t LSS_NAME(pwrite64)(int fd, const void *buf,\n                                          size_t count, loff_t off) {\n      union { loff_t off; unsigned arg[2]; } o = { off };\n      return LSS_NAME(_pwrite64)(fd, buf, count, o.arg[0], o.arg[1]);\n    }\n    LSS_INLINE int LSS_NAME(readahead)(int fd, loff_t off, int len) {\n      union { loff_t off; unsigned arg[2]; } o = { off };\n      return LSS_NAME(_readahead)(fd, o.arg[0], o.arg[1], len);\n    }\n  #endif\n#endif\n\n#if defined(__cplusplus) && !defined(SYS_CPLUSPLUS)\n}\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/CHANGES.txt",
    "content": "2011-05-01 version 2.4.1:\n\n  C++\n  * Fixed the frendship problem for old compilers to make the library now gcc 3\n    compatible again.\n  * Fixed vcprojects/extract_includes.bat to extract compiler/plugin.h.\n\n  Java\n  * Removed usages of JDK 1.6 only features to make the library now JDK 1.5\n    compatible again.\n  * Fixed a bug about negative enum values.\n  * serialVersionUID is now defined in generated messages for java serializing.\n  * Fixed protoc to use java.lang.Object, which makes \"Object\" now a valid\n    message name again.\n\n  Python\n  * Experimental C++ implementation now requires C++ protobuf library installed.\n    See the README.txt in the python directory for details.\n\n2011-02-02 version 2.4.0:\n\n  General\n  * The RPC (cc|java|py)_generic_services default value is now false instead of\n    true.\n  * Custom options can have aggregate types. For example,\n      message MyOption {\n        optional string comment = 1;\n        optional string author = 2;\n      }\n      extend google.protobuf.FieldOptions {\n        optional MyOption myoption = 12345;\n      }\n    This option can now be set as follows:\n      message SomeType {\n        optional int32 field = 1 [(myoption) = { comment:'x' author:'y' }];\n      }\n\n  C++\n  * Various speed and code size optimizations.\n  * Added a release_foo() method on string and message fields.\n  * Fixed gzip_output_stream sub-stream handling.\n\n  Java\n  * Builders now maintain sub-builders for sub-messages. Use getFooBuilder() to\n    get the builder for the sub-message \"foo\". This allows you to repeatedly\n    modify deeply-nested sub-messages without rebuilding them.\n  * Builder.build() no longer invalidates the Builder for generated messages\n    (You may continue to modify it and then build another message).\n  * Code generator will generate efficient equals() and hashCode()\n    implementations if new option java_generate_equals_and_hash is enabled.\n    (Otherwise, reflection-based implementations are used.)\n  * Generated messages now implement Serializable.\n  * Fields with [deprecated=true] will be marked with @Deprecated in Java.\n  * Added lazy conversion of UTF-8 encoded strings to String objects to improve\n    performance.\n  * Various optimizations.\n  * Enum value can be accessed directly, instead of calling getNumber() on the\n    enum member.\n  * For each enum value, an integer constant is also generated with the suffix\n    _VALUE.\n\n  Python\n  * Added an experimental  C++ implementation for Python messages via a Python\n    extension. Implementation type is controlled by an environment variable\n    PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION (valid values: \"cpp\" and \"python\")\n    The default value is currently \"python\" but will be changed to \"cpp\" in\n    future release.\n  * Improved performance on message instantiation significantly.\n    Most of the work on message instantiation is done just once per message\n    class, instead of once per message instance.\n  * Improved performance on text message parsing.\n  * Allow add() to forward keyword arguments to the concrete class.\n      E.g. instead of\n        item = repeated_field.add()\n        item.foo = bar\n        item.baz = quux\n      You can do:\n        repeated_field.add(foo=bar, baz=quux)\n  * Added a sort() interface to the BaseContainer.\n  * Added an extend() method to repeated composite fields.\n  * Added UTF8 debug string support.\n\n2010-01-08 version 2.3.0:\n\n  General\n  * Parsers for repeated numeric fields now always accept both packed and\n    unpacked input.  The [packed=true] option only affects serializers.\n    Therefore, it is possible to switch a field to packed format without\n    breaking backwards-compatibility -- as long as all parties are using\n    protobuf 2.3.0 or above, at least.\n  * The generic RPC service code generated by the C++, Java, and Python\n    generators can be disabled via file options:\n      option cc_generic_services = false;\n      option java_generic_services = false;\n      option py_generic_services = false;\n    This allows plugins to generate alternative code, possibly specific to some\n    particular RPC implementation.\n\n  protoc\n  * Now supports a plugin system for code generators.  Plugins can generate\n    code for new languages or inject additional code into the output of other\n    code generators.  Plugins are just binaries which accept a protocol buffer\n    on stdin and write a protocol buffer to stdout, so they may be written in\n    any language.  See src/google/protobuf/compiler/plugin.proto.\n    **WARNING**:  Plugins are experimental.  The interface may change in a\n    future version.\n  * If the output location ends in .zip or .jar, protoc will write its output\n    to a zip/jar archive instead of a directory.  For example:\n      protoc --java_out=myproto_srcs.jar --python_out=myproto.zip myproto.proto\n    Currently the archive contents are not compressed, though this could change\n    in the future.\n  * inf, -inf, and nan can now be used as default values for float and double\n    fields.\n\n  C++\n  * Various speed and code size optimizations.\n  * DynamicMessageFactory is now fully thread-safe.\n  * Message::Utf8DebugString() method is like DebugString() but avoids escaping\n    UTF-8 bytes.\n  * Compiled-in message types can now contain dynamic extensions, through use\n    of CodedInputStream::SetExtensionRegistry().\n  * Now compiles shared libraries (DLLs) by default on Cygwin and MinGW, to\n    match other platforms.  Use --disable-shared to avoid this.\n\n  Java\n  * parseDelimitedFrom() and mergeDelimitedFrom() now detect EOF and return\n    false/null instead of throwing an exception.\n  * Fixed some initialization ordering bugs.\n  * Fixes for OpenJDK 7.\n\n  Python\n  * 10-25 times faster than 2.2.0, still pure-Python.\n  * Calling a mutating method on a sub-message always instantiates the message\n    in its parent even if the mutating method doesn't actually mutate anything\n    (e.g. parsing from an empty string).\n  * Expanded descriptors a bit.\n\n2009-08-11 version 2.2.0:\n\n  C++\n  * Lite mode:  The \"optimize_for = LITE_RUNTIME\" option causes the compiler\n    to generate code which only depends libprotobuf-lite, which is much smaller\n    than libprotobuf but lacks descriptors, reflection, and some other features.\n  * Fixed bug where Message.Swap(Message) was only implemented for\n    optimize_for_speed.  Swap now properly implemented in both modes\n    (Issue 91).\n  * Added RemoveLast and SwapElements(index1, index2) to Reflection\n    interface for repeated elements.\n  * Added Swap(Message) to Reflection interface.\n  * Floating-point literals in generated code that are intended to be\n    single-precision now explicitly have 'f' suffix to avoid pedantic warnings\n    produced by some compilers.\n  * The [deprecated=true] option now causes the C++ code generator to generate\n    a GCC-style deprecation annotation (no-op on other compilers).\n  * google::protobuf::GetEnumDescriptor<SomeGeneratedEnumType>() returns the\n    EnumDescriptor for that type -- useful for templates which cannot call\n    SomeGeneratedEnumType_descriptor().\n  * Various optimizations and obscure bug fixes.\n\n  Java\n  * Lite mode:  The \"optimize_for = LITE_RUNTIME\" option causes the compiler\n    to generate code which only depends libprotobuf-lite, which is much smaller\n    than libprotobuf but lacks descriptors, reflection, and some other features.\n  * Lots of style cleanups.\n\n  Python\n  * Fixed endianness bug with floats and doubles.\n  * Text format parsing support.\n  * Fix bug with parsing packed repeated fields in embedded messages.\n  * Ability to initialize fields by passing keyword args to constructor.\n  * Support iterators in extend and __setslice__ for containers.\n\n2009-05-13 version 2.1.0:\n\n  General\n  * Repeated fields of primitive types (types other that string, group, and\n    nested messages) may now use the option [packed = true] to get a more\n    efficient encoding.  In the new encoding, the entire list is written\n    as a single byte blob using the \"length-delimited\" wire type.  Within\n    this blob, the individual values are encoded the same way they would\n    be normally except without a tag before each value (thus, they are\n    tightly \"packed\").\n  * For each field, the generated code contains an integer constant assigned\n    to the field number.  For example, the .proto file:\n      message Foo { optional int bar_baz = 123; }\n    would generate the following constants, all with the integer value 123:\n      C++:     Foo::kBarBazFieldNumber\n      Java:    Foo.BAR_BAZ_FIELD_NUMBER\n      Python:  Foo.BAR_BAZ_FIELD_NUMBER\n    Constants are also generated for extensions, with the same naming scheme.\n    These constants may be used as switch cases.\n  * Updated bundled Google Test to version 1.3.0.  Google Test is now bundled\n    in its verbatim form as a nested autoconf package, so you can drop in any\n    other version of Google Test if needed.\n  * optimize_for = SPEED is now the default, by popular demand.  Use\n    optimize_for = CODE_SIZE if code size is more important in your app.\n  * It is now an error to define a default value for a repeated field.\n    Previously, this was silently ignored (it had no effect on the generated\n    code).\n  * Fields can now be marked deprecated like:\n      optional int32 foo = 1 [deprecated = true];\n    Currently this does not have any actual effect, but in the future the code\n    generators may generate deprecation annotations in each language.\n  * Cross-compiling should now be possible using the --with-protoc option to\n    configure.  See README.txt for more info.\n\n  protoc\n  * --error_format=msvs option causes errors to be printed in Visual Studio\n    format, which should allow them to be clicked on in the build log to go\n    directly to the error location.\n  * The type name resolver will no longer resolve type names to fields.  For\n    example, this now works:\n      message Foo {}\n      message Bar {\n        optional int32 Foo = 1;\n        optional Foo baz = 2;\n      }\n    Previously, the type of \"baz\" would resolve to \"Bar.Foo\", and you'd get\n    an error because Bar.Foo is a field, not a type.  Now the type of \"baz\"\n    resolves to the message type Foo.  This change is unlikely to make a\n    difference to anyone who follows the Protocol Buffers style guide.\n\n  C++\n  * Several optimizations, including but not limited to:\n    - Serialization, especially to flat arrays, is 10%-50% faster, possibly\n      more for small objects.\n    - Several descriptor operations which previously required locking no longer\n      do.\n    - Descriptors are now constructed lazily on first use, rather than at\n      process startup time.  This should save memory in programs which do not\n      use descriptors or reflection.\n    - UnknownFieldSet completely redesigned to be more efficient (especially in\n      terms of memory usage).\n    - Various optimizations to reduce code size (though the serialization speed\n      optimizations increased code size).\n  * Message interface has method ParseFromBoundedZeroCopyStream() which parses\n    a limited number of bytes from an input stream rather than parsing until\n    EOF.\n  * GzipInputStream and GzipOutputStream support reading/writing gzip- or\n    zlib-compressed streams if zlib is available.\n    (google/protobuf/io/gzip_stream.h)\n  * DescriptorPool::FindAllExtensions() and corresponding\n    DescriptorDatabase::FindAllExtensions() can be used to enumerate all\n    extensions of a given type.\n  * For each enum type Foo, protoc will generate functions:\n      const string& Foo_Name(Foo value);\n      bool Foo_Parse(const string& name, Foo* result);\n    The former returns the name of the enum constant corresponding to the given\n    value while the latter finds the value corresponding to a name.\n  * RepeatedField and RepeatedPtrField now have back-insertion iterators.\n  * String fields now have setters that take a char* and a size, in addition\n    to the existing ones that took char* or const string&.\n  * DescriptorPool::AllowUnknownDependencies() may be used to tell\n    DescriptorPool to create placeholder descriptors for unknown entities\n    referenced in a FileDescriptorProto.  This can allow you to parse a .proto\n    file without having access to other .proto files that it imports, for\n    example.\n  * Updated gtest to latest version.  The gtest package is now included as a\n    nested autoconf package, so it should be able to drop new versions into the\n    \"gtest\" subdirectory without modification.\n\n  Java\n  * Fixed bug where Message.mergeFrom(Message) failed to merge extensions.\n  * Message interface has new method toBuilder() which is equivalent to\n    newBuilderForType().mergeFrom(this).\n  * All enums now implement the ProtocolMessageEnum interface.\n  * Setting a field to null now throws NullPointerException.\n  * Fixed tendency for TextFormat's parsing to overflow the stack when\n    parsing large string values.  The underlying problem is with Java's\n    regex implementation (which unfortunately uses recursive backtracking\n    rather than building an NFA).  Worked around by making use of possesive\n    quantifiers.\n  * Generated service classes now also generate pure interfaces.  For a service\n    Foo, Foo.Interface is a pure interface containing all of the service's\n    defined methods.  Foo.newReflectiveService() can be called to wrap an\n    instance of this interface in a class that implements the generic\n    RpcService interface, which provides reflection support that is usually\n    needed by RPC server implementations.\n  * RPC interfaces now support blocking operation in addition to non-blocking.\n    The protocol compiler generates separate blocking and non-blocking stubs\n    which operate against separate blocking and non-blocking RPC interfaces.\n    RPC implementations will have to implement the new interfaces in order to\n    support blocking mode.\n  * New I/O methods parseDelimitedFrom(), mergeDelimitedFrom(), and\n    writeDelimitedTo() read and write \"delemited\" messages from/to a stream,\n    meaning that the message size precedes the data.  This way, you can write\n    multiple messages to a stream without having to worry about delimiting\n    them yourself.\n  * Throw a more descriptive exception when build() is double-called.\n  * Add a method to query whether CodedInputStream is at the end of the input\n    stream.\n  * Add a method to reset a CodedInputStream's size counter; useful when\n    reading many messages with the same stream.\n  * equals() and hashCode() now account for unknown fields.\n\n  Python\n  * Added slicing support for repeated scalar fields. Added slice retrieval and\n    removal of repeated composite fields.\n  * Updated RPC interfaces to allow for blocking operation.  A client may\n    now pass None for a callback when making an RPC, in which case the\n    call will block until the response is received, and the response\n    object will be returned directly to the caller.  This interface change\n    cannot be used in practice until RPC implementations are updated to\n    implement it.\n  * Changes to input_stream.py should make protobuf compatible with appengine.\n\n2008-11-25 version 2.0.3:\n\n  protoc\n  * Enum values may now have custom options, using syntax similar to field\n    options.\n  * Fixed bug where .proto files which use custom options but don't actually\n    define them (i.e. they import another .proto file defining the options)\n    had to explicitly import descriptor.proto.\n  * Adjacent string literals in .proto files will now be concatenated, like in\n    C.\n  * If an input file is a Windows absolute path (e.g. \"C:\\foo\\bar.proto\") and\n    the import path only contains \".\" (or contains \".\" but does not contain\n    the file), protoc incorrectly thought that the file was under \".\", because\n    it thought that the path was relative (since it didn't start with a slash).\n    This has been fixed.\n\n  C++\n  * Generated message classes now have a Swap() method which efficiently swaps\n    the contents of two objects.\n  * All message classes now have a SpaceUsed() method which returns an estimate\n    of the number of bytes of allocated memory currently owned by the object.\n    This is particularly useful when you are reusing a single message object\n    to improve performance but want to make sure it doesn't bloat up too large.\n  * New method Message::SerializeAsString() returns a string containing the\n    serialized data.  May be more convenient than calling\n    SerializeToString(string*).\n  * In debug mode, log error messages when string-type fields are found to\n    contain bytes that are not valid UTF-8.\n  * Fixed bug where a message with multiple extension ranges couldn't parse\n    extensions.\n  * Fixed bug where MergeFrom(const Message&) didn't do anything if invoked on\n    a message that contained no fields (but possibly contained extensions).\n  * Fixed ShortDebugString() to not be O(n^2).  Durr.\n  * Fixed crash in TextFormat parsing if the first token in the input caused a\n    tokenization error.\n  * Fixed obscure bugs in zero_copy_stream_impl.cc.\n  * Added support for HP C++ on Tru64.\n  * Only build tests on \"make check\", not \"make\".\n  * Fixed alignment issue that caused crashes when using DynamicMessage on\n    64-bit Sparc machines.\n  * Simplify template usage to work with MSVC 2003.\n  * Work around GCC 4.3.x x86_64 compiler bug that caused crashes on startup.\n    (This affected Fedora 9 in particular.)\n  * Now works on \"Solaris 10 using recent Sun Studio\".\n\n  Java\n  * New overload of mergeFrom() which parses a slice of a byte array instead\n    of the whole thing.\n  * New method ByteString.asReadOnlyByteBuffer() does what it sounds like.\n  * Improved performance of isInitialized() when optimizing for code size.\n\n  Python\n  * Corrected ListFields() signature in Message base class to match what\n    subclasses actually implement.\n  * Some minor refactoring.\n  * Don't pass self as first argument to superclass constructor (no longer\n    allowed in Python 2.6).\n\n2008-09-29 version 2.0.2:\n\n  General\n  * License changed from Apache 2.0 to New BSD.\n  * It is now possible to define custom \"options\", which are basically\n    annotations which may be placed on definitions in a .proto file.\n    For example, you might define a field option called \"foo\" like so:\n      import \"google/protobuf/descriptor.proto\"\n      extend google.protobuf.FieldOptions {\n        optional string foo = 12345;\n      }\n    Then you annotate a field using the \"foo\" option:\n      message MyMessage {\n        optional int32 some_field = 1 [(foo) = \"bar\"]\n      }\n    The value of this option is then visible via the message's\n    Descriptor:\n      const FieldDescriptor* field =\n        MyMessage::descriptor()->FindFieldByName(\"some_field\");\n      assert(field->options().GetExtension(foo) == \"bar\");\n    This feature has been implemented and tested in C++ and Java.\n    Other languages may or may not need to do extra work to support\n    custom options, depending on how they construct descriptors.\n\n  C++\n  * Fixed some GCC warnings that only occur when using -pedantic.\n  * Improved static initialization code, making ordering more\n    predictable among other things.\n  * TextFormat will no longer accept messages which contain multiple\n    instances of a singular field.  Previously, the latter instance\n    would overwrite the former.\n  * Now works on systems that don't have hash_map.\n\n  Java\n  * Print @Override annotation in generated code where appropriate.\n\n  Python\n  * Strings now use the \"unicode\" type rather than the \"str\" type.\n    String fields may still be assigned ASCII \"str\" values; they will\n    automatically be converted.\n  * Adding a property to an object representing a repeated field now\n    raises an exception.  For example:\n      # No longer works (and never should have).\n      message.some_repeated_field.foo = 1\n\n  Windows\n  * We now build static libraries rather than DLLs by default on MSVC.\n    See vsprojects/readme.txt for more information.\n\n2008-08-15 version 2.0.1:\n\n  protoc\n  * New flags --encode and --decode can be used to convert between protobuf text\n    format and binary format from the command-line.\n  * New flag --descriptor_set_out can be used to write FileDescriptorProtos for\n    all parsed files directly into a single output file.  This is particularly\n    useful if you wish to parse .proto files from programs written in languages\n    other than C++: just run protoc as a background process and have it output\n    a FileDescriptorList, then parse that natively.\n  * Improved error message when an enum value's name conflicts with another\n    symbol defined in the enum type's scope, e.g. if two enum types declared\n    in the same scope have values with the same name.  This is disallowed for\n    compatibility with C++, but this wasn't clear from the error.\n  * Fixed absolute output paths on Windows.\n  * Allow trailing slashes in --proto_path mappings.\n\n  C++\n  * Reflection objects are now per-class rather than per-instance.  To make this\n    possible, the Reflection interface had to be changed such that all methods\n    take the Message instance as a parameter.  This change improves performance\n    significantly in memory-bandwidth-limited use cases, since it makes the\n    message objects smaller.  Note that source-incompatible interface changes\n    like this will not be made again after the library leaves beta.\n  * Heuristically detect sub-messages when printing unknown fields.\n  * Fix static initialization ordering bug that caused crashes at startup when\n    compiling on Mac with static linking.\n  * Fixed TokenizerTest when compiling with -DNDEBUG on Linux.\n  * Fixed incorrect definition of kint32min.\n  * Fix bytes type setter to work with byte sequences with embedded NULLs.\n  * Other irrelevant tweaks.\n\n  Java\n  * Fixed UnknownFieldSet's parsing of varints larger than 32 bits.\n  * Fixed TextFormat's parsing of \"inf\" and \"nan\".\n  * Fixed TextFormat's parsing of comments.\n  * Added info to Java POM that will be required when we upload the\n    package to a Maven repo.\n\n  Python\n  * MergeFrom(message) and CopyFrom(message) are now implemented.\n  * SerializeToString() raises an exception if the message is missing required\n    fields.\n  * Code organization improvements.\n  * Fixed doc comments for RpcController and RpcChannel, which had somehow been\n    swapped.\n  * Fixed text_format_test on Windows where floating-point exponents sometimes\n    contain extra zeros.\n  * Fix Python service CallMethod() implementation.\n\n  Other\n  * Improved readmes.\n  * VIM syntax highlighting improvements.\n\n2008-07-07 version 2.0.0:\n\n  * First public release.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/CONTRIBUTORS.txt",
    "content": "This file contains a list of people who have made large contributions\nto the public version of Protocol Buffers.\n\nOriginal Protocol Buffers design and implementation:\n  Sanjay Ghemawat <sanjay@google.com>\n  Jeff Dean <jeff@google.com>\n  Daniel Dulitz <daniel@google.com>\n  Craig Silverstein\n  Paul Haahr <haahr@google.com>\n  Corey Anderson <corin@google.com>\n  (and many others)\n\nProto2 C++ and Java primary author:\n  Kenton Varda <kenton@google.com>\n\nProto2 Python primary authors:\n  Will Robinson <robinson@google.com>\n  Petar Petrov <petar@google.com>\n\nLarge code contributions:\n  Jason Hsueh <jasonh@google.com>\n  Joseph Schorr <jschorr@google.com>\n  Wenbo Zhu <wenboz@google.com>\n\nLarge quantity of code reviews:\n  Scott Bruce <sbruce@google.com>\n  Frank Yellin\n  Neal Norwitz <nnorwitz@google.com>\n  Jeffrey Yasskin <jyasskin@google.com>\n  Ambrose Feinstein <ambrose@google.com>\n\nDocumentation:\n  Lisa Carey <lcarey@google.com>\n\nMaven packaging:\n  Gregory Kick <gak@google.com>\n\nPatch contributors:\n  Kevin Ko <kevin.s.ko@gmail.com>\n    * Small patch to handle trailing slashes in --proto_path flag.\n  Johan Euphrosine <proppy@aminche.com>\n    * Small patch to fix Python CallMethod().\n  Ulrich Kunitz <kune@deine-taler.de>\n    * Small optimizations to Python serialization.\n  Leandro Lucarella <llucax@gmail.com>\n    * VI syntax highlighting tweaks.\n    * Fix compiler to not make output executable.\n  Dilip Joseph <dilip.antony.joseph@gmail.com>\n    * Heuristic detection of sub-messages when printing unknown fields in\n      text format.\n  Brian Atkinson <nairb774@gmail.com>\n    * Added @Override annotation to generated Java code where appropriate.\n  Vincent Choinire <Choiniere.Vincent@hydro.qc.ca>\n    * Tru64 support.\n  Monty Taylor <monty.taylor@gmail.com>\n    * Solaris 10 + Sun Studio fixes.\n  Alek Storm <alek.storm@gmail.com>\n    * Slicing support for repeated scalar fields for the Python API.\n  Oleg Smolsky <oleg.smolsky@gmail.com>\n    * MS Visual Studio error format option.\n    * Detect unordered_map in stl_hash.m4.\n  Brian Olson <brianolson@google.com>\n    * gzip/zlib I/O support.\n  Michael Poole <mdpoole@troilus.org>\n    * Fixed warnings about generated constructors not explicitly initializing\n      all fields (only present with certain compiler settings).\n    * Added generation of field number constants.\n  Wink Saville <wink@google.com>\n    * Fixed initialization ordering problem in logging code.\n  Will Pierce <willp@nuclei.com>\n    * Small patch improving performance of in Python serialization.\n  Alexandre Vassalotti <alexandre@peadrop.com>\n    * Emacs mode for Protocol Buffers (editors/protobuf-mode.el).\n  Scott Stafford <scott.stafford@gmail.com>\n    * Added Swap(), SwapElements(), and RemoveLast() to Reflection interface.\n  Alexander Melnikov <alm@sibmail.ru>\n    * HPUX support.\n  Oliver Jowett <oliver.jowett@gmail.com>\n    * Detect whether zlib is new enough in configure script.\n    * Fixes for Solaris 10 32/64-bit confusion.\n  Evan Jones <evanj@mit.edu>\n    * Optimize Java serialization code when writing a small message to a stream.\n    * Optimize Java serialization of strings so that UTF-8 encoding happens only\n      once per string per serialization call.\n    * Clean up some Java warnings.\n    * Fix bug with permanent callbacks that delete themselves when run.\n  Michael Kucharski <m.kucharski@gmail.com>\n    * Added CodedInputStream.getTotalBytesRead().\n  Kacper Kowalik <xarthisius.kk@gmail.com>\n    * Fixed m4/acx_pthread.m4 problem for some Linux distributions.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/COPYING.txt",
    "content": "Copyright 2008, Google Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n    * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nCode generated by the Protocol Buffer compiler is owned by the owner\nof the input file used when generating it.  This code is not\nstandalone and requires a support library to be linked with it.  This\nsupport library is itself covered by the above license.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/INSTALL.txt",
    "content": "This file contains detailed but generic information on building and\ninstalling the C++ part of this project.  For shorter instructions,\nas well as instructions for compiling and installing the Java or\nPython parts, see README.\n\n======================================================================\n\nCopyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software\nFoundation, Inc.\n\n   This file is free documentation; the Free Software Foundation gives\nunlimited permission to copy, distribute and modify it.\n\n\nBasic Installation\n==================\n\n   These are generic installation instructions.\n\n   The `configure' shell script attempts to guess correct values for\nvarious system-dependent variables used during compilation.  It uses\nthose values to create a `Makefile' in each directory of the package.\nIt may also create one or more `.h' files containing system-dependent\ndefinitions.  Finally, it creates a shell script `config.status' that\nyou can run in the future to recreate the current configuration, and a\nfile `config.log' containing compiler output (useful mainly for\ndebugging `configure').\n\n   It can also use an optional file (typically called `config.cache'\nand enabled with `--cache-file=config.cache' or simply `-C') that saves\nthe results of its tests to speed up reconfiguring.  (Caching is\ndisabled by default to prevent problems with accidental use of stale\ncache files.)\n\n   If you need to do unusual things to compile the package, please try\nto figure out how `configure' could check whether to do them, and mail\ndiffs or instructions to the address given in the `README' so they can\nbe considered for the next release.  If you are using the cache, and at\nsome point `config.cache' contains results you don't want to keep, you\nmay remove or edit it.\n\n   The file `configure.ac' (or `configure.in') is used to create\n`configure' by a program called `autoconf'.  You only need\n`configure.ac' if you want to change it or regenerate `configure' using\na newer version of `autoconf'.\n\nThe simplest way to compile this package is:\n\n  1. `cd' to the directory containing the package's source code and type\n     `./configure' to configure the package for your system.  If you're\n     using `csh' on an old version of System V, you might need to type\n     `sh ./configure' instead to prevent `csh' from trying to execute\n     `configure' itself.\n\n     Running `configure' takes awhile.  While running, it prints some\n     messages telling which features it is checking for.\n\n  2. Type `make' to compile the package.\n\n  3. Optionally, type `make check' to run any self-tests that come with\n     the package.\n\n  4. Type `make install' to install the programs and any data files and\n     documentation.\n\n  5. You can remove the program binaries and object files from the\n     source code directory by typing `make clean'.  To also remove the\n     files that `configure' created (so you can compile the package for\n     a different kind of computer), type `make distclean'.  There is\n     also a `make maintainer-clean' target, but that is intended mainly\n     for the package's developers.  If you use it, you may have to get\n     all sorts of other programs in order to regenerate files that came\n     with the distribution.\n\nCompilers and Options\n=====================\n\n   Some systems require unusual options for compilation or linking that\nthe `configure' script does not know about.  Run `./configure --help'\nfor details on some of the pertinent environment variables.\n\n   You can give `configure' initial values for configuration parameters\nby setting variables in the command line or in the environment.  Here\nis an example:\n\n     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix\n\n   *Note Defining Variables::, for more details.\n\nCompiling For Multiple Architectures\n====================================\n\n   You can compile the package for more than one kind of computer at the\nsame time, by placing the object files for each architecture in their\nown directory.  To do this, you must use a version of `make' that\nsupports the `VPATH' variable, such as GNU `make'.  `cd' to the\ndirectory where you want the object files and executables to go and run\nthe `configure' script.  `configure' automatically checks for the\nsource code in the directory that `configure' is in and in `..'.\n\n   If you have to use a `make' that does not support the `VPATH'\nvariable, you have to compile the package for one architecture at a\ntime in the source code directory.  After you have installed the\npackage for one architecture, use `make distclean' before reconfiguring\nfor another architecture.\n\nInstallation Names\n==================\n\n   By default, `make install' will install the package's files in\n`/usr/local/bin', `/usr/local/man', etc.  You can specify an\ninstallation prefix other than `/usr/local' by giving `configure' the\noption `--prefix=PATH'.\n\n   You can specify separate installation prefixes for\narchitecture-specific files and architecture-independent files.  If you\ngive `configure' the option `--exec-prefix=PATH', the package will use\nPATH as the prefix for installing programs and libraries.\nDocumentation and other data files will still use the regular prefix.\n\n   In addition, if you use an unusual directory layout you can give\noptions like `--bindir=PATH' to specify different values for particular\nkinds of files.  Run `configure --help' for a list of the directories\nyou can set and what kinds of files go in them.\n\n   If the package supports it, you can cause programs to be installed\nwith an extra prefix or suffix on their names by giving `configure' the\noption `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.\n\nOptional Features\n=================\n\n   Some packages pay attention to `--enable-FEATURE' options to\n`configure', where FEATURE indicates an optional part of the package.\nThey may also pay attention to `--with-PACKAGE' options, where PACKAGE\nis something like `gnu-as' or `x' (for the X Window System).  The\n`README' should mention any `--enable-' and `--with-' options that the\npackage recognizes.\n\n   For packages that use the X Window System, `configure' can usually\nfind the X include and library files automatically, but if it doesn't,\nyou can use the `configure' options `--x-includes=DIR' and\n`--x-libraries=DIR' to specify their locations.\n\nSpecifying the System Type\n==========================\n\n   There may be some features `configure' cannot figure out\nautomatically, but needs to determine by the type of machine the package\nwill run on.  Usually, assuming the package is built to be run on the\n_same_ architectures, `configure' can figure that out, but if it prints\na message saying it cannot guess the machine type, give it the\n`--build=TYPE' option.  TYPE can either be a short name for the system\ntype, such as `sun4', or a canonical name which has the form:\n\n     CPU-COMPANY-SYSTEM\n\nwhere SYSTEM can have one of these forms:\n\n     OS KERNEL-OS\n\n   See the file `config.sub' for the possible values of each field.  If\n`config.sub' isn't included in this package, then this package doesn't\nneed to know the machine type.\n\n   If you are _building_ compiler tools for cross-compiling, you should\nuse the `--target=TYPE' option to select the type of system they will\nproduce code for.\n\n   If you want to _use_ a cross compiler, that generates code for a\nplatform different from the build platform, you should specify the\n\"host\" platform (i.e., that on which the generated programs will\neventually be run) with `--host=TYPE'.\n\nSharing Defaults\n================\n\n   If you want to set default values for `configure' scripts to share,\nyou can create a site shell script called `config.site' that gives\ndefault values for variables like `CC', `cache_file', and `prefix'.\n`configure' looks for `PREFIX/share/config.site' if it exists, then\n`PREFIX/etc/config.site' if it exists.  Or, you can set the\n`CONFIG_SITE' environment variable to the location of the site script.\nA warning: not all `configure' scripts look for a site script.\n\nDefining Variables\n==================\n\n   Variables not defined in a site shell script can be set in the\nenvironment passed to `configure'.  However, some packages may run\nconfigure again during the build, and the customized values of these\nvariables may be lost.  In order to avoid this problem, you should set\nthem in the `configure' command line, using `VAR=value'.  For example:\n\n     ./configure CC=/usr/local2/bin/gcc\n\nwill cause the specified gcc to be used as the C compiler (unless it is\noverridden in the site shell script).\n\n`configure' Invocation\n======================\n\n   `configure' recognizes the following options to control how it\noperates.\n\n`--help'\n`-h'\n     Print a summary of the options to `configure', and exit.\n\n`--version'\n`-V'\n     Print the version of Autoconf used to generate the `configure'\n     script, and exit.\n\n`--cache-file=FILE'\n     Enable the cache: use and save the results of the tests in FILE,\n     traditionally `config.cache'.  FILE defaults to `/dev/null' to\n     disable caching.\n\n`--config-cache'\n`-C'\n     Alias for `--cache-file=config.cache'.\n\n`--quiet'\n`--silent'\n`-q'\n     Do not print messages saying which checks are being made.  To\n     suppress all normal output, redirect it to `/dev/null' (any error\n     messages will still be shown).\n\n`--srcdir=DIR'\n     Look for the package's source code in directory DIR.  Usually\n     `configure' can determine that directory automatically.\n\n`configure' also accepts some other, not widely useful, options.  Run\n`configure --help' for more details.\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/README.txt",
    "content": "Protocol Buffers - Google's data interchange format\nCopyright 2008 Google Inc.\nhttp://code.google.com/apis/protocolbuffers/\n\nC++ Installation - Unix\n=======================\n\nTo build and install the C++ Protocol Buffer runtime and the Protocol\nBuffer compiler (protoc) execute the following:\n\n  $ ./configure\n  $ make\n  $ make check\n  $ make install\n\nIf \"make check\" fails, you can still install, but it is likely that\nsome features of this library will not work correctly on your system.\nProceed at your own risk.\n\n\"make install\" may require superuser privileges.\n\nFor advanced usage information on configure and make, see INSTALL.txt.\n\n** Hint on install location **\n\n  By default, the package will be installed to /usr/local.  However,\n  on many platforms, /usr/local/lib is not part of LD_LIBRARY_PATH.\n  You can add it, but it may be easier to just install to /usr\n  instead.  To do this, invoke configure as follows:\n\n    ./configure --prefix=/usr\n\n  If you already built the package with a different prefix, make sure\n  to run \"make clean\" before building again.\n\n** Compiling dependent packages **\n\n  To compile a package that uses Protocol Buffers, you need to pass\n  various flags to your compiler and linker.  As of version 2.2.0,\n  Protocol Buffers integrates with pkg-config to manage this.  If you\n  have pkg-config installed, then you can invoke it to get a list of\n  flags like so:\n\n    pkg-config --cflags protobuf         # print compiler flags\n    pkg-config --libs protobuf           # print linker flags\n    pkg-config --cflags --libs protobuf  # print both\n\n  For example:\n\n    c++ my_program.cc my_proto.pb.cc `pkg-config --cflags --libs protobuf`\n\n  Note that packages written prior to the 2.2.0 release of Protocol\n  Buffers may not yet integrate with pkg-config to get flags, and may\n  not pass the correct set of flags to correctly link against\n  libprotobuf.  If the package in question uses autoconf, you can\n  often fix the problem by invoking its configure script like:\n\n    configure CXXFLAGS=\"$(pkg-config --cflags protobuf)\" \\\n              LIBS=\"$(pkg-config --libs protobuf)\"\n\n  This will force it to use the correct flags.\n\n  If you are writing an autoconf-based package that uses Protocol\n  Buffers, you should probably use the PKG_CHECK_MODULES macro in your\n  configure script like:\n\n    PKG_CHECK_MODULES([protobuf], [protobuf])\n\n  See the pkg-config man page for more info.\n\n  If you only want protobuf-lite, substitute \"protobuf-lite\" in place\n  of \"protobuf\" in these examples.\n\n** Note for cross-compiling **\n\n  The makefiles normally invoke the protoc executable that they just\n  built in order to build tests.  When cross-compiling, the protoc\n  executable may not be executable on the host machine.  In this case,\n  you must build a copy of protoc for the host machine first, then use\n  the --with-protoc option to tell configure to use it instead.  For\n  example:\n\n    ./configure --with-protoc=protoc\n\n  This will use the installed protoc (found in your $PATH) instead of\n  trying to execute the one built during the build process.  You can\n  also use an executable that hasn't been installed.  For example, if\n  you built the protobuf package for your host machine in ../host,\n  you might do:\n\n    ./configure --with-protoc=../host/src/protoc\n\n  Either way, you must make sure that the protoc executable you use\n  has the same version as the protobuf source code you are trying to\n  use it with.\n\n** Note for Solaris users **\n\n  Solaris 10 x86 has a bug that will make linking fail, complaining\n  about libstdc++.la being invalid.  We have included a work-around\n  in this package.  To use the work-around, run configure as follows:\n\n    ./configure LDFLAGS=-L$PWD/src/solaris\n\n  See src/solaris/libstdc++.la for more info on this bug.\n\n** Note for HP C++ Tru64 users **\n\n  To compile invoke configure as follows:\n\n    ./configure CXXFLAGS=\"-O -std ansi -ieee -D__USE_STD_IOSTREAM\"\n\n  Also, you will need to use gmake instead of make.\n\nC++ Installation - Windows\n==========================\n\nIf you are using Micosoft Visual C++, see vsprojects/readme.txt.\n\nIf you are using Cygwin or MinGW, follow the Unix installation\ninstructions, above.\n\nBinary Compatibility Warning\n============================\n\nDue to the nature of C++, it is unlikely that any two versions of the\nProtocol Buffers C++ runtime libraries will have compatible ABIs.\nThat is, if you linked an executable against an older version of\nlibprotobuf, it is unlikely to work with a newer version without\nre-compiling.  This problem, when it occurs, will normally be detected\nimmediately on startup of your app.  Still, you may want to consider\nusing static linkage.  You can configure this package to install\nstatic libraries only using:\n\n  ./configure --disable-shared\n\nJava and Python Installation\n============================\n\nThe Java and Python runtime libraries for Protocol Buffers are located\nin the java and python directories.  See the README file in each\ndirectory for more information on how to compile and install them.\nNote that both of them require you to first install the Protocol\nBuffer compiler (protoc), which is part of the C++ package.\n\nUsage\n=====\n\nThe complete documentation for Protocol Buffers is available via the\nweb at:\n\n  http://code.google.com/apis/protocolbuffers/\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/autogen.sh",
    "content": "#!/bin/sh\n\n# Run this script to generate the configure script and other files that will\n# be included in the distribution.  These files are not checked in because they\n# are automatically generated.\n\nset -e\n\n# Check that we're being run from the right directory.\nif test ! -f src/google/protobuf/stubs/common.h; then\n  cat >&2 << __EOF__\nCould not find source code.  Make sure you are running this script from the\nroot of the distribution tree.\n__EOF__\n  exit 1\nfi\n\n# Check that gtest is present.  Usually it is already there since the\n# directory is set up as an SVN external.\nif test ! -e gtest; then\n  echo \"Google Test not present.  Fetching gtest-1.5.0 from the web...\"\n  curl http://googletest.googlecode.com/files/gtest-1.5.0.tar.bz2 | tar jx\n  mv gtest-1.5.0 gtest\nfi\n\nset -ex\n\n# Temporary hack:  Must change C runtime library to \"multi-threaded DLL\",\n#   otherwise it will be set to \"multi-threaded static\" when MSVC upgrades\n#   the project file to MSVC 2005/2008.  vladl of Google Test says gtest will\n#   probably change their default to match, then this will be unnecessary.\n#   One of these mappings converts the debug configuration and the other\n#   converts the release configuration.  I don't know which is which.\nsed -i -e 's/RuntimeLibrary=\"5\"/RuntimeLibrary=\"3\"/g;\n           s/RuntimeLibrary=\"4\"/RuntimeLibrary=\"2\"/g;' gtest/msvc/*.vcproj\n\n# TODO(kenton):  Remove the \",no-obsolete\" part and fix the resulting warnings.\nautoreconf -f -i -Wall,no-obsolete\n\nrm -rf autom4te.cache config.h.in~\nexit 0\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/ProtoBench.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2009 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protocolbuffers;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.RandomAccessFile;\nimport java.lang.reflect.Method;\n\nimport com.google.protobuf.ByteString;\nimport com.google.protobuf.CodedInputStream;\nimport com.google.protobuf.CodedOutputStream;\nimport com.google.protobuf.Message;\n\npublic class ProtoBench {\n  \n  private static final long MIN_SAMPLE_TIME_MS = 2 * 1000;\n  private static final long TARGET_TIME_MS = 30 * 1000;\n\n  private ProtoBench() {\n    // Prevent instantiation\n  }\n  \n  public static void main(String[] args) {\n    if (args.length < 2 || (args.length % 2) != 0) {\n      System.err.println(\"Usage: ProtoBench <descriptor type name> <input data>\");\n      System.err.println(\"The descriptor type name is the fully-qualified message name,\");\n      System.err.println(\"e.g. com.google.protocolbuffers.benchmark.Message1\");\n      System.err.println(\"(You can specify multiple pairs of descriptor type name and input data.)\");\n      System.exit(1);\n    }\n    boolean success = true;\n    for (int i = 0; i < args.length; i += 2) {\n      success &= runTest(args[i], args[i + 1]);\n    }\n    System.exit(success ? 0 : 1);\n  }\n\n  /**\n   * Runs a single test. Error messages are displayed to stderr, and the return value\n   * indicates general success/failure.\n   */\n  public static boolean runTest(String type, String file) {\n    System.out.println(\"Benchmarking \" + type + \" with file \" + file);\n    final Message defaultMessage;\n    try {\n      Class<?> clazz = Class.forName(type);\n      Method method = clazz.getDeclaredMethod(\"getDefaultInstance\");\n      defaultMessage = (Message) method.invoke(null);\n    } catch (Exception e) {\n      // We want to do the same thing with all exceptions. Not generally nice,\n      // but this is slightly different.\n      System.err.println(\"Unable to get default message for \" + type);\n      return false;\n    }\n    \n    try {\n      final byte[] inputData = readAllBytes(file);\n      final ByteArrayInputStream inputStream = new ByteArrayInputStream(inputData);\n      final ByteString inputString = ByteString.copyFrom(inputData);\n      final Message sampleMessage = defaultMessage.newBuilderForType().mergeFrom(inputString).build();\n      FileOutputStream devNullTemp = null;\n      CodedOutputStream reuseDevNullTemp = null;\n      try {\n        devNullTemp = new FileOutputStream(\"/dev/null\");\n        reuseDevNullTemp = CodedOutputStream.newInstance(devNullTemp);\n      } catch (FileNotFoundException e) {\n        // ignore: this is probably Windows, where /dev/null does not exist\n      }\n      final FileOutputStream devNull = devNullTemp;\n      final CodedOutputStream reuseDevNull = reuseDevNullTemp;\n      benchmark(\"Serialize to byte string\", inputData.length, new Action() {\n        public void execute() { sampleMessage.toByteString(); }\n      });      \n      benchmark(\"Serialize to byte array\", inputData.length, new Action() {\n        public void execute() { sampleMessage.toByteArray(); }\n      });\n      benchmark(\"Serialize to memory stream\", inputData.length, new Action() {\n        public void execute() throws IOException { \n          sampleMessage.writeTo(new ByteArrayOutputStream()); \n        }\n      });\n      if (devNull != null) {\n        benchmark(\"Serialize to /dev/null with FileOutputStream\", inputData.length, new Action() {\n          public void execute() throws IOException {\n            sampleMessage.writeTo(devNull);\n          }\n        });\n        benchmark(\"Serialize to /dev/null reusing FileOutputStream\", inputData.length, new Action() {\n          public void execute() throws IOException {\n            sampleMessage.writeTo(reuseDevNull);\n            reuseDevNull.flush();  // force the write to the OutputStream\n          }\n        });\n      }\n      benchmark(\"Deserialize from byte string\", inputData.length, new Action() {\n        public void execute() throws IOException { \n          defaultMessage.newBuilderForType().mergeFrom(inputString).build();\n        }\n      });\n      benchmark(\"Deserialize from byte array\", inputData.length, new Action() {\n        public void execute() throws IOException { \n          defaultMessage.newBuilderForType()\n            .mergeFrom(CodedInputStream.newInstance(inputData)).build();\n        }\n      });\n      benchmark(\"Deserialize from memory stream\", inputData.length, new Action() {\n        public void execute() throws IOException { \n          defaultMessage.newBuilderForType()\n            .mergeFrom(CodedInputStream.newInstance(inputStream)).build();\n          inputStream.reset();\n        }\n      });\n      System.out.println();\n      return true;\n    } catch (Exception e) {\n      System.err.println(\"Error: \" + e.getMessage());\n      System.err.println(\"Detailed exception information:\");\n      e.printStackTrace(System.err);\n      return false;\n    }\n  }\n  \n  private static void benchmark(String name, long dataSize, Action action) throws IOException {\n    // Make sure it's JITted \"reasonably\" hard before running the first progress test\n    for (int i=0; i < 100; i++) {\n      action.execute();\n    }\n    \n    // Run it progressively more times until we've got a reasonable sample\n    int iterations = 1;\n    long elapsed = timeAction(action, iterations);\n    while (elapsed < MIN_SAMPLE_TIME_MS) {\n      iterations *= 2;\n      elapsed = timeAction(action, iterations);\n    }\n    \n    // Upscale the sample to the target time. Do this in floating point arithmetic\n    // to avoid overflow issues.\n    iterations = (int) ((TARGET_TIME_MS / (double) elapsed) * iterations);\n    elapsed = timeAction(action, iterations);\n    System.out.println(name + \": \" + iterations + \" iterations in \"\n         + (elapsed/1000f) + \"s; \" \n         + (iterations * dataSize) / (elapsed * 1024 * 1024 / 1000f) \n         + \"MB/s\");\n  }\n  \n  private static long timeAction(Action action, int iterations) throws IOException {\n    System.gc();    \n    long start = System.currentTimeMillis();\n    for (int i = 0; i < iterations; i++) {\n      action.execute();\n    }\n    long end = System.currentTimeMillis();\n    return end - start;\n  }\n  \n  private static byte[] readAllBytes(String filename) throws IOException {\n    RandomAccessFile file = new RandomAccessFile(new File(filename), \"r\");\n    byte[] content = new byte[(int) file.length()];\n    file.readFully(content);\n    return content;\n  }\n\n  /**\n   * Interface used to capture a single action to benchmark.\n   */\n  interface Action {\n    void execute() throws IOException;\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_size.proto",
    "content": "package benchmarks;\n\noption java_outer_classname = \"GoogleSize\";\noption optimize_for = CODE_SIZE;\n\nmessage SizeMessage1 {\n  required string field1 = 1;\n  optional string field9 = 9;\n  optional string field18 = 18;\n  optional bool field80 = 80 [default=false];\n  optional bool field81 = 81 [default=true];\n  required int32 field2 = 2;\n  required int32 field3 = 3;\n  optional int32 field280 = 280;\n  optional int32 field6 = 6 [default=0];\n  optional int64 field22 = 22;\n  optional string field4 = 4;\n  repeated fixed64 field5 = 5;\n  optional bool field59 = 59 [default=false];\n  optional string field7 = 7;\n  optional int32 field16 = 16;\n  optional int32 field130 = 130 [default=0];\n  optional bool field12 = 12 [default=true];\n  optional bool field17 = 17 [default=true];\n  optional bool field13 = 13 [default=true];\n  optional bool field14 = 14 [default=true];\n  optional int32 field104 = 104 [default=0];\n  optional int32 field100 = 100 [default=0];\n  optional int32 field101 = 101 [default=0];\n  optional string field102 = 102;\n  optional string field103 = 103;\n  optional int32 field29 = 29 [default=0];\n  optional bool field30 = 30 [default=false];\n  optional int32 field60 = 60 [default=-1];\n  optional int32 field271 = 271 [default=-1];\n  optional int32 field272 = 272 [default=-1];\n  optional int32 field150 = 150;\n  optional int32 field23 = 23 [default=0];\n  optional bool field24 = 24 [default=false];\n  optional int32 field25 = 25 [default=0];\n  optional SizeMessage1SubMessage field15 = 15;\n  optional bool field78 = 78;\n  optional int32 field67 = 67 [default=0];\n  optional int32 field68 = 68;\n  optional int32 field128 = 128 [default=0];\n  optional string field129 = 129 [default=\"xxxxxxxxxxxxxxxxxxxxx\"];\n  optional int32 field131 = 131 [default=0];\n}\n\nmessage SizeMessage1SubMessage {\n  optional int32 field1 = 1 [default=0];\n  optional int32 field2 = 2 [default=0];\n  optional int32 field3 = 3 [default=0];\n  optional string field15 = 15;\n  optional bool field12 = 12 [default=true];\n  optional int64 field13 = 13;\n  optional int64 field14 = 14;\n  optional int32 field16 = 16;\n  optional int32 field19 = 19 [default=2];\n  optional bool field20  = 20 [default=true];\n  optional bool field28 = 28 [default=true];\n  optional fixed64 field21 = 21;\n  optional int32 field22 = 22;\n  optional bool field23 = 23 [ default=false ];\n  optional bool field206 = 206 [default=false];\n  optional fixed32 field203 = 203;\n  optional int32 field204 = 204;\n  optional string field205 = 205;\n  optional uint64 field207 = 207;\n  optional uint64 field300 = 300;\n}\n\nmessage SizeMessage2 {\n  optional string field1 = 1;\n  optional int64 field3 = 3;\n  optional int64 field4 = 4;\n  optional int64 field30 = 30;\n  optional bool field75  = 75 [default=false];\n  optional string field6 = 6;\n  optional bytes field2 = 2;\n  optional int32 field21 = 21 [default=0];\n  optional int32 field71 = 71;\n  optional float field25 = 25;\n  optional int32 field109 = 109 [default=0];\n  optional int32 field210 = 210 [default=0];\n  optional int32 field211 = 211 [default=0];\n  optional int32 field212 = 212 [default=0];\n  optional int32 field213 = 213 [default=0];\n  optional int32 field216 = 216 [default=0];\n  optional int32 field217 = 217 [default=0];\n  optional int32 field218 = 218 [default=0];\n  optional int32 field220 = 220 [default=0];\n  optional int32 field221 = 221 [default=0];\n  optional float field222 = 222 [default=0.0];\n  optional int32 field63 = 63;\n\n  repeated group Group1 = 10 {\n    required float field11 = 11;\n    optional float field26 = 26;\n    optional string field12 = 12;\n    optional string field13 = 13;\n    repeated string field14 = 14;\n    required uint64 field15 = 15;\n    optional int32 field5 = 5;\n    optional string field27 = 27;\n    optional int32 field28 = 28;\n    optional string field29 = 29;\n    optional string field16 = 16;\n    repeated string field22 = 22;\n    repeated int32 field73 = 73;\n    optional int32 field20 = 20 [default=0];\n    optional string field24 = 24;\n    optional SizeMessage2GroupedMessage field31 = 31;\n  }\n  repeated string field128 = 128;\n  optional int64 field131 = 131;\n  repeated string field127 = 127;\n  optional int32 field129 = 129;\n  repeated int64 field130 = 130;\n  optional bool field205 = 205 [default=false];\n  optional bool field206 = 206 [default=false];\n}\n\nmessage SizeMessage2GroupedMessage {\n  optional float field1 = 1;\n  optional float field2 = 2;\n  optional float field3 = 3 [default=0.0];\n  optional bool field4 = 4;\n  optional bool field5 = 5;\n  optional bool field6 = 6 [default=true];\n  optional bool field7 = 7 [default=false];\n  optional float field8 = 8;\n  optional bool field9 = 9;\n  optional float field10 = 10;\n  optional int64 field11 = 11;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_speed.proto",
    "content": "package benchmarks;\n\noption java_outer_classname = \"GoogleSpeed\";\noption optimize_for = SPEED;\n\nmessage SpeedMessage1 {\n  required string field1 = 1;\n  optional string field9 = 9;\n  optional string field18 = 18;\n  optional bool field80 = 80 [default=false];\n  optional bool field81 = 81 [default=true];\n  required int32 field2 = 2;\n  required int32 field3 = 3;\n  optional int32 field280 = 280;\n  optional int32 field6 = 6 [default=0];\n  optional int64 field22 = 22;\n  optional string field4 = 4;\n  repeated fixed64 field5 = 5;\n  optional bool field59 = 59 [default=false];\n  optional string field7 = 7;\n  optional int32 field16 = 16;\n  optional int32 field130 = 130 [default=0];\n  optional bool field12 = 12 [default=true];\n  optional bool field17 = 17 [default=true];\n  optional bool field13 = 13 [default=true];\n  optional bool field14 = 14 [default=true];\n  optional int32 field104 = 104 [default=0];\n  optional int32 field100 = 100 [default=0];\n  optional int32 field101 = 101 [default=0];\n  optional string field102 = 102;\n  optional string field103 = 103;\n  optional int32 field29 = 29 [default=0];\n  optional bool field30 = 30 [default=false];\n  optional int32 field60 = 60 [default=-1];\n  optional int32 field271 = 271 [default=-1];\n  optional int32 field272 = 272 [default=-1];\n  optional int32 field150 = 150;\n  optional int32 field23 = 23 [default=0];\n  optional bool field24 = 24 [default=false];\n  optional int32 field25 = 25 [default=0];\n  optional SpeedMessage1SubMessage field15 = 15;\n  optional bool field78 = 78;\n  optional int32 field67 = 67 [default=0];\n  optional int32 field68 = 68;\n  optional int32 field128 = 128 [default=0];\n  optional string field129 = 129 [default=\"xxxxxxxxxxxxxxxxxxxxx\"];\n  optional int32 field131 = 131 [default=0];\n}\n\nmessage SpeedMessage1SubMessage {\n  optional int32 field1 = 1 [default=0];\n  optional int32 field2 = 2 [default=0];\n  optional int32 field3 = 3 [default=0];\n  optional string field15 = 15;\n  optional bool field12 = 12 [default=true];\n  optional int64 field13 = 13;\n  optional int64 field14 = 14;\n  optional int32 field16 = 16;\n  optional int32 field19 = 19 [default=2];\n  optional bool field20  = 20 [default=true];\n  optional bool field28 = 28 [default=true];\n  optional fixed64 field21 = 21;\n  optional int32 field22 = 22;\n  optional bool field23 = 23 [ default=false ];\n  optional bool field206 = 206 [default=false];\n  optional fixed32 field203 = 203;\n  optional int32 field204 = 204;\n  optional string field205 = 205;\n  optional uint64 field207 = 207;\n  optional uint64 field300 = 300;\n}\n\nmessage SpeedMessage2 {\n  optional string field1 = 1;\n  optional int64 field3 = 3;\n  optional int64 field4 = 4;\n  optional int64 field30 = 30;\n  optional bool field75  = 75 [default=false];\n  optional string field6 = 6;\n  optional bytes field2 = 2;\n  optional int32 field21 = 21 [default=0];\n  optional int32 field71 = 71;\n  optional float field25 = 25;\n  optional int32 field109 = 109 [default=0];\n  optional int32 field210 = 210 [default=0];\n  optional int32 field211 = 211 [default=0];\n  optional int32 field212 = 212 [default=0];\n  optional int32 field213 = 213 [default=0];\n  optional int32 field216 = 216 [default=0];\n  optional int32 field217 = 217 [default=0];\n  optional int32 field218 = 218 [default=0];\n  optional int32 field220 = 220 [default=0];\n  optional int32 field221 = 221 [default=0];\n  optional float field222 = 222 [default=0.0];\n  optional int32 field63 = 63;\n\n  repeated group Group1 = 10 {\n    required float field11 = 11;\n    optional float field26 = 26;\n    optional string field12 = 12;\n    optional string field13 = 13;\n    repeated string field14 = 14;\n    required uint64 field15 = 15;\n    optional int32 field5 = 5;\n    optional string field27 = 27;\n    optional int32 field28 = 28;\n    optional string field29 = 29;\n    optional string field16 = 16;\n    repeated string field22 = 22;\n    repeated int32 field73 = 73;\n    optional int32 field20 = 20 [default=0];\n    optional string field24 = 24;\n    optional SpeedMessage2GroupedMessage field31 = 31;\n  }\n  repeated string field128 = 128;\n  optional int64 field131 = 131;\n  repeated string field127 = 127;\n  optional int32 field129 = 129;\n  repeated int64 field130 = 130;\n  optional bool field205 = 205 [default=false];\n  optional bool field206 = 206 [default=false];\n}\n\nmessage SpeedMessage2GroupedMessage {\n  optional float field1 = 1;\n  optional float field2 = 2;\n  optional float field3 = 3 [default=0.0];\n  optional bool field4 = 4;\n  optional bool field5 = 5;\n  optional bool field6 = 6 [default=true];\n  optional bool field7 = 7 [default=false];\n  optional float field8 = 8;\n  optional bool field9 = 9;\n  optional float field10 = 10;\n  optional int64 field11 = 11;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/readme.txt",
    "content": "Contents\n--------\n\nThis folder contains three kinds of file:\n\n- Code, such as ProtoBench.java, to build the benchmarking framework.\n- Protocol buffer definitions (.proto files)\n- Sample data files\n\nIf we end up with a lot of different benchmarks it may be worth\nseparating these out info different directories, but while there are\nso few they might as well all be together.\n\nRunning a benchmark (Java)\n--------------------------\n\n1) Build protoc and the Java protocol buffer library. The examples\n   below assume a jar file (protobuf.jar) has been built and copied\n   into this directory.\n\n2) Build ProtoBench:\n   $ javac -d tmp -cp protobuf.jar ProtoBench.java\n   \n3) Generate code for the relevant benchmark protocol buffer, e.g.\n   $ protoc --java_out=tmp google_size.proto google_speed.proto\n   \n4) Build the generated code, e.g.\n   $ cd tmp\n   $ javac -d . -cp ../protobuf.jar benchmarks/*.java\n           \n5) Run the test. Arguments are given in pairs - the first argument\n   is the descriptor type; the second is the filename. For example:\n   $ java -cp .;../protobuf.jar com.google.protocolbuffers.ProtoBench\n          benchmarks.GoogleSize$SizeMessage1 ../google_message1.dat\n          benchmarks.GoogleSpeed$SpeedMessage1 ../google_message1.dat\n          benchmarks.GoogleSize$SizeMessage2 ../google_message2.dat\n          benchmarks.GoogleSpeed$SpeedMessage2 ../google_message2.dat\n          \n6) Wait! Each test runs for around 30 seconds, and there are 6 tests\n   per class/data combination. The above command would therefore take\n   about 12 minutes to run.\n\n   \nBenchmarks available\n--------------------\n\nFrom Google:\ngoogle_size.proto and google_speed.proto, messages\ngoogle_message1.dat and google_message2.dat. The proto files are\nequivalent, but optimized differently.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/configure.ac",
    "content": "## Process this file with autoconf to produce configure.\n## In general, the safest way to proceed is to run ./autogen.sh\n\nAC_PREREQ(2.59)\n\n# Note:  If you change the version, you must also update it in:\n# * java/pom.xml\n# * python/setup.py\n# * src/google/protobuf/stubs/common.h\n# * src/Makefile.am (Update -version-info for LDFLAGS if needed)\n#\n# In the SVN trunk, the version should always be the next anticipated release\n# version with the \"-pre\" suffix.  (We used to use \"-SNAPSHOT\" but this pushed\n# the size of one file name in the dist tarfile over the 99-char limit.)\nAC_INIT([Protocol Buffers],[2.4.2-pre],[protobuf@googlegroups.com],[protobuf])\n\n\nAC_CONFIG_SRCDIR(src/google/protobuf/message.cc)\nAC_CONFIG_HEADERS([config.h])\nAC_CONFIG_MACRO_DIR([m4])\n\n# autoconf's default CXXFLAGS are usually \"-g -O2\".  These aren't necessarily\n# the best choice for libprotobuf.\nAS_IF([test \"x${ac_cv_env_CFLAGS_set}\" = \"x\"],\n      [CFLAGS=\"\"])\nAS_IF([test \"x${ac_cv_env_CXXFLAGS_set}\" = \"x\"],\n      [CXXFLAGS=\"\"])\n\nAC_CANONICAL_TARGET\n\nAM_INIT_AUTOMAKE\n\nAC_ARG_WITH([zlib],\n  [AS_HELP_STRING([--with-zlib],\n    [include classes for streaming compressed data in and out @<:@default=check@:>@])],\n  [],[with_zlib=check])\n\nAC_ARG_WITH([protoc],\n  [AS_HELP_STRING([--with-protoc=COMMAND],\n    [use the given protoc command instead of building a new one when building tests (useful for cross-compiling)])],\n  [],[with_protoc=no])\n\n# Checks for programs.\nAC_PROG_CC\nAC_PROG_CXX\nAC_LANG([C++])\nACX_USE_SYSTEM_EXTENSIONS\nAM_CONDITIONAL(GCC, test \"$GCC\" = yes)   # let the Makefile know if we're gcc\n\n# test_util.cc takes forever to compile with GCC and optimization turned on.\nAC_MSG_CHECKING([C++ compiler flags...])\nAS_IF([test \"x${ac_cv_env_CXXFLAGS_set}\" = \"x\"],[\n  AS_IF([test \"$GCC\" = \"yes\"],[\n    PROTOBUF_OPT_FLAG=\"-O2\"\n    CXXFLAGS=\"${CXXFLAGS} -g\"\n  ])\n\n  # Protocol Buffers contains several checks that are intended to be used only\n  # for debugging and which might hurt performance.  Most users are probably\n  # end users who don't want these checks, so add -DNDEBUG by default.\n  CXXFLAGS=\"$CXXFLAGS -DNDEBUG\"\n\n  AC_MSG_RESULT([use default: $PROTOBUF_OPT_FLAG $CXXFLAGS])\n],[\n  AC_MSG_RESULT([use user-supplied: $CXXFLAGS])\n])\n\nAC_SUBST(PROTOBUF_OPT_FLAG)\n\nACX_CHECK_SUNCC\n\n# Have to do libtool after SUNCC, other wise it \"helpfully\" adds Crun Cstd\n# to the link\nAC_PROG_LIBTOOL\n\n# Checks for header files.\nAC_HEADER_STDC\nAC_CHECK_HEADERS([fcntl.h inttypes.h limits.h stdlib.h unistd.h])\n\n# Checks for library functions.\nAC_FUNC_MEMCMP\nAC_FUNC_STRTOD\nAC_CHECK_FUNCS([ftruncate memset mkdir strchr strerror strtol])\n\n# Check for zlib.\nHAVE_ZLIB=0\nAS_IF([test \"$with_zlib\" != no], [\n  AC_MSG_CHECKING([zlib version])\n\n  # First check the zlib header version.\n  AC_COMPILE_IFELSE(\n    AC_LANG_PROGRAM([[\n        #include <zlib.h>\n        #if !defined(ZLIB_VERNUM) || (ZLIB_VERNUM < 0x1204)\n        # error zlib version too old\n        #endif\n        ]], []), [\n    AC_MSG_RESULT([ok (1.2.0.4 or later)])\n\n    # Also need to add -lz to the linker flags and make sure this succeeds.\n    AC_SEARCH_LIBS([zlibVersion], [z], [\n      AC_DEFINE([HAVE_ZLIB], [1], [Enable classes using zlib compression.])\n      HAVE_ZLIB=1\n    ], [\n      AS_IF([test \"$with_zlib\" != check], [\n        AC_MSG_FAILURE([--with-zlib was given, but no working zlib library was found])\n      ])\n    ])\n  ], [\n    AS_IF([test \"$with_zlib\" = check], [\n      AC_MSG_RESULT([headers missing or too old (requires 1.2.0.4)])\n    ], [\n      AC_MSG_FAILURE([--with-zlib was given, but zlib headers were not present or were too old (requires 1.2.0.4)])\n    ])\n  ])\n])\nAM_CONDITIONAL([HAVE_ZLIB], [test $HAVE_ZLIB = 1])\n\nAS_IF([test \"$with_protoc\" != \"no\"], [\n  PROTOC=$with_protoc\n  AS_IF([test \"$with_protoc\" = \"yes\"], [\n    # No argument given.  Use system protoc.\n    PROTOC=protoc\n  ])\n  AS_IF([echo \"$PROTOC\" | grep -q '^@<:@^/@:>@.*/'], [\n    # Does not start with a slash, but contains a slash.  So, it's a relative\n    # path (as opposed to an absolute path or an executable in $PATH).\n    # Since it will actually be executed from the src directory, prefix with\n    # the current directory.  We also insert $ac_top_build_prefix in case this\n    # is a nested package and --with-protoc was actually given on the outer\n    # package's configure script.\n    PROTOC=`pwd`/${ac_top_build_prefix}$PROTOC\n  ])\n  AC_SUBST([PROTOC])\n])\nAM_CONDITIONAL([USE_EXTERNAL_PROTOC], [test \"$with_protoc\" != \"no\"])\n\nACX_PTHREAD\nAC_CXX_STL_HASH\n\n# HACK:  Make gtest's configure script pick up our copy of CFLAGS and CXXFLAGS,\n#   since the flags added by ACX_CHECK_SUNCC must be used when compiling gtest\n#   too.\nexport CFLAGS\nexport CXXFLAGS\nAC_CONFIG_SUBDIRS([gtest])\n\nAC_CONFIG_FILES([Makefile src/Makefile protobuf.pc protobuf-lite.pc])\nAC_OUTPUT\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/editors/README.txt",
    "content": "This directory contains syntax highlighting and configuration files for editors\nto properly display Protocol Buffer files.\n\nSee each file's header comment for directions on how to use it with the\nappropriate editor.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/editors/proto.vim",
    "content": "\" Protocol Buffers - Google's data interchange format\n\" Copyright 2008 Google Inc.  All rights reserved.\n\" http://code.google.com/p/protobuf/\n\"\n\" Redistribution and use in source and binary forms, with or without\n\" modification, are permitted provided that the following conditions are\n\" met:\n\"\n\"     * Redistributions of source code must retain the above copyright\n\" notice, this list of conditions and the following disclaimer.\n\"     * Redistributions in binary form must reproduce the above\n\" copyright notice, this list of conditions and the following disclaimer\n\" in the documentation and/or other materials provided with the\n\" distribution.\n\"     * Neither the name of Google Inc. nor the names of its\n\" contributors may be used to endorse or promote products derived from\n\" this software without specific prior written permission.\n\"\n\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\" \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n\" A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n\" OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\" OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\" This is the Vim syntax file for Google Protocol Buffers.\n\"\n\" Usage:\n\"\n\" 1. cp proto.vim ~/.vim/syntax/\n\" 2. Add the following to ~/.vimrc:\n\"\n\" augroup filetype\n\"   au! BufRead,BufNewFile *.proto setfiletype proto\n\" augroup end\n\"\n\" Or just create a new file called ~/.vim/ftdetect/proto.vim with the\n\" previous lines on it.\n\nif version < 600\n  syntax clear\nelseif exists(\"b:current_syntax\")\n  finish\nendif\n\nsyn case match\n\nsyn keyword pbTodo       contained TODO FIXME XXX\nsyn cluster pbCommentGrp contains=pbTodo\n\nsyn keyword pbSyntax     syntax import option\nsyn keyword pbStructure  package message group\nsyn keyword pbRepeat     optional required repeated\nsyn keyword pbDefault    default\nsyn keyword pbExtend     extend extensions to max\nsyn keyword pbRPC        service rpc returns\n\nsyn keyword pbType      int32 int64 uint32 uint64 sint32 sint64\nsyn keyword pbType      fixed32 fixed64 sfixed32 sfixed64\nsyn keyword pbType      float double bool string bytes\nsyn keyword pbTypedef   enum\nsyn keyword pbBool      true false\n\nsyn match   pbInt     /-\\?\\<\\d\\+\\>/\nsyn match   pbInt     /\\<0[xX]\\x+\\>/\nsyn match   pbFloat   /\\<-\\?\\d*\\(\\.\\d*\\)\\?/\nsyn region  pbComment start=\"\\/\\*\" end=\"\\*\\/\" contains=@pbCommentGrp\nsyn region  pbComment start=\"//\" skip=\"\\\\$\" end=\"$\" keepend contains=@pbCommentGrp\nsyn region  pbString  start=/\"/ skip=/\\\\\"/ end=/\"/\nsyn region  pbString  start=/'/ skip=/\\\\'/ end=/'/\n\nif version >= 508 || !exists(\"did_proto_syn_inits\")\n  if version < 508\n    let did_proto_syn_inits = 1\n    command -nargs=+ HiLink hi link <args>\n  else\n    command -nargs=+ HiLink hi def link <args>\n  endif\n\n  HiLink pbTodo         Todo\n\n  HiLink pbSyntax       Include\n  HiLink pbStructure    Structure\n  HiLink pbRepeat       Repeat\n  HiLink pbDefault      Keyword\n  HiLink pbExtend       Keyword\n  HiLink pbRPC          Keyword\n  HiLink pbType         Type\n  HiLink pbTypedef      Typedef\n  HiLink pbBool         Boolean\n\n  HiLink pbInt          Number\n  HiLink pbFloat        Float\n  HiLink pbComment      Comment\n  HiLink pbString       String\n\n  delcommand HiLink\nendif\n\nlet b:current_syntax = \"proto\"\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/editors/protobuf-mode.el",
    "content": ";;; protobuf-mode.el --- major mode for editing protocol buffers.\n\n;; Author: Alexandre Vassalotti <alexandre@peadrop.com>\n;; Created: 23-Apr-2009\n;; Version: 0.3\n;; Keywords: google protobuf languages\n\n;; Redistribution and use in source and binary forms, with or without\n;; modification, are permitted provided that the following conditions are\n;; met:\n;;\n;;     * Redistributions of source code must retain the above copyright\n;; notice, this list of conditions and the following disclaimer.\n;;     * Redistributions in binary form must reproduce the above\n;; copyright notice, this list of conditions and the following disclaimer\n;; in the documentation and/or other materials provided with the\n;; distribution.\n;;     * Neither the name of Google Inc. nor the names of its\n;; contributors may be used to endorse or promote products derived from\n;; this software without specific prior written permission.\n;;\n;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n;; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n;; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n;; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n;; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n;; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n;;; Commentary:\n\n;; Installation:\n;;   - Put `protobuf-mode.el' in your Emacs load-path.\n;;   - Add this line to your .emacs file:\n;;       (require 'protobuf-mode)\n;;\n;; You can customize this mode just like any mode derived from CC Mode.  If\n;; you want to add customizations specific to protobuf-mode, you can use the\n;; `protobuf-mode-hook'. For example, the following would make protocol-mode\n;; use 2-space indentation:\n;;\n;;   (defconst my-protobuf-style\n;;     '((c-basic-offset . 2)\n;;       (indent-tabs-mode . nil)))\n;;\n;;   (add-hook 'protobuf-mode-hook\n;;     (lambda () (c-add-style \"my-style\" my-protobuf-style t)))\n;;\n;; Refer to the documentation of CC Mode for more information about\n;; customization details and how to use this mode.\n;;\n;; TODO:\n;;   - Make highlighting for enum values work properly.\n;;   - Fix the parser to recognize extensions as identifiers and not\n;;     as casts.\n;;   - Improve the parsing of option assignment lists. For example:\n;;       optional int32 foo = 1 [(my_field_option) = 4.5];\n;;   - Add support for fully-qualified identifiers (e.g., with a leading \".\").\n\n;;; Code:\n\n(require 'cc-mode)\n\n(eval-when-compile\n  (require 'cc-langs)\n  (require 'cc-fonts))\n\n;; This mode does not inherit properties from other modes. So, we do not use \n;; the usual `c-add-language' function.\n(eval-and-compile\n  (put 'protobuf-mode 'c-mode-prefix \"protobuf-\"))\n\n;; The following code uses of the `c-lang-defconst' macro define syntactic\n;; features of protocol buffer language.  Refer to the documentation in the\n;; cc-langs.el file for information about the meaning of the -kwds variables.\n\n(c-lang-defconst c-primitive-type-kwds\n  protobuf '(\"double\" \"float\" \"int32\" \"int64\" \"uint32\" \"uint64\" \"sint32\"\n             \"sint64\" \"fixed32\" \"fixed64\" \"sfixed32\" \"sfixed64\" \"bool\"\n             \"string\" \"bytes\" \"group\"))\n\n(c-lang-defconst c-modifier-kwds\n  protobuf '(\"required\" \"optional\" \"repeated\"))\n\n(c-lang-defconst c-class-decl-kwds\n  protobuf '(\"message\" \"enum\" \"service\"))\n\n(c-lang-defconst c-constant-kwds\n  protobuf '(\"true\" \"false\"))\n\n(c-lang-defconst c-other-decl-kwds\n  protobuf '(\"package\" \"import\"))\n\n(c-lang-defconst c-other-kwds\n  protobuf '(\"default\" \"max\"))\n\n(c-lang-defconst c-identifier-ops\n  ;; Handle extended identifiers like google.protobuf.MessageOptions\n  protobuf '((left-assoc \".\")))\n\n;; The following keywords do not fit well in keyword classes defined by\n;; cc-mode.  So, we approximate as best we can.\n\n(c-lang-defconst c-type-list-kwds\n  protobuf '(\"extensions\" \"to\"))\n\n(c-lang-defconst c-typeless-decl-kwds\n  protobuf '(\"extend\" \"rpc\" \"option\" \"returns\"))\n\n\n;; Here we remove default syntax for loops, if-statements and other C\n;; syntactic features that are not supported by the protocol buffer language.\n\n(c-lang-defconst c-brace-list-decl-kwds\n  ;; Remove syntax for C-style enumerations.\n  protobuf nil)\n\n(c-lang-defconst c-block-stmt-1-kwds\n  ;; Remove syntax for \"do\" and \"else\" keywords.\n  protobuf nil)\n\n(c-lang-defconst c-block-stmt-2-kwds\n  ;; Remove syntax for \"for\", \"if\", \"switch\" and \"while\" keywords.\n  protobuf nil)\n\n(c-lang-defconst c-simple-stmt-kwds\n  ;; Remove syntax for \"break\", \"continue\", \"goto\" and \"return\" keywords.\n  protobuf nil)\n\n(c-lang-defconst c-paren-stmt-kwds\n  ;; Remove special case for the \"(;;)\" in for-loops.\n  protobuf nil)\n\n(c-lang-defconst c-label-kwds\n  ;; Remove case label syntax for the \"case\" and \"default\" keywords.\n  protobuf nil)\n\n(c-lang-defconst c-before-label-kwds\n  ;; Remove special case for the label in a goto statement.\n  protobuf nil)\n\n(c-lang-defconst c-cpp-matchers\n  ;; Disable all the C preprocessor syntax.\n  protobuf nil)\n\n(c-lang-defconst c-decl-prefix-re\n  ;; Same as for C, except it does not match \"(\". This is needed for disabling\n  ;; the syntax for casts.\n  protobuf \"\\\\([\\{\\};,]+\\\\)\")\n\n\n;; Add support for variable levels of syntax highlighting.\n\n(defconst protobuf-font-lock-keywords-1 (c-lang-const c-matchers-1 protobuf)\n  \"Minimal highlighting for protobuf-mode.\")\n\n(defconst protobuf-font-lock-keywords-2 (c-lang-const c-matchers-2 protobuf)\n  \"Fast normal highlighting for protobuf-mode.\")\n\n(defconst protobuf-font-lock-keywords-3 (c-lang-const c-matchers-3 protobuf)\n  \"Accurate normal highlighting for protobuf-mode.\")\n\n(defvar protobuf-font-lock-keywords protobuf-font-lock-keywords-3\n  \"Default expressions to highlight in protobuf-mode.\")\n\n;; Our syntax table is auto-generated from the keyword classes we defined\n;; previously with the `c-lang-const' macro.\n(defvar protobuf-mode-syntax-table nil\n  \"Syntax table used in protobuf-mode buffers.\")\n(or protobuf-mode-syntax-table\n    (setq protobuf-mode-syntax-table\n          (funcall (c-lang-const c-make-mode-syntax-table protobuf))))\n\n(defvar protobuf-mode-abbrev-table nil\n  \"Abbreviation table used in protobuf-mode buffers.\")\n\n(defvar protobuf-mode-map nil\n  \"Keymap used in protobuf-mode buffers.\")\n(or protobuf-mode-map\n    (setq protobuf-mode-map (c-make-inherited-keymap)))\n\n(easy-menu-define protobuf-menu protobuf-mode-map\n  \"Protocol Buffers Mode Commands\"\n  (cons \"Protocol Buffers\" (c-lang-const c-mode-menu protobuf)))\n\n;;;###autoload (add-to-list 'auto-mode-alist '(\"\\\\.proto\\\\'\" . protobuf-mode))\n\n;;;###autoload\n(defun protobuf-mode ()\n  \"Major mode for editing Protocol Buffers description language.\n\nThe hook `c-mode-common-hook' is run with no argument at mode\ninitialization, then `protobuf-mode-hook'.\n\nKey bindings:\n\\\\{protobuf-mode-map}\"\n  (interactive)\n  (kill-all-local-variables)\n  (set-syntax-table protobuf-mode-syntax-table)\n  (setq major-mode 'protobuf-mode\n        mode-name \"Protocol-Buffers\"\n        local-abbrev-table protobuf-mode-abbrev-table\n        abbrev-mode t)\n  (use-local-map protobuf-mode-map)\n  (c-initialize-cc-mode t)\n  (if (fboundp 'c-make-emacs-variables-local)\n      (c-make-emacs-variables-local))\n  (c-init-language-vars protobuf-mode)\n  (c-common-init 'protobuf-mode)\n  (easy-menu-add protobuf-menu)\n  (c-run-mode-hooks 'c-mode-common-hook 'protobuf-mode-hook)\n  (c-update-modeline))\n\n(provide 'protobuf-mode)\n\n;;; protobuf-mode.el ends here\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/examples/AddPerson.java",
    "content": "// See README.txt for information and build instructions.\n\nimport com.example.tutorial.AddressBookProtos.AddressBook;\nimport com.example.tutorial.AddressBookProtos.Person;\nimport java.io.BufferedReader;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.FileOutputStream;\nimport java.io.InputStreamReader;\nimport java.io.IOException;\nimport java.io.PrintStream;\n\nclass AddPerson {\n  // This function fills in a Person message based on user input.\n  static Person PromptForAddress(BufferedReader stdin,\n                                 PrintStream stdout) throws IOException {\n    Person.Builder person = Person.newBuilder();\n\n    stdout.print(\"Enter person ID: \");\n    person.setId(Integer.valueOf(stdin.readLine()));\n\n    stdout.print(\"Enter name: \");\n    person.setName(stdin.readLine());\n\n    stdout.print(\"Enter email address (blank for none): \");\n    String email = stdin.readLine();\n    if (email.length() > 0) {\n      person.setEmail(email);\n    }\n\n    while (true) {\n      stdout.print(\"Enter a phone number (or leave blank to finish): \");\n      String number = stdin.readLine();\n      if (number.length() == 0) {\n        break;\n      }\n\n      Person.PhoneNumber.Builder phoneNumber =\n        Person.PhoneNumber.newBuilder().setNumber(number);\n\n      stdout.print(\"Is this a mobile, home, or work phone? \");\n      String type = stdin.readLine();\n      if (type.equals(\"mobile\")) {\n        phoneNumber.setType(Person.PhoneType.MOBILE);\n      } else if (type.equals(\"home\")) {\n        phoneNumber.setType(Person.PhoneType.HOME);\n      } else if (type.equals(\"work\")) {\n        phoneNumber.setType(Person.PhoneType.WORK);\n      } else {\n        stdout.println(\"Unknown phone type.  Using default.\");\n      }\n\n      person.addPhone(phoneNumber);\n    }\n\n    return person.build();\n  }\n\n  // Main function:  Reads the entire address book from a file,\n  //   adds one person based on user input, then writes it back out to the same\n  //   file.\n  public static void main(String[] args) throws Exception {\n    if (args.length != 1) {\n      System.err.println(\"Usage:  AddPerson ADDRESS_BOOK_FILE\");\n      System.exit(-1);\n    }\n\n    AddressBook.Builder addressBook = AddressBook.newBuilder();\n\n    // Read the existing address book.\n    try {\n      FileInputStream input = new FileInputStream(args[0]);\n      try {\n        addressBook.mergeFrom(input);\n      } finally {\n        try { input.close(); } catch (Throwable ignore) {}\n      }\n    } catch (FileNotFoundException e) {\n      System.out.println(args[0] + \": File not found.  Creating a new file.\");\n    }\n\n    // Add an address.\n    addressBook.addPerson(\n      PromptForAddress(new BufferedReader(new InputStreamReader(System.in)),\n                       System.out));\n\n    // Write the new address book back to disk.\n    FileOutputStream output = new FileOutputStream(args[0]);\n    try {\n      addressBook.build().writeTo(output);\n    } finally {\n      output.close();\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/examples/ListPeople.java",
    "content": "// See README.txt for information and build instructions.\n\nimport com.example.tutorial.AddressBookProtos.AddressBook;\nimport com.example.tutorial.AddressBookProtos.Person;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.io.PrintStream;\n\nclass ListPeople {\n  // Iterates though all people in the AddressBook and prints info about them.\n  static void Print(AddressBook addressBook) {\n    for (Person person: addressBook.getPersonList()) {\n      System.out.println(\"Person ID: \" + person.getId());\n      System.out.println(\"  Name: \" + person.getName());\n      if (person.hasEmail()) {\n        System.out.println(\"  E-mail address: \" + person.getEmail());\n      }\n\n      for (Person.PhoneNumber phoneNumber : person.getPhoneList()) {\n        switch (phoneNumber.getType()) {\n          case MOBILE:\n            System.out.print(\"  Mobile phone #: \");\n            break;\n          case HOME:\n            System.out.print(\"  Home phone #: \");\n            break;\n          case WORK:\n            System.out.print(\"  Work phone #: \");\n            break;\n        }\n        System.out.println(phoneNumber.getNumber());\n      }\n    }\n  }\n\n  // Main function:  Reads the entire address book from a file and prints all\n  //   the information inside.\n  public static void main(String[] args) throws Exception {\n    if (args.length != 1) {\n      System.err.println(\"Usage:  ListPeople ADDRESS_BOOK_FILE\");\n      System.exit(-1);\n    }\n\n    // Read the existing address book.\n    AddressBook addressBook =\n      AddressBook.parseFrom(new FileInputStream(args[0]));\n\n    Print(addressBook);\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/examples/README.txt",
    "content": "This directory contains example code that uses Protocol Buffers to manage an\naddress book.  Two programs are provided, each with three different\nimplementations, one written in each of C++, Java, and Python.  The add_person\nexample adds a new person to an address book, prompting the user to input\nthe person's information.  The list_people example lists people already in the\naddress book.  The examples use the exact same format in all three languages,\nso you can, for example, use add_person_java to create an address book and then\nuse list_people_python to read it.\n\nYou must install the protobuf package before you can build these.\n\nTo build all the examples (on a unix-like system), simply run \"make\".  This\ncreates the following executable files in the current directory:\n  add_person_cpp     list_people_cpp\n  add_person_java    list_people_java\n  add_person_python  list_people_python\n\nIf you only want to compile examples in one language, use \"make cpp\"*,\n\"make java\", or \"make python\".\n\nAll of these programs simply take an address book file as their parameter.\nThe add_person programs will create the file if it doesn't already exist.\n\nThese examples are part of the Protocol Buffers tutorial, located at:\n  http://code.google.com/apis/protocolbuffers/docs/tutorials.html\n\n* Note that on some platforms you may have to edit the Makefile and remove\n\"-lpthread\" from the linker commands (perhaps replacing it with something else).\nWe didn't do this automatically because we wanted to keep the example simple.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.cc",
    "content": "// See README.txt for information and build instructions.\n\n#include <iostream>\n#include <fstream>\n#include <string>\n#include \"addressbook.pb.h\"\nusing namespace std;\n\n// This function fills in a Person message based on user input.\nvoid PromptForAddress(tutorial::Person* person) {\n  cout << \"Enter person ID number: \";\n  int id;\n  cin >> id;\n  person->set_id(id);\n  cin.ignore(256, '\\n');\n\n  cout << \"Enter name: \";\n  getline(cin, *person->mutable_name());\n\n  cout << \"Enter email address (blank for none): \";\n  string email;\n  getline(cin, email);\n  if (!email.empty()) {\n    person->set_email(email);\n  }\n\n  while (true) {\n    cout << \"Enter a phone number (or leave blank to finish): \";\n    string number;\n    getline(cin, number);\n    if (number.empty()) {\n      break;\n    }\n\n    tutorial::Person::PhoneNumber* phone_number = person->add_phone();\n    phone_number->set_number(number);\n\n    cout << \"Is this a mobile, home, or work phone? \";\n    string type;\n    getline(cin, type);\n    if (type == \"mobile\") {\n      phone_number->set_type(tutorial::Person::MOBILE);\n    } else if (type == \"home\") {\n      phone_number->set_type(tutorial::Person::HOME);\n    } else if (type == \"work\") {\n      phone_number->set_type(tutorial::Person::WORK);\n    } else {\n      cout << \"Unknown phone type.  Using default.\" << endl;\n    }\n  }\n}\n\n// Main function:  Reads the entire address book from a file,\n//   adds one person based on user input, then writes it back out to the same\n//   file.\nint main(int argc, char* argv[]) {\n  // Verify that the version of the library that we linked against is\n  // compatible with the version of the headers we compiled against.\n  GOOGLE_PROTOBUF_VERIFY_VERSION;\n\n  if (argc != 2) {\n    cerr << \"Usage:  \" << argv[0] << \" ADDRESS_BOOK_FILE\" << endl;\n    return -1;\n  }\n\n  tutorial::AddressBook address_book;\n\n  {\n    // Read the existing address book.\n    fstream input(argv[1], ios::in | ios::binary);\n    if (!input) {\n      cout << argv[1] << \": File not found.  Creating a new file.\" << endl;\n    } else if (!address_book.ParseFromIstream(&input)) {\n      cerr << \"Failed to parse address book.\" << endl;\n      return -1;\n    }\n  }\n\n  // Add an address.\n  PromptForAddress(address_book.add_person());\n\n  {\n    // Write the new address book back to disk.\n    fstream output(argv[1], ios::out | ios::trunc | ios::binary);\n    if (!address_book.SerializeToOstream(&output)) {\n      cerr << \"Failed to write address book.\" << endl;\n      return -1;\n    }\n  }\n\n  // Optional:  Delete all global objects allocated by libprotobuf.\n  google::protobuf::ShutdownProtobufLibrary();\n\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.py",
    "content": "#! /usr/bin/python\n\n# See README.txt for information and build instructions.\n\nimport addressbook_pb2\nimport sys\n\n# This function fills in a Person message based on user input.\ndef PromptForAddress(person):\n  person.id = int(raw_input(\"Enter person ID number: \"))\n  person.name = raw_input(\"Enter name: \")\n\n  email = raw_input(\"Enter email address (blank for none): \")\n  if email != \"\":\n    person.email = email\n\n  while True:\n    number = raw_input(\"Enter a phone number (or leave blank to finish): \")\n    if number == \"\":\n      break\n\n    phone_number = person.phone.add()\n    phone_number.number = number\n\n    type = raw_input(\"Is this a mobile, home, or work phone? \")\n    if type == \"mobile\":\n      phone_number.type = addressbook_pb2.Person.MOBILE\n    elif type == \"home\":\n      phone_number.type = addressbook_pb2.Person.HOME\n    elif type == \"work\":\n      phone_number.type = addressbook_pb2.Person.WORK\n    else:\n      print \"Unknown phone type; leaving as default value.\"\n\n# Main procedure:  Reads the entire address book from a file,\n#   adds one person based on user input, then writes it back out to the same\n#   file.\nif len(sys.argv) != 2:\n  print \"Usage:\", sys.argv[0], \"ADDRESS_BOOK_FILE\"\n  sys.exit(-1)\n\naddress_book = addressbook_pb2.AddressBook()\n\n# Read the existing address book.\ntry:\n  f = open(sys.argv[1], \"rb\")\n  address_book.ParseFromString(f.read())\n  f.close()\nexcept IOError:\n  print sys.argv[1] + \": File not found.  Creating a new file.\"\n\n# Add an address.\nPromptForAddress(address_book.person.add())\n\n# Write the new address book back to disk.\nf = open(sys.argv[1], \"wb\")\nf.write(address_book.SerializeToString())\nf.close()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/examples/addressbook.proto",
    "content": "// See README.txt for information and build instructions.\n\npackage tutorial;\n\noption java_package = \"com.example.tutorial\";\noption java_outer_classname = \"AddressBookProtos\";\n\nmessage Person {\n  required string name = 1;\n  required int32 id = 2;        // Unique ID number for this person.\n  optional string email = 3;\n\n  enum PhoneType {\n    MOBILE = 0;\n    HOME = 1;\n    WORK = 2;\n  }\n\n  message PhoneNumber {\n    required string number = 1;\n    optional PhoneType type = 2 [default = HOME];\n  }\n\n  repeated PhoneNumber phone = 4;\n}\n\n// Our address book file is just one of these.\nmessage AddressBook {\n  repeated Person person = 1;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.cc",
    "content": "// See README.txt for information and build instructions.\n\n#include <iostream>\n#include <fstream>\n#include <string>\n#include \"addressbook.pb.h\"\nusing namespace std;\n\n// Iterates though all people in the AddressBook and prints info about them.\nvoid ListPeople(const tutorial::AddressBook& address_book) {\n  for (int i = 0; i < address_book.person_size(); i++) {\n    const tutorial::Person& person = address_book.person(i);\n\n    cout << \"Person ID: \" << person.id() << endl;\n    cout << \"  Name: \" << person.name() << endl;\n    if (person.has_email()) {\n      cout << \"  E-mail address: \" << person.email() << endl;\n    }\n\n    for (int j = 0; j < person.phone_size(); j++) {\n      const tutorial::Person::PhoneNumber& phone_number = person.phone(j);\n\n      switch (phone_number.type()) {\n        case tutorial::Person::MOBILE:\n          cout << \"  Mobile phone #: \";\n          break;\n        case tutorial::Person::HOME:\n          cout << \"  Home phone #: \";\n          break;\n        case tutorial::Person::WORK:\n          cout << \"  Work phone #: \";\n          break;\n      }\n      cout << phone_number.number() << endl;\n    }\n  }\n}\n\n// Main function:  Reads the entire address book from a file and prints all\n//   the information inside.\nint main(int argc, char* argv[]) {\n  // Verify that the version of the library that we linked against is\n  // compatible with the version of the headers we compiled against.\n  GOOGLE_PROTOBUF_VERIFY_VERSION;\n\n  if (argc != 2) {\n    cerr << \"Usage:  \" << argv[0] << \" ADDRESS_BOOK_FILE\" << endl;\n    return -1;\n  }\n\n  tutorial::AddressBook address_book;\n\n  {\n    // Read the existing address book.\n    fstream input(argv[1], ios::in | ios::binary);\n    if (!address_book.ParseFromIstream(&input)) {\n      cerr << \"Failed to parse address book.\" << endl;\n      return -1;\n    }\n  }\n\n  ListPeople(address_book);\n\n  // Optional:  Delete all global objects allocated by libprotobuf.\n  google::protobuf::ShutdownProtobufLibrary();\n\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.py",
    "content": "#! /usr/bin/python\n\n# See README.txt for information and build instructions.\n\nimport addressbook_pb2\nimport sys\n\n# Iterates though all people in the AddressBook and prints info about them.\ndef ListPeople(address_book):\n  for person in address_book.person:\n    print \"Person ID:\", person.id\n    print \"  Name:\", person.name\n    if person.HasField('email'):\n      print \"  E-mail address:\", person.email\n\n    for phone_number in person.phone:\n      if phone_number.type == addressbook_pb2.Person.MOBILE:\n        print \"  Mobile phone #:\",\n      elif phone_number.type == addressbook_pb2.Person.HOME:\n        print \"  Home phone #:\",\n      elif phone_number.type == addressbook_pb2.Person.WORK:\n        print \"  Work phone #:\",\n      print phone_number.number\n\n# Main procedure:  Reads the entire address book from a file and prints all\n#   the information inside.\nif len(sys.argv) != 2:\n  print \"Usage:\", sys.argv[0], \"ADDRESS_BOOK_FILE\"\n  sys.exit(-1)\n\naddress_book = addressbook_pb2.AddressBook()\n\n# Read the existing address book.\nf = open(sys.argv[1], \"rb\")\naddress_book.ParseFromString(f.read())\nf.close()\n\nListPeople(address_book)\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/generate_descriptor_proto.sh",
    "content": "#!/bin/sh\n\n# Run this script to regenerate descriptor.pb.{h,cc} after the protocol\n# compiler changes.  Since these files are compiled into the protocol compiler\n# itself, they cannot be generated automatically by a make rule.  \"make check\"\n# will fail if these files do not match what the protocol compiler would\n# generate.\n#\n# HINT:  Flags passed to generate_descriptor_proto.sh will be passed directly\n#   to make when building protoc.  This is particularly useful for passing\n#   -j4 to run 4 jobs simultaneously.\n\nif test ! -e src/google/protobuf/stubs/common.h; then\n  cat >&2 << __EOF__\nCould not find source code.  Make sure you are running this script from the\nroot of the distribution tree.\n__EOF__\n  exit 1\nfi\n\nif test ! -e src/Makefile; then\n  cat >&2 << __EOF__\nCould not find src/Makefile.  You must run ./configure (and perhaps\n./autogen.sh) first.\n__EOF__\n  exit 1\nfi\n\ncd src\nmake $@ protoc &&\n  ./protoc --cpp_out=dllexport_decl=LIBPROTOBUF_EXPORT:. google/protobuf/descriptor.proto && \\\n  ./protoc --cpp_out=dllexport_decl=LIBPROTOC_EXPORT:. google/protobuf/compiler/plugin.proto\ncd ..\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/CHANGES",
    "content": "Changes for 1.5.0:\n\n * New feature: assertions can be safely called in multiple threads\n   where the pthreads library is available.\n * New feature: predicates used inside EXPECT_TRUE() and friends\n   can now generate custom failure messages.\n * New feature: Google Test can now be compiled as a DLL.\n * New feature: fused source files are included.\n * New feature: prints help when encountering unrecognized Google Test flags.\n * Experimental feature: CMake build script (requires CMake 2.6.4+).\n * Experimental feature: the Pump script for meta programming.\n * double values streamed to an assertion are printed with enough precision\n   to differentiate any two different values.\n * Google Test now works on Solaris and AIX.\n * Build and test script improvements.\n * Bug fixes and implementation clean-ups.\n\n Potentially breaking changes:\n\n * Stopped supporting VC++ 7.1 with exceptions disabled.\n * Dropped support for 'make install'.\n\nChanges for 1.4.0:\n\n * New feature: the event listener API\n * New feature: test shuffling\n * New feature: the XML report format is closer to junitreport and can\n   be parsed by Hudson now.\n * New feature: when a test runs under Visual Studio, its failures are\n   integrated in the IDE.\n * New feature: /MD(d) versions of VC++ projects.\n * New feature: elapsed time for the tests is printed by default.\n * New feature: comes with a TR1 tuple implementation such that Boost\n   is no longer needed for Combine().\n * New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends.\n * New feature: the Xcode project can now produce static gtest\n   libraries in addition to a framework.\n * Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile,\n   Symbian, gcc, and C++Builder.\n * Bug fixes and implementation clean-ups.\n\nChanges for 1.3.0:\n\n * New feature: death tests on Windows, Cygwin, and Mac.\n * New feature: ability to use Google Test assertions in other testing\n   frameworks.\n * New feature: ability to run disabled test via\n   --gtest_also_run_disabled_tests.\n * New feature: the --help flag for printing the usage.\n * New feature: access to Google Test flag values in user code.\n * New feature: a script that packs Google Test into one .h and one\n   .cc file for easy deployment.\n * New feature: support for distributing test functions to multiple\n   machines (requires support from the test runner).\n * Bug fixes and implementation clean-ups.\n\nChanges for 1.2.1:\n\n * Compatibility fixes for Linux IA-64 and IBM z/OS.\n * Added support for using Boost and other TR1 implementations.\n * Changes to the build scripts to support upcoming release of Google C++\n   Mocking Framework.\n * Added Makefile to the distribution package.\n * Improved build instructions in README.\n\nChanges for 1.2.0:\n\n * New feature: value-parameterized tests.\n * New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS)\n   macros.\n * Changed the XML report format to match JUnit/Ant's.\n * Added tests to the Xcode project.\n * Added scons/SConscript for building with SCons.\n * Added src/gtest-all.cc for building Google Test from a single file.\n * Fixed compatibility with Solaris and z/OS.\n * Enabled running Python tests on systems with python 2.3 installed,\n   e.g. Mac OS X 10.4.\n * Bug fixes.\n\nChanges for 1.1.0:\n\n * New feature: type-parameterized tests.\n * New feature: exception assertions.\n * New feature: printing elapsed time of tests.\n * Improved the robustness of death tests.\n * Added an Xcode project and samples.\n * Adjusted the output format on Windows to be understandable by Visual Studio.\n * Minor bug fixes.\n\nChanges for 1.0.1:\n\n * Added project files for Visual Studio 7.1.\n * Fixed issues with compiling on Mac OS X.\n * Fixed issues with compiling on Cygwin.\n\nChanges for 1.0.0:\n\n * Initial Open Source release of Google Test\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/CMakeLists.txt",
    "content": "########################################################################\n# Experimental CMake build script for Google Test.\n#\n# Consider this a prototype.  It will change drastically.  For now,\n# this is only for people on the cutting edge.\n#\n# To run the tests for Google Test itself on Linux, use 'make test' or\n# ctest.  You can select which tests to run using 'ctest -R regex'.\n# For more options, run 'ctest --help'.\n\n# For hermetic builds, we may need to tell CMake to use compiler in a\n# specific location.\nif (gtest_compiler)\n  include(CMakeForceCompiler)\n  cmake_force_c_compiler(\"${gtest_compiler}\" \"\")\n  cmake_force_cxx_compiler(\"${gtest_compiler}\" \"\")\nendif()\n\n########################################################################\n#\n# Project-wide settings\n\n# Name of the project.\n#\n# CMake files in this project can refer to the root source directory\n# as ${gtest_SOURCE_DIR} and to the root binary directory as\n# ${gtest_BINARY_DIR}.\n# Language \"C\" is required for find_package(Threads).\nproject(gtest CXX C)\ncmake_minimum_required(VERSION 2.6.4)\n\nif (MSVC)\n  # For MSVC, CMake sets certain flags to defaults we want to override.\n  # This replacement code is taken from sample in the CMake Wiki at\n  # http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace.\n  foreach (flag_var\n           CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE\n           CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)\n    # In hermetic build environments, tests may not have access to MS runtime\n    # DLLs, so this replaces /MD (CRT libraries in DLLs) with /MT (static CRT\n    # libraries).\n    string(REPLACE \"/MD\" \"-MT\" ${flag_var} \"${${flag_var}}\")\n    # We prefer more strict warning checking for building Google Test.\n    # Replaces /W3 with /W4 in defaults.\n    string(REPLACE \"/W3\" \"-W4\" ${flag_var} \"${${flag_var}}\")\n  endforeach()\nendif()\n\n# Where gtest's .h files can be found.\ninclude_directories(\n  ${gtest_SOURCE_DIR}/include\n  ${gtest_SOURCE_DIR})\n\n# Where the gtest libraries can be found.\nlink_directories(\n  ${gtest_BINARY_DIR}/src)\n\n# Defines CMAKE_USE_PTHREADS_INIT and CMAKE_THREAD_LIBS_INIT.\nfind_package(Threads)\n\n# Defines the compiler/linker flags used to build gtest.  You can\n# tweak these definitions to suit your need.  A variable's value is\n# empty before it's explicitly assigned to.\n\nif (MSVC)\n  # Newlines inside flags variables break CMake's NMake generator.\n  set(cxx_base_flags \"-GS -W4 -WX -wd4275 -nologo -J -Zi\")\n  set(cxx_base_flags \"${cxx_base_flags} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32\")\n  set(cxx_base_flags \"${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN\")\n  set(cxx_exception_flags \"-EHsc -D_HAS_EXCEPTIONS=1\")\n  set(cxx_no_exception_flags \"-D_HAS_EXCEPTIONS=0\")\n  set(cxx_no_rtti_flags \"-GR-\")\nelseif (CMAKE_COMPILER_IS_GNUCXX)\n  set(cxx_base_flags \"-Wall -Wshadow\")\n  set(cxx_exception_flags \"-fexceptions\")\n  set(cxx_no_exception_flags \"-fno-exceptions\")\n  # Until version 4.3.2, GCC doesn't define a macro to indicate\n  # whether RTTI is enabled.  Therefore we define GTEST_HAS_RTTI\n  # explicitly.\n  set(cxx_no_rtti_flags \"-fno-rtti -DGTEST_HAS_RTTI=0\")\n  set(cxx_strict_flags \"-Wextra\")\nelseif (CMAKE_CXX_COMPILER_ID STREQUAL \"SunPro\")\n  set(cxx_exception_flags \"-features=except\")\n  # Sun Pro doesn't provide macros to indicate whether exceptions and\n  # RTTI are enabled, so we define GTEST_HAS_* explicitly.\n  set(cxx_no_exception_flags \"-features=no%except -DGTEST_HAS_EXCEPTIONS=0\")\n  set(cxx_no_rtti_flags \"-features=no%rtti -DGTEST_HAS_RTTI=0\")\nelseif (CMAKE_CXX_COMPILER_ID STREQUAL \"VisualAge\" OR\n        CMAKE_CXX_COMPILER_ID STREQUAL \"XL\")\n  # CMake 2.8 changes Visual Age's compiler ID to \"XL\".\n  set(cxx_exception_flags \"-qeh\")\n  set(cxx_no_exception_flags \"-qnoeh\")\n  # Until version 9.0, Visual Age doesn't define a macro to indicate\n  # whether RTTI is enabled.  Therefore we define GTEST_HAS_RTTI\n  # explicitly.\n  set(cxx_no_rtti_flags \"-qnortti -DGTEST_HAS_RTTI=0\")\nendif()\n\nif (CMAKE_USE_PTHREADS_INIT)  # The pthreads library is available.\n  set(cxx_base_flags \"${cxx_base_flags} -DGTEST_HAS_PTHREAD=1\")\nendif()\n\n# For building gtest's own tests and samples.\nset(cxx_exception \"${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_exception_flags}\")\nset(cxx_no_exception\n    \"${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_no_exception_flags}\")\nset(cxx_default \"${cxx_exception}\")\nset(cxx_no_rtti \"${cxx_default} ${cxx_no_rtti_flags}\")\nset(cxx_use_own_tuple \"${cxx_default} -DGTEST_USE_OWN_TR1_TUPLE=1\")\n\n# For building the gtest libraries.\nset(cxx_strict \"${cxx_default} ${cxx_strict_flags}\")\n\n########################################################################\n#\n# Defines the gtest & gtest_main libraries.  User tests should link\n# with one of them.\nfunction(cxx_library_with_type name type cxx_flags)\n  # type can be either STATIC or SHARED to denote a static or shared library.\n  # ARGN refers to additional arguments after 'cxx_flags'.\n  add_library(${name} ${type} ${ARGN})\n  set_target_properties(${name}\n    PROPERTIES\n    COMPILE_FLAGS \"${cxx_flags}\")\n    if (CMAKE_USE_PTHREADS_INIT)\n      target_link_libraries(${name} ${CMAKE_THREAD_LIBS_INIT})\n    endif()\nendfunction()\n\nfunction(cxx_static_library name cxx_flags)\n  cxx_library_with_type(${name} STATIC \"${cxx_flags}\" ${ARGN})\nendfunction()\n\nfunction(cxx_shared_library name cxx_flags)\n  cxx_library_with_type(${name} SHARED \"${cxx_flags}\" ${ARGN})\nendfunction()\n\nfunction(cxx_library name cxx_flags)\n  # TODO(vladl@google.com): Make static/shared a user option.\n  cxx_static_library(${name} \"${cxx_flags}\" ${ARGN})\nendfunction()\n\n# Static versions of Google Test libraries.  We build them using more\n# strict warnings than what are used for other targets, to ensure that\n# gtest can be compiled by a user aggressive about warnings.\ncxx_static_library(gtest \"${cxx_strict}\" src/gtest-all.cc)\ncxx_static_library(gtest_main \"${cxx_strict}\" src/gtest_main.cc)\ntarget_link_libraries(gtest_main gtest)\n\n########################################################################\n#\n# Samples on how to link user tests with gtest or gtest_main.\n#\n# They are not built by default.  To build them, set the\n# build_gtest_samples option to ON.  You can do it by running ccmake\n# or specifying the -Dbuild_gtest_samples=ON flag when running cmake.\n\noption(build_gtest_samples \"Build gtest's sample programs.\" OFF)\n\n# cxx_executable_with_flags(name cxx_flags lib srcs...)\n#\n# creates a named C++ executable that depends on the given library and\n# is built from the given source files with the given compiler flags.\nfunction(cxx_executable_with_flags name cxx_flags lib)\n  add_executable(${name} ${ARGN})\n  if (cxx_flags)\n    set_target_properties(${name}\n      PROPERTIES\n      COMPILE_FLAGS \"${cxx_flags}\")\n  endif()\n  target_link_libraries(${name} ${lib})\nendfunction()\n\n# cxx_executable(name dir lib srcs...)\n#\n# creates a named target that depends on the given lib and is built\n# from the given source files.  dir/name.cc is implicitly included in\n# the source file list.\nfunction(cxx_executable name dir lib)\n  cxx_executable_with_flags(\n    ${name} \"${cxx_default}\" ${lib} \"${dir}/${name}.cc\" ${ARGN})\nendfunction()\n\nif (build_gtest_samples)\n  cxx_executable(sample1_unittest samples gtest_main samples/sample1.cc)\n  cxx_executable(sample2_unittest samples gtest_main samples/sample2.cc)\n  cxx_executable(sample3_unittest samples gtest_main)\n  cxx_executable(sample4_unittest samples gtest_main samples/sample4.cc)\n  cxx_executable(sample5_unittest samples gtest_main samples/sample1.cc)\n  cxx_executable(sample6_unittest samples gtest_main)\n  cxx_executable(sample7_unittest samples gtest_main)\n  cxx_executable(sample8_unittest samples gtest_main)\n  cxx_executable(sample9_unittest samples gtest)\n  cxx_executable(sample10_unittest samples gtest)\nendif()\n\n########################################################################\n#\n# Google Test's own tests.\n#\n# You can skip this section if you aren't interested in testing\n# Google Test itself.\n#\n# Most of the tests are not built by default.  To build them, set the\n# build_all_gtest_tests option to ON.  You can do it by running ccmake\n# or specifying the -Dbuild_all_gtest_tests=ON flag when running cmake.\n\noption(build_all_gtest_tests \"Build all of gtest's own tests.\" OFF)\n\n# This must be set in the root directory for the tests to be run by\n# 'make test' or ctest.\nenable_testing()\n\n# Sets PYTHONINTERP_FOUND and PYTHON_EXECUTABLE.\nfind_package(PythonInterp)\n\n############################################################\n# C++ tests built with standard compiler flags.\n\n# cxx_test_with_flags(name cxx_flags libs srcs...)\n#\n# creates a named C++ test that depends on the given libs and is built\n# from the given source files with the given compiler flags.\nfunction(cxx_test_with_flags name cxx_flags libs)\n  add_executable(${name} ${ARGN})\n  set_target_properties(${name}\n    PROPERTIES\n    COMPILE_FLAGS \"${cxx_flags}\")\n  # To support mixing linking in static and dynamic libraries, link each\n  # library in with an extra call to target_link_libraries.\n  foreach (lib \"${libs}\")\n    target_link_libraries(${name} ${lib})\n  endforeach()\n  add_test(${name} ${name})\nendfunction()\n\n# cxx_test(name libs srcs...)\n#\n# creates a named test target that depends on the given libs and is\n# built from the given source files.  Unlike cxx_test_with_flags,\n# test/name.cc is already implicitly included in the source file list.\nfunction(cxx_test name libs)\n  cxx_test_with_flags(\"${name}\" \"${cxx_default}\" \"${libs}\"\n    \"test/${name}.cc\" ${ARGN})\nendfunction()\n\ncxx_test(gtest_unittest gtest_main)\n\nif (build_all_gtest_tests)\n  cxx_test(gtest-death-test_test gtest_main)\n  cxx_test(gtest_environment_test gtest)\n  cxx_test(gtest-filepath_test gtest_main)\n  cxx_test(gtest-linked_ptr_test gtest_main)\n  cxx_test(gtest-listener_test gtest_main)\n  cxx_test(gtest_main_unittest gtest_main)\n  cxx_test(gtest-message_test gtest_main)\n  cxx_test(gtest_no_test_unittest gtest)\n  cxx_test(gtest-options_test gtest_main)\n  cxx_test(gtest-param-test_test gtest\n    test/gtest-param-test2_test.cc)\n  cxx_test(gtest-port_test gtest_main)\n  cxx_test(gtest_pred_impl_unittest gtest_main)\n  cxx_test(gtest_prod_test gtest_main\n    test/production.cc)\n  cxx_test(gtest_repeat_test gtest)\n  cxx_test(gtest_sole_header_test gtest_main)\n  cxx_test(gtest_stress_test gtest)\n  cxx_test(gtest-test-part_test gtest_main)\n  cxx_test(gtest_throw_on_failure_ex_test gtest)\n  cxx_test(gtest-typed-test_test gtest_main\n    test/gtest-typed-test2_test.cc)\n  cxx_test(gtest-unittest-api_test gtest)\nendif()\n\n############################################################\n# C++ tests built with non-standard compiler flags.\n\nif (build_all_gtest_tests)\n  cxx_library(gtest_no_exception \"${cxx_no_exception}\"\n    src/gtest-all.cc)\n  cxx_library(gtest_main_no_rtti \"${cxx_no_rtti}\"\n    src/gtest-all.cc src/gtest_main.cc)\n\n  cxx_test_with_flags(gtest_no_rtti_unittest \"${cxx_no_rtti}\"\n    gtest_main_no_rtti test/gtest_unittest.cc)\n\n  set(cxx_use_shared_gtest \"${cxx_default} -DGTEST_LINKED_AS_SHARED_LIBRARY=1\")\n  set(cxx_build_shared_gtest \"${cxx_default} -DGTEST_CREATE_SHARED_LIBRARY=1\")\n  if (MSVC)\n    # Disables the \"class 'X' needs to have dll-interface to be used\n    # by clients of class 'Y'\" warning. This particularly concerns generic\n    # classes like vector that MS doesn't mark as exported.\n    set(cxx_use_shared_gtest \"${cxx_use_shared_gtest} -wd4251\")\n    set(cxx_build_shared_gtest \"${cxx_build_shared_gtest} -wd4251\")\n  endif()\n\n  cxx_shared_library(gtest_dll \"${cxx_build_shared_gtest}\"\n    src/gtest-all.cc)\n\n  # TODO(vladl): This and the next tests may not run in the hermetic\n  # environment on Windows. Re-evaluate and possibly make them\n  # platform-conditional after implementing hermetic builds.\n  cxx_executable_with_flags(gtest_dll_test_ \"${cxx_use_shared_gtest}\"\n    gtest_dll test/gtest_all_test.cc)\n\n  if (NOT(MSVC AND (MSVC_VERSION EQUAL 1600)))\n    # The C++ Standard specifies tuple_element<int, class>.\n    # Yet MSVC 10's <utility> declares tuple_element<size_t, class>.\n    # That declaration conflicts with our own standard-conforming\n    # tuple implementation.  Therefore using our own tuple with\n    # MSVC 10 doesn't compile.\n    cxx_library(gtest_main_use_own_tuple \"${cxx_use_own_tuple}\"\n      src/gtest-all.cc src/gtest_main.cc)\n\n    cxx_test_with_flags(gtest-tuple_test \"${cxx_use_own_tuple}\"\n      gtest_main_use_own_tuple test/gtest-tuple_test.cc)\n\n    cxx_test_with_flags(gtest_use_own_tuple_test \"${cxx_use_own_tuple}\"\n      gtest_main_use_own_tuple\n      test/gtest-param-test_test.cc test/gtest-param-test2_test.cc)\n  endif()\n\nendif()\n\n############################################################\n# Python tests.\n\n# py_test(name)\n#\n# creates a Python test with the given name whose main module is in\n# test/name.py.  It does nothing if Python is not installed.\nfunction(py_test name)\n  if (PYTHONINTERP_FOUND)\n    # ${gtest_BINARY_DIR} is known at configuration time, so we can\n    # directly bind it from cmake. ${CTEST_CONFIGURATION_TYPE} is known\n    # only at ctest runtime (by calling ctest -c <Configuration>), so\n    # we have to escape $ to delay variable substitution here.\n    add_test(${name}\n      ${PYTHON_EXECUTABLE} ${gtest_SOURCE_DIR}/test/${name}.py\n          --gtest_build_dir=${gtest_BINARY_DIR}/\\${CTEST_CONFIGURATION_TYPE})\n  endif()\nendfunction()\n\nif (build_all_gtest_tests)\n  cxx_executable(gtest_break_on_failure_unittest_ test gtest)\n  py_test(gtest_break_on_failure_unittest)\n\n  cxx_executable(gtest_color_test_ test gtest)\n  py_test(gtest_color_test)\n\n  cxx_executable(gtest_env_var_test_ test gtest)\n  py_test(gtest_env_var_test)\n\n  cxx_executable(gtest_filter_unittest_ test gtest)\n  py_test(gtest_filter_unittest)\n\n  cxx_executable(gtest_help_test_ test gtest_main)\n  py_test(gtest_help_test)\n\n  cxx_executable(gtest_list_tests_unittest_ test gtest)\n  py_test(gtest_list_tests_unittest)\n\n  cxx_executable(gtest_output_test_ test gtest)\n  py_test(gtest_output_test)\n\n  cxx_executable(gtest_shuffle_test_ test gtest)\n  py_test(gtest_shuffle_test)\n\n  cxx_executable(gtest_throw_on_failure_test_ test gtest_no_exception)\n  set_target_properties(gtest_throw_on_failure_test_\n    PROPERTIES\n    COMPILE_FLAGS \"${cxx_no_exception}\")\n  py_test(gtest_throw_on_failure_test)\n\n  cxx_executable(gtest_uninitialized_test_ test gtest)\n  py_test(gtest_uninitialized_test)\n\n  cxx_executable(gtest_xml_outfile1_test_ test gtest_main)\n  cxx_executable(gtest_xml_outfile2_test_ test gtest_main)\n  py_test(gtest_xml_outfiles_test)\n\n  cxx_executable(gtest_xml_output_unittest_ test gtest)\n  py_test(gtest_xml_output_unittest)\nendif()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/CONTRIBUTORS",
    "content": "# This file contains a list of people who've made non-trivial\n# contribution to the Google C++ Testing Framework project.  People\n# who commit code to the project are encouraged to add their names\n# here.  Please keep the list sorted by first names.\n\nAjay Joshi <jaj@google.com>\nBalázs Dán <balazs.dan@gmail.com>\nBharat Mediratta <bharat@menalto.com>\nChandler Carruth <chandlerc@google.com>\nChris Prince <cprince@google.com>\nChris Taylor <taylorc@google.com>\nDan Egnor <egnor@google.com>\nEric Roman <eroman@chromium.org>\nHady Zalek <hady.zalek@gmail.com>\nJeffrey Yasskin <jyasskin@google.com>\nJói Sigurðsson <joi@google.com>\nKeir Mierle <mierle@gmail.com>\nKeith Ray <keith.ray@gmail.com>\nKenton Varda <kenton@google.com>\nManuel Klimek <klimek@google.com>\nMarkus Heule <markus.heule@gmail.com>\nMika Raento <mikie@iki.fi>\nMiklós Fazekas <mfazekas@szemafor.com>\nPatrick Hanna <phanna@google.com>\nPatrick Riley <pfr@google.com>\nPeter Kaminski <piotrk@google.com>\nPreston Jackson <preston.a.jackson@gmail.com>\nRainer Klaffenboeck <rainer.klaffenboeck@dynatrace.com>\nRuss Cox <rsc@google.com>\nRuss Rufer <russ@pentad.com>\nSean Mcafee <eefacm@gmail.com>\nSigurður Ásgeirsson <siggi@google.com>\nTracy Bialik <tracy@pentad.com>\nVadim Berman <vadimb@google.com>\nVlad Losev <vladl@google.com>\nZhanyong Wan <wan@google.com>\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/COPYING",
    "content": "Copyright 2008, Google Inc.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n    * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/README",
    "content": "Google C++ Testing Framework\n============================\n\nhttp://code.google.com/p/googletest/\n\nOverview\n--------\n\nGoogle's framework for writing C++ tests on a variety of platforms\n(Linux, Mac OS X, Windows, Windows CE, Symbian, etc).  Based on the\nxUnit architecture.  Supports automatic test discovery, a rich set of\nassertions, user-defined assertions, death tests, fatal and non-fatal\nfailures, various options for running the tests, and XML test report\ngeneration.\n\nPlease see the project page above for more information as well as the\nmailing list for questions, discussions, and development.  There is\nalso an IRC channel on OFTC (irc.oftc.net) #gtest available.  Please\njoin us!\n\nRequirements for End Users\n--------------------------\n\nGoogle Test is designed to have fairly minimal requirements to build\nand use with your projects, but there are some.  Currently, we support\nLinux, Windows, Mac OS X, and Cygwin.  We will also make our best\neffort to support other platforms (e.g. Solaris, AIX, and z/OS).\nHowever, since core members of the Google Test project have no access\nto these platforms, Google Test may have outstanding issues there.  If\nyou notice any problems on your platform, please notify\ngoogletestframework@googlegroups.com.  Patches for fixing them are\neven more welcome!\n\n### Linux Requirements ###\n\nThese are the base requirements to build and use Google Test from a source\npackage (as described below):\n  * GNU-compatible Make or gmake\n  * POSIX-standard shell\n  * POSIX(-2) Regular Expressions (regex.h)\n  * A C++98-standard-compliant compiler\n\n### Windows Requirements ###\n\n  * Microsoft Visual C++ 7.1 or newer\n\n### Cygwin Requirements ###\n\n  * Cygwin 1.5.25-14 or newer\n\n### Mac OS X Requirements ###\n\n  * Mac OS X 10.4 Tiger or newer\n  * Developer Tools Installed\n\nAlso, you'll need CMake 2.6.4 or higher if you want to build the\nsamples using the provided CMake script, regardless of the platform.\n\nRequirements for Contributors\n-----------------------------\n\nWe welcome patches.  If you plan to contribute a patch, you need to\nbuild Google Test and its own tests from an SVN checkout (described\nbelow), which has further requirements:\n\n  * Python version 2.3 or newer (for running some of the tests and\n    re-generating certain source files from templates)\n  * CMake 2.6.4 or newer\n\nGetting the Source\n------------------\n\nThere are two primary ways of getting Google Test's source code: you\ncan download a stable source release in your preferred archive format,\nor directly check out the source from our Subversion (SVN) repositary.\nThe SVN checkout requires a few extra steps and some extra software\npackages on your system, but lets you track the latest development and\nmake patches much more easily, so we highly encourage it.\n\n### Source Package ###\n\nGoogle Test is released in versioned source packages which can be\ndownloaded from the download page [1].  Several different archive\nformats are provided, but the only difference is the tools used to\nmanipulate them, and the size of the resulting file.  Download\nwhichever you are most comfortable with.\n\n  [1] http://code.google.com/p/googletest/downloads/list\n\nOnce the package is downloaded, expand it using whichever tools you\nprefer for that type.  This will result in a new directory with the\nname \"gtest-X.Y.Z\" which contains all of the source code.  Here are\nsome examples on Linux:\n\n  tar -xvzf gtest-X.Y.Z.tar.gz\n  tar -xvjf gtest-X.Y.Z.tar.bz2\n  unzip gtest-X.Y.Z.zip\n\n### SVN Checkout ###\n\nTo check out the main branch (also known as the \"trunk\") of Google\nTest, run the following Subversion command:\n\n  svn checkout http://googletest.googlecode.com/svn/trunk/ gtest-svn\n\nSetting up the Build\n--------------------\n\nTo build Google Test and your tests that use it, you need to tell your\nbuild system where to find its headers and source files.  The exact\nway to do it depends on which build system you use, and is usually\nstraightforward.\n\n### Generic Build Instructions ###\n\nSuppose you put Google Test in directory ${GTEST_DIR}.  To build it,\ncreate a library build target (or a project as called by Visual Studio\nand Xcode) to compile\n\n  ${GTEST_DIR}/src/gtest-all.cc\n\nwith\n\n  ${GTEST_DIR}/include and ${GTEST_DIR}\n\nin the header search path.  Assuming a Linux-like system and gcc,\nsomething like the following will do:\n\n  g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -c ${GTEST_DIR}/src/gtest-all.cc\n  ar -rv libgtest.a gtest-all.o\n\nNext, you should compile your test source file with\n${GTEST_DIR}/include in the header search path, and link it with gtest\nand any other necessary libraries:\n\n  g++ -I${GTEST_DIR}/include path/to/your_test.cc libgtest.a -o your_test\n\nAs an example, the make/ directory contains a Makefile that you can\nuse to build Google Test on systems where GNU make is available\n(e.g. Linux, Mac OS X, and Cygwin).  It doesn't try to build Google\nTest's own tests.  Instead, it just builds the Google Test library and\na sample test.  You can use it as a starting point for your own build\nscript.\n\nIf the default settings are correct for your environment, the\nfollowing commands should succeed:\n\n  cd ${GTEST_DIR}/make\n  make\n  ./sample1_unittest\n\nIf you see errors, try to tweak the contents of make/Makefile to make\nthem go away.  There are instructions in make/Makefile on how to do\nit.\n\n### Using CMake ###\n\nGoogle Test comes with a CMake build script (CMakeLists.txt) that can\nbe used on a wide range of platforms (\"C\" stands for cross-platofrm.).\nIf you don't have CMake installed already, you can download it for\nfree from http://www.cmake.org/.\n\nCMake works by generating native makefiles or build projects that can\nbe used in the compiler environment of your choice.  The typical\nworkflow starts with:\n\n  mkdir mybuild       # Create a directory to hold the build output.\n  cd mybuild\n  cmake ${GTEST_DIR}  # Generate native build scripts.\n\nIf you want to build Google Test's samples, you should replace the\nlast command with\n\n  cmake -Dbuild_gtest_samples=ON ${GTEST_DIR}\n\nIf you are on a *nix system, you should now see a Makefile in the\ncurrent directory.  Just type 'make' to build gtest.\n\nIf you use Windows and have Vistual Studio installed, a gtest.sln file\nand several .vcproj files will be created.  You can then build them\nusing Visual Studio.\n\nOn Mac OS X with Xcode installed, a .xcodeproj file will be generated.\n\n### Legacy Build Scripts ###\n\nBefore settling on CMake, we have been providing hand-maintained build\nprojects/scripts for Visual Studio, Xcode, and Autotools.  While we\ncontinue to provide them for convenience, they are not actively\nmaintained any more.  We highly recommend that you follow the\ninstructions in the previous two sections to integrate Google Test\nwith your existing build system.\n\nIf you still need to use the legacy build scripts, here's how:\n\nThe msvc\\ folder contains two solutions with Visual C++ projects.\nOpen the gtest.sln or gtest-md.sln file using Visual Studio, and you\nare ready to build Google Test the same way you build any Visual\nStudio project.  Files that have names ending with -md use DLL\nversions of Microsoft runtime libraries (the /MD or the /MDd compiler\noption).  Files without that suffix use static versions of the runtime\nlibraries (the /MT or the /MTd option).  Please note that one must use\nthe same option to compile both gtest and the test code.  If you use\nVisual Studio 2005 or above, we recommend the -md version as /MD is\nthe default for new projects in these versions of Visual Studio.\n\nOn Mac OS X, open the gtest.xcodeproj in the xcode/ folder using\nXcode.  Build the \"gtest\" target.  The universal binary framework will\nend up in your selected build directory (selected in the Xcode\n\"Preferences...\" -> \"Building\" pane and defaults to xcode/build).\nAlternatively, at the command line, enter:\n\n  xcodebuild\n\nThis will build the \"Release\" configuration of gtest.framework in your\ndefault build location.  See the \"xcodebuild\" man page for more\ninformation about building different configurations and building in\ndifferent locations.\n\nTweaking Google Test\n--------------------\n\nGoogle Test can be used in diverse environments.  The default\nconfiguration may not work (or may not work well) out of the box in\nsome environments.  However, you can easily tweak Google Test by\ndefining control macros on the compiler command line.  Generally,\nthese macros are named like GTEST_XYZ and you define them to either 1\nor 0 to enable or disable a certain feature.\n\nWe list the most frequently used macros below.  For a complete list,\nsee file include/gtest/internal/gtest-port.h.\n\n### Choosing a TR1 Tuple Library ###\n\nSome Google Test features require the C++ Technical Report 1 (TR1)\ntuple library, which is not yet available with all compilers.  The\ngood news is that Google Test implements a subset of TR1 tuple that's\nenough for its own need, and will automatically use this when the\ncompiler doesn't provide TR1 tuple.\n\nUsually you don't need to care about which tuple library Google Test\nuses.  However, if your project already uses TR1 tuple, you need to\ntell Google Test to use the same TR1 tuple library the rest of your\nproject uses, or the two tuple implementations will clash.  To do\nthat, add\n\n  -DGTEST_USE_OWN_TR1_TUPLE=0\n\nto the compiler flags while compiling Google Test and your tests.  If\nyou want to force Google Test to use its own tuple library, just add\n\n  -DGTEST_USE_OWN_TR1_TUPLE=1\n\nto the compiler flags instead.\n\nIf you don't want Google Test to use tuple at all, add\n\n  -DGTEST_HAS_TR1_TUPLE=0\n\nand all features using tuple will be disabled.\n\n### Multi-threaded Tests ###\n\nGoogle Test is thread-safe where the pthread library is available.\nAfter #include <gtest/gtest.h>, you can check the GTEST_IS_THREADSAFE\nmacro to see whether this is the case (yes if the macro is #defined to\n1, no if it's undefined.).\n\nIf Google Test doesn't correctly detect whether pthread is available\nin your environment, you can force it with\n\n  -DGTEST_HAS_PTHREAD=1\n\nor\n\n  -DGTEST_HAS_PTHREAD=0\n\nWhen Google Test uses pthread, you may need to add flags to your\ncompiler and/or linker to select the pthread library, or you'll get\nlink errors.  If you use the CMake script or the deprecated Autotools\nscript, this is taken care of for you.  If you use your own build\nscript, you'll need to read your compiler and linker's manual to\nfigure out what flags to add.\n\n### As a Shared Library (DLL) ###\n\nGoogle Test is compact, so most users can build and link it as a\nstatic library for the simplicity.  You can choose to use Google Test\nas a shared library (known as a DLL on Windows) if you prefer.\n\nTo compile gtest as a shared library, add\n\n  -DGTEST_CREATE_SHARED_LIBRARY=1\n\nto the compiler flags.  You'll also need to tell the linker to produce\na shared library instead - consult your linker's manual for how to do\nit.\n\nTo compile your tests that use the gtest shared library, add\n\n  -DGTEST_LINKED_AS_SHARED_LIBRARY=1\n\nto the compiler flags.\n\n### Avoiding Macro Name Clashes ###\n\nIn C++, macros don't obey namespaces.  Therefore two libraries that\nboth define a macro of the same name will clash if you #include both\ndefinitions.  In case a Google Test macro clashes with another\nlibrary, you can force Google Test to rename its macro to avoid the\nconflict.\n\nSpecifically, if both Google Test and some other code define macro\nFOO, you can add\n\n  -DGTEST_DONT_DEFINE_FOO=1\n\nto the compiler flags to tell Google Test to change the macro's name\nfrom FOO to GTEST_FOO.  Currently FOO can be FAIL, SUCCEED, or TEST.\nFor example, with -DGTEST_DONT_DEFINE_TEST=1, you'll need to write\n\n  GTEST_TEST(SomeTest, DoesThis) { ... }\n\ninstead of\n\n  TEST(SomeTest, DoesThis) { ... }\n\nin order to define a test.\n\nUpgrating from an Earlier Version\n---------------------------------\n\nWe strive to keep Google Test releases backward compatible.\nSometimes, though, we have to make some breaking changes for the\nusers' long-term benefits.  This section describes what you'll need to\ndo if you are upgrading from an earlier version of Google Test.\n\n### Upgrading from 1.3.0 or Earlier ###\n\nYou may need to explicitly enable or disable Google Test's own TR1\ntuple library.  See the instructions in section \"Choosing a TR1 Tuple\nLibrary\".\n\n### Upgrading from 1.4.0 or Earlier ###\n\nThe Autotools build script (configure + make) is no longer officially\nsupportted.  You are encouraged to migrate to your own build system or\nuse CMake.  If you still need to use Autotools, you can find\ninstructions in the README file from Google Test 1.4.0.\n\nOn platforms where the pthread library is available, Google Test uses\nit in order to be thread-safe.  See the \"Multi-threaded Tests\" section\nfor what this means to your build script.\n\nIf you use Microsoft Visual C++ 7.1 with exceptions disabled, Google\nTest will no longer compile.  This should affect very few people, as a\nlarge portion of STL (including <string>) doesn't compile in this mode\nanyway.  We decided to stop supporting it in order to greatly simplify\nGoogle Test's implementation.\n\nDeveloping Google Test\n----------------------\n\nThis section discusses how to make your own changes to Google Test.\n\n### Testing Google Test Itself ###\n\nTo make sure your changes work as intended and don't break existing\nfunctionality, you'll want to compile and run Google Test's own tests.\nFor that you can use CMake:\n\n  mkdir mybuild\n  cd mybuild\n  cmake -Dbuild_all_gtest_tests=ON ${GTEST_DIR}\n\nMake sure you have Python installed, as some of Google Test's tests\nare written in Python.  If the cmake command complains about not being\nable to find Python (\"Could NOT find PythonInterp (missing:\nPYTHON_EXECUTABLE)\"), try telling it explicitly where your Python\nexecutable can be found:\n\n  cmake -DPYTHON_EXECUTABLE=path/to/python -Dbuild_all_gtest_tests=ON \\\n      ${GTEST_DIR}\n\nNext, you can build Google Test and all of its own tests.  On *nix,\nthis is usually done by 'make'.  To run the tests, do\n\n  make test\n\nAll tests should pass.\n\n### Regenerating Source Files ###\n\nSome of Google Test's source files are generated from templates (not\nin the C++ sense) using a script.  A template file is named FOO.pump,\nwhere FOO is the name of the file it will generate.  For example, the\nfile include/gtest/internal/gtest-type-util.h.pump is used to generate\ngtest-type-util.h in the same directory.\n\nNormally you don't need to worry about regenerating the source files,\nunless you need to modify them.  In that case, you should modify the\ncorresponding .pump files instead and run the pump.py Python script to\nregenerate them.  You can find pump.py in the scripts/ directory.\nRead the Pump manual [2] for how to use it.\n\n  [2] http://code.google.com/p/googletest/wiki/PumpManual\n\n### Contributing a Patch ###\n\nWe welcome patches.  Please read the Google Test developer's guide [3]\nfor how you can contribute.  In particular, make sure you have signed\nthe Contributor License Agreement, or we won't be able to accept the\npatch.\n\n  [3] http://code.google.com/p/googletest/wiki/GoogleTestDevGuide\n\nHappy testing!\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/build-aux/.keep",
    "content": ""
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.cbproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <PropertyGroup>\r\n    <ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>\r\n    <Config Condition=\"'$(Config)'==''\">Release</Config>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Config)'=='Base' or '$(Base)'!=''\">\r\n    <Base>true</Base>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Config)'=='Debug' or '$(Cfg_1)'!=''\">\r\n    <Base>true</Base>\r\n    <Cfg_1>true</Cfg_1>\r\n    <CfgParent>Base</CfgParent>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Config)'=='Release' or '$(Cfg_2)'!=''\">\r\n    <Base>true</Base>\r\n    <Cfg_2>true</Cfg_2>\r\n    <CfgParent>Base</CfgParent>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Base)'!=''\">\r\n    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>\r\n    <OutputExt>lib</OutputExt>\r\n    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>\r\n    <Defines>NO_STRICT</Defines>\r\n    <DynamicRTL>true</DynamicRTL>\r\n    <UsePackages>true</UsePackages>\r\n    <ProjectType>CppStaticLibrary</ProjectType>\r\n    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>\r\n    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi</PackageImports>\r\n    <BCC_wpar>false</BCC_wpar>\r\n    <IncludePath>$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\include;..</IncludePath>\r\n    <AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>\r\n    <TLIB_PageSize>32</TLIB_PageSize>\r\n    <ILINK_LibraryPath>$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk</ILINK_LibraryPath>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Cfg_1)'!=''\">\r\n    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>\r\n    <DCC_Optimize>false</DCC_Optimize>\r\n    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>\r\n    <Defines>_DEBUG;$(Defines)</Defines>\r\n    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>\r\n    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>\r\n    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>\r\n    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>\r\n    <DCC_Define>DEBUG</DCC_Define>\r\n    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>\r\n    <IntermediateOutputDir>Debug</IntermediateOutputDir>\r\n    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>\r\n    <BCC_StackFrames>true</BCC_StackFrames>\r\n    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>\r\n    <ILINK_LibraryPath>$(BDS)\\lib\\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>\r\n    <TASM_Debugging>Full</TASM_Debugging>\r\n    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Cfg_2)'!=''\">\r\n    <Defines>NDEBUG;$(Defines)</Defines>\r\n    <IntermediateOutputDir>Release</IntermediateOutputDir>\r\n    <ILINK_LibraryPath>$(BDS)\\lib\\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>\r\n    <TASM_Debugging>None</TASM_Debugging>\r\n  </PropertyGroup>\r\n  <ProjectExtensions>\r\n    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>\r\n    <Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>\r\n    <BorlandProject>\r\n<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name=\"IncludeVerInfo\">False</VersionInfo><VersionInfo Name=\"AutoIncBuild\">False</VersionInfo><VersionInfo Name=\"MajorVer\">1</VersionInfo><VersionInfo Name=\"MinorVer\">0</VersionInfo><VersionInfo Name=\"Release\">0</VersionInfo><VersionInfo Name=\"Build\">0</VersionInfo><VersionInfo Name=\"Debug\">False</VersionInfo><VersionInfo Name=\"PreRelease\">False</VersionInfo><VersionInfo Name=\"Special\">False</VersionInfo><VersionInfo Name=\"Private\">False</VersionInfo><VersionInfo Name=\"DLL\">False</VersionInfo><VersionInfo Name=\"Locale\">1033</VersionInfo><VersionInfo Name=\"CodePage\">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name=\"CompanyName\"></VersionInfoKeys><VersionInfoKeys Name=\"FileDescription\"></VersionInfoKeys><VersionInfoKeys Name=\"FileVersion\">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name=\"InternalName\"></VersionInfoKeys><VersionInfoKeys Name=\"LegalCopyright\"></VersionInfoKeys><VersionInfoKeys Name=\"LegalTrademarks\"></VersionInfoKeys><VersionInfoKeys Name=\"OriginalFilename\"></VersionInfoKeys><VersionInfoKeys Name=\"ProductName\"></VersionInfoKeys><VersionInfoKeys Name=\"ProductVersion\">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name=\"Comments\"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name=\"DebugSourceDirs\"></Debugging></Debugging><Parameters><Parameters Name=\"RunParams\"></Parameters><Parameters Name=\"Launcher\"></Parameters><Parameters Name=\"UseLauncher\">False</Parameters><Parameters Name=\"DebugCWD\"></Parameters><Parameters Name=\"HostApplication\"></Parameters><Parameters Name=\"RemoteHost\"></Parameters><Parameters Name=\"RemotePath\"></Parameters><Parameters Name=\"RemoteParams\"></Parameters><Parameters Name=\"RemoteLauncher\"></Parameters><Parameters Name=\"UseRemoteLauncher\">False</Parameters><Parameters Name=\"RemoteCWD\"></Parameters><Parameters Name=\"RemoteDebug\">False</Parameters><Parameters Name=\"Debug Symbols Search Path\"></Parameters><Parameters Name=\"LoadAllSymbols\">True</Parameters><Parameters Name=\"LoadUnspecifiedSymbols\">False</Parameters></Parameters><Excluded_Packages>\r\n      \r\n      \r\n      <Excluded_Packages Name=\"$(BDS)\\bin\\bcboffice2k100.bpl\">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>\r\n      <Excluded_Packages Name=\"$(BDS)\\bin\\bcbofficexp100.bpl\">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>\r\n    </Excluded_Packages><Linker><Linker Name=\"LibPrefix\"></Linker><Linker Name=\"LibSuffix\"></Linker><Linker Name=\"LibVersion\"></Linker></Linker><ProjectProperties><ProjectProperties Name=\"AutoShowDeps\">False</ProjectProperties><ProjectProperties Name=\"ManagePaths\">True</ProjectProperties><ProjectProperties Name=\"VerifyPackages\">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Count\">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item0\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item1\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item2\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\src;..\\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Count\">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Item0\">$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Count\">1</HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Item0\">NO_STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines><HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name=\"Count\">1</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name=\"Item0\">32</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name=\"Item1\">16</HistoryLists_hlTLIB_PageSize></HistoryLists_hlTLIB_PageSize></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>\r\n  </ProjectExtensions>\r\n  <Import Project=\"$(MSBuildBinPath)\\Borland.Cpp.Targets\" />\r\n  <ItemGroup>\r\n    <None Include=\"..\\include\\gtest\\gtest-death-test.h\">\r\n      <BuildOrder>3</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\gtest-message.h\">\r\n      <BuildOrder>4</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\gtest-param-test.h\">\r\n      <BuildOrder>5</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\gtest-spi.h\">\r\n      <BuildOrder>6</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\gtest-test-part.h\">\r\n      <BuildOrder>7</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\gtest-typed-test.h\">\r\n      <BuildOrder>8</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\gtest.h\">\r\n      <BuildOrder>0</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\gtest_pred_impl.h\">\r\n      <BuildOrder>1</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\gtest_prod.h\">\r\n      <BuildOrder>2</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\internal\\gtest-death-test-internal.h\">\r\n      <BuildOrder>9</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\internal\\gtest-filepath.h\">\r\n      <BuildOrder>10</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\internal\\gtest-internal.h\">\r\n      <BuildOrder>11</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\internal\\gtest-linked_ptr.h\">\r\n      <BuildOrder>12</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\internal\\gtest-param-util-generated.h\">\r\n      <BuildOrder>14</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\internal\\gtest-param-util.h\">\r\n      <BuildOrder>13</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\internal\\gtest-port.h\">\r\n      <BuildOrder>15</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\internal\\gtest-string.h\">\r\n      <BuildOrder>16</BuildOrder>\r\n    </None>\r\n    <None Include=\"..\\include\\gtest\\internal\\gtest-type-util.h\">\r\n      <BuildOrder>17</BuildOrder>\r\n    </None>\r\n    <CppCompile Include=\"gtest_all.cc\">\r\n      <BuildOrder>18</BuildOrder>\r\n    </CppCompile>\r\n    <BuildConfiguration Include=\"Debug\">\r\n      <Key>Cfg_1</Key>\r\n    </BuildConfiguration>\r\n    <BuildConfiguration Include=\"Release\">\r\n      <Key>Cfg_2</Key>\r\n    </BuildConfiguration>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.groupproj",
    "content": "﻿<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <PropertyGroup>\r\n    <ProjectGuid>{c1d923e0-6cba-4332-9b6f-3420acbf5091}</ProjectGuid>\r\n  </PropertyGroup>\r\n  <ItemGroup />\r\n  <ItemGroup>\r\n    <Projects Include=\"gtest.cbproj\" />\r\n    <Projects Include=\"gtest_main.cbproj\" />\r\n    <Projects Include=\"gtest_unittest.cbproj\" />\r\n  </ItemGroup>\r\n  <ProjectExtensions>\r\n    <Borland.Personality>Default.Personality</Borland.Personality>\r\n    <Borland.ProjectType />\r\n    <BorlandProject>\r\n<BorlandProject xmlns=\"\"><Default.Personality></Default.Personality></BorlandProject></BorlandProject>\r\n  </ProjectExtensions>\r\n  <Target Name=\"gtest\">\r\n    <MSBuild Projects=\"gtest.cbproj\" Targets=\"\" />\r\n  </Target>\r\n  <Target Name=\"gtest:Clean\">\r\n    <MSBuild Projects=\"gtest.cbproj\" Targets=\"Clean\" />\r\n  </Target>\r\n  <Target Name=\"gtest:Make\">\r\n    <MSBuild Projects=\"gtest.cbproj\" Targets=\"Make\" />\r\n  </Target>\r\n  <Target Name=\"gtest_main\">\r\n    <MSBuild Projects=\"gtest_main.cbproj\" Targets=\"\" />\r\n  </Target>\r\n  <Target Name=\"gtest_main:Clean\">\r\n    <MSBuild Projects=\"gtest_main.cbproj\" Targets=\"Clean\" />\r\n  </Target>\r\n  <Target Name=\"gtest_main:Make\">\r\n    <MSBuild Projects=\"gtest_main.cbproj\" Targets=\"Make\" />\r\n  </Target>\r\n  <Target Name=\"gtest_unittest\">\r\n    <MSBuild Projects=\"gtest_unittest.cbproj\" Targets=\"\" />\r\n  </Target>\r\n  <Target Name=\"gtest_unittest:Clean\">\r\n    <MSBuild Projects=\"gtest_unittest.cbproj\" Targets=\"Clean\" />\r\n  </Target>\r\n  <Target Name=\"gtest_unittest:Make\">\r\n    <MSBuild Projects=\"gtest_unittest.cbproj\" Targets=\"Make\" />\r\n  </Target>\r\n  <Target Name=\"Build\">\r\n    <CallTarget Targets=\"gtest;gtest_main;gtest_unittest\" />\r\n  </Target>\r\n  <Target Name=\"Clean\">\r\n    <CallTarget Targets=\"gtest:Clean;gtest_main:Clean;gtest_unittest:Clean\" />\r\n  </Target>\r\n  <Target Name=\"Make\">\r\n    <CallTarget Targets=\"gtest:Make;gtest_main:Make;gtest_unittest:Make\" />\r\n  </Target>\r\n  <Import Condition=\"Exists('$(MSBuildBinPath)\\Borland.Group.Targets')\" Project=\"$(MSBuildBinPath)\\Borland.Group.Targets\" />\r\n</Project>"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_all.cc",
    "content": "// Copyright 2009, Google Inc.\r\n// All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without\r\n// modification, are permitted provided that the following conditions are\r\n// met:\r\n//\r\n//     * Redistributions of source code must retain the above copyright\r\n// notice, this list of conditions and the following disclaimer.\r\n//     * Redistributions in binary form must reproduce the above\r\n// copyright notice, this list of conditions and the following disclaimer\r\n// in the documentation and/or other materials provided with the\r\n// distribution.\r\n//     * Neither the name of Google Inc. nor the names of its\r\n// contributors may be used to endorse or promote products derived from\r\n// this software without specific prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n//\r\n// Author: Josh Kelley (joshkel@gmail.com)\r\n//\r\n// Google C++ Testing Framework (Google Test)\r\n//\r\n// C++Builder's IDE cannot build a static library from files with hyphens\r\n// in their name.  See http://qc.codegear.com/wc/qcmain.aspx?d=70977 .\r\n// This file serves as a workaround.\r\n\r\n#include \"src/gtest-all.cc\"\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_link.cc",
    "content": "// Copyright 2009, Google Inc.\r\n// All rights reserved.\r\n//\r\n// Redistribution and use in source and binary forms, with or without\r\n// modification, are permitted provided that the following conditions are\r\n// met:\r\n//\r\n//     * Redistributions of source code must retain the above copyright\r\n// notice, this list of conditions and the following disclaimer.\r\n//     * Redistributions in binary form must reproduce the above\r\n// copyright notice, this list of conditions and the following disclaimer\r\n// in the documentation and/or other materials provided with the\r\n// distribution.\r\n//     * Neither the name of Google Inc. nor the names of its\r\n// contributors may be used to endorse or promote products derived from\r\n// this software without specific prior written permission.\r\n//\r\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n//\r\n// Author: Josh Kelley (joshkel@gmail.com)\r\n//\r\n// Google C++ Testing Framework (Google Test)\r\n//\r\n// Links gtest.lib and gtest_main.lib into the current project in C++Builder.\r\n// This means that these libraries can't be renamed, but it's the only way to\r\n// ensure that Debug versus Release test builds are linked against the\r\n// appropriate Debug or Release build of the libraries.\r\n\r\n#pragma link \"gtest.lib\"\r\n#pragma link \"gtest_main.lib\"\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_main.cbproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <PropertyGroup>\r\n    <ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>\r\n    <Config Condition=\"'$(Config)'==''\">Release</Config>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Config)'=='Base' or '$(Base)'!=''\">\r\n    <Base>true</Base>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Config)'=='Debug' or '$(Cfg_1)'!=''\">\r\n    <Base>true</Base>\r\n    <Cfg_1>true</Cfg_1>\r\n    <CfgParent>Base</CfgParent>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Config)'=='Release' or '$(Cfg_2)'!=''\">\r\n    <Base>true</Base>\r\n    <Cfg_2>true</Cfg_2>\r\n    <CfgParent>Base</CfgParent>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Base)'!=''\">\r\n    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>\r\n    <OutputExt>lib</OutputExt>\r\n    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>\r\n    <Defines>NO_STRICT</Defines>\r\n    <DynamicRTL>true</DynamicRTL>\r\n    <UsePackages>true</UsePackages>\r\n    <ProjectType>CppStaticLibrary</ProjectType>\r\n    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>\r\n    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi</PackageImports>\r\n    <BCC_wpar>false</BCC_wpar>\r\n    <IncludePath>$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\include;..</IncludePath>\r\n    <AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>\r\n    <TLIB_PageSize>32</TLIB_PageSize>\r\n    <ILINK_LibraryPath>$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk</ILINK_LibraryPath>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Cfg_1)'!=''\">\r\n    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>\r\n    <DCC_Optimize>false</DCC_Optimize>\r\n    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>\r\n    <Defines>_DEBUG;$(Defines)</Defines>\r\n    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>\r\n    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>\r\n    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>\r\n    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>\r\n    <DCC_Define>DEBUG</DCC_Define>\r\n    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>\r\n    <IntermediateOutputDir>Debug</IntermediateOutputDir>\r\n    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>\r\n    <BCC_StackFrames>true</BCC_StackFrames>\r\n    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>\r\n    <ILINK_LibraryPath>$(BDS)\\lib\\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>\r\n    <TASM_Debugging>Full</TASM_Debugging>\r\n    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Cfg_2)'!=''\">\r\n    <Defines>NDEBUG;$(Defines)</Defines>\r\n    <IntermediateOutputDir>Release</IntermediateOutputDir>\r\n    <ILINK_LibraryPath>$(BDS)\\lib\\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>\r\n    <TASM_Debugging>None</TASM_Debugging>\r\n  </PropertyGroup>\r\n  <ProjectExtensions>\r\n    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>\r\n    <Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>\r\n    <BorlandProject>\r\n<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name=\"IncludeVerInfo\">False</VersionInfo><VersionInfo Name=\"AutoIncBuild\">False</VersionInfo><VersionInfo Name=\"MajorVer\">1</VersionInfo><VersionInfo Name=\"MinorVer\">0</VersionInfo><VersionInfo Name=\"Release\">0</VersionInfo><VersionInfo Name=\"Build\">0</VersionInfo><VersionInfo Name=\"Debug\">False</VersionInfo><VersionInfo Name=\"PreRelease\">False</VersionInfo><VersionInfo Name=\"Special\">False</VersionInfo><VersionInfo Name=\"Private\">False</VersionInfo><VersionInfo Name=\"DLL\">False</VersionInfo><VersionInfo Name=\"Locale\">1033</VersionInfo><VersionInfo Name=\"CodePage\">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name=\"CompanyName\"></VersionInfoKeys><VersionInfoKeys Name=\"FileDescription\"></VersionInfoKeys><VersionInfoKeys Name=\"FileVersion\">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name=\"InternalName\"></VersionInfoKeys><VersionInfoKeys Name=\"LegalCopyright\"></VersionInfoKeys><VersionInfoKeys Name=\"LegalTrademarks\"></VersionInfoKeys><VersionInfoKeys Name=\"OriginalFilename\"></VersionInfoKeys><VersionInfoKeys Name=\"ProductName\"></VersionInfoKeys><VersionInfoKeys Name=\"ProductVersion\">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name=\"Comments\"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name=\"DebugSourceDirs\"></Debugging></Debugging><Parameters><Parameters Name=\"RunParams\"></Parameters><Parameters Name=\"Launcher\"></Parameters><Parameters Name=\"UseLauncher\">False</Parameters><Parameters Name=\"DebugCWD\"></Parameters><Parameters Name=\"HostApplication\"></Parameters><Parameters Name=\"RemoteHost\"></Parameters><Parameters Name=\"RemotePath\"></Parameters><Parameters Name=\"RemoteParams\"></Parameters><Parameters Name=\"RemoteLauncher\"></Parameters><Parameters Name=\"UseRemoteLauncher\">False</Parameters><Parameters Name=\"RemoteCWD\"></Parameters><Parameters Name=\"RemoteDebug\">False</Parameters><Parameters Name=\"Debug Symbols Search Path\"></Parameters><Parameters Name=\"LoadAllSymbols\">True</Parameters><Parameters Name=\"LoadUnspecifiedSymbols\">False</Parameters></Parameters><Excluded_Packages>\r\n      <Excluded_Packages Name=\"$(BDS)\\bin\\bcboffice2k100.bpl\">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>\r\n      <Excluded_Packages Name=\"$(BDS)\\bin\\bcbofficexp100.bpl\">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>\r\n    </Excluded_Packages><Linker><Linker Name=\"LibPrefix\"></Linker><Linker Name=\"LibSuffix\"></Linker><Linker Name=\"LibVersion\"></Linker></Linker><ProjectProperties><ProjectProperties Name=\"AutoShowDeps\">False</ProjectProperties><ProjectProperties Name=\"ManagePaths\">True</ProjectProperties><ProjectProperties Name=\"VerifyPackages\">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Count\">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item0\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item1\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\include;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item2\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\src;..\\src;..\\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Count\">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Item0\">$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Count\">1</HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Item0\">NO_STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines><HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name=\"Count\">1</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name=\"Item0\">32</HistoryLists_hlTLIB_PageSize><HistoryLists_hlTLIB_PageSize Name=\"Item1\">16</HistoryLists_hlTLIB_PageSize></HistoryLists_hlTLIB_PageSize></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>\r\n  </ProjectExtensions>\r\n  <Import Project=\"$(MSBuildBinPath)\\Borland.Cpp.Targets\" />\r\n  <ItemGroup>\r\n    <CppCompile Include=\"..\\src\\gtest_main.cc\">\r\n      <BuildOrder>0</BuildOrder>\r\n    </CppCompile>\r\n    <BuildConfiguration Include=\"Debug\">\r\n      <Key>Cfg_1</Key>\r\n    </BuildConfiguration>\r\n    <BuildConfiguration Include=\"Release\">\r\n      <Key>Cfg_2</Key>\r\n    </BuildConfiguration>\r\n  </ItemGroup>\r\n</Project>\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_unittest.cbproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <PropertyGroup>\r\n    <ProjectGuid>{eea63393-5ac5-4b9c-8909-d75fef2daa41}</ProjectGuid>\r\n    <Config Condition=\"'$(Config)'==''\">Release</Config>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Config)'=='Base' or '$(Base)'!=''\">\r\n    <Base>true</Base>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Config)'=='Debug' or '$(Cfg_1)'!=''\">\r\n    <Base>true</Base>\r\n    <Cfg_1>true</Cfg_1>\r\n    <CfgParent>Base</CfgParent>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Config)'=='Release' or '$(Cfg_2)'!=''\">\r\n    <Base>true</Base>\r\n    <Cfg_2>true</Cfg_2>\r\n    <CfgParent>Base</CfgParent>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Base)'!=''\">\r\n    <OutputExt>exe</OutputExt>\r\n    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>\r\n    <Defines>NO_STRICT</Defines>\r\n    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>\r\n    <DynamicRTL>true</DynamicRTL>\r\n    <ILINK_ObjectSearchPath>..\\test</ILINK_ObjectSearchPath>\r\n    <UsePackages>true</UsePackages>\r\n    <ProjectType>CppConsoleApplication</ProjectType>\r\n    <NoVCL>true</NoVCL>\r\n    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>\r\n    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi</PackageImports>\r\n    <BCC_wpar>false</BCC_wpar>\r\n    <IncludePath>$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\include;..\\test;..</IncludePath>\r\n    <ILINK_LibraryPath>$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk;..\\test</ILINK_LibraryPath>\r\n    <Multithreaded>true</Multithreaded>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Cfg_1)'!=''\">\r\n    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>\r\n    <DCC_Optimize>false</DCC_Optimize>\r\n    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>\r\n    <Defines>_DEBUG;$(Defines)</Defines>\r\n    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>\r\n    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>\r\n    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>\r\n    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>\r\n    <DCC_Define>DEBUG</DCC_Define>\r\n    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>\r\n    <IntermediateOutputDir>Debug</IntermediateOutputDir>\r\n    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>\r\n    <BCC_StackFrames>true</BCC_StackFrames>\r\n    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>\r\n    <ILINK_LibraryPath>$(BDS)\\lib\\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>\r\n    <TASM_Debugging>Full</TASM_Debugging>\r\n    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Cfg_2)'!=''\">\r\n    <Defines>NDEBUG;$(Defines)</Defines>\r\n    <IntermediateOutputDir>Release</IntermediateOutputDir>\r\n    <ILINK_LibraryPath>$(BDS)\\lib\\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>\r\n    <TASM_Debugging>None</TASM_Debugging>\r\n  </PropertyGroup>\r\n  <ProjectExtensions>\r\n    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>\r\n    <Borland.ProjectType>CppConsoleApplication</Borland.ProjectType>\r\n    <BorlandProject>\r\n<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name=\"IncludeVerInfo\">False</VersionInfo><VersionInfo Name=\"AutoIncBuild\">False</VersionInfo><VersionInfo Name=\"MajorVer\">1</VersionInfo><VersionInfo Name=\"MinorVer\">0</VersionInfo><VersionInfo Name=\"Release\">0</VersionInfo><VersionInfo Name=\"Build\">0</VersionInfo><VersionInfo Name=\"Debug\">False</VersionInfo><VersionInfo Name=\"PreRelease\">False</VersionInfo><VersionInfo Name=\"Special\">False</VersionInfo><VersionInfo Name=\"Private\">False</VersionInfo><VersionInfo Name=\"DLL\">False</VersionInfo><VersionInfo Name=\"Locale\">1033</VersionInfo><VersionInfo Name=\"CodePage\">1252</VersionInfo></VersionInfo><VersionInfoKeys><VersionInfoKeys Name=\"CompanyName\"></VersionInfoKeys><VersionInfoKeys Name=\"FileDescription\"></VersionInfoKeys><VersionInfoKeys Name=\"FileVersion\">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name=\"InternalName\"></VersionInfoKeys><VersionInfoKeys Name=\"LegalCopyright\"></VersionInfoKeys><VersionInfoKeys Name=\"LegalTrademarks\"></VersionInfoKeys><VersionInfoKeys Name=\"OriginalFilename\"></VersionInfoKeys><VersionInfoKeys Name=\"ProductName\"></VersionInfoKeys><VersionInfoKeys Name=\"ProductVersion\">1.0.0.0</VersionInfoKeys><VersionInfoKeys Name=\"Comments\"></VersionInfoKeys></VersionInfoKeys><Debugging><Debugging Name=\"DebugSourceDirs\"></Debugging></Debugging><Parameters><Parameters Name=\"RunParams\"></Parameters><Parameters Name=\"Launcher\"></Parameters><Parameters Name=\"UseLauncher\">False</Parameters><Parameters Name=\"DebugCWD\"></Parameters><Parameters Name=\"HostApplication\"></Parameters><Parameters Name=\"RemoteHost\"></Parameters><Parameters Name=\"RemotePath\"></Parameters><Parameters Name=\"RemoteParams\"></Parameters><Parameters Name=\"RemoteLauncher\"></Parameters><Parameters Name=\"UseRemoteLauncher\">False</Parameters><Parameters Name=\"RemoteCWD\"></Parameters><Parameters Name=\"RemoteDebug\">False</Parameters><Parameters Name=\"Debug Symbols Search Path\"></Parameters><Parameters Name=\"LoadAllSymbols\">True</Parameters><Parameters Name=\"LoadUnspecifiedSymbols\">False</Parameters></Parameters><Excluded_Packages>\r\n      \r\n      \r\n      <Excluded_Packages Name=\"$(BDS)\\bin\\bcboffice2k100.bpl\">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>\r\n      <Excluded_Packages Name=\"$(BDS)\\bin\\bcbofficexp100.bpl\">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>\r\n    </Excluded_Packages><Linker><Linker Name=\"LibPrefix\"></Linker><Linker Name=\"LibSuffix\"></Linker><Linker Name=\"LibVersion\"></Linker></Linker><ProjectProperties><ProjectProperties Name=\"AutoShowDeps\">False</ProjectProperties><ProjectProperties Name=\"ManagePaths\">True</ProjectProperties><ProjectProperties Name=\"VerifyPackages\">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Count\">3</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item0\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\include;..\\test;..</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item1\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\include;..\\test</HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name=\"Item2\">$(BDS)\\include;$(BDS)\\include\\dinkumware;$(BDS)\\include\\vcl;..\\include</HistoryLists_hlIncludePath></HistoryLists_hlIncludePath><HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Count\">1</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Item0\">$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk;..\\test</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Item1\">$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk;..\\test</HistoryLists_hlILINK_LibraryPath><HistoryLists_hlILINK_LibraryPath Name=\"Item2\">$(BDS)\\lib;$(BDS)\\lib\\obj;$(BDS)\\lib\\psdk;$(OUTPUTDIR);..\\test</HistoryLists_hlILINK_LibraryPath></HistoryLists_hlILINK_LibraryPath><HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Count\">2</HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Item0\">NO_STRICT</HistoryLists_hlDefines><HistoryLists_hlDefines Name=\"Item1\">STRICT</HistoryLists_hlDefines></HistoryLists_hlDefines></CPlusPlusBuilder.Personality></BorlandProject></BorlandProject>\r\n  </ProjectExtensions>\r\n  <Import Project=\"$(MSBuildBinPath)\\Borland.Cpp.Targets\" />\r\n  <ItemGroup>\r\n    <CppCompile Include=\"..\\test\\gtest_unittest.cc\">\r\n      <BuildOrder>0</BuildOrder>\r\n    </CppCompile>\r\n    <CppCompile Include=\"gtest_link.cc\">\r\n      <BuildOrder>1</BuildOrder>\r\n    </CppCompile>\r\n    <BuildConfiguration Include=\"Debug\">\r\n      <Key>Cfg_1</Key>\r\n    </BuildConfiguration>\r\n    <BuildConfiguration Include=\"Release\">\r\n      <Key>Cfg_2</Key>\r\n    </BuildConfiguration>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/configure.ac",
    "content": "m4_include(m4/acx_pthread.m4)\n\n# At this point, the Xcode project assumes the version string will be three\n# integers separated by periods and surrounded by square brackets (e.g.\n# \"[1.0.1]\"). It also asumes that there won't be any closing parenthesis\n# between \"AC_INIT(\" and the closing \")\" including comments and strings.\nAC_INIT([Google C++ Testing Framework],\n        [1.5.0],\n        [googletestframework@googlegroups.com],\n        [gtest])\n\n# Provide various options to initialize the Autoconf and configure processes.\nAC_PREREQ([2.59])\nAC_CONFIG_SRCDIR([./COPYING])\nAC_CONFIG_AUX_DIR([build-aux])\nAC_CONFIG_HEADERS([build-aux/config.h])\nAC_CONFIG_FILES([Makefile])\nAC_CONFIG_FILES([scripts/gtest-config], [chmod +x scripts/gtest-config])\n\n# Initialize Automake with various options. We require at least v1.9, prevent\n# pedantic complaints about package files, and enable various distribution\n# targets.\nAM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects])\n\n# Check for programs used in building Google Test.\nAC_PROG_CC\nAC_PROG_CXX\nAC_LANG([C++])\nAC_PROG_LIBTOOL\n\n# TODO(chandlerc@google.com): Currently we aren't running the Python tests\n# against the interpreter detected by AM_PATH_PYTHON, and so we condition\n# HAVE_PYTHON by requiring \"python\" to be in the PATH, and that interpreter's\n# version to be >= 2.3. This will allow the scripts to use a \"/usr/bin/env\"\n# hashbang.\nPYTHON=  # We *do not* allow the user to specify a python interpreter\nAC_PATH_PROG([PYTHON],[python],[:])\nAS_IF([test \"$PYTHON\" != \":\"],\n      [AM_PYTHON_CHECK_VERSION([$PYTHON],[2.3],[:],[PYTHON=\":\"])])\nAM_CONDITIONAL([HAVE_PYTHON],[test \"$PYTHON\" != \":\"])\n\n# Configure pthreads.\nAC_ARG_WITH([pthreads],\n            [AS_HELP_STRING([--with-pthreads],\n               [use pthreads (default is yes)])],\n            [with_pthreads=$withval],\n            [with_pthreads=check])\n\nhave_pthreads=no\nAS_IF([test \"x$with_pthreads\" != \"xno\"],\n      [ACX_PTHREAD(\n        [],\n        [AS_IF([test \"x$with_pthreads\" != \"xcheck\"],\n               [AC_MSG_FAILURE(\n                 [--with-pthreads was specified, but unable to be used])])])\n       have_pthreads=\"$acx_pthread_ok\"])\nAM_CONDITIONAL([HAVE_PTHREADS],[test \"x$have_pthreads\" == \"xyes\"])\nAC_SUBST(PTHREAD_CFLAGS)\nAC_SUBST(PTHREAD_LIBS)\n\n# TODO(chandlerc@google.com) Check for the necessary system headers.\n\n# TODO(chandlerc@google.com) Check the types, structures, and other compiler\n# and architecture characteristics.\n\n# Output the generated files. No further autoconf macros may be used.\nAC_OUTPUT\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-death-test.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This header file defines the public API for death tests.  It is\n// #included by gtest.h so a user doesn't need to include this\n// directly.\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_\n\n#include <gtest/internal/gtest-death-test-internal.h>\n\nnamespace testing {\n\n// This flag controls the style of death tests.  Valid values are \"threadsafe\",\n// meaning that the death test child process will re-execute the test binary\n// from the start, running only a single death test, or \"fast\",\n// meaning that the child process will execute the test logic immediately\n// after forking.\nGTEST_DECLARE_string_(death_test_style);\n\n#if GTEST_HAS_DEATH_TEST\n\n// The following macros are useful for writing death tests.\n\n// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is\n// executed:\n//\n//   1. It generates a warning if there is more than one active\n//   thread.  This is because it's safe to fork() or clone() only\n//   when there is a single thread.\n//\n//   2. The parent process clone()s a sub-process and runs the death\n//   test in it; the sub-process exits with code 0 at the end of the\n//   death test, if it hasn't exited already.\n//\n//   3. The parent process waits for the sub-process to terminate.\n//\n//   4. The parent process checks the exit code and error message of\n//   the sub-process.\n//\n// Examples:\n//\n//   ASSERT_DEATH(server.SendMessage(56, \"Hello\"), \"Invalid port number\");\n//   for (int i = 0; i < 5; i++) {\n//     EXPECT_DEATH(server.ProcessRequest(i),\n//                  \"Invalid request .* in ProcessRequest()\")\n//         << \"Failed to die on request \" << i);\n//   }\n//\n//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), \"Exiting\");\n//\n//   bool KilledBySIGHUP(int exit_code) {\n//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;\n//   }\n//\n//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, \"Hanging up!\");\n//\n// On the regular expressions used in death tests:\n//\n//   On POSIX-compliant systems (*nix), we use the <regex.h> library,\n//   which uses the POSIX extended regex syntax.\n//\n//   On other platforms (e.g. Windows), we only support a simple regex\n//   syntax implemented as part of Google Test.  This limited\n//   implementation should be enough most of the time when writing\n//   death tests; though it lacks many features you can find in PCRE\n//   or POSIX extended regex syntax.  For example, we don't support\n//   union (\"x|y\"), grouping (\"(xy)\"), brackets (\"[xy]\"), and\n//   repetition count (\"x{5,7}\"), among others.\n//\n//   Below is the syntax that we do support.  We chose it to be a\n//   subset of both PCRE and POSIX extended regex, so it's easy to\n//   learn wherever you come from.  In the following: 'A' denotes a\n//   literal character, period (.), or a single \\\\ escape sequence;\n//   'x' and 'y' denote regular expressions; 'm' and 'n' are for\n//   natural numbers.\n//\n//     c     matches any literal character c\n//     \\\\d   matches any decimal digit\n//     \\\\D   matches any character that's not a decimal digit\n//     \\\\f   matches \\f\n//     \\\\n   matches \\n\n//     \\\\r   matches \\r\n//     \\\\s   matches any ASCII whitespace, including \\n\n//     \\\\S   matches any character that's not a whitespace\n//     \\\\t   matches \\t\n//     \\\\v   matches \\v\n//     \\\\w   matches any letter, _, or decimal digit\n//     \\\\W   matches any character that \\\\w doesn't match\n//     \\\\c   matches any literal character c, which must be a punctuation\n//     .     matches any single character except \\n\n//     A?    matches 0 or 1 occurrences of A\n//     A*    matches 0 or many occurrences of A\n//     A+    matches 1 or many occurrences of A\n//     ^     matches the beginning of a string (not that of each line)\n//     $     matches the end of a string (not that of each line)\n//     xy    matches x followed by y\n//\n//   If you accidentally use PCRE or POSIX extended regex features\n//   not implemented by us, you will get a run-time failure.  In that\n//   case, please try to rewrite your regular expression within the\n//   above syntax.\n//\n//   This implementation is *not* meant to be as highly tuned or robust\n//   as a compiled regex library, but should perform well enough for a\n//   death test, which already incurs significant overhead by launching\n//   a child process.\n//\n// Known caveats:\n//\n//   A \"threadsafe\" style death test obtains the path to the test\n//   program from argv[0] and re-executes it in the sub-process.  For\n//   simplicity, the current implementation doesn't search the PATH\n//   when launching the sub-process.  This means that the user must\n//   invoke the test program via a path that contains at least one\n//   path separator (e.g. path/to/foo_test and\n//   /absolute/path/to/bar_test are fine, but foo_test is not).  This\n//   is rarely a problem as people usually don't put the test binary\n//   directory in PATH.\n//\n// TODO(wan@google.com): make thread-safe death tests search the PATH.\n\n// Asserts that a given statement causes the program to exit, with an\n// integer exit status that satisfies predicate, and emitting error output\n// that matches regex.\n#define ASSERT_EXIT(statement, predicate, regex) \\\n  GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)\n\n// Like ASSERT_EXIT, but continues on to successive tests in the\n// test case, if any:\n#define EXPECT_EXIT(statement, predicate, regex) \\\n  GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)\n\n// Asserts that a given statement causes the program to exit, either by\n// explicitly exiting with a nonzero exit code or being killed by a\n// signal, and emitting error output that matches regex.\n#define ASSERT_DEATH(statement, regex) \\\n  ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)\n\n// Like ASSERT_DEATH, but continues on to successive tests in the\n// test case, if any:\n#define EXPECT_DEATH(statement, regex) \\\n  EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)\n\n// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:\n\n// Tests that an exit code describes a normal exit with a given exit code.\nclass GTEST_API_ ExitedWithCode {\n public:\n  explicit ExitedWithCode(int exit_code);\n  bool operator()(int exit_status) const;\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ExitedWithCode& other);\n\n  const int exit_code_;\n};\n\n#if !GTEST_OS_WINDOWS\n// Tests that an exit code describes an exit due to termination by a\n// given signal.\nclass GTEST_API_ KilledBySignal {\n public:\n  explicit KilledBySignal(int signum);\n  bool operator()(int exit_status) const;\n private:\n  const int signum_;\n};\n#endif  // !GTEST_OS_WINDOWS\n\n// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.\n// The death testing framework causes this to have interesting semantics,\n// since the sideeffects of the call are only visible in opt mode, and not\n// in debug mode.\n//\n// In practice, this can be used to test functions that utilize the\n// LOG(DFATAL) macro using the following style:\n//\n// int DieInDebugOr12(int* sideeffect) {\n//   if (sideeffect) {\n//     *sideeffect = 12;\n//   }\n//   LOG(DFATAL) << \"death\";\n//   return 12;\n// }\n//\n// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {\n//   int sideeffect = 0;\n//   // Only asserts in dbg.\n//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), \"death\");\n//\n// #ifdef NDEBUG\n//   // opt-mode has sideeffect visible.\n//   EXPECT_EQ(12, sideeffect);\n// #else\n//   // dbg-mode no visible sideeffect.\n//   EXPECT_EQ(0, sideeffect);\n// #endif\n// }\n//\n// This will assert that DieInDebugReturn12InOpt() crashes in debug\n// mode, usually due to a DCHECK or LOG(DFATAL), but returns the\n// appropriate fallback value (12 in this case) in opt mode. If you\n// need to test that a function has appropriate side-effects in opt\n// mode, include assertions against the side-effects.  A general\n// pattern for this is:\n//\n// EXPECT_DEBUG_DEATH({\n//   // Side-effects here will have an effect after this statement in\n//   // opt mode, but none in debug mode.\n//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));\n// }, \"death\");\n//\n#ifdef NDEBUG\n\n#define EXPECT_DEBUG_DEATH(statement, regex) \\\n  do { statement; } while (::testing::internal::AlwaysFalse())\n\n#define ASSERT_DEBUG_DEATH(statement, regex) \\\n  do { statement; } while (::testing::internal::AlwaysFalse())\n\n#else\n\n#define EXPECT_DEBUG_DEATH(statement, regex) \\\n  EXPECT_DEATH(statement, regex)\n\n#define ASSERT_DEBUG_DEATH(statement, regex) \\\n  ASSERT_DEATH(statement, regex)\n\n#endif  // NDEBUG for EXPECT_DEBUG_DEATH\n#endif  // GTEST_HAS_DEATH_TEST\n\n// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and\n// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if\n// death tests are supported; otherwise they just issue a warning.  This is\n// useful when you are combining death test assertions with normal test\n// assertions in one test.\n#if GTEST_HAS_DEATH_TEST\n#define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \\\n    EXPECT_DEATH(statement, regex)\n#define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \\\n    ASSERT_DEATH(statement, regex)\n#else\n#define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \\\n    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )\n#define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \\\n    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)\n#endif\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-message.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This header file defines the Message class.\n//\n// IMPORTANT NOTE: Due to limitation of the C++ language, we have to\n// leave some internal implementation details in this header file.\n// They are clearly marked by comments like this:\n//\n//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n//\n// Such code is NOT meant to be used by a user directly, and is subject\n// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user\n// program!\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_\n#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_\n\n#include <limits>\n\n#include <gtest/internal/gtest-string.h>\n#include <gtest/internal/gtest-internal.h>\n\nnamespace testing {\n\n// The Message class works like an ostream repeater.\n//\n// Typical usage:\n//\n//   1. You stream a bunch of values to a Message object.\n//      It will remember the text in a StrStream.\n//   2. Then you stream the Message object to an ostream.\n//      This causes the text in the Message to be streamed\n//      to the ostream.\n//\n// For example;\n//\n//   testing::Message foo;\n//   foo << 1 << \" != \" << 2;\n//   std::cout << foo;\n//\n// will print \"1 != 2\".\n//\n// Message is not intended to be inherited from.  In particular, its\n// destructor is not virtual.\n//\n// Note that StrStream behaves differently in gcc and in MSVC.  You\n// can stream a NULL char pointer to it in the former, but not in the\n// latter (it causes an access violation if you do).  The Message\n// class hides this difference by treating a NULL char pointer as\n// \"(null)\".\nclass GTEST_API_ Message {\n private:\n  // The type of basic IO manipulators (endl, ends, and flush) for\n  // narrow streams.\n  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);\n\n public:\n  // Constructs an empty Message.\n  // We allocate the StrStream separately because it otherwise each use of\n  // ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's\n  // stack frame leading to huge stack frames in some cases; gcc does not reuse\n  // the stack space.\n  Message() : ss_(new internal::StrStream) {\n    // By default, we want there to be enough precision when printing\n    // a double to a Message.\n    *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);\n  }\n\n  // Copy constructor.\n  Message(const Message& msg) : ss_(new internal::StrStream) {  // NOLINT\n    *ss_ << msg.GetString();\n  }\n\n  // Constructs a Message from a C-string.\n  explicit Message(const char* str) : ss_(new internal::StrStream) {\n    *ss_ << str;\n  }\n\n  ~Message() { delete ss_; }\n#if GTEST_OS_SYMBIAN\n  // Streams a value (either a pointer or not) to this object.\n  template <typename T>\n  inline Message& operator <<(const T& value) {\n    StreamHelper(typename internal::is_pointer<T>::type(), value);\n    return *this;\n  }\n#else\n  // Streams a non-pointer value to this object.\n  template <typename T>\n  inline Message& operator <<(const T& val) {\n    ::GTestStreamToHelper(ss_, val);\n    return *this;\n  }\n\n  // Streams a pointer value to this object.\n  //\n  // This function is an overload of the previous one.  When you\n  // stream a pointer to a Message, this definition will be used as it\n  // is more specialized.  (The C++ Standard, section\n  // [temp.func.order].)  If you stream a non-pointer, then the\n  // previous definition will be used.\n  //\n  // The reason for this overload is that streaming a NULL pointer to\n  // ostream is undefined behavior.  Depending on the compiler, you\n  // may get \"0\", \"(nil)\", \"(null)\", or an access violation.  To\n  // ensure consistent result across compilers, we always treat NULL\n  // as \"(null)\".\n  template <typename T>\n  inline Message& operator <<(T* const& pointer) {  // NOLINT\n    if (pointer == NULL) {\n      *ss_ << \"(null)\";\n    } else {\n      ::GTestStreamToHelper(ss_, pointer);\n    }\n    return *this;\n  }\n#endif  // GTEST_OS_SYMBIAN\n\n  // Since the basic IO manipulators are overloaded for both narrow\n  // and wide streams, we have to provide this specialized definition\n  // of operator <<, even though its body is the same as the\n  // templatized version above.  Without this definition, streaming\n  // endl or other basic IO manipulators to Message will confuse the\n  // compiler.\n  Message& operator <<(BasicNarrowIoManip val) {\n    *ss_ << val;\n    return *this;\n  }\n\n  // Instead of 1/0, we want to see true/false for bool values.\n  Message& operator <<(bool b) {\n    return *this << (b ? \"true\" : \"false\");\n  }\n\n  // These two overloads allow streaming a wide C string to a Message\n  // using the UTF-8 encoding.\n  Message& operator <<(const wchar_t* wide_c_str) {\n    return *this << internal::String::ShowWideCString(wide_c_str);\n  }\n  Message& operator <<(wchar_t* wide_c_str) {\n    return *this << internal::String::ShowWideCString(wide_c_str);\n  }\n\n#if GTEST_HAS_STD_WSTRING\n  // Converts the given wide string to a narrow string using the UTF-8\n  // encoding, and streams the result to this Message object.\n  Message& operator <<(const ::std::wstring& wstr);\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_HAS_GLOBAL_WSTRING\n  // Converts the given wide string to a narrow string using the UTF-8\n  // encoding, and streams the result to this Message object.\n  Message& operator <<(const ::wstring& wstr);\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n  // Gets the text streamed to this object so far as a String.\n  // Each '\\0' character in the buffer is replaced with \"\\\\0\".\n  //\n  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n  internal::String GetString() const {\n    return internal::StrStreamToString(ss_);\n  }\n\n private:\n#if GTEST_OS_SYMBIAN\n  // These are needed as the Nokia Symbian Compiler cannot decide between\n  // const T& and const T* in a function template. The Nokia compiler _can_\n  // decide between class template specializations for T and T*, so a\n  // tr1::type_traits-like is_pointer works, and we can overload on that.\n  template <typename T>\n  inline void StreamHelper(internal::true_type /*dummy*/, T* pointer) {\n    if (pointer == NULL) {\n      *ss_ << \"(null)\";\n    } else {\n      ::GTestStreamToHelper(ss_, pointer);\n    }\n  }\n  template <typename T>\n  inline void StreamHelper(internal::false_type /*dummy*/, const T& value) {\n    ::GTestStreamToHelper(ss_, value);\n  }\n#endif  // GTEST_OS_SYMBIAN\n\n  // We'll hold the text streamed to this object here.\n  internal::StrStream* const ss_;\n\n  // We declare (but don't implement) this to prevent the compiler\n  // from implementing the assignment operator.\n  void operator=(const Message&);\n};\n\n// Streams a Message to an ostream.\ninline std::ostream& operator <<(std::ostream& os, const Message& sb) {\n  return os << sb.GetString();\n}\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h",
    "content": "// This file was GENERATED by a script.  DO NOT EDIT BY HAND!!!\n\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: vladl@google.com (Vlad Losev)\n//\n// Macros and functions for implementing parameterized tests\n// in Google C++ Testing Framework (Google Test)\n//\n// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n\n\n// Value-parameterized tests allow you to test your code with different\n// parameters without writing multiple copies of the same test.\n//\n// Here is how you use value-parameterized tests:\n\n#if 0\n\n// To write value-parameterized tests, first you should define a fixture\n// class. It must be derived from testing::TestWithParam<T>, where T is\n// the type of your parameter values. TestWithParam<T> is itself derived\n// from testing::Test. T can be any copyable type. If it's a raw pointer,\n// you are responsible for managing the lifespan of the pointed values.\n\nclass FooTest : public ::testing::TestWithParam<const char*> {\n  // You can implement all the usual class fixture members here.\n};\n\n// Then, use the TEST_P macro to define as many parameterized tests\n// for this fixture as you want. The _P suffix is for \"parameterized\"\n// or \"pattern\", whichever you prefer to think.\n\nTEST_P(FooTest, DoesBlah) {\n  // Inside a test, access the test parameter with the GetParam() method\n  // of the TestWithParam<T> class:\n  EXPECT_TRUE(foo.Blah(GetParam()));\n  ...\n}\n\nTEST_P(FooTest, HasBlahBlah) {\n  ...\n}\n\n// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test\n// case with any set of parameters you want. Google Test defines a number\n// of functions for generating test parameters. They return what we call\n// (surprise!) parameter generators. Here is a  summary of them, which\n// are all in the testing namespace:\n//\n//\n//  Range(begin, end [, step]) - Yields values {begin, begin+step,\n//                               begin+step+step, ...}. The values do not\n//                               include end. step defaults to 1.\n//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.\n//  ValuesIn(container)        - Yields values from a C-style array, an STL\n//  ValuesIn(begin,end)          container, or an iterator range [begin, end).\n//  Bool()                     - Yields sequence {false, true}.\n//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product\n//                               for the math savvy) of the values generated\n//                               by the N generators.\n//\n// For more details, see comments at the definitions of these functions below\n// in this file.\n//\n// The following statement will instantiate tests from the FooTest test case\n// each with parameter values \"meeny\", \"miny\", and \"moe\".\n\nINSTANTIATE_TEST_CASE_P(InstantiationName,\n                        FooTest,\n                        Values(\"meeny\", \"miny\", \"moe\"));\n\n// To distinguish different instances of the pattern, (yes, you\n// can instantiate it more then once) the first argument to the\n// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the\n// actual test case name. Remember to pick unique prefixes for different\n// instantiations. The tests from the instantiation above will have\n// these names:\n//\n//    * InstantiationName/FooTest.DoesBlah/0 for \"meeny\"\n//    * InstantiationName/FooTest.DoesBlah/1 for \"miny\"\n//    * InstantiationName/FooTest.DoesBlah/2 for \"moe\"\n//    * InstantiationName/FooTest.HasBlahBlah/0 for \"meeny\"\n//    * InstantiationName/FooTest.HasBlahBlah/1 for \"miny\"\n//    * InstantiationName/FooTest.HasBlahBlah/2 for \"moe\"\n//\n// You can use these names in --gtest_filter.\n//\n// This statement will instantiate all tests from FooTest again, each\n// with parameter values \"cat\" and \"dog\":\n\nconst char* pets[] = {\"cat\", \"dog\"};\nINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));\n\n// The tests from the instantiation above will have these names:\n//\n//    * AnotherInstantiationName/FooTest.DoesBlah/0 for \"cat\"\n//    * AnotherInstantiationName/FooTest.DoesBlah/1 for \"dog\"\n//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for \"cat\"\n//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for \"dog\"\n//\n// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests\n// in the given test case, whether their definitions come before or\n// AFTER the INSTANTIATE_TEST_CASE_P statement.\n//\n// Please also note that generator expressions (including parameters to the\n// generators) are evaluated in InitGoogleTest(), after main() has started.\n// This allows the user on one hand, to adjust generator parameters in order\n// to dynamically determine a set of tests to run and on the other hand,\n// give the user a chance to inspect the generated tests with Google Test\n// reflection API before RUN_ALL_TESTS() is executed.\n//\n// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc\n// for more examples.\n//\n// In the future, we plan to publish the API for defining new parameter\n// generators. But for now this interface remains part of the internal\n// implementation and is subject to change.\n\n#endif  // 0\n\n#include <gtest/internal/gtest-port.h>\n\n#if !GTEST_OS_SYMBIAN\n#include <utility>\n#endif\n\n// scripts/fuse_gtest.py depends on gtest's own header being #included\n// *unconditionally*.  Therefore these #includes cannot be moved\n// inside #if GTEST_HAS_PARAM_TEST.\n#include <gtest/internal/gtest-internal.h>\n#include <gtest/internal/gtest-param-util.h>\n#include <gtest/internal/gtest-param-util-generated.h>\n\n#if GTEST_HAS_PARAM_TEST\n\nnamespace testing {\n\n// Functions producing parameter generators.\n//\n// Google Test uses these generators to produce parameters for value-\n// parameterized tests. When a parameterized test case is instantiated\n// with a particular generator, Google Test creates and runs tests\n// for each element in the sequence produced by the generator.\n//\n// In the following sample, tests from test case FooTest are instantiated\n// each three times with parameter values 3, 5, and 8:\n//\n// class FooTest : public TestWithParam<int> { ... };\n//\n// TEST_P(FooTest, TestThis) {\n// }\n// TEST_P(FooTest, TestThat) {\n// }\n// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));\n//\n\n// Range() returns generators providing sequences of values in a range.\n//\n// Synopsis:\n// Range(start, end)\n//   - returns a generator producing a sequence of values {start, start+1,\n//     start+2, ..., }.\n// Range(start, end, step)\n//   - returns a generator producing a sequence of values {start, start+step,\n//     start+step+step, ..., }.\n// Notes:\n//   * The generated sequences never include end. For example, Range(1, 5)\n//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)\n//     returns a generator producing {1, 3, 5, 7}.\n//   * start and end must have the same type. That type may be any integral or\n//     floating-point type or a user defined type satisfying these conditions:\n//     * It must be assignable (have operator=() defined).\n//     * It must have operator+() (operator+(int-compatible type) for\n//       two-operand version).\n//     * It must have operator<() defined.\n//     Elements in the resulting sequences will also have that type.\n//   * Condition start < end must be satisfied in order for resulting sequences\n//     to contain any elements.\n//\ntemplate <typename T, typename IncrementT>\ninternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {\n  return internal::ParamGenerator<T>(\n      new internal::RangeGenerator<T, IncrementT>(start, end, step));\n}\n\ntemplate <typename T>\ninternal::ParamGenerator<T> Range(T start, T end) {\n  return Range(start, end, 1);\n}\n\n// ValuesIn() function allows generation of tests with parameters coming from\n// a container.\n//\n// Synopsis:\n// ValuesIn(const T (&array)[N])\n//   - returns a generator producing sequences with elements from\n//     a C-style array.\n// ValuesIn(const Container& container)\n//   - returns a generator producing sequences with elements from\n//     an STL-style container.\n// ValuesIn(Iterator begin, Iterator end)\n//   - returns a generator producing sequences with elements from\n//     a range [begin, end) defined by a pair of STL-style iterators. These\n//     iterators can also be plain C pointers.\n//\n// Please note that ValuesIn copies the values from the containers\n// passed in and keeps them to generate tests in RUN_ALL_TESTS().\n//\n// Examples:\n//\n// This instantiates tests from test case StringTest\n// each with C-string values of \"foo\", \"bar\", and \"baz\":\n//\n// const char* strings[] = {\"foo\", \"bar\", \"baz\"};\n// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));\n//\n// This instantiates tests from test case StlStringTest\n// each with STL strings with values \"a\" and \"b\":\n//\n// ::std::vector< ::std::string> GetParameterStrings() {\n//   ::std::vector< ::std::string> v;\n//   v.push_back(\"a\");\n//   v.push_back(\"b\");\n//   return v;\n// }\n//\n// INSTANTIATE_TEST_CASE_P(CharSequence,\n//                         StlStringTest,\n//                         ValuesIn(GetParameterStrings()));\n//\n//\n// This will also instantiate tests from CharTest\n// each with parameter values 'a' and 'b':\n//\n// ::std::list<char> GetParameterChars() {\n//   ::std::list<char> list;\n//   list.push_back('a');\n//   list.push_back('b');\n//   return list;\n// }\n// ::std::list<char> l = GetParameterChars();\n// INSTANTIATE_TEST_CASE_P(CharSequence2,\n//                         CharTest,\n//                         ValuesIn(l.begin(), l.end()));\n//\ntemplate <typename ForwardIterator>\ninternal::ParamGenerator<\n    typename ::std::iterator_traits<ForwardIterator>::value_type> ValuesIn(\n  ForwardIterator begin,\n  ForwardIterator end) {\n  typedef typename ::std::iterator_traits<ForwardIterator>::value_type\n      ParamType;\n  return internal::ParamGenerator<ParamType>(\n      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));\n}\n\ntemplate <typename T, size_t N>\ninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {\n  return ValuesIn(array, array + N);\n}\n\ntemplate <class Container>\ninternal::ParamGenerator<typename Container::value_type> ValuesIn(\n    const Container& container) {\n  return ValuesIn(container.begin(), container.end());\n}\n\n// Values() allows generating tests from explicitly specified list of\n// parameters.\n//\n// Synopsis:\n// Values(T v1, T v2, ..., T vN)\n//   - returns a generator producing sequences with elements v1, v2, ..., vN.\n//\n// For example, this instantiates tests from test case BarTest each\n// with values \"one\", \"two\", and \"three\":\n//\n// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values(\"one\", \"two\", \"three\"));\n//\n// This instantiates tests from test case BazTest each with values 1, 2, 3.5.\n// The exact type of values will depend on the type of parameter in BazTest.\n//\n// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));\n//\n// Currently, Values() supports from 1 to 50 parameters.\n//\ntemplate <typename T1>\ninternal::ValueArray1<T1> Values(T1 v1) {\n  return internal::ValueArray1<T1>(v1);\n}\n\ntemplate <typename T1, typename T2>\ninternal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {\n  return internal::ValueArray2<T1, T2>(v1, v2);\n}\n\ntemplate <typename T1, typename T2, typename T3>\ninternal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {\n  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\ninternal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {\n  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\ninternal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5) {\n  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\ninternal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,\n    T4 v4, T5 v5, T6 v6) {\n  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\ninternal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,\n    T4 v4, T5 v5, T6 v6, T7 v7) {\n  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,\n      v6, v7);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\ninternal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {\n  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,\n      v5, v6, v7, v8);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\ninternal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {\n  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,\n      v4, v5, v6, v7, v8, v9);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\ninternal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,\n    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {\n  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,\n      v2, v3, v4, v5, v6, v7, v8, v9, v10);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11>\ninternal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,\n    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11) {\n  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,\n      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12>\ninternal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12) {\n  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13>\ninternal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13) {\n  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14>\ninternal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {\n  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,\n      v14);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15>\ninternal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,\n    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {\n  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,\n      v13, v14, v15);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16>\ninternal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16) {\n  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,\n      v12, v13, v14, v15, v16);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17>\ninternal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17) {\n  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,\n      v11, v12, v13, v14, v15, v16, v17);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18>\ninternal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,\n    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18) {\n  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,\n      v10, v11, v12, v13, v14, v15, v16, v17, v18);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19>\ninternal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,\n    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,\n    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {\n  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,\n      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20>\ninternal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {\n  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,\n      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21>\ninternal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {\n  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,\n      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22>\ninternal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,\n    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22) {\n  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,\n      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23>\ninternal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23) {\n  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,\n      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22, v23);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24>\ninternal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23, T24 v24) {\n  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,\n      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,\n      v19, v20, v21, v22, v23, v24);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25>\ninternal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,\n    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,\n    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,\n    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {\n  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,\n      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,\n      v18, v19, v20, v21, v22, v23, v24, v25);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26>\ninternal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26) {\n  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,\n      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27>\ninternal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27) {\n  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,\n      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28>\ninternal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28) {\n  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,\n      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,\n      v28);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29>\ninternal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29) {\n  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,\n      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,\n      v27, v28, v29);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30>\ninternal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,\n    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,\n    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,\n    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {\n  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,\n      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,\n      v26, v27, v28, v29, v30);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31>\ninternal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {\n  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,\n      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,\n      v25, v26, v27, v28, v29, v30, v31);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32>\ninternal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32) {\n  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,\n      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,\n      v24, v25, v26, v27, v28, v29, v30, v31, v32);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33>\ninternal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,\n    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32, T33 v33) {\n  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,\n      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,\n      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34>\ninternal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,\n    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,\n    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,\n    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,\n    T31 v31, T32 v32, T33 v33, T34 v34) {\n  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,\n      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,\n      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35>\ninternal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,\n    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,\n    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {\n  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,\n      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,\n      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36>\ninternal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,\n    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,\n    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {\n  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,\n      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,\n      v34, v35, v36);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37>\ninternal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,\n    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,\n    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,\n    T37 v37) {\n  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,\n      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,\n      v34, v35, v36, v37);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38>\ninternal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,\n    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,\n    T37 v37, T38 v38) {\n  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,\n      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,\n      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,\n      v33, v34, v35, v36, v37, v38);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39>\ninternal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,\n    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,\n    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,\n    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,\n    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,\n    T37 v37, T38 v38, T39 v39) {\n  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,\n      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,\n      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,\n      v32, v33, v34, v35, v36, v37, v38, v39);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40>\ninternal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,\n    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,\n    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,\n    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,\n    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,\n    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {\n  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,\n      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,\n      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41>\ninternal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {\n  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,\n      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,\n      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42>\ninternal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n    T42 v42) {\n  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,\n      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,\n      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,\n      v42);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43>\ninternal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n    T42 v42, T43 v43) {\n  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,\n      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,\n      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,\n      v41, v42, v43);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44>\ninternal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n    T42 v42, T43 v43, T44 v44) {\n  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,\n      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,\n      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,\n      v40, v41, v42, v43, v44);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45>\ninternal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,\n    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,\n    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,\n    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,\n    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,\n    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {\n  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,\n      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,\n      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,\n      v39, v40, v41, v42, v43, v44, v45);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46>\ninternal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,\n    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {\n  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,\n      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,\n      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,\n      v38, v39, v40, v41, v42, v43, v44, v45, v46);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47>\ninternal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,\n    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {\n  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,\n      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,\n      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,\n      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48>\ninternal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,\n    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,\n    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,\n    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,\n    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,\n    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,\n    T48 v48) {\n  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,\n      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,\n      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,\n      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49>\ninternal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,\n    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,\n    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,\n    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,\n    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,\n    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,\n    T47 v47, T48 v48, T49 v49) {\n  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,\n      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,\n      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,\n      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49, typename T50>\ninternal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,\n    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,\n    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,\n    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,\n    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,\n    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,\n    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {\n  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,\n      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,\n      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,\n      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,\n      v48, v49, v50);\n}\n\n// Bool() allows generating tests with parameters in a set of (false, true).\n//\n// Synopsis:\n// Bool()\n//   - returns a generator producing sequences with elements {false, true}.\n//\n// It is useful when testing code that depends on Boolean flags. Combinations\n// of multiple flags can be tested when several Bool()'s are combined using\n// Combine() function.\n//\n// In the following example all tests in the test case FlagDependentTest\n// will be instantiated twice with parameters false and true.\n//\n// class FlagDependentTest : public testing::TestWithParam<bool> {\n//   virtual void SetUp() {\n//     external_flag = GetParam();\n//   }\n// }\n// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());\n//\ninline internal::ParamGenerator<bool> Bool() {\n  return Values(false, true);\n}\n\n#if GTEST_HAS_COMBINE\n// Combine() allows the user to combine two or more sequences to produce\n// values of a Cartesian product of those sequences' elements.\n//\n// Synopsis:\n// Combine(gen1, gen2, ..., genN)\n//   - returns a generator producing sequences with elements coming from\n//     the Cartesian product of elements from the sequences generated by\n//     gen1, gen2, ..., genN. The sequence elements will have a type of\n//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types\n//     of elements from sequences produces by gen1, gen2, ..., genN.\n//\n// Combine can have up to 10 arguments. This number is currently limited\n// by the maximum number of elements in the tuple implementation used by Google\n// Test.\n//\n// Example:\n//\n// This will instantiate tests in test case AnimalTest each one with\n// the parameter values tuple(\"cat\", BLACK), tuple(\"cat\", WHITE),\n// tuple(\"dog\", BLACK), and tuple(\"dog\", WHITE):\n//\n// enum Color { BLACK, GRAY, WHITE };\n// class AnimalTest\n//     : public testing::TestWithParam<tuple<const char*, Color> > {...};\n//\n// TEST_P(AnimalTest, AnimalLooksNice) {...}\n//\n// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,\n//                         Combine(Values(\"cat\", \"dog\"),\n//                                 Values(BLACK, WHITE)));\n//\n// This will instantiate tests in FlagDependentTest with all variations of two\n// Boolean flags:\n//\n// class FlagDependentTest\n//     : public testing::TestWithParam<tuple(bool, bool)> > {\n//   virtual void SetUp() {\n//     // Assigns external_flag_1 and external_flag_2 values from the tuple.\n//     tie(external_flag_1, external_flag_2) = GetParam();\n//   }\n// };\n//\n// TEST_P(FlagDependentTest, TestFeature1) {\n//   // Test your code using external_flag_1 and external_flag_2 here.\n// }\n// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,\n//                         Combine(Bool(), Bool()));\n//\ntemplate <typename Generator1, typename Generator2>\ninternal::CartesianProductHolder2<Generator1, Generator2> Combine(\n    const Generator1& g1, const Generator2& g2) {\n  return internal::CartesianProductHolder2<Generator1, Generator2>(\n      g1, g2);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3>\ninternal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3) {\n  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(\n      g1, g2, g3);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4>\ninternal::CartesianProductHolder4<Generator1, Generator2, Generator3,\n    Generator4> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4) {\n  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,\n      Generator4>(\n      g1, g2, g3, g4);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5>\ninternal::CartesianProductHolder5<Generator1, Generator2, Generator3,\n    Generator4, Generator5> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5) {\n  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,\n      Generator4, Generator5>(\n      g1, g2, g3, g4, g5);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6>\ninternal::CartesianProductHolder6<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6) {\n  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6>(\n      g1, g2, g3, g4, g5, g6);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6,\n    typename Generator7>\ninternal::CartesianProductHolder7<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6, Generator7> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6,\n        const Generator7& g7) {\n  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6, Generator7>(\n      g1, g2, g3, g4, g5, g6, g7);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6,\n    typename Generator7, typename Generator8>\ninternal::CartesianProductHolder8<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6,\n        const Generator7& g7, const Generator8& g8) {\n  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6, Generator7, Generator8>(\n      g1, g2, g3, g4, g5, g6, g7, g8);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6,\n    typename Generator7, typename Generator8, typename Generator9>\ninternal::CartesianProductHolder9<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6, Generator7, Generator8,\n    Generator9> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6,\n        const Generator7& g7, const Generator8& g8, const Generator9& g9) {\n  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(\n      g1, g2, g3, g4, g5, g6, g7, g8, g9);\n}\n\ntemplate <typename Generator1, typename Generator2, typename Generator3,\n    typename Generator4, typename Generator5, typename Generator6,\n    typename Generator7, typename Generator8, typename Generator9,\n    typename Generator10>\ninternal::CartesianProductHolder10<Generator1, Generator2, Generator3,\n    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,\n    Generator10> Combine(\n    const Generator1& g1, const Generator2& g2, const Generator3& g3,\n        const Generator4& g4, const Generator5& g5, const Generator6& g6,\n        const Generator7& g7, const Generator8& g8, const Generator9& g9,\n        const Generator10& g10) {\n  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,\n      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,\n      Generator10>(\n      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);\n}\n#endif  // GTEST_HAS_COMBINE\n\n\n\n#define TEST_P(test_case_name, test_name) \\\n  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \\\n      : public test_case_name { \\\n   public: \\\n    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \\\n    virtual void TestBody(); \\\n   private: \\\n    static int AddToRegistry() { \\\n      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \\\n          GetTestCasePatternHolder<test_case_name>(\\\n              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\\\n                  #test_case_name, \\\n                  #test_name, \\\n                  new ::testing::internal::TestMetaFactory< \\\n                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \\\n      return 0; \\\n    } \\\n    static int gtest_registering_dummy_; \\\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(\\\n        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \\\n  }; \\\n  int GTEST_TEST_CLASS_NAME_(test_case_name, \\\n                             test_name)::gtest_registering_dummy_ = \\\n      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \\\n  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()\n\n#define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \\\n  ::testing::internal::ParamGenerator<test_case_name::ParamType> \\\n      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \\\n  int gtest_##prefix##test_case_name##_dummy_ = \\\n      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \\\n          GetTestCasePatternHolder<test_case_name>(\\\n              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\\\n                  #prefix, \\\n                  &gtest_##prefix##test_case_name##_EvalGenerator_, \\\n                  __FILE__, __LINE__)\n\n}  // namespace testing\n\n#endif  // GTEST_HAS_PARAM_TEST\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$var n = 50  $$ Maximum length of Values arguments we want to support.\n$var maxtuple = 10  $$ Maximum number of Combine arguments we want to support.\n// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: vladl@google.com (Vlad Losev)\n//\n// Macros and functions for implementing parameterized tests\n// in Google C++ Testing Framework (Google Test)\n//\n// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n\n\n// Value-parameterized tests allow you to test your code with different\n// parameters without writing multiple copies of the same test.\n//\n// Here is how you use value-parameterized tests:\n\n#if 0\n\n// To write value-parameterized tests, first you should define a fixture\n// class. It must be derived from testing::TestWithParam<T>, where T is\n// the type of your parameter values. TestWithParam<T> is itself derived\n// from testing::Test. T can be any copyable type. If it's a raw pointer,\n// you are responsible for managing the lifespan of the pointed values.\n\nclass FooTest : public ::testing::TestWithParam<const char*> {\n  // You can implement all the usual class fixture members here.\n};\n\n// Then, use the TEST_P macro to define as many parameterized tests\n// for this fixture as you want. The _P suffix is for \"parameterized\"\n// or \"pattern\", whichever you prefer to think.\n\nTEST_P(FooTest, DoesBlah) {\n  // Inside a test, access the test parameter with the GetParam() method\n  // of the TestWithParam<T> class:\n  EXPECT_TRUE(foo.Blah(GetParam()));\n  ...\n}\n\nTEST_P(FooTest, HasBlahBlah) {\n  ...\n}\n\n// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test\n// case with any set of parameters you want. Google Test defines a number\n// of functions for generating test parameters. They return what we call\n// (surprise!) parameter generators. Here is a  summary of them, which\n// are all in the testing namespace:\n//\n//\n//  Range(begin, end [, step]) - Yields values {begin, begin+step,\n//                               begin+step+step, ...}. The values do not\n//                               include end. step defaults to 1.\n//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.\n//  ValuesIn(container)        - Yields values from a C-style array, an STL\n//  ValuesIn(begin,end)          container, or an iterator range [begin, end).\n//  Bool()                     - Yields sequence {false, true}.\n//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product\n//                               for the math savvy) of the values generated\n//                               by the N generators.\n//\n// For more details, see comments at the definitions of these functions below\n// in this file.\n//\n// The following statement will instantiate tests from the FooTest test case\n// each with parameter values \"meeny\", \"miny\", and \"moe\".\n\nINSTANTIATE_TEST_CASE_P(InstantiationName,\n                        FooTest,\n                        Values(\"meeny\", \"miny\", \"moe\"));\n\n// To distinguish different instances of the pattern, (yes, you\n// can instantiate it more then once) the first argument to the\n// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the\n// actual test case name. Remember to pick unique prefixes for different\n// instantiations. The tests from the instantiation above will have\n// these names:\n//\n//    * InstantiationName/FooTest.DoesBlah/0 for \"meeny\"\n//    * InstantiationName/FooTest.DoesBlah/1 for \"miny\"\n//    * InstantiationName/FooTest.DoesBlah/2 for \"moe\"\n//    * InstantiationName/FooTest.HasBlahBlah/0 for \"meeny\"\n//    * InstantiationName/FooTest.HasBlahBlah/1 for \"miny\"\n//    * InstantiationName/FooTest.HasBlahBlah/2 for \"moe\"\n//\n// You can use these names in --gtest_filter.\n//\n// This statement will instantiate all tests from FooTest again, each\n// with parameter values \"cat\" and \"dog\":\n\nconst char* pets[] = {\"cat\", \"dog\"};\nINSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));\n\n// The tests from the instantiation above will have these names:\n//\n//    * AnotherInstantiationName/FooTest.DoesBlah/0 for \"cat\"\n//    * AnotherInstantiationName/FooTest.DoesBlah/1 for \"dog\"\n//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for \"cat\"\n//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for \"dog\"\n//\n// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests\n// in the given test case, whether their definitions come before or\n// AFTER the INSTANTIATE_TEST_CASE_P statement.\n//\n// Please also note that generator expressions are evaluated in\n// RUN_ALL_TESTS(), after main() has started. This allows evaluation of\n// parameter list based on command line parameters.\n//\n// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc\n// for more examples.\n//\n// In the future, we plan to publish the API for defining new parameter\n// generators. But for now this interface remains part of the internal\n// implementation and is subject to change.\n\n#endif  // 0\n\n#include <gtest/internal/gtest-port.h>\n\n#if !GTEST_OS_SYMBIAN\n#include <utility>\n#endif\n\n// scripts/fuse_gtest.py depends on gtest's own header being #included\n// *unconditionally*.  Therefore these #includes cannot be moved\n// inside #if GTEST_HAS_PARAM_TEST.\n#include <gtest/internal/gtest-internal.h>\n#include <gtest/internal/gtest-param-util.h>\n#include <gtest/internal/gtest-param-util-generated.h>\n\n#if GTEST_HAS_PARAM_TEST\n\nnamespace testing {\n\n// Functions producing parameter generators.\n//\n// Google Test uses these generators to produce parameters for value-\n// parameterized tests. When a parameterized test case is instantiated\n// with a particular generator, Google Test creates and runs tests\n// for each element in the sequence produced by the generator.\n//\n// In the following sample, tests from test case FooTest are instantiated\n// each three times with parameter values 3, 5, and 8:\n//\n// class FooTest : public TestWithParam<int> { ... };\n//\n// TEST_P(FooTest, TestThis) {\n// }\n// TEST_P(FooTest, TestThat) {\n// }\n// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));\n//\n\n// Range() returns generators providing sequences of values in a range.\n//\n// Synopsis:\n// Range(start, end)\n//   - returns a generator producing a sequence of values {start, start+1,\n//     start+2, ..., }.\n// Range(start, end, step)\n//   - returns a generator producing a sequence of values {start, start+step,\n//     start+step+step, ..., }.\n// Notes:\n//   * The generated sequences never include end. For example, Range(1, 5)\n//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)\n//     returns a generator producing {1, 3, 5, 7}.\n//   * start and end must have the same type. That type may be any integral or\n//     floating-point type or a user defined type satisfying these conditions:\n//     * It must be assignable (have operator=() defined).\n//     * It must have operator+() (operator+(int-compatible type) for\n//       two-operand version).\n//     * It must have operator<() defined.\n//     Elements in the resulting sequences will also have that type.\n//   * Condition start < end must be satisfied in order for resulting sequences\n//     to contain any elements.\n//\ntemplate <typename T, typename IncrementT>\ninternal::ParamGenerator<T> Range(T start, T end, IncrementT step) {\n  return internal::ParamGenerator<T>(\n      new internal::RangeGenerator<T, IncrementT>(start, end, step));\n}\n\ntemplate <typename T>\ninternal::ParamGenerator<T> Range(T start, T end) {\n  return Range(start, end, 1);\n}\n\n// ValuesIn() function allows generation of tests with parameters coming from\n// a container.\n//\n// Synopsis:\n// ValuesIn(const T (&array)[N])\n//   - returns a generator producing sequences with elements from\n//     a C-style array.\n// ValuesIn(const Container& container)\n//   - returns a generator producing sequences with elements from\n//     an STL-style container.\n// ValuesIn(Iterator begin, Iterator end)\n//   - returns a generator producing sequences with elements from\n//     a range [begin, end) defined by a pair of STL-style iterators. These\n//     iterators can also be plain C pointers.\n//\n// Please note that ValuesIn copies the values from the containers\n// passed in and keeps them to generate tests in RUN_ALL_TESTS().\n//\n// Examples:\n//\n// This instantiates tests from test case StringTest\n// each with C-string values of \"foo\", \"bar\", and \"baz\":\n//\n// const char* strings[] = {\"foo\", \"bar\", \"baz\"};\n// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));\n//\n// This instantiates tests from test case StlStringTest\n// each with STL strings with values \"a\" and \"b\":\n//\n// ::std::vector< ::std::string> GetParameterStrings() {\n//   ::std::vector< ::std::string> v;\n//   v.push_back(\"a\");\n//   v.push_back(\"b\");\n//   return v;\n// }\n//\n// INSTANTIATE_TEST_CASE_P(CharSequence,\n//                         StlStringTest,\n//                         ValuesIn(GetParameterStrings()));\n//\n//\n// This will also instantiate tests from CharTest\n// each with parameter values 'a' and 'b':\n//\n// ::std::list<char> GetParameterChars() {\n//   ::std::list<char> list;\n//   list.push_back('a');\n//   list.push_back('b');\n//   return list;\n// }\n// ::std::list<char> l = GetParameterChars();\n// INSTANTIATE_TEST_CASE_P(CharSequence2,\n//                         CharTest,\n//                         ValuesIn(l.begin(), l.end()));\n//\ntemplate <typename ForwardIterator>\ninternal::ParamGenerator<\n    typename ::std::iterator_traits<ForwardIterator>::value_type> ValuesIn(\n  ForwardIterator begin,\n  ForwardIterator end) {\n  typedef typename ::std::iterator_traits<ForwardIterator>::value_type\n      ParamType;\n  return internal::ParamGenerator<ParamType>(\n      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));\n}\n\ntemplate <typename T, size_t N>\ninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {\n  return ValuesIn(array, array + N);\n}\n\ntemplate <class Container>\ninternal::ParamGenerator<typename Container::value_type> ValuesIn(\n    const Container& container) {\n  return ValuesIn(container.begin(), container.end());\n}\n\n// Values() allows generating tests from explicitly specified list of\n// parameters.\n//\n// Synopsis:\n// Values(T v1, T v2, ..., T vN)\n//   - returns a generator producing sequences with elements v1, v2, ..., vN.\n//\n// For example, this instantiates tests from test case BarTest each\n// with values \"one\", \"two\", and \"three\":\n//\n// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values(\"one\", \"two\", \"three\"));\n//\n// This instantiates tests from test case BazTest each with values 1, 2, 3.5.\n// The exact type of values will depend on the type of parameter in BazTest.\n//\n// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));\n//\n// Currently, Values() supports from 1 to $n parameters.\n//\n$range i 1..n\n$for i [[\n$range j 1..i\n\ntemplate <$for j, [[typename T$j]]>\ninternal::ValueArray$i<$for j, [[T$j]]> Values($for j, [[T$j v$j]]) {\n  return internal::ValueArray$i<$for j, [[T$j]]>($for j, [[v$j]]);\n}\n\n]]\n\n// Bool() allows generating tests with parameters in a set of (false, true).\n//\n// Synopsis:\n// Bool()\n//   - returns a generator producing sequences with elements {false, true}.\n//\n// It is useful when testing code that depends on Boolean flags. Combinations\n// of multiple flags can be tested when several Bool()'s are combined using\n// Combine() function.\n//\n// In the following example all tests in the test case FlagDependentTest\n// will be instantiated twice with parameters false and true.\n//\n// class FlagDependentTest : public testing::TestWithParam<bool> {\n//   virtual void SetUp() {\n//     external_flag = GetParam();\n//   }\n// }\n// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());\n//\ninline internal::ParamGenerator<bool> Bool() {\n  return Values(false, true);\n}\n\n#if GTEST_HAS_COMBINE\n// Combine() allows the user to combine two or more sequences to produce\n// values of a Cartesian product of those sequences' elements.\n//\n// Synopsis:\n// Combine(gen1, gen2, ..., genN)\n//   - returns a generator producing sequences with elements coming from\n//     the Cartesian product of elements from the sequences generated by\n//     gen1, gen2, ..., genN. The sequence elements will have a type of\n//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types\n//     of elements from sequences produces by gen1, gen2, ..., genN.\n//\n// Combine can have up to $maxtuple arguments. This number is currently limited\n// by the maximum number of elements in the tuple implementation used by Google\n// Test.\n//\n// Example:\n//\n// This will instantiate tests in test case AnimalTest each one with\n// the parameter values tuple(\"cat\", BLACK), tuple(\"cat\", WHITE),\n// tuple(\"dog\", BLACK), and tuple(\"dog\", WHITE):\n//\n// enum Color { BLACK, GRAY, WHITE };\n// class AnimalTest\n//     : public testing::TestWithParam<tuple<const char*, Color> > {...};\n//\n// TEST_P(AnimalTest, AnimalLooksNice) {...}\n//\n// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,\n//                         Combine(Values(\"cat\", \"dog\"),\n//                                 Values(BLACK, WHITE)));\n//\n// This will instantiate tests in FlagDependentTest with all variations of two\n// Boolean flags:\n//\n// class FlagDependentTest\n//     : public testing::TestWithParam<tuple(bool, bool)> > {\n//   virtual void SetUp() {\n//     // Assigns external_flag_1 and external_flag_2 values from the tuple.\n//     tie(external_flag_1, external_flag_2) = GetParam();\n//   }\n// };\n//\n// TEST_P(FlagDependentTest, TestFeature1) {\n//   // Test your code using external_flag_1 and external_flag_2 here.\n// }\n// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,\n//                         Combine(Bool(), Bool()));\n//\n$range i 2..maxtuple\n$for i [[\n$range j 1..i\n\ntemplate <$for j, [[typename Generator$j]]>\ninternal::CartesianProductHolder$i<$for j, [[Generator$j]]> Combine(\n    $for j, [[const Generator$j& g$j]]) {\n  return internal::CartesianProductHolder$i<$for j, [[Generator$j]]>(\n      $for j, [[g$j]]);\n}\n\n]]\n#endif  // GTEST_HAS_COMBINE\n\n\n\n#define TEST_P(test_case_name, test_name) \\\n  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \\\n      : public test_case_name { \\\n   public: \\\n    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \\\n    virtual void TestBody(); \\\n   private: \\\n    static int AddToRegistry() { \\\n      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \\\n          GetTestCasePatternHolder<test_case_name>(\\\n              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\\\n                  #test_case_name, \\\n                  #test_name, \\\n                  new ::testing::internal::TestMetaFactory< \\\n                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \\\n      return 0; \\\n    } \\\n    static int gtest_registering_dummy_; \\\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(\\\n        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \\\n  }; \\\n  int GTEST_TEST_CLASS_NAME_(test_case_name, \\\n                             test_name)::gtest_registering_dummy_ = \\\n      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \\\n  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()\n\n#define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \\\n  ::testing::internal::ParamGenerator<test_case_name::ParamType> \\\n      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \\\n  int gtest_##prefix##test_case_name##_dummy_ = \\\n      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \\\n          GetTestCasePatternHolder<test_case_name>(\\\n              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\\\n                  #prefix, \\\n                  &gtest_##prefix##test_case_name##_EvalGenerator_, \\\n                  __FILE__, __LINE__)\n\n}  // namespace testing\n\n#endif  // GTEST_HAS_PARAM_TEST\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-spi.h",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// Utilities for testing Google Test itself and code that uses Google Test\n// (e.g. frameworks built on top of Google Test).\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_\n#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_\n\n#include <gtest/gtest.h>\n\nnamespace testing {\n\n// This helper class can be used to mock out Google Test failure reporting\n// so that we can test Google Test or code that builds on Google Test.\n//\n// An object of this class appends a TestPartResult object to the\n// TestPartResultArray object given in the constructor whenever a Google Test\n// failure is reported. It can either intercept only failures that are\n// generated in the same thread that created this object or it can intercept\n// all generated failures. The scope of this mock object can be controlled with\n// the second argument to the two arguments constructor.\nclass GTEST_API_ ScopedFakeTestPartResultReporter\n    : public TestPartResultReporterInterface {\n public:\n  // The two possible mocking modes of this object.\n  enum InterceptMode {\n    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.\n    INTERCEPT_ALL_THREADS           // Intercepts all failures.\n  };\n\n  // The c'tor sets this object as the test part result reporter used\n  // by Google Test.  The 'result' parameter specifies where to report the\n  // results. This reporter will only catch failures generated in the current\n  // thread. DEPRECATED\n  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);\n\n  // Same as above, but you can choose the interception scope of this object.\n  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,\n                                   TestPartResultArray* result);\n\n  // The d'tor restores the previous test part result reporter.\n  virtual ~ScopedFakeTestPartResultReporter();\n\n  // Appends the TestPartResult object to the TestPartResultArray\n  // received in the constructor.\n  //\n  // This method is from the TestPartResultReporterInterface\n  // interface.\n  virtual void ReportTestPartResult(const TestPartResult& result);\n private:\n  void Init();\n\n  const InterceptMode intercept_mode_;\n  TestPartResultReporterInterface* old_reporter_;\n  TestPartResultArray* const result_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);\n};\n\nnamespace internal {\n\n// A helper class for implementing EXPECT_FATAL_FAILURE() and\n// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given\n// TestPartResultArray contains exactly one failure that has the given\n// type and contains the given substring.  If that's not the case, a\n// non-fatal failure will be generated.\nclass GTEST_API_ SingleFailureChecker {\n public:\n  // The constructor remembers the arguments.\n  SingleFailureChecker(const TestPartResultArray* results,\n                       TestPartResult::Type type,\n                       const char* substr);\n  ~SingleFailureChecker();\n private:\n  const TestPartResultArray* const results_;\n  const TestPartResult::Type type_;\n  const String substr_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);\n};\n\n}  // namespace internal\n\n}  // namespace testing\n\n// A set of macros for testing Google Test assertions or code that's expected\n// to generate Google Test fatal failures.  It verifies that the given\n// statement will cause exactly one fatal Google Test failure with 'substr'\n// being part of the failure message.\n//\n// There are two different versions of this macro. EXPECT_FATAL_FAILURE only\n// affects and considers failures generated in the current thread and\n// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.\n//\n// The verification of the assertion is done correctly even when the statement\n// throws an exception or aborts the current function.\n//\n// Known restrictions:\n//   - 'statement' cannot reference local non-static variables or\n//     non-static members of the current object.\n//   - 'statement' cannot return a value.\n//   - You cannot stream a failure message to this macro.\n//\n// Note that even though the implementations of the following two\n// macros are much alike, we cannot refactor them to use a common\n// helper macro, due to some peculiarity in how the preprocessor\n// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in\n// gtest_unittest.cc will fail to compile if we do that.\n#define EXPECT_FATAL_FAILURE(statement, substr) \\\n  do { \\\n    class GTestExpectFatalFailureHelper {\\\n     public:\\\n      static void Execute() { statement; }\\\n    };\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\\\n      GTestExpectFatalFailureHelper::Execute();\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \\\n  do { \\\n    class GTestExpectFatalFailureHelper {\\\n     public:\\\n      static void Execute() { statement; }\\\n    };\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ALL_THREADS, &gtest_failures);\\\n      GTestExpectFatalFailureHelper::Execute();\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n// A macro for testing Google Test assertions or code that's expected to\n// generate Google Test non-fatal failures.  It asserts that the given\n// statement will cause exactly one non-fatal Google Test failure with 'substr'\n// being part of the failure message.\n//\n// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only\n// affects and considers failures generated in the current thread and\n// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.\n//\n// 'statement' is allowed to reference local variables and members of\n// the current object.\n//\n// The verification of the assertion is done correctly even when the statement\n// throws an exception or aborts the current function.\n//\n// Known restrictions:\n//   - You cannot stream a failure message to this macro.\n//\n// Note that even though the implementations of the following two\n// macros are much alike, we cannot refactor them to use a common\n// helper macro, due to some peculiarity in how the preprocessor\n// works.  If we do that, the code won't compile when the user gives\n// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that\n// expands to code containing an unprotected comma.  The\n// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc\n// catches that.\n//\n// For the same reason, we have to write\n//   if (::testing::internal::AlwaysTrue()) { statement; }\n// instead of\n//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)\n// to avoid an MSVC warning on unreachable code.\n#define EXPECT_NONFATAL_FAILURE(statement, substr) \\\n  do {\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \\\n        (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter:: \\\n          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\\\n      if (::testing::internal::AlwaysTrue()) { statement; }\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \\\n  do {\\\n    ::testing::TestPartResultArray gtest_failures;\\\n    ::testing::internal::SingleFailureChecker gtest_checker(\\\n        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \\\n        (substr));\\\n    {\\\n      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\\\n          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\\\n          &gtest_failures);\\\n      if (::testing::internal::AlwaysTrue()) { statement; }\\\n    }\\\n  } while (::testing::internal::AlwaysFalse())\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-test-part.h",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: mheule@google.com (Markus Heule)\n//\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_\n#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_\n\n#include <iosfwd>\n#include <vector>\n#include <gtest/internal/gtest-internal.h>\n#include <gtest/internal/gtest-string.h>\n\nnamespace testing {\n\n// A copyable object representing the result of a test part (i.e. an\n// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).\n//\n// Don't inherit from TestPartResult as its destructor is not virtual.\nclass GTEST_API_ TestPartResult {\n public:\n  // The possible outcomes of a test part (i.e. an assertion or an\n  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).\n  enum Type {\n    kSuccess,          // Succeeded.\n    kNonFatalFailure,  // Failed but the test can continue.\n    kFatalFailure      // Failed and the test should be terminated.\n  };\n\n  // C'tor.  TestPartResult does NOT have a default constructor.\n  // Always use this constructor (with parameters) to create a\n  // TestPartResult object.\n  TestPartResult(Type a_type,\n                 const char* a_file_name,\n                 int a_line_number,\n                 const char* a_message)\n      : type_(a_type),\n        file_name_(a_file_name),\n        line_number_(a_line_number),\n        summary_(ExtractSummary(a_message)),\n        message_(a_message) {\n  }\n\n  // Gets the outcome of the test part.\n  Type type() const { return type_; }\n\n  // Gets the name of the source file where the test part took place, or\n  // NULL if it's unknown.\n  const char* file_name() const { return file_name_.c_str(); }\n\n  // Gets the line in the source file where the test part took place,\n  // or -1 if it's unknown.\n  int line_number() const { return line_number_; }\n\n  // Gets the summary of the failure message.\n  const char* summary() const { return summary_.c_str(); }\n\n  // Gets the message associated with the test part.\n  const char* message() const { return message_.c_str(); }\n\n  // Returns true iff the test part passed.\n  bool passed() const { return type_ == kSuccess; }\n\n  // Returns true iff the test part failed.\n  bool failed() const { return type_ != kSuccess; }\n\n  // Returns true iff the test part non-fatally failed.\n  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }\n\n  // Returns true iff the test part fatally failed.\n  bool fatally_failed() const { return type_ == kFatalFailure; }\n private:\n  Type type_;\n\n  // Gets the summary of the failure message by omitting the stack\n  // trace in it.\n  static internal::String ExtractSummary(const char* message);\n\n  // The name of the source file where the test part took place, or\n  // NULL if the source file is unknown.\n  internal::String file_name_;\n  // The line in the source file where the test part took place, or -1\n  // if the line number is unknown.\n  int line_number_;\n  internal::String summary_;  // The test failure summary.\n  internal::String message_;  // The test failure message.\n};\n\n// Prints a TestPartResult object.\nstd::ostream& operator<<(std::ostream& os, const TestPartResult& result);\n\n// An array of TestPartResult objects.\n//\n// Don't inherit from TestPartResultArray as its destructor is not\n// virtual.\nclass GTEST_API_ TestPartResultArray {\n public:\n  TestPartResultArray() {}\n\n  // Appends the given TestPartResult to the array.\n  void Append(const TestPartResult& result);\n\n  // Returns the TestPartResult at the given index (0-based).\n  const TestPartResult& GetTestPartResult(int index) const;\n\n  // Returns the number of TestPartResult objects in the array.\n  int size() const;\n\n private:\n  std::vector<TestPartResult> array_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);\n};\n\n// This interface knows how to report a test part result.\nclass TestPartResultReporterInterface {\n public:\n  virtual ~TestPartResultReporterInterface() {}\n\n  virtual void ReportTestPartResult(const TestPartResult& result) = 0;\n};\n\nnamespace internal {\n\n// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a\n// statement generates new fatal failures. To do so it registers itself as the\n// current test part result reporter. Besides checking if fatal failures were\n// reported, it only delegates the reporting to the former result reporter.\n// The original result reporter is restored in the destructor.\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nclass GTEST_API_ HasNewFatalFailureHelper\n    : public TestPartResultReporterInterface {\n public:\n  HasNewFatalFailureHelper();\n  virtual ~HasNewFatalFailureHelper();\n  virtual void ReportTestPartResult(const TestPartResult& result);\n  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }\n private:\n  bool has_new_fatal_failure_;\n  TestPartResultReporterInterface* original_reporter_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);\n};\n\n}  // namespace internal\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-typed-test.h",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_\n\n// This header implements typed tests and type-parameterized tests.\n\n// Typed (aka type-driven) tests repeat the same test for types in a\n// list.  You must know which types you want to test with when writing\n// typed tests. Here's how you do it:\n\n#if 0\n\n// First, define a fixture class template.  It should be parameterized\n// by a type.  Remember to derive it from testing::Test.\ntemplate <typename T>\nclass FooTest : public testing::Test {\n public:\n  ...\n  typedef std::list<T> List;\n  static T shared_;\n  T value_;\n};\n\n// Next, associate a list of types with the test case, which will be\n// repeated for each type in the list.  The typedef is necessary for\n// the macro to parse correctly.\ntypedef testing::Types<char, int, unsigned int> MyTypes;\nTYPED_TEST_CASE(FooTest, MyTypes);\n\n// If the type list contains only one type, you can write that type\n// directly without Types<...>:\n//   TYPED_TEST_CASE(FooTest, int);\n\n// Then, use TYPED_TEST() instead of TEST_F() to define as many typed\n// tests for this test case as you want.\nTYPED_TEST(FooTest, DoesBlah) {\n  // Inside a test, refer to TypeParam to get the type parameter.\n  // Since we are inside a derived class template, C++ requires use to\n  // visit the members of FooTest via 'this'.\n  TypeParam n = this->value_;\n\n  // To visit static members of the fixture, add the TestFixture::\n  // prefix.\n  n += TestFixture::shared_;\n\n  // To refer to typedefs in the fixture, add the \"typename\n  // TestFixture::\" prefix.\n  typename TestFixture::List values;\n  values.push_back(n);\n  ...\n}\n\nTYPED_TEST(FooTest, HasPropertyA) { ... }\n\n#endif  // 0\n\n// Type-parameterized tests are abstract test patterns parameterized\n// by a type.  Compared with typed tests, type-parameterized tests\n// allow you to define the test pattern without knowing what the type\n// parameters are.  The defined pattern can be instantiated with\n// different types any number of times, in any number of translation\n// units.\n//\n// If you are designing an interface or concept, you can define a\n// suite of type-parameterized tests to verify properties that any\n// valid implementation of the interface/concept should have.  Then,\n// each implementation can easily instantiate the test suite to verify\n// that it conforms to the requirements, without having to write\n// similar tests repeatedly.  Here's an example:\n\n#if 0\n\n// First, define a fixture class template.  It should be parameterized\n// by a type.  Remember to derive it from testing::Test.\ntemplate <typename T>\nclass FooTest : public testing::Test {\n  ...\n};\n\n// Next, declare that you will define a type-parameterized test case\n// (the _P suffix is for \"parameterized\" or \"pattern\", whichever you\n// prefer):\nTYPED_TEST_CASE_P(FooTest);\n\n// Then, use TYPED_TEST_P() to define as many type-parameterized tests\n// for this type-parameterized test case as you want.\nTYPED_TEST_P(FooTest, DoesBlah) {\n  // Inside a test, refer to TypeParam to get the type parameter.\n  TypeParam n = 0;\n  ...\n}\n\nTYPED_TEST_P(FooTest, HasPropertyA) { ... }\n\n// Now the tricky part: you need to register all test patterns before\n// you can instantiate them.  The first argument of the macro is the\n// test case name; the rest are the names of the tests in this test\n// case.\nREGISTER_TYPED_TEST_CASE_P(FooTest,\n                           DoesBlah, HasPropertyA);\n\n// Finally, you are free to instantiate the pattern with the types you\n// want.  If you put the above code in a header file, you can #include\n// it in multiple C++ source files and instantiate it multiple times.\n//\n// To distinguish different instances of the pattern, the first\n// argument to the INSTANTIATE_* macro is a prefix that will be added\n// to the actual test case name.  Remember to pick unique prefixes for\n// different instances.\ntypedef testing::Types<char, int, unsigned int> MyTypes;\nINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);\n\n// If the type list contains only one type, you can write that type\n// directly without Types<...>:\n//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);\n\n#endif  // 0\n\n#include <gtest/internal/gtest-port.h>\n#include <gtest/internal/gtest-type-util.h>\n\n// Implements typed tests.\n\n#if GTEST_HAS_TYPED_TEST\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Expands to the name of the typedef for the type parameters of the\n// given test case.\n#define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_\n\n// The 'Types' template argument below must have spaces around it\n// since some compilers may choke on '>>' when passing a template\n// instance (e.g. Types<int>)\n#define TYPED_TEST_CASE(CaseName, Types) \\\n  typedef ::testing::internal::TypeList< Types >::type \\\n      GTEST_TYPE_PARAMS_(CaseName)\n\n#define TYPED_TEST(CaseName, TestName) \\\n  template <typename gtest_TypeParam_> \\\n  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \\\n      : public CaseName<gtest_TypeParam_> { \\\n   private: \\\n    typedef CaseName<gtest_TypeParam_> TestFixture; \\\n    typedef gtest_TypeParam_ TypeParam; \\\n    virtual void TestBody(); \\\n  }; \\\n  bool gtest_##CaseName##_##TestName##_registered_ = \\\n      ::testing::internal::TypeParameterizedTest< \\\n          CaseName, \\\n          ::testing::internal::TemplateSel< \\\n              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \\\n          GTEST_TYPE_PARAMS_(CaseName)>::Register(\\\n              \"\", #CaseName, #TestName, 0); \\\n  template <typename gtest_TypeParam_> \\\n  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()\n\n#endif  // GTEST_HAS_TYPED_TEST\n\n// Implements type-parameterized tests.\n\n#if GTEST_HAS_TYPED_TEST_P\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Expands to the namespace name that the type-parameterized tests for\n// the given type-parameterized test case are defined in.  The exact\n// name of the namespace is subject to change without notice.\n#define GTEST_CASE_NAMESPACE_(TestCaseName) \\\n  gtest_case_##TestCaseName##_\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Expands to the name of the variable used to remember the names of\n// the defined tests in the given test case.\n#define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \\\n  gtest_typed_test_case_p_state_##TestCaseName##_\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.\n//\n// Expands to the name of the variable used to remember the names of\n// the registered tests in the given test case.\n#define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \\\n  gtest_registered_test_names_##TestCaseName##_\n\n// The variables defined in the type-parameterized test macros are\n// static as typically these macros are used in a .h file that can be\n// #included in multiple translation units linked together.\n#define TYPED_TEST_CASE_P(CaseName) \\\n  static ::testing::internal::TypedTestCasePState \\\n      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)\n\n#define TYPED_TEST_P(CaseName, TestName) \\\n  namespace GTEST_CASE_NAMESPACE_(CaseName) { \\\n  template <typename gtest_TypeParam_> \\\n  class TestName : public CaseName<gtest_TypeParam_> { \\\n   private: \\\n    typedef CaseName<gtest_TypeParam_> TestFixture; \\\n    typedef gtest_TypeParam_ TypeParam; \\\n    virtual void TestBody(); \\\n  }; \\\n  static bool gtest_##TestName##_defined_ = \\\n      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\\\n          __FILE__, __LINE__, #CaseName, #TestName); \\\n  } \\\n  template <typename gtest_TypeParam_> \\\n  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()\n\n#define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \\\n  namespace GTEST_CASE_NAMESPACE_(CaseName) { \\\n  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \\\n  } \\\n  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \\\n      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\\\n          __FILE__, __LINE__, #__VA_ARGS__)\n\n// The 'Types' template argument below must have spaces around it\n// since some compilers may choke on '>>' when passing a template\n// instance (e.g. Types<int>)\n#define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \\\n  bool gtest_##Prefix##_##CaseName = \\\n      ::testing::internal::TypeParameterizedTestCase<CaseName, \\\n          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \\\n          ::testing::internal::TypeList< Types >::type>::Register(\\\n              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This header file defines the public API for Google Test.  It should be\n// included by any test program that uses Google Test.\n//\n// IMPORTANT NOTE: Due to limitation of the C++ language, we have to\n// leave some internal implementation details in this header file.\n// They are clearly marked by comments like this:\n//\n//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n//\n// Such code is NOT meant to be used by a user directly, and is subject\n// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user\n// program!\n//\n// Acknowledgment: Google Test borrowed the idea of automatic test\n// registration from Barthelemy Dagenais' (barthelemy@prologique.com)\n// easyUnit framework.\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_H_\n#define GTEST_INCLUDE_GTEST_GTEST_H_\n\n#include <limits>\n#include <vector>\n\n#include <gtest/internal/gtest-internal.h>\n#include <gtest/internal/gtest-string.h>\n#include <gtest/gtest-death-test.h>\n#include <gtest/gtest-message.h>\n#include <gtest/gtest-param-test.h>\n#include <gtest/gtest_prod.h>\n#include <gtest/gtest-test-part.h>\n#include <gtest/gtest-typed-test.h>\n\n// Depending on the platform, different string classes are available.\n// On Linux, in addition to ::std::string, Google also makes use of\n// class ::string, which has the same interface as ::std::string, but\n// has a different implementation.\n//\n// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that\n// ::string is available AND is a distinct type to ::std::string, or\n// define it to 0 to indicate otherwise.\n//\n// If the user's ::std::string and ::string are the same class due to\n// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.\n//\n// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined\n// heuristically.\n\nnamespace testing {\n\n// Declares the flags.\n\n// This flag temporary enables the disabled tests.\nGTEST_DECLARE_bool_(also_run_disabled_tests);\n\n// This flag brings the debugger on an assertion failure.\nGTEST_DECLARE_bool_(break_on_failure);\n\n// This flag controls whether Google Test catches all test-thrown exceptions\n// and logs them as failures.\nGTEST_DECLARE_bool_(catch_exceptions);\n\n// This flag enables using colors in terminal output. Available values are\n// \"yes\" to enable colors, \"no\" (disable colors), or \"auto\" (the default)\n// to let Google Test decide.\nGTEST_DECLARE_string_(color);\n\n// This flag sets up the filter to select by name using a glob pattern\n// the tests to run. If the filter is not given all tests are executed.\nGTEST_DECLARE_string_(filter);\n\n// This flag causes the Google Test to list tests. None of the tests listed\n// are actually run if the flag is provided.\nGTEST_DECLARE_bool_(list_tests);\n\n// This flag controls whether Google Test emits a detailed XML report to a file\n// in addition to its normal textual output.\nGTEST_DECLARE_string_(output);\n\n// This flags control whether Google Test prints the elapsed time for each\n// test.\nGTEST_DECLARE_bool_(print_time);\n\n// This flag specifies the random number seed.\nGTEST_DECLARE_int32_(random_seed);\n\n// This flag sets how many times the tests are repeated. The default value\n// is 1. If the value is -1 the tests are repeating forever.\nGTEST_DECLARE_int32_(repeat);\n\n// This flag controls whether Google Test includes Google Test internal\n// stack frames in failure stack traces.\nGTEST_DECLARE_bool_(show_internal_stack_frames);\n\n// When this flag is specified, tests' order is randomized on every iteration.\nGTEST_DECLARE_bool_(shuffle);\n\n// This flag specifies the maximum number of stack frames to be\n// printed in a failure message.\nGTEST_DECLARE_int32_(stack_trace_depth);\n\n// When this flag is specified, a failed assertion will throw an\n// exception if exceptions are enabled, or exit the program with a\n// non-zero code otherwise.\nGTEST_DECLARE_bool_(throw_on_failure);\n\n// The upper limit for valid stack trace depths.\nconst int kMaxStackTraceDepth = 100;\n\nnamespace internal {\n\nclass AssertHelper;\nclass DefaultGlobalTestPartResultReporter;\nclass ExecDeathTest;\nclass NoExecDeathTest;\nclass FinalSuccessChecker;\nclass GTestFlagSaver;\nclass TestInfoImpl;\nclass TestResultAccessor;\nclass TestEventListenersAccessor;\nclass TestEventRepeater;\nclass WindowsDeathTest;\nclass UnitTestImpl* GetUnitTestImpl();\nvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,\n                                    const String& message);\nclass PrettyUnitTestResultPrinter;\nclass XmlUnitTestResultPrinter;\n\n// Converts a streamable value to a String.  A NULL pointer is\n// converted to \"(null)\".  When the input value is a ::string,\n// ::std::string, ::wstring, or ::std::wstring object, each NUL\n// character in it is replaced with \"\\\\0\".\n// Declared in gtest-internal.h but defined here, so that it has access\n// to the definition of the Message class, required by the ARM\n// compiler.\ntemplate <typename T>\nString StreamableToString(const T& streamable) {\n  return (Message() << streamable).GetString();\n}\n\n}  // namespace internal\n\n// A class for indicating whether an assertion was successful.  When\n// the assertion wasn't successful, the AssertionResult object\n// remembers a non-empty message that describes how it failed.\n//\n// To create an instance of this class, use one of the factory functions\n// (AssertionSuccess() and AssertionFailure()).\n//\n// This class is useful for two purposes:\n//   1. Defining predicate functions to be used with Boolean test assertions\n//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts\n//   2. Defining predicate-format functions to be\n//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).\n//\n// For example, if you define IsEven predicate:\n//\n//   testing::AssertionResult IsEven(int n) {\n//     if ((n % 2) == 0)\n//       return testing::AssertionSuccess();\n//     else\n//       return testing::AssertionFailure() << n << \" is odd\";\n//   }\n//\n// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))\n// will print the message\n//\n//   Value of: IsEven(Fib(5))\n//     Actual: false (5 is odd)\n//   Expected: true\n//\n// instead of a more opaque\n//\n//   Value of: IsEven(Fib(5))\n//     Actual: false\n//   Expected: true\n//\n// in case IsEven is a simple Boolean predicate.\n//\n// If you expect your predicate to be reused and want to support informative\n// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up\n// about half as often as positive ones in our tests), supply messages for\n// both success and failure cases:\n//\n//   testing::AssertionResult IsEven(int n) {\n//     if ((n % 2) == 0)\n//       return testing::AssertionSuccess() << n << \" is even\";\n//     else\n//       return testing::AssertionFailure() << n << \" is odd\";\n//   }\n//\n// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print\n//\n//   Value of: IsEven(Fib(6))\n//     Actual: true (8 is even)\n//   Expected: false\n//\n// NB: Predicates that support negative Boolean assertions have reduced\n// performance in positive ones so be careful not to use them in tests\n// that have lots (tens of thousands) of positive Boolean assertions.\n//\n// To use this class with EXPECT_PRED_FORMAT assertions such as:\n//\n//   // Verifies that Foo() returns an even number.\n//   EXPECT_PRED_FORMAT1(IsEven, Foo());\n//\n// you need to define:\n//\n//   testing::AssertionResult IsEven(const char* expr, int n) {\n//     if ((n % 2) == 0)\n//       return testing::AssertionSuccess();\n//     else\n//       return testing::AssertionFailure()\n//         << \"Expected: \" << expr << \" is even\\n  Actual: it's \" << n;\n//   }\n//\n// If Foo() returns 5, you will see the following message:\n//\n//   Expected: Foo() is even\n//     Actual: it's 5\n//\nclass GTEST_API_ AssertionResult {\n public:\n  // Copy constructor.\n  // Used in EXPECT_TRUE/FALSE(assertion_result).\n  AssertionResult(const AssertionResult& other);\n  // Used in the EXPECT_TRUE/FALSE(bool_expression).\n  explicit AssertionResult(bool success) : success_(success) {}\n\n  // Returns true iff the assertion succeeded.\n  operator bool() const { return success_; }  // NOLINT\n\n  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.\n  AssertionResult operator!() const;\n\n  // Returns the text streamed into this AssertionResult. Test assertions\n  // use it when they fail (i.e., the predicate's outcome doesn't match the\n  // assertion's expectation). When nothing has been streamed into the\n  // object, returns an empty string.\n  const char* message() const {\n    return message_.get() != NULL && message_->c_str() != NULL ?\n           message_->c_str() : \"\";\n  }\n  // TODO(vladl@google.com): Remove this after making sure no clients use it.\n  // Deprecated; please use message() instead.\n  const char* failure_message() const { return message(); }\n\n  // Streams a custom failure message into this object.\n  template <typename T> AssertionResult& operator<<(const T& value);\n\n private:\n  // No implementation - we want AssertionResult to be\n  // copy-constructible but not assignable.\n  void operator=(const AssertionResult& other);\n\n  // Stores result of the assertion predicate.\n  bool success_;\n  // Stores the message describing the condition in case the expectation\n  // construct is not satisfied with the predicate's outcome.\n  // Referenced via a pointer to avoid taking too much stack frame space\n  // with test assertions.\n  internal::scoped_ptr<internal::String> message_;\n};  // class AssertionResult\n\n// Streams a custom failure message into this object.\ntemplate <typename T>\nAssertionResult& AssertionResult::operator<<(const T& value) {\n  Message msg;\n  if (message_.get() != NULL)\n    msg << *message_;\n  msg << value;\n  message_.reset(new internal::String(msg.GetString()));\n  return *this;\n}\n\n// Makes a successful assertion result.\nGTEST_API_ AssertionResult AssertionSuccess();\n\n// Makes a failed assertion result.\nGTEST_API_ AssertionResult AssertionFailure();\n\n// Makes a failed assertion result with the given failure message.\n// Deprecated; use AssertionFailure() << msg.\nGTEST_API_ AssertionResult AssertionFailure(const Message& msg);\n\n// The abstract class that all tests inherit from.\n//\n// In Google Test, a unit test program contains one or many TestCases, and\n// each TestCase contains one or many Tests.\n//\n// When you define a test using the TEST macro, you don't need to\n// explicitly derive from Test - the TEST macro automatically does\n// this for you.\n//\n// The only time you derive from Test is when defining a test fixture\n// to be used a TEST_F.  For example:\n//\n//   class FooTest : public testing::Test {\n//    protected:\n//     virtual void SetUp() { ... }\n//     virtual void TearDown() { ... }\n//     ...\n//   };\n//\n//   TEST_F(FooTest, Bar) { ... }\n//   TEST_F(FooTest, Baz) { ... }\n//\n// Test is not copyable.\nclass GTEST_API_ Test {\n public:\n  friend class internal::TestInfoImpl;\n\n  // Defines types for pointers to functions that set up and tear down\n  // a test case.\n  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;\n  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;\n\n  // The d'tor is virtual as we intend to inherit from Test.\n  virtual ~Test();\n\n  // Sets up the stuff shared by all tests in this test case.\n  //\n  // Google Test will call Foo::SetUpTestCase() before running the first\n  // test in test case Foo.  Hence a sub-class can define its own\n  // SetUpTestCase() method to shadow the one defined in the super\n  // class.\n  static void SetUpTestCase() {}\n\n  // Tears down the stuff shared by all tests in this test case.\n  //\n  // Google Test will call Foo::TearDownTestCase() after running the last\n  // test in test case Foo.  Hence a sub-class can define its own\n  // TearDownTestCase() method to shadow the one defined in the super\n  // class.\n  static void TearDownTestCase() {}\n\n  // Returns true iff the current test has a fatal failure.\n  static bool HasFatalFailure();\n\n  // Returns true iff the current test has a non-fatal failure.\n  static bool HasNonfatalFailure();\n\n  // Returns true iff the current test has a (either fatal or\n  // non-fatal) failure.\n  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }\n\n  // Logs a property for the current test.  Only the last value for a given\n  // key is remembered.\n  // These are public static so they can be called from utility functions\n  // that are not members of the test fixture.\n  // The arguments are const char* instead strings, as Google Test is used\n  // on platforms where string doesn't compile.\n  //\n  // Note that a driving consideration for these RecordProperty methods\n  // was to produce xml output suited to the Greenspan charting utility,\n  // which at present will only chart values that fit in a 32-bit int. It\n  // is the user's responsibility to restrict their values to 32-bit ints\n  // if they intend them to be used with Greenspan.\n  static void RecordProperty(const char* key, const char* value);\n  static void RecordProperty(const char* key, int value);\n\n protected:\n  // Creates a Test object.\n  Test();\n\n  // Sets up the test fixture.\n  virtual void SetUp();\n\n  // Tears down the test fixture.\n  virtual void TearDown();\n\n private:\n  // Returns true iff the current test has the same fixture class as\n  // the first test in the current test case.\n  static bool HasSameFixtureClass();\n\n  // Runs the test after the test fixture has been set up.\n  //\n  // A sub-class must implement this to define the test logic.\n  //\n  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.\n  // Instead, use the TEST or TEST_F macro.\n  virtual void TestBody() = 0;\n\n  // Sets up, executes, and tears down the test.\n  void Run();\n\n  // Uses a GTestFlagSaver to save and restore all Google Test flags.\n  const internal::GTestFlagSaver* const gtest_flag_saver_;\n\n  // Often a user mis-spells SetUp() as Setup() and spends a long time\n  // wondering why it is never called by Google Test.  The declaration of\n  // the following method is solely for catching such an error at\n  // compile time:\n  //\n  //   - The return type is deliberately chosen to be not void, so it\n  //   will be a conflict if a user declares void Setup() in his test\n  //   fixture.\n  //\n  //   - This method is private, so it will be another compiler error\n  //   if a user calls it from his test fixture.\n  //\n  // DO NOT OVERRIDE THIS FUNCTION.\n  //\n  // If you see an error about overriding the following function or\n  // about it being private, you have mis-spelled SetUp() as Setup().\n  struct Setup_should_be_spelled_SetUp {};\n  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }\n\n  // We disallow copying Tests.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);\n};\n\ntypedef internal::TimeInMillis TimeInMillis;\n\n// A copyable object representing a user specified test property which can be\n// output as a key/value string pair.\n//\n// Don't inherit from TestProperty as its destructor is not virtual.\nclass TestProperty {\n public:\n  // C'tor.  TestProperty does NOT have a default constructor.\n  // Always use this constructor (with parameters) to create a\n  // TestProperty object.\n  TestProperty(const char* a_key, const char* a_value) :\n    key_(a_key), value_(a_value) {\n  }\n\n  // Gets the user supplied key.\n  const char* key() const {\n    return key_.c_str();\n  }\n\n  // Gets the user supplied value.\n  const char* value() const {\n    return value_.c_str();\n  }\n\n  // Sets a new value, overriding the one supplied in the constructor.\n  void SetValue(const char* new_value) {\n    value_ = new_value;\n  }\n\n private:\n  // The key supplied by the user.\n  internal::String key_;\n  // The value supplied by the user.\n  internal::String value_;\n};\n\n// The result of a single Test.  This includes a list of\n// TestPartResults, a list of TestProperties, a count of how many\n// death tests there are in the Test, and how much time it took to run\n// the Test.\n//\n// TestResult is not copyable.\nclass GTEST_API_ TestResult {\n public:\n  // Creates an empty TestResult.\n  TestResult();\n\n  // D'tor.  Do not inherit from TestResult.\n  ~TestResult();\n\n  // Gets the number of all test parts.  This is the sum of the number\n  // of successful test parts and the number of failed test parts.\n  int total_part_count() const;\n\n  // Returns the number of the test properties.\n  int test_property_count() const;\n\n  // Returns true iff the test passed (i.e. no test part failed).\n  bool Passed() const { return !Failed(); }\n\n  // Returns true iff the test failed.\n  bool Failed() const;\n\n  // Returns true iff the test fatally failed.\n  bool HasFatalFailure() const;\n\n  // Returns true iff the test has a non-fatal failure.\n  bool HasNonfatalFailure() const;\n\n  // Returns the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const { return elapsed_time_; }\n\n  // Returns the i-th test part result among all the results. i can range\n  // from 0 to test_property_count() - 1. If i is not in that range, aborts\n  // the program.\n  const TestPartResult& GetTestPartResult(int i) const;\n\n  // Returns the i-th test property. i can range from 0 to\n  // test_property_count() - 1. If i is not in that range, aborts the\n  // program.\n  const TestProperty& GetTestProperty(int i) const;\n\n private:\n  friend class TestInfo;\n  friend class UnitTest;\n  friend class internal::DefaultGlobalTestPartResultReporter;\n  friend class internal::ExecDeathTest;\n  friend class internal::TestInfoImpl;\n  friend class internal::TestResultAccessor;\n  friend class internal::UnitTestImpl;\n  friend class internal::WindowsDeathTest;\n\n  // Gets the vector of TestPartResults.\n  const std::vector<TestPartResult>& test_part_results() const {\n    return test_part_results_;\n  }\n\n  // Gets the vector of TestProperties.\n  const std::vector<TestProperty>& test_properties() const {\n    return test_properties_;\n  }\n\n  // Sets the elapsed time.\n  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }\n\n  // Adds a test property to the list. The property is validated and may add\n  // a non-fatal failure if invalid (e.g., if it conflicts with reserved\n  // key names). If a property is already recorded for the same key, the\n  // value will be updated, rather than storing multiple values for the same\n  // key.\n  void RecordProperty(const TestProperty& test_property);\n\n  // Adds a failure if the key is a reserved attribute of Google Test\n  // testcase tags.  Returns true if the property is valid.\n  // TODO(russr): Validate attribute names are legal and human readable.\n  static bool ValidateTestProperty(const TestProperty& test_property);\n\n  // Adds a test part result to the list.\n  void AddTestPartResult(const TestPartResult& test_part_result);\n\n  // Returns the death test count.\n  int death_test_count() const { return death_test_count_; }\n\n  // Increments the death test count, returning the new count.\n  int increment_death_test_count() { return ++death_test_count_; }\n\n  // Clears the test part results.\n  void ClearTestPartResults();\n\n  // Clears the object.\n  void Clear();\n\n  // Protects mutable state of the property vector and of owned\n  // properties, whose values may be updated.\n  internal::Mutex test_properites_mutex_;\n\n  // The vector of TestPartResults\n  std::vector<TestPartResult> test_part_results_;\n  // The vector of TestProperties\n  std::vector<TestProperty> test_properties_;\n  // Running count of death tests.\n  int death_test_count_;\n  // The elapsed time, in milliseconds.\n  TimeInMillis elapsed_time_;\n\n  // We disallow copying TestResult.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);\n};  // class TestResult\n\n// A TestInfo object stores the following information about a test:\n//\n//   Test case name\n//   Test name\n//   Whether the test should be run\n//   A function pointer that creates the test object when invoked\n//   Test result\n//\n// The constructor of TestInfo registers itself with the UnitTest\n// singleton such that the RUN_ALL_TESTS() macro knows which tests to\n// run.\nclass GTEST_API_ TestInfo {\n public:\n  // Destructs a TestInfo object.  This function is not virtual, so\n  // don't inherit from TestInfo.\n  ~TestInfo();\n\n  // Returns the test case name.\n  const char* test_case_name() const;\n\n  // Returns the test name.\n  const char* name() const;\n\n  // Returns the test case comment.\n  const char* test_case_comment() const;\n\n  // Returns the test comment.\n  const char* comment() const;\n\n  // Returns true if this test should run, that is if the test is not disabled\n  // (or it is disabled but the also_run_disabled_tests flag has been specified)\n  // and its full name matches the user-specified filter.\n  //\n  // Google Test allows the user to filter the tests by their full names.\n  // The full name of a test Bar in test case Foo is defined as\n  // \"Foo.Bar\".  Only the tests that match the filter will run.\n  //\n  // A filter is a colon-separated list of glob (not regex) patterns,\n  // optionally followed by a '-' and a colon-separated list of\n  // negative patterns (tests to exclude).  A test is run if it\n  // matches one of the positive patterns and does not match any of\n  // the negative patterns.\n  //\n  // For example, *A*:Foo.* is a filter that matches any string that\n  // contains the character 'A' or starts with \"Foo.\".\n  bool should_run() const;\n\n  // Returns the result of the test.\n  const TestResult* result() const;\n\n private:\n#if GTEST_HAS_DEATH_TEST\n  friend class internal::DefaultDeathTestFactory;\n#endif  // GTEST_HAS_DEATH_TEST\n  friend class Test;\n  friend class TestCase;\n  friend class internal::TestInfoImpl;\n  friend class internal::UnitTestImpl;\n  friend TestInfo* internal::MakeAndRegisterTestInfo(\n      const char* test_case_name, const char* name,\n      const char* test_case_comment, const char* comment,\n      internal::TypeId fixture_class_id,\n      Test::SetUpTestCaseFunc set_up_tc,\n      Test::TearDownTestCaseFunc tear_down_tc,\n      internal::TestFactoryBase* factory);\n\n  // Returns true if this test matches the user-specified filter.\n  bool matches_filter() const;\n\n  // Increments the number of death tests encountered in this test so\n  // far.\n  int increment_death_test_count();\n\n  // Accessors for the implementation object.\n  internal::TestInfoImpl* impl() { return impl_; }\n  const internal::TestInfoImpl* impl() const { return impl_; }\n\n  // Constructs a TestInfo object. The newly constructed instance assumes\n  // ownership of the factory object.\n  TestInfo(const char* test_case_name, const char* name,\n           const char* test_case_comment, const char* comment,\n           internal::TypeId fixture_class_id,\n           internal::TestFactoryBase* factory);\n\n  // An opaque implementation object.\n  internal::TestInfoImpl* impl_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);\n};\n\n// A test case, which consists of a vector of TestInfos.\n//\n// TestCase is not copyable.\nclass GTEST_API_ TestCase {\n public:\n  // Creates a TestCase with the given name.\n  //\n  // TestCase does NOT have a default constructor.  Always use this\n  // constructor to create a TestCase object.\n  //\n  // Arguments:\n  //\n  //   name:         name of the test case\n  //   set_up_tc:    pointer to the function that sets up the test case\n  //   tear_down_tc: pointer to the function that tears down the test case\n  TestCase(const char* name, const char* comment,\n           Test::SetUpTestCaseFunc set_up_tc,\n           Test::TearDownTestCaseFunc tear_down_tc);\n\n  // Destructor of TestCase.\n  virtual ~TestCase();\n\n  // Gets the name of the TestCase.\n  const char* name() const { return name_.c_str(); }\n\n  // Returns the test case comment.\n  const char* comment() const { return comment_.c_str(); }\n\n  // Returns true if any test in this test case should run.\n  bool should_run() const { return should_run_; }\n\n  // Gets the number of successful tests in this test case.\n  int successful_test_count() const;\n\n  // Gets the number of failed tests in this test case.\n  int failed_test_count() const;\n\n  // Gets the number of disabled tests in this test case.\n  int disabled_test_count() const;\n\n  // Get the number of tests in this test case that should run.\n  int test_to_run_count() const;\n\n  // Gets the number of all tests in this test case.\n  int total_test_count() const;\n\n  // Returns true iff the test case passed.\n  bool Passed() const { return !Failed(); }\n\n  // Returns true iff the test case failed.\n  bool Failed() const { return failed_test_count() > 0; }\n\n  // Returns the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const { return elapsed_time_; }\n\n  // Returns the i-th test among all the tests. i can range from 0 to\n  // total_test_count() - 1. If i is not in that range, returns NULL.\n  const TestInfo* GetTestInfo(int i) const;\n\n private:\n  friend class Test;\n  friend class internal::UnitTestImpl;\n\n  // Gets the (mutable) vector of TestInfos in this TestCase.\n  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }\n\n  // Gets the (immutable) vector of TestInfos in this TestCase.\n  const std::vector<TestInfo*>& test_info_list() const {\n    return test_info_list_;\n  }\n\n  // Returns the i-th test among all the tests. i can range from 0 to\n  // total_test_count() - 1. If i is not in that range, returns NULL.\n  TestInfo* GetMutableTestInfo(int i);\n\n  // Sets the should_run member.\n  void set_should_run(bool should) { should_run_ = should; }\n\n  // Adds a TestInfo to this test case.  Will delete the TestInfo upon\n  // destruction of the TestCase object.\n  void AddTestInfo(TestInfo * test_info);\n\n  // Clears the results of all tests in this test case.\n  void ClearResult();\n\n  // Clears the results of all tests in the given test case.\n  static void ClearTestCaseResult(TestCase* test_case) {\n    test_case->ClearResult();\n  }\n\n  // Runs every test in this TestCase.\n  void Run();\n\n  // Returns true iff test passed.\n  static bool TestPassed(const TestInfo * test_info);\n\n  // Returns true iff test failed.\n  static bool TestFailed(const TestInfo * test_info);\n\n  // Returns true iff test is disabled.\n  static bool TestDisabled(const TestInfo * test_info);\n\n  // Returns true if the given test should run.\n  static bool ShouldRunTest(const TestInfo *test_info);\n\n  // Shuffles the tests in this test case.\n  void ShuffleTests(internal::Random* random);\n\n  // Restores the test order to before the first shuffle.\n  void UnshuffleTests();\n\n  // Name of the test case.\n  internal::String name_;\n  // Comment on the test case.\n  internal::String comment_;\n  // The vector of TestInfos in their original order.  It owns the\n  // elements in the vector.\n  std::vector<TestInfo*> test_info_list_;\n  // Provides a level of indirection for the test list to allow easy\n  // shuffling and restoring the test order.  The i-th element in this\n  // vector is the index of the i-th test in the shuffled test list.\n  std::vector<int> test_indices_;\n  // Pointer to the function that sets up the test case.\n  Test::SetUpTestCaseFunc set_up_tc_;\n  // Pointer to the function that tears down the test case.\n  Test::TearDownTestCaseFunc tear_down_tc_;\n  // True iff any test in this test case should run.\n  bool should_run_;\n  // Elapsed time, in milliseconds.\n  TimeInMillis elapsed_time_;\n\n  // We disallow copying TestCases.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);\n};\n\n// An Environment object is capable of setting up and tearing down an\n// environment.  The user should subclass this to define his own\n// environment(s).\n//\n// An Environment object does the set-up and tear-down in virtual\n// methods SetUp() and TearDown() instead of the constructor and the\n// destructor, as:\n//\n//   1. You cannot safely throw from a destructor.  This is a problem\n//      as in some cases Google Test is used where exceptions are enabled, and\n//      we may want to implement ASSERT_* using exceptions where they are\n//      available.\n//   2. You cannot use ASSERT_* directly in a constructor or\n//      destructor.\nclass Environment {\n public:\n  // The d'tor is virtual as we need to subclass Environment.\n  virtual ~Environment() {}\n\n  // Override this to define how to set up the environment.\n  virtual void SetUp() {}\n\n  // Override this to define how to tear down the environment.\n  virtual void TearDown() {}\n private:\n  // If you see an error about overriding the following function or\n  // about it being private, you have mis-spelled SetUp() as Setup().\n  struct Setup_should_be_spelled_SetUp {};\n  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }\n};\n\n// The interface for tracing execution of tests. The methods are organized in\n// the order the corresponding events are fired.\nclass TestEventListener {\n public:\n  virtual ~TestEventListener() {}\n\n  // Fired before any test activity starts.\n  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;\n\n  // Fired before each iteration of tests starts.  There may be more than\n  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration\n  // index, starting from 0.\n  virtual void OnTestIterationStart(const UnitTest& unit_test,\n                                    int iteration) = 0;\n\n  // Fired before environment set-up for each iteration of tests starts.\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;\n\n  // Fired after environment set-up for each iteration of tests ends.\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;\n\n  // Fired before the test case starts.\n  virtual void OnTestCaseStart(const TestCase& test_case) = 0;\n\n  // Fired before the test starts.\n  virtual void OnTestStart(const TestInfo& test_info) = 0;\n\n  // Fired after a failed assertion or a SUCCESS().\n  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;\n\n  // Fired after the test ends.\n  virtual void OnTestEnd(const TestInfo& test_info) = 0;\n\n  // Fired after the test case ends.\n  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;\n\n  // Fired before environment tear-down for each iteration of tests starts.\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;\n\n  // Fired after environment tear-down for each iteration of tests ends.\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;\n\n  // Fired after each iteration of tests finishes.\n  virtual void OnTestIterationEnd(const UnitTest& unit_test,\n                                  int iteration) = 0;\n\n  // Fired after all test activities have ended.\n  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;\n};\n\n// The convenience class for users who need to override just one or two\n// methods and are not concerned that a possible change to a signature of\n// the methods they override will not be caught during the build.  For\n// comments about each method please see the definition of TestEventListener\n// above.\nclass EmptyTestEventListener : public TestEventListener {\n public:\n  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,\n                                    int /*iteration*/) {}\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}\n  virtual void OnTestStart(const TestInfo& /*test_info*/) {}\n  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}\n  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}\n  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,\n                                  int /*iteration*/) {}\n  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}\n};\n\n// TestEventListeners lets users add listeners to track events in Google Test.\nclass GTEST_API_ TestEventListeners {\n public:\n  TestEventListeners();\n  ~TestEventListeners();\n\n  // Appends an event listener to the end of the list. Google Test assumes\n  // the ownership of the listener (i.e. it will delete the listener when\n  // the test program finishes).\n  void Append(TestEventListener* listener);\n\n  // Removes the given event listener from the list and returns it.  It then\n  // becomes the caller's responsibility to delete the listener. Returns\n  // NULL if the listener is not found in the list.\n  TestEventListener* Release(TestEventListener* listener);\n\n  // Returns the standard listener responsible for the default console\n  // output.  Can be removed from the listeners list to shut down default\n  // console output.  Note that removing this object from the listener list\n  // with Release transfers its ownership to the caller and makes this\n  // function return NULL the next time.\n  TestEventListener* default_result_printer() const {\n    return default_result_printer_;\n  }\n\n  // Returns the standard listener responsible for the default XML output\n  // controlled by the --gtest_output=xml flag.  Can be removed from the\n  // listeners list by users who want to shut down the default XML output\n  // controlled by this flag and substitute it with custom one.  Note that\n  // removing this object from the listener list with Release transfers its\n  // ownership to the caller and makes this function return NULL the next\n  // time.\n  TestEventListener* default_xml_generator() const {\n    return default_xml_generator_;\n  }\n\n private:\n  friend class TestCase;\n  friend class internal::DefaultGlobalTestPartResultReporter;\n  friend class internal::NoExecDeathTest;\n  friend class internal::TestEventListenersAccessor;\n  friend class internal::TestInfoImpl;\n  friend class internal::UnitTestImpl;\n\n  // Returns repeater that broadcasts the TestEventListener events to all\n  // subscribers.\n  TestEventListener* repeater();\n\n  // Sets the default_result_printer attribute to the provided listener.\n  // The listener is also added to the listener list and previous\n  // default_result_printer is removed from it and deleted. The listener can\n  // also be NULL in which case it will not be added to the list. Does\n  // nothing if the previous and the current listener objects are the same.\n  void SetDefaultResultPrinter(TestEventListener* listener);\n\n  // Sets the default_xml_generator attribute to the provided listener.  The\n  // listener is also added to the listener list and previous\n  // default_xml_generator is removed from it and deleted. The listener can\n  // also be NULL in which case it will not be added to the list. Does\n  // nothing if the previous and the current listener objects are the same.\n  void SetDefaultXmlGenerator(TestEventListener* listener);\n\n  // Controls whether events will be forwarded by the repeater to the\n  // listeners in the list.\n  bool EventForwardingEnabled() const;\n  void SuppressEventForwarding();\n\n  // The actual list of listeners.\n  internal::TestEventRepeater* repeater_;\n  // Listener responsible for the standard result output.\n  TestEventListener* default_result_printer_;\n  // Listener responsible for the creation of the XML output file.\n  TestEventListener* default_xml_generator_;\n\n  // We disallow copying TestEventListeners.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);\n};\n\n// A UnitTest consists of a vector of TestCases.\n//\n// This is a singleton class.  The only instance of UnitTest is\n// created when UnitTest::GetInstance() is first called.  This\n// instance is never deleted.\n//\n// UnitTest is not copyable.\n//\n// This class is thread-safe as long as the methods are called\n// according to their specification.\nclass GTEST_API_ UnitTest {\n public:\n  // Gets the singleton UnitTest object.  The first time this method\n  // is called, a UnitTest object is constructed and returned.\n  // Consecutive calls will return the same object.\n  static UnitTest* GetInstance();\n\n  // Runs all tests in this UnitTest object and prints the result.\n  // Returns 0 if successful, or 1 otherwise.\n  //\n  // This method can only be called from the main thread.\n  //\n  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n  int Run() GTEST_MUST_USE_RESULT_;\n\n  // Returns the working directory when the first TEST() or TEST_F()\n  // was executed.  The UnitTest object owns the string.\n  const char* original_working_dir() const;\n\n  // Returns the TestCase object for the test that's currently running,\n  // or NULL if no test is running.\n  const TestCase* current_test_case() const;\n\n  // Returns the TestInfo object for the test that's currently running,\n  // or NULL if no test is running.\n  const TestInfo* current_test_info() const;\n\n  // Returns the random seed used at the start of the current test run.\n  int random_seed() const;\n\n#if GTEST_HAS_PARAM_TEST\n  // Returns the ParameterizedTestCaseRegistry object used to keep track of\n  // value-parameterized tests and instantiate and register them.\n  //\n  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n  internal::ParameterizedTestCaseRegistry& parameterized_test_registry();\n#endif  // GTEST_HAS_PARAM_TEST\n\n  // Gets the number of successful test cases.\n  int successful_test_case_count() const;\n\n  // Gets the number of failed test cases.\n  int failed_test_case_count() const;\n\n  // Gets the number of all test cases.\n  int total_test_case_count() const;\n\n  // Gets the number of all test cases that contain at least one test\n  // that should run.\n  int test_case_to_run_count() const;\n\n  // Gets the number of successful tests.\n  int successful_test_count() const;\n\n  // Gets the number of failed tests.\n  int failed_test_count() const;\n\n  // Gets the number of disabled tests.\n  int disabled_test_count() const;\n\n  // Gets the number of all tests.\n  int total_test_count() const;\n\n  // Gets the number of tests that should run.\n  int test_to_run_count() const;\n\n  // Gets the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const;\n\n  // Returns true iff the unit test passed (i.e. all test cases passed).\n  bool Passed() const;\n\n  // Returns true iff the unit test failed (i.e. some test case failed\n  // or something outside of all tests failed).\n  bool Failed() const;\n\n  // Gets the i-th test case among all the test cases. i can range from 0 to\n  // total_test_case_count() - 1. If i is not in that range, returns NULL.\n  const TestCase* GetTestCase(int i) const;\n\n  // Returns the list of event listeners that can be used to track events\n  // inside Google Test.\n  TestEventListeners& listeners();\n\n private:\n  // Registers and returns a global test environment.  When a test\n  // program is run, all global test environments will be set-up in\n  // the order they were registered.  After all tests in the program\n  // have finished, all global test environments will be torn-down in\n  // the *reverse* order they were registered.\n  //\n  // The UnitTest object takes ownership of the given environment.\n  //\n  // This method can only be called from the main thread.\n  Environment* AddEnvironment(Environment* env);\n\n  // Adds a TestPartResult to the current TestResult object.  All\n  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)\n  // eventually call this to report their results.  The user code\n  // should use the assertion macros instead of calling this directly.\n  void AddTestPartResult(TestPartResult::Type result_type,\n                         const char* file_name,\n                         int line_number,\n                         const internal::String& message,\n                         const internal::String& os_stack_trace);\n\n  // Adds a TestProperty to the current TestResult object. If the result already\n  // contains a property with the same key, the value will be updated.\n  void RecordPropertyForCurrentTest(const char* key, const char* value);\n\n  // Gets the i-th test case among all the test cases. i can range from 0 to\n  // total_test_case_count() - 1. If i is not in that range, returns NULL.\n  TestCase* GetMutableTestCase(int i);\n\n  // Accessors for the implementation object.\n  internal::UnitTestImpl* impl() { return impl_; }\n  const internal::UnitTestImpl* impl() const { return impl_; }\n\n  // These classes and funcions are friends as they need to access private\n  // members of UnitTest.\n  friend class Test;\n  friend class internal::AssertHelper;\n  friend class internal::ScopedTrace;\n  friend Environment* AddGlobalTestEnvironment(Environment* env);\n  friend internal::UnitTestImpl* internal::GetUnitTestImpl();\n  friend void internal::ReportFailureInUnknownLocation(\n      TestPartResult::Type result_type,\n      const internal::String& message);\n\n  // Creates an empty UnitTest.\n  UnitTest();\n\n  // D'tor\n  virtual ~UnitTest();\n\n  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread\n  // Google Test trace stack.\n  void PushGTestTrace(const internal::TraceInfo& trace);\n\n  // Pops a trace from the per-thread Google Test trace stack.\n  void PopGTestTrace();\n\n  // Protects mutable state in *impl_.  This is mutable as some const\n  // methods need to lock it too.\n  mutable internal::Mutex mutex_;\n\n  // Opaque implementation object.  This field is never changed once\n  // the object is constructed.  We don't mark it as const here, as\n  // doing so will cause a warning in the constructor of UnitTest.\n  // Mutable state in *impl_ is protected by mutex_.\n  internal::UnitTestImpl* impl_;\n\n  // We disallow copying UnitTest.\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);\n};\n\n// A convenient wrapper for adding an environment for the test\n// program.\n//\n// You should call this before RUN_ALL_TESTS() is called, probably in\n// main().  If you use gtest_main, you need to call this before main()\n// starts for it to take effect.  For example, you can define a global\n// variable like this:\n//\n//   testing::Environment* const foo_env =\n//       testing::AddGlobalTestEnvironment(new FooEnvironment);\n//\n// However, we strongly recommend you to write your own main() and\n// call AddGlobalTestEnvironment() there, as relying on initialization\n// of global variables makes the code harder to read and may cause\n// problems when you register multiple environments from different\n// translation units and the environments have dependencies among them\n// (remember that the compiler doesn't guarantee the order in which\n// global variables from different translation units are initialized).\ninline Environment* AddGlobalTestEnvironment(Environment* env) {\n  return UnitTest::GetInstance()->AddEnvironment(env);\n}\n\n// Initializes Google Test.  This must be called before calling\n// RUN_ALL_TESTS().  In particular, it parses a command line for the\n// flags that Google Test recognizes.  Whenever a Google Test flag is\n// seen, it is removed from argv, and *argc is decremented.\n//\n// No value is returned.  Instead, the Google Test flag variables are\n// updated.\n//\n// Calling the function for the second time has no user-visible effect.\nGTEST_API_ void InitGoogleTest(int* argc, char** argv);\n\n// This overloaded version can be used in Windows programs compiled in\n// UNICODE mode.\nGTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);\n\nnamespace internal {\n\n// These overloaded versions handle ::std::string and ::std::wstring.\nGTEST_API_ inline String FormatForFailureMessage(const ::std::string& str) {\n  return (Message() << '\"' << str << '\"').GetString();\n}\n\n#if GTEST_HAS_STD_WSTRING\nGTEST_API_ inline String FormatForFailureMessage(const ::std::wstring& wstr) {\n  return (Message() << \"L\\\"\" << wstr << '\"').GetString();\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\n// These overloaded versions handle ::string and ::wstring.\n#if GTEST_HAS_GLOBAL_STRING\nGTEST_API_ inline String FormatForFailureMessage(const ::string& str) {\n  return (Message() << '\"' << str << '\"').GetString();\n}\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n#if GTEST_HAS_GLOBAL_WSTRING\nGTEST_API_ inline String FormatForFailureMessage(const ::wstring& wstr) {\n  return (Message() << \"L\\\"\" << wstr << '\"').GetString();\n}\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)\n// operand to be used in a failure message.  The type (but not value)\n// of the other operand may affect the format.  This allows us to\n// print a char* as a raw pointer when it is compared against another\n// char*, and print it as a C string when it is compared against an\n// std::string object, for example.\n//\n// The default implementation ignores the type of the other operand.\n// Some specialized versions are used to handle formatting wide or\n// narrow C strings.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\ntemplate <typename T1, typename T2>\nString FormatForComparisonFailureMessage(const T1& value,\n                                         const T2& /* other_operand */) {\n  return FormatForFailureMessage(value);\n}\n\n// The helper function for {ASSERT|EXPECT}_EQ.\ntemplate <typename T1, typename T2>\nAssertionResult CmpHelperEQ(const char* expected_expression,\n                            const char* actual_expression,\n                            const T1& expected,\n                            const T2& actual) {\n#ifdef _MSC_VER\n#pragma warning(push)          // Saves the current warning state.\n#pragma warning(disable:4389)  // Temporarily disables warning on\n                               // signed/unsigned mismatch.\n#endif\n\n  if (expected == actual) {\n    return AssertionSuccess();\n  }\n\n#ifdef _MSC_VER\n#pragma warning(pop)          // Restores the warning state.\n#endif\n\n  return EqFailure(expected_expression,\n                   actual_expression,\n                   FormatForComparisonFailureMessage(expected, actual),\n                   FormatForComparisonFailureMessage(actual, expected),\n                   false);\n}\n\n// With this overloaded version, we allow anonymous enums to be used\n// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums\n// can be implicitly cast to BiggestInt.\nGTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,\n                                       const char* actual_expression,\n                                       BiggestInt expected,\n                                       BiggestInt actual);\n\n// The helper class for {ASSERT|EXPECT}_EQ.  The template argument\n// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()\n// is a null pointer literal.  The following default implementation is\n// for lhs_is_null_literal being false.\ntemplate <bool lhs_is_null_literal>\nclass EqHelper {\n public:\n  // This templatized version is for the general case.\n  template <typename T1, typename T2>\n  static AssertionResult Compare(const char* expected_expression,\n                                 const char* actual_expression,\n                                 const T1& expected,\n                                 const T2& actual) {\n    return CmpHelperEQ(expected_expression, actual_expression, expected,\n                       actual);\n  }\n\n  // With this overloaded version, we allow anonymous enums to be used\n  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous\n  // enums can be implicitly cast to BiggestInt.\n  //\n  // Even though its body looks the same as the above version, we\n  // cannot merge the two, as it will make anonymous enums unhappy.\n  static AssertionResult Compare(const char* expected_expression,\n                                 const char* actual_expression,\n                                 BiggestInt expected,\n                                 BiggestInt actual) {\n    return CmpHelperEQ(expected_expression, actual_expression, expected,\n                       actual);\n  }\n};\n\n// This specialization is used when the first argument to ASSERT_EQ()\n// is a null pointer literal.\ntemplate <>\nclass EqHelper<true> {\n public:\n  // We define two overloaded versions of Compare().  The first\n  // version will be picked when the second argument to ASSERT_EQ() is\n  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or\n  // EXPECT_EQ(false, a_bool).\n  template <typename T1, typename T2>\n  static AssertionResult Compare(const char* expected_expression,\n                                 const char* actual_expression,\n                                 const T1& expected,\n                                 const T2& actual) {\n    return CmpHelperEQ(expected_expression, actual_expression, expected,\n                       actual);\n  }\n\n  // This version will be picked when the second argument to\n  // ASSERT_EQ() is a pointer, e.g. ASSERT_EQ(NULL, a_pointer).\n  template <typename T1, typename T2>\n  static AssertionResult Compare(const char* expected_expression,\n                                 const char* actual_expression,\n                                 const T1& /* expected */,\n                                 T2* actual) {\n    // We already know that 'expected' is a null pointer.\n    return CmpHelperEQ(expected_expression, actual_expression,\n                       static_cast<T2*>(NULL), actual);\n  }\n};\n\n// A macro for implementing the helper functions needed to implement\n// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste\n// of similar code.\n//\n// For each templatized helper function, we also define an overloaded\n// version for BiggestInt in order to reduce code bloat and allow\n// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled\n// with gcc 4.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n#define GTEST_IMPL_CMP_HELPER_(op_name, op)\\\ntemplate <typename T1, typename T2>\\\nAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \\\n                                   const T1& val1, const T2& val2) {\\\n  if (val1 op val2) {\\\n    return AssertionSuccess();\\\n  } else {\\\n    Message msg;\\\n    msg << \"Expected: (\" << expr1 << \") \" #op \" (\" << expr2\\\n        << \"), actual: \" << FormatForComparisonFailureMessage(val1, val2)\\\n        << \" vs \" << FormatForComparisonFailureMessage(val2, val1);\\\n    return AssertionFailure(msg);\\\n  }\\\n}\\\nGTEST_API_ AssertionResult CmpHelper##op_name(\\\n    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\n\n// Implements the helper function for {ASSERT|EXPECT}_NE\nGTEST_IMPL_CMP_HELPER_(NE, !=);\n// Implements the helper function for {ASSERT|EXPECT}_LE\nGTEST_IMPL_CMP_HELPER_(LE, <=);\n// Implements the helper function for {ASSERT|EXPECT}_LT\nGTEST_IMPL_CMP_HELPER_(LT, < );\n// Implements the helper function for {ASSERT|EXPECT}_GE\nGTEST_IMPL_CMP_HELPER_(GE, >=);\n// Implements the helper function for {ASSERT|EXPECT}_GT\nGTEST_IMPL_CMP_HELPER_(GT, > );\n\n#undef GTEST_IMPL_CMP_HELPER_\n\n// The helper function for {ASSERT|EXPECT}_STREQ.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,\n                                          const char* actual_expression,\n                                          const char* expected,\n                                          const char* actual);\n\n// The helper function for {ASSERT|EXPECT}_STRCASEEQ.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,\n                                              const char* actual_expression,\n                                              const char* expected,\n                                              const char* actual);\n\n// The helper function for {ASSERT|EXPECT}_STRNE.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,\n                                          const char* s2_expression,\n                                          const char* s1,\n                                          const char* s2);\n\n// The helper function for {ASSERT|EXPECT}_STRCASENE.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,\n                                              const char* s2_expression,\n                                              const char* s1,\n                                              const char* s2);\n\n\n// Helper function for *_STREQ on wide strings.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,\n                                          const char* actual_expression,\n                                          const wchar_t* expected,\n                                          const wchar_t* actual);\n\n// Helper function for *_STRNE on wide strings.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,\n                                          const char* s2_expression,\n                                          const wchar_t* s1,\n                                          const wchar_t* s2);\n\n}  // namespace internal\n\n// IsSubstring() and IsNotSubstring() are intended to be used as the\n// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by\n// themselves.  They check whether needle is a substring of haystack\n// (NULL is considered a substring of itself only), and return an\n// appropriate error message when they fail.\n//\n// The {needle,haystack}_expr arguments are the stringified\n// expressions that generated the two real arguments.\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack);\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack);\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack);\n\n#if GTEST_HAS_STD_WSTRING\nGTEST_API_ AssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack);\nGTEST_API_ AssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack);\n#endif  // GTEST_HAS_STD_WSTRING\n\nnamespace internal {\n\n// Helper template function for comparing floating-points.\n//\n// Template parameter:\n//\n//   RawType: the raw floating-point type (either float or double)\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\ntemplate <typename RawType>\nAssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,\n                                         const char* actual_expression,\n                                         RawType expected,\n                                         RawType actual) {\n  const FloatingPoint<RawType> lhs(expected), rhs(actual);\n\n  if (lhs.AlmostEquals(rhs)) {\n    return AssertionSuccess();\n  }\n\n  StrStream expected_ss;\n  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n              << expected;\n\n  StrStream actual_ss;\n  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n            << actual;\n\n  return EqFailure(expected_expression,\n                   actual_expression,\n                   StrStreamToString(&expected_ss),\n                   StrStreamToString(&actual_ss),\n                   false);\n}\n\n// Helper function for implementing ASSERT_NEAR.\n//\n// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.\nGTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,\n                                                const char* expr2,\n                                                const char* abs_error_expr,\n                                                double val1,\n                                                double val2,\n                                                double abs_error);\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n// A class that enables one to stream messages to assertion macros\nclass GTEST_API_ AssertHelper {\n public:\n  // Constructor.\n  AssertHelper(TestPartResult::Type type,\n               const char* file,\n               int line,\n               const char* message);\n  ~AssertHelper();\n\n  // Message assignment is a semantic trick to enable assertion\n  // streaming; see the GTEST_MESSAGE_ macro below.\n  void operator=(const Message& message) const;\n\n private:\n  // We put our data in a struct so that the size of the AssertHelper class can\n  // be as small as possible.  This is important because gcc is incapable of\n  // re-using stack space even for temporary variables, so every EXPECT_EQ\n  // reserves stack space for another AssertHelper.\n  struct AssertHelperData {\n    AssertHelperData(TestPartResult::Type t,\n                     const char* srcfile,\n                     int line_num,\n                     const char* msg)\n        : type(t), file(srcfile), line(line_num), message(msg) { }\n\n    TestPartResult::Type const type;\n    const char*        const file;\n    int                const line;\n    String             const message;\n\n   private:\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);\n  };\n\n  AssertHelperData* const data_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);\n};\n\n}  // namespace internal\n\n#if GTEST_HAS_PARAM_TEST\n// The abstract base class that all value-parameterized tests inherit from.\n//\n// This class adds support for accessing the test parameter value via\n// the GetParam() method.\n//\n// Use it with one of the parameter generator defining functions, like Range(),\n// Values(), ValuesIn(), Bool(), and Combine().\n//\n// class FooTest : public ::testing::TestWithParam<int> {\n//  protected:\n//   FooTest() {\n//     // Can use GetParam() here.\n//   }\n//   virtual ~FooTest() {\n//     // Can use GetParam() here.\n//   }\n//   virtual void SetUp() {\n//     // Can use GetParam() here.\n//   }\n//   virtual void TearDown {\n//     // Can use GetParam() here.\n//   }\n// };\n// TEST_P(FooTest, DoesBar) {\n//   // Can use GetParam() method here.\n//   Foo foo;\n//   ASSERT_TRUE(foo.DoesBar(GetParam()));\n// }\n// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));\n\ntemplate <typename T>\nclass TestWithParam : public Test {\n public:\n  typedef T ParamType;\n\n  // The current parameter value. Is also available in the test fixture's\n  // constructor.\n  const ParamType& GetParam() const { return *parameter_; }\n\n private:\n  // Sets parameter value. The caller is responsible for making sure the value\n  // remains alive and unchanged throughout the current test.\n  static void SetParam(const ParamType* parameter) {\n    parameter_ = parameter;\n  }\n\n  // Static value used for accessing parameter during a test lifetime.\n  static const ParamType* parameter_;\n\n  // TestClass must be a subclass of TestWithParam<T>.\n  template <class TestClass> friend class internal::ParameterizedTestFactory;\n};\n\ntemplate <typename T>\nconst T* TestWithParam<T>::parameter_ = NULL;\n\n#endif  // GTEST_HAS_PARAM_TEST\n\n// Macros for indicating success/failure in test code.\n\n// ADD_FAILURE unconditionally adds a failure to the current test.\n// SUCCEED generates a success - it doesn't automatically make the\n// current test successful, as a test is only successful when it has\n// no failure.\n//\n// EXPECT_* verifies that a certain condition is satisfied.  If not,\n// it behaves like ADD_FAILURE.  In particular:\n//\n//   EXPECT_TRUE  verifies that a Boolean condition is true.\n//   EXPECT_FALSE verifies that a Boolean condition is false.\n//\n// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except\n// that they will also abort the current function on failure.  People\n// usually want the fail-fast behavior of FAIL and ASSERT_*, but those\n// writing data-driven tests often find themselves using ADD_FAILURE\n// and EXPECT_* more.\n//\n// Examples:\n//\n//   EXPECT_TRUE(server.StatusIsOK());\n//   ASSERT_FALSE(server.HasPendingRequest(port))\n//       << \"There are still pending requests \" << \"on port \" << port;\n\n// Generates a nonfatal failure with a generic message.\n#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_(\"Failed\")\n\n// Generates a fatal failure with a generic message.\n#define GTEST_FAIL() GTEST_FATAL_FAILURE_(\"Failed\")\n\n// Define this macro to 1 to omit the definition of FAIL(), which is a\n// generic name and clashes with some other libraries.\n#if !GTEST_DONT_DEFINE_FAIL\n#define FAIL() GTEST_FAIL()\n#endif\n\n// Generates a success with a generic message.\n#define GTEST_SUCCEED() GTEST_SUCCESS_(\"Succeeded\")\n\n// Define this macro to 1 to omit the definition of SUCCEED(), which\n// is a generic name and clashes with some other libraries.\n#if !GTEST_DONT_DEFINE_SUCCEED\n#define SUCCEED() GTEST_SUCCEED()\n#endif\n\n// Macros for testing exceptions.\n//\n//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):\n//         Tests that the statement throws the expected exception.\n//    * {ASSERT|EXPECT}_NO_THROW(statement):\n//         Tests that the statement doesn't throw any exception.\n//    * {ASSERT|EXPECT}_ANY_THROW(statement):\n//         Tests that the statement throws an exception.\n\n#define EXPECT_THROW(statement, expected_exception) \\\n  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_NO_THROW(statement) \\\n  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_ANY_THROW(statement) \\\n  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_THROW(statement, expected_exception) \\\n  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)\n#define ASSERT_NO_THROW(statement) \\\n  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)\n#define ASSERT_ANY_THROW(statement) \\\n  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)\n\n// Boolean assertions. Condition can be either a Boolean expression or an\n// AssertionResult. For more information on how to use AssertionResult with\n// these macros see comments on that class.\n#define EXPECT_TRUE(condition) \\\n  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \\\n                      GTEST_NONFATAL_FAILURE_)\n#define EXPECT_FALSE(condition) \\\n  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \\\n                      GTEST_NONFATAL_FAILURE_)\n#define ASSERT_TRUE(condition) \\\n  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \\\n                      GTEST_FATAL_FAILURE_)\n#define ASSERT_FALSE(condition) \\\n  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \\\n                      GTEST_FATAL_FAILURE_)\n\n// Includes the auto-generated header that implements a family of\n// generic predicate assertion macros.\n#include <gtest/gtest_pred_impl.h>\n\n// Macros for testing equalities and inequalities.\n//\n//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual\n//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2\n//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2\n//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2\n//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2\n//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2\n//\n// When they are not, Google Test prints both the tested expressions and\n// their actual values.  The values must be compatible built-in types,\n// or you will get a compiler error.  By \"compatible\" we mean that the\n// values can be compared by the respective operator.\n//\n// Note:\n//\n//   1. It is possible to make a user-defined type work with\n//   {ASSERT|EXPECT}_??(), but that requires overloading the\n//   comparison operators and is thus discouraged by the Google C++\n//   Usage Guide.  Therefore, you are advised to use the\n//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are\n//   equal.\n//\n//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on\n//   pointers (in particular, C strings).  Therefore, if you use it\n//   with two C strings, you are testing how their locations in memory\n//   are related, not how their content is related.  To compare two C\n//   strings by content, use {ASSERT|EXPECT}_STR*().\n//\n//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to\n//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you\n//   what the actual value is when it fails, and similarly for the\n//   other comparisons.\n//\n//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()\n//   evaluate their arguments, which is undefined.\n//\n//   5. These macros evaluate their arguments exactly once.\n//\n// Examples:\n//\n//   EXPECT_NE(5, Foo());\n//   EXPECT_EQ(NULL, a_pointer);\n//   ASSERT_LT(i, array_size);\n//   ASSERT_GT(records.size(), 0) << \"There is no record left.\";\n\n#define EXPECT_EQ(expected, actual) \\\n  EXPECT_PRED_FORMAT2(::testing::internal:: \\\n                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \\\n                      expected, actual)\n#define EXPECT_NE(expected, actual) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)\n#define EXPECT_LE(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)\n#define EXPECT_LT(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)\n#define EXPECT_GE(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)\n#define EXPECT_GT(val1, val2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)\n\n#define ASSERT_EQ(expected, actual) \\\n  ASSERT_PRED_FORMAT2(::testing::internal:: \\\n                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \\\n                      expected, actual)\n#define ASSERT_NE(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)\n#define ASSERT_LE(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)\n#define ASSERT_LT(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)\n#define ASSERT_GE(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)\n#define ASSERT_GT(val1, val2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)\n\n// C String Comparisons.  All tests treat NULL and any non-NULL string\n// as different.  Two NULLs are equal.\n//\n//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2\n//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2\n//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case\n//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case\n//\n// For wide or narrow string objects, you can use the\n// {ASSERT|EXPECT}_??() macros.\n//\n// Don't depend on the order in which the arguments are evaluated,\n// which is undefined.\n//\n// These macros evaluate their arguments exactly once.\n\n#define EXPECT_STREQ(expected, actual) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)\n#define EXPECT_STRNE(s1, s2) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)\n#define EXPECT_STRCASEEQ(expected, actual) \\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)\n#define EXPECT_STRCASENE(s1, s2)\\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)\n\n#define ASSERT_STREQ(expected, actual) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)\n#define ASSERT_STRNE(s1, s2) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)\n#define ASSERT_STRCASEEQ(expected, actual) \\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)\n#define ASSERT_STRCASENE(s1, s2)\\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)\n\n// Macros for comparing floating-point numbers.\n//\n//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):\n//         Tests that two float values are almost equal.\n//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):\n//         Tests that two double values are almost equal.\n//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):\n//         Tests that v1 and v2 are within the given distance to each other.\n//\n// Google Test uses ULP-based comparison to automatically pick a default\n// error bound that is appropriate for the operands.  See the\n// FloatingPoint template class in gtest-internal.h if you are\n// interested in the implementation details.\n\n#define EXPECT_FLOAT_EQ(expected, actual)\\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \\\n                      expected, actual)\n\n#define EXPECT_DOUBLE_EQ(expected, actual)\\\n  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \\\n                      expected, actual)\n\n#define ASSERT_FLOAT_EQ(expected, actual)\\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \\\n                      expected, actual)\n\n#define ASSERT_DOUBLE_EQ(expected, actual)\\\n  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \\\n                      expected, actual)\n\n#define EXPECT_NEAR(val1, val2, abs_error)\\\n  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \\\n                      val1, val2, abs_error)\n\n#define ASSERT_NEAR(val1, val2, abs_error)\\\n  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \\\n                      val1, val2, abs_error)\n\n// These predicate format functions work on floating-point values, and\n// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.\n//\n//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);\n\n// Asserts that val1 is less than, or almost equal to, val2.  Fails\n// otherwise.  In particular, it fails if either val1 or val2 is NaN.\nGTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,\n                                   float val1, float val2);\nGTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,\n                                    double val1, double val2);\n\n\n#if GTEST_OS_WINDOWS\n\n// Macros that test for HRESULT failure and success, these are only useful\n// on Windows, and rely on Windows SDK macros and APIs to compile.\n//\n//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)\n//\n// When expr unexpectedly fails or succeeds, Google Test prints the\n// expected result and the actual result with both a human-readable\n// string representation of the error, if available, as well as the\n// hex result code.\n#define EXPECT_HRESULT_SUCCEEDED(expr) \\\n    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))\n\n#define ASSERT_HRESULT_SUCCEEDED(expr) \\\n    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))\n\n#define EXPECT_HRESULT_FAILED(expr) \\\n    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))\n\n#define ASSERT_HRESULT_FAILED(expr) \\\n    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))\n\n#endif  // GTEST_OS_WINDOWS\n\n// Macros that execute statement and check that it doesn't generate new fatal\n// failures in the current thread.\n//\n//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);\n//\n// Examples:\n//\n//   EXPECT_NO_FATAL_FAILURE(Process());\n//   ASSERT_NO_FATAL_FAILURE(Process()) << \"Process() failed\";\n//\n#define ASSERT_NO_FATAL_FAILURE(statement) \\\n    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)\n#define EXPECT_NO_FATAL_FAILURE(statement) \\\n    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)\n\n// Causes a trace (including the source file path, the current line\n// number, and the given message) to be included in every test failure\n// message generated by code in the current scope.  The effect is\n// undone when the control leaves the current scope.\n//\n// The message argument can be anything streamable to std::ostream.\n//\n// In the implementation, we include the current line number as part\n// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s\n// to appear in the same block - as long as they are on different\n// lines.\n#define SCOPED_TRACE(message) \\\n  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\\\n    __FILE__, __LINE__, ::testing::Message() << (message))\n\nnamespace internal {\n\n// This template is declared, but intentionally undefined.\ntemplate <typename T1, typename T2>\nstruct StaticAssertTypeEqHelper;\n\ntemplate <typename T>\nstruct StaticAssertTypeEqHelper<T, T> {};\n\n}  // namespace internal\n\n// Compile-time assertion for type equality.\n// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are\n// the same type.  The value it returns is not interesting.\n//\n// Instead of making StaticAssertTypeEq a class template, we make it a\n// function template that invokes a helper class template.  This\n// prevents a user from misusing StaticAssertTypeEq<T1, T2> by\n// defining objects of that type.\n//\n// CAVEAT:\n//\n// When used inside a method of a class template,\n// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is\n// instantiated.  For example, given:\n//\n//   template <typename T> class Foo {\n//    public:\n//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }\n//   };\n//\n// the code:\n//\n//   void Test1() { Foo<bool> foo; }\n//\n// will NOT generate a compiler error, as Foo<bool>::Bar() is never\n// actually instantiated.  Instead, you need:\n//\n//   void Test2() { Foo<bool> foo; foo.Bar(); }\n//\n// to cause a compiler error.\ntemplate <typename T1, typename T2>\nbool StaticAssertTypeEq() {\n  internal::StaticAssertTypeEqHelper<T1, T2>();\n  return true;\n}\n\n// Defines a test.\n//\n// The first parameter is the name of the test case, and the second\n// parameter is the name of the test within the test case.\n//\n// The convention is to end the test case name with \"Test\".  For\n// example, a test case for the Foo class can be named FooTest.\n//\n// The user should put his test code between braces after using this\n// macro.  Example:\n//\n//   TEST(FooTest, InitializesCorrectly) {\n//     Foo foo;\n//     EXPECT_TRUE(foo.StatusIsOK());\n//   }\n\n// Note that we call GetTestTypeId() instead of GetTypeId<\n// ::testing::Test>() here to get the type ID of testing::Test.  This\n// is to work around a suspected linker bug when using Google Test as\n// a framework on Mac OS X.  The bug causes GetTypeId<\n// ::testing::Test>() to return different values depending on whether\n// the call is from the Google Test framework itself or from user test\n// code.  GetTestTypeId() is guaranteed to always return the same\n// value, as it always calls GetTypeId<>() from the Google Test\n// framework.\n#define GTEST_TEST(test_case_name, test_name)\\\n  GTEST_TEST_(test_case_name, test_name, \\\n              ::testing::Test, ::testing::internal::GetTestTypeId())\n\n// Define this macro to 1 to omit the definition of TEST(), which\n// is a generic name and clashes with some other libraries.\n#if !GTEST_DONT_DEFINE_TEST\n#define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)\n#endif\n\n// Defines a test that uses a test fixture.\n//\n// The first parameter is the name of the test fixture class, which\n// also doubles as the test case name.  The second parameter is the\n// name of the test within the test case.\n//\n// A test fixture class must be declared earlier.  The user should put\n// his test code between braces after using this macro.  Example:\n//\n//   class FooTest : public testing::Test {\n//    protected:\n//     virtual void SetUp() { b_.AddElement(3); }\n//\n//     Foo a_;\n//     Foo b_;\n//   };\n//\n//   TEST_F(FooTest, InitializesCorrectly) {\n//     EXPECT_TRUE(a_.StatusIsOK());\n//   }\n//\n//   TEST_F(FooTest, ReturnsElementCountCorrectly) {\n//     EXPECT_EQ(0, a_.size());\n//     EXPECT_EQ(1, b_.size());\n//   }\n\n#define TEST_F(test_fixture, test_name)\\\n  GTEST_TEST_(test_fixture, test_name, test_fixture, \\\n              ::testing::internal::GetTypeId<test_fixture>())\n\n// Use this macro in main() to run all tests.  It returns 0 if all\n// tests are successful, or 1 otherwise.\n//\n// RUN_ALL_TESTS() should be invoked after the command line has been\n// parsed by InitGoogleTest().\n\n#define RUN_ALL_TESTS()\\\n  (::testing::UnitTest::GetInstance()->Run())\n\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_pred_impl.h",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This file is AUTOMATICALLY GENERATED on 10/02/2008 by command\n// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!\n//\n// Implements a family of generic predicate assertion macros.\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n\n// Makes sure this header is not included before gtest.h.\n#ifndef GTEST_INCLUDE_GTEST_GTEST_H_\n#error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.\n#endif  // GTEST_INCLUDE_GTEST_GTEST_H_\n\n// This header implements a family of generic predicate assertion\n// macros:\n//\n//   ASSERT_PRED_FORMAT1(pred_format, v1)\n//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)\n//   ...\n//\n// where pred_format is a function or functor that takes n (in the\n// case of ASSERT_PRED_FORMATn) values and their source expression\n// text, and returns a testing::AssertionResult.  See the definition\n// of ASSERT_EQ in gtest.h for an example.\n//\n// If you don't care about formatting, you can use the more\n// restrictive version:\n//\n//   ASSERT_PRED1(pred, v1)\n//   ASSERT_PRED2(pred, v1, v2)\n//   ...\n//\n// where pred is an n-ary function or functor that returns bool,\n// and the values v1, v2, ..., must support the << operator for\n// streaming to std::ostream.\n//\n// We also define the EXPECT_* variations.\n//\n// For now we only support predicates whose arity is at most 5.\n// Please email googletestframework@googlegroups.com if you need\n// support for higher arities.\n\n// GTEST_ASSERT_ is the basic statement to which all of the assertions\n// in this file reduce.  Don't use this in your code.\n\n#define GTEST_ASSERT_(expression, on_failure) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (const ::testing::AssertionResult gtest_ar = (expression)) \\\n    ; \\\n  else \\\n    on_failure(gtest_ar.failure_message())\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1>\nAssertionResult AssertPred1Helper(const char* pred_text,\n                                  const char* e1,\n                                  Pred pred,\n                                  const T1& v1) {\n  if (pred(v1)) return AssertionSuccess();\n\n  Message msg;\n  msg << pred_text << \"(\"\n      << e1 << \") evaluates to false, where\"\n      << \"\\n\" << e1 << \" evaluates to \" << v1;\n  return AssertionFailure(msg);\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, v1),\\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use\n// this in your code.\n#define GTEST_PRED1_(pred, v1, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \\\n                                             #v1, \\\n                                             pred, \\\n                                             v1), on_failure)\n\n// Unary predicate assertion macros.\n#define EXPECT_PRED_FORMAT1(pred_format, v1) \\\n  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED1(pred, v1) \\\n  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT1(pred_format, v1) \\\n  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED1(pred, v1) \\\n  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2>\nAssertionResult AssertPred2Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2) {\n  if (pred(v1, v2)) return AssertionSuccess();\n\n  Message msg;\n  msg << pred_text << \"(\"\n      << e1 << \", \"\n      << e2 << \") evaluates to false, where\"\n      << \"\\n\" << e1 << \" evaluates to \" << v1\n      << \"\\n\" << e2 << \" evaluates to \" << v2;\n  return AssertionFailure(msg);\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2),\\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use\n// this in your code.\n#define GTEST_PRED2_(pred, v1, v2, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2), on_failure)\n\n// Binary predicate assertion macros.\n#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \\\n  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED2(pred, v1, v2) \\\n  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \\\n  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED2(pred, v1, v2) \\\n  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2,\n          typename T3>\nAssertionResult AssertPred3Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  const char* e3,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2,\n                                  const T3& v3) {\n  if (pred(v1, v2, v3)) return AssertionSuccess();\n\n  Message msg;\n  msg << pred_text << \"(\"\n      << e1 << \", \"\n      << e2 << \", \"\n      << e3 << \") evaluates to false, where\"\n      << \"\\n\" << e1 << \" evaluates to \" << v1\n      << \"\\n\" << e2 << \" evaluates to \" << v2\n      << \"\\n\" << e3 << \" evaluates to \" << v3;\n  return AssertionFailure(msg);\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3),\\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use\n// this in your code.\n#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             #v3, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2, \\\n                                             v3), on_failure)\n\n// Ternary predicate assertion macros.\n#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \\\n  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED3(pred, v1, v2, v3) \\\n  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \\\n  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED3(pred, v1, v2, v3) \\\n  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2,\n          typename T3,\n          typename T4>\nAssertionResult AssertPred4Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  const char* e3,\n                                  const char* e4,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2,\n                                  const T3& v3,\n                                  const T4& v4) {\n  if (pred(v1, v2, v3, v4)) return AssertionSuccess();\n\n  Message msg;\n  msg << pred_text << \"(\"\n      << e1 << \", \"\n      << e2 << \", \"\n      << e3 << \", \"\n      << e4 << \") evaluates to false, where\"\n      << \"\\n\" << e1 << \" evaluates to \" << v1\n      << \"\\n\" << e2 << \" evaluates to \" << v2\n      << \"\\n\" << e3 << \" evaluates to \" << v3\n      << \"\\n\" << e4 << \" evaluates to \" << v4;\n  return AssertionFailure(msg);\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use\n// this in your code.\n#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             #v3, \\\n                                             #v4, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2, \\\n                                             v3, \\\n                                             v4), on_failure)\n\n// 4-ary predicate assertion macros.\n#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \\\n  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED4(pred, v1, v2, v3, v4) \\\n  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \\\n  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED4(pred, v1, v2, v3, v4) \\\n  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)\n\n\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use\n// this in your code.\ntemplate <typename Pred,\n          typename T1,\n          typename T2,\n          typename T3,\n          typename T4,\n          typename T5>\nAssertionResult AssertPred5Helper(const char* pred_text,\n                                  const char* e1,\n                                  const char* e2,\n                                  const char* e3,\n                                  const char* e4,\n                                  const char* e5,\n                                  Pred pred,\n                                  const T1& v1,\n                                  const T2& v2,\n                                  const T3& v3,\n                                  const T4& v4,\n                                  const T5& v5) {\n  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();\n\n  Message msg;\n  msg << pred_text << \"(\"\n      << e1 << \", \"\n      << e2 << \", \"\n      << e3 << \", \"\n      << e4 << \", \"\n      << e5 << \") evaluates to false, where\"\n      << \"\\n\" << e1 << \" evaluates to \" << v1\n      << \"\\n\" << e2 << \" evaluates to \" << v2\n      << \"\\n\" << e3 << \" evaluates to \" << v3\n      << \"\\n\" << e4 << \" evaluates to \" << v4\n      << \"\\n\" << e5 << \" evaluates to \" << v5;\n  return AssertionFailure(msg);\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\\\n  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use\n// this in your code.\n#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\\\n  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \\\n                                             #v1, \\\n                                             #v2, \\\n                                             #v3, \\\n                                             #v4, \\\n                                             #v5, \\\n                                             pred, \\\n                                             v1, \\\n                                             v2, \\\n                                             v3, \\\n                                             v4, \\\n                                             v5), on_failure)\n\n// 5-ary predicate assertion macros.\n#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \\\n  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \\\n  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \\\n  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \\\n  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)\n\n\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_prod.h",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// Google C++ Testing Framework definitions useful in production code.\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_\n\n// When you need to test the private or protected members of a class,\n// use the FRIEND_TEST macro to declare your tests as friends of the\n// class.  For example:\n//\n// class MyClass {\n//  private:\n//   void MyMethod();\n//   FRIEND_TEST(MyClassTest, MyMethod);\n// };\n//\n// class MyClassTest : public testing::Test {\n//   // ...\n// };\n//\n// TEST_F(MyClassTest, MyMethod) {\n//   // Can call MyClass::MyMethod() here.\n// }\n\n#define FRIEND_TEST(test_case_name, test_name)\\\nfriend class test_case_name##_##test_name##_Test\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-death-test-internal.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This header file defines internal utilities needed for implementing\n// death tests.  They are subject to change without notice.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_\n\n#include <gtest/internal/gtest-internal.h>\n\nnamespace testing {\nnamespace internal {\n\nGTEST_DECLARE_string_(internal_run_death_test);\n\n// Names of the flags (needed for parsing Google Test flags).\nconst char kDeathTestStyleFlag[] = \"death_test_style\";\nconst char kDeathTestUseFork[] = \"death_test_use_fork\";\nconst char kInternalRunDeathTestFlag[] = \"internal_run_death_test\";\n\n#if GTEST_HAS_DEATH_TEST\n\n// DeathTest is a class that hides much of the complexity of the\n// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method\n// returns a concrete class that depends on the prevailing death test\n// style, as defined by the --gtest_death_test_style and/or\n// --gtest_internal_run_death_test flags.\n\n// In describing the results of death tests, these terms are used with\n// the corresponding definitions:\n//\n// exit status:  The integer exit information in the format specified\n//               by wait(2)\n// exit code:    The integer code passed to exit(3), _exit(2), or\n//               returned from main()\nclass GTEST_API_ DeathTest {\n public:\n  // Create returns false if there was an error determining the\n  // appropriate action to take for the current death test; for example,\n  // if the gtest_death_test_style flag is set to an invalid value.\n  // The LastMessage method will return a more detailed message in that\n  // case.  Otherwise, the DeathTest pointer pointed to by the \"test\"\n  // argument is set.  If the death test should be skipped, the pointer\n  // is set to NULL; otherwise, it is set to the address of a new concrete\n  // DeathTest object that controls the execution of the current test.\n  static bool Create(const char* statement, const RE* regex,\n                     const char* file, int line, DeathTest** test);\n  DeathTest();\n  virtual ~DeathTest() { }\n\n  // A helper class that aborts a death test when it's deleted.\n  class ReturnSentinel {\n   public:\n    explicit ReturnSentinel(DeathTest* test) : test_(test) { }\n    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }\n   private:\n    DeathTest* const test_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);\n  } GTEST_ATTRIBUTE_UNUSED_;\n\n  // An enumeration of possible roles that may be taken when a death\n  // test is encountered.  EXECUTE means that the death test logic should\n  // be executed immediately.  OVERSEE means that the program should prepare\n  // the appropriate environment for a child process to execute the death\n  // test, then wait for it to complete.\n  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };\n\n  // An enumeration of the two reasons that a test might be aborted.\n  enum AbortReason { TEST_ENCOUNTERED_RETURN_STATEMENT, TEST_DID_NOT_DIE };\n\n  // Assumes one of the above roles.\n  virtual TestRole AssumeRole() = 0;\n\n  // Waits for the death test to finish and returns its status.\n  virtual int Wait() = 0;\n\n  // Returns true if the death test passed; that is, the test process\n  // exited during the test, its exit status matches a user-supplied\n  // predicate, and its stderr output matches a user-supplied regular\n  // expression.\n  // The user-supplied predicate may be a macro expression rather\n  // than a function pointer or functor, or else Wait and Passed could\n  // be combined.\n  virtual bool Passed(bool exit_status_ok) = 0;\n\n  // Signals that the death test did not die as expected.\n  virtual void Abort(AbortReason reason) = 0;\n\n  // Returns a human-readable outcome message regarding the outcome of\n  // the last death test.\n  static const char* LastMessage();\n\n  static void set_last_death_test_message(const String& message);\n\n private:\n  // A string containing a description of the outcome of the last death test.\n  static String last_death_test_message_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);\n};\n\n// Factory interface for death tests.  May be mocked out for testing.\nclass DeathTestFactory {\n public:\n  virtual ~DeathTestFactory() { }\n  virtual bool Create(const char* statement, const RE* regex,\n                      const char* file, int line, DeathTest** test) = 0;\n};\n\n// A concrete DeathTestFactory implementation for normal use.\nclass DefaultDeathTestFactory : public DeathTestFactory {\n public:\n  virtual bool Create(const char* statement, const RE* regex,\n                      const char* file, int line, DeathTest** test);\n};\n\n// Returns true if exit_status describes a process that was terminated\n// by a signal, or exited normally with a nonzero exit code.\nGTEST_API_ bool ExitedUnsuccessfully(int exit_status);\n\n// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,\n// ASSERT_EXIT*, and EXPECT_EXIT*.\n#define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (::testing::internal::AlwaysTrue()) { \\\n    const ::testing::internal::RE& gtest_regex = (regex); \\\n    ::testing::internal::DeathTest* gtest_dt; \\\n    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \\\n        __FILE__, __LINE__, &gtest_dt)) { \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \\\n    } \\\n    if (gtest_dt != NULL) { \\\n      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \\\n          gtest_dt_ptr(gtest_dt); \\\n      switch (gtest_dt->AssumeRole()) { \\\n        case ::testing::internal::DeathTest::OVERSEE_TEST: \\\n          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \\\n            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \\\n          } \\\n          break; \\\n        case ::testing::internal::DeathTest::EXECUTE_TEST: { \\\n          ::testing::internal::DeathTest::ReturnSentinel \\\n              gtest_sentinel(gtest_dt); \\\n          GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \\\n          break; \\\n        } \\\n      } \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \\\n      fail(::testing::internal::DeathTest::LastMessage())\n// The symbol \"fail\" here expands to something into which a message\n// can be streamed.\n\n// A class representing the parsed contents of the\n// --gtest_internal_run_death_test flag, as it existed when\n// RUN_ALL_TESTS was called.\nclass InternalRunDeathTestFlag {\n public:\n  InternalRunDeathTestFlag(const String& a_file,\n                           int a_line,\n                           int an_index,\n                           int a_write_fd)\n      : file_(a_file), line_(a_line), index_(an_index),\n        write_fd_(a_write_fd) {}\n\n  ~InternalRunDeathTestFlag() {\n    if (write_fd_ >= 0)\n      posix::Close(write_fd_);\n  }\n\n  String file() const { return file_; }\n  int line() const { return line_; }\n  int index() const { return index_; }\n  int write_fd() const { return write_fd_; }\n\n private:\n  String file_;\n  int line_;\n  int index_;\n  int write_fd_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);\n};\n\n// Returns a newly created InternalRunDeathTestFlag object with fields\n// initialized from the GTEST_FLAG(internal_run_death_test) flag if\n// the flag is specified; otherwise returns NULL.\nInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();\n\n#else  // GTEST_HAS_DEATH_TEST\n\n// This macro is used for implementing macros such as\n// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where\n// death tests are not supported. Those macros must compile on such systems\n// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on\n// systems that support death tests. This allows one to write such a macro\n// on a system that does not support death tests and be sure that it will\n// compile on a death-test supporting system.\n//\n// Parameters:\n//   statement -  A statement that a macro such as EXPECT_DEATH would test\n//                for program termination. This macro has to make sure this\n//                statement is compiled but not executed, to ensure that\n//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain\n//                parameter iff EXPECT_DEATH compiles with it.\n//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test\n//                the output of statement.  This parameter has to be\n//                compiled but not evaluated by this macro, to ensure that\n//                this macro only accepts expressions that a macro such as\n//                EXPECT_DEATH would accept.\n//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED\n//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.\n//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not\n//                compile inside functions where ASSERT_DEATH doesn't\n//                compile.\n//\n//  The branch that has an always false condition is used to ensure that\n//  statement and regex are compiled (and thus syntactically correct) but\n//  never executed. The unreachable code macro protects the terminator\n//  statement from generating an 'unreachable code' warning in case\n//  statement unconditionally returns or throws. The Message constructor at\n//  the end allows the syntax of streaming additional messages into the\n//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.\n#define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \\\n    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n    if (::testing::internal::AlwaysTrue()) { \\\n      GTEST_LOG_(WARNING) \\\n          << \"Death tests are not supported on this platform.\\n\" \\\n          << \"Statement '\" #statement \"' cannot be verified.\"; \\\n    } else if (::testing::internal::AlwaysFalse()) { \\\n      ::testing::internal::RE::PartialMatch(\".*\", (regex)); \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n      terminator; \\\n    } else \\\n      ::testing::Message()\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-filepath.h",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: keith.ray@gmail.com (Keith Ray)\n//\n// Google Test filepath utilities\n//\n// This header file declares classes and functions used internally by\n// Google Test.  They are subject to change without notice.\n//\n// This file is #included in <gtest/internal/gtest-internal.h>.\n// Do not include this header file separately!\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_\n\n#include <gtest/internal/gtest-string.h>\n\nnamespace testing {\nnamespace internal {\n\n// FilePath - a class for file and directory pathname manipulation which\n// handles platform-specific conventions (like the pathname separator).\n// Used for helper functions for naming files in a directory for xml output.\n// Except for Set methods, all methods are const or static, which provides an\n// \"immutable value object\" -- useful for peace of mind.\n// A FilePath with a value ending in a path separator (\"like/this/\") represents\n// a directory, otherwise it is assumed to represent a file. In either case,\n// it may or may not represent an actual file or directory in the file system.\n// Names are NOT checked for syntax correctness -- no checking for illegal\n// characters, malformed paths, etc.\n\nclass GTEST_API_ FilePath {\n public:\n  FilePath() : pathname_(\"\") { }\n  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }\n\n  explicit FilePath(const char* pathname) : pathname_(pathname) {\n    Normalize();\n  }\n\n  explicit FilePath(const String& pathname) : pathname_(pathname) {\n    Normalize();\n  }\n\n  FilePath& operator=(const FilePath& rhs) {\n    Set(rhs);\n    return *this;\n  }\n\n  void Set(const FilePath& rhs) {\n    pathname_ = rhs.pathname_;\n  }\n\n  String ToString() const { return pathname_; }\n  const char* c_str() const { return pathname_.c_str(); }\n\n  // Returns the current working directory, or \"\" if unsuccessful.\n  static FilePath GetCurrentDir();\n\n  // Given directory = \"dir\", base_name = \"test\", number = 0,\n  // extension = \"xml\", returns \"dir/test.xml\". If number is greater\n  // than zero (e.g., 12), returns \"dir/test_12.xml\".\n  // On Windows platform, uses \\ as the separator rather than /.\n  static FilePath MakeFileName(const FilePath& directory,\n                               const FilePath& base_name,\n                               int number,\n                               const char* extension);\n\n  // Given directory = \"dir\", relative_path = \"test.xml\",\n  // returns \"dir/test.xml\".\n  // On Windows, uses \\ as the separator rather than /.\n  static FilePath ConcatPaths(const FilePath& directory,\n                              const FilePath& relative_path);\n\n  // Returns a pathname for a file that does not currently exist. The pathname\n  // will be directory/base_name.extension or\n  // directory/base_name_<number>.extension if directory/base_name.extension\n  // already exists. The number will be incremented until a pathname is found\n  // that does not already exist.\n  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.\n  // There could be a race condition if two or more processes are calling this\n  // function at the same time -- they could both pick the same filename.\n  static FilePath GenerateUniqueFileName(const FilePath& directory,\n                                         const FilePath& base_name,\n                                         const char* extension);\n\n  // Returns true iff the path is NULL or \"\".\n  bool IsEmpty() const { return c_str() == NULL || *c_str() == '\\0'; }\n\n  // If input name has a trailing separator character, removes it and returns\n  // the name, otherwise return the name string unmodified.\n  // On Windows platform, uses \\ as the separator, other platforms use /.\n  FilePath RemoveTrailingPathSeparator() const;\n\n  // Returns a copy of the FilePath with the directory part removed.\n  // Example: FilePath(\"path/to/file\").RemoveDirectoryName() returns\n  // FilePath(\"file\"). If there is no directory part (\"just_a_file\"), it returns\n  // the FilePath unmodified. If there is no file part (\"just_a_dir/\") it\n  // returns an empty FilePath (\"\").\n  // On Windows platform, '\\' is the path separator, otherwise it is '/'.\n  FilePath RemoveDirectoryName() const;\n\n  // RemoveFileName returns the directory path with the filename removed.\n  // Example: FilePath(\"path/to/file\").RemoveFileName() returns \"path/to/\".\n  // If the FilePath is \"a_file\" or \"/a_file\", RemoveFileName returns\n  // FilePath(\"./\") or, on Windows, FilePath(\".\\\\\"). If the filepath does\n  // not have a file, like \"just/a/dir/\", it returns the FilePath unmodified.\n  // On Windows platform, '\\' is the path separator, otherwise it is '/'.\n  FilePath RemoveFileName() const;\n\n  // Returns a copy of the FilePath with the case-insensitive extension removed.\n  // Example: FilePath(\"dir/file.exe\").RemoveExtension(\"EXE\") returns\n  // FilePath(\"dir/file\"). If a case-insensitive extension is not\n  // found, returns a copy of the original FilePath.\n  FilePath RemoveExtension(const char* extension) const;\n\n  // Creates directories so that path exists. Returns true if successful or if\n  // the directories already exist; returns false if unable to create\n  // directories for any reason. Will also return false if the FilePath does\n  // not represent a directory (that is, it doesn't end with a path separator).\n  bool CreateDirectoriesRecursively() const;\n\n  // Create the directory so that path exists. Returns true if successful or\n  // if the directory already exists; returns false if unable to create the\n  // directory for any reason, including if the parent directory does not\n  // exist. Not named \"CreateDirectory\" because that's a macro on Windows.\n  bool CreateFolder() const;\n\n  // Returns true if FilePath describes something in the file-system,\n  // either a file, directory, or whatever, and that something exists.\n  bool FileOrDirectoryExists() const;\n\n  // Returns true if pathname describes a directory in the file-system\n  // that exists.\n  bool DirectoryExists() const;\n\n  // Returns true if FilePath ends with a path separator, which indicates that\n  // it is intended to represent a directory. Returns false otherwise.\n  // This does NOT check that a directory (or file) actually exists.\n  bool IsDirectory() const;\n\n  // Returns true if pathname describes a root directory. (Windows has one\n  // root directory per disk drive.)\n  bool IsRootDirectory() const;\n\n  // Returns true if pathname describes an absolute path.\n  bool IsAbsolutePath() const;\n\n private:\n  // Replaces multiple consecutive separators with a single separator.\n  // For example, \"bar///foo\" becomes \"bar/foo\". Does not eliminate other\n  // redundancies that might be in a pathname involving \".\" or \"..\".\n  //\n  // A pathname with multiple consecutive separators may occur either through\n  // user error or as a result of some scripts or APIs that generate a pathname\n  // with a trailing separator. On other platforms the same API or script\n  // may NOT generate a pathname with a trailing \"/\". Then elsewhere that\n  // pathname may have another \"/\" and pathname components added to it,\n  // without checking for the separator already being there.\n  // The script language and operating system may allow paths like \"foo//bar\"\n  // but some of the functions in FilePath will not handle that correctly. In\n  // particular, RemoveTrailingPathSeparator() only removes one separator, and\n  // it is called in CreateDirectoriesRecursively() assuming that it will change\n  // a pathname from directory syntax (trailing separator) to filename syntax.\n  //\n  // On Windows this method also replaces the alternate path separator '/' with\n  // the primary path separator '\\\\', so that for example \"bar\\\\/\\\\foo\" becomes\n  // \"bar\\\\foo\".\n\n  void Normalize();\n\n  // Returns a pointer to the last occurence of a valid path separator in\n  // the FilePath. On Windows, for example, both '/' and '\\' are valid path\n  // separators. Returns NULL if no path separator was found.\n  const char* FindLastPathSeparator() const;\n\n  String pathname_;\n};  // class FilePath\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-internal.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This header file declares functions and macros used internally by\n// Google Test.  They are subject to change without notice.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_\n\n#include <gtest/internal/gtest-port.h>\n\n#if GTEST_OS_LINUX\n#include <stdlib.h>\n#include <sys/types.h>\n#include <sys/wait.h>\n#include <unistd.h>\n#endif  // GTEST_OS_LINUX\n\n#include <ctype.h>\n#include <string.h>\n#include <iomanip>\n#include <limits>\n#include <set>\n\n#include <gtest/internal/gtest-string.h>\n#include <gtest/internal/gtest-filepath.h>\n#include <gtest/internal/gtest-type-util.h>\n\n// Due to C++ preprocessor weirdness, we need double indirection to\n// concatenate two tokens when one of them is __LINE__.  Writing\n//\n//   foo ## __LINE__\n//\n// will result in the token foo__LINE__, instead of foo followed by\n// the current line number.  For more details, see\n// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6\n#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)\n#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar\n\n// Google Test defines the testing::Message class to allow construction of\n// test messages via the << operator.  The idea is that anything\n// streamable to std::ostream can be streamed to a testing::Message.\n// This allows a user to use his own types in Google Test assertions by\n// overloading the << operator.\n//\n// util/gtl/stl_logging-inl.h overloads << for STL containers.  These\n// overloads cannot be defined in the std namespace, as that will be\n// undefined behavior.  Therefore, they are defined in the global\n// namespace instead.\n//\n// C++'s symbol lookup rule (i.e. Koenig lookup) says that these\n// overloads are visible in either the std namespace or the global\n// namespace, but not other namespaces, including the testing\n// namespace which Google Test's Message class is in.\n//\n// To allow STL containers (and other types that has a << operator\n// defined in the global namespace) to be used in Google Test assertions,\n// testing::Message must access the custom << operator from the global\n// namespace.  Hence this helper function.\n//\n// Note: Jeffrey Yasskin suggested an alternative fix by \"using\n// ::operator<<;\" in the definition of Message's operator<<.  That fix\n// doesn't require a helper function, but unfortunately doesn't\n// compile with MSVC.\ntemplate <typename T>\ninline void GTestStreamToHelper(std::ostream* os, const T& val) {\n  *os << val;\n}\n\nnamespace testing {\n\n// Forward declaration of classes.\n\nclass AssertionResult;                 // Result of an assertion.\nclass Message;                         // Represents a failure message.\nclass Test;                            // Represents a test.\nclass TestInfo;                        // Information about a test.\nclass TestPartResult;                  // Result of a test part.\nclass UnitTest;                        // A collection of test cases.\n\nnamespace internal {\n\nstruct TraceInfo;                      // Information about a trace point.\nclass ScopedTrace;                     // Implements scoped trace.\nclass TestInfoImpl;                    // Opaque implementation of TestInfo\nclass UnitTestImpl;                    // Opaque implementation of UnitTest\n\n// How many times InitGoogleTest() has been called.\nextern int g_init_gtest_count;\n\n// The text used in failure messages to indicate the start of the\n// stack trace.\nGTEST_API_ extern const char kStackTraceMarker[];\n\n// A secret type that Google Test users don't know about.  It has no\n// definition on purpose.  Therefore it's impossible to create a\n// Secret object, which is what we want.\nclass Secret;\n\n// Two overloaded helpers for checking at compile time whether an\n// expression is a null pointer literal (i.e. NULL or any 0-valued\n// compile-time integral constant).  Their return values have\n// different sizes, so we can use sizeof() to test which version is\n// picked by the compiler.  These helpers have no implementations, as\n// we only need their signatures.\n//\n// Given IsNullLiteralHelper(x), the compiler will pick the first\n// version if x can be implicitly converted to Secret*, and pick the\n// second version otherwise.  Since Secret is a secret and incomplete\n// type, the only expression a user can write that has type Secret* is\n// a null pointer literal.  Therefore, we know that x is a null\n// pointer literal if and only if the first version is picked by the\n// compiler.\nchar IsNullLiteralHelper(Secret* p);\nchar (&IsNullLiteralHelper(...))[2];  // NOLINT\n\n// A compile-time bool constant that is true if and only if x is a\n// null pointer literal (i.e. NULL or any 0-valued compile-time\n// integral constant).\n#ifdef GTEST_ELLIPSIS_NEEDS_POD_\n// We lose support for NULL detection where the compiler doesn't like\n// passing non-POD classes through ellipsis (...).\n#define GTEST_IS_NULL_LITERAL_(x) false\n#else\n#define GTEST_IS_NULL_LITERAL_(x) \\\n    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)\n#endif  // GTEST_ELLIPSIS_NEEDS_POD_\n\n// Appends the user-supplied message to the Google-Test-generated message.\nGTEST_API_ String AppendUserMessage(const String& gtest_msg,\n                                    const Message& user_msg);\n\n// A helper class for creating scoped traces in user programs.\nclass GTEST_API_ ScopedTrace {\n public:\n  // The c'tor pushes the given source file location and message onto\n  // a trace stack maintained by Google Test.\n  ScopedTrace(const char* file, int line, const Message& message);\n\n  // The d'tor pops the info pushed by the c'tor.\n  //\n  // Note that the d'tor is not virtual in order to be efficient.\n  // Don't inherit from ScopedTrace!\n  ~ScopedTrace();\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);\n} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its\n                            // c'tor and d'tor.  Therefore it doesn't\n                            // need to be used otherwise.\n\n// Converts a streamable value to a String.  A NULL pointer is\n// converted to \"(null)\".  When the input value is a ::string,\n// ::std::string, ::wstring, or ::std::wstring object, each NUL\n// character in it is replaced with \"\\\\0\".\n// Declared here but defined in gtest.h, so that it has access\n// to the definition of the Message class, required by the ARM\n// compiler.\ntemplate <typename T>\nString StreamableToString(const T& streamable);\n\n// Formats a value to be used in a failure message.\n\n#ifdef GTEST_NEEDS_IS_POINTER_\n\n// These are needed as the Nokia Symbian and IBM XL C/C++ compilers\n// cannot decide between const T& and const T* in a function template.\n// These compilers _can_ decide between class template specializations\n// for T and T*, so a tr1::type_traits-like is_pointer works, and we\n// can overload on that.\n\n// This overload makes sure that all pointers (including\n// those to char or wchar_t) are printed as raw pointers.\ntemplate <typename T>\ninline String FormatValueForFailureMessage(internal::true_type /*dummy*/,\n                                           T* pointer) {\n  return StreamableToString(static_cast<const void*>(pointer));\n}\n\ntemplate <typename T>\ninline String FormatValueForFailureMessage(internal::false_type /*dummy*/,\n                                           const T& value) {\n  return StreamableToString(value);\n}\n\ntemplate <typename T>\ninline String FormatForFailureMessage(const T& value) {\n  return FormatValueForFailureMessage(\n      typename internal::is_pointer<T>::type(), value);\n}\n\n#else\n\n// These are needed as the above solution using is_pointer has the\n// limitation that T cannot be a type without external linkage, when\n// compiled using MSVC.\n\ntemplate <typename T>\ninline String FormatForFailureMessage(const T& value) {\n  return StreamableToString(value);\n}\n\n// This overload makes sure that all pointers (including\n// those to char or wchar_t) are printed as raw pointers.\ntemplate <typename T>\ninline String FormatForFailureMessage(T* pointer) {\n  return StreamableToString(static_cast<const void*>(pointer));\n}\n\n#endif  // GTEST_NEEDS_IS_POINTER_\n\n// These overloaded versions handle narrow and wide characters.\nGTEST_API_ String FormatForFailureMessage(char ch);\nGTEST_API_ String FormatForFailureMessage(wchar_t wchar);\n\n// When this operand is a const char* or char*, and the other operand\n// is a ::std::string or ::string, we print this operand as a C string\n// rather than a pointer.  We do the same for wide strings.\n\n// This internal macro is used to avoid duplicated code.\n#define GTEST_FORMAT_IMPL_(operand2_type, operand1_printer)\\\ninline String FormatForComparisonFailureMessage(\\\n    operand2_type::value_type* str, const operand2_type& /*operand2*/) {\\\n  return operand1_printer(str);\\\n}\\\ninline String FormatForComparisonFailureMessage(\\\n    const operand2_type::value_type* str, const operand2_type& /*operand2*/) {\\\n  return operand1_printer(str);\\\n}\n\nGTEST_FORMAT_IMPL_(::std::string, String::ShowCStringQuoted)\n#if GTEST_HAS_STD_WSTRING\nGTEST_FORMAT_IMPL_(::std::wstring, String::ShowWideCStringQuoted)\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_HAS_GLOBAL_STRING\nGTEST_FORMAT_IMPL_(::string, String::ShowCStringQuoted)\n#endif  // GTEST_HAS_GLOBAL_STRING\n#if GTEST_HAS_GLOBAL_WSTRING\nGTEST_FORMAT_IMPL_(::wstring, String::ShowWideCStringQuoted)\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n#undef GTEST_FORMAT_IMPL_\n\n// Constructs and returns the message for an equality assertion\n// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.\n//\n// The first four parameters are the expressions used in the assertion\n// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)\n// where foo is 5 and bar is 6, we have:\n//\n//   expected_expression: \"foo\"\n//   actual_expression:   \"bar\"\n//   expected_value:      \"5\"\n//   actual_value:        \"6\"\n//\n// The ignoring_case parameter is true iff the assertion is a\n// *_STRCASEEQ*.  When it's true, the string \" (ignoring case)\" will\n// be inserted into the message.\nGTEST_API_ AssertionResult EqFailure(const char* expected_expression,\n                                     const char* actual_expression,\n                                     const String& expected_value,\n                                     const String& actual_value,\n                                     bool ignoring_case);\n\n// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.\nGTEST_API_ String GetBoolAssertionFailureMessage(\n    const AssertionResult& assertion_result,\n    const char* expression_text,\n    const char* actual_predicate_value,\n    const char* expected_predicate_value);\n\n// This template class represents an IEEE floating-point number\n// (either single-precision or double-precision, depending on the\n// template parameters).\n//\n// The purpose of this class is to do more sophisticated number\n// comparison.  (Due to round-off error, etc, it's very unlikely that\n// two floating-points will be equal exactly.  Hence a naive\n// comparison by the == operation often doesn't work.)\n//\n// Format of IEEE floating-point:\n//\n//   The most-significant bit being the leftmost, an IEEE\n//   floating-point looks like\n//\n//     sign_bit exponent_bits fraction_bits\n//\n//   Here, sign_bit is a single bit that designates the sign of the\n//   number.\n//\n//   For float, there are 8 exponent bits and 23 fraction bits.\n//\n//   For double, there are 11 exponent bits and 52 fraction bits.\n//\n//   More details can be found at\n//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.\n//\n// Template parameter:\n//\n//   RawType: the raw floating-point type (either float or double)\ntemplate <typename RawType>\nclass FloatingPoint {\n public:\n  // Defines the unsigned integer type that has the same size as the\n  // floating point number.\n  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;\n\n  // Constants.\n\n  // # of bits in a number.\n  static const size_t kBitCount = 8*sizeof(RawType);\n\n  // # of fraction bits in a number.\n  static const size_t kFractionBitCount =\n    std::numeric_limits<RawType>::digits - 1;\n\n  // # of exponent bits in a number.\n  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;\n\n  // The mask for the sign bit.\n  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);\n\n  // The mask for the fraction bits.\n  static const Bits kFractionBitMask =\n    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);\n\n  // The mask for the exponent bits.\n  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);\n\n  // How many ULP's (Units in the Last Place) we want to tolerate when\n  // comparing two numbers.  The larger the value, the more error we\n  // allow.  A 0 value means that two numbers must be exactly the same\n  // to be considered equal.\n  //\n  // The maximum error of a single floating-point operation is 0.5\n  // units in the last place.  On Intel CPU's, all floating-point\n  // calculations are done with 80-bit precision, while double has 64\n  // bits.  Therefore, 4 should be enough for ordinary use.\n  //\n  // See the following article for more details on ULP:\n  // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm.\n  static const size_t kMaxUlps = 4;\n\n  // Constructs a FloatingPoint from a raw floating-point number.\n  //\n  // On an Intel CPU, passing a non-normalized NAN (Not a Number)\n  // around may change its bits, although the new value is guaranteed\n  // to be also a NAN.  Therefore, don't expect this constructor to\n  // preserve the bits in x when x is a NAN.\n  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }\n\n  // Static methods\n\n  // Reinterprets a bit pattern as a floating-point number.\n  //\n  // This function is needed to test the AlmostEquals() method.\n  static RawType ReinterpretBits(const Bits bits) {\n    FloatingPoint fp(0);\n    fp.u_.bits_ = bits;\n    return fp.u_.value_;\n  }\n\n  // Returns the floating-point number that represent positive infinity.\n  static RawType Infinity() {\n    return ReinterpretBits(kExponentBitMask);\n  }\n\n  // Non-static methods\n\n  // Returns the bits that represents this number.\n  const Bits &bits() const { return u_.bits_; }\n\n  // Returns the exponent bits of this number.\n  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }\n\n  // Returns the fraction bits of this number.\n  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }\n\n  // Returns the sign bit of this number.\n  Bits sign_bit() const { return kSignBitMask & u_.bits_; }\n\n  // Returns true iff this is NAN (not a number).\n  bool is_nan() const {\n    // It's a NAN if the exponent bits are all ones and the fraction\n    // bits are not entirely zeros.\n    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);\n  }\n\n  // Returns true iff this number is at most kMaxUlps ULP's away from\n  // rhs.  In particular, this function:\n  //\n  //   - returns false if either number is (or both are) NAN.\n  //   - treats really large numbers as almost equal to infinity.\n  //   - thinks +0.0 and -0.0 are 0 DLP's apart.\n  bool AlmostEquals(const FloatingPoint& rhs) const {\n    // The IEEE standard says that any comparison operation involving\n    // a NAN must return false.\n    if (is_nan() || rhs.is_nan()) return false;\n\n    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)\n        <= kMaxUlps;\n  }\n\n private:\n  // The data type used to store the actual floating-point number.\n  union FloatingPointUnion {\n    RawType value_;  // The raw floating-point number.\n    Bits bits_;      // The bits that represent the number.\n  };\n\n  // Converts an integer from the sign-and-magnitude representation to\n  // the biased representation.  More precisely, let N be 2 to the\n  // power of (kBitCount - 1), an integer x is represented by the\n  // unsigned number x + N.\n  //\n  // For instance,\n  //\n  //   -N + 1 (the most negative number representable using\n  //          sign-and-magnitude) is represented by 1;\n  //   0      is represented by N; and\n  //   N - 1  (the biggest number representable using\n  //          sign-and-magnitude) is represented by 2N - 1.\n  //\n  // Read http://en.wikipedia.org/wiki/Signed_number_representations\n  // for more details on signed number representations.\n  static Bits SignAndMagnitudeToBiased(const Bits &sam) {\n    if (kSignBitMask & sam) {\n      // sam represents a negative number.\n      return ~sam + 1;\n    } else {\n      // sam represents a positive number.\n      return kSignBitMask | sam;\n    }\n  }\n\n  // Given two numbers in the sign-and-magnitude representation,\n  // returns the distance between them as an unsigned number.\n  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,\n                                                     const Bits &sam2) {\n    const Bits biased1 = SignAndMagnitudeToBiased(sam1);\n    const Bits biased2 = SignAndMagnitudeToBiased(sam2);\n    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);\n  }\n\n  FloatingPointUnion u_;\n};\n\n// Typedefs the instances of the FloatingPoint template class that we\n// care to use.\ntypedef FloatingPoint<float> Float;\ntypedef FloatingPoint<double> Double;\n\n// In order to catch the mistake of putting tests that use different\n// test fixture classes in the same test case, we need to assign\n// unique IDs to fixture classes and compare them.  The TypeId type is\n// used to hold such IDs.  The user should treat TypeId as an opaque\n// type: the only operation allowed on TypeId values is to compare\n// them for equality using the == operator.\ntypedef const void* TypeId;\n\ntemplate <typename T>\nclass TypeIdHelper {\n public:\n  // dummy_ must not have a const type.  Otherwise an overly eager\n  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge\n  // TypeIdHelper<T>::dummy_ for different Ts as an \"optimization\".\n  static bool dummy_;\n};\n\ntemplate <typename T>\nbool TypeIdHelper<T>::dummy_ = false;\n\n// GetTypeId<T>() returns the ID of type T.  Different values will be\n// returned for different types.  Calling the function twice with the\n// same type argument is guaranteed to return the same ID.\ntemplate <typename T>\nTypeId GetTypeId() {\n  // The compiler is required to allocate a different\n  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate\n  // the template.  Therefore, the address of dummy_ is guaranteed to\n  // be unique.\n  return &(TypeIdHelper<T>::dummy_);\n}\n\n// Returns the type ID of ::testing::Test.  Always call this instead\n// of GetTypeId< ::testing::Test>() to get the type ID of\n// ::testing::Test, as the latter may give the wrong result due to a\n// suspected linker bug when compiling Google Test as a Mac OS X\n// framework.\nGTEST_API_ TypeId GetTestTypeId();\n\n// Defines the abstract factory interface that creates instances\n// of a Test object.\nclass TestFactoryBase {\n public:\n  virtual ~TestFactoryBase() {}\n\n  // Creates a test instance to run. The instance is both created and destroyed\n  // within TestInfoImpl::Run()\n  virtual Test* CreateTest() = 0;\n\n protected:\n  TestFactoryBase() {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);\n};\n\n// This class provides implementation of TeastFactoryBase interface.\n// It is used in TEST and TEST_F macros.\ntemplate <class TestClass>\nclass TestFactoryImpl : public TestFactoryBase {\n public:\n  virtual Test* CreateTest() { return new TestClass; }\n};\n\n#if GTEST_OS_WINDOWS\n\n// Predicate-formatters for implementing the HRESULT checking macros\n// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}\n// We pass a long instead of HRESULT to avoid causing an\n// include dependency for the HRESULT type.\nGTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,\n                                            long hr);  // NOLINT\nGTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,\n                                            long hr);  // NOLINT\n\n#endif  // GTEST_OS_WINDOWS\n\n// Formats a source file path and a line number as they would appear\n// in a compiler error message.\ninline String FormatFileLocation(const char* file, int line) {\n  const char* const file_name = file == NULL ? \"unknown file\" : file;\n  if (line < 0) {\n    return String::Format(\"%s:\", file_name);\n  }\n#ifdef _MSC_VER\n  return String::Format(\"%s(%d):\", file_name, line);\n#else\n  return String::Format(\"%s:%d:\", file_name, line);\n#endif  // _MSC_VER\n}\n\n// Types of SetUpTestCase() and TearDownTestCase() functions.\ntypedef void (*SetUpTestCaseFunc)();\ntypedef void (*TearDownTestCaseFunc)();\n\n// Creates a new TestInfo object and registers it with Google Test;\n// returns the created object.\n//\n// Arguments:\n//\n//   test_case_name:   name of the test case\n//   name:             name of the test\n//   test_case_comment: a comment on the test case that will be included in\n//                      the test output\n//   comment:          a comment on the test that will be included in the\n//                     test output\n//   fixture_class_id: ID of the test fixture class\n//   set_up_tc:        pointer to the function that sets up the test case\n//   tear_down_tc:     pointer to the function that tears down the test case\n//   factory:          pointer to the factory that creates a test object.\n//                     The newly created TestInfo instance will assume\n//                     ownership of the factory object.\nGTEST_API_ TestInfo* MakeAndRegisterTestInfo(\n    const char* test_case_name, const char* name,\n    const char* test_case_comment, const char* comment,\n    TypeId fixture_class_id,\n    SetUpTestCaseFunc set_up_tc,\n    TearDownTestCaseFunc tear_down_tc,\n    TestFactoryBase* factory);\n\n// If *pstr starts with the given prefix, modifies *pstr to be right\n// past the prefix and returns true; otherwise leaves *pstr unchanged\n// and returns false.  None of pstr, *pstr, and prefix can be NULL.\nbool SkipPrefix(const char* prefix, const char** pstr);\n\n#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n// State of the definition of a type-parameterized test case.\nclass GTEST_API_ TypedTestCasePState {\n public:\n  TypedTestCasePState() : registered_(false) {}\n\n  // Adds the given test name to defined_test_names_ and return true\n  // if the test case hasn't been registered; otherwise aborts the\n  // program.\n  bool AddTestName(const char* file, int line, const char* case_name,\n                   const char* test_name) {\n    if (registered_) {\n      fprintf(stderr, \"%s Test %s must be defined before \"\n              \"REGISTER_TYPED_TEST_CASE_P(%s, ...).\\n\",\n              FormatFileLocation(file, line).c_str(), test_name, case_name);\n      fflush(stderr);\n      posix::Abort();\n    }\n    defined_test_names_.insert(test_name);\n    return true;\n  }\n\n  // Verifies that registered_tests match the test names in\n  // defined_test_names_; returns registered_tests if successful, or\n  // aborts the program otherwise.\n  const char* VerifyRegisteredTestNames(\n      const char* file, int line, const char* registered_tests);\n\n private:\n  bool registered_;\n  ::std::set<const char*> defined_test_names_;\n};\n\n// Skips to the first non-space char after the first comma in 'str';\n// returns NULL if no comma is found in 'str'.\ninline const char* SkipComma(const char* str) {\n  const char* comma = strchr(str, ',');\n  if (comma == NULL) {\n    return NULL;\n  }\n  while (isspace(*(++comma))) {}\n  return comma;\n}\n\n// Returns the prefix of 'str' before the first comma in it; returns\n// the entire string if it contains no comma.\ninline String GetPrefixUntilComma(const char* str) {\n  const char* comma = strchr(str, ',');\n  return comma == NULL ? String(str) : String(str, comma - str);\n}\n\n// TypeParameterizedTest<Fixture, TestSel, Types>::Register()\n// registers a list of type-parameterized tests with Google Test.  The\n// return value is insignificant - we just need to return something\n// such that we can call this function in a namespace scope.\n//\n// Implementation note: The GTEST_TEMPLATE_ macro declares a template\n// template parameter.  It's defined in gtest-type-util.h.\ntemplate <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>\nclass TypeParameterizedTest {\n public:\n  // 'index' is the index of the test in the type list 'Types'\n  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,\n  // Types).  Valid values for 'index' are [0, N - 1] where N is the\n  // length of Types.\n  static bool Register(const char* prefix, const char* case_name,\n                       const char* test_names, int index) {\n    typedef typename Types::Head Type;\n    typedef Fixture<Type> FixtureClass;\n    typedef typename GTEST_BIND_(TestSel, Type) TestClass;\n\n    // First, registers the first type-parameterized test in the type\n    // list.\n    MakeAndRegisterTestInfo(\n        String::Format(\"%s%s%s/%d\", prefix, prefix[0] == '\\0' ? \"\" : \"/\",\n                       case_name, index).c_str(),\n        GetPrefixUntilComma(test_names).c_str(),\n        String::Format(\"TypeParam = %s\", GetTypeName<Type>().c_str()).c_str(),\n        \"\",\n        GetTypeId<FixtureClass>(),\n        TestClass::SetUpTestCase,\n        TestClass::TearDownTestCase,\n        new TestFactoryImpl<TestClass>);\n\n    // Next, recurses (at compile time) with the tail of the type list.\n    return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>\n        ::Register(prefix, case_name, test_names, index + 1);\n  }\n};\n\n// The base case for the compile time recursion.\ntemplate <GTEST_TEMPLATE_ Fixture, class TestSel>\nclass TypeParameterizedTest<Fixture, TestSel, Types0> {\n public:\n  static bool Register(const char* /*prefix*/, const char* /*case_name*/,\n                       const char* /*test_names*/, int /*index*/) {\n    return true;\n  }\n};\n\n// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()\n// registers *all combinations* of 'Tests' and 'Types' with Google\n// Test.  The return value is insignificant - we just need to return\n// something such that we can call this function in a namespace scope.\ntemplate <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>\nclass TypeParameterizedTestCase {\n public:\n  static bool Register(const char* prefix, const char* case_name,\n                       const char* test_names) {\n    typedef typename Tests::Head Head;\n\n    // First, register the first test in 'Test' for each type in 'Types'.\n    TypeParameterizedTest<Fixture, Head, Types>::Register(\n        prefix, case_name, test_names, 0);\n\n    // Next, recurses (at compile time) with the tail of the test list.\n    return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>\n        ::Register(prefix, case_name, SkipComma(test_names));\n  }\n};\n\n// The base case for the compile time recursion.\ntemplate <GTEST_TEMPLATE_ Fixture, typename Types>\nclass TypeParameterizedTestCase<Fixture, Templates0, Types> {\n public:\n  static bool Register(const char* /*prefix*/, const char* /*case_name*/,\n                       const char* /*test_names*/) {\n    return true;\n  }\n};\n\n#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n// Returns the current OS stack trace as a String.\n//\n// The maximum number of stack frames to be included is specified by\n// the gtest_stack_trace_depth flag.  The skip_count parameter\n// specifies the number of top frames to be skipped, which doesn't\n// count against the number of frames to be included.\n//\n// For example, if Foo() calls Bar(), which in turn calls\n// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in\n// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.\nGTEST_API_ String GetCurrentOsStackTraceExceptTop(UnitTest* unit_test,\n                                                  int skip_count);\n\n// Helpers for suppressing warnings on unreachable code or constant\n// condition.\n\n// Always returns true.\nGTEST_API_ bool AlwaysTrue();\n\n// Always returns false.\ninline bool AlwaysFalse() { return !AlwaysTrue(); }\n\n// A simple Linear Congruential Generator for generating random\n// numbers with a uniform distribution.  Unlike rand() and srand(), it\n// doesn't use global state (and therefore can't interfere with user\n// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,\n// but it's good enough for our purposes.\nclass GTEST_API_ Random {\n public:\n  static const UInt32 kMaxRange = 1u << 31;\n\n  explicit Random(UInt32 seed) : state_(seed) {}\n\n  void Reseed(UInt32 seed) { state_ = seed; }\n\n  // Generates a random number from [0, range).  Crashes if 'range' is\n  // 0 or greater than kMaxRange.\n  UInt32 Generate(UInt32 range);\n\n private:\n  UInt32 state_;\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);\n};\n\n}  // namespace internal\n}  // namespace testing\n\n#define GTEST_MESSAGE_(message, result_type) \\\n  ::testing::internal::AssertHelper(result_type, __FILE__, __LINE__, message) \\\n    = ::testing::Message()\n\n#define GTEST_FATAL_FAILURE_(message) \\\n  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)\n\n#define GTEST_NONFATAL_FAILURE_(message) \\\n  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)\n\n#define GTEST_SUCCESS_(message) \\\n  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)\n\n// Suppresses MSVC warnings 4072 (unreachable code) for the code following\n// statement if it returns or throws (or doesn't return or throw in some\n// situations).\n#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \\\n  if (::testing::internal::AlwaysTrue()) { statement; }\n\n#define GTEST_TEST_THROW_(statement, expected_exception, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (const char* gtest_msg = \"\") { \\\n    bool gtest_caught_expected = false; \\\n    try { \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    } \\\n    catch (expected_exception const&) { \\\n      gtest_caught_expected = true; \\\n    } \\\n    catch (...) { \\\n      gtest_msg = \"Expected: \" #statement \" throws an exception of type \" \\\n                  #expected_exception \".\\n  Actual: it throws a different \" \\\n                  \"type.\"; \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \\\n    } \\\n    if (!gtest_caught_expected) { \\\n      gtest_msg = \"Expected: \" #statement \" throws an exception of type \" \\\n                  #expected_exception \".\\n  Actual: it throws nothing.\"; \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \\\n      fail(gtest_msg)\n\n#define GTEST_TEST_NO_THROW_(statement, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (const char* gtest_msg = \"\") { \\\n    try { \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    } \\\n    catch (...) { \\\n      gtest_msg = \"Expected: \" #statement \" doesn't throw an exception.\\n\" \\\n                  \"  Actual: it throws.\"; \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \\\n      fail(gtest_msg)\n\n#define GTEST_TEST_ANY_THROW_(statement, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (const char* gtest_msg = \"\") { \\\n    bool gtest_caught_any = false; \\\n    try { \\\n      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    } \\\n    catch (...) { \\\n      gtest_caught_any = true; \\\n    } \\\n    if (!gtest_caught_any) { \\\n      gtest_msg = \"Expected: \" #statement \" throws an exception.\\n\" \\\n                  \"  Actual: it doesn't.\"; \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \\\n      fail(gtest_msg)\n\n\n// Implements Boolean test assertions such as EXPECT_TRUE. expression can be\n// either a boolean expression or an AssertionResult. text is a textual\n// represenation of expression as it was passed into the EXPECT_TRUE.\n#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (const ::testing::AssertionResult gtest_ar_ = \\\n      ::testing::AssertionResult(expression)) \\\n    ; \\\n  else \\\n    fail(::testing::internal::GetBoolAssertionFailureMessage(\\\n        gtest_ar_, text, #actual, #expected).c_str())\n\n#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n  if (const char* gtest_msg = \"\") { \\\n    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \\\n    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \\\n    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \\\n      gtest_msg = \"Expected: \" #statement \" doesn't generate new fatal \" \\\n                  \"failures in the current thread.\\n\" \\\n                  \"  Actual: it does.\"; \\\n      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \\\n    } \\\n  } else \\\n    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \\\n      fail(gtest_msg)\n\n// Expands to the name of the class that implements the given test.\n#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \\\n  test_case_name##_##test_name##_Test\n\n// Helper macro for defining tests.\n#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\\\nclass GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\\\n public:\\\n  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\\\n private:\\\n  virtual void TestBody();\\\n  static ::testing::TestInfo* const test_info_;\\\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(\\\n      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\\\n};\\\n\\\n::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\\\n  ::test_info_ =\\\n    ::testing::internal::MakeAndRegisterTestInfo(\\\n        #test_case_name, #test_name, \"\", \"\", \\\n        (parent_id), \\\n        parent_class::SetUpTestCase, \\\n        parent_class::TearDownTestCase, \\\n        new ::testing::internal::TestFactoryImpl<\\\n            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\\\nvoid GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-linked_ptr.h",
    "content": "// Copyright 2003 Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: Dan Egnor (egnor@google.com)\n//\n// A \"smart\" pointer type with reference tracking.  Every pointer to a\n// particular object is kept on a circular linked list.  When the last pointer\n// to an object is destroyed or reassigned, the object is deleted.\n//\n// Used properly, this deletes the object when the last reference goes away.\n// There are several caveats:\n// - Like all reference counting schemes, cycles lead to leaks.\n// - Each smart pointer is actually two pointers (8 bytes instead of 4).\n// - Every time a pointer is assigned, the entire list of pointers to that\n//   object is traversed.  This class is therefore NOT SUITABLE when there\n//   will often be more than two or three pointers to a particular object.\n// - References are only tracked as long as linked_ptr<> objects are copied.\n//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS\n//   will happen (double deletion).\n//\n// A good use of this class is storing object references in STL containers.\n// You can safely put linked_ptr<> in a vector<>.\n// Other uses may not be as good.\n//\n// Note: If you use an incomplete type with linked_ptr<>, the class\n// *containing* linked_ptr<> must have a constructor and destructor (even\n// if they do nothing!).\n//\n// Bill Gibbons suggested we use something like this.\n//\n// Thread Safety:\n//   Unlike other linked_ptr implementations, in this implementation\n//   a linked_ptr object is thread-safe in the sense that:\n//     - it's safe to copy linked_ptr objects concurrently,\n//     - it's safe to copy *from* a linked_ptr and read its underlying\n//       raw pointer (e.g. via get()) concurrently, and\n//     - it's safe to write to two linked_ptrs that point to the same\n//       shared object concurrently.\n// TODO(wan@google.com): rename this to safe_linked_ptr to avoid\n// confusion with normal linked_ptr.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_\n\n#include <stdlib.h>\n#include <assert.h>\n\n#include <gtest/internal/gtest-port.h>\n\nnamespace testing {\nnamespace internal {\n\n// Protects copying of all linked_ptr objects.\nGTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);\n\n// This is used internally by all instances of linked_ptr<>.  It needs to be\n// a non-template class because different types of linked_ptr<> can refer to\n// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).\n// So, it needs to be possible for different types of linked_ptr to participate\n// in the same circular linked list, so we need a single class type here.\n//\n// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.\nclass linked_ptr_internal {\n public:\n  // Create a new circle that includes only this instance.\n  void join_new() {\n    next_ = this;\n  }\n\n  // Many linked_ptr operations may change p.link_ for some linked_ptr\n  // variable p in the same circle as this object.  Therefore we need\n  // to prevent two such operations from occurring concurrently.\n  //\n  // Note that different types of linked_ptr objects can coexist in a\n  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and\n  // linked_ptr<Derived2>).  Therefore we must use a single mutex to\n  // protect all linked_ptr objects.  This can create serious\n  // contention in production code, but is acceptable in a testing\n  // framework.\n\n  // Join an existing circle.\n  // L < g_linked_ptr_mutex\n  void join(linked_ptr_internal const* ptr) {\n    MutexLock lock(&g_linked_ptr_mutex);\n\n    linked_ptr_internal const* p = ptr;\n    while (p->next_ != ptr) p = p->next_;\n    p->next_ = this;\n    next_ = ptr;\n  }\n\n  // Leave whatever circle we're part of.  Returns true if we were the\n  // last member of the circle.  Once this is done, you can join() another.\n  // L < g_linked_ptr_mutex\n  bool depart() {\n    MutexLock lock(&g_linked_ptr_mutex);\n\n    if (next_ == this) return true;\n    linked_ptr_internal const* p = next_;\n    while (p->next_ != this) p = p->next_;\n    p->next_ = next_;\n    return false;\n  }\n\n private:\n  mutable linked_ptr_internal const* next_;\n};\n\ntemplate <typename T>\nclass linked_ptr {\n public:\n  typedef T element_type;\n\n  // Take over ownership of a raw pointer.  This should happen as soon as\n  // possible after the object is created.\n  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }\n  ~linked_ptr() { depart(); }\n\n  // Copy an existing linked_ptr<>, adding ourselves to the list of references.\n  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }\n  linked_ptr(linked_ptr const& ptr) {  // NOLINT\n    assert(&ptr != this);\n    copy(&ptr);\n  }\n\n  // Assignment releases the old value and acquires the new.\n  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {\n    depart();\n    copy(&ptr);\n    return *this;\n  }\n\n  linked_ptr& operator=(linked_ptr const& ptr) {\n    if (&ptr != this) {\n      depart();\n      copy(&ptr);\n    }\n    return *this;\n  }\n\n  // Smart pointer members.\n  void reset(T* ptr = NULL) {\n    depart();\n    capture(ptr);\n  }\n  T* get() const { return value_; }\n  T* operator->() const { return value_; }\n  T& operator*() const { return *value_; }\n  // Release ownership of the pointed object and returns it.\n  // Sole ownership by this linked_ptr object is required.\n  T* release() {\n    bool last = link_.depart();\n    assert(last);\n    T* v = value_;\n    value_ = NULL;\n    return v;\n  }\n\n  bool operator==(T* p) const { return value_ == p; }\n  bool operator!=(T* p) const { return value_ != p; }\n  template <typename U>\n  bool operator==(linked_ptr<U> const& ptr) const {\n    return value_ == ptr.get();\n  }\n  template <typename U>\n  bool operator!=(linked_ptr<U> const& ptr) const {\n    return value_ != ptr.get();\n  }\n\n private:\n  template <typename U>\n  friend class linked_ptr;\n\n  T* value_;\n  linked_ptr_internal link_;\n\n  void depart() {\n    if (link_.depart()) delete value_;\n  }\n\n  void capture(T* ptr) {\n    value_ = ptr;\n    link_.join_new();\n  }\n\n  template <typename U> void copy(linked_ptr<U> const* ptr) {\n    value_ = ptr->get();\n    if (value_)\n      link_.join(&ptr->link_);\n    else\n      link_.join_new();\n  }\n};\n\ntemplate<typename T> inline\nbool operator==(T* ptr, const linked_ptr<T>& x) {\n  return ptr == x.get();\n}\n\ntemplate<typename T> inline\nbool operator!=(T* ptr, const linked_ptr<T>& x) {\n  return ptr != x.get();\n}\n\n// A function to convert T* into linked_ptr<T>\n// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation\n// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))\ntemplate <typename T>\nlinked_ptr<T> make_linked_ptr(T* ptr) {\n  return linked_ptr<T>(ptr);\n}\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h",
    "content": "// This file was GENERATED by a script.  DO NOT EDIT BY HAND!!!\n\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: vladl@google.com (Vlad Losev)\n\n// Type and function utilities for implementing parameterized tests.\n// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n// Currently Google Test supports at most 50 arguments in Values,\n// and at most 10 arguments in Combine. Please contact\n// googletestframework@googlegroups.com if you need more.\n// Please note that the number of arguments to Combine is limited\n// by the maximum arity of the implementation of tr1::tuple which is\n// currently set at 10.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n\n// scripts/fuse_gtest.py depends on gtest's own header being #included\n// *unconditionally*.  Therefore these #includes cannot be moved\n// inside #if GTEST_HAS_PARAM_TEST.\n#include <gtest/internal/gtest-param-util.h>\n#include <gtest/internal/gtest-port.h>\n\n#if GTEST_HAS_PARAM_TEST\n\nnamespace testing {\n\n// Forward declarations of ValuesIn(), which is implemented in\n// include/gtest/gtest-param-test.h.\ntemplate <typename ForwardIterator>\ninternal::ParamGenerator<\n    typename ::std::iterator_traits<ForwardIterator>::value_type> ValuesIn(\n        ForwardIterator begin, ForwardIterator end);\n\ntemplate <typename T, size_t N>\ninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]);\n\ntemplate <class Container>\ninternal::ParamGenerator<typename Container::value_type> ValuesIn(\n    const Container& container);\n\nnamespace internal {\n\n// Used in the Values() function to provide polymorphic capabilities.\ntemplate <typename T1>\nclass ValueArray1 {\n public:\n  explicit ValueArray1(T1 v1) : v1_(v1) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray1& other);\n\n  const T1 v1_;\n};\n\ntemplate <typename T1, typename T2>\nclass ValueArray2 {\n public:\n  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray2& other);\n\n  const T1 v1_;\n  const T2 v2_;\n};\n\ntemplate <typename T1, typename T2, typename T3>\nclass ValueArray3 {\n public:\n  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray3& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\nclass ValueArray4 {\n public:\n  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray4& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nclass ValueArray5 {\n public:\n  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray5& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\nclass ValueArray6 {\n public:\n  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray6& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\nclass ValueArray7 {\n public:\n  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray7& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\nclass ValueArray8 {\n public:\n  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,\n      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray8& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\nclass ValueArray9 {\n public:\n  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,\n      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray9& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\nclass ValueArray10 {\n public:\n  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray10& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11>\nclass ValueArray11 {\n public:\n  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray11& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12>\nclass ValueArray12 {\n public:\n  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray12& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13>\nclass ValueArray13 {\n public:\n  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray13& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14>\nclass ValueArray14 {\n public:\n  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray14& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15>\nclass ValueArray15 {\n public:\n  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray15& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16>\nclass ValueArray16 {\n public:\n  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray16& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17>\nclass ValueArray17 {\n public:\n  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,\n      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray17& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18>\nclass ValueArray18 {\n public:\n  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray18& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19>\nclass ValueArray19 {\n public:\n  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),\n      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray19& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20>\nclass ValueArray20 {\n public:\n  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),\n      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),\n      v19_(v19), v20_(v20) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray20& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21>\nclass ValueArray21 {\n public:\n  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),\n      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray21& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22>\nclass ValueArray22 {\n public:\n  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray22& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23>\nclass ValueArray23 {\n public:\n  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,\n        v23_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray23& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24>\nclass ValueArray24 {\n public:\n  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),\n      v22_(v22), v23_(v23), v24_(v24) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray24& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25>\nclass ValueArray25 {\n public:\n  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,\n      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray25& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26>\nclass ValueArray26 {\n public:\n  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray26& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27>\nclass ValueArray27 {\n public:\n  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),\n      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),\n      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),\n      v26_(v26), v27_(v27) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray27& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28>\nclass ValueArray28 {\n public:\n  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),\n      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),\n      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),\n      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray28& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29>\nclass ValueArray29 {\n public:\n  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),\n      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),\n      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray29& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30>\nclass ValueArray30 {\n public:\n  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray30& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31>\nclass ValueArray31 {\n public:\n  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray31& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32>\nclass ValueArray32 {\n public:\n  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),\n      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),\n      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray32& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33>\nclass ValueArray33 {\n public:\n  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,\n      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray33& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34>\nclass ValueArray34 {\n public:\n  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray34& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35>\nclass ValueArray35 {\n public:\n  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),\n      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),\n      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),\n      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),\n      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,\n        v35_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray35& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36>\nclass ValueArray36 {\n public:\n  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),\n      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),\n      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),\n      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),\n      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray36& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37>\nclass ValueArray37 {\n public:\n  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),\n      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),\n      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),\n      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),\n      v36_(v36), v37_(v37) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray37& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38>\nclass ValueArray38 {\n public:\n  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),\n      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray38& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39>\nclass ValueArray39 {\n public:\n  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),\n      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray39& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40>\nclass ValueArray40 {\n public:\n  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),\n      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),\n      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),\n      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),\n      v40_(v40) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray40& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41>\nclass ValueArray41 {\n public:\n  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,\n      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),\n      v39_(v39), v40_(v40), v41_(v41) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray41& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42>\nclass ValueArray42 {\n public:\n  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),\n      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray42& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43>\nclass ValueArray43 {\n public:\n  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),\n      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),\n      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),\n      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),\n      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),\n      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),\n      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray43& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44>\nclass ValueArray44 {\n public:\n  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),\n      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),\n      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),\n      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),\n      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),\n      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),\n      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),\n      v43_(v43), v44_(v44) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray44& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45>\nclass ValueArray45 {\n public:\n  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),\n      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),\n      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),\n      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),\n      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),\n      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),\n      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),\n      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray45& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46>\nclass ValueArray46 {\n public:\n  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),\n      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),\n      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),\n      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray46& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47>\nclass ValueArray47 {\n public:\n  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),\n      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),\n      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),\n      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),\n      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),\n      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),\n      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),\n      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),\n      v47_(v47) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,\n        v47_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray47& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n  const T47 v47_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48>\nclass ValueArray48 {\n public:\n  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),\n      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),\n      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),\n      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),\n      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),\n      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),\n      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),\n      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),\n      v46_(v46), v47_(v47), v48_(v48) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,\n        v48_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray48& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n  const T47 v47_;\n  const T48 v48_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49>\nclass ValueArray49 {\n public:\n  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,\n      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),\n      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),\n      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,\n        v48_, v49_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray49& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n  const T47 v47_;\n  const T48 v48_;\n  const T49 v49_;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49, typename T50>\nclass ValueArray50 {\n public:\n  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,\n      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,\n      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,\n      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,\n      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,\n      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,\n      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),\n      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),\n      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),\n      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),\n      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),\n      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),\n      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),\n      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,\n        v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,\n        v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,\n        v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,\n        v48_, v49_, v50_};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray50& other);\n\n  const T1 v1_;\n  const T2 v2_;\n  const T3 v3_;\n  const T4 v4_;\n  const T5 v5_;\n  const T6 v6_;\n  const T7 v7_;\n  const T8 v8_;\n  const T9 v9_;\n  const T10 v10_;\n  const T11 v11_;\n  const T12 v12_;\n  const T13 v13_;\n  const T14 v14_;\n  const T15 v15_;\n  const T16 v16_;\n  const T17 v17_;\n  const T18 v18_;\n  const T19 v19_;\n  const T20 v20_;\n  const T21 v21_;\n  const T22 v22_;\n  const T23 v23_;\n  const T24 v24_;\n  const T25 v25_;\n  const T26 v26_;\n  const T27 v27_;\n  const T28 v28_;\n  const T29 v29_;\n  const T30 v30_;\n  const T31 v31_;\n  const T32 v32_;\n  const T33 v33_;\n  const T34 v34_;\n  const T35 v35_;\n  const T36 v36_;\n  const T37 v37_;\n  const T38 v38_;\n  const T39 v39_;\n  const T40 v40_;\n  const T41 v41_;\n  const T42 v42_;\n  const T43 v43_;\n  const T44 v44_;\n  const T45 v45_;\n  const T46 v46_;\n  const T47 v47_;\n  const T48 v48_;\n  const T49 v49_;\n  const T50 v50_;\n};\n\n#if GTEST_HAS_COMBINE\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Generates values from the Cartesian product of values produced\n// by the argument generators.\n//\ntemplate <typename T1, typename T2>\nclass CartesianProductGenerator2\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2> ParamType;\n\n  CartesianProductGenerator2(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2)\n      : g1_(g1), g2_(g2) {}\n  virtual ~CartesianProductGenerator2() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current2_;\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator2::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator2& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n};  // class CartesianProductGenerator2\n\n\ntemplate <typename T1, typename T2, typename T3>\nclass CartesianProductGenerator3\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;\n\n  CartesianProductGenerator3(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)\n      : g1_(g1), g2_(g2), g3_(g3) {}\n  virtual ~CartesianProductGenerator3() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current3_;\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator3::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator3& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n};  // class CartesianProductGenerator3\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\nclass CartesianProductGenerator4\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;\n\n  CartesianProductGenerator4(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}\n  virtual ~CartesianProductGenerator4() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current4_;\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator4::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator4& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n};  // class CartesianProductGenerator4\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nclass CartesianProductGenerator5\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;\n\n  CartesianProductGenerator5(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}\n  virtual ~CartesianProductGenerator5() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current5_;\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator5::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator5& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n};  // class CartesianProductGenerator5\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\nclass CartesianProductGenerator6\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,\n        T6> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;\n\n  CartesianProductGenerator6(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}\n  virtual ~CartesianProductGenerator6() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current6_;\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator6::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator6& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n};  // class CartesianProductGenerator6\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\nclass CartesianProductGenerator7\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,\n        T7> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;\n\n  CartesianProductGenerator7(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}\n  virtual ~CartesianProductGenerator7() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,\n        g7_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6,\n      const ParamGenerator<T7>& g7,\n      const typename ParamGenerator<T7>::iterator& current7)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),\n          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current7_;\n      if (current7_ == end7_) {\n        current7_ = begin7_;\n        ++current6_;\n      }\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_ &&\n          current7_ == typed_other->current7_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_),\n        begin7_(other.begin7_),\n        end7_(other.end7_),\n        current7_(other.current7_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_, *current7_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_ ||\n          current7_ == end7_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    const typename ParamGenerator<T7>::iterator begin7_;\n    const typename ParamGenerator<T7>::iterator end7_;\n    typename ParamGenerator<T7>::iterator current7_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator7::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator7& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n  const ParamGenerator<T7> g7_;\n};  // class CartesianProductGenerator7\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\nclass CartesianProductGenerator8\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,\n        T7, T8> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;\n\n  CartesianProductGenerator8(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,\n      const ParamGenerator<T8>& g8)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),\n          g8_(g8) {}\n  virtual ~CartesianProductGenerator8() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,\n        g7_.begin(), g8_, g8_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,\n        g8_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6,\n      const ParamGenerator<T7>& g7,\n      const typename ParamGenerator<T7>::iterator& current7,\n      const ParamGenerator<T8>& g8,\n      const typename ParamGenerator<T8>::iterator& current8)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),\n          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),\n          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current8_;\n      if (current8_ == end8_) {\n        current8_ = begin8_;\n        ++current7_;\n      }\n      if (current7_ == end7_) {\n        current7_ = begin7_;\n        ++current6_;\n      }\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_ &&\n          current7_ == typed_other->current7_ &&\n          current8_ == typed_other->current8_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_),\n        begin7_(other.begin7_),\n        end7_(other.end7_),\n        current7_(other.current7_),\n        begin8_(other.begin8_),\n        end8_(other.end8_),\n        current8_(other.current8_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_, *current7_, *current8_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_ ||\n          current7_ == end7_ ||\n          current8_ == end8_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    const typename ParamGenerator<T7>::iterator begin7_;\n    const typename ParamGenerator<T7>::iterator end7_;\n    typename ParamGenerator<T7>::iterator current7_;\n    const typename ParamGenerator<T8>::iterator begin8_;\n    const typename ParamGenerator<T8>::iterator end8_;\n    typename ParamGenerator<T8>::iterator current8_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator8::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator8& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n  const ParamGenerator<T7> g7_;\n  const ParamGenerator<T8> g8_;\n};  // class CartesianProductGenerator8\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\nclass CartesianProductGenerator9\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,\n        T7, T8, T9> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;\n\n  CartesianProductGenerator9(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,\n      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),\n          g9_(g9) {}\n  virtual ~CartesianProductGenerator9() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,\n        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,\n        g8_.end(), g9_, g9_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6,\n      const ParamGenerator<T7>& g7,\n      const typename ParamGenerator<T7>::iterator& current7,\n      const ParamGenerator<T8>& g8,\n      const typename ParamGenerator<T8>::iterator& current8,\n      const ParamGenerator<T9>& g9,\n      const typename ParamGenerator<T9>::iterator& current9)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),\n          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),\n          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),\n          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current9_;\n      if (current9_ == end9_) {\n        current9_ = begin9_;\n        ++current8_;\n      }\n      if (current8_ == end8_) {\n        current8_ = begin8_;\n        ++current7_;\n      }\n      if (current7_ == end7_) {\n        current7_ = begin7_;\n        ++current6_;\n      }\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_ &&\n          current7_ == typed_other->current7_ &&\n          current8_ == typed_other->current8_ &&\n          current9_ == typed_other->current9_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_),\n        begin7_(other.begin7_),\n        end7_(other.end7_),\n        current7_(other.current7_),\n        begin8_(other.begin8_),\n        end8_(other.end8_),\n        current8_(other.current8_),\n        begin9_(other.begin9_),\n        end9_(other.end9_),\n        current9_(other.current9_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_, *current7_, *current8_,\n            *current9_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_ ||\n          current7_ == end7_ ||\n          current8_ == end8_ ||\n          current9_ == end9_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    const typename ParamGenerator<T7>::iterator begin7_;\n    const typename ParamGenerator<T7>::iterator end7_;\n    typename ParamGenerator<T7>::iterator current7_;\n    const typename ParamGenerator<T8>::iterator begin8_;\n    const typename ParamGenerator<T8>::iterator end8_;\n    typename ParamGenerator<T8>::iterator current8_;\n    const typename ParamGenerator<T9>::iterator begin9_;\n    const typename ParamGenerator<T9>::iterator end9_;\n    typename ParamGenerator<T9>::iterator current9_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator9::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator9& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n  const ParamGenerator<T7> g7_;\n  const ParamGenerator<T8> g8_;\n  const ParamGenerator<T9> g9_;\n};  // class CartesianProductGenerator9\n\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\nclass CartesianProductGenerator10\n    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,\n        T7, T8, T9, T10> > {\n public:\n  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;\n\n  CartesianProductGenerator10(const ParamGenerator<T1>& g1,\n      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,\n      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,\n      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,\n      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,\n      const ParamGenerator<T10>& g10)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),\n          g9_(g9), g10_(g10) {}\n  virtual ~CartesianProductGenerator10() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,\n        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,\n        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),\n        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,\n        g8_.end(), g9_, g9_.end(), g10_, g10_.end());\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base,\n      const ParamGenerator<T1>& g1,\n      const typename ParamGenerator<T1>::iterator& current1,\n      const ParamGenerator<T2>& g2,\n      const typename ParamGenerator<T2>::iterator& current2,\n      const ParamGenerator<T3>& g3,\n      const typename ParamGenerator<T3>::iterator& current3,\n      const ParamGenerator<T4>& g4,\n      const typename ParamGenerator<T4>::iterator& current4,\n      const ParamGenerator<T5>& g5,\n      const typename ParamGenerator<T5>::iterator& current5,\n      const ParamGenerator<T6>& g6,\n      const typename ParamGenerator<T6>::iterator& current6,\n      const ParamGenerator<T7>& g7,\n      const typename ParamGenerator<T7>::iterator& current7,\n      const ParamGenerator<T8>& g8,\n      const typename ParamGenerator<T8>::iterator& current8,\n      const ParamGenerator<T9>& g9,\n      const typename ParamGenerator<T9>::iterator& current9,\n      const ParamGenerator<T10>& g10,\n      const typename ParamGenerator<T10>::iterator& current10)\n        : base_(base),\n          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),\n          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),\n          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),\n          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),\n          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),\n          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),\n          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),\n          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),\n          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),\n          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current10_;\n      if (current10_ == end10_) {\n        current10_ = begin10_;\n        ++current9_;\n      }\n      if (current9_ == end9_) {\n        current9_ = begin9_;\n        ++current8_;\n      }\n      if (current8_ == end8_) {\n        current8_ = begin8_;\n        ++current7_;\n      }\n      if (current7_ == end7_) {\n        current7_ = begin7_;\n        ++current6_;\n      }\n      if (current6_ == end6_) {\n        current6_ = begin6_;\n        ++current5_;\n      }\n      if (current5_ == end5_) {\n        current5_ = begin5_;\n        ++current4_;\n      }\n      if (current4_ == end4_) {\n        current4_ = begin4_;\n        ++current3_;\n      }\n      if (current3_ == end3_) {\n        current3_ = begin3_;\n        ++current2_;\n      }\n      if (current2_ == end2_) {\n        current2_ = begin2_;\n        ++current1_;\n      }\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         (\n          current1_ == typed_other->current1_ &&\n          current2_ == typed_other->current2_ &&\n          current3_ == typed_other->current3_ &&\n          current4_ == typed_other->current4_ &&\n          current5_ == typed_other->current5_ &&\n          current6_ == typed_other->current6_ &&\n          current7_ == typed_other->current7_ &&\n          current8_ == typed_other->current8_ &&\n          current9_ == typed_other->current9_ &&\n          current10_ == typed_other->current10_);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_),\n        begin1_(other.begin1_),\n        end1_(other.end1_),\n        current1_(other.current1_),\n        begin2_(other.begin2_),\n        end2_(other.end2_),\n        current2_(other.current2_),\n        begin3_(other.begin3_),\n        end3_(other.end3_),\n        current3_(other.current3_),\n        begin4_(other.begin4_),\n        end4_(other.end4_),\n        current4_(other.current4_),\n        begin5_(other.begin5_),\n        end5_(other.end5_),\n        current5_(other.current5_),\n        begin6_(other.begin6_),\n        end6_(other.end6_),\n        current6_(other.current6_),\n        begin7_(other.begin7_),\n        end7_(other.end7_),\n        current7_(other.current7_),\n        begin8_(other.begin8_),\n        end8_(other.end8_),\n        current8_(other.current8_),\n        begin9_(other.begin9_),\n        end9_(other.end9_),\n        current9_(other.current9_),\n        begin10_(other.begin10_),\n        end10_(other.end10_),\n        current10_(other.current10_) {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType(*current1_, *current2_, *current3_,\n            *current4_, *current5_, *current6_, *current7_, *current8_,\n            *current9_, *current10_);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n          current1_ == end1_ ||\n          current2_ == end2_ ||\n          current3_ == end3_ ||\n          current4_ == end4_ ||\n          current5_ == end5_ ||\n          current6_ == end6_ ||\n          current7_ == end7_ ||\n          current8_ == end8_ ||\n          current9_ == end9_ ||\n          current10_ == end10_;\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n    const typename ParamGenerator<T1>::iterator begin1_;\n    const typename ParamGenerator<T1>::iterator end1_;\n    typename ParamGenerator<T1>::iterator current1_;\n    const typename ParamGenerator<T2>::iterator begin2_;\n    const typename ParamGenerator<T2>::iterator end2_;\n    typename ParamGenerator<T2>::iterator current2_;\n    const typename ParamGenerator<T3>::iterator begin3_;\n    const typename ParamGenerator<T3>::iterator end3_;\n    typename ParamGenerator<T3>::iterator current3_;\n    const typename ParamGenerator<T4>::iterator begin4_;\n    const typename ParamGenerator<T4>::iterator end4_;\n    typename ParamGenerator<T4>::iterator current4_;\n    const typename ParamGenerator<T5>::iterator begin5_;\n    const typename ParamGenerator<T5>::iterator end5_;\n    typename ParamGenerator<T5>::iterator current5_;\n    const typename ParamGenerator<T6>::iterator begin6_;\n    const typename ParamGenerator<T6>::iterator end6_;\n    typename ParamGenerator<T6>::iterator current6_;\n    const typename ParamGenerator<T7>::iterator begin7_;\n    const typename ParamGenerator<T7>::iterator end7_;\n    typename ParamGenerator<T7>::iterator current7_;\n    const typename ParamGenerator<T8>::iterator begin8_;\n    const typename ParamGenerator<T8>::iterator end8_;\n    typename ParamGenerator<T8>::iterator current8_;\n    const typename ParamGenerator<T9>::iterator begin9_;\n    const typename ParamGenerator<T9>::iterator end9_;\n    typename ParamGenerator<T9>::iterator current9_;\n    const typename ParamGenerator<T10>::iterator begin10_;\n    const typename ParamGenerator<T10>::iterator end10_;\n    typename ParamGenerator<T10>::iterator current10_;\n    ParamType current_value_;\n  };  // class CartesianProductGenerator10::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator10& other);\n\n  const ParamGenerator<T1> g1_;\n  const ParamGenerator<T2> g2_;\n  const ParamGenerator<T3> g3_;\n  const ParamGenerator<T4> g4_;\n  const ParamGenerator<T5> g5_;\n  const ParamGenerator<T6> g6_;\n  const ParamGenerator<T7> g7_;\n  const ParamGenerator<T8> g8_;\n  const ParamGenerator<T9> g9_;\n  const ParamGenerator<T10> g10_;\n};  // class CartesianProductGenerator10\n\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Helper classes providing Combine() with polymorphic features. They allow\n// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is\n// convertible to U.\n//\ntemplate <class Generator1, class Generator2>\nclass CartesianProductHolder2 {\n public:\nCartesianProductHolder2(const Generator1& g1, const Generator2& g2)\n      : g1_(g1), g2_(g2) {}\n  template <typename T1, typename T2>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(\n        new CartesianProductGenerator2<T1, T2>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder2& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n};  // class CartesianProductHolder2\n\ntemplate <class Generator1, class Generator2, class Generator3>\nclass CartesianProductHolder3 {\n public:\nCartesianProductHolder3(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3)\n      : g1_(g1), g2_(g2), g3_(g3) {}\n  template <typename T1, typename T2, typename T3>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(\n        new CartesianProductGenerator3<T1, T2, T3>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder3& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n};  // class CartesianProductHolder3\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4>\nclass CartesianProductHolder4 {\n public:\nCartesianProductHolder4(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}\n  template <typename T1, typename T2, typename T3, typename T4>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(\n        new CartesianProductGenerator4<T1, T2, T3, T4>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder4& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n};  // class CartesianProductHolder4\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5>\nclass CartesianProductHolder5 {\n public:\nCartesianProductHolder5(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(\n        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder5& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n};  // class CartesianProductHolder5\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6>\nclass CartesianProductHolder6 {\n public:\nCartesianProductHolder6(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(\n        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder6& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n};  // class CartesianProductHolder6\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6, class Generator7>\nclass CartesianProductHolder7 {\n public:\nCartesianProductHolder7(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6, const Generator7& g7)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6, typename T7>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,\n      T7> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(\n        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_),\n        static_cast<ParamGenerator<T7> >(g7_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder7& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n  const Generator7 g7_;\n};  // class CartesianProductHolder7\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6, class Generator7,\n    class Generator8>\nclass CartesianProductHolder8 {\n public:\nCartesianProductHolder8(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6, const Generator7& g7, const Generator8& g8)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),\n          g8_(g8) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6, typename T7, typename T8>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,\n      T8> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(\n        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_),\n        static_cast<ParamGenerator<T7> >(g7_),\n        static_cast<ParamGenerator<T8> >(g8_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder8& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n  const Generator7 g7_;\n  const Generator8 g8_;\n};  // class CartesianProductHolder8\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6, class Generator7,\n    class Generator8, class Generator9>\nclass CartesianProductHolder9 {\n public:\nCartesianProductHolder9(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6, const Generator7& g7, const Generator8& g8,\n    const Generator9& g9)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),\n          g9_(g9) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6, typename T7, typename T8, typename T9>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,\n      T9> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,\n        T9> >(\n        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_),\n        static_cast<ParamGenerator<T7> >(g7_),\n        static_cast<ParamGenerator<T8> >(g8_),\n        static_cast<ParamGenerator<T9> >(g9_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder9& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n  const Generator7 g7_;\n  const Generator8 g8_;\n  const Generator9 g9_;\n};  // class CartesianProductHolder9\n\ntemplate <class Generator1, class Generator2, class Generator3,\n    class Generator4, class Generator5, class Generator6, class Generator7,\n    class Generator8, class Generator9, class Generator10>\nclass CartesianProductHolder10 {\n public:\nCartesianProductHolder10(const Generator1& g1, const Generator2& g2,\n    const Generator3& g3, const Generator4& g4, const Generator5& g5,\n    const Generator6& g6, const Generator7& g7, const Generator8& g8,\n    const Generator9& g9, const Generator10& g10)\n      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),\n          g9_(g9), g10_(g10) {}\n  template <typename T1, typename T2, typename T3, typename T4, typename T5,\n      typename T6, typename T7, typename T8, typename T9, typename T10>\n  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,\n      T9, T10> >() const {\n    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,\n        T9, T10> >(\n        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,\n            T10>(\n        static_cast<ParamGenerator<T1> >(g1_),\n        static_cast<ParamGenerator<T2> >(g2_),\n        static_cast<ParamGenerator<T3> >(g3_),\n        static_cast<ParamGenerator<T4> >(g4_),\n        static_cast<ParamGenerator<T5> >(g5_),\n        static_cast<ParamGenerator<T6> >(g6_),\n        static_cast<ParamGenerator<T7> >(g7_),\n        static_cast<ParamGenerator<T8> >(g8_),\n        static_cast<ParamGenerator<T9> >(g9_),\n        static_cast<ParamGenerator<T10> >(g10_)));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder10& other);\n\n  const Generator1 g1_;\n  const Generator2 g2_;\n  const Generator3 g3_;\n  const Generator4 g4_;\n  const Generator5 g5_;\n  const Generator6 g6_;\n  const Generator7 g7_;\n  const Generator8 g8_;\n  const Generator9 g9_;\n  const Generator10 g10_;\n};  // class CartesianProductHolder10\n\n#endif  // GTEST_HAS_COMBINE\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  //  GTEST_HAS_PARAM_TEST\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$var n = 50  $$ Maximum length of Values arguments we want to support.\n$var maxtuple = 10  $$ Maximum number of Combine arguments we want to support.\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: vladl@google.com (Vlad Losev)\n\n// Type and function utilities for implementing parameterized tests.\n// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n// Currently Google Test supports at most $n arguments in Values,\n// and at most $maxtuple arguments in Combine. Please contact\n// googletestframework@googlegroups.com if you need more.\n// Please note that the number of arguments to Combine is limited\n// by the maximum arity of the implementation of tr1::tuple which is\n// currently set at $maxtuple.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n\n// scripts/fuse_gtest.py depends on gtest's own header being #included\n// *unconditionally*.  Therefore these #includes cannot be moved\n// inside #if GTEST_HAS_PARAM_TEST.\n#include <gtest/internal/gtest-param-util.h>\n#include <gtest/internal/gtest-port.h>\n\n#if GTEST_HAS_PARAM_TEST\n\nnamespace testing {\n\n// Forward declarations of ValuesIn(), which is implemented in\n// include/gtest/gtest-param-test.h.\ntemplate <typename ForwardIterator>\ninternal::ParamGenerator<\n    typename ::std::iterator_traits<ForwardIterator>::value_type> ValuesIn(\n        ForwardIterator begin, ForwardIterator end);\n\ntemplate <typename T, size_t N>\ninternal::ParamGenerator<T> ValuesIn(const T (&array)[N]);\n\ntemplate <class Container>\ninternal::ParamGenerator<typename Container::value_type> ValuesIn(\n    const Container& container);\n\nnamespace internal {\n\n// Used in the Values() function to provide polymorphic capabilities.\ntemplate <typename T1>\nclass ValueArray1 {\n public:\n  explicit ValueArray1(T1 v1) : v1_(v1) {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray1& other);\n\n  const T1 v1_;\n};\n\n$range i 2..n\n$for i [[\n$range j 1..i\n\ntemplate <$for j, [[typename T$j]]>\nclass ValueArray$i {\n public:\n  ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {}\n\n  template <typename T>\n  operator ParamGenerator<T>() const {\n    const T array[] = {$for j, [[v$(j)_]]};\n    return ValuesIn(array);\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const ValueArray$i& other);\n\n$for j [[\n\n  const T$j v$(j)_;\n]]\n\n};\n\n]]\n\n#if GTEST_HAS_COMBINE\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Generates values from the Cartesian product of values produced\n// by the argument generators.\n//\n$range i 2..maxtuple\n$for i [[\n$range j 1..i\n$range k 2..i\n\ntemplate <$for j, [[typename T$j]]>\nclass CartesianProductGenerator$i\n    : public ParamGeneratorInterface< ::std::tr1::tuple<$for j, [[T$j]]> > {\n public:\n  typedef ::std::tr1::tuple<$for j, [[T$j]]> ParamType;\n\n  CartesianProductGenerator$i($for j, [[const ParamGenerator<T$j>& g$j]])\n      : $for j, [[g$(j)_(g$j)]] {}\n  virtual ~CartesianProductGenerator$i() {}\n\n  virtual ParamIteratorInterface<ParamType>* Begin() const {\n    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]);\n  }\n  virtual ParamIteratorInterface<ParamType>* End() const {\n    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]);\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<ParamType> {\n   public:\n    Iterator(const ParamGeneratorInterface<ParamType>* base, $for j, [[\n\n      const ParamGenerator<T$j>& g$j,\n      const typename ParamGenerator<T$j>::iterator& current$(j)]])\n        : base_(base),\n$for j, [[\n\n          begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j)\n]]    {\n      ComputeCurrentValue();\n    }\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {\n      return base_;\n    }\n    // Advance should not be called on beyond-of-range iterators\n    // so no component iterators must be beyond end of range, either.\n    virtual void Advance() {\n      assert(!AtEnd());\n      ++current$(i)_;\n\n$for k [[\n      if (current$(i+2-k)_ == end$(i+2-k)_) {\n        current$(i+2-k)_ = begin$(i+2-k)_;\n        ++current$(i+2-k-1)_;\n      }\n\n]]\n      ComputeCurrentValue();\n    }\n    virtual ParamIteratorInterface<ParamType>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const ParamType* Current() const { return &current_value_; }\n    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const Iterator* typed_other =\n          CheckedDowncastToActualType<const Iterator>(&other);\n      // We must report iterators equal if they both point beyond their\n      // respective ranges. That can happen in a variety of fashions,\n      // so we have to consult AtEnd().\n      return (AtEnd() && typed_other->AtEnd()) ||\n         ($for j  && [[\n\n          current$(j)_ == typed_other->current$(j)_\n]]);\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : base_(other.base_), $for j, [[\n\n        begin$(j)_(other.begin$(j)_),\n        end$(j)_(other.end$(j)_),\n        current$(j)_(other.current$(j)_)\n]] {\n      ComputeCurrentValue();\n    }\n\n    void ComputeCurrentValue() {\n      if (!AtEnd())\n        current_value_ = ParamType($for j, [[*current$(j)_]]);\n    }\n    bool AtEnd() const {\n      // We must report iterator past the end of the range when either of the\n      // component iterators has reached the end of its range.\n      return\n$for j  || [[\n\n          current$(j)_ == end$(j)_\n]];\n    }\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<ParamType>* const base_;\n    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.\n    // current[i]_ is the actual traversing iterator.\n$for j [[\n\n    const typename ParamGenerator<T$j>::iterator begin$(j)_;\n    const typename ParamGenerator<T$j>::iterator end$(j)_;\n    typename ParamGenerator<T$j>::iterator current$(j)_;\n]]\n\n    ParamType current_value_;\n  };  // class CartesianProductGenerator$i::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductGenerator$i& other);\n\n\n$for j [[\n  const ParamGenerator<T$j> g$(j)_;\n\n]]\n};  // class CartesianProductGenerator$i\n\n\n]]\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Helper classes providing Combine() with polymorphic features. They allow\n// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is\n// convertible to U.\n//\n$range i 2..maxtuple\n$for i [[\n$range j 1..i\n\ntemplate <$for j, [[class Generator$j]]>\nclass CartesianProductHolder$i {\n public:\nCartesianProductHolder$i($for j, [[const Generator$j& g$j]])\n      : $for j, [[g$(j)_(g$j)]] {}\n  template <$for j, [[typename T$j]]>\n  operator ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >() const {\n    return ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >(\n        new CartesianProductGenerator$i<$for j, [[T$j]]>(\n$for j,[[\n\n        static_cast<ParamGenerator<T$j> >(g$(j)_)\n]]));\n  }\n\n private:\n  // No implementation - assignment is unsupported.\n  void operator=(const CartesianProductHolder$i& other);\n\n\n$for j [[\n  const Generator$j g$(j)_;\n\n]]\n};  // class CartesianProductHolder$i\n\n]]\n\n#endif  // GTEST_HAS_COMBINE\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  //  GTEST_HAS_PARAM_TEST\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util.h",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: vladl@google.com (Vlad Losev)\n\n// Type and function utilities for implementing parameterized tests.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_\n\n#include <iterator>\n#include <utility>\n#include <vector>\n\n// scripts/fuse_gtest.py depends on gtest's own header being #included\n// *unconditionally*.  Therefore these #includes cannot be moved\n// inside #if GTEST_HAS_PARAM_TEST.\n#include <gtest/internal/gtest-internal.h>\n#include <gtest/internal/gtest-linked_ptr.h>\n#include <gtest/internal/gtest-port.h>\n\n#if GTEST_HAS_PARAM_TEST\n\nnamespace testing {\nnamespace internal {\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Outputs a message explaining invalid registration of different\n// fixture class for the same test case. This may happen when\n// TEST_P macro is used to define two tests with the same name\n// but in different namespaces.\nGTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,\n                                          const char* file, int line);\n\ntemplate <typename> class ParamGeneratorInterface;\ntemplate <typename> class ParamGenerator;\n\n// Interface for iterating over elements provided by an implementation\n// of ParamGeneratorInterface<T>.\ntemplate <typename T>\nclass ParamIteratorInterface {\n public:\n  virtual ~ParamIteratorInterface() {}\n  // A pointer to the base generator instance.\n  // Used only for the purposes of iterator comparison\n  // to make sure that two iterators belong to the same generator.\n  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;\n  // Advances iterator to point to the next element\n  // provided by the generator. The caller is responsible\n  // for not calling Advance() on an iterator equal to\n  // BaseGenerator()->End().\n  virtual void Advance() = 0;\n  // Clones the iterator object. Used for implementing copy semantics\n  // of ParamIterator<T>.\n  virtual ParamIteratorInterface* Clone() const = 0;\n  // Dereferences the current iterator and provides (read-only) access\n  // to the pointed value. It is the caller's responsibility not to call\n  // Current() on an iterator equal to BaseGenerator()->End().\n  // Used for implementing ParamGenerator<T>::operator*().\n  virtual const T* Current() const = 0;\n  // Determines whether the given iterator and other point to the same\n  // element in the sequence generated by the generator.\n  // Used for implementing ParamGenerator<T>::operator==().\n  virtual bool Equals(const ParamIteratorInterface& other) const = 0;\n};\n\n// Class iterating over elements provided by an implementation of\n// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>\n// and implements the const forward iterator concept.\ntemplate <typename T>\nclass ParamIterator {\n public:\n  typedef T value_type;\n  typedef const T& reference;\n  typedef ptrdiff_t difference_type;\n\n  // ParamIterator assumes ownership of the impl_ pointer.\n  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}\n  ParamIterator& operator=(const ParamIterator& other) {\n    if (this != &other)\n      impl_.reset(other.impl_->Clone());\n    return *this;\n  }\n\n  const T& operator*() const { return *impl_->Current(); }\n  const T* operator->() const { return impl_->Current(); }\n  // Prefix version of operator++.\n  ParamIterator& operator++() {\n    impl_->Advance();\n    return *this;\n  }\n  // Postfix version of operator++.\n  ParamIterator operator++(int /*unused*/) {\n    ParamIteratorInterface<T>* clone = impl_->Clone();\n    impl_->Advance();\n    return ParamIterator(clone);\n  }\n  bool operator==(const ParamIterator& other) const {\n    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);\n  }\n  bool operator!=(const ParamIterator& other) const {\n    return !(*this == other);\n  }\n\n private:\n  friend class ParamGenerator<T>;\n  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}\n  scoped_ptr<ParamIteratorInterface<T> > impl_;\n};\n\n// ParamGeneratorInterface<T> is the binary interface to access generators\n// defined in other translation units.\ntemplate <typename T>\nclass ParamGeneratorInterface {\n public:\n  typedef T ParamType;\n\n  virtual ~ParamGeneratorInterface() {}\n\n  // Generator interface definition\n  virtual ParamIteratorInterface<T>* Begin() const = 0;\n  virtual ParamIteratorInterface<T>* End() const = 0;\n};\n\n// Wraps ParamGeneratorInterface<T> and provides general generator syntax\n// compatible with the STL Container concept.\n// This class implements copy initialization semantics and the contained\n// ParamGeneratorInterface<T> instance is shared among all copies\n// of the original object. This is possible because that instance is immutable.\ntemplate<typename T>\nclass ParamGenerator {\n public:\n  typedef ParamIterator<T> iterator;\n\n  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}\n  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}\n\n  ParamGenerator& operator=(const ParamGenerator& other) {\n    impl_ = other.impl_;\n    return *this;\n  }\n\n  iterator begin() const { return iterator(impl_->Begin()); }\n  iterator end() const { return iterator(impl_->End()); }\n\n private:\n  ::testing::internal::linked_ptr<const ParamGeneratorInterface<T> > impl_;\n};\n\n// Generates values from a range of two comparable values. Can be used to\n// generate sequences of user-defined types that implement operator+() and\n// operator<().\n// This class is used in the Range() function.\ntemplate <typename T, typename IncrementT>\nclass RangeGenerator : public ParamGeneratorInterface<T> {\n public:\n  RangeGenerator(T begin, T end, IncrementT step)\n      : begin_(begin), end_(end),\n        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}\n  virtual ~RangeGenerator() {}\n\n  virtual ParamIteratorInterface<T>* Begin() const {\n    return new Iterator(this, begin_, 0, step_);\n  }\n  virtual ParamIteratorInterface<T>* End() const {\n    return new Iterator(this, end_, end_index_, step_);\n  }\n\n private:\n  class Iterator : public ParamIteratorInterface<T> {\n   public:\n    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,\n             IncrementT step)\n        : base_(base), value_(value), index_(index), step_(step) {}\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {\n      return base_;\n    }\n    virtual void Advance() {\n      value_ = value_ + step_;\n      index_++;\n    }\n    virtual ParamIteratorInterface<T>* Clone() const {\n      return new Iterator(*this);\n    }\n    virtual const T* Current() const { return &value_; }\n    virtual bool Equals(const ParamIteratorInterface<T>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      const int other_index =\n          CheckedDowncastToActualType<const Iterator>(&other)->index_;\n      return index_ == other_index;\n    }\n\n   private:\n    Iterator(const Iterator& other)\n        : ParamIteratorInterface<T>(),\n          base_(other.base_), value_(other.value_), index_(other.index_),\n          step_(other.step_) {}\n\n    // No implementation - assignment is unsupported.\n    void operator=(const Iterator& other);\n\n    const ParamGeneratorInterface<T>* const base_;\n    T value_;\n    int index_;\n    const IncrementT step_;\n  };  // class RangeGenerator::Iterator\n\n  static int CalculateEndIndex(const T& begin,\n                               const T& end,\n                               const IncrementT& step) {\n    int end_index = 0;\n    for (T i = begin; i < end; i = i + step)\n      end_index++;\n    return end_index;\n  }\n\n  // No implementation - assignment is unsupported.\n  void operator=(const RangeGenerator& other);\n\n  const T begin_;\n  const T end_;\n  const IncrementT step_;\n  // The index for the end() iterator. All the elements in the generated\n  // sequence are indexed (0-based) to aid iterator comparison.\n  const int end_index_;\n};  // class RangeGenerator\n\n\n// Generates values from a pair of STL-style iterators. Used in the\n// ValuesIn() function. The elements are copied from the source range\n// since the source can be located on the stack, and the generator\n// is likely to persist beyond that stack frame.\ntemplate <typename T>\nclass ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {\n public:\n  template <typename ForwardIterator>\n  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)\n      : container_(begin, end) {}\n  virtual ~ValuesInIteratorRangeGenerator() {}\n\n  virtual ParamIteratorInterface<T>* Begin() const {\n    return new Iterator(this, container_.begin());\n  }\n  virtual ParamIteratorInterface<T>* End() const {\n    return new Iterator(this, container_.end());\n  }\n\n private:\n  typedef typename ::std::vector<T> ContainerType;\n\n  class Iterator : public ParamIteratorInterface<T> {\n   public:\n    Iterator(const ParamGeneratorInterface<T>* base,\n             typename ContainerType::const_iterator iterator)\n        :  base_(base), iterator_(iterator) {}\n    virtual ~Iterator() {}\n\n    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {\n      return base_;\n    }\n    virtual void Advance() {\n      ++iterator_;\n      value_.reset();\n    }\n    virtual ParamIteratorInterface<T>* Clone() const {\n      return new Iterator(*this);\n    }\n    // We need to use cached value referenced by iterator_ because *iterator_\n    // can return a temporary object (and of type other then T), so just\n    // having \"return &*iterator_;\" doesn't work.\n    // value_ is updated here and not in Advance() because Advance()\n    // can advance iterator_ beyond the end of the range, and we cannot\n    // detect that fact. The client code, on the other hand, is\n    // responsible for not calling Current() on an out-of-range iterator.\n    virtual const T* Current() const {\n      if (value_.get() == NULL)\n        value_.reset(new T(*iterator_));\n      return value_.get();\n    }\n    virtual bool Equals(const ParamIteratorInterface<T>& other) const {\n      // Having the same base generator guarantees that the other\n      // iterator is of the same type and we can downcast.\n      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())\n          << \"The program attempted to compare iterators \"\n          << \"from different generators.\" << std::endl;\n      return iterator_ ==\n          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;\n    }\n\n   private:\n    Iterator(const Iterator& other)\n          // The explicit constructor call suppresses a false warning\n          // emitted by gcc when supplied with the -Wextra option.\n        : ParamIteratorInterface<T>(),\n          base_(other.base_),\n          iterator_(other.iterator_) {}\n\n    const ParamGeneratorInterface<T>* const base_;\n    typename ContainerType::const_iterator iterator_;\n    // A cached value of *iterator_. We keep it here to allow access by\n    // pointer in the wrapping iterator's operator->().\n    // value_ needs to be mutable to be accessed in Current().\n    // Use of scoped_ptr helps manage cached value's lifetime,\n    // which is bound by the lifespan of the iterator itself.\n    mutable scoped_ptr<const T> value_;\n  };  // class ValuesInIteratorRangeGenerator::Iterator\n\n  // No implementation - assignment is unsupported.\n  void operator=(const ValuesInIteratorRangeGenerator& other);\n\n  const ContainerType container_;\n};  // class ValuesInIteratorRangeGenerator\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Stores a parameter value and later creates tests parameterized with that\n// value.\ntemplate <class TestClass>\nclass ParameterizedTestFactory : public TestFactoryBase {\n public:\n  typedef typename TestClass::ParamType ParamType;\n  explicit ParameterizedTestFactory(ParamType parameter) :\n      parameter_(parameter) {}\n  virtual Test* CreateTest() {\n    TestClass::SetParam(&parameter_);\n    return new TestClass();\n  }\n\n private:\n  const ParamType parameter_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// TestMetaFactoryBase is a base class for meta-factories that create\n// test factories for passing into MakeAndRegisterTestInfo function.\ntemplate <class ParamType>\nclass TestMetaFactoryBase {\n public:\n  virtual ~TestMetaFactoryBase() {}\n\n  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// TestMetaFactory creates test factories for passing into\n// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives\n// ownership of test factory pointer, same factory object cannot be passed\n// into that method twice. But ParameterizedTestCaseInfo is going to call\n// it for each Test/Parameter value combination. Thus it needs meta factory\n// creator class.\ntemplate <class TestCase>\nclass TestMetaFactory\n    : public TestMetaFactoryBase<typename TestCase::ParamType> {\n public:\n  typedef typename TestCase::ParamType ParamType;\n\n  TestMetaFactory() {}\n\n  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {\n    return new ParameterizedTestFactory<TestCase>(parameter);\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// ParameterizedTestCaseInfoBase is a generic interface\n// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase\n// accumulates test information provided by TEST_P macro invocations\n// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations\n// and uses that information to register all resulting test instances\n// in RegisterTests method. The ParameterizeTestCaseRegistry class holds\n// a collection of pointers to the ParameterizedTestCaseInfo objects\n// and calls RegisterTests() on each of them when asked.\nclass ParameterizedTestCaseInfoBase {\n public:\n  virtual ~ParameterizedTestCaseInfoBase() {}\n\n  // Base part of test case name for display purposes.\n  virtual const String& GetTestCaseName() const = 0;\n  // Test case id to verify identity.\n  virtual TypeId GetTestCaseTypeId() const = 0;\n  // UnitTest class invokes this method to register tests in this\n  // test case right before running them in RUN_ALL_TESTS macro.\n  // This method should not be called more then once on any single\n  // instance of a ParameterizedTestCaseInfoBase derived class.\n  virtual void RegisterTests() = 0;\n\n protected:\n  ParameterizedTestCaseInfoBase() {}\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);\n};\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P\n// macro invocations for a particular test case and generators\n// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that\n// test case. It registers tests with all values generated by all\n// generators when asked.\ntemplate <class TestCase>\nclass ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {\n public:\n  // ParamType and GeneratorCreationFunc are private types but are required\n  // for declarations of public methods AddTestPattern() and\n  // AddTestCaseInstantiation().\n  typedef typename TestCase::ParamType ParamType;\n  // A function that returns an instance of appropriate generator type.\n  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();\n\n  explicit ParameterizedTestCaseInfo(const char* name)\n      : test_case_name_(name) {}\n\n  // Test case base name for display purposes.\n  virtual const String& GetTestCaseName() const { return test_case_name_; }\n  // Test case id to verify identity.\n  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }\n  // TEST_P macro uses AddTestPattern() to record information\n  // about a single test in a LocalTestInfo structure.\n  // test_case_name is the base name of the test case (without invocation\n  // prefix). test_base_name is the name of an individual test without\n  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is\n  // test case base name and DoBar is test base name.\n  void AddTestPattern(const char* test_case_name,\n                      const char* test_base_name,\n                      TestMetaFactoryBase<ParamType>* meta_factory) {\n    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,\n                                                       test_base_name,\n                                                       meta_factory)));\n  }\n  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information\n  // about a generator.\n  int AddTestCaseInstantiation(const char* instantiation_name,\n                               GeneratorCreationFunc* func,\n                               const char* /* file */,\n                               int /* line */) {\n    instantiations_.push_back(::std::make_pair(instantiation_name, func));\n    return 0;  // Return value used only to run this method in namespace scope.\n  }\n  // UnitTest class invokes this method to register tests in this test case\n  // test cases right before running tests in RUN_ALL_TESTS macro.\n  // This method should not be called more then once on any single\n  // instance of a ParameterizedTestCaseInfoBase derived class.\n  // UnitTest has a guard to prevent from calling this method more then once.\n  virtual void RegisterTests() {\n    for (typename TestInfoContainer::iterator test_it = tests_.begin();\n         test_it != tests_.end(); ++test_it) {\n      linked_ptr<TestInfo> test_info = *test_it;\n      for (typename InstantiationContainer::iterator gen_it =\n               instantiations_.begin(); gen_it != instantiations_.end();\n               ++gen_it) {\n        const String& instantiation_name = gen_it->first;\n        ParamGenerator<ParamType> generator((*gen_it->second)());\n\n        Message test_case_name_stream;\n        if ( !instantiation_name.empty() )\n          test_case_name_stream << instantiation_name.c_str() << \"/\";\n        test_case_name_stream << test_info->test_case_base_name.c_str();\n\n        int i = 0;\n        for (typename ParamGenerator<ParamType>::iterator param_it =\n                 generator.begin();\n             param_it != generator.end(); ++param_it, ++i) {\n          Message test_name_stream;\n          test_name_stream << test_info->test_base_name.c_str() << \"/\" << i;\n          ::testing::internal::MakeAndRegisterTestInfo(\n              test_case_name_stream.GetString().c_str(),\n              test_name_stream.GetString().c_str(),\n              \"\",  // test_case_comment\n              \"\",  // comment; TODO(vladl@google.com): provide parameter value\n                   //                                  representation.\n              GetTestCaseTypeId(),\n              TestCase::SetUpTestCase,\n              TestCase::TearDownTestCase,\n              test_info->test_meta_factory->CreateTestFactory(*param_it));\n        }  // for param_it\n      }  // for gen_it\n    }  // for test_it\n  }  // RegisterTests\n\n private:\n  // LocalTestInfo structure keeps information about a single test registered\n  // with TEST_P macro.\n  struct TestInfo {\n    TestInfo(const char* a_test_case_base_name,\n             const char* a_test_base_name,\n             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :\n        test_case_base_name(a_test_case_base_name),\n        test_base_name(a_test_base_name),\n        test_meta_factory(a_test_meta_factory) {}\n\n    const String test_case_base_name;\n    const String test_base_name;\n    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;\n  };\n  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;\n  // Keeps pairs of <Instantiation name, Sequence generator creation function>\n  // received from INSTANTIATE_TEST_CASE_P macros.\n  typedef ::std::vector<std::pair<String, GeneratorCreationFunc*> >\n      InstantiationContainer;\n\n  const String test_case_name_;\n  TestInfoContainer tests_;\n  InstantiationContainer instantiations_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);\n};  // class ParameterizedTestCaseInfo\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase\n// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P\n// macros use it to locate their corresponding ParameterizedTestCaseInfo\n// descriptors.\nclass ParameterizedTestCaseRegistry {\n public:\n  ParameterizedTestCaseRegistry() {}\n  ~ParameterizedTestCaseRegistry() {\n    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();\n         it != test_case_infos_.end(); ++it) {\n      delete *it;\n    }\n  }\n\n  // Looks up or creates and returns a structure containing information about\n  // tests and instantiations of a particular test case.\n  template <class TestCase>\n  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(\n      const char* test_case_name,\n      const char* file,\n      int line) {\n    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;\n    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();\n         it != test_case_infos_.end(); ++it) {\n      if ((*it)->GetTestCaseName() == test_case_name) {\n        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {\n          // Complain about incorrect usage of Google Test facilities\n          // and terminate the program since we cannot guaranty correct\n          // test case setup and tear-down in this case.\n          ReportInvalidTestCaseType(test_case_name,  file, line);\n          abort();\n        } else {\n          // At this point we are sure that the object we found is of the same\n          // type we are looking for, so we downcast it to that type\n          // without further checks.\n          typed_test_info = CheckedDowncastToActualType<\n              ParameterizedTestCaseInfo<TestCase> >(*it);\n        }\n        break;\n      }\n    }\n    if (typed_test_info == NULL) {\n      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);\n      test_case_infos_.push_back(typed_test_info);\n    }\n    return typed_test_info;\n  }\n  void RegisterTests() {\n    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();\n         it != test_case_infos_.end(); ++it) {\n      (*it)->RegisterTests();\n    }\n  }\n\n private:\n  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;\n\n  TestCaseInfoContainer test_case_infos_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);\n};\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  //  GTEST_HAS_PARAM_TEST\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-port.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: wan@google.com (Zhanyong Wan)\n//\n// Low-level types and utilities for porting Google Test to various\n// platforms.  They are subject to change without notice.  DO NOT USE\n// THEM IN USER CODE.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_\n\n// The user can define the following macros in the build script to\n// control Google Test's behavior.  If the user doesn't define a macro\n// in this list, Google Test will define it.\n//\n//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)\n//                              is/isn't available.\n//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions\n//                              are enabled.\n//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string\n//                              is/isn't available (some systems define\n//                              ::string, which is different to std::string).\n//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string\n//                              is/isn't available (some systems define\n//                              ::wstring, which is different to std::wstring).\n//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>\n//                              is/isn't available.\n//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't\n//                              enabled.\n//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that\n//                              std::wstring does/doesn't work (Google Test can\n//                              be used where std::wstring is unavailable).\n//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple\n//                              is/isn't available.\n//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the\n//                              compiler supports Microsoft's \"Structured\n//                              Exception Handling\".\n//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google\n//                              Test's own tr1 tuple implementation should be\n//                              used.  Unused when the user sets\n//                              GTEST_HAS_TR1_TUPLE to 0.\n//   GTEST_LINKED_AS_SHARED_LIBRARY\n//                            - Define to 1 when compiling tests that use\n//                              Google Test as a shared library (known as\n//                              DLL on Windows).\n//   GTEST_CREATE_SHARED_LIBRARY\n//                            - Define to 1 when compiling Google Test itself\n//                              as a shared library.\n\n// This header defines the following utilities:\n//\n// Macros indicating the current platform (defined to 1 if compiled on\n// the given platform; otherwise undefined):\n//   GTEST_OS_AIX      - IBM AIX\n//   GTEST_OS_CYGWIN   - Cygwin\n//   GTEST_OS_LINUX    - Linux\n//   GTEST_OS_MAC      - Mac OS X\n//   GTEST_OS_SOLARIS  - Sun Solaris\n//   GTEST_OS_SYMBIAN  - Symbian\n//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)\n//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop\n//     GTEST_OS_WINDOWS_MINGW    - MinGW\n//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile\n//   GTEST_OS_ZOS      - z/OS\n//\n// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the\n// most stable support.  Since core members of the Google Test project\n// don't have access to other platforms, support for them may be less\n// stable.  If you notice any problems on your platform, please notify\n// googletestframework@googlegroups.com (patches for fixing them are\n// even more welcome!).\n//\n// Note that it is possible that none of the GTEST_OS_* macros are defined.\n//\n// Macros indicating available Google Test features (defined to 1 if\n// the corresponding feature is supported; otherwise undefined):\n//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized\n//                            tests)\n//   GTEST_HAS_DEATH_TEST   - death tests\n//   GTEST_HAS_PARAM_TEST   - value-parameterized tests\n//   GTEST_HAS_TYPED_TEST   - typed tests\n//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests\n//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used.\n//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;\n//                            the above two are mutually exclusive.\n//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().\n//\n// Macros for basic C++ coding:\n//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.\n//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a\n//                              variable don't have to be used.\n//   GTEST_DISALLOW_ASSIGN_   - disables operator=.\n//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.\n//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.\n//\n// Synchronization:\n//   Mutex, MutexLock, ThreadLocal, GetThreadCount()\n//                  - synchronization primitives.\n//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above\n//                         synchronization primitives have real implementations\n//                         and Google Test is thread-safe; or 0 otherwise.\n//\n// Template meta programming:\n//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.\n//\n// Smart pointers:\n//   scoped_ptr     - as in TR2.\n//\n// Regular expressions:\n//   RE             - a simple regular expression class using the POSIX\n//                    Extended Regular Expression syntax.  Not available on\n//                    Windows.\n//\n// Logging:\n//   GTEST_LOG_()   - logs messages at the specified severity level.\n//   LogToStderr()  - directs all log messages to stderr.\n//   FlushInfoLog() - flushes informational log messages.\n//\n// Stdout and stderr capturing:\n//   CaptureStdout()     - starts capturing stdout.\n//   GetCapturedStdout() - stops capturing stdout and returns the captured\n//                         string.\n//   CaptureStderr()     - starts capturing stderr.\n//   GetCapturedStderr() - stops capturing stderr and returns the captured\n//                         string.\n//\n// Integer types:\n//   TypeWithSize   - maps an integer to a int type.\n//   Int32, UInt32, Int64, UInt64, TimeInMillis\n//                  - integers of known sizes.\n//   BiggestInt     - the biggest signed integer type.\n//\n// Command-line utilities:\n//   GTEST_FLAG()       - references a flag.\n//   GTEST_DECLARE_*()  - declares a flag.\n//   GTEST_DEFINE_*()   - defines a flag.\n//   GetArgvs()         - returns the command line as a vector of strings.\n//\n// Environment variable utilities:\n//   GetEnv()             - gets the value of an environment variable.\n//   BoolFromGTestEnv()   - parses a bool environment variable.\n//   Int32FromGTestEnv()  - parses an Int32 environment variable.\n//   StringFromGTestEnv() - parses a string environment variable.\n\n#include <stddef.h>  // For ptrdiff_t\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#ifndef _WIN32_WCE\n#include <sys/stat.h>\n#endif  // !_WIN32_WCE\n\n#include <iostream>  // NOLINT\n#include <sstream>  // NOLINT\n#include <string>  // NOLINT\n\n#define GTEST_DEV_EMAIL_ \"googletestframework@@googlegroups.com\"\n#define GTEST_FLAG_PREFIX_ \"gtest_\"\n#define GTEST_FLAG_PREFIX_DASH_ \"gtest-\"\n#define GTEST_FLAG_PREFIX_UPPER_ \"GTEST_\"\n#define GTEST_NAME_ \"Google Test\"\n#define GTEST_PROJECT_URL_ \"http://code.google.com/p/googletest/\"\n\n// Determines the version of gcc that is used to compile this.\n#ifdef __GNUC__\n// 40302 means version 4.3.2.\n#define GTEST_GCC_VER_ \\\n    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)\n#endif  // __GNUC__\n\n// Determines the platform on which Google Test is compiled.\n#ifdef __CYGWIN__\n#define GTEST_OS_CYGWIN 1\n#elif defined __SYMBIAN32__\n#define GTEST_OS_SYMBIAN 1\n#elif defined _WIN32\n#define GTEST_OS_WINDOWS 1\n#ifdef _WIN32_WCE\n#define GTEST_OS_WINDOWS_MOBILE 1\n#elif defined(__MINGW__) || defined(__MINGW32__)\n#define GTEST_OS_WINDOWS_MINGW 1\n#else\n#define GTEST_OS_WINDOWS_DESKTOP 1\n#endif  // _WIN32_WCE\n#elif defined __APPLE__\n#define GTEST_OS_MAC 1\n#elif defined __linux__\n#define GTEST_OS_LINUX 1\n#elif defined __MVS__\n#define GTEST_OS_ZOS 1\n#elif defined(__sun) && defined(__SVR4)\n#define GTEST_OS_SOLARIS 1\n#elif defined(_AIX)\n#define GTEST_OS_AIX 1\n#endif  // __CYGWIN__\n\n#if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_SYMBIAN || \\\n    GTEST_OS_SOLARIS || GTEST_OS_AIX\n\n// On some platforms, <regex.h> needs someone to define size_t, and\n// won't compile otherwise.  We can #include it here as we already\n// included <stdlib.h>, which is guaranteed to define size_t through\n// <stddef.h>.\n#include <regex.h>  // NOLINT\n#include <strings.h>  // NOLINT\n#include <sys/types.h>  // NOLINT\n#include <time.h>  // NOLINT\n#include <unistd.h>  // NOLINT\n\n#define GTEST_USES_POSIX_RE 1\n\n#elif GTEST_OS_WINDOWS\n\n#if !GTEST_OS_WINDOWS_MOBILE\n#include <direct.h>  // NOLINT\n#include <io.h>  // NOLINT\n#endif\n\n// <regex.h> is not available on Windows.  Use our own simple regex\n// implementation instead.\n#define GTEST_USES_SIMPLE_RE 1\n\n#else\n\n// <regex.h> may not be available on this platform.  Use our own\n// simple regex implementation instead.\n#define GTEST_USES_SIMPLE_RE 1\n\n#endif  // GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC ||\n        // GTEST_OS_SYMBIAN || GTEST_OS_SOLARIS || GTEST_OS_AIX\n\n#ifndef GTEST_HAS_EXCEPTIONS\n// The user didn't tell us whether exceptions are enabled, so we need\n// to figure it out.\n#if defined(_MSC_VER) || defined(__BORLANDC__)\n// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS\n// macro to enable exceptions, so we'll do the same.\n// Assumes that exceptions are enabled by default.\n#ifndef _HAS_EXCEPTIONS\n#define _HAS_EXCEPTIONS 1\n#endif  // _HAS_EXCEPTIONS\n#define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS\n#elif defined(__GNUC__) && __EXCEPTIONS\n// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.\n#define GTEST_HAS_EXCEPTIONS 1\n#elif defined(__SUNPRO_CC)\n// Sun Pro CC supports exceptions.  However, there is no compile-time way of\n// detecting whether they are enabled or not.  Therefore, we assume that\n// they are enabled unless the user tells us otherwise.\n#define GTEST_HAS_EXCEPTIONS 1\n#elif defined(__IBMCPP__) && __EXCEPTIONS\n// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.\n#define GTEST_HAS_EXCEPTIONS 1\n#else\n// For other compilers, we assume exceptions are disabled to be\n// conservative.\n#define GTEST_HAS_EXCEPTIONS 0\n#endif  // defined(_MSC_VER) || defined(__BORLANDC__)\n#endif  // GTEST_HAS_EXCEPTIONS\n\n#if !defined(GTEST_HAS_STD_STRING)\n// Even though we don't use this macro any longer, we keep it in case\n// some clients still depend on it.\n#define GTEST_HAS_STD_STRING 1\n#elif !GTEST_HAS_STD_STRING\n// The user told us that ::std::string isn't available.\n#error \"Google Test cannot be used where ::std::string isn't available.\"\n#endif  // !defined(GTEST_HAS_STD_STRING)\n\n#ifndef GTEST_HAS_GLOBAL_STRING\n// The user didn't tell us whether ::string is available, so we need\n// to figure it out.\n\n#define GTEST_HAS_GLOBAL_STRING 0\n\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n#ifndef GTEST_HAS_STD_WSTRING\n// The user didn't tell us whether ::std::wstring is available, so we need\n// to figure it out.\n// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring\n//   is available.\n\n// Cygwin 1.5 and below doesn't support ::std::wstring.\n// Cygwin 1.7 might add wstring support; this should be updated when clear.\n// Solaris' libc++ doesn't support it either.\n#define GTEST_HAS_STD_WSTRING (!(GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))\n\n#endif  // GTEST_HAS_STD_WSTRING\n\n#ifndef GTEST_HAS_GLOBAL_WSTRING\n// The user didn't tell us whether ::wstring is available, so we need\n// to figure it out.\n#define GTEST_HAS_GLOBAL_WSTRING \\\n    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n// Determines whether RTTI is available.\n#ifndef GTEST_HAS_RTTI\n// The user didn't tell us whether RTTI is enabled, so we need to\n// figure it out.\n\n#ifdef _MSC_VER\n\n#ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.\n#define GTEST_HAS_RTTI 1\n#else\n#define GTEST_HAS_RTTI 0\n#endif\n\n// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.\n#elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)\n\n#ifdef __GXX_RTTI\n#define GTEST_HAS_RTTI 1\n#else\n#define GTEST_HAS_RTTI 0\n#endif  // __GXX_RTTI\n\n// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if\n// both the typeid and dynamic_cast features are present.\n#elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)\n\n#ifdef __RTTI_ALL__\n#define GTEST_HAS_RTTI 1\n#else\n#define GTEST_HAS_RTTI 0\n#endif\n\n#else\n\n// For all other compilers, we assume RTTI is enabled.\n#define GTEST_HAS_RTTI 1\n\n#endif  // _MSC_VER\n\n#endif  // GTEST_HAS_RTTI\n\n// It's this header's responsibility to #include <typeinfo> when RTTI\n// is enabled.\n#if GTEST_HAS_RTTI\n#include <typeinfo>\n#endif\n\n// Determines whether Google Test can use the pthreads library.\n#ifndef GTEST_HAS_PTHREAD\n// The user didn't tell us explicitly, so we assume pthreads support is\n// available on Linux and Mac.\n//\n// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0\n// to your compiler flags.\n#define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC)\n#endif  // GTEST_HAS_PTHREAD\n\n// Determines whether Google Test can use tr1/tuple.  You can define\n// this macro to 0 to prevent Google Test from using tuple (any\n// feature depending on tuple with be disabled in this mode).\n#ifndef GTEST_HAS_TR1_TUPLE\n// The user didn't tell us not to do it, so we assume it's OK.\n#define GTEST_HAS_TR1_TUPLE 1\n#endif  // GTEST_HAS_TR1_TUPLE\n\n// Determines whether Google Test's own tr1 tuple implementation\n// should be used.\n#ifndef GTEST_USE_OWN_TR1_TUPLE\n// The user didn't tell us, so we need to figure it out.\n\n// We use our own TR1 tuple if we aren't sure the user has an\n// implementation of it already.  At this time, GCC 4.0.0+ and MSVC\n// 2010 are the only mainstream compilers that come with a TR1 tuple\n// implementation.  NVIDIA's CUDA NVCC compiler pretends to be GCC by\n// defining __GNUC__ and friends, but cannot compile GCC's tuple\n// implementation.  MSVC 2008 (9.0) provides TR1 tuple in a 323 MB\n// Feature Pack download, which we cannot assume the user has.\n#if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000)) \\\n    || _MSC_VER >= 1600\n#define GTEST_USE_OWN_TR1_TUPLE 0\n#else\n#define GTEST_USE_OWN_TR1_TUPLE 1\n#endif\n\n#endif  // GTEST_USE_OWN_TR1_TUPLE\n\n// To avoid conditional compilation everywhere, we make it\n// gtest-port.h's responsibility to #include the header implementing\n// tr1/tuple.\n#if GTEST_HAS_TR1_TUPLE\n\n#if GTEST_USE_OWN_TR1_TUPLE\n#include <gtest/internal/gtest-tuple.h>\n#elif GTEST_OS_SYMBIAN\n\n// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to\n// use STLport's tuple implementation, which unfortunately doesn't\n// work as the copy of STLport distributed with Symbian is incomplete.\n// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to\n// use its own tuple implementation.\n#ifdef BOOST_HAS_TR1_TUPLE\n#undef BOOST_HAS_TR1_TUPLE\n#endif  // BOOST_HAS_TR1_TUPLE\n\n// This prevents <boost/tr1/detail/config.hpp>, which defines\n// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.\n#define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED\n#include <tuple>\n\n#elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)\n// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does\n// not conform to the TR1 spec, which requires the header to be <tuple>.\n\n#if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302\n// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,\n// which is #included by <tr1/tuple>, to not compile when RTTI is\n// disabled.  _TR1_FUNCTIONAL is the header guard for\n// <tr1/functional>.  Hence the following #define is a hack to prevent\n// <tr1/functional> from being included.\n#define _TR1_FUNCTIONAL 1\n#include <tr1/tuple>\n#undef _TR1_FUNCTIONAL  // Allows the user to #include\n                        // <tr1/functional> if he chooses to.\n#else\n#include <tr1/tuple>  // NOLINT\n#endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302\n\n#else\n// If the compiler is not GCC 4.0+, we assume the user is using a\n// spec-conforming TR1 implementation.\n#include <tuple>  // NOLINT\n#endif  // GTEST_USE_OWN_TR1_TUPLE\n\n#endif  // GTEST_HAS_TR1_TUPLE\n\n// Determines whether clone(2) is supported.\n// Usually it will only be available on Linux, excluding\n// Linux on the Itanium architecture.\n// Also see http://linux.die.net/man/2/clone.\n#ifndef GTEST_HAS_CLONE\n// The user didn't tell us, so we need to figure it out.\n\n#if GTEST_OS_LINUX && !defined(__ia64__)\n#define GTEST_HAS_CLONE 1\n#else\n#define GTEST_HAS_CLONE 0\n#endif  // GTEST_OS_LINUX && !defined(__ia64__)\n\n#endif  // GTEST_HAS_CLONE\n\n// Determines whether to support stream redirection. This is used to test\n// output correctness and to implement death tests.\n#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN\n#define GTEST_HAS_STREAM_REDIRECTION_ 1\n#endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN\n\n// Determines whether to support death tests.\n// Google Test does not support death tests for VC 7.1 and earlier as\n// abort() in a VC 7.1 application compiled as GUI in debug config\n// pops up a dialog window that cannot be suppressed programmatically.\n#if (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \\\n     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \\\n     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX)\n#define GTEST_HAS_DEATH_TEST 1\n#include <vector>  // NOLINT\n#endif\n\n// We don't support MSVC 7.1 with exceptions disabled now.  Therefore\n// all the compilers we care about are adequate for supporting\n// value-parameterized tests.\n#define GTEST_HAS_PARAM_TEST 1\n\n// Determines whether to support type-driven tests.\n\n// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,\n// Sun Pro CC, and IBM Visual Age support.\n#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \\\n    defined(__IBMCPP__)\n#define GTEST_HAS_TYPED_TEST 1\n#define GTEST_HAS_TYPED_TEST_P 1\n#endif\n\n// Determines whether to support Combine(). This only makes sense when\n// value-parameterized tests are enabled.  The implementation doesn't\n// work on Sun Studio since it doesn't understand templated conversion\n// operators.\n#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)\n#define GTEST_HAS_COMBINE 1\n#endif\n\n// Determines whether the system compiler uses UTF-16 for encoding wide strings.\n#define GTEST_WIDE_STRING_USES_UTF16_ \\\n    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)\n\n// Defines some utility macros.\n\n// The GNU compiler emits a warning if nested \"if\" statements are followed by\n// an \"else\" statement and braces are not used to explicitly disambiguate the\n// \"else\" binding.  This leads to problems with code like:\n//\n//   if (gate)\n//     ASSERT_*(condition) << \"Some message\";\n//\n// The \"switch (0) case 0:\" idiom is used to suppress this.\n#ifdef __INTEL_COMPILER\n#define GTEST_AMBIGUOUS_ELSE_BLOCKER_\n#else\n#define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0:  // NOLINT\n#endif\n\n// Use this annotation at the end of a struct/class definition to\n// prevent the compiler from optimizing away instances that are never\n// used.  This is useful when all interesting logic happens inside the\n// c'tor and / or d'tor.  Example:\n//\n//   struct Foo {\n//     Foo() { ... }\n//   } GTEST_ATTRIBUTE_UNUSED_;\n//\n// Also use it after a variable or parameter declaration to tell the\n// compiler the variable/parameter does not have to be used.\n#if defined(__GNUC__) && !defined(COMPILER_ICC)\n#define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))\n#else\n#define GTEST_ATTRIBUTE_UNUSED_\n#endif\n\n// A macro to disallow operator=\n// This should be used in the private: declarations for a class.\n#define GTEST_DISALLOW_ASSIGN_(type)\\\n  void operator=(type const &)\n\n// A macro to disallow copy constructor and operator=\n// This should be used in the private: declarations for a class.\n#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\\\n  type(type const &);\\\n  GTEST_DISALLOW_ASSIGN_(type)\n\n// Tell the compiler to warn about unused return values for functions declared\n// with this macro.  The macro should be used on function declarations\n// following the argument list:\n//\n//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;\n#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)\n#define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))\n#else\n#define GTEST_MUST_USE_RESULT_\n#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC\n\n// Determine whether the compiler supports Microsoft's Structured Exception\n// Handling.  This is supported by several Windows compilers but generally\n// does not exist on any other system.\n#ifndef GTEST_HAS_SEH\n// The user didn't tell us, so we need to figure it out.\n\n#if defined(_MSC_VER) || defined(__BORLANDC__)\n// These two compilers are known to support SEH.\n#define GTEST_HAS_SEH 1\n#else\n// Assume no SEH.\n#define GTEST_HAS_SEH 0\n#endif\n\n#endif  // GTEST_HAS_SEH\n\n#ifdef _MSC_VER\n\n#if GTEST_LINKED_AS_SHARED_LIBRARY\n#define GTEST_API_ __declspec(dllimport)\n#elif GTEST_CREATE_SHARED_LIBRARY\n#define GTEST_API_ __declspec(dllexport)\n#endif\n\n#endif  // _MSC_VER\n\n#ifndef GTEST_API_\n#define GTEST_API_\n#endif\n\nnamespace testing {\n\nclass Message;\n\nnamespace internal {\n\nclass String;\n\ntypedef ::std::stringstream StrStream;\n\n// A helper for suppressing warnings on constant condition.  It just\n// returns 'condition'.\nGTEST_API_ bool IsTrue(bool condition);\n\n// Defines scoped_ptr.\n\n// This implementation of scoped_ptr is PARTIAL - it only contains\n// enough stuff to satisfy Google Test's need.\ntemplate <typename T>\nclass scoped_ptr {\n public:\n  typedef T element_type;\n\n  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}\n  ~scoped_ptr() { reset(); }\n\n  T& operator*() const { return *ptr_; }\n  T* operator->() const { return ptr_; }\n  T* get() const { return ptr_; }\n\n  T* release() {\n    T* const ptr = ptr_;\n    ptr_ = NULL;\n    return ptr;\n  }\n\n  void reset(T* p = NULL) {\n    if (p != ptr_) {\n      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.\n        delete ptr_;\n      }\n      ptr_ = p;\n    }\n  }\n private:\n  T* ptr_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);\n};\n\n// Defines RE.\n\n// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended\n// Regular Expression syntax.\nclass GTEST_API_ RE {\n public:\n  // A copy constructor is required by the Standard to initialize object\n  // references from r-values.\n  RE(const RE& other) { Init(other.pattern()); }\n\n  // Constructs an RE from a string.\n  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT\n\n#if GTEST_HAS_GLOBAL_STRING\n  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n  RE(const char* regex) { Init(regex); }  // NOLINT\n  ~RE();\n\n  // Returns the string representation of the regex.\n  const char* pattern() const { return pattern_; }\n\n  // FullMatch(str, re) returns true iff regular expression re matches\n  // the entire str.\n  // PartialMatch(str, re) returns true iff regular expression re\n  // matches a substring of str (including str itself).\n  //\n  // TODO(wan@google.com): make FullMatch() and PartialMatch() work\n  // when str contains NUL characters.\n  static bool FullMatch(const ::std::string& str, const RE& re) {\n    return FullMatch(str.c_str(), re);\n  }\n  static bool PartialMatch(const ::std::string& str, const RE& re) {\n    return PartialMatch(str.c_str(), re);\n  }\n\n#if GTEST_HAS_GLOBAL_STRING\n  static bool FullMatch(const ::string& str, const RE& re) {\n    return FullMatch(str.c_str(), re);\n  }\n  static bool PartialMatch(const ::string& str, const RE& re) {\n    return PartialMatch(str.c_str(), re);\n  }\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n  static bool FullMatch(const char* str, const RE& re);\n  static bool PartialMatch(const char* str, const RE& re);\n\n private:\n  void Init(const char* regex);\n\n  // We use a const char* instead of a string, as Google Test may be used\n  // where string is not available.  We also do not use Google Test's own\n  // String type here, in order to simplify dependencies between the\n  // files.\n  const char* pattern_;\n  bool is_valid_;\n#if GTEST_USES_POSIX_RE\n  regex_t full_regex_;     // For FullMatch().\n  regex_t partial_regex_;  // For PartialMatch().\n#else  // GTEST_USES_SIMPLE_RE\n  const char* full_pattern_;  // For FullMatch();\n#endif\n\n  GTEST_DISALLOW_ASSIGN_(RE);\n};\n\n// Defines logging utilities:\n//   GTEST_LOG_(severity) - logs messages at the specified severity level. The\n//                          message itself is streamed into the macro.\n//   LogToStderr()  - directs all log messages to stderr.\n//   FlushInfoLog() - flushes informational log messages.\n\nenum GTestLogSeverity {\n  GTEST_INFO,\n  GTEST_WARNING,\n  GTEST_ERROR,\n  GTEST_FATAL\n};\n\n// Formats log entry severity, provides a stream object for streaming the\n// log message, and terminates the message with a newline when going out of\n// scope.\nclass GTEST_API_ GTestLog {\n public:\n  GTestLog(GTestLogSeverity severity, const char* file, int line);\n\n  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.\n  ~GTestLog();\n\n  ::std::ostream& GetStream() { return ::std::cerr; }\n\n private:\n  const GTestLogSeverity severity_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);\n};\n\n#define GTEST_LOG_(severity) \\\n    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \\\n                                  __FILE__, __LINE__).GetStream()\n\ninline void LogToStderr() {}\ninline void FlushInfoLog() { fflush(NULL); }\n\n// INTERNAL IMPLEMENTATION - DO NOT USE.\n//\n// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition\n// is not satisfied.\n//  Synopsys:\n//    GTEST_CHECK_(boolean_condition);\n//     or\n//    GTEST_CHECK_(boolean_condition) << \"Additional message\";\n//\n//    This checks the condition and if the condition is not satisfied\n//    it prints message about the condition violation, including the\n//    condition itself, plus additional message streamed into it, if any,\n//    and then it aborts the program. It aborts the program irrespective of\n//    whether it is built in the debug mode or not.\n#define GTEST_CHECK_(condition) \\\n    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\n    if (::testing::internal::IsTrue(condition)) \\\n      ; \\\n    else \\\n      GTEST_LOG_(FATAL) << \"Condition \" #condition \" failed. \"\n\n// An all-mode assert to verify that the given POSIX-style function\n// call returns 0 (indicating success).  Known limitation: this\n// doesn't expand to a balanced 'if' statement, so enclose the macro\n// in {} if you need to use it as the only statement in an 'if'\n// branch.\n#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \\\n  if (const int gtest_error = (posix_call)) \\\n    GTEST_LOG_(FATAL) << #posix_call << \"failed with error \" \\\n                      << gtest_error\n\n// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.\n//\n// Downcasts the pointer of type Base to Derived.\n// Derived must be a subclass of Base. The parameter MUST\n// point to a class of type Derived, not any subclass of it.\n// When RTTI is available, the function performs a runtime\n// check to enforce this.\ntemplate <class Derived, class Base>\nDerived* CheckedDowncastToActualType(Base* base) {\n#if GTEST_HAS_RTTI\n  GTEST_CHECK_(typeid(*base) == typeid(Derived));\n  return dynamic_cast<Derived*>(base);  // NOLINT\n#else\n  return static_cast<Derived*>(base);  // Poor man's downcast.\n#endif\n}\n\n#if GTEST_HAS_STREAM_REDIRECTION_\n\n// Defines the stderr capturer:\n//   CaptureStdout     - starts capturing stdout.\n//   GetCapturedStdout - stops capturing stdout and returns the captured string.\n//   CaptureStderr     - starts capturing stderr.\n//   GetCapturedStderr - stops capturing stderr and returns the captured string.\n//\nGTEST_API_ void CaptureStdout();\nGTEST_API_ String GetCapturedStdout();\nGTEST_API_ void CaptureStderr();\nGTEST_API_ String GetCapturedStderr();\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION_\n\n\n#if GTEST_HAS_DEATH_TEST\n\n// A copy of all command line arguments.  Set by InitGoogleTest().\nextern ::std::vector<String> g_argvs;\n\n// GTEST_HAS_DEATH_TEST implies we have ::std::string.\nconst ::std::vector<String>& GetArgvs();\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n// Defines synchronization primitives.\n\n#if GTEST_HAS_PTHREAD\n\n// Sleeps for (roughly) n milli-seconds.  This function is only for\n// testing Google Test's own constructs.  Don't use it in user tests,\n// either directly or indirectly.\ninline void SleepMilliseconds(int n) {\n  const timespec time = {\n    0,                  // 0 seconds.\n    n * 1000L * 1000L,  // And n ms.\n  };\n  nanosleep(&time, NULL);\n}\n\n// Allows a controller thread to pause execution of newly created\n// threads until notified.  Instances of this class must be created\n// and destroyed in the controller thread.\n//\n// This class is only for testing Google Test's own constructs. Do not\n// use it in user tests, either directly or indirectly.\nclass Notification {\n public:\n  Notification() : notified_(false) {}\n\n  // Notifies all threads created with this notification to start. Must\n  // be called from the controller thread.\n  void Notify() { notified_ = true; }\n\n  // Blocks until the controller thread notifies. Must be called from a test\n  // thread.\n  void WaitForNotification() {\n    while(!notified_) {\n      SleepMilliseconds(10);\n    }\n  }\n\n private:\n  volatile bool notified_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);\n};\n\n// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.\n// Consequently, it cannot select a correct instantiation of ThreadWithParam\n// in order to call its Run(). Introducing ThreadWithParamBase as a\n// non-templated base class for ThreadWithParam allows us to bypass this\n// problem.\nclass ThreadWithParamBase {\n public:\n  virtual ~ThreadWithParamBase() {}\n  virtual void Run() = 0;\n};\n\n// pthread_create() accepts a pointer to a function type with the C linkage.\n// According to the Standard (7.5/1), function types with different linkages\n// are different even if they are otherwise identical.  Some compilers (for\n// example, SunStudio) treat them as different types.  Since class methods\n// cannot be defined with C-linkage we need to define a free C-function to\n// pass into pthread_create().\nextern \"C\" inline void* ThreadFuncWithCLinkage(void* thread) {\n  static_cast<ThreadWithParamBase*>(thread)->Run();\n  return NULL;\n}\n\n// Helper class for testing Google Test's multi-threading constructs.\n// To use it, write:\n//\n//   void ThreadFunc(int param) { /* Do things with param */ }\n//   Notification thread_can_start;\n//   ...\n//   // The thread_can_start parameter is optional; you can supply NULL.\n//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);\n//   thread_can_start.Notify();\n//\n// These classes are only for testing Google Test's own constructs. Do\n// not use them in user tests, either directly or indirectly.\ntemplate <typename T>\nclass ThreadWithParam : public ThreadWithParamBase {\n public:\n  typedef void (*UserThreadFunc)(T);\n\n  ThreadWithParam(\n      UserThreadFunc func, T param, Notification* thread_can_start)\n      : func_(func),\n        param_(param),\n        thread_can_start_(thread_can_start),\n        finished_(false) {\n    ThreadWithParamBase* const base = this;\n    // The thread can be created only after all fields except thread_\n    // have been initialized.\n    GTEST_CHECK_POSIX_SUCCESS_(\n        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));\n  }\n  ~ThreadWithParam() { Join(); }\n\n  void Join() {\n    if (!finished_) {\n      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));\n      finished_ = true;\n    }\n  }\n\n  virtual void Run() {\n    if (thread_can_start_ != NULL)\n      thread_can_start_->WaitForNotification();\n    func_(param_);\n  }\n\n private:\n  const UserThreadFunc func_;  // User-supplied thread function.\n  const T param_;  // User-supplied parameter to the thread function.\n  // When non-NULL, used to block execution until the controller thread\n  // notifies.\n  Notification* const thread_can_start_;\n  bool finished_;  // true iff we know that the thread function has finished.\n  pthread_t thread_;  // The native thread object.\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);\n};\n\n// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is\n// true.\n#include <pthread.h>\n\n// MutexBase and Mutex implement mutex on pthreads-based platforms. They\n// are used in conjunction with class MutexLock:\n//\n//   Mutex mutex;\n//   ...\n//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the end\n//                            // of the current scope.\n//\n// MutexBase implements behavior for both statically and dynamically\n// allocated mutexes.  Do not use MutexBase directly.  Instead, write\n// the following to define a static mutex:\n//\n//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);\n//\n// You can forward declare a static mutex like this:\n//\n//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);\n//\n// To create a dynamic mutex, just define an object of type Mutex.\nclass MutexBase {\n public:\n  // Acquires this mutex.\n  void Lock() {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));\n    owner_ = pthread_self();\n  }\n\n  // Releases this mutex.\n  void Unlock() {\n    // We don't protect writing to owner_ here, as it's the caller's\n    // responsibility to ensure that the current thread holds the\n    // mutex when this is called.\n    owner_ = 0;\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));\n  }\n\n  // Does nothing if the current thread holds the mutex. Otherwise, crashes\n  // with high probability.\n  void AssertHeld() const {\n    GTEST_CHECK_(owner_ == pthread_self())\n        << \"The current thread is not holding the mutex @\" << this;\n  }\n\n  // A static mutex may be used before main() is entered.  It may even\n  // be used before the dynamic initialization stage.  Therefore we\n  // must be able to initialize a static mutex object at link time.\n  // This means MutexBase has to be a POD and its member variables\n  // have to be public.\n public:\n  pthread_mutex_t mutex_;  // The underlying pthread mutex.\n  pthread_t owner_;  // The thread holding the mutex; 0 means no one holds it.\n};\n\n// Forward-declares a static mutex.\n#define GTEST_DECLARE_STATIC_MUTEX_(mutex) \\\n    extern ::testing::internal::MutexBase mutex\n\n// Defines and statically (i.e. at link time) initializes a static mutex.\n#define GTEST_DEFINE_STATIC_MUTEX_(mutex) \\\n    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, 0 }\n\n// The Mutex class can only be used for mutexes created at runtime. It\n// shares its API with MutexBase otherwise.\nclass Mutex : public MutexBase {\n public:\n  Mutex() {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));\n    owner_ = 0;\n  }\n  ~Mutex() {\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));\n  }\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);\n};\n\n// We cannot name this class MutexLock as the ctor declaration would\n// conflict with a macro named MutexLock, which is defined on some\n// platforms.  Hence the typedef trick below.\nclass GTestMutexLock {\n public:\n  explicit GTestMutexLock(MutexBase* mutex)\n      : mutex_(mutex) { mutex_->Lock(); }\n\n  ~GTestMutexLock() { mutex_->Unlock(); }\n\n private:\n  MutexBase* const mutex_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);\n};\n\ntypedef GTestMutexLock MutexLock;\n\n// Helpers for ThreadLocal.\n\n// pthread_key_create() requires DeleteThreadLocalValue() to have\n// C-linkage.  Therefore it cannot be templatized to access\n// ThreadLocal<T>.  Hence the need for class\n// ThreadLocalValueHolderBase.\nclass ThreadLocalValueHolderBase {\n public:\n  virtual ~ThreadLocalValueHolderBase() {}\n};\n\n// Called by pthread to delete thread-local data stored by\n// pthread_setspecific().\nextern \"C\" inline void DeleteThreadLocalValue(void* value_holder) {\n  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);\n}\n\n// Implements thread-local storage on pthreads-based systems.\n//\n//   // Thread 1\n//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.\n//\n//   // Thread 2\n//   tl.set(150);  // Changes the value for thread 2 only.\n//   EXPECT_EQ(150, tl.get());\n//\n//   // Thread 1\n//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.\n//   tl.set(200);\n//   EXPECT_EQ(200, tl.get());\n//\n// The template type argument T must have a public copy constructor.\n// In addition, the default ThreadLocal constructor requires T to have\n// a public default constructor.\n//\n// An object managed for a thread by a ThreadLocal instance is deleted\n// when the thread exits.  Or, if the ThreadLocal instance dies in\n// that thread, when the ThreadLocal dies.  It's the user's\n// responsibility to ensure that all other threads using a ThreadLocal\n// have exited when it dies, or the per-thread objects for those\n// threads will not be deleted.\n//\n// Google Test only uses global ThreadLocal objects.  That means they\n// will die after main() has returned.  Therefore, no per-thread\n// object managed by Google Test will be leaked as long as all threads\n// using Google Test have exited when main() returns.\ntemplate <typename T>\nclass ThreadLocal {\n public:\n  ThreadLocal() : key_(CreateKey()),\n                  default_() {}\n  explicit ThreadLocal(const T& value) : key_(CreateKey()),\n                                         default_(value) {}\n\n  ~ThreadLocal() {\n    // Destroys the managed object for the current thread, if any.\n    DeleteThreadLocalValue(pthread_getspecific(key_));\n\n    // Releases resources associated with the key.  This will *not*\n    // delete managed objects for other threads.\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));\n  }\n\n  T* pointer() { return GetOrCreateValue(); }\n  const T* pointer() const { return GetOrCreateValue(); }\n  const T& get() const { return *pointer(); }\n  void set(const T& value) { *pointer() = value; }\n\n private:\n  // Holds a value of type T.\n  class ValueHolder : public ThreadLocalValueHolderBase {\n   public:\n    explicit ValueHolder(const T& value) : value_(value) {}\n\n    T* pointer() { return &value_; }\n\n   private:\n    T value_;\n    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);\n  };\n\n  static pthread_key_t CreateKey() {\n    pthread_key_t key;\n    // When a thread exits, DeleteThreadLocalValue() will be called on\n    // the object managed for that thread.\n    GTEST_CHECK_POSIX_SUCCESS_(\n        pthread_key_create(&key, &DeleteThreadLocalValue));\n    return key;\n  }\n\n  T* GetOrCreateValue() const {\n    ThreadLocalValueHolderBase* const holder =\n        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));\n    if (holder != NULL) {\n      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();\n    }\n\n    ValueHolder* const new_holder = new ValueHolder(default_);\n    ThreadLocalValueHolderBase* const holder_base = new_holder;\n    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));\n    return new_holder->pointer();\n  }\n\n  // A key pthreads uses for looking up per-thread values.\n  const pthread_key_t key_;\n  const T default_;  // The default value for each thread.\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);\n};\n\n#define GTEST_IS_THREADSAFE 1\n\n#else  // GTEST_HAS_PTHREAD\n\n// A dummy implementation of synchronization primitives (mutex, lock,\n// and thread-local variable).  Necessary for compiling Google Test where\n// mutex is not supported - using Google Test in multiple threads is not\n// supported on such platforms.\n\nclass Mutex {\n public:\n  Mutex() {}\n  void AssertHeld() const {}\n};\n\n#define GTEST_DECLARE_STATIC_MUTEX_(mutex) \\\n  extern ::testing::internal::Mutex mutex\n\n#define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex\n\nclass GTestMutexLock {\n public:\n  explicit GTestMutexLock(Mutex*) {}  // NOLINT\n};\n\ntypedef GTestMutexLock MutexLock;\n\ntemplate <typename T>\nclass ThreadLocal {\n public:\n  ThreadLocal() : value_() {}\n  explicit ThreadLocal(const T& value) : value_(value) {}\n  T* pointer() { return &value_; }\n  const T* pointer() const { return &value_; }\n  const T& get() const { return value_; }\n  void set(const T& value) { value_ = value; }\n private:\n  T value_;\n};\n\n// The above synchronization primitives have dummy implementations.\n// Therefore Google Test is not thread-safe.\n#define GTEST_IS_THREADSAFE 0\n\n#endif  // GTEST_HAS_PTHREAD\n\n// Returns the number of threads running in the process, or 0 to indicate that\n// we cannot detect it.\nGTEST_API_ size_t GetThreadCount();\n\n// Passing non-POD classes through ellipsis (...) crashes the ARM\n// compiler and generates a warning in Sun Studio.  The Nokia Symbian\n// and the IBM XL C/C++ compiler try to instantiate a copy constructor\n// for objects passed through ellipsis (...), failing for uncopyable\n// objects.  We define this to ensure that only POD is passed through\n// ellipsis on these systems.\n#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)\n// We lose support for NULL detection where the compiler doesn't like\n// passing non-POD classes through ellipsis (...).\n#define GTEST_ELLIPSIS_NEEDS_POD_ 1\n#else\n#define GTEST_CAN_COMPARE_NULL 1\n#endif\n\n// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between\n// const T& and const T* in a function template.  These compilers\n// _can_ decide between class template specializations for T and T*,\n// so a tr1::type_traits-like is_pointer works.\n#if defined(__SYMBIAN32__) || defined(__IBMCPP__)\n#define GTEST_NEEDS_IS_POINTER_ 1\n#endif\n\ntemplate <bool bool_value>\nstruct bool_constant {\n  typedef bool_constant<bool_value> type;\n  static const bool value = bool_value;\n};\ntemplate <bool bool_value> const bool bool_constant<bool_value>::value;\n\ntypedef bool_constant<false> false_type;\ntypedef bool_constant<true> true_type;\n\ntemplate <typename T>\nstruct is_pointer : public false_type {};\n\ntemplate <typename T>\nstruct is_pointer<T*> : public true_type {};\n\n#if GTEST_OS_WINDOWS\n#define GTEST_PATH_SEP_ \"\\\\\"\n#define GTEST_HAS_ALT_PATH_SEP_ 1\n// The biggest signed integer type the compiler supports.\ntypedef __int64 BiggestInt;\n#else\n#define GTEST_PATH_SEP_ \"/\"\n#define GTEST_HAS_ALT_PATH_SEP_ 0\ntypedef long long BiggestInt;  // NOLINT\n#endif  // GTEST_OS_WINDOWS\n\n// The testing::internal::posix namespace holds wrappers for common\n// POSIX functions.  These wrappers hide the differences between\n// Windows/MSVC and POSIX systems.  Since some compilers define these\n// standard functions as macros, the wrapper cannot have the same name\n// as the wrapped function.\n\nnamespace posix {\n\n// Functions with a different name on Windows.\n\n#if GTEST_OS_WINDOWS\n\ntypedef struct _stat StatStruct;\n\n#ifdef __BORLANDC__\ninline int IsATTY(int fd) { return isatty(fd); }\ninline int StrCaseCmp(const char* s1, const char* s2) {\n  return stricmp(s1, s2);\n}\ninline char* StrDup(const char* src) { return strdup(src); }\n#else  // !__BORLANDC__\n#if GTEST_OS_WINDOWS_MOBILE\ninline int IsATTY(int /* fd */) { return 0; }\n#else\ninline int IsATTY(int fd) { return _isatty(fd); }\n#endif  // GTEST_OS_WINDOWS_MOBILE\ninline int StrCaseCmp(const char* s1, const char* s2) {\n  return _stricmp(s1, s2);\n}\ninline char* StrDup(const char* src) { return _strdup(src); }\n#endif  // __BORLANDC__\n\n#if GTEST_OS_WINDOWS_MOBILE\ninline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }\n// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this\n// time and thus not defined there.\n#else\ninline int FileNo(FILE* file) { return _fileno(file); }\ninline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }\ninline int RmDir(const char* dir) { return _rmdir(dir); }\ninline bool IsDir(const StatStruct& st) {\n  return (_S_IFDIR & st.st_mode) != 0;\n}\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n#else\n\ntypedef struct stat StatStruct;\n\ninline int FileNo(FILE* file) { return fileno(file); }\ninline int IsATTY(int fd) { return isatty(fd); }\ninline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }\ninline int StrCaseCmp(const char* s1, const char* s2) {\n  return strcasecmp(s1, s2);\n}\ninline char* StrDup(const char* src) { return strdup(src); }\ninline int RmDir(const char* dir) { return rmdir(dir); }\ninline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }\n\n#endif  // GTEST_OS_WINDOWS\n\n// Functions deprecated by MSVC 8.0.\n\n#ifdef _MSC_VER\n// Temporarily disable warning 4996 (deprecated function).\n#pragma warning(push)\n#pragma warning(disable:4996)\n#endif\n\ninline const char* StrNCpy(char* dest, const char* src, size_t n) {\n  return strncpy(dest, src, n);\n}\n\n// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and\n// StrError() aren't needed on Windows CE at this time and thus not\n// defined there.\n\n#if !GTEST_OS_WINDOWS_MOBILE\ninline int ChDir(const char* dir) { return chdir(dir); }\n#endif\ninline FILE* FOpen(const char* path, const char* mode) {\n  return fopen(path, mode);\n}\n#if !GTEST_OS_WINDOWS_MOBILE\ninline FILE *FReopen(const char* path, const char* mode, FILE* stream) {\n  return freopen(path, mode, stream);\n}\ninline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }\n#endif\ninline int FClose(FILE* fp) { return fclose(fp); }\n#if !GTEST_OS_WINDOWS_MOBILE\ninline int Read(int fd, void* buf, unsigned int count) {\n  return static_cast<int>(read(fd, buf, count));\n}\ninline int Write(int fd, const void* buf, unsigned int count) {\n  return static_cast<int>(write(fd, buf, count));\n}\ninline int Close(int fd) { return close(fd); }\ninline const char* StrError(int errnum) { return strerror(errnum); }\n#endif\ninline const char* GetEnv(const char* name) {\n#if GTEST_OS_WINDOWS_MOBILE\n  // We are on Windows CE, which has no environment variables.\n  return NULL;\n#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)\n  // Environment variables which we programmatically clear will be set to the\n  // empty string rather than unset (NULL).  Handle that case.\n  const char* const env = getenv(name);\n  return (env != NULL && env[0] != '\\0') ? env : NULL;\n#else\n  return getenv(name);\n#endif\n}\n\n#ifdef _MSC_VER\n#pragma warning(pop)  // Restores the warning state.\n#endif\n\n#if GTEST_OS_WINDOWS_MOBILE\n// Windows CE has no C library. The abort() function is used in\n// several places in Google Test. This implementation provides a reasonable\n// imitation of standard behaviour.\nvoid Abort();\n#else\ninline void Abort() { abort(); }\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n}  // namespace posix\n\n// The maximum number a BiggestInt can represent.  This definition\n// works no matter BiggestInt is represented in one's complement or\n// two's complement.\n//\n// We cannot rely on numeric_limits in STL, as __int64 and long long\n// are not part of standard C++ and numeric_limits doesn't need to be\n// defined for them.\nconst BiggestInt kMaxBiggestInt =\n    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));\n\n// This template class serves as a compile-time function from size to\n// type.  It maps a size in bytes to a primitive type with that\n// size. e.g.\n//\n//   TypeWithSize<4>::UInt\n//\n// is typedef-ed to be unsigned int (unsigned integer made up of 4\n// bytes).\n//\n// Such functionality should belong to STL, but I cannot find it\n// there.\n//\n// Google Test uses this class in the implementation of floating-point\n// comparison.\n//\n// For now it only handles UInt (unsigned int) as that's all Google Test\n// needs.  Other types can be easily added in the future if need\n// arises.\ntemplate <size_t size>\nclass TypeWithSize {\n public:\n  // This prevents the user from using TypeWithSize<N> with incorrect\n  // values of N.\n  typedef void UInt;\n};\n\n// The specialization for size 4.\ntemplate <>\nclass TypeWithSize<4> {\n public:\n  // unsigned int has size 4 in both gcc and MSVC.\n  //\n  // As base/basictypes.h doesn't compile on Windows, we cannot use\n  // uint32, uint64, and etc here.\n  typedef int Int;\n  typedef unsigned int UInt;\n};\n\n// The specialization for size 8.\ntemplate <>\nclass TypeWithSize<8> {\n public:\n#if GTEST_OS_WINDOWS\n  typedef __int64 Int;\n  typedef unsigned __int64 UInt;\n#else\n  typedef long long Int;  // NOLINT\n  typedef unsigned long long UInt;  // NOLINT\n#endif  // GTEST_OS_WINDOWS\n};\n\n// Integer types of known sizes.\ntypedef TypeWithSize<4>::Int Int32;\ntypedef TypeWithSize<4>::UInt UInt32;\ntypedef TypeWithSize<8>::Int Int64;\ntypedef TypeWithSize<8>::UInt UInt64;\ntypedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.\n\n// Utilities for command line flags and environment variables.\n\n// Macro for referencing flags.\n#define GTEST_FLAG(name) FLAGS_gtest_##name\n\n// Macros for declaring flags.\n#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)\n#define GTEST_DECLARE_int32_(name) \\\n    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)\n#define GTEST_DECLARE_string_(name) \\\n    GTEST_API_ extern ::testing::internal::String GTEST_FLAG(name)\n\n// Macros for defining flags.\n#define GTEST_DEFINE_bool_(name, default_val, doc) \\\n    GTEST_API_ bool GTEST_FLAG(name) = (default_val)\n#define GTEST_DEFINE_int32_(name, default_val, doc) \\\n    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)\n#define GTEST_DEFINE_string_(name, default_val, doc) \\\n    GTEST_API_ ::testing::internal::String GTEST_FLAG(name) = (default_val)\n\n// Parses 'str' for a 32-bit signed integer.  If successful, writes the result\n// to *value and returns true; otherwise leaves *value unchanged and returns\n// false.\n// TODO(chandlerc): Find a better way to refactor flag and environment parsing\n// out of both gtest-port.cc and gtest.cc to avoid exporting this utility\n// function.\nbool ParseInt32(const Message& src_text, const char* str, Int32* value);\n\n// Parses a bool/Int32/string from the environment variable\n// corresponding to the given Google Test flag.\nbool BoolFromGTestEnv(const char* flag, bool default_val);\nGTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);\nconst char* StringFromGTestEnv(const char* flag, const char* default_val);\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-string.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This header file declares the String class and functions used internally by\n// Google Test.  They are subject to change without notice. They should not used\n// by code external to Google Test.\n//\n// This header file is #included by <gtest/internal/gtest-internal.h>.\n// It should not be #included by other files.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_\n\n#ifdef __BORLANDC__\n// string.h is not guaranteed to provide strcpy on C++ Builder.\n#include <mem.h>\n#endif\n\n#include <string.h>\n#include <gtest/internal/gtest-port.h>\n\n#include <string>\n\nnamespace testing {\nnamespace internal {\n\n// String - a UTF-8 string class.\n//\n// For historic reasons, we don't use std::string.\n//\n// TODO(wan@google.com): replace this class with std::string or\n// implement it in terms of the latter.\n//\n// Note that String can represent both NULL and the empty string,\n// while std::string cannot represent NULL.\n//\n// NULL and the empty string are considered different.  NULL is less\n// than anything (including the empty string) except itself.\n//\n// This class only provides minimum functionality necessary for\n// implementing Google Test.  We do not intend to implement a full-fledged\n// string class here.\n//\n// Since the purpose of this class is to provide a substitute for\n// std::string on platforms where it cannot be used, we define a copy\n// constructor and assignment operators such that we don't need\n// conditional compilation in a lot of places.\n//\n// In order to make the representation efficient, the d'tor of String\n// is not virtual.  Therefore DO NOT INHERIT FROM String.\nclass GTEST_API_ String {\n public:\n  // Static utility methods\n\n  // Returns the input enclosed in double quotes if it's not NULL;\n  // otherwise returns \"(null)\".  For example, \"\\\"Hello\\\"\" is returned\n  // for input \"Hello\".\n  //\n  // This is useful for printing a C string in the syntax of a literal.\n  //\n  // Known issue: escape sequences are not handled yet.\n  static String ShowCStringQuoted(const char* c_str);\n\n  // Clones a 0-terminated C string, allocating memory using new.  The\n  // caller is responsible for deleting the return value using\n  // delete[].  Returns the cloned string, or NULL if the input is\n  // NULL.\n  //\n  // This is different from strdup() in string.h, which allocates\n  // memory using malloc().\n  static const char* CloneCString(const char* c_str);\n\n#if GTEST_OS_WINDOWS_MOBILE\n  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be\n  // able to pass strings to Win32 APIs on CE we need to convert them\n  // to 'Unicode', UTF-16.\n\n  // Creates a UTF-16 wide string from the given ANSI string, allocating\n  // memory using new. The caller is responsible for deleting the return\n  // value using delete[]. Returns the wide string, or NULL if the\n  // input is NULL.\n  //\n  // The wide string is created using the ANSI codepage (CP_ACP) to\n  // match the behaviour of the ANSI versions of Win32 calls and the\n  // C runtime.\n  static LPCWSTR AnsiToUtf16(const char* c_str);\n\n  // Creates an ANSI string from the given wide string, allocating\n  // memory using new. The caller is responsible for deleting the return\n  // value using delete[]. Returns the ANSI string, or NULL if the\n  // input is NULL.\n  //\n  // The returned string is created using the ANSI codepage (CP_ACP) to\n  // match the behaviour of the ANSI versions of Win32 calls and the\n  // C runtime.\n  static const char* Utf16ToAnsi(LPCWSTR utf16_str);\n#endif\n\n  // Compares two C strings.  Returns true iff they have the same content.\n  //\n  // Unlike strcmp(), this function can handle NULL argument(s).  A\n  // NULL C string is considered different to any non-NULL C string,\n  // including the empty string.\n  static bool CStringEquals(const char* lhs, const char* rhs);\n\n  // Converts a wide C string to a String using the UTF-8 encoding.\n  // NULL will be converted to \"(null)\".  If an error occurred during\n  // the conversion, \"(failed to convert from wide string)\" is\n  // returned.\n  static String ShowWideCString(const wchar_t* wide_c_str);\n\n  // Similar to ShowWideCString(), except that this function encloses\n  // the converted string in double quotes.\n  static String ShowWideCStringQuoted(const wchar_t* wide_c_str);\n\n  // Compares two wide C strings.  Returns true iff they have the same\n  // content.\n  //\n  // Unlike wcscmp(), this function can handle NULL argument(s).  A\n  // NULL C string is considered different to any non-NULL C string,\n  // including the empty string.\n  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);\n\n  // Compares two C strings, ignoring case.  Returns true iff they\n  // have the same content.\n  //\n  // Unlike strcasecmp(), this function can handle NULL argument(s).\n  // A NULL C string is considered different to any non-NULL C string,\n  // including the empty string.\n  static bool CaseInsensitiveCStringEquals(const char* lhs,\n                                           const char* rhs);\n\n  // Compares two wide C strings, ignoring case.  Returns true iff they\n  // have the same content.\n  //\n  // Unlike wcscasecmp(), this function can handle NULL argument(s).\n  // A NULL C string is considered different to any non-NULL wide C string,\n  // including the empty string.\n  // NB: The implementations on different platforms slightly differ.\n  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE\n  // environment variable. On GNU platform this method uses wcscasecmp\n  // which compares according to LC_CTYPE category of the current locale.\n  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the\n  // current locale.\n  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,\n                                               const wchar_t* rhs);\n\n  // Formats a list of arguments to a String, using the same format\n  // spec string as for printf.\n  //\n  // We do not use the StringPrintf class as it is not universally\n  // available.\n  //\n  // The result is limited to 4096 characters (including the tailing\n  // 0).  If 4096 characters are not enough to format the input,\n  // \"<buffer exceeded>\" is returned.\n  static String Format(const char* format, ...);\n\n  // C'tors\n\n  // The default c'tor constructs a NULL string.\n  String() : c_str_(NULL), length_(0) {}\n\n  // Constructs a String by cloning a 0-terminated C string.\n  String(const char* a_c_str) {  // NOLINT\n    if (a_c_str == NULL) {\n      c_str_ = NULL;\n      length_ = 0;\n    } else {\n      ConstructNonNull(a_c_str, strlen(a_c_str));\n    }\n  }\n\n  // Constructs a String by copying a given number of chars from a\n  // buffer.  E.g. String(\"hello\", 3) creates the string \"hel\",\n  // String(\"a\\0bcd\", 4) creates \"a\\0bc\", String(NULL, 0) creates \"\",\n  // and String(NULL, 1) results in access violation.\n  String(const char* buffer, size_t a_length) {\n    ConstructNonNull(buffer, a_length);\n  }\n\n  // The copy c'tor creates a new copy of the string.  The two\n  // String objects do not share content.\n  String(const String& str) : c_str_(NULL), length_(0) { *this = str; }\n\n  // D'tor.  String is intended to be a final class, so the d'tor\n  // doesn't need to be virtual.\n  ~String() { delete[] c_str_; }\n\n  // Allows a String to be implicitly converted to an ::std::string or\n  // ::string, and vice versa.  Converting a String containing a NULL\n  // pointer to ::std::string or ::string is undefined behavior.\n  // Converting a ::std::string or ::string containing an embedded NUL\n  // character to a String will result in the prefix up to the first\n  // NUL character.\n  String(const ::std::string& str) {\n    ConstructNonNull(str.c_str(), str.length());\n  }\n\n  operator ::std::string() const { return ::std::string(c_str(), length()); }\n\n#if GTEST_HAS_GLOBAL_STRING\n  String(const ::string& str) {\n    ConstructNonNull(str.c_str(), str.length());\n  }\n\n  operator ::string() const { return ::string(c_str(), length()); }\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n  // Returns true iff this is an empty string (i.e. \"\").\n  bool empty() const { return (c_str() != NULL) && (length() == 0); }\n\n  // Compares this with another String.\n  // Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0\n  // if this is greater than rhs.\n  int Compare(const String& rhs) const;\n\n  // Returns true iff this String equals the given C string.  A NULL\n  // string and a non-NULL string are considered not equal.\n  bool operator==(const char* a_c_str) const { return Compare(a_c_str) == 0; }\n\n  // Returns true iff this String is less than the given String.  A\n  // NULL string is considered less than \"\".\n  bool operator<(const String& rhs) const { return Compare(rhs) < 0; }\n\n  // Returns true iff this String doesn't equal the given C string.  A NULL\n  // string and a non-NULL string are considered not equal.\n  bool operator!=(const char* a_c_str) const { return !(*this == a_c_str); }\n\n  // Returns true iff this String ends with the given suffix.  *Any*\n  // String is considered to end with a NULL or empty suffix.\n  bool EndsWith(const char* suffix) const;\n\n  // Returns true iff this String ends with the given suffix, not considering\n  // case. Any String is considered to end with a NULL or empty suffix.\n  bool EndsWithCaseInsensitive(const char* suffix) const;\n\n  // Returns the length of the encapsulated string, or 0 if the\n  // string is NULL.\n  size_t length() const { return length_; }\n\n  // Gets the 0-terminated C string this String object represents.\n  // The String object still owns the string.  Therefore the caller\n  // should NOT delete the return value.\n  const char* c_str() const { return c_str_; }\n\n  // Assigns a C string to this object.  Self-assignment works.\n  const String& operator=(const char* a_c_str) {\n    return *this = String(a_c_str);\n  }\n\n  // Assigns a String object to this object.  Self-assignment works.\n  const String& operator=(const String& rhs) {\n    if (this != &rhs) {\n      delete[] c_str_;\n      if (rhs.c_str() == NULL) {\n        c_str_ = NULL;\n        length_ = 0;\n      } else {\n        ConstructNonNull(rhs.c_str(), rhs.length());\n      }\n    }\n\n    return *this;\n  }\n\n private:\n  // Constructs a non-NULL String from the given content.  This\n  // function can only be called when data_ has not been allocated.\n  // ConstructNonNull(NULL, 0) results in an empty string (\"\").\n  // ConstructNonNull(NULL, non_zero) is undefined behavior.\n  void ConstructNonNull(const char* buffer, size_t a_length) {\n    char* const str = new char[a_length + 1];\n    memcpy(str, buffer, a_length);\n    str[a_length] = '\\0';\n    c_str_ = str;\n    length_ = a_length;\n  }\n\n  const char* c_str_;\n  size_t length_;\n};  // class String\n\n// Streams a String to an ostream.  Each '\\0' character in the String\n// is replaced with \"\\\\0\".\ninline ::std::ostream& operator<<(::std::ostream& os, const String& str) {\n  if (str.c_str() == NULL) {\n    os << \"(null)\";\n  } else {\n    const char* const c_str = str.c_str();\n    for (size_t i = 0; i != str.length(); i++) {\n      if (c_str[i] == '\\0') {\n        os << \"\\\\0\";\n      } else {\n        os << c_str[i];\n      }\n    }\n  }\n  return os;\n}\n\n// Gets the content of the StrStream's buffer as a String.  Each '\\0'\n// character in the buffer is replaced with \"\\\\0\".\nGTEST_API_ String StrStreamToString(StrStream* stream);\n\n// Converts a streamable value to a String.  A NULL pointer is\n// converted to \"(null)\".  When the input value is a ::string,\n// ::std::string, ::wstring, or ::std::wstring object, each NUL\n// character in it is replaced with \"\\\\0\".\n\n// Declared here but defined in gtest.h, so that it has access\n// to the definition of the Message class, required by the ARM\n// compiler.\ntemplate <typename T>\nString StreamableToString(const T& streamable);\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h",
    "content": "// This file was GENERATED by a script.  DO NOT EDIT BY HAND!!!\n\n// Copyright 2009 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Implements a subset of TR1 tuple needed by Google Test and Google Mock.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n\n#include <utility>  // For ::std::pair.\n\n// The compiler used in Symbian has a bug that prevents us from declaring the\n// tuple template as a friend (it complains that tuple is redefined).  This\n// hack bypasses the bug by declaring the members that should otherwise be\n// private as public.\n// Sun Studio versions < 12 also have the above bug.\n#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)\n#define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:\n#else\n#define GTEST_DECLARE_TUPLE_AS_FRIEND_ \\\n    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \\\n   private:\n#endif\n\n// GTEST_n_TUPLE_(T) is the type of an n-tuple.\n#define GTEST_0_TUPLE_(T) tuple<>\n#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \\\n    void, void, void>\n#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \\\n    void, void, void>\n#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \\\n    void, void, void>\n#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \\\n    void, void, void>\n#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \\\n    void, void, void>\n#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \\\n    void, void, void>\n#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \\\n    void, void, void>\n#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \\\n    T##7, void, void>\n#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \\\n    T##7, T##8, void>\n#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \\\n    T##7, T##8, T##9>\n\n// GTEST_n_TYPENAMES_(T) declares a list of n typenames.\n#define GTEST_0_TYPENAMES_(T)\n#define GTEST_1_TYPENAMES_(T) typename T##0\n#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1\n#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2\n#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3\n#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4\n#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5\n#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5, typename T##6\n#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7\n#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5, typename T##6, \\\n    typename T##7, typename T##8\n#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \\\n    typename T##3, typename T##4, typename T##5, typename T##6, \\\n    typename T##7, typename T##8, typename T##9\n\n// In theory, defining stuff in the ::std namespace is undefined\n// behavior.  We can do this as we are playing the role of a standard\n// library vendor.\nnamespace std {\nnamespace tr1 {\n\ntemplate <typename T0 = void, typename T1 = void, typename T2 = void,\n    typename T3 = void, typename T4 = void, typename T5 = void,\n    typename T6 = void, typename T7 = void, typename T8 = void,\n    typename T9 = void>\nclass tuple;\n\n// Anything in namespace gtest_internal is Google Test's INTERNAL\n// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.\nnamespace gtest_internal {\n\n// ByRef<T>::type is T if T is a reference; otherwise it's const T&.\ntemplate <typename T>\nstruct ByRef { typedef const T& type; };  // NOLINT\ntemplate <typename T>\nstruct ByRef<T&> { typedef T& type; };  // NOLINT\n\n// A handy wrapper for ByRef.\n#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type\n\n// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This\n// is the same as tr1::add_reference<T>::type.\ntemplate <typename T>\nstruct AddRef { typedef T& type; };  // NOLINT\ntemplate <typename T>\nstruct AddRef<T&> { typedef T& type; };  // NOLINT\n\n// A handy wrapper for AddRef.\n#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type\n\n// A helper for implementing get<k>().\ntemplate <int k> class Get;\n\n// A helper for implementing tuple_element<k, T>.  kIndexValid is true\n// iff k < the number of fields in tuple type T.\ntemplate <bool kIndexValid, int kIndex, class Tuple>\nstruct TupleElement;\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 0, GTEST_10_TUPLE_(T)> { typedef T0 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 1, GTEST_10_TUPLE_(T)> { typedef T1 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 2, GTEST_10_TUPLE_(T)> { typedef T2 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 3, GTEST_10_TUPLE_(T)> { typedef T3 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 4, GTEST_10_TUPLE_(T)> { typedef T4 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 5, GTEST_10_TUPLE_(T)> { typedef T5 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 6, GTEST_10_TUPLE_(T)> { typedef T6 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 7, GTEST_10_TUPLE_(T)> { typedef T7 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 8, GTEST_10_TUPLE_(T)> { typedef T8 type; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct TupleElement<true, 9, GTEST_10_TUPLE_(T)> { typedef T9 type; };\n\n}  // namespace gtest_internal\n\ntemplate <>\nclass tuple<> {\n public:\n  tuple() {}\n  tuple(const tuple& /* t */)  {}\n  tuple& operator=(const tuple& /* t */) { return *this; }\n};\n\ntemplate <GTEST_1_TYPENAMES_(T)>\nclass GTEST_1_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}\n\n  tuple(const tuple& t) : f0_(t.f0_) {}\n\n  template <GTEST_1_TYPENAMES_(U)>\n  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_1_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_1_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    return *this;\n  }\n\n  T0 f0_;\n};\n\ntemplate <GTEST_2_TYPENAMES_(T)>\nclass GTEST_2_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),\n      f1_(f1) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}\n\n  template <GTEST_2_TYPENAMES_(U)>\n  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}\n  template <typename U0, typename U1>\n  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_2_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n  template <typename U0, typename U1>\n  tuple& operator=(const ::std::pair<U0, U1>& p) {\n    f0_ = p.first;\n    f1_ = p.second;\n    return *this;\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_2_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n};\n\ntemplate <GTEST_3_TYPENAMES_(T)>\nclass GTEST_3_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}\n\n  template <GTEST_3_TYPENAMES_(U)>\n  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_3_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_3_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n};\n\ntemplate <GTEST_4_TYPENAMES_(T)>\nclass GTEST_4_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),\n      f3_(f3) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}\n\n  template <GTEST_4_TYPENAMES_(U)>\n  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_4_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_4_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n};\n\ntemplate <GTEST_5_TYPENAMES_(T)>\nclass GTEST_5_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,\n      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_) {}\n\n  template <GTEST_5_TYPENAMES_(U)>\n  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_5_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_5_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n};\n\ntemplate <GTEST_6_TYPENAMES_(T)>\nclass GTEST_6_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),\n      f5_(f5) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_) {}\n\n  template <GTEST_6_TYPENAMES_(U)>\n  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_6_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_6_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n};\n\ntemplate <GTEST_7_TYPENAMES_(T)>\nclass GTEST_7_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),\n      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}\n\n  template <GTEST_7_TYPENAMES_(U)>\n  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_7_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_7_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    f6_ = t.f6_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n  T6 f6_;\n};\n\ntemplate <GTEST_8_TYPENAMES_(T)>\nclass GTEST_8_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,\n      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),\n      f5_(f5), f6_(f6), f7_(f7) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}\n\n  template <GTEST_8_TYPENAMES_(U)>\n  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_8_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_8_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    f6_ = t.f6_;\n    f7_ = t.f7_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n  T6 f6_;\n  T7 f7_;\n};\n\ntemplate <GTEST_9_TYPENAMES_(T)>\nclass GTEST_9_TUPLE_(T) {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,\n      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),\n      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}\n\n  template <GTEST_9_TYPENAMES_(U)>\n  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_9_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_9_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    f6_ = t.f6_;\n    f7_ = t.f7_;\n    f8_ = t.f8_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n  T6 f6_;\n  T7 f7_;\n  T8 f8_;\n};\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nclass tuple {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),\n      f9_() {}\n\n  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,\n      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,\n      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,\n      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),\n      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}\n\n  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),\n      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}\n\n  template <GTEST_10_TYPENAMES_(U)>\n  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),\n      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),\n      f9_(t.f9_) {}\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_10_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_10_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {\n    f0_ = t.f0_;\n    f1_ = t.f1_;\n    f2_ = t.f2_;\n    f3_ = t.f3_;\n    f4_ = t.f4_;\n    f5_ = t.f5_;\n    f6_ = t.f6_;\n    f7_ = t.f7_;\n    f8_ = t.f8_;\n    f9_ = t.f9_;\n    return *this;\n  }\n\n  T0 f0_;\n  T1 f1_;\n  T2 f2_;\n  T3 f3_;\n  T4 f4_;\n  T5 f5_;\n  T6 f6_;\n  T7 f7_;\n  T8 f8_;\n  T9 f9_;\n};\n\n// 6.1.3.2 Tuple creation functions.\n\n// Known limitations: we don't support passing an\n// std::tr1::reference_wrapper<T> to make_tuple().  And we don't\n// implement tie().\n\ninline tuple<> make_tuple() { return tuple<>(); }\n\ntemplate <GTEST_1_TYPENAMES_(T)>\ninline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {\n  return GTEST_1_TUPLE_(T)(f0);\n}\n\ntemplate <GTEST_2_TYPENAMES_(T)>\ninline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {\n  return GTEST_2_TUPLE_(T)(f0, f1);\n}\n\ntemplate <GTEST_3_TYPENAMES_(T)>\ninline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {\n  return GTEST_3_TUPLE_(T)(f0, f1, f2);\n}\n\ntemplate <GTEST_4_TYPENAMES_(T)>\ninline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3) {\n  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);\n}\n\ntemplate <GTEST_5_TYPENAMES_(T)>\ninline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4) {\n  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);\n}\n\ntemplate <GTEST_6_TYPENAMES_(T)>\ninline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5) {\n  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);\n}\n\ntemplate <GTEST_7_TYPENAMES_(T)>\ninline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {\n  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);\n}\n\ntemplate <GTEST_8_TYPENAMES_(T)>\ninline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {\n  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);\n}\n\ntemplate <GTEST_9_TYPENAMES_(T)>\ninline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,\n    const T8& f8) {\n  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);\n}\n\ntemplate <GTEST_10_TYPENAMES_(T)>\ninline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,\n    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,\n    const T8& f8, const T9& f9) {\n  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);\n}\n\n// 6.1.3.3 Tuple helper classes.\n\ntemplate <typename Tuple> struct tuple_size;\n\ntemplate <GTEST_0_TYPENAMES_(T)>\nstruct tuple_size<GTEST_0_TUPLE_(T)> { static const int value = 0; };\n\ntemplate <GTEST_1_TYPENAMES_(T)>\nstruct tuple_size<GTEST_1_TUPLE_(T)> { static const int value = 1; };\n\ntemplate <GTEST_2_TYPENAMES_(T)>\nstruct tuple_size<GTEST_2_TUPLE_(T)> { static const int value = 2; };\n\ntemplate <GTEST_3_TYPENAMES_(T)>\nstruct tuple_size<GTEST_3_TUPLE_(T)> { static const int value = 3; };\n\ntemplate <GTEST_4_TYPENAMES_(T)>\nstruct tuple_size<GTEST_4_TUPLE_(T)> { static const int value = 4; };\n\ntemplate <GTEST_5_TYPENAMES_(T)>\nstruct tuple_size<GTEST_5_TUPLE_(T)> { static const int value = 5; };\n\ntemplate <GTEST_6_TYPENAMES_(T)>\nstruct tuple_size<GTEST_6_TUPLE_(T)> { static const int value = 6; };\n\ntemplate <GTEST_7_TYPENAMES_(T)>\nstruct tuple_size<GTEST_7_TUPLE_(T)> { static const int value = 7; };\n\ntemplate <GTEST_8_TYPENAMES_(T)>\nstruct tuple_size<GTEST_8_TUPLE_(T)> { static const int value = 8; };\n\ntemplate <GTEST_9_TYPENAMES_(T)>\nstruct tuple_size<GTEST_9_TUPLE_(T)> { static const int value = 9; };\n\ntemplate <GTEST_10_TYPENAMES_(T)>\nstruct tuple_size<GTEST_10_TUPLE_(T)> { static const int value = 10; };\n\ntemplate <int k, class Tuple>\nstruct tuple_element {\n  typedef typename gtest_internal::TupleElement<\n      k < (tuple_size<Tuple>::value), k, Tuple>::type type;\n};\n\n#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type\n\n// 6.1.3.4 Element access.\n\nnamespace gtest_internal {\n\ntemplate <>\nclass Get<0> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))\n  Field(Tuple& t) { return t.f0_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))\n  ConstField(const Tuple& t) { return t.f0_; }\n};\n\ntemplate <>\nclass Get<1> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))\n  Field(Tuple& t) { return t.f1_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))\n  ConstField(const Tuple& t) { return t.f1_; }\n};\n\ntemplate <>\nclass Get<2> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))\n  Field(Tuple& t) { return t.f2_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))\n  ConstField(const Tuple& t) { return t.f2_; }\n};\n\ntemplate <>\nclass Get<3> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))\n  Field(Tuple& t) { return t.f3_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))\n  ConstField(const Tuple& t) { return t.f3_; }\n};\n\ntemplate <>\nclass Get<4> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))\n  Field(Tuple& t) { return t.f4_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))\n  ConstField(const Tuple& t) { return t.f4_; }\n};\n\ntemplate <>\nclass Get<5> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))\n  Field(Tuple& t) { return t.f5_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))\n  ConstField(const Tuple& t) { return t.f5_; }\n};\n\ntemplate <>\nclass Get<6> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))\n  Field(Tuple& t) { return t.f6_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))\n  ConstField(const Tuple& t) { return t.f6_; }\n};\n\ntemplate <>\nclass Get<7> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))\n  Field(Tuple& t) { return t.f7_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))\n  ConstField(const Tuple& t) { return t.f7_; }\n};\n\ntemplate <>\nclass Get<8> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))\n  Field(Tuple& t) { return t.f8_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))\n  ConstField(const Tuple& t) { return t.f8_; }\n};\n\ntemplate <>\nclass Get<9> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))\n  Field(Tuple& t) { return t.f9_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))\n  ConstField(const Tuple& t) { return t.f9_; }\n};\n\n}  // namespace gtest_internal\n\ntemplate <int k, GTEST_10_TYPENAMES_(T)>\nGTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))\nget(GTEST_10_TUPLE_(T)& t) {\n  return gtest_internal::Get<k>::Field(t);\n}\n\ntemplate <int k, GTEST_10_TYPENAMES_(T)>\nGTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))\nget(const GTEST_10_TUPLE_(T)& t) {\n  return gtest_internal::Get<k>::ConstField(t);\n}\n\n// 6.1.3.5 Relational operators\n\n// We only implement == and !=, as we don't have a need for the rest yet.\n\nnamespace gtest_internal {\n\n// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the\n// first k fields of t1 equals the first k fields of t2.\n// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if\n// k1 != k2.\ntemplate <int kSize1, int kSize2>\nstruct SameSizeTuplePrefixComparator;\n\ntemplate <>\nstruct SameSizeTuplePrefixComparator<0, 0> {\n  template <class Tuple1, class Tuple2>\n  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {\n    return true;\n  }\n};\n\ntemplate <int k>\nstruct SameSizeTuplePrefixComparator<k, k> {\n  template <class Tuple1, class Tuple2>\n  static bool Eq(const Tuple1& t1, const Tuple2& t2) {\n    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&\n        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);\n  }\n};\n\n}  // namespace gtest_internal\n\ntemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>\ninline bool operator==(const GTEST_10_TUPLE_(T)& t,\n                       const GTEST_10_TUPLE_(U)& u) {\n  return gtest_internal::SameSizeTuplePrefixComparator<\n      tuple_size<GTEST_10_TUPLE_(T)>::value,\n      tuple_size<GTEST_10_TUPLE_(U)>::value>::Eq(t, u);\n}\n\ntemplate <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>\ninline bool operator!=(const GTEST_10_TUPLE_(T)& t,\n                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }\n\n// 6.1.4 Pairs.\n// Unimplemented.\n\n}  // namespace tr1\n}  // namespace std\n\n#undef GTEST_0_TUPLE_\n#undef GTEST_1_TUPLE_\n#undef GTEST_2_TUPLE_\n#undef GTEST_3_TUPLE_\n#undef GTEST_4_TUPLE_\n#undef GTEST_5_TUPLE_\n#undef GTEST_6_TUPLE_\n#undef GTEST_7_TUPLE_\n#undef GTEST_8_TUPLE_\n#undef GTEST_9_TUPLE_\n#undef GTEST_10_TUPLE_\n\n#undef GTEST_0_TYPENAMES_\n#undef GTEST_1_TYPENAMES_\n#undef GTEST_2_TYPENAMES_\n#undef GTEST_3_TYPENAMES_\n#undef GTEST_4_TYPENAMES_\n#undef GTEST_5_TYPENAMES_\n#undef GTEST_6_TYPENAMES_\n#undef GTEST_7_TYPENAMES_\n#undef GTEST_8_TYPENAMES_\n#undef GTEST_9_TYPENAMES_\n#undef GTEST_10_TYPENAMES_\n\n#undef GTEST_DECLARE_TUPLE_AS_FRIEND_\n#undef GTEST_BY_REF_\n#undef GTEST_ADD_REF_\n#undef GTEST_TUPLE_ELEMENT_\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$var n = 10  $$ Maximum number of tuple fields we want to support.\n$$ This meta comment fixes auto-indentation in Emacs. }}\n// Copyright 2009 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Implements a subset of TR1 tuple needed by Google Test and Google Mock.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n\n#include <utility>  // For ::std::pair.\n\n// The compiler used in Symbian has a bug that prevents us from declaring the\n// tuple template as a friend (it complains that tuple is redefined).  This\n// hack bypasses the bug by declaring the members that should otherwise be\n// private as public.\n// Sun Studio versions < 12 also have the above bug.\n#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)\n#define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:\n#else\n#define GTEST_DECLARE_TUPLE_AS_FRIEND_ \\\n    template <GTEST_$(n)_TYPENAMES_(U)> friend class tuple; \\\n   private:\n#endif\n\n\n$range i 0..n-1\n$range j 0..n\n$range k 1..n\n// GTEST_n_TUPLE_(T) is the type of an n-tuple.\n#define GTEST_0_TUPLE_(T) tuple<>\n\n$for k [[\n$range m 0..k-1\n$range m2 k..n-1\n#define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]>\n\n]]\n\n// GTEST_n_TYPENAMES_(T) declares a list of n typenames.\n\n$for j [[\n$range m 0..j-1\n#define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]]\n\n\n]]\n\n// In theory, defining stuff in the ::std namespace is undefined\n// behavior.  We can do this as we are playing the role of a standard\n// library vendor.\nnamespace std {\nnamespace tr1 {\n\ntemplate <$for i, [[typename T$i = void]]>\nclass tuple;\n\n// Anything in namespace gtest_internal is Google Test's INTERNAL\n// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.\nnamespace gtest_internal {\n\n// ByRef<T>::type is T if T is a reference; otherwise it's const T&.\ntemplate <typename T>\nstruct ByRef { typedef const T& type; };  // NOLINT\ntemplate <typename T>\nstruct ByRef<T&> { typedef T& type; };  // NOLINT\n\n// A handy wrapper for ByRef.\n#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type\n\n// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This\n// is the same as tr1::add_reference<T>::type.\ntemplate <typename T>\nstruct AddRef { typedef T& type; };  // NOLINT\ntemplate <typename T>\nstruct AddRef<T&> { typedef T& type; };  // NOLINT\n\n// A handy wrapper for AddRef.\n#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type\n\n// A helper for implementing get<k>().\ntemplate <int k> class Get;\n\n// A helper for implementing tuple_element<k, T>.  kIndexValid is true\n// iff k < the number of fields in tuple type T.\ntemplate <bool kIndexValid, int kIndex, class Tuple>\nstruct TupleElement;\n\n\n$for i [[\ntemplate <GTEST_$(n)_TYPENAMES_(T)>\nstruct TupleElement<true, $i, GTEST_$(n)_TUPLE_(T)> [[]]\n{ typedef T$i type; };\n\n\n]]\n}  // namespace gtest_internal\n\ntemplate <>\nclass tuple<> {\n public:\n  tuple() {}\n  tuple(const tuple& /* t */)  {}\n  tuple& operator=(const tuple& /* t */) { return *this; }\n};\n\n\n$for k [[\n$range m 0..k-1\ntemplate <GTEST_$(k)_TYPENAMES_(T)>\nclass $if k < n [[GTEST_$(k)_TUPLE_(T)]] $else [[tuple]] {\n public:\n  template <int k> friend class gtest_internal::Get;\n\n  tuple() : $for m, [[f$(m)_()]] {}\n\n  explicit tuple($for m, [[GTEST_BY_REF_(T$m) f$m]]) : [[]]\n$for m, [[f$(m)_(f$m)]] {}\n\n  tuple(const tuple& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}\n\n  template <GTEST_$(k)_TYPENAMES_(U)>\n  tuple(const GTEST_$(k)_TUPLE_(U)& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}\n\n$if k == 2 [[\n  template <typename U0, typename U1>\n  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}\n\n]]\n\n  tuple& operator=(const tuple& t) { return CopyFrom(t); }\n\n  template <GTEST_$(k)_TYPENAMES_(U)>\n  tuple& operator=(const GTEST_$(k)_TUPLE_(U)& t) {\n    return CopyFrom(t);\n  }\n\n$if k == 2 [[\n  template <typename U0, typename U1>\n  tuple& operator=(const ::std::pair<U0, U1>& p) {\n    f0_ = p.first;\n    f1_ = p.second;\n    return *this;\n  }\n\n]]\n\n  GTEST_DECLARE_TUPLE_AS_FRIEND_\n\n  template <GTEST_$(k)_TYPENAMES_(U)>\n  tuple& CopyFrom(const GTEST_$(k)_TUPLE_(U)& t) {\n\n$for m [[\n    f$(m)_ = t.f$(m)_;\n\n]]\n    return *this;\n  }\n\n\n$for m [[\n  T$m f$(m)_;\n\n]]\n};\n\n\n]]\n// 6.1.3.2 Tuple creation functions.\n\n// Known limitations: we don't support passing an\n// std::tr1::reference_wrapper<T> to make_tuple().  And we don't\n// implement tie().\n\ninline tuple<> make_tuple() { return tuple<>(); }\n\n$for k [[\n$range m 0..k-1\n\ntemplate <GTEST_$(k)_TYPENAMES_(T)>\ninline GTEST_$(k)_TUPLE_(T) make_tuple($for m, [[const T$m& f$m]]) {\n  return GTEST_$(k)_TUPLE_(T)($for m, [[f$m]]);\n}\n\n]]\n\n// 6.1.3.3 Tuple helper classes.\n\ntemplate <typename Tuple> struct tuple_size;\n\n\n$for j [[\ntemplate <GTEST_$(j)_TYPENAMES_(T)>\nstruct tuple_size<GTEST_$(j)_TUPLE_(T)> { static const int value = $j; };\n\n\n]]\ntemplate <int k, class Tuple>\nstruct tuple_element {\n  typedef typename gtest_internal::TupleElement<\n      k < (tuple_size<Tuple>::value), k, Tuple>::type type;\n};\n\n#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type\n\n// 6.1.3.4 Element access.\n\nnamespace gtest_internal {\n\n\n$for i [[\ntemplate <>\nclass Get<$i> {\n public:\n  template <class Tuple>\n  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))\n  Field(Tuple& t) { return t.f$(i)_; }  // NOLINT\n\n  template <class Tuple>\n  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))\n  ConstField(const Tuple& t) { return t.f$(i)_; }\n};\n\n\n]]\n}  // namespace gtest_internal\n\ntemplate <int k, GTEST_$(n)_TYPENAMES_(T)>\nGTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T)))\nget(GTEST_$(n)_TUPLE_(T)& t) {\n  return gtest_internal::Get<k>::Field(t);\n}\n\ntemplate <int k, GTEST_$(n)_TYPENAMES_(T)>\nGTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_$(n)_TUPLE_(T)))\nget(const GTEST_$(n)_TUPLE_(T)& t) {\n  return gtest_internal::Get<k>::ConstField(t);\n}\n\n// 6.1.3.5 Relational operators\n\n// We only implement == and !=, as we don't have a need for the rest yet.\n\nnamespace gtest_internal {\n\n// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the\n// first k fields of t1 equals the first k fields of t2.\n// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if\n// k1 != k2.\ntemplate <int kSize1, int kSize2>\nstruct SameSizeTuplePrefixComparator;\n\ntemplate <>\nstruct SameSizeTuplePrefixComparator<0, 0> {\n  template <class Tuple1, class Tuple2>\n  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {\n    return true;\n  }\n};\n\ntemplate <int k>\nstruct SameSizeTuplePrefixComparator<k, k> {\n  template <class Tuple1, class Tuple2>\n  static bool Eq(const Tuple1& t1, const Tuple2& t2) {\n    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&\n        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);\n  }\n};\n\n}  // namespace gtest_internal\n\ntemplate <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>\ninline bool operator==(const GTEST_$(n)_TUPLE_(T)& t,\n                       const GTEST_$(n)_TUPLE_(U)& u) {\n  return gtest_internal::SameSizeTuplePrefixComparator<\n      tuple_size<GTEST_$(n)_TUPLE_(T)>::value,\n      tuple_size<GTEST_$(n)_TUPLE_(U)>::value>::Eq(t, u);\n}\n\ntemplate <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>\ninline bool operator!=(const GTEST_$(n)_TUPLE_(T)& t,\n                       const GTEST_$(n)_TUPLE_(U)& u) { return !(t == u); }\n\n// 6.1.4 Pairs.\n// Unimplemented.\n\n}  // namespace tr1\n}  // namespace std\n\n\n$for j [[\n#undef GTEST_$(j)_TUPLE_\n\n]]\n\n\n$for j [[\n#undef GTEST_$(j)_TYPENAMES_\n\n]]\n\n#undef GTEST_DECLARE_TUPLE_AS_FRIEND_\n#undef GTEST_BY_REF_\n#undef GTEST_ADD_REF_\n#undef GTEST_TUPLE_ELEMENT_\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h",
    "content": "// This file was GENERATED by command:\n//     pump.py gtest-type-util.h.pump\n// DO NOT EDIT BY HAND!!!\n\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Type utilities needed for implementing typed and type-parameterized\n// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n// Currently we support at most 50 types in a list, and at most 50\n// type-parameterized tests in one type-parameterized test case.\n// Please contact googletestframework@googlegroups.com if you need\n// more.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n\n#include <gtest/internal/gtest-port.h>\n#include <gtest/internal/gtest-string.h>\n\n#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using\n// libstdc++ (which is where cxxabi.h comes from).\n#ifdef __GLIBCXX__\n#include <cxxabi.h>\n#endif  // __GLIBCXX__\n\nnamespace testing {\nnamespace internal {\n\n// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same\n// type.  This can be used as a compile-time assertion to ensure that\n// two types are equal.\n\ntemplate <typename T1, typename T2>\nstruct AssertTypeEq;\n\ntemplate <typename T>\nstruct AssertTypeEq<T, T> {\n  typedef bool type;\n};\n\n// GetTypeName<T>() returns a human-readable name of type T.\ntemplate <typename T>\nString GetTypeName() {\n#if GTEST_HAS_RTTI\n\n  const char* const name = typeid(T).name();\n#ifdef __GLIBCXX__\n  int status = 0;\n  // gcc's implementation of typeid(T).name() mangles the type name,\n  // so we have to demangle it.\n  char* const readable_name = abi::__cxa_demangle(name, 0, 0, &status);\n  const String name_str(status == 0 ? readable_name : name);\n  free(readable_name);\n  return name_str;\n#else\n  return name;\n#endif  // __GLIBCXX__\n\n#else\n  return \"<type>\";\n#endif  // GTEST_HAS_RTTI\n}\n\n// A unique type used as the default value for the arguments of class\n// template Types.  This allows us to simulate variadic templates\n// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't\n// support directly.\nstruct None {};\n\n// The following family of struct and struct templates are used to\n// represent type lists.  In particular, TypesN<T1, T2, ..., TN>\n// represents a type list with N types (T1, T2, ..., and TN) in it.\n// Except for Types0, every struct in the family has two member types:\n// Head for the first type in the list, and Tail for the rest of the\n// list.\n\n// The empty type list.\nstruct Types0 {};\n\n// Type lists of length 1, 2, 3, and so on.\n\ntemplate <typename T1>\nstruct Types1 {\n  typedef T1 Head;\n  typedef Types0 Tail;\n};\ntemplate <typename T1, typename T2>\nstruct Types2 {\n  typedef T1 Head;\n  typedef Types1<T2> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3>\nstruct Types3 {\n  typedef T1 Head;\n  typedef Types2<T2, T3> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\nstruct Types4 {\n  typedef T1 Head;\n  typedef Types3<T2, T3, T4> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nstruct Types5 {\n  typedef T1 Head;\n  typedef Types4<T2, T3, T4, T5> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\nstruct Types6 {\n  typedef T1 Head;\n  typedef Types5<T2, T3, T4, T5, T6> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\nstruct Types7 {\n  typedef T1 Head;\n  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\nstruct Types8 {\n  typedef T1 Head;\n  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\nstruct Types9 {\n  typedef T1 Head;\n  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\nstruct Types10 {\n  typedef T1 Head;\n  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11>\nstruct Types11 {\n  typedef T1 Head;\n  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12>\nstruct Types12 {\n  typedef T1 Head;\n  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13>\nstruct Types13 {\n  typedef T1 Head;\n  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14>\nstruct Types14 {\n  typedef T1 Head;\n  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15>\nstruct Types15 {\n  typedef T1 Head;\n  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16>\nstruct Types16 {\n  typedef T1 Head;\n  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17>\nstruct Types17 {\n  typedef T1 Head;\n  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18>\nstruct Types18 {\n  typedef T1 Head;\n  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19>\nstruct Types19 {\n  typedef T1 Head;\n  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20>\nstruct Types20 {\n  typedef T1 Head;\n  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21>\nstruct Types21 {\n  typedef T1 Head;\n  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22>\nstruct Types22 {\n  typedef T1 Head;\n  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23>\nstruct Types23 {\n  typedef T1 Head;\n  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24>\nstruct Types24 {\n  typedef T1 Head;\n  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25>\nstruct Types25 {\n  typedef T1 Head;\n  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26>\nstruct Types26 {\n  typedef T1 Head;\n  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27>\nstruct Types27 {\n  typedef T1 Head;\n  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28>\nstruct Types28 {\n  typedef T1 Head;\n  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29>\nstruct Types29 {\n  typedef T1 Head;\n  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30>\nstruct Types30 {\n  typedef T1 Head;\n  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31>\nstruct Types31 {\n  typedef T1 Head;\n  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32>\nstruct Types32 {\n  typedef T1 Head;\n  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33>\nstruct Types33 {\n  typedef T1 Head;\n  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34>\nstruct Types34 {\n  typedef T1 Head;\n  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35>\nstruct Types35 {\n  typedef T1 Head;\n  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36>\nstruct Types36 {\n  typedef T1 Head;\n  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37>\nstruct Types37 {\n  typedef T1 Head;\n  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38>\nstruct Types38 {\n  typedef T1 Head;\n  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39>\nstruct Types39 {\n  typedef T1 Head;\n  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40>\nstruct Types40 {\n  typedef T1 Head;\n  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41>\nstruct Types41 {\n  typedef T1 Head;\n  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42>\nstruct Types42 {\n  typedef T1 Head;\n  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43>\nstruct Types43 {\n  typedef T1 Head;\n  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44>\nstruct Types44 {\n  typedef T1 Head;\n  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45>\nstruct Types45 {\n  typedef T1 Head;\n  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46>\nstruct Types46 {\n  typedef T1 Head;\n  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47>\nstruct Types47 {\n  typedef T1 Head;\n  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46, T47> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48>\nstruct Types48 {\n  typedef T1 Head;\n  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46, T47, T48> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49>\nstruct Types49 {\n  typedef T1 Head;\n  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46, T47, T48, T49> Tail;\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49, typename T50>\nstruct Types50 {\n  typedef T1 Head;\n  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n      T44, T45, T46, T47, T48, T49, T50> Tail;\n};\n\n\n}  // namespace internal\n\n// We don't want to require the users to write TypesN<...> directly,\n// as that would require them to count the length.  Types<...> is much\n// easier to write, but generates horrible messages when there is a\n// compiler error, as gcc insists on printing out each template\n// argument, even if it has the default value (this means Types<int>\n// will appear as Types<int, None, None, ..., None> in the compiler\n// errors).\n//\n// Our solution is to combine the best part of the two approaches: a\n// user would write Types<T1, ..., TN>, and Google Test will translate\n// that to TypesN<T1, ..., TN> internally to make error messages\n// readable.  The translation is done by the 'type' member of the\n// Types template.\ntemplate <typename T1 = internal::None, typename T2 = internal::None,\n    typename T3 = internal::None, typename T4 = internal::None,\n    typename T5 = internal::None, typename T6 = internal::None,\n    typename T7 = internal::None, typename T8 = internal::None,\n    typename T9 = internal::None, typename T10 = internal::None,\n    typename T11 = internal::None, typename T12 = internal::None,\n    typename T13 = internal::None, typename T14 = internal::None,\n    typename T15 = internal::None, typename T16 = internal::None,\n    typename T17 = internal::None, typename T18 = internal::None,\n    typename T19 = internal::None, typename T20 = internal::None,\n    typename T21 = internal::None, typename T22 = internal::None,\n    typename T23 = internal::None, typename T24 = internal::None,\n    typename T25 = internal::None, typename T26 = internal::None,\n    typename T27 = internal::None, typename T28 = internal::None,\n    typename T29 = internal::None, typename T30 = internal::None,\n    typename T31 = internal::None, typename T32 = internal::None,\n    typename T33 = internal::None, typename T34 = internal::None,\n    typename T35 = internal::None, typename T36 = internal::None,\n    typename T37 = internal::None, typename T38 = internal::None,\n    typename T39 = internal::None, typename T40 = internal::None,\n    typename T41 = internal::None, typename T42 = internal::None,\n    typename T43 = internal::None, typename T44 = internal::None,\n    typename T45 = internal::None, typename T46 = internal::None,\n    typename T47 = internal::None, typename T48 = internal::None,\n    typename T49 = internal::None, typename T50 = internal::None>\nstruct Types {\n  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;\n};\n\ntemplate <>\nstruct Types<internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types0 type;\n};\ntemplate <typename T1>\nstruct Types<T1, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types1<T1> type;\n};\ntemplate <typename T1, typename T2>\nstruct Types<T1, T2, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types2<T1, T2> type;\n};\ntemplate <typename T1, typename T2, typename T3>\nstruct Types<T1, T2, T3, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types3<T1, T2, T3> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4>\nstruct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types4<T1, T2, T3, T4> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nstruct Types<T1, T2, T3, T4, T5, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types5<T1, T2, T3, T4, T5> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6>\nstruct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,\n      T12> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,\n      T26> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,\n      T40> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None, internal::None> {\n  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None, internal::None> {\n  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    internal::None, internal::None, internal::None, internal::None,\n    internal::None> {\n  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    T46, internal::None, internal::None, internal::None, internal::None> {\n  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    T46, T47, internal::None, internal::None, internal::None> {\n  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    T46, T47, T48, internal::None, internal::None> {\n  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47, T48> type;\n};\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49>\nstruct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,\n    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,\n    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,\n    T46, T47, T48, T49, internal::None> {\n  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;\n};\n\nnamespace internal {\n\n#define GTEST_TEMPLATE_ template <typename T> class\n\n// The template \"selector\" struct TemplateSel<Tmpl> is used to\n// represent Tmpl, which must be a class template with one type\n// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined\n// as the type Tmpl<T>.  This allows us to actually instantiate the\n// template \"selected\" by TemplateSel<Tmpl>.\n//\n// This trick is necessary for simulating typedef for class templates,\n// which C++ doesn't support directly.\ntemplate <GTEST_TEMPLATE_ Tmpl>\nstruct TemplateSel {\n  template <typename T>\n  struct Bind {\n    typedef Tmpl<T> type;\n  };\n};\n\n#define GTEST_BIND_(TmplSel, T) \\\n  TmplSel::template Bind<T>::type\n\n// A unique struct template used as the default value for the\n// arguments of class template Templates.  This allows us to simulate\n// variadic templates (e.g. Templates<int>, Templates<int, double>,\n// and etc), which C++ doesn't support directly.\ntemplate <typename T>\nstruct NoneT {};\n\n// The following family of struct and struct templates are used to\n// represent template lists.  In particular, TemplatesN<T1, T2, ...,\n// TN> represents a list of N templates (T1, T2, ..., and TN).  Except\n// for Templates0, every struct in the family has two member types:\n// Head for the selector of the first template in the list, and Tail\n// for the rest of the list.\n\n// The empty template list.\nstruct Templates0 {};\n\n// Template lists of length 1, 2, 3, and so on.\n\ntemplate <GTEST_TEMPLATE_ T1>\nstruct Templates1 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates0 Tail;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>\nstruct Templates2 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates1<T2> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>\nstruct Templates3 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates2<T2, T3> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4>\nstruct Templates4 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates3<T2, T3, T4> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>\nstruct Templates5 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates4<T2, T3, T4, T5> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>\nstruct Templates6 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates5<T2, T3, T4, T5, T6> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7>\nstruct Templates7 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>\nstruct Templates8 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>\nstruct Templates9 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10>\nstruct Templates10 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>\nstruct Templates11 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>\nstruct Templates12 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13>\nstruct Templates13 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>\nstruct Templates14 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>\nstruct Templates15 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16>\nstruct Templates16 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>\nstruct Templates17 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>\nstruct Templates18 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19>\nstruct Templates19 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>\nstruct Templates20 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>\nstruct Templates21 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22>\nstruct Templates22 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>\nstruct Templates23 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>\nstruct Templates24 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25>\nstruct Templates25 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>\nstruct Templates26 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>\nstruct Templates27 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28>\nstruct Templates28 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>\nstruct Templates29 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>\nstruct Templates30 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31>\nstruct Templates31 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>\nstruct Templates32 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>\nstruct Templates33 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34>\nstruct Templates34 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>\nstruct Templates35 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>\nstruct Templates36 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37>\nstruct Templates37 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>\nstruct Templates38 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>\nstruct Templates39 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40>\nstruct Templates40 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>\nstruct Templates41 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>\nstruct Templates42 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43>\nstruct Templates43 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>\nstruct Templates44 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>\nstruct Templates45 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46>\nstruct Templates46 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>\nstruct Templates47 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46, T47> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>\nstruct Templates48 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46, T47, T48> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,\n    GTEST_TEMPLATE_ T49>\nstruct Templates49 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46, T47, T48, T49> Tail;\n};\n\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,\n    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>\nstruct Templates50 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,\n      T43, T44, T45, T46, T47, T48, T49, T50> Tail;\n};\n\n\n// We don't want to require the users to write TemplatesN<...> directly,\n// as that would require them to count the length.  Templates<...> is much\n// easier to write, but generates horrible messages when there is a\n// compiler error, as gcc insists on printing out each template\n// argument, even if it has the default value (this means Templates<list>\n// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler\n// errors).\n//\n// Our solution is to combine the best part of the two approaches: a\n// user would write Templates<T1, ..., TN>, and Google Test will translate\n// that to TemplatesN<T1, ..., TN> internally to make error messages\n// readable.  The translation is done by the 'type' member of the\n// Templates template.\ntemplate <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,\n    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,\n    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,\n    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,\n    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,\n    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,\n    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,\n    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,\n    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,\n    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,\n    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,\n    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,\n    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,\n    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,\n    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,\n    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,\n    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,\n    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,\n    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,\n    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,\n    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,\n    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,\n    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,\n    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,\n    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>\nstruct Templates {\n  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;\n};\n\ntemplate <>\nstruct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT> {\n  typedef Templates0 type;\n};\ntemplate <GTEST_TEMPLATE_ T1>\nstruct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT> {\n  typedef Templates1<T1> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>\nstruct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT> {\n  typedef Templates2<T1, T2> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>\nstruct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates3<T1, T2, T3> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4>\nstruct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates4<T1, T2, T3, T4> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>\nstruct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates5<T1, T2, T3, T4, T5> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>\nstruct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates6<T1, T2, T3, T4, T5, T6> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT> {\n  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT> {\n  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT> {\n  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT> {\n  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT> {\n  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT> {\n  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT> {\n  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT> {\n  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, T46, NoneT, NoneT, NoneT, NoneT> {\n  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, T46, T47, NoneT, NoneT, NoneT> {\n  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46, T47> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, T46, T47, T48, NoneT, NoneT> {\n  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46, T47, T48> type;\n};\ntemplate <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,\n    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,\n    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,\n    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,\n    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,\n    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,\n    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,\n    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,\n    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,\n    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,\n    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,\n    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,\n    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,\n    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,\n    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,\n    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,\n    GTEST_TEMPLATE_ T49>\nstruct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,\n    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,\n    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,\n    T45, T46, T47, T48, T49, NoneT> {\n  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,\n      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,\n      T42, T43, T44, T45, T46, T47, T48, T49> type;\n};\n\n// The TypeList template makes it possible to use either a single type\n// or a Types<...> list in TYPED_TEST_CASE() and\n// INSTANTIATE_TYPED_TEST_CASE_P().\n\ntemplate <typename T>\nstruct TypeList { typedef Types1<T> type; };\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n    typename T6, typename T7, typename T8, typename T9, typename T10,\n    typename T11, typename T12, typename T13, typename T14, typename T15,\n    typename T16, typename T17, typename T18, typename T19, typename T20,\n    typename T21, typename T22, typename T23, typename T24, typename T25,\n    typename T26, typename T27, typename T28, typename T29, typename T30,\n    typename T31, typename T32, typename T33, typename T34, typename T35,\n    typename T36, typename T37, typename T38, typename T39, typename T40,\n    typename T41, typename T42, typename T43, typename T44, typename T45,\n    typename T46, typename T47, typename T48, typename T49, typename T50>\nstruct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,\n    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,\n    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,\n    T44, T45, T46, T47, T48, T49, T50> > {\n  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,\n      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,\n      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,\n      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;\n};\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h.pump",
    "content": "$$ -*- mode: c++; -*-\n$var n = 50  $$ Maximum length of type lists we want to support.\n// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Type utilities needed for implementing typed and type-parameterized\n// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!\n//\n// Currently we support at most $n types in a list, and at most $n\n// type-parameterized tests in one type-parameterized test case.\n// Please contact googletestframework@googlegroups.com if you need\n// more.\n\n#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n\n#include <gtest/internal/gtest-port.h>\n#include <gtest/internal/gtest-string.h>\n\n#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using\n// libstdc++ (which is where cxxabi.h comes from).\n#ifdef __GLIBCXX__\n#include <cxxabi.h>\n#endif  // __GLIBCXX__\n\nnamespace testing {\nnamespace internal {\n\n// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same\n// type.  This can be used as a compile-time assertion to ensure that\n// two types are equal.\n\ntemplate <typename T1, typename T2>\nstruct AssertTypeEq;\n\ntemplate <typename T>\nstruct AssertTypeEq<T, T> {\n  typedef bool type;\n};\n\n// GetTypeName<T>() returns a human-readable name of type T.\ntemplate <typename T>\nString GetTypeName() {\n#if GTEST_HAS_RTTI\n\n  const char* const name = typeid(T).name();\n#ifdef __GLIBCXX__\n  int status = 0;\n  // gcc's implementation of typeid(T).name() mangles the type name,\n  // so we have to demangle it.\n  char* const readable_name = abi::__cxa_demangle(name, 0, 0, &status);\n  const String name_str(status == 0 ? readable_name : name);\n  free(readable_name);\n  return name_str;\n#else\n  return name;\n#endif  // __GLIBCXX__\n\n#else\n  return \"<type>\";\n#endif  // GTEST_HAS_RTTI\n}\n\n// A unique type used as the default value for the arguments of class\n// template Types.  This allows us to simulate variadic templates\n// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't\n// support directly.\nstruct None {};\n\n// The following family of struct and struct templates are used to\n// represent type lists.  In particular, TypesN<T1, T2, ..., TN>\n// represents a type list with N types (T1, T2, ..., and TN) in it.\n// Except for Types0, every struct in the family has two member types:\n// Head for the first type in the list, and Tail for the rest of the\n// list.\n\n// The empty type list.\nstruct Types0 {};\n\n// Type lists of length 1, 2, 3, and so on.\n\ntemplate <typename T1>\nstruct Types1 {\n  typedef T1 Head;\n  typedef Types0 Tail;\n};\n\n$range i 2..n\n\n$for i [[\n$range j 1..i\n$range k 2..i\ntemplate <$for j, [[typename T$j]]>\nstruct Types$i {\n  typedef T1 Head;\n  typedef Types$(i-1)<$for k, [[T$k]]> Tail;\n};\n\n\n]]\n\n}  // namespace internal\n\n// We don't want to require the users to write TypesN<...> directly,\n// as that would require them to count the length.  Types<...> is much\n// easier to write, but generates horrible messages when there is a\n// compiler error, as gcc insists on printing out each template\n// argument, even if it has the default value (this means Types<int>\n// will appear as Types<int, None, None, ..., None> in the compiler\n// errors).\n//\n// Our solution is to combine the best part of the two approaches: a\n// user would write Types<T1, ..., TN>, and Google Test will translate\n// that to TypesN<T1, ..., TN> internally to make error messages\n// readable.  The translation is done by the 'type' member of the\n// Types template.\n\n$range i 1..n\ntemplate <$for i, [[typename T$i = internal::None]]>\nstruct Types {\n  typedef internal::Types$n<$for i, [[T$i]]> type;\n};\n\ntemplate <>\nstruct Types<$for i, [[internal::None]]> {\n  typedef internal::Types0 type;\n};\n\n$range i 1..n-1\n$for i [[\n$range j 1..i\n$range k i+1..n\ntemplate <$for j, [[typename T$j]]>\nstruct Types<$for j, [[T$j]]$for k[[, internal::None]]> {\n  typedef internal::Types$i<$for j, [[T$j]]> type;\n};\n\n]]\n\nnamespace internal {\n\n#define GTEST_TEMPLATE_ template <typename T> class\n\n// The template \"selector\" struct TemplateSel<Tmpl> is used to\n// represent Tmpl, which must be a class template with one type\n// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined\n// as the type Tmpl<T>.  This allows us to actually instantiate the\n// template \"selected\" by TemplateSel<Tmpl>.\n//\n// This trick is necessary for simulating typedef for class templates,\n// which C++ doesn't support directly.\ntemplate <GTEST_TEMPLATE_ Tmpl>\nstruct TemplateSel {\n  template <typename T>\n  struct Bind {\n    typedef Tmpl<T> type;\n  };\n};\n\n#define GTEST_BIND_(TmplSel, T) \\\n  TmplSel::template Bind<T>::type\n\n// A unique struct template used as the default value for the\n// arguments of class template Templates.  This allows us to simulate\n// variadic templates (e.g. Templates<int>, Templates<int, double>,\n// and etc), which C++ doesn't support directly.\ntemplate <typename T>\nstruct NoneT {};\n\n// The following family of struct and struct templates are used to\n// represent template lists.  In particular, TemplatesN<T1, T2, ...,\n// TN> represents a list of N templates (T1, T2, ..., and TN).  Except\n// for Templates0, every struct in the family has two member types:\n// Head for the selector of the first template in the list, and Tail\n// for the rest of the list.\n\n// The empty template list.\nstruct Templates0 {};\n\n// Template lists of length 1, 2, 3, and so on.\n\ntemplate <GTEST_TEMPLATE_ T1>\nstruct Templates1 {\n  typedef TemplateSel<T1> Head;\n  typedef Templates0 Tail;\n};\n\n$range i 2..n\n\n$for i [[\n$range j 1..i\n$range k 2..i\ntemplate <$for j, [[GTEST_TEMPLATE_ T$j]]>\nstruct Templates$i {\n  typedef TemplateSel<T1> Head;\n  typedef Templates$(i-1)<$for k, [[T$k]]> Tail;\n};\n\n\n]]\n\n// We don't want to require the users to write TemplatesN<...> directly,\n// as that would require them to count the length.  Templates<...> is much\n// easier to write, but generates horrible messages when there is a\n// compiler error, as gcc insists on printing out each template\n// argument, even if it has the default value (this means Templates<list>\n// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler\n// errors).\n//\n// Our solution is to combine the best part of the two approaches: a\n// user would write Templates<T1, ..., TN>, and Google Test will translate\n// that to TemplatesN<T1, ..., TN> internally to make error messages\n// readable.  The translation is done by the 'type' member of the\n// Templates template.\n\n$range i 1..n\ntemplate <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]>\nstruct Templates {\n  typedef Templates$n<$for i, [[T$i]]> type;\n};\n\ntemplate <>\nstruct Templates<$for i, [[NoneT]]> {\n  typedef Templates0 type;\n};\n\n$range i 1..n-1\n$for i [[\n$range j 1..i\n$range k i+1..n\ntemplate <$for j, [[GTEST_TEMPLATE_ T$j]]>\nstruct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {\n  typedef Templates$i<$for j, [[T$j]]> type;\n};\n\n]]\n\n// The TypeList template makes it possible to use either a single type\n// or a Types<...> list in TYPED_TEST_CASE() and\n// INSTANTIATE_TYPED_TEST_CASE_P().\n\ntemplate <typename T>\nstruct TypeList { typedef Types1<T> type; };\n\n\n$range i 1..n\ntemplate <$for i, [[typename T$i]]>\nstruct TypeList<Types<$for i, [[T$i]]> > {\n  typedef typename Types<$for i, [[T$i]]>::type type;\n};\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P\n\n#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/acx_pthread.m4",
    "content": "# This was retrieved from\n#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi\n# See also (perhaps for new versions?)\n#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi\n#\n# We've rewritten the inconsistency check code (from avahi), to work\n# more broadly.  In particular, it no longer assumes ld accepts -zdefs.\n# This caused a restructing of the code, but the functionality has only\n# changed a little.\n\ndnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])\ndnl\ndnl @summary figure out how to build C programs using POSIX threads\ndnl\ndnl This macro figures out how to build C programs using POSIX threads.\ndnl It sets the PTHREAD_LIBS output variable to the threads library and\ndnl linker flags, and the PTHREAD_CFLAGS output variable to any special\ndnl C compiler flags that are needed. (The user can also force certain\ndnl compiler flags/libs to be tested by setting these environment\ndnl variables.)\ndnl\ndnl Also sets PTHREAD_CC to any special C compiler that is needed for\ndnl multi-threaded programs (defaults to the value of CC otherwise).\ndnl (This is necessary on AIX to use the special cc_r compiler alias.)\ndnl\ndnl NOTE: You are assumed to not only compile your program with these\ndnl flags, but also link it with them as well. e.g. you should link\ndnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS\ndnl $LIBS\ndnl\ndnl If you are only building threads programs, you may wish to use\ndnl these variables in your default LIBS, CFLAGS, and CC:\ndnl\ndnl        LIBS=\"$PTHREAD_LIBS $LIBS\"\ndnl        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\ndnl        CC=\"$PTHREAD_CC\"\ndnl\ndnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute\ndnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to\ndnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).\ndnl\ndnl ACTION-IF-FOUND is a list of shell commands to run if a threads\ndnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to\ndnl run it if it is not found. If ACTION-IF-FOUND is not specified, the\ndnl default action will define HAVE_PTHREAD.\ndnl\ndnl Please let the authors know if this macro fails on any platform, or\ndnl if you have any other suggestions or comments. This macro was based\ndnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with\ndnl help from M. Frigo), as well as ac_pthread and hb_pthread macros\ndnl posted by Alejandro Forero Cuervo to the autoconf macro repository.\ndnl We are also grateful for the helpful feedback of numerous users.\ndnl\ndnl @category InstalledPackages\ndnl @author Steven G. Johnson <stevenj@alum.mit.edu>\ndnl @version 2006-05-29\ndnl @license GPLWithACException\ndnl \ndnl Checks for GCC shared/pthread inconsistency based on work by\ndnl Marcin Owsiany <marcin@owsiany.pl>\n\n\nAC_DEFUN([ACX_PTHREAD], [\nAC_REQUIRE([AC_CANONICAL_HOST])\nAC_LANG_SAVE\nAC_LANG_C\nacx_pthread_ok=no\n\n# We used to check for pthread.h first, but this fails if pthread.h\n# requires special compiler flags (e.g. on True64 or Sequent).\n# It gets checked for in the link test anyway.\n\n# First of all, check if the user has set any of the PTHREAD_LIBS,\n# etcetera environment variables, and if threads linking works using\n# them:\nif test x\"$PTHREAD_LIBS$PTHREAD_CFLAGS\" != x; then\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])\n        AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)\n        AC_MSG_RESULT($acx_pthread_ok)\n        if test x\"$acx_pthread_ok\" = xno; then\n                PTHREAD_LIBS=\"\"\n                PTHREAD_CFLAGS=\"\"\n        fi\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\nfi\n\n# We must check for the threads library under a number of different\n# names; the ordering is very important because some systems\n# (e.g. DEC) have both -lpthread and -lpthreads, where one of the\n# libraries is broken (non-POSIX).\n\n# Create a list of thread flags to try.  Items starting with a \"-\" are\n# C compiler flags, and other items are library names, except for \"none\"\n# which indicates that we try without any flags at all, and \"pthread-config\"\n# which is a program returning the flags for the Pth emulation library.\n\nacx_pthread_flags=\"pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config\"\n\n# The ordering *is* (sometimes) important.  Some notes on the\n# individual items follow:\n\n# pthreads: AIX (must check this before -lpthread)\n# none: in case threads are in libc; should be tried before -Kthread and\n#       other compiler flags to prevent continual compiler warnings\n# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)\n# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)\n# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)\n# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)\n# -pthreads: Solaris/gcc\n# -mthreads: Mingw32/gcc, Lynx/gcc\n# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it\n#      doesn't hurt to check since this sometimes defines pthreads too;\n#      also defines -D_REENTRANT)\n#      ... -mt is also the pthreads flag for HP/aCC\n# pthread: Linux, etcetera\n# --thread-safe: KAI C++\n# pthread-config: use pthread-config program (for GNU Pth library)\n\ncase \"${host_cpu}-${host_os}\" in\n        *solaris*)\n\n        # On Solaris (at least, for some versions), libc contains stubbed\n        # (non-functional) versions of the pthreads routines, so link-based\n        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/\n        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather\n        # a function called by this macro, so we could check for that, but\n        # who knows whether they'll stub that too in a future libc.)  So,\n        # we'll just look for -pthreads and -lpthread first:\n\n        acx_pthread_flags=\"-pthreads pthread -mt -pthread $acx_pthread_flags\"\n        ;;\nesac\n\nif test x\"$acx_pthread_ok\" = xno; then\nfor flag in $acx_pthread_flags; do\n\n        case $flag in\n                none)\n                AC_MSG_CHECKING([whether pthreads work without any flags])\n                ;;\n\n                -*)\n                AC_MSG_CHECKING([whether pthreads work with $flag])\n                PTHREAD_CFLAGS=\"$flag\"\n                ;;\n\n\t\tpthread-config)\n\t\tAC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)\n\t\tif test x\"$acx_pthread_config\" = xno; then continue; fi\n\t\tPTHREAD_CFLAGS=\"`pthread-config --cflags`\"\n\t\tPTHREAD_LIBS=\"`pthread-config --ldflags` `pthread-config --libs`\"\n\t\t;;\n\n                *)\n                AC_MSG_CHECKING([for the pthreads library -l$flag])\n                PTHREAD_LIBS=\"-l$flag\"\n                ;;\n        esac\n\n        save_LIBS=\"$LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Check for various functions.  We must include pthread.h,\n        # since some functions may be macros.  (On the Sequent, we\n        # need a special flag -Kthread to make this header compile.)\n        # We check for pthread_join because it is in -lpthread on IRIX\n        # while pthread_create is in libc.  We check for pthread_attr_init\n        # due to DEC craziness with -lpthreads.  We check for\n        # pthread_cleanup_push because it is one of the few pthread\n        # functions on Solaris that doesn't have a non-functional libc stub.\n        # We try pthread_create on general principles.\n        AC_TRY_LINK([#include <pthread.h>],\n                    [pthread_t th; pthread_join(th, 0);\n                     pthread_attr_init(0); pthread_cleanup_push(0, 0);\n                     pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n                    [acx_pthread_ok=yes])\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n\n        AC_MSG_RESULT($acx_pthread_ok)\n        if test \"x$acx_pthread_ok\" = xyes; then\n                break;\n        fi\n\n        PTHREAD_LIBS=\"\"\n        PTHREAD_CFLAGS=\"\"\ndone\nfi\n\n# Various other checks:\nif test \"x$acx_pthread_ok\" = xyes; then\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.\n\tAC_MSG_CHECKING([for joinable pthread attribute])\n\tattr_name=unknown\n\tfor attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do\n\t    AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],\n                        [attr_name=$attr; break])\n\tdone\n        AC_MSG_RESULT($attr_name)\n        if test \"$attr_name\" != PTHREAD_CREATE_JOINABLE; then\n            AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,\n                               [Define to necessary symbol if this constant\n                                uses a non-standard name on your system.])\n        fi\n\n        AC_MSG_CHECKING([if more special flags are required for pthreads])\n        flag=no\n        case \"${host_cpu}-${host_os}\" in\n            *-aix* | *-freebsd* | *-darwin*) flag=\"-D_THREAD_SAFE\";;\n            *solaris* | *-osf* | *-hpux*) flag=\"-D_REENTRANT\";;\n        esac\n        AC_MSG_RESULT(${flag})\n        if test \"x$flag\" != xno; then\n            PTHREAD_CFLAGS=\"$flag $PTHREAD_CFLAGS\"\n        fi\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n        # More AIX lossage: must compile with xlc_r or cc_r\n\tif test x\"$GCC\" != xyes; then\n          AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})\n        else\n          PTHREAD_CC=$CC\n\tfi\n\n\t# The next part tries to detect GCC inconsistency with -shared on some\n\t# architectures and systems. The problem is that in certain\n\t# configurations, when -shared is specified, GCC \"forgets\" to\n\t# internally use various flags which are still necessary.\n\t\n\t#\n\t# Prepare the flags\n\t#\n\tsave_CFLAGS=\"$CFLAGS\"\n\tsave_LIBS=\"$LIBS\"\n\tsave_CC=\"$CC\"\n\t\n\t# Try with the flags determined by the earlier checks.\n\t#\n\t# -Wl,-z,defs forces link-time symbol resolution, so that the\n\t# linking checks with -shared actually have any value\n\t#\n\t# FIXME: -fPIC is required for -shared on many architectures,\n\t# so we specify it here, but the right way would probably be to\n\t# properly detect whether it is actually required.\n\tCFLAGS=\"-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS\"\n\tLIBS=\"$PTHREAD_LIBS $LIBS\"\n\tCC=\"$PTHREAD_CC\"\n\t\n\t# In order not to create several levels of indentation, we test\n\t# the value of \"$done\" until we find the cure or run out of ideas.\n\tdone=\"no\"\n\t\n\t# First, make sure the CFLAGS we added are actually accepted by our\n\t# compiler.  If not (and OS X's ld, for instance, does not accept -z),\n\t# then we can't do this test.\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies])\n\t   AC_TRY_LINK(,, , [done=yes])\n\t\n\t   if test \"x$done\" = xyes ; then\n\t      AC_MSG_RESULT([no])\n\t   else\n\t      AC_MSG_RESULT([yes])\n\t   fi\n\tfi\n\t\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether -pthread is sufficient with -shared])\n\t   AC_TRY_LINK([#include <pthread.h>],\n\t      [pthread_t th; pthread_join(th, 0);\n\t      pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t      [done=yes])\n\t   \n\t   if test \"x$done\" = xyes; then\n\t      AC_MSG_RESULT([yes])\n\t   else\n\t      AC_MSG_RESULT([no])\n\t   fi\n\tfi\n\t\n\t#\n\t# Linux gcc on some architectures such as mips/mipsel forgets\n\t# about -lpthread\n\t#\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether -lpthread fixes that])\n\t   LIBS=\"-lpthread $PTHREAD_LIBS $save_LIBS\"\n\t   AC_TRY_LINK([#include <pthread.h>],\n\t      [pthread_t th; pthread_join(th, 0);\n\t      pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t      [done=yes])\n\t\n\t   if test \"x$done\" = xyes; then\n\t      AC_MSG_RESULT([yes])\n\t      PTHREAD_LIBS=\"-lpthread $PTHREAD_LIBS\"\n\t   else\n\t      AC_MSG_RESULT([no])\n\t   fi\n\tfi\n\t#\n\t# FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc\n\t#\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether -lc_r fixes that])\n\t   LIBS=\"-lc_r $PTHREAD_LIBS $save_LIBS\"\n\t   AC_TRY_LINK([#include <pthread.h>],\n\t       [pthread_t th; pthread_join(th, 0);\n\t        pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t        pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t       [done=yes])\n\t\n\t   if test \"x$done\" = xyes; then\n\t      AC_MSG_RESULT([yes])\n\t      PTHREAD_LIBS=\"-lc_r $PTHREAD_LIBS\"\n\t   else\n\t      AC_MSG_RESULT([no])\n\t   fi\n\tfi\n\tif test x\"$done\" = xno; then\n\t   # OK, we have run out of ideas\n\t   AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries])\n\t\n\t   # so it's not safe to assume that we may use pthreads\n\t   acx_pthread_ok=no\n\tfi\n\t\n\tCFLAGS=\"$save_CFLAGS\"\n\tLIBS=\"$save_LIBS\"\n\tCC=\"$save_CC\"\nelse\n        PTHREAD_CC=\"$CC\"\nfi\n\nAC_SUBST(PTHREAD_LIBS)\nAC_SUBST(PTHREAD_CFLAGS)\nAC_SUBST(PTHREAD_CC)\n\n# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:\nif test x\"$acx_pthread_ok\" = xyes; then\n        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])\n        :\nelse\n        acx_pthread_ok=no\n        $2\nfi\nAC_LANG_RESTORE\n])dnl ACX_PTHREAD\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/gtest.m4",
    "content": "dnl GTEST_LIB_CHECK([minimum version [,\ndnl                  action if found [,action if not found]]])\ndnl\ndnl Check for the presence of the Google Test library, optionally at a minimum\ndnl version, and indicate a viable version with the HAVE_GTEST flag. It defines\ndnl standard variables for substitution including GTEST_CPPFLAGS,\ndnl GTEST_CXXFLAGS, GTEST_LDFLAGS, and GTEST_LIBS. It also defines\ndnl GTEST_VERSION as the version of Google Test found. Finally, it provides\ndnl optional custom action slots in the event GTEST is found or not.\nAC_DEFUN([GTEST_LIB_CHECK],\n[\ndnl Provide a flag to enable or disable Google Test usage.\nAC_ARG_ENABLE([gtest],\n  [AS_HELP_STRING([--enable-gtest],\n                  [Enable tests using the Google C++ Testing Framework.\n                  (Default is enabled.)])],\n  [],\n  [enable_gtest=])\nAC_ARG_VAR([GTEST_CONFIG],\n           [The exact path of Google Test's 'gtest-config' script.])\nAC_ARG_VAR([GTEST_CPPFLAGS],\n           [C-like preprocessor flags for Google Test.])\nAC_ARG_VAR([GTEST_CXXFLAGS],\n           [C++ compile flags for Google Test.])\nAC_ARG_VAR([GTEST_LDFLAGS],\n           [Linker path and option flags for Google Test.])\nAC_ARG_VAR([GTEST_LIBS],\n           [Library linking flags for Google Test.])\nAC_ARG_VAR([GTEST_VERSION],\n           [The version of Google Test available.])\nHAVE_GTEST=\"no\"\nAS_IF([test \"x${enable_gtest}\" != \"xno\"],\n  [AC_MSG_CHECKING([for 'gtest-config'])\n   AS_IF([test \"x${enable_gtest}\" != \"xyes\"],\n     [AS_IF([test -x \"${enable_gtest}/scripts/gtest-config\"],\n        [GTEST_CONFIG=\"${enable_gtest}/scripts/gtest-config\"],\n        [GTEST_CONFIG=\"${enable_gtest}/bin/gtest-config\"])\n      AS_IF([test -x \"${GTEST_CONFIG}\"], [],\n        [AC_MSG_RESULT([no])\n         AC_MSG_ERROR([dnl\nUnable to locate either a built or installed Google Test.\nThe specific location '${enable_gtest}' was provided for a built or installed\nGoogle Test, but no 'gtest-config' script could be found at this location.])\n         ])],\n     [AC_PATH_PROG([GTEST_CONFIG], [gtest-config])])\n   AS_IF([test -x \"${GTEST_CONFIG}\"],\n     [AC_MSG_RESULT([${GTEST_CONFIG}])\n      m4_ifval([$1],\n        [_gtest_min_version=\"--min-version=$1\"\n         AC_MSG_CHECKING([for Google Test at least version >= $1])],\n        [_gtest_min_version=\"--min-version=0\"\n         AC_MSG_CHECKING([for Google Test])])\n      AS_IF([${GTEST_CONFIG} ${_gtest_min_version}],\n        [AC_MSG_RESULT([yes])\n         HAVE_GTEST='yes'],\n        [AC_MSG_RESULT([no])])],\n     [AC_MSG_RESULT([no])])\n   AS_IF([test \"x${HAVE_GTEST}\" = \"xyes\"],\n     [GTEST_CPPFLAGS=`${GTEST_CONFIG} --cppflags`\n      GTEST_CXXFLAGS=`${GTEST_CONFIG} --cxxflags`\n      GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags`\n      GTEST_LIBS=`${GTEST_CONFIG} --libs`\n      GTEST_VERSION=`${GTEST_CONFIG} --version`\n      AC_DEFINE([HAVE_GTEST],[1],[Defined when Google Test is available.])],\n     [AS_IF([test \"x${enable_gtest}\" = \"xyes\"],\n        [AC_MSG_ERROR([dnl\nGoogle Test was enabled, but no viable version could be found.])\n         ])])])\nAC_SUBST([HAVE_GTEST])\nAM_CONDITIONAL([HAVE_GTEST],[test \"x$HAVE_GTEST\" = \"xyes\"])\nAS_IF([test \"x$HAVE_GTEST\" = \"xyes\"],\n  [m4_ifval([$2], [$2])],\n  [m4_ifval([$3], [$3])])\n])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 8.00\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest-md\", \"gtest-md.vcproj\", \"{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest_main-md\", \"gtest_main-md.vcproj\", \"{3AF54C8A-10BF-4332-9147-F68ED9862033}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest_prod_test-md\", \"gtest_prod_test-md.vcproj\", \"{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest_unittest-md\", \"gtest_unittest-md.vcproj\", \"{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\tEndProjectSection\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfiguration) = preSolution\r\n\t\tDebug = Debug\r\n\t\tRelease = Release\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfiguration) = postSolution\r\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug.ActiveCfg = Debug|Win32\r\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug.Build.0 = Debug|Win32\r\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release.ActiveCfg = Release|Win32\r\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release.Build.0 = Release|Win32\r\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug.ActiveCfg = Debug|Win32\r\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug.Build.0 = Debug|Win32\r\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release.ActiveCfg = Release|Win32\r\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release.Build.0 = Release|Win32\r\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug.ActiveCfg = Debug|Win32\r\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug.Build.0 = Debug|Win32\r\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release.ActiveCfg = Release|Win32\r\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release.Build.0 = Release|Win32\r\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug.ActiveCfg = Debug|Win32\r\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug.Build.0 = Debug|Win32\r\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release.ActiveCfg = Release|Win32\r\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityAddIns) = postSolution\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"7.10\"\r\n\tName=\"gtest-md\"\r\n\tProjectGUID=\"{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}\"\r\n\tKeyword=\"Win32Proj\">\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"/>\r\n\t</Platforms>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"2\"\r\n\t\t\tReferencesPath=\"\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_LIB\"\r\n\t\t\t\tMinimalRebuild=\"TRUE\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"4\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/gtestd.lib\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"2\"\r\n\t\t\tReferencesPath=\"&quot;..\\include&quot;;&quot;..&quot;\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_LIB\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"3\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/gtest.lib\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-death-test.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-filepath.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-port.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-test-part.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-typed-test.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-death-test-internal.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest-death-test.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-filepath.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-internal-inl.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-internal.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest-message.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-port.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest-spi.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-string.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest_pred_impl.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest_prod.h\">\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 8.00\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest\", \"gtest.vcproj\", \"{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest_main\", \"gtest_main.vcproj\", \"{3AF54C8A-10BF-4332-9147-F68ED9862032}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest_unittest\", \"gtest_unittest.vcproj\", \"{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest_prod_test\", \"gtest_prod_test.vcproj\", \"{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\tEndProjectSection\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfiguration) = preSolution\r\n\t\tDebug = Debug\r\n\t\tRelease = Release\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfiguration) = postSolution\r\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.ActiveCfg = Debug|Win32\r\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.Build.0 = Debug|Win32\r\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.ActiveCfg = Release|Win32\r\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.Build.0 = Release|Win32\r\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.ActiveCfg = Debug|Win32\r\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.Build.0 = Debug|Win32\r\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.ActiveCfg = Release|Win32\r\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.Build.0 = Release|Win32\r\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.ActiveCfg = Debug|Win32\r\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.Build.0 = Debug|Win32\r\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.ActiveCfg = Release|Win32\r\n\t\t{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.Build.0 = Release|Win32\r\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.ActiveCfg = Debug|Win32\r\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.Build.0 = Debug|Win32\r\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.ActiveCfg = Release|Win32\r\n\t\t{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityAddIns) = postSolution\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"7.10\"\r\n\tName=\"gtest\"\r\n\tProjectGUID=\"{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}\"\r\n\tKeyword=\"Win32Proj\">\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"/>\r\n\t</Platforms>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"2\"\r\n\t\t\tReferencesPath=\"\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_LIB\"\r\n\t\t\t\tMinimalRebuild=\"TRUE\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"5\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"4\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/gtestd.lib\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"2\"\r\n\t\t\tReferencesPath=\"&quot;..\\include&quot;;&quot;..&quot;\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_LIB\"\r\n\t\t\t\tRuntimeLibrary=\"4\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"3\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/gtest.lib\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-death-test.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-filepath.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-test-part.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-port.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-typed-test.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-death-test-internal.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest-death-test.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-filepath.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-internal-inl.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-internal.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest-message.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-port.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest-spi.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-string.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest_pred_impl.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest_prod.h\">\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main-md.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"7.10\"\r\n\tName=\"gtest_main-md\"\r\n\tProjectGUID=\"{3AF54C8A-10BF-4332-9147-F68ED9862033}\"\r\n\tKeyword=\"Win32Proj\">\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"/>\r\n\t</Platforms>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"2\"\r\n\t\t\tReferencesPath=\"\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_LIB\"\r\n\t\t\t\tMinimalRebuild=\"TRUE\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"4\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/$(ProjectName)d.lib\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"2\"\r\n\t\t\tReferencesPath=\"&quot;..\\include&quot;;&quot;..&quot;\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_LIB\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"3\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/$(ProjectName).lib\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t\t<ProjectReference\r\n\t\t\tReferencedProjectIdentifier=\"{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}\"\r\n\t\t\tName=\"gtest-md\"/>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest_main.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-death-test-internal.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest-death-test.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-filepath.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-internal-inl.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-internal.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest-message.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-port.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest-spi.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-string.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest_pred_impl.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest_prod.h\">\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"7.10\"\r\n\tName=\"gtest_main\"\r\n\tProjectGUID=\"{3AF54C8A-10BF-4332-9147-F68ED9862032}\"\r\n\tKeyword=\"Win32Proj\">\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"/>\r\n\t</Platforms>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"2\"\r\n\t\t\tReferencesPath=\"\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_LIB\"\r\n\t\t\t\tMinimalRebuild=\"TRUE\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"5\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"4\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/$(ProjectName)d.lib\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"2\"\r\n\t\t\tReferencesPath=\"&quot;..\\include&quot;;&quot;..&quot;\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_LIB\"\r\n\t\t\t\tRuntimeLibrary=\"4\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"3\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/$(ProjectName).lib\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t\t<ProjectReference\r\n\t\t\tReferencedProjectIdentifier=\"{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}\"\r\n\t\t\tName=\"gtest\"/>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest_main.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-death-test-internal.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest-death-test.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-filepath.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\src\\gtest-internal-inl.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-internal.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest-message.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-port.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest-spi.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\internal\\gtest-string.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest_pred_impl.h\">\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\include\\gtest\\gtest_prod.h\">\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test-md.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"7.10\"\r\n\tName=\"gtest_prod_test-md\"\r\n\tProjectGUID=\"{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}\"\r\n\tKeyword=\"Win32Proj\">\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"/>\r\n\t</Platforms>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"2\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"TRUE\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"3\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"4\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/gtest_prod_test.exe\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"TRUE\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/gtest_prod_test.pdb\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"2\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"3\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"3\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/gtest_prod_test.exe\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"TRUE\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t\t<ProjectReference\r\n\t\t\tReferencedProjectIdentifier=\"{3AF54C8A-10BF-4332-9147-F68ED9862033}\"\r\n\t\t\tName=\"gtest_main-md\"/>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\test\\gtest_prod_test.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\test\\production.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\test\\production.h\">\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"7.10\"\r\n\tName=\"gtest_prod_test\"\r\n\tProjectGUID=\"{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}\"\r\n\tKeyword=\"Win32Proj\">\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"/>\r\n\t</Platforms>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"2\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"TRUE\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"5\"\r\n\t\t\t\tUsePrecompiledHeader=\"3\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"4\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/gtest_prod_test.exe\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"TRUE\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/gtest_prod_test.pdb\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"2\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"4\"\r\n\t\t\t\tUsePrecompiledHeader=\"3\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"3\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/gtest_prod_test.exe\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"TRUE\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t\t<ProjectReference\r\n\t\t\tReferencedProjectIdentifier=\"{3AF54C8A-10BF-4332-9147-F68ED9862032}\"\r\n\t\t\tName=\"gtest_main\"/>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\test\\gtest_prod_test.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\test\\production.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\test\\production.h\">\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest-md.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"7.10\"\r\n\tName=\"gtest_unittest-md\"\r\n\tProjectGUID=\"{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}\"\r\n\tKeyword=\"Win32Proj\">\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"/>\r\n\t</Platforms>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"2\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"TRUE\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"3\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"4\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/gtest_unittest.exe\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"TRUE\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/gtest_unittest.pdb\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"2\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"3\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"3\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/gtest_unittest.exe\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"TRUE\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t\t<ProjectReference\r\n\t\t\tReferencedProjectIdentifier=\"{3AF54C8A-10BF-4332-9147-F68ED9862033}\"\r\n\t\t\tName=\"gtest_main-md\"/>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\test\\gtest_unittest.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tOptimization=\"1\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"\r\n\t\t\t\t\t\tBasicRuntimeChecks=\"0\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\t\t\tDebugInformationFormat=\"3\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\">\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"7.10\"\r\n\tName=\"gtest_unittest\"\r\n\tProjectGUID=\"{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}\"\r\n\tKeyword=\"Win32Proj\">\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"/>\r\n\t</Platforms>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"2\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"TRUE\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"5\"\r\n\t\t\t\tUsePrecompiledHeader=\"3\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"4\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/gtest_unittest.exe\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"TRUE\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/gtest_unittest.pdb\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionName)/$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(OutDir)/$(ProjectName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"2\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"4\"\r\n\t\t\t\tUsePrecompiledHeader=\"3\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"FALSE\"\r\n\t\t\t\tDebugInformationFormat=\"3\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/gtest_unittest.exe\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"TRUE\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t\t<ProjectReference\r\n\t\t\tReferencedProjectIdentifier=\"{3AF54C8A-10BF-4332-9147-F68ED9862032}\"\r\n\t\t\tName=\"gtest_main\"/>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"Source Files\"\r\n\t\t\tFilter=\"cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx\"\r\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\">\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\test\\gtest_unittest.cc\">\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tOptimization=\"1\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"\r\n\t\t\t\t\t\tBasicRuntimeChecks=\"0\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\t\t\tDebugInformationFormat=\"3\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t\t<FileConfiguration\r\n\t\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t\t<Tool\r\n\t\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\t\tAdditionalIncludeDirectories=\"&quot;..&quot;;&quot;..\\include&quot;\"\r\n\t\t\t\t\t\tUsePrecompiledHeader=\"0\"/>\r\n\t\t\t\t</FileConfiguration>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"Header Files\"\r\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\r\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\">\r\n\t\t</Filter>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/run_tests.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc. All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Runs the specified tests for Google Test.\n\nThis script requires Python 2.3 or higher.  To learn the usage, run it\nwith -h.\n\"\"\"\n\nimport os\nimport sys\n\nSCRIPT_DIR = os.path.dirname(__file__) or '.'\n\nsys.path.append(os.path.join(SCRIPT_DIR, 'test'))\nimport run_tests_util\n\n\ndef _Main():\n  \"\"\"Runs all tests for Google Test.\"\"\"\n\n  options, args = run_tests_util.ParseArgs('gtest')\n  test_runner = run_tests_util.TestRunner(script_dir=SCRIPT_DIR)\n  tests = test_runner.GetTestsToRun(args,\n                                    options.configurations,\n                                    options.built_configurations)\n  if not tests:\n    sys.exit(1)  # Incorrect parameters given, abort execution.\n\n  sys.exit(test_runner.RunTests(tests[0], tests[1]))\n\nif __name__ == '__main__':\n  _Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/prime_tables.h",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n// Author: vladl@google.com (Vlad Losev)\n\n// This provides interface PrimeTable that determines whether a number is a\n// prime and determines a next prime number. This interface is used\n// in Google Test samples demonstrating use of parameterized tests.\n\n#ifndef GTEST_SAMPLES_PRIME_TABLES_H_\n#define GTEST_SAMPLES_PRIME_TABLES_H_\n\n#include <algorithm>\n\n// The prime table interface.\nclass PrimeTable {\n public:\n  virtual ~PrimeTable() {}\n\n  // Returns true iff n is a prime number.\n  virtual bool IsPrime(int n) const = 0;\n\n  // Returns the smallest prime number greater than p; or returns -1\n  // if the next prime is beyond the capacity of the table.\n  virtual int GetNextPrime(int p) const = 0;\n};\n\n// Implementation #1 calculates the primes on-the-fly.\nclass OnTheFlyPrimeTable : public PrimeTable {\n public:\n  virtual bool IsPrime(int n) const {\n    if (n <= 1) return false;\n\n    for (int i = 2; i*i <= n; i++) {\n      // n is divisible by an integer other than 1 and itself.\n      if ((n % i) == 0) return false;\n    }\n\n    return true;\n  }\n\n  virtual int GetNextPrime(int p) const {\n    for (int n = p + 1; n > 0; n++) {\n      if (IsPrime(n)) return n;\n    }\n\n    return -1;\n  }\n};\n\n// Implementation #2 pre-calculates the primes and stores the result\n// in an array.\nclass PreCalculatedPrimeTable : public PrimeTable {\n public:\n  // 'max' specifies the maximum number the prime table holds.\n  explicit PreCalculatedPrimeTable(int max)\n      : is_prime_size_(max + 1), is_prime_(new bool[max + 1]) {\n    CalculatePrimesUpTo(max);\n  }\n  virtual ~PreCalculatedPrimeTable() { delete[] is_prime_; }\n\n  virtual bool IsPrime(int n) const {\n    return 0 <= n && n < is_prime_size_ && is_prime_[n];\n  }\n\n  virtual int GetNextPrime(int p) const {\n    for (int n = p + 1; n < is_prime_size_; n++) {\n      if (is_prime_[n]) return n;\n    }\n\n    return -1;\n  }\n\n private:\n  void CalculatePrimesUpTo(int max) {\n    ::std::fill(is_prime_, is_prime_ + is_prime_size_, true);\n    is_prime_[0] = is_prime_[1] = false;\n\n    for (int i = 2; i <= max; i++) {\n      if (!is_prime_[i]) continue;\n\n      // Marks all multiples of i (except i itself) as non-prime.\n      for (int j = 2*i; j <= max; j += i) {\n        is_prime_[j] = false;\n      }\n    }\n  }\n\n  const int is_prime_size_;\n  bool* const is_prime_;\n\n  // Disables compiler warning \"assignment operator could not be generated.\"\n  void operator=(const PreCalculatedPrimeTable& rhs);\n};\n\n#endif  // GTEST_SAMPLES_PRIME_TABLES_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#include \"sample1.h\"\n\n// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.\nint Factorial(int n) {\n  int result = 1;\n  for (int i = 1; i <= n; i++) {\n    result *= i;\n  }\n\n  return result;\n}\n\n// Returns true iff n is a prime number.\nbool IsPrime(int n) {\n  // Trivial case 1: small numbers\n  if (n <= 1) return false;\n\n  // Trivial case 2: even numbers\n  if (n % 2 == 0) return n == 2;\n\n  // Now, we have that n is odd and n >= 3.\n\n  // Try to divide n by every odd number i, starting from 3\n  for (int i = 3; ; i += 2) {\n    // We only have to try i up to the squre root of n\n    if (i > n/i) break;\n\n    // Now, we have i <= n/i < n.\n    // If n is divisible by i, n is not prime.\n    if (n % i == 0) return false;\n  }\n\n  // n has no integer factor in the range (1, n), and thus is prime.\n  return true;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#ifndef GTEST_SAMPLES_SAMPLE1_H_\n#define GTEST_SAMPLES_SAMPLE1_H_\n\n// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.\nint Factorial(int n);\n\n// Returns true iff n is a prime number.\nbool IsPrime(int n);\n\n#endif  // GTEST_SAMPLES_SAMPLE1_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample10_unittest.cc",
    "content": "// Copyright 2009 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: vladl@google.com (Vlad Losev)\n\n// This sample shows how to use Google Test listener API to implement\n// a primitive leak checker.\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#include <gtest/gtest.h>\n\nusing ::testing::EmptyTestEventListener;\nusing ::testing::InitGoogleTest;\nusing ::testing::Test;\nusing ::testing::TestCase;\nusing ::testing::TestEventListeners;\nusing ::testing::TestInfo;\nusing ::testing::TestPartResult;\nusing ::testing::UnitTest;\n\nnamespace {\n\n// We will track memory used by this class.\nclass Water {\n public:\n  // Normal Water declarations go here.\n\n  // operator new and operator delete help us control water allocation.\n  void* operator new(size_t allocation_size) {\n    allocated_++;\n    return malloc(allocation_size);\n  }\n\n  void operator delete(void* block, size_t /* allocation_size */) {\n    allocated_--;\n    free(block);\n  }\n\n  static int allocated() { return allocated_; }\n\n private:\n  static int allocated_;\n};\n\nint Water::allocated_ = 0;\n\n// This event listener monitors how many Water objects are created and\n// destroyed by each test, and reports a failure if a test leaks some Water\n// objects. It does this by comparing the number of live Water objects at\n// the beginning of a test and at the end of a test.\nclass LeakChecker : public EmptyTestEventListener {\n private:\n  // Called before a test starts.\n  virtual void OnTestStart(const TestInfo& /* test_info */) {\n    initially_allocated_ = Water::allocated();\n  }\n\n  // Called after a test ends.\n  virtual void OnTestEnd(const TestInfo& /* test_info */) {\n    int difference = Water::allocated() - initially_allocated_;\n\n    // You can generate a failure in any event handler except\n    // OnTestPartResult. Just use an appropriate Google Test assertion to do\n    // it.\n    EXPECT_TRUE(difference <= 0)\n        << \"Leaked \" << difference << \" unit(s) of Water!\";\n  }\n\n  int initially_allocated_;\n};\n\nTEST(ListenersTest, DoesNotLeak) {\n  Water* water = new Water;\n  delete water;\n}\n\n// This should fail when the --check_for_leaks command line flag is\n// specified.\nTEST(ListenersTest, LeaksWater) {\n  Water* water = new Water;\n  EXPECT_TRUE(water != NULL);\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  InitGoogleTest(&argc, argv);\n\n  bool check_for_leaks = false;\n  if (argc > 1 && strcmp(argv[1], \"--check_for_leaks\") == 0 )\n    check_for_leaks = true;\n  else\n    printf(\"%s\\n\", \"Run this program with --check_for_leaks to enable \"\n           \"custom leak checking in the tests.\");\n\n  // If we are given the --check_for_leaks command line flag, installs the\n  // leak checker.\n  if (check_for_leaks) {\n    TestEventListeners& listeners = UnitTest::GetInstance()->listeners();\n\n    // Adds the leak checker to the end of the test event listener list,\n    // after the default text output printer and the default XML report\n    // generator.\n    //\n    // The order is important - it ensures that failures generated in the\n    // leak checker's OnTestEnd() method are processed by the text and XML\n    // printers *before* their OnTestEnd() methods are called, such that\n    // they are attributed to the right test. Remember that a listener\n    // receives an OnXyzStart event *after* listeners preceding it in the\n    // list received that event, and receives an OnXyzEnd event *before*\n    // listeners preceding it.\n    //\n    // We don't need to worry about deleting the new listener later, as\n    // Google Test will do it.\n    listeners.Append(new LeakChecker);\n  }\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1_unittest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n\n// This sample shows how to write a simple unit test for a function,\n// using Google C++ testing framework.\n//\n// Writing a unit test using Google C++ testing framework is easy as 1-2-3:\n\n\n// Step 1. Include necessary header files such that the stuff your\n// test logic needs is declared.\n//\n// Don't forget gtest.h, which declares the testing framework.\n\n#include <limits.h>\n#include \"sample1.h\"\n#include <gtest/gtest.h>\n\n\n// Step 2. Use the TEST macro to define your tests.\n//\n// TEST has two parameters: the test case name and the test name.\n// After using the macro, you should define your test logic between a\n// pair of braces.  You can use a bunch of macros to indicate the\n// success or failure of a test.  EXPECT_TRUE and EXPECT_EQ are\n// examples of such macros.  For a complete list, see gtest.h.\n//\n// <TechnicalDetails>\n//\n// In Google Test, tests are grouped into test cases.  This is how we\n// keep test code organized.  You should put logically related tests\n// into the same test case.\n//\n// The test case name and the test name should both be valid C++\n// identifiers.  And you should not use underscore (_) in the names.\n//\n// Google Test guarantees that each test you define is run exactly\n// once, but it makes no guarantee on the order the tests are\n// executed.  Therefore, you should write your tests in such a way\n// that their results don't depend on their order.\n//\n// </TechnicalDetails>\n\n\n// Tests Factorial().\n\n// Tests factorial of negative numbers.\nTEST(FactorialTest, Negative) {\n  // This test is named \"Negative\", and belongs to the \"FactorialTest\"\n  // test case.\n  EXPECT_EQ(1, Factorial(-5));\n  EXPECT_EQ(1, Factorial(-1));\n  EXPECT_TRUE(Factorial(-10) > 0);\n\n  // <TechnicalDetails>\n  //\n  // EXPECT_EQ(expected, actual) is the same as\n  //\n  //   EXPECT_TRUE((expected) == (actual))\n  //\n  // except that it will print both the expected value and the actual\n  // value when the assertion fails.  This is very helpful for\n  // debugging.  Therefore in this case EXPECT_EQ is preferred.\n  //\n  // On the other hand, EXPECT_TRUE accepts any Boolean expression,\n  // and is thus more general.\n  //\n  // </TechnicalDetails>\n}\n\n// Tests factorial of 0.\nTEST(FactorialTest, Zero) {\n  EXPECT_EQ(1, Factorial(0));\n}\n\n// Tests factorial of positive numbers.\nTEST(FactorialTest, Positive) {\n  EXPECT_EQ(1, Factorial(1));\n  EXPECT_EQ(2, Factorial(2));\n  EXPECT_EQ(6, Factorial(3));\n  EXPECT_EQ(40320, Factorial(8));\n}\n\n\n// Tests IsPrime()\n\n// Tests negative input.\nTEST(IsPrimeTest, Negative) {\n  // This test belongs to the IsPrimeTest test case.\n\n  EXPECT_FALSE(IsPrime(-1));\n  EXPECT_FALSE(IsPrime(-2));\n  EXPECT_FALSE(IsPrime(INT_MIN));\n}\n\n// Tests some trivial cases.\nTEST(IsPrimeTest, Trivial) {\n  EXPECT_FALSE(IsPrime(0));\n  EXPECT_FALSE(IsPrime(1));\n  EXPECT_TRUE(IsPrime(2));\n  EXPECT_TRUE(IsPrime(3));\n}\n\n// Tests positive input.\nTEST(IsPrimeTest, Positive) {\n  EXPECT_FALSE(IsPrime(4));\n  EXPECT_TRUE(IsPrime(5));\n  EXPECT_FALSE(IsPrime(6));\n  EXPECT_TRUE(IsPrime(23));\n}\n\n// Step 3. Call RUN_ALL_TESTS() in main().\n//\n// We do this by linking in src/gtest_main.cc file, which consists of\n// a main() function which calls RUN_ALL_TESTS() for us.\n//\n// This runs all the tests you've defined, prints the result, and\n// returns 0 if successful, or 1 otherwise.\n//\n// Did you notice that we didn't register the tests?  The\n// RUN_ALL_TESTS() macro magically knows about all the tests we\n// defined.  Isn't this convenient?\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#include \"sample2.h\"\n\n#include <string.h>\n\n// Clones a 0-terminated C string, allocating memory using new.\nconst char* MyString::CloneCString(const char* a_c_string) {\n  if (a_c_string == NULL) return NULL;\n\n  const size_t len = strlen(a_c_string);\n  char* const clone = new char[ len + 1 ];\n  memcpy(clone, a_c_string, len + 1);\n\n  return clone;\n}\n\n// Sets the 0-terminated C string this MyString object\n// represents.\nvoid MyString::Set(const char* a_c_string) {\n  // Makes sure this works when c_string == c_string_\n  const char* const temp = MyString::CloneCString(a_c_string);\n  delete[] c_string_;\n  c_string_ = temp;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#ifndef GTEST_SAMPLES_SAMPLE2_H_\n#define GTEST_SAMPLES_SAMPLE2_H_\n\n#include <string.h>\n\n\n// A simple string class.\nclass MyString {\n private:\n  const char* c_string_;\n  const MyString& operator=(const MyString& rhs);\n\n public:\n\n  // Clones a 0-terminated C string, allocating memory using new.\n  static const char* CloneCString(const char* a_c_string);\n\n  ////////////////////////////////////////////////////////////\n  //\n  // C'tors\n\n  // The default c'tor constructs a NULL string.\n  MyString() : c_string_(NULL) {}\n\n  // Constructs a MyString by cloning a 0-terminated C string.\n  explicit MyString(const char* a_c_string) : c_string_(NULL) {\n    Set(a_c_string);\n  }\n\n  // Copy c'tor\n  MyString(const MyString& string) : c_string_(NULL) {\n    Set(string.c_string_);\n  }\n\n  ////////////////////////////////////////////////////////////\n  //\n  // D'tor.  MyString is intended to be a final class, so the d'tor\n  // doesn't need to be virtual.\n  ~MyString() { delete[] c_string_; }\n\n  // Gets the 0-terminated C string this MyString object represents.\n  const char* c_string() const { return c_string_; }\n\n  size_t Length() const {\n    return c_string_ == NULL ? 0 : strlen(c_string_);\n  }\n\n  // Sets the 0-terminated C string this MyString object represents.\n  void Set(const char* c_string);\n};\n\n\n#endif  // GTEST_SAMPLES_SAMPLE2_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2_unittest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n\n// This sample shows how to write a more complex unit test for a class\n// that has multiple member functions.\n//\n// Usually, it's a good idea to have one test for each method in your\n// class.  You don't have to do that exactly, but it helps to keep\n// your tests organized.  You may also throw in additional tests as\n// needed.\n\n#include \"sample2.h\"\n#include <gtest/gtest.h>\n\n// In this example, we test the MyString class (a simple string).\n\n// Tests the default c'tor.\nTEST(MyString, DefaultConstructor) {\n  const MyString s;\n\n  // Asserts that s.c_string() returns NULL.\n  //\n  // <TechnicalDetails>\n  //\n  // If we write NULL instead of\n  //\n  //   static_cast<const char *>(NULL)\n  //\n  // in this assertion, it will generate a warning on gcc 3.4.  The\n  // reason is that EXPECT_EQ needs to know the types of its\n  // arguments in order to print them when it fails.  Since NULL is\n  // #defined as 0, the compiler will use the formatter function for\n  // int to print it.  However, gcc thinks that NULL should be used as\n  // a pointer, not an int, and therefore complains.\n  //\n  // The root of the problem is C++'s lack of distinction between the\n  // integer number 0 and the null pointer constant.  Unfortunately,\n  // we have to live with this fact.\n  //\n  // </TechnicalDetails>\n  EXPECT_STREQ(NULL, s.c_string());\n\n  EXPECT_EQ(0u, s.Length());\n}\n\nconst char kHelloString[] = \"Hello, world!\";\n\n// Tests the c'tor that accepts a C string.\nTEST(MyString, ConstructorFromCString) {\n  const MyString s(kHelloString);\n  EXPECT_TRUE(strcmp(s.c_string(), kHelloString) == 0);\n  EXPECT_EQ(sizeof(kHelloString)/sizeof(kHelloString[0]) - 1,\n            s.Length());\n}\n\n// Tests the copy c'tor.\nTEST(MyString, CopyConstructor) {\n  const MyString s1(kHelloString);\n  const MyString s2 = s1;\n  EXPECT_TRUE(strcmp(s2.c_string(), kHelloString) == 0);\n}\n\n// Tests the Set method.\nTEST(MyString, Set) {\n  MyString s;\n\n  s.Set(kHelloString);\n  EXPECT_TRUE(strcmp(s.c_string(), kHelloString) == 0);\n\n  // Set should work when the input pointer is the same as the one\n  // already in the MyString object.\n  s.Set(s.c_string());\n  EXPECT_TRUE(strcmp(s.c_string(), kHelloString) == 0);\n\n  // Can we set the MyString to NULL?\n  s.Set(NULL);\n  EXPECT_STREQ(NULL, s.c_string());\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3-inl.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#ifndef GTEST_SAMPLES_SAMPLE3_INL_H_\n#define GTEST_SAMPLES_SAMPLE3_INL_H_\n\n#include <stddef.h>\n\n\n// Queue is a simple queue implemented as a singled-linked list.\n//\n// The element type must support copy constructor.\ntemplate <typename E>  // E is the element type\nclass Queue;\n\n// QueueNode is a node in a Queue, which consists of an element of\n// type E and a pointer to the next node.\ntemplate <typename E>  // E is the element type\nclass QueueNode {\n  friend class Queue<E>;\n\n public:\n  // Gets the element in this node.\n  const E& element() const { return element_; }\n\n  // Gets the next node in the queue.\n  QueueNode* next() { return next_; }\n  const QueueNode* next() const { return next_; }\n\n private:\n  // Creates a node with a given element value.  The next pointer is\n  // set to NULL.\n  QueueNode(const E& an_element) : element_(an_element), next_(NULL) {}\n\n  // We disable the default assignment operator and copy c'tor.\n  const QueueNode& operator = (const QueueNode&);\n  QueueNode(const QueueNode&);\n\n  E element_;\n  QueueNode* next_;\n};\n\ntemplate <typename E>  // E is the element type.\nclass Queue {\npublic:\n\n  // Creates an empty queue.\n  Queue() : head_(NULL), last_(NULL), size_(0) {}\n\n  // D'tor.  Clears the queue.\n  ~Queue() { Clear(); }\n\n  // Clears the queue.\n  void Clear() {\n    if (size_ > 0) {\n      // 1. Deletes every node.\n      QueueNode<E>* node = head_;\n      QueueNode<E>* next = node->next();\n      for (; ;) {\n        delete node;\n        node = next;\n        if (node == NULL) break;\n        next = node->next();\n      }\n\n      // 2. Resets the member variables.\n      head_ = last_ = NULL;\n      size_ = 0;\n    }\n  }\n\n  // Gets the number of elements.\n  size_t Size() const { return size_; }\n\n  // Gets the first element of the queue, or NULL if the queue is empty.\n  QueueNode<E>* Head() { return head_; }\n  const QueueNode<E>* Head() const { return head_; }\n\n  // Gets the last element of the queue, or NULL if the queue is empty.\n  QueueNode<E>* Last() { return last_; }\n  const QueueNode<E>* Last() const { return last_; }\n\n  // Adds an element to the end of the queue.  A copy of the element is\n  // created using the copy constructor, and then stored in the queue.\n  // Changes made to the element in the queue doesn't affect the source\n  // object, and vice versa.\n  void Enqueue(const E& element) {\n    QueueNode<E>* new_node = new QueueNode<E>(element);\n\n    if (size_ == 0) {\n      head_ = last_ = new_node;\n      size_ = 1;\n    } else {\n      last_->next_ = new_node;\n      last_ = new_node;\n      size_++;\n    }\n  }\n\n  // Removes the head of the queue and returns it.  Returns NULL if\n  // the queue is empty.\n  E* Dequeue() {\n    if (size_ == 0) {\n      return NULL;\n    }\n\n    const QueueNode<E>* const old_head = head_;\n    head_ = head_->next_;\n    size_--;\n    if (size_ == 0) {\n      last_ = NULL;\n    }\n\n    E* element = new E(old_head->element());\n    delete old_head;\n\n    return element;\n  }\n\n  // Applies a function/functor on each element of the queue, and\n  // returns the result in a new queue.  The original queue is not\n  // affected.\n  template <typename F>\n  Queue* Map(F function) const {\n    Queue* new_queue = new Queue();\n    for (const QueueNode<E>* node = head_; node != NULL; node = node->next_) {\n      new_queue->Enqueue(function(node->element()));\n    }\n\n    return new_queue;\n  }\n\n private:\n  QueueNode<E>* head_;  // The first node of the queue.\n  QueueNode<E>* last_;  // The last node of the queue.\n  size_t size_;  // The number of elements in the queue.\n\n  // We disallow copying a queue.\n  Queue(const Queue&);\n  const Queue& operator = (const Queue&);\n };\n\n#endif  // GTEST_SAMPLES_SAMPLE3_INL_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3_unittest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n\n// In this example, we use a more advanced feature of Google Test called\n// test fixture.\n//\n// A test fixture is a place to hold objects and functions shared by\n// all tests in a test case.  Using a test fixture avoids duplicating\n// the test code necessary to initialize and cleanup those common\n// objects for each test.  It is also useful for defining sub-routines\n// that your tests need to invoke a lot.\n//\n// <TechnicalDetails>\n//\n// The tests share the test fixture in the sense of code sharing, not\n// data sharing.  Each test is given its own fresh copy of the\n// fixture.  You cannot expect the data modified by one test to be\n// passed on to another test, which is a bad idea.\n//\n// The reason for this design is that tests should be independent and\n// repeatable.  In particular, a test should not fail as the result of\n// another test's failure.  If one test depends on info produced by\n// another test, then the two tests should really be one big test.\n//\n// The macros for indicating the success/failure of a test\n// (EXPECT_TRUE, FAIL, etc) need to know what the current test is\n// (when Google Test prints the test result, it tells you which test\n// each failure belongs to).  Technically, these macros invoke a\n// member function of the Test class.  Therefore, you cannot use them\n// in a global function.  That's why you should put test sub-routines\n// in a test fixture.\n//\n// </TechnicalDetails>\n\n#include \"sample3-inl.h\"\n#include <gtest/gtest.h>\n\n// To use a test fixture, derive a class from testing::Test.\nclass QueueTest : public testing::Test {\n protected:  // You should make the members protected s.t. they can be\n             // accessed from sub-classes.\n\n  // virtual void SetUp() will be called before each test is run.  You\n  // should define it if you need to initialize the varaibles.\n  // Otherwise, this can be skipped.\n  virtual void SetUp() {\n    q1_.Enqueue(1);\n    q2_.Enqueue(2);\n    q2_.Enqueue(3);\n  }\n\n  // virtual void TearDown() will be called after each test is run.\n  // You should define it if there is cleanup work to do.  Otherwise,\n  // you don't have to provide it.\n  //\n  // virtual void TearDown() {\n  // }\n\n  // A helper function that some test uses.\n  static int Double(int n) {\n    return 2*n;\n  }\n\n  // A helper function for testing Queue::Map().\n  void MapTester(const Queue<int> * q) {\n    // Creates a new queue, where each element is twice as big as the\n    // corresponding one in q.\n    const Queue<int> * const new_q = q->Map(Double);\n\n    // Verifies that the new queue has the same size as q.\n    ASSERT_EQ(q->Size(), new_q->Size());\n\n    // Verifies the relationship between the elements of the two queues.\n    for ( const QueueNode<int> * n1 = q->Head(), * n2 = new_q->Head();\n          n1 != NULL; n1 = n1->next(), n2 = n2->next() ) {\n      EXPECT_EQ(2 * n1->element(), n2->element());\n    }\n\n    delete new_q;\n  }\n\n  // Declares the variables your tests want to use.\n  Queue<int> q0_;\n  Queue<int> q1_;\n  Queue<int> q2_;\n};\n\n// When you have a test fixture, you define a test using TEST_F\n// instead of TEST.\n\n// Tests the default c'tor.\nTEST_F(QueueTest, DefaultConstructor) {\n  // You can access data in the test fixture here.\n  EXPECT_EQ(0u, q0_.Size());\n}\n\n// Tests Dequeue().\nTEST_F(QueueTest, Dequeue) {\n  int * n = q0_.Dequeue();\n  EXPECT_TRUE(n == NULL);\n\n  n = q1_.Dequeue();\n  ASSERT_TRUE(n != NULL);\n  EXPECT_EQ(1, *n);\n  EXPECT_EQ(0u, q1_.Size());\n  delete n;\n\n  n = q2_.Dequeue();\n  ASSERT_TRUE(n != NULL);\n  EXPECT_EQ(2, *n);\n  EXPECT_EQ(1u, q2_.Size());\n  delete n;\n}\n\n// Tests the Queue::Map() function.\nTEST_F(QueueTest, Map) {\n  MapTester(&q0_);\n  MapTester(&q1_);\n  MapTester(&q2_);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#include <stdio.h>\n\n#include \"sample4.h\"\n\n// Returns the current counter value, and increments it.\nint Counter::Increment() {\n  return counter_++;\n}\n\n// Prints the current counter value to STDOUT.\nvoid Counter::Print() const {\n  printf(\"%d\", counter_);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// A sample program demonstrating using Google C++ testing framework.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#ifndef GTEST_SAMPLES_SAMPLE4_H_\n#define GTEST_SAMPLES_SAMPLE4_H_\n\n// A simple monotonic counter.\nclass Counter {\n private:\n  int counter_;\n\n public:\n  // Creates a counter that starts at 0.\n  Counter() : counter_(0) {}\n\n  // Returns the current counter value, and increments it.\n  int Increment();\n\n  // Prints the current counter value to STDOUT.\n  void Print() const;\n};\n\n#endif  // GTEST_SAMPLES_SAMPLE4_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4_unittest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#include <gtest/gtest.h>\n#include \"sample4.h\"\n\n// Tests the Increment() method.\nTEST(Counter, Increment) {\n  Counter c;\n\n  // EXPECT_EQ() evaluates its arguments exactly once, so they\n  // can have side effects.\n\n  EXPECT_EQ(0, c.Increment());\n  EXPECT_EQ(1, c.Increment());\n  EXPECT_EQ(2, c.Increment());\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample5_unittest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// This sample teaches how to reuse a test fixture in multiple test\n// cases by deriving sub-fixtures from it.\n//\n// When you define a test fixture, you specify the name of the test\n// case that will use this fixture.  Therefore, a test fixture can\n// be used by only one test case.\n//\n// Sometimes, more than one test cases may want to use the same or\n// slightly different test fixtures.  For example, you may want to\n// make sure that all tests for a GUI library don't leak important\n// system resources like fonts and brushes.  In Google Test, you do\n// this by putting the shared logic in a super (as in \"super class\")\n// test fixture, and then have each test case use a fixture derived\n// from this super fixture.\n\n#include <limits.h>\n#include <time.h>\n#include \"sample3-inl.h\"\n#include <gtest/gtest.h>\n#include \"sample1.h\"\n\n// In this sample, we want to ensure that every test finishes within\n// ~5 seconds.  If a test takes longer to run, we consider it a\n// failure.\n//\n// We put the code for timing a test in a test fixture called\n// \"QuickTest\".  QuickTest is intended to be the super fixture that\n// other fixtures derive from, therefore there is no test case with\n// the name \"QuickTest\".  This is OK.\n//\n// Later, we will derive multiple test fixtures from QuickTest.\nclass QuickTest : public testing::Test {\n protected:\n  // Remember that SetUp() is run immediately before a test starts.\n  // This is a good place to record the start time.\n  virtual void SetUp() {\n    start_time_ = time(NULL);\n  }\n\n  // TearDown() is invoked immediately after a test finishes.  Here we\n  // check if the test was too slow.\n  virtual void TearDown() {\n    // Gets the time when the test finishes\n    const time_t end_time = time(NULL);\n\n    // Asserts that the test took no more than ~5 seconds.  Did you\n    // know that you can use assertions in SetUp() and TearDown() as\n    // well?\n    EXPECT_TRUE(end_time - start_time_ <= 5) << \"The test took too long.\";\n  }\n\n  // The UTC time (in seconds) when the test starts\n  time_t start_time_;\n};\n\n\n// We derive a fixture named IntegerFunctionTest from the QuickTest\n// fixture.  All tests using this fixture will be automatically\n// required to be quick.\nclass IntegerFunctionTest : public QuickTest {\n  // We don't need any more logic than already in the QuickTest fixture.\n  // Therefore the body is empty.\n};\n\n\n// Now we can write tests in the IntegerFunctionTest test case.\n\n// Tests Factorial()\nTEST_F(IntegerFunctionTest, Factorial) {\n  // Tests factorial of negative numbers.\n  EXPECT_EQ(1, Factorial(-5));\n  EXPECT_EQ(1, Factorial(-1));\n  EXPECT_TRUE(Factorial(-10) > 0);\n\n  // Tests factorial of 0.\n  EXPECT_EQ(1, Factorial(0));\n\n  // Tests factorial of positive numbers.\n  EXPECT_EQ(1, Factorial(1));\n  EXPECT_EQ(2, Factorial(2));\n  EXPECT_EQ(6, Factorial(3));\n  EXPECT_EQ(40320, Factorial(8));\n}\n\n\n// Tests IsPrime()\nTEST_F(IntegerFunctionTest, IsPrime) {\n  // Tests negative input.\n  EXPECT_TRUE(!IsPrime(-1));\n  EXPECT_TRUE(!IsPrime(-2));\n  EXPECT_TRUE(!IsPrime(INT_MIN));\n\n  // Tests some trivial cases.\n  EXPECT_TRUE(!IsPrime(0));\n  EXPECT_TRUE(!IsPrime(1));\n  EXPECT_TRUE(IsPrime(2));\n  EXPECT_TRUE(IsPrime(3));\n\n  // Tests positive input.\n  EXPECT_TRUE(!IsPrime(4));\n  EXPECT_TRUE(IsPrime(5));\n  EXPECT_TRUE(!IsPrime(6));\n  EXPECT_TRUE(IsPrime(23));\n}\n\n\n// The next test case (named \"QueueTest\") also needs to be quick, so\n// we derive another fixture from QuickTest.\n//\n// The QueueTest test fixture has some logic and shared objects in\n// addition to what's in QuickTest already.  We define the additional\n// stuff inside the body of the test fixture, as usual.\nclass QueueTest : public QuickTest {\n protected:\n  virtual void SetUp() {\n    // First, we need to set up the super fixture (QuickTest).\n    QuickTest::SetUp();\n\n    // Second, some additional setup for this fixture.\n    q1_.Enqueue(1);\n    q2_.Enqueue(2);\n    q2_.Enqueue(3);\n  }\n\n  // By default, TearDown() inherits the behavior of\n  // QuickTest::TearDown().  As we have no additional cleaning work\n  // for QueueTest, we omit it here.\n  //\n  // virtual void TearDown() {\n  //   QuickTest::TearDown();\n  // }\n\n  Queue<int> q0_;\n  Queue<int> q1_;\n  Queue<int> q2_;\n};\n\n\n// Now, let's write tests using the QueueTest fixture.\n\n// Tests the default constructor.\nTEST_F(QueueTest, DefaultConstructor) {\n  EXPECT_EQ(0u, q0_.Size());\n}\n\n// Tests Dequeue().\nTEST_F(QueueTest, Dequeue) {\n  int* n = q0_.Dequeue();\n  EXPECT_TRUE(n == NULL);\n\n  n = q1_.Dequeue();\n  EXPECT_TRUE(n != NULL);\n  EXPECT_EQ(1, *n);\n  EXPECT_EQ(0u, q1_.Size());\n  delete n;\n\n  n = q2_.Dequeue();\n  EXPECT_TRUE(n != NULL);\n  EXPECT_EQ(2, *n);\n  EXPECT_EQ(1u, q2_.Size());\n  delete n;\n}\n\n// If necessary, you can derive further test fixtures from a derived\n// fixture itself.  For example, you can derive another fixture from\n// QueueTest.  Google Test imposes no limit on how deep the hierarchy\n// can be.  In practice, however, you probably don't want it to be too\n// deep as to be confusing.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample6_unittest.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// This sample shows how to test common properties of multiple\n// implementations of the same interface (aka interface tests).\n\n// The interface and its implementations are in this header.\n#include \"prime_tables.h\"\n\n#include <gtest/gtest.h>\n\n// First, we define some factory functions for creating instances of\n// the implementations.  You may be able to skip this step if all your\n// implementations can be constructed the same way.\n\ntemplate <class T>\nPrimeTable* CreatePrimeTable();\n\ntemplate <>\nPrimeTable* CreatePrimeTable<OnTheFlyPrimeTable>() {\n  return new OnTheFlyPrimeTable;\n}\n\ntemplate <>\nPrimeTable* CreatePrimeTable<PreCalculatedPrimeTable>() {\n  return new PreCalculatedPrimeTable(10000);\n}\n\n// Then we define a test fixture class template.\ntemplate <class T>\nclass PrimeTableTest : public testing::Test {\n protected:\n  // The ctor calls the factory function to create a prime table\n  // implemented by T.\n  PrimeTableTest() : table_(CreatePrimeTable<T>()) {}\n\n  virtual ~PrimeTableTest() { delete table_; }\n\n  // Note that we test an implementation via the base interface\n  // instead of the actual implementation class.  This is important\n  // for keeping the tests close to the real world scenario, where the\n  // implementation is invoked via the base interface.  It avoids\n  // got-yas where the implementation class has a method that shadows\n  // a method with the same name (but slightly different argument\n  // types) in the base interface, for example.\n  PrimeTable* const table_;\n};\n\n#if GTEST_HAS_TYPED_TEST\n\nusing testing::Types;\n\n// Google Test offers two ways for reusing tests for different types.\n// The first is called \"typed tests\".  You should use it if you\n// already know *all* the types you are gonna exercise when you write\n// the tests.\n\n// To write a typed test case, first use\n//\n//   TYPED_TEST_CASE(TestCaseName, TypeList);\n//\n// to declare it and specify the type parameters.  As with TEST_F,\n// TestCaseName must match the test fixture name.\n\n// The list of types we want to test.\ntypedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable> Implementations;\n\nTYPED_TEST_CASE(PrimeTableTest, Implementations);\n\n// Then use TYPED_TEST(TestCaseName, TestName) to define a typed test,\n// similar to TEST_F.\nTYPED_TEST(PrimeTableTest, ReturnsFalseForNonPrimes) {\n  // Inside the test body, you can refer to the type parameter by\n  // TypeParam, and refer to the fixture class by TestFixture.  We\n  // don't need them in this example.\n\n  // Since we are in the template world, C++ requires explicitly\n  // writing 'this->' when referring to members of the fixture class.\n  // This is something you have to learn to live with.\n  EXPECT_FALSE(this->table_->IsPrime(-5));\n  EXPECT_FALSE(this->table_->IsPrime(0));\n  EXPECT_FALSE(this->table_->IsPrime(1));\n  EXPECT_FALSE(this->table_->IsPrime(4));\n  EXPECT_FALSE(this->table_->IsPrime(6));\n  EXPECT_FALSE(this->table_->IsPrime(100));\n}\n\nTYPED_TEST(PrimeTableTest, ReturnsTrueForPrimes) {\n  EXPECT_TRUE(this->table_->IsPrime(2));\n  EXPECT_TRUE(this->table_->IsPrime(3));\n  EXPECT_TRUE(this->table_->IsPrime(5));\n  EXPECT_TRUE(this->table_->IsPrime(7));\n  EXPECT_TRUE(this->table_->IsPrime(11));\n  EXPECT_TRUE(this->table_->IsPrime(131));\n}\n\nTYPED_TEST(PrimeTableTest, CanGetNextPrime) {\n  EXPECT_EQ(2, this->table_->GetNextPrime(0));\n  EXPECT_EQ(3, this->table_->GetNextPrime(2));\n  EXPECT_EQ(5, this->table_->GetNextPrime(3));\n  EXPECT_EQ(7, this->table_->GetNextPrime(5));\n  EXPECT_EQ(11, this->table_->GetNextPrime(7));\n  EXPECT_EQ(131, this->table_->GetNextPrime(128));\n}\n\n// That's it!  Google Test will repeat each TYPED_TEST for each type\n// in the type list specified in TYPED_TEST_CASE.  Sit back and be\n// happy that you don't have to define them multiple times.\n\n#endif  // GTEST_HAS_TYPED_TEST\n\n#if GTEST_HAS_TYPED_TEST_P\n\nusing testing::Types;\n\n// Sometimes, however, you don't yet know all the types that you want\n// to test when you write the tests.  For example, if you are the\n// author of an interface and expect other people to implement it, you\n// might want to write a set of tests to make sure each implementation\n// conforms to some basic requirements, but you don't know what\n// implementations will be written in the future.\n//\n// How can you write the tests without committing to the type\n// parameters?  That's what \"type-parameterized tests\" can do for you.\n// It is a bit more involved than typed tests, but in return you get a\n// test pattern that can be reused in many contexts, which is a big\n// win.  Here's how you do it:\n\n// First, define a test fixture class template.  Here we just reuse\n// the PrimeTableTest fixture defined earlier:\n\ntemplate <class T>\nclass PrimeTableTest2 : public PrimeTableTest<T> {\n};\n\n// Then, declare the test case.  The argument is the name of the test\n// fixture, and also the name of the test case (as usual).  The _P\n// suffix is for \"parameterized\" or \"pattern\".\nTYPED_TEST_CASE_P(PrimeTableTest2);\n\n// Next, use TYPED_TEST_P(TestCaseName, TestName) to define a test,\n// similar to what you do with TEST_F.\nTYPED_TEST_P(PrimeTableTest2, ReturnsFalseForNonPrimes) {\n  EXPECT_FALSE(this->table_->IsPrime(-5));\n  EXPECT_FALSE(this->table_->IsPrime(0));\n  EXPECT_FALSE(this->table_->IsPrime(1));\n  EXPECT_FALSE(this->table_->IsPrime(4));\n  EXPECT_FALSE(this->table_->IsPrime(6));\n  EXPECT_FALSE(this->table_->IsPrime(100));\n}\n\nTYPED_TEST_P(PrimeTableTest2, ReturnsTrueForPrimes) {\n  EXPECT_TRUE(this->table_->IsPrime(2));\n  EXPECT_TRUE(this->table_->IsPrime(3));\n  EXPECT_TRUE(this->table_->IsPrime(5));\n  EXPECT_TRUE(this->table_->IsPrime(7));\n  EXPECT_TRUE(this->table_->IsPrime(11));\n  EXPECT_TRUE(this->table_->IsPrime(131));\n}\n\nTYPED_TEST_P(PrimeTableTest2, CanGetNextPrime) {\n  EXPECT_EQ(2, this->table_->GetNextPrime(0));\n  EXPECT_EQ(3, this->table_->GetNextPrime(2));\n  EXPECT_EQ(5, this->table_->GetNextPrime(3));\n  EXPECT_EQ(7, this->table_->GetNextPrime(5));\n  EXPECT_EQ(11, this->table_->GetNextPrime(7));\n  EXPECT_EQ(131, this->table_->GetNextPrime(128));\n}\n\n// Type-parameterized tests involve one extra step: you have to\n// enumerate the tests you defined:\nREGISTER_TYPED_TEST_CASE_P(\n    PrimeTableTest2,  // The first argument is the test case name.\n    // The rest of the arguments are the test names.\n    ReturnsFalseForNonPrimes, ReturnsTrueForPrimes, CanGetNextPrime);\n\n// At this point the test pattern is done.  However, you don't have\n// any real test yet as you haven't said which types you want to run\n// the tests with.\n\n// To turn the abstract test pattern into real tests, you instantiate\n// it with a list of types.  Usually the test pattern will be defined\n// in a .h file, and anyone can #include and instantiate it.  You can\n// even instantiate it more than once in the same program.  To tell\n// different instances apart, you give each of them a name, which will\n// become part of the test case name and can be used in test filters.\n\n// The list of types we want to test.  Note that it doesn't have to be\n// defined at the time we write the TYPED_TEST_P()s.\ntypedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable>\n    PrimeTableImplementations;\nINSTANTIATE_TYPED_TEST_CASE_P(OnTheFlyAndPreCalculated,    // Instance name\n                              PrimeTableTest2,             // Test case name\n                              PrimeTableImplementations);  // Type list\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample7_unittest.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: vladl@google.com (Vlad Losev)\n\n// This sample shows how to test common properties of multiple\n// implementations of an interface (aka interface tests) using\n// value-parameterized tests. Each test in the test case has\n// a parameter that is an interface pointer to an implementation\n// tested.\n\n// The interface and its implementations are in this header.\n#include \"prime_tables.h\"\n\n#include <gtest/gtest.h>\n\n#if GTEST_HAS_PARAM_TEST\n\nusing ::testing::TestWithParam;\nusing ::testing::Values;\n\n// As a general rule, tested objects should not be reused between tests.\n// Also, their constructors and destructors of tested objects can have\n// side effects. Thus you should create and destroy them for each test.\n// In this sample we will define a simple factory function for PrimeTable\n// objects. We will instantiate objects in test's SetUp() method and\n// delete them in TearDown() method.\ntypedef PrimeTable* CreatePrimeTableFunc();\n\nPrimeTable* CreateOnTheFlyPrimeTable() {\n  return new OnTheFlyPrimeTable();\n}\n\ntemplate <size_t max_precalculated>\nPrimeTable* CreatePreCalculatedPrimeTable() {\n  return new PreCalculatedPrimeTable(max_precalculated);\n}\n\n// Inside the test body, fixture constructor, SetUp(), and TearDown()\n// you can refer to the test parameter by GetParam().\n// In this case, the test parameter is a PrimeTableFactory interface pointer\n// which we use in fixture's SetUp() to create and store an instance of\n// PrimeTable.\nclass PrimeTableTest : public TestWithParam<CreatePrimeTableFunc*> {\n public:\n  virtual ~PrimeTableTest() { delete table_; }\n  virtual void SetUp() { table_ = (*GetParam())(); }\n  virtual void TearDown() {\n    delete table_;\n    table_ = NULL;\n  }\n\n protected:\n  PrimeTable* table_;\n};\n\nTEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {\n  EXPECT_FALSE(table_->IsPrime(-5));\n  EXPECT_FALSE(table_->IsPrime(0));\n  EXPECT_FALSE(table_->IsPrime(1));\n  EXPECT_FALSE(table_->IsPrime(4));\n  EXPECT_FALSE(table_->IsPrime(6));\n  EXPECT_FALSE(table_->IsPrime(100));\n}\n\nTEST_P(PrimeTableTest, ReturnsTrueForPrimes) {\n  EXPECT_TRUE(table_->IsPrime(2));\n  EXPECT_TRUE(table_->IsPrime(3));\n  EXPECT_TRUE(table_->IsPrime(5));\n  EXPECT_TRUE(table_->IsPrime(7));\n  EXPECT_TRUE(table_->IsPrime(11));\n  EXPECT_TRUE(table_->IsPrime(131));\n}\n\nTEST_P(PrimeTableTest, CanGetNextPrime) {\n  EXPECT_EQ(2, table_->GetNextPrime(0));\n  EXPECT_EQ(3, table_->GetNextPrime(2));\n  EXPECT_EQ(5, table_->GetNextPrime(3));\n  EXPECT_EQ(7, table_->GetNextPrime(5));\n  EXPECT_EQ(11, table_->GetNextPrime(7));\n  EXPECT_EQ(131, table_->GetNextPrime(128));\n}\n\n// In order to run value-parameterized tests, you need to instantiate them,\n// or bind them to a list of values which will be used as test parameters.\n// You can instantiate them in a different translation module, or even\n// instantiate them several times.\n//\n// Here, we instantiate our tests with a list of two PrimeTable object\n// factory functions:\nINSTANTIATE_TEST_CASE_P(\n    OnTheFlyAndPreCalculated,\n    PrimeTableTest,\n    Values(&CreateOnTheFlyPrimeTable, &CreatePreCalculatedPrimeTable<1000>));\n\n#else\n\n// Google Test may not support value-parameterized tests with some\n// compilers. If we use conditional compilation to compile out all\n// code referring to the gtest_main library, MSVC linker will not link\n// that library at all and consequently complain about missing entry\n// point defined in that library (fatal error LNK1561: entry point\n// must be defined). This dummy test keeps gtest_main linked in.\nTEST(DummyTest, ValueParameterizedTestsAreNotSupportedOnThisPlatform) {}\n\n#endif  // GTEST_HAS_PARAM_TEST\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample8_unittest.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: vladl@google.com (Vlad Losev)\n\n// This sample shows how to test code relying on some global flag variables.\n// Combine() helps with generating all possible combinations of such flags,\n// and each test is given one combination as a parameter.\n\n// Use class definitions to test from this header.\n#include \"prime_tables.h\"\n\n#include <gtest/gtest.h>\n\n#if GTEST_HAS_COMBINE\n\n// Suppose we want to introduce a new, improved implementation of PrimeTable\n// which combines speed of PrecalcPrimeTable and versatility of\n// OnTheFlyPrimeTable (see prime_tables.h). Inside it instantiates both\n// PrecalcPrimeTable and OnTheFlyPrimeTable and uses the one that is more\n// appropriate under the circumstances. But in low memory conditions, it can be\n// told to instantiate without PrecalcPrimeTable instance at all and use only\n// OnTheFlyPrimeTable.\nclass HybridPrimeTable : public PrimeTable {\n public:\n  HybridPrimeTable(bool force_on_the_fly, int max_precalculated)\n      : on_the_fly_impl_(new OnTheFlyPrimeTable),\n        precalc_impl_(force_on_the_fly ? NULL :\n                          new PreCalculatedPrimeTable(max_precalculated)),\n        max_precalculated_(max_precalculated) {}\n  virtual ~HybridPrimeTable() {\n    delete on_the_fly_impl_;\n    delete precalc_impl_;\n  }\n\n  virtual bool IsPrime(int n) const {\n    if (precalc_impl_ != NULL && n < max_precalculated_)\n      return precalc_impl_->IsPrime(n);\n    else\n      return on_the_fly_impl_->IsPrime(n);\n  }\n\n  virtual int GetNextPrime(int p) const {\n    int next_prime = -1;\n    if (precalc_impl_ != NULL && p < max_precalculated_)\n      next_prime = precalc_impl_->GetNextPrime(p);\n\n    return next_prime != -1 ? next_prime : on_the_fly_impl_->GetNextPrime(p);\n  }\n\n private:\n  OnTheFlyPrimeTable* on_the_fly_impl_;\n  PreCalculatedPrimeTable* precalc_impl_;\n  int max_precalculated_;\n};\n\nusing ::testing::TestWithParam;\nusing ::testing::Bool;\nusing ::testing::Values;\nusing ::testing::Combine;\n\n// To test all code paths for HybridPrimeTable we must test it with numbers\n// both within and outside PreCalculatedPrimeTable's capacity and also with\n// PreCalculatedPrimeTable disabled. We do this by defining fixture which will\n// accept different combinations of parameters for instantiating a\n// HybridPrimeTable instance.\nclass PrimeTableTest : public TestWithParam< ::std::tr1::tuple<bool, int> > {\n protected:\n  virtual void SetUp() {\n    // This can be written as\n    //\n    // bool force_on_the_fly;\n    // int max_precalculated;\n    // tie(force_on_the_fly, max_precalculated) = GetParam();\n    //\n    // once the Google C++ Style Guide allows use of ::std::tr1::tie.\n    //\n    bool force_on_the_fly = ::std::tr1::get<0>(GetParam());\n    int max_precalculated = ::std::tr1::get<1>(GetParam());\n    table_ = new HybridPrimeTable(force_on_the_fly, max_precalculated);\n  }\n  virtual void TearDown() {\n    delete table_;\n    table_ = NULL;\n  }\n  HybridPrimeTable* table_;\n};\n\nTEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {\n  // Inside the test body, you can refer to the test parameter by GetParam().\n  // In this case, the test parameter is a PrimeTable interface pointer which\n  // we can use directly.\n  // Please note that you can also save it in the fixture's SetUp() method\n  // or constructor and use saved copy in the tests.\n\n  EXPECT_FALSE(table_->IsPrime(-5));\n  EXPECT_FALSE(table_->IsPrime(0));\n  EXPECT_FALSE(table_->IsPrime(1));\n  EXPECT_FALSE(table_->IsPrime(4));\n  EXPECT_FALSE(table_->IsPrime(6));\n  EXPECT_FALSE(table_->IsPrime(100));\n}\n\nTEST_P(PrimeTableTest, ReturnsTrueForPrimes) {\n  EXPECT_TRUE(table_->IsPrime(2));\n  EXPECT_TRUE(table_->IsPrime(3));\n  EXPECT_TRUE(table_->IsPrime(5));\n  EXPECT_TRUE(table_->IsPrime(7));\n  EXPECT_TRUE(table_->IsPrime(11));\n  EXPECT_TRUE(table_->IsPrime(131));\n}\n\nTEST_P(PrimeTableTest, CanGetNextPrime) {\n  EXPECT_EQ(2, table_->GetNextPrime(0));\n  EXPECT_EQ(3, table_->GetNextPrime(2));\n  EXPECT_EQ(5, table_->GetNextPrime(3));\n  EXPECT_EQ(7, table_->GetNextPrime(5));\n  EXPECT_EQ(11, table_->GetNextPrime(7));\n  EXPECT_EQ(131, table_->GetNextPrime(128));\n}\n\n// In order to run value-parameterized tests, you need to instantiate them,\n// or bind them to a list of values which will be used as test parameters.\n// You can instantiate them in a different translation module, or even\n// instantiate them several times.\n//\n// Here, we instantiate our tests with a list of parameters. We must combine\n// all variations of the boolean flag suppressing PrecalcPrimeTable and some\n// meaningful values for tests. We choose a small value (1), and a value that\n// will put some of the tested numbers beyond the capability of the\n// PrecalcPrimeTable instance and some inside it (10). Combine will produce all\n// possible combinations.\nINSTANTIATE_TEST_CASE_P(MeaningfulTestParameters,\n                        PrimeTableTest,\n                        Combine(Bool(), Values(1, 10)));\n\n#else\n\n// Google Test may not support Combine() with some compilers. If we\n// use conditional compilation to compile out all code referring to\n// the gtest_main library, MSVC linker will not link that library at\n// all and consequently complain about missing entry point defined in\n// that library (fatal error LNK1561: entry point must be\n// defined). This dummy test keeps gtest_main linked in.\nTEST(DummyTest, CombineIsNotSupportedOnThisPlatform) {}\n\n#endif  // GTEST_HAS_COMBINE\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample9_unittest.cc",
    "content": "// Copyright 2009 Google Inc. All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: vladl@google.com (Vlad Losev)\n\n// This sample shows how to use Google Test listener API to implement\n// an alternative console output and how to use the UnitTest reflection API\n// to enumerate test cases and tests and to inspect their results.\n\n#include <stdio.h>\n\n#include <gtest/gtest.h>\n\nusing ::testing::EmptyTestEventListener;\nusing ::testing::InitGoogleTest;\nusing ::testing::Test;\nusing ::testing::TestCase;\nusing ::testing::TestEventListeners;\nusing ::testing::TestInfo;\nusing ::testing::TestPartResult;\nusing ::testing::UnitTest;\n\nnamespace {\n\n// Provides alternative output mode which produces minimal amount of\n// information about tests.\nclass TersePrinter : public EmptyTestEventListener {\n private:\n  // Called before any test activity starts.\n  virtual void OnTestProgramStart(const UnitTest& /* unit_test */) {}\n\n  // Called after all test activities have ended.\n  virtual void OnTestProgramEnd(const UnitTest& unit_test) {\n    fprintf(stdout, \"TEST %s\\n\", unit_test.Passed() ? \"PASSED\" : \"FAILED\");\n    fflush(stdout);\n  }\n\n  // Called before a test starts.\n  virtual void OnTestStart(const TestInfo& test_info) {\n    fprintf(stdout,\n            \"*** Test %s.%s starting.\\n\",\n            test_info.test_case_name(),\n            test_info.name());\n    fflush(stdout);\n  }\n\n  // Called after a failed assertion or a SUCCESS().\n  virtual void OnTestPartResult(const TestPartResult& test_part_result) {\n    fprintf(stdout,\n            \"%s in %s:%d\\n%s\\n\",\n            test_part_result.failed() ? \"*** Failure\" : \"Success\",\n            test_part_result.file_name(),\n            test_part_result.line_number(),\n            test_part_result.summary());\n    fflush(stdout);\n  }\n\n  // Called after a test ends.\n  virtual void OnTestEnd(const TestInfo& test_info) {\n    fprintf(stdout,\n            \"*** Test %s.%s ending.\\n\",\n            test_info.test_case_name(),\n            test_info.name());\n    fflush(stdout);\n  }\n};  // class TersePrinter\n\nTEST(CustomOutputTest, PrintsMessage) {\n  printf(\"Printing something from the test body...\\n\");\n}\n\nTEST(CustomOutputTest, Succeeds) {\n  SUCCEED() << \"SUCCEED() has been invoked from here\";\n}\n\nTEST(CustomOutputTest, Fails) {\n  EXPECT_EQ(1, 2)\n      << \"This test fails in order to demonstrate alternative failure messages\";\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  InitGoogleTest(&argc, argv);\n\n  bool terse_output = false;\n  if (argc > 1 && strcmp(argv[1], \"--terse_output\") == 0 )\n    terse_output = true;\n  else\n    printf(\"%s\\n\", \"Run this program with --terse_output to change the way \"\n           \"it prints its output.\");\n\n  UnitTest& unit_test = *UnitTest::GetInstance();\n\n  // If we are given the --terse_output command line flag, suppresses the\n  // standard output and attaches own result printer.\n  if (terse_output) {\n    TestEventListeners& listeners = unit_test.listeners();\n\n    // Removes the default console output listener from the list so it will\n    // not receive events from Google Test and won't print any output. Since\n    // this operation transfers ownership of the listener to the caller we\n    // have to delete it as well.\n    delete listeners.Release(listeners.default_result_printer());\n\n    // Adds the custom output listener to the list. It will now receive\n    // events from Google Test and print the alternative output. We don't\n    // have to worry about deleting it since Google Test assumes ownership\n    // over it after adding it to the list.\n    listeners.Append(new TersePrinter);\n  }\n  int ret_val = RUN_ALL_TESTS();\n\n  // This is an example of using the UnitTest reflection API to inspect test\n  // results. Here we discount failures from the tests we expected to fail.\n  int unexpectedly_failed_tests = 0;\n  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {\n    const TestCase& test_case = *unit_test.GetTestCase(i);\n    for (int j = 0; j < test_case.total_test_count(); ++j) {\n      const TestInfo& test_info = *test_case.GetTestInfo(j);\n      // Counts failed tests that were not meant to fail (those without\n      // 'Fails' in the name).\n      if (test_info.result()->Failed() &&\n          strcmp(test_info.name(), \"Fails\") != 0) {\n        unexpectedly_failed_tests++;\n      }\n    }\n  }\n\n  // Test that were meant to fail should not affect the test program outcome.\n  if (unexpectedly_failed_tests == 0)\n    ret_val = 0;\n\n  return ret_val;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/fuse_gtest_files.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"fuse_gtest_files.py v0.2.0\nFuses Google Test source code into a .h file and a .cc file.\n\nSYNOPSIS\n       fuse_gtest_files.py [GTEST_ROOT_DIR] OUTPUT_DIR\n\n       Scans GTEST_ROOT_DIR for Google Test source code, and generates\n       two files: OUTPUT_DIR/gtest/gtest.h and OUTPUT_DIR/gtest/gtest-all.cc.\n       Then you can build your tests by adding OUTPUT_DIR to the include\n       search path and linking with OUTPUT_DIR/gtest/gtest-all.cc.  These\n       two files contain everything you need to use Google Test.  Hence\n       you can \"install\" Google Test by copying them to wherever you want.\n\n       GTEST_ROOT_DIR can be omitted and defaults to the parent\n       directory of the directory holding this script.\n\nEXAMPLES\n       ./fuse_gtest_files.py fused_gtest\n       ./fuse_gtest_files.py path/to/unpacked/gtest fused_gtest\n\nThis tool is experimental.  In particular, it assumes that there is no\nconditional inclusion of Google Test headers.  Please report any\nproblems to googletestframework@googlegroups.com.  You can read\nhttp://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide for\nmore information.\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport re\nimport sets\nimport sys\n\n# We assume that this file is in the scripts/ directory in the Google\n# Test root directory.\nDEFAULT_GTEST_ROOT_DIR = os.path.join(os.path.dirname(__file__), '..')\n\n# Regex for matching '#include <gtest/...>'.\nINCLUDE_GTEST_FILE_REGEX = re.compile(r'^\\s*#\\s*include\\s*<(gtest/.+)>')\n\n# Regex for matching '#include \"src/...\"'.\nINCLUDE_SRC_FILE_REGEX = re.compile(r'^\\s*#\\s*include\\s*\"(src/.+)\"')\n\n# Where to find the source seed files.\nGTEST_H_SEED = 'include/gtest/gtest.h'\nGTEST_SPI_H_SEED = 'include/gtest/gtest-spi.h'\nGTEST_ALL_CC_SEED = 'src/gtest-all.cc'\n\n# Where to put the generated files.\nGTEST_H_OUTPUT = 'gtest/gtest.h'\nGTEST_ALL_CC_OUTPUT = 'gtest/gtest-all.cc'\n\n\ndef VerifyFileExists(directory, relative_path):\n  \"\"\"Verifies that the given file exists; aborts on failure.\n\n  relative_path is the file path relative to the given directory.\n  \"\"\"\n\n  if not os.path.isfile(os.path.join(directory, relative_path)):\n    print 'ERROR: Cannot find %s in directory %s.' % (relative_path,\n                                                      directory)\n    print ('Please either specify a valid project root directory '\n           'or omit it on the command line.')\n    sys.exit(1)\n\n\ndef ValidateGTestRootDir(gtest_root):\n  \"\"\"Makes sure gtest_root points to a valid gtest root directory.\n\n  The function aborts the program on failure.\n  \"\"\"\n\n  VerifyFileExists(gtest_root, GTEST_H_SEED)\n  VerifyFileExists(gtest_root, GTEST_ALL_CC_SEED)\n\n\ndef VerifyOutputFile(output_dir, relative_path):\n  \"\"\"Verifies that the given output file path is valid.\n\n  relative_path is relative to the output_dir directory.\n  \"\"\"\n\n  # Makes sure the output file either doesn't exist or can be overwritten.\n  output_file = os.path.join(output_dir, relative_path)\n  if os.path.exists(output_file):\n    # TODO(wan@google.com): The following user-interaction doesn't\n    # work with automated processes.  We should provide a way for the\n    # Makefile to force overwriting the files.\n    print ('%s already exists in directory %s - overwrite it? (y/N) ' %\n           (relative_path, output_dir))\n    answer = sys.stdin.readline().strip()\n    if answer not in ['y', 'Y']:\n      print 'ABORTED.'\n      sys.exit(1)\n\n  # Makes sure the directory holding the output file exists; creates\n  # it and all its ancestors if necessary.\n  parent_directory = os.path.dirname(output_file)\n  if not os.path.isdir(parent_directory):\n    os.makedirs(parent_directory)\n\n\ndef ValidateOutputDir(output_dir):\n  \"\"\"Makes sure output_dir points to a valid output directory.\n\n  The function aborts the program on failure.\n  \"\"\"\n\n  VerifyOutputFile(output_dir, GTEST_H_OUTPUT)\n  VerifyOutputFile(output_dir, GTEST_ALL_CC_OUTPUT)\n\n\ndef FuseGTestH(gtest_root, output_dir):\n  \"\"\"Scans folder gtest_root to generate gtest/gtest.h in output_dir.\"\"\"\n\n  output_file = file(os.path.join(output_dir, GTEST_H_OUTPUT), 'w')\n  processed_files = sets.Set()  # Holds all gtest headers we've processed.\n\n  def ProcessFile(gtest_header_path):\n    \"\"\"Processes the given gtest header file.\"\"\"\n\n    # We don't process the same header twice.\n    if gtest_header_path in processed_files:\n      return\n\n    processed_files.add(gtest_header_path)\n\n    # Reads each line in the given gtest header.\n    for line in file(os.path.join(gtest_root, gtest_header_path), 'r'):\n      m = INCLUDE_GTEST_FILE_REGEX.match(line)\n      if m:\n        # It's '#include <gtest/...>' - let's process it recursively.\n        ProcessFile('include/' + m.group(1))\n      else:\n        # Otherwise we copy the line unchanged to the output file.\n        output_file.write(line)\n\n  ProcessFile(GTEST_H_SEED)\n  output_file.close()\n\n\ndef FuseGTestAllCcToFile(gtest_root, output_file):\n  \"\"\"Scans folder gtest_root to generate gtest/gtest-all.cc in output_file.\"\"\"\n\n  processed_files = sets.Set()\n\n  def ProcessFile(gtest_source_file):\n    \"\"\"Processes the given gtest source file.\"\"\"\n\n    # We don't process the same #included file twice.\n    if gtest_source_file in processed_files:\n      return\n\n    processed_files.add(gtest_source_file)\n\n    # Reads each line in the given gtest source file.\n    for line in file(os.path.join(gtest_root, gtest_source_file), 'r'):\n      m = INCLUDE_GTEST_FILE_REGEX.match(line)\n      if m:\n        if 'include/' + m.group(1) == GTEST_SPI_H_SEED:\n          # It's '#include <gtest/gtest-spi.h>'.  This file is not\n          # #included by <gtest/gtest.h>, so we need to process it.\n          ProcessFile(GTEST_SPI_H_SEED)\n        else:\n          # It's '#include <gtest/foo.h>' where foo is not gtest-spi.\n          # We treat it as '#include <gtest/gtest.h>', as all other\n          # gtest headers are being fused into gtest.h and cannot be\n          # #included directly.\n\n          # There is no need to #include <gtest/gtest.h> more than once.\n          if not GTEST_H_SEED in processed_files:\n            processed_files.add(GTEST_H_SEED)\n            output_file.write('#include <%s>\\n' % (GTEST_H_OUTPUT,))\n      else:\n        m = INCLUDE_SRC_FILE_REGEX.match(line)\n        if m:\n          # It's '#include \"src/foo\"' - let's process it recursively.\n          ProcessFile(m.group(1))\n        else:\n          output_file.write(line)\n\n  ProcessFile(GTEST_ALL_CC_SEED)\n\n\ndef FuseGTestAllCc(gtest_root, output_dir):\n  \"\"\"Scans folder gtest_root to generate gtest/gtest-all.cc in output_dir.\"\"\"\n\n  output_file = file(os.path.join(output_dir, GTEST_ALL_CC_OUTPUT), 'w')\n  FuseGTestAllCcToFile(gtest_root, output_file)\n  output_file.close()\n\n\ndef FuseGTest(gtest_root, output_dir):\n  \"\"\"Fuses gtest.h and gtest-all.cc.\"\"\"\n\n  ValidateGTestRootDir(gtest_root)\n  ValidateOutputDir(output_dir)\n\n  FuseGTestH(gtest_root, output_dir)\n  FuseGTestAllCc(gtest_root, output_dir)\n\n\ndef main():\n  argc = len(sys.argv)\n  if argc == 2:\n    # fuse_gtest_files.py OUTPUT_DIR\n    FuseGTest(DEFAULT_GTEST_ROOT_DIR, sys.argv[1])\n  elif argc == 3:\n    # fuse_gtest_files.py GTEST_ROOT_DIR OUTPUT_DIR\n    FuseGTest(sys.argv[1], sys.argv[2])\n  else:\n    print __doc__\n    sys.exit(1)\n\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gen_gtest_pred_impl.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"gen_gtest_pred_impl.py v0.1\n\nGenerates the implementation of Google Test predicate assertions and\naccompanying tests.\n\nUsage:\n\n  gen_gtest_pred_impl.py MAX_ARITY\n\nwhere MAX_ARITY is a positive integer.\n\nThe command generates the implementation of up-to MAX_ARITY-ary\npredicate assertions, and writes it to file gtest_pred_impl.h in the\ndirectory where the script is.  It also generates the accompanying\nunit test in file gtest_pred_impl_unittest.cc.\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport sys\nimport time\n\n# Where this script is.\nSCRIPT_DIR = os.path.dirname(sys.argv[0])\n\n# Where to store the generated header.\nHEADER = os.path.join(SCRIPT_DIR, '../include/gtest/gtest_pred_impl.h')\n\n# Where to store the generated unit test.\nUNIT_TEST = os.path.join(SCRIPT_DIR, '../test/gtest_pred_impl_unittest.cc')\n\n\ndef HeaderPreamble(n):\n  \"\"\"Returns the preamble for the header file.\n\n  Args:\n    n:  the maximum arity of the predicate macros to be generated.\n  \"\"\"\n\n  # A map that defines the values used in the preamble template.\n  DEFS = {\n    'today' : time.strftime('%m/%d/%Y'),\n    'year' : time.strftime('%Y'),\n    'command' : '%s %s' % (os.path.basename(sys.argv[0]), n),\n    'n' : n\n    }\n\n  return (\n\"\"\"// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This file is AUTOMATICALLY GENERATED on %(today)s by command\n// '%(command)s'.  DO NOT EDIT BY HAND!\n//\n// Implements a family of generic predicate assertion macros.\n\n#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n\n// Makes sure this header is not included before gtest.h.\n#ifndef GTEST_INCLUDE_GTEST_GTEST_H_\n#error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.\n#endif  // GTEST_INCLUDE_GTEST_GTEST_H_\n\n// This header implements a family of generic predicate assertion\n// macros:\n//\n//   ASSERT_PRED_FORMAT1(pred_format, v1)\n//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)\n//   ...\n//\n// where pred_format is a function or functor that takes n (in the\n// case of ASSERT_PRED_FORMATn) values and their source expression\n// text, and returns a testing::AssertionResult.  See the definition\n// of ASSERT_EQ in gtest.h for an example.\n//\n// If you don't care about formatting, you can use the more\n// restrictive version:\n//\n//   ASSERT_PRED1(pred, v1)\n//   ASSERT_PRED2(pred, v1, v2)\n//   ...\n//\n// where pred is an n-ary function or functor that returns bool,\n// and the values v1, v2, ..., must support the << operator for\n// streaming to std::ostream.\n//\n// We also define the EXPECT_* variations.\n//\n// For now we only support predicates whose arity is at most %(n)s.\n// Please email googletestframework@googlegroups.com if you need\n// support for higher arities.\n\n// GTEST_ASSERT_ is the basic statement to which all of the assertions\n// in this file reduce.  Don't use this in your code.\n\n#define GTEST_ASSERT_(expression, on_failure) \\\\\n  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\\\\n  if (const ::testing::AssertionResult gtest_ar = (expression)) \\\\\n    ; \\\\\n  else \\\\\n    on_failure(gtest_ar.failure_message())\n\"\"\" % DEFS)\n\n\ndef Arity(n):\n  \"\"\"Returns the English name of the given arity.\"\"\"\n\n  if n < 0:\n    return None\n  elif n <= 3:\n    return ['nullary', 'unary', 'binary', 'ternary'][n]\n  else:\n    return '%s-ary' % n\n\n\ndef Title(word):\n  \"\"\"Returns the given word in title case.  The difference between\n  this and string's title() method is that Title('4-ary') is '4-ary'\n  while '4-ary'.title() is '4-Ary'.\"\"\"\n\n  return word[0].upper() + word[1:]\n\n\ndef OneTo(n):\n  \"\"\"Returns the list [1, 2, 3, ..., n].\"\"\"\n\n  return range(1, n + 1)\n\n\ndef Iter(n, format, sep=''):\n  \"\"\"Given a positive integer n, a format string that contains 0 or\n  more '%s' format specs, and optionally a separator string, returns\n  the join of n strings, each formatted with the format string on an\n  iterator ranged from 1 to n.\n\n  Example:\n\n  Iter(3, 'v%s', sep=', ') returns 'v1, v2, v3'.\n  \"\"\"\n\n  # How many '%s' specs are in format?\n  spec_count = len(format.split('%s')) - 1\n  return sep.join([format % (spec_count * (i,)) for i in OneTo(n)])\n\n\ndef ImplementationForArity(n):\n  \"\"\"Returns the implementation of n-ary predicate assertions.\"\"\"\n\n  # A map the defines the values used in the implementation template.\n  DEFS = {\n    'n' : str(n),\n    'vs' : Iter(n, 'v%s', sep=', '),\n    'vts' : Iter(n, '#v%s', sep=', '),\n    'arity' : Arity(n),\n    'Arity' : Title(Arity(n))\n    }\n\n  impl = \"\"\"\n\n// Helper function for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use\n// this in your code.\ntemplate <typename Pred\"\"\" % DEFS\n\n  impl += Iter(n, \"\"\",\n          typename T%s\"\"\")\n\n  impl += \"\"\">\nAssertionResult AssertPred%(n)sHelper(const char* pred_text\"\"\" % DEFS\n\n  impl += Iter(n, \"\"\",\n                                  const char* e%s\"\"\")\n\n  impl += \"\"\",\n                                  Pred pred\"\"\"\n\n  impl += Iter(n, \"\"\",\n                                  const T%s& v%s\"\"\")\n\n  impl += \"\"\") {\n  if (pred(%(vs)s)) return AssertionSuccess();\n\n  Message msg;\n\"\"\" % DEFS\n\n  impl += '  msg << pred_text << \"(\"'\n\n  impl += Iter(n, \"\"\"\n      << e%s\"\"\", sep=' << \", \"')\n\n  impl += ' << \") evaluates to false, where\"'\n\n  impl += Iter(n, \"\"\"\n      << \"\\\\n\" << e%s << \" evaluates to \" << v%s\"\"\")\n\n  impl += \"\"\";\n  return AssertionFailure(msg);\n}\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT%(n)s.\n// Don't use this in your code.\n#define GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, on_failure)\\\\\n  GTEST_ASSERT_(pred_format(%(vts)s, %(vs)s),\\\\\n                on_failure)\n\n// Internal macro for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use\n// this in your code.\n#define GTEST_PRED%(n)s_(pred, %(vs)s, on_failure)\\\\\n  GTEST_ASSERT_(::testing::AssertPred%(n)sHelper(#pred\"\"\" % DEFS\n\n  impl += Iter(n, \"\"\", \\\\\n                                             #v%s\"\"\")\n\n  impl += \"\"\", \\\\\n                                             pred\"\"\"\n\n  impl += Iter(n, \"\"\", \\\\\n                                             v%s\"\"\")\n\n  impl += \"\"\"), on_failure)\n\n// %(Arity)s predicate assertion macros.\n#define EXPECT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\\\\n  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_NONFATAL_FAILURE_)\n#define EXPECT_PRED%(n)s(pred, %(vs)s) \\\\\n  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_NONFATAL_FAILURE_)\n#define ASSERT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\\\\n  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_FATAL_FAILURE_)\n#define ASSERT_PRED%(n)s(pred, %(vs)s) \\\\\n  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_FATAL_FAILURE_)\n\n\"\"\" % DEFS\n\n  return impl\n\n\ndef HeaderPostamble():\n  \"\"\"Returns the postamble for the header file.\"\"\"\n\n  return \"\"\"\n\n#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_\n\"\"\"\n\n\ndef GenerateFile(path, content):\n  \"\"\"Given a file path and a content string, overwrites it with the\n  given content.\"\"\"\n\n  print 'Updating file %s . . .' % path\n\n  f = file(path, 'w+')\n  print >>f, content,\n  f.close()\n\n  print 'File %s has been updated.' % path\n\n\ndef GenerateHeader(n):\n  \"\"\"Given the maximum arity n, updates the header file that implements\n  the predicate assertions.\"\"\"\n\n  GenerateFile(HEADER,\n               HeaderPreamble(n)\n               + ''.join([ImplementationForArity(i) for i in OneTo(n)])\n               + HeaderPostamble())\n\n\ndef UnitTestPreamble():\n  \"\"\"Returns the preamble for the unit test file.\"\"\"\n\n  # A map that defines the values used in the preamble template.\n  DEFS = {\n    'today' : time.strftime('%m/%d/%Y'),\n    'year' : time.strftime('%Y'),\n    'command' : '%s %s' % (os.path.basename(sys.argv[0]), sys.argv[1]),\n    }\n\n  return (\n\"\"\"// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This file is AUTOMATICALLY GENERATED on %(today)s by command\n// '%(command)s'.  DO NOT EDIT BY HAND!\n\n// Regression test for gtest_pred_impl.h\n//\n// This file is generated by a script and quite long.  If you intend to\n// learn how Google Test works by reading its unit tests, read\n// gtest_unittest.cc instead.\n//\n// This is intended as a regression test for the Google Test predicate\n// assertions.  We compile it as part of the gtest_unittest target\n// only to keep the implementation tidy and compact, as it is quite\n// involved to set up the stage for testing Google Test using Google\n// Test itself.\n//\n// Currently, gtest_unittest takes ~11 seconds to run in the testing\n// daemon.  In the future, if it grows too large and needs much more\n// time to finish, we should consider separating this file into a\n// stand-alone regression test.\n\n#include <iostream>\n\n#include <gtest/gtest.h>\n#include <gtest/gtest-spi.h>\n\n// A user-defined data type.\nstruct Bool {\n  explicit Bool(int val) : value(val != 0) {}\n\n  bool operator>(int n) const { return value > Bool(n).value; }\n\n  Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }\n\n  bool operator==(const Bool& rhs) const { return value == rhs.value; }\n\n  bool value;\n};\n\n// Enables Bool to be used in assertions.\nstd::ostream& operator<<(std::ostream& os, const Bool& x) {\n  return os << (x.value ? \"true\" : \"false\");\n}\n\n\"\"\" % DEFS)\n\n\ndef TestsForArity(n):\n  \"\"\"Returns the tests for n-ary predicate assertions.\"\"\"\n\n  # A map that defines the values used in the template for the tests.\n  DEFS = {\n    'n' : n,\n    'es' : Iter(n, 'e%s', sep=', '),\n    'vs' : Iter(n, 'v%s', sep=', '),\n    'vts' : Iter(n, '#v%s', sep=', '),\n    'tvs' : Iter(n, 'T%s v%s', sep=', '),\n    'int_vs' : Iter(n, 'int v%s', sep=', '),\n    'Bool_vs' : Iter(n, 'Bool v%s', sep=', '),\n    'types' : Iter(n, 'typename T%s', sep=', '),\n    'v_sum' : Iter(n, 'v%s', sep=' + '),\n    'arity' : Arity(n),\n    'Arity' : Title(Arity(n)),\n    }\n\n  tests = (\n\"\"\"// Sample functions/functors for testing %(arity)s predicate assertions.\n\n// A %(arity)s predicate function.\ntemplate <%(types)s>\nbool PredFunction%(n)s(%(tvs)s) {\n  return %(v_sum)s > 0;\n}\n\n// The following two functions are needed to circumvent a bug in\n// gcc 2.95.3, which sometimes has problem with the above template\n// function.\nbool PredFunction%(n)sInt(%(int_vs)s) {\n  return %(v_sum)s > 0;\n}\nbool PredFunction%(n)sBool(%(Bool_vs)s) {\n  return %(v_sum)s > 0;\n}\n\"\"\" % DEFS)\n\n  tests += \"\"\"\n// A %(arity)s predicate functor.\nstruct PredFunctor%(n)s {\n  template <%(types)s>\n  bool operator()(\"\"\" % DEFS\n\n  tests += Iter(n, 'const T%s& v%s', sep=\"\"\",\n                  \"\"\")\n\n  tests += \"\"\") {\n    return %(v_sum)s > 0;\n  }\n};\n\"\"\" % DEFS\n\n  tests += \"\"\"\n// A %(arity)s predicate-formatter function.\ntemplate <%(types)s>\ntesting::AssertionResult PredFormatFunction%(n)s(\"\"\" % DEFS\n\n  tests += Iter(n, 'const char* e%s', sep=\"\"\",\n                                             \"\"\")\n\n  tests += Iter(n, \"\"\",\n                                             const T%s& v%s\"\"\")\n\n  tests += \"\"\") {\n  if (PredFunction%(n)s(%(vs)s))\n    return testing::AssertionSuccess();\n\n  testing::Message msg;\n  msg << \"\"\" % DEFS\n\n  tests += Iter(n, 'e%s', sep=' << \" + \" << ')\n\n  tests += \"\"\"\n      << \" is expected to be positive, but evaluates to \"\n      << %(v_sum)s << \".\";\n  return testing::AssertionFailure(msg);\n}\n\"\"\" % DEFS\n\n  tests += \"\"\"\n// A %(arity)s predicate-formatter functor.\nstruct PredFormatFunctor%(n)s {\n  template <%(types)s>\n  testing::AssertionResult operator()(\"\"\" % DEFS\n\n  tests += Iter(n, 'const char* e%s', sep=\"\"\",\n                                      \"\"\")\n\n  tests += Iter(n, \"\"\",\n                                      const T%s& v%s\"\"\")\n\n  tests += \"\"\") const {\n    return PredFormatFunction%(n)s(%(es)s, %(vs)s);\n  }\n};\n\"\"\" % DEFS\n\n  tests += \"\"\"\n// Tests for {EXPECT|ASSERT}_PRED_FORMAT%(n)s.\n\nclass Predicate%(n)sTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    expected_to_finish_ = true;\n    finished_ = false;\"\"\" % DEFS\n\n  tests += \"\"\"\n    \"\"\" + Iter(n, 'n%s_ = ') + \"\"\"0;\n  }\n\"\"\"\n\n  tests += \"\"\"\n  virtual void TearDown() {\n    // Verifies that each of the predicate's arguments was evaluated\n    // exactly once.\"\"\"\n\n  tests += ''.join([\"\"\"\n    EXPECT_EQ(1, n%s_) <<\n        \"The predicate assertion didn't evaluate argument %s \"\n        \"exactly once.\";\"\"\" % (i, i + 1) for i in OneTo(n)])\n\n  tests += \"\"\"\n\n    // Verifies that the control flow in the test function is expected.\n    if (expected_to_finish_ && !finished_) {\n      FAIL() << \"The predicate assertion unexpactedly aborted the test.\";\n    } else if (!expected_to_finish_ && finished_) {\n      FAIL() << \"The failed predicate assertion didn't abort the test \"\n                \"as expected.\";\n    }\n  }\n\n  // true iff the test function is expected to run to finish.\n  static bool expected_to_finish_;\n\n  // true iff the test function did run to finish.\n  static bool finished_;\n\"\"\" % DEFS\n\n  tests += Iter(n, \"\"\"\n  static int n%s_;\"\"\")\n\n  tests += \"\"\"\n};\n\nbool Predicate%(n)sTest::expected_to_finish_;\nbool Predicate%(n)sTest::finished_;\n\"\"\" % DEFS\n\n  tests += Iter(n, \"\"\"int Predicate%%(n)sTest::n%s_;\n\"\"\") % DEFS\n\n  tests += \"\"\"\ntypedef Predicate%(n)sTest EXPECT_PRED_FORMAT%(n)sTest;\ntypedef Predicate%(n)sTest ASSERT_PRED_FORMAT%(n)sTest;\ntypedef Predicate%(n)sTest EXPECT_PRED%(n)sTest;\ntypedef Predicate%(n)sTest ASSERT_PRED%(n)sTest;\n\"\"\" % DEFS\n\n  def GenTest(use_format, use_assert, expect_failure,\n              use_functor, use_user_type):\n    \"\"\"Returns the test for a predicate assertion macro.\n\n    Args:\n      use_format:     true iff the assertion is a *_PRED_FORMAT*.\n      use_assert:     true iff the assertion is a ASSERT_*.\n      expect_failure: true iff the assertion is expected to fail.\n      use_functor:    true iff the first argument of the assertion is\n                      a functor (as opposed to a function)\n      use_user_type:  true iff the predicate functor/function takes\n                      argument(s) of a user-defined type.\n\n    Example:\n\n      GenTest(1, 0, 0, 1, 0) returns a test that tests the behavior\n      of a successful EXPECT_PRED_FORMATn() that takes a functor\n      whose arguments have built-in types.\"\"\"\n\n    if use_assert:\n      assrt = 'ASSERT'  # 'assert' is reserved, so we cannot use\n                        # that identifier here.\n    else:\n      assrt = 'EXPECT'\n\n    assertion = assrt + '_PRED'\n\n    if use_format:\n      pred_format = 'PredFormat'\n      assertion += '_FORMAT'\n    else:\n      pred_format = 'Pred'\n\n    assertion += '%(n)s' % DEFS\n\n    if use_functor:\n      pred_format_type = 'functor'\n      pred_format += 'Functor%(n)s()'\n    else:\n      pred_format_type = 'function'\n      pred_format += 'Function%(n)s'\n      if not use_format:\n        if use_user_type:\n          pred_format += 'Bool'\n        else:\n          pred_format += 'Int'\n\n    test_name = pred_format_type.title()\n\n    if use_user_type:\n      arg_type = 'user-defined type (Bool)'\n      test_name += 'OnUserType'\n      if expect_failure:\n        arg = 'Bool(n%s_++)'\n      else:\n        arg = 'Bool(++n%s_)'\n    else:\n      arg_type = 'built-in type (int)'\n      test_name += 'OnBuiltInType'\n      if expect_failure:\n        arg = 'n%s_++'\n      else:\n        arg = '++n%s_'\n\n    if expect_failure:\n      successful_or_failed = 'failed'\n      expected_or_not = 'expected.'\n      test_name +=  'Failure'\n    else:\n      successful_or_failed = 'successful'\n      expected_or_not = 'UNEXPECTED!'\n      test_name +=  'Success'\n\n    # A map that defines the values used in the test template.\n    defs = DEFS.copy()\n    defs.update({\n      'assert' : assrt,\n      'assertion' : assertion,\n      'test_name' : test_name,\n      'pf_type' : pred_format_type,\n      'pf' : pred_format,\n      'arg_type' : arg_type,\n      'arg' : arg,\n      'successful' : successful_or_failed,\n      'expected' : expected_or_not,\n      })\n\n    test = \"\"\"\n// Tests a %(successful)s %(assertion)s where the\n// predicate-formatter is a %(pf_type)s on a %(arg_type)s.\nTEST_F(%(assertion)sTest, %(test_name)s) {\"\"\" % defs\n\n    indent = (len(assertion) + 3)*' '\n    extra_indent = ''\n\n    if expect_failure:\n      extra_indent = '  '\n      if use_assert:\n        test += \"\"\"\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\"\"\"\n      else:\n        test += \"\"\"\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\"\"\"\n\n    test += '\\n' + extra_indent + \"\"\"  %(assertion)s(%(pf)s\"\"\" % defs\n\n    test = test % defs\n    test += Iter(n, ',\\n' + indent + extra_indent + '%(arg)s' % defs)\n    test += ');\\n' + extra_indent + '  finished_ = true;\\n'\n\n    if expect_failure:\n      test += '  }, \"\");\\n'\n\n    test += '}\\n'\n    return test\n\n  # Generates tests for all 2**6 = 64 combinations.\n  tests += ''.join([GenTest(use_format, use_assert, expect_failure,\n                            use_functor, use_user_type)\n                    for use_format in [0, 1]\n                    for use_assert in [0, 1]\n                    for expect_failure in [0, 1]\n                    for use_functor in [0, 1]\n                    for use_user_type in [0, 1]\n                    ])\n\n  return tests\n\n\ndef UnitTestPostamble():\n  \"\"\"Returns the postamble for the tests.\"\"\"\n\n  return ''\n\n\ndef GenerateUnitTest(n):\n  \"\"\"Returns the tests for up-to n-ary predicate assertions.\"\"\"\n\n  GenerateFile(UNIT_TEST,\n               UnitTestPreamble()\n               + ''.join([TestsForArity(i) for i in OneTo(n)])\n               + UnitTestPostamble())\n\n\ndef _Main():\n  \"\"\"The entry point of the script.  Generates the header file and its\n  unit test.\"\"\"\n\n  if len(sys.argv) != 2:\n    print __doc__\n    print 'Author: ' + __author__\n    sys.exit(1)\n\n  n = int(sys.argv[1])\n  GenerateHeader(n)\n  GenerateUnitTest(n)\n\n\nif __name__ == '__main__':\n  _Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gtest-config.in",
    "content": "#!/bin/sh\n\n# These variables are automatically filled in by the configure script.\nname=\"@PACKAGE_TARNAME@\"\nversion=\"@PACKAGE_VERSION@\"\n\nshow_usage()\n{\n  echo \"Usage: gtest-config [OPTIONS...]\"\n}\n\nshow_help()\n{\n  show_usage\n  cat <<\\EOF\n\nThe `gtest-config' script provides access to the necessary compile and linking\nflags to connect with Google C++ Testing Framework, both in a build prior to\ninstallation, and on the system proper after installation. The installation\noverrides may be issued in combination with any other queries, but will only\naffect installation queries if called on a built but not installed gtest. The\ninstallation queries may not be issued with any other types of queries, and\nonly one installation query may be made at a time. The version queries and\ncompiler flag queries may be combined as desired but not mixed. Different\nversion queries are always combined with logical \"and\" semantics, and only the\nlast of any particular query is used while all previous ones ignored. All\nversions must be specified as a sequence of numbers separated by periods.\nCompiler flag queries output the union of the sets of flags when combined.\n\n Examples:\n  gtest-config --min-version=1.0 || echo \"Insufficient Google Test version.\"\n\n  g++ $(gtest-config --cppflags --cxxflags) -o foo.o -c foo.cpp\n  g++ $(gtest-config --ldflags --libs) -o foo foo.o\n\n  # When using a built but not installed Google Test:\n  g++ $(../../my_gtest_build/scripts/gtest-config ...) ...\n\n  # When using an installed Google Test, but with installation overrides:\n  export GTEST_PREFIX=\"/opt\"\n  g++ $(gtest-config --libdir=\"/opt/lib64\" ...) ...\n\n Help:\n  --usage                    brief usage information\n  --help                     display this help message\n\n Installation Overrides:\n  --prefix=<dir>             overrides the installation prefix\n  --exec-prefix=<dir>        overrides the executable installation prefix\n  --libdir=<dir>             overrides the library installation prefix\n  --includedir=<dir>         overrides the header file installation prefix\n\n Installation Queries:\n  --prefix                   installation prefix\n  --exec-prefix              executable installation prefix\n  --libdir                   library installation directory\n  --includedir               header file installation directory\n  --version                  the version of the Google Test installation\n\n Version Queries:\n  --min-version=VERSION      return 0 if the version is at least VERSION\n  --exact-version=VERSION    return 0 if the version is exactly VERSION\n  --max-version=VERSION      return 0 if the version is at most VERSION\n\n Compilation Flag Queries:\n  --cppflags                 compile flags specific to the C-like preprocessors\n  --cxxflags                 compile flags appropriate for C++ programs\n  --ldflags                  linker flags\n  --libs                     libraries for linking\n\nEOF\n}\n\n# This function bounds our version with a min and a max. It uses some clever\n# POSIX-compliant variable expansion to portably do all the work in the shell\n# and avoid any dependency on a particular \"sed\" or \"awk\" implementation.\n# Notable is that it will only ever compare the first 3 components of versions.\n# Further components will be cleanly stripped off. All versions must be\n# unadorned, so \"v1.0\" will *not* work. The minimum version must be in $1, and\n# the max in $2. TODO(chandlerc@google.com): If this ever breaks, we should\n# investigate expanding this via autom4te from AS_VERSION_COMPARE rather than\n# continuing to maintain our own shell version.\ncheck_versions()\n{\n  major_version=${version%%.*}\n  minor_version=\"0\"\n  point_version=\"0\"\n  if test \"${version#*.}\" != \"${version}\"; then\n    minor_version=${version#*.}\n    minor_version=${minor_version%%.*}\n  fi\n  if test \"${version#*.*.}\" != \"${version}\"; then\n    point_version=${version#*.*.}\n    point_version=${point_version%%.*}\n  fi\n\n  min_version=\"$1\"\n  min_major_version=${min_version%%.*}\n  min_minor_version=\"0\"\n  min_point_version=\"0\"\n  if test \"${min_version#*.}\" != \"${min_version}\"; then\n    min_minor_version=${min_version#*.}\n    min_minor_version=${min_minor_version%%.*}\n  fi\n  if test \"${min_version#*.*.}\" != \"${min_version}\"; then\n    min_point_version=${min_version#*.*.}\n    min_point_version=${min_point_version%%.*}\n  fi\n\n  max_version=\"$2\"\n  max_major_version=${max_version%%.*}\n  max_minor_version=\"0\"\n  max_point_version=\"0\"\n  if test \"${max_version#*.}\" != \"${max_version}\"; then\n    max_minor_version=${max_version#*.}\n    max_minor_version=${max_minor_version%%.*}\n  fi\n  if test \"${max_version#*.*.}\" != \"${max_version}\"; then\n    max_point_version=${max_version#*.*.}\n    max_point_version=${max_point_version%%.*}\n  fi\n\n  test $(($major_version)) -lt $(($min_major_version)) && exit 1\n  if test $(($major_version)) -eq $(($min_major_version)); then\n    test $(($minor_version)) -lt $(($min_minor_version)) && exit 1\n    if test $(($minor_version)) -eq $(($min_minor_version)); then\n      test $(($point_version)) -lt $(($min_point_version)) && exit 1\n    fi\n  fi\n\n  test $(($major_version)) -gt $(($max_major_version)) && exit 1\n  if test $(($major_version)) -eq $(($max_major_version)); then\n    test $(($minor_version)) -gt $(($max_minor_version)) && exit 1\n    if test $(($minor_version)) -eq $(($max_minor_version)); then\n      test $(($point_version)) -gt $(($max_point_version)) && exit 1\n    fi\n  fi\n\n  exit 0\n}\n\n# Show the usage line when no arguments are specified.\nif test $# -eq 0; then\n  show_usage\n  exit 1\nfi\n\nwhile test $# -gt 0; do\n  case $1 in\n    --usage)          show_usage;         exit 0;;\n    --help)           show_help;          exit 0;;\n\n    # Installation overrides\n    --prefix=*)       GTEST_PREFIX=${1#--prefix=};;\n    --exec-prefix=*)  GTEST_EXEC_PREFIX=${1#--exec-prefix=};;\n    --libdir=*)       GTEST_LIBDIR=${1#--libdir=};;\n    --includedir=*)   GTEST_INCLUDEDIR=${1#--includedir=};;\n\n    # Installation queries\n    --prefix|--exec-prefix|--libdir|--includedir|--version)\n      if test -n \"${do_query}\"; then\n        show_usage\n        exit 1\n      fi\n      do_query=${1#--}\n      ;;\n\n    # Version checking\n    --min-version=*)\n      do_check_versions=yes\n      min_version=${1#--min-version=}\n      ;;\n    --max-version=*)\n      do_check_versions=yes\n      max_version=${1#--max-version=}\n      ;;\n    --exact-version=*)\n      do_check_versions=yes\n      exact_version=${1#--exact-version=}\n      ;;\n\n    # Compiler flag output\n    --cppflags)       echo_cppflags=yes;;\n    --cxxflags)       echo_cxxflags=yes;;\n    --ldflags)        echo_ldflags=yes;;\n    --libs)           echo_libs=yes;;\n\n    # Everything else is an error\n    *)                show_usage;         exit 1;;\n  esac\n  shift\ndone\n\n# These have defaults filled in by the configure script but can also be\n# overridden by environment variables or command line parameters.\nprefix=\"${GTEST_PREFIX:-@prefix@}\"\nexec_prefix=\"${GTEST_EXEC_PREFIX:-@exec_prefix@}\"\nlibdir=\"${GTEST_LIBDIR:-@libdir@}\"\nincludedir=\"${GTEST_INCLUDEDIR:-@includedir@}\"\n\n# We try and detect if our binary is not located at its installed location. If\n# it's not, we provide variables pointing to the source and build tree rather\n# than to the install tree. This allows building against a just-built gtest\n# rather than an installed gtest.\nbindir=\"@bindir@\"\nthis_relative_bindir=`dirname $0`\nthis_bindir=`cd ${this_relative_bindir}; pwd -P`\nif test \"${this_bindir}\" = \"${this_bindir%${bindir}}\"; then\n  # The path to the script doesn't end in the bindir sequence from Autoconf,\n  # assume that we are in a build tree.\n  build_dir=`dirname ${this_bindir}`\n  src_dir=`cd ${this_bindir}/@top_srcdir@; pwd -P`\n\n  # TODO(chandlerc@google.com): This is a dangerous dependency on libtool, we\n  # should work to remove it, and/or remove libtool altogether, replacing it\n  # with direct references to the library and a link path.\n  gtest_libs=\"${build_dir}/lib/libgtest.la @PTHREAD_CFLAGS@ @PTHREAD_LIBS@\"\n  gtest_ldflags=\"\"\n\n  # We provide hooks to include from either the source or build dir, where the\n  # build dir is always preferred. This will potentially allow us to write\n  # build rules for generated headers and have them automatically be preferred\n  # over provided versions.\n  gtest_cppflags=\"-I${build_dir}/include -I${src_dir}/include\"\n  gtest_cxxflags=\"@PTHREAD_CFLAGS@\"\nelse\n  # We're using an installed gtest, although it may be staged under some\n  # prefix. Assume (as our own libraries do) that we can resolve the prefix,\n  # and are present in the dynamic link paths.\n  gtest_ldflags=\"-L${libdir}\"\n  gtest_libs=\"-l${name} @PTHREAD_CFLAGS@ @PTHREAD_LIBS@\"\n  gtest_cppflags=\"-I${includedir}\"\n  gtest_cxxflags=\"@PTHREAD_CFLAGS@\"\nfi\n\n# Do an installation query if requested.\nif test -n \"$do_query\"; then\n  case $do_query in\n    prefix)           echo $prefix;       exit 0;;\n    exec-prefix)      echo $exec_prefix;  exit 0;;\n    libdir)           echo $libdir;       exit 0;;\n    includedir)       echo $includedir;   exit 0;;\n    version)          echo $version;      exit 0;;\n    *)                show_usage;         exit 1;;\n  esac\nfi\n\n# Do a version check if requested.\nif test \"$do_check_versions\" = \"yes\"; then\n  # Make sure we didn't receive a bad combination of parameters.\n  test \"$echo_cppflags\" = \"yes\" && show_usage && exit 1\n  test \"$echo_cxxflags\" = \"yes\" && show_usage && exit 1\n  test \"$echo_ldflags\" = \"yes\"  && show_usage && exit 1\n  test \"$echo_libs\" = \"yes\"     && show_usage && exit 1\n\n  if test \"$exact_version\" != \"\"; then\n    check_versions $exact_version $exact_version\n    # unreachable\n  else\n    check_versions ${min_version:-0.0.0} ${max_version:-9999.9999.9999}\n    # unreachable\n  fi\nfi\n\n# Do the output in the correct order so that these can be used in-line of\n# a compiler invocation.\noutput=\"\"\ntest \"$echo_cppflags\" = \"yes\" && output=\"$output $gtest_cppflags\"\ntest \"$echo_cxxflags\" = \"yes\" && output=\"$output $gtest_cxxflags\"\ntest \"$echo_ldflags\" = \"yes\"  && output=\"$output $gtest_ldflags\"\ntest \"$echo_libs\" = \"yes\"     && output=\"$output $gtest_libs\"\necho $output\n\nexit 0\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/pump.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"pump v0.1 - Pretty Useful for Meta Programming.\n\nA tool for preprocessor meta programming.  Useful for generating\nrepetitive boilerplate code.  Especially useful for writing C++\nclasses, functions, macros, and templates that need to work with\nvarious number of arguments.\n\nUSAGE:\n       pump.py SOURCE_FILE\n\nEXAMPLES:\n       pump.py foo.cc.pump\n         Converts foo.cc.pump to foo.cc.\n\nGRAMMAR:\n       CODE ::= ATOMIC_CODE*\n       ATOMIC_CODE ::= $var ID = EXPRESSION\n           | $var ID = [[ CODE ]]\n           | $range ID EXPRESSION..EXPRESSION\n           | $for ID SEPARATOR [[ CODE ]]\n           | $($)\n           | $ID\n           | $(EXPRESSION)\n           | $if EXPRESSION [[ CODE ]] ELSE_BRANCH\n           | [[ CODE ]]\n           | RAW_CODE\n       SEPARATOR ::= RAW_CODE | EMPTY\n       ELSE_BRANCH ::= $else [[ CODE ]]\n           | $elif EXPRESSION [[ CODE ]] ELSE_BRANCH\n           | EMPTY\n       EXPRESSION has Python syntax.\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport re\nimport sys\n\n\nTOKEN_TABLE = [\n    (re.compile(r'\\$var\\s+'), '$var'),\n    (re.compile(r'\\$elif\\s+'), '$elif'),\n    (re.compile(r'\\$else\\s+'), '$else'),\n    (re.compile(r'\\$for\\s+'), '$for'),\n    (re.compile(r'\\$if\\s+'), '$if'),\n    (re.compile(r'\\$range\\s+'), '$range'),\n    (re.compile(r'\\$[_A-Za-z]\\w*'), '$id'),\n    (re.compile(r'\\$\\(\\$\\)'), '$($)'),\n    (re.compile(r'\\$\\$.*'), '$$'),\n    (re.compile(r'\\$'), '$'),\n    (re.compile(r'\\[\\[\\n?'), '[['),\n    (re.compile(r'\\]\\]\\n?'), ']]'),\n    ]\n\n\nclass Cursor:\n  \"\"\"Represents a position (line and column) in a text file.\"\"\"\n\n  def __init__(self, line=-1, column=-1):\n    self.line = line\n    self.column = column\n\n  def __eq__(self, rhs):\n    return self.line == rhs.line and self.column == rhs.column\n\n  def __ne__(self, rhs):\n    return not self == rhs\n\n  def __lt__(self, rhs):\n    return self.line < rhs.line or (\n        self.line == rhs.line and self.column < rhs.column)\n\n  def __le__(self, rhs):\n    return self < rhs or self == rhs\n\n  def __gt__(self, rhs):\n    return rhs < self\n\n  def __ge__(self, rhs):\n    return rhs <= self\n\n  def __str__(self):\n    if self == Eof():\n      return 'EOF'\n    else:\n      return '%s(%s)' % (self.line + 1, self.column)\n\n  def __add__(self, offset):\n    return Cursor(self.line, self.column + offset)\n\n  def __sub__(self, offset):\n    return Cursor(self.line, self.column - offset)\n\n  def Clone(self):\n    \"\"\"Returns a copy of self.\"\"\"\n\n    return Cursor(self.line, self.column)\n\n\n# Special cursor to indicate the end-of-file.\ndef Eof():\n  \"\"\"Returns the special cursor to denote the end-of-file.\"\"\"\n  return Cursor(-1, -1)\n\n\nclass Token:\n  \"\"\"Represents a token in a Pump source file.\"\"\"\n\n  def __init__(self, start=None, end=None, value=None, token_type=None):\n    if start is None:\n      self.start = Eof()\n    else:\n      self.start = start\n    if end is None:\n      self.end = Eof()\n    else:\n      self.end = end\n    self.value = value\n    self.token_type = token_type\n\n  def __str__(self):\n    return 'Token @%s: \\'%s\\' type=%s' % (\n        self.start, self.value, self.token_type)\n\n  def Clone(self):\n    \"\"\"Returns a copy of self.\"\"\"\n\n    return Token(self.start.Clone(), self.end.Clone(), self.value,\n                 self.token_type)\n\n\ndef StartsWith(lines, pos, string):\n  \"\"\"Returns True iff the given position in lines starts with 'string'.\"\"\"\n\n  return lines[pos.line][pos.column:].startswith(string)\n\n\ndef FindFirstInLine(line, token_table):\n  best_match_start = -1\n  for (regex, token_type) in token_table:\n    m = regex.search(line)\n    if m:\n      # We found regex in lines\n      if best_match_start < 0 or m.start() < best_match_start:\n        best_match_start = m.start()\n        best_match_length = m.end() - m.start()\n        best_match_token_type = token_type\n\n  if best_match_start < 0:\n    return None\n\n  return (best_match_start, best_match_length, best_match_token_type)\n\n\ndef FindFirst(lines, token_table, cursor):\n  \"\"\"Finds the first occurrence of any string in strings in lines.\"\"\"\n\n  start = cursor.Clone()\n  cur_line_number = cursor.line\n  for line in lines[start.line:]:\n    if cur_line_number == start.line:\n      line = line[start.column:]\n    m = FindFirstInLine(line, token_table)\n    if m:\n      # We found a regex in line.\n      (start_column, length, token_type) = m\n      if cur_line_number == start.line:\n        start_column += start.column\n      found_start = Cursor(cur_line_number, start_column)\n      found_end = found_start + length\n      return MakeToken(lines, found_start, found_end, token_type)\n    cur_line_number += 1\n  # We failed to find str in lines\n  return None\n\n\ndef SubString(lines, start, end):\n  \"\"\"Returns a substring in lines.\"\"\"\n\n  if end == Eof():\n    end = Cursor(len(lines) - 1, len(lines[-1]))\n\n  if start >= end:\n    return ''\n\n  if start.line == end.line:\n    return lines[start.line][start.column:end.column]\n\n  result_lines = ([lines[start.line][start.column:]] +\n                  lines[start.line + 1:end.line] +\n                  [lines[end.line][:end.column]])\n  return ''.join(result_lines)\n\n\ndef MakeToken(lines, start, end, token_type):\n  \"\"\"Creates a new instance of Token.\"\"\"\n\n  return Token(start, end, SubString(lines, start, end), token_type)\n\n\ndef ParseToken(lines, pos, regex, token_type):\n  line = lines[pos.line][pos.column:]\n  m = regex.search(line)\n  if m and not m.start():\n    return MakeToken(lines, pos, pos + m.end(), token_type)\n  else:\n    print 'ERROR: %s expected at %s.' % (token_type, pos)\n    sys.exit(1)\n\n\nID_REGEX = re.compile(r'[_A-Za-z]\\w*')\nEQ_REGEX = re.compile(r'=')\nREST_OF_LINE_REGEX = re.compile(r'.*?(?=$|\\$\\$)')\nOPTIONAL_WHITE_SPACES_REGEX = re.compile(r'\\s*')\nWHITE_SPACE_REGEX = re.compile(r'\\s')\nDOT_DOT_REGEX = re.compile(r'\\.\\.')\n\n\ndef Skip(lines, pos, regex):\n  line = lines[pos.line][pos.column:]\n  m = re.search(regex, line)\n  if m and not m.start():\n    return pos + m.end()\n  else:\n    return pos\n\n\ndef SkipUntil(lines, pos, regex, token_type):\n  line = lines[pos.line][pos.column:]\n  m = re.search(regex, line)\n  if m:\n    return pos + m.start()\n  else:\n    print ('ERROR: %s expected on line %s after column %s.' %\n           (token_type, pos.line + 1, pos.column))\n    sys.exit(1)\n\n\ndef ParseExpTokenInParens(lines, pos):\n  def ParseInParens(pos):\n    pos = Skip(lines, pos, OPTIONAL_WHITE_SPACES_REGEX)\n    pos = Skip(lines, pos, r'\\(')\n    pos = Parse(pos)\n    pos = Skip(lines, pos, r'\\)')\n    return pos\n\n  def Parse(pos):\n    pos = SkipUntil(lines, pos, r'\\(|\\)', ')')\n    if SubString(lines, pos, pos + 1) == '(':\n      pos = Parse(pos + 1)\n      pos = Skip(lines, pos, r'\\)')\n      return Parse(pos)\n    else:\n      return pos\n\n  start = pos.Clone()\n  pos = ParseInParens(pos)\n  return MakeToken(lines, start, pos, 'exp')\n\n\ndef RStripNewLineFromToken(token):\n  if token.value.endswith('\\n'):\n    return Token(token.start, token.end, token.value[:-1], token.token_type)\n  else:\n    return token\n\n\ndef TokenizeLines(lines, pos):\n  while True:\n    found = FindFirst(lines, TOKEN_TABLE, pos)\n    if not found:\n      yield MakeToken(lines, pos, Eof(), 'code')\n      return\n\n    if found.start == pos:\n      prev_token = None\n      prev_token_rstripped = None\n    else:\n      prev_token = MakeToken(lines, pos, found.start, 'code')\n      prev_token_rstripped = RStripNewLineFromToken(prev_token)\n\n    if found.token_type == '$$':  # A meta comment.\n      if prev_token_rstripped:\n        yield prev_token_rstripped\n      pos = Cursor(found.end.line + 1, 0)\n    elif found.token_type == '$var':\n      if prev_token_rstripped:\n        yield prev_token_rstripped\n      yield found\n      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')\n      yield id_token\n      pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX)\n\n      eq_token = ParseToken(lines, pos, EQ_REGEX, '=')\n      yield eq_token\n      pos = Skip(lines, eq_token.end, r'\\s*')\n\n      if SubString(lines, pos, pos + 2) != '[[':\n        exp_token = ParseToken(lines, pos, REST_OF_LINE_REGEX, 'exp')\n        yield exp_token\n        pos = Cursor(exp_token.end.line + 1, 0)\n    elif found.token_type == '$for':\n      if prev_token_rstripped:\n        yield prev_token_rstripped\n      yield found\n      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')\n      yield id_token\n      pos = Skip(lines, id_token.end, WHITE_SPACE_REGEX)\n    elif found.token_type == '$range':\n      if prev_token_rstripped:\n        yield prev_token_rstripped\n      yield found\n      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')\n      yield id_token\n      pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX)\n\n      dots_pos = SkipUntil(lines, pos, DOT_DOT_REGEX, '..')\n      yield MakeToken(lines, pos, dots_pos, 'exp')\n      yield MakeToken(lines, dots_pos, dots_pos + 2, '..')\n      pos = dots_pos + 2\n      new_pos = Cursor(pos.line + 1, 0)\n      yield MakeToken(lines, pos, new_pos, 'exp')\n      pos = new_pos\n    elif found.token_type == '$':\n      if prev_token:\n        yield prev_token\n      yield found\n      exp_token = ParseExpTokenInParens(lines, found.end)\n      yield exp_token\n      pos = exp_token.end\n    elif (found.token_type == ']]' or found.token_type == '$if' or\n          found.token_type == '$elif' or found.token_type == '$else'):\n      if prev_token_rstripped:\n        yield prev_token_rstripped\n      yield found\n      pos = found.end\n    else:\n      if prev_token:\n        yield prev_token\n      yield found\n      pos = found.end\n\n\ndef Tokenize(s):\n  lines = s.splitlines(True)\n  return TokenizeLines(lines, Cursor(0, 0))\n\n\nclass CodeNode:\n  def __init__(self, atomic_code_list=None):\n    self.atomic_code = atomic_code_list\n\n\nclass VarNode:\n  def __init__(self, identifier=None, atomic_code=None):\n    self.identifier = identifier\n    self.atomic_code = atomic_code\n\n\nclass RangeNode:\n  def __init__(self, identifier=None, exp1=None, exp2=None):\n    self.identifier = identifier\n    self.exp1 = exp1\n    self.exp2 = exp2\n\n\nclass ForNode:\n  def __init__(self, identifier=None, sep=None, code=None):\n    self.identifier = identifier\n    self.sep = sep\n    self.code = code\n\n\nclass ElseNode:\n  def __init__(self, else_branch=None):\n    self.else_branch = else_branch\n\n\nclass IfNode:\n  def __init__(self, exp=None, then_branch=None, else_branch=None):\n    self.exp = exp\n    self.then_branch = then_branch\n    self.else_branch = else_branch\n\n\nclass RawCodeNode:\n  def __init__(self, token=None):\n    self.raw_code = token\n\n\nclass LiteralDollarNode:\n  def __init__(self, token):\n    self.token = token\n\n\nclass ExpNode:\n  def __init__(self, token, python_exp):\n    self.token = token\n    self.python_exp = python_exp\n\n\ndef PopFront(a_list):\n  head = a_list[0]\n  a_list[:1] = []\n  return head\n\n\ndef PushFront(a_list, elem):\n  a_list[:0] = [elem]\n\n\ndef PopToken(a_list, token_type=None):\n  token = PopFront(a_list)\n  if token_type is not None and token.token_type != token_type:\n    print 'ERROR: %s expected at %s' % (token_type, token.start)\n    print 'ERROR: %s found instead' % (token,)\n    sys.exit(1)\n\n  return token\n\n\ndef PeekToken(a_list):\n  if not a_list:\n    return None\n\n  return a_list[0]\n\n\ndef ParseExpNode(token):\n  python_exp = re.sub(r'([_A-Za-z]\\w*)', r'self.GetValue(\"\\1\")', token.value)\n  return ExpNode(token, python_exp)\n\n\ndef ParseElseNode(tokens):\n  def Pop(token_type=None):\n    return PopToken(tokens, token_type)\n\n  next = PeekToken(tokens)\n  if not next:\n    return None\n  if next.token_type == '$else':\n    Pop('$else')\n    Pop('[[')\n    code_node = ParseCodeNode(tokens)\n    Pop(']]')\n    return code_node\n  elif next.token_type == '$elif':\n    Pop('$elif')\n    exp = Pop('code')\n    Pop('[[')\n    code_node = ParseCodeNode(tokens)\n    Pop(']]')\n    inner_else_node = ParseElseNode(tokens)\n    return CodeNode([IfNode(ParseExpNode(exp), code_node, inner_else_node)])\n  elif not next.value.strip():\n    Pop('code')\n    return ParseElseNode(tokens)\n  else:\n    return None\n\n\ndef ParseAtomicCodeNode(tokens):\n  def Pop(token_type=None):\n    return PopToken(tokens, token_type)\n\n  head = PopFront(tokens)\n  t = head.token_type\n  if t == 'code':\n    return RawCodeNode(head)\n  elif t == '$var':\n    id_token = Pop('id')\n    Pop('=')\n    next = PeekToken(tokens)\n    if next.token_type == 'exp':\n      exp_token = Pop()\n      return VarNode(id_token, ParseExpNode(exp_token))\n    Pop('[[')\n    code_node = ParseCodeNode(tokens)\n    Pop(']]')\n    return VarNode(id_token, code_node)\n  elif t == '$for':\n    id_token = Pop('id')\n    next_token = PeekToken(tokens)\n    if next_token.token_type == 'code':\n      sep_token = next_token\n      Pop('code')\n    else:\n      sep_token = None\n    Pop('[[')\n    code_node = ParseCodeNode(tokens)\n    Pop(']]')\n    return ForNode(id_token, sep_token, code_node)\n  elif t == '$if':\n    exp_token = Pop('code')\n    Pop('[[')\n    code_node = ParseCodeNode(tokens)\n    Pop(']]')\n    else_node = ParseElseNode(tokens)\n    return IfNode(ParseExpNode(exp_token), code_node, else_node)\n  elif t == '$range':\n    id_token = Pop('id')\n    exp1_token = Pop('exp')\n    Pop('..')\n    exp2_token = Pop('exp')\n    return RangeNode(id_token, ParseExpNode(exp1_token),\n                     ParseExpNode(exp2_token))\n  elif t == '$id':\n    return ParseExpNode(Token(head.start + 1, head.end, head.value[1:], 'id'))\n  elif t == '$($)':\n    return LiteralDollarNode(head)\n  elif t == '$':\n    exp_token = Pop('exp')\n    return ParseExpNode(exp_token)\n  elif t == '[[':\n    code_node = ParseCodeNode(tokens)\n    Pop(']]')\n    return code_node\n  else:\n    PushFront(tokens, head)\n    return None\n\n\ndef ParseCodeNode(tokens):\n  atomic_code_list = []\n  while True:\n    if not tokens:\n      break\n    atomic_code_node = ParseAtomicCodeNode(tokens)\n    if atomic_code_node:\n      atomic_code_list.append(atomic_code_node)\n    else:\n      break\n  return CodeNode(atomic_code_list)\n\n\ndef Convert(file_path):\n  s = file(file_path, 'r').read()\n  tokens = []\n  for token in Tokenize(s):\n    tokens.append(token)\n  code_node = ParseCodeNode(tokens)\n  return code_node\n\n\nclass Env:\n  def __init__(self):\n    self.variables = []\n    self.ranges = []\n\n  def Clone(self):\n    clone = Env()\n    clone.variables = self.variables[:]\n    clone.ranges = self.ranges[:]\n    return clone\n\n  def PushVariable(self, var, value):\n    # If value looks like an int, store it as an int.\n    try:\n      int_value = int(value)\n      if ('%s' % int_value) == value:\n        value = int_value\n    except Exception:\n      pass\n    self.variables[:0] = [(var, value)]\n\n  def PopVariable(self):\n    self.variables[:1] = []\n\n  def PushRange(self, var, lower, upper):\n    self.ranges[:0] = [(var, lower, upper)]\n\n  def PopRange(self):\n    self.ranges[:1] = []\n\n  def GetValue(self, identifier):\n    for (var, value) in self.variables:\n      if identifier == var:\n        return value\n\n    print 'ERROR: meta variable %s is undefined.' % (identifier,)\n    sys.exit(1)\n\n  def EvalExp(self, exp):\n    try:\n      result = eval(exp.python_exp)\n    except Exception, e:\n      print 'ERROR: caught exception %s: %s' % (e.__class__.__name__, e)\n      print ('ERROR: failed to evaluate meta expression %s at %s' %\n             (exp.python_exp, exp.token.start))\n      sys.exit(1)\n    return result\n\n  def GetRange(self, identifier):\n    for (var, lower, upper) in self.ranges:\n      if identifier == var:\n        return (lower, upper)\n\n    print 'ERROR: range %s is undefined.' % (identifier,)\n    sys.exit(1)\n\n\nclass Output:\n  def __init__(self):\n    self.string = ''\n\n  def GetLastLine(self):\n    index = self.string.rfind('\\n')\n    if index < 0:\n      return ''\n\n    return self.string[index + 1:]\n\n  def Append(self, s):\n    self.string += s\n\n\ndef RunAtomicCode(env, node, output):\n  if isinstance(node, VarNode):\n    identifier = node.identifier.value.strip()\n    result = Output()\n    RunAtomicCode(env.Clone(), node.atomic_code, result)\n    value = result.string\n    env.PushVariable(identifier, value)\n  elif isinstance(node, RangeNode):\n    identifier = node.identifier.value.strip()\n    lower = int(env.EvalExp(node.exp1))\n    upper = int(env.EvalExp(node.exp2))\n    env.PushRange(identifier, lower, upper)\n  elif isinstance(node, ForNode):\n    identifier = node.identifier.value.strip()\n    if node.sep is None:\n      sep = ''\n    else:\n      sep = node.sep.value\n    (lower, upper) = env.GetRange(identifier)\n    for i in range(lower, upper + 1):\n      new_env = env.Clone()\n      new_env.PushVariable(identifier, i)\n      RunCode(new_env, node.code, output)\n      if i != upper:\n        output.Append(sep)\n  elif isinstance(node, RawCodeNode):\n    output.Append(node.raw_code.value)\n  elif isinstance(node, IfNode):\n    cond = env.EvalExp(node.exp)\n    if cond:\n      RunCode(env.Clone(), node.then_branch, output)\n    elif node.else_branch is not None:\n      RunCode(env.Clone(), node.else_branch, output)\n  elif isinstance(node, ExpNode):\n    value = env.EvalExp(node)\n    output.Append('%s' % (value,))\n  elif isinstance(node, LiteralDollarNode):\n    output.Append('$')\n  elif isinstance(node, CodeNode):\n    RunCode(env.Clone(), node, output)\n  else:\n    print 'BAD'\n    print node\n    sys.exit(1)\n\n\ndef RunCode(env, code_node, output):\n  for atomic_code in code_node.atomic_code:\n    RunAtomicCode(env, atomic_code, output)\n\n\ndef IsComment(cur_line):\n  return '//' in cur_line\n\n\ndef IsInPreprocessorDirevative(prev_lines, cur_line):\n  if cur_line.lstrip().startswith('#'):\n    return True\n  return prev_lines != [] and prev_lines[-1].endswith('\\\\')\n\n\ndef WrapComment(line, output):\n  loc = line.find('//')\n  before_comment = line[:loc].rstrip()\n  if before_comment == '':\n    indent = loc\n  else:\n    output.append(before_comment)\n    indent = len(before_comment) - len(before_comment.lstrip())\n  prefix = indent*' ' + '// '\n  max_len = 80 - len(prefix)\n  comment = line[loc + 2:].strip()\n  segs = [seg for seg in re.split(r'(\\w+\\W*)', comment) if seg != '']\n  cur_line = ''\n  for seg in segs:\n    if len((cur_line + seg).rstrip()) < max_len:\n      cur_line += seg\n    else:\n      if cur_line.strip() != '':\n        output.append(prefix + cur_line.rstrip())\n      cur_line = seg.lstrip()\n  if cur_line.strip() != '':\n    output.append(prefix + cur_line.strip())\n\n\ndef WrapCode(line, line_concat, output):\n  indent = len(line) - len(line.lstrip())\n  prefix = indent*' '  # Prefix of the current line\n  max_len = 80 - indent - len(line_concat)  # Maximum length of the current line\n  new_prefix = prefix + 4*' '  # Prefix of a continuation line\n  new_max_len = max_len - 4  # Maximum length of a continuation line\n  # Prefers to wrap a line after a ',' or ';'.\n  segs = [seg for seg in re.split(r'([^,;]+[,;]?)', line.strip()) if seg != '']\n  cur_line = ''  # The current line without leading spaces.\n  for seg in segs:\n    # If the line is still too long, wrap at a space.\n    while cur_line == '' and len(seg.strip()) > max_len:\n      seg = seg.lstrip()\n      split_at = seg.rfind(' ', 0, max_len)\n      output.append(prefix + seg[:split_at].strip() + line_concat)\n      seg = seg[split_at + 1:]\n      prefix = new_prefix\n      max_len = new_max_len\n\n    if len((cur_line + seg).rstrip()) < max_len:\n      cur_line = (cur_line + seg).lstrip()\n    else:\n      output.append(prefix + cur_line.rstrip() + line_concat)\n      prefix = new_prefix\n      max_len = new_max_len\n      cur_line = seg.lstrip()\n  if cur_line.strip() != '':\n    output.append(prefix + cur_line.strip())\n\n\ndef WrapPreprocessorDirevative(line, output):\n  WrapCode(line, ' \\\\', output)\n\n\ndef WrapPlainCode(line, output):\n  WrapCode(line, '', output)\n\n\ndef IsHeaderGuardOrInclude(line):\n  return (re.match(r'^#(ifndef|define|endif\\s*//)\\s*[\\w_]+\\s*$', line) or\n          re.match(r'^#include\\s', line))\n\n\ndef WrapLongLine(line, output):\n  line = line.rstrip()\n  if len(line) <= 80:\n    output.append(line)\n  elif IsComment(line):\n    if IsHeaderGuardOrInclude(line):\n      # The style guide made an exception to allow long header guard lines\n      # and includes.\n      output.append(line)\n    else:\n      WrapComment(line, output)\n  elif IsInPreprocessorDirevative(output, line):\n    if IsHeaderGuardOrInclude(line):\n      # The style guide made an exception to allow long header guard lines\n      # and includes.\n      output.append(line)\n    else:\n      WrapPreprocessorDirevative(line, output)\n  else:\n    WrapPlainCode(line, output)\n\n\ndef BeautifyCode(string):\n  lines = string.splitlines()\n  output = []\n  for line in lines:\n    WrapLongLine(line, output)\n  output2 = [line.rstrip() for line in output]\n  return '\\n'.join(output2) + '\\n'\n\n\ndef main(argv):\n  if len(argv) == 1:\n    print __doc__\n    sys.exit(1)\n\n  file_path = argv[-1]\n  ast = Convert(file_path)\n  output = Output()\n  RunCode(Env(), ast, output)\n  output_str = BeautifyCode(output.string)\n  if file_path.endswith('.pump'):\n    output_file_path = file_path[:-5]\n  else:\n    output_file_path = '-'\n  if output_file_path == '-':\n    print output_str,\n  else:\n    output_file = file(output_file_path, 'w')\n    output_file.write('// This file was GENERATED by command:\\n')\n    output_file.write('//     %s %s\\n' %\n                      (os.path.basename(__file__), os.path.basename(file_path)))\n    output_file.write('// DO NOT EDIT BY HAND!!!\\n\\n')\n    output_file.write(output_str)\n    output_file.close()\n\n\nif __name__ == '__main__':\n  main(sys.argv)\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2007 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n\"\"\"Tool for uploading diffs from a version control system to the codereview app.\n\nUsage summary: upload.py [options] [-- diff_options]\n\nDiff options are passed to the diff command of the underlying system.\n\nSupported version control systems:\n  Git\n  Mercurial\n  Subversion\n\nIt is important for Git/Mercurial users to specify a tree/node/branch to diff\nagainst by using the '--rev' option.\n\"\"\"\n# This code is derived from appcfg.py in the App Engine SDK (open source),\n# and from ASPN recipe #146306.\n\nimport cookielib\nimport getpass\nimport logging\nimport md5\nimport mimetypes\nimport optparse\nimport os\nimport re\nimport socket\nimport subprocess\nimport sys\nimport urllib\nimport urllib2\nimport urlparse\n\ntry:\n  import readline\nexcept ImportError:\n  pass\n\n# The logging verbosity:\n#  0: Errors only.\n#  1: Status messages.\n#  2: Info logs.\n#  3: Debug logs.\nverbosity = 1\n\n# Max size of patch or base file.\nMAX_UPLOAD_SIZE = 900 * 1024\n\n\ndef GetEmail(prompt):\n  \"\"\"Prompts the user for their email address and returns it.\n\n  The last used email address is saved to a file and offered up as a suggestion\n  to the user. If the user presses enter without typing in anything the last\n  used email address is used. If the user enters a new address, it is saved\n  for next time we prompt.\n\n  \"\"\"\n  last_email_file_name = os.path.expanduser(\"~/.last_codereview_email_address\")\n  last_email = \"\"\n  if os.path.exists(last_email_file_name):\n    try:\n      last_email_file = open(last_email_file_name, \"r\")\n      last_email = last_email_file.readline().strip(\"\\n\")\n      last_email_file.close()\n      prompt += \" [%s]\" % last_email\n    except IOError, e:\n      pass\n  email = raw_input(prompt + \": \").strip()\n  if email:\n    try:\n      last_email_file = open(last_email_file_name, \"w\")\n      last_email_file.write(email)\n      last_email_file.close()\n    except IOError, e:\n      pass\n  else:\n    email = last_email\n  return email\n\n\ndef StatusUpdate(msg):\n  \"\"\"Print a status message to stdout.\n\n  If 'verbosity' is greater than 0, print the message.\n\n  Args:\n    msg: The string to print.\n  \"\"\"\n  if verbosity > 0:\n    print msg\n\n\ndef ErrorExit(msg):\n  \"\"\"Print an error message to stderr and exit.\"\"\"\n  print >>sys.stderr, msg\n  sys.exit(1)\n\n\nclass ClientLoginError(urllib2.HTTPError):\n  \"\"\"Raised to indicate there was an error authenticating with ClientLogin.\"\"\"\n\n  def __init__(self, url, code, msg, headers, args):\n    urllib2.HTTPError.__init__(self, url, code, msg, headers, None)\n    self.args = args\n    self.reason = args[\"Error\"]\n\n\nclass AbstractRpcServer(object):\n  \"\"\"Provides a common interface for a simple RPC server.\"\"\"\n\n  def __init__(self, host, auth_function, host_override=None, extra_headers={},\n               save_cookies=False):\n    \"\"\"Creates a new HttpRpcServer.\n\n    Args:\n      host: The host to send requests to.\n      auth_function: A function that takes no arguments and returns an\n        (email, password) tuple when called. Will be called if authentication\n        is required.\n      host_override: The host header to send to the server (defaults to host).\n      extra_headers: A dict of extra headers to append to every request.\n      save_cookies: If True, save the authentication cookies to local disk.\n        If False, use an in-memory cookiejar instead.  Subclasses must\n        implement this functionality.  Defaults to False.\n    \"\"\"\n    self.host = host\n    self.host_override = host_override\n    self.auth_function = auth_function\n    self.authenticated = False\n    self.extra_headers = extra_headers\n    self.save_cookies = save_cookies\n    self.opener = self._GetOpener()\n    if self.host_override:\n      logging.info(\"Server: %s; Host: %s\", self.host, self.host_override)\n    else:\n      logging.info(\"Server: %s\", self.host)\n\n  def _GetOpener(self):\n    \"\"\"Returns an OpenerDirector for making HTTP requests.\n\n    Returns:\n      A urllib2.OpenerDirector object.\n    \"\"\"\n    raise NotImplementedError()\n\n  def _CreateRequest(self, url, data=None):\n    \"\"\"Creates a new urllib request.\"\"\"\n    logging.debug(\"Creating request for: '%s' with payload:\\n%s\", url, data)\n    req = urllib2.Request(url, data=data)\n    if self.host_override:\n      req.add_header(\"Host\", self.host_override)\n    for key, value in self.extra_headers.iteritems():\n      req.add_header(key, value)\n    return req\n\n  def _GetAuthToken(self, email, password):\n    \"\"\"Uses ClientLogin to authenticate the user, returning an auth token.\n\n    Args:\n      email:    The user's email address\n      password: The user's password\n\n    Raises:\n      ClientLoginError: If there was an error authenticating with ClientLogin.\n      HTTPError: If there was some other form of HTTP error.\n\n    Returns:\n      The authentication token returned by ClientLogin.\n    \"\"\"\n    account_type = \"GOOGLE\"\n    if self.host.endswith(\".google.com\"):\n      # Needed for use inside Google.\n      account_type = \"HOSTED\"\n    req = self._CreateRequest(\n        url=\"https://www.google.com/accounts/ClientLogin\",\n        data=urllib.urlencode({\n            \"Email\": email,\n            \"Passwd\": password,\n            \"service\": \"ah\",\n            \"source\": \"rietveld-codereview-upload\",\n            \"accountType\": account_type,\n        }),\n    )\n    try:\n      response = self.opener.open(req)\n      response_body = response.read()\n      response_dict = dict(x.split(\"=\")\n                           for x in response_body.split(\"\\n\") if x)\n      return response_dict[\"Auth\"]\n    except urllib2.HTTPError, e:\n      if e.code == 403:\n        body = e.read()\n        response_dict = dict(x.split(\"=\", 1) for x in body.split(\"\\n\") if x)\n        raise ClientLoginError(req.get_full_url(), e.code, e.msg,\n                               e.headers, response_dict)\n      else:\n        raise\n\n  def _GetAuthCookie(self, auth_token):\n    \"\"\"Fetches authentication cookies for an authentication token.\n\n    Args:\n      auth_token: The authentication token returned by ClientLogin.\n\n    Raises:\n      HTTPError: If there was an error fetching the authentication cookies.\n    \"\"\"\n    # This is a dummy value to allow us to identify when we're successful.\n    continue_location = \"http://localhost/\"\n    args = {\"continue\": continue_location, \"auth\": auth_token}\n    req = self._CreateRequest(\"http://%s/_ah/login?%s\" %\n                              (self.host, urllib.urlencode(args)))\n    try:\n      response = self.opener.open(req)\n    except urllib2.HTTPError, e:\n      response = e\n    if (response.code != 302 or\n        response.info()[\"location\"] != continue_location):\n      raise urllib2.HTTPError(req.get_full_url(), response.code, response.msg,\n                              response.headers, response.fp)\n    self.authenticated = True\n\n  def _Authenticate(self):\n    \"\"\"Authenticates the user.\n\n    The authentication process works as follows:\n     1) We get a username and password from the user\n     2) We use ClientLogin to obtain an AUTH token for the user\n        (see http://code.google.com/apis/accounts/AuthForInstalledApps.html).\n     3) We pass the auth token to /_ah/login on the server to obtain an\n        authentication cookie. If login was successful, it tries to redirect\n        us to the URL we provided.\n\n    If we attempt to access the upload API without first obtaining an\n    authentication cookie, it returns a 401 response and directs us to\n    authenticate ourselves with ClientLogin.\n    \"\"\"\n    for i in range(3):\n      credentials = self.auth_function()\n      try:\n        auth_token = self._GetAuthToken(credentials[0], credentials[1])\n      except ClientLoginError, e:\n        if e.reason == \"BadAuthentication\":\n          print >>sys.stderr, \"Invalid username or password.\"\n          continue\n        if e.reason == \"CaptchaRequired\":\n          print >>sys.stderr, (\n              \"Please go to\\n\"\n              \"https://www.google.com/accounts/DisplayUnlockCaptcha\\n\"\n              \"and verify you are a human.  Then try again.\")\n          break\n        if e.reason == \"NotVerified\":\n          print >>sys.stderr, \"Account not verified.\"\n          break\n        if e.reason == \"TermsNotAgreed\":\n          print >>sys.stderr, \"User has not agreed to TOS.\"\n          break\n        if e.reason == \"AccountDeleted\":\n          print >>sys.stderr, \"The user account has been deleted.\"\n          break\n        if e.reason == \"AccountDisabled\":\n          print >>sys.stderr, \"The user account has been disabled.\"\n          break\n        if e.reason == \"ServiceDisabled\":\n          print >>sys.stderr, (\"The user's access to the service has been \"\n                               \"disabled.\")\n          break\n        if e.reason == \"ServiceUnavailable\":\n          print >>sys.stderr, \"The service is not available; try again later.\"\n          break\n        raise\n      self._GetAuthCookie(auth_token)\n      return\n\n  def Send(self, request_path, payload=None,\n           content_type=\"application/octet-stream\",\n           timeout=None,\n           **kwargs):\n    \"\"\"Sends an RPC and returns the response.\n\n    Args:\n      request_path: The path to send the request to, eg /api/appversion/create.\n      payload: The body of the request, or None to send an empty request.\n      content_type: The Content-Type header to use.\n      timeout: timeout in seconds; default None i.e. no timeout.\n        (Note: for large requests on OS X, the timeout doesn't work right.)\n      kwargs: Any keyword arguments are converted into query string parameters.\n\n    Returns:\n      The response body, as a string.\n    \"\"\"\n    # TODO: Don't require authentication.  Let the server say\n    # whether it is necessary.\n    if not self.authenticated:\n      self._Authenticate()\n\n    old_timeout = socket.getdefaulttimeout()\n    socket.setdefaulttimeout(timeout)\n    try:\n      tries = 0\n      while True:\n        tries += 1\n        args = dict(kwargs)\n        url = \"http://%s%s\" % (self.host, request_path)\n        if args:\n          url += \"?\" + urllib.urlencode(args)\n        req = self._CreateRequest(url=url, data=payload)\n        req.add_header(\"Content-Type\", content_type)\n        try:\n          f = self.opener.open(req)\n          response = f.read()\n          f.close()\n          return response\n        except urllib2.HTTPError, e:\n          if tries > 3:\n            raise\n          elif e.code == 401:\n            self._Authenticate()\n##           elif e.code >= 500 and e.code < 600:\n##             # Server Error - try again.\n##             continue\n          else:\n            raise\n    finally:\n      socket.setdefaulttimeout(old_timeout)\n\n\nclass HttpRpcServer(AbstractRpcServer):\n  \"\"\"Provides a simplified RPC-style interface for HTTP requests.\"\"\"\n\n  def _Authenticate(self):\n    \"\"\"Save the cookie jar after authentication.\"\"\"\n    super(HttpRpcServer, self)._Authenticate()\n    if self.save_cookies:\n      StatusUpdate(\"Saving authentication cookies to %s\" % self.cookie_file)\n      self.cookie_jar.save()\n\n  def _GetOpener(self):\n    \"\"\"Returns an OpenerDirector that supports cookies and ignores redirects.\n\n    Returns:\n      A urllib2.OpenerDirector object.\n    \"\"\"\n    opener = urllib2.OpenerDirector()\n    opener.add_handler(urllib2.ProxyHandler())\n    opener.add_handler(urllib2.UnknownHandler())\n    opener.add_handler(urllib2.HTTPHandler())\n    opener.add_handler(urllib2.HTTPDefaultErrorHandler())\n    opener.add_handler(urllib2.HTTPSHandler())\n    opener.add_handler(urllib2.HTTPErrorProcessor())\n    if self.save_cookies:\n      self.cookie_file = os.path.expanduser(\"~/.codereview_upload_cookies\")\n      self.cookie_jar = cookielib.MozillaCookieJar(self.cookie_file)\n      if os.path.exists(self.cookie_file):\n        try:\n          self.cookie_jar.load()\n          self.authenticated = True\n          StatusUpdate(\"Loaded authentication cookies from %s\" %\n                       self.cookie_file)\n        except (cookielib.LoadError, IOError):\n          # Failed to load cookies - just ignore them.\n          pass\n      else:\n        # Create an empty cookie file with mode 600\n        fd = os.open(self.cookie_file, os.O_CREAT, 0600)\n        os.close(fd)\n      # Always chmod the cookie file\n      os.chmod(self.cookie_file, 0600)\n    else:\n      # Don't save cookies across runs of update.py.\n      self.cookie_jar = cookielib.CookieJar()\n    opener.add_handler(urllib2.HTTPCookieProcessor(self.cookie_jar))\n    return opener\n\n\nparser = optparse.OptionParser(usage=\"%prog [options] [-- diff_options]\")\nparser.add_option(\"-y\", \"--assume_yes\", action=\"store_true\",\n                  dest=\"assume_yes\", default=False,\n                  help=\"Assume that the answer to yes/no questions is 'yes'.\")\n# Logging\ngroup = parser.add_option_group(\"Logging options\")\ngroup.add_option(\"-q\", \"--quiet\", action=\"store_const\", const=0,\n                 dest=\"verbose\", help=\"Print errors only.\")\ngroup.add_option(\"-v\", \"--verbose\", action=\"store_const\", const=2,\n                 dest=\"verbose\", default=1,\n                 help=\"Print info level logs (default).\")\ngroup.add_option(\"--noisy\", action=\"store_const\", const=3,\n                 dest=\"verbose\", help=\"Print all logs.\")\n# Review server\ngroup = parser.add_option_group(\"Review server options\")\ngroup.add_option(\"-s\", \"--server\", action=\"store\", dest=\"server\",\n                 default=\"codereview.appspot.com\",\n                 metavar=\"SERVER\",\n                 help=(\"The server to upload to. The format is host[:port]. \"\n                       \"Defaults to 'codereview.appspot.com'.\"))\ngroup.add_option(\"-e\", \"--email\", action=\"store\", dest=\"email\",\n                 metavar=\"EMAIL\", default=None,\n                 help=\"The username to use. Will prompt if omitted.\")\ngroup.add_option(\"-H\", \"--host\", action=\"store\", dest=\"host\",\n                 metavar=\"HOST\", default=None,\n                 help=\"Overrides the Host header sent with all RPCs.\")\ngroup.add_option(\"--no_cookies\", action=\"store_false\",\n                 dest=\"save_cookies\", default=True,\n                 help=\"Do not save authentication cookies to local disk.\")\n# Issue\ngroup = parser.add_option_group(\"Issue options\")\ngroup.add_option(\"-d\", \"--description\", action=\"store\", dest=\"description\",\n                 metavar=\"DESCRIPTION\", default=None,\n                 help=\"Optional description when creating an issue.\")\ngroup.add_option(\"-f\", \"--description_file\", action=\"store\",\n                 dest=\"description_file\", metavar=\"DESCRIPTION_FILE\",\n                 default=None,\n                 help=\"Optional path of a file that contains \"\n                      \"the description when creating an issue.\")\ngroup.add_option(\"-r\", \"--reviewers\", action=\"store\", dest=\"reviewers\",\n                 metavar=\"REVIEWERS\", default=None,\n                 help=\"Add reviewers (comma separated email addresses).\")\ngroup.add_option(\"--cc\", action=\"store\", dest=\"cc\",\n                 metavar=\"CC\", default=None,\n                 help=\"Add CC (comma separated email addresses).\")\n# Upload options\ngroup = parser.add_option_group(\"Patch options\")\ngroup.add_option(\"-m\", \"--message\", action=\"store\", dest=\"message\",\n                 metavar=\"MESSAGE\", default=None,\n                 help=\"A message to identify the patch. \"\n                      \"Will prompt if omitted.\")\ngroup.add_option(\"-i\", \"--issue\", type=\"int\", action=\"store\",\n                 metavar=\"ISSUE\", default=None,\n                 help=\"Issue number to which to add. Defaults to new issue.\")\ngroup.add_option(\"--download_base\", action=\"store_true\",\n                 dest=\"download_base\", default=False,\n                 help=\"Base files will be downloaded by the server \"\n                 \"(side-by-side diffs may not work on files with CRs).\")\ngroup.add_option(\"--rev\", action=\"store\", dest=\"revision\",\n                 metavar=\"REV\", default=None,\n                 help=\"Branch/tree/revision to diff against (used by DVCS).\")\ngroup.add_option(\"--send_mail\", action=\"store_true\",\n                 dest=\"send_mail\", default=False,\n                 help=\"Send notification email to reviewers.\")\n\n\ndef GetRpcServer(options):\n  \"\"\"Returns an instance of an AbstractRpcServer.\n\n  Returns:\n    A new AbstractRpcServer, on which RPC calls can be made.\n  \"\"\"\n\n  rpc_server_class = HttpRpcServer\n\n  def GetUserCredentials():\n    \"\"\"Prompts the user for a username and password.\"\"\"\n    email = options.email\n    if email is None:\n      email = GetEmail(\"Email (login for uploading to %s)\" % options.server)\n    password = getpass.getpass(\"Password for %s: \" % email)\n    return (email, password)\n\n  # If this is the dev_appserver, use fake authentication.\n  host = (options.host or options.server).lower()\n  if host == \"localhost\" or host.startswith(\"localhost:\"):\n    email = options.email\n    if email is None:\n      email = \"test@example.com\"\n      logging.info(\"Using debug user %s.  Override with --email\" % email)\n    server = rpc_server_class(\n        options.server,\n        lambda: (email, \"password\"),\n        host_override=options.host,\n        extra_headers={\"Cookie\":\n                       'dev_appserver_login=\"%s:False\"' % email},\n        save_cookies=options.save_cookies)\n    # Don't try to talk to ClientLogin.\n    server.authenticated = True\n    return server\n\n  return rpc_server_class(options.server, GetUserCredentials,\n                          host_override=options.host,\n                          save_cookies=options.save_cookies)\n\n\ndef EncodeMultipartFormData(fields, files):\n  \"\"\"Encode form fields for multipart/form-data.\n\n  Args:\n    fields: A sequence of (name, value) elements for regular form fields.\n    files: A sequence of (name, filename, value) elements for data to be\n           uploaded as files.\n  Returns:\n    (content_type, body) ready for httplib.HTTP instance.\n\n  Source:\n    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/146306\n  \"\"\"\n  BOUNDARY = '-M-A-G-I-C---B-O-U-N-D-A-R-Y-'\n  CRLF = '\\r\\n'\n  lines = []\n  for (key, value) in fields:\n    lines.append('--' + BOUNDARY)\n    lines.append('Content-Disposition: form-data; name=\"%s\"' % key)\n    lines.append('')\n    lines.append(value)\n  for (key, filename, value) in files:\n    lines.append('--' + BOUNDARY)\n    lines.append('Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"' %\n             (key, filename))\n    lines.append('Content-Type: %s' % GetContentType(filename))\n    lines.append('')\n    lines.append(value)\n  lines.append('--' + BOUNDARY + '--')\n  lines.append('')\n  body = CRLF.join(lines)\n  content_type = 'multipart/form-data; boundary=%s' % BOUNDARY\n  return content_type, body\n\n\ndef GetContentType(filename):\n  \"\"\"Helper to guess the content-type from the filename.\"\"\"\n  return mimetypes.guess_type(filename)[0] or 'application/octet-stream'\n\n\n# Use a shell for subcommands on Windows to get a PATH search.\nuse_shell = sys.platform.startswith(\"win\")\n\ndef RunShellWithReturnCode(command, print_output=False,\n                           universal_newlines=True):\n  \"\"\"Executes a command and returns the output from stdout and the return code.\n\n  Args:\n    command: Command to execute.\n    print_output: If True, the output is printed to stdout.\n                  If False, both stdout and stderr are ignored.\n    universal_newlines: Use universal_newlines flag (default: True).\n\n  Returns:\n    Tuple (output, return code)\n  \"\"\"\n  logging.info(\"Running %s\", command)\n  p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,\n                       shell=use_shell, universal_newlines=universal_newlines)\n  if print_output:\n    output_array = []\n    while True:\n      line = p.stdout.readline()\n      if not line:\n        break\n      print line.strip(\"\\n\")\n      output_array.append(line)\n    output = \"\".join(output_array)\n  else:\n    output = p.stdout.read()\n  p.wait()\n  errout = p.stderr.read()\n  if print_output and errout:\n    print >>sys.stderr, errout\n  p.stdout.close()\n  p.stderr.close()\n  return output, p.returncode\n\n\ndef RunShell(command, silent_ok=False, universal_newlines=True,\n             print_output=False):\n  data, retcode = RunShellWithReturnCode(command, print_output,\n                                         universal_newlines)\n  if retcode:\n    ErrorExit(\"Got error status from %s:\\n%s\" % (command, data))\n  if not silent_ok and not data:\n    ErrorExit(\"No output from %s\" % command)\n  return data\n\n\nclass VersionControlSystem(object):\n  \"\"\"Abstract base class providing an interface to the VCS.\"\"\"\n\n  def __init__(self, options):\n    \"\"\"Constructor.\n\n    Args:\n      options: Command line options.\n    \"\"\"\n    self.options = options\n\n  def GenerateDiff(self, args):\n    \"\"\"Return the current diff as a string.\n\n    Args:\n      args: Extra arguments to pass to the diff command.\n    \"\"\"\n    raise NotImplementedError(\n        \"abstract method -- subclass %s must override\" % self.__class__)\n\n  def GetUnknownFiles(self):\n    \"\"\"Return a list of files unknown to the VCS.\"\"\"\n    raise NotImplementedError(\n        \"abstract method -- subclass %s must override\" % self.__class__)\n\n  def CheckForUnknownFiles(self):\n    \"\"\"Show an \"are you sure?\" prompt if there are unknown files.\"\"\"\n    unknown_files = self.GetUnknownFiles()\n    if unknown_files:\n      print \"The following files are not added to version control:\"\n      for line in unknown_files:\n        print line\n      prompt = \"Are you sure to continue?(y/N) \"\n      answer = raw_input(prompt).strip()\n      if answer != \"y\":\n        ErrorExit(\"User aborted\")\n\n  def GetBaseFile(self, filename):\n    \"\"\"Get the content of the upstream version of a file.\n\n    Returns:\n      A tuple (base_content, new_content, is_binary, status)\n        base_content: The contents of the base file.\n        new_content: For text files, this is empty.  For binary files, this is\n          the contents of the new file, since the diff output won't contain\n          information to reconstruct the current file.\n        is_binary: True iff the file is binary.\n        status: The status of the file.\n    \"\"\"\n\n    raise NotImplementedError(\n        \"abstract method -- subclass %s must override\" % self.__class__)\n\n\n  def GetBaseFiles(self, diff):\n    \"\"\"Helper that calls GetBase file for each file in the patch.\n\n    Returns:\n      A dictionary that maps from filename to GetBaseFile's tuple.  Filenames\n      are retrieved based on lines that start with \"Index:\" or\n      \"Property changes on:\".\n    \"\"\"\n    files = {}\n    for line in diff.splitlines(True):\n      if line.startswith('Index:') or line.startswith('Property changes on:'):\n        unused, filename = line.split(':', 1)\n        # On Windows if a file has property changes its filename uses '\\'\n        # instead of '/'.\n        filename = filename.strip().replace('\\\\', '/')\n        files[filename] = self.GetBaseFile(filename)\n    return files\n\n\n  def UploadBaseFiles(self, issue, rpc_server, patch_list, patchset, options,\n                      files):\n    \"\"\"Uploads the base files (and if necessary, the current ones as well).\"\"\"\n\n    def UploadFile(filename, file_id, content, is_binary, status, is_base):\n      \"\"\"Uploads a file to the server.\"\"\"\n      file_too_large = False\n      if is_base:\n        type = \"base\"\n      else:\n        type = \"current\"\n      if len(content) > MAX_UPLOAD_SIZE:\n        print (\"Not uploading the %s file for %s because it's too large.\" %\n               (type, filename))\n        file_too_large = True\n        content = \"\"\n      checksum = md5.new(content).hexdigest()\n      if options.verbose > 0 and not file_too_large:\n        print \"Uploading %s file for %s\" % (type, filename)\n      url = \"/%d/upload_content/%d/%d\" % (int(issue), int(patchset), file_id)\n      form_fields = [(\"filename\", filename),\n                     (\"status\", status),\n                     (\"checksum\", checksum),\n                     (\"is_binary\", str(is_binary)),\n                     (\"is_current\", str(not is_base)),\n                    ]\n      if file_too_large:\n        form_fields.append((\"file_too_large\", \"1\"))\n      if options.email:\n        form_fields.append((\"user\", options.email))\n      ctype, body = EncodeMultipartFormData(form_fields,\n                                            [(\"data\", filename, content)])\n      response_body = rpc_server.Send(url, body,\n                                      content_type=ctype)\n      if not response_body.startswith(\"OK\"):\n        StatusUpdate(\"  --> %s\" % response_body)\n        sys.exit(1)\n\n    patches = dict()\n    [patches.setdefault(v, k) for k, v in patch_list]\n    for filename in patches.keys():\n      base_content, new_content, is_binary, status = files[filename]\n      file_id_str = patches.get(filename)\n      if file_id_str.find(\"nobase\") != -1:\n        base_content = None\n        file_id_str = file_id_str[file_id_str.rfind(\"_\") + 1:]\n      file_id = int(file_id_str)\n      if base_content != None:\n        UploadFile(filename, file_id, base_content, is_binary, status, True)\n      if new_content != None:\n        UploadFile(filename, file_id, new_content, is_binary, status, False)\n\n  def IsImage(self, filename):\n    \"\"\"Returns true if the filename has an image extension.\"\"\"\n    mimetype =  mimetypes.guess_type(filename)[0]\n    if not mimetype:\n      return False\n    return mimetype.startswith(\"image/\")\n\n\nclass SubversionVCS(VersionControlSystem):\n  \"\"\"Implementation of the VersionControlSystem interface for Subversion.\"\"\"\n\n  def __init__(self, options):\n    super(SubversionVCS, self).__init__(options)\n    if self.options.revision:\n      match = re.match(r\"(\\d+)(:(\\d+))?\", self.options.revision)\n      if not match:\n        ErrorExit(\"Invalid Subversion revision %s.\" % self.options.revision)\n      self.rev_start = match.group(1)\n      self.rev_end = match.group(3)\n    else:\n      self.rev_start = self.rev_end = None\n    # Cache output from \"svn list -r REVNO dirname\".\n    # Keys: dirname, Values: 2-tuple (ouput for start rev and end rev).\n    self.svnls_cache = {}\n    # SVN base URL is required to fetch files deleted in an older revision.\n    # Result is cached to not guess it over and over again in GetBaseFile().\n    required = self.options.download_base or self.options.revision is not None\n    self.svn_base = self._GuessBase(required)\n\n  def GuessBase(self, required):\n    \"\"\"Wrapper for _GuessBase.\"\"\"\n    return self.svn_base\n\n  def _GuessBase(self, required):\n    \"\"\"Returns the SVN base URL.\n\n    Args:\n      required: If true, exits if the url can't be guessed, otherwise None is\n        returned.\n    \"\"\"\n    info = RunShell([\"svn\", \"info\"])\n    for line in info.splitlines():\n      words = line.split()\n      if len(words) == 2 and words[0] == \"URL:\":\n        url = words[1]\n        scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)\n        username, netloc = urllib.splituser(netloc)\n        if username:\n          logging.info(\"Removed username from base URL\")\n        if netloc.endswith(\"svn.python.org\"):\n          if netloc == \"svn.python.org\":\n            if path.startswith(\"/projects/\"):\n              path = path[9:]\n          elif netloc != \"pythondev@svn.python.org\":\n            ErrorExit(\"Unrecognized Python URL: %s\" % url)\n          base = \"http://svn.python.org/view/*checkout*%s/\" % path\n          logging.info(\"Guessed Python base = %s\", base)\n        elif netloc.endswith(\"svn.collab.net\"):\n          if path.startswith(\"/repos/\"):\n            path = path[6:]\n          base = \"http://svn.collab.net/viewvc/*checkout*%s/\" % path\n          logging.info(\"Guessed CollabNet base = %s\", base)\n        elif netloc.endswith(\".googlecode.com\"):\n          path = path + \"/\"\n          base = urlparse.urlunparse((\"http\", netloc, path, params,\n                                      query, fragment))\n          logging.info(\"Guessed Google Code base = %s\", base)\n        else:\n          path = path + \"/\"\n          base = urlparse.urlunparse((scheme, netloc, path, params,\n                                      query, fragment))\n          logging.info(\"Guessed base = %s\", base)\n        return base\n    if required:\n      ErrorExit(\"Can't find URL in output from svn info\")\n    return None\n\n  def GenerateDiff(self, args):\n    cmd = [\"svn\", \"diff\"]\n    if self.options.revision:\n      cmd += [\"-r\", self.options.revision]\n    cmd.extend(args)\n    data = RunShell(cmd)\n    count = 0\n    for line in data.splitlines():\n      if line.startswith(\"Index:\") or line.startswith(\"Property changes on:\"):\n        count += 1\n        logging.info(line)\n    if not count:\n      ErrorExit(\"No valid patches found in output from svn diff\")\n    return data\n\n  def _CollapseKeywords(self, content, keyword_str):\n    \"\"\"Collapses SVN keywords.\"\"\"\n    # svn cat translates keywords but svn diff doesn't. As a result of this\n    # behavior patching.PatchChunks() fails with a chunk mismatch error.\n    # This part was originally written by the Review Board development team\n    # who had the same problem (http://reviews.review-board.org/r/276/).\n    # Mapping of keywords to known aliases\n    svn_keywords = {\n      # Standard keywords\n      'Date':                ['Date', 'LastChangedDate'],\n      'Revision':            ['Revision', 'LastChangedRevision', 'Rev'],\n      'Author':              ['Author', 'LastChangedBy'],\n      'HeadURL':             ['HeadURL', 'URL'],\n      'Id':                  ['Id'],\n\n      # Aliases\n      'LastChangedDate':     ['LastChangedDate', 'Date'],\n      'LastChangedRevision': ['LastChangedRevision', 'Rev', 'Revision'],\n      'LastChangedBy':       ['LastChangedBy', 'Author'],\n      'URL':                 ['URL', 'HeadURL'],\n    }\n\n    def repl(m):\n       if m.group(2):\n         return \"$%s::%s$\" % (m.group(1), \" \" * len(m.group(3)))\n       return \"$%s$\" % m.group(1)\n    keywords = [keyword\n                for name in keyword_str.split(\" \")\n                for keyword in svn_keywords.get(name, [])]\n    return re.sub(r\"\\$(%s):(:?)([^\\$]+)\\$\" % '|'.join(keywords), repl, content)\n\n  def GetUnknownFiles(self):\n    status = RunShell([\"svn\", \"status\", \"--ignore-externals\"], silent_ok=True)\n    unknown_files = []\n    for line in status.split(\"\\n\"):\n      if line and line[0] == \"?\":\n        unknown_files.append(line)\n    return unknown_files\n\n  def ReadFile(self, filename):\n    \"\"\"Returns the contents of a file.\"\"\"\n    file = open(filename, 'rb')\n    result = \"\"\n    try:\n      result = file.read()\n    finally:\n      file.close()\n    return result\n\n  def GetStatus(self, filename):\n    \"\"\"Returns the status of a file.\"\"\"\n    if not self.options.revision:\n      status = RunShell([\"svn\", \"status\", \"--ignore-externals\", filename])\n      if not status:\n        ErrorExit(\"svn status returned no output for %s\" % filename)\n      status_lines = status.splitlines()\n      # If file is in a cl, the output will begin with\n      # \"\\n--- Changelist 'cl_name':\\n\".  See\n      # http://svn.collab.net/repos/svn/trunk/notes/changelist-design.txt\n      if (len(status_lines) == 3 and\n          not status_lines[0] and\n          status_lines[1].startswith(\"--- Changelist\")):\n        status = status_lines[2]\n      else:\n        status = status_lines[0]\n    # If we have a revision to diff against we need to run \"svn list\"\n    # for the old and the new revision and compare the results to get\n    # the correct status for a file.\n    else:\n      dirname, relfilename = os.path.split(filename)\n      if dirname not in self.svnls_cache:\n        cmd = [\"svn\", \"list\", \"-r\", self.rev_start, dirname or \".\"]\n        out, returncode = RunShellWithReturnCode(cmd)\n        if returncode:\n          ErrorExit(\"Failed to get status for %s.\" % filename)\n        old_files = out.splitlines()\n        args = [\"svn\", \"list\"]\n        if self.rev_end:\n          args += [\"-r\", self.rev_end]\n        cmd = args + [dirname or \".\"]\n        out, returncode = RunShellWithReturnCode(cmd)\n        if returncode:\n          ErrorExit(\"Failed to run command %s\" % cmd)\n        self.svnls_cache[dirname] = (old_files, out.splitlines())\n      old_files, new_files = self.svnls_cache[dirname]\n      if relfilename in old_files and relfilename not in new_files:\n        status = \"D   \"\n      elif relfilename in old_files and relfilename in new_files:\n        status = \"M   \"\n      else:\n        status = \"A   \"\n    return status\n\n  def GetBaseFile(self, filename):\n    status = self.GetStatus(filename)\n    base_content = None\n    new_content = None\n\n    # If a file is copied its status will be \"A  +\", which signifies\n    # \"addition-with-history\".  See \"svn st\" for more information.  We need to\n    # upload the original file or else diff parsing will fail if the file was\n    # edited.\n    if status[0] == \"A\" and status[3] != \"+\":\n      # We'll need to upload the new content if we're adding a binary file\n      # since diff's output won't contain it.\n      mimetype = RunShell([\"svn\", \"propget\", \"svn:mime-type\", filename],\n                          silent_ok=True)\n      base_content = \"\"\n      is_binary = mimetype and not mimetype.startswith(\"text/\")\n      if is_binary and self.IsImage(filename):\n        new_content = self.ReadFile(filename)\n    elif (status[0] in (\"M\", \"D\", \"R\") or\n          (status[0] == \"A\" and status[3] == \"+\") or  # Copied file.\n          (status[0] == \" \" and status[1] == \"M\")):  # Property change.\n      args = []\n      if self.options.revision:\n        url = \"%s/%s@%s\" % (self.svn_base, filename, self.rev_start)\n      else:\n        # Don't change filename, it's needed later.\n        url = filename\n        args += [\"-r\", \"BASE\"]\n      cmd = [\"svn\"] + args + [\"propget\", \"svn:mime-type\", url]\n      mimetype, returncode = RunShellWithReturnCode(cmd)\n      if returncode:\n        # File does not exist in the requested revision.\n        # Reset mimetype, it contains an error message.\n        mimetype = \"\"\n      get_base = False\n      is_binary = mimetype and not mimetype.startswith(\"text/\")\n      if status[0] == \" \":\n        # Empty base content just to force an upload.\n        base_content = \"\"\n      elif is_binary:\n        if self.IsImage(filename):\n          get_base = True\n          if status[0] == \"M\":\n            if not self.rev_end:\n              new_content = self.ReadFile(filename)\n            else:\n              url = \"%s/%s@%s\" % (self.svn_base, filename, self.rev_end)\n              new_content = RunShell([\"svn\", \"cat\", url],\n                                     universal_newlines=True, silent_ok=True)\n        else:\n          base_content = \"\"\n      else:\n        get_base = True\n\n      if get_base:\n        if is_binary:\n          universal_newlines = False\n        else:\n          universal_newlines = True\n        if self.rev_start:\n          # \"svn cat -r REV delete_file.txt\" doesn't work. cat requires\n          # the full URL with \"@REV\" appended instead of using \"-r\" option.\n          url = \"%s/%s@%s\" % (self.svn_base, filename, self.rev_start)\n          base_content = RunShell([\"svn\", \"cat\", url],\n                                  universal_newlines=universal_newlines,\n                                  silent_ok=True)\n        else:\n          base_content = RunShell([\"svn\", \"cat\", filename],\n                                  universal_newlines=universal_newlines,\n                                  silent_ok=True)\n        if not is_binary:\n          args = []\n          if self.rev_start:\n            url = \"%s/%s@%s\" % (self.svn_base, filename, self.rev_start)\n          else:\n            url = filename\n            args += [\"-r\", \"BASE\"]\n          cmd = [\"svn\"] + args + [\"propget\", \"svn:keywords\", url]\n          keywords, returncode = RunShellWithReturnCode(cmd)\n          if keywords and not returncode:\n            base_content = self._CollapseKeywords(base_content, keywords)\n    else:\n      StatusUpdate(\"svn status returned unexpected output: %s\" % status)\n      sys.exit(1)\n    return base_content, new_content, is_binary, status[0:5]\n\n\nclass GitVCS(VersionControlSystem):\n  \"\"\"Implementation of the VersionControlSystem interface for Git.\"\"\"\n\n  def __init__(self, options):\n    super(GitVCS, self).__init__(options)\n    # Map of filename -> hash of base file.\n    self.base_hashes = {}\n\n  def GenerateDiff(self, extra_args):\n    # This is more complicated than svn's GenerateDiff because we must convert\n    # the diff output to include an svn-style \"Index:\" line as well as record\n    # the hashes of the base files, so we can upload them along with our diff.\n    if self.options.revision:\n      extra_args = [self.options.revision] + extra_args\n    gitdiff = RunShell([\"git\", \"diff\", \"--full-index\"] + extra_args)\n    svndiff = []\n    filecount = 0\n    filename = None\n    for line in gitdiff.splitlines():\n      match = re.match(r\"diff --git a/(.*) b/.*$\", line)\n      if match:\n        filecount += 1\n        filename = match.group(1)\n        svndiff.append(\"Index: %s\\n\" % filename)\n      else:\n        # The \"index\" line in a git diff looks like this (long hashes elided):\n        #   index 82c0d44..b2cee3f 100755\n        # We want to save the left hash, as that identifies the base file.\n        match = re.match(r\"index (\\w+)\\.\\.\", line)\n        if match:\n          self.base_hashes[filename] = match.group(1)\n      svndiff.append(line + \"\\n\")\n    if not filecount:\n      ErrorExit(\"No valid patches found in output from git diff\")\n    return \"\".join(svndiff)\n\n  def GetUnknownFiles(self):\n    status = RunShell([\"git\", \"ls-files\", \"--exclude-standard\", \"--others\"],\n                      silent_ok=True)\n    return status.splitlines()\n\n  def GetBaseFile(self, filename):\n    hash = self.base_hashes[filename]\n    base_content = None\n    new_content = None\n    is_binary = False\n    if hash == \"0\" * 40:  # All-zero hash indicates no base file.\n      status = \"A\"\n      base_content = \"\"\n    else:\n      status = \"M\"\n      base_content, returncode = RunShellWithReturnCode([\"git\", \"show\", hash])\n      if returncode:\n        ErrorExit(\"Got error status from 'git show %s'\" % hash)\n    return (base_content, new_content, is_binary, status)\n\n\nclass MercurialVCS(VersionControlSystem):\n  \"\"\"Implementation of the VersionControlSystem interface for Mercurial.\"\"\"\n\n  def __init__(self, options, repo_dir):\n    super(MercurialVCS, self).__init__(options)\n    # Absolute path to repository (we can be in a subdir)\n    self.repo_dir = os.path.normpath(repo_dir)\n    # Compute the subdir\n    cwd = os.path.normpath(os.getcwd())\n    assert cwd.startswith(self.repo_dir)\n    self.subdir = cwd[len(self.repo_dir):].lstrip(r\"\\/\")\n    if self.options.revision:\n      self.base_rev = self.options.revision\n    else:\n      self.base_rev = RunShell([\"hg\", \"parent\", \"-q\"]).split(':')[1].strip()\n\n  def _GetRelPath(self, filename):\n    \"\"\"Get relative path of a file according to the current directory,\n    given its logical path in the repo.\"\"\"\n    assert filename.startswith(self.subdir), filename\n    return filename[len(self.subdir):].lstrip(r\"\\/\")\n\n  def GenerateDiff(self, extra_args):\n    # If no file specified, restrict to the current subdir\n    extra_args = extra_args or [\".\"]\n    cmd = [\"hg\", \"diff\", \"--git\", \"-r\", self.base_rev] + extra_args\n    data = RunShell(cmd, silent_ok=True)\n    svndiff = []\n    filecount = 0\n    for line in data.splitlines():\n      m = re.match(\"diff --git a/(\\S+) b/(\\S+)\", line)\n      if m:\n        # Modify line to make it look like as it comes from svn diff.\n        # With this modification no changes on the server side are required\n        # to make upload.py work with Mercurial repos.\n        # NOTE: for proper handling of moved/copied files, we have to use\n        # the second filename.\n        filename = m.group(2)\n        svndiff.append(\"Index: %s\" % filename)\n        svndiff.append(\"=\" * 67)\n        filecount += 1\n        logging.info(line)\n      else:\n        svndiff.append(line)\n    if not filecount:\n      ErrorExit(\"No valid patches found in output from hg diff\")\n    return \"\\n\".join(svndiff) + \"\\n\"\n\n  def GetUnknownFiles(self):\n    \"\"\"Return a list of files unknown to the VCS.\"\"\"\n    args = []\n    status = RunShell([\"hg\", \"status\", \"--rev\", self.base_rev, \"-u\", \".\"],\n        silent_ok=True)\n    unknown_files = []\n    for line in status.splitlines():\n      st, fn = line.split(\" \", 1)\n      if st == \"?\":\n        unknown_files.append(fn)\n    return unknown_files\n\n  def GetBaseFile(self, filename):\n    # \"hg status\" and \"hg cat\" both take a path relative to the current subdir\n    # rather than to the repo root, but \"hg diff\" has given us the full path\n    # to the repo root.\n    base_content = \"\"\n    new_content = None\n    is_binary = False\n    oldrelpath = relpath = self._GetRelPath(filename)\n    # \"hg status -C\" returns two lines for moved/copied files, one otherwise\n    out = RunShell([\"hg\", \"status\", \"-C\", \"--rev\", self.base_rev, relpath])\n    out = out.splitlines()\n    # HACK: strip error message about missing file/directory if it isn't in\n    # the working copy\n    if out[0].startswith('%s: ' % relpath):\n      out = out[1:]\n    if len(out) > 1:\n      # Moved/copied => considered as modified, use old filename to\n      # retrieve base contents\n      oldrelpath = out[1].strip()\n      status = \"M\"\n    else:\n      status, _ = out[0].split(' ', 1)\n    if status != \"A\":\n      base_content = RunShell([\"hg\", \"cat\", \"-r\", self.base_rev, oldrelpath],\n        silent_ok=True)\n      is_binary = \"\\0\" in base_content  # Mercurial's heuristic\n    if status != \"R\":\n      new_content = open(relpath, \"rb\").read()\n      is_binary = is_binary or \"\\0\" in new_content\n    if is_binary and base_content:\n      # Fetch again without converting newlines\n      base_content = RunShell([\"hg\", \"cat\", \"-r\", self.base_rev, oldrelpath],\n        silent_ok=True, universal_newlines=False)\n    if not is_binary or not self.IsImage(relpath):\n      new_content = None\n    return base_content, new_content, is_binary, status\n\n\n# NOTE: The SplitPatch function is duplicated in engine.py, keep them in sync.\ndef SplitPatch(data):\n  \"\"\"Splits a patch into separate pieces for each file.\n\n  Args:\n    data: A string containing the output of svn diff.\n\n  Returns:\n    A list of 2-tuple (filename, text) where text is the svn diff output\n      pertaining to filename.\n  \"\"\"\n  patches = []\n  filename = None\n  diff = []\n  for line in data.splitlines(True):\n    new_filename = None\n    if line.startswith('Index:'):\n      unused, new_filename = line.split(':', 1)\n      new_filename = new_filename.strip()\n    elif line.startswith('Property changes on:'):\n      unused, temp_filename = line.split(':', 1)\n      # When a file is modified, paths use '/' between directories, however\n      # when a property is modified '\\' is used on Windows.  Make them the same\n      # otherwise the file shows up twice.\n      temp_filename = temp_filename.strip().replace('\\\\', '/')\n      if temp_filename != filename:\n        # File has property changes but no modifications, create a new diff.\n        new_filename = temp_filename\n    if new_filename:\n      if filename and diff:\n        patches.append((filename, ''.join(diff)))\n      filename = new_filename\n      diff = [line]\n      continue\n    if diff is not None:\n      diff.append(line)\n  if filename and diff:\n    patches.append((filename, ''.join(diff)))\n  return patches\n\n\ndef UploadSeparatePatches(issue, rpc_server, patchset, data, options):\n  \"\"\"Uploads a separate patch for each file in the diff output.\n\n  Returns a list of [patch_key, filename] for each file.\n  \"\"\"\n  patches = SplitPatch(data)\n  rv = []\n  for patch in patches:\n    if len(patch[1]) > MAX_UPLOAD_SIZE:\n      print (\"Not uploading the patch for \" + patch[0] +\n             \" because the file is too large.\")\n      continue\n    form_fields = [(\"filename\", patch[0])]\n    if not options.download_base:\n      form_fields.append((\"content_upload\", \"1\"))\n    files = [(\"data\", \"data.diff\", patch[1])]\n    ctype, body = EncodeMultipartFormData(form_fields, files)\n    url = \"/%d/upload_patch/%d\" % (int(issue), int(patchset))\n    print \"Uploading patch for \" + patch[0]\n    response_body = rpc_server.Send(url, body, content_type=ctype)\n    lines = response_body.splitlines()\n    if not lines or lines[0] != \"OK\":\n      StatusUpdate(\"  --> %s\" % response_body)\n      sys.exit(1)\n    rv.append([lines[1], patch[0]])\n  return rv\n\n\ndef GuessVCS(options):\n  \"\"\"Helper to guess the version control system.\n\n  This examines the current directory, guesses which VersionControlSystem\n  we're using, and returns an instance of the appropriate class.  Exit with an\n  error if we can't figure it out.\n\n  Returns:\n    A VersionControlSystem instance. Exits if the VCS can't be guessed.\n  \"\"\"\n  # Mercurial has a command to get the base directory of a repository\n  # Try running it, but don't die if we don't have hg installed.\n  # NOTE: we try Mercurial first as it can sit on top of an SVN working copy.\n  try:\n    out, returncode = RunShellWithReturnCode([\"hg\", \"root\"])\n    if returncode == 0:\n      return MercurialVCS(options, out.strip())\n  except OSError, (errno, message):\n    if errno != 2:  # ENOENT -- they don't have hg installed.\n      raise\n\n  # Subversion has a .svn in all working directories.\n  if os.path.isdir('.svn'):\n    logging.info(\"Guessed VCS = Subversion\")\n    return SubversionVCS(options)\n\n  # Git has a command to test if you're in a git tree.\n  # Try running it, but don't die if we don't have git installed.\n  try:\n    out, returncode = RunShellWithReturnCode([\"git\", \"rev-parse\",\n                                              \"--is-inside-work-tree\"])\n    if returncode == 0:\n      return GitVCS(options)\n  except OSError, (errno, message):\n    if errno != 2:  # ENOENT -- they don't have git installed.\n      raise\n\n  ErrorExit((\"Could not guess version control system. \"\n             \"Are you in a working copy directory?\"))\n\n\ndef RealMain(argv, data=None):\n  \"\"\"The real main function.\n\n  Args:\n    argv: Command line arguments.\n    data: Diff contents. If None (default) the diff is generated by\n      the VersionControlSystem implementation returned by GuessVCS().\n\n  Returns:\n    A 2-tuple (issue id, patchset id).\n    The patchset id is None if the base files are not uploaded by this\n    script (applies only to SVN checkouts).\n  \"\"\"\n  logging.basicConfig(format=(\"%(asctime).19s %(levelname)s %(filename)s:\"\n                              \"%(lineno)s %(message)s \"))\n  os.environ['LC_ALL'] = 'C'\n  options, args = parser.parse_args(argv[1:])\n  global verbosity\n  verbosity = options.verbose\n  if verbosity >= 3:\n    logging.getLogger().setLevel(logging.DEBUG)\n  elif verbosity >= 2:\n    logging.getLogger().setLevel(logging.INFO)\n  vcs = GuessVCS(options)\n  if isinstance(vcs, SubversionVCS):\n    # base field is only allowed for Subversion.\n    # Note: Fetching base files may become deprecated in future releases.\n    base = vcs.GuessBase(options.download_base)\n  else:\n    base = None\n  if not base and options.download_base:\n    options.download_base = True\n    logging.info(\"Enabled upload of base file\")\n  if not options.assume_yes:\n    vcs.CheckForUnknownFiles()\n  if data is None:\n    data = vcs.GenerateDiff(args)\n  files = vcs.GetBaseFiles(data)\n  if verbosity >= 1:\n    print \"Upload server:\", options.server, \"(change with -s/--server)\"\n  if options.issue:\n    prompt = \"Message describing this patch set: \"\n  else:\n    prompt = \"New issue subject: \"\n  message = options.message or raw_input(prompt).strip()\n  if not message:\n    ErrorExit(\"A non-empty message is required\")\n  rpc_server = GetRpcServer(options)\n  form_fields = [(\"subject\", message)]\n  if base:\n    form_fields.append((\"base\", base))\n  if options.issue:\n    form_fields.append((\"issue\", str(options.issue)))\n  if options.email:\n    form_fields.append((\"user\", options.email))\n  if options.reviewers:\n    for reviewer in options.reviewers.split(','):\n      if \"@\" in reviewer and not reviewer.split(\"@\")[1].count(\".\") == 1:\n        ErrorExit(\"Invalid email address: %s\" % reviewer)\n    form_fields.append((\"reviewers\", options.reviewers))\n  if options.cc:\n    for cc in options.cc.split(','):\n      if \"@\" in cc and not cc.split(\"@\")[1].count(\".\") == 1:\n        ErrorExit(\"Invalid email address: %s\" % cc)\n    form_fields.append((\"cc\", options.cc))\n  description = options.description\n  if options.description_file:\n    if options.description:\n      ErrorExit(\"Can't specify description and description_file\")\n    file = open(options.description_file, 'r')\n    description = file.read()\n    file.close()\n  if description:\n    form_fields.append((\"description\", description))\n  # Send a hash of all the base file so the server can determine if a copy\n  # already exists in an earlier patchset.\n  base_hashes = \"\"\n  for file, info in files.iteritems():\n    if not info[0] is None:\n      checksum = md5.new(info[0]).hexdigest()\n      if base_hashes:\n        base_hashes += \"|\"\n      base_hashes += checksum + \":\" + file\n  form_fields.append((\"base_hashes\", base_hashes))\n  # If we're uploading base files, don't send the email before the uploads, so\n  # that it contains the file status.\n  if options.send_mail and options.download_base:\n    form_fields.append((\"send_mail\", \"1\"))\n  if not options.download_base:\n    form_fields.append((\"content_upload\", \"1\"))\n  if len(data) > MAX_UPLOAD_SIZE:\n    print \"Patch is large, so uploading file patches separately.\"\n    uploaded_diff_file = []\n    form_fields.append((\"separate_patches\", \"1\"))\n  else:\n    uploaded_diff_file = [(\"data\", \"data.diff\", data)]\n  ctype, body = EncodeMultipartFormData(form_fields, uploaded_diff_file)\n  response_body = rpc_server.Send(\"/upload\", body, content_type=ctype)\n  patchset = None\n  if not options.download_base or not uploaded_diff_file:\n    lines = response_body.splitlines()\n    if len(lines) >= 2:\n      msg = lines[0]\n      patchset = lines[1].strip()\n      patches = [x.split(\" \", 1) for x in lines[2:]]\n    else:\n      msg = response_body\n  else:\n    msg = response_body\n  StatusUpdate(msg)\n  if not response_body.startswith(\"Issue created.\") and \\\n  not response_body.startswith(\"Issue updated.\"):\n    sys.exit(0)\n  issue = msg[msg.rfind(\"/\")+1:]\n\n  if not uploaded_diff_file:\n    result = UploadSeparatePatches(issue, rpc_server, patchset, data, options)\n    if not options.download_base:\n      patches = result\n\n  if not options.download_base:\n    vcs.UploadBaseFiles(issue, rpc_server, patches, patchset, options, files)\n    if options.send_mail:\n      rpc_server.Send(\"/\" + issue + \"/mail\", payload=\"\")\n  return issue, patchset\n\n\ndef main():\n  try:\n    RealMain(sys.argv)\n  except KeyboardInterrupt:\n    print\n    StatusUpdate(\"Interrupted.\")\n    sys.exit(1)\n\n\nif __name__ == \"__main__\":\n  main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload_gtest.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"upload_gtest.py v0.1.0 -- uploads a Google Test patch for review.\n\nThis simple wrapper passes all command line flags and\n--cc=googletestframework@googlegroups.com to upload.py.\n\nUSAGE: upload_gtest.py [options for upload.py]\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport sys\n\nCC_FLAG = '--cc='\nGTEST_GROUP = 'googletestframework@googlegroups.com'\n\n\ndef main():\n  # Finds the path to upload.py, assuming it is in the same directory\n  # as this file.\n  my_dir = os.path.dirname(os.path.abspath(__file__))\n  upload_py_path = os.path.join(my_dir, 'upload.py')\n\n  # Adds Google Test discussion group to the cc line if it's not there\n  # already.\n  upload_py_argv = [upload_py_path]\n  found_cc_flag = False\n  for arg in sys.argv[1:]:\n    if arg.startswith(CC_FLAG):\n      found_cc_flag = True\n      cc_line = arg[len(CC_FLAG):]\n      cc_list = [addr for addr in cc_line.split(',') if addr]\n      if GTEST_GROUP not in cc_list:\n        cc_list.append(GTEST_GROUP)\n      upload_py_argv.append(CC_FLAG + ','.join(cc_list))\n    else:\n      upload_py_argv.append(arg)\n\n  if not found_cc_flag:\n    upload_py_argv.append(CC_FLAG + GTEST_GROUP)\n\n  # Invokes upload.py with the modified command line flags.\n  os.execv(upload_py_path, upload_py_argv)\n\n\nif __name__ == '__main__':\n  main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-all.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: mheule@google.com (Markus Heule)\n//\n// Google C++ Testing Framework (Google Test)\n//\n// Sometimes it's desirable to build Google Test by compiling a single file.\n// This file serves this purpose.\n\n// This line ensures that gtest.h can be compiled on its own, even\n// when it's fused.\n#include <gtest/gtest.h>\n\n// The following lines pull in the real gtest *.cc files.\n#include \"src/gtest.cc\"\n#include \"src/gtest-death-test.cc\"\n#include \"src/gtest-filepath.cc\"\n#include \"src/gtest-port.cc\"\n#include \"src/gtest-test-part.cc\"\n#include \"src/gtest-typed-test.cc\"\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-death-test.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev)\n//\n// This file implements death tests.\n\n#include <gtest/gtest-death-test.h>\n#include <gtest/internal/gtest-port.h>\n\n#if GTEST_HAS_DEATH_TEST\n\n#if GTEST_OS_MAC\n#include <crt_externs.h>\n#endif  // GTEST_OS_MAC\n\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <stdarg.h>\n\n#if GTEST_OS_WINDOWS\n#include <windows.h>\n#else\n#include <sys/mman.h>\n#include <sys/wait.h>\n#endif  // GTEST_OS_WINDOWS\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n#include <gtest/gtest-message.h>\n#include <gtest/internal/gtest-string.h>\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\nnamespace testing {\n\n// Constants.\n\n// The default death test style.\nstatic const char kDefaultDeathTestStyle[] = \"fast\";\n\nGTEST_DEFINE_string_(\n    death_test_style,\n    internal::StringFromGTestEnv(\"death_test_style\", kDefaultDeathTestStyle),\n    \"Indicates how to run a death test in a forked child process: \"\n    \"\\\"threadsafe\\\" (child process re-executes the test binary \"\n    \"from the beginning, running only the specific death test) or \"\n    \"\\\"fast\\\" (child process runs the death test immediately \"\n    \"after forking).\");\n\nGTEST_DEFINE_bool_(\n    death_test_use_fork,\n    internal::BoolFromGTestEnv(\"death_test_use_fork\", false),\n    \"Instructs to use fork()/_exit() instead of clone() in death tests. \"\n    \"Ignored and always uses fork() on POSIX systems where clone() is not \"\n    \"implemented. Useful when running under valgrind or similar tools if \"\n    \"those do not support clone(). Valgrind 3.3.1 will just fail if \"\n    \"it sees an unsupported combination of clone() flags. \"\n    \"It is not recommended to use this flag w/o valgrind though it will \"\n    \"work in 99% of the cases. Once valgrind is fixed, this flag will \"\n    \"most likely be removed.\");\n\nnamespace internal {\nGTEST_DEFINE_string_(\n    internal_run_death_test, \"\",\n    \"Indicates the file, line number, temporal index of \"\n    \"the single death test to run, and a file descriptor to \"\n    \"which a success code may be sent, all separated by \"\n    \"colons.  This flag is specified if and only if the current \"\n    \"process is a sub-process launched for running a thread-safe \"\n    \"death test.  FOR INTERNAL USE ONLY.\");\n}  // namespace internal\n\n#if GTEST_HAS_DEATH_TEST\n\n// ExitedWithCode constructor.\nExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {\n}\n\n// ExitedWithCode function-call operator.\nbool ExitedWithCode::operator()(int exit_status) const {\n#if GTEST_OS_WINDOWS\n  return exit_status == exit_code_;\n#else\n  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;\n#endif  // GTEST_OS_WINDOWS\n}\n\n#if !GTEST_OS_WINDOWS\n// KilledBySignal constructor.\nKilledBySignal::KilledBySignal(int signum) : signum_(signum) {\n}\n\n// KilledBySignal function-call operator.\nbool KilledBySignal::operator()(int exit_status) const {\n  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;\n}\n#endif  // !GTEST_OS_WINDOWS\n\nnamespace internal {\n\n// Utilities needed for death tests.\n\n// Generates a textual description of a given exit code, in the format\n// specified by wait(2).\nstatic String ExitSummary(int exit_code) {\n  Message m;\n#if GTEST_OS_WINDOWS\n  m << \"Exited with exit status \" << exit_code;\n#else\n  if (WIFEXITED(exit_code)) {\n    m << \"Exited with exit status \" << WEXITSTATUS(exit_code);\n  } else if (WIFSIGNALED(exit_code)) {\n    m << \"Terminated by signal \" << WTERMSIG(exit_code);\n  }\n#ifdef WCOREDUMP\n  if (WCOREDUMP(exit_code)) {\n    m << \" (core dumped)\";\n  }\n#endif\n#endif  // GTEST_OS_WINDOWS\n  return m.GetString();\n}\n\n// Returns true if exit_status describes a process that was terminated\n// by a signal, or exited normally with a nonzero exit code.\nbool ExitedUnsuccessfully(int exit_status) {\n  return !ExitedWithCode(0)(exit_status);\n}\n\n#if !GTEST_OS_WINDOWS\n// Generates a textual failure message when a death test finds more than\n// one thread running, or cannot determine the number of threads, prior\n// to executing the given statement.  It is the responsibility of the\n// caller not to pass a thread_count of 1.\nstatic String DeathTestThreadWarning(size_t thread_count) {\n  Message msg;\n  msg << \"Death tests use fork(), which is unsafe particularly\"\n      << \" in a threaded context. For this test, \" << GTEST_NAME_ << \" \";\n  if (thread_count == 0)\n    msg << \"couldn't detect the number of threads.\";\n  else\n    msg << \"detected \" << thread_count << \" threads.\";\n  return msg.GetString();\n}\n#endif  // !GTEST_OS_WINDOWS\n\n// Flag characters for reporting a death test that did not die.\nstatic const char kDeathTestLived = 'L';\nstatic const char kDeathTestReturned = 'R';\nstatic const char kDeathTestInternalError = 'I';\n\n// An enumeration describing all of the possible ways that a death test\n// can conclude.  DIED means that the process died while executing the\n// test code; LIVED means that process lived beyond the end of the test\n// code; and RETURNED means that the test statement attempted a \"return,\"\n// which is not allowed.  IN_PROGRESS means the test has not yet\n// concluded.\nenum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED };\n\n// Routine for aborting the program which is safe to call from an\n// exec-style death test child process, in which case the error\n// message is propagated back to the parent process.  Otherwise, the\n// message is simply printed to stderr.  In either case, the program\n// then exits with status 1.\nvoid DeathTestAbort(const String& message) {\n  // On a POSIX system, this function may be called from a threadsafe-style\n  // death test child process, which operates on a very small stack.  Use\n  // the heap for any additional non-minuscule memory requirements.\n  const InternalRunDeathTestFlag* const flag =\n      GetUnitTestImpl()->internal_run_death_test_flag();\n  if (flag != NULL) {\n    FILE* parent = posix::FDOpen(flag->write_fd(), \"w\");\n    fputc(kDeathTestInternalError, parent);\n    fprintf(parent, \"%s\", message.c_str());\n    fflush(parent);\n    _exit(1);\n  } else {\n    fprintf(stderr, \"%s\", message.c_str());\n    fflush(stderr);\n    abort();\n  }\n}\n\n// A replacement for CHECK that calls DeathTestAbort if the assertion\n// fails.\n#define GTEST_DEATH_TEST_CHECK_(expression) \\\n  do { \\\n    if (!::testing::internal::IsTrue(expression)) { \\\n      DeathTestAbort(::testing::internal::String::Format( \\\n          \"CHECK failed: File %s, line %d: %s\", \\\n          __FILE__, __LINE__, #expression)); \\\n    } \\\n  } while (::testing::internal::AlwaysFalse())\n\n// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for\n// evaluating any system call that fulfills two conditions: it must return\n// -1 on failure, and set errno to EINTR when it is interrupted and\n// should be tried again.  The macro expands to a loop that repeatedly\n// evaluates the expression as long as it evaluates to -1 and sets\n// errno to EINTR.  If the expression evaluates to -1 but errno is\n// something other than EINTR, DeathTestAbort is called.\n#define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \\\n  do { \\\n    int gtest_retval; \\\n    do { \\\n      gtest_retval = (expression); \\\n    } while (gtest_retval == -1 && errno == EINTR); \\\n    if (gtest_retval == -1) { \\\n      DeathTestAbort(::testing::internal::String::Format( \\\n          \"CHECK failed: File %s, line %d: %s != -1\", \\\n          __FILE__, __LINE__, #expression)); \\\n    } \\\n  } while (::testing::internal::AlwaysFalse())\n\n// Returns the message describing the last system error in errno.\nString GetLastErrnoDescription() {\n    return String(errno == 0 ? \"\" : posix::StrError(errno));\n}\n\n// This is called from a death test parent process to read a failure\n// message from the death test child process and log it with the FATAL\n// severity. On Windows, the message is read from a pipe handle. On other\n// platforms, it is read from a file descriptor.\nstatic void FailFromInternalError(int fd) {\n  Message error;\n  char buffer[256];\n  int num_read;\n\n  do {\n    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {\n      buffer[num_read] = '\\0';\n      error << buffer;\n    }\n  } while (num_read == -1 && errno == EINTR);\n\n  if (num_read == 0) {\n    GTEST_LOG_(FATAL) << error.GetString();\n  } else {\n    const int last_error = errno;\n    GTEST_LOG_(FATAL) << \"Error while reading death test internal: \"\n                      << GetLastErrnoDescription() << \" [\" << last_error << \"]\";\n  }\n}\n\n// Death test constructor.  Increments the running death test count\n// for the current test.\nDeathTest::DeathTest() {\n  TestInfo* const info = GetUnitTestImpl()->current_test_info();\n  if (info == NULL) {\n    DeathTestAbort(\"Cannot run a death test outside of a TEST or \"\n                   \"TEST_F construct\");\n  }\n}\n\n// Creates and returns a death test by dispatching to the current\n// death test factory.\nbool DeathTest::Create(const char* statement, const RE* regex,\n                       const char* file, int line, DeathTest** test) {\n  return GetUnitTestImpl()->death_test_factory()->Create(\n      statement, regex, file, line, test);\n}\n\nconst char* DeathTest::LastMessage() {\n  return last_death_test_message_.c_str();\n}\n\nvoid DeathTest::set_last_death_test_message(const String& message) {\n  last_death_test_message_ = message;\n}\n\nString DeathTest::last_death_test_message_;\n\n// Provides cross platform implementation for some death functionality.\nclass DeathTestImpl : public DeathTest {\n protected:\n  DeathTestImpl(const char* a_statement, const RE* a_regex)\n      : statement_(a_statement),\n        regex_(a_regex),\n        spawned_(false),\n        status_(-1),\n        outcome_(IN_PROGRESS),\n        read_fd_(-1),\n        write_fd_(-1) {}\n\n  // read_fd_ is expected to be closed and cleared by a derived class.\n  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }\n\n  void Abort(AbortReason reason);\n  virtual bool Passed(bool status_ok);\n\n  const char* statement() const { return statement_; }\n  const RE* regex() const { return regex_; }\n  bool spawned() const { return spawned_; }\n  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }\n  int status() const { return status_; }\n  void set_status(int a_status) { status_ = a_status; }\n  DeathTestOutcome outcome() const { return outcome_; }\n  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }\n  int read_fd() const { return read_fd_; }\n  void set_read_fd(int fd) { read_fd_ = fd; }\n  int write_fd() const { return write_fd_; }\n  void set_write_fd(int fd) { write_fd_ = fd; }\n\n  // Called in the parent process only. Reads the result code of the death\n  // test child process via a pipe, interprets it to set the outcome_\n  // member, and closes read_fd_.  Outputs diagnostics and terminates in\n  // case of unexpected codes.\n  void ReadAndInterpretStatusByte();\n\n private:\n  // The textual content of the code this object is testing.  This class\n  // doesn't own this string and should not attempt to delete it.\n  const char* const statement_;\n  // The regular expression which test output must match.  DeathTestImpl\n  // doesn't own this object and should not attempt to delete it.\n  const RE* const regex_;\n  // True if the death test child process has been successfully spawned.\n  bool spawned_;\n  // The exit status of the child process.\n  int status_;\n  // How the death test concluded.\n  DeathTestOutcome outcome_;\n  // Descriptor to the read end of the pipe to the child process.  It is\n  // always -1 in the child process.  The child keeps its write end of the\n  // pipe in write_fd_.\n  int read_fd_;\n  // Descriptor to the child's write end of the pipe to the parent process.\n  // It is always -1 in the parent process.  The parent keeps its end of the\n  // pipe in read_fd_.\n  int write_fd_;\n};\n\n// Called in the parent process only. Reads the result code of the death\n// test child process via a pipe, interprets it to set the outcome_\n// member, and closes read_fd_.  Outputs diagnostics and terminates in\n// case of unexpected codes.\nvoid DeathTestImpl::ReadAndInterpretStatusByte() {\n  char flag;\n  int bytes_read;\n\n  // The read() here blocks until data is available (signifying the\n  // failure of the death test) or until the pipe is closed (signifying\n  // its success), so it's okay to call this in the parent before\n  // the child process has exited.\n  do {\n    bytes_read = posix::Read(read_fd(), &flag, 1);\n  } while (bytes_read == -1 && errno == EINTR);\n\n  if (bytes_read == 0) {\n    set_outcome(DIED);\n  } else if (bytes_read == 1) {\n    switch (flag) {\n      case kDeathTestReturned:\n        set_outcome(RETURNED);\n        break;\n      case kDeathTestLived:\n        set_outcome(LIVED);\n        break;\n      case kDeathTestInternalError:\n        FailFromInternalError(read_fd());  // Does not return.\n        break;\n      default:\n        GTEST_LOG_(FATAL) << \"Death test child process reported \"\n                          << \"unexpected status byte (\"\n                          << static_cast<unsigned int>(flag) << \")\";\n    }\n  } else {\n    GTEST_LOG_(FATAL) << \"Read from death test child process failed: \"\n                      << GetLastErrnoDescription();\n  }\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));\n  set_read_fd(-1);\n}\n\n// Signals that the death test code which should have exited, didn't.\n// Should be called only in a death test child process.\n// Writes a status byte to the child's status file descriptor, then\n// calls _exit(1).\nvoid DeathTestImpl::Abort(AbortReason reason) {\n  // The parent process considers the death test to be a failure if\n  // it finds any data in our pipe.  So, here we write a single flag byte\n  // to the pipe, then exit.\n  const char status_ch =\n      reason == TEST_DID_NOT_DIE ? kDeathTestLived : kDeathTestReturned;\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(write_fd()));\n  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)\n}\n\n// Assesses the success or failure of a death test, using both private\n// members which have previously been set, and one argument:\n//\n// Private data members:\n//   outcome:  An enumeration describing how the death test\n//             concluded: DIED, LIVED, or RETURNED.  The death test fails\n//             in the latter two cases.\n//   status:   The exit status of the child process. On *nix, it is in the\n//             in the format specified by wait(2). On Windows, this is the\n//             value supplied to the ExitProcess() API or a numeric code\n//             of the exception that terminated the program.\n//   regex:    A regular expression object to be applied to\n//             the test's captured standard error output; the death test\n//             fails if it does not match.\n//\n// Argument:\n//   status_ok: true if exit_status is acceptable in the context of\n//              this particular death test, which fails if it is false\n//\n// Returns true iff all of the above conditions are met.  Otherwise, the\n// first failing condition, in the order given above, is the one that is\n// reported. Also sets the last death test message string.\nbool DeathTestImpl::Passed(bool status_ok) {\n  if (!spawned())\n    return false;\n\n  const String error_message = GetCapturedStderr();\n\n  bool success = false;\n  Message buffer;\n\n  buffer << \"Death test: \" << statement() << \"\\n\";\n  switch (outcome()) {\n    case LIVED:\n      buffer << \"    Result: failed to die.\\n\"\n             << \" Error msg: \" << error_message;\n      break;\n    case RETURNED:\n      buffer << \"    Result: illegal return in test statement.\\n\"\n             << \" Error msg: \" << error_message;\n      break;\n    case DIED:\n      if (status_ok) {\n        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());\n        if (matched) {\n          success = true;\n        } else {\n          buffer << \"    Result: died but not with expected error.\\n\"\n                 << \"  Expected: \" << regex()->pattern() << \"\\n\"\n                 << \"Actual msg: \" << error_message;\n        }\n      } else {\n        buffer << \"    Result: died but not with expected exit code:\\n\"\n               << \"            \" << ExitSummary(status()) << \"\\n\";\n      }\n      break;\n    case IN_PROGRESS:\n    default:\n      GTEST_LOG_(FATAL)\n          << \"DeathTest::Passed somehow called before conclusion of test\";\n  }\n\n  DeathTest::set_last_death_test_message(buffer.GetString());\n  return success;\n}\n\n#if GTEST_OS_WINDOWS\n// WindowsDeathTest implements death tests on Windows. Due to the\n// specifics of starting new processes on Windows, death tests there are\n// always threadsafe, and Google Test considers the\n// --gtest_death_test_style=fast setting to be equivalent to\n// --gtest_death_test_style=threadsafe there.\n//\n// A few implementation notes:  Like the Linux version, the Windows\n// implementation uses pipes for child-to-parent communication. But due to\n// the specifics of pipes on Windows, some extra steps are required:\n//\n// 1. The parent creates a communication pipe and stores handles to both\n//    ends of it.\n// 2. The parent starts the child and provides it with the information\n//    necessary to acquire the handle to the write end of the pipe.\n// 3. The child acquires the write end of the pipe and signals the parent\n//    using a Windows event.\n// 4. Now the parent can release the write end of the pipe on its side. If\n//    this is done before step 3, the object's reference count goes down to\n//    0 and it is destroyed, preventing the child from acquiring it. The\n//    parent now has to release it, or read operations on the read end of\n//    the pipe will not return when the child terminates.\n// 5. The parent reads child's output through the pipe (outcome code and\n//    any possible error messages) from the pipe, and its stderr and then\n//    determines whether to fail the test.\n//\n// Note: to distinguish Win32 API calls from the local method and function\n// calls, the former are explicitly resolved in the global namespace.\n//\nclass WindowsDeathTest : public DeathTestImpl {\n public:\n  WindowsDeathTest(const char* statement,\n                   const RE* regex,\n                   const char* file,\n                   int line)\n      : DeathTestImpl(statement, regex), file_(file), line_(line) {}\n\n  // All of these virtual functions are inherited from DeathTest.\n  virtual int Wait();\n  virtual TestRole AssumeRole();\n\n private:\n  // The name of the file in which the death test is located.\n  const char* const file_;\n  // The line number on which the death test is located.\n  const int line_;\n  // Handle to the write end of the pipe to the child process.\n  AutoHandle write_handle_;\n  // Child process handle.\n  AutoHandle child_handle_;\n  // Event the child process uses to signal the parent that it has\n  // acquired the handle to the write end of the pipe. After seeing this\n  // event the parent can release its own handles to make sure its\n  // ReadFile() calls return when the child terminates.\n  AutoHandle event_handle_;\n};\n\n// Waits for the child in a death test to exit, returning its exit\n// status, or 0 if no child process exists.  As a side effect, sets the\n// outcome data member.\nint WindowsDeathTest::Wait() {\n  if (!spawned())\n    return 0;\n\n  // Wait until the child either signals that it has acquired the write end\n  // of the pipe or it dies.\n  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };\n  switch (::WaitForMultipleObjects(2,\n                                   wait_handles,\n                                   FALSE,  // Waits for any of the handles.\n                                   INFINITE)) {\n    case WAIT_OBJECT_0:\n    case WAIT_OBJECT_0 + 1:\n      break;\n    default:\n      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.\n  }\n\n  // The child has acquired the write end of the pipe or exited.\n  // We release the handle on our side and continue.\n  write_handle_.Reset();\n  event_handle_.Reset();\n\n  ReadAndInterpretStatusByte();\n\n  // Waits for the child process to exit if it haven't already. This\n  // returns immediately if the child has already exited, regardless of\n  // whether previous calls to WaitForMultipleObjects synchronized on this\n  // handle or not.\n  GTEST_DEATH_TEST_CHECK_(\n      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),\n                                             INFINITE));\n  DWORD status;\n  GTEST_DEATH_TEST_CHECK_(::GetExitCodeProcess(child_handle_.Get(), &status)\n                          != FALSE);\n  child_handle_.Reset();\n  set_status(static_cast<int>(status));\n  return this->status();\n}\n\n// The AssumeRole process for a Windows death test.  It creates a child\n// process with the same executable as the current process to run the\n// death test.  The child process is given the --gtest_filter and\n// --gtest_internal_run_death_test flags such that it knows to run the\n// current death test only.\nDeathTest::TestRole WindowsDeathTest::AssumeRole() {\n  const UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const TestInfo* const info = impl->current_test_info();\n  const int death_test_index = info->result()->death_test_count();\n\n  if (flag != NULL) {\n    // ParseInternalRunDeathTestFlag() has performed all the necessary\n    // processing.\n    set_write_fd(flag->write_fd());\n    return EXECUTE_TEST;\n  }\n\n  // WindowsDeathTest uses an anonymous pipe to communicate results of\n  // a death test.\n  SECURITY_ATTRIBUTES handles_are_inheritable = {\n    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };\n  HANDLE read_handle, write_handle;\n  GTEST_DEATH_TEST_CHECK_(\n      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,\n                   0)  // Default buffer size.\n      != FALSE);\n  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),\n                                O_RDONLY));\n  write_handle_.Reset(write_handle);\n  event_handle_.Reset(::CreateEvent(\n      &handles_are_inheritable,\n      TRUE,    // The event will automatically reset to non-signaled state.\n      FALSE,   // The initial state is non-signalled.\n      NULL));  // The even is unnamed.\n  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);\n  const String filter_flag = String::Format(\"--%s%s=%s.%s\",\n                                            GTEST_FLAG_PREFIX_, kFilterFlag,\n                                            info->test_case_name(),\n                                            info->name());\n  const String internal_flag = String::Format(\n    \"--%s%s=%s|%d|%d|%u|%Iu|%Iu\",\n      GTEST_FLAG_PREFIX_,\n      kInternalRunDeathTestFlag,\n      file_, line_,\n      death_test_index,\n      static_cast<unsigned int>(::GetCurrentProcessId()),\n      // size_t has the same with as pointers on both 32-bit and 64-bit\n      // Windows platforms.\n      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.\n      reinterpret_cast<size_t>(write_handle),\n      reinterpret_cast<size_t>(event_handle_.Get()));\n\n  char executable_path[_MAX_PATH + 1];  // NOLINT\n  GTEST_DEATH_TEST_CHECK_(\n      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,\n                                            executable_path,\n                                            _MAX_PATH));\n\n  String command_line = String::Format(\"%s %s \\\"%s\\\"\",\n                                       ::GetCommandLineA(),\n                                       filter_flag.c_str(),\n                                       internal_flag.c_str());\n\n  DeathTest::set_last_death_test_message(\"\");\n\n  CaptureStderr();\n  // Flush the log buffers since the log streams are shared with the child.\n  FlushInfoLog();\n\n  // The child process will share the standard handles with the parent.\n  STARTUPINFOA startup_info;\n  memset(&startup_info, 0, sizeof(STARTUPINFO));\n  startup_info.dwFlags = STARTF_USESTDHANDLES;\n  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);\n  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);\n  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);\n\n  PROCESS_INFORMATION process_info;\n  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(\n      executable_path,\n      const_cast<char*>(command_line.c_str()),\n      NULL,   // Retuned process handle is not inheritable.\n      NULL,   // Retuned thread handle is not inheritable.\n      TRUE,   // Child inherits all inheritable handles (for write_handle_).\n      0x0,    // Default creation flags.\n      NULL,   // Inherit the parent's environment.\n      UnitTest::GetInstance()->original_working_dir(),\n      &startup_info,\n      &process_info) != FALSE);\n  child_handle_.Reset(process_info.hProcess);\n  ::CloseHandle(process_info.hThread);\n  set_spawned(true);\n  return OVERSEE_TEST;\n}\n#else  // We are not on Windows.\n\n// ForkingDeathTest provides implementations for most of the abstract\n// methods of the DeathTest interface.  Only the AssumeRole method is\n// left undefined.\nclass ForkingDeathTest : public DeathTestImpl {\n public:\n  ForkingDeathTest(const char* statement, const RE* regex);\n\n  // All of these virtual functions are inherited from DeathTest.\n  virtual int Wait();\n\n protected:\n  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }\n\n private:\n  // PID of child process during death test; 0 in the child process itself.\n  pid_t child_pid_;\n};\n\n// Constructs a ForkingDeathTest.\nForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)\n    : DeathTestImpl(a_statement, a_regex),\n      child_pid_(-1) {}\n\n// Waits for the child in a death test to exit, returning its exit\n// status, or 0 if no child process exists.  As a side effect, sets the\n// outcome data member.\nint ForkingDeathTest::Wait() {\n  if (!spawned())\n    return 0;\n\n  ReadAndInterpretStatusByte();\n\n  int status_value;\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));\n  set_status(status_value);\n  return status_value;\n}\n\n// A concrete death test class that forks, then immediately runs the test\n// in the child process.\nclass NoExecDeathTest : public ForkingDeathTest {\n public:\n  NoExecDeathTest(const char* a_statement, const RE* a_regex) :\n      ForkingDeathTest(a_statement, a_regex) { }\n  virtual TestRole AssumeRole();\n};\n\n// The AssumeRole process for a fork-and-run death test.  It implements a\n// straightforward fork, with a simple pipe to transmit the status byte.\nDeathTest::TestRole NoExecDeathTest::AssumeRole() {\n  const size_t thread_count = GetThreadCount();\n  if (thread_count != 1) {\n    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);\n  }\n\n  int pipe_fd[2];\n  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);\n\n  DeathTest::set_last_death_test_message(\"\");\n  CaptureStderr();\n  // When we fork the process below, the log file buffers are copied, but the\n  // file descriptors are shared.  We flush all log files here so that closing\n  // the file descriptors in the child process doesn't throw off the\n  // synchronization between descriptors and buffers in the parent process.\n  // This is as close to the fork as possible to avoid a race condition in case\n  // there are multiple threads running before the death test, and another\n  // thread writes to the log file.\n  FlushInfoLog();\n\n  const pid_t child_pid = fork();\n  GTEST_DEATH_TEST_CHECK_(child_pid != -1);\n  set_child_pid(child_pid);\n  if (child_pid == 0) {\n    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));\n    set_write_fd(pipe_fd[1]);\n    // Redirects all logging to stderr in the child process to prevent\n    // concurrent writes to the log files.  We capture stderr in the parent\n    // process and append the child process' output to a log.\n    LogToStderr();\n    // Event forwarding to the listeners of event listener API mush be shut\n    // down in death test subprocesses.\n    GetUnitTestImpl()->listeners()->SuppressEventForwarding();\n    return EXECUTE_TEST;\n  } else {\n    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));\n    set_read_fd(pipe_fd[0]);\n    set_spawned(true);\n    return OVERSEE_TEST;\n  }\n}\n\n// A concrete death test class that forks and re-executes the main\n// program from the beginning, with command-line flags set that cause\n// only this specific death test to be run.\nclass ExecDeathTest : public ForkingDeathTest {\n public:\n  ExecDeathTest(const char* a_statement, const RE* a_regex,\n                const char* file, int line) :\n      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }\n  virtual TestRole AssumeRole();\n private:\n  // The name of the file in which the death test is located.\n  const char* const file_;\n  // The line number on which the death test is located.\n  const int line_;\n};\n\n// Utility class for accumulating command-line arguments.\nclass Arguments {\n public:\n  Arguments() {\n    args_.push_back(NULL);\n  }\n\n  ~Arguments() {\n    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();\n         ++i) {\n      free(*i);\n    }\n  }\n  void AddArgument(const char* argument) {\n    args_.insert(args_.end() - 1, posix::StrDup(argument));\n  }\n\n  template <typename Str>\n  void AddArguments(const ::std::vector<Str>& arguments) {\n    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();\n         i != arguments.end();\n         ++i) {\n      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));\n    }\n  }\n  char* const* Argv() {\n    return &args_[0];\n  }\n private:\n  std::vector<char*> args_;\n};\n\n// A struct that encompasses the arguments to the child process of a\n// threadsafe-style death test process.\nstruct ExecDeathTestArgs {\n  char* const* argv;  // Command-line arguments for the child's call to exec\n  int close_fd;       // File descriptor to close; the read end of a pipe\n};\n\n#if GTEST_OS_MAC\ninline char** GetEnviron() {\n  // When Google Test is built as a framework on MacOS X, the environ variable\n  // is unavailable. Apple's documentation (man environ) recommends using\n  // _NSGetEnviron() instead.\n  return *_NSGetEnviron();\n}\n#else\n// Some POSIX platforms expect you to declare environ. extern \"C\" makes\n// it reside in the global namespace.\nextern \"C\" char** environ;\ninline char** GetEnviron() { return environ; }\n#endif  // GTEST_OS_MAC\n\n// The main function for a threadsafe-style death test child process.\n// This function is called in a clone()-ed process and thus must avoid\n// any potentially unsafe operations like malloc or libc functions.\nstatic int ExecDeathTestChildMain(void* child_arg) {\n  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));\n\n  // We need to execute the test program in the same environment where\n  // it was originally invoked.  Therefore we change to the original\n  // working directory first.\n  const char* const original_dir =\n      UnitTest::GetInstance()->original_working_dir();\n  // We can safely call chdir() as it's a direct system call.\n  if (chdir(original_dir) != 0) {\n    DeathTestAbort(String::Format(\"chdir(\\\"%s\\\") failed: %s\",\n                                  original_dir,\n                                  GetLastErrnoDescription().c_str()));\n    return EXIT_FAILURE;\n  }\n\n  // We can safely call execve() as it's a direct system call.  We\n  // cannot use execvp() as it's a libc function and thus potentially\n  // unsafe.  Since execve() doesn't search the PATH, the user must\n  // invoke the test program via a valid path that contains at least\n  // one path separator.\n  execve(args->argv[0], args->argv, GetEnviron());\n  DeathTestAbort(String::Format(\"execve(%s, ...) in %s failed: %s\",\n                                args->argv[0],\n                                original_dir,\n                                GetLastErrnoDescription().c_str()));\n  return EXIT_FAILURE;\n}\n\n// Two utility routines that together determine the direction the stack\n// grows.\n// This could be accomplished more elegantly by a single recursive\n// function, but we want to guard against the unlikely possibility of\n// a smart compiler optimizing the recursion away.\nbool StackLowerThanAddress(const void* ptr) {\n  int dummy;\n  return &dummy < ptr;\n}\n\nbool StackGrowsDown() {\n  int dummy;\n  return StackLowerThanAddress(&dummy);\n}\n\n// A threadsafe implementation of fork(2) for threadsafe-style death tests\n// that uses clone(2).  It dies with an error message if anything goes\n// wrong.\nstatic pid_t ExecDeathTestFork(char* const* argv, int close_fd) {\n  ExecDeathTestArgs args = { argv, close_fd };\n  pid_t child_pid = -1;\n\n#if GTEST_HAS_CLONE\n  const bool use_fork = GTEST_FLAG(death_test_use_fork);\n\n  if (!use_fork) {\n    static const bool stack_grows_down = StackGrowsDown();\n    const size_t stack_size = getpagesize();\n    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.\n    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,\n                             MAP_ANON | MAP_PRIVATE, -1, 0);\n    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);\n    void* const stack_top =\n        static_cast<char*>(stack) + (stack_grows_down ? stack_size : 0);\n\n    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);\n\n    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);\n  }\n#else\n  const bool use_fork = true;\n#endif  // GTEST_HAS_CLONE\n\n  if (use_fork && (child_pid = fork()) == 0) {\n      ExecDeathTestChildMain(&args);\n      _exit(0);\n  }\n\n  GTEST_DEATH_TEST_CHECK_(child_pid != -1);\n  return child_pid;\n}\n\n// The AssumeRole process for a fork-and-exec death test.  It re-executes the\n// main program from the beginning, setting the --gtest_filter\n// and --gtest_internal_run_death_test flags to cause only the current\n// death test to be re-run.\nDeathTest::TestRole ExecDeathTest::AssumeRole() {\n  const UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const TestInfo* const info = impl->current_test_info();\n  const int death_test_index = info->result()->death_test_count();\n\n  if (flag != NULL) {\n    set_write_fd(flag->write_fd());\n    return EXECUTE_TEST;\n  }\n\n  int pipe_fd[2];\n  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);\n  // Clear the close-on-exec flag on the write end of the pipe, lest\n  // it be closed when the child process does an exec:\n  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);\n\n  const String filter_flag =\n      String::Format(\"--%s%s=%s.%s\",\n                     GTEST_FLAG_PREFIX_, kFilterFlag,\n                     info->test_case_name(), info->name());\n  const String internal_flag =\n      String::Format(\"--%s%s=%s|%d|%d|%d\",\n                     GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag,\n                     file_, line_, death_test_index, pipe_fd[1]);\n  Arguments args;\n  args.AddArguments(GetArgvs());\n  args.AddArgument(filter_flag.c_str());\n  args.AddArgument(internal_flag.c_str());\n\n  DeathTest::set_last_death_test_message(\"\");\n\n  CaptureStderr();\n  // See the comment in NoExecDeathTest::AssumeRole for why the next line\n  // is necessary.\n  FlushInfoLog();\n\n  const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]);\n  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));\n  set_child_pid(child_pid);\n  set_read_fd(pipe_fd[0]);\n  set_spawned(true);\n  return OVERSEE_TEST;\n}\n\n#endif  // !GTEST_OS_WINDOWS\n\n// Creates a concrete DeathTest-derived class that depends on the\n// --gtest_death_test_style flag, and sets the pointer pointed to\n// by the \"test\" argument to its address.  If the test should be\n// skipped, sets that pointer to NULL.  Returns true, unless the\n// flag is set to an invalid value.\nbool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,\n                                     const char* file, int line,\n                                     DeathTest** test) {\n  UnitTestImpl* const impl = GetUnitTestImpl();\n  const InternalRunDeathTestFlag* const flag =\n      impl->internal_run_death_test_flag();\n  const int death_test_index = impl->current_test_info()\n      ->increment_death_test_count();\n\n  if (flag != NULL) {\n    if (death_test_index > flag->index()) {\n      DeathTest::set_last_death_test_message(String::Format(\n          \"Death test count (%d) somehow exceeded expected maximum (%d)\",\n          death_test_index, flag->index()));\n      return false;\n    }\n\n    if (!(flag->file() == file && flag->line() == line &&\n          flag->index() == death_test_index)) {\n      *test = NULL;\n      return true;\n    }\n  }\n\n#if GTEST_OS_WINDOWS\n  if (GTEST_FLAG(death_test_style) == \"threadsafe\" ||\n      GTEST_FLAG(death_test_style) == \"fast\") {\n    *test = new WindowsDeathTest(statement, regex, file, line);\n  }\n#else\n  if (GTEST_FLAG(death_test_style) == \"threadsafe\") {\n    *test = new ExecDeathTest(statement, regex, file, line);\n  } else if (GTEST_FLAG(death_test_style) == \"fast\") {\n    *test = new NoExecDeathTest(statement, regex);\n  }\n#endif  // GTEST_OS_WINDOWS\n  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.\n    DeathTest::set_last_death_test_message(String::Format(\n        \"Unknown death test style \\\"%s\\\" encountered\",\n        GTEST_FLAG(death_test_style).c_str()));\n    return false;\n  }\n\n  return true;\n}\n\n// Splits a given string on a given delimiter, populating a given\n// vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have\n// ::std::string, so we can use it here.\nstatic void SplitString(const ::std::string& str, char delimiter,\n                        ::std::vector< ::std::string>* dest) {\n  ::std::vector< ::std::string> parsed;\n  ::std::string::size_type pos = 0;\n  while (::testing::internal::AlwaysTrue()) {\n    const ::std::string::size_type colon = str.find(delimiter, pos);\n    if (colon == ::std::string::npos) {\n      parsed.push_back(str.substr(pos));\n      break;\n    } else {\n      parsed.push_back(str.substr(pos, colon - pos));\n      pos = colon + 1;\n    }\n  }\n  dest->swap(parsed);\n}\n\n#if GTEST_OS_WINDOWS\n// Recreates the pipe and event handles from the provided parameters,\n// signals the event, and returns a file descriptor wrapped around the pipe\n// handle. This function is called in the child process only.\nint GetStatusFileDescriptor(unsigned int parent_process_id,\n                            size_t write_handle_as_size_t,\n                            size_t event_handle_as_size_t) {\n  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,\n                                                   FALSE,  // Non-inheritable.\n                                                   parent_process_id));\n  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {\n    DeathTestAbort(String::Format(\"Unable to open parent process %u\",\n                                  parent_process_id));\n  }\n\n  // TODO(vladl@google.com): Replace the following check with a\n  // compile-time assertion when available.\n  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));\n\n  const HANDLE write_handle =\n      reinterpret_cast<HANDLE>(write_handle_as_size_t);\n  HANDLE dup_write_handle;\n\n  // The newly initialized handle is accessible only in in the parent\n  // process. To obtain one accessible within the child, we need to use\n  // DuplicateHandle.\n  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,\n                         ::GetCurrentProcess(), &dup_write_handle,\n                         0x0,    // Requested privileges ignored since\n                                 // DUPLICATE_SAME_ACCESS is used.\n                         FALSE,  // Request non-inheritable handler.\n                         DUPLICATE_SAME_ACCESS)) {\n    DeathTestAbort(String::Format(\n        \"Unable to duplicate the pipe handle %Iu from the parent process %u\",\n        write_handle_as_size_t, parent_process_id));\n  }\n\n  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);\n  HANDLE dup_event_handle;\n\n  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,\n                         ::GetCurrentProcess(), &dup_event_handle,\n                         0x0,\n                         FALSE,\n                         DUPLICATE_SAME_ACCESS)) {\n    DeathTestAbort(String::Format(\n        \"Unable to duplicate the event handle %Iu from the parent process %u\",\n        event_handle_as_size_t, parent_process_id));\n  }\n\n  const int write_fd =\n      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);\n  if (write_fd == -1) {\n    DeathTestAbort(String::Format(\n        \"Unable to convert pipe handle %Iu to a file descriptor\",\n        write_handle_as_size_t));\n  }\n\n  // Signals the parent that the write end of the pipe has been acquired\n  // so the parent can release its own write end.\n  ::SetEvent(dup_event_handle);\n\n  return write_fd;\n}\n#endif  // GTEST_OS_WINDOWS\n\n// Returns a newly created InternalRunDeathTestFlag object with fields\n// initialized from the GTEST_FLAG(internal_run_death_test) flag if\n// the flag is specified; otherwise returns NULL.\nInternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {\n  if (GTEST_FLAG(internal_run_death_test) == \"\") return NULL;\n\n  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we\n  // can use it here.\n  int line = -1;\n  int index = -1;\n  ::std::vector< ::std::string> fields;\n  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);\n  int write_fd = -1;\n\n#if GTEST_OS_WINDOWS\n  unsigned int parent_process_id = 0;\n  size_t write_handle_as_size_t = 0;\n  size_t event_handle_as_size_t = 0;\n\n  if (fields.size() != 6\n      || !ParseNaturalNumber(fields[1], &line)\n      || !ParseNaturalNumber(fields[2], &index)\n      || !ParseNaturalNumber(fields[3], &parent_process_id)\n      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)\n      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {\n    DeathTestAbort(String::Format(\n        \"Bad --gtest_internal_run_death_test flag: %s\",\n        GTEST_FLAG(internal_run_death_test).c_str()));\n  }\n  write_fd = GetStatusFileDescriptor(parent_process_id,\n                                     write_handle_as_size_t,\n                                     event_handle_as_size_t);\n#else\n  if (fields.size() != 4\n      || !ParseNaturalNumber(fields[1], &line)\n      || !ParseNaturalNumber(fields[2], &index)\n      || !ParseNaturalNumber(fields[3], &write_fd)) {\n    DeathTestAbort(String::Format(\n        \"Bad --gtest_internal_run_death_test flag: %s\",\n        GTEST_FLAG(internal_run_death_test).c_str()));\n  }\n#endif  // GTEST_OS_WINDOWS\n  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);\n}\n\n}  // namespace internal\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n}  // namespace testing\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-filepath.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: keith.ray@gmail.com (Keith Ray)\n\n#include <gtest/internal/gtest-filepath.h>\n#include <gtest/internal/gtest-port.h>\n\n#include <stdlib.h>\n\n#if GTEST_OS_WINDOWS_MOBILE\n#include <windows.h>\n#elif GTEST_OS_WINDOWS\n#include <direct.h>\n#include <io.h>\n#elif GTEST_OS_SYMBIAN\n// Symbian OpenC has PATH_MAX in sys/syslimits.h\n#include <sys/syslimits.h>\n#else\n#include <limits.h>\n#include <climits>  // Some Linux distributions define PATH_MAX here.\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n#if GTEST_OS_WINDOWS\n#define GTEST_PATH_MAX_ _MAX_PATH\n#elif defined(PATH_MAX)\n#define GTEST_PATH_MAX_ PATH_MAX\n#elif defined(_XOPEN_PATH_MAX)\n#define GTEST_PATH_MAX_ _XOPEN_PATH_MAX\n#else\n#define GTEST_PATH_MAX_ _POSIX_PATH_MAX\n#endif  // GTEST_OS_WINDOWS\n\n#include <gtest/internal/gtest-string.h>\n\nnamespace testing {\nnamespace internal {\n\n#if GTEST_OS_WINDOWS\n// On Windows, '\\\\' is the standard path separator, but many tools and the\n// Windows API also accept '/' as an alternate path separator. Unless otherwise\n// noted, a file path can contain either kind of path separators, or a mixture\n// of them.\nconst char kPathSeparator = '\\\\';\nconst char kAlternatePathSeparator = '/';\nconst char kPathSeparatorString[] = \"\\\\\";\nconst char kAlternatePathSeparatorString[] = \"/\";\n#if GTEST_OS_WINDOWS_MOBILE\n// Windows CE doesn't have a current directory. You should not use\n// the current directory in tests on Windows CE, but this at least\n// provides a reasonable fallback.\nconst char kCurrentDirectoryString[] = \"\\\\\";\n// Windows CE doesn't define INVALID_FILE_ATTRIBUTES\nconst DWORD kInvalidFileAttributes = 0xffffffff;\n#else\nconst char kCurrentDirectoryString[] = \".\\\\\";\n#endif  // GTEST_OS_WINDOWS_MOBILE\n#else\nconst char kPathSeparator = '/';\nconst char kPathSeparatorString[] = \"/\";\nconst char kCurrentDirectoryString[] = \"./\";\n#endif  // GTEST_OS_WINDOWS\n\n// Returns whether the given character is a valid path separator.\nstatic bool IsPathSeparator(char c) {\n#if GTEST_HAS_ALT_PATH_SEP_\n  return (c == kPathSeparator) || (c == kAlternatePathSeparator);\n#else\n  return c == kPathSeparator;\n#endif\n}\n\n// Returns the current working directory, or \"\" if unsuccessful.\nFilePath FilePath::GetCurrentDir() {\n#if GTEST_OS_WINDOWS_MOBILE\n  // Windows CE doesn't have a current directory, so we just return\n  // something reasonable.\n  return FilePath(kCurrentDirectoryString);\n#elif GTEST_OS_WINDOWS\n  char cwd[GTEST_PATH_MAX_ + 1] = { '\\0' };\n  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? \"\" : cwd);\n#else\n  char cwd[GTEST_PATH_MAX_ + 1] = { '\\0' };\n  return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? \"\" : cwd);\n#endif  // GTEST_OS_WINDOWS_MOBILE\n}\n\n// Returns a copy of the FilePath with the case-insensitive extension removed.\n// Example: FilePath(\"dir/file.exe\").RemoveExtension(\"EXE\") returns\n// FilePath(\"dir/file\"). If a case-insensitive extension is not\n// found, returns a copy of the original FilePath.\nFilePath FilePath::RemoveExtension(const char* extension) const {\n  String dot_extension(String::Format(\".%s\", extension));\n  if (pathname_.EndsWithCaseInsensitive(dot_extension.c_str())) {\n    return FilePath(String(pathname_.c_str(), pathname_.length() - 4));\n  }\n  return *this;\n}\n\n// Returns a pointer to the last occurence of a valid path separator in\n// the FilePath. On Windows, for example, both '/' and '\\' are valid path\n// separators. Returns NULL if no path separator was found.\nconst char* FilePath::FindLastPathSeparator() const {\n  const char* const last_sep = strrchr(c_str(), kPathSeparator);\n#if GTEST_HAS_ALT_PATH_SEP_\n  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);\n  // Comparing two pointers of which only one is NULL is undefined.\n  if (last_alt_sep != NULL &&\n      (last_sep == NULL || last_alt_sep > last_sep)) {\n    return last_alt_sep;\n  }\n#endif\n  return last_sep;\n}\n\n// Returns a copy of the FilePath with the directory part removed.\n// Example: FilePath(\"path/to/file\").RemoveDirectoryName() returns\n// FilePath(\"file\"). If there is no directory part (\"just_a_file\"), it returns\n// the FilePath unmodified. If there is no file part (\"just_a_dir/\") it\n// returns an empty FilePath (\"\").\n// On Windows platform, '\\' is the path separator, otherwise it is '/'.\nFilePath FilePath::RemoveDirectoryName() const {\n  const char* const last_sep = FindLastPathSeparator();\n  return last_sep ? FilePath(String(last_sep + 1)) : *this;\n}\n\n// RemoveFileName returns the directory path with the filename removed.\n// Example: FilePath(\"path/to/file\").RemoveFileName() returns \"path/to/\".\n// If the FilePath is \"a_file\" or \"/a_file\", RemoveFileName returns\n// FilePath(\"./\") or, on Windows, FilePath(\".\\\\\"). If the filepath does\n// not have a file, like \"just/a/dir/\", it returns the FilePath unmodified.\n// On Windows platform, '\\' is the path separator, otherwise it is '/'.\nFilePath FilePath::RemoveFileName() const {\n  const char* const last_sep = FindLastPathSeparator();\n  String dir;\n  if (last_sep) {\n    dir = String(c_str(), last_sep + 1 - c_str());\n  } else {\n    dir = kCurrentDirectoryString;\n  }\n  return FilePath(dir);\n}\n\n// Helper functions for naming files in a directory for xml output.\n\n// Given directory = \"dir\", base_name = \"test\", number = 0,\n// extension = \"xml\", returns \"dir/test.xml\". If number is greater\n// than zero (e.g., 12), returns \"dir/test_12.xml\".\n// On Windows platform, uses \\ as the separator rather than /.\nFilePath FilePath::MakeFileName(const FilePath& directory,\n                                const FilePath& base_name,\n                                int number,\n                                const char* extension) {\n  String file;\n  if (number == 0) {\n    file = String::Format(\"%s.%s\", base_name.c_str(), extension);\n  } else {\n    file = String::Format(\"%s_%d.%s\", base_name.c_str(), number, extension);\n  }\n  return ConcatPaths(directory, FilePath(file));\n}\n\n// Given directory = \"dir\", relative_path = \"test.xml\", returns \"dir/test.xml\".\n// On Windows, uses \\ as the separator rather than /.\nFilePath FilePath::ConcatPaths(const FilePath& directory,\n                               const FilePath& relative_path) {\n  if (directory.IsEmpty())\n    return relative_path;\n  const FilePath dir(directory.RemoveTrailingPathSeparator());\n  return FilePath(String::Format(\"%s%c%s\", dir.c_str(), kPathSeparator,\n                                 relative_path.c_str()));\n}\n\n// Returns true if pathname describes something findable in the file-system,\n// either a file, directory, or whatever.\nbool FilePath::FileOrDirectoryExists() const {\n#if GTEST_OS_WINDOWS_MOBILE\n  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());\n  const DWORD attributes = GetFileAttributes(unicode);\n  delete [] unicode;\n  return attributes != kInvalidFileAttributes;\n#else\n  posix::StatStruct file_stat;\n  return posix::Stat(pathname_.c_str(), &file_stat) == 0;\n#endif  // GTEST_OS_WINDOWS_MOBILE\n}\n\n// Returns true if pathname describes a directory in the file-system\n// that exists.\nbool FilePath::DirectoryExists() const {\n  bool result = false;\n#if GTEST_OS_WINDOWS\n  // Don't strip off trailing separator if path is a root directory on\n  // Windows (like \"C:\\\\\").\n  const FilePath& path(IsRootDirectory() ? *this :\n                                           RemoveTrailingPathSeparator());\n#else\n  const FilePath& path(*this);\n#endif\n\n#if GTEST_OS_WINDOWS_MOBILE\n  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());\n  const DWORD attributes = GetFileAttributes(unicode);\n  delete [] unicode;\n  if ((attributes != kInvalidFileAttributes) &&\n      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {\n    result = true;\n  }\n#else\n  posix::StatStruct file_stat;\n  result = posix::Stat(path.c_str(), &file_stat) == 0 &&\n      posix::IsDir(file_stat);\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n  return result;\n}\n\n// Returns true if pathname describes a root directory. (Windows has one\n// root directory per disk drive.)\nbool FilePath::IsRootDirectory() const {\n#if GTEST_OS_WINDOWS\n  // TODO(wan@google.com): on Windows a network share like\n  // \\\\server\\share can be a root directory, although it cannot be the\n  // current directory.  Handle this properly.\n  return pathname_.length() == 3 && IsAbsolutePath();\n#else\n  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);\n#endif\n}\n\n// Returns true if pathname describes an absolute path.\nbool FilePath::IsAbsolutePath() const {\n  const char* const name = pathname_.c_str();\n#if GTEST_OS_WINDOWS\n  return pathname_.length() >= 3 &&\n     ((name[0] >= 'a' && name[0] <= 'z') ||\n      (name[0] >= 'A' && name[0] <= 'Z')) &&\n     name[1] == ':' &&\n     IsPathSeparator(name[2]);\n#else\n  return IsPathSeparator(name[0]);\n#endif\n}\n\n// Returns a pathname for a file that does not currently exist. The pathname\n// will be directory/base_name.extension or\n// directory/base_name_<number>.extension if directory/base_name.extension\n// already exists. The number will be incremented until a pathname is found\n// that does not already exist.\n// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.\n// There could be a race condition if two or more processes are calling this\n// function at the same time -- they could both pick the same filename.\nFilePath FilePath::GenerateUniqueFileName(const FilePath& directory,\n                                          const FilePath& base_name,\n                                          const char* extension) {\n  FilePath full_pathname;\n  int number = 0;\n  do {\n    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));\n  } while (full_pathname.FileOrDirectoryExists());\n  return full_pathname;\n}\n\n// Returns true if FilePath ends with a path separator, which indicates that\n// it is intended to represent a directory. Returns false otherwise.\n// This does NOT check that a directory (or file) actually exists.\nbool FilePath::IsDirectory() const {\n  return !pathname_.empty() &&\n         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);\n}\n\n// Create directories so that path exists. Returns true if successful or if\n// the directories already exist; returns false if unable to create directories\n// for any reason.\nbool FilePath::CreateDirectoriesRecursively() const {\n  if (!this->IsDirectory()) {\n    return false;\n  }\n\n  if (pathname_.length() == 0 || this->DirectoryExists()) {\n    return true;\n  }\n\n  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());\n  return parent.CreateDirectoriesRecursively() && this->CreateFolder();\n}\n\n// Create the directory so that path exists. Returns true if successful or\n// if the directory already exists; returns false if unable to create the\n// directory for any reason, including if the parent directory does not\n// exist. Not named \"CreateDirectory\" because that's a macro on Windows.\nbool FilePath::CreateFolder() const {\n#if GTEST_OS_WINDOWS_MOBILE\n  FilePath removed_sep(this->RemoveTrailingPathSeparator());\n  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());\n  int result = CreateDirectory(unicode, NULL) ? 0 : -1;\n  delete [] unicode;\n#elif GTEST_OS_WINDOWS\n  int result = _mkdir(pathname_.c_str());\n#else\n  int result = mkdir(pathname_.c_str(), 0777);\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n  if (result == -1) {\n    return this->DirectoryExists();  // An error is OK if the directory exists.\n  }\n  return true;  // No error.\n}\n\n// If input name has a trailing separator character, remove it and return the\n// name, otherwise return the name string unmodified.\n// On Windows platform, uses \\ as the separator, other platforms use /.\nFilePath FilePath::RemoveTrailingPathSeparator() const {\n  return IsDirectory()\n      ? FilePath(String(pathname_.c_str(), pathname_.length() - 1))\n      : *this;\n}\n\n// Removes any redundant separators that might be in the pathname.\n// For example, \"bar///foo\" becomes \"bar/foo\". Does not eliminate other\n// redundancies that might be in a pathname involving \".\" or \"..\".\n// TODO(wan@google.com): handle Windows network shares (e.g. \\\\server\\share).\nvoid FilePath::Normalize() {\n  if (pathname_.c_str() == NULL) {\n    pathname_ = \"\";\n    return;\n  }\n  const char* src = pathname_.c_str();\n  char* const dest = new char[pathname_.length() + 1];\n  char* dest_ptr = dest;\n  memset(dest_ptr, 0, pathname_.length() + 1);\n\n  while (*src != '\\0') {\n    *dest_ptr = *src;\n    if (!IsPathSeparator(*src)) {\n      src++;\n    } else {\n#if GTEST_HAS_ALT_PATH_SEP_\n      if (*dest_ptr == kAlternatePathSeparator) {\n        *dest_ptr = kPathSeparator;\n      }\n#endif\n      while (IsPathSeparator(*src))\n        src++;\n    }\n    dest_ptr++;\n  }\n  *dest_ptr = '\\0';\n  pathname_ = dest;\n  delete[] dest;\n}\n\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-internal-inl.h",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Utility functions and classes used by the Google C++ testing framework.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// This file contains purely Google Test's internal implementation.  Please\n// DO NOT #INCLUDE IT IN A USER PROGRAM.\n\n#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_\n#define GTEST_SRC_GTEST_INTERNAL_INL_H_\n\n// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is\n// part of Google Test's implementation; otherwise it's undefined.\n#if !GTEST_IMPLEMENTATION_\n// A user is trying to include this from his code - just say no.\n#error \"gtest-internal-inl.h is part of Google Test's internal implementation.\"\n#error \"It must not be included except by Google Test itself.\"\n#endif  // GTEST_IMPLEMENTATION_\n\n#ifndef _WIN32_WCE\n#include <errno.h>\n#endif  // !_WIN32_WCE\n#include <stddef.h>\n#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.\n#include <string.h>  // For memmove.\n\n#include <algorithm>\n#include <string>\n#include <vector>\n\n#include <gtest/internal/gtest-port.h>\n\n#if GTEST_OS_WINDOWS\n#include <windows.h>  // For DWORD.\n#endif  // GTEST_OS_WINDOWS\n\n#include <gtest/gtest.h>  // NOLINT\n#include <gtest/gtest-spi.h>\n\nnamespace testing {\n\n// Declares the flags.\n//\n// We don't want the users to modify this flag in the code, but want\n// Google Test's own unit tests to be able to access it. Therefore we\n// declare it here as opposed to in gtest.h.\nGTEST_DECLARE_bool_(death_test_use_fork);\n\nnamespace internal {\n\n// The value of GetTestTypeId() as seen from within the Google Test\n// library.  This is solely for testing GetTestTypeId().\nGTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;\n\n// Names of the flags (needed for parsing Google Test flags).\nconst char kAlsoRunDisabledTestsFlag[] = \"also_run_disabled_tests\";\nconst char kBreakOnFailureFlag[] = \"break_on_failure\";\nconst char kCatchExceptionsFlag[] = \"catch_exceptions\";\nconst char kColorFlag[] = \"color\";\nconst char kFilterFlag[] = \"filter\";\nconst char kListTestsFlag[] = \"list_tests\";\nconst char kOutputFlag[] = \"output\";\nconst char kPrintTimeFlag[] = \"print_time\";\nconst char kRandomSeedFlag[] = \"random_seed\";\nconst char kRepeatFlag[] = \"repeat\";\nconst char kShuffleFlag[] = \"shuffle\";\nconst char kStackTraceDepthFlag[] = \"stack_trace_depth\";\nconst char kThrowOnFailureFlag[] = \"throw_on_failure\";\n\n// A valid random seed must be in [1, kMaxRandomSeed].\nconst int kMaxRandomSeed = 99999;\n\n// g_help_flag is true iff the --help flag or an equivalent form is\n// specified on the command line.\nGTEST_API_ extern bool g_help_flag;\n\n// Returns the current time in milliseconds.\nGTEST_API_ TimeInMillis GetTimeInMillis();\n\n// Returns true iff Google Test should use colors in the output.\nGTEST_API_ bool ShouldUseColor(bool stdout_is_tty);\n\n// Formats the given time in milliseconds as seconds.\nGTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);\n\n// Parses a string for an Int32 flag, in the form of \"--flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nGTEST_API_ bool ParseInt32Flag(\n    const char* str, const char* flag, Int32* value);\n\n// Returns a random seed in range [1, kMaxRandomSeed] based on the\n// given --gtest_random_seed flag value.\ninline int GetRandomSeedFromFlag(Int32 random_seed_flag) {\n  const unsigned int raw_seed = (random_seed_flag == 0) ?\n      static_cast<unsigned int>(GetTimeInMillis()) :\n      static_cast<unsigned int>(random_seed_flag);\n\n  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that\n  // it's easy to type.\n  const int normalized_seed =\n      static_cast<int>((raw_seed - 1U) %\n                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;\n  return normalized_seed;\n}\n\n// Returns the first valid random seed after 'seed'.  The behavior is\n// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is\n// considered to be 1.\ninline int GetNextRandomSeed(int seed) {\n  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)\n      << \"Invalid random seed \" << seed << \" - must be in [1, \"\n      << kMaxRandomSeed << \"].\";\n  const int next_seed = seed + 1;\n  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;\n}\n\n// This class saves the values of all Google Test flags in its c'tor, and\n// restores them in its d'tor.\nclass GTestFlagSaver {\n public:\n  // The c'tor.\n  GTestFlagSaver() {\n    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);\n    break_on_failure_ = GTEST_FLAG(break_on_failure);\n    catch_exceptions_ = GTEST_FLAG(catch_exceptions);\n    color_ = GTEST_FLAG(color);\n    death_test_style_ = GTEST_FLAG(death_test_style);\n    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);\n    filter_ = GTEST_FLAG(filter);\n    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);\n    list_tests_ = GTEST_FLAG(list_tests);\n    output_ = GTEST_FLAG(output);\n    print_time_ = GTEST_FLAG(print_time);\n    random_seed_ = GTEST_FLAG(random_seed);\n    repeat_ = GTEST_FLAG(repeat);\n    shuffle_ = GTEST_FLAG(shuffle);\n    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);\n    throw_on_failure_ = GTEST_FLAG(throw_on_failure);\n  }\n\n  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.\n  ~GTestFlagSaver() {\n    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;\n    GTEST_FLAG(break_on_failure) = break_on_failure_;\n    GTEST_FLAG(catch_exceptions) = catch_exceptions_;\n    GTEST_FLAG(color) = color_;\n    GTEST_FLAG(death_test_style) = death_test_style_;\n    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;\n    GTEST_FLAG(filter) = filter_;\n    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;\n    GTEST_FLAG(list_tests) = list_tests_;\n    GTEST_FLAG(output) = output_;\n    GTEST_FLAG(print_time) = print_time_;\n    GTEST_FLAG(random_seed) = random_seed_;\n    GTEST_FLAG(repeat) = repeat_;\n    GTEST_FLAG(shuffle) = shuffle_;\n    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;\n    GTEST_FLAG(throw_on_failure) = throw_on_failure_;\n  }\n private:\n  // Fields for saving the original values of flags.\n  bool also_run_disabled_tests_;\n  bool break_on_failure_;\n  bool catch_exceptions_;\n  String color_;\n  String death_test_style_;\n  bool death_test_use_fork_;\n  String filter_;\n  String internal_run_death_test_;\n  bool list_tests_;\n  String output_;\n  bool print_time_;\n  bool pretty_;\n  internal::Int32 random_seed_;\n  internal::Int32 repeat_;\n  bool shuffle_;\n  internal::Int32 stack_trace_depth_;\n  bool throw_on_failure_;\n} GTEST_ATTRIBUTE_UNUSED_;\n\n// Converts a Unicode code point to a narrow string in UTF-8 encoding.\n// code_point parameter is of type UInt32 because wchar_t may not be\n// wide enough to contain a code point.\n// The output buffer str must containt at least 32 characters.\n// The function returns the address of the output buffer.\n// If the code_point is not a valid Unicode code point\n// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output\n// as '(Invalid Unicode 0xXXXXXXXX)'.\nGTEST_API_ char* CodePointToUtf8(UInt32 code_point, char* str);\n\n// Converts a wide string to a narrow string in UTF-8 encoding.\n// The wide string is assumed to have the following encoding:\n//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)\n//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)\n// Parameter str points to a null-terminated wide string.\n// Parameter num_chars may additionally limit the number\n// of wchar_t characters processed. -1 is used when the entire string\n// should be processed.\n// If the string contains code points that are not valid Unicode code points\n// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output\n// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding\n// and contains invalid UTF-16 surrogate pairs, values in those pairs\n// will be encoded as individual Unicode characters from Basic Normal Plane.\nGTEST_API_ String WideStringToUtf8(const wchar_t* str, int num_chars);\n\n// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file\n// if the variable is present. If a file already exists at this location, this\n// function will write over it. If the variable is present, but the file cannot\n// be created, prints an error and exits.\nvoid WriteToShardStatusFileIfNeeded();\n\n// Checks whether sharding is enabled by examining the relevant\n// environment variable values. If the variables are present,\n// but inconsistent (e.g., shard_index >= total_shards), prints\n// an error and exits. If in_subprocess_for_death_test, sharding is\n// disabled because it must only be applied to the original test\n// process. Otherwise, we could filter out death tests we intended to execute.\nGTEST_API_ bool ShouldShard(const char* total_shards_str,\n                            const char* shard_index_str,\n                            bool in_subprocess_for_death_test);\n\n// Parses the environment variable var as an Int32. If it is unset,\n// returns default_val. If it is not an Int32, prints an error and\n// and aborts.\nGTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);\n\n// Given the total number of shards, the shard index, and the test id,\n// returns true iff the test should be run on this shard. The test id is\n// some arbitrary but unique non-negative integer assigned to each test\n// method. Assumes that 0 <= shard_index < total_shards.\nGTEST_API_ bool ShouldRunTestOnShard(\n    int total_shards, int shard_index, int test_id);\n\n// STL container utilities.\n\n// Returns the number of elements in the given container that satisfy\n// the given predicate.\ntemplate <class Container, typename Predicate>\ninline int CountIf(const Container& c, Predicate predicate) {\n  return static_cast<int>(std::count_if(c.begin(), c.end(), predicate));\n}\n\n// Applies a function/functor to each element in the container.\ntemplate <class Container, typename Functor>\nvoid ForEach(const Container& c, Functor functor) {\n  std::for_each(c.begin(), c.end(), functor);\n}\n\n// Returns the i-th element of the vector, or default_value if i is not\n// in range [0, v.size()).\ntemplate <typename E>\ninline E GetElementOr(const std::vector<E>& v, int i, E default_value) {\n  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];\n}\n\n// Performs an in-place shuffle of a range of the vector's elements.\n// 'begin' and 'end' are element indices as an STL-style range;\n// i.e. [begin, end) are shuffled, where 'end' == size() means to\n// shuffle to the end of the vector.\ntemplate <typename E>\nvoid ShuffleRange(internal::Random* random, int begin, int end,\n                  std::vector<E>* v) {\n  const int size = static_cast<int>(v->size());\n  GTEST_CHECK_(0 <= begin && begin <= size)\n      << \"Invalid shuffle range start \" << begin << \": must be in range [0, \"\n      << size << \"].\";\n  GTEST_CHECK_(begin <= end && end <= size)\n      << \"Invalid shuffle range finish \" << end << \": must be in range [\"\n      << begin << \", \" << size << \"].\";\n\n  // Fisher-Yates shuffle, from\n  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle\n  for (int range_width = end - begin; range_width >= 2; range_width--) {\n    const int last_in_range = begin + range_width - 1;\n    const int selected = begin + random->Generate(range_width);\n    std::swap((*v)[selected], (*v)[last_in_range]);\n  }\n}\n\n// Performs an in-place shuffle of the vector's elements.\ntemplate <typename E>\ninline void Shuffle(internal::Random* random, std::vector<E>* v) {\n  ShuffleRange(random, 0, static_cast<int>(v->size()), v);\n}\n\n// A function for deleting an object.  Handy for being used as a\n// functor.\ntemplate <typename T>\nstatic void Delete(T* x) {\n  delete x;\n}\n\n// A predicate that checks the key of a TestProperty against a known key.\n//\n// TestPropertyKeyIs is copyable.\nclass TestPropertyKeyIs {\n public:\n  // Constructor.\n  //\n  // TestPropertyKeyIs has NO default constructor.\n  explicit TestPropertyKeyIs(const char* key)\n      : key_(key) {}\n\n  // Returns true iff the test name of test property matches on key_.\n  bool operator()(const TestProperty& test_property) const {\n    return String(test_property.key()).Compare(key_) == 0;\n  }\n\n private:\n  String key_;\n};\n\nclass TestInfoImpl {\n public:\n  TestInfoImpl(TestInfo* parent, const char* test_case_name,\n               const char* name, const char* test_case_comment,\n               const char* comment, TypeId fixture_class_id,\n               internal::TestFactoryBase* factory);\n  ~TestInfoImpl();\n\n  // Returns true if this test should run.\n  bool should_run() const { return should_run_; }\n\n  // Sets the should_run member.\n  void set_should_run(bool should) { should_run_ = should; }\n\n  // Returns true if this test is disabled. Disabled tests are not run.\n  bool is_disabled() const { return is_disabled_; }\n\n  // Sets the is_disabled member.\n  void set_is_disabled(bool is) { is_disabled_ = is; }\n\n  // Returns true if this test matches the filter specified by the user.\n  bool matches_filter() const { return matches_filter_; }\n\n  // Sets the matches_filter member.\n  void set_matches_filter(bool matches) { matches_filter_ = matches; }\n\n  // Returns the test case name.\n  const char* test_case_name() const { return test_case_name_.c_str(); }\n\n  // Returns the test name.\n  const char* name() const { return name_.c_str(); }\n\n  // Returns the test case comment.\n  const char* test_case_comment() const { return test_case_comment_.c_str(); }\n\n  // Returns the test comment.\n  const char* comment() const { return comment_.c_str(); }\n\n  // Returns the ID of the test fixture class.\n  TypeId fixture_class_id() const { return fixture_class_id_; }\n\n  // Returns the test result.\n  TestResult* result() { return &result_; }\n  const TestResult* result() const { return &result_; }\n\n  // Creates the test object, runs it, records its result, and then\n  // deletes it.\n  void Run();\n\n  // Clears the test result.\n  void ClearResult() { result_.Clear(); }\n\n  // Clears the test result in the given TestInfo object.\n  static void ClearTestResult(TestInfo * test_info) {\n    test_info->impl()->ClearResult();\n  }\n\n private:\n  // These fields are immutable properties of the test.\n  TestInfo* const parent_;          // The owner of this object\n  const String test_case_name_;     // Test case name\n  const String name_;               // Test name\n  const String test_case_comment_;  // Test case comment\n  const String comment_;            // Test comment\n  const TypeId fixture_class_id_;   // ID of the test fixture class\n  bool should_run_;                 // True iff this test should run\n  bool is_disabled_;                // True iff this test is disabled\n  bool matches_filter_;             // True if this test matches the\n                                    // user-specified filter.\n  internal::TestFactoryBase* const factory_;  // The factory that creates\n                                              // the test object\n\n  // This field is mutable and needs to be reset before running the\n  // test for the second time.\n  TestResult result_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfoImpl);\n};\n\n// Class UnitTestOptions.\n//\n// This class contains functions for processing options the user\n// specifies when running the tests.  It has only static members.\n//\n// In most cases, the user can specify an option using either an\n// environment variable or a command line flag.  E.g. you can set the\n// test filter using either GTEST_FILTER or --gtest_filter.  If both\n// the variable and the flag are present, the latter overrides the\n// former.\nclass GTEST_API_ UnitTestOptions {\n public:\n  // Functions for processing the gtest_output flag.\n\n  // Returns the output format, or \"\" for normal printed output.\n  static String GetOutputFormat();\n\n  // Returns the absolute path of the requested output file, or the\n  // default (test_detail.xml in the original working directory) if\n  // none was explicitly specified.\n  static String GetAbsolutePathToOutputFile();\n\n  // Functions for processing the gtest_filter flag.\n\n  // Returns true iff the wildcard pattern matches the string.  The\n  // first ':' or '\\0' character in pattern marks the end of it.\n  //\n  // This recursive algorithm isn't very efficient, but is clear and\n  // works well enough for matching test names, which are short.\n  static bool PatternMatchesString(const char *pattern, const char *str);\n\n  // Returns true iff the user-specified filter matches the test case\n  // name and the test name.\n  static bool FilterMatchesTest(const String &test_case_name,\n                                const String &test_name);\n\n#if GTEST_OS_WINDOWS\n  // Function for supporting the gtest_catch_exception flag.\n\n  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the\n  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.\n  // This function is useful as an __except condition.\n  static int GTestShouldProcessSEH(DWORD exception_code);\n#endif  // GTEST_OS_WINDOWS\n\n  // Returns true if \"name\" matches the ':' separated list of glob-style\n  // filters in \"filter\".\n  static bool MatchesFilter(const String& name, const char* filter);\n};\n\n// Returns the current application's name, removing directory path if that\n// is present.  Used by UnitTestOptions::GetOutputFile.\nGTEST_API_ FilePath GetCurrentExecutableName();\n\n// The role interface for getting the OS stack trace as a string.\nclass OsStackTraceGetterInterface {\n public:\n  OsStackTraceGetterInterface() {}\n  virtual ~OsStackTraceGetterInterface() {}\n\n  // Returns the current OS stack trace as a String.  Parameters:\n  //\n  //   max_depth  - the maximum number of stack frames to be included\n  //                in the trace.\n  //   skip_count - the number of top frames to be skipped; doesn't count\n  //                against max_depth.\n  virtual String CurrentStackTrace(int max_depth, int skip_count) = 0;\n\n  // UponLeavingGTest() should be called immediately before Google Test calls\n  // user code. It saves some information about the current stack that\n  // CurrentStackTrace() will use to find and hide Google Test stack frames.\n  virtual void UponLeavingGTest() = 0;\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);\n};\n\n// A working implementation of the OsStackTraceGetterInterface interface.\nclass OsStackTraceGetter : public OsStackTraceGetterInterface {\n public:\n  OsStackTraceGetter() : caller_frame_(NULL) {}\n  virtual String CurrentStackTrace(int max_depth, int skip_count);\n  virtual void UponLeavingGTest();\n\n  // This string is inserted in place of stack frames that are part of\n  // Google Test's implementation.\n  static const char* const kElidedFramesMarker;\n\n private:\n  Mutex mutex_;  // protects all internal state\n\n  // We save the stack frame below the frame that calls user code.\n  // We do this because the address of the frame immediately below\n  // the user code changes between the call to UponLeavingGTest()\n  // and any calls to CurrentStackTrace() from within the user code.\n  void* caller_frame_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);\n};\n\n// Information about a Google Test trace point.\nstruct TraceInfo {\n  const char* file;\n  int line;\n  String message;\n};\n\n// This is the default global test part result reporter used in UnitTestImpl.\n// This class should only be used by UnitTestImpl.\nclass DefaultGlobalTestPartResultReporter\n  : public TestPartResultReporterInterface {\n public:\n  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);\n  // Implements the TestPartResultReporterInterface. Reports the test part\n  // result in the current test.\n  virtual void ReportTestPartResult(const TestPartResult& result);\n\n private:\n  UnitTestImpl* const unit_test_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);\n};\n\n// This is the default per thread test part result reporter used in\n// UnitTestImpl. This class should only be used by UnitTestImpl.\nclass DefaultPerThreadTestPartResultReporter\n    : public TestPartResultReporterInterface {\n public:\n  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);\n  // Implements the TestPartResultReporterInterface. The implementation just\n  // delegates to the current global test part result reporter of *unit_test_.\n  virtual void ReportTestPartResult(const TestPartResult& result);\n\n private:\n  UnitTestImpl* const unit_test_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);\n};\n\n// The private implementation of the UnitTest class.  We don't protect\n// the methods under a mutex, as this class is not accessible by a\n// user and the UnitTest class that delegates work to this class does\n// proper locking.\nclass GTEST_API_ UnitTestImpl {\n public:\n  explicit UnitTestImpl(UnitTest* parent);\n  virtual ~UnitTestImpl();\n\n  // There are two different ways to register your own TestPartResultReporter.\n  // You can register your own repoter to listen either only for test results\n  // from the current thread or for results from all threads.\n  // By default, each per-thread test result repoter just passes a new\n  // TestPartResult to the global test result reporter, which registers the\n  // test part result for the currently running test.\n\n  // Returns the global test part result reporter.\n  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();\n\n  // Sets the global test part result reporter.\n  void SetGlobalTestPartResultReporter(\n      TestPartResultReporterInterface* reporter);\n\n  // Returns the test part result reporter for the current thread.\n  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();\n\n  // Sets the test part result reporter for the current thread.\n  void SetTestPartResultReporterForCurrentThread(\n      TestPartResultReporterInterface* reporter);\n\n  // Gets the number of successful test cases.\n  int successful_test_case_count() const;\n\n  // Gets the number of failed test cases.\n  int failed_test_case_count() const;\n\n  // Gets the number of all test cases.\n  int total_test_case_count() const;\n\n  // Gets the number of all test cases that contain at least one test\n  // that should run.\n  int test_case_to_run_count() const;\n\n  // Gets the number of successful tests.\n  int successful_test_count() const;\n\n  // Gets the number of failed tests.\n  int failed_test_count() const;\n\n  // Gets the number of disabled tests.\n  int disabled_test_count() const;\n\n  // Gets the number of all tests.\n  int total_test_count() const;\n\n  // Gets the number of tests that should run.\n  int test_to_run_count() const;\n\n  // Gets the elapsed time, in milliseconds.\n  TimeInMillis elapsed_time() const { return elapsed_time_; }\n\n  // Returns true iff the unit test passed (i.e. all test cases passed).\n  bool Passed() const { return !Failed(); }\n\n  // Returns true iff the unit test failed (i.e. some test case failed\n  // or something outside of all tests failed).\n  bool Failed() const {\n    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();\n  }\n\n  // Gets the i-th test case among all the test cases. i can range from 0 to\n  // total_test_case_count() - 1. If i is not in that range, returns NULL.\n  const TestCase* GetTestCase(int i) const {\n    const int index = GetElementOr(test_case_indices_, i, -1);\n    return index < 0 ? NULL : test_cases_[i];\n  }\n\n  // Gets the i-th test case among all the test cases. i can range from 0 to\n  // total_test_case_count() - 1. If i is not in that range, returns NULL.\n  TestCase* GetMutableTestCase(int i) {\n    const int index = GetElementOr(test_case_indices_, i, -1);\n    return index < 0 ? NULL : test_cases_[index];\n  }\n\n  // Provides access to the event listener list.\n  TestEventListeners* listeners() { return &listeners_; }\n\n  // Returns the TestResult for the test that's currently running, or\n  // the TestResult for the ad hoc test if no test is running.\n  TestResult* current_test_result();\n\n  // Returns the TestResult for the ad hoc test.\n  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }\n\n  // Sets the OS stack trace getter.\n  //\n  // Does nothing if the input and the current OS stack trace getter\n  // are the same; otherwise, deletes the old getter and makes the\n  // input the current getter.\n  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);\n\n  // Returns the current OS stack trace getter if it is not NULL;\n  // otherwise, creates an OsStackTraceGetter, makes it the current\n  // getter, and returns it.\n  OsStackTraceGetterInterface* os_stack_trace_getter();\n\n  // Returns the current OS stack trace as a String.\n  //\n  // The maximum number of stack frames to be included is specified by\n  // the gtest_stack_trace_depth flag.  The skip_count parameter\n  // specifies the number of top frames to be skipped, which doesn't\n  // count against the number of frames to be included.\n  //\n  // For example, if Foo() calls Bar(), which in turn calls\n  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the\n  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.\n  String CurrentOsStackTraceExceptTop(int skip_count);\n\n  // Finds and returns a TestCase with the given name.  If one doesn't\n  // exist, creates one and returns it.\n  //\n  // Arguments:\n  //\n  //   test_case_name: name of the test case\n  //   set_up_tc:      pointer to the function that sets up the test case\n  //   tear_down_tc:   pointer to the function that tears down the test case\n  TestCase* GetTestCase(const char* test_case_name,\n                        const char* comment,\n                        Test::SetUpTestCaseFunc set_up_tc,\n                        Test::TearDownTestCaseFunc tear_down_tc);\n\n  // Adds a TestInfo to the unit test.\n  //\n  // Arguments:\n  //\n  //   set_up_tc:    pointer to the function that sets up the test case\n  //   tear_down_tc: pointer to the function that tears down the test case\n  //   test_info:    the TestInfo object\n  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,\n                   Test::TearDownTestCaseFunc tear_down_tc,\n                   TestInfo * test_info) {\n    // In order to support thread-safe death tests, we need to\n    // remember the original working directory when the test program\n    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as\n    // the user may have changed the current directory before calling\n    // RUN_ALL_TESTS().  Therefore we capture the current directory in\n    // AddTestInfo(), which is called to register a TEST or TEST_F\n    // before main() is reached.\n    if (original_working_dir_.IsEmpty()) {\n      original_working_dir_.Set(FilePath::GetCurrentDir());\n      GTEST_CHECK_(!original_working_dir_.IsEmpty())\n          << \"Failed to get the current working directory.\";\n    }\n\n    GetTestCase(test_info->test_case_name(),\n                test_info->test_case_comment(),\n                set_up_tc,\n                tear_down_tc)->AddTestInfo(test_info);\n  }\n\n#if GTEST_HAS_PARAM_TEST\n  // Returns ParameterizedTestCaseRegistry object used to keep track of\n  // value-parameterized tests and instantiate and register them.\n  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {\n    return parameterized_test_registry_;\n  }\n#endif  // GTEST_HAS_PARAM_TEST\n\n  // Sets the TestCase object for the test that's currently running.\n  void set_current_test_case(TestCase* a_current_test_case) {\n    current_test_case_ = a_current_test_case;\n  }\n\n  // Sets the TestInfo object for the test that's currently running.  If\n  // current_test_info is NULL, the assertion results will be stored in\n  // ad_hoc_test_result_.\n  void set_current_test_info(TestInfo* a_current_test_info) {\n    current_test_info_ = a_current_test_info;\n  }\n\n  // Registers all parameterized tests defined using TEST_P and\n  // INSTANTIATE_TEST_P, creating regular tests for each test/parameter\n  // combination. This method can be called more then once; it has\n  // guards protecting from registering the tests more then once.\n  // If value-parameterized tests are disabled, RegisterParameterizedTests\n  // is present but does nothing.\n  void RegisterParameterizedTests();\n\n  // Runs all tests in this UnitTest object, prints the result, and\n  // returns 0 if all tests are successful, or 1 otherwise.  If any\n  // exception is thrown during a test on Windows, this test is\n  // considered to be failed, but the rest of the tests will still be\n  // run.  (We disable exceptions on Linux and Mac OS X, so the issue\n  // doesn't apply there.)\n  int RunAllTests();\n\n  // Clears the results of all tests, including the ad hoc test.\n  void ClearResult() {\n    ForEach(test_cases_, TestCase::ClearTestCaseResult);\n    ad_hoc_test_result_.Clear();\n  }\n\n  enum ReactionToSharding {\n    HONOR_SHARDING_PROTOCOL,\n    IGNORE_SHARDING_PROTOCOL\n  };\n\n  // Matches the full name of each test against the user-specified\n  // filter to decide whether the test should run, then records the\n  // result in each TestCase and TestInfo object.\n  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests\n  // based on sharding variables in the environment.\n  // Returns the number of tests that should run.\n  int FilterTests(ReactionToSharding shard_tests);\n\n  // Prints the names of the tests matching the user-specified filter flag.\n  void ListTestsMatchingFilter();\n\n  const TestCase* current_test_case() const { return current_test_case_; }\n  TestInfo* current_test_info() { return current_test_info_; }\n  const TestInfo* current_test_info() const { return current_test_info_; }\n\n  // Returns the vector of environments that need to be set-up/torn-down\n  // before/after the tests are run.\n  std::vector<Environment*>& environments() { return environments_; }\n\n  // Getters for the per-thread Google Test trace stack.\n  std::vector<TraceInfo>& gtest_trace_stack() {\n    return *(gtest_trace_stack_.pointer());\n  }\n  const std::vector<TraceInfo>& gtest_trace_stack() const {\n    return gtest_trace_stack_.get();\n  }\n\n#if GTEST_HAS_DEATH_TEST\n  void InitDeathTestSubprocessControlInfo() {\n    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());\n  }\n  // Returns a pointer to the parsed --gtest_internal_run_death_test\n  // flag, or NULL if that flag was not specified.\n  // This information is useful only in a death test child process.\n  // Must not be called before a call to InitGoogleTest.\n  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {\n    return internal_run_death_test_flag_.get();\n  }\n\n  // Returns a pointer to the current death test factory.\n  internal::DeathTestFactory* death_test_factory() {\n    return death_test_factory_.get();\n  }\n\n  void SuppressTestEventsIfInSubprocess();\n\n  friend class ReplaceDeathTestFactory;\n#endif  // GTEST_HAS_DEATH_TEST\n\n  // Initializes the event listener performing XML output as specified by\n  // UnitTestOptions. Must not be called before InitGoogleTest.\n  void ConfigureXmlOutput();\n\n  // Performs initialization dependent upon flag values obtained in\n  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to\n  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest\n  // this function is also called from RunAllTests.  Since this function can be\n  // called more than once, it has to be idempotent.\n  void PostFlagParsingInit();\n\n  // Gets the random seed used at the start of the current test iteration.\n  int random_seed() const { return random_seed_; }\n\n  // Gets the random number generator.\n  internal::Random* random() { return &random_; }\n\n  // Shuffles all test cases, and the tests within each test case,\n  // making sure that death tests are still run first.\n  void ShuffleTests();\n\n  // Restores the test cases and tests to their order before the first shuffle.\n  void UnshuffleTests();\n\n private:\n  friend class ::testing::UnitTest;\n\n  // The UnitTest object that owns this implementation object.\n  UnitTest* const parent_;\n\n  // The working directory when the first TEST() or TEST_F() was\n  // executed.\n  internal::FilePath original_working_dir_;\n\n  // The default test part result reporters.\n  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;\n  DefaultPerThreadTestPartResultReporter\n      default_per_thread_test_part_result_reporter_;\n\n  // Points to (but doesn't own) the global test part result reporter.\n  TestPartResultReporterInterface* global_test_part_result_repoter_;\n\n  // Protects read and write access to global_test_part_result_reporter_.\n  internal::Mutex global_test_part_result_reporter_mutex_;\n\n  // Points to (but doesn't own) the per-thread test part result reporter.\n  internal::ThreadLocal<TestPartResultReporterInterface*>\n      per_thread_test_part_result_reporter_;\n\n  // The vector of environments that need to be set-up/torn-down\n  // before/after the tests are run.\n  std::vector<Environment*> environments_;\n\n  // The vector of TestCases in their original order.  It owns the\n  // elements in the vector.\n  std::vector<TestCase*> test_cases_;\n\n  // Provides a level of indirection for the test case list to allow\n  // easy shuffling and restoring the test case order.  The i-th\n  // element of this vector is the index of the i-th test case in the\n  // shuffled order.\n  std::vector<int> test_case_indices_;\n\n#if GTEST_HAS_PARAM_TEST\n  // ParameterizedTestRegistry object used to register value-parameterized\n  // tests.\n  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;\n\n  // Indicates whether RegisterParameterizedTests() has been called already.\n  bool parameterized_tests_registered_;\n#endif  // GTEST_HAS_PARAM_TEST\n\n  // Index of the last death test case registered.  Initially -1.\n  int last_death_test_case_;\n\n  // This points to the TestCase for the currently running test.  It\n  // changes as Google Test goes through one test case after another.\n  // When no test is running, this is set to NULL and Google Test\n  // stores assertion results in ad_hoc_test_result_.  Initially NULL.\n  TestCase* current_test_case_;\n\n  // This points to the TestInfo for the currently running test.  It\n  // changes as Google Test goes through one test after another.  When\n  // no test is running, this is set to NULL and Google Test stores\n  // assertion results in ad_hoc_test_result_.  Initially NULL.\n  TestInfo* current_test_info_;\n\n  // Normally, a user only writes assertions inside a TEST or TEST_F,\n  // or inside a function called by a TEST or TEST_F.  Since Google\n  // Test keeps track of which test is current running, it can\n  // associate such an assertion with the test it belongs to.\n  //\n  // If an assertion is encountered when no TEST or TEST_F is running,\n  // Google Test attributes the assertion result to an imaginary \"ad hoc\"\n  // test, and records the result in ad_hoc_test_result_.\n  TestResult ad_hoc_test_result_;\n\n  // The list of event listeners that can be used to track events inside\n  // Google Test.\n  TestEventListeners listeners_;\n\n  // The OS stack trace getter.  Will be deleted when the UnitTest\n  // object is destructed.  By default, an OsStackTraceGetter is used,\n  // but the user can set this field to use a custom getter if that is\n  // desired.\n  OsStackTraceGetterInterface* os_stack_trace_getter_;\n\n  // True iff PostFlagParsingInit() has been called.\n  bool post_flag_parse_init_performed_;\n\n  // The random number seed used at the beginning of the test run.\n  int random_seed_;\n\n  // Our random number generator.\n  internal::Random random_;\n\n  // How long the test took to run, in milliseconds.\n  TimeInMillis elapsed_time_;\n\n#if GTEST_HAS_DEATH_TEST\n  // The decomposed components of the gtest_internal_run_death_test flag,\n  // parsed when RUN_ALL_TESTS is called.\n  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;\n  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;\n#endif  // GTEST_HAS_DEATH_TEST\n\n  // A per-thread stack of traces created by the SCOPED_TRACE() macro.\n  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);\n};  // class UnitTestImpl\n\n// Convenience function for accessing the global UnitTest\n// implementation object.\ninline UnitTestImpl* GetUnitTestImpl() {\n  return UnitTest::GetInstance()->impl();\n}\n\n// Internal helper functions for implementing the simple regular\n// expression matcher.\nGTEST_API_ bool IsInSet(char ch, const char* str);\nGTEST_API_ bool IsDigit(char ch);\nGTEST_API_ bool IsPunct(char ch);\nGTEST_API_ bool IsRepeat(char ch);\nGTEST_API_ bool IsWhiteSpace(char ch);\nGTEST_API_ bool IsWordChar(char ch);\nGTEST_API_ bool IsValidEscape(char ch);\nGTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);\nGTEST_API_ bool ValidateRegex(const char* regex);\nGTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);\nGTEST_API_ bool MatchRepetitionAndRegexAtHead(\n    bool escaped, char ch, char repeat, const char* regex, const char* str);\nGTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);\n\n// Parses the command line for Google Test flags, without initializing\n// other parts of Google Test.\nGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);\nGTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);\n\n#if GTEST_HAS_DEATH_TEST\n\n// Returns the message describing the last system error, regardless of the\n// platform.\nString GetLastErrnoDescription();\n\n#if GTEST_OS_WINDOWS\n// Provides leak-safe Windows kernel handle ownership.\nclass AutoHandle {\n public:\n  AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}\n  explicit AutoHandle(HANDLE handle) : handle_(handle) {}\n\n  ~AutoHandle() { Reset(); }\n\n  HANDLE Get() const { return handle_; }\n  void Reset() { Reset(INVALID_HANDLE_VALUE); }\n  void Reset(HANDLE handle) {\n    if (handle != handle_) {\n      if (handle_ != INVALID_HANDLE_VALUE)\n        ::CloseHandle(handle_);\n      handle_ = handle;\n    }\n  }\n\n private:\n  HANDLE handle_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);\n};\n#endif  // GTEST_OS_WINDOWS\n\n// Attempts to parse a string into a positive integer pointed to by the\n// number parameter.  Returns true if that is possible.\n// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use\n// it here.\ntemplate <typename Integer>\nbool ParseNaturalNumber(const ::std::string& str, Integer* number) {\n  // Fail fast if the given string does not begin with a digit;\n  // this bypasses strtoXXX's \"optional leading whitespace and plus\n  // or minus sign\" semantics, which are undesirable here.\n  if (str.empty() || !isdigit(str[0])) {\n    return false;\n  }\n  errno = 0;\n\n  char* end;\n  // BiggestConvertible is the largest integer type that system-provided\n  // string-to-number conversion routines can return.\n#if GTEST_OS_WINDOWS && !defined(__GNUC__)\n  // MSVC and C++ Builder define __int64 instead of the standard long long.\n  typedef unsigned __int64 BiggestConvertible;\n  const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);\n#else\n  typedef unsigned long long BiggestConvertible;  // NOLINT\n  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);\n#endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)\n  const bool parse_success = *end == '\\0' && errno == 0;\n\n  // TODO(vladl@google.com): Convert this to compile time assertion when it is\n  // available.\n  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));\n\n  const Integer result = static_cast<Integer>(parsed);\n  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {\n    *number = result;\n    return true;\n  }\n  return false;\n}\n#endif  // GTEST_HAS_DEATH_TEST\n\n// TestResult contains some private methods that should be hidden from\n// Google Test user but are required for testing. This class allow our tests\n// to access them.\n//\n// This class is supplied only for the purpose of testing Google Test's own\n// constructs. Do not use it in user tests, either directly or indirectly.\nclass TestResultAccessor {\n public:\n  static void RecordProperty(TestResult* test_result,\n                             const TestProperty& property) {\n    test_result->RecordProperty(property);\n  }\n\n  static void ClearTestPartResults(TestResult* test_result) {\n    test_result->ClearTestPartResults();\n  }\n\n  static const std::vector<testing::TestPartResult>& test_part_results(\n      const TestResult& test_result) {\n    return test_result.test_part_results();\n  }\n};\n\n}  // namespace internal\n}  // namespace testing\n\n#endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-port.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#include <gtest/internal/gtest-port.h>\n\n#include <limits.h>\n#include <stdlib.h>\n#include <stdio.h>\n\n#if GTEST_OS_WINDOWS_MOBILE\n#include <windows.h>  // For TerminateProcess()\n#elif GTEST_OS_WINDOWS\n#include <io.h>\n#include <sys/stat.h>\n#else\n#include <unistd.h>\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n#if GTEST_OS_MAC\n#include <mach/mach_init.h>\n#include <mach/task.h>\n#include <mach/vm_map.h>\n#endif  // GTEST_OS_MAC\n\n#include <gtest/gtest-spi.h>\n#include <gtest/gtest-message.h>\n#include <gtest/internal/gtest-string.h>\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\nnamespace testing {\nnamespace internal {\n\n#if defined(_MSC_VER) || defined(__BORLANDC__)\n// MSVC and C++Builder do not provide a definition of STDERR_FILENO.\nconst int kStdOutFileno = 1;\nconst int kStdErrFileno = 2;\n#else\nconst int kStdOutFileno = STDOUT_FILENO;\nconst int kStdErrFileno = STDERR_FILENO;\n#endif  // _MSC_VER\n\n#if GTEST_OS_MAC\n\n// Returns the number of threads running in the process, or 0 to indicate that\n// we cannot detect it.\nsize_t GetThreadCount() {\n  const task_t task = mach_task_self();\n  mach_msg_type_number_t thread_count;\n  thread_act_array_t thread_list;\n  const kern_return_t status = task_threads(task, &thread_list, &thread_count);\n  if (status == KERN_SUCCESS) {\n    // task_threads allocates resources in thread_list and we need to free them\n    // to avoid leaks.\n    vm_deallocate(task,\n                  reinterpret_cast<vm_address_t>(thread_list),\n                  sizeof(thread_t) * thread_count);\n    return static_cast<size_t>(thread_count);\n  } else {\n    return 0;\n  }\n}\n\n#else\n\nsize_t GetThreadCount() {\n  // There's no portable way to detect the number of threads, so we just\n  // return 0 to indicate that we cannot detect it.\n  return 0;\n}\n\n#endif  // GTEST_OS_MAC\n\n#if GTEST_USES_POSIX_RE\n\n// Implements RE.  Currently only needed for death tests.\n\nRE::~RE() {\n  if (is_valid_) {\n    // regfree'ing an invalid regex might crash because the content\n    // of the regex is undefined. Since the regex's are essentially\n    // the same, one cannot be valid (or invalid) without the other\n    // being so too.\n    regfree(&partial_regex_);\n    regfree(&full_regex_);\n  }\n  free(const_cast<char*>(pattern_));\n}\n\n// Returns true iff regular expression re matches the entire str.\nbool RE::FullMatch(const char* str, const RE& re) {\n  if (!re.is_valid_) return false;\n\n  regmatch_t match;\n  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;\n}\n\n// Returns true iff regular expression re matches a substring of str\n// (including str itself).\nbool RE::PartialMatch(const char* str, const RE& re) {\n  if (!re.is_valid_) return false;\n\n  regmatch_t match;\n  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;\n}\n\n// Initializes an RE from its string representation.\nvoid RE::Init(const char* regex) {\n  pattern_ = posix::StrDup(regex);\n\n  // Reserves enough bytes to hold the regular expression used for a\n  // full match.\n  const size_t full_regex_len = strlen(regex) + 10;\n  char* const full_pattern = new char[full_regex_len];\n\n  snprintf(full_pattern, full_regex_len, \"^(%s)$\", regex);\n  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;\n  // We want to call regcomp(&partial_regex_, ...) even if the\n  // previous expression returns false.  Otherwise partial_regex_ may\n  // not be properly initialized can may cause trouble when it's\n  // freed.\n  //\n  // Some implementation of POSIX regex (e.g. on at least some\n  // versions of Cygwin) doesn't accept the empty string as a valid\n  // regex.  We change it to an equivalent form \"()\" to be safe.\n  if (is_valid_) {\n    const char* const partial_regex = (*regex == '\\0') ? \"()\" : regex;\n    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;\n  }\n  EXPECT_TRUE(is_valid_)\n      << \"Regular expression \\\"\" << regex\n      << \"\\\" is not a valid POSIX Extended regular expression.\";\n\n  delete[] full_pattern;\n}\n\n#elif GTEST_USES_SIMPLE_RE\n\n// Returns true iff ch appears anywhere in str (excluding the\n// terminating '\\0' character).\nbool IsInSet(char ch, const char* str) {\n  return ch != '\\0' && strchr(str, ch) != NULL;\n}\n\n// Returns true iff ch belongs to the given classification.  Unlike\n// similar functions in <ctype.h>, these aren't affected by the\n// current locale.\nbool IsDigit(char ch) { return '0' <= ch && ch <= '9'; }\nbool IsPunct(char ch) {\n  return IsInSet(ch, \"^-!\\\"#$%&'()*+,./:;<=>?@[\\\\]_`{|}~\");\n}\nbool IsRepeat(char ch) { return IsInSet(ch, \"?*+\"); }\nbool IsWhiteSpace(char ch) { return IsInSet(ch, \" \\f\\n\\r\\t\\v\"); }\nbool IsWordChar(char ch) {\n  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||\n      ('0' <= ch && ch <= '9') || ch == '_';\n}\n\n// Returns true iff \"\\\\c\" is a supported escape sequence.\nbool IsValidEscape(char c) {\n  return (IsPunct(c) || IsInSet(c, \"dDfnrsStvwW\"));\n}\n\n// Returns true iff the given atom (specified by escaped and pattern)\n// matches ch.  The result is undefined if the atom is invalid.\nbool AtomMatchesChar(bool escaped, char pattern_char, char ch) {\n  if (escaped) {  // \"\\\\p\" where p is pattern_char.\n    switch (pattern_char) {\n      case 'd': return IsDigit(ch);\n      case 'D': return !IsDigit(ch);\n      case 'f': return ch == '\\f';\n      case 'n': return ch == '\\n';\n      case 'r': return ch == '\\r';\n      case 's': return IsWhiteSpace(ch);\n      case 'S': return !IsWhiteSpace(ch);\n      case 't': return ch == '\\t';\n      case 'v': return ch == '\\v';\n      case 'w': return IsWordChar(ch);\n      case 'W': return !IsWordChar(ch);\n    }\n    return IsPunct(pattern_char) && pattern_char == ch;\n  }\n\n  return (pattern_char == '.' && ch != '\\n') || pattern_char == ch;\n}\n\n// Helper function used by ValidateRegex() to format error messages.\nString FormatRegexSyntaxError(const char* regex, int index) {\n  return (Message() << \"Syntax error at index \" << index\n          << \" in simple regular expression \\\"\" << regex << \"\\\": \").GetString();\n}\n\n// Generates non-fatal failures and returns false if regex is invalid;\n// otherwise returns true.\nbool ValidateRegex(const char* regex) {\n  if (regex == NULL) {\n    // TODO(wan@google.com): fix the source file location in the\n    // assertion failures to match where the regex is used in user\n    // code.\n    ADD_FAILURE() << \"NULL is not a valid simple regular expression.\";\n    return false;\n  }\n\n  bool is_valid = true;\n\n  // True iff ?, *, or + can follow the previous atom.\n  bool prev_repeatable = false;\n  for (int i = 0; regex[i]; i++) {\n    if (regex[i] == '\\\\') {  // An escape sequence\n      i++;\n      if (regex[i] == '\\0') {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)\n                      << \"'\\\\' cannot appear at the end.\";\n        return false;\n      }\n\n      if (!IsValidEscape(regex[i])) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)\n                      << \"invalid escape sequence \\\"\\\\\" << regex[i] << \"\\\".\";\n        is_valid = false;\n      }\n      prev_repeatable = true;\n    } else {  // Not an escape sequence.\n      const char ch = regex[i];\n\n      if (ch == '^' && i > 0) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'^' can only appear at the beginning.\";\n        is_valid = false;\n      } else if (ch == '$' && regex[i + 1] != '\\0') {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'$' can only appear at the end.\";\n        is_valid = false;\n      } else if (IsInSet(ch, \"()[]{}|\")) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'\" << ch << \"' is unsupported.\";\n        is_valid = false;\n      } else if (IsRepeat(ch) && !prev_repeatable) {\n        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)\n                      << \"'\" << ch << \"' can only follow a repeatable token.\";\n        is_valid = false;\n      }\n\n      prev_repeatable = !IsInSet(ch, \"^$?*+\");\n    }\n  }\n\n  return is_valid;\n}\n\n// Matches a repeated regex atom followed by a valid simple regular\n// expression.  The regex atom is defined as c if escaped is false,\n// or \\c otherwise.  repeat is the repetition meta character (?, *,\n// or +).  The behavior is undefined if str contains too many\n// characters to be indexable by size_t, in which case the test will\n// probably time out anyway.  We are fine with this limitation as\n// std::string has it too.\nbool MatchRepetitionAndRegexAtHead(\n    bool escaped, char c, char repeat, const char* regex,\n    const char* str) {\n  const size_t min_count = (repeat == '+') ? 1 : 0;\n  const size_t max_count = (repeat == '?') ? 1 :\n      static_cast<size_t>(-1) - 1;\n  // We cannot call numeric_limits::max() as it conflicts with the\n  // max() macro on Windows.\n\n  for (size_t i = 0; i <= max_count; ++i) {\n    // We know that the atom matches each of the first i characters in str.\n    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {\n      // We have enough matches at the head, and the tail matches too.\n      // Since we only care about *whether* the pattern matches str\n      // (as opposed to *how* it matches), there is no need to find a\n      // greedy match.\n      return true;\n    }\n    if (str[i] == '\\0' || !AtomMatchesChar(escaped, c, str[i]))\n      return false;\n  }\n  return false;\n}\n\n// Returns true iff regex matches a prefix of str.  regex must be a\n// valid simple regular expression and not start with \"^\", or the\n// result is undefined.\nbool MatchRegexAtHead(const char* regex, const char* str) {\n  if (*regex == '\\0')  // An empty regex matches a prefix of anything.\n    return true;\n\n  // \"$\" only matches the end of a string.  Note that regex being\n  // valid guarantees that there's nothing after \"$\" in it.\n  if (*regex == '$')\n    return *str == '\\0';\n\n  // Is the first thing in regex an escape sequence?\n  const bool escaped = *regex == '\\\\';\n  if (escaped)\n    ++regex;\n  if (IsRepeat(regex[1])) {\n    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so\n    // here's an indirect recursion.  It terminates as the regex gets\n    // shorter in each recursion.\n    return MatchRepetitionAndRegexAtHead(\n        escaped, regex[0], regex[1], regex + 2, str);\n  } else {\n    // regex isn't empty, isn't \"$\", and doesn't start with a\n    // repetition.  We match the first atom of regex with the first\n    // character of str and recurse.\n    return (*str != '\\0') && AtomMatchesChar(escaped, *regex, *str) &&\n        MatchRegexAtHead(regex + 1, str + 1);\n  }\n}\n\n// Returns true iff regex matches any substring of str.  regex must be\n// a valid simple regular expression, or the result is undefined.\n//\n// The algorithm is recursive, but the recursion depth doesn't exceed\n// the regex length, so we won't need to worry about running out of\n// stack space normally.  In rare cases the time complexity can be\n// exponential with respect to the regex length + the string length,\n// but usually it's must faster (often close to linear).\nbool MatchRegexAnywhere(const char* regex, const char* str) {\n  if (regex == NULL || str == NULL)\n    return false;\n\n  if (*regex == '^')\n    return MatchRegexAtHead(regex + 1, str);\n\n  // A successful match can be anywhere in str.\n  do {\n    if (MatchRegexAtHead(regex, str))\n      return true;\n  } while (*str++ != '\\0');\n  return false;\n}\n\n// Implements the RE class.\n\nRE::~RE() {\n  free(const_cast<char*>(pattern_));\n  free(const_cast<char*>(full_pattern_));\n}\n\n// Returns true iff regular expression re matches the entire str.\nbool RE::FullMatch(const char* str, const RE& re) {\n  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);\n}\n\n// Returns true iff regular expression re matches a substring of str\n// (including str itself).\nbool RE::PartialMatch(const char* str, const RE& re) {\n  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);\n}\n\n// Initializes an RE from its string representation.\nvoid RE::Init(const char* regex) {\n  pattern_ = full_pattern_ = NULL;\n  if (regex != NULL) {\n    pattern_ = posix::StrDup(regex);\n  }\n\n  is_valid_ = ValidateRegex(regex);\n  if (!is_valid_) {\n    // No need to calculate the full pattern when the regex is invalid.\n    return;\n  }\n\n  const size_t len = strlen(regex);\n  // Reserves enough bytes to hold the regular expression used for a\n  // full match: we need space to prepend a '^', append a '$', and\n  // terminate the string with '\\0'.\n  char* buffer = static_cast<char*>(malloc(len + 3));\n  full_pattern_ = buffer;\n\n  if (*regex != '^')\n    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.\n\n  // We don't use snprintf or strncpy, as they trigger a warning when\n  // compiled with VC++ 8.0.\n  memcpy(buffer, regex, len);\n  buffer += len;\n\n  if (len == 0 || regex[len - 1] != '$')\n    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.\n\n  *buffer = '\\0';\n}\n\n#endif  // GTEST_USES_POSIX_RE\n\n\nGTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)\n    : severity_(severity) {\n  const char* const marker =\n      severity == GTEST_INFO ?    \"[  INFO ]\" :\n      severity == GTEST_WARNING ? \"[WARNING]\" :\n      severity == GTEST_ERROR ?   \"[ ERROR ]\" : \"[ FATAL ]\";\n  GetStream() << ::std::endl << marker << \" \"\n              << FormatFileLocation(file, line).c_str() << \": \";\n}\n\n// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.\nGTestLog::~GTestLog() {\n  GetStream() << ::std::endl;\n  if (severity_ == GTEST_FATAL) {\n    fflush(stderr);\n    posix::Abort();\n  }\n}\n// Disable Microsoft deprecation warnings for POSIX functions called from\n// this class (creat, dup, dup2, and close)\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable: 4996)\n#endif  // _MSC_VER\n\n#if GTEST_HAS_STREAM_REDIRECTION_\n\n// Object that captures an output stream (stdout/stderr).\nclass CapturedStream {\n public:\n  // The ctor redirects the stream to a temporary file.\n  CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {\n#if GTEST_OS_WINDOWS\n    char temp_dir_path[MAX_PATH + 1] = { '\\0' };  // NOLINT\n    char temp_file_path[MAX_PATH + 1] = { '\\0' };  // NOLINT\n\n    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);\n    const UINT success = ::GetTempFileNameA(temp_dir_path,\n                                            \"gtest_redir\",\n                                            0,  // Generate unique file name.\n                                            temp_file_path);\n    GTEST_CHECK_(success != 0)\n        << \"Unable to create a temporary file in \" << temp_dir_path;\n    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);\n    GTEST_CHECK_(captured_fd != -1) << \"Unable to open temporary file \"\n                                    << temp_file_path;\n    filename_ = temp_file_path;\n#else\n    // There's no guarantee that a test has write access to the\n    // current directory, so we create the temporary file in the /tmp\n    // directory instead.\n    char name_template[] = \"/tmp/captured_stream.XXXXXX\";\n    const int captured_fd = mkstemp(name_template);\n    filename_ = name_template;\n#endif  // GTEST_OS_WINDOWS\n    fflush(NULL);\n    dup2(captured_fd, fd_);\n    close(captured_fd);\n  }\n\n  ~CapturedStream() {\n    remove(filename_.c_str());\n  }\n\n  String GetCapturedString() {\n    if (uncaptured_fd_ != -1) {\n      // Restores the original stream.\n      fflush(NULL);\n      dup2(uncaptured_fd_, fd_);\n      close(uncaptured_fd_);\n      uncaptured_fd_ = -1;\n    }\n\n    FILE* const file = posix::FOpen(filename_.c_str(), \"r\");\n    const String content = ReadEntireFile(file);\n    posix::FClose(file);\n    return content;\n  }\n\n private:\n  // Reads the entire content of a file as a String.\n  static String ReadEntireFile(FILE* file);\n\n  // Returns the size (in bytes) of a file.\n  static size_t GetFileSize(FILE* file);\n\n  const int fd_;  // A stream to capture.\n  int uncaptured_fd_;\n  // Name of the temporary file holding the stderr output.\n  ::std::string filename_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);\n};\n\n// Returns the size (in bytes) of a file.\nsize_t CapturedStream::GetFileSize(FILE* file) {\n  fseek(file, 0, SEEK_END);\n  return static_cast<size_t>(ftell(file));\n}\n\n// Reads the entire content of a file as a string.\nString CapturedStream::ReadEntireFile(FILE* file) {\n  const size_t file_size = GetFileSize(file);\n  char* const buffer = new char[file_size];\n\n  size_t bytes_last_read = 0;  // # of bytes read in the last fread()\n  size_t bytes_read = 0;       // # of bytes read so far\n\n  fseek(file, 0, SEEK_SET);\n\n  // Keeps reading the file until we cannot read further or the\n  // pre-determined file size is reached.\n  do {\n    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);\n    bytes_read += bytes_last_read;\n  } while (bytes_last_read > 0 && bytes_read < file_size);\n\n  const String content(buffer, bytes_read);\n  delete[] buffer;\n\n  return content;\n}\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif  // _MSC_VER\n\nstatic CapturedStream* g_captured_stderr = NULL;\nstatic CapturedStream* g_captured_stdout = NULL;\n\n// Starts capturing an output stream (stdout/stderr).\nvoid CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {\n  if (*stream != NULL) {\n    GTEST_LOG_(FATAL) << \"Only one \" << stream_name\n                      << \" capturer can exist at a time.\";\n  }\n  *stream = new CapturedStream(fd);\n}\n\n// Stops capturing the output stream and returns the captured string.\nString GetCapturedStream(CapturedStream** captured_stream) {\n  const String content = (*captured_stream)->GetCapturedString();\n\n  delete *captured_stream;\n  *captured_stream = NULL;\n\n  return content;\n}\n\n// Starts capturing stdout.\nvoid CaptureStdout() {\n  CaptureStream(kStdOutFileno, \"stdout\", &g_captured_stdout);\n}\n\n// Starts capturing stderr.\nvoid CaptureStderr() {\n  CaptureStream(kStdErrFileno, \"stderr\", &g_captured_stderr);\n}\n\n// Stops capturing stdout and returns the captured string.\nString GetCapturedStdout() { return GetCapturedStream(&g_captured_stdout); }\n\n// Stops capturing stderr and returns the captured string.\nString GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); }\n\n#endif  // GTEST_HAS_STREAM_REDIRECTION_\n\n#if GTEST_HAS_DEATH_TEST\n\n// A copy of all command line arguments.  Set by InitGoogleTest().\n::std::vector<String> g_argvs;\n\n// Returns the command line as a vector of strings.\nconst ::std::vector<String>& GetArgvs() { return g_argvs; }\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n#if GTEST_OS_WINDOWS_MOBILE\nnamespace posix {\nvoid Abort() {\n  DebugBreak();\n  TerminateProcess(GetCurrentProcess(), 1);\n}\n}  // namespace posix\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n// Returns the name of the environment variable corresponding to the\n// given flag.  For example, FlagToEnvVar(\"foo\") will return\n// \"GTEST_FOO\" in the open-source version.\nstatic String FlagToEnvVar(const char* flag) {\n  const String full_flag =\n      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();\n\n  Message env_var;\n  for (size_t i = 0; i != full_flag.length(); i++) {\n    env_var << static_cast<char>(toupper(full_flag.c_str()[i]));\n  }\n\n  return env_var.GetString();\n}\n\n// Parses 'str' for a 32-bit signed integer.  If successful, writes\n// the result to *value and returns true; otherwise leaves *value\n// unchanged and returns false.\nbool ParseInt32(const Message& src_text, const char* str, Int32* value) {\n  // Parses the environment variable as a decimal integer.\n  char* end = NULL;\n  const long long_value = strtol(str, &end, 10);  // NOLINT\n\n  // Has strtol() consumed all characters in the string?\n  if (*end != '\\0') {\n    // No - an invalid character was encountered.\n    Message msg;\n    msg << \"WARNING: \" << src_text\n        << \" is expected to be a 32-bit integer, but actually\"\n        << \" has value \\\"\" << str << \"\\\".\\n\";\n    printf(\"%s\", msg.GetString().c_str());\n    fflush(stdout);\n    return false;\n  }\n\n  // Is the parsed value in the range of an Int32?\n  const Int32 result = static_cast<Int32>(long_value);\n  if (long_value == LONG_MAX || long_value == LONG_MIN ||\n      // The parsed value overflows as a long.  (strtol() returns\n      // LONG_MAX or LONG_MIN when the input overflows.)\n      result != long_value\n      // The parsed value overflows as an Int32.\n      ) {\n    Message msg;\n    msg << \"WARNING: \" << src_text\n        << \" is expected to be a 32-bit integer, but actually\"\n        << \" has value \" << str << \", which overflows.\\n\";\n    printf(\"%s\", msg.GetString().c_str());\n    fflush(stdout);\n    return false;\n  }\n\n  *value = result;\n  return true;\n}\n\n// Reads and returns the Boolean environment variable corresponding to\n// the given flag; if it's not set, returns default_value.\n//\n// The value is considered true iff it's not \"0\".\nbool BoolFromGTestEnv(const char* flag, bool default_value) {\n  const String env_var = FlagToEnvVar(flag);\n  const char* const string_value = posix::GetEnv(env_var.c_str());\n  return string_value == NULL ?\n      default_value : strcmp(string_value, \"0\") != 0;\n}\n\n// Reads and returns a 32-bit integer stored in the environment\n// variable corresponding to the given flag; if it isn't set or\n// doesn't represent a valid 32-bit integer, returns default_value.\nInt32 Int32FromGTestEnv(const char* flag, Int32 default_value) {\n  const String env_var = FlagToEnvVar(flag);\n  const char* const string_value = posix::GetEnv(env_var.c_str());\n  if (string_value == NULL) {\n    // The environment variable is not set.\n    return default_value;\n  }\n\n  Int32 result = default_value;\n  if (!ParseInt32(Message() << \"Environment variable \" << env_var,\n                  string_value, &result)) {\n    printf(\"The default value %s is used.\\n\",\n           (Message() << default_value).GetString().c_str());\n    fflush(stdout);\n    return default_value;\n  }\n\n  return result;\n}\n\n// Reads and returns the string environment variable corresponding to\n// the given flag; if it's not set, returns default_value.\nconst char* StringFromGTestEnv(const char* flag, const char* default_value) {\n  const String env_var = FlagToEnvVar(flag);\n  const char* const value = posix::GetEnv(env_var.c_str());\n  return value == NULL ? default_value : value;\n}\n\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-test-part.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: mheule@google.com (Markus Heule)\n//\n// The Google C++ Testing Framework (Google Test)\n\n#include <gtest/gtest-test-part.h>\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\nnamespace testing {\n\nusing internal::GetUnitTestImpl;\n\n// Gets the summary of the failure message by omitting the stack trace\n// in it.\ninternal::String TestPartResult::ExtractSummary(const char* message) {\n  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);\n  return stack_trace == NULL ? internal::String(message) :\n      internal::String(message, stack_trace - message);\n}\n\n// Prints a TestPartResult object.\nstd::ostream& operator<<(std::ostream& os, const TestPartResult& result) {\n  return os\n      << result.file_name() << \":\" << result.line_number() << \": \"\n      << (result.type() == TestPartResult::kSuccess ? \"Success\" :\n          result.type() == TestPartResult::kFatalFailure ? \"Fatal failure\" :\n          \"Non-fatal failure\") << \":\\n\"\n      << result.message() << std::endl;\n}\n\n// Appends a TestPartResult to the array.\nvoid TestPartResultArray::Append(const TestPartResult& result) {\n  array_.push_back(result);\n}\n\n// Returns the TestPartResult at the given index (0-based).\nconst TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {\n  if (index < 0 || index >= size()) {\n    printf(\"\\nInvalid index (%d) into TestPartResultArray.\\n\", index);\n    internal::posix::Abort();\n  }\n\n  return array_[index];\n}\n\n// Returns the number of TestPartResult objects in the array.\nint TestPartResultArray::size() const {\n  return static_cast<int>(array_.size());\n}\n\nnamespace internal {\n\nHasNewFatalFailureHelper::HasNewFatalFailureHelper()\n    : has_new_fatal_failure_(false),\n      original_reporter_(GetUnitTestImpl()->\n                         GetTestPartResultReporterForCurrentThread()) {\n  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);\n}\n\nHasNewFatalFailureHelper::~HasNewFatalFailureHelper() {\n  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(\n      original_reporter_);\n}\n\nvoid HasNewFatalFailureHelper::ReportTestPartResult(\n    const TestPartResult& result) {\n  if (result.fatally_failed())\n    has_new_fatal_failure_ = true;\n  original_reporter_->ReportTestPartResult(result);\n}\n\n}  // namespace internal\n\n}  // namespace testing\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-typed-test.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#include <gtest/gtest-typed-test.h>\n#include <gtest/gtest.h>\n\nnamespace testing {\nnamespace internal {\n\n#if GTEST_HAS_TYPED_TEST_P\n\n// Skips to the first non-space char in str. Returns an empty string if str\n// contains only whitespace characters.\nstatic const char* SkipSpaces(const char* str) {\n  while (isspace(*str))\n    str++;\n  return str;\n}\n\n// Verifies that registered_tests match the test names in\n// defined_test_names_; returns registered_tests if successful, or\n// aborts the program otherwise.\nconst char* TypedTestCasePState::VerifyRegisteredTestNames(\n    const char* file, int line, const char* registered_tests) {\n  typedef ::std::set<const char*>::const_iterator DefinedTestIter;\n  registered_ = true;\n\n  // Skip initial whitespace in registered_tests since some\n  // preprocessors prefix stringizied literals with whitespace.\n  registered_tests = SkipSpaces(registered_tests);\n\n  Message errors;\n  ::std::set<String> tests;\n  for (const char* names = registered_tests; names != NULL;\n       names = SkipComma(names)) {\n    const String name = GetPrefixUntilComma(names);\n    if (tests.count(name) != 0) {\n      errors << \"Test \" << name << \" is listed more than once.\\n\";\n      continue;\n    }\n\n    bool found = false;\n    for (DefinedTestIter it = defined_test_names_.begin();\n         it != defined_test_names_.end();\n         ++it) {\n      if (name == *it) {\n        found = true;\n        break;\n      }\n    }\n\n    if (found) {\n      tests.insert(name);\n    } else {\n      errors << \"No test named \" << name\n             << \" can be found in this test case.\\n\";\n    }\n  }\n\n  for (DefinedTestIter it = defined_test_names_.begin();\n       it != defined_test_names_.end();\n       ++it) {\n    if (tests.count(*it) == 0) {\n      errors << \"You forgot to list test \" << *it << \".\\n\";\n    }\n  }\n\n  const String& errors_str = errors.GetString();\n  if (errors_str != \"\") {\n    fprintf(stderr, \"%s %s\", FormatFileLocation(file, line).c_str(),\n            errors_str.c_str());\n    fflush(stderr);\n    posix::Abort();\n  }\n\n  return registered_tests;\n}\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// The Google C++ Testing Framework (Google Test)\n\n#include <gtest/gtest.h>\n#include <gtest/gtest-spi.h>\n\n#include <ctype.h>\n#include <math.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <wchar.h>\n#include <wctype.h>\n\n#include <algorithm>\n#include <ostream>\n#include <sstream>\n#include <vector>\n\n#if GTEST_OS_LINUX\n\n// TODO(kenton@google.com): Use autoconf to detect availability of\n// gettimeofday().\n#define GTEST_HAS_GETTIMEOFDAY_ 1\n\n#include <fcntl.h>\n#include <limits.h>\n#include <sched.h>\n// Declares vsnprintf().  This header is not available on Windows.\n#include <strings.h>\n#include <sys/mman.h>\n#include <sys/time.h>\n#include <unistd.h>\n#include <string>\n#include <vector>\n\n#elif GTEST_OS_SYMBIAN\n#define GTEST_HAS_GETTIMEOFDAY_ 1\n#include <sys/time.h>  // NOLINT\n\n#elif GTEST_OS_ZOS\n#define GTEST_HAS_GETTIMEOFDAY_ 1\n#include <sys/time.h>  // NOLINT\n\n// On z/OS we additionally need strings.h for strcasecmp.\n#include <strings.h>  // NOLINT\n\n#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.\n\n#include <windows.h>  // NOLINT\n\n#elif GTEST_OS_WINDOWS  // We are on Windows proper.\n\n#include <io.h>  // NOLINT\n#include <sys/timeb.h>  // NOLINT\n#include <sys/types.h>  // NOLINT\n#include <sys/stat.h>  // NOLINT\n\n#if GTEST_OS_WINDOWS_MINGW\n// MinGW has gettimeofday() but not _ftime64().\n// TODO(kenton@google.com): Use autoconf to detect availability of\n//   gettimeofday().\n// TODO(kenton@google.com): There are other ways to get the time on\n//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW\n//   supports these.  consider using them instead.\n#define GTEST_HAS_GETTIMEOFDAY_ 1\n#include <sys/time.h>  // NOLINT\n#endif  // GTEST_OS_WINDOWS_MINGW\n\n// cpplint thinks that the header is already included, so we want to\n// silence it.\n#include <windows.h>  // NOLINT\n\n#else\n\n// Assume other platforms have gettimeofday().\n// TODO(kenton@google.com): Use autoconf to detect availability of\n//   gettimeofday().\n#define GTEST_HAS_GETTIMEOFDAY_ 1\n\n// cpplint thinks that the header is already included, so we want to\n// silence it.\n#include <sys/time.h>  // NOLINT\n#include <unistd.h>  // NOLINT\n\n#endif  // GTEST_OS_LINUX\n\n#if GTEST_HAS_EXCEPTIONS\n#include <stdexcept>\n#endif\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\n#if GTEST_OS_WINDOWS\n#define vsnprintf _vsnprintf\n#endif  // GTEST_OS_WINDOWS\n\nnamespace testing {\n\nusing internal::CountIf;\nusing internal::ForEach;\nusing internal::GetElementOr;\nusing internal::Shuffle;\n\n// Constants.\n\n// A test whose test case name or test name matches this filter is\n// disabled and not run.\nstatic const char kDisableTestFilter[] = \"DISABLED_*:*/DISABLED_*\";\n\n// A test case whose name matches this filter is considered a death\n// test case and will be run before test cases whose name doesn't\n// match this filter.\nstatic const char kDeathTestCaseFilter[] = \"*DeathTest:*DeathTest/*\";\n\n// A test filter that matches everything.\nstatic const char kUniversalFilter[] = \"*\";\n\n// The default output file for XML output.\nstatic const char kDefaultOutputFile[] = \"test_detail.xml\";\n\n// The environment variable name for the test shard index.\nstatic const char kTestShardIndex[] = \"GTEST_SHARD_INDEX\";\n// The environment variable name for the total number of test shards.\nstatic const char kTestTotalShards[] = \"GTEST_TOTAL_SHARDS\";\n// The environment variable name for the test shard status file.\nstatic const char kTestShardStatusFile[] = \"GTEST_SHARD_STATUS_FILE\";\n\nnamespace internal {\n\n// The text used in failure messages to indicate the start of the\n// stack trace.\nconst char kStackTraceMarker[] = \"\\nStack trace:\\n\";\n\n// g_help_flag is true iff the --help flag or an equivalent form is\n// specified on the command line.\nbool g_help_flag = false;\n\n}  // namespace internal\n\nGTEST_DEFINE_bool_(\n    also_run_disabled_tests,\n    internal::BoolFromGTestEnv(\"also_run_disabled_tests\", false),\n    \"Run disabled tests too, in addition to the tests normally being run.\");\n\nGTEST_DEFINE_bool_(\n    break_on_failure,\n    internal::BoolFromGTestEnv(\"break_on_failure\", false),\n    \"True iff a failed assertion should be a debugger break-point.\");\n\nGTEST_DEFINE_bool_(\n    catch_exceptions,\n    internal::BoolFromGTestEnv(\"catch_exceptions\", false),\n    \"True iff \" GTEST_NAME_\n    \" should catch exceptions and treat them as test failures.\");\n\nGTEST_DEFINE_string_(\n    color,\n    internal::StringFromGTestEnv(\"color\", \"auto\"),\n    \"Whether to use colors in the output.  Valid values: yes, no, \"\n    \"and auto.  'auto' means to use colors if the output is \"\n    \"being sent to a terminal and the TERM environment variable \"\n    \"is set to xterm, xterm-color, xterm-256color, linux or cygwin.\");\n\nGTEST_DEFINE_string_(\n    filter,\n    internal::StringFromGTestEnv(\"filter\", kUniversalFilter),\n    \"A colon-separated list of glob (not regex) patterns \"\n    \"for filtering the tests to run, optionally followed by a \"\n    \"'-' and a : separated list of negative patterns (tests to \"\n    \"exclude).  A test is run if it matches one of the positive \"\n    \"patterns and does not match any of the negative patterns.\");\n\nGTEST_DEFINE_bool_(list_tests, false,\n                   \"List all tests without running them.\");\n\nGTEST_DEFINE_string_(\n    output,\n    internal::StringFromGTestEnv(\"output\", \"\"),\n    \"A format (currently must be \\\"xml\\\"), optionally followed \"\n    \"by a colon and an output file name or directory. A directory \"\n    \"is indicated by a trailing pathname separator. \"\n    \"Examples: \\\"xml:filename.xml\\\", \\\"xml::directoryname/\\\". \"\n    \"If a directory is specified, output files will be created \"\n    \"within that directory, with file-names based on the test \"\n    \"executable's name and, if necessary, made unique by adding \"\n    \"digits.\");\n\nGTEST_DEFINE_bool_(\n    print_time,\n    internal::BoolFromGTestEnv(\"print_time\", true),\n    \"True iff \" GTEST_NAME_\n    \" should display elapsed time in text output.\");\n\nGTEST_DEFINE_int32_(\n    random_seed,\n    internal::Int32FromGTestEnv(\"random_seed\", 0),\n    \"Random number seed to use when shuffling test orders.  Must be in range \"\n    \"[1, 99999], or 0 to use a seed based on the current time.\");\n\nGTEST_DEFINE_int32_(\n    repeat,\n    internal::Int32FromGTestEnv(\"repeat\", 1),\n    \"How many times to repeat each test.  Specify a negative number \"\n    \"for repeating forever.  Useful for shaking out flaky tests.\");\n\nGTEST_DEFINE_bool_(\n    show_internal_stack_frames, false,\n    \"True iff \" GTEST_NAME_ \" should include internal stack frames when \"\n    \"printing test failure stack traces.\");\n\nGTEST_DEFINE_bool_(\n    shuffle,\n    internal::BoolFromGTestEnv(\"shuffle\", false),\n    \"True iff \" GTEST_NAME_\n    \" should randomize tests' order on every run.\");\n\nGTEST_DEFINE_int32_(\n    stack_trace_depth,\n    internal::Int32FromGTestEnv(\"stack_trace_depth\", kMaxStackTraceDepth),\n    \"The maximum number of stack frames to print when an \"\n    \"assertion fails.  The valid range is 0 through 100, inclusive.\");\n\nGTEST_DEFINE_bool_(\n    throw_on_failure,\n    internal::BoolFromGTestEnv(\"throw_on_failure\", false),\n    \"When this flag is specified, a failed assertion will throw an exception \"\n    \"if exceptions are enabled or exit the program with a non-zero code \"\n    \"otherwise.\");\n\nnamespace internal {\n\n// Generates a random number from [0, range), using a Linear\n// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater\n// than kMaxRange.\nUInt32 Random::Generate(UInt32 range) {\n  // These constants are the same as are used in glibc's rand(3).\n  state_ = (1103515245U*state_ + 12345U) % kMaxRange;\n\n  GTEST_CHECK_(range > 0)\n      << \"Cannot generate a number in the range [0, 0).\";\n  GTEST_CHECK_(range <= kMaxRange)\n      << \"Generation of a number in [0, \" << range << \") was requested, \"\n      << \"but this can only generate numbers in [0, \" << kMaxRange << \").\";\n\n  // Converting via modulus introduces a bit of downward bias, but\n  // it's simple, and a linear congruential generator isn't too good\n  // to begin with.\n  return state_ % range;\n}\n\n// GTestIsInitialized() returns true iff the user has initialized\n// Google Test.  Useful for catching the user mistake of not initializing\n// Google Test before calling RUN_ALL_TESTS().\n//\n// A user must call testing::InitGoogleTest() to initialize Google\n// Test.  g_init_gtest_count is set to the number of times\n// InitGoogleTest() has been called.  We don't protect this variable\n// under a mutex as it is only accessed in the main thread.\nint g_init_gtest_count = 0;\nstatic bool GTestIsInitialized() { return g_init_gtest_count != 0; }\n\n// Iterates over a vector of TestCases, keeping a running sum of the\n// results of calling a given int-returning method on each.\n// Returns the sum.\nstatic int SumOverTestCaseList(const std::vector<TestCase*>& case_list,\n                               int (TestCase::*method)() const) {\n  int sum = 0;\n  for (size_t i = 0; i < case_list.size(); i++) {\n    sum += (case_list[i]->*method)();\n  }\n  return sum;\n}\n\n// Returns true iff the test case passed.\nstatic bool TestCasePassed(const TestCase* test_case) {\n  return test_case->should_run() && test_case->Passed();\n}\n\n// Returns true iff the test case failed.\nstatic bool TestCaseFailed(const TestCase* test_case) {\n  return test_case->should_run() && test_case->Failed();\n}\n\n// Returns true iff test_case contains at least one test that should\n// run.\nstatic bool ShouldRunTestCase(const TestCase* test_case) {\n  return test_case->should_run();\n}\n\n// AssertHelper constructor.\nAssertHelper::AssertHelper(TestPartResult::Type type,\n                           const char* file,\n                           int line,\n                           const char* message)\n    : data_(new AssertHelperData(type, file, line, message)) {\n}\n\nAssertHelper::~AssertHelper() {\n  delete data_;\n}\n\n// Message assignment, for assertion streaming support.\nvoid AssertHelper::operator=(const Message& message) const {\n  UnitTest::GetInstance()->\n    AddTestPartResult(data_->type, data_->file, data_->line,\n                      AppendUserMessage(data_->message, message),\n                      UnitTest::GetInstance()->impl()\n                      ->CurrentOsStackTraceExceptTop(1)\n                      // Skips the stack frame for this function itself.\n                      );  // NOLINT\n}\n\n// Mutex for linked pointers.\nGTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);\n\n// Application pathname gotten in InitGoogleTest.\nString g_executable_path;\n\n// Returns the current application's name, removing directory path if that\n// is present.\nFilePath GetCurrentExecutableName() {\n  FilePath result;\n\n#if GTEST_OS_WINDOWS\n  result.Set(FilePath(g_executable_path).RemoveExtension(\"exe\"));\n#else\n  result.Set(FilePath(g_executable_path));\n#endif  // GTEST_OS_WINDOWS\n\n  return result.RemoveDirectoryName();\n}\n\n// Functions for processing the gtest_output flag.\n\n// Returns the output format, or \"\" for normal printed output.\nString UnitTestOptions::GetOutputFormat() {\n  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();\n  if (gtest_output_flag == NULL) return String(\"\");\n\n  const char* const colon = strchr(gtest_output_flag, ':');\n  return (colon == NULL) ?\n      String(gtest_output_flag) :\n      String(gtest_output_flag, colon - gtest_output_flag);\n}\n\n// Returns the name of the requested output file, or the default if none\n// was explicitly specified.\nString UnitTestOptions::GetAbsolutePathToOutputFile() {\n  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();\n  if (gtest_output_flag == NULL)\n    return String(\"\");\n\n  const char* const colon = strchr(gtest_output_flag, ':');\n  if (colon == NULL)\n    return String(internal::FilePath::ConcatPaths(\n               internal::FilePath(\n                   UnitTest::GetInstance()->original_working_dir()),\n               internal::FilePath(kDefaultOutputFile)).ToString() );\n\n  internal::FilePath output_name(colon + 1);\n  if (!output_name.IsAbsolutePath())\n    // TODO(wan@google.com): on Windows \\some\\path is not an absolute\n    // path (as its meaning depends on the current drive), yet the\n    // following logic for turning it into an absolute path is wrong.\n    // Fix it.\n    output_name = internal::FilePath::ConcatPaths(\n        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),\n        internal::FilePath(colon + 1));\n\n  if (!output_name.IsDirectory())\n    return output_name.ToString();\n\n  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(\n      output_name, internal::GetCurrentExecutableName(),\n      GetOutputFormat().c_str()));\n  return result.ToString();\n}\n\n// Returns true iff the wildcard pattern matches the string.  The\n// first ':' or '\\0' character in pattern marks the end of it.\n//\n// This recursive algorithm isn't very efficient, but is clear and\n// works well enough for matching test names, which are short.\nbool UnitTestOptions::PatternMatchesString(const char *pattern,\n                                           const char *str) {\n  switch (*pattern) {\n    case '\\0':\n    case ':':  // Either ':' or '\\0' marks the end of the pattern.\n      return *str == '\\0';\n    case '?':  // Matches any single character.\n      return *str != '\\0' && PatternMatchesString(pattern + 1, str + 1);\n    case '*':  // Matches any string (possibly empty) of characters.\n      return (*str != '\\0' && PatternMatchesString(pattern, str + 1)) ||\n          PatternMatchesString(pattern + 1, str);\n    default:  // Non-special character.  Matches itself.\n      return *pattern == *str &&\n          PatternMatchesString(pattern + 1, str + 1);\n  }\n}\n\nbool UnitTestOptions::MatchesFilter(const String& name, const char* filter) {\n  const char *cur_pattern = filter;\n  for (;;) {\n    if (PatternMatchesString(cur_pattern, name.c_str())) {\n      return true;\n    }\n\n    // Finds the next pattern in the filter.\n    cur_pattern = strchr(cur_pattern, ':');\n\n    // Returns if no more pattern can be found.\n    if (cur_pattern == NULL) {\n      return false;\n    }\n\n    // Skips the pattern separater (the ':' character).\n    cur_pattern++;\n  }\n}\n\n// TODO(keithray): move String function implementations to gtest-string.cc.\n\n// Returns true iff the user-specified filter matches the test case\n// name and the test name.\nbool UnitTestOptions::FilterMatchesTest(const String &test_case_name,\n                                        const String &test_name) {\n  const String& full_name = String::Format(\"%s.%s\",\n                                           test_case_name.c_str(),\n                                           test_name.c_str());\n\n  // Split --gtest_filter at '-', if there is one, to separate into\n  // positive filter and negative filter portions\n  const char* const p = GTEST_FLAG(filter).c_str();\n  const char* const dash = strchr(p, '-');\n  String positive;\n  String negative;\n  if (dash == NULL) {\n    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter\n    negative = String(\"\");\n  } else {\n    positive = String(p, dash - p);  // Everything up to the dash\n    negative = String(dash+1);       // Everything after the dash\n    if (positive.empty()) {\n      // Treat '-test1' as the same as '*-test1'\n      positive = kUniversalFilter;\n    }\n  }\n\n  // A filter is a colon-separated list of patterns.  It matches a\n  // test if any pattern in it matches the test.\n  return (MatchesFilter(full_name, positive.c_str()) &&\n          !MatchesFilter(full_name, negative.c_str()));\n}\n\n#if GTEST_OS_WINDOWS\n// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the\n// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.\n// This function is useful as an __except condition.\nint UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {\n  // Google Test should handle an exception if:\n  //   1. the user wants it to, AND\n  //   2. this is not a breakpoint exception.\n  return (GTEST_FLAG(catch_exceptions) &&\n          exception_code != EXCEPTION_BREAKPOINT) ?\n      EXCEPTION_EXECUTE_HANDLER :\n      EXCEPTION_CONTINUE_SEARCH;\n}\n#endif  // GTEST_OS_WINDOWS\n\n}  // namespace internal\n\n// The c'tor sets this object as the test part result reporter used by\n// Google Test.  The 'result' parameter specifies where to report the\n// results. Intercepts only failures from the current thread.\nScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(\n    TestPartResultArray* result)\n    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),\n      result_(result) {\n  Init();\n}\n\n// The c'tor sets this object as the test part result reporter used by\n// Google Test.  The 'result' parameter specifies where to report the\n// results.\nScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(\n    InterceptMode intercept_mode, TestPartResultArray* result)\n    : intercept_mode_(intercept_mode),\n      result_(result) {\n  Init();\n}\n\nvoid ScopedFakeTestPartResultReporter::Init() {\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {\n    old_reporter_ = impl->GetGlobalTestPartResultReporter();\n    impl->SetGlobalTestPartResultReporter(this);\n  } else {\n    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();\n    impl->SetTestPartResultReporterForCurrentThread(this);\n  }\n}\n\n// The d'tor restores the test part result reporter used by Google Test\n// before.\nScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {\n    impl->SetGlobalTestPartResultReporter(old_reporter_);\n  } else {\n    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);\n  }\n}\n\n// Increments the test part result count and remembers the result.\n// This method is from the TestPartResultReporterInterface interface.\nvoid ScopedFakeTestPartResultReporter::ReportTestPartResult(\n    const TestPartResult& result) {\n  result_->Append(result);\n}\n\nnamespace internal {\n\n// Returns the type ID of ::testing::Test.  We should always call this\n// instead of GetTypeId< ::testing::Test>() to get the type ID of\n// testing::Test.  This is to work around a suspected linker bug when\n// using Google Test as a framework on Mac OS X.  The bug causes\n// GetTypeId< ::testing::Test>() to return different values depending\n// on whether the call is from the Google Test framework itself or\n// from user test code.  GetTestTypeId() is guaranteed to always\n// return the same value, as it always calls GetTypeId<>() from the\n// gtest.cc, which is within the Google Test framework.\nTypeId GetTestTypeId() {\n  return GetTypeId<Test>();\n}\n\n// The value of GetTestTypeId() as seen from within the Google Test\n// library.  This is solely for testing GetTestTypeId().\nextern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();\n\n// This predicate-formatter checks that 'results' contains a test part\n// failure of the given type and that the failure message contains the\n// given substring.\nAssertionResult HasOneFailure(const char* /* results_expr */,\n                              const char* /* type_expr */,\n                              const char* /* substr_expr */,\n                              const TestPartResultArray& results,\n                              TestPartResult::Type type,\n                              const char* substr) {\n  const String expected(type == TestPartResult::kFatalFailure ?\n                        \"1 fatal failure\" :\n                        \"1 non-fatal failure\");\n  Message msg;\n  if (results.size() != 1) {\n    msg << \"Expected: \" << expected << \"\\n\"\n        << \"  Actual: \" << results.size() << \" failures\";\n    for (int i = 0; i < results.size(); i++) {\n      msg << \"\\n\" << results.GetTestPartResult(i);\n    }\n    return AssertionFailure(msg);\n  }\n\n  const TestPartResult& r = results.GetTestPartResult(0);\n  if (r.type() != type) {\n    msg << \"Expected: \" << expected << \"\\n\"\n        << \"  Actual:\\n\"\n        << r;\n    return AssertionFailure(msg);\n  }\n\n  if (strstr(r.message(), substr) == NULL) {\n    msg << \"Expected: \" << expected << \" containing \\\"\"\n        << substr << \"\\\"\\n\"\n        << \"  Actual:\\n\"\n        << r;\n    return AssertionFailure(msg);\n  }\n\n  return AssertionSuccess();\n}\n\n// The constructor of SingleFailureChecker remembers where to look up\n// test part results, what type of failure we expect, and what\n// substring the failure message should contain.\nSingleFailureChecker:: SingleFailureChecker(\n    const TestPartResultArray* results,\n    TestPartResult::Type type,\n    const char* substr)\n    : results_(results),\n      type_(type),\n      substr_(substr) {}\n\n// The destructor of SingleFailureChecker verifies that the given\n// TestPartResultArray contains exactly one failure that has the given\n// type and contains the given substring.  If that's not the case, a\n// non-fatal failure will be generated.\nSingleFailureChecker::~SingleFailureChecker() {\n  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_.c_str());\n}\n\nDefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(\n    UnitTestImpl* unit_test) : unit_test_(unit_test) {}\n\nvoid DefaultGlobalTestPartResultReporter::ReportTestPartResult(\n    const TestPartResult& result) {\n  unit_test_->current_test_result()->AddTestPartResult(result);\n  unit_test_->listeners()->repeater()->OnTestPartResult(result);\n}\n\nDefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(\n    UnitTestImpl* unit_test) : unit_test_(unit_test) {}\n\nvoid DefaultPerThreadTestPartResultReporter::ReportTestPartResult(\n    const TestPartResult& result) {\n  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);\n}\n\n// Returns the global test part result reporter.\nTestPartResultReporterInterface*\nUnitTestImpl::GetGlobalTestPartResultReporter() {\n  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);\n  return global_test_part_result_repoter_;\n}\n\n// Sets the global test part result reporter.\nvoid UnitTestImpl::SetGlobalTestPartResultReporter(\n    TestPartResultReporterInterface* reporter) {\n  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);\n  global_test_part_result_repoter_ = reporter;\n}\n\n// Returns the test part result reporter for the current thread.\nTestPartResultReporterInterface*\nUnitTestImpl::GetTestPartResultReporterForCurrentThread() {\n  return per_thread_test_part_result_reporter_.get();\n}\n\n// Sets the test part result reporter for the current thread.\nvoid UnitTestImpl::SetTestPartResultReporterForCurrentThread(\n    TestPartResultReporterInterface* reporter) {\n  per_thread_test_part_result_reporter_.set(reporter);\n}\n\n// Gets the number of successful test cases.\nint UnitTestImpl::successful_test_case_count() const {\n  return CountIf(test_cases_, TestCasePassed);\n}\n\n// Gets the number of failed test cases.\nint UnitTestImpl::failed_test_case_count() const {\n  return CountIf(test_cases_, TestCaseFailed);\n}\n\n// Gets the number of all test cases.\nint UnitTestImpl::total_test_case_count() const {\n  return static_cast<int>(test_cases_.size());\n}\n\n// Gets the number of all test cases that contain at least one test\n// that should run.\nint UnitTestImpl::test_case_to_run_count() const {\n  return CountIf(test_cases_, ShouldRunTestCase);\n}\n\n// Gets the number of successful tests.\nint UnitTestImpl::successful_test_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);\n}\n\n// Gets the number of failed tests.\nint UnitTestImpl::failed_test_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);\n}\n\n// Gets the number of disabled tests.\nint UnitTestImpl::disabled_test_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);\n}\n\n// Gets the number of all tests.\nint UnitTestImpl::total_test_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);\n}\n\n// Gets the number of tests that should run.\nint UnitTestImpl::test_to_run_count() const {\n  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);\n}\n\n// Returns the current OS stack trace as a String.\n//\n// The maximum number of stack frames to be included is specified by\n// the gtest_stack_trace_depth flag.  The skip_count parameter\n// specifies the number of top frames to be skipped, which doesn't\n// count against the number of frames to be included.\n//\n// For example, if Foo() calls Bar(), which in turn calls\n// CurrentOsStackTraceExceptTop(1), Foo() will be included in the\n// trace but Bar() and CurrentOsStackTraceExceptTop() won't.\nString UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {\n  (void)skip_count;\n  return String(\"\");\n}\n\n// Returns the current time in milliseconds.\nTimeInMillis GetTimeInMillis() {\n#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)\n  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.\n  // http://analogous.blogspot.com/2005/04/epoch.html\n  const TimeInMillis kJavaEpochToWinFileTimeDelta =\n    static_cast<TimeInMillis>(116444736UL) * 100000UL;\n  const DWORD kTenthMicrosInMilliSecond = 10000;\n\n  SYSTEMTIME now_systime;\n  FILETIME now_filetime;\n  ULARGE_INTEGER now_int64;\n  // TODO(kenton@google.com): Shouldn't this just use\n  //   GetSystemTimeAsFileTime()?\n  GetSystemTime(&now_systime);\n  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {\n    now_int64.LowPart = now_filetime.dwLowDateTime;\n    now_int64.HighPart = now_filetime.dwHighDateTime;\n    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -\n      kJavaEpochToWinFileTimeDelta;\n    return now_int64.QuadPart;\n  }\n  return 0;\n#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_\n  __timeb64 now;\n#ifdef _MSC_VER\n  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996\n  // (deprecated function) there.\n  // TODO(kenton@google.com): Use GetTickCount()?  Or use\n  //   SystemTimeToFileTime()\n#pragma warning(push)          // Saves the current warning state.\n#pragma warning(disable:4996)  // Temporarily disables warning 4996.\n  _ftime64(&now);\n#pragma warning(pop)           // Restores the warning state.\n#else\n  _ftime64(&now);\n#endif  // _MSC_VER\n  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;\n#elif GTEST_HAS_GETTIMEOFDAY_\n  struct timeval now;\n  gettimeofday(&now, NULL);\n  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;\n#else\n#error \"Don't know how to get the current time on your system.\"\n#endif\n}\n\n// Utilities\n\n// class String\n\n// Returns the input enclosed in double quotes if it's not NULL;\n// otherwise returns \"(null)\".  For example, \"\\\"Hello\\\"\" is returned\n// for input \"Hello\".\n//\n// This is useful for printing a C string in the syntax of a literal.\n//\n// Known issue: escape sequences are not handled yet.\nString String::ShowCStringQuoted(const char* c_str) {\n  return c_str ? String::Format(\"\\\"%s\\\"\", c_str) : String(\"(null)\");\n}\n\n// Copies at most length characters from str into a newly-allocated\n// piece of memory of size length+1.  The memory is allocated with new[].\n// A terminating null byte is written to the memory, and a pointer to it\n// is returned.  If str is NULL, NULL is returned.\nstatic char* CloneString(const char* str, size_t length) {\n  if (str == NULL) {\n    return NULL;\n  } else {\n    char* const clone = new char[length + 1];\n    posix::StrNCpy(clone, str, length);\n    clone[length] = '\\0';\n    return clone;\n  }\n}\n\n// Clones a 0-terminated C string, allocating memory using new.  The\n// caller is responsible for deleting[] the return value.  Returns the\n// cloned string, or NULL if the input is NULL.\nconst char * String::CloneCString(const char* c_str) {\n  return (c_str == NULL) ?\n                    NULL : CloneString(c_str, strlen(c_str));\n}\n\n#if GTEST_OS_WINDOWS_MOBILE\n// Creates a UTF-16 wide string from the given ANSI string, allocating\n// memory using new. The caller is responsible for deleting the return\n// value using delete[]. Returns the wide string, or NULL if the\n// input is NULL.\nLPCWSTR String::AnsiToUtf16(const char* ansi) {\n  if (!ansi) return NULL;\n  const int length = strlen(ansi);\n  const int unicode_length =\n      MultiByteToWideChar(CP_ACP, 0, ansi, length,\n                          NULL, 0);\n  WCHAR* unicode = new WCHAR[unicode_length + 1];\n  MultiByteToWideChar(CP_ACP, 0, ansi, length,\n                      unicode, unicode_length);\n  unicode[unicode_length] = 0;\n  return unicode;\n}\n\n// Creates an ANSI string from the given wide string, allocating\n// memory using new. The caller is responsible for deleting the return\n// value using delete[]. Returns the ANSI string, or NULL if the\n// input is NULL.\nconst char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {\n  if (!utf16_str) return NULL;\n  const int ansi_length =\n      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,\n                          NULL, 0, NULL, NULL);\n  char* ansi = new char[ansi_length + 1];\n  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,\n                      ansi, ansi_length, NULL, NULL);\n  ansi[ansi_length] = 0;\n  return ansi;\n}\n\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n// Compares two C strings.  Returns true iff they have the same content.\n//\n// Unlike strcmp(), this function can handle NULL argument(s).  A NULL\n// C string is considered different to any non-NULL C string,\n// including the empty string.\nbool String::CStringEquals(const char * lhs, const char * rhs) {\n  if ( lhs == NULL ) return rhs == NULL;\n\n  if ( rhs == NULL ) return false;\n\n  return strcmp(lhs, rhs) == 0;\n}\n\n#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING\n\n// Converts an array of wide chars to a narrow string using the UTF-8\n// encoding, and streams the result to the given Message object.\nstatic void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,\n                                     Message* msg) {\n  // TODO(wan): consider allowing a testing::String object to\n  // contain '\\0'.  This will make it behave more like std::string,\n  // and will allow ToUtf8String() to return the correct encoding\n  // for '\\0' s.t. we can get rid of the conditional here (and in\n  // several other places).\n  for (size_t i = 0; i != length; ) {  // NOLINT\n    if (wstr[i] != L'\\0') {\n      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));\n      while (i != length && wstr[i] != L'\\0')\n        i++;\n    } else {\n      *msg << '\\0';\n      i++;\n    }\n  }\n}\n\n#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING\n\n}  // namespace internal\n\n#if GTEST_HAS_STD_WSTRING\n// Converts the given wide string to a narrow string using the UTF-8\n// encoding, and streams the result to this Message object.\nMessage& Message::operator <<(const ::std::wstring& wstr) {\n  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);\n  return *this;\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_HAS_GLOBAL_WSTRING\n// Converts the given wide string to a narrow string using the UTF-8\n// encoding, and streams the result to this Message object.\nMessage& Message::operator <<(const ::wstring& wstr) {\n  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);\n  return *this;\n}\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\nnamespace internal {\n\n// Formats a value to be used in a failure message.\n\n// For a char value, we print it as a C++ char literal and as an\n// unsigned integer (both in decimal and in hexadecimal).\nString FormatForFailureMessage(char ch) {\n  const unsigned int ch_as_uint = ch;\n  // A String object cannot contain '\\0', so we print \"\\\\0\" when ch is\n  // '\\0'.\n  return String::Format(\"'%s' (%u, 0x%X)\",\n                        ch ? String::Format(\"%c\", ch).c_str() : \"\\\\0\",\n                        ch_as_uint, ch_as_uint);\n}\n\n// For a wchar_t value, we print it as a C++ wchar_t literal and as an\n// unsigned integer (both in decimal and in hexidecimal).\nString FormatForFailureMessage(wchar_t wchar) {\n  // The C++ standard doesn't specify the exact size of the wchar_t\n  // type.  It just says that it shall have the same size as another\n  // integral type, called its underlying type.\n  //\n  // Therefore, in order to print a wchar_t value in the numeric form,\n  // we first convert it to the largest integral type (UInt64) and\n  // then print the converted value.\n  //\n  // We use streaming to print the value as \"%llu\" doesn't work\n  // correctly with MSVC 7.1.\n  const UInt64 wchar_as_uint64 = wchar;\n  Message msg;\n  // A String object cannot contain '\\0', so we print \"\\\\0\" when wchar is\n  // L'\\0'.\n  char buffer[32];  // CodePointToUtf8 requires a buffer that big.\n  msg << \"L'\"\n      << (wchar ? CodePointToUtf8(static_cast<UInt32>(wchar), buffer) : \"\\\\0\")\n      << \"' (\" << wchar_as_uint64 << \", 0x\" << ::std::setbase(16)\n      << wchar_as_uint64 << \")\";\n  return msg.GetString();\n}\n\n}  // namespace internal\n\n// AssertionResult constructors.\n// Used in EXPECT_TRUE/FALSE(assertion_result).\nAssertionResult::AssertionResult(const AssertionResult& other)\n    : success_(other.success_),\n      message_(other.message_.get() != NULL ?\n               new internal::String(*other.message_) :\n               static_cast<internal::String*>(NULL)) {\n}\n\n// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.\nAssertionResult AssertionResult::operator!() const {\n  AssertionResult negation(!success_);\n  if (message_.get() != NULL)\n    negation << *message_;\n  return negation;\n}\n\n// Makes a successful assertion result.\nAssertionResult AssertionSuccess() {\n  return AssertionResult(true);\n}\n\n// Makes a failed assertion result.\nAssertionResult AssertionFailure() {\n  return AssertionResult(false);\n}\n\n// Makes a failed assertion result with the given failure message.\n// Deprecated; use AssertionFailure() << message.\nAssertionResult AssertionFailure(const Message& message) {\n  return AssertionFailure() << message;\n}\n\nnamespace internal {\n\n// Constructs and returns the message for an equality assertion\n// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.\n//\n// The first four parameters are the expressions used in the assertion\n// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)\n// where foo is 5 and bar is 6, we have:\n//\n//   expected_expression: \"foo\"\n//   actual_expression:   \"bar\"\n//   expected_value:      \"5\"\n//   actual_value:        \"6\"\n//\n// The ignoring_case parameter is true iff the assertion is a\n// *_STRCASEEQ*.  When it's true, the string \" (ignoring case)\" will\n// be inserted into the message.\nAssertionResult EqFailure(const char* expected_expression,\n                          const char* actual_expression,\n                          const String& expected_value,\n                          const String& actual_value,\n                          bool ignoring_case) {\n  Message msg;\n  msg << \"Value of: \" << actual_expression;\n  if (actual_value != actual_expression) {\n    msg << \"\\n  Actual: \" << actual_value;\n  }\n\n  msg << \"\\nExpected: \" << expected_expression;\n  if (ignoring_case) {\n    msg << \" (ignoring case)\";\n  }\n  if (expected_value != expected_expression) {\n    msg << \"\\nWhich is: \" << expected_value;\n  }\n\n  return AssertionFailure(msg);\n}\n\n// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.\nString GetBoolAssertionFailureMessage(const AssertionResult& assertion_result,\n                                      const char* expression_text,\n                                      const char* actual_predicate_value,\n                                      const char* expected_predicate_value) {\n  const char* actual_message = assertion_result.message();\n  Message msg;\n  msg << \"Value of: \" << expression_text\n      << \"\\n  Actual: \" << actual_predicate_value;\n  if (actual_message[0] != '\\0')\n    msg << \" (\" << actual_message << \")\";\n  msg << \"\\nExpected: \" << expected_predicate_value;\n  return msg.GetString();\n}\n\n// Helper function for implementing ASSERT_NEAR.\nAssertionResult DoubleNearPredFormat(const char* expr1,\n                                     const char* expr2,\n                                     const char* abs_error_expr,\n                                     double val1,\n                                     double val2,\n                                     double abs_error) {\n  const double diff = fabs(val1 - val2);\n  if (diff <= abs_error) return AssertionSuccess();\n\n  // TODO(wan): do not print the value of an expression if it's\n  // already a literal.\n  Message msg;\n  msg << \"The difference between \" << expr1 << \" and \" << expr2\n      << \" is \" << diff << \", which exceeds \" << abs_error_expr << \", where\\n\"\n      << expr1 << \" evaluates to \" << val1 << \",\\n\"\n      << expr2 << \" evaluates to \" << val2 << \", and\\n\"\n      << abs_error_expr << \" evaluates to \" << abs_error << \".\";\n  return AssertionFailure(msg);\n}\n\n\n// Helper template for implementing FloatLE() and DoubleLE().\ntemplate <typename RawType>\nAssertionResult FloatingPointLE(const char* expr1,\n                                const char* expr2,\n                                RawType val1,\n                                RawType val2) {\n  // Returns success if val1 is less than val2,\n  if (val1 < val2) {\n    return AssertionSuccess();\n  }\n\n  // or if val1 is almost equal to val2.\n  const FloatingPoint<RawType> lhs(val1), rhs(val2);\n  if (lhs.AlmostEquals(rhs)) {\n    return AssertionSuccess();\n  }\n\n  // Note that the above two checks will both fail if either val1 or\n  // val2 is NaN, as the IEEE floating-point standard requires that\n  // any predicate involving a NaN must return false.\n\n  StrStream val1_ss;\n  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n          << val1;\n\n  StrStream val2_ss;\n  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)\n          << val2;\n\n  Message msg;\n  msg << \"Expected: (\" << expr1 << \") <= (\" << expr2 << \")\\n\"\n      << \"  Actual: \" << StrStreamToString(&val1_ss) << \" vs \"\n      << StrStreamToString(&val2_ss);\n\n  return AssertionFailure(msg);\n}\n\n}  // namespace internal\n\n// Asserts that val1 is less than, or almost equal to, val2.  Fails\n// otherwise.  In particular, it fails if either val1 or val2 is NaN.\nAssertionResult FloatLE(const char* expr1, const char* expr2,\n                        float val1, float val2) {\n  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);\n}\n\n// Asserts that val1 is less than, or almost equal to, val2.  Fails\n// otherwise.  In particular, it fails if either val1 or val2 is NaN.\nAssertionResult DoubleLE(const char* expr1, const char* expr2,\n                         double val1, double val2) {\n  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);\n}\n\nnamespace internal {\n\n// The helper function for {ASSERT|EXPECT}_EQ with int or enum\n// arguments.\nAssertionResult CmpHelperEQ(const char* expected_expression,\n                            const char* actual_expression,\n                            BiggestInt expected,\n                            BiggestInt actual) {\n  if (expected == actual) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(expected_expression,\n                   actual_expression,\n                   FormatForComparisonFailureMessage(expected, actual),\n                   FormatForComparisonFailureMessage(actual, expected),\n                   false);\n}\n\n// A macro for implementing the helper functions needed to implement\n// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here\n// just to avoid copy-and-paste of similar code.\n#define GTEST_IMPL_CMP_HELPER_(op_name, op)\\\nAssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \\\n                                   BiggestInt val1, BiggestInt val2) {\\\n  if (val1 op val2) {\\\n    return AssertionSuccess();\\\n  } else {\\\n    Message msg;\\\n    msg << \"Expected: (\" << expr1 << \") \" #op \" (\" << expr2\\\n        << \"), actual: \" << FormatForComparisonFailureMessage(val1, val2)\\\n        << \" vs \" << FormatForComparisonFailureMessage(val2, val1);\\\n    return AssertionFailure(msg);\\\n  }\\\n}\n\n// Implements the helper function for {ASSERT|EXPECT}_NE with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(NE, !=)\n// Implements the helper function for {ASSERT|EXPECT}_LE with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(LE, <=)\n// Implements the helper function for {ASSERT|EXPECT}_LT with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(LT, < )\n// Implements the helper function for {ASSERT|EXPECT}_GE with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(GE, >=)\n// Implements the helper function for {ASSERT|EXPECT}_GT with int or\n// enum arguments.\nGTEST_IMPL_CMP_HELPER_(GT, > )\n\n#undef GTEST_IMPL_CMP_HELPER_\n\n// The helper function for {ASSERT|EXPECT}_STREQ.\nAssertionResult CmpHelperSTREQ(const char* expected_expression,\n                               const char* actual_expression,\n                               const char* expected,\n                               const char* actual) {\n  if (String::CStringEquals(expected, actual)) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(expected_expression,\n                   actual_expression,\n                   String::ShowCStringQuoted(expected),\n                   String::ShowCStringQuoted(actual),\n                   false);\n}\n\n// The helper function for {ASSERT|EXPECT}_STRCASEEQ.\nAssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,\n                                   const char* actual_expression,\n                                   const char* expected,\n                                   const char* actual) {\n  if (String::CaseInsensitiveCStringEquals(expected, actual)) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(expected_expression,\n                   actual_expression,\n                   String::ShowCStringQuoted(expected),\n                   String::ShowCStringQuoted(actual),\n                   true);\n}\n\n// The helper function for {ASSERT|EXPECT}_STRNE.\nAssertionResult CmpHelperSTRNE(const char* s1_expression,\n                               const char* s2_expression,\n                               const char* s1,\n                               const char* s2) {\n  if (!String::CStringEquals(s1, s2)) {\n    return AssertionSuccess();\n  } else {\n    Message msg;\n    msg << \"Expected: (\" << s1_expression << \") != (\"\n        << s2_expression << \"), actual: \\\"\"\n        << s1 << \"\\\" vs \\\"\" << s2 << \"\\\"\";\n    return AssertionFailure(msg);\n  }\n}\n\n// The helper function for {ASSERT|EXPECT}_STRCASENE.\nAssertionResult CmpHelperSTRCASENE(const char* s1_expression,\n                                   const char* s2_expression,\n                                   const char* s1,\n                                   const char* s2) {\n  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {\n    return AssertionSuccess();\n  } else {\n    Message msg;\n    msg << \"Expected: (\" << s1_expression << \") != (\"\n        << s2_expression << \") (ignoring case), actual: \\\"\"\n        << s1 << \"\\\" vs \\\"\" << s2 << \"\\\"\";\n    return AssertionFailure(msg);\n  }\n}\n\n}  // namespace internal\n\nnamespace {\n\n// Helper functions for implementing IsSubString() and IsNotSubstring().\n\n// This group of overloaded functions return true iff needle is a\n// substring of haystack.  NULL is considered a substring of itself\n// only.\n\nbool IsSubstringPred(const char* needle, const char* haystack) {\n  if (needle == NULL || haystack == NULL)\n    return needle == haystack;\n\n  return strstr(haystack, needle) != NULL;\n}\n\nbool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {\n  if (needle == NULL || haystack == NULL)\n    return needle == haystack;\n\n  return wcsstr(haystack, needle) != NULL;\n}\n\n// StringType here can be either ::std::string or ::std::wstring.\ntemplate <typename StringType>\nbool IsSubstringPred(const StringType& needle,\n                     const StringType& haystack) {\n  return haystack.find(needle) != StringType::npos;\n}\n\n// This function implements either IsSubstring() or IsNotSubstring(),\n// depending on the value of the expected_to_be_substring parameter.\n// StringType here can be const char*, const wchar_t*, ::std::string,\n// or ::std::wstring.\ntemplate <typename StringType>\nAssertionResult IsSubstringImpl(\n    bool expected_to_be_substring,\n    const char* needle_expr, const char* haystack_expr,\n    const StringType& needle, const StringType& haystack) {\n  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)\n    return AssertionSuccess();\n\n  const bool is_wide_string = sizeof(needle[0]) > 1;\n  const char* const begin_string_quote = is_wide_string ? \"L\\\"\" : \"\\\"\";\n  return AssertionFailure(\n      Message()\n      << \"Value of: \" << needle_expr << \"\\n\"\n      << \"  Actual: \" << begin_string_quote << needle << \"\\\"\\n\"\n      << \"Expected: \" << (expected_to_be_substring ? \"\" : \"not \")\n      << \"a substring of \" << haystack_expr << \"\\n\"\n      << \"Which is: \" << begin_string_quote << haystack << \"\\\"\");\n}\n\n}  // namespace\n\n// IsSubstring() and IsNotSubstring() check whether needle is a\n// substring of haystack (NULL is considered a substring of itself\n// only), and return an appropriate error message when they fail.\n\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const char* needle, const char* haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const wchar_t* needle, const wchar_t* haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::string& needle, const ::std::string& haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n\n#if GTEST_HAS_STD_WSTRING\nAssertionResult IsSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack) {\n  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);\n}\n\nAssertionResult IsNotSubstring(\n    const char* needle_expr, const char* haystack_expr,\n    const ::std::wstring& needle, const ::std::wstring& haystack) {\n  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);\n}\n#endif  // GTEST_HAS_STD_WSTRING\n\nnamespace internal {\n\n#if GTEST_OS_WINDOWS\n\nnamespace {\n\n// Helper function for IsHRESULT{SuccessFailure} predicates\nAssertionResult HRESULTFailureHelper(const char* expr,\n                                     const char* expected,\n                                     long hr) {  // NOLINT\n#if GTEST_OS_WINDOWS_MOBILE\n  // Windows CE doesn't support FormatMessage.\n  const char error_text[] = \"\";\n#else\n  // Looks up the human-readable system message for the HRESULT code\n  // and since we're not passing any params to FormatMessage, we don't\n  // want inserts expanded.\n  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |\n                       FORMAT_MESSAGE_IGNORE_INSERTS;\n  const DWORD kBufSize = 4096;  // String::Format can't exceed this length.\n  // Gets the system's human readable message string for this HRESULT.\n  char error_text[kBufSize] = { '\\0' };\n  DWORD message_length = ::FormatMessageA(kFlags,\n                                          0,  // no source, we're asking system\n                                          hr,  // the error\n                                          0,  // no line width restrictions\n                                          error_text,  // output buffer\n                                          kBufSize,  // buf size\n                                          NULL);  // no arguments for inserts\n  // Trims tailing white space (FormatMessage leaves a trailing cr-lf)\n  for (; message_length && isspace(error_text[message_length - 1]);\n          --message_length) {\n    error_text[message_length - 1] = '\\0';\n  }\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n  const String error_hex(String::Format(\"0x%08X \", hr));\n  Message msg;\n  msg << \"Expected: \" << expr << \" \" << expected << \".\\n\"\n      << \"  Actual: \" << error_hex << error_text << \"\\n\";\n\n  return ::testing::AssertionFailure(msg);\n}\n\n}  // namespace\n\nAssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT\n  if (SUCCEEDED(hr)) {\n    return AssertionSuccess();\n  }\n  return HRESULTFailureHelper(expr, \"succeeds\", hr);\n}\n\nAssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT\n  if (FAILED(hr)) {\n    return AssertionSuccess();\n  }\n  return HRESULTFailureHelper(expr, \"fails\", hr);\n}\n\n#endif  // GTEST_OS_WINDOWS\n\n// Utility functions for encoding Unicode text (wide strings) in\n// UTF-8.\n\n// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8\n// like this:\n//\n// Code-point length   Encoding\n//   0 -  7 bits       0xxxxxxx\n//   8 - 11 bits       110xxxxx 10xxxxxx\n//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx\n//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n\n// The maximum code-point a one-byte UTF-8 sequence can represent.\nconst UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;\n\n// The maximum code-point a two-byte UTF-8 sequence can represent.\nconst UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;\n\n// The maximum code-point a three-byte UTF-8 sequence can represent.\nconst UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;\n\n// The maximum code-point a four-byte UTF-8 sequence can represent.\nconst UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;\n\n// Chops off the n lowest bits from a bit pattern.  Returns the n\n// lowest bits.  As a side effect, the original bit pattern will be\n// shifted to the right by n bits.\ninline UInt32 ChopLowBits(UInt32* bits, int n) {\n  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);\n  *bits >>= n;\n  return low_bits;\n}\n\n// Converts a Unicode code point to a narrow string in UTF-8 encoding.\n// code_point parameter is of type UInt32 because wchar_t may not be\n// wide enough to contain a code point.\n// The output buffer str must containt at least 32 characters.\n// The function returns the address of the output buffer.\n// If the code_point is not a valid Unicode code point\n// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output\n// as '(Invalid Unicode 0xXXXXXXXX)'.\nchar* CodePointToUtf8(UInt32 code_point, char* str) {\n  if (code_point <= kMaxCodePoint1) {\n    str[1] = '\\0';\n    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx\n  } else if (code_point <= kMaxCodePoint2) {\n    str[2] = '\\0';\n    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx\n  } else if (code_point <= kMaxCodePoint3) {\n    str[3] = '\\0';\n    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx\n  } else if (code_point <= kMaxCodePoint4) {\n    str[4] = '\\0';\n    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx\n    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx\n  } else {\n    // The longest string String::Format can produce when invoked\n    // with these parameters is 28 character long (not including\n    // the terminating nul character). We are asking for 32 character\n    // buffer just in case. This is also enough for strncpy to\n    // null-terminate the destination string.\n    posix::StrNCpy(\n        str, String::Format(\"(Invalid Unicode 0x%X)\", code_point).c_str(), 32);\n    str[31] = '\\0';  // Makes sure no change in the format to strncpy leaves\n                     // the result unterminated.\n  }\n  return str;\n}\n\n// The following two functions only make sense if the the system\n// uses UTF-16 for wide string encoding. All supported systems\n// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.\n\n// Determines if the arguments constitute UTF-16 surrogate pair\n// and thus should be combined into a single Unicode code point\n// using CreateCodePointFromUtf16SurrogatePair.\ninline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {\n  return sizeof(wchar_t) == 2 &&\n      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;\n}\n\n// Creates a Unicode code point from UTF16 surrogate pair.\ninline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,\n                                                    wchar_t second) {\n  const UInt32 mask = (1 << 10) - 1;\n  return (sizeof(wchar_t) == 2) ?\n      (((first & mask) << 10) | (second & mask)) + 0x10000 :\n      // This function should not be called when the condition is\n      // false, but we provide a sensible default in case it is.\n      static_cast<UInt32>(first);\n}\n\n// Converts a wide string to a narrow string in UTF-8 encoding.\n// The wide string is assumed to have the following encoding:\n//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)\n//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)\n// Parameter str points to a null-terminated wide string.\n// Parameter num_chars may additionally limit the number\n// of wchar_t characters processed. -1 is used when the entire string\n// should be processed.\n// If the string contains code points that are not valid Unicode code points\n// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output\n// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding\n// and contains invalid UTF-16 surrogate pairs, values in those pairs\n// will be encoded as individual Unicode characters from Basic Normal Plane.\nString WideStringToUtf8(const wchar_t* str, int num_chars) {\n  if (num_chars == -1)\n    num_chars = static_cast<int>(wcslen(str));\n\n  StrStream stream;\n  for (int i = 0; i < num_chars; ++i) {\n    UInt32 unicode_code_point;\n\n    if (str[i] == L'\\0') {\n      break;\n    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {\n      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],\n                                                                 str[i + 1]);\n      i++;\n    } else {\n      unicode_code_point = static_cast<UInt32>(str[i]);\n    }\n\n    char buffer[32];  // CodePointToUtf8 requires a buffer this big.\n    stream << CodePointToUtf8(unicode_code_point, buffer);\n  }\n  return StrStreamToString(&stream);\n}\n\n// Converts a wide C string to a String using the UTF-8 encoding.\n// NULL will be converted to \"(null)\".\nString String::ShowWideCString(const wchar_t * wide_c_str) {\n  if (wide_c_str == NULL) return String(\"(null)\");\n\n  return String(internal::WideStringToUtf8(wide_c_str, -1).c_str());\n}\n\n// Similar to ShowWideCString(), except that this function encloses\n// the converted string in double quotes.\nString String::ShowWideCStringQuoted(const wchar_t* wide_c_str) {\n  if (wide_c_str == NULL) return String(\"(null)\");\n\n  return String::Format(\"L\\\"%s\\\"\",\n                        String::ShowWideCString(wide_c_str).c_str());\n}\n\n// Compares two wide C strings.  Returns true iff they have the same\n// content.\n//\n// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL\n// C string is considered different to any non-NULL C string,\n// including the empty string.\nbool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {\n  if (lhs == NULL) return rhs == NULL;\n\n  if (rhs == NULL) return false;\n\n  return wcscmp(lhs, rhs) == 0;\n}\n\n// Helper function for *_STREQ on wide strings.\nAssertionResult CmpHelperSTREQ(const char* expected_expression,\n                               const char* actual_expression,\n                               const wchar_t* expected,\n                               const wchar_t* actual) {\n  if (String::WideCStringEquals(expected, actual)) {\n    return AssertionSuccess();\n  }\n\n  return EqFailure(expected_expression,\n                   actual_expression,\n                   String::ShowWideCStringQuoted(expected),\n                   String::ShowWideCStringQuoted(actual),\n                   false);\n}\n\n// Helper function for *_STRNE on wide strings.\nAssertionResult CmpHelperSTRNE(const char* s1_expression,\n                               const char* s2_expression,\n                               const wchar_t* s1,\n                               const wchar_t* s2) {\n  if (!String::WideCStringEquals(s1, s2)) {\n    return AssertionSuccess();\n  }\n\n  Message msg;\n  msg << \"Expected: (\" << s1_expression << \") != (\"\n      << s2_expression << \"), actual: \"\n      << String::ShowWideCStringQuoted(s1)\n      << \" vs \" << String::ShowWideCStringQuoted(s2);\n  return AssertionFailure(msg);\n}\n\n// Compares two C strings, ignoring case.  Returns true iff they have\n// the same content.\n//\n// Unlike strcasecmp(), this function can handle NULL argument(s).  A\n// NULL C string is considered different to any non-NULL C string,\n// including the empty string.\nbool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {\n  if (lhs == NULL)\n    return rhs == NULL;\n  if (rhs == NULL)\n    return false;\n  return posix::StrCaseCmp(lhs, rhs) == 0;\n}\n\n  // Compares two wide C strings, ignoring case.  Returns true iff they\n  // have the same content.\n  //\n  // Unlike wcscasecmp(), this function can handle NULL argument(s).\n  // A NULL C string is considered different to any non-NULL wide C string,\n  // including the empty string.\n  // NB: The implementations on different platforms slightly differ.\n  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE\n  // environment variable. On GNU platform this method uses wcscasecmp\n  // which compares according to LC_CTYPE category of the current locale.\n  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the\n  // current locale.\nbool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,\n                                              const wchar_t* rhs) {\n  if ( lhs == NULL ) return rhs == NULL;\n\n  if ( rhs == NULL ) return false;\n\n#if GTEST_OS_WINDOWS\n  return _wcsicmp(lhs, rhs) == 0;\n#elif GTEST_OS_LINUX\n  return wcscasecmp(lhs, rhs) == 0;\n#else\n  // Mac OS X and Cygwin don't define wcscasecmp.  Other unknown OSes\n  // may not define it either.\n  wint_t left, right;\n  do {\n    left = towlower(*lhs++);\n    right = towlower(*rhs++);\n  } while (left && left == right);\n  return left == right;\n#endif  // OS selector\n}\n\n// Compares this with another String.\n// Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0\n// if this is greater than rhs.\nint String::Compare(const String & rhs) const {\n  const char* const lhs_c_str = c_str();\n  const char* const rhs_c_str = rhs.c_str();\n\n  if (lhs_c_str == NULL) {\n    return rhs_c_str == NULL ? 0 : -1;  // NULL < anything except NULL\n  } else if (rhs_c_str == NULL) {\n    return 1;\n  }\n\n  const size_t shorter_str_len =\n      length() <= rhs.length() ? length() : rhs.length();\n  for (size_t i = 0; i != shorter_str_len; i++) {\n    if (lhs_c_str[i] < rhs_c_str[i]) {\n      return -1;\n    } else if (lhs_c_str[i] > rhs_c_str[i]) {\n      return 1;\n    }\n  }\n  return (length() < rhs.length()) ? -1 :\n      (length() > rhs.length()) ? 1 : 0;\n}\n\n// Returns true iff this String ends with the given suffix.  *Any*\n// String is considered to end with a NULL or empty suffix.\nbool String::EndsWith(const char* suffix) const {\n  if (suffix == NULL || CStringEquals(suffix, \"\")) return true;\n\n  if (c_str() == NULL) return false;\n\n  const size_t this_len = strlen(c_str());\n  const size_t suffix_len = strlen(suffix);\n  return (this_len >= suffix_len) &&\n         CStringEquals(c_str() + this_len - suffix_len, suffix);\n}\n\n// Returns true iff this String ends with the given suffix, ignoring case.\n// Any String is considered to end with a NULL or empty suffix.\nbool String::EndsWithCaseInsensitive(const char* suffix) const {\n  if (suffix == NULL || CStringEquals(suffix, \"\")) return true;\n\n  if (c_str() == NULL) return false;\n\n  const size_t this_len = strlen(c_str());\n  const size_t suffix_len = strlen(suffix);\n  return (this_len >= suffix_len) &&\n         CaseInsensitiveCStringEquals(c_str() + this_len - suffix_len, suffix);\n}\n\n// Formats a list of arguments to a String, using the same format\n// spec string as for printf.\n//\n// We do not use the StringPrintf class as it is not universally\n// available.\n//\n// The result is limited to 4096 characters (including the tailing 0).\n// If 4096 characters are not enough to format the input, or if\n// there's an error, \"<formatting error or buffer exceeded>\" is\n// returned.\nString String::Format(const char * format, ...) {\n  va_list args;\n  va_start(args, format);\n\n  char buffer[4096];\n  const int kBufferSize = sizeof(buffer)/sizeof(buffer[0]);\n\n  // MSVC 8 deprecates vsnprintf(), so we want to suppress warning\n  // 4996 (deprecated function) there.\n#ifdef _MSC_VER  // We are using MSVC.\n#pragma warning(push)          // Saves the current warning state.\n#pragma warning(disable:4996)  // Temporarily disables warning 4996.\n  const int size = vsnprintf(buffer, kBufferSize, format, args);\n#pragma warning(pop)           // Restores the warning state.\n#else  // We are not using MSVC.\n  const int size = vsnprintf(buffer, kBufferSize, format, args);\n#endif  // _MSC_VER\n  va_end(args);\n\n  // vsnprintf()'s behavior is not portable.  When the buffer is not\n  // big enough, it returns a negative value in MSVC, and returns the\n  // needed buffer size on Linux.  When there is an output error, it\n  // always returns a negative value.  For simplicity, we lump the two\n  // error cases together.\n  if (size < 0 || size >= kBufferSize) {\n    return String(\"<formatting error or buffer exceeded>\");\n  } else {\n    return String(buffer, size);\n  }\n}\n\n// Converts the buffer in a StrStream to a String, converting NUL\n// bytes to \"\\\\0\" along the way.\nString StrStreamToString(StrStream* ss) {\n  const ::std::string& str = ss->str();\n  const char* const start = str.c_str();\n  const char* const end = start + str.length();\n\n  // We need to use a helper StrStream to do this transformation\n  // because String doesn't support push_back().\n  StrStream helper;\n  for (const char* ch = start; ch != end; ++ch) {\n    if (*ch == '\\0') {\n      helper << \"\\\\0\";  // Replaces NUL with \"\\\\0\";\n    } else {\n      helper.put(*ch);\n    }\n  }\n\n  return String(helper.str().c_str());\n}\n\n// Appends the user-supplied message to the Google-Test-generated message.\nString AppendUserMessage(const String& gtest_msg,\n                         const Message& user_msg) {\n  // Appends the user message if it's non-empty.\n  const String user_msg_string = user_msg.GetString();\n  if (user_msg_string.empty()) {\n    return gtest_msg;\n  }\n\n  Message msg;\n  msg << gtest_msg << \"\\n\" << user_msg_string;\n\n  return msg.GetString();\n}\n\n}  // namespace internal\n\n// class TestResult\n\n// Creates an empty TestResult.\nTestResult::TestResult()\n    : death_test_count_(0),\n      elapsed_time_(0) {\n}\n\n// D'tor.\nTestResult::~TestResult() {\n}\n\n// Returns the i-th test part result among all the results. i can\n// range from 0 to total_part_count() - 1. If i is not in that range,\n// aborts the program.\nconst TestPartResult& TestResult::GetTestPartResult(int i) const {\n  if (i < 0 || i >= total_part_count())\n    internal::posix::Abort();\n  return test_part_results_.at(i);\n}\n\n// Returns the i-th test property. i can range from 0 to\n// test_property_count() - 1. If i is not in that range, aborts the\n// program.\nconst TestProperty& TestResult::GetTestProperty(int i) const {\n  if (i < 0 || i >= test_property_count())\n    internal::posix::Abort();\n  return test_properties_.at(i);\n}\n\n// Clears the test part results.\nvoid TestResult::ClearTestPartResults() {\n  test_part_results_.clear();\n}\n\n// Adds a test part result to the list.\nvoid TestResult::AddTestPartResult(const TestPartResult& test_part_result) {\n  test_part_results_.push_back(test_part_result);\n}\n\n// Adds a test property to the list. If a property with the same key as the\n// supplied property is already represented, the value of this test_property\n// replaces the old value for that key.\nvoid TestResult::RecordProperty(const TestProperty& test_property) {\n  if (!ValidateTestProperty(test_property)) {\n    return;\n  }\n  internal::MutexLock lock(&test_properites_mutex_);\n  const std::vector<TestProperty>::iterator property_with_matching_key =\n      std::find_if(test_properties_.begin(), test_properties_.end(),\n                   internal::TestPropertyKeyIs(test_property.key()));\n  if (property_with_matching_key == test_properties_.end()) {\n    test_properties_.push_back(test_property);\n    return;\n  }\n  property_with_matching_key->SetValue(test_property.value());\n}\n\n// Adds a failure if the key is a reserved attribute of Google Test\n// testcase tags.  Returns true if the property is valid.\nbool TestResult::ValidateTestProperty(const TestProperty& test_property) {\n  internal::String key(test_property.key());\n  if (key == \"name\" || key == \"status\" || key == \"time\" || key == \"classname\") {\n    ADD_FAILURE()\n        << \"Reserved key used in RecordProperty(): \"\n        << key\n        << \" ('name', 'status', 'time', and 'classname' are reserved by \"\n        << GTEST_NAME_ << \")\";\n    return false;\n  }\n  return true;\n}\n\n// Clears the object.\nvoid TestResult::Clear() {\n  test_part_results_.clear();\n  test_properties_.clear();\n  death_test_count_ = 0;\n  elapsed_time_ = 0;\n}\n\n// Returns true iff the test failed.\nbool TestResult::Failed() const {\n  for (int i = 0; i < total_part_count(); ++i) {\n    if (GetTestPartResult(i).failed())\n      return true;\n  }\n  return false;\n}\n\n// Returns true iff the test part fatally failed.\nstatic bool TestPartFatallyFailed(const TestPartResult& result) {\n  return result.fatally_failed();\n}\n\n// Returns true iff the test fatally failed.\nbool TestResult::HasFatalFailure() const {\n  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;\n}\n\n// Returns true iff the test part non-fatally failed.\nstatic bool TestPartNonfatallyFailed(const TestPartResult& result) {\n  return result.nonfatally_failed();\n}\n\n// Returns true iff the test has a non-fatal failure.\nbool TestResult::HasNonfatalFailure() const {\n  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;\n}\n\n// Gets the number of all test parts.  This is the sum of the number\n// of successful test parts and the number of failed test parts.\nint TestResult::total_part_count() const {\n  return static_cast<int>(test_part_results_.size());\n}\n\n// Returns the number of the test properties.\nint TestResult::test_property_count() const {\n  return static_cast<int>(test_properties_.size());\n}\n\n// class Test\n\n// Creates a Test object.\n\n// The c'tor saves the values of all Google Test flags.\nTest::Test()\n    : gtest_flag_saver_(new internal::GTestFlagSaver) {\n}\n\n// The d'tor restores the values of all Google Test flags.\nTest::~Test() {\n  delete gtest_flag_saver_;\n}\n\n// Sets up the test fixture.\n//\n// A sub-class may override this.\nvoid Test::SetUp() {\n}\n\n// Tears down the test fixture.\n//\n// A sub-class may override this.\nvoid Test::TearDown() {\n}\n\n// Allows user supplied key value pairs to be recorded for later output.\nvoid Test::RecordProperty(const char* key, const char* value) {\n  UnitTest::GetInstance()->RecordPropertyForCurrentTest(key, value);\n}\n\n// Allows user supplied key value pairs to be recorded for later output.\nvoid Test::RecordProperty(const char* key, int value) {\n  Message value_message;\n  value_message << value;\n  RecordProperty(key, value_message.GetString().c_str());\n}\n\nnamespace internal {\n\nvoid ReportFailureInUnknownLocation(TestPartResult::Type result_type,\n                                    const String& message) {\n  // This function is a friend of UnitTest and as such has access to\n  // AddTestPartResult.\n  UnitTest::GetInstance()->AddTestPartResult(\n      result_type,\n      NULL,  // No info about the source file where the exception occurred.\n      -1,    // We have no info on which line caused the exception.\n      message,\n      String());  // No stack trace, either.\n}\n\n}  // namespace internal\n\n#if GTEST_OS_WINDOWS\n// We are on Windows.\n\n// Adds an \"exception thrown\" fatal failure to the current test.\nstatic void AddExceptionThrownFailure(DWORD exception_code,\n                                      const char* location) {\n  Message message;\n  message << \"Exception thrown with code 0x\" << std::setbase(16) <<\n    exception_code << std::setbase(10) << \" in \" << location << \".\";\n\n  internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,\n                                           message.GetString());\n}\n\n#endif  // GTEST_OS_WINDOWS\n\n// Google Test requires all tests in the same test case to use the same test\n// fixture class.  This function checks if the current test has the\n// same fixture class as the first test in the current test case.  If\n// yes, it returns true; otherwise it generates a Google Test failure and\n// returns false.\nbool Test::HasSameFixtureClass() {\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  const TestCase* const test_case = impl->current_test_case();\n\n  // Info about the first test in the current test case.\n  const internal::TestInfoImpl* const first_test_info =\n      test_case->test_info_list()[0]->impl();\n  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id();\n  const char* const first_test_name = first_test_info->name();\n\n  // Info about the current test.\n  const internal::TestInfoImpl* const this_test_info =\n      impl->current_test_info()->impl();\n  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id();\n  const char* const this_test_name = this_test_info->name();\n\n  if (this_fixture_id != first_fixture_id) {\n    // Is the first test defined using TEST?\n    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();\n    // Is this test defined using TEST?\n    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();\n\n    if (first_is_TEST || this_is_TEST) {\n      // The user mixed TEST and TEST_F in this test case - we'll tell\n      // him/her how to fix it.\n\n      // Gets the name of the TEST and the name of the TEST_F.  Note\n      // that first_is_TEST and this_is_TEST cannot both be true, as\n      // the fixture IDs are different for the two tests.\n      const char* const TEST_name =\n          first_is_TEST ? first_test_name : this_test_name;\n      const char* const TEST_F_name =\n          first_is_TEST ? this_test_name : first_test_name;\n\n      ADD_FAILURE()\n          << \"All tests in the same test case must use the same test fixture\\n\"\n          << \"class, so mixing TEST_F and TEST in the same test case is\\n\"\n          << \"illegal.  In test case \" << this_test_info->test_case_name()\n          << \",\\n\"\n          << \"test \" << TEST_F_name << \" is defined using TEST_F but\\n\"\n          << \"test \" << TEST_name << \" is defined using TEST.  You probably\\n\"\n          << \"want to change the TEST to TEST_F or move it to another test\\n\"\n          << \"case.\";\n    } else {\n      // The user defined two fixture classes with the same name in\n      // two namespaces - we'll tell him/her how to fix it.\n      ADD_FAILURE()\n          << \"All tests in the same test case must use the same test fixture\\n\"\n          << \"class.  However, in test case \"\n          << this_test_info->test_case_name() << \",\\n\"\n          << \"you defined test \" << first_test_name\n          << \" and test \" << this_test_name << \"\\n\"\n          << \"using two different test fixture classes.  This can happen if\\n\"\n          << \"the two classes are from different namespaces or translation\\n\"\n          << \"units and have the same name.  You should probably rename one\\n\"\n          << \"of the classes to put the tests into different test cases.\";\n    }\n    return false;\n  }\n\n  return true;\n}\n\n// Runs the test and updates the test result.\nvoid Test::Run() {\n  if (!HasSameFixtureClass()) return;\n\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n#if GTEST_HAS_SEH\n  // Catch SEH-style exceptions.\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  __try {\n    SetUp();\n  } __except(internal::UnitTestOptions::GTestShouldProcessSEH(\n      GetExceptionCode())) {\n    AddExceptionThrownFailure(GetExceptionCode(), \"SetUp()\");\n  }\n\n  // We will run the test only if SetUp() had no fatal failure.\n  if (!HasFatalFailure()) {\n    impl->os_stack_trace_getter()->UponLeavingGTest();\n    __try {\n      TestBody();\n    } __except(internal::UnitTestOptions::GTestShouldProcessSEH(\n        GetExceptionCode())) {\n      AddExceptionThrownFailure(GetExceptionCode(), \"the test body\");\n    }\n  }\n\n  // However, we want to clean up as much as possible.  Hence we will\n  // always call TearDown(), even if SetUp() or the test body has\n  // failed.\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  __try {\n    TearDown();\n  } __except(internal::UnitTestOptions::GTestShouldProcessSEH(\n      GetExceptionCode())) {\n    AddExceptionThrownFailure(GetExceptionCode(), \"TearDown()\");\n  }\n\n#else  // We are on a compiler or platform that doesn't support SEH.\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  SetUp();\n\n  // We will run the test only if SetUp() was successful.\n  if (!HasFatalFailure()) {\n    impl->os_stack_trace_getter()->UponLeavingGTest();\n    TestBody();\n  }\n\n  // However, we want to clean up as much as possible.  Hence we will\n  // always call TearDown(), even if SetUp() or the test body has\n  // failed.\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  TearDown();\n#endif  // GTEST_HAS_SEH\n}\n\n\n// Returns true iff the current test has a fatal failure.\nbool Test::HasFatalFailure() {\n  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();\n}\n\n// Returns true iff the current test has a non-fatal failure.\nbool Test::HasNonfatalFailure() {\n  return internal::GetUnitTestImpl()->current_test_result()->\n      HasNonfatalFailure();\n}\n\n// class TestInfo\n\n// Constructs a TestInfo object. It assumes ownership of the test factory\n// object via impl_.\nTestInfo::TestInfo(const char* a_test_case_name,\n                   const char* a_name,\n                   const char* a_test_case_comment,\n                   const char* a_comment,\n                   internal::TypeId fixture_class_id,\n                   internal::TestFactoryBase* factory) {\n  impl_ = new internal::TestInfoImpl(this, a_test_case_name, a_name,\n                                     a_test_case_comment, a_comment,\n                                     fixture_class_id, factory);\n}\n\n// Destructs a TestInfo object.\nTestInfo::~TestInfo() {\n  delete impl_;\n}\n\nnamespace internal {\n\n// Creates a new TestInfo object and registers it with Google Test;\n// returns the created object.\n//\n// Arguments:\n//\n//   test_case_name:   name of the test case\n//   name:             name of the test\n//   test_case_comment: a comment on the test case that will be included in\n//                      the test output\n//   comment:          a comment on the test that will be included in the\n//                     test output\n//   fixture_class_id: ID of the test fixture class\n//   set_up_tc:        pointer to the function that sets up the test case\n//   tear_down_tc:     pointer to the function that tears down the test case\n//   factory:          pointer to the factory that creates a test object.\n//                     The newly created TestInfo instance will assume\n//                     ownership of the factory object.\nTestInfo* MakeAndRegisterTestInfo(\n    const char* test_case_name, const char* name,\n    const char* test_case_comment, const char* comment,\n    TypeId fixture_class_id,\n    SetUpTestCaseFunc set_up_tc,\n    TearDownTestCaseFunc tear_down_tc,\n    TestFactoryBase* factory) {\n  TestInfo* const test_info =\n      new TestInfo(test_case_name, name, test_case_comment, comment,\n                   fixture_class_id, factory);\n  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);\n  return test_info;\n}\n\n#if GTEST_HAS_PARAM_TEST\nvoid ReportInvalidTestCaseType(const char* test_case_name,\n                               const char* file, int line) {\n  Message errors;\n  errors\n      << \"Attempted redefinition of test case \" << test_case_name << \".\\n\"\n      << \"All tests in the same test case must use the same test fixture\\n\"\n      << \"class.  However, in test case \" << test_case_name << \", you tried\\n\"\n      << \"to define a test using a fixture class different from the one\\n\"\n      << \"used earlier. This can happen if the two fixture classes are\\n\"\n      << \"from different namespaces and have the same name. You should\\n\"\n      << \"probably rename one of the classes to put the tests into different\\n\"\n      << \"test cases.\";\n\n  fprintf(stderr, \"%s %s\", FormatFileLocation(file, line).c_str(),\n          errors.GetString().c_str());\n}\n#endif  // GTEST_HAS_PARAM_TEST\n\n}  // namespace internal\n\n// Returns the test case name.\nconst char* TestInfo::test_case_name() const {\n  return impl_->test_case_name();\n}\n\n// Returns the test name.\nconst char* TestInfo::name() const {\n  return impl_->name();\n}\n\n// Returns the test case comment.\nconst char* TestInfo::test_case_comment() const {\n  return impl_->test_case_comment();\n}\n\n// Returns the test comment.\nconst char* TestInfo::comment() const {\n  return impl_->comment();\n}\n\n// Returns true if this test should run.\nbool TestInfo::should_run() const { return impl_->should_run(); }\n\n// Returns true if this test matches the user-specified filter.\nbool TestInfo::matches_filter() const { return impl_->matches_filter(); }\n\n// Returns the result of the test.\nconst TestResult* TestInfo::result() const { return impl_->result(); }\n\n// Increments the number of death tests encountered in this test so\n// far.\nint TestInfo::increment_death_test_count() {\n  return impl_->result()->increment_death_test_count();\n}\n\nnamespace {\n\n// A predicate that checks the test name of a TestInfo against a known\n// value.\n//\n// This is used for implementation of the TestCase class only.  We put\n// it in the anonymous namespace to prevent polluting the outer\n// namespace.\n//\n// TestNameIs is copyable.\nclass TestNameIs {\n public:\n  // Constructor.\n  //\n  // TestNameIs has NO default constructor.\n  explicit TestNameIs(const char* name)\n      : name_(name) {}\n\n  // Returns true iff the test name of test_info matches name_.\n  bool operator()(const TestInfo * test_info) const {\n    return test_info && internal::String(test_info->name()).Compare(name_) == 0;\n  }\n\n private:\n  internal::String name_;\n};\n\n}  // namespace\n\nnamespace internal {\n\n// This method expands all parameterized tests registered with macros TEST_P\n// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.\n// This will be done just once during the program runtime.\nvoid UnitTestImpl::RegisterParameterizedTests() {\n#if GTEST_HAS_PARAM_TEST\n  if (!parameterized_tests_registered_) {\n    parameterized_test_registry_.RegisterTests();\n    parameterized_tests_registered_ = true;\n  }\n#endif\n}\n\n// Creates the test object, runs it, records its result, and then\n// deletes it.\nvoid TestInfoImpl::Run() {\n  if (!should_run_) return;\n\n  // Tells UnitTest where to store test result.\n  UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  impl->set_current_test_info(parent_);\n\n  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();\n\n  // Notifies the unit test event listeners that a test is about to start.\n  repeater->OnTestStart(*parent_);\n\n  const TimeInMillis start = GetTimeInMillis();\n\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n#if GTEST_HAS_SEH\n  // Catch SEH-style exceptions.\n  Test* test = NULL;\n\n  __try {\n    // Creates the test object.\n    test = factory_->CreateTest();\n  } __except(internal::UnitTestOptions::GTestShouldProcessSEH(\n      GetExceptionCode())) {\n    AddExceptionThrownFailure(GetExceptionCode(),\n                              \"the test fixture's constructor\");\n    return;\n  }\n#else  // We are on a compiler or platform that doesn't support SEH.\n\n  // TODO(wan): If test->Run() throws, test won't be deleted.  This is\n  // not a problem now as we don't use exceptions.  If we were to\n  // enable exceptions, we should revise the following to be\n  // exception-safe.\n\n  // Creates the test object.\n  Test* test = factory_->CreateTest();\n#endif  // GTEST_HAS_SEH\n\n  // Runs the test only if the constructor of the test fixture didn't\n  // generate a fatal failure.\n  if (!Test::HasFatalFailure()) {\n    test->Run();\n  }\n\n  // Deletes the test object.\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  delete test;\n  test = NULL;\n\n  result_.set_elapsed_time(GetTimeInMillis() - start);\n\n  // Notifies the unit test event listener that a test has just finished.\n  repeater->OnTestEnd(*parent_);\n\n  // Tells UnitTest to stop associating assertion results to this\n  // test.\n  impl->set_current_test_info(NULL);\n}\n\n}  // namespace internal\n\n// class TestCase\n\n// Gets the number of successful tests in this test case.\nint TestCase::successful_test_count() const {\n  return CountIf(test_info_list_, TestPassed);\n}\n\n// Gets the number of failed tests in this test case.\nint TestCase::failed_test_count() const {\n  return CountIf(test_info_list_, TestFailed);\n}\n\nint TestCase::disabled_test_count() const {\n  return CountIf(test_info_list_, TestDisabled);\n}\n\n// Get the number of tests in this test case that should run.\nint TestCase::test_to_run_count() const {\n  return CountIf(test_info_list_, ShouldRunTest);\n}\n\n// Gets the number of all tests.\nint TestCase::total_test_count() const {\n  return static_cast<int>(test_info_list_.size());\n}\n\n// Creates a TestCase with the given name.\n//\n// Arguments:\n//\n//   name:         name of the test case\n//   set_up_tc:    pointer to the function that sets up the test case\n//   tear_down_tc: pointer to the function that tears down the test case\nTestCase::TestCase(const char* a_name, const char* a_comment,\n                   Test::SetUpTestCaseFunc set_up_tc,\n                   Test::TearDownTestCaseFunc tear_down_tc)\n    : name_(a_name),\n      comment_(a_comment),\n      set_up_tc_(set_up_tc),\n      tear_down_tc_(tear_down_tc),\n      should_run_(false),\n      elapsed_time_(0) {\n}\n\n// Destructor of TestCase.\nTestCase::~TestCase() {\n  // Deletes every Test in the collection.\n  ForEach(test_info_list_, internal::Delete<TestInfo>);\n}\n\n// Returns the i-th test among all the tests. i can range from 0 to\n// total_test_count() - 1. If i is not in that range, returns NULL.\nconst TestInfo* TestCase::GetTestInfo(int i) const {\n  const int index = GetElementOr(test_indices_, i, -1);\n  return index < 0 ? NULL : test_info_list_[index];\n}\n\n// Returns the i-th test among all the tests. i can range from 0 to\n// total_test_count() - 1. If i is not in that range, returns NULL.\nTestInfo* TestCase::GetMutableTestInfo(int i) {\n  const int index = GetElementOr(test_indices_, i, -1);\n  return index < 0 ? NULL : test_info_list_[index];\n}\n\n// Adds a test to this test case.  Will delete the test upon\n// destruction of the TestCase object.\nvoid TestCase::AddTestInfo(TestInfo * test_info) {\n  test_info_list_.push_back(test_info);\n  test_indices_.push_back(static_cast<int>(test_indices_.size()));\n}\n\n// Runs every test in this TestCase.\nvoid TestCase::Run() {\n  if (!should_run_) return;\n\n  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();\n  impl->set_current_test_case(this);\n\n  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();\n\n  repeater->OnTestCaseStart(*this);\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  set_up_tc_();\n\n  const internal::TimeInMillis start = internal::GetTimeInMillis();\n  for (int i = 0; i < total_test_count(); i++) {\n    GetMutableTestInfo(i)->impl()->Run();\n  }\n  elapsed_time_ = internal::GetTimeInMillis() - start;\n\n  impl->os_stack_trace_getter()->UponLeavingGTest();\n  tear_down_tc_();\n  repeater->OnTestCaseEnd(*this);\n  impl->set_current_test_case(NULL);\n}\n\n// Clears the results of all tests in this test case.\nvoid TestCase::ClearResult() {\n  ForEach(test_info_list_, internal::TestInfoImpl::ClearTestResult);\n}\n\n// Returns true iff test passed.\nbool TestCase::TestPassed(const TestInfo * test_info) {\n  const internal::TestInfoImpl* const impl = test_info->impl();\n  return impl->should_run() && impl->result()->Passed();\n}\n\n// Returns true iff test failed.\nbool TestCase::TestFailed(const TestInfo * test_info) {\n  const internal::TestInfoImpl* const impl = test_info->impl();\n  return impl->should_run() && impl->result()->Failed();\n}\n\n// Returns true iff test is disabled.\nbool TestCase::TestDisabled(const TestInfo * test_info) {\n  return test_info->impl()->is_disabled();\n}\n\n// Returns true if the given test should run.\nbool TestCase::ShouldRunTest(const TestInfo *test_info) {\n  return test_info->impl()->should_run();\n}\n\n// Shuffles the tests in this test case.\nvoid TestCase::ShuffleTests(internal::Random* random) {\n  Shuffle(random, &test_indices_);\n}\n\n// Restores the test order to before the first shuffle.\nvoid TestCase::UnshuffleTests() {\n  for (size_t i = 0; i < test_indices_.size(); i++) {\n    test_indices_[i] = static_cast<int>(i);\n  }\n}\n\n// Formats a countable noun.  Depending on its quantity, either the\n// singular form or the plural form is used. e.g.\n//\n// FormatCountableNoun(1, \"formula\", \"formuli\") returns \"1 formula\".\n// FormatCountableNoun(5, \"book\", \"books\") returns \"5 books\".\nstatic internal::String FormatCountableNoun(int count,\n                                            const char * singular_form,\n                                            const char * plural_form) {\n  return internal::String::Format(\"%d %s\", count,\n                                  count == 1 ? singular_form : plural_form);\n}\n\n// Formats the count of tests.\nstatic internal::String FormatTestCount(int test_count) {\n  return FormatCountableNoun(test_count, \"test\", \"tests\");\n}\n\n// Formats the count of test cases.\nstatic internal::String FormatTestCaseCount(int test_case_count) {\n  return FormatCountableNoun(test_case_count, \"test case\", \"test cases\");\n}\n\n// Converts a TestPartResult::Type enum to human-friendly string\n// representation.  Both kNonFatalFailure and kFatalFailure are translated\n// to \"Failure\", as the user usually doesn't care about the difference\n// between the two when viewing the test result.\nstatic const char * TestPartResultTypeToString(TestPartResult::Type type) {\n  switch (type) {\n    case TestPartResult::kSuccess:\n      return \"Success\";\n\n    case TestPartResult::kNonFatalFailure:\n    case TestPartResult::kFatalFailure:\n#ifdef _MSC_VER\n      return \"error: \";\n#else\n      return \"Failure\\n\";\n#endif\n  }\n\n  return \"Unknown result type\";\n}\n\n// Prints a TestPartResult to a String.\nstatic internal::String PrintTestPartResultToString(\n    const TestPartResult& test_part_result) {\n  return (Message()\n          << internal::FormatFileLocation(test_part_result.file_name(),\n                                          test_part_result.line_number())\n          << \" \" << TestPartResultTypeToString(test_part_result.type())\n          << test_part_result.message()).GetString();\n}\n\n// Prints a TestPartResult.\nstatic void PrintTestPartResult(const TestPartResult& test_part_result) {\n  const internal::String& result =\n      PrintTestPartResultToString(test_part_result);\n  printf(\"%s\\n\", result.c_str());\n  fflush(stdout);\n  // If the test program runs in Visual Studio or a debugger, the\n  // following statements add the test part result message to the Output\n  // window such that the user can double-click on it to jump to the\n  // corresponding source code location; otherwise they do nothing.\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n  // We don't call OutputDebugString*() on Windows Mobile, as printing\n  // to stdout is done by OutputDebugString() there already - we don't\n  // want the same message printed twice.\n  ::OutputDebugStringA(result.c_str());\n  ::OutputDebugStringA(\"\\n\");\n#endif\n}\n\n// class PrettyUnitTestResultPrinter\n\nnamespace internal {\n\nenum GTestColor {\n  COLOR_DEFAULT,\n  COLOR_RED,\n  COLOR_GREEN,\n  COLOR_YELLOW\n};\n\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n\n// Returns the character attribute for the given color.\nWORD GetColorAttribute(GTestColor color) {\n  switch (color) {\n    case COLOR_RED:    return FOREGROUND_RED;\n    case COLOR_GREEN:  return FOREGROUND_GREEN;\n    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;\n    default:           return 0;\n  }\n}\n\n#else\n\n// Returns the ANSI color code for the given color.  COLOR_DEFAULT is\n// an invalid input.\nconst char* GetAnsiColorCode(GTestColor color) {\n  switch (color) {\n    case COLOR_RED:     return \"1\";\n    case COLOR_GREEN:   return \"2\";\n    case COLOR_YELLOW:  return \"3\";\n    default:            return NULL;\n  };\n}\n\n#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n\n// Returns true iff Google Test should use colors in the output.\nbool ShouldUseColor(bool stdout_is_tty) {\n  const char* const gtest_color = GTEST_FLAG(color).c_str();\n\n  if (String::CaseInsensitiveCStringEquals(gtest_color, \"auto\")) {\n#if GTEST_OS_WINDOWS\n    // On Windows the TERM variable is usually not set, but the\n    // console there does support colors.\n    return stdout_is_tty;\n#else\n    // On non-Windows platforms, we rely on the TERM variable.\n    const char* const term = posix::GetEnv(\"TERM\");\n    const bool term_supports_color =\n        String::CStringEquals(term, \"xterm\") ||\n        String::CStringEquals(term, \"xterm-color\") ||\n        String::CStringEquals(term, \"xterm-256color\") ||\n        String::CStringEquals(term, \"linux\") ||\n        String::CStringEquals(term, \"cygwin\");\n    return stdout_is_tty && term_supports_color;\n#endif  // GTEST_OS_WINDOWS\n  }\n\n  return String::CaseInsensitiveCStringEquals(gtest_color, \"yes\") ||\n      String::CaseInsensitiveCStringEquals(gtest_color, \"true\") ||\n      String::CaseInsensitiveCStringEquals(gtest_color, \"t\") ||\n      String::CStringEquals(gtest_color, \"1\");\n  // We take \"yes\", \"true\", \"t\", and \"1\" as meaning \"yes\".  If the\n  // value is neither one of these nor \"auto\", we treat it as \"no\" to\n  // be conservative.\n}\n\n// Helpers for printing colored strings to stdout. Note that on Windows, we\n// cannot simply emit special characters and have the terminal change colors.\n// This routine must actually emit the characters rather than return a string\n// that would be colored when printed, as can be done on Linux.\nvoid ColoredPrintf(GTestColor color, const char* fmt, ...) {\n  va_list args;\n  va_start(args, fmt);\n\n#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS\n  const bool use_color = false;\n#else\n  static const bool in_color_mode =\n      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);\n  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);\n#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS\n  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.\n\n  if (!use_color) {\n    vprintf(fmt, args);\n    va_end(args);\n    return;\n  }\n\n#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);\n\n  // Gets the current text color.\n  CONSOLE_SCREEN_BUFFER_INFO buffer_info;\n  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);\n  const WORD old_color_attrs = buffer_info.wAttributes;\n\n  // We need to flush the stream buffers into the console before each\n  // SetConsoleTextAttribute call lest it affect the text that is already\n  // printed but has not yet reached the console.\n  fflush(stdout);\n  SetConsoleTextAttribute(stdout_handle,\n                          GetColorAttribute(color) | FOREGROUND_INTENSITY);\n  vprintf(fmt, args);\n\n  fflush(stdout);\n  // Restores the text color.\n  SetConsoleTextAttribute(stdout_handle, old_color_attrs);\n#else\n  printf(\"\\033[0;3%sm\", GetAnsiColorCode(color));\n  vprintf(fmt, args);\n  printf(\"\\033[m\");  // Resets the terminal to default.\n#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE\n  va_end(args);\n}\n\n// This class implements the TestEventListener interface.\n//\n// Class PrettyUnitTestResultPrinter is copyable.\nclass PrettyUnitTestResultPrinter : public TestEventListener {\n public:\n  PrettyUnitTestResultPrinter() {}\n  static void PrintTestName(const char * test_case, const char * test) {\n    printf(\"%s.%s\", test_case, test);\n  }\n\n  // The following methods override what's in the TestEventListener class.\n  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestCaseStart(const TestCase& test_case);\n  virtual void OnTestStart(const TestInfo& test_info);\n  virtual void OnTestPartResult(const TestPartResult& result);\n  virtual void OnTestEnd(const TestInfo& test_info);\n  virtual void OnTestCaseEnd(const TestCase& test_case);\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}\n  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);\n  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}\n\n private:\n  static void PrintFailedTests(const UnitTest& unit_test);\n\n  internal::String test_case_name_;\n};\n\n  // Fired before each iteration of tests starts.\nvoid PrettyUnitTestResultPrinter::OnTestIterationStart(\n    const UnitTest& unit_test, int iteration) {\n  if (GTEST_FLAG(repeat) != 1)\n    printf(\"\\nRepeating all tests (iteration %d) . . .\\n\\n\", iteration + 1);\n\n  const char* const filter = GTEST_FLAG(filter).c_str();\n\n  // Prints the filter if it's not *.  This reminds the user that some\n  // tests may be skipped.\n  if (!internal::String::CStringEquals(filter, kUniversalFilter)) {\n    ColoredPrintf(COLOR_YELLOW,\n                  \"Note: %s filter = %s\\n\", GTEST_NAME_, filter);\n  }\n\n  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {\n    ColoredPrintf(COLOR_YELLOW,\n                  \"Note: This is test shard %s of %s.\\n\",\n                  internal::posix::GetEnv(kTestShardIndex),\n                  internal::posix::GetEnv(kTestTotalShards));\n  }\n\n  if (GTEST_FLAG(shuffle)) {\n    ColoredPrintf(COLOR_YELLOW,\n                  \"Note: Randomizing tests' orders with a seed of %d .\\n\",\n                  unit_test.random_seed());\n  }\n\n  ColoredPrintf(COLOR_GREEN,  \"[==========] \");\n  printf(\"Running %s from %s.\\n\",\n         FormatTestCount(unit_test.test_to_run_count()).c_str(),\n         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(\n    const UnitTest& /*unit_test*/) {\n  ColoredPrintf(COLOR_GREEN,  \"[----------] \");\n  printf(\"Global test environment set-up.\\n\");\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {\n  test_case_name_ = test_case.name();\n  const internal::String counts =\n      FormatCountableNoun(test_case.test_to_run_count(), \"test\", \"tests\");\n  ColoredPrintf(COLOR_GREEN, \"[----------] \");\n  printf(\"%s from %s\", counts.c_str(), test_case_name_.c_str());\n  if (test_case.comment()[0] == '\\0') {\n    printf(\"\\n\");\n  } else {\n    printf(\", where %s\\n\", test_case.comment());\n  }\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {\n  ColoredPrintf(COLOR_GREEN,  \"[ RUN      ] \");\n  PrintTestName(test_case_name_.c_str(), test_info.name());\n  if (test_info.comment()[0] == '\\0') {\n    printf(\"\\n\");\n  } else {\n    printf(\", where %s\\n\", test_info.comment());\n  }\n  fflush(stdout);\n}\n\n// Called after an assertion failure.\nvoid PrettyUnitTestResultPrinter::OnTestPartResult(\n    const TestPartResult& result) {\n  // If the test part succeeded, we don't need to do anything.\n  if (result.type() == TestPartResult::kSuccess)\n    return;\n\n  // Print failure message from the assertion (e.g. expected this and got that).\n  PrintTestPartResult(result);\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {\n  if (test_info.result()->Passed()) {\n    ColoredPrintf(COLOR_GREEN, \"[       OK ] \");\n  } else {\n    ColoredPrintf(COLOR_RED, \"[  FAILED  ] \");\n  }\n  PrintTestName(test_case_name_.c_str(), test_info.name());\n  if (GTEST_FLAG(print_time)) {\n    printf(\" (%s ms)\\n\", internal::StreamableToString(\n           test_info.result()->elapsed_time()).c_str());\n  } else {\n    printf(\"\\n\");\n  }\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {\n  if (!GTEST_FLAG(print_time)) return;\n\n  test_case_name_ = test_case.name();\n  const internal::String counts =\n      FormatCountableNoun(test_case.test_to_run_count(), \"test\", \"tests\");\n  ColoredPrintf(COLOR_GREEN, \"[----------] \");\n  printf(\"%s from %s (%s ms total)\\n\\n\",\n         counts.c_str(), test_case_name_.c_str(),\n         internal::StreamableToString(test_case.elapsed_time()).c_str());\n  fflush(stdout);\n}\n\nvoid PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(\n    const UnitTest& /*unit_test*/) {\n  ColoredPrintf(COLOR_GREEN,  \"[----------] \");\n  printf(\"Global test environment tear-down\\n\");\n  fflush(stdout);\n}\n\n// Internal helper for printing the list of failed tests.\nvoid PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {\n  const int failed_test_count = unit_test.failed_test_count();\n  if (failed_test_count == 0) {\n    return;\n  }\n\n  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {\n    const TestCase& test_case = *unit_test.GetTestCase(i);\n    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {\n      continue;\n    }\n    for (int j = 0; j < test_case.total_test_count(); ++j) {\n      const TestInfo& test_info = *test_case.GetTestInfo(j);\n      if (!test_info.should_run() || test_info.result()->Passed()) {\n        continue;\n      }\n      ColoredPrintf(COLOR_RED, \"[  FAILED  ] \");\n      printf(\"%s.%s\", test_case.name(), test_info.name());\n      if (test_case.comment()[0] != '\\0' ||\n          test_info.comment()[0] != '\\0') {\n        printf(\", where %s\", test_case.comment());\n        if (test_case.comment()[0] != '\\0' &&\n            test_info.comment()[0] != '\\0') {\n          printf(\" and \");\n        }\n      }\n      printf(\"%s\\n\", test_info.comment());\n    }\n  }\n}\n\n void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,\n                                                      int /*iteration*/) {\n  ColoredPrintf(COLOR_GREEN,  \"[==========] \");\n  printf(\"%s from %s ran.\",\n         FormatTestCount(unit_test.test_to_run_count()).c_str(),\n         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());\n  if (GTEST_FLAG(print_time)) {\n    printf(\" (%s ms total)\",\n           internal::StreamableToString(unit_test.elapsed_time()).c_str());\n  }\n  printf(\"\\n\");\n  ColoredPrintf(COLOR_GREEN,  \"[  PASSED  ] \");\n  printf(\"%s.\\n\", FormatTestCount(unit_test.successful_test_count()).c_str());\n\n  int num_failures = unit_test.failed_test_count();\n  if (!unit_test.Passed()) {\n    const int failed_test_count = unit_test.failed_test_count();\n    ColoredPrintf(COLOR_RED,  \"[  FAILED  ] \");\n    printf(\"%s, listed below:\\n\", FormatTestCount(failed_test_count).c_str());\n    PrintFailedTests(unit_test);\n    printf(\"\\n%2d FAILED %s\\n\", num_failures,\n                        num_failures == 1 ? \"TEST\" : \"TESTS\");\n  }\n\n  int num_disabled = unit_test.disabled_test_count();\n  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {\n    if (!num_failures) {\n      printf(\"\\n\");  // Add a spacer if no FAILURE banner is displayed.\n    }\n    ColoredPrintf(COLOR_YELLOW,\n                  \"  YOU HAVE %d DISABLED %s\\n\\n\",\n                  num_disabled,\n                  num_disabled == 1 ? \"TEST\" : \"TESTS\");\n  }\n  // Ensure that Google Test output is printed before, e.g., heapchecker output.\n  fflush(stdout);\n}\n\n// End PrettyUnitTestResultPrinter\n\n// class TestEventRepeater\n//\n// This class forwards events to other event listeners.\nclass TestEventRepeater : public TestEventListener {\n public:\n  TestEventRepeater() : forwarding_enabled_(true) {}\n  virtual ~TestEventRepeater();\n  void Append(TestEventListener *listener);\n  TestEventListener* Release(TestEventListener* listener);\n\n  // Controls whether events will be forwarded to listeners_. Set to false\n  // in death test child processes.\n  bool forwarding_enabled() const { return forwarding_enabled_; }\n  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }\n\n  virtual void OnTestProgramStart(const UnitTest& unit_test);\n  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);\n  virtual void OnTestCaseStart(const TestCase& test_case);\n  virtual void OnTestStart(const TestInfo& test_info);\n  virtual void OnTestPartResult(const TestPartResult& result);\n  virtual void OnTestEnd(const TestInfo& test_info);\n  virtual void OnTestCaseEnd(const TestCase& test_case);\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);\n  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);\n  virtual void OnTestProgramEnd(const UnitTest& unit_test);\n\n private:\n  // Controls whether events will be forwarded to listeners_. Set to false\n  // in death test child processes.\n  bool forwarding_enabled_;\n  // The list of listeners that receive events.\n  std::vector<TestEventListener*> listeners_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);\n};\n\nTestEventRepeater::~TestEventRepeater() {\n  ForEach(listeners_, Delete<TestEventListener>);\n}\n\nvoid TestEventRepeater::Append(TestEventListener *listener) {\n  listeners_.push_back(listener);\n}\n\n// TODO(vladl@google.com): Factor the search functionality into Vector::Find.\nTestEventListener* TestEventRepeater::Release(TestEventListener *listener) {\n  for (size_t i = 0; i < listeners_.size(); ++i) {\n    if (listeners_[i] == listener) {\n      listeners_.erase(listeners_.begin() + i);\n      return listener;\n    }\n  }\n\n  return NULL;\n}\n\n// Since most methods are very similar, use macros to reduce boilerplate.\n// This defines a member that forwards the call to all listeners.\n#define GTEST_REPEATER_METHOD_(Name, Type) \\\nvoid TestEventRepeater::Name(const Type& parameter) { \\\n  if (forwarding_enabled_) { \\\n    for (size_t i = 0; i < listeners_.size(); i++) { \\\n      listeners_[i]->Name(parameter); \\\n    } \\\n  } \\\n}\n// This defines a member that forwards the call to all listeners in reverse\n// order.\n#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \\\nvoid TestEventRepeater::Name(const Type& parameter) { \\\n  if (forwarding_enabled_) { \\\n    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \\\n      listeners_[i]->Name(parameter); \\\n    } \\\n  } \\\n}\n\nGTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)\nGTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)\nGTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)\nGTEST_REPEATER_METHOD_(OnTestStart, TestInfo)\nGTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)\nGTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)\nGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)\nGTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)\nGTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)\nGTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)\nGTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)\n\n#undef GTEST_REPEATER_METHOD_\n#undef GTEST_REVERSE_REPEATER_METHOD_\n\nvoid TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,\n                                             int iteration) {\n  if (forwarding_enabled_) {\n    for (size_t i = 0; i < listeners_.size(); i++) {\n      listeners_[i]->OnTestIterationStart(unit_test, iteration);\n    }\n  }\n}\n\nvoid TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,\n                                           int iteration) {\n  if (forwarding_enabled_) {\n    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {\n      listeners_[i]->OnTestIterationEnd(unit_test, iteration);\n    }\n  }\n}\n\n// End TestEventRepeater\n\n// This class generates an XML output file.\nclass XmlUnitTestResultPrinter : public EmptyTestEventListener {\n public:\n  explicit XmlUnitTestResultPrinter(const char* output_file);\n\n  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);\n\n private:\n  // Is c a whitespace character that is normalized to a space character\n  // when it appears in an XML attribute value?\n  static bool IsNormalizableWhitespace(char c) {\n    return c == 0x9 || c == 0xA || c == 0xD;\n  }\n\n  // May c appear in a well-formed XML document?\n  static bool IsValidXmlCharacter(char c) {\n    return IsNormalizableWhitespace(c) || c >= 0x20;\n  }\n\n  // Returns an XML-escaped copy of the input string str.  If\n  // is_attribute is true, the text is meant to appear as an attribute\n  // value, and normalizable whitespace is preserved by replacing it\n  // with character references.\n  static String EscapeXml(const char* str, bool is_attribute);\n\n  // Returns the given string with all characters invalid in XML removed.\n  static String RemoveInvalidXmlCharacters(const char* str);\n\n  // Convenience wrapper around EscapeXml when str is an attribute value.\n  static String EscapeXmlAttribute(const char* str) {\n    return EscapeXml(str, true);\n  }\n\n  // Convenience wrapper around EscapeXml when str is not an attribute value.\n  static String EscapeXmlText(const char* str) { return EscapeXml(str, false); }\n\n  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.\n  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);\n\n  // Streams an XML representation of a TestInfo object.\n  static void OutputXmlTestInfo(::std::ostream* stream,\n                                const char* test_case_name,\n                                const TestInfo& test_info);\n\n  // Prints an XML representation of a TestCase object\n  static void PrintXmlTestCase(FILE* out, const TestCase& test_case);\n\n  // Prints an XML summary of unit_test to output stream out.\n  static void PrintXmlUnitTest(FILE* out, const UnitTest& unit_test);\n\n  // Produces a string representing the test properties in a result as space\n  // delimited XML attributes based on the property key=\"value\" pairs.\n  // When the String is not empty, it includes a space at the beginning,\n  // to delimit this attribute from prior attributes.\n  static String TestPropertiesAsXmlAttributes(const TestResult& result);\n\n  // The output file.\n  const String output_file_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);\n};\n\n// Creates a new XmlUnitTestResultPrinter.\nXmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)\n    : output_file_(output_file) {\n  if (output_file_.c_str() == NULL || output_file_.empty()) {\n    fprintf(stderr, \"XML output file may not be null\\n\");\n    fflush(stderr);\n    exit(EXIT_FAILURE);\n  }\n}\n\n// Called after the unit test ends.\nvoid XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,\n                                                  int /*iteration*/) {\n  FILE* xmlout = NULL;\n  FilePath output_file(output_file_);\n  FilePath output_dir(output_file.RemoveFileName());\n\n  if (output_dir.CreateDirectoriesRecursively()) {\n    xmlout = posix::FOpen(output_file_.c_str(), \"w\");\n  }\n  if (xmlout == NULL) {\n    // TODO(wan): report the reason of the failure.\n    //\n    // We don't do it for now as:\n    //\n    //   1. There is no urgent need for it.\n    //   2. It's a bit involved to make the errno variable thread-safe on\n    //      all three operating systems (Linux, Windows, and Mac OS).\n    //   3. To interpret the meaning of errno in a thread-safe way,\n    //      we need the strerror_r() function, which is not available on\n    //      Windows.\n    fprintf(stderr,\n            \"Unable to open file \\\"%s\\\"\\n\",\n            output_file_.c_str());\n    fflush(stderr);\n    exit(EXIT_FAILURE);\n  }\n  PrintXmlUnitTest(xmlout, unit_test);\n  fclose(xmlout);\n}\n\n// Returns an XML-escaped copy of the input string str.  If is_attribute\n// is true, the text is meant to appear as an attribute value, and\n// normalizable whitespace is preserved by replacing it with character\n// references.\n//\n// Invalid XML characters in str, if any, are stripped from the output.\n// It is expected that most, if not all, of the text processed by this\n// module will consist of ordinary English text.\n// If this module is ever modified to produce version 1.1 XML output,\n// most invalid characters can be retained using character references.\n// TODO(wan): It might be nice to have a minimally invasive, human-readable\n// escaping scheme for invalid characters, rather than dropping them.\nString XmlUnitTestResultPrinter::EscapeXml(const char* str, bool is_attribute) {\n  Message m;\n\n  if (str != NULL) {\n    for (const char* src = str; *src; ++src) {\n      switch (*src) {\n        case '<':\n          m << \"&lt;\";\n          break;\n        case '>':\n          m << \"&gt;\";\n          break;\n        case '&':\n          m << \"&amp;\";\n          break;\n        case '\\'':\n          if (is_attribute)\n            m << \"&apos;\";\n          else\n            m << '\\'';\n          break;\n        case '\"':\n          if (is_attribute)\n            m << \"&quot;\";\n          else\n            m << '\"';\n          break;\n        default:\n          if (IsValidXmlCharacter(*src)) {\n            if (is_attribute && IsNormalizableWhitespace(*src))\n              m << String::Format(\"&#x%02X;\", unsigned(*src));\n            else\n              m << *src;\n          }\n          break;\n      }\n    }\n  }\n\n  return m.GetString();\n}\n\n// Returns the given string with all characters invalid in XML removed.\n// Currently invalid characters are dropped from the string. An\n// alternative is to replace them with certain characters such as . or ?.\nString XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(const char* str) {\n  char* const output = new char[strlen(str) + 1];\n  char* appender = output;\n  for (char ch = *str; ch != '\\0'; ch = *++str)\n    if (IsValidXmlCharacter(ch))\n      *appender++ = ch;\n  *appender = '\\0';\n\n  String ret_value(output);\n  delete[] output;\n  return ret_value;\n}\n\n// The following routines generate an XML representation of a UnitTest\n// object.\n//\n// This is how Google Test concepts map to the DTD:\n//\n// <testsuites name=\"AllTests\">        <-- corresponds to a UnitTest object\n//   <testsuite name=\"testcase-name\">  <-- corresponds to a TestCase object\n//     <testcase name=\"test-name\">     <-- corresponds to a TestInfo object\n//       <failure message=\"...\">...</failure>\n//       <failure message=\"...\">...</failure>\n//       <failure message=\"...\">...</failure>\n//                                     <-- individual assertion failures\n//     </testcase>\n//   </testsuite>\n// </testsuites>\n\n// Formats the given time in milliseconds as seconds.\nstd::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {\n  ::std::stringstream ss;\n  ss << ms/1000.0;\n  return ss.str();\n}\n\n// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.\nvoid XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,\n                                                     const char* data) {\n  const char* segment = data;\n  *stream << \"<![CDATA[\";\n  for (;;) {\n    const char* const next_segment = strstr(segment, \"]]>\");\n    if (next_segment != NULL) {\n      stream->write(\n          segment, static_cast<std::streamsize>(next_segment - segment));\n      *stream << \"]]>]]&gt;<![CDATA[\";\n      segment = next_segment + strlen(\"]]>\");\n    } else {\n      *stream << segment;\n      break;\n    }\n  }\n  *stream << \"]]>\";\n}\n\n// Prints an XML representation of a TestInfo object.\n// TODO(wan): There is also value in printing properties with the plain printer.\nvoid XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,\n                                                 const char* test_case_name,\n                                                 const TestInfo& test_info) {\n  const TestResult& result = *test_info.result();\n  *stream << \"    <testcase name=\\\"\"\n          << EscapeXmlAttribute(test_info.name()).c_str()\n          << \"\\\" status=\\\"\"\n          << (test_info.should_run() ? \"run\" : \"notrun\")\n          << \"\\\" time=\\\"\"\n          << FormatTimeInMillisAsSeconds(result.elapsed_time())\n          << \"\\\" classname=\\\"\" << EscapeXmlAttribute(test_case_name).c_str()\n          << \"\\\"\" << TestPropertiesAsXmlAttributes(result).c_str();\n\n  int failures = 0;\n  for (int i = 0; i < result.total_part_count(); ++i) {\n    const TestPartResult& part = result.GetTestPartResult(i);\n    if (part.failed()) {\n      if (++failures == 1)\n        *stream << \">\\n\";\n      *stream << \"      <failure message=\\\"\"\n              << EscapeXmlAttribute(part.summary()).c_str()\n              << \"\\\" type=\\\"\\\">\";\n      const String message = RemoveInvalidXmlCharacters(String::Format(\n          \"%s:%d\\n%s\",\n          part.file_name(), part.line_number(),\n          part.message()).c_str());\n      OutputXmlCDataSection(stream, message.c_str());\n      *stream << \"</failure>\\n\";\n    }\n  }\n\n  if (failures == 0)\n    *stream << \" />\\n\";\n  else\n    *stream << \"    </testcase>\\n\";\n}\n\n// Prints an XML representation of a TestCase object\nvoid XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out,\n                                                const TestCase& test_case) {\n  fprintf(out,\n          \"  <testsuite name=\\\"%s\\\" tests=\\\"%d\\\" failures=\\\"%d\\\" \"\n          \"disabled=\\\"%d\\\" \",\n          EscapeXmlAttribute(test_case.name()).c_str(),\n          test_case.total_test_count(),\n          test_case.failed_test_count(),\n          test_case.disabled_test_count());\n  fprintf(out,\n          \"errors=\\\"0\\\" time=\\\"%s\\\">\\n\",\n          FormatTimeInMillisAsSeconds(test_case.elapsed_time()).c_str());\n  for (int i = 0; i < test_case.total_test_count(); ++i) {\n    StrStream stream;\n    OutputXmlTestInfo(&stream, test_case.name(), *test_case.GetTestInfo(i));\n    fprintf(out, \"%s\", StrStreamToString(&stream).c_str());\n  }\n  fprintf(out, \"  </testsuite>\\n\");\n}\n\n// Prints an XML summary of unit_test to output stream out.\nvoid XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out,\n                                                const UnitTest& unit_test) {\n  fprintf(out, \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\");\n  fprintf(out,\n          \"<testsuites tests=\\\"%d\\\" failures=\\\"%d\\\" disabled=\\\"%d\\\" \"\n          \"errors=\\\"0\\\" time=\\\"%s\\\" \",\n          unit_test.total_test_count(),\n          unit_test.failed_test_count(),\n          unit_test.disabled_test_count(),\n          FormatTimeInMillisAsSeconds(unit_test.elapsed_time()).c_str());\n  if (GTEST_FLAG(shuffle)) {\n    fprintf(out, \"random_seed=\\\"%d\\\" \", unit_test.random_seed());\n  }\n  fprintf(out, \"name=\\\"AllTests\\\">\\n\");\n  for (int i = 0; i < unit_test.total_test_case_count(); ++i)\n    PrintXmlTestCase(out, *unit_test.GetTestCase(i));\n  fprintf(out, \"</testsuites>\\n\");\n}\n\n// Produces a string representing the test properties in a result as space\n// delimited XML attributes based on the property key=\"value\" pairs.\nString XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(\n    const TestResult& result) {\n  Message attributes;\n  for (int i = 0; i < result.test_property_count(); ++i) {\n    const TestProperty& property = result.GetTestProperty(i);\n    attributes << \" \" << property.key() << \"=\"\n        << \"\\\"\" << EscapeXmlAttribute(property.value()) << \"\\\"\";\n  }\n  return attributes.GetString();\n}\n\n// End XmlUnitTestResultPrinter\n\n// Class ScopedTrace\n\n// Pushes the given source file location and message onto a per-thread\n// trace stack maintained by Google Test.\n// L < UnitTest::mutex_\nScopedTrace::ScopedTrace(const char* file, int line, const Message& message) {\n  TraceInfo trace;\n  trace.file = file;\n  trace.line = line;\n  trace.message = message.GetString();\n\n  UnitTest::GetInstance()->PushGTestTrace(trace);\n}\n\n// Pops the info pushed by the c'tor.\n// L < UnitTest::mutex_\nScopedTrace::~ScopedTrace() {\n  UnitTest::GetInstance()->PopGTestTrace();\n}\n\n\n// class OsStackTraceGetter\n\n// Returns the current OS stack trace as a String.  Parameters:\n//\n//   max_depth  - the maximum number of stack frames to be included\n//                in the trace.\n//   skip_count - the number of top frames to be skipped; doesn't count\n//                against max_depth.\n//\n// L < mutex_\n// We use \"L < mutex_\" to denote that the function may acquire mutex_.\nString OsStackTraceGetter::CurrentStackTrace(int, int) {\n  return String(\"\");\n}\n\n// L < mutex_\nvoid OsStackTraceGetter::UponLeavingGTest() {\n}\n\nconst char* const\nOsStackTraceGetter::kElidedFramesMarker =\n    \"... \" GTEST_NAME_ \" internal frames ...\";\n\n}  // namespace internal\n\n// class TestEventListeners\n\nTestEventListeners::TestEventListeners()\n    : repeater_(new internal::TestEventRepeater()),\n      default_result_printer_(NULL),\n      default_xml_generator_(NULL) {\n}\n\nTestEventListeners::~TestEventListeners() { delete repeater_; }\n\n// Returns the standard listener responsible for the default console\n// output.  Can be removed from the listeners list to shut down default\n// console output.  Note that removing this object from the listener list\n// with Release transfers its ownership to the user.\nvoid TestEventListeners::Append(TestEventListener* listener) {\n  repeater_->Append(listener);\n}\n\n// Removes the given event listener from the list and returns it.  It then\n// becomes the caller's responsibility to delete the listener. Returns\n// NULL if the listener is not found in the list.\nTestEventListener* TestEventListeners::Release(TestEventListener* listener) {\n  if (listener == default_result_printer_)\n    default_result_printer_ = NULL;\n  else if (listener == default_xml_generator_)\n    default_xml_generator_ = NULL;\n  return repeater_->Release(listener);\n}\n\n// Returns repeater that broadcasts the TestEventListener events to all\n// subscribers.\nTestEventListener* TestEventListeners::repeater() { return repeater_; }\n\n// Sets the default_result_printer attribute to the provided listener.\n// The listener is also added to the listener list and previous\n// default_result_printer is removed from it and deleted. The listener can\n// also be NULL in which case it will not be added to the list. Does\n// nothing if the previous and the current listener objects are the same.\nvoid TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {\n  if (default_result_printer_ != listener) {\n    // It is an error to pass this method a listener that is already in the\n    // list.\n    delete Release(default_result_printer_);\n    default_result_printer_ = listener;\n    if (listener != NULL)\n      Append(listener);\n  }\n}\n\n// Sets the default_xml_generator attribute to the provided listener.  The\n// listener is also added to the listener list and previous\n// default_xml_generator is removed from it and deleted. The listener can\n// also be NULL in which case it will not be added to the list. Does\n// nothing if the previous and the current listener objects are the same.\nvoid TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {\n  if (default_xml_generator_ != listener) {\n    // It is an error to pass this method a listener that is already in the\n    // list.\n    delete Release(default_xml_generator_);\n    default_xml_generator_ = listener;\n    if (listener != NULL)\n      Append(listener);\n  }\n}\n\n// Controls whether events will be forwarded by the repeater to the\n// listeners in the list.\nbool TestEventListeners::EventForwardingEnabled() const {\n  return repeater_->forwarding_enabled();\n}\n\nvoid TestEventListeners::SuppressEventForwarding() {\n  repeater_->set_forwarding_enabled(false);\n}\n\n// class UnitTest\n\n// Gets the singleton UnitTest object.  The first time this method is\n// called, a UnitTest object is constructed and returned.  Consecutive\n// calls will return the same object.\n//\n// We don't protect this under mutex_ as a user is not supposed to\n// call this before main() starts, from which point on the return\n// value will never change.\nUnitTest * UnitTest::GetInstance() {\n  // When compiled with MSVC 7.1 in optimized mode, destroying the\n  // UnitTest object upon exiting the program messes up the exit code,\n  // causing successful tests to appear failed.  We have to use a\n  // different implementation in this case to bypass the compiler bug.\n  // This implementation makes the compiler happy, at the cost of\n  // leaking the UnitTest object.\n\n  // CodeGear C++Builder insists on a public destructor for the\n  // default implementation.  Use this implementation to keep good OO\n  // design with private destructor.\n\n#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)\n  static UnitTest* const instance = new UnitTest;\n  return instance;\n#else\n  static UnitTest instance;\n  return &instance;\n#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)\n}\n\n// Gets the number of successful test cases.\nint UnitTest::successful_test_case_count() const {\n  return impl()->successful_test_case_count();\n}\n\n// Gets the number of failed test cases.\nint UnitTest::failed_test_case_count() const {\n  return impl()->failed_test_case_count();\n}\n\n// Gets the number of all test cases.\nint UnitTest::total_test_case_count() const {\n  return impl()->total_test_case_count();\n}\n\n// Gets the number of all test cases that contain at least one test\n// that should run.\nint UnitTest::test_case_to_run_count() const {\n  return impl()->test_case_to_run_count();\n}\n\n// Gets the number of successful tests.\nint UnitTest::successful_test_count() const {\n  return impl()->successful_test_count();\n}\n\n// Gets the number of failed tests.\nint UnitTest::failed_test_count() const { return impl()->failed_test_count(); }\n\n// Gets the number of disabled tests.\nint UnitTest::disabled_test_count() const {\n  return impl()->disabled_test_count();\n}\n\n// Gets the number of all tests.\nint UnitTest::total_test_count() const { return impl()->total_test_count(); }\n\n// Gets the number of tests that should run.\nint UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }\n\n// Gets the elapsed time, in milliseconds.\ninternal::TimeInMillis UnitTest::elapsed_time() const {\n  return impl()->elapsed_time();\n}\n\n// Returns true iff the unit test passed (i.e. all test cases passed).\nbool UnitTest::Passed() const { return impl()->Passed(); }\n\n// Returns true iff the unit test failed (i.e. some test case failed\n// or something outside of all tests failed).\nbool UnitTest::Failed() const { return impl()->Failed(); }\n\n// Gets the i-th test case among all the test cases. i can range from 0 to\n// total_test_case_count() - 1. If i is not in that range, returns NULL.\nconst TestCase* UnitTest::GetTestCase(int i) const {\n  return impl()->GetTestCase(i);\n}\n\n// Gets the i-th test case among all the test cases. i can range from 0 to\n// total_test_case_count() - 1. If i is not in that range, returns NULL.\nTestCase* UnitTest::GetMutableTestCase(int i) {\n  return impl()->GetMutableTestCase(i);\n}\n\n// Returns the list of event listeners that can be used to track events\n// inside Google Test.\nTestEventListeners& UnitTest::listeners() {\n  return *impl()->listeners();\n}\n\n// Registers and returns a global test environment.  When a test\n// program is run, all global test environments will be set-up in the\n// order they were registered.  After all tests in the program have\n// finished, all global test environments will be torn-down in the\n// *reverse* order they were registered.\n//\n// The UnitTest object takes ownership of the given environment.\n//\n// We don't protect this under mutex_, as we only support calling it\n// from the main thread.\nEnvironment* UnitTest::AddEnvironment(Environment* env) {\n  if (env == NULL) {\n    return NULL;\n  }\n\n  impl_->environments().push_back(env);\n  return env;\n}\n\n#if GTEST_HAS_EXCEPTIONS\n// A failed Google Test assertion will throw an exception of this type\n// when exceptions are enabled.  We derive it from std::runtime_error,\n// which is for errors presumably detectable only at run time.  Since\n// std::runtime_error inherits from std::exception, many testing\n// frameworks know how to extract and print the message inside it.\nclass GoogleTestFailureException : public ::std::runtime_error {\n public:\n  explicit GoogleTestFailureException(const TestPartResult& failure)\n      : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}\n};\n#endif\n\n// Adds a TestPartResult to the current TestResult object.  All Google Test\n// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call\n// this to report their results.  The user code should use the\n// assertion macros instead of calling this directly.\n// L < mutex_\nvoid UnitTest::AddTestPartResult(TestPartResult::Type result_type,\n                                 const char* file_name,\n                                 int line_number,\n                                 const internal::String& message,\n                                 const internal::String& os_stack_trace) {\n  Message msg;\n  msg << message;\n\n  internal::MutexLock lock(&mutex_);\n  if (impl_->gtest_trace_stack().size() > 0) {\n    msg << \"\\n\" << GTEST_NAME_ << \" trace:\";\n\n    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());\n         i > 0; --i) {\n      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];\n      msg << \"\\n\" << internal::FormatFileLocation(trace.file, trace.line)\n          << \" \" << trace.message;\n    }\n  }\n\n  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {\n    msg << internal::kStackTraceMarker << os_stack_trace;\n  }\n\n  const TestPartResult result =\n    TestPartResult(result_type, file_name, line_number,\n                   msg.GetString().c_str());\n  impl_->GetTestPartResultReporterForCurrentThread()->\n      ReportTestPartResult(result);\n\n  if (result_type != TestPartResult::kSuccess) {\n    // gtest_break_on_failure takes precedence over\n    // gtest_throw_on_failure.  This allows a user to set the latter\n    // in the code (perhaps in order to use Google Test assertions\n    // with another testing framework) and specify the former on the\n    // command line for debugging.\n    if (GTEST_FLAG(break_on_failure)) {\n#if GTEST_OS_WINDOWS\n      // Using DebugBreak on Windows allows gtest to still break into a debugger\n      // when a failure happens and both the --gtest_break_on_failure and\n      // the --gtest_catch_exceptions flags are specified.\n      DebugBreak();\n#else\n      *static_cast<int*>(NULL) = 1;\n#endif  // GTEST_OS_WINDOWS\n    } else if (GTEST_FLAG(throw_on_failure)) {\n#if GTEST_HAS_EXCEPTIONS\n      throw GoogleTestFailureException(result);\n#else\n      // We cannot call abort() as it generates a pop-up in debug mode\n      // that cannot be suppressed in VC 7.1 or below.\n      exit(1);\n#endif\n    }\n  }\n}\n\n// Creates and adds a property to the current TestResult. If a property matching\n// the supplied value already exists, updates its value instead.\nvoid UnitTest::RecordPropertyForCurrentTest(const char* key,\n                                            const char* value) {\n  const TestProperty test_property(key, value);\n  impl_->current_test_result()->RecordProperty(test_property);\n}\n\n// Runs all tests in this UnitTest object and prints the result.\n// Returns 0 if successful, or 1 otherwise.\n//\n// We don't protect this under mutex_, as we only support calling it\n// from the main thread.\nint UnitTest::Run() {\n#if GTEST_HAS_SEH\n  // Catch SEH-style exceptions.\n\n  const bool in_death_test_child_process =\n      internal::GTEST_FLAG(internal_run_death_test).length() > 0;\n\n  // Either the user wants Google Test to catch exceptions thrown by the\n  // tests or this is executing in the context of death test child\n  // process. In either case the user does not want to see pop-up dialogs\n  // about crashes - they are expected..\n  if (GTEST_FLAG(catch_exceptions) || in_death_test_child_process) {\n#if !GTEST_OS_WINDOWS_MOBILE\n    // SetErrorMode doesn't exist on CE.\n    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |\n                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\n#if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE\n    // Death test children can be terminated with _abort().  On Windows,\n    // _abort() can show a dialog with a warning message.  This forces the\n    // abort message to go to stderr instead.\n    _set_error_mode(_OUT_TO_STDERR);\n#endif\n\n#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE\n    // In the debug version, Visual Studio pops up a separate dialog\n    // offering a choice to debug the aborted program. We need to suppress\n    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement\n    // executed. Google Test will notify the user of any unexpected\n    // failure via stderr.\n    //\n    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.\n    // Users of prior VC versions shall suffer the agony and pain of\n    // clicking through the countless debug dialogs.\n    // TODO(vladl@google.com): find a way to suppress the abort dialog() in the\n    // debug mode when compiled with VC 7.1 or lower.\n    if (!GTEST_FLAG(break_on_failure))\n      _set_abort_behavior(\n          0x0,                                    // Clear the following flags:\n          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.\n#endif\n  }\n\n  __try {\n    return impl_->RunAllTests();\n  } __except(internal::UnitTestOptions::GTestShouldProcessSEH(\n      GetExceptionCode())) {\n    printf(\"Exception thrown with code 0x%x.\\nFAIL\\n\", GetExceptionCode());\n    fflush(stdout);\n    return 1;\n  }\n\n#else  // We are on a compiler or platform that doesn't support SEH.\n\n  return impl_->RunAllTests();\n#endif  // GTEST_HAS_SEH\n}\n\n// Returns the working directory when the first TEST() or TEST_F() was\n// executed.\nconst char* UnitTest::original_working_dir() const {\n  return impl_->original_working_dir_.c_str();\n}\n\n// Returns the TestCase object for the test that's currently running,\n// or NULL if no test is running.\n// L < mutex_\nconst TestCase* UnitTest::current_test_case() const {\n  internal::MutexLock lock(&mutex_);\n  return impl_->current_test_case();\n}\n\n// Returns the TestInfo object for the test that's currently running,\n// or NULL if no test is running.\n// L < mutex_\nconst TestInfo* UnitTest::current_test_info() const {\n  internal::MutexLock lock(&mutex_);\n  return impl_->current_test_info();\n}\n\n// Returns the random seed used at the start of the current test run.\nint UnitTest::random_seed() const { return impl_->random_seed(); }\n\n#if GTEST_HAS_PARAM_TEST\n// Returns ParameterizedTestCaseRegistry object used to keep track of\n// value-parameterized tests and instantiate and register them.\n// L < mutex_\ninternal::ParameterizedTestCaseRegistry&\n    UnitTest::parameterized_test_registry() {\n  return impl_->parameterized_test_registry();\n}\n#endif  // GTEST_HAS_PARAM_TEST\n\n// Creates an empty UnitTest.\nUnitTest::UnitTest() {\n  impl_ = new internal::UnitTestImpl(this);\n}\n\n// Destructor of UnitTest.\nUnitTest::~UnitTest() {\n  delete impl_;\n}\n\n// Pushes a trace defined by SCOPED_TRACE() on to the per-thread\n// Google Test trace stack.\n// L < mutex_\nvoid UnitTest::PushGTestTrace(const internal::TraceInfo& trace) {\n  internal::MutexLock lock(&mutex_);\n  impl_->gtest_trace_stack().push_back(trace);\n}\n\n// Pops a trace from the per-thread Google Test trace stack.\n// L < mutex_\nvoid UnitTest::PopGTestTrace() {\n  internal::MutexLock lock(&mutex_);\n  impl_->gtest_trace_stack().pop_back();\n}\n\nnamespace internal {\n\nUnitTestImpl::UnitTestImpl(UnitTest* parent)\n    : parent_(parent),\n#ifdef _MSC_VER\n#pragma warning(push)                    // Saves the current warning state.\n#pragma warning(disable:4355)            // Temporarily disables warning 4355\n                                         // (using this in initializer).\n      default_global_test_part_result_reporter_(this),\n      default_per_thread_test_part_result_reporter_(this),\n#pragma warning(pop)                     // Restores the warning state again.\n#else\n      default_global_test_part_result_reporter_(this),\n      default_per_thread_test_part_result_reporter_(this),\n#endif  // _MSC_VER\n      global_test_part_result_repoter_(\n          &default_global_test_part_result_reporter_),\n      per_thread_test_part_result_reporter_(\n          &default_per_thread_test_part_result_reporter_),\n#if GTEST_HAS_PARAM_TEST\n      parameterized_test_registry_(),\n      parameterized_tests_registered_(false),\n#endif  // GTEST_HAS_PARAM_TEST\n      last_death_test_case_(-1),\n      current_test_case_(NULL),\n      current_test_info_(NULL),\n      ad_hoc_test_result_(),\n      os_stack_trace_getter_(NULL),\n      post_flag_parse_init_performed_(false),\n      random_seed_(0),  // Will be overridden by the flag before first use.\n      random_(0),  // Will be reseeded before first use.\n#if GTEST_HAS_DEATH_TEST\n      elapsed_time_(0),\n      internal_run_death_test_flag_(NULL),\n      death_test_factory_(new DefaultDeathTestFactory) {\n#else\n      elapsed_time_(0) {\n#endif  // GTEST_HAS_DEATH_TEST\n  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);\n}\n\nUnitTestImpl::~UnitTestImpl() {\n  // Deletes every TestCase.\n  ForEach(test_cases_, internal::Delete<TestCase>);\n\n  // Deletes every Environment.\n  ForEach(environments_, internal::Delete<Environment>);\n\n  delete os_stack_trace_getter_;\n}\n\n#if GTEST_HAS_DEATH_TEST\n// Disables event forwarding if the control is currently in a death test\n// subprocess. Must not be called before InitGoogleTest.\nvoid UnitTestImpl::SuppressTestEventsIfInSubprocess() {\n  if (internal_run_death_test_flag_.get() != NULL)\n    listeners()->SuppressEventForwarding();\n}\n#endif  // GTEST_HAS_DEATH_TEST\n\n// Initializes event listeners performing XML output as specified by\n// UnitTestOptions. Must not be called before InitGoogleTest.\nvoid UnitTestImpl::ConfigureXmlOutput() {\n  const String& output_format = UnitTestOptions::GetOutputFormat();\n  if (output_format == \"xml\") {\n    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(\n        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));\n  } else if (output_format != \"\") {\n    printf(\"WARNING: unrecognized output format \\\"%s\\\" ignored.\\n\",\n           output_format.c_str());\n    fflush(stdout);\n  }\n}\n\n// Performs initialization dependent upon flag values obtained in\n// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to\n// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest\n// this function is also called from RunAllTests.  Since this function can be\n// called more than once, it has to be idempotent.\nvoid UnitTestImpl::PostFlagParsingInit() {\n  // Ensures that this function does not execute more than once.\n  if (!post_flag_parse_init_performed_) {\n    post_flag_parse_init_performed_ = true;\n\n#if GTEST_HAS_DEATH_TEST\n    InitDeathTestSubprocessControlInfo();\n    SuppressTestEventsIfInSubprocess();\n#endif  // GTEST_HAS_DEATH_TEST\n\n    // Registers parameterized tests. This makes parameterized tests\n    // available to the UnitTest reflection API without running\n    // RUN_ALL_TESTS.\n    RegisterParameterizedTests();\n\n    // Configures listeners for XML output. This makes it possible for users\n    // to shut down the default XML output before invoking RUN_ALL_TESTS.\n    ConfigureXmlOutput();\n  }\n}\n\n// A predicate that checks the name of a TestCase against a known\n// value.\n//\n// This is used for implementation of the UnitTest class only.  We put\n// it in the anonymous namespace to prevent polluting the outer\n// namespace.\n//\n// TestCaseNameIs is copyable.\nclass TestCaseNameIs {\n public:\n  // Constructor.\n  explicit TestCaseNameIs(const String& name)\n      : name_(name) {}\n\n  // Returns true iff the name of test_case matches name_.\n  bool operator()(const TestCase* test_case) const {\n    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;\n  }\n\n private:\n  String name_;\n};\n\n// Finds and returns a TestCase with the given name.  If one doesn't\n// exist, creates one and returns it.  It's the CALLER'S\n// RESPONSIBILITY to ensure that this function is only called WHEN THE\n// TESTS ARE NOT SHUFFLED.\n//\n// Arguments:\n//\n//   test_case_name: name of the test case\n//   set_up_tc:      pointer to the function that sets up the test case\n//   tear_down_tc:   pointer to the function that tears down the test case\nTestCase* UnitTestImpl::GetTestCase(const char* test_case_name,\n                                    const char* comment,\n                                    Test::SetUpTestCaseFunc set_up_tc,\n                                    Test::TearDownTestCaseFunc tear_down_tc) {\n  // Can we find a TestCase with the given name?\n  const std::vector<TestCase*>::const_iterator test_case =\n      std::find_if(test_cases_.begin(), test_cases_.end(),\n                   TestCaseNameIs(test_case_name));\n\n  if (test_case != test_cases_.end())\n    return *test_case;\n\n  // No.  Let's create one.\n  TestCase* const new_test_case =\n      new TestCase(test_case_name, comment, set_up_tc, tear_down_tc);\n\n  // Is this a death test case?\n  if (internal::UnitTestOptions::MatchesFilter(String(test_case_name),\n                                               kDeathTestCaseFilter)) {\n    // Yes.  Inserts the test case after the last death test case\n    // defined so far.  This only works when the test cases haven't\n    // been shuffled.  Otherwise we may end up running a death test\n    // after a non-death test.\n    ++last_death_test_case_;\n    test_cases_.insert(test_cases_.begin() + last_death_test_case_,\n                       new_test_case);\n  } else {\n    // No.  Appends to the end of the list.\n    test_cases_.push_back(new_test_case);\n  }\n\n  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));\n  return new_test_case;\n}\n\n// Helpers for setting up / tearing down the given environment.  They\n// are for use in the ForEach() function.\nstatic void SetUpEnvironment(Environment* env) { env->SetUp(); }\nstatic void TearDownEnvironment(Environment* env) { env->TearDown(); }\n\n// Runs all tests in this UnitTest object, prints the result, and\n// returns 0 if all tests are successful, or 1 otherwise.  If any\n// exception is thrown during a test on Windows, this test is\n// considered to be failed, but the rest of the tests will still be\n// run.  (We disable exceptions on Linux and Mac OS X, so the issue\n// doesn't apply there.)\n// When parameterized tests are enabled, it expands and registers\n// parameterized tests first in RegisterParameterizedTests().\n// All other functions called from RunAllTests() may safely assume that\n// parameterized tests are ready to be counted and run.\nint UnitTestImpl::RunAllTests() {\n  // Makes sure InitGoogleTest() was called.\n  if (!GTestIsInitialized()) {\n    printf(\"%s\",\n           \"\\nThis test program did NOT call ::testing::InitGoogleTest \"\n           \"before calling RUN_ALL_TESTS().  Please fix it.\\n\");\n    return 1;\n  }\n\n  // Do not run any test if the --help flag was specified.\n  if (g_help_flag)\n    return 0;\n\n  // Repeats the call to the post-flag parsing initialization in case the\n  // user didn't call InitGoogleTest.\n  PostFlagParsingInit();\n\n  // Even if sharding is not on, test runners may want to use the\n  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding\n  // protocol.\n  internal::WriteToShardStatusFileIfNeeded();\n\n  // True iff we are in a subprocess for running a thread-safe-style\n  // death test.\n  bool in_subprocess_for_death_test = false;\n\n#if GTEST_HAS_DEATH_TEST\n  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);\n#endif  // GTEST_HAS_DEATH_TEST\n\n  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,\n                                        in_subprocess_for_death_test);\n\n  // Compares the full test names with the filter to decide which\n  // tests to run.\n  const bool has_tests_to_run = FilterTests(should_shard\n                                              ? HONOR_SHARDING_PROTOCOL\n                                              : IGNORE_SHARDING_PROTOCOL) > 0;\n\n  // Lists the tests and exits if the --gtest_list_tests flag was specified.\n  if (GTEST_FLAG(list_tests)) {\n    // This must be called *after* FilterTests() has been called.\n    ListTestsMatchingFilter();\n    return 0;\n  }\n\n  random_seed_ = GTEST_FLAG(shuffle) ?\n      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;\n\n  // True iff at least one test has failed.\n  bool failed = false;\n\n  TestEventListener* repeater = listeners()->repeater();\n\n  repeater->OnTestProgramStart(*parent_);\n\n  // How many times to repeat the tests?  We don't want to repeat them\n  // when we are inside the subprocess of a death test.\n  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);\n  // Repeats forever if the repeat count is negative.\n  const bool forever = repeat < 0;\n  for (int i = 0; forever || i != repeat; i++) {\n    ClearResult();\n\n    const TimeInMillis start = GetTimeInMillis();\n\n    // Shuffles test cases and tests if requested.\n    if (has_tests_to_run && GTEST_FLAG(shuffle)) {\n      random()->Reseed(random_seed_);\n      // This should be done before calling OnTestIterationStart(),\n      // such that a test event listener can see the actual test order\n      // in the event.\n      ShuffleTests();\n    }\n\n    // Tells the unit test event listeners that the tests are about to start.\n    repeater->OnTestIterationStart(*parent_, i);\n\n    // Runs each test case if there is at least one test to run.\n    if (has_tests_to_run) {\n      // Sets up all environments beforehand.\n      repeater->OnEnvironmentsSetUpStart(*parent_);\n      ForEach(environments_, SetUpEnvironment);\n      repeater->OnEnvironmentsSetUpEnd(*parent_);\n\n      // Runs the tests only if there was no fatal failure during global\n      // set-up.\n      if (!Test::HasFatalFailure()) {\n        for (int test_index = 0; test_index < total_test_case_count();\n             test_index++) {\n          GetMutableTestCase(test_index)->Run();\n        }\n      }\n\n      // Tears down all environments in reverse order afterwards.\n      repeater->OnEnvironmentsTearDownStart(*parent_);\n      std::for_each(environments_.rbegin(), environments_.rend(),\n                    TearDownEnvironment);\n      repeater->OnEnvironmentsTearDownEnd(*parent_);\n    }\n\n    elapsed_time_ = GetTimeInMillis() - start;\n\n    // Tells the unit test event listener that the tests have just finished.\n    repeater->OnTestIterationEnd(*parent_, i);\n\n    // Gets the result and clears it.\n    if (!Passed()) {\n      failed = true;\n    }\n\n    // Restores the original test order after the iteration.  This\n    // allows the user to quickly repro a failure that happens in the\n    // N-th iteration without repeating the first (N - 1) iterations.\n    // This is not enclosed in \"if (GTEST_FLAG(shuffle)) { ... }\", in\n    // case the user somehow changes the value of the flag somewhere\n    // (it's always safe to unshuffle the tests).\n    UnshuffleTests();\n\n    if (GTEST_FLAG(shuffle)) {\n      // Picks a new random seed for each iteration.\n      random_seed_ = GetNextRandomSeed(random_seed_);\n    }\n  }\n\n  repeater->OnTestProgramEnd(*parent_);\n\n  // Returns 0 if all tests passed, or 1 other wise.\n  return failed ? 1 : 0;\n}\n\n// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file\n// if the variable is present. If a file already exists at this location, this\n// function will write over it. If the variable is present, but the file cannot\n// be created, prints an error and exits.\nvoid WriteToShardStatusFileIfNeeded() {\n  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);\n  if (test_shard_file != NULL) {\n    FILE* const file = posix::FOpen(test_shard_file, \"w\");\n    if (file == NULL) {\n      ColoredPrintf(COLOR_RED,\n                    \"Could not write to the test shard status file \\\"%s\\\" \"\n                    \"specified by the %s environment variable.\\n\",\n                    test_shard_file, kTestShardStatusFile);\n      fflush(stdout);\n      exit(EXIT_FAILURE);\n    }\n    fclose(file);\n  }\n}\n\n// Checks whether sharding is enabled by examining the relevant\n// environment variable values. If the variables are present,\n// but inconsistent (i.e., shard_index >= total_shards), prints\n// an error and exits. If in_subprocess_for_death_test, sharding is\n// disabled because it must only be applied to the original test\n// process. Otherwise, we could filter out death tests we intended to execute.\nbool ShouldShard(const char* total_shards_env,\n                 const char* shard_index_env,\n                 bool in_subprocess_for_death_test) {\n  if (in_subprocess_for_death_test) {\n    return false;\n  }\n\n  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);\n  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);\n\n  if (total_shards == -1 && shard_index == -1) {\n    return false;\n  } else if (total_shards == -1 && shard_index != -1) {\n    const Message msg = Message()\n      << \"Invalid environment variables: you have \"\n      << kTestShardIndex << \" = \" << shard_index\n      << \", but have left \" << kTestTotalShards << \" unset.\\n\";\n    ColoredPrintf(COLOR_RED, msg.GetString().c_str());\n    fflush(stdout);\n    exit(EXIT_FAILURE);\n  } else if (total_shards != -1 && shard_index == -1) {\n    const Message msg = Message()\n      << \"Invalid environment variables: you have \"\n      << kTestTotalShards << \" = \" << total_shards\n      << \", but have left \" << kTestShardIndex << \" unset.\\n\";\n    ColoredPrintf(COLOR_RED, msg.GetString().c_str());\n    fflush(stdout);\n    exit(EXIT_FAILURE);\n  } else if (shard_index < 0 || shard_index >= total_shards) {\n    const Message msg = Message()\n      << \"Invalid environment variables: we require 0 <= \"\n      << kTestShardIndex << \" < \" << kTestTotalShards\n      << \", but you have \" << kTestShardIndex << \"=\" << shard_index\n      << \", \" << kTestTotalShards << \"=\" << total_shards << \".\\n\";\n    ColoredPrintf(COLOR_RED, msg.GetString().c_str());\n    fflush(stdout);\n    exit(EXIT_FAILURE);\n  }\n\n  return total_shards > 1;\n}\n\n// Parses the environment variable var as an Int32. If it is unset,\n// returns default_val. If it is not an Int32, prints an error\n// and aborts.\nInt32 Int32FromEnvOrDie(const char* const var, Int32 default_val) {\n  const char* str_val = posix::GetEnv(var);\n  if (str_val == NULL) {\n    return default_val;\n  }\n\n  Int32 result;\n  if (!ParseInt32(Message() << \"The value of environment variable \" << var,\n                  str_val, &result)) {\n    exit(EXIT_FAILURE);\n  }\n  return result;\n}\n\n// Given the total number of shards, the shard index, and the test id,\n// returns true iff the test should be run on this shard. The test id is\n// some arbitrary but unique non-negative integer assigned to each test\n// method. Assumes that 0 <= shard_index < total_shards.\nbool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {\n  return (test_id % total_shards) == shard_index;\n}\n\n// Compares the name of each test with the user-specified filter to\n// decide whether the test should be run, then records the result in\n// each TestCase and TestInfo object.\n// If shard_tests == true, further filters tests based on sharding\n// variables in the environment - see\n// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.\n// Returns the number of tests that should run.\nint UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {\n  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?\n      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;\n  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?\n      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;\n\n  // num_runnable_tests are the number of tests that will\n  // run across all shards (i.e., match filter and are not disabled).\n  // num_selected_tests are the number of tests to be run on\n  // this shard.\n  int num_runnable_tests = 0;\n  int num_selected_tests = 0;\n  for (size_t i = 0; i < test_cases_.size(); i++) {\n    TestCase* const test_case = test_cases_[i];\n    const String &test_case_name = test_case->name();\n    test_case->set_should_run(false);\n\n    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {\n      TestInfo* const test_info = test_case->test_info_list()[j];\n      const String test_name(test_info->name());\n      // A test is disabled if test case name or test name matches\n      // kDisableTestFilter.\n      const bool is_disabled =\n          internal::UnitTestOptions::MatchesFilter(test_case_name,\n                                                   kDisableTestFilter) ||\n          internal::UnitTestOptions::MatchesFilter(test_name,\n                                                   kDisableTestFilter);\n      test_info->impl()->set_is_disabled(is_disabled);\n\n      const bool matches_filter =\n          internal::UnitTestOptions::FilterMatchesTest(test_case_name,\n                                                       test_name);\n      test_info->impl()->set_matches_filter(matches_filter);\n\n      const bool is_runnable =\n          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&\n          matches_filter;\n\n      const bool is_selected = is_runnable &&\n          (shard_tests == IGNORE_SHARDING_PROTOCOL ||\n           ShouldRunTestOnShard(total_shards, shard_index,\n                                num_runnable_tests));\n\n      num_runnable_tests += is_runnable;\n      num_selected_tests += is_selected;\n\n      test_info->impl()->set_should_run(is_selected);\n      test_case->set_should_run(test_case->should_run() || is_selected);\n    }\n  }\n  return num_selected_tests;\n}\n\n// Prints the names of the tests matching the user-specified filter flag.\nvoid UnitTestImpl::ListTestsMatchingFilter() {\n  for (size_t i = 0; i < test_cases_.size(); i++) {\n    const TestCase* const test_case = test_cases_[i];\n    bool printed_test_case_name = false;\n\n    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {\n      const TestInfo* const test_info =\n          test_case->test_info_list()[j];\n      if (test_info->matches_filter()) {\n        if (!printed_test_case_name) {\n          printed_test_case_name = true;\n          printf(\"%s.\\n\", test_case->name());\n        }\n        printf(\"  %s\\n\", test_info->name());\n      }\n    }\n  }\n  fflush(stdout);\n}\n\n// Sets the OS stack trace getter.\n//\n// Does nothing if the input and the current OS stack trace getter are\n// the same; otherwise, deletes the old getter and makes the input the\n// current getter.\nvoid UnitTestImpl::set_os_stack_trace_getter(\n    OsStackTraceGetterInterface* getter) {\n  if (os_stack_trace_getter_ != getter) {\n    delete os_stack_trace_getter_;\n    os_stack_trace_getter_ = getter;\n  }\n}\n\n// Returns the current OS stack trace getter if it is not NULL;\n// otherwise, creates an OsStackTraceGetter, makes it the current\n// getter, and returns it.\nOsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {\n  if (os_stack_trace_getter_ == NULL) {\n    os_stack_trace_getter_ = new OsStackTraceGetter;\n  }\n\n  return os_stack_trace_getter_;\n}\n\n// Returns the TestResult for the test that's currently running, or\n// the TestResult for the ad hoc test if no test is running.\nTestResult* UnitTestImpl::current_test_result() {\n  return current_test_info_ ?\n    current_test_info_->impl()->result() : &ad_hoc_test_result_;\n}\n\n// Shuffles all test cases, and the tests within each test case,\n// making sure that death tests are still run first.\nvoid UnitTestImpl::ShuffleTests() {\n  // Shuffles the death test cases.\n  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);\n\n  // Shuffles the non-death test cases.\n  ShuffleRange(random(), last_death_test_case_ + 1,\n               static_cast<int>(test_cases_.size()), &test_case_indices_);\n\n  // Shuffles the tests inside each test case.\n  for (size_t i = 0; i < test_cases_.size(); i++) {\n    test_cases_[i]->ShuffleTests(random());\n  }\n}\n\n// Restores the test cases and tests to their order before the first shuffle.\nvoid UnitTestImpl::UnshuffleTests() {\n  for (size_t i = 0; i < test_cases_.size(); i++) {\n    // Unshuffles the tests in each test case.\n    test_cases_[i]->UnshuffleTests();\n    // Resets the index of each test case.\n    test_case_indices_[i] = static_cast<int>(i);\n  }\n}\n\n// TestInfoImpl constructor. The new instance assumes ownership of the test\n// factory object.\nTestInfoImpl::TestInfoImpl(TestInfo* parent,\n                           const char* a_test_case_name,\n                           const char* a_name,\n                           const char* a_test_case_comment,\n                           const char* a_comment,\n                           TypeId a_fixture_class_id,\n                           internal::TestFactoryBase* factory) :\n    parent_(parent),\n    test_case_name_(String(a_test_case_name)),\n    name_(String(a_name)),\n    test_case_comment_(String(a_test_case_comment)),\n    comment_(String(a_comment)),\n    fixture_class_id_(a_fixture_class_id),\n    should_run_(false),\n    is_disabled_(false),\n    matches_filter_(false),\n    factory_(factory) {\n}\n\n// TestInfoImpl destructor.\nTestInfoImpl::~TestInfoImpl() {\n  delete factory_;\n}\n\n// Returns the current OS stack trace as a String.\n//\n// The maximum number of stack frames to be included is specified by\n// the gtest_stack_trace_depth flag.  The skip_count parameter\n// specifies the number of top frames to be skipped, which doesn't\n// count against the number of frames to be included.\n//\n// For example, if Foo() calls Bar(), which in turn calls\n// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in\n// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.\nString GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,\n                                       int skip_count) {\n  // We pass skip_count + 1 to skip this wrapper function in addition\n  // to what the user really wants to skip.\n  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);\n}\n\n// Used by the GTEST_HIDE_UNREACHABLE_CODE_ macro to suppress unreachable\n// code warnings.\nnamespace {\nclass ClassUniqueToAlwaysTrue {};\n}\n\nbool IsTrue(bool condition) { return condition; }\n\nbool AlwaysTrue() {\n#if GTEST_HAS_EXCEPTIONS\n  // This condition is always false so AlwaysTrue() never actually throws,\n  // but it makes the compiler think that it may throw.\n  if (IsTrue(false))\n    throw ClassUniqueToAlwaysTrue();\n#endif  // GTEST_HAS_EXCEPTIONS\n  return true;\n}\n\n// If *pstr starts with the given prefix, modifies *pstr to be right\n// past the prefix and returns true; otherwise leaves *pstr unchanged\n// and returns false.  None of pstr, *pstr, and prefix can be NULL.\nbool SkipPrefix(const char* prefix, const char** pstr) {\n  const size_t prefix_len = strlen(prefix);\n  if (strncmp(*pstr, prefix, prefix_len) == 0) {\n    *pstr += prefix_len;\n    return true;\n  }\n  return false;\n}\n\n// Parses a string as a command line flag.  The string should have\n// the format \"--flag=value\".  When def_optional is true, the \"=value\"\n// part can be omitted.\n//\n// Returns the value of the flag, or NULL if the parsing failed.\nconst char* ParseFlagValue(const char* str,\n                           const char* flag,\n                           bool def_optional) {\n  // str and flag must not be NULL.\n  if (str == NULL || flag == NULL) return NULL;\n\n  // The flag must start with \"--\" followed by GTEST_FLAG_PREFIX_.\n  const String flag_str = String::Format(\"--%s%s\", GTEST_FLAG_PREFIX_, flag);\n  const size_t flag_len = flag_str.length();\n  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;\n\n  // Skips the flag name.\n  const char* flag_end = str + flag_len;\n\n  // When def_optional is true, it's OK to not have a \"=value\" part.\n  if (def_optional && (flag_end[0] == '\\0')) {\n    return flag_end;\n  }\n\n  // If def_optional is true and there are more characters after the\n  // flag name, or if def_optional is false, there must be a '=' after\n  // the flag name.\n  if (flag_end[0] != '=') return NULL;\n\n  // Returns the string after \"=\".\n  return flag_end + 1;\n}\n\n// Parses a string for a bool flag, in the form of either\n// \"--flag=value\" or \"--flag\".\n//\n// In the former case, the value is taken as true as long as it does\n// not start with '0', 'f', or 'F'.\n//\n// In the latter case, the value is taken as true.\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nbool ParseBoolFlag(const char* str, const char* flag, bool* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseFlagValue(str, flag, true);\n\n  // Aborts if the parsing failed.\n  if (value_str == NULL) return false;\n\n  // Converts the string value to a bool.\n  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');\n  return true;\n}\n\n// Parses a string for an Int32 flag, in the form of\n// \"--flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nbool ParseInt32Flag(const char* str, const char* flag, Int32* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseFlagValue(str, flag, false);\n\n  // Aborts if the parsing failed.\n  if (value_str == NULL) return false;\n\n  // Sets *value to the value of the flag.\n  return ParseInt32(Message() << \"The value of flag --\" << flag,\n                    value_str, value);\n}\n\n// Parses a string for a string flag, in the form of\n// \"--flag=value\".\n//\n// On success, stores the value of the flag in *value, and returns\n// true.  On failure, returns false without changing *value.\nbool ParseStringFlag(const char* str, const char* flag, String* value) {\n  // Gets the value of the flag as a string.\n  const char* const value_str = ParseFlagValue(str, flag, false);\n\n  // Aborts if the parsing failed.\n  if (value_str == NULL) return false;\n\n  // Sets *value to the value of the flag.\n  *value = value_str;\n  return true;\n}\n\n// Determines whether a string has a prefix that Google Test uses for its\n// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.\n// If Google Test detects that a command line flag has its prefix but is not\n// recognized, it will print its help message. Flags starting with\n// GTEST_INTERNAL_PREFIX_ followed by \"internal_\" are considered Google Test\n// internal flags and do not trigger the help message.\nstatic bool HasGoogleTestFlagPrefix(const char* str) {\n  return (SkipPrefix(\"--\", &str) ||\n          SkipPrefix(\"-\", &str) ||\n          SkipPrefix(\"/\", &str)) &&\n         !SkipPrefix(GTEST_FLAG_PREFIX_ \"internal_\", &str) &&\n         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||\n          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));\n}\n\n// Prints a string containing code-encoded text.  The following escape\n// sequences can be used in the string to control the text color:\n//\n//   @@    prints a single '@' character.\n//   @R    changes the color to red.\n//   @G    changes the color to green.\n//   @Y    changes the color to yellow.\n//   @D    changes to the default terminal text color.\n//\n// TODO(wan@google.com): Write tests for this once we add stdout\n// capturing to Google Test.\nstatic void PrintColorEncoded(const char* str) {\n  GTestColor color = COLOR_DEFAULT;  // The current color.\n\n  // Conceptually, we split the string into segments divided by escape\n  // sequences.  Then we print one segment at a time.  At the end of\n  // each iteration, the str pointer advances to the beginning of the\n  // next segment.\n  for (;;) {\n    const char* p = strchr(str, '@');\n    if (p == NULL) {\n      ColoredPrintf(color, \"%s\", str);\n      return;\n    }\n\n    ColoredPrintf(color, \"%s\", String(str, p - str).c_str());\n\n    const char ch = p[1];\n    str = p + 2;\n    if (ch == '@') {\n      ColoredPrintf(color, \"@\");\n    } else if (ch == 'D') {\n      color = COLOR_DEFAULT;\n    } else if (ch == 'R') {\n      color = COLOR_RED;\n    } else if (ch == 'G') {\n      color = COLOR_GREEN;\n    } else if (ch == 'Y') {\n      color = COLOR_YELLOW;\n    } else {\n      --str;\n    }\n  }\n}\n\nstatic const char kColorEncodedHelpMessage[] =\n\"This program contains tests written using \" GTEST_NAME_ \". You can use the\\n\"\n\"following command line flags to control its behavior:\\n\"\n\"\\n\"\n\"Test Selection:\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"list_tests@D\\n\"\n\"      List the names of all tests instead of running them. The name of\\n\"\n\"      TEST(Foo, Bar) is \\\"Foo.Bar\\\".\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"filter=@YPOSTIVE_PATTERNS\"\n    \"[@G-@YNEGATIVE_PATTERNS]@D\\n\"\n\"      Run only the tests whose name matches one of the positive patterns but\\n\"\n\"      none of the negative patterns. '?' matches any single character; '*'\\n\"\n\"      matches any substring; ':' separates two patterns.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"also_run_disabled_tests@D\\n\"\n\"      Run all disabled tests too.\\n\"\n\"\\n\"\n\"Test Execution:\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"repeat=@Y[COUNT]@D\\n\"\n\"      Run the tests repeatedly; use a negative count to repeat forever.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"shuffle@D\\n\"\n\"      Randomize tests' orders on every iteration.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"random_seed=@Y[NUMBER]@D\\n\"\n\"      Random number seed to use for shuffling test orders (between 1 and\\n\"\n\"      99999, or 0 to use a seed based on the current time).\\n\"\n\"\\n\"\n\"Test Output:\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\\n\"\n\"      Enable/disable colored output. The default is @Gauto@D.\\n\"\n\"  -@G-\" GTEST_FLAG_PREFIX_ \"print_time=0@D\\n\"\n\"      Don't print the elapsed time of each test.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"output=xml@Y[@G:@YDIRECTORY_PATH@G\"\n    GTEST_PATH_SEP_ \"@Y|@G:@YFILE_PATH]@D\\n\"\n\"      Generate an XML report in the given directory or with the given file\\n\"\n\"      name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\\n\"\n\"\\n\"\n\"Assertion Behavior:\\n\"\n#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS\n\"  @G--\" GTEST_FLAG_PREFIX_ \"death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\\n\"\n\"      Set the default death test style.\\n\"\n#endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS\n\"  @G--\" GTEST_FLAG_PREFIX_ \"break_on_failure@D\\n\"\n\"      Turn assertion failures into debugger break-points.\\n\"\n\"  @G--\" GTEST_FLAG_PREFIX_ \"throw_on_failure@D\\n\"\n\"      Turn assertion failures into C++ exceptions.\\n\"\n#if GTEST_OS_WINDOWS\n\"  @G--\" GTEST_FLAG_PREFIX_ \"catch_exceptions@D\\n\"\n\"      Suppress pop-ups caused by exceptions.\\n\"\n#endif  // GTEST_OS_WINDOWS\n\"\\n\"\n\"Except for @G--\" GTEST_FLAG_PREFIX_ \"list_tests@D, you can alternatively set \"\n    \"the corresponding\\n\"\n\"environment variable of a flag (all letters in upper-case). For example, to\\n\"\n\"disable colored text output, you can either specify @G--\" GTEST_FLAG_PREFIX_\n    \"color=no@D or set\\n\"\n\"the @G\" GTEST_FLAG_PREFIX_UPPER_ \"COLOR@D environment variable to @Gno@D.\\n\"\n\"\\n\"\n\"For more information, please read the \" GTEST_NAME_ \" documentation at\\n\"\n\"@G\" GTEST_PROJECT_URL_ \"@D. If you find a bug in \" GTEST_NAME_ \"\\n\"\n\"(not one in your own code or tests), please report it to\\n\"\n\"@G<\" GTEST_DEV_EMAIL_ \">@D.\\n\";\n\n// Parses the command line for Google Test flags, without initializing\n// other parts of Google Test.  The type parameter CharType can be\n// instantiated to either char or wchar_t.\ntemplate <typename CharType>\nvoid ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {\n  for (int i = 1; i < *argc; i++) {\n    const String arg_string = StreamableToString(argv[i]);\n    const char* const arg = arg_string.c_str();\n\n    using internal::ParseBoolFlag;\n    using internal::ParseInt32Flag;\n    using internal::ParseStringFlag;\n\n    // Do we see a Google Test flag?\n    if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,\n                      &GTEST_FLAG(also_run_disabled_tests)) ||\n        ParseBoolFlag(arg, kBreakOnFailureFlag,\n                      &GTEST_FLAG(break_on_failure)) ||\n        ParseBoolFlag(arg, kCatchExceptionsFlag,\n                      &GTEST_FLAG(catch_exceptions)) ||\n        ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||\n        ParseStringFlag(arg, kDeathTestStyleFlag,\n                        &GTEST_FLAG(death_test_style)) ||\n        ParseBoolFlag(arg, kDeathTestUseFork,\n                      &GTEST_FLAG(death_test_use_fork)) ||\n        ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||\n        ParseStringFlag(arg, kInternalRunDeathTestFlag,\n                        &GTEST_FLAG(internal_run_death_test)) ||\n        ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||\n        ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||\n        ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||\n        ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||\n        ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||\n        ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||\n        ParseInt32Flag(arg, kStackTraceDepthFlag,\n                       &GTEST_FLAG(stack_trace_depth)) ||\n        ParseBoolFlag(arg, kThrowOnFailureFlag, &GTEST_FLAG(throw_on_failure))\n        ) {\n      // Yes.  Shift the remainder of the argv list left by one.  Note\n      // that argv has (*argc + 1) elements, the last one always being\n      // NULL.  The following loop moves the trailing NULL element as\n      // well.\n      for (int j = i; j != *argc; j++) {\n        argv[j] = argv[j + 1];\n      }\n\n      // Decrements the argument count.\n      (*argc)--;\n\n      // We also need to decrement the iterator as we just removed\n      // an element.\n      i--;\n    } else if (arg_string == \"--help\" || arg_string == \"-h\" ||\n               arg_string == \"-?\" || arg_string == \"/?\" ||\n               HasGoogleTestFlagPrefix(arg)) {\n      // Both help flag and unrecognized Google Test flags (excluding\n      // internal ones) trigger help display.\n      g_help_flag = true;\n    }\n  }\n\n  if (g_help_flag) {\n    // We print the help here instead of in RUN_ALL_TESTS(), as the\n    // latter may not be called at all if the user is using Google\n    // Test with another testing framework.\n    PrintColorEncoded(kColorEncodedHelpMessage);\n  }\n}\n\n// Parses the command line for Google Test flags, without initializing\n// other parts of Google Test.\nvoid ParseGoogleTestFlagsOnly(int* argc, char** argv) {\n  ParseGoogleTestFlagsOnlyImpl(argc, argv);\n}\nvoid ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {\n  ParseGoogleTestFlagsOnlyImpl(argc, argv);\n}\n\n// The internal implementation of InitGoogleTest().\n//\n// The type parameter CharType can be instantiated to either char or\n// wchar_t.\ntemplate <typename CharType>\nvoid InitGoogleTestImpl(int* argc, CharType** argv) {\n  g_init_gtest_count++;\n\n  // We don't want to run the initialization code twice.\n  if (g_init_gtest_count != 1) return;\n\n  if (*argc <= 0) return;\n\n  internal::g_executable_path = internal::StreamableToString(argv[0]);\n\n#if GTEST_HAS_DEATH_TEST\n  g_argvs.clear();\n  for (int i = 0; i != *argc; i++) {\n    g_argvs.push_back(StreamableToString(argv[i]));\n  }\n#endif  // GTEST_HAS_DEATH_TEST\n\n  ParseGoogleTestFlagsOnly(argc, argv);\n  GetUnitTestImpl()->PostFlagParsingInit();\n}\n\n}  // namespace internal\n\n// Initializes Google Test.  This must be called before calling\n// RUN_ALL_TESTS().  In particular, it parses a command line for the\n// flags that Google Test recognizes.  Whenever a Google Test flag is\n// seen, it is removed from argv, and *argc is decremented.\n//\n// No value is returned.  Instead, the Google Test flag variables are\n// updated.\n//\n// Calling the function for the second time has no user-visible effect.\nvoid InitGoogleTest(int* argc, char** argv) {\n  internal::InitGoogleTestImpl(argc, argv);\n}\n\n// This overloaded version can be used in Windows programs compiled in\n// UNICODE mode.\nvoid InitGoogleTest(int* argc, wchar_t** argv) {\n  internal::InitGoogleTestImpl(argc, argv);\n}\n\n}  // namespace testing\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest_main.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include <iostream>\n\n#include <gtest/gtest.h>\n\nint main(int argc, char **argv) {\n  std::cout << \"Running main() from gtest_main.cc\\n\";\n\n  testing::InitGoogleTest(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-death-test_test.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// Tests for death tests.\n\n#include <gtest/gtest-death-test.h>\n#include <gtest/gtest.h>\n#include <gtest/internal/gtest-filepath.h>\n\nusing testing::internal::AlwaysFalse;\nusing testing::internal::AlwaysTrue;\n\n#if GTEST_HAS_DEATH_TEST\n\n#if GTEST_OS_WINDOWS\n#include <direct.h>          // For chdir().\n#else\n#include <unistd.h>\n#include <sys/wait.h>        // For waitpid.\n#include <limits>            // For std::numeric_limits.\n#endif  // GTEST_OS_WINDOWS\n\n#include <limits.h>\n#include <signal.h>\n#include <stdio.h>\n\n#include <gtest/gtest-spi.h>\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\nnamespace posix = ::testing::internal::posix;\n\nusing testing::Message;\nusing testing::internal::DeathTest;\nusing testing::internal::DeathTestFactory;\nusing testing::internal::FilePath;\nusing testing::internal::GetLastErrnoDescription;\nusing testing::internal::GetUnitTestImpl;\nusing testing::internal::ParseNaturalNumber;\nusing testing::internal::String;\n\nnamespace testing {\nnamespace internal {\n\n// A helper class whose objects replace the death test factory for a\n// single UnitTest object during their lifetimes.\nclass ReplaceDeathTestFactory {\n public:\n  explicit ReplaceDeathTestFactory(DeathTestFactory* new_factory)\n      : unit_test_impl_(GetUnitTestImpl()) {\n    old_factory_ = unit_test_impl_->death_test_factory_.release();\n    unit_test_impl_->death_test_factory_.reset(new_factory);\n  }\n\n  ~ReplaceDeathTestFactory() {\n    unit_test_impl_->death_test_factory_.release();\n    unit_test_impl_->death_test_factory_.reset(old_factory_);\n  }\n private:\n  // Prevents copying ReplaceDeathTestFactory objects.\n  ReplaceDeathTestFactory(const ReplaceDeathTestFactory&);\n  void operator=(const ReplaceDeathTestFactory&);\n\n  UnitTestImpl* unit_test_impl_;\n  DeathTestFactory* old_factory_;\n};\n\n}  // namespace internal\n}  // namespace testing\n\nvoid DieInside(const char* function) {\n  fprintf(stderr, \"death inside %s().\", function);\n  fflush(stderr);\n  // We call _exit() instead of exit(), as the former is a direct\n  // system call and thus safer in the presence of threads.  exit()\n  // will invoke user-defined exit-hooks, which may do dangerous\n  // things that conflict with death tests.\n  //\n  // Some compilers can recognize that _exit() never returns and issue the\n  // 'unreachable code' warning for code following this function, unless\n  // fooled by a fake condition.\n  if (AlwaysTrue())\n    _exit(1);\n}\n\n// Tests that death tests work.\n\nclass TestForDeathTest : public testing::Test {\n protected:\n  TestForDeathTest() : original_dir_(FilePath::GetCurrentDir()) {}\n\n  virtual ~TestForDeathTest() {\n    posix::ChDir(original_dir_.c_str());\n  }\n\n  // A static member function that's expected to die.\n  static void StaticMemberFunction() { DieInside(\"StaticMemberFunction\"); }\n\n  // A method of the test fixture that may die.\n  void MemberFunction() {\n    if (should_die_)\n      DieInside(\"MemberFunction\");\n  }\n\n  // True iff MemberFunction() should die.\n  bool should_die_;\n  const FilePath original_dir_;\n};\n\n// A class with a member function that may die.\nclass MayDie {\n public:\n  explicit MayDie(bool should_die) : should_die_(should_die) {}\n\n  // A member function that may die.\n  void MemberFunction() const {\n    if (should_die_)\n      DieInside(\"MayDie::MemberFunction\");\n  }\n\n private:\n  // True iff MemberFunction() should die.\n  bool should_die_;\n};\n\n// A global function that's expected to die.\nvoid GlobalFunction() { DieInside(\"GlobalFunction\"); }\n\n// A non-void function that's expected to die.\nint NonVoidFunction() {\n  DieInside(\"NonVoidFunction\");\n  return 1;\n}\n\n// A unary function that may die.\nvoid DieIf(bool should_die) {\n  if (should_die)\n    DieInside(\"DieIf\");\n}\n\n// A binary function that may die.\nbool DieIfLessThan(int x, int y) {\n  if (x < y) {\n    DieInside(\"DieIfLessThan\");\n  }\n  return true;\n}\n\n// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.\nvoid DeathTestSubroutine() {\n  EXPECT_DEATH(GlobalFunction(), \"death.*GlobalFunction\");\n  ASSERT_DEATH(GlobalFunction(), \"death.*GlobalFunction\");\n}\n\n// Death in dbg, not opt.\nint DieInDebugElse12(int* sideeffect) {\n  if (sideeffect) *sideeffect = 12;\n#ifndef NDEBUG\n  DieInside(\"DieInDebugElse12\");\n#endif  // NDEBUG\n  return 12;\n}\n\n#if GTEST_OS_WINDOWS\n\n// Tests the ExitedWithCode predicate.\nTEST(ExitStatusPredicateTest, ExitedWithCode) {\n  // On Windows, the process's exit code is the same as its exit status,\n  // so the predicate just compares the its input with its parameter.\n  EXPECT_TRUE(testing::ExitedWithCode(0)(0));\n  EXPECT_TRUE(testing::ExitedWithCode(1)(1));\n  EXPECT_TRUE(testing::ExitedWithCode(42)(42));\n  EXPECT_FALSE(testing::ExitedWithCode(0)(1));\n  EXPECT_FALSE(testing::ExitedWithCode(1)(0));\n}\n\n#else\n\n// Returns the exit status of a process that calls _exit(2) with a\n// given exit code.  This is a helper function for the\n// ExitStatusPredicateTest test suite.\nstatic int NormalExitStatus(int exit_code) {\n  pid_t child_pid = fork();\n  if (child_pid == 0) {\n    _exit(exit_code);\n  }\n  int status;\n  waitpid(child_pid, &status, 0);\n  return status;\n}\n\n// Returns the exit status of a process that raises a given signal.\n// If the signal does not cause the process to die, then it returns\n// instead the exit status of a process that exits normally with exit\n// code 1.  This is a helper function for the ExitStatusPredicateTest\n// test suite.\nstatic int KilledExitStatus(int signum) {\n  pid_t child_pid = fork();\n  if (child_pid == 0) {\n    raise(signum);\n    _exit(1);\n  }\n  int status;\n  waitpid(child_pid, &status, 0);\n  return status;\n}\n\n// Tests the ExitedWithCode predicate.\nTEST(ExitStatusPredicateTest, ExitedWithCode) {\n  const int status0  = NormalExitStatus(0);\n  const int status1  = NormalExitStatus(1);\n  const int status42 = NormalExitStatus(42);\n  const testing::ExitedWithCode pred0(0);\n  const testing::ExitedWithCode pred1(1);\n  const testing::ExitedWithCode pred42(42);\n  EXPECT_PRED1(pred0,  status0);\n  EXPECT_PRED1(pred1,  status1);\n  EXPECT_PRED1(pred42, status42);\n  EXPECT_FALSE(pred0(status1));\n  EXPECT_FALSE(pred42(status0));\n  EXPECT_FALSE(pred1(status42));\n}\n\n// Tests the KilledBySignal predicate.\nTEST(ExitStatusPredicateTest, KilledBySignal) {\n  const int status_segv = KilledExitStatus(SIGSEGV);\n  const int status_kill = KilledExitStatus(SIGKILL);\n  const testing::KilledBySignal pred_segv(SIGSEGV);\n  const testing::KilledBySignal pred_kill(SIGKILL);\n  EXPECT_PRED1(pred_segv, status_segv);\n  EXPECT_PRED1(pred_kill, status_kill);\n  EXPECT_FALSE(pred_segv(status_kill));\n  EXPECT_FALSE(pred_kill(status_segv));\n}\n\n#endif  // GTEST_OS_WINDOWS\n\n// Tests that the death test macros expand to code which may or may not\n// be followed by operator<<, and that in either case the complete text\n// comprises only a single C++ statement.\nTEST_F(TestForDeathTest, SingleStatement) {\n  if (AlwaysFalse())\n    // This would fail if executed; this is a compilation test only\n    ASSERT_DEATH(return, \"\");\n\n  if (AlwaysTrue())\n    EXPECT_DEATH(_exit(1), \"\");\n  else\n    // This empty \"else\" branch is meant to ensure that EXPECT_DEATH\n    // doesn't expand into an \"if\" statement without an \"else\"\n    ;\n\n  if (AlwaysFalse())\n    ASSERT_DEATH(return, \"\") << \"did not die\";\n\n  if (AlwaysFalse())\n    ;\n  else\n    EXPECT_DEATH(_exit(1), \"\") << 1 << 2 << 3;\n}\n\nvoid DieWithEmbeddedNul() {\n  fprintf(stderr, \"Hello%cmy null world.\\n\", '\\0');\n  fflush(stderr);\n  _exit(1);\n}\n\n#if GTEST_USES_PCRE\n// Tests that EXPECT_DEATH and ASSERT_DEATH work when the error\n// message has a NUL character in it.\nTEST_F(TestForDeathTest, EmbeddedNulInMessage) {\n  // TODO(wan@google.com): <regex.h> doesn't support matching strings\n  // with embedded NUL characters - find a way to workaround it.\n  EXPECT_DEATH(DieWithEmbeddedNul(), \"my null world\");\n  ASSERT_DEATH(DieWithEmbeddedNul(), \"my null world\");\n}\n#endif  // GTEST_USES_PCRE\n\n// Tests that death test macros expand to code which interacts well with switch\n// statements.\nTEST_F(TestForDeathTest, SwitchStatement) {\n// Microsoft compiler usually complains about switch statements without\n// case labels. We suppress that warning for this test.\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable: 4065)\n#endif  // _MSC_VER\n\n  switch (0)\n    default:\n      ASSERT_DEATH(_exit(1), \"\") << \"exit in default switch handler\";\n\n  switch (0)\n    case 0:\n      EXPECT_DEATH(_exit(1), \"\") << \"exit in switch case\";\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif  // _MSC_VER\n}\n\n// Tests that a static member function can be used in a \"fast\" style\n// death test.\nTEST_F(TestForDeathTest, StaticMemberFunctionFastStyle) {\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n  ASSERT_DEATH(StaticMemberFunction(), \"death.*StaticMember\");\n}\n\n// Tests that a method of the test fixture can be used in a \"fast\"\n// style death test.\nTEST_F(TestForDeathTest, MemberFunctionFastStyle) {\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n  should_die_ = true;\n  EXPECT_DEATH(MemberFunction(), \"inside.*MemberFunction\");\n}\n\nvoid ChangeToRootDir() { posix::ChDir(GTEST_PATH_SEP_); }\n\n// Tests that death tests work even if the current directory has been\n// changed.\nTEST_F(TestForDeathTest, FastDeathTestInChangedDir) {\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n\n  ChangeToRootDir();\n  EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), \"\");\n\n  ChangeToRootDir();\n  ASSERT_DEATH(_exit(1), \"\");\n}\n\n// Repeats a representative sample of death tests in the \"threadsafe\" style:\n\nTEST_F(TestForDeathTest, StaticMemberFunctionThreadsafeStyle) {\n  testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n  ASSERT_DEATH(StaticMemberFunction(), \"death.*StaticMember\");\n}\n\nTEST_F(TestForDeathTest, MemberFunctionThreadsafeStyle) {\n  testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n  should_die_ = true;\n  EXPECT_DEATH(MemberFunction(), \"inside.*MemberFunction\");\n}\n\nTEST_F(TestForDeathTest, ThreadsafeDeathTestInLoop) {\n  testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n\n  for (int i = 0; i < 3; ++i)\n    EXPECT_EXIT(_exit(i), testing::ExitedWithCode(i), \"\") << \": i = \" << i;\n}\n\nTEST_F(TestForDeathTest, ThreadsafeDeathTestInChangedDir) {\n  testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n\n  ChangeToRootDir();\n  EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), \"\");\n\n  ChangeToRootDir();\n  ASSERT_DEATH(_exit(1), \"\");\n}\n\nTEST_F(TestForDeathTest, MixedStyles) {\n  testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n  EXPECT_DEATH(_exit(1), \"\");\n  testing::GTEST_FLAG(death_test_style) = \"fast\";\n  EXPECT_DEATH(_exit(1), \"\");\n}\n\nnamespace {\n\nbool pthread_flag;\n\nvoid SetPthreadFlag() {\n  pthread_flag = true;\n}\n\n}  // namespace\n\n#if GTEST_HAS_CLONE && GTEST_HAS_PTHREAD\n\nTEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) {\n  if (!testing::GTEST_FLAG(death_test_use_fork)) {\n    testing::GTEST_FLAG(death_test_style) = \"threadsafe\";\n    pthread_flag = false;\n    ASSERT_EQ(0, pthread_atfork(&SetPthreadFlag, NULL, NULL));\n    ASSERT_DEATH(_exit(1), \"\");\n    ASSERT_FALSE(pthread_flag);\n  }\n}\n\n#endif  // GTEST_HAS_CLONE && GTEST_HAS_PTHREAD\n\n// Tests that a method of another class can be used in a death test.\nTEST_F(TestForDeathTest, MethodOfAnotherClass) {\n  const MayDie x(true);\n  ASSERT_DEATH(x.MemberFunction(), \"MayDie\\\\:\\\\:MemberFunction\");\n}\n\n// Tests that a global function can be used in a death test.\nTEST_F(TestForDeathTest, GlobalFunction) {\n  EXPECT_DEATH(GlobalFunction(), \"GlobalFunction\");\n}\n\n// Tests that any value convertible to an RE works as a second\n// argument to EXPECT_DEATH.\nTEST_F(TestForDeathTest, AcceptsAnythingConvertibleToRE) {\n  static const char regex_c_str[] = \"GlobalFunction\";\n  EXPECT_DEATH(GlobalFunction(), regex_c_str);\n\n  const testing::internal::RE regex(regex_c_str);\n  EXPECT_DEATH(GlobalFunction(), regex);\n\n#if GTEST_HAS_GLOBAL_STRING\n  const string regex_str(regex_c_str);\n  EXPECT_DEATH(GlobalFunction(), regex_str);\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n  const ::std::string regex_std_str(regex_c_str);\n  EXPECT_DEATH(GlobalFunction(), regex_std_str);\n}\n\n// Tests that a non-void function can be used in a death test.\nTEST_F(TestForDeathTest, NonVoidFunction) {\n  ASSERT_DEATH(NonVoidFunction(), \"NonVoidFunction\");\n}\n\n// Tests that functions that take parameter(s) can be used in a death test.\nTEST_F(TestForDeathTest, FunctionWithParameter) {\n  EXPECT_DEATH(DieIf(true), \"DieIf\\\\(\\\\)\");\n  EXPECT_DEATH(DieIfLessThan(2, 3), \"DieIfLessThan\");\n}\n\n// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.\nTEST_F(TestForDeathTest, OutsideFixture) {\n  DeathTestSubroutine();\n}\n\n// Tests that death tests can be done inside a loop.\nTEST_F(TestForDeathTest, InsideLoop) {\n  for (int i = 0; i < 5; i++) {\n    EXPECT_DEATH(DieIfLessThan(-1, i), \"DieIfLessThan\") << \"where i == \" << i;\n  }\n}\n\n// Tests that a compound statement can be used in a death test.\nTEST_F(TestForDeathTest, CompoundStatement) {\n  EXPECT_DEATH({  // NOLINT\n    const int x = 2;\n    const int y = x + 1;\n    DieIfLessThan(x, y);\n  },\n  \"DieIfLessThan\");\n}\n\n// Tests that code that doesn't die causes a death test to fail.\nTEST_F(TestForDeathTest, DoesNotDie) {\n  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(DieIf(false), \"DieIf\"),\n                          \"failed to die\");\n}\n\n// Tests that a death test fails when the error message isn't expected.\nTEST_F(TestForDeathTest, ErrorMessageMismatch) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_DEATH(DieIf(true), \"DieIfLessThan\") << \"End of death test message.\";\n  }, \"died but not with expected error\");\n}\n\n// On exit, *aborted will be true iff the EXPECT_DEATH() statement\n// aborted the function.\nvoid ExpectDeathTestHelper(bool* aborted) {\n  *aborted = true;\n  EXPECT_DEATH(DieIf(false), \"DieIf\");  // This assertion should fail.\n  *aborted = false;\n}\n\n// Tests that EXPECT_DEATH doesn't abort the test on failure.\nTEST_F(TestForDeathTest, EXPECT_DEATH) {\n  bool aborted = true;\n  EXPECT_NONFATAL_FAILURE(ExpectDeathTestHelper(&aborted),\n                          \"failed to die\");\n  EXPECT_FALSE(aborted);\n}\n\n// Tests that ASSERT_DEATH does abort the test on failure.\nTEST_F(TestForDeathTest, ASSERT_DEATH) {\n  static bool aborted;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    aborted = true;\n    ASSERT_DEATH(DieIf(false), \"DieIf\");  // This assertion should fail.\n    aborted = false;\n  }, \"failed to die\");\n  EXPECT_TRUE(aborted);\n}\n\n// Tests that EXPECT_DEATH evaluates the arguments exactly once.\nTEST_F(TestForDeathTest, SingleEvaluation) {\n  int x = 3;\n  EXPECT_DEATH(DieIf((++x) == 4), \"DieIf\");\n\n  const char* regex = \"DieIf\";\n  const char* regex_save = regex;\n  EXPECT_DEATH(DieIfLessThan(3, 4), regex++);\n  EXPECT_EQ(regex_save + 1, regex);\n}\n\n// Tests that run-away death tests are reported as failures.\nTEST_F(TestForDeathTest, Runaway) {\n  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(static_cast<void>(0), \"Foo\"),\n                          \"failed to die.\");\n\n  EXPECT_FATAL_FAILURE(ASSERT_DEATH(return, \"Bar\"),\n                       \"illegal return in test statement.\");\n}\n\n\n// Tests that EXPECT_DEBUG_DEATH works as expected,\n// that is, in debug mode, it:\n// 1. Asserts on death.\n// 2. Has no side effect.\n//\n// And in opt mode, it:\n// 1.  Has side effects but does not assert.\nTEST_F(TestForDeathTest, TestExpectDebugDeath) {\n  int sideeffect = 0;\n\n  EXPECT_DEBUG_DEATH(DieInDebugElse12(&sideeffect),\n                     \"death.*DieInDebugElse12\");\n\n#ifdef NDEBUG\n  // Checks that the assignment occurs in opt mode (sideeffect).\n  EXPECT_EQ(12, sideeffect);\n#else\n  // Checks that the assignment does not occur in dbg mode (no sideeffect).\n  EXPECT_EQ(0, sideeffect);\n#endif\n}\n\n// Tests that ASSERT_DEBUG_DEATH works as expected\n// In debug mode:\n// 1. Asserts on debug death.\n// 2. Has no side effect.\n//\n// In opt mode:\n// 1. Has side effects and returns the expected value (12).\nTEST_F(TestForDeathTest, TestAssertDebugDeath) {\n  int sideeffect = 0;\n\n  ASSERT_DEBUG_DEATH({  // NOLINT\n    // Tests that the return value is 12 in opt mode.\n    EXPECT_EQ(12, DieInDebugElse12(&sideeffect));\n    // Tests that the side effect occurred in opt mode.\n    EXPECT_EQ(12, sideeffect);\n  }, \"death.*DieInDebugElse12\");\n\n#ifdef NDEBUG\n  // Checks that the assignment occurs in opt mode (sideeffect).\n  EXPECT_EQ(12, sideeffect);\n#else\n  // Checks that the assignment does not occur in dbg mode (no sideeffect).\n  EXPECT_EQ(0, sideeffect);\n#endif\n}\n\n#ifndef NDEBUG\n\nvoid ExpectDebugDeathHelper(bool* aborted) {\n  *aborted = true;\n  EXPECT_DEBUG_DEATH(return, \"\") << \"This is expected to fail.\";\n  *aborted = false;\n}\n\n#if GTEST_OS_WINDOWS\nTEST(PopUpDeathTest, DoesNotShowPopUpOnAbort) {\n  printf(\"This test should be considered failing if it shows \"\n         \"any pop-up dialogs.\\n\");\n  fflush(stdout);\n\n  EXPECT_DEATH({\n    testing::GTEST_FLAG(catch_exceptions) = false;\n    abort();\n  }, \"\");\n}\n\nTEST(PopUpDeathTest, DoesNotShowPopUpOnThrow) {\n  printf(\"This test should be considered failing if it shows \"\n         \"any pop-up dialogs.\\n\");\n  fflush(stdout);\n\n  EXPECT_DEATH({\n    testing::GTEST_FLAG(catch_exceptions) = false;\n    throw 1;\n  }, \"\");\n}\n#endif  // GTEST_OS_WINDOWS\n\n// Tests that EXPECT_DEBUG_DEATH in debug mode does not abort\n// the function.\nTEST_F(TestForDeathTest, ExpectDebugDeathDoesNotAbort) {\n  bool aborted = true;\n  EXPECT_NONFATAL_FAILURE(ExpectDebugDeathHelper(&aborted), \"\");\n  EXPECT_FALSE(aborted);\n}\n\nvoid AssertDebugDeathHelper(bool* aborted) {\n  *aborted = true;\n  ASSERT_DEBUG_DEATH(return, \"\") << \"This is expected to fail.\";\n  *aborted = false;\n}\n\n// Tests that ASSERT_DEBUG_DEATH in debug mode aborts the function on\n// failure.\nTEST_F(TestForDeathTest, AssertDebugDeathAborts) {\n  static bool aborted;\n  aborted = false;\n  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), \"\");\n  EXPECT_TRUE(aborted);\n}\n\n#endif  // _NDEBUG\n\n// Tests the *_EXIT family of macros, using a variety of predicates.\nstatic void TestExitMacros() {\n  EXPECT_EXIT(_exit(1),  testing::ExitedWithCode(1),  \"\");\n  ASSERT_EXIT(_exit(42), testing::ExitedWithCode(42), \"\");\n\n#if GTEST_OS_WINDOWS\n  // Of all signals effects on the process exit code, only those of SIGABRT\n  // are documented on Windows.\n  // See http://msdn.microsoft.com/en-us/library/dwwzkt4c(VS.71).aspx.\n  EXPECT_EXIT(raise(SIGABRT), testing::ExitedWithCode(3), \"\");\n#else\n  EXPECT_EXIT(raise(SIGKILL), testing::KilledBySignal(SIGKILL), \"\") << \"foo\";\n  ASSERT_EXIT(raise(SIGUSR2), testing::KilledBySignal(SIGUSR2), \"\") << \"bar\";\n\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_EXIT(_exit(0), testing::KilledBySignal(SIGSEGV), \"\")\n        << \"This failure is expected, too.\";\n  }, \"This failure is expected, too.\");\n#endif  // GTEST_OS_WINDOWS\n\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_EXIT(raise(SIGSEGV), testing::ExitedWithCode(0), \"\")\n        << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n}\n\nTEST_F(TestForDeathTest, ExitMacros) {\n  TestExitMacros();\n}\n\nTEST_F(TestForDeathTest, ExitMacrosUsingFork) {\n  testing::GTEST_FLAG(death_test_use_fork) = true;\n  TestExitMacros();\n}\n\nTEST_F(TestForDeathTest, InvalidStyle) {\n  testing::GTEST_FLAG(death_test_style) = \"rococo\";\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_DEATH(_exit(0), \"\") << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n}\n\n// A DeathTestFactory that returns MockDeathTests.\nclass MockDeathTestFactory : public DeathTestFactory {\n public:\n  MockDeathTestFactory();\n  virtual bool Create(const char* statement,\n                      const ::testing::internal::RE* regex,\n                      const char* file, int line, DeathTest** test);\n\n  // Sets the parameters for subsequent calls to Create.\n  void SetParameters(bool create, DeathTest::TestRole role,\n                     int status, bool passed);\n\n  // Accessors.\n  int AssumeRoleCalls() const { return assume_role_calls_; }\n  int WaitCalls() const { return wait_calls_; }\n  int PassedCalls() const { return passed_args_.size(); }\n  bool PassedArgument(int n) const { return passed_args_[n]; }\n  int AbortCalls() const { return abort_args_.size(); }\n  DeathTest::AbortReason AbortArgument(int n) const {\n    return abort_args_[n];\n  }\n  bool TestDeleted() const { return test_deleted_; }\n\n private:\n  friend class MockDeathTest;\n  // If true, Create will return a MockDeathTest; otherwise it returns\n  // NULL.\n  bool create_;\n  // The value a MockDeathTest will return from its AssumeRole method.\n  DeathTest::TestRole role_;\n  // The value a MockDeathTest will return from its Wait method.\n  int status_;\n  // The value a MockDeathTest will return from its Passed method.\n  bool passed_;\n\n  // Number of times AssumeRole was called.\n  int assume_role_calls_;\n  // Number of times Wait was called.\n  int wait_calls_;\n  // The arguments to the calls to Passed since the last call to\n  // SetParameters.\n  std::vector<bool> passed_args_;\n  // The arguments to the calls to Abort since the last call to\n  // SetParameters.\n  std::vector<DeathTest::AbortReason> abort_args_;\n  // True if the last MockDeathTest returned by Create has been\n  // deleted.\n  bool test_deleted_;\n};\n\n\n// A DeathTest implementation useful in testing.  It returns values set\n// at its creation from its various inherited DeathTest methods, and\n// reports calls to those methods to its parent MockDeathTestFactory\n// object.\nclass MockDeathTest : public DeathTest {\n public:\n  MockDeathTest(MockDeathTestFactory *parent,\n                TestRole role, int status, bool passed) :\n      parent_(parent), role_(role), status_(status), passed_(passed) {\n  }\n  virtual ~MockDeathTest() {\n    parent_->test_deleted_ = true;\n  }\n  virtual TestRole AssumeRole() {\n    ++parent_->assume_role_calls_;\n    return role_;\n  }\n  virtual int Wait() {\n    ++parent_->wait_calls_;\n    return status_;\n  }\n  virtual bool Passed(bool exit_status_ok) {\n    parent_->passed_args_.push_back(exit_status_ok);\n    return passed_;\n  }\n  virtual void Abort(AbortReason reason) {\n    parent_->abort_args_.push_back(reason);\n  }\n private:\n  MockDeathTestFactory* const parent_;\n  const TestRole role_;\n  const int status_;\n  const bool passed_;\n};\n\n\n// MockDeathTestFactory constructor.\nMockDeathTestFactory::MockDeathTestFactory()\n    : create_(true),\n      role_(DeathTest::OVERSEE_TEST),\n      status_(0),\n      passed_(true),\n      assume_role_calls_(0),\n      wait_calls_(0),\n      passed_args_(),\n      abort_args_() {\n}\n\n\n// Sets the parameters for subsequent calls to Create.\nvoid MockDeathTestFactory::SetParameters(bool create,\n                                         DeathTest::TestRole role,\n                                         int status, bool passed) {\n  create_ = create;\n  role_ = role;\n  status_ = status;\n  passed_ = passed;\n\n  assume_role_calls_ = 0;\n  wait_calls_ = 0;\n  passed_args_.clear();\n  abort_args_.clear();\n}\n\n\n// Sets test to NULL (if create_ is false) or to the address of a new\n// MockDeathTest object with parameters taken from the last call\n// to SetParameters (if create_ is true).  Always returns true.\nbool MockDeathTestFactory::Create(const char* /*statement*/,\n                                  const ::testing::internal::RE* /*regex*/,\n                                  const char* /*file*/,\n                                  int /*line*/,\n                                  DeathTest** test) {\n  test_deleted_ = false;\n  if (create_) {\n    *test = new MockDeathTest(this, role_, status_, passed_);\n  } else {\n    *test = NULL;\n  }\n  return true;\n}\n\n// A test fixture for testing the logic of the GTEST_DEATH_TEST_ macro.\n// It installs a MockDeathTestFactory that is used for the duration\n// of the test case.\nclass MacroLogicDeathTest : public testing::Test {\n protected:\n  static testing::internal::ReplaceDeathTestFactory* replacer_;\n  static MockDeathTestFactory* factory_;\n\n  static void SetUpTestCase() {\n    factory_ = new MockDeathTestFactory;\n    replacer_ = new testing::internal::ReplaceDeathTestFactory(factory_);\n  }\n\n  static void TearDownTestCase() {\n    delete replacer_;\n    replacer_ = NULL;\n    delete factory_;\n    factory_ = NULL;\n  }\n\n  // Runs a death test that breaks the rules by returning.  Such a death\n  // test cannot be run directly from a test routine that uses a\n  // MockDeathTest, or the remainder of the routine will not be executed.\n  static void RunReturningDeathTest(bool* flag) {\n    ASSERT_DEATH({  // NOLINT\n      *flag = true;\n      return;\n    }, \"\");\n  }\n};\n\ntesting::internal::ReplaceDeathTestFactory* MacroLogicDeathTest::replacer_\n    = NULL;\nMockDeathTestFactory* MacroLogicDeathTest::factory_ = NULL;\n\n\n// Test that nothing happens when the factory doesn't return a DeathTest:\nTEST_F(MacroLogicDeathTest, NothingHappens) {\n  bool flag = false;\n  factory_->SetParameters(false, DeathTest::OVERSEE_TEST, 0, true);\n  EXPECT_DEATH(flag = true, \"\");\n  EXPECT_FALSE(flag);\n  EXPECT_EQ(0, factory_->AssumeRoleCalls());\n  EXPECT_EQ(0, factory_->WaitCalls());\n  EXPECT_EQ(0, factory_->PassedCalls());\n  EXPECT_EQ(0, factory_->AbortCalls());\n  EXPECT_FALSE(factory_->TestDeleted());\n}\n\n// Test that the parent process doesn't run the death test code,\n// and that the Passed method returns false when the (simulated)\n// child process exits with status 0:\nTEST_F(MacroLogicDeathTest, ChildExitsSuccessfully) {\n  bool flag = false;\n  factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 0, true);\n  EXPECT_DEATH(flag = true, \"\");\n  EXPECT_FALSE(flag);\n  EXPECT_EQ(1, factory_->AssumeRoleCalls());\n  EXPECT_EQ(1, factory_->WaitCalls());\n  ASSERT_EQ(1, factory_->PassedCalls());\n  EXPECT_FALSE(factory_->PassedArgument(0));\n  EXPECT_EQ(0, factory_->AbortCalls());\n  EXPECT_TRUE(factory_->TestDeleted());\n}\n\n// Tests that the Passed method was given the argument \"true\" when\n// the (simulated) child process exits with status 1:\nTEST_F(MacroLogicDeathTest, ChildExitsUnsuccessfully) {\n  bool flag = false;\n  factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 1, true);\n  EXPECT_DEATH(flag = true, \"\");\n  EXPECT_FALSE(flag);\n  EXPECT_EQ(1, factory_->AssumeRoleCalls());\n  EXPECT_EQ(1, factory_->WaitCalls());\n  ASSERT_EQ(1, factory_->PassedCalls());\n  EXPECT_TRUE(factory_->PassedArgument(0));\n  EXPECT_EQ(0, factory_->AbortCalls());\n  EXPECT_TRUE(factory_->TestDeleted());\n}\n\n// Tests that the (simulated) child process executes the death test\n// code, and is aborted with the correct AbortReason if it\n// executes a return statement.\nTEST_F(MacroLogicDeathTest, ChildPerformsReturn) {\n  bool flag = false;\n  factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);\n  RunReturningDeathTest(&flag);\n  EXPECT_TRUE(flag);\n  EXPECT_EQ(1, factory_->AssumeRoleCalls());\n  EXPECT_EQ(0, factory_->WaitCalls());\n  EXPECT_EQ(0, factory_->PassedCalls());\n  EXPECT_EQ(1, factory_->AbortCalls());\n  EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,\n            factory_->AbortArgument(0));\n  EXPECT_TRUE(factory_->TestDeleted());\n}\n\n// Tests that the (simulated) child process is aborted with the\n// correct AbortReason if it does not die.\nTEST_F(MacroLogicDeathTest, ChildDoesNotDie) {\n  bool flag = false;\n  factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);\n  EXPECT_DEATH(flag = true, \"\");\n  EXPECT_TRUE(flag);\n  EXPECT_EQ(1, factory_->AssumeRoleCalls());\n  EXPECT_EQ(0, factory_->WaitCalls());\n  EXPECT_EQ(0, factory_->PassedCalls());\n  // This time there are two calls to Abort: one since the test didn't\n  // die, and another from the ReturnSentinel when it's destroyed.  The\n  // sentinel normally isn't destroyed if a test doesn't die, since\n  // _exit(2) is called in that case by ForkingDeathTest, but not by\n  // our MockDeathTest.\n  ASSERT_EQ(2, factory_->AbortCalls());\n  EXPECT_EQ(DeathTest::TEST_DID_NOT_DIE,\n            factory_->AbortArgument(0));\n  EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,\n            factory_->AbortArgument(1));\n  EXPECT_TRUE(factory_->TestDeleted());\n}\n\n// Tests that a successful death test does not register a successful\n// test part.\nTEST(SuccessRegistrationDeathTest, NoSuccessPart) {\n  EXPECT_DEATH(_exit(1), \"\");\n  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());\n}\n\nTEST(StreamingAssertionsDeathTest, DeathTest) {\n  EXPECT_DEATH(_exit(1), \"\") << \"unexpected failure\";\n  ASSERT_DEATH(_exit(1), \"\") << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_DEATH(_exit(0), \"\") << \"expected failure\";\n  }, \"expected failure\");\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_DEATH(_exit(0), \"\") << \"expected failure\";\n  }, \"expected failure\");\n}\n\n// Tests that GetLastErrnoDescription returns an empty string when the\n// last error is 0 and non-empty string when it is non-zero.\nTEST(GetLastErrnoDescription, GetLastErrnoDescriptionWorks) {\n  errno = ENOENT;\n  EXPECT_STRNE(\"\", GetLastErrnoDescription().c_str());\n  errno = 0;\n  EXPECT_STREQ(\"\", GetLastErrnoDescription().c_str());\n}\n\n#if GTEST_OS_WINDOWS\nTEST(AutoHandleTest, AutoHandleWorks) {\n  HANDLE handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);\n  ASSERT_NE(INVALID_HANDLE_VALUE, handle);\n\n  // Tests that the AutoHandle is correctly initialized with a handle.\n  testing::internal::AutoHandle auto_handle(handle);\n  EXPECT_EQ(handle, auto_handle.Get());\n\n  // Tests that Reset assigns INVALID_HANDLE_VALUE.\n  // Note that this cannot verify whether the original handle is closed.\n  auto_handle.Reset();\n  EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle.Get());\n\n  // Tests that Reset assigns the new handle.\n  // Note that this cannot verify whether the original handle is closed.\n  handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);\n  ASSERT_NE(INVALID_HANDLE_VALUE, handle);\n  auto_handle.Reset(handle);\n  EXPECT_EQ(handle, auto_handle.Get());\n\n  // Tests that AutoHandle contains INVALID_HANDLE_VALUE by default.\n  testing::internal::AutoHandle auto_handle2;\n  EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle2.Get());\n}\n#endif  // GTEST_OS_WINDOWS\n\n#if GTEST_OS_WINDOWS\ntypedef unsigned __int64 BiggestParsable;\ntypedef signed __int64 BiggestSignedParsable;\nconst BiggestParsable kBiggestParsableMax = ULLONG_MAX;\nconst BiggestParsable kBiggestSignedParsableMax = LLONG_MAX;\n#else\ntypedef unsigned long long BiggestParsable;\ntypedef signed long long BiggestSignedParsable;\nconst BiggestParsable kBiggestParsableMax =\n    ::std::numeric_limits<BiggestParsable>::max();\nconst BiggestSignedParsable kBiggestSignedParsableMax =\n    ::std::numeric_limits<BiggestSignedParsable>::max();\n#endif  // GTEST_OS_WINDOWS\n\nTEST(ParseNaturalNumberTest, RejectsInvalidFormat) {\n  BiggestParsable result = 0;\n\n  // Rejects non-numbers.\n  EXPECT_FALSE(ParseNaturalNumber(String(\"non-number string\"), &result));\n\n  // Rejects numbers with whitespace prefix.\n  EXPECT_FALSE(ParseNaturalNumber(String(\" 123\"), &result));\n\n  // Rejects negative numbers.\n  EXPECT_FALSE(ParseNaturalNumber(String(\"-123\"), &result));\n\n  // Rejects numbers starting with a plus sign.\n  EXPECT_FALSE(ParseNaturalNumber(String(\"+123\"), &result));\n  errno = 0;\n}\n\nTEST(ParseNaturalNumberTest, RejectsOverflownNumbers) {\n  BiggestParsable result = 0;\n\n  EXPECT_FALSE(ParseNaturalNumber(String(\"99999999999999999999999\"), &result));\n\n  signed char char_result = 0;\n  EXPECT_FALSE(ParseNaturalNumber(String(\"200\"), &char_result));\n  errno = 0;\n}\n\nTEST(ParseNaturalNumberTest, AcceptsValidNumbers) {\n  BiggestParsable result = 0;\n\n  result = 0;\n  ASSERT_TRUE(ParseNaturalNumber(String(\"123\"), &result));\n  EXPECT_EQ(123U, result);\n\n  // Check 0 as an edge case.\n  result = 1;\n  ASSERT_TRUE(ParseNaturalNumber(String(\"0\"), &result));\n  EXPECT_EQ(0U, result);\n\n  result = 1;\n  ASSERT_TRUE(ParseNaturalNumber(String(\"00000\"), &result));\n  EXPECT_EQ(0U, result);\n}\n\nTEST(ParseNaturalNumberTest, AcceptsTypeLimits) {\n  Message msg;\n  msg << kBiggestParsableMax;\n\n  BiggestParsable result = 0;\n  EXPECT_TRUE(ParseNaturalNumber(msg.GetString(), &result));\n  EXPECT_EQ(kBiggestParsableMax, result);\n\n  Message msg2;\n  msg2 << kBiggestSignedParsableMax;\n\n  BiggestSignedParsable signed_result = 0;\n  EXPECT_TRUE(ParseNaturalNumber(msg2.GetString(), &signed_result));\n  EXPECT_EQ(kBiggestSignedParsableMax, signed_result);\n\n  Message msg3;\n  msg3 << INT_MAX;\n\n  int int_result = 0;\n  EXPECT_TRUE(ParseNaturalNumber(msg3.GetString(), &int_result));\n  EXPECT_EQ(INT_MAX, int_result);\n\n  Message msg4;\n  msg4 << UINT_MAX;\n\n  unsigned int uint_result = 0;\n  EXPECT_TRUE(ParseNaturalNumber(msg4.GetString(), &uint_result));\n  EXPECT_EQ(UINT_MAX, uint_result);\n}\n\nTEST(ParseNaturalNumberTest, WorksForShorterIntegers) {\n  short short_result = 0;\n  ASSERT_TRUE(ParseNaturalNumber(String(\"123\"), &short_result));\n  EXPECT_EQ(123, short_result);\n\n  signed char char_result = 0;\n  ASSERT_TRUE(ParseNaturalNumber(String(\"123\"), &char_result));\n  EXPECT_EQ(123, char_result);\n}\n\n#if GTEST_OS_WINDOWS\nTEST(EnvironmentTest, HandleFitsIntoSizeT) {\n  // TODO(vladl@google.com): Remove this test after this condition is verified\n  // in a static assertion in gtest-death-test.cc in the function\n  // GetStatusFileDescriptor.\n  ASSERT_TRUE(sizeof(HANDLE) <= sizeof(size_t));\n}\n#endif  // GTEST_OS_WINDOWS\n\n// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED trigger\n// failures when death tests are available on the system.\nTEST(ConditionalDeathMacrosDeathTest, ExpectsDeathWhenDeathTestsAvailable) {\n  EXPECT_DEATH_IF_SUPPORTED(DieInside(\"CondDeathTestExpectMacro\"),\n                            \"death inside CondDeathTestExpectMacro\");\n  ASSERT_DEATH_IF_SUPPORTED(DieInside(\"CondDeathTestAssertMacro\"),\n                            \"death inside CondDeathTestAssertMacro\");\n\n  // Empty statement will not crash, which must trigger a failure.\n  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH_IF_SUPPORTED(;, \"\"), \"\");\n  EXPECT_FATAL_FAILURE(ASSERT_DEATH_IF_SUPPORTED(;, \"\"), \"\");\n}\n\n#else\n\nusing testing::internal::CaptureStderr;\nusing testing::internal::GetCapturedStderr;\nusing testing::internal::String;\n\n// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED are still\n// defined but do not trigger failures when death tests are not available on\n// the system.\nTEST(ConditionalDeathMacrosTest, WarnsWhenDeathTestsNotAvailable) {\n  // Empty statement will not crash, but that should not trigger a failure\n  // when death tests are not supported.\n  CaptureStderr();\n  EXPECT_DEATH_IF_SUPPORTED(;, \"\");\n  String output = GetCapturedStderr();\n  ASSERT_TRUE(NULL != strstr(output.c_str(),\n                             \"Death tests are not supported on this platform\"));\n  ASSERT_TRUE(NULL != strstr(output.c_str(), \";\"));\n\n  // The streamed message should not be printed as there is no test failure.\n  CaptureStderr();\n  EXPECT_DEATH_IF_SUPPORTED(;, \"\") << \"streamed message\";\n  output = GetCapturedStderr();\n  ASSERT_TRUE(NULL == strstr(output.c_str(), \"streamed message\"));\n\n  CaptureStderr();\n  ASSERT_DEATH_IF_SUPPORTED(;, \"\");  // NOLINT\n  output = GetCapturedStderr();\n  ASSERT_TRUE(NULL != strstr(output.c_str(),\n                             \"Death tests are not supported on this platform\"));\n  ASSERT_TRUE(NULL != strstr(output.c_str(), \";\"));\n\n  CaptureStderr();\n  ASSERT_DEATH_IF_SUPPORTED(;, \"\") << \"streamed message\";  // NOLINT\n  output = GetCapturedStderr();\n  ASSERT_TRUE(NULL == strstr(output.c_str(), \"streamed message\"));\n}\n\nvoid FuncWithAssert(int* n) {\n  ASSERT_DEATH_IF_SUPPORTED(return;, \"\");\n  (*n)++;\n}\n\n// Tests that ASSERT_DEATH_IF_SUPPORTED does not return from the current\n// function (as ASSERT_DEATH does) if death tests are not supported.\nTEST(ConditionalDeathMacrosTest, AssertDeatDoesNotReturnhIfUnsupported) {\n  int n = 0;\n  FuncWithAssert(&n);\n  EXPECT_EQ(1, n);\n}\n#endif  // GTEST_HAS_DEATH_TEST\n\n// Tests that the death test macros expand to code which may or may not\n// be followed by operator<<, and that in either case the complete text\n// comprises only a single C++ statement.\n//\n// The syntax should work whether death tests are available or not.\nTEST(ConditionalDeathMacrosSyntaxDeathTest, SingleStatement) {\n  if (AlwaysFalse())\n    // This would fail if executed; this is a compilation test only\n    ASSERT_DEATH_IF_SUPPORTED(return, \"\");\n\n  if (AlwaysTrue())\n    EXPECT_DEATH_IF_SUPPORTED(_exit(1), \"\");\n  else\n    // This empty \"else\" branch is meant to ensure that EXPECT_DEATH\n    // doesn't expand into an \"if\" statement without an \"else\"\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    ASSERT_DEATH_IF_SUPPORTED(return, \"\") << \"did not die\";\n\n  if (AlwaysFalse())\n    ;  // NOLINT\n  else\n    EXPECT_DEATH_IF_SUPPORTED(_exit(1), \"\") << 1 << 2 << 3;\n}\n\n// Tests that conditional death test macros expand to code which interacts\n// well with switch statements.\nTEST(ConditionalDeathMacrosSyntaxDeathTest, SwitchStatement) {\n// Microsoft compiler usually complains about switch statements without\n// case labels. We suppress that warning for this test.\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable: 4065)\n#endif  // _MSC_VER\n\n  switch (0)\n    default:\n      ASSERT_DEATH_IF_SUPPORTED(_exit(1), \"\")\n          << \"exit in default switch handler\";\n\n  switch (0)\n    case 0:\n      EXPECT_DEATH_IF_SUPPORTED(_exit(1), \"\") << \"exit in switch case\";\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif  // _MSC_VER\n}\n\n// Tests that a test case whose name ends with \"DeathTest\" works fine\n// on Windows.\nTEST(NotADeathTest, Test) {\n  SUCCEED();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-filepath_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: keith.ray@gmail.com (Keith Ray)\n//\n// Google Test filepath utilities\n//\n// This file tests classes and functions used internally by\n// Google Test.  They are subject to change without notice.\n//\n// This file is #included from gtest_unittest.cc, to avoid changing\n// build or make-files for some existing Google Test clients. Do not\n// #include this file anywhere else!\n\n#include <gtest/internal/gtest-filepath.h>\n#include <gtest/gtest.h>\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\n#if GTEST_OS_WINDOWS_MOBILE\n#include <windows.h>  // NOLINT\n#elif GTEST_OS_WINDOWS\n#include <direct.h>  // NOLINT\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\nnamespace testing {\nnamespace internal {\nnamespace {\n\n#if GTEST_OS_WINDOWS_MOBILE\n// TODO(wan@google.com): Move these to the POSIX adapter section in\n// gtest-port.h.\n\n// Windows CE doesn't have the remove C function.\nint remove(const char* path) {\n  LPCWSTR wpath = String::AnsiToUtf16(path);\n  int ret = DeleteFile(wpath) ? 0 : -1;\n  delete [] wpath;\n  return ret;\n}\n// Windows CE doesn't have the _rmdir C function.\nint _rmdir(const char* path) {\n  FilePath filepath(path);\n  LPCWSTR wpath = String::AnsiToUtf16(\n      filepath.RemoveTrailingPathSeparator().c_str());\n  int ret = RemoveDirectory(wpath) ? 0 : -1;\n  delete [] wpath;\n  return ret;\n}\n\n#else\n\nTEST(GetCurrentDirTest, ReturnsCurrentDir) {\n  const FilePath original_dir = FilePath::GetCurrentDir();\n  EXPECT_FALSE(original_dir.IsEmpty());\n\n  posix::ChDir(GTEST_PATH_SEP_);\n  const FilePath cwd = FilePath::GetCurrentDir();\n  posix::ChDir(original_dir.c_str());\n\n#if GTEST_OS_WINDOWS\n  // Skips the \":\".\n  const char* const cwd_without_drive = strchr(cwd.c_str(), ':');\n  ASSERT_TRUE(cwd_without_drive != NULL);\n  EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1);\n#else\n  EXPECT_STREQ(GTEST_PATH_SEP_, cwd.c_str());\n#endif\n}\n\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\nTEST(IsEmptyTest, ReturnsTrueForEmptyPath) {\n  EXPECT_TRUE(FilePath(\"\").IsEmpty());\n  EXPECT_TRUE(FilePath(NULL).IsEmpty());\n}\n\nTEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) {\n  EXPECT_FALSE(FilePath(\"a\").IsEmpty());\n  EXPECT_FALSE(FilePath(\".\").IsEmpty());\n  EXPECT_FALSE(FilePath(\"a/b\").IsEmpty());\n  EXPECT_FALSE(FilePath(\"a\\\\b\\\\\").IsEmpty());\n}\n\n// RemoveDirectoryName \"\" -> \"\"\nTEST(RemoveDirectoryNameTest, WhenEmptyName) {\n  EXPECT_STREQ(\"\", FilePath(\"\").RemoveDirectoryName().c_str());\n}\n\n// RemoveDirectoryName \"afile\" -> \"afile\"\nTEST(RemoveDirectoryNameTest, ButNoDirectory) {\n  EXPECT_STREQ(\"afile\",\n      FilePath(\"afile\").RemoveDirectoryName().c_str());\n}\n\n// RemoveDirectoryName \"/afile\" -> \"afile\"\nTEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {\n  EXPECT_STREQ(\"afile\",\n      FilePath(GTEST_PATH_SEP_ \"afile\").RemoveDirectoryName().c_str());\n}\n\n// RemoveDirectoryName \"adir/\" -> \"\"\nTEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {\n  EXPECT_STREQ(\"\",\n      FilePath(\"adir\" GTEST_PATH_SEP_).RemoveDirectoryName().c_str());\n}\n\n// RemoveDirectoryName \"adir/afile\" -> \"afile\"\nTEST(RemoveDirectoryNameTest, ShouldGiveFileName) {\n  EXPECT_STREQ(\"afile\",\n      FilePath(\"adir\" GTEST_PATH_SEP_ \"afile\").RemoveDirectoryName().c_str());\n}\n\n// RemoveDirectoryName \"adir/subdir/afile\" -> \"afile\"\nTEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {\n  EXPECT_STREQ(\"afile\",\n      FilePath(\"adir\" GTEST_PATH_SEP_ \"subdir\" GTEST_PATH_SEP_ \"afile\")\n      .RemoveDirectoryName().c_str());\n}\n\n#if GTEST_HAS_ALT_PATH_SEP_\n\n// Tests that RemoveDirectoryName() works with the alternate separator\n// on Windows.\n\n// RemoveDirectoryName(\"/afile\") -> \"afile\"\nTEST(RemoveDirectoryNameTest, RootFileShouldGiveFileNameForAlternateSeparator) {\n  EXPECT_STREQ(\"afile\",\n               FilePath(\"/afile\").RemoveDirectoryName().c_str());\n}\n\n// RemoveDirectoryName(\"adir/\") -> \"\"\nTEST(RemoveDirectoryNameTest, WhereThereIsNoFileNameForAlternateSeparator) {\n  EXPECT_STREQ(\"\",\n               FilePath(\"adir/\").RemoveDirectoryName().c_str());\n}\n\n// RemoveDirectoryName(\"adir/afile\") -> \"afile\"\nTEST(RemoveDirectoryNameTest, ShouldGiveFileNameForAlternateSeparator) {\n  EXPECT_STREQ(\"afile\",\n               FilePath(\"adir/afile\").RemoveDirectoryName().c_str());\n}\n\n// RemoveDirectoryName(\"adir/subdir/afile\") -> \"afile\"\nTEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileNameForAlternateSeparator) {\n  EXPECT_STREQ(\"afile\",\n               FilePath(\"adir/subdir/afile\").RemoveDirectoryName().c_str());\n}\n\n#endif\n\n// RemoveFileName \"\" -> \"./\"\nTEST(RemoveFileNameTest, EmptyName) {\n#if GTEST_OS_WINDOWS_MOBILE\n  // On Windows CE, we use the root as the current directory.\n  EXPECT_STREQ(GTEST_PATH_SEP_,\n      FilePath(\"\").RemoveFileName().c_str());\n#else\n  EXPECT_STREQ(\".\" GTEST_PATH_SEP_,\n      FilePath(\"\").RemoveFileName().c_str());\n#endif\n}\n\n// RemoveFileName \"adir/\" -> \"adir/\"\nTEST(RemoveFileNameTest, ButNoFile) {\n  EXPECT_STREQ(\"adir\" GTEST_PATH_SEP_,\n      FilePath(\"adir\" GTEST_PATH_SEP_).RemoveFileName().c_str());\n}\n\n// RemoveFileName \"adir/afile\" -> \"adir/\"\nTEST(RemoveFileNameTest, GivesDirName) {\n  EXPECT_STREQ(\"adir\" GTEST_PATH_SEP_,\n      FilePath(\"adir\" GTEST_PATH_SEP_ \"afile\")\n      .RemoveFileName().c_str());\n}\n\n// RemoveFileName \"adir/subdir/afile\" -> \"adir/subdir/\"\nTEST(RemoveFileNameTest, GivesDirAndSubDirName) {\n  EXPECT_STREQ(\"adir\" GTEST_PATH_SEP_ \"subdir\" GTEST_PATH_SEP_,\n      FilePath(\"adir\" GTEST_PATH_SEP_ \"subdir\" GTEST_PATH_SEP_ \"afile\")\n      .RemoveFileName().c_str());\n}\n\n// RemoveFileName \"/afile\" -> \"/\"\nTEST(RemoveFileNameTest, GivesRootDir) {\n  EXPECT_STREQ(GTEST_PATH_SEP_,\n      FilePath(GTEST_PATH_SEP_ \"afile\").RemoveFileName().c_str());\n}\n\n#if GTEST_HAS_ALT_PATH_SEP_\n\n// Tests that RemoveFileName() works with the alternate separator on\n// Windows.\n\n// RemoveFileName(\"adir/\") -> \"adir/\"\nTEST(RemoveFileNameTest, ButNoFileForAlternateSeparator) {\n  EXPECT_STREQ(\"adir\" GTEST_PATH_SEP_,\n               FilePath(\"adir/\").RemoveFileName().c_str());\n}\n\n// RemoveFileName(\"adir/afile\") -> \"adir/\"\nTEST(RemoveFileNameTest, GivesDirNameForAlternateSeparator) {\n  EXPECT_STREQ(\"adir\" GTEST_PATH_SEP_,\n               FilePath(\"adir/afile\").RemoveFileName().c_str());\n}\n\n// RemoveFileName(\"adir/subdir/afile\") -> \"adir/subdir/\"\nTEST(RemoveFileNameTest, GivesDirAndSubDirNameForAlternateSeparator) {\n  EXPECT_STREQ(\"adir\" GTEST_PATH_SEP_ \"subdir\" GTEST_PATH_SEP_,\n               FilePath(\"adir/subdir/afile\").RemoveFileName().c_str());\n}\n\n// RemoveFileName(\"/afile\") -> \"\\\"\nTEST(RemoveFileNameTest, GivesRootDirForAlternateSeparator) {\n  EXPECT_STREQ(GTEST_PATH_SEP_,\n               FilePath(\"/afile\").RemoveFileName().c_str());\n}\n\n#endif\n\nTEST(MakeFileNameTest, GenerateWhenNumberIsZero) {\n  FilePath actual = FilePath::MakeFileName(FilePath(\"foo\"), FilePath(\"bar\"),\n      0, \"xml\");\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar.xml\", actual.c_str());\n}\n\nTEST(MakeFileNameTest, GenerateFileNameNumberGtZero) {\n  FilePath actual = FilePath::MakeFileName(FilePath(\"foo\"), FilePath(\"bar\"),\n      12, \"xml\");\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar_12.xml\", actual.c_str());\n}\n\nTEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {\n  FilePath actual = FilePath::MakeFileName(FilePath(\"foo\" GTEST_PATH_SEP_),\n      FilePath(\"bar\"), 0, \"xml\");\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar.xml\", actual.c_str());\n}\n\nTEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {\n  FilePath actual = FilePath::MakeFileName(FilePath(\"foo\" GTEST_PATH_SEP_),\n      FilePath(\"bar\"), 12, \"xml\");\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar_12.xml\", actual.c_str());\n}\n\nTEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) {\n  FilePath actual = FilePath::MakeFileName(FilePath(\"\"), FilePath(\"bar\"),\n      0, \"xml\");\n  EXPECT_STREQ(\"bar.xml\", actual.c_str());\n}\n\nTEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) {\n  FilePath actual = FilePath::MakeFileName(FilePath(\"\"), FilePath(\"bar\"),\n      14, \"xml\");\n  EXPECT_STREQ(\"bar_14.xml\", actual.c_str());\n}\n\nTEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"foo\"),\n                                          FilePath(\"bar.xml\"));\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar.xml\", actual.c_str());\n}\n\nTEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"foo\" GTEST_PATH_SEP_),\n                                          FilePath(\"bar.xml\"));\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar.xml\", actual.c_str());\n}\n\nTEST(ConcatPathsTest, Path1BeingEmpty) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"\"),\n                                          FilePath(\"bar.xml\"));\n  EXPECT_STREQ(\"bar.xml\", actual.c_str());\n}\n\nTEST(ConcatPathsTest, Path2BeingEmpty) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"foo\"),\n                                          FilePath(\"\"));\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_, actual.c_str());\n}\n\nTEST(ConcatPathsTest, BothPathBeingEmpty) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"\"),\n                                          FilePath(\"\"));\n  EXPECT_STREQ(\"\", actual.c_str());\n}\n\nTEST(ConcatPathsTest, Path1ContainsPathSep) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"foo\" GTEST_PATH_SEP_ \"bar\"),\n                                          FilePath(\"foobar.xml\"));\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar\" GTEST_PATH_SEP_ \"foobar.xml\",\n               actual.c_str());\n}\n\nTEST(ConcatPathsTest, Path2ContainsPathSep) {\n  FilePath actual = FilePath::ConcatPaths(\n      FilePath(\"foo\" GTEST_PATH_SEP_),\n      FilePath(\"bar\" GTEST_PATH_SEP_ \"bar.xml\"));\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar\" GTEST_PATH_SEP_ \"bar.xml\",\n               actual.c_str());\n}\n\nTEST(ConcatPathsTest, Path2EndsWithPathSep) {\n  FilePath actual = FilePath::ConcatPaths(FilePath(\"foo\"),\n                                          FilePath(\"bar\" GTEST_PATH_SEP_));\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar\" GTEST_PATH_SEP_, actual.c_str());\n}\n\n// RemoveTrailingPathSeparator \"\" -> \"\"\nTEST(RemoveTrailingPathSeparatorTest, EmptyString) {\n  EXPECT_STREQ(\"\",\n      FilePath(\"\").RemoveTrailingPathSeparator().c_str());\n}\n\n// RemoveTrailingPathSeparator \"foo\" -> \"foo\"\nTEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {\n  EXPECT_STREQ(\"foo\",\n      FilePath(\"foo\").RemoveTrailingPathSeparator().c_str());\n}\n\n// RemoveTrailingPathSeparator \"foo/\" -> \"foo\"\nTEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {\n  EXPECT_STREQ(\n      \"foo\",\n      FilePath(\"foo\" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().c_str());\n#if GTEST_HAS_ALT_PATH_SEP_\n  EXPECT_STREQ(\"foo\",\n               FilePath(\"foo/\").RemoveTrailingPathSeparator().c_str());\n#endif\n}\n\n// RemoveTrailingPathSeparator \"foo/bar/\" -> \"foo/bar/\"\nTEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar\",\n               FilePath(\"foo\" GTEST_PATH_SEP_ \"bar\" GTEST_PATH_SEP_)\n               .RemoveTrailingPathSeparator().c_str());\n}\n\n// RemoveTrailingPathSeparator \"foo/bar\" -> \"foo/bar\"\nTEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) {\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar\",\n               FilePath(\"foo\" GTEST_PATH_SEP_ \"bar\")\n               .RemoveTrailingPathSeparator().c_str());\n}\n\nTEST(DirectoryTest, RootDirectoryExists) {\n#if GTEST_OS_WINDOWS  // We are on Windows.\n  char current_drive[_MAX_PATH];  // NOLINT\n  current_drive[0] = static_cast<char>(_getdrive() + 'A' - 1);\n  current_drive[1] = ':';\n  current_drive[2] = '\\\\';\n  current_drive[3] = '\\0';\n  EXPECT_TRUE(FilePath(current_drive).DirectoryExists());\n#else\n  EXPECT_TRUE(FilePath(\"/\").DirectoryExists());\n#endif  // GTEST_OS_WINDOWS\n}\n\n#if GTEST_OS_WINDOWS\nTEST(DirectoryTest, RootOfWrongDriveDoesNotExists) {\n  const int saved_drive_ = _getdrive();\n  // Find a drive that doesn't exist. Start with 'Z' to avoid common ones.\n  for (char drive = 'Z'; drive >= 'A'; drive--)\n    if (_chdrive(drive - 'A' + 1) == -1) {\n      char non_drive[_MAX_PATH];  // NOLINT\n      non_drive[0] = drive;\n      non_drive[1] = ':';\n      non_drive[2] = '\\\\';\n      non_drive[3] = '\\0';\n      EXPECT_FALSE(FilePath(non_drive).DirectoryExists());\n      break;\n    }\n  _chdrive(saved_drive_);\n}\n#endif  // GTEST_OS_WINDOWS\n\n#if !GTEST_OS_WINDOWS_MOBILE\n// Windows CE _does_ consider an empty directory to exist.\nTEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) {\n  EXPECT_FALSE(FilePath(\"\").DirectoryExists());\n}\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\nTEST(DirectoryTest, CurrentDirectoryExists) {\n#if GTEST_OS_WINDOWS  // We are on Windows.\n#ifndef _WIN32_CE  // Windows CE doesn't have a current directory.\n  EXPECT_TRUE(FilePath(\".\").DirectoryExists());\n  EXPECT_TRUE(FilePath(\".\\\\\").DirectoryExists());\n#endif  // _WIN32_CE\n#else\n  EXPECT_TRUE(FilePath(\".\").DirectoryExists());\n  EXPECT_TRUE(FilePath(\"./\").DirectoryExists());\n#endif  // GTEST_OS_WINDOWS\n}\n\nTEST(NormalizeTest, NullStringsEqualEmptyDirectory) {\n  EXPECT_STREQ(\"\", FilePath(NULL).c_str());\n  EXPECT_STREQ(\"\", FilePath(String(NULL)).c_str());\n}\n\n// \"foo/bar\" == foo//bar\" == \"foo///bar\"\nTEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) {\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar\",\n               FilePath(\"foo\" GTEST_PATH_SEP_ \"bar\").c_str());\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar\",\n               FilePath(\"foo\" GTEST_PATH_SEP_ GTEST_PATH_SEP_ \"bar\").c_str());\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_ \"bar\",\n               FilePath(\"foo\" GTEST_PATH_SEP_ GTEST_PATH_SEP_\n                        GTEST_PATH_SEP_ \"bar\").c_str());\n}\n\n// \"/bar\" == //bar\" == \"///bar\"\nTEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) {\n  EXPECT_STREQ(GTEST_PATH_SEP_ \"bar\",\n    FilePath(GTEST_PATH_SEP_ \"bar\").c_str());\n  EXPECT_STREQ(GTEST_PATH_SEP_ \"bar\",\n    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ \"bar\").c_str());\n  EXPECT_STREQ(GTEST_PATH_SEP_ \"bar\",\n    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_ \"bar\").c_str());\n}\n\n// \"foo/\" == foo//\" == \"foo///\"\nTEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) {\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_,\n    FilePath(\"foo\" GTEST_PATH_SEP_).c_str());\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_,\n    FilePath(\"foo\" GTEST_PATH_SEP_ GTEST_PATH_SEP_).c_str());\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_,\n    FilePath(\"foo\" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).c_str());\n}\n\n#if GTEST_HAS_ALT_PATH_SEP_\n\n// Tests that separators at the end of the string are normalized\n// regardless of their combination (e.g. \"foo\\\" ==\"foo/\\\" ==\n// \"foo\\\\/\").\nTEST(NormalizeTest, MixAlternateSeparatorAtStringEnd) {\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_,\n               FilePath(\"foo/\").c_str());\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_,\n               FilePath(\"foo\" GTEST_PATH_SEP_ \"/\").c_str());\n  EXPECT_STREQ(\"foo\" GTEST_PATH_SEP_,\n               FilePath(\"foo//\" GTEST_PATH_SEP_).c_str());\n}\n\n#endif\n\nTEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) {\n  FilePath default_path;\n  FilePath non_default_path(\"path\");\n  non_default_path = default_path;\n  EXPECT_STREQ(\"\", non_default_path.c_str());\n  EXPECT_STREQ(\"\", default_path.c_str());  // RHS var is unchanged.\n}\n\nTEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) {\n  FilePath non_default_path(\"path\");\n  FilePath default_path;\n  default_path = non_default_path;\n  EXPECT_STREQ(\"path\", default_path.c_str());\n  EXPECT_STREQ(\"path\", non_default_path.c_str());  // RHS var is unchanged.\n}\n\nTEST(AssignmentOperatorTest, ConstAssignedToNonConst) {\n  const FilePath const_default_path(\"const_path\");\n  FilePath non_default_path(\"path\");\n  non_default_path = const_default_path;\n  EXPECT_STREQ(\"const_path\", non_default_path.c_str());\n}\n\nclass DirectoryCreationTest : public Test {\n protected:\n  virtual void SetUp() {\n    testdata_path_.Set(FilePath(String::Format(\"%s%s%s\",\n        TempDir().c_str(), GetCurrentExecutableName().c_str(),\n        \"_directory_creation\" GTEST_PATH_SEP_ \"test\" GTEST_PATH_SEP_)));\n    testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());\n\n    unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath(\"unique\"),\n        0, \"txt\"));\n    unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath(\"unique\"),\n        1, \"txt\"));\n\n    remove(testdata_file_.c_str());\n    remove(unique_file0_.c_str());\n    remove(unique_file1_.c_str());\n    posix::RmDir(testdata_path_.c_str());\n  }\n\n  virtual void TearDown() {\n    remove(testdata_file_.c_str());\n    remove(unique_file0_.c_str());\n    remove(unique_file1_.c_str());\n    posix::RmDir(testdata_path_.c_str());\n  }\n\n  String TempDir() const {\n#if GTEST_OS_WINDOWS_MOBILE\n    return String(\"\\\\temp\\\\\");\n#elif GTEST_OS_WINDOWS\n    const char* temp_dir = posix::GetEnv(\"TEMP\");\n    if (temp_dir == NULL || temp_dir[0] == '\\0')\n      return String(\"\\\\temp\\\\\");\n    else if (String(temp_dir).EndsWith(\"\\\\\"))\n      return String(temp_dir);\n    else\n      return String::Format(\"%s\\\\\", temp_dir);\n#else\n    return String(\"/tmp/\");\n#endif  // GTEST_OS_WINDOWS_MOBILE\n  }\n\n  void CreateTextFile(const char* filename) {\n    FILE* f = posix::FOpen(filename, \"w\");\n    fprintf(f, \"text\\n\");\n    fclose(f);\n  }\n\n  // Strings representing a directory and a file, with identical paths\n  // except for the trailing separator character that distinquishes\n  // a directory named 'test' from a file named 'test'. Example names:\n  FilePath testdata_path_;  // \"/tmp/directory_creation/test/\"\n  FilePath testdata_file_;  // \"/tmp/directory_creation/test\"\n  FilePath unique_file0_;  // \"/tmp/directory_creation/test/unique.txt\"\n  FilePath unique_file1_;  // \"/tmp/directory_creation/test/unique_1.txt\"\n};\n\nTEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) {\n  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.c_str();\n  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());\n  EXPECT_TRUE(testdata_path_.DirectoryExists());\n}\n\nTEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) {\n  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.c_str();\n  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());\n  // Call 'create' again... should still succeed.\n  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());\n}\n\nTEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) {\n  FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_,\n      FilePath(\"unique\"), \"txt\"));\n  EXPECT_STREQ(unique_file0_.c_str(), file_path.c_str());\n  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file not there\n\n  testdata_path_.CreateDirectoriesRecursively();\n  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file still not there\n  CreateTextFile(file_path.c_str());\n  EXPECT_TRUE(file_path.FileOrDirectoryExists());\n\n  FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_,\n      FilePath(\"unique\"), \"txt\"));\n  EXPECT_STREQ(unique_file1_.c_str(), file_path2.c_str());\n  EXPECT_FALSE(file_path2.FileOrDirectoryExists());  // file not there\n  CreateTextFile(file_path2.c_str());\n  EXPECT_TRUE(file_path2.FileOrDirectoryExists());\n}\n\nTEST_F(DirectoryCreationTest, CreateDirectoriesFail) {\n  // force a failure by putting a file where we will try to create a directory.\n  CreateTextFile(testdata_file_.c_str());\n  EXPECT_TRUE(testdata_file_.FileOrDirectoryExists());\n  EXPECT_FALSE(testdata_file_.DirectoryExists());\n  EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively());\n}\n\nTEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) {\n  const FilePath test_detail_xml(\"test_detail.xml\");\n  EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively());\n}\n\nTEST(FilePathTest, DefaultConstructor) {\n  FilePath fp;\n  EXPECT_STREQ(\"\", fp.c_str());\n}\n\nTEST(FilePathTest, CharAndCopyConstructors) {\n  const FilePath fp(\"spicy\");\n  EXPECT_STREQ(\"spicy\", fp.c_str());\n\n  const FilePath fp_copy(fp);\n  EXPECT_STREQ(\"spicy\", fp_copy.c_str());\n}\n\nTEST(FilePathTest, StringConstructor) {\n  const FilePath fp(String(\"cider\"));\n  EXPECT_STREQ(\"cider\", fp.c_str());\n}\n\nTEST(FilePathTest, Set) {\n  const FilePath apple(\"apple\");\n  FilePath mac(\"mac\");\n  mac.Set(apple);  // Implement Set() since overloading operator= is forbidden.\n  EXPECT_STREQ(\"apple\", mac.c_str());\n  EXPECT_STREQ(\"apple\", apple.c_str());\n}\n\nTEST(FilePathTest, ToString) {\n  const FilePath file(\"drink\");\n  String str(file.ToString());\n  EXPECT_STREQ(\"drink\", str.c_str());\n}\n\nTEST(FilePathTest, RemoveExtension) {\n  EXPECT_STREQ(\"app\", FilePath(\"app.exe\").RemoveExtension(\"exe\").c_str());\n  EXPECT_STREQ(\"APP\", FilePath(\"APP.EXE\").RemoveExtension(\"exe\").c_str());\n}\n\nTEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {\n  EXPECT_STREQ(\"app\", FilePath(\"app\").RemoveExtension(\"exe\").c_str());\n}\n\nTEST(FilePathTest, IsDirectory) {\n  EXPECT_FALSE(FilePath(\"cola\").IsDirectory());\n  EXPECT_TRUE(FilePath(\"koala\" GTEST_PATH_SEP_).IsDirectory());\n#if GTEST_HAS_ALT_PATH_SEP_\n  EXPECT_TRUE(FilePath(\"koala/\").IsDirectory());\n#endif\n}\n\nTEST(FilePathTest, IsAbsolutePath) {\n  EXPECT_FALSE(FilePath(\"is\" GTEST_PATH_SEP_ \"relative\").IsAbsolutePath());\n  EXPECT_FALSE(FilePath(\"\").IsAbsolutePath());\n#if GTEST_OS_WINDOWS\n  EXPECT_TRUE(FilePath(\"c:\\\\\" GTEST_PATH_SEP_ \"is_not\"\n                       GTEST_PATH_SEP_ \"relative\").IsAbsolutePath());\n  EXPECT_FALSE(FilePath(\"c:foo\" GTEST_PATH_SEP_ \"bar\").IsAbsolutePath());\n  EXPECT_TRUE(FilePath(\"c:/\" GTEST_PATH_SEP_ \"is_not\"\n                       GTEST_PATH_SEP_ \"relative\").IsAbsolutePath());\n#else\n  EXPECT_TRUE(FilePath(GTEST_PATH_SEP_ \"is_not\" GTEST_PATH_SEP_ \"relative\")\n              .IsAbsolutePath());\n#endif  // GTEST_OS_WINDOWS\n}\n\nTEST(FilePathTest, IsRootDirectory) {\n#if GTEST_OS_WINDOWS\n  EXPECT_TRUE(FilePath(\"a:\\\\\").IsRootDirectory());\n  EXPECT_TRUE(FilePath(\"Z:/\").IsRootDirectory());\n  EXPECT_TRUE(FilePath(\"e://\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"b:\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"b:a\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"8:/\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"c|/\").IsRootDirectory());\n#else\n  EXPECT_TRUE(FilePath(\"/\").IsRootDirectory());\n  EXPECT_TRUE(FilePath(\"//\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"\\\\\").IsRootDirectory());\n  EXPECT_FALSE(FilePath(\"/x\").IsRootDirectory());\n#endif\n}\n\n}  // namespace\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-linked_ptr_test.cc",
    "content": "// Copyright 2003, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: Dan Egnor (egnor@google.com)\n// Ported to Windows: Vadim Berman (vadimb@google.com)\n\n#include <gtest/internal/gtest-linked_ptr.h>\n\n#include <stdlib.h>\n#include <gtest/gtest.h>\n\nnamespace {\n\nusing testing::Message;\nusing testing::internal::linked_ptr;\n\nint num;\nMessage* history = NULL;\n\n// Class which tracks allocation/deallocation\nclass A {\n public:\n  A(): mynum(num++) { *history << \"A\" << mynum << \" ctor\\n\"; }\n  virtual ~A() { *history << \"A\" << mynum << \" dtor\\n\"; }\n  virtual void Use() { *history << \"A\" << mynum << \" use\\n\"; }\n protected:\n  int mynum;\n};\n\n// Subclass\nclass B : public A {\n public:\n  B() { *history << \"B\" << mynum << \" ctor\\n\"; }\n  ~B() { *history << \"B\" << mynum << \" dtor\\n\"; }\n  virtual void Use() { *history << \"B\" << mynum << \" use\\n\"; }\n};\n\nclass LinkedPtrTest : public testing::Test {\n public:\n  LinkedPtrTest() {\n    num = 0;\n    history = new Message;\n  }\n\n  virtual ~LinkedPtrTest() {\n    delete history;\n    history = NULL;\n  }\n};\n\nTEST_F(LinkedPtrTest, GeneralTest) {\n  {\n    linked_ptr<A> a0, a1, a2;\n    a0 = a0;\n    a1 = a2;\n    ASSERT_EQ(a0.get(), static_cast<A*>(NULL));\n    ASSERT_EQ(a1.get(), static_cast<A*>(NULL));\n    ASSERT_EQ(a2.get(), static_cast<A*>(NULL));\n    ASSERT_TRUE(a0 == NULL);\n    ASSERT_TRUE(a1 == NULL);\n    ASSERT_TRUE(a2 == NULL);\n\n    {\n      linked_ptr<A> a3(new A);\n      a0 = a3;\n      ASSERT_TRUE(a0 == a3);\n      ASSERT_TRUE(a0 != NULL);\n      ASSERT_TRUE(a0.get() == a3);\n      ASSERT_TRUE(a0 == a3.get());\n      linked_ptr<A> a4(a0);\n      a1 = a4;\n      linked_ptr<A> a5(new A);\n      ASSERT_TRUE(a5.get() != a3);\n      ASSERT_TRUE(a5 != a3.get());\n      a2 = a5;\n      linked_ptr<B> b0(new B);\n      linked_ptr<A> a6(b0);\n      ASSERT_TRUE(b0 == a6);\n      ASSERT_TRUE(a6 == b0);\n      ASSERT_TRUE(b0 != NULL);\n      a5 = b0;\n      a5 = b0;\n      a3->Use();\n      a4->Use();\n      a5->Use();\n      a6->Use();\n      b0->Use();\n      (*b0).Use();\n      b0.get()->Use();\n    }\n\n    a0->Use();\n    a1->Use();\n    a2->Use();\n\n    a1 = a2;\n    a2.reset(new A);\n    a0.reset();\n\n    linked_ptr<A> a7;\n  }\n\n  ASSERT_STREQ(\n    \"A0 ctor\\n\"\n    \"A1 ctor\\n\"\n    \"A2 ctor\\n\"\n    \"B2 ctor\\n\"\n    \"A0 use\\n\"\n    \"A0 use\\n\"\n    \"B2 use\\n\"\n    \"B2 use\\n\"\n    \"B2 use\\n\"\n    \"B2 use\\n\"\n    \"B2 use\\n\"\n    \"B2 dtor\\n\"\n    \"A2 dtor\\n\"\n    \"A0 use\\n\"\n    \"A0 use\\n\"\n    \"A1 use\\n\"\n    \"A3 ctor\\n\"\n    \"A0 dtor\\n\"\n    \"A3 dtor\\n\"\n    \"A1 dtor\\n\",\n    history->GetString().c_str()\n  );\n}\n\n}  // Unnamed namespace\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-listener_test.cc",
    "content": "// Copyright 2009 Google Inc. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: vladl@google.com (Vlad Losev)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This file verifies Google Test event listeners receive events at the\n// right times.\n\n#include <gtest/gtest.h>\n#include <vector>\n\nusing ::testing::AddGlobalTestEnvironment;\nusing ::testing::Environment;\nusing ::testing::InitGoogleTest;\nusing ::testing::Test;\nusing ::testing::TestCase;\nusing ::testing::TestEventListener;\nusing ::testing::TestInfo;\nusing ::testing::TestPartResult;\nusing ::testing::UnitTest;\nusing ::testing::internal::String;\n\n// Used by tests to register their events.\nstd::vector<String>* g_events = NULL;\n\nnamespace testing {\nnamespace internal {\n\nclass EventRecordingListener : public TestEventListener {\n public:\n  EventRecordingListener(const char* name) : name_(name) {}\n\n protected:\n  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestProgramStart\"));\n  }\n\n  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,\n                                    int iteration) {\n    Message message;\n    message << GetFullMethodName(\"OnTestIterationStart\")\n            << \"(\" << iteration << \")\";\n    g_events->push_back(message.GetString());\n  }\n\n  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {\n    g_events->push_back(GetFullMethodName(\"OnEnvironmentsSetUpStart\"));\n  }\n\n  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {\n    g_events->push_back(GetFullMethodName(\"OnEnvironmentsSetUpEnd\"));\n  }\n\n  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestCaseStart\"));\n  }\n\n  virtual void OnTestStart(const TestInfo& /*test_info*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestStart\"));\n  }\n\n  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestPartResult\"));\n  }\n\n  virtual void OnTestEnd(const TestInfo& /*test_info*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestEnd\"));\n  }\n\n  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestCaseEnd\"));\n  }\n\n  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {\n    g_events->push_back(GetFullMethodName(\"OnEnvironmentsTearDownStart\"));\n  }\n\n  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {\n    g_events->push_back(GetFullMethodName(\"OnEnvironmentsTearDownEnd\"));\n  }\n\n  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,\n                                  int iteration) {\n    Message message;\n    message << GetFullMethodName(\"OnTestIterationEnd\")\n            << \"(\"  << iteration << \")\";\n    g_events->push_back(message.GetString());\n  }\n\n  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {\n    g_events->push_back(GetFullMethodName(\"OnTestProgramEnd\"));\n  }\n\n private:\n  String GetFullMethodName(const char* name) {\n    Message message;\n    message << name_ << \".\" << name;\n    return message.GetString();\n  }\n\n  String name_;\n};\n\nclass EnvironmentInvocationCatcher : public Environment {\n protected:\n  virtual void SetUp() {\n    g_events->push_back(String(\"Environment::SetUp\"));\n  }\n\n  virtual void TearDown() {\n    g_events->push_back(String(\"Environment::TearDown\"));\n  }\n};\n\nclass ListenerTest : public Test {\n protected:\n  static void SetUpTestCase() {\n    g_events->push_back(String(\"ListenerTest::SetUpTestCase\"));\n  }\n\n  static void TearDownTestCase() {\n    g_events->push_back(String(\"ListenerTest::TearDownTestCase\"));\n  }\n\n  virtual void SetUp() {\n    g_events->push_back(String(\"ListenerTest::SetUp\"));\n  }\n\n  virtual void TearDown() {\n    g_events->push_back(String(\"ListenerTest::TearDown\"));\n  }\n};\n\nTEST_F(ListenerTest, DoesFoo) {\n  // Test execution order within a test case is not guaranteed so we are not\n  // recording the test name.\n  g_events->push_back(String(\"ListenerTest::* Test Body\"));\n  SUCCEED();  // Triggers OnTestPartResult.\n}\n\nTEST_F(ListenerTest, DoesBar) {\n  g_events->push_back(String(\"ListenerTest::* Test Body\"));\n  SUCCEED();  // Triggers OnTestPartResult.\n}\n\n}  // namespace internal\n\n}  // namespace testing\n\nusing ::testing::internal::EnvironmentInvocationCatcher;\nusing ::testing::internal::EventRecordingListener;\n\nvoid VerifyResults(const std::vector<String>& data,\n                   const char* const* expected_data,\n                   int expected_data_size) {\n  const int actual_size = data.size();\n  // If the following assertion fails, a new entry will be appended to\n  // data.  Hence we save data.size() first.\n  EXPECT_EQ(expected_data_size, actual_size);\n\n  // Compares the common prefix.\n  const int shorter_size = expected_data_size <= actual_size ?\n      expected_data_size : actual_size;\n  int i = 0;\n  for (; i < shorter_size; ++i) {\n    ASSERT_STREQ(expected_data[i], data[i].c_str())\n        << \"at position \" << i;\n  }\n\n  // Prints extra elements in the actual data.\n  for (; i < actual_size; ++i) {\n    printf(\"  Actual event #%d: %s\\n\", i, data[i].c_str());\n  }\n}\n\nint main(int argc, char **argv) {\n  std::vector<String> events;\n  g_events = &events;\n  InitGoogleTest(&argc, argv);\n\n  UnitTest::GetInstance()->listeners().Append(\n      new EventRecordingListener(\"1st\"));\n  UnitTest::GetInstance()->listeners().Append(\n      new EventRecordingListener(\"2nd\"));\n\n  AddGlobalTestEnvironment(new EnvironmentInvocationCatcher);\n\n  GTEST_CHECK_(events.size() == 0)\n      << \"AddGlobalTestEnvironment should not generate any events itself.\";\n\n  ::testing::GTEST_FLAG(repeat) = 2;\n  int ret_val = RUN_ALL_TESTS();\n\n  const char* const expected_events[] = {\n    \"1st.OnTestProgramStart\",\n    \"2nd.OnTestProgramStart\",\n    \"1st.OnTestIterationStart(0)\",\n    \"2nd.OnTestIterationStart(0)\",\n    \"1st.OnEnvironmentsSetUpStart\",\n    \"2nd.OnEnvironmentsSetUpStart\",\n    \"Environment::SetUp\",\n    \"2nd.OnEnvironmentsSetUpEnd\",\n    \"1st.OnEnvironmentsSetUpEnd\",\n    \"1st.OnTestCaseStart\",\n    \"2nd.OnTestCaseStart\",\n    \"ListenerTest::SetUpTestCase\",\n    \"1st.OnTestStart\",\n    \"2nd.OnTestStart\",\n    \"ListenerTest::SetUp\",\n    \"ListenerTest::* Test Body\",\n    \"1st.OnTestPartResult\",\n    \"2nd.OnTestPartResult\",\n    \"ListenerTest::TearDown\",\n    \"2nd.OnTestEnd\",\n    \"1st.OnTestEnd\",\n    \"1st.OnTestStart\",\n    \"2nd.OnTestStart\",\n    \"ListenerTest::SetUp\",\n    \"ListenerTest::* Test Body\",\n    \"1st.OnTestPartResult\",\n    \"2nd.OnTestPartResult\",\n    \"ListenerTest::TearDown\",\n    \"2nd.OnTestEnd\",\n    \"1st.OnTestEnd\",\n    \"ListenerTest::TearDownTestCase\",\n    \"2nd.OnTestCaseEnd\",\n    \"1st.OnTestCaseEnd\",\n    \"1st.OnEnvironmentsTearDownStart\",\n    \"2nd.OnEnvironmentsTearDownStart\",\n    \"Environment::TearDown\",\n    \"2nd.OnEnvironmentsTearDownEnd\",\n    \"1st.OnEnvironmentsTearDownEnd\",\n    \"2nd.OnTestIterationEnd(0)\",\n    \"1st.OnTestIterationEnd(0)\",\n    \"1st.OnTestIterationStart(1)\",\n    \"2nd.OnTestIterationStart(1)\",\n    \"1st.OnEnvironmentsSetUpStart\",\n    \"2nd.OnEnvironmentsSetUpStart\",\n    \"Environment::SetUp\",\n    \"2nd.OnEnvironmentsSetUpEnd\",\n    \"1st.OnEnvironmentsSetUpEnd\",\n    \"1st.OnTestCaseStart\",\n    \"2nd.OnTestCaseStart\",\n    \"ListenerTest::SetUpTestCase\",\n    \"1st.OnTestStart\",\n    \"2nd.OnTestStart\",\n    \"ListenerTest::SetUp\",\n    \"ListenerTest::* Test Body\",\n    \"1st.OnTestPartResult\",\n    \"2nd.OnTestPartResult\",\n    \"ListenerTest::TearDown\",\n    \"2nd.OnTestEnd\",\n    \"1st.OnTestEnd\",\n    \"1st.OnTestStart\",\n    \"2nd.OnTestStart\",\n    \"ListenerTest::SetUp\",\n    \"ListenerTest::* Test Body\",\n    \"1st.OnTestPartResult\",\n    \"2nd.OnTestPartResult\",\n    \"ListenerTest::TearDown\",\n    \"2nd.OnTestEnd\",\n    \"1st.OnTestEnd\",\n    \"ListenerTest::TearDownTestCase\",\n    \"2nd.OnTestCaseEnd\",\n    \"1st.OnTestCaseEnd\",\n    \"1st.OnEnvironmentsTearDownStart\",\n    \"2nd.OnEnvironmentsTearDownStart\",\n    \"Environment::TearDown\",\n    \"2nd.OnEnvironmentsTearDownEnd\",\n    \"1st.OnEnvironmentsTearDownEnd\",\n    \"2nd.OnTestIterationEnd(1)\",\n    \"1st.OnTestIterationEnd(1)\",\n    \"2nd.OnTestProgramEnd\",\n    \"1st.OnTestProgramEnd\"\n  };\n  VerifyResults(events,\n                expected_events,\n                sizeof(expected_events)/sizeof(expected_events[0]));\n\n  // We need to check manually for ad hoc test failures that happen after\n  // RUN_ALL_TESTS finishes.\n  if (UnitTest::GetInstance()->Failed())\n    ret_val = 1;\n\n  return ret_val;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-message_test.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// Tests for the Message class.\n\n#include <gtest/gtest-message.h>\n\n#include <gtest/gtest.h>\n\nnamespace {\n\nusing ::testing::Message;\nusing ::testing::internal::StrStream;\n\n// A helper function that turns a Message into a C string.\nconst char* ToCString(const Message& msg) {\n  static testing::internal::String result;\n  result = msg.GetString();\n  return result.c_str();\n}\n\n// Tests the testing::Message class\n\n// Tests the default constructor.\nTEST(MessageTest, DefaultConstructor) {\n  const Message msg;\n  EXPECT_STREQ(\"\", ToCString(msg));\n}\n\n// Tests the copy constructor.\nTEST(MessageTest, CopyConstructor) {\n  const Message msg1(\"Hello\");\n  const Message msg2(msg1);\n  EXPECT_STREQ(\"Hello\", ToCString(msg2));\n}\n\n// Tests constructing a Message from a C-string.\nTEST(MessageTest, ConstructsFromCString) {\n  Message msg(\"Hello\");\n  EXPECT_STREQ(\"Hello\", ToCString(msg));\n}\n\n// Tests streaming a float.\nTEST(MessageTest, StreamsFloat) {\n  const char* const s = ToCString(Message() << 1.23456F << \" \" << 2.34567F);\n  // Both numbers should be printed with enough precision.\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"1.234560\", s);\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \" 2.345669\", s);\n}\n\n// Tests streaming a double.\nTEST(MessageTest, StreamsDouble) {\n  const char* const s = ToCString(Message() << 1260570880.4555497 << \" \"\n                                  << 1260572265.1954534);\n  // Both numbers should be printed with enough precision.\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"1260570880.45\", s);\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \" 1260572265.19\", s);\n}\n\n// Tests streaming a non-char pointer.\nTEST(MessageTest, StreamsPointer) {\n  int n = 0;\n  int* p = &n;\n  EXPECT_STRNE(\"(null)\", ToCString(Message() << p));\n}\n\n// Tests streaming a NULL non-char pointer.\nTEST(MessageTest, StreamsNullPointer) {\n  int* p = NULL;\n  EXPECT_STREQ(\"(null)\", ToCString(Message() << p));\n}\n\n// Tests streaming a C string.\nTEST(MessageTest, StreamsCString) {\n  EXPECT_STREQ(\"Foo\", ToCString(Message() << \"Foo\"));\n}\n\n// Tests streaming a NULL C string.\nTEST(MessageTest, StreamsNullCString) {\n  char* p = NULL;\n  EXPECT_STREQ(\"(null)\", ToCString(Message() << p));\n}\n\n// Tests streaming std::string.\nTEST(MessageTest, StreamsString) {\n  const ::std::string str(\"Hello\");\n  EXPECT_STREQ(\"Hello\", ToCString(Message() << str));\n}\n\n// Tests that we can output strings containing embedded NULs.\nTEST(MessageTest, StreamsStringWithEmbeddedNUL) {\n  const char char_array_with_nul[] =\n      \"Here's a NUL\\0 and some more string\";\n  const ::std::string string_with_nul(char_array_with_nul,\n                                      sizeof(char_array_with_nul) - 1);\n  EXPECT_STREQ(\"Here's a NUL\\\\0 and some more string\",\n               ToCString(Message() << string_with_nul));\n}\n\n// Tests streaming a NUL char.\nTEST(MessageTest, StreamsNULChar) {\n  EXPECT_STREQ(\"\\\\0\", ToCString(Message() << '\\0'));\n}\n\n// Tests streaming int.\nTEST(MessageTest, StreamsInt) {\n  EXPECT_STREQ(\"123\", ToCString(Message() << 123));\n}\n\n// Tests that basic IO manipulators (endl, ends, and flush) can be\n// streamed to Message.\nTEST(MessageTest, StreamsBasicIoManip) {\n  EXPECT_STREQ(\"Line 1.\\nA NUL char \\\\0 in line 2.\",\n               ToCString(Message() << \"Line 1.\" << std::endl\n                         << \"A NUL char \" << std::ends << std::flush\n                         << \" in line 2.\"));\n}\n\n// Tests Message::GetString()\nTEST(MessageTest, GetString) {\n  Message msg;\n  msg << 1 << \" lamb\";\n  EXPECT_STREQ(\"1 lamb\", msg.GetString().c_str());\n}\n\n// Tests streaming a Message object to an ostream.\nTEST(MessageTest, StreamsToOStream) {\n  Message msg(\"Hello\");\n  StrStream ss;\n  ss << msg;\n  EXPECT_STREQ(\"Hello\", testing::internal::StrStreamToString(&ss).c_str());\n}\n\n// Tests that a Message object doesn't take up too much stack space.\nTEST(MessageTest, DoesNotTakeUpMuchStackSpace) {\n  EXPECT_LE(sizeof(Message), 16U);\n}\n\n}  // namespace\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-options_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: keith.ray@gmail.com (Keith Ray)\n//\n// Google Test UnitTestOptions tests\n//\n// This file tests classes and functions used internally by\n// Google Test.  They are subject to change without notice.\n//\n// This file is #included from gtest.cc, to avoid changing build or\n// make-files on Windows and other platforms. Do not #include this file\n// anywhere else!\n\n#include <gtest/gtest.h>\n\n#if GTEST_OS_WINDOWS_MOBILE\n#include <windows.h>\n#elif GTEST_OS_WINDOWS\n#include <direct.h>\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\nnamespace testing {\nnamespace internal {\nnamespace {\n\n// Turns the given relative path into an absolute path.\nFilePath GetAbsolutePathOf(const FilePath& relative_path) {\n  return FilePath::ConcatPaths(FilePath::GetCurrentDir(), relative_path);\n}\n\n// Testing UnitTestOptions::GetOutputFormat/GetOutputFile.\n\nTEST(XmlOutputTest, GetOutputFormatDefault) {\n  GTEST_FLAG(output) = \"\";\n  EXPECT_STREQ(\"\", UnitTestOptions::GetOutputFormat().c_str());\n}\n\nTEST(XmlOutputTest, GetOutputFormat) {\n  GTEST_FLAG(output) = \"xml:filename\";\n  EXPECT_STREQ(\"xml\", UnitTestOptions::GetOutputFormat().c_str());\n}\n\nTEST(XmlOutputTest, GetOutputFileDefault) {\n  GTEST_FLAG(output) = \"\";\n  EXPECT_STREQ(GetAbsolutePathOf(FilePath(\"test_detail.xml\")).c_str(),\n               UnitTestOptions::GetAbsolutePathToOutputFile().c_str());\n}\n\nTEST(XmlOutputTest, GetOutputFileSingleFile) {\n  GTEST_FLAG(output) = \"xml:filename.abc\";\n  EXPECT_STREQ(GetAbsolutePathOf(FilePath(\"filename.abc\")).c_str(),\n               UnitTestOptions::GetAbsolutePathToOutputFile().c_str());\n}\n\nTEST(XmlOutputTest, GetOutputFileFromDirectoryPath) {\n  GTEST_FLAG(output) = \"xml:path\" GTEST_PATH_SEP_;\n  const std::string expected_output_file =\n      GetAbsolutePathOf(\n          FilePath(std::string(\"path\") + GTEST_PATH_SEP_ +\n                   GetCurrentExecutableName().c_str() + \".xml\")).c_str();\n  const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile();\n#if GTEST_OS_WINDOWS\n  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());\n#else\n  EXPECT_EQ(expected_output_file, output_file.c_str());\n#endif\n}\n\nTEST(OutputFileHelpersTest, GetCurrentExecutableName) {\n  const std::string exe_str = GetCurrentExecutableName().c_str();\n#if GTEST_OS_WINDOWS\n  const bool success =\n      _strcmpi(\"gtest-options_test\", exe_str.c_str()) == 0 ||\n      _strcmpi(\"gtest-options-ex_test\", exe_str.c_str()) == 0 ||\n      _strcmpi(\"gtest_all_test\", exe_str.c_str()) == 0 ||\n      _strcmpi(\"gtest_dll_test\", exe_str.c_str()) == 0;\n#else\n  // TODO(wan@google.com): remove the hard-coded \"lt-\" prefix when\n  //   Chandler Carruth's libtool replacement is ready.\n  const bool success =\n      exe_str == \"gtest-options_test\" ||\n      exe_str == \"gtest_all_test\" ||\n      exe_str == \"lt-gtest_all_test\" ||\n      exe_str == \"gtest_dll_test\";\n#endif  // GTEST_OS_WINDOWS\n  if (!success)\n    FAIL() << \"GetCurrentExecutableName() returns \" << exe_str;\n}\n\nclass XmlOutputChangeDirTest : public Test {\n protected:\n  virtual void SetUp() {\n    original_working_dir_ = FilePath::GetCurrentDir();\n    posix::ChDir(\"..\");\n    // This will make the test fail if run from the root directory.\n    EXPECT_STRNE(original_working_dir_.c_str(),\n                 FilePath::GetCurrentDir().c_str());\n  }\n\n  virtual void TearDown() {\n    posix::ChDir(original_working_dir_.c_str());\n  }\n\n  FilePath original_working_dir_;\n};\n\nTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefault) {\n  GTEST_FLAG(output) = \"\";\n  EXPECT_STREQ(FilePath::ConcatPaths(original_working_dir_,\n                                     FilePath(\"test_detail.xml\")).c_str(),\n               UnitTestOptions::GetAbsolutePathToOutputFile().c_str());\n}\n\nTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefaultXML) {\n  GTEST_FLAG(output) = \"xml\";\n  EXPECT_STREQ(FilePath::ConcatPaths(original_working_dir_,\n                                     FilePath(\"test_detail.xml\")).c_str(),\n               UnitTestOptions::GetAbsolutePathToOutputFile().c_str());\n}\n\nTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativeFile) {\n  GTEST_FLAG(output) = \"xml:filename.abc\";\n  EXPECT_STREQ(FilePath::ConcatPaths(original_working_dir_,\n                                     FilePath(\"filename.abc\")).c_str(),\n               UnitTestOptions::GetAbsolutePathToOutputFile().c_str());\n}\n\nTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativePath) {\n  GTEST_FLAG(output) = \"xml:path\" GTEST_PATH_SEP_;\n  const std::string expected_output_file =\n      FilePath::ConcatPaths(\n          original_working_dir_,\n          FilePath(std::string(\"path\") + GTEST_PATH_SEP_ +\n                   GetCurrentExecutableName().c_str() + \".xml\")).c_str();\n  const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile();\n#if GTEST_OS_WINDOWS\n  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());\n#else\n  EXPECT_EQ(expected_output_file, output_file.c_str());\n#endif\n}\n\nTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsoluteFile) {\n#if GTEST_OS_WINDOWS\n  GTEST_FLAG(output) = \"xml:c:\\\\tmp\\\\filename.abc\";\n  EXPECT_STREQ(FilePath(\"c:\\\\tmp\\\\filename.abc\").c_str(),\n               UnitTestOptions::GetAbsolutePathToOutputFile().c_str());\n#else\n  GTEST_FLAG(output) =\"xml:/tmp/filename.abc\";\n  EXPECT_STREQ(FilePath(\"/tmp/filename.abc\").c_str(),\n               UnitTestOptions::GetAbsolutePathToOutputFile().c_str());\n#endif\n}\n\nTEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsolutePath) {\n#if GTEST_OS_WINDOWS\n  const std::string path = \"c:\\\\tmp\\\\\";\n#else\n  const std::string path = \"/tmp/\";\n#endif\n\n  GTEST_FLAG(output) = \"xml:\" + path;\n  const std::string expected_output_file =\n      path + GetCurrentExecutableName().c_str() + \".xml\";\n  const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile();\n\n#if GTEST_OS_WINDOWS\n  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());\n#else\n  EXPECT_EQ(expected_output_file, output_file.c_str());\n#endif\n}\n\n}  // namespace\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test2_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: vladl@google.com (Vlad Losev)\n//\n// Tests for Google Test itself.  This verifies that the basic constructs of\n// Google Test work.\n\n#include <gtest/gtest.h>\n\n#include \"test/gtest-param-test_test.h\"\n\n#if GTEST_HAS_PARAM_TEST\n\nusing ::testing::Values;\nusing ::testing::internal::ParamGenerator;\n\n// Tests that generators defined in a different translation unit\n// are functional. The test using extern_gen is defined\n// in gtest-param-test_test.cc.\nParamGenerator<int> extern_gen = Values(33);\n\n// Tests that a parameterized test case can be defined in one translation unit\n// and instantiated in another. The test is defined in gtest-param-test_test.cc\n// and ExternalInstantiationTest fixture class is defined in\n// gtest-param-test_test.h.\nINSTANTIATE_TEST_CASE_P(MultiplesOf33,\n                        ExternalInstantiationTest,\n                        Values(33, 66));\n\n// Tests that a parameterized test case can be instantiated\n// in multiple translation units. Another instantiation is defined\n// in gtest-param-test_test.cc and InstantiationInMultipleTranslaionUnitsTest\n// fixture is defined in gtest-param-test_test.h\nINSTANTIATE_TEST_CASE_P(Sequence2,\n                        InstantiationInMultipleTranslaionUnitsTest,\n                        Values(42*3, 42*4, 42*5));\n\n#endif  // GTEST_HAS_PARAM_TEST\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: vladl@google.com (Vlad Losev)\n//\n// Tests for Google Test itself. This file verifies that the parameter\n// generators objects produce correct parameter sequences and that\n// Google Test runtime instantiates correct tests from those sequences.\n\n#include <gtest/gtest.h>\n\n#if GTEST_HAS_PARAM_TEST\n\n#include <algorithm>\n#include <iostream>\n#include <list>\n#include <sstream>\n#include <string>\n#include <vector>\n\n// To include gtest-internal-inl.h.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"  // for UnitTestOptions\n#undef GTEST_IMPLEMENTATION_\n\n#include \"test/gtest-param-test_test.h\"\n\nusing ::std::vector;\nusing ::std::sort;\n\nusing ::testing::AddGlobalTestEnvironment;\nusing ::testing::Bool;\nusing ::testing::Message;\nusing ::testing::Range;\nusing ::testing::TestWithParam;\nusing ::testing::Values;\nusing ::testing::ValuesIn;\n\n#if GTEST_HAS_COMBINE\nusing ::testing::Combine;\nusing ::std::tr1::get;\nusing ::std::tr1::make_tuple;\nusing ::std::tr1::tuple;\n#endif  // GTEST_HAS_COMBINE\n\nusing ::testing::internal::ParamGenerator;\nusing ::testing::internal::UnitTestOptions;\n\n// Prints a value to a string.\n//\n// TODO(wan@google.com): remove PrintValue() when we move matchers and\n// EXPECT_THAT() from Google Mock to Google Test.  At that time, we\n// can write EXPECT_THAT(x, Eq(y)) to compare two tuples x and y, as\n// EXPECT_THAT() and the matchers know how to print tuples.\ntemplate <typename T>\n::std::string PrintValue(const T& value) {\n  ::std::stringstream stream;\n  stream << value;\n  return stream.str();\n}\n\n#if GTEST_HAS_COMBINE\n\n// These overloads allow printing tuples in our tests.  We cannot\n// define an operator<< for tuples, as that definition needs to be in\n// the std namespace in order to be picked up by Google Test via\n// Argument-Dependent Lookup, yet defining anything in the std\n// namespace in non-STL code is undefined behavior.\n\ntemplate <typename T1, typename T2>\n::std::string PrintValue(const tuple<T1, T2>& value) {\n  ::std::stringstream stream;\n  stream << \"(\" << get<0>(value) << \", \" << get<1>(value) << \")\";\n  return stream.str();\n}\n\ntemplate <typename T1, typename T2, typename T3>\n::std::string PrintValue(const tuple<T1, T2, T3>& value) {\n  ::std::stringstream stream;\n  stream << \"(\" << get<0>(value) << \", \" << get<1>(value)\n         << \", \"<< get<2>(value) << \")\";\n  return stream.str();\n}\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5,\n          typename T6, typename T7, typename T8, typename T9, typename T10>\n::std::string PrintValue(\n    const tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& value) {\n  ::std::stringstream stream;\n  stream << \"(\" << get<0>(value) << \", \" << get<1>(value)\n         << \", \"<< get<2>(value) << \", \" << get<3>(value)\n         << \", \"<< get<4>(value) << \", \" << get<5>(value)\n         << \", \"<< get<6>(value) << \", \" << get<7>(value)\n         << \", \"<< get<8>(value) << \", \" << get<9>(value) << \")\";\n  return stream.str();\n}\n\n#endif  // GTEST_HAS_COMBINE\n\n// Verifies that a sequence generated by the generator and accessed\n// via the iterator object matches the expected one using Google Test\n// assertions.\ntemplate <typename T, size_t N>\nvoid VerifyGenerator(const ParamGenerator<T>& generator,\n                     const T (&expected_values)[N]) {\n  typename ParamGenerator<T>::iterator it = generator.begin();\n  for (size_t i = 0; i < N; ++i) {\n    ASSERT_FALSE(it == generator.end())\n        << \"At element \" << i << \" when accessing via an iterator \"\n        << \"created with the copy constructor.\\n\";\n    // We cannot use EXPECT_EQ() here as the values may be tuples,\n    // which don't support <<.\n    EXPECT_TRUE(expected_values[i] == *it)\n        << \"where i is \" << i\n        << \", expected_values[i] is \" << PrintValue(expected_values[i])\n        << \", *it is \" << PrintValue(*it)\n        << \", and 'it' is an iterator created with the copy constructor.\\n\";\n    it++;\n  }\n  EXPECT_TRUE(it == generator.end())\n        << \"At the presumed end of sequence when accessing via an iterator \"\n        << \"created with the copy constructor.\\n\";\n\n  // Test the iterator assignment. The following lines verify that\n  // the sequence accessed via an iterator initialized via the\n  // assignment operator (as opposed to a copy constructor) matches\n  // just the same.\n  it = generator.begin();\n  for (size_t i = 0; i < N; ++i) {\n    ASSERT_FALSE(it == generator.end())\n        << \"At element \" << i << \" when accessing via an iterator \"\n        << \"created with the assignment operator.\\n\";\n    EXPECT_TRUE(expected_values[i] == *it)\n        << \"where i is \" << i\n        << \", expected_values[i] is \" << PrintValue(expected_values[i])\n        << \", *it is \" << PrintValue(*it)\n        << \", and 'it' is an iterator created with the copy constructor.\\n\";\n    it++;\n  }\n  EXPECT_TRUE(it == generator.end())\n        << \"At the presumed end of sequence when accessing via an iterator \"\n        << \"created with the assignment operator.\\n\";\n}\n\ntemplate <typename T>\nvoid VerifyGeneratorIsEmpty(const ParamGenerator<T>& generator) {\n  typename ParamGenerator<T>::iterator it = generator.begin();\n  EXPECT_TRUE(it == generator.end());\n\n  it = generator.begin();\n  EXPECT_TRUE(it == generator.end());\n}\n\n// Generator tests. They test that each of the provided generator functions\n// generates an expected sequence of values. The general test pattern\n// instantiates a generator using one of the generator functions,\n// checks the sequence produced by the generator using its iterator API,\n// and then resets the iterator back to the beginning of the sequence\n// and checks the sequence again.\n\n// Tests that iterators produced by generator functions conform to the\n// ForwardIterator concept.\nTEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) {\n  const ParamGenerator<int> gen = Range(0, 10);\n  ParamGenerator<int>::iterator it = gen.begin();\n\n  // Verifies that iterator initialization works as expected.\n  ParamGenerator<int>::iterator it2 = it;\n  EXPECT_TRUE(*it == *it2) << \"Initialized iterators must point to the \"\n                           << \"element same as its source points to\";\n\n  // Verifies that iterator assignment works as expected.\n  it++;\n  EXPECT_FALSE(*it == *it2);\n  it2 = it;\n  EXPECT_TRUE(*it == *it2) << \"Assigned iterators must point to the \"\n                           << \"element same as its source points to\";\n\n  // Verifies that prefix operator++() returns *this.\n  EXPECT_EQ(&it, &(++it)) << \"Result of the prefix operator++ must be \"\n                          << \"refer to the original object\";\n\n  // Verifies that the result of the postfix operator++ points to the value\n  // pointed to by the original iterator.\n  int original_value = *it;  // Have to compute it outside of macro call to be\n                             // unaffected by the parameter evaluation order.\n  EXPECT_EQ(original_value, *(it++));\n\n  // Verifies that prefix and postfix operator++() advance an iterator\n  // all the same.\n  it2 = it;\n  it++;\n  ++it2;\n  EXPECT_TRUE(*it == *it2);\n}\n\n// Tests that Range() generates the expected sequence.\nTEST(RangeTest, IntRangeWithDefaultStep) {\n  const ParamGenerator<int> gen = Range(0, 3);\n  const int expected_values[] = {0, 1, 2};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Edge case. Tests that Range() generates the single element sequence\n// as expected when provided with range limits that are equal.\nTEST(RangeTest, IntRangeSingleValue) {\n  const ParamGenerator<int> gen = Range(0, 1);\n  const int expected_values[] = {0};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Edge case. Tests that Range() with generates empty sequence when\n// supplied with an empty range.\nTEST(RangeTest, IntRangeEmpty) {\n  const ParamGenerator<int> gen = Range(0, 0);\n  VerifyGeneratorIsEmpty(gen);\n}\n\n// Tests that Range() with custom step (greater then one) generates\n// the expected sequence.\nTEST(RangeTest, IntRangeWithCustomStep) {\n  const ParamGenerator<int> gen = Range(0, 9, 3);\n  const int expected_values[] = {0, 3, 6};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that Range() with custom step (greater then one) generates\n// the expected sequence when the last element does not fall on the\n// upper range limit. Sequences generated by Range() must not have\n// elements beyond the range limits.\nTEST(RangeTest, IntRangeWithCustomStepOverUpperBound) {\n  const ParamGenerator<int> gen = Range(0, 4, 3);\n  const int expected_values[] = {0, 3};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Verifies that Range works with user-defined types that define\n// copy constructor, operator=(), operator+(), and operator<().\nclass DogAdder {\n public:\n  explicit DogAdder(const char* a_value) : value_(a_value) {}\n  DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {}\n\n  DogAdder operator=(const DogAdder& other) {\n    if (this != &other)\n      value_ = other.value_;\n    return *this;\n  }\n  DogAdder operator+(const DogAdder& other) const {\n    Message msg;\n    msg << value_.c_str() << other.value_.c_str();\n    return DogAdder(msg.GetString().c_str());\n  }\n  bool operator<(const DogAdder& other) const {\n    return value_ < other.value_;\n  }\n  const ::testing::internal::String& value() const { return value_; }\n\n private:\n  ::testing::internal::String value_;\n};\n\nTEST(RangeTest, WorksWithACustomType) {\n  const ParamGenerator<DogAdder> gen =\n      Range(DogAdder(\"cat\"), DogAdder(\"catdogdog\"), DogAdder(\"dog\"));\n  ParamGenerator<DogAdder>::iterator it = gen.begin();\n\n  ASSERT_FALSE(it == gen.end());\n  EXPECT_STREQ(\"cat\", it->value().c_str());\n\n  ASSERT_FALSE(++it == gen.end());\n  EXPECT_STREQ(\"catdog\", it->value().c_str());\n\n  EXPECT_TRUE(++it == gen.end());\n}\n\nclass IntWrapper {\n public:\n  explicit IntWrapper(int a_value) : value_(a_value) {}\n  IntWrapper(const IntWrapper& other) : value_(other.value_) {}\n\n  IntWrapper operator=(const IntWrapper& other) {\n    value_ = other.value_;\n    return *this;\n  }\n  // operator+() adds a different type.\n  IntWrapper operator+(int other) const { return IntWrapper(value_ + other); }\n  bool operator<(const IntWrapper& other) const {\n    return value_ < other.value_;\n  }\n  int value() const { return value_; }\n\n private:\n  int value_;\n};\n\nTEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) {\n  const ParamGenerator<IntWrapper> gen = Range(IntWrapper(0), IntWrapper(2));\n  ParamGenerator<IntWrapper>::iterator it = gen.begin();\n\n  ASSERT_FALSE(it == gen.end());\n  EXPECT_EQ(0, it->value());\n\n  ASSERT_FALSE(++it == gen.end());\n  EXPECT_EQ(1, it->value());\n\n  EXPECT_TRUE(++it == gen.end());\n}\n\n// Tests that ValuesIn() with an array parameter generates\n// the expected sequence.\nTEST(ValuesInTest, ValuesInArray) {\n  int array[] = {3, 5, 8};\n  const ParamGenerator<int> gen = ValuesIn(array);\n  VerifyGenerator(gen, array);\n}\n\n// Tests that ValuesIn() with a const array parameter generates\n// the expected sequence.\nTEST(ValuesInTest, ValuesInConstArray) {\n  const int array[] = {3, 5, 8};\n  const ParamGenerator<int> gen = ValuesIn(array);\n  VerifyGenerator(gen, array);\n}\n\n// Edge case. Tests that ValuesIn() with an array parameter containing a\n// single element generates the single element sequence.\nTEST(ValuesInTest, ValuesInSingleElementArray) {\n  int array[] = {42};\n  const ParamGenerator<int> gen = ValuesIn(array);\n  VerifyGenerator(gen, array);\n}\n\n// Tests that ValuesIn() generates the expected sequence for an STL\n// container (vector).\nTEST(ValuesInTest, ValuesInVector) {\n  typedef ::std::vector<int> ContainerType;\n  ContainerType values;\n  values.push_back(3);\n  values.push_back(5);\n  values.push_back(8);\n  const ParamGenerator<int> gen = ValuesIn(values);\n\n  const int expected_values[] = {3, 5, 8};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that ValuesIn() generates the expected sequence.\nTEST(ValuesInTest, ValuesInIteratorRange) {\n  typedef ::std::vector<int> ContainerType;\n  ContainerType values;\n  values.push_back(3);\n  values.push_back(5);\n  values.push_back(8);\n  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());\n\n  const int expected_values[] = {3, 5, 8};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Edge case. Tests that ValuesIn() provided with an iterator range specifying a\n// single value generates a single-element sequence.\nTEST(ValuesInTest, ValuesInSingleElementIteratorRange) {\n  typedef ::std::vector<int> ContainerType;\n  ContainerType values;\n  values.push_back(42);\n  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());\n\n  const int expected_values[] = {42};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Edge case. Tests that ValuesIn() provided with an empty iterator range\n// generates an empty sequence.\nTEST(ValuesInTest, ValuesInEmptyIteratorRange) {\n  typedef ::std::vector<int> ContainerType;\n  ContainerType values;\n  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());\n\n  VerifyGeneratorIsEmpty(gen);\n}\n\n// Tests that the Values() generates the expected sequence.\nTEST(ValuesTest, ValuesWorks) {\n  const ParamGenerator<int> gen = Values(3, 5, 8);\n\n  const int expected_values[] = {3, 5, 8};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that Values() generates the expected sequences from elements of\n// different types convertible to ParamGenerator's parameter type.\nTEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) {\n  const ParamGenerator<double> gen = Values(3, 5.0f, 8.0);\n\n  const double expected_values[] = {3.0, 5.0, 8.0};\n  VerifyGenerator(gen, expected_values);\n}\n\nTEST(ValuesTest, ValuesWorksForMaxLengthList) {\n  const ParamGenerator<int> gen = Values(\n      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,\n      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,\n      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,\n      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,\n      410, 420, 430, 440, 450, 460, 470, 480, 490, 500);\n\n  const int expected_values[] = {\n      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,\n      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,\n      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,\n      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,\n      410, 420, 430, 440, 450, 460, 470, 480, 490, 500};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Edge case test. Tests that single-parameter Values() generates the sequence\n// with the single value.\nTEST(ValuesTest, ValuesWithSingleParameter) {\n  const ParamGenerator<int> gen = Values(42);\n\n  const int expected_values[] = {42};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that Bool() generates sequence (false, true).\nTEST(BoolTest, BoolWorks) {\n  const ParamGenerator<bool> gen = Bool();\n\n  const bool expected_values[] = {false, true};\n  VerifyGenerator(gen, expected_values);\n}\n\n#if GTEST_HAS_COMBINE\n\n// Tests that Combine() with two parameters generates the expected sequence.\nTEST(CombineTest, CombineWithTwoParameters) {\n  const char* foo = \"foo\";\n  const char* bar = \"bar\";\n  const ParamGenerator<tuple<const char*, int> > gen =\n      Combine(Values(foo, bar), Values(3, 4));\n\n  tuple<const char*, int> expected_values[] = {\n    make_tuple(foo, 3), make_tuple(foo, 4),\n    make_tuple(bar, 3), make_tuple(bar, 4)};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that Combine() with three parameters generates the expected sequence.\nTEST(CombineTest, CombineWithThreeParameters) {\n  const ParamGenerator<tuple<int, int, int> > gen = Combine(Values(0, 1),\n                                                            Values(3, 4),\n                                                            Values(5, 6));\n  tuple<int, int, int> expected_values[] = {\n    make_tuple(0, 3, 5), make_tuple(0, 3, 6),\n    make_tuple(0, 4, 5), make_tuple(0, 4, 6),\n    make_tuple(1, 3, 5), make_tuple(1, 3, 6),\n    make_tuple(1, 4, 5), make_tuple(1, 4, 6)};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that the Combine() with the first parameter generating a single value\n// sequence generates a sequence with the number of elements equal to the\n// number of elements in the sequence generated by the second parameter.\nTEST(CombineTest, CombineWithFirstParameterSingleValue) {\n  const ParamGenerator<tuple<int, int> > gen = Combine(Values(42),\n                                                       Values(0, 1));\n\n  tuple<int, int> expected_values[] = {make_tuple(42, 0), make_tuple(42, 1)};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that the Combine() with the second parameter generating a single value\n// sequence generates a sequence with the number of elements equal to the\n// number of elements in the sequence generated by the first parameter.\nTEST(CombineTest, CombineWithSecondParameterSingleValue) {\n  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),\n                                                       Values(42));\n\n  tuple<int, int> expected_values[] = {make_tuple(0, 42), make_tuple(1, 42)};\n  VerifyGenerator(gen, expected_values);\n}\n\n// Tests that when the first parameter produces an empty sequence,\n// Combine() produces an empty sequence, too.\nTEST(CombineTest, CombineWithFirstParameterEmptyRange) {\n  const ParamGenerator<tuple<int, int> > gen = Combine(Range(0, 0),\n                                                       Values(0, 1));\n  VerifyGeneratorIsEmpty(gen);\n}\n\n// Tests that when the second parameter produces an empty sequence,\n// Combine() produces an empty sequence, too.\nTEST(CombineTest, CombineWithSecondParameterEmptyRange) {\n  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),\n                                                       Range(1, 1));\n  VerifyGeneratorIsEmpty(gen);\n}\n\n// Edge case. Tests that combine works with the maximum number\n// of parameters supported by Google Test (currently 10).\nTEST(CombineTest, CombineWithMaxNumberOfParameters) {\n  const char* foo = \"foo\";\n  const char* bar = \"bar\";\n  const ParamGenerator<tuple<const char*, int, int, int, int, int, int, int,\n                             int, int> > gen = Combine(Values(foo, bar),\n                                                       Values(1), Values(2),\n                                                       Values(3), Values(4),\n                                                       Values(5), Values(6),\n                                                       Values(7), Values(8),\n                                                       Values(9));\n\n  tuple<const char*, int, int, int, int, int, int, int, int, int>\n      expected_values[] = {make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9),\n                           make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)};\n  VerifyGenerator(gen, expected_values);\n}\n\n#endif  // GTEST_HAS_COMBINE\n\n// Tests that an generator produces correct sequence after being\n// assigned from another generator.\nTEST(ParamGeneratorTest, AssignmentWorks) {\n  ParamGenerator<int> gen = Values(1, 2);\n  const ParamGenerator<int> gen2 = Values(3, 4);\n  gen = gen2;\n\n  const int expected_values[] = {3, 4};\n  VerifyGenerator(gen, expected_values);\n}\n\n// This test verifies that the tests are expanded and run as specified:\n// one test per element from the sequence produced by the generator\n// specified in INSTANTIATE_TEST_CASE_P. It also verifies that the test's\n// fixture constructor, SetUp(), and TearDown() have run and have been\n// supplied with the correct parameters.\n\n// The use of environment object allows detection of the case where no test\n// case functionality is run at all. In this case TestCaseTearDown will not\n// be able to detect missing tests, naturally.\ntemplate <int kExpectedCalls>\nclass TestGenerationEnvironment : public ::testing::Environment {\n public:\n  static TestGenerationEnvironment* Instance() {\n    static TestGenerationEnvironment* instance = new TestGenerationEnvironment;\n    return instance;\n  }\n\n  void FixtureConstructorExecuted() { fixture_constructor_count_++; }\n  void SetUpExecuted() { set_up_count_++; }\n  void TearDownExecuted() { tear_down_count_++; }\n  void TestBodyExecuted() { test_body_count_++; }\n\n  virtual void TearDown() {\n    // If all MultipleTestGenerationTest tests have been de-selected\n    // by the filter flag, the following checks make no sense.\n    bool perform_check = false;\n\n    for (int i = 0; i < kExpectedCalls; ++i) {\n      Message msg;\n      msg << \"TestsExpandedAndRun/\" << i;\n      if (UnitTestOptions::FilterMatchesTest(\n             \"TestExpansionModule/MultipleTestGenerationTest\",\n              msg.GetString().c_str())) {\n        perform_check = true;\n      }\n    }\n    if (perform_check) {\n      EXPECT_EQ(kExpectedCalls, fixture_constructor_count_)\n          << \"Fixture constructor of ParamTestGenerationTest test case \"\n          << \"has not been run as expected.\";\n      EXPECT_EQ(kExpectedCalls, set_up_count_)\n          << \"Fixture SetUp method of ParamTestGenerationTest test case \"\n          << \"has not been run as expected.\";\n      EXPECT_EQ(kExpectedCalls, tear_down_count_)\n          << \"Fixture TearDown method of ParamTestGenerationTest test case \"\n          << \"has not been run as expected.\";\n      EXPECT_EQ(kExpectedCalls, test_body_count_)\n          << \"Test in ParamTestGenerationTest test case \"\n          << \"has not been run as expected.\";\n    }\n  }\n private:\n  TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0),\n                                tear_down_count_(0), test_body_count_(0) {}\n\n  int fixture_constructor_count_;\n  int set_up_count_;\n  int tear_down_count_;\n  int test_body_count_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment);\n};\n\nconst int test_generation_params[] = {36, 42, 72};\n\nclass TestGenerationTest : public TestWithParam<int> {\n public:\n  enum {\n    PARAMETER_COUNT =\n        sizeof(test_generation_params)/sizeof(test_generation_params[0])\n  };\n\n  typedef TestGenerationEnvironment<PARAMETER_COUNT> Environment;\n\n  TestGenerationTest() {\n    Environment::Instance()->FixtureConstructorExecuted();\n    current_parameter_ = GetParam();\n  }\n  virtual void SetUp() {\n    Environment::Instance()->SetUpExecuted();\n    EXPECT_EQ(current_parameter_, GetParam());\n  }\n  virtual void TearDown() {\n    Environment::Instance()->TearDownExecuted();\n    EXPECT_EQ(current_parameter_, GetParam());\n  }\n\n  static void SetUpTestCase() {\n    bool all_tests_in_test_case_selected = true;\n\n    for (int i = 0; i < PARAMETER_COUNT; ++i) {\n      Message test_name;\n      test_name << \"TestsExpandedAndRun/\" << i;\n      if ( !UnitTestOptions::FilterMatchesTest(\n                \"TestExpansionModule/MultipleTestGenerationTest\",\n                test_name.GetString())) {\n        all_tests_in_test_case_selected = false;\n      }\n    }\n    EXPECT_TRUE(all_tests_in_test_case_selected)\n        << \"When running the TestGenerationTest test case all of its tests\\n\"\n        << \"must be selected by the filter flag for the test case to pass.\\n\"\n        << \"If not all of them are enabled, we can't reliably conclude\\n\"\n        << \"that the correct number of tests have been generated.\";\n\n    collected_parameters_.clear();\n  }\n\n  static void TearDownTestCase() {\n    vector<int> expected_values(test_generation_params,\n                                test_generation_params + PARAMETER_COUNT);\n    // Test execution order is not guaranteed by Google Test,\n    // so the order of values in collected_parameters_ can be\n    // different and we have to sort to compare.\n    sort(expected_values.begin(), expected_values.end());\n    sort(collected_parameters_.begin(), collected_parameters_.end());\n\n    EXPECT_TRUE(collected_parameters_ == expected_values);\n  }\n protected:\n  int current_parameter_;\n  static vector<int> collected_parameters_;\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest);\n};\nvector<int> TestGenerationTest::collected_parameters_;\n\nTEST_P(TestGenerationTest, TestsExpandedAndRun) {\n  Environment::Instance()->TestBodyExecuted();\n  EXPECT_EQ(current_parameter_, GetParam());\n  collected_parameters_.push_back(GetParam());\n}\nINSTANTIATE_TEST_CASE_P(TestExpansionModule, TestGenerationTest,\n                        ValuesIn(test_generation_params));\n\n// This test verifies that the element sequence (third parameter of\n// INSTANTIATE_TEST_CASE_P) is evaluated in InitGoogleTest() and neither at\n// the call site of INSTANTIATE_TEST_CASE_P nor in RUN_ALL_TESTS().  For\n// that, we declare param_value_ to be a static member of\n// GeneratorEvaluationTest and initialize it to 0.  We set it to 1 in\n// main(), just before invocation of InitGoogleTest().  After calling\n// InitGoogleTest(), we set the value to 2.  If the sequence is evaluated\n// before or after InitGoogleTest, INSTANTIATE_TEST_CASE_P will create a\n// test with parameter other than 1, and the test body will fail the\n// assertion.\nclass GeneratorEvaluationTest : public TestWithParam<int> {\n public:\n  static int param_value() { return param_value_; }\n  static void set_param_value(int param_value) { param_value_ = param_value; }\n\n private:\n  static int param_value_;\n};\nint GeneratorEvaluationTest::param_value_ = 0;\n\nTEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) {\n  EXPECT_EQ(1, GetParam());\n}\nINSTANTIATE_TEST_CASE_P(GenEvalModule,\n                        GeneratorEvaluationTest,\n                        Values(GeneratorEvaluationTest::param_value()));\n\n// Tests that generators defined in a different translation unit are\n// functional. Generator extern_gen is defined in gtest-param-test_test2.cc.\nextern ParamGenerator<int> extern_gen;\nclass ExternalGeneratorTest : public TestWithParam<int> {};\nTEST_P(ExternalGeneratorTest, ExternalGenerator) {\n  // Sequence produced by extern_gen contains only a single value\n  // which we verify here.\n  EXPECT_EQ(GetParam(), 33);\n}\nINSTANTIATE_TEST_CASE_P(ExternalGeneratorModule,\n                        ExternalGeneratorTest,\n                        extern_gen);\n\n// Tests that a parameterized test case can be defined in one translation\n// unit and instantiated in another. This test will be instantiated in\n// gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is\n// defined in gtest-param-test_test.h.\nTEST_P(ExternalInstantiationTest, IsMultipleOf33) {\n  EXPECT_EQ(0, GetParam() % 33);\n}\n\n// Tests that a parameterized test case can be instantiated with multiple\n// generators.\nclass MultipleInstantiationTest : public TestWithParam<int> {};\nTEST_P(MultipleInstantiationTest, AllowsMultipleInstances) {\n}\nINSTANTIATE_TEST_CASE_P(Sequence1, MultipleInstantiationTest, Values(1, 2));\nINSTANTIATE_TEST_CASE_P(Sequence2, MultipleInstantiationTest, Range(3, 5));\n\n// Tests that a parameterized test case can be instantiated\n// in multiple translation units. This test will be instantiated\n// here and in gtest-param-test_test2.cc.\n// InstantiationInMultipleTranslationUnitsTest fixture class\n// is defined in gtest-param-test_test.h.\nTEST_P(InstantiationInMultipleTranslaionUnitsTest, IsMultipleOf42) {\n  EXPECT_EQ(0, GetParam() % 42);\n}\nINSTANTIATE_TEST_CASE_P(Sequence1,\n                        InstantiationInMultipleTranslaionUnitsTest,\n                        Values(42, 42*2));\n\n// Tests that each iteration of parameterized test runs in a separate test\n// object.\nclass SeparateInstanceTest : public TestWithParam<int> {\n public:\n  SeparateInstanceTest() : count_(0) {}\n\n  static void TearDownTestCase() {\n    EXPECT_GE(global_count_, 2)\n        << \"If some (but not all) SeparateInstanceTest tests have been \"\n        << \"filtered out this test will fail. Make sure that all \"\n        << \"GeneratorEvaluationTest are selected or de-selected together \"\n        << \"by the test filter.\";\n  }\n\n protected:\n  int count_;\n  static int global_count_;\n};\nint SeparateInstanceTest::global_count_ = 0;\n\nTEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) {\n  EXPECT_EQ(0, count_++);\n  global_count_++;\n}\nINSTANTIATE_TEST_CASE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4));\n\n// Tests that all instantiations of a test have named appropriately. Test\n// defined with TEST_P(TestCaseName, TestName) and instantiated with\n// INSTANTIATE_TEST_CASE_P(SequenceName, TestCaseName, generator) must be named\n// SequenceName/TestCaseName.TestName/i, where i is the 0-based index of the\n// sequence element used to instantiate the test.\nclass NamingTest : public TestWithParam<int> {};\n\nTEST_P(NamingTest, TestsAreNamedAppropriately) {\n  const ::testing::TestInfo* const test_info =\n     ::testing::UnitTest::GetInstance()->current_test_info();\n\n  EXPECT_STREQ(\"ZeroToFiveSequence/NamingTest\", test_info->test_case_name());\n\n  Message msg;\n  msg << \"TestsAreNamedAppropriately/\" << GetParam();\n  EXPECT_STREQ(msg.GetString().c_str(), test_info->name());\n}\n\nINSTANTIATE_TEST_CASE_P(ZeroToFiveSequence, NamingTest, Range(0, 5));\n\n#endif  // GTEST_HAS_PARAM_TEST\n\nTEST(CompileTest, CombineIsDefinedOnlyWhenGtestHasParamTestIsDefined) {\n#if GTEST_HAS_COMBINE && !GTEST_HAS_PARAM_TEST\n  FAIL() << \"GTEST_HAS_COMBINE is defined while GTEST_HAS_PARAM_TEST is not\\n\"\n#endif\n}\n\nint main(int argc, char **argv) {\n#if GTEST_HAS_PARAM_TEST\n  // Used in TestGenerationTest test case.\n  AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance());\n  // Used in GeneratorEvaluationTest test case. Tests that the updated value\n  // will be picked up for instantiating tests in GeneratorEvaluationTest.\n  GeneratorEvaluationTest::set_param_value(1);\n#endif  // GTEST_HAS_PARAM_TEST\n\n  ::testing::InitGoogleTest(&argc, argv);\n\n#if GTEST_HAS_PARAM_TEST\n  // Used in GeneratorEvaluationTest test case. Tests that value updated\n  // here will NOT be used for instantiating tests in\n  // GeneratorEvaluationTest.\n  GeneratorEvaluationTest::set_param_value(2);\n#endif  // GTEST_HAS_PARAM_TEST\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.h",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: vladl@google.com (Vlad Losev)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This header file provides classes and functions used internally\n// for testing Google Test itself.\n\n#ifndef GTEST_TEST_GTEST_PARAM_TEST_TEST_H_\n#define GTEST_TEST_GTEST_PARAM_TEST_TEST_H_\n\n#include <gtest/gtest.h>\n\n#if GTEST_HAS_PARAM_TEST\n\n// Test fixture for testing definition and instantiation of a test\n// in separate translation units.\nclass ExternalInstantiationTest : public ::testing::TestWithParam<int> {};\n\n// Test fixture for testing instantiation of a test in multiple\n// translation units.\nclass InstantiationInMultipleTranslaionUnitsTest\n    : public ::testing::TestWithParam<int> {};\n\n#endif  // GTEST_HAS_PARAM_TEST\n\n#endif  // GTEST_TEST_GTEST_PARAM_TEST_TEST_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-port_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Authors: vladl@google.com (Vlad Losev), wan@google.com (Zhanyong Wan)\n//\n// This file tests the internal cross-platform support utilities.\n\n#include <gtest/internal/gtest-port.h>\n\n#include <stdio.h>\n\n#if GTEST_OS_MAC\n#include <time.h>\n#endif  // GTEST_OS_MAC\n\n#include <utility>  // For std::pair and std::make_pair.\n\n#include <gtest/gtest.h>\n#include <gtest/gtest-spi.h>\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\nusing std::make_pair;\nusing std::pair;\n\nnamespace testing {\nnamespace internal {\n\n// Tests that the element_type typedef is available in scoped_ptr and refers\n// to the parameter type.\nTEST(ScopedPtrTest, DefinesElementType) {\n  StaticAssertTypeEq<int, ::testing::internal::scoped_ptr<int>::element_type>();\n}\n\n// TODO(vladl@google.com): Implement THE REST of scoped_ptr tests.\n\nTEST(GtestCheckSyntaxTest, BehavesLikeASingleStatement) {\n  if (AlwaysFalse())\n    GTEST_CHECK_(false) << \"This should never be executed; \"\n                           \"It's a compilation test only.\";\n\n  if (AlwaysTrue())\n    GTEST_CHECK_(true);\n  else\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    ;  // NOLINT\n  else\n    GTEST_CHECK_(true) << \"\";\n}\n\nTEST(GtestCheckSyntaxTest, WorksWithSwitch) {\n  switch (0) {\n    case 1:\n      break;\n    default:\n      GTEST_CHECK_(true);\n  }\n\n  switch(0)\n    case 0:\n      GTEST_CHECK_(true) << \"Check failed in switch case\";\n}\n\n#if GTEST_OS_MAC\nvoid* ThreadFunc(void* data) {\n  pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data);\n  pthread_mutex_lock(mutex);\n  pthread_mutex_unlock(mutex);\n  return NULL;\n}\n\nTEST(GetThreadCountTest, ReturnsCorrectValue) {\n  EXPECT_EQ(1U, GetThreadCount());\n  pthread_mutex_t mutex;\n  pthread_attr_t  attr;\n  pthread_t       thread_id;\n\n  // TODO(vladl@google.com): turn mutex into internal::Mutex for automatic\n  // destruction.\n  pthread_mutex_init(&mutex, NULL);\n  pthread_mutex_lock(&mutex);\n  ASSERT_EQ(0, pthread_attr_init(&attr));\n  ASSERT_EQ(0, pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE));\n\n  const int status = pthread_create(&thread_id, &attr, &ThreadFunc, &mutex);\n  ASSERT_EQ(0, pthread_attr_destroy(&attr));\n  ASSERT_EQ(0, status);\n  EXPECT_EQ(2U, GetThreadCount());\n  pthread_mutex_unlock(&mutex);\n\n  void* dummy;\n  ASSERT_EQ(0, pthread_join(thread_id, &dummy));\n\n  // MacOS X may not immediately report the updated thread count after\n  // joining a thread, causing flakiness in this test. To counter that, we\n  // wait for up to .5 seconds for the OS to report the correct value.\n  for (int i = 0; i < 5; ++i) {\n    if (GetThreadCount() == 1)\n      break;\n\n    SleepMilliseconds(100);\n  }\n  EXPECT_EQ(1U, GetThreadCount());\n  pthread_mutex_destroy(&mutex);\n}\n#else\nTEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) {\n  EXPECT_EQ(0U, GetThreadCount());\n}\n#endif  // GTEST_OS_MAC\n\nTEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) {\n  const bool a_false_condition = false;\n  const char regex[] =\n#ifdef _MSC_VER\n     \"gtest-port_test\\\\.cc\\\\(\\\\d+\\\\):\"\n#else\n     \"gtest-port_test\\\\.cc:[0-9]+\"\n#endif  // _MSC_VER\n     \".*a_false_condition.*Extra info.*\";\n\n  EXPECT_DEATH_IF_SUPPORTED(GTEST_CHECK_(a_false_condition) << \"Extra info\",\n                            regex);\n}\n\n#if GTEST_HAS_DEATH_TEST\n\nTEST(GtestCheckDeathTest, LivesSilentlyOnSuccess) {\n  EXPECT_EXIT({\n      GTEST_CHECK_(true) << \"Extra info\";\n      ::std::cerr << \"Success\\n\";\n      exit(0); },\n      ::testing::ExitedWithCode(0), \"Success\");\n}\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n#if GTEST_USES_POSIX_RE\n\n#if GTEST_HAS_TYPED_TEST\n\ntemplate <typename Str>\nclass RETest : public ::testing::Test {};\n\n// Defines StringTypes as the list of all string types that class RE\n// supports.\ntypedef testing::Types<\n    ::std::string,\n#if GTEST_HAS_GLOBAL_STRING\n    ::string,\n#endif  // GTEST_HAS_GLOBAL_STRING\n    const char*> StringTypes;\n\nTYPED_TEST_CASE(RETest, StringTypes);\n\n// Tests RE's implicit constructors.\nTYPED_TEST(RETest, ImplicitConstructorWorks) {\n  const RE empty(TypeParam(\"\"));\n  EXPECT_STREQ(\"\", empty.pattern());\n\n  const RE simple(TypeParam(\"hello\"));\n  EXPECT_STREQ(\"hello\", simple.pattern());\n\n  const RE normal(TypeParam(\".*(\\\\w+)\"));\n  EXPECT_STREQ(\".*(\\\\w+)\", normal.pattern());\n}\n\n// Tests that RE's constructors reject invalid regular expressions.\nTYPED_TEST(RETest, RejectsInvalidRegex) {\n  EXPECT_NONFATAL_FAILURE({\n    const RE invalid(TypeParam(\"?\"));\n  }, \"\\\"?\\\" is not a valid POSIX Extended regular expression.\");\n}\n\n// Tests RE::FullMatch().\nTYPED_TEST(RETest, FullMatchWorks) {\n  const RE empty(TypeParam(\"\"));\n  EXPECT_TRUE(RE::FullMatch(TypeParam(\"\"), empty));\n  EXPECT_FALSE(RE::FullMatch(TypeParam(\"a\"), empty));\n\n  const RE re(TypeParam(\"a.*z\"));\n  EXPECT_TRUE(RE::FullMatch(TypeParam(\"az\"), re));\n  EXPECT_TRUE(RE::FullMatch(TypeParam(\"axyz\"), re));\n  EXPECT_FALSE(RE::FullMatch(TypeParam(\"baz\"), re));\n  EXPECT_FALSE(RE::FullMatch(TypeParam(\"azy\"), re));\n}\n\n// Tests RE::PartialMatch().\nTYPED_TEST(RETest, PartialMatchWorks) {\n  const RE empty(TypeParam(\"\"));\n  EXPECT_TRUE(RE::PartialMatch(TypeParam(\"\"), empty));\n  EXPECT_TRUE(RE::PartialMatch(TypeParam(\"a\"), empty));\n\n  const RE re(TypeParam(\"a.*z\"));\n  EXPECT_TRUE(RE::PartialMatch(TypeParam(\"az\"), re));\n  EXPECT_TRUE(RE::PartialMatch(TypeParam(\"axyz\"), re));\n  EXPECT_TRUE(RE::PartialMatch(TypeParam(\"baz\"), re));\n  EXPECT_TRUE(RE::PartialMatch(TypeParam(\"azy\"), re));\n  EXPECT_FALSE(RE::PartialMatch(TypeParam(\"zza\"), re));\n}\n\n#endif  // GTEST_HAS_TYPED_TEST\n\n#elif GTEST_USES_SIMPLE_RE\n\nTEST(IsInSetTest, NulCharIsNotInAnySet) {\n  EXPECT_FALSE(IsInSet('\\0', \"\"));\n  EXPECT_FALSE(IsInSet('\\0', \"\\0\"));\n  EXPECT_FALSE(IsInSet('\\0', \"a\"));\n}\n\nTEST(IsInSetTest, WorksForNonNulChars) {\n  EXPECT_FALSE(IsInSet('a', \"Ab\"));\n  EXPECT_FALSE(IsInSet('c', \"\"));\n\n  EXPECT_TRUE(IsInSet('b', \"bcd\"));\n  EXPECT_TRUE(IsInSet('b', \"ab\"));\n}\n\nTEST(IsDigitTest, IsFalseForNonDigit) {\n  EXPECT_FALSE(IsDigit('\\0'));\n  EXPECT_FALSE(IsDigit(' '));\n  EXPECT_FALSE(IsDigit('+'));\n  EXPECT_FALSE(IsDigit('-'));\n  EXPECT_FALSE(IsDigit('.'));\n  EXPECT_FALSE(IsDigit('a'));\n}\n\nTEST(IsDigitTest, IsTrueForDigit) {\n  EXPECT_TRUE(IsDigit('0'));\n  EXPECT_TRUE(IsDigit('1'));\n  EXPECT_TRUE(IsDigit('5'));\n  EXPECT_TRUE(IsDigit('9'));\n}\n\nTEST(IsPunctTest, IsFalseForNonPunct) {\n  EXPECT_FALSE(IsPunct('\\0'));\n  EXPECT_FALSE(IsPunct(' '));\n  EXPECT_FALSE(IsPunct('\\n'));\n  EXPECT_FALSE(IsPunct('a'));\n  EXPECT_FALSE(IsPunct('0'));\n}\n\nTEST(IsPunctTest, IsTrueForPunct) {\n  for (const char* p = \"^-!\\\"#$%&'()*+,./:;<=>?@[\\\\]_`{|}~\"; *p; p++) {\n    EXPECT_PRED1(IsPunct, *p);\n  }\n}\n\nTEST(IsRepeatTest, IsFalseForNonRepeatChar) {\n  EXPECT_FALSE(IsRepeat('\\0'));\n  EXPECT_FALSE(IsRepeat(' '));\n  EXPECT_FALSE(IsRepeat('a'));\n  EXPECT_FALSE(IsRepeat('1'));\n  EXPECT_FALSE(IsRepeat('-'));\n}\n\nTEST(IsRepeatTest, IsTrueForRepeatChar) {\n  EXPECT_TRUE(IsRepeat('?'));\n  EXPECT_TRUE(IsRepeat('*'));\n  EXPECT_TRUE(IsRepeat('+'));\n}\n\nTEST(IsWhiteSpaceTest, IsFalseForNonWhiteSpace) {\n  EXPECT_FALSE(IsWhiteSpace('\\0'));\n  EXPECT_FALSE(IsWhiteSpace('a'));\n  EXPECT_FALSE(IsWhiteSpace('1'));\n  EXPECT_FALSE(IsWhiteSpace('+'));\n  EXPECT_FALSE(IsWhiteSpace('_'));\n}\n\nTEST(IsWhiteSpaceTest, IsTrueForWhiteSpace) {\n  EXPECT_TRUE(IsWhiteSpace(' '));\n  EXPECT_TRUE(IsWhiteSpace('\\n'));\n  EXPECT_TRUE(IsWhiteSpace('\\r'));\n  EXPECT_TRUE(IsWhiteSpace('\\t'));\n  EXPECT_TRUE(IsWhiteSpace('\\v'));\n  EXPECT_TRUE(IsWhiteSpace('\\f'));\n}\n\nTEST(IsWordCharTest, IsFalseForNonWordChar) {\n  EXPECT_FALSE(IsWordChar('\\0'));\n  EXPECT_FALSE(IsWordChar('+'));\n  EXPECT_FALSE(IsWordChar('.'));\n  EXPECT_FALSE(IsWordChar(' '));\n  EXPECT_FALSE(IsWordChar('\\n'));\n}\n\nTEST(IsWordCharTest, IsTrueForLetter) {\n  EXPECT_TRUE(IsWordChar('a'));\n  EXPECT_TRUE(IsWordChar('b'));\n  EXPECT_TRUE(IsWordChar('A'));\n  EXPECT_TRUE(IsWordChar('Z'));\n}\n\nTEST(IsWordCharTest, IsTrueForDigit) {\n  EXPECT_TRUE(IsWordChar('0'));\n  EXPECT_TRUE(IsWordChar('1'));\n  EXPECT_TRUE(IsWordChar('7'));\n  EXPECT_TRUE(IsWordChar('9'));\n}\n\nTEST(IsWordCharTest, IsTrueForUnderscore) {\n  EXPECT_TRUE(IsWordChar('_'));\n}\n\nTEST(IsValidEscapeTest, IsFalseForNonPrintable) {\n  EXPECT_FALSE(IsValidEscape('\\0'));\n  EXPECT_FALSE(IsValidEscape('\\007'));\n}\n\nTEST(IsValidEscapeTest, IsFalseForDigit) {\n  EXPECT_FALSE(IsValidEscape('0'));\n  EXPECT_FALSE(IsValidEscape('9'));\n}\n\nTEST(IsValidEscapeTest, IsFalseForWhiteSpace) {\n  EXPECT_FALSE(IsValidEscape(' '));\n  EXPECT_FALSE(IsValidEscape('\\n'));\n}\n\nTEST(IsValidEscapeTest, IsFalseForSomeLetter) {\n  EXPECT_FALSE(IsValidEscape('a'));\n  EXPECT_FALSE(IsValidEscape('Z'));\n}\n\nTEST(IsValidEscapeTest, IsTrueForPunct) {\n  EXPECT_TRUE(IsValidEscape('.'));\n  EXPECT_TRUE(IsValidEscape('-'));\n  EXPECT_TRUE(IsValidEscape('^'));\n  EXPECT_TRUE(IsValidEscape('$'));\n  EXPECT_TRUE(IsValidEscape('('));\n  EXPECT_TRUE(IsValidEscape(']'));\n  EXPECT_TRUE(IsValidEscape('{'));\n  EXPECT_TRUE(IsValidEscape('|'));\n}\n\nTEST(IsValidEscapeTest, IsTrueForSomeLetter) {\n  EXPECT_TRUE(IsValidEscape('d'));\n  EXPECT_TRUE(IsValidEscape('D'));\n  EXPECT_TRUE(IsValidEscape('s'));\n  EXPECT_TRUE(IsValidEscape('S'));\n  EXPECT_TRUE(IsValidEscape('w'));\n  EXPECT_TRUE(IsValidEscape('W'));\n}\n\nTEST(AtomMatchesCharTest, EscapedPunct) {\n  EXPECT_FALSE(AtomMatchesChar(true, '\\\\', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, '\\\\', ' '));\n  EXPECT_FALSE(AtomMatchesChar(true, '_', '.'));\n  EXPECT_FALSE(AtomMatchesChar(true, '.', 'a'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, '\\\\', '\\\\'));\n  EXPECT_TRUE(AtomMatchesChar(true, '_', '_'));\n  EXPECT_TRUE(AtomMatchesChar(true, '+', '+'));\n  EXPECT_TRUE(AtomMatchesChar(true, '.', '.'));\n}\n\nTEST(AtomMatchesCharTest, Escaped_d) {\n  EXPECT_FALSE(AtomMatchesChar(true, 'd', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'd', 'a'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'd', '.'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 'd', '0'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'd', '9'));\n}\n\nTEST(AtomMatchesCharTest, Escaped_D) {\n  EXPECT_FALSE(AtomMatchesChar(true, 'D', '0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'D', '9'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 'D', '\\0'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'D', 'a'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'D', '-'));\n}\n\nTEST(AtomMatchesCharTest, Escaped_s) {\n  EXPECT_FALSE(AtomMatchesChar(true, 's', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 's', 'a'));\n  EXPECT_FALSE(AtomMatchesChar(true, 's', '.'));\n  EXPECT_FALSE(AtomMatchesChar(true, 's', '9'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 's', ' '));\n  EXPECT_TRUE(AtomMatchesChar(true, 's', '\\n'));\n  EXPECT_TRUE(AtomMatchesChar(true, 's', '\\t'));\n}\n\nTEST(AtomMatchesCharTest, Escaped_S) {\n  EXPECT_FALSE(AtomMatchesChar(true, 'S', ' '));\n  EXPECT_FALSE(AtomMatchesChar(true, 'S', '\\r'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 'S', '\\0'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'S', 'a'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'S', '9'));\n}\n\nTEST(AtomMatchesCharTest, Escaped_w) {\n  EXPECT_FALSE(AtomMatchesChar(true, 'w', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'w', '+'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'w', ' '));\n  EXPECT_FALSE(AtomMatchesChar(true, 'w', '\\n'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 'w', '0'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'w', 'b'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'w', 'C'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'w', '_'));\n}\n\nTEST(AtomMatchesCharTest, Escaped_W) {\n  EXPECT_FALSE(AtomMatchesChar(true, 'W', 'A'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'W', 'b'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'W', '9'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'W', '_'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 'W', '\\0'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'W', '*'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'W', '\\n'));\n}\n\nTEST(AtomMatchesCharTest, EscapedWhiteSpace) {\n  EXPECT_FALSE(AtomMatchesChar(true, 'f', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'f', '\\n'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'n', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'n', '\\r'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'r', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'r', 'a'));\n  EXPECT_FALSE(AtomMatchesChar(true, 't', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 't', 't'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'v', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(true, 'v', '\\f'));\n\n  EXPECT_TRUE(AtomMatchesChar(true, 'f', '\\f'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'n', '\\n'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'r', '\\r'));\n  EXPECT_TRUE(AtomMatchesChar(true, 't', '\\t'));\n  EXPECT_TRUE(AtomMatchesChar(true, 'v', '\\v'));\n}\n\nTEST(AtomMatchesCharTest, UnescapedDot) {\n  EXPECT_FALSE(AtomMatchesChar(false, '.', '\\n'));\n\n  EXPECT_TRUE(AtomMatchesChar(false, '.', '\\0'));\n  EXPECT_TRUE(AtomMatchesChar(false, '.', '.'));\n  EXPECT_TRUE(AtomMatchesChar(false, '.', 'a'));\n  EXPECT_TRUE(AtomMatchesChar(false, '.', ' '));\n}\n\nTEST(AtomMatchesCharTest, UnescapedChar) {\n  EXPECT_FALSE(AtomMatchesChar(false, 'a', '\\0'));\n  EXPECT_FALSE(AtomMatchesChar(false, 'a', 'b'));\n  EXPECT_FALSE(AtomMatchesChar(false, '$', 'a'));\n\n  EXPECT_TRUE(AtomMatchesChar(false, '$', '$'));\n  EXPECT_TRUE(AtomMatchesChar(false, '5', '5'));\n  EXPECT_TRUE(AtomMatchesChar(false, 'Z', 'Z'));\n}\n\nTEST(ValidateRegexTest, GeneratesFailureAndReturnsFalseForInvalid) {\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(NULL)),\n                          \"NULL is not a valid simple regular expression\");\n  EXPECT_NONFATAL_FAILURE(\n      ASSERT_FALSE(ValidateRegex(\"a\\\\\")),\n      \"Syntax error at index 1 in simple regular expression \\\"a\\\\\\\": \");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"a\\\\\")),\n                          \"'\\\\' cannot appear at the end\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"\\\\n\\\\\")),\n                          \"'\\\\' cannot appear at the end\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"\\\\s\\\\hb\")),\n                          \"invalid escape sequence \\\"\\\\h\\\"\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"^^\")),\n                          \"'^' can only appear at the beginning\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\".*^b\")),\n                          \"'^' can only appear at the beginning\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"$$\")),\n                          \"'$' can only appear at the end\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"^$a\")),\n                          \"'$' can only appear at the end\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"a(b\")),\n                          \"'(' is unsupported\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"ab)\")),\n                          \"')' is unsupported\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"[ab\")),\n                          \"'[' is unsupported\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"a{2\")),\n                          \"'{' is unsupported\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"?\")),\n                          \"'?' can only follow a repeatable token\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"^*\")),\n                          \"'*' can only follow a repeatable token\");\n  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(\"5*+\")),\n                          \"'+' can only follow a repeatable token\");\n}\n\nTEST(ValidateRegexTest, ReturnsTrueForValid) {\n  EXPECT_TRUE(ValidateRegex(\"\"));\n  EXPECT_TRUE(ValidateRegex(\"a\"));\n  EXPECT_TRUE(ValidateRegex(\".*\"));\n  EXPECT_TRUE(ValidateRegex(\"^a_+\"));\n  EXPECT_TRUE(ValidateRegex(\"^a\\\\t\\\\&?\"));\n  EXPECT_TRUE(ValidateRegex(\"09*$\"));\n  EXPECT_TRUE(ValidateRegex(\"^Z$\"));\n  EXPECT_TRUE(ValidateRegex(\"a\\\\^Z\\\\$\\\\(\\\\)\\\\|\\\\[\\\\]\\\\{\\\\}\"));\n}\n\nTEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrOne) {\n  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', \"a\", \"ba\"));\n  // Repeating more than once.\n  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', \"b\", \"aab\"));\n\n  // Repeating zero times.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', \"b\", \"ba\"));\n  // Repeating once.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', \"b\", \"ab\"));\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '#', '?', \".\", \"##\"));\n}\n\nTEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrMany) {\n  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '*', \"a$\", \"baab\"));\n\n  // Repeating zero times.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', \"b\", \"bc\"));\n  // Repeating once.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', \"b\", \"abc\"));\n  // Repeating more than once.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '*', \"-\", \"ab_1-g\"));\n}\n\nTEST(MatchRepetitionAndRegexAtHeadTest, WorksForOneOrMany) {\n  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', \"a$\", \"baab\"));\n  // Repeating zero times.\n  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', \"b\", \"bc\"));\n\n  // Repeating once.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '+', \"b\", \"abc\"));\n  // Repeating more than once.\n  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '+', \"-\", \"ab_1-g\"));\n}\n\nTEST(MatchRegexAtHeadTest, ReturnsTrueForEmptyRegex) {\n  EXPECT_TRUE(MatchRegexAtHead(\"\", \"\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"\", \"ab\"));\n}\n\nTEST(MatchRegexAtHeadTest, WorksWhenDollarIsInRegex) {\n  EXPECT_FALSE(MatchRegexAtHead(\"$\", \"a\"));\n\n  EXPECT_TRUE(MatchRegexAtHead(\"$\", \"\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"a$\", \"a\"));\n}\n\nTEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithEscapeSequence) {\n  EXPECT_FALSE(MatchRegexAtHead(\"\\\\w\", \"+\"));\n  EXPECT_FALSE(MatchRegexAtHead(\"\\\\W\", \"ab\"));\n\n  EXPECT_TRUE(MatchRegexAtHead(\"\\\\sa\", \"\\nab\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"\\\\d\", \"1a\"));\n}\n\nTEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithRepetition) {\n  EXPECT_FALSE(MatchRegexAtHead(\".+a\", \"abc\"));\n  EXPECT_FALSE(MatchRegexAtHead(\"a?b\", \"aab\"));\n\n  EXPECT_TRUE(MatchRegexAtHead(\".*a\", \"bc12-ab\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"a?b\", \"b\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"a?b\", \"ab\"));\n}\n\nTEST(MatchRegexAtHeadTest,\n     WorksWhenRegexStartsWithRepetionOfEscapeSequence) {\n  EXPECT_FALSE(MatchRegexAtHead(\"\\\\.+a\", \"abc\"));\n  EXPECT_FALSE(MatchRegexAtHead(\"\\\\s?b\", \"  b\"));\n\n  EXPECT_TRUE(MatchRegexAtHead(\"\\\\(*a\", \"((((ab\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"\\\\^?b\", \"^b\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"\\\\\\\\?b\", \"b\"));\n  EXPECT_TRUE(MatchRegexAtHead(\"\\\\\\\\?b\", \"\\\\b\"));\n}\n\nTEST(MatchRegexAtHeadTest, MatchesSequentially) {\n  EXPECT_FALSE(MatchRegexAtHead(\"ab.*c\", \"acabc\"));\n\n  EXPECT_TRUE(MatchRegexAtHead(\"ab.*c\", \"ab-fsc\"));\n}\n\nTEST(MatchRegexAnywhereTest, ReturnsFalseWhenStringIsNull) {\n  EXPECT_FALSE(MatchRegexAnywhere(\"\", NULL));\n}\n\nTEST(MatchRegexAnywhereTest, WorksWhenRegexStartsWithCaret) {\n  EXPECT_FALSE(MatchRegexAnywhere(\"^a\", \"ba\"));\n  EXPECT_FALSE(MatchRegexAnywhere(\"^$\", \"a\"));\n\n  EXPECT_TRUE(MatchRegexAnywhere(\"^a\", \"ab\"));\n  EXPECT_TRUE(MatchRegexAnywhere(\"^\", \"ab\"));\n  EXPECT_TRUE(MatchRegexAnywhere(\"^$\", \"\"));\n}\n\nTEST(MatchRegexAnywhereTest, ReturnsFalseWhenNoMatch) {\n  EXPECT_FALSE(MatchRegexAnywhere(\"a\", \"bcde123\"));\n  EXPECT_FALSE(MatchRegexAnywhere(\"a.+a\", \"--aa88888888\"));\n}\n\nTEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingPrefix) {\n  EXPECT_TRUE(MatchRegexAnywhere(\"\\\\w+\", \"ab1_ - 5\"));\n  EXPECT_TRUE(MatchRegexAnywhere(\".*=\", \"=\"));\n  EXPECT_TRUE(MatchRegexAnywhere(\"x.*ab?.*bc\", \"xaaabc\"));\n}\n\nTEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingNonPrefix) {\n  EXPECT_TRUE(MatchRegexAnywhere(\"\\\\w+\", \"$$$ ab1_ - 5\"));\n  EXPECT_TRUE(MatchRegexAnywhere(\"\\\\.+=\", \"=  ...=\"));\n}\n\n// Tests RE's implicit constructors.\nTEST(RETest, ImplicitConstructorWorks) {\n  const RE empty(\"\");\n  EXPECT_STREQ(\"\", empty.pattern());\n\n  const RE simple(\"hello\");\n  EXPECT_STREQ(\"hello\", simple.pattern());\n}\n\n// Tests that RE's constructors reject invalid regular expressions.\nTEST(RETest, RejectsInvalidRegex) {\n  EXPECT_NONFATAL_FAILURE({\n    const RE normal(NULL);\n  }, \"NULL is not a valid simple regular expression\");\n\n  EXPECT_NONFATAL_FAILURE({\n    const RE normal(\".*(\\\\w+\");\n  }, \"'(' is unsupported\");\n\n  EXPECT_NONFATAL_FAILURE({\n    const RE invalid(\"^?\");\n  }, \"'?' can only follow a repeatable token\");\n}\n\n// Tests RE::FullMatch().\nTEST(RETest, FullMatchWorks) {\n  const RE empty(\"\");\n  EXPECT_TRUE(RE::FullMatch(\"\", empty));\n  EXPECT_FALSE(RE::FullMatch(\"a\", empty));\n\n  const RE re1(\"a\");\n  EXPECT_TRUE(RE::FullMatch(\"a\", re1));\n\n  const RE re(\"a.*z\");\n  EXPECT_TRUE(RE::FullMatch(\"az\", re));\n  EXPECT_TRUE(RE::FullMatch(\"axyz\", re));\n  EXPECT_FALSE(RE::FullMatch(\"baz\", re));\n  EXPECT_FALSE(RE::FullMatch(\"azy\", re));\n}\n\n// Tests RE::PartialMatch().\nTEST(RETest, PartialMatchWorks) {\n  const RE empty(\"\");\n  EXPECT_TRUE(RE::PartialMatch(\"\", empty));\n  EXPECT_TRUE(RE::PartialMatch(\"a\", empty));\n\n  const RE re(\"a.*z\");\n  EXPECT_TRUE(RE::PartialMatch(\"az\", re));\n  EXPECT_TRUE(RE::PartialMatch(\"axyz\", re));\n  EXPECT_TRUE(RE::PartialMatch(\"baz\", re));\n  EXPECT_TRUE(RE::PartialMatch(\"azy\", re));\n  EXPECT_FALSE(RE::PartialMatch(\"zza\", re));\n}\n\n#endif  // GTEST_USES_POSIX_RE\n\n#if !GTEST_OS_WINDOWS_MOBILE\n\nTEST(CaptureTest, CapturesStdout) {\n  CaptureStdout();\n  fprintf(stdout, \"abc\");\n  EXPECT_STREQ(\"abc\", GetCapturedStdout().c_str());\n\n  CaptureStdout();\n  fprintf(stdout, \"def%cghi\", '\\0');\n  EXPECT_EQ(::std::string(\"def\\0ghi\", 7), ::std::string(GetCapturedStdout()));\n}\n\nTEST(CaptureTest, CapturesStderr) {\n  CaptureStderr();\n  fprintf(stderr, \"jkl\");\n  EXPECT_STREQ(\"jkl\", GetCapturedStderr().c_str());\n\n  CaptureStderr();\n  fprintf(stderr, \"jkl%cmno\", '\\0');\n  EXPECT_EQ(::std::string(\"jkl\\0mno\", 7), ::std::string(GetCapturedStderr()));\n}\n\n// Tests that stdout and stderr capture don't interfere with each other.\nTEST(CaptureTest, CapturesStdoutAndStderr) {\n  CaptureStdout();\n  CaptureStderr();\n  fprintf(stdout, \"pqr\");\n  fprintf(stderr, \"stu\");\n  EXPECT_STREQ(\"pqr\", GetCapturedStdout().c_str());\n  EXPECT_STREQ(\"stu\", GetCapturedStderr().c_str());\n}\n\nTEST(CaptureDeathTest, CannotReenterStdoutCapture) {\n  CaptureStdout();\n  EXPECT_DEATH_IF_SUPPORTED(CaptureStdout();,\n                            \"Only one stdout capturer can exist at a time\");\n  GetCapturedStdout();\n\n  // We cannot test stderr capturing using death tests as they use it\n  // themselves.\n}\n\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\nTEST(ThreadLocalTest, DefaultConstructorInitializesToDefaultValues) {\n  ThreadLocal<int> t1;\n  EXPECT_EQ(0, t1.get());\n\n  ThreadLocal<void*> t2;\n  EXPECT_TRUE(t2.get() == NULL);\n}\n\nTEST(ThreadLocalTest, SingleParamConstructorInitializesToParam) {\n  ThreadLocal<int> t1(123);\n  EXPECT_EQ(123, t1.get());\n\n  int i = 0;\n  ThreadLocal<int*> t2(&i);\n  EXPECT_EQ(&i, t2.get());\n}\n\nclass NoDefaultContructor {\n public:\n  explicit NoDefaultContructor(const char*) {}\n  NoDefaultContructor(const NoDefaultContructor&) {}\n};\n\nTEST(ThreadLocalTest, ValueDefaultContructorIsNotRequiredForParamVersion) {\n  ThreadLocal<NoDefaultContructor> bar(NoDefaultContructor(\"foo\"));\n  bar.pointer();\n}\n\nTEST(ThreadLocalTest, GetAndPointerReturnSameValue) {\n  ThreadLocal<String> thread_local;\n\n  EXPECT_EQ(thread_local.pointer(), &(thread_local.get()));\n\n  // Verifies the condition still holds after calling set.\n  thread_local.set(\"foo\");\n  EXPECT_EQ(thread_local.pointer(), &(thread_local.get()));\n}\n\nTEST(ThreadLocalTest, PointerAndConstPointerReturnSameValue) {\n  ThreadLocal<String> thread_local;\n  const ThreadLocal<String>& const_thread_local = thread_local;\n\n  EXPECT_EQ(thread_local.pointer(), const_thread_local.pointer());\n\n  thread_local.set(\"foo\");\n  EXPECT_EQ(thread_local.pointer(), const_thread_local.pointer());\n}\n\n#if GTEST_IS_THREADSAFE\n\nvoid AddTwo(int* param) { *param += 2; }\n\nTEST(ThreadWithParamTest, ConstructorExecutesThreadFunc) {\n  int i = 40;\n  ThreadWithParam<int*> thread(&AddTwo, &i, NULL);\n  thread.Join();\n  EXPECT_EQ(42, i);\n}\n\nTEST(MutexDeathTest, AssertHeldShouldAssertWhenNotLocked) {\n  // AssertHeld() is flaky only in the presence of multiple threads accessing\n  // the lock. In this case, the test is robust.\n  EXPECT_DEATH_IF_SUPPORTED({\n    Mutex m;\n    { MutexLock lock(&m); }\n    m.AssertHeld();\n  },\n  \"thread .*hold\");\n}\n\nTEST(MutexTest, AssertHeldShouldNotAssertWhenLocked) {\n  Mutex m;\n  MutexLock lock(&m);\n  m.AssertHeld();\n}\n\nclass AtomicCounterWithMutex {\n public:\n  explicit AtomicCounterWithMutex(Mutex* mutex) :\n    value_(0), mutex_(mutex), random_(42) {}\n\n  void Increment() {\n    MutexLock lock(mutex_);\n    int temp = value_;\n    {\n      // Locking a mutex puts up a memory barrier, preventing reads and\n      // writes to value_ rearranged when observed from other threads.\n      //\n      // We cannot use Mutex and MutexLock here or rely on their memory\n      // barrier functionality as we are testing them here.\n      pthread_mutex_t memory_barrier_mutex;\n      GTEST_CHECK_POSIX_SUCCESS_(\n          pthread_mutex_init(&memory_barrier_mutex, NULL));\n      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&memory_barrier_mutex));\n\n      SleepMilliseconds(random_.Generate(30));\n\n      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&memory_barrier_mutex));\n    }\n    value_ = temp + 1;\n  }\n  int value() const { return value_; }\n\n private:\n  volatile int value_;\n  Mutex* const mutex_;  // Protects value_.\n  Random       random_;\n};\n\nvoid CountingThreadFunc(pair<AtomicCounterWithMutex*, int> param) {\n  for (int i = 0; i < param.second; ++i)\n      param.first->Increment();\n}\n\n// Tests that the mutex only lets one thread at a time to lock it.\nTEST(MutexTest, OnlyOneThreadCanLockAtATime) {\n  Mutex mutex;\n  AtomicCounterWithMutex locked_counter(&mutex);\n\n  typedef ThreadWithParam<pair<AtomicCounterWithMutex*, int> > ThreadType;\n  const int kCycleCount = 20;\n  const int kThreadCount = 7;\n  scoped_ptr<ThreadType> counting_threads[kThreadCount];\n  Notification threads_can_start;\n  // Creates and runs kThreadCount threads that increment locked_counter\n  // kCycleCount times each.\n  for (int i = 0; i < kThreadCount; ++i) {\n    counting_threads[i].reset(new ThreadType(&CountingThreadFunc,\n                                             make_pair(&locked_counter,\n                                                       kCycleCount),\n                                             &threads_can_start));\n  }\n  threads_can_start.Notify();\n  for (int i = 0; i < kThreadCount; ++i)\n    counting_threads[i]->Join();\n\n  // If the mutex lets more than one thread to increment the counter at a\n  // time, they are likely to encounter a race condition and have some\n  // increments overwritten, resulting in the lower then expected counter\n  // value.\n  EXPECT_EQ(kCycleCount * kThreadCount, locked_counter.value());\n}\n\ntemplate <typename T>\nvoid RunFromThread(void (func)(T), T param) {\n  ThreadWithParam<T> thread(func, param, NULL);\n  thread.Join();\n}\n\nvoid RetrieveThreadLocalValue(pair<ThreadLocal<String>*, String*> param) {\n  *param.second = param.first->get();\n}\n\nTEST(ThreadLocalTest, ParameterizedConstructorSetsDefault) {\n  ThreadLocal<String> thread_local(\"foo\");\n  EXPECT_STREQ(\"foo\", thread_local.get().c_str());\n\n  thread_local.set(\"bar\");\n  EXPECT_STREQ(\"bar\", thread_local.get().c_str());\n\n  String result;\n  RunFromThread(&RetrieveThreadLocalValue, make_pair(&thread_local, &result));\n  EXPECT_STREQ(\"foo\", result.c_str());\n}\n\n// DestructorTracker keeps track of whether its instances have been\n// destroyed.\nstatic std::vector<bool> g_destroyed;\n\nclass DestructorTracker {\n public:\n  DestructorTracker() : index_(GetNewIndex()) {}\n  DestructorTracker(const DestructorTracker& /* rhs */)\n      : index_(GetNewIndex()) {}\n  ~DestructorTracker() {\n    // We never access g_destroyed concurrently, so we don't need to\n    // protect the write operation under a mutex.\n    g_destroyed[index_] = true;\n  }\n\n private:\n  static int GetNewIndex() {\n    g_destroyed.push_back(false);\n    return g_destroyed.size() - 1;\n  }\n  const int index_;\n};\n\ntypedef ThreadLocal<DestructorTracker>* ThreadParam;\n\nvoid CallThreadLocalGet(ThreadParam thread_local) {\n  thread_local->get();\n}\n\n// Tests that when a ThreadLocal object dies in a thread, it destroys\n// the managed object for that thread.\nTEST(ThreadLocalTest, DestroysManagedObjectForOwnThreadWhenDying) {\n  g_destroyed.clear();\n\n  {\n    // The next line default constructs a DestructorTracker object as\n    // the default value of objects managed by thread_local.\n    ThreadLocal<DestructorTracker> thread_local;\n    ASSERT_EQ(1U, g_destroyed.size());\n    ASSERT_FALSE(g_destroyed[0]);\n\n    // This creates another DestructorTracker object for the main thread.\n    thread_local.get();\n    ASSERT_EQ(2U, g_destroyed.size());\n    ASSERT_FALSE(g_destroyed[0]);\n    ASSERT_FALSE(g_destroyed[1]);\n  }\n\n  // Now thread_local has died.  It should have destroyed both the\n  // default value shared by all threads and the value for the main\n  // thread.\n  ASSERT_EQ(2U, g_destroyed.size());\n  EXPECT_TRUE(g_destroyed[0]);\n  EXPECT_TRUE(g_destroyed[1]);\n\n  g_destroyed.clear();\n}\n\n// Tests that when a thread exits, the thread-local object for that\n// thread is destroyed.\nTEST(ThreadLocalTest, DestroysManagedObjectAtThreadExit) {\n  g_destroyed.clear();\n\n  {\n    // The next line default constructs a DestructorTracker object as\n    // the default value of objects managed by thread_local.\n    ThreadLocal<DestructorTracker> thread_local;\n    ASSERT_EQ(1U, g_destroyed.size());\n    ASSERT_FALSE(g_destroyed[0]);\n\n    // This creates another DestructorTracker object in the new thread.\n    ThreadWithParam<ThreadParam> thread(\n        &CallThreadLocalGet, &thread_local, NULL);\n    thread.Join();\n\n    // Now the new thread has exited.  The per-thread object for it\n    // should have been destroyed.\n    ASSERT_EQ(2U, g_destroyed.size());\n    ASSERT_FALSE(g_destroyed[0]);\n    ASSERT_TRUE(g_destroyed[1]);\n  }\n\n  // Now thread_local has died.  The default value should have been\n  // destroyed too.\n  ASSERT_EQ(2U, g_destroyed.size());\n  EXPECT_TRUE(g_destroyed[0]);\n  EXPECT_TRUE(g_destroyed[1]);\n\n  g_destroyed.clear();\n}\n\nTEST(ThreadLocalTest, ThreadLocalMutationsAffectOnlyCurrentThread) {\n  ThreadLocal<String> thread_local;\n  thread_local.set(\"Foo\");\n  EXPECT_STREQ(\"Foo\", thread_local.get().c_str());\n\n  String result;\n  RunFromThread(&RetrieveThreadLocalValue, make_pair(&thread_local, &result));\n  EXPECT_TRUE(result.c_str() == NULL);\n}\n\n#endif  // GTEST_IS_THREADSAFE\n\n}  // namespace internal\n}  // namespace testing\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-test-part_test.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: mheule@google.com (Markus Heule)\n//\n\n#include <gtest/gtest-test-part.h>\n\n#include <gtest/gtest.h>\n\nusing testing::Message;\nusing testing::Test;\nusing testing::TestPartResult;\nusing testing::TestPartResultArray;\n\nnamespace {\n\n// Tests the TestPartResult class.\n\n// The test fixture for testing TestPartResult.\nclass TestPartResultTest : public Test {\n protected:\n  TestPartResultTest()\n      : r1_(TestPartResult::kSuccess, \"foo/bar.cc\", 10, \"Success!\"),\n        r2_(TestPartResult::kNonFatalFailure, \"foo/bar.cc\", -1, \"Failure!\"),\n        r3_(TestPartResult::kFatalFailure, NULL, -1, \"Failure!\") {}\n\n  TestPartResult r1_, r2_, r3_;\n};\n\n\nTEST_F(TestPartResultTest, ConstructorWorks) {\n  Message message;\n  message << \"something is terribly wrong\";\n  message << static_cast<const char*>(testing::internal::kStackTraceMarker);\n  message << \"some unimportant stack trace\";\n\n  const TestPartResult result(TestPartResult::kNonFatalFailure,\n                              \"some_file.cc\",\n                              42,\n                              message.GetString().c_str());\n\n  EXPECT_EQ(TestPartResult::kNonFatalFailure, result.type());\n  EXPECT_STREQ(\"some_file.cc\", result.file_name());\n  EXPECT_EQ(42, result.line_number());\n  EXPECT_STREQ(message.GetString().c_str(), result.message());\n  EXPECT_STREQ(\"something is terribly wrong\", result.summary());\n}\n\nTEST_F(TestPartResultTest, ResultAccessorsWork) {\n  const TestPartResult success(TestPartResult::kSuccess,\n                               \"file.cc\",\n                               42,\n                               \"message\");\n  EXPECT_TRUE(success.passed());\n  EXPECT_FALSE(success.failed());\n  EXPECT_FALSE(success.nonfatally_failed());\n  EXPECT_FALSE(success.fatally_failed());\n\n  const TestPartResult nonfatal_failure(TestPartResult::kNonFatalFailure,\n                                        \"file.cc\",\n                                        42,\n                                        \"message\");\n  EXPECT_FALSE(nonfatal_failure.passed());\n  EXPECT_TRUE(nonfatal_failure.failed());\n  EXPECT_TRUE(nonfatal_failure.nonfatally_failed());\n  EXPECT_FALSE(nonfatal_failure.fatally_failed());\n\n  const TestPartResult fatal_failure(TestPartResult::kFatalFailure,\n                                     \"file.cc\",\n                                     42,\n                                     \"message\");\n  EXPECT_FALSE(fatal_failure.passed());\n  EXPECT_TRUE(fatal_failure.failed());\n  EXPECT_FALSE(fatal_failure.nonfatally_failed());\n  EXPECT_TRUE(fatal_failure.fatally_failed());\n}\n\n// Tests TestPartResult::type().\nTEST_F(TestPartResultTest, type) {\n  EXPECT_EQ(TestPartResult::kSuccess, r1_.type());\n  EXPECT_EQ(TestPartResult::kNonFatalFailure, r2_.type());\n  EXPECT_EQ(TestPartResult::kFatalFailure, r3_.type());\n}\n\n// Tests TestPartResult::file_name().\nTEST_F(TestPartResultTest, file_name) {\n  EXPECT_STREQ(\"foo/bar.cc\", r1_.file_name());\n  EXPECT_STREQ(NULL, r3_.file_name());\n}\n\n// Tests TestPartResult::line_number().\nTEST_F(TestPartResultTest, line_number) {\n  EXPECT_EQ(10, r1_.line_number());\n  EXPECT_EQ(-1, r2_.line_number());\n}\n\n// Tests TestPartResult::message().\nTEST_F(TestPartResultTest, message) {\n  EXPECT_STREQ(\"Success!\", r1_.message());\n}\n\n// Tests TestPartResult::passed().\nTEST_F(TestPartResultTest, Passed) {\n  EXPECT_TRUE(r1_.passed());\n  EXPECT_FALSE(r2_.passed());\n  EXPECT_FALSE(r3_.passed());\n}\n\n// Tests TestPartResult::failed().\nTEST_F(TestPartResultTest, Failed) {\n  EXPECT_FALSE(r1_.failed());\n  EXPECT_TRUE(r2_.failed());\n  EXPECT_TRUE(r3_.failed());\n}\n\n// Tests TestPartResult::fatally_failed().\nTEST_F(TestPartResultTest, FatallyFailed) {\n  EXPECT_FALSE(r1_.fatally_failed());\n  EXPECT_FALSE(r2_.fatally_failed());\n  EXPECT_TRUE(r3_.fatally_failed());\n}\n\n// Tests TestPartResult::nonfatally_failed().\nTEST_F(TestPartResultTest, NonfatallyFailed) {\n  EXPECT_FALSE(r1_.nonfatally_failed());\n  EXPECT_TRUE(r2_.nonfatally_failed());\n  EXPECT_FALSE(r3_.nonfatally_failed());\n}\n\n// Tests the TestPartResultArray class.\n\nclass TestPartResultArrayTest : public Test {\n protected:\n  TestPartResultArrayTest()\n      : r1_(TestPartResult::kNonFatalFailure, \"foo/bar.cc\", -1, \"Failure 1\"),\n        r2_(TestPartResult::kFatalFailure, \"foo/bar.cc\", -1, \"Failure 2\") {}\n\n  const TestPartResult r1_, r2_;\n};\n\n// Tests that TestPartResultArray initially has size 0.\nTEST_F(TestPartResultArrayTest, InitialSizeIsZero) {\n  TestPartResultArray results;\n  EXPECT_EQ(0, results.size());\n}\n\n// Tests that TestPartResultArray contains the given TestPartResult\n// after one Append() operation.\nTEST_F(TestPartResultArrayTest, ContainsGivenResultAfterAppend) {\n  TestPartResultArray results;\n  results.Append(r1_);\n  EXPECT_EQ(1, results.size());\n  EXPECT_STREQ(\"Failure 1\", results.GetTestPartResult(0).message());\n}\n\n// Tests that TestPartResultArray contains the given TestPartResults\n// after two Append() operations.\nTEST_F(TestPartResultArrayTest, ContainsGivenResultsAfterTwoAppends) {\n  TestPartResultArray results;\n  results.Append(r1_);\n  results.Append(r2_);\n  EXPECT_EQ(2, results.size());\n  EXPECT_STREQ(\"Failure 1\", results.GetTestPartResult(0).message());\n  EXPECT_STREQ(\"Failure 2\", results.GetTestPartResult(1).message());\n}\n\ntypedef TestPartResultArrayTest TestPartResultArrayDeathTest;\n\n// Tests that the program dies when GetTestPartResult() is called with\n// an invalid index.\nTEST_F(TestPartResultArrayDeathTest, DiesWhenIndexIsOutOfBound) {\n  TestPartResultArray results;\n  results.Append(r1_);\n\n  EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(-1), \"\");\n  EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(1), \"\");\n}\n\n// TODO(mheule@google.com): Add a test for the class HasNewFatalFailureHelper.\n\n}  // namespace\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-tuple_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#include <gtest/internal/gtest-tuple.h>\n#include <utility>\n#include <gtest/gtest.h>\n\nnamespace {\n\nusing ::std::tr1::get;\nusing ::std::tr1::make_tuple;\nusing ::std::tr1::tuple;\nusing ::std::tr1::tuple_element;\nusing ::std::tr1::tuple_size;\nusing ::testing::StaticAssertTypeEq;\n\n// Tests that tuple_element<K, tuple<T0, T1, ..., TN> >::type returns TK.\nTEST(tuple_element_Test, ReturnsElementType) {\n  StaticAssertTypeEq<int, tuple_element<0, tuple<int, char> >::type>();\n  StaticAssertTypeEq<int&, tuple_element<1, tuple<double, int&> >::type>();\n  StaticAssertTypeEq<bool, tuple_element<2, tuple<double, int, bool> >::type>();\n}\n\n// Tests that tuple_size<T>::value gives the number of fields in tuple\n// type T.\nTEST(tuple_size_Test, ReturnsNumberOfFields) {\n  EXPECT_EQ(0, +tuple_size<tuple<> >::value);\n  EXPECT_EQ(1, +tuple_size<tuple<void*> >::value);\n  EXPECT_EQ(1, +tuple_size<tuple<char> >::value);\n  EXPECT_EQ(1, +(tuple_size<tuple<tuple<int, double> > >::value));\n  EXPECT_EQ(2, +(tuple_size<tuple<int&, const char> >::value));\n  EXPECT_EQ(3, +(tuple_size<tuple<char*, void, const bool&> >::value));\n}\n\n// Tests comparing a tuple with itself.\nTEST(ComparisonTest, ComparesWithSelf) {\n  const tuple<int, char, bool> a(5, 'a', false);\n\n  EXPECT_TRUE(a == a);\n  EXPECT_FALSE(a != a);\n}\n\n// Tests comparing two tuples with the same value.\nTEST(ComparisonTest, ComparesEqualTuples) {\n  const tuple<int, bool> a(5, true), b(5, true);\n\n  EXPECT_TRUE(a == b);\n  EXPECT_FALSE(a != b);\n}\n\n// Tests comparing two different tuples that have no reference fields.\nTEST(ComparisonTest, ComparesUnequalTuplesWithoutReferenceFields) {\n  typedef tuple<const int, char> FooTuple;\n\n  const FooTuple a(0, 'x');\n  const FooTuple b(1, 'a');\n\n  EXPECT_TRUE(a != b);\n  EXPECT_FALSE(a == b);\n\n  const FooTuple c(1, 'b');\n\n  EXPECT_TRUE(b != c);\n  EXPECT_FALSE(b == c);\n}\n\n// Tests comparing two different tuples that have reference fields.\nTEST(ComparisonTest, ComparesUnequalTuplesWithReferenceFields) {\n  typedef tuple<int&, const char&> FooTuple;\n\n  int i = 5;\n  const char ch = 'a';\n  const FooTuple a(i, ch);\n\n  int j = 6;\n  const FooTuple b(j, ch);\n\n  EXPECT_TRUE(a != b);\n  EXPECT_FALSE(a == b);\n\n  j = 5;\n  const char ch2 = 'b';\n  const FooTuple c(j, ch2);\n\n  EXPECT_TRUE(b != c);\n  EXPECT_FALSE(b == c);\n}\n\n// Tests that a tuple field with a reference type is an alias of the\n// variable it's supposed to reference.\nTEST(ReferenceFieldTest, IsAliasOfReferencedVariable) {\n  int n = 0;\n  tuple<bool, int&> t(true, n);\n\n  n = 1;\n  EXPECT_EQ(n, get<1>(t))\n      << \"Changing a underlying variable should update the reference field.\";\n\n  // Makes sure that the implementation doesn't do anything funny with\n  // the & operator for the return type of get<>().\n  EXPECT_EQ(&n, &(get<1>(t)))\n      << \"The address of a reference field should equal the address of \"\n      << \"the underlying variable.\";\n\n  get<1>(t) = 2;\n  EXPECT_EQ(2, n)\n      << \"Changing a reference field should update the underlying variable.\";\n}\n\n// Tests that tuple's default constructor default initializes each field.\n// This test needs to compile without generating warnings.\nTEST(TupleConstructorTest, DefaultConstructorDefaultInitializesEachField) {\n  // The TR1 report requires that tuple's default constructor default\n  // initializes each field, even if it's a primitive type.  If the\n  // implementation forgets to do this, this test will catch it by\n  // generating warnings about using uninitialized variables (assuming\n  // a decent compiler).\n\n  tuple<> empty;\n\n  tuple<int> a1, b1;\n  b1 = a1;\n  EXPECT_EQ(0, get<0>(b1));\n\n  tuple<int, double> a2, b2;\n  b2 = a2;\n  EXPECT_EQ(0, get<0>(b2));\n  EXPECT_EQ(0.0, get<1>(b2));\n\n  tuple<double, char, bool*> a3, b3;\n  b3 = a3;\n  EXPECT_EQ(0.0, get<0>(b3));\n  EXPECT_EQ('\\0', get<1>(b3));\n  EXPECT_TRUE(get<2>(b3) == NULL);\n\n  tuple<int, int, int, int, int, int, int, int, int, int> a10, b10;\n  b10 = a10;\n  EXPECT_EQ(0, get<0>(b10));\n  EXPECT_EQ(0, get<1>(b10));\n  EXPECT_EQ(0, get<2>(b10));\n  EXPECT_EQ(0, get<3>(b10));\n  EXPECT_EQ(0, get<4>(b10));\n  EXPECT_EQ(0, get<5>(b10));\n  EXPECT_EQ(0, get<6>(b10));\n  EXPECT_EQ(0, get<7>(b10));\n  EXPECT_EQ(0, get<8>(b10));\n  EXPECT_EQ(0, get<9>(b10));\n}\n\n// Tests constructing a tuple from its fields.\nTEST(TupleConstructorTest, ConstructsFromFields) {\n  int n = 1;\n  // Reference field.\n  tuple<int&> a(n);\n  EXPECT_EQ(&n, &(get<0>(a)));\n\n  // Non-reference fields.\n  tuple<int, char> b(5, 'a');\n  EXPECT_EQ(5, get<0>(b));\n  EXPECT_EQ('a', get<1>(b));\n\n  // Const reference field.\n  const int m = 2;\n  tuple<bool, const int&> c(true, m);\n  EXPECT_TRUE(get<0>(c));\n  EXPECT_EQ(&m, &(get<1>(c)));\n}\n\n// Tests tuple's copy constructor.\nTEST(TupleConstructorTest, CopyConstructor) {\n  tuple<double, bool> a(0.0, true);\n  tuple<double, bool> b(a);\n\n  EXPECT_DOUBLE_EQ(0.0, get<0>(b));\n  EXPECT_TRUE(get<1>(b));\n}\n\n// Tests constructing a tuple from another tuple that has a compatible\n// but different type.\nTEST(TupleConstructorTest, ConstructsFromDifferentTupleType) {\n  tuple<int, int, char> a(0, 1, 'a');\n  tuple<double, long, int> b(a);\n\n  EXPECT_DOUBLE_EQ(0.0, get<0>(b));\n  EXPECT_EQ(1, get<1>(b));\n  EXPECT_EQ('a', get<2>(b));\n}\n\n// Tests constructing a 2-tuple from an std::pair.\nTEST(TupleConstructorTest, ConstructsFromPair) {\n  ::std::pair<int, char> a(1, 'a');\n  tuple<int, char> b(a);\n  tuple<int, const char&> c(a);\n}\n\n// Tests assigning a tuple to another tuple with the same type.\nTEST(TupleAssignmentTest, AssignsToSameTupleType) {\n  const tuple<int, long> a(5, 7L);\n  tuple<int, long> b;\n  b = a;\n  EXPECT_EQ(5, get<0>(b));\n  EXPECT_EQ(7L, get<1>(b));\n}\n\n// Tests assigning a tuple to another tuple with a different but\n// compatible type.\nTEST(TupleAssignmentTest, AssignsToDifferentTupleType) {\n  const tuple<int, long, bool> a(1, 7L, true);\n  tuple<long, int, bool> b;\n  b = a;\n  EXPECT_EQ(1L, get<0>(b));\n  EXPECT_EQ(7, get<1>(b));\n  EXPECT_TRUE(get<2>(b));\n}\n\n// Tests assigning an std::pair to a 2-tuple.\nTEST(TupleAssignmentTest, AssignsFromPair) {\n  const ::std::pair<int, bool> a(5, true);\n  tuple<int, bool> b;\n  b = a;\n  EXPECT_EQ(5, get<0>(b));\n  EXPECT_TRUE(get<1>(b));\n\n  tuple<long, bool> c;\n  c = a;\n  EXPECT_EQ(5L, get<0>(c));\n  EXPECT_TRUE(get<1>(c));\n}\n\n// A fixture for testing big tuples.\nclass BigTupleTest : public testing::Test {\n protected:\n  typedef tuple<int, int, int, int, int, int, int, int, int, int> BigTuple;\n\n  BigTupleTest() :\n      a_(1, 0, 0, 0, 0, 0, 0, 0, 0, 2),\n      b_(1, 0, 0, 0, 0, 0, 0, 0, 0, 3) {}\n\n  BigTuple a_, b_;\n};\n\n// Tests constructing big tuples.\nTEST_F(BigTupleTest, Construction) {\n  BigTuple a;\n  BigTuple b(b_);\n}\n\n// Tests that get<N>(t) returns the N-th (0-based) field of tuple t.\nTEST_F(BigTupleTest, get) {\n  EXPECT_EQ(1, get<0>(a_));\n  EXPECT_EQ(2, get<9>(a_));\n\n  // Tests that get() works on a const tuple too.\n  const BigTuple a(a_);\n  EXPECT_EQ(1, get<0>(a));\n  EXPECT_EQ(2, get<9>(a));\n}\n\n// Tests comparing big tuples.\nTEST_F(BigTupleTest, Comparisons) {\n  EXPECT_TRUE(a_ == a_);\n  EXPECT_FALSE(a_ != a_);\n\n  EXPECT_TRUE(a_ != b_);\n  EXPECT_FALSE(a_ == b_);\n}\n\nTEST(MakeTupleTest, WorksForScalarTypes) {\n  tuple<bool, int> a;\n  a = make_tuple(true, 5);\n  EXPECT_TRUE(get<0>(a));\n  EXPECT_EQ(5, get<1>(a));\n\n  tuple<char, int, long> b;\n  b = make_tuple('a', 'b', 5);\n  EXPECT_EQ('a', get<0>(b));\n  EXPECT_EQ('b', get<1>(b));\n  EXPECT_EQ(5, get<2>(b));\n}\n\nTEST(MakeTupleTest, WorksForPointers) {\n  int a[] = { 1, 2, 3, 4 };\n  const char* const str = \"hi\";\n  int* const p = a;\n\n  tuple<const char*, int*> t;\n  t = make_tuple(str, p);\n  EXPECT_EQ(str, get<0>(t));\n  EXPECT_EQ(p, get<1>(t));\n}\n\n}  // namespace\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test2_test.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#include <vector>\n\n#include \"test/gtest-typed-test_test.h\"\n#include <gtest/gtest.h>\n\n#if GTEST_HAS_TYPED_TEST_P\n\n// Tests that the same type-parameterized test case can be\n// instantiated in different translation units linked together.\n// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)\nINSTANTIATE_TYPED_TEST_CASE_P(Vector, ContainerTest,\n                              testing::Types<std::vector<int> >);\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.cc",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#include <set>\n#include <vector>\n\n#include \"test/gtest-typed-test_test.h\"\n#include <gtest/gtest.h>\n\nusing testing::Test;\n\n// Used for testing that SetUpTestCase()/TearDownTestCase(), fixture\n// ctor/dtor, and SetUp()/TearDown() work correctly in typed tests and\n// type-parameterized test.\ntemplate <typename T>\nclass CommonTest : public Test {\n  // For some technical reason, SetUpTestCase() and TearDownTestCase()\n  // must be public.\n public:\n  static void SetUpTestCase() {\n    shared_ = new T(5);\n  }\n\n  static void TearDownTestCase() {\n    delete shared_;\n    shared_ = NULL;\n  }\n\n  // This 'protected:' is optional.  There's no harm in making all\n  // members of this fixture class template public.\n protected:\n  // We used to use std::list here, but switched to std::vector since\n  // MSVC's <list> doesn't compile cleanly with /W4.\n  typedef std::vector<T> Vector;\n  typedef std::set<int> IntSet;\n\n  CommonTest() : value_(1) {}\n\n  virtual ~CommonTest() { EXPECT_EQ(3, value_); }\n\n  virtual void SetUp() {\n    EXPECT_EQ(1, value_);\n    value_++;\n  }\n\n  virtual void TearDown() {\n    EXPECT_EQ(2, value_);\n    value_++;\n  }\n\n  T value_;\n  static T* shared_;\n};\n\ntemplate <typename T>\nT* CommonTest<T>::shared_ = NULL;\n\n// This #ifdef block tests typed tests.\n#if GTEST_HAS_TYPED_TEST\n\nusing testing::Types;\n\n// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,\n// and SetUp()/TearDown() work correctly in typed tests\n\ntypedef Types<char, int> TwoTypes;\nTYPED_TEST_CASE(CommonTest, TwoTypes);\n\nTYPED_TEST(CommonTest, ValuesAreCorrect) {\n  // Static members of the fixture class template can be visited via\n  // the TestFixture:: prefix.\n  EXPECT_EQ(5, *TestFixture::shared_);\n\n  // Typedefs in the fixture class template can be visited via the\n  // \"typename TestFixture::\" prefix.\n  typename TestFixture::Vector empty;\n  EXPECT_EQ(0U, empty.size());\n\n  typename TestFixture::IntSet empty2;\n  EXPECT_EQ(0U, empty2.size());\n\n  // Non-static members of the fixture class must be visited via\n  // 'this', as required by C++ for class templates.\n  EXPECT_EQ(2, this->value_);\n}\n\n// The second test makes sure shared_ is not deleted after the first\n// test.\nTYPED_TEST(CommonTest, ValuesAreStillCorrect) {\n  // Static members of the fixture class template can also be visited\n  // via 'this'.\n  ASSERT_TRUE(this->shared_ != NULL);\n  EXPECT_EQ(5, *this->shared_);\n\n  // TypeParam can be used to refer to the type parameter.\n  EXPECT_EQ(static_cast<TypeParam>(2), this->value_);\n}\n\n// Tests that multiple TYPED_TEST_CASE's can be defined in the same\n// translation unit.\n\ntemplate <typename T>\nclass TypedTest1 : public Test {\n};\n\n// Verifies that the second argument of TYPED_TEST_CASE can be a\n// single type.\nTYPED_TEST_CASE(TypedTest1, int);\nTYPED_TEST(TypedTest1, A) {}\n\ntemplate <typename T>\nclass TypedTest2 : public Test {\n};\n\n// Verifies that the second argument of TYPED_TEST_CASE can be a\n// Types<...> type list.\nTYPED_TEST_CASE(TypedTest2, Types<int>);\n\n// This also verifies that tests from different typed test cases can\n// share the same name.\nTYPED_TEST(TypedTest2, A) {}\n\n// Tests that a typed test case can be defined in a namespace.\n\nnamespace library1 {\n\ntemplate <typename T>\nclass NumericTest : public Test {\n};\n\ntypedef Types<int, long> NumericTypes;\nTYPED_TEST_CASE(NumericTest, NumericTypes);\n\nTYPED_TEST(NumericTest, DefaultIsZero) {\n  EXPECT_EQ(0, TypeParam());\n}\n\n}  // namespace library1\n\n#endif  // GTEST_HAS_TYPED_TEST\n\n// This #ifdef block tests type-parameterized tests.\n#if GTEST_HAS_TYPED_TEST_P\n\nusing testing::Types;\nusing testing::internal::TypedTestCasePState;\n\n// Tests TypedTestCasePState.\n\nclass TypedTestCasePStateTest : public Test {\n protected:\n  virtual void SetUp() {\n    state_.AddTestName(\"foo.cc\", 0, \"FooTest\", \"A\");\n    state_.AddTestName(\"foo.cc\", 0, \"FooTest\", \"B\");\n    state_.AddTestName(\"foo.cc\", 0, \"FooTest\", \"C\");\n  }\n\n  TypedTestCasePState state_;\n};\n\nTEST_F(TypedTestCasePStateTest, SucceedsForMatchingList) {\n  const char* tests = \"A, B, C\";\n  EXPECT_EQ(tests,\n            state_.VerifyRegisteredTestNames(\"foo.cc\", 1, tests));\n}\n\n// Makes sure that the order of the tests and spaces around the names\n// don't matter.\nTEST_F(TypedTestCasePStateTest, IgnoresOrderAndSpaces) {\n  const char* tests = \"A,C,   B\";\n  EXPECT_EQ(tests,\n            state_.VerifyRegisteredTestNames(\"foo.cc\", 1, tests));\n}\n\ntypedef TypedTestCasePStateTest TypedTestCasePStateDeathTest;\n\nTEST_F(TypedTestCasePStateDeathTest, DetectsDuplicates) {\n  EXPECT_DEATH_IF_SUPPORTED(\n      state_.VerifyRegisteredTestNames(\"foo.cc\", 1, \"A, B, A, C\"),\n      \"foo\\\\.cc.1.?: Test A is listed more than once\\\\.\");\n}\n\nTEST_F(TypedTestCasePStateDeathTest, DetectsExtraTest) {\n  EXPECT_DEATH_IF_SUPPORTED(\n      state_.VerifyRegisteredTestNames(\"foo.cc\", 1, \"A, B, C, D\"),\n      \"foo\\\\.cc.1.?: No test named D can be found in this test case\\\\.\");\n}\n\nTEST_F(TypedTestCasePStateDeathTest, DetectsMissedTest) {\n  EXPECT_DEATH_IF_SUPPORTED(\n      state_.VerifyRegisteredTestNames(\"foo.cc\", 1, \"A, C\"),\n      \"foo\\\\.cc.1.?: You forgot to list test B\\\\.\");\n}\n\n// Tests that defining a test for a parameterized test case generates\n// a run-time error if the test case has been registered.\nTEST_F(TypedTestCasePStateDeathTest, DetectsTestAfterRegistration) {\n  state_.VerifyRegisteredTestNames(\"foo.cc\", 1, \"A, B, C\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      state_.AddTestName(\"foo.cc\", 2, \"FooTest\", \"D\"),\n      \"foo\\\\.cc.2.?: Test D must be defined before REGISTER_TYPED_TEST_CASE_P\"\n      \"\\\\(FooTest, \\\\.\\\\.\\\\.\\\\)\\\\.\");\n}\n\n// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,\n// and SetUp()/TearDown() work correctly in type-parameterized tests.\n\ntemplate <typename T>\nclass DerivedTest : public CommonTest<T> {\n};\n\nTYPED_TEST_CASE_P(DerivedTest);\n\nTYPED_TEST_P(DerivedTest, ValuesAreCorrect) {\n  // Static members of the fixture class template can be visited via\n  // the TestFixture:: prefix.\n  EXPECT_EQ(5, *TestFixture::shared_);\n\n  // Non-static members of the fixture class must be visited via\n  // 'this', as required by C++ for class templates.\n  EXPECT_EQ(2, this->value_);\n}\n\n// The second test makes sure shared_ is not deleted after the first\n// test.\nTYPED_TEST_P(DerivedTest, ValuesAreStillCorrect) {\n  // Static members of the fixture class template can also be visited\n  // via 'this'.\n  ASSERT_TRUE(this->shared_ != NULL);\n  EXPECT_EQ(5, *this->shared_);\n  EXPECT_EQ(2, this->value_);\n}\n\nREGISTER_TYPED_TEST_CASE_P(DerivedTest,\n                           ValuesAreCorrect, ValuesAreStillCorrect);\n\ntypedef Types<short, long> MyTwoTypes;\nINSTANTIATE_TYPED_TEST_CASE_P(My, DerivedTest, MyTwoTypes);\n\n// Tests that multiple TYPED_TEST_CASE_P's can be defined in the same\n// translation unit.\n\ntemplate <typename T>\nclass TypedTestP1 : public Test {\n};\n\nTYPED_TEST_CASE_P(TypedTestP1);\n\n// For testing that the code between TYPED_TEST_CASE_P() and\n// TYPED_TEST_P() is not enclosed in a namespace.\ntypedef int IntAfterTypedTestCaseP;\n\nTYPED_TEST_P(TypedTestP1, A) {}\nTYPED_TEST_P(TypedTestP1, B) {}\n\n// For testing that the code between TYPED_TEST_P() and\n// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.\ntypedef int IntBeforeRegisterTypedTestCaseP;\n\nREGISTER_TYPED_TEST_CASE_P(TypedTestP1, A, B);\n\ntemplate <typename T>\nclass TypedTestP2 : public Test {\n};\n\nTYPED_TEST_CASE_P(TypedTestP2);\n\n// This also verifies that tests from different type-parameterized\n// test cases can share the same name.\nTYPED_TEST_P(TypedTestP2, A) {}\n\nREGISTER_TYPED_TEST_CASE_P(TypedTestP2, A);\n\n// Verifies that the code between TYPED_TEST_CASE_P() and\n// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.\nIntAfterTypedTestCaseP after = 0;\nIntBeforeRegisterTypedTestCaseP before = 0;\n\n// Verifies that the last argument of INSTANTIATE_TYPED_TEST_CASE_P()\n// can be either a single type or a Types<...> type list.\nINSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP1, int);\nINSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP2, Types<int>);\n\n// Tests that the same type-parameterized test case can be\n// instantiated more than once in the same translation unit.\nINSTANTIATE_TYPED_TEST_CASE_P(Double, TypedTestP2, Types<double>);\n\n// Tests that the same type-parameterized test case can be\n// instantiated in different translation units linked together.\n// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)\ntypedef Types<std::vector<double>, std::set<char> > MyContainers;\nINSTANTIATE_TYPED_TEST_CASE_P(My, ContainerTest, MyContainers);\n\n// Tests that a type-parameterized test case can be defined and\n// instantiated in a namespace.\n\nnamespace library2 {\n\ntemplate <typename T>\nclass NumericTest : public Test {\n};\n\nTYPED_TEST_CASE_P(NumericTest);\n\nTYPED_TEST_P(NumericTest, DefaultIsZero) {\n  EXPECT_EQ(0, TypeParam());\n}\n\nTYPED_TEST_P(NumericTest, ZeroIsLessThanOne) {\n  EXPECT_LT(TypeParam(0), TypeParam(1));\n}\n\nREGISTER_TYPED_TEST_CASE_P(NumericTest,\n                           DefaultIsZero, ZeroIsLessThanOne);\ntypedef Types<int, double> NumericTypes;\nINSTANTIATE_TYPED_TEST_CASE_P(My, NumericTest, NumericTypes);\n\n}  // namespace library2\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n#if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)\n\n// Google Test may not support type-parameterized tests with some\n// compilers. If we use conditional compilation to compile out all\n// code referring to the gtest_main library, MSVC linker will not link\n// that library at all and consequently complain about missing entry\n// point defined in that library (fatal error LNK1561: entry point\n// must be defined). This dummy test keeps gtest_main linked in.\nTEST(DummyTest, TypedTestsAreNotSupportedOnThisPlatform) {}\n\n#endif  // #if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.h",
    "content": "// Copyright 2008 Google Inc.\n// All Rights Reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#ifndef GTEST_TEST_GTEST_TYPED_TEST_TEST_H_\n#define GTEST_TEST_GTEST_TYPED_TEST_TEST_H_\n\n#include <gtest/gtest.h>\n\n#if GTEST_HAS_TYPED_TEST_P\n\nusing testing::Test;\n\n// For testing that the same type-parameterized test case can be\n// instantiated in different translation units linked together.\n// ContainerTest will be instantiated in both gtest-typed-test_test.cc\n// and gtest-typed-test2_test.cc.\n\ntemplate <typename T>\nclass ContainerTest : public Test {\n};\n\nTYPED_TEST_CASE_P(ContainerTest);\n\nTYPED_TEST_P(ContainerTest, CanBeDefaultConstructed) {\n  TypeParam container;\n}\n\nTYPED_TEST_P(ContainerTest, InitialSizeIsZero) {\n  TypeParam container;\n  EXPECT_EQ(0U, container.size());\n}\n\nREGISTER_TYPED_TEST_CASE_P(ContainerTest,\n                           CanBeDefaultConstructed, InitialSizeIsZero);\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n#endif  // GTEST_TEST_GTEST_TYPED_TEST_TEST_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-unittest-api_test.cc",
    "content": "// Copyright 2009 Google Inc.  All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: vladl@google.com (Vlad Losev)\n//\n// The Google C++ Testing Framework (Google Test)\n//\n// This file contains tests verifying correctness of data provided via\n// UnitTest's public methods.\n\n#include <gtest/gtest.h>\n\n#include <string.h>  // For strcmp.\n#include <algorithm>\n\nusing ::testing::InitGoogleTest;\n\nnamespace testing {\nnamespace internal {\n\ntemplate <typename T>\nstruct LessByName {\n  bool operator()(const T* a, const T* b) {\n    return strcmp(a->name(), b->name()) < 0;\n  }\n};\n\nclass UnitTestHelper {\n public:\n  // Returns the array of pointers to all test cases sorted by the test case\n  // name.  The caller is responsible for deleting the array.\n  static TestCase const** const GetSortedTestCases() {\n    UnitTest& unit_test = *UnitTest::GetInstance();\n    TestCase const** const test_cases =\n        new const TestCase*[unit_test.total_test_case_count()];\n\n    for (int i = 0; i < unit_test.total_test_case_count(); ++i)\n      test_cases[i] = unit_test.GetTestCase(i);\n\n    std::sort(test_cases,\n              test_cases + unit_test.total_test_case_count(),\n              LessByName<TestCase>());\n    return test_cases;\n  }\n\n  // Returns the test case by its name.  The caller doesn't own the returned\n  // pointer.\n  static const TestCase* FindTestCase(const char* name) {\n    UnitTest& unit_test = *UnitTest::GetInstance();\n    for (int i = 0; i < unit_test.total_test_case_count(); ++i) {\n      const TestCase* test_case = unit_test.GetTestCase(i);\n      if (0 == strcmp(test_case->name(), name))\n        return test_case;\n    }\n    return NULL;\n  }\n\n  // Returns the array of pointers to all tests in a particular test case\n  // sorted by the test name.  The caller is responsible for deleting the\n  // array.\n  static TestInfo const** const GetSortedTests(const TestCase* test_case) {\n    TestInfo const** const tests =\n        new const TestInfo*[test_case->total_test_count()];\n\n    for (int i = 0; i < test_case->total_test_count(); ++i)\n      tests[i] = test_case->GetTestInfo(i);\n\n    std::sort(tests, tests + test_case->total_test_count(),\n              LessByName<TestInfo>());\n    return tests;\n  }\n};\n\n#if GTEST_HAS_TYPED_TEST\ntemplate <typename T> class TestCaseWithCommentTest : public Test {};\nTYPED_TEST_CASE(TestCaseWithCommentTest, Types<int>);\nTYPED_TEST(TestCaseWithCommentTest, Dummy) {}\n\nconst int kTypedTestCases = 1;\nconst int kTypedTests = 1;\n\nString GetExpectedTestCaseComment() {\n  Message comment;\n  comment << \"TypeParam = \" << GetTypeName<int>().c_str();\n  return comment.GetString();\n}\n#else\nconst int kTypedTestCases = 0;\nconst int kTypedTests = 0;\n#endif  // GTEST_HAS_TYPED_TEST\n\n// We can only test the accessors that do not change value while tests run.\n// Since tests can be run in any order, the values the accessors that track\n// test execution (such as failed_test_count) can not be predicted.\nTEST(ApiTest, UnitTestImmutableAccessorsWork) {\n  UnitTest* unit_test = UnitTest::GetInstance();\n\n  ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());\n  EXPECT_EQ(1 + kTypedTestCases, unit_test->test_case_to_run_count());\n  EXPECT_EQ(2, unit_test->disabled_test_count());\n  EXPECT_EQ(5 + kTypedTests, unit_test->total_test_count());\n  EXPECT_EQ(3 + kTypedTests, unit_test->test_to_run_count());\n\n  const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();\n\n  EXPECT_STREQ(\"ApiTest\", test_cases[0]->name());\n  EXPECT_STREQ(\"DISABLED_Test\", test_cases[1]->name());\n#if GTEST_HAS_TYPED_TEST\n  EXPECT_STREQ(\"TestCaseWithCommentTest/0\", test_cases[2]->name());\n#endif  // GTEST_HAS_TYPED_TEST\n\n  delete[] test_cases;\n\n  // The following lines initiate actions to verify certain methods in\n  // FinalSuccessChecker::TearDown.\n\n  // Records a test property to verify TestResult::GetTestProperty().\n  RecordProperty(\"key\", \"value\");\n}\n\nTEST(ApiTest, TestCaseImmutableAccessorsWork) {\n  const TestCase* test_case = UnitTestHelper::FindTestCase(\"ApiTest\");\n  ASSERT_TRUE(test_case != NULL);\n\n  EXPECT_STREQ(\"ApiTest\", test_case->name());\n  EXPECT_STREQ(\"\", test_case->comment());\n  EXPECT_TRUE(test_case->should_run());\n  EXPECT_EQ(1, test_case->disabled_test_count());\n  EXPECT_EQ(3, test_case->test_to_run_count());\n  ASSERT_EQ(4, test_case->total_test_count());\n\n  const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);\n\n  EXPECT_STREQ(\"DISABLED_Dummy1\", tests[0]->name());\n  EXPECT_STREQ(\"ApiTest\", tests[0]->test_case_name());\n  EXPECT_STREQ(\"\", tests[0]->comment());\n  EXPECT_STREQ(\"\", tests[0]->test_case_comment());\n  EXPECT_FALSE(tests[0]->should_run());\n\n  EXPECT_STREQ(\"TestCaseDisabledAccessorsWork\", tests[1]->name());\n  EXPECT_STREQ(\"ApiTest\", tests[1]->test_case_name());\n  EXPECT_STREQ(\"\", tests[1]->comment());\n  EXPECT_STREQ(\"\", tests[1]->test_case_comment());\n  EXPECT_TRUE(tests[1]->should_run());\n\n  EXPECT_STREQ(\"TestCaseImmutableAccessorsWork\", tests[2]->name());\n  EXPECT_STREQ(\"ApiTest\", tests[2]->test_case_name());\n  EXPECT_STREQ(\"\", tests[2]->comment());\n  EXPECT_STREQ(\"\", tests[2]->test_case_comment());\n  EXPECT_TRUE(tests[2]->should_run());\n\n  EXPECT_STREQ(\"UnitTestImmutableAccessorsWork\", tests[3]->name());\n  EXPECT_STREQ(\"ApiTest\", tests[3]->test_case_name());\n  EXPECT_STREQ(\"\", tests[3]->comment());\n  EXPECT_STREQ(\"\", tests[3]->test_case_comment());\n  EXPECT_TRUE(tests[3]->should_run());\n\n  delete[] tests;\n  tests = NULL;\n\n#if GTEST_HAS_TYPED_TEST\n  test_case = UnitTestHelper::FindTestCase(\"TestCaseWithCommentTest/0\");\n  ASSERT_TRUE(test_case != NULL);\n\n  EXPECT_STREQ(\"TestCaseWithCommentTest/0\", test_case->name());\n  EXPECT_STREQ(GetExpectedTestCaseComment().c_str(), test_case->comment());\n  EXPECT_TRUE(test_case->should_run());\n  EXPECT_EQ(0, test_case->disabled_test_count());\n  EXPECT_EQ(1, test_case->test_to_run_count());\n  ASSERT_EQ(1, test_case->total_test_count());\n\n  tests = UnitTestHelper::GetSortedTests(test_case);\n\n  EXPECT_STREQ(\"Dummy\", tests[0]->name());\n  EXPECT_STREQ(\"TestCaseWithCommentTest/0\", tests[0]->test_case_name());\n  EXPECT_STREQ(\"\", tests[0]->comment());\n  EXPECT_STREQ(GetExpectedTestCaseComment().c_str(),\n               tests[0]->test_case_comment());\n  EXPECT_TRUE(tests[0]->should_run());\n\n  delete[] tests;\n#endif  // GTEST_HAS_TYPED_TEST\n}\n\nTEST(ApiTest, TestCaseDisabledAccessorsWork) {\n  const TestCase* test_case = UnitTestHelper::FindTestCase(\"DISABLED_Test\");\n  ASSERT_TRUE(test_case != NULL);\n\n  EXPECT_STREQ(\"DISABLED_Test\", test_case->name());\n  EXPECT_STREQ(\"\", test_case->comment());\n  EXPECT_FALSE(test_case->should_run());\n  EXPECT_EQ(1, test_case->disabled_test_count());\n  EXPECT_EQ(0, test_case->test_to_run_count());\n  ASSERT_EQ(1, test_case->total_test_count());\n\n  const TestInfo* const test_info = test_case->GetTestInfo(0);\n  EXPECT_STREQ(\"Dummy2\", test_info->name());\n  EXPECT_STREQ(\"DISABLED_Test\", test_info->test_case_name());\n  EXPECT_STREQ(\"\", test_info->comment());\n  EXPECT_STREQ(\"\", test_info->test_case_comment());\n  EXPECT_FALSE(test_info->should_run());\n}\n\n// These two tests are here to provide support for testing\n// test_case_to_run_count, disabled_test_count, and test_to_run_count.\nTEST(ApiTest, DISABLED_Dummy1) {}\nTEST(DISABLED_Test, Dummy2) {}\n\nclass FinalSuccessChecker : public Environment {\n protected:\n  virtual void TearDown() {\n    UnitTest* unit_test = UnitTest::GetInstance();\n\n    EXPECT_EQ(1 + kTypedTestCases, unit_test->successful_test_case_count());\n    EXPECT_EQ(3 + kTypedTests, unit_test->successful_test_count());\n    EXPECT_EQ(0, unit_test->failed_test_case_count());\n    EXPECT_EQ(0, unit_test->failed_test_count());\n    EXPECT_TRUE(unit_test->Passed());\n    EXPECT_FALSE(unit_test->Failed());\n    ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());\n\n    const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();\n\n    EXPECT_STREQ(\"ApiTest\", test_cases[0]->name());\n    EXPECT_STREQ(\"\", test_cases[0]->comment());\n    EXPECT_TRUE(test_cases[0]->should_run());\n    EXPECT_EQ(1, test_cases[0]->disabled_test_count());\n    ASSERT_EQ(4, test_cases[0]->total_test_count());\n    EXPECT_EQ(3, test_cases[0]->successful_test_count());\n    EXPECT_EQ(0, test_cases[0]->failed_test_count());\n    EXPECT_TRUE(test_cases[0]->Passed());\n    EXPECT_FALSE(test_cases[0]->Failed());\n\n    EXPECT_STREQ(\"DISABLED_Test\", test_cases[1]->name());\n    EXPECT_STREQ(\"\", test_cases[1]->comment());\n    EXPECT_FALSE(test_cases[1]->should_run());\n    EXPECT_EQ(1, test_cases[1]->disabled_test_count());\n    ASSERT_EQ(1, test_cases[1]->total_test_count());\n    EXPECT_EQ(0, test_cases[1]->successful_test_count());\n    EXPECT_EQ(0, test_cases[1]->failed_test_count());\n\n#if GTEST_HAS_TYPED_TEST\n    EXPECT_STREQ(\"TestCaseWithCommentTest/0\", test_cases[2]->name());\n    EXPECT_STREQ(GetExpectedTestCaseComment().c_str(),\n                 test_cases[2]->comment());\n    EXPECT_TRUE(test_cases[2]->should_run());\n    EXPECT_EQ(0, test_cases[2]->disabled_test_count());\n    ASSERT_EQ(1, test_cases[2]->total_test_count());\n    EXPECT_EQ(1, test_cases[2]->successful_test_count());\n    EXPECT_EQ(0, test_cases[2]->failed_test_count());\n    EXPECT_TRUE(test_cases[2]->Passed());\n    EXPECT_FALSE(test_cases[2]->Failed());\n#endif  // GTEST_HAS_TYPED_TEST\n\n    const TestCase* test_case = UnitTestHelper::FindTestCase(\"ApiTest\");\n    const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);\n    EXPECT_STREQ(\"DISABLED_Dummy1\", tests[0]->name());\n    EXPECT_STREQ(\"ApiTest\", tests[0]->test_case_name());\n    EXPECT_FALSE(tests[0]->should_run());\n\n    EXPECT_STREQ(\"TestCaseDisabledAccessorsWork\", tests[1]->name());\n    EXPECT_STREQ(\"ApiTest\", tests[1]->test_case_name());\n    EXPECT_STREQ(\"\", tests[1]->comment());\n    EXPECT_STREQ(\"\", tests[1]->test_case_comment());\n    EXPECT_TRUE(tests[1]->should_run());\n    EXPECT_TRUE(tests[1]->result()->Passed());\n    EXPECT_EQ(0, tests[1]->result()->test_property_count());\n\n    EXPECT_STREQ(\"TestCaseImmutableAccessorsWork\", tests[2]->name());\n    EXPECT_STREQ(\"ApiTest\", tests[2]->test_case_name());\n    EXPECT_STREQ(\"\", tests[2]->comment());\n    EXPECT_STREQ(\"\", tests[2]->test_case_comment());\n    EXPECT_TRUE(tests[2]->should_run());\n    EXPECT_TRUE(tests[2]->result()->Passed());\n    EXPECT_EQ(0, tests[2]->result()->test_property_count());\n\n    EXPECT_STREQ(\"UnitTestImmutableAccessorsWork\", tests[3]->name());\n    EXPECT_STREQ(\"ApiTest\", tests[3]->test_case_name());\n    EXPECT_STREQ(\"\", tests[3]->comment());\n    EXPECT_STREQ(\"\", tests[3]->test_case_comment());\n    EXPECT_TRUE(tests[3]->should_run());\n    EXPECT_TRUE(tests[3]->result()->Passed());\n    EXPECT_EQ(1, tests[3]->result()->test_property_count());\n    const TestProperty& property = tests[3]->result()->GetTestProperty(0);\n    EXPECT_STREQ(\"key\", property.key());\n    EXPECT_STREQ(\"value\", property.value());\n\n    delete[] tests;\n\n#if GTEST_HAS_TYPED_TEST\n    test_case = UnitTestHelper::FindTestCase(\"TestCaseWithCommentTest/0\");\n    tests = UnitTestHelper::GetSortedTests(test_case);\n\n    EXPECT_STREQ(\"Dummy\", tests[0]->name());\n    EXPECT_STREQ(\"TestCaseWithCommentTest/0\", tests[0]->test_case_name());\n    EXPECT_STREQ(\"\", tests[0]->comment());\n    EXPECT_STREQ(GetExpectedTestCaseComment().c_str(),\n                 tests[0]->test_case_comment());\n    EXPECT_TRUE(tests[0]->should_run());\n    EXPECT_TRUE(tests[0]->result()->Passed());\n    EXPECT_EQ(0, tests[0]->result()->test_property_count());\n\n    delete[] tests;\n#endif  // GTEST_HAS_TYPED_TEST\n    delete[] test_cases;\n  }\n};\n\n}  // namespace internal\n}  // namespace testing\n\nint main(int argc, char **argv) {\n  InitGoogleTest(&argc, argv);\n\n  AddGlobalTestEnvironment(new testing::internal::FinalSuccessChecker());\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_all_test.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// Tests for Google C++ Testing Framework (Google Test)\n//\n// Sometimes it's desirable to build most of Google Test's own tests\n// by compiling a single file.  This file serves this purpose.\n#include \"test/gtest-filepath_test.cc\"\n#include \"test/gtest-linked_ptr_test.cc\"\n#include \"test/gtest-message_test.cc\"\n#include \"test/gtest-options_test.cc\"\n#include \"test/gtest-port_test.cc\"\n#include \"test/gtest_pred_impl_unittest.cc\"\n#include \"test/gtest_prod_test.cc\"\n#include \"test/gtest-test-part_test.cc\"\n#include \"test/gtest-typed-test_test.cc\"\n#include \"test/gtest-typed-test2_test.cc\"\n#include \"test/gtest_unittest.cc\"\n#include \"test/production.cc\"\n#include \"src/gtest_main.cc\"\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test for Google Test's break-on-failure mode.\n\nA user can ask Google Test to seg-fault when an assertion fails, using\neither the GTEST_BREAK_ON_FAILURE environment variable or the\n--gtest_break_on_failure flag.  This script tests such functionality\nby invoking gtest_break_on_failure_unittest_ (a program written with\nGoogle Test) with different environments and command line flags.\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport gtest_test_utils\nimport os\nimport sys\n\n\n# Constants.\n\nIS_WINDOWS = os.name == 'nt'\n\n# The environment variable for enabling/disabling the break-on-failure mode.\nBREAK_ON_FAILURE_ENV_VAR = 'GTEST_BREAK_ON_FAILURE'\n\n# The command line flag for enabling/disabling the break-on-failure mode.\nBREAK_ON_FAILURE_FLAG = 'gtest_break_on_failure'\n\n# The environment variable for enabling/disabling the throw-on-failure mode.\nTHROW_ON_FAILURE_ENV_VAR = 'GTEST_THROW_ON_FAILURE'\n\n# The environment variable for enabling/disabling the catch-exceptions mode.\nCATCH_EXCEPTIONS_ENV_VAR = 'GTEST_CATCH_EXCEPTIONS'\n\n# Path to the gtest_break_on_failure_unittest_ program.\nEXE_PATH = gtest_test_utils.GetTestExecutablePath(\n    'gtest_break_on_failure_unittest_')\n\n\n# Utilities.\n\n\nenviron = os.environ.copy()\n\n\ndef SetEnvVar(env_var, value):\n  \"\"\"Sets an environment variable to a given value; unsets it when the\n  given value is None.\n  \"\"\"\n\n  if value is not None:\n    environ[env_var] = value\n  elif env_var in environ:\n    del environ[env_var]\n\n\ndef Run(command):\n  \"\"\"Runs a command; returns 1 if it was killed by a signal, or 0 otherwise.\"\"\"\n\n  p = gtest_test_utils.Subprocess(command, env=environ)\n  if p.terminated_by_signal:\n    return 1\n  else:\n    return 0\n\n\n# The tests.\n\n\nclass GTestBreakOnFailureUnitTest(gtest_test_utils.TestCase):\n  \"\"\"Tests using the GTEST_BREAK_ON_FAILURE environment variable or\n  the --gtest_break_on_failure flag to turn assertion failures into\n  segmentation faults.\n  \"\"\"\n\n  def RunAndVerify(self, env_var_value, flag_value, expect_seg_fault):\n    \"\"\"Runs gtest_break_on_failure_unittest_ and verifies that it does\n    (or does not) have a seg-fault.\n\n    Args:\n      env_var_value:    value of the GTEST_BREAK_ON_FAILURE environment\n                        variable; None if the variable should be unset.\n      flag_value:       value of the --gtest_break_on_failure flag;\n                        None if the flag should not be present.\n      expect_seg_fault: 1 if the program is expected to generate a seg-fault;\n                        0 otherwise.\n    \"\"\"\n\n    SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, env_var_value)\n\n    if env_var_value is None:\n      env_var_value_msg = ' is not set'\n    else:\n      env_var_value_msg = '=' + env_var_value\n\n    if flag_value is None:\n      flag = ''\n    elif flag_value == '0':\n      flag = '--%s=0' % BREAK_ON_FAILURE_FLAG\n    else:\n      flag = '--%s' % BREAK_ON_FAILURE_FLAG\n\n    command = [EXE_PATH]\n    if flag:\n      command.append(flag)\n\n    if expect_seg_fault:\n      should_or_not = 'should'\n    else:\n      should_or_not = 'should not'\n\n    has_seg_fault = Run(command)\n\n    SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, None)\n\n    msg = ('when %s%s, an assertion failure in \"%s\" %s cause a seg-fault.' %\n           (BREAK_ON_FAILURE_ENV_VAR, env_var_value_msg, ' '.join(command),\n            should_or_not))\n    self.assert_(has_seg_fault == expect_seg_fault, msg)\n\n  def testDefaultBehavior(self):\n    \"\"\"Tests the behavior of the default mode.\"\"\"\n\n    self.RunAndVerify(env_var_value=None,\n                      flag_value=None,\n                      expect_seg_fault=0)\n\n  def testEnvVar(self):\n    \"\"\"Tests using the GTEST_BREAK_ON_FAILURE environment variable.\"\"\"\n\n    self.RunAndVerify(env_var_value='0',\n                      flag_value=None,\n                      expect_seg_fault=0)\n    self.RunAndVerify(env_var_value='1',\n                      flag_value=None,\n                      expect_seg_fault=1)\n\n  def testFlag(self):\n    \"\"\"Tests using the --gtest_break_on_failure flag.\"\"\"\n\n    self.RunAndVerify(env_var_value=None,\n                      flag_value='0',\n                      expect_seg_fault=0)\n    self.RunAndVerify(env_var_value=None,\n                      flag_value='1',\n                      expect_seg_fault=1)\n\n  def testFlagOverridesEnvVar(self):\n    \"\"\"Tests that the flag overrides the environment variable.\"\"\"\n\n    self.RunAndVerify(env_var_value='0',\n                      flag_value='0',\n                      expect_seg_fault=0)\n    self.RunAndVerify(env_var_value='0',\n                      flag_value='1',\n                      expect_seg_fault=1)\n    self.RunAndVerify(env_var_value='1',\n                      flag_value='0',\n                      expect_seg_fault=0)\n    self.RunAndVerify(env_var_value='1',\n                      flag_value='1',\n                      expect_seg_fault=1)\n\n  def testBreakOnFailureOverridesThrowOnFailure(self):\n    \"\"\"Tests that gtest_break_on_failure overrides gtest_throw_on_failure.\"\"\"\n\n    SetEnvVar(THROW_ON_FAILURE_ENV_VAR, '1')\n    try:\n      self.RunAndVerify(env_var_value=None,\n                        flag_value='1',\n                        expect_seg_fault=1)\n    finally:\n      SetEnvVar(THROW_ON_FAILURE_ENV_VAR, None)\n\n  if IS_WINDOWS:\n    def testCatchExceptionsDoesNotInterfere(self):\n      \"\"\"Tests that gtest_catch_exceptions doesn't interfere.\"\"\"\n\n      SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, '1')\n      try:\n        self.RunAndVerify(env_var_value='1',\n                          flag_value='1',\n                          expect_seg_fault=1)\n      finally:\n        SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, None)\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest_.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Unit test for Google Test's break-on-failure mode.\n//\n// A user can ask Google Test to seg-fault when an assertion fails, using\n// either the GTEST_BREAK_ON_FAILURE environment variable or the\n// --gtest_break_on_failure flag.  This file is used for testing such\n// functionality.\n//\n// This program will be invoked from a Python unit test.  It is\n// expected to fail.  Don't run it directly.\n\n#include <gtest/gtest.h>\n\n#if GTEST_OS_WINDOWS\n#include <windows.h>\n#include <stdlib.h>\n#endif\n\nnamespace {\n\n// A test that's expected to fail.\nTEST(Foo, Bar) {\n  EXPECT_EQ(2, 3);\n}\n\n#if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE\n// On Windows Mobile global exception handlers are not supported.\nLONG WINAPI ExitWithExceptionCode(\n    struct _EXCEPTION_POINTERS* exception_pointers) {\n  exit(exception_pointers->ExceptionRecord->ExceptionCode);\n}\n#endif\n\n}  // namespace\n\nint main(int argc, char **argv) {\n#if GTEST_OS_WINDOWS\n  // Suppresses display of the Windows error dialog upon encountering\n  // a general protection fault (segment violation).\n  SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS);\n\n#if !GTEST_OS_WINDOWS_MOBILE\n  // The default unhandled exception filter does not always exit\n  // with the exception code as exit code - for example it exits with\n  // 0 for EXCEPTION_ACCESS_VIOLATION and 1 for EXCEPTION_BREAKPOINT\n  // if the application is compiled in debug mode. Thus we use our own\n  // filter which always exits with the exception code for unhandled\n  // exceptions.\n  SetUnhandledExceptionFilter(ExitWithExceptionCode);\n#endif\n#endif\n\n  testing::InitGoogleTest(&argc, argv);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Verifies that Google Test correctly determines whether to use colors.\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport gtest_test_utils\n\n\nIS_WINDOWS = os.name = 'nt'\n\nCOLOR_ENV_VAR = 'GTEST_COLOR'\nCOLOR_FLAG = 'gtest_color'\nCOMMAND = gtest_test_utils.GetTestExecutablePath('gtest_color_test_')\n\n\ndef SetEnvVar(env_var, value):\n  \"\"\"Sets the env variable to 'value'; unsets it when 'value' is None.\"\"\"\n\n  if value is not None:\n    os.environ[env_var] = value\n  elif env_var in os.environ:\n    del os.environ[env_var]\n\n\ndef UsesColor(term, color_env_var, color_flag):\n  \"\"\"Runs gtest_color_test_ and returns its exit code.\"\"\"\n\n  SetEnvVar('TERM', term)\n  SetEnvVar(COLOR_ENV_VAR, color_env_var)\n\n  if color_flag is None:\n    args = []\n  else:\n    args = ['--%s=%s' % (COLOR_FLAG, color_flag)]\n  p = gtest_test_utils.Subprocess([COMMAND] + args)\n  return not p.exited or p.exit_code\n\n\nclass GTestColorTest(gtest_test_utils.TestCase):\n  def testNoEnvVarNoFlag(self):\n    \"\"\"Tests the case when there's neither GTEST_COLOR nor --gtest_color.\"\"\"\n\n    if not IS_WINDOWS:\n      self.assert_(not UsesColor('dumb', None, None))\n      self.assert_(not UsesColor('emacs', None, None))\n      self.assert_(not UsesColor('xterm-mono', None, None))\n      self.assert_(not UsesColor('unknown', None, None))\n      self.assert_(not UsesColor(None, None, None))\n    self.assert_(UsesColor('linux', None, None))\n    self.assert_(UsesColor('cygwin', None, None))\n    self.assert_(UsesColor('xterm', None, None))\n    self.assert_(UsesColor('xterm-color', None, None))\n    self.assert_(UsesColor('xterm-256color', None, None))\n\n  def testFlagOnly(self):\n    \"\"\"Tests the case when there's --gtest_color but not GTEST_COLOR.\"\"\"\n\n    self.assert_(not UsesColor('dumb', None, 'no'))\n    self.assert_(not UsesColor('xterm-color', None, 'no'))\n    if not IS_WINDOWS:\n      self.assert_(not UsesColor('emacs', None, 'auto'))\n    self.assert_(UsesColor('xterm', None, 'auto'))\n    self.assert_(UsesColor('dumb', None, 'yes'))\n    self.assert_(UsesColor('xterm', None, 'yes'))\n\n  def testEnvVarOnly(self):\n    \"\"\"Tests the case when there's GTEST_COLOR but not --gtest_color.\"\"\"\n\n    self.assert_(not UsesColor('dumb', 'no', None))\n    self.assert_(not UsesColor('xterm-color', 'no', None))\n    if not IS_WINDOWS:\n      self.assert_(not UsesColor('dumb', 'auto', None))\n    self.assert_(UsesColor('xterm-color', 'auto', None))\n    self.assert_(UsesColor('dumb', 'yes', None))\n    self.assert_(UsesColor('xterm-color', 'yes', None))\n\n  def testEnvVarAndFlag(self):\n    \"\"\"Tests the case when there are both GTEST_COLOR and --gtest_color.\"\"\"\n\n    self.assert_(not UsesColor('xterm-color', 'no', 'no'))\n    self.assert_(UsesColor('dumb', 'no', 'yes'))\n    self.assert_(UsesColor('xterm-color', 'no', 'auto'))\n\n  def testAliasesOfYesAndNo(self):\n    \"\"\"Tests using aliases in specifying --gtest_color.\"\"\"\n\n    self.assert_(UsesColor('dumb', None, 'true'))\n    self.assert_(UsesColor('dumb', None, 'YES'))\n    self.assert_(UsesColor('dumb', None, 'T'))\n    self.assert_(UsesColor('dumb', None, '1'))\n\n    self.assert_(not UsesColor('xterm', None, 'f'))\n    self.assert_(not UsesColor('xterm', None, 'false'))\n    self.assert_(not UsesColor('xterm', None, '0'))\n    self.assert_(not UsesColor('xterm', None, 'unknown'))\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test_.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// A helper program for testing how Google Test determines whether to use\n// colors in the output.  It prints \"YES\" and returns 1 if Google Test\n// decides to use colors, and prints \"NO\" and returns 0 otherwise.\n\n#include <stdio.h>\n\n#include <gtest/gtest.h>\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\nusing testing::internal::ShouldUseColor;\n\n// The purpose of this is to ensure that the UnitTest singleton is\n// created before main() is entered, and thus that ShouldUseColor()\n// works the same way as in a real Google-Test-based test.  We don't actual\n// run the TEST itself.\nTEST(GTestColorTest, Dummy) {\n}\n\nint main(int argc, char** argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  if (ShouldUseColor(true)) {\n    // Google Test decides to use colors in the output (assuming it\n    // goes to a TTY).\n    printf(\"YES\\n\");\n    return 1;\n  } else {\n    // Google Test decides not to use colors in the output.\n    printf(\"NO\\n\");\n    return 0;\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Verifies that Google Test correctly parses environment variables.\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport gtest_test_utils\n\n\nIS_WINDOWS = os.name == 'nt'\nIS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'\n\nCOMMAND = gtest_test_utils.GetTestExecutablePath('gtest_env_var_test_')\n\nenviron = os.environ.copy()\n\n\ndef AssertEq(expected, actual):\n  if expected != actual:\n    print 'Expected: %s' % (expected,)\n    print '  Actual: %s' % (actual,)\n    raise AssertionError\n\n\ndef SetEnvVar(env_var, value):\n  \"\"\"Sets the env variable to 'value'; unsets it when 'value' is None.\"\"\"\n\n  if value is not None:\n    environ[env_var] = value\n  elif env_var in environ:\n    del environ[env_var]\n\n\ndef GetFlag(flag):\n  \"\"\"Runs gtest_env_var_test_ and returns its output.\"\"\"\n\n  args = [COMMAND]\n  if flag is not None:\n    args += [flag]\n  return gtest_test_utils.Subprocess(args, env=environ).output\n\n\ndef TestFlag(flag, test_val, default_val):\n  \"\"\"Verifies that the given flag is affected by the corresponding env var.\"\"\"\n\n  env_var = 'GTEST_' + flag.upper()\n  SetEnvVar(env_var, test_val)\n  AssertEq(test_val, GetFlag(flag))\n  SetEnvVar(env_var, None)\n  AssertEq(default_val, GetFlag(flag))\n\n\nclass GTestEnvVarTest(gtest_test_utils.TestCase):\n  def testEnvVarAffectsFlag(self):\n    \"\"\"Tests that environment variable should affect the corresponding flag.\"\"\"\n\n    TestFlag('break_on_failure', '1', '0')\n    TestFlag('color', 'yes', 'auto')\n    TestFlag('filter', 'FooTest.Bar', '*')\n    TestFlag('output', 'xml:tmp/foo.xml', '')\n    TestFlag('print_time', '0', '1')\n    TestFlag('repeat', '999', '1')\n    TestFlag('throw_on_failure', '1', '0')\n    TestFlag('death_test_style', 'threadsafe', 'fast')\n\n    if IS_WINDOWS:\n      TestFlag('catch_exceptions', '1', '0')\n\n    if IS_LINUX:\n      TestFlag('death_test_use_fork', '1', '0')\n      TestFlag('stack_trace_depth', '0', '100')\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test_.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// A helper program for testing that Google Test parses the environment\n// variables correctly.\n\n#include <gtest/gtest.h>\n\n#include <iostream>\n\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\nusing ::std::cout;\n\nnamespace testing {\n\n// The purpose of this is to make the test more realistic by ensuring\n// that the UnitTest singleton is created before main() is entered.\n// We don't actual run the TEST itself.\nTEST(GTestEnvVarTest, Dummy) {\n}\n\nvoid PrintFlag(const char* flag) {\n  if (strcmp(flag, \"break_on_failure\") == 0) {\n    cout << GTEST_FLAG(break_on_failure);\n    return;\n  }\n\n  if (strcmp(flag, \"catch_exceptions\") == 0) {\n    cout << GTEST_FLAG(catch_exceptions);\n    return;\n  }\n\n  if (strcmp(flag, \"color\") == 0) {\n    cout << GTEST_FLAG(color);\n    return;\n  }\n\n  if (strcmp(flag, \"death_test_style\") == 0) {\n    cout << GTEST_FLAG(death_test_style);\n    return;\n  }\n\n  if (strcmp(flag, \"death_test_use_fork\") == 0) {\n    cout << GTEST_FLAG(death_test_use_fork);\n    return;\n  }\n\n  if (strcmp(flag, \"filter\") == 0) {\n    cout << GTEST_FLAG(filter);\n    return;\n  }\n\n  if (strcmp(flag, \"output\") == 0) {\n    cout << GTEST_FLAG(output);\n    return;\n  }\n\n  if (strcmp(flag, \"print_time\") == 0) {\n    cout << GTEST_FLAG(print_time);\n    return;\n  }\n\n  if (strcmp(flag, \"repeat\") == 0) {\n    cout << GTEST_FLAG(repeat);\n    return;\n  }\n\n  if (strcmp(flag, \"stack_trace_depth\") == 0) {\n    cout << GTEST_FLAG(stack_trace_depth);\n    return;\n  }\n\n  if (strcmp(flag, \"throw_on_failure\") == 0) {\n    cout << GTEST_FLAG(throw_on_failure);\n    return;\n  }\n\n  cout << \"Invalid flag name \" << flag\n       << \".  Valid names are break_on_failure, color, filter, etc.\\n\";\n  exit(1);\n}\n\n}  // namespace testing\n\nint main(int argc, char** argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  if (argc != 2) {\n    cout << \"Usage: gtest_env_var_test_ NAME_OF_FLAG\\n\";\n    return 1;\n  }\n\n  testing::PrintFlag(argv[1]);\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_environment_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// Tests using global test environments.\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <gtest/gtest.h>\n\nnamespace testing {\nGTEST_DECLARE_string_(filter);\n}\n\nnamespace {\n\nenum FailureType {\n  NO_FAILURE, NON_FATAL_FAILURE, FATAL_FAILURE\n};\n\n// For testing using global test environments.\nclass MyEnvironment : public testing::Environment {\n public:\n  MyEnvironment() { Reset(); }\n\n  // Depending on the value of failure_in_set_up_, SetUp() will\n  // generate a non-fatal failure, generate a fatal failure, or\n  // succeed.\n  virtual void SetUp() {\n    set_up_was_run_ = true;\n\n    switch (failure_in_set_up_) {\n      case NON_FATAL_FAILURE:\n        ADD_FAILURE() << \"Expected non-fatal failure in global set-up.\";\n        break;\n      case FATAL_FAILURE:\n        FAIL() << \"Expected fatal failure in global set-up.\";\n        break;\n      default:\n        break;\n    }\n  }\n\n  // Generates a non-fatal failure.\n  virtual void TearDown() {\n    tear_down_was_run_ = true;\n    ADD_FAILURE() << \"Expected non-fatal failure in global tear-down.\";\n  }\n\n  // Resets the state of the environment s.t. it can be reused.\n  void Reset() {\n    failure_in_set_up_ = NO_FAILURE;\n    set_up_was_run_ = false;\n    tear_down_was_run_ = false;\n  }\n\n  // We call this function to set the type of failure SetUp() should\n  // generate.\n  void set_failure_in_set_up(FailureType type) {\n    failure_in_set_up_ = type;\n  }\n\n  // Was SetUp() run?\n  bool set_up_was_run() const { return set_up_was_run_; }\n\n  // Was TearDown() run?\n  bool tear_down_was_run() const { return tear_down_was_run_; }\n private:\n  FailureType failure_in_set_up_;\n  bool set_up_was_run_;\n  bool tear_down_was_run_;\n};\n\n// Was the TEST run?\nbool test_was_run;\n\n// The sole purpose of this TEST is to enable us to check whether it\n// was run.\nTEST(FooTest, Bar) {\n  test_was_run = true;\n}\n\n// Prints the message and aborts the program if condition is false.\nvoid Check(bool condition, const char* msg) {\n  if (!condition) {\n    printf(\"FAILED: %s\\n\", msg);\n    abort();\n  }\n}\n\n// Runs the tests.  Return true iff successful.\n//\n// The 'failure' parameter specifies the type of failure that should\n// be generated by the global set-up.\nint RunAllTests(MyEnvironment* env, FailureType failure) {\n  env->Reset();\n  env->set_failure_in_set_up(failure);\n  test_was_run = false;\n  return RUN_ALL_TESTS();\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  // Registers a global test environment, and verifies that the\n  // registration function returns its argument.\n  MyEnvironment* const env = new MyEnvironment;\n  Check(testing::AddGlobalTestEnvironment(env) == env,\n        \"AddGlobalTestEnvironment() should return its argument.\");\n\n  // Verifies that RUN_ALL_TESTS() runs the tests when the global\n  // set-up is successful.\n  Check(RunAllTests(env, NO_FAILURE) != 0,\n        \"RUN_ALL_TESTS() should return non-zero, as the global tear-down \"\n        \"should generate a failure.\");\n  Check(test_was_run,\n        \"The tests should run, as the global set-up should generate no \"\n        \"failure\");\n  Check(env->tear_down_was_run(),\n        \"The global tear-down should run, as the global set-up was run.\");\n\n  // Verifies that RUN_ALL_TESTS() runs the tests when the global\n  // set-up generates no fatal failure.\n  Check(RunAllTests(env, NON_FATAL_FAILURE) != 0,\n        \"RUN_ALL_TESTS() should return non-zero, as both the global set-up \"\n        \"and the global tear-down should generate a non-fatal failure.\");\n  Check(test_was_run,\n        \"The tests should run, as the global set-up should generate no \"\n        \"fatal failure.\");\n  Check(env->tear_down_was_run(),\n        \"The global tear-down should run, as the global set-up was run.\");\n\n  // Verifies that RUN_ALL_TESTS() runs no test when the global set-up\n  // generates a fatal failure.\n  Check(RunAllTests(env, FATAL_FAILURE) != 0,\n        \"RUN_ALL_TESTS() should return non-zero, as the global set-up \"\n        \"should generate a fatal failure.\");\n  Check(!test_was_run,\n        \"The tests should not run, as the global set-up should generate \"\n        \"a fatal failure.\");\n  Check(env->tear_down_was_run(),\n        \"The global tear-down should run, as the global set-up was run.\");\n\n  // Verifies that RUN_ALL_TESTS() doesn't do global set-up or\n  // tear-down when there is no test to run.\n  testing::GTEST_FLAG(filter) = \"-*\";\n  Check(RunAllTests(env, NO_FAILURE) == 0,\n        \"RUN_ALL_TESTS() should return zero, as there is no test to run.\");\n  Check(!env->set_up_was_run(),\n        \"The global set-up should not run, as there is no test to run.\");\n  Check(!env->tear_down_was_run(),\n        \"The global tear-down should not run, \"\n        \"as the global set-up was not run.\");\n\n  printf(\"PASS\\n\");\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2005 Google Inc. All Rights Reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test for Google Test test filters.\n\nA user can specify which test(s) in a Google Test program to run via either\nthe GTEST_FILTER environment variable or the --gtest_filter flag.\nThis script tests such functionality by invoking\ngtest_filter_unittest_ (a program written with Google Test) with different\nenvironments and command line flags.\n\nNote that test sharding may also influence which tests are filtered. Therefore,\nwe test that here also.\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport re\nimport sets\nimport sys\n\nimport gtest_test_utils\n\n# Constants.\n\n# Checks if this platform can pass empty environment variables to child\n# processes.  We set an env variable to an empty string and invoke a python\n# script in a subprocess to print whether the variable is STILL in\n# os.environ.  We then use 'eval' to parse the child's output so that an\n# exception is thrown if the input is anything other than 'True' nor 'False'.\nos.environ['EMPTY_VAR'] = ''\nchild = gtest_test_utils.Subprocess(\n    [sys.executable, '-c', 'import os; print \\'EMPTY_VAR\\' in os.environ'])\nCAN_PASS_EMPTY_ENV = eval(child.output)\n\n\n# Check if this platform can unset environment variables in child processes.\n# We set an env variable to a non-empty string, unset it, and invoke\n# a python script in a subprocess to print whether the variable\n# is NO LONGER in os.environ.\n# We use 'eval' to parse the child's output so that an exception\n# is thrown if the input is neither 'True' nor 'False'.\nos.environ['UNSET_VAR'] = 'X'\ndel os.environ['UNSET_VAR']\nchild = gtest_test_utils.Subprocess(\n    [sys.executable, '-c', 'import os; print \\'UNSET_VAR\\' not in os.environ'])\nCAN_UNSET_ENV = eval(child.output)\n\n\n# Checks if we should test with an empty filter. This doesn't\n# make sense on platforms that cannot pass empty env variables (Win32)\n# and on platforms that cannot unset variables (since we cannot tell\n# the difference between \"\" and NULL -- Borland and Solaris < 5.10)\nCAN_TEST_EMPTY_FILTER = (CAN_PASS_EMPTY_ENV and CAN_UNSET_ENV)\n\n\n# The environment variable for specifying the test filters.\nFILTER_ENV_VAR = 'GTEST_FILTER'\n\n# The environment variables for test sharding.\nTOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'\nSHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'\nSHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'\n\n# The command line flag for specifying the test filters.\nFILTER_FLAG = 'gtest_filter'\n\n# The command line flag for including disabled tests.\nALSO_RUN_DISABED_TESTS_FLAG = 'gtest_also_run_disabled_tests'\n\n# Command to run the gtest_filter_unittest_ program.\nCOMMAND = gtest_test_utils.GetTestExecutablePath('gtest_filter_unittest_')\n\n# Regex for determining whether parameterized tests are enabled in the binary.\nPARAM_TEST_REGEX = re.compile(r'/ParamTest')\n\n# Regex for parsing test case names from Google Test's output.\nTEST_CASE_REGEX = re.compile(r'^\\[\\-+\\] \\d+ tests? from (\\w+(/\\w+)?)')\n\n# Regex for parsing test names from Google Test's output.\nTEST_REGEX = re.compile(r'^\\[\\s*RUN\\s*\\].*\\.(\\w+(/\\w+)?)')\n\n# The command line flag to tell Google Test to output the list of tests it\n# will run.\nLIST_TESTS_FLAG = '--gtest_list_tests'\n\n# Indicates whether Google Test supports death tests.\nSUPPORTS_DEATH_TESTS = 'HasDeathTest' in gtest_test_utils.Subprocess(\n    [COMMAND, LIST_TESTS_FLAG]).output\n\n# Full names of all tests in gtest_filter_unittests_.\nPARAM_TESTS = [\n    'SeqP/ParamTest.TestX/0',\n    'SeqP/ParamTest.TestX/1',\n    'SeqP/ParamTest.TestY/0',\n    'SeqP/ParamTest.TestY/1',\n    'SeqQ/ParamTest.TestX/0',\n    'SeqQ/ParamTest.TestX/1',\n    'SeqQ/ParamTest.TestY/0',\n    'SeqQ/ParamTest.TestY/1',\n    ]\n\nDISABLED_TESTS = [\n    'BarTest.DISABLED_TestFour',\n    'BarTest.DISABLED_TestFive',\n    'BazTest.DISABLED_TestC',\n    'DISABLED_FoobarTest.Test1',\n    'DISABLED_FoobarTest.DISABLED_Test2',\n    'DISABLED_FoobarbazTest.TestA',\n    ]\n\nif SUPPORTS_DEATH_TESTS:\n  DEATH_TESTS = [\n    'HasDeathTest.Test1',\n    'HasDeathTest.Test2',\n    ]\nelse:\n  DEATH_TESTS = []\n\n# All the non-disabled tests.\nACTIVE_TESTS = [\n    'FooTest.Abc',\n    'FooTest.Xyz',\n\n    'BarTest.TestOne',\n    'BarTest.TestTwo',\n    'BarTest.TestThree',\n\n    'BazTest.TestOne',\n    'BazTest.TestA',\n    'BazTest.TestB',\n    ] + DEATH_TESTS + PARAM_TESTS\n\nparam_tests_present = None\n\n# Utilities.\n\nenviron = os.environ.copy()\n\n\ndef SetEnvVar(env_var, value):\n  \"\"\"Sets the env variable to 'value'; unsets it when 'value' is None.\"\"\"\n\n  if value is not None:\n    environ[env_var] = value\n  elif env_var in environ:\n    del environ[env_var]\n\n\ndef RunAndReturnOutput(args = None):\n  \"\"\"Runs the test program and returns its output.\"\"\"\n\n  return gtest_test_utils.Subprocess([COMMAND] + (args or []),\n                                     env=environ).output\n\n\ndef RunAndExtractTestList(args = None):\n  \"\"\"Runs the test program and returns its exit code and a list of tests run.\"\"\"\n\n  p = gtest_test_utils.Subprocess([COMMAND] + (args or []), env=environ)\n  tests_run = []\n  test_case = ''\n  test = ''\n  for line in p.output.split('\\n'):\n    match = TEST_CASE_REGEX.match(line)\n    if match is not None:\n      test_case = match.group(1)\n    else:\n      match = TEST_REGEX.match(line)\n      if match is not None:\n        test = match.group(1)\n        tests_run.append(test_case + '.' + test)\n  return (tests_run, p.exit_code)\n\n\ndef InvokeWithModifiedEnv(extra_env, function, *args, **kwargs):\n  \"\"\"Runs the given function and arguments in a modified environment.\"\"\"\n  try:\n    original_env = environ.copy()\n    environ.update(extra_env)\n    return function(*args, **kwargs)\n  finally:\n    environ.clear()\n    environ.update(original_env)\n\n\ndef RunWithSharding(total_shards, shard_index, command):\n  \"\"\"Runs a test program shard and returns exit code and a list of tests run.\"\"\"\n\n  extra_env = {SHARD_INDEX_ENV_VAR: str(shard_index),\n               TOTAL_SHARDS_ENV_VAR: str(total_shards)}\n  return InvokeWithModifiedEnv(extra_env, RunAndExtractTestList, command)\n\n# The unit test.\n\n\nclass GTestFilterUnitTest(gtest_test_utils.TestCase):\n  \"\"\"Tests the env variable or the command line flag to filter tests.\"\"\"\n\n  # Utilities.\n\n  def AssertSetEqual(self, lhs, rhs):\n    \"\"\"Asserts that two sets are equal.\"\"\"\n\n    for elem in lhs:\n      self.assert_(elem in rhs, '%s in %s' % (elem, rhs))\n\n    for elem in rhs:\n      self.assert_(elem in lhs, '%s in %s' % (elem, lhs))\n\n  def AssertPartitionIsValid(self, set_var, list_of_sets):\n    \"\"\"Asserts that list_of_sets is a valid partition of set_var.\"\"\"\n\n    full_partition = []\n    for slice_var in list_of_sets:\n      full_partition.extend(slice_var)\n    self.assertEqual(len(set_var), len(full_partition))\n    self.assertEqual(sets.Set(set_var), sets.Set(full_partition))\n\n  def AdjustForParameterizedTests(self, tests_to_run):\n    \"\"\"Adjust tests_to_run in case value parameterized tests are disabled.\"\"\"\n\n    global param_tests_present\n    if not param_tests_present:\n      return list(sets.Set(tests_to_run) - sets.Set(PARAM_TESTS))\n    else:\n      return tests_to_run\n\n  def RunAndVerify(self, gtest_filter, tests_to_run):\n    \"\"\"Checks that the binary runs correct set of tests for a given filter.\"\"\"\n\n    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)\n\n    # First, tests using the environment variable.\n\n    # Windows removes empty variables from the environment when passing it\n    # to a new process.  This means it is impossible to pass an empty filter\n    # into a process using the environment variable.  However, we can still\n    # test the case when the variable is not supplied (i.e., gtest_filter is\n    # None).\n    # pylint: disable-msg=C6403\n    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':\n      SetEnvVar(FILTER_ENV_VAR, gtest_filter)\n      tests_run = RunAndExtractTestList()[0]\n      SetEnvVar(FILTER_ENV_VAR, None)\n      self.AssertSetEqual(tests_run, tests_to_run)\n    # pylint: enable-msg=C6403\n\n    # Next, tests using the command line flag.\n\n    if gtest_filter is None:\n      args = []\n    else:\n      args = ['--%s=%s' % (FILTER_FLAG, gtest_filter)]\n\n    tests_run = RunAndExtractTestList(args)[0]\n    self.AssertSetEqual(tests_run, tests_to_run)\n\n  def RunAndVerifyWithSharding(self, gtest_filter, total_shards, tests_to_run,\n                               args=None, check_exit_0=False):\n    \"\"\"Checks that binary runs correct tests for the given filter and shard.\n\n    Runs all shards of gtest_filter_unittest_ with the given filter, and\n    verifies that the right set of tests were run. The union of tests run\n    on each shard should be identical to tests_to_run, without duplicates.\n\n    Args:\n      gtest_filter: A filter to apply to the tests.\n      total_shards: A total number of shards to split test run into.\n      tests_to_run: A set of tests expected to run.\n      args   :      Arguments to pass to the to the test binary.\n      check_exit_0: When set to a true value, make sure that all shards\n                    return 0.\n    \"\"\"\n\n    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)\n\n    # Windows removes empty variables from the environment when passing it\n    # to a new process.  This means it is impossible to pass an empty filter\n    # into a process using the environment variable.  However, we can still\n    # test the case when the variable is not supplied (i.e., gtest_filter is\n    # None).\n    # pylint: disable-msg=C6403\n    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':\n      SetEnvVar(FILTER_ENV_VAR, gtest_filter)\n      partition = []\n      for i in range(0, total_shards):\n        (tests_run, exit_code) = RunWithSharding(total_shards, i, args)\n        if check_exit_0:\n          self.assertEqual(0, exit_code)\n        partition.append(tests_run)\n\n      self.AssertPartitionIsValid(tests_to_run, partition)\n      SetEnvVar(FILTER_ENV_VAR, None)\n    # pylint: enable-msg=C6403\n\n  def RunAndVerifyAllowingDisabled(self, gtest_filter, tests_to_run):\n    \"\"\"Checks that the binary runs correct set of tests for the given filter.\n\n    Runs gtest_filter_unittest_ with the given filter, and enables\n    disabled tests. Verifies that the right set of tests were run.\n\n    Args:\n      gtest_filter: A filter to apply to the tests.\n      tests_to_run: A set of tests expected to run.\n    \"\"\"\n\n    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)\n\n    # Construct the command line.\n    args = ['--%s' % ALSO_RUN_DISABED_TESTS_FLAG]\n    if gtest_filter is not None:\n      args.append('--%s=%s' % (FILTER_FLAG, gtest_filter))\n\n    tests_run = RunAndExtractTestList(args)[0]\n    self.AssertSetEqual(tests_run, tests_to_run)\n\n  def setUp(self):\n    \"\"\"Sets up test case.\n\n    Determines whether value-parameterized tests are enabled in the binary and\n    sets the flags accordingly.\n    \"\"\"\n\n    global param_tests_present\n    if param_tests_present is None:\n      param_tests_present = PARAM_TEST_REGEX.search(\n          RunAndReturnOutput()) is not None\n\n  def testDefaultBehavior(self):\n    \"\"\"Tests the behavior of not specifying the filter.\"\"\"\n\n    self.RunAndVerify(None, ACTIVE_TESTS)\n\n  def testDefaultBehaviorWithShards(self):\n    \"\"\"Tests the behavior without the filter, with sharding enabled.\"\"\"\n\n    self.RunAndVerifyWithSharding(None, 1, ACTIVE_TESTS)\n    self.RunAndVerifyWithSharding(None, 2, ACTIVE_TESTS)\n    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) - 1, ACTIVE_TESTS)\n    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS), ACTIVE_TESTS)\n    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) + 1, ACTIVE_TESTS)\n\n  def testEmptyFilter(self):\n    \"\"\"Tests an empty filter.\"\"\"\n\n    self.RunAndVerify('', [])\n    self.RunAndVerifyWithSharding('', 1, [])\n    self.RunAndVerifyWithSharding('', 2, [])\n\n  def testBadFilter(self):\n    \"\"\"Tests a filter that matches nothing.\"\"\"\n\n    self.RunAndVerify('BadFilter', [])\n    self.RunAndVerifyAllowingDisabled('BadFilter', [])\n\n  def testFullName(self):\n    \"\"\"Tests filtering by full name.\"\"\"\n\n    self.RunAndVerify('FooTest.Xyz', ['FooTest.Xyz'])\n    self.RunAndVerifyAllowingDisabled('FooTest.Xyz', ['FooTest.Xyz'])\n    self.RunAndVerifyWithSharding('FooTest.Xyz', 5, ['FooTest.Xyz'])\n\n  def testUniversalFilters(self):\n    \"\"\"Tests filters that match everything.\"\"\"\n\n    self.RunAndVerify('*', ACTIVE_TESTS)\n    self.RunAndVerify('*.*', ACTIVE_TESTS)\n    self.RunAndVerifyWithSharding('*.*', len(ACTIVE_TESTS) - 3, ACTIVE_TESTS)\n    self.RunAndVerifyAllowingDisabled('*', ACTIVE_TESTS + DISABLED_TESTS)\n    self.RunAndVerifyAllowingDisabled('*.*', ACTIVE_TESTS + DISABLED_TESTS)\n\n  def testFilterByTestCase(self):\n    \"\"\"Tests filtering by test case name.\"\"\"\n\n    self.RunAndVerify('FooTest.*', ['FooTest.Abc', 'FooTest.Xyz'])\n\n    BAZ_TESTS = ['BazTest.TestOne', 'BazTest.TestA', 'BazTest.TestB']\n    self.RunAndVerify('BazTest.*', BAZ_TESTS)\n    self.RunAndVerifyAllowingDisabled('BazTest.*',\n                                      BAZ_TESTS + ['BazTest.DISABLED_TestC'])\n\n  def testFilterByTest(self):\n    \"\"\"Tests filtering by test name.\"\"\"\n\n    self.RunAndVerify('*.TestOne', ['BarTest.TestOne', 'BazTest.TestOne'])\n\n  def testFilterDisabledTests(self):\n    \"\"\"Select only the disabled tests to run.\"\"\"\n\n    self.RunAndVerify('DISABLED_FoobarTest.Test1', [])\n    self.RunAndVerifyAllowingDisabled('DISABLED_FoobarTest.Test1',\n                                      ['DISABLED_FoobarTest.Test1'])\n\n    self.RunAndVerify('*DISABLED_*', [])\n    self.RunAndVerifyAllowingDisabled('*DISABLED_*', DISABLED_TESTS)\n\n    self.RunAndVerify('*.DISABLED_*', [])\n    self.RunAndVerifyAllowingDisabled('*.DISABLED_*', [\n        'BarTest.DISABLED_TestFour',\n        'BarTest.DISABLED_TestFive',\n        'BazTest.DISABLED_TestC',\n        'DISABLED_FoobarTest.DISABLED_Test2',\n        ])\n\n    self.RunAndVerify('DISABLED_*', [])\n    self.RunAndVerifyAllowingDisabled('DISABLED_*', [\n        'DISABLED_FoobarTest.Test1',\n        'DISABLED_FoobarTest.DISABLED_Test2',\n        'DISABLED_FoobarbazTest.TestA',\n        ])\n\n  def testWildcardInTestCaseName(self):\n    \"\"\"Tests using wildcard in the test case name.\"\"\"\n\n    self.RunAndVerify('*a*.*', [\n        'BarTest.TestOne',\n        'BarTest.TestTwo',\n        'BarTest.TestThree',\n\n        'BazTest.TestOne',\n        'BazTest.TestA',\n        'BazTest.TestB', ] + DEATH_TESTS + PARAM_TESTS)\n\n  def testWildcardInTestName(self):\n    \"\"\"Tests using wildcard in the test name.\"\"\"\n\n    self.RunAndVerify('*.*A*', ['FooTest.Abc', 'BazTest.TestA'])\n\n  def testFilterWithoutDot(self):\n    \"\"\"Tests a filter that has no '.' in it.\"\"\"\n\n    self.RunAndVerify('*z*', [\n        'FooTest.Xyz',\n\n        'BazTest.TestOne',\n        'BazTest.TestA',\n        'BazTest.TestB',\n        ])\n\n  def testTwoPatterns(self):\n    \"\"\"Tests filters that consist of two patterns.\"\"\"\n\n    self.RunAndVerify('Foo*.*:*A*', [\n        'FooTest.Abc',\n        'FooTest.Xyz',\n\n        'BazTest.TestA',\n        ])\n\n    # An empty pattern + a non-empty one\n    self.RunAndVerify(':*A*', ['FooTest.Abc', 'BazTest.TestA'])\n\n  def testThreePatterns(self):\n    \"\"\"Tests filters that consist of three patterns.\"\"\"\n\n    self.RunAndVerify('*oo*:*A*:*One', [\n        'FooTest.Abc',\n        'FooTest.Xyz',\n\n        'BarTest.TestOne',\n\n        'BazTest.TestOne',\n        'BazTest.TestA',\n        ])\n\n    # The 2nd pattern is empty.\n    self.RunAndVerify('*oo*::*One', [\n        'FooTest.Abc',\n        'FooTest.Xyz',\n\n        'BarTest.TestOne',\n\n        'BazTest.TestOne',\n        ])\n\n    # The last 2 patterns are empty.\n    self.RunAndVerify('*oo*::', [\n        'FooTest.Abc',\n        'FooTest.Xyz',\n        ])\n\n  def testNegativeFilters(self):\n    self.RunAndVerify('*-BazTest.TestOne', [\n        'FooTest.Abc',\n        'FooTest.Xyz',\n\n        'BarTest.TestOne',\n        'BarTest.TestTwo',\n        'BarTest.TestThree',\n\n        'BazTest.TestA',\n        'BazTest.TestB',\n        ] + DEATH_TESTS + PARAM_TESTS)\n\n    self.RunAndVerify('*-FooTest.Abc:BazTest.*', [\n        'FooTest.Xyz',\n\n        'BarTest.TestOne',\n        'BarTest.TestTwo',\n        'BarTest.TestThree',\n        ] + DEATH_TESTS + PARAM_TESTS)\n\n    self.RunAndVerify('BarTest.*-BarTest.TestOne', [\n        'BarTest.TestTwo',\n        'BarTest.TestThree',\n        ])\n\n    # Tests without leading '*'.\n    self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:BazTest.*', [\n        'BarTest.TestOne',\n        'BarTest.TestTwo',\n        'BarTest.TestThree',\n        ] + DEATH_TESTS + PARAM_TESTS)\n\n    # Value parameterized tests.\n    self.RunAndVerify('*/*', PARAM_TESTS)\n\n    # Value parameterized tests filtering by the sequence name.\n    self.RunAndVerify('SeqP/*', [\n        'SeqP/ParamTest.TestX/0',\n        'SeqP/ParamTest.TestX/1',\n        'SeqP/ParamTest.TestY/0',\n        'SeqP/ParamTest.TestY/1',\n        ])\n\n    # Value parameterized tests filtering by the test name.\n    self.RunAndVerify('*/0', [\n        'SeqP/ParamTest.TestX/0',\n        'SeqP/ParamTest.TestY/0',\n        'SeqQ/ParamTest.TestX/0',\n        'SeqQ/ParamTest.TestY/0',\n        ])\n\n  def testFlagOverridesEnvVar(self):\n    \"\"\"Tests that the filter flag overrides the filtering env. variable.\"\"\"\n\n    SetEnvVar(FILTER_ENV_VAR, 'Foo*')\n    args = ['--%s=%s' % (FILTER_FLAG, '*One')]\n    tests_run = RunAndExtractTestList(args)[0]\n    SetEnvVar(FILTER_ENV_VAR, None)\n\n    self.AssertSetEqual(tests_run, ['BarTest.TestOne', 'BazTest.TestOne'])\n\n  def testShardStatusFileIsCreated(self):\n    \"\"\"Tests that the shard file is created if specified in the environment.\"\"\"\n\n    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),\n                                     'shard_status_file')\n    self.assert_(not os.path.exists(shard_status_file))\n\n    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}\n    try:\n      InvokeWithModifiedEnv(extra_env, RunAndReturnOutput)\n    finally:\n      self.assert_(os.path.exists(shard_status_file))\n      os.remove(shard_status_file)\n\n  def testShardStatusFileIsCreatedWithListTests(self):\n    \"\"\"Tests that the shard file is created with the \"list_tests\" flag.\"\"\"\n\n    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),\n                                     'shard_status_file2')\n    self.assert_(not os.path.exists(shard_status_file))\n\n    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}\n    try:\n      output = InvokeWithModifiedEnv(extra_env,\n                                     RunAndReturnOutput,\n                                     [LIST_TESTS_FLAG])\n    finally:\n      # This assertion ensures that Google Test enumerated the tests as\n      # opposed to running them.\n      self.assert_('[==========]' not in output,\n                   'Unexpected output during test enumeration.\\n'\n                   'Please ensure that LIST_TESTS_FLAG is assigned the\\n'\n                   'correct flag value for listing Google Test tests.')\n\n      self.assert_(os.path.exists(shard_status_file))\n      os.remove(shard_status_file)\n\n  if SUPPORTS_DEATH_TESTS:\n    def testShardingWorksWithDeathTests(self):\n      \"\"\"Tests integration with death tests and sharding.\"\"\"\n\n      gtest_filter = 'HasDeathTest.*:SeqP/*'\n      expected_tests = [\n          'HasDeathTest.Test1',\n          'HasDeathTest.Test2',\n\n          'SeqP/ParamTest.TestX/0',\n          'SeqP/ParamTest.TestX/1',\n          'SeqP/ParamTest.TestY/0',\n          'SeqP/ParamTest.TestY/1',\n          ]\n\n      for flag in ['--gtest_death_test_style=threadsafe',\n                   '--gtest_death_test_style=fast']:\n        self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests,\n                                      check_exit_0=True, args=[flag])\n        self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests,\n                                      check_exit_0=True, args=[flag])\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest_.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Unit test for Google Test test filters.\n//\n// A user can specify which test(s) in a Google Test program to run via\n// either the GTEST_FILTER environment variable or the --gtest_filter\n// flag.  This is used for testing such functionality.\n//\n// The program will be invoked from a Python unit test.  Don't run it\n// directly.\n\n#include <gtest/gtest.h>\n\nnamespace {\n\n// Test case FooTest.\n\nclass FooTest : public testing::Test {\n};\n\nTEST_F(FooTest, Abc) {\n}\n\nTEST_F(FooTest, Xyz) {\n  FAIL() << \"Expected failure.\";\n}\n\n// Test case BarTest.\n\nTEST(BarTest, TestOne) {\n}\n\nTEST(BarTest, TestTwo) {\n}\n\nTEST(BarTest, TestThree) {\n}\n\nTEST(BarTest, DISABLED_TestFour) {\n  FAIL() << \"Expected failure.\";\n}\n\nTEST(BarTest, DISABLED_TestFive) {\n  FAIL() << \"Expected failure.\";\n}\n\n// Test case BazTest.\n\nTEST(BazTest, TestOne) {\n  FAIL() << \"Expected failure.\";\n}\n\nTEST(BazTest, TestA) {\n}\n\nTEST(BazTest, TestB) {\n}\n\nTEST(BazTest, DISABLED_TestC) {\n  FAIL() << \"Expected failure.\";\n}\n\n// Test case HasDeathTest\n\nTEST(HasDeathTest, Test1) {\n  EXPECT_DEATH_IF_SUPPORTED(exit(1), \".*\");\n}\n\n// We need at least two death tests to make sure that the all death tests\n// aren't on the first shard.\nTEST(HasDeathTest, Test2) {\n  EXPECT_DEATH_IF_SUPPORTED(exit(1), \".*\");\n}\n\n// Test case FoobarTest\n\nTEST(DISABLED_FoobarTest, Test1) {\n  FAIL() << \"Expected failure.\";\n}\n\nTEST(DISABLED_FoobarTest, DISABLED_Test2) {\n  FAIL() << \"Expected failure.\";\n}\n\n// Test case FoobarbazTest\n\nTEST(DISABLED_FoobarbazTest, TestA) {\n  FAIL() << \"Expected failure.\";\n}\n\n#if GTEST_HAS_PARAM_TEST\nclass ParamTest : public testing::TestWithParam<int> {\n};\n\nTEST_P(ParamTest, TestX) {\n}\n\nTEST_P(ParamTest, TestY) {\n}\n\nINSTANTIATE_TEST_CASE_P(SeqP, ParamTest, testing::Values(1, 2));\nINSTANTIATE_TEST_CASE_P(SeqQ, ParamTest, testing::Values(5, 6));\n#endif  // GTEST_HAS_PARAM_TEST\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  ::testing::InitGoogleTest(&argc, argv);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Tests the --help flag of Google C++ Testing Framework.\n\nSYNOPSIS\n       gtest_help_test.py --gtest_build_dir=BUILD/DIR\n         # where BUILD/DIR contains the built gtest_help_test_ file.\n       gtest_help_test.py\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport re\nimport gtest_test_utils\n\n\nIS_WINDOWS = os.name == 'nt'\n\nPROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_help_test_')\nFLAG_PREFIX = '--gtest_'\nCATCH_EXCEPTIONS_FLAG = FLAG_PREFIX + 'catch_exceptions'\nDEATH_TEST_STYLE_FLAG = FLAG_PREFIX + 'death_test_style'\nUNKNOWN_FLAG = FLAG_PREFIX + 'unknown_flag_for_testing'\nLIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'\nINCORRECT_FLAG_VARIANTS = [re.sub('^--', '-', LIST_TESTS_FLAG),\n                           re.sub('^--', '/', LIST_TESTS_FLAG),\n                           re.sub('_', '-', LIST_TESTS_FLAG)]\nINTERNAL_FLAG_FOR_TESTING = FLAG_PREFIX + 'internal_flag_for_testing'\n\nSUPPORTS_DEATH_TESTS = \"DeathTest\" in gtest_test_utils.Subprocess(\n    [PROGRAM_PATH, LIST_TESTS_FLAG]).output\n\n# The help message must match this regex.\nHELP_REGEX = re.compile(\n    FLAG_PREFIX + r'list_tests.*' +\n    FLAG_PREFIX + r'filter=.*' +\n    FLAG_PREFIX + r'also_run_disabled_tests.*' +\n    FLAG_PREFIX + r'repeat=.*' +\n    FLAG_PREFIX + r'shuffle.*' +\n    FLAG_PREFIX + r'random_seed=.*' +\n    FLAG_PREFIX + r'color=.*' +\n    FLAG_PREFIX + r'print_time.*' +\n    FLAG_PREFIX + r'output=.*' +\n    FLAG_PREFIX + r'break_on_failure.*' +\n    FLAG_PREFIX + r'throw_on_failure.*',\n    re.DOTALL)\n\n\ndef RunWithFlag(flag):\n  \"\"\"Runs gtest_help_test_ with the given flag.\n\n  Returns:\n    the exit code and the text output as a tuple.\n  Args:\n    flag: the command-line flag to pass to gtest_help_test_, or None.\n  \"\"\"\n\n  if flag is None:\n    command = [PROGRAM_PATH]\n  else:\n    command = [PROGRAM_PATH, flag]\n  child = gtest_test_utils.Subprocess(command)\n  return child.exit_code, child.output\n\n\nclass GTestHelpTest(gtest_test_utils.TestCase):\n  \"\"\"Tests the --help flag and its equivalent forms.\"\"\"\n\n  def TestHelpFlag(self, flag):\n    \"\"\"Verifies correct behavior when help flag is specified.\n\n    The right message must be printed and the tests must\n    skipped when the given flag is specified.\n\n    Args:\n      flag:  A flag to pass to the binary or None.\n    \"\"\"\n\n    exit_code, output = RunWithFlag(flag)\n    self.assertEquals(0, exit_code)\n    self.assert_(HELP_REGEX.search(output), output)\n    if IS_WINDOWS:\n      self.assert_(CATCH_EXCEPTIONS_FLAG in output, output)\n    else:\n      self.assert_(CATCH_EXCEPTIONS_FLAG not in output, output)\n\n    if SUPPORTS_DEATH_TESTS and not IS_WINDOWS:\n      self.assert_(DEATH_TEST_STYLE_FLAG in output, output)\n    else:\n      self.assert_(DEATH_TEST_STYLE_FLAG not in output, output)\n\n  def TestNonHelpFlag(self, flag):\n    \"\"\"Verifies correct behavior when no help flag is specified.\n\n    Verifies that when no help flag is specified, the tests are run\n    and the help message is not printed.\n\n    Args:\n      flag:  A flag to pass to the binary or None.\n    \"\"\"\n\n    exit_code, output = RunWithFlag(flag)\n    self.assert_(exit_code != 0)\n    self.assert_(not HELP_REGEX.search(output), output)\n\n  def testPrintsHelpWithFullFlag(self):\n    self.TestHelpFlag('--help')\n\n  def testPrintsHelpWithShortFlag(self):\n    self.TestHelpFlag('-h')\n\n  def testPrintsHelpWithQuestionFlag(self):\n    self.TestHelpFlag('-?')\n\n  def testPrintsHelpWithWindowsStyleQuestionFlag(self):\n    self.TestHelpFlag('/?')\n\n  def testPrintsHelpWithUnrecognizedGoogleTestFlag(self):\n    self.TestHelpFlag(UNKNOWN_FLAG)\n\n  def testPrintsHelpWithIncorrectFlagStyle(self):\n    for incorrect_flag in INCORRECT_FLAG_VARIANTS:\n      self.TestHelpFlag(incorrect_flag)\n\n  def testRunsTestsWithoutHelpFlag(self):\n    \"\"\"Verifies that when no help flag is specified, the tests are run\n    and the help message is not printed.\"\"\"\n\n    self.TestNonHelpFlag(None)\n\n  def testRunsTestsWithGtestInternalFlag(self):\n    \"\"\"Verifies that the tests are run and no help message is printed when\n    a flag starting with Google Test prefix and 'internal_' is supplied.\"\"\"\n\n    self.TestNonHelpFlag(INTERNAL_FLAG_FOR_TESTING)\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test_.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// This program is meant to be run by gtest_help_test.py.  Do not run\n// it directly.\n\n#include <gtest/gtest.h>\n\n// When a help flag is specified, this program should skip the tests\n// and exit with 0; otherwise the following test will be executed,\n// causing this program to exit with a non-zero code.\nTEST(HelpFlagTest, ShouldNotBeRun) {\n  ASSERT_TRUE(false) << \"Tests shouldn't be run when --help is specified.\";\n}\n\n#if GTEST_HAS_DEATH_TEST\nTEST(DeathTest, UsedByPythonScriptToDetectSupportForDeathTestsInThisBinary) {}\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test for Google Test's --gtest_list_tests flag.\n\nA user can ask Google Test to list all tests by specifying the\n--gtest_list_tests flag.  This script tests such functionality\nby invoking gtest_list_tests_unittest_ (a program written with\nGoogle Test) the command line flags.\n\"\"\"\n\n__author__ = 'phanna@google.com (Patrick Hanna)'\n\nimport gtest_test_utils\n\n\n# Constants.\n\n# The command line flag for enabling/disabling listing all tests.\nLIST_TESTS_FLAG = 'gtest_list_tests'\n\n# Path to the gtest_list_tests_unittest_ program.\nEXE_PATH = gtest_test_utils.GetTestExecutablePath('gtest_list_tests_unittest_')\n\n# The expected output when running gtest_list_tests_unittest_ with\n# --gtest_list_tests\nEXPECTED_OUTPUT_NO_FILTER = \"\"\"FooDeathTest.\n  Test1\nFoo.\n  Bar1\n  Bar2\n  DISABLED_Bar3\nAbc.\n  Xyz\n  Def\nFooBar.\n  Baz\nFooTest.\n  Test1\n  DISABLED_Test2\n  Test3\n\"\"\"\n\n# The expected output when running gtest_list_tests_unittest_ with\n# --gtest_list_tests and --gtest_filter=Foo*.\nEXPECTED_OUTPUT_FILTER_FOO = \"\"\"FooDeathTest.\n  Test1\nFoo.\n  Bar1\n  Bar2\n  DISABLED_Bar3\nFooBar.\n  Baz\nFooTest.\n  Test1\n  DISABLED_Test2\n  Test3\n\"\"\"\n\n# Utilities.\n\n\ndef Run(args):\n  \"\"\"Runs gtest_list_tests_unittest_ and returns the list of tests printed.\"\"\"\n\n  return gtest_test_utils.Subprocess([EXE_PATH] + args,\n                                     capture_stderr=False).output\n\n\n# The unit test.\n\nclass GTestListTestsUnitTest(gtest_test_utils.TestCase):\n  \"\"\"Tests using the --gtest_list_tests flag to list all tests.\"\"\"\n\n  def RunAndVerify(self, flag_value, expected_output, other_flag):\n    \"\"\"Runs gtest_list_tests_unittest_ and verifies that it prints\n    the correct tests.\n\n    Args:\n      flag_value:       value of the --gtest_list_tests flag;\n                        None if the flag should not be present.\n\n      expected_output:  the expected output after running command;\n\n      other_flag:       a different flag to be passed to command\n                        along with gtest_list_tests;\n                        None if the flag should not be present.\n    \"\"\"\n\n    if flag_value is None:\n      flag = ''\n      flag_expression = 'not set'\n    elif flag_value == '0':\n      flag = '--%s=0' % LIST_TESTS_FLAG\n      flag_expression = '0'\n    else:\n      flag = '--%s' % LIST_TESTS_FLAG\n      flag_expression = '1'\n\n    args = [flag]\n\n    if other_flag is not None:\n      args += [other_flag]\n\n    output = Run(args)\n\n    msg = ('when %s is %s, the output of \"%s\" is \"%s\".' %\n           (LIST_TESTS_FLAG, flag_expression, ' '.join(args), output))\n\n    if expected_output is not None:\n      self.assert_(output == expected_output, msg)\n    else:\n      self.assert_(output != EXPECTED_OUTPUT_NO_FILTER, msg)\n\n  def testDefaultBehavior(self):\n    \"\"\"Tests the behavior of the default mode.\"\"\"\n\n    self.RunAndVerify(flag_value=None,\n                      expected_output=None,\n                      other_flag=None)\n\n  def testFlag(self):\n    \"\"\"Tests using the --gtest_list_tests flag.\"\"\"\n\n    self.RunAndVerify(flag_value='0',\n                      expected_output=None,\n                      other_flag=None)\n    self.RunAndVerify(flag_value='1',\n                      expected_output=EXPECTED_OUTPUT_NO_FILTER,\n                      other_flag=None)\n\n  def testOverrideNonFilterFlags(self):\n    \"\"\"Tests that --gtest_list_tests overrides the non-filter flags.\"\"\"\n\n    self.RunAndVerify(flag_value='1',\n                      expected_output=EXPECTED_OUTPUT_NO_FILTER,\n                      other_flag='--gtest_break_on_failure')\n\n  def testWithFilterFlags(self):\n    \"\"\"Tests that --gtest_list_tests takes into account the\n    --gtest_filter flag.\"\"\"\n\n    self.RunAndVerify(flag_value='1',\n                      expected_output=EXPECTED_OUTPUT_FILTER_FOO,\n                      other_flag='--gtest_filter=Foo*')\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest_.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: phanna@google.com (Patrick Hanna)\n\n// Unit test for Google Test's --gtest_list_tests flag.\n//\n// A user can ask Google Test to list all tests that will run\n// so that when using a filter, a user will know what\n// tests to look for. The tests will not be run after listing.\n//\n// This program will be invoked from a Python unit test.\n// Don't run it directly.\n\n#include <gtest/gtest.h>\n\nnamespace {\n\n// Several different test cases and tests that will be listed.\nTEST(Foo, Bar1) {\n}\n\nTEST(Foo, Bar2) {\n}\n\nTEST(Foo, DISABLED_Bar3) {\n}\n\nTEST(Abc, Xyz) {\n}\n\nTEST(Abc, Def) {\n}\n\nTEST(FooBar, Baz) {\n}\n\nclass FooTest : public testing::Test {\n};\n\nTEST_F(FooTest, Test1) {\n}\n\nTEST_F(FooTest, DISABLED_Test2) {\n}\n\nTEST_F(FooTest, Test3) {\n}\n\nTEST(FooDeathTest, Test1) {\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  ::testing::InitGoogleTest(&argc, argv);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_main_unittest.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#include <gtest/gtest.h>\n\n// Tests that we don't have to define main() when we link to\n// gtest_main instead of gtest.\n\nnamespace {\n\nTEST(GTestMainTest, ShouldSucceed) {\n}\n\n}  // namespace\n\n// We are using the main() function defined in src/gtest_main.cc, so\n// we don't define it here.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// This file is the input to a negative-compilation test for Google\n// Test.  Code here is NOT supposed to compile.  Its purpose is to\n// verify that certain incorrect usages of the Google Test API are\n// indeed rejected by the compiler.\n//\n// We still need to write the negative-compilation test itself, which\n// will be tightly coupled with the build environment.\n//\n// TODO(wan@google.com): finish the negative-compilation test.\n\n#ifdef TEST_CANNOT_IGNORE_RUN_ALL_TESTS_RESULT\n// Tests that the result of RUN_ALL_TESTS() cannot be ignored.\n\n#include <gtest/gtest.h>\n\nint main(int argc, char** argv) {\n  testing::InitGoogleTest(&argc, argv);\n  RUN_ALL_TESTS();  // This line shouldn't compile.\n}\n\n#elif defined(TEST_USER_CANNOT_INCLUDE_GTEST_INTERNAL_INL_H)\n// Tests that a user cannot include gtest-internal-inl.h in his code.\n\n#include \"src/gtest-internal-inl.h\"\n\n#elif defined(TEST_CATCHES_DECLARING_SETUP_IN_TEST_FIXTURE_WITH_TYPO)\n// Tests that the compiler catches the typo when a user declares a\n// Setup() method in a test fixture.\n\n#include <gtest/gtest.h>\n\nclass MyTest : public testing::Test {\n protected:\n  void Setup() {}\n};\n\n#elif defined(TEST_CATCHES_CALLING_SETUP_IN_TEST_WITH_TYPO)\n// Tests that the compiler catches the typo when a user calls Setup()\n// from a test fixture.\n\n#include <gtest/gtest.h>\n\nclass MyTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    testing::Test::Setup();  // Tries to call SetUp() in the parent class.\n  }\n};\n\n#elif defined(TEST_CATCHES_DECLARING_SETUP_IN_ENVIRONMENT_WITH_TYPO)\n// Tests that the compiler catches the typo when a user declares a\n// Setup() method in a subclass of Environment.\n\n#include <gtest/gtest.h>\n\nclass MyEnvironment : public testing::Environment {\n public:\n  void Setup() {}\n};\n\n#elif defined(TEST_CATCHES_CALLING_SETUP_IN_ENVIRONMENT_WITH_TYPO)\n// Tests that the compiler catches the typo when a user calls Setup()\n// in an Environment.\n\n#include <gtest/gtest.h>\n\nclass MyEnvironment : public testing::Environment {\n protected:\n  virtual void SetUp() {\n    // Tries to call SetUp() in the parent class.\n    testing::Environment::Setup();\n  }\n};\n\n#elif defined(TEST_CATCHES_WRONG_CASE_IN_TYPED_TEST_P)\n// Tests that the compiler catches using the wrong test case name in\n// TYPED_TEST_P.\n\n#include <gtest/gtest.h>\n\ntemplate <typename T>\nclass FooTest : public testing::Test {\n};\n\ntemplate <typename T>\nclass BarTest : public testing::Test {\n};\n\nTYPED_TEST_CASE_P(FooTest);\nTYPED_TEST_P(BarTest, A) {}  // Wrong test case name.\nREGISTER_TYPED_TEST_CASE_P(FooTest, A);\nINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, testing::Types<int>);\n\n#elif defined(TEST_CATCHES_WRONG_CASE_IN_REGISTER_TYPED_TEST_CASE_P)\n// Tests that the compiler catches using the wrong test case name in\n// REGISTER_TYPED_TEST_CASE_P.\n\n#include <gtest/gtest.h>\n\ntemplate <typename T>\nclass FooTest : public testing::Test {\n};\n\ntemplate <typename T>\nclass BarTest : public testing::Test {\n};\n\nTYPED_TEST_CASE_P(FooTest);\nTYPED_TEST_P(FooTest, A) {}\nREGISTER_TYPED_TEST_CASE_P(BarTest, A);  // Wrong test case name.\nINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, testing::Types<int>);\n\n#elif defined(TEST_CATCHES_WRONG_CASE_IN_INSTANTIATE_TYPED_TEST_CASE_P)\n// Tests that the compiler catches using the wrong test case name in\n// INSTANTIATE_TYPED_TEST_CASE_P.\n\n#include <gtest/gtest.h>\n\ntemplate <typename T>\nclass FooTest : public testing::Test {\n};\n\ntemplate <typename T>\nclass BarTest : public testing::Test {\n};\n\nTYPED_TEST_CASE_P(FooTest);\nTYPED_TEST_P(FooTest, A) {}\nREGISTER_TYPED_TEST_CASE_P(FooTest, A);\n\n// Wrong test case name.\nINSTANTIATE_TYPED_TEST_CASE_P(My, BarTest, testing::Types<int>);\n\n#elif defined(TEST_CATCHES_INSTANTIATE_TYPED_TESET_CASE_P_WITH_SAME_NAME_PREFIX)\n// Tests that the compiler catches instantiating TYPED_TEST_CASE_P\n// twice with the same name prefix.\n\n#include <gtest/gtest.h>\n\ntemplate <typename T>\nclass FooTest : public testing::Test {\n};\n\nTYPED_TEST_CASE_P(FooTest);\nTYPED_TEST_P(FooTest, A) {}\nREGISTER_TYPED_TEST_CASE_P(FooTest, A);\n\nINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, testing::Types<int>);\n\n// Wrong name prefix: \"My\" has been used.\nINSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, testing::Types<double>);\n\n#elif defined(TEST_STATIC_ASSERT_TYPE_EQ_IS_NOT_A_TYPE)\n\n#include <gtest/gtest.h>\n\n// Tests that StaticAssertTypeEq<T1, T2> cannot be used as a type.\ntesting::StaticAssertTypeEq<int, int> dummy;\n\n#elif defined(TEST_STATIC_ASSERT_TYPE_EQ_WORKS_IN_NAMESPACE)\n\n#include <gtest/gtest.h>\n\n// Tests that StaticAssertTypeEq<T1, T2> works in a namespace scope.\nstatic bool dummy = testing::StaticAssertTypeEq<int, const int>();\n\n#elif defined(TEST_STATIC_ASSERT_TYPE_EQ_WORKS_IN_CLASS)\n\n#include <gtest/gtest.h>\n\ntemplate <typename T>\nclass Helper {\n public:\n  // Tests that StaticAssertTypeEq<T1, T2> works in a class.\n  Helper() { testing::StaticAssertTypeEq<int, T>(); }\n\n  void DoSomething() {}\n};\n\nvoid Test() {\n  Helper<bool> h;\n  h.DoSomething();  // To avoid the \"unused variable\" warning.\n}\n\n#elif defined(TEST_STATIC_ASSERT_TYPE_EQ_WORKS_IN_FUNCTION)\n\n#include <gtest/gtest.h>\n\nvoid Test() {\n  // Tests that StaticAssertTypeEq<T1, T2> works inside a function.\n  testing::StaticAssertTypeEq<const int, int>();\n}\n\n#else\n// A sanity test.  This should compile.\n\n#include <gtest/gtest.h>\n\nint main() {\n  return RUN_ALL_TESTS();\n}\n\n#endif\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2007, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Negative compilation test for Google Test.\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport sys\nimport unittest\n\n\nIS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'\nif not IS_LINUX:\n  sys.exit(0)  # Negative compilation tests are not supported on Windows & Mac.\n\n\nclass GTestNCTest(unittest.TestCase):\n  \"\"\"Negative compilation test for Google Test.\"\"\"\n\n  def testCompilerError(self):\n    \"\"\"Verifies that erroneous code leads to expected compiler\n    messages.\"\"\"\n\n    # Defines a list of test specs, where each element is a tuple\n    # (test name, list of regexes for matching the compiler errors).\n    test_specs = [\n      ('CANNOT_IGNORE_RUN_ALL_TESTS_RESULT',\n       [r'ignoring return value']),\n\n      ('USER_CANNOT_INCLUDE_GTEST_INTERNAL_INL_H',\n       [r'must not be included except by Google Test itself']),\n\n      ('CATCHES_DECLARING_SETUP_IN_TEST_FIXTURE_WITH_TYPO',\n       [r'Setup_should_be_spelled_SetUp']),\n\n      ('CATCHES_CALLING_SETUP_IN_TEST_WITH_TYPO',\n       [r'Setup_should_be_spelled_SetUp']),\n\n      ('CATCHES_DECLARING_SETUP_IN_ENVIRONMENT_WITH_TYPO',\n       [r'Setup_should_be_spelled_SetUp']),\n\n      ('CATCHES_CALLING_SETUP_IN_ENVIRONMENT_WITH_TYPO',\n       [r'Setup_should_be_spelled_SetUp']),\n\n      ('CATCHES_WRONG_CASE_IN_TYPED_TEST_P',\n       [r'BarTest.*was not declared']),\n\n      ('CATCHES_WRONG_CASE_IN_REGISTER_TYPED_TEST_CASE_P',\n       [r'BarTest.*was not declared']),\n\n      ('CATCHES_WRONG_CASE_IN_INSTANTIATE_TYPED_TEST_CASE_P',\n       [r'BarTest.*not declared']),\n\n      ('CATCHES_INSTANTIATE_TYPED_TESET_CASE_P_WITH_SAME_NAME_PREFIX',\n       [r'redefinition of.*My.*FooTest']),\n\n      ('STATIC_ASSERT_TYPE_EQ_IS_NOT_A_TYPE',\n       [r'StaticAssertTypeEq.* does not name a type']),\n\n      ('STATIC_ASSERT_TYPE_EQ_WORKS_IN_NAMESPACE',\n       [r'StaticAssertTypeEq.*int.*const int']),\n\n      ('STATIC_ASSERT_TYPE_EQ_WORKS_IN_CLASS',\n       [r'StaticAssertTypeEq.*int.*bool']),\n\n      ('STATIC_ASSERT_TYPE_EQ_WORKS_IN_FUNCTION',\n       [r'StaticAssertTypeEq.*const int.*int']),\n\n      ('SANITY',\n       None)\n      ]\n\n    # TODO(wan@google.com): verify that the test specs are satisfied.\n\n\nif __name__ == '__main__':\n  unittest.main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_no_test_unittest.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Tests that a Google Test program that has no test defined can run\n// successfully.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#include <gtest/gtest.h>\n\n\nint main(int argc, char **argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  // An ad-hoc assertion outside of all tests.\n  //\n  // This serves two purposes:\n  //\n  // 1. It verifies that an ad-hoc assertion can be executed even if\n  //    no test is defined.\n  // 2. We had a bug where the XML output won't be generated if an\n  //    assertion is executed before RUN_ALL_TESTS() is called, even\n  //    though --gtest_output=xml is specified.  This makes sure the\n  //    bug is fixed and doesn't regress.\n  EXPECT_EQ(1, 1);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Tests the text output of Google C++ Testing Framework.\n\nSYNOPSIS\n       gtest_output_test.py --gtest_build_dir=BUILD/DIR --gengolden\n         # where BUILD/DIR contains the built gtest_output_test_ file.\n       gtest_output_test.py --gengolden\n       gtest_output_test.py\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport re\nimport sys\nimport gtest_test_utils\n\n\n# The flag for generating the golden file\nGENGOLDEN_FLAG = '--gengolden'\nCATCH_EXCEPTIONS_ENV_VAR_NAME = 'GTEST_CATCH_EXCEPTIONS'\n\nIS_WINDOWS = os.name == 'nt'\n\nif IS_WINDOWS:\n  GOLDEN_NAME = 'gtest_output_test_golden_win.txt'\nelse:\n  GOLDEN_NAME = 'gtest_output_test_golden_lin.txt'\n\nPROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_output_test_')\n\n# At least one command we exercise must not have the\n# --gtest_internal_skip_environment_and_ad_hoc_tests flag.\nCOMMAND_LIST_TESTS = ({}, [PROGRAM_PATH, '--gtest_list_tests'])\nCOMMAND_WITH_COLOR = ({}, [PROGRAM_PATH, '--gtest_color=yes'])\nCOMMAND_WITH_TIME = ({}, [PROGRAM_PATH,\n                          '--gtest_print_time',\n                          '--gtest_internal_skip_environment_and_ad_hoc_tests',\n                          '--gtest_filter=FatalFailureTest.*:LoggingTest.*'])\nCOMMAND_WITH_DISABLED = (\n    {}, [PROGRAM_PATH,\n         '--gtest_also_run_disabled_tests',\n         '--gtest_internal_skip_environment_and_ad_hoc_tests',\n         '--gtest_filter=*DISABLED_*'])\nCOMMAND_WITH_SHARDING = (\n    {'GTEST_SHARD_INDEX': '1', 'GTEST_TOTAL_SHARDS': '2'},\n    [PROGRAM_PATH,\n     '--gtest_internal_skip_environment_and_ad_hoc_tests',\n     '--gtest_filter=PassingTest.*'])\n\nGOLDEN_PATH = os.path.join(gtest_test_utils.GetSourceDir(), GOLDEN_NAME)\n\n\ndef ToUnixLineEnding(s):\n  \"\"\"Changes all Windows/Mac line endings in s to UNIX line endings.\"\"\"\n\n  return s.replace('\\r\\n', '\\n').replace('\\r', '\\n')\n\n\ndef RemoveLocations(test_output):\n  \"\"\"Removes all file location info from a Google Test program's output.\n\n  Args:\n       test_output:  the output of a Google Test program.\n\n  Returns:\n       output with all file location info (in the form of\n       'DIRECTORY/FILE_NAME:LINE_NUMBER: 'or\n       'DIRECTORY\\\\FILE_NAME(LINE_NUMBER): ') replaced by\n       'FILE_NAME:#: '.\n  \"\"\"\n\n  return re.sub(r'.*[/\\\\](.+)(\\:\\d+|\\(\\d+\\))\\: ', r'\\1:#: ', test_output)\n\n\ndef RemoveStackTraceDetails(output):\n  \"\"\"Removes all stack traces from a Google Test program's output.\"\"\"\n\n  # *? means \"find the shortest string that matches\".\n  return re.sub(r'Stack trace:(.|\\n)*?\\n\\n',\n                'Stack trace: (omitted)\\n\\n', output)\n\n\ndef RemoveStackTraces(output):\n  \"\"\"Removes all traces of stack traces from a Google Test program's output.\"\"\"\n\n  # *? means \"find the shortest string that matches\".\n  return re.sub(r'Stack trace:(.|\\n)*?\\n\\n', '', output)\n\n\ndef RemoveTime(output):\n  \"\"\"Removes all time information from a Google Test program's output.\"\"\"\n\n  return re.sub(r'\\(\\d+ ms', '(? ms', output)\n\n\ndef RemoveTypeInfoDetails(test_output):\n  \"\"\"Removes compiler-specific type info from Google Test program's output.\n\n  Args:\n       test_output:  the output of a Google Test program.\n\n  Returns:\n       output with type information normalized to canonical form.\n  \"\"\"\n\n  # some compilers output the name of type 'unsigned int' as 'unsigned'\n  return re.sub(r'unsigned int', 'unsigned', test_output)\n\n\ndef RemoveTestCounts(output):\n  \"\"\"Removes test counts from a Google Test program's output.\"\"\"\n\n  output = re.sub(r'\\d+ tests?, listed below',\n                  '? tests, listed below', output)\n  output = re.sub(r'\\d+ FAILED TESTS',\n                  '? FAILED TESTS', output)\n  output = re.sub(r'\\d+ tests? from \\d+ test cases?',\n                  '? tests from ? test cases', output)\n  output = re.sub(r'\\d+ tests? from ([a-zA-Z_])',\n                  r'? tests from \\1', output)\n  return re.sub(r'\\d+ tests?\\.', '? tests.', output)\n\n\ndef RemoveMatchingTests(test_output, pattern):\n  \"\"\"Removes output of specified tests from a Google Test program's output.\n\n  This function strips not only the beginning and the end of a test but also\n  all output in between.\n\n  Args:\n    test_output:       A string containing the test output.\n    pattern:           A regex string that matches names of test cases or\n                       tests to remove.\n\n  Returns:\n    Contents of test_output with tests whose names match pattern removed.\n  \"\"\"\n\n  test_output = re.sub(\n      r'.*\\[ RUN      \\] .*%s(.|\\n)*?\\[(  FAILED  |       OK )\\] .*%s.*\\n' % (\n          pattern, pattern),\n      '',\n      test_output)\n  return re.sub(r'.*%s.*\\n' % pattern, '', test_output)\n\n\ndef NormalizeOutput(output):\n  \"\"\"Normalizes output (the output of gtest_output_test_.exe).\"\"\"\n\n  output = ToUnixLineEnding(output)\n  output = RemoveLocations(output)\n  output = RemoveStackTraceDetails(output)\n  output = RemoveTime(output)\n  return output\n\n\ndef GetShellCommandOutput(env_cmd):\n  \"\"\"Runs a command in a sub-process, and returns its output in a string.\n\n  Args:\n    env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra\n             environment variables to set, and element 1 is a string with\n             the command and any flags.\n\n  Returns:\n    A string with the command's combined standard and diagnostic output.\n  \"\"\"\n\n  # Spawns cmd in a sub-process, and gets its standard I/O file objects.\n  # Set and save the environment properly.\n  environ = os.environ.copy()\n  environ.update(env_cmd[0])\n  p = gtest_test_utils.Subprocess(env_cmd[1], env=environ)\n\n  return p.output\n\n\ndef GetCommandOutput(env_cmd):\n  \"\"\"Runs a command and returns its output with all file location\n  info stripped off.\n\n  Args:\n    env_cmd:  The shell command. A 2-tuple where element 0 is a dict of extra\n              environment variables to set, and element 1 is a string with\n              the command and any flags.\n  \"\"\"\n\n  # Disables exception pop-ups on Windows.\n  environ, cmdline = env_cmd\n  environ = dict(environ)  # Ensures we are modifying a copy.\n  environ[CATCH_EXCEPTIONS_ENV_VAR_NAME] = '1'\n  return NormalizeOutput(GetShellCommandOutput((environ, cmdline)))\n\n\ndef GetOutputOfAllCommands():\n  \"\"\"Returns concatenated output from several representative commands.\"\"\"\n\n  return (GetCommandOutput(COMMAND_WITH_COLOR) +\n          GetCommandOutput(COMMAND_WITH_TIME) +\n          GetCommandOutput(COMMAND_WITH_DISABLED) +\n          GetCommandOutput(COMMAND_WITH_SHARDING))\n\n\ntest_list = GetShellCommandOutput(COMMAND_LIST_TESTS)\nSUPPORTS_DEATH_TESTS = 'DeathTest' in test_list\nSUPPORTS_TYPED_TESTS = 'TypedTest' in test_list\nSUPPORTS_THREADS = 'ExpectFailureWithThreadsTest' in test_list\nSUPPORTS_STACK_TRACES = False\n\nCAN_GENERATE_GOLDEN_FILE = (SUPPORTS_DEATH_TESTS and\n                            SUPPORTS_TYPED_TESTS and\n                            SUPPORTS_THREADS)\n\n\nclass GTestOutputTest(gtest_test_utils.TestCase):\n  def RemoveUnsupportedTests(self, test_output):\n    if not SUPPORTS_DEATH_TESTS:\n      test_output = RemoveMatchingTests(test_output, 'DeathTest')\n    if not SUPPORTS_TYPED_TESTS:\n      test_output = RemoveMatchingTests(test_output, 'TypedTest')\n      test_output = RemoveMatchingTests(test_output, 'TypedDeathTest')\n      test_output = RemoveMatchingTests(test_output, 'TypeParamDeathTest')\n    if not SUPPORTS_THREADS:\n      test_output = RemoveMatchingTests(test_output,\n                                        'ExpectFailureWithThreadsTest')\n      test_output = RemoveMatchingTests(test_output,\n                                        'ScopedFakeTestPartResultReporterTest')\n      test_output = RemoveMatchingTests(test_output,\n                                        'WorksConcurrently')\n    if not SUPPORTS_STACK_TRACES:\n      test_output = RemoveStackTraces(test_output)\n\n    return test_output\n\n  def testOutput(self):\n    output = GetOutputOfAllCommands()\n\n    golden_file = open(GOLDEN_PATH, 'rb')\n    # A mis-configured source control system can cause \\r appear in EOL\n    # sequences when we read the golden file irrespective of an operating\n    # system used. Therefore, we need to strip those \\r's from newlines\n    # unconditionally.\n    golden = ToUnixLineEnding(golden_file.read())\n    golden_file.close()\n\n    # We want the test to pass regardless of certain features being\n    # supported or not.\n\n    # We still have to remove type name specifics in all cases.\n    normalized_actual = RemoveTypeInfoDetails(output)\n    normalized_golden = RemoveTypeInfoDetails(golden)\n\n    if CAN_GENERATE_GOLDEN_FILE:\n      self.assertEqual(normalized_golden, normalized_actual)\n    else:\n      normalized_actual = RemoveTestCounts(normalized_actual)\n      normalized_golden = RemoveTestCounts(self.RemoveUnsupportedTests(\n          normalized_golden))\n\n      # This code is very handy when debugging golden file differences:\n      if os.getenv('DEBUG_GTEST_OUTPUT_TEST'):\n        open(os.path.join(\n            gtest_test_utils.GetSourceDir(),\n            '_gtest_output_test_normalized_actual.txt'), 'wb').write(\n                normalized_actual)\n        open(os.path.join(\n            gtest_test_utils.GetSourceDir(),\n            '_gtest_output_test_normalized_golden.txt'), 'wb').write(\n                normalized_golden)\n\n      self.assertEqual(normalized_golden, normalized_actual)\n\n\nif __name__ == '__main__':\n  if sys.argv[1:] == [GENGOLDEN_FLAG]:\n    if CAN_GENERATE_GOLDEN_FILE:\n      output = GetOutputOfAllCommands()\n      golden_file = open(GOLDEN_PATH, 'wb')\n      golden_file.write(output)\n      golden_file.close()\n    else:\n      message = (\n          \"\"\"Unable to write a golden file when compiled in an environment\nthat does not support all the required features (death tests\"\"\")\n      if IS_WINDOWS:\n        message += (\n            \"\"\"\\nand typed tests). Please check that you are using VC++ 8.0 SP1\nor higher as your compiler.\"\"\")\n      else:\n        message += \"\"\"\\ntyped tests, and threads).  Please generate the\ngolden file using a binary built with those features enabled.\"\"\"\n\n      sys.stderr.write(message)\n      sys.exit(1)\n  else:\n    gtest_test_utils.Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// A unit test for Google Test itself.  This verifies that the basic\n// constructs of Google Test work.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#include <gtest/gtest-spi.h>\n#include <gtest/gtest.h>\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\n#include <stdlib.h>\n\n#if GTEST_IS_THREADSAFE\nusing testing::ScopedFakeTestPartResultReporter;\nusing testing::TestPartResultArray;\n\nusing testing::internal::Notification;\nusing testing::internal::ThreadWithParam;\n#endif\n\nnamespace posix = ::testing::internal::posix;\nusing testing::internal::String;\nusing testing::internal::scoped_ptr;\n\n// Tests catching fatal failures.\n\n// A subroutine used by the following test.\nvoid TestEq1(int x) {\n  ASSERT_EQ(1, x);\n}\n\n// This function calls a test subroutine, catches the fatal failure it\n// generates, and then returns early.\nvoid TryTestSubroutine() {\n  // Calls a subrountine that yields a fatal failure.\n  TestEq1(2);\n\n  // Catches the fatal failure and aborts the test.\n  //\n  // The testing::Test:: prefix is necessary when calling\n  // HasFatalFailure() outside of a TEST, TEST_F, or test fixture.\n  if (testing::Test::HasFatalFailure()) return;\n\n  // If we get here, something is wrong.\n  FAIL() << \"This should never be reached.\";\n}\n\nTEST(PassingTest, PassingTest1) {\n}\n\nTEST(PassingTest, PassingTest2) {\n}\n\n// Tests catching a fatal failure in a subroutine.\nTEST(FatalFailureTest, FatalFailureInSubroutine) {\n  printf(\"(expecting a failure that x should be 1)\\n\");\n\n  TryTestSubroutine();\n}\n\n// Tests catching a fatal failure in a nested subroutine.\nTEST(FatalFailureTest, FatalFailureInNestedSubroutine) {\n  printf(\"(expecting a failure that x should be 1)\\n\");\n\n  // Calls a subrountine that yields a fatal failure.\n  TryTestSubroutine();\n\n  // Catches the fatal failure and aborts the test.\n  //\n  // When calling HasFatalFailure() inside a TEST, TEST_F, or test\n  // fixture, the testing::Test:: prefix is not needed.\n  if (HasFatalFailure()) return;\n\n  // If we get here, something is wrong.\n  FAIL() << \"This should never be reached.\";\n}\n\n// Tests HasFatalFailure() after a failed EXPECT check.\nTEST(FatalFailureTest, NonfatalFailureInSubroutine) {\n  printf(\"(expecting a failure on false)\\n\");\n  EXPECT_TRUE(false);  // Generates a nonfatal failure\n  ASSERT_FALSE(HasFatalFailure());  // This should succeed.\n}\n\n// Tests interleaving user logging and Google Test assertions.\nTEST(LoggingTest, InterleavingLoggingAndAssertions) {\n  static const int a[4] = {\n    3, 9, 2, 6\n  };\n\n  printf(\"(expecting 2 failures on (3) >= (a[i]))\\n\");\n  for (int i = 0; i < static_cast<int>(sizeof(a)/sizeof(*a)); i++) {\n    printf(\"i == %d\\n\", i);\n    EXPECT_GE(3, a[i]);\n  }\n}\n\n// Tests the SCOPED_TRACE macro.\n\n// A helper function for testing SCOPED_TRACE.\nvoid SubWithoutTrace(int n) {\n  EXPECT_EQ(1, n);\n  ASSERT_EQ(2, n);\n}\n\n// Another helper function for testing SCOPED_TRACE.\nvoid SubWithTrace(int n) {\n  SCOPED_TRACE(testing::Message() << \"n = \" << n);\n\n  SubWithoutTrace(n);\n}\n\n// Tests that SCOPED_TRACE() obeys lexical scopes.\nTEST(SCOPED_TRACETest, ObeysScopes) {\n  printf(\"(expected to fail)\\n\");\n\n  // There should be no trace before SCOPED_TRACE() is invoked.\n  ADD_FAILURE() << \"This failure is expected, and shouldn't have a trace.\";\n\n  {\n    SCOPED_TRACE(\"Expected trace\");\n    // After SCOPED_TRACE(), a failure in the current scope should contain\n    // the trace.\n    ADD_FAILURE() << \"This failure is expected, and should have a trace.\";\n  }\n\n  // Once the control leaves the scope of the SCOPED_TRACE(), there\n  // should be no trace again.\n  ADD_FAILURE() << \"This failure is expected, and shouldn't have a trace.\";\n}\n\n// Tests that SCOPED_TRACE works inside a loop.\nTEST(SCOPED_TRACETest, WorksInLoop) {\n  printf(\"(expected to fail)\\n\");\n\n  for (int i = 1; i <= 2; i++) {\n    SCOPED_TRACE(testing::Message() << \"i = \" << i);\n\n    SubWithoutTrace(i);\n  }\n}\n\n// Tests that SCOPED_TRACE works in a subroutine.\nTEST(SCOPED_TRACETest, WorksInSubroutine) {\n  printf(\"(expected to fail)\\n\");\n\n  SubWithTrace(1);\n  SubWithTrace(2);\n}\n\n// Tests that SCOPED_TRACE can be nested.\nTEST(SCOPED_TRACETest, CanBeNested) {\n  printf(\"(expected to fail)\\n\");\n\n  SCOPED_TRACE(\"\");  // A trace without a message.\n\n  SubWithTrace(2);\n}\n\n// Tests that multiple SCOPED_TRACEs can be used in the same scope.\nTEST(SCOPED_TRACETest, CanBeRepeated) {\n  printf(\"(expected to fail)\\n\");\n\n  SCOPED_TRACE(\"A\");\n  ADD_FAILURE()\n      << \"This failure is expected, and should contain trace point A.\";\n\n  SCOPED_TRACE(\"B\");\n  ADD_FAILURE()\n      << \"This failure is expected, and should contain trace point A and B.\";\n\n  {\n    SCOPED_TRACE(\"C\");\n    ADD_FAILURE() << \"This failure is expected, and should contain \"\n                  << \"trace point A, B, and C.\";\n  }\n\n  SCOPED_TRACE(\"D\");\n  ADD_FAILURE() << \"This failure is expected, and should contain \"\n                << \"trace point A, B, and D.\";\n}\n\n#if GTEST_IS_THREADSAFE\n// Tests that SCOPED_TRACE()s can be used concurrently from multiple\n// threads.  Namely, an assertion should be affected by\n// SCOPED_TRACE()s in its own thread only.\n\n// Here's the sequence of actions that happen in the test:\n//\n//   Thread A (main)                | Thread B (spawned)\n//   ===============================|================================\n//   spawns thread B                |\n//   -------------------------------+--------------------------------\n//   waits for n1                   | SCOPED_TRACE(\"Trace B\");\n//                                  | generates failure #1\n//                                  | notifies n1\n//   -------------------------------+--------------------------------\n//   SCOPED_TRACE(\"Trace A\");       | waits for n2\n//   generates failure #2           |\n//   notifies n2                    |\n//   -------------------------------|--------------------------------\n//   waits for n3                   | generates failure #3\n//                                  | trace B dies\n//                                  | generates failure #4\n//                                  | notifies n3\n//   -------------------------------|--------------------------------\n//   generates failure #5           | finishes\n//   trace A dies                   |\n//   generates failure #6           |\n//   -------------------------------|--------------------------------\n//   waits for thread B to finish   |\n\nstruct CheckPoints {\n  Notification n1;\n  Notification n2;\n  Notification n3;\n};\n\nstatic void ThreadWithScopedTrace(CheckPoints* check_points) {\n  {\n    SCOPED_TRACE(\"Trace B\");\n    ADD_FAILURE()\n        << \"Expected failure #1 (in thread B, only trace B alive).\";\n    check_points->n1.Notify();\n    check_points->n2.WaitForNotification();\n\n    ADD_FAILURE()\n        << \"Expected failure #3 (in thread B, trace A & B both alive).\";\n  }  // Trace B dies here.\n  ADD_FAILURE()\n      << \"Expected failure #4 (in thread B, only trace A alive).\";\n  check_points->n3.Notify();\n}\n\nTEST(SCOPED_TRACETest, WorksConcurrently) {\n  printf(\"(expecting 6 failures)\\n\");\n\n  CheckPoints check_points;\n  ThreadWithParam<CheckPoints*> thread(&ThreadWithScopedTrace,\n                                       &check_points,\n                                       NULL);\n  check_points.n1.WaitForNotification();\n\n  {\n    SCOPED_TRACE(\"Trace A\");\n    ADD_FAILURE()\n        << \"Expected failure #2 (in thread A, trace A & B both alive).\";\n    check_points.n2.Notify();\n    check_points.n3.WaitForNotification();\n\n    ADD_FAILURE()\n        << \"Expected failure #5 (in thread A, only trace A alive).\";\n  }  // Trace A dies here.\n  ADD_FAILURE()\n      << \"Expected failure #6 (in thread A, no trace alive).\";\n  thread.Join();\n}\n#endif  // GTEST_IS_THREADSAFE\n\nTEST(DisabledTestsWarningTest,\n     DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning) {\n  // This test body is intentionally empty.  Its sole purpose is for\n  // verifying that the --gtest_also_run_disabled_tests flag\n  // suppresses the \"YOU HAVE 12 DISABLED TESTS\" warning at the end of\n  // the test output.\n}\n\n// Tests using assertions outside of TEST and TEST_F.\n//\n// This function creates two failures intentionally.\nvoid AdHocTest() {\n  printf(\"The non-test part of the code is expected to have 2 failures.\\n\\n\");\n  EXPECT_TRUE(false);\n  EXPECT_EQ(2, 3);\n}\n\n// Runs all TESTs, all TEST_Fs, and the ad hoc test.\nint RunAllTests() {\n  AdHocTest();\n  return RUN_ALL_TESTS();\n}\n\n// Tests non-fatal failures in the fixture constructor.\nclass NonFatalFailureInFixtureConstructorTest : public testing::Test {\n protected:\n  NonFatalFailureInFixtureConstructorTest() {\n    printf(\"(expecting 5 failures)\\n\");\n    ADD_FAILURE() << \"Expected failure #1, in the test fixture c'tor.\";\n  }\n\n  ~NonFatalFailureInFixtureConstructorTest() {\n    ADD_FAILURE() << \"Expected failure #5, in the test fixture d'tor.\";\n  }\n\n  virtual void SetUp() {\n    ADD_FAILURE() << \"Expected failure #2, in SetUp().\";\n  }\n\n  virtual void TearDown() {\n    ADD_FAILURE() << \"Expected failure #4, in TearDown.\";\n  }\n};\n\nTEST_F(NonFatalFailureInFixtureConstructorTest, FailureInConstructor) {\n  ADD_FAILURE() << \"Expected failure #3, in the test body.\";\n}\n\n// Tests fatal failures in the fixture constructor.\nclass FatalFailureInFixtureConstructorTest : public testing::Test {\n protected:\n  FatalFailureInFixtureConstructorTest() {\n    printf(\"(expecting 2 failures)\\n\");\n    Init();\n  }\n\n  ~FatalFailureInFixtureConstructorTest() {\n    ADD_FAILURE() << \"Expected failure #2, in the test fixture d'tor.\";\n  }\n\n  virtual void SetUp() {\n    ADD_FAILURE() << \"UNEXPECTED failure in SetUp().  \"\n                  << \"We should never get here, as the test fixture c'tor \"\n                  << \"had a fatal failure.\";\n  }\n\n  virtual void TearDown() {\n    ADD_FAILURE() << \"UNEXPECTED failure in TearDown().  \"\n                  << \"We should never get here, as the test fixture c'tor \"\n                  << \"had a fatal failure.\";\n  }\n private:\n  void Init() {\n    FAIL() << \"Expected failure #1, in the test fixture c'tor.\";\n  }\n};\n\nTEST_F(FatalFailureInFixtureConstructorTest, FailureInConstructor) {\n  ADD_FAILURE() << \"UNEXPECTED failure in the test body.  \"\n                << \"We should never get here, as the test fixture c'tor \"\n                << \"had a fatal failure.\";\n}\n\n// Tests non-fatal failures in SetUp().\nclass NonFatalFailureInSetUpTest : public testing::Test {\n protected:\n  virtual ~NonFatalFailureInSetUpTest() {\n    Deinit();\n  }\n\n  virtual void SetUp() {\n    printf(\"(expecting 4 failures)\\n\");\n    ADD_FAILURE() << \"Expected failure #1, in SetUp().\";\n  }\n\n  virtual void TearDown() {\n    FAIL() << \"Expected failure #3, in TearDown().\";\n  }\n private:\n  void Deinit() {\n    FAIL() << \"Expected failure #4, in the test fixture d'tor.\";\n  }\n};\n\nTEST_F(NonFatalFailureInSetUpTest, FailureInSetUp) {\n  FAIL() << \"Expected failure #2, in the test function.\";\n}\n\n// Tests fatal failures in SetUp().\nclass FatalFailureInSetUpTest : public testing::Test {\n protected:\n  virtual ~FatalFailureInSetUpTest() {\n    Deinit();\n  }\n\n  virtual void SetUp() {\n    printf(\"(expecting 3 failures)\\n\");\n    FAIL() << \"Expected failure #1, in SetUp().\";\n  }\n\n  virtual void TearDown() {\n    FAIL() << \"Expected failure #2, in TearDown().\";\n  }\n private:\n  void Deinit() {\n    FAIL() << \"Expected failure #3, in the test fixture d'tor.\";\n  }\n};\n\nTEST_F(FatalFailureInSetUpTest, FailureInSetUp) {\n  FAIL() << \"UNEXPECTED failure in the test function.  \"\n         << \"We should never get here, as SetUp() failed.\";\n}\n\n#if GTEST_OS_WINDOWS\n\n// This group of tests verifies that Google Test handles SEH and C++\n// exceptions correctly.\n\n// A function that throws an SEH exception.\nstatic void ThrowSEH() {\n  int* p = NULL;\n  *p = 0;  // Raises an access violation.\n}\n\n// Tests exceptions thrown in the test fixture constructor.\nclass ExceptionInFixtureCtorTest : public testing::Test {\n protected:\n  ExceptionInFixtureCtorTest() {\n    printf(\"(expecting a failure on thrown exception \"\n           \"in the test fixture's constructor)\\n\");\n\n    ThrowSEH();\n  }\n\n  virtual ~ExceptionInFixtureCtorTest() {\n    Deinit();\n  }\n\n  virtual void SetUp() {\n    FAIL() << \"UNEXPECTED failure in SetUp().  \"\n           << \"We should never get here, as the test fixture c'tor threw.\";\n  }\n\n  virtual void TearDown() {\n    FAIL() << \"UNEXPECTED failure in TearDown().  \"\n           << \"We should never get here, as the test fixture c'tor threw.\";\n  }\n private:\n  void Deinit() {\n    FAIL() << \"UNEXPECTED failure in the d'tor.  \"\n           << \"We should never get here, as the test fixture c'tor threw.\";\n  }\n};\n\nTEST_F(ExceptionInFixtureCtorTest, ExceptionInFixtureCtor) {\n  FAIL() << \"UNEXPECTED failure in the test function.  \"\n         << \"We should never get here, as the test fixture c'tor threw.\";\n}\n\n// Tests exceptions thrown in SetUp().\nclass ExceptionInSetUpTest : public testing::Test {\n protected:\n  virtual ~ExceptionInSetUpTest() {\n    Deinit();\n  }\n\n  virtual void SetUp() {\n    printf(\"(expecting 3 failures)\\n\");\n\n    ThrowSEH();\n  }\n\n  virtual void TearDown() {\n    FAIL() << \"Expected failure #2, in TearDown().\";\n  }\n private:\n  void Deinit() {\n    FAIL() << \"Expected failure #3, in the test fixture d'tor.\";\n  }\n};\n\nTEST_F(ExceptionInSetUpTest, ExceptionInSetUp) {\n  FAIL() << \"UNEXPECTED failure in the test function.  \"\n         << \"We should never get here, as SetUp() threw.\";\n}\n\n// Tests that TearDown() and the test fixture d'tor are always called,\n// even when the test function throws an exception.\nclass ExceptionInTestFunctionTest : public testing::Test {\n protected:\n  virtual ~ExceptionInTestFunctionTest() {\n    Deinit();\n  }\n\n  virtual void TearDown() {\n    FAIL() << \"Expected failure #2, in TearDown().\";\n  }\n private:\n  void Deinit() {\n    FAIL() << \"Expected failure #3, in the test fixture d'tor.\";\n  }\n};\n\n// Tests that the test fixture d'tor is always called, even when the\n// test function throws an SEH exception.\nTEST_F(ExceptionInTestFunctionTest, SEH) {\n  printf(\"(expecting 3 failures)\\n\");\n\n  ThrowSEH();\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\n// Tests that the test fixture d'tor is always called, even when the\n// test function throws a C++ exception.  We do this only when\n// GTEST_HAS_EXCEPTIONS is non-zero, i.e. C++ exceptions are enabled.\nTEST_F(ExceptionInTestFunctionTest, CppException) {\n  throw 1;\n}\n\n// Tests exceptions thrown in TearDown().\nclass ExceptionInTearDownTest : public testing::Test {\n protected:\n  virtual ~ExceptionInTearDownTest() {\n    Deinit();\n  }\n\n  virtual void TearDown() {\n    throw 1;\n  }\n private:\n  void Deinit() {\n    FAIL() << \"Expected failure #2, in the test fixture d'tor.\";\n  }\n};\n\nTEST_F(ExceptionInTearDownTest, ExceptionInTearDown) {\n  printf(\"(expecting 2 failures)\\n\");\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n#endif  // GTEST_OS_WINDOWS\n\n#if GTEST_IS_THREADSAFE\n\n// A unary function that may die.\nvoid DieIf(bool should_die) {\n  GTEST_CHECK_(!should_die) << \" - death inside DieIf().\";\n}\n\n// Tests running death tests in a multi-threaded context.\n\n// Used for coordination between the main and the spawn thread.\nstruct SpawnThreadNotifications {\n  SpawnThreadNotifications() {}\n\n  Notification spawn_thread_started;\n  Notification spawn_thread_ok_to_terminate;\n\n private:\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(SpawnThreadNotifications);\n};\n\n// The function to be executed in the thread spawn by the\n// MultipleThreads test (below).\nstatic void ThreadRoutine(SpawnThreadNotifications* notifications) {\n  // Signals the main thread that this thread has started.\n  notifications->spawn_thread_started.Notify();\n\n  // Waits for permission to finish from the main thread.\n  notifications->spawn_thread_ok_to_terminate.WaitForNotification();\n}\n\n// This is a death-test test, but it's not named with a DeathTest\n// suffix.  It starts threads which might interfere with later\n// death tests, so it must run after all other death tests.\nclass DeathTestAndMultiThreadsTest : public testing::Test {\n protected:\n  // Starts a thread and waits for it to begin.\n  virtual void SetUp() {\n    thread_.reset(new ThreadWithParam<SpawnThreadNotifications*>(\n        &ThreadRoutine, &notifications_, NULL));\n    notifications_.spawn_thread_started.WaitForNotification();\n  }\n  // Tells the thread to finish, and reaps it.\n  // Depending on the version of the thread library in use,\n  // a manager thread might still be left running that will interfere\n  // with later death tests.  This is unfortunate, but this class\n  // cleans up after itself as best it can.\n  virtual void TearDown() {\n    notifications_.spawn_thread_ok_to_terminate.Notify();\n  }\n\n private:\n  SpawnThreadNotifications notifications_;\n  scoped_ptr<ThreadWithParam<SpawnThreadNotifications*> > thread_;\n};\n\n#endif  // GTEST_IS_THREADSAFE\n\n// The MixedUpTestCaseTest test case verifies that Google Test will fail a\n// test if it uses a different fixture class than what other tests in\n// the same test case use.  It deliberately contains two fixture\n// classes with the same name but defined in different namespaces.\n\n// The MixedUpTestCaseWithSameTestNameTest test case verifies that\n// when the user defines two tests with the same test case name AND\n// same test name (but in different namespaces), the second test will\n// fail.\n\nnamespace foo {\n\nclass MixedUpTestCaseTest : public testing::Test {\n};\n\nTEST_F(MixedUpTestCaseTest, FirstTestFromNamespaceFoo) {}\nTEST_F(MixedUpTestCaseTest, SecondTestFromNamespaceFoo) {}\n\nclass MixedUpTestCaseWithSameTestNameTest : public testing::Test {\n};\n\nTEST_F(MixedUpTestCaseWithSameTestNameTest,\n       TheSecondTestWithThisNameShouldFail) {}\n\n}  // namespace foo\n\nnamespace bar {\n\nclass MixedUpTestCaseTest : public testing::Test {\n};\n\n// The following two tests are expected to fail.  We rely on the\n// golden file to check that Google Test generates the right error message.\nTEST_F(MixedUpTestCaseTest, ThisShouldFail) {}\nTEST_F(MixedUpTestCaseTest, ThisShouldFailToo) {}\n\nclass MixedUpTestCaseWithSameTestNameTest : public testing::Test {\n};\n\n// Expected to fail.  We rely on the golden file to check that Google Test\n// generates the right error message.\nTEST_F(MixedUpTestCaseWithSameTestNameTest,\n       TheSecondTestWithThisNameShouldFail) {}\n\n}  // namespace bar\n\n// The following two test cases verify that Google Test catches the user\n// error of mixing TEST and TEST_F in the same test case.  The first\n// test case checks the scenario where TEST_F appears before TEST, and\n// the second one checks where TEST appears before TEST_F.\n\nclass TEST_F_before_TEST_in_same_test_case : public testing::Test {\n};\n\nTEST_F(TEST_F_before_TEST_in_same_test_case, DefinedUsingTEST_F) {}\n\n// Expected to fail.  We rely on the golden file to check that Google Test\n// generates the right error message.\nTEST(TEST_F_before_TEST_in_same_test_case, DefinedUsingTESTAndShouldFail) {}\n\nclass TEST_before_TEST_F_in_same_test_case : public testing::Test {\n};\n\nTEST(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST) {}\n\n// Expected to fail.  We rely on the golden file to check that Google Test\n// generates the right error message.\nTEST_F(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST_FAndShouldFail) {\n}\n\n// Used for testing EXPECT_NONFATAL_FAILURE() and EXPECT_FATAL_FAILURE().\nint global_integer = 0;\n\n// Tests that EXPECT_NONFATAL_FAILURE() can reference global variables.\nTEST(ExpectNonfatalFailureTest, CanReferenceGlobalVariables) {\n  global_integer = 0;\n  EXPECT_NONFATAL_FAILURE({\n    EXPECT_EQ(1, global_integer) << \"Expected non-fatal failure.\";\n  }, \"Expected non-fatal failure.\");\n}\n\n// Tests that EXPECT_NONFATAL_FAILURE() can reference local variables\n// (static or not).\nTEST(ExpectNonfatalFailureTest, CanReferenceLocalVariables) {\n  int m = 0;\n  static int n;\n  n = 1;\n  EXPECT_NONFATAL_FAILURE({\n    EXPECT_EQ(m, n) << \"Expected non-fatal failure.\";\n  }, \"Expected non-fatal failure.\");\n}\n\n// Tests that EXPECT_NONFATAL_FAILURE() succeeds when there is exactly\n// one non-fatal failure and no fatal failure.\nTEST(ExpectNonfatalFailureTest, SucceedsWhenThereIsOneNonfatalFailure) {\n  EXPECT_NONFATAL_FAILURE({\n    ADD_FAILURE() << \"Expected non-fatal failure.\";\n  }, \"Expected non-fatal failure.\");\n}\n\n// Tests that EXPECT_NONFATAL_FAILURE() fails when there is no\n// non-fatal failure.\nTEST(ExpectNonfatalFailureTest, FailsWhenThereIsNoNonfatalFailure) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_NONFATAL_FAILURE({\n  }, \"\");\n}\n\n// Tests that EXPECT_NONFATAL_FAILURE() fails when there are two\n// non-fatal failures.\nTEST(ExpectNonfatalFailureTest, FailsWhenThereAreTwoNonfatalFailures) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_NONFATAL_FAILURE({\n    ADD_FAILURE() << \"Expected non-fatal failure 1.\";\n    ADD_FAILURE() << \"Expected non-fatal failure 2.\";\n  }, \"\");\n}\n\n// Tests that EXPECT_NONFATAL_FAILURE() fails when there is one fatal\n// failure.\nTEST(ExpectNonfatalFailureTest, FailsWhenThereIsOneFatalFailure) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_NONFATAL_FAILURE({\n    FAIL() << \"Expected fatal failure.\";\n  }, \"\");\n}\n\n// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being\n// tested returns.\nTEST(ExpectNonfatalFailureTest, FailsWhenStatementReturns) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_NONFATAL_FAILURE({\n    return;\n  }, \"\");\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\n// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being\n// tested throws.\nTEST(ExpectNonfatalFailureTest, FailsWhenStatementThrows) {\n  printf(\"(expecting a failure)\\n\");\n  try {\n    EXPECT_NONFATAL_FAILURE({\n      throw 0;\n    }, \"\");\n  } catch(int) {  // NOLINT\n  }\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// Tests that EXPECT_FATAL_FAILURE() can reference global variables.\nTEST(ExpectFatalFailureTest, CanReferenceGlobalVariables) {\n  global_integer = 0;\n  EXPECT_FATAL_FAILURE({\n    ASSERT_EQ(1, global_integer) << \"Expected fatal failure.\";\n  }, \"Expected fatal failure.\");\n}\n\n// Tests that EXPECT_FATAL_FAILURE() can reference local static\n// variables.\nTEST(ExpectFatalFailureTest, CanReferenceLocalStaticVariables) {\n  static int n;\n  n = 1;\n  EXPECT_FATAL_FAILURE({\n    ASSERT_EQ(0, n) << \"Expected fatal failure.\";\n  }, \"Expected fatal failure.\");\n}\n\n// Tests that EXPECT_FATAL_FAILURE() succeeds when there is exactly\n// one fatal failure and no non-fatal failure.\nTEST(ExpectFatalFailureTest, SucceedsWhenThereIsOneFatalFailure) {\n  EXPECT_FATAL_FAILURE({\n    FAIL() << \"Expected fatal failure.\";\n  }, \"Expected fatal failure.\");\n}\n\n// Tests that EXPECT_FATAL_FAILURE() fails when there is no fatal\n// failure.\nTEST(ExpectFatalFailureTest, FailsWhenThereIsNoFatalFailure) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_FATAL_FAILURE({\n  }, \"\");\n}\n\n// A helper for generating a fatal failure.\nvoid FatalFailure() {\n  FAIL() << \"Expected fatal failure.\";\n}\n\n// Tests that EXPECT_FATAL_FAILURE() fails when there are two\n// fatal failures.\nTEST(ExpectFatalFailureTest, FailsWhenThereAreTwoFatalFailures) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_FATAL_FAILURE({\n    FatalFailure();\n    FatalFailure();\n  }, \"\");\n}\n\n// Tests that EXPECT_FATAL_FAILURE() fails when there is one non-fatal\n// failure.\nTEST(ExpectFatalFailureTest, FailsWhenThereIsOneNonfatalFailure) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_FATAL_FAILURE({\n    ADD_FAILURE() << \"Expected non-fatal failure.\";\n  }, \"\");\n}\n\n// Tests that EXPECT_FATAL_FAILURE() fails when the statement being\n// tested returns.\nTEST(ExpectFatalFailureTest, FailsWhenStatementReturns) {\n  printf(\"(expecting a failure)\\n\");\n  EXPECT_FATAL_FAILURE({\n    return;\n  }, \"\");\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\n// Tests that EXPECT_FATAL_FAILURE() fails when the statement being\n// tested throws.\nTEST(ExpectFatalFailureTest, FailsWhenStatementThrows) {\n  printf(\"(expecting a failure)\\n\");\n  try {\n    EXPECT_FATAL_FAILURE({\n      throw 0;\n    }, \"\");\n  } catch(int) {  // NOLINT\n  }\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// This #ifdef block tests the output of typed tests.\n#if GTEST_HAS_TYPED_TEST\n\ntemplate <typename T>\nclass TypedTest : public testing::Test {\n};\n\nTYPED_TEST_CASE(TypedTest, testing::Types<int>);\n\nTYPED_TEST(TypedTest, Success) {\n  EXPECT_EQ(0, TypeParam());\n}\n\nTYPED_TEST(TypedTest, Failure) {\n  EXPECT_EQ(1, TypeParam()) << \"Expected failure\";\n}\n\n#endif  // GTEST_HAS_TYPED_TEST\n\n// This #ifdef block tests the output of type-parameterized tests.\n#if GTEST_HAS_TYPED_TEST_P\n\ntemplate <typename T>\nclass TypedTestP : public testing::Test {\n};\n\nTYPED_TEST_CASE_P(TypedTestP);\n\nTYPED_TEST_P(TypedTestP, Success) {\n  EXPECT_EQ(0U, TypeParam());\n}\n\nTYPED_TEST_P(TypedTestP, Failure) {\n  EXPECT_EQ(1U, TypeParam()) << \"Expected failure\";\n}\n\nREGISTER_TYPED_TEST_CASE_P(TypedTestP, Success, Failure);\n\ntypedef testing::Types<unsigned char, unsigned int> UnsignedTypes;\nINSTANTIATE_TYPED_TEST_CASE_P(Unsigned, TypedTestP, UnsignedTypes);\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n#if GTEST_HAS_DEATH_TEST\n\n// We rely on the golden file to verify that tests whose test case\n// name ends with DeathTest are run first.\n\nTEST(ADeathTest, ShouldRunFirst) {\n}\n\n#if GTEST_HAS_TYPED_TEST\n\n// We rely on the golden file to verify that typed tests whose test\n// case name ends with DeathTest are run first.\n\ntemplate <typename T>\nclass ATypedDeathTest : public testing::Test {\n};\n\ntypedef testing::Types<int, double> NumericTypes;\nTYPED_TEST_CASE(ATypedDeathTest, NumericTypes);\n\nTYPED_TEST(ATypedDeathTest, ShouldRunFirst) {\n}\n\n#endif  // GTEST_HAS_TYPED_TEST\n\n#if GTEST_HAS_TYPED_TEST_P\n\n\n// We rely on the golden file to verify that type-parameterized tests\n// whose test case name ends with DeathTest are run first.\n\ntemplate <typename T>\nclass ATypeParamDeathTest : public testing::Test {\n};\n\nTYPED_TEST_CASE_P(ATypeParamDeathTest);\n\nTYPED_TEST_P(ATypeParamDeathTest, ShouldRunFirst) {\n}\n\nREGISTER_TYPED_TEST_CASE_P(ATypeParamDeathTest, ShouldRunFirst);\n\nINSTANTIATE_TYPED_TEST_CASE_P(My, ATypeParamDeathTest, NumericTypes);\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n// Tests various failure conditions of\n// EXPECT_{,NON}FATAL_FAILURE{,_ON_ALL_THREADS}.\nclass ExpectFailureTest : public testing::Test {\n public:  // Must be public and not protected due to a bug in g++ 3.4.2.\n  enum FailureMode {\n    FATAL_FAILURE,\n    NONFATAL_FAILURE\n  };\n  static void AddFailure(FailureMode failure) {\n    if (failure == FATAL_FAILURE) {\n      FAIL() << \"Expected fatal failure.\";\n    } else {\n      ADD_FAILURE() << \"Expected non-fatal failure.\";\n    }\n  }\n};\n\nTEST_F(ExpectFailureTest, ExpectFatalFailure) {\n  // Expected fatal failure, but succeeds.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_FATAL_FAILURE(SUCCEED(), \"Expected fatal failure.\");\n  // Expected fatal failure, but got a non-fatal failure.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_FATAL_FAILURE(AddFailure(NONFATAL_FAILURE), \"Expected non-fatal \"\n                       \"failure.\");\n  // Wrong message.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_FATAL_FAILURE(AddFailure(FATAL_FAILURE), \"Some other fatal failure \"\n                       \"expected.\");\n}\n\nTEST_F(ExpectFailureTest, ExpectNonFatalFailure) {\n  // Expected non-fatal failure, but succeeds.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_NONFATAL_FAILURE(SUCCEED(), \"Expected non-fatal failure.\");\n  // Expected non-fatal failure, but got a fatal failure.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_NONFATAL_FAILURE(AddFailure(FATAL_FAILURE), \"Expected fatal failure.\");\n  // Wrong message.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_NONFATAL_FAILURE(AddFailure(NONFATAL_FAILURE), \"Some other non-fatal \"\n                          \"failure.\");\n}\n\n#if GTEST_IS_THREADSAFE\n\nclass ExpectFailureWithThreadsTest : public ExpectFailureTest {\n protected:\n  static void AddFailureInOtherThread(FailureMode failure) {\n    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL);\n    thread.Join();\n  }\n};\n\nTEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailure) {\n  // We only intercept the current thread.\n  printf(\"(expecting 2 failures)\\n\");\n  EXPECT_FATAL_FAILURE(AddFailureInOtherThread(FATAL_FAILURE),\n                       \"Expected fatal failure.\");\n}\n\nTEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailure) {\n  // We only intercept the current thread.\n  printf(\"(expecting 2 failures)\\n\");\n  EXPECT_NONFATAL_FAILURE(AddFailureInOtherThread(NONFATAL_FAILURE),\n                          \"Expected non-fatal failure.\");\n}\n\ntypedef ExpectFailureWithThreadsTest ScopedFakeTestPartResultReporterTest;\n\n// Tests that the ScopedFakeTestPartResultReporter only catches failures from\n// the current thread if it is instantiated with INTERCEPT_ONLY_CURRENT_THREAD.\nTEST_F(ScopedFakeTestPartResultReporterTest, InterceptOnlyCurrentThread) {\n  printf(\"(expecting 2 failures)\\n\");\n  TestPartResultArray results;\n  {\n    ScopedFakeTestPartResultReporter reporter(\n        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,\n        &results);\n    AddFailureInOtherThread(FATAL_FAILURE);\n    AddFailureInOtherThread(NONFATAL_FAILURE);\n  }\n  // The two failures should not have been intercepted.\n  EXPECT_EQ(0, results.size()) << \"This shouldn't fail.\";\n}\n\n#endif  // GTEST_IS_THREADSAFE\n\nTEST_F(ExpectFailureTest, ExpectFatalFailureOnAllThreads) {\n  // Expected fatal failure, but succeeds.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), \"Expected fatal failure.\");\n  // Expected fatal failure, but got a non-fatal failure.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),\n                                      \"Expected non-fatal failure.\");\n  // Wrong message.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),\n                                      \"Some other fatal failure expected.\");\n}\n\nTEST_F(ExpectFailureTest, ExpectNonFatalFailureOnAllThreads) {\n  // Expected non-fatal failure, but succeeds.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), \"Expected non-fatal \"\n                                         \"failure.\");\n  // Expected non-fatal failure, but got a fatal failure.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),\n                                         \"Expected fatal failure.\");\n  // Wrong message.\n  printf(\"(expecting 1 failure)\\n\");\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),\n                                         \"Some other non-fatal failure.\");\n}\n\n\n// Two test environments for testing testing::AddGlobalTestEnvironment().\n\nclass FooEnvironment : public testing::Environment {\n public:\n  virtual void SetUp() {\n    printf(\"%s\", \"FooEnvironment::SetUp() called.\\n\");\n  }\n\n  virtual void TearDown() {\n    printf(\"%s\", \"FooEnvironment::TearDown() called.\\n\");\n    FAIL() << \"Expected fatal failure.\";\n  }\n};\n\nclass BarEnvironment : public testing::Environment {\n public:\n  virtual void SetUp() {\n    printf(\"%s\", \"BarEnvironment::SetUp() called.\\n\");\n  }\n\n  virtual void TearDown() {\n    printf(\"%s\", \"BarEnvironment::TearDown() called.\\n\");\n    ADD_FAILURE() << \"Expected non-fatal failure.\";\n  }\n};\n\nGTEST_DEFINE_bool_(internal_skip_environment_and_ad_hoc_tests, false,\n                   \"This flag causes the program to skip test environment \"\n                   \"tests and ad hoc tests.\");\n\n// The main function.\n//\n// The idea is to use Google Test to run all the tests we have defined (some\n// of them are intended to fail), and then compare the test results\n// with the \"golden\" file.\nint main(int argc, char **argv) {\n  testing::GTEST_FLAG(print_time) = false;\n\n  // We just run the tests, knowing some of them are intended to fail.\n  // We will use a separate Python script to compare the output of\n  // this program with the golden file.\n\n  // It's hard to test InitGoogleTest() directly, as it has many\n  // global side effects.  The following line serves as a sanity test\n  // for it.\n  testing::InitGoogleTest(&argc, argv);\n  if (argc >= 2 &&\n      String(argv[1]) == \"--gtest_internal_skip_environment_and_ad_hoc_tests\")\n    GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = true;\n\n#if GTEST_HAS_DEATH_TEST\n  if (testing::internal::GTEST_FLAG(internal_run_death_test) != \"\") {\n    // Skip the usual output capturing if we're running as the child\n    // process of an threadsafe-style death test.\n#if GTEST_OS_WINDOWS\n    posix::FReopen(\"nul:\", \"w\", stdout);\n#else\n    posix::FReopen(\"/dev/null\", \"w\", stdout);\n#endif  // GTEST_OS_WINDOWS\n    return RUN_ALL_TESTS();\n  }\n#endif  // GTEST_HAS_DEATH_TEST\n\n  if (GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests))\n    return RUN_ALL_TESTS();\n\n  // Registers two global test environments.\n  // The golden file verifies that they are set up in the order they\n  // are registered, and torn down in the reverse order.\n  testing::AddGlobalTestEnvironment(new FooEnvironment);\n  testing::AddGlobalTestEnvironment(new BarEnvironment);\n\n  return RunAllTests();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_lin.txt",
    "content": "The non-test part of the code is expected to have 2 failures.\n\ngtest_output_test_.cc:#: Failure\nValue of: false\n  Actual: false\nExpected: true\ngtest_output_test_.cc:#: Failure\nValue of: 3\nExpected: 2\n\u001b[0;32m[==========] \u001b[mRunning 60 tests from 25 test cases.\n\u001b[0;32m[----------] \u001b[mGlobal test environment set-up.\nFooEnvironment::SetUp() called.\nBarEnvironment::SetUp() called.\n\u001b[0;32m[----------] \u001b[m1 test from ADeathTest\n\u001b[0;32m[ RUN      ] \u001b[mADeathTest.ShouldRunFirst\n\u001b[0;32m[       OK ] \u001b[mADeathTest.ShouldRunFirst\n\u001b[0;32m[----------] \u001b[m1 test from ATypedDeathTest/0, where TypeParam = int\n\u001b[0;32m[ RUN      ] \u001b[mATypedDeathTest/0.ShouldRunFirst\n\u001b[0;32m[       OK ] \u001b[mATypedDeathTest/0.ShouldRunFirst\n\u001b[0;32m[----------] \u001b[m1 test from ATypedDeathTest/1, where TypeParam = double\n\u001b[0;32m[ RUN      ] \u001b[mATypedDeathTest/1.ShouldRunFirst\n\u001b[0;32m[       OK ] \u001b[mATypedDeathTest/1.ShouldRunFirst\n\u001b[0;32m[----------] \u001b[m1 test from My/ATypeParamDeathTest/0, where TypeParam = int\n\u001b[0;32m[ RUN      ] \u001b[mMy/ATypeParamDeathTest/0.ShouldRunFirst\n\u001b[0;32m[       OK ] \u001b[mMy/ATypeParamDeathTest/0.ShouldRunFirst\n\u001b[0;32m[----------] \u001b[m1 test from My/ATypeParamDeathTest/1, where TypeParam = double\n\u001b[0;32m[ RUN      ] \u001b[mMy/ATypeParamDeathTest/1.ShouldRunFirst\n\u001b[0;32m[       OK ] \u001b[mMy/ATypeParamDeathTest/1.ShouldRunFirst\n\u001b[0;32m[----------] \u001b[m2 tests from PassingTest\n\u001b[0;32m[ RUN      ] \u001b[mPassingTest.PassingTest1\n\u001b[0;32m[       OK ] \u001b[mPassingTest.PassingTest1\n\u001b[0;32m[ RUN      ] \u001b[mPassingTest.PassingTest2\n\u001b[0;32m[       OK ] \u001b[mPassingTest.PassingTest2\n\u001b[0;32m[----------] \u001b[m3 tests from FatalFailureTest\n\u001b[0;32m[ RUN      ] \u001b[mFatalFailureTest.FatalFailureInSubroutine\n(expecting a failure that x should be 1)\ngtest_output_test_.cc:#: Failure\nValue of: x\n  Actual: 2\nExpected: 1\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureTest.FatalFailureInSubroutine\n\u001b[0;32m[ RUN      ] \u001b[mFatalFailureTest.FatalFailureInNestedSubroutine\n(expecting a failure that x should be 1)\ngtest_output_test_.cc:#: Failure\nValue of: x\n  Actual: 2\nExpected: 1\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureTest.FatalFailureInNestedSubroutine\n\u001b[0;32m[ RUN      ] \u001b[mFatalFailureTest.NonfatalFailureInSubroutine\n(expecting a failure on false)\ngtest_output_test_.cc:#: Failure\nValue of: false\n  Actual: false\nExpected: true\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureTest.NonfatalFailureInSubroutine\n\u001b[0;32m[----------] \u001b[m1 test from LoggingTest\n\u001b[0;32m[ RUN      ] \u001b[mLoggingTest.InterleavingLoggingAndAssertions\n(expecting 2 failures on (3) >= (a[i]))\ni == 0\ni == 1\ngtest_output_test_.cc:#: Failure\nExpected: (3) >= (a[i]), actual: 3 vs 9\ni == 2\ni == 3\ngtest_output_test_.cc:#: Failure\nExpected: (3) >= (a[i]), actual: 3 vs 6\n\u001b[0;31m[  FAILED  ] \u001b[mLoggingTest.InterleavingLoggingAndAssertions\n\u001b[0;32m[----------] \u001b[m6 tests from SCOPED_TRACETest\n\u001b[0;32m[ RUN      ] \u001b[mSCOPED_TRACETest.ObeysScopes\n(expected to fail)\ngtest_output_test_.cc:#: Failure\nFailed\nThis failure is expected, and shouldn't have a trace.\ngtest_output_test_.cc:#: Failure\nFailed\nThis failure is expected, and should have a trace.\nGoogle Test trace:\ngtest_output_test_.cc:#: Expected trace\ngtest_output_test_.cc:#: Failure\nFailed\nThis failure is expected, and shouldn't have a trace.\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.ObeysScopes\n\u001b[0;32m[ RUN      ] \u001b[mSCOPED_TRACETest.WorksInLoop\n(expected to fail)\ngtest_output_test_.cc:#: Failure\nValue of: n\n  Actual: 1\nExpected: 2\nGoogle Test trace:\ngtest_output_test_.cc:#: i = 1\ngtest_output_test_.cc:#: Failure\nValue of: n\n  Actual: 2\nExpected: 1\nGoogle Test trace:\ngtest_output_test_.cc:#: i = 2\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.WorksInLoop\n\u001b[0;32m[ RUN      ] \u001b[mSCOPED_TRACETest.WorksInSubroutine\n(expected to fail)\ngtest_output_test_.cc:#: Failure\nValue of: n\n  Actual: 1\nExpected: 2\nGoogle Test trace:\ngtest_output_test_.cc:#: n = 1\ngtest_output_test_.cc:#: Failure\nValue of: n\n  Actual: 2\nExpected: 1\nGoogle Test trace:\ngtest_output_test_.cc:#: n = 2\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.WorksInSubroutine\n\u001b[0;32m[ RUN      ] \u001b[mSCOPED_TRACETest.CanBeNested\n(expected to fail)\ngtest_output_test_.cc:#: Failure\nValue of: n\n  Actual: 2\nExpected: 1\nGoogle Test trace:\ngtest_output_test_.cc:#: n = 2\ngtest_output_test_.cc:#: \n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.CanBeNested\n\u001b[0;32m[ RUN      ] \u001b[mSCOPED_TRACETest.CanBeRepeated\n(expected to fail)\ngtest_output_test_.cc:#: Failure\nFailed\nThis failure is expected, and should contain trace point A.\nGoogle Test trace:\ngtest_output_test_.cc:#: A\ngtest_output_test_.cc:#: Failure\nFailed\nThis failure is expected, and should contain trace point A and B.\nGoogle Test trace:\ngtest_output_test_.cc:#: B\ngtest_output_test_.cc:#: A\ngtest_output_test_.cc:#: Failure\nFailed\nThis failure is expected, and should contain trace point A, B, and C.\nGoogle Test trace:\ngtest_output_test_.cc:#: C\ngtest_output_test_.cc:#: B\ngtest_output_test_.cc:#: A\ngtest_output_test_.cc:#: Failure\nFailed\nThis failure is expected, and should contain trace point A, B, and D.\nGoogle Test trace:\ngtest_output_test_.cc:#: D\ngtest_output_test_.cc:#: B\ngtest_output_test_.cc:#: A\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.CanBeRepeated\n\u001b[0;32m[ RUN      ] \u001b[mSCOPED_TRACETest.WorksConcurrently\n(expecting 6 failures)\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #1 (in thread B, only trace B alive).\nGoogle Test trace:\ngtest_output_test_.cc:#: Trace B\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #2 (in thread A, trace A & B both alive).\nGoogle Test trace:\ngtest_output_test_.cc:#: Trace A\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #3 (in thread B, trace A & B both alive).\nGoogle Test trace:\ngtest_output_test_.cc:#: Trace B\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #4 (in thread B, only trace A alive).\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #5 (in thread A, only trace A alive).\nGoogle Test trace:\ngtest_output_test_.cc:#: Trace A\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #6 (in thread A, no trace alive).\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.WorksConcurrently\n\u001b[0;32m[----------] \u001b[m1 test from NonFatalFailureInFixtureConstructorTest\n\u001b[0;32m[ RUN      ] \u001b[mNonFatalFailureInFixtureConstructorTest.FailureInConstructor\n(expecting 5 failures)\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #1, in the test fixture c'tor.\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #2, in SetUp().\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #3, in the test body.\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #4, in TearDown.\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #5, in the test fixture d'tor.\n\u001b[0;31m[  FAILED  ] \u001b[mNonFatalFailureInFixtureConstructorTest.FailureInConstructor\n\u001b[0;32m[----------] \u001b[m1 test from FatalFailureInFixtureConstructorTest\n\u001b[0;32m[ RUN      ] \u001b[mFatalFailureInFixtureConstructorTest.FailureInConstructor\n(expecting 2 failures)\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #1, in the test fixture c'tor.\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #2, in the test fixture d'tor.\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureInFixtureConstructorTest.FailureInConstructor\n\u001b[0;32m[----------] \u001b[m1 test from NonFatalFailureInSetUpTest\n\u001b[0;32m[ RUN      ] \u001b[mNonFatalFailureInSetUpTest.FailureInSetUp\n(expecting 4 failures)\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #1, in SetUp().\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #2, in the test function.\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #3, in TearDown().\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #4, in the test fixture d'tor.\n\u001b[0;31m[  FAILED  ] \u001b[mNonFatalFailureInSetUpTest.FailureInSetUp\n\u001b[0;32m[----------] \u001b[m1 test from FatalFailureInSetUpTest\n\u001b[0;32m[ RUN      ] \u001b[mFatalFailureInSetUpTest.FailureInSetUp\n(expecting 3 failures)\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #1, in SetUp().\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #2, in TearDown().\ngtest_output_test_.cc:#: Failure\nFailed\nExpected failure #3, in the test fixture d'tor.\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureInSetUpTest.FailureInSetUp\n\u001b[0;32m[----------] \u001b[m4 tests from MixedUpTestCaseTest\n\u001b[0;32m[ RUN      ] \u001b[mMixedUpTestCaseTest.FirstTestFromNamespaceFoo\n\u001b[0;32m[       OK ] \u001b[mMixedUpTestCaseTest.FirstTestFromNamespaceFoo\n\u001b[0;32m[ RUN      ] \u001b[mMixedUpTestCaseTest.SecondTestFromNamespaceFoo\n\u001b[0;32m[       OK ] \u001b[mMixedUpTestCaseTest.SecondTestFromNamespaceFoo\n\u001b[0;32m[ RUN      ] \u001b[mMixedUpTestCaseTest.ThisShouldFail\ngtest.cc:#: Failure\nFailed\nAll tests in the same test case must use the same test fixture\nclass.  However, in test case MixedUpTestCaseTest,\nyou defined test FirstTestFromNamespaceFoo and test ThisShouldFail\nusing two different test fixture classes.  This can happen if\nthe two classes are from different namespaces or translation\nunits and have the same name.  You should probably rename one\nof the classes to put the tests into different test cases.\n\u001b[0;31m[  FAILED  ] \u001b[mMixedUpTestCaseTest.ThisShouldFail\n\u001b[0;32m[ RUN      ] \u001b[mMixedUpTestCaseTest.ThisShouldFailToo\ngtest.cc:#: Failure\nFailed\nAll tests in the same test case must use the same test fixture\nclass.  However, in test case MixedUpTestCaseTest,\nyou defined test FirstTestFromNamespaceFoo and test ThisShouldFailToo\nusing two different test fixture classes.  This can happen if\nthe two classes are from different namespaces or translation\nunits and have the same name.  You should probably rename one\nof the classes to put the tests into different test cases.\n\u001b[0;31m[  FAILED  ] \u001b[mMixedUpTestCaseTest.ThisShouldFailToo\n\u001b[0;32m[----------] \u001b[m2 tests from MixedUpTestCaseWithSameTestNameTest\n\u001b[0;32m[ RUN      ] \u001b[mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\n\u001b[0;32m[       OK ] \u001b[mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\n\u001b[0;32m[ RUN      ] \u001b[mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\ngtest.cc:#: Failure\nFailed\nAll tests in the same test case must use the same test fixture\nclass.  However, in test case MixedUpTestCaseWithSameTestNameTest,\nyou defined test TheSecondTestWithThisNameShouldFail and test TheSecondTestWithThisNameShouldFail\nusing two different test fixture classes.  This can happen if\nthe two classes are from different namespaces or translation\nunits and have the same name.  You should probably rename one\nof the classes to put the tests into different test cases.\n\u001b[0;31m[  FAILED  ] \u001b[mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\n\u001b[0;32m[----------] \u001b[m2 tests from TEST_F_before_TEST_in_same_test_case\n\u001b[0;32m[ RUN      ] \u001b[mTEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F\n\u001b[0;32m[       OK ] \u001b[mTEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F\n\u001b[0;32m[ RUN      ] \u001b[mTEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail\ngtest.cc:#: Failure\nFailed\nAll tests in the same test case must use the same test fixture\nclass, so mixing TEST_F and TEST in the same test case is\nillegal.  In test case TEST_F_before_TEST_in_same_test_case,\ntest DefinedUsingTEST_F is defined using TEST_F but\ntest DefinedUsingTESTAndShouldFail is defined using TEST.  You probably\nwant to change the TEST to TEST_F or move it to another test\ncase.\n\u001b[0;31m[  FAILED  ] \u001b[mTEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail\n\u001b[0;32m[----------] \u001b[m2 tests from TEST_before_TEST_F_in_same_test_case\n\u001b[0;32m[ RUN      ] \u001b[mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST\n\u001b[0;32m[       OK ] \u001b[mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST\n\u001b[0;32m[ RUN      ] \u001b[mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail\ngtest.cc:#: Failure\nFailed\nAll tests in the same test case must use the same test fixture\nclass, so mixing TEST_F and TEST in the same test case is\nillegal.  In test case TEST_before_TEST_F_in_same_test_case,\ntest DefinedUsingTEST_FAndShouldFail is defined using TEST_F but\ntest DefinedUsingTEST is defined using TEST.  You probably\nwant to change the TEST to TEST_F or move it to another test\ncase.\n\u001b[0;31m[  FAILED  ] \u001b[mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail\n\u001b[0;32m[----------] \u001b[m8 tests from ExpectNonfatalFailureTest\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.CanReferenceGlobalVariables\n\u001b[0;32m[       OK ] \u001b[mExpectNonfatalFailureTest.CanReferenceGlobalVariables\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.CanReferenceLocalVariables\n\u001b[0;32m[       OK ] \u001b[mExpectNonfatalFailureTest.CanReferenceLocalVariables\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure\n\u001b[0;32m[       OK ] \u001b[mExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual: 0 failures\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual: 2 failures\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure 1.\n\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure 2.\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual:\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.FailsWhenStatementReturns\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual: 0 failures\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenStatementReturns\n\u001b[0;32m[ RUN      ] \u001b[mExpectNonfatalFailureTest.FailsWhenStatementThrows\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual: 0 failures\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenStatementThrows\n\u001b[0;32m[----------] \u001b[m8 tests from ExpectFatalFailureTest\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.CanReferenceGlobalVariables\n\u001b[0;32m[       OK ] \u001b[mExpectFatalFailureTest.CanReferenceGlobalVariables\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.CanReferenceLocalStaticVariables\n\u001b[0;32m[       OK ] \u001b[mExpectFatalFailureTest.CanReferenceLocalStaticVariables\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure\n\u001b[0;32m[       OK ] \u001b[mExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual: 0 failures\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual: 2 failures\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual:\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.FailsWhenStatementReturns\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual: 0 failures\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenStatementReturns\n\u001b[0;32m[ RUN      ] \u001b[mExpectFatalFailureTest.FailsWhenStatementThrows\n(expecting a failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual: 0 failures\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenStatementThrows\n\u001b[0;32m[----------] \u001b[m2 tests from TypedTest/0, where TypeParam = int\n\u001b[0;32m[ RUN      ] \u001b[mTypedTest/0.Success\n\u001b[0;32m[       OK ] \u001b[mTypedTest/0.Success\n\u001b[0;32m[ RUN      ] \u001b[mTypedTest/0.Failure\ngtest_output_test_.cc:#: Failure\nValue of: TypeParam()\n  Actual: 0\nExpected: 1\nExpected failure\n\u001b[0;31m[  FAILED  ] \u001b[mTypedTest/0.Failure\n\u001b[0;32m[----------] \u001b[m2 tests from Unsigned/TypedTestP/0, where TypeParam = unsigned char\n\u001b[0;32m[ RUN      ] \u001b[mUnsigned/TypedTestP/0.Success\n\u001b[0;32m[       OK ] \u001b[mUnsigned/TypedTestP/0.Success\n\u001b[0;32m[ RUN      ] \u001b[mUnsigned/TypedTestP/0.Failure\ngtest_output_test_.cc:#: Failure\nValue of: TypeParam()\n  Actual: \\0\nExpected: 1U\nWhich is: 1\nExpected failure\n\u001b[0;31m[  FAILED  ] \u001b[mUnsigned/TypedTestP/0.Failure\n\u001b[0;32m[----------] \u001b[m2 tests from Unsigned/TypedTestP/1, where TypeParam = unsigned int\n\u001b[0;32m[ RUN      ] \u001b[mUnsigned/TypedTestP/1.Success\n\u001b[0;32m[       OK ] \u001b[mUnsigned/TypedTestP/1.Success\n\u001b[0;32m[ RUN      ] \u001b[mUnsigned/TypedTestP/1.Failure\ngtest_output_test_.cc:#: Failure\nValue of: TypeParam()\n  Actual: 0\nExpected: 1U\nWhich is: 1\nExpected failure\n\u001b[0;31m[  FAILED  ] \u001b[mUnsigned/TypedTestP/1.Failure\n\u001b[0;32m[----------] \u001b[m4 tests from ExpectFailureTest\n\u001b[0;32m[ RUN      ] \u001b[mExpectFailureTest.ExpectFatalFailure\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual:\ngtest_output_test_.cc:#: Success:\nSucceeded\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual:\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure containing \"Some other fatal failure expected.\"\n  Actual:\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectFatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectFailureTest.ExpectNonFatalFailure\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual:\ngtest_output_test_.cc:#: Success:\nSucceeded\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual:\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure containing \"Some other non-fatal failure.\"\n  Actual:\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectNonFatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectFailureTest.ExpectFatalFailureOnAllThreads\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual:\ngtest_output_test_.cc:#: Success:\nSucceeded\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual:\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 fatal failure containing \"Some other fatal failure expected.\"\n  Actual:\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectFatalFailureOnAllThreads\n\u001b[0;32m[ RUN      ] \u001b[mExpectFailureTest.ExpectNonFatalFailureOnAllThreads\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual:\ngtest_output_test_.cc:#: Success:\nSucceeded\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual:\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\n(expecting 1 failure)\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure containing \"Some other non-fatal failure.\"\n  Actual:\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\n\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectNonFatalFailureOnAllThreads\n\u001b[0;32m[----------] \u001b[m2 tests from ExpectFailureWithThreadsTest\n\u001b[0;32m[ RUN      ] \u001b[mExpectFailureWithThreadsTest.ExpectFatalFailure\n(expecting 2 failures)\ngtest_output_test_.cc:#: Failure\nFailed\nExpected fatal failure.\ngtest.cc:#: Failure\nExpected: 1 fatal failure\n  Actual: 0 failures\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureWithThreadsTest.ExpectFatalFailure\n\u001b[0;32m[ RUN      ] \u001b[mExpectFailureWithThreadsTest.ExpectNonFatalFailure\n(expecting 2 failures)\ngtest_output_test_.cc:#: Failure\nFailed\nExpected non-fatal failure.\ngtest.cc:#: Failure\nExpected: 1 non-fatal failure\n  Actual: 0 failures\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureWithThreadsTest.ExpectNonFatalFailure\n\u001b[0;32m[----------] \u001b[m1 test from ScopedFakeTestPartResultReporterTest\n\u001b[0;32m[ RUN      ] \u001b[mScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread\n(expecting 2 failures)\ngtest_output_test_.cc:#: Failure\nFailed\nExpected fatal failure.\ngtest_output_test_.cc:#: Failure\nFailed\nExpected non-fatal failure.\n\u001b[0;31m[  FAILED  ] \u001b[mScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread\n\u001b[0;32m[----------] \u001b[mGlobal test environment tear-down\nBarEnvironment::TearDown() called.\ngtest_output_test_.cc:#: Failure\nFailed\nExpected non-fatal failure.\nFooEnvironment::TearDown() called.\ngtest_output_test_.cc:#: Failure\nFailed\nExpected fatal failure.\n\u001b[0;32m[==========] \u001b[m60 tests from 25 test cases ran.\n\u001b[0;32m[  PASSED  ] \u001b[m21 tests.\n\u001b[0;31m[  FAILED  ] \u001b[m39 tests, listed below:\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureTest.FatalFailureInSubroutine\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureTest.FatalFailureInNestedSubroutine\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureTest.NonfatalFailureInSubroutine\n\u001b[0;31m[  FAILED  ] \u001b[mLoggingTest.InterleavingLoggingAndAssertions\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.ObeysScopes\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.WorksInLoop\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.WorksInSubroutine\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.CanBeNested\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.CanBeRepeated\n\u001b[0;31m[  FAILED  ] \u001b[mSCOPED_TRACETest.WorksConcurrently\n\u001b[0;31m[  FAILED  ] \u001b[mNonFatalFailureInFixtureConstructorTest.FailureInConstructor\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureInFixtureConstructorTest.FailureInConstructor\n\u001b[0;31m[  FAILED  ] \u001b[mNonFatalFailureInSetUpTest.FailureInSetUp\n\u001b[0;31m[  FAILED  ] \u001b[mFatalFailureInSetUpTest.FailureInSetUp\n\u001b[0;31m[  FAILED  ] \u001b[mMixedUpTestCaseTest.ThisShouldFail\n\u001b[0;31m[  FAILED  ] \u001b[mMixedUpTestCaseTest.ThisShouldFailToo\n\u001b[0;31m[  FAILED  ] \u001b[mMixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\n\u001b[0;31m[  FAILED  ] \u001b[mTEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail\n\u001b[0;31m[  FAILED  ] \u001b[mTEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenStatementReturns\n\u001b[0;31m[  FAILED  ] \u001b[mExpectNonfatalFailureTest.FailsWhenStatementThrows\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenStatementReturns\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFatalFailureTest.FailsWhenStatementThrows\n\u001b[0;31m[  FAILED  ] \u001b[mTypedTest/0.Failure, where TypeParam = int\n\u001b[0;31m[  FAILED  ] \u001b[mUnsigned/TypedTestP/0.Failure, where TypeParam = unsigned char\n\u001b[0;31m[  FAILED  ] \u001b[mUnsigned/TypedTestP/1.Failure, where TypeParam = unsigned int\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectFatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectNonFatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectFatalFailureOnAllThreads\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureTest.ExpectNonFatalFailureOnAllThreads\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureWithThreadsTest.ExpectFatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mExpectFailureWithThreadsTest.ExpectNonFatalFailure\n\u001b[0;31m[  FAILED  ] \u001b[mScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread\n\n39 FAILED TESTS\n\u001b[0;33m  YOU HAVE 1 DISABLED TEST\n\n\u001b[mNote: Google Test filter = FatalFailureTest.*:LoggingTest.*\n[==========] Running 4 tests from 2 test cases.\n[----------] Global test environment set-up.\n[----------] 3 tests from FatalFailureTest\n[ RUN      ] FatalFailureTest.FatalFailureInSubroutine\n(expecting a failure that x should be 1)\ngtest_output_test_.cc:#: Failure\nValue of: x\n  Actual: 2\nExpected: 1\n[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine (? ms)\n[ RUN      ] FatalFailureTest.FatalFailureInNestedSubroutine\n(expecting a failure that x should be 1)\ngtest_output_test_.cc:#: Failure\nValue of: x\n  Actual: 2\nExpected: 1\n[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine (? ms)\n[ RUN      ] FatalFailureTest.NonfatalFailureInSubroutine\n(expecting a failure on false)\ngtest_output_test_.cc:#: Failure\nValue of: false\n  Actual: false\nExpected: true\n[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine (? ms)\n[----------] 3 tests from FatalFailureTest (? ms total)\n\n[----------] 1 test from LoggingTest\n[ RUN      ] LoggingTest.InterleavingLoggingAndAssertions\n(expecting 2 failures on (3) >= (a[i]))\ni == 0\ni == 1\ngtest_output_test_.cc:#: Failure\nExpected: (3) >= (a[i]), actual: 3 vs 9\ni == 2\ni == 3\ngtest_output_test_.cc:#: Failure\nExpected: (3) >= (a[i]), actual: 3 vs 6\n[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions (? ms)\n[----------] 1 test from LoggingTest (? ms total)\n\n[----------] Global test environment tear-down\n[==========] 4 tests from 2 test cases ran. (? ms total)\n[  PASSED  ] 0 tests.\n[  FAILED  ] 4 tests, listed below:\n[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine\n[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine\n[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine\n[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions\n\n 4 FAILED TESTS\n  YOU HAVE 1 DISABLED TEST\n\nNote: Google Test filter = *DISABLED_*\n[==========] Running 1 test from 1 test case.\n[----------] Global test environment set-up.\n[----------] 1 test from DisabledTestsWarningTest\n[ RUN      ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning\n[       OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning\n[----------] Global test environment tear-down\n[==========] 1 test from 1 test case ran.\n[  PASSED  ] 1 test.\nNote: Google Test filter = PassingTest.*\nNote: This is test shard 1 of 2.\n[==========] Running 1 test from 1 test case.\n[----------] Global test environment set-up.\n[----------] 1 test from PassingTest\n[ RUN      ] PassingTest.PassingTest2\n[       OK ] PassingTest.PassingTest2\n[----------] Global test environment tear-down\n[==========] 1 test from 1 test case ran.\n[  PASSED  ] 1 test.\n\n  YOU HAVE 1 DISABLED TEST\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_win.txt",
    "content": "The non-test part of the code is expected to have 2 failures.\n\ngtest_output_test_.cc:#: error: Value of: false\n  Actual: false\nExpected: true\ngtest_output_test_.cc:#: error: Value of: 3\nExpected: 2\n[==========] Running 61 tests from 27 test cases.\n[----------] Global test environment set-up.\nFooEnvironment::SetUp() called.\nBarEnvironment::SetUp() called.\n[----------] 1 test from ADeathTest\n[ RUN      ] ADeathTest.ShouldRunFirst\n[       OK ] ADeathTest.ShouldRunFirst\n[----------] 1 test from ATypedDeathTest/0, where TypeParam = int\n[ RUN      ] ATypedDeathTest/0.ShouldRunFirst\n[       OK ] ATypedDeathTest/0.ShouldRunFirst\n[----------] 1 test from ATypedDeathTest/1, where TypeParam = double\n[ RUN      ] ATypedDeathTest/1.ShouldRunFirst\n[       OK ] ATypedDeathTest/1.ShouldRunFirst\n[----------] 1 test from My/ATypeParamDeathTest/0, where TypeParam = int\n[ RUN      ] My/ATypeParamDeathTest/0.ShouldRunFirst\n[       OK ] My/ATypeParamDeathTest/0.ShouldRunFirst\n[----------] 1 test from My/ATypeParamDeathTest/1, where TypeParam = double\n[ RUN      ] My/ATypeParamDeathTest/1.ShouldRunFirst\n[       OK ] My/ATypeParamDeathTest/1.ShouldRunFirst\n[----------] 2 tests from PassingTest\n[ RUN      ] PassingTest.PassingTest1\n[       OK ] PassingTest.PassingTest1\n[ RUN      ] PassingTest.PassingTest2\n[       OK ] PassingTest.PassingTest2\n[----------] 3 tests from FatalFailureTest\n[ RUN      ] FatalFailureTest.FatalFailureInSubroutine\n(expecting a failure that x should be 1)\ngtest_output_test_.cc:#: error: Value of: x\n  Actual: 2\nExpected: 1\n[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine\n[ RUN      ] FatalFailureTest.FatalFailureInNestedSubroutine\n(expecting a failure that x should be 1)\ngtest_output_test_.cc:#: error: Value of: x\n  Actual: 2\nExpected: 1\n[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine\n[ RUN      ] FatalFailureTest.NonfatalFailureInSubroutine\n(expecting a failure on false)\ngtest_output_test_.cc:#: error: Value of: false\n  Actual: false\nExpected: true\n[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine\n[----------] 1 test from LoggingTest\n[ RUN      ] LoggingTest.InterleavingLoggingAndAssertions\n(expecting 2 failures on (3) >= (a[i]))\ni == 0\ni == 1\ngtest_output_test_.cc:#: error: Expected: (3) >= (a[i]), actual: 3 vs 9\ni == 2\ni == 3\ngtest_output_test_.cc:#: error: Expected: (3) >= (a[i]), actual: 3 vs 6\n[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions\n[----------] 5 tests from SCOPED_TRACETest\n[ RUN      ] SCOPED_TRACETest.ObeysScopes\n(expected to fail)\ngtest_output_test_.cc:#: error: Failed\nThis failure is expected, and shouldn't have a trace.\ngtest_output_test_.cc:#: error: Failed\nThis failure is expected, and should have a trace.\nGoogle Test trace:\ngtest_output_test_.cc:#: Expected trace\ngtest_output_test_.cc:#: error: Failed\nThis failure is expected, and shouldn't have a trace.\n[  FAILED  ] SCOPED_TRACETest.ObeysScopes\n[ RUN      ] SCOPED_TRACETest.WorksInLoop\n(expected to fail)\ngtest_output_test_.cc:#: error: Value of: n\n  Actual: 1\nExpected: 2\nGoogle Test trace:\ngtest_output_test_.cc:#: i = 1\ngtest_output_test_.cc:#: error: Value of: n\n  Actual: 2\nExpected: 1\nGoogle Test trace:\ngtest_output_test_.cc:#: i = 2\n[  FAILED  ] SCOPED_TRACETest.WorksInLoop\n[ RUN      ] SCOPED_TRACETest.WorksInSubroutine\n(expected to fail)\ngtest_output_test_.cc:#: error: Value of: n\n  Actual: 1\nExpected: 2\nGoogle Test trace:\ngtest_output_test_.cc:#: n = 1\ngtest_output_test_.cc:#: error: Value of: n\n  Actual: 2\nExpected: 1\nGoogle Test trace:\ngtest_output_test_.cc:#: n = 2\n[  FAILED  ] SCOPED_TRACETest.WorksInSubroutine\n[ RUN      ] SCOPED_TRACETest.CanBeNested\n(expected to fail)\ngtest_output_test_.cc:#: error: Value of: n\n  Actual: 2\nExpected: 1\nGoogle Test trace:\ngtest_output_test_.cc:#: n = 2\ngtest_output_test_.cc:#: \n[  FAILED  ] SCOPED_TRACETest.CanBeNested\n[ RUN      ] SCOPED_TRACETest.CanBeRepeated\n(expected to fail)\ngtest_output_test_.cc:#: error: Failed\nThis failure is expected, and should contain trace point A.\nGoogle Test trace:\ngtest_output_test_.cc:#: A\ngtest_output_test_.cc:#: error: Failed\nThis failure is expected, and should contain trace point A and B.\nGoogle Test trace:\ngtest_output_test_.cc:#: B\ngtest_output_test_.cc:#: A\ngtest_output_test_.cc:#: error: Failed\nThis failure is expected, and should contain trace point A, B, and C.\nGoogle Test trace:\ngtest_output_test_.cc:#: C\ngtest_output_test_.cc:#: B\ngtest_output_test_.cc:#: A\ngtest_output_test_.cc:#: error: Failed\nThis failure is expected, and should contain trace point A, B, and D.\nGoogle Test trace:\ngtest_output_test_.cc:#: D\ngtest_output_test_.cc:#: B\ngtest_output_test_.cc:#: A\n[  FAILED  ] SCOPED_TRACETest.CanBeRepeated\n[----------] 1 test from NonFatalFailureInFixtureConstructorTest\n[ RUN      ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor\n(expecting 5 failures)\ngtest_output_test_.cc:#: error: Failed\nExpected failure #1, in the test fixture c'tor.\ngtest_output_test_.cc:#: error: Failed\nExpected failure #2, in SetUp().\ngtest_output_test_.cc:#: error: Failed\nExpected failure #3, in the test body.\ngtest_output_test_.cc:#: error: Failed\nExpected failure #4, in TearDown.\ngtest_output_test_.cc:#: error: Failed\nExpected failure #5, in the test fixture d'tor.\n[  FAILED  ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor\n[----------] 1 test from FatalFailureInFixtureConstructorTest\n[ RUN      ] FatalFailureInFixtureConstructorTest.FailureInConstructor\n(expecting 2 failures)\ngtest_output_test_.cc:#: error: Failed\nExpected failure #1, in the test fixture c'tor.\ngtest_output_test_.cc:#: error: Failed\nExpected failure #2, in the test fixture d'tor.\n[  FAILED  ] FatalFailureInFixtureConstructorTest.FailureInConstructor\n[----------] 1 test from NonFatalFailureInSetUpTest\n[ RUN      ] NonFatalFailureInSetUpTest.FailureInSetUp\n(expecting 4 failures)\ngtest_output_test_.cc:#: error: Failed\nExpected failure #1, in SetUp().\ngtest_output_test_.cc:#: error: Failed\nExpected failure #2, in the test function.\ngtest_output_test_.cc:#: error: Failed\nExpected failure #3, in TearDown().\ngtest_output_test_.cc:#: error: Failed\nExpected failure #4, in the test fixture d'tor.\n[  FAILED  ] NonFatalFailureInSetUpTest.FailureInSetUp\n[----------] 1 test from FatalFailureInSetUpTest\n[ RUN      ] FatalFailureInSetUpTest.FailureInSetUp\n(expecting 3 failures)\ngtest_output_test_.cc:#: error: Failed\nExpected failure #1, in SetUp().\ngtest_output_test_.cc:#: error: Failed\nExpected failure #2, in TearDown().\ngtest_output_test_.cc:#: error: Failed\nExpected failure #3, in the test fixture d'tor.\n[  FAILED  ] FatalFailureInSetUpTest.FailureInSetUp\n[----------] 1 test from ExceptionInFixtureCtorTest\n[ RUN      ] ExceptionInFixtureCtorTest.ExceptionInFixtureCtor\n(expecting a failure on thrown exception in the test fixture's constructor)\nunknown file: error: Exception thrown with code 0xc0000005 in the test fixture's constructor.\n[----------] 1 test from ExceptionInSetUpTest\n[ RUN      ] ExceptionInSetUpTest.ExceptionInSetUp\n(expecting 3 failures)\nunknown file: error: Exception thrown with code 0xc0000005 in SetUp().\ngtest_output_test_.cc:#: error: Failed\nExpected failure #2, in TearDown().\ngtest_output_test_.cc:#: error: Failed\nExpected failure #3, in the test fixture d'tor.\n[  FAILED  ] ExceptionInSetUpTest.ExceptionInSetUp\n[----------] 2 tests from ExceptionInTestFunctionTest\n[ RUN      ] ExceptionInTestFunctionTest.SEH\n(expecting 3 failures)\nunknown file: error: Exception thrown with code 0xc0000005 in the test body.\ngtest_output_test_.cc:#: error: Failed\nExpected failure #2, in TearDown().\ngtest_output_test_.cc:#: error: Failed\nExpected failure #3, in the test fixture d'tor.\n[  FAILED  ] ExceptionInTestFunctionTest.SEH\n[ RUN      ] ExceptionInTestFunctionTest.CppException\nunknown file: error: Exception thrown with code 0xe06d7363 in the test body.\ngtest_output_test_.cc:#: error: Failed\nExpected failure #2, in TearDown().\ngtest_output_test_.cc:#: error: Failed\nExpected failure #3, in the test fixture d'tor.\n[  FAILED  ] ExceptionInTestFunctionTest.CppException\n[----------] 1 test from ExceptionInTearDownTest\n[ RUN      ] ExceptionInTearDownTest.ExceptionInTearDown\n(expecting 2 failures)\nunknown file: error: Exception thrown with code 0xe06d7363 in TearDown().\ngtest_output_test_.cc:#: error: Failed\nExpected failure #2, in the test fixture d'tor.\n[  FAILED  ] ExceptionInTearDownTest.ExceptionInTearDown\n[----------] 4 tests from MixedUpTestCaseTest\n[ RUN      ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo\n[       OK ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo\n[ RUN      ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo\n[       OK ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo\n[ RUN      ] MixedUpTestCaseTest.ThisShouldFail\ngtest.cc:#: error: Failed\nAll tests in the same test case must use the same test fixture\nclass.  However, in test case MixedUpTestCaseTest,\nyou defined test FirstTestFromNamespaceFoo and test ThisShouldFail\nusing two different test fixture classes.  This can happen if\nthe two classes are from different namespaces or translation\nunits and have the same name.  You should probably rename one\nof the classes to put the tests into different test cases.\n[  FAILED  ] MixedUpTestCaseTest.ThisShouldFail\n[ RUN      ] MixedUpTestCaseTest.ThisShouldFailToo\ngtest.cc:#: error: Failed\nAll tests in the same test case must use the same test fixture\nclass.  However, in test case MixedUpTestCaseTest,\nyou defined test FirstTestFromNamespaceFoo and test ThisShouldFailToo\nusing two different test fixture classes.  This can happen if\nthe two classes are from different namespaces or translation\nunits and have the same name.  You should probably rename one\nof the classes to put the tests into different test cases.\n[  FAILED  ] MixedUpTestCaseTest.ThisShouldFailToo\n[----------] 2 tests from MixedUpTestCaseWithSameTestNameTest\n[ RUN      ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\n[       OK ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\n[ RUN      ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\ngtest.cc:#: error: Failed\nAll tests in the same test case must use the same test fixture\nclass.  However, in test case MixedUpTestCaseWithSameTestNameTest,\nyou defined test TheSecondTestWithThisNameShouldFail and test TheSecondTestWithThisNameShouldFail\nusing two different test fixture classes.  This can happen if\nthe two classes are from different namespaces or translation\nunits and have the same name.  You should probably rename one\nof the classes to put the tests into different test cases.\n[  FAILED  ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\n[----------] 2 tests from TEST_F_before_TEST_in_same_test_case\n[ RUN      ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F\n[       OK ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F\n[ RUN      ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail\ngtest.cc:#: error: Failed\nAll tests in the same test case must use the same test fixture\nclass, so mixing TEST_F and TEST in the same test case is\nillegal.  In test case TEST_F_before_TEST_in_same_test_case,\ntest DefinedUsingTEST_F is defined using TEST_F but\ntest DefinedUsingTESTAndShouldFail is defined using TEST.  You probably\nwant to change the TEST to TEST_F or move it to another test\ncase.\n[  FAILED  ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail\n[----------] 2 tests from TEST_before_TEST_F_in_same_test_case\n[ RUN      ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST\n[       OK ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST\n[ RUN      ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail\ngtest.cc:#: error: Failed\nAll tests in the same test case must use the same test fixture\nclass, so mixing TEST_F and TEST in the same test case is\nillegal.  In test case TEST_before_TEST_F_in_same_test_case,\ntest DefinedUsingTEST_FAndShouldFail is defined using TEST_F but\ntest DefinedUsingTEST is defined using TEST.  You probably\nwant to change the TEST to TEST_F or move it to another test\ncase.\n[  FAILED  ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail\n[----------] 8 tests from ExpectNonfatalFailureTest\n[ RUN      ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables\n[       OK ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables\n[ RUN      ] ExpectNonfatalFailureTest.CanReferenceLocalVariables\n[       OK ] ExpectNonfatalFailureTest.CanReferenceLocalVariables\n[ RUN      ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure\n[       OK ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure\n[ RUN      ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure\n(expecting a failure)\ngtest.cc:#: error: Expected: 1 non-fatal failure\n  Actual: 0 failures\n[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure\n[ RUN      ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures\n(expecting a failure)\ngtest.cc:#: error: Expected: 1 non-fatal failure\n  Actual: 2 failures\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure 1.\n\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure 2.\n\n[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures\n[ RUN      ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure\n(expecting a failure)\ngtest.cc:#: error: Expected: 1 non-fatal failure\n  Actual:\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\n[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure\n[ RUN      ] ExpectNonfatalFailureTest.FailsWhenStatementReturns\n(expecting a failure)\ngtest.cc:#: error: Expected: 1 non-fatal failure\n  Actual: 0 failures\n[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementReturns\n[ RUN      ] ExpectNonfatalFailureTest.FailsWhenStatementThrows\n(expecting a failure)\ngtest.cc:#: error: Expected: 1 non-fatal failure\n  Actual: 0 failures\n[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementThrows\n[----------] 8 tests from ExpectFatalFailureTest\n[ RUN      ] ExpectFatalFailureTest.CanReferenceGlobalVariables\n[       OK ] ExpectFatalFailureTest.CanReferenceGlobalVariables\n[ RUN      ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables\n[       OK ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables\n[ RUN      ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure\n[       OK ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure\n[ RUN      ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure\n(expecting a failure)\ngtest.cc:#: error: Expected: 1 fatal failure\n  Actual: 0 failures\n[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure\n[ RUN      ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures\n(expecting a failure)\ngtest.cc:#: error: Expected: 1 fatal failure\n  Actual: 2 failures\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\n[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures\n[ RUN      ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure\n(expecting a failure)\ngtest.cc:#: error: Expected: 1 fatal failure\n  Actual:\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\n\n[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure\n[ RUN      ] ExpectFatalFailureTest.FailsWhenStatementReturns\n(expecting a failure)\ngtest.cc:#: error: Expected: 1 fatal failure\n  Actual: 0 failures\n[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementReturns\n[ RUN      ] ExpectFatalFailureTest.FailsWhenStatementThrows\n(expecting a failure)\ngtest.cc:#: error: Expected: 1 fatal failure\n  Actual: 0 failures\n[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementThrows\n[----------] 2 tests from TypedTest/0, where TypeParam = int\n[ RUN      ] TypedTest/0.Success\n[       OK ] TypedTest/0.Success\n[ RUN      ] TypedTest/0.Failure\ngtest_output_test_.cc:#: error: Value of: TypeParam()\n  Actual: 0\nExpected: 1\nExpected failure\n[  FAILED  ] TypedTest/0.Failure\n[----------] 2 tests from Unsigned/TypedTestP/0, where TypeParam = unsigned char\n[ RUN      ] Unsigned/TypedTestP/0.Success\n[       OK ] Unsigned/TypedTestP/0.Success\n[ RUN      ] Unsigned/TypedTestP/0.Failure\ngtest_output_test_.cc:#: error: Value of: TypeParam()\n  Actual: \\0\nExpected: 1U\nWhich is: 1\nExpected failure\n[  FAILED  ] Unsigned/TypedTestP/0.Failure\n[----------] 2 tests from Unsigned/TypedTestP/1, where TypeParam = unsigned int\n[ RUN      ] Unsigned/TypedTestP/1.Success\n[       OK ] Unsigned/TypedTestP/1.Success\n[ RUN      ] Unsigned/TypedTestP/1.Failure\ngtest_output_test_.cc:#: error: Value of: TypeParam()\n  Actual: 0\nExpected: 1U\nWhich is: 1\nExpected failure\n[  FAILED  ] Unsigned/TypedTestP/1.Failure\n[----------] 4 tests from ExpectFailureTest\n[ RUN      ] ExpectFailureTest.ExpectFatalFailure\n(expecting 1 failure)\ngtest.cc:#: error: Expected: 1 fatal failure\n  Actual:\ngtest_output_test_.cc:#: Success:\nSucceeded\n\n(expecting 1 failure)\ngtest.cc:#: error: Expected: 1 fatal failure\n  Actual:\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\n\n(expecting 1 failure)\ngtest.cc:#: error: Expected: 1 fatal failure containing \"Some other fatal failure expected.\"\n  Actual:\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\n[  FAILED  ] ExpectFailureTest.ExpectFatalFailure\n[ RUN      ] ExpectFailureTest.ExpectNonFatalFailure\n(expecting 1 failure)\ngtest.cc:#: error: Expected: 1 non-fatal failure\n  Actual:\ngtest_output_test_.cc:#: Success:\nSucceeded\n\n(expecting 1 failure)\ngtest.cc:#: error: Expected: 1 non-fatal failure\n  Actual:\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\n(expecting 1 failure)\ngtest.cc:#: error: Expected: 1 non-fatal failure containing \"Some other non-fatal failure.\"\n  Actual:\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\n\n[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailure\n[ RUN      ] ExpectFailureTest.ExpectFatalFailureOnAllThreads\n(expecting 1 failure)\ngtest.cc:#: error: Expected: 1 fatal failure\n  Actual:\ngtest_output_test_.cc:#: Success:\nSucceeded\n\n(expecting 1 failure)\ngtest.cc:#: error: Expected: 1 fatal failure\n  Actual:\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\n\n(expecting 1 failure)\ngtest.cc:#: error: Expected: 1 fatal failure containing \"Some other fatal failure expected.\"\n  Actual:\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\n[  FAILED  ] ExpectFailureTest.ExpectFatalFailureOnAllThreads\n[ RUN      ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads\n(expecting 1 failure)\ngtest.cc:#: error: Expected: 1 non-fatal failure\n  Actual:\ngtest_output_test_.cc:#: Success:\nSucceeded\n\n(expecting 1 failure)\ngtest.cc:#: error: Expected: 1 non-fatal failure\n  Actual:\ngtest_output_test_.cc:#: Fatal failure:\nFailed\nExpected fatal failure.\n\n(expecting 1 failure)\ngtest.cc:#: error: Expected: 1 non-fatal failure containing \"Some other non-fatal failure.\"\n  Actual:\ngtest_output_test_.cc:#: Non-fatal failure:\nFailed\nExpected non-fatal failure.\n\n[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads\n[----------] Global test environment tear-down\nBarEnvironment::TearDown() called.\ngtest_output_test_.cc:#: error: Failed\nExpected non-fatal failure.\nFooEnvironment::TearDown() called.\ngtest_output_test_.cc:#: error: Failed\nExpected fatal failure.\n[==========] 61 tests from 27 test cases ran.\n[  PASSED  ] 21 tests.\n[  FAILED  ] 40 tests, listed below:\n[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine\n[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine\n[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine\n[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions\n[  FAILED  ] SCOPED_TRACETest.ObeysScopes\n[  FAILED  ] SCOPED_TRACETest.WorksInLoop\n[  FAILED  ] SCOPED_TRACETest.WorksInSubroutine\n[  FAILED  ] SCOPED_TRACETest.CanBeNested\n[  FAILED  ] SCOPED_TRACETest.CanBeRepeated\n[  FAILED  ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor\n[  FAILED  ] FatalFailureInFixtureConstructorTest.FailureInConstructor\n[  FAILED  ] NonFatalFailureInSetUpTest.FailureInSetUp\n[  FAILED  ] FatalFailureInSetUpTest.FailureInSetUp\n[  FAILED  ] ExceptionInFixtureCtorTest.ExceptionInFixtureCtor\n[  FAILED  ] ExceptionInSetUpTest.ExceptionInSetUp\n[  FAILED  ] ExceptionInTestFunctionTest.SEH\n[  FAILED  ] ExceptionInTestFunctionTest.CppException\n[  FAILED  ] ExceptionInTearDownTest.ExceptionInTearDown\n[  FAILED  ] MixedUpTestCaseTest.ThisShouldFail\n[  FAILED  ] MixedUpTestCaseTest.ThisShouldFailToo\n[  FAILED  ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail\n[  FAILED  ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail\n[  FAILED  ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail\n[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure\n[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures\n[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure\n[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementReturns\n[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementThrows\n[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure\n[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures\n[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure\n[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementReturns\n[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementThrows\n[  FAILED  ] TypedTest/0.Failure, where TypeParam = int\n[  FAILED  ] Unsigned/TypedTestP/0.Failure, where TypeParam = unsigned char\n[  FAILED  ] Unsigned/TypedTestP/1.Failure, where TypeParam = unsigned int\n[  FAILED  ] ExpectFailureTest.ExpectFatalFailure\n[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailure\n[  FAILED  ] ExpectFailureTest.ExpectFatalFailureOnAllThreads\n[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads\n\n40 FAILED TESTS\n  YOU HAVE 1 DISABLED TEST\n\nNote: Google Test filter = FatalFailureTest.*:LoggingTest.*\n[==========] Running 4 tests from 2 test cases.\n[----------] Global test environment set-up.\n[----------] 3 tests from FatalFailureTest\n[ RUN      ] FatalFailureTest.FatalFailureInSubroutine\n(expecting a failure that x should be 1)\ngtest_output_test_.cc:#: error: Value of: x\n  Actual: 2\nExpected: 1\n[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine (? ms)\n[ RUN      ] FatalFailureTest.FatalFailureInNestedSubroutine\n(expecting a failure that x should be 1)\ngtest_output_test_.cc:#: error: Value of: x\n  Actual: 2\nExpected: 1\n[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine (? ms)\n[ RUN      ] FatalFailureTest.NonfatalFailureInSubroutine\n(expecting a failure on false)\ngtest_output_test_.cc:#: error: Value of: false\n  Actual: false\nExpected: true\n[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine (? ms)\n[----------] 3 tests from FatalFailureTest (? ms total)\n\n[----------] 1 test from LoggingTest\n[ RUN      ] LoggingTest.InterleavingLoggingAndAssertions\n(expecting 2 failures on (3) >= (a[i]))\ni == 0\ni == 1\ngtest_output_test_.cc:#: error: Expected: (3) >= (a[i]), actual: 3 vs 9\ni == 2\ni == 3\ngtest_output_test_.cc:#: error: Expected: (3) >= (a[i]), actual: 3 vs 6\n[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions (? ms)\n[----------] 1 test from LoggingTest (? ms total)\n\n[----------] Global test environment tear-down\n[==========] 4 tests from 2 test cases ran. (? ms total)\n[  PASSED  ] 0 tests.\n[  FAILED  ] 4 tests, listed below:\n[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine\n[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine\n[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine\n[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions\n\n 4 FAILED TESTS\n  YOU HAVE 1 DISABLED TEST\n\nNote: Google Test filter = *DISABLED_*\n[==========] Running 1 test from 1 test case.\n[----------] Global test environment set-up.\n[----------] 1 test from DisabledTestsWarningTest\n[ RUN      ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning\n[       OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning\n[----------] Global test environment tear-down\n[==========] 1 test from 1 test case ran.\n[  PASSED  ] 1 test.\nNote: Google Test filter = PassingTest.*\nNote: This is test shard 1 of 2.\n[==========] Running 1 test from 1 test case.\n[----------] Global test environment set-up.\n[----------] 1 test from PassingTest\n[ RUN      ] PassingTest.PassingTest2\n[       OK ] PassingTest.PassingTest2\n[----------] Global test environment tear-down\n[==========] 1 test from 1 test case ran.\n[  PASSED  ] 1 test.\n\n  YOU HAVE 1 DISABLED TEST\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_pred_impl_unittest.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// This file is AUTOMATICALLY GENERATED on 10/02/2008 by command\n// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!\n\n// Regression test for gtest_pred_impl.h\n//\n// This file is generated by a script and quite long.  If you intend to\n// learn how Google Test works by reading its unit tests, read\n// gtest_unittest.cc instead.\n//\n// This is intended as a regression test for the Google Test predicate\n// assertions.  We compile it as part of the gtest_unittest target\n// only to keep the implementation tidy and compact, as it is quite\n// involved to set up the stage for testing Google Test using Google\n// Test itself.\n//\n// Currently, gtest_unittest takes ~11 seconds to run in the testing\n// daemon.  In the future, if it grows too large and needs much more\n// time to finish, we should consider separating this file into a\n// stand-alone regression test.\n\n#include <iostream>\n\n#include <gtest/gtest.h>\n#include <gtest/gtest-spi.h>\n\n// A user-defined data type.\nstruct Bool {\n  explicit Bool(int val) : value(val != 0) {}\n\n  bool operator>(int n) const { return value > Bool(n).value; }\n\n  Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }\n\n  bool operator==(const Bool& rhs) const { return value == rhs.value; }\n\n  bool value;\n};\n\n// Enables Bool to be used in assertions.\nstd::ostream& operator<<(std::ostream& os, const Bool& x) {\n  return os << (x.value ? \"true\" : \"false\");\n}\n\n// Sample functions/functors for testing unary predicate assertions.\n\n// A unary predicate function.\ntemplate <typename T1>\nbool PredFunction1(T1 v1) {\n  return v1 > 0;\n}\n\n// The following two functions are needed to circumvent a bug in\n// gcc 2.95.3, which sometimes has problem with the above template\n// function.\nbool PredFunction1Int(int v1) {\n  return v1 > 0;\n}\nbool PredFunction1Bool(Bool v1) {\n  return v1 > 0;\n}\n\n// A unary predicate functor.\nstruct PredFunctor1 {\n  template <typename T1>\n  bool operator()(const T1& v1) {\n    return v1 > 0;\n  }\n};\n\n// A unary predicate-formatter function.\ntemplate <typename T1>\ntesting::AssertionResult PredFormatFunction1(const char* e1,\n                                             const T1& v1) {\n  if (PredFunction1(v1))\n    return testing::AssertionSuccess();\n\n  testing::Message msg;\n  msg << e1\n      << \" is expected to be positive, but evaluates to \"\n      << v1 << \".\";\n  return testing::AssertionFailure(msg);\n}\n\n// A unary predicate-formatter functor.\nstruct PredFormatFunctor1 {\n  template <typename T1>\n  testing::AssertionResult operator()(const char* e1,\n                                      const T1& v1) const {\n    return PredFormatFunction1(e1, v1);\n  }\n};\n\n// Tests for {EXPECT|ASSERT}_PRED_FORMAT1.\n\nclass Predicate1Test : public testing::Test {\n protected:\n  virtual void SetUp() {\n    expected_to_finish_ = true;\n    finished_ = false;\n    n1_ = 0;\n  }\n\n  virtual void TearDown() {\n    // Verifies that each of the predicate's arguments was evaluated\n    // exactly once.\n    EXPECT_EQ(1, n1_) <<\n        \"The predicate assertion didn't evaluate argument 2 \"\n        \"exactly once.\";\n\n    // Verifies that the control flow in the test function is expected.\n    if (expected_to_finish_ && !finished_) {\n      FAIL() << \"The predicate assertion unexpactedly aborted the test.\";\n    } else if (!expected_to_finish_ && finished_) {\n      FAIL() << \"The failed predicate assertion didn't abort the test \"\n                \"as expected.\";\n    }\n  }\n\n  // true iff the test function is expected to run to finish.\n  static bool expected_to_finish_;\n\n  // true iff the test function did run to finish.\n  static bool finished_;\n\n  static int n1_;\n};\n\nbool Predicate1Test::expected_to_finish_;\nbool Predicate1Test::finished_;\nint Predicate1Test::n1_;\n\ntypedef Predicate1Test EXPECT_PRED_FORMAT1Test;\ntypedef Predicate1Test ASSERT_PRED_FORMAT1Test;\ntypedef Predicate1Test EXPECT_PRED1Test;\ntypedef Predicate1Test ASSERT_PRED1Test;\n\n// Tests a successful EXPECT_PRED1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED1(PredFunction1Int,\n               ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED1Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED1(PredFunction1Bool,\n               Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED1(PredFunctor1(),\n               ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED1Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED1(PredFunctor1(),\n               Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED1(PredFunction1Int,\n                 n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED1Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED1(PredFunction1Bool,\n                 Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED1(PredFunctor1(),\n                 n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED1Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED1(PredFunctor1(),\n                 Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED1(PredFunction1Int,\n               ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED1Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED1(PredFunction1Bool,\n               Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED1(PredFunctor1(),\n               ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED1Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED1(PredFunctor1(),\n               Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED1(PredFunction1Int,\n                 n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED1Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED1(PredFunction1Bool,\n                 Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED1(PredFunctor1(),\n                 n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED1Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED1(PredFunctor1(),\n                 Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT1(PredFormatFunction1,\n                      ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT1(PredFormatFunction1,\n                      Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT1(PredFormatFunctor1(),\n                      ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT1(PredFormatFunctor1(),\n                      Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT1(PredFormatFunction1,\n                        n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT1(PredFormatFunction1,\n                        Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT1(PredFormatFunctor1(),\n                        n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT1(PredFormatFunctor1(),\n                        Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT1(PredFormatFunction1,\n                      ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT1(PredFormatFunction1,\n                      Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT1(PredFormatFunctor1(),\n                      ++n1_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT1(PredFormatFunctor1(),\n                      Bool(++n1_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT1(PredFormatFunction1,\n                        n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT1(PredFormatFunction1,\n                        Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT1(PredFormatFunctor1(),\n                        n1_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT1 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT1(PredFormatFunctor1(),\n                        Bool(n1_++));\n    finished_ = true;\n  }, \"\");\n}\n// Sample functions/functors for testing binary predicate assertions.\n\n// A binary predicate function.\ntemplate <typename T1, typename T2>\nbool PredFunction2(T1 v1, T2 v2) {\n  return v1 + v2 > 0;\n}\n\n// The following two functions are needed to circumvent a bug in\n// gcc 2.95.3, which sometimes has problem with the above template\n// function.\nbool PredFunction2Int(int v1, int v2) {\n  return v1 + v2 > 0;\n}\nbool PredFunction2Bool(Bool v1, Bool v2) {\n  return v1 + v2 > 0;\n}\n\n// A binary predicate functor.\nstruct PredFunctor2 {\n  template <typename T1, typename T2>\n  bool operator()(const T1& v1,\n                  const T2& v2) {\n    return v1 + v2 > 0;\n  }\n};\n\n// A binary predicate-formatter function.\ntemplate <typename T1, typename T2>\ntesting::AssertionResult PredFormatFunction2(const char* e1,\n                                             const char* e2,\n                                             const T1& v1,\n                                             const T2& v2) {\n  if (PredFunction2(v1, v2))\n    return testing::AssertionSuccess();\n\n  testing::Message msg;\n  msg << e1 << \" + \" << e2\n      << \" is expected to be positive, but evaluates to \"\n      << v1 + v2 << \".\";\n  return testing::AssertionFailure(msg);\n}\n\n// A binary predicate-formatter functor.\nstruct PredFormatFunctor2 {\n  template <typename T1, typename T2>\n  testing::AssertionResult operator()(const char* e1,\n                                      const char* e2,\n                                      const T1& v1,\n                                      const T2& v2) const {\n    return PredFormatFunction2(e1, e2, v1, v2);\n  }\n};\n\n// Tests for {EXPECT|ASSERT}_PRED_FORMAT2.\n\nclass Predicate2Test : public testing::Test {\n protected:\n  virtual void SetUp() {\n    expected_to_finish_ = true;\n    finished_ = false;\n    n1_ = n2_ = 0;\n  }\n\n  virtual void TearDown() {\n    // Verifies that each of the predicate's arguments was evaluated\n    // exactly once.\n    EXPECT_EQ(1, n1_) <<\n        \"The predicate assertion didn't evaluate argument 2 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n2_) <<\n        \"The predicate assertion didn't evaluate argument 3 \"\n        \"exactly once.\";\n\n    // Verifies that the control flow in the test function is expected.\n    if (expected_to_finish_ && !finished_) {\n      FAIL() << \"The predicate assertion unexpactedly aborted the test.\";\n    } else if (!expected_to_finish_ && finished_) {\n      FAIL() << \"The failed predicate assertion didn't abort the test \"\n                \"as expected.\";\n    }\n  }\n\n  // true iff the test function is expected to run to finish.\n  static bool expected_to_finish_;\n\n  // true iff the test function did run to finish.\n  static bool finished_;\n\n  static int n1_;\n  static int n2_;\n};\n\nbool Predicate2Test::expected_to_finish_;\nbool Predicate2Test::finished_;\nint Predicate2Test::n1_;\nint Predicate2Test::n2_;\n\ntypedef Predicate2Test EXPECT_PRED_FORMAT2Test;\ntypedef Predicate2Test ASSERT_PRED_FORMAT2Test;\ntypedef Predicate2Test EXPECT_PRED2Test;\ntypedef Predicate2Test ASSERT_PRED2Test;\n\n// Tests a successful EXPECT_PRED2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED2(PredFunction2Int,\n               ++n1_,\n               ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED2Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED2(PredFunction2Bool,\n               Bool(++n1_),\n               Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED2(PredFunctor2(),\n               ++n1_,\n               ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED2Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED2(PredFunctor2(),\n               Bool(++n1_),\n               Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED2(PredFunction2Int,\n                 n1_++,\n                 n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED2Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED2(PredFunction2Bool,\n                 Bool(n1_++),\n                 Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED2(PredFunctor2(),\n                 n1_++,\n                 n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED2Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED2(PredFunctor2(),\n                 Bool(n1_++),\n                 Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED2(PredFunction2Int,\n               ++n1_,\n               ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED2Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED2(PredFunction2Bool,\n               Bool(++n1_),\n               Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED2(PredFunctor2(),\n               ++n1_,\n               ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED2Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED2(PredFunctor2(),\n               Bool(++n1_),\n               Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED2(PredFunction2Int,\n                 n1_++,\n                 n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED2Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED2(PredFunction2Bool,\n                 Bool(n1_++),\n                 Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED2(PredFunctor2(),\n                 n1_++,\n                 n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED2Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED2(PredFunctor2(),\n                 Bool(n1_++),\n                 Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT2(PredFormatFunction2,\n                      ++n1_,\n                      ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT2(PredFormatFunction2,\n                      Bool(++n1_),\n                      Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT2(PredFormatFunctor2(),\n                      ++n1_,\n                      ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT2(PredFormatFunctor2(),\n                      Bool(++n1_),\n                      Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(PredFormatFunction2,\n                        n1_++,\n                        n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(PredFormatFunction2,\n                        Bool(n1_++),\n                        Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(PredFormatFunctor2(),\n                        n1_++,\n                        n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(PredFormatFunctor2(),\n                        Bool(n1_++),\n                        Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT2(PredFormatFunction2,\n                      ++n1_,\n                      ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT2(PredFormatFunction2,\n                      Bool(++n1_),\n                      Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT2(PredFormatFunctor2(),\n                      ++n1_,\n                      ++n2_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT2(PredFormatFunctor2(),\n                      Bool(++n1_),\n                      Bool(++n2_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT2(PredFormatFunction2,\n                        n1_++,\n                        n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT2(PredFormatFunction2,\n                        Bool(n1_++),\n                        Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT2(PredFormatFunctor2(),\n                        n1_++,\n                        n2_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT2 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT2(PredFormatFunctor2(),\n                        Bool(n1_++),\n                        Bool(n2_++));\n    finished_ = true;\n  }, \"\");\n}\n// Sample functions/functors for testing ternary predicate assertions.\n\n// A ternary predicate function.\ntemplate <typename T1, typename T2, typename T3>\nbool PredFunction3(T1 v1, T2 v2, T3 v3) {\n  return v1 + v2 + v3 > 0;\n}\n\n// The following two functions are needed to circumvent a bug in\n// gcc 2.95.3, which sometimes has problem with the above template\n// function.\nbool PredFunction3Int(int v1, int v2, int v3) {\n  return v1 + v2 + v3 > 0;\n}\nbool PredFunction3Bool(Bool v1, Bool v2, Bool v3) {\n  return v1 + v2 + v3 > 0;\n}\n\n// A ternary predicate functor.\nstruct PredFunctor3 {\n  template <typename T1, typename T2, typename T3>\n  bool operator()(const T1& v1,\n                  const T2& v2,\n                  const T3& v3) {\n    return v1 + v2 + v3 > 0;\n  }\n};\n\n// A ternary predicate-formatter function.\ntemplate <typename T1, typename T2, typename T3>\ntesting::AssertionResult PredFormatFunction3(const char* e1,\n                                             const char* e2,\n                                             const char* e3,\n                                             const T1& v1,\n                                             const T2& v2,\n                                             const T3& v3) {\n  if (PredFunction3(v1, v2, v3))\n    return testing::AssertionSuccess();\n\n  testing::Message msg;\n  msg << e1 << \" + \" << e2 << \" + \" << e3\n      << \" is expected to be positive, but evaluates to \"\n      << v1 + v2 + v3 << \".\";\n  return testing::AssertionFailure(msg);\n}\n\n// A ternary predicate-formatter functor.\nstruct PredFormatFunctor3 {\n  template <typename T1, typename T2, typename T3>\n  testing::AssertionResult operator()(const char* e1,\n                                      const char* e2,\n                                      const char* e3,\n                                      const T1& v1,\n                                      const T2& v2,\n                                      const T3& v3) const {\n    return PredFormatFunction3(e1, e2, e3, v1, v2, v3);\n  }\n};\n\n// Tests for {EXPECT|ASSERT}_PRED_FORMAT3.\n\nclass Predicate3Test : public testing::Test {\n protected:\n  virtual void SetUp() {\n    expected_to_finish_ = true;\n    finished_ = false;\n    n1_ = n2_ = n3_ = 0;\n  }\n\n  virtual void TearDown() {\n    // Verifies that each of the predicate's arguments was evaluated\n    // exactly once.\n    EXPECT_EQ(1, n1_) <<\n        \"The predicate assertion didn't evaluate argument 2 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n2_) <<\n        \"The predicate assertion didn't evaluate argument 3 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n3_) <<\n        \"The predicate assertion didn't evaluate argument 4 \"\n        \"exactly once.\";\n\n    // Verifies that the control flow in the test function is expected.\n    if (expected_to_finish_ && !finished_) {\n      FAIL() << \"The predicate assertion unexpactedly aborted the test.\";\n    } else if (!expected_to_finish_ && finished_) {\n      FAIL() << \"The failed predicate assertion didn't abort the test \"\n                \"as expected.\";\n    }\n  }\n\n  // true iff the test function is expected to run to finish.\n  static bool expected_to_finish_;\n\n  // true iff the test function did run to finish.\n  static bool finished_;\n\n  static int n1_;\n  static int n2_;\n  static int n3_;\n};\n\nbool Predicate3Test::expected_to_finish_;\nbool Predicate3Test::finished_;\nint Predicate3Test::n1_;\nint Predicate3Test::n2_;\nint Predicate3Test::n3_;\n\ntypedef Predicate3Test EXPECT_PRED_FORMAT3Test;\ntypedef Predicate3Test ASSERT_PRED_FORMAT3Test;\ntypedef Predicate3Test EXPECT_PRED3Test;\ntypedef Predicate3Test ASSERT_PRED3Test;\n\n// Tests a successful EXPECT_PRED3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED3(PredFunction3Int,\n               ++n1_,\n               ++n2_,\n               ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED3Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED3(PredFunction3Bool,\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED3(PredFunctor3(),\n               ++n1_,\n               ++n2_,\n               ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED3Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED3(PredFunctor3(),\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED3(PredFunction3Int,\n                 n1_++,\n                 n2_++,\n                 n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED3Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED3(PredFunction3Bool,\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED3(PredFunctor3(),\n                 n1_++,\n                 n2_++,\n                 n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED3Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED3(PredFunctor3(),\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED3(PredFunction3Int,\n               ++n1_,\n               ++n2_,\n               ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED3Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED3(PredFunction3Bool,\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED3(PredFunctor3(),\n               ++n1_,\n               ++n2_,\n               ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED3Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED3(PredFunctor3(),\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED3(PredFunction3Int,\n                 n1_++,\n                 n2_++,\n                 n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED3Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED3(PredFunction3Bool,\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED3(PredFunctor3(),\n                 n1_++,\n                 n2_++,\n                 n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED3Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED3(PredFunctor3(),\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT3(PredFormatFunction3,\n                      ++n1_,\n                      ++n2_,\n                      ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT3(PredFormatFunction3,\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT3(PredFormatFunctor3(),\n                      ++n1_,\n                      ++n2_,\n                      ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT3(PredFormatFunctor3(),\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT3(PredFormatFunction3,\n                        n1_++,\n                        n2_++,\n                        n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT3(PredFormatFunction3,\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT3(PredFormatFunctor3(),\n                        n1_++,\n                        n2_++,\n                        n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT3(PredFormatFunctor3(),\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT3(PredFormatFunction3,\n                      ++n1_,\n                      ++n2_,\n                      ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT3(PredFormatFunction3,\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT3(PredFormatFunctor3(),\n                      ++n1_,\n                      ++n2_,\n                      ++n3_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT3(PredFormatFunctor3(),\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT3(PredFormatFunction3,\n                        n1_++,\n                        n2_++,\n                        n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT3(PredFormatFunction3,\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT3(PredFormatFunctor3(),\n                        n1_++,\n                        n2_++,\n                        n3_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT3 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT3(PredFormatFunctor3(),\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++));\n    finished_ = true;\n  }, \"\");\n}\n// Sample functions/functors for testing 4-ary predicate assertions.\n\n// A 4-ary predicate function.\ntemplate <typename T1, typename T2, typename T3, typename T4>\nbool PredFunction4(T1 v1, T2 v2, T3 v3, T4 v4) {\n  return v1 + v2 + v3 + v4 > 0;\n}\n\n// The following two functions are needed to circumvent a bug in\n// gcc 2.95.3, which sometimes has problem with the above template\n// function.\nbool PredFunction4Int(int v1, int v2, int v3, int v4) {\n  return v1 + v2 + v3 + v4 > 0;\n}\nbool PredFunction4Bool(Bool v1, Bool v2, Bool v3, Bool v4) {\n  return v1 + v2 + v3 + v4 > 0;\n}\n\n// A 4-ary predicate functor.\nstruct PredFunctor4 {\n  template <typename T1, typename T2, typename T3, typename T4>\n  bool operator()(const T1& v1,\n                  const T2& v2,\n                  const T3& v3,\n                  const T4& v4) {\n    return v1 + v2 + v3 + v4 > 0;\n  }\n};\n\n// A 4-ary predicate-formatter function.\ntemplate <typename T1, typename T2, typename T3, typename T4>\ntesting::AssertionResult PredFormatFunction4(const char* e1,\n                                             const char* e2,\n                                             const char* e3,\n                                             const char* e4,\n                                             const T1& v1,\n                                             const T2& v2,\n                                             const T3& v3,\n                                             const T4& v4) {\n  if (PredFunction4(v1, v2, v3, v4))\n    return testing::AssertionSuccess();\n\n  testing::Message msg;\n  msg << e1 << \" + \" << e2 << \" + \" << e3 << \" + \" << e4\n      << \" is expected to be positive, but evaluates to \"\n      << v1 + v2 + v3 + v4 << \".\";\n  return testing::AssertionFailure(msg);\n}\n\n// A 4-ary predicate-formatter functor.\nstruct PredFormatFunctor4 {\n  template <typename T1, typename T2, typename T3, typename T4>\n  testing::AssertionResult operator()(const char* e1,\n                                      const char* e2,\n                                      const char* e3,\n                                      const char* e4,\n                                      const T1& v1,\n                                      const T2& v2,\n                                      const T3& v3,\n                                      const T4& v4) const {\n    return PredFormatFunction4(e1, e2, e3, e4, v1, v2, v3, v4);\n  }\n};\n\n// Tests for {EXPECT|ASSERT}_PRED_FORMAT4.\n\nclass Predicate4Test : public testing::Test {\n protected:\n  virtual void SetUp() {\n    expected_to_finish_ = true;\n    finished_ = false;\n    n1_ = n2_ = n3_ = n4_ = 0;\n  }\n\n  virtual void TearDown() {\n    // Verifies that each of the predicate's arguments was evaluated\n    // exactly once.\n    EXPECT_EQ(1, n1_) <<\n        \"The predicate assertion didn't evaluate argument 2 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n2_) <<\n        \"The predicate assertion didn't evaluate argument 3 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n3_) <<\n        \"The predicate assertion didn't evaluate argument 4 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n4_) <<\n        \"The predicate assertion didn't evaluate argument 5 \"\n        \"exactly once.\";\n\n    // Verifies that the control flow in the test function is expected.\n    if (expected_to_finish_ && !finished_) {\n      FAIL() << \"The predicate assertion unexpactedly aborted the test.\";\n    } else if (!expected_to_finish_ && finished_) {\n      FAIL() << \"The failed predicate assertion didn't abort the test \"\n                \"as expected.\";\n    }\n  }\n\n  // true iff the test function is expected to run to finish.\n  static bool expected_to_finish_;\n\n  // true iff the test function did run to finish.\n  static bool finished_;\n\n  static int n1_;\n  static int n2_;\n  static int n3_;\n  static int n4_;\n};\n\nbool Predicate4Test::expected_to_finish_;\nbool Predicate4Test::finished_;\nint Predicate4Test::n1_;\nint Predicate4Test::n2_;\nint Predicate4Test::n3_;\nint Predicate4Test::n4_;\n\ntypedef Predicate4Test EXPECT_PRED_FORMAT4Test;\ntypedef Predicate4Test ASSERT_PRED_FORMAT4Test;\ntypedef Predicate4Test EXPECT_PRED4Test;\ntypedef Predicate4Test ASSERT_PRED4Test;\n\n// Tests a successful EXPECT_PRED4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED4(PredFunction4Int,\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED4Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED4(PredFunction4Bool,\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED4(PredFunctor4(),\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED4Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED4(PredFunctor4(),\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED4(PredFunction4Int,\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED4Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED4(PredFunction4Bool,\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED4(PredFunctor4(),\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED4Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED4(PredFunctor4(),\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED4(PredFunction4Int,\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED4Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED4(PredFunction4Bool,\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED4(PredFunctor4(),\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED4Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED4(PredFunctor4(),\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED4(PredFunction4Int,\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED4Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED4(PredFunction4Bool,\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED4(PredFunctor4(),\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED4Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED4(PredFunctor4(),\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT4(PredFormatFunction4,\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT4(PredFormatFunction4,\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT4(PredFormatFunctor4(),\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT4(PredFormatFunctor4(),\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT4(PredFormatFunction4,\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT4(PredFormatFunction4,\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT4(PredFormatFunctor4(),\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT4(PredFormatFunctor4(),\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT4(PredFormatFunction4,\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT4(PredFormatFunction4,\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT4(PredFormatFunctor4(),\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT4(PredFormatFunctor4(),\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT4(PredFormatFunction4,\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT4(PredFormatFunction4,\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT4(PredFormatFunctor4(),\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT4 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT4(PredFormatFunctor4(),\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++));\n    finished_ = true;\n  }, \"\");\n}\n// Sample functions/functors for testing 5-ary predicate assertions.\n\n// A 5-ary predicate function.\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nbool PredFunction5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) {\n  return v1 + v2 + v3 + v4 + v5 > 0;\n}\n\n// The following two functions are needed to circumvent a bug in\n// gcc 2.95.3, which sometimes has problem with the above template\n// function.\nbool PredFunction5Int(int v1, int v2, int v3, int v4, int v5) {\n  return v1 + v2 + v3 + v4 + v5 > 0;\n}\nbool PredFunction5Bool(Bool v1, Bool v2, Bool v3, Bool v4, Bool v5) {\n  return v1 + v2 + v3 + v4 + v5 > 0;\n}\n\n// A 5-ary predicate functor.\nstruct PredFunctor5 {\n  template <typename T1, typename T2, typename T3, typename T4, typename T5>\n  bool operator()(const T1& v1,\n                  const T2& v2,\n                  const T3& v3,\n                  const T4& v4,\n                  const T5& v5) {\n    return v1 + v2 + v3 + v4 + v5 > 0;\n  }\n};\n\n// A 5-ary predicate-formatter function.\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\ntesting::AssertionResult PredFormatFunction5(const char* e1,\n                                             const char* e2,\n                                             const char* e3,\n                                             const char* e4,\n                                             const char* e5,\n                                             const T1& v1,\n                                             const T2& v2,\n                                             const T3& v3,\n                                             const T4& v4,\n                                             const T5& v5) {\n  if (PredFunction5(v1, v2, v3, v4, v5))\n    return testing::AssertionSuccess();\n\n  testing::Message msg;\n  msg << e1 << \" + \" << e2 << \" + \" << e3 << \" + \" << e4 << \" + \" << e5\n      << \" is expected to be positive, but evaluates to \"\n      << v1 + v2 + v3 + v4 + v5 << \".\";\n  return testing::AssertionFailure(msg);\n}\n\n// A 5-ary predicate-formatter functor.\nstruct PredFormatFunctor5 {\n  template <typename T1, typename T2, typename T3, typename T4, typename T5>\n  testing::AssertionResult operator()(const char* e1,\n                                      const char* e2,\n                                      const char* e3,\n                                      const char* e4,\n                                      const char* e5,\n                                      const T1& v1,\n                                      const T2& v2,\n                                      const T3& v3,\n                                      const T4& v4,\n                                      const T5& v5) const {\n    return PredFormatFunction5(e1, e2, e3, e4, e5, v1, v2, v3, v4, v5);\n  }\n};\n\n// Tests for {EXPECT|ASSERT}_PRED_FORMAT5.\n\nclass Predicate5Test : public testing::Test {\n protected:\n  virtual void SetUp() {\n    expected_to_finish_ = true;\n    finished_ = false;\n    n1_ = n2_ = n3_ = n4_ = n5_ = 0;\n  }\n\n  virtual void TearDown() {\n    // Verifies that each of the predicate's arguments was evaluated\n    // exactly once.\n    EXPECT_EQ(1, n1_) <<\n        \"The predicate assertion didn't evaluate argument 2 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n2_) <<\n        \"The predicate assertion didn't evaluate argument 3 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n3_) <<\n        \"The predicate assertion didn't evaluate argument 4 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n4_) <<\n        \"The predicate assertion didn't evaluate argument 5 \"\n        \"exactly once.\";\n    EXPECT_EQ(1, n5_) <<\n        \"The predicate assertion didn't evaluate argument 6 \"\n        \"exactly once.\";\n\n    // Verifies that the control flow in the test function is expected.\n    if (expected_to_finish_ && !finished_) {\n      FAIL() << \"The predicate assertion unexpactedly aborted the test.\";\n    } else if (!expected_to_finish_ && finished_) {\n      FAIL() << \"The failed predicate assertion didn't abort the test \"\n                \"as expected.\";\n    }\n  }\n\n  // true iff the test function is expected to run to finish.\n  static bool expected_to_finish_;\n\n  // true iff the test function did run to finish.\n  static bool finished_;\n\n  static int n1_;\n  static int n2_;\n  static int n3_;\n  static int n4_;\n  static int n5_;\n};\n\nbool Predicate5Test::expected_to_finish_;\nbool Predicate5Test::finished_;\nint Predicate5Test::n1_;\nint Predicate5Test::n2_;\nint Predicate5Test::n3_;\nint Predicate5Test::n4_;\nint Predicate5Test::n5_;\n\ntypedef Predicate5Test EXPECT_PRED_FORMAT5Test;\ntypedef Predicate5Test ASSERT_PRED_FORMAT5Test;\ntypedef Predicate5Test EXPECT_PRED5Test;\ntypedef Predicate5Test ASSERT_PRED5Test;\n\n// Tests a successful EXPECT_PRED5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED5(PredFunction5Int,\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_,\n               ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED5Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED5(PredFunction5Bool,\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_),\n               Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED5(PredFunctor5(),\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_,\n               ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED5Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED5(PredFunctor5(),\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_),\n               Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED5(PredFunction5Int,\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++,\n                 n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED5Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED5(PredFunction5Bool,\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++),\n                 Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED5(PredFunctor5(),\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++,\n                 n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED5Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED5(PredFunctor5(),\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++),\n                 Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED5(PredFunction5Int,\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_,\n               ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED5Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED5(PredFunction5Bool,\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_),\n               Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED5(PredFunctor5(),\n               ++n1_,\n               ++n2_,\n               ++n3_,\n               ++n4_,\n               ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED5Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED5(PredFunctor5(),\n               Bool(++n1_),\n               Bool(++n2_),\n               Bool(++n3_),\n               Bool(++n4_),\n               Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED5(PredFunction5Int,\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++,\n                 n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED5Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED5(PredFunction5Bool,\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++),\n                 Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED5(PredFunctor5(),\n                 n1_++,\n                 n2_++,\n                 n3_++,\n                 n4_++,\n                 n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED5Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED5(PredFunctor5(),\n                 Bool(n1_++),\n                 Bool(n2_++),\n                 Bool(n3_++),\n                 Bool(n4_++),\n                 Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT5(PredFormatFunction5,\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_,\n                      ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT5(PredFormatFunction5,\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_),\n                      Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) {\n  EXPECT_PRED_FORMAT5(PredFormatFunctor5(),\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_,\n                      ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) {\n  EXPECT_PRED_FORMAT5(PredFormatFunctor5(),\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_),\n                      Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a failed EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT5(PredFormatFunction5,\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++,\n                        n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT5(PredFormatFunction5,\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++),\n                        Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT5(PredFormatFunctor5(),\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++,\n                        n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed EXPECT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) {\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT5(PredFormatFunctor5(),\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++),\n                        Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a successful ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT5(PredFormatFunction5,\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_,\n                      ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT5(PredFormatFunction5,\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_),\n                      Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) {\n  ASSERT_PRED_FORMAT5(PredFormatFunctor5(),\n                      ++n1_,\n                      ++n2_,\n                      ++n3_,\n                      ++n4_,\n                      ++n5_);\n  finished_ = true;\n}\n\n// Tests a successful ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) {\n  ASSERT_PRED_FORMAT5(PredFormatFunctor5(),\n                      Bool(++n1_),\n                      Bool(++n2_),\n                      Bool(++n3_),\n                      Bool(++n4_),\n                      Bool(++n5_));\n  finished_ = true;\n}\n\n// Tests a failed ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT5(PredFormatFunction5,\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++,\n                        n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a function on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT5(PredFormatFunction5,\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++),\n                        Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a built-in type (int).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT5(PredFormatFunctor5(),\n                        n1_++,\n                        n2_++,\n                        n3_++,\n                        n4_++,\n                        n5_++);\n    finished_ = true;\n  }, \"\");\n}\n\n// Tests a failed ASSERT_PRED_FORMAT5 where the\n// predicate-formatter is a functor on a user-defined type (Bool).\nTEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) {\n  expected_to_finish_ = false;\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT5(PredFormatFunctor5(),\n                        Bool(n1_++),\n                        Bool(n2_++),\n                        Bool(n3_++),\n                        Bool(n4_++),\n                        Bool(n5_++));\n    finished_ = true;\n  }, \"\");\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_prod_test.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// Unit test for include/gtest/gtest_prod.h.\n\n#include <gtest/gtest.h>\n#include \"test/production.h\"\n\n// Tests that private members can be accessed from a TEST declared as\n// a friend of the class.\nTEST(PrivateCodeTest, CanAccessPrivateMembers) {\n  PrivateCode a;\n  EXPECT_EQ(0, a.x_);\n\n  a.set_x(1);\n  EXPECT_EQ(1, a.x_);\n}\n\ntypedef testing::Test PrivateCodeFixtureTest;\n\n// Tests that private members can be accessed from a TEST_F declared\n// as a friend of the class.\nTEST_F(PrivateCodeFixtureTest, CanAccessPrivateMembers) {\n  PrivateCode a;\n  EXPECT_EQ(0, a.x_);\n\n  a.set_x(2);\n  EXPECT_EQ(2, a.x_);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_repeat_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Tests the --gtest_repeat=number flag.\n\n#include <stdlib.h>\n#include <iostream>\n#include <gtest/gtest.h>\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\nnamespace testing {\n\nGTEST_DECLARE_string_(death_test_style);\nGTEST_DECLARE_string_(filter);\nGTEST_DECLARE_int32_(repeat);\n\n}  // namespace testing\n\nusing testing::GTEST_FLAG(death_test_style);\nusing testing::GTEST_FLAG(filter);\nusing testing::GTEST_FLAG(repeat);\n\nnamespace {\n\n// We need this when we are testing Google Test itself and therefore\n// cannot use Google Test assertions.\n#define GTEST_CHECK_INT_EQ_(expected, actual) \\\n  do {\\\n    const int expected_val = (expected);\\\n    const int actual_val = (actual);\\\n    if (::testing::internal::IsTrue(expected_val != actual_val)) {\\\n      ::std::cout << \"Value of: \" #actual \"\\n\"\\\n                  << \"  Actual: \" << actual_val << \"\\n\"\\\n                  << \"Expected: \" #expected \"\\n\"\\\n                  << \"Which is: \" << expected_val << \"\\n\";\\\n      abort();\\\n    }\\\n  } while(::testing::internal::AlwaysFalse())\n\n\n// Used for verifying that global environment set-up and tear-down are\n// inside the gtest_repeat loop.\n\nint g_environment_set_up_count = 0;\nint g_environment_tear_down_count = 0;\n\nclass MyEnvironment : public testing::Environment {\n public:\n  MyEnvironment() {}\n  virtual void SetUp() { g_environment_set_up_count++; }\n  virtual void TearDown() { g_environment_tear_down_count++; }\n};\n\n// A test that should fail.\n\nint g_should_fail_count = 0;\n\nTEST(FooTest, ShouldFail) {\n  g_should_fail_count++;\n  EXPECT_EQ(0, 1) << \"Expected failure.\";\n}\n\n// A test that should pass.\n\nint g_should_pass_count = 0;\n\nTEST(FooTest, ShouldPass) {\n  g_should_pass_count++;\n}\n\n// A test that contains a thread-safe death test and a fast death\n// test.  It should pass.\n\nint g_death_test_count = 0;\n\nTEST(BarDeathTest, ThreadSafeAndFast) {\n  g_death_test_count++;\n\n  GTEST_FLAG(death_test_style) = \"threadsafe\";\n  EXPECT_DEATH_IF_SUPPORTED(abort(), \"\");\n\n  GTEST_FLAG(death_test_style) = \"fast\";\n  EXPECT_DEATH_IF_SUPPORTED(abort(), \"\");\n}\n\n#if GTEST_HAS_PARAM_TEST\nint g_param_test_count = 0;\n\nconst int kNumberOfParamTests = 10;\n\nclass MyParamTest : public testing::TestWithParam<int> {};\n\nTEST_P(MyParamTest, ShouldPass) {\n  // TODO(vladl@google.com): Make parameter value checking robust\n  //                         WRT order of tests.\n  GTEST_CHECK_INT_EQ_(g_param_test_count % kNumberOfParamTests, GetParam());\n  g_param_test_count++;\n}\nINSTANTIATE_TEST_CASE_P(MyParamSequence,\n                        MyParamTest,\n                        testing::Range(0, kNumberOfParamTests));\n#endif  // GTEST_HAS_PARAM_TEST\n\n// Resets the count for each test.\nvoid ResetCounts() {\n  g_environment_set_up_count = 0;\n  g_environment_tear_down_count = 0;\n  g_should_fail_count = 0;\n  g_should_pass_count = 0;\n  g_death_test_count = 0;\n#if GTEST_HAS_PARAM_TEST\n  g_param_test_count = 0;\n#endif  // GTEST_HAS_PARAM_TEST\n}\n\n// Checks that the count for each test is expected.\nvoid CheckCounts(int expected) {\n  GTEST_CHECK_INT_EQ_(expected, g_environment_set_up_count);\n  GTEST_CHECK_INT_EQ_(expected, g_environment_tear_down_count);\n  GTEST_CHECK_INT_EQ_(expected, g_should_fail_count);\n  GTEST_CHECK_INT_EQ_(expected, g_should_pass_count);\n  GTEST_CHECK_INT_EQ_(expected, g_death_test_count);\n#if GTEST_HAS_PARAM_TEST\n  GTEST_CHECK_INT_EQ_(expected * kNumberOfParamTests, g_param_test_count);\n#endif  // GTEST_HAS_PARAM_TEST\n}\n\n// Tests the behavior of Google Test when --gtest_repeat is not specified.\nvoid TestRepeatUnspecified() {\n  ResetCounts();\n  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());\n  CheckCounts(1);\n}\n\n// Tests the behavior of Google Test when --gtest_repeat has the given value.\nvoid TestRepeat(int repeat) {\n  GTEST_FLAG(repeat) = repeat;\n\n  ResetCounts();\n  GTEST_CHECK_INT_EQ_(repeat > 0 ? 1 : 0, RUN_ALL_TESTS());\n  CheckCounts(repeat);\n}\n\n// Tests using --gtest_repeat when --gtest_filter specifies an empty\n// set of tests.\nvoid TestRepeatWithEmptyFilter(int repeat) {\n  GTEST_FLAG(repeat) = repeat;\n  GTEST_FLAG(filter) = \"None\";\n\n  ResetCounts();\n  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());\n  CheckCounts(0);\n}\n\n// Tests using --gtest_repeat when --gtest_filter specifies a set of\n// successful tests.\nvoid TestRepeatWithFilterForSuccessfulTests(int repeat) {\n  GTEST_FLAG(repeat) = repeat;\n  GTEST_FLAG(filter) = \"*-*ShouldFail\";\n\n  ResetCounts();\n  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());\n  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);\n  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);\n  GTEST_CHECK_INT_EQ_(0, g_should_fail_count);\n  GTEST_CHECK_INT_EQ_(repeat, g_should_pass_count);\n  GTEST_CHECK_INT_EQ_(repeat, g_death_test_count);\n#if GTEST_HAS_PARAM_TEST\n  GTEST_CHECK_INT_EQ_(repeat * kNumberOfParamTests, g_param_test_count);\n#endif  // GTEST_HAS_PARAM_TEST\n}\n\n// Tests using --gtest_repeat when --gtest_filter specifies a set of\n// failed tests.\nvoid TestRepeatWithFilterForFailedTests(int repeat) {\n  GTEST_FLAG(repeat) = repeat;\n  GTEST_FLAG(filter) = \"*ShouldFail\";\n\n  ResetCounts();\n  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());\n  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);\n  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);\n  GTEST_CHECK_INT_EQ_(repeat, g_should_fail_count);\n  GTEST_CHECK_INT_EQ_(0, g_should_pass_count);\n  GTEST_CHECK_INT_EQ_(0, g_death_test_count);\n#if GTEST_HAS_PARAM_TEST\n  GTEST_CHECK_INT_EQ_(0, g_param_test_count);\n#endif  // GTEST_HAS_PARAM_TEST\n}\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  testing::InitGoogleTest(&argc, argv);\n  testing::AddGlobalTestEnvironment(new MyEnvironment);\n\n  TestRepeatUnspecified();\n  TestRepeat(0);\n  TestRepeat(1);\n  TestRepeat(5);\n\n  TestRepeatWithEmptyFilter(2);\n  TestRepeatWithEmptyFilter(3);\n\n  TestRepeatWithFilterForSuccessfulTests(3);\n\n  TestRepeatWithFilterForFailedTests(4);\n\n  // It would be nice to verify that the tests indeed loop forever\n  // when GTEST_FLAG(repeat) is negative, but this test will be quite\n  // complicated to write.  Since this flag is for interactive\n  // debugging only and doesn't affect the normal test result, such a\n  // test would be an overkill.\n\n  printf(\"PASS\\n\");\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009 Google Inc. All Rights Reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Verifies that test shuffling works.\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport gtest_test_utils\n\n# Command to run the gtest_shuffle_test_ program.\nCOMMAND = gtest_test_utils.GetTestExecutablePath('gtest_shuffle_test_')\n\n# The environment variables for test sharding.\nTOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'\nSHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'\n\nTEST_FILTER = 'A*.A:A*.B:C*'\n\nALL_TESTS = []\nACTIVE_TESTS = []\nFILTERED_TESTS = []\nSHARDED_TESTS = []\n\nSHUFFLED_ALL_TESTS = []\nSHUFFLED_ACTIVE_TESTS = []\nSHUFFLED_FILTERED_TESTS = []\nSHUFFLED_SHARDED_TESTS = []\n\n\ndef AlsoRunDisabledTestsFlag():\n  return '--gtest_also_run_disabled_tests'\n\n\ndef FilterFlag(test_filter):\n  return '--gtest_filter=%s' % (test_filter,)\n\n\ndef RepeatFlag(n):\n  return '--gtest_repeat=%s' % (n,)\n\n\ndef ShuffleFlag():\n  return '--gtest_shuffle'\n\n\ndef RandomSeedFlag(n):\n  return '--gtest_random_seed=%s' % (n,)\n\n\ndef RunAndReturnOutput(extra_env, args):\n  \"\"\"Runs the test program and returns its output.\"\"\"\n\n  environ_copy = os.environ.copy()\n  environ_copy.update(extra_env)\n\n  return gtest_test_utils.Subprocess([COMMAND] + args, env=environ_copy).output\n\n\ndef GetTestsForAllIterations(extra_env, args):\n  \"\"\"Runs the test program and returns a list of test lists.\n\n  Args:\n    extra_env: a map from environment variables to their values\n    args: command line flags to pass to gtest_shuffle_test_\n\n  Returns:\n    A list where the i-th element is the list of tests run in the i-th\n    test iteration.\n  \"\"\"\n\n  test_iterations = []\n  for line in RunAndReturnOutput(extra_env, args).split('\\n'):\n    if line.startswith('----'):\n      tests = []\n      test_iterations.append(tests)\n    elif line.strip():\n      tests.append(line.strip())  # 'TestCaseName.TestName'\n\n  return test_iterations\n\n\ndef GetTestCases(tests):\n  \"\"\"Returns a list of test cases in the given full test names.\n\n  Args:\n    tests: a list of full test names\n\n  Returns:\n    A list of test cases from 'tests', in their original order.\n    Consecutive duplicates are removed.\n  \"\"\"\n\n  test_cases = []\n  for test in tests:\n    test_case = test.split('.')[0]\n    if not test_case in test_cases:\n      test_cases.append(test_case)\n\n  return test_cases\n\n\ndef CalculateTestLists():\n  \"\"\"Calculates the list of tests run under different flags.\"\"\"\n\n  if not ALL_TESTS:\n    ALL_TESTS.extend(\n        GetTestsForAllIterations({}, [AlsoRunDisabledTestsFlag()])[0])\n\n  if not ACTIVE_TESTS:\n    ACTIVE_TESTS.extend(GetTestsForAllIterations({}, [])[0])\n\n  if not FILTERED_TESTS:\n    FILTERED_TESTS.extend(\n        GetTestsForAllIterations({}, [FilterFlag(TEST_FILTER)])[0])\n\n  if not SHARDED_TESTS:\n    SHARDED_TESTS.extend(\n        GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',\n                                  SHARD_INDEX_ENV_VAR: '1'},\n                                 [])[0])\n\n  if not SHUFFLED_ALL_TESTS:\n    SHUFFLED_ALL_TESTS.extend(GetTestsForAllIterations(\n        {}, [AlsoRunDisabledTestsFlag(), ShuffleFlag(), RandomSeedFlag(1)])[0])\n\n  if not SHUFFLED_ACTIVE_TESTS:\n    SHUFFLED_ACTIVE_TESTS.extend(GetTestsForAllIterations(\n        {}, [ShuffleFlag(), RandomSeedFlag(1)])[0])\n\n  if not SHUFFLED_FILTERED_TESTS:\n    SHUFFLED_FILTERED_TESTS.extend(GetTestsForAllIterations(\n        {}, [ShuffleFlag(), RandomSeedFlag(1), FilterFlag(TEST_FILTER)])[0])\n\n  if not SHUFFLED_SHARDED_TESTS:\n    SHUFFLED_SHARDED_TESTS.extend(\n        GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',\n                                  SHARD_INDEX_ENV_VAR: '1'},\n                                 [ShuffleFlag(), RandomSeedFlag(1)])[0])\n\n\nclass GTestShuffleUnitTest(gtest_test_utils.TestCase):\n  \"\"\"Tests test shuffling.\"\"\"\n\n  def setUp(self):\n    CalculateTestLists()\n\n  def testShufflePreservesNumberOfTests(self):\n    self.assertEqual(len(ALL_TESTS), len(SHUFFLED_ALL_TESTS))\n    self.assertEqual(len(ACTIVE_TESTS), len(SHUFFLED_ACTIVE_TESTS))\n    self.assertEqual(len(FILTERED_TESTS), len(SHUFFLED_FILTERED_TESTS))\n    self.assertEqual(len(SHARDED_TESTS), len(SHUFFLED_SHARDED_TESTS))\n\n  def testShuffleChangesTestOrder(self):\n    self.assert_(SHUFFLED_ALL_TESTS != ALL_TESTS, SHUFFLED_ALL_TESTS)\n    self.assert_(SHUFFLED_ACTIVE_TESTS != ACTIVE_TESTS, SHUFFLED_ACTIVE_TESTS)\n    self.assert_(SHUFFLED_FILTERED_TESTS != FILTERED_TESTS,\n                 SHUFFLED_FILTERED_TESTS)\n    self.assert_(SHUFFLED_SHARDED_TESTS != SHARDED_TESTS,\n                 SHUFFLED_SHARDED_TESTS)\n\n  def testShuffleChangesTestCaseOrder(self):\n    self.assert_(GetTestCases(SHUFFLED_ALL_TESTS) != GetTestCases(ALL_TESTS),\n                 GetTestCases(SHUFFLED_ALL_TESTS))\n    self.assert_(\n        GetTestCases(SHUFFLED_ACTIVE_TESTS) != GetTestCases(ACTIVE_TESTS),\n        GetTestCases(SHUFFLED_ACTIVE_TESTS))\n    self.assert_(\n        GetTestCases(SHUFFLED_FILTERED_TESTS) != GetTestCases(FILTERED_TESTS),\n        GetTestCases(SHUFFLED_FILTERED_TESTS))\n    self.assert_(\n        GetTestCases(SHUFFLED_SHARDED_TESTS) != GetTestCases(SHARDED_TESTS),\n        GetTestCases(SHUFFLED_SHARDED_TESTS))\n\n  def testShuffleDoesNotRepeatTest(self):\n    for test in SHUFFLED_ALL_TESTS:\n      self.assertEqual(1, SHUFFLED_ALL_TESTS.count(test),\n                       '%s appears more than once' % (test,))\n    for test in SHUFFLED_ACTIVE_TESTS:\n      self.assertEqual(1, SHUFFLED_ACTIVE_TESTS.count(test),\n                       '%s appears more than once' % (test,))\n    for test in SHUFFLED_FILTERED_TESTS:\n      self.assertEqual(1, SHUFFLED_FILTERED_TESTS.count(test),\n                       '%s appears more than once' % (test,))\n    for test in SHUFFLED_SHARDED_TESTS:\n      self.assertEqual(1, SHUFFLED_SHARDED_TESTS.count(test),\n                       '%s appears more than once' % (test,))\n\n  def testShuffleDoesNotCreateNewTest(self):\n    for test in SHUFFLED_ALL_TESTS:\n      self.assert_(test in ALL_TESTS, '%s is an invalid test' % (test,))\n    for test in SHUFFLED_ACTIVE_TESTS:\n      self.assert_(test in ACTIVE_TESTS, '%s is an invalid test' % (test,))\n    for test in SHUFFLED_FILTERED_TESTS:\n      self.assert_(test in FILTERED_TESTS, '%s is an invalid test' % (test,))\n    for test in SHUFFLED_SHARDED_TESTS:\n      self.assert_(test in SHARDED_TESTS, '%s is an invalid test' % (test,))\n\n  def testShuffleIncludesAllTests(self):\n    for test in ALL_TESTS:\n      self.assert_(test in SHUFFLED_ALL_TESTS, '%s is missing' % (test,))\n    for test in ACTIVE_TESTS:\n      self.assert_(test in SHUFFLED_ACTIVE_TESTS, '%s is missing' % (test,))\n    for test in FILTERED_TESTS:\n      self.assert_(test in SHUFFLED_FILTERED_TESTS, '%s is missing' % (test,))\n    for test in SHARDED_TESTS:\n      self.assert_(test in SHUFFLED_SHARDED_TESTS, '%s is missing' % (test,))\n\n  def testShuffleLeavesDeathTestsAtFront(self):\n    non_death_test_found = False\n    for test in SHUFFLED_ACTIVE_TESTS:\n      if 'DeathTest.' in test:\n        self.assert_(not non_death_test_found,\n                     '%s appears after a non-death test' % (test,))\n      else:\n        non_death_test_found = True\n\n  def _VerifyTestCasesDoNotInterleave(self, tests):\n    test_cases = []\n    for test in tests:\n      [test_case, _] = test.split('.')\n      if test_cases and test_cases[-1] != test_case:\n        test_cases.append(test_case)\n        self.assertEqual(1, test_cases.count(test_case),\n                         'Test case %s is not grouped together in %s' %\n                         (test_case, tests))\n\n  def testShuffleDoesNotInterleaveTestCases(self):\n    self._VerifyTestCasesDoNotInterleave(SHUFFLED_ALL_TESTS)\n    self._VerifyTestCasesDoNotInterleave(SHUFFLED_ACTIVE_TESTS)\n    self._VerifyTestCasesDoNotInterleave(SHUFFLED_FILTERED_TESTS)\n    self._VerifyTestCasesDoNotInterleave(SHUFFLED_SHARDED_TESTS)\n\n  def testShuffleRestoresOrderAfterEachIteration(self):\n    # Get the test lists in all 3 iterations, using random seed 1, 2,\n    # and 3 respectively.  Google Test picks a different seed in each\n    # iteration, and this test depends on the current implementation\n    # picking successive numbers.  This dependency is not ideal, but\n    # makes the test much easier to write.\n    [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = (\n        GetTestsForAllIterations(\n            {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)]))\n\n    # Make sure running the tests with random seed 1 gets the same\n    # order as in iteration 1 above.\n    [tests_with_seed1] = GetTestsForAllIterations(\n        {}, [ShuffleFlag(), RandomSeedFlag(1)])\n    self.assertEqual(tests_in_iteration1, tests_with_seed1)\n\n    # Make sure running the tests with random seed 2 gets the same\n    # order as in iteration 2 above.  Success means that Google Test\n    # correctly restores the test order before re-shuffling at the\n    # beginning of iteration 2.\n    [tests_with_seed2] = GetTestsForAllIterations(\n        {}, [ShuffleFlag(), RandomSeedFlag(2)])\n    self.assertEqual(tests_in_iteration2, tests_with_seed2)\n\n    # Make sure running the tests with random seed 3 gets the same\n    # order as in iteration 3 above.  Success means that Google Test\n    # correctly restores the test order before re-shuffling at the\n    # beginning of iteration 3.\n    [tests_with_seed3] = GetTestsForAllIterations(\n        {}, [ShuffleFlag(), RandomSeedFlag(3)])\n    self.assertEqual(tests_in_iteration3, tests_with_seed3)\n\n  def testShuffleGeneratesNewOrderInEachIteration(self):\n    [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = (\n        GetTestsForAllIterations(\n            {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)]))\n\n    self.assert_(tests_in_iteration1 != tests_in_iteration2,\n                 tests_in_iteration1)\n    self.assert_(tests_in_iteration1 != tests_in_iteration3,\n                 tests_in_iteration1)\n    self.assert_(tests_in_iteration2 != tests_in_iteration3,\n                 tests_in_iteration2)\n\n  def testShuffleShardedTestsPreservesPartition(self):\n    # If we run M tests on N shards, the same M tests should be run in\n    # total, regardless of the random seeds used by the shards.\n    [tests1] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',\n                                         SHARD_INDEX_ENV_VAR: '0'},\n                                        [ShuffleFlag(), RandomSeedFlag(1)])\n    [tests2] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',\n                                         SHARD_INDEX_ENV_VAR: '1'},\n                                        [ShuffleFlag(), RandomSeedFlag(20)])\n    [tests3] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',\n                                         SHARD_INDEX_ENV_VAR: '2'},\n                                        [ShuffleFlag(), RandomSeedFlag(25)])\n    sorted_sharded_tests = tests1 + tests2 + tests3\n    sorted_sharded_tests.sort()\n    sorted_active_tests = []\n    sorted_active_tests.extend(ACTIVE_TESTS)\n    sorted_active_tests.sort()\n    self.assertEqual(sorted_active_tests, sorted_sharded_tests)\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test_.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Verifies that test shuffling works.\n\n#include <gtest/gtest.h>\n\nnamespace {\n\nusing ::testing::EmptyTestEventListener;\nusing ::testing::InitGoogleTest;\nusing ::testing::Message;\nusing ::testing::Test;\nusing ::testing::TestEventListeners;\nusing ::testing::TestInfo;\nusing ::testing::UnitTest;\nusing ::testing::internal::String;\nusing ::testing::internal::scoped_ptr;\n\n// The test methods are empty, as the sole purpose of this program is\n// to print the test names before/after shuffling.\n\nclass A : public Test {};\nTEST_F(A, A) {}\nTEST_F(A, B) {}\n\nTEST(ADeathTest, A) {}\nTEST(ADeathTest, B) {}\nTEST(ADeathTest, C) {}\n\nTEST(B, A) {}\nTEST(B, B) {}\nTEST(B, C) {}\nTEST(B, DISABLED_D) {}\nTEST(B, DISABLED_E) {}\n\nTEST(BDeathTest, A) {}\nTEST(BDeathTest, B) {}\n\nTEST(C, A) {}\nTEST(C, B) {}\nTEST(C, C) {}\nTEST(C, DISABLED_D) {}\n\nTEST(CDeathTest, A) {}\n\nTEST(DISABLED_D, A) {}\nTEST(DISABLED_D, DISABLED_B) {}\n\n// This printer prints the full test names only, starting each test\n// iteration with a \"----\" marker.\nclass TestNamePrinter : public EmptyTestEventListener {\n public:\n  virtual void OnTestIterationStart(const UnitTest& /* unit_test */,\n                                    int /* iteration */) {\n    printf(\"----\\n\");\n  }\n\n  virtual void OnTestStart(const TestInfo& test_info) {\n    printf(\"%s.%s\\n\", test_info.test_case_name(), test_info.name());\n  }\n};\n\n}  // namespace\n\nint main(int argc, char **argv) {\n  InitGoogleTest(&argc, argv);\n\n  // Replaces the default printer with TestNamePrinter, which prints\n  // the test name only.\n  TestEventListeners& listeners = UnitTest::GetInstance()->listeners();\n  delete listeners.Release(listeners.default_result_printer());\n  listeners.Append(new TestNamePrinter);\n\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_sole_header_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: mheule@google.com (Markus Heule)\n//\n// This test verifies that it's possible to use Google Test by including\n// the gtest.h header file alone.\n\n#include <gtest/gtest.h>\n\nnamespace {\n\nvoid Subroutine() {\n  EXPECT_EQ(42, 42);\n}\n\nTEST(NoFatalFailureTest, ExpectNoFatalFailure) {\n  EXPECT_NO_FATAL_FAILURE(;);\n  EXPECT_NO_FATAL_FAILURE(SUCCEED());\n  EXPECT_NO_FATAL_FAILURE(Subroutine());\n  EXPECT_NO_FATAL_FAILURE({ SUCCEED(); });\n}\n\nTEST(NoFatalFailureTest, AssertNoFatalFailure) {\n  ASSERT_NO_FATAL_FAILURE(;);\n  ASSERT_NO_FATAL_FAILURE(SUCCEED());\n  ASSERT_NO_FATAL_FAILURE(Subroutine());\n  ASSERT_NO_FATAL_FAILURE({ SUCCEED(); });\n}\n\n}  // namespace\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_stress_test.cc",
    "content": "// Copyright 2007, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Tests that SCOPED_TRACE() and various Google Test assertions can be\n// used in a large number of threads concurrently.\n\n#include <gtest/gtest.h>\n\n#include <iostream>\n#include <vector>\n\n// We must define this macro in order to #include\n// gtest-internal-inl.h.  This is how Google Test prevents a user from\n// accidentally depending on its internal implementation.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\n#if GTEST_IS_THREADSAFE\n\nnamespace testing {\nnamespace {\n\nusing internal::Notification;\nusing internal::String;\nusing internal::TestPropertyKeyIs;\nusing internal::ThreadWithParam;\nusing internal::scoped_ptr;\n\n// In order to run tests in this file, for platforms where Google Test is\n// thread safe, implement ThreadWithParam. See the description of its API\n// in gtest-port.h, where it is defined for already supported platforms.\n\n// How many threads to create?\nconst int kThreadCount = 50;\n\nString IdToKey(int id, const char* suffix) {\n  Message key;\n  key << \"key_\" << id << \"_\" << suffix;\n  return key.GetString();\n}\n\nString IdToString(int id) {\n  Message id_message;\n  id_message << id;\n  return id_message.GetString();\n}\n\nvoid ExpectKeyAndValueWereRecordedForId(\n    const std::vector<TestProperty>& properties,\n    int id, const char* suffix) {\n  TestPropertyKeyIs matches_key(IdToKey(id, suffix).c_str());\n  const std::vector<TestProperty>::const_iterator property =\n      std::find_if(properties.begin(), properties.end(), matches_key);\n  ASSERT_TRUE(property != properties.end())\n      << \"expecting \" << suffix << \" value for id \" << id;\n  EXPECT_STREQ(IdToString(id).c_str(), property->value());\n}\n\n// Calls a large number of Google Test assertions, where exactly one of them\n// will fail.\nvoid ManyAsserts(int id) {\n  GTEST_LOG_(INFO) << \"Thread #\" << id << \" running...\";\n\n  SCOPED_TRACE(Message() << \"Thread #\" << id);\n\n  for (int i = 0; i < kThreadCount; i++) {\n    SCOPED_TRACE(Message() << \"Iteration #\" << i);\n\n    // A bunch of assertions that should succeed.\n    EXPECT_TRUE(true);\n    ASSERT_FALSE(false) << \"This shouldn't fail.\";\n    EXPECT_STREQ(\"a\", \"a\");\n    ASSERT_LE(5, 6);\n    EXPECT_EQ(i, i) << \"This shouldn't fail.\";\n\n    // RecordProperty() should interact safely with other threads as well.\n    // The shared_key forces property updates.\n    Test::RecordProperty(IdToKey(id, \"string\").c_str(), IdToString(id).c_str());\n    Test::RecordProperty(IdToKey(id, \"int\").c_str(), id);\n    Test::RecordProperty(\"shared_key\", IdToString(id).c_str());\n\n    // This assertion should fail kThreadCount times per thread.  It\n    // is for testing whether Google Test can handle failed assertions in a\n    // multi-threaded context.\n    EXPECT_LT(i, 0) << \"This should always fail.\";\n  }\n}\n\nvoid CheckTestFailureCount(int expected_failures) {\n  const TestInfo* const info = UnitTest::GetInstance()->current_test_info();\n  const TestResult* const result = info->result();\n  GTEST_CHECK_(expected_failures == result->total_part_count())\n      << \"Logged \" << result->total_part_count() << \" failures \"\n      << \" vs. \" << expected_failures << \" expected\";\n}\n\n// Tests using SCOPED_TRACE() and Google Test assertions in many threads\n// concurrently.\nTEST(StressTest, CanUseScopedTraceAndAssertionsInManyThreads) {\n  {\n    scoped_ptr<ThreadWithParam<int> > threads[kThreadCount];\n    Notification threads_can_start;\n    for (int i = 0; i != kThreadCount; i++)\n      threads[i].reset(new ThreadWithParam<int>(&ManyAsserts,\n                                                i,\n                                                &threads_can_start));\n\n    threads_can_start.Notify();\n\n    // Blocks until all the threads are done.\n    for (int i = 0; i != kThreadCount; i++)\n      threads[i]->Join();\n  }\n\n  // Ensures that kThreadCount*kThreadCount failures have been reported.\n  const TestInfo* const info = UnitTest::GetInstance()->current_test_info();\n  const TestResult* const result = info->result();\n\n  std::vector<TestProperty> properties;\n  // We have no access to the TestResult's list of properties but we can\n  // copy them one by one.\n  for (int i = 0; i < result->test_property_count(); ++i)\n    properties.push_back(result->GetTestProperty(i));\n\n  EXPECT_EQ(kThreadCount * 2 + 1, result->test_property_count())\n      << \"String and int values recorded on each thread, \"\n      << \"as well as one shared_key\";\n  for (int i = 0; i < kThreadCount; ++i) {\n    ExpectKeyAndValueWereRecordedForId(properties, i, \"string\");\n    ExpectKeyAndValueWereRecordedForId(properties, i, \"int\");\n  }\n  CheckTestFailureCount(kThreadCount*kThreadCount);\n}\n\nvoid FailingThread(bool is_fatal) {\n  if (is_fatal)\n    FAIL() << \"Fatal failure in some other thread. \"\n           << \"(This failure is expected.)\";\n  else\n    ADD_FAILURE() << \"Non-fatal failure in some other thread. \"\n                  << \"(This failure is expected.)\";\n}\n\nvoid GenerateFatalFailureInAnotherThread(bool is_fatal) {\n  ThreadWithParam<bool> thread(&FailingThread, is_fatal, NULL);\n  thread.Join();\n}\n\nTEST(NoFatalFailureTest, ExpectNoFatalFailureIgnoresFailuresInOtherThreads) {\n  EXPECT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true));\n  // We should only have one failure (the one from\n  // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE\n  // should succeed.\n  CheckTestFailureCount(1);\n}\n\nvoid AssertNoFatalFailureIgnoresFailuresInOtherThreads() {\n  ASSERT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true));\n}\nTEST(NoFatalFailureTest, AssertNoFatalFailureIgnoresFailuresInOtherThreads) {\n  // Using a subroutine, to make sure, that the test continues.\n  AssertNoFatalFailureIgnoresFailuresInOtherThreads();\n  // We should only have one failure (the one from\n  // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE\n  // should succeed.\n  CheckTestFailureCount(1);\n}\n\nTEST(FatalFailureTest, ExpectFatalFailureIgnoresFailuresInOtherThreads) {\n  // This statement should fail, since the current thread doesn't generate a\n  // fatal failure, only another one does.\n  EXPECT_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true), \"expected\");\n  CheckTestFailureCount(2);\n}\n\nTEST(FatalFailureOnAllThreadsTest, ExpectFatalFailureOnAllThreads) {\n  // This statement should succeed, because failures in all threads are\n  // considered.\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(\n      GenerateFatalFailureInAnotherThread(true), \"expected\");\n  CheckTestFailureCount(0);\n  // We need to add a failure, because main() checks that there are failures.\n  // But when only this test is run, we shouldn't have any failures.\n  ADD_FAILURE() << \"This is an expected non-fatal failure.\";\n}\n\nTEST(NonFatalFailureTest, ExpectNonFatalFailureIgnoresFailuresInOtherThreads) {\n  // This statement should fail, since the current thread doesn't generate a\n  // fatal failure, only another one does.\n  EXPECT_NONFATAL_FAILURE(GenerateFatalFailureInAnotherThread(false),\n                          \"expected\");\n  CheckTestFailureCount(2);\n}\n\nTEST(NonFatalFailureOnAllThreadsTest, ExpectNonFatalFailureOnAllThreads) {\n  // This statement should succeed, because failures in all threads are\n  // considered.\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(\n      GenerateFatalFailureInAnotherThread(false), \"expected\");\n  CheckTestFailureCount(0);\n  // We need to add a failure, because main() checks that there are failures,\n  // But when only this test is run, we shouldn't have any failures.\n  ADD_FAILURE() << \"This is an expected non-fatal failure.\";\n}\n\n}  // namespace\n}  // namespace testing\n\nint main(int argc, char **argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  const int result = RUN_ALL_TESTS();  // Expected to fail.\n  GTEST_CHECK_(result == 1) << \"RUN_ALL_TESTS() did not fail as expected\";\n\n  printf(\"\\nPASS\\n\");\n  return 0;\n}\n\n#else\nTEST(StressTest,\n     DISABLED_ThreadSafetyTestsAreSkippedWhenGoogleTestIsNotThreadSafe) {\n}\n\nint main(int argc, char **argv) {\n  testing::InitGoogleTest(&argc, argv);\n  return RUN_ALL_TESTS();\n}\n#endif  // GTEST_IS_THREADSAFE\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_test_utils.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test utilities for Google C++ Testing Framework.\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport atexit\nimport os\nimport shutil\nimport sys\nimport tempfile\nimport unittest\n_test_module = unittest\n\n# Suppresses the 'Import not at the top of the file' lint complaint.\n# pylint: disable-msg=C6204\ntry:\n  import subprocess\n  _SUBPROCESS_MODULE_AVAILABLE = True\nexcept:\n  import popen2\n  _SUBPROCESS_MODULE_AVAILABLE = False\n# pylint: enable-msg=C6204\n\nGTEST_OUTPUT_VAR_NAME = 'GTEST_OUTPUT'\n\nIS_WINDOWS = os.name == 'nt'\nIS_CYGWIN = os.name == 'posix' and 'CYGWIN' in os.uname()[0]\n\n# Here we expose a class from a particular module, depending on the\n# environment. The comment suppresses the 'Invalid variable name' lint\n# complaint.\nTestCase = _test_module.TestCase  # pylint: disable-msg=C6409\n\n# Initially maps a flag to its default value. After\n# _ParseAndStripGTestFlags() is called, maps a flag to its actual value.\n_flag_map = {'gtest_source_dir': os.path.dirname(sys.argv[0]),\n             'gtest_build_dir': os.path.dirname(sys.argv[0])}\n_gtest_flags_are_parsed = False\n\n\ndef _ParseAndStripGTestFlags(argv):\n  \"\"\"Parses and strips Google Test flags from argv.  This is idempotent.\"\"\"\n\n  # Suppresses the lint complaint about a global variable since we need it\n  # here to maintain module-wide state.\n  global _gtest_flags_are_parsed  # pylint: disable-msg=W0603\n  if _gtest_flags_are_parsed:\n    return\n\n  _gtest_flags_are_parsed = True\n  for flag in _flag_map:\n    # The environment variable overrides the default value.\n    if flag.upper() in os.environ:\n      _flag_map[flag] = os.environ[flag.upper()]\n\n    # The command line flag overrides the environment variable.\n    i = 1  # Skips the program name.\n    while i < len(argv):\n      prefix = '--' + flag + '='\n      if argv[i].startswith(prefix):\n        _flag_map[flag] = argv[i][len(prefix):]\n        del argv[i]\n        break\n      else:\n        # We don't increment i in case we just found a --gtest_* flag\n        # and removed it from argv.\n        i += 1\n\n\ndef GetFlag(flag):\n  \"\"\"Returns the value of the given flag.\"\"\"\n\n  # In case GetFlag() is called before Main(), we always call\n  # _ParseAndStripGTestFlags() here to make sure the --gtest_* flags\n  # are parsed.\n  _ParseAndStripGTestFlags(sys.argv)\n\n  return _flag_map[flag]\n\n\ndef GetSourceDir():\n  \"\"\"Returns the absolute path of the directory where the .py files are.\"\"\"\n\n  return os.path.abspath(GetFlag('gtest_source_dir'))\n\n\ndef GetBuildDir():\n  \"\"\"Returns the absolute path of the directory where the test binaries are.\"\"\"\n\n  return os.path.abspath(GetFlag('gtest_build_dir'))\n\n\n_temp_dir = None\n\ndef _RemoveTempDir():\n  if _temp_dir:\n    shutil.rmtree(_temp_dir, ignore_errors=True)\n\natexit.register(_RemoveTempDir)\n\n\ndef GetTempDir():\n  \"\"\"Returns a directory for temporary files.\"\"\"\n\n  global _temp_dir\n  if not _temp_dir:\n    _temp_dir = tempfile.mkdtemp()\n  return _temp_dir\n\n\ndef GetTestExecutablePath(executable_name, build_dir=None):\n  \"\"\"Returns the absolute path of the test binary given its name.\n\n  The function will print a message and abort the program if the resulting file\n  doesn't exist.\n\n  Args:\n    executable_name: name of the test binary that the test script runs.\n    build_dir:       directory where to look for executables, by default\n                     the result of GetBuildDir().\n\n  Returns:\n    The absolute path of the test binary.\n  \"\"\"\n\n  path = os.path.abspath(os.path.join(build_dir or GetBuildDir(),\n                                      executable_name))\n  if (IS_WINDOWS or IS_CYGWIN) and not path.endswith('.exe'):\n    path += '.exe'\n\n  if not os.path.exists(path):\n    message = (\n        'Unable to find the test binary. Please make sure to provide path\\n'\n        'to the binary via the --gtest_build_dir flag or the GTEST_BUILD_DIR\\n'\n        'environment variable. For convenient use, invoke this script via\\n'\n        'mk_test.py.\\n'\n        # TODO(vladl@google.com): change mk_test.py to test.py after renaming\n        # the file.\n        'Please run mk_test.py -h for help.')\n    print >> sys.stderr, message\n    sys.exit(1)\n\n  return path\n\n\ndef GetExitStatus(exit_code):\n  \"\"\"Returns the argument to exit(), or -1 if exit() wasn't called.\n\n  Args:\n    exit_code: the result value of os.system(command).\n  \"\"\"\n\n  if os.name == 'nt':\n    # On Windows, os.WEXITSTATUS() doesn't work and os.system() returns\n    # the argument to exit() directly.\n    return exit_code\n  else:\n    # On Unix, os.WEXITSTATUS() must be used to extract the exit status\n    # from the result of os.system().\n    if os.WIFEXITED(exit_code):\n      return os.WEXITSTATUS(exit_code)\n    else:\n      return -1\n\n\nclass Subprocess:\n  def __init__(self, command, working_dir=None, capture_stderr=True, env=None):\n    \"\"\"Changes into a specified directory, if provided, and executes a command.\n\n    Restores the old directory afterwards.\n\n    Args:\n      command:        The command to run, in the form of sys.argv.\n      working_dir:    The directory to change into.\n      capture_stderr: Determines whether to capture stderr in the output member\n                      or to discard it.\n      env:            Dictionary with environment to pass to the subprocess.\n\n    Returns:\n      An object that represents outcome of the executed process. It has the\n      following attributes:\n        terminated_by_signal   True iff the child process has been terminated\n                               by a signal.\n        signal                 Sygnal that terminated the child process.\n        exited                 True iff the child process exited normally.\n        exit_code              The code with which the child process exited.\n        output                 Child process's stdout and stderr output\n                               combined in a string.\n    \"\"\"\n\n    # The subprocess module is the preferrable way of running programs\n    # since it is available and behaves consistently on all platforms,\n    # including Windows. But it is only available starting in python 2.4.\n    # In earlier python versions, we revert to the popen2 module, which is\n    # available in python 2.0 and later but doesn't provide required\n    # functionality (Popen4) under Windows. This allows us to support Mac\n    # OS X 10.4 Tiger, which has python 2.3 installed.\n    if _SUBPROCESS_MODULE_AVAILABLE:\n      if capture_stderr:\n        stderr = subprocess.STDOUT\n      else:\n        stderr = subprocess.PIPE\n\n      p = subprocess.Popen(command,\n                           stdout=subprocess.PIPE, stderr=stderr,\n                           cwd=working_dir, universal_newlines=True, env=env)\n      # communicate returns a tuple with the file obect for the child's\n      # output.\n      self.output = p.communicate()[0]\n      self._return_code = p.returncode\n    else:\n      old_dir = os.getcwd()\n\n      def _ReplaceEnvDict(dest, src):\n        # Changes made by os.environ.clear are not inheritable by child\n        # processes until Python 2.6. To produce inheritable changes we have\n        # to delete environment items with the del statement.\n        for key in dest:\n          del dest[key]\n        dest.update(src)\n\n      # When 'env' is not None, backup the environment variables and replace\n      # them with the passed 'env'. When 'env' is None, we simply use the\n      # current 'os.environ' for compatibility with the subprocess.Popen\n      # semantics used above.\n      if env is not None:\n        old_environ = os.environ.copy()\n        _ReplaceEnvDict(os.environ, env)\n\n      try:\n        if working_dir is not None:\n          os.chdir(working_dir)\n        if capture_stderr:\n          p = popen2.Popen4(command)\n        else:\n          p = popen2.Popen3(command)\n        p.tochild.close()\n        self.output = p.fromchild.read()\n        ret_code = p.wait()\n      finally:\n        os.chdir(old_dir)\n\n        # Restore the old environment variables\n        # if they were replaced.\n        if env is not None:\n          _ReplaceEnvDict(os.environ, old_environ)\n\n      # Converts ret_code to match the semantics of\n      # subprocess.Popen.returncode.\n      if os.WIFSIGNALED(ret_code):\n        self._return_code = -os.WTERMSIG(ret_code)\n      else:  # os.WIFEXITED(ret_code) should return True here.\n        self._return_code = os.WEXITSTATUS(ret_code)\n\n    if self._return_code < 0:\n      self.terminated_by_signal = True\n      self.exited = False\n      self.signal = -self._return_code\n    else:\n      self.terminated_by_signal = False\n      self.exited = True\n      self.exit_code = self._return_code\n\n\ndef Main():\n  \"\"\"Runs the unit test.\"\"\"\n\n  # We must call _ParseAndStripGTestFlags() before calling\n  # unittest.main().  Otherwise the latter will be confused by the\n  # --gtest_* flags.\n  _ParseAndStripGTestFlags(sys.argv)\n  # The tested binaries should not be writing XML output files unless the\n  # script explicitly instructs them to.\n  # TODO(vladl@google.com): Move this into Subprocess when we implement\n  # passing environment into it as a parameter.\n  if GTEST_OUTPUT_VAR_NAME in os.environ:\n    del os.environ[GTEST_OUTPUT_VAR_NAME]\n\n  _test_module.main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_ex_test.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Tests Google Test's throw-on-failure mode with exceptions enabled.\n\n#include <gtest/gtest.h>\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdexcept>\n\n// Prints the given failure message and exits the program with\n// non-zero.  We use this instead of a Google Test assertion to\n// indicate a failure, as the latter is been tested and cannot be\n// relied on.\nvoid Fail(const char* msg) {\n  printf(\"FAILURE: %s\\n\", msg);\n  fflush(stdout);\n  exit(1);\n}\n\n// Tests that an assertion failure throws a subclass of\n// std::runtime_error.\nvoid TestFailureThrowsRuntimeError() {\n  testing::GTEST_FLAG(throw_on_failure) = true;\n\n  // A successful assertion shouldn't throw.\n  try {\n    EXPECT_EQ(3, 3);\n  } catch(...) {\n    Fail(\"A successful assertion wrongfully threw.\");\n  }\n\n  // A failed assertion should throw a subclass of std::runtime_error.\n  try {\n    EXPECT_EQ(2, 3) << \"Expected failure\";\n  } catch(const std::runtime_error& e) {\n    if (strstr(e.what(), \"Expected failure\") != NULL)\n      return;\n\n    printf(\"%s\",\n           \"A failed assertion did throw an exception of the right type, \"\n           \"but the message is incorrect.  Instead of containing \\\"Expected \"\n           \"failure\\\", it is:\\n\");\n    Fail(e.what());\n  } catch(...) {\n    Fail(\"A failed assertion threw the wrong type of exception.\");\n  }\n  Fail(\"A failed assertion should've thrown but didn't.\");\n}\n\nint main(int argc, char** argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  // We want to ensure that people can use Google Test assertions in\n  // other testing frameworks, as long as they initialize Google Test\n  // properly and set the thrown-on-failure mode.  Therefore, we don't\n  // use Google Test's constructs for defining and running tests\n  // (e.g. TEST and RUN_ALL_TESTS) here.\n\n  TestFailureThrowsRuntimeError();\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Tests Google Test's throw-on-failure mode with exceptions disabled.\n\nThis script invokes gtest_throw_on_failure_test_ (a program written with\nGoogle Test) with different environments and command line flags.\n\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport os\nimport gtest_test_utils\n\n\n# Constants.\n\n# The command line flag for enabling/disabling the throw-on-failure mode.\nTHROW_ON_FAILURE = 'gtest_throw_on_failure'\n\n# Path to the gtest_throw_on_failure_test_ program, compiled with\n# exceptions disabled.\nEXE_PATH = gtest_test_utils.GetTestExecutablePath(\n    'gtest_throw_on_failure_test_')\n\n\n# Utilities.\n\n\ndef SetEnvVar(env_var, value):\n  \"\"\"Sets an environment variable to a given value; unsets it when the\n  given value is None.\n  \"\"\"\n\n  env_var = env_var.upper()\n  if value is not None:\n    os.environ[env_var] = value\n  elif env_var in os.environ:\n    del os.environ[env_var]\n\n\ndef Run(command):\n  \"\"\"Runs a command; returns True/False if its exit code is/isn't 0.\"\"\"\n\n  print 'Running \"%s\". . .' % ' '.join(command)\n  p = gtest_test_utils.Subprocess(command)\n  return p.exited and p.exit_code == 0\n\n\n# The tests.  TODO(wan@google.com): refactor the class to share common\n# logic with code in gtest_break_on_failure_unittest.py.\nclass ThrowOnFailureTest(gtest_test_utils.TestCase):\n  \"\"\"Tests the throw-on-failure mode.\"\"\"\n\n  def RunAndVerify(self, env_var_value, flag_value, should_fail):\n    \"\"\"Runs gtest_throw_on_failure_test_ and verifies that it does\n    (or does not) exit with a non-zero code.\n\n    Args:\n      env_var_value:    value of the GTEST_BREAK_ON_FAILURE environment\n                        variable; None if the variable should be unset.\n      flag_value:       value of the --gtest_break_on_failure flag;\n                        None if the flag should not be present.\n      should_fail:      True iff the program is expected to fail.\n    \"\"\"\n\n    SetEnvVar(THROW_ON_FAILURE, env_var_value)\n\n    if env_var_value is None:\n      env_var_value_msg = ' is not set'\n    else:\n      env_var_value_msg = '=' + env_var_value\n\n    if flag_value is None:\n      flag = ''\n    elif flag_value == '0':\n      flag = '--%s=0' % THROW_ON_FAILURE\n    else:\n      flag = '--%s' % THROW_ON_FAILURE\n\n    command = [EXE_PATH]\n    if flag:\n      command.append(flag)\n\n    if should_fail:\n      should_or_not = 'should'\n    else:\n      should_or_not = 'should not'\n\n    failed = not Run(command)\n\n    SetEnvVar(THROW_ON_FAILURE, None)\n\n    msg = ('when %s%s, an assertion failure in \"%s\" %s cause a non-zero '\n           'exit code.' %\n           (THROW_ON_FAILURE, env_var_value_msg, ' '.join(command),\n            should_or_not))\n    self.assert_(failed == should_fail, msg)\n\n  def testDefaultBehavior(self):\n    \"\"\"Tests the behavior of the default mode.\"\"\"\n\n    self.RunAndVerify(env_var_value=None, flag_value=None, should_fail=False)\n\n  def testThrowOnFailureEnvVar(self):\n    \"\"\"Tests using the GTEST_THROW_ON_FAILURE environment variable.\"\"\"\n\n    self.RunAndVerify(env_var_value='0',\n                      flag_value=None,\n                      should_fail=False)\n    self.RunAndVerify(env_var_value='1',\n                      flag_value=None,\n                      should_fail=True)\n\n  def testThrowOnFailureFlag(self):\n    \"\"\"Tests using the --gtest_throw_on_failure flag.\"\"\"\n\n    self.RunAndVerify(env_var_value=None,\n                      flag_value='0',\n                      should_fail=False)\n    self.RunAndVerify(env_var_value=None,\n                      flag_value='1',\n                      should_fail=True)\n\n  def testThrowOnFailureFlagOverridesEnvVar(self):\n    \"\"\"Tests that --gtest_throw_on_failure overrides GTEST_THROW_ON_FAILURE.\"\"\"\n\n    self.RunAndVerify(env_var_value='0',\n                      flag_value='0',\n                      should_fail=False)\n    self.RunAndVerify(env_var_value='0',\n                      flag_value='1',\n                      should_fail=True)\n    self.RunAndVerify(env_var_value='1',\n                      flag_value='0',\n                      should_fail=False)\n    self.RunAndVerify(env_var_value='1',\n                      flag_value='1',\n                      should_fail=True)\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test_.cc",
    "content": "// Copyright 2009, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n// Tests Google Test's throw-on-failure mode with exceptions disabled.\n//\n// This program must be compiled with exceptions disabled.  It will be\n// invoked by gtest_throw_on_failure_test.py, and is expected to exit\n// with non-zero in the throw-on-failure mode or 0 otherwise.\n\n#include <gtest/gtest.h>\n\nint main(int argc, char** argv) {\n  testing::InitGoogleTest(&argc, argv);\n\n  // We want to ensure that people can use Google Test assertions in\n  // other testing frameworks, as long as they initialize Google Test\n  // properly and set the thrown-on-failure mode.  Therefore, we don't\n  // use Google Test's constructs for defining and running tests\n  // (e.g. TEST and RUN_ALL_TESTS) here.\n\n  // In the throw-on-failure mode with exceptions disabled, this\n  // assertion will cause the program to exit with a non-zero code.\n  EXPECT_EQ(2, 3);\n\n  // When not in the throw-on-failure mode, the control will reach\n  // here.\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Verifies that Google Test warns the user when not initialized properly.\"\"\"\n\n__author__ = 'wan@google.com (Zhanyong Wan)'\n\nimport gtest_test_utils\n\n\nCOMMAND = gtest_test_utils.GetTestExecutablePath('gtest_uninitialized_test_')\n\n\ndef Assert(condition):\n  if not condition:\n    raise AssertionError\n\n\ndef AssertEq(expected, actual):\n  if expected != actual:\n    print 'Expected: %s' % (expected,)\n    print '  Actual: %s' % (actual,)\n    raise AssertionError\n\n\ndef TestExitCodeAndOutput(command):\n  \"\"\"Runs the given command and verifies its exit code and output.\"\"\"\n\n  # Verifies that 'command' exits with code 1.\n  p = gtest_test_utils.Subprocess(command)\n  Assert(p.exited)\n  AssertEq(1, p.exit_code)\n  Assert('InitGoogleTest' in p.output)\n\n\nclass GTestUninitializedTest(gtest_test_utils.TestCase):\n  def testExitCodeAndOutput(self):\n    TestExitCodeAndOutput(COMMAND)\n\n\nif __name__ == '__main__':\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test_.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n\n#include <gtest/gtest.h>\n\nTEST(DummyTest, Dummy) {\n  // This test doesn't verify anything.  We just need it to create a\n  // realistic stage for testing the behavior of Google Test when\n  // RUN_ALL_TESTS() is called without testing::InitGoogleTest() being\n  // called first.\n}\n\nint main() {\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_unittest.cc",
    "content": "// Copyright 2005, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// Tests for Google Test itself.  This verifies that the basic constructs of\n// Google Test work.\n\n#include <gtest/gtest.h>\n#include <vector>\n\n// Verifies that the command line flag variables can be accessed\n// in code once <gtest/gtest.h> has been #included.\n// Do not move it after other #includes.\nTEST(CommandLineFlagsTest, CanBeAccessedInCodeOnceGTestHIsIncluded) {\n  bool dummy = testing::GTEST_FLAG(also_run_disabled_tests)\n      || testing::GTEST_FLAG(break_on_failure)\n      || testing::GTEST_FLAG(catch_exceptions)\n      || testing::GTEST_FLAG(color) != \"unknown\"\n      || testing::GTEST_FLAG(filter) != \"unknown\"\n      || testing::GTEST_FLAG(list_tests)\n      || testing::GTEST_FLAG(output) != \"unknown\"\n      || testing::GTEST_FLAG(print_time)\n      || testing::GTEST_FLAG(random_seed)\n      || testing::GTEST_FLAG(repeat) > 0\n      || testing::GTEST_FLAG(show_internal_stack_frames)\n      || testing::GTEST_FLAG(shuffle)\n      || testing::GTEST_FLAG(stack_trace_depth) > 0\n      || testing::GTEST_FLAG(throw_on_failure);\n  EXPECT_TRUE(dummy || !dummy);  // Suppresses warning that dummy is unused.\n}\n\n#include <gtest/gtest-spi.h>\n\n// Indicates that this translation unit is part of Google Test's\n// implementation.  It must come before gtest-internal-inl.h is\n// included, or there will be a compiler error.  This trick is to\n// prevent a user from accidentally including gtest-internal-inl.h in\n// his code.\n#define GTEST_IMPLEMENTATION_ 1\n#include \"src/gtest-internal-inl.h\"\n#undef GTEST_IMPLEMENTATION_\n\n#include <limits.h>  // For INT_MAX.\n#include <stdlib.h>\n#include <time.h>\n\n#include <map>\n\nnamespace testing {\nnamespace internal {\n\n// Provides access to otherwise private parts of the TestEventListeners class\n// that are needed to test it.\nclass TestEventListenersAccessor {\n public:\n  static TestEventListener* GetRepeater(TestEventListeners* listeners) {\n    return listeners->repeater();\n  }\n\n  static void SetDefaultResultPrinter(TestEventListeners* listeners,\n                                      TestEventListener* listener) {\n    listeners->SetDefaultResultPrinter(listener);\n  }\n  static void SetDefaultXmlGenerator(TestEventListeners* listeners,\n                                     TestEventListener* listener) {\n    listeners->SetDefaultXmlGenerator(listener);\n  }\n\n  static bool EventForwardingEnabled(const TestEventListeners& listeners) {\n    return listeners.EventForwardingEnabled();\n  }\n\n  static void SuppressEventForwarding(TestEventListeners* listeners) {\n    listeners->SuppressEventForwarding();\n  }\n};\n\n}  // namespace internal\n}  // namespace testing\n\nusing testing::AssertionFailure;\nusing testing::AssertionResult;\nusing testing::AssertionSuccess;\nusing testing::DoubleLE;\nusing testing::EmptyTestEventListener;\nusing testing::FloatLE;\nusing testing::GTEST_FLAG(also_run_disabled_tests);\nusing testing::GTEST_FLAG(break_on_failure);\nusing testing::GTEST_FLAG(catch_exceptions);\nusing testing::GTEST_FLAG(color);\nusing testing::GTEST_FLAG(death_test_use_fork);\nusing testing::GTEST_FLAG(filter);\nusing testing::GTEST_FLAG(list_tests);\nusing testing::GTEST_FLAG(output);\nusing testing::GTEST_FLAG(print_time);\nusing testing::GTEST_FLAG(random_seed);\nusing testing::GTEST_FLAG(repeat);\nusing testing::GTEST_FLAG(show_internal_stack_frames);\nusing testing::GTEST_FLAG(shuffle);\nusing testing::GTEST_FLAG(stack_trace_depth);\nusing testing::GTEST_FLAG(throw_on_failure);\nusing testing::IsNotSubstring;\nusing testing::IsSubstring;\nusing testing::Message;\nusing testing::ScopedFakeTestPartResultReporter;\nusing testing::StaticAssertTypeEq;\nusing testing::Test;\nusing testing::TestEventListeners;\nusing testing::TestCase;\nusing testing::TestPartResult;\nusing testing::TestPartResultArray;\nusing testing::TestProperty;\nusing testing::TestResult;\nusing testing::UnitTest;\nusing testing::kMaxStackTraceDepth;\nusing testing::internal::AlwaysFalse;\nusing testing::internal::AlwaysTrue;\nusing testing::internal::AppendUserMessage;\nusing testing::internal::CodePointToUtf8;\nusing testing::internal::CountIf;\nusing testing::internal::EqFailure;\nusing testing::internal::FloatingPoint;\nusing testing::internal::FormatTimeInMillisAsSeconds;\nusing testing::internal::ForEach;\nusing testing::internal::GTestFlagSaver;\nusing testing::internal::GetCurrentOsStackTraceExceptTop;\nusing testing::internal::GetElementOr;\nusing testing::internal::GetNextRandomSeed;\nusing testing::internal::GetRandomSeedFromFlag;\nusing testing::internal::GetTestTypeId;\nusing testing::internal::GetTypeId;\nusing testing::internal::GetUnitTestImpl;\nusing testing::internal::Int32;\nusing testing::internal::Int32FromEnvOrDie;\nusing testing::internal::ParseInt32Flag;\nusing testing::internal::ShouldRunTestOnShard;\nusing testing::internal::ShouldShard;\nusing testing::internal::ShouldUseColor;\nusing testing::internal::Shuffle;\nusing testing::internal::ShuffleRange;\nusing testing::internal::StreamableToString;\nusing testing::internal::String;\nusing testing::internal::TestEventListenersAccessor;\nusing testing::internal::TestResultAccessor;\nusing testing::internal::UInt32;\nusing testing::internal::WideStringToUtf8;\nusing testing::internal::kMaxRandomSeed;\nusing testing::internal::kTestTypeIdInGoogleTest;\nusing testing::internal::scoped_ptr;\n\n#if GTEST_HAS_STREAM_REDIRECTION_\nusing testing::internal::CaptureStdout;\nusing testing::internal::GetCapturedStdout;\n#endif  // GTEST_HAS_STREAM_REDIRECTION_\n\n#if GTEST_IS_THREADSAFE\nusing testing::internal::ThreadWithParam;\n#endif\n\nclass TestingVector : public std::vector<int> {\n};\n\n::std::ostream& operator<<(::std::ostream& os,\n                           const TestingVector& vector) {\n  os << \"{ \";\n  for (size_t i = 0; i < vector.size(); i++) {\n    os << vector[i] << \" \";\n  }\n  os << \"}\";\n  return os;\n}\n\n// This line tests that we can define tests in an unnamed namespace.\nnamespace {\n\nTEST(GetRandomSeedFromFlagTest, HandlesZero) {\n  const int seed = GetRandomSeedFromFlag(0);\n  EXPECT_LE(1, seed);\n  EXPECT_LE(seed, static_cast<int>(kMaxRandomSeed));\n}\n\nTEST(GetRandomSeedFromFlagTest, PreservesValidSeed) {\n  EXPECT_EQ(1, GetRandomSeedFromFlag(1));\n  EXPECT_EQ(2, GetRandomSeedFromFlag(2));\n  EXPECT_EQ(kMaxRandomSeed - 1, GetRandomSeedFromFlag(kMaxRandomSeed - 1));\n  EXPECT_EQ(static_cast<int>(kMaxRandomSeed),\n            GetRandomSeedFromFlag(kMaxRandomSeed));\n}\n\nTEST(GetRandomSeedFromFlagTest, NormalizesInvalidSeed) {\n  const int seed1 = GetRandomSeedFromFlag(-1);\n  EXPECT_LE(1, seed1);\n  EXPECT_LE(seed1, static_cast<int>(kMaxRandomSeed));\n\n  const int seed2 = GetRandomSeedFromFlag(kMaxRandomSeed + 1);\n  EXPECT_LE(1, seed2);\n  EXPECT_LE(seed2, static_cast<int>(kMaxRandomSeed));\n}\n\nTEST(GetNextRandomSeedTest, WorksForValidInput) {\n  EXPECT_EQ(2, GetNextRandomSeed(1));\n  EXPECT_EQ(3, GetNextRandomSeed(2));\n  EXPECT_EQ(static_cast<int>(kMaxRandomSeed),\n            GetNextRandomSeed(kMaxRandomSeed - 1));\n  EXPECT_EQ(1, GetNextRandomSeed(kMaxRandomSeed));\n\n  // We deliberately don't test GetNextRandomSeed() with invalid\n  // inputs, as that requires death tests, which are expensive.  This\n  // is fine as GetNextRandomSeed() is internal and has a\n  // straightforward definition.\n}\n\nstatic void ClearCurrentTestPartResults() {\n  TestResultAccessor::ClearTestPartResults(\n      GetUnitTestImpl()->current_test_result());\n}\n\n// Tests GetTypeId.\n\nTEST(GetTypeIdTest, ReturnsSameValueForSameType) {\n  EXPECT_EQ(GetTypeId<int>(), GetTypeId<int>());\n  EXPECT_EQ(GetTypeId<Test>(), GetTypeId<Test>());\n}\n\nclass SubClassOfTest : public Test {};\nclass AnotherSubClassOfTest : public Test {};\n\nTEST(GetTypeIdTest, ReturnsDifferentValuesForDifferentTypes) {\n  EXPECT_NE(GetTypeId<int>(), GetTypeId<const int>());\n  EXPECT_NE(GetTypeId<int>(), GetTypeId<char>());\n  EXPECT_NE(GetTypeId<int>(), GetTestTypeId());\n  EXPECT_NE(GetTypeId<SubClassOfTest>(), GetTestTypeId());\n  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTestTypeId());\n  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTypeId<SubClassOfTest>());\n}\n\n// Verifies that GetTestTypeId() returns the same value, no matter it\n// is called from inside Google Test or outside of it.\nTEST(GetTestTypeIdTest, ReturnsTheSameValueInsideOrOutsideOfGoogleTest) {\n  EXPECT_EQ(kTestTypeIdInGoogleTest, GetTestTypeId());\n}\n\n// Tests FormatTimeInMillisAsSeconds().\n\nTEST(FormatTimeInMillisAsSecondsTest, FormatsZero) {\n  EXPECT_EQ(\"0\", FormatTimeInMillisAsSeconds(0));\n}\n\nTEST(FormatTimeInMillisAsSecondsTest, FormatsPositiveNumber) {\n  EXPECT_EQ(\"0.003\", FormatTimeInMillisAsSeconds(3));\n  EXPECT_EQ(\"0.01\", FormatTimeInMillisAsSeconds(10));\n  EXPECT_EQ(\"0.2\", FormatTimeInMillisAsSeconds(200));\n  EXPECT_EQ(\"1.2\", FormatTimeInMillisAsSeconds(1200));\n  EXPECT_EQ(\"3\", FormatTimeInMillisAsSeconds(3000));\n}\n\nTEST(FormatTimeInMillisAsSecondsTest, FormatsNegativeNumber) {\n  EXPECT_EQ(\"-0.003\", FormatTimeInMillisAsSeconds(-3));\n  EXPECT_EQ(\"-0.01\", FormatTimeInMillisAsSeconds(-10));\n  EXPECT_EQ(\"-0.2\", FormatTimeInMillisAsSeconds(-200));\n  EXPECT_EQ(\"-1.2\", FormatTimeInMillisAsSeconds(-1200));\n  EXPECT_EQ(\"-3\", FormatTimeInMillisAsSeconds(-3000));\n}\n\n#if GTEST_CAN_COMPARE_NULL\n\n#ifdef __BORLANDC__\n// Silences warnings: \"Condition is always true\", \"Unreachable code\"\n#pragma option push -w-ccc -w-rch\n#endif\n\n// Tests that GTEST_IS_NULL_LITERAL_(x) is true when x is a null\n// pointer literal.\nTEST(NullLiteralTest, IsTrueForNullLiterals) {\n  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(NULL));\n  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0));\n  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0U));\n  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0L));\n  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(false));\n#ifndef __BORLANDC__\n  // Some compilers may fail to detect some null pointer literals;\n  // as long as users of the framework don't use such literals, this\n  // is harmless.\n  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(1 - 1));\n  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(true && false));\n#endif\n}\n\n// Tests that GTEST_IS_NULL_LITERAL_(x) is false when x is not a null\n// pointer literal.\nTEST(NullLiteralTest, IsFalseForNonNullLiterals) {\n  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(1));\n  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(0.0));\n  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_('a'));\n  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(static_cast<void*>(NULL)));\n}\n\n#ifdef __BORLANDC__\n// Restores warnings after previous \"#pragma option push\" suppressed them.\n#pragma option pop\n#endif\n\n#endif  // GTEST_CAN_COMPARE_NULL\n//\n// Tests CodePointToUtf8().\n\n// Tests that the NUL character L'\\0' is encoded correctly.\nTEST(CodePointToUtf8Test, CanEncodeNul) {\n  char buffer[32];\n  EXPECT_STREQ(\"\", CodePointToUtf8(L'\\0', buffer));\n}\n\n// Tests that ASCII characters are encoded correctly.\nTEST(CodePointToUtf8Test, CanEncodeAscii) {\n  char buffer[32];\n  EXPECT_STREQ(\"a\", CodePointToUtf8(L'a', buffer));\n  EXPECT_STREQ(\"Z\", CodePointToUtf8(L'Z', buffer));\n  EXPECT_STREQ(\"&\", CodePointToUtf8(L'&', buffer));\n  EXPECT_STREQ(\"\\x7F\", CodePointToUtf8(L'\\x7F', buffer));\n}\n\n// Tests that Unicode code-points that have 8 to 11 bits are encoded\n// as 110xxxxx 10xxxxxx.\nTEST(CodePointToUtf8Test, CanEncode8To11Bits) {\n  char buffer[32];\n  // 000 1101 0011 => 110-00011 10-010011\n  EXPECT_STREQ(\"\\xC3\\x93\", CodePointToUtf8(L'\\xD3', buffer));\n\n  // 101 0111 0110 => 110-10101 10-110110\n  EXPECT_STREQ(\"\\xD5\\xB6\", CodePointToUtf8(L'\\x576', buffer));\n}\n\n// Tests that Unicode code-points that have 12 to 16 bits are encoded\n// as 1110xxxx 10xxxxxx 10xxxxxx.\nTEST(CodePointToUtf8Test, CanEncode12To16Bits) {\n  char buffer[32];\n  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011\n  EXPECT_STREQ(\"\\xE0\\xA3\\x93\", CodePointToUtf8(L'\\x8D3', buffer));\n\n  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101\n  EXPECT_STREQ(\"\\xEC\\x9D\\x8D\", CodePointToUtf8(L'\\xC74D', buffer));\n}\n\n#if !GTEST_WIDE_STRING_USES_UTF16_\n// Tests in this group require a wchar_t to hold > 16 bits, and thus\n// are skipped on Windows, Cygwin, and Symbian, where a wchar_t is\n// 16-bit wide. This code may not compile on those systems.\n\n// Tests that Unicode code-points that have 17 to 21 bits are encoded\n// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx.\nTEST(CodePointToUtf8Test, CanEncode17To21Bits) {\n  char buffer[32];\n  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011\n  EXPECT_STREQ(\"\\xF0\\x90\\xA3\\x93\", CodePointToUtf8(L'\\x108D3', buffer));\n\n  // 0 0001 0000 0100 0000 0000 => 11110-000 10-010000 10-010000 10-000000\n  EXPECT_STREQ(\"\\xF0\\x90\\x90\\x80\", CodePointToUtf8(L'\\x10400', buffer));\n\n  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100\n  EXPECT_STREQ(\"\\xF4\\x88\\x98\\xB4\", CodePointToUtf8(L'\\x108634', buffer));\n}\n\n// Tests that encoding an invalid code-point generates the expected result.\nTEST(CodePointToUtf8Test, CanEncodeInvalidCodePoint) {\n  char buffer[32];\n  EXPECT_STREQ(\"(Invalid Unicode 0x1234ABCD)\",\n               CodePointToUtf8(L'\\x1234ABCD', buffer));\n}\n\n#endif  // !GTEST_WIDE_STRING_USES_UTF16_\n\n// Tests WideStringToUtf8().\n\n// Tests that the NUL character L'\\0' is encoded correctly.\nTEST(WideStringToUtf8Test, CanEncodeNul) {\n  EXPECT_STREQ(\"\", WideStringToUtf8(L\"\", 0).c_str());\n  EXPECT_STREQ(\"\", WideStringToUtf8(L\"\", -1).c_str());\n}\n\n// Tests that ASCII strings are encoded correctly.\nTEST(WideStringToUtf8Test, CanEncodeAscii) {\n  EXPECT_STREQ(\"a\", WideStringToUtf8(L\"a\", 1).c_str());\n  EXPECT_STREQ(\"ab\", WideStringToUtf8(L\"ab\", 2).c_str());\n  EXPECT_STREQ(\"a\", WideStringToUtf8(L\"a\", -1).c_str());\n  EXPECT_STREQ(\"ab\", WideStringToUtf8(L\"ab\", -1).c_str());\n}\n\n// Tests that Unicode code-points that have 8 to 11 bits are encoded\n// as 110xxxxx 10xxxxxx.\nTEST(WideStringToUtf8Test, CanEncode8To11Bits) {\n  // 000 1101 0011 => 110-00011 10-010011\n  EXPECT_STREQ(\"\\xC3\\x93\", WideStringToUtf8(L\"\\xD3\", 1).c_str());\n  EXPECT_STREQ(\"\\xC3\\x93\", WideStringToUtf8(L\"\\xD3\", -1).c_str());\n\n  // 101 0111 0110 => 110-10101 10-110110\n  EXPECT_STREQ(\"\\xD5\\xB6\", WideStringToUtf8(L\"\\x576\", 1).c_str());\n  EXPECT_STREQ(\"\\xD5\\xB6\", WideStringToUtf8(L\"\\x576\", -1).c_str());\n}\n\n// Tests that Unicode code-points that have 12 to 16 bits are encoded\n// as 1110xxxx 10xxxxxx 10xxxxxx.\nTEST(WideStringToUtf8Test, CanEncode12To16Bits) {\n  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011\n  EXPECT_STREQ(\"\\xE0\\xA3\\x93\", WideStringToUtf8(L\"\\x8D3\", 1).c_str());\n  EXPECT_STREQ(\"\\xE0\\xA3\\x93\", WideStringToUtf8(L\"\\x8D3\", -1).c_str());\n\n  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101\n  EXPECT_STREQ(\"\\xEC\\x9D\\x8D\", WideStringToUtf8(L\"\\xC74D\", 1).c_str());\n  EXPECT_STREQ(\"\\xEC\\x9D\\x8D\", WideStringToUtf8(L\"\\xC74D\", -1).c_str());\n}\n\n// Tests that the conversion stops when the function encounters \\0 character.\nTEST(WideStringToUtf8Test, StopsOnNulCharacter) {\n  EXPECT_STREQ(\"ABC\", WideStringToUtf8(L\"ABC\\0XYZ\", 100).c_str());\n}\n\n// Tests that the conversion stops when the function reaches the limit\n// specified by the 'length' parameter.\nTEST(WideStringToUtf8Test, StopsWhenLengthLimitReached) {\n  EXPECT_STREQ(\"ABC\", WideStringToUtf8(L\"ABCDEF\", 3).c_str());\n}\n\n\n#if !GTEST_WIDE_STRING_USES_UTF16_\n// Tests that Unicode code-points that have 17 to 21 bits are encoded\n// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. This code may not compile\n// on the systems using UTF-16 encoding.\nTEST(WideStringToUtf8Test, CanEncode17To21Bits) {\n  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011\n  EXPECT_STREQ(\"\\xF0\\x90\\xA3\\x93\", WideStringToUtf8(L\"\\x108D3\", 1).c_str());\n  EXPECT_STREQ(\"\\xF0\\x90\\xA3\\x93\", WideStringToUtf8(L\"\\x108D3\", -1).c_str());\n\n  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100\n  EXPECT_STREQ(\"\\xF4\\x88\\x98\\xB4\", WideStringToUtf8(L\"\\x108634\", 1).c_str());\n  EXPECT_STREQ(\"\\xF4\\x88\\x98\\xB4\", WideStringToUtf8(L\"\\x108634\", -1).c_str());\n}\n\n// Tests that encoding an invalid code-point generates the expected result.\nTEST(WideStringToUtf8Test, CanEncodeInvalidCodePoint) {\n  EXPECT_STREQ(\"(Invalid Unicode 0xABCDFF)\",\n               WideStringToUtf8(L\"\\xABCDFF\", -1).c_str());\n}\n#else  // !GTEST_WIDE_STRING_USES_UTF16_\n// Tests that surrogate pairs are encoded correctly on the systems using\n// UTF-16 encoding in the wide strings.\nTEST(WideStringToUtf8Test, CanEncodeValidUtf16SUrrogatePairs) {\n  EXPECT_STREQ(\"\\xF0\\x90\\x90\\x80\",\n               WideStringToUtf8(L\"\\xD801\\xDC00\", -1).c_str());\n}\n\n// Tests that encoding an invalid UTF-16 surrogate pair\n// generates the expected result.\nTEST(WideStringToUtf8Test, CanEncodeInvalidUtf16SurrogatePair) {\n  // Leading surrogate is at the end of the string.\n  EXPECT_STREQ(\"\\xED\\xA0\\x80\", WideStringToUtf8(L\"\\xD800\", -1).c_str());\n  // Leading surrogate is not followed by the trailing surrogate.\n  EXPECT_STREQ(\"\\xED\\xA0\\x80$\", WideStringToUtf8(L\"\\xD800$\", -1).c_str());\n  // Trailing surrogate appearas without a leading surrogate.\n  EXPECT_STREQ(\"\\xED\\xB0\\x80PQR\", WideStringToUtf8(L\"\\xDC00PQR\", -1).c_str());\n}\n#endif  // !GTEST_WIDE_STRING_USES_UTF16_\n\n// Tests that codepoint concatenation works correctly.\n#if !GTEST_WIDE_STRING_USES_UTF16_\nTEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) {\n  EXPECT_STREQ(\n      \"\\xF4\\x88\\x98\\xB4\"\n          \"\\xEC\\x9D\\x8D\"\n          \"\\n\"\n          \"\\xD5\\xB6\"\n          \"\\xE0\\xA3\\x93\"\n          \"\\xF4\\x88\\x98\\xB4\",\n      WideStringToUtf8(L\"\\x108634\\xC74D\\n\\x576\\x8D3\\x108634\", -1).c_str());\n}\n#else\nTEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) {\n  EXPECT_STREQ(\n      \"\\xEC\\x9D\\x8D\" \"\\n\" \"\\xD5\\xB6\" \"\\xE0\\xA3\\x93\",\n      WideStringToUtf8(L\"\\xC74D\\n\\x576\\x8D3\", -1).c_str());\n}\n#endif  // !GTEST_WIDE_STRING_USES_UTF16_\n\n// Tests the Random class.\n\nTEST(RandomDeathTest, GeneratesCrashesOnInvalidRange) {\n  testing::internal::Random random(42);\n  EXPECT_DEATH_IF_SUPPORTED(\n      random.Generate(0),\n      \"Cannot generate a number in the range \\\\[0, 0\\\\)\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      random.Generate(testing::internal::Random::kMaxRange + 1),\n      \"Generation of a number in \\\\[0, 2147483649\\\\) was requested, \"\n      \"but this can only generate numbers in \\\\[0, 2147483648\\\\)\");\n}\n\nTEST(RandomTest, GeneratesNumbersWithinRange) {\n  const UInt32 kRange = 10000;\n  testing::internal::Random random(12345);\n  for (int i = 0; i < 10; i++) {\n    EXPECT_LT(random.Generate(kRange), kRange) << \" for iteration \" << i;\n  }\n\n  testing::internal::Random random2(testing::internal::Random::kMaxRange);\n  for (int i = 0; i < 10; i++) {\n    EXPECT_LT(random2.Generate(kRange), kRange) << \" for iteration \" << i;\n  }\n}\n\nTEST(RandomTest, RepeatsWhenReseeded) {\n  const int kSeed = 123;\n  const int kArraySize = 10;\n  const UInt32 kRange = 10000;\n  UInt32 values[kArraySize];\n\n  testing::internal::Random random(kSeed);\n  for (int i = 0; i < kArraySize; i++) {\n    values[i] = random.Generate(kRange);\n  }\n\n  random.Reseed(kSeed);\n  for (int i = 0; i < kArraySize; i++) {\n    EXPECT_EQ(values[i], random.Generate(kRange)) << \" for iteration \" << i;\n  }\n}\n\n// Tests STL container utilities.\n\n// Tests CountIf().\n\nstatic bool IsPositive(int n) { return n > 0; }\n\nTEST(ContainerUtilityTest, CountIf) {\n  std::vector<int> v;\n  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works for an empty container.\n\n  v.push_back(-1);\n  v.push_back(0);\n  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works when no value satisfies.\n\n  v.push_back(2);\n  v.push_back(-10);\n  v.push_back(10);\n  EXPECT_EQ(2, CountIf(v, IsPositive));\n}\n\n// Tests ForEach().\n\nstatic int g_sum = 0;\nstatic void Accumulate(int n) { g_sum += n; }\n\nTEST(ContainerUtilityTest, ForEach) {\n  std::vector<int> v;\n  g_sum = 0;\n  ForEach(v, Accumulate);\n  EXPECT_EQ(0, g_sum);  // Works for an empty container;\n\n  g_sum = 0;\n  v.push_back(1);\n  ForEach(v, Accumulate);\n  EXPECT_EQ(1, g_sum);  // Works for a container with one element.\n\n  g_sum = 0;\n  v.push_back(20);\n  v.push_back(300);\n  ForEach(v, Accumulate);\n  EXPECT_EQ(321, g_sum);\n}\n\n// Tests GetElementOr().\nTEST(ContainerUtilityTest, GetElementOr) {\n  std::vector<char> a;\n  EXPECT_EQ('x', GetElementOr(a, 0, 'x'));\n\n  a.push_back('a');\n  a.push_back('b');\n  EXPECT_EQ('a', GetElementOr(a, 0, 'x'));\n  EXPECT_EQ('b', GetElementOr(a, 1, 'x'));\n  EXPECT_EQ('x', GetElementOr(a, -2, 'x'));\n  EXPECT_EQ('x', GetElementOr(a, 2, 'x'));\n}\n\nTEST(ContainerUtilityDeathTest, ShuffleRange) {\n  std::vector<int> a;\n  a.push_back(0);\n  a.push_back(1);\n  a.push_back(2);\n  testing::internal::Random random(1);\n\n  EXPECT_DEATH_IF_SUPPORTED(\n      ShuffleRange(&random, -1, 1, &a),\n      \"Invalid shuffle range start -1: must be in range \\\\[0, 3\\\\]\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      ShuffleRange(&random, 4, 4, &a),\n      \"Invalid shuffle range start 4: must be in range \\\\[0, 3\\\\]\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      ShuffleRange(&random, 3, 2, &a),\n      \"Invalid shuffle range finish 2: must be in range \\\\[3, 3\\\\]\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      ShuffleRange(&random, 3, 4, &a),\n      \"Invalid shuffle range finish 4: must be in range \\\\[3, 3\\\\]\");\n}\n\nclass VectorShuffleTest : public Test {\n protected:\n  static const int kVectorSize = 20;\n\n  VectorShuffleTest() : random_(1) {\n    for (int i = 0; i < kVectorSize; i++) {\n      vector_.push_back(i);\n    }\n  }\n\n  static bool VectorIsCorrupt(const TestingVector& vector) {\n    if (kVectorSize != static_cast<int>(vector.size())) {\n      return true;\n    }\n\n    bool found_in_vector[kVectorSize] = { false };\n    for (size_t i = 0; i < vector.size(); i++) {\n      const int e = vector[i];\n      if (e < 0 || e >= kVectorSize || found_in_vector[e]) {\n        return true;\n      }\n      found_in_vector[e] = true;\n    }\n\n    // Vector size is correct, elements' range is correct, no\n    // duplicate elements.  Therefore no corruption has occurred.\n    return false;\n  }\n\n  static bool VectorIsNotCorrupt(const TestingVector& vector) {\n    return !VectorIsCorrupt(vector);\n  }\n\n  static bool RangeIsShuffled(const TestingVector& vector, int begin, int end) {\n    for (int i = begin; i < end; i++) {\n      if (i != vector[i]) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  static bool RangeIsUnshuffled(\n      const TestingVector& vector, int begin, int end) {\n    return !RangeIsShuffled(vector, begin, end);\n  }\n\n  static bool VectorIsShuffled(const TestingVector& vector) {\n    return RangeIsShuffled(vector, 0, static_cast<int>(vector.size()));\n  }\n\n  static bool VectorIsUnshuffled(const TestingVector& vector) {\n    return !VectorIsShuffled(vector);\n  }\n\n  testing::internal::Random random_;\n  TestingVector vector_;\n};  // class VectorShuffleTest\n\nconst int VectorShuffleTest::kVectorSize;\n\nTEST_F(VectorShuffleTest, HandlesEmptyRange) {\n  // Tests an empty range at the beginning...\n  ShuffleRange(&random_, 0, 0, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n\n  // ...in the middle...\n  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n\n  // ...at the end...\n  ShuffleRange(&random_, kVectorSize - 1, kVectorSize - 1, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n\n  // ...and past the end.\n  ShuffleRange(&random_, kVectorSize, kVectorSize, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n}\n\nTEST_F(VectorShuffleTest, HandlesRangeOfSizeOne) {\n  // Tests a size one range at the beginning...\n  ShuffleRange(&random_, 0, 1, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n\n  // ...in the middle...\n  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2 + 1, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n\n  // ...and at the end.\n  ShuffleRange(&random_, kVectorSize - 1, kVectorSize, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsUnshuffled, vector_);\n}\n\n// Because we use our own random number generator and a fixed seed,\n// we can guarantee that the following \"random\" tests will succeed.\n\nTEST_F(VectorShuffleTest, ShufflesEntireVector) {\n  Shuffle(&random_, &vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  EXPECT_FALSE(VectorIsUnshuffled(vector_)) << vector_;\n\n  // Tests the first and last elements in particular to ensure that\n  // there are no off-by-one problems in our shuffle algorithm.\n  EXPECT_NE(0, vector_[0]);\n  EXPECT_NE(kVectorSize - 1, vector_[kVectorSize - 1]);\n}\n\nTEST_F(VectorShuffleTest, ShufflesStartOfVector) {\n  const int kRangeSize = kVectorSize/2;\n\n  ShuffleRange(&random_, 0, kRangeSize, &vector_);\n\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  EXPECT_PRED3(RangeIsShuffled, vector_, 0, kRangeSize);\n  EXPECT_PRED3(RangeIsUnshuffled, vector_, kRangeSize, kVectorSize);\n}\n\nTEST_F(VectorShuffleTest, ShufflesEndOfVector) {\n  const int kRangeSize = kVectorSize / 2;\n  ShuffleRange(&random_, kRangeSize, kVectorSize, &vector_);\n\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);\n  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, kVectorSize);\n}\n\nTEST_F(VectorShuffleTest, ShufflesMiddleOfVector) {\n  int kRangeSize = kVectorSize/3;\n  ShuffleRange(&random_, kRangeSize, 2*kRangeSize, &vector_);\n\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);\n  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, 2*kRangeSize);\n  EXPECT_PRED3(RangeIsUnshuffled, vector_, 2*kRangeSize, kVectorSize);\n}\n\nTEST_F(VectorShuffleTest, ShufflesRepeatably) {\n  TestingVector vector2;\n  for (int i = 0; i < kVectorSize; i++) {\n    vector2.push_back(i);\n  }\n\n  random_.Reseed(1234);\n  Shuffle(&random_, &vector_);\n  random_.Reseed(1234);\n  Shuffle(&random_, &vector2);\n\n  ASSERT_PRED1(VectorIsNotCorrupt, vector_);\n  ASSERT_PRED1(VectorIsNotCorrupt, vector2);\n\n  for (int i = 0; i < kVectorSize; i++) {\n    EXPECT_EQ(vector_[i], vector2[i]) << \" where i is \" << i;\n  }\n}\n\n// Tests the size of the AssertHelper class.\n\nTEST(AssertHelperTest, AssertHelperIsSmall) {\n  // To avoid breaking clients that use lots of assertions in one\n  // function, we cannot grow the size of AssertHelper.\n  EXPECT_LE(sizeof(testing::internal::AssertHelper), sizeof(void*));\n}\n\n// Tests the String class.\n\n// Tests String's constructors.\nTEST(StringTest, Constructors) {\n  // Default ctor.\n  String s1;\n  // We aren't using EXPECT_EQ(NULL, s1.c_str()) because comparing\n  // pointers with NULL isn't supported on all platforms.\n  EXPECT_EQ(0U, s1.length());\n  EXPECT_TRUE(NULL == s1.c_str());\n\n  // Implicitly constructs from a C-string.\n  String s2 = \"Hi\";\n  EXPECT_EQ(2U, s2.length());\n  EXPECT_STREQ(\"Hi\", s2.c_str());\n\n  // Constructs from a C-string and a length.\n  String s3(\"hello\", 3);\n  EXPECT_EQ(3U, s3.length());\n  EXPECT_STREQ(\"hel\", s3.c_str());\n\n  // The empty String should be created when String is constructed with\n  // a NULL pointer and length 0.\n  EXPECT_EQ(0U, String(NULL, 0).length());\n  EXPECT_FALSE(String(NULL, 0).c_str() == NULL);\n\n  // Constructs a String that contains '\\0'.\n  String s4(\"a\\0bcd\", 4);\n  EXPECT_EQ(4U, s4.length());\n  EXPECT_EQ('a', s4.c_str()[0]);\n  EXPECT_EQ('\\0', s4.c_str()[1]);\n  EXPECT_EQ('b', s4.c_str()[2]);\n  EXPECT_EQ('c', s4.c_str()[3]);\n\n  // Copy ctor where the source is NULL.\n  const String null_str;\n  String s5 = null_str;\n  EXPECT_TRUE(s5.c_str() == NULL);\n\n  // Copy ctor where the source isn't NULL.\n  String s6 = s3;\n  EXPECT_EQ(3U, s6.length());\n  EXPECT_STREQ(\"hel\", s6.c_str());\n\n  // Copy ctor where the source contains '\\0'.\n  String s7 = s4;\n  EXPECT_EQ(4U, s7.length());\n  EXPECT_EQ('a', s7.c_str()[0]);\n  EXPECT_EQ('\\0', s7.c_str()[1]);\n  EXPECT_EQ('b', s7.c_str()[2]);\n  EXPECT_EQ('c', s7.c_str()[3]);\n}\n\nTEST(StringTest, ConvertsFromStdString) {\n  // An empty std::string.\n  const std::string src1(\"\");\n  const String dest1 = src1;\n  EXPECT_EQ(0U, dest1.length());\n  EXPECT_STREQ(\"\", dest1.c_str());\n\n  // A normal std::string.\n  const std::string src2(\"Hi\");\n  const String dest2 = src2;\n  EXPECT_EQ(2U, dest2.length());\n  EXPECT_STREQ(\"Hi\", dest2.c_str());\n\n  // An std::string with an embedded NUL character.\n  const char src3[] = \"a\\0b\";\n  const String dest3 = std::string(src3, sizeof(src3));\n  EXPECT_EQ(sizeof(src3), dest3.length());\n  EXPECT_EQ('a', dest3.c_str()[0]);\n  EXPECT_EQ('\\0', dest3.c_str()[1]);\n  EXPECT_EQ('b', dest3.c_str()[2]);\n}\n\nTEST(StringTest, ConvertsToStdString) {\n  // An empty String.\n  const String src1(\"\");\n  const std::string dest1 = src1;\n  EXPECT_EQ(\"\", dest1);\n\n  // A normal String.\n  const String src2(\"Hi\");\n  const std::string dest2 = src2;\n  EXPECT_EQ(\"Hi\", dest2);\n\n  // A String containing a '\\0'.\n  const String src3(\"x\\0y\", 3);\n  const std::string dest3 = src3;\n  EXPECT_EQ(std::string(\"x\\0y\", 3), dest3);\n}\n\n#if GTEST_HAS_GLOBAL_STRING\n\nTEST(StringTest, ConvertsFromGlobalString) {\n  // An empty ::string.\n  const ::string src1(\"\");\n  const String dest1 = src1;\n  EXPECT_EQ(0U, dest1.length());\n  EXPECT_STREQ(\"\", dest1.c_str());\n\n  // A normal ::string.\n  const ::string src2(\"Hi\");\n  const String dest2 = src2;\n  EXPECT_EQ(2U, dest2.length());\n  EXPECT_STREQ(\"Hi\", dest2.c_str());\n\n  // An ::string with an embedded NUL character.\n  const char src3[] = \"x\\0y\";\n  const String dest3 = ::string(src3, sizeof(src3));\n  EXPECT_EQ(sizeof(src3), dest3.length());\n  EXPECT_EQ('x', dest3.c_str()[0]);\n  EXPECT_EQ('\\0', dest3.c_str()[1]);\n  EXPECT_EQ('y', dest3.c_str()[2]);\n}\n\nTEST(StringTest, ConvertsToGlobalString) {\n  // An empty String.\n  const String src1(\"\");\n  const ::string dest1 = src1;\n  EXPECT_EQ(\"\", dest1);\n\n  // A normal String.\n  const String src2(\"Hi\");\n  const ::string dest2 = src2;\n  EXPECT_EQ(\"Hi\", dest2);\n\n  const String src3(\"x\\0y\", 3);\n  const ::string dest3 = src3;\n  EXPECT_EQ(::string(\"x\\0y\", 3), dest3);\n}\n\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n// Tests String::ShowCStringQuoted().\nTEST(StringTest, ShowCStringQuoted) {\n  EXPECT_STREQ(\"(null)\",\n               String::ShowCStringQuoted(NULL).c_str());\n  EXPECT_STREQ(\"\\\"\\\"\",\n               String::ShowCStringQuoted(\"\").c_str());\n  EXPECT_STREQ(\"\\\"foo\\\"\",\n               String::ShowCStringQuoted(\"foo\").c_str());\n}\n\n// Tests String::empty().\nTEST(StringTest, Empty) {\n  EXPECT_TRUE(String(\"\").empty());\n  EXPECT_FALSE(String().empty());\n  EXPECT_FALSE(String(NULL).empty());\n  EXPECT_FALSE(String(\"a\").empty());\n  EXPECT_FALSE(String(\"\\0\", 1).empty());\n}\n\n// Tests String::Compare().\nTEST(StringTest, Compare) {\n  // NULL vs NULL.\n  EXPECT_EQ(0, String().Compare(String()));\n\n  // NULL vs non-NULL.\n  EXPECT_EQ(-1, String().Compare(String(\"\")));\n\n  // Non-NULL vs NULL.\n  EXPECT_EQ(1, String(\"\").Compare(String()));\n\n  // The following covers non-NULL vs non-NULL.\n\n  // \"\" vs \"\".\n  EXPECT_EQ(0, String(\"\").Compare(String(\"\")));\n\n  // \"\" vs non-\"\".\n  EXPECT_EQ(-1, String(\"\").Compare(String(\"\\0\", 1)));\n  EXPECT_EQ(-1, String(\"\").Compare(\" \"));\n\n  // Non-\"\" vs \"\".\n  EXPECT_EQ(1, String(\"a\").Compare(String(\"\")));\n\n  // The following covers non-\"\" vs non-\"\".\n\n  // Same length and equal.\n  EXPECT_EQ(0, String(\"a\").Compare(String(\"a\")));\n\n  // Same length and different.\n  EXPECT_EQ(-1, String(\"a\\0b\", 3).Compare(String(\"a\\0c\", 3)));\n  EXPECT_EQ(1, String(\"b\").Compare(String(\"a\")));\n\n  // Different lengths.\n  EXPECT_EQ(-1, String(\"a\").Compare(String(\"ab\")));\n  EXPECT_EQ(-1, String(\"a\").Compare(String(\"a\\0\", 2)));\n  EXPECT_EQ(1, String(\"abc\").Compare(String(\"aacd\")));\n}\n\n// Tests String::operator==().\nTEST(StringTest, Equals) {\n  const String null(NULL);\n  EXPECT_TRUE(null == NULL);  // NOLINT\n  EXPECT_FALSE(null == \"\");  // NOLINT\n  EXPECT_FALSE(null == \"bar\");  // NOLINT\n\n  const String empty(\"\");\n  EXPECT_FALSE(empty == NULL);  // NOLINT\n  EXPECT_TRUE(empty == \"\");  // NOLINT\n  EXPECT_FALSE(empty == \"bar\");  // NOLINT\n\n  const String foo(\"foo\");\n  EXPECT_FALSE(foo == NULL);  // NOLINT\n  EXPECT_FALSE(foo == \"\");  // NOLINT\n  EXPECT_FALSE(foo == \"bar\");  // NOLINT\n  EXPECT_TRUE(foo == \"foo\");  // NOLINT\n\n  const String bar(\"x\\0y\", 3);\n  EXPECT_FALSE(bar == \"x\");\n}\n\n// Tests String::operator!=().\nTEST(StringTest, NotEquals) {\n  const String null(NULL);\n  EXPECT_FALSE(null != NULL);  // NOLINT\n  EXPECT_TRUE(null != \"\");  // NOLINT\n  EXPECT_TRUE(null != \"bar\");  // NOLINT\n\n  const String empty(\"\");\n  EXPECT_TRUE(empty != NULL);  // NOLINT\n  EXPECT_FALSE(empty != \"\");  // NOLINT\n  EXPECT_TRUE(empty != \"bar\");  // NOLINT\n\n  const String foo(\"foo\");\n  EXPECT_TRUE(foo != NULL);  // NOLINT\n  EXPECT_TRUE(foo != \"\");  // NOLINT\n  EXPECT_TRUE(foo != \"bar\");  // NOLINT\n  EXPECT_FALSE(foo != \"foo\");  // NOLINT\n\n  const String bar(\"x\\0y\", 3);\n  EXPECT_TRUE(bar != \"x\");\n}\n\n// Tests String::length().\nTEST(StringTest, Length) {\n  EXPECT_EQ(0U, String().length());\n  EXPECT_EQ(0U, String(\"\").length());\n  EXPECT_EQ(2U, String(\"ab\").length());\n  EXPECT_EQ(3U, String(\"a\\0b\", 3).length());\n}\n\n// Tests String::EndsWith().\nTEST(StringTest, EndsWith) {\n  EXPECT_TRUE(String(\"foobar\").EndsWith(\"bar\"));\n  EXPECT_TRUE(String(\"foobar\").EndsWith(\"\"));\n  EXPECT_TRUE(String(\"\").EndsWith(\"\"));\n\n  EXPECT_FALSE(String(\"foobar\").EndsWith(\"foo\"));\n  EXPECT_FALSE(String(\"\").EndsWith(\"foo\"));\n}\n\n// Tests String::EndsWithCaseInsensitive().\nTEST(StringTest, EndsWithCaseInsensitive) {\n  EXPECT_TRUE(String(\"foobar\").EndsWithCaseInsensitive(\"BAR\"));\n  EXPECT_TRUE(String(\"foobaR\").EndsWithCaseInsensitive(\"bar\"));\n  EXPECT_TRUE(String(\"foobar\").EndsWithCaseInsensitive(\"\"));\n  EXPECT_TRUE(String(\"\").EndsWithCaseInsensitive(\"\"));\n\n  EXPECT_FALSE(String(\"Foobar\").EndsWithCaseInsensitive(\"foo\"));\n  EXPECT_FALSE(String(\"foobar\").EndsWithCaseInsensitive(\"Foo\"));\n  EXPECT_FALSE(String(\"\").EndsWithCaseInsensitive(\"foo\"));\n}\n\n// C++Builder's preprocessor is buggy; it fails to expand macros that\n// appear in macro parameters after wide char literals.  Provide an alias\n// for NULL as a workaround.\nstatic const wchar_t* const kNull = NULL;\n\n// Tests String::CaseInsensitiveWideCStringEquals\nTEST(StringTest, CaseInsensitiveWideCStringEquals) {\n  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(NULL, NULL));\n  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L\"\"));\n  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L\"\", kNull));\n  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L\"foobar\"));\n  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L\"foobar\", kNull));\n  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L\"foobar\", L\"foobar\"));\n  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L\"foobar\", L\"FOOBAR\"));\n  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L\"FOOBAR\", L\"foobar\"));\n}\n\n// Tests that NULL can be assigned to a String.\nTEST(StringTest, CanBeAssignedNULL) {\n  const String src(NULL);\n  String dest;\n\n  dest = src;\n  EXPECT_STREQ(NULL, dest.c_str());\n}\n\n// Tests that the empty string \"\" can be assigned to a String.\nTEST(StringTest, CanBeAssignedEmpty) {\n  const String src(\"\");\n  String dest;\n\n  dest = src;\n  EXPECT_STREQ(\"\", dest.c_str());\n}\n\n// Tests that a non-empty string can be assigned to a String.\nTEST(StringTest, CanBeAssignedNonEmpty) {\n  const String src(\"hello\");\n  String dest;\n  dest = src;\n  EXPECT_EQ(5U, dest.length());\n  EXPECT_STREQ(\"hello\", dest.c_str());\n\n  const String src2(\"x\\0y\", 3);\n  String dest2;\n  dest2 = src2;\n  EXPECT_EQ(3U, dest2.length());\n  EXPECT_EQ('x', dest2.c_str()[0]);\n  EXPECT_EQ('\\0', dest2.c_str()[1]);\n  EXPECT_EQ('y', dest2.c_str()[2]);\n}\n\n// Tests that a String can be assigned to itself.\nTEST(StringTest, CanBeAssignedSelf) {\n  String dest(\"hello\");\n\n  dest = dest;\n  EXPECT_STREQ(\"hello\", dest.c_str());\n}\n\n// Sun Studio < 12 incorrectly rejects this code due to an overloading\n// ambiguity.\n#if !(defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)\n// Tests streaming a String.\nTEST(StringTest, Streams) {\n  EXPECT_EQ(StreamableToString(String()), \"(null)\");\n  EXPECT_EQ(StreamableToString(String(\"\")), \"\");\n  EXPECT_EQ(StreamableToString(String(\"a\\0b\", 3)), \"a\\\\0b\");\n}\n#endif\n\n// Tests that String::Format() works.\nTEST(StringTest, FormatWorks) {\n  // Normal case: the format spec is valid, the arguments match the\n  // spec, and the result is < 4095 characters.\n  EXPECT_STREQ(\"Hello, 42\", String::Format(\"%s, %d\", \"Hello\", 42).c_str());\n\n  // Edge case: the result is 4095 characters.\n  char buffer[4096];\n  const size_t kSize = sizeof(buffer);\n  memset(buffer, 'a', kSize - 1);\n  buffer[kSize - 1] = '\\0';\n  EXPECT_STREQ(buffer, String::Format(\"%s\", buffer).c_str());\n\n  // The result needs to be 4096 characters, exceeding Format()'s limit.\n  EXPECT_STREQ(\"<formatting error or buffer exceeded>\",\n               String::Format(\"x%s\", buffer).c_str());\n\n#if GTEST_OS_LINUX\n  // On Linux, invalid format spec should lead to an error message.\n  // In other environment (e.g. MSVC on Windows), String::Format() may\n  // simply ignore a bad format spec, so this assertion is run on\n  // Linux only.\n  EXPECT_STREQ(\"<formatting error or buffer exceeded>\",\n               String::Format(\"%\").c_str());\n#endif\n}\n\n#if GTEST_OS_WINDOWS\n\n// Tests String::ShowWideCString().\nTEST(StringTest, ShowWideCString) {\n  EXPECT_STREQ(\"(null)\",\n               String::ShowWideCString(NULL).c_str());\n  EXPECT_STREQ(\"\", String::ShowWideCString(L\"\").c_str());\n  EXPECT_STREQ(\"foo\", String::ShowWideCString(L\"foo\").c_str());\n}\n\n// Tests String::ShowWideCStringQuoted().\nTEST(StringTest, ShowWideCStringQuoted) {\n  EXPECT_STREQ(\"(null)\",\n               String::ShowWideCStringQuoted(NULL).c_str());\n  EXPECT_STREQ(\"L\\\"\\\"\",\n               String::ShowWideCStringQuoted(L\"\").c_str());\n  EXPECT_STREQ(\"L\\\"foo\\\"\",\n               String::ShowWideCStringQuoted(L\"foo\").c_str());\n}\n\n#if GTEST_OS_WINDOWS_MOBILE\nTEST(StringTest, AnsiAndUtf16Null) {\n  EXPECT_EQ(NULL, String::AnsiToUtf16(NULL));\n  EXPECT_EQ(NULL, String::Utf16ToAnsi(NULL));\n}\n\nTEST(StringTest, AnsiAndUtf16ConvertBasic) {\n  const char* ansi = String::Utf16ToAnsi(L\"str\");\n  EXPECT_STREQ(\"str\", ansi);\n  delete [] ansi;\n  const WCHAR* utf16 = String::AnsiToUtf16(\"str\");\n  EXPECT_EQ(0, wcsncmp(L\"str\", utf16, 3));\n  delete [] utf16;\n}\n\nTEST(StringTest, AnsiAndUtf16ConvertPathChars) {\n  const char* ansi = String::Utf16ToAnsi(L\".:\\\\ \\\"*?\");\n  EXPECT_STREQ(\".:\\\\ \\\"*?\", ansi);\n  delete [] ansi;\n  const WCHAR* utf16 = String::AnsiToUtf16(\".:\\\\ \\\"*?\");\n  EXPECT_EQ(0, wcsncmp(L\".:\\\\ \\\"*?\", utf16, 3));\n  delete [] utf16;\n}\n#endif  // GTEST_OS_WINDOWS_MOBILE\n\n#endif  // GTEST_OS_WINDOWS\n\n// Tests TestProperty construction.\nTEST(TestPropertyTest, StringValue) {\n  TestProperty property(\"key\", \"1\");\n  EXPECT_STREQ(\"key\", property.key());\n  EXPECT_STREQ(\"1\", property.value());\n}\n\n// Tests TestProperty replacing a value.\nTEST(TestPropertyTest, ReplaceStringValue) {\n  TestProperty property(\"key\", \"1\");\n  EXPECT_STREQ(\"1\", property.value());\n  property.SetValue(\"2\");\n  EXPECT_STREQ(\"2\", property.value());\n}\n\n// AddFatalFailure() and AddNonfatalFailure() must be stand-alone\n// functions (i.e. their definitions cannot be inlined at the call\n// sites), or C++Builder won't compile the code.\nstatic void AddFatalFailure() {\n  FAIL() << \"Expected fatal failure.\";\n}\n\nstatic void AddNonfatalFailure() {\n  ADD_FAILURE() << \"Expected non-fatal failure.\";\n}\n\nclass ScopedFakeTestPartResultReporterTest : public Test {\n public:  // Must be public and not protected due to a bug in g++ 3.4.2.\n  enum FailureMode {\n    FATAL_FAILURE,\n    NONFATAL_FAILURE\n  };\n  static void AddFailure(FailureMode failure) {\n    if (failure == FATAL_FAILURE) {\n      AddFatalFailure();\n    } else {\n      AddNonfatalFailure();\n    }\n  }\n};\n\n// Tests that ScopedFakeTestPartResultReporter intercepts test\n// failures.\nTEST_F(ScopedFakeTestPartResultReporterTest, InterceptsTestFailures) {\n  TestPartResultArray results;\n  {\n    ScopedFakeTestPartResultReporter reporter(\n        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,\n        &results);\n    AddFailure(NONFATAL_FAILURE);\n    AddFailure(FATAL_FAILURE);\n  }\n\n  EXPECT_EQ(2, results.size());\n  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed());\n  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed());\n}\n\nTEST_F(ScopedFakeTestPartResultReporterTest, DeprecatedConstructor) {\n  TestPartResultArray results;\n  {\n    // Tests, that the deprecated constructor still works.\n    ScopedFakeTestPartResultReporter reporter(&results);\n    AddFailure(NONFATAL_FAILURE);\n  }\n  EXPECT_EQ(1, results.size());\n}\n\n#if GTEST_IS_THREADSAFE\n\nclass ScopedFakeTestPartResultReporterWithThreadsTest\n  : public ScopedFakeTestPartResultReporterTest {\n protected:\n  static void AddFailureInOtherThread(FailureMode failure) {\n    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL);\n    thread.Join();\n  }\n};\n\nTEST_F(ScopedFakeTestPartResultReporterWithThreadsTest,\n       InterceptsTestFailuresInAllThreads) {\n  TestPartResultArray results;\n  {\n    ScopedFakeTestPartResultReporter reporter(\n        ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, &results);\n    AddFailure(NONFATAL_FAILURE);\n    AddFailure(FATAL_FAILURE);\n    AddFailureInOtherThread(NONFATAL_FAILURE);\n    AddFailureInOtherThread(FATAL_FAILURE);\n  }\n\n  EXPECT_EQ(4, results.size());\n  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed());\n  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed());\n  EXPECT_TRUE(results.GetTestPartResult(2).nonfatally_failed());\n  EXPECT_TRUE(results.GetTestPartResult(3).fatally_failed());\n}\n\n#endif  // GTEST_IS_THREADSAFE\n\n// Tests EXPECT_FATAL_FAILURE{,ON_ALL_THREADS}.  Makes sure that they\n// work even if the failure is generated in a called function rather than\n// the current context.\n\ntypedef ScopedFakeTestPartResultReporterTest ExpectFatalFailureTest;\n\nTEST_F(ExpectFatalFailureTest, CatchesFatalFaliure) {\n  EXPECT_FATAL_FAILURE(AddFatalFailure(), \"Expected fatal failure.\");\n}\n\nTEST_F(ExpectFatalFailureTest, CatchesFatalFailureOnAllThreads) {\n  // We have another test below to verify that the macro catches fatal\n  // failures generated on another thread.\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFatalFailure(),\n                                      \"Expected fatal failure.\");\n}\n\n#ifdef __BORLANDC__\n// Silences warnings: \"Condition is always true\"\n#pragma option push -w-ccc\n#endif\n\n// Tests that EXPECT_FATAL_FAILURE() can be used in a non-void\n// function even when the statement in it contains ASSERT_*.\n\nint NonVoidFunction() {\n  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), \"\");\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), \"\");\n  return 0;\n}\n\nTEST_F(ExpectFatalFailureTest, CanBeUsedInNonVoidFunction) {\n  NonVoidFunction();\n}\n\n// Tests that EXPECT_FATAL_FAILURE(statement, ...) doesn't abort the\n// current function even though 'statement' generates a fatal failure.\n\nvoid DoesNotAbortHelper(bool* aborted) {\n  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), \"\");\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), \"\");\n\n  *aborted = false;\n}\n\n#ifdef __BORLANDC__\n// Restores warnings after previous \"#pragma option push\" suppressed them.\n#pragma option pop\n#endif\n\nTEST_F(ExpectFatalFailureTest, DoesNotAbort) {\n  bool aborted = true;\n  DoesNotAbortHelper(&aborted);\n  EXPECT_FALSE(aborted);\n}\n\n// Tests that the EXPECT_FATAL_FAILURE{,_ON_ALL_THREADS} accepts a\n// statement that contains a macro which expands to code containing an\n// unprotected comma.\n\nstatic int global_var = 0;\n#define GTEST_USE_UNPROTECTED_COMMA_ global_var++, global_var++\n\nTEST_F(ExpectFatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {\n#if !defined(__BORLANDC__) || __BORLANDC__ >= 0x600\n  // ICE's in C++Builder 2007.\n  EXPECT_FATAL_FAILURE({\n    GTEST_USE_UNPROTECTED_COMMA_;\n    AddFatalFailure();\n  }, \"\");\n#endif\n\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS({\n    GTEST_USE_UNPROTECTED_COMMA_;\n    AddFatalFailure();\n  }, \"\");\n}\n\n// Tests EXPECT_NONFATAL_FAILURE{,ON_ALL_THREADS}.\n\ntypedef ScopedFakeTestPartResultReporterTest ExpectNonfatalFailureTest;\n\nTEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailure) {\n  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),\n                          \"Expected non-fatal failure.\");\n}\n\nTEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailureOnAllThreads) {\n  // We have another test below to verify that the macro catches\n  // non-fatal failures generated on another thread.\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddNonfatalFailure(),\n                                         \"Expected non-fatal failure.\");\n}\n\n// Tests that the EXPECT_NONFATAL_FAILURE{,_ON_ALL_THREADS} accepts a\n// statement that contains a macro which expands to code containing an\n// unprotected comma.\nTEST_F(ExpectNonfatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {\n  EXPECT_NONFATAL_FAILURE({\n    GTEST_USE_UNPROTECTED_COMMA_;\n    AddNonfatalFailure();\n  }, \"\");\n\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS({\n    GTEST_USE_UNPROTECTED_COMMA_;\n    AddNonfatalFailure();\n  }, \"\");\n}\n\n#if GTEST_IS_THREADSAFE\n\ntypedef ScopedFakeTestPartResultReporterWithThreadsTest\n    ExpectFailureWithThreadsTest;\n\nTEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailureOnAllThreads) {\n  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailureInOtherThread(FATAL_FAILURE),\n                                      \"Expected fatal failure.\");\n}\n\nTEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailureOnAllThreads) {\n  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(\n      AddFailureInOtherThread(NONFATAL_FAILURE), \"Expected non-fatal failure.\");\n}\n\n#endif  // GTEST_IS_THREADSAFE\n\n// Tests the TestProperty class.\n\nTEST(TestPropertyTest, ConstructorWorks) {\n  const TestProperty property(\"key\", \"value\");\n  EXPECT_STREQ(\"key\", property.key());\n  EXPECT_STREQ(\"value\", property.value());\n}\n\nTEST(TestPropertyTest, SetValue) {\n  TestProperty property(\"key\", \"value_1\");\n  EXPECT_STREQ(\"key\", property.key());\n  property.SetValue(\"value_2\");\n  EXPECT_STREQ(\"key\", property.key());\n  EXPECT_STREQ(\"value_2\", property.value());\n}\n\n// Tests the TestResult class\n\n// The test fixture for testing TestResult.\nclass TestResultTest : public Test {\n protected:\n  typedef std::vector<TestPartResult> TPRVector;\n\n  // We make use of 2 TestPartResult objects,\n  TestPartResult * pr1, * pr2;\n\n  // ... and 3 TestResult objects.\n  TestResult * r0, * r1, * r2;\n\n  virtual void SetUp() {\n    // pr1 is for success.\n    pr1 = new TestPartResult(TestPartResult::kSuccess,\n                             \"foo/bar.cc\",\n                             10,\n                             \"Success!\");\n\n    // pr2 is for fatal failure.\n    pr2 = new TestPartResult(TestPartResult::kFatalFailure,\n                             \"foo/bar.cc\",\n                             -1,  // This line number means \"unknown\"\n                             \"Failure!\");\n\n    // Creates the TestResult objects.\n    r0 = new TestResult();\n    r1 = new TestResult();\n    r2 = new TestResult();\n\n    // In order to test TestResult, we need to modify its internal\n    // state, in particular the TestPartResult vector it holds.\n    // test_part_results() returns a const reference to this vector.\n    // We cast it to a non-const object s.t. it can be modified (yes,\n    // this is a hack).\n    TPRVector* results1 = const_cast<TPRVector*>(\n        &TestResultAccessor::test_part_results(*r1));\n    TPRVector* results2 = const_cast<TPRVector*>(\n        &TestResultAccessor::test_part_results(*r2));\n\n    // r0 is an empty TestResult.\n\n    // r1 contains a single SUCCESS TestPartResult.\n    results1->push_back(*pr1);\n\n    // r2 contains a SUCCESS, and a FAILURE.\n    results2->push_back(*pr1);\n    results2->push_back(*pr2);\n  }\n\n  virtual void TearDown() {\n    delete pr1;\n    delete pr2;\n\n    delete r0;\n    delete r1;\n    delete r2;\n  }\n\n  // Helper that compares two two TestPartResults.\n  static void CompareTestPartResult(const TestPartResult& expected,\n                                    const TestPartResult& actual) {\n    EXPECT_EQ(expected.type(), actual.type());\n    EXPECT_STREQ(expected.file_name(), actual.file_name());\n    EXPECT_EQ(expected.line_number(), actual.line_number());\n    EXPECT_STREQ(expected.summary(), actual.summary());\n    EXPECT_STREQ(expected.message(), actual.message());\n    EXPECT_EQ(expected.passed(), actual.passed());\n    EXPECT_EQ(expected.failed(), actual.failed());\n    EXPECT_EQ(expected.nonfatally_failed(), actual.nonfatally_failed());\n    EXPECT_EQ(expected.fatally_failed(), actual.fatally_failed());\n  }\n};\n\n// Tests TestResult::total_part_count().\nTEST_F(TestResultTest, total_part_count) {\n  ASSERT_EQ(0, r0->total_part_count());\n  ASSERT_EQ(1, r1->total_part_count());\n  ASSERT_EQ(2, r2->total_part_count());\n}\n\n// Tests TestResult::Passed().\nTEST_F(TestResultTest, Passed) {\n  ASSERT_TRUE(r0->Passed());\n  ASSERT_TRUE(r1->Passed());\n  ASSERT_FALSE(r2->Passed());\n}\n\n// Tests TestResult::Failed().\nTEST_F(TestResultTest, Failed) {\n  ASSERT_FALSE(r0->Failed());\n  ASSERT_FALSE(r1->Failed());\n  ASSERT_TRUE(r2->Failed());\n}\n\n// Tests TestResult::GetTestPartResult().\n\ntypedef TestResultTest TestResultDeathTest;\n\nTEST_F(TestResultDeathTest, GetTestPartResult) {\n  CompareTestPartResult(*pr1, r2->GetTestPartResult(0));\n  CompareTestPartResult(*pr2, r2->GetTestPartResult(1));\n  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(2), \"\");\n  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(-1), \"\");\n}\n\n// Tests TestResult has no properties when none are added.\nTEST(TestResultPropertyTest, NoPropertiesFoundWhenNoneAreAdded) {\n  TestResult test_result;\n  ASSERT_EQ(0, test_result.test_property_count());\n}\n\n// Tests TestResult has the expected property when added.\nTEST(TestResultPropertyTest, OnePropertyFoundWhenAdded) {\n  TestResult test_result;\n  TestProperty property(\"key_1\", \"1\");\n  TestResultAccessor::RecordProperty(&test_result, property);\n  ASSERT_EQ(1, test_result.test_property_count());\n  const TestProperty& actual_property = test_result.GetTestProperty(0);\n  EXPECT_STREQ(\"key_1\", actual_property.key());\n  EXPECT_STREQ(\"1\", actual_property.value());\n}\n\n// Tests TestResult has multiple properties when added.\nTEST(TestResultPropertyTest, MultiplePropertiesFoundWhenAdded) {\n  TestResult test_result;\n  TestProperty property_1(\"key_1\", \"1\");\n  TestProperty property_2(\"key_2\", \"2\");\n  TestResultAccessor::RecordProperty(&test_result, property_1);\n  TestResultAccessor::RecordProperty(&test_result, property_2);\n  ASSERT_EQ(2, test_result.test_property_count());\n  const TestProperty& actual_property_1 = test_result.GetTestProperty(0);\n  EXPECT_STREQ(\"key_1\", actual_property_1.key());\n  EXPECT_STREQ(\"1\", actual_property_1.value());\n\n  const TestProperty& actual_property_2 = test_result.GetTestProperty(1);\n  EXPECT_STREQ(\"key_2\", actual_property_2.key());\n  EXPECT_STREQ(\"2\", actual_property_2.value());\n}\n\n// Tests TestResult::RecordProperty() overrides values for duplicate keys.\nTEST(TestResultPropertyTest, OverridesValuesForDuplicateKeys) {\n  TestResult test_result;\n  TestProperty property_1_1(\"key_1\", \"1\");\n  TestProperty property_2_1(\"key_2\", \"2\");\n  TestProperty property_1_2(\"key_1\", \"12\");\n  TestProperty property_2_2(\"key_2\", \"22\");\n  TestResultAccessor::RecordProperty(&test_result, property_1_1);\n  TestResultAccessor::RecordProperty(&test_result, property_2_1);\n  TestResultAccessor::RecordProperty(&test_result, property_1_2);\n  TestResultAccessor::RecordProperty(&test_result, property_2_2);\n\n  ASSERT_EQ(2, test_result.test_property_count());\n  const TestProperty& actual_property_1 = test_result.GetTestProperty(0);\n  EXPECT_STREQ(\"key_1\", actual_property_1.key());\n  EXPECT_STREQ(\"12\", actual_property_1.value());\n\n  const TestProperty& actual_property_2 = test_result.GetTestProperty(1);\n  EXPECT_STREQ(\"key_2\", actual_property_2.key());\n  EXPECT_STREQ(\"22\", actual_property_2.value());\n}\n\n// Tests TestResult::GetTestProperty().\nTEST(TestResultPropertyDeathTest, GetTestProperty) {\n  TestResult test_result;\n  TestProperty property_1(\"key_1\", \"1\");\n  TestProperty property_2(\"key_2\", \"2\");\n  TestProperty property_3(\"key_3\", \"3\");\n  TestResultAccessor::RecordProperty(&test_result, property_1);\n  TestResultAccessor::RecordProperty(&test_result, property_2);\n  TestResultAccessor::RecordProperty(&test_result, property_3);\n\n  const TestProperty& fetched_property_1 = test_result.GetTestProperty(0);\n  const TestProperty& fetched_property_2 = test_result.GetTestProperty(1);\n  const TestProperty& fetched_property_3 = test_result.GetTestProperty(2);\n\n  EXPECT_STREQ(\"key_1\", fetched_property_1.key());\n  EXPECT_STREQ(\"1\", fetched_property_1.value());\n\n  EXPECT_STREQ(\"key_2\", fetched_property_2.key());\n  EXPECT_STREQ(\"2\", fetched_property_2.value());\n\n  EXPECT_STREQ(\"key_3\", fetched_property_3.key());\n  EXPECT_STREQ(\"3\", fetched_property_3.value());\n\n  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(3), \"\");\n  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(-1), \"\");\n}\n\n// When a property using a reserved key is supplied to this function, it tests\n// that a non-fatal failure is added, a fatal failure is not added, and that the\n// property is not recorded.\nvoid ExpectNonFatalFailureRecordingPropertyWithReservedKey(const char* key) {\n  TestResult test_result;\n  TestProperty property(key, \"1\");\n  EXPECT_NONFATAL_FAILURE(\n      TestResultAccessor::RecordProperty(&test_result, property),\n      \"Reserved key\");\n  ASSERT_EQ(0, test_result.test_property_count()) << \"Not recorded\";\n}\n\n// Attempting to recording a property with the Reserved literal \"name\"\n// should add a non-fatal failure and the property should not be recorded.\nTEST(TestResultPropertyTest, AddFailureWhenUsingReservedKeyCalledName) {\n  ExpectNonFatalFailureRecordingPropertyWithReservedKey(\"name\");\n}\n\n// Attempting to recording a property with the Reserved literal \"status\"\n// should add a non-fatal failure and the property should not be recorded.\nTEST(TestResultPropertyTest, AddFailureWhenUsingReservedKeyCalledStatus) {\n  ExpectNonFatalFailureRecordingPropertyWithReservedKey(\"status\");\n}\n\n// Attempting to recording a property with the Reserved literal \"time\"\n// should add a non-fatal failure and the property should not be recorded.\nTEST(TestResultPropertyTest, AddFailureWhenUsingReservedKeyCalledTime) {\n  ExpectNonFatalFailureRecordingPropertyWithReservedKey(\"time\");\n}\n\n// Attempting to recording a property with the Reserved literal \"classname\"\n// should add a non-fatal failure and the property should not be recorded.\nTEST(TestResultPropertyTest, AddFailureWhenUsingReservedKeyCalledClassname) {\n  ExpectNonFatalFailureRecordingPropertyWithReservedKey(\"classname\");\n}\n\n// Tests that GTestFlagSaver works on Windows and Mac.\n\nclass GTestFlagSaverTest : public Test {\n protected:\n  // Saves the Google Test flags such that we can restore them later, and\n  // then sets them to their default values.  This will be called\n  // before the first test in this test case is run.\n  static void SetUpTestCase() {\n    saver_ = new GTestFlagSaver;\n\n    GTEST_FLAG(also_run_disabled_tests) = false;\n    GTEST_FLAG(break_on_failure) = false;\n    GTEST_FLAG(catch_exceptions) = false;\n    GTEST_FLAG(death_test_use_fork) = false;\n    GTEST_FLAG(color) = \"auto\";\n    GTEST_FLAG(filter) = \"\";\n    GTEST_FLAG(list_tests) = false;\n    GTEST_FLAG(output) = \"\";\n    GTEST_FLAG(print_time) = true;\n    GTEST_FLAG(random_seed) = 0;\n    GTEST_FLAG(repeat) = 1;\n    GTEST_FLAG(shuffle) = false;\n    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth;\n    GTEST_FLAG(throw_on_failure) = false;\n  }\n\n  // Restores the Google Test flags that the tests have modified.  This will\n  // be called after the last test in this test case is run.\n  static void TearDownTestCase() {\n    delete saver_;\n    saver_ = NULL;\n  }\n\n  // Verifies that the Google Test flags have their default values, and then\n  // modifies each of them.\n  void VerifyAndModifyFlags() {\n    EXPECT_FALSE(GTEST_FLAG(also_run_disabled_tests));\n    EXPECT_FALSE(GTEST_FLAG(break_on_failure));\n    EXPECT_FALSE(GTEST_FLAG(catch_exceptions));\n    EXPECT_STREQ(\"auto\", GTEST_FLAG(color).c_str());\n    EXPECT_FALSE(GTEST_FLAG(death_test_use_fork));\n    EXPECT_STREQ(\"\", GTEST_FLAG(filter).c_str());\n    EXPECT_FALSE(GTEST_FLAG(list_tests));\n    EXPECT_STREQ(\"\", GTEST_FLAG(output).c_str());\n    EXPECT_TRUE(GTEST_FLAG(print_time));\n    EXPECT_EQ(0, GTEST_FLAG(random_seed));\n    EXPECT_EQ(1, GTEST_FLAG(repeat));\n    EXPECT_FALSE(GTEST_FLAG(shuffle));\n    EXPECT_EQ(kMaxStackTraceDepth, GTEST_FLAG(stack_trace_depth));\n    EXPECT_FALSE(GTEST_FLAG(throw_on_failure));\n\n    GTEST_FLAG(also_run_disabled_tests) = true;\n    GTEST_FLAG(break_on_failure) = true;\n    GTEST_FLAG(catch_exceptions) = true;\n    GTEST_FLAG(color) = \"no\";\n    GTEST_FLAG(death_test_use_fork) = true;\n    GTEST_FLAG(filter) = \"abc\";\n    GTEST_FLAG(list_tests) = true;\n    GTEST_FLAG(output) = \"xml:foo.xml\";\n    GTEST_FLAG(print_time) = false;\n    GTEST_FLAG(random_seed) = 1;\n    GTEST_FLAG(repeat) = 100;\n    GTEST_FLAG(shuffle) = true;\n    GTEST_FLAG(stack_trace_depth) = 1;\n    GTEST_FLAG(throw_on_failure) = true;\n  }\n private:\n  // For saving Google Test flags during this test case.\n  static GTestFlagSaver* saver_;\n};\n\nGTestFlagSaver* GTestFlagSaverTest::saver_ = NULL;\n\n// Google Test doesn't guarantee the order of tests.  The following two\n// tests are designed to work regardless of their order.\n\n// Modifies the Google Test flags in the test body.\nTEST_F(GTestFlagSaverTest, ModifyGTestFlags) {\n  VerifyAndModifyFlags();\n}\n\n// Verifies that the Google Test flags in the body of the previous test were\n// restored to their original values.\nTEST_F(GTestFlagSaverTest, VerifyGTestFlags) {\n  VerifyAndModifyFlags();\n}\n\n// Sets an environment variable with the given name to the given\n// value.  If the value argument is \"\", unsets the environment\n// variable.  The caller must ensure that both arguments are not NULL.\nstatic void SetEnv(const char* name, const char* value) {\n#if GTEST_OS_WINDOWS_MOBILE\n  // Environment variables are not supported on Windows CE.\n  return;\n#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)\n  // C++Builder's putenv only stores a pointer to its parameter; we have to\n  // ensure that the string remains valid as long as it might be needed.\n  // We use an std::map to do so.\n  static std::map<String, String*> added_env;\n\n  // Because putenv stores a pointer to the string buffer, we can't delete the\n  // previous string (if present) until after it's replaced.\n  String *prev_env = NULL;\n  if (added_env.find(name) != added_env.end()) {\n    prev_env = added_env[name];\n  }\n  added_env[name] = new String((Message() << name << \"=\" << value).GetString());\n\n  // The standard signature of putenv accepts a 'char*' argument. Other\n  // implementations, like C++Builder's, accept a 'const char*'.\n  // We cast away the 'const' since that would work for both variants.\n  putenv(const_cast<char*>(added_env[name]->c_str()));\n  delete prev_env;\n#elif GTEST_OS_WINDOWS  // If we are on Windows proper.\n  _putenv((Message() << name << \"=\" << value).GetString().c_str());\n#else\n  if (*value == '\\0') {\n    unsetenv(name);\n  } else {\n    setenv(name, value, 1);\n  }\n#endif  // GTEST_OS_WINDOWS_MOBILE\n}\n\n#if !GTEST_OS_WINDOWS_MOBILE\n// Environment variables are not supported on Windows CE.\n\nusing testing::internal::Int32FromGTestEnv;\n\n// Tests Int32FromGTestEnv().\n\n// Tests that Int32FromGTestEnv() returns the default value when the\n// environment variable is not set.\nTEST(Int32FromGTestEnvTest, ReturnsDefaultWhenVariableIsNotSet) {\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"\");\n  EXPECT_EQ(10, Int32FromGTestEnv(\"temp\", 10));\n}\n\n// Tests that Int32FromGTestEnv() returns the default value when the\n// environment variable overflows as an Int32.\nTEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueOverflows) {\n  printf(\"(expecting 2 warnings)\\n\");\n\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"12345678987654321\");\n  EXPECT_EQ(20, Int32FromGTestEnv(\"temp\", 20));\n\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"-12345678987654321\");\n  EXPECT_EQ(30, Int32FromGTestEnv(\"temp\", 30));\n}\n\n// Tests that Int32FromGTestEnv() returns the default value when the\n// environment variable does not represent a valid decimal integer.\nTEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueIsInvalid) {\n  printf(\"(expecting 2 warnings)\\n\");\n\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"A1\");\n  EXPECT_EQ(40, Int32FromGTestEnv(\"temp\", 40));\n\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"12X\");\n  EXPECT_EQ(50, Int32FromGTestEnv(\"temp\", 50));\n}\n\n// Tests that Int32FromGTestEnv() parses and returns the value of the\n// environment variable when it represents a valid decimal integer in\n// the range of an Int32.\nTEST(Int32FromGTestEnvTest, ParsesAndReturnsValidValue) {\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"123\");\n  EXPECT_EQ(123, Int32FromGTestEnv(\"temp\", 0));\n\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"TEMP\", \"-321\");\n  EXPECT_EQ(-321, Int32FromGTestEnv(\"temp\", 0));\n}\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\n// Tests ParseInt32Flag().\n\n// Tests that ParseInt32Flag() returns false and doesn't change the\n// output value when the flag has wrong format\nTEST(ParseInt32FlagTest, ReturnsFalseForInvalidFlag) {\n  Int32 value = 123;\n  EXPECT_FALSE(ParseInt32Flag(\"--a=100\", \"b\", &value));\n  EXPECT_EQ(123, value);\n\n  EXPECT_FALSE(ParseInt32Flag(\"a=100\", \"a\", &value));\n  EXPECT_EQ(123, value);\n}\n\n// Tests that ParseInt32Flag() returns false and doesn't change the\n// output value when the flag overflows as an Int32.\nTEST(ParseInt32FlagTest, ReturnsDefaultWhenValueOverflows) {\n  printf(\"(expecting 2 warnings)\\n\");\n\n  Int32 value = 123;\n  EXPECT_FALSE(ParseInt32Flag(\"--abc=12345678987654321\", \"abc\", &value));\n  EXPECT_EQ(123, value);\n\n  EXPECT_FALSE(ParseInt32Flag(\"--abc=-12345678987654321\", \"abc\", &value));\n  EXPECT_EQ(123, value);\n}\n\n// Tests that ParseInt32Flag() returns false and doesn't change the\n// output value when the flag does not represent a valid decimal\n// integer.\nTEST(ParseInt32FlagTest, ReturnsDefaultWhenValueIsInvalid) {\n  printf(\"(expecting 2 warnings)\\n\");\n\n  Int32 value = 123;\n  EXPECT_FALSE(ParseInt32Flag(\"--abc=A1\", \"abc\", &value));\n  EXPECT_EQ(123, value);\n\n  EXPECT_FALSE(ParseInt32Flag(\"--abc=12X\", \"abc\", &value));\n  EXPECT_EQ(123, value);\n}\n\n// Tests that ParseInt32Flag() parses the value of the flag and\n// returns true when the flag represents a valid decimal integer in\n// the range of an Int32.\nTEST(ParseInt32FlagTest, ParsesAndReturnsValidValue) {\n  Int32 value = 123;\n  EXPECT_TRUE(ParseInt32Flag(\"--\" GTEST_FLAG_PREFIX_ \"abc=456\", \"abc\", &value));\n  EXPECT_EQ(456, value);\n\n  EXPECT_TRUE(ParseInt32Flag(\"--\" GTEST_FLAG_PREFIX_ \"abc=-789\",\n                             \"abc\", &value));\n  EXPECT_EQ(-789, value);\n}\n\n// Tests that Int32FromEnvOrDie() parses the value of the var or\n// returns the correct default.\n// Environment variables are not supported on Windows CE.\n#if !GTEST_OS_WINDOWS_MOBILE\nTEST(Int32FromEnvOrDieTest, ParsesAndReturnsValidValue) {\n  EXPECT_EQ(333, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ \"UnsetVar\", 333));\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"UnsetVar\", \"123\");\n  EXPECT_EQ(123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ \"UnsetVar\", 333));\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"UnsetVar\", \"-123\");\n  EXPECT_EQ(-123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ \"UnsetVar\", 333));\n}\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\n// Tests that Int32FromEnvOrDie() aborts with an error message\n// if the variable is not an Int32.\nTEST(Int32FromEnvOrDieDeathTest, AbortsOnFailure) {\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"VAR\", \"xxx\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ \"VAR\", 123),\n      \".*\");\n}\n\n// Tests that Int32FromEnvOrDie() aborts with an error message\n// if the variable cannot be represnted by an Int32.\nTEST(Int32FromEnvOrDieDeathTest, AbortsOnInt32Overflow) {\n  SetEnv(GTEST_FLAG_PREFIX_UPPER_ \"VAR\", \"1234567891234567891234\");\n  EXPECT_DEATH_IF_SUPPORTED(\n      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ \"VAR\", 123),\n      \".*\");\n}\n\n// Tests that ShouldRunTestOnShard() selects all tests\n// where there is 1 shard.\nTEST(ShouldRunTestOnShardTest, IsPartitionWhenThereIsOneShard) {\n  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 0));\n  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 1));\n  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 2));\n  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 3));\n  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 4));\n}\n\nclass ShouldShardTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    index_var_ = GTEST_FLAG_PREFIX_UPPER_ \"INDEX\";\n    total_var_ = GTEST_FLAG_PREFIX_UPPER_ \"TOTAL\";\n  }\n\n  virtual void TearDown() {\n    SetEnv(index_var_, \"\");\n    SetEnv(total_var_, \"\");\n  }\n\n  const char* index_var_;\n  const char* total_var_;\n};\n\n// Tests that sharding is disabled if neither of the environment variables\n// are set.\nTEST_F(ShouldShardTest, ReturnsFalseWhenNeitherEnvVarIsSet) {\n  SetEnv(index_var_, \"\");\n  SetEnv(total_var_, \"\");\n\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false));\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));\n}\n\n// Tests that sharding is not enabled if total_shards  == 1.\nTEST_F(ShouldShardTest, ReturnsFalseWhenTotalShardIsOne) {\n  SetEnv(index_var_, \"0\");\n  SetEnv(total_var_, \"1\");\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false));\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));\n}\n\n// Tests that sharding is enabled if total_shards > 1 and\n// we are not in a death test subprocess.\n// Environment variables are not supported on Windows CE.\n#if !GTEST_OS_WINDOWS_MOBILE\nTEST_F(ShouldShardTest, WorksWhenShardEnvVarsAreValid) {\n  SetEnv(index_var_, \"4\");\n  SetEnv(total_var_, \"22\");\n  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));\n\n  SetEnv(index_var_, \"8\");\n  SetEnv(total_var_, \"9\");\n  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));\n\n  SetEnv(index_var_, \"0\");\n  SetEnv(total_var_, \"9\");\n  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));\n  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));\n}\n#endif  // !GTEST_OS_WINDOWS_MOBILE\n\n// Tests that we exit in error if the sharding values are not valid.\n\ntypedef ShouldShardTest ShouldShardDeathTest;\n\nTEST_F(ShouldShardDeathTest, AbortsWhenShardingEnvVarsAreInvalid) {\n  SetEnv(index_var_, \"4\");\n  SetEnv(total_var_, \"4\");\n  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), \".*\");\n\n  SetEnv(index_var_, \"4\");\n  SetEnv(total_var_, \"-2\");\n  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), \".*\");\n\n  SetEnv(index_var_, \"5\");\n  SetEnv(total_var_, \"\");\n  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), \".*\");\n\n  SetEnv(index_var_, \"\");\n  SetEnv(total_var_, \"5\");\n  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), \".*\");\n}\n\n// Tests that ShouldRunTestOnShard is a partition when 5\n// shards are used.\nTEST(ShouldRunTestOnShardTest, IsPartitionWhenThereAreFiveShards) {\n  // Choose an arbitrary number of tests and shards.\n  const int num_tests = 17;\n  const int num_shards = 5;\n\n  // Check partitioning: each test should be on exactly 1 shard.\n  for (int test_id = 0; test_id < num_tests; test_id++) {\n    int prev_selected_shard_index = -1;\n    for (int shard_index = 0; shard_index < num_shards; shard_index++) {\n      if (ShouldRunTestOnShard(num_shards, shard_index, test_id)) {\n        if (prev_selected_shard_index < 0) {\n          prev_selected_shard_index = shard_index;\n        } else {\n          ADD_FAILURE() << \"Shard \" << prev_selected_shard_index << \" and \"\n            << shard_index << \" are both selected to run test \" << test_id;\n        }\n      }\n    }\n  }\n\n  // Check balance: This is not required by the sharding protocol, but is a\n  // desirable property for performance.\n  for (int shard_index = 0; shard_index < num_shards; shard_index++) {\n    int num_tests_on_shard = 0;\n    for (int test_id = 0; test_id < num_tests; test_id++) {\n      num_tests_on_shard +=\n        ShouldRunTestOnShard(num_shards, shard_index, test_id);\n    }\n    EXPECT_GE(num_tests_on_shard, num_tests / num_shards);\n  }\n}\n\n// For the same reason we are not explicitly testing everything in the\n// Test class, there are no separate tests for the following classes\n// (except for some trivial cases):\n//\n//   TestCase, UnitTest, UnitTestResultPrinter.\n//\n// Similarly, there are no separate tests for the following macros:\n//\n//   TEST, TEST_F, RUN_ALL_TESTS\n\nTEST(UnitTestTest, CanGetOriginalWorkingDir) {\n  ASSERT_TRUE(UnitTest::GetInstance()->original_working_dir() != NULL);\n  EXPECT_STRNE(UnitTest::GetInstance()->original_working_dir(), \"\");\n}\n\n// This group of tests is for predicate assertions (ASSERT_PRED*, etc)\n// of various arities.  They do not attempt to be exhaustive.  Rather,\n// view them as smoke tests that can be easily reviewed and verified.\n// A more complete set of tests for predicate assertions can be found\n// in gtest_pred_impl_unittest.cc.\n\n// First, some predicates and predicate-formatters needed by the tests.\n\n// Returns true iff the argument is an even number.\nbool IsEven(int n) {\n  return (n % 2) == 0;\n}\n\n// A functor that returns true iff the argument is an even number.\nstruct IsEvenFunctor {\n  bool operator()(int n) { return IsEven(n); }\n};\n\n// A predicate-formatter function that asserts the argument is an even\n// number.\nAssertionResult AssertIsEven(const char* expr, int n) {\n  if (IsEven(n)) {\n    return AssertionSuccess();\n  }\n\n  Message msg;\n  msg << expr << \" evaluates to \" << n << \", which is not even.\";\n  return AssertionFailure(msg);\n}\n\n// A predicate function that returns AssertionResult for use in\n// EXPECT/ASSERT_TRUE/FALSE.\nAssertionResult ResultIsEven(int n) {\n  if (IsEven(n))\n    return AssertionSuccess() << n << \" is even\";\n  else\n    return AssertionFailure() << n << \" is odd\";\n}\n\n// A predicate function that returns AssertionResult but gives no\n// explanation why it succeeds. Needed for testing that\n// EXPECT/ASSERT_FALSE handles such functions correctly.\nAssertionResult ResultIsEvenNoExplanation(int n) {\n  if (IsEven(n))\n    return AssertionSuccess();\n  else\n    return AssertionFailure() << n << \" is odd\";\n}\n\n// A predicate-formatter functor that asserts the argument is an even\n// number.\nstruct AssertIsEvenFunctor {\n  AssertionResult operator()(const char* expr, int n) {\n    return AssertIsEven(expr, n);\n  }\n};\n\n// Returns true iff the sum of the arguments is an even number.\nbool SumIsEven2(int n1, int n2) {\n  return IsEven(n1 + n2);\n}\n\n// A functor that returns true iff the sum of the arguments is an even\n// number.\nstruct SumIsEven3Functor {\n  bool operator()(int n1, int n2, int n3) {\n    return IsEven(n1 + n2 + n3);\n  }\n};\n\n// A predicate-formatter function that asserts the sum of the\n// arguments is an even number.\nAssertionResult AssertSumIsEven4(\n    const char* e1, const char* e2, const char* e3, const char* e4,\n    int n1, int n2, int n3, int n4) {\n  const int sum = n1 + n2 + n3 + n4;\n  if (IsEven(sum)) {\n    return AssertionSuccess();\n  }\n\n  Message msg;\n  msg << e1 << \" + \" << e2 << \" + \" << e3 << \" + \" << e4\n      << \" (\" << n1 << \" + \" << n2 << \" + \" << n3 << \" + \" << n4\n      << \") evaluates to \" << sum << \", which is not even.\";\n  return AssertionFailure(msg);\n}\n\n// A predicate-formatter functor that asserts the sum of the arguments\n// is an even number.\nstruct AssertSumIsEven5Functor {\n  AssertionResult operator()(\n      const char* e1, const char* e2, const char* e3, const char* e4,\n      const char* e5, int n1, int n2, int n3, int n4, int n5) {\n    const int sum = n1 + n2 + n3 + n4 + n5;\n    if (IsEven(sum)) {\n      return AssertionSuccess();\n    }\n\n    Message msg;\n    msg << e1 << \" + \" << e2 << \" + \" << e3 << \" + \" << e4 << \" + \" << e5\n        << \" (\"\n        << n1 << \" + \" << n2 << \" + \" << n3 << \" + \" << n4 << \" + \" << n5\n        << \") evaluates to \" << sum << \", which is not even.\";\n    return AssertionFailure(msg);\n  }\n};\n\n\n// Tests unary predicate assertions.\n\n// Tests unary predicate assertions that don't use a custom formatter.\nTEST(Pred1Test, WithoutFormat) {\n  // Success cases.\n  EXPECT_PRED1(IsEvenFunctor(), 2) << \"This failure is UNEXPECTED!\";\n  ASSERT_PRED1(IsEven, 4);\n\n  // Failure cases.\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED1(IsEven, 5) << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n  EXPECT_FATAL_FAILURE(ASSERT_PRED1(IsEvenFunctor(), 5),\n                       \"evaluates to false\");\n}\n\n// Tests unary predicate assertions that use a custom formatter.\nTEST(Pred1Test, WithFormat) {\n  // Success cases.\n  EXPECT_PRED_FORMAT1(AssertIsEven, 2);\n  ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), 4)\n    << \"This failure is UNEXPECTED!\";\n\n  // Failure cases.\n  const int n = 5;\n  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT1(AssertIsEvenFunctor(), n),\n                          \"n evaluates to 5, which is not even.\");\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT1(AssertIsEven, 5) << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n}\n\n// Tests that unary predicate assertions evaluates their arguments\n// exactly once.\nTEST(Pred1Test, SingleEvaluationOnFailure) {\n  // A success case.\n  static int n = 0;\n  EXPECT_PRED1(IsEven, n++);\n  EXPECT_EQ(1, n) << \"The argument is not evaluated exactly once.\";\n\n  // A failure case.\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), n++)\n        << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n  EXPECT_EQ(2, n) << \"The argument is not evaluated exactly once.\";\n}\n\n\n// Tests predicate assertions whose arity is >= 2.\n\n// Tests predicate assertions that don't use a custom formatter.\nTEST(PredTest, WithoutFormat) {\n  // Success cases.\n  ASSERT_PRED2(SumIsEven2, 2, 4) << \"This failure is UNEXPECTED!\";\n  EXPECT_PRED3(SumIsEven3Functor(), 4, 6, 8);\n\n  // Failure cases.\n  const int n1 = 1;\n  const int n2 = 2;\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED2(SumIsEven2, n1, n2) << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED3(SumIsEven3Functor(), 1, 2, 4);\n  }, \"evaluates to false\");\n}\n\n// Tests predicate assertions that use a custom formatter.\nTEST(PredTest, WithFormat) {\n  // Success cases.\n  ASSERT_PRED_FORMAT4(AssertSumIsEven4, 4, 6, 8, 10) <<\n    \"This failure is UNEXPECTED!\";\n  EXPECT_PRED_FORMAT5(AssertSumIsEven5Functor(), 2, 4, 6, 8, 10);\n\n  // Failure cases.\n  const int n1 = 1;\n  const int n2 = 2;\n  const int n3 = 4;\n  const int n4 = 6;\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT4(AssertSumIsEven4, n1, n2, n3, n4);\n  }, \"evaluates to 13, which is not even.\");\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(), 1, 2, 4, 6, 8)\n        << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n}\n\n// Tests that predicate assertions evaluates their arguments\n// exactly once.\nTEST(PredTest, SingleEvaluationOnFailure) {\n  // A success case.\n  int n1 = 0;\n  int n2 = 0;\n  EXPECT_PRED2(SumIsEven2, n1++, n2++);\n  EXPECT_EQ(1, n1) << \"Argument 1 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n2) << \"Argument 2 is not evaluated exactly once.\";\n\n  // Another success case.\n  n1 = n2 = 0;\n  int n3 = 0;\n  int n4 = 0;\n  int n5 = 0;\n  ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(),\n                      n1++, n2++, n3++, n4++, n5++)\n                        << \"This failure is UNEXPECTED!\";\n  EXPECT_EQ(1, n1) << \"Argument 1 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n2) << \"Argument 2 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n3) << \"Argument 3 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n4) << \"Argument 4 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n5) << \"Argument 5 is not evaluated exactly once.\";\n\n  // A failure case.\n  n1 = n2 = n3 = 0;\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED3(SumIsEven3Functor(), ++n1, n2++, n3++)\n        << \"This failure is expected.\";\n  }, \"This failure is expected.\");\n  EXPECT_EQ(1, n1) << \"Argument 1 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n2) << \"Argument 2 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n3) << \"Argument 3 is not evaluated exactly once.\";\n\n  // Another failure case.\n  n1 = n2 = n3 = n4 = 0;\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT4(AssertSumIsEven4, ++n1, n2++, n3++, n4++);\n  }, \"evaluates to 1, which is not even.\");\n  EXPECT_EQ(1, n1) << \"Argument 1 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n2) << \"Argument 2 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n3) << \"Argument 3 is not evaluated exactly once.\";\n  EXPECT_EQ(1, n4) << \"Argument 4 is not evaluated exactly once.\";\n}\n\n\n// Some helper functions for testing using overloaded/template\n// functions with ASSERT_PREDn and EXPECT_PREDn.\n\nbool IsPositive(double x) {\n  return x > 0;\n}\n\ntemplate <typename T>\nbool IsNegative(T x) {\n  return x < 0;\n}\n\ntemplate <typename T1, typename T2>\nbool GreaterThan(T1 x1, T2 x2) {\n  return x1 > x2;\n}\n\n// Tests that overloaded functions can be used in *_PRED* as long as\n// their types are explicitly specified.\nTEST(PredicateAssertionTest, AcceptsOverloadedFunction) {\n  // C++Builder requires C-style casts rather than static_cast.\n  EXPECT_PRED1((bool (*)(int))(IsPositive), 5);  // NOLINT\n  ASSERT_PRED1((bool (*)(double))(IsPositive), 6.0);  // NOLINT\n}\n\n// Tests that template functions can be used in *_PRED* as long as\n// their types are explicitly specified.\nTEST(PredicateAssertionTest, AcceptsTemplateFunction) {\n  EXPECT_PRED1(IsNegative<int>, -5);\n  // Makes sure that we can handle templates with more than one\n  // parameter.\n  ASSERT_PRED2((GreaterThan<int, int>), 5, 0);\n}\n\n\n// Some helper functions for testing using overloaded/template\n// functions with ASSERT_PRED_FORMATn and EXPECT_PRED_FORMATn.\n\nAssertionResult IsPositiveFormat(const char* /* expr */, int n) {\n  return n > 0 ? AssertionSuccess() :\n      AssertionFailure(Message() << \"Failure\");\n}\n\nAssertionResult IsPositiveFormat(const char* /* expr */, double x) {\n  return x > 0 ? AssertionSuccess() :\n      AssertionFailure(Message() << \"Failure\");\n}\n\ntemplate <typename T>\nAssertionResult IsNegativeFormat(const char* /* expr */, T x) {\n  return x < 0 ? AssertionSuccess() :\n      AssertionFailure(Message() << \"Failure\");\n}\n\ntemplate <typename T1, typename T2>\nAssertionResult EqualsFormat(const char* /* expr1 */, const char* /* expr2 */,\n                             const T1& x1, const T2& x2) {\n  return x1 == x2 ? AssertionSuccess() :\n      AssertionFailure(Message() << \"Failure\");\n}\n\n// Tests that overloaded functions can be used in *_PRED_FORMAT*\n// without explicitly specifying their types.\nTEST(PredicateFormatAssertionTest, AcceptsOverloadedFunction) {\n  EXPECT_PRED_FORMAT1(IsPositiveFormat, 5);\n  ASSERT_PRED_FORMAT1(IsPositiveFormat, 6.0);\n}\n\n// Tests that template functions can be used in *_PRED_FORMAT* without\n// explicitly specifying their types.\nTEST(PredicateFormatAssertionTest, AcceptsTemplateFunction) {\n  EXPECT_PRED_FORMAT1(IsNegativeFormat, -5);\n  ASSERT_PRED_FORMAT2(EqualsFormat, 3, 3);\n}\n\n\n// Tests string assertions.\n\n// Tests ASSERT_STREQ with non-NULL arguments.\nTEST(StringAssertionTest, ASSERT_STREQ) {\n  const char * const p1 = \"good\";\n  ASSERT_STREQ(p1, p1);\n\n  // Let p2 have the same content as p1, but be at a different address.\n  const char p2[] = \"good\";\n  ASSERT_STREQ(p1, p2);\n\n  EXPECT_FATAL_FAILURE(ASSERT_STREQ(\"bad\", \"good\"),\n                       \"Expected: \\\"bad\\\"\");\n}\n\n// Tests ASSERT_STREQ with NULL arguments.\nTEST(StringAssertionTest, ASSERT_STREQ_Null) {\n  ASSERT_STREQ(static_cast<const char *>(NULL), NULL);\n  EXPECT_FATAL_FAILURE(ASSERT_STREQ(NULL, \"non-null\"),\n                       \"non-null\");\n}\n\n// Tests ASSERT_STREQ with NULL arguments.\nTEST(StringAssertionTest, ASSERT_STREQ_Null2) {\n  EXPECT_FATAL_FAILURE(ASSERT_STREQ(\"non-null\", NULL),\n                       \"non-null\");\n}\n\n// Tests ASSERT_STRNE.\nTEST(StringAssertionTest, ASSERT_STRNE) {\n  ASSERT_STRNE(\"hi\", \"Hi\");\n  ASSERT_STRNE(\"Hi\", NULL);\n  ASSERT_STRNE(NULL, \"Hi\");\n  ASSERT_STRNE(\"\", NULL);\n  ASSERT_STRNE(NULL, \"\");\n  ASSERT_STRNE(\"\", \"Hi\");\n  ASSERT_STRNE(\"Hi\", \"\");\n  EXPECT_FATAL_FAILURE(ASSERT_STRNE(\"Hi\", \"Hi\"),\n                       \"\\\"Hi\\\" vs \\\"Hi\\\"\");\n}\n\n// Tests ASSERT_STRCASEEQ.\nTEST(StringAssertionTest, ASSERT_STRCASEEQ) {\n  ASSERT_STRCASEEQ(\"hi\", \"Hi\");\n  ASSERT_STRCASEEQ(static_cast<const char *>(NULL), NULL);\n\n  ASSERT_STRCASEEQ(\"\", \"\");\n  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ(\"Hi\", \"hi2\"),\n                       \"(ignoring case)\");\n}\n\n// Tests ASSERT_STRCASENE.\nTEST(StringAssertionTest, ASSERT_STRCASENE) {\n  ASSERT_STRCASENE(\"hi1\", \"Hi2\");\n  ASSERT_STRCASENE(\"Hi\", NULL);\n  ASSERT_STRCASENE(NULL, \"Hi\");\n  ASSERT_STRCASENE(\"\", NULL);\n  ASSERT_STRCASENE(NULL, \"\");\n  ASSERT_STRCASENE(\"\", \"Hi\");\n  ASSERT_STRCASENE(\"Hi\", \"\");\n  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE(\"Hi\", \"hi\"),\n                       \"(ignoring case)\");\n}\n\n// Tests *_STREQ on wide strings.\nTEST(StringAssertionTest, STREQ_Wide) {\n  // NULL strings.\n  ASSERT_STREQ(static_cast<const wchar_t *>(NULL), NULL);\n\n  // Empty strings.\n  ASSERT_STREQ(L\"\", L\"\");\n\n  // Non-null vs NULL.\n  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L\"non-null\", NULL),\n                          \"non-null\");\n\n  // Equal strings.\n  EXPECT_STREQ(L\"Hi\", L\"Hi\");\n\n  // Unequal strings.\n  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L\"abc\", L\"Abc\"),\n                          \"Abc\");\n\n  // Strings containing wide characters.\n  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L\"abc\\x8119\", L\"abc\\x8120\"),\n                          \"abc\");\n}\n\n// Tests *_STRNE on wide strings.\nTEST(StringAssertionTest, STRNE_Wide) {\n  // NULL strings.\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_STRNE(static_cast<const wchar_t *>(NULL), NULL);\n  }, \"\");\n\n  // Empty strings.\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L\"\", L\"\"),\n                          \"L\\\"\\\"\");\n\n  // Non-null vs NULL.\n  ASSERT_STRNE(L\"non-null\", NULL);\n\n  // Equal strings.\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L\"Hi\", L\"Hi\"),\n                          \"L\\\"Hi\\\"\");\n\n  // Unequal strings.\n  EXPECT_STRNE(L\"abc\", L\"Abc\");\n\n  // Strings containing wide characters.\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L\"abc\\x8119\", L\"abc\\x8119\"),\n                          \"abc\");\n}\n\n// Tests for ::testing::IsSubstring().\n\n// Tests that IsSubstring() returns the correct result when the input\n// argument type is const char*.\nTEST(IsSubstringTest, ReturnsCorrectResultForCString) {\n  EXPECT_FALSE(IsSubstring(\"\", \"\", NULL, \"a\"));\n  EXPECT_FALSE(IsSubstring(\"\", \"\", \"b\", NULL));\n  EXPECT_FALSE(IsSubstring(\"\", \"\", \"needle\", \"haystack\"));\n\n  EXPECT_TRUE(IsSubstring(\"\", \"\", static_cast<const char*>(NULL), NULL));\n  EXPECT_TRUE(IsSubstring(\"\", \"\", \"needle\", \"two needles\"));\n}\n\n// Tests that IsSubstring() returns the correct result when the input\n// argument type is const wchar_t*.\nTEST(IsSubstringTest, ReturnsCorrectResultForWideCString) {\n  EXPECT_FALSE(IsSubstring(\"\", \"\", kNull, L\"a\"));\n  EXPECT_FALSE(IsSubstring(\"\", \"\", L\"b\", kNull));\n  EXPECT_FALSE(IsSubstring(\"\", \"\", L\"needle\", L\"haystack\"));\n\n  EXPECT_TRUE(IsSubstring(\"\", \"\", static_cast<const wchar_t*>(NULL), NULL));\n  EXPECT_TRUE(IsSubstring(\"\", \"\", L\"needle\", L\"two needles\"));\n}\n\n// Tests that IsSubstring() generates the correct message when the input\n// argument type is const char*.\nTEST(IsSubstringTest, GeneratesCorrectMessageForCString) {\n  EXPECT_STREQ(\"Value of: needle_expr\\n\"\n               \"  Actual: \\\"needle\\\"\\n\"\n               \"Expected: a substring of haystack_expr\\n\"\n               \"Which is: \\\"haystack\\\"\",\n               IsSubstring(\"needle_expr\", \"haystack_expr\",\n                           \"needle\", \"haystack\").failure_message());\n}\n\n// Tests that IsSubstring returns the correct result when the input\n// argument type is ::std::string.\nTEST(IsSubstringTest, ReturnsCorrectResultsForStdString) {\n  EXPECT_TRUE(IsSubstring(\"\", \"\", std::string(\"hello\"), \"ahellob\"));\n  EXPECT_FALSE(IsSubstring(\"\", \"\", \"hello\", std::string(\"world\")));\n}\n\n#if GTEST_HAS_STD_WSTRING\n// Tests that IsSubstring returns the correct result when the input\n// argument type is ::std::wstring.\nTEST(IsSubstringTest, ReturnsCorrectResultForStdWstring) {\n  EXPECT_TRUE(IsSubstring(\"\", \"\", ::std::wstring(L\"needle\"), L\"two needles\"));\n  EXPECT_FALSE(IsSubstring(\"\", \"\", L\"needle\", ::std::wstring(L\"haystack\")));\n}\n\n// Tests that IsSubstring() generates the correct message when the input\n// argument type is ::std::wstring.\nTEST(IsSubstringTest, GeneratesCorrectMessageForWstring) {\n  EXPECT_STREQ(\"Value of: needle_expr\\n\"\n               \"  Actual: L\\\"needle\\\"\\n\"\n               \"Expected: a substring of haystack_expr\\n\"\n               \"Which is: L\\\"haystack\\\"\",\n               IsSubstring(\n                   \"needle_expr\", \"haystack_expr\",\n                   ::std::wstring(L\"needle\"), L\"haystack\").failure_message());\n}\n\n#endif  // GTEST_HAS_STD_WSTRING\n\n// Tests for ::testing::IsNotSubstring().\n\n// Tests that IsNotSubstring() returns the correct result when the input\n// argument type is const char*.\nTEST(IsNotSubstringTest, ReturnsCorrectResultForCString) {\n  EXPECT_TRUE(IsNotSubstring(\"\", \"\", \"needle\", \"haystack\"));\n  EXPECT_FALSE(IsNotSubstring(\"\", \"\", \"needle\", \"two needles\"));\n}\n\n// Tests that IsNotSubstring() returns the correct result when the input\n// argument type is const wchar_t*.\nTEST(IsNotSubstringTest, ReturnsCorrectResultForWideCString) {\n  EXPECT_TRUE(IsNotSubstring(\"\", \"\", L\"needle\", L\"haystack\"));\n  EXPECT_FALSE(IsNotSubstring(\"\", \"\", L\"needle\", L\"two needles\"));\n}\n\n// Tests that IsNotSubstring() generates the correct message when the input\n// argument type is const wchar_t*.\nTEST(IsNotSubstringTest, GeneratesCorrectMessageForWideCString) {\n  EXPECT_STREQ(\"Value of: needle_expr\\n\"\n               \"  Actual: L\\\"needle\\\"\\n\"\n               \"Expected: not a substring of haystack_expr\\n\"\n               \"Which is: L\\\"two needles\\\"\",\n               IsNotSubstring(\n                   \"needle_expr\", \"haystack_expr\",\n                   L\"needle\", L\"two needles\").failure_message());\n}\n\n// Tests that IsNotSubstring returns the correct result when the input\n// argument type is ::std::string.\nTEST(IsNotSubstringTest, ReturnsCorrectResultsForStdString) {\n  EXPECT_FALSE(IsNotSubstring(\"\", \"\", std::string(\"hello\"), \"ahellob\"));\n  EXPECT_TRUE(IsNotSubstring(\"\", \"\", \"hello\", std::string(\"world\")));\n}\n\n// Tests that IsNotSubstring() generates the correct message when the input\n// argument type is ::std::string.\nTEST(IsNotSubstringTest, GeneratesCorrectMessageForStdString) {\n  EXPECT_STREQ(\"Value of: needle_expr\\n\"\n               \"  Actual: \\\"needle\\\"\\n\"\n               \"Expected: not a substring of haystack_expr\\n\"\n               \"Which is: \\\"two needles\\\"\",\n               IsNotSubstring(\n                   \"needle_expr\", \"haystack_expr\",\n                   ::std::string(\"needle\"), \"two needles\").failure_message());\n}\n\n#if GTEST_HAS_STD_WSTRING\n\n// Tests that IsNotSubstring returns the correct result when the input\n// argument type is ::std::wstring.\nTEST(IsNotSubstringTest, ReturnsCorrectResultForStdWstring) {\n  EXPECT_FALSE(\n      IsNotSubstring(\"\", \"\", ::std::wstring(L\"needle\"), L\"two needles\"));\n  EXPECT_TRUE(IsNotSubstring(\"\", \"\", L\"needle\", ::std::wstring(L\"haystack\")));\n}\n\n#endif  // GTEST_HAS_STD_WSTRING\n\n// Tests floating-point assertions.\n\ntemplate <typename RawType>\nclass FloatingPointTest : public Test {\n protected:\n\n  // Pre-calculated numbers to be used by the tests.\n  struct TestValues {\n    RawType close_to_positive_zero;\n    RawType close_to_negative_zero;\n    RawType further_from_negative_zero;\n\n    RawType close_to_one;\n    RawType further_from_one;\n\n    RawType infinity;\n    RawType close_to_infinity;\n    RawType further_from_infinity;\n\n    RawType nan1;\n    RawType nan2;\n  };\n\n  typedef typename testing::internal::FloatingPoint<RawType> Floating;\n  typedef typename Floating::Bits Bits;\n\n  virtual void SetUp() {\n    const size_t max_ulps = Floating::kMaxUlps;\n\n    // The bits that represent 0.0.\n    const Bits zero_bits = Floating(0).bits();\n\n    // Makes some numbers close to 0.0.\n    values_.close_to_positive_zero = Floating::ReinterpretBits(\n        zero_bits + max_ulps/2);\n    values_.close_to_negative_zero = -Floating::ReinterpretBits(\n        zero_bits + max_ulps - max_ulps/2);\n    values_.further_from_negative_zero = -Floating::ReinterpretBits(\n        zero_bits + max_ulps + 1 - max_ulps/2);\n\n    // The bits that represent 1.0.\n    const Bits one_bits = Floating(1).bits();\n\n    // Makes some numbers close to 1.0.\n    values_.close_to_one = Floating::ReinterpretBits(one_bits + max_ulps);\n    values_.further_from_one = Floating::ReinterpretBits(\n        one_bits + max_ulps + 1);\n\n    // +infinity.\n    values_.infinity = Floating::Infinity();\n\n    // The bits that represent +infinity.\n    const Bits infinity_bits = Floating(values_.infinity).bits();\n\n    // Makes some numbers close to infinity.\n    values_.close_to_infinity = Floating::ReinterpretBits(\n        infinity_bits - max_ulps);\n    values_.further_from_infinity = Floating::ReinterpretBits(\n        infinity_bits - max_ulps - 1);\n\n    // Makes some NAN's.  Sets the most significant bit of the fraction so that\n    // our NaN's are quiet; trying to process a signaling NaN would raise an\n    // exception if our environment enables floating point exceptions.\n    values_.nan1 = Floating::ReinterpretBits(Floating::kExponentBitMask\n        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 1);\n    values_.nan2 = Floating::ReinterpretBits(Floating::kExponentBitMask\n        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 200);\n  }\n\n  void TestSize() {\n    EXPECT_EQ(sizeof(RawType), sizeof(Bits));\n  }\n\n  static TestValues values_;\n};\n\ntemplate <typename RawType>\ntypename FloatingPointTest<RawType>::TestValues\n    FloatingPointTest<RawType>::values_;\n\n// Instantiates FloatingPointTest for testing *_FLOAT_EQ.\ntypedef FloatingPointTest<float> FloatTest;\n\n// Tests that the size of Float::Bits matches the size of float.\nTEST_F(FloatTest, Size) {\n  TestSize();\n}\n\n// Tests comparing with +0 and -0.\nTEST_F(FloatTest, Zeros) {\n  EXPECT_FLOAT_EQ(0.0, -0.0);\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(-0.0, 1.0),\n                          \"1.0\");\n  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.5),\n                       \"1.5\");\n}\n\n// Tests comparing numbers close to 0.\n//\n// This ensures that *_FLOAT_EQ handles the sign correctly and no\n// overflow occurs when comparing numbers whose absolute value is very\n// small.\nTEST_F(FloatTest, AlmostZeros) {\n  // In C++Builder, names within local classes (such as used by\n  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the\n  // scoping class.  Use a static local alias as a workaround.\n  // We use the assignment syntax since some compilers, like Sun Studio,\n  // don't allow initializing references using construction syntax\n  // (parentheses).\n  static const FloatTest::TestValues& v = this->values_;\n\n  EXPECT_FLOAT_EQ(0.0, v.close_to_positive_zero);\n  EXPECT_FLOAT_EQ(-0.0, v.close_to_negative_zero);\n  EXPECT_FLOAT_EQ(v.close_to_positive_zero, v.close_to_negative_zero);\n\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_FLOAT_EQ(v.close_to_positive_zero,\n                    v.further_from_negative_zero);\n  }, \"v.further_from_negative_zero\");\n}\n\n// Tests comparing numbers close to each other.\nTEST_F(FloatTest, SmallDiff) {\n  EXPECT_FLOAT_EQ(1.0, values_.close_to_one);\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, values_.further_from_one),\n                          \"values_.further_from_one\");\n}\n\n// Tests comparing numbers far apart.\nTEST_F(FloatTest, LargeDiff) {\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(2.5, 3.0),\n                          \"3.0\");\n}\n\n// Tests comparing with infinity.\n//\n// This ensures that no overflow occurs when comparing numbers whose\n// absolute value is very large.\nTEST_F(FloatTest, Infinity) {\n  EXPECT_FLOAT_EQ(values_.infinity, values_.close_to_infinity);\n  EXPECT_FLOAT_EQ(-values_.infinity, -values_.close_to_infinity);\n#if !GTEST_OS_SYMBIAN\n  // Nokia's STLport crashes if we try to output infinity or NaN.\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, -values_.infinity),\n                          \"-values_.infinity\");\n\n  // This is interesting as the representations of infinity and nan1\n  // are only 1 DLP apart.\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, values_.nan1),\n                          \"values_.nan1\");\n#endif  // !GTEST_OS_SYMBIAN\n}\n\n// Tests that comparing with NAN always returns false.\nTEST_F(FloatTest, NaN) {\n#if !GTEST_OS_SYMBIAN\n// Nokia's STLport crashes if we try to output infinity or NaN.\n\n  // In C++Builder, names within local classes (such as used by\n  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the\n  // scoping class.  Use a static local alias as a workaround.\n  // We use the assignment syntax since some compilers, like Sun Studio,\n  // don't allow initializing references using construction syntax\n  // (parentheses).\n  static const FloatTest::TestValues& v = this->values_;\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan1),\n                          \"v.nan1\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan2),\n                          \"v.nan2\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, v.nan1),\n                          \"v.nan1\");\n\n  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(v.nan1, v.infinity),\n                       \"v.infinity\");\n#endif  // !GTEST_OS_SYMBIAN\n}\n\n// Tests that *_FLOAT_EQ are reflexive.\nTEST_F(FloatTest, Reflexive) {\n  EXPECT_FLOAT_EQ(0.0, 0.0);\n  EXPECT_FLOAT_EQ(1.0, 1.0);\n  ASSERT_FLOAT_EQ(values_.infinity, values_.infinity);\n}\n\n// Tests that *_FLOAT_EQ are commutative.\nTEST_F(FloatTest, Commutative) {\n  // We already tested EXPECT_FLOAT_EQ(1.0, values_.close_to_one).\n  EXPECT_FLOAT_EQ(values_.close_to_one, 1.0);\n\n  // We already tested EXPECT_FLOAT_EQ(1.0, values_.further_from_one).\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.further_from_one, 1.0),\n                          \"1.0\");\n}\n\n// Tests EXPECT_NEAR.\nTEST_F(FloatTest, EXPECT_NEAR) {\n  EXPECT_NEAR(-1.0f, -1.1f, 0.2f);\n  EXPECT_NEAR(2.0f, 3.0f, 1.0f);\n  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT\n                          \"The difference between 1.0f and 1.5f is 0.5, \"\n                          \"which exceeds 0.25f\");\n  // To work around a bug in gcc 2.95.0, there is intentionally no\n  // space after the first comma in the previous line.\n}\n\n// Tests ASSERT_NEAR.\nTEST_F(FloatTest, ASSERT_NEAR) {\n  ASSERT_NEAR(-1.0f, -1.1f, 0.2f);\n  ASSERT_NEAR(2.0f, 3.0f, 1.0f);\n  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT\n                       \"The difference between 1.0f and 1.5f is 0.5, \"\n                       \"which exceeds 0.25f\");\n  // To work around a bug in gcc 2.95.0, there is intentionally no\n  // space after the first comma in the previous line.\n}\n\n// Tests the cases where FloatLE() should succeed.\nTEST_F(FloatTest, FloatLESucceeds) {\n  EXPECT_PRED_FORMAT2(FloatLE, 1.0f, 2.0f);  // When val1 < val2,\n  ASSERT_PRED_FORMAT2(FloatLE, 1.0f, 1.0f);  // val1 == val2,\n\n  // or when val1 is greater than, but almost equals to, val2.\n  EXPECT_PRED_FORMAT2(FloatLE, values_.close_to_positive_zero, 0.0f);\n}\n\n// Tests the cases where FloatLE() should fail.\nTEST_F(FloatTest, FloatLEFails) {\n  // When val1 is greater than val2 by a large margin,\n  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(FloatLE, 2.0f, 1.0f),\n                          \"(2.0f) <= (1.0f)\");\n\n  // or by a small yet non-negligible margin,\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(FloatLE, values_.further_from_one, 1.0f);\n  }, \"(values_.further_from_one) <= (1.0f)\");\n\n#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)\n  // Nokia's STLport crashes if we try to output infinity or NaN.\n  // C++Builder gives bad results for ordered comparisons involving NaNs\n  // due to compiler bugs.\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(FloatLE, values_.nan1, values_.infinity);\n  }, \"(values_.nan1) <= (values_.infinity)\");\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(FloatLE, -values_.infinity, values_.nan1);\n  }, \"(-values_.infinity) <= (values_.nan1)\");\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT2(FloatLE, values_.nan1, values_.nan1);\n  }, \"(values_.nan1) <= (values_.nan1)\");\n#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)\n}\n\n// Instantiates FloatingPointTest for testing *_DOUBLE_EQ.\ntypedef FloatingPointTest<double> DoubleTest;\n\n// Tests that the size of Double::Bits matches the size of double.\nTEST_F(DoubleTest, Size) {\n  TestSize();\n}\n\n// Tests comparing with +0 and -0.\nTEST_F(DoubleTest, Zeros) {\n  EXPECT_DOUBLE_EQ(0.0, -0.0);\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(-0.0, 1.0),\n                          \"1.0\");\n  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(0.0, 1.0),\n                       \"1.0\");\n}\n\n// Tests comparing numbers close to 0.\n//\n// This ensures that *_DOUBLE_EQ handles the sign correctly and no\n// overflow occurs when comparing numbers whose absolute value is very\n// small.\nTEST_F(DoubleTest, AlmostZeros) {\n  // In C++Builder, names within local classes (such as used by\n  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the\n  // scoping class.  Use a static local alias as a workaround.\n  // We use the assignment syntax since some compilers, like Sun Studio,\n  // don't allow initializing references using construction syntax\n  // (parentheses).\n  static const DoubleTest::TestValues& v = this->values_;\n\n  EXPECT_DOUBLE_EQ(0.0, v.close_to_positive_zero);\n  EXPECT_DOUBLE_EQ(-0.0, v.close_to_negative_zero);\n  EXPECT_DOUBLE_EQ(v.close_to_positive_zero, v.close_to_negative_zero);\n\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_DOUBLE_EQ(v.close_to_positive_zero,\n                     v.further_from_negative_zero);\n  }, \"v.further_from_negative_zero\");\n}\n\n// Tests comparing numbers close to each other.\nTEST_F(DoubleTest, SmallDiff) {\n  EXPECT_DOUBLE_EQ(1.0, values_.close_to_one);\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, values_.further_from_one),\n                          \"values_.further_from_one\");\n}\n\n// Tests comparing numbers far apart.\nTEST_F(DoubleTest, LargeDiff) {\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(2.0, 3.0),\n                          \"3.0\");\n}\n\n// Tests comparing with infinity.\n//\n// This ensures that no overflow occurs when comparing numbers whose\n// absolute value is very large.\nTEST_F(DoubleTest, Infinity) {\n  EXPECT_DOUBLE_EQ(values_.infinity, values_.close_to_infinity);\n  EXPECT_DOUBLE_EQ(-values_.infinity, -values_.close_to_infinity);\n#if !GTEST_OS_SYMBIAN\n  // Nokia's STLport crashes if we try to output infinity or NaN.\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, -values_.infinity),\n                          \"-values_.infinity\");\n\n  // This is interesting as the representations of infinity_ and nan1_\n  // are only 1 DLP apart.\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, values_.nan1),\n                          \"values_.nan1\");\n#endif  // !GTEST_OS_SYMBIAN\n}\n\n// Tests that comparing with NAN always returns false.\nTEST_F(DoubleTest, NaN) {\n#if !GTEST_OS_SYMBIAN\n  // In C++Builder, names within local classes (such as used by\n  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the\n  // scoping class.  Use a static local alias as a workaround.\n  // We use the assignment syntax since some compilers, like Sun Studio,\n  // don't allow initializing references using construction syntax\n  // (parentheses).\n  static const DoubleTest::TestValues& v = this->values_;\n\n  // Nokia's STLport crashes if we try to output infinity or NaN.\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan1),\n                          \"v.nan1\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan2), \"v.nan2\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, v.nan1), \"v.nan1\");\n  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(v.nan1, v.infinity),\n                       \"v.infinity\");\n#endif  // !GTEST_OS_SYMBIAN\n}\n\n// Tests that *_DOUBLE_EQ are reflexive.\nTEST_F(DoubleTest, Reflexive) {\n  EXPECT_DOUBLE_EQ(0.0, 0.0);\n  EXPECT_DOUBLE_EQ(1.0, 1.0);\n#if !GTEST_OS_SYMBIAN\n  // Nokia's STLport crashes if we try to output infinity or NaN.\n  ASSERT_DOUBLE_EQ(values_.infinity, values_.infinity);\n#endif  // !GTEST_OS_SYMBIAN\n}\n\n// Tests that *_DOUBLE_EQ are commutative.\nTEST_F(DoubleTest, Commutative) {\n  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.close_to_one).\n  EXPECT_DOUBLE_EQ(values_.close_to_one, 1.0);\n\n  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.further_from_one).\n  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.further_from_one, 1.0),\n                          \"1.0\");\n}\n\n// Tests EXPECT_NEAR.\nTEST_F(DoubleTest, EXPECT_NEAR) {\n  EXPECT_NEAR(-1.0, -1.1, 0.2);\n  EXPECT_NEAR(2.0, 3.0, 1.0);\n  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0, 1.5, 0.25),  // NOLINT\n                          \"The difference between 1.0 and 1.5 is 0.5, \"\n                          \"which exceeds 0.25\");\n  // To work around a bug in gcc 2.95.0, there is intentionally no\n  // space after the first comma in the previous statement.\n}\n\n// Tests ASSERT_NEAR.\nTEST_F(DoubleTest, ASSERT_NEAR) {\n  ASSERT_NEAR(-1.0, -1.1, 0.2);\n  ASSERT_NEAR(2.0, 3.0, 1.0);\n  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0, 1.5, 0.25),  // NOLINT\n                       \"The difference between 1.0 and 1.5 is 0.5, \"\n                       \"which exceeds 0.25\");\n  // To work around a bug in gcc 2.95.0, there is intentionally no\n  // space after the first comma in the previous statement.\n}\n\n// Tests the cases where DoubleLE() should succeed.\nTEST_F(DoubleTest, DoubleLESucceeds) {\n  EXPECT_PRED_FORMAT2(DoubleLE, 1.0, 2.0);  // When val1 < val2,\n  ASSERT_PRED_FORMAT2(DoubleLE, 1.0, 1.0);  // val1 == val2,\n\n  // or when val1 is greater than, but almost equals to, val2.\n  EXPECT_PRED_FORMAT2(DoubleLE, values_.close_to_positive_zero, 0.0);\n}\n\n// Tests the cases where DoubleLE() should fail.\nTEST_F(DoubleTest, DoubleLEFails) {\n  // When val1 is greater than val2 by a large margin,\n  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(DoubleLE, 2.0, 1.0),\n                          \"(2.0) <= (1.0)\");\n\n  // or by a small yet non-negligible margin,\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(DoubleLE, values_.further_from_one, 1.0);\n  }, \"(values_.further_from_one) <= (1.0)\");\n\n#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)\n  // Nokia's STLport crashes if we try to output infinity or NaN.\n  // C++Builder gives bad results for ordered comparisons involving NaNs\n  // due to compiler bugs.\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.infinity);\n  }, \"(values_.nan1) <= (values_.infinity)\");\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_PRED_FORMAT2(DoubleLE, -values_.infinity, values_.nan1);\n  }, \" (-values_.infinity) <= (values_.nan1)\");\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.nan1);\n  }, \"(values_.nan1) <= (values_.nan1)\");\n#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)\n}\n\n\n// Verifies that a test or test case whose name starts with DISABLED_ is\n// not run.\n\n// A test whose name starts with DISABLED_.\n// Should not run.\nTEST(DisabledTest, DISABLED_TestShouldNotRun) {\n  FAIL() << \"Unexpected failure: Disabled test should not be run.\";\n}\n\n// A test whose name does not start with DISABLED_.\n// Should run.\nTEST(DisabledTest, NotDISABLED_TestShouldRun) {\n  EXPECT_EQ(1, 1);\n}\n\n// A test case whose name starts with DISABLED_.\n// Should not run.\nTEST(DISABLED_TestCase, TestShouldNotRun) {\n  FAIL() << \"Unexpected failure: Test in disabled test case should not be run.\";\n}\n\n// A test case and test whose names start with DISABLED_.\n// Should not run.\nTEST(DISABLED_TestCase, DISABLED_TestShouldNotRun) {\n  FAIL() << \"Unexpected failure: Test in disabled test case should not be run.\";\n}\n\n// Check that when all tests in a test case are disabled, SetupTestCase() and\n// TearDownTestCase() are not called.\nclass DisabledTestsTest : public Test {\n protected:\n  static void SetUpTestCase() {\n    FAIL() << \"Unexpected failure: All tests disabled in test case. \"\n              \"SetupTestCase() should not be called.\";\n  }\n\n  static void TearDownTestCase() {\n    FAIL() << \"Unexpected failure: All tests disabled in test case. \"\n              \"TearDownTestCase() should not be called.\";\n  }\n};\n\nTEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_1) {\n  FAIL() << \"Unexpected failure: Disabled test should not be run.\";\n}\n\nTEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_2) {\n  FAIL() << \"Unexpected failure: Disabled test should not be run.\";\n}\n\n// Tests that disabled typed tests aren't run.\n\n#if GTEST_HAS_TYPED_TEST\n\ntemplate <typename T>\nclass TypedTest : public Test {\n};\n\ntypedef testing::Types<int, double> NumericTypes;\nTYPED_TEST_CASE(TypedTest, NumericTypes);\n\nTYPED_TEST(TypedTest, DISABLED_ShouldNotRun) {\n  FAIL() << \"Unexpected failure: Disabled typed test should not run.\";\n}\n\ntemplate <typename T>\nclass DISABLED_TypedTest : public Test {\n};\n\nTYPED_TEST_CASE(DISABLED_TypedTest, NumericTypes);\n\nTYPED_TEST(DISABLED_TypedTest, ShouldNotRun) {\n  FAIL() << \"Unexpected failure: Disabled typed test should not run.\";\n}\n\n#endif  // GTEST_HAS_TYPED_TEST\n\n// Tests that disabled type-parameterized tests aren't run.\n\n#if GTEST_HAS_TYPED_TEST_P\n\ntemplate <typename T>\nclass TypedTestP : public Test {\n};\n\nTYPED_TEST_CASE_P(TypedTestP);\n\nTYPED_TEST_P(TypedTestP, DISABLED_ShouldNotRun) {\n  FAIL() << \"Unexpected failure: \"\n         << \"Disabled type-parameterized test should not run.\";\n}\n\nREGISTER_TYPED_TEST_CASE_P(TypedTestP, DISABLED_ShouldNotRun);\n\nINSTANTIATE_TYPED_TEST_CASE_P(My, TypedTestP, NumericTypes);\n\ntemplate <typename T>\nclass DISABLED_TypedTestP : public Test {\n};\n\nTYPED_TEST_CASE_P(DISABLED_TypedTestP);\n\nTYPED_TEST_P(DISABLED_TypedTestP, ShouldNotRun) {\n  FAIL() << \"Unexpected failure: \"\n         << \"Disabled type-parameterized test should not run.\";\n}\n\nREGISTER_TYPED_TEST_CASE_P(DISABLED_TypedTestP, ShouldNotRun);\n\nINSTANTIATE_TYPED_TEST_CASE_P(My, DISABLED_TypedTestP, NumericTypes);\n\n#endif  // GTEST_HAS_TYPED_TEST_P\n\n// Tests that assertion macros evaluate their arguments exactly once.\n\nclass SingleEvaluationTest : public Test {\n public:  // Must be public and not protected due to a bug in g++ 3.4.2.\n  // This helper function is needed by the FailedASSERT_STREQ test\n  // below.  It's public to work around C++Builder's bug with scoping local\n  // classes.\n  static void CompareAndIncrementCharPtrs() {\n    ASSERT_STREQ(p1_++, p2_++);\n  }\n\n  // This helper function is needed by the FailedASSERT_NE test below.  It's\n  // public to work around C++Builder's bug with scoping local classes.\n  static void CompareAndIncrementInts() {\n    ASSERT_NE(a_++, b_++);\n  }\n\n protected:\n  SingleEvaluationTest() {\n    p1_ = s1_;\n    p2_ = s2_;\n    a_ = 0;\n    b_ = 0;\n  }\n\n  static const char* const s1_;\n  static const char* const s2_;\n  static const char* p1_;\n  static const char* p2_;\n\n  static int a_;\n  static int b_;\n};\n\nconst char* const SingleEvaluationTest::s1_ = \"01234\";\nconst char* const SingleEvaluationTest::s2_ = \"abcde\";\nconst char* SingleEvaluationTest::p1_;\nconst char* SingleEvaluationTest::p2_;\nint SingleEvaluationTest::a_;\nint SingleEvaluationTest::b_;\n\n// Tests that when ASSERT_STREQ fails, it evaluates its arguments\n// exactly once.\nTEST_F(SingleEvaluationTest, FailedASSERT_STREQ) {\n  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementCharPtrs(),\n                       \"p2_++\");\n  EXPECT_EQ(s1_ + 1, p1_);\n  EXPECT_EQ(s2_ + 1, p2_);\n}\n\n// Tests that string assertion arguments are evaluated exactly once.\nTEST_F(SingleEvaluationTest, ASSERT_STR) {\n  // successful EXPECT_STRNE\n  EXPECT_STRNE(p1_++, p2_++);\n  EXPECT_EQ(s1_ + 1, p1_);\n  EXPECT_EQ(s2_ + 1, p2_);\n\n  // failed EXPECT_STRCASEEQ\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ(p1_++, p2_++),\n                          \"ignoring case\");\n  EXPECT_EQ(s1_ + 2, p1_);\n  EXPECT_EQ(s2_ + 2, p2_);\n}\n\n// Tests that when ASSERT_NE fails, it evaluates its arguments exactly\n// once.\nTEST_F(SingleEvaluationTest, FailedASSERT_NE) {\n  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementInts(),\n                       \"(a_++) != (b_++)\");\n  EXPECT_EQ(1, a_);\n  EXPECT_EQ(1, b_);\n}\n\n// Tests that assertion arguments are evaluated exactly once.\nTEST_F(SingleEvaluationTest, OtherCases) {\n  // successful EXPECT_TRUE\n  EXPECT_TRUE(0 == a_++);  // NOLINT\n  EXPECT_EQ(1, a_);\n\n  // failed EXPECT_TRUE\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(-1 == a_++), \"-1 == a_++\");\n  EXPECT_EQ(2, a_);\n\n  // successful EXPECT_GT\n  EXPECT_GT(a_++, b_++);\n  EXPECT_EQ(3, a_);\n  EXPECT_EQ(1, b_);\n\n  // failed EXPECT_LT\n  EXPECT_NONFATAL_FAILURE(EXPECT_LT(a_++, b_++), \"(a_++) < (b_++)\");\n  EXPECT_EQ(4, a_);\n  EXPECT_EQ(2, b_);\n\n  // successful ASSERT_TRUE\n  ASSERT_TRUE(0 < a_++);  // NOLINT\n  EXPECT_EQ(5, a_);\n\n  // successful ASSERT_GT\n  ASSERT_GT(a_++, b_++);\n  EXPECT_EQ(6, a_);\n  EXPECT_EQ(3, b_);\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\nvoid ThrowAnInteger() {\n  throw 1;\n}\n\n// Tests that assertion arguments are evaluated exactly once.\nTEST_F(SingleEvaluationTest, ExceptionTests) {\n  // successful EXPECT_THROW\n  EXPECT_THROW({  // NOLINT\n    a_++;\n    ThrowAnInteger();\n  }, int);\n  EXPECT_EQ(1, a_);\n\n  // failed EXPECT_THROW, throws different\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW({  // NOLINT\n    a_++;\n    ThrowAnInteger();\n  }, bool), \"throws a different type\");\n  EXPECT_EQ(2, a_);\n\n  // failed EXPECT_THROW, throws nothing\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(a_++, bool), \"throws nothing\");\n  EXPECT_EQ(3, a_);\n\n  // successful EXPECT_NO_THROW\n  EXPECT_NO_THROW(a_++);\n  EXPECT_EQ(4, a_);\n\n  // failed EXPECT_NO_THROW\n  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW({  // NOLINT\n    a_++;\n    ThrowAnInteger();\n  }), \"it throws\");\n  EXPECT_EQ(5, a_);\n\n  // successful EXPECT_ANY_THROW\n  EXPECT_ANY_THROW({  // NOLINT\n    a_++;\n    ThrowAnInteger();\n  });\n  EXPECT_EQ(6, a_);\n\n  // failed EXPECT_ANY_THROW\n  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(a_++), \"it doesn't\");\n  EXPECT_EQ(7, a_);\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// Tests {ASSERT|EXPECT}_NO_FATAL_FAILURE.\nclass NoFatalFailureTest : public Test {\n protected:\n  void Succeeds() {}\n  void FailsNonFatal() {\n    ADD_FAILURE() << \"some non-fatal failure\";\n  }\n  void Fails() {\n    FAIL() << \"some fatal failure\";\n  }\n\n  void DoAssertNoFatalFailureOnFails() {\n    ASSERT_NO_FATAL_FAILURE(Fails());\n    ADD_FAILURE() << \"shold not reach here.\";\n  }\n\n  void DoExpectNoFatalFailureOnFails() {\n    EXPECT_NO_FATAL_FAILURE(Fails());\n    ADD_FAILURE() << \"other failure\";\n  }\n};\n\nTEST_F(NoFatalFailureTest, NoFailure) {\n  EXPECT_NO_FATAL_FAILURE(Succeeds());\n  ASSERT_NO_FATAL_FAILURE(Succeeds());\n}\n\nTEST_F(NoFatalFailureTest, NonFatalIsNoFailure) {\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_NO_FATAL_FAILURE(FailsNonFatal()),\n      \"some non-fatal failure\");\n  EXPECT_NONFATAL_FAILURE(\n      ASSERT_NO_FATAL_FAILURE(FailsNonFatal()),\n      \"some non-fatal failure\");\n}\n\nTEST_F(NoFatalFailureTest, AssertNoFatalFailureOnFatalFailure) {\n  TestPartResultArray gtest_failures;\n  {\n    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);\n    DoAssertNoFatalFailureOnFails();\n  }\n  ASSERT_EQ(2, gtest_failures.size());\n  EXPECT_EQ(TestPartResult::kFatalFailure,\n            gtest_failures.GetTestPartResult(0).type());\n  EXPECT_EQ(TestPartResult::kFatalFailure,\n            gtest_failures.GetTestPartResult(1).type());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"some fatal failure\",\n                      gtest_failures.GetTestPartResult(0).message());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"it does\",\n                      gtest_failures.GetTestPartResult(1).message());\n}\n\nTEST_F(NoFatalFailureTest, ExpectNoFatalFailureOnFatalFailure) {\n  TestPartResultArray gtest_failures;\n  {\n    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);\n    DoExpectNoFatalFailureOnFails();\n  }\n  ASSERT_EQ(3, gtest_failures.size());\n  EXPECT_EQ(TestPartResult::kFatalFailure,\n            gtest_failures.GetTestPartResult(0).type());\n  EXPECT_EQ(TestPartResult::kNonFatalFailure,\n            gtest_failures.GetTestPartResult(1).type());\n  EXPECT_EQ(TestPartResult::kNonFatalFailure,\n            gtest_failures.GetTestPartResult(2).type());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"some fatal failure\",\n                      gtest_failures.GetTestPartResult(0).message());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"it does\",\n                      gtest_failures.GetTestPartResult(1).message());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"other failure\",\n                      gtest_failures.GetTestPartResult(2).message());\n}\n\nTEST_F(NoFatalFailureTest, MessageIsStreamable) {\n  TestPartResultArray gtest_failures;\n  {\n    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);\n    EXPECT_NO_FATAL_FAILURE(FAIL() << \"foo\") << \"my message\";\n  }\n  ASSERT_EQ(2, gtest_failures.size());\n  EXPECT_EQ(TestPartResult::kNonFatalFailure,\n            gtest_failures.GetTestPartResult(0).type());\n  EXPECT_EQ(TestPartResult::kNonFatalFailure,\n            gtest_failures.GetTestPartResult(1).type());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"foo\",\n                      gtest_failures.GetTestPartResult(0).message());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, \"my message\",\n                      gtest_failures.GetTestPartResult(1).message());\n}\n\n// Tests non-string assertions.\n\n// Tests EqFailure(), used for implementing *EQ* assertions.\nTEST(AssertionTest, EqFailure) {\n  const String foo_val(\"5\"), bar_val(\"6\");\n  const String msg1(\n      EqFailure(\"foo\", \"bar\", foo_val, bar_val, false)\n      .failure_message());\n  EXPECT_STREQ(\n      \"Value of: bar\\n\"\n      \"  Actual: 6\\n\"\n      \"Expected: foo\\n\"\n      \"Which is: 5\",\n      msg1.c_str());\n\n  const String msg2(\n      EqFailure(\"foo\", \"6\", foo_val, bar_val, false)\n      .failure_message());\n  EXPECT_STREQ(\n      \"Value of: 6\\n\"\n      \"Expected: foo\\n\"\n      \"Which is: 5\",\n      msg2.c_str());\n\n  const String msg3(\n      EqFailure(\"5\", \"bar\", foo_val, bar_val, false)\n      .failure_message());\n  EXPECT_STREQ(\n      \"Value of: bar\\n\"\n      \"  Actual: 6\\n\"\n      \"Expected: 5\",\n      msg3.c_str());\n\n  const String msg4(\n      EqFailure(\"5\", \"6\", foo_val, bar_val, false).failure_message());\n  EXPECT_STREQ(\n      \"Value of: 6\\n\"\n      \"Expected: 5\",\n      msg4.c_str());\n\n  const String msg5(\n      EqFailure(\"foo\", \"bar\",\n                String(\"\\\"x\\\"\"), String(\"\\\"y\\\"\"),\n                true).failure_message());\n  EXPECT_STREQ(\n      \"Value of: bar\\n\"\n      \"  Actual: \\\"y\\\"\\n\"\n      \"Expected: foo (ignoring case)\\n\"\n      \"Which is: \\\"x\\\"\",\n      msg5.c_str());\n}\n\n// Tests AppendUserMessage(), used for implementing the *EQ* macros.\nTEST(AssertionTest, AppendUserMessage) {\n  const String foo(\"foo\");\n\n  Message msg;\n  EXPECT_STREQ(\"foo\",\n               AppendUserMessage(foo, msg).c_str());\n\n  msg << \"bar\";\n  EXPECT_STREQ(\"foo\\nbar\",\n               AppendUserMessage(foo, msg).c_str());\n}\n\n#ifdef __BORLANDC__\n// Silences warnings: \"Condition is always true\", \"Unreachable code\"\n#pragma option push -w-ccc -w-rch\n#endif\n\n// Tests ASSERT_TRUE.\nTEST(AssertionTest, ASSERT_TRUE) {\n  ASSERT_TRUE(2 > 1);  // NOLINT\n  EXPECT_FATAL_FAILURE(ASSERT_TRUE(2 < 1),\n                       \"2 < 1\");\n}\n\n// Tests ASSERT_TRUE(predicate) for predicates returning AssertionResult.\nTEST(AssertionTest, AssertTrueWithAssertionResult) {\n  ASSERT_TRUE(ResultIsEven(2));\n#if !defined(__BORLANDC__) || __BORLANDC__ >= 0x600\n  // ICE's in C++Builder 2007.\n  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEven(3)),\n                       \"Value of: ResultIsEven(3)\\n\"\n                       \"  Actual: false (3 is odd)\\n\"\n                       \"Expected: true\");\n#endif\n  ASSERT_TRUE(ResultIsEvenNoExplanation(2));\n  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEvenNoExplanation(3)),\n                       \"Value of: ResultIsEvenNoExplanation(3)\\n\"\n                       \"  Actual: false (3 is odd)\\n\"\n                       \"Expected: true\");\n}\n\n// Tests ASSERT_FALSE.\nTEST(AssertionTest, ASSERT_FALSE) {\n  ASSERT_FALSE(2 < 1);  // NOLINT\n  EXPECT_FATAL_FAILURE(ASSERT_FALSE(2 > 1),\n                       \"Value of: 2 > 1\\n\"\n                       \"  Actual: true\\n\"\n                       \"Expected: false\");\n}\n\n// Tests ASSERT_FALSE(predicate) for predicates returning AssertionResult.\nTEST(AssertionTest, AssertFalseWithAssertionResult) {\n  ASSERT_FALSE(ResultIsEven(3));\n#if !defined(__BORLANDC__) || __BORLANDC__ >= 0x600\n  // ICE's in C++Builder 2007.\n  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEven(2)),\n                       \"Value of: ResultIsEven(2)\\n\"\n                       \"  Actual: true (2 is even)\\n\"\n                       \"Expected: false\");\n#endif\n  ASSERT_FALSE(ResultIsEvenNoExplanation(3));\n  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEvenNoExplanation(2)),\n                       \"Value of: ResultIsEvenNoExplanation(2)\\n\"\n                       \"  Actual: true\\n\"\n                       \"Expected: false\");\n}\n\n#ifdef __BORLANDC__\n// Restores warnings after previous \"#pragma option push\" supressed them\n#pragma option pop\n#endif\n\n// Tests using ASSERT_EQ on double values.  The purpose is to make\n// sure that the specialization we did for integer and anonymous enums\n// isn't used for double arguments.\nTEST(ExpectTest, ASSERT_EQ_Double) {\n  // A success.\n  ASSERT_EQ(5.6, 5.6);\n\n  // A failure.\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(5.1, 5.2),\n                       \"5.1\");\n}\n\n// Tests ASSERT_EQ.\nTEST(AssertionTest, ASSERT_EQ) {\n  ASSERT_EQ(5, 2 + 3);\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(5, 2*3),\n                       \"Value of: 2*3\\n\"\n                       \"  Actual: 6\\n\"\n                       \"Expected: 5\");\n}\n\n// Tests ASSERT_EQ(NULL, pointer).\n#if GTEST_CAN_COMPARE_NULL\nTEST(AssertionTest, ASSERT_EQ_NULL) {\n  // A success.\n  const char* p = NULL;\n  // Some older GCC versions may issue a spurious waring in this or the next\n  // assertion statement. This warning should not be suppressed with\n  // static_cast since the test verifies the ability to use bare NULL as the\n  // expected parameter to the macro.\n  ASSERT_EQ(NULL, p);\n\n  // A failure.\n  static int n = 0;\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(NULL, &n),\n                       \"Value of: &n\\n\");\n}\n#endif  // GTEST_CAN_COMPARE_NULL\n\n// Tests ASSERT_EQ(0, non_pointer).  Since the literal 0 can be\n// treated as a null pointer by the compiler, we need to make sure\n// that ASSERT_EQ(0, non_pointer) isn't interpreted by Google Test as\n// ASSERT_EQ(static_cast<void*>(NULL), non_pointer).\nTEST(ExpectTest, ASSERT_EQ_0) {\n  int n = 0;\n\n  // A success.\n  ASSERT_EQ(0, n);\n\n  // A failure.\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(0, 5.6),\n                       \"Expected: 0\");\n}\n\n// Tests ASSERT_NE.\nTEST(AssertionTest, ASSERT_NE) {\n  ASSERT_NE(6, 7);\n  EXPECT_FATAL_FAILURE(ASSERT_NE('a', 'a'),\n                       \"Expected: ('a') != ('a'), \"\n                       \"actual: 'a' (97, 0x61) vs 'a' (97, 0x61)\");\n}\n\n// Tests ASSERT_LE.\nTEST(AssertionTest, ASSERT_LE) {\n  ASSERT_LE(2, 3);\n  ASSERT_LE(2, 2);\n  EXPECT_FATAL_FAILURE(ASSERT_LE(2, 0),\n                       \"Expected: (2) <= (0), actual: 2 vs 0\");\n}\n\n// Tests ASSERT_LT.\nTEST(AssertionTest, ASSERT_LT) {\n  ASSERT_LT(2, 3);\n  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 2),\n                       \"Expected: (2) < (2), actual: 2 vs 2\");\n}\n\n// Tests ASSERT_GE.\nTEST(AssertionTest, ASSERT_GE) {\n  ASSERT_GE(2, 1);\n  ASSERT_GE(2, 2);\n  EXPECT_FATAL_FAILURE(ASSERT_GE(2, 3),\n                       \"Expected: (2) >= (3), actual: 2 vs 3\");\n}\n\n// Tests ASSERT_GT.\nTEST(AssertionTest, ASSERT_GT) {\n  ASSERT_GT(2, 1);\n  EXPECT_FATAL_FAILURE(ASSERT_GT(2, 2),\n                       \"Expected: (2) > (2), actual: 2 vs 2\");\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\nvoid ThrowNothing() {}\n\n// Tests ASSERT_THROW.\nTEST(AssertionTest, ASSERT_THROW) {\n  ASSERT_THROW(ThrowAnInteger(), int);\n\n#ifndef __BORLANDC__\n  // ICE's in C++Builder 2007 and 2009.\n  EXPECT_FATAL_FAILURE(\n      ASSERT_THROW(ThrowAnInteger(), bool),\n      \"Expected: ThrowAnInteger() throws an exception of type bool.\\n\"\n      \"  Actual: it throws a different type.\");\n#endif\n\n  EXPECT_FATAL_FAILURE(\n      ASSERT_THROW(ThrowNothing(), bool),\n      \"Expected: ThrowNothing() throws an exception of type bool.\\n\"\n      \"  Actual: it throws nothing.\");\n}\n\n// Tests ASSERT_NO_THROW.\nTEST(AssertionTest, ASSERT_NO_THROW) {\n  ASSERT_NO_THROW(ThrowNothing());\n  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()),\n                       \"Expected: ThrowAnInteger() doesn't throw an exception.\"\n                       \"\\n  Actual: it throws.\");\n}\n\n// Tests ASSERT_ANY_THROW.\nTEST(AssertionTest, ASSERT_ANY_THROW) {\n  ASSERT_ANY_THROW(ThrowAnInteger());\n  EXPECT_FATAL_FAILURE(\n      ASSERT_ANY_THROW(ThrowNothing()),\n      \"Expected: ThrowNothing() throws an exception.\\n\"\n      \"  Actual: it doesn't.\");\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// Makes sure we deal with the precedence of <<.  This test should\n// compile.\nTEST(AssertionTest, AssertPrecedence) {\n  ASSERT_EQ(1 < 2, true);\n  ASSERT_EQ(true && false, false);\n}\n\n// A subroutine used by the following test.\nvoid TestEq1(int x) {\n  ASSERT_EQ(1, x);\n}\n\n// Tests calling a test subroutine that's not part of a fixture.\nTEST(AssertionTest, NonFixtureSubroutine) {\n  EXPECT_FATAL_FAILURE(TestEq1(2),\n                       \"Value of: x\");\n}\n\n// An uncopyable class.\nclass Uncopyable {\n public:\n  explicit Uncopyable(int a_value) : value_(a_value) {}\n\n  int value() const { return value_; }\n  bool operator==(const Uncopyable& rhs) const {\n    return value() == rhs.value();\n  }\n private:\n  // This constructor deliberately has no implementation, as we don't\n  // want this class to be copyable.\n  Uncopyable(const Uncopyable&);  // NOLINT\n\n  int value_;\n};\n\n::std::ostream& operator<<(::std::ostream& os, const Uncopyable& value) {\n  return os << value.value();\n}\n\n\nbool IsPositiveUncopyable(const Uncopyable& x) {\n  return x.value() > 0;\n}\n\n// A subroutine used by the following test.\nvoid TestAssertNonPositive() {\n  Uncopyable y(-1);\n  ASSERT_PRED1(IsPositiveUncopyable, y);\n}\n// A subroutine used by the following test.\nvoid TestAssertEqualsUncopyable() {\n  Uncopyable x(5);\n  Uncopyable y(-1);\n  ASSERT_EQ(x, y);\n}\n\n// Tests that uncopyable objects can be used in assertions.\nTEST(AssertionTest, AssertWorksWithUncopyableObject) {\n  Uncopyable x(5);\n  ASSERT_PRED1(IsPositiveUncopyable, x);\n  ASSERT_EQ(x, x);\n  EXPECT_FATAL_FAILURE(TestAssertNonPositive(),\n    \"IsPositiveUncopyable(y) evaluates to false, where\\ny evaluates to -1\");\n  EXPECT_FATAL_FAILURE(TestAssertEqualsUncopyable(),\n    \"Value of: y\\n  Actual: -1\\nExpected: x\\nWhich is: 5\");\n}\n\n// Tests that uncopyable objects can be used in expects.\nTEST(AssertionTest, ExpectWorksWithUncopyableObject) {\n  Uncopyable x(5);\n  EXPECT_PRED1(IsPositiveUncopyable, x);\n  Uncopyable y(-1);\n  EXPECT_NONFATAL_FAILURE(EXPECT_PRED1(IsPositiveUncopyable, y),\n    \"IsPositiveUncopyable(y) evaluates to false, where\\ny evaluates to -1\");\n  EXPECT_EQ(x, x);\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y),\n    \"Value of: y\\n  Actual: -1\\nExpected: x\\nWhich is: 5\");\n}\n\n\n// The version of gcc used in XCode 2.2 has a bug and doesn't allow\n// anonymous enums in assertions.  Therefore the following test is not\n// done on Mac.\n// Sun Studio also rejects this code.\n#if !GTEST_OS_MAC && !defined(__SUNPRO_CC)\n\n// Tests using assertions with anonymous enums.\nenum {\n  CASE_A = -1,\n#if GTEST_OS_LINUX\n  // We want to test the case where the size of the anonymous enum is\n  // larger than sizeof(int), to make sure our implementation of the\n  // assertions doesn't truncate the enums.  However, MSVC\n  // (incorrectly) doesn't allow an enum value to exceed the range of\n  // an int, so this has to be conditionally compiled.\n  //\n  // On Linux, CASE_B and CASE_A have the same value when truncated to\n  // int size.  We want to test whether this will confuse the\n  // assertions.\n  CASE_B = testing::internal::kMaxBiggestInt,\n#else\n  CASE_B = INT_MAX,\n#endif  // GTEST_OS_LINUX\n};\n\nTEST(AssertionTest, AnonymousEnum) {\n#if GTEST_OS_LINUX\n  EXPECT_EQ(static_cast<int>(CASE_A), static_cast<int>(CASE_B));\n#endif  // GTEST_OS_LINUX\n\n  EXPECT_EQ(CASE_A, CASE_A);\n  EXPECT_NE(CASE_A, CASE_B);\n  EXPECT_LT(CASE_A, CASE_B);\n  EXPECT_LE(CASE_A, CASE_B);\n  EXPECT_GT(CASE_B, CASE_A);\n  EXPECT_GE(CASE_A, CASE_A);\n  EXPECT_NONFATAL_FAILURE(EXPECT_GE(CASE_A, CASE_B),\n                          \"(CASE_A) >= (CASE_B)\");\n\n  ASSERT_EQ(CASE_A, CASE_A);\n  ASSERT_NE(CASE_A, CASE_B);\n  ASSERT_LT(CASE_A, CASE_B);\n  ASSERT_LE(CASE_A, CASE_B);\n  ASSERT_GT(CASE_B, CASE_A);\n  ASSERT_GE(CASE_A, CASE_A);\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(CASE_A, CASE_B),\n                       \"Value of: CASE_B\");\n}\n\n#endif  // !GTEST_OS_MAC && !defined(__SUNPRO_CC)\n\n#if GTEST_OS_WINDOWS\n\nstatic HRESULT UnexpectedHRESULTFailure() {\n  return E_UNEXPECTED;\n}\n\nstatic HRESULT OkHRESULTSuccess() {\n  return S_OK;\n}\n\nstatic HRESULT FalseHRESULTSuccess() {\n  return S_FALSE;\n}\n\n// HRESULT assertion tests test both zero and non-zero\n// success codes as well as failure message for each.\n//\n// Windows CE doesn't support message texts.\nTEST(HRESULTAssertionTest, EXPECT_HRESULT_SUCCEEDED) {\n  EXPECT_HRESULT_SUCCEEDED(S_OK);\n  EXPECT_HRESULT_SUCCEEDED(S_FALSE);\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),\n    \"Expected: (UnexpectedHRESULTFailure()) succeeds.\\n\"\n    \"  Actual: 0x8000FFFF\");\n}\n\nTEST(HRESULTAssertionTest, ASSERT_HRESULT_SUCCEEDED) {\n  ASSERT_HRESULT_SUCCEEDED(S_OK);\n  ASSERT_HRESULT_SUCCEEDED(S_FALSE);\n\n  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),\n    \"Expected: (UnexpectedHRESULTFailure()) succeeds.\\n\"\n    \"  Actual: 0x8000FFFF\");\n}\n\nTEST(HRESULTAssertionTest, EXPECT_HRESULT_FAILED) {\n  EXPECT_HRESULT_FAILED(E_UNEXPECTED);\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(OkHRESULTSuccess()),\n    \"Expected: (OkHRESULTSuccess()) fails.\\n\"\n    \"  Actual: 0x00000000\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(FalseHRESULTSuccess()),\n    \"Expected: (FalseHRESULTSuccess()) fails.\\n\"\n    \"  Actual: 0x00000001\");\n}\n\nTEST(HRESULTAssertionTest, ASSERT_HRESULT_FAILED) {\n  ASSERT_HRESULT_FAILED(E_UNEXPECTED);\n\n#ifndef __BORLANDC__\n  // ICE's in C++Builder 2007 and 2009.\n  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(OkHRESULTSuccess()),\n    \"Expected: (OkHRESULTSuccess()) fails.\\n\"\n    \"  Actual: 0x00000000\");\n#endif\n  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(FalseHRESULTSuccess()),\n    \"Expected: (FalseHRESULTSuccess()) fails.\\n\"\n    \"  Actual: 0x00000001\");\n}\n\n// Tests that streaming to the HRESULT macros works.\nTEST(HRESULTAssertionTest, Streaming) {\n  EXPECT_HRESULT_SUCCEEDED(S_OK) << \"unexpected failure\";\n  ASSERT_HRESULT_SUCCEEDED(S_OK) << \"unexpected failure\";\n  EXPECT_HRESULT_FAILED(E_UNEXPECTED) << \"unexpected failure\";\n  ASSERT_HRESULT_FAILED(E_UNEXPECTED) << \"unexpected failure\";\n\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_HRESULT_SUCCEEDED(E_UNEXPECTED) << \"expected failure\",\n      \"expected failure\");\n\n#ifndef __BORLANDC__\n  // ICE's in C++Builder 2007 and 2009.\n  EXPECT_FATAL_FAILURE(\n      ASSERT_HRESULT_SUCCEEDED(E_UNEXPECTED) << \"expected failure\",\n      \"expected failure\");\n#endif\n\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_HRESULT_FAILED(S_OK) << \"expected failure\",\n      \"expected failure\");\n\n  EXPECT_FATAL_FAILURE(\n      ASSERT_HRESULT_FAILED(S_OK) << \"expected failure\",\n      \"expected failure\");\n}\n\n#endif  // GTEST_OS_WINDOWS\n\n#ifdef __BORLANDC__\n// Silences warnings: \"Condition is always true\", \"Unreachable code\"\n#pragma option push -w-ccc -w-rch\n#endif\n\n// Tests that the assertion macros behave like single statements.\nTEST(AssertionSyntaxTest, BasicAssertionsBehavesLikeSingleStatement) {\n  if (AlwaysFalse())\n    ASSERT_TRUE(false) << \"This should never be executed; \"\n                          \"It's a compilation test only.\";\n\n  if (AlwaysTrue())\n    EXPECT_FALSE(false);\n  else\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    ASSERT_LT(1, 3);\n\n  if (AlwaysFalse())\n    ;  // NOLINT\n  else\n    EXPECT_GT(3, 2) << \"\";\n}\n\n#if GTEST_HAS_EXCEPTIONS\n// Tests that the compiler will not complain about unreachable code in the\n// EXPECT_THROW/EXPECT_ANY_THROW/EXPECT_NO_THROW macros.\nTEST(ExpectThrowTest, DoesNotGenerateUnreachableCodeWarning) {\n  int n = 0;\n\n  EXPECT_THROW(throw 1, int);\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(n++, int), \"\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(throw 1, const char*), \"\");\n  EXPECT_NO_THROW(n++);\n  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(throw 1), \"\");\n  EXPECT_ANY_THROW(throw 1);\n  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(n++), \"\");\n}\n\nTEST(AssertionSyntaxTest, ExceptionAssertionsBehavesLikeSingleStatement) {\n  if (AlwaysFalse())\n    EXPECT_THROW(ThrowNothing(), bool);\n\n  if (AlwaysTrue())\n    EXPECT_THROW(ThrowAnInteger(), int);\n  else\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    EXPECT_NO_THROW(ThrowAnInteger());\n\n  if (AlwaysTrue())\n    EXPECT_NO_THROW(ThrowNothing());\n  else\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    EXPECT_ANY_THROW(ThrowNothing());\n\n  if (AlwaysTrue())\n    EXPECT_ANY_THROW(ThrowAnInteger());\n  else\n    ;  // NOLINT\n}\n#endif  // GTEST_HAS_EXCEPTIONS\n\nTEST(AssertionSyntaxTest, NoFatalFailureAssertionsBehavesLikeSingleStatement) {\n  if (AlwaysFalse())\n    EXPECT_NO_FATAL_FAILURE(FAIL()) << \"This should never be executed. \"\n                                    << \"It's a compilation test only.\";\n  else\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    ASSERT_NO_FATAL_FAILURE(FAIL()) << \"\";\n  else\n    ;  // NOLINT\n\n  if (AlwaysTrue())\n    EXPECT_NO_FATAL_FAILURE(SUCCEED());\n  else\n    ;  // NOLINT\n\n  if (AlwaysFalse())\n    ;  // NOLINT\n  else\n    ASSERT_NO_FATAL_FAILURE(SUCCEED());\n}\n\n// Tests that the assertion macros work well with switch statements.\nTEST(AssertionSyntaxTest, WorksWithSwitch) {\n  switch (0) {\n    case 1:\n      break;\n    default:\n      ASSERT_TRUE(true);\n  }\n\n  switch (0)\n    case 0:\n      EXPECT_FALSE(false) << \"EXPECT_FALSE failed in switch case\";\n\n  // Binary assertions are implemented using a different code path\n  // than the Boolean assertions.  Hence we test them separately.\n  switch (0) {\n    case 1:\n    default:\n      ASSERT_EQ(1, 1) << \"ASSERT_EQ failed in default switch handler\";\n  }\n\n  switch (0)\n    case 0:\n      EXPECT_NE(1, 2);\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\nvoid ThrowAString() {\n    throw \"String\";\n}\n\n// Test that the exception assertion macros compile and work with const\n// type qualifier.\nTEST(AssertionSyntaxTest, WorksWithConst) {\n    ASSERT_THROW(ThrowAString(), const char*);\n\n    EXPECT_THROW(ThrowAString(), const char*);\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n}  // namespace\n\nnamespace testing {\n\n// Tests that Google Test tracks SUCCEED*.\nTEST(SuccessfulAssertionTest, SUCCEED) {\n  SUCCEED();\n  SUCCEED() << \"OK\";\n  EXPECT_EQ(2, GetUnitTestImpl()->current_test_result()->total_part_count());\n}\n\n// Tests that Google Test doesn't track successful EXPECT_*.\nTEST(SuccessfulAssertionTest, EXPECT) {\n  EXPECT_TRUE(true);\n  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());\n}\n\n// Tests that Google Test doesn't track successful EXPECT_STR*.\nTEST(SuccessfulAssertionTest, EXPECT_STR) {\n  EXPECT_STREQ(\"\", \"\");\n  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());\n}\n\n// Tests that Google Test doesn't track successful ASSERT_*.\nTEST(SuccessfulAssertionTest, ASSERT) {\n  ASSERT_TRUE(true);\n  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());\n}\n\n// Tests that Google Test doesn't track successful ASSERT_STR*.\nTEST(SuccessfulAssertionTest, ASSERT_STR) {\n  ASSERT_STREQ(\"\", \"\");\n  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());\n}\n\n}  // namespace testing\n\nnamespace {\n\n// Tests EXPECT_TRUE.\nTEST(ExpectTest, EXPECT_TRUE) {\n  EXPECT_TRUE(2 > 1);  // NOLINT\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 < 1),\n                          \"Value of: 2 < 1\\n\"\n                          \"  Actual: false\\n\"\n                          \"Expected: true\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 > 3),\n                          \"2 > 3\");\n}\n\n// Tests EXPECT_TRUE(predicate) for predicates returning AssertionResult.\nTEST(ExpectTest, ExpectTrueWithAssertionResult) {\n  EXPECT_TRUE(ResultIsEven(2));\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEven(3)),\n                          \"Value of: ResultIsEven(3)\\n\"\n                          \"  Actual: false (3 is odd)\\n\"\n                          \"Expected: true\");\n  EXPECT_TRUE(ResultIsEvenNoExplanation(2));\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEvenNoExplanation(3)),\n                          \"Value of: ResultIsEvenNoExplanation(3)\\n\"\n                          \"  Actual: false (3 is odd)\\n\"\n                          \"Expected: true\");\n}\n\n// Tests EXPECT_FALSE.\nTEST(ExpectTest, EXPECT_FALSE) {\n  EXPECT_FALSE(2 < 1);  // NOLINT\n  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 > 1),\n                          \"Value of: 2 > 1\\n\"\n                          \"  Actual: true\\n\"\n                          \"Expected: false\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 < 3),\n                          \"2 < 3\");\n}\n\n// Tests EXPECT_FALSE(predicate) for predicates returning AssertionResult.\nTEST(ExpectTest, ExpectFalseWithAssertionResult) {\n  EXPECT_FALSE(ResultIsEven(3));\n  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEven(2)),\n                          \"Value of: ResultIsEven(2)\\n\"\n                          \"  Actual: true (2 is even)\\n\"\n                          \"Expected: false\");\n  EXPECT_FALSE(ResultIsEvenNoExplanation(3));\n  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEvenNoExplanation(2)),\n                          \"Value of: ResultIsEvenNoExplanation(2)\\n\"\n                          \"  Actual: true\\n\"\n                          \"Expected: false\");\n}\n\n#ifdef __BORLANDC__\n// Restores warnings after previous \"#pragma option push\" supressed them\n#pragma option pop\n#endif\n\n// Tests EXPECT_EQ.\nTEST(ExpectTest, EXPECT_EQ) {\n  EXPECT_EQ(5, 2 + 3);\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2*3),\n                          \"Value of: 2*3\\n\"\n                          \"  Actual: 6\\n\"\n                          \"Expected: 5\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2 - 3),\n                          \"2 - 3\");\n}\n\n// Tests using EXPECT_EQ on double values.  The purpose is to make\n// sure that the specialization we did for integer and anonymous enums\n// isn't used for double arguments.\nTEST(ExpectTest, EXPECT_EQ_Double) {\n  // A success.\n  EXPECT_EQ(5.6, 5.6);\n\n  // A failure.\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5.1, 5.2),\n                          \"5.1\");\n}\n\n#if GTEST_CAN_COMPARE_NULL\n// Tests EXPECT_EQ(NULL, pointer).\nTEST(ExpectTest, EXPECT_EQ_NULL) {\n  // A success.\n  const char* p = NULL;\n  // Some older GCC versions may issue a spurious waring in this or the next\n  // assertion statement. This warning should not be suppressed with\n  // static_cast since the test verifies the ability to use bare NULL as the\n  // expected parameter to the macro.\n  EXPECT_EQ(NULL, p);\n\n  // A failure.\n  int n = 0;\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(NULL, &n),\n                          \"Value of: &n\\n\");\n}\n#endif  // GTEST_CAN_COMPARE_NULL\n\n// Tests EXPECT_EQ(0, non_pointer).  Since the literal 0 can be\n// treated as a null pointer by the compiler, we need to make sure\n// that EXPECT_EQ(0, non_pointer) isn't interpreted by Google Test as\n// EXPECT_EQ(static_cast<void*>(NULL), non_pointer).\nTEST(ExpectTest, EXPECT_EQ_0) {\n  int n = 0;\n\n  // A success.\n  EXPECT_EQ(0, n);\n\n  // A failure.\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(0, 5.6),\n                          \"Expected: 0\");\n}\n\n// Tests EXPECT_NE.\nTEST(ExpectTest, EXPECT_NE) {\n  EXPECT_NE(6, 7);\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_NE('a', 'a'),\n                          \"Expected: ('a') != ('a'), \"\n                          \"actual: 'a' (97, 0x61) vs 'a' (97, 0x61)\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_NE(2, 2),\n                          \"2\");\n  char* const p0 = NULL;\n  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p0, p0),\n                          \"p0\");\n  // Only way to get the Nokia compiler to compile the cast\n  // is to have a separate void* variable first. Putting\n  // the two casts on the same line doesn't work, neither does\n  // a direct C-style to char*.\n  void* pv1 = (void*)0x1234;  // NOLINT\n  char* const p1 = reinterpret_cast<char*>(pv1);\n  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p1, p1),\n                          \"p1\");\n}\n\n// Tests EXPECT_LE.\nTEST(ExpectTest, EXPECT_LE) {\n  EXPECT_LE(2, 3);\n  EXPECT_LE(2, 2);\n  EXPECT_NONFATAL_FAILURE(EXPECT_LE(2, 0),\n                          \"Expected: (2) <= (0), actual: 2 vs 0\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_LE(1.1, 0.9),\n                          \"(1.1) <= (0.9)\");\n}\n\n// Tests EXPECT_LT.\nTEST(ExpectTest, EXPECT_LT) {\n  EXPECT_LT(2, 3);\n  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 2),\n                          \"Expected: (2) < (2), actual: 2 vs 2\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1),\n                          \"(2) < (1)\");\n}\n\n// Tests EXPECT_GE.\nTEST(ExpectTest, EXPECT_GE) {\n  EXPECT_GE(2, 1);\n  EXPECT_GE(2, 2);\n  EXPECT_NONFATAL_FAILURE(EXPECT_GE(2, 3),\n                          \"Expected: (2) >= (3), actual: 2 vs 3\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_GE(0.9, 1.1),\n                          \"(0.9) >= (1.1)\");\n}\n\n// Tests EXPECT_GT.\nTEST(ExpectTest, EXPECT_GT) {\n  EXPECT_GT(2, 1);\n  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 2),\n                          \"Expected: (2) > (2), actual: 2 vs 2\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 3),\n                          \"(2) > (3)\");\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\n// Tests EXPECT_THROW.\nTEST(ExpectTest, EXPECT_THROW) {\n  EXPECT_THROW(ThrowAnInteger(), int);\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool),\n                          \"Expected: ThrowAnInteger() throws an exception of \"\n                          \"type bool.\\n  Actual: it throws a different type.\");\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_THROW(ThrowNothing(), bool),\n      \"Expected: ThrowNothing() throws an exception of type bool.\\n\"\n      \"  Actual: it throws nothing.\");\n}\n\n// Tests EXPECT_NO_THROW.\nTEST(ExpectTest, EXPECT_NO_THROW) {\n  EXPECT_NO_THROW(ThrowNothing());\n  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()),\n                          \"Expected: ThrowAnInteger() doesn't throw an \"\n                          \"exception.\\n  Actual: it throws.\");\n}\n\n// Tests EXPECT_ANY_THROW.\nTEST(ExpectTest, EXPECT_ANY_THROW) {\n  EXPECT_ANY_THROW(ThrowAnInteger());\n  EXPECT_NONFATAL_FAILURE(\n      EXPECT_ANY_THROW(ThrowNothing()),\n      \"Expected: ThrowNothing() throws an exception.\\n\"\n      \"  Actual: it doesn't.\");\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// Make sure we deal with the precedence of <<.\nTEST(ExpectTest, ExpectPrecedence) {\n  EXPECT_EQ(1 < 2, true);\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(true, true && false),\n                          \"Value of: true && false\");\n}\n\n\n// Tests the StreamableToString() function.\n\n// Tests using StreamableToString() on a scalar.\nTEST(StreamableToStringTest, Scalar) {\n  EXPECT_STREQ(\"5\", StreamableToString(5).c_str());\n}\n\n// Tests using StreamableToString() on a non-char pointer.\nTEST(StreamableToStringTest, Pointer) {\n  int n = 0;\n  int* p = &n;\n  EXPECT_STRNE(\"(null)\", StreamableToString(p).c_str());\n}\n\n// Tests using StreamableToString() on a NULL non-char pointer.\nTEST(StreamableToStringTest, NullPointer) {\n  int* p = NULL;\n  EXPECT_STREQ(\"(null)\", StreamableToString(p).c_str());\n}\n\n// Tests using StreamableToString() on a C string.\nTEST(StreamableToStringTest, CString) {\n  EXPECT_STREQ(\"Foo\", StreamableToString(\"Foo\").c_str());\n}\n\n// Tests using StreamableToString() on a NULL C string.\nTEST(StreamableToStringTest, NullCString) {\n  char* p = NULL;\n  EXPECT_STREQ(\"(null)\", StreamableToString(p).c_str());\n}\n\n// Tests using streamable values as assertion messages.\n\n// Tests using std::string as an assertion message.\nTEST(StreamableTest, string) {\n  static const std::string str(\n      \"This failure message is a std::string, and is expected.\");\n  EXPECT_FATAL_FAILURE(FAIL() << str,\n                       str.c_str());\n}\n\n// Tests that we can output strings containing embedded NULs.\n// Limited to Linux because we can only do this with std::string's.\nTEST(StreamableTest, stringWithEmbeddedNUL) {\n  static const char char_array_with_nul[] =\n      \"Here's a NUL\\0 and some more string\";\n  static const std::string string_with_nul(char_array_with_nul,\n                                           sizeof(char_array_with_nul)\n                                           - 1);  // drops the trailing NUL\n  EXPECT_FATAL_FAILURE(FAIL() << string_with_nul,\n                       \"Here's a NUL\\\\0 and some more string\");\n}\n\n// Tests that we can output a NUL char.\nTEST(StreamableTest, NULChar) {\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    FAIL() << \"A NUL\" << '\\0' << \" and some more string\";\n  }, \"A NUL\\\\0 and some more string\");\n}\n\n// Tests using int as an assertion message.\nTEST(StreamableTest, int) {\n  EXPECT_FATAL_FAILURE(FAIL() << 900913,\n                       \"900913\");\n}\n\n// Tests using NULL char pointer as an assertion message.\n//\n// In MSVC, streaming a NULL char * causes access violation.  Google Test\n// implemented a workaround (substituting \"(null)\" for NULL).  This\n// tests whether the workaround works.\nTEST(StreamableTest, NullCharPtr) {\n  EXPECT_FATAL_FAILURE(FAIL() << static_cast<const char*>(NULL),\n                       \"(null)\");\n}\n\n// Tests that basic IO manipulators (endl, ends, and flush) can be\n// streamed to testing::Message.\nTEST(StreamableTest, BasicIoManip) {\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    FAIL() << \"Line 1.\" << std::endl\n           << \"A NUL char \" << std::ends << std::flush << \" in line 2.\";\n  }, \"Line 1.\\nA NUL char \\\\0 in line 2.\");\n}\n\n// Tests the macros that haven't been covered so far.\n\nvoid AddFailureHelper(bool* aborted) {\n  *aborted = true;\n  ADD_FAILURE() << \"Failure\";\n  *aborted = false;\n}\n\n// Tests ADD_FAILURE.\nTEST(MacroTest, ADD_FAILURE) {\n  bool aborted = true;\n  EXPECT_NONFATAL_FAILURE(AddFailureHelper(&aborted),\n                          \"Failure\");\n  EXPECT_FALSE(aborted);\n}\n\n// Tests FAIL.\nTEST(MacroTest, FAIL) {\n  EXPECT_FATAL_FAILURE(FAIL(),\n                       \"Failed\");\n  EXPECT_FATAL_FAILURE(FAIL() << \"Intentional failure.\",\n                       \"Intentional failure.\");\n}\n\n// Tests SUCCEED\nTEST(MacroTest, SUCCEED) {\n  SUCCEED();\n  SUCCEED() << \"Explicit success.\";\n}\n\n\n// Tests for EXPECT_EQ() and ASSERT_EQ().\n//\n// These tests fail *intentionally*, s.t. the failure messages can be\n// generated and tested.\n//\n// We have different tests for different argument types.\n\n// Tests using bool values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, Bool) {\n  EXPECT_EQ(true,  true);\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(false, true),\n                       \"Value of: true\");\n}\n\n// Tests using int values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, Int) {\n  ASSERT_EQ(32, 32);\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(32, 33),\n                          \"33\");\n}\n\n// Tests using time_t values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, Time_T) {\n  EXPECT_EQ(static_cast<time_t>(0),\n            static_cast<time_t>(0));\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<time_t>(0),\n                                 static_cast<time_t>(1234)),\n                       \"1234\");\n}\n\n// Tests using char values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, Char) {\n  ASSERT_EQ('z', 'z');\n  const char ch = 'b';\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('\\0', ch),\n                          \"ch\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('a', ch),\n                          \"ch\");\n}\n\n// Tests using wchar_t values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, WideChar) {\n  EXPECT_EQ(L'b', L'b');\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'\\0', L'x'),\n                          \"Value of: L'x'\\n\"\n                          \"  Actual: L'x' (120, 0x78)\\n\"\n                          \"Expected: L'\\0'\\n\"\n                          \"Which is: L'\\0' (0, 0x0)\");\n\n  static wchar_t wchar;\n  wchar = L'b';\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'a', wchar),\n                          \"wchar\");\n  wchar = L'\\x8119';\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(L'\\x8120', wchar),\n                       \"Value of: wchar\");\n}\n\n// Tests using ::std::string values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, StdString) {\n  // Compares a const char* to an std::string that has identical\n  // content.\n  ASSERT_EQ(\"Test\", ::std::string(\"Test\"));\n\n  // Compares two identical std::strings.\n  static const ::std::string str1(\"A * in the middle\");\n  static const ::std::string str2(str1);\n  EXPECT_EQ(str1, str2);\n\n  // Compares a const char* to an std::string that has different\n  // content\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(\"Test\", ::std::string(\"test\")),\n                          \"::std::string(\\\"test\\\")\");\n\n  // Compares an std::string to a char* that has different content.\n  char* const p1 = const_cast<char*>(\"foo\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::std::string(\"bar\"), p1),\n                          \"p1\");\n\n  // Compares two std::strings that have different contents, one of\n  // which having a NUL character in the middle.  This should fail.\n  static ::std::string str3(str1);\n  str3.at(2) = '\\0';\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(str1, str3),\n                       \"Value of: str3\\n\"\n                       \"  Actual: \\\"A \\\\0 in the middle\\\"\");\n}\n\n#if GTEST_HAS_STD_WSTRING\n\n// Tests using ::std::wstring values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, StdWideString) {\n  // Compares an std::wstring to a const wchar_t* that has identical\n  // content.\n  EXPECT_EQ(::std::wstring(L\"Test\\x8119\"), L\"Test\\x8119\");\n\n  // Compares two identical std::wstrings.\n  const ::std::wstring wstr1(L\"A * in the middle\");\n  const ::std::wstring wstr2(wstr1);\n  ASSERT_EQ(wstr1, wstr2);\n\n  // Compares an std::wstring to a const wchar_t* that has different\n  // content.\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_EQ(::std::wstring(L\"Test\\x8119\"), L\"Test\\x8120\");\n  }, \"L\\\"Test\\\\x8120\\\"\");\n\n  // Compares two std::wstrings that have different contents, one of\n  // which having a NUL character in the middle.\n  ::std::wstring wstr3(wstr1);\n  wstr3.at(2) = L'\\0';\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(wstr1, wstr3),\n                          \"wstr3\");\n\n  // Compares a wchar_t* to an std::wstring that has different\n  // content.\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_EQ(const_cast<wchar_t*>(L\"foo\"), ::std::wstring(L\"bar\"));\n  }, \"\");\n}\n\n#endif  // GTEST_HAS_STD_WSTRING\n\n#if GTEST_HAS_GLOBAL_STRING\n// Tests using ::string values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, GlobalString) {\n  // Compares a const char* to a ::string that has identical content.\n  EXPECT_EQ(\"Test\", ::string(\"Test\"));\n\n  // Compares two identical ::strings.\n  const ::string str1(\"A * in the middle\");\n  const ::string str2(str1);\n  ASSERT_EQ(str1, str2);\n\n  // Compares a ::string to a const char* that has different content.\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::string(\"Test\"), \"test\"),\n                          \"test\");\n\n  // Compares two ::strings that have different contents, one of which\n  // having a NUL character in the middle.\n  ::string str3(str1);\n  str3.at(2) = '\\0';\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(str1, str3),\n                          \"str3\");\n\n  // Compares a ::string to a char* that has different content.\n  EXPECT_FATAL_FAILURE({  // NOLINT\n    ASSERT_EQ(::string(\"bar\"), const_cast<char*>(\"foo\"));\n  }, \"\");\n}\n\n#endif  // GTEST_HAS_GLOBAL_STRING\n\n#if GTEST_HAS_GLOBAL_WSTRING\n\n// Tests using ::wstring values in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, GlobalWideString) {\n  // Compares a const wchar_t* to a ::wstring that has identical content.\n  ASSERT_EQ(L\"Test\\x8119\", ::wstring(L\"Test\\x8119\"));\n\n  // Compares two identical ::wstrings.\n  static const ::wstring wstr1(L\"A * in the middle\");\n  static const ::wstring wstr2(wstr1);\n  EXPECT_EQ(wstr1, wstr2);\n\n  // Compares a const wchar_t* to a ::wstring that has different\n  // content.\n  EXPECT_NONFATAL_FAILURE({  // NOLINT\n    EXPECT_EQ(L\"Test\\x8120\", ::wstring(L\"Test\\x8119\"));\n  }, \"Test\\\\x8119\");\n\n  // Compares a wchar_t* to a ::wstring that has different content.\n  wchar_t* const p1 = const_cast<wchar_t*>(L\"foo\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, ::wstring(L\"bar\")),\n                          \"bar\");\n\n  // Compares two ::wstrings that have different contents, one of which\n  // having a NUL character in the middle.\n  static ::wstring wstr3;\n  wstr3 = wstr1;\n  wstr3.at(2) = L'\\0';\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(wstr1, wstr3),\n                       \"wstr3\");\n}\n\n#endif  // GTEST_HAS_GLOBAL_WSTRING\n\n// Tests using char pointers in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, CharPointer) {\n  char* const p0 = NULL;\n  // Only way to get the Nokia compiler to compile the cast\n  // is to have a separate void* variable first. Putting\n  // the two casts on the same line doesn't work, neither does\n  // a direct C-style to char*.\n  void* pv1 = (void*)0x1234;  // NOLINT\n  void* pv2 = (void*)0xABC0;  // NOLINT\n  char* const p1 = reinterpret_cast<char*>(pv1);\n  char* const p2 = reinterpret_cast<char*>(pv2);\n  ASSERT_EQ(p1, p1);\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),\n                          \"Value of: p2\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),\n                          \"p2\");\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(reinterpret_cast<char*>(0x1234),\n                                 reinterpret_cast<char*>(0xABC0)),\n                       \"ABC0\");\n}\n\n// Tests using wchar_t pointers in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, WideCharPointer) {\n  wchar_t* const p0 = NULL;\n  // Only way to get the Nokia compiler to compile the cast\n  // is to have a separate void* variable first. Putting\n  // the two casts on the same line doesn't work, neither does\n  // a direct C-style to char*.\n  void* pv1 = (void*)0x1234;  // NOLINT\n  void* pv2 = (void*)0xABC0;  // NOLINT\n  wchar_t* const p1 = reinterpret_cast<wchar_t*>(pv1);\n  wchar_t* const p2 = reinterpret_cast<wchar_t*>(pv2);\n  EXPECT_EQ(p0, p0);\n\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),\n                          \"Value of: p2\");\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),\n                          \"p2\");\n  void* pv3 = (void*)0x1234;  // NOLINT\n  void* pv4 = (void*)0xABC0;  // NOLINT\n  const wchar_t* p3 = reinterpret_cast<const wchar_t*>(pv3);\n  const wchar_t* p4 = reinterpret_cast<const wchar_t*>(pv4);\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p3, p4),\n                          \"p4\");\n}\n\n// Tests using other types of pointers in {EXPECT|ASSERT}_EQ.\nTEST(EqAssertionTest, OtherPointer) {\n  ASSERT_EQ(static_cast<const int*>(NULL),\n            static_cast<const int*>(NULL));\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<const int*>(NULL),\n                                 reinterpret_cast<const int*>(0x1234)),\n                       \"0x1234\");\n}\n\n// Tests the FRIEND_TEST macro.\n\n// This class has a private member we want to test.  We will test it\n// both in a TEST and in a TEST_F.\nclass Foo {\n public:\n  Foo() {}\n\n private:\n  int Bar() const { return 1; }\n\n  // Declares the friend tests that can access the private member\n  // Bar().\n  FRIEND_TEST(FRIEND_TEST_Test, TEST);\n  FRIEND_TEST(FRIEND_TEST_Test2, TEST_F);\n};\n\n// Tests that the FRIEND_TEST declaration allows a TEST to access a\n// class's private members.  This should compile.\nTEST(FRIEND_TEST_Test, TEST) {\n  ASSERT_EQ(1, Foo().Bar());\n}\n\n// The fixture needed to test using FRIEND_TEST with TEST_F.\nclass FRIEND_TEST_Test2 : public Test {\n protected:\n  Foo foo;\n};\n\n// Tests that the FRIEND_TEST declaration allows a TEST_F to access a\n// class's private members.  This should compile.\nTEST_F(FRIEND_TEST_Test2, TEST_F) {\n  ASSERT_EQ(1, foo.Bar());\n}\n\n// Tests the life cycle of Test objects.\n\n// The test fixture for testing the life cycle of Test objects.\n//\n// This class counts the number of live test objects that uses this\n// fixture.\nclass TestLifeCycleTest : public Test {\n protected:\n  // Constructor.  Increments the number of test objects that uses\n  // this fixture.\n  TestLifeCycleTest() { count_++; }\n\n  // Destructor.  Decrements the number of test objects that uses this\n  // fixture.\n  ~TestLifeCycleTest() { count_--; }\n\n  // Returns the number of live test objects that uses this fixture.\n  int count() const { return count_; }\n\n private:\n  static int count_;\n};\n\nint TestLifeCycleTest::count_ = 0;\n\n// Tests the life cycle of test objects.\nTEST_F(TestLifeCycleTest, Test1) {\n  // There should be only one test object in this test case that's\n  // currently alive.\n  ASSERT_EQ(1, count());\n}\n\n// Tests the life cycle of test objects.\nTEST_F(TestLifeCycleTest, Test2) {\n  // After Test1 is done and Test2 is started, there should still be\n  // only one live test object, as the object for Test1 should've been\n  // deleted.\n  ASSERT_EQ(1, count());\n}\n\n}  // namespace\n\n// Tests that the copy constructor works when it is NOT optimized away by\n// the compiler.\nTEST(AssertionResultTest, CopyConstructorWorksWhenNotOptimied) {\n  // Checks that the copy constructor doesn't try to dereference NULL pointers\n  // in the source object.\n  AssertionResult r1 = AssertionSuccess();\n  AssertionResult r2 = r1;\n  // The following line is added to prevent the compiler from optimizing\n  // away the constructor call.\n  r1 << \"abc\";\n\n  AssertionResult r3 = r1;\n  EXPECT_EQ(static_cast<bool>(r3), static_cast<bool>(r1));\n  EXPECT_STREQ(\"abc\", r1.message());\n}\n\n// Tests that AssertionSuccess and AssertionFailure construct\n// AssertionResult objects as expected.\nTEST(AssertionResultTest, ConstructionWorks) {\n  AssertionResult r1 = AssertionSuccess();\n  EXPECT_TRUE(r1);\n  EXPECT_STREQ(\"\", r1.message());\n\n  AssertionResult r2 = AssertionSuccess() << \"abc\";\n  EXPECT_TRUE(r2);\n  EXPECT_STREQ(\"abc\", r2.message());\n\n  AssertionResult r3 = AssertionFailure();\n  EXPECT_FALSE(r3);\n  EXPECT_STREQ(\"\", r3.message());\n\n  AssertionResult r4 = AssertionFailure() << \"def\";\n  EXPECT_FALSE(r4);\n  EXPECT_STREQ(\"def\", r4.message());\n\n  AssertionResult r5 = AssertionFailure(Message() << \"ghi\");\n  EXPECT_FALSE(r5);\n  EXPECT_STREQ(\"ghi\", r5.message());\n}\n\n// Tests that the negation fips the predicate result but keeps the message.\nTEST(AssertionResultTest, NegationWorks) {\n  AssertionResult r1 = AssertionSuccess() << \"abc\";\n  EXPECT_FALSE(!r1);\n  EXPECT_STREQ(\"abc\", (!r1).message());\n\n  AssertionResult r2 = AssertionFailure() << \"def\";\n  EXPECT_TRUE(!r2);\n  EXPECT_STREQ(\"def\", (!r2).message());\n}\n\nTEST(AssertionResultTest, StreamingWorks) {\n  AssertionResult r = AssertionSuccess();\n  r << \"abc\" << 'd' << 0 << true;\n  EXPECT_STREQ(\"abcd0true\", r.message());\n}\n\n// Tests streaming a user type whose definition and operator << are\n// both in the global namespace.\nclass Base {\n public:\n  explicit Base(int an_x) : x_(an_x) {}\n  int x() const { return x_; }\n private:\n  int x_;\n};\nstd::ostream& operator<<(std::ostream& os,\n                         const Base& val) {\n  return os << val.x();\n}\nstd::ostream& operator<<(std::ostream& os,\n                         const Base* pointer) {\n  return os << \"(\" << pointer->x() << \")\";\n}\n\nTEST(MessageTest, CanStreamUserTypeInGlobalNameSpace) {\n  Message msg;\n  Base a(1);\n\n  msg << a << &a;  // Uses ::operator<<.\n  EXPECT_STREQ(\"1(1)\", msg.GetString().c_str());\n}\n\n// Tests streaming a user type whose definition and operator<< are\n// both in an unnamed namespace.\nnamespace {\nclass MyTypeInUnnamedNameSpace : public Base {\n public:\n  explicit MyTypeInUnnamedNameSpace(int an_x): Base(an_x) {}\n};\nstd::ostream& operator<<(std::ostream& os,\n                         const MyTypeInUnnamedNameSpace& val) {\n  return os << val.x();\n}\nstd::ostream& operator<<(std::ostream& os,\n                         const MyTypeInUnnamedNameSpace* pointer) {\n  return os << \"(\" << pointer->x() << \")\";\n}\n}  // namespace\n\nTEST(MessageTest, CanStreamUserTypeInUnnamedNameSpace) {\n  Message msg;\n  MyTypeInUnnamedNameSpace a(1);\n\n  msg << a << &a;  // Uses <unnamed_namespace>::operator<<.\n  EXPECT_STREQ(\"1(1)\", msg.GetString().c_str());\n}\n\n// Tests streaming a user type whose definition and operator<< are\n// both in a user namespace.\nnamespace namespace1 {\nclass MyTypeInNameSpace1 : public Base {\n public:\n  explicit MyTypeInNameSpace1(int an_x): Base(an_x) {}\n};\nstd::ostream& operator<<(std::ostream& os,\n                         const MyTypeInNameSpace1& val) {\n  return os << val.x();\n}\nstd::ostream& operator<<(std::ostream& os,\n                         const MyTypeInNameSpace1* pointer) {\n  return os << \"(\" << pointer->x() << \")\";\n}\n}  // namespace namespace1\n\nTEST(MessageTest, CanStreamUserTypeInUserNameSpace) {\n  Message msg;\n  namespace1::MyTypeInNameSpace1 a(1);\n\n  msg << a << &a;  // Uses namespace1::operator<<.\n  EXPECT_STREQ(\"1(1)\", msg.GetString().c_str());\n}\n\n// Tests streaming a user type whose definition is in a user namespace\n// but whose operator<< is in the global namespace.\nnamespace namespace2 {\nclass MyTypeInNameSpace2 : public ::Base {\n public:\n  explicit MyTypeInNameSpace2(int an_x): Base(an_x) {}\n};\n}  // namespace namespace2\nstd::ostream& operator<<(std::ostream& os,\n                         const namespace2::MyTypeInNameSpace2& val) {\n  return os << val.x();\n}\nstd::ostream& operator<<(std::ostream& os,\n                         const namespace2::MyTypeInNameSpace2* pointer) {\n  return os << \"(\" << pointer->x() << \")\";\n}\n\nTEST(MessageTest, CanStreamUserTypeInUserNameSpaceWithStreamOperatorInGlobal) {\n  Message msg;\n  namespace2::MyTypeInNameSpace2 a(1);\n\n  msg << a << &a;  // Uses ::operator<<.\n  EXPECT_STREQ(\"1(1)\", msg.GetString().c_str());\n}\n\n// Tests streaming NULL pointers to testing::Message.\nTEST(MessageTest, NullPointers) {\n  Message msg;\n  char* const p1 = NULL;\n  unsigned char* const p2 = NULL;\n  int* p3 = NULL;\n  double* p4 = NULL;\n  bool* p5 = NULL;\n  Message* p6 = NULL;\n\n  msg << p1 << p2 << p3 << p4 << p5 << p6;\n  ASSERT_STREQ(\"(null)(null)(null)(null)(null)(null)\",\n               msg.GetString().c_str());\n}\n\n// Tests streaming wide strings to testing::Message.\nTEST(MessageTest, WideStrings) {\n  // Streams a NULL of type const wchar_t*.\n  const wchar_t* const_wstr = NULL;\n  EXPECT_STREQ(\"(null)\",\n               (Message() << const_wstr).GetString().c_str());\n\n  // Streams a NULL of type wchar_t*.\n  wchar_t* wstr = NULL;\n  EXPECT_STREQ(\"(null)\",\n               (Message() << wstr).GetString().c_str());\n\n  // Streams a non-NULL of type const wchar_t*.\n  const_wstr = L\"abc\\x8119\";\n  EXPECT_STREQ(\"abc\\xe8\\x84\\x99\",\n               (Message() << const_wstr).GetString().c_str());\n\n  // Streams a non-NULL of type wchar_t*.\n  wstr = const_cast<wchar_t*>(const_wstr);\n  EXPECT_STREQ(\"abc\\xe8\\x84\\x99\",\n               (Message() << wstr).GetString().c_str());\n}\n\n\n// This line tests that we can define tests in the testing namespace.\nnamespace testing {\n\n// Tests the TestInfo class.\n\nclass TestInfoTest : public Test {\n protected:\n  static const TestInfo* GetTestInfo(const char* test_name) {\n    const TestCase* const test_case = GetUnitTestImpl()->\n        GetTestCase(\"TestInfoTest\", \"\", NULL, NULL);\n\n    for (int i = 0; i < test_case->total_test_count(); ++i) {\n      const TestInfo* const test_info = test_case->GetTestInfo(i);\n      if (strcmp(test_name, test_info->name()) == 0)\n        return test_info;\n    }\n    return NULL;\n  }\n\n  static const TestResult* GetTestResult(\n      const TestInfo* test_info) {\n    return test_info->result();\n  }\n};\n\n// Tests TestInfo::test_case_name() and TestInfo::name().\nTEST_F(TestInfoTest, Names) {\n  const TestInfo* const test_info = GetTestInfo(\"Names\");\n\n  ASSERT_STREQ(\"TestInfoTest\", test_info->test_case_name());\n  ASSERT_STREQ(\"Names\", test_info->name());\n}\n\n// Tests TestInfo::result().\nTEST_F(TestInfoTest, result) {\n  const TestInfo* const test_info = GetTestInfo(\"result\");\n\n  // Initially, there is no TestPartResult for this test.\n  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count());\n\n  // After the previous assertion, there is still none.\n  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count());\n}\n\n// Tests setting up and tearing down a test case.\n\nclass SetUpTestCaseTest : public Test {\n protected:\n  // This will be called once before the first test in this test case\n  // is run.\n  static void SetUpTestCase() {\n    printf(\"Setting up the test case . . .\\n\");\n\n    // Initializes some shared resource.  In this simple example, we\n    // just create a C string.  More complex stuff can be done if\n    // desired.\n    shared_resource_ = \"123\";\n\n    // Increments the number of test cases that have been set up.\n    counter_++;\n\n    // SetUpTestCase() should be called only once.\n    EXPECT_EQ(1, counter_);\n  }\n\n  // This will be called once after the last test in this test case is\n  // run.\n  static void TearDownTestCase() {\n    printf(\"Tearing down the test case . . .\\n\");\n\n    // Decrements the number of test cases that have been set up.\n    counter_--;\n\n    // TearDownTestCase() should be called only once.\n    EXPECT_EQ(0, counter_);\n\n    // Cleans up the shared resource.\n    shared_resource_ = NULL;\n  }\n\n  // This will be called before each test in this test case.\n  virtual void SetUp() {\n    // SetUpTestCase() should be called only once, so counter_ should\n    // always be 1.\n    EXPECT_EQ(1, counter_);\n  }\n\n  // Number of test cases that have been set up.\n  static int counter_;\n\n  // Some resource to be shared by all tests in this test case.\n  static const char* shared_resource_;\n};\n\nint SetUpTestCaseTest::counter_ = 0;\nconst char* SetUpTestCaseTest::shared_resource_ = NULL;\n\n// A test that uses the shared resource.\nTEST_F(SetUpTestCaseTest, Test1) {\n  EXPECT_STRNE(NULL, shared_resource_);\n}\n\n// Another test that uses the shared resource.\nTEST_F(SetUpTestCaseTest, Test2) {\n  EXPECT_STREQ(\"123\", shared_resource_);\n}\n\n// The InitGoogleTestTest test case tests testing::InitGoogleTest().\n\n// The Flags struct stores a copy of all Google Test flags.\nstruct Flags {\n  // Constructs a Flags struct where each flag has its default value.\n  Flags() : also_run_disabled_tests(false),\n            break_on_failure(false),\n            catch_exceptions(false),\n            death_test_use_fork(false),\n            filter(\"\"),\n            list_tests(false),\n            output(\"\"),\n            print_time(true),\n            random_seed(0),\n            repeat(1),\n            shuffle(false),\n            stack_trace_depth(kMaxStackTraceDepth),\n            throw_on_failure(false) {}\n\n  // Factory methods.\n\n  // Creates a Flags struct where the gtest_also_run_disabled_tests flag has\n  // the given value.\n  static Flags AlsoRunDisabledTests(bool also_run_disabled_tests) {\n    Flags flags;\n    flags.also_run_disabled_tests = also_run_disabled_tests;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_break_on_failure flag has\n  // the given value.\n  static Flags BreakOnFailure(bool break_on_failure) {\n    Flags flags;\n    flags.break_on_failure = break_on_failure;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_catch_exceptions flag has\n  // the given value.\n  static Flags CatchExceptions(bool catch_exceptions) {\n    Flags flags;\n    flags.catch_exceptions = catch_exceptions;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_death_test_use_fork flag has\n  // the given value.\n  static Flags DeathTestUseFork(bool death_test_use_fork) {\n    Flags flags;\n    flags.death_test_use_fork = death_test_use_fork;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_filter flag has the given\n  // value.\n  static Flags Filter(const char* filter) {\n    Flags flags;\n    flags.filter = filter;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_list_tests flag has the\n  // given value.\n  static Flags ListTests(bool list_tests) {\n    Flags flags;\n    flags.list_tests = list_tests;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_output flag has the given\n  // value.\n  static Flags Output(const char* output) {\n    Flags flags;\n    flags.output = output;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_print_time flag has the given\n  // value.\n  static Flags PrintTime(bool print_time) {\n    Flags flags;\n    flags.print_time = print_time;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_random_seed flag has\n  // the given value.\n  static Flags RandomSeed(Int32 random_seed) {\n    Flags flags;\n    flags.random_seed = random_seed;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_repeat flag has the given\n  // value.\n  static Flags Repeat(Int32 repeat) {\n    Flags flags;\n    flags.repeat = repeat;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_shuffle flag has\n  // the given value.\n  static Flags Shuffle(bool shuffle) {\n    Flags flags;\n    flags.shuffle = shuffle;\n    return flags;\n  }\n\n  // Creates a Flags struct where the GTEST_FLAG(stack_trace_depth) flag has\n  // the given value.\n  static Flags StackTraceDepth(Int32 stack_trace_depth) {\n    Flags flags;\n    flags.stack_trace_depth = stack_trace_depth;\n    return flags;\n  }\n\n  // Creates a Flags struct where the gtest_throw_on_failure flag has\n  // the given value.\n  static Flags ThrowOnFailure(bool throw_on_failure) {\n    Flags flags;\n    flags.throw_on_failure = throw_on_failure;\n    return flags;\n  }\n\n  // These fields store the flag values.\n  bool also_run_disabled_tests;\n  bool break_on_failure;\n  bool catch_exceptions;\n  bool death_test_use_fork;\n  const char* filter;\n  bool list_tests;\n  const char* output;\n  bool print_time;\n  Int32 random_seed;\n  Int32 repeat;\n  bool shuffle;\n  Int32 stack_trace_depth;\n  bool throw_on_failure;\n};\n\n// Fixture for testing InitGoogleTest().\nclass InitGoogleTestTest : public Test {\n protected:\n  // Clears the flags before each test.\n  virtual void SetUp() {\n    GTEST_FLAG(also_run_disabled_tests) = false;\n    GTEST_FLAG(break_on_failure) = false;\n    GTEST_FLAG(catch_exceptions) = false;\n    GTEST_FLAG(death_test_use_fork) = false;\n    GTEST_FLAG(filter) = \"\";\n    GTEST_FLAG(list_tests) = false;\n    GTEST_FLAG(output) = \"\";\n    GTEST_FLAG(print_time) = true;\n    GTEST_FLAG(random_seed) = 0;\n    GTEST_FLAG(repeat) = 1;\n    GTEST_FLAG(shuffle) = false;\n    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth;\n    GTEST_FLAG(throw_on_failure) = false;\n  }\n\n  // Asserts that two narrow or wide string arrays are equal.\n  template <typename CharType>\n  static void AssertStringArrayEq(size_t size1, CharType** array1,\n                                  size_t size2, CharType** array2) {\n    ASSERT_EQ(size1, size2) << \" Array sizes different.\";\n\n    for (size_t i = 0; i != size1; i++) {\n      ASSERT_STREQ(array1[i], array2[i]) << \" where i == \" << i;\n    }\n  }\n\n  // Verifies that the flag values match the expected values.\n  static void CheckFlags(const Flags& expected) {\n    EXPECT_EQ(expected.also_run_disabled_tests,\n              GTEST_FLAG(also_run_disabled_tests));\n    EXPECT_EQ(expected.break_on_failure, GTEST_FLAG(break_on_failure));\n    EXPECT_EQ(expected.catch_exceptions, GTEST_FLAG(catch_exceptions));\n    EXPECT_EQ(expected.death_test_use_fork, GTEST_FLAG(death_test_use_fork));\n    EXPECT_STREQ(expected.filter, GTEST_FLAG(filter).c_str());\n    EXPECT_EQ(expected.list_tests, GTEST_FLAG(list_tests));\n    EXPECT_STREQ(expected.output, GTEST_FLAG(output).c_str());\n    EXPECT_EQ(expected.print_time, GTEST_FLAG(print_time));\n    EXPECT_EQ(expected.random_seed, GTEST_FLAG(random_seed));\n    EXPECT_EQ(expected.repeat, GTEST_FLAG(repeat));\n    EXPECT_EQ(expected.shuffle, GTEST_FLAG(shuffle));\n    EXPECT_EQ(expected.throw_on_failure, GTEST_FLAG(throw_on_failure));\n    EXPECT_EQ(expected.stack_trace_depth, GTEST_FLAG(stack_trace_depth));\n  }\n\n  // Parses a command line (specified by argc1 and argv1), then\n  // verifies that the flag values are expected and that the\n  // recognized flags are removed from the command line.\n  template <typename CharType>\n  static void TestParsingFlags(int argc1, const CharType** argv1,\n                               int argc2, const CharType** argv2,\n                               const Flags& expected, bool should_print_help) {\n    const bool saved_help_flag = ::testing::internal::g_help_flag;\n    ::testing::internal::g_help_flag = false;\n\n#if GTEST_HAS_STREAM_REDIRECTION_\n    CaptureStdout();\n#endif  // GTEST_HAS_STREAM_REDIRECTION_\n\n    // Parses the command line.\n    internal::ParseGoogleTestFlagsOnly(&argc1, const_cast<CharType**>(argv1));\n\n#if GTEST_HAS_STREAM_REDIRECTION_\n    const String captured_stdout = GetCapturedStdout();\n#endif  // GTEST_HAS_STREAM_REDIRECTION_\n\n    // Verifies the flag values.\n    CheckFlags(expected);\n\n    // Verifies that the recognized flags are removed from the command\n    // line.\n    AssertStringArrayEq(argc1 + 1, argv1, argc2 + 1, argv2);\n\n    // ParseGoogleTestFlagsOnly should neither set g_help_flag nor print the\n    // help message for the flags it recognizes.\n    EXPECT_EQ(should_print_help, ::testing::internal::g_help_flag);\n\n#if GTEST_HAS_STREAM_REDIRECTION_\n    const char* const expected_help_fragment =\n        \"This program contains tests written using\";\n    if (should_print_help) {\n      EXPECT_PRED_FORMAT2(IsSubstring, expected_help_fragment, captured_stdout);\n    } else {\n      EXPECT_PRED_FORMAT2(IsNotSubstring,\n                          expected_help_fragment, captured_stdout);\n    }\n#endif  // GTEST_HAS_STREAM_REDIRECTION_\n\n    ::testing::internal::g_help_flag = saved_help_flag;\n  }\n\n  // This macro wraps TestParsingFlags s.t. the user doesn't need\n  // to specify the array sizes.\n#define GTEST_TEST_PARSING_FLAGS_(argv1, argv2, expected, should_print_help) \\\n  TestParsingFlags(sizeof(argv1)/sizeof(*argv1) - 1, argv1, \\\n                   sizeof(argv2)/sizeof(*argv2) - 1, argv2, \\\n                   expected, should_print_help)\n};\n\n// Tests parsing an empty command line.\nTEST_F(InitGoogleTestTest, Empty) {\n  const char* argv[] = {\n    NULL\n  };\n\n  const char* argv2[] = {\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false);\n}\n\n// Tests parsing a command line that has no flag.\nTEST_F(InitGoogleTestTest, NoFlag) {\n  const char* argv[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false);\n}\n\n// Tests parsing a bad --gtest_filter flag.\nTEST_F(InitGoogleTestTest, FilterBad) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_filter\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    \"--gtest_filter\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(\"\"), true);\n}\n\n// Tests parsing an empty --gtest_filter flag.\nTEST_F(InitGoogleTestTest, FilterEmpty) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_filter=\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(\"\"), false);\n}\n\n// Tests parsing a non-empty --gtest_filter flag.\nTEST_F(InitGoogleTestTest, FilterNonEmpty) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_filter=abc\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(\"abc\"), false);\n}\n\n// Tests parsing --gtest_break_on_failure.\nTEST_F(InitGoogleTestTest, BreakOnFailureWithoutValue) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_break_on_failure\",\n    NULL\n};\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false);\n}\n\n// Tests parsing --gtest_break_on_failure=0.\nTEST_F(InitGoogleTestTest, BreakOnFailureFalse_0) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_break_on_failure=0\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);\n}\n\n// Tests parsing --gtest_break_on_failure=f.\nTEST_F(InitGoogleTestTest, BreakOnFailureFalse_f) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_break_on_failure=f\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);\n}\n\n// Tests parsing --gtest_break_on_failure=F.\nTEST_F(InitGoogleTestTest, BreakOnFailureFalse_F) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_break_on_failure=F\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);\n}\n\n// Tests parsing a --gtest_break_on_failure flag that has a \"true\"\n// definition.\nTEST_F(InitGoogleTestTest, BreakOnFailureTrue) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_break_on_failure=1\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false);\n}\n\n// Tests parsing --gtest_catch_exceptions.\nTEST_F(InitGoogleTestTest, CatchExceptions) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_catch_exceptions\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::CatchExceptions(true), false);\n}\n\n// Tests parsing --gtest_death_test_use_fork.\nTEST_F(InitGoogleTestTest, DeathTestUseFork) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_death_test_use_fork\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::DeathTestUseFork(true), false);\n}\n\n// Tests having the same flag twice with different values.  The\n// expected behavior is that the one coming last takes precedence.\nTEST_F(InitGoogleTestTest, DuplicatedFlags) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_filter=a\",\n    \"--gtest_filter=b\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(\"b\"), false);\n}\n\n// Tests having an unrecognized flag on the command line.\nTEST_F(InitGoogleTestTest, UnrecognizedFlag) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_break_on_failure\",\n    \"bar\",  // Unrecognized by Google Test.\n    \"--gtest_filter=b\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    \"bar\",\n    NULL\n  };\n\n  Flags flags;\n  flags.break_on_failure = true;\n  flags.filter = \"b\";\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, flags, false);\n}\n\n// Tests having a --gtest_list_tests flag\nTEST_F(InitGoogleTestTest, ListTestsFlag) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_list_tests\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false);\n}\n\n// Tests having a --gtest_list_tests flag with a \"true\" value\nTEST_F(InitGoogleTestTest, ListTestsTrue) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_list_tests=1\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false);\n}\n\n// Tests having a --gtest_list_tests flag with a \"false\" value\nTEST_F(InitGoogleTestTest, ListTestsFalse) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_list_tests=0\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);\n}\n\n// Tests parsing --gtest_list_tests=f.\nTEST_F(InitGoogleTestTest, ListTestsFalse_f) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_list_tests=f\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);\n}\n\n// Tests parsing --gtest_list_tests=F.\nTEST_F(InitGoogleTestTest, ListTestsFalse_F) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_list_tests=F\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);\n}\n\n// Tests parsing --gtest_output (invalid).\nTEST_F(InitGoogleTestTest, OutputEmpty) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_output\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    \"--gtest_output\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), true);\n}\n\n// Tests parsing --gtest_output=xml\nTEST_F(InitGoogleTestTest, OutputXml) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_output=xml\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output(\"xml\"), false);\n}\n\n// Tests parsing --gtest_output=xml:file\nTEST_F(InitGoogleTestTest, OutputXmlFile) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_output=xml:file\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output(\"xml:file\"), false);\n}\n\n// Tests parsing --gtest_output=xml:directory/path/\nTEST_F(InitGoogleTestTest, OutputXmlDirectory) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_output=xml:directory/path/\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2,\n                            Flags::Output(\"xml:directory/path/\"), false);\n}\n\n// Tests having a --gtest_print_time flag\nTEST_F(InitGoogleTestTest, PrintTimeFlag) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_print_time\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false);\n}\n\n// Tests having a --gtest_print_time flag with a \"true\" value\nTEST_F(InitGoogleTestTest, PrintTimeTrue) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_print_time=1\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false);\n}\n\n// Tests having a --gtest_print_time flag with a \"false\" value\nTEST_F(InitGoogleTestTest, PrintTimeFalse) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_print_time=0\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);\n}\n\n// Tests parsing --gtest_print_time=f.\nTEST_F(InitGoogleTestTest, PrintTimeFalse_f) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_print_time=f\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);\n}\n\n// Tests parsing --gtest_print_time=F.\nTEST_F(InitGoogleTestTest, PrintTimeFalse_F) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_print_time=F\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);\n}\n\n// Tests parsing --gtest_random_seed=number\nTEST_F(InitGoogleTestTest, RandomSeed) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_random_seed=1000\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::RandomSeed(1000), false);\n}\n\n// Tests parsing --gtest_repeat=number\nTEST_F(InitGoogleTestTest, Repeat) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_repeat=1000\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Repeat(1000), false);\n}\n\n// Tests having a --gtest_also_run_disabled_tests flag\nTEST_F(InitGoogleTestTest, AlsoRunDisabledTestsFlag) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_also_run_disabled_tests\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2,\n                              Flags::AlsoRunDisabledTests(true), false);\n}\n\n// Tests having a --gtest_also_run_disabled_tests flag with a \"true\" value\nTEST_F(InitGoogleTestTest, AlsoRunDisabledTestsTrue) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_also_run_disabled_tests=1\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2,\n                              Flags::AlsoRunDisabledTests(true), false);\n}\n\n// Tests having a --gtest_also_run_disabled_tests flag with a \"false\" value\nTEST_F(InitGoogleTestTest, AlsoRunDisabledTestsFalse) {\n    const char* argv[] = {\n      \"foo.exe\",\n      \"--gtest_also_run_disabled_tests=0\",\n      NULL\n    };\n\n    const char* argv2[] = {\n      \"foo.exe\",\n      NULL\n    };\n\n    GTEST_TEST_PARSING_FLAGS_(argv, argv2,\n                              Flags::AlsoRunDisabledTests(false), false);\n}\n\n// Tests parsing --gtest_shuffle.\nTEST_F(InitGoogleTestTest, ShuffleWithoutValue) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_shuffle\",\n    NULL\n};\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false);\n}\n\n// Tests parsing --gtest_shuffle=0.\nTEST_F(InitGoogleTestTest, ShuffleFalse_0) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_shuffle=0\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(false), false);\n}\n\n// Tests parsing a --gtest_shuffle flag that has a \"true\"\n// definition.\nTEST_F(InitGoogleTestTest, ShuffleTrue) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_shuffle=1\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false);\n}\n\n// Tests parsing --gtest_stack_trace_depth=number.\nTEST_F(InitGoogleTestTest, StackTraceDepth) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_stack_trace_depth=5\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::StackTraceDepth(5), false);\n}\n\n// Tests parsing --gtest_throw_on_failure.\nTEST_F(InitGoogleTestTest, ThrowOnFailureWithoutValue) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_throw_on_failure\",\n    NULL\n};\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false);\n}\n\n// Tests parsing --gtest_throw_on_failure=0.\nTEST_F(InitGoogleTestTest, ThrowOnFailureFalse_0) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_throw_on_failure=0\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(false), false);\n}\n\n// Tests parsing a --gtest_throw_on_failure flag that has a \"true\"\n// definition.\nTEST_F(InitGoogleTestTest, ThrowOnFailureTrue) {\n  const char* argv[] = {\n    \"foo.exe\",\n    \"--gtest_throw_on_failure=1\",\n    NULL\n  };\n\n  const char* argv2[] = {\n    \"foo.exe\",\n    NULL\n  };\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false);\n}\n\n#if GTEST_OS_WINDOWS\n// Tests parsing wide strings.\nTEST_F(InitGoogleTestTest, WideStrings) {\n  const wchar_t* argv[] = {\n    L\"foo.exe\",\n    L\"--gtest_filter=Foo*\",\n    L\"--gtest_list_tests=1\",\n    L\"--gtest_break_on_failure\",\n    L\"--non_gtest_flag\",\n    NULL\n  };\n\n  const wchar_t* argv2[] = {\n    L\"foo.exe\",\n    L\"--non_gtest_flag\",\n    NULL\n  };\n\n  Flags expected_flags;\n  expected_flags.break_on_failure = true;\n  expected_flags.filter = \"Foo*\";\n  expected_flags.list_tests = true;\n\n  GTEST_TEST_PARSING_FLAGS_(argv, argv2, expected_flags, false);\n}\n#endif  // GTEST_OS_WINDOWS\n\n// Tests current_test_info() in UnitTest.\nclass CurrentTestInfoTest : public Test {\n protected:\n  // Tests that current_test_info() returns NULL before the first test in\n  // the test case is run.\n  static void SetUpTestCase() {\n    // There should be no tests running at this point.\n    const TestInfo* test_info =\n      UnitTest::GetInstance()->current_test_info();\n    EXPECT_TRUE(test_info == NULL)\n        << \"There should be no tests running at this point.\";\n  }\n\n  // Tests that current_test_info() returns NULL after the last test in\n  // the test case has run.\n  static void TearDownTestCase() {\n    const TestInfo* test_info =\n      UnitTest::GetInstance()->current_test_info();\n    EXPECT_TRUE(test_info == NULL)\n        << \"There should be no tests running at this point.\";\n  }\n};\n\n// Tests that current_test_info() returns TestInfo for currently running\n// test by checking the expected test name against the actual one.\nTEST_F(CurrentTestInfoTest, WorksForFirstTestInATestCase) {\n  const TestInfo* test_info =\n    UnitTest::GetInstance()->current_test_info();\n  ASSERT_TRUE(NULL != test_info)\n      << \"There is a test running so we should have a valid TestInfo.\";\n  EXPECT_STREQ(\"CurrentTestInfoTest\", test_info->test_case_name())\n      << \"Expected the name of the currently running test case.\";\n  EXPECT_STREQ(\"WorksForFirstTestInATestCase\", test_info->name())\n      << \"Expected the name of the currently running test.\";\n}\n\n// Tests that current_test_info() returns TestInfo for currently running\n// test by checking the expected test name against the actual one.  We\n// use this test to see that the TestInfo object actually changed from\n// the previous invocation.\nTEST_F(CurrentTestInfoTest, WorksForSecondTestInATestCase) {\n  const TestInfo* test_info =\n    UnitTest::GetInstance()->current_test_info();\n  ASSERT_TRUE(NULL != test_info)\n      << \"There is a test running so we should have a valid TestInfo.\";\n  EXPECT_STREQ(\"CurrentTestInfoTest\", test_info->test_case_name())\n      << \"Expected the name of the currently running test case.\";\n  EXPECT_STREQ(\"WorksForSecondTestInATestCase\", test_info->name())\n      << \"Expected the name of the currently running test.\";\n}\n\n}  // namespace testing\n\n// These two lines test that we can define tests in a namespace that\n// has the name \"testing\" and is nested in another namespace.\nnamespace my_namespace {\nnamespace testing {\n\n// Makes sure that TEST knows to use ::testing::Test instead of\n// ::my_namespace::testing::Test.\nclass Test {};\n\n// Makes sure that an assertion knows to use ::testing::Message instead of\n// ::my_namespace::testing::Message.\nclass Message {};\n\n// Makes sure that an assertion knows to use\n// ::testing::AssertionResult instead of\n// ::my_namespace::testing::AssertionResult.\nclass AssertionResult {};\n\n// Tests that an assertion that should succeed works as expected.\nTEST(NestedTestingNamespaceTest, Success) {\n  EXPECT_EQ(1, 1) << \"This shouldn't fail.\";\n}\n\n// Tests that an assertion that should fail works as expected.\nTEST(NestedTestingNamespaceTest, Failure) {\n  EXPECT_FATAL_FAILURE(FAIL() << \"This failure is expected.\",\n                       \"This failure is expected.\");\n}\n\n}  // namespace testing\n}  // namespace my_namespace\n\n// Tests that one can call superclass SetUp and TearDown methods--\n// that is, that they are not private.\n// No tests are based on this fixture; the test \"passes\" if it compiles\n// successfully.\nclass ProtectedFixtureMethodsTest : public Test {\n protected:\n  virtual void SetUp() {\n    Test::SetUp();\n  }\n  virtual void TearDown() {\n    Test::TearDown();\n  }\n};\n\n// StreamingAssertionsTest tests the streaming versions of a representative\n// sample of assertions.\nTEST(StreamingAssertionsTest, Unconditional) {\n  SUCCEED() << \"expected success\";\n  EXPECT_NONFATAL_FAILURE(ADD_FAILURE() << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(FAIL() << \"expected failure\",\n                       \"expected failure\");\n}\n\n#ifdef __BORLANDC__\n// Silences warnings: \"Condition is always true\", \"Unreachable code\"\n#pragma option push -w-ccc -w-rch\n#endif\n\nTEST(StreamingAssertionsTest, Truth) {\n  EXPECT_TRUE(true) << \"unexpected failure\";\n  ASSERT_TRUE(true) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false) << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, Truth2) {\n  EXPECT_FALSE(false) << \"unexpected failure\";\n  ASSERT_FALSE(false) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_FALSE(true) << \"expected failure\",\n                       \"expected failure\");\n}\n\n#ifdef __BORLANDC__\n// Restores warnings after previous \"#pragma option push\" supressed them\n#pragma option pop\n#endif\n\nTEST(StreamingAssertionsTest, IntegerEquals) {\n  EXPECT_EQ(1, 1) << \"unexpected failure\";\n  ASSERT_EQ(1, 1) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(1, 2) << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_EQ(1, 2) << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, IntegerLessThan) {\n  EXPECT_LT(1, 2) << \"unexpected failure\";\n  ASSERT_LT(1, 2) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1) << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 1) << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, StringsEqual) {\n  EXPECT_STREQ(\"foo\", \"foo\") << \"unexpected failure\";\n  ASSERT_STREQ(\"foo\", \"foo\") << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(\"foo\", \"bar\") << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_STREQ(\"foo\", \"bar\") << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, StringsNotEqual) {\n  EXPECT_STRNE(\"foo\", \"bar\") << \"unexpected failure\";\n  ASSERT_STRNE(\"foo\", \"bar\") << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(\"foo\", \"foo\") << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_STRNE(\"foo\", \"foo\") << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, StringsEqualIgnoringCase) {\n  EXPECT_STRCASEEQ(\"foo\", \"FOO\") << \"unexpected failure\";\n  ASSERT_STRCASEEQ(\"foo\", \"FOO\") << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ(\"foo\", \"bar\") << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ(\"foo\", \"bar\") << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, StringNotEqualIgnoringCase) {\n  EXPECT_STRCASENE(\"foo\", \"bar\") << \"unexpected failure\";\n  ASSERT_STRCASENE(\"foo\", \"bar\") << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE(\"foo\", \"FOO\") << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE(\"bar\", \"BAR\") << \"expected failure\",\n                       \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, FloatingPointEquals) {\n  EXPECT_FLOAT_EQ(1.0, 1.0) << \"unexpected failure\";\n  ASSERT_FLOAT_EQ(1.0, 1.0) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(0.0, 1.0) << \"expected failure\",\n                          \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.0) << \"expected failure\",\n                       \"expected failure\");\n}\n\n#if GTEST_HAS_EXCEPTIONS\n\nTEST(StreamingAssertionsTest, Throw) {\n  EXPECT_THROW(ThrowAnInteger(), int) << \"unexpected failure\";\n  ASSERT_THROW(ThrowAnInteger(), int) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool) <<\n                          \"expected failure\", \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_THROW(ThrowAnInteger(), bool) <<\n                       \"expected failure\", \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, NoThrow) {\n  EXPECT_NO_THROW(ThrowNothing()) << \"unexpected failure\";\n  ASSERT_NO_THROW(ThrowNothing()) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()) <<\n                          \"expected failure\", \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()) <<\n                       \"expected failure\", \"expected failure\");\n}\n\nTEST(StreamingAssertionsTest, AnyThrow) {\n  EXPECT_ANY_THROW(ThrowAnInteger()) << \"unexpected failure\";\n  ASSERT_ANY_THROW(ThrowAnInteger()) << \"unexpected failure\";\n  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(ThrowNothing()) <<\n                          \"expected failure\", \"expected failure\");\n  EXPECT_FATAL_FAILURE(ASSERT_ANY_THROW(ThrowNothing()) <<\n                       \"expected failure\", \"expected failure\");\n}\n\n#endif  // GTEST_HAS_EXCEPTIONS\n\n// Tests that Google Test correctly decides whether to use colors in the output.\n\nTEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsYes) {\n  GTEST_FLAG(color) = \"yes\";\n\n  SetEnv(\"TERM\", \"xterm\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.\n\n  SetEnv(\"TERM\", \"dumb\");  // TERM doesn't support colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.\n}\n\nTEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsAliasOfYes) {\n  SetEnv(\"TERM\", \"dumb\");  // TERM doesn't support colors.\n\n  GTEST_FLAG(color) = \"True\";\n  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.\n\n  GTEST_FLAG(color) = \"t\";\n  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.\n\n  GTEST_FLAG(color) = \"1\";\n  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.\n}\n\nTEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsNo) {\n  GTEST_FLAG(color) = \"no\";\n\n  SetEnv(\"TERM\", \"xterm\");  // TERM supports colors.\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.\n\n  SetEnv(\"TERM\", \"dumb\");  // TERM doesn't support colors.\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.\n}\n\nTEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsInvalid) {\n  SetEnv(\"TERM\", \"xterm\");  // TERM supports colors.\n\n  GTEST_FLAG(color) = \"F\";\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  GTEST_FLAG(color) = \"0\";\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  GTEST_FLAG(color) = \"unknown\";\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n}\n\nTEST(ColoredOutputTest, UsesColorsWhenStdoutIsTty) {\n  GTEST_FLAG(color) = \"auto\";\n\n  SetEnv(\"TERM\", \"xterm\");  // TERM supports colors.\n  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.\n  EXPECT_TRUE(ShouldUseColor(true));    // Stdout is a TTY.\n}\n\nTEST(ColoredOutputTest, UsesColorsWhenTermSupportsColors) {\n  GTEST_FLAG(color) = \"auto\";\n\n#if GTEST_OS_WINDOWS\n  // On Windows, we ignore the TERM variable as it's usually not set.\n\n  SetEnv(\"TERM\", \"dumb\");\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"\");\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"xterm\");\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n#else\n  // On non-Windows platforms, we rely on TERM to determine if the\n  // terminal supports colors.\n\n  SetEnv(\"TERM\", \"dumb\");  // TERM doesn't support colors.\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"emacs\");  // TERM doesn't support colors.\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"vt100\");  // TERM doesn't support colors.\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"xterm-mono\");  // TERM doesn't support colors.\n  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"xterm\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"xterm-color\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n\n  SetEnv(\"TERM\", \"linux\");  // TERM supports colors.\n  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.\n#endif  // GTEST_OS_WINDOWS\n}\n\n// Verifies that StaticAssertTypeEq works in a namespace scope.\n\nstatic bool dummy1 = StaticAssertTypeEq<bool, bool>();\nstatic bool dummy2 = StaticAssertTypeEq<const int, const int>();\n\n// Verifies that StaticAssertTypeEq works in a class.\n\ntemplate <typename T>\nclass StaticAssertTypeEqTestHelper {\n public:\n  StaticAssertTypeEqTestHelper() { StaticAssertTypeEq<bool, T>(); }\n};\n\nTEST(StaticAssertTypeEqTest, WorksInClass) {\n  StaticAssertTypeEqTestHelper<bool>();\n}\n\n// Verifies that StaticAssertTypeEq works inside a function.\n\ntypedef int IntAlias;\n\nTEST(StaticAssertTypeEqTest, CompilesForEqualTypes) {\n  StaticAssertTypeEq<int, IntAlias>();\n  StaticAssertTypeEq<int*, IntAlias*>();\n}\n\nTEST(GetCurrentOsStackTraceExceptTopTest, ReturnsTheStackTrace) {\n  testing::UnitTest* const unit_test = testing::UnitTest::GetInstance();\n\n  // We don't have a stack walker in Google Test yet.\n  EXPECT_STREQ(\"\", GetCurrentOsStackTraceExceptTop(unit_test, 0).c_str());\n  EXPECT_STREQ(\"\", GetCurrentOsStackTraceExceptTop(unit_test, 1).c_str());\n}\n\nTEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsNoFailure) {\n  EXPECT_FALSE(HasNonfatalFailure());\n}\n\nstatic void FailFatally() { FAIL(); }\n\nTEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsOnlyFatalFailure) {\n  FailFatally();\n  const bool has_nonfatal_failure = HasNonfatalFailure();\n  ClearCurrentTestPartResults();\n  EXPECT_FALSE(has_nonfatal_failure);\n}\n\nTEST(HasNonfatalFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) {\n  ADD_FAILURE();\n  const bool has_nonfatal_failure = HasNonfatalFailure();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_nonfatal_failure);\n}\n\nTEST(HasNonfatalFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) {\n  FailFatally();\n  ADD_FAILURE();\n  const bool has_nonfatal_failure = HasNonfatalFailure();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_nonfatal_failure);\n}\n\n// A wrapper for calling HasNonfatalFailure outside of a test body.\nstatic bool HasNonfatalFailureHelper() {\n  return testing::Test::HasNonfatalFailure();\n}\n\nTEST(HasNonfatalFailureTest, WorksOutsideOfTestBody) {\n  EXPECT_FALSE(HasNonfatalFailureHelper());\n}\n\nTEST(HasNonfatalFailureTest, WorksOutsideOfTestBody2) {\n  ADD_FAILURE();\n  const bool has_nonfatal_failure = HasNonfatalFailureHelper();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_nonfatal_failure);\n}\n\nTEST(HasFailureTest, ReturnsFalseWhenThereIsNoFailure) {\n  EXPECT_FALSE(HasFailure());\n}\n\nTEST(HasFailureTest, ReturnsTrueWhenThereIsFatalFailure) {\n  FailFatally();\n  const bool has_failure = HasFailure();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_failure);\n}\n\nTEST(HasFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) {\n  ADD_FAILURE();\n  const bool has_failure = HasFailure();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_failure);\n}\n\nTEST(HasFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) {\n  FailFatally();\n  ADD_FAILURE();\n  const bool has_failure = HasFailure();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_failure);\n}\n\n// A wrapper for calling HasFailure outside of a test body.\nstatic bool HasFailureHelper() { return testing::Test::HasFailure(); }\n\nTEST(HasFailureTest, WorksOutsideOfTestBody) {\n  EXPECT_FALSE(HasFailureHelper());\n}\n\nTEST(HasFailureTest, WorksOutsideOfTestBody2) {\n  ADD_FAILURE();\n  const bool has_failure = HasFailureHelper();\n  ClearCurrentTestPartResults();\n  EXPECT_TRUE(has_failure);\n}\n\nclass TestListener : public EmptyTestEventListener {\n public:\n  TestListener() : on_start_counter_(NULL), is_destroyed_(NULL) {}\n  TestListener(int* on_start_counter, bool* is_destroyed)\n      : on_start_counter_(on_start_counter),\n        is_destroyed_(is_destroyed) {}\n\n  virtual ~TestListener() {\n    if (is_destroyed_)\n      *is_destroyed_ = true;\n  }\n\n protected:\n  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {\n    if (on_start_counter_ != NULL)\n      (*on_start_counter_)++;\n  }\n\n private:\n  int* on_start_counter_;\n  bool* is_destroyed_;\n};\n\n// Tests the constructor.\nTEST(TestEventListenersTest, ConstructionWorks) {\n  TestEventListeners listeners;\n\n  EXPECT_TRUE(TestEventListenersAccessor::GetRepeater(&listeners) != NULL);\n  EXPECT_TRUE(listeners.default_result_printer() == NULL);\n  EXPECT_TRUE(listeners.default_xml_generator() == NULL);\n}\n\n// Tests that the TestEventListeners destructor deletes all the listeners it\n// owns.\nTEST(TestEventListenersTest, DestructionWorks) {\n  bool default_result_printer_is_destroyed = false;\n  bool default_xml_printer_is_destroyed = false;\n  bool extra_listener_is_destroyed = false;\n  TestListener* default_result_printer = new TestListener(\n      NULL, &default_result_printer_is_destroyed);\n  TestListener* default_xml_printer = new TestListener(\n      NULL, &default_xml_printer_is_destroyed);\n  TestListener* extra_listener = new TestListener(\n      NULL, &extra_listener_is_destroyed);\n\n  {\n    TestEventListeners listeners;\n    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners,\n                                                        default_result_printer);\n    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners,\n                                                       default_xml_printer);\n    listeners.Append(extra_listener);\n  }\n  EXPECT_TRUE(default_result_printer_is_destroyed);\n  EXPECT_TRUE(default_xml_printer_is_destroyed);\n  EXPECT_TRUE(extra_listener_is_destroyed);\n}\n\n// Tests that a listener Append'ed to a TestEventListeners list starts\n// receiving events.\nTEST(TestEventListenersTest, Append) {\n  int on_start_counter = 0;\n  bool is_destroyed = false;\n  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);\n  {\n    TestEventListeners listeners;\n    listeners.Append(listener);\n    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n        *UnitTest::GetInstance());\n    EXPECT_EQ(1, on_start_counter);\n  }\n  EXPECT_TRUE(is_destroyed);\n}\n\n// Tests that listeners receive events in the order they were appended to\n// the list, except for *End requests, which must be received in the reverse\n// order.\nclass SequenceTestingListener : public EmptyTestEventListener {\n public:\n  SequenceTestingListener(std::vector<String>* vector, const char* id)\n      : vector_(vector), id_(id) {}\n\n protected:\n  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {\n    vector_->push_back(GetEventDescription(\"OnTestProgramStart\"));\n  }\n\n  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {\n    vector_->push_back(GetEventDescription(\"OnTestProgramEnd\"));\n  }\n\n  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,\n                                    int /*iteration*/) {\n    vector_->push_back(GetEventDescription(\"OnTestIterationStart\"));\n  }\n\n  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,\n                                  int /*iteration*/) {\n    vector_->push_back(GetEventDescription(\"OnTestIterationEnd\"));\n  }\n\n private:\n  String GetEventDescription(const char* method) {\n    Message message;\n    message << id_ << \".\" << method;\n    return message.GetString();\n  }\n\n  std::vector<String>* vector_;\n  const char* const id_;\n\n  GTEST_DISALLOW_COPY_AND_ASSIGN_(SequenceTestingListener);\n};\n\nTEST(EventListenerTest, AppendKeepsOrder) {\n  std::vector<String> vec;\n  TestEventListeners listeners;\n  listeners.Append(new SequenceTestingListener(&vec, \"1st\"));\n  listeners.Append(new SequenceTestingListener(&vec, \"2nd\"));\n  listeners.Append(new SequenceTestingListener(&vec, \"3rd\"));\n\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n      *UnitTest::GetInstance());\n  ASSERT_EQ(3U, vec.size());\n  EXPECT_STREQ(\"1st.OnTestProgramStart\", vec[0].c_str());\n  EXPECT_STREQ(\"2nd.OnTestProgramStart\", vec[1].c_str());\n  EXPECT_STREQ(\"3rd.OnTestProgramStart\", vec[2].c_str());\n\n  vec.clear();\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramEnd(\n      *UnitTest::GetInstance());\n  ASSERT_EQ(3U, vec.size());\n  EXPECT_STREQ(\"3rd.OnTestProgramEnd\", vec[0].c_str());\n  EXPECT_STREQ(\"2nd.OnTestProgramEnd\", vec[1].c_str());\n  EXPECT_STREQ(\"1st.OnTestProgramEnd\", vec[2].c_str());\n\n  vec.clear();\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationStart(\n      *UnitTest::GetInstance(), 0);\n  ASSERT_EQ(3U, vec.size());\n  EXPECT_STREQ(\"1st.OnTestIterationStart\", vec[0].c_str());\n  EXPECT_STREQ(\"2nd.OnTestIterationStart\", vec[1].c_str());\n  EXPECT_STREQ(\"3rd.OnTestIterationStart\", vec[2].c_str());\n\n  vec.clear();\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationEnd(\n      *UnitTest::GetInstance(), 0);\n  ASSERT_EQ(3U, vec.size());\n  EXPECT_STREQ(\"3rd.OnTestIterationEnd\", vec[0].c_str());\n  EXPECT_STREQ(\"2nd.OnTestIterationEnd\", vec[1].c_str());\n  EXPECT_STREQ(\"1st.OnTestIterationEnd\", vec[2].c_str());\n}\n\n// Tests that a listener removed from a TestEventListeners list stops receiving\n// events and is not deleted when the list is destroyed.\nTEST(TestEventListenersTest, Release) {\n  int on_start_counter = 0;\n  bool is_destroyed = false;\n  // Although Append passes the ownership of this object to the list,\n  // the following calls release it, and we need to delete it before the\n  // test ends.\n  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);\n  {\n    TestEventListeners listeners;\n    listeners.Append(listener);\n    EXPECT_EQ(listener, listeners.Release(listener));\n    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n        *UnitTest::GetInstance());\n    EXPECT_TRUE(listeners.Release(listener) == NULL);\n  }\n  EXPECT_EQ(0, on_start_counter);\n  EXPECT_FALSE(is_destroyed);\n  delete listener;\n}\n\n// Tests that no events are forwarded when event forwarding is disabled.\nTEST(EventListenerTest, SuppressEventForwarding) {\n  int on_start_counter = 0;\n  TestListener* listener = new TestListener(&on_start_counter, NULL);\n\n  TestEventListeners listeners;\n  listeners.Append(listener);\n  ASSERT_TRUE(TestEventListenersAccessor::EventForwardingEnabled(listeners));\n  TestEventListenersAccessor::SuppressEventForwarding(&listeners);\n  ASSERT_FALSE(TestEventListenersAccessor::EventForwardingEnabled(listeners));\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n      *UnitTest::GetInstance());\n  EXPECT_EQ(0, on_start_counter);\n}\n\n// Tests that events generated by Google Test are not forwarded in\n// death test subprocesses.\nTEST(EventListenerDeathTest, EventsNotForwardedInDeathTestSubprecesses) {\n  EXPECT_DEATH_IF_SUPPORTED({\n      GTEST_CHECK_(TestEventListenersAccessor::EventForwardingEnabled(\n          *GetUnitTestImpl()->listeners())) << \"expected failure\";},\n      \"expected failure\");\n}\n\n// Tests that a listener installed via SetDefaultResultPrinter() starts\n// receiving events and is returned via default_result_printer() and that\n// the previous default_result_printer is removed from the list and deleted.\nTEST(EventListenerTest, default_result_printer) {\n  int on_start_counter = 0;\n  bool is_destroyed = false;\n  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);\n\n  TestEventListeners listeners;\n  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener);\n\n  EXPECT_EQ(listener, listeners.default_result_printer());\n\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n      *UnitTest::GetInstance());\n\n  EXPECT_EQ(1, on_start_counter);\n\n  // Replacing default_result_printer with something else should remove it\n  // from the list and destroy it.\n  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, NULL);\n\n  EXPECT_TRUE(listeners.default_result_printer() == NULL);\n  EXPECT_TRUE(is_destroyed);\n\n  // After broadcasting an event the counter is still the same, indicating\n  // the listener is not in the list anymore.\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n      *UnitTest::GetInstance());\n  EXPECT_EQ(1, on_start_counter);\n}\n\n// Tests that the default_result_printer listener stops receiving events\n// when removed via Release and that is not owned by the list anymore.\nTEST(EventListenerTest, RemovingDefaultResultPrinterWorks) {\n  int on_start_counter = 0;\n  bool is_destroyed = false;\n  // Although Append passes the ownership of this object to the list,\n  // the following calls release it, and we need to delete it before the\n  // test ends.\n  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);\n  {\n    TestEventListeners listeners;\n    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener);\n\n    EXPECT_EQ(listener, listeners.Release(listener));\n    EXPECT_TRUE(listeners.default_result_printer() == NULL);\n    EXPECT_FALSE(is_destroyed);\n\n    // Broadcasting events now should not affect default_result_printer.\n    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n        *UnitTest::GetInstance());\n    EXPECT_EQ(0, on_start_counter);\n  }\n  // Destroying the list should not affect the listener now, too.\n  EXPECT_FALSE(is_destroyed);\n  delete listener;\n}\n\n// Tests that a listener installed via SetDefaultXmlGenerator() starts\n// receiving events and is returned via default_xml_generator() and that\n// the previous default_xml_generator is removed from the list and deleted.\nTEST(EventListenerTest, default_xml_generator) {\n  int on_start_counter = 0;\n  bool is_destroyed = false;\n  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);\n\n  TestEventListeners listeners;\n  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener);\n\n  EXPECT_EQ(listener, listeners.default_xml_generator());\n\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n      *UnitTest::GetInstance());\n\n  EXPECT_EQ(1, on_start_counter);\n\n  // Replacing default_xml_generator with something else should remove it\n  // from the list and destroy it.\n  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, NULL);\n\n  EXPECT_TRUE(listeners.default_xml_generator() == NULL);\n  EXPECT_TRUE(is_destroyed);\n\n  // After broadcasting an event the counter is still the same, indicating\n  // the listener is not in the list anymore.\n  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n      *UnitTest::GetInstance());\n  EXPECT_EQ(1, on_start_counter);\n}\n\n// Tests that the default_xml_generator listener stops receiving events\n// when removed via Release and that is not owned by the list anymore.\nTEST(EventListenerTest, RemovingDefaultXmlGeneratorWorks) {\n  int on_start_counter = 0;\n  bool is_destroyed = false;\n  // Although Append passes the ownership of this object to the list,\n  // the following calls release it, and we need to delete it before the\n  // test ends.\n  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);\n  {\n    TestEventListeners listeners;\n    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener);\n\n    EXPECT_EQ(listener, listeners.Release(listener));\n    EXPECT_TRUE(listeners.default_xml_generator() == NULL);\n    EXPECT_FALSE(is_destroyed);\n\n    // Broadcasting events now should not affect default_xml_generator.\n    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(\n        *UnitTest::GetInstance());\n    EXPECT_EQ(0, on_start_counter);\n  }\n  // Destroying the list should not affect the listener now, too.\n  EXPECT_FALSE(is_destroyed);\n  delete listener;\n}\n\n// Sanity tests to ensure that the alternative, verbose spellings of\n// some of the macros work.  We don't test them thoroughly as that\n// would be quite involved.  Since their implementations are\n// straightforward, and they are rarely used, we'll just rely on the\n// users to tell us when they are broken.\nGTEST_TEST(AlternativeNameTest, Works) {  // GTEST_TEST is the same as TEST.\n  GTEST_SUCCEED() << \"OK\";  // GTEST_SUCCEED is the same as SUCCEED.\n\n  // GTEST_FAIL is the same as FAIL.\n  EXPECT_FATAL_FAILURE(GTEST_FAIL() << \"An expected failure\",\n                       \"An expected failure\");\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile1_test_.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: keith.ray@gmail.com (Keith Ray)\n//\n// gtest_xml_outfile1_test_ writes some xml via TestProperty used by\n// gtest_xml_outfiles_test.py\n\n#include <gtest/gtest.h>\n\nclass PropertyOne : public testing::Test {\n protected:\n  virtual void SetUp() {\n    RecordProperty(\"SetUpProp\", 1);\n  }\n  virtual void TearDown() {\n    RecordProperty(\"TearDownProp\", 1);\n  }\n};\n\nTEST_F(PropertyOne, TestSomeProperties) {\n  RecordProperty(\"TestSomeProperty\", 1);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile2_test_.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: keith.ray@gmail.com (Keith Ray)\n//\n// gtest_xml_outfile2_test_ writes some xml via TestProperty used by\n// gtest_xml_outfiles_test.py\n\n#include <gtest/gtest.h>\n\nclass PropertyTwo : public testing::Test {\n protected:\n  virtual void SetUp() {\n    RecordProperty(\"SetUpProp\", 2);\n  }\n  virtual void TearDown() {\n    RecordProperty(\"TearDownProp\", 2);\n  }\n};\n\nTEST_F(PropertyTwo, TestSomeProperties) {\n  RecordProperty(\"TestSomeProperty\", 2);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfiles_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test for the gtest_xml_output module.\"\"\"\n\n__author__ = \"keith.ray@gmail.com (Keith Ray)\"\n\nimport os\nfrom xml.dom import minidom, Node\n\nimport gtest_test_utils\nimport gtest_xml_test_utils\n\n\nGTEST_OUTPUT_SUBDIR = \"xml_outfiles\"\nGTEST_OUTPUT_1_TEST = \"gtest_xml_outfile1_test_\"\nGTEST_OUTPUT_2_TEST = \"gtest_xml_outfile2_test_\"\n\nEXPECTED_XML_1 = \"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\" name=\"AllTests\">\n  <testsuite name=\"PropertyOne\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"TestSomeProperties\" status=\"run\" time=\"*\" classname=\"PropertyOne\" SetUpProp=\"1\" TestSomeProperty=\"1\" TearDownProp=\"1\" />\n  </testsuite>\n</testsuites>\n\"\"\"\n\nEXPECTED_XML_2 = \"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\" name=\"AllTests\">\n  <testsuite name=\"PropertyTwo\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"TestSomeProperties\" status=\"run\" time=\"*\" classname=\"PropertyTwo\" SetUpProp=\"2\" TestSomeProperty=\"2\" TearDownProp=\"2\" />\n  </testsuite>\n</testsuites>\n\"\"\"\n\n\nclass GTestXMLOutFilesTest(gtest_xml_test_utils.GTestXMLTestCase):\n  \"\"\"Unit test for Google Test's XML output functionality.\"\"\"\n\n  def setUp(self):\n    # We want the trailing '/' that the last \"\" provides in os.path.join, for\n    # telling Google Test to create an output directory instead of a single file\n    # for xml output.\n    self.output_dir_ = os.path.join(gtest_test_utils.GetTempDir(),\n                                    GTEST_OUTPUT_SUBDIR, \"\")\n    self.DeleteFilesAndDir()\n\n  def tearDown(self):\n    self.DeleteFilesAndDir()\n\n  def DeleteFilesAndDir(self):\n    try:\n      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_1_TEST + \".xml\"))\n    except os.error:\n      pass\n    try:\n      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_2_TEST + \".xml\"))\n    except os.error:\n      pass\n    try:\n      os.rmdir(self.output_dir_)\n    except os.error:\n      pass\n\n  def testOutfile1(self):\n    self._TestOutFile(GTEST_OUTPUT_1_TEST, EXPECTED_XML_1)\n\n  def testOutfile2(self):\n    self._TestOutFile(GTEST_OUTPUT_2_TEST, EXPECTED_XML_2)\n\n  def _TestOutFile(self, test_name, expected_xml):\n    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(test_name)\n    command = [gtest_prog_path, \"--gtest_output=xml:%s\" % self.output_dir_]\n    p = gtest_test_utils.Subprocess(command,\n                                    working_dir=gtest_test_utils.GetTempDir())\n    self.assert_(p.exited)\n    self.assertEquals(0, p.exit_code)\n\n    # TODO(wan@google.com): libtool causes the built test binary to be\n    #   named lt-gtest_xml_outfiles_test_ instead of\n    #   gtest_xml_outfiles_test_.  To account for this possibillity, we\n    #   allow both names in the following code.  We should remove this\n    #   hack when Chandler Carruth's libtool replacement tool is ready.\n    output_file_name1 = test_name + \".xml\"\n    output_file1 = os.path.join(self.output_dir_, output_file_name1)\n    output_file_name2 = 'lt-' + output_file_name1\n    output_file2 = os.path.join(self.output_dir_, output_file_name2)\n    self.assert_(os.path.isfile(output_file1) or os.path.isfile(output_file2),\n                 output_file1)\n\n    expected = minidom.parseString(expected_xml)\n    if os.path.isfile(output_file1):\n      actual = minidom.parse(output_file1)\n    else:\n      actual = minidom.parse(output_file2)\n    self.NormalizeXml(actual.documentElement)\n    self.AssertEquivalentNodes(expected.documentElement,\n                               actual.documentElement)\n    expected.unlink()\n    actual.unlink()\n\n\nif __name__ == \"__main__\":\n  os.environ[\"GTEST_STACK_TRACE_DEPTH\"] = \"0\"\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test for the gtest_xml_output module\"\"\"\n\n__author__ = 'eefacm@gmail.com (Sean Mcafee)'\n\nimport errno\nimport os\nimport sys\nfrom xml.dom import minidom, Node\n\nimport gtest_test_utils\nimport gtest_xml_test_utils\n\n\nGTEST_OUTPUT_FLAG         = \"--gtest_output\"\nGTEST_DEFAULT_OUTPUT_FILE = \"test_detail.xml\"\nGTEST_PROGRAM_NAME = \"gtest_xml_output_unittest_\"\n\nSUPPORTS_STACK_TRACES = False\n\nif SUPPORTS_STACK_TRACES:\n  STACK_TRACE_TEMPLATE = \"\\nStack trace:\\n*\"\nelse:\n  STACK_TRACE_TEMPLATE = \"\"\n\nEXPECTED_NON_EMPTY_XML = \"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites tests=\"15\" failures=\"4\" disabled=\"2\" errors=\"0\" time=\"*\" name=\"AllTests\">\n  <testsuite name=\"SuccessfulTest\" tests=\"1\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"Succeeds\" status=\"run\" time=\"*\" classname=\"SuccessfulTest\"/>\n  </testsuite>\n  <testsuite name=\"FailedTest\" tests=\"1\" failures=\"1\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"Fails\" status=\"run\" time=\"*\" classname=\"FailedTest\">\n      <failure message=\"Value of: 2&#x0A;Expected: 1\" type=\"\"><![CDATA[gtest_xml_output_unittest_.cc:*\nValue of: 2\nExpected: 1%(stack)s]]></failure>\n    </testcase>\n  </testsuite>\n  <testsuite name=\"MixedResultTest\" tests=\"3\" failures=\"1\" disabled=\"1\" errors=\"0\" time=\"*\">\n    <testcase name=\"Succeeds\" status=\"run\" time=\"*\" classname=\"MixedResultTest\"/>\n    <testcase name=\"Fails\" status=\"run\" time=\"*\" classname=\"MixedResultTest\">\n      <failure message=\"Value of: 2&#x0A;Expected: 1\" type=\"\"><![CDATA[gtest_xml_output_unittest_.cc:*\nValue of: 2\nExpected: 1%(stack)s]]></failure>\n      <failure message=\"Value of: 3&#x0A;Expected: 2\" type=\"\"><![CDATA[gtest_xml_output_unittest_.cc:*\nValue of: 3\nExpected: 2%(stack)s]]></failure>\n    </testcase>\n    <testcase name=\"DISABLED_test\" status=\"notrun\" time=\"*\" classname=\"MixedResultTest\"/>\n  </testsuite>\n  <testsuite name=\"XmlQuotingTest\" tests=\"1\" failures=\"1\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"OutputsCData\" status=\"run\" time=\"*\" classname=\"XmlQuotingTest\">\n      <failure message=\"Failed&#x0A;XML output: &lt;?xml encoding=&quot;utf-8&quot;&gt;&lt;top&gt;&lt;![CDATA[cdata text]]&gt;&lt;/top&gt;\" type=\"\"><![CDATA[gtest_xml_output_unittest_.cc:*\nFailed\nXML output: <?xml encoding=\"utf-8\"><top><![CDATA[cdata text]]>]]&gt;<![CDATA[</top>%(stack)s]]></failure>\n    </testcase>\n  </testsuite>\n  <testsuite name=\"InvalidCharactersTest\" tests=\"1\" failures=\"1\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"InvalidCharactersInMessage\" status=\"run\" time=\"*\" classname=\"InvalidCharactersTest\">\n      <failure message=\"Failed&#x0A;Invalid characters in brackets []\" type=\"\"><![CDATA[gtest_xml_output_unittest_.cc:*\nFailed\nInvalid characters in brackets []%(stack)s]]></failure>\n    </testcase>\n  </testsuite>\n  <testsuite name=\"DisabledTest\" tests=\"1\" failures=\"0\" disabled=\"1\" errors=\"0\" time=\"*\">\n    <testcase name=\"DISABLED_test_not_run\" status=\"notrun\" time=\"*\" classname=\"DisabledTest\"/>\n  </testsuite>\n  <testsuite name=\"PropertyRecordingTest\" tests=\"4\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n    <testcase name=\"OneProperty\" status=\"run\" time=\"*\" classname=\"PropertyRecordingTest\" key_1=\"1\"/>\n    <testcase name=\"IntValuedProperty\" status=\"run\" time=\"*\" classname=\"PropertyRecordingTest\" key_int=\"1\"/>\n    <testcase name=\"ThreeProperties\" status=\"run\" time=\"*\" classname=\"PropertyRecordingTest\" key_1=\"1\" key_2=\"2\" key_3=\"3\"/>\n    <testcase name=\"TwoValuesForOneKeyUsesLastValue\" status=\"run\" time=\"*\" classname=\"PropertyRecordingTest\" key_1=\"2\"/>\n  </testsuite>\n  <testsuite name=\"NoFixtureTest\" tests=\"3\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\">\n     <testcase name=\"RecordProperty\" status=\"run\" time=\"*\" classname=\"NoFixtureTest\" key=\"1\"/>\n     <testcase name=\"ExternalUtilityThatCallsRecordIntValuedProperty\" status=\"run\" time=\"*\" classname=\"NoFixtureTest\" key_for_utility_int=\"1\"/>\n     <testcase name=\"ExternalUtilityThatCallsRecordStringValuedProperty\" status=\"run\" time=\"*\" classname=\"NoFixtureTest\" key_for_utility_string=\"1\"/>\n  </testsuite>\n</testsuites>\"\"\" % {'stack': STACK_TRACE_TEMPLATE}\n\n\nEXPECTED_EMPTY_XML = \"\"\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites tests=\"0\" failures=\"0\" disabled=\"0\" errors=\"0\" time=\"*\" name=\"AllTests\">\n</testsuites>\"\"\"\n\n\nclass GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):\n  \"\"\"\n  Unit test for Google Test's XML output functionality.\n  \"\"\"\n\n  def testNonEmptyXmlOutput(self):\n    \"\"\"\n    Runs a test program that generates a non-empty XML output, and\n    tests that the XML output is expected.\n    \"\"\"\n    self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_NON_EMPTY_XML, 1)\n\n  def testEmptyXmlOutput(self):\n    \"\"\"\n    Runs a test program that generates an empty XML output, and\n    tests that the XML output is expected.\n    \"\"\"\n\n    self._TestXmlOutput(\"gtest_no_test_unittest\",\n                        EXPECTED_EMPTY_XML, 0)\n\n  def testDefaultOutputFile(self):\n    \"\"\"\n    Confirms that Google Test produces an XML output file with the expected\n    default name if no name is explicitly specified.\n    \"\"\"\n    output_file = os.path.join(gtest_test_utils.GetTempDir(),\n                               GTEST_DEFAULT_OUTPUT_FILE)\n    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(\n        \"gtest_no_test_unittest\")\n    try:\n      os.remove(output_file)\n    except OSError, e:\n      if e.errno != errno.ENOENT:\n        raise\n\n    p = gtest_test_utils.Subprocess(\n        [gtest_prog_path, \"%s=xml\" % GTEST_OUTPUT_FLAG],\n        working_dir=gtest_test_utils.GetTempDir())\n    self.assert_(p.exited)\n    self.assertEquals(0, p.exit_code)\n    self.assert_(os.path.isfile(output_file))\n\n  def testSuppressedXmlOutput(self):\n    \"\"\"\n    Tests that no XML file is generated if the default XML listener is\n    shut down before RUN_ALL_TESTS is invoked.\n    \"\"\"\n\n    xml_path = os.path.join(gtest_test_utils.GetTempDir(),\n                            GTEST_PROGRAM_NAME + \"out.xml\")\n    if os.path.isfile(xml_path):\n      os.remove(xml_path)\n\n    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(GTEST_PROGRAM_NAME)\n\n    command = [gtest_prog_path,\n               \"%s=xml:%s\" % (GTEST_OUTPUT_FLAG, xml_path),\n               \"--shut_down_xml\"]\n    p = gtest_test_utils.Subprocess(command)\n    if p.terminated_by_signal:\n      self.assert_(False,\n                   \"%s was killed by signal %d\" % (gtest_prog_name, p.signal))\n    else:\n      self.assert_(p.exited)\n      self.assertEquals(1, p.exit_code,\n                        \"'%s' exited with code %s, which doesn't match \"\n                        \"the expected exit code %s.\"\n                        % (command, p.exit_code, 1))\n\n    self.assert_(not os.path.isfile(xml_path))\n\n\n  def _TestXmlOutput(self, gtest_prog_name, expected_xml, expected_exit_code):\n    \"\"\"\n    Asserts that the XML document generated by running the program\n    gtest_prog_name matches expected_xml, a string containing another\n    XML document.  Furthermore, the program's exit code must be\n    expected_exit_code.\n    \"\"\"\n    xml_path = os.path.join(gtest_test_utils.GetTempDir(),\n                            gtest_prog_name + \"out.xml\")\n    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(gtest_prog_name)\n\n    command = [gtest_prog_path, \"%s=xml:%s\" % (GTEST_OUTPUT_FLAG, xml_path)]\n    p = gtest_test_utils.Subprocess(command)\n    if p.terminated_by_signal:\n      self.assert_(False,\n                   \"%s was killed by signal %d\" % (gtest_prog_name, p.signal))\n    else:\n      self.assert_(p.exited)\n      self.assertEquals(expected_exit_code, p.exit_code,\n                        \"'%s' exited with code %s, which doesn't match \"\n                        \"the expected exit code %s.\"\n                        % (command, p.exit_code, expected_exit_code))\n\n    expected = minidom.parseString(expected_xml)\n    actual   = minidom.parse(xml_path)\n    self.NormalizeXml(actual.documentElement)\n    self.AssertEquivalentNodes(expected.documentElement,\n                               actual.documentElement)\n    expected.unlink()\n    actual  .unlink()\n\n\n\nif __name__ == '__main__':\n  os.environ['GTEST_STACK_TRACE_DEPTH'] = '1'\n  gtest_test_utils.Main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest_.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: eefacm@gmail.com (Sean Mcafee)\n\n// Unit test for Google Test XML output.\n//\n// A user can specify XML output in a Google Test program to run via\n// either the GTEST_OUTPUT environment variable or the --gtest_output\n// flag.  This is used for testing such functionality.\n//\n// This program will be invoked from a Python unit test.  Don't run it\n// directly.\n\n#include <gtest/gtest.h>\n\nusing ::testing::InitGoogleTest;\nusing ::testing::TestEventListeners;\nusing ::testing::UnitTest;\n\nclass SuccessfulTest : public testing::Test {\n};\n\nTEST_F(SuccessfulTest, Succeeds) {\n  SUCCEED() << \"This is a success.\";\n  ASSERT_EQ(1, 1);\n}\n\nclass FailedTest : public testing::Test {\n};\n\nTEST_F(FailedTest, Fails) {\n  ASSERT_EQ(1, 2);\n}\n\nclass DisabledTest : public testing::Test {\n};\n\nTEST_F(DisabledTest, DISABLED_test_not_run) {\n  FAIL() << \"Unexpected failure: Disabled test should not be run\";\n}\n\nTEST(MixedResultTest, Succeeds) {\n  EXPECT_EQ(1, 1);\n  ASSERT_EQ(1, 1);\n}\n\nTEST(MixedResultTest, Fails) {\n  EXPECT_EQ(1, 2);\n  ASSERT_EQ(2, 3);\n}\n\nTEST(MixedResultTest, DISABLED_test) {\n  FAIL() << \"Unexpected failure: Disabled test should not be run\";\n}\n\nTEST(XmlQuotingTest, OutputsCData) {\n  FAIL() << \"XML output: \"\n            \"<?xml encoding=\\\"utf-8\\\"><top><![CDATA[cdata text]]></top>\";\n}\n\n// Helps to test that invalid characters produced by test code do not make\n// it into the XML file.\nTEST(InvalidCharactersTest, InvalidCharactersInMessage) {\n  FAIL() << \"Invalid characters in brackets [\\x1\\x2]\";\n}\n\nclass PropertyRecordingTest : public testing::Test {\n};\n\nTEST_F(PropertyRecordingTest, OneProperty) {\n  RecordProperty(\"key_1\", \"1\");\n}\n\nTEST_F(PropertyRecordingTest, IntValuedProperty) {\n  RecordProperty(\"key_int\", 1);\n}\n\nTEST_F(PropertyRecordingTest, ThreeProperties) {\n  RecordProperty(\"key_1\", \"1\");\n  RecordProperty(\"key_2\", \"2\");\n  RecordProperty(\"key_3\", \"3\");\n}\n\nTEST_F(PropertyRecordingTest, TwoValuesForOneKeyUsesLastValue) {\n  RecordProperty(\"key_1\", \"1\");\n  RecordProperty(\"key_1\", \"2\");\n}\n\nTEST(NoFixtureTest, RecordProperty) {\n  RecordProperty(\"key\", \"1\");\n}\n\nvoid ExternalUtilityThatCallsRecordProperty(const char* key, int value) {\n  testing::Test::RecordProperty(key, value);\n}\n\nvoid ExternalUtilityThatCallsRecordProperty(const char* key,\n                                            const char* value) {\n  testing::Test::RecordProperty(key, value);\n}\n\nTEST(NoFixtureTest, ExternalUtilityThatCallsRecordIntValuedProperty) {\n  ExternalUtilityThatCallsRecordProperty(\"key_for_utility_int\", 1);\n}\n\nTEST(NoFixtureTest, ExternalUtilityThatCallsRecordStringValuedProperty) {\n  ExternalUtilityThatCallsRecordProperty(\"key_for_utility_string\", \"1\");\n}\n\nint main(int argc, char** argv) {\n  InitGoogleTest(&argc, argv);\n\n  if (argc > 1 && strcmp(argv[1], \"--shut_down_xml\") == 0) {\n    TestEventListeners& listeners = UnitTest::GetInstance()->listeners();\n    delete listeners.Release(listeners.default_xml_generator());\n  }\n  return RUN_ALL_TESTS();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_test_utils.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2006, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unit test utilities for gtest_xml_output\"\"\"\n\n__author__ = 'eefacm@gmail.com (Sean Mcafee)'\n\nimport re\nfrom xml.dom import minidom, Node\n\nimport gtest_test_utils\n\n\nGTEST_OUTPUT_FLAG         = \"--gtest_output\"\nGTEST_DEFAULT_OUTPUT_FILE = \"test_detail.xml\"\n\nclass GTestXMLTestCase(gtest_test_utils.TestCase):\n  \"\"\"\n  Base class for tests of Google Test's XML output functionality.\n  \"\"\"\n\n\n  def AssertEquivalentNodes(self, expected_node, actual_node):\n    \"\"\"\n    Asserts that actual_node (a DOM node object) is equivalent to\n    expected_node (another DOM node object), in that either both of\n    them are CDATA nodes and have the same value, or both are DOM\n    elements and actual_node meets all of the following conditions:\n\n    *  It has the same tag name as expected_node.\n    *  It has the same set of attributes as expected_node, each with\n       the same value as the corresponding attribute of expected_node.\n       An exception is any attribute named \"time\", which needs only be\n       convertible to a floating-point number.\n    *  It has an equivalent set of child nodes (including elements and\n       CDATA sections) as expected_node.  Note that we ignore the\n       order of the children as they are not guaranteed to be in any\n       particular order.\n    \"\"\"\n\n    if expected_node.nodeType == Node.CDATA_SECTION_NODE:\n      self.assertEquals(Node.CDATA_SECTION_NODE, actual_node.nodeType)\n      self.assertEquals(expected_node.nodeValue, actual_node.nodeValue)\n      return\n\n    self.assertEquals(Node.ELEMENT_NODE, actual_node.nodeType)\n    self.assertEquals(Node.ELEMENT_NODE, expected_node.nodeType)\n    self.assertEquals(expected_node.tagName, actual_node.tagName)\n\n    expected_attributes = expected_node.attributes\n    actual_attributes   = actual_node  .attributes\n    self.assertEquals(\n        expected_attributes.length, actual_attributes.length,\n        \"attribute numbers differ in element \" + actual_node.tagName)\n    for i in range(expected_attributes.length):\n      expected_attr = expected_attributes.item(i)\n      actual_attr   = actual_attributes.get(expected_attr.name)\n      self.assert_(\n          actual_attr is not None,\n          \"expected attribute %s not found in element %s\" %\n          (expected_attr.name, actual_node.tagName))\n      self.assertEquals(expected_attr.value, actual_attr.value,\n                        \" values of attribute %s in element %s differ\" %\n                        (expected_attr.name, actual_node.tagName))\n\n    expected_children = self._GetChildren(expected_node)\n    actual_children = self._GetChildren(actual_node)\n    self.assertEquals(\n        len(expected_children), len(actual_children),\n        \"number of child elements differ in element \" + actual_node.tagName)\n    for child_id, child in expected_children.iteritems():\n      self.assert_(child_id in actual_children,\n                   '<%s> is not in <%s> (in element %s)' %\n                   (child_id, actual_children, actual_node.tagName))\n      self.AssertEquivalentNodes(child, actual_children[child_id])\n\n  identifying_attribute = {\n    \"testsuites\": \"name\",\n    \"testsuite\": \"name\",\n    \"testcase\":  \"name\",\n    \"failure\":   \"message\",\n    }\n\n  def _GetChildren(self, element):\n    \"\"\"\n    Fetches all of the child nodes of element, a DOM Element object.\n    Returns them as the values of a dictionary keyed by the IDs of the\n    children.  For <testsuites>, <testsuite> and <testcase> elements, the ID\n    is the value of their \"name\" attribute; for <failure> elements, it is\n    the value of the \"message\" attribute; CDATA sections and non-whitespace\n    text nodes are concatenated into a single CDATA section with ID\n    \"detail\".  An exception is raised if any element other than the above\n    four is encountered, if two child elements with the same identifying\n    attributes are encountered, or if any other type of node is encountered.\n    \"\"\"\n\n    children = {}\n    for child in element.childNodes:\n      if child.nodeType == Node.ELEMENT_NODE:\n        self.assert_(child.tagName in self.identifying_attribute,\n                     \"Encountered unknown element <%s>\" % child.tagName)\n        childID = child.getAttribute(self.identifying_attribute[child.tagName])\n        self.assert_(childID not in children)\n        children[childID] = child\n      elif child.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]:\n        if \"detail\" not in children:\n          if (child.nodeType == Node.CDATA_SECTION_NODE or\n              not child.nodeValue.isspace()):\n            children[\"detail\"] = child.ownerDocument.createCDATASection(\n                child.nodeValue)\n        else:\n          children[\"detail\"].nodeValue += child.nodeValue\n      else:\n        self.fail(\"Encountered unexpected node type %d\" % child.nodeType)\n    return children\n\n  def NormalizeXml(self, element):\n    \"\"\"\n    Normalizes Google Test's XML output to eliminate references to transient\n    information that may change from run to run.\n\n    *  The \"time\" attribute of <testsuites>, <testsuite> and <testcase>\n       elements is replaced with a single asterisk, if it contains\n       only digit characters.\n    *  The line number reported in the first line of the \"message\"\n       attribute of <failure> elements is replaced with a single asterisk.\n    *  The directory names in file paths are removed.\n    *  The stack traces are removed.\n    \"\"\"\n\n    if element.tagName in (\"testsuites\", \"testsuite\", \"testcase\"):\n      time = element.getAttributeNode(\"time\")\n      time.value = re.sub(r\"^\\d+(\\.\\d+)?$\", \"*\", time.value)\n    elif element.tagName == \"failure\":\n      for child in element.childNodes:\n        if child.nodeType == Node.CDATA_SECTION_NODE:\n          # Removes the source line number.\n          cdata = re.sub(r\"^.*[/\\\\](.*:)\\d+\\n\", \"\\\\1*\\n\", child.nodeValue)\n          # Removes the actual stack trace.\n          child.nodeValue = re.sub(r\"\\nStack trace:\\n(.|\\n)*\",\n                                   \"\", cdata)\n    for child in element.childNodes:\n      if child.nodeType == Node.ELEMENT_NODE:\n        self.NormalizeXml(child)\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.cc",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// This is part of the unit test for include/gtest/gtest_prod.h.\n\n#include \"production.h\"\n\nPrivateCode::PrivateCode() : x_(0) {}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.h",
    "content": "// Copyright 2006, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: wan@google.com (Zhanyong Wan)\n//\n// This is part of the unit test for include/gtest/gtest_prod.h.\n\n#ifndef GTEST_TEST_PRODUCTION_H_\n#define GTEST_TEST_PRODUCTION_H_\n\n#include <gtest/gtest_prod.h>\n\nclass PrivateCode {\n public:\n  // Declares a friend test that does not use a fixture.\n  FRIEND_TEST(PrivateCodeTest, CanAccessPrivateMembers);\n\n  // Declares a friend test that uses a fixture.\n  FRIEND_TEST(PrivateCodeFixtureTest, CanAccessPrivateMembers);\n\n  PrivateCode();\n\n  int x() const { return x_; }\n private:\n  void set_x(int an_x) { x_ = an_x; }\n  int x_;\n};\n\n#endif  // GTEST_TEST_PRODUCTION_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util.py",
    "content": "# Copyright 2008 Google Inc. All Rights Reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Provides facilities for running SCons-built Google Test/Mock tests.\"\"\"\n\n\nimport optparse\nimport os\nimport re\nimport sets\nimport sys\n\ntry:\n  # subrocess module is a preferable way to invoke subprocesses but it may\n  # not be available on MacOS X 10.4.\n  # Suppresses the 'Import not at the top of the file' lint complaint.\n  # pylint: disable-msg=C6204\n  import subprocess\nexcept ImportError:\n  subprocess = None\n\nHELP_MSG = \"\"\"Runs the specified tests for %(proj)s.\n\nSYNOPSIS\n       run_tests.py [OPTION]... [BUILD_DIR]... [TEST]...\n\nDESCRIPTION\n       Runs the specified tests (either binary or Python), and prints a\n       summary of the results. BUILD_DIRS will be used to search for the\n       binaries. If no TESTs are specified, all binary tests found in\n       BUILD_DIRs and all Python tests found in the directory test/ (in the\n       %(proj)s root) are run.\n\n       TEST is a name of either a binary or a Python test. A binary test is\n       an executable file named *_test or *_unittest (with the .exe\n       extension on Windows) A Python test is a script named *_test.py or\n       *_unittest.py.\n\nOPTIONS\n       -h, --help\n              Print this help message.\n       -c CONFIGURATIONS\n              Specify build directories via build configurations.\n              CONFIGURATIONS is either a comma-separated list of build\n              configurations or 'all'. Each configuration is equivalent to\n              adding 'scons/build/<configuration>/%(proj)s/scons' to BUILD_DIRs.\n              Specifying -c=all is equivalent to providing all directories\n              listed in KNOWN BUILD DIRECTORIES section below.\n       -a\n              Equivalent to -c=all\n       -b\n              Equivalent to -c=all with the exception that the script will not\n              fail if some of the KNOWN BUILD DIRECTORIES do not exists; the\n              script will simply not run the tests there. 'b' stands for\n              'built directories'.\n\nRETURN VALUE\n       Returns 0 if all tests are successful; otherwise returns 1.\n\nEXAMPLES\n       run_tests.py\n              Runs all tests for the default build configuration.\n       run_tests.py -a\n              Runs all tests with binaries in KNOWN BUILD DIRECTORIES.\n       run_tests.py -b\n              Runs all tests in KNOWN BUILD DIRECTORIES that have been\n              built.\n       run_tests.py foo/\n              Runs all tests in the foo/ directory and all Python tests in\n              the directory test. The Python tests are instructed to look\n              for binaries in foo/.\n       run_tests.py bar_test.exe test/baz_test.exe foo/ bar/\n              Runs foo/bar_test.exe, bar/bar_test.exe, foo/baz_test.exe, and\n              bar/baz_test.exe.\n       run_tests.py foo bar test/foo_test.py\n              Runs test/foo_test.py twice instructing it to look for its\n              test binaries in the directories foo and bar,\n              correspondingly.\n\nKNOWN BUILD DIRECTORIES\n      run_tests.py knows about directories where the SCons build script\n      deposits its products. These are the directories where run_tests.py\n      will be looking for its binaries. Currently, %(proj)s's SConstruct file\n      defines them as follows (the default build directory is the first one\n      listed in each group):\n      On Windows:\n              <%(proj)s root>/scons/build/win-dbg8/%(proj)s/scons/\n              <%(proj)s root>/scons/build/win-opt8/%(proj)s/scons/\n      On Mac:\n              <%(proj)s root>/scons/build/mac-dbg/%(proj)s/scons/\n              <%(proj)s root>/scons/build/mac-opt/%(proj)s/scons/\n      On other platforms:\n              <%(proj)s root>/scons/build/dbg/%(proj)s/scons/\n              <%(proj)s root>/scons/build/opt/%(proj)s/scons/\"\"\"\n\nIS_WINDOWS = os.name == 'nt'\nIS_MAC = os.name == 'posix' and os.uname()[0] == 'Darwin'\nIS_CYGWIN = os.name == 'posix' and 'CYGWIN' in os.uname()[0]\n\n# Definition of CONFIGS must match that of the build directory names in the\n# SConstruct script. The first list item is the default build configuration.\nif IS_WINDOWS:\n  CONFIGS = ('win-dbg8', 'win-opt8')\nelif IS_MAC:\n  CONFIGS = ('mac-dbg', 'mac-opt')\nelse:\n  CONFIGS = ('dbg', 'opt')\n\nif IS_WINDOWS or IS_CYGWIN:\n  PYTHON_TEST_REGEX = re.compile(r'_(unit)?test\\.py$', re.IGNORECASE)\n  BINARY_TEST_REGEX = re.compile(r'_(unit)?test(\\.exe)?$', re.IGNORECASE)\n  BINARY_TEST_SEARCH_REGEX = re.compile(r'_(unit)?test\\.exe$', re.IGNORECASE)\nelse:\n  PYTHON_TEST_REGEX = re.compile(r'_(unit)?test\\.py$')\n  BINARY_TEST_REGEX = re.compile(r'_(unit)?test$')\n  BINARY_TEST_SEARCH_REGEX = BINARY_TEST_REGEX\n\n\ndef _GetGtestBuildDir(injected_os, script_dir, config):\n  \"\"\"Calculates path to the Google Test SCons build directory.\"\"\"\n\n  return injected_os.path.normpath(injected_os.path.join(script_dir,\n                                                         'scons/build',\n                                                         config,\n                                                         'gtest/scons'))\n\n\ndef _GetConfigFromBuildDir(build_dir):\n  \"\"\"Extracts the configuration name from the build directory.\"\"\"\n\n  # We don't want to depend on build_dir containing the correct path\n  # separators.\n  m = re.match(r'.*[\\\\/]([^\\\\/]+)[\\\\/][^\\\\/]+[\\\\/]scons[\\\\/]?$', build_dir)\n  if m:\n    return m.group(1)\n  else:\n    print >>sys.stderr, ('%s is an invalid build directory that does not '\n                         'correspond to any configuration.' % (build_dir,))\n    return ''\n\n\n# All paths in this script are either absolute or relative to the current\n# working directory, unless otherwise specified.\nclass TestRunner(object):\n  \"\"\"Provides facilities for running Python and binary tests for Google Test.\"\"\"\n\n  def __init__(self,\n               script_dir,\n               build_dir_var_name='GTEST_BUILD_DIR',\n               injected_os=os,\n               injected_subprocess=subprocess,\n               injected_build_dir_finder=_GetGtestBuildDir):\n    \"\"\"Initializes a TestRunner instance.\n\n    Args:\n      script_dir:                File path to the calling script.\n      build_dir_var_name:        Name of the env variable used to pass the\n                                 the build directory path to the invoked\n                                 tests.\n      injected_os:               standard os module or a mock/stub for\n                                 testing.\n      injected_subprocess:       standard subprocess module or a mock/stub\n                                 for testing\n      injected_build_dir_finder: function that determines the path to\n                                 the build directory.\n    \"\"\"\n\n    self.os = injected_os\n    self.subprocess = injected_subprocess\n    self.build_dir_finder = injected_build_dir_finder\n    self.build_dir_var_name = build_dir_var_name\n    self.script_dir = script_dir\n\n  def _GetBuildDirForConfig(self, config):\n    \"\"\"Returns the build directory for a given configuration.\"\"\"\n\n    return self.build_dir_finder(self.os, self.script_dir, config)\n\n  def _Run(self, args):\n    \"\"\"Runs the executable with given args (args[0] is the executable name).\n\n    Args:\n      args: Command line arguments for the process.\n\n    Returns:\n      Process's exit code if it exits normally, or -signal if the process is\n      killed by a signal.\n    \"\"\"\n\n    if self.subprocess:\n      return self.subprocess.Popen(args).wait()\n    else:\n      return self.os.spawnv(self.os.P_WAIT, args[0], args)\n\n  def _RunBinaryTest(self, test):\n    \"\"\"Runs the binary test given its path.\n\n    Args:\n      test: Path to the test binary.\n\n    Returns:\n      Process's exit code if it exits normally, or -signal if the process is\n      killed by a signal.\n    \"\"\"\n\n    return self._Run([test])\n\n  def _RunPythonTest(self, test, build_dir):\n    \"\"\"Runs the Python test script with the specified build directory.\n\n    Args:\n      test: Path to the test's Python script.\n      build_dir: Path to the directory where the test binary is to be found.\n\n    Returns:\n      Process's exit code if it exits normally, or -signal if the process is\n      killed by a signal.\n    \"\"\"\n\n    old_build_dir = self.os.environ.get(self.build_dir_var_name)\n\n    try:\n      self.os.environ[self.build_dir_var_name] = build_dir\n\n      # If this script is run on a Windows machine that has no association\n      # between the .py extension and a python interpreter, simply passing\n      # the script name into subprocess.Popen/os.spawn will not work.\n      print 'Running %s . . .' % (test,)\n      return self._Run([sys.executable, test])\n\n    finally:\n      if old_build_dir is None:\n        del self.os.environ[self.build_dir_var_name]\n      else:\n        self.os.environ[self.build_dir_var_name] = old_build_dir\n\n  def _FindFilesByRegex(self, directory, regex):\n    \"\"\"Returns files in a directory whose names match a regular expression.\n\n    Args:\n      directory: Path to the directory to search for files.\n      regex: Regular expression to filter file names.\n\n    Returns:\n      The list of the paths to the files in the directory.\n    \"\"\"\n\n    return [self.os.path.join(directory, file_name)\n            for file_name in self.os.listdir(directory)\n            if re.search(regex, file_name)]\n\n  # TODO(vladl@google.com): Implement parsing of scons/SConscript to run all\n  # tests defined there when no tests are specified.\n  # TODO(vladl@google.com): Update the docstring after the code is changed to\n  # try to test all builds defined in scons/SConscript.\n  def GetTestsToRun(self,\n                    args,\n                    named_configurations,\n                    built_configurations,\n                    available_configurations=CONFIGS,\n                    python_tests_to_skip=None):\n    \"\"\"Determines what tests should be run.\n\n    Args:\n      args: The list of non-option arguments from the command line.\n      named_configurations: The list of configurations specified via -c or -a.\n      built_configurations: True if -b has been specified.\n      available_configurations: a list of configurations available on the\n                            current platform, injectable for testing.\n      python_tests_to_skip: a collection of (configuration, python test name)s\n                            that need to be skipped.\n\n    Returns:\n      A tuple with 2 elements: the list of Python tests to run and the list of\n      binary tests to run.\n    \"\"\"\n\n    if named_configurations == 'all':\n      named_configurations = ','.join(available_configurations)\n\n    normalized_args = [self.os.path.normpath(arg) for arg in args]\n\n    # A final list of build directories which will be searched for the test\n    # binaries. First, add directories specified directly on the command\n    # line.\n    build_dirs = filter(self.os.path.isdir, normalized_args)\n\n    # Adds build directories specified via their build configurations using\n    # the -c or -a options.\n    if named_configurations:\n      build_dirs += [self._GetBuildDirForConfig(config)\n                     for config in named_configurations.split(',')]\n\n    # Adds KNOWN BUILD DIRECTORIES if -b is specified.\n    if built_configurations:\n      build_dirs += [self._GetBuildDirForConfig(config)\n                     for config in available_configurations\n                     if self.os.path.isdir(self._GetBuildDirForConfig(config))]\n\n    # If no directories were specified either via -a, -b, -c, or directly, use\n    # the default configuration.\n    elif not build_dirs:\n      build_dirs = [self._GetBuildDirForConfig(available_configurations[0])]\n\n    # Makes sure there are no duplications.\n    build_dirs = sets.Set(build_dirs)\n\n    errors_found = False\n    listed_python_tests = []  # All Python tests listed on the command line.\n    listed_binary_tests = []  # All binary tests listed on the command line.\n\n    test_dir = self.os.path.normpath(self.os.path.join(self.script_dir, 'test'))\n\n    # Sifts through non-directory arguments fishing for any Python or binary\n    # tests and detecting errors.\n    for argument in sets.Set(normalized_args) - build_dirs:\n      if re.search(PYTHON_TEST_REGEX, argument):\n        python_path = self.os.path.join(test_dir,\n                                        self.os.path.basename(argument))\n        if self.os.path.isfile(python_path):\n          listed_python_tests.append(python_path)\n        else:\n          sys.stderr.write('Unable to find Python test %s' % argument)\n          errors_found = True\n      elif re.search(BINARY_TEST_REGEX, argument):\n        # This script also accepts binary test names prefixed with test/ for\n        # the convenience of typing them (can use path completions in the\n        # shell).  Strips test/ prefix from the binary test names.\n        listed_binary_tests.append(self.os.path.basename(argument))\n      else:\n        sys.stderr.write('%s is neither test nor build directory' % argument)\n        errors_found = True\n\n    if errors_found:\n      return None\n\n    user_has_listed_tests = listed_python_tests or listed_binary_tests\n\n    if user_has_listed_tests:\n      selected_python_tests = listed_python_tests\n    else:\n      selected_python_tests = self._FindFilesByRegex(test_dir,\n                                                     PYTHON_TEST_REGEX)\n\n    # TODO(vladl@google.com): skip unbuilt Python tests when -b is specified.\n    python_test_pairs = []\n    for directory in build_dirs:\n      for test in selected_python_tests:\n        config = _GetConfigFromBuildDir(directory)\n        file_name = os.path.basename(test)\n        if python_tests_to_skip and (config, file_name) in python_tests_to_skip:\n          print ('NOTE: %s is skipped for configuration %s, as it does not '\n                 'work there.' % (file_name, config))\n        else:\n          python_test_pairs.append((directory, test))\n\n    binary_test_pairs = []\n    for directory in build_dirs:\n      if user_has_listed_tests:\n        binary_test_pairs.extend(\n            [(directory, self.os.path.join(directory, test))\n             for test in listed_binary_tests])\n      else:\n        tests = self._FindFilesByRegex(directory, BINARY_TEST_SEARCH_REGEX)\n        binary_test_pairs.extend([(directory, test) for test in tests])\n\n    return (python_test_pairs, binary_test_pairs)\n\n  def RunTests(self, python_tests, binary_tests):\n    \"\"\"Runs Python and binary tests and reports results to the standard output.\n\n    Args:\n      python_tests: List of Python tests to run in the form of tuples\n                    (build directory, Python test script).\n      binary_tests: List of binary tests to run in the form of tuples\n                    (build directory, binary file).\n\n    Returns:\n      The exit code the program should pass into sys.exit().\n    \"\"\"\n\n    if python_tests or binary_tests:\n      results = []\n      for directory, test in python_tests:\n        results.append((directory,\n                        test,\n                        self._RunPythonTest(test, directory) == 0))\n      for directory, test in binary_tests:\n        results.append((directory,\n                        self.os.path.basename(test),\n                        self._RunBinaryTest(test) == 0))\n\n      failed = [(directory, test)\n                for (directory, test, success) in results\n                if not success]\n      print\n      print '%d tests run.' % len(results)\n      if failed:\n        print 'The following %d tests failed:' % len(failed)\n        for (directory, test) in failed:\n          print '%s in %s' % (test, directory)\n        return 1\n      else:\n        print 'All tests passed!'\n    else:  # No tests defined\n      print 'Nothing to test - no tests specified!'\n\n    return 0\n\n\ndef ParseArgs(project_name, argv=None, help_callback=None):\n  \"\"\"Parses the options run_tests.py uses.\"\"\"\n\n  # Suppresses lint warning on unused arguments.  These arguments are\n  # required by optparse, even though they are unused.\n  # pylint: disable-msg=W0613\n  def PrintHelp(option, opt, value, parser):\n    print HELP_MSG % {'proj': project_name}\n    sys.exit(1)\n\n  parser = optparse.OptionParser()\n  parser.add_option('-c',\n                    action='store',\n                    dest='configurations',\n                    default=None)\n  parser.add_option('-a',\n                    action='store_const',\n                    dest='configurations',\n                    default=None,\n                    const='all')\n  parser.add_option('-b',\n                    action='store_const',\n                    dest='built_configurations',\n                    default=False,\n                    const=True)\n  # Replaces the built-in help with ours.\n  parser.remove_option('-h')\n  parser.add_option('-h', '--help',\n                    action='callback',\n                    callback=help_callback or PrintHelp)\n  return parser.parse_args(argv)\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util_test.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2009 Google Inc. All Rights Reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Tests for run_tests_util.py test runner script.\"\"\"\n\n__author__ = 'vladl@google.com (Vlad Losev)'\n\nimport os\nimport re\nimport sets\nimport unittest\n\nimport run_tests_util\n\n\nGTEST_DBG_DIR = 'scons/build/dbg/gtest/scons'\nGTEST_OPT_DIR = 'scons/build/opt/gtest/scons'\nGTEST_OTHER_DIR = 'scons/build/other/gtest/scons'\n\n\ndef AddExeExtension(path):\n  \"\"\"Appends .exe to the path on Windows or Cygwin.\"\"\"\n\n  if run_tests_util.IS_WINDOWS or run_tests_util.IS_CYGWIN:\n    return path + '.exe'\n  else:\n    return path\n\n\nclass FakePath(object):\n  \"\"\"A fake os.path module for testing.\"\"\"\n\n  def __init__(self, current_dir=os.getcwd(), known_paths=None):\n    self.current_dir = current_dir\n    self.tree = {}\n    self.path_separator = os.sep\n\n    # known_paths contains either absolute or relative paths. Relative paths\n    # are absolutized with self.current_dir.\n    if known_paths:\n      self._AddPaths(known_paths)\n\n  def _AddPath(self, path):\n    ends_with_slash = path.endswith('/')\n    path = self.abspath(path)\n    if ends_with_slash:\n      path += self.path_separator\n    name_list = path.split(self.path_separator)\n    tree = self.tree\n    for name in name_list[:-1]:\n      if not name:\n        continue\n      if name in tree:\n        tree = tree[name]\n      else:\n        tree[name] = {}\n        tree = tree[name]\n\n    name = name_list[-1]\n    if name:\n      if name in tree:\n        assert tree[name] == 1\n      else:\n        tree[name] = 1\n\n  def _AddPaths(self, paths):\n    for path in paths:\n      self._AddPath(path)\n\n  def PathElement(self, path):\n    \"\"\"Returns an internal representation of directory tree entry for path.\"\"\"\n    tree = self.tree\n    name_list = self.abspath(path).split(self.path_separator)\n    for name in name_list:\n      if not name:\n        continue\n      tree = tree.get(name, None)\n      if tree is None:\n        break\n\n    return tree\n\n  # Silences pylint warning about using standard names.\n  # pylint: disable-msg=C6409\n  def normpath(self, path):\n    return os.path.normpath(path)\n\n  def abspath(self, path):\n    return self.normpath(os.path.join(self.current_dir, path))\n\n  def isfile(self, path):\n    return self.PathElement(self.abspath(path)) == 1\n\n  def isdir(self, path):\n    return type(self.PathElement(self.abspath(path))) == type(dict())\n\n  def basename(self, path):\n    return os.path.basename(path)\n\n  def dirname(self, path):\n    return os.path.dirname(path)\n\n  def join(self, *kargs):\n    return os.path.join(*kargs)\n\n\nclass FakeOs(object):\n  \"\"\"A fake os module for testing.\"\"\"\n  P_WAIT = os.P_WAIT\n\n  def __init__(self, fake_path_module):\n    self.path = fake_path_module\n\n    # Some methods/attributes are delegated to the real os module.\n    self.environ = os.environ\n\n  # pylint: disable-msg=C6409\n  def listdir(self, path):\n    assert self.path.isdir(path)\n    return self.path.PathElement(path).iterkeys()\n\n  def spawnv(self, wait, executable, *kargs):\n    assert wait == FakeOs.P_WAIT\n    return self.spawn_impl(executable, kargs)\n\n\nclass GetTestsToRunTest(unittest.TestCase):\n  \"\"\"Exercises TestRunner.GetTestsToRun.\"\"\"\n\n  def NormalizeGetTestsToRunResults(self, results):\n    \"\"\"Normalizes path data returned from GetTestsToRun for comparison.\"\"\"\n\n    def NormalizePythonTestPair(pair):\n      \"\"\"Normalizes path data in the (directory, python_script) pair.\"\"\"\n\n      return (os.path.normpath(pair[0]), os.path.normpath(pair[1]))\n\n    def NormalizeBinaryTestPair(pair):\n      \"\"\"Normalizes path data in the (directory, binary_executable) pair.\"\"\"\n\n      directory, executable = map(os.path.normpath, pair)\n\n      # On Windows and Cygwin, the test file names have the .exe extension, but\n      # they can be invoked either by name or by name+extension. Our test must\n      # accommodate both situations.\n      if run_tests_util.IS_WINDOWS or run_tests_util.IS_CYGWIN:\n        executable = re.sub(r'\\.exe$', '', executable)\n      return (directory, executable)\n\n    python_tests = sets.Set(map(NormalizePythonTestPair, results[0]))\n    binary_tests = sets.Set(map(NormalizeBinaryTestPair, results[1]))\n    return (python_tests, binary_tests)\n\n  def AssertResultsEqual(self, results, expected):\n    \"\"\"Asserts results returned by GetTestsToRun equal to expected results.\"\"\"\n\n    self.assertEqual(self.NormalizeGetTestsToRunResults(results),\n                     self.NormalizeGetTestsToRunResults(expected),\n                     'Incorrect set of tests returned:\\n%s\\nexpected:\\n%s' %\n                     (results, expected))\n\n  def setUp(self):\n    self.fake_os = FakeOs(FakePath(\n        current_dir=os.path.abspath(os.path.dirname(run_tests_util.__file__)),\n        known_paths=[AddExeExtension(GTEST_DBG_DIR + '/gtest_unittest'),\n                     AddExeExtension(GTEST_OPT_DIR + '/gtest_unittest'),\n                     'test/gtest_color_test.py']))\n    self.fake_configurations = ['dbg', 'opt']\n    self.test_runner = run_tests_util.TestRunner(script_dir='.',\n                                                 injected_os=self.fake_os,\n                                                 injected_subprocess=None)\n\n  def testBinaryTestsOnly(self):\n    \"\"\"Exercises GetTestsToRun with parameters designating binary tests only.\"\"\"\n\n    # A default build.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            ['gtest_unittest'],\n            '',\n            False,\n            available_configurations=self.fake_configurations),\n        ([],\n         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]))\n\n    # An explicitly specified directory.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            [GTEST_DBG_DIR, 'gtest_unittest'],\n            '',\n            False,\n            available_configurations=self.fake_configurations),\n        ([],\n         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]))\n\n    # A particular configuration.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            ['gtest_unittest'],\n            'other',\n            False,\n            available_configurations=self.fake_configurations),\n        ([],\n         [(GTEST_OTHER_DIR, GTEST_OTHER_DIR + '/gtest_unittest')]))\n\n    # All available configurations\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            ['gtest_unittest'],\n            'all',\n            False,\n            available_configurations=self.fake_configurations),\n        ([],\n         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest'),\n          (GTEST_OPT_DIR, GTEST_OPT_DIR + '/gtest_unittest')]))\n\n    # All built configurations (unbuilt don't cause failure).\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            ['gtest_unittest'],\n            '',\n            True,\n            available_configurations=self.fake_configurations + ['unbuilt']),\n        ([],\n         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest'),\n          (GTEST_OPT_DIR, GTEST_OPT_DIR + '/gtest_unittest')]))\n\n    # A combination of an explicit directory and a configuration.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            [GTEST_DBG_DIR, 'gtest_unittest'],\n            'opt',\n            False,\n            available_configurations=self.fake_configurations),\n        ([],\n         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest'),\n          (GTEST_OPT_DIR, GTEST_OPT_DIR + '/gtest_unittest')]))\n\n    # Same test specified in an explicit directory and via a configuration.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            [GTEST_DBG_DIR, 'gtest_unittest'],\n            'dbg',\n            False,\n            available_configurations=self.fake_configurations),\n        ([],\n         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]))\n\n    # All built configurations + explicit directory + explicit configuration.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            [GTEST_DBG_DIR, 'gtest_unittest'],\n            'opt',\n            True,\n            available_configurations=self.fake_configurations),\n        ([],\n         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest'),\n          (GTEST_OPT_DIR, GTEST_OPT_DIR + '/gtest_unittest')]))\n\n  def testPythonTestsOnly(self):\n    \"\"\"Exercises GetTestsToRun with parameters designating Python tests only.\"\"\"\n\n    # A default build.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            ['gtest_color_test.py'],\n            '',\n            False,\n            available_configurations=self.fake_configurations),\n        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')],\n         []))\n\n    # An explicitly specified directory.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            [GTEST_DBG_DIR, 'test/gtest_color_test.py'],\n            '',\n            False,\n            available_configurations=self.fake_configurations),\n        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')],\n         []))\n\n    # A particular configuration.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            ['gtest_color_test.py'],\n            'other',\n            False,\n            available_configurations=self.fake_configurations),\n        ([(GTEST_OTHER_DIR, 'test/gtest_color_test.py')],\n         []))\n\n    # All available configurations\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            ['test/gtest_color_test.py'],\n            'all',\n            False,\n            available_configurations=self.fake_configurations),\n        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py'),\n          (GTEST_OPT_DIR, 'test/gtest_color_test.py')],\n         []))\n\n    # All built configurations (unbuilt don't cause failure).\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            ['gtest_color_test.py'],\n            '',\n            True,\n            available_configurations=self.fake_configurations + ['unbuilt']),\n        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py'),\n          (GTEST_OPT_DIR, 'test/gtest_color_test.py')],\n         []))\n\n    # A combination of an explicit directory and a configuration.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            [GTEST_DBG_DIR, 'gtest_color_test.py'],\n            'opt',\n            False,\n            available_configurations=self.fake_configurations),\n        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py'),\n          (GTEST_OPT_DIR, 'test/gtest_color_test.py')],\n         []))\n\n    # Same test specified in an explicit directory and via a configuration.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            [GTEST_DBG_DIR, 'gtest_color_test.py'],\n            'dbg',\n            False,\n            available_configurations=self.fake_configurations),\n        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')],\n         []))\n\n    # All built configurations + explicit directory + explicit configuration.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            [GTEST_DBG_DIR, 'gtest_color_test.py'],\n            'opt',\n            True,\n            available_configurations=self.fake_configurations),\n        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py'),\n          (GTEST_OPT_DIR, 'test/gtest_color_test.py')],\n         []))\n\n  def testCombinationOfBinaryAndPythonTests(self):\n    \"\"\"Exercises GetTestsToRun with mixed binary/Python tests.\"\"\"\n\n    # Use only default configuration for this test.\n\n    # Neither binary nor Python tests are specified so find all.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            [],\n            '',\n            False,\n            available_configurations=self.fake_configurations),\n        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')],\n         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]))\n\n    # Specifying both binary and Python tests.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            ['gtest_unittest', 'gtest_color_test.py'],\n            '',\n            False,\n            available_configurations=self.fake_configurations),\n        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')],\n         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]))\n\n    # Specifying binary tests suppresses Python tests.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            ['gtest_unittest'],\n            '',\n            False,\n            available_configurations=self.fake_configurations),\n        ([],\n         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]))\n\n   # Specifying Python tests suppresses binary tests.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            ['gtest_color_test.py'],\n            '',\n            False,\n            available_configurations=self.fake_configurations),\n        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')],\n         []))\n\n  def testIgnoresNonTestFiles(self):\n    \"\"\"Verifies that GetTestsToRun ignores non-test files in the filesystem.\"\"\"\n\n    self.fake_os = FakeOs(FakePath(\n        current_dir=os.path.abspath(os.path.dirname(run_tests_util.__file__)),\n        known_paths=[AddExeExtension(GTEST_DBG_DIR + '/gtest_nontest'),\n                     'test/']))\n    self.test_runner = run_tests_util.TestRunner(script_dir='.',\n                                                 injected_os=self.fake_os,\n                                                 injected_subprocess=None)\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            [],\n            '',\n            True,\n            available_configurations=self.fake_configurations),\n        ([], []))\n\n  def testWorksFromDifferentDir(self):\n    \"\"\"Exercises GetTestsToRun from a directory different from run_test.py's.\"\"\"\n\n    # Here we simulate an test script in directory /d/ called from the\n    # directory /a/b/c/.\n    self.fake_os = FakeOs(FakePath(\n        current_dir=os.path.abspath('/a/b/c'),\n        known_paths=[\n            '/a/b/c/',\n            AddExeExtension('/d/' + GTEST_DBG_DIR + '/gtest_unittest'),\n            AddExeExtension('/d/' + GTEST_OPT_DIR + '/gtest_unittest'),\n            '/d/test/gtest_color_test.py']))\n    self.fake_configurations = ['dbg', 'opt']\n    self.test_runner = run_tests_util.TestRunner(script_dir='/d/',\n                                                 injected_os=self.fake_os,\n                                                 injected_subprocess=None)\n    # A binary test.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            ['gtest_unittest'],\n            '',\n            False,\n            available_configurations=self.fake_configurations),\n        ([],\n         [('/d/' + GTEST_DBG_DIR, '/d/' + GTEST_DBG_DIR + '/gtest_unittest')]))\n\n    # A Python test.\n    self.AssertResultsEqual(\n        self.test_runner.GetTestsToRun(\n            ['gtest_color_test.py'],\n            '',\n            False,\n            available_configurations=self.fake_configurations),\n        ([('/d/' + GTEST_DBG_DIR, '/d/test/gtest_color_test.py')], []))\n\n  def testNonTestBinary(self):\n    \"\"\"Exercises GetTestsToRun with a non-test parameter.\"\"\"\n\n    self.assert_(\n        not self.test_runner.GetTestsToRun(\n            ['gtest_unittest_not_really'],\n            '',\n            False,\n            available_configurations=self.fake_configurations))\n\n  def testNonExistingPythonTest(self):\n    \"\"\"Exercises GetTestsToRun with a non-existent Python test parameter.\"\"\"\n\n    self.assert_(\n        not self.test_runner.GetTestsToRun(\n            ['nonexistent_test.py'],\n            '',\n            False,\n            available_configurations=self.fake_configurations))\n\n  if run_tests_util.IS_WINDOWS or run_tests_util.IS_CYGWIN:\n\n    def testDoesNotPickNonExeFilesOnWindows(self):\n      \"\"\"Verifies that GetTestsToRun does not find _test files on Windows.\"\"\"\n\n      self.fake_os = FakeOs(FakePath(\n          current_dir=os.path.abspath(os.path.dirname(run_tests_util.__file__)),\n          known_paths=['/d/' + GTEST_DBG_DIR + '/gtest_test', 'test/']))\n      self.test_runner = run_tests_util.TestRunner(script_dir='.',\n                                                   injected_os=self.fake_os,\n                                                   injected_subprocess=None)\n      self.AssertResultsEqual(\n          self.test_runner.GetTestsToRun(\n              [],\n              '',\n              True,\n              available_configurations=self.fake_configurations),\n          ([], []))\n\n\nclass RunTestsTest(unittest.TestCase):\n  \"\"\"Exercises TestRunner.RunTests.\"\"\"\n\n  def SpawnSuccess(self, unused_executable, unused_argv):\n    \"\"\"Fakes test success by returning 0 as an exit code.\"\"\"\n\n    self.num_spawn_calls += 1\n    return 0\n\n  def SpawnFailure(self, unused_executable, unused_argv):\n    \"\"\"Fakes test success by returning 1 as an exit code.\"\"\"\n\n    self.num_spawn_calls += 1\n    return 1\n\n  def setUp(self):\n    self.fake_os = FakeOs(FakePath(\n        current_dir=os.path.abspath(os.path.dirname(run_tests_util.__file__)),\n        known_paths=[\n            AddExeExtension(GTEST_DBG_DIR + '/gtest_unittest'),\n            AddExeExtension(GTEST_OPT_DIR + '/gtest_unittest'),\n            'test/gtest_color_test.py']))\n    self.fake_configurations = ['dbg', 'opt']\n    self.test_runner = run_tests_util.TestRunner(\n        script_dir=os.path.dirname(__file__) or '.',\n        injected_os=self.fake_os,\n        injected_subprocess=None)\n    self.num_spawn_calls = 0  # A number of calls to spawn.\n\n  def testRunPythonTestSuccess(self):\n    \"\"\"Exercises RunTests to handle a Python test success.\"\"\"\n\n    self.fake_os.spawn_impl = self.SpawnSuccess\n    self.assertEqual(\n        self.test_runner.RunTests(\n            [(GTEST_DBG_DIR, 'test/gtest_color_test.py')],\n            []),\n        0)\n    self.assertEqual(self.num_spawn_calls, 1)\n\n  def testRunBinaryTestSuccess(self):\n    \"\"\"Exercises RunTests to handle a binary test success.\"\"\"\n\n    self.fake_os.spawn_impl = self.SpawnSuccess\n    self.assertEqual(\n        self.test_runner.RunTests(\n            [],\n            [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]),\n        0)\n    self.assertEqual(self.num_spawn_calls, 1)\n\n  def testRunPythonTestFauilure(self):\n    \"\"\"Exercises RunTests to handle a Python test failure.\"\"\"\n\n    self.fake_os.spawn_impl = self.SpawnFailure\n    self.assertEqual(\n        self.test_runner.RunTests(\n            [(GTEST_DBG_DIR, 'test/gtest_color_test.py')],\n            []),\n        1)\n    self.assertEqual(self.num_spawn_calls, 1)\n\n  def testRunBinaryTestFailure(self):\n    \"\"\"Exercises RunTests to handle a binary test failure.\"\"\"\n\n    self.fake_os.spawn_impl = self.SpawnFailure\n    self.assertEqual(\n        self.test_runner.RunTests(\n            [],\n            [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]),\n        1)\n    self.assertEqual(self.num_spawn_calls, 1)\n\n  def testCombinedTestSuccess(self):\n    \"\"\"Exercises RunTests to handle a success of both Python and binary test.\"\"\"\n\n    self.fake_os.spawn_impl = self.SpawnSuccess\n    self.assertEqual(\n        self.test_runner.RunTests(\n            [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')],\n            [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]),\n        0)\n    self.assertEqual(self.num_spawn_calls, 2)\n\n  def testCombinedTestSuccessAndFailure(self):\n    \"\"\"Exercises RunTests to handle a success of both Python and binary test.\"\"\"\n\n    def SpawnImpl(executable, argv):\n      self.num_spawn_calls += 1\n      # Simulates failure of a Python test and success of a binary test.\n      if '.py' in executable or '.py' in argv[0]:\n        return 1\n      else:\n        return 0\n\n    self.fake_os.spawn_impl = SpawnImpl\n    self.assertEqual(\n        self.test_runner.RunTests(\n            [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')],\n            [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]),\n        0)\n    self.assertEqual(self.num_spawn_calls, 2)\n\n\nclass ParseArgsTest(unittest.TestCase):\n  \"\"\"Exercises ParseArgs.\"\"\"\n\n  def testNoOptions(self):\n    options, args = run_tests_util.ParseArgs('gtest', argv=['script.py'])\n    self.assertEqual(args, ['script.py'])\n    self.assert_(options.configurations is None)\n    self.assertFalse(options.built_configurations)\n\n  def testOptionC(self):\n    options, args = run_tests_util.ParseArgs(\n        'gtest', argv=['script.py', '-c', 'dbg'])\n    self.assertEqual(args, ['script.py'])\n    self.assertEqual(options.configurations, 'dbg')\n    self.assertFalse(options.built_configurations)\n\n  def testOptionA(self):\n    options, args = run_tests_util.ParseArgs('gtest', argv=['script.py', '-a'])\n    self.assertEqual(args, ['script.py'])\n    self.assertEqual(options.configurations, 'all')\n    self.assertFalse(options.built_configurations)\n\n  def testOptionB(self):\n    options, args = run_tests_util.ParseArgs('gtest', argv=['script.py', '-b'])\n    self.assertEqual(args, ['script.py'])\n    self.assert_(options.configurations is None)\n    self.assertTrue(options.built_configurations)\n\n  def testOptionCAndOptionB(self):\n    options, args = run_tests_util.ParseArgs(\n        'gtest', argv=['script.py', '-c', 'dbg', '-b'])\n    self.assertEqual(args, ['script.py'])\n    self.assertEqual(options.configurations, 'dbg')\n    self.assertTrue(options.built_configurations)\n\n  def testOptionH(self):\n    help_called = [False]\n\n    # Suppresses lint warning on unused arguments.  These arguments are\n    # required by optparse, even though they are unused.\n    # pylint: disable-msg=W0613\n    def VerifyHelp(option, opt, value, parser):\n      help_called[0] = True\n\n    # Verifies that -h causes the help callback to be called.\n    help_called[0] = False\n    _, args = run_tests_util.ParseArgs(\n        'gtest', argv=['script.py', '-h'], help_callback=VerifyHelp)\n    self.assertEqual(args, ['script.py'])\n    self.assertTrue(help_called[0])\n\n    # Verifies that --help causes the help callback to be called.\n    help_called[0] = False\n    _, args = run_tests_util.ParseArgs(\n        'gtest', argv=['script.py', '--help'], help_callback=VerifyHelp)\n    self.assertEqual(args, ['script.py'])\n    self.assertTrue(help_called[0])\n\n\nif __name__ == '__main__':\n  unittest.main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/DebugProject.xcconfig",
    "content": "//\n//  DebugProject.xcconfig\n//\n//  These are Debug Configuration project settings for the gtest framework and\n//  examples. It is set in the \"Based On:\" dropdown in the \"Project\" info\n//  dialog.\n//  This file is based on the Xcode Configuration files in:\n//  http://code.google.com/p/google-toolbox-for-mac/\n// \n\n#include \"General.xcconfig\"\n\n// No optimization\nGCC_OPTIMIZATION_LEVEL = 0\n\n// Deployment postprocessing is what triggers Xcode to strip, turn it off\nDEPLOYMENT_POSTPROCESSING = NO\n\n// Dead code stripping off\nDEAD_CODE_STRIPPING = NO\n\n// Debug symbols should be on obviously\nGCC_GENERATE_DEBUGGING_SYMBOLS = YES\n\n// Define the DEBUG macro in all debug builds\nOTHER_CFLAGS = $(OTHER_CFLAGS) -DDEBUG=1\n\n// These are turned off to avoid STL incompatibilities with client code\n// // Turns on special C++ STL checks to \"encourage\" good STL use\n// GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) _GLIBCXX_DEBUG_PEDANTIC _GLIBCXX_DEBUG _GLIBCPP_CONCEPT_CHECKS\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/FrameworkTarget.xcconfig",
    "content": "//\n//  FrameworkTarget.xcconfig\n//\n//  These are Framework target settings for the gtest framework and examples. It\n//  is set in the \"Based On:\" dropdown in the \"Target\" info dialog.\n//  This file is based on the Xcode Configuration files in:\n//  http://code.google.com/p/google-toolbox-for-mac/\n// \n\n// Dynamic libs need to be position independent\nGCC_DYNAMIC_NO_PIC = NO\n\n// Dynamic libs should not have their external symbols stripped.\nSTRIP_STYLE = non-global\n\n// Let the user install by specifying the $DSTROOT with xcodebuild\nSKIP_INSTALL = NO\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/General.xcconfig",
    "content": "//\n//  General.xcconfig\n//\n//  These are General configuration settings for the gtest framework and\n//  examples.\n//  This file is based on the Xcode Configuration files in:\n//  http://code.google.com/p/google-toolbox-for-mac/\n// \n\n// Build for PPC and Intel, 32- and 64-bit\nARCHS = i386 x86_64 ppc ppc64\n\n// Zerolink prevents link warnings so turn it off\nZERO_LINK = NO\n\n// Prebinding considered unhelpful in 10.3 and later\nPREBINDING = NO\n\n// Strictest warning policy\nWARNING_CFLAGS = -Wall -Werror -Wendif-labels -Wnewline-eof -Wno-sign-compare -Wshadow\n\n// Work around Xcode bugs by using external strip. See:\n// http://lists.apple.com/archives/Xcode-users/2006/Feb/msg00050.html\nSEPARATE_STRIP = YES\n\n// Force C99 dialect\nGCC_C_LANGUAGE_STANDARD = c99\n\n// not sure why apple defaults this on, but it's pretty risky\nALWAYS_SEARCH_USER_PATHS = NO\n\n// Turn on position dependent code for most cases (overridden where appropriate)\nGCC_DYNAMIC_NO_PIC = YES\n\n// Default SDK and minimum OS version is 10.4\nSDKROOT = $(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk\nMACOSX_DEPLOYMENT_TARGET = 10.4\nGCC_VERSION = 4.0\n\n// VERSIONING BUILD SETTINGS (used in Info.plist)\nGTEST_VERSIONINFO_ABOUT =  © 2008 Google Inc.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/ReleaseProject.xcconfig",
    "content": "//\n//  ReleaseProject.xcconfig\n//\n//  These are Release Configuration project settings for the gtest framework\n//  and examples. It is set in the \"Based On:\" dropdown in the \"Project\" info\n//  dialog.\n//  This file is based on the Xcode Configuration files in:\n//  http://code.google.com/p/google-toolbox-for-mac/\n// \n\n#include \"General.xcconfig\"\n\n// subconfig/Release.xcconfig\n\n// Optimize for space and size (Apple recommendation)\nGCC_OPTIMIZATION_LEVEL = s\n\n// Deploment postprocessing is what triggers Xcode to strip\nDEPLOYMENT_POSTPROCESSING = YES\n\n// No symbols\nGCC_GENERATE_DEBUGGING_SYMBOLS = NO\n\n// Dead code strip does not affect ObjC code but can help for C\nDEAD_CODE_STRIPPING = YES\n\n// NDEBUG is used by things like assert.h, so define it for general compat.\n// ASSERT going away in release tends to create unused vars.\nOTHER_CFLAGS = $(OTHER_CFLAGS) -DNDEBUG=1 -Wno-unused-variable\n\n// When we strip we want to strip all symbols in release, but save externals.\nSTRIP_STYLE = all\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/StaticLibraryTarget.xcconfig",
    "content": "//\n//  StaticLibraryTarget.xcconfig\n//\n//  These are static library target settings for libgtest.a. It\n//  is set in the \"Based On:\" dropdown in the \"Target\" info dialog.\n//  This file is based on the Xcode Configuration files in:\n//  http://code.google.com/p/google-toolbox-for-mac/\n// \n\n// Static libs can be included in bundles so make them position independent\nGCC_DYNAMIC_NO_PIC = NO\n\n// Static libs should not have their internal globals or external symbols\n// stripped.\nSTRIP_STYLE = debugging\n\n// Let the user install by specifying the $DSTROOT with xcodebuild\nSKIP_INSTALL = NO\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/TestTarget.xcconfig",
    "content": "//\n//  TestTarget.xcconfig\n//\n//  These are Test target settings for the gtest framework and examples. It\n//  is set in the \"Based On:\" dropdown in the \"Target\" info dialog.\n\nPRODUCT_NAME = $(TARGET_NAME)\nHEADER_SEARCH_PATHS = ../include\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Resources/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.google.${PRODUCT_NAME}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>GTEST_VERSIONINFO_LONG</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>GTEST_VERSIONINFO_SHORT</string>\n\t<key>CFBundleGetInfoString</key>\n\t<string>${PRODUCT_NAME} GTEST_VERSIONINFO_LONG, ${GTEST_VERSIONINFO_ABOUT}</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>${GTEST_VERSIONINFO_ABOUT}</string>\n\t<key>CSResourcesFileMapped</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.google.gtest.${PRODUCT_NAME:identifier}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>CSResourcesFileMapped</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 42;\n\tobjects = {\n\n/* Begin PBXAggregateTarget section */\n\t\t4024D162113D7D2400C7059E /* Test */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = 4024D169113D7D4600C7059E /* Build configuration list for PBXAggregateTarget \"Test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t4024D161113D7D2400C7059E /* ShellScript */,\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t4024D166113D7D3100C7059E /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Test;\n\t\t\tproductName = TestAndBuild;\n\t\t};\n\t\t4024D1E9113D83FF00C7059E /* TestAndBuild */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = 4024D1F0113D842B00C7059E /* Build configuration list for PBXAggregateTarget \"TestAndBuild\" */;\n\t\t\tbuildPhases = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t4024D1ED113D840900C7059E /* PBXTargetDependency */,\n\t\t\t\t4024D1EF113D840D00C7059E /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = TestAndBuild;\n\t\t\tproductName = TestAndBuild;\n\t\t};\n/* End PBXAggregateTarget section */\n\n/* Begin PBXBuildFile section */\n\t\t3B7EB1250E5AEE3500C7F239 /* widget.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B7EB1230E5AEE3500C7F239 /* widget.cc */; };\n\t\t3B7EB1260E5AEE3500C7F239 /* widget.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B7EB1240E5AEE3500C7F239 /* widget.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t3B7EB1280E5AEE4600C7F239 /* widget_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B7EB1270E5AEE4600C7F239 /* widget_test.cc */; };\n\t\t3B7EB1480E5AF3B400C7F239 /* Widget.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D07F2C80486CC7A007CD1D0 /* Widget.framework */; };\n\t\t4024D188113D7D7800C7059E /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4024D185113D7D5500C7059E /* libgtest.a */; };\n\t\t4024D189113D7D7A00C7059E /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4024D183113D7D5500C7059E /* libgtest_main.a */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t3B07BDF00E3F3FAE00647869 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;\n\t\t\tremoteInfo = gTestExample;\n\t\t};\n\t\t4024D165113D7D3100C7059E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 3B07BDE90E3F3F9E00647869;\n\t\t\tremoteInfo = WidgetFrameworkTest;\n\t\t};\n\t\t4024D1EC113D840900C7059E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;\n\t\t\tremoteInfo = WidgetFramework;\n\t\t};\n\t\t4024D1EE113D840D00C7059E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 4024D162113D7D2400C7059E;\n\t\t\tremoteInfo = Test;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = WidgetFrameworkTest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t3B7EB1230E5AEE3500C7F239 /* widget.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = widget.cc; sourceTree = \"<group>\"; };\n\t\t3B7EB1240E5AEE3500C7F239 /* widget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = widget.h; sourceTree = \"<group>\"; };\n\t\t3B7EB1270E5AEE4600C7F239 /* widget_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = widget_test.cc; sourceTree = \"<group>\"; };\n\t\t4024D183113D7D5500C7059E /* libgtest_main.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgtest_main.a; path = /usr/local/lib/libgtest_main.a; sourceTree = \"<absolute>\"; };\n\t\t4024D185113D7D5500C7059E /* libgtest.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgtest.a; path = /usr/local/lib/libgtest.a; sourceTree = \"<absolute>\"; };\n\t\t4024D1E2113D838200C7059E /* runtests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = runtests.sh; sourceTree = \"<group>\"; };\n\t\t8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t8D07F2C80486CC7A007CD1D0 /* Widget.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Widget.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t3B07BDE80E3F3F9E00647869 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t4024D189113D7D7A00C7059E /* libgtest_main.a in Frameworks */,\n\t\t\t\t4024D188113D7D7800C7059E /* libgtest.a in Frameworks */,\n\t\t\t\t3B7EB1480E5AF3B400C7F239 /* Widget.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8D07F2C30486CC7A007CD1D0 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t034768DDFF38A45A11DB9C8B /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8D07F2C80486CC7A007CD1D0 /* Widget.framework */,\n\t\t\t\t3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0867D691FE84028FC02AAC07 /* gTestExample */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4024D1E1113D836C00C7059E /* Scripts */,\n\t\t\t\t08FB77ACFE841707C02AAC07 /* Source */,\n\t\t\t\t089C1665FE841158C02AAC07 /* Resources */,\n\t\t\t\t3B07BE350E4094E400647869 /* Test */,\n\t\t\t\t0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,\n\t\t\t\t034768DDFF38A45A11DB9C8B /* Products */,\n\t\t\t);\n\t\t\tname = gTestExample;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4024D183113D7D5500C7059E /* libgtest_main.a */,\n\t\t\t\t4024D185113D7D5500C7059E /* libgtest.a */,\n\t\t\t);\n\t\t\tname = \"External Frameworks and Libraries\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t089C1665FE841158C02AAC07 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8D07F2C70486CC7A007CD1D0 /* Info.plist */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB77ACFE841707C02AAC07 /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B7EB1230E5AEE3500C7F239 /* widget.cc */,\n\t\t\t\t3B7EB1240E5AEE3500C7F239 /* widget.h */,\n\t\t\t);\n\t\t\tname = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3B07BE350E4094E400647869 /* Test */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B7EB1270E5AEE4600C7F239 /* widget_test.cc */,\n\t\t\t);\n\t\t\tname = Test;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4024D1E1113D836C00C7059E /* Scripts */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4024D1E2113D838200C7059E /* runtests.sh */,\n\t\t\t);\n\t\t\tname = Scripts;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t8D07F2BD0486CC7A007CD1D0 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3B7EB1260E5AEE3500C7F239 /* widget.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 3B07BDF40E3F3FB600647869 /* Build configuration list for PBXNativeTarget \"WidgetFrameworkTest\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t3B07BDE70E3F3F9E00647869 /* Sources */,\n\t\t\t\t3B07BDE80E3F3F9E00647869 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t3B07BDF10E3F3FAE00647869 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = WidgetFrameworkTest;\n\t\t\tproductName = gTestExampleTest;\n\t\t\tproductReference = 3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget \"WidgetFramework\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8D07F2C10486CC7A007CD1D0 /* Sources */,\n\t\t\t\t8D07F2C30486CC7A007CD1D0 /* Frameworks */,\n\t\t\t\t8D07F2BD0486CC7A007CD1D0 /* Headers */,\n\t\t\t\t8D07F2BF0486CC7A007CD1D0 /* Resources */,\n\t\t\t\t8D07F2C50486CC7A007CD1D0 /* Rez */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = WidgetFramework;\n\t\t\tproductInstallPath = \"$(HOME)/Library/Frameworks\";\n\t\t\tproductName = gTestExample;\n\t\t\tproductReference = 8D07F2C80486CC7A007CD1D0 /* Widget.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t0867D690FE84028FC02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tbuildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject \"WidgetFramework\" */;\n\t\t\tcompatibilityVersion = \"Xcode 2.4\";\n\t\t\thasScannedForEncodings = 1;\n\t\t\tmainGroup = 0867D691FE84028FC02AAC07 /* gTestExample */;\n\t\t\tproductRefGroup = 034768DDFF38A45A11DB9C8B /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */,\n\t\t\t\t3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */,\n\t\t\t\t4024D162113D7D2400C7059E /* Test */,\n\t\t\t\t4024D1E9113D83FF00C7059E /* TestAndBuild */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t8D07F2BF0486CC7A007CD1D0 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXRezBuildPhase section */\n\t\t8D07F2C50486CC7A007CD1D0 /* Rez */ = {\n\t\t\tisa = PBXRezBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXRezBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t4024D161113D7D2400C7059E /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/bash $SRCROOT/runtests.sh $BUILT_PRODUCTS_DIR/WidgetFrameworkTest\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t3B07BDE70E3F3F9E00647869 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3B7EB1280E5AEE4600C7F239 /* widget_test.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8D07F2C10486CC7A007CD1D0 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3B7EB1250E5AEE3500C7F239 /* widget.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t3B07BDF10E3F3FAE00647869 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */;\n\t\t\ttargetProxy = 3B07BDF00E3F3FAE00647869 /* PBXContainerItemProxy */;\n\t\t};\n\t\t4024D166113D7D3100C7059E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */;\n\t\t\ttargetProxy = 4024D165113D7D3100C7059E /* PBXContainerItemProxy */;\n\t\t};\n\t\t4024D1ED113D840900C7059E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */;\n\t\t\ttargetProxy = 4024D1EC113D840900C7059E /* PBXContainerItemProxy */;\n\t\t};\n\t\t4024D1EF113D840D00C7059E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 4024D162113D7D2400C7059E /* Test */;\n\t\t\ttargetProxy = 4024D1EE113D840D00C7059E /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t3B07BDEC0E3F3F9F00647869 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = WidgetFrameworkTest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t3B07BDED0E3F3F9F00647869 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = WidgetFrameworkTest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4024D163113D7D2400C7059E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = TestAndBuild;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4024D164113D7D2400C7059E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = TestAndBuild;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4024D1EA113D83FF00C7059E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = TestAndBuild;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4024D1EB113D83FF00C7059E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = TestAndBuild;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4FADC24308B4156D00ABE55E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"@loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_NAME = Widget;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4FADC24408B4156D00ABE55E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tINSTALL_PATH = \"@loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_NAME = Widget;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4FADC24708B4156D00ABE55E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_VERSION = 4.0;\n\t\t\t\tSDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4FADC24808B4156D00ABE55E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_VERSION = 4.0;\n\t\t\t\tSDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t3B07BDF40E3F3FB600647869 /* Build configuration list for PBXNativeTarget \"WidgetFrameworkTest\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t3B07BDEC0E3F3F9F00647869 /* Debug */,\n\t\t\t\t3B07BDED0E3F3F9F00647869 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4024D169113D7D4600C7059E /* Build configuration list for PBXAggregateTarget \"Test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4024D163113D7D2400C7059E /* Debug */,\n\t\t\t\t4024D164113D7D2400C7059E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4024D1F0113D842B00C7059E /* Build configuration list for PBXAggregateTarget \"TestAndBuild\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4024D1EA113D83FF00C7059E /* Debug */,\n\t\t\t\t4024D1EB113D83FF00C7059E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget \"WidgetFramework\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4FADC24308B4156D00ABE55E /* Debug */,\n\t\t\t\t4FADC24408B4156D00ABE55E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject \"WidgetFramework\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4FADC24708B4156D00ABE55E /* Debug */,\n\t\t\t\t4FADC24808B4156D00ABE55E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 0867D690FE84028FC02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/runtests.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# Executes the samples and tests for the Google Test Framework.\n\n# Help the dynamic linker find the path to the libraries.\nexport DYLD_FRAMEWORK_PATH=$BUILT_PRODUCTS_DIR\nexport DYLD_LIBRARY_PATH=$BUILT_PRODUCTS_DIR\n\n# Create some executables.\ntest_executables=$@\n\n# Now execute each one in turn keeping track of how many succeeded and failed.\nsucceeded=0\nfailed=0\nfailed_list=()\nfor test in ${test_executables[*]}; do\n  \"$test\"\n  result=$?\n  if [ $result -eq 0 ]; then\n    succeeded=$(( $succeeded + 1 ))\n  else\n    failed=$(( failed + 1 ))\n    failed_list=\"$failed_list $test\"\n  fi\ndone\n\n# Report the successes and failures to the console.\necho \"Tests complete with $succeeded successes and $failed failures.\"\nif [ $failed -ne 0 ]; then\n  echo \"The following tests failed:\"\n  echo $failed_list\nfi\nexit $failed\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: preston.a.jackson@gmail.com (Preston Jackson)\n//\n// Google Test - FrameworkSample\n// widget.cc\n//\n\n// Widget is a very simple class used for demonstrating the use of gtest\n\n#include \"widget.h\"\n\nWidget::Widget(int number, const std::string& name)\n    : number_(number),\n      name_(name) {}\n\nWidget::~Widget() {}\n\nfloat Widget::GetFloatValue() const {\n  return number_;\n}\n\nint Widget::GetIntValue() const {\n  return static_cast<int>(number_);\n}\n\nstd::string Widget::GetStringValue() const {\n  return name_;\n}\n\nvoid Widget::GetCharPtrValue(char* buffer, size_t max_size) const {\n  // Copy the char* representation of name_ into buffer, up to max_size.\n  strncpy(buffer, name_.c_str(), max_size-1);\n  buffer[max_size-1] = '\\0';\n  return;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.h",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: preston.a.jackson@gmail.com (Preston Jackson)\n//\n// Google Test - FrameworkSample\n// widget.h\n//\n\n// Widget is a very simple class used for demonstrating the use of gtest. It\n// simply stores two values a string and an integer, which are returned via\n// public accessors in multiple forms.\n\n#import <string>\n\nclass Widget {\n public:\n  Widget(int number, const std::string& name);\n  ~Widget();\n\n  // Public accessors to number data\n  float GetFloatValue() const;\n  int GetIntValue() const;\n\n  // Public accessors to the string data\n  std::string GetStringValue() const;\n  void GetCharPtrValue(char* buffer, size_t max_size) const;\n\n private:\n  // Data members\n  float number_;\n  std::string name_;\n};\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget_test.cc",
    "content": "// Copyright 2008, Google Inc.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Author: preston.a.jackson@gmail.com (Preston Jackson)\n//\n// Google Test - FrameworkSample\n// widget_test.cc\n//\n\n// This is a simple test file for the Widget class in the Widget.framework\n\n#include <string>\n#include <gtest/gtest.h>\n\n#include <Widget/widget.h>\n\n// This test verifies that the constructor sets the internal state of the\n// Widget class correctly.\nTEST(WidgetInitializerTest, TestConstructor) {\n  Widget widget(1.0f, \"name\");\n  EXPECT_FLOAT_EQ(1.0f, widget.GetFloatValue());\n  EXPECT_EQ(std::string(\"name\"), widget.GetStringValue());\n}\n\n// This test verifies the conversion of the float and string values to int and\n// char*, respectively.\nTEST(WidgetInitializerTest, TestConversion) {\n  Widget widget(1.0f, \"name\");\n  EXPECT_EQ(1, widget.GetIntValue());\n\n  size_t max_size = 128;\n  char buffer[max_size];\n  widget.GetCharPtrValue(buffer, max_size);\n  EXPECT_STREQ(\"name\", buffer);\n}\n\n// Use the Google Test main that is linked into the framework. It does something\n// like this:\n// int main(int argc, char** argv) {\n//   testing::InitGoogleTest(&argc, argv);\n//   return RUN_ALL_TESTS();\n// }\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/runtests.sh",
    "content": "#!/bin/bash\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# Executes the samples and tests for the Google Test Framework.\n\n# Help the dynamic linker find the path to the libraries.\nexport DYLD_FRAMEWORK_PATH=$BUILT_PRODUCTS_DIR\nexport DYLD_LIBRARY_PATH=$BUILT_PRODUCTS_DIR\n\n# Create some executables.\ntest_executables=(\"$BUILT_PRODUCTS_DIR/gtest_unittest-framework\"\n                  \"$BUILT_PRODUCTS_DIR/gtest_unittest\"\n                  \"$BUILT_PRODUCTS_DIR/sample1_unittest-framework\"\n                  \"$BUILT_PRODUCTS_DIR/sample1_unittest-static\")\n\n# Now execute each one in turn keeping track of how many succeeded and failed. \nsucceeded=0\nfailed=0\nfailed_list=()\nfor test in ${test_executables[*]}; do\n  \"$test\"\n  result=$?\n  if [ $result -eq 0 ]; then\n    succeeded=$(( $succeeded + 1 ))\n  else\n    failed=$(( failed + 1 ))\n    failed_list=\"$failed_list $test\"\n  fi\ndone\n\n# Report the successes and failures to the console.\necho \"Tests complete with $succeeded successes and $failed failures.\"\nif [ $failed -ne 0 ]; then\n  echo \"The following tests failed:\"\n  echo $failed_list\nfi\nexit $failed\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/versiongenerate.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2008, Google Inc.\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"A script to prepare version informtion for use the gtest Info.plist file.\n\n  This script extracts the version information from the configure.ac file and\n  uses it to generate a header file containing the same information. The\n  #defines in this header file will be included in during the generation of\n  the Info.plist of the framework, giving the correct value to the version\n  shown in the Finder.\n\n  This script makes the following assumptions (these are faults of the script,\n  not problems with the Autoconf):\n    1. The AC_INIT macro will be contained within the first 1024 characters\n       of configure.ac\n    2. The version string will be 3 integers separated by periods and will be\n       surrounded by squre brackets, \"[\" and \"]\" (e.g. [1.0.1]). The first\n       segment represents the major version, the second represents the minor\n       version and the third represents the fix version.\n    3. No \")\" character exists between the opening \"(\" and closing \")\" of\n       AC_INIT, including in comments and character strings.\n\"\"\"\n\nimport sys\nimport re\n\n# Read the command line argument (the output directory for Version.h)\nif (len(sys.argv) < 3):\n  print \"Usage: versiongenerate.py input_dir output_dir\"\n  sys.exit(1)\nelse:\n  input_dir = sys.argv[1]\n  output_dir = sys.argv[2]\n\n# Read the first 1024 characters of the configure.ac file\nconfig_file = open(\"%s/configure.ac\" % input_dir, 'r')\nbuffer_size = 1024\nopening_string = config_file.read(buffer_size)\nconfig_file.close()\n\n# Extract the version string from the AC_INIT macro\n#   The following init_expression means:\n#     Extract three integers separated by periods and surrounded by squre\n#     brackets(e.g. \"[1.0.1]\") between \"AC_INIT(\" and \")\". Do not be greedy\n#     (*? is the non-greedy flag) since that would pull in everything between\n#     the first \"(\" and the last \")\" in the file.\nversion_expression = re.compile(r\"AC_INIT\\(.*?\\[(\\d+)\\.(\\d+)\\.(\\d+)\\].*?\\)\",\n                                re.DOTALL)\nversion_values = version_expression.search(opening_string)\nmajor_version = version_values.group(1)\nminor_version = version_values.group(2)\nfix_version = version_values.group(3)\n\n# Write the version information to a header file to be included in the\n# Info.plist file.\nfile_data = \"\"\"//\n// DO NOT MODIFY THIS FILE (but you can delete it)\n//\n// This file is autogenerated by the versiongenerate.py script. This script\n// is executed in a \"Run Script\" build phase when creating gtest.framework. This\n// header file is not used during compilation of C-source. Rather, it simply\n// defines some version strings for substitution in the Info.plist. Because of\n// this, we are not not restricted to C-syntax nor are we using include guards.\n//\n\n#define GTEST_VERSIONINFO_SHORT %s.%s\n#define GTEST_VERSIONINFO_LONG %s.%s.%s\n\n\"\"\" % (major_version, minor_version, major_version, minor_version, fix_version)\nversion_file = open(\"%s/Version.h\" % output_dir, 'w')\nversion_file.write(file_data)\nversion_file.close()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/gtest.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 42;\n\tobjects = {\n\n/* Begin PBXAggregateTarget section */\n\t\t3B238F5F0E828B5400846E11 /* Check */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = 3B238FA30E828BB600846E11 /* Build configuration list for PBXAggregateTarget \"Check\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t3B238F5E0E828B5400846E11 /* ShellScript */,\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t40899F9D0FFA740F000B29AE /* PBXTargetDependency */,\n\t\t\t\t40C849F7101A43440083642A /* PBXTargetDependency */,\n\t\t\t\t4089A0980FFAD34A000B29AE /* PBXTargetDependency */,\n\t\t\t\t40C849F9101A43490083642A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Check;\n\t\t\tproductName = Check;\n\t\t};\n\t\t40C44ADC0E3798F4008FCC51 /* Version Info */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = 40C44AE40E379905008FCC51 /* Build configuration list for PBXAggregateTarget \"Version Info\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t40C44ADB0E3798F4008FCC51 /* Generate Version.h */,\n\t\t\t);\n\t\t\tcomments = \"The generation of Version.h must be performed in its own target. Since the Info.plist is preprocessed before any of the other build phases in gtest, the Version.h file would not be ready if included as a build phase of that target.\";\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Version Info\";\n\t\t\tproductName = Version.h;\n\t\t};\n/* End PBXAggregateTarget section */\n\n/* Begin PBXBuildFile section */\n\t\t224A12A30E9EADCC00BD17FD /* gtest-test-part.h in Headers */ = {isa = PBXBuildFile; fileRef = 224A12A20E9EADCC00BD17FD /* gtest-test-part.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t3BF6F2A00E79B5AD000F2EEE /* gtest-type-util.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */; };\n\t\t3BF6F2A50E79B616000F2EEE /* gtest-typed-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t404884380E2F799B00CF7658 /* gtest-death-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DB0E2F799B00CF7658 /* gtest-death-test.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t404884390E2F799B00CF7658 /* gtest-message.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DC0E2F799B00CF7658 /* gtest-message.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t4048843A0E2F799B00CF7658 /* gtest-spi.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DD0E2F799B00CF7658 /* gtest-spi.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t4048843B0E2F799B00CF7658 /* gtest.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DE0E2F799B00CF7658 /* gtest.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t4048843C0E2F799B00CF7658 /* gtest_pred_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t4048843D0E2F799B00CF7658 /* gtest_prod.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883E00E2F799B00CF7658 /* gtest_prod.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t404884500E2F799B00CF7658 /* README in Resources */ = {isa = PBXBuildFile; fileRef = 404883F60E2F799B00CF7658 /* README */; };\n\t\t404884A00E2F7BE600CF7658 /* gtest-death-test-internal.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */; };\n\t\t404884A10E2F7BE600CF7658 /* gtest-filepath.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E30E2F799B00CF7658 /* gtest-filepath.h */; };\n\t\t404884A20E2F7BE600CF7658 /* gtest-internal.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E40E2F799B00CF7658 /* gtest-internal.h */; };\n\t\t404884A30E2F7BE600CF7658 /* gtest-port.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E50E2F799B00CF7658 /* gtest-port.h */; };\n\t\t404884A40E2F7BE600CF7658 /* gtest-string.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E60E2F799B00CF7658 /* gtest-string.h */; };\n\t\t404884AC0E2F7CD900CF7658 /* CHANGES in Resources */ = {isa = PBXBuildFile; fileRef = 404884A90E2F7CD900CF7658 /* CHANGES */; };\n\t\t404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */ = {isa = PBXBuildFile; fileRef = 404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */; };\n\t\t404884AE0E2F7CD900CF7658 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = 404884AB0E2F7CD900CF7658 /* COPYING */; };\n\t\t40899F3A0FFA70D4000B29AE /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = 224A12A10E9EADA700BD17FD /* gtest-all.cc */; };\n\t\t40899F500FFA7281000B29AE /* gtest-tuple.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 40899F4D0FFA7271000B29AE /* gtest-tuple.h */; };\n\t\t40899F530FFA72A0000B29AE /* gtest_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */; };\n\t\t4089A0440FFAD1BE000B29AE /* sample1.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02C0FFACF7F000B29AE /* sample1.cc */; };\n\t\t4089A0460FFAD1BE000B29AE /* sample1_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */; };\n\t\t40C848FF101A21150083642A /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = 224A12A10E9EADA700BD17FD /* gtest-all.cc */; };\n\t\t40C84915101A21DF0083642A /* gtest_main.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4048840D0E2F799B00CF7658 /* gtest_main.cc */; };\n\t\t40C84916101A235B0083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };\n\t\t40C84921101A23AD0083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };\n\t\t40C84978101A36540083642A /* libgtest_main.a in Resources */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };\n\t\t40C84980101A36850083642A /* gtest_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */; };\n\t\t40C84982101A36850083642A /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C848FA101A209C0083642A /* libgtest.a */; };\n\t\t40C84983101A36850083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };\n\t\t40C8498F101A36A60083642A /* sample1.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02C0FFACF7F000B29AE /* sample1.cc */; };\n\t\t40C84990101A36A60083642A /* sample1_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */; };\n\t\t40C84992101A36A60083642A /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C848FA101A209C0083642A /* libgtest.a */; };\n\t\t40C84993101A36A60083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };\n\t\t40C849A2101A37050083642A /* gtest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4539C8FF0EC27F6400A70F4C /* gtest.framework */; };\n\t\t40C849A4101A37150083642A /* gtest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4539C8FF0EC27F6400A70F4C /* gtest.framework */; };\n\t\t4539C9340EC280AE00A70F4C /* gtest-param-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 4539C9330EC280AE00A70F4C /* gtest-param-test.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t4539C9380EC280E200A70F4C /* gtest-linked_ptr.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */; };\n\t\t4539C9390EC280E200A70F4C /* gtest-param-util-generated.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */; };\n\t\t4539C93A0EC280E200A70F4C /* gtest-param-util.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9370EC280E200A70F4C /* gtest-param-util.h */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t40899F9C0FFA740F000B29AE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40899F420FFA7184000B29AE;\n\t\t\tremoteInfo = gtest_unittest;\n\t\t};\n\t\t4089A0970FFAD34A000B29AE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 4089A0120FFACEFC000B29AE;\n\t\t\tremoteInfo = sample1_unittest;\n\t\t};\n\t\t408BEC0F1046CFE900DEF522 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C848F9101A209C0083642A;\n\t\t\tremoteInfo = \"gtest-static\";\n\t\t};\n\t\t40C44AE50E379922008FCC51 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C44ADC0E3798F4008FCC51;\n\t\t\tremoteInfo = Version.h;\n\t\t};\n\t\t40C8497C101A36850083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C848F9101A209C0083642A;\n\t\t\tremoteInfo = \"gtest-static\";\n\t\t};\n\t\t40C8497E101A36850083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C8490A101A217E0083642A;\n\t\t\tremoteInfo = \"gtest_main-static\";\n\t\t};\n\t\t40C8498B101A36A60083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C848F9101A209C0083642A;\n\t\t\tremoteInfo = \"gtest-static\";\n\t\t};\n\t\t40C8498D101A36A60083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C8490A101A217E0083642A;\n\t\t\tremoteInfo = \"gtest_main-static\";\n\t\t};\n\t\t40C8499B101A36DC0083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C8490A101A217E0083642A;\n\t\t\tremoteInfo = \"gtest_main-static\";\n\t\t};\n\t\t40C8499D101A36E50083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;\n\t\t\tremoteInfo = \"gtest-framework\";\n\t\t};\n\t\t40C8499F101A36F10083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;\n\t\t\tremoteInfo = \"gtest-framework\";\n\t\t};\n\t\t40C849F6101A43440083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C8497A101A36850083642A;\n\t\t\tremoteInfo = \"gtest_unittest-static\";\n\t\t};\n\t\t40C849F8101A43490083642A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 0867D690FE84028FC02AAC07 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 40C84989101A36A60083642A;\n\t\t\tremoteInfo = \"sample1_unittest-static\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t404884A50E2F7C0400CF7658 /* Copy Headers Internal */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = Headers/internal;\n\t\t\tdstSubfolderSpec = 6;\n\t\t\tfiles = (\n\t\t\t\t404884A00E2F7BE600CF7658 /* gtest-death-test-internal.h in Copy Headers Internal */,\n\t\t\t\t404884A10E2F7BE600CF7658 /* gtest-filepath.h in Copy Headers Internal */,\n\t\t\t\t404884A20E2F7BE600CF7658 /* gtest-internal.h in Copy Headers Internal */,\n\t\t\t\t4539C9380EC280E200A70F4C /* gtest-linked_ptr.h in Copy Headers Internal */,\n\t\t\t\t4539C9390EC280E200A70F4C /* gtest-param-util-generated.h in Copy Headers Internal */,\n\t\t\t\t4539C93A0EC280E200A70F4C /* gtest-param-util.h in Copy Headers Internal */,\n\t\t\t\t404884A30E2F7BE600CF7658 /* gtest-port.h in Copy Headers Internal */,\n\t\t\t\t404884A40E2F7BE600CF7658 /* gtest-string.h in Copy Headers Internal */,\n\t\t\t\t40899F500FFA7281000B29AE /* gtest-tuple.h in Copy Headers Internal */,\n\t\t\t\t3BF6F2A00E79B5AD000F2EEE /* gtest-type-util.h in Copy Headers Internal */,\n\t\t\t);\n\t\t\tname = \"Copy Headers Internal\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t224A12A10E9EADA700BD17FD /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = \"gtest-all.cc\"; sourceTree = \"<group>\"; };\n\t\t224A12A20E9EADCC00BD17FD /* gtest-test-part.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = \"gtest-test-part.h\"; sourceTree = \"<group>\"; };\n\t\t3B238C120E7FE13C00846E11 /* gtest_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gtest_unittest.cc; sourceTree = \"<group>\"; };\n\t\t3B87D2100E96B92E000D1852 /* runtests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = runtests.sh; sourceTree = \"<group>\"; };\n\t\t3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-type-util.h\"; sourceTree = \"<group>\"; };\n\t\t3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-typed-test.h\"; sourceTree = \"<group>\"; };\n\t\t403EE37C0E377822004BD1E2 /* versiongenerate.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = versiongenerate.py; sourceTree = \"<group>\"; };\n\t\t404883DB0E2F799B00CF7658 /* gtest-death-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-death-test.h\"; sourceTree = \"<group>\"; };\n\t\t404883DC0E2F799B00CF7658 /* gtest-message.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-message.h\"; sourceTree = \"<group>\"; };\n\t\t404883DD0E2F799B00CF7658 /* gtest-spi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-spi.h\"; sourceTree = \"<group>\"; };\n\t\t404883DE0E2F799B00CF7658 /* gtest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest.h; sourceTree = \"<group>\"; };\n\t\t404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest_pred_impl.h; sourceTree = \"<group>\"; };\n\t\t404883E00E2F799B00CF7658 /* gtest_prod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest_prod.h; sourceTree = \"<group>\"; };\n\t\t404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-death-test-internal.h\"; sourceTree = \"<group>\"; };\n\t\t404883E30E2F799B00CF7658 /* gtest-filepath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-filepath.h\"; sourceTree = \"<group>\"; };\n\t\t404883E40E2F799B00CF7658 /* gtest-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-internal.h\"; sourceTree = \"<group>\"; };\n\t\t404883E50E2F799B00CF7658 /* gtest-port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-port.h\"; sourceTree = \"<group>\"; };\n\t\t404883E60E2F799B00CF7658 /* gtest-string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-string.h\"; sourceTree = \"<group>\"; };\n\t\t404883F60E2F799B00CF7658 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README; path = ../README; sourceTree = SOURCE_ROOT; };\n\t\t4048840D0E2F799B00CF7658 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gtest_main.cc; sourceTree = \"<group>\"; };\n\t\t404884A90E2F7CD900CF7658 /* CHANGES */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CHANGES; path = ../CHANGES; sourceTree = SOURCE_ROOT; };\n\t\t404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CONTRIBUTORS; path = ../CONTRIBUTORS; sourceTree = SOURCE_ROOT; };\n\t\t404884AB0E2F7CD900CF7658 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = COPYING; path = ../COPYING; sourceTree = SOURCE_ROOT; };\n\t\t40899F430FFA7184000B29AE /* gtest_unittest-framework */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = \"gtest_unittest-framework\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t40899F4D0FFA7271000B29AE /* gtest-tuple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-tuple.h\"; sourceTree = \"<group>\"; };\n\t\t40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = StaticLibraryTarget.xcconfig; sourceTree = \"<group>\"; };\n\t\t4089A0130FFACEFC000B29AE /* sample1_unittest-framework */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = \"sample1_unittest-framework\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t4089A02C0FFACF7F000B29AE /* sample1.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sample1.cc; sourceTree = \"<group>\"; };\n\t\t4089A02D0FFACF7F000B29AE /* sample1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sample1.h; sourceTree = \"<group>\"; };\n\t\t4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sample1_unittest.cc; sourceTree = \"<group>\"; };\n\t\t40C848FA101A209C0083642A /* libgtest.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t40C8490B101A217E0083642A /* libgtest_main.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest_main.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t40C84987101A36850083642A /* gtest_unittest */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = gtest_unittest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t40C84997101A36A60083642A /* sample1_unittest-static */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = \"sample1_unittest-static\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t40D4CDF10E30E07400294801 /* DebugProject.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = DebugProject.xcconfig; sourceTree = \"<group>\"; };\n\t\t40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = FrameworkTarget.xcconfig; sourceTree = \"<group>\"; };\n\t\t40D4CDF30E30E07400294801 /* General.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = General.xcconfig; sourceTree = \"<group>\"; };\n\t\t40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ReleaseProject.xcconfig; sourceTree = \"<group>\"; };\n\t\t40D4CF510E30F5E200294801 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t4539C8FF0EC27F6400A70F4C /* gtest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = gtest.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t4539C9330EC280AE00A70F4C /* gtest-param-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-param-test.h\"; sourceTree = \"<group>\"; };\n\t\t4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-linked_ptr.h\"; sourceTree = \"<group>\"; };\n\t\t4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-param-util-generated.h\"; sourceTree = \"<group>\"; };\n\t\t4539C9370EC280E200A70F4C /* gtest-param-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"gtest-param-util.h\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t40899F410FFA7184000B29AE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C849A4101A37150083642A /* gtest.framework in Frameworks */,\n\t\t\t\t40C84916101A235B0083642A /* libgtest_main.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t4089A0110FFACEFC000B29AE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C849A2101A37050083642A /* gtest.framework in Frameworks */,\n\t\t\t\t40C84921101A23AD0083642A /* libgtest_main.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t40C84981101A36850083642A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C84982101A36850083642A /* libgtest.a in Frameworks */,\n\t\t\t\t40C84983101A36850083642A /* libgtest_main.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t40C84991101A36A60083642A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C84992101A36A60083642A /* libgtest.a in Frameworks */,\n\t\t\t\t40C84993101A36A60083642A /* libgtest_main.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t034768DDFF38A45A11DB9C8B /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4539C8FF0EC27F6400A70F4C /* gtest.framework */,\n\t\t\t\t40C848FA101A209C0083642A /* libgtest.a */,\n\t\t\t\t40C8490B101A217E0083642A /* libgtest_main.a */,\n\t\t\t\t40899F430FFA7184000B29AE /* gtest_unittest-framework */,\n\t\t\t\t40C84987101A36850083642A /* gtest_unittest */,\n\t\t\t\t4089A0130FFACEFC000B29AE /* sample1_unittest-framework */,\n\t\t\t\t40C84997101A36A60083642A /* sample1_unittest-static */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0867D691FE84028FC02AAC07 /* gtest */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t40D4CDF00E30E07400294801 /* Config */,\n\t\t\t\t08FB77ACFE841707C02AAC07 /* Source */,\n\t\t\t\t40D4CF4E0E30F5E200294801 /* Resources */,\n\t\t\t\t403EE37B0E377822004BD1E2 /* Scripts */,\n\t\t\t\t034768DDFF38A45A11DB9C8B /* Products */,\n\t\t\t);\n\t\t\tname = gtest;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t08FB77ACFE841707C02AAC07 /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t404884A90E2F7CD900CF7658 /* CHANGES */,\n\t\t\t\t404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */,\n\t\t\t\t404884AB0E2F7CD900CF7658 /* COPYING */,\n\t\t\t\t404883F60E2F799B00CF7658 /* README */,\n\t\t\t\t404883D90E2F799B00CF7658 /* include */,\n\t\t\t\t4089A02F0FFACF84000B29AE /* samples */,\n\t\t\t\t404884070E2F799B00CF7658 /* src */,\n\t\t\t\t3B238BF00E7FE13B00846E11 /* test */,\n\t\t\t);\n\t\t\tname = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3B238BF00E7FE13B00846E11 /* test */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B238C120E7FE13C00846E11 /* gtest_unittest.cc */,\n\t\t\t);\n\t\t\tname = test;\n\t\t\tpath = ../test;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t403EE37B0E377822004BD1E2 /* Scripts */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t403EE37C0E377822004BD1E2 /* versiongenerate.py */,\n\t\t\t\t3B87D2100E96B92E000D1852 /* runtests.sh */,\n\t\t\t);\n\t\t\tpath = Scripts;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t404883D90E2F799B00CF7658 /* include */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t404883DA0E2F799B00CF7658 /* gtest */,\n\t\t\t);\n\t\t\tname = include;\n\t\t\tpath = ../include;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t404883DA0E2F799B00CF7658 /* gtest */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t404883E10E2F799B00CF7658 /* internal */,\n\t\t\t\t224A12A20E9EADCC00BD17FD /* gtest-test-part.h */,\n\t\t\t\t404883DB0E2F799B00CF7658 /* gtest-death-test.h */,\n\t\t\t\t404883DC0E2F799B00CF7658 /* gtest-message.h */,\n\t\t\t\t4539C9330EC280AE00A70F4C /* gtest-param-test.h */,\n\t\t\t\t404883DD0E2F799B00CF7658 /* gtest-spi.h */,\n\t\t\t\t404883DE0E2F799B00CF7658 /* gtest.h */,\n\t\t\t\t404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */,\n\t\t\t\t404883E00E2F799B00CF7658 /* gtest_prod.h */,\n\t\t\t\t3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */,\n\t\t\t);\n\t\t\tpath = gtest;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t404883E10E2F799B00CF7658 /* internal */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */,\n\t\t\t\t404883E30E2F799B00CF7658 /* gtest-filepath.h */,\n\t\t\t\t404883E40E2F799B00CF7658 /* gtest-internal.h */,\n\t\t\t\t4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */,\n\t\t\t\t4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */,\n\t\t\t\t4539C9370EC280E200A70F4C /* gtest-param-util.h */,\n\t\t\t\t404883E50E2F799B00CF7658 /* gtest-port.h */,\n\t\t\t\t404883E60E2F799B00CF7658 /* gtest-string.h */,\n\t\t\t\t40899F4D0FFA7271000B29AE /* gtest-tuple.h */,\n\t\t\t\t3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */,\n\t\t\t);\n\t\t\tpath = internal;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t404884070E2F799B00CF7658 /* src */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t224A12A10E9EADA700BD17FD /* gtest-all.cc */,\n\t\t\t\t4048840D0E2F799B00CF7658 /* gtest_main.cc */,\n\t\t\t);\n\t\t\tname = src;\n\t\t\tpath = ../src;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t4089A02F0FFACF84000B29AE /* samples */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4089A02C0FFACF7F000B29AE /* sample1.cc */,\n\t\t\t\t4089A02D0FFACF7F000B29AE /* sample1.h */,\n\t\t\t\t4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */,\n\t\t\t);\n\t\t\tname = samples;\n\t\t\tpath = ../samples;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t40D4CDF00E30E07400294801 /* Config */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t40D4CDF10E30E07400294801 /* DebugProject.xcconfig */,\n\t\t\t\t40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */,\n\t\t\t\t40D4CDF30E30E07400294801 /* General.xcconfig */,\n\t\t\t\t40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */,\n\t\t\t\t40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */,\n\t\t\t);\n\t\t\tpath = Config;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t40D4CF4E0E30F5E200294801 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t40D4CF510E30F5E200294801 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t8D07F2BD0486CC7A007CD1D0 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t404884380E2F799B00CF7658 /* gtest-death-test.h in Headers */,\n\t\t\t\t404884390E2F799B00CF7658 /* gtest-message.h in Headers */,\n\t\t\t\t4539C9340EC280AE00A70F4C /* gtest-param-test.h in Headers */,\n\t\t\t\t3BF6F2A50E79B616000F2EEE /* gtest-typed-test.h in Headers */,\n\t\t\t\t4048843A0E2F799B00CF7658 /* gtest-spi.h in Headers */,\n\t\t\t\t4048843B0E2F799B00CF7658 /* gtest.h in Headers */,\n\t\t\t\t4048843C0E2F799B00CF7658 /* gtest_pred_impl.h in Headers */,\n\t\t\t\t4048843D0E2F799B00CF7658 /* gtest_prod.h in Headers */,\n\t\t\t\t224A12A30E9EADCC00BD17FD /* gtest-test-part.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t40899F420FFA7184000B29AE /* gtest_unittest-framework */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 40899F4A0FFA71BC000B29AE /* Build configuration list for PBXNativeTarget \"gtest_unittest-framework\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t40899F400FFA7184000B29AE /* Sources */,\n\t\t\t\t40899F410FFA7184000B29AE /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t40C849A0101A36F10083642A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"gtest_unittest-framework\";\n\t\t\tproductName = gtest_unittest;\n\t\t\tproductReference = 40899F430FFA7184000B29AE /* gtest_unittest-framework */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t4089A0120FFACEFC000B29AE /* sample1_unittest-framework */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 4089A0240FFACF01000B29AE /* Build configuration list for PBXNativeTarget \"sample1_unittest-framework\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t4089A0100FFACEFC000B29AE /* Sources */,\n\t\t\t\t4089A0110FFACEFC000B29AE /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t40C8499E101A36E50083642A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"sample1_unittest-framework\";\n\t\t\tproductName = sample1_unittest;\n\t\t\tproductReference = 4089A0130FFACEFC000B29AE /* sample1_unittest-framework */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t40C848F9101A209C0083642A /* gtest-static */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 40C84902101A212E0083642A /* Build configuration list for PBXNativeTarget \"gtest-static\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t40C848F7101A209C0083642A /* Sources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"gtest-static\";\n\t\t\tproductName = \"gtest-static\";\n\t\t\tproductReference = 40C848FA101A209C0083642A /* libgtest.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t40C8490A101A217E0083642A /* gtest_main-static */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 40C84912101A21D20083642A /* Build configuration list for PBXNativeTarget \"gtest_main-static\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t40C84908101A217E0083642A /* Sources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"gtest_main-static\";\n\t\t\tproductName = \"gtest_main-static\";\n\t\t\tproductReference = 40C8490B101A217E0083642A /* libgtest_main.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t40C8497A101A36850083642A /* gtest_unittest-static */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 40C84984101A36850083642A /* Build configuration list for PBXNativeTarget \"gtest_unittest-static\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t40C8497F101A36850083642A /* Sources */,\n\t\t\t\t40C84981101A36850083642A /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t40C8497B101A36850083642A /* PBXTargetDependency */,\n\t\t\t\t40C8497D101A36850083642A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"gtest_unittest-static\";\n\t\t\tproductName = gtest_unittest;\n\t\t\tproductReference = 40C84987101A36850083642A /* gtest_unittest */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t40C84989101A36A60083642A /* sample1_unittest-static */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 40C84994101A36A60083642A /* Build configuration list for PBXNativeTarget \"sample1_unittest-static\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t40C8498E101A36A60083642A /* Sources */,\n\t\t\t\t40C84991101A36A60083642A /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t40C8498A101A36A60083642A /* PBXTargetDependency */,\n\t\t\t\t40C8498C101A36A60083642A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"sample1_unittest-static\";\n\t\t\tproductName = sample1_unittest;\n\t\t\tproductReference = 40C84997101A36A60083642A /* sample1_unittest-static */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n\t\t8D07F2BC0486CC7A007CD1D0 /* gtest-framework */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget \"gtest-framework\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8D07F2C10486CC7A007CD1D0 /* Sources */,\n\t\t\t\t8D07F2BD0486CC7A007CD1D0 /* Headers */,\n\t\t\t\t404884A50E2F7C0400CF7658 /* Copy Headers Internal */,\n\t\t\t\t8D07F2BF0486CC7A007CD1D0 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t40C44AE60E379922008FCC51 /* PBXTargetDependency */,\n\t\t\t\t408BEC101046CFE900DEF522 /* PBXTargetDependency */,\n\t\t\t\t40C8499C101A36DC0083642A /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"gtest-framework\";\n\t\t\tproductInstallPath = \"$(HOME)/Library/Frameworks\";\n\t\t\tproductName = gtest;\n\t\t\tproductReference = 4539C8FF0EC27F6400A70F4C /* gtest.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t0867D690FE84028FC02AAC07 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tbuildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject \"gtest\" */;\n\t\t\tcompatibilityVersion = \"Xcode 2.4\";\n\t\t\thasScannedForEncodings = 1;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\tJapanese,\n\t\t\t\tFrench,\n\t\t\t\tGerman,\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 0867D691FE84028FC02AAC07 /* gtest */;\n\t\t\tproductRefGroup = 034768DDFF38A45A11DB9C8B /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8D07F2BC0486CC7A007CD1D0 /* gtest-framework */,\n\t\t\t\t40C848F9101A209C0083642A /* gtest-static */,\n\t\t\t\t40C8490A101A217E0083642A /* gtest_main-static */,\n\t\t\t\t40899F420FFA7184000B29AE /* gtest_unittest-framework */,\n\t\t\t\t40C8497A101A36850083642A /* gtest_unittest-static */,\n\t\t\t\t4089A0120FFACEFC000B29AE /* sample1_unittest-framework */,\n\t\t\t\t40C84989101A36A60083642A /* sample1_unittest-static */,\n\t\t\t\t3B238F5F0E828B5400846E11 /* Check */,\n\t\t\t\t40C44ADC0E3798F4008FCC51 /* Version Info */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t8D07F2BF0486CC7A007CD1D0 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t404884500E2F799B00CF7658 /* README in Resources */,\n\t\t\t\t404884AC0E2F7CD900CF7658 /* CHANGES in Resources */,\n\t\t\t\t404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */,\n\t\t\t\t404884AE0E2F7CD900CF7658 /* COPYING in Resources */,\n\t\t\t\t40C84978101A36540083642A /* libgtest_main.a in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B238F5E0E828B5400846E11 /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"# Remember, this \\\"Run Script\\\" build phase will be executed from $SRCROOT\\n/bin/bash Scripts/runtests.sh\";\n\t\t};\n\t\t40C44ADB0E3798F4008FCC51 /* Generate Version.h */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"$(SRCROOT)/Scripts/versiongenerate.py\",\n\t\t\t\t\"$(SRCROOT)/../configure.ac\",\n\t\t\t);\n\t\t\tname = \"Generate Version.h\";\n\t\t\toutputPaths = (\n\t\t\t\t\"$(PROJECT_TEMP_DIR)/Version.h\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"# Remember, this \\\"Run Script\\\" build phase will be executed from $SRCROOT\\n/usr/bin/python Scripts/versiongenerate.py ../ $PROJECT_TEMP_DIR\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t40899F400FFA7184000B29AE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40899F530FFA72A0000B29AE /* gtest_unittest.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t4089A0100FFACEFC000B29AE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t4089A0440FFAD1BE000B29AE /* sample1.cc in Sources */,\n\t\t\t\t4089A0460FFAD1BE000B29AE /* sample1_unittest.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t40C848F7101A209C0083642A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C848FF101A21150083642A /* gtest-all.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t40C84908101A217E0083642A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C84915101A21DF0083642A /* gtest_main.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t40C8497F101A36850083642A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C84980101A36850083642A /* gtest_unittest.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t40C8498E101A36A60083642A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40C8498F101A36A60083642A /* sample1.cc in Sources */,\n\t\t\t\t40C84990101A36A60083642A /* sample1_unittest.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8D07F2C10486CC7A007CD1D0 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t40899F3A0FFA70D4000B29AE /* gtest-all.cc in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t40899F9D0FFA740F000B29AE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40899F420FFA7184000B29AE /* gtest_unittest-framework */;\n\t\t\ttargetProxy = 40899F9C0FFA740F000B29AE /* PBXContainerItemProxy */;\n\t\t};\n\t\t4089A0980FFAD34A000B29AE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 4089A0120FFACEFC000B29AE /* sample1_unittest-framework */;\n\t\t\ttargetProxy = 4089A0970FFAD34A000B29AE /* PBXContainerItemProxy */;\n\t\t};\n\t\t408BEC101046CFE900DEF522 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C848F9101A209C0083642A /* gtest-static */;\n\t\t\ttargetProxy = 408BEC0F1046CFE900DEF522 /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C44AE60E379922008FCC51 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C44ADC0E3798F4008FCC51 /* Version Info */;\n\t\t\ttargetProxy = 40C44AE50E379922008FCC51 /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C8497B101A36850083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C848F9101A209C0083642A /* gtest-static */;\n\t\t\ttargetProxy = 40C8497C101A36850083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C8497D101A36850083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C8490A101A217E0083642A /* gtest_main-static */;\n\t\t\ttargetProxy = 40C8497E101A36850083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C8498A101A36A60083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C848F9101A209C0083642A /* gtest-static */;\n\t\t\ttargetProxy = 40C8498B101A36A60083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C8498C101A36A60083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C8490A101A217E0083642A /* gtest_main-static */;\n\t\t\ttargetProxy = 40C8498D101A36A60083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C8499C101A36DC0083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C8490A101A217E0083642A /* gtest_main-static */;\n\t\t\ttargetProxy = 40C8499B101A36DC0083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C8499E101A36E50083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8D07F2BC0486CC7A007CD1D0 /* gtest-framework */;\n\t\t\ttargetProxy = 40C8499D101A36E50083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C849A0101A36F10083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8D07F2BC0486CC7A007CD1D0 /* gtest-framework */;\n\t\t\ttargetProxy = 40C8499F101A36F10083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C849F7101A43440083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C8497A101A36850083642A /* gtest_unittest-static */;\n\t\t\ttargetProxy = 40C849F6101A43440083642A /* PBXContainerItemProxy */;\n\t\t};\n\t\t40C849F9101A43490083642A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 40C84989101A36A60083642A /* sample1_unittest-static */;\n\t\t\ttargetProxy = 40C849F8101A43490083642A /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t3B238F600E828B5400846E11 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tPRODUCT_NAME = Check;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t3B238F610E828B5400846E11 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_ENABLE_FIX_AND_CONTINUE = NO;\n\t\t\t\tPRODUCT_NAME = Check;\n\t\t\t\tZERO_LINK = NO;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t40899F450FFA7185000B29AE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = ../;\n\t\t\t\tPRODUCT_NAME = \"gtest_unittest-framework\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t40899F460FFA7185000B29AE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = ../;\n\t\t\t\tPRODUCT_NAME = \"gtest_unittest-framework\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4089A0150FFACEFD000B29AE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = \"sample1_unittest-framework\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4089A0160FFACEFD000B29AE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = \"sample1_unittest-framework\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t40C44ADF0E3798F4008FCC51 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t\tTARGET_NAME = gtest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t40C44AE00E3798F4008FCC51 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t\tTARGET_NAME = gtest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t40C848FB101A209D0083642A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_INLINES_ARE_PRIVATE_EXTERN = YES;\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../,\n\t\t\t\t\t../include/,\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t40C848FC101A209D0083642A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_INLINES_ARE_PRIVATE_EXTERN = YES;\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../,\n\t\t\t\t\t../include/,\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t40C8490E101A217F0083642A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../,\n\t\t\t\t\t../include/,\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = gtest_main;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t40C8490F101A217F0083642A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../,\n\t\t\t\t\t../include/,\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = gtest_main;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t40C84985101A36850083642A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = ../;\n\t\t\t\tPRODUCT_NAME = gtest_unittest;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t40C84986101A36850083642A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tHEADER_SEARCH_PATHS = ../;\n\t\t\t\tPRODUCT_NAME = gtest_unittest;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t40C84995101A36A60083642A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = \"sample1_unittest-static\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t40C84996101A36A60083642A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = \"sample1_unittest-static\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4FADC24308B4156D00ABE55E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../,\n\t\t\t\t\t../include/,\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Resources/Info.plist;\n\t\t\t\tINFOPLIST_PREFIX_HEADER = \"$(PROJECT_TEMP_DIR)/Version.h\";\n\t\t\t\tINFOPLIST_PREPROCESS = YES;\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4FADC24408B4156D00ABE55E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t../,\n\t\t\t\t\t../include/,\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Resources/Info.plist;\n\t\t\t\tINFOPLIST_PREFIX_HEADER = \"$(PROJECT_TEMP_DIR)/Version.h\";\n\t\t\t\tINFOPLIST_PREPROCESS = YES;\n\t\t\t\tPRODUCT_NAME = gtest;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4FADC24708B4156D00ABE55E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40D4CDF10E30E07400294801 /* DebugProject.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4FADC24808B4156D00ABE55E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t3B238FA30E828BB600846E11 /* Build configuration list for PBXAggregateTarget \"Check\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t3B238F600E828B5400846E11 /* Debug */,\n\t\t\t\t3B238F610E828B5400846E11 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t40899F4A0FFA71BC000B29AE /* Build configuration list for PBXNativeTarget \"gtest_unittest-framework\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t40899F450FFA7185000B29AE /* Debug */,\n\t\t\t\t40899F460FFA7185000B29AE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4089A0240FFACF01000B29AE /* Build configuration list for PBXNativeTarget \"sample1_unittest-framework\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4089A0150FFACEFD000B29AE /* Debug */,\n\t\t\t\t4089A0160FFACEFD000B29AE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t40C44AE40E379905008FCC51 /* Build configuration list for PBXAggregateTarget \"Version Info\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t40C44ADF0E3798F4008FCC51 /* Debug */,\n\t\t\t\t40C44AE00E3798F4008FCC51 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t40C84902101A212E0083642A /* Build configuration list for PBXNativeTarget \"gtest-static\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t40C848FB101A209D0083642A /* Debug */,\n\t\t\t\t40C848FC101A209D0083642A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t40C84912101A21D20083642A /* Build configuration list for PBXNativeTarget \"gtest_main-static\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t40C8490E101A217F0083642A /* Debug */,\n\t\t\t\t40C8490F101A217F0083642A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t40C84984101A36850083642A /* Build configuration list for PBXNativeTarget \"gtest_unittest-static\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t40C84985101A36850083642A /* Debug */,\n\t\t\t\t40C84986101A36850083642A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t40C84994101A36A60083642A /* Build configuration list for PBXNativeTarget \"sample1_unittest-static\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t40C84995101A36A60083642A /* Debug */,\n\t\t\t\t40C84996101A36A60083642A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget \"gtest-framework\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4FADC24308B4156D00ABE55E /* Debug */,\n\t\t\t\t4FADC24408B4156D00ABE55E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject \"gtest\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4FADC24708B4156D00ABE55E /* Debug */,\n\t\t\t\t4FADC24808B4156D00ABE55E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 0867D690FE84028FC02AAC07 /* Project object */;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/README.txt",
    "content": "Protocol Buffers - Google's data interchange format\nCopyright 2008 Google Inc.\n\nThis directory contains the Java Protocol Buffers runtime library.\n\nInstallation - With Maven\n=========================\n\nThe Protocol Buffers build is managed using Maven.  If you would\nrather build without Maven, see below.\n\n1) Install Apache Maven if you don't have it:\n\n     http://maven.apache.org/\n\n2) Build the C++ code, or obtain a binary distribution of protoc.  If\n   you install a binary distribution, make sure that it is the same\n   version as this package.  If in doubt, run:\n\n     $ protoc --version\n\n   You will need to place the protoc executable in ../src.  (If you\n   built it yourself, it should already be there.)\n\n3) Run the tests:\n\n     $ mvn test\n\n   If some tests fail, this library may not work correctly on your\n   system.  Continue at your own risk.\n\n4) Install the library into your Maven repository:\n\n     $ mvn install\n\n5) If you do not use Maven to manage your own build, you can build a\n   .jar file to use:\n\n     $ mvn package\n\n   The .jar will be placed in the \"target\" directory.\n\nInstallation - 'Lite' Version - With Maven\n==========================================\n\nBuilding the 'lite' version of the Java Protocol Buffers library is\nthe same as building the full version, except that all commands are\nrun using the 'lite' profile.  (see\nhttp://maven.apache.org/guides/introduction/introduction-to-profiles.html)\n\nE.g. to install the lite version of the jar, you would run:\n\n  $ mvn install -P lite\n\nThe resulting artifact has the 'lite' classifier.  To reference it\nfor dependency resolution, you would specify it as:\n\n  <dependency>\n    <groupId>com.google.protobuf</groupId>\n    <artifactId>protobuf-java</artifactId>\n    <version>${version}</version>\n    <classifier>lite</classifier>\n  </dependency>\n\nInstallation - Without Maven\n============================\n\nIf you would rather not install Maven to build the library, you may\nfollow these instructions instead.  Note that these instructions skip\nrunning unit tests.\n\n1) Build the C++ code, or obtain a binary distribution of protoc.  If\n   you install a binary distribution, make sure that it is the same\n   version as this package.  If in doubt, run:\n\n     $ protoc --version\n\n   If you built the C++ code without installing, the compiler binary\n   should be located in ../src.\n\n2) Invoke protoc to build DescriptorProtos.java:\n\n     $ protoc --java_out=src/main/java -I../src \\\n         ../src/google/protobuf/descriptor.proto\n\n3) Compile the code in src/main/java using whatever means you prefer.\n\n4) Install the classes wherever you prefer.\n\nUsage\n=====\n\nThe complete documentation for Protocol Buffers is available via the\nweb at:\n\n  http://code.google.com/apis/protocolbuffers/\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n  <parent>\n    <groupId>com.google</groupId>\n    <artifactId>google</artifactId>\n    <version>1</version>\n  </parent>\n  <groupId>com.google.protobuf</groupId>\n  <artifactId>protobuf-java</artifactId>\n  <version>2.4.2-pre</version>\n  <packaging>jar</packaging>\n  <name>Protocol Buffer Java API</name>\n  <description>\n    Protocol Buffers are a way of encoding structured data in an efficient yet\n    extensible format.\n  </description>\n  <inceptionYear>2008</inceptionYear>\n  <url>http://code.google.com/p/protobuf</url>\n  <licenses>\n    <license>\n      <name>New BSD license</name>\n      <url>http://www.opensource.org/licenses/bsd-license.php</url>\n      <distribution>repo</distribution>\n    </license>\n  </licenses>\n  <scm>\n    <url>http://code.google.com/p/protobuf/source/browse</url>\n    <connection>\n      scm:svn:http://protobuf.googlecode.com/svn/trunk/\n    </connection>\n  </scm>\n  <dependencies>\n    <dependency>\n      <groupId>junit</groupId>\n      <artifactId>junit</artifactId>\n      <version>4.4</version>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.easymock</groupId>\n      <artifactId>easymock</artifactId>\n      <version>2.2</version>\n      <scope>test</scope>\n    </dependency>\n    <dependency>\n      <groupId>org.easymock</groupId>\n      <artifactId>easymockclassextension</artifactId>\n      <version>2.2.1</version>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n  <build>\n    <plugins>\n      <plugin>\n        <artifactId>maven-compiler-plugin</artifactId>\n        <configuration>\n          <source>1.5</source>\n          <target>1.5</target>\n        </configuration>\n      </plugin>\n      <plugin>\n        <artifactId>maven-surefire-plugin</artifactId>\n        <configuration>\n          <includes>\n            <include>**/*Test.java</include>\n          </includes>\n        </configuration>\n      </plugin>\n      <plugin>\n        <artifactId>maven-antrun-plugin</artifactId>\n        <executions>\n          <execution>\n            <id>generate-sources</id>\n            <phase>generate-sources</phase>\n            <configuration>\n              <tasks>\n                <mkdir dir=\"target/generated-sources\" />\n                <exec executable=\"../src/protoc\">\n                  <arg value=\"--java_out=target/generated-sources\" />\n                  <arg value=\"--proto_path=../src\" />\n                  <arg value=\"../src/google/protobuf/descriptor.proto\" />\n                </exec>\n              </tasks>\n              <sourceRoot>target/generated-sources</sourceRoot>\n            </configuration>\n            <goals>\n              <goal>run</goal>\n            </goals>\n          </execution>\n          <execution>\n            <id>generate-test-sources</id>\n            <phase>generate-test-sources</phase>\n            <configuration>\n              <tasks>\n                <mkdir dir=\"target/generated-test-sources\" />\n                <exec executable=\"../src/protoc\">\n                  <arg value=\"--java_out=target/generated-test-sources\" />\n                  <arg value=\"--proto_path=../src\" />\n                  <arg value=\"--proto_path=src/test/java\" />\n                  <arg value=\"../src/google/protobuf/unittest.proto\" />\n                  <arg value=\"../src/google/protobuf/unittest_import.proto\" />\n                  <arg value=\"../src/google/protobuf/unittest_mset.proto\" />\n                  <arg\n                    value=\"src/test/java/com/google/protobuf/multiple_files_test.proto\" />\n                  <arg value=\"src/test/java/com/google/protobuf/nested_builders_test.proto\" />\n                  <arg value=\"src/test/java/com/google/protobuf/nested_extension.proto\" />\n                  <arg value=\"src/test/java/com/google/protobuf/nested_extension_lite.proto\" />\n                  <arg value=\"src/test/java/com/google/protobuf/non_nested_extension.proto\" />\n                  <arg value=\"src/test/java/com/google/protobuf/non_nested_extension_lite.proto\" />\n                  <arg value=\"src/test/java/com/google/protobuf/test_bad_identifiers.proto\" />\n                  <arg\n                    value=\"../src/google/protobuf/unittest_optimize_for.proto\" />\n                  <arg\n                    value=\"../src/google/protobuf/unittest_custom_options.proto\" />\n                  <arg value=\"../src/google/protobuf/unittest_lite.proto\" />\n                  <arg value=\"../src/google/protobuf/unittest_import_lite.proto\" />\n                  <arg value=\"../src/google/protobuf/unittest_lite_imports_nonlite.proto\" />\n                  <arg value=\"../src/google/protobuf/unittest_enormous_descriptor.proto\" />\n                  <arg value=\"../src/google/protobuf/unittest_no_generic_services.proto\" />\n                </exec>\n              </tasks>\n              <testSourceRoot>target/generated-test-sources</testSourceRoot>\n            </configuration>\n            <goals>\n              <goal>run</goal>\n            </goals>\n          </execution>\n        </executions>\n      </plugin>\n    </plugins>\n  </build>\n  <profiles>\n    <profile>\n      <id>lite</id>\n      <build>\n        <plugins>\n          <plugin>\n            <artifactId>maven-compiler-plugin</artifactId>\n            <configuration>\n              <includes>\n                <include>**/AbstractMessageLite.java</include>\n                <include>**/ByteString.java</include>\n                <include>**/CodedInputStream.java</include>\n                <include>**/CodedOutputStream.java</include>\n                <include>**/ExtensionRegistryLite.java</include>\n                <include>**/FieldSet.java</include>\n                <include>**/GeneratedMessageLite.java</include>\n                <include>**/Internal.java</include>\n                <include>**/InvalidProtocolBufferException.java</include>\n                <include>**/LazyStringArrayList.java</include>\n                <include>**/LazyStringList.java</include>\n                <include>**/MessageLite.java</include>\n                <include>**/MessageLiteOrBuilder.java</include>\n                <include>**/SmallSortedMap.java</include>\n                <include>**/UninitializedMessageException.java</include>\n                <include>**/UnmodifiableLazyStringList.java</include>\n                <include>**/WireFormat.java</include>\n              </includes>\n              <testIncludes>\n                <testInclude>**/LiteTest.java</testInclude>\n                <testInclude>**/*Lite.java</testInclude>\n              </testIncludes>\n            </configuration>\n          </plugin>\n          <plugin>\n            <artifactId>maven-surefire-plugin</artifactId>\n            <configuration>\n              <includes>\n                <include>**/LiteTest.java</include>\n              </includes>\n            </configuration>\n          </plugin>\n          <plugin>\n            <artifactId>maven-jar-plugin</artifactId>\n            <configuration>\n              <classifier>lite</classifier>\n            </configuration>\n          </plugin>\n        </plugins>\n      </build>\n    </profile>\n  </profiles>\n</project>\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport com.google.protobuf.Descriptors.Descriptor;\nimport com.google.protobuf.Descriptors.FieldDescriptor;\nimport com.google.protobuf.Internal.EnumLite;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * A partial implementation of the {@link Message} interface which implements\n * as many methods of that interface as possible in terms of other methods.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic abstract class AbstractMessage extends AbstractMessageLite\n                                      implements Message {\n  @SuppressWarnings(\"unchecked\")\n  public boolean isInitialized() {\n    // Check that all required fields are present.\n    for (final FieldDescriptor field : getDescriptorForType().getFields()) {\n      if (field.isRequired()) {\n        if (!hasField(field)) {\n          return false;\n        }\n      }\n    }\n\n    // Check that embedded messages are initialized.\n    for (final Map.Entry<FieldDescriptor, Object> entry :\n        getAllFields().entrySet()) {\n      final FieldDescriptor field = entry.getKey();\n      if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n        if (field.isRepeated()) {\n          for (final Message element : (List<Message>) entry.getValue()) {\n            if (!element.isInitialized()) {\n              return false;\n            }\n          }\n        } else {\n          if (!((Message) entry.getValue()).isInitialized()) {\n            return false;\n          }\n        }\n      }\n    }\n\n    return true;\n  }\n\n  @Override\n  public final String toString() {\n    return TextFormat.printToString(this);\n  }\n\n  public void writeTo(final CodedOutputStream output) throws IOException {\n    final boolean isMessageSet =\n        getDescriptorForType().getOptions().getMessageSetWireFormat();\n\n    for (final Map.Entry<FieldDescriptor, Object> entry :\n        getAllFields().entrySet()) {\n      final FieldDescriptor field = entry.getKey();\n      final Object value = entry.getValue();\n      if (isMessageSet && field.isExtension() &&\n          field.getType() == FieldDescriptor.Type.MESSAGE &&\n          !field.isRepeated()) {\n        output.writeMessageSetExtension(field.getNumber(), (Message) value);\n      } else {\n        FieldSet.writeField(field, value, output);\n      }\n    }\n\n    final UnknownFieldSet unknownFields = getUnknownFields();\n    if (isMessageSet) {\n      unknownFields.writeAsMessageSetTo(output);\n    } else {\n      unknownFields.writeTo(output);\n    }\n  }\n\n  private int memoizedSize = -1;\n\n  public int getSerializedSize() {\n    int size = memoizedSize;\n    if (size != -1) {\n      return size;\n    }\n\n    size = 0;\n    final boolean isMessageSet =\n        getDescriptorForType().getOptions().getMessageSetWireFormat();\n\n    for (final Map.Entry<FieldDescriptor, Object> entry :\n        getAllFields().entrySet()) {\n      final FieldDescriptor field = entry.getKey();\n      final Object value = entry.getValue();\n      if (isMessageSet && field.isExtension() &&\n          field.getType() == FieldDescriptor.Type.MESSAGE &&\n          !field.isRepeated()) {\n        size += CodedOutputStream.computeMessageSetExtensionSize(\n            field.getNumber(), (Message) value);\n      } else {\n        size += FieldSet.computeFieldSize(field, value);\n      }\n    }\n\n    final UnknownFieldSet unknownFields = getUnknownFields();\n    if (isMessageSet) {\n      size += unknownFields.getSerializedSizeAsMessageSet();\n    } else {\n      size += unknownFields.getSerializedSize();\n    }\n\n    memoizedSize = size;\n    return size;\n  }\n\n  @Override\n  public boolean equals(final Object other) {\n    if (other == this) {\n      return true;\n    }\n    if (!(other instanceof Message)) {\n      return false;\n    }\n    final Message otherMessage = (Message) other;\n    if (getDescriptorForType() != otherMessage.getDescriptorForType()) {\n      return false;\n    }\n    return getAllFields().equals(otherMessage.getAllFields()) &&\n        getUnknownFields().equals(otherMessage.getUnknownFields());\n  }\n\n  @Override\n  public int hashCode() {\n    int hash = 41;\n    hash = (19 * hash) + getDescriptorForType().hashCode();\n    hash = hashFields(hash, getAllFields());\n    hash = (29 * hash) + getUnknownFields().hashCode();\n    return hash;\n  }\n\n  /** Get a hash code for given fields and values, using the given seed. */\n  @SuppressWarnings(\"unchecked\")\n  protected int hashFields(int hash, Map<FieldDescriptor, Object> map) {\n    for (Map.Entry<FieldDescriptor, Object> entry : map.entrySet()) {\n      FieldDescriptor field = entry.getKey();\n      Object value = entry.getValue();\n      hash = (37 * hash) + field.getNumber();\n      if (field.getType() != FieldDescriptor.Type.ENUM){\n        hash = (53 * hash) + value.hashCode();\n      } else if (field.isRepeated()) {\n        List<? extends EnumLite> list = (List<? extends EnumLite>) value;\n        hash = (53 * hash) + hashEnumList(list);\n      } else {\n        hash = (53 * hash) + hashEnum((EnumLite) value);\n      }\n    }\n    return hash;\n  }\n\n  /**\n   * Helper method for implementing {@link Message#hashCode()}.\n   * @see Boolean#hashCode()\n   */\n  protected static int hashLong(long n) {\n    return (int) (n ^ (n >>> 32));\n  }\n\n  /**\n   * Helper method for implementing {@link Message#hashCode()}.\n   * @see Boolean#hashCode()\n   */\n  protected static int hashBoolean(boolean b) {\n    return b ? 1231 : 1237;\n  }\n\n  /**\n   * Helper method for implementing {@link Message#hashCode()}.\n   * <p>\n   * This is needed because {@link java.lang.Enum#hashCode()} is final, but we\n   * need to use the field number as the hash code to ensure compatibility\n   * between statically and dynamically generated enum objects.\n   */\n  protected static int hashEnum(EnumLite e) {\n    return e.getNumber();\n  }\n\n  /** Helper method for implementing {@link Message#hashCode()}. */\n  protected static int hashEnumList(List<? extends EnumLite> list) {\n    int hash = 1;\n    for (EnumLite e : list) {\n      hash = 31 * hash + hashEnum(e);\n    }\n    return hash;\n  }\n\n  // =================================================================\n\n  /**\n   * A partial implementation of the {@link Message.Builder} interface which\n   * implements as many methods of that interface as possible in terms of\n   * other methods.\n   */\n  @SuppressWarnings(\"unchecked\")\n  public static abstract class Builder<BuilderType extends Builder>\n      extends AbstractMessageLite.Builder<BuilderType>\n      implements Message.Builder {\n    // The compiler produces an error if this is not declared explicitly.\n    @Override\n    public abstract BuilderType clone();\n\n    public BuilderType clear() {\n      for (final Map.Entry<FieldDescriptor, Object> entry :\n           getAllFields().entrySet()) {\n        clearField(entry.getKey());\n      }\n      return (BuilderType) this;\n    }\n\n    public BuilderType mergeFrom(final Message other) {\n      if (other.getDescriptorForType() != getDescriptorForType()) {\n        throw new IllegalArgumentException(\n          \"mergeFrom(Message) can only merge messages of the same type.\");\n      }\n\n      // Note:  We don't attempt to verify that other's fields have valid\n      //   types.  Doing so would be a losing battle.  We'd have to verify\n      //   all sub-messages as well, and we'd have to make copies of all of\n      //   them to insure that they don't change after verification (since\n      //   the Message interface itself cannot enforce immutability of\n      //   implementations).\n      // TODO(kenton):  Provide a function somewhere called makeDeepCopy()\n      //   which allows people to make secure deep copies of messages.\n\n      for (final Map.Entry<FieldDescriptor, Object> entry :\n           other.getAllFields().entrySet()) {\n        final FieldDescriptor field = entry.getKey();\n        if (field.isRepeated()) {\n          for (final Object element : (List)entry.getValue()) {\n            addRepeatedField(field, element);\n          }\n        } else if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n          final Message existingValue = (Message)getField(field);\n          if (existingValue == existingValue.getDefaultInstanceForType()) {\n            setField(field, entry.getValue());\n          } else {\n            setField(field,\n              existingValue.newBuilderForType()\n                .mergeFrom(existingValue)\n                .mergeFrom((Message)entry.getValue())\n                .build());\n          }\n        } else {\n          setField(field, entry.getValue());\n        }\n      }\n\n      mergeUnknownFields(other.getUnknownFields());\n\n      return (BuilderType) this;\n    }\n\n    @Override\n    public BuilderType mergeFrom(final CodedInputStream input)\n                                 throws IOException {\n      return mergeFrom(input, ExtensionRegistry.getEmptyRegistry());\n    }\n\n    @Override\n    public BuilderType mergeFrom(\n        final CodedInputStream input,\n        final ExtensionRegistryLite extensionRegistry)\n        throws IOException {\n      final UnknownFieldSet.Builder unknownFields =\n        UnknownFieldSet.newBuilder(getUnknownFields());\n      while (true) {\n        final int tag = input.readTag();\n        if (tag == 0) {\n          break;\n        }\n\n        if (!mergeFieldFrom(input, unknownFields, extensionRegistry,\n                            this, tag)) {\n          // end group tag\n          break;\n        }\n      }\n      setUnknownFields(unknownFields.build());\n      return (BuilderType) this;\n    }\n\n    /**\n     * Like {@link #mergeFrom(CodedInputStream, UnknownFieldSet.Builder,\n     * ExtensionRegistryLite, Message.Builder)}, but parses a single field.\n     * Package-private because it is used by GeneratedMessage.ExtendableMessage.\n     * @param tag The tag, which should have already been read.\n     * @return {@code true} unless the tag is an end-group tag.\n     */\n    static boolean mergeFieldFrom(\n        final CodedInputStream input,\n        final UnknownFieldSet.Builder unknownFields,\n        final ExtensionRegistryLite extensionRegistry,\n        final Message.Builder builder,\n        final int tag) throws IOException {\n      final Descriptor type = builder.getDescriptorForType();\n\n      if (type.getOptions().getMessageSetWireFormat() &&\n          tag == WireFormat.MESSAGE_SET_ITEM_TAG) {\n        mergeMessageSetExtensionFromCodedStream(\n          input, unknownFields, extensionRegistry, builder);\n        return true;\n      }\n\n      final int wireType = WireFormat.getTagWireType(tag);\n      final int fieldNumber = WireFormat.getTagFieldNumber(tag);\n\n      final FieldDescriptor field;\n      Message defaultInstance = null;\n\n      if (type.isExtensionNumber(fieldNumber)) {\n        // extensionRegistry may be either ExtensionRegistry or\n        // ExtensionRegistryLite.  Since the type we are parsing is a full\n        // message, only a full ExtensionRegistry could possibly contain\n        // extensions of it.  Otherwise we will treat the registry as if it\n        // were empty.\n        if (extensionRegistry instanceof ExtensionRegistry) {\n          final ExtensionRegistry.ExtensionInfo extension =\n            ((ExtensionRegistry) extensionRegistry)\n              .findExtensionByNumber(type, fieldNumber);\n          if (extension == null) {\n            field = null;\n          } else {\n            field = extension.descriptor;\n            defaultInstance = extension.defaultInstance;\n            if (defaultInstance == null &&\n                field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n              throw new IllegalStateException(\n                  \"Message-typed extension lacked default instance: \" +\n                  field.getFullName());\n            }\n          }\n        } else {\n          field = null;\n        }\n      } else {\n        field = type.findFieldByNumber(fieldNumber);\n      }\n\n      boolean unknown = false;\n      boolean packed = false;\n      if (field == null) {\n        unknown = true;  // Unknown field.\n      } else if (wireType == FieldSet.getWireFormatForFieldType(\n                   field.getLiteType(),\n                   false  /* isPacked */)) {\n        packed = false;\n      } else if (field.isPackable() &&\n                 wireType == FieldSet.getWireFormatForFieldType(\n                   field.getLiteType(),\n                   true  /* isPacked */)) {\n        packed = true;\n      } else {\n        unknown = true;  // Unknown wire type.\n      }\n\n      if (unknown) {  // Unknown field or wrong wire type.  Skip.\n        return unknownFields.mergeFieldFrom(tag, input);\n      }\n\n      if (packed) {\n        final int length = input.readRawVarint32();\n        final int limit = input.pushLimit(length);\n        if (field.getLiteType() == WireFormat.FieldType.ENUM) {\n          while (input.getBytesUntilLimit() > 0) {\n            final int rawValue = input.readEnum();\n            final Object value = field.getEnumType().findValueByNumber(rawValue);\n            if (value == null) {\n              // If the number isn't recognized as a valid value for this\n              // enum, drop it (don't even add it to unknownFields).\n              return true;\n            }\n            builder.addRepeatedField(field, value);\n          }\n        } else {\n          while (input.getBytesUntilLimit() > 0) {\n            final Object value =\n              FieldSet.readPrimitiveField(input, field.getLiteType());\n            builder.addRepeatedField(field, value);\n          }\n        }\n        input.popLimit(limit);\n      } else {\n        final Object value;\n        switch (field.getType()) {\n          case GROUP: {\n            final Message.Builder subBuilder;\n            if (defaultInstance != null) {\n              subBuilder = defaultInstance.newBuilderForType();\n            } else {\n              subBuilder = builder.newBuilderForField(field);\n            }\n            if (!field.isRepeated()) {\n              subBuilder.mergeFrom((Message) builder.getField(field));\n            }\n            input.readGroup(field.getNumber(), subBuilder, extensionRegistry);\n            value = subBuilder.build();\n            break;\n          }\n          case MESSAGE: {\n            final Message.Builder subBuilder;\n            if (defaultInstance != null) {\n              subBuilder = defaultInstance.newBuilderForType();\n            } else {\n              subBuilder = builder.newBuilderForField(field);\n            }\n            if (!field.isRepeated()) {\n              subBuilder.mergeFrom((Message) builder.getField(field));\n            }\n            input.readMessage(subBuilder, extensionRegistry);\n            value = subBuilder.build();\n            break;\n          }\n          case ENUM:\n            final int rawValue = input.readEnum();\n            value = field.getEnumType().findValueByNumber(rawValue);\n            // If the number isn't recognized as a valid value for this enum,\n            // drop it.\n            if (value == null) {\n              unknownFields.mergeVarintField(fieldNumber, rawValue);\n              return true;\n            }\n            break;\n          default:\n            value = FieldSet.readPrimitiveField(input, field.getLiteType());\n            break;\n        }\n\n        if (field.isRepeated()) {\n          builder.addRepeatedField(field, value);\n        } else {\n          builder.setField(field, value);\n        }\n      }\n\n      return true;\n    }\n\n    /** Called by {@code #mergeFieldFrom()} to parse a MessageSet extension. */\n    private static void mergeMessageSetExtensionFromCodedStream(\n        final CodedInputStream input,\n        final UnknownFieldSet.Builder unknownFields,\n        final ExtensionRegistryLite extensionRegistry,\n        final Message.Builder builder) throws IOException {\n      final Descriptor type = builder.getDescriptorForType();\n\n      // The wire format for MessageSet is:\n      //   message MessageSet {\n      //     repeated group Item = 1 {\n      //       required int32 typeId = 2;\n      //       required bytes message = 3;\n      //     }\n      //   }\n      // \"typeId\" is the extension's field number.  The extension can only be\n      // a message type, where \"message\" contains the encoded bytes of that\n      // message.\n      //\n      // In practice, we will probably never see a MessageSet item in which\n      // the message appears before the type ID, or where either field does not\n      // appear exactly once.  However, in theory such cases are valid, so we\n      // should be prepared to accept them.\n\n      int typeId = 0;\n      ByteString rawBytes = null;  // If we encounter \"message\" before \"typeId\"\n      Message.Builder subBuilder = null;\n      FieldDescriptor field = null;\n\n      while (true) {\n        final int tag = input.readTag();\n        if (tag == 0) {\n          break;\n        }\n\n        if (tag == WireFormat.MESSAGE_SET_TYPE_ID_TAG) {\n          typeId = input.readUInt32();\n          // Zero is not a valid type ID.\n          if (typeId != 0) {\n            final ExtensionRegistry.ExtensionInfo extension;\n\n            // extensionRegistry may be either ExtensionRegistry or\n            // ExtensionRegistryLite.  Since the type we are parsing is a full\n            // message, only a full ExtensionRegistry could possibly contain\n            // extensions of it.  Otherwise we will treat the registry as if it\n            // were empty.\n            if (extensionRegistry instanceof ExtensionRegistry) {\n              extension = ((ExtensionRegistry) extensionRegistry)\n                  .findExtensionByNumber(type, typeId);\n            } else {\n              extension = null;\n            }\n\n            if (extension != null) {\n              field = extension.descriptor;\n              subBuilder = extension.defaultInstance.newBuilderForType();\n              final Message originalMessage = (Message)builder.getField(field);\n              if (originalMessage != null) {\n                subBuilder.mergeFrom(originalMessage);\n              }\n              if (rawBytes != null) {\n                // We already encountered the message.  Parse it now.\n                subBuilder.mergeFrom(\n                  CodedInputStream.newInstance(rawBytes.newInput()));\n                rawBytes = null;\n              }\n            } else {\n              // Unknown extension number.  If we already saw data, put it\n              // in rawBytes.\n              if (rawBytes != null) {\n                unknownFields.mergeField(typeId,\n                  UnknownFieldSet.Field.newBuilder()\n                    .addLengthDelimited(rawBytes)\n                    .build());\n                rawBytes = null;\n              }\n            }\n          }\n        } else if (tag == WireFormat.MESSAGE_SET_MESSAGE_TAG) {\n          if (typeId == 0) {\n            // We haven't seen a type ID yet, so we have to store the raw bytes\n            // for now.\n            rawBytes = input.readBytes();\n          } else if (subBuilder == null) {\n            // We don't know how to parse this.  Ignore it.\n            unknownFields.mergeField(typeId,\n              UnknownFieldSet.Field.newBuilder()\n                .addLengthDelimited(input.readBytes())\n                .build());\n          } else {\n            // We already know the type, so we can parse directly from the input\n            // with no copying.  Hooray!\n            input.readMessage(subBuilder, extensionRegistry);\n          }\n        } else {\n          // Unknown tag.  Skip it.\n          if (!input.skipField(tag)) {\n            break;  // end of group\n          }\n        }\n      }\n\n      input.checkLastTagWas(WireFormat.MESSAGE_SET_ITEM_END_TAG);\n\n      if (subBuilder != null) {\n        builder.setField(field, subBuilder.build());\n      }\n    }\n\n    public BuilderType mergeUnknownFields(final UnknownFieldSet unknownFields) {\n      setUnknownFields(\n        UnknownFieldSet.newBuilder(getUnknownFields())\n                       .mergeFrom(unknownFields)\n                       .build());\n      return (BuilderType) this;\n    }\n\n    /**\n     * Construct an UninitializedMessageException reporting missing fields in\n     * the given message.\n     */\n    protected static UninitializedMessageException\n        newUninitializedMessageException(Message message) {\n      return new UninitializedMessageException(findMissingFields(message));\n    }\n\n    /**\n     * Populates {@code this.missingFields} with the full \"path\" of each\n     * missing required field in the given message.\n     */\n    private static List<String> findMissingFields(final Message message) {\n      final List<String> results = new ArrayList<String>();\n      findMissingFields(message, \"\", results);\n      return results;\n    }\n\n    /** Recursive helper implementing {@link #findMissingFields(Message)}. */\n    private static void findMissingFields(final Message message,\n                                          final String prefix,\n                                          final List<String> results) {\n      for (final FieldDescriptor field :\n          message.getDescriptorForType().getFields()) {\n        if (field.isRequired() && !message.hasField(field)) {\n          results.add(prefix + field.getName());\n        }\n      }\n\n      for (final Map.Entry<FieldDescriptor, Object> entry :\n           message.getAllFields().entrySet()) {\n        final FieldDescriptor field = entry.getKey();\n        final Object value = entry.getValue();\n\n        if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n          if (field.isRepeated()) {\n            int i = 0;\n            for (final Object element : (List) value) {\n              findMissingFields((Message) element,\n                                subMessagePrefix(prefix, field, i++),\n                                results);\n            }\n          } else {\n            if (message.hasField(field)) {\n              findMissingFields((Message) value,\n                                subMessagePrefix(prefix, field, -1),\n                                results);\n            }\n          }\n        }\n      }\n    }\n\n    private static String subMessagePrefix(final String prefix,\n                                           final FieldDescriptor field,\n                                           final int index) {\n      final StringBuilder result = new StringBuilder(prefix);\n      if (field.isExtension()) {\n        result.append('(')\n              .append(field.getFullName())\n              .append(')');\n      } else {\n        result.append(field.getName());\n      }\n      if (index != -1) {\n        result.append('[')\n              .append(index)\n              .append(']');\n      }\n      result.append('.');\n      return result.toString();\n    }\n\n    // ===============================================================\n    // The following definitions seem to be required in order to make javac\n    // not produce weird errors like:\n    //\n    // java/com/google/protobuf/DynamicMessage.java:203: types\n    //   com.google.protobuf.AbstractMessage.Builder<\n    //     com.google.protobuf.DynamicMessage.Builder> and\n    //   com.google.protobuf.AbstractMessage.Builder<\n    //     com.google.protobuf.DynamicMessage.Builder> are incompatible; both\n    //   define mergeFrom(com.google.protobuf.ByteString), but with unrelated\n    //   return types.\n    //\n    // Strangely, these lines are only needed if javac is invoked separately\n    // on AbstractMessage.java and AbstractMessageLite.java.  If javac is\n    // invoked on both simultaneously, it works.  (Or maybe the important\n    // point is whether or not DynamicMessage.java is compiled together with\n    // AbstractMessageLite.java -- not sure.)  I suspect this is a compiler\n    // bug.\n\n    @Override\n    public BuilderType mergeFrom(final ByteString data)\n        throws InvalidProtocolBufferException {\n      return super.mergeFrom(data);\n    }\n\n    @Override\n    public BuilderType mergeFrom(\n        final ByteString data,\n        final ExtensionRegistryLite extensionRegistry)\n        throws InvalidProtocolBufferException {\n      return super.mergeFrom(data, extensionRegistry);\n    }\n\n    @Override\n    public BuilderType mergeFrom(final byte[] data)\n        throws InvalidProtocolBufferException {\n      return super.mergeFrom(data);\n    }\n\n    @Override\n    public BuilderType mergeFrom(\n        final byte[] data, final int off, final int len)\n        throws InvalidProtocolBufferException {\n      return super.mergeFrom(data, off, len);\n    }\n\n    @Override\n    public BuilderType mergeFrom(\n        final byte[] data,\n        final ExtensionRegistryLite extensionRegistry)\n        throws InvalidProtocolBufferException {\n      return super.mergeFrom(data, extensionRegistry);\n    }\n\n    @Override\n    public BuilderType mergeFrom(\n        final byte[] data, final int off, final int len,\n        final ExtensionRegistryLite extensionRegistry)\n        throws InvalidProtocolBufferException {\n      return super.mergeFrom(data, off, len, extensionRegistry);\n    }\n\n    @Override\n    public BuilderType mergeFrom(final InputStream input)\n        throws IOException {\n      return super.mergeFrom(input);\n    }\n\n    @Override\n    public BuilderType mergeFrom(\n        final InputStream input,\n        final ExtensionRegistryLite extensionRegistry)\n        throws IOException {\n      return super.mergeFrom(input, extensionRegistry);\n    }\n\n    @Override\n    public boolean mergeDelimitedFrom(final InputStream input)\n        throws IOException {\n      return super.mergeDelimitedFrom(input);\n    }\n\n    @Override\n    public boolean mergeDelimitedFrom(\n        final InputStream input,\n        final ExtensionRegistryLite extensionRegistry)\n        throws IOException {\n      return super.mergeDelimitedFrom(input, extensionRegistry);\n    }\n\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.io.FilterInputStream;\nimport java.io.InputStream;\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.util.Collection;\n\n/**\n * A partial implementation of the {@link MessageLite} interface which\n * implements as many methods of that interface as possible in terms of other\n * methods.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic abstract class AbstractMessageLite implements MessageLite {\n  public ByteString toByteString() {\n    try {\n      final ByteString.CodedBuilder out =\n        ByteString.newCodedBuilder(getSerializedSize());\n      writeTo(out.getCodedOutput());\n      return out.build();\n    } catch (IOException e) {\n      throw new RuntimeException(\n        \"Serializing to a ByteString threw an IOException (should \" +\n        \"never happen).\", e);\n    }\n  }\n\n  public byte[] toByteArray() {\n    try {\n      final byte[] result = new byte[getSerializedSize()];\n      final CodedOutputStream output = CodedOutputStream.newInstance(result);\n      writeTo(output);\n      output.checkNoSpaceLeft();\n      return result;\n    } catch (IOException e) {\n      throw new RuntimeException(\n        \"Serializing to a byte array threw an IOException \" +\n        \"(should never happen).\", e);\n    }\n  }\n\n  public void writeTo(final OutputStream output) throws IOException {\n    final int bufferSize =\n        CodedOutputStream.computePreferredBufferSize(getSerializedSize());\n    final CodedOutputStream codedOutput =\n        CodedOutputStream.newInstance(output, bufferSize);\n    writeTo(codedOutput);\n    codedOutput.flush();\n  }\n\n  public void writeDelimitedTo(final OutputStream output) throws IOException {\n    final int serialized = getSerializedSize();\n    final int bufferSize = CodedOutputStream.computePreferredBufferSize(\n        CodedOutputStream.computeRawVarint32Size(serialized) + serialized);\n    final CodedOutputStream codedOutput =\n        CodedOutputStream.newInstance(output, bufferSize);\n    codedOutput.writeRawVarint32(serialized);\n    writeTo(codedOutput);\n    codedOutput.flush();\n  }\n\n  /**\n   * A partial implementation of the {@link Message.Builder} interface which\n   * implements as many methods of that interface as possible in terms of\n   * other methods.\n   */\n  @SuppressWarnings(\"unchecked\")\n  public static abstract class Builder<BuilderType extends Builder>\n      implements MessageLite.Builder {\n    // The compiler produces an error if this is not declared explicitly.\n    @Override\n    public abstract BuilderType clone();\n\n    public BuilderType mergeFrom(final CodedInputStream input)\n                                 throws IOException {\n      return mergeFrom(input, ExtensionRegistryLite.getEmptyRegistry());\n    }\n\n    // Re-defined here for return type covariance.\n    public abstract BuilderType mergeFrom(\n        final CodedInputStream input,\n        final ExtensionRegistryLite extensionRegistry)\n        throws IOException;\n\n    public BuilderType mergeFrom(final ByteString data)\n        throws InvalidProtocolBufferException {\n      try {\n        final CodedInputStream input = data.newCodedInput();\n        mergeFrom(input);\n        input.checkLastTagWas(0);\n        return (BuilderType) this;\n      } catch (InvalidProtocolBufferException e) {\n        throw e;\n      } catch (IOException e) {\n        throw new RuntimeException(\n          \"Reading from a ByteString threw an IOException (should \" +\n          \"never happen).\", e);\n      }\n    }\n\n    public BuilderType mergeFrom(\n        final ByteString data,\n        final ExtensionRegistryLite extensionRegistry)\n        throws InvalidProtocolBufferException {\n      try {\n        final CodedInputStream input = data.newCodedInput();\n        mergeFrom(input, extensionRegistry);\n        input.checkLastTagWas(0);\n        return (BuilderType) this;\n      } catch (InvalidProtocolBufferException e) {\n        throw e;\n      } catch (IOException e) {\n        throw new RuntimeException(\n          \"Reading from a ByteString threw an IOException (should \" +\n          \"never happen).\", e);\n      }\n    }\n\n    public BuilderType mergeFrom(final byte[] data)\n        throws InvalidProtocolBufferException {\n      return mergeFrom(data, 0, data.length);\n    }\n\n    public BuilderType mergeFrom(final byte[] data, final int off,\n                                 final int len)\n                                 throws InvalidProtocolBufferException {\n      try {\n        final CodedInputStream input =\n            CodedInputStream.newInstance(data, off, len);\n        mergeFrom(input);\n        input.checkLastTagWas(0);\n        return (BuilderType) this;\n      } catch (InvalidProtocolBufferException e) {\n        throw e;\n      } catch (IOException e) {\n        throw new RuntimeException(\n          \"Reading from a byte array threw an IOException (should \" +\n          \"never happen).\", e);\n      }\n    }\n\n    public BuilderType mergeFrom(\n        final byte[] data,\n        final ExtensionRegistryLite extensionRegistry)\n        throws InvalidProtocolBufferException {\n      return mergeFrom(data, 0, data.length, extensionRegistry);\n    }\n\n    public BuilderType mergeFrom(\n        final byte[] data, final int off, final int len,\n        final ExtensionRegistryLite extensionRegistry)\n        throws InvalidProtocolBufferException {\n      try {\n        final CodedInputStream input =\n            CodedInputStream.newInstance(data, off, len);\n        mergeFrom(input, extensionRegistry);\n        input.checkLastTagWas(0);\n        return (BuilderType) this;\n      } catch (InvalidProtocolBufferException e) {\n        throw e;\n      } catch (IOException e) {\n        throw new RuntimeException(\n          \"Reading from a byte array threw an IOException (should \" +\n          \"never happen).\", e);\n      }\n    }\n\n    public BuilderType mergeFrom(final InputStream input) throws IOException {\n      final CodedInputStream codedInput = CodedInputStream.newInstance(input);\n      mergeFrom(codedInput);\n      codedInput.checkLastTagWas(0);\n      return (BuilderType) this;\n    }\n\n    public BuilderType mergeFrom(\n        final InputStream input,\n        final ExtensionRegistryLite extensionRegistry)\n        throws IOException {\n      final CodedInputStream codedInput = CodedInputStream.newInstance(input);\n      mergeFrom(codedInput, extensionRegistry);\n      codedInput.checkLastTagWas(0);\n      return (BuilderType) this;\n    }\n\n    /**\n     * An InputStream implementations which reads from some other InputStream\n     * but is limited to a particular number of bytes.  Used by\n     * mergeDelimitedFrom().  This is intentionally package-private so that\n     * UnknownFieldSet can share it.\n     */\n    static final class LimitedInputStream extends FilterInputStream {\n      private int limit;\n\n      LimitedInputStream(InputStream in, int limit) {\n        super(in);\n        this.limit = limit;\n      }\n\n      @Override\n      public int available() throws IOException {\n        return Math.min(super.available(), limit);\n      }\n\n      @Override\n      public int read() throws IOException {\n        if (limit <= 0) {\n          return -1;\n        }\n        final int result = super.read();\n        if (result >= 0) {\n          --limit;\n        }\n        return result;\n      }\n\n      @Override\n      public int read(final byte[] b, final int off, int len)\n                      throws IOException {\n        if (limit <= 0) {\n          return -1;\n        }\n        len = Math.min(len, limit);\n        final int result = super.read(b, off, len);\n        if (result >= 0) {\n          limit -= result;\n        }\n        return result;\n      }\n\n      @Override\n      public long skip(final long n) throws IOException {\n        final long result = super.skip(Math.min(n, limit));\n        if (result >= 0) {\n          limit -= result;\n        }\n        return result;\n      }\n    }\n\n    public boolean mergeDelimitedFrom(\n        final InputStream input,\n        final ExtensionRegistryLite extensionRegistry)\n        throws IOException {\n      final int firstByte = input.read();\n      if (firstByte == -1) {\n        return false;\n      }\n      final int size = CodedInputStream.readRawVarint32(firstByte, input);\n      final InputStream limitedInput = new LimitedInputStream(input, size);\n      mergeFrom(limitedInput, extensionRegistry);\n      return true;\n    }\n\n    public boolean mergeDelimitedFrom(final InputStream input)\n        throws IOException {\n      return mergeDelimitedFrom(input,\n          ExtensionRegistryLite.getEmptyRegistry());\n    }\n\n    /**\n     * Construct an UninitializedMessageException reporting missing fields in\n     * the given message.\n     */\n    protected static UninitializedMessageException\n        newUninitializedMessageException(MessageLite message) {\n      return new UninitializedMessageException(message);\n    }\n\n    /**\n     * Adds the {@code values} to the {@code list}.  This is a helper method\n     * used by generated code.  Users should ignore it.\n     *\n     * @throws NullPointerException if any of the elements of {@code values} is\n     * null.\n     */\n    protected static <T> void addAll(final Iterable<T> values,\n                                     final Collection<? super T> list) {\n      for (final T value : values) {\n        if (value == null) {\n          throw new NullPointerException();\n        }\n      }\n      if (values instanceof Collection) {\n        final Collection<T> collection = (Collection<T>) values;\n        list.addAll(collection);\n      } else {\n        for (final T value : values) {\n          list.add(value);\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\n/**\n * <p>Abstract interface for a blocking RPC channel.  {@code BlockingRpcChannel}\n * is the blocking equivalent to {@link RpcChannel}.\n *\n * @author kenton@google.com Kenton Varda\n * @author cpovirk@google.com Chris Povirk\n */\npublic interface BlockingRpcChannel {\n  /**\n   * Call the given method of the remote service and blocks until it returns.\n   * {@code callBlockingMethod()} is the blocking equivalent to\n   * {@link RpcChannel#callMethod}.\n   */\n  Message callBlockingMethod(\n      Descriptors.MethodDescriptor method,\n      RpcController controller,\n      Message request,\n      Message responsePrototype) throws ServiceException;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\n/**\n * Blocking equivalent to {@link Service}.\n *\n * @author kenton@google.com Kenton Varda\n * @author cpovirk@google.com Chris Povirk\n */\npublic interface BlockingService {\n  /**\n   * Equivalent to {@link Service#getDescriptorForType}.\n   */\n  Descriptors.ServiceDescriptor getDescriptorForType();\n\n  /**\n   * Equivalent to {@link Service#callMethod}, except that\n   * {@code callBlockingMethod()} returns the result of the RPC or throws a\n   * {@link ServiceException} if there is a failure, rather than passing the\n   * information to a callback.\n   */\n  Message callBlockingMethod(Descriptors.MethodDescriptor method,\n                             RpcController controller,\n                             Message request) throws ServiceException;\n\n  /**\n   * Equivalent to {@link Service#getRequestPrototype}.\n   */\n  Message getRequestPrototype(Descriptors.MethodDescriptor method);\n\n  /**\n   * Equivalent to {@link Service#getResponsePrototype}.\n   */\n  Message getResponsePrototype(Descriptors.MethodDescriptor method);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ByteString.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.io.InputStream;\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.FilterOutputStream;\nimport java.io.UnsupportedEncodingException;\nimport java.nio.ByteBuffer;\nimport java.util.List;\n\n/**\n * Immutable array of bytes.\n *\n * @author crazybob@google.com Bob Lee\n * @author kenton@google.com Kenton Varda\n */\npublic final class ByteString {\n  private final byte[] bytes;\n\n  private ByteString(final byte[] bytes) {\n    this.bytes = bytes;\n  }\n\n  /**\n   * Gets the byte at the given index.\n   *\n   * @throws ArrayIndexOutOfBoundsException {@code index} is < 0 or >= size\n   */\n  public byte byteAt(final int index) {\n    return bytes[index];\n  }\n\n  /**\n   * Gets the number of bytes.\n   */\n  public int size() {\n    return bytes.length;\n  }\n\n  /**\n   * Returns {@code true} if the size is {@code 0}, {@code false} otherwise.\n   */\n  public boolean isEmpty() {\n    return bytes.length == 0;\n  }\n\n  // =================================================================\n  // byte[] -> ByteString\n\n  /**\n   * Empty ByteString.\n   */\n  public static final ByteString EMPTY = new ByteString(new byte[0]);\n\n  /**\n   * Copies the given bytes into a {@code ByteString}.\n   */\n  public static ByteString copyFrom(final byte[] bytes, final int offset,\n                                    final int size) {\n    final byte[] copy = new byte[size];\n    System.arraycopy(bytes, offset, copy, 0, size);\n    return new ByteString(copy);\n  }\n\n  /**\n   * Copies the given bytes into a {@code ByteString}.\n   */\n  public static ByteString copyFrom(final byte[] bytes) {\n    return copyFrom(bytes, 0, bytes.length);\n  }\n\n  /**\n   * Copies {@code size} bytes from a {@code java.nio.ByteBuffer} into\n   * a {@code ByteString}.\n   */\n  public static ByteString copyFrom(final ByteBuffer bytes, final int size) {\n    final byte[] copy = new byte[size];\n    bytes.get(copy);\n    return new ByteString(copy);\n  }\n\n  /**\n   * Copies the remaining bytes from a {@code java.nio.ByteBuffer} into\n   * a {@code ByteString}.\n   */\n  public static ByteString copyFrom(final ByteBuffer bytes) {\n    return copyFrom(bytes, bytes.remaining());\n  }\n\n  /**\n   * Encodes {@code text} into a sequence of bytes using the named charset\n   * and returns the result as a {@code ByteString}.\n   */\n  public static ByteString copyFrom(final String text, final String charsetName)\n      throws UnsupportedEncodingException {\n    return new ByteString(text.getBytes(charsetName));\n  }\n\n  /**\n   * Encodes {@code text} into a sequence of UTF-8 bytes and returns the\n   * result as a {@code ByteString}.\n   */\n  public static ByteString copyFromUtf8(final String text) {\n    try {\n      return new ByteString(text.getBytes(\"UTF-8\"));\n    } catch (UnsupportedEncodingException e) {\n      throw new RuntimeException(\"UTF-8 not supported?\", e);\n    }\n  }\n\n  /**\n   * Concatenates all byte strings in the list and returns the result.\n   *\n   * <p>The returned {@code ByteString} is not necessarily a unique object.\n   * If the list is empty, the returned object is the singleton empty\n   * {@code ByteString}.  If the list has only one element, that\n   * {@code ByteString} will be returned without copying.\n   */\n  public static ByteString copyFrom(List<ByteString> list) {\n    if (list.size() == 0) {\n      return EMPTY;\n    } else if (list.size() == 1) {\n      return list.get(0);\n    }\n\n    int size = 0;\n    for (ByteString str : list) {\n      size += str.size();\n    }\n    byte[] bytes = new byte[size];\n    int pos = 0;\n    for (ByteString str : list) {\n      System.arraycopy(str.bytes, 0, bytes, pos, str.size());\n      pos += str.size();\n    }\n    return new ByteString(bytes);\n  }\n\n  // =================================================================\n  // ByteString -> byte[]\n\n  /**\n   * Copies bytes into a buffer at the given offset.\n   *\n   * @param target buffer to copy into\n   * @param offset in the target buffer\n   */\n  public void copyTo(final byte[] target, final int offset) {\n    System.arraycopy(bytes, 0, target, offset, bytes.length);\n  }\n\n  /**\n   * Copies bytes into a buffer.\n   *\n   * @param target buffer to copy into\n   * @param sourceOffset offset within these bytes\n   * @param targetOffset offset within the target buffer\n   * @param size number of bytes to copy\n   */\n  public void copyTo(final byte[] target, final int sourceOffset,\n                     final int targetOffset,\n      final int size) {\n    System.arraycopy(bytes, sourceOffset, target, targetOffset, size);\n  }\n\n  /**\n   * Copies bytes into a ByteBuffer.\n   *\n   * @param target ByteBuffer to copy into.\n   * @throws ReadOnlyBufferException if the {@code target} is read-only\n   * @throws BufferOverflowException if the {@code target}'s remaining()\n   *         space is not large enough to hold the data.\n   */\n  public void copyTo(ByteBuffer target) {\n    target.put(bytes, 0, bytes.length);\n  }\n\n  /**\n   * Copies bytes to a {@code byte[]}.\n   */\n  public byte[] toByteArray() {\n    final int size = bytes.length;\n    final byte[] copy = new byte[size];\n    System.arraycopy(bytes, 0, copy, 0, size);\n    return copy;\n  }\n\n  /**\n   * Constructs a new read-only {@code java.nio.ByteBuffer} with the\n   * same backing byte array.\n   */\n  public ByteBuffer asReadOnlyByteBuffer() {\n    final ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);\n    return byteBuffer.asReadOnlyBuffer();\n  }\n\n  /**\n   * Constructs a new {@code String} by decoding the bytes using the\n   * specified charset.\n   */\n  public String toString(final String charsetName)\n      throws UnsupportedEncodingException {\n    return new String(bytes, charsetName);\n  }\n\n  /**\n   * Constructs a new {@code String} by decoding the bytes as UTF-8.\n   */\n  public String toStringUtf8() {\n    try {\n      return new String(bytes, \"UTF-8\");\n    } catch (UnsupportedEncodingException e) {\n      throw new RuntimeException(\"UTF-8 not supported?\", e);\n    }\n  }\n\n  // =================================================================\n  // equals() and hashCode()\n\n  @Override\n  public boolean equals(final Object o) {\n    if (o == this) {\n      return true;\n    }\n\n    if (!(o instanceof ByteString)) {\n      return false;\n    }\n\n    final ByteString other = (ByteString) o;\n    final int size = bytes.length;\n    if (size != other.bytes.length) {\n      return false;\n    }\n\n    final byte[] thisBytes = bytes;\n    final byte[] otherBytes = other.bytes;\n    for (int i = 0; i < size; i++) {\n      if (thisBytes[i] != otherBytes[i]) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  private volatile int hash = 0;\n\n  @Override\n  public int hashCode() {\n    int h = hash;\n\n    if (h == 0) {\n      final byte[] thisBytes = bytes;\n      final int size = bytes.length;\n\n      h = size;\n      for (int i = 0; i < size; i++) {\n        h = h * 31 + thisBytes[i];\n      }\n      if (h == 0) {\n        h = 1;\n      }\n\n      hash = h;\n    }\n\n    return h;\n  }\n\n  // =================================================================\n  // Input stream\n\n  /**\n   * Creates an {@code InputStream} which can be used to read the bytes.\n   */\n  public InputStream newInput() {\n    return new ByteArrayInputStream(bytes);\n  }\n\n  /**\n   * Creates a {@link CodedInputStream} which can be used to read the bytes.\n   * Using this is more efficient than creating a {@link CodedInputStream}\n   * wrapping the result of {@link #newInput()}.\n   */\n  public CodedInputStream newCodedInput() {\n    // We trust CodedInputStream not to modify the bytes, or to give anyone\n    // else access to them.\n    return CodedInputStream.newInstance(bytes);\n  }\n\n  // =================================================================\n  // Output stream\n\n  /**\n   * Creates a new {@link Output} with the given initial capacity.\n   */\n  public static Output newOutput(final int initialCapacity) {\n    return new Output(new ByteArrayOutputStream(initialCapacity));\n  }\n\n  /**\n   * Creates a new {@link Output}.\n   */\n  public static Output newOutput() {\n    return newOutput(32);\n  }\n\n  /**\n   * Outputs to a {@code ByteString} instance. Call {@link #toByteString()} to\n   * create the {@code ByteString} instance.\n   */\n  public static final class Output extends FilterOutputStream {\n    private final ByteArrayOutputStream bout;\n\n    /**\n     * Constructs a new output with the given initial capacity.\n     */\n    private Output(final ByteArrayOutputStream bout) {\n      super(bout);\n      this.bout = bout;\n    }\n\n    /**\n     * Creates a {@code ByteString} instance from this {@code Output}.\n     */\n    public ByteString toByteString() {\n      final byte[] byteArray = bout.toByteArray();\n      return new ByteString(byteArray);\n    }\n  }\n\n  /**\n   * Constructs a new ByteString builder, which allows you to efficiently\n   * construct a {@code ByteString} by writing to a {@link CodedOutputStream}.\n   * Using this is much more efficient than calling {@code newOutput()} and\n   * wrapping that in a {@code CodedOutputStream}.\n   *\n   * <p>This is package-private because it's a somewhat confusing interface.\n   * Users can call {@link Message#toByteString()} instead of calling this\n   * directly.\n   *\n   * @param size The target byte size of the {@code ByteString}.  You must\n   *             write exactly this many bytes before building the result.\n   */\n  static CodedBuilder newCodedBuilder(final int size) {\n    return new CodedBuilder(size);\n  }\n\n  /** See {@link ByteString#newCodedBuilder(int)}. */\n  static final class CodedBuilder {\n    private final CodedOutputStream output;\n    private final byte[] buffer;\n\n    private CodedBuilder(final int size) {\n      buffer = new byte[size];\n      output = CodedOutputStream.newInstance(buffer);\n    }\n\n    public ByteString build() {\n      output.checkNoSpaceLeft();\n\n      // We can be confident that the CodedOutputStream will not modify the\n      // underlying bytes anymore because it already wrote all of them.  So,\n      // no need to make a copy.\n      return new ByteString(buffer);\n    }\n\n    public CodedOutputStream getCodedOutput() {\n      return output;\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Reads and decodes protocol message fields.\n *\n * This class contains two kinds of methods:  methods that read specific\n * protocol message constructs and field types (e.g. {@link #readTag()} and\n * {@link #readInt32()}) and methods that read low-level values (e.g.\n * {@link #readRawVarint32()} and {@link #readRawBytes}).  If you are reading\n * encoded protocol messages, you should use the former methods, but if you are\n * reading some other format of your own design, use the latter.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic final class CodedInputStream {\n  /**\n   * Create a new CodedInputStream wrapping the given InputStream.\n   */\n  public static CodedInputStream newInstance(final InputStream input) {\n    return new CodedInputStream(input);\n  }\n\n  /**\n   * Create a new CodedInputStream wrapping the given byte array.\n   */\n  public static CodedInputStream newInstance(final byte[] buf) {\n    return newInstance(buf, 0, buf.length);\n  }\n\n  /**\n   * Create a new CodedInputStream wrapping the given byte array slice.\n   */\n  public static CodedInputStream newInstance(final byte[] buf, final int off,\n                                             final int len) {\n    CodedInputStream result = new CodedInputStream(buf, off, len);\n    try {\n      // Some uses of CodedInputStream can be more efficient if they know\n      // exactly how many bytes are available.  By pushing the end point of the\n      // buffer as a limit, we allow them to get this information via\n      // getBytesUntilLimit().  Pushing a limit that we know is at the end of\n      // the stream can never hurt, since we can never past that point anyway.\n      result.pushLimit(len);\n    } catch (InvalidProtocolBufferException ex) {\n      // The only reason pushLimit() might throw an exception here is if len\n      // is negative. Normally pushLimit()'s parameter comes directly off the\n      // wire, so it's important to catch exceptions in case of corrupt or\n      // malicious data. However, in this case, we expect that len is not a\n      // user-supplied value, so we can assume that it being negative indicates\n      // a programming error. Therefore, throwing an unchecked exception is\n      // appropriate.\n      throw new IllegalArgumentException(ex);\n    }\n    return result;\n  }\n\n  // -----------------------------------------------------------------\n\n  /**\n   * Attempt to read a field tag, returning zero if we have reached EOF.\n   * Protocol message parsers use this to read tags, since a protocol message\n   * may legally end wherever a tag occurs, and zero is not a valid tag number.\n   */\n  public int readTag() throws IOException {\n    if (isAtEnd()) {\n      lastTag = 0;\n      return 0;\n    }\n\n    lastTag = readRawVarint32();\n    if (WireFormat.getTagFieldNumber(lastTag) == 0) {\n      // If we actually read zero (or any tag number corresponding to field\n      // number zero), that's not a valid tag.\n      throw InvalidProtocolBufferException.invalidTag();\n    }\n    return lastTag;\n  }\n\n  /**\n   * Verifies that the last call to readTag() returned the given tag value.\n   * This is used to verify that a nested group ended with the correct\n   * end tag.\n   *\n   * @throws InvalidProtocolBufferException {@code value} does not match the\n   *                                        last tag.\n   */\n  public void checkLastTagWas(final int value)\n                              throws InvalidProtocolBufferException {\n    if (lastTag != value) {\n      throw InvalidProtocolBufferException.invalidEndTag();\n    }\n  }\n\n  /**\n   * Reads and discards a single field, given its tag value.\n   *\n   * @return {@code false} if the tag is an endgroup tag, in which case\n   *         nothing is skipped.  Otherwise, returns {@code true}.\n   */\n  public boolean skipField(final int tag) throws IOException {\n    switch (WireFormat.getTagWireType(tag)) {\n      case WireFormat.WIRETYPE_VARINT:\n        readInt32();\n        return true;\n      case WireFormat.WIRETYPE_FIXED64:\n        readRawLittleEndian64();\n        return true;\n      case WireFormat.WIRETYPE_LENGTH_DELIMITED:\n        skipRawBytes(readRawVarint32());\n        return true;\n      case WireFormat.WIRETYPE_START_GROUP:\n        skipMessage();\n        checkLastTagWas(\n          WireFormat.makeTag(WireFormat.getTagFieldNumber(tag),\n                             WireFormat.WIRETYPE_END_GROUP));\n        return true;\n      case WireFormat.WIRETYPE_END_GROUP:\n        return false;\n      case WireFormat.WIRETYPE_FIXED32:\n        readRawLittleEndian32();\n        return true;\n      default:\n        throw InvalidProtocolBufferException.invalidWireType();\n    }\n  }\n\n  /**\n   * Reads and discards an entire message.  This will read either until EOF\n   * or until an endgroup tag, whichever comes first.\n   */\n  public void skipMessage() throws IOException {\n    while (true) {\n      final int tag = readTag();\n      if (tag == 0 || !skipField(tag)) {\n        return;\n      }\n    }\n  }\n\n  // -----------------------------------------------------------------\n\n  /** Read a {@code double} field value from the stream. */\n  public double readDouble() throws IOException {\n    return Double.longBitsToDouble(readRawLittleEndian64());\n  }\n\n  /** Read a {@code float} field value from the stream. */\n  public float readFloat() throws IOException {\n    return Float.intBitsToFloat(readRawLittleEndian32());\n  }\n\n  /** Read a {@code uint64} field value from the stream. */\n  public long readUInt64() throws IOException {\n    return readRawVarint64();\n  }\n\n  /** Read an {@code int64} field value from the stream. */\n  public long readInt64() throws IOException {\n    return readRawVarint64();\n  }\n\n  /** Read an {@code int32} field value from the stream. */\n  public int readInt32() throws IOException {\n    return readRawVarint32();\n  }\n\n  /** Read a {@code fixed64} field value from the stream. */\n  public long readFixed64() throws IOException {\n    return readRawLittleEndian64();\n  }\n\n  /** Read a {@code fixed32} field value from the stream. */\n  public int readFixed32() throws IOException {\n    return readRawLittleEndian32();\n  }\n\n  /** Read a {@code bool} field value from the stream. */\n  public boolean readBool() throws IOException {\n    return readRawVarint32() != 0;\n  }\n\n  /** Read a {@code string} field value from the stream. */\n  public String readString() throws IOException {\n    final int size = readRawVarint32();\n    if (size <= (bufferSize - bufferPos) && size > 0) {\n      // Fast path:  We already have the bytes in a contiguous buffer, so\n      //   just copy directly from it.\n      final String result = new String(buffer, bufferPos, size, \"UTF-8\");\n      bufferPos += size;\n      return result;\n    } else {\n      // Slow path:  Build a byte array first then copy it.\n      return new String(readRawBytes(size), \"UTF-8\");\n    }\n  }\n\n  /** Read a {@code group} field value from the stream. */\n  public void readGroup(final int fieldNumber,\n                        final MessageLite.Builder builder,\n                        final ExtensionRegistryLite extensionRegistry)\n      throws IOException {\n    if (recursionDepth >= recursionLimit) {\n      throw InvalidProtocolBufferException.recursionLimitExceeded();\n    }\n    ++recursionDepth;\n    builder.mergeFrom(this, extensionRegistry);\n    checkLastTagWas(\n      WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP));\n    --recursionDepth;\n  }\n\n  /**\n   * Reads a {@code group} field value from the stream and merges it into the\n   * given {@link UnknownFieldSet}.\n   *\n   * @deprecated UnknownFieldSet.Builder now implements MessageLite.Builder, so\n   *             you can just call {@link #readGroup}.\n   */\n  @Deprecated\n  public void readUnknownGroup(final int fieldNumber,\n                               final MessageLite.Builder builder)\n      throws IOException {\n    // We know that UnknownFieldSet will ignore any ExtensionRegistry so it\n    // is safe to pass null here.  (We can't call\n    // ExtensionRegistry.getEmptyRegistry() because that would make this\n    // class depend on ExtensionRegistry, which is not part of the lite\n    // library.)\n    readGroup(fieldNumber, builder, null);\n  }\n\n  /** Read an embedded message field value from the stream. */\n  public void readMessage(final MessageLite.Builder builder,\n                          final ExtensionRegistryLite extensionRegistry)\n      throws IOException {\n    final int length = readRawVarint32();\n    if (recursionDepth >= recursionLimit) {\n      throw InvalidProtocolBufferException.recursionLimitExceeded();\n    }\n    final int oldLimit = pushLimit(length);\n    ++recursionDepth;\n    builder.mergeFrom(this, extensionRegistry);\n    checkLastTagWas(0);\n    --recursionDepth;\n    popLimit(oldLimit);\n  }\n\n  /** Read a {@code bytes} field value from the stream. */\n  public ByteString readBytes() throws IOException {\n    final int size = readRawVarint32();\n    if (size == 0) {\n      return ByteString.EMPTY;\n    } else if (size <= (bufferSize - bufferPos) && size > 0) {\n      // Fast path:  We already have the bytes in a contiguous buffer, so\n      //   just copy directly from it.\n      final ByteString result = ByteString.copyFrom(buffer, bufferPos, size);\n      bufferPos += size;\n      return result;\n    } else {\n      // Slow path:  Build a byte array first then copy it.\n      return ByteString.copyFrom(readRawBytes(size));\n    }\n  }\n\n  /** Read a {@code uint32} field value from the stream. */\n  public int readUInt32() throws IOException {\n    return readRawVarint32();\n  }\n\n  /**\n   * Read an enum field value from the stream.  Caller is responsible\n   * for converting the numeric value to an actual enum.\n   */\n  public int readEnum() throws IOException {\n    return readRawVarint32();\n  }\n\n  /** Read an {@code sfixed32} field value from the stream. */\n  public int readSFixed32() throws IOException {\n    return readRawLittleEndian32();\n  }\n\n  /** Read an {@code sfixed64} field value from the stream. */\n  public long readSFixed64() throws IOException {\n    return readRawLittleEndian64();\n  }\n\n  /** Read an {@code sint32} field value from the stream. */\n  public int readSInt32() throws IOException {\n    return decodeZigZag32(readRawVarint32());\n  }\n\n  /** Read an {@code sint64} field value from the stream. */\n  public long readSInt64() throws IOException {\n    return decodeZigZag64(readRawVarint64());\n  }\n\n  // =================================================================\n\n  /**\n   * Read a raw Varint from the stream.  If larger than 32 bits, discard the\n   * upper bits.\n   */\n  public int readRawVarint32() throws IOException {\n    byte tmp = readRawByte();\n    if (tmp >= 0) {\n      return tmp;\n    }\n    int result = tmp & 0x7f;\n    if ((tmp = readRawByte()) >= 0) {\n      result |= tmp << 7;\n    } else {\n      result |= (tmp & 0x7f) << 7;\n      if ((tmp = readRawByte()) >= 0) {\n        result |= tmp << 14;\n      } else {\n        result |= (tmp & 0x7f) << 14;\n        if ((tmp = readRawByte()) >= 0) {\n          result |= tmp << 21;\n        } else {\n          result |= (tmp & 0x7f) << 21;\n          result |= (tmp = readRawByte()) << 28;\n          if (tmp < 0) {\n            // Discard upper 32 bits.\n            for (int i = 0; i < 5; i++) {\n              if (readRawByte() >= 0) {\n                return result;\n              }\n            }\n            throw InvalidProtocolBufferException.malformedVarint();\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Reads a varint from the input one byte at a time, so that it does not\n   * read any bytes after the end of the varint.  If you simply wrapped the\n   * stream in a CodedInputStream and used {@link #readRawVarint32(InputStream)}\n   * then you would probably end up reading past the end of the varint since\n   * CodedInputStream buffers its input.\n   */\n  static int readRawVarint32(final InputStream input) throws IOException {\n    final int firstByte = input.read();\n    if (firstByte == -1) {\n      throw InvalidProtocolBufferException.truncatedMessage();\n    }\n    return readRawVarint32(firstByte, input);\n  }\n\n  /**\n   * Like {@link #readRawVarint32(InputStream)}, but expects that the caller\n   * has already read one byte.  This allows the caller to determine if EOF\n   * has been reached before attempting to read.\n   */\n  public static int readRawVarint32(\n      final int firstByte, final InputStream input) throws IOException {\n    if ((firstByte & 0x80) == 0) {\n      return firstByte;\n    }\n\n    int result = firstByte & 0x7f;\n    int offset = 7;\n    for (; offset < 32; offset += 7) {\n      final int b = input.read();\n      if (b == -1) {\n        throw InvalidProtocolBufferException.truncatedMessage();\n      }\n      result |= (b & 0x7f) << offset;\n      if ((b & 0x80) == 0) {\n        return result;\n      }\n    }\n    // Keep reading up to 64 bits.\n    for (; offset < 64; offset += 7) {\n      final int b = input.read();\n      if (b == -1) {\n        throw InvalidProtocolBufferException.truncatedMessage();\n      }\n      if ((b & 0x80) == 0) {\n        return result;\n      }\n    }\n    throw InvalidProtocolBufferException.malformedVarint();\n  }\n\n  /** Read a raw Varint from the stream. */\n  public long readRawVarint64() throws IOException {\n    int shift = 0;\n    long result = 0;\n    while (shift < 64) {\n      final byte b = readRawByte();\n      result |= (long)(b & 0x7F) << shift;\n      if ((b & 0x80) == 0) {\n        return result;\n      }\n      shift += 7;\n    }\n    throw InvalidProtocolBufferException.malformedVarint();\n  }\n\n  /** Read a 32-bit little-endian integer from the stream. */\n  public int readRawLittleEndian32() throws IOException {\n    final byte b1 = readRawByte();\n    final byte b2 = readRawByte();\n    final byte b3 = readRawByte();\n    final byte b4 = readRawByte();\n    return (((int)b1 & 0xff)      ) |\n           (((int)b2 & 0xff) <<  8) |\n           (((int)b3 & 0xff) << 16) |\n           (((int)b4 & 0xff) << 24);\n  }\n\n  /** Read a 64-bit little-endian integer from the stream. */\n  public long readRawLittleEndian64() throws IOException {\n    final byte b1 = readRawByte();\n    final byte b2 = readRawByte();\n    final byte b3 = readRawByte();\n    final byte b4 = readRawByte();\n    final byte b5 = readRawByte();\n    final byte b6 = readRawByte();\n    final byte b7 = readRawByte();\n    final byte b8 = readRawByte();\n    return (((long)b1 & 0xff)      ) |\n           (((long)b2 & 0xff) <<  8) |\n           (((long)b3 & 0xff) << 16) |\n           (((long)b4 & 0xff) << 24) |\n           (((long)b5 & 0xff) << 32) |\n           (((long)b6 & 0xff) << 40) |\n           (((long)b7 & 0xff) << 48) |\n           (((long)b8 & 0xff) << 56);\n  }\n\n  /**\n   * Decode a ZigZag-encoded 32-bit value.  ZigZag encodes signed integers\n   * into values that can be efficiently encoded with varint.  (Otherwise,\n   * negative values must be sign-extended to 64 bits to be varint encoded,\n   * thus always taking 10 bytes on the wire.)\n   *\n   * @param n An unsigned 32-bit integer, stored in a signed int because\n   *          Java has no explicit unsigned support.\n   * @return A signed 32-bit integer.\n   */\n  public static int decodeZigZag32(final int n) {\n    return (n >>> 1) ^ -(n & 1);\n  }\n\n  /**\n   * Decode a ZigZag-encoded 64-bit value.  ZigZag encodes signed integers\n   * into values that can be efficiently encoded with varint.  (Otherwise,\n   * negative values must be sign-extended to 64 bits to be varint encoded,\n   * thus always taking 10 bytes on the wire.)\n   *\n   * @param n An unsigned 64-bit integer, stored in a signed int because\n   *          Java has no explicit unsigned support.\n   * @return A signed 64-bit integer.\n   */\n  public static long decodeZigZag64(final long n) {\n    return (n >>> 1) ^ -(n & 1);\n  }\n\n  // -----------------------------------------------------------------\n\n  private final byte[] buffer;\n  private int bufferSize;\n  private int bufferSizeAfterLimit;\n  private int bufferPos;\n  private final InputStream input;\n  private int lastTag;\n\n  /**\n   * The total number of bytes read before the current buffer.  The total\n   * bytes read up to the current position can be computed as\n   * {@code totalBytesRetired + bufferPos}.  This value may be negative if\n   * reading started in the middle of the current buffer (e.g. if the\n   * constructor that takes a byte array and an offset was used).\n   */\n  private int totalBytesRetired;\n\n  /** The absolute position of the end of the current message. */\n  private int currentLimit = Integer.MAX_VALUE;\n\n  /** See setRecursionLimit() */\n  private int recursionDepth;\n  private int recursionLimit = DEFAULT_RECURSION_LIMIT;\n\n  /** See setSizeLimit() */\n  private int sizeLimit = DEFAULT_SIZE_LIMIT;\n\n  private static final int DEFAULT_RECURSION_LIMIT = 64;\n  private static final int DEFAULT_SIZE_LIMIT = 64 << 20;  // 64MB\n  private static final int BUFFER_SIZE = 4096;\n\n  private CodedInputStream(final byte[] buffer, final int off, final int len) {\n    this.buffer = buffer;\n    bufferSize = off + len;\n    bufferPos = off;\n    totalBytesRetired = -off;\n    input = null;\n  }\n\n  private CodedInputStream(final InputStream input) {\n    buffer = new byte[BUFFER_SIZE];\n    bufferSize = 0;\n    bufferPos = 0;\n    totalBytesRetired = 0;\n    this.input = input;\n  }\n\n  /**\n   * Set the maximum message recursion depth.  In order to prevent malicious\n   * messages from causing stack overflows, {@code CodedInputStream} limits\n   * how deeply messages may be nested.  The default limit is 64.\n   *\n   * @return the old limit.\n   */\n  public int setRecursionLimit(final int limit) {\n    if (limit < 0) {\n      throw new IllegalArgumentException(\n        \"Recursion limit cannot be negative: \" + limit);\n    }\n    final int oldLimit = recursionLimit;\n    recursionLimit = limit;\n    return oldLimit;\n  }\n\n  /**\n   * Set the maximum message size.  In order to prevent malicious\n   * messages from exhausting memory or causing integer overflows,\n   * {@code CodedInputStream} limits how large a message may be.\n   * The default limit is 64MB.  You should set this limit as small\n   * as you can without harming your app's functionality.  Note that\n   * size limits only apply when reading from an {@code InputStream}, not\n   * when constructed around a raw byte array (nor with\n   * {@link ByteString#newCodedInput}).\n   * <p>\n   * If you want to read several messages from a single CodedInputStream, you\n   * could call {@link #resetSizeCounter()} after each one to avoid hitting the\n   * size limit.\n   *\n   * @return the old limit.\n   */\n  public int setSizeLimit(final int limit) {\n    if (limit < 0) {\n      throw new IllegalArgumentException(\n        \"Size limit cannot be negative: \" + limit);\n    }\n    final int oldLimit = sizeLimit;\n    sizeLimit = limit;\n    return oldLimit;\n  }\n\n  /**\n   * Resets the current size counter to zero (see {@link #setSizeLimit(int)}).\n   */\n  public void resetSizeCounter() {\n    totalBytesRetired = -bufferPos;\n  }\n\n  /**\n   * Sets {@code currentLimit} to (current position) + {@code byteLimit}.  This\n   * is called when descending into a length-delimited embedded message.\n   *\n   * <p>Note that {@code pushLimit()} does NOT affect how many bytes the\n   * {@code CodedInputStream} reads from an underlying {@code InputStream} when\n   * refreshing its buffer.  If you need to prevent reading past a certain\n   * point in the underlying {@code InputStream} (e.g. because you expect it to\n   * contain more data after the end of the message which you need to handle\n   * differently) then you must place a wrapper around you {@code InputStream}\n   * which limits the amount of data that can be read from it.\n   *\n   * @return the old limit.\n   */\n  public int pushLimit(int byteLimit) throws InvalidProtocolBufferException {\n    if (byteLimit < 0) {\n      throw InvalidProtocolBufferException.negativeSize();\n    }\n    byteLimit += totalBytesRetired + bufferPos;\n    final int oldLimit = currentLimit;\n    if (byteLimit > oldLimit) {\n      throw InvalidProtocolBufferException.truncatedMessage();\n    }\n    currentLimit = byteLimit;\n\n    recomputeBufferSizeAfterLimit();\n\n    return oldLimit;\n  }\n\n  private void recomputeBufferSizeAfterLimit() {\n    bufferSize += bufferSizeAfterLimit;\n    final int bufferEnd = totalBytesRetired + bufferSize;\n    if (bufferEnd > currentLimit) {\n      // Limit is in current buffer.\n      bufferSizeAfterLimit = bufferEnd - currentLimit;\n      bufferSize -= bufferSizeAfterLimit;\n    } else {\n      bufferSizeAfterLimit = 0;\n    }\n  }\n\n  /**\n   * Discards the current limit, returning to the previous limit.\n   *\n   * @param oldLimit The old limit, as returned by {@code pushLimit}.\n   */\n  public void popLimit(final int oldLimit) {\n    currentLimit = oldLimit;\n    recomputeBufferSizeAfterLimit();\n  }\n\n  /**\n   * Returns the number of bytes to be read before the current limit.\n   * If no limit is set, returns -1.\n   */\n  public int getBytesUntilLimit() {\n    if (currentLimit == Integer.MAX_VALUE) {\n      return -1;\n    }\n\n    final int currentAbsolutePosition = totalBytesRetired + bufferPos;\n    return currentLimit - currentAbsolutePosition;\n  }\n\n  /**\n   * Returns true if the stream has reached the end of the input.  This is the\n   * case if either the end of the underlying input source has been reached or\n   * if the stream has reached a limit created using {@link #pushLimit(int)}.\n   */\n  public boolean isAtEnd() throws IOException {\n    return bufferPos == bufferSize && !refillBuffer(false);\n  }\n\n  /**\n   * The total bytes read up to the current position. Calling\n   * {@link #resetSizeCounter()} resets this value to zero.\n   */\n  public int getTotalBytesRead() {\n      return totalBytesRetired + bufferPos;\n  }\n\n  /**\n   * Called with {@code this.buffer} is empty to read more bytes from the\n   * input.  If {@code mustSucceed} is true, refillBuffer() gurantees that\n   * either there will be at least one byte in the buffer when it returns\n   * or it will throw an exception.  If {@code mustSucceed} is false,\n   * refillBuffer() returns false if no more bytes were available.\n   */\n  private boolean refillBuffer(final boolean mustSucceed) throws IOException {\n    if (bufferPos < bufferSize) {\n      throw new IllegalStateException(\n        \"refillBuffer() called when buffer wasn't empty.\");\n    }\n\n    if (totalBytesRetired + bufferSize == currentLimit) {\n      // Oops, we hit a limit.\n      if (mustSucceed) {\n        throw InvalidProtocolBufferException.truncatedMessage();\n      } else {\n        return false;\n      }\n    }\n\n    totalBytesRetired += bufferSize;\n\n    bufferPos = 0;\n    bufferSize = (input == null) ? -1 : input.read(buffer);\n    if (bufferSize == 0 || bufferSize < -1) {\n      throw new IllegalStateException(\n          \"InputStream#read(byte[]) returned invalid result: \" + bufferSize +\n          \"\\nThe InputStream implementation is buggy.\");\n    }\n    if (bufferSize == -1) {\n      bufferSize = 0;\n      if (mustSucceed) {\n        throw InvalidProtocolBufferException.truncatedMessage();\n      } else {\n        return false;\n      }\n    } else {\n      recomputeBufferSizeAfterLimit();\n      final int totalBytesRead =\n        totalBytesRetired + bufferSize + bufferSizeAfterLimit;\n      if (totalBytesRead > sizeLimit || totalBytesRead < 0) {\n        throw InvalidProtocolBufferException.sizeLimitExceeded();\n      }\n      return true;\n    }\n  }\n\n  /**\n   * Read one byte from the input.\n   *\n   * @throws InvalidProtocolBufferException The end of the stream or the current\n   *                                        limit was reached.\n   */\n  public byte readRawByte() throws IOException {\n    if (bufferPos == bufferSize) {\n      refillBuffer(true);\n    }\n    return buffer[bufferPos++];\n  }\n\n  /**\n   * Read a fixed size of bytes from the input.\n   *\n   * @throws InvalidProtocolBufferException The end of the stream or the current\n   *                                        limit was reached.\n   */\n  public byte[] readRawBytes(final int size) throws IOException {\n    if (size < 0) {\n      throw InvalidProtocolBufferException.negativeSize();\n    }\n\n    if (totalBytesRetired + bufferPos + size > currentLimit) {\n      // Read to the end of the stream anyway.\n      skipRawBytes(currentLimit - totalBytesRetired - bufferPos);\n      // Then fail.\n      throw InvalidProtocolBufferException.truncatedMessage();\n    }\n\n    if (size <= bufferSize - bufferPos) {\n      // We have all the bytes we need already.\n      final byte[] bytes = new byte[size];\n      System.arraycopy(buffer, bufferPos, bytes, 0, size);\n      bufferPos += size;\n      return bytes;\n    } else if (size < BUFFER_SIZE) {\n      // Reading more bytes than are in the buffer, but not an excessive number\n      // of bytes.  We can safely allocate the resulting array ahead of time.\n\n      // First copy what we have.\n      final byte[] bytes = new byte[size];\n      int pos = bufferSize - bufferPos;\n      System.arraycopy(buffer, bufferPos, bytes, 0, pos);\n      bufferPos = bufferSize;\n\n      // We want to use refillBuffer() and then copy from the buffer into our\n      // byte array rather than reading directly into our byte array because\n      // the input may be unbuffered.\n      refillBuffer(true);\n\n      while (size - pos > bufferSize) {\n        System.arraycopy(buffer, 0, bytes, pos, bufferSize);\n        pos += bufferSize;\n        bufferPos = bufferSize;\n        refillBuffer(true);\n      }\n\n      System.arraycopy(buffer, 0, bytes, pos, size - pos);\n      bufferPos = size - pos;\n\n      return bytes;\n    } else {\n      // The size is very large.  For security reasons, we can't allocate the\n      // entire byte array yet.  The size comes directly from the input, so a\n      // maliciously-crafted message could provide a bogus very large size in\n      // order to trick the app into allocating a lot of memory.  We avoid this\n      // by allocating and reading only a small chunk at a time, so that the\n      // malicious message must actually *be* extremely large to cause\n      // problems.  Meanwhile, we limit the allowed size of a message elsewhere.\n\n      // Remember the buffer markers since we'll have to copy the bytes out of\n      // it later.\n      final int originalBufferPos = bufferPos;\n      final int originalBufferSize = bufferSize;\n\n      // Mark the current buffer consumed.\n      totalBytesRetired += bufferSize;\n      bufferPos = 0;\n      bufferSize = 0;\n\n      // Read all the rest of the bytes we need.\n      int sizeLeft = size - (originalBufferSize - originalBufferPos);\n      final List<byte[]> chunks = new ArrayList<byte[]>();\n\n      while (sizeLeft > 0) {\n        final byte[] chunk = new byte[Math.min(sizeLeft, BUFFER_SIZE)];\n        int pos = 0;\n        while (pos < chunk.length) {\n          final int n = (input == null) ? -1 :\n            input.read(chunk, pos, chunk.length - pos);\n          if (n == -1) {\n            throw InvalidProtocolBufferException.truncatedMessage();\n          }\n          totalBytesRetired += n;\n          pos += n;\n        }\n        sizeLeft -= chunk.length;\n        chunks.add(chunk);\n      }\n\n      // OK, got everything.  Now concatenate it all into one buffer.\n      final byte[] bytes = new byte[size];\n\n      // Start by copying the leftover bytes from this.buffer.\n      int pos = originalBufferSize - originalBufferPos;\n      System.arraycopy(buffer, originalBufferPos, bytes, 0, pos);\n\n      // And now all the chunks.\n      for (final byte[] chunk : chunks) {\n        System.arraycopy(chunk, 0, bytes, pos, chunk.length);\n        pos += chunk.length;\n      }\n\n      // Done.\n      return bytes;\n    }\n  }\n\n  /**\n   * Reads and discards {@code size} bytes.\n   *\n   * @throws InvalidProtocolBufferException The end of the stream or the current\n   *                                        limit was reached.\n   */\n  public void skipRawBytes(final int size) throws IOException {\n    if (size < 0) {\n      throw InvalidProtocolBufferException.negativeSize();\n    }\n\n    if (totalBytesRetired + bufferPos + size > currentLimit) {\n      // Read to the end of the stream anyway.\n      skipRawBytes(currentLimit - totalBytesRetired - bufferPos);\n      // Then fail.\n      throw InvalidProtocolBufferException.truncatedMessage();\n    }\n\n    if (size <= bufferSize - bufferPos) {\n      // We have all the bytes we need already.\n      bufferPos += size;\n    } else {\n      // Skipping more bytes than are in the buffer.  First skip what we have.\n      int pos = bufferSize - bufferPos;\n      bufferPos = bufferSize;\n\n      // Keep refilling the buffer until we get to the point we wanted to skip\n      // to.  This has the side effect of ensuring the limits are updated\n      // correctly.\n      refillBuffer(true);\n      while (size - pos > bufferSize) {\n        pos += bufferSize;\n        bufferPos = bufferSize;\n        refillBuffer(true);\n      }\n\n      bufferPos = size - pos; \n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.io.OutputStream;\nimport java.io.IOException;\nimport java.io.UnsupportedEncodingException;\nimport java.io.InputStream;\n\n/**\n * Encodes and writes protocol message fields.\n *\n * <p>This class contains two kinds of methods:  methods that write specific\n * protocol message constructs and field types (e.g. {@link #writeTag} and\n * {@link #writeInt32}) and methods that write low-level values (e.g.\n * {@link #writeRawVarint32} and {@link #writeRawBytes}).  If you are\n * writing encoded protocol messages, you should use the former methods, but if\n * you are writing some other format of your own design, use the latter.\n *\n * <p>This class is totally unsynchronized.\n *\n * @author kneton@google.com Kenton Varda\n */\npublic final class CodedOutputStream {\n  private final byte[] buffer;\n  private final int limit;\n  private int position;\n\n  private final OutputStream output;\n\n  /**\n   * The buffer size used in {@link #newInstance(OutputStream)}.\n   */\n  public static final int DEFAULT_BUFFER_SIZE = 4096;\n\n  /**\n   * Returns the buffer size to efficiently write dataLength bytes to this\n   * CodedOutputStream. Used by AbstractMessageLite.\n   *\n   * @return the buffer size to efficiently write dataLength bytes to this\n   *         CodedOutputStream.\n   */\n  static int computePreferredBufferSize(int dataLength) {\n    if (dataLength > DEFAULT_BUFFER_SIZE) return DEFAULT_BUFFER_SIZE;\n    return dataLength;\n  }\n\n  private CodedOutputStream(final byte[] buffer, final int offset,\n                            final int length) {\n    output = null;\n    this.buffer = buffer;\n    position = offset;\n    limit = offset + length;\n  }\n\n  private CodedOutputStream(final OutputStream output, final byte[] buffer) {\n    this.output = output;\n    this.buffer = buffer;\n    position = 0;\n    limit = buffer.length;\n  }\n\n  /**\n   * Create a new {@code CodedOutputStream} wrapping the given\n   * {@code OutputStream}.\n   */\n  public static CodedOutputStream newInstance(final OutputStream output) {\n    return newInstance(output, DEFAULT_BUFFER_SIZE);\n  }\n\n  /**\n   * Create a new {@code CodedOutputStream} wrapping the given\n   * {@code OutputStream} with a given buffer size.\n   */\n  public static CodedOutputStream newInstance(final OutputStream output,\n      final int bufferSize) {\n    return new CodedOutputStream(output, new byte[bufferSize]);\n  }\n\n  /**\n   * Create a new {@code CodedOutputStream} that writes directly to the given\n   * byte array.  If more bytes are written than fit in the array,\n   * {@link OutOfSpaceException} will be thrown.  Writing directly to a flat\n   * array is faster than writing to an {@code OutputStream}.  See also\n   * {@link ByteString#newCodedBuilder}.\n   */\n  public static CodedOutputStream newInstance(final byte[] flatArray) {\n    return newInstance(flatArray, 0, flatArray.length);\n  }\n\n  /**\n   * Create a new {@code CodedOutputStream} that writes directly to the given\n   * byte array slice.  If more bytes are written than fit in the slice,\n   * {@link OutOfSpaceException} will be thrown.  Writing directly to a flat\n   * array is faster than writing to an {@code OutputStream}.  See also\n   * {@link ByteString#newCodedBuilder}.\n   */\n  public static CodedOutputStream newInstance(final byte[] flatArray,\n                                              final int offset,\n                                              final int length) {\n    return new CodedOutputStream(flatArray, offset, length);\n  }\n\n  // -----------------------------------------------------------------\n\n  /** Write a {@code double} field, including tag, to the stream. */\n  public void writeDouble(final int fieldNumber, final double value)\n                          throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED64);\n    writeDoubleNoTag(value);\n  }\n\n  /** Write a {@code float} field, including tag, to the stream. */\n  public void writeFloat(final int fieldNumber, final float value)\n                         throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32);\n    writeFloatNoTag(value);\n  }\n\n  /** Write a {@code uint64} field, including tag, to the stream. */\n  public void writeUInt64(final int fieldNumber, final long value)\n                          throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);\n    writeUInt64NoTag(value);\n  }\n\n  /** Write an {@code int64} field, including tag, to the stream. */\n  public void writeInt64(final int fieldNumber, final long value)\n                         throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);\n    writeInt64NoTag(value);\n  }\n\n  /** Write an {@code int32} field, including tag, to the stream. */\n  public void writeInt32(final int fieldNumber, final int value)\n                         throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);\n    writeInt32NoTag(value);\n  }\n\n  /** Write a {@code fixed64} field, including tag, to the stream. */\n  public void writeFixed64(final int fieldNumber, final long value)\n                           throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED64);\n    writeFixed64NoTag(value);\n  }\n\n  /** Write a {@code fixed32} field, including tag, to the stream. */\n  public void writeFixed32(final int fieldNumber, final int value)\n                           throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32);\n    writeFixed32NoTag(value);\n  }\n\n  /** Write a {@code bool} field, including tag, to the stream. */\n  public void writeBool(final int fieldNumber, final boolean value)\n                        throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);\n    writeBoolNoTag(value);\n  }\n\n  /** Write a {@code string} field, including tag, to the stream. */\n  public void writeString(final int fieldNumber, final String value)\n                          throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);\n    writeStringNoTag(value);\n  }\n\n  /** Write a {@code group} field, including tag, to the stream. */\n  public void writeGroup(final int fieldNumber, final MessageLite value)\n                         throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_START_GROUP);\n    writeGroupNoTag(value);\n    writeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP);\n  }\n\n  /**\n   * Write a group represented by an {@link UnknownFieldSet}.\n   *\n   * @deprecated UnknownFieldSet now implements MessageLite, so you can just\n   *             call {@link #writeGroup}.\n   */\n  @Deprecated\n  public void writeUnknownGroup(final int fieldNumber,\n                                final MessageLite value)\n                                throws IOException {\n    writeGroup(fieldNumber, value);\n  }\n\n  /** Write an embedded message field, including tag, to the stream. */\n  public void writeMessage(final int fieldNumber, final MessageLite value)\n                           throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);\n    writeMessageNoTag(value);\n  }\n\n  /** Write a {@code bytes} field, including tag, to the stream. */\n  public void writeBytes(final int fieldNumber, final ByteString value)\n                         throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);\n    writeBytesNoTag(value);\n  }\n\n  /** Write a {@code uint32} field, including tag, to the stream. */\n  public void writeUInt32(final int fieldNumber, final int value)\n                          throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);\n    writeUInt32NoTag(value);\n  }\n\n  /**\n   * Write an enum field, including tag, to the stream.  Caller is responsible\n   * for converting the enum value to its numeric value.\n   */\n  public void writeEnum(final int fieldNumber, final int value)\n                        throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);\n    writeEnumNoTag(value);\n  }\n\n  /** Write an {@code sfixed32} field, including tag, to the stream. */\n  public void writeSFixed32(final int fieldNumber, final int value)\n                            throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32);\n    writeSFixed32NoTag(value);\n  }\n\n  /** Write an {@code sfixed64} field, including tag, to the stream. */\n  public void writeSFixed64(final int fieldNumber, final long value)\n                            throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED64);\n    writeSFixed64NoTag(value);\n  }\n\n  /** Write an {@code sint32} field, including tag, to the stream. */\n  public void writeSInt32(final int fieldNumber, final int value)\n                          throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);\n    writeSInt32NoTag(value);\n  }\n\n  /** Write an {@code sint64} field, including tag, to the stream. */\n  public void writeSInt64(final int fieldNumber, final long value)\n                          throws IOException {\n    writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT);\n    writeSInt64NoTag(value);\n  }\n\n  /**\n   * Write a MessageSet extension field to the stream.  For historical reasons,\n   * the wire format differs from normal fields.\n   */\n  public void writeMessageSetExtension(final int fieldNumber,\n                                       final MessageLite value)\n                                       throws IOException {\n    writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_START_GROUP);\n    writeUInt32(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber);\n    writeMessage(WireFormat.MESSAGE_SET_MESSAGE, value);\n    writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_END_GROUP);\n  }\n\n  /**\n   * Write an unparsed MessageSet extension field to the stream.  For\n   * historical reasons, the wire format differs from normal fields.\n   */\n  public void writeRawMessageSetExtension(final int fieldNumber,\n                                          final ByteString value)\n                                          throws IOException {\n    writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_START_GROUP);\n    writeUInt32(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber);\n    writeBytes(WireFormat.MESSAGE_SET_MESSAGE, value);\n    writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_END_GROUP);\n  }\n\n  // -----------------------------------------------------------------\n\n  /** Write a {@code double} field to the stream. */\n  public void writeDoubleNoTag(final double value) throws IOException {\n    writeRawLittleEndian64(Double.doubleToRawLongBits(value));\n  }\n\n  /** Write a {@code float} field to the stream. */\n  public void writeFloatNoTag(final float value) throws IOException {\n    writeRawLittleEndian32(Float.floatToRawIntBits(value));\n  }\n\n  /** Write a {@code uint64} field to the stream. */\n  public void writeUInt64NoTag(final long value) throws IOException {\n    writeRawVarint64(value);\n  }\n\n  /** Write an {@code int64} field to the stream. */\n  public void writeInt64NoTag(final long value) throws IOException {\n    writeRawVarint64(value);\n  }\n\n  /** Write an {@code int32} field to the stream. */\n  public void writeInt32NoTag(final int value) throws IOException {\n    if (value >= 0) {\n      writeRawVarint32(value);\n    } else {\n      // Must sign-extend.\n      writeRawVarint64(value);\n    }\n  }\n\n  /** Write a {@code fixed64} field to the stream. */\n  public void writeFixed64NoTag(final long value) throws IOException {\n    writeRawLittleEndian64(value);\n  }\n\n  /** Write a {@code fixed32} field to the stream. */\n  public void writeFixed32NoTag(final int value) throws IOException {\n    writeRawLittleEndian32(value);\n  }\n\n  /** Write a {@code bool} field to the stream. */\n  public void writeBoolNoTag(final boolean value) throws IOException {\n    writeRawByte(value ? 1 : 0);\n  }\n\n  /** Write a {@code string} field to the stream. */\n  public void writeStringNoTag(final String value) throws IOException {\n    // Unfortunately there does not appear to be any way to tell Java to encode\n    // UTF-8 directly into our buffer, so we have to let it create its own byte\n    // array and then copy.\n    final byte[] bytes = value.getBytes(\"UTF-8\");\n    writeRawVarint32(bytes.length);\n    writeRawBytes(bytes);\n  }\n\n  /** Write a {@code group} field to the stream. */\n  public void writeGroupNoTag(final MessageLite value) throws IOException {\n    value.writeTo(this);\n  }\n\n  /**\n   * Write a group represented by an {@link UnknownFieldSet}.\n   *\n   * @deprecated UnknownFieldSet now implements MessageLite, so you can just\n   *             call {@link #writeGroupNoTag}.\n   */\n  @Deprecated\n  public void writeUnknownGroupNoTag(final MessageLite value)\n      throws IOException {\n    writeGroupNoTag(value);\n  }\n\n  /** Write an embedded message field to the stream. */\n  public void writeMessageNoTag(final MessageLite value) throws IOException {\n    writeRawVarint32(value.getSerializedSize());\n    value.writeTo(this);\n  }\n\n  /** Write a {@code bytes} field to the stream. */\n  public void writeBytesNoTag(final ByteString value) throws IOException {\n    writeRawVarint32(value.size());\n    writeRawBytes(value);\n  }\n\n  /** Write a {@code uint32} field to the stream. */\n  public void writeUInt32NoTag(final int value) throws IOException {\n    writeRawVarint32(value);\n  }\n\n  /**\n   * Write an enum field to the stream.  Caller is responsible\n   * for converting the enum value to its numeric value.\n   */\n  public void writeEnumNoTag(final int value) throws IOException {\n    writeInt32NoTag(value);\n  }\n\n  /** Write an {@code sfixed32} field to the stream. */\n  public void writeSFixed32NoTag(final int value) throws IOException {\n    writeRawLittleEndian32(value);\n  }\n\n  /** Write an {@code sfixed64} field to the stream. */\n  public void writeSFixed64NoTag(final long value) throws IOException {\n    writeRawLittleEndian64(value);\n  }\n\n  /** Write an {@code sint32} field to the stream. */\n  public void writeSInt32NoTag(final int value) throws IOException {\n    writeRawVarint32(encodeZigZag32(value));\n  }\n\n  /** Write an {@code sint64} field to the stream. */\n  public void writeSInt64NoTag(final long value) throws IOException {\n    writeRawVarint64(encodeZigZag64(value));\n  }\n\n  // =================================================================\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code double} field, including tag.\n   */\n  public static int computeDoubleSize(final int fieldNumber,\n                                      final double value) {\n    return computeTagSize(fieldNumber) + computeDoubleSizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code float} field, including tag.\n   */\n  public static int computeFloatSize(final int fieldNumber, final float value) {\n    return computeTagSize(fieldNumber) + computeFloatSizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code uint64} field, including tag.\n   */\n  public static int computeUInt64Size(final int fieldNumber, final long value) {\n    return computeTagSize(fieldNumber) + computeUInt64SizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * {@code int64} field, including tag.\n   */\n  public static int computeInt64Size(final int fieldNumber, final long value) {\n    return computeTagSize(fieldNumber) + computeInt64SizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * {@code int32} field, including tag.\n   */\n  public static int computeInt32Size(final int fieldNumber, final int value) {\n    return computeTagSize(fieldNumber) + computeInt32SizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code fixed64} field, including tag.\n   */\n  public static int computeFixed64Size(final int fieldNumber,\n                                       final long value) {\n    return computeTagSize(fieldNumber) + computeFixed64SizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code fixed32} field, including tag.\n   */\n  public static int computeFixed32Size(final int fieldNumber,\n                                       final int value) {\n    return computeTagSize(fieldNumber) + computeFixed32SizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code bool} field, including tag.\n   */\n  public static int computeBoolSize(final int fieldNumber,\n                                    final boolean value) {\n    return computeTagSize(fieldNumber) + computeBoolSizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code string} field, including tag.\n   */\n  public static int computeStringSize(final int fieldNumber,\n                                      final String value) {\n    return computeTagSize(fieldNumber) + computeStringSizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code group} field, including tag.\n   */\n  public static int computeGroupSize(final int fieldNumber,\n                                     final MessageLite value) {\n    return computeTagSize(fieldNumber) * 2 + computeGroupSizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code group} field represented by an {@code UnknownFieldSet}, including\n   * tag.\n   *\n   * @deprecated UnknownFieldSet now implements MessageLite, so you can just\n   *             call {@link #computeGroupSize}.\n   */\n  @Deprecated\n  public static int computeUnknownGroupSize(final int fieldNumber,\n                                            final MessageLite value) {\n    return computeGroupSize(fieldNumber, value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * embedded message field, including tag.\n   */\n  public static int computeMessageSize(final int fieldNumber,\n                                       final MessageLite value) {\n    return computeTagSize(fieldNumber) + computeMessageSizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code bytes} field, including tag.\n   */\n  public static int computeBytesSize(final int fieldNumber,\n                                     final ByteString value) {\n    return computeTagSize(fieldNumber) + computeBytesSizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code uint32} field, including tag.\n   */\n  public static int computeUInt32Size(final int fieldNumber, final int value) {\n    return computeTagSize(fieldNumber) + computeUInt32SizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * enum field, including tag.  Caller is responsible for converting the\n   * enum value to its numeric value.\n   */\n  public static int computeEnumSize(final int fieldNumber, final int value) {\n    return computeTagSize(fieldNumber) + computeEnumSizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * {@code sfixed32} field, including tag.\n   */\n  public static int computeSFixed32Size(final int fieldNumber,\n                                        final int value) {\n    return computeTagSize(fieldNumber) + computeSFixed32SizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * {@code sfixed64} field, including tag.\n   */\n  public static int computeSFixed64Size(final int fieldNumber,\n                                        final long value) {\n    return computeTagSize(fieldNumber) + computeSFixed64SizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * {@code sint32} field, including tag.\n   */\n  public static int computeSInt32Size(final int fieldNumber, final int value) {\n    return computeTagSize(fieldNumber) + computeSInt32SizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * {@code sint64} field, including tag.\n   */\n  public static int computeSInt64Size(final int fieldNumber, final long value) {\n    return computeTagSize(fieldNumber) + computeSInt64SizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * MessageSet extension to the stream.  For historical reasons,\n   * the wire format differs from normal fields.\n   */\n  public static int computeMessageSetExtensionSize(\n      final int fieldNumber, final MessageLite value) {\n    return computeTagSize(WireFormat.MESSAGE_SET_ITEM) * 2 +\n           computeUInt32Size(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber) +\n           computeMessageSize(WireFormat.MESSAGE_SET_MESSAGE, value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * unparsed MessageSet extension field to the stream.  For\n   * historical reasons, the wire format differs from normal fields.\n   */\n  public static int computeRawMessageSetExtensionSize(\n      final int fieldNumber, final ByteString value) {\n    return computeTagSize(WireFormat.MESSAGE_SET_ITEM) * 2 +\n           computeUInt32Size(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber) +\n           computeBytesSize(WireFormat.MESSAGE_SET_MESSAGE, value);\n  }\n\n  // -----------------------------------------------------------------\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code double} field, including tag.\n   */\n  public static int computeDoubleSizeNoTag(final double value) {\n    return LITTLE_ENDIAN_64_SIZE;\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code float} field, including tag.\n   */\n  public static int computeFloatSizeNoTag(final float value) {\n    return LITTLE_ENDIAN_32_SIZE;\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code uint64} field, including tag.\n   */\n  public static int computeUInt64SizeNoTag(final long value) {\n    return computeRawVarint64Size(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * {@code int64} field, including tag.\n   */\n  public static int computeInt64SizeNoTag(final long value) {\n    return computeRawVarint64Size(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * {@code int32} field, including tag.\n   */\n  public static int computeInt32SizeNoTag(final int value) {\n    if (value >= 0) {\n      return computeRawVarint32Size(value);\n    } else {\n      // Must sign-extend.\n      return 10;\n    }\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code fixed64} field.\n   */\n  public static int computeFixed64SizeNoTag(final long value) {\n    return LITTLE_ENDIAN_64_SIZE;\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code fixed32} field.\n   */\n  public static int computeFixed32SizeNoTag(final int value) {\n    return LITTLE_ENDIAN_32_SIZE;\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code bool} field.\n   */\n  public static int computeBoolSizeNoTag(final boolean value) {\n    return 1;\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code string} field.\n   */\n  public static int computeStringSizeNoTag(final String value) {\n    try {\n      final byte[] bytes = value.getBytes(\"UTF-8\");\n      return computeRawVarint32Size(bytes.length) +\n             bytes.length;\n    } catch (UnsupportedEncodingException e) {\n      throw new RuntimeException(\"UTF-8 not supported.\", e);\n    }\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code group} field.\n   */\n  public static int computeGroupSizeNoTag(final MessageLite value) {\n    return value.getSerializedSize();\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code group} field represented by an {@code UnknownFieldSet}, including\n   * tag.\n   *\n   * @deprecated UnknownFieldSet now implements MessageLite, so you can just\n   *             call {@link #computeUnknownGroupSizeNoTag}.\n   */\n  @Deprecated\n  public static int computeUnknownGroupSizeNoTag(final MessageLite value) {\n    return computeGroupSizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an embedded\n   * message field.\n   */\n  public static int computeMessageSizeNoTag(final MessageLite value) {\n    final int size = value.getSerializedSize();\n    return computeRawVarint32Size(size) + size;\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code bytes} field.\n   */\n  public static int computeBytesSizeNoTag(final ByteString value) {\n    return computeRawVarint32Size(value.size()) +\n           value.size();\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * {@code uint32} field.\n   */\n  public static int computeUInt32SizeNoTag(final int value) {\n    return computeRawVarint32Size(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an enum field.\n   * Caller is responsible for converting the enum value to its numeric value.\n   */\n  public static int computeEnumSizeNoTag(final int value) {\n    return computeInt32SizeNoTag(value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * {@code sfixed32} field.\n   */\n  public static int computeSFixed32SizeNoTag(final int value) {\n    return LITTLE_ENDIAN_32_SIZE;\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * {@code sfixed64} field.\n   */\n  public static int computeSFixed64SizeNoTag(final long value) {\n    return LITTLE_ENDIAN_64_SIZE;\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * {@code sint32} field.\n   */\n  public static int computeSInt32SizeNoTag(final int value) {\n    return computeRawVarint32Size(encodeZigZag32(value));\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode an\n   * {@code sint64} field.\n   */\n  public static int computeSInt64SizeNoTag(final long value) {\n    return computeRawVarint64Size(encodeZigZag64(value));\n  }\n\n  // =================================================================\n\n  /**\n   * Internal helper that writes the current buffer to the output. The\n   * buffer position is reset to its initial value when this returns.\n   */\n  private void refreshBuffer() throws IOException {\n    if (output == null) {\n      // We're writing to a single buffer.\n      throw new OutOfSpaceException();\n    }\n\n    // Since we have an output stream, this is our buffer\n    // and buffer offset == 0\n    output.write(buffer, 0, position);\n    position = 0;\n  }\n\n  /**\n   * Flushes the stream and forces any buffered bytes to be written.  This\n   * does not flush the underlying OutputStream.\n   */\n  public void flush() throws IOException {\n    if (output != null) {\n      refreshBuffer();\n    }\n  }\n\n  /**\n   * If writing to a flat array, return the space left in the array.\n   * Otherwise, throws {@code UnsupportedOperationException}.\n   */\n  public int spaceLeft() {\n    if (output == null) {\n      return limit - position;\n    } else {\n      throw new UnsupportedOperationException(\n        \"spaceLeft() can only be called on CodedOutputStreams that are \" +\n        \"writing to a flat array.\");\n    }\n  }\n\n  /**\n   * Verifies that {@link #spaceLeft()} returns zero.  It's common to create\n   * a byte array that is exactly big enough to hold a message, then write to\n   * it with a {@code CodedOutputStream}.  Calling {@code checkNoSpaceLeft()}\n   * after writing verifies that the message was actually as big as expected,\n   * which can help catch bugs.\n   */\n  public void checkNoSpaceLeft() {\n    if (spaceLeft() != 0) {\n      throw new IllegalStateException(\n        \"Did not write as much data as expected.\");\n    }\n  }\n\n  /**\n   * If you create a CodedOutputStream around a simple flat array, you must\n   * not attempt to write more bytes than the array has space.  Otherwise,\n   * this exception will be thrown.\n   */\n  public static class OutOfSpaceException extends IOException {\n    private static final long serialVersionUID = -6947486886997889499L;\n\n    OutOfSpaceException() {\n      super(\"CodedOutputStream was writing to a flat byte array and ran \" +\n            \"out of space.\");\n    }\n  }\n\n  /** Write a single byte. */\n  public void writeRawByte(final byte value) throws IOException {\n    if (position == limit) {\n      refreshBuffer();\n    }\n\n    buffer[position++] = value;\n  }\n\n  /** Write a single byte, represented by an integer value. */\n  public void writeRawByte(final int value) throws IOException {\n    writeRawByte((byte) value);\n  }\n\n  /** Write a byte string. */\n  public void writeRawBytes(final ByteString value) throws IOException {\n    writeRawBytes(value, 0, value.size());\n  }\n\n  /** Write an array of bytes. */\n  public void writeRawBytes(final byte[] value) throws IOException {\n    writeRawBytes(value, 0, value.length);\n  }\n\n  /** Write part of an array of bytes. */\n  public void writeRawBytes(final byte[] value, int offset, int length)\n                            throws IOException {\n    if (limit - position >= length) {\n      // We have room in the current buffer.\n      System.arraycopy(value, offset, buffer, position, length);\n      position += length;\n    } else {\n      // Write extends past current buffer.  Fill the rest of this buffer and\n      // flush.\n      final int bytesWritten = limit - position;\n      System.arraycopy(value, offset, buffer, position, bytesWritten);\n      offset += bytesWritten;\n      length -= bytesWritten;\n      position = limit;\n      refreshBuffer();\n\n      // Now deal with the rest.\n      // Since we have an output stream, this is our buffer\n      // and buffer offset == 0\n      if (length <= limit) {\n        // Fits in new buffer.\n        System.arraycopy(value, offset, buffer, 0, length);\n        position = length;\n      } else {\n        // Write is very big.  Let's do it all at once.\n        output.write(value, offset, length);\n      }\n    }\n  }\n\n  /** Write part of a byte string. */\n  public void writeRawBytes(final ByteString value, int offset, int length)\n                            throws IOException {\n    if (limit - position >= length) {\n      // We have room in the current buffer.\n      value.copyTo(buffer, offset, position, length);\n      position += length;\n    } else {\n      // Write extends past current buffer.  Fill the rest of this buffer and\n      // flush.\n      final int bytesWritten = limit - position;\n      value.copyTo(buffer, offset, position, bytesWritten);\n      offset += bytesWritten;\n      length -= bytesWritten;\n      position = limit;\n      refreshBuffer();\n\n      // Now deal with the rest.\n      // Since we have an output stream, this is our buffer\n      // and buffer offset == 0\n      if (length <= limit) {\n        // Fits in new buffer.\n        value.copyTo(buffer, offset, 0, length);\n        position = length;\n      } else {\n        // Write is very big, but we can't do it all at once without allocating\n        // an a copy of the byte array since ByteString does not give us access\n        // to the underlying bytes. Use the InputStream interface on the\n        // ByteString and our buffer to copy between the two.\n        InputStream inputStreamFrom = value.newInput();\n        if (offset != inputStreamFrom.skip(offset)) {\n          throw new IllegalStateException(\"Skip failed? Should never happen.\");\n        }\n        // Use the buffer as the temporary buffer to avoid allocating memory.\n        while (length > 0) {\n          int bytesToRead = Math.min(length, limit);\n          int bytesRead = inputStreamFrom.read(buffer, 0, bytesToRead);\n          if (bytesRead != bytesToRead) {\n            throw new IllegalStateException(\"Read failed? Should never happen\");\n          }\n          output.write(buffer, 0, bytesRead);\n          length -= bytesRead;\n        }\n      }\n    }\n  }\n\n  /** Encode and write a tag. */\n  public void writeTag(final int fieldNumber, final int wireType)\n                       throws IOException {\n    writeRawVarint32(WireFormat.makeTag(fieldNumber, wireType));\n  }\n\n  /** Compute the number of bytes that would be needed to encode a tag. */\n  public static int computeTagSize(final int fieldNumber) {\n    return computeRawVarint32Size(WireFormat.makeTag(fieldNumber, 0));\n  }\n\n  /**\n   * Encode and write a varint.  {@code value} is treated as\n   * unsigned, so it won't be sign-extended if negative.\n   */\n  public void writeRawVarint32(int value) throws IOException {\n    while (true) {\n      if ((value & ~0x7F) == 0) {\n        writeRawByte(value);\n        return;\n      } else {\n        writeRawByte((value & 0x7F) | 0x80);\n        value >>>= 7;\n      }\n    }\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a varint.\n   * {@code value} is treated as unsigned, so it won't be sign-extended if\n   * negative.\n   */\n  public static int computeRawVarint32Size(final int value) {\n    if ((value & (0xffffffff <<  7)) == 0) return 1;\n    if ((value & (0xffffffff << 14)) == 0) return 2;\n    if ((value & (0xffffffff << 21)) == 0) return 3;\n    if ((value & (0xffffffff << 28)) == 0) return 4;\n    return 5;\n  }\n\n  /** Encode and write a varint. */\n  public void writeRawVarint64(long value) throws IOException {\n    while (true) {\n      if ((value & ~0x7FL) == 0) {\n        writeRawByte((int)value);\n        return;\n      } else {\n        writeRawByte(((int)value & 0x7F) | 0x80);\n        value >>>= 7;\n      }\n    }\n  }\n\n  /** Compute the number of bytes that would be needed to encode a varint. */\n  public static int computeRawVarint64Size(final long value) {\n    if ((value & (0xffffffffffffffffL <<  7)) == 0) return 1;\n    if ((value & (0xffffffffffffffffL << 14)) == 0) return 2;\n    if ((value & (0xffffffffffffffffL << 21)) == 0) return 3;\n    if ((value & (0xffffffffffffffffL << 28)) == 0) return 4;\n    if ((value & (0xffffffffffffffffL << 35)) == 0) return 5;\n    if ((value & (0xffffffffffffffffL << 42)) == 0) return 6;\n    if ((value & (0xffffffffffffffffL << 49)) == 0) return 7;\n    if ((value & (0xffffffffffffffffL << 56)) == 0) return 8;\n    if ((value & (0xffffffffffffffffL << 63)) == 0) return 9;\n    return 10;\n  }\n\n  /** Write a little-endian 32-bit integer. */\n  public void writeRawLittleEndian32(final int value) throws IOException {\n    writeRawByte((value      ) & 0xFF);\n    writeRawByte((value >>  8) & 0xFF);\n    writeRawByte((value >> 16) & 0xFF);\n    writeRawByte((value >> 24) & 0xFF);\n  }\n\n  public static final int LITTLE_ENDIAN_32_SIZE = 4;\n\n  /** Write a little-endian 64-bit integer. */\n  public void writeRawLittleEndian64(final long value) throws IOException {\n    writeRawByte((int)(value      ) & 0xFF);\n    writeRawByte((int)(value >>  8) & 0xFF);\n    writeRawByte((int)(value >> 16) & 0xFF);\n    writeRawByte((int)(value >> 24) & 0xFF);\n    writeRawByte((int)(value >> 32) & 0xFF);\n    writeRawByte((int)(value >> 40) & 0xFF);\n    writeRawByte((int)(value >> 48) & 0xFF);\n    writeRawByte((int)(value >> 56) & 0xFF);\n  }\n\n  public static final int LITTLE_ENDIAN_64_SIZE = 8;\n\n  /**\n   * Encode a ZigZag-encoded 32-bit value.  ZigZag encodes signed integers\n   * into values that can be efficiently encoded with varint.  (Otherwise,\n   * negative values must be sign-extended to 64 bits to be varint encoded,\n   * thus always taking 10 bytes on the wire.)\n   *\n   * @param n A signed 32-bit integer.\n   * @return An unsigned 32-bit integer, stored in a signed int because\n   *         Java has no explicit unsigned support.\n   */\n  public static int encodeZigZag32(final int n) {\n    // Note:  the right-shift must be arithmetic\n    return (n << 1) ^ (n >> 31);\n  }\n\n  /**\n   * Encode a ZigZag-encoded 64-bit value.  ZigZag encodes signed integers\n   * into values that can be efficiently encoded with varint.  (Otherwise,\n   * negative values must be sign-extended to 64 bits to be varint encoded,\n   * thus always taking 10 bytes on the wire.)\n   *\n   * @param n A signed 64-bit integer.\n   * @return An unsigned 64-bit integer, stored in a signed int because\n   *         Java has no explicit unsigned support.\n   */\n  public static long encodeZigZag64(final long n) {\n    // Note:  the right-shift must be arithmetic\n    return (n << 1) ^ (n >> 63);\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport com.google.protobuf.DescriptorProtos.*;\n\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.io.UnsupportedEncodingException;\n\n/**\n * Contains a collection of classes which describe protocol message types.\n *\n * Every message type has a {@link Descriptor}, which lists all\n * its fields and other information about a type.  You can get a message\n * type's descriptor by calling {@code MessageType.getDescriptor()}, or\n * (given a message object of the type) {@code message.getDescriptorForType()}.\n * Furthermore, each message is associated with a {@link FileDescriptor} for\n * a relevant {@code .proto} file. You can obtain it by calling\n * {@code Descriptor.getFile()}. A {@link FileDescriptor} contains descriptors\n * for all the messages defined in that file, and file descriptors for all the\n * imported {@code .proto} files.\n *\n * Descriptors are built from DescriptorProtos, as defined in\n * {@code google/protobuf/descriptor.proto}.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic final class Descriptors {\n  /**\n   * Describes a {@code .proto} file, including everything defined within.\n   * That includes, in particular, descriptors for all the messages and\n   * file descriptors for all other imported {@code .proto} files\n   * (dependencies).\n   */\n  public static final class FileDescriptor {\n    /** Convert the descriptor to its protocol message representation. */\n    public FileDescriptorProto toProto() { return proto; }\n\n    /** Get the file name. */\n    public String getName() { return proto.getName(); }\n\n    /**\n     * Get the proto package name.  This is the package name given by the\n     * {@code package} statement in the {@code .proto} file, which differs\n     * from the Java package.\n     */\n    public String getPackage() { return proto.getPackage(); }\n\n    /** Get the {@code FileOptions}, defined in {@code descriptor.proto}. */\n    public FileOptions getOptions() { return proto.getOptions(); }\n\n    /** Get a list of top-level message types declared in this file. */\n    public List<Descriptor> getMessageTypes() {\n      return Collections.unmodifiableList(Arrays.asList(messageTypes));\n    }\n\n    /** Get a list of top-level enum types declared in this file. */\n    public List<EnumDescriptor> getEnumTypes() {\n      return Collections.unmodifiableList(Arrays.asList(enumTypes));\n    }\n\n    /** Get a list of top-level services declared in this file. */\n    public List<ServiceDescriptor> getServices() {\n      return Collections.unmodifiableList(Arrays.asList(services));\n    }\n\n    /** Get a list of top-level extensions declared in this file. */\n    public List<FieldDescriptor> getExtensions() {\n      return Collections.unmodifiableList(Arrays.asList(extensions));\n    }\n\n    /** Get a list of this file's dependencies (imports). */\n    public List<FileDescriptor> getDependencies() {\n      return Collections.unmodifiableList(Arrays.asList(dependencies));\n    }\n\n    /**\n     * Find a message type in the file by name.  Does not find nested types.\n     *\n     * @param name The unqualified type name to look for.\n     * @return The message type's descriptor, or {@code null} if not found.\n     */\n    public Descriptor findMessageTypeByName(String name) {\n      // Don't allow looking up nested types.  This will make optimization\n      // easier later.\n      if (name.indexOf('.') != -1) {\n        return null;\n      }\n      if (getPackage().length() > 0) {\n        name = getPackage() + '.' + name;\n      }\n      final GenericDescriptor result = pool.findSymbol(name);\n      if (result != null && result instanceof Descriptor &&\n          result.getFile() == this) {\n        return (Descriptor)result;\n      } else {\n        return null;\n      }\n    }\n\n    /**\n     * Find an enum type in the file by name.  Does not find nested types.\n     *\n     * @param name The unqualified type name to look for.\n     * @return The enum type's descriptor, or {@code null} if not found.\n     */\n    public EnumDescriptor findEnumTypeByName(String name) {\n      // Don't allow looking up nested types.  This will make optimization\n      // easier later.\n      if (name.indexOf('.') != -1) {\n        return null;\n      }\n      if (getPackage().length() > 0) {\n        name = getPackage() + '.' + name;\n      }\n      final GenericDescriptor result = pool.findSymbol(name);\n      if (result != null && result instanceof EnumDescriptor &&\n          result.getFile() == this) {\n        return (EnumDescriptor)result;\n      } else {\n        return null;\n      }\n    }\n\n    /**\n     * Find a service type in the file by name.\n     *\n     * @param name The unqualified type name to look for.\n     * @return The service type's descriptor, or {@code null} if not found.\n     */\n    public ServiceDescriptor findServiceByName(String name) {\n      // Don't allow looking up nested types.  This will make optimization\n      // easier later.\n      if (name.indexOf('.') != -1) {\n        return null;\n      }\n      if (getPackage().length() > 0) {\n        name = getPackage() + '.' + name;\n      }\n      final GenericDescriptor result = pool.findSymbol(name);\n      if (result != null && result instanceof ServiceDescriptor &&\n          result.getFile() == this) {\n        return (ServiceDescriptor)result;\n      } else {\n        return null;\n      }\n    }\n\n    /**\n     * Find an extension in the file by name.  Does not find extensions nested\n     * inside message types.\n     *\n     * @param name The unqualified extension name to look for.\n     * @return The extension's descriptor, or {@code null} if not found.\n     */\n    public FieldDescriptor findExtensionByName(String name) {\n      if (name.indexOf('.') != -1) {\n        return null;\n      }\n      if (getPackage().length() > 0) {\n        name = getPackage() + '.' + name;\n      }\n      final GenericDescriptor result = pool.findSymbol(name);\n      if (result != null && result instanceof FieldDescriptor &&\n          result.getFile() == this) {\n        return (FieldDescriptor)result;\n      } else {\n        return null;\n      }\n    }\n\n    /**\n     * Construct a {@code FileDescriptor}.\n     *\n     * @param proto The protocol message form of the FileDescriptor.\n     * @param dependencies {@code FileDescriptor}s corresponding to all of\n     *                     the file's dependencies, in the exact order listed\n     *                     in {@code proto}.\n     * @throws DescriptorValidationException {@code proto} is not a valid\n     *           descriptor.  This can occur for a number of reasons, e.g.\n     *           because a field has an undefined type or because two messages\n     *           were defined with the same name.\n     */\n    public static FileDescriptor buildFrom(final FileDescriptorProto proto,\n                                           final FileDescriptor[] dependencies)\n                                    throws DescriptorValidationException {\n      // Building decsriptors involves two steps:  translating and linking.\n      // In the translation step (implemented by FileDescriptor's\n      // constructor), we build an object tree mirroring the\n      // FileDescriptorProto's tree and put all of the descriptors into the\n      // DescriptorPool's lookup tables.  In the linking step, we look up all\n      // type references in the DescriptorPool, so that, for example, a\n      // FieldDescriptor for an embedded message contains a pointer directly\n      // to the Descriptor for that message's type.  We also detect undefined\n      // types in the linking step.\n      final DescriptorPool pool = new DescriptorPool(dependencies);\n      final FileDescriptor result =\n          new FileDescriptor(proto, dependencies, pool);\n\n      if (dependencies.length != proto.getDependencyCount()) {\n        throw new DescriptorValidationException(result,\n          \"Dependencies passed to FileDescriptor.buildFrom() don't match \" +\n          \"those listed in the FileDescriptorProto.\");\n      }\n      for (int i = 0; i < proto.getDependencyCount(); i++) {\n        if (!dependencies[i].getName().equals(proto.getDependency(i))) {\n          throw new DescriptorValidationException(result,\n            \"Dependencies passed to FileDescriptor.buildFrom() don't match \" +\n            \"those listed in the FileDescriptorProto.\");\n        }\n      }\n\n      result.crossLink();\n      return result;\n    }\n\n    /**\n     * This method is to be called by generated code only.  It is equivalent\n     * to {@code buildFrom} except that the {@code FileDescriptorProto} is\n     * encoded in protocol buffer wire format.\n     */\n    public static void internalBuildGeneratedFileFrom(\n        final String[] descriptorDataParts,\n        final FileDescriptor[] dependencies,\n        final InternalDescriptorAssigner descriptorAssigner) {\n      // Hack:  We can't embed a raw byte array inside generated Java code\n      //   (at least, not efficiently), but we can embed Strings.  So, the\n      //   protocol compiler embeds the FileDescriptorProto as a giant\n      //   string literal which is passed to this function to construct the\n      //   file's FileDescriptor.  The string literal contains only 8-bit\n      //   characters, each one representing a byte of the FileDescriptorProto's\n      //   serialized form.  So, if we convert it to bytes in ISO-8859-1, we\n      //   should get the original bytes that we want.\n\n      // descriptorData may contain multiple strings in order to get around the\n      // Java 64k string literal limit.\n      StringBuilder descriptorData = new StringBuilder();\n      for (String part : descriptorDataParts) {\n        descriptorData.append(part);\n      }\n\n      final byte[] descriptorBytes;\n      try {\n        descriptorBytes = descriptorData.toString().getBytes(\"ISO-8859-1\");\n      } catch (UnsupportedEncodingException e) {\n        throw new RuntimeException(\n          \"Standard encoding ISO-8859-1 not supported by JVM.\", e);\n      }\n\n      FileDescriptorProto proto;\n      try {\n        proto = FileDescriptorProto.parseFrom(descriptorBytes);\n      } catch (InvalidProtocolBufferException e) {\n        throw new IllegalArgumentException(\n          \"Failed to parse protocol buffer descriptor for generated code.\", e);\n      }\n\n      final FileDescriptor result;\n      try {\n        result = buildFrom(proto, dependencies);\n      } catch (DescriptorValidationException e) {\n        throw new IllegalArgumentException(\n          \"Invalid embedded descriptor for \\\"\" + proto.getName() + \"\\\".\", e);\n      }\n\n      final ExtensionRegistry registry =\n          descriptorAssigner.assignDescriptors(result);\n\n      if (registry != null) {\n        // We must re-parse the proto using the registry.\n        try {\n          proto = FileDescriptorProto.parseFrom(descriptorBytes, registry);\n        } catch (InvalidProtocolBufferException e) {\n          throw new IllegalArgumentException(\n            \"Failed to parse protocol buffer descriptor for generated code.\",\n            e);\n        }\n\n        result.setProto(proto);\n      }\n    }\n\n    /**\n     * This class should be used by generated code only.  When calling\n     * {@link FileDescriptor#internalBuildGeneratedFileFrom}, the caller\n     * provides a callback implementing this interface.  The callback is called\n     * after the FileDescriptor has been constructed, in order to assign all\n     * the global variales defined in the generated code which point at parts\n     * of the FileDescriptor.  The callback returns an ExtensionRegistry which\n     * contains any extensions which might be used in the descriptor -- that\n     * is, extensions of the various \"Options\" messages defined in\n     * descriptor.proto.  The callback may also return null to indicate that\n     * no extensions are used in the decsriptor.\n     */\n    public interface InternalDescriptorAssigner {\n      ExtensionRegistry assignDescriptors(FileDescriptor root);\n    }\n\n    private FileDescriptorProto proto;\n    private final Descriptor[] messageTypes;\n    private final EnumDescriptor[] enumTypes;\n    private final ServiceDescriptor[] services;\n    private final FieldDescriptor[] extensions;\n    private final FileDescriptor[] dependencies;\n    private final DescriptorPool pool;\n\n    private FileDescriptor(final FileDescriptorProto proto,\n                           final FileDescriptor[] dependencies,\n                           final DescriptorPool pool)\n                    throws DescriptorValidationException {\n      this.pool = pool;\n      this.proto = proto;\n      this.dependencies = dependencies.clone();\n\n      pool.addPackage(getPackage(), this);\n\n      messageTypes = new Descriptor[proto.getMessageTypeCount()];\n      for (int i = 0; i < proto.getMessageTypeCount(); i++) {\n        messageTypes[i] =\n          new Descriptor(proto.getMessageType(i), this, null, i);\n      }\n\n      enumTypes = new EnumDescriptor[proto.getEnumTypeCount()];\n      for (int i = 0; i < proto.getEnumTypeCount(); i++) {\n        enumTypes[i] = new EnumDescriptor(proto.getEnumType(i), this, null, i);\n      }\n\n      services = new ServiceDescriptor[proto.getServiceCount()];\n      for (int i = 0; i < proto.getServiceCount(); i++) {\n        services[i] = new ServiceDescriptor(proto.getService(i), this, i);\n      }\n\n      extensions = new FieldDescriptor[proto.getExtensionCount()];\n      for (int i = 0; i < proto.getExtensionCount(); i++) {\n        extensions[i] = new FieldDescriptor(\n          proto.getExtension(i), this, null, i, true);\n      }\n    }\n\n    /** Look up and cross-link all field types, etc. */\n    private void crossLink() throws DescriptorValidationException {\n      for (final Descriptor messageType : messageTypes) {\n        messageType.crossLink();\n      }\n\n      for (final ServiceDescriptor service : services) {\n        service.crossLink();\n      }\n\n      for (final FieldDescriptor extension : extensions) {\n        extension.crossLink();\n      }\n    }\n\n    /**\n     * Replace our {@link FileDescriptorProto} with the given one, which is\n     * identical except that it might contain extensions that weren't present\n     * in the original.  This method is needed for bootstrapping when a file\n     * defines custom options.  The options may be defined in the file itself,\n     * so we can't actually parse them until we've constructed the descriptors,\n     * but to construct the decsriptors we have to have parsed the descriptor\n     * protos.  So, we have to parse the descriptor protos a second time after\n     * constructing the descriptors.\n     */\n    private void setProto(final FileDescriptorProto proto) {\n      this.proto = proto;\n\n      for (int i = 0; i < messageTypes.length; i++) {\n        messageTypes[i].setProto(proto.getMessageType(i));\n      }\n\n      for (int i = 0; i < enumTypes.length; i++) {\n        enumTypes[i].setProto(proto.getEnumType(i));\n      }\n\n      for (int i = 0; i < services.length; i++) {\n        services[i].setProto(proto.getService(i));\n      }\n\n      for (int i = 0; i < extensions.length; i++) {\n        extensions[i].setProto(proto.getExtension(i));\n      }\n    }\n  }\n\n  // =================================================================\n\n  /** Describes a message type. */\n  public static final class Descriptor implements GenericDescriptor {\n    /**\n     * Get the index of this descriptor within its parent.  In other words,\n     * given a {@link FileDescriptor} {@code file}, the following is true:\n     * <pre>\n     *   for all i in [0, file.getMessageTypeCount()):\n     *     file.getMessageType(i).getIndex() == i\n     * </pre>\n     * Similarly, for a {@link Descriptor} {@code messageType}:\n     * <pre>\n     *   for all i in [0, messageType.getNestedTypeCount()):\n     *     messageType.getNestedType(i).getIndex() == i\n     * </pre>\n     */\n    public int getIndex() { return index; }\n\n    /** Convert the descriptor to its protocol message representation. */\n    public DescriptorProto toProto() { return proto; }\n\n    /** Get the type's unqualified name. */\n    public String getName() { return proto.getName(); }\n\n    /**\n     * Get the type's fully-qualified name, within the proto language's\n     * namespace.  This differs from the Java name.  For example, given this\n     * {@code .proto}:\n     * <pre>\n     *   package foo.bar;\n     *   option java_package = \"com.example.protos\"\n     *   message Baz {}\n     * </pre>\n     * {@code Baz}'s full name is \"foo.bar.Baz\".\n     */\n    public String getFullName() { return fullName; }\n\n    /** Get the {@link FileDescriptor} containing this descriptor. */\n    public FileDescriptor getFile() { return file; }\n\n    /** If this is a nested type, get the outer descriptor, otherwise null. */\n    public Descriptor getContainingType() { return containingType; }\n\n    /** Get the {@code MessageOptions}, defined in {@code descriptor.proto}. */\n    public MessageOptions getOptions() { return proto.getOptions(); }\n\n    /** Get a list of this message type's fields. */\n    public List<FieldDescriptor> getFields() {\n      return Collections.unmodifiableList(Arrays.asList(fields));\n    }\n\n    /** Get a list of this message type's extensions. */\n    public List<FieldDescriptor> getExtensions() {\n      return Collections.unmodifiableList(Arrays.asList(extensions));\n    }\n\n    /** Get a list of message types nested within this one. */\n    public List<Descriptor> getNestedTypes() {\n      return Collections.unmodifiableList(Arrays.asList(nestedTypes));\n    }\n\n    /** Get a list of enum types nested within this one. */\n    public List<EnumDescriptor> getEnumTypes() {\n      return Collections.unmodifiableList(Arrays.asList(enumTypes));\n    }\n\n    /** Determines if the given field number is an extension. */\n    public boolean isExtensionNumber(final int number) {\n      for (final DescriptorProto.ExtensionRange range :\n          proto.getExtensionRangeList()) {\n        if (range.getStart() <= number && number < range.getEnd()) {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    /**\n     * Finds a field by name.\n     * @param name The unqualified name of the field (e.g. \"foo\").\n     * @return The field's descriptor, or {@code null} if not found.\n     */\n    public FieldDescriptor findFieldByName(final String name) {\n      final GenericDescriptor result =\n          file.pool.findSymbol(fullName + '.' + name);\n      if (result != null && result instanceof FieldDescriptor) {\n        return (FieldDescriptor)result;\n      } else {\n        return null;\n      }\n    }\n\n    /**\n     * Finds a field by field number.\n     * @param number The field number within this message type.\n     * @return The field's descriptor, or {@code null} if not found.\n     */\n    public FieldDescriptor findFieldByNumber(final int number) {\n      return file.pool.fieldsByNumber.get(\n        new DescriptorPool.DescriptorIntPair(this, number));\n    }\n\n    /**\n     * Finds a nested message type by name.\n     * @param name The unqualified name of the nested type (e.g. \"Foo\").\n     * @return The types's descriptor, or {@code null} if not found.\n     */\n    public Descriptor findNestedTypeByName(final String name) {\n      final GenericDescriptor result =\n          file.pool.findSymbol(fullName + '.' + name);\n      if (result != null && result instanceof Descriptor) {\n        return (Descriptor)result;\n      } else {\n        return null;\n      }\n    }\n\n    /**\n     * Finds a nested enum type by name.\n     * @param name The unqualified name of the nested type (e.g. \"Foo\").\n     * @return The types's descriptor, or {@code null} if not found.\n     */\n    public EnumDescriptor findEnumTypeByName(final String name) {\n      final GenericDescriptor result =\n          file.pool.findSymbol(fullName + '.' + name);\n      if (result != null && result instanceof EnumDescriptor) {\n        return (EnumDescriptor)result;\n      } else {\n        return null;\n      }\n    }\n\n    private final int index;\n    private DescriptorProto proto;\n    private final String fullName;\n    private final FileDescriptor file;\n    private final Descriptor containingType;\n    private final Descriptor[] nestedTypes;\n    private final EnumDescriptor[] enumTypes;\n    private final FieldDescriptor[] fields;\n    private final FieldDescriptor[] extensions;\n\n    private Descriptor(final DescriptorProto proto,\n                       final FileDescriptor file,\n                       final Descriptor parent,\n                       final int index)\n                throws DescriptorValidationException {\n      this.index = index;\n      this.proto = proto;\n      fullName = computeFullName(file, parent, proto.getName());\n      this.file = file;\n      containingType = parent;\n\n      nestedTypes = new Descriptor[proto.getNestedTypeCount()];\n      for (int i = 0; i < proto.getNestedTypeCount(); i++) {\n        nestedTypes[i] = new Descriptor(\n          proto.getNestedType(i), file, this, i);\n      }\n\n      enumTypes = new EnumDescriptor[proto.getEnumTypeCount()];\n      for (int i = 0; i < proto.getEnumTypeCount(); i++) {\n        enumTypes[i] = new EnumDescriptor(\n          proto.getEnumType(i), file, this, i);\n      }\n\n      fields = new FieldDescriptor[proto.getFieldCount()];\n      for (int i = 0; i < proto.getFieldCount(); i++) {\n        fields[i] = new FieldDescriptor(\n          proto.getField(i), file, this, i, false);\n      }\n\n      extensions = new FieldDescriptor[proto.getExtensionCount()];\n      for (int i = 0; i < proto.getExtensionCount(); i++) {\n        extensions[i] = new FieldDescriptor(\n          proto.getExtension(i), file, this, i, true);\n      }\n\n      file.pool.addSymbol(this);\n    }\n\n    /** Look up and cross-link all field types, etc. */\n    private void crossLink() throws DescriptorValidationException {\n      for (final Descriptor nestedType : nestedTypes) {\n        nestedType.crossLink();\n      }\n\n      for (final FieldDescriptor field : fields) {\n        field.crossLink();\n      }\n\n      for (final FieldDescriptor extension : extensions) {\n        extension.crossLink();\n      }\n    }\n\n    /** See {@link FileDescriptor#setProto}. */\n    private void setProto(final DescriptorProto proto) {\n      this.proto = proto;\n\n      for (int i = 0; i < nestedTypes.length; i++) {\n        nestedTypes[i].setProto(proto.getNestedType(i));\n      }\n\n      for (int i = 0; i < enumTypes.length; i++) {\n        enumTypes[i].setProto(proto.getEnumType(i));\n      }\n\n      for (int i = 0; i < fields.length; i++) {\n        fields[i].setProto(proto.getField(i));\n      }\n\n      for (int i = 0; i < extensions.length; i++) {\n        extensions[i].setProto(proto.getExtension(i));\n      }\n    }\n  }\n\n  // =================================================================\n\n  /** Describes a field of a message type. */\n  public static final class FieldDescriptor\n      implements GenericDescriptor, Comparable<FieldDescriptor>,\n                 FieldSet.FieldDescriptorLite<FieldDescriptor> {\n    /**\n     * Get the index of this descriptor within its parent.\n     * @see Descriptor#getIndex()\n     */\n    public int getIndex() { return index; }\n\n    /** Convert the descriptor to its protocol message representation. */\n    public FieldDescriptorProto toProto() { return proto; }\n\n    /** Get the field's unqualified name. */\n    public String getName() { return proto.getName(); }\n\n    /** Get the field's number. */\n    public int getNumber() { return proto.getNumber(); }\n\n    /**\n     * Get the field's fully-qualified name.\n     * @see Descriptor#getFullName()\n     */\n    public String getFullName() { return fullName; }\n\n    /**\n     * Get the field's java type.  This is just for convenience.  Every\n     * {@code FieldDescriptorProto.Type} maps to exactly one Java type.\n     */\n    public JavaType getJavaType() { return type.getJavaType(); }\n\n    /** For internal use only. */\n    public WireFormat.JavaType getLiteJavaType() {\n      return getLiteType().getJavaType();\n    }\n\n    /** Get the {@code FileDescriptor} containing this descriptor. */\n    public FileDescriptor getFile() { return file; }\n\n    /** Get the field's declared type. */\n    public Type getType() { return type; }\n\n    /** For internal use only. */\n    public WireFormat.FieldType getLiteType() {\n      return table[type.ordinal()];\n    }\n    // I'm pretty sure values() constructs a new array every time, since there\n    // is nothing stopping the caller from mutating the array.  Therefore we\n    // make a static copy here.\n    private static final WireFormat.FieldType[] table =\n        WireFormat.FieldType.values();\n\n    /** Is this field declared required? */\n    public boolean isRequired() {\n      return proto.getLabel() == FieldDescriptorProto.Label.LABEL_REQUIRED;\n    }\n\n    /** Is this field declared optional? */\n    public boolean isOptional() {\n      return proto.getLabel() == FieldDescriptorProto.Label.LABEL_OPTIONAL;\n    }\n\n    /** Is this field declared repeated? */\n    public boolean isRepeated() {\n      return proto.getLabel() == FieldDescriptorProto.Label.LABEL_REPEATED;\n    }\n\n    /** Does this field have the {@code [packed = true]} option? */\n    public boolean isPacked() {\n      return getOptions().getPacked();\n    }\n\n    /** Can this field be packed? i.e. is it a repeated primitive field? */\n    public boolean isPackable() {\n      return isRepeated() && getLiteType().isPackable();\n    }\n\n    /** Returns true if the field had an explicitly-defined default value. */\n    public boolean hasDefaultValue() { return proto.hasDefaultValue(); }\n\n    /**\n     * Returns the field's default value.  Valid for all types except for\n     * messages and groups.  For all other types, the object returned is of\n     * the same class that would returned by Message.getField(this).\n     */\n    public Object getDefaultValue() {\n      if (getJavaType() == JavaType.MESSAGE) {\n        throw new UnsupportedOperationException(\n          \"FieldDescriptor.getDefaultValue() called on an embedded message \" +\n          \"field.\");\n      }\n      return defaultValue;\n    }\n\n    /** Get the {@code FieldOptions}, defined in {@code descriptor.proto}. */\n    public FieldOptions getOptions() { return proto.getOptions(); }\n\n    /** Is this field an extension? */\n    public boolean isExtension() { return proto.hasExtendee(); }\n\n    /**\n     * Get the field's containing type. For extensions, this is the type being\n     * extended, not the location where the extension was defined.  See\n     * {@link #getExtensionScope()}.\n     */\n    public Descriptor getContainingType() { return containingType; }\n\n    /**\n     * For extensions defined nested within message types, gets the outer\n     * type.  Not valid for non-extension fields.  For example, consider\n     * this {@code .proto} file:\n     * <pre>\n     *   message Foo {\n     *     extensions 1000 to max;\n     *   }\n     *   extend Foo {\n     *     optional int32 baz = 1234;\n     *   }\n     *   message Bar {\n     *     extend Foo {\n     *       optional int32 qux = 4321;\n     *     }\n     *   }\n     * </pre>\n     * Both {@code baz}'s and {@code qux}'s containing type is {@code Foo}.\n     * However, {@code baz}'s extension scope is {@code null} while\n     * {@code qux}'s extension scope is {@code Bar}.\n     */\n    public Descriptor getExtensionScope() {\n      if (!isExtension()) {\n        throw new UnsupportedOperationException(\n          \"This field is not an extension.\");\n      }\n      return extensionScope;\n    }\n\n    /** For embedded message and group fields, gets the field's type. */\n    public Descriptor getMessageType() {\n      if (getJavaType() != JavaType.MESSAGE) {\n        throw new UnsupportedOperationException(\n          \"This field is not of message type.\");\n      }\n      return messageType;\n    }\n\n    /** For enum fields, gets the field's type. */\n    public EnumDescriptor getEnumType() {\n      if (getJavaType() != JavaType.ENUM) {\n        throw new UnsupportedOperationException(\n          \"This field is not of enum type.\");\n      }\n      return enumType;\n    }\n\n    /**\n     * Compare with another {@code FieldDescriptor}.  This orders fields in\n     * \"canonical\" order, which simply means ascending order by field number.\n     * {@code other} must be a field of the same type -- i.e.\n     * {@code getContainingType()} must return the same {@code Descriptor} for\n     * both fields.\n     *\n     * @return negative, zero, or positive if {@code this} is less than,\n     *         equal to, or greater than {@code other}, respectively.\n     */\n    public int compareTo(final FieldDescriptor other) {\n      if (other.containingType != containingType) {\n        throw new IllegalArgumentException(\n          \"FieldDescriptors can only be compared to other FieldDescriptors \" +\n          \"for fields of the same message type.\");\n      }\n      return getNumber() - other.getNumber();\n    }\n\n    private final int index;\n\n    private FieldDescriptorProto proto;\n    private final String fullName;\n    private final FileDescriptor file;\n    private final Descriptor extensionScope;\n\n    // Possibly initialized during cross-linking.\n    private Type type;\n    private Descriptor containingType;\n    private Descriptor messageType;\n    private EnumDescriptor enumType;\n    private Object defaultValue;\n\n    public enum Type {\n      DOUBLE  (JavaType.DOUBLE     ),\n      FLOAT   (JavaType.FLOAT      ),\n      INT64   (JavaType.LONG       ),\n      UINT64  (JavaType.LONG       ),\n      INT32   (JavaType.INT        ),\n      FIXED64 (JavaType.LONG       ),\n      FIXED32 (JavaType.INT        ),\n      BOOL    (JavaType.BOOLEAN    ),\n      STRING  (JavaType.STRING     ),\n      GROUP   (JavaType.MESSAGE    ),\n      MESSAGE (JavaType.MESSAGE    ),\n      BYTES   (JavaType.BYTE_STRING),\n      UINT32  (JavaType.INT        ),\n      ENUM    (JavaType.ENUM       ),\n      SFIXED32(JavaType.INT        ),\n      SFIXED64(JavaType.LONG       ),\n      SINT32  (JavaType.INT        ),\n      SINT64  (JavaType.LONG       );\n\n      Type(final JavaType javaType) {\n        this.javaType = javaType;\n      }\n\n      private JavaType javaType;\n\n      public FieldDescriptorProto.Type toProto() {\n        return FieldDescriptorProto.Type.valueOf(ordinal() + 1);\n      }\n      public JavaType getJavaType() { return javaType; }\n\n      public static Type valueOf(final FieldDescriptorProto.Type type) {\n        return values()[type.getNumber() - 1];\n      }\n    }\n\n    static {\n      // Refuse to init if someone added a new declared type.\n      if (Type.values().length != FieldDescriptorProto.Type.values().length) {\n        throw new RuntimeException(\n          \"descriptor.proto has a new declared type but Desrciptors.java \" +\n          \"wasn't updated.\");\n      }\n    }\n\n    public enum JavaType {\n      INT(0),\n      LONG(0L),\n      FLOAT(0F),\n      DOUBLE(0D),\n      BOOLEAN(false),\n      STRING(\"\"),\n      BYTE_STRING(ByteString.EMPTY),\n      ENUM(null),\n      MESSAGE(null);\n\n      JavaType(final Object defaultDefault) {\n        this.defaultDefault = defaultDefault;\n      }\n\n      /**\n       * The default default value for fields of this type, if it's a primitive\n       * type.  This is meant for use inside this file only, hence is private.\n       */\n      private final Object defaultDefault;\n    }\n\n    private FieldDescriptor(final FieldDescriptorProto proto,\n                            final FileDescriptor file,\n                            final Descriptor parent,\n                            final int index,\n                            final boolean isExtension)\n                     throws DescriptorValidationException {\n      this.index = index;\n      this.proto = proto;\n      fullName = computeFullName(file, parent, proto.getName());\n      this.file = file;\n\n      if (proto.hasType()) {\n        type = Type.valueOf(proto.getType());\n      }\n\n      if (getNumber() <= 0) {\n        throw new DescriptorValidationException(this,\n          \"Field numbers must be positive integers.\");\n      }\n\n      // Only repeated primitive fields may be packed.\n      if (proto.getOptions().getPacked() && !isPackable()) {\n        throw new DescriptorValidationException(this,\n          \"[packed = true] can only be specified for repeated primitive \" +\n          \"fields.\");\n      }\n\n      if (isExtension) {\n        if (!proto.hasExtendee()) {\n          throw new DescriptorValidationException(this,\n            \"FieldDescriptorProto.extendee not set for extension field.\");\n        }\n        containingType = null;  // Will be filled in when cross-linking\n        if (parent != null) {\n          extensionScope = parent;\n        } else {\n          extensionScope = null;\n        }\n      } else {\n        if (proto.hasExtendee()) {\n          throw new DescriptorValidationException(this,\n            \"FieldDescriptorProto.extendee set for non-extension field.\");\n        }\n        containingType = parent;\n        extensionScope = null;\n      }\n\n      file.pool.addSymbol(this);\n    }\n\n    /** Look up and cross-link all field types, etc. */\n    private void crossLink() throws DescriptorValidationException {\n      if (proto.hasExtendee()) {\n        final GenericDescriptor extendee =\n          file.pool.lookupSymbol(proto.getExtendee(), this);\n        if (!(extendee instanceof Descriptor)) {\n          throw new DescriptorValidationException(this,\n              '\\\"' + proto.getExtendee() + \"\\\" is not a message type.\");\n        }\n        containingType = (Descriptor)extendee;\n\n        if (!getContainingType().isExtensionNumber(getNumber())) {\n          throw new DescriptorValidationException(this,\n              '\\\"' + getContainingType().getFullName() +\n              \"\\\" does not declare \" + getNumber() +\n              \" as an extension number.\");\n        }\n      }\n\n      if (proto.hasTypeName()) {\n        final GenericDescriptor typeDescriptor =\n          file.pool.lookupSymbol(proto.getTypeName(), this);\n\n        if (!proto.hasType()) {\n          // Choose field type based on symbol.\n          if (typeDescriptor instanceof Descriptor) {\n            type = Type.MESSAGE;\n          } else if (typeDescriptor instanceof EnumDescriptor) {\n            type = Type.ENUM;\n          } else {\n            throw new DescriptorValidationException(this,\n                '\\\"' + proto.getTypeName() + \"\\\" is not a type.\");\n          }\n        }\n\n        if (getJavaType() == JavaType.MESSAGE) {\n          if (!(typeDescriptor instanceof Descriptor)) {\n            throw new DescriptorValidationException(this,\n                '\\\"' + proto.getTypeName() + \"\\\" is not a message type.\");\n          }\n          messageType = (Descriptor)typeDescriptor;\n\n          if (proto.hasDefaultValue()) {\n            throw new DescriptorValidationException(this,\n              \"Messages can't have default values.\");\n          }\n        } else if (getJavaType() == JavaType.ENUM) {\n          if (!(typeDescriptor instanceof EnumDescriptor)) {\n            throw new DescriptorValidationException(this,\n                '\\\"' + proto.getTypeName() + \"\\\" is not an enum type.\");\n          }\n          enumType = (EnumDescriptor)typeDescriptor;\n        } else {\n          throw new DescriptorValidationException(this,\n            \"Field with primitive type has type_name.\");\n        }\n      } else {\n        if (getJavaType() == JavaType.MESSAGE ||\n            getJavaType() == JavaType.ENUM) {\n          throw new DescriptorValidationException(this,\n            \"Field with message or enum type missing type_name.\");\n        }\n      }\n\n      // We don't attempt to parse the default value until here because for\n      // enums we need the enum type's descriptor.\n      if (proto.hasDefaultValue()) {\n        if (isRepeated()) {\n          throw new DescriptorValidationException(this,\n            \"Repeated fields cannot have default values.\");\n        }\n\n        try {\n          switch (getType()) {\n            case INT32:\n            case SINT32:\n            case SFIXED32:\n              defaultValue = TextFormat.parseInt32(proto.getDefaultValue());\n              break;\n            case UINT32:\n            case FIXED32:\n              defaultValue = TextFormat.parseUInt32(proto.getDefaultValue());\n              break;\n            case INT64:\n            case SINT64:\n            case SFIXED64:\n              defaultValue = TextFormat.parseInt64(proto.getDefaultValue());\n              break;\n            case UINT64:\n            case FIXED64:\n              defaultValue = TextFormat.parseUInt64(proto.getDefaultValue());\n              break;\n            case FLOAT:\n              if (proto.getDefaultValue().equals(\"inf\")) {\n                defaultValue = Float.POSITIVE_INFINITY;\n              } else if (proto.getDefaultValue().equals(\"-inf\")) {\n                defaultValue = Float.NEGATIVE_INFINITY;\n              } else if (proto.getDefaultValue().equals(\"nan\")) {\n                defaultValue = Float.NaN;\n              } else {\n                defaultValue = Float.valueOf(proto.getDefaultValue());\n              }\n              break;\n            case DOUBLE:\n              if (proto.getDefaultValue().equals(\"inf\")) {\n                defaultValue = Double.POSITIVE_INFINITY;\n              } else if (proto.getDefaultValue().equals(\"-inf\")) {\n                defaultValue = Double.NEGATIVE_INFINITY;\n              } else if (proto.getDefaultValue().equals(\"nan\")) {\n                defaultValue = Double.NaN;\n              } else {\n                defaultValue = Double.valueOf(proto.getDefaultValue());\n              }\n              break;\n            case BOOL:\n              defaultValue = Boolean.valueOf(proto.getDefaultValue());\n              break;\n            case STRING:\n              defaultValue = proto.getDefaultValue();\n              break;\n            case BYTES:\n              try {\n                defaultValue =\n                  TextFormat.unescapeBytes(proto.getDefaultValue());\n              } catch (TextFormat.InvalidEscapeSequenceException e) {\n                throw new DescriptorValidationException(this,\n                  \"Couldn't parse default value: \" + e.getMessage(), e);\n              }\n              break;\n            case ENUM:\n              defaultValue = enumType.findValueByName(proto.getDefaultValue());\n              if (defaultValue == null) {\n                throw new DescriptorValidationException(this,\n                  \"Unknown enum default value: \\\"\" +\n                  proto.getDefaultValue() + '\\\"');\n              }\n              break;\n            case MESSAGE:\n            case GROUP:\n              throw new DescriptorValidationException(this,\n                \"Message type had default value.\");\n          }\n        } catch (NumberFormatException e) {\n          throw new DescriptorValidationException(this, \n              \"Could not parse default value: \\\"\" + \n              proto.getDefaultValue() + '\\\"', e);\n        }\n      } else {\n        // Determine the default default for this field.\n        if (isRepeated()) {\n          defaultValue = Collections.emptyList();\n        } else {\n          switch (getJavaType()) {\n            case ENUM:\n              // We guarantee elsewhere that an enum type always has at least\n              // one possible value.\n              defaultValue = enumType.getValues().get(0);\n              break;\n            case MESSAGE:\n              defaultValue = null;\n              break;\n            default:\n              defaultValue = getJavaType().defaultDefault;\n              break;\n          }\n        }\n      }\n\n      if (!isExtension()) {\n        file.pool.addFieldByNumber(this);\n      }\n\n      if (containingType != null &&\n          containingType.getOptions().getMessageSetWireFormat()) {\n        if (isExtension()) {\n          if (!isOptional() || getType() != Type.MESSAGE) {\n            throw new DescriptorValidationException(this,\n              \"Extensions of MessageSets must be optional messages.\");\n          }\n        } else {\n          throw new DescriptorValidationException(this,\n            \"MessageSets cannot have fields, only extensions.\");\n        }\n      }\n    }\n\n    /** See {@link FileDescriptor#setProto}. */\n    private void setProto(final FieldDescriptorProto proto) {\n      this.proto = proto;\n    }\n\n    /**\n     * For internal use only.  This is to satisfy the FieldDescriptorLite\n     * interface.\n     */\n    public MessageLite.Builder internalMergeFrom(\n        MessageLite.Builder to, MessageLite from) {\n      // FieldDescriptors are only used with non-lite messages so we can just\n      // down-cast and call mergeFrom directly.\n      return ((Message.Builder) to).mergeFrom((Message) from);\n    }\n  }\n\n  // =================================================================\n\n  /** Describes an enum type. */\n  public static final class EnumDescriptor\n      implements GenericDescriptor, Internal.EnumLiteMap<EnumValueDescriptor> {\n    /**\n     * Get the index of this descriptor within its parent.\n     * @see Descriptor#getIndex()\n     */\n    public int getIndex() { return index; }\n\n    /** Convert the descriptor to its protocol message representation. */\n    public EnumDescriptorProto toProto() { return proto; }\n\n    /** Get the type's unqualified name. */\n    public String getName() { return proto.getName(); }\n\n    /**\n     * Get the type's fully-qualified name.\n     * @see Descriptor#getFullName()\n     */\n    public String getFullName() { return fullName; }\n\n    /** Get the {@link FileDescriptor} containing this descriptor. */\n    public FileDescriptor getFile() { return file; }\n\n    /** If this is a nested type, get the outer descriptor, otherwise null. */\n    public Descriptor getContainingType() { return containingType; }\n\n    /** Get the {@code EnumOptions}, defined in {@code descriptor.proto}. */\n    public EnumOptions getOptions() { return proto.getOptions(); }\n\n    /** Get a list of defined values for this enum. */\n    public List<EnumValueDescriptor> getValues() {\n      return Collections.unmodifiableList(Arrays.asList(values));\n    }\n\n    /**\n     * Find an enum value by name.\n     * @param name The unqualified name of the value (e.g. \"FOO\").\n     * @return the value's decsriptor, or {@code null} if not found.\n     */\n    public EnumValueDescriptor findValueByName(final String name) {\n      final GenericDescriptor result =\n          file.pool.findSymbol(fullName + '.' + name);\n      if (result != null && result instanceof EnumValueDescriptor) {\n        return (EnumValueDescriptor)result;\n      } else {\n        return null;\n      }\n    }\n\n    /**\n     * Find an enum value by number.  If multiple enum values have the same\n     * number, this returns the first defined value with that number.\n     * @param number The value's number.\n     * @return the value's decsriptor, or {@code null} if not found.\n     */\n    public EnumValueDescriptor findValueByNumber(final int number) {\n      return file.pool.enumValuesByNumber.get(\n        new DescriptorPool.DescriptorIntPair(this, number));\n    }\n\n    private final int index;\n    private EnumDescriptorProto proto;\n    private final String fullName;\n    private final FileDescriptor file;\n    private final Descriptor containingType;\n    private EnumValueDescriptor[] values;\n\n    private EnumDescriptor(final EnumDescriptorProto proto,\n                           final FileDescriptor file,\n                           final Descriptor parent,\n                           final int index)\n                    throws DescriptorValidationException {\n      this.index = index;\n      this.proto = proto;\n      fullName = computeFullName(file, parent, proto.getName());\n      this.file = file;\n      containingType = parent;\n\n      if (proto.getValueCount() == 0) {\n        // We cannot allow enums with no values because this would mean there\n        // would be no valid default value for fields of this type.\n        throw new DescriptorValidationException(this,\n          \"Enums must contain at least one value.\");\n      }\n\n      values = new EnumValueDescriptor[proto.getValueCount()];\n      for (int i = 0; i < proto.getValueCount(); i++) {\n        values[i] = new EnumValueDescriptor(\n          proto.getValue(i), file, this, i);\n      }\n\n      file.pool.addSymbol(this);\n    }\n\n    /** See {@link FileDescriptor#setProto}. */\n    private void setProto(final EnumDescriptorProto proto) {\n      this.proto = proto;\n\n      for (int i = 0; i < values.length; i++) {\n        values[i].setProto(proto.getValue(i));\n      }\n    }\n  }\n\n  // =================================================================\n\n  /**\n   * Describes one value within an enum type.  Note that multiple defined\n   * values may have the same number.  In generated Java code, all values\n   * with the same number after the first become aliases of the first.\n   * However, they still have independent EnumValueDescriptors.\n   */\n  public static final class EnumValueDescriptor\n      implements GenericDescriptor, Internal.EnumLite {\n    /**\n     * Get the index of this descriptor within its parent.\n     * @see Descriptor#getIndex()\n     */\n    public int getIndex() { return index; }\n\n    /** Convert the descriptor to its protocol message representation. */\n    public EnumValueDescriptorProto toProto() { return proto; }\n\n    /** Get the value's unqualified name. */\n    public String getName() { return proto.getName(); }\n\n    /** Get the value's number. */\n    public int getNumber() { return proto.getNumber(); }\n\n    /**\n     * Get the value's fully-qualified name.\n     * @see Descriptor#getFullName()\n     */\n    public String getFullName() { return fullName; }\n\n    /** Get the {@link FileDescriptor} containing this descriptor. */\n    public FileDescriptor getFile() { return file; }\n\n    /** Get the value's enum type. */\n    public EnumDescriptor getType() { return type; }\n\n    /**\n     * Get the {@code EnumValueOptions}, defined in {@code descriptor.proto}.\n     */\n    public EnumValueOptions getOptions() { return proto.getOptions(); }\n\n    private final int index;\n    private EnumValueDescriptorProto proto;\n    private final String fullName;\n    private final FileDescriptor file;\n    private final EnumDescriptor type;\n\n    private EnumValueDescriptor(final EnumValueDescriptorProto proto,\n                                final FileDescriptor file,\n                                final EnumDescriptor parent,\n                                final int index)\n                         throws DescriptorValidationException {\n      this.index = index;\n      this.proto = proto;\n      this.file = file;\n      type = parent;\n\n      fullName = parent.getFullName() + '.' + proto.getName();\n\n      file.pool.addSymbol(this);\n      file.pool.addEnumValueByNumber(this);\n    }\n\n    /** See {@link FileDescriptor#setProto}. */\n    private void setProto(final EnumValueDescriptorProto proto) {\n      this.proto = proto;\n    }\n  }\n\n  // =================================================================\n\n  /** Describes a service type. */\n  public static final class ServiceDescriptor implements GenericDescriptor {\n    /**\n     * Get the index of this descriptor within its parent.\n     * * @see Descriptors.Descriptor#getIndex()\n     */\n    public int getIndex() { return index; }\n\n    /** Convert the descriptor to its protocol message representation. */\n    public ServiceDescriptorProto toProto() { return proto; }\n\n    /** Get the type's unqualified name. */\n    public String getName() { return proto.getName(); }\n\n    /**\n     * Get the type's fully-qualified name.\n     * @see Descriptor#getFullName()\n     */\n    public String getFullName() { return fullName; }\n\n    /** Get the {@link FileDescriptor} containing this descriptor. */\n    public FileDescriptor getFile() { return file; }\n\n    /** Get the {@code ServiceOptions}, defined in {@code descriptor.proto}. */\n    public ServiceOptions getOptions() { return proto.getOptions(); }\n\n    /** Get a list of methods for this service. */\n    public List<MethodDescriptor> getMethods() {\n      return Collections.unmodifiableList(Arrays.asList(methods));\n    }\n\n    /**\n     * Find a method by name.\n     * @param name The unqualified name of the method (e.g. \"Foo\").\n     * @return the method's decsriptor, or {@code null} if not found.\n     */\n    public MethodDescriptor findMethodByName(final String name) {\n      final GenericDescriptor result =\n          file.pool.findSymbol(fullName + '.' + name);\n      if (result != null && result instanceof MethodDescriptor) {\n        return (MethodDescriptor)result;\n      } else {\n        return null;\n      }\n    }\n\n    private final int index;\n    private ServiceDescriptorProto proto;\n    private final String fullName;\n    private final FileDescriptor file;\n    private MethodDescriptor[] methods;\n\n    private ServiceDescriptor(final ServiceDescriptorProto proto,\n                              final FileDescriptor file,\n                              final int index)\n                       throws DescriptorValidationException {\n      this.index = index;\n      this.proto = proto;\n      fullName = computeFullName(file, null, proto.getName());\n      this.file = file;\n\n      methods = new MethodDescriptor[proto.getMethodCount()];\n      for (int i = 0; i < proto.getMethodCount(); i++) {\n        methods[i] = new MethodDescriptor(\n          proto.getMethod(i), file, this, i);\n      }\n\n      file.pool.addSymbol(this);\n    }\n\n    private void crossLink() throws DescriptorValidationException {\n      for (final MethodDescriptor method : methods) {\n        method.crossLink();\n      }\n    }\n\n    /** See {@link FileDescriptor#setProto}. */\n    private void setProto(final ServiceDescriptorProto proto) {\n      this.proto = proto;\n\n      for (int i = 0; i < methods.length; i++) {\n        methods[i].setProto(proto.getMethod(i));\n      }\n    }\n  }\n\n  // =================================================================\n\n  /**\n   * Describes one method within a service type.\n   */\n  public static final class MethodDescriptor implements GenericDescriptor {\n    /**\n     * Get the index of this descriptor within its parent.\n     * * @see Descriptors.Descriptor#getIndex()\n     */\n    public int getIndex() { return index; }\n\n    /** Convert the descriptor to its protocol message representation. */\n    public MethodDescriptorProto toProto() { return proto; }\n\n    /** Get the method's unqualified name. */\n    public String getName() { return proto.getName(); }\n\n    /**\n     * Get the method's fully-qualified name.\n     * @see Descriptor#getFullName()\n     */\n    public String getFullName() { return fullName; }\n\n    /** Get the {@link FileDescriptor} containing this descriptor. */\n    public FileDescriptor getFile() { return file; }\n\n    /** Get the method's service type. */\n    public ServiceDescriptor getService() { return service; }\n\n    /** Get the method's input type. */\n    public Descriptor getInputType() { return inputType; }\n\n    /** Get the method's output type. */\n    public Descriptor getOutputType() { return outputType; }\n\n    /**\n     * Get the {@code MethodOptions}, defined in {@code descriptor.proto}.\n     */\n    public MethodOptions getOptions() { return proto.getOptions(); }\n\n    private final int index;\n    private MethodDescriptorProto proto;\n    private final String fullName;\n    private final FileDescriptor file;\n    private final ServiceDescriptor service;\n\n    // Initialized during cross-linking.\n    private Descriptor inputType;\n    private Descriptor outputType;\n\n    private MethodDescriptor(final MethodDescriptorProto proto,\n                             final FileDescriptor file,\n                             final ServiceDescriptor parent,\n                             final int index)\n                      throws DescriptorValidationException {\n      this.index = index;\n      this.proto = proto;\n      this.file = file;\n      service = parent;\n\n      fullName = parent.getFullName() + '.' + proto.getName();\n\n      file.pool.addSymbol(this);\n    }\n\n    private void crossLink() throws DescriptorValidationException {\n      final GenericDescriptor input =\n        file.pool.lookupSymbol(proto.getInputType(), this);\n      if (!(input instanceof Descriptor)) {\n        throw new DescriptorValidationException(this,\n            '\\\"' + proto.getInputType() + \"\\\" is not a message type.\");\n      }\n      inputType = (Descriptor)input;\n\n      final GenericDescriptor output =\n        file.pool.lookupSymbol(proto.getOutputType(), this);\n      if (!(output instanceof Descriptor)) {\n        throw new DescriptorValidationException(this,\n            '\\\"' + proto.getOutputType() + \"\\\" is not a message type.\");\n      }\n      outputType = (Descriptor)output;\n    }\n\n    /** See {@link FileDescriptor#setProto}. */\n    private void setProto(final MethodDescriptorProto proto) {\n      this.proto = proto;\n    }\n  }\n\n  // =================================================================\n\n  private static String computeFullName(final FileDescriptor file,\n                                        final Descriptor parent,\n                                        final String name) {\n    if (parent != null) {\n      return parent.getFullName() + '.' + name;\n    } else if (file.getPackage().length() > 0) {\n      return file.getPackage() + '.' + name;\n    } else {\n      return name;\n    }\n  }\n\n  // =================================================================\n\n  /**\n   * All descriptors except {@code FileDescriptor} implement this to make\n   * {@code DescriptorPool}'s life easier.\n   */\n  private interface GenericDescriptor {\n    Message toProto();\n    String getName();\n    String getFullName();\n    FileDescriptor getFile();\n  }\n\n  /**\n   * Thrown when building descriptors fails because the source DescriptorProtos\n   * are not valid.\n   */\n  public static class DescriptorValidationException extends Exception {\n    private static final long serialVersionUID = 5750205775490483148L;\n\n    /** Gets the full name of the descriptor where the error occurred. */\n    public String getProblemSymbolName() { return name; }\n\n    /**\n     * Gets the the protocol message representation of the invalid descriptor.\n     */\n    public Message getProblemProto() { return proto; }\n\n    /**\n     * Gets a human-readable description of the error.\n     */\n    public String getDescription() { return description; }\n\n    private final String name;\n    private final Message proto;\n    private final String description;\n\n    private DescriptorValidationException(\n        final GenericDescriptor problemDescriptor,\n        final String description) {\n      super(problemDescriptor.getFullName() + \": \" + description);\n\n      // Note that problemDescriptor may be partially uninitialized, so we\n      // don't want to expose it directly to the user.  So, we only provide\n      // the name and the original proto.\n      name = problemDescriptor.getFullName();\n      proto = problemDescriptor.toProto();\n      this.description = description;\n    }\n\n    private DescriptorValidationException(\n        final GenericDescriptor problemDescriptor,\n        final String description,\n        final Throwable cause) {\n      this(problemDescriptor, description);\n      initCause(cause);\n    }\n\n    private DescriptorValidationException(\n        final FileDescriptor problemDescriptor,\n        final String description) {\n      super(problemDescriptor.getName() + \": \" + description);\n\n      // Note that problemDescriptor may be partially uninitialized, so we\n      // don't want to expose it directly to the user.  So, we only provide\n      // the name and the original proto.\n      name = problemDescriptor.getName();\n      proto = problemDescriptor.toProto();\n      this.description = description;\n    }\n  }\n\n  // =================================================================\n\n  /**\n   * A private helper class which contains lookup tables containing all the\n   * descriptors defined in a particular file.\n   */\n  private static final class DescriptorPool {\n    DescriptorPool(final FileDescriptor[] dependencies) {\n      this.dependencies = new DescriptorPool[dependencies.length];\n\n      for (int i = 0; i < dependencies.length; i++)  {\n        this.dependencies[i] = dependencies[i].pool;\n      }\n\n      for (final FileDescriptor dependency : dependencies) {\n        try {\n          addPackage(dependency.getPackage(), dependency);\n        } catch (DescriptorValidationException e) {\n          // Can't happen, because addPackage() only fails when the name\n          // conflicts with a non-package, but we have not yet added any\n          // non-packages at this point.\n          assert false;\n        }\n      }\n    }\n\n    private final DescriptorPool[] dependencies;\n\n    private final Map<String, GenericDescriptor> descriptorsByName =\n      new HashMap<String, GenericDescriptor>();\n    private final Map<DescriptorIntPair, FieldDescriptor> fieldsByNumber =\n      new HashMap<DescriptorIntPair, FieldDescriptor>();\n    private final Map<DescriptorIntPair, EnumValueDescriptor> enumValuesByNumber\n        = new HashMap<DescriptorIntPair, EnumValueDescriptor>();\n\n    /** Find a generic descriptor by fully-qualified name. */\n    GenericDescriptor findSymbol(final String fullName) {\n      GenericDescriptor result = descriptorsByName.get(fullName);\n      if (result != null) {\n        return result;\n      }\n\n      for (final DescriptorPool dependency : dependencies) {\n        result = dependency.descriptorsByName.get(fullName);\n        if (result != null) {\n          return result;\n        }\n      }\n\n      return null;\n    }\n\n    /**\n     * Look up a descriptor by name, relative to some other descriptor.\n     * The name may be fully-qualified (with a leading '.'),\n     * partially-qualified, or unqualified.  C++-like name lookup semantics\n     * are used to search for the matching descriptor.\n     */\n    GenericDescriptor lookupSymbol(final String name,\n                                   final GenericDescriptor relativeTo)\n                            throws DescriptorValidationException {\n      // TODO(kenton):  This could be optimized in a number of ways.\n\n      GenericDescriptor result;\n      if (name.startsWith(\".\")) {\n        // Fully-qualified name.\n        result = findSymbol(name.substring(1));\n      } else {\n        // If \"name\" is a compound identifier, we want to search for the\n        // first component of it, then search within it for the rest.\n        final int firstPartLength = name.indexOf('.');\n        final String firstPart;\n        if (firstPartLength == -1) {\n          firstPart = name;\n        } else {\n          firstPart = name.substring(0, firstPartLength);\n        }\n\n        // We will search each parent scope of \"relativeTo\" looking for the\n        // symbol.\n        final StringBuilder scopeToTry =\n            new StringBuilder(relativeTo.getFullName());\n\n        while (true) {\n          // Chop off the last component of the scope.\n          final int dotpos = scopeToTry.lastIndexOf(\".\");\n          if (dotpos == -1) {\n            result = findSymbol(name);\n            break;\n          } else {\n            scopeToTry.setLength(dotpos + 1);\n\n            // Append firstPart and try to find.\n            scopeToTry.append(firstPart);\n            result = findSymbol(scopeToTry.toString());\n\n            if (result != null) {\n              if (firstPartLength != -1) {\n                // We only found the first part of the symbol.  Now look for\n                // the whole thing.  If this fails, we *don't* want to keep\n                // searching parent scopes.\n                scopeToTry.setLength(dotpos + 1);\n                scopeToTry.append(name);\n                result = findSymbol(scopeToTry.toString());\n              }\n              break;\n            }\n\n            // Not found.  Remove the name so we can try again.\n            scopeToTry.setLength(dotpos);\n          }\n        }\n      }\n\n      if (result == null) {\n        throw new DescriptorValidationException(relativeTo,\n            '\\\"' + name + \"\\\" is not defined.\");\n      } else {\n        return result;\n      }\n    }\n\n    /**\n     * Adds a symbol to the symbol table.  If a symbol with the same name\n     * already exists, throws an error.\n     */\n    void addSymbol(final GenericDescriptor descriptor)\n            throws DescriptorValidationException {\n      validateSymbolName(descriptor);\n\n      final String fullName = descriptor.getFullName();\n      final int dotpos = fullName.lastIndexOf('.');\n\n      final GenericDescriptor old = descriptorsByName.put(fullName, descriptor);\n      if (old != null) {\n        descriptorsByName.put(fullName, old);\n\n        if (descriptor.getFile() == old.getFile()) {\n          if (dotpos == -1) {\n            throw new DescriptorValidationException(descriptor,\n                '\\\"' + fullName + \"\\\" is already defined.\");\n          } else {\n            throw new DescriptorValidationException(descriptor,\n                '\\\"' + fullName.substring(dotpos + 1) +\n              \"\\\" is already defined in \\\"\" +\n              fullName.substring(0, dotpos) + \"\\\".\");\n          }\n        } else {\n          throw new DescriptorValidationException(descriptor,\n              '\\\"' + fullName + \"\\\" is already defined in file \\\"\" +\n            old.getFile().getName() + \"\\\".\");\n        }\n      }\n    }\n\n    /**\n     * Represents a package in the symbol table.  We use PackageDescriptors\n     * just as placeholders so that someone cannot define, say, a message type\n     * that has the same name as an existing package.\n     */\n    private static final class PackageDescriptor implements GenericDescriptor {\n      public Message toProto()        { return file.toProto(); }\n      public String getName()         { return name;           }\n      public String getFullName()     { return fullName;       }\n      public FileDescriptor getFile() { return file;           }\n\n      PackageDescriptor(final String name, final String fullName,\n                        final FileDescriptor file) {\n        this.file = file;\n        this.fullName = fullName;\n        this.name = name;\n      }\n\n      private final String name;\n      private final String fullName;\n      private final FileDescriptor file;\n    }\n\n    /**\n     * Adds a package to the symbol tables.  If a package by the same name\n     * already exists, that is fine, but if some other kind of symbol exists\n     * under the same name, an exception is thrown.  If the package has\n     * multiple components, this also adds the parent package(s).\n     */\n    void addPackage(final String fullName, final FileDescriptor file)\n             throws DescriptorValidationException {\n      final int dotpos = fullName.lastIndexOf('.');\n      final String name;\n      if (dotpos == -1) {\n        name = fullName;\n      } else {\n        addPackage(fullName.substring(0, dotpos), file);\n        name = fullName.substring(dotpos + 1);\n      }\n\n      final GenericDescriptor old =\n        descriptorsByName.put(fullName,\n          new PackageDescriptor(name, fullName, file));\n      if (old != null) {\n        descriptorsByName.put(fullName, old);\n        if (!(old instanceof PackageDescriptor)) {\n          throw new DescriptorValidationException(file,\n              '\\\"' + name + \"\\\" is already defined (as something other than a \"\n              + \"package) in file \\\"\" + old.getFile().getName() + \"\\\".\");\n        }\n      }\n    }\n\n    /** A (GenericDescriptor, int) pair, used as a map key. */\n    private static final class DescriptorIntPair {\n      private final GenericDescriptor descriptor;\n      private final int number;\n\n      DescriptorIntPair(final GenericDescriptor descriptor, final int number) {\n        this.descriptor = descriptor;\n        this.number = number;\n      }\n\n      @Override\n      public int hashCode() {\n        return descriptor.hashCode() * ((1 << 16) - 1) + number;\n      }\n      @Override\n      public boolean equals(final Object obj) {\n        if (!(obj instanceof DescriptorIntPair)) {\n          return false;\n        }\n        final DescriptorIntPair other = (DescriptorIntPair)obj;\n        return descriptor == other.descriptor && number == other.number;\n      }\n    }\n\n    /**\n     * Adds a field to the fieldsByNumber table.  Throws an exception if a\n     * field with hte same containing type and number already exists.\n     */\n    void addFieldByNumber(final FieldDescriptor field)\n                   throws DescriptorValidationException {\n      final DescriptorIntPair key =\n        new DescriptorIntPair(field.getContainingType(), field.getNumber());\n      final FieldDescriptor old = fieldsByNumber.put(key, field);\n      if (old != null) {\n        fieldsByNumber.put(key, old);\n        throw new DescriptorValidationException(field,\n          \"Field number \" + field.getNumber() +\n          \"has already been used in \\\"\" +\n          field.getContainingType().getFullName() +\n          \"\\\" by field \\\"\" + old.getName() + \"\\\".\");\n      }\n    }\n\n    /**\n     * Adds an enum value to the enumValuesByNumber table.  If an enum value\n     * with the same type and number already exists, does nothing.  (This is\n     * allowed; the first value define with the number takes precedence.)\n     */\n    void addEnumValueByNumber(final EnumValueDescriptor value) {\n      final DescriptorIntPair key =\n        new DescriptorIntPair(value.getType(), value.getNumber());\n      final EnumValueDescriptor old = enumValuesByNumber.put(key, value);\n      if (old != null) {\n        enumValuesByNumber.put(key, old);\n        // Not an error:  Multiple enum values may have the same number, but\n        // we only want the first one in the map.\n      }\n    }\n\n    /**\n     * Verifies that the descriptor's name is valid (i.e. it contains only\n     * letters, digits, and underscores, and does not start with a digit).\n     */\n    static void validateSymbolName(final GenericDescriptor descriptor)\n                                   throws DescriptorValidationException {\n      final String name = descriptor.getName();\n      if (name.length() == 0) {\n        throw new DescriptorValidationException(descriptor, \"Missing name.\");\n      } else {\n        boolean valid = true;\n        for (int i = 0; i < name.length(); i++) {\n          final char c = name.charAt(i);\n          // Non-ASCII characters are not valid in protobuf identifiers, even\n          // if they are letters or digits.\n          if (c >= 128) {\n            valid = false;\n          }\n          // First character must be letter or _.  Subsequent characters may\n          // be letters, numbers, or digits.\n          if (Character.isLetter(c) || c == '_' ||\n              (Character.isDigit(c) && i > 0)) {\n            // Valid\n          } else {\n            valid = false;\n          }\n        }\n        if (!valid) {\n          throw new DescriptorValidationException(descriptor,\n              '\\\"' + name + \"\\\" is not a valid identifier.\");\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport com.google.protobuf.Descriptors.Descriptor;\nimport com.google.protobuf.Descriptors.FieldDescriptor;\n\nimport java.io.InputStream;\nimport java.io.IOException;\nimport java.util.Map;\n\n/**\n * An implementation of {@link Message} that can represent arbitrary types,\n * given a {@link Descriptors.Descriptor}.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic final class DynamicMessage extends AbstractMessage {\n  private final Descriptor type;\n  private final FieldSet<FieldDescriptor> fields;\n  private final UnknownFieldSet unknownFields;\n  private int memoizedSize = -1;\n\n  /**\n   * Construct a {@code DynamicMessage} using the given {@code FieldSet}.\n   */\n  private DynamicMessage(Descriptor type, FieldSet<FieldDescriptor> fields,\n                         UnknownFieldSet unknownFields) {\n    this.type = type;\n    this.fields = fields;\n    this.unknownFields = unknownFields;\n  }\n\n  /**\n   * Get a {@code DynamicMessage} representing the default instance of the\n   * given type.\n   */\n  public static DynamicMessage getDefaultInstance(Descriptor type) {\n    return new DynamicMessage(type, FieldSet.<FieldDescriptor>emptySet(),\n                              UnknownFieldSet.getDefaultInstance());\n  }\n\n  /** Parse a message of the given type from the given input stream. */\n  public static DynamicMessage parseFrom(Descriptor type,\n                                         CodedInputStream input)\n                                         throws IOException {\n    return newBuilder(type).mergeFrom(input).buildParsed();\n  }\n\n  /** Parse a message of the given type from the given input stream. */\n  public static DynamicMessage parseFrom(\n      Descriptor type,\n      CodedInputStream input,\n      ExtensionRegistry extensionRegistry)\n      throws IOException {\n    return newBuilder(type).mergeFrom(input, extensionRegistry).buildParsed();\n  }\n\n  /** Parse {@code data} as a message of the given type and return it. */\n  public static DynamicMessage parseFrom(Descriptor type, ByteString data)\n                                         throws InvalidProtocolBufferException {\n    return newBuilder(type).mergeFrom(data).buildParsed();\n  }\n\n  /** Parse {@code data} as a message of the given type and return it. */\n  public static DynamicMessage parseFrom(Descriptor type, ByteString data,\n                                         ExtensionRegistry extensionRegistry)\n                                         throws InvalidProtocolBufferException {\n    return newBuilder(type).mergeFrom(data, extensionRegistry).buildParsed();\n  }\n\n  /** Parse {@code data} as a message of the given type and return it. */\n  public static DynamicMessage parseFrom(Descriptor type, byte[] data)\n                                         throws InvalidProtocolBufferException {\n    return newBuilder(type).mergeFrom(data).buildParsed();\n  }\n\n  /** Parse {@code data} as a message of the given type and return it. */\n  public static DynamicMessage parseFrom(Descriptor type, byte[] data,\n                                         ExtensionRegistry extensionRegistry)\n                                         throws InvalidProtocolBufferException {\n    return newBuilder(type).mergeFrom(data, extensionRegistry).buildParsed();\n  }\n\n  /** Parse a message of the given type from {@code input} and return it. */\n  public static DynamicMessage parseFrom(Descriptor type, InputStream input)\n                                         throws IOException {\n    return newBuilder(type).mergeFrom(input).buildParsed();\n  }\n\n  /** Parse a message of the given type from {@code input} and return it. */\n  public static DynamicMessage parseFrom(Descriptor type, InputStream input,\n                                         ExtensionRegistry extensionRegistry)\n                                         throws IOException {\n    return newBuilder(type).mergeFrom(input, extensionRegistry).buildParsed();\n  }\n\n  /** Construct a {@link Message.Builder} for the given type. */\n  public static Builder newBuilder(Descriptor type) {\n    return new Builder(type);\n  }\n\n  /**\n   * Construct a {@link Message.Builder} for a message of the same type as\n   * {@code prototype}, and initialize it with {@code prototype}'s contents.\n   */\n  public static Builder newBuilder(Message prototype) {\n    return new Builder(prototype.getDescriptorForType()).mergeFrom(prototype);\n  }\n\n  // -----------------------------------------------------------------\n  // Implementation of Message interface.\n\n  public Descriptor getDescriptorForType() {\n    return type;\n  }\n\n  public DynamicMessage getDefaultInstanceForType() {\n    return getDefaultInstance(type);\n  }\n\n  public Map<FieldDescriptor, Object> getAllFields() {\n    return fields.getAllFields();\n  }\n\n  public boolean hasField(FieldDescriptor field) {\n    verifyContainingType(field);\n    return fields.hasField(field);\n  }\n\n  public Object getField(FieldDescriptor field) {\n    verifyContainingType(field);\n    Object result = fields.getField(field);\n    if (result == null) {\n      if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n        result = getDefaultInstance(field.getMessageType());\n      } else {\n        result = field.getDefaultValue();\n      }\n    }\n    return result;\n  }\n\n  public int getRepeatedFieldCount(FieldDescriptor field) {\n    verifyContainingType(field);\n    return fields.getRepeatedFieldCount(field);\n  }\n\n  public Object getRepeatedField(FieldDescriptor field, int index) {\n    verifyContainingType(field);\n    return fields.getRepeatedField(field, index);\n  }\n\n  public UnknownFieldSet getUnknownFields() {\n    return unknownFields;\n  }\n\n  private static boolean isInitialized(Descriptor type,\n                                       FieldSet<FieldDescriptor> fields) {\n    // Check that all required fields are present.\n    for (final FieldDescriptor field : type.getFields()) {\n      if (field.isRequired()) {\n        if (!fields.hasField(field)) {\n          return false;\n        }\n      }\n    }\n\n    // Check that embedded messages are initialized.\n    return fields.isInitialized();\n  }\n\n  public boolean isInitialized() {\n    return isInitialized(type, fields);\n  }\n\n  public void writeTo(CodedOutputStream output) throws IOException {\n    if (type.getOptions().getMessageSetWireFormat()) {\n      fields.writeMessageSetTo(output);\n      unknownFields.writeAsMessageSetTo(output);\n    } else {\n      fields.writeTo(output);\n      unknownFields.writeTo(output);\n    }\n  }\n\n  public int getSerializedSize() {\n    int size = memoizedSize;\n    if (size != -1) return size;\n\n    if (type.getOptions().getMessageSetWireFormat()) {\n      size = fields.getMessageSetSerializedSize();\n      size += unknownFields.getSerializedSizeAsMessageSet();\n    } else {\n      size = fields.getSerializedSize();\n      size += unknownFields.getSerializedSize();\n    }\n\n    memoizedSize = size;\n    return size;\n  }\n\n  public Builder newBuilderForType() {\n    return new Builder(type);\n  }\n\n  public Builder toBuilder() {\n    return newBuilderForType().mergeFrom(this);\n  }\n\n  /** Verifies that the field is a field of this message. */\n  private void verifyContainingType(FieldDescriptor field) {\n    if (field.getContainingType() != type) {\n      throw new IllegalArgumentException(\n        \"FieldDescriptor does not match message type.\");\n    }\n  }\n\n  // =================================================================\n\n  /**\n   * Builder for {@link DynamicMessage}s.\n   */\n  public static final class Builder extends AbstractMessage.Builder<Builder> {\n    private final Descriptor type;\n    private FieldSet<FieldDescriptor> fields;\n    private UnknownFieldSet unknownFields;\n\n    /** Construct a {@code Builder} for the given type. */\n    private Builder(Descriptor type) {\n      this.type = type;\n      this.fields = FieldSet.newFieldSet();\n      this.unknownFields = UnknownFieldSet.getDefaultInstance();\n    }\n\n    // ---------------------------------------------------------------\n    // Implementation of Message.Builder interface.\n\n    public Builder clear() {\n      if (fields == null) {\n        throw new IllegalStateException(\"Cannot call clear() after build().\");\n      }\n      fields.clear();\n      return this;\n    }\n\n    public Builder mergeFrom(Message other) {\n      if (other instanceof DynamicMessage) {\n        // This should be somewhat faster than calling super.mergeFrom().\n        DynamicMessage otherDynamicMessage = (DynamicMessage) other;\n        if (otherDynamicMessage.type != type) {\n          throw new IllegalArgumentException(\n            \"mergeFrom(Message) can only merge messages of the same type.\");\n        }\n        fields.mergeFrom(otherDynamicMessage.fields);\n        mergeUnknownFields(otherDynamicMessage.unknownFields);\n        return this;\n      } else {\n        return super.mergeFrom(other);\n      }\n    }\n\n    public DynamicMessage build() {\n      // If fields == null, we'll throw an appropriate exception later.\n      if (fields != null && !isInitialized()) {\n        throw newUninitializedMessageException(\n          new DynamicMessage(type, fields, unknownFields));\n      }\n      return buildPartial();\n    }\n\n    /**\n     * Helper for DynamicMessage.parseFrom() methods to call.  Throws\n     * {@link InvalidProtocolBufferException} instead of\n     * {@link UninitializedMessageException}.\n     */\n    private DynamicMessage buildParsed() throws InvalidProtocolBufferException {\n      if (!isInitialized()) {\n        throw newUninitializedMessageException(\n            new DynamicMessage(type, fields, unknownFields))\n          .asInvalidProtocolBufferException();\n      }\n      return buildPartial();\n    }\n\n    public DynamicMessage buildPartial() {\n      if (fields == null) {\n        throw new IllegalStateException(\n            \"build() has already been called on this Builder.\");\n      }\n      fields.makeImmutable();\n      DynamicMessage result =\n        new DynamicMessage(type, fields, unknownFields);\n      fields = null;\n      unknownFields = null;\n      return result;\n    }\n\n    public Builder clone() {\n      Builder result = new Builder(type);\n      result.fields.mergeFrom(fields);\n      return result;\n    }\n\n    public boolean isInitialized() {\n      return DynamicMessage.isInitialized(type, fields);\n    }\n\n    public Descriptor getDescriptorForType() {\n      return type;\n    }\n\n    public DynamicMessage getDefaultInstanceForType() {\n      return getDefaultInstance(type);\n    }\n\n    public Map<FieldDescriptor, Object> getAllFields() {\n      return fields.getAllFields();\n    }\n\n    public Builder newBuilderForField(FieldDescriptor field) {\n      verifyContainingType(field);\n\n      if (field.getJavaType() != FieldDescriptor.JavaType.MESSAGE) {\n        throw new IllegalArgumentException(\n          \"newBuilderForField is only valid for fields with message type.\");\n      }\n\n      return new Builder(field.getMessageType());\n    }\n\n    public boolean hasField(FieldDescriptor field) {\n      verifyContainingType(field);\n      return fields.hasField(field);\n    }\n\n    public Object getField(FieldDescriptor field) {\n      verifyContainingType(field);\n      Object result = fields.getField(field);\n      if (result == null) {\n        if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n          result = getDefaultInstance(field.getMessageType());\n        } else {\n          result = field.getDefaultValue();\n        }\n      }\n      return result;\n    }\n\n    public Builder setField(FieldDescriptor field, Object value) {\n      verifyContainingType(field);\n      fields.setField(field, value);\n      return this;\n    }\n\n    public Builder clearField(FieldDescriptor field) {\n      verifyContainingType(field);\n      fields.clearField(field);\n      return this;\n    }\n\n    public int getRepeatedFieldCount(FieldDescriptor field) {\n      verifyContainingType(field);\n      return fields.getRepeatedFieldCount(field);\n    }\n\n    public Object getRepeatedField(FieldDescriptor field, int index) {\n      verifyContainingType(field);\n      return fields.getRepeatedField(field, index);\n    }\n\n    public Builder setRepeatedField(FieldDescriptor field,\n                                    int index, Object value) {\n      verifyContainingType(field);\n      fields.setRepeatedField(field, index, value);\n      return this;\n    }\n\n    public Builder addRepeatedField(FieldDescriptor field, Object value) {\n      verifyContainingType(field);\n      fields.addRepeatedField(field, value);\n      return this;\n    }\n\n    public UnknownFieldSet getUnknownFields() {\n      return unknownFields;\n    }\n\n    public Builder setUnknownFields(UnknownFieldSet unknownFields) {\n      this.unknownFields = unknownFields;\n      return this;\n    }\n\n    public Builder mergeUnknownFields(UnknownFieldSet unknownFields) {\n      this.unknownFields =\n        UnknownFieldSet.newBuilder(this.unknownFields)\n                       .mergeFrom(unknownFields)\n                       .build();\n      return this;\n    }\n\n    /** Verifies that the field is a field of this message. */\n    private void verifyContainingType(FieldDescriptor field) {\n      if (field.getContainingType() != type) {\n        throw new IllegalArgumentException(\n          \"FieldDescriptor does not match message type.\");\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport com.google.protobuf.Descriptors.Descriptor;\nimport com.google.protobuf.Descriptors.FieldDescriptor;\n\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * A table of known extensions, searchable by name or field number.  When\n * parsing a protocol message that might have extensions, you must provide\n * an {@code ExtensionRegistry} in which you have registered any extensions\n * that you want to be able to parse.  Otherwise, those extensions will just\n * be treated like unknown fields.\n *\n * <p>For example, if you had the {@code .proto} file:\n *\n * <pre>\n * option java_class = \"MyProto\";\n *\n * message Foo {\n *   extensions 1000 to max;\n * }\n *\n * extend Foo {\n *   optional int32 bar;\n * }\n * </pre>\n *\n * Then you might write code like:\n *\n * <pre>\n * ExtensionRegistry registry = ExtensionRegistry.newInstance();\n * registry.add(MyProto.bar);\n * MyProto.Foo message = MyProto.Foo.parseFrom(input, registry);\n * </pre>\n *\n * <p>Background:\n *\n * <p>You might wonder why this is necessary.  Two alternatives might come to\n * mind.  First, you might imagine a system where generated extensions are\n * automatically registered when their containing classes are loaded.  This\n * is a popular technique, but is bad design; among other things, it creates a\n * situation where behavior can change depending on what classes happen to be\n * loaded.  It also introduces a security vulnerability, because an\n * unprivileged class could cause its code to be called unexpectedly from a\n * privileged class by registering itself as an extension of the right type.\n *\n * <p>Another option you might consider is lazy parsing: do not parse an\n * extension until it is first requested, at which point the caller must\n * provide a type to use.  This introduces a different set of problems.  First,\n * it would require a mutex lock any time an extension was accessed, which\n * would be slow.  Second, corrupt data would not be detected until first\n * access, at which point it would be much harder to deal with it.  Third, it\n * could violate the expectation that message objects are immutable, since the\n * type provided could be any arbitrary message class.  An unprivileged user\n * could take advantage of this to inject a mutable object into a message\n * belonging to privileged code and create mischief.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic final class ExtensionRegistry extends ExtensionRegistryLite {\n  /** Construct a new, empty instance. */\n  public static ExtensionRegistry newInstance() {\n    return new ExtensionRegistry();\n  }\n\n  /** Get the unmodifiable singleton empty instance. */\n  public static ExtensionRegistry getEmptyRegistry() {\n    return EMPTY;\n  }\n\n  /** Returns an unmodifiable view of the registry. */\n  @Override\n  public ExtensionRegistry getUnmodifiable() {\n    return new ExtensionRegistry(this);\n  }\n\n  /** A (Descriptor, Message) pair, returned by lookup methods. */\n  public static final class ExtensionInfo {\n    /** The extension's descriptor. */\n    public final FieldDescriptor descriptor;\n\n    /**\n     * A default instance of the extension's type, if it has a message type.\n     * Otherwise, {@code null}.\n     */\n    public final Message defaultInstance;\n\n    private ExtensionInfo(final FieldDescriptor descriptor) {\n      this.descriptor = descriptor;\n      defaultInstance = null;\n    }\n    private ExtensionInfo(final FieldDescriptor descriptor,\n                          final Message defaultInstance) {\n      this.descriptor = descriptor;\n      this.defaultInstance = defaultInstance;\n    }\n  }\n\n  /**\n   * Find an extension by fully-qualified field name, in the proto namespace.\n   * I.e. {@code result.descriptor.fullName()} will match {@code fullName} if\n   * a match is found.\n   *\n   * @return Information about the extension if found, or {@code null}\n   *         otherwise.\n   */\n  public ExtensionInfo findExtensionByName(final String fullName) {\n    return extensionsByName.get(fullName);\n  }\n\n  /**\n   * Find an extension by containing type and field number.\n   *\n   * @return Information about the extension if found, or {@code null}\n   *         otherwise.\n   */\n  public ExtensionInfo findExtensionByNumber(final Descriptor containingType,\n                                             final int fieldNumber) {\n    return extensionsByNumber.get(\n      new DescriptorIntPair(containingType, fieldNumber));\n  }\n\n  /** Add an extension from a generated file to the registry. */\n  public void add(final GeneratedMessage.GeneratedExtension<?, ?> extension) {\n    if (extension.getDescriptor().getJavaType() ==\n        FieldDescriptor.JavaType.MESSAGE) {\n      if (extension.getMessageDefaultInstance() == null) {\n        throw new IllegalStateException(\n            \"Registered message-type extension had null default instance: \" +\n            extension.getDescriptor().getFullName());\n      }\n      add(new ExtensionInfo(extension.getDescriptor(),\n                            extension.getMessageDefaultInstance()));\n    } else {\n      add(new ExtensionInfo(extension.getDescriptor(), null));\n    }\n  }\n\n  /** Add a non-message-type extension to the registry by descriptor. */\n  public void add(final FieldDescriptor type) {\n    if (type.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n      throw new IllegalArgumentException(\n        \"ExtensionRegistry.add() must be provided a default instance when \" +\n        \"adding an embedded message extension.\");\n    }\n    add(new ExtensionInfo(type, null));\n  }\n\n  /** Add a message-type extension to the registry by descriptor. */\n  public void add(final FieldDescriptor type, final Message defaultInstance) {\n    if (type.getJavaType() != FieldDescriptor.JavaType.MESSAGE) {\n      throw new IllegalArgumentException(\n        \"ExtensionRegistry.add() provided a default instance for a \" +\n        \"non-message extension.\");\n    }\n    add(new ExtensionInfo(type, defaultInstance));\n  }\n\n  // =================================================================\n  // Private stuff.\n\n  private ExtensionRegistry() {\n    this.extensionsByName = new HashMap<String, ExtensionInfo>();\n    this.extensionsByNumber = new HashMap<DescriptorIntPair, ExtensionInfo>();\n  }\n\n  private ExtensionRegistry(ExtensionRegistry other) {\n    super(other);\n    this.extensionsByName = Collections.unmodifiableMap(other.extensionsByName);\n    this.extensionsByNumber =\n        Collections.unmodifiableMap(other.extensionsByNumber);\n  }\n\n  private final Map<String, ExtensionInfo> extensionsByName;\n  private final Map<DescriptorIntPair, ExtensionInfo> extensionsByNumber;\n\n  private ExtensionRegistry(boolean empty) {\n    super(ExtensionRegistryLite.getEmptyRegistry());\n    this.extensionsByName = Collections.<String, ExtensionInfo>emptyMap();\n    this.extensionsByNumber =\n        Collections.<DescriptorIntPair, ExtensionInfo>emptyMap();\n  }\n  private static final ExtensionRegistry EMPTY = new ExtensionRegistry(true);\n\n  private void add(final ExtensionInfo extension) {\n    if (!extension.descriptor.isExtension()) {\n      throw new IllegalArgumentException(\n        \"ExtensionRegistry.add() was given a FieldDescriptor for a regular \" +\n        \"(non-extension) field.\");\n    }\n\n    extensionsByName.put(extension.descriptor.getFullName(), extension);\n    extensionsByNumber.put(\n      new DescriptorIntPair(extension.descriptor.getContainingType(),\n                            extension.descriptor.getNumber()),\n      extension);\n\n    final FieldDescriptor field = extension.descriptor;\n    if (field.getContainingType().getOptions().getMessageSetWireFormat() &&\n        field.getType() == FieldDescriptor.Type.MESSAGE &&\n        field.isOptional() &&\n        field.getExtensionScope() == field.getMessageType()) {\n      // This is an extension of a MessageSet type defined within the extension\n      // type's own scope.  For backwards-compatibility, allow it to be looked\n      // up by type name.\n      extensionsByName.put(field.getMessageType().getFullName(), extension);\n    }\n  }\n\n  /** A (GenericDescriptor, int) pair, used as a map key. */\n  private static final class DescriptorIntPair {\n    private final Descriptor descriptor;\n    private final int number;\n\n    DescriptorIntPair(final Descriptor descriptor, final int number) {\n      this.descriptor = descriptor;\n      this.number = number;\n    }\n\n    @Override\n    public int hashCode() {\n      return descriptor.hashCode() * ((1 << 16) - 1) + number;\n    }\n    @Override\n    public boolean equals(final Object obj) {\n      if (!(obj instanceof DescriptorIntPair)) {\n        return false;\n      }\n      final DescriptorIntPair other = (DescriptorIntPair)obj;\n      return descriptor == other.descriptor && number == other.number;\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * Equivalent to {@link ExtensionRegistry} but supports only \"lite\" types.\n * <p>\n * If all of your types are lite types, then you only need to use\n * {@code ExtensionRegistryLite}.  Similarly, if all your types are regular\n * types, then you only need {@link ExtensionRegistry}.  Typically it does not\n * make sense to mix the two, since if you have any regular types in your\n * program, you then require the full runtime and lose all the benefits of\n * the lite runtime, so you might as well make all your types be regular types.\n * However, in some cases (e.g. when depending on multiple third-patry libraries\n * where one uses lite types and one uses regular), you may find yourself\n * wanting to mix the two.  In this case things get more complicated.\n * <p>\n * There are three factors to consider:  Whether the type being extended is\n * lite, whether the embedded type (in the case of a message-typed extension)\n * is lite, and whether the extension itself is lite.  Since all three are\n * declared in different files, they could all be different.  Here are all\n * the combinations and which type of registry to use:\n * <pre>\n *   Extended type     Inner type    Extension         Use registry\n *   =======================================================================\n *   lite              lite          lite              ExtensionRegistryLite\n *   lite              regular       lite              ExtensionRegistry\n *   regular           regular       regular           ExtensionRegistry\n *   all other combinations                            not supported\n * </pre>\n * <p>\n * Note that just as regular types are not allowed to contain lite-type fields,\n * they are also not allowed to contain lite-type extensions.  This is because\n * regular types must be fully accessible via reflection, which in turn means\n * that all the inner messages must also support reflection.  On the other hand,\n * since regular types implement the entire lite interface, there is no problem\n * with embedding regular types inside lite types.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic class ExtensionRegistryLite {\n  /** Construct a new, empty instance. */\n  public static ExtensionRegistryLite newInstance() {\n    return new ExtensionRegistryLite();\n  }\n\n  /** Get the unmodifiable singleton empty instance. */\n  public static ExtensionRegistryLite getEmptyRegistry() {\n    return EMPTY;\n  }\n\n  /** Returns an unmodifiable view of the registry. */\n  public ExtensionRegistryLite getUnmodifiable() {\n    return new ExtensionRegistryLite(this);\n  }\n\n  /**\n   * Find an extension by containing type and field number.\n   *\n   * @return Information about the extension if found, or {@code null}\n   *         otherwise.\n   */\n  @SuppressWarnings(\"unchecked\")\n  public <ContainingType extends MessageLite>\n      GeneratedMessageLite.GeneratedExtension<ContainingType, ?>\n        findLiteExtensionByNumber(\n          final ContainingType containingTypeDefaultInstance,\n          final int fieldNumber) {\n    return (GeneratedMessageLite.GeneratedExtension<ContainingType, ?>)\n      extensionsByNumber.get(\n        new ObjectIntPair(containingTypeDefaultInstance, fieldNumber));\n  }\n\n  /** Add an extension from a lite generated file to the registry. */\n  public final void add(\n      final GeneratedMessageLite.GeneratedExtension<?, ?> extension) {\n    extensionsByNumber.put(\n      new ObjectIntPair(extension.getContainingTypeDefaultInstance(),\n                        extension.getNumber()),\n      extension);\n  }\n\n  // =================================================================\n  // Private stuff.\n\n  // Constructors are package-private so that ExtensionRegistry can subclass\n  // this.\n\n  ExtensionRegistryLite() {\n    this.extensionsByNumber =\n        new HashMap<ObjectIntPair,\n                    GeneratedMessageLite.GeneratedExtension<?, ?>>();\n  }\n\n  ExtensionRegistryLite(ExtensionRegistryLite other) {\n    if (other == EMPTY) {\n      this.extensionsByNumber = Collections.emptyMap();\n    } else {\n      this.extensionsByNumber =\n        Collections.unmodifiableMap(other.extensionsByNumber);\n    }\n  }\n\n  private final Map<ObjectIntPair,\n                    GeneratedMessageLite.GeneratedExtension<?, ?>>\n      extensionsByNumber;\n\n  private ExtensionRegistryLite(boolean empty) {\n    this.extensionsByNumber = Collections.emptyMap();\n  }\n  private static final ExtensionRegistryLite EMPTY =\n    new ExtensionRegistryLite(true);\n\n  /** A (Object, int) pair, used as a map key. */\n  private static final class ObjectIntPair {\n    private final Object object;\n    private final int number;\n\n    ObjectIntPair(final Object object, final int number) {\n      this.object = object;\n      this.number = number;\n    }\n\n    @Override\n    public int hashCode() {\n      return System.identityHashCode(object) * ((1 << 16) - 1) + number;\n    }\n    @Override\n    public boolean equals(final Object obj) {\n      if (!(obj instanceof ObjectIntPair)) {\n        return false;\n      }\n      final ObjectIntPair other = (ObjectIntPair)obj;\n      return object == other.object && number == other.number;\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\nimport java.io.IOException;\n\n/**\n * A class which represents an arbitrary set of fields of some message type.\n * This is used to implement {@link DynamicMessage}, and also to represent\n * extensions in {@link GeneratedMessage}.  This class is package-private,\n * since outside users should probably be using {@link DynamicMessage}.\n *\n * @author kenton@google.com Kenton Varda\n */\nfinal class FieldSet<FieldDescriptorType extends\n      FieldSet.FieldDescriptorLite<FieldDescriptorType>> {\n  /**\n   * Interface for a FieldDescriptor or lite extension descriptor.  This\n   * prevents FieldSet from depending on {@link Descriptors.FieldDescriptor}.\n   */\n  public interface FieldDescriptorLite<T extends FieldDescriptorLite<T>>\n      extends Comparable<T> {\n    int getNumber();\n    WireFormat.FieldType getLiteType();\n    WireFormat.JavaType getLiteJavaType();\n    boolean isRepeated();\n    boolean isPacked();\n    Internal.EnumLiteMap<?> getEnumType();\n\n    // If getLiteJavaType() == MESSAGE, this merges a message object of the\n    // type into a builder of the type.  Returns {@code to}.\n    MessageLite.Builder internalMergeFrom(\n        MessageLite.Builder to, MessageLite from);\n  }\n\n  private final SmallSortedMap<FieldDescriptorType, Object> fields;\n  private boolean isImmutable;\n\n  /** Construct a new FieldSet. */\n  private FieldSet() {\n    this.fields = SmallSortedMap.newFieldMap(16);\n  }\n\n  /**\n   * Construct an empty FieldSet.  This is only used to initialize\n   * DEFAULT_INSTANCE.\n   */\n  private FieldSet(final boolean dummy) {\n    this.fields = SmallSortedMap.newFieldMap(0);\n    makeImmutable();\n  }\n\n  /** Construct a new FieldSet. */\n  public static <T extends FieldSet.FieldDescriptorLite<T>>\n      FieldSet<T> newFieldSet() {\n    return new FieldSet<T>();\n  }\n\n  /** Get an immutable empty FieldSet. */\n  @SuppressWarnings(\"unchecked\")\n  public static <T extends FieldSet.FieldDescriptorLite<T>>\n      FieldSet<T> emptySet() {\n    return DEFAULT_INSTANCE;\n  }\n  @SuppressWarnings(\"unchecked\")\n  private static final FieldSet DEFAULT_INSTANCE = new FieldSet(true);\n\n  /** Make this FieldSet immutable from this point forward. */\n  @SuppressWarnings(\"unchecked\")\n  public void makeImmutable() {\n    if (isImmutable) {\n      return;\n    }\n    fields.makeImmutable();\n    isImmutable = true;\n  }\n\n  /**\n   * Retuns whether the FieldSet is immutable. This is true if it is the\n   * {@link #emptySet} or if {@link #makeImmutable} were called.\n   *\n   * @return whether the FieldSet is immutable.\n   */\n  public boolean isImmutable() {\n    return isImmutable;\n  }\n\n  /**\n   * Clones the FieldSet. The returned FieldSet will be mutable even if the\n   * original FieldSet was immutable.\n   *\n   * @return the newly cloned FieldSet\n   */\n  @Override\n  public FieldSet<FieldDescriptorType> clone() {\n    // We can't just call fields.clone because List objects in the map\n    // should not be shared.\n    FieldSet<FieldDescriptorType> clone = FieldSet.newFieldSet();\n    for (int i = 0; i < fields.getNumArrayEntries(); i++) {\n      Map.Entry<FieldDescriptorType, Object> entry = fields.getArrayEntryAt(i);\n      FieldDescriptorType descriptor = entry.getKey();\n      clone.setField(descriptor, entry.getValue());\n    }\n    for (Map.Entry<FieldDescriptorType, Object> entry :\n             fields.getOverflowEntries()) {\n      FieldDescriptorType descriptor = entry.getKey();\n      clone.setField(descriptor, entry.getValue());\n    }\n    return clone;\n  }\n\n  // =================================================================\n\n  /** See {@link Message.Builder#clear()}. */\n  public void clear() {\n    fields.clear();\n  }\n\n  /**\n   * Get a simple map containing all the fields.\n   */\n  public Map<FieldDescriptorType, Object> getAllFields() {\n    return fields.isImmutable() ? fields : Collections.unmodifiableMap(fields);\n  }\n\n  /**\n   * Get an iterator to the field map. This iterator should not be leaked out\n   * of the protobuf library as it is not protected from mutation when\n   * fields is not immutable.\n   */\n  public Iterator<Map.Entry<FieldDescriptorType, Object>> iterator() {\n    return fields.entrySet().iterator();\n  }\n\n  /**\n   * Useful for implementing\n   * {@link Message#hasField(Descriptors.FieldDescriptor)}.\n   */\n  public boolean hasField(final FieldDescriptorType descriptor) {\n    if (descriptor.isRepeated()) {\n      throw new IllegalArgumentException(\n        \"hasField() can only be called on non-repeated fields.\");\n    }\n\n    return fields.get(descriptor) != null;\n  }\n\n  /**\n   * Useful for implementing\n   * {@link Message#getField(Descriptors.FieldDescriptor)}.  This method\n   * returns {@code null} if the field is not set; in this case it is up\n   * to the caller to fetch the field's default value.\n   */\n  public Object getField(final FieldDescriptorType descriptor) {\n    return fields.get(descriptor);\n  }\n\n  /**\n   * Useful for implementing\n   * {@link Message.Builder#setField(Descriptors.FieldDescriptor,Object)}.\n   */\n  @SuppressWarnings(\"unchecked\")\n  public void setField(final FieldDescriptorType descriptor,\n                       Object value) {\n    if (descriptor.isRepeated()) {\n      if (!(value instanceof List)) {\n        throw new IllegalArgumentException(\n          \"Wrong object type used with protocol message reflection.\");\n      }\n\n      // Wrap the contents in a new list so that the caller cannot change\n      // the list's contents after setting it.\n      final List newList = new ArrayList();\n      newList.addAll((List)value);\n      for (final Object element : newList) {\n        verifyType(descriptor.getLiteType(), element);\n      }\n      value = newList;\n    } else {\n      verifyType(descriptor.getLiteType(), value);\n    }\n\n    fields.put(descriptor, value);\n  }\n\n  /**\n   * Useful for implementing\n   * {@link Message.Builder#clearField(Descriptors.FieldDescriptor)}.\n   */\n  public void clearField(final FieldDescriptorType descriptor) {\n    fields.remove(descriptor);\n  }\n\n  /**\n   * Useful for implementing\n   * {@link Message#getRepeatedFieldCount(Descriptors.FieldDescriptor)}.\n   */\n  public int getRepeatedFieldCount(final FieldDescriptorType descriptor) {\n    if (!descriptor.isRepeated()) {\n      throw new IllegalArgumentException(\n        \"getRepeatedField() can only be called on repeated fields.\");\n    }\n\n    final Object value = fields.get(descriptor);\n    if (value == null) {\n      return 0;\n    } else {\n      return ((List<?>) value).size();\n    }\n  }\n\n  /**\n   * Useful for implementing\n   * {@link Message#getRepeatedField(Descriptors.FieldDescriptor,int)}.\n   */\n  public Object getRepeatedField(final FieldDescriptorType descriptor,\n                                 final int index) {\n    if (!descriptor.isRepeated()) {\n      throw new IllegalArgumentException(\n        \"getRepeatedField() can only be called on repeated fields.\");\n    }\n\n    final Object value = fields.get(descriptor);\n\n    if (value == null) {\n      throw new IndexOutOfBoundsException();\n    } else {\n      return ((List<?>) value).get(index);\n    }\n  }\n\n  /**\n   * Useful for implementing\n   * {@link Message.Builder#setRepeatedField(Descriptors.FieldDescriptor,int,Object)}.\n   */\n  @SuppressWarnings(\"unchecked\")\n  public void setRepeatedField(final FieldDescriptorType descriptor,\n                               final int index,\n                               final Object value) {\n    if (!descriptor.isRepeated()) {\n      throw new IllegalArgumentException(\n        \"getRepeatedField() can only be called on repeated fields.\");\n    }\n\n    final Object list = fields.get(descriptor);\n    if (list == null) {\n      throw new IndexOutOfBoundsException();\n    }\n\n    verifyType(descriptor.getLiteType(), value);\n    ((List) list).set(index, value);\n  }\n\n  /**\n   * Useful for implementing\n   * {@link Message.Builder#addRepeatedField(Descriptors.FieldDescriptor,Object)}.\n   */\n  @SuppressWarnings(\"unchecked\")\n  public void addRepeatedField(final FieldDescriptorType descriptor,\n                               final Object value) {\n    if (!descriptor.isRepeated()) {\n      throw new IllegalArgumentException(\n        \"addRepeatedField() can only be called on repeated fields.\");\n    }\n\n    verifyType(descriptor.getLiteType(), value);\n\n    final Object existingValue = fields.get(descriptor);\n    List list;\n    if (existingValue == null) {\n      list = new ArrayList();\n      fields.put(descriptor, list);\n    } else {\n      list = (List) existingValue;\n    }\n\n    list.add(value);\n  }\n\n  /**\n   * Verifies that the given object is of the correct type to be a valid\n   * value for the given field.  (For repeated fields, this checks if the\n   * object is the right type to be one element of the field.)\n   *\n   * @throws IllegalArgumentException The value is not of the right type.\n   */\n  private static void verifyType(final WireFormat.FieldType type,\n                                 final Object value) {\n    if (value == null) {\n      throw new NullPointerException();\n    }\n\n    boolean isValid = false;\n    switch (type.getJavaType()) {\n      case INT:          isValid = value instanceof Integer   ; break;\n      case LONG:         isValid = value instanceof Long      ; break;\n      case FLOAT:        isValid = value instanceof Float     ; break;\n      case DOUBLE:       isValid = value instanceof Double    ; break;\n      case BOOLEAN:      isValid = value instanceof Boolean   ; break;\n      case STRING:       isValid = value instanceof String    ; break;\n      case BYTE_STRING:  isValid = value instanceof ByteString; break;\n      case ENUM:\n        // TODO(kenton):  Caller must do type checking here, I guess.\n        isValid = value instanceof Internal.EnumLite;\n        break;\n      case MESSAGE:\n        // TODO(kenton):  Caller must do type checking here, I guess.\n        isValid = value instanceof MessageLite;\n        break;\n    }\n\n    if (!isValid) {\n      // TODO(kenton):  When chaining calls to setField(), it can be hard to\n      //   tell from the stack trace which exact call failed, since the whole\n      //   chain is considered one line of code.  It would be nice to print\n      //   more information here, e.g. naming the field.  We used to do that.\n      //   But we can't now that FieldSet doesn't use descriptors.  Maybe this\n      //   isn't a big deal, though, since it would only really apply when using\n      //   reflection and generally people don't chain reflection setters.\n      throw new IllegalArgumentException(\n        \"Wrong object type used with protocol message reflection.\");\n    }\n  }\n\n  // =================================================================\n  // Parsing and serialization\n\n  /**\n   * See {@link Message#isInitialized()}.  Note:  Since {@code FieldSet}\n   * itself does not have any way of knowing about required fields that\n   * aren't actually present in the set, it is up to the caller to check\n   * that all required fields are present.\n   */\n  public boolean isInitialized() {\n    for (int i = 0; i < fields.getNumArrayEntries(); i++) {\n      if (!isInitialized(fields.getArrayEntryAt(i))) {\n        return false;\n      }\n    }\n    for (final Map.Entry<FieldDescriptorType, Object> entry :\n             fields.getOverflowEntries()) {\n      if (!isInitialized(entry)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  private boolean isInitialized(\n      final Map.Entry<FieldDescriptorType, Object> entry) {\n    final FieldDescriptorType descriptor = entry.getKey();\n    if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE) {\n      if (descriptor.isRepeated()) {\n        for (final MessageLite element:\n                 (List<MessageLite>) entry.getValue()) {\n          if (!element.isInitialized()) {\n            return false;\n          }\n        }\n      } else {\n        if (!((MessageLite) entry.getValue()).isInitialized()) {\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Given a field type, return the wire type.\n   *\n   * @returns One of the {@code WIRETYPE_} constants defined in\n   *          {@link WireFormat}.\n   */\n  static int getWireFormatForFieldType(final WireFormat.FieldType type,\n                                       boolean isPacked) {\n    if (isPacked) {\n      return WireFormat.WIRETYPE_LENGTH_DELIMITED;\n    } else {\n      return type.getWireType();\n    }\n  }\n\n  /**\n   * Like {@link #mergeFrom(Message)}, but merges from another {@link FieldSet}.\n   */\n  public void mergeFrom(final FieldSet<FieldDescriptorType> other) {\n    for (int i = 0; i < other.fields.getNumArrayEntries(); i++) {\n      mergeFromField(other.fields.getArrayEntryAt(i));\n    }\n    for (final Map.Entry<FieldDescriptorType, Object> entry :\n             other.fields.getOverflowEntries()) {\n      mergeFromField(entry);\n    }\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  private void mergeFromField(\n      final Map.Entry<FieldDescriptorType, Object> entry) {\n    final FieldDescriptorType descriptor = entry.getKey();\n    final Object otherValue = entry.getValue();\n\n    if (descriptor.isRepeated()) {\n      Object value = fields.get(descriptor);\n      if (value == null) {\n        // Our list is empty, but we still need to make a defensive copy of\n        // the other list since we don't know if the other FieldSet is still\n        // mutable.\n        fields.put(descriptor, new ArrayList((List) otherValue));\n      } else {\n        // Concatenate the lists.\n        ((List) value).addAll((List) otherValue);\n      }\n    } else if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE) {\n      Object value = fields.get(descriptor);\n      if (value == null) {\n        fields.put(descriptor, otherValue);\n      } else {\n        // Merge the messages.\n        fields.put(\n            descriptor,\n            descriptor.internalMergeFrom(\n                ((MessageLite) value).toBuilder(), (MessageLite) otherValue)\n            .build());\n      }\n\n    } else {\n      fields.put(descriptor, otherValue);\n    }\n  }\n\n  // TODO(kenton):  Move static parsing and serialization methods into some\n  //   other class.  Probably WireFormat.\n\n  /**\n   * Read a field of any primitive type from a CodedInputStream.  Enums,\n   * groups, and embedded messages are not handled by this method.\n   *\n   * @param input The stream from which to read.\n   * @param type Declared type of the field.\n   * @return An object representing the field's value, of the exact\n   *         type which would be returned by\n   *         {@link Message#getField(Descriptors.FieldDescriptor)} for\n   *         this field.\n   */\n  public static Object readPrimitiveField(\n      CodedInputStream input,\n      final WireFormat.FieldType type) throws IOException {\n    switch (type) {\n      case DOUBLE  : return input.readDouble  ();\n      case FLOAT   : return input.readFloat   ();\n      case INT64   : return input.readInt64   ();\n      case UINT64  : return input.readUInt64  ();\n      case INT32   : return input.readInt32   ();\n      case FIXED64 : return input.readFixed64 ();\n      case FIXED32 : return input.readFixed32 ();\n      case BOOL    : return input.readBool    ();\n      case STRING  : return input.readString  ();\n      case BYTES   : return input.readBytes   ();\n      case UINT32  : return input.readUInt32  ();\n      case SFIXED32: return input.readSFixed32();\n      case SFIXED64: return input.readSFixed64();\n      case SINT32  : return input.readSInt32  ();\n      case SINT64  : return input.readSInt64  ();\n\n      case GROUP:\n        throw new IllegalArgumentException(\n          \"readPrimitiveField() cannot handle nested groups.\");\n      case MESSAGE:\n        throw new IllegalArgumentException(\n          \"readPrimitiveField() cannot handle embedded messages.\");\n      case ENUM:\n        // We don't handle enums because we don't know what to do if the\n        // value is not recognized.\n        throw new IllegalArgumentException(\n          \"readPrimitiveField() cannot handle enums.\");\n    }\n\n    throw new RuntimeException(\n      \"There is no way to get here, but the compiler thinks otherwise.\");\n  }\n\n  /** See {@link Message#writeTo(CodedOutputStream)}. */\n  public void writeTo(final CodedOutputStream output)\n                      throws IOException {\n    for (int i = 0; i < fields.getNumArrayEntries(); i++) {\n      final Map.Entry<FieldDescriptorType, Object> entry =\n          fields.getArrayEntryAt(i);\n      writeField(entry.getKey(), entry.getValue(), output);\n    }\n    for (final Map.Entry<FieldDescriptorType, Object> entry :\n         fields.getOverflowEntries()) {\n      writeField(entry.getKey(), entry.getValue(), output);\n    }\n  }\n\n  /**\n   * Like {@link #writeTo} but uses MessageSet wire format.\n   */\n  public void writeMessageSetTo(final CodedOutputStream output)\n                                throws IOException {\n    for (int i = 0; i < fields.getNumArrayEntries(); i++) {\n      writeMessageSetTo(fields.getArrayEntryAt(i), output);\n    }\n    for (final Map.Entry<FieldDescriptorType, Object> entry :\n             fields.getOverflowEntries()) {\n      writeMessageSetTo(entry, output);\n    }\n  }\n\n  private void writeMessageSetTo(\n      final Map.Entry<FieldDescriptorType, Object> entry,\n      final CodedOutputStream output) throws IOException {\n    final FieldDescriptorType descriptor = entry.getKey();\n    if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE &&\n        !descriptor.isRepeated() && !descriptor.isPacked()) {\n      output.writeMessageSetExtension(entry.getKey().getNumber(),\n                                      (MessageLite) entry.getValue());\n    } else {\n      writeField(descriptor, entry.getValue(), output);\n    }\n  }\n\n  /**\n   * Write a single tag-value pair to the stream.\n   *\n   * @param output The output stream.\n   * @param type   The field's type.\n   * @param number The field's number.\n   * @param value  Object representing the field's value.  Must be of the exact\n   *               type which would be returned by\n   *               {@link Message#getField(Descriptors.FieldDescriptor)} for\n   *               this field.\n   */\n  private static void writeElement(final CodedOutputStream output,\n                                   final WireFormat.FieldType type,\n                                   final int number,\n                                   final Object value) throws IOException {\n    // Special case for groups, which need a start and end tag; other fields\n    // can just use writeTag() and writeFieldNoTag().\n    if (type == WireFormat.FieldType.GROUP) {\n      output.writeGroup(number, (MessageLite) value);\n    } else {\n      output.writeTag(number, getWireFormatForFieldType(type, false));\n      writeElementNoTag(output, type, value);\n    }\n  }\n\n  /**\n   * Write a field of arbitrary type, without its tag, to the stream.\n   *\n   * @param output The output stream.\n   * @param type The field's type.\n   * @param value  Object representing the field's value.  Must be of the exact\n   *               type which would be returned by\n   *               {@link Message#getField(Descriptors.FieldDescriptor)} for\n   *               this field.\n   */\n  private static void writeElementNoTag(\n      final CodedOutputStream output,\n      final WireFormat.FieldType type,\n      final Object value) throws IOException {\n    switch (type) {\n      case DOUBLE  : output.writeDoubleNoTag  ((Double     ) value); break;\n      case FLOAT   : output.writeFloatNoTag   ((Float      ) value); break;\n      case INT64   : output.writeInt64NoTag   ((Long       ) value); break;\n      case UINT64  : output.writeUInt64NoTag  ((Long       ) value); break;\n      case INT32   : output.writeInt32NoTag   ((Integer    ) value); break;\n      case FIXED64 : output.writeFixed64NoTag ((Long       ) value); break;\n      case FIXED32 : output.writeFixed32NoTag ((Integer    ) value); break;\n      case BOOL    : output.writeBoolNoTag    ((Boolean    ) value); break;\n      case STRING  : output.writeStringNoTag  ((String     ) value); break;\n      case GROUP   : output.writeGroupNoTag   ((MessageLite) value); break;\n      case MESSAGE : output.writeMessageNoTag ((MessageLite) value); break;\n      case BYTES   : output.writeBytesNoTag   ((ByteString ) value); break;\n      case UINT32  : output.writeUInt32NoTag  ((Integer    ) value); break;\n      case SFIXED32: output.writeSFixed32NoTag((Integer    ) value); break;\n      case SFIXED64: output.writeSFixed64NoTag((Long       ) value); break;\n      case SINT32  : output.writeSInt32NoTag  ((Integer    ) value); break;\n      case SINT64  : output.writeSInt64NoTag  ((Long       ) value); break;\n\n      case ENUM:\n        output.writeEnumNoTag(((Internal.EnumLite) value).getNumber());\n        break;\n    }\n  }\n\n  /** Write a single field. */\n  public static void writeField(final FieldDescriptorLite<?> descriptor,\n                                final Object value,\n                                final CodedOutputStream output)\n                                throws IOException {\n    WireFormat.FieldType type = descriptor.getLiteType();\n    int number = descriptor.getNumber();\n    if (descriptor.isRepeated()) {\n      final List<?> valueList = (List<?>)value;\n      if (descriptor.isPacked()) {\n        output.writeTag(number, WireFormat.WIRETYPE_LENGTH_DELIMITED);\n        // Compute the total data size so the length can be written.\n        int dataSize = 0;\n        for (final Object element : valueList) {\n          dataSize += computeElementSizeNoTag(type, element);\n        }\n        output.writeRawVarint32(dataSize);\n        // Write the data itself, without any tags.\n        for (final Object element : valueList) {\n          writeElementNoTag(output, type, element);\n        }\n      } else {\n        for (final Object element : valueList) {\n          writeElement(output, type, number, element);\n        }\n      }\n    } else {\n      writeElement(output, type, number, value);\n    }\n  }\n\n  /**\n   * See {@link Message#getSerializedSize()}.  It's up to the caller to cache\n   * the resulting size if desired.\n   */\n  public int getSerializedSize() {\n    int size = 0;\n    for (int i = 0; i < fields.getNumArrayEntries(); i++) {\n      final Map.Entry<FieldDescriptorType, Object> entry =\n          fields.getArrayEntryAt(i);\n      size += computeFieldSize(entry.getKey(), entry.getValue());\n    }\n    for (final Map.Entry<FieldDescriptorType, Object> entry :\n         fields.getOverflowEntries()) {\n      size += computeFieldSize(entry.getKey(), entry.getValue());\n    }\n    return size;\n  }\n\n  /**\n   * Like {@link #getSerializedSize} but uses MessageSet wire format.\n   */\n  public int getMessageSetSerializedSize() {\n    int size = 0;\n    for (int i = 0; i < fields.getNumArrayEntries(); i++) {\n      size += getMessageSetSerializedSize(fields.getArrayEntryAt(i));\n    }\n    for (final Map.Entry<FieldDescriptorType, Object> entry :\n             fields.getOverflowEntries()) {\n      size += getMessageSetSerializedSize(entry);\n    }\n    return size;\n  }\n\n  private int getMessageSetSerializedSize(\n      final Map.Entry<FieldDescriptorType, Object> entry) {\n    final FieldDescriptorType descriptor = entry.getKey();\n    if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE &&\n        !descriptor.isRepeated() && !descriptor.isPacked()) {\n      return CodedOutputStream.computeMessageSetExtensionSize(\n          entry.getKey().getNumber(), (MessageLite) entry.getValue());\n    } else {\n      return computeFieldSize(descriptor, entry.getValue());\n    }\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * single tag/value pair of arbitrary type.\n   *\n   * @param type   The field's type.\n   * @param number The field's number.\n   * @param value  Object representing the field's value.  Must be of the exact\n   *               type which would be returned by\n   *               {@link Message#getField(Descriptors.FieldDescriptor)} for\n   *               this field.\n   */\n  private static int computeElementSize(\n      final WireFormat.FieldType type,\n      final int number, final Object value) {\n    int tagSize = CodedOutputStream.computeTagSize(number);\n    if (type == WireFormat.FieldType.GROUP) {\n      tagSize *= 2;\n    }\n    return tagSize + computeElementSizeNoTag(type, value);\n  }\n\n  /**\n   * Compute the number of bytes that would be needed to encode a\n   * particular value of arbitrary type, excluding tag.\n   *\n   * @param type   The field's type.\n   * @param value  Object representing the field's value.  Must be of the exact\n   *               type which would be returned by\n   *               {@link Message#getField(Descriptors.FieldDescriptor)} for\n   *               this field.\n   */\n  private static int computeElementSizeNoTag(\n      final WireFormat.FieldType type, final Object value) {\n    switch (type) {\n      // Note:  Minor violation of 80-char limit rule here because this would\n      //   actually be harder to read if we wrapped the lines.\n      case DOUBLE  : return CodedOutputStream.computeDoubleSizeNoTag  ((Double     )value);\n      case FLOAT   : return CodedOutputStream.computeFloatSizeNoTag   ((Float      )value);\n      case INT64   : return CodedOutputStream.computeInt64SizeNoTag   ((Long       )value);\n      case UINT64  : return CodedOutputStream.computeUInt64SizeNoTag  ((Long       )value);\n      case INT32   : return CodedOutputStream.computeInt32SizeNoTag   ((Integer    )value);\n      case FIXED64 : return CodedOutputStream.computeFixed64SizeNoTag ((Long       )value);\n      case FIXED32 : return CodedOutputStream.computeFixed32SizeNoTag ((Integer    )value);\n      case BOOL    : return CodedOutputStream.computeBoolSizeNoTag    ((Boolean    )value);\n      case STRING  : return CodedOutputStream.computeStringSizeNoTag  ((String     )value);\n      case GROUP   : return CodedOutputStream.computeGroupSizeNoTag   ((MessageLite)value);\n      case MESSAGE : return CodedOutputStream.computeMessageSizeNoTag ((MessageLite)value);\n      case BYTES   : return CodedOutputStream.computeBytesSizeNoTag   ((ByteString )value);\n      case UINT32  : return CodedOutputStream.computeUInt32SizeNoTag  ((Integer    )value);\n      case SFIXED32: return CodedOutputStream.computeSFixed32SizeNoTag((Integer    )value);\n      case SFIXED64: return CodedOutputStream.computeSFixed64SizeNoTag((Long       )value);\n      case SINT32  : return CodedOutputStream.computeSInt32SizeNoTag  ((Integer    )value);\n      case SINT64  : return CodedOutputStream.computeSInt64SizeNoTag  ((Long       )value);\n\n      case ENUM:\n        return CodedOutputStream.computeEnumSizeNoTag(\n            ((Internal.EnumLite) value).getNumber());\n    }\n\n    throw new RuntimeException(\n      \"There is no way to get here, but the compiler thinks otherwise.\");\n  }\n\n  /**\n   * Compute the number of bytes needed to encode a particular field.\n   */\n  public static int computeFieldSize(final FieldDescriptorLite<?> descriptor,\n                                     final Object value) {\n    WireFormat.FieldType type = descriptor.getLiteType();\n    int number = descriptor.getNumber();\n    if (descriptor.isRepeated()) {\n      if (descriptor.isPacked()) {\n        int dataSize = 0;\n        for (final Object element : (List<?>)value) {\n          dataSize += computeElementSizeNoTag(type, element);\n        }\n        return dataSize +\n            CodedOutputStream.computeTagSize(number) +\n            CodedOutputStream.computeRawVarint32Size(dataSize);\n      } else {\n        int size = 0;\n        for (final Object element : (List<?>)value) {\n          size += computeElementSize(type, number, element);\n        }\n        return size;\n      }\n    } else {\n      return computeElementSize(type, number, value);\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport com.google.protobuf.Descriptors.Descriptor;\nimport com.google.protobuf.Descriptors.EnumValueDescriptor;\nimport com.google.protobuf.Descriptors.FieldDescriptor;\n\nimport java.io.IOException;\nimport java.io.ObjectStreamException;\nimport java.io.Serializable;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.TreeMap;\n\n/**\n * All generated protocol message classes extend this class.  This class\n * implements most of the Message and Builder interfaces using Java reflection.\n * Users can ignore this class and pretend that generated messages implement\n * the Message interface directly.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic abstract class GeneratedMessage extends AbstractMessage\n    implements Serializable {\n  private static final long serialVersionUID = 1L;\n\n  private final UnknownFieldSet unknownFields;\n\n  /**\n   * For testing. Allows a test to disable the optimization that avoids using\n   * field builders for nested messages until they are requested. By disabling\n   * this optimization, existing tests can be reused to test the field builders.\n   */\n  protected static boolean alwaysUseFieldBuilders = false;\n\n  protected GeneratedMessage() {\n    this.unknownFields = UnknownFieldSet.getDefaultInstance();\n  }\n\n  protected GeneratedMessage(Builder<?> builder) {\n    this.unknownFields = builder.getUnknownFields();\n  }\n\n /**\n  * For testing. Allows a test to disable the optimization that avoids using\n  * field builders for nested messages until they are requested. By disabling\n  * this optimization, existing tests can be reused to test the field builders.\n  * See {@link RepeatedFieldBuilder} and {@link SingleFieldBuilder}.\n  */\n  static void enableAlwaysUseFieldBuildersForTesting() {\n    alwaysUseFieldBuilders = true;\n  }\n\n  /**\n   * Get the FieldAccessorTable for this type.  We can't have the message\n   * class pass this in to the constructor because of bootstrapping trouble\n   * with DescriptorProtos.\n   */\n  protected abstract FieldAccessorTable internalGetFieldAccessorTable();\n\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  public Descriptor getDescriptorForType() {\n    return internalGetFieldAccessorTable().descriptor;\n  }\n\n  /** Internal helper which returns a mutable map. */\n  private Map<FieldDescriptor, Object> getAllFieldsMutable() {\n    final TreeMap<FieldDescriptor, Object> result =\n      new TreeMap<FieldDescriptor, Object>();\n    final Descriptor descriptor = internalGetFieldAccessorTable().descriptor;\n    for (final FieldDescriptor field : descriptor.getFields()) {\n      if (field.isRepeated()) {\n        final List<?> value = (List<?>) getField(field);\n        if (!value.isEmpty()) {\n          result.put(field, value);\n        }\n      } else {\n        if (hasField(field)) {\n          result.put(field, getField(field));\n        }\n      }\n    }\n    return result;\n  }\n\n  @Override\n  public boolean isInitialized() {\n    for (final FieldDescriptor field : getDescriptorForType().getFields()) {\n      // Check that all required fields are present.\n      if (field.isRequired()) {\n        if (!hasField(field)) {\n          return false;\n        }\n      }\n      // Check that embedded messages are initialized.\n      if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n        if (field.isRepeated()) {\n          @SuppressWarnings(\"unchecked\") final\n          List<Message> messageList = (List<Message>) getField(field);\n          for (final Message element : messageList) {\n            if (!element.isInitialized()) {\n              return false;\n            }\n          }\n        } else {\n          if (hasField(field) && !((Message) getField(field)).isInitialized()) {\n            return false;\n          }\n        }\n      }\n    }\n\n    return true;\n  }\n\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  public Map<FieldDescriptor, Object> getAllFields() {\n    return Collections.unmodifiableMap(getAllFieldsMutable());\n  }\n\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  public boolean hasField(final FieldDescriptor field) {\n    return internalGetFieldAccessorTable().getField(field).has(this);\n  }\n\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  public Object getField(final FieldDescriptor field) {\n    return internalGetFieldAccessorTable().getField(field).get(this);\n  }\n\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  public int getRepeatedFieldCount(final FieldDescriptor field) {\n    return internalGetFieldAccessorTable().getField(field)\n      .getRepeatedCount(this);\n  }\n\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  public Object getRepeatedField(final FieldDescriptor field, final int index) {\n    return internalGetFieldAccessorTable().getField(field)\n      .getRepeated(this, index);\n  }\n\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  public final UnknownFieldSet getUnknownFields() {\n    return unknownFields;\n  }\n\n  protected abstract Message.Builder newBuilderForType(BuilderParent parent);\n\n  /**\n   * Interface for the parent of a Builder that allows the builder to\n   * communicate invalidations back to the parent for use when using nested\n   * builders.\n   */\n  protected interface BuilderParent {\n\n    /**\n     * A builder becomes dirty whenever a field is modified -- including fields\n     * in nested builders -- and becomes clean when build() is called.  Thus,\n     * when a builder becomes dirty, all its parents become dirty as well, and\n     * when it becomes clean, all its children become clean.  The dirtiness\n     * state is used to invalidate certain cached values.\n     * <br>\n     * To this end, a builder calls markAsDirty() on its parent whenever it\n     * transitions from clean to dirty.  The parent must propagate this call to\n     * its own parent, unless it was already dirty, in which case the\n     * grandparent must necessarily already be dirty as well.  The parent can\n     * only transition back to \"clean\" after calling build() on all children.\n     */\n    void markDirty();\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public abstract static class Builder <BuilderType extends Builder>\n      extends AbstractMessage.Builder<BuilderType> {\n\n    private BuilderParent builderParent;\n\n    private BuilderParentImpl meAsParent;\n\n    // Indicates that we've built a message and so we are now obligated\n    // to dispatch dirty invalidations. See GeneratedMessage.BuilderListener.\n    private boolean isClean;\n\n    private UnknownFieldSet unknownFields =\n        UnknownFieldSet.getDefaultInstance();\n\n    protected Builder() {\n      this(null);\n    }\n\n    protected Builder(BuilderParent builderParent) {\n      this.builderParent = builderParent;\n    }\n\n    void dispose() {\n      builderParent = null;\n    }\n\n    /**\n     * Called by the subclass when a message is built.\n     */\n    protected void onBuilt() {\n      if (builderParent != null) {\n        markClean();\n      }\n    }\n\n    /**\n     * Called by the subclass or a builder to notify us that a message was\n     * built and may be cached and therefore invalidations are needed.\n     */\n    protected void markClean() {\n      this.isClean = true;\n    }\n\n    /**\n     * Gets whether invalidations are needed\n     *\n     * @return whether invalidations are needed\n     */\n    protected boolean isClean() {\n      return isClean;\n    }\n\n    // This is implemented here only to work around an apparent bug in the\n    // Java compiler and/or build system.  See bug #1898463.  The mere presence\n    // of this dummy clone() implementation makes it go away.\n    @Override\n    public BuilderType clone() {\n      throw new UnsupportedOperationException(\n          \"This is supposed to be overridden by subclasses.\");\n    }\n\n    /**\n     * Called by the initialization and clear code paths to allow subclasses to\n     * reset any of their builtin fields back to the initial values.\n     */\n    public BuilderType clear() {\n      unknownFields = UnknownFieldSet.getDefaultInstance();\n      onChanged();\n      return (BuilderType) this;\n    }\n\n    /**\n     * Get the FieldAccessorTable for this type.  We can't have the message\n     * class pass this in to the constructor because of bootstrapping trouble\n     * with DescriptorProtos.\n     */\n    protected abstract FieldAccessorTable internalGetFieldAccessorTable();\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public Descriptor getDescriptorForType() {\n      return internalGetFieldAccessorTable().descriptor;\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public Map<FieldDescriptor, Object> getAllFields() {\n      return Collections.unmodifiableMap(getAllFieldsMutable());\n    }\n\n    /** Internal helper which returns a mutable map. */\n    private Map<FieldDescriptor, Object> getAllFieldsMutable() {\n      final TreeMap<FieldDescriptor, Object> result =\n        new TreeMap<FieldDescriptor, Object>();\n      final Descriptor descriptor = internalGetFieldAccessorTable().descriptor;\n      for (final FieldDescriptor field : descriptor.getFields()) {\n        if (field.isRepeated()) {\n          final List value = (List) getField(field);\n          if (!value.isEmpty()) {\n            result.put(field, value);\n          }\n        } else {\n          if (hasField(field)) {\n            result.put(field, getField(field));\n          }\n        }\n      }\n      return result;\n    }\n\n    public Message.Builder newBuilderForField(\n        final FieldDescriptor field) {\n      return internalGetFieldAccessorTable().getField(field).newBuilder();\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public boolean hasField(final FieldDescriptor field) {\n      return internalGetFieldAccessorTable().getField(field).has(this);\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public Object getField(final FieldDescriptor field) {\n      Object object = internalGetFieldAccessorTable().getField(field).get(this);\n      if (field.isRepeated()) {\n        // The underlying list object is still modifiable at this point.\n        // Make sure not to expose the modifiable list to the caller.\n        return Collections.unmodifiableList((List) object);\n      } else {\n        return object;\n      }\n    }\n\n    public BuilderType setField(final FieldDescriptor field,\n                                final Object value) {\n      internalGetFieldAccessorTable().getField(field).set(this, value);\n      return (BuilderType) this;\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public BuilderType clearField(final FieldDescriptor field) {\n      internalGetFieldAccessorTable().getField(field).clear(this);\n      return (BuilderType) this;\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public int getRepeatedFieldCount(final FieldDescriptor field) {\n      return internalGetFieldAccessorTable().getField(field)\n          .getRepeatedCount(this);\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public Object getRepeatedField(final FieldDescriptor field,\n                                   final int index) {\n      return internalGetFieldAccessorTable().getField(field)\n          .getRepeated(this, index);\n    }\n\n    public BuilderType setRepeatedField(final FieldDescriptor field,\n                                        final int index, final Object value) {\n      internalGetFieldAccessorTable().getField(field)\n        .setRepeated(this, index, value);\n      return (BuilderType) this;\n    }\n\n    public BuilderType addRepeatedField(final FieldDescriptor field,\n                                        final Object value) {\n      internalGetFieldAccessorTable().getField(field).addRepeated(this, value);\n      return (BuilderType) this;\n    }\n\n    public final BuilderType setUnknownFields(\n        final UnknownFieldSet unknownFields) {\n      this.unknownFields = unknownFields;\n      onChanged();\n      return (BuilderType) this;\n    }\n\n    @Override\n    public final BuilderType mergeUnknownFields(\n        final UnknownFieldSet unknownFields) {\n      this.unknownFields =\n        UnknownFieldSet.newBuilder(this.unknownFields)\n                       .mergeFrom(unknownFields)\n                       .build();\n      onChanged();\n      return (BuilderType) this;\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public boolean isInitialized() {\n      for (final FieldDescriptor field : getDescriptorForType().getFields()) {\n        // Check that all required fields are present.\n        if (field.isRequired()) {\n          if (!hasField(field)) {\n            return false;\n          }\n        }\n        // Check that embedded messages are initialized.\n        if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n          if (field.isRepeated()) {\n            @SuppressWarnings(\"unchecked\") final\n            List<Message> messageList = (List<Message>) getField(field);\n            for (final Message element : messageList) {\n              if (!element.isInitialized()) {\n                return false;\n              }\n            }\n          } else {\n            if (hasField(field) &&\n                !((Message) getField(field)).isInitialized()) {\n              return false;\n            }\n          }\n        }\n      }\n      return true;\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public final UnknownFieldSet getUnknownFields() {\n      return unknownFields;\n    }\n\n    /**\n     * Called by subclasses to parse an unknown field.\n     * @return {@code true} unless the tag is an end-group tag.\n     */\n    protected boolean parseUnknownField(\n        final CodedInputStream input,\n        final UnknownFieldSet.Builder unknownFields,\n        final ExtensionRegistryLite extensionRegistry,\n        final int tag) throws IOException {\n      return unknownFields.mergeFieldFrom(tag, input);\n    }\n\n    /**\n     * Implementation of {@link BuilderParent} for giving to our children. This\n     * small inner class makes it so we don't publicly expose the BuilderParent\n     * methods.\n     */\n    private class BuilderParentImpl implements BuilderParent {\n\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public void markDirty() {\n        onChanged();\n      }\n    }\n\n    /**\n     * Gets the {@link BuilderParent} for giving to our children.\n     * @return The builder parent for our children.\n     */\n    protected BuilderParent getParentForChildren() {\n      if (meAsParent == null) {\n        meAsParent = new BuilderParentImpl();\n      }\n      return meAsParent;\n    }\n\n    /**\n     * Called when a the builder or one of its nested children has changed\n     * and any parent should be notified of its invalidation.\n     */\n    protected final void onChanged() {\n      if (isClean && builderParent != null) {\n        builderParent.markDirty();\n\n        // Don't keep dispatching invalidations until build is called again.\n        isClean = false;\n      }\n    }\n  }\n\n  // =================================================================\n  // Extensions-related stuff\n\n  public interface ExtendableMessageOrBuilder<\n      MessageType extends ExtendableMessage> extends MessageOrBuilder {\n\n    /** Check if a singular extension is present. */\n    <Type> boolean hasExtension(\n        GeneratedExtension<MessageType, Type> extension);\n\n    /** Get the number of elements in a repeated extension. */\n    <Type> int getExtensionCount(\n        GeneratedExtension<MessageType, List<Type>> extension);\n\n    /** Get the value of an extension. */\n    <Type> Type getExtension(GeneratedExtension<MessageType, Type> extension);\n\n    /** Get one element of a repeated extension. */\n    <Type> Type getExtension(\n        GeneratedExtension<MessageType, List<Type>> extension,\n        int index);\n  }\n\n  /**\n   * Generated message classes for message types that contain extension ranges\n   * subclass this.\n   *\n   * <p>This class implements type-safe accessors for extensions.  They\n   * implement all the same operations that you can do with normal fields --\n   * e.g. \"has\", \"get\", and \"getCount\" -- but for extensions.  The extensions\n   * are identified using instances of the class {@link GeneratedExtension};\n   * the protocol compiler generates a static instance of this class for every\n   * extension in its input.  Through the magic of generics, all is made\n   * type-safe.\n   *\n   * <p>For example, imagine you have the {@code .proto} file:\n   *\n   * <pre>\n   * option java_class = \"MyProto\";\n   *\n   * message Foo {\n   *   extensions 1000 to max;\n   * }\n   *\n   * extend Foo {\n   *   optional int32 bar;\n   * }\n   * </pre>\n   *\n   * <p>Then you might write code like:\n   *\n   * <pre>\n   * MyProto.Foo foo = getFoo();\n   * int i = foo.getExtension(MyProto.bar);\n   * </pre>\n   *\n   * <p>See also {@link ExtendableBuilder}.\n   */\n  public abstract static class ExtendableMessage<\n        MessageType extends ExtendableMessage>\n      extends GeneratedMessage\n      implements ExtendableMessageOrBuilder<MessageType> {\n\n    private final FieldSet<FieldDescriptor> extensions;\n\n    protected ExtendableMessage() {\n      this.extensions = FieldSet.newFieldSet();\n    }\n\n    protected ExtendableMessage(\n        ExtendableBuilder<MessageType, ?> builder) {\n      super(builder);\n      this.extensions = builder.buildExtensions();\n    }\n\n    private void verifyExtensionContainingType(\n        final GeneratedExtension<MessageType, ?> extension) {\n      if (extension.getDescriptor().getContainingType() !=\n          getDescriptorForType()) {\n        // This can only happen if someone uses unchecked operations.\n        throw new IllegalArgumentException(\n          \"Extension is for type \\\"\" +\n          extension.getDescriptor().getContainingType().getFullName() +\n          \"\\\" which does not match message type \\\"\" +\n          getDescriptorForType().getFullName() + \"\\\".\");\n      }\n    }\n\n    /** Check if a singular extension is present. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public final <Type> boolean hasExtension(\n        final GeneratedExtension<MessageType, Type> extension) {\n      verifyExtensionContainingType(extension);\n      return extensions.hasField(extension.getDescriptor());\n    }\n\n    /** Get the number of elements in a repeated extension. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public final <Type> int getExtensionCount(\n        final GeneratedExtension<MessageType, List<Type>> extension) {\n      verifyExtensionContainingType(extension);\n      final FieldDescriptor descriptor = extension.getDescriptor();\n      return extensions.getRepeatedFieldCount(descriptor);\n    }\n\n    /** Get the value of an extension. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    @SuppressWarnings(\"unchecked\")\n    public final <Type> Type getExtension(\n        final GeneratedExtension<MessageType, Type> extension) {\n      verifyExtensionContainingType(extension);\n      FieldDescriptor descriptor = extension.getDescriptor();\n      final Object value = extensions.getField(descriptor);\n      if (value == null) {\n        if (descriptor.isRepeated()) {\n          return (Type) Collections.emptyList();\n        } else if (descriptor.getJavaType() ==\n                   FieldDescriptor.JavaType.MESSAGE) {\n          return (Type) extension.getMessageDefaultInstance();\n        } else {\n          return (Type) extension.fromReflectionType(\n              descriptor.getDefaultValue());\n        }\n      } else {\n        return (Type) extension.fromReflectionType(value);\n      }\n    }\n\n    /** Get one element of a repeated extension. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    @SuppressWarnings(\"unchecked\")\n    public final <Type> Type getExtension(\n        final GeneratedExtension<MessageType, List<Type>> extension,\n        final int index) {\n      verifyExtensionContainingType(extension);\n      FieldDescriptor descriptor = extension.getDescriptor();\n      return (Type) extension.singularFromReflectionType(\n          extensions.getRepeatedField(descriptor, index));\n    }\n\n    /** Called by subclasses to check if all extensions are initialized. */\n    protected boolean extensionsAreInitialized() {\n      return extensions.isInitialized();\n    }\n\n    @Override\n    public boolean isInitialized() {\n      return super.isInitialized() && extensionsAreInitialized();\n    }\n\n    /**\n     * Used by subclasses to serialize extensions.  Extension ranges may be\n     * interleaved with field numbers, but we must write them in canonical\n     * (sorted by field number) order.  ExtensionWriter helps us write\n     * individual ranges of extensions at once.\n     */\n    protected class ExtensionWriter {\n      // Imagine how much simpler this code would be if Java iterators had\n      // a way to get the next element without advancing the iterator.\n\n      private final Iterator<Map.Entry<FieldDescriptor, Object>> iter =\n        extensions.iterator();\n      private Map.Entry<FieldDescriptor, Object> next;\n      private final boolean messageSetWireFormat;\n\n      private ExtensionWriter(final boolean messageSetWireFormat) {\n        if (iter.hasNext()) {\n          next = iter.next();\n        }\n        this.messageSetWireFormat = messageSetWireFormat;\n      }\n\n      public void writeUntil(final int end, final CodedOutputStream output)\n                             throws IOException {\n        while (next != null && next.getKey().getNumber() < end) {\n          FieldDescriptor descriptor = next.getKey();\n          if (messageSetWireFormat && descriptor.getLiteJavaType() ==\n                  WireFormat.JavaType.MESSAGE &&\n              !descriptor.isRepeated()) {\n            output.writeMessageSetExtension(descriptor.getNumber(),\n                                            (Message) next.getValue());\n          } else {\n            FieldSet.writeField(descriptor, next.getValue(), output);\n          }\n          if (iter.hasNext()) {\n            next = iter.next();\n          } else {\n            next = null;\n          }\n        }\n      }\n    }\n\n    protected ExtensionWriter newExtensionWriter() {\n      return new ExtensionWriter(false);\n    }\n    protected ExtensionWriter newMessageSetExtensionWriter() {\n      return new ExtensionWriter(true);\n    }\n\n    /** Called by subclasses to compute the size of extensions. */\n    protected int extensionsSerializedSize() {\n      return extensions.getSerializedSize();\n    }\n    protected int extensionsSerializedSizeAsMessageSet() {\n      return extensions.getMessageSetSerializedSize();\n    }\n\n    // ---------------------------------------------------------------\n    // Reflection\n\n    protected Map<FieldDescriptor, Object> getExtensionFields() {\n      return extensions.getAllFields();\n    }\n\n    @Override\n    public Map<FieldDescriptor, Object> getAllFields() {\n      final Map<FieldDescriptor, Object> result = super.getAllFieldsMutable();\n      result.putAll(getExtensionFields());\n      return Collections.unmodifiableMap(result);\n    }\n\n    @Override\n    public boolean hasField(final FieldDescriptor field) {\n      if (field.isExtension()) {\n        verifyContainingType(field);\n        return extensions.hasField(field);\n      } else {\n        return super.hasField(field);\n      }\n    }\n\n    @Override\n    public Object getField(final FieldDescriptor field) {\n      if (field.isExtension()) {\n        verifyContainingType(field);\n        final Object value = extensions.getField(field);\n        if (value == null) {\n          if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n            // Lacking an ExtensionRegistry, we have no way to determine the\n            // extension's real type, so we return a DynamicMessage.\n            return DynamicMessage.getDefaultInstance(field.getMessageType());\n          } else {\n            return field.getDefaultValue();\n          }\n        } else {\n          return value;\n        }\n      } else {\n        return super.getField(field);\n      }\n    }\n\n    @Override\n    public int getRepeatedFieldCount(final FieldDescriptor field) {\n      if (field.isExtension()) {\n        verifyContainingType(field);\n        return extensions.getRepeatedFieldCount(field);\n      } else {\n        return super.getRepeatedFieldCount(field);\n      }\n    }\n\n    @Override\n    public Object getRepeatedField(final FieldDescriptor field,\n                                   final int index) {\n      if (field.isExtension()) {\n        verifyContainingType(field);\n        return extensions.getRepeatedField(field, index);\n      } else {\n        return super.getRepeatedField(field, index);\n      }\n    }\n\n    private void verifyContainingType(final FieldDescriptor field) {\n      if (field.getContainingType() != getDescriptorForType()) {\n        throw new IllegalArgumentException(\n          \"FieldDescriptor does not match message type.\");\n      }\n    }\n  }\n\n  /**\n   * Generated message builders for message types that contain extension ranges\n   * subclass this.\n   *\n   * <p>This class implements type-safe accessors for extensions.  They\n   * implement all the same operations that you can do with normal fields --\n   * e.g. \"get\", \"set\", and \"add\" -- but for extensions.  The extensions are\n   * identified using instances of the class {@link GeneratedExtension}; the\n   * protocol compiler generates a static instance of this class for every\n   * extension in its input.  Through the magic of generics, all is made\n   * type-safe.\n   *\n   * <p>For example, imagine you have the {@code .proto} file:\n   *\n   * <pre>\n   * option java_class = \"MyProto\";\n   *\n   * message Foo {\n   *   extensions 1000 to max;\n   * }\n   *\n   * extend Foo {\n   *   optional int32 bar;\n   * }\n   * </pre>\n   *\n   * <p>Then you might write code like:\n   *\n   * <pre>\n   * MyProto.Foo foo =\n   *   MyProto.Foo.newBuilder()\n   *     .setExtension(MyProto.bar, 123)\n   *     .build();\n   * </pre>\n   *\n   * <p>See also {@link ExtendableMessage}.\n   */\n  @SuppressWarnings(\"unchecked\")\n  public abstract static class ExtendableBuilder<\n        MessageType extends ExtendableMessage,\n        BuilderType extends ExtendableBuilder>\n      extends Builder<BuilderType>\n      implements ExtendableMessageOrBuilder<MessageType> {\n\n    private FieldSet<FieldDescriptor> extensions = FieldSet.emptySet();\n\n    protected ExtendableBuilder() {}\n\n    protected ExtendableBuilder(\n        BuilderParent parent) {\n      super(parent);\n    }\n\n    @Override\n    public BuilderType clear() {\n      extensions = FieldSet.emptySet();\n      return super.clear();\n    }\n\n    // This is implemented here only to work around an apparent bug in the\n    // Java compiler and/or build system.  See bug #1898463.  The mere presence\n    // of this dummy clone() implementation makes it go away.\n    @Override\n    public BuilderType clone() {\n      throw new UnsupportedOperationException(\n          \"This is supposed to be overridden by subclasses.\");\n    }\n\n    private void ensureExtensionsIsMutable() {\n      if (extensions.isImmutable()) {\n        extensions = extensions.clone();\n      }\n    }\n\n    private void verifyExtensionContainingType(\n        final GeneratedExtension<MessageType, ?> extension) {\n      if (extension.getDescriptor().getContainingType() !=\n          getDescriptorForType()) {\n        // This can only happen if someone uses unchecked operations.\n        throw new IllegalArgumentException(\n          \"Extension is for type \\\"\" +\n          extension.getDescriptor().getContainingType().getFullName() +\n          \"\\\" which does not match message type \\\"\" +\n          getDescriptorForType().getFullName() + \"\\\".\");\n      }\n    }\n\n    /** Check if a singular extension is present. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public final <Type> boolean hasExtension(\n        final GeneratedExtension<MessageType, Type> extension) {\n      verifyExtensionContainingType(extension);\n      return extensions.hasField(extension.getDescriptor());\n    }\n\n    /** Get the number of elements in a repeated extension. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public final <Type> int getExtensionCount(\n        final GeneratedExtension<MessageType, List<Type>> extension) {\n      verifyExtensionContainingType(extension);\n      final FieldDescriptor descriptor = extension.getDescriptor();\n      return extensions.getRepeatedFieldCount(descriptor);\n    }\n\n    /** Get the value of an extension. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public final <Type> Type getExtension(\n        final GeneratedExtension<MessageType, Type> extension) {\n      verifyExtensionContainingType(extension);\n      FieldDescriptor descriptor = extension.getDescriptor();\n      final Object value = extensions.getField(descriptor);\n      if (value == null) {\n        if (descriptor.isRepeated()) {\n          return (Type) Collections.emptyList();\n        } else if (descriptor.getJavaType() ==\n                   FieldDescriptor.JavaType.MESSAGE) {\n          return (Type) extension.getMessageDefaultInstance();\n        } else {\n          return (Type) extension.fromReflectionType(\n              descriptor.getDefaultValue());\n        }\n      } else {\n        return (Type) extension.fromReflectionType(value);\n      }\n    }\n\n    /** Get one element of a repeated extension. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public final <Type> Type getExtension(\n        final GeneratedExtension<MessageType, List<Type>> extension,\n        final int index) {\n      verifyExtensionContainingType(extension);\n      FieldDescriptor descriptor = extension.getDescriptor();\n      return (Type) extension.singularFromReflectionType(\n          extensions.getRepeatedField(descriptor, index));\n    }\n\n    /** Set the value of an extension. */\n    public final <Type> BuilderType setExtension(\n        final GeneratedExtension<MessageType, Type> extension,\n        final Type value) {\n      verifyExtensionContainingType(extension);\n      ensureExtensionsIsMutable();\n      final FieldDescriptor descriptor = extension.getDescriptor();\n      extensions.setField(descriptor, extension.toReflectionType(value));\n      onChanged();\n      return (BuilderType) this;\n    }\n\n    /** Set the value of one element of a repeated extension. */\n    public final <Type> BuilderType setExtension(\n        final GeneratedExtension<MessageType, List<Type>> extension,\n        final int index, final Type value) {\n      verifyExtensionContainingType(extension);\n      ensureExtensionsIsMutable();\n      final FieldDescriptor descriptor = extension.getDescriptor();\n      extensions.setRepeatedField(\n        descriptor, index,\n        extension.singularToReflectionType(value));\n      onChanged();\n      return (BuilderType) this;\n    }\n\n    /** Append a value to a repeated extension. */\n    public final <Type> BuilderType addExtension(\n        final GeneratedExtension<MessageType, List<Type>> extension,\n        final Type value) {\n      verifyExtensionContainingType(extension);\n      ensureExtensionsIsMutable();\n      final FieldDescriptor descriptor = extension.getDescriptor();\n      extensions.addRepeatedField(\n          descriptor, extension.singularToReflectionType(value));\n      onChanged();\n      return (BuilderType) this;\n    }\n\n    /** Clear an extension. */\n    public final <Type> BuilderType clearExtension(\n        final GeneratedExtension<MessageType, ?> extension) {\n      verifyExtensionContainingType(extension);\n      ensureExtensionsIsMutable();\n      extensions.clearField(extension.getDescriptor());\n      onChanged();\n      return (BuilderType) this;\n    }\n\n    /** Called by subclasses to check if all extensions are initialized. */\n    protected boolean extensionsAreInitialized() {\n      return extensions.isInitialized();\n    }\n\n    /**\n     * Called by the build code path to create a copy of the extensions for\n     * building the message.\n     */\n    private FieldSet<FieldDescriptor> buildExtensions() {\n      extensions.makeImmutable();\n      return extensions;\n    }\n\n    @Override\n    public boolean isInitialized() {\n      return super.isInitialized() && extensionsAreInitialized();\n    }\n\n    /**\n     * Called by subclasses to parse an unknown field or an extension.\n     * @return {@code true} unless the tag is an end-group tag.\n     */\n    @Override\n    protected boolean parseUnknownField(\n        final CodedInputStream input,\n        final UnknownFieldSet.Builder unknownFields,\n        final ExtensionRegistryLite extensionRegistry,\n        final int tag) throws IOException {\n      return AbstractMessage.Builder.mergeFieldFrom(\n        input, unknownFields, extensionRegistry, this, tag);\n    }\n\n    // ---------------------------------------------------------------\n    // Reflection\n\n    @Override\n    public Map<FieldDescriptor, Object> getAllFields() {\n      final Map<FieldDescriptor, Object> result = super.getAllFieldsMutable();\n      result.putAll(extensions.getAllFields());\n      return Collections.unmodifiableMap(result);\n    }\n\n    @Override\n    public Object getField(final FieldDescriptor field) {\n      if (field.isExtension()) {\n        verifyContainingType(field);\n        final Object value = extensions.getField(field);\n        if (value == null) {\n          if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n            // Lacking an ExtensionRegistry, we have no way to determine the\n            // extension's real type, so we return a DynamicMessage.\n            return DynamicMessage.getDefaultInstance(field.getMessageType());\n          } else {\n            return field.getDefaultValue();\n          }\n        } else {\n          return value;\n        }\n      } else {\n        return super.getField(field);\n      }\n    }\n\n    @Override\n    public int getRepeatedFieldCount(final FieldDescriptor field) {\n      if (field.isExtension()) {\n        verifyContainingType(field);\n        return extensions.getRepeatedFieldCount(field);\n      } else {\n        return super.getRepeatedFieldCount(field);\n      }\n    }\n\n    @Override\n    public Object getRepeatedField(final FieldDescriptor field,\n                                   final int index) {\n      if (field.isExtension()) {\n        verifyContainingType(field);\n        return extensions.getRepeatedField(field, index);\n      } else {\n        return super.getRepeatedField(field, index);\n      }\n    }\n\n    @Override\n    public boolean hasField(final FieldDescriptor field) {\n      if (field.isExtension()) {\n        verifyContainingType(field);\n        return extensions.hasField(field);\n      } else {\n        return super.hasField(field);\n      }\n    }\n\n    @Override\n    public BuilderType setField(final FieldDescriptor field,\n                                final Object value) {\n      if (field.isExtension()) {\n        verifyContainingType(field);\n        ensureExtensionsIsMutable();\n        extensions.setField(field, value);\n        onChanged();\n        return (BuilderType) this;\n      } else {\n        return super.setField(field, value);\n      }\n    }\n\n    @Override\n    public BuilderType clearField(final FieldDescriptor field) {\n      if (field.isExtension()) {\n        verifyContainingType(field);\n        ensureExtensionsIsMutable();\n        extensions.clearField(field);\n        onChanged();\n        return (BuilderType) this;\n      } else {\n        return super.clearField(field);\n      }\n    }\n\n    @Override\n    public BuilderType setRepeatedField(final FieldDescriptor field,\n                                        final int index, final Object value) {\n      if (field.isExtension()) {\n        verifyContainingType(field);\n        ensureExtensionsIsMutable();\n        extensions.setRepeatedField(field, index, value);\n        onChanged();\n        return (BuilderType) this;\n      } else {\n        return super.setRepeatedField(field, index, value);\n      }\n    }\n\n    @Override\n    public BuilderType addRepeatedField(final FieldDescriptor field,\n                                        final Object value) {\n      if (field.isExtension()) {\n        verifyContainingType(field);\n        ensureExtensionsIsMutable();\n        extensions.addRepeatedField(field, value);\n        onChanged();\n        return (BuilderType) this;\n      } else {\n        return super.addRepeatedField(field, value);\n      }\n    }\n\n    protected final void mergeExtensionFields(final ExtendableMessage other) {\n      ensureExtensionsIsMutable();\n      extensions.mergeFrom(other.extensions);\n      onChanged();\n    }\n\n    private void verifyContainingType(final FieldDescriptor field) {\n      if (field.getContainingType() != getDescriptorForType()) {\n        throw new IllegalArgumentException(\n          \"FieldDescriptor does not match message type.\");\n      }\n    }\n  }\n\n  // -----------------------------------------------------------------\n\n  /**\n   * Gets the descriptor for an extension. The implementation depends on whether\n   * the extension is scoped in the top level of a file or scoped in a Message.\n   */\n  private static interface ExtensionDescriptorRetriever {\n    FieldDescriptor getDescriptor();\n  }\n\n  /** For use by generated code only. */\n  public static <ContainingType extends Message, Type>\n      GeneratedExtension<ContainingType, Type>\n      newMessageScopedGeneratedExtension(final Message scope,\n                                         final int descriptorIndex,\n                                         final Class singularType,\n                                         final Message defaultInstance) {\n    // For extensions scoped within a Message, we use the Message to resolve\n    // the outer class's descriptor, from which the extension descriptor is\n    // obtained.\n    return new GeneratedExtension<ContainingType, Type>(\n        new ExtensionDescriptorRetriever() {\n          //@Override (Java 1.6 override semantics, but we must support 1.5)\n          public FieldDescriptor getDescriptor() {\n            return scope.getDescriptorForType().getExtensions()\n                .get(descriptorIndex);\n          }\n        },\n        singularType,\n        defaultInstance);\n  }\n\n  /** For use by generated code only. */\n  public static <ContainingType extends Message, Type>\n     GeneratedExtension<ContainingType, Type>\n     newFileScopedGeneratedExtension(final Class singularType,\n                                     final Message defaultInstance) {\n    // For extensions scoped within a file, we rely on the outer class's\n    // static initializer to call internalInit() on the extension when the\n    // descriptor is available.\n    return new GeneratedExtension<ContainingType, Type>(\n        null,  // ExtensionDescriptorRetriever is initialized in internalInit();\n        singularType,\n        defaultInstance);\n  }\n\n  /**\n   * Type used to represent generated extensions.  The protocol compiler\n   * generates a static singleton instance of this class for each extension.\n   *\n   * <p>For example, imagine you have the {@code .proto} file:\n   *\n   * <pre>\n   * option java_class = \"MyProto\";\n   *\n   * message Foo {\n   *   extensions 1000 to max;\n   * }\n   *\n   * extend Foo {\n   *   optional int32 bar;\n   * }\n   * </pre>\n   *\n   * <p>Then, {@code MyProto.Foo.bar} has type\n   * {@code GeneratedExtension<MyProto.Foo, Integer>}.\n   *\n   * <p>In general, users should ignore the details of this type, and simply use\n   * these static singletons as parameters to the extension accessors defined\n   * in {@link ExtendableMessage} and {@link ExtendableBuilder}.\n   */\n  public static final class GeneratedExtension<\n      ContainingType extends Message, Type> {\n    // TODO(kenton):  Find ways to avoid using Java reflection within this\n    //   class.  Also try to avoid suppressing unchecked warnings.\n\n    // We can't always initialize the descriptor of a GeneratedExtension when\n    // we first construct it due to initialization order difficulties (namely,\n    // the descriptor may not have been constructed yet, since it is often\n    // constructed by the initializer of a separate module).\n    //\n    // In the case of nested extensions, we initialize the\n    // ExtensionDescriptorRetriever with an instance that uses the scoping\n    // Message's default instance to retrieve the extension's descriptor.\n    //\n    // In the case of non-nested extensions, we initialize the\n    // ExtensionDescriptorRetriever to null and rely on the outer class's static\n    // initializer to call internalInit() after the descriptor has been parsed.\n    private GeneratedExtension(ExtensionDescriptorRetriever descriptorRetriever,\n                               Class singularType,\n                               Message messageDefaultInstance) {\n      if (Message.class.isAssignableFrom(singularType) &&\n          !singularType.isInstance(messageDefaultInstance)) {\n        throw new IllegalArgumentException(\n            \"Bad messageDefaultInstance for \" + singularType.getName());\n      }\n      this.descriptorRetriever = descriptorRetriever;\n      this.singularType = singularType;\n      this.messageDefaultInstance = messageDefaultInstance;\n\n      if (ProtocolMessageEnum.class.isAssignableFrom(singularType)) {\n        this.enumValueOf = getMethodOrDie(singularType, \"valueOf\",\n                                          EnumValueDescriptor.class);\n        this.enumGetValueDescriptor =\n            getMethodOrDie(singularType, \"getValueDescriptor\");\n      } else {\n        this.enumValueOf = null;\n        this.enumGetValueDescriptor = null;\n      }\n    }\n\n    /** For use by generated code only. */\n    public void internalInit(final FieldDescriptor descriptor) {\n      if (descriptorRetriever != null) {\n        throw new IllegalStateException(\"Already initialized.\");\n      }\n      descriptorRetriever = new ExtensionDescriptorRetriever() {\n          //@Override (Java 1.6 override semantics, but we must support 1.5)\n          public FieldDescriptor getDescriptor() {\n            return descriptor;\n          }\n        };\n    }\n\n    private ExtensionDescriptorRetriever descriptorRetriever;\n    private final Class singularType;\n    private final Message messageDefaultInstance;\n    private final Method enumValueOf;\n    private final Method enumGetValueDescriptor;\n\n    public FieldDescriptor getDescriptor() {\n      if (descriptorRetriever == null) {\n        throw new IllegalStateException(\n            \"getDescriptor() called before internalInit()\");\n      }\n      return descriptorRetriever.getDescriptor();\n    }\n\n    /**\n     * If the extension is an embedded message or group, returns the default\n     * instance of the message.\n     */\n    public Message getMessageDefaultInstance() {\n      return messageDefaultInstance;\n    }\n\n    /**\n     * Convert from the type used by the reflection accessors to the type used\n     * by native accessors.  E.g., for enums, the reflection accessors use\n     * EnumValueDescriptors but the native accessors use the generated enum\n     * type.\n     */\n    @SuppressWarnings(\"unchecked\")\n    private Object fromReflectionType(final Object value) {\n      FieldDescriptor descriptor = getDescriptor();\n      if (descriptor.isRepeated()) {\n        if (descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE ||\n            descriptor.getJavaType() == FieldDescriptor.JavaType.ENUM) {\n          // Must convert the whole list.\n          final List result = new ArrayList();\n          for (final Object element : (List) value) {\n            result.add(singularFromReflectionType(element));\n          }\n          return result;\n        } else {\n          return value;\n        }\n      } else {\n        return singularFromReflectionType(value);\n      }\n    }\n\n    /**\n     * Like {@link #fromReflectionType(Object)}, but if the type is a repeated\n     * type, this converts a single element.\n     */\n    private Object singularFromReflectionType(final Object value) {\n      FieldDescriptor descriptor = getDescriptor();\n      switch (descriptor.getJavaType()) {\n        case MESSAGE:\n          if (singularType.isInstance(value)) {\n            return value;\n          } else {\n            // It seems the copy of the embedded message stored inside the\n            // extended message is not of the exact type the user was\n            // expecting.  This can happen if a user defines a\n            // GeneratedExtension manually and gives it a different type.\n            // This should not happen in normal use.  But, to be nice, we'll\n            // copy the message to whatever type the caller was expecting.\n            return messageDefaultInstance.newBuilderForType()\n                           .mergeFrom((Message) value).build();\n          }\n        case ENUM:\n          return invokeOrDie(enumValueOf, null, (EnumValueDescriptor) value);\n        default:\n          return value;\n      }\n    }\n\n    /**\n     * Convert from the type used by the native accessors to the type used\n     * by reflection accessors.  E.g., for enums, the reflection accessors use\n     * EnumValueDescriptors but the native accessors use the generated enum\n     * type.\n     */\n    @SuppressWarnings(\"unchecked\")\n    private Object toReflectionType(final Object value) {\n      FieldDescriptor descriptor = getDescriptor();\n      if (descriptor.isRepeated()) {\n        if (descriptor.getJavaType() == FieldDescriptor.JavaType.ENUM) {\n          // Must convert the whole list.\n          final List result = new ArrayList();\n          for (final Object element : (List) value) {\n            result.add(singularToReflectionType(element));\n          }\n          return result;\n        } else {\n          return value;\n        }\n      } else {\n        return singularToReflectionType(value);\n      }\n    }\n\n    /**\n     * Like {@link #toReflectionType(Object)}, but if the type is a repeated\n     * type, this converts a single element.\n     */\n    private Object singularToReflectionType(final Object value) {\n      FieldDescriptor descriptor = getDescriptor();\n      switch (descriptor.getJavaType()) {\n        case ENUM:\n          return invokeOrDie(enumGetValueDescriptor, value);\n        default:\n          return value;\n      }\n    }\n  }\n\n  // =================================================================\n\n  /** Calls Class.getMethod and throws a RuntimeException if it fails. */\n  @SuppressWarnings(\"unchecked\")\n  private static Method getMethodOrDie(\n      final Class clazz, final String name, final Class... params) {\n    try {\n      return clazz.getMethod(name, params);\n    } catch (NoSuchMethodException e) {\n      throw new RuntimeException(\n        \"Generated message class \\\"\" + clazz.getName() +\n        \"\\\" missing method \\\"\" + name + \"\\\".\", e);\n    }\n  }\n\n  /** Calls invoke and throws a RuntimeException if it fails. */\n  private static Object invokeOrDie(\n      final Method method, final Object object, final Object... params) {\n    try {\n      return method.invoke(object, params);\n    } catch (IllegalAccessException e) {\n      throw new RuntimeException(\n        \"Couldn't use Java reflection to implement protocol message \" +\n        \"reflection.\", e);\n    } catch (InvocationTargetException e) {\n      final Throwable cause = e.getCause();\n      if (cause instanceof RuntimeException) {\n        throw (RuntimeException) cause;\n      } else if (cause instanceof Error) {\n        throw (Error) cause;\n      } else {\n        throw new RuntimeException(\n          \"Unexpected exception thrown by generated accessor method.\", cause);\n      }\n    }\n  }\n\n  /**\n   * Users should ignore this class.  This class provides the implementation\n   * with access to the fields of a message object using Java reflection.\n   */\n  public static final class FieldAccessorTable {\n\n    /**\n     * Construct a FieldAccessorTable for a particular message class.  Only\n     * one FieldAccessorTable should ever be constructed per class.\n     *\n     * @param descriptor     The type's descriptor.\n     * @param camelCaseNames The camelcase names of all fields in the message.\n     *                       These are used to derive the accessor method names.\n     * @param messageClass   The message type.\n     * @param builderClass   The builder type.\n     */\n    public FieldAccessorTable(\n        final Descriptor descriptor,\n        final String[] camelCaseNames,\n        final Class<? extends GeneratedMessage> messageClass,\n        final Class<? extends Builder> builderClass) {\n      this.descriptor = descriptor;\n      fields = new FieldAccessor[descriptor.getFields().size()];\n\n      for (int i = 0; i < fields.length; i++) {\n        final FieldDescriptor field = descriptor.getFields().get(i);\n        if (field.isRepeated()) {\n          if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n            fields[i] = new RepeatedMessageFieldAccessor(\n              field, camelCaseNames[i], messageClass, builderClass);\n          } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) {\n            fields[i] = new RepeatedEnumFieldAccessor(\n              field, camelCaseNames[i], messageClass, builderClass);\n          } else {\n            fields[i] = new RepeatedFieldAccessor(\n              field, camelCaseNames[i], messageClass, builderClass);\n          }\n        } else {\n          if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n            fields[i] = new SingularMessageFieldAccessor(\n              field, camelCaseNames[i], messageClass, builderClass);\n          } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) {\n            fields[i] = new SingularEnumFieldAccessor(\n              field, camelCaseNames[i], messageClass, builderClass);\n          } else {\n            fields[i] = new SingularFieldAccessor(\n              field, camelCaseNames[i], messageClass, builderClass);\n          }\n        }\n      }\n    }\n\n    private final Descriptor descriptor;\n    private final FieldAccessor[] fields;\n\n    /** Get the FieldAccessor for a particular field. */\n    private FieldAccessor getField(final FieldDescriptor field) {\n      if (field.getContainingType() != descriptor) {\n        throw new IllegalArgumentException(\n          \"FieldDescriptor does not match message type.\");\n      } else if (field.isExtension()) {\n        // If this type had extensions, it would subclass ExtendableMessage,\n        // which overrides the reflection interface to handle extensions.\n        throw new IllegalArgumentException(\n          \"This type does not have extensions.\");\n      }\n      return fields[field.getIndex()];\n    }\n\n    /**\n     * Abstract interface that provides access to a single field.  This is\n     * implemented differently depending on the field type and cardinality.\n     */\n    private interface FieldAccessor {\n      Object get(GeneratedMessage message);\n      Object get(GeneratedMessage.Builder builder);\n      void set(Builder builder, Object value);\n      Object getRepeated(GeneratedMessage message, int index);\n      Object getRepeated(GeneratedMessage.Builder builder, int index);\n      void setRepeated(Builder builder,\n                       int index, Object value);\n      void addRepeated(Builder builder, Object value);\n      boolean has(GeneratedMessage message);\n      boolean has(GeneratedMessage.Builder builder);\n      int getRepeatedCount(GeneratedMessage message);\n      int getRepeatedCount(GeneratedMessage.Builder builder);\n      void clear(Builder builder);\n      Message.Builder newBuilder();\n    }\n\n    // ---------------------------------------------------------------\n\n    private static class SingularFieldAccessor implements FieldAccessor {\n      SingularFieldAccessor(\n          final FieldDescriptor descriptor, final String camelCaseName,\n          final Class<? extends GeneratedMessage> messageClass,\n          final Class<? extends Builder> builderClass) {\n        getMethod = getMethodOrDie(messageClass, \"get\" + camelCaseName);\n        getMethodBuilder = getMethodOrDie(builderClass, \"get\" + camelCaseName);\n        type = getMethod.getReturnType();\n        setMethod = getMethodOrDie(builderClass, \"set\" + camelCaseName, type);\n        hasMethod =\n            getMethodOrDie(messageClass, \"has\" + camelCaseName);\n        hasMethodBuilder =\n            getMethodOrDie(builderClass, \"has\" + camelCaseName);\n        clearMethod = getMethodOrDie(builderClass, \"clear\" + camelCaseName);\n      }\n\n      // Note:  We use Java reflection to call public methods rather than\n      //   access private fields directly as this avoids runtime security\n      //   checks.\n      protected final Class<?> type;\n      protected final Method getMethod;\n      protected final Method getMethodBuilder;\n      protected final Method setMethod;\n      protected final Method hasMethod;\n      protected final Method hasMethodBuilder;\n      protected final Method clearMethod;\n\n      public Object get(final GeneratedMessage message) {\n        return invokeOrDie(getMethod, message);\n      }\n      public Object get(GeneratedMessage.Builder builder) {\n        return invokeOrDie(getMethodBuilder, builder);\n      }\n      public void set(final Builder builder, final Object value) {\n        invokeOrDie(setMethod, builder, value);\n      }\n      public Object getRepeated(final GeneratedMessage message,\n                                final int index) {\n        throw new UnsupportedOperationException(\n          \"getRepeatedField() called on a singular field.\");\n      }\n      public Object getRepeated(GeneratedMessage.Builder builder, int index) {\n        throw new UnsupportedOperationException(\n          \"getRepeatedField() called on a singular field.\");\n      }\n      public void setRepeated(final Builder builder,\n                              final int index, final Object value) {\n        throw new UnsupportedOperationException(\n          \"setRepeatedField() called on a singular field.\");\n      }\n      public void addRepeated(final Builder builder, final Object value) {\n        throw new UnsupportedOperationException(\n          \"addRepeatedField() called on a singular field.\");\n      }\n      public boolean has(final GeneratedMessage message) {\n        return (Boolean) invokeOrDie(hasMethod, message);\n      }\n      public boolean has(GeneratedMessage.Builder builder) {\n        return (Boolean) invokeOrDie(hasMethodBuilder, builder);\n      }\n      public int getRepeatedCount(final GeneratedMessage message) {\n        throw new UnsupportedOperationException(\n          \"getRepeatedFieldSize() called on a singular field.\");\n      }\n      public int getRepeatedCount(GeneratedMessage.Builder builder) {\n        throw new UnsupportedOperationException(\n          \"getRepeatedFieldSize() called on a singular field.\");\n      }\n      public void clear(final Builder builder) {\n        invokeOrDie(clearMethod, builder);\n      }\n      public Message.Builder newBuilder() {\n        throw new UnsupportedOperationException(\n          \"newBuilderForField() called on a non-Message type.\");\n      }\n    }\n\n    private static class RepeatedFieldAccessor implements FieldAccessor {\n      protected final Class type;\n      protected final Method getMethod;\n      protected final Method getMethodBuilder;\n      protected final Method getRepeatedMethod;\n      protected final Method getRepeatedMethodBuilder;\n      protected final Method setRepeatedMethod;\n      protected final Method addRepeatedMethod;\n      protected final Method getCountMethod;\n      protected final Method getCountMethodBuilder;\n      protected final Method clearMethod;\n\n      RepeatedFieldAccessor(\n          final FieldDescriptor descriptor, final String camelCaseName,\n          final Class<? extends GeneratedMessage> messageClass,\n          final Class<? extends Builder> builderClass) {\n        getMethod = getMethodOrDie(messageClass,\n                                   \"get\" + camelCaseName + \"List\");\n        getMethodBuilder = getMethodOrDie(builderClass,\n                                   \"get\" + camelCaseName + \"List\");\n\n\n        getRepeatedMethod =\n            getMethodOrDie(messageClass, \"get\" + camelCaseName, Integer.TYPE);\n        getRepeatedMethodBuilder =\n            getMethodOrDie(builderClass, \"get\" + camelCaseName, Integer.TYPE);\n        type = getRepeatedMethod.getReturnType();\n        setRepeatedMethod =\n            getMethodOrDie(builderClass, \"set\" + camelCaseName,\n                           Integer.TYPE, type);\n        addRepeatedMethod =\n            getMethodOrDie(builderClass, \"add\" + camelCaseName, type);\n        getCountMethod =\n            getMethodOrDie(messageClass, \"get\" + camelCaseName + \"Count\");\n        getCountMethodBuilder =\n            getMethodOrDie(builderClass, \"get\" + camelCaseName + \"Count\");\n\n        clearMethod = getMethodOrDie(builderClass, \"clear\" + camelCaseName);\n      }\n\n      public Object get(final GeneratedMessage message) {\n        return invokeOrDie(getMethod, message);\n      }\n      public Object get(GeneratedMessage.Builder builder) {\n        return invokeOrDie(getMethodBuilder, builder);\n      }\n      public void set(final Builder builder, final Object value) {\n        // Add all the elements individually.  This serves two purposes:\n        // 1) Verifies that each element has the correct type.\n        // 2) Insures that the caller cannot modify the list later on and\n        //    have the modifications be reflected in the message.\n        clear(builder);\n        for (final Object element : (List<?>) value) {\n          addRepeated(builder, element);\n        }\n      }\n      public Object getRepeated(final GeneratedMessage message,\n                                final int index) {\n        return invokeOrDie(getRepeatedMethod, message, index);\n      }\n      public Object getRepeated(GeneratedMessage.Builder builder, int index) {\n        return invokeOrDie(getRepeatedMethodBuilder, builder, index);\n      }\n      public void setRepeated(final Builder builder,\n                              final int index, final Object value) {\n        invokeOrDie(setRepeatedMethod, builder, index, value);\n      }\n      public void addRepeated(final Builder builder, final Object value) {\n        invokeOrDie(addRepeatedMethod, builder, value);\n      }\n      public boolean has(final GeneratedMessage message) {\n        throw new UnsupportedOperationException(\n          \"hasField() called on a singular field.\");\n      }\n      public boolean has(GeneratedMessage.Builder builder) {\n        throw new UnsupportedOperationException(\n          \"hasField() called on a singular field.\");\n      }\n      public int getRepeatedCount(final GeneratedMessage message) {\n        return (Integer) invokeOrDie(getCountMethod, message);\n      }\n      public int getRepeatedCount(GeneratedMessage.Builder builder) {\n        return (Integer) invokeOrDie(getCountMethodBuilder, builder);\n      }\n      public void clear(final Builder builder) {\n        invokeOrDie(clearMethod, builder);\n      }\n      public Message.Builder newBuilder() {\n        throw new UnsupportedOperationException(\n          \"newBuilderForField() called on a non-Message type.\");\n      }\n    }\n\n    // ---------------------------------------------------------------\n\n    private static final class SingularEnumFieldAccessor\n        extends SingularFieldAccessor {\n      SingularEnumFieldAccessor(\n          final FieldDescriptor descriptor, final String camelCaseName,\n          final Class<? extends GeneratedMessage> messageClass,\n          final Class<? extends Builder> builderClass) {\n        super(descriptor, camelCaseName, messageClass, builderClass);\n\n        valueOfMethod = getMethodOrDie(type, \"valueOf\",\n                                       EnumValueDescriptor.class);\n        getValueDescriptorMethod =\n          getMethodOrDie(type, \"getValueDescriptor\");\n      }\n\n      private Method valueOfMethod;\n      private Method getValueDescriptorMethod;\n\n      @Override\n      public Object get(final GeneratedMessage message) {\n        return invokeOrDie(getValueDescriptorMethod, super.get(message));\n      }\n\n      @Override\n      public Object get(final GeneratedMessage.Builder builder) {\n        return invokeOrDie(getValueDescriptorMethod, super.get(builder));\n      }\n\n      @Override\n      public void set(final Builder builder, final Object value) {\n        super.set(builder, invokeOrDie(valueOfMethod, null, value));\n      }\n    }\n\n    private static final class RepeatedEnumFieldAccessor\n        extends RepeatedFieldAccessor {\n      RepeatedEnumFieldAccessor(\n          final FieldDescriptor descriptor, final String camelCaseName,\n          final Class<? extends GeneratedMessage> messageClass,\n          final Class<? extends Builder> builderClass) {\n        super(descriptor, camelCaseName, messageClass, builderClass);\n\n        valueOfMethod = getMethodOrDie(type, \"valueOf\",\n                                       EnumValueDescriptor.class);\n        getValueDescriptorMethod =\n          getMethodOrDie(type, \"getValueDescriptor\");\n      }\n\n      private final Method valueOfMethod;\n      private final Method getValueDescriptorMethod;\n\n      @Override\n      @SuppressWarnings(\"unchecked\")\n      public Object get(final GeneratedMessage message) {\n        final List newList = new ArrayList();\n        for (final Object element : (List) super.get(message)) {\n          newList.add(invokeOrDie(getValueDescriptorMethod, element));\n        }\n        return Collections.unmodifiableList(newList);\n      }\n\n      @Override\n      @SuppressWarnings(\"unchecked\")\n      public Object get(final GeneratedMessage.Builder builder) {\n        final List newList = new ArrayList();\n        for (final Object element : (List) super.get(builder)) {\n          newList.add(invokeOrDie(getValueDescriptorMethod, element));\n        }\n        return Collections.unmodifiableList(newList);\n      }\n\n      @Override\n      public Object getRepeated(final GeneratedMessage message,\n                                final int index) {\n        return invokeOrDie(getValueDescriptorMethod,\n          super.getRepeated(message, index));\n      }\n      @Override\n      public Object getRepeated(final GeneratedMessage.Builder builder,\n                                final int index) {\n        return invokeOrDie(getValueDescriptorMethod,\n          super.getRepeated(builder, index));\n      }\n      @Override\n      public void setRepeated(final Builder builder,\n                              final int index, final Object value) {\n        super.setRepeated(builder, index, invokeOrDie(valueOfMethod, null,\n                          value));\n      }\n      @Override\n      public void addRepeated(final Builder builder, final Object value) {\n        super.addRepeated(builder, invokeOrDie(valueOfMethod, null, value));\n      }\n    }\n\n    // ---------------------------------------------------------------\n\n    private static final class SingularMessageFieldAccessor\n        extends SingularFieldAccessor {\n      SingularMessageFieldAccessor(\n          final FieldDescriptor descriptor, final String camelCaseName,\n          final Class<? extends GeneratedMessage> messageClass,\n          final Class<? extends Builder> builderClass) {\n        super(descriptor, camelCaseName, messageClass, builderClass);\n\n        newBuilderMethod = getMethodOrDie(type, \"newBuilder\");\n      }\n\n      private final Method newBuilderMethod;\n\n      private Object coerceType(final Object value) {\n        if (type.isInstance(value)) {\n          return value;\n        } else {\n          // The value is not the exact right message type.  However, if it\n          // is an alternative implementation of the same type -- e.g. a\n          // DynamicMessage -- we should accept it.  In this case we can make\n          // a copy of the message.\n          return ((Message.Builder) invokeOrDie(newBuilderMethod, null))\n                  .mergeFrom((Message) value).build();\n        }\n      }\n\n      @Override\n      public void set(final Builder builder, final Object value) {\n        super.set(builder, coerceType(value));\n      }\n      @Override\n      public Message.Builder newBuilder() {\n        return (Message.Builder) invokeOrDie(newBuilderMethod, null);\n      }\n    }\n\n    private static final class RepeatedMessageFieldAccessor\n        extends RepeatedFieldAccessor {\n      RepeatedMessageFieldAccessor(\n          final FieldDescriptor descriptor, final String camelCaseName,\n          final Class<? extends GeneratedMessage> messageClass,\n          final Class<? extends Builder> builderClass) {\n        super(descriptor, camelCaseName, messageClass, builderClass);\n\n        newBuilderMethod = getMethodOrDie(type, \"newBuilder\");\n      }\n\n      private final Method newBuilderMethod;\n\n      private Object coerceType(final Object value) {\n        if (type.isInstance(value)) {\n          return value;\n        } else {\n          // The value is not the exact right message type.  However, if it\n          // is an alternative implementation of the same type -- e.g. a\n          // DynamicMessage -- we should accept it.  In this case we can make\n          // a copy of the message.\n          return ((Message.Builder) invokeOrDie(newBuilderMethod, null))\n                  .mergeFrom((Message) value).build();\n        }\n      }\n\n      @Override\n      public void setRepeated(final Builder builder,\n                              final int index, final Object value) {\n        super.setRepeated(builder, index, coerceType(value));\n      }\n      @Override\n      public void addRepeated(final Builder builder, final Object value) {\n        super.addRepeated(builder, coerceType(value));\n      }\n      @Override\n      public Message.Builder newBuilder() {\n        return (Message.Builder) invokeOrDie(newBuilderMethod, null);\n      }\n    }\n  }\n\n  /**\n   * Replaces this object in the output stream with a serialized form.\n   * Part of Java's serialization magic.  Generated sub-classes must override\n   * this method by calling <code>return super.writeReplace();</code>\n   * @return a SerializedForm of this message\n   */\n  protected Object writeReplace() throws ObjectStreamException {\n    return new GeneratedMessageLite.SerializedForm(this);\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.io.IOException;\nimport java.io.ObjectStreamException;\nimport java.io.Serializable;\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect.Method;\nimport java.util.Collections;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Lite version of {@link GeneratedMessage}.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic abstract class GeneratedMessageLite extends AbstractMessageLite\n    implements Serializable {\n  private static final long serialVersionUID = 1L;\n\n  protected GeneratedMessageLite() {\n  }\n\n  protected GeneratedMessageLite(Builder builder) {\n  }\n\n  @SuppressWarnings(\"unchecked\")\n  public abstract static class Builder<MessageType extends GeneratedMessageLite,\n                                       BuilderType extends Builder>\n      extends AbstractMessageLite.Builder<BuilderType> {\n    protected Builder() {}\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public BuilderType clear() {\n      return (BuilderType) this;\n    }\n\n    // This is implemented here only to work around an apparent bug in the\n    // Java compiler and/or build system.  See bug #1898463.  The mere presence\n    // of this dummy clone() implementation makes it go away.\n    @Override\n    public BuilderType clone() {\n      throw new UnsupportedOperationException(\n          \"This is supposed to be overridden by subclasses.\");\n    }\n\n    /** All subclasses implement this. */\n    public abstract BuilderType mergeFrom(MessageType message);\n\n    // Defined here for return type covariance.\n    public abstract MessageType getDefaultInstanceForType();\n\n    /**\n     * Called by subclasses to parse an unknown field.\n     * @return {@code true} unless the tag is an end-group tag.\n     */\n    protected boolean parseUnknownField(\n        final CodedInputStream input,\n        final ExtensionRegistryLite extensionRegistry,\n        final int tag) throws IOException {\n      return input.skipField(tag);\n    }\n  }\n\n  // =================================================================\n  // Extensions-related stuff\n\n  /**\n   * Lite equivalent of {@link com.google.protobuf.GeneratedMessage.ExtendableMessageOrBuilder}.\n   */\n  public interface ExtendableMessageOrBuilder<\n      MessageType extends ExtendableMessage> extends MessageLiteOrBuilder {\n\n    /** Check if a singular extension is present. */\n    <Type> boolean hasExtension(\n        GeneratedExtension<MessageType, Type> extension);\n\n    /** Get the number of elements in a repeated extension. */\n    <Type> int getExtensionCount(\n        GeneratedExtension<MessageType, List<Type>> extension);\n\n    /** Get the value of an extension. */\n    <Type> Type getExtension(GeneratedExtension<MessageType, Type> extension);\n\n    /** Get one element of a repeated extension. */\n    <Type> Type getExtension(\n        GeneratedExtension<MessageType, List<Type>> extension,\n        int index);\n  }\n\n  /**\n   * Lite equivalent of {@link GeneratedMessage.ExtendableMessage}.\n   */\n  public abstract static class ExtendableMessage<\n        MessageType extends ExtendableMessage<MessageType>>\n      extends GeneratedMessageLite\n      implements ExtendableMessageOrBuilder<MessageType> {\n\n    private final FieldSet<ExtensionDescriptor> extensions;\n\n    protected ExtendableMessage() {\n      this.extensions = FieldSet.newFieldSet();\n    }\n\n    protected ExtendableMessage(ExtendableBuilder<MessageType, ?> builder) {\n      this.extensions = builder.buildExtensions();\n    }\n\n    private void verifyExtensionContainingType(\n        final GeneratedExtension<MessageType, ?> extension) {\n      if (extension.getContainingTypeDefaultInstance() !=\n          getDefaultInstanceForType()) {\n        // This can only happen if someone uses unchecked operations.\n        throw new IllegalArgumentException(\n          \"This extension is for a different message type.  Please make \" +\n          \"sure that you are not suppressing any generics type warnings.\");\n      }\n    }\n\n    /** Check if a singular extension is present. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public final <Type> boolean hasExtension(\n        final GeneratedExtension<MessageType, Type> extension) {\n      verifyExtensionContainingType(extension);\n      return extensions.hasField(extension.descriptor);\n    }\n\n    /** Get the number of elements in a repeated extension. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public final <Type> int getExtensionCount(\n        final GeneratedExtension<MessageType, List<Type>> extension) {\n      verifyExtensionContainingType(extension);\n      return extensions.getRepeatedFieldCount(extension.descriptor);\n    }\n\n    /** Get the value of an extension. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    @SuppressWarnings(\"unchecked\")\n    public final <Type> Type getExtension(\n        final GeneratedExtension<MessageType, Type> extension) {\n      verifyExtensionContainingType(extension);\n      final Object value = extensions.getField(extension.descriptor);\n      if (value == null) {\n        return extension.defaultValue;\n      } else {\n        return (Type) value;\n      }\n    }\n\n    /** Get one element of a repeated extension. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    @SuppressWarnings(\"unchecked\")\n    public final <Type> Type getExtension(\n        final GeneratedExtension<MessageType, List<Type>> extension,\n        final int index) {\n      verifyExtensionContainingType(extension);\n      return (Type) extensions.getRepeatedField(extension.descriptor, index);\n    }\n\n    /** Called by subclasses to check if all extensions are initialized. */\n    protected boolean extensionsAreInitialized() {\n      return extensions.isInitialized();\n    }\n\n    /**\n     * Used by subclasses to serialize extensions.  Extension ranges may be\n     * interleaved with field numbers, but we must write them in canonical\n     * (sorted by field number) order.  ExtensionWriter helps us write\n     * individual ranges of extensions at once.\n     */\n    protected class ExtensionWriter {\n      // Imagine how much simpler this code would be if Java iterators had\n      // a way to get the next element without advancing the iterator.\n\n      private final Iterator<Map.Entry<ExtensionDescriptor, Object>> iter =\n            extensions.iterator();\n      private Map.Entry<ExtensionDescriptor, Object> next;\n      private final boolean messageSetWireFormat;\n\n      private ExtensionWriter(boolean messageSetWireFormat) {\n        if (iter.hasNext()) {\n          next = iter.next();\n        }\n        this.messageSetWireFormat = messageSetWireFormat;\n      }\n\n      public void writeUntil(final int end, final CodedOutputStream output)\n                             throws IOException {\n        while (next != null && next.getKey().getNumber() < end) {\n          ExtensionDescriptor extension = next.getKey();\n          if (messageSetWireFormat && extension.getLiteJavaType() ==\n                  WireFormat.JavaType.MESSAGE &&\n              !extension.isRepeated()) {\n            output.writeMessageSetExtension(extension.getNumber(),\n                                            (MessageLite) next.getValue());\n          } else {\n            FieldSet.writeField(extension, next.getValue(), output);\n          }\n          if (iter.hasNext()) {\n            next = iter.next();\n          } else {\n            next = null;\n          }\n        }\n      }\n    }\n\n    protected ExtensionWriter newExtensionWriter() {\n      return new ExtensionWriter(false);\n    }\n    protected ExtensionWriter newMessageSetExtensionWriter() {\n      return new ExtensionWriter(true);\n    }\n\n    /** Called by subclasses to compute the size of extensions. */\n    protected int extensionsSerializedSize() {\n      return extensions.getSerializedSize();\n    }\n    protected int extensionsSerializedSizeAsMessageSet() {\n      return extensions.getMessageSetSerializedSize();\n    }\n  }\n\n  /**\n   * Lite equivalent of {@link GeneratedMessage.ExtendableBuilder}.\n   */\n  @SuppressWarnings(\"unchecked\")\n  public abstract static class ExtendableBuilder<\n        MessageType extends ExtendableMessage<MessageType>,\n        BuilderType extends ExtendableBuilder<MessageType, BuilderType>>\n      extends Builder<MessageType, BuilderType>\n      implements ExtendableMessageOrBuilder<MessageType> {\n    protected ExtendableBuilder() {}\n\n    private FieldSet<ExtensionDescriptor> extensions = FieldSet.emptySet();\n    private boolean extensionsIsMutable;\n\n    @Override\n    public BuilderType clear() {\n      extensions.clear();\n      extensionsIsMutable = false;\n      return super.clear();\n    }\n\n    private void ensureExtensionsIsMutable() {\n      if (!extensionsIsMutable) {\n        extensions = extensions.clone();\n        extensionsIsMutable = true;\n      }\n    }\n\n    /**\n     * Called by the build code path to create a copy of the extensions for\n     * building the message.\n     */\n    private FieldSet<ExtensionDescriptor> buildExtensions() {\n      extensions.makeImmutable();\n      extensionsIsMutable = false;\n      return extensions;\n    }\n\n    private void verifyExtensionContainingType(\n        final GeneratedExtension<MessageType, ?> extension) {\n      if (extension.getContainingTypeDefaultInstance() !=\n          getDefaultInstanceForType()) {\n        // This can only happen if someone uses unchecked operations.\n        throw new IllegalArgumentException(\n          \"This extension is for a different message type.  Please make \" +\n          \"sure that you are not suppressing any generics type warnings.\");\n      }\n    }\n\n    /** Check if a singular extension is present. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public final <Type> boolean hasExtension(\n        final GeneratedExtension<MessageType, Type> extension) {\n      verifyExtensionContainingType(extension);\n      return extensions.hasField(extension.descriptor);\n    }\n\n    /** Get the number of elements in a repeated extension. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public final <Type> int getExtensionCount(\n        final GeneratedExtension<MessageType, List<Type>> extension) {\n      verifyExtensionContainingType(extension);\n      return extensions.getRepeatedFieldCount(extension.descriptor);\n    }\n\n    /** Get the value of an extension. */\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    @SuppressWarnings(\"unchecked\")\n    public final <Type> Type getExtension(\n        final GeneratedExtension<MessageType, Type> extension) {\n      verifyExtensionContainingType(extension);\n      final Object value = extensions.getField(extension.descriptor);\n      if (value == null) {\n        return extension.defaultValue;\n      } else {\n        return (Type) value;\n      }\n    }\n\n    /** Get one element of a repeated extension. */\n    @SuppressWarnings(\"unchecked\")\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public final <Type> Type getExtension(\n        final GeneratedExtension<MessageType, List<Type>> extension,\n        final int index) {\n      verifyExtensionContainingType(extension);\n      return (Type) extensions.getRepeatedField(extension.descriptor, index);\n    }\n\n    // This is implemented here only to work around an apparent bug in the\n    // Java compiler and/or build system.  See bug #1898463.  The mere presence\n    // of this dummy clone() implementation makes it go away.\n    @Override\n    public BuilderType clone() {\n      throw new UnsupportedOperationException(\n          \"This is supposed to be overridden by subclasses.\");\n    }\n\n    /** Set the value of an extension. */\n    public final <Type> BuilderType setExtension(\n        final GeneratedExtension<MessageType, Type> extension,\n        final Type value) {\n      verifyExtensionContainingType(extension);\n      ensureExtensionsIsMutable();\n      extensions.setField(extension.descriptor, value);\n      return (BuilderType) this;\n    }\n\n    /** Set the value of one element of a repeated extension. */\n    public final <Type> BuilderType setExtension(\n        final GeneratedExtension<MessageType, List<Type>> extension,\n        final int index, final Type value) {\n      verifyExtensionContainingType(extension);\n      ensureExtensionsIsMutable();\n      extensions.setRepeatedField(extension.descriptor, index, value);\n      return (BuilderType) this;\n    }\n\n    /** Append a value to a repeated extension. */\n    public final <Type> BuilderType addExtension(\n        final GeneratedExtension<MessageType, List<Type>> extension,\n        final Type value) {\n      verifyExtensionContainingType(extension);\n      ensureExtensionsIsMutable();\n      extensions.addRepeatedField(extension.descriptor, value);\n      return (BuilderType) this;\n    }\n\n    /** Clear an extension. */\n    public final <Type> BuilderType clearExtension(\n        final GeneratedExtension<MessageType, ?> extension) {\n      verifyExtensionContainingType(extension);\n      ensureExtensionsIsMutable();\n      extensions.clearField(extension.descriptor);\n      return (BuilderType) this;\n    }\n\n    /** Called by subclasses to check if all extensions are initialized. */\n    protected boolean extensionsAreInitialized() {\n      return extensions.isInitialized();\n    }\n\n    /**\n     * Called by subclasses to parse an unknown field or an extension.\n     * @return {@code true} unless the tag is an end-group tag.\n     */\n    @Override\n    protected boolean parseUnknownField(\n        final CodedInputStream input,\n        final ExtensionRegistryLite extensionRegistry,\n        final int tag) throws IOException {\n      final int wireType = WireFormat.getTagWireType(tag);\n      final int fieldNumber = WireFormat.getTagFieldNumber(tag);\n\n      final GeneratedExtension<MessageType, ?> extension =\n        extensionRegistry.findLiteExtensionByNumber(\n            getDefaultInstanceForType(), fieldNumber);\n\n      boolean unknown = false;\n      boolean packed = false;\n      if (extension == null) {\n        unknown = true;  // Unknown field.\n      } else if (wireType == FieldSet.getWireFormatForFieldType(\n                   extension.descriptor.getLiteType(),\n                   false  /* isPacked */)) {\n        packed = false;  // Normal, unpacked value.\n      } else if (extension.descriptor.isRepeated &&\n                 extension.descriptor.type.isPackable() &&\n                 wireType == FieldSet.getWireFormatForFieldType(\n                   extension.descriptor.getLiteType(),\n                   true  /* isPacked */)) {\n        packed = true;  // Packed value.\n      } else {\n        unknown = true;  // Wrong wire type.\n      }\n\n      if (unknown) {  // Unknown field or wrong wire type.  Skip.\n        return input.skipField(tag);\n      }\n\n      if (packed) {\n        final int length = input.readRawVarint32();\n        final int limit = input.pushLimit(length);\n        if (extension.descriptor.getLiteType() == WireFormat.FieldType.ENUM) {\n          while (input.getBytesUntilLimit() > 0) {\n            final int rawValue = input.readEnum();\n            final Object value =\n                extension.descriptor.getEnumType().findValueByNumber(rawValue);\n            if (value == null) {\n              // If the number isn't recognized as a valid value for this\n              // enum, drop it (don't even add it to unknownFields).\n              return true;\n            }\n            ensureExtensionsIsMutable();\n            extensions.addRepeatedField(extension.descriptor, value);\n          }\n        } else {\n          while (input.getBytesUntilLimit() > 0) {\n            final Object value =\n              FieldSet.readPrimitiveField(input,\n                                          extension.descriptor.getLiteType());\n            ensureExtensionsIsMutable();\n            extensions.addRepeatedField(extension.descriptor, value);\n          }\n        }\n        input.popLimit(limit);\n      } else {\n        final Object value;\n        switch (extension.descriptor.getLiteJavaType()) {\n          case MESSAGE: {\n            MessageLite.Builder subBuilder = null;\n            if (!extension.descriptor.isRepeated()) {\n              MessageLite existingValue =\n                  (MessageLite) extensions.getField(extension.descriptor);\n              if (existingValue != null) {\n                subBuilder = existingValue.toBuilder();\n              }\n            }\n            if (subBuilder == null) {\n              subBuilder = extension.messageDefaultInstance.newBuilderForType();\n            }\n            if (extension.descriptor.getLiteType() ==\n                WireFormat.FieldType.GROUP) {\n              input.readGroup(extension.getNumber(),\n                              subBuilder, extensionRegistry);\n            } else {\n              input.readMessage(subBuilder, extensionRegistry);\n            }\n            value = subBuilder.build();\n            break;\n          }\n          case ENUM:\n            final int rawValue = input.readEnum();\n            value = extension.descriptor.getEnumType()\n                             .findValueByNumber(rawValue);\n            // If the number isn't recognized as a valid value for this enum,\n            // drop it.\n            if (value == null) {\n              return true;\n            }\n            break;\n          default:\n            value = FieldSet.readPrimitiveField(input,\n                extension.descriptor.getLiteType());\n            break;\n        }\n\n        if (extension.descriptor.isRepeated()) {\n          ensureExtensionsIsMutable();\n          extensions.addRepeatedField(extension.descriptor, value);\n        } else {\n          ensureExtensionsIsMutable();\n          extensions.setField(extension.descriptor, value);\n        }\n      }\n\n      return true;\n    }\n\n    protected final void mergeExtensionFields(final MessageType other) {\n      ensureExtensionsIsMutable();\n      extensions.mergeFrom(((ExtendableMessage) other).extensions);\n    }\n  }\n\n  // -----------------------------------------------------------------\n\n  /** For use by generated code only. */\n  public static <ContainingType extends MessageLite, Type>\n      GeneratedExtension<ContainingType, Type>\n          newSingularGeneratedExtension(\n              final ContainingType containingTypeDefaultInstance,\n              final Type defaultValue,\n              final MessageLite messageDefaultInstance,\n              final Internal.EnumLiteMap<?> enumTypeMap,\n              final int number,\n              final WireFormat.FieldType type) {\n    return new GeneratedExtension<ContainingType, Type>(\n        containingTypeDefaultInstance,\n        defaultValue,\n        messageDefaultInstance,\n        new ExtensionDescriptor(enumTypeMap, number, type,\n                                false /* isRepeated */,\n                                false /* isPacked */));\n  }\n\n  /** For use by generated code only. */\n  public static <ContainingType extends MessageLite, Type>\n      GeneratedExtension<ContainingType, Type>\n          newRepeatedGeneratedExtension(\n              final ContainingType containingTypeDefaultInstance,\n              final MessageLite messageDefaultInstance,\n              final Internal.EnumLiteMap<?> enumTypeMap,\n              final int number,\n              final WireFormat.FieldType type,\n              final boolean isPacked) {\n    @SuppressWarnings(\"unchecked\")  // Subclasses ensure Type is a List\n    Type emptyList = (Type) Collections.emptyList();\n    return new GeneratedExtension<ContainingType, Type>(\n        containingTypeDefaultInstance,\n        emptyList,\n        messageDefaultInstance,\n        new ExtensionDescriptor(\n            enumTypeMap, number, type, true /* isRepeated */, isPacked));\n  }\n\n  private static final class ExtensionDescriptor\n      implements FieldSet.FieldDescriptorLite<\n        ExtensionDescriptor> {\n    private ExtensionDescriptor(\n        final Internal.EnumLiteMap<?> enumTypeMap,\n        final int number,\n        final WireFormat.FieldType type,\n        final boolean isRepeated,\n        final boolean isPacked) {\n      this.enumTypeMap = enumTypeMap;\n      this.number = number;\n      this.type = type;\n      this.isRepeated = isRepeated;\n      this.isPacked = isPacked;\n    }\n\n    private final Internal.EnumLiteMap<?> enumTypeMap;\n    private final int number;\n    private final WireFormat.FieldType type;\n    private final boolean isRepeated;\n    private final boolean isPacked;\n\n    public int getNumber() {\n      return number;\n    }\n\n    public WireFormat.FieldType getLiteType() {\n      return type;\n    }\n\n    public WireFormat.JavaType getLiteJavaType() {\n      return type.getJavaType();\n    }\n\n    public boolean isRepeated() {\n      return isRepeated;\n    }\n\n    public boolean isPacked() {\n      return isPacked;\n    }\n\n    public Internal.EnumLiteMap<?> getEnumType() {\n      return enumTypeMap;\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public MessageLite.Builder internalMergeFrom(\n        MessageLite.Builder to, MessageLite from) {\n      return ((Builder) to).mergeFrom((GeneratedMessageLite) from);\n    }\n\n    public int compareTo(ExtensionDescriptor other) {\n      return number - other.number;\n    }\n  }\n\n  /**\n   * Lite equivalent to {@link GeneratedMessage.GeneratedExtension}.\n   *\n   * Users should ignore the contents of this class and only use objects of\n   * this type as parameters to extension accessors and ExtensionRegistry.add().\n   */\n  public static final class GeneratedExtension<\n      ContainingType extends MessageLite, Type> {\n\n    private GeneratedExtension(\n        final ContainingType containingTypeDefaultInstance,\n        final Type defaultValue,\n        final MessageLite messageDefaultInstance,\n        final ExtensionDescriptor descriptor) {\n      // Defensive checks to verify the correct initialization order of\n      // GeneratedExtensions and their related GeneratedMessages.\n      if (containingTypeDefaultInstance == null) {\n        throw new IllegalArgumentException(\n            \"Null containingTypeDefaultInstance\");\n      }\n      if (descriptor.getLiteType() == WireFormat.FieldType.MESSAGE &&\n          messageDefaultInstance == null) {\n        throw new IllegalArgumentException(\n            \"Null messageDefaultInstance\");\n      }\n      this.containingTypeDefaultInstance = containingTypeDefaultInstance;\n      this.defaultValue = defaultValue;\n      this.messageDefaultInstance = messageDefaultInstance;\n      this.descriptor = descriptor;\n    }\n\n    private final ContainingType containingTypeDefaultInstance;\n    private final Type defaultValue;\n    private final MessageLite messageDefaultInstance;\n    private final ExtensionDescriptor descriptor;\n\n    /**\n     * Default instance of the type being extended, used to identify that type.\n     */\n    public ContainingType getContainingTypeDefaultInstance() {\n      return containingTypeDefaultInstance;\n    }\n\n    /** Get the field number. */\n    public int getNumber() {\n      return descriptor.getNumber();\n    }\n\n    /**\n     * If the extension is an embedded message, this is the default instance of\n     * that type.\n     */\n    public MessageLite getMessageDefaultInstance() {\n      return messageDefaultInstance;\n    }\n  }\n\n  /**\n   * A serialized (serializable) form of the generated message.  Stores the\n   * message as a class name and a byte array.\n   */\n  static final class SerializedForm implements Serializable {\n    private static final long serialVersionUID = 0L;\n\n    private String messageClassName;\n    private byte[] asBytes;\n\n    /**\n     * Creates the serialized form by calling {@link com.google.protobuf.MessageLite#toByteArray}.\n     * @param regularForm the message to serialize\n     */\n    SerializedForm(MessageLite regularForm) {\n      messageClassName = regularForm.getClass().getName();\n      asBytes = regularForm.toByteArray();\n    }\n\n    /**\n     * When read from an ObjectInputStream, this method converts this object\n     * back to the regular form.  Part of Java's serialization magic.\n     * @return a GeneratedMessage of the type that was serialized\n     */\n    @SuppressWarnings(\"unchecked\")\n    protected Object readResolve() throws ObjectStreamException {\n      try {\n        Class messageClass = Class.forName(messageClassName);\n        Method newBuilder = messageClass.getMethod(\"newBuilder\");\n        MessageLite.Builder builder =\n            (MessageLite.Builder) newBuilder.invoke(null);\n        builder.mergeFrom(asBytes);\n        return builder.buildPartial();\n      } catch (ClassNotFoundException e) {\n        throw new RuntimeException(\"Unable to find proto buffer class\", e);\n      } catch (NoSuchMethodException e) {\n        throw new RuntimeException(\"Unable to find newBuilder method\", e);\n      } catch (IllegalAccessException e) {\n        throw new RuntimeException(\"Unable to call newBuilder method\", e);\n      } catch (InvocationTargetException e) {\n        throw new RuntimeException(\"Error calling newBuilder\", e.getCause());\n      } catch (InvalidProtocolBufferException e) {\n        throw new RuntimeException(\"Unable to understand proto buffer\", e);\n      }\n    }\n  }\n\n  /**\n   * Replaces this object in the output stream with a serialized form.\n   * Part of Java's serialization magic.  Generated sub-classes must override\n   * this method by calling <code>return super.writeReplace();</code>\n   * @return a SerializedForm of this message\n   */\n  protected Object writeReplace() throws ObjectStreamException {\n    return new SerializedForm(this);\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Internal.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.io.UnsupportedEncodingException;\n\n/**\n * The classes contained within are used internally by the Protocol Buffer\n * library and generated message implementations. They are public only because\n * those generated messages do not reside in the {@code protobuf} package.\n * Others should not use this class directly.\n *\n * @author kenton@google.com (Kenton Varda)\n */\npublic class Internal {\n  /**\n   * Helper called by generated code to construct default values for string\n   * fields.\n   * <p>\n   * The protocol compiler does not actually contain a UTF-8 decoder -- it\n   * just pushes UTF-8-encoded text around without touching it.  The one place\n   * where this presents a problem is when generating Java string literals.\n   * Unicode characters in the string literal would normally need to be encoded\n   * using a Unicode escape sequence, which would require decoding them.\n   * To get around this, protoc instead embeds the UTF-8 bytes into the\n   * generated code and leaves it to the runtime library to decode them.\n   * <p>\n   * It gets worse, though.  If protoc just generated a byte array, like:\n   *   new byte[] {0x12, 0x34, 0x56, 0x78}\n   * Java actually generates *code* which allocates an array and then fills\n   * in each value.  This is much less efficient than just embedding the bytes\n   * directly into the bytecode.  To get around this, we need another\n   * work-around.  String literals are embedded directly, so protoc actually\n   * generates a string literal corresponding to the bytes.  The easiest way\n   * to do this is to use the ISO-8859-1 character set, which corresponds to\n   * the first 256 characters of the Unicode range.  Protoc can then use\n   * good old CEscape to generate the string.\n   * <p>\n   * So we have a string literal which represents a set of bytes which\n   * represents another string.  This function -- stringDefaultValue --\n   * converts from the generated string to the string we actually want.  The\n   * generated code calls this automatically.\n   */\n  public static String stringDefaultValue(String bytes) {\n    try {\n      return new String(bytes.getBytes(\"ISO-8859-1\"), \"UTF-8\");\n    } catch (UnsupportedEncodingException e) {\n      // This should never happen since all JVMs are required to implement\n      // both of the above character sets.\n      throw new IllegalStateException(\n          \"Java VM does not support a standard character set.\", e);\n    }\n  }\n\n  /**\n   * Helper called by generated code to construct default values for bytes\n   * fields.\n   * <p>\n   * This is a lot like {@link #stringDefaultValue}, but for bytes fields.\n   * In this case we only need the second of the two hacks -- allowing us to\n   * embed raw bytes as a string literal with ISO-8859-1 encoding.\n   */\n  public static ByteString bytesDefaultValue(String bytes) {\n    try {\n      return ByteString.copyFrom(bytes.getBytes(\"ISO-8859-1\"));\n    } catch (UnsupportedEncodingException e) {\n      // This should never happen since all JVMs are required to implement\n      // ISO-8859-1.\n      throw new IllegalStateException(\n          \"Java VM does not support a standard character set.\", e);\n    }\n  }\n\n  /**\n   * Helper called by generated code to determine if a byte array is a valid\n   * UTF-8 encoded string such that the original bytes can be converted to\n   * a String object and then back to a byte array round tripping the bytes\n   * without loss.\n   * <p>\n   * This is inspired by UTF_8.java in sun.nio.cs.\n   *\n   * @param byteString the string to check\n   * @return whether the byte array is round trippable\n   */\n  public static boolean isValidUtf8(ByteString byteString) {\n    int index = 0;\n    int size = byteString.size();\n    // To avoid the masking, we could change this to use bytes;\n    // Then X > 0xC2 gets turned into X < -0xC2; X < 0x80\n    // gets turned into X >= 0, etc.\n\n    while (index < size) {\n      int byte1 = byteString.byteAt(index++) & 0xFF;\n      if (byte1 < 0x80) {\n        // fast loop for single bytes\n        continue;\n\n        // we know from this point on that we have 2-4 byte forms\n      } else if (byte1 < 0xC2 || byte1 > 0xF4) {\n        // catch illegal first bytes: < C2 or > F4\n        return false;\n      }\n      if (index >= size) {\n        // fail if we run out of bytes\n        return false;\n      }\n      int byte2 = byteString.byteAt(index++) & 0xFF;\n      if (byte2 < 0x80 || byte2 > 0xBF) {\n        // general trail-byte test\n        return false;\n      }\n      if (byte1 <= 0xDF) {\n        // two-byte form; general trail-byte test is sufficient\n        continue;\n      }\n\n      // we know from this point on that we have 3 or 4 byte forms\n      if (index >= size) {\n        // fail if we run out of bytes\n        return false;\n      }\n      int byte3 = byteString.byteAt(index++) & 0xFF;\n      if (byte3 < 0x80 || byte3 > 0xBF) {\n        // general trail-byte test\n        return false;\n      }\n      if (byte1 <= 0xEF) {\n        // three-byte form. Vastly more frequent than four-byte forms\n        // The following has an extra test, but not worth restructuring\n        if (byte1 == 0xE0 && byte2 < 0xA0 ||\n            byte1 == 0xED && byte2 > 0x9F) {\n          // check special cases of byte2\n          return false;\n        }\n\n      } else {\n        // four-byte form\n\n        if (index >= size) {\n          // fail if we run out of bytes\n          return false;\n        }\n        int byte4 = byteString.byteAt(index++) & 0xFF;\n        if (byte4 < 0x80 || byte4 > 0xBF) {\n          // general trail-byte test\n          return false;\n        }\n        // The following has an extra test, but not worth restructuring\n        if (byte1 == 0xF0 && byte2 < 0x90 ||\n            byte1 == 0xF4 && byte2 > 0x8F) {\n          // check special cases of byte2\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Interface for an enum value or value descriptor, to be used in FieldSet.\n   * The lite library stores enum values directly in FieldSets but the full\n   * library stores EnumValueDescriptors in order to better support reflection.\n   */\n  public interface EnumLite {\n    int getNumber();\n  }\n\n  /**\n   * Interface for an object which maps integers to {@link EnumLite}s.\n   * {@link Descriptors.EnumDescriptor} implements this interface by mapping\n   * numbers to {@link Descriptors.EnumValueDescriptor}s.  Additionally,\n   * every generated enum type has a static method internalGetValueMap() which\n   * returns an implementation of this type that maps numbers to enum values.\n   */\n  public interface EnumLiteMap<T extends EnumLite> {\n    T findValueByNumber(int number);\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.io.IOException;\n\n/**\n * Thrown when a protocol message being parsed is invalid in some way,\n * e.g. it contains a malformed varint or a negative byte length.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic class InvalidProtocolBufferException extends IOException {\n  private static final long serialVersionUID = -1616151763072450476L;\n\n  public InvalidProtocolBufferException(final String description) {\n    super(description);\n  }\n\n  static InvalidProtocolBufferException truncatedMessage() {\n    return new InvalidProtocolBufferException(\n      \"While parsing a protocol message, the input ended unexpectedly \" +\n      \"in the middle of a field.  This could mean either than the \" +\n      \"input has been truncated or that an embedded message \" +\n      \"misreported its own length.\");\n  }\n\n  static InvalidProtocolBufferException negativeSize() {\n    return new InvalidProtocolBufferException(\n      \"CodedInputStream encountered an embedded string or message \" +\n      \"which claimed to have negative size.\");\n  }\n\n  static InvalidProtocolBufferException malformedVarint() {\n    return new InvalidProtocolBufferException(\n      \"CodedInputStream encountered a malformed varint.\");\n  }\n\n  static InvalidProtocolBufferException invalidTag() {\n    return new InvalidProtocolBufferException(\n      \"Protocol message contained an invalid tag (zero).\");\n  }\n\n  static InvalidProtocolBufferException invalidEndTag() {\n    return new InvalidProtocolBufferException(\n      \"Protocol message end-group tag did not match expected tag.\");\n  }\n\n  static InvalidProtocolBufferException invalidWireType() {\n    return new InvalidProtocolBufferException(\n      \"Protocol message tag had invalid wire type.\");\n  }\n\n  static InvalidProtocolBufferException recursionLimitExceeded() {\n    return new InvalidProtocolBufferException(\n      \"Protocol message had too many levels of nesting.  May be malicious.  \" +\n      \"Use CodedInputStream.setRecursionLimit() to increase the depth limit.\");\n  }\n\n  static InvalidProtocolBufferException sizeLimitExceeded() {\n    return new InvalidProtocolBufferException(\n      \"Protocol message was too large.  May be malicious.  \" +\n      \"Use CodedInputStream.setSizeLimit() to increase the size limit.\");\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.util.List;\nimport java.util.AbstractList;\nimport java.util.ArrayList;\nimport java.util.RandomAccess;\nimport java.util.Collection;\n\n/**\n * An implementation of {@link LazyStringList} that wraps an ArrayList. Each\n * element is either a ByteString or a String. It caches the last one requested\n * which is most likely the one needed next. This minimizes memory usage while\n * satisfying the most common use cases.\n * <p>\n * <strong>Note that this implementation is not synchronized.</strong>\n * If multiple threads access an <tt>ArrayList</tt> instance concurrently,\n * and at least one of the threads modifies the list structurally, it\n * <i>must</i> be synchronized externally.  (A structural modification is\n * any operation that adds or deletes one or more elements, or explicitly\n * resizes the backing array; merely setting the value of an element is not\n * a structural modification.)  This is typically accomplished by\n * synchronizing on some object that naturally encapsulates the list.\n * <p>\n * If the implementation is accessed via concurrent reads, this is thread safe.\n * Conversions are done in a thread safe manner. It's possible that the\n * conversion may happen more than once if two threads attempt to access the\n * same element and the modifications were not visible to each other, but this\n * will not result in any corruption of the list or change in behavior other\n * than performance.\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic class LazyStringArrayList extends AbstractList<String>\n    implements LazyStringList, RandomAccess {\n\n  public final static LazyStringList EMPTY = new UnmodifiableLazyStringList(\n      new LazyStringArrayList());\n\n  private final List<Object> list;\n\n  public LazyStringArrayList() {\n    list = new ArrayList<Object>();\n  }\n\n  public LazyStringArrayList(List<String> from) {\n    list = new ArrayList<Object>(from);\n  }\n\n  @Override\n  public String get(int index) {\n    Object o = list.get(index);\n    if (o instanceof String) {\n      return (String) o;\n    } else {\n      ByteString bs = (ByteString) o;\n      String s = bs.toStringUtf8();\n      if (Internal.isValidUtf8(bs)) {\n        list.set(index, s);\n      }\n      return s;\n    }\n  }\n\n  @Override\n  public int size() {\n    return list.size();\n  }\n\n  @Override\n  public String set(int index, String s) {\n    Object o = list.set(index, s);\n    return asString(o);\n  }\n\n  @Override\n  public void add(int index, String element) {\n    list.add(index, element);\n    modCount++;\n  }\n\n  @Override\n  public boolean addAll(int index, Collection<? extends String> c) {\n    boolean ret = list.addAll(index, c);\n    modCount++;\n    return ret;\n  }\n\n  @Override\n  public String remove(int index) {\n    Object o = list.remove(index);\n    modCount++;\n    return asString(o);\n  }\n\n  public void clear() {\n    list.clear();\n    modCount++;\n  }\n\n  // @Override\n  public void add(ByteString element) {\n    list.add(element);\n    modCount++;\n  }\n\n  // @Override\n  public ByteString getByteString(int index) {\n    Object o = list.get(index);\n    if (o instanceof String) {\n      ByteString b = ByteString.copyFromUtf8((String) o);\n      list.set(index, b);\n      return b;\n    } else {\n      return (ByteString) o;\n    }\n  }\n\n  private String asString(Object o) {\n    if (o instanceof String) {\n      return (String) o;\n    } else {\n      return ((ByteString) o).toStringUtf8();\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.util.List;\n\n/**\n * An interface extending List&lt;String&gt; that also provides access to the\n * items of the list as UTF8-encoded ByteString objects. This is used by the\n * protocol buffer implementation to support lazily converting bytes parsed\n * over the wire to String objects until needed and also increases the\n * efficiency of serialization if the String was never requested as the\n * ByteString is already cached.\n * <p>\n * This only adds additional methods that are required for the use in the\n * protocol buffer code in order to be able successfuly round trip byte arrays\n * through parsing and serialization without conversion to strings. It's not\n * attempting to support the functionality of say List&ltByteString&gt, hence\n * why only these two very specific methods are added.\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic interface LazyStringList extends List<String> {\n\n  /**\n   * Returns the element at the specified position in this list as a ByteString.\n   *\n   * @param index index of the element to return\n   * @return the element at the specified position in this list\n   * @throws IndexOutOfBoundsException if the index is out of range\n   *         (<tt>index &lt; 0 || index &gt;= size()</tt>)\n   */\n  ByteString getByteString(int index);\n\n  /**\n   * Appends the specified element to the end of this list (optional\n   * operation).\n   *\n   * @param element element to be appended to this list\n   * @throws UnsupportedOperationException if the <tt>add</tt> operation\n   *         is not supported by this list\n   */\n  void add(ByteString element);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Message.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// TODO(kenton):  Use generics?  E.g. Builder<BuilderType extends Builder>, then\n//   mergeFrom*() could return BuilderType for better type-safety.\n\npackage com.google.protobuf;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.util.Map;\n\n/**\n * Abstract interface implemented by Protocol Message objects.\n * <p>\n * See also {@link MessageLite}, which defines most of the methods that typical\n * users care about.  {@link Message} adds to it methods that are not available\n * in the \"lite\" runtime.  The biggest added features are introspection and\n * reflection -- i.e., getting descriptors for the message type and accessing\n * the field values dynamically.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic interface Message extends MessageLite, MessageOrBuilder {\n\n  // -----------------------------------------------------------------\n  // Comparison and hashing\n\n  /**\n   * Compares the specified object with this message for equality.  Returns\n   * <tt>true</tt> if the given object is a message of the same type (as\n   * defined by {@code getDescriptorForType()}) and has identical values for\n   * all of its fields.  Subclasses must implement this; inheriting\n   * {@code Object.equals()} is incorrect.\n   *\n   * @param other object to be compared for equality with this message\n   * @return <tt>true</tt> if the specified object is equal to this message\n   */\n  @Override\n  boolean equals(Object other);\n\n  /**\n   * Returns the hash code value for this message.  The hash code of a message\n   * should mix the message's type (object identity of the decsriptor) with its\n   * contents (known and unknown field values).  Subclasses must implement this;\n   * inheriting {@code Object.hashCode()} is incorrect.\n   *\n   * @return the hash code value for this message\n   * @see Map#hashCode()\n   */\n  @Override\n  int hashCode();\n\n  // -----------------------------------------------------------------\n  // Convenience methods.\n\n  /**\n   * Converts the message to a string in protocol buffer text format. This is\n   * just a trivial wrapper around {@link TextFormat#printToString(Message)}.\n   */\n  @Override\n  String toString();\n\n  // =================================================================\n  // Builders\n\n  // (From MessageLite, re-declared here only for return type covariance.)\n  Builder newBuilderForType();\n  Builder toBuilder();\n\n  /**\n   * Abstract interface implemented by Protocol Message builders.\n   */\n  interface Builder extends MessageLite.Builder, MessageOrBuilder {\n    // (From MessageLite.Builder, re-declared here only for return type\n    // covariance.)\n    Builder clear();\n\n    /**\n     * Merge {@code other} into the message being built.  {@code other} must\n     * have the exact same type as {@code this} (i.e.\n     * {@code getDescriptorForType() == other.getDescriptorForType()}).\n     *\n     * Merging occurs as follows.  For each field:<br>\n     * * For singular primitive fields, if the field is set in {@code other},\n     *   then {@code other}'s value overwrites the value in this message.<br>\n     * * For singular message fields, if the field is set in {@code other},\n     *   it is merged into the corresponding sub-message of this message\n     *   using the same merging rules.<br>\n     * * For repeated fields, the elements in {@code other} are concatenated\n     *   with the elements in this message.\n     *\n     * This is equivalent to the {@code Message::MergeFrom} method in C++.\n     */\n    Builder mergeFrom(Message other);\n\n    // (From MessageLite.Builder, re-declared here only for return type\n    // covariance.)\n    Message build();\n    Message buildPartial();\n    Builder clone();\n    Builder mergeFrom(CodedInputStream input) throws IOException;\n    Builder mergeFrom(CodedInputStream input,\n                      ExtensionRegistryLite extensionRegistry)\n                      throws IOException;\n\n    /**\n     * Get the message's type's descriptor.\n     * See {@link Message#getDescriptorForType()}.\n     */\n    Descriptors.Descriptor getDescriptorForType();\n\n    /**\n     * Create a Builder for messages of the appropriate type for the given\n     * field.  Messages built with this can then be passed to setField(),\n     * setRepeatedField(), or addRepeatedField().\n     */\n    Builder newBuilderForField(Descriptors.FieldDescriptor field);\n\n    /**\n     * Sets a field to the given value.  The value must be of the correct type\n     * for this field, i.e. the same type that\n     * {@link Message#getField(Descriptors.FieldDescriptor)} would return.\n     */\n    Builder setField(Descriptors.FieldDescriptor field, Object value);\n\n    /**\n     * Clears the field.  This is exactly equivalent to calling the generated\n     * \"clear\" accessor method corresponding to the field.\n     */\n    Builder clearField(Descriptors.FieldDescriptor field);\n\n    /**\n     * Sets an element of a repeated field to the given value.  The value must\n     * be of the correct type for this field, i.e. the same type that\n     * {@link Message#getRepeatedField(Descriptors.FieldDescriptor,int)} would\n     * return.\n     * @throws IllegalArgumentException The field is not a repeated field, or\n     *           {@code field.getContainingType() != getDescriptorForType()}.\n     */\n    Builder setRepeatedField(Descriptors.FieldDescriptor field,\n                             int index, Object value);\n\n    /**\n     * Like {@code setRepeatedField}, but appends the value as a new element.\n     * @throws IllegalArgumentException The field is not a repeated field, or\n     *           {@code field.getContainingType() != getDescriptorForType()}.\n     */\n    Builder addRepeatedField(Descriptors.FieldDescriptor field, Object value);\n\n    /** Set the {@link UnknownFieldSet} for this message. */\n    Builder setUnknownFields(UnknownFieldSet unknownFields);\n\n    /**\n     * Merge some unknown fields into the {@link UnknownFieldSet} for this\n     * message.\n     */\n    Builder mergeUnknownFields(UnknownFieldSet unknownFields);\n\n    // ---------------------------------------------------------------\n    // Convenience methods.\n\n    // (From MessageLite.Builder, re-declared here only for return type\n    // covariance.)\n    Builder mergeFrom(ByteString data) throws InvalidProtocolBufferException;\n    Builder mergeFrom(ByteString data,\n                      ExtensionRegistryLite extensionRegistry)\n                      throws InvalidProtocolBufferException;\n    Builder mergeFrom(byte[] data) throws InvalidProtocolBufferException;\n    Builder mergeFrom(byte[] data, int off, int len)\n                      throws InvalidProtocolBufferException;\n    Builder mergeFrom(byte[] data,\n                      ExtensionRegistryLite extensionRegistry)\n                      throws InvalidProtocolBufferException;\n    Builder mergeFrom(byte[] data, int off, int len,\n                      ExtensionRegistryLite extensionRegistry)\n                      throws InvalidProtocolBufferException;\n    Builder mergeFrom(InputStream input) throws IOException;\n    Builder mergeFrom(InputStream input,\n                      ExtensionRegistryLite extensionRegistry)\n                      throws IOException;\n    boolean mergeDelimitedFrom(InputStream input)\n                               throws IOException;\n    boolean mergeDelimitedFrom(InputStream input,\n                               ExtensionRegistryLite extensionRegistry)\n                               throws IOException;\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// TODO(kenton):  Use generics?  E.g. Builder<BuilderType extends Builder>, then\n//   mergeFrom*() could return BuilderType for better type-safety.\n\npackage com.google.protobuf;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\n\n/**\n * Abstract interface implemented by Protocol Message objects.\n *\n * <p>This interface is implemented by all protocol message objects.  Non-lite\n * messages additionally implement the Message interface, which is a subclass\n * of MessageLite.  Use MessageLite instead when you only need the subset of\n * features which it supports -- namely, nothing that uses descriptors or\n * reflection.  You can instruct the protocol compiler to generate classes\n * which implement only MessageLite, not the full Message interface, by adding\n * the follow line to the .proto file:\n * <pre>\n *   option optimize_for = LITE_RUNTIME;\n * </pre>\n *\n * <p>This is particularly useful on resource-constrained systems where the\n * full protocol buffers runtime library is too big.\n *\n * <p>Note that on non-constrained systems (e.g. servers) when you need to link\n * in lots of protocol definitions, a better way to reduce total code footprint\n * is to use {@code optimize_for = CODE_SIZE}.  This will make the generated\n * code smaller while still supporting all the same features (at the expense of\n * speed).  {@code optimize_for = LITE_RUNTIME} is best when you only have a\n * small number of message types linked into your binary, in which case the\n * size of the protocol buffers runtime itself is the biggest problem.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic interface MessageLite extends MessageLiteOrBuilder {\n\n\n  /**\n   * Serializes the message and writes it to {@code output}.  This does not\n   * flush or close the stream.\n   */\n  void writeTo(CodedOutputStream output) throws IOException;\n\n  /**\n   * Get the number of bytes required to encode this message.  The result\n   * is only computed on the first call and memoized after that.\n   */\n  int getSerializedSize();\n\n  // -----------------------------------------------------------------\n  // Convenience methods.\n\n  /**\n   * Serializes the message to a {@code ByteString} and returns it. This is\n   * just a trivial wrapper around\n   * {@link #writeTo(CodedOutputStream)}.\n   */\n  ByteString toByteString();\n\n  /**\n   * Serializes the message to a {@code byte} array and returns it.  This is\n   * just a trivial wrapper around\n   * {@link #writeTo(CodedOutputStream)}.\n   */\n  byte[] toByteArray();\n\n  /**\n   * Serializes the message and writes it to {@code output}.  This is just a\n   * trivial wrapper around {@link #writeTo(CodedOutputStream)}.  This does\n   * not flush or close the stream.\n   * <p>\n   * NOTE:  Protocol Buffers are not self-delimiting.  Therefore, if you write\n   * any more data to the stream after the message, you must somehow ensure\n   * that the parser on the receiving end does not interpret this as being\n   * part of the protocol message.  This can be done e.g. by writing the size\n   * of the message before the data, then making sure to limit the input to\n   * that size on the receiving end (e.g. by wrapping the InputStream in one\n   * which limits the input).  Alternatively, just use\n   * {@link #writeDelimitedTo(OutputStream)}.\n   */\n  void writeTo(OutputStream output) throws IOException;\n\n  /**\n   * Like {@link #writeTo(OutputStream)}, but writes the size of the message\n   * as a varint before writing the data.  This allows more data to be written\n   * to the stream after the message without the need to delimit the message\n   * data yourself.  Use {@link Builder#mergeDelimitedFrom(InputStream)} (or\n   * the static method {@code YourMessageType.parseDelimitedFrom(InputStream)})\n   * to parse messages written by this method.\n   */\n  void writeDelimitedTo(OutputStream output) throws IOException;\n\n  // =================================================================\n  // Builders\n\n  /**\n   * Constructs a new builder for a message of the same type as this message.\n   */\n  Builder newBuilderForType();\n\n  /**\n   * Constructs a builder initialized with the current message.  Use this to\n   * derive a new message from the current one.\n   */\n  Builder toBuilder();\n\n  /**\n   * Abstract interface implemented by Protocol Message builders.\n   */\n  interface Builder extends MessageLiteOrBuilder, Cloneable {\n    /** Resets all fields to their default values. */\n    Builder clear();\n\n    /**\n     * Construct the final message.  Once this is called, the Builder is no\n     * longer valid, and calling any other method will result in undefined\n     * behavior and may throw a NullPointerException.  If you need to continue\n     * working with the builder after calling {@code build()}, {@code clone()}\n     * it first.\n     * @throws UninitializedMessageException The message is missing one or more\n     *         required fields (i.e. {@link #isInitialized()} returns false).\n     *         Use {@link #buildPartial()} to bypass this check.\n     */\n    MessageLite build();\n\n    /**\n     * Like {@link #build()}, but does not throw an exception if the message\n     * is missing required fields.  Instead, a partial message is returned.\n     * Once this is called, the Builder is no longer valid, and calling any\n     * will result in undefined behavior and may throw a NullPointerException.\n     *\n     * If you need to continue working with the builder after calling\n     * {@code buildPartial()}, {@code clone()} it first.\n     */\n    MessageLite buildPartial();\n\n    /**\n     * Clones the Builder.\n     * @see Object#clone()\n     */\n    Builder clone();\n\n    /**\n     * Parses a message of this type from the input and merges it with this\n     * message, as if using {@link Builder#mergeFrom(MessageLite)}.\n     *\n     * <p>Warning:  This does not verify that all required fields are present in\n     * the input message.  If you call {@link #build()} without setting all\n     * required fields, it will throw an {@link UninitializedMessageException},\n     * which is a {@code RuntimeException} and thus might not be caught.  There\n     * are a few good ways to deal with this:\n     * <ul>\n     *   <li>Call {@link #isInitialized()} to verify that all required fields\n     *       are set before building.\n     *   <li>Parse the message separately using one of the static\n     *       {@code parseFrom} methods, then use {@link #mergeFrom(MessageLite)}\n     *       to merge it with this one.  {@code parseFrom} will throw an\n     *       {@link InvalidProtocolBufferException} (an {@code IOException})\n     *       if some required fields are missing.\n     *   <li>Use {@code buildPartial()} to build, which ignores missing\n     *       required fields.\n     * </ul>\n     *\n     * <p>Note:  The caller should call\n     * {@link CodedInputStream#checkLastTagWas(int)} after calling this to\n     * verify that the last tag seen was the appropriate end-group tag,\n     * or zero for EOF.\n     */\n    Builder mergeFrom(CodedInputStream input) throws IOException;\n\n    /**\n     * Like {@link Builder#mergeFrom(CodedInputStream)}, but also\n     * parses extensions.  The extensions that you want to be able to parse\n     * must be registered in {@code extensionRegistry}.  Extensions not in\n     * the registry will be treated as unknown fields.\n     */\n    Builder mergeFrom(CodedInputStream input,\n                      ExtensionRegistryLite extensionRegistry)\n                      throws IOException;\n\n    // ---------------------------------------------------------------\n    // Convenience methods.\n\n    /**\n     * Parse {@code data} as a message of this type and merge it with the\n     * message being built.  This is just a small wrapper around\n     * {@link #mergeFrom(CodedInputStream)}.\n     *\n     * @return this\n     */\n    Builder mergeFrom(ByteString data) throws InvalidProtocolBufferException;\n\n    /**\n     * Parse {@code data} as a message of this type and merge it with the\n     * message being built.  This is just a small wrapper around\n     * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}.\n     *\n     * @return this\n     */\n    Builder mergeFrom(ByteString data,\n                      ExtensionRegistryLite extensionRegistry)\n                      throws InvalidProtocolBufferException;\n\n    /**\n     * Parse {@code data} as a message of this type and merge it with the\n     * message being built.  This is just a small wrapper around\n     * {@link #mergeFrom(CodedInputStream)}.\n     *\n     * @return this\n     */\n    Builder mergeFrom(byte[] data) throws InvalidProtocolBufferException;\n\n    /**\n     * Parse {@code data} as a message of this type and merge it with the\n     * message being built.  This is just a small wrapper around\n     * {@link #mergeFrom(CodedInputStream)}.\n     *\n     * @return this\n     */\n    Builder mergeFrom(byte[] data, int off, int len)\n                      throws InvalidProtocolBufferException;\n\n    /**\n     * Parse {@code data} as a message of this type and merge it with the\n     * message being built.  This is just a small wrapper around\n     * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}.\n     *\n     * @return this\n     */\n    Builder mergeFrom(byte[] data,\n                      ExtensionRegistryLite extensionRegistry)\n                      throws InvalidProtocolBufferException;\n\n    /**\n     * Parse {@code data} as a message of this type and merge it with the\n     * message being built.  This is just a small wrapper around\n     * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}.\n     *\n     * @return this\n     */\n    Builder mergeFrom(byte[] data, int off, int len,\n                      ExtensionRegistryLite extensionRegistry)\n                      throws InvalidProtocolBufferException;\n\n    /**\n     * Parse a message of this type from {@code input} and merge it with the\n     * message being built.  This is just a small wrapper around\n     * {@link #mergeFrom(CodedInputStream)}.  Note that this method always\n     * reads the <i>entire</i> input (unless it throws an exception).  If you\n     * want it to stop earlier, you will need to wrap your input in some\n     * wrapper stream that limits reading.  Or, use\n     * {@link MessageLite#writeDelimitedTo(OutputStream)} to write your message\n     * and {@link #mergeDelimitedFrom(InputStream)} to read it.\n     * <p>\n     * Despite usually reading the entire input, this does not close the stream.\n     *\n     * @return this\n     */\n    Builder mergeFrom(InputStream input) throws IOException;\n\n    /**\n     * Parse a message of this type from {@code input} and merge it with the\n     * message being built.  This is just a small wrapper around\n     * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}.\n     *\n     * @return this\n     */\n    Builder mergeFrom(InputStream input,\n                      ExtensionRegistryLite extensionRegistry)\n                      throws IOException;\n\n    /**\n     * Like {@link #mergeFrom(InputStream)}, but does not read until EOF.\n     * Instead, the size of the message (encoded as a varint) is read first,\n     * then the message data.  Use\n     * {@link MessageLite#writeDelimitedTo(OutputStream)} to write messages in\n     * this format.\n     *\n     * @returns True if successful, or false if the stream is at EOF when the\n     *          method starts.  Any other error (including reaching EOF during\n     *          parsing) will cause an exception to be thrown.\n     */\n    boolean mergeDelimitedFrom(InputStream input)\n                               throws IOException;\n\n    /**\n     * Like {@link #mergeDelimitedFrom(InputStream)} but supporting extensions.\n     */\n    boolean mergeDelimitedFrom(InputStream input,\n                               ExtensionRegistryLite extensionRegistry)\n                               throws IOException;\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\n/**\n * Base interface for methods common to {@link MessageLite}\n * and {@link MessageLite.Builder} to provide type equivalency.\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic interface MessageLiteOrBuilder {\n  /**\n   * Get an instance of the type with no fields set. Because no fields are set,\n   * all getters for singular fields will return default values and repeated\n   * fields will appear empty.\n   * This may or may not be a singleton.  This differs from the\n   * {@code getDefaultInstance()} method of generated message classes in that\n   * this method is an abstract method of the {@code MessageLite} interface\n   * whereas {@code getDefaultInstance()} is a static method of a specific\n   * class.  They return the same thing.\n   */\n  MessageLite getDefaultInstanceForType();\n\n  /**\n   * Returns true if all required fields in the message and all embedded\n   * messages are set, false otherwise.\n   */\n  boolean isInitialized();\n\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.util.Map;\n\n/**\n * Base interface for methods common to {@link Message} and\n * {@link Message.Builder} to provide type equivalency.\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic interface MessageOrBuilder extends MessageLiteOrBuilder {\n\n  // (From MessageLite, re-declared here only for return type covariance.)\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  Message getDefaultInstanceForType();\n\n  /**\n   * Get the message's type's descriptor.  This differs from the\n   * {@code getDescriptor()} method of generated message classes in that\n   * this method is an abstract method of the {@code Message} interface\n   * whereas {@code getDescriptor()} is a static method of a specific class.\n   * They return the same thing.\n   */\n  Descriptors.Descriptor getDescriptorForType();\n\n  /**\n   * Returns a collection of all the fields in this message which are set\n   * and their corresponding values.  A singular (\"required\" or \"optional\")\n   * field is set iff hasField() returns true for that field.  A \"repeated\"\n   * field is set iff getRepeatedFieldSize() is greater than zero.  The\n   * values are exactly what would be returned by calling\n   * {@link #getField(Descriptors.FieldDescriptor)} for each field.  The map\n   * is guaranteed to be a sorted map, so iterating over it will return fields\n   * in order by field number.\n   * <br>\n   * If this is for a builder, the returned map may or may not reflect future\n   * changes to the builder.  Either way, the returned map is itself\n   * unmodifiable.\n   */\n  Map<Descriptors.FieldDescriptor, Object> getAllFields();\n\n  /**\n   * Returns true if the given field is set.  This is exactly equivalent to\n   * calling the generated \"has\" accessor method corresponding to the field.\n   * @throws IllegalArgumentException The field is a repeated field, or\n   *           {@code field.getContainingType() != getDescriptorForType()}.\n   */\n  boolean hasField(Descriptors.FieldDescriptor field);\n\n  /**\n   * Obtains the value of the given field, or the default value if it is\n   * not set.  For primitive fields, the boxed primitive value is returned.\n   * For enum fields, the EnumValueDescriptor for the value is returend. For\n   * embedded message fields, the sub-message is returned.  For repeated\n   * fields, a java.util.List is returned.\n   */\n  Object getField(Descriptors.FieldDescriptor field);\n\n  /**\n   * Gets the number of elements of a repeated field.  This is exactly\n   * equivalent to calling the generated \"Count\" accessor method corresponding\n   * to the field.\n   * @throws IllegalArgumentException The field is not a repeated field, or\n   *           {@code field.getContainingType() != getDescriptorForType()}.\n   */\n  int getRepeatedFieldCount(Descriptors.FieldDescriptor field);\n\n  /**\n   * Gets an element of a repeated field.  For primitive fields, the boxed\n   * primitive value is returned.  For enum fields, the EnumValueDescriptor\n   * for the value is returend. For embedded message fields, the sub-message\n   * is returned.\n   * @throws IllegalArgumentException The field is not a repeated field, or\n   *           {@code field.getContainingType() != getDescriptorForType()}.\n   */\n  Object getRepeatedField(Descriptors.FieldDescriptor field, int index);\n\n  /** Get the {@link UnknownFieldSet} for this message. */\n  UnknownFieldSet getUnknownFields();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport com.google.protobuf.Descriptors.EnumDescriptor;\nimport com.google.protobuf.Descriptors.EnumValueDescriptor;\n\n/**\n * Interface of useful methods added to all enums generated by the protocol\n * compiler.\n */\npublic interface ProtocolMessageEnum extends Internal.EnumLite {\n\n  /**\n   * Return the value's numeric value as defined in the .proto file.\n   */\n  int getNumber();\n\n  /**\n   * Return the value's descriptor, which contains information such as\n   * value name, number, and type.\n   */\n  EnumValueDescriptor getValueDescriptor();\n\n  /**\n   * Return the enum type's descriptor, which contains information\n   * about each defined value, etc.\n   */\n  EnumDescriptor getDescriptorForType();\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.util.AbstractList;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * <code>RepeatedFieldBuilder</code> implements a structure that a protocol\n * message uses to hold a repeated field of other protocol messages. It supports\n * the classical use case of adding immutable {@link Message}'s to the\n * repeated field and is highly optimized around this (no extra memory\n * allocations and sharing of immutable arrays).\n * <br>\n * It also supports the additional use case of adding a {@link Message.Builder}\n * to the repeated field and deferring conversion of that <code>Builder</code>\n * to an immutable <code>Message</code>. In this way, it's possible to maintain\n * a tree of <code>Builder</code>'s that acts as a fully read/write data\n * structure.\n * <br>\n * Logically, one can think of a tree of builders as converting the entire tree\n * to messages when build is called on the root or when any method is called\n * that desires a Message instead of a Builder. In terms of the implementation,\n * the <code>SingleFieldBuilder</code> and <code>RepeatedFieldBuilder</code>\n * classes cache messages that were created so that messages only need to be\n * created when some change occured in its builder or a builder for one of its\n * descendants.\n *\n * @param <MType> the type of message for the field\n * @param <BType> the type of builder for the field\n * @param <IType> the common interface for the message and the builder\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic class RepeatedFieldBuilder\n    <MType extends GeneratedMessage,\n     BType extends GeneratedMessage.Builder,\n     IType extends MessageOrBuilder>\n    implements GeneratedMessage.BuilderParent {\n\n  // Parent to send changes to.\n  private GeneratedMessage.BuilderParent parent;\n\n  // List of messages. Never null. It may be immutable, in which case\n  // isMessagesListImmutable will be true. See note below.\n  private List<MType> messages;\n\n  // Whether messages is an mutable array that can be modified.\n  private boolean isMessagesListMutable;\n\n  // List of builders. May be null, in which case, no nested builders were\n  // created. If not null, entries represent the builder for that index.\n  private List<SingleFieldBuilder<MType, BType, IType>> builders;\n\n  // Here are the invariants for messages and builders:\n  // 1. messages is never null and its count corresponds to the number of items\n  //    in the repeated field.\n  // 2. If builders is non-null, messages and builders MUST always\n  //    contain the same number of items.\n  // 3. Entries in either array can be null, but for any index, there MUST be\n  //    either a Message in messages or a builder in builders.\n  // 4. If the builder at an index is non-null, the builder is\n  //    authoritative. This is the case where a Builder was set on the index.\n  //    Any message in the messages array MUST be ignored.\n  // t. If the builder at an index is null, the message in the messages\n  //    list is authoritative. This is the case where a Message (not a Builder)\n  //    was set directly for an index.\n\n  // Indicates that we've built a message and so we are now obligated\n  // to dispatch dirty invalidations. See GeneratedMessage.BuilderListener.\n  private boolean isClean;\n\n  // A view of this builder that exposes a List interface of messages. This is\n  // initialized on demand. This is fully backed by this object and all changes\n  // are reflected in it. Access to any item converts it to a message if it\n  // was a builder.\n  private MessageExternalList<MType, BType, IType> externalMessageList;\n\n  // A view of this builder that exposes a List interface of builders. This is\n  // initialized on demand. This is fully backed by this object and all changes\n  // are reflected in it. Access to any item converts it to a builder if it\n  // was a message.\n  private BuilderExternalList<MType, BType, IType> externalBuilderList;\n\n  // A view of this builder that exposes a List interface of the interface\n  // implemented by messages and builders. This is initialized on demand. This\n  // is fully backed by this object and all changes are reflected in it.\n  // Access to any item returns either a builder or message depending on\n  // what is most efficient.\n  private MessageOrBuilderExternalList<MType, BType, IType>\n      externalMessageOrBuilderList;\n\n  /**\n   * Constructs a new builder with an empty list of messages.\n   *\n   * @param messages the current list of messages\n   * @param isMessagesListMutable Whether the messages list is mutable\n   * @param parent a listener to notify of changes\n   * @param isClean whether the builder is initially marked clean\n   */\n  public RepeatedFieldBuilder(\n      List<MType> messages,\n      boolean isMessagesListMutable,\n      GeneratedMessage.BuilderParent parent,\n      boolean isClean) {\n    this.messages = messages;\n    this.isMessagesListMutable = isMessagesListMutable;\n    this.parent = parent;\n    this.isClean = isClean;\n  }\n\n  public void dispose() {\n    // Null out parent so we stop sending it invalidations.\n    parent = null;\n  }\n\n  /**\n   * Ensures that the list of messages is mutable so it can be updated. If it's\n   * immutable, a copy is made.\n   */\n  private void ensureMutableMessageList() {\n    if (!isMessagesListMutable) {\n      messages = new ArrayList<MType>(messages);\n      isMessagesListMutable = true;\n    }\n  }\n\n  /**\n   * Ensures that the list of builders is not null. If it's null, the list is\n   * created and initialized to be the same size as the messages list with\n   * null entries.\n   */\n  private void ensureBuilders() {\n    if (this.builders == null) {\n      this.builders =\n          new ArrayList<SingleFieldBuilder<MType, BType, IType>>(\n              messages.size());\n      for (int i = 0; i < messages.size(); i++) {\n        builders.add(null);\n      }\n    }\n  }\n\n  /**\n   * Gets the count of items in the list.\n   *\n   * @return the count of items in the list.\n   */\n  public int getCount() {\n    return messages.size();\n  }\n\n  /**\n   * Gets whether the list is empty.\n   *\n   * @return whether the list is empty\n   */\n  public boolean isEmpty() {\n    return messages.isEmpty();\n  }\n\n  /**\n   * Get the message at the specified index. If the message is currently stored\n   * as a <code>Builder</code>, it is converted to a <code>Message</code> by\n   * calling {@link Message.Builder#buildPartial} on it.\n   *\n   * @param index the index of the message to get\n   * @return the message for the specified index\n   */\n  public MType getMessage(int index) {\n    return getMessage(index, false);\n  }\n\n  /**\n   * Get the message at the specified index. If the message is currently stored\n   * as a <code>Builder</code>, it is converted to a <code>Message</code> by\n   * calling {@link Message.Builder#buildPartial} on it.\n   *\n   * @param index the index of the message to get\n   * @param forBuild this is being called for build so we want to make sure\n   *     we SingleFieldBuilder.build to send dirty invalidations\n   * @return the message for the specified index\n   */\n  private MType getMessage(int index, boolean forBuild) {\n    if (this.builders == null) {\n      // We don't have any builders -- return the current Message.\n      // This is the case where no builder was created, so we MUST have a\n      // Message.\n      return messages.get(index);\n    }\n\n    SingleFieldBuilder<MType, BType, IType> builder = builders.get(index);\n    if (builder == null) {\n      // We don't have a builder -- return the current message.\n      // This is the case where no builder was created for the entry at index,\n      // so we MUST have a message.\n      return messages.get(index);\n\n    } else {\n      return forBuild ? builder.build() : builder.getMessage();\n    }\n  }\n\n  /**\n   * Gets a builder for the specified index. If no builder has been created for\n   * that index, a builder is created on demand by calling\n   * {@link Message#toBuilder}.\n   *\n   * @param index the index of the message to get\n   * @return The builder for that index\n   */\n  public BType getBuilder(int index) {\n    ensureBuilders();\n    SingleFieldBuilder<MType, BType, IType> builder = builders.get(index);\n    if (builder == null) {\n      MType message = messages.get(index);\n      builder = new SingleFieldBuilder<MType, BType, IType>(\n          message, this, isClean);\n      builders.set(index, builder);\n    }\n    return builder.getBuilder();\n  }\n\n  /**\n   * Gets the base class interface for the specified index. This may either be\n   * a builder or a message. It will return whatever is more efficient.\n   *\n   * @param index the index of the message to get\n   * @return the message or builder for the index as the base class interface\n   */\n  @SuppressWarnings(\"unchecked\")\n  public IType getMessageOrBuilder(int index) {\n    if (this.builders == null) {\n      // We don't have any builders -- return the current Message.\n      // This is the case where no builder was created, so we MUST have a\n      // Message.\n      return (IType) messages.get(index);\n    }\n\n    SingleFieldBuilder<MType, BType, IType> builder = builders.get(index);\n    if (builder == null) {\n      // We don't have a builder -- return the current message.\n      // This is the case where no builder was created for the entry at index,\n      // so we MUST have a message.\n      return (IType) messages.get(index);\n\n    } else {\n      return builder.getMessageOrBuilder();\n    }\n  }\n\n  /**\n   * Sets a  message at the specified index replacing the existing item at\n   * that index.\n   *\n   * @param index the index to set.\n   * @param message the message to set\n   * @return the builder\n   */\n  public RepeatedFieldBuilder<MType, BType, IType> setMessage(\n      int index, MType message) {\n    if (message == null) {\n      throw new NullPointerException();\n    }\n    ensureMutableMessageList();\n    messages.set(index, message);\n    if (builders != null) {\n      SingleFieldBuilder<MType, BType, IType> entry =\n          builders.set(index, null);\n      if (entry != null) {\n        entry.dispose();\n      }\n    }\n    onChanged();\n    incrementModCounts();\n    return this;\n  }\n\n  /**\n   * Appends the specified element to the end of this list.\n   *\n   * @param message the message to add\n   * @return the builder\n   */\n  public RepeatedFieldBuilder<MType, BType, IType> addMessage(\n      MType message) {\n    if (message == null) {\n      throw new NullPointerException();\n    }\n    ensureMutableMessageList();\n    messages.add(message);\n    if (builders != null) {\n      builders.add(null);\n    }\n    onChanged();\n    incrementModCounts();\n    return this;\n  }\n\n  /**\n   * Inserts the specified message at the specified position in this list.\n   * Shifts the element currently at that position (if any) and any subsequent\n   * elements to the right (adds one to their indices).\n   *\n   * @param index the index at which to insert the message\n   * @param message the message to add\n   * @return the builder\n   */\n  public RepeatedFieldBuilder<MType, BType, IType> addMessage(\n      int index, MType message) {\n    if (message == null) {\n      throw new NullPointerException();\n    }\n    ensureMutableMessageList();\n    messages.add(index, message);\n    if (builders != null) {\n      builders.add(index, null);\n    }\n    onChanged();\n    incrementModCounts();\n    return this;\n  }\n\n  /**\n   * Appends all of the messages in the specified collection to the end of\n   * this list, in the order that they are returned by the specified\n   * collection's iterator.\n   *\n   * @param values the messages to add\n   * @return the builder\n   */\n  public RepeatedFieldBuilder<MType, BType, IType> addAllMessages(\n      Iterable<? extends MType> values) {\n    for (final MType value : values) {\n      if (value == null) {\n        throw new NullPointerException();\n      }\n    }\n    if (values instanceof Collection) {\n      @SuppressWarnings(\"unchecked\") final\n      Collection<MType> collection = (Collection<MType>) values;\n      if (collection.size() == 0) {\n        return this;\n      }\n      ensureMutableMessageList();\n      for (MType value : values) {\n        addMessage(value);\n      }\n    } else {\n      ensureMutableMessageList();\n      for (MType value : values) {\n        addMessage(value);\n      }\n    }\n    onChanged();\n    incrementModCounts();\n    return this;\n  }\n\n  /**\n   * Appends a new builder to the end of this list and returns the builder.\n   *\n   * @param message the message to add which is the basis of the builder\n   * @return the new builder\n   */\n  public BType addBuilder(MType message) {\n    ensureMutableMessageList();\n    ensureBuilders();\n    SingleFieldBuilder<MType, BType, IType> builder =\n        new SingleFieldBuilder<MType, BType, IType>(\n            message, this, isClean);\n    messages.add(null);\n    builders.add(builder);\n    onChanged();\n    incrementModCounts();\n    return builder.getBuilder();\n  }\n\n  /**\n   * Inserts a new builder at the specified position in this list.\n   * Shifts the element currently at that position (if any) and any subsequent\n   * elements to the right (adds one to their indices).\n   *\n   * @param index the index at which to insert the builder\n   * @param message the message to add which is the basis of the builder\n   * @return the builder\n   */\n  public BType addBuilder(int index, MType message) {\n    ensureMutableMessageList();\n    ensureBuilders();\n    SingleFieldBuilder<MType, BType, IType> builder =\n        new SingleFieldBuilder<MType, BType, IType>(\n            message, this, isClean);\n    messages.add(index, null);\n    builders.add(index, builder);\n    onChanged();\n    incrementModCounts();\n    return builder.getBuilder();\n  }\n\n  /**\n   * Removes the element at the specified position in this list. Shifts any\n   * subsequent elements to the left (subtracts one from their indices).\n   * Returns the element that was removed from the list.\n   *\n   * @param index the index at which to remove the message\n   */\n  public void remove(int index) {\n    ensureMutableMessageList();\n    messages.remove(index);\n    if (builders != null) {\n      SingleFieldBuilder<MType, BType, IType> entry =\n          builders.remove(index);\n      if (entry != null) {\n        entry.dispose();\n      }\n    }\n    onChanged();\n    incrementModCounts();\n  }\n\n  /**\n   * Removes all of the elements from this list.\n   * The list will be empty after this call returns.\n   */\n  public void clear() {\n    messages = Collections.emptyList();\n    isMessagesListMutable = false;\n    if (builders != null) {\n      for (SingleFieldBuilder<MType, BType, IType> entry :\n          builders) {\n        if (entry != null) {\n          entry.dispose();\n        }\n      }\n      builders = null;\n    }\n    onChanged();\n    incrementModCounts();\n  }\n\n  /**\n   * Builds the list of messages from the builder and returns them.\n   *\n   * @return an immutable list of messages\n   */\n  public List<MType> build() {\n    // Now that build has been called, we are required to dispatch\n    // invalidations.\n    isClean = true;\n\n    if (!isMessagesListMutable && builders == null) {\n      // We still have an immutable list and we never created a builder.\n      return messages;\n    }\n\n    boolean allMessagesInSync = true;\n    if (!isMessagesListMutable) {\n      // We still have an immutable list. Let's see if any of them are out\n      // of sync with their builders.\n      for (int i = 0; i < messages.size(); i++) {\n        Message message = messages.get(i);\n        SingleFieldBuilder<MType, BType, IType> builder = builders.get(i);\n        if (builder != null) {\n          if (builder.build() != message) {\n            allMessagesInSync = false;\n            break;\n          }\n        }\n      }\n      if (allMessagesInSync) {\n        // Immutable list is still in sync.\n        return messages;\n      }\n    }\n\n    // Need to make sure messages is up to date\n    ensureMutableMessageList();\n    for (int i = 0; i < messages.size(); i++) {\n      messages.set(i, getMessage(i, true));\n    }\n\n    // We're going to return our list as immutable so we mark that we can\n    // no longer update it.\n    messages = Collections.unmodifiableList(messages);\n    isMessagesListMutable = false;\n    return messages;\n  }\n\n  /**\n   * Gets a view of the builder as a list of messages. The returned list is live\n   * and will reflect any changes to the underlying builder.\n   *\n   * @return the messages in the list\n   */\n  public List<MType> getMessageList() {\n    if (externalMessageList == null) {\n      externalMessageList =\n          new MessageExternalList<MType, BType, IType>(this);\n    }\n    return externalMessageList;\n  }\n\n  /**\n   * Gets a view of the builder as a list of builders. This returned list is\n   * live and will reflect any changes to the underlying builder.\n   *\n   * @return the builders in the list\n   */\n  public List<BType> getBuilderList() {\n    if (externalBuilderList == null) {\n      externalBuilderList =\n          new BuilderExternalList<MType, BType, IType>(this);\n    }\n    return externalBuilderList;\n  }\n\n  /**\n   * Gets a view of the builder as a list of MessageOrBuilders. This returned\n   * list is live and will reflect any changes to the underlying builder.\n   *\n   * @return the builders in the list\n   */\n  public List<IType> getMessageOrBuilderList() {\n    if (externalMessageOrBuilderList == null) {\n      externalMessageOrBuilderList =\n          new MessageOrBuilderExternalList<MType, BType, IType>(this);\n    }\n    return externalMessageOrBuilderList;\n  }\n\n  /**\n   * Called when a the builder or one of its nested children has changed\n   * and any parent should be notified of its invalidation.\n   */\n  private void onChanged() {\n    if (isClean && parent != null) {\n      parent.markDirty();\n\n      // Don't keep dispatching invalidations until build is called again.\n      isClean = false;\n    }\n  }\n\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  public void markDirty() {\n    onChanged();\n  }\n\n  /**\n   * Increments the mod counts so that an ConcurrentModificationException can\n   * be thrown if calling code tries to modify the builder while its iterating\n   * the list.\n   */\n  private void incrementModCounts() {\n    if (externalMessageList != null) {\n      externalMessageList.incrementModCount();\n    }\n    if (externalBuilderList != null) {\n      externalBuilderList.incrementModCount();\n    }\n    if (externalMessageOrBuilderList != null) {\n      externalMessageOrBuilderList.incrementModCount();\n    }\n  }\n\n  /**\n   * Provides a live view of the builder as a list of messages.\n   *\n   * @param <MType> the type of message for the field\n   * @param <BType> the type of builder for the field\n   * @param <IType> the common interface for the message and the builder\n   */\n  private static class MessageExternalList<\n      MType extends GeneratedMessage,\n      BType extends GeneratedMessage.Builder,\n      IType extends MessageOrBuilder>\n      extends AbstractList<MType> implements List<MType> {\n\n    RepeatedFieldBuilder<MType, BType, IType> builder;\n\n    MessageExternalList(\n        RepeatedFieldBuilder<MType, BType, IType> builder) {\n      this.builder = builder;\n    }\n\n    public int size() {\n      return this.builder.getCount();\n    }\n\n    public MType get(int index) {\n      return builder.getMessage(index);\n    }\n\n    void incrementModCount() {\n      modCount++;\n    }\n  }\n\n  /**\n   * Provides a live view of the builder as a list of builders.\n   *\n   * @param <MType> the type of message for the field\n   * @param <BType> the type of builder for the field\n   * @param <IType> the common interface for the message and the builder\n   */\n  private static class BuilderExternalList<\n      MType extends GeneratedMessage,\n      BType extends GeneratedMessage.Builder,\n      IType extends MessageOrBuilder>\n      extends AbstractList<BType> implements List<BType> {\n\n    RepeatedFieldBuilder<MType, BType, IType> builder;\n\n    BuilderExternalList(\n        RepeatedFieldBuilder<MType, BType, IType> builder) {\n      this.builder = builder;\n    }\n\n    public int size() {\n      return this.builder.getCount();\n    }\n\n    public BType get(int index) {\n      return builder.getBuilder(index);\n    }\n\n    void incrementModCount() {\n      modCount++;\n    }\n  }\n\n  /**\n   * Provides a live view of the builder as a list of builders.\n   *\n   * @param <MType> the type of message for the field\n   * @param <BType> the type of builder for the field\n   * @param <IType> the common interface for the message and the builder\n   */\n  private static class MessageOrBuilderExternalList<\n      MType extends GeneratedMessage,\n      BType extends GeneratedMessage.Builder,\n      IType extends MessageOrBuilder>\n      extends AbstractList<IType> implements List<IType> {\n\n    RepeatedFieldBuilder<MType, BType, IType> builder;\n\n    MessageOrBuilderExternalList(\n        RepeatedFieldBuilder<MType, BType, IType> builder) {\n      this.builder = builder;\n    }\n\n    public int size() {\n      return this.builder.getCount();\n    }\n\n    public IType get(int index) {\n      return builder.getMessageOrBuilder(index);\n    }\n\n    void incrementModCount() {\n      modCount++;\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\n/**\n * Interface for an RPC callback, normally called when an RPC completes.\n * {@code ParameterType} is normally the method's response message type.\n *\n * <p>Starting with version 2.3.0, RPC implementations should not try to build\n * on this, but should instead provide code generator plugins which generate\n * code specific to the particular RPC implementation.  This way the generated\n * code can be more appropriate for the implementation in use and can avoid\n * unnecessary layers of indirection.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic interface RpcCallback<ParameterType> {\n  void run(ParameterType parameter);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\n/**\n * <p>Abstract interface for an RPC channel.  An {@code RpcChannel} represents a\n * communication line to a {@link Service} which can be used to call that\n * {@link Service}'s methods.  The {@link Service} may be running on another\n * machine.  Normally, you should not call an {@code RpcChannel} directly, but\n * instead construct a stub {@link Service} wrapping it.  Example:\n *\n * <pre>\n *   RpcChannel channel = rpcImpl.newChannel(\"remotehost.example.com:1234\");\n *   RpcController controller = rpcImpl.newController();\n *   MyService service = MyService.newStub(channel);\n *   service.myMethod(controller, request, callback);\n * </pre>\n *\n * <p>Starting with version 2.3.0, RPC implementations should not try to build\n * on this, but should instead provide code generator plugins which generate\n * code specific to the particular RPC implementation.  This way the generated\n * code can be more appropriate for the implementation in use and can avoid\n * unnecessary layers of indirection.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic interface RpcChannel {\n  /**\n   * Call the given method of the remote service.  This method is similar to\n   * {@code Service.callMethod()} with one important difference:  the caller\n   * decides the types of the {@code Message} objects, not the callee.  The\n   * request may be of any type as long as\n   * {@code request.getDescriptor() == method.getInputType()}.\n   * The response passed to the callback will be of the same type as\n   * {@code responsePrototype} (which must have\n   * {@code getDescriptor() == method.getOutputType()}).\n   */\n  void callMethod(Descriptors.MethodDescriptor method,\n                  RpcController controller,\n                  Message request,\n                  Message responsePrototype,\n                  RpcCallback<Message> done);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcController.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\n/**\n * <p>An {@code RpcController} mediates a single method call.  The primary\n * purpose of the controller is to provide a way to manipulate settings\n * specific to the RPC implementation and to find out about RPC-level errors.\n *\n * <p>Starting with version 2.3.0, RPC implementations should not try to build\n * on this, but should instead provide code generator plugins which generate\n * code specific to the particular RPC implementation.  This way the generated\n * code can be more appropriate for the implementation in use and can avoid\n * unnecessary layers of indirection.\n *\n * <p>The methods provided by the {@code RpcController} interface are intended\n * to be a \"least common denominator\" set of features which we expect all\n * implementations to support.  Specific implementations may provide more\n * advanced features (e.g. deadline propagation).\n *\n * @author kenton@google.com Kenton Varda\n */\npublic interface RpcController {\n  // -----------------------------------------------------------------\n  // These calls may be made from the client side only.  Their results\n  // are undefined on the server side (may throw RuntimeExceptions).\n\n  /**\n   * Resets the RpcController to its initial state so that it may be reused in\n   * a new call.  This can be called from the client side only.  It must not\n   * be called while an RPC is in progress.\n   */\n  void reset();\n\n  /**\n   * After a call has finished, returns true if the call failed.  The possible\n   * reasons for failure depend on the RPC implementation.  {@code failed()}\n   * most only be called on the client side, and must not be called before a\n   * call has finished.\n   */\n  boolean failed();\n\n  /**\n   * If {@code failed()} is {@code true}, returns a human-readable description\n   * of the error.\n   */\n  String errorText();\n\n  /**\n   * Advises the RPC system that the caller desires that the RPC call be\n   * canceled.  The RPC system may cancel it immediately, may wait awhile and\n   * then cancel it, or may not even cancel the call at all.  If the call is\n   * canceled, the \"done\" callback will still be called and the RpcController\n   * will indicate that the call failed at that time.\n   */\n  void startCancel();\n\n  // -----------------------------------------------------------------\n  // These calls may be made from the server side only.  Their results\n  // are undefined on the client side (may throw RuntimeExceptions).\n\n  /**\n   * Causes {@code failed()} to return true on the client side.  {@code reason}\n   * will be incorporated into the message returned by {@code errorText()}.\n   * If you find you need to return machine-readable information about\n   * failures, you should incorporate it into your response protocol buffer\n   * and should NOT call {@code setFailed()}.\n   */\n  void setFailed(String reason);\n\n  /**\n   * If {@code true}, indicates that the client canceled the RPC, so the server\n   * may as well give up on replying to it.  This method must be called on the\n   * server side only.  The server should still call the final \"done\" callback.\n   */\n  boolean isCanceled();\n\n  /**\n   * Asks that the given callback be called when the RPC is canceled.  The\n   * parameter passed to the callback will always be {@code null}.  The\n   * callback will always be called exactly once.  If the RPC completes without\n   * being canceled, the callback will be called after completion.  If the RPC\n   * has already been canceled when NotifyOnCancel() is called, the callback\n   * will be called immediately.\n   *\n   * <p>{@code notifyOnCancel()} must be called no more than once per request.\n   * It must be called on the server side only.\n   */\n  void notifyOnCancel(RpcCallback<Object> callback);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\n/**\n * Grab-bag of utility functions useful when dealing with RPCs.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic final class RpcUtil {\n  private RpcUtil() {}\n\n  /**\n   * Take an {@code RpcCallback<Message>} and convert it to an\n   * {@code RpcCallback} accepting a specific message type.  This is always\n   * type-safe (parameter type contravariance).\n   */\n  @SuppressWarnings(\"unchecked\")\n  public static <Type extends Message> RpcCallback<Type>\n  specializeCallback(final RpcCallback<Message> originalCallback) {\n    return (RpcCallback<Type>)originalCallback;\n    // The above cast works, but only due to technical details of the Java\n    // implementation.  A more theoretically correct -- but less efficient --\n    // implementation would be as follows:\n    //   return new RpcCallback<Type>() {\n    //     public void run(Type parameter) {\n    //       originalCallback.run(parameter);\n    //     }\n    //   };\n  }\n\n  /**\n   * Take an {@code RpcCallback} accepting a specific message type and convert\n   * it to an {@code RpcCallback<Message>}.  The generalized callback will\n   * accept any message object which has the same descriptor, and will convert\n   * it to the correct class before calling the original callback.  However,\n   * if the generalized callback is given a message with a different descriptor,\n   * an exception will be thrown.\n   */\n  public static <Type extends Message>\n  RpcCallback<Message> generalizeCallback(\n      final RpcCallback<Type> originalCallback,\n      final Class<Type> originalClass,\n      final Type defaultInstance) {\n    return new RpcCallback<Message>() {\n      public void run(final Message parameter) {\n        Type typedParameter;\n        try {\n          typedParameter = originalClass.cast(parameter);\n        } catch (ClassCastException ignored) {\n          typedParameter = copyAsType(defaultInstance, parameter);\n        }\n        originalCallback.run(typedParameter);\n      }\n    };\n  }\n\n  /**\n   * Creates a new message of type \"Type\" which is a copy of \"source\".  \"source\"\n   * must have the same descriptor but may be a different class (e.g.\n   * DynamicMessage).\n   */\n  @SuppressWarnings(\"unchecked\")\n  private static <Type extends Message> Type copyAsType(\n      final Type typeDefaultInstance, final Message source) {\n    return (Type)typeDefaultInstance.newBuilderForType()\n                                    .mergeFrom(source)\n                                    .build();\n  }\n\n  /**\n   * Creates a callback which can only be called once.  This may be useful for\n   * security, when passing a callback to untrusted code:  most callbacks do\n   * not expect to be called more than once, so doing so may expose bugs if it\n   * is not prevented.\n   */\n  public static <ParameterType>\n    RpcCallback<ParameterType> newOneTimeCallback(\n      final RpcCallback<ParameterType> originalCallback) {\n    return new RpcCallback<ParameterType>() {\n      private boolean alreadyCalled = false;\n\n      public void run(final ParameterType parameter) {\n        synchronized(this) {\n          if (alreadyCalled) {\n            throw new AlreadyCalledException();\n          }\n          alreadyCalled = true;\n        }\n\n        originalCallback.run(parameter);\n      }\n    };\n  }\n\n  /**\n   * Exception thrown when a one-time callback is called more than once.\n   */\n  public static final class AlreadyCalledException extends RuntimeException {\n    private static final long serialVersionUID = 5469741279507848266L;\n\n    public AlreadyCalledException() {\n      super(\"This RpcCallback was already called and cannot be called \" +\n            \"multiple times.\");\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Service.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\n/**\n * Abstract base interface for protocol-buffer-based RPC services.  Services\n * themselves are abstract classes (implemented either by servers or as\n * stubs), but they subclass this base interface.  The methods of this\n * interface can be used to call the methods of the service without knowing\n * its exact type at compile time (analogous to the Message interface).\n *\n * <p>Starting with version 2.3.0, RPC implementations should not try to build\n * on this, but should instead provide code generator plugins which generate\n * code specific to the particular RPC implementation.  This way the generated\n * code can be more appropriate for the implementation in use and can avoid\n * unnecessary layers of indirection.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic interface Service {\n  /**\n   * Get the {@code ServiceDescriptor} describing this service and its methods.\n   */\n  Descriptors.ServiceDescriptor getDescriptorForType();\n\n  /**\n   * <p>Call a method of the service specified by MethodDescriptor.  This is\n   * normally implemented as a simple {@code switch()} that calls the standard\n   * definitions of the service's methods.\n   *\n   * <p>Preconditions:\n   * <ul>\n   *   <li>{@code method.getService() == getDescriptorForType()}\n   *   <li>{@code request} is of the exact same class as the object returned by\n   *       {@code getRequestPrototype(method)}.\n   *   <li>{@code controller} is of the correct type for the RPC implementation\n   *       being used by this Service.  For stubs, the \"correct type\" depends\n   *       on the RpcChannel which the stub is using.  Server-side Service\n   *       implementations are expected to accept whatever type of\n   *       {@code RpcController} the server-side RPC implementation uses.\n   * </ul>\n   *\n   * <p>Postconditions:\n   * <ul>\n   *   <li>{@code done} will be called when the method is complete.  This may be\n   *       before {@code callMethod()} returns or it may be at some point in\n   *       the future.\n   *   <li>The parameter to {@code done} is the response.  It must be of the\n   *       exact same type as would be returned by\n   *       {@code getResponsePrototype(method)}.\n   *   <li>If the RPC failed, the parameter to {@code done} will be\n   *       {@code null}.  Further details about the failure can be found by\n   *       querying {@code controller}.\n   * </ul>\n   */\n  void callMethod(Descriptors.MethodDescriptor method,\n                  RpcController controller,\n                  Message request,\n                  RpcCallback<Message> done);\n\n  /**\n   * <p>{@code callMethod()} requires that the request passed in is of a\n   * particular subclass of {@code Message}.  {@code getRequestPrototype()}\n   * gets the default instances of this type for a given method.  You can then\n   * call {@code Message.newBuilderForType()} on this instance to\n   * construct a builder to build an object which you can then pass to\n   * {@code callMethod()}.\n   *\n   * <p>Example:\n   * <pre>\n   *   MethodDescriptor method =\n   *     service.getDescriptorForType().findMethodByName(\"Foo\");\n   *   Message request =\n   *     stub.getRequestPrototype(method).newBuilderForType()\n   *         .mergeFrom(input).build();\n   *   service.callMethod(method, request, callback);\n   * </pre>\n   */\n  Message getRequestPrototype(Descriptors.MethodDescriptor method);\n\n  /**\n   * Like {@code getRequestPrototype()}, but gets a prototype of the response\n   * message.  {@code getResponsePrototype()} is generally not needed because\n   * the {@code Service} implementation constructs the response message itself,\n   * but it may be useful in some cases to know ahead of time what type of\n   * object will be returned.\n   */\n  Message getResponsePrototype(Descriptors.MethodDescriptor method);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\n/**\n * Thrown by blocking RPC methods when a failure occurs.\n *\n * @author cpovirk@google.com (Chris Povirk)\n */\npublic class ServiceException extends Exception {\n  private static final long serialVersionUID = -1219262335729891920L;\n\n  public ServiceException(final String message) {\n    super(message);\n  }\n\n  public ServiceException(final Throwable cause) {\n    super(cause);\n  }\n\n  public ServiceException(final String message, final Throwable cause) {\n    super(message, cause);\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\n/**\n * <code>SingleFieldBuilder</code> implements a structure that a protocol\n * message uses to hold a single field of another protocol message. It supports\n * the classical use case of setting an immutable {@link Message} as the value\n * of the field and is highly optimized around this.\n * <br>\n * It also supports the additional use case of setting a {@link Message.Builder}\n * as the field and deferring conversion of that <code>Builder</code>\n * to an immutable <code>Message</code>. In this way, it's possible to maintain\n * a tree of <code>Builder</code>'s that acts as a fully read/write data\n * structure.\n * <br>\n * Logically, one can think of a tree of builders as converting the entire tree\n * to messages when build is called on the root or when any method is called\n * that desires a Message instead of a Builder. In terms of the implementation,\n * the <code>SingleFieldBuilder</code> and <code>RepeatedFieldBuilder</code>\n * classes cache messages that were created so that messages only need to be\n * created when some change occured in its builder or a builder for one of its\n * descendants.\n *\n * @param <MType> the type of message for the field\n * @param <BType> the type of builder for the field\n * @param <IType> the common interface for the message and the builder\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic class SingleFieldBuilder\n    <MType extends GeneratedMessage,\n     BType extends GeneratedMessage.Builder,\n     IType extends MessageOrBuilder>\n    implements GeneratedMessage.BuilderParent {\n\n  // Parent to send changes to.\n  private GeneratedMessage.BuilderParent parent;\n\n  // Invariant: one of builder or message fields must be non-null.\n\n  // If set, this is the case where we are backed by a builder. In this case,\n  // message field represents a cached message for the builder (or null if\n  // there is no cached message).\n  private BType builder;\n\n  // If builder is non-null, this represents a cached message from the builder.\n  // If builder is null, this is the authoritative message for the field.\n  private MType message;\n\n  // Indicates that we've built a message and so we are now obligated\n  // to dispatch dirty invalidations. See GeneratedMessage.BuilderListener.\n  private boolean isClean;\n\n  public SingleFieldBuilder(\n      MType message,\n      GeneratedMessage.BuilderParent parent,\n      boolean isClean) {\n    if (message == null) {\n      throw new NullPointerException();\n    }\n    this.message = message;\n    this.parent = parent;\n    this.isClean = isClean;\n  }\n\n  public void dispose() {\n    // Null out parent so we stop sending it invalidations.\n    parent = null;\n  }\n\n  /**\n   * Get the message for the field. If the message is currently stored\n   * as a <code>Builder</code>, it is converted to a <code>Message</code> by\n   * calling {@link Message.Builder#buildPartial} on it. If no message has\n   * been set, returns the default instance of the message.\n   *\n   * @return the message for the field\n   */\n  @SuppressWarnings(\"unchecked\")\n  public MType getMessage() {\n    if (message == null) {\n      // If message is null, the invariant is that we must be have a builder.\n      message = (MType) builder.buildPartial();\n    }\n    return message;\n  }\n\n  /**\n   * Builds the message and returns it.\n   *\n   * @return the message\n   */\n  public MType build() {\n    // Now that build has been called, we are required to dispatch\n    // invalidations.\n    isClean = true;\n    return getMessage();\n  }\n\n  /**\n   * Gets a builder for the field. If no builder has been created yet, a\n   * builder is created on demand by calling {@link Message#toBuilder}.\n   *\n   * @return The builder for the field\n   */\n  @SuppressWarnings(\"unchecked\")\n  public BType getBuilder() {\n    if (builder == null) {\n      // builder.mergeFrom() on a fresh builder\n      // does not create any sub-objects with independent clean/dirty states,\n      // therefore setting the builder itself to clean without actually calling\n      // build() cannot break any invariants.\n      builder = (BType) message.newBuilderForType(this);\n      builder.mergeFrom(message); // no-op if message is the default message\n      builder.markClean();\n    }\n    return builder;\n  }\n\n  /**\n   * Gets the base class interface for the field. This may either be a builder\n   * or a message. It will return whatever is more efficient.\n   *\n   * @return the message or builder for the field as the base class interface\n   */\n  @SuppressWarnings(\"unchecked\")\n  public IType getMessageOrBuilder() {\n    if (builder != null) {\n      return  (IType) builder;\n    } else {\n      return (IType) message;\n    }\n  }\n\n  /**\n   * Sets a  message for the field replacing any existing value.\n   *\n   * @param message the message to set\n   * @return the builder\n   */\n  public SingleFieldBuilder<MType, BType, IType> setMessage(\n      MType message) {\n    if (message == null) {\n      throw new NullPointerException();\n    }\n    this.message = message;\n    if (builder != null) {\n      builder.dispose();\n      builder = null;\n    }\n    onChanged();\n    return this;\n  }\n\n  /**\n   * Merges the field from another field.\n   *\n   * @param value the value to merge from\n   * @return the builder\n   */\n  public SingleFieldBuilder<MType, BType, IType> mergeFrom(\n      MType value) {\n    if (builder == null && message == message.getDefaultInstanceForType()) {\n      message = value;\n    } else {\n      getBuilder().mergeFrom(value);\n    }\n    onChanged();\n    return this;\n  }\n\n  /**\n   * Clears the value of the field.\n   *\n   * @return the builder\n   */\n  @SuppressWarnings(\"unchecked\")\n  public SingleFieldBuilder<MType, BType, IType> clear() {\n    message = (MType) (message != null ?\n        message.getDefaultInstanceForType() :\n        builder.getDefaultInstanceForType());\n    if (builder != null) {\n      builder.dispose();\n      builder = null;\n    }\n    onChanged();\n    return this;\n  }\n\n  /**\n   * Called when a the builder or one of its nested children has changed\n   * and any parent should be notified of its invalidation.\n   */\n  private void onChanged() {\n    // If builder is null, this is the case where onChanged is being called\n    // from setMessage or clear.\n    if (builder != null) {\n      message = null;\n    }\n    if (isClean && parent != null) {\n      parent.markDirty();\n\n      // Don't keep dispatching invalidations until build is called again.\n      isClean = false;\n    }\n  }\n\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  public void markDirty() {\n    onChanged();\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.util.AbstractMap;\nimport java.util.AbstractSet;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Iterator;\nimport java.util.TreeMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.NoSuchElementException;\nimport java.util.Set;\nimport java.util.SortedMap;\n\n/**\n * A custom map implementation from FieldDescriptor to Object optimized to\n * minimize the number of memory allocations for instances with a small number\n * of mappings. The implementation stores the first {@code k} mappings in an\n * array for a configurable value of {@code k}, allowing direct access to the\n * corresponding {@code Entry}s without the need to create an Iterator. The\n * remaining entries are stored in an overflow map. Iteration over the entries\n * in the map should be done as follows:\n *\n * <pre>\n * for (int i = 0; i &lt; fieldMap.getNumArrayEntries(); i++) {\n *   process(fieldMap.getArrayEntryAt(i));\n * }\n * for (Map.Entry&lt;K, V&gt; entry : fieldMap.getOverflowEntries()) {\n *   process(entry);\n * }\n * </pre>\n *\n * The resulting iteration is in order of ascending field tag number. The\n * object returned by {@link #entrySet()} adheres to the same contract but is\n * less efficient as it necessarily involves creating an object for iteration.\n * <p>\n * The tradeoff for this memory efficiency is that the worst case running time\n * of the {@code put()} operation is {@code O(k + lg n)}, which happens when\n * entries are added in descending order. {@code k} should be chosen such that\n * it covers enough common cases without adversely affecting larger maps. In\n * practice, the worst case scenario does not happen for extensions because\n * extension fields are serialized and deserialized in order of ascending tag\n * number, but the worst case scenario can happen for DynamicMessages.\n * <p>\n * The running time for all other operations is similar to that of\n * {@code TreeMap}.\n * <p>\n * Instances are not thread-safe until {@link #makeImmutable()} is called,\n * after which any modifying operation will result in an\n * {@link UnsupportedOperationException}.\n *\n * @author darick@google.com Darick Tong\n */\n// This class is final for all intents and purposes because the constructor is\n// private. However, the FieldDescriptor-specific logic is encapsulated in\n// a subclass to aid testability of the core logic.\nclass SmallSortedMap<K extends Comparable<K>, V> extends AbstractMap<K, V> {\n\n  /**\n   * Creates a new instance for mapping FieldDescriptors to their values.\n   * The {@link #makeImmutable()} implementation will convert the List values\n   * of any repeated fields to unmodifiable lists.\n   *\n   * @param arraySize The size of the entry array containing the\n   *        lexicographically smallest mappings.\n   */\n  static <FieldDescriptorType extends\n      FieldSet.FieldDescriptorLite<FieldDescriptorType>>\n      SmallSortedMap<FieldDescriptorType, Object> newFieldMap(int arraySize) {\n    return new SmallSortedMap<FieldDescriptorType, Object>(arraySize) {\n      @Override\n      @SuppressWarnings(\"unchecked\")\n      public void makeImmutable() {\n        if (!isImmutable()) {\n          for (int i = 0; i < getNumArrayEntries(); i++) {\n            final Map.Entry<FieldDescriptorType, Object> entry =\n                getArrayEntryAt(i);\n            if (entry.getKey().isRepeated()) {\n              final List value = (List) entry.getValue();\n              entry.setValue(Collections.unmodifiableList(value));\n            }\n          }\n          for (Map.Entry<FieldDescriptorType, Object> entry :\n                   getOverflowEntries()) {\n            if (entry.getKey().isRepeated()) {\n              final List value = (List) entry.getValue();\n              entry.setValue(Collections.unmodifiableList(value));\n            }\n          }\n        }\n        super.makeImmutable();\n      }\n    };\n  }\n\n  /**\n   * Creates a new instance for testing.\n   *\n   * @param arraySize The size of the entry array containing the\n   *        lexicographically smallest mappings.\n   */\n  static <K extends Comparable<K>, V> SmallSortedMap<K, V> newInstanceForTest(\n      int arraySize) {\n    return new SmallSortedMap<K, V>(arraySize);\n  }\n\n  private final int maxArraySize;\n  // The \"entry array\" is actually a List because generic arrays are not\n  // allowed. ArrayList also nicely handles the entry shifting on inserts and\n  // removes.\n  private List<Entry> entryList;\n  private Map<K, V> overflowEntries;\n  private boolean isImmutable;\n  // The EntrySet is a stateless view of the Map. It's initialized the first\n  // time it is requested and reused henceforth.\n  private volatile EntrySet lazyEntrySet;\n\n  /**\n   * @code arraySize Size of the array in which the lexicographically smallest\n   *       mappings are stored. (i.e. the {@code k} referred to in the class\n   *       documentation).\n   */\n  private SmallSortedMap(int arraySize) {\n    this.maxArraySize = arraySize;\n    this.entryList = Collections.emptyList();\n    this.overflowEntries = Collections.emptyMap();\n  }\n\n  /** Make this map immutable from this point forward. */\n  public void makeImmutable() {\n    if (!isImmutable) {\n      // Note: There's no need to wrap the entryList in an unmodifiableList\n      // because none of the list's accessors are exposed. The iterator() of\n      // overflowEntries, on the other hand, is exposed so it must be made\n      // unmodifiable.\n      overflowEntries = overflowEntries.isEmpty() ?\n          Collections.<K, V>emptyMap() :\n          Collections.unmodifiableMap(overflowEntries);\n      isImmutable = true;\n    }\n  }\n\n  /** @return Whether {@link #makeImmutable()} has been called. */\n  public boolean isImmutable() {\n    return isImmutable;\n  }\n\n  /** @return The number of entries in the entry array. */\n  public int getNumArrayEntries() {\n    return entryList.size();\n  }\n\n  /** @return The array entry at the given {@code index}. */\n  public Map.Entry<K, V> getArrayEntryAt(int index) {\n    return entryList.get(index);\n  }\n\n  /** @return There number of overflow entries. */\n  public int getNumOverflowEntries() {\n    return overflowEntries.size();\n  }\n\n  /** @return An iterable over the overflow entries. */\n  public Iterable<Map.Entry<K, V>> getOverflowEntries() {\n    return overflowEntries.isEmpty() ?\n        EmptySet.<Map.Entry<K, V>>iterable() :\n        overflowEntries.entrySet();\n  }\n\n  @Override\n  public int size() {\n    return entryList.size() + overflowEntries.size();\n  }\n\n  /**\n   * The implementation throws a {@code ClassCastException} if o is not an\n   * object of type {@code K}.\n   *\n   * {@inheritDoc}\n   */\n  @Override\n  public boolean containsKey(Object o) {\n    @SuppressWarnings(\"unchecked\")\n    final K key = (K) o;\n    return binarySearchInArray(key) >= 0 || overflowEntries.containsKey(key);\n  }\n\n  /**\n   * The implementation throws a {@code ClassCastException} if o is not an\n   * object of type {@code K}.\n   *\n   * {@inheritDoc}\n   */\n  @Override\n  public V get(Object o) {\n    @SuppressWarnings(\"unchecked\")\n    final K key = (K) o;\n    final int index = binarySearchInArray(key);\n    if (index >= 0) {\n      return entryList.get(index).getValue();\n    }\n    return overflowEntries.get(key);\n  }\n\n  @Override\n  public V put(K key, V value) {\n    checkMutable();\n    final int index = binarySearchInArray(key);\n    if (index >= 0) {\n      // Replace existing array entry.\n      return entryList.get(index).setValue(value);\n    }\n    ensureEntryArrayMutable();\n    final int insertionPoint = -(index + 1);\n    if (insertionPoint >= maxArraySize) {\n      // Put directly in overflow.\n      return getOverflowEntriesMutable().put(key, value);\n    }\n    // Insert new Entry in array.\n    if (entryList.size() == maxArraySize) {\n      // Shift the last array entry into overflow.\n      final Entry lastEntryInArray = entryList.remove(maxArraySize - 1);\n      getOverflowEntriesMutable().put(lastEntryInArray.getKey(),\n                                      lastEntryInArray.getValue());\n    }\n    entryList.add(insertionPoint, new Entry(key, value));\n    return null;\n  }\n\n  @Override\n  public void clear() {\n    checkMutable();\n    if (!entryList.isEmpty()) {\n      entryList.clear();\n    }\n    if (!overflowEntries.isEmpty()) {\n      overflowEntries.clear();\n    }\n  }\n\n  /**\n   * The implementation throws a {@code ClassCastException} if o is not an\n   * object of type {@code K}.\n   *\n   * {@inheritDoc}\n   */\n  @Override\n  public V remove(Object o) {\n    checkMutable();\n    @SuppressWarnings(\"unchecked\")\n    final K key = (K) o;\n    final int index = binarySearchInArray(key);\n    if (index >= 0) {\n      return removeArrayEntryAt(index);\n    }\n    // overflowEntries might be Collections.unmodifiableMap(), so only\n    // call remove() if it is non-empty.\n    if (overflowEntries.isEmpty()) {\n      return null;\n    } else {\n      return overflowEntries.remove(key);\n    }\n  }\n\n  private V removeArrayEntryAt(int index) {\n    checkMutable();\n    final V removed = entryList.remove(index).getValue();\n    if (!overflowEntries.isEmpty()) {\n      // Shift the first entry in the overflow to be the last entry in the\n      // array.\n      final Iterator<Map.Entry<K, V>> iterator =\n          getOverflowEntriesMutable().entrySet().iterator();\n      entryList.add(new Entry(iterator.next()));\n      iterator.remove();\n    }\n    return removed;\n  }\n\n  /**\n   * @param key The key to find in the entry array.\n   * @return The returned integer position follows the same semantics as the\n   *     value returned by {@link java.util.Arrays#binarySearch()}.\n   */\n  private int binarySearchInArray(K key) {\n    int left = 0;\n    int right = entryList.size() - 1;\n\n    // Optimization: For the common case in which entries are added in\n    // ascending tag order, check the largest element in the array before\n    // doing a full binary search.\n    if (right >= 0) {\n      int cmp = key.compareTo(entryList.get(right).getKey());\n      if (cmp > 0) {\n        return -(right + 2);  // Insert point is after \"right\".\n      } else if (cmp == 0) {\n        return right;\n      }\n    }\n\n    while (left <= right) {\n      int mid = (left + right) / 2;\n      int cmp = key.compareTo(entryList.get(mid).getKey());\n      if (cmp < 0) {\n        right = mid - 1;\n      } else if (cmp > 0) {\n        left = mid + 1;\n      } else {\n        return mid;\n      }\n    }\n    return -(left + 1);\n  }\n\n  /**\n   * Similar to the AbstractMap implementation of {@code keySet()} and\n   * {@code values()}, the entry set is created the first time this method is\n   * called, and returned in response to all subsequent calls.\n   *\n   * {@inheritDoc}\n   */\n  @Override\n  public Set<Map.Entry<K, V>> entrySet() {\n    if (lazyEntrySet == null) {\n      lazyEntrySet = new EntrySet();\n    }\n    return lazyEntrySet;\n  }\n\n  /**\n   * @throws UnsupportedOperationException if {@link #makeImmutable()} has\n   *         has been called.\n   */\n  private void checkMutable() {\n    if (isImmutable) {\n      throw new UnsupportedOperationException();\n    }\n  }\n\n  /**\n   * @return a {@link SortedMap} to which overflow entries mappings can be\n   *         added or removed.\n   * @throws UnsupportedOperationException if {@link #makeImmutable()} has been\n   *         called.\n   */\n  @SuppressWarnings(\"unchecked\")\n  private SortedMap<K, V> getOverflowEntriesMutable() {\n    checkMutable();\n    if (overflowEntries.isEmpty() && !(overflowEntries instanceof TreeMap)) {\n      overflowEntries = new TreeMap<K, V>();\n    }\n    return (SortedMap<K, V>) overflowEntries;\n  }\n\n  /**\n   * Lazily creates the entry list. Any code that adds to the list must first\n   * call this method.\n   */\n  private void ensureEntryArrayMutable() {\n    checkMutable();\n    if (entryList.isEmpty() && !(entryList instanceof ArrayList)) {\n      entryList = new ArrayList<Entry>(maxArraySize);\n    }\n  }\n\n  /**\n   * Entry implementation that implements Comparable in order to support\n   * binary search witin the entry array. Also checks mutability in\n   * {@link #setValue()}.\n   */\n  private class Entry implements Map.Entry<K, V>, Comparable<Entry> {\n\n    private final K key;\n    private V value;\n\n    Entry(Map.Entry<K, V> copy) {\n      this(copy.getKey(), copy.getValue());\n    }\n\n    Entry(K key, V value) {\n      this.key = key;\n      this.value = value;\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public K getKey() {\n      return key;\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public V getValue() {\n      return value;\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public int compareTo(Entry other) {\n      return getKey().compareTo(other.getKey());\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public V setValue(V newValue) {\n      checkMutable();\n      final V oldValue = this.value;\n      this.value = newValue;\n      return oldValue;\n    }\n\n    @Override\n    public boolean equals(Object o) {\n      if (o == this) {\n        return true;\n      }\n      if (!(o instanceof Map.Entry)) {\n        return false;\n      }\n      @SuppressWarnings(\"unchecked\")\n      Map.Entry<?, ?> other = (Map.Entry<?, ?>) o;\n      return equals(key, other.getKey()) && equals(value, other.getValue());\n    }\n\n    @Override\n    public int hashCode() {\n      return (key == null ? 0 : key.hashCode()) ^\n          (value == null ? 0 : value.hashCode());\n    }\n\n    @Override\n    public String toString() {\n      return key + \"=\" + value;\n    }\n\n    /** equals() that handles null values. */\n    private boolean equals(Object o1, Object o2) {\n      return o1 == null ? o2 == null : o1.equals(o2);\n    }\n  }\n\n  /**\n   * Stateless view of the entries in the field map.\n   */\n  private class EntrySet extends AbstractSet<Map.Entry<K, V>> {\n\n    @Override\n    public Iterator<Map.Entry<K, V>> iterator() {\n      return new EntryIterator();\n    }\n\n    @Override\n    public int size() {\n      return SmallSortedMap.this.size();\n    }\n\n    /**\n     * Throws a {@link ClassCastException} if o is not of the expected type.\n     *\n     * {@inheritDoc}\n     */\n    @Override\n    public boolean contains(Object o) {\n      @SuppressWarnings(\"unchecked\")\n      final Map.Entry<K, V> entry = (Map.Entry<K, V>) o;\n      final V existing = get(entry.getKey());\n      final V value = entry.getValue();\n      return existing == value ||\n          (existing != null && existing.equals(value));\n    }\n\n    @Override\n    public boolean add(Map.Entry<K, V> entry) {\n      if (!contains(entry)) {\n        put(entry.getKey(), entry.getValue());\n        return true;\n      }\n      return false;\n    }\n\n    /**\n     * Throws a {@link ClassCastException} if o is not of the expected type.\n     *\n     * {@inheritDoc}\n     */\n    @Override\n    public boolean remove(Object o) {\n      @SuppressWarnings(\"unchecked\")\n      final Map.Entry<K, V> entry = (Map.Entry<K, V>) o;\n      if (contains(entry)) {\n        SmallSortedMap.this.remove(entry.getKey());\n        return true;\n      }\n      return false;\n    }\n\n    @Override\n    public void clear() {\n      SmallSortedMap.this.clear();\n    }\n  }\n\n  /**\n   * Iterator implementation that switches from the entry array to the overflow\n   * entries appropriately.\n   */\n  private class EntryIterator implements Iterator<Map.Entry<K, V>> {\n\n    private int pos = -1;\n    private boolean nextCalledBeforeRemove;\n    private Iterator<Map.Entry<K, V>> lazyOverflowIterator;\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public boolean hasNext() {\n      return (pos + 1) < entryList.size() ||\n          getOverflowIterator().hasNext();\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public Map.Entry<K, V> next() {\n      nextCalledBeforeRemove = true;\n      // Always increment pos so that we know whether the last returned value\n      // was from the array or from overflow.\n      if (++pos < entryList.size()) {\n        return entryList.get(pos);\n      }\n      return getOverflowIterator().next();\n    }\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public void remove() {\n      if (!nextCalledBeforeRemove) {\n        throw new IllegalStateException(\"remove() was called before next()\");\n      }\n      nextCalledBeforeRemove = false;\n      checkMutable();\n\n      if (pos < entryList.size()) {\n        removeArrayEntryAt(pos--);\n      } else {\n        getOverflowIterator().remove();\n      }\n    }\n\n    /**\n     * It is important to create the overflow iterator only after the array\n     * entries have been iterated over because the overflow entry set changes\n     * when the client calls remove() on the array entries, which invalidates\n     * any existing iterators.\n     */\n    private Iterator<Map.Entry<K, V>> getOverflowIterator() {\n      if (lazyOverflowIterator == null) {\n        lazyOverflowIterator = overflowEntries.entrySet().iterator();\n      }\n      return lazyOverflowIterator;\n    }\n  }\n\n  /**\n   * Helper class that holds immutable instances of an Iterable/Iterator that\n   * we return when the overflow entries is empty. This eliminates the creation\n   * of an Iterator object when there is nothing to iterate over.\n   */\n  private static class EmptySet {\n\n    private static final Iterator<Object> ITERATOR = new Iterator<Object>() {\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public boolean hasNext() {\n        return false;\n      }\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public Object next() {\n        throw new NoSuchElementException();\n      }\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public void remove() {\n        throw new UnsupportedOperationException();\n      }\n    };\n\n    private static final Iterable<Object> ITERABLE = new Iterable<Object>() {\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public Iterator<Object> iterator() {\n        return ITERATOR;\n      }\n    };\n\n    @SuppressWarnings(\"unchecked\")\n    static <T> Iterable<T> iterable() {\n      return (Iterable<T>) ITERABLE;\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport com.google.protobuf.Descriptors.Descriptor;\nimport com.google.protobuf.Descriptors.FieldDescriptor;\nimport com.google.protobuf.Descriptors.EnumDescriptor;\nimport com.google.protobuf.Descriptors.EnumValueDescriptor;\n\nimport java.io.IOException;\nimport java.nio.CharBuffer;\nimport java.math.BigInteger;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * Provide text parsing and formatting support for proto2 instances.\n * The implementation largely follows google/protobuf/text_format.cc.\n *\n * @author wenboz@google.com Wenbo Zhu\n * @author kenton@google.com Kenton Varda\n */\npublic final class TextFormat {\n  private TextFormat() {}\n\n  private static final Printer DEFAULT_PRINTER = new Printer(false);\n  private static final Printer SINGLE_LINE_PRINTER = new Printer(true);\n\n  /**\n   * Outputs a textual representation of the Protocol Message supplied into\n   * the parameter output. (This representation is the new version of the\n   * classic \"ProtocolPrinter\" output from the original Protocol Buffer system)\n   */\n  public static void print(final Message message, final Appendable output)\n                           throws IOException {\n    DEFAULT_PRINTER.print(message, new TextGenerator(output));\n  }\n\n  /** Outputs a textual representation of {@code fields} to {@code output}. */\n  public static void print(final UnknownFieldSet fields,\n                           final Appendable output)\n                           throws IOException {\n    DEFAULT_PRINTER.printUnknownFields(fields, new TextGenerator(output));\n  }\n\n  /**\n   * Generates a human readable form of this message, useful for debugging and\n   * other purposes, with no newline characters.\n   */\n  public static String shortDebugString(final Message message) {\n    try {\n      final StringBuilder sb = new StringBuilder();\n      SINGLE_LINE_PRINTER.print(message, new TextGenerator(sb));\n      // Single line mode currently might have an extra space at the end.\n      return sb.toString().trim();\n    } catch (IOException e) {\n      throw new IllegalStateException(e);\n    }\n  }\n\n  /**\n   * Generates a human readable form of the unknown fields, useful for debugging\n   * and other purposes, with no newline characters.\n   */\n  public static String shortDebugString(final UnknownFieldSet fields) {\n    try {\n      final StringBuilder sb = new StringBuilder();\n      SINGLE_LINE_PRINTER.printUnknownFields(fields, new TextGenerator(sb));\n      // Single line mode currently might have an extra space at the end.\n      return sb.toString().trim();\n    } catch (IOException e) {\n      throw new IllegalStateException(e);\n    }\n  }\n\n  /**\n   * Like {@code print()}, but writes directly to a {@code String} and\n   * returns it.\n   */\n  public static String printToString(final Message message) {\n    try {\n      final StringBuilder text = new StringBuilder();\n      print(message, text);\n      return text.toString();\n    } catch (IOException e) {\n      throw new IllegalStateException(e);\n    }\n  }\n\n  /**\n   * Like {@code print()}, but writes directly to a {@code String} and\n   * returns it.\n   */\n  public static String printToString(final UnknownFieldSet fields) {\n    try {\n      final StringBuilder text = new StringBuilder();\n      print(fields, text);\n      return text.toString();\n    } catch (IOException e) {\n      throw new IllegalStateException(e);\n    }\n  }\n\n  public static void printField(final FieldDescriptor field,\n                                final Object value,\n                                final Appendable output)\n                                throws IOException {\n    DEFAULT_PRINTER.printField(field, value, new TextGenerator(output));\n  }\n\n  public static String printFieldToString(final FieldDescriptor field,\n                                          final Object value) {\n    try {\n      final StringBuilder text = new StringBuilder();\n      printField(field, value, text);\n      return text.toString();\n    } catch (IOException e) {\n      throw new IllegalStateException(e);\n    }\n  }\n\n  /**\n   * Outputs a textual representation of the value of given field value.\n   *\n   * @param field the descriptor of the field\n   * @param value the value of the field\n   * @param output the output to which to append the formatted value\n   * @throws ClassCastException if the value is not appropriate for the\n   *     given field descriptor\n   * @throws IOException if there is an exception writing to the output\n   */\n  public static void printFieldValue(final FieldDescriptor field,\n                                     final Object value,\n                                     final Appendable output)\n                                     throws IOException {\n    DEFAULT_PRINTER.printFieldValue(field, value, new TextGenerator(output));\n  }\n\n  /**\n   * Outputs a textual representation of the value of an unknown field.\n   *\n   * @param tag the field's tag number\n   * @param value the value of the field\n   * @param output the output to which to append the formatted value\n   * @throws ClassCastException if the value is not appropriate for the\n   *     given field descriptor\n   * @throws IOException if there is an exception writing to the output\n   */\n  public static void printUnknownFieldValue(final int tag,\n                                            final Object value,\n                                            final Appendable output)\n                                            throws IOException {\n    printUnknownFieldValue(tag, value, new TextGenerator(output));\n  }\n\n  private static void printUnknownFieldValue(final int tag,\n                                             final Object value,\n                                             final TextGenerator generator)\n                                             throws IOException {\n    switch (WireFormat.getTagWireType(tag)) {\n      case WireFormat.WIRETYPE_VARINT:\n        generator.print(unsignedToString((Long) value));\n        break;\n      case WireFormat.WIRETYPE_FIXED32:\n        generator.print(\n            String.format((Locale) null, \"0x%08x\", (Integer) value));\n        break;\n      case WireFormat.WIRETYPE_FIXED64:\n        generator.print(String.format((Locale) null, \"0x%016x\", (Long) value));\n        break;\n      case WireFormat.WIRETYPE_LENGTH_DELIMITED:\n        generator.print(\"\\\"\");\n        generator.print(escapeBytes((ByteString) value));\n        generator.print(\"\\\"\");\n        break;\n      case WireFormat.WIRETYPE_START_GROUP:\n        DEFAULT_PRINTER.printUnknownFields((UnknownFieldSet) value, generator);\n        break;\n      default:\n        throw new IllegalArgumentException(\"Bad tag: \" + tag);\n    }\n  }\n\n  /** Helper class for converting protobufs to text. */\n  private static final class Printer {\n    /** Whether to omit newlines from the output. */\n    final boolean singleLineMode;\n\n    private Printer(final boolean singleLineMode) {\n      this.singleLineMode = singleLineMode;\n    }\n\n    private void print(final Message message, final TextGenerator generator)\n        throws IOException {\n      for (Map.Entry<FieldDescriptor, Object> field\n          : message.getAllFields().entrySet()) {\n        printField(field.getKey(), field.getValue(), generator);\n      }\n      printUnknownFields(message.getUnknownFields(), generator);\n    }\n\n    private void printField(final FieldDescriptor field, final Object value,\n        final TextGenerator generator) throws IOException {\n      if (field.isRepeated()) {\n        // Repeated field.  Print each element.\n        for (Object element : (List<?>) value) {\n          printSingleField(field, element, generator);\n        }\n      } else {\n        printSingleField(field, value, generator);\n      }\n    }\n\n    private void printSingleField(final FieldDescriptor field,\n                                  final Object value,\n                                  final TextGenerator generator)\n                                  throws IOException {\n      if (field.isExtension()) {\n        generator.print(\"[\");\n        // We special-case MessageSet elements for compatibility with proto1.\n        if (field.getContainingType().getOptions().getMessageSetWireFormat()\n            && (field.getType() == FieldDescriptor.Type.MESSAGE)\n            && (field.isOptional())\n            // object equality\n            && (field.getExtensionScope() == field.getMessageType())) {\n          generator.print(field.getMessageType().getFullName());\n        } else {\n          generator.print(field.getFullName());\n        }\n        generator.print(\"]\");\n      } else {\n        if (field.getType() == FieldDescriptor.Type.GROUP) {\n          // Groups must be serialized with their original capitalization.\n          generator.print(field.getMessageType().getName());\n        } else {\n          generator.print(field.getName());\n        }\n      }\n\n      if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n        if (singleLineMode) {\n          generator.print(\" { \");\n        } else {\n          generator.print(\" {\\n\");\n          generator.indent();\n        }\n      } else {\n        generator.print(\": \");\n      }\n\n      printFieldValue(field, value, generator);\n\n      if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n        if (singleLineMode) {\n          generator.print(\"} \");\n        } else {\n          generator.outdent();\n          generator.print(\"}\\n\");\n        }\n      } else {\n        if (singleLineMode) {\n          generator.print(\" \");\n        } else {\n          generator.print(\"\\n\");\n        }\n      }\n    }\n\n    private void printFieldValue(final FieldDescriptor field,\n                                 final Object value,\n                                 final TextGenerator generator)\n                                 throws IOException {\n      switch (field.getType()) {\n        case INT32:\n        case SINT32:\n        case SFIXED32:\n          generator.print(((Integer) value).toString());\n          break;\n\n        case INT64:\n        case SINT64:\n        case SFIXED64:\n          generator.print(((Long) value).toString());\n          break;\n\n        case BOOL:\n          generator.print(((Boolean) value).toString());\n          break;\n\n        case FLOAT:\n          generator.print(((Float) value).toString());\n          break;\n\n        case DOUBLE:\n          generator.print(((Double) value).toString());\n          break;\n\n        case UINT32:\n        case FIXED32:\n          generator.print(unsignedToString((Integer) value));\n          break;\n\n        case UINT64:\n        case FIXED64:\n          generator.print(unsignedToString((Long) value));\n          break;\n\n        case STRING:\n          generator.print(\"\\\"\");\n          generator.print(escapeText((String) value));\n          generator.print(\"\\\"\");\n          break;\n\n        case BYTES:\n          generator.print(\"\\\"\");\n          generator.print(escapeBytes((ByteString) value));\n          generator.print(\"\\\"\");\n          break;\n\n        case ENUM:\n          generator.print(((EnumValueDescriptor) value).getName());\n          break;\n\n        case MESSAGE:\n        case GROUP:\n          print((Message) value, generator);\n          break;\n      }\n    }\n\n    private void printUnknownFields(final UnknownFieldSet unknownFields,\n                                    final TextGenerator generator)\n                                    throws IOException {\n      for (Map.Entry<Integer, UnknownFieldSet.Field> entry :\n               unknownFields.asMap().entrySet()) {\n        final int number = entry.getKey();\n        final UnknownFieldSet.Field field = entry.getValue();\n        printUnknownField(number, WireFormat.WIRETYPE_VARINT,\n            field.getVarintList(), generator);\n        printUnknownField(number, WireFormat.WIRETYPE_FIXED32,\n            field.getFixed32List(), generator);\n        printUnknownField(number, WireFormat.WIRETYPE_FIXED64,\n            field.getFixed64List(), generator);\n        printUnknownField(number, WireFormat.WIRETYPE_LENGTH_DELIMITED,\n            field.getLengthDelimitedList(), generator);\n        for (final UnknownFieldSet value : field.getGroupList()) {\n          generator.print(entry.getKey().toString());\n          if (singleLineMode) {\n            generator.print(\" { \");\n          } else {\n            generator.print(\" {\\n\");\n            generator.indent();\n          }\n          printUnknownFields(value, generator);\n          if (singleLineMode) {\n            generator.print(\"} \");\n          } else {\n            generator.outdent();\n            generator.print(\"}\\n\");\n          }\n        }\n      }\n    }\n\n    private void printUnknownField(final int number,\n                                   final int wireType,\n                                   final List<?> values,\n                                   final TextGenerator generator)\n                                   throws IOException {\n      for (final Object value : values) {\n        generator.print(String.valueOf(number));\n        generator.print(\": \");\n        printUnknownFieldValue(wireType, value, generator);\n        generator.print(singleLineMode ? \" \" : \"\\n\");\n      }\n    }\n  }\n\n  /** Convert an unsigned 32-bit integer to a string. */\n  private static String unsignedToString(final int value) {\n    if (value >= 0) {\n      return Integer.toString(value);\n    } else {\n      return Long.toString(((long) value) & 0x00000000FFFFFFFFL);\n    }\n  }\n\n  /** Convert an unsigned 64-bit integer to a string. */\n  private static String unsignedToString(final long value) {\n    if (value >= 0) {\n      return Long.toString(value);\n    } else {\n      // Pull off the most-significant bit so that BigInteger doesn't think\n      // the number is negative, then set it again using setBit().\n      return BigInteger.valueOf(value & 0x7FFFFFFFFFFFFFFFL)\n                       .setBit(63).toString();\n    }\n  }\n\n  /**\n   * An inner class for writing text to the output stream.\n   */\n  private static final class TextGenerator {\n    private final Appendable output;\n    private final StringBuilder indent = new StringBuilder();\n    private boolean atStartOfLine = true;\n\n    private TextGenerator(final Appendable output) {\n      this.output = output;\n    }\n\n    /**\n     * Indent text by two spaces.  After calling Indent(), two spaces will be\n     * inserted at the beginning of each line of text.  Indent() may be called\n     * multiple times to produce deeper indents.\n     */\n    public void indent() {\n      indent.append(\"  \");\n    }\n\n    /**\n     * Reduces the current indent level by two spaces, or crashes if the indent\n     * level is zero.\n     */\n    public void outdent() {\n      final int length = indent.length();\n      if (length == 0) {\n        throw new IllegalArgumentException(\n            \" Outdent() without matching Indent().\");\n      }\n      indent.delete(length - 2, length);\n    }\n\n    /**\n     * Print text to the output stream.\n     */\n    public void print(final CharSequence text) throws IOException {\n      final int size = text.length();\n      int pos = 0;\n\n      for (int i = 0; i < size; i++) {\n        if (text.charAt(i) == '\\n') {\n          write(text.subSequence(pos, size), i - pos + 1);\n          pos = i + 1;\n          atStartOfLine = true;\n        }\n      }\n      write(text.subSequence(pos, size), size - pos);\n    }\n\n    private void write(final CharSequence data, final int size)\n                       throws IOException {\n      if (size == 0) {\n        return;\n      }\n      if (atStartOfLine) {\n        atStartOfLine = false;\n        output.append(indent);\n      }\n      output.append(data);\n    }\n  }\n\n  // =================================================================\n  // Parsing\n\n  /**\n   * Represents a stream of tokens parsed from a {@code String}.\n   *\n   * <p>The Java standard library provides many classes that you might think\n   * would be useful for implementing this, but aren't.  For example:\n   *\n   * <ul>\n   * <li>{@code java.io.StreamTokenizer}:  This almost does what we want -- or,\n   *   at least, something that would get us close to what we want -- except\n   *   for one fatal flaw:  It automatically un-escapes strings using Java\n   *   escape sequences, which do not include all the escape sequences we\n   *   need to support (e.g. '\\x').\n   * <li>{@code java.util.Scanner}:  This seems like a great way at least to\n   *   parse regular expressions out of a stream (so we wouldn't have to load\n   *   the entire input into a single string before parsing).  Sadly,\n   *   {@code Scanner} requires that tokens be delimited with some delimiter.\n   *   Thus, although the text \"foo:\" should parse to two tokens (\"foo\" and\n   *   \":\"), {@code Scanner} would recognize it only as a single token.\n   *   Furthermore, {@code Scanner} provides no way to inspect the contents\n   *   of delimiters, making it impossible to keep track of line and column\n   *   numbers.\n   * </ul>\n   *\n   * <p>Luckily, Java's regular expression support does manage to be useful to\n   * us.  (Barely:  We need {@code Matcher.usePattern()}, which is new in\n   * Java 1.5.)  So, we can use that, at least.  Unfortunately, this implies\n   * that we need to have the entire input in one contiguous string.\n   */\n  private static final class Tokenizer {\n    private final CharSequence text;\n    private final Matcher matcher;\n    private String currentToken;\n\n    // The character index within this.text at which the current token begins.\n    private int pos = 0;\n\n    // The line and column numbers of the current token.\n    private int line = 0;\n    private int column = 0;\n\n    // The line and column numbers of the previous token (allows throwing\n    // errors *after* consuming).\n    private int previousLine = 0;\n    private int previousColumn = 0;\n\n    // We use possesive quantifiers (*+ and ++) because otherwise the Java\n    // regex matcher has stack overflows on large inputs.\n    private static final Pattern WHITESPACE =\n      Pattern.compile(\"(\\\\s|(#.*$))++\", Pattern.MULTILINE);\n    private static final Pattern TOKEN = Pattern.compile(\n      \"[a-zA-Z_][0-9a-zA-Z_+-]*+|\" +                // an identifier\n      \"[.]?[0-9+-][0-9a-zA-Z_.+-]*+|\" +             // a number\n      \"\\\"([^\\\"\\n\\\\\\\\]|\\\\\\\\.)*+(\\\"|\\\\\\\\?$)|\" +       // a double-quoted string\n      \"\\'([^\\'\\n\\\\\\\\]|\\\\\\\\.)*+(\\'|\\\\\\\\?$)\",         // a single-quoted string\n      Pattern.MULTILINE);\n\n    private static final Pattern DOUBLE_INFINITY = Pattern.compile(\n      \"-?inf(inity)?\",\n      Pattern.CASE_INSENSITIVE);\n    private static final Pattern FLOAT_INFINITY = Pattern.compile(\n      \"-?inf(inity)?f?\",\n      Pattern.CASE_INSENSITIVE);\n    private static final Pattern FLOAT_NAN = Pattern.compile(\n      \"nanf?\",\n      Pattern.CASE_INSENSITIVE);\n\n    /** Construct a tokenizer that parses tokens from the given text. */\n    private Tokenizer(final CharSequence text) {\n      this.text = text;\n      this.matcher = WHITESPACE.matcher(text);\n      skipWhitespace();\n      nextToken();\n    }\n\n    /** Are we at the end of the input? */\n    public boolean atEnd() {\n      return currentToken.length() == 0;\n    }\n\n    /** Advance to the next token. */\n    public void nextToken() {\n      previousLine = line;\n      previousColumn = column;\n\n      // Advance the line counter to the current position.\n      while (pos < matcher.regionStart()) {\n        if (text.charAt(pos) == '\\n') {\n          ++line;\n          column = 0;\n        } else {\n          ++column;\n        }\n        ++pos;\n      }\n\n      // Match the next token.\n      if (matcher.regionStart() == matcher.regionEnd()) {\n        // EOF\n        currentToken = \"\";\n      } else {\n        matcher.usePattern(TOKEN);\n        if (matcher.lookingAt()) {\n          currentToken = matcher.group();\n          matcher.region(matcher.end(), matcher.regionEnd());\n        } else {\n          // Take one character.\n          currentToken = String.valueOf(text.charAt(pos));\n          matcher.region(pos + 1, matcher.regionEnd());\n        }\n\n        skipWhitespace();\n      }\n    }\n\n    /**\n     * Skip over any whitespace so that the matcher region starts at the next\n     * token.\n     */\n    private void skipWhitespace() {\n      matcher.usePattern(WHITESPACE);\n      if (matcher.lookingAt()) {\n        matcher.region(matcher.end(), matcher.regionEnd());\n      }\n    }\n\n    /**\n     * If the next token exactly matches {@code token}, consume it and return\n     * {@code true}.  Otherwise, return {@code false} without doing anything.\n     */\n    public boolean tryConsume(final String token) {\n      if (currentToken.equals(token)) {\n        nextToken();\n        return true;\n      } else {\n        return false;\n      }\n    }\n\n    /**\n     * If the next token exactly matches {@code token}, consume it.  Otherwise,\n     * throw a {@link ParseException}.\n     */\n    public void consume(final String token) throws ParseException {\n      if (!tryConsume(token)) {\n        throw parseException(\"Expected \\\"\" + token + \"\\\".\");\n      }\n    }\n\n    /**\n     * Returns {@code true} if the next token is an integer, but does\n     * not consume it.\n     */\n    public boolean lookingAtInteger() {\n      if (currentToken.length() == 0) {\n        return false;\n      }\n\n      final char c = currentToken.charAt(0);\n      return ('0' <= c && c <= '9') ||\n             c == '-' || c == '+';\n    }\n\n    /**\n     * If the next token is an identifier, consume it and return its value.\n     * Otherwise, throw a {@link ParseException}.\n     */\n    public String consumeIdentifier() throws ParseException {\n      for (int i = 0; i < currentToken.length(); i++) {\n        final char c = currentToken.charAt(i);\n        if (('a' <= c && c <= 'z') ||\n            ('A' <= c && c <= 'Z') ||\n            ('0' <= c && c <= '9') ||\n            (c == '_') || (c == '.')) {\n          // OK\n        } else {\n          throw parseException(\"Expected identifier.\");\n        }\n      }\n\n      final String result = currentToken;\n      nextToken();\n      return result;\n    }\n\n    /**\n     * If the next token is a 32-bit signed integer, consume it and return its\n     * value.  Otherwise, throw a {@link ParseException}.\n     */\n    public int consumeInt32() throws ParseException {\n      try {\n        final int result = parseInt32(currentToken);\n        nextToken();\n        return result;\n      } catch (NumberFormatException e) {\n        throw integerParseException(e);\n      }\n    }\n\n    /**\n     * If the next token is a 32-bit unsigned integer, consume it and return its\n     * value.  Otherwise, throw a {@link ParseException}.\n     */\n    public int consumeUInt32() throws ParseException {\n      try {\n        final int result = parseUInt32(currentToken);\n        nextToken();\n        return result;\n      } catch (NumberFormatException e) {\n        throw integerParseException(e);\n      }\n    }\n\n    /**\n     * If the next token is a 64-bit signed integer, consume it and return its\n     * value.  Otherwise, throw a {@link ParseException}.\n     */\n    public long consumeInt64() throws ParseException {\n      try {\n        final long result = parseInt64(currentToken);\n        nextToken();\n        return result;\n      } catch (NumberFormatException e) {\n        throw integerParseException(e);\n      }\n    }\n\n    /**\n     * If the next token is a 64-bit unsigned integer, consume it and return its\n     * value.  Otherwise, throw a {@link ParseException}.\n     */\n    public long consumeUInt64() throws ParseException {\n      try {\n        final long result = parseUInt64(currentToken);\n        nextToken();\n        return result;\n      } catch (NumberFormatException e) {\n        throw integerParseException(e);\n      }\n    }\n\n    /**\n     * If the next token is a double, consume it and return its value.\n     * Otherwise, throw a {@link ParseException}.\n     */\n    public double consumeDouble() throws ParseException {\n      // We need to parse infinity and nan separately because\n      // Double.parseDouble() does not accept \"inf\", \"infinity\", or \"nan\".\n      if (DOUBLE_INFINITY.matcher(currentToken).matches()) {\n        final boolean negative = currentToken.startsWith(\"-\");\n        nextToken();\n        return negative ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY;\n      }\n      if (currentToken.equalsIgnoreCase(\"nan\")) {\n        nextToken();\n        return Double.NaN;\n      }\n      try {\n        final double result = Double.parseDouble(currentToken);\n        nextToken();\n        return result;\n      } catch (NumberFormatException e) {\n        throw floatParseException(e);\n      }\n    }\n\n    /**\n     * If the next token is a float, consume it and return its value.\n     * Otherwise, throw a {@link ParseException}.\n     */\n    public float consumeFloat() throws ParseException {\n      // We need to parse infinity and nan separately because\n      // Float.parseFloat() does not accept \"inf\", \"infinity\", or \"nan\".\n      if (FLOAT_INFINITY.matcher(currentToken).matches()) {\n        final boolean negative = currentToken.startsWith(\"-\");\n        nextToken();\n        return negative ? Float.NEGATIVE_INFINITY : Float.POSITIVE_INFINITY;\n      }\n      if (FLOAT_NAN.matcher(currentToken).matches()) {\n        nextToken();\n        return Float.NaN;\n      }\n      try {\n        final float result = Float.parseFloat(currentToken);\n        nextToken();\n        return result;\n      } catch (NumberFormatException e) {\n        throw floatParseException(e);\n      }\n    }\n\n    /**\n     * If the next token is a boolean, consume it and return its value.\n     * Otherwise, throw a {@link ParseException}.\n     */\n    public boolean consumeBoolean() throws ParseException {\n      if (currentToken.equals(\"true\") ||\n          currentToken.equals(\"t\") ||\n          currentToken.equals(\"1\")) {\n        nextToken();\n        return true;\n      } else if (currentToken.equals(\"false\") ||\n                 currentToken.equals(\"f\") ||\n                 currentToken.equals(\"0\")) {\n        nextToken();\n        return false;\n      } else {\n        throw parseException(\"Expected \\\"true\\\" or \\\"false\\\".\");\n      }\n    }\n\n    /**\n     * If the next token is a string, consume it and return its (unescaped)\n     * value.  Otherwise, throw a {@link ParseException}.\n     */\n    public String consumeString() throws ParseException {\n      return consumeByteString().toStringUtf8();\n    }\n\n    /**\n     * If the next token is a string, consume it, unescape it as a\n     * {@link ByteString}, and return it.  Otherwise, throw a\n     * {@link ParseException}.\n     */\n    public ByteString consumeByteString() throws ParseException {\n      List<ByteString> list = new ArrayList<ByteString>();\n      consumeByteString(list);\n      while (currentToken.startsWith(\"'\") || currentToken.startsWith(\"\\\"\")) {\n        consumeByteString(list);\n      }\n      return ByteString.copyFrom(list);\n    }\n\n    /**\n     * Like {@link #consumeByteString()} but adds each token of the string to\n     * the given list.  String literals (whether bytes or text) may come in\n     * multiple adjacent tokens which are automatically concatenated, like in\n     * C or Python.\n     */\n    private void consumeByteString(List<ByteString> list) throws ParseException {\n      final char quote = currentToken.length() > 0 ? currentToken.charAt(0)\n                                                   : '\\0';\n      if (quote != '\\\"' && quote != '\\'') {\n        throw parseException(\"Expected string.\");\n      }\n\n      if (currentToken.length() < 2 ||\n          currentToken.charAt(currentToken.length() - 1) != quote) {\n        throw parseException(\"String missing ending quote.\");\n      }\n\n      try {\n        final String escaped =\n            currentToken.substring(1, currentToken.length() - 1);\n        final ByteString result = unescapeBytes(escaped);\n        nextToken();\n        list.add(result);\n      } catch (InvalidEscapeSequenceException e) {\n        throw parseException(e.getMessage());\n      }\n    }\n\n    /**\n     * Returns a {@link ParseException} with the current line and column\n     * numbers in the description, suitable for throwing.\n     */\n    public ParseException parseException(final String description) {\n      // Note:  People generally prefer one-based line and column numbers.\n      return new ParseException(\n        (line + 1) + \":\" + (column + 1) + \": \" + description);\n    }\n\n    /**\n     * Returns a {@link ParseException} with the line and column numbers of\n     * the previous token in the description, suitable for throwing.\n     */\n    public ParseException parseExceptionPreviousToken(\n        final String description) {\n      // Note:  People generally prefer one-based line and column numbers.\n      return new ParseException(\n        (previousLine + 1) + \":\" + (previousColumn + 1) + \": \" + description);\n    }\n\n    /**\n     * Constructs an appropriate {@link ParseException} for the given\n     * {@code NumberFormatException} when trying to parse an integer.\n     */\n    private ParseException integerParseException(\n        final NumberFormatException e) {\n      return parseException(\"Couldn't parse integer: \" + e.getMessage());\n    }\n\n    /**\n     * Constructs an appropriate {@link ParseException} for the given\n     * {@code NumberFormatException} when trying to parse a float or double.\n     */\n    private ParseException floatParseException(final NumberFormatException e) {\n      return parseException(\"Couldn't parse number: \" + e.getMessage());\n    }\n  }\n\n  /** Thrown when parsing an invalid text format message. */\n  public static class ParseException extends IOException {\n    private static final long serialVersionUID = 3196188060225107702L;\n\n    public ParseException(final String message) {\n      super(message);\n    }\n  }\n\n  /**\n   * Parse a text-format message from {@code input} and merge the contents\n   * into {@code builder}.\n   */\n  public static void merge(final Readable input,\n                           final Message.Builder builder)\n                           throws IOException {\n    merge(input, ExtensionRegistry.getEmptyRegistry(), builder);\n  }\n\n  /**\n   * Parse a text-format message from {@code input} and merge the contents\n   * into {@code builder}.\n   */\n  public static void merge(final CharSequence input,\n                           final Message.Builder builder)\n                           throws ParseException {\n    merge(input, ExtensionRegistry.getEmptyRegistry(), builder);\n  }\n\n  /**\n   * Parse a text-format message from {@code input} and merge the contents\n   * into {@code builder}.  Extensions will be recognized if they are\n   * registered in {@code extensionRegistry}.\n   */\n  public static void merge(final Readable input,\n                           final ExtensionRegistry extensionRegistry,\n                           final Message.Builder builder)\n                           throws IOException {\n    // Read the entire input to a String then parse that.\n\n    // If StreamTokenizer were not quite so crippled, or if there were a kind\n    // of Reader that could read in chunks that match some particular regex,\n    // or if we wanted to write a custom Reader to tokenize our stream, then\n    // we would not have to read to one big String.  Alas, none of these is\n    // the case.  Oh well.\n\n    merge(toStringBuilder(input), extensionRegistry, builder);\n  }\n\n  private static final int BUFFER_SIZE = 4096;\n\n  // TODO(chrisn): See if working around java.io.Reader#read(CharBuffer)\n  // overhead is worthwhile\n  private static StringBuilder toStringBuilder(final Readable input)\n      throws IOException {\n    final StringBuilder text = new StringBuilder();\n    final CharBuffer buffer = CharBuffer.allocate(BUFFER_SIZE);\n    while (true) {\n      final int n = input.read(buffer);\n      if (n == -1) {\n        break;\n      }\n      buffer.flip();\n      text.append(buffer, 0, n);\n    }\n    return text;\n  }\n\n  /**\n   * Parse a text-format message from {@code input} and merge the contents\n   * into {@code builder}.  Extensions will be recognized if they are\n   * registered in {@code extensionRegistry}.\n   */\n  public static void merge(final CharSequence input,\n                           final ExtensionRegistry extensionRegistry,\n                           final Message.Builder builder)\n                           throws ParseException {\n    final Tokenizer tokenizer = new Tokenizer(input);\n\n    while (!tokenizer.atEnd()) {\n      mergeField(tokenizer, extensionRegistry, builder);\n    }\n  }\n\n  /**\n   * Parse a single field from {@code tokenizer} and merge it into\n   * {@code builder}.\n   */\n  private static void mergeField(final Tokenizer tokenizer,\n                                 final ExtensionRegistry extensionRegistry,\n                                 final Message.Builder builder)\n                                 throws ParseException {\n    FieldDescriptor field;\n    final Descriptor type = builder.getDescriptorForType();\n    ExtensionRegistry.ExtensionInfo extension = null;\n\n    if (tokenizer.tryConsume(\"[\")) {\n      // An extension.\n      final StringBuilder name =\n          new StringBuilder(tokenizer.consumeIdentifier());\n      while (tokenizer.tryConsume(\".\")) {\n        name.append('.');\n        name.append(tokenizer.consumeIdentifier());\n      }\n\n      extension = extensionRegistry.findExtensionByName(name.toString());\n\n      if (extension == null) {\n        throw tokenizer.parseExceptionPreviousToken(\n          \"Extension \\\"\" + name + \"\\\" not found in the ExtensionRegistry.\");\n      } else if (extension.descriptor.getContainingType() != type) {\n        throw tokenizer.parseExceptionPreviousToken(\n          \"Extension \\\"\" + name + \"\\\" does not extend message type \\\"\" +\n          type.getFullName() + \"\\\".\");\n      }\n\n      tokenizer.consume(\"]\");\n\n      field = extension.descriptor;\n    } else {\n      final String name = tokenizer.consumeIdentifier();\n      field = type.findFieldByName(name);\n\n      // Group names are expected to be capitalized as they appear in the\n      // .proto file, which actually matches their type names, not their field\n      // names.\n      if (field == null) {\n        // Explicitly specify US locale so that this code does not break when\n        // executing in Turkey.\n        final String lowerName = name.toLowerCase(Locale.US);\n        field = type.findFieldByName(lowerName);\n        // If the case-insensitive match worked but the field is NOT a group,\n        if (field != null && field.getType() != FieldDescriptor.Type.GROUP) {\n          field = null;\n        }\n      }\n      // Again, special-case group names as described above.\n      if (field != null && field.getType() == FieldDescriptor.Type.GROUP &&\n          !field.getMessageType().getName().equals(name)) {\n        field = null;\n      }\n\n      if (field == null) {\n        throw tokenizer.parseExceptionPreviousToken(\n          \"Message type \\\"\" + type.getFullName() +\n          \"\\\" has no field named \\\"\" + name + \"\\\".\");\n      }\n    }\n\n    Object value = null;\n\n    if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {\n      tokenizer.tryConsume(\":\");  // optional\n\n      final String endToken;\n      if (tokenizer.tryConsume(\"<\")) {\n        endToken = \">\";\n      } else {\n        tokenizer.consume(\"{\");\n        endToken = \"}\";\n      }\n\n      final Message.Builder subBuilder;\n      if (extension == null) {\n        subBuilder = builder.newBuilderForField(field);\n      } else {\n        subBuilder = extension.defaultInstance.newBuilderForType();\n      }\n\n      while (!tokenizer.tryConsume(endToken)) {\n        if (tokenizer.atEnd()) {\n          throw tokenizer.parseException(\n            \"Expected \\\"\" + endToken + \"\\\".\");\n        }\n        mergeField(tokenizer, extensionRegistry, subBuilder);\n      }\n\n      value = subBuilder.build();\n\n    } else {\n      tokenizer.consume(\":\");\n\n      switch (field.getType()) {\n        case INT32:\n        case SINT32:\n        case SFIXED32:\n          value = tokenizer.consumeInt32();\n          break;\n\n        case INT64:\n        case SINT64:\n        case SFIXED64:\n          value = tokenizer.consumeInt64();\n          break;\n\n        case UINT32:\n        case FIXED32:\n          value = tokenizer.consumeUInt32();\n          break;\n\n        case UINT64:\n        case FIXED64:\n          value = tokenizer.consumeUInt64();\n          break;\n\n        case FLOAT:\n          value = tokenizer.consumeFloat();\n          break;\n\n        case DOUBLE:\n          value = tokenizer.consumeDouble();\n          break;\n\n        case BOOL:\n          value = tokenizer.consumeBoolean();\n          break;\n\n        case STRING:\n          value = tokenizer.consumeString();\n          break;\n\n        case BYTES:\n          value = tokenizer.consumeByteString();\n          break;\n\n        case ENUM:\n          final EnumDescriptor enumType = field.getEnumType();\n\n          if (tokenizer.lookingAtInteger()) {\n            final int number = tokenizer.consumeInt32();\n            value = enumType.findValueByNumber(number);\n            if (value == null) {\n              throw tokenizer.parseExceptionPreviousToken(\n                \"Enum type \\\"\" + enumType.getFullName() +\n                \"\\\" has no value with number \" + number + '.');\n            }\n          } else {\n            final String id = tokenizer.consumeIdentifier();\n            value = enumType.findValueByName(id);\n            if (value == null) {\n              throw tokenizer.parseExceptionPreviousToken(\n                \"Enum type \\\"\" + enumType.getFullName() +\n                \"\\\" has no value named \\\"\" + id + \"\\\".\");\n            }\n          }\n\n          break;\n\n        case MESSAGE:\n        case GROUP:\n          throw new RuntimeException(\"Can't get here.\");\n      }\n    }\n\n    if (field.isRepeated()) {\n      builder.addRepeatedField(field, value);\n    } else {\n      builder.setField(field, value);\n    }\n  }\n\n  // =================================================================\n  // Utility functions\n  //\n  // Some of these methods are package-private because Descriptors.java uses\n  // them.\n\n  /**\n   * Escapes bytes in the format used in protocol buffer text format, which\n   * is the same as the format used for C string literals.  All bytes\n   * that are not printable 7-bit ASCII characters are escaped, as well as\n   * backslash, single-quote, and double-quote characters.  Characters for\n   * which no defined short-hand escape sequence is defined will be escaped\n   * using 3-digit octal sequences.\n   */\n  static String escapeBytes(final ByteString input) {\n    final StringBuilder builder = new StringBuilder(input.size());\n    for (int i = 0; i < input.size(); i++) {\n      final byte b = input.byteAt(i);\n      switch (b) {\n        // Java does not recognize \\a or \\v, apparently.\n        case 0x07: builder.append(\"\\\\a\" ); break;\n        case '\\b': builder.append(\"\\\\b\" ); break;\n        case '\\f': builder.append(\"\\\\f\" ); break;\n        case '\\n': builder.append(\"\\\\n\" ); break;\n        case '\\r': builder.append(\"\\\\r\" ); break;\n        case '\\t': builder.append(\"\\\\t\" ); break;\n        case 0x0b: builder.append(\"\\\\v\" ); break;\n        case '\\\\': builder.append(\"\\\\\\\\\"); break;\n        case '\\'': builder.append(\"\\\\\\'\"); break;\n        case '\"' : builder.append(\"\\\\\\\"\"); break;\n        default:\n          // Note:  Bytes with the high-order bit set should be escaped.  Since\n          //   bytes are signed, such bytes will compare less than 0x20, hence\n          //   the following line is correct.\n          if (b >= 0x20) {\n            builder.append((char) b);\n          } else {\n            builder.append('\\\\');\n            builder.append((char) ('0' + ((b >>> 6) & 3)));\n            builder.append((char) ('0' + ((b >>> 3) & 7)));\n            builder.append((char) ('0' + (b & 7)));\n          }\n          break;\n      }\n    }\n    return builder.toString();\n  }\n\n  /**\n   * Un-escape a byte sequence as escaped using\n   * {@link #escapeBytes(ByteString)}.  Two-digit hex escapes (starting with\n   * \"\\x\") are also recognized.\n   */\n  static ByteString unescapeBytes(final CharSequence charString)\n      throws InvalidEscapeSequenceException {\n    // First convert the Java characater sequence to UTF-8 bytes.\n    ByteString input = ByteString.copyFromUtf8(charString.toString());\n    // Then unescape certain byte sequences introduced by ASCII '\\\\'.  The valid\n    // escapes can all be expressed with ASCII characters, so it is safe to\n    // operate on bytes here.\n    //\n    // Unescaping the input byte array will result in a byte sequence that's no\n    // longer than the input.  That's because each escape sequence is between\n    // two and four bytes long and stands for a single byte.\n    final byte[] result = new byte[input.size()];\n    int pos = 0;\n    for (int i = 0; i < input.size(); i++) {\n      byte c = input.byteAt(i);\n      if (c == '\\\\') {\n        if (i + 1 < input.size()) {\n          ++i;\n          c = input.byteAt(i);\n          if (isOctal(c)) {\n            // Octal escape.\n            int code = digitValue(c);\n            if (i + 1 < input.size() && isOctal(input.byteAt(i + 1))) {\n              ++i;\n              code = code * 8 + digitValue(input.byteAt(i));\n            }\n            if (i + 1 < input.size() && isOctal(input.byteAt(i + 1))) {\n              ++i;\n              code = code * 8 + digitValue(input.byteAt(i));\n            }\n            // TODO: Check that 0 <= code && code <= 0xFF.\n            result[pos++] = (byte)code;\n          } else {\n            switch (c) {\n              case 'a' : result[pos++] = 0x07; break;\n              case 'b' : result[pos++] = '\\b'; break;\n              case 'f' : result[pos++] = '\\f'; break;\n              case 'n' : result[pos++] = '\\n'; break;\n              case 'r' : result[pos++] = '\\r'; break;\n              case 't' : result[pos++] = '\\t'; break;\n              case 'v' : result[pos++] = 0x0b; break;\n              case '\\\\': result[pos++] = '\\\\'; break;\n              case '\\'': result[pos++] = '\\''; break;\n              case '\"' : result[pos++] = '\\\"'; break;\n\n              case 'x':\n                // hex escape\n                int code = 0;\n                if (i + 1 < input.size() && isHex(input.byteAt(i + 1))) {\n                  ++i;\n                  code = digitValue(input.byteAt(i));\n                } else {\n                  throw new InvalidEscapeSequenceException(\n                      \"Invalid escape sequence: '\\\\x' with no digits\");\n                }\n                if (i + 1 < input.size() && isHex(input.byteAt(i + 1))) {\n                  ++i;\n                  code = code * 16 + digitValue(input.byteAt(i));\n                }\n                result[pos++] = (byte)code;\n                break;\n\n              default:\n                throw new InvalidEscapeSequenceException(\n                    \"Invalid escape sequence: '\\\\\" + (char)c + '\\'');\n            }\n          }\n        } else {\n          throw new InvalidEscapeSequenceException(\n              \"Invalid escape sequence: '\\\\' at end of string.\");\n        }\n      } else {\n        result[pos++] = c;\n      }\n    }\n\n    return ByteString.copyFrom(result, 0, pos);\n  }\n\n  /**\n   * Thrown by {@link TextFormat#unescapeBytes} and\n   * {@link TextFormat#unescapeText} when an invalid escape sequence is seen.\n   */\n  static class InvalidEscapeSequenceException extends IOException {\n    private static final long serialVersionUID = -8164033650142593304L;\n\n    InvalidEscapeSequenceException(final String description) {\n      super(description);\n    }\n  }\n\n  /**\n   * Like {@link #escapeBytes(ByteString)}, but escapes a text string.\n   * Non-ASCII characters are first encoded as UTF-8, then each byte is escaped\n   * individually as a 3-digit octal escape.  Yes, it's weird.\n   */\n  static String escapeText(final String input) {\n    return escapeBytes(ByteString.copyFromUtf8(input));\n  }\n\n  /**\n   * Un-escape a text string as escaped using {@link #escapeText(String)}.\n   * Two-digit hex escapes (starting with \"\\x\") are also recognized.\n   */\n  static String unescapeText(final String input)\n                             throws InvalidEscapeSequenceException {\n    return unescapeBytes(input).toStringUtf8();\n  }\n\n  /** Is this an octal digit? */\n  private static boolean isOctal(final byte c) {\n    return '0' <= c && c <= '7';\n  }\n\n  /** Is this a hex digit? */\n  private static boolean isHex(final byte c) {\n    return ('0' <= c && c <= '9') ||\n           ('a' <= c && c <= 'f') ||\n           ('A' <= c && c <= 'F');\n  }\n\n  /**\n   * Interpret a character as a digit (in any base up to 36) and return the\n   * numeric value.  This is like {@code Character.digit()} but we don't accept\n   * non-ASCII digits.\n   */\n  private static int digitValue(final byte c) {\n    if ('0' <= c && c <= '9') {\n      return c - '0';\n    } else if ('a' <= c && c <= 'z') {\n      return c - 'a' + 10;\n    } else {\n      return c - 'A' + 10;\n    }\n  }\n\n  /**\n   * Parse a 32-bit signed integer from the text.  Unlike the Java standard\n   * {@code Integer.parseInt()}, this function recognizes the prefixes \"0x\"\n   * and \"0\" to signify hexidecimal and octal numbers, respectively.\n   */\n  static int parseInt32(final String text) throws NumberFormatException {\n    return (int) parseInteger(text, true, false);\n  }\n\n  /**\n   * Parse a 32-bit unsigned integer from the text.  Unlike the Java standard\n   * {@code Integer.parseInt()}, this function recognizes the prefixes \"0x\"\n   * and \"0\" to signify hexidecimal and octal numbers, respectively.  The\n   * result is coerced to a (signed) {@code int} when returned since Java has\n   * no unsigned integer type.\n   */\n  static int parseUInt32(final String text) throws NumberFormatException {\n    return (int) parseInteger(text, false, false);\n  }\n\n  /**\n   * Parse a 64-bit signed integer from the text.  Unlike the Java standard\n   * {@code Integer.parseInt()}, this function recognizes the prefixes \"0x\"\n   * and \"0\" to signify hexidecimal and octal numbers, respectively.\n   */\n  static long parseInt64(final String text) throws NumberFormatException {\n    return parseInteger(text, true, true);\n  }\n\n  /**\n   * Parse a 64-bit unsigned integer from the text.  Unlike the Java standard\n   * {@code Integer.parseInt()}, this function recognizes the prefixes \"0x\"\n   * and \"0\" to signify hexidecimal and octal numbers, respectively.  The\n   * result is coerced to a (signed) {@code long} when returned since Java has\n   * no unsigned long type.\n   */\n  static long parseUInt64(final String text) throws NumberFormatException {\n    return parseInteger(text, false, true);\n  }\n\n  private static long parseInteger(final String text,\n                                   final boolean isSigned,\n                                   final boolean isLong)\n                                   throws NumberFormatException {\n    int pos = 0;\n\n    boolean negative = false;\n    if (text.startsWith(\"-\", pos)) {\n      if (!isSigned) {\n        throw new NumberFormatException(\"Number must be positive: \" + text);\n      }\n      ++pos;\n      negative = true;\n    }\n\n    int radix = 10;\n    if (text.startsWith(\"0x\", pos)) {\n      pos += 2;\n      radix = 16;\n    } else if (text.startsWith(\"0\", pos)) {\n      radix = 8;\n    }\n\n    final String numberText = text.substring(pos);\n\n    long result = 0;\n    if (numberText.length() < 16) {\n      // Can safely assume no overflow.\n      result = Long.parseLong(numberText, radix);\n      if (negative) {\n        result = -result;\n      }\n\n      // Check bounds.\n      // No need to check for 64-bit numbers since they'd have to be 16 chars\n      // or longer to overflow.\n      if (!isLong) {\n        if (isSigned) {\n          if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {\n            throw new NumberFormatException(\n              \"Number out of range for 32-bit signed integer: \" + text);\n          }\n        } else {\n          if (result >= (1L << 32) || result < 0) {\n            throw new NumberFormatException(\n              \"Number out of range for 32-bit unsigned integer: \" + text);\n          }\n        }\n      }\n    } else {\n      BigInteger bigValue = new BigInteger(numberText, radix);\n      if (negative) {\n        bigValue = bigValue.negate();\n      }\n\n      // Check bounds.\n      if (!isLong) {\n        if (isSigned) {\n          if (bigValue.bitLength() > 31) {\n            throw new NumberFormatException(\n              \"Number out of range for 32-bit signed integer: \" + text);\n          }\n        } else {\n          if (bigValue.bitLength() > 32) {\n            throw new NumberFormatException(\n              \"Number out of range for 32-bit unsigned integer: \" + text);\n          }\n        }\n      } else {\n        if (isSigned) {\n          if (bigValue.bitLength() > 63) {\n            throw new NumberFormatException(\n              \"Number out of range for 64-bit signed integer: \" + text);\n          }\n        } else {\n          if (bigValue.bitLength() > 64) {\n            throw new NumberFormatException(\n              \"Number out of range for 64-bit unsigned integer: \" + text);\n          }\n        }\n      }\n\n      result = bigValue.longValue();\n    }\n\n    return result;\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * Thrown when attempting to build a protocol message that is missing required\n * fields.  This is a {@code RuntimeException} because it normally represents\n * a programming error:  it happens when some code which constructs a message\n * fails to set all the fields.  {@code parseFrom()} methods <b>do not</b>\n * throw this; they throw an {@link InvalidProtocolBufferException} if\n * required fields are missing, because it is not a programming error to\n * receive an incomplete message.  In other words,\n * {@code UninitializedMessageException} should never be thrown by correct\n * code, but {@code InvalidProtocolBufferException} might be.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic class UninitializedMessageException extends RuntimeException {\n  private static final long serialVersionUID = -7466929953374883507L;\n\n  public UninitializedMessageException(final MessageLite message) {\n    super(\"Message was missing required fields.  (Lite runtime could not \" +\n          \"determine which fields were missing).\");\n    missingFields = null;\n  }\n\n  public UninitializedMessageException(final List<String> missingFields) {\n    super(buildDescription(missingFields));\n    this.missingFields = missingFields;\n  }\n\n  private final List<String> missingFields;\n\n  /**\n   * Get a list of human-readable names of required fields missing from this\n   * message.  Each name is a full path to a field, e.g. \"foo.bar[5].baz\".\n   * Returns null if the lite runtime was used, since it lacks the ability to\n   * find missing fields.\n   */\n  public List<String> getMissingFields() {\n    return Collections.unmodifiableList(missingFields);\n  }\n\n  /**\n   * Converts this exception to an {@link InvalidProtocolBufferException}.\n   * When a parsed message is missing required fields, this should be thrown\n   * instead of {@code UninitializedMessageException}.\n   */\n  public InvalidProtocolBufferException asInvalidProtocolBufferException() {\n    return new InvalidProtocolBufferException(getMessage());\n  }\n\n  /** Construct the description string for this exception. */\n  private static String buildDescription(final List<String> missingFields) {\n    final StringBuilder description =\n      new StringBuilder(\"Message missing required fields: \");\n    boolean first = true;\n    for (final String field : missingFields) {\n      if (first) {\n        first = false;\n      } else {\n        description.append(\", \");\n      }\n      description.append(field);\n    }\n    return description.toString();\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport com.google.protobuf.AbstractMessageLite.Builder.LimitedInputStream;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.TreeMap;\n\n/**\n * {@code UnknownFieldSet} is used to keep track of fields which were seen when\n * parsing a protocol message but whose field numbers or types are unrecognized.\n * This most frequently occurs when new fields are added to a message type\n * and then messages containing those feilds are read by old software that was\n * compiled before the new types were added.\n *\n * <p>Every {@link Message} contains an {@code UnknownFieldSet} (and every\n * {@link Message.Builder} contains an {@link Builder}).\n *\n * <p>Most users will never need to use this class.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic final class UnknownFieldSet implements MessageLite {\n  private UnknownFieldSet() {}\n\n  /** Create a new {@link Builder}. */\n  public static Builder newBuilder() {\n    return Builder.create();\n  }\n\n  /**\n   * Create a new {@link Builder} and initialize it to be a copy\n   * of {@code copyFrom}.\n   */\n  public static Builder newBuilder(final UnknownFieldSet copyFrom) {\n    return newBuilder().mergeFrom(copyFrom);\n  }\n\n  /** Get an empty {@code UnknownFieldSet}. */\n  public static UnknownFieldSet getDefaultInstance() {\n    return defaultInstance;\n  }\n  public UnknownFieldSet getDefaultInstanceForType() {\n    return defaultInstance;\n  }\n  private static final UnknownFieldSet defaultInstance =\n    new UnknownFieldSet(Collections.<Integer, Field>emptyMap());\n\n  /**\n   * Construct an {@code UnknownFieldSet} around the given map.  The map is\n   * expected to be immutable.\n   */\n  private UnknownFieldSet(final Map<Integer, Field> fields) {\n    this.fields = fields;\n  }\n  private Map<Integer, Field> fields;\n\n  @Override\n  public boolean equals(final Object other) {\n    if (this == other) {\n      return true;\n    }\n    return (other instanceof UnknownFieldSet) &&\n           fields.equals(((UnknownFieldSet) other).fields);\n  }\n\n  @Override\n  public int hashCode() {\n    return fields.hashCode();\n  }\n\n  /** Get a map of fields in the set by number. */\n  public Map<Integer, Field> asMap() {\n    return fields;\n  }\n\n  /** Check if the given field number is present in the set. */\n  public boolean hasField(final int number) {\n    return fields.containsKey(number);\n  }\n\n  /**\n   * Get a field by number.  Returns an empty field if not present.  Never\n   * returns {@code null}.\n   */\n  public Field getField(final int number) {\n    final Field result = fields.get(number);\n    return (result == null) ? Field.getDefaultInstance() : result;\n  }\n\n  /** Serializes the set and writes it to {@code output}. */\n  public void writeTo(final CodedOutputStream output) throws IOException {\n    for (final Map.Entry<Integer, Field> entry : fields.entrySet()) {\n      entry.getValue().writeTo(entry.getKey(), output);\n    }\n  }\n\n  /**\n   * Converts the set to a string in protocol buffer text format. This is\n   * just a trivial wrapper around\n   * {@link TextFormat#printToString(UnknownFieldSet)}.\n   */\n  @Override\n  public String toString() {\n    return TextFormat.printToString(this);\n  }\n\n  /**\n   * Serializes the message to a {@code ByteString} and returns it. This is\n   * just a trivial wrapper around {@link #writeTo(CodedOutputStream)}.\n   */\n  public ByteString toByteString() {\n    try {\n      final ByteString.CodedBuilder out =\n        ByteString.newCodedBuilder(getSerializedSize());\n      writeTo(out.getCodedOutput());\n      return out.build();\n    } catch (final IOException e) {\n      throw new RuntimeException(\n        \"Serializing to a ByteString threw an IOException (should \" +\n        \"never happen).\", e);\n    }\n  }\n\n  /**\n   * Serializes the message to a {@code byte} array and returns it.  This is\n   * just a trivial wrapper around {@link #writeTo(CodedOutputStream)}.\n   */\n  public byte[] toByteArray() {\n    try {\n      final byte[] result = new byte[getSerializedSize()];\n      final CodedOutputStream output = CodedOutputStream.newInstance(result);\n      writeTo(output);\n      output.checkNoSpaceLeft();\n      return result;\n    } catch (final IOException e) {\n      throw new RuntimeException(\n        \"Serializing to a byte array threw an IOException \" +\n        \"(should never happen).\", e);\n    }\n  }\n\n  /**\n   * Serializes the message and writes it to {@code output}.  This is just a\n   * trivial wrapper around {@link #writeTo(CodedOutputStream)}.\n   */\n  public void writeTo(final OutputStream output) throws IOException {\n    final CodedOutputStream codedOutput = CodedOutputStream.newInstance(output);\n    writeTo(codedOutput);\n    codedOutput.flush();\n  }\n\n  public void writeDelimitedTo(OutputStream output) throws IOException {\n    final CodedOutputStream codedOutput = CodedOutputStream.newInstance(output);\n    codedOutput.writeRawVarint32(getSerializedSize());\n    writeTo(codedOutput);\n    codedOutput.flush();\n  }\n\n  /** Get the number of bytes required to encode this set. */\n  public int getSerializedSize() {\n    int result = 0;\n    for (final Map.Entry<Integer, Field> entry : fields.entrySet()) {\n      result += entry.getValue().getSerializedSize(entry.getKey());\n    }\n    return result;\n  }\n\n  /**\n   * Serializes the set and writes it to {@code output} using\n   * {@code MessageSet} wire format.\n   */\n  public void writeAsMessageSetTo(final CodedOutputStream output)\n      throws IOException {\n    for (final Map.Entry<Integer, Field> entry : fields.entrySet()) {\n      entry.getValue().writeAsMessageSetExtensionTo(\n        entry.getKey(), output);\n    }\n  }\n\n  /**\n   * Get the number of bytes required to encode this set using\n   * {@code MessageSet} wire format.\n   */\n  public int getSerializedSizeAsMessageSet() {\n    int result = 0;\n    for (final Map.Entry<Integer, Field> entry : fields.entrySet()) {\n      result += entry.getValue().getSerializedSizeAsMessageSetExtension(\n        entry.getKey());\n    }\n    return result;\n  }\n\n  public boolean isInitialized() {\n    // UnknownFieldSets do not have required fields, so they are always\n    // initialized.\n    return true;\n  }\n\n  /** Parse an {@code UnknownFieldSet} from the given input stream. */\n  public static UnknownFieldSet parseFrom(final CodedInputStream input)\n                                          throws IOException {\n    return newBuilder().mergeFrom(input).build();\n  }\n\n  /** Parse {@code data} as an {@code UnknownFieldSet} and return it. */\n  public static UnknownFieldSet parseFrom(final ByteString data)\n      throws InvalidProtocolBufferException {\n    return newBuilder().mergeFrom(data).build();\n  }\n\n  /** Parse {@code data} as an {@code UnknownFieldSet} and return it. */\n  public static UnknownFieldSet parseFrom(final byte[] data)\n      throws InvalidProtocolBufferException {\n    return newBuilder().mergeFrom(data).build();\n  }\n\n  /** Parse an {@code UnknownFieldSet} from {@code input} and return it. */\n  public static UnknownFieldSet parseFrom(final InputStream input)\n                                          throws IOException {\n    return newBuilder().mergeFrom(input).build();\n  }\n\n  public Builder newBuilderForType() {\n    return newBuilder();\n  }\n\n  public Builder toBuilder() {\n    return newBuilder().mergeFrom(this);\n  }\n\n  /**\n   * Builder for {@link UnknownFieldSet}s.\n   *\n   * <p>Note that this class maintains {@link Field.Builder}s for all fields\n   * in the set.  Thus, adding one element to an existing {@link Field} does not\n   * require making a copy.  This is important for efficient parsing of\n   * unknown repeated fields.  However, it implies that {@link Field}s cannot\n   * be constructed independently, nor can two {@link UnknownFieldSet}s share\n   * the same {@code Field} object.\n   *\n   * <p>Use {@link UnknownFieldSet#newBuilder()} to construct a {@code Builder}.\n   */\n  public static final class Builder implements MessageLite.Builder {\n    // This constructor should never be called directly (except from 'create').\n    private Builder() {}\n\n    private Map<Integer, Field> fields;\n\n    // Optimization:  We keep around a builder for the last field that was\n    //   modified so that we can efficiently add to it multiple times in a\n    //   row (important when parsing an unknown repeated field).\n    private int lastFieldNumber;\n    private Field.Builder lastField;\n\n    private static Builder create() {\n      Builder builder = new Builder();\n      builder.reinitialize();\n      return builder;\n    }\n\n    /**\n     * Get a field builder for the given field number which includes any\n     * values that already exist.\n     */\n    private Field.Builder getFieldBuilder(final int number) {\n      if (lastField != null) {\n        if (number == lastFieldNumber) {\n          return lastField;\n        }\n        // Note:  addField() will reset lastField and lastFieldNumber.\n        addField(lastFieldNumber, lastField.build());\n      }\n      if (number == 0) {\n        return null;\n      } else {\n        final Field existing = fields.get(number);\n        lastFieldNumber = number;\n        lastField = Field.newBuilder();\n        if (existing != null) {\n          lastField.mergeFrom(existing);\n        }\n        return lastField;\n      }\n    }\n\n    /**\n     * Build the {@link UnknownFieldSet} and return it.\n     *\n     * <p>Once {@code build()} has been called, the {@code Builder} will no\n     * longer be usable.  Calling any method after {@code build()} will result\n     * in undefined behavior and can cause a {@code NullPointerException} to be\n     * thrown.\n     */\n    public UnknownFieldSet build() {\n      getFieldBuilder(0);  // Force lastField to be built.\n      final UnknownFieldSet result;\n      if (fields.isEmpty()) {\n        result = getDefaultInstance();\n      } else {\n        result = new UnknownFieldSet(Collections.unmodifiableMap(fields));\n      }\n      fields = null;\n      return result;\n    }\n\n    public UnknownFieldSet buildPartial() {\n      // No required fields, so this is the same as build().\n      return build();\n    }\n\n    @Override\n    public Builder clone() {\n      getFieldBuilder(0);  // Force lastField to be built.\n      return UnknownFieldSet.newBuilder().mergeFrom(\n          new UnknownFieldSet(fields));\n    }\n\n    public UnknownFieldSet getDefaultInstanceForType() {\n      return UnknownFieldSet.getDefaultInstance();\n    }\n\n    private void reinitialize() {\n      fields = Collections.emptyMap();\n      lastFieldNumber = 0;\n      lastField = null;\n    }\n\n    /** Reset the builder to an empty set. */\n    public Builder clear() {\n      reinitialize();\n      return this;\n    }\n\n    /**\n     * Merge the fields from {@code other} into this set.  If a field number\n     * exists in both sets, {@code other}'s values for that field will be\n     * appended to the values in this set.\n     */\n    public Builder mergeFrom(final UnknownFieldSet other) {\n      if (other != getDefaultInstance()) {\n        for (final Map.Entry<Integer, Field> entry : other.fields.entrySet()) {\n          mergeField(entry.getKey(), entry.getValue());\n        }\n      }\n      return this;\n    }\n\n    /**\n     * Add a field to the {@code UnknownFieldSet}.  If a field with the same\n     * number already exists, the two are merged.\n     */\n    public Builder mergeField(final int number, final Field field) {\n      if (number == 0) {\n        throw new IllegalArgumentException(\"Zero is not a valid field number.\");\n      }\n      if (hasField(number)) {\n        getFieldBuilder(number).mergeFrom(field);\n      } else {\n        // Optimization:  We could call getFieldBuilder(number).mergeFrom(field)\n        // in this case, but that would create a copy of the Field object.\n        // We'd rather reuse the one passed to us, so call addField() instead.\n        addField(number, field);\n      }\n      return this;\n    }\n\n    /**\n     * Convenience method for merging a new field containing a single varint\n     * value.  This is used in particular when an unknown enum value is\n     * encountered.\n     */\n    public Builder mergeVarintField(final int number, final int value) {\n      if (number == 0) {\n        throw new IllegalArgumentException(\"Zero is not a valid field number.\");\n      }\n      getFieldBuilder(number).addVarint(value);\n      return this;\n    }\n\n    /** Check if the given field number is present in the set. */\n    public boolean hasField(final int number) {\n      if (number == 0) {\n        throw new IllegalArgumentException(\"Zero is not a valid field number.\");\n      }\n      return number == lastFieldNumber || fields.containsKey(number);\n    }\n\n    /**\n     * Add a field to the {@code UnknownFieldSet}.  If a field with the same\n     * number already exists, it is removed.\n     */\n    public Builder addField(final int number, final Field field) {\n      if (number == 0) {\n        throw new IllegalArgumentException(\"Zero is not a valid field number.\");\n      }\n      if (lastField != null && lastFieldNumber == number) {\n        // Discard this.\n        lastField = null;\n        lastFieldNumber = 0;\n      }\n      if (fields.isEmpty()) {\n        fields = new TreeMap<Integer,Field>();\n      }\n      fields.put(number, field);\n      return this;\n    }\n\n    /**\n     * Get all present {@code Field}s as an immutable {@code Map}.  If more\n     * fields are added, the changes may or may not be reflected in this map.\n     */\n    public Map<Integer, Field> asMap() {\n      getFieldBuilder(0);  // Force lastField to be built.\n      return Collections.unmodifiableMap(fields);\n    }\n\n    /**\n     * Parse an entire message from {@code input} and merge its fields into\n     * this set.\n     */\n    public Builder mergeFrom(final CodedInputStream input) throws IOException {\n      while (true) {\n        final int tag = input.readTag();\n        if (tag == 0 || !mergeFieldFrom(tag, input)) {\n          break;\n        }\n      }\n      return this;\n    }\n\n    /**\n     * Parse a single field from {@code input} and merge it into this set.\n     * @param tag The field's tag number, which was already parsed.\n     * @return {@code false} if the tag is an engroup tag.\n     */\n    public boolean mergeFieldFrom(final int tag, final CodedInputStream input)\n                                  throws IOException {\n      final int number = WireFormat.getTagFieldNumber(tag);\n      switch (WireFormat.getTagWireType(tag)) {\n        case WireFormat.WIRETYPE_VARINT:\n          getFieldBuilder(number).addVarint(input.readInt64());\n          return true;\n        case WireFormat.WIRETYPE_FIXED64:\n          getFieldBuilder(number).addFixed64(input.readFixed64());\n          return true;\n        case WireFormat.WIRETYPE_LENGTH_DELIMITED:\n          getFieldBuilder(number).addLengthDelimited(input.readBytes());\n          return true;\n        case WireFormat.WIRETYPE_START_GROUP:\n          final Builder subBuilder = newBuilder();\n          input.readGroup(number, subBuilder,\n                          ExtensionRegistry.getEmptyRegistry());\n          getFieldBuilder(number).addGroup(subBuilder.build());\n          return true;\n        case WireFormat.WIRETYPE_END_GROUP:\n          return false;\n        case WireFormat.WIRETYPE_FIXED32:\n          getFieldBuilder(number).addFixed32(input.readFixed32());\n          return true;\n        default:\n          throw InvalidProtocolBufferException.invalidWireType();\n      }\n    }\n\n    /**\n     * Parse {@code data} as an {@code UnknownFieldSet} and merge it with the\n     * set being built.  This is just a small wrapper around\n     * {@link #mergeFrom(CodedInputStream)}.\n     */\n    public Builder mergeFrom(final ByteString data)\n        throws InvalidProtocolBufferException {\n      try {\n        final CodedInputStream input = data.newCodedInput();\n        mergeFrom(input);\n        input.checkLastTagWas(0);\n        return this;\n      } catch (final InvalidProtocolBufferException e) {\n        throw e;\n      } catch (final IOException e) {\n        throw new RuntimeException(\n          \"Reading from a ByteString threw an IOException (should \" +\n          \"never happen).\", e);\n      }\n    }\n\n    /**\n     * Parse {@code data} as an {@code UnknownFieldSet} and merge it with the\n     * set being built.  This is just a small wrapper around\n     * {@link #mergeFrom(CodedInputStream)}.\n     */\n    public Builder mergeFrom(final byte[] data)\n        throws InvalidProtocolBufferException {\n      try {\n        final CodedInputStream input = CodedInputStream.newInstance(data);\n        mergeFrom(input);\n        input.checkLastTagWas(0);\n        return this;\n      } catch (final InvalidProtocolBufferException e) {\n        throw e;\n      } catch (final IOException e) {\n        throw new RuntimeException(\n          \"Reading from a byte array threw an IOException (should \" +\n          \"never happen).\", e);\n      }\n    }\n\n    /**\n     * Parse an {@code UnknownFieldSet} from {@code input} and merge it with the\n     * set being built.  This is just a small wrapper around\n     * {@link #mergeFrom(CodedInputStream)}.\n     */\n    public Builder mergeFrom(final InputStream input) throws IOException {\n      final CodedInputStream codedInput = CodedInputStream.newInstance(input);\n      mergeFrom(codedInput);\n      codedInput.checkLastTagWas(0);\n      return this;\n    }\n\n    public boolean mergeDelimitedFrom(InputStream input)\n        throws IOException {\n      final int firstByte = input.read();\n      if (firstByte == -1) {\n        return false;\n      }\n      final int size = CodedInputStream.readRawVarint32(firstByte, input);\n      final InputStream limitedInput = new LimitedInputStream(input, size);\n      mergeFrom(limitedInput);\n      return true;\n    }\n\n    public boolean mergeDelimitedFrom(\n        InputStream input,\n        ExtensionRegistryLite extensionRegistry) throws IOException {\n      // UnknownFieldSet has no extensions.\n      return mergeDelimitedFrom(input);\n    }\n\n    public Builder mergeFrom(\n        CodedInputStream input,\n        ExtensionRegistryLite extensionRegistry) throws IOException {\n      // UnknownFieldSet has no extensions.\n      return mergeFrom(input);\n    }\n\n    public Builder mergeFrom(\n        ByteString data,\n        ExtensionRegistryLite extensionRegistry)\n        throws InvalidProtocolBufferException {\n      // UnknownFieldSet has no extensions.\n      return mergeFrom(data);\n    }\n\n    public Builder mergeFrom(byte[] data, int off, int len)\n        throws InvalidProtocolBufferException {\n      try {\n        final CodedInputStream input =\n            CodedInputStream.newInstance(data, off, len);\n        mergeFrom(input);\n        input.checkLastTagWas(0);\n        return this;\n      } catch (InvalidProtocolBufferException e) {\n        throw e;\n      } catch (IOException e) {\n        throw new RuntimeException(\n          \"Reading from a byte array threw an IOException (should \" +\n          \"never happen).\", e);\n      }\n    }\n\n    public Builder mergeFrom(\n        byte[] data,\n        ExtensionRegistryLite extensionRegistry)\n        throws InvalidProtocolBufferException {\n      // UnknownFieldSet has no extensions.\n      return mergeFrom(data);\n    }\n\n    public Builder mergeFrom(\n        byte[] data, int off, int len,\n        ExtensionRegistryLite extensionRegistry)\n        throws InvalidProtocolBufferException {\n      // UnknownFieldSet has no extensions.\n      return mergeFrom(data, off, len);\n    }\n\n    public Builder mergeFrom(\n        InputStream input,\n        ExtensionRegistryLite extensionRegistry) throws IOException {\n      // UnknownFieldSet has no extensions.\n      return mergeFrom(input);\n    }\n\n    public boolean isInitialized() {\n      // UnknownFieldSets do not have required fields, so they are always\n      // initialized.\n      return true;\n    }\n  }\n\n  /**\n   * Represents a single field in an {@code UnknownFieldSet}.\n   *\n   * <p>A {@code Field} consists of five lists of values.  The lists correspond\n   * to the five \"wire types\" used in the protocol buffer binary format.\n   * The wire type of each field can be determined from the encoded form alone,\n   * without knowing the field's declared type.  So, we are able to parse\n   * unknown values at least this far and separate them.  Normally, only one\n   * of the five lists will contain any values, since it is impossible to\n   * define a valid message type that declares two different types for the\n   * same field number.  However, the code is designed to allow for the case\n   * where the same unknown field number is encountered using multiple different\n   * wire types.\n   *\n   * <p>{@code Field} is an immutable class.  To construct one, you must use a\n   * {@link Builder}.\n   *\n   * @see UnknownFieldSet\n   */\n  public static final class Field {\n    private Field() {}\n\n    /** Construct a new {@link Builder}. */\n    public static Builder newBuilder() {\n      return Builder.create();\n    }\n\n    /**\n     * Construct a new {@link Builder} and initialize it to a copy of\n     * {@code copyFrom}.\n     */\n    public static Builder newBuilder(final Field copyFrom) {\n      return newBuilder().mergeFrom(copyFrom);\n    }\n\n    /** Get an empty {@code Field}. */\n    public static Field getDefaultInstance() {\n      return fieldDefaultInstance;\n    }\n    private static final Field fieldDefaultInstance = newBuilder().build();\n\n    /** Get the list of varint values for this field. */\n    public List<Long> getVarintList()               { return varint;          }\n\n    /** Get the list of fixed32 values for this field. */\n    public List<Integer> getFixed32List()           { return fixed32;         }\n\n    /** Get the list of fixed64 values for this field. */\n    public List<Long> getFixed64List()              { return fixed64;         }\n\n    /** Get the list of length-delimited values for this field. */\n    public List<ByteString> getLengthDelimitedList() { return lengthDelimited; }\n\n    /**\n     * Get the list of embedded group values for this field.  These are\n     * represented using {@link UnknownFieldSet}s rather than {@link Message}s\n     * since the group's type is presumably unknown.\n     */\n    public List<UnknownFieldSet> getGroupList()      { return group;           }\n\n    @Override\n    public boolean equals(final Object other) {\n      if (this == other) {\n        return true;\n      }\n      if (!(other instanceof Field)) {\n        return false;\n      }\n      return Arrays.equals(getIdentityArray(),\n          ((Field) other).getIdentityArray());\n    }\n\n    @Override\n    public int hashCode() {\n      return Arrays.hashCode(getIdentityArray());\n    }\n\n    /**\n     * Returns the array of objects to be used to uniquely identify this\n     * {@link Field} instance.\n     */\n    private Object[] getIdentityArray() {\n      return new Object[] {\n          varint,\n          fixed32,\n          fixed64,\n          lengthDelimited,\n          group};\n    }\n\n    /**\n     * Serializes the field, including field number, and writes it to\n     * {@code output}.\n     */\n    public void writeTo(final int fieldNumber, final CodedOutputStream output)\n                        throws IOException {\n      for (final long value : varint) {\n        output.writeUInt64(fieldNumber, value);\n      }\n      for (final int value : fixed32) {\n        output.writeFixed32(fieldNumber, value);\n      }\n      for (final long value : fixed64) {\n        output.writeFixed64(fieldNumber, value);\n      }\n      for (final ByteString value : lengthDelimited) {\n        output.writeBytes(fieldNumber, value);\n      }\n      for (final UnknownFieldSet value : group) {\n        output.writeGroup(fieldNumber, value);\n      }\n    }\n\n    /**\n     * Get the number of bytes required to encode this field, including field\n     * number.\n     */\n    public int getSerializedSize(final int fieldNumber) {\n      int result = 0;\n      for (final long value : varint) {\n        result += CodedOutputStream.computeUInt64Size(fieldNumber, value);\n      }\n      for (final int value : fixed32) {\n        result += CodedOutputStream.computeFixed32Size(fieldNumber, value);\n      }\n      for (final long value : fixed64) {\n        result += CodedOutputStream.computeFixed64Size(fieldNumber, value);\n      }\n      for (final ByteString value : lengthDelimited) {\n        result += CodedOutputStream.computeBytesSize(fieldNumber, value);\n      }\n      for (final UnknownFieldSet value : group) {\n        result += CodedOutputStream.computeGroupSize(fieldNumber, value);\n      }\n      return result;\n    }\n\n    /**\n     * Serializes the field, including field number, and writes it to\n     * {@code output}, using {@code MessageSet} wire format.\n     */\n    public void writeAsMessageSetExtensionTo(\n        final int fieldNumber,\n        final CodedOutputStream output)\n        throws IOException {\n      for (final ByteString value : lengthDelimited) {\n        output.writeRawMessageSetExtension(fieldNumber, value);\n      }\n    }\n\n    /**\n     * Get the number of bytes required to encode this field, including field\n     * number, using {@code MessageSet} wire format.\n     */\n    public int getSerializedSizeAsMessageSetExtension(final int fieldNumber) {\n      int result = 0;\n      for (final ByteString value : lengthDelimited) {\n        result += CodedOutputStream.computeRawMessageSetExtensionSize(\n          fieldNumber, value);\n      }\n      return result;\n    }\n\n    private List<Long> varint;\n    private List<Integer> fixed32;\n    private List<Long> fixed64;\n    private List<ByteString> lengthDelimited;\n    private List<UnknownFieldSet> group;\n\n    /**\n     * Used to build a {@link Field} within an {@link UnknownFieldSet}.\n     *\n     * <p>Use {@link Field#newBuilder()} to construct a {@code Builder}.\n     */\n    public static final class Builder {\n      // This constructor should never be called directly (except from 'create').\n      private Builder() {}\n\n      private static Builder create() {\n        Builder builder = new Builder();\n        builder.result = new Field();\n        return builder;\n      }\n\n      private Field result;\n\n      /**\n       * Build the field.  After {@code build()} has been called, the\n       * {@code Builder} is no longer usable.  Calling any other method will\n       * result in undefined behavior and can cause a\n       * {@code NullPointerException} to be thrown.\n       */\n      public Field build() {\n        if (result.varint == null) {\n          result.varint = Collections.emptyList();\n        } else {\n          result.varint = Collections.unmodifiableList(result.varint);\n        }\n        if (result.fixed32 == null) {\n          result.fixed32 = Collections.emptyList();\n        } else {\n          result.fixed32 = Collections.unmodifiableList(result.fixed32);\n        }\n        if (result.fixed64 == null) {\n          result.fixed64 = Collections.emptyList();\n        } else {\n          result.fixed64 = Collections.unmodifiableList(result.fixed64);\n        }\n        if (result.lengthDelimited == null) {\n          result.lengthDelimited = Collections.emptyList();\n        } else {\n          result.lengthDelimited =\n            Collections.unmodifiableList(result.lengthDelimited);\n        }\n        if (result.group == null) {\n          result.group = Collections.emptyList();\n        } else {\n          result.group = Collections.unmodifiableList(result.group);\n        }\n\n        final Field returnMe = result;\n        result = null;\n        return returnMe;\n      }\n\n      /** Discard the field's contents. */\n      public Builder clear() {\n        result = new Field();\n        return this;\n      }\n\n      /**\n       * Merge the values in {@code other} into this field.  For each list\n       * of values, {@code other}'s values are append to the ones in this\n       * field.\n       */\n      public Builder mergeFrom(final Field other) {\n        if (!other.varint.isEmpty()) {\n          if (result.varint == null) {\n            result.varint = new ArrayList<Long>();\n          }\n          result.varint.addAll(other.varint);\n        }\n        if (!other.fixed32.isEmpty()) {\n          if (result.fixed32 == null) {\n            result.fixed32 = new ArrayList<Integer>();\n          }\n          result.fixed32.addAll(other.fixed32);\n        }\n        if (!other.fixed64.isEmpty()) {\n          if (result.fixed64 == null) {\n            result.fixed64 = new ArrayList<Long>();\n          }\n          result.fixed64.addAll(other.fixed64);\n        }\n        if (!other.lengthDelimited.isEmpty()) {\n          if (result.lengthDelimited == null) {\n            result.lengthDelimited = new ArrayList<ByteString>();\n          }\n          result.lengthDelimited.addAll(other.lengthDelimited);\n        }\n        if (!other.group.isEmpty()) {\n          if (result.group == null) {\n            result.group = new ArrayList<UnknownFieldSet>();\n          }\n          result.group.addAll(other.group);\n        }\n        return this;\n      }\n\n      /** Add a varint value. */\n      public Builder addVarint(final long value) {\n        if (result.varint == null) {\n          result.varint = new ArrayList<Long>();\n        }\n        result.varint.add(value);\n        return this;\n      }\n\n      /** Add a fixed32 value. */\n      public Builder addFixed32(final int value) {\n        if (result.fixed32 == null) {\n          result.fixed32 = new ArrayList<Integer>();\n        }\n        result.fixed32.add(value);\n        return this;\n      }\n\n      /** Add a fixed64 value. */\n      public Builder addFixed64(final long value) {\n        if (result.fixed64 == null) {\n          result.fixed64 = new ArrayList<Long>();\n        }\n        result.fixed64.add(value);\n        return this;\n      }\n\n      /** Add a length-delimited value. */\n      public Builder addLengthDelimited(final ByteString value) {\n        if (result.lengthDelimited == null) {\n          result.lengthDelimited = new ArrayList<ByteString>();\n        }\n        result.lengthDelimited.add(value);\n        return this;\n      }\n\n      /** Add an embedded group. */\n      public Builder addGroup(final UnknownFieldSet value) {\n        if (result.group == null) {\n          result.group = new ArrayList<UnknownFieldSet>();\n        }\n        result.group.add(value);\n        return this;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport java.util.AbstractList;\nimport java.util.RandomAccess;\nimport java.util.ListIterator;\nimport java.util.Iterator;\n\n/**\n * An implementation of {@link LazyStringList} that wraps another\n * {@link LazyStringList} such that it cannot be modified via the wrapper.\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic class UnmodifiableLazyStringList extends AbstractList<String>\n    implements LazyStringList, RandomAccess {\n\n  private final LazyStringList list;\n\n  public UnmodifiableLazyStringList(LazyStringList list) {\n    this.list = list;\n  }\n\n  @Override\n  public String get(int index) {\n    return list.get(index);\n  }\n\n  @Override\n  public int size() {\n    return list.size();\n  }\n\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  public ByteString getByteString(int index) {\n    return list.getByteString(index);\n  }\n\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  public void add(ByteString element) {\n    throw new UnsupportedOperationException();\n  }\n\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  public ListIterator<String> listIterator(final int index) {\n    return new ListIterator<String>() {\n      ListIterator<String> iter = list.listIterator(index);\n\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public boolean hasNext() {\n        return iter.hasNext();\n      }\n\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public String next() {\n        return iter.next();\n      }\n\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public boolean hasPrevious() {\n        return iter.hasPrevious();\n      }\n\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public String previous() {\n        return iter.previous();\n      }\n\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public int nextIndex() {\n        return iter.nextIndex();\n      }\n\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public int previousIndex() {\n        return iter.previousIndex();\n      }\n\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public void remove() {\n        throw new UnsupportedOperationException();\n      }\n\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public void set(String o) {\n        throw new UnsupportedOperationException();\n      }\n\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public void add(String o) {\n        throw new UnsupportedOperationException();\n      }\n    };\n  }\n\n  @Override\n  public Iterator<String> iterator() {\n    return new Iterator<String>() {\n      Iterator<String> iter = list.iterator();\n\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public boolean hasNext() {\n        return iter.hasNext();\n      }\n\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public String next() {\n        return iter.next();\n      }\n\n      //@Override (Java 1.6 override semantics, but we must support 1.5)\n      public void remove() {\n        throw new UnsupportedOperationException();\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\n/**\n * This class is used internally by the Protocol Buffer library and generated\n * message implementations.  It is public only because those generated messages\n * do not reside in the {@code protobuf} package.  Others should not use this\n * class directly.\n *\n * This class contains constants and helper functions useful for dealing with\n * the Protocol Buffer wire format.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic final class WireFormat {\n  // Do not allow instantiation.\n  private WireFormat() {}\n\n  public static final int WIRETYPE_VARINT           = 0;\n  public static final int WIRETYPE_FIXED64          = 1;\n  public static final int WIRETYPE_LENGTH_DELIMITED = 2;\n  public static final int WIRETYPE_START_GROUP      = 3;\n  public static final int WIRETYPE_END_GROUP        = 4;\n  public static final int WIRETYPE_FIXED32          = 5;\n\n  static final int TAG_TYPE_BITS = 3;\n  static final int TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1;\n\n  /** Given a tag value, determines the wire type (the lower 3 bits). */\n  static int getTagWireType(final int tag) {\n    return tag & TAG_TYPE_MASK;\n  }\n\n  /** Given a tag value, determines the field number (the upper 29 bits). */\n  public static int getTagFieldNumber(final int tag) {\n    return tag >>> TAG_TYPE_BITS;\n  }\n\n  /** Makes a tag value given a field number and wire type. */\n  static int makeTag(final int fieldNumber, final int wireType) {\n    return (fieldNumber << TAG_TYPE_BITS) | wireType;\n  }\n\n  /**\n   * Lite equivalent to {@link Descriptors.FieldDescriptor.JavaType}.  This is\n   * only here to support the lite runtime and should not be used by users.\n   */\n  public enum JavaType {\n    INT(0),\n    LONG(0L),\n    FLOAT(0F),\n    DOUBLE(0D),\n    BOOLEAN(false),\n    STRING(\"\"),\n    BYTE_STRING(ByteString.EMPTY),\n    ENUM(null),\n    MESSAGE(null);\n\n    JavaType(final Object defaultDefault) {\n      this.defaultDefault = defaultDefault;\n    }\n\n    /**\n     * The default default value for fields of this type, if it's a primitive\n     * type.\n     */\n    Object getDefaultDefault() {\n      return defaultDefault;\n    }\n\n    private final Object defaultDefault;\n  }\n\n  /**\n   * Lite equivalent to {@link Descriptors.FieldDescriptor.Type}.  This is\n   * only here to support the lite runtime and should not be used by users.\n   */\n  public enum FieldType {\n    DOUBLE  (JavaType.DOUBLE     , WIRETYPE_FIXED64         ),\n    FLOAT   (JavaType.FLOAT      , WIRETYPE_FIXED32         ),\n    INT64   (JavaType.LONG       , WIRETYPE_VARINT          ),\n    UINT64  (JavaType.LONG       , WIRETYPE_VARINT          ),\n    INT32   (JavaType.INT        , WIRETYPE_VARINT          ),\n    FIXED64 (JavaType.LONG       , WIRETYPE_FIXED64         ),\n    FIXED32 (JavaType.INT        , WIRETYPE_FIXED32         ),\n    BOOL    (JavaType.BOOLEAN    , WIRETYPE_VARINT          ),\n    STRING  (JavaType.STRING     , WIRETYPE_LENGTH_DELIMITED) {\n      public boolean isPackable() { return false; }\n    },\n    GROUP   (JavaType.MESSAGE    , WIRETYPE_START_GROUP     ) {\n      public boolean isPackable() { return false; }\n    },\n    MESSAGE (JavaType.MESSAGE    , WIRETYPE_LENGTH_DELIMITED) {\n      public boolean isPackable() { return false; }\n    },\n    BYTES   (JavaType.BYTE_STRING, WIRETYPE_LENGTH_DELIMITED) {\n      public boolean isPackable() { return false; }\n    },\n    UINT32  (JavaType.INT        , WIRETYPE_VARINT          ),\n    ENUM    (JavaType.ENUM       , WIRETYPE_VARINT          ),\n    SFIXED32(JavaType.INT        , WIRETYPE_FIXED32         ),\n    SFIXED64(JavaType.LONG       , WIRETYPE_FIXED64         ),\n    SINT32  (JavaType.INT        , WIRETYPE_VARINT          ),\n    SINT64  (JavaType.LONG       , WIRETYPE_VARINT          );\n\n    FieldType(final JavaType javaType, final int wireType) {\n      this.javaType = javaType;\n      this.wireType = wireType;\n    }\n\n    private final JavaType javaType;\n    private final int wireType;\n\n    public JavaType getJavaType() { return javaType; }\n    public int getWireType() { return wireType; }\n\n    public boolean isPackable() { return true; }\n  }\n\n  // Field numbers for feilds in MessageSet wire format.\n  static final int MESSAGE_SET_ITEM    = 1;\n  static final int MESSAGE_SET_TYPE_ID = 2;\n  static final int MESSAGE_SET_MESSAGE = 3;\n\n  // Tag numbers.\n  static final int MESSAGE_SET_ITEM_TAG =\n    makeTag(MESSAGE_SET_ITEM, WIRETYPE_START_GROUP);\n  static final int MESSAGE_SET_ITEM_END_TAG =\n    makeTag(MESSAGE_SET_ITEM, WIRETYPE_END_GROUP);\n  static final int MESSAGE_SET_TYPE_ID_TAG =\n    makeTag(MESSAGE_SET_TYPE_ID, WIRETYPE_VARINT);\n  static final int MESSAGE_SET_MESSAGE_TAG =\n    makeTag(MESSAGE_SET_MESSAGE, WIRETYPE_LENGTH_DELIMITED);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize;\nimport protobuf_unittest.UnittestProto;\nimport protobuf_unittest.UnittestProto.ForeignMessage;\nimport protobuf_unittest.UnittestProto.TestAllExtensions;\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestPackedTypes;\nimport protobuf_unittest.UnittestProto.TestRequired;\nimport protobuf_unittest.UnittestProto.TestRequiredForeign;\nimport protobuf_unittest.UnittestProto.TestUnpackedTypes;\n\nimport junit.framework.TestCase;\n\nimport java.util.Map;\n\n/**\n * Unit test for {@link AbstractMessage}.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic class AbstractMessageTest extends TestCase {\n  /**\n   * Extends AbstractMessage and wraps some other message object.  The methods\n   * of the Message interface which aren't explicitly implemented by\n   * AbstractMessage are forwarded to the wrapped object.  This allows us to\n   * test that AbstractMessage's implementations work even if the wrapped\n   * object does not use them.\n   */\n  private static class AbstractMessageWrapper extends AbstractMessage {\n    private final Message wrappedMessage;\n\n    public AbstractMessageWrapper(Message wrappedMessage) {\n      this.wrappedMessage = wrappedMessage;\n    }\n\n    public Descriptors.Descriptor getDescriptorForType() {\n      return wrappedMessage.getDescriptorForType();\n    }\n    public AbstractMessageWrapper getDefaultInstanceForType() {\n      return new AbstractMessageWrapper(\n        wrappedMessage.getDefaultInstanceForType());\n    }\n    public Map<Descriptors.FieldDescriptor, Object> getAllFields() {\n      return wrappedMessage.getAllFields();\n    }\n    public boolean hasField(Descriptors.FieldDescriptor field) {\n      return wrappedMessage.hasField(field);\n    }\n    public Object getField(Descriptors.FieldDescriptor field) {\n      return wrappedMessage.getField(field);\n    }\n    public int getRepeatedFieldCount(Descriptors.FieldDescriptor field) {\n      return wrappedMessage.getRepeatedFieldCount(field);\n    }\n    public Object getRepeatedField(\n        Descriptors.FieldDescriptor field, int index) {\n      return wrappedMessage.getRepeatedField(field, index);\n    }\n    public UnknownFieldSet getUnknownFields() {\n      return wrappedMessage.getUnknownFields();\n    }\n    public Builder newBuilderForType() {\n      return new Builder(wrappedMessage.newBuilderForType());\n    }\n    public Builder toBuilder() {\n      return new Builder(wrappedMessage.toBuilder());\n    }\n\n    static class Builder extends AbstractMessage.Builder<Builder> {\n      private final Message.Builder wrappedBuilder;\n\n      public Builder(Message.Builder wrappedBuilder) {\n        this.wrappedBuilder = wrappedBuilder;\n      }\n\n      public AbstractMessageWrapper build() {\n        return new AbstractMessageWrapper(wrappedBuilder.build());\n      }\n      public AbstractMessageWrapper buildPartial() {\n        return new AbstractMessageWrapper(wrappedBuilder.buildPartial());\n      }\n      public Builder clone() {\n        return new Builder(wrappedBuilder.clone());\n      }\n      public boolean isInitialized() {\n        return clone().buildPartial().isInitialized();\n      }\n      public Descriptors.Descriptor getDescriptorForType() {\n        return wrappedBuilder.getDescriptorForType();\n      }\n      public AbstractMessageWrapper getDefaultInstanceForType() {\n        return new AbstractMessageWrapper(\n          wrappedBuilder.getDefaultInstanceForType());\n      }\n      public Map<Descriptors.FieldDescriptor, Object> getAllFields() {\n        return wrappedBuilder.getAllFields();\n      }\n      public Builder newBuilderForField(Descriptors.FieldDescriptor field) {\n        return new Builder(wrappedBuilder.newBuilderForField(field));\n      }\n      public boolean hasField(Descriptors.FieldDescriptor field) {\n        return wrappedBuilder.hasField(field);\n      }\n      public Object getField(Descriptors.FieldDescriptor field) {\n        return wrappedBuilder.getField(field);\n      }\n      public Builder setField(Descriptors.FieldDescriptor field, Object value) {\n        wrappedBuilder.setField(field, value);\n        return this;\n      }\n      public Builder clearField(Descriptors.FieldDescriptor field) {\n        wrappedBuilder.clearField(field);\n        return this;\n      }\n      public int getRepeatedFieldCount(Descriptors.FieldDescriptor field) {\n        return wrappedBuilder.getRepeatedFieldCount(field);\n      }\n      public Object getRepeatedField(\n          Descriptors.FieldDescriptor field, int index) {\n        return wrappedBuilder.getRepeatedField(field, index);\n      }\n      public Builder setRepeatedField(Descriptors.FieldDescriptor field,\n                                      int index, Object value) {\n        wrappedBuilder.setRepeatedField(field, index, value);\n        return this;\n      }\n      public Builder addRepeatedField(\n          Descriptors.FieldDescriptor field, Object value) {\n        wrappedBuilder.addRepeatedField(field, value);\n        return this;\n      }\n      public UnknownFieldSet getUnknownFields() {\n        return wrappedBuilder.getUnknownFields();\n      }\n      public Builder setUnknownFields(UnknownFieldSet unknownFields) {\n        wrappedBuilder.setUnknownFields(unknownFields);\n        return this;\n      }\n    }\n  }\n\n  // =================================================================\n\n  TestUtil.ReflectionTester reflectionTester =\n    new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null);\n\n  TestUtil.ReflectionTester extensionsReflectionTester =\n    new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(),\n                                  TestUtil.getExtensionRegistry());\n\n  public void testClear() throws Exception {\n    AbstractMessageWrapper message =\n      new AbstractMessageWrapper.Builder(\n          TestAllTypes.newBuilder(TestUtil.getAllSet()))\n        .clear().build();\n    TestUtil.assertClear((TestAllTypes) message.wrappedMessage);\n  }\n\n  public void testCopy() throws Exception {\n    AbstractMessageWrapper message =\n      new AbstractMessageWrapper.Builder(TestAllTypes.newBuilder())\n        .mergeFrom(TestUtil.getAllSet()).build();\n    TestUtil.assertAllFieldsSet((TestAllTypes) message.wrappedMessage);\n  }\n\n  public void testSerializedSize() throws Exception {\n    TestAllTypes message = TestUtil.getAllSet();\n    Message abstractMessage = new AbstractMessageWrapper(TestUtil.getAllSet());\n\n    assertEquals(message.getSerializedSize(),\n                 abstractMessage.getSerializedSize());\n  }\n\n  public void testSerialization() throws Exception {\n    Message abstractMessage = new AbstractMessageWrapper(TestUtil.getAllSet());\n\n    TestUtil.assertAllFieldsSet(\n      TestAllTypes.parseFrom(abstractMessage.toByteString()));\n\n    assertEquals(TestUtil.getAllSet().toByteString(),\n                 abstractMessage.toByteString());\n  }\n\n  public void testParsing() throws Exception {\n    AbstractMessageWrapper.Builder builder =\n      new AbstractMessageWrapper.Builder(TestAllTypes.newBuilder());\n    AbstractMessageWrapper message =\n      builder.mergeFrom(TestUtil.getAllSet().toByteString()).build();\n    TestUtil.assertAllFieldsSet((TestAllTypes) message.wrappedMessage);\n  }\n\n  public void testPackedSerialization() throws Exception {\n    Message abstractMessage =\n        new AbstractMessageWrapper(TestUtil.getPackedSet());\n\n    TestUtil.assertPackedFieldsSet(\n      TestPackedTypes.parseFrom(abstractMessage.toByteString()));\n\n    assertEquals(TestUtil.getPackedSet().toByteString(),\n                 abstractMessage.toByteString());\n  }\n\n  public void testPackedParsing() throws Exception {\n    AbstractMessageWrapper.Builder builder =\n      new AbstractMessageWrapper.Builder(TestPackedTypes.newBuilder());\n    AbstractMessageWrapper message =\n      builder.mergeFrom(TestUtil.getPackedSet().toByteString()).build();\n    TestUtil.assertPackedFieldsSet((TestPackedTypes) message.wrappedMessage);\n  }\n\n  public void testUnpackedSerialization() throws Exception {\n    Message abstractMessage =\n      new AbstractMessageWrapper(TestUtil.getUnpackedSet());\n\n    TestUtil.assertUnpackedFieldsSet(\n      TestUnpackedTypes.parseFrom(abstractMessage.toByteString()));\n\n    assertEquals(TestUtil.getUnpackedSet().toByteString(),\n                 abstractMessage.toByteString());\n  }\n\n  public void testParsePackedToUnpacked() throws Exception {\n    AbstractMessageWrapper.Builder builder =\n      new AbstractMessageWrapper.Builder(TestUnpackedTypes.newBuilder());\n    AbstractMessageWrapper message =\n      builder.mergeFrom(TestUtil.getPackedSet().toByteString()).build();\n    TestUtil.assertUnpackedFieldsSet(\n      (TestUnpackedTypes) message.wrappedMessage);\n  }\n\n  public void testParseUnpackedToPacked() throws Exception {\n    AbstractMessageWrapper.Builder builder =\n      new AbstractMessageWrapper.Builder(TestPackedTypes.newBuilder());\n    AbstractMessageWrapper message =\n      builder.mergeFrom(TestUtil.getUnpackedSet().toByteString()).build();\n    TestUtil.assertPackedFieldsSet((TestPackedTypes) message.wrappedMessage);\n  }\n\n  public void testUnpackedParsing() throws Exception {\n    AbstractMessageWrapper.Builder builder =\n      new AbstractMessageWrapper.Builder(TestUnpackedTypes.newBuilder());\n    AbstractMessageWrapper message =\n      builder.mergeFrom(TestUtil.getUnpackedSet().toByteString()).build();\n    TestUtil.assertUnpackedFieldsSet(\n      (TestUnpackedTypes) message.wrappedMessage);\n  }\n\n  public void testOptimizedForSize() throws Exception {\n    // We're mostly only checking that this class was compiled successfully.\n    TestOptimizedForSize message =\n      TestOptimizedForSize.newBuilder().setI(1).build();\n    message = TestOptimizedForSize.parseFrom(message.toByteString());\n    assertEquals(2, message.getSerializedSize());\n  }\n\n  // -----------------------------------------------------------------\n  // Tests for isInitialized().\n\n  private static final TestRequired TEST_REQUIRED_UNINITIALIZED =\n    TestRequired.getDefaultInstance();\n  private static final TestRequired TEST_REQUIRED_INITIALIZED =\n    TestRequired.newBuilder().setA(1).setB(2).setC(3).build();\n\n  public void testIsInitialized() throws Exception {\n    TestRequired.Builder builder = TestRequired.newBuilder();\n    AbstractMessageWrapper.Builder abstractBuilder =\n      new AbstractMessageWrapper.Builder(builder);\n\n    assertFalse(abstractBuilder.isInitialized());\n    builder.setA(1);\n    assertFalse(abstractBuilder.isInitialized());\n    builder.setB(1);\n    assertFalse(abstractBuilder.isInitialized());\n    builder.setC(1);\n    assertTrue(abstractBuilder.isInitialized());\n  }\n\n  public void testForeignIsInitialized() throws Exception {\n    TestRequiredForeign.Builder builder = TestRequiredForeign.newBuilder();\n    AbstractMessageWrapper.Builder abstractBuilder =\n      new AbstractMessageWrapper.Builder(builder);\n\n    assertTrue(abstractBuilder.isInitialized());\n\n    builder.setOptionalMessage(TEST_REQUIRED_UNINITIALIZED);\n    assertFalse(abstractBuilder.isInitialized());\n\n    builder.setOptionalMessage(TEST_REQUIRED_INITIALIZED);\n    assertTrue(abstractBuilder.isInitialized());\n\n    builder.addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED);\n    assertFalse(abstractBuilder.isInitialized());\n\n    builder.setRepeatedMessage(0, TEST_REQUIRED_INITIALIZED);\n    assertTrue(abstractBuilder.isInitialized());\n  }\n\n  // -----------------------------------------------------------------\n  // Tests for mergeFrom\n\n  static final TestAllTypes MERGE_SOURCE =\n    TestAllTypes.newBuilder()\n      .setOptionalInt32(1)\n      .setOptionalString(\"foo\")\n      .setOptionalForeignMessage(ForeignMessage.getDefaultInstance())\n      .addRepeatedString(\"bar\")\n      .build();\n\n  static final TestAllTypes MERGE_DEST =\n    TestAllTypes.newBuilder()\n      .setOptionalInt64(2)\n      .setOptionalString(\"baz\")\n      .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(3).build())\n      .addRepeatedString(\"qux\")\n      .build();\n\n  static final String MERGE_RESULT_TEXT =\n      \"optional_int32: 1\\n\" +\n      \"optional_int64: 2\\n\" +\n      \"optional_string: \\\"foo\\\"\\n\" +\n      \"optional_foreign_message {\\n\" +\n      \"  c: 3\\n\" +\n      \"}\\n\" +\n      \"repeated_string: \\\"qux\\\"\\n\" +\n      \"repeated_string: \\\"bar\\\"\\n\";\n\n  public void testMergeFrom() throws Exception {\n    AbstractMessageWrapper result =\n      new AbstractMessageWrapper.Builder(\n        TestAllTypes.newBuilder(MERGE_DEST))\n      .mergeFrom(MERGE_SOURCE).build();\n\n    assertEquals(MERGE_RESULT_TEXT, result.toString());\n  }\n\n  // -----------------------------------------------------------------\n  // Tests for equals and hashCode\n\n  public void testEqualsAndHashCode() throws Exception {\n    TestAllTypes a = TestUtil.getAllSet();\n    TestAllTypes b = TestAllTypes.newBuilder().build();\n    TestAllTypes c = TestAllTypes.newBuilder(b).addRepeatedString(\"x\").build();\n    TestAllTypes d = TestAllTypes.newBuilder(c).addRepeatedString(\"y\").build();\n    TestAllExtensions e = TestUtil.getAllExtensionsSet();\n    TestAllExtensions f = TestAllExtensions.newBuilder(e)\n        .addExtension(UnittestProto.repeatedInt32Extension, 999).build();\n\n    checkEqualsIsConsistent(a);\n    checkEqualsIsConsistent(b);\n    checkEqualsIsConsistent(c);\n    checkEqualsIsConsistent(d);\n    checkEqualsIsConsistent(e);\n    checkEqualsIsConsistent(f);\n\n    checkNotEqual(a, b);\n    checkNotEqual(a, c);\n    checkNotEqual(a, d);\n    checkNotEqual(a, e);\n    checkNotEqual(a, f);\n\n    checkNotEqual(b, c);\n    checkNotEqual(b, d);\n    checkNotEqual(b, e);\n    checkNotEqual(b, f);\n\n    checkNotEqual(c, d);\n    checkNotEqual(c, e);\n    checkNotEqual(c, f);\n\n    checkNotEqual(d, e);\n    checkNotEqual(d, f);\n\n    checkNotEqual(e, f);\n\n    // Deserializing into the TestEmptyMessage such that every field\n    // is an {@link UnknownFieldSet.Field}.\n    UnittestProto.TestEmptyMessage eUnknownFields =\n        UnittestProto.TestEmptyMessage.parseFrom(e.toByteArray());\n    UnittestProto.TestEmptyMessage fUnknownFields =\n        UnittestProto.TestEmptyMessage.parseFrom(f.toByteArray());\n    checkNotEqual(eUnknownFields, fUnknownFields);\n    checkEqualsIsConsistent(eUnknownFields);\n    checkEqualsIsConsistent(fUnknownFields);\n\n    // Subsequent reconstitutions should be identical\n    UnittestProto.TestEmptyMessage eUnknownFields2 =\n        UnittestProto.TestEmptyMessage.parseFrom(e.toByteArray());\n    checkEqualsIsConsistent(eUnknownFields, eUnknownFields2);\n  }\n\n\n  /**\n   * Asserts that the given proto has symetric equals and hashCode methods.\n   */\n  private void checkEqualsIsConsistent(Message message) {\n    // Object should be equal to itself.\n    assertEquals(message, message);\n\n    // Object should be equal to a dynamic copy of itself.\n    DynamicMessage dynamic = DynamicMessage.newBuilder(message).build();\n    checkEqualsIsConsistent(message, dynamic);\n  }\n\n  /**\n   * Asserts that the given protos are equal and have the same hash code.\n   */\n  private void checkEqualsIsConsistent(Message message1, Message message2) {\n    assertEquals(message1, message2);\n    assertEquals(message2, message1);\n    assertEquals(message2.hashCode(), message1.hashCode());\n  }\n\n  /**\n   * Asserts that the given protos are not equal and have different hash codes.\n   *\n   * @warning It's valid for non-equal objects to have the same hash code, so\n   *   this test is stricter than it needs to be. However, this should happen\n   *   relatively rarely.\n   */\n  private void checkNotEqual(Message m1, Message m2) {\n    String equalsError = String.format(\"%s should not be equal to %s\", m1, m2);\n    assertFalse(equalsError, m1.equals(m2));\n    assertFalse(equalsError, m2.equals(m1));\n\n    assertFalse(\n        String.format(\"%s should have a different hash code from %s\", m1, m2),\n        m1.hashCode() == m2.hashCode());\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestRecursiveMessage;\n\nimport junit.framework.TestCase;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.FilterInputStream;\nimport java.io.InputStream;\nimport java.io.IOException;\n\n/**\n * Unit test for {@link CodedInputStream}.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic class CodedInputStreamTest extends TestCase {\n  /**\n   * Helper to construct a byte array from a bunch of bytes.  The inputs are\n   * actually ints so that I can use hex notation and not get stupid errors\n   * about precision.\n   */\n  private byte[] bytes(int... bytesAsInts) {\n    byte[] bytes = new byte[bytesAsInts.length];\n    for (int i = 0; i < bytesAsInts.length; i++) {\n      bytes[i] = (byte) bytesAsInts[i];\n    }\n    return bytes;\n  }\n\n  /**\n   * An InputStream which limits the number of bytes it reads at a time.\n   * We use this to make sure that CodedInputStream doesn't screw up when\n   * reading in small blocks.\n   */\n  private static final class SmallBlockInputStream extends FilterInputStream {\n    private final int blockSize;\n\n    public SmallBlockInputStream(byte[] data, int blockSize) {\n      this(new ByteArrayInputStream(data), blockSize);\n    }\n\n    public SmallBlockInputStream(InputStream in, int blockSize) {\n      super(in);\n      this.blockSize = blockSize;\n    }\n\n    public int read(byte[] b) throws IOException {\n      return super.read(b, 0, Math.min(b.length, blockSize));\n    }\n\n    public int read(byte[] b, int off, int len) throws IOException {\n      return super.read(b, off, Math.min(len, blockSize));\n    }\n  }\n\n  /**\n   * Parses the given bytes using readRawVarint32() and readRawVarint64() and\n   * checks that the result matches the given value.\n   */\n  private void assertReadVarint(byte[] data, long value) throws Exception {\n    CodedInputStream input = CodedInputStream.newInstance(data);\n    assertEquals((int)value, input.readRawVarint32());\n\n    input = CodedInputStream.newInstance(data);\n    assertEquals(value, input.readRawVarint64());\n    assertTrue(input.isAtEnd());\n\n    // Try different block sizes.\n    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {\n      input = CodedInputStream.newInstance(\n        new SmallBlockInputStream(data, blockSize));\n      assertEquals((int)value, input.readRawVarint32());\n\n      input = CodedInputStream.newInstance(\n        new SmallBlockInputStream(data, blockSize));\n      assertEquals(value, input.readRawVarint64());\n      assertTrue(input.isAtEnd());\n    }\n\n    // Try reading direct from an InputStream.  We want to verify that it\n    // doesn't read past the end of the input, so we copy to a new, bigger\n    // array first.\n    byte[] longerData = new byte[data.length + 1];\n    System.arraycopy(data, 0, longerData, 0, data.length);\n    InputStream rawInput = new ByteArrayInputStream(longerData);\n    assertEquals((int)value, CodedInputStream.readRawVarint32(rawInput));\n    assertEquals(1, rawInput.available());\n  }\n\n  /**\n   * Parses the given bytes using readRawVarint32() and readRawVarint64() and\n   * expects them to fail with an InvalidProtocolBufferException whose\n   * description matches the given one.\n   */\n  private void assertReadVarintFailure(\n      InvalidProtocolBufferException expected, byte[] data)\n      throws Exception {\n    CodedInputStream input = CodedInputStream.newInstance(data);\n    try {\n      input.readRawVarint32();\n      fail(\"Should have thrown an exception.\");\n    } catch (InvalidProtocolBufferException e) {\n      assertEquals(expected.getMessage(), e.getMessage());\n    }\n\n    input = CodedInputStream.newInstance(data);\n    try {\n      input.readRawVarint64();\n      fail(\"Should have thrown an exception.\");\n    } catch (InvalidProtocolBufferException e) {\n      assertEquals(expected.getMessage(), e.getMessage());\n    }\n\n    // Make sure we get the same error when reading direct from an InputStream.\n    try {\n      CodedInputStream.readRawVarint32(new ByteArrayInputStream(data));\n      fail(\"Should have thrown an exception.\");\n    } catch (InvalidProtocolBufferException e) {\n      assertEquals(expected.getMessage(), e.getMessage());\n    }\n  }\n\n  /** Tests readRawVarint32() and readRawVarint64(). */\n  public void testReadVarint() throws Exception {\n    assertReadVarint(bytes(0x00), 0);\n    assertReadVarint(bytes(0x01), 1);\n    assertReadVarint(bytes(0x7f), 127);\n    // 14882\n    assertReadVarint(bytes(0xa2, 0x74), (0x22 << 0) | (0x74 << 7));\n    // 2961488830\n    assertReadVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b),\n      (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |\n      (0x0bL << 28));\n\n    // 64-bit\n    // 7256456126\n    assertReadVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b),\n      (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |\n      (0x1bL << 28));\n    // 41256202580718336\n    assertReadVarint(\n      bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49),\n      (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |\n      (0x43L << 28) | (0x49L << 35) | (0x24L << 42) | (0x49L << 49));\n    // 11964378330978735131\n    assertReadVarint(\n      bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01),\n      (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |\n      (0x3bL << 28) | (0x56L << 35) | (0x00L << 42) |\n      (0x05L << 49) | (0x26L << 56) | (0x01L << 63));\n\n    // Failures\n    assertReadVarintFailure(\n      InvalidProtocolBufferException.malformedVarint(),\n      bytes(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,\n            0x00));\n    assertReadVarintFailure(\n      InvalidProtocolBufferException.truncatedMessage(),\n      bytes(0x80));\n  }\n\n  /**\n   * Parses the given bytes using readRawLittleEndian32() and checks\n   * that the result matches the given value.\n   */\n  private void assertReadLittleEndian32(byte[] data, int value)\n                                        throws Exception {\n    CodedInputStream input = CodedInputStream.newInstance(data);\n    assertEquals(value, input.readRawLittleEndian32());\n    assertTrue(input.isAtEnd());\n\n    // Try different block sizes.\n    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {\n      input = CodedInputStream.newInstance(\n        new SmallBlockInputStream(data, blockSize));\n      assertEquals(value, input.readRawLittleEndian32());\n      assertTrue(input.isAtEnd());\n    }\n  }\n\n  /**\n   * Parses the given bytes using readRawLittleEndian64() and checks\n   * that the result matches the given value.\n   */\n  private void assertReadLittleEndian64(byte[] data, long value)\n                                        throws Exception {\n    CodedInputStream input = CodedInputStream.newInstance(data);\n    assertEquals(value, input.readRawLittleEndian64());\n    assertTrue(input.isAtEnd());\n\n    // Try different block sizes.\n    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {\n      input = CodedInputStream.newInstance(\n        new SmallBlockInputStream(data, blockSize));\n      assertEquals(value, input.readRawLittleEndian64());\n      assertTrue(input.isAtEnd());\n    }\n  }\n\n  /** Tests readRawLittleEndian32() and readRawLittleEndian64(). */\n  public void testReadLittleEndian() throws Exception {\n    assertReadLittleEndian32(bytes(0x78, 0x56, 0x34, 0x12), 0x12345678);\n    assertReadLittleEndian32(bytes(0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef0);\n\n    assertReadLittleEndian64(\n      bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12),\n      0x123456789abcdef0L);\n    assertReadLittleEndian64(\n      bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a),\n      0x9abcdef012345678L);\n  }\n\n  /** Test decodeZigZag32() and decodeZigZag64(). */\n  public void testDecodeZigZag() throws Exception {\n    assertEquals( 0, CodedInputStream.decodeZigZag32(0));\n    assertEquals(-1, CodedInputStream.decodeZigZag32(1));\n    assertEquals( 1, CodedInputStream.decodeZigZag32(2));\n    assertEquals(-2, CodedInputStream.decodeZigZag32(3));\n    assertEquals(0x3FFFFFFF, CodedInputStream.decodeZigZag32(0x7FFFFFFE));\n    assertEquals(0xC0000000, CodedInputStream.decodeZigZag32(0x7FFFFFFF));\n    assertEquals(0x7FFFFFFF, CodedInputStream.decodeZigZag32(0xFFFFFFFE));\n    assertEquals(0x80000000, CodedInputStream.decodeZigZag32(0xFFFFFFFF));\n\n    assertEquals( 0, CodedInputStream.decodeZigZag64(0));\n    assertEquals(-1, CodedInputStream.decodeZigZag64(1));\n    assertEquals( 1, CodedInputStream.decodeZigZag64(2));\n    assertEquals(-2, CodedInputStream.decodeZigZag64(3));\n    assertEquals(0x000000003FFFFFFFL,\n                 CodedInputStream.decodeZigZag64(0x000000007FFFFFFEL));\n    assertEquals(0xFFFFFFFFC0000000L,\n                 CodedInputStream.decodeZigZag64(0x000000007FFFFFFFL));\n    assertEquals(0x000000007FFFFFFFL,\n                 CodedInputStream.decodeZigZag64(0x00000000FFFFFFFEL));\n    assertEquals(0xFFFFFFFF80000000L,\n                 CodedInputStream.decodeZigZag64(0x00000000FFFFFFFFL));\n    assertEquals(0x7FFFFFFFFFFFFFFFL,\n                 CodedInputStream.decodeZigZag64(0xFFFFFFFFFFFFFFFEL));\n    assertEquals(0x8000000000000000L,\n                 CodedInputStream.decodeZigZag64(0xFFFFFFFFFFFFFFFFL));\n  }\n\n  /** Tests reading and parsing a whole message with every field type. */\n  public void testReadWholeMessage() throws Exception {\n    TestAllTypes message = TestUtil.getAllSet();\n\n    byte[] rawBytes = message.toByteArray();\n    assertEquals(rawBytes.length, message.getSerializedSize());\n\n    TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);\n    TestUtil.assertAllFieldsSet(message2);\n\n    // Try different block sizes.\n    for (int blockSize = 1; blockSize < 256; blockSize *= 2) {\n      message2 = TestAllTypes.parseFrom(\n        new SmallBlockInputStream(rawBytes, blockSize));\n      TestUtil.assertAllFieldsSet(message2);\n    }\n  }\n\n  /** Tests skipField(). */\n  public void testSkipWholeMessage() throws Exception {\n    TestAllTypes message = TestUtil.getAllSet();\n    byte[] rawBytes = message.toByteArray();\n\n    // Create two parallel inputs.  Parse one as unknown fields while using\n    // skipField() to skip each field on the other.  Expect the same tags.\n    CodedInputStream input1 = CodedInputStream.newInstance(rawBytes);\n    CodedInputStream input2 = CodedInputStream.newInstance(rawBytes);\n    UnknownFieldSet.Builder unknownFields = UnknownFieldSet.newBuilder();\n\n    while (true) {\n      int tag = input1.readTag();\n      assertEquals(tag, input2.readTag());\n      if (tag == 0) {\n        break;\n      }\n      unknownFields.mergeFieldFrom(tag, input1);\n      input2.skipField(tag);\n    }\n  }\n\n  /**\n   * Test that a bug in skipRawBytes() has been fixed:  if the skip skips\n   * exactly up to a limit, this should not break things.\n   */\n  public void testSkipRawBytesBug() throws Exception {\n    byte[] rawBytes = new byte[] { 1, 2 };\n    CodedInputStream input = CodedInputStream.newInstance(rawBytes);\n\n    int limit = input.pushLimit(1);\n    input.skipRawBytes(1);\n    input.popLimit(limit);\n    assertEquals(2, input.readRawByte());\n  }\n\n  /**\n   * Test that a bug in skipRawBytes() has been fixed:  if the skip skips\n   * past the end of a buffer with a limit that has been set past the end of\n   * that buffer, this should not break things.\n   */\n  public void testSkipRawBytesPastEndOfBufferWithLimit() throws Exception {\n    byte[] rawBytes = new byte[] { 1, 2, 3, 4, 5 };\n    CodedInputStream input = CodedInputStream.newInstance(\n        new SmallBlockInputStream(rawBytes, 3));\n\n    int limit = input.pushLimit(4);\n    // In order to expose the bug we need to read at least one byte to prime the\n    // buffer inside the CodedInputStream.\n    assertEquals(1, input.readRawByte());\n    // Skip to the end of the limit.\n    input.skipRawBytes(3);\n    assertTrue(input.isAtEnd());\n    input.popLimit(limit);\n    assertEquals(5, input.readRawByte());\n  }\n\n  public void testReadHugeBlob() throws Exception {\n    // Allocate and initialize a 1MB blob.\n    byte[] blob = new byte[1 << 20];\n    for (int i = 0; i < blob.length; i++) {\n      blob[i] = (byte)i;\n    }\n\n    // Make a message containing it.\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TestUtil.setAllFields(builder);\n    builder.setOptionalBytes(ByteString.copyFrom(blob));\n    TestAllTypes message = builder.build();\n\n    // Serialize and parse it.  Make sure to parse from an InputStream, not\n    // directly from a ByteString, so that CodedInputStream uses buffered\n    // reading.\n    TestAllTypes message2 =\n      TestAllTypes.parseFrom(message.toByteString().newInput());\n\n    assertEquals(message.getOptionalBytes(), message2.getOptionalBytes());\n\n    // Make sure all the other fields were parsed correctly.\n    TestAllTypes message3 = TestAllTypes.newBuilder(message2)\n      .setOptionalBytes(TestUtil.getAllSet().getOptionalBytes())\n      .build();\n    TestUtil.assertAllFieldsSet(message3);\n  }\n\n  public void testReadMaliciouslyLargeBlob() throws Exception {\n    ByteString.Output rawOutput = ByteString.newOutput();\n    CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);\n\n    int tag = WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED);\n    output.writeRawVarint32(tag);\n    output.writeRawVarint32(0x7FFFFFFF);\n    output.writeRawBytes(new byte[32]);  // Pad with a few random bytes.\n    output.flush();\n\n    CodedInputStream input = rawOutput.toByteString().newCodedInput();\n    assertEquals(tag, input.readTag());\n\n    try {\n      input.readBytes();\n      fail(\"Should have thrown an exception!\");\n    } catch (InvalidProtocolBufferException e) {\n      // success.\n    }\n  }\n\n  private TestRecursiveMessage makeRecursiveMessage(int depth) {\n    if (depth == 0) {\n      return TestRecursiveMessage.newBuilder().setI(5).build();\n    } else {\n      return TestRecursiveMessage.newBuilder()\n        .setA(makeRecursiveMessage(depth - 1)).build();\n    }\n  }\n\n  private void assertMessageDepth(TestRecursiveMessage message, int depth) {\n    if (depth == 0) {\n      assertFalse(message.hasA());\n      assertEquals(5, message.getI());\n    } else {\n      assertTrue(message.hasA());\n      assertMessageDepth(message.getA(), depth - 1);\n    }\n  }\n\n  public void testMaliciousRecursion() throws Exception {\n    ByteString data64 = makeRecursiveMessage(64).toByteString();\n    ByteString data65 = makeRecursiveMessage(65).toByteString();\n\n    assertMessageDepth(TestRecursiveMessage.parseFrom(data64), 64);\n\n    try {\n      TestRecursiveMessage.parseFrom(data65);\n      fail(\"Should have thrown an exception!\");\n    } catch (InvalidProtocolBufferException e) {\n      // success.\n    }\n\n    CodedInputStream input = data64.newCodedInput();\n    input.setRecursionLimit(8);\n    try {\n      TestRecursiveMessage.parseFrom(input);\n      fail(\"Should have thrown an exception!\");\n    } catch (InvalidProtocolBufferException e) {\n      // success.\n    }\n  }\n\n  public void testSizeLimit() throws Exception {\n    CodedInputStream input = CodedInputStream.newInstance(\n      TestUtil.getAllSet().toByteString().newInput());\n    input.setSizeLimit(16);\n\n    try {\n      TestAllTypes.parseFrom(input);\n      fail(\"Should have thrown an exception!\");\n    } catch (InvalidProtocolBufferException e) {\n      // success.\n    }\n  }\n\n  public void testResetSizeCounter() throws Exception {\n    CodedInputStream input = CodedInputStream.newInstance(\n        new SmallBlockInputStream(new byte[256], 8));\n    input.setSizeLimit(16);\n    input.readRawBytes(16);\n    assertEquals(16, input.getTotalBytesRead());\n\n    try {\n      input.readRawByte();\n      fail(\"Should have thrown an exception!\");\n    } catch (InvalidProtocolBufferException e) {\n      // success.\n    }\n\n    input.resetSizeCounter();\n    assertEquals(0, input.getTotalBytesRead());\n    input.readRawByte();  // No exception thrown.\n    input.resetSizeCounter();\n    assertEquals(0, input.getTotalBytesRead());\n\n    try {\n      input.readRawBytes(16);  // Hits limit again.\n      fail(\"Should have thrown an exception!\");\n    } catch (InvalidProtocolBufferException e) {\n      // success.\n    }\n  }\n\n  /**\n   * Tests that if we read an string that contains invalid UTF-8, no exception\n   * is thrown.  Instead, the invalid bytes are replaced with the Unicode\n   * \"replacement character\" U+FFFD.\n   */\n  public void testReadInvalidUtf8() throws Exception {\n    ByteString.Output rawOutput = ByteString.newOutput();\n    CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);\n\n    int tag = WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED);\n    output.writeRawVarint32(tag);\n    output.writeRawVarint32(1);\n    output.writeRawBytes(new byte[] { (byte)0x80 });\n    output.flush();\n\n    CodedInputStream input = rawOutput.toByteString().newCodedInput();\n    assertEquals(tag, input.readTag());\n    String text = input.readString();\n    assertEquals(0xfffd, text.charAt(0));\n  }\n\n  public void testReadFromSlice() throws Exception {\n    byte[] bytes = bytes(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);\n    CodedInputStream in = CodedInputStream.newInstance(bytes, 3, 5);\n    assertEquals(0, in.getTotalBytesRead());\n    for (int i = 3; i < 8; i++) {\n      assertEquals(i, in.readRawByte());\n      assertEquals(i-2, in.getTotalBytesRead());\n    }\n    // eof\n    assertEquals(0, in.readTag());\n    assertEquals(5, in.getTotalBytesRead());\n  }\n\n  public void testInvalidTag() throws Exception {\n    // Any tag number which corresponds to field number zero is invalid and\n    // should throw InvalidProtocolBufferException.\n    for (int i = 0; i < 8; i++) {\n      try {\n        CodedInputStream.newInstance(bytes(i)).readTag();\n        fail(\"Should have thrown an exception.\");\n      } catch (InvalidProtocolBufferException e) {\n        assertEquals(InvalidProtocolBufferException.invalidTag().getMessage(),\n                     e.getMessage());\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestPackedTypes;\n\nimport junit.framework.TestCase;\n\nimport java.io.ByteArrayOutputStream;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Unit test for {@link CodedOutputStream}.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic class CodedOutputStreamTest extends TestCase {\n  /**\n   * Helper to construct a byte array from a bunch of bytes.  The inputs are\n   * actually ints so that I can use hex notation and not get stupid errors\n   * about precision.\n   */\n  private byte[] bytes(int... bytesAsInts) {\n    byte[] bytes = new byte[bytesAsInts.length];\n    for (int i = 0; i < bytesAsInts.length; i++) {\n      bytes[i] = (byte) bytesAsInts[i];\n    }\n    return bytes;\n  }\n\n  /** Arrays.asList() does not work with arrays of primitives.  :( */\n  private List<Byte> toList(byte[] bytes) {\n    List<Byte> result = new ArrayList<Byte>();\n    for (byte b : bytes) {\n      result.add(b);\n    }\n    return result;\n  }\n\n  private void assertEqualBytes(byte[] a, byte[] b) {\n    assertEquals(toList(a), toList(b));\n  }\n\n  /**\n   * Writes the given value using writeRawVarint32() and writeRawVarint64() and\n   * checks that the result matches the given bytes.\n   */\n  private void assertWriteVarint(byte[] data, long value) throws Exception {\n    // Only do 32-bit write if the value fits in 32 bits.\n    if ((value >>> 32) == 0) {\n      ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();\n      CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);\n      output.writeRawVarint32((int) value);\n      output.flush();\n      assertEqualBytes(data, rawOutput.toByteArray());\n\n      // Also try computing size.\n      assertEquals(data.length,\n                   CodedOutputStream.computeRawVarint32Size((int) value));\n    }\n\n    {\n      ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();\n      CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);\n      output.writeRawVarint64(value);\n      output.flush();\n      assertEqualBytes(data, rawOutput.toByteArray());\n\n      // Also try computing size.\n      assertEquals(data.length,\n                   CodedOutputStream.computeRawVarint64Size(value));\n    }\n\n    // Try different block sizes.\n    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {\n      // Only do 32-bit write if the value fits in 32 bits.\n      if ((value >>> 32) == 0) {\n        ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();\n        CodedOutputStream output =\n          CodedOutputStream.newInstance(rawOutput, blockSize);\n        output.writeRawVarint32((int) value);\n        output.flush();\n        assertEqualBytes(data, rawOutput.toByteArray());\n      }\n\n      {\n        ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();\n        CodedOutputStream output =\n          CodedOutputStream.newInstance(rawOutput, blockSize);\n        output.writeRawVarint64(value);\n        output.flush();\n        assertEqualBytes(data, rawOutput.toByteArray());\n      }\n    }\n  }\n\n  /** Tests writeRawVarint32() and writeRawVarint64(). */\n  public void testWriteVarint() throws Exception {\n    assertWriteVarint(bytes(0x00), 0);\n    assertWriteVarint(bytes(0x01), 1);\n    assertWriteVarint(bytes(0x7f), 127);\n    // 14882\n    assertWriteVarint(bytes(0xa2, 0x74), (0x22 << 0) | (0x74 << 7));\n    // 2961488830\n    assertWriteVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b),\n      (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |\n      (0x0bL << 28));\n\n    // 64-bit\n    // 7256456126\n    assertWriteVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b),\n      (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |\n      (0x1bL << 28));\n    // 41256202580718336\n    assertWriteVarint(\n      bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49),\n      (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |\n      (0x43L << 28) | (0x49L << 35) | (0x24L << 42) | (0x49L << 49));\n    // 11964378330978735131\n    assertWriteVarint(\n      bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01),\n      (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |\n      (0x3bL << 28) | (0x56L << 35) | (0x00L << 42) |\n      (0x05L << 49) | (0x26L << 56) | (0x01L << 63));\n  }\n\n  /**\n   * Parses the given bytes using writeRawLittleEndian32() and checks\n   * that the result matches the given value.\n   */\n  private void assertWriteLittleEndian32(byte[] data, int value)\n                                         throws Exception {\n    ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();\n    CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);\n    output.writeRawLittleEndian32(value);\n    output.flush();\n    assertEqualBytes(data, rawOutput.toByteArray());\n\n    // Try different block sizes.\n    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {\n      rawOutput = new ByteArrayOutputStream();\n      output = CodedOutputStream.newInstance(rawOutput, blockSize);\n      output.writeRawLittleEndian32(value);\n      output.flush();\n      assertEqualBytes(data, rawOutput.toByteArray());\n    }\n  }\n\n  /**\n   * Parses the given bytes using writeRawLittleEndian64() and checks\n   * that the result matches the given value.\n   */\n  private void assertWriteLittleEndian64(byte[] data, long value)\n                                         throws Exception {\n    ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();\n    CodedOutputStream output = CodedOutputStream.newInstance(rawOutput);\n    output.writeRawLittleEndian64(value);\n    output.flush();\n    assertEqualBytes(data, rawOutput.toByteArray());\n\n    // Try different block sizes.\n    for (int blockSize = 1; blockSize <= 16; blockSize *= 2) {\n      rawOutput = new ByteArrayOutputStream();\n      output = CodedOutputStream.newInstance(rawOutput, blockSize);\n      output.writeRawLittleEndian64(value);\n      output.flush();\n      assertEqualBytes(data, rawOutput.toByteArray());\n    }\n  }\n\n  /** Tests writeRawLittleEndian32() and writeRawLittleEndian64(). */\n  public void testWriteLittleEndian() throws Exception {\n    assertWriteLittleEndian32(bytes(0x78, 0x56, 0x34, 0x12), 0x12345678);\n    assertWriteLittleEndian32(bytes(0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef0);\n\n    assertWriteLittleEndian64(\n      bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12),\n      0x123456789abcdef0L);\n    assertWriteLittleEndian64(\n      bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a),\n      0x9abcdef012345678L);\n  }\n\n  /** Test encodeZigZag32() and encodeZigZag64(). */\n  public void testEncodeZigZag() throws Exception {\n    assertEquals(0, CodedOutputStream.encodeZigZag32( 0));\n    assertEquals(1, CodedOutputStream.encodeZigZag32(-1));\n    assertEquals(2, CodedOutputStream.encodeZigZag32( 1));\n    assertEquals(3, CodedOutputStream.encodeZigZag32(-2));\n    assertEquals(0x7FFFFFFE, CodedOutputStream.encodeZigZag32(0x3FFFFFFF));\n    assertEquals(0x7FFFFFFF, CodedOutputStream.encodeZigZag32(0xC0000000));\n    assertEquals(0xFFFFFFFE, CodedOutputStream.encodeZigZag32(0x7FFFFFFF));\n    assertEquals(0xFFFFFFFF, CodedOutputStream.encodeZigZag32(0x80000000));\n\n    assertEquals(0, CodedOutputStream.encodeZigZag64( 0));\n    assertEquals(1, CodedOutputStream.encodeZigZag64(-1));\n    assertEquals(2, CodedOutputStream.encodeZigZag64( 1));\n    assertEquals(3, CodedOutputStream.encodeZigZag64(-2));\n    assertEquals(0x000000007FFFFFFEL,\n                 CodedOutputStream.encodeZigZag64(0x000000003FFFFFFFL));\n    assertEquals(0x000000007FFFFFFFL,\n                 CodedOutputStream.encodeZigZag64(0xFFFFFFFFC0000000L));\n    assertEquals(0x00000000FFFFFFFEL,\n                 CodedOutputStream.encodeZigZag64(0x000000007FFFFFFFL));\n    assertEquals(0x00000000FFFFFFFFL,\n                 CodedOutputStream.encodeZigZag64(0xFFFFFFFF80000000L));\n    assertEquals(0xFFFFFFFFFFFFFFFEL,\n                 CodedOutputStream.encodeZigZag64(0x7FFFFFFFFFFFFFFFL));\n    assertEquals(0xFFFFFFFFFFFFFFFFL,\n                 CodedOutputStream.encodeZigZag64(0x8000000000000000L));\n\n    // Some easier-to-verify round-trip tests.  The inputs (other than 0, 1, -1)\n    // were chosen semi-randomly via keyboard bashing.\n    assertEquals(0,\n      CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(0)));\n    assertEquals(1,\n      CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(1)));\n    assertEquals(-1,\n      CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(-1)));\n    assertEquals(14927,\n      CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(14927)));\n    assertEquals(-3612,\n      CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(-3612)));\n\n    assertEquals(0,\n      CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(0)));\n    assertEquals(1,\n      CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(1)));\n    assertEquals(-1,\n      CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(-1)));\n    assertEquals(14927,\n      CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(14927)));\n    assertEquals(-3612,\n      CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(-3612)));\n\n    assertEquals(856912304801416L,\n      CodedOutputStream.encodeZigZag64(\n        CodedInputStream.decodeZigZag64(\n          856912304801416L)));\n    assertEquals(-75123905439571256L,\n      CodedOutputStream.encodeZigZag64(\n        CodedInputStream.decodeZigZag64(\n          -75123905439571256L)));\n  }\n\n  /** Tests writing a whole message with every field type. */\n  public void testWriteWholeMessage() throws Exception {\n    TestAllTypes message = TestUtil.getAllSet();\n\n    byte[] rawBytes = message.toByteArray();\n    assertEqualBytes(TestUtil.getGoldenMessage().toByteArray(), rawBytes);\n\n    // Try different block sizes.\n    for (int blockSize = 1; blockSize < 256; blockSize *= 2) {\n      ByteArrayOutputStream rawOutput = new ByteArrayOutputStream();\n      CodedOutputStream output =\n        CodedOutputStream.newInstance(rawOutput, blockSize);\n      message.writeTo(output);\n      output.flush();\n      assertEqualBytes(rawBytes, rawOutput.toByteArray());\n    }\n  }\n\n  /** Tests writing a whole message with every packed field type. Ensures the\n   * wire format of packed fields is compatible with C++. */\n  public void testWriteWholePackedFieldsMessage() throws Exception {\n    TestPackedTypes message = TestUtil.getPackedSet();\n\n    byte[] rawBytes = message.toByteArray();\n    assertEqualBytes(TestUtil.getGoldenPackedFieldsMessage().toByteArray(),\n                     rawBytes);\n  }\n\n  /** Test writing a message containing a negative enum value. This used to\n   * fail because the size was not properly computed as a sign-extended varint. */\n  public void testWriteMessageWithNegativeEnumValue() throws Exception {\n    protobuf_unittest.UnittestProto.SparseEnumMessage message =\n        protobuf_unittest.UnittestProto.SparseEnumMessage.newBuilder()\n        .setSparseEnum(protobuf_unittest.UnittestProto.TestSparseEnum.SPARSE_E)\n        .build();\n    assertTrue(message.getSparseEnum().getNumber() < 0);\n    byte[] rawBytes = message.toByteArray();\n    protobuf_unittest.UnittestProto.SparseEnumMessage message2 =\n        protobuf_unittest.UnittestProto.SparseEnumMessage.parseFrom(rawBytes);\n    assertEquals(protobuf_unittest.UnittestProto.TestSparseEnum.SPARSE_E,\n                 message2.getSparseEnum());\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport protobuf_unittest.UnittestProto.TestDeprecatedFields;\n\nimport junit.framework.TestCase;\n\nimport java.lang.reflect.AnnotatedElement;\nimport java.lang.reflect.Method;\n/**\n * Test field deprecation\n * \n * @author birdo@google.com (Roberto Scaramuzzi)\n */\npublic class DeprecatedFieldTest extends TestCase {\n  private String[] deprecatedGetterNames = {\n      \"hasDeprecatedInt32\",\n      \"getDeprecatedInt32\"};\n  \n  private String[] deprecatedBuilderGetterNames = {\n      \"hasDeprecatedInt32\",\n      \"getDeprecatedInt32\",\n      \"clearDeprecatedInt32\"};\n  \n  private String[] deprecatedBuilderSetterNames = {\n      \"setDeprecatedInt32\"}; \n  \n  public void testDeprecatedField() throws Exception {\n    Class<?> deprecatedFields = TestDeprecatedFields.class;\n    Class<?> deprecatedFieldsBuilder = TestDeprecatedFields.Builder.class;\n    for (String name : deprecatedGetterNames) {\n      Method method = deprecatedFields.getMethod(name);\n      assertTrue(\"Method \" + name + \" should be deprecated\",\n          isDeprecated(method));\n    }\n    for (String name : deprecatedBuilderGetterNames) {\n      Method method = deprecatedFieldsBuilder.getMethod(name);\n      assertTrue(\"Method \" + name + \" should be deprecated\",\n          isDeprecated(method));\n    }\n    for (String name : deprecatedBuilderSetterNames) {\n      Method method = deprecatedFieldsBuilder.getMethod(name, int.class);\n      assertTrue(\"Method \" + name + \" should be deprecated\",\n          isDeprecated(method));\n    }\n  }\n  \n  private boolean isDeprecated(AnnotatedElement annotated) {\n    return annotated.isAnnotationPresent(Deprecated.class);\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport com.google.protobuf.DescriptorProtos.DescriptorProto;\nimport com.google.protobuf.DescriptorProtos.FieldDescriptorProto;\nimport com.google.protobuf.DescriptorProtos.FileDescriptorProto;\nimport com.google.protobuf.Descriptors.DescriptorValidationException;\nimport com.google.protobuf.Descriptors.FileDescriptor;\nimport com.google.protobuf.Descriptors.Descriptor;\nimport com.google.protobuf.Descriptors.FieldDescriptor;\nimport com.google.protobuf.Descriptors.EnumDescriptor;\nimport com.google.protobuf.Descriptors.EnumValueDescriptor;\nimport com.google.protobuf.Descriptors.ServiceDescriptor;\nimport com.google.protobuf.Descriptors.MethodDescriptor;\n\nimport com.google.protobuf.test.UnittestImport;\nimport com.google.protobuf.test.UnittestImport.ImportEnum;\nimport com.google.protobuf.test.UnittestImport.ImportMessage;\nimport protobuf_unittest.UnittestProto;\nimport protobuf_unittest.UnittestProto.ForeignEnum;\nimport protobuf_unittest.UnittestProto.ForeignMessage;\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestAllExtensions;\nimport protobuf_unittest.UnittestProto.TestExtremeDefaultValues;\nimport protobuf_unittest.UnittestProto.TestRequired;\nimport protobuf_unittest.UnittestProto.TestService;\nimport protobuf_unittest.UnittestCustomOptions;\n\n\nimport junit.framework.TestCase;\n\nimport java.util.Arrays;\nimport java.util.Collections;\n\n/**\n * Unit test for {@link Descriptors}.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic class DescriptorsTest extends TestCase {\n\n  // Regression test for bug where referencing a FieldDescriptor.Type value\n  // before a FieldDescriptorProto.Type value would yield a\n  // ExceptionInInitializerError.\n  @SuppressWarnings(\"unused\")\n  private static final Object STATIC_INIT_TEST = FieldDescriptor.Type.BOOL;\n\n  public void testFieldTypeEnumMapping() throws Exception {\n    assertEquals(FieldDescriptor.Type.values().length,\n        FieldDescriptorProto.Type.values().length);\n    for (FieldDescriptor.Type type : FieldDescriptor.Type.values()) {\n      FieldDescriptorProto.Type protoType = type.toProto();\n      assertEquals(\"TYPE_\" + type.name(), protoType.name());\n      assertEquals(type, FieldDescriptor.Type.valueOf(protoType));\n    }\n  }\n\n  public void testFileDescriptor() throws Exception {\n    FileDescriptor file = UnittestProto.getDescriptor();\n\n    assertEquals(\"google/protobuf/unittest.proto\", file.getName());\n    assertEquals(\"protobuf_unittest\", file.getPackage());\n\n    assertEquals(\"UnittestProto\", file.getOptions().getJavaOuterClassname());\n    assertEquals(\"google/protobuf/unittest.proto\",\n                 file.toProto().getName());\n\n    assertEquals(Arrays.asList(UnittestImport.getDescriptor()),\n                 file.getDependencies());\n\n    Descriptor messageType = TestAllTypes.getDescriptor();\n    assertEquals(messageType, file.getMessageTypes().get(0));\n    assertEquals(messageType, file.findMessageTypeByName(\"TestAllTypes\"));\n    assertNull(file.findMessageTypeByName(\"NoSuchType\"));\n    assertNull(file.findMessageTypeByName(\"protobuf_unittest.TestAllTypes\"));\n    for (int i = 0; i < file.getMessageTypes().size(); i++) {\n      assertEquals(i, file.getMessageTypes().get(i).getIndex());\n    }\n\n    EnumDescriptor enumType = ForeignEnum.getDescriptor();\n    assertEquals(enumType, file.getEnumTypes().get(0));\n    assertEquals(enumType, file.findEnumTypeByName(\"ForeignEnum\"));\n    assertNull(file.findEnumTypeByName(\"NoSuchType\"));\n    assertNull(file.findEnumTypeByName(\"protobuf_unittest.ForeignEnum\"));\n    assertEquals(Arrays.asList(ImportEnum.getDescriptor()),\n                 UnittestImport.getDescriptor().getEnumTypes());\n    for (int i = 0; i < file.getEnumTypes().size(); i++) {\n      assertEquals(i, file.getEnumTypes().get(i).getIndex());\n    }\n\n    ServiceDescriptor service = TestService.getDescriptor();\n    assertEquals(service, file.getServices().get(0));\n    assertEquals(service, file.findServiceByName(\"TestService\"));\n    assertNull(file.findServiceByName(\"NoSuchType\"));\n    assertNull(file.findServiceByName(\"protobuf_unittest.TestService\"));\n    assertEquals(Collections.emptyList(),\n                 UnittestImport.getDescriptor().getServices());\n    for (int i = 0; i < file.getServices().size(); i++) {\n      assertEquals(i, file.getServices().get(i).getIndex());\n    }\n\n    FieldDescriptor extension =\n      UnittestProto.optionalInt32Extension.getDescriptor();\n    assertEquals(extension, file.getExtensions().get(0));\n    assertEquals(extension,\n                 file.findExtensionByName(\"optional_int32_extension\"));\n    assertNull(file.findExtensionByName(\"no_such_ext\"));\n    assertNull(file.findExtensionByName(\n      \"protobuf_unittest.optional_int32_extension\"));\n    assertEquals(Collections.emptyList(),\n                 UnittestImport.getDescriptor().getExtensions());\n    for (int i = 0; i < file.getExtensions().size(); i++) {\n      assertEquals(i, file.getExtensions().get(i).getIndex());\n    }\n  }\n\n  public void testDescriptor() throws Exception {\n    Descriptor messageType = TestAllTypes.getDescriptor();\n    Descriptor nestedType = TestAllTypes.NestedMessage.getDescriptor();\n\n    assertEquals(\"TestAllTypes\", messageType.getName());\n    assertEquals(\"protobuf_unittest.TestAllTypes\", messageType.getFullName());\n    assertEquals(UnittestProto.getDescriptor(), messageType.getFile());\n    assertNull(messageType.getContainingType());\n    assertEquals(DescriptorProtos.MessageOptions.getDefaultInstance(),\n                 messageType.getOptions());\n    assertEquals(\"TestAllTypes\", messageType.toProto().getName());\n\n    assertEquals(\"NestedMessage\", nestedType.getName());\n    assertEquals(\"protobuf_unittest.TestAllTypes.NestedMessage\",\n                 nestedType.getFullName());\n    assertEquals(UnittestProto.getDescriptor(), nestedType.getFile());\n    assertEquals(messageType, nestedType.getContainingType());\n\n    FieldDescriptor field = messageType.getFields().get(0);\n    assertEquals(\"optional_int32\", field.getName());\n    assertEquals(field, messageType.findFieldByName(\"optional_int32\"));\n    assertNull(messageType.findFieldByName(\"no_such_field\"));\n    assertEquals(field, messageType.findFieldByNumber(1));\n    assertNull(messageType.findFieldByNumber(571283));\n    for (int i = 0; i < messageType.getFields().size(); i++) {\n      assertEquals(i, messageType.getFields().get(i).getIndex());\n    }\n\n    assertEquals(nestedType, messageType.getNestedTypes().get(0));\n    assertEquals(nestedType, messageType.findNestedTypeByName(\"NestedMessage\"));\n    assertNull(messageType.findNestedTypeByName(\"NoSuchType\"));\n    for (int i = 0; i < messageType.getNestedTypes().size(); i++) {\n      assertEquals(i, messageType.getNestedTypes().get(i).getIndex());\n    }\n\n    EnumDescriptor enumType = TestAllTypes.NestedEnum.getDescriptor();\n    assertEquals(enumType, messageType.getEnumTypes().get(0));\n    assertEquals(enumType, messageType.findEnumTypeByName(\"NestedEnum\"));\n    assertNull(messageType.findEnumTypeByName(\"NoSuchType\"));\n    for (int i = 0; i < messageType.getEnumTypes().size(); i++) {\n      assertEquals(i, messageType.getEnumTypes().get(i).getIndex());\n    }\n  }\n\n  public void testFieldDescriptor() throws Exception {\n    Descriptor messageType = TestAllTypes.getDescriptor();\n    FieldDescriptor primitiveField =\n      messageType.findFieldByName(\"optional_int32\");\n    FieldDescriptor enumField =\n      messageType.findFieldByName(\"optional_nested_enum\");\n    FieldDescriptor messageField =\n      messageType.findFieldByName(\"optional_foreign_message\");\n    FieldDescriptor cordField =\n      messageType.findFieldByName(\"optional_cord\");\n    FieldDescriptor extension =\n      UnittestProto.optionalInt32Extension.getDescriptor();\n    FieldDescriptor nestedExtension = TestRequired.single.getDescriptor();\n\n    assertEquals(\"optional_int32\", primitiveField.getName());\n    assertEquals(\"protobuf_unittest.TestAllTypes.optional_int32\",\n                 primitiveField.getFullName());\n    assertEquals(1, primitiveField.getNumber());\n    assertEquals(messageType, primitiveField.getContainingType());\n    assertEquals(UnittestProto.getDescriptor(), primitiveField.getFile());\n    assertEquals(FieldDescriptor.Type.INT32, primitiveField.getType());\n    assertEquals(FieldDescriptor.JavaType.INT, primitiveField.getJavaType());\n    assertEquals(DescriptorProtos.FieldOptions.getDefaultInstance(),\n                 primitiveField.getOptions());\n    assertFalse(primitiveField.isExtension());\n    assertEquals(\"optional_int32\", primitiveField.toProto().getName());\n\n    assertEquals(\"optional_nested_enum\", enumField.getName());\n    assertEquals(FieldDescriptor.Type.ENUM, enumField.getType());\n    assertEquals(FieldDescriptor.JavaType.ENUM, enumField.getJavaType());\n    assertEquals(TestAllTypes.NestedEnum.getDescriptor(),\n                 enumField.getEnumType());\n\n    assertEquals(\"optional_foreign_message\", messageField.getName());\n    assertEquals(FieldDescriptor.Type.MESSAGE, messageField.getType());\n    assertEquals(FieldDescriptor.JavaType.MESSAGE, messageField.getJavaType());\n    assertEquals(ForeignMessage.getDescriptor(), messageField.getMessageType());\n\n    assertEquals(\"optional_cord\", cordField.getName());\n    assertEquals(FieldDescriptor.Type.STRING, cordField.getType());\n    assertEquals(FieldDescriptor.JavaType.STRING, cordField.getJavaType());\n    assertEquals(DescriptorProtos.FieldOptions.CType.CORD,\n                 cordField.getOptions().getCtype());\n\n    assertEquals(\"optional_int32_extension\", extension.getName());\n    assertEquals(\"protobuf_unittest.optional_int32_extension\",\n                 extension.getFullName());\n    assertEquals(1, extension.getNumber());\n    assertEquals(TestAllExtensions.getDescriptor(),\n                 extension.getContainingType());\n    assertEquals(UnittestProto.getDescriptor(), extension.getFile());\n    assertEquals(FieldDescriptor.Type.INT32, extension.getType());\n    assertEquals(FieldDescriptor.JavaType.INT, extension.getJavaType());\n    assertEquals(DescriptorProtos.FieldOptions.getDefaultInstance(),\n                 extension.getOptions());\n    assertTrue(extension.isExtension());\n    assertEquals(null, extension.getExtensionScope());\n    assertEquals(\"optional_int32_extension\", extension.toProto().getName());\n\n    assertEquals(\"single\", nestedExtension.getName());\n    assertEquals(\"protobuf_unittest.TestRequired.single\",\n                 nestedExtension.getFullName());\n    assertEquals(TestRequired.getDescriptor(),\n                 nestedExtension.getExtensionScope());\n  }\n\n  public void testFieldDescriptorLabel() throws Exception {\n    FieldDescriptor requiredField =\n      TestRequired.getDescriptor().findFieldByName(\"a\");\n    FieldDescriptor optionalField =\n      TestAllTypes.getDescriptor().findFieldByName(\"optional_int32\");\n    FieldDescriptor repeatedField =\n      TestAllTypes.getDescriptor().findFieldByName(\"repeated_int32\");\n\n    assertTrue(requiredField.isRequired());\n    assertFalse(requiredField.isRepeated());\n    assertFalse(optionalField.isRequired());\n    assertFalse(optionalField.isRepeated());\n    assertFalse(repeatedField.isRequired());\n    assertTrue(repeatedField.isRepeated());\n  }\n\n  public void testFieldDescriptorDefault() throws Exception {\n    Descriptor d = TestAllTypes.getDescriptor();\n    assertFalse(d.findFieldByName(\"optional_int32\").hasDefaultValue());\n    assertEquals(0, d.findFieldByName(\"optional_int32\").getDefaultValue());\n    assertTrue(d.findFieldByName(\"default_int32\").hasDefaultValue());\n    assertEquals(41, d.findFieldByName(\"default_int32\").getDefaultValue());\n\n    d = TestExtremeDefaultValues.getDescriptor();\n    assertEquals(\n      ByteString.copyFrom(\n        \"\\0\\001\\007\\b\\f\\n\\r\\t\\013\\\\\\'\\\"\\u00fe\".getBytes(\"ISO-8859-1\")),\n      d.findFieldByName(\"escaped_bytes\").getDefaultValue());\n    assertEquals(-1, d.findFieldByName(\"large_uint32\").getDefaultValue());\n    assertEquals(-1L, d.findFieldByName(\"large_uint64\").getDefaultValue());\n  }\n\n  public void testEnumDescriptor() throws Exception {\n    EnumDescriptor enumType = ForeignEnum.getDescriptor();\n    EnumDescriptor nestedType = TestAllTypes.NestedEnum.getDescriptor();\n\n    assertEquals(\"ForeignEnum\", enumType.getName());\n    assertEquals(\"protobuf_unittest.ForeignEnum\", enumType.getFullName());\n    assertEquals(UnittestProto.getDescriptor(), enumType.getFile());\n    assertNull(enumType.getContainingType());\n    assertEquals(DescriptorProtos.EnumOptions.getDefaultInstance(),\n                 enumType.getOptions());\n\n    assertEquals(\"NestedEnum\", nestedType.getName());\n    assertEquals(\"protobuf_unittest.TestAllTypes.NestedEnum\",\n                 nestedType.getFullName());\n    assertEquals(UnittestProto.getDescriptor(), nestedType.getFile());\n    assertEquals(TestAllTypes.getDescriptor(), nestedType.getContainingType());\n\n    EnumValueDescriptor value = ForeignEnum.FOREIGN_FOO.getValueDescriptor();\n    assertEquals(value, enumType.getValues().get(0));\n    assertEquals(\"FOREIGN_FOO\", value.getName());\n    assertEquals(4, value.getNumber());\n    assertEquals(value, enumType.findValueByName(\"FOREIGN_FOO\"));\n    assertEquals(value, enumType.findValueByNumber(4));\n    assertNull(enumType.findValueByName(\"NO_SUCH_VALUE\"));\n    for (int i = 0; i < enumType.getValues().size(); i++) {\n      assertEquals(i, enumType.getValues().get(i).getIndex());\n    }\n  }\n\n  public void testServiceDescriptor() throws Exception {\n    ServiceDescriptor service = TestService.getDescriptor();\n\n    assertEquals(\"TestService\", service.getName());\n    assertEquals(\"protobuf_unittest.TestService\", service.getFullName());\n    assertEquals(UnittestProto.getDescriptor(), service.getFile());\n\n    assertEquals(2, service.getMethods().size());\n\n    MethodDescriptor fooMethod = service.getMethods().get(0);\n    assertEquals(\"Foo\", fooMethod.getName());\n    assertEquals(UnittestProto.FooRequest.getDescriptor(),\n                 fooMethod.getInputType());\n    assertEquals(UnittestProto.FooResponse.getDescriptor(),\n                 fooMethod.getOutputType());\n    assertEquals(fooMethod, service.findMethodByName(\"Foo\"));\n\n    MethodDescriptor barMethod = service.getMethods().get(1);\n    assertEquals(\"Bar\", barMethod.getName());\n    assertEquals(UnittestProto.BarRequest.getDescriptor(),\n                 barMethod.getInputType());\n    assertEquals(UnittestProto.BarResponse.getDescriptor(),\n                 barMethod.getOutputType());\n    assertEquals(barMethod, service.findMethodByName(\"Bar\"));\n\n    assertNull(service.findMethodByName(\"NoSuchMethod\"));\n\n    for (int i = 0; i < service.getMethods().size(); i++) {\n      assertEquals(i, service.getMethods().get(i).getIndex());\n    }\n  }\n\n\n  public void testCustomOptions() throws Exception {\n    Descriptor descriptor =\n      UnittestCustomOptions.TestMessageWithCustomOptions.getDescriptor();\n\n    assertTrue(\n      descriptor.getOptions().hasExtension(UnittestCustomOptions.messageOpt1));\n    assertEquals(Integer.valueOf(-56),\n      descriptor.getOptions().getExtension(UnittestCustomOptions.messageOpt1));\n\n    FieldDescriptor field = descriptor.findFieldByName(\"field1\");\n    assertNotNull(field);\n\n    assertTrue(\n      field.getOptions().hasExtension(UnittestCustomOptions.fieldOpt1));\n    assertEquals(Long.valueOf(8765432109L),\n      field.getOptions().getExtension(UnittestCustomOptions.fieldOpt1));\n\n    EnumDescriptor enumType =\n      UnittestCustomOptions.TestMessageWithCustomOptions.AnEnum.getDescriptor();\n\n    assertTrue(\n      enumType.getOptions().hasExtension(UnittestCustomOptions.enumOpt1));\n    assertEquals(Integer.valueOf(-789),\n      enumType.getOptions().getExtension(UnittestCustomOptions.enumOpt1));\n\n    ServiceDescriptor service =\n      UnittestCustomOptions.TestServiceWithCustomOptions.getDescriptor();\n\n    assertTrue(\n      service.getOptions().hasExtension(UnittestCustomOptions.serviceOpt1));\n    assertEquals(Long.valueOf(-9876543210L),\n      service.getOptions().getExtension(UnittestCustomOptions.serviceOpt1));\n\n    MethodDescriptor method = service.findMethodByName(\"Foo\");\n    assertNotNull(method);\n\n    assertTrue(\n      method.getOptions().hasExtension(UnittestCustomOptions.methodOpt1));\n    assertEquals(UnittestCustomOptions.MethodOpt1.METHODOPT1_VAL2,\n      method.getOptions().getExtension(UnittestCustomOptions.methodOpt1));\n  }\n\n  /**\n   * Test that the FieldDescriptor.Type enum is the same as the\n   * WireFormat.FieldType enum.\n   */\n  public void testFieldTypeTablesMatch() throws Exception {\n    FieldDescriptor.Type[] values1 = FieldDescriptor.Type.values();\n    WireFormat.FieldType[] values2 = WireFormat.FieldType.values();\n\n    assertEquals(values1.length, values2.length);\n\n    for (int i = 0; i < values1.length; i++) {\n      assertEquals(values1[i].toString(), values2[i].toString());\n    }\n  }\n\n  /**\n   * Test that the FieldDescriptor.JavaType enum is the same as the\n   * WireFormat.JavaType enum.\n   */\n  public void testJavaTypeTablesMatch() throws Exception {\n    FieldDescriptor.JavaType[] values1 = FieldDescriptor.JavaType.values();\n    WireFormat.JavaType[] values2 = WireFormat.JavaType.values();\n\n    assertEquals(values1.length, values2.length);\n\n    for (int i = 0; i < values1.length; i++) {\n      assertEquals(values1[i].toString(), values2[i].toString());\n    }\n  }\n\n  public void testEnormousDescriptor() throws Exception {\n    // The descriptor for this file is larger than 64k, yet it did not cause\n    // a compiler error due to an over-long string literal.\n    assertTrue(\n        UnittestEnormousDescriptor.getDescriptor()\n          .toProto().getSerializedSize() > 65536);\n  }\n  \n  /**\n   * Tests that the DescriptorValidationException works as intended.\n   */\n  public void testDescriptorValidatorException() throws Exception {\n    FileDescriptorProto fileDescriptorProto = FileDescriptorProto.newBuilder()\n      .setName(\"foo.proto\")\n      .addMessageType(DescriptorProto.newBuilder()\n      .setName(\"Foo\")\n        .addField(FieldDescriptorProto.newBuilder()\n          .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL)\n          .setType(FieldDescriptorProto.Type.TYPE_INT32)\n          .setName(\"foo\")\n          .setNumber(1)\n          .setDefaultValue(\"invalid\")\n          .build())\n        .build())\n      .build();\n    try {\n      Descriptors.FileDescriptor.buildFrom(fileDescriptorProto, \n          new FileDescriptor[0]);\n      fail(\"DescriptorValidationException expected\");\n    } catch (DescriptorValidationException e) {\n      // Expected; check that the error message contains some useful hints\n      assertTrue(e.getMessage().indexOf(\"foo\") != -1);\n      assertTrue(e.getMessage().indexOf(\"Foo\") != -1);\n      assertTrue(e.getMessage().indexOf(\"invalid\") != -1);\n      assertTrue(e.getCause() instanceof NumberFormatException);\n      assertTrue(e.getCause().getMessage().indexOf(\"invalid\") != -1);\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestAllExtensions;\nimport protobuf_unittest.UnittestProto.TestPackedTypes;\n\nimport junit.framework.TestCase;\nimport java.util.Arrays;\n\n/**\n * Unit test for {@link DynamicMessage}.  See also {@link MessageTest}, which\n * tests some {@link DynamicMessage} functionality.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic class DynamicMessageTest extends TestCase {\n  TestUtil.ReflectionTester reflectionTester =\n    new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null);\n\n  TestUtil.ReflectionTester extensionsReflectionTester =\n    new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(),\n                                  TestUtil.getExtensionRegistry());\n  TestUtil.ReflectionTester packedReflectionTester =\n    new TestUtil.ReflectionTester(TestPackedTypes.getDescriptor(), null);\n\n  public void testDynamicMessageAccessors() throws Exception {\n    Message.Builder builder =\n      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());\n    reflectionTester.setAllFieldsViaReflection(builder);\n    Message message = builder.build();\n    reflectionTester.assertAllFieldsSetViaReflection(message);\n  }\n\n  public void testDoubleBuildError() throws Exception {\n    Message.Builder builder =\n      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());\n    builder.build();\n    try {\n      builder.build();\n      fail(\"Should have thrown exception.\");\n    } catch (IllegalStateException e) {\n      // Success.\n    }\n  }\n\n  public void testClearAfterBuildError() throws Exception {\n    Message.Builder builder =\n      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());\n    builder.build();\n    try {\n      builder.clear();\n      fail(\"Should have thrown exception.\");\n    } catch (IllegalStateException e) {\n      // Success.\n    }\n  }\n\n  public void testDynamicMessageSettersRejectNull() throws Exception {\n    Message.Builder builder =\n      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());\n    reflectionTester.assertReflectionSettersRejectNull(builder);\n  }\n\n  public void testDynamicMessageExtensionAccessors() throws Exception {\n    // We don't need to extensively test DynamicMessage's handling of\n    // extensions because, frankly, it doesn't do anything special with them.\n    // It treats them just like any other fields.\n    Message.Builder builder =\n      DynamicMessage.newBuilder(TestAllExtensions.getDescriptor());\n    extensionsReflectionTester.setAllFieldsViaReflection(builder);\n    Message message = builder.build();\n    extensionsReflectionTester.assertAllFieldsSetViaReflection(message);\n  }\n\n  public void testDynamicMessageExtensionSettersRejectNull() throws Exception {\n    Message.Builder builder =\n      DynamicMessage.newBuilder(TestAllExtensions.getDescriptor());\n    extensionsReflectionTester.assertReflectionSettersRejectNull(builder);\n  }\n\n  public void testDynamicMessageRepeatedSetters() throws Exception {\n    Message.Builder builder =\n      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());\n    reflectionTester.setAllFieldsViaReflection(builder);\n    reflectionTester.modifyRepeatedFieldsViaReflection(builder);\n    Message message = builder.build();\n    reflectionTester.assertRepeatedFieldsModifiedViaReflection(message);\n  }\n\n  public void testDynamicMessageRepeatedSettersRejectNull() throws Exception {\n    Message.Builder builder =\n      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());\n    reflectionTester.assertReflectionRepeatedSettersRejectNull(builder);\n  }\n\n  public void testDynamicMessageDefaults() throws Exception {\n    reflectionTester.assertClearViaReflection(\n      DynamicMessage.getDefaultInstance(TestAllTypes.getDescriptor()));\n    reflectionTester.assertClearViaReflection(\n      DynamicMessage.newBuilder(TestAllTypes.getDescriptor()).build());\n  }\n\n  public void testDynamicMessageSerializedSize() throws Exception {\n    TestAllTypes message = TestUtil.getAllSet();\n\n    Message.Builder dynamicBuilder =\n      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());\n    reflectionTester.setAllFieldsViaReflection(dynamicBuilder);\n    Message dynamicMessage = dynamicBuilder.build();\n\n    assertEquals(message.getSerializedSize(),\n                 dynamicMessage.getSerializedSize());\n  }\n\n  public void testDynamicMessageSerialization() throws Exception {\n    Message.Builder builder =\n      DynamicMessage.newBuilder(TestAllTypes.getDescriptor());\n    reflectionTester.setAllFieldsViaReflection(builder);\n    Message message = builder.build();\n\n    ByteString rawBytes = message.toByteString();\n    TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);\n\n    TestUtil.assertAllFieldsSet(message2);\n\n    // In fact, the serialized forms should be exactly the same, byte-for-byte.\n    assertEquals(TestUtil.getAllSet().toByteString(), rawBytes);\n  }\n\n  public void testDynamicMessageParsing() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TestUtil.setAllFields(builder);\n    TestAllTypes message = builder.build();\n\n    ByteString rawBytes = message.toByteString();\n\n    Message message2 =\n      DynamicMessage.parseFrom(TestAllTypes.getDescriptor(), rawBytes);\n    reflectionTester.assertAllFieldsSetViaReflection(message2);\n  }\n\n  public void testDynamicMessagePackedSerialization() throws Exception {\n    Message.Builder builder =\n        DynamicMessage.newBuilder(TestPackedTypes.getDescriptor());\n    packedReflectionTester.setPackedFieldsViaReflection(builder);\n    Message message = builder.build();\n\n    ByteString rawBytes = message.toByteString();\n    TestPackedTypes message2 = TestPackedTypes.parseFrom(rawBytes);\n\n    TestUtil.assertPackedFieldsSet(message2);\n\n    // In fact, the serialized forms should be exactly the same, byte-for-byte.\n    assertEquals(TestUtil.getPackedSet().toByteString(), rawBytes);\n  }\n\n  public void testDynamicMessagePackedParsing() throws Exception {\n    TestPackedTypes.Builder builder = TestPackedTypes.newBuilder();\n    TestUtil.setPackedFields(builder);\n    TestPackedTypes message = builder.build();\n\n    ByteString rawBytes = message.toByteString();\n\n    Message message2 =\n      DynamicMessage.parseFrom(TestPackedTypes.getDescriptor(), rawBytes);\n    packedReflectionTester.assertPackedFieldsSetViaReflection(message2);\n  }\n\n  public void testDynamicMessageCopy() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TestUtil.setAllFields(builder);\n    TestAllTypes message = builder.build();\n\n    DynamicMessage copy = DynamicMessage.newBuilder(message).build();\n    reflectionTester.assertAllFieldsSetViaReflection(copy);\n  }\n\n  public void testToBuilder() throws Exception {\n    DynamicMessage.Builder builder =\n        DynamicMessage.newBuilder(TestAllTypes.getDescriptor());\n    reflectionTester.setAllFieldsViaReflection(builder);\n    int unknownFieldNum = 9;\n    long unknownFieldVal = 90;\n    builder.setUnknownFields(UnknownFieldSet.newBuilder()\n        .addField(unknownFieldNum,\n            UnknownFieldSet.Field.newBuilder()\n                .addVarint(unknownFieldVal).build())\n        .build());\n    DynamicMessage message = builder.build();\n\n    DynamicMessage derived = message.toBuilder().build();\n    reflectionTester.assertAllFieldsSetViaReflection(derived);\n    assertEquals(Arrays.asList(unknownFieldVal),\n        derived.getUnknownFields().getField(unknownFieldNum).getVarintList());\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\n/**\n * A prerun for a test suite that allows running the full protocol buffer\n * tests in a mode that disables the optimization for not using\n * {@link RepeatedFieldBuilder} and {@link SingleFieldBuilder} until they are\n * requested. This allows us to run all the tests through both code paths\n * and ensures that both code paths produce identical results.\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic class ForceFieldBuildersPreRun implements Runnable {\n\n  //@Override (Java 1.6 override semantics, but we must support 1.5)\n  public void run() {\n    GeneratedMessage.enableAlwaysUseFieldBuildersForTesting();\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport com.google.protobuf.UnittestLite.TestAllExtensionsLite;\nimport com.google.protobuf.test.UnittestImport;\nimport protobuf_unittest.EnumWithNoOuter;\nimport protobuf_unittest.MessageWithNoOuter;\nimport protobuf_unittest.MultipleFilesTestProto;\nimport protobuf_unittest.NestedExtension.MyNestedExtension;\nimport protobuf_unittest.NestedExtensionLite.MyNestedExtensionLite;\nimport protobuf_unittest.NonNestedExtension;\nimport protobuf_unittest.NonNestedExtension.MessageToBeExtended;\nimport protobuf_unittest.NonNestedExtension.MyNonNestedExtension;\nimport protobuf_unittest.NonNestedExtensionLite;\nimport protobuf_unittest.NonNestedExtensionLite.MessageLiteToBeExtended;\nimport protobuf_unittest.NonNestedExtensionLite.MyNonNestedExtensionLite;\nimport protobuf_unittest.ServiceWithNoOuter;\nimport protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize;\nimport protobuf_unittest.UnittestOptimizeFor.TestOptionalOptimizedForSize;\nimport protobuf_unittest.UnittestOptimizeFor.TestRequiredOptimizedForSize;\nimport protobuf_unittest.UnittestProto;\nimport protobuf_unittest.UnittestProto.ForeignEnum;\nimport protobuf_unittest.UnittestProto.ForeignMessage;\nimport protobuf_unittest.UnittestProto.ForeignMessageOrBuilder;\nimport protobuf_unittest.UnittestProto.TestAllExtensions;\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestAllTypesOrBuilder;\nimport protobuf_unittest.UnittestProto.TestExtremeDefaultValues;\nimport protobuf_unittest.UnittestProto.TestPackedTypes;\nimport protobuf_unittest.UnittestProto.TestUnpackedTypes;\n\nimport junit.framework.TestCase;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * Unit test for generated messages and generated code.  See also\n * {@link MessageTest}, which tests some generated message functionality.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic class GeneratedMessageTest extends TestCase {\n  TestUtil.ReflectionTester reflectionTester =\n    new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null);\n\n  public void testDefaultInstance() throws Exception {\n    assertSame(TestAllTypes.getDefaultInstance(),\n               TestAllTypes.getDefaultInstance().getDefaultInstanceForType());\n    assertSame(TestAllTypes.getDefaultInstance(),\n               TestAllTypes.newBuilder().getDefaultInstanceForType());\n  }\n\n  public void testMessageOrBuilder() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TestUtil.setAllFields(builder);\n    TestAllTypes message = builder.build();\n    TestUtil.assertAllFieldsSet(message);\n  }\n\n  public void testUsingBuilderMultipleTimes() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    // primitive field scalar and repeated\n    builder.setOptionalSfixed64(100);\n    builder.addRepeatedInt32(100);\n    // enum field scalar and repeated\n    builder.setOptionalImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);\n    builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);\n    // proto field scalar and repeated\n    builder.setOptionalForeignMessage(ForeignMessage.newBuilder().setC(1));\n    builder.addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(1));\n\n    TestAllTypes value1 = builder.build();\n\n    assertEquals(100, value1.getOptionalSfixed64());\n    assertEquals(100, value1.getRepeatedInt32(0));\n    assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,\n        value1.getOptionalImportEnum());\n    assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,\n        value1.getRepeatedImportEnum(0));\n    assertEquals(1, value1.getOptionalForeignMessage().getC());\n    assertEquals(1, value1.getRepeatedForeignMessage(0).getC());\n\n    // Make sure that builder didn't update previously created values\n    builder.setOptionalSfixed64(200);\n    builder.setRepeatedInt32(0, 200);\n    builder.setOptionalImportEnum(UnittestImport.ImportEnum.IMPORT_FOO);\n    builder.setRepeatedImportEnum(0, UnittestImport.ImportEnum.IMPORT_FOO);\n    builder.setOptionalForeignMessage(ForeignMessage.newBuilder().setC(2));\n    builder.setRepeatedForeignMessage(0, ForeignMessage.newBuilder().setC(2));\n\n    TestAllTypes value2 = builder.build();\n\n    // Make sure value1 didn't change.\n    assertEquals(100, value1.getOptionalSfixed64());\n    assertEquals(100, value1.getRepeatedInt32(0));\n    assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,\n        value1.getOptionalImportEnum());\n    assertEquals(UnittestImport.ImportEnum.IMPORT_BAR,\n        value1.getRepeatedImportEnum(0));\n    assertEquals(1, value1.getOptionalForeignMessage().getC());\n    assertEquals(1, value1.getRepeatedForeignMessage(0).getC());\n\n    // Make sure value2 is correct\n    assertEquals(200, value2.getOptionalSfixed64());\n    assertEquals(200, value2.getRepeatedInt32(0));\n    assertEquals(UnittestImport.ImportEnum.IMPORT_FOO,\n        value2.getOptionalImportEnum());\n    assertEquals(UnittestImport.ImportEnum.IMPORT_FOO,\n        value2.getRepeatedImportEnum(0));\n    assertEquals(2, value2.getOptionalForeignMessage().getC());\n    assertEquals(2, value2.getRepeatedForeignMessage(0).getC());\n  }\n\n  public void testProtosShareRepeatedArraysIfDidntChange() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    builder.addRepeatedInt32(100);\n    builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);\n    builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance());\n\n    TestAllTypes value1 = builder.build();\n    TestAllTypes value2 = value1.toBuilder().build();\n\n    assertSame(value1.getRepeatedInt32List(), value2.getRepeatedInt32List());\n    assertSame(value1.getRepeatedImportEnumList(),\n        value2.getRepeatedImportEnumList());\n    assertSame(value1.getRepeatedForeignMessageList(),\n        value2.getRepeatedForeignMessageList());\n  }\n\n  public void testRepeatedArraysAreImmutable() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    builder.addRepeatedInt32(100);\n    builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR);\n    builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance());\n    assertIsUnmodifiable(builder.getRepeatedInt32List());\n    assertIsUnmodifiable(builder.getRepeatedImportEnumList());\n    assertIsUnmodifiable(builder.getRepeatedForeignMessageList());\n    assertIsUnmodifiable(builder.getRepeatedFloatList());\n\n\n    TestAllTypes value = builder.build();\n    assertIsUnmodifiable(value.getRepeatedInt32List());\n    assertIsUnmodifiable(value.getRepeatedImportEnumList());\n    assertIsUnmodifiable(value.getRepeatedForeignMessageList());\n    assertIsUnmodifiable(value.getRepeatedFloatList());\n  }\n\n  private void assertIsUnmodifiable(List<?> list) {\n    if (list == Collections.emptyList()) {\n      // OKAY -- Need to check this b/c EmptyList allows you to call clear.\n    } else {\n      try {\n        list.clear();\n        fail(\"List wasn't immutable\");\n      } catch (UnsupportedOperationException e) {\n        // good\n      }\n    }\n  }\n\n  public void testSettersRejectNull() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    try {\n      builder.setOptionalString(null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n    try {\n      builder.setOptionalBytes(null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n    try {\n      builder.setOptionalNestedMessage((TestAllTypes.NestedMessage) null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n    try {\n      builder.setOptionalNestedMessage(\n          (TestAllTypes.NestedMessage.Builder) null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n    try {\n      builder.setOptionalNestedEnum(null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n    try {\n      builder.addRepeatedString(null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n    try {\n      builder.addRepeatedBytes(null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n    try {\n      builder.addRepeatedNestedMessage((TestAllTypes.NestedMessage) null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n    try {\n      builder.addRepeatedNestedMessage(\n          (TestAllTypes.NestedMessage.Builder) null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n    try {\n      builder.addRepeatedNestedEnum(null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n  }\n\n  public void testRepeatedSetters() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TestUtil.setAllFields(builder);\n    TestUtil.modifyRepeatedFields(builder);\n    TestAllTypes message = builder.build();\n    TestUtil.assertRepeatedFieldsModified(message);\n  }\n\n  public void testRepeatedSettersRejectNull() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n\n    builder.addRepeatedString(\"one\");\n    builder.addRepeatedString(\"two\");\n    try {\n      builder.setRepeatedString(1, null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n\n    builder.addRepeatedBytes(TestUtil.toBytes(\"one\"));\n    builder.addRepeatedBytes(TestUtil.toBytes(\"two\"));\n    try {\n      builder.setRepeatedBytes(1, null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n\n    builder.addRepeatedNestedMessage(\n      TestAllTypes.NestedMessage.newBuilder().setBb(218).build());\n    builder.addRepeatedNestedMessage(\n      TestAllTypes.NestedMessage.newBuilder().setBb(456).build());\n    try {\n      builder.setRepeatedNestedMessage(1, (TestAllTypes.NestedMessage) null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n    try {\n      builder.setRepeatedNestedMessage(\n          1, (TestAllTypes.NestedMessage.Builder) null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n\n    builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.FOO);\n    builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR);\n    try {\n      builder.setRepeatedNestedEnum(1, null);\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n  }\n\n  public void testRepeatedAppend() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n\n    builder.addAllRepeatedInt32(Arrays.asList(1, 2, 3, 4));\n    builder.addAllRepeatedForeignEnum(Arrays.asList(ForeignEnum.FOREIGN_BAZ));\n\n    ForeignMessage foreignMessage =\n        ForeignMessage.newBuilder().setC(12).build();\n    builder.addAllRepeatedForeignMessage(Arrays.asList(foreignMessage));\n\n    TestAllTypes message = builder.build();\n    assertEquals(message.getRepeatedInt32List(), Arrays.asList(1, 2, 3, 4));\n    assertEquals(message.getRepeatedForeignEnumList(),\n        Arrays.asList(ForeignEnum.FOREIGN_BAZ));\n    assertEquals(1, message.getRepeatedForeignMessageCount());\n    assertEquals(12, message.getRepeatedForeignMessage(0).getC());\n  }\n\n  public void testRepeatedAppendRejectsNull() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n\n    ForeignMessage foreignMessage =\n        ForeignMessage.newBuilder().setC(12).build();\n    try {\n      builder.addAllRepeatedForeignMessage(\n          Arrays.asList(foreignMessage, (ForeignMessage) null));\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n\n    try {\n      builder.addAllRepeatedForeignEnum(\n          Arrays.asList(ForeignEnum.FOREIGN_BAZ, null));\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n\n    try {\n      builder.addAllRepeatedString(Arrays.asList(\"one\", null));\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n\n    try {\n      builder.addAllRepeatedBytes(Arrays.asList(TestUtil.toBytes(\"one\"), null));\n      fail(\"Exception was not thrown\");\n    } catch (NullPointerException e) {\n      // We expect this exception.\n    }\n  }\n\n  public void testSettingForeignMessageUsingBuilder() throws Exception {\n    TestAllTypes message = TestAllTypes.newBuilder()\n        // Pass builder for foreign message instance.\n        .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(123))\n        .build();\n    TestAllTypes expectedMessage = TestAllTypes.newBuilder()\n        // Create expected version passing foreign message instance explicitly.\n        .setOptionalForeignMessage(\n            ForeignMessage.newBuilder().setC(123).build())\n        .build();\n    // TODO(ngd): Upgrade to using real #equals method once implemented\n    assertEquals(expectedMessage.toString(), message.toString());\n  }\n\n  public void testSettingRepeatedForeignMessageUsingBuilder() throws Exception {\n    TestAllTypes message = TestAllTypes.newBuilder()\n        // Pass builder for foreign message instance.\n        .addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(456))\n        .build();\n    TestAllTypes expectedMessage = TestAllTypes.newBuilder()\n        // Create expected version passing foreign message instance explicitly.\n        .addRepeatedForeignMessage(\n            ForeignMessage.newBuilder().setC(456).build())\n        .build();\n    assertEquals(expectedMessage.toString(), message.toString());\n  }\n\n  public void testDefaults() throws Exception {\n    TestUtil.assertClear(TestAllTypes.getDefaultInstance());\n    TestUtil.assertClear(TestAllTypes.newBuilder().build());\n\n    TestExtremeDefaultValues message =\n        TestExtremeDefaultValues.getDefaultInstance();\n    assertEquals(\"\\u1234\", message.getUtf8String());\n    assertEquals(Double.POSITIVE_INFINITY, message.getInfDouble());\n    assertEquals(Double.NEGATIVE_INFINITY, message.getNegInfDouble());\n    assertTrue(Double.isNaN(message.getNanDouble()));\n    assertEquals(Float.POSITIVE_INFINITY, message.getInfFloat());\n    assertEquals(Float.NEGATIVE_INFINITY, message.getNegInfFloat());\n    assertTrue(Float.isNaN(message.getNanFloat()));\n    assertEquals(\"? ? ?? ?? ??? ??/ ??-\", message.getCppTrigraph());\n  }\n\n  public void testClear() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TestUtil.assertClear(builder);\n    TestUtil.setAllFields(builder);\n    builder.clear();\n    TestUtil.assertClear(builder);\n  }\n\n  public void testReflectionGetters() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TestUtil.setAllFields(builder);\n    reflectionTester.assertAllFieldsSetViaReflection(builder);\n\n    TestAllTypes message = builder.build();\n    reflectionTester.assertAllFieldsSetViaReflection(message);\n  }\n\n  public void testReflectionSetters() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    reflectionTester.setAllFieldsViaReflection(builder);\n    TestUtil.assertAllFieldsSet(builder);\n\n    TestAllTypes message = builder.build();\n    TestUtil.assertAllFieldsSet(message);\n  }\n\n  public void testReflectionSettersRejectNull() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    reflectionTester.assertReflectionSettersRejectNull(builder);\n  }\n\n  public void testReflectionRepeatedSetters() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    reflectionTester.setAllFieldsViaReflection(builder);\n    reflectionTester.modifyRepeatedFieldsViaReflection(builder);\n    TestUtil.assertRepeatedFieldsModified(builder);\n\n    TestAllTypes message = builder.build();\n    TestUtil.assertRepeatedFieldsModified(message);\n  }\n\n  public void testReflectionRepeatedSettersRejectNull() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    reflectionTester.assertReflectionRepeatedSettersRejectNull(builder);\n  }\n\n  public void testReflectionDefaults() throws Exception {\n    reflectionTester.assertClearViaReflection(\n      TestAllTypes.getDefaultInstance());\n    reflectionTester.assertClearViaReflection(\n      TestAllTypes.newBuilder().build());\n  }\n\n  public void testEnumInterface() throws Exception {\n    assertTrue(TestAllTypes.getDefaultInstance().getDefaultNestedEnum()\n        instanceof ProtocolMessageEnum);\n  }\n\n  public void testEnumMap() throws Exception {\n    Internal.EnumLiteMap<ForeignEnum> map = ForeignEnum.internalGetValueMap();\n\n    for (ForeignEnum value : ForeignEnum.values()) {\n      assertEquals(value, map.findValueByNumber(value.getNumber()));\n    }\n\n    assertTrue(map.findValueByNumber(12345) == null);\n  }\n\n  public void testParsePackedToUnpacked() throws Exception {\n    TestUnpackedTypes.Builder builder = TestUnpackedTypes.newBuilder();\n    TestUnpackedTypes message =\n      builder.mergeFrom(TestUtil.getPackedSet().toByteString()).build();\n    TestUtil.assertUnpackedFieldsSet(message);\n  }\n\n  public void testParseUnpackedToPacked() throws Exception {\n    TestPackedTypes.Builder builder = TestPackedTypes.newBuilder();\n    TestPackedTypes message =\n      builder.mergeFrom(TestUtil.getUnpackedSet().toByteString()).build();\n    TestUtil.assertPackedFieldsSet(message);\n  }\n\n  // =================================================================\n  // Extensions.\n\n  TestUtil.ReflectionTester extensionsReflectionTester =\n    new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(),\n                                  TestUtil.getExtensionRegistry());\n\n  public void testExtensionMessageOrBuilder() throws Exception {\n    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();\n    TestUtil.setAllExtensions(builder);\n    TestAllExtensions message = builder.build();\n    TestUtil.assertAllExtensionsSet(message);\n  }\n\n  public void testExtensionRepeatedSetters() throws Exception {\n    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();\n    TestUtil.setAllExtensions(builder);\n    TestUtil.modifyRepeatedExtensions(builder);\n    TestAllExtensions message = builder.build();\n    TestUtil.assertRepeatedExtensionsModified(message);\n  }\n\n  public void testExtensionDefaults() throws Exception {\n    TestUtil.assertExtensionsClear(TestAllExtensions.getDefaultInstance());\n    TestUtil.assertExtensionsClear(TestAllExtensions.newBuilder().build());\n  }\n\n  public void testExtensionReflectionGetters() throws Exception {\n    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();\n    TestUtil.setAllExtensions(builder);\n    extensionsReflectionTester.assertAllFieldsSetViaReflection(builder);\n\n    TestAllExtensions message = builder.build();\n    extensionsReflectionTester.assertAllFieldsSetViaReflection(message);\n  }\n\n  public void testExtensionReflectionSetters() throws Exception {\n    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();\n    extensionsReflectionTester.setAllFieldsViaReflection(builder);\n    TestUtil.assertAllExtensionsSet(builder);\n\n    TestAllExtensions message = builder.build();\n    TestUtil.assertAllExtensionsSet(message);\n  }\n\n  public void testExtensionReflectionSettersRejectNull() throws Exception {\n    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();\n    extensionsReflectionTester.assertReflectionSettersRejectNull(builder);\n  }\n\n  public void testExtensionReflectionRepeatedSetters() throws Exception {\n    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();\n    extensionsReflectionTester.setAllFieldsViaReflection(builder);\n    extensionsReflectionTester.modifyRepeatedFieldsViaReflection(builder);\n    TestUtil.assertRepeatedExtensionsModified(builder);\n\n    TestAllExtensions message = builder.build();\n    TestUtil.assertRepeatedExtensionsModified(message);\n  }\n\n  public void testExtensionReflectionRepeatedSettersRejectNull()\n      throws Exception {\n    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();\n    extensionsReflectionTester.assertReflectionRepeatedSettersRejectNull(\n        builder);\n  }\n\n  public void testExtensionReflectionDefaults() throws Exception {\n    extensionsReflectionTester.assertClearViaReflection(\n      TestAllExtensions.getDefaultInstance());\n    extensionsReflectionTester.assertClearViaReflection(\n      TestAllExtensions.newBuilder().build());\n  }\n\n  public void testClearExtension() throws Exception {\n    // clearExtension() is not actually used in TestUtil, so try it manually.\n    assertFalse(\n      TestAllExtensions.newBuilder()\n        .setExtension(UnittestProto.optionalInt32Extension, 1)\n        .clearExtension(UnittestProto.optionalInt32Extension)\n        .hasExtension(UnittestProto.optionalInt32Extension));\n    assertEquals(0,\n      TestAllExtensions.newBuilder()\n        .addExtension(UnittestProto.repeatedInt32Extension, 1)\n        .clearExtension(UnittestProto.repeatedInt32Extension)\n        .getExtensionCount(UnittestProto.repeatedInt32Extension));\n  }\n\n  public void testExtensionCopy() throws Exception {\n    TestAllExtensions original = TestUtil.getAllExtensionsSet();\n    TestAllExtensions copy = TestAllExtensions.newBuilder(original).build();\n    TestUtil.assertAllExtensionsSet(copy);\n  }\n\n  public void testExtensionMergeFrom() throws Exception {\n    TestAllExtensions original =\n      TestAllExtensions.newBuilder()\n        .setExtension(UnittestProto.optionalInt32Extension, 1).build();\n    TestAllExtensions merged =\n        TestAllExtensions.newBuilder().mergeFrom(original).build();\n    assertTrue(merged.hasExtension(UnittestProto.optionalInt32Extension));\n    assertEquals(\n        1, (int) merged.getExtension(UnittestProto.optionalInt32Extension));\n  }\n\n  // =================================================================\n  // Lite Extensions.\n\n  // We test lite extensions directly because they have a separate\n  // implementation from full extensions.  In contrast, we do not test\n  // lite fields directly since they are implemented exactly the same as\n  // regular fields.\n\n  public void testLiteExtensionMessageOrBuilder() throws Exception {\n    TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder();\n    TestUtil.setAllExtensions(builder);\n    TestUtil.assertAllExtensionsSet(builder);\n\n    TestAllExtensionsLite message = builder.build();\n    TestUtil.assertAllExtensionsSet(message);\n  }\n\n  public void testLiteExtensionRepeatedSetters() throws Exception {\n    TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder();\n    TestUtil.setAllExtensions(builder);\n    TestUtil.modifyRepeatedExtensions(builder);\n    TestUtil.assertRepeatedExtensionsModified(builder);\n\n    TestAllExtensionsLite message = builder.build();\n    TestUtil.assertRepeatedExtensionsModified(message);\n  }\n\n  public void testLiteExtensionDefaults() throws Exception {\n    TestUtil.assertExtensionsClear(TestAllExtensionsLite.getDefaultInstance());\n    TestUtil.assertExtensionsClear(TestAllExtensionsLite.newBuilder().build());\n  }\n\n  public void testClearLiteExtension() throws Exception {\n    // clearExtension() is not actually used in TestUtil, so try it manually.\n    assertFalse(\n      TestAllExtensionsLite.newBuilder()\n        .setExtension(UnittestLite.optionalInt32ExtensionLite, 1)\n        .clearExtension(UnittestLite.optionalInt32ExtensionLite)\n        .hasExtension(UnittestLite.optionalInt32ExtensionLite));\n    assertEquals(0,\n      TestAllExtensionsLite.newBuilder()\n        .addExtension(UnittestLite.repeatedInt32ExtensionLite, 1)\n        .clearExtension(UnittestLite.repeatedInt32ExtensionLite)\n        .getExtensionCount(UnittestLite.repeatedInt32ExtensionLite));\n  }\n\n  public void testLiteExtensionCopy() throws Exception {\n    TestAllExtensionsLite original = TestUtil.getAllLiteExtensionsSet();\n    TestAllExtensionsLite copy =\n        TestAllExtensionsLite.newBuilder(original).build();\n    TestUtil.assertAllExtensionsSet(copy);\n  }\n\n  public void testLiteExtensionMergeFrom() throws Exception {\n    TestAllExtensionsLite original =\n      TestAllExtensionsLite.newBuilder()\n        .setExtension(UnittestLite.optionalInt32ExtensionLite, 1).build();\n    TestAllExtensionsLite merged =\n        TestAllExtensionsLite.newBuilder().mergeFrom(original).build();\n    assertTrue(merged.hasExtension(UnittestLite.optionalInt32ExtensionLite));\n    assertEquals(\n        1, (int) merged.getExtension(UnittestLite.optionalInt32ExtensionLite));\n  }\n\n  // =================================================================\n  // multiple_files_test\n\n  public void testMultipleFilesOption() throws Exception {\n    // We mostly just want to check that things compile.\n    MessageWithNoOuter message =\n      MessageWithNoOuter.newBuilder()\n        .setNested(MessageWithNoOuter.NestedMessage.newBuilder().setI(1))\n        .addForeign(TestAllTypes.newBuilder().setOptionalInt32(1))\n        .setNestedEnum(MessageWithNoOuter.NestedEnum.BAZ)\n        .setForeignEnum(EnumWithNoOuter.BAR)\n        .build();\n    assertEquals(message, MessageWithNoOuter.parseFrom(message.toByteString()));\n\n    assertEquals(MultipleFilesTestProto.getDescriptor(),\n                 MessageWithNoOuter.getDescriptor().getFile());\n\n    Descriptors.FieldDescriptor field =\n      MessageWithNoOuter.getDescriptor().findFieldByName(\"foreign_enum\");\n    assertEquals(EnumWithNoOuter.BAR.getValueDescriptor(),\n                 message.getField(field));\n\n    assertEquals(MultipleFilesTestProto.getDescriptor(),\n                 ServiceWithNoOuter.getDescriptor().getFile());\n\n    assertFalse(\n      TestAllExtensions.getDefaultInstance().hasExtension(\n        MultipleFilesTestProto.extensionWithOuter));\n  }\n\n  public void testOptionalFieldWithRequiredSubfieldsOptimizedForSize()\n    throws Exception {\n    TestOptionalOptimizedForSize message =\n        TestOptionalOptimizedForSize.getDefaultInstance();\n    assertTrue(message.isInitialized());\n\n    message = TestOptionalOptimizedForSize.newBuilder().setO(\n        TestRequiredOptimizedForSize.newBuilder().buildPartial()\n        ).buildPartial();\n    assertFalse(message.isInitialized());\n\n    message = TestOptionalOptimizedForSize.newBuilder().setO(\n        TestRequiredOptimizedForSize.newBuilder().setX(5).buildPartial()\n        ).buildPartial();\n    assertTrue(message.isInitialized());\n  }\n\n  public void testUninitializedExtensionInOptimizedForSize()\n      throws Exception {\n    TestOptimizedForSize.Builder builder = TestOptimizedForSize.newBuilder();\n    builder.setExtension(TestOptimizedForSize.testExtension2,\n        TestRequiredOptimizedForSize.newBuilder().buildPartial());\n    assertFalse(builder.isInitialized());\n    assertFalse(builder.buildPartial().isInitialized());\n\n    builder = TestOptimizedForSize.newBuilder();\n    builder.setExtension(TestOptimizedForSize.testExtension2,\n        TestRequiredOptimizedForSize.newBuilder().setX(10).buildPartial());\n    assertTrue(builder.isInitialized());\n    assertTrue(builder.buildPartial().isInitialized());\n  }\n\n  public void testToBuilder() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TestUtil.setAllFields(builder);\n    TestAllTypes message = builder.build();\n    TestUtil.assertAllFieldsSet(message);\n    TestUtil.assertAllFieldsSet(message.toBuilder().build());\n  }\n\n  public void testFieldConstantValues() throws Exception {\n    assertEquals(TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1);\n    assertEquals(TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1);\n    assertEquals(TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16);\n    assertEquals(TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18);\n    assertEquals(TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21);\n    assertEquals(TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31);\n    assertEquals(TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46);\n    assertEquals(TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48);\n    assertEquals(TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51);\n  }\n\n  public void testExtensionConstantValues() throws Exception {\n    assertEquals(UnittestProto.TestRequired.SINGLE_FIELD_NUMBER, 1000);\n    assertEquals(UnittestProto.TestRequired.MULTI_FIELD_NUMBER, 1001);\n    assertEquals(UnittestProto.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1);\n    assertEquals(UnittestProto.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16);\n    assertEquals(\n      UnittestProto.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18);\n    assertEquals(UnittestProto.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 21);\n    assertEquals(UnittestProto.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31);\n    assertEquals(UnittestProto.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46);\n    assertEquals(\n      UnittestProto.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48);\n    assertEquals(UnittestProto.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 51);\n  }\n\n  public void testRecursiveMessageDefaultInstance() throws Exception {\n    UnittestProto.TestRecursiveMessage message =\n        UnittestProto.TestRecursiveMessage.getDefaultInstance();\n    assertTrue(message != null);\n    assertTrue(message.getA() != null);\n    assertTrue(message.getA() == message);\n  }\n\n  public void testSerialize() throws Exception {\n    ByteArrayOutputStream baos = new ByteArrayOutputStream();\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TestUtil.setAllFields(builder);\n    TestAllTypes expected = builder.build();\n    ObjectOutputStream out = new ObjectOutputStream(baos);\n    try {\n      out.writeObject(expected);\n    } finally {\n      out.close();\n    }\n    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());\n    ObjectInputStream in = new ObjectInputStream(bais);\n    TestAllTypes actual = (TestAllTypes) in.readObject();\n    assertEquals(expected, actual);\n  }\n\n  public void testSerializePartial() throws Exception {\n    ByteArrayOutputStream baos = new ByteArrayOutputStream();\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TestAllTypes expected = builder.buildPartial();\n    ObjectOutputStream out = new ObjectOutputStream(baos);\n    try {\n      out.writeObject(expected);\n    } finally {\n      out.close();\n    }\n    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());\n    ObjectInputStream in = new ObjectInputStream(bais);\n    TestAllTypes actual = (TestAllTypes) in.readObject();\n    assertEquals(expected, actual);\n  }\n\n  public void testEnumValues() {\n     assertEquals(\n         TestAllTypes.NestedEnum.BAR.getNumber(),\n         TestAllTypes.NestedEnum.BAR_VALUE);\n    assertEquals(\n        TestAllTypes.NestedEnum.BAZ.getNumber(),\n        TestAllTypes.NestedEnum.BAZ_VALUE);\n    assertEquals(\n        TestAllTypes.NestedEnum.FOO.getNumber(),\n        TestAllTypes.NestedEnum.FOO_VALUE);\n  }\n\n  public void testNonNestedExtensionInitialization() {\n    assertTrue(NonNestedExtension.nonNestedExtension\n               .getMessageDefaultInstance() instanceof MyNonNestedExtension);\n    assertEquals(\"nonNestedExtension\",\n                 NonNestedExtension.nonNestedExtension.getDescriptor().getName());\n  }\n\n  public void testNestedExtensionInitialization() {\n    assertTrue(MyNestedExtension.recursiveExtension.getMessageDefaultInstance()\n               instanceof MessageToBeExtended);\n    assertEquals(\"recursiveExtension\",\n                 MyNestedExtension.recursiveExtension.getDescriptor().getName());\n  }\n\n  public void testNonNestedExtensionLiteInitialization() {\n    assertTrue(NonNestedExtensionLite.nonNestedExtensionLite\n               .getMessageDefaultInstance() instanceof MyNonNestedExtensionLite);\n  }\n\n  public void testNestedExtensionLiteInitialization() {\n    assertTrue(MyNestedExtensionLite.recursiveExtensionLite\n               .getMessageDefaultInstance() instanceof MessageLiteToBeExtended);\n  }\n\n  public void testInvalidations() throws Exception {\n    GeneratedMessage.enableAlwaysUseFieldBuildersForTesting();\n    TestAllTypes.NestedMessage nestedMessage1 =\n        TestAllTypes.NestedMessage.newBuilder().build();\n    TestAllTypes.NestedMessage nestedMessage2 =\n        TestAllTypes.NestedMessage.newBuilder().build();\n\n    // Set all three flavors (enum, primitive, message and singular/repeated)\n    // and verify no invalidations fired\n    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();\n\n    TestAllTypes.Builder builder = (TestAllTypes.Builder)\n        ((GeneratedMessage) TestAllTypes.getDefaultInstance()).\n            newBuilderForType(mockParent);\n    builder.setOptionalInt32(1);\n    builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR);\n    builder.setOptionalNestedMessage(nestedMessage1);\n    builder.addRepeatedInt32(1);\n    builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR);\n    builder.addRepeatedNestedMessage(nestedMessage1);\n    assertEquals(0, mockParent.getInvalidationCount());\n\n    // Now tell it we want changes and make sure it's only fired once\n    // And do this for each flavor\n\n    // primitive single\n    builder.buildPartial();\n    builder.setOptionalInt32(2);\n    builder.setOptionalInt32(3);\n    assertEquals(1, mockParent.getInvalidationCount());\n\n    // enum single\n    builder.buildPartial();\n    builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAZ);\n    builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR);\n    assertEquals(2, mockParent.getInvalidationCount());\n\n    // message single\n    builder.buildPartial();\n    builder.setOptionalNestedMessage(nestedMessage2);\n    builder.setOptionalNestedMessage(nestedMessage1);\n    assertEquals(3, mockParent.getInvalidationCount());\n\n    // primitive repated\n    builder.buildPartial();\n    builder.addRepeatedInt32(2);\n    builder.addRepeatedInt32(3);\n    assertEquals(4, mockParent.getInvalidationCount());\n\n    // enum repeated\n    builder.buildPartial();\n    builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ);\n    builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ);\n    assertEquals(5, mockParent.getInvalidationCount());\n\n    // message repeated\n    builder.buildPartial();\n    builder.addRepeatedNestedMessage(nestedMessage2);\n    builder.addRepeatedNestedMessage(nestedMessage1);\n    assertEquals(6, mockParent.getInvalidationCount());\n\n  }\n\n  public void testInvalidations_Extensions() throws Exception {\n    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();\n\n    TestAllExtensions.Builder builder = (TestAllExtensions.Builder)\n        ((GeneratedMessage) TestAllExtensions.getDefaultInstance()).\n            newBuilderForType(mockParent);\n\n    builder.addExtension(UnittestProto.repeatedInt32Extension, 1);\n    builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 2);\n    builder.clearExtension(UnittestProto.repeatedInt32Extension);\n    assertEquals(0, mockParent.getInvalidationCount());\n\n    // Now tell it we want changes and make sure it's only fired once\n    builder.buildPartial();\n    builder.addExtension(UnittestProto.repeatedInt32Extension, 2);\n    builder.addExtension(UnittestProto.repeatedInt32Extension, 3);\n    assertEquals(1, mockParent.getInvalidationCount());\n\n    builder.buildPartial();\n    builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 4);\n    builder.setExtension(UnittestProto.repeatedInt32Extension, 1, 5);\n    assertEquals(2, mockParent.getInvalidationCount());\n\n    builder.buildPartial();\n    builder.clearExtension(UnittestProto.repeatedInt32Extension);\n    builder.clearExtension(UnittestProto.repeatedInt32Extension);\n    assertEquals(3, mockParent.getInvalidationCount());\n  }\n\n  public void testBaseMessageOrBuilder() {\n    // Mostly just makes sure the base interface exists and has some methods.\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TestAllTypes message = builder.buildPartial();\n    TestAllTypesOrBuilder builderAsInterface = (TestAllTypesOrBuilder) builder;\n    TestAllTypesOrBuilder messageAsInterface = (TestAllTypesOrBuilder) message;\n\n    assertEquals(\n        messageAsInterface.getDefaultBool(),\n        messageAsInterface.getDefaultBool());\n    assertEquals(\n        messageAsInterface.getOptionalDouble(),\n        messageAsInterface.getOptionalDouble());\n  }\n\n  public void testMessageOrBuilderGetters() {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n\n    // single fields\n    assertSame(ForeignMessage.getDefaultInstance(),\n        builder.getOptionalForeignMessageOrBuilder());\n    ForeignMessage.Builder subBuilder =\n        builder.getOptionalForeignMessageBuilder();\n    assertSame(subBuilder, builder.getOptionalForeignMessageOrBuilder());\n\n    // repeated fields\n    ForeignMessage m0 = ForeignMessage.newBuilder().buildPartial();\n    ForeignMessage m1 = ForeignMessage.newBuilder().buildPartial();\n    ForeignMessage m2 = ForeignMessage.newBuilder().buildPartial();\n    builder.addRepeatedForeignMessage(m0);\n    builder.addRepeatedForeignMessage(m1);\n    builder.addRepeatedForeignMessage(m2);\n    assertSame(m0, builder.getRepeatedForeignMessageOrBuilder(0));\n    assertSame(m1, builder.getRepeatedForeignMessageOrBuilder(1));\n    assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2));\n    ForeignMessage.Builder b0 = builder.getRepeatedForeignMessageBuilder(0);\n    ForeignMessage.Builder b1 = builder.getRepeatedForeignMessageBuilder(1);\n    assertSame(b0, builder.getRepeatedForeignMessageOrBuilder(0));\n    assertSame(b1, builder.getRepeatedForeignMessageOrBuilder(1));\n    assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2));\n\n    List<? extends ForeignMessageOrBuilder> messageOrBuilderList =\n        builder.getRepeatedForeignMessageOrBuilderList();\n    assertSame(b0, messageOrBuilderList.get(0));\n    assertSame(b1, messageOrBuilderList.get(1));\n    assertSame(m2, messageOrBuilderList.get(2));\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport junit.framework.TestCase;\n\n/**\n * Tests for {@link LazyStringArrayList}.\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic class LazyStringArrayListTest extends TestCase {\n\n  private static String STRING_A = \"A\";\n  private static String STRING_B = \"B\";\n  private static String STRING_C = \"C\";\n\n  private static ByteString BYTE_STRING_A = ByteString.copyFromUtf8(\"A\");\n  private static ByteString BYTE_STRING_B = ByteString.copyFromUtf8(\"B\");\n  private static ByteString BYTE_STRING_C = ByteString.copyFromUtf8(\"C\");\n\n  public void testJustStrings() {\n    LazyStringArrayList list = new LazyStringArrayList();\n    list.add(STRING_A);\n    list.add(STRING_B);\n    list.add(STRING_C);\n\n    assertEquals(3, list.size());\n    assertSame(STRING_A, list.get(0));\n    assertSame(STRING_B, list.get(1));\n    assertSame(STRING_C, list.get(2));\n\n    list.set(1, STRING_C);\n    assertSame(STRING_C, list.get(1));\n\n    list.remove(1);\n    assertSame(STRING_A, list.get(0));\n    assertSame(STRING_C, list.get(1));\n  }\n\n  public void testJustByteString() {\n    LazyStringArrayList list = new LazyStringArrayList();\n    list.add(BYTE_STRING_A);\n    list.add(BYTE_STRING_B);\n    list.add(BYTE_STRING_C);\n\n    assertEquals(3, list.size());\n    assertSame(BYTE_STRING_A, list.getByteString(0));\n    assertSame(BYTE_STRING_B, list.getByteString(1));\n    assertSame(BYTE_STRING_C, list.getByteString(2));\n\n    list.remove(1);\n    assertSame(BYTE_STRING_A, list.getByteString(0));\n    assertSame(BYTE_STRING_C, list.getByteString(1));\n  }\n\n  public void testConversionBackAndForth() {\n    LazyStringArrayList list = new LazyStringArrayList();\n    list.add(STRING_A);\n    list.add(BYTE_STRING_B);\n    list.add(BYTE_STRING_C);\n\n    // String a should be the same because it was originally a string\n    assertSame(STRING_A, list.get(0));\n\n    // String b and c should be different because the string has to be computed\n    // from the ByteString\n    String bPrime = list.get(1);\n    assertNotSame(STRING_B, bPrime);\n    assertEquals(STRING_B, bPrime);\n    String cPrime = list.get(2);\n    assertNotSame(STRING_C, cPrime);\n    assertEquals(STRING_C, cPrime);\n\n    // String c and c should stay the same once cached.\n    assertSame(bPrime, list.get(1));\n    assertSame(cPrime, list.get(2));\n\n    // ByteString needs to be computed from string for both a and b\n    ByteString aPrimeByteString = list.getByteString(0);\n    assertEquals(BYTE_STRING_A, aPrimeByteString);\n    ByteString bPrimeByteString = list.getByteString(1);\n    assertNotSame(BYTE_STRING_B, bPrimeByteString);\n    assertEquals(BYTE_STRING_B, list.getByteString(1));\n\n    // Once cached, ByteString should stay cached.\n    assertSame(aPrimeByteString, list.getByteString(0));\n    assertSame(bPrimeByteString, list.getByteString(1));\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\n\nimport protobuf_unittest.UnittestProto;\n\nimport junit.framework.TestCase;\n\nimport java.io.IOException;\n\n/**\n * Tests to make sure the lazy conversion of UTF8-encoded byte arrays to\n * strings works correctly.\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic class LazyStringEndToEndTest extends TestCase {\n\n  private static ByteString TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8 =\n      ByteString.copyFrom(new byte[] {\n          114, 4, -1, 0, -1, 0, -30, 2, 4, -1,\n          0, -1, 0, -30, 2, 4, -1, 0, -1, 0, });\n\n  /**\n   * Tests that an invalid UTF8 string will roundtrip through a parse\n   * and serialization.\n   */\n  public void testParseAndSerialize() throws InvalidProtocolBufferException {\n    UnittestProto.TestAllTypes tV2 = UnittestProto.TestAllTypes.parseFrom(\n        TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8);\n    ByteString bytes = tV2.toByteString();\n    assertEquals(TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8, bytes);\n\n    tV2.getOptionalString();\n    bytes = tV2.toByteString();\n    assertEquals(TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8, bytes);\n  }\n\n  public void testParseAndWrite() throws IOException {\n    UnittestProto.TestAllTypes tV2 = UnittestProto.TestAllTypes.parseFrom(\n        TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8);\n    byte[] sink = new byte[TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8.size()];\n    CodedOutputStream outputStream = CodedOutputStream.newInstance(sink);\n    tV2.writeTo(outputStream);\n    outputStream.flush();\n    assertEquals(\n        TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8,\n        ByteString.copyFrom(sink));\n  }\n\n  public void testCaching() {\n    String a = \"a\";\n    String b = \"b\";\n    String c = \"c\";\n    UnittestProto.TestAllTypes proto = UnittestProto.TestAllTypes.newBuilder()\n        .setOptionalString(a)\n        .addRepeatedString(b)\n        .addRepeatedString(c)\n        .build();\n\n    // String should be the one we passed it.\n    assertSame(a, proto.getOptionalString());\n    assertSame(b, proto.getRepeatedString(0));\n    assertSame(c, proto.getRepeatedString(1));\n\n\n    // There's no way to directly observe that the ByteString is cached\n    // correctly on serialization, but we can observe that it had to recompute\n    // the string after serialization.\n    proto.toByteString();\n    String aPrime = proto.getOptionalString();\n    assertNotSame(a, aPrime);\n    assertEquals(a, aPrime);\n    String bPrime = proto.getRepeatedString(0);\n    assertNotSame(b, bPrime);\n    assertEquals(b, bPrime);\n    String cPrime = proto.getRepeatedString(1);\n    assertNotSame(c, cPrime);\n    assertEquals(c, cPrime);\n\n    // And now the string should stay cached.\n    assertSame(aPrime, proto.getOptionalString());\n    assertSame(bPrime, proto.getRepeatedString(0));\n    assertSame(cPrime, proto.getRepeatedString(1));\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport com.google.protobuf.UnittestLite;\nimport com.google.protobuf.UnittestLite.TestAllTypesLite;\nimport com.google.protobuf.UnittestLite.TestAllExtensionsLite;\nimport com.google.protobuf.UnittestLite.TestNestedExtensionLite;\n\nimport junit.framework.TestCase;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\n\n/**\n * Test lite runtime.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic class LiteTest extends TestCase {\n  public void setUp() throws Exception {\n    // Test that nested extensions are initialized correctly even if the outer\n    // class has not been accessed directly.  This was once a bug with lite\n    // messages.\n    //\n    // We put this in setUp() rather than in its own test method because we\n    // need to make sure it runs before any actual tests.\n    assertTrue(TestNestedExtensionLite.nestedExtension != null);\n  }\n\n  public void testLite() throws Exception {\n    // Since lite messages are a subset of regular messages, we can mostly\n    // assume that the functionality of lite messages is already thoroughly\n    // tested by the regular tests.  All this test really verifies is that\n    // a proto with optimize_for = LITE_RUNTIME compiles correctly when\n    // linked only against the lite library.  That is all tested at compile\n    // time, leaving not much to do in this method.  Let's just do some random\n    // stuff to make sure the lite message is actually here and usable.\n\n    TestAllTypesLite message =\n      TestAllTypesLite.newBuilder()\n                      .setOptionalInt32(123)\n                      .addRepeatedString(\"hello\")\n                      .setOptionalNestedMessage(\n                          TestAllTypesLite.NestedMessage.newBuilder().setBb(7))\n                      .build();\n\n    ByteString data = message.toByteString();\n\n    TestAllTypesLite message2 = TestAllTypesLite.parseFrom(data);\n\n    assertEquals(123, message2.getOptionalInt32());\n    assertEquals(1, message2.getRepeatedStringCount());\n    assertEquals(\"hello\", message2.getRepeatedString(0));\n    assertEquals(7, message2.getOptionalNestedMessage().getBb());\n  }\n\n  public void testLiteExtensions() throws Exception {\n    // TODO(kenton):  Unlike other features of the lite library, extensions are\n    //   implemented completely differently from the regular library.  We\n    //   should probably test them more thoroughly.\n\n    TestAllExtensionsLite message =\n      TestAllExtensionsLite.newBuilder()\n        .setExtension(UnittestLite.optionalInt32ExtensionLite, 123)\n        .addExtension(UnittestLite.repeatedStringExtensionLite, \"hello\")\n        .setExtension(UnittestLite.optionalNestedEnumExtensionLite,\n            TestAllTypesLite.NestedEnum.BAZ)\n        .setExtension(UnittestLite.optionalNestedMessageExtensionLite,\n            TestAllTypesLite.NestedMessage.newBuilder().setBb(7).build())\n        .build();\n\n    // Test copying a message, since coping extensions actually does use a\n    // different code path between lite and regular libraries, and as of this\n    // writing, parsing hasn't been implemented yet.\n    TestAllExtensionsLite message2 = message.toBuilder().build();\n\n    assertEquals(123, (int) message2.getExtension(\n        UnittestLite.optionalInt32ExtensionLite));\n    assertEquals(1, message2.getExtensionCount(\n        UnittestLite.repeatedStringExtensionLite));\n    assertEquals(1, message2.getExtension(\n        UnittestLite.repeatedStringExtensionLite).size());\n    assertEquals(\"hello\", message2.getExtension(\n        UnittestLite.repeatedStringExtensionLite, 0));\n    assertEquals(TestAllTypesLite.NestedEnum.BAZ, message2.getExtension(\n        UnittestLite.optionalNestedEnumExtensionLite));\n    assertEquals(7, message2.getExtension(\n        UnittestLite.optionalNestedMessageExtensionLite).getBb());\n  }\n\n  public void testSerialize() throws Exception {\n    ByteArrayOutputStream baos = new ByteArrayOutputStream();\n    TestAllTypesLite expected =\n      TestAllTypesLite.newBuilder()\n                      .setOptionalInt32(123)\n                      .addRepeatedString(\"hello\")\n                      .setOptionalNestedMessage(\n                          TestAllTypesLite.NestedMessage.newBuilder().setBb(7))\n                      .build();\n    ObjectOutputStream out = new ObjectOutputStream(baos);\n    try {\n      out.writeObject(expected);\n    } finally {\n      out.close();\n    }\n    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());\n    ObjectInputStream in = new ObjectInputStream(bais);\n    TestAllTypesLite actual = (TestAllTypesLite) in.readObject();\n    assertEquals(expected.getOptionalInt32(), actual.getOptionalInt32());\n    assertEquals(expected.getRepeatedStringCount(),\n        actual.getRepeatedStringCount());\n    assertEquals(expected.getRepeatedString(0),\n        actual.getRepeatedString(0));\n    assertEquals(expected.getOptionalNestedMessage().getBb(),\n        actual.getOptionalNestedMessage().getBb());\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestAllExtensions;\nimport protobuf_unittest.UnittestProto.TestRequired;\nimport protobuf_unittest.UnittestProto.TestRequiredForeign;\nimport protobuf_unittest.UnittestProto.ForeignMessage;\n\nimport junit.framework.TestCase;\n\n/**\n * Misc. unit tests for message operations that apply to both generated\n * and dynamic messages.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic class MessageTest extends TestCase {\n  // =================================================================\n  // Message-merging tests.\n\n  static final TestAllTypes MERGE_SOURCE =\n    TestAllTypes.newBuilder()\n      .setOptionalInt32(1)\n      .setOptionalString(\"foo\")\n      .setOptionalForeignMessage(ForeignMessage.getDefaultInstance())\n      .addRepeatedString(\"bar\")\n      .build();\n\n  static final TestAllTypes MERGE_DEST =\n    TestAllTypes.newBuilder()\n      .setOptionalInt64(2)\n      .setOptionalString(\"baz\")\n      .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(3).build())\n      .addRepeatedString(\"qux\")\n      .build();\n\n  static final String MERGE_RESULT_TEXT =\n      \"optional_int32: 1\\n\" +\n      \"optional_int64: 2\\n\" +\n      \"optional_string: \\\"foo\\\"\\n\" +\n      \"optional_foreign_message {\\n\" +\n      \"  c: 3\\n\" +\n      \"}\\n\" +\n      \"repeated_string: \\\"qux\\\"\\n\" +\n      \"repeated_string: \\\"bar\\\"\\n\";\n\n  public void testMergeFrom() throws Exception {\n    TestAllTypes result =\n      TestAllTypes.newBuilder(MERGE_DEST)\n        .mergeFrom(MERGE_SOURCE).build();\n\n    assertEquals(MERGE_RESULT_TEXT, result.toString());\n  }\n\n  /**\n   * Test merging a DynamicMessage into a GeneratedMessage.  As long as they\n   * have the same descriptor, this should work, but it is an entirely different\n   * code path.\n   */\n  public void testMergeFromDynamic() throws Exception {\n    TestAllTypes result =\n      TestAllTypes.newBuilder(MERGE_DEST)\n        .mergeFrom(DynamicMessage.newBuilder(MERGE_SOURCE).build())\n        .build();\n\n    assertEquals(MERGE_RESULT_TEXT, result.toString());\n  }\n\n  /** Test merging two DynamicMessages. */\n  public void testDynamicMergeFrom() throws Exception {\n    DynamicMessage result =\n      DynamicMessage.newBuilder(MERGE_DEST)\n        .mergeFrom(DynamicMessage.newBuilder(MERGE_SOURCE).build())\n        .build();\n\n    assertEquals(MERGE_RESULT_TEXT, result.toString());\n  }\n\n  // =================================================================\n  // Required-field-related tests.\n\n  private static final TestRequired TEST_REQUIRED_UNINITIALIZED =\n    TestRequired.getDefaultInstance();\n  private static final TestRequired TEST_REQUIRED_INITIALIZED =\n    TestRequired.newBuilder().setA(1).setB(2).setC(3).build();\n\n  public void testRequired() throws Exception {\n    TestRequired.Builder builder = TestRequired.newBuilder();\n\n    assertFalse(builder.isInitialized());\n    builder.setA(1);\n    assertFalse(builder.isInitialized());\n    builder.setB(1);\n    assertFalse(builder.isInitialized());\n    builder.setC(1);\n    assertTrue(builder.isInitialized());\n  }\n\n  public void testRequiredForeign() throws Exception {\n    TestRequiredForeign.Builder builder = TestRequiredForeign.newBuilder();\n\n    assertTrue(builder.isInitialized());\n\n    builder.setOptionalMessage(TEST_REQUIRED_UNINITIALIZED);\n    assertFalse(builder.isInitialized());\n\n    builder.setOptionalMessage(TEST_REQUIRED_INITIALIZED);\n    assertTrue(builder.isInitialized());\n\n    builder.addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED);\n    assertFalse(builder.isInitialized());\n\n    builder.setRepeatedMessage(0, TEST_REQUIRED_INITIALIZED);\n    assertTrue(builder.isInitialized());\n  }\n\n  public void testRequiredExtension() throws Exception {\n    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();\n\n    assertTrue(builder.isInitialized());\n\n    builder.setExtension(TestRequired.single, TEST_REQUIRED_UNINITIALIZED);\n    assertFalse(builder.isInitialized());\n\n    builder.setExtension(TestRequired.single, TEST_REQUIRED_INITIALIZED);\n    assertTrue(builder.isInitialized());\n\n    builder.addExtension(TestRequired.multi, TEST_REQUIRED_UNINITIALIZED);\n    assertFalse(builder.isInitialized());\n\n    builder.setExtension(TestRequired.multi, 0, TEST_REQUIRED_INITIALIZED);\n    assertTrue(builder.isInitialized());\n  }\n\n  public void testRequiredDynamic() throws Exception {\n    Descriptors.Descriptor descriptor = TestRequired.getDescriptor();\n    DynamicMessage.Builder builder = DynamicMessage.newBuilder(descriptor);\n\n    assertFalse(builder.isInitialized());\n    builder.setField(descriptor.findFieldByName(\"a\"), 1);\n    assertFalse(builder.isInitialized());\n    builder.setField(descriptor.findFieldByName(\"b\"), 1);\n    assertFalse(builder.isInitialized());\n    builder.setField(descriptor.findFieldByName(\"c\"), 1);\n    assertTrue(builder.isInitialized());\n  }\n\n  public void testRequiredDynamicForeign() throws Exception {\n    Descriptors.Descriptor descriptor = TestRequiredForeign.getDescriptor();\n    DynamicMessage.Builder builder = DynamicMessage.newBuilder(descriptor);\n\n    assertTrue(builder.isInitialized());\n\n    builder.setField(descriptor.findFieldByName(\"optional_message\"),\n                     TEST_REQUIRED_UNINITIALIZED);\n    assertFalse(builder.isInitialized());\n\n    builder.setField(descriptor.findFieldByName(\"optional_message\"),\n                     TEST_REQUIRED_INITIALIZED);\n    assertTrue(builder.isInitialized());\n\n    builder.addRepeatedField(descriptor.findFieldByName(\"repeated_message\"),\n                             TEST_REQUIRED_UNINITIALIZED);\n    assertFalse(builder.isInitialized());\n\n    builder.setRepeatedField(descriptor.findFieldByName(\"repeated_message\"), 0,\n                             TEST_REQUIRED_INITIALIZED);\n    assertTrue(builder.isInitialized());\n  }\n\n  public void testUninitializedException() throws Exception {\n    try {\n      TestRequired.newBuilder().build();\n      fail(\"Should have thrown an exception.\");\n    } catch (UninitializedMessageException e) {\n      assertEquals(\"Message missing required fields: a, b, c\", e.getMessage());\n    }\n  }\n\n  public void testBuildPartial() throws Exception {\n    // We're mostly testing that no exception is thrown.\n    TestRequired message = TestRequired.newBuilder().buildPartial();\n    assertFalse(message.isInitialized());\n  }\n\n  public void testNestedUninitializedException() throws Exception {\n    try {\n      TestRequiredForeign.newBuilder()\n        .setOptionalMessage(TEST_REQUIRED_UNINITIALIZED)\n        .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED)\n        .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED)\n        .build();\n      fail(\"Should have thrown an exception.\");\n    } catch (UninitializedMessageException e) {\n      assertEquals(\n        \"Message missing required fields: \" +\n        \"optional_message.a, \" +\n        \"optional_message.b, \" +\n        \"optional_message.c, \" +\n        \"repeated_message[0].a, \" +\n        \"repeated_message[0].b, \" +\n        \"repeated_message[0].c, \" +\n        \"repeated_message[1].a, \" +\n        \"repeated_message[1].b, \" +\n        \"repeated_message[1].c\",\n        e.getMessage());\n    }\n  }\n\n  public void testBuildNestedPartial() throws Exception {\n    // We're mostly testing that no exception is thrown.\n    TestRequiredForeign message =\n      TestRequiredForeign.newBuilder()\n        .setOptionalMessage(TEST_REQUIRED_UNINITIALIZED)\n        .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED)\n        .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED)\n        .buildPartial();\n    assertFalse(message.isInitialized());\n  }\n\n  public void testParseUnititialized() throws Exception {\n    try {\n      TestRequired.parseFrom(ByteString.EMPTY);\n      fail(\"Should have thrown an exception.\");\n    } catch (InvalidProtocolBufferException e) {\n      assertEquals(\"Message missing required fields: a, b, c\", e.getMessage());\n    }\n  }\n\n  public void testParseNestedUnititialized() throws Exception {\n    ByteString data =\n      TestRequiredForeign.newBuilder()\n        .setOptionalMessage(TEST_REQUIRED_UNINITIALIZED)\n        .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED)\n        .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED)\n        .buildPartial().toByteString();\n\n    try {\n      TestRequiredForeign.parseFrom(data);\n      fail(\"Should have thrown an exception.\");\n    } catch (InvalidProtocolBufferException e) {\n      assertEquals(\n        \"Message missing required fields: \" +\n        \"optional_message.a, \" +\n        \"optional_message.b, \" +\n        \"optional_message.c, \" +\n        \"repeated_message[0].a, \" +\n        \"repeated_message[0].b, \" +\n        \"repeated_message[0].c, \" +\n        \"repeated_message[1].a, \" +\n        \"repeated_message[1].b, \" +\n        \"repeated_message[1].c\",\n        e.getMessage());\n    }\n  }\n\n  public void testDynamicUninitializedException() throws Exception {\n    try {\n      DynamicMessage.newBuilder(TestRequired.getDescriptor()).build();\n      fail(\"Should have thrown an exception.\");\n    } catch (UninitializedMessageException e) {\n      assertEquals(\"Message missing required fields: a, b, c\", e.getMessage());\n    }\n  }\n\n  public void testDynamicBuildPartial() throws Exception {\n    // We're mostly testing that no exception is thrown.\n    DynamicMessage message =\n      DynamicMessage.newBuilder(TestRequired.getDescriptor())\n        .buildPartial();\n    assertFalse(message.isInitialized());\n  }\n\n  public void testDynamicParseUnititialized() throws Exception {\n    try {\n      Descriptors.Descriptor descriptor = TestRequired.getDescriptor();\n      DynamicMessage.parseFrom(descriptor, ByteString.EMPTY);\n      fail(\"Should have thrown an exception.\");\n    } catch (InvalidProtocolBufferException e) {\n      assertEquals(\"Message missing required fields: a, b, c\", e.getMessage());\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport protobuf_unittest.Vehicle;\nimport protobuf_unittest.Wheel;\n\nimport junit.framework.TestCase;\n\nimport java.util.List;\nimport java.util.ArrayList;\n\n/**\n * Test cases that exercise end-to-end use cases involving\n * {@link SingleFieldBuilder} and {@link RepeatedFieldBuilder}.\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic class NestedBuildersTest extends TestCase {\n\n  public void testMessagesAndBuilders() {\n    Vehicle.Builder vehicleBuilder = Vehicle.newBuilder();\n    vehicleBuilder.addWheelBuilder()\n        .setRadius(4)\n        .setWidth(1);\n    vehicleBuilder.addWheelBuilder()\n        .setRadius(4)\n        .setWidth(2);\n    vehicleBuilder.addWheelBuilder()\n        .setRadius(4)\n        .setWidth(3);\n    vehicleBuilder.addWheelBuilder()\n        .setRadius(4)\n        .setWidth(4);\n    vehicleBuilder.getEngineBuilder()\n        .setLiters(10);\n\n    Vehicle vehicle = vehicleBuilder.build();\n    assertEquals(4, vehicle.getWheelCount());\n    for (int i = 0; i < 4; i++) {\n      Wheel wheel = vehicle.getWheel(i);\n      assertEquals(4, wheel.getRadius());\n      assertEquals(i + 1, wheel.getWidth());\n    }\n    assertEquals(10, vehicle.getEngine().getLiters());\n\n    for (int i = 0; i < 4; i++) {\n      vehicleBuilder.getWheelBuilder(i)\n          .setRadius(5)\n          .setWidth(i + 10);\n    }\n    vehicleBuilder.getEngineBuilder().setLiters(20);\n\n    vehicle = vehicleBuilder.build();\n    for (int i = 0; i < 4; i++) {\n      Wheel wheel = vehicle.getWheel(i);\n      assertEquals(5, wheel.getRadius());\n      assertEquals(i + 10, wheel.getWidth());\n    }\n    assertEquals(20, vehicle.getEngine().getLiters());\n    assertTrue(vehicle.hasEngine());\n  }\n\n  public void testMessagesAreCached() {\n    Vehicle.Builder vehicleBuilder = Vehicle.newBuilder();\n    vehicleBuilder.addWheelBuilder()\n        .setRadius(1)\n        .setWidth(2);\n    vehicleBuilder.addWheelBuilder()\n        .setRadius(3)\n        .setWidth(4);\n    vehicleBuilder.addWheelBuilder()\n        .setRadius(5)\n        .setWidth(6);\n    vehicleBuilder.addWheelBuilder()\n        .setRadius(7)\n        .setWidth(8);\n\n    // Make sure messages are cached.\n    List<Wheel> wheels = new ArrayList<Wheel>(vehicleBuilder.getWheelList());\n    for (int i = 0; i < wheels.size(); i++) {\n      assertSame(wheels.get(i), vehicleBuilder.getWheel(i));\n    }\n\n    // Now get builders and check they didn't change.\n    for (int i = 0; i < wheels.size(); i++) {\n      vehicleBuilder.getWheel(i);\n    }\n    for (int i = 0; i < wheels.size(); i++) {\n      assertSame(wheels.get(i), vehicleBuilder.getWheel(i));\n    }\n\n    // Change just one\n    vehicleBuilder.getWheelBuilder(3)\n        .setRadius(20).setWidth(20);\n\n    // Now get wheels and check that only that one changed\n    for (int i = 0; i < wheels.size(); i++) {\n      if (i < 3) {\n        assertSame(wheels.get(i), vehicleBuilder.getWheel(i));\n      } else {\n        assertNotSame(wheels.get(i), vehicleBuilder.getWheel(i));\n      }\n    }\n  }\n\n  public void testRemove_WithNestedBuilders() {\n    Vehicle.Builder vehicleBuilder = Vehicle.newBuilder();\n    vehicleBuilder.addWheelBuilder()\n        .setRadius(1)\n        .setWidth(1);\n    vehicleBuilder.addWheelBuilder()\n        .setRadius(2)\n        .setWidth(2);\n    vehicleBuilder.removeWheel(0);\n\n    assertEquals(1, vehicleBuilder.getWheelCount());\n    assertEquals(2, vehicleBuilder.getWheel(0).getRadius());\n  }\n\n  public void testRemove_WithNestedMessages() {\n    Vehicle.Builder vehicleBuilder = Vehicle.newBuilder();\n    vehicleBuilder.addWheel(Wheel.newBuilder()\n        .setRadius(1)\n        .setWidth(1));\n    vehicleBuilder.addWheel(Wheel.newBuilder()\n        .setRadius(2)\n        .setWidth(2));\n    vehicleBuilder.removeWheel(0);\n\n    assertEquals(1, vehicleBuilder.getWheelCount());\n    assertEquals(2, vehicleBuilder.getWheel(0).getRadius());\n  }\n\n  public void testMerge() {\n    Vehicle vehicle1 = Vehicle.newBuilder()\n        .addWheel(Wheel.newBuilder().setRadius(1).build())\n        .addWheel(Wheel.newBuilder().setRadius(2).build())\n        .build();\n\n    Vehicle vehicle2 = Vehicle.newBuilder()\n        .mergeFrom(vehicle1)\n        .build();\n    // List should be the same -- no allocation\n    assertSame(vehicle1.getWheelList(), vehicle2.getWheelList());\n\n    Vehicle vehicle3 = vehicle1.toBuilder().build();\n    assertSame(vehicle1.getWheelList(), vehicle3.getWheelList());\n  }\n\n  public void testGettingBuilderMarksFieldAsHaving() {\n    Vehicle.Builder vehicleBuilder = Vehicle.newBuilder();\n    vehicleBuilder.getEngineBuilder();\n    Vehicle vehicle = vehicleBuilder.buildPartial();\n    assertTrue(vehicle.hasEngine());\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestAllTypesOrBuilder;\n\nimport junit.framework.TestCase;\n\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * Tests for {@link RepeatedFieldBuilder}. This tests basic functionality.\n * More extensive testing is provided via other tests that exercise the\n * builder.\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic class RepeatedFieldBuilderTest extends TestCase {\n\n  public void testBasicUse() {\n    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();\n    RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n        TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent);\n    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build());\n    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build());\n    assertEquals(0, builder.getMessage(0).getOptionalInt32());\n    assertEquals(1, builder.getMessage(1).getOptionalInt32());\n\n    List<TestAllTypes> list = builder.build();\n    assertEquals(2, list.size());\n    assertEquals(0, list.get(0).getOptionalInt32());\n    assertEquals(1, list.get(1).getOptionalInt32());\n    assertIsUnmodifiable(list);\n\n    // Make sure it doesn't change.\n    List<TestAllTypes> list2 = builder.build();\n    assertSame(list, list2);\n    assertEquals(0, mockParent.getInvalidationCount());\n  }\n\n  public void testGoingBackAndForth() {\n    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();\n    RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n        TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent);\n    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build());\n    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build());\n    assertEquals(0, builder.getMessage(0).getOptionalInt32());\n    assertEquals(1, builder.getMessage(1).getOptionalInt32());\n\n    // Convert to list\n    List<TestAllTypes> list = builder.build();\n    assertEquals(2, list.size());\n    assertEquals(0, list.get(0).getOptionalInt32());\n    assertEquals(1, list.get(1).getOptionalInt32());\n    assertIsUnmodifiable(list);\n\n    // Update 0th item\n    assertEquals(0, mockParent.getInvalidationCount());\n    builder.getBuilder(0).setOptionalString(\"foo\");\n    assertEquals(1, mockParent.getInvalidationCount());\n    list = builder.build();\n    assertEquals(2, list.size());\n    assertEquals(0, list.get(0).getOptionalInt32());\n      assertEquals(\"foo\", list.get(0).getOptionalString());\n    assertEquals(1, list.get(1).getOptionalInt32());\n    assertIsUnmodifiable(list);\n    assertEquals(1, mockParent.getInvalidationCount());\n  }\n\n  public void testVariousMethods() {\n    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();\n    RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n        TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent);\n    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build());\n    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(2).build());\n    builder.addBuilder(0, TestAllTypes.getDefaultInstance())\n        .setOptionalInt32(0);\n    builder.addBuilder(TestAllTypes.getDefaultInstance()).setOptionalInt32(3);\n\n    assertEquals(0, builder.getMessage(0).getOptionalInt32());\n    assertEquals(1, builder.getMessage(1).getOptionalInt32());\n    assertEquals(2, builder.getMessage(2).getOptionalInt32());\n    assertEquals(3, builder.getMessage(3).getOptionalInt32());\n\n    assertEquals(0, mockParent.getInvalidationCount());\n    List<TestAllTypes> messages = builder.build();\n    assertEquals(4, messages.size());\n    assertSame(messages, builder.build()); // expect same list\n\n    // Remove a message.\n    builder.remove(2);\n    assertEquals(1, mockParent.getInvalidationCount());\n    assertEquals(3, builder.getCount());\n    assertEquals(0, builder.getMessage(0).getOptionalInt32());\n    assertEquals(1, builder.getMessage(1).getOptionalInt32());\n    assertEquals(3, builder.getMessage(2).getOptionalInt32());\n\n    // Remove a builder.\n    builder.remove(0);\n    assertEquals(1, mockParent.getInvalidationCount());\n    assertEquals(2, builder.getCount());\n    assertEquals(1, builder.getMessage(0).getOptionalInt32());\n    assertEquals(3, builder.getMessage(1).getOptionalInt32());\n\n    // Test clear.\n    builder.clear();\n    assertEquals(1, mockParent.getInvalidationCount());\n    assertEquals(0, builder.getCount());\n    assertTrue(builder.isEmpty());\n  }\n\n  public void testLists() {\n    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();\n    RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n        TestAllTypesOrBuilder> builder = newRepeatedFieldBuilder(mockParent);\n    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build());\n    builder.addMessage(0,\n        TestAllTypes.newBuilder().setOptionalInt32(0).build());\n    assertEquals(0, builder.getMessage(0).getOptionalInt32());\n    assertEquals(1, builder.getMessage(1).getOptionalInt32());\n\n    // Use list of builders.\n    List<TestAllTypes.Builder> builders = builder.getBuilderList();\n    assertEquals(0, builders.get(0).getOptionalInt32());\n    assertEquals(1, builders.get(1).getOptionalInt32());\n    builders.get(0).setOptionalInt32(10);\n    builders.get(1).setOptionalInt32(11);\n\n    // Use list of protos\n    List<TestAllTypes> protos = builder.getMessageList();\n    assertEquals(10, protos.get(0).getOptionalInt32());\n    assertEquals(11, protos.get(1).getOptionalInt32());\n\n    // Add an item to the builders and verify it's updated in both\n    builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(12).build());\n    assertEquals(3, builders.size());\n    assertEquals(3, protos.size());\n  }\n\n  private void assertIsUnmodifiable(List<?> list) {\n    if (list == Collections.emptyList()) {\n      // OKAY -- Need to check this b/c EmptyList allows you to call clear.\n    } else {\n      try {\n        list.clear();\n        fail(\"List wasn't immutable\");\n      } catch (UnsupportedOperationException e) {\n        // good\n      }\n    }\n  }\n\n  private RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n      TestAllTypesOrBuilder>\n      newRepeatedFieldBuilder(GeneratedMessage.BuilderParent parent) {\n    return new RepeatedFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n        TestAllTypesOrBuilder>(Collections.<TestAllTypes>emptyList(), false,\n        parent, false);\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport com.google.protobuf.Descriptors.FileDescriptor;\nimport com.google.protobuf.Descriptors.MethodDescriptor;\nimport google.protobuf.no_generic_services_test.UnittestNoGenericServices;\nimport protobuf_unittest.MessageWithNoOuter;\nimport protobuf_unittest.ServiceWithNoOuter;\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestService;\nimport protobuf_unittest.UnittestProto.FooRequest;\nimport protobuf_unittest.UnittestProto.FooResponse;\nimport protobuf_unittest.UnittestProto.BarRequest;\nimport protobuf_unittest.UnittestProto.BarResponse;\n\nimport org.easymock.classextension.EasyMock;\nimport org.easymock.classextension.IMocksControl;\nimport org.easymock.IArgumentMatcher;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\nimport junit.framework.TestCase;\n\n/**\n * Tests services and stubs.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic class ServiceTest extends TestCase {\n  private IMocksControl control;\n  private RpcController mockController;\n\n  private final Descriptors.MethodDescriptor fooDescriptor =\n    TestService.getDescriptor().getMethods().get(0);\n  private final Descriptors.MethodDescriptor barDescriptor =\n    TestService.getDescriptor().getMethods().get(1);\n\n  @Override\n  protected void setUp() throws Exception {\n    super.setUp();\n    control = EasyMock.createStrictControl();\n    mockController = control.createMock(RpcController.class);\n  }\n\n  // =================================================================\n\n  /** Tests Service.callMethod(). */\n  public void testCallMethod() throws Exception {\n    FooRequest fooRequest = FooRequest.newBuilder().build();\n    BarRequest barRequest = BarRequest.newBuilder().build();\n    MockCallback<Message> fooCallback = new MockCallback<Message>();\n    MockCallback<Message> barCallback = new MockCallback<Message>();\n    TestService mockService = control.createMock(TestService.class);\n\n    mockService.foo(EasyMock.same(mockController), EasyMock.same(fooRequest),\n                    this.<FooResponse>wrapsCallback(fooCallback));\n    mockService.bar(EasyMock.same(mockController), EasyMock.same(barRequest),\n                    this.<BarResponse>wrapsCallback(barCallback));\n    control.replay();\n\n    mockService.callMethod(fooDescriptor, mockController,\n                           fooRequest, fooCallback);\n    mockService.callMethod(barDescriptor, mockController,\n                           barRequest, barCallback);\n    control.verify();\n  }\n\n  /** Tests Service.get{Request,Response}Prototype(). */\n  public void testGetPrototype() throws Exception {\n    TestService mockService = control.createMock(TestService.class);\n\n    assertSame(mockService.getRequestPrototype(fooDescriptor),\n               FooRequest.getDefaultInstance());\n    assertSame(mockService.getResponsePrototype(fooDescriptor),\n               FooResponse.getDefaultInstance());\n    assertSame(mockService.getRequestPrototype(barDescriptor),\n               BarRequest.getDefaultInstance());\n    assertSame(mockService.getResponsePrototype(barDescriptor),\n               BarResponse.getDefaultInstance());\n  }\n\n  /** Tests generated stubs. */\n  public void testStub() throws Exception {\n    FooRequest fooRequest = FooRequest.newBuilder().build();\n    BarRequest barRequest = BarRequest.newBuilder().build();\n    MockCallback<FooResponse> fooCallback = new MockCallback<FooResponse>();\n    MockCallback<BarResponse> barCallback = new MockCallback<BarResponse>();\n    RpcChannel mockChannel = control.createMock(RpcChannel.class);\n    TestService stub = TestService.newStub(mockChannel);\n\n    mockChannel.callMethod(\n      EasyMock.same(fooDescriptor),\n      EasyMock.same(mockController),\n      EasyMock.same(fooRequest),\n      EasyMock.same(FooResponse.getDefaultInstance()),\n      this.<Message>wrapsCallback(fooCallback));\n    mockChannel.callMethod(\n      EasyMock.same(barDescriptor),\n      EasyMock.same(mockController),\n      EasyMock.same(barRequest),\n      EasyMock.same(BarResponse.getDefaultInstance()),\n      this.<Message>wrapsCallback(barCallback));\n    control.replay();\n\n    stub.foo(mockController, fooRequest, fooCallback);\n    stub.bar(mockController, barRequest, barCallback);\n    control.verify();\n  }\n\n  /** Tests generated blocking stubs. */\n  public void testBlockingStub() throws Exception {\n    FooRequest fooRequest = FooRequest.newBuilder().build();\n    BarRequest barRequest = BarRequest.newBuilder().build();\n    BlockingRpcChannel mockChannel =\n        control.createMock(BlockingRpcChannel.class);\n    TestService.BlockingInterface stub =\n        TestService.newBlockingStub(mockChannel);\n\n    FooResponse fooResponse = FooResponse.newBuilder().build();\n    BarResponse barResponse = BarResponse.newBuilder().build();\n\n    EasyMock.expect(mockChannel.callBlockingMethod(\n      EasyMock.same(fooDescriptor),\n      EasyMock.same(mockController),\n      EasyMock.same(fooRequest),\n      EasyMock.same(FooResponse.getDefaultInstance()))).andReturn(fooResponse);\n    EasyMock.expect(mockChannel.callBlockingMethod(\n      EasyMock.same(barDescriptor),\n      EasyMock.same(mockController),\n      EasyMock.same(barRequest),\n      EasyMock.same(BarResponse.getDefaultInstance()))).andReturn(barResponse);\n    control.replay();\n\n    assertSame(fooResponse, stub.foo(mockController, fooRequest));\n    assertSame(barResponse, stub.bar(mockController, barRequest));\n    control.verify();\n  }\n\n  public void testNewReflectiveService() {\n    ServiceWithNoOuter.Interface impl =\n        control.createMock(ServiceWithNoOuter.Interface.class);\n    RpcController controller = control.createMock(RpcController.class);\n    Service service = ServiceWithNoOuter.newReflectiveService(impl);\n\n    MethodDescriptor fooMethod =\n        ServiceWithNoOuter.getDescriptor().findMethodByName(\"Foo\");\n    MessageWithNoOuter request = MessageWithNoOuter.getDefaultInstance();\n    RpcCallback<Message> callback = new RpcCallback<Message>() {\n      public void run(Message parameter) {\n        // No reason this should be run.\n        fail();\n      }\n    };\n    RpcCallback<TestAllTypes> specializedCallback =\n        RpcUtil.specializeCallback(callback);\n\n    impl.foo(EasyMock.same(controller), EasyMock.same(request),\n        EasyMock.same(specializedCallback));\n    EasyMock.expectLastCall();\n\n    control.replay();\n\n    service.callMethod(fooMethod, controller, request, callback);\n\n    control.verify();\n  }\n\n  public void testNewReflectiveBlockingService() throws ServiceException {\n    ServiceWithNoOuter.BlockingInterface impl =\n        control.createMock(ServiceWithNoOuter.BlockingInterface.class);\n    RpcController controller = control.createMock(RpcController.class);\n    BlockingService service =\n        ServiceWithNoOuter.newReflectiveBlockingService(impl);\n\n    MethodDescriptor fooMethod =\n        ServiceWithNoOuter.getDescriptor().findMethodByName(\"Foo\");\n    MessageWithNoOuter request = MessageWithNoOuter.getDefaultInstance();\n\n    TestAllTypes expectedResponse = TestAllTypes.getDefaultInstance();\n    EasyMock.expect(impl.foo(EasyMock.same(controller), EasyMock.same(request)))\n        .andReturn(expectedResponse);\n\n    control.replay();\n\n    Message response =\n        service.callBlockingMethod(fooMethod, controller, request);\n    assertEquals(expectedResponse, response);\n\n    control.verify();\n  }\n\n  public void testNoGenericServices() throws Exception {\n    // Non-services should be usable.\n    UnittestNoGenericServices.TestMessage message =\n      UnittestNoGenericServices.TestMessage.newBuilder()\n        .setA(123)\n        .setExtension(UnittestNoGenericServices.testExtension, 456)\n        .build();\n    assertEquals(123, message.getA());\n    assertEquals(1, UnittestNoGenericServices.TestEnum.FOO.getNumber());\n\n    // Build a list of the class names nested in UnittestNoGenericServices.\n    String outerName = \"google.protobuf.no_generic_services_test.\" +\n                       \"UnittestNoGenericServices\";\n    Class<?> outerClass = Class.forName(outerName);\n\n    Set<String> innerClassNames = new HashSet<String>();\n    for (Class<?> innerClass : outerClass.getClasses()) {\n      String fullName = innerClass.getName();\n      // Figure out the unqualified name of the inner class.\n      // Note:  Surprisingly, the full name of an inner class will be separated\n      //   from the outer class name by a '$' rather than a '.'.  This is not\n      //   mentioned in the documentation for java.lang.Class.  I don't want to\n      //   make assumptions, so I'm just going to accept any character as the\n      //   separator.\n      assertTrue(fullName.startsWith(outerName));\n\n      if (!Service.class.isAssignableFrom(innerClass) &&\n          !Message.class.isAssignableFrom(innerClass) &&\n          !ProtocolMessageEnum.class.isAssignableFrom(innerClass)) {\n        // Ignore any classes not generated by the base code generator.\n        continue;\n      }\n\n      innerClassNames.add(fullName.substring(outerName.length() + 1));\n    }\n\n    // No service class should have been generated.\n    assertTrue(innerClassNames.contains(\"TestMessage\"));\n    assertTrue(innerClassNames.contains(\"TestEnum\"));\n    assertFalse(innerClassNames.contains(\"TestService\"));\n\n    // But descriptors are there.\n    FileDescriptor file = UnittestNoGenericServices.getDescriptor();\n    assertEquals(1, file.getServices().size());\n    assertEquals(\"TestService\", file.getServices().get(0).getName());\n    assertEquals(1, file.getServices().get(0).getMethods().size());\n    assertEquals(\"Foo\",\n        file.getServices().get(0).getMethods().get(0).getName());\n  }\n\n  // =================================================================\n\n  /**\n   * wrapsCallback() is an EasyMock argument predicate.  wrapsCallback(c)\n   * matches a callback if calling that callback causes c to be called.\n   * In other words, c wraps the given callback.\n   */\n  private <Type extends Message> RpcCallback<Type> wrapsCallback(\n      MockCallback<?> callback) {\n    EasyMock.reportMatcher(new WrapsCallback(callback));\n    return null;\n  }\n\n  /** The parameter to wrapsCallback() must be a MockCallback. */\n  private static class MockCallback<Type extends Message>\n      implements RpcCallback<Type> {\n    private boolean called = false;\n\n    public boolean isCalled() { return called; }\n\n    public void reset() { called = false; }\n    public void run(Type message) { called = true; }\n  }\n\n  /** Implementation of the wrapsCallback() argument matcher. */\n  private static class WrapsCallback implements IArgumentMatcher {\n    private MockCallback<?> callback;\n\n    public WrapsCallback(MockCallback<?> callback) {\n      this.callback = callback;\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    public boolean matches(Object actual) {\n      if (!(actual instanceof RpcCallback)) {\n        return false;\n      }\n      RpcCallback actualCallback = (RpcCallback)actual;\n\n      callback.reset();\n      actualCallback.run(null);\n      return callback.isCalled();\n    }\n\n    public void appendTo(StringBuffer buffer) {\n      buffer.append(\"wrapsCallback(mockCallback)\");\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestAllTypesOrBuilder;\n\nimport junit.framework.TestCase;\n\n/**\n * Tests for {@link SingleFieldBuilder}. This tests basic functionality.\n * More extensive testing is provided via other tests that exercise the\n * builder.\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic class SingleFieldBuilderTest extends TestCase {\n\n  public void testBasicUseAndInvalidations() {\n    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();\n    SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n        TestAllTypesOrBuilder> builder =\n        new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n            TestAllTypesOrBuilder>(\n            TestAllTypes.getDefaultInstance(),\n            mockParent,\n            false);\n    assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage());\n    assertEquals(TestAllTypes.getDefaultInstance(),\n        builder.getBuilder().buildPartial());\n    assertEquals(0, mockParent.getInvalidationCount());\n\n    builder.getBuilder().setOptionalInt32(10);\n    assertEquals(0, mockParent.getInvalidationCount());\n    TestAllTypes message = builder.build();\n    assertEquals(10, message.getOptionalInt32());\n\n    // Test that we receive invalidations now that build has been called.\n    assertEquals(0, mockParent.getInvalidationCount());\n    builder.getBuilder().setOptionalInt32(20);\n    assertEquals(1, mockParent.getInvalidationCount());\n\n    // Test that we don't keep getting invalidations on every change\n    builder.getBuilder().setOptionalInt32(30);\n    assertEquals(1, mockParent.getInvalidationCount());\n\n  }\n\n  public void testSetMessage() {\n    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();\n    SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n        TestAllTypesOrBuilder> builder =\n        new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n            TestAllTypesOrBuilder>(\n            TestAllTypes.getDefaultInstance(),\n            mockParent,\n            false);\n    builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build());\n    assertEquals(0, builder.getMessage().getOptionalInt32());\n\n    // Update message using the builder\n    builder.getBuilder().setOptionalInt32(1);\n    assertEquals(0, mockParent.getInvalidationCount());\n    assertEquals(1, builder.getBuilder().getOptionalInt32());\n    assertEquals(1, builder.getMessage().getOptionalInt32());\n    builder.build();\n    builder.getBuilder().setOptionalInt32(2);\n    assertEquals(2, builder.getBuilder().getOptionalInt32());\n    assertEquals(2, builder.getMessage().getOptionalInt32());\n\n    // Make sure message stays cached\n    assertSame(builder.getMessage(), builder.getMessage());\n  }\n\n  public void testClear() {\n    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();\n    SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n        TestAllTypesOrBuilder> builder =\n        new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n            TestAllTypesOrBuilder>(\n            TestAllTypes.getDefaultInstance(),\n            mockParent,\n            false);\n    builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build());\n    assertNotSame(TestAllTypes.getDefaultInstance(), builder.getMessage());\n    builder.clear();\n    assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage());\n\n    builder.getBuilder().setOptionalInt32(1);\n    assertNotSame(TestAllTypes.getDefaultInstance(), builder.getMessage());\n    builder.clear();\n    assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage());\n  }\n\n  public void testMerge() {\n    TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent();\n    SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n        TestAllTypesOrBuilder> builder =\n        new SingleFieldBuilder<TestAllTypes, TestAllTypes.Builder,\n            TestAllTypesOrBuilder>(\n            TestAllTypes.getDefaultInstance(),\n            mockParent,\n            false);\n\n    // Merge into default field.\n    builder.mergeFrom(TestAllTypes.getDefaultInstance());\n    assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage());\n\n    // Merge into non-default field on existing builder.\n    builder.getBuilder().setOptionalInt32(2);\n    builder.mergeFrom(TestAllTypes.newBuilder()\n        .setOptionalDouble(4.0)\n        .buildPartial());\n    assertEquals(2, builder.getMessage().getOptionalInt32());\n    assertEquals(4.0, builder.getMessage().getOptionalDouble());\n\n    // Merge into non-default field on existing message\n    builder.setMessage(TestAllTypes.newBuilder()\n        .setOptionalInt32(10)\n        .buildPartial());\n    builder.mergeFrom(TestAllTypes.newBuilder()\n        .setOptionalDouble(5.0)\n        .buildPartial());\n    assertEquals(10, builder.getMessage().getOptionalInt32());\n    assertEquals(5.0, builder.getMessage().getOptionalDouble());\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport junit.framework.TestCase;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.Iterator;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Set;\nimport java.util.TreeSet;\n\n/**\n * @author darick@google.com Darick Tong\n */\npublic class SmallSortedMapTest extends TestCase {\n  // java.util.AbstractMap.SimpleEntry is private in JDK 1.5. We re-implement it\n  // here for JDK 1.5 users.\n  private static class SimpleEntry<K, V> implements Map.Entry<K, V> {\n    private final K key;\n    private V value;\n\n    SimpleEntry(K key, V value) {\n      this.key = key;\n      this.value = value;\n    }\n\n    public K getKey() {\n      return key;\n    }\n\n    public V getValue() {\n      return value;\n    }\n\n    public V setValue(V value) {\n      V oldValue = this.value;\n      this.value = value;\n      return oldValue;\n    }\n\n    private static boolean eq(Object o1, Object o2) {\n      return o1 == null ? o2 == null : o1.equals(o2);\n    }\n\n    @Override\n    public boolean equals(Object o) {\n      if (!(o instanceof Map.Entry))\n        return false;\n      Map.Entry e = (Map.Entry) o;\n      return eq(key, e.getKey()) && eq(value, e.getValue());\n    }\n\n    @Override\n    public int hashCode() {\n      return ((key == null) ? 0 : key.hashCode()) ^\n          ((value == null) ? 0 : value.hashCode());\n    }\n  }\n\n  public void testPutAndGetArrayEntriesOnly() {\n    runPutAndGetTest(3);\n  }\n\n  public void testPutAndGetOverflowEntries() {\n    runPutAndGetTest(6);\n  }\n\n  private void runPutAndGetTest(int numElements) {\n    // Test with even and odd arraySize\n    SmallSortedMap<Integer, Integer> map1 =\n        SmallSortedMap.newInstanceForTest(3);\n    SmallSortedMap<Integer, Integer> map2 =\n        SmallSortedMap.newInstanceForTest(4);\n    SmallSortedMap<Integer, Integer> map3 =\n        SmallSortedMap.newInstanceForTest(3);\n    SmallSortedMap<Integer, Integer> map4 =\n        SmallSortedMap.newInstanceForTest(4);\n\n    // Test with puts in ascending order.\n    for (int i = 0; i < numElements; i++) {\n      assertNull(map1.put(i, i + 1));\n      assertNull(map2.put(i, i + 1));\n    }\n    // Test with puts in descending order.\n    for (int i = numElements - 1; i >= 0; i--) {\n      assertNull(map3.put(i, i + 1));\n      assertNull(map4.put(i, i + 1));\n    }\n\n    assertEquals(Math.min(3, numElements), map1.getNumArrayEntries());\n    assertEquals(Math.min(4, numElements), map2.getNumArrayEntries());\n    assertEquals(Math.min(3, numElements), map3.getNumArrayEntries());\n    assertEquals(Math.min(4, numElements), map4.getNumArrayEntries());\n\n    List<SmallSortedMap<Integer, Integer>> allMaps =\n        new ArrayList<SmallSortedMap<Integer, Integer>>();\n    allMaps.add(map1);\n    allMaps.add(map2);\n    allMaps.add(map3);\n    allMaps.add(map4);\n\n    for (SmallSortedMap<Integer, Integer> map : allMaps) {\n      assertEquals(numElements, map.size());\n      for (int i = 0; i < numElements; i++) {\n        assertEquals(new Integer(i + 1), map.get(i));\n      }\n    }\n\n    assertEquals(map1, map2);\n    assertEquals(map2, map3);\n    assertEquals(map3, map4);\n  }\n\n  public void testReplacingPut() {\n    SmallSortedMap<Integer, Integer> map = SmallSortedMap.newInstanceForTest(3);\n    for (int i = 0; i < 6; i++) {\n      assertNull(map.put(i, i + 1));\n      assertNull(map.remove(i + 1));\n    }\n    for (int i = 0; i < 6; i++) {\n      assertEquals(new Integer(i + 1), map.put(i, i + 2));\n    }\n  }\n\n  public void testRemove() {\n    SmallSortedMap<Integer, Integer> map = SmallSortedMap.newInstanceForTest(3);\n    for (int i = 0; i < 6; i++) {\n      assertNull(map.put(i, i + 1));\n      assertNull(map.remove(i + 1));\n    }\n\n    assertEquals(3, map.getNumArrayEntries());\n    assertEquals(3, map.getNumOverflowEntries());\n    assertEquals(6,  map.size());\n    assertEquals(makeSortedKeySet(0, 1, 2, 3, 4, 5), map.keySet());\n\n    assertEquals(new Integer(2), map.remove(1));\n    assertEquals(3, map.getNumArrayEntries());\n    assertEquals(2, map.getNumOverflowEntries());\n    assertEquals(5,  map.size());\n    assertEquals(makeSortedKeySet(0, 2, 3, 4, 5), map.keySet());\n\n    assertEquals(new Integer(5), map.remove(4));\n    assertEquals(3, map.getNumArrayEntries());\n    assertEquals(1, map.getNumOverflowEntries());\n    assertEquals(4,  map.size());\n    assertEquals(makeSortedKeySet(0, 2, 3, 5), map.keySet());\n\n    assertEquals(new Integer(4), map.remove(3));\n    assertEquals(3, map.getNumArrayEntries());\n    assertEquals(0, map.getNumOverflowEntries());\n    assertEquals(3, map.size());\n    assertEquals(makeSortedKeySet(0, 2, 5), map.keySet());\n\n    assertNull(map.remove(3));\n    assertEquals(3, map.getNumArrayEntries());\n    assertEquals(0, map.getNumOverflowEntries());\n    assertEquals(3, map.size());\n\n    assertEquals(new Integer(1), map.remove(0));\n    assertEquals(2, map.getNumArrayEntries());\n    assertEquals(0, map.getNumOverflowEntries());\n    assertEquals(2, map.size());\n  }\n\n  public void testClear() {\n    SmallSortedMap<Integer, Integer> map = SmallSortedMap.newInstanceForTest(3);\n    for (int i = 0; i < 6; i++) {\n      assertNull(map.put(i, i + 1));\n    }\n    map.clear();\n    assertEquals(0, map.getNumArrayEntries());\n    assertEquals(0, map.getNumOverflowEntries());\n    assertEquals(0, map.size());\n  }\n\n  public void testGetArrayEntryAndOverflowEntries() {\n    SmallSortedMap<Integer, Integer> map = SmallSortedMap.newInstanceForTest(3);\n    for (int i = 0; i < 6; i++) {\n      assertNull(map.put(i, i + 1));\n    }\n    assertEquals(3, map.getNumArrayEntries());\n    for (int i = 0; i < 3; i++) {\n      Map.Entry<Integer, Integer> entry = map.getArrayEntryAt(i);\n      assertEquals(new Integer(i), entry.getKey());\n      assertEquals(new Integer(i + 1), entry.getValue());\n    }\n    Iterator<Map.Entry<Integer, Integer>> it =\n        map.getOverflowEntries().iterator();\n    for (int i = 3; i < 6; i++) {\n      assertTrue(it.hasNext());\n      Map.Entry<Integer, Integer> entry = it.next();\n      assertEquals(new Integer(i), entry.getKey());\n      assertEquals(new Integer(i + 1), entry.getValue());\n    }\n    assertFalse(it.hasNext());\n  }\n\n  public void testEntrySetContains() {\n    SmallSortedMap<Integer, Integer> map = SmallSortedMap.newInstanceForTest(3);\n    for (int i = 0; i < 6; i++) {\n      assertNull(map.put(i, i + 1));\n    }\n    Set<Map.Entry<Integer, Integer>> entrySet = map.entrySet();\n    for (int i = 0; i < 6; i++) {\n      assertTrue(\n          entrySet.contains(new SimpleEntry<Integer, Integer>(i, i + 1)));\n      assertFalse(\n          entrySet.contains(new SimpleEntry<Integer, Integer>(i, i)));\n    }\n  }\n\n  public void testEntrySetAdd() {\n    SmallSortedMap<Integer, Integer> map = SmallSortedMap.newInstanceForTest(3);\n    Set<Map.Entry<Integer, Integer>> entrySet = map.entrySet();\n    for (int i = 0; i < 6; i++) {\n      Map.Entry<Integer, Integer> entry =\n          new SimpleEntry<Integer, Integer>(i, i + 1);\n      assertTrue(entrySet.add(entry));\n      assertFalse(entrySet.add(entry));\n    }\n    for (int i = 0; i < 6; i++) {\n      assertEquals(new Integer(i + 1), map.get(i));\n    }\n    assertEquals(3, map.getNumArrayEntries());\n    assertEquals(3, map.getNumOverflowEntries());\n    assertEquals(6, map.size());\n  }\n\n  public void testEntrySetRemove() {\n    SmallSortedMap<Integer, Integer> map = SmallSortedMap.newInstanceForTest(3);\n    Set<Map.Entry<Integer, Integer>> entrySet = map.entrySet();\n    for (int i = 0; i < 6; i++) {\n      assertNull(map.put(i, i + 1));\n    }\n    for (int i = 0; i < 6; i++) {\n      Map.Entry<Integer, Integer> entry =\n          new SimpleEntry<Integer, Integer>(i, i + 1);\n      assertTrue(entrySet.remove(entry));\n      assertFalse(entrySet.remove(entry));\n    }\n    assertTrue(map.isEmpty());\n    assertEquals(0, map.getNumArrayEntries());\n    assertEquals(0, map.getNumOverflowEntries());\n    assertEquals(0, map.size());\n  }\n\n  public void testEntrySetClear() {\n    SmallSortedMap<Integer, Integer> map = SmallSortedMap.newInstanceForTest(3);\n    for (int i = 0; i < 6; i++) {\n      assertNull(map.put(i, i + 1));\n    }\n    map.entrySet().clear();\n    assertTrue(map.isEmpty());\n    assertEquals(0, map.getNumArrayEntries());\n    assertEquals(0, map.getNumOverflowEntries());\n    assertEquals(0, map.size());\n  }\n\n  public void testEntrySetIteratorNext() {\n    SmallSortedMap<Integer, Integer> map = SmallSortedMap.newInstanceForTest(3);\n    for (int i = 0; i < 6; i++) {\n      assertNull(map.put(i, i + 1));\n    }\n    Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();\n    for (int i = 0; i < 6; i++) {\n      assertTrue(it.hasNext());\n      Map.Entry<Integer, Integer> entry = it.next();\n      assertEquals(new Integer(i), entry.getKey());\n      assertEquals(new Integer(i + 1), entry.getValue());\n    }\n    assertFalse(it.hasNext());\n  }\n\n  public void testEntrySetIteratorRemove() {\n    SmallSortedMap<Integer, Integer> map = SmallSortedMap.newInstanceForTest(3);\n    for (int i = 0; i < 6; i++) {\n      assertNull(map.put(i, i + 1));\n    }\n    Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();\n    for (int i = 0; i < 6; i++) {\n      assertTrue(map.containsKey(i));\n      it.next();\n      it.remove();\n      assertFalse(map.containsKey(i));\n      assertEquals(6 - i - 1, map.size());\n    }\n  }\n\n  public void testMapEntryModification() {\n    SmallSortedMap<Integer, Integer> map = SmallSortedMap.newInstanceForTest(3);\n    for (int i = 0; i < 6; i++) {\n      assertNull(map.put(i, i + 1));\n    }\n    Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();\n    for (int i = 0; i < 6; i++) {\n      Map.Entry<Integer, Integer> entry = it.next();\n      entry.setValue(i + 23);\n    }\n    for (int i = 0; i < 6; i++) {\n      assertEquals(new Integer(i + 23), map.get(i));\n    }\n  }\n\n  public void testMakeImmutable() {\n    SmallSortedMap<Integer, Integer> map = SmallSortedMap.newInstanceForTest(3);\n    for (int i = 0; i < 6; i++) {\n      assertNull(map.put(i, i + 1));\n    }\n    map.makeImmutable();\n    assertEquals(new Integer(1), map.get(0));\n    assertEquals(6, map.size());\n\n    try {\n      map.put(23, 23);\n      fail(\"Expected UnsupportedOperationException\");\n    } catch (UnsupportedOperationException expected) {\n    }\n\n    Map<Integer, Integer> other = new HashMap<Integer, Integer>();\n    other.put(23, 23);\n    try {\n      map.putAll(other);\n      fail(\"Expected UnsupportedOperationException\");\n    } catch (UnsupportedOperationException expected) {\n    }\n\n    try {\n      map.remove(0);\n      fail(\"Expected UnsupportedOperationException\");\n    } catch (UnsupportedOperationException expected) {\n    }\n\n    try {\n      map.clear();\n      fail(\"Expected UnsupportedOperationException\");\n    } catch (UnsupportedOperationException expected) {\n    }\n\n    Set<Map.Entry<Integer, Integer>> entrySet = map.entrySet();\n    try {\n      entrySet.clear();\n      fail(\"Expected UnsupportedOperationException\");\n    } catch (UnsupportedOperationException expected) {\n    }\n\n    Iterator<Map.Entry<Integer, Integer>> it = entrySet.iterator();\n    while (it.hasNext()) {\n      Map.Entry<Integer, Integer> entry = it.next();\n      try {\n        entry.setValue(0);\n        fail(\"Expected UnsupportedOperationException\");\n      } catch (UnsupportedOperationException expected) {\n      }\n      try {\n        it.remove();\n        fail(\"Expected UnsupportedOperationException\");\n      } catch (UnsupportedOperationException expected) {\n      }\n    }\n\n    Set<Integer> keySet = map.keySet();\n    try {\n      keySet.clear();\n      fail(\"Expected UnsupportedOperationException\");\n    } catch (UnsupportedOperationException expected) {\n    }\n\n    Iterator<Integer> keys = keySet.iterator();\n    while (keys.hasNext()) {\n      Integer key = keys.next();\n      try {\n        keySet.remove(key);\n        fail(\"Expected UnsupportedOperationException\");\n      } catch (UnsupportedOperationException expected) {\n      }\n      try {\n        keys.remove();\n        fail(\"Expected UnsupportedOperationException\");\n      } catch (UnsupportedOperationException expected) {\n      }\n    }\n  }\n\n  private Set<Integer> makeSortedKeySet(Integer... keys) {\n    return new TreeSet<Integer>(Arrays.<Integer>asList(keys));\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport junit.framework.TestCase;\n\n/**\n * Tests that proto2 api generation doesn't cause compile errors when\n * compiling protocol buffers that have names that would otherwise conflict\n * if not fully qualified (like @Deprecated and @Override). \n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic class TestBadIdentifiers extends TestCase {\n\n  public void testCompilation() {\n    // If this compiles, it means the generation was correct.\n    TestBadIdentifiersProto.Deprecated.newBuilder();\n    TestBadIdentifiersProto.Override.newBuilder();\n  } \n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport protobuf_unittest.UnittestProto;\nimport com.google.protobuf.UnittestLite;\n\n// The static imports are to avoid 100+ char lines.  The following is roughly equivalent to\n// import static protobuf_unittest.UnittestProto.*;\nimport static protobuf_unittest.UnittestProto.defaultInt32Extension;\nimport static protobuf_unittest.UnittestProto.defaultInt64Extension;\nimport static protobuf_unittest.UnittestProto.defaultUint32Extension;\nimport static protobuf_unittest.UnittestProto.defaultUint64Extension;\nimport static protobuf_unittest.UnittestProto.defaultSint32Extension;\nimport static protobuf_unittest.UnittestProto.defaultSint64Extension;\nimport static protobuf_unittest.UnittestProto.defaultFixed32Extension;\nimport static protobuf_unittest.UnittestProto.defaultFixed64Extension;\nimport static protobuf_unittest.UnittestProto.defaultSfixed32Extension;\nimport static protobuf_unittest.UnittestProto.defaultSfixed64Extension;\nimport static protobuf_unittest.UnittestProto.defaultFloatExtension;\nimport static protobuf_unittest.UnittestProto.defaultDoubleExtension;\nimport static protobuf_unittest.UnittestProto.defaultBoolExtension;\nimport static protobuf_unittest.UnittestProto.defaultStringExtension;\nimport static protobuf_unittest.UnittestProto.defaultBytesExtension;\nimport static protobuf_unittest.UnittestProto.defaultNestedEnumExtension;\nimport static protobuf_unittest.UnittestProto.defaultForeignEnumExtension;\nimport static protobuf_unittest.UnittestProto.defaultImportEnumExtension;\nimport static protobuf_unittest.UnittestProto.defaultStringPieceExtension;\nimport static protobuf_unittest.UnittestProto.defaultCordExtension;\n\nimport static protobuf_unittest.UnittestProto.optionalInt32Extension;\nimport static protobuf_unittest.UnittestProto.optionalInt64Extension;\nimport static protobuf_unittest.UnittestProto.optionalUint32Extension;\nimport static protobuf_unittest.UnittestProto.optionalUint64Extension;\nimport static protobuf_unittest.UnittestProto.optionalSint32Extension;\nimport static protobuf_unittest.UnittestProto.optionalSint64Extension;\nimport static protobuf_unittest.UnittestProto.optionalFixed32Extension;\nimport static protobuf_unittest.UnittestProto.optionalFixed64Extension;\nimport static protobuf_unittest.UnittestProto.optionalSfixed32Extension;\nimport static protobuf_unittest.UnittestProto.optionalSfixed64Extension;\nimport static protobuf_unittest.UnittestProto.optionalFloatExtension;\nimport static protobuf_unittest.UnittestProto.optionalDoubleExtension;\nimport static protobuf_unittest.UnittestProto.optionalBoolExtension;\nimport static protobuf_unittest.UnittestProto.optionalStringExtension;\nimport static protobuf_unittest.UnittestProto.optionalBytesExtension;\nimport static protobuf_unittest.UnittestProto.optionalGroupExtension;\nimport static protobuf_unittest.UnittestProto.optionalNestedMessageExtension;\nimport static protobuf_unittest.UnittestProto.optionalForeignMessageExtension;\nimport static protobuf_unittest.UnittestProto.optionalImportMessageExtension;\nimport static protobuf_unittest.UnittestProto.optionalNestedEnumExtension;\nimport static protobuf_unittest.UnittestProto.optionalForeignEnumExtension;\nimport static protobuf_unittest.UnittestProto.optionalImportEnumExtension;\nimport static protobuf_unittest.UnittestProto.optionalStringPieceExtension;\nimport static protobuf_unittest.UnittestProto.optionalCordExtension;\n\nimport static protobuf_unittest.UnittestProto.repeatedInt32Extension;\nimport static protobuf_unittest.UnittestProto.repeatedInt64Extension;\nimport static protobuf_unittest.UnittestProto.repeatedUint32Extension;\nimport static protobuf_unittest.UnittestProto.repeatedUint64Extension;\nimport static protobuf_unittest.UnittestProto.repeatedSint32Extension;\nimport static protobuf_unittest.UnittestProto.repeatedSint64Extension;\nimport static protobuf_unittest.UnittestProto.repeatedFixed32Extension;\nimport static protobuf_unittest.UnittestProto.repeatedFixed64Extension;\nimport static protobuf_unittest.UnittestProto.repeatedSfixed32Extension;\nimport static protobuf_unittest.UnittestProto.repeatedSfixed64Extension;\nimport static protobuf_unittest.UnittestProto.repeatedFloatExtension;\nimport static protobuf_unittest.UnittestProto.repeatedDoubleExtension;\nimport static protobuf_unittest.UnittestProto.repeatedBoolExtension;\nimport static protobuf_unittest.UnittestProto.repeatedStringExtension;\nimport static protobuf_unittest.UnittestProto.repeatedBytesExtension;\nimport static protobuf_unittest.UnittestProto.repeatedGroupExtension;\nimport static protobuf_unittest.UnittestProto.repeatedNestedMessageExtension;\nimport static protobuf_unittest.UnittestProto.repeatedForeignMessageExtension;\nimport static protobuf_unittest.UnittestProto.repeatedImportMessageExtension;\nimport static protobuf_unittest.UnittestProto.repeatedNestedEnumExtension;\nimport static protobuf_unittest.UnittestProto.repeatedForeignEnumExtension;\nimport static protobuf_unittest.UnittestProto.repeatedImportEnumExtension;\nimport static protobuf_unittest.UnittestProto.repeatedStringPieceExtension;\nimport static protobuf_unittest.UnittestProto.repeatedCordExtension;\n\nimport static protobuf_unittest.UnittestProto.OptionalGroup_extension;\nimport static protobuf_unittest.UnittestProto.RepeatedGroup_extension;\n\nimport static protobuf_unittest.UnittestProto.packedInt32Extension;\nimport static protobuf_unittest.UnittestProto.packedInt64Extension;\nimport static protobuf_unittest.UnittestProto.packedUint32Extension;\nimport static protobuf_unittest.UnittestProto.packedUint64Extension;\nimport static protobuf_unittest.UnittestProto.packedSint32Extension;\nimport static protobuf_unittest.UnittestProto.packedSint64Extension;\nimport static protobuf_unittest.UnittestProto.packedFixed32Extension;\nimport static protobuf_unittest.UnittestProto.packedFixed64Extension;\nimport static protobuf_unittest.UnittestProto.packedSfixed32Extension;\nimport static protobuf_unittest.UnittestProto.packedSfixed64Extension;\nimport static protobuf_unittest.UnittestProto.packedFloatExtension;\nimport static protobuf_unittest.UnittestProto.packedDoubleExtension;\nimport static protobuf_unittest.UnittestProto.packedBoolExtension;\nimport static protobuf_unittest.UnittestProto.packedEnumExtension;\n\nimport static com.google.protobuf.UnittestLite.defaultInt32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultInt64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultUint32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultUint64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultSint32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultSint64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultFixed32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultFixed64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultSfixed32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultSfixed64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultFloatExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultDoubleExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultBoolExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultStringExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultBytesExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultNestedEnumExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultForeignEnumExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultImportEnumExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultStringPieceExtensionLite;\nimport static com.google.protobuf.UnittestLite.defaultCordExtensionLite;\n\nimport static com.google.protobuf.UnittestLite.optionalInt32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalInt64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalUint32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalUint64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalSint32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalSint64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalFixed32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalFixed64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalSfixed32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalSfixed64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalFloatExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalDoubleExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalBoolExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalStringExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalBytesExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalGroupExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalNestedMessageExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalForeignMessageExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalImportMessageExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalNestedEnumExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalForeignEnumExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalImportEnumExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalStringPieceExtensionLite;\nimport static com.google.protobuf.UnittestLite.optionalCordExtensionLite;\n\nimport static com.google.protobuf.UnittestLite.repeatedInt32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedInt64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedUint32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedUint64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedSint32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedSint64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedFixed32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedFixed64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedSfixed32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedSfixed64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedFloatExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedDoubleExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedBoolExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedStringExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedBytesExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedGroupExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedNestedMessageExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedForeignMessageExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedImportMessageExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedNestedEnumExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedForeignEnumExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedImportEnumExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedStringPieceExtensionLite;\nimport static com.google.protobuf.UnittestLite.repeatedCordExtensionLite;\n\nimport static com.google.protobuf.UnittestLite.OptionalGroup_extension_lite;\nimport static com.google.protobuf.UnittestLite.RepeatedGroup_extension_lite;\n\nimport static com.google.protobuf.UnittestLite.packedInt32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.packedInt64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.packedUint32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.packedUint64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.packedSint32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.packedSint64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.packedFixed32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.packedFixed64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.packedSfixed32ExtensionLite;\nimport static com.google.protobuf.UnittestLite.packedSfixed64ExtensionLite;\nimport static com.google.protobuf.UnittestLite.packedFloatExtensionLite;\nimport static com.google.protobuf.UnittestLite.packedDoubleExtensionLite;\nimport static com.google.protobuf.UnittestLite.packedBoolExtensionLite;\nimport static com.google.protobuf.UnittestLite.packedEnumExtensionLite;\n\nimport protobuf_unittest.UnittestProto.TestAllExtensions;\nimport protobuf_unittest.UnittestProto.TestAllExtensionsOrBuilder;\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestAllTypesOrBuilder;\nimport protobuf_unittest.UnittestProto.TestPackedExtensions;\nimport protobuf_unittest.UnittestProto.TestPackedTypes;\nimport protobuf_unittest.UnittestProto.TestUnpackedTypes;\nimport protobuf_unittest.UnittestProto.ForeignMessage;\nimport protobuf_unittest.UnittestProto.ForeignEnum;\nimport com.google.protobuf.test.UnittestImport.ImportMessage;\nimport com.google.protobuf.test.UnittestImport.ImportEnum;\n\nimport com.google.protobuf.UnittestLite.TestAllTypesLite;\nimport com.google.protobuf.UnittestLite.TestAllExtensionsLite;\nimport com.google.protobuf.UnittestLite.TestAllExtensionsLiteOrBuilder;\nimport com.google.protobuf.UnittestLite.TestPackedExtensionsLite;\nimport com.google.protobuf.UnittestLite.ForeignMessageLite;\nimport com.google.protobuf.UnittestLite.ForeignEnumLite;\nimport com.google.protobuf.UnittestImportLite.ImportMessageLite;\nimport com.google.protobuf.UnittestImportLite.ImportEnumLite;\n\nimport junit.framework.Assert;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.RandomAccessFile;\n\n/**\n * Contains methods for setting all fields of {@code TestAllTypes} to\n * some vaules as well as checking that all the fields are set to those values.\n * These are useful for testing various protocol message features, e.g.\n * set all fields of a message, serialize it, parse it, and check that all\n * fields are set.\n *\n * <p>This code is not to be used outside of {@code com.google.protobuf} and\n * subpackages.\n *\n * @author kenton@google.com Kenton Varda\n */\npublic final class TestUtil {\n  private TestUtil() {}\n\n  /** Helper to convert a String to ByteString. */\n  static ByteString toBytes(String str) {\n    try {\n      return ByteString.copyFrom(str.getBytes(\"UTF-8\"));\n    } catch(java.io.UnsupportedEncodingException e) {\n      throw new RuntimeException(\"UTF-8 not supported.\", e);\n    }\n  }\n\n  /**\n   * Get a {@code TestAllTypes} with all fields set as they would be by\n   * {@link #setAllFields(TestAllTypes.Builder)}.\n   */\n  public static TestAllTypes getAllSet() {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    setAllFields(builder);\n    return builder.build();\n  }\n\n  /**\n   * Get a {@code TestAllExtensions} with all fields set as they would be by\n   * {@link #setAllExtensions(TestAllExtensions.Builder)}.\n   */\n  public static TestAllExtensions getAllExtensionsSet() {\n    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();\n    setAllExtensions(builder);\n    return builder.build();\n  }\n\n  public static TestAllExtensionsLite getAllLiteExtensionsSet() {\n    TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder();\n    setAllExtensions(builder);\n    return builder.build();\n  }\n\n  public static TestPackedTypes getPackedSet() {\n    TestPackedTypes.Builder builder = TestPackedTypes.newBuilder();\n    setPackedFields(builder);\n    return builder.build();\n  }\n\n  public static TestUnpackedTypes getUnpackedSet() {\n    TestUnpackedTypes.Builder builder = TestUnpackedTypes.newBuilder();\n    setUnpackedFields(builder);\n    return builder.build();\n  }\n\n  public static TestPackedExtensions getPackedExtensionsSet() {\n    TestPackedExtensions.Builder builder = TestPackedExtensions.newBuilder();\n    setPackedExtensions(builder);\n    return builder.build();\n  }\n\n  public static TestPackedExtensionsLite getLitePackedExtensionsSet() {\n    TestPackedExtensionsLite.Builder builder =\n        TestPackedExtensionsLite.newBuilder();\n    setPackedExtensions(builder);\n    return builder.build();\n  }\n\n  /**\n   * Set every field of {@code message} to the values expected by\n   * {@code assertAllFieldsSet()}.\n   */\n  public static void setAllFields(TestAllTypes.Builder message) {\n    message.setOptionalInt32   (101);\n    message.setOptionalInt64   (102);\n    message.setOptionalUint32  (103);\n    message.setOptionalUint64  (104);\n    message.setOptionalSint32  (105);\n    message.setOptionalSint64  (106);\n    message.setOptionalFixed32 (107);\n    message.setOptionalFixed64 (108);\n    message.setOptionalSfixed32(109);\n    message.setOptionalSfixed64(110);\n    message.setOptionalFloat   (111);\n    message.setOptionalDouble  (112);\n    message.setOptionalBool    (true);\n    message.setOptionalString  (\"115\");\n    message.setOptionalBytes   (toBytes(\"116\"));\n\n    message.setOptionalGroup(\n      TestAllTypes.OptionalGroup.newBuilder().setA(117).build());\n    message.setOptionalNestedMessage(\n      TestAllTypes.NestedMessage.newBuilder().setBb(118).build());\n    message.setOptionalForeignMessage(\n      ForeignMessage.newBuilder().setC(119).build());\n    message.setOptionalImportMessage(\n      ImportMessage.newBuilder().setD(120).build());\n\n    message.setOptionalNestedEnum (TestAllTypes.NestedEnum.BAZ);\n    message.setOptionalForeignEnum(ForeignEnum.FOREIGN_BAZ);\n    message.setOptionalImportEnum (ImportEnum.IMPORT_BAZ);\n\n    message.setOptionalStringPiece(\"124\");\n    message.setOptionalCord(\"125\");\n\n    // -----------------------------------------------------------------\n\n    message.addRepeatedInt32   (201);\n    message.addRepeatedInt64   (202);\n    message.addRepeatedUint32  (203);\n    message.addRepeatedUint64  (204);\n    message.addRepeatedSint32  (205);\n    message.addRepeatedSint64  (206);\n    message.addRepeatedFixed32 (207);\n    message.addRepeatedFixed64 (208);\n    message.addRepeatedSfixed32(209);\n    message.addRepeatedSfixed64(210);\n    message.addRepeatedFloat   (211);\n    message.addRepeatedDouble  (212);\n    message.addRepeatedBool    (true);\n    message.addRepeatedString  (\"215\");\n    message.addRepeatedBytes   (toBytes(\"216\"));\n\n    message.addRepeatedGroup(\n      TestAllTypes.RepeatedGroup.newBuilder().setA(217).build());\n    message.addRepeatedNestedMessage(\n      TestAllTypes.NestedMessage.newBuilder().setBb(218).build());\n    message.addRepeatedForeignMessage(\n      ForeignMessage.newBuilder().setC(219).build());\n    message.addRepeatedImportMessage(\n      ImportMessage.newBuilder().setD(220).build());\n\n    message.addRepeatedNestedEnum (TestAllTypes.NestedEnum.BAR);\n    message.addRepeatedForeignEnum(ForeignEnum.FOREIGN_BAR);\n    message.addRepeatedImportEnum (ImportEnum.IMPORT_BAR);\n\n    message.addRepeatedStringPiece(\"224\");\n    message.addRepeatedCord(\"225\");\n\n    // Add a second one of each field.\n    message.addRepeatedInt32   (301);\n    message.addRepeatedInt64   (302);\n    message.addRepeatedUint32  (303);\n    message.addRepeatedUint64  (304);\n    message.addRepeatedSint32  (305);\n    message.addRepeatedSint64  (306);\n    message.addRepeatedFixed32 (307);\n    message.addRepeatedFixed64 (308);\n    message.addRepeatedSfixed32(309);\n    message.addRepeatedSfixed64(310);\n    message.addRepeatedFloat   (311);\n    message.addRepeatedDouble  (312);\n    message.addRepeatedBool    (false);\n    message.addRepeatedString  (\"315\");\n    message.addRepeatedBytes   (toBytes(\"316\"));\n\n    message.addRepeatedGroup(\n      TestAllTypes.RepeatedGroup.newBuilder().setA(317).build());\n    message.addRepeatedNestedMessage(\n      TestAllTypes.NestedMessage.newBuilder().setBb(318).build());\n    message.addRepeatedForeignMessage(\n      ForeignMessage.newBuilder().setC(319).build());\n    message.addRepeatedImportMessage(\n      ImportMessage.newBuilder().setD(320).build());\n\n    message.addRepeatedNestedEnum (TestAllTypes.NestedEnum.BAZ);\n    message.addRepeatedForeignEnum(ForeignEnum.FOREIGN_BAZ);\n    message.addRepeatedImportEnum (ImportEnum.IMPORT_BAZ);\n\n    message.addRepeatedStringPiece(\"324\");\n    message.addRepeatedCord(\"325\");\n\n    // -----------------------------------------------------------------\n\n    message.setDefaultInt32   (401);\n    message.setDefaultInt64   (402);\n    message.setDefaultUint32  (403);\n    message.setDefaultUint64  (404);\n    message.setDefaultSint32  (405);\n    message.setDefaultSint64  (406);\n    message.setDefaultFixed32 (407);\n    message.setDefaultFixed64 (408);\n    message.setDefaultSfixed32(409);\n    message.setDefaultSfixed64(410);\n    message.setDefaultFloat   (411);\n    message.setDefaultDouble  (412);\n    message.setDefaultBool    (false);\n    message.setDefaultString  (\"415\");\n    message.setDefaultBytes   (toBytes(\"416\"));\n\n    message.setDefaultNestedEnum (TestAllTypes.NestedEnum.FOO);\n    message.setDefaultForeignEnum(ForeignEnum.FOREIGN_FOO);\n    message.setDefaultImportEnum (ImportEnum.IMPORT_FOO);\n\n    message.setDefaultStringPiece(\"424\");\n    message.setDefaultCord(\"425\");\n  }\n\n  // -------------------------------------------------------------------\n\n  /**\n   * Modify the repeated fields of {@code message} to contain the values\n   * expected by {@code assertRepeatedFieldsModified()}.\n   */\n  public static void modifyRepeatedFields(TestAllTypes.Builder message) {\n    message.setRepeatedInt32   (1, 501);\n    message.setRepeatedInt64   (1, 502);\n    message.setRepeatedUint32  (1, 503);\n    message.setRepeatedUint64  (1, 504);\n    message.setRepeatedSint32  (1, 505);\n    message.setRepeatedSint64  (1, 506);\n    message.setRepeatedFixed32 (1, 507);\n    message.setRepeatedFixed64 (1, 508);\n    message.setRepeatedSfixed32(1, 509);\n    message.setRepeatedSfixed64(1, 510);\n    message.setRepeatedFloat   (1, 511);\n    message.setRepeatedDouble  (1, 512);\n    message.setRepeatedBool    (1, true);\n    message.setRepeatedString  (1, \"515\");\n    message.setRepeatedBytes   (1, toBytes(\"516\"));\n\n    message.setRepeatedGroup(1,\n      TestAllTypes.RepeatedGroup.newBuilder().setA(517).build());\n    message.setRepeatedNestedMessage(1,\n      TestAllTypes.NestedMessage.newBuilder().setBb(518).build());\n    message.setRepeatedForeignMessage(1,\n      ForeignMessage.newBuilder().setC(519).build());\n    message.setRepeatedImportMessage(1,\n      ImportMessage.newBuilder().setD(520).build());\n\n    message.setRepeatedNestedEnum (1, TestAllTypes.NestedEnum.FOO);\n    message.setRepeatedForeignEnum(1, ForeignEnum.FOREIGN_FOO);\n    message.setRepeatedImportEnum (1, ImportEnum.IMPORT_FOO);\n\n    message.setRepeatedStringPiece(1, \"524\");\n    message.setRepeatedCord(1, \"525\");\n  }\n\n  // -------------------------------------------------------------------\n\n  /**\n   * Assert (using {@code junit.framework.Assert}} that all fields of\n   * {@code message} are set to the values assigned by {@code setAllFields}.\n   */\n  public static void assertAllFieldsSet(TestAllTypesOrBuilder message) {\n    Assert.assertTrue(message.hasOptionalInt32   ());\n    Assert.assertTrue(message.hasOptionalInt64   ());\n    Assert.assertTrue(message.hasOptionalUint32  ());\n    Assert.assertTrue(message.hasOptionalUint64  ());\n    Assert.assertTrue(message.hasOptionalSint32  ());\n    Assert.assertTrue(message.hasOptionalSint64  ());\n    Assert.assertTrue(message.hasOptionalFixed32 ());\n    Assert.assertTrue(message.hasOptionalFixed64 ());\n    Assert.assertTrue(message.hasOptionalSfixed32());\n    Assert.assertTrue(message.hasOptionalSfixed64());\n    Assert.assertTrue(message.hasOptionalFloat   ());\n    Assert.assertTrue(message.hasOptionalDouble  ());\n    Assert.assertTrue(message.hasOptionalBool    ());\n    Assert.assertTrue(message.hasOptionalString  ());\n    Assert.assertTrue(message.hasOptionalBytes   ());\n\n    Assert.assertTrue(message.hasOptionalGroup         ());\n    Assert.assertTrue(message.hasOptionalNestedMessage ());\n    Assert.assertTrue(message.hasOptionalForeignMessage());\n    Assert.assertTrue(message.hasOptionalImportMessage ());\n\n    Assert.assertTrue(message.getOptionalGroup         ().hasA());\n    Assert.assertTrue(message.getOptionalNestedMessage ().hasBb());\n    Assert.assertTrue(message.getOptionalForeignMessage().hasC());\n    Assert.assertTrue(message.getOptionalImportMessage ().hasD());\n\n    Assert.assertTrue(message.hasOptionalNestedEnum ());\n    Assert.assertTrue(message.hasOptionalForeignEnum());\n    Assert.assertTrue(message.hasOptionalImportEnum ());\n\n    Assert.assertTrue(message.hasOptionalStringPiece());\n    Assert.assertTrue(message.hasOptionalCord());\n\n    Assert.assertEquals(101  , message.getOptionalInt32   ());\n    Assert.assertEquals(102  , message.getOptionalInt64   ());\n    Assert.assertEquals(103  , message.getOptionalUint32  ());\n    Assert.assertEquals(104  , message.getOptionalUint64  ());\n    Assert.assertEquals(105  , message.getOptionalSint32  ());\n    Assert.assertEquals(106  , message.getOptionalSint64  ());\n    Assert.assertEquals(107  , message.getOptionalFixed32 ());\n    Assert.assertEquals(108  , message.getOptionalFixed64 ());\n    Assert.assertEquals(109  , message.getOptionalSfixed32());\n    Assert.assertEquals(110  , message.getOptionalSfixed64());\n    Assert.assertEquals(111  , message.getOptionalFloat   (), 0.0);\n    Assert.assertEquals(112  , message.getOptionalDouble  (), 0.0);\n    Assert.assertEquals(true , message.getOptionalBool    ());\n    Assert.assertEquals(\"115\", message.getOptionalString  ());\n    Assert.assertEquals(toBytes(\"116\"), message.getOptionalBytes());\n\n    Assert.assertEquals(117, message.getOptionalGroup         ().getA());\n    Assert.assertEquals(118, message.getOptionalNestedMessage ().getBb());\n    Assert.assertEquals(119, message.getOptionalForeignMessage().getC());\n    Assert.assertEquals(120, message.getOptionalImportMessage ().getD());\n\n    Assert.assertEquals(TestAllTypes.NestedEnum.BAZ, message.getOptionalNestedEnum());\n    Assert.assertEquals(ForeignEnum.FOREIGN_BAZ, message.getOptionalForeignEnum());\n    Assert.assertEquals(ImportEnum.IMPORT_BAZ, message.getOptionalImportEnum());\n\n    Assert.assertEquals(\"124\", message.getOptionalStringPiece());\n    Assert.assertEquals(\"125\", message.getOptionalCord());\n\n    // -----------------------------------------------------------------\n\n    Assert.assertEquals(2, message.getRepeatedInt32Count   ());\n    Assert.assertEquals(2, message.getRepeatedInt64Count   ());\n    Assert.assertEquals(2, message.getRepeatedUint32Count  ());\n    Assert.assertEquals(2, message.getRepeatedUint64Count  ());\n    Assert.assertEquals(2, message.getRepeatedSint32Count  ());\n    Assert.assertEquals(2, message.getRepeatedSint64Count  ());\n    Assert.assertEquals(2, message.getRepeatedFixed32Count ());\n    Assert.assertEquals(2, message.getRepeatedFixed64Count ());\n    Assert.assertEquals(2, message.getRepeatedSfixed32Count());\n    Assert.assertEquals(2, message.getRepeatedSfixed64Count());\n    Assert.assertEquals(2, message.getRepeatedFloatCount   ());\n    Assert.assertEquals(2, message.getRepeatedDoubleCount  ());\n    Assert.assertEquals(2, message.getRepeatedBoolCount    ());\n    Assert.assertEquals(2, message.getRepeatedStringCount  ());\n    Assert.assertEquals(2, message.getRepeatedBytesCount   ());\n\n    Assert.assertEquals(2, message.getRepeatedGroupCount         ());\n    Assert.assertEquals(2, message.getRepeatedNestedMessageCount ());\n    Assert.assertEquals(2, message.getRepeatedForeignMessageCount());\n    Assert.assertEquals(2, message.getRepeatedImportMessageCount ());\n    Assert.assertEquals(2, message.getRepeatedNestedEnumCount    ());\n    Assert.assertEquals(2, message.getRepeatedForeignEnumCount   ());\n    Assert.assertEquals(2, message.getRepeatedImportEnumCount    ());\n\n    Assert.assertEquals(2, message.getRepeatedStringPieceCount());\n    Assert.assertEquals(2, message.getRepeatedCordCount());\n\n    Assert.assertEquals(201  , message.getRepeatedInt32   (0));\n    Assert.assertEquals(202  , message.getRepeatedInt64   (0));\n    Assert.assertEquals(203  , message.getRepeatedUint32  (0));\n    Assert.assertEquals(204  , message.getRepeatedUint64  (0));\n    Assert.assertEquals(205  , message.getRepeatedSint32  (0));\n    Assert.assertEquals(206  , message.getRepeatedSint64  (0));\n    Assert.assertEquals(207  , message.getRepeatedFixed32 (0));\n    Assert.assertEquals(208  , message.getRepeatedFixed64 (0));\n    Assert.assertEquals(209  , message.getRepeatedSfixed32(0));\n    Assert.assertEquals(210  , message.getRepeatedSfixed64(0));\n    Assert.assertEquals(211  , message.getRepeatedFloat   (0), 0.0);\n    Assert.assertEquals(212  , message.getRepeatedDouble  (0), 0.0);\n    Assert.assertEquals(true , message.getRepeatedBool    (0));\n    Assert.assertEquals(\"215\", message.getRepeatedString  (0));\n    Assert.assertEquals(toBytes(\"216\"), message.getRepeatedBytes(0));\n\n    Assert.assertEquals(217, message.getRepeatedGroup         (0).getA());\n    Assert.assertEquals(218, message.getRepeatedNestedMessage (0).getBb());\n    Assert.assertEquals(219, message.getRepeatedForeignMessage(0).getC());\n    Assert.assertEquals(220, message.getRepeatedImportMessage (0).getD());\n\n    Assert.assertEquals(TestAllTypes.NestedEnum.BAR, message.getRepeatedNestedEnum (0));\n    Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getRepeatedForeignEnum(0));\n    Assert.assertEquals(ImportEnum.IMPORT_BAR, message.getRepeatedImportEnum(0));\n\n    Assert.assertEquals(\"224\", message.getRepeatedStringPiece(0));\n    Assert.assertEquals(\"225\", message.getRepeatedCord(0));\n\n    Assert.assertEquals(301  , message.getRepeatedInt32   (1));\n    Assert.assertEquals(302  , message.getRepeatedInt64   (1));\n    Assert.assertEquals(303  , message.getRepeatedUint32  (1));\n    Assert.assertEquals(304  , message.getRepeatedUint64  (1));\n    Assert.assertEquals(305  , message.getRepeatedSint32  (1));\n    Assert.assertEquals(306  , message.getRepeatedSint64  (1));\n    Assert.assertEquals(307  , message.getRepeatedFixed32 (1));\n    Assert.assertEquals(308  , message.getRepeatedFixed64 (1));\n    Assert.assertEquals(309  , message.getRepeatedSfixed32(1));\n    Assert.assertEquals(310  , message.getRepeatedSfixed64(1));\n    Assert.assertEquals(311  , message.getRepeatedFloat   (1), 0.0);\n    Assert.assertEquals(312  , message.getRepeatedDouble  (1), 0.0);\n    Assert.assertEquals(false, message.getRepeatedBool    (1));\n    Assert.assertEquals(\"315\", message.getRepeatedString  (1));\n    Assert.assertEquals(toBytes(\"316\"), message.getRepeatedBytes(1));\n\n    Assert.assertEquals(317, message.getRepeatedGroup         (1).getA());\n    Assert.assertEquals(318, message.getRepeatedNestedMessage (1).getBb());\n    Assert.assertEquals(319, message.getRepeatedForeignMessage(1).getC());\n    Assert.assertEquals(320, message.getRepeatedImportMessage (1).getD());\n\n    Assert.assertEquals(TestAllTypes.NestedEnum.BAZ, message.getRepeatedNestedEnum (1));\n    Assert.assertEquals(ForeignEnum.FOREIGN_BAZ, message.getRepeatedForeignEnum(1));\n    Assert.assertEquals(ImportEnum.IMPORT_BAZ, message.getRepeatedImportEnum(1));\n\n    Assert.assertEquals(\"324\", message.getRepeatedStringPiece(1));\n    Assert.assertEquals(\"325\", message.getRepeatedCord(1));\n\n    // -----------------------------------------------------------------\n\n    Assert.assertTrue(message.hasDefaultInt32   ());\n    Assert.assertTrue(message.hasDefaultInt64   ());\n    Assert.assertTrue(message.hasDefaultUint32  ());\n    Assert.assertTrue(message.hasDefaultUint64  ());\n    Assert.assertTrue(message.hasDefaultSint32  ());\n    Assert.assertTrue(message.hasDefaultSint64  ());\n    Assert.assertTrue(message.hasDefaultFixed32 ());\n    Assert.assertTrue(message.hasDefaultFixed64 ());\n    Assert.assertTrue(message.hasDefaultSfixed32());\n    Assert.assertTrue(message.hasDefaultSfixed64());\n    Assert.assertTrue(message.hasDefaultFloat   ());\n    Assert.assertTrue(message.hasDefaultDouble  ());\n    Assert.assertTrue(message.hasDefaultBool    ());\n    Assert.assertTrue(message.hasDefaultString  ());\n    Assert.assertTrue(message.hasDefaultBytes   ());\n\n    Assert.assertTrue(message.hasDefaultNestedEnum ());\n    Assert.assertTrue(message.hasDefaultForeignEnum());\n    Assert.assertTrue(message.hasDefaultImportEnum ());\n\n    Assert.assertTrue(message.hasDefaultStringPiece());\n    Assert.assertTrue(message.hasDefaultCord());\n\n    Assert.assertEquals(401  , message.getDefaultInt32   ());\n    Assert.assertEquals(402  , message.getDefaultInt64   ());\n    Assert.assertEquals(403  , message.getDefaultUint32  ());\n    Assert.assertEquals(404  , message.getDefaultUint64  ());\n    Assert.assertEquals(405  , message.getDefaultSint32  ());\n    Assert.assertEquals(406  , message.getDefaultSint64  ());\n    Assert.assertEquals(407  , message.getDefaultFixed32 ());\n    Assert.assertEquals(408  , message.getDefaultFixed64 ());\n    Assert.assertEquals(409  , message.getDefaultSfixed32());\n    Assert.assertEquals(410  , message.getDefaultSfixed64());\n    Assert.assertEquals(411  , message.getDefaultFloat   (), 0.0);\n    Assert.assertEquals(412  , message.getDefaultDouble  (), 0.0);\n    Assert.assertEquals(false, message.getDefaultBool    ());\n    Assert.assertEquals(\"415\", message.getDefaultString  ());\n    Assert.assertEquals(toBytes(\"416\"), message.getDefaultBytes());\n\n    Assert.assertEquals(TestAllTypes.NestedEnum.FOO, message.getDefaultNestedEnum ());\n    Assert.assertEquals(ForeignEnum.FOREIGN_FOO, message.getDefaultForeignEnum());\n    Assert.assertEquals(ImportEnum.IMPORT_FOO, message.getDefaultImportEnum());\n\n    Assert.assertEquals(\"424\", message.getDefaultStringPiece());\n    Assert.assertEquals(\"425\", message.getDefaultCord());\n  }\n\n  // -------------------------------------------------------------------\n  /**\n   * Assert (using {@code junit.framework.Assert}} that all fields of\n   * {@code message} are cleared, and that getting the fields returns their\n   * default values.\n   */\n  public static void assertClear(TestAllTypesOrBuilder message) {\n    // hasBlah() should initially be false for all optional fields.\n    Assert.assertFalse(message.hasOptionalInt32   ());\n    Assert.assertFalse(message.hasOptionalInt64   ());\n    Assert.assertFalse(message.hasOptionalUint32  ());\n    Assert.assertFalse(message.hasOptionalUint64  ());\n    Assert.assertFalse(message.hasOptionalSint32  ());\n    Assert.assertFalse(message.hasOptionalSint64  ());\n    Assert.assertFalse(message.hasOptionalFixed32 ());\n    Assert.assertFalse(message.hasOptionalFixed64 ());\n    Assert.assertFalse(message.hasOptionalSfixed32());\n    Assert.assertFalse(message.hasOptionalSfixed64());\n    Assert.assertFalse(message.hasOptionalFloat   ());\n    Assert.assertFalse(message.hasOptionalDouble  ());\n    Assert.assertFalse(message.hasOptionalBool    ());\n    Assert.assertFalse(message.hasOptionalString  ());\n    Assert.assertFalse(message.hasOptionalBytes   ());\n\n    Assert.assertFalse(message.hasOptionalGroup         ());\n    Assert.assertFalse(message.hasOptionalNestedMessage ());\n    Assert.assertFalse(message.hasOptionalForeignMessage());\n    Assert.assertFalse(message.hasOptionalImportMessage ());\n\n    Assert.assertFalse(message.hasOptionalNestedEnum ());\n    Assert.assertFalse(message.hasOptionalForeignEnum());\n    Assert.assertFalse(message.hasOptionalImportEnum ());\n\n    Assert.assertFalse(message.hasOptionalStringPiece());\n    Assert.assertFalse(message.hasOptionalCord());\n\n    // Optional fields without defaults are set to zero or something like it.\n    Assert.assertEquals(0    , message.getOptionalInt32   ());\n    Assert.assertEquals(0    , message.getOptionalInt64   ());\n    Assert.assertEquals(0    , message.getOptionalUint32  ());\n    Assert.assertEquals(0    , message.getOptionalUint64  ());\n    Assert.assertEquals(0    , message.getOptionalSint32  ());\n    Assert.assertEquals(0    , message.getOptionalSint64  ());\n    Assert.assertEquals(0    , message.getOptionalFixed32 ());\n    Assert.assertEquals(0    , message.getOptionalFixed64 ());\n    Assert.assertEquals(0    , message.getOptionalSfixed32());\n    Assert.assertEquals(0    , message.getOptionalSfixed64());\n    Assert.assertEquals(0    , message.getOptionalFloat   (), 0.0);\n    Assert.assertEquals(0    , message.getOptionalDouble  (), 0.0);\n    Assert.assertEquals(false, message.getOptionalBool    ());\n    Assert.assertEquals(\"\"   , message.getOptionalString  ());\n    Assert.assertEquals(ByteString.EMPTY, message.getOptionalBytes());\n\n    // Embedded messages should also be clear.\n    Assert.assertFalse(message.getOptionalGroup         ().hasA());\n    Assert.assertFalse(message.getOptionalNestedMessage ().hasBb());\n    Assert.assertFalse(message.getOptionalForeignMessage().hasC());\n    Assert.assertFalse(message.getOptionalImportMessage ().hasD());\n\n    Assert.assertEquals(0, message.getOptionalGroup         ().getA());\n    Assert.assertEquals(0, message.getOptionalNestedMessage ().getBb());\n    Assert.assertEquals(0, message.getOptionalForeignMessage().getC());\n    Assert.assertEquals(0, message.getOptionalImportMessage ().getD());\n\n    // Enums without defaults are set to the first value in the enum.\n    Assert.assertEquals(TestAllTypes.NestedEnum.FOO, message.getOptionalNestedEnum ());\n    Assert.assertEquals(ForeignEnum.FOREIGN_FOO, message.getOptionalForeignEnum());\n    Assert.assertEquals(ImportEnum.IMPORT_FOO, message.getOptionalImportEnum());\n\n    Assert.assertEquals(\"\", message.getOptionalStringPiece());\n    Assert.assertEquals(\"\", message.getOptionalCord());\n\n    // Repeated fields are empty.\n    Assert.assertEquals(0, message.getRepeatedInt32Count   ());\n    Assert.assertEquals(0, message.getRepeatedInt64Count   ());\n    Assert.assertEquals(0, message.getRepeatedUint32Count  ());\n    Assert.assertEquals(0, message.getRepeatedUint64Count  ());\n    Assert.assertEquals(0, message.getRepeatedSint32Count  ());\n    Assert.assertEquals(0, message.getRepeatedSint64Count  ());\n    Assert.assertEquals(0, message.getRepeatedFixed32Count ());\n    Assert.assertEquals(0, message.getRepeatedFixed64Count ());\n    Assert.assertEquals(0, message.getRepeatedSfixed32Count());\n    Assert.assertEquals(0, message.getRepeatedSfixed64Count());\n    Assert.assertEquals(0, message.getRepeatedFloatCount   ());\n    Assert.assertEquals(0, message.getRepeatedDoubleCount  ());\n    Assert.assertEquals(0, message.getRepeatedBoolCount    ());\n    Assert.assertEquals(0, message.getRepeatedStringCount  ());\n    Assert.assertEquals(0, message.getRepeatedBytesCount   ());\n\n    Assert.assertEquals(0, message.getRepeatedGroupCount         ());\n    Assert.assertEquals(0, message.getRepeatedNestedMessageCount ());\n    Assert.assertEquals(0, message.getRepeatedForeignMessageCount());\n    Assert.assertEquals(0, message.getRepeatedImportMessageCount ());\n    Assert.assertEquals(0, message.getRepeatedNestedEnumCount    ());\n    Assert.assertEquals(0, message.getRepeatedForeignEnumCount   ());\n    Assert.assertEquals(0, message.getRepeatedImportEnumCount    ());\n\n    Assert.assertEquals(0, message.getRepeatedStringPieceCount());\n    Assert.assertEquals(0, message.getRepeatedCordCount());\n\n    // hasBlah() should also be false for all default fields.\n    Assert.assertFalse(message.hasDefaultInt32   ());\n    Assert.assertFalse(message.hasDefaultInt64   ());\n    Assert.assertFalse(message.hasDefaultUint32  ());\n    Assert.assertFalse(message.hasDefaultUint64  ());\n    Assert.assertFalse(message.hasDefaultSint32  ());\n    Assert.assertFalse(message.hasDefaultSint64  ());\n    Assert.assertFalse(message.hasDefaultFixed32 ());\n    Assert.assertFalse(message.hasDefaultFixed64 ());\n    Assert.assertFalse(message.hasDefaultSfixed32());\n    Assert.assertFalse(message.hasDefaultSfixed64());\n    Assert.assertFalse(message.hasDefaultFloat   ());\n    Assert.assertFalse(message.hasDefaultDouble  ());\n    Assert.assertFalse(message.hasDefaultBool    ());\n    Assert.assertFalse(message.hasDefaultString  ());\n    Assert.assertFalse(message.hasDefaultBytes   ());\n\n    Assert.assertFalse(message.hasDefaultNestedEnum ());\n    Assert.assertFalse(message.hasDefaultForeignEnum());\n    Assert.assertFalse(message.hasDefaultImportEnum ());\n\n    Assert.assertFalse(message.hasDefaultStringPiece());\n    Assert.assertFalse(message.hasDefaultCord());\n\n    // Fields with defaults have their default values (duh).\n    Assert.assertEquals( 41    , message.getDefaultInt32   ());\n    Assert.assertEquals( 42    , message.getDefaultInt64   ());\n    Assert.assertEquals( 43    , message.getDefaultUint32  ());\n    Assert.assertEquals( 44    , message.getDefaultUint64  ());\n    Assert.assertEquals(-45    , message.getDefaultSint32  ());\n    Assert.assertEquals( 46    , message.getDefaultSint64  ());\n    Assert.assertEquals( 47    , message.getDefaultFixed32 ());\n    Assert.assertEquals( 48    , message.getDefaultFixed64 ());\n    Assert.assertEquals( 49    , message.getDefaultSfixed32());\n    Assert.assertEquals(-50    , message.getDefaultSfixed64());\n    Assert.assertEquals( 51.5  , message.getDefaultFloat   (), 0.0);\n    Assert.assertEquals( 52e3  , message.getDefaultDouble  (), 0.0);\n    Assert.assertEquals(true   , message.getDefaultBool    ());\n    Assert.assertEquals(\"hello\", message.getDefaultString  ());\n    Assert.assertEquals(toBytes(\"world\"), message.getDefaultBytes());\n\n    Assert.assertEquals(TestAllTypes.NestedEnum.BAR, message.getDefaultNestedEnum ());\n    Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getDefaultForeignEnum());\n    Assert.assertEquals(ImportEnum.IMPORT_BAR, message.getDefaultImportEnum());\n\n    Assert.assertEquals(\"abc\", message.getDefaultStringPiece());\n    Assert.assertEquals(\"123\", message.getDefaultCord());\n  }\n\n  // -------------------------------------------------------------------\n\n  /**\n   * Assert (using {@code junit.framework.Assert}} that all fields of\n   * {@code message} are set to the values assigned by {@code setAllFields}\n   * followed by {@code modifyRepeatedFields}.\n   */\n  public static void assertRepeatedFieldsModified(\n      TestAllTypesOrBuilder message) {\n    // ModifyRepeatedFields only sets the second repeated element of each\n    // field.  In addition to verifying this, we also verify that the first\n    // element and size were *not* modified.\n    Assert.assertEquals(2, message.getRepeatedInt32Count   ());\n    Assert.assertEquals(2, message.getRepeatedInt64Count   ());\n    Assert.assertEquals(2, message.getRepeatedUint32Count  ());\n    Assert.assertEquals(2, message.getRepeatedUint64Count  ());\n    Assert.assertEquals(2, message.getRepeatedSint32Count  ());\n    Assert.assertEquals(2, message.getRepeatedSint64Count  ());\n    Assert.assertEquals(2, message.getRepeatedFixed32Count ());\n    Assert.assertEquals(2, message.getRepeatedFixed64Count ());\n    Assert.assertEquals(2, message.getRepeatedSfixed32Count());\n    Assert.assertEquals(2, message.getRepeatedSfixed64Count());\n    Assert.assertEquals(2, message.getRepeatedFloatCount   ());\n    Assert.assertEquals(2, message.getRepeatedDoubleCount  ());\n    Assert.assertEquals(2, message.getRepeatedBoolCount    ());\n    Assert.assertEquals(2, message.getRepeatedStringCount  ());\n    Assert.assertEquals(2, message.getRepeatedBytesCount   ());\n\n    Assert.assertEquals(2, message.getRepeatedGroupCount         ());\n    Assert.assertEquals(2, message.getRepeatedNestedMessageCount ());\n    Assert.assertEquals(2, message.getRepeatedForeignMessageCount());\n    Assert.assertEquals(2, message.getRepeatedImportMessageCount ());\n    Assert.assertEquals(2, message.getRepeatedNestedEnumCount    ());\n    Assert.assertEquals(2, message.getRepeatedForeignEnumCount   ());\n    Assert.assertEquals(2, message.getRepeatedImportEnumCount    ());\n\n    Assert.assertEquals(2, message.getRepeatedStringPieceCount());\n    Assert.assertEquals(2, message.getRepeatedCordCount());\n\n    Assert.assertEquals(201  , message.getRepeatedInt32   (0));\n    Assert.assertEquals(202L , message.getRepeatedInt64   (0));\n    Assert.assertEquals(203  , message.getRepeatedUint32  (0));\n    Assert.assertEquals(204L , message.getRepeatedUint64  (0));\n    Assert.assertEquals(205  , message.getRepeatedSint32  (0));\n    Assert.assertEquals(206L , message.getRepeatedSint64  (0));\n    Assert.assertEquals(207  , message.getRepeatedFixed32 (0));\n    Assert.assertEquals(208L , message.getRepeatedFixed64 (0));\n    Assert.assertEquals(209  , message.getRepeatedSfixed32(0));\n    Assert.assertEquals(210L , message.getRepeatedSfixed64(0));\n    Assert.assertEquals(211F , message.getRepeatedFloat   (0));\n    Assert.assertEquals(212D , message.getRepeatedDouble  (0));\n    Assert.assertEquals(true , message.getRepeatedBool    (0));\n    Assert.assertEquals(\"215\", message.getRepeatedString  (0));\n    Assert.assertEquals(toBytes(\"216\"), message.getRepeatedBytes(0));\n\n    Assert.assertEquals(217, message.getRepeatedGroup         (0).getA());\n    Assert.assertEquals(218, message.getRepeatedNestedMessage (0).getBb());\n    Assert.assertEquals(219, message.getRepeatedForeignMessage(0).getC());\n    Assert.assertEquals(220, message.getRepeatedImportMessage (0).getD());\n\n    Assert.assertEquals(TestAllTypes.NestedEnum.BAR, message.getRepeatedNestedEnum (0));\n    Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getRepeatedForeignEnum(0));\n    Assert.assertEquals(ImportEnum.IMPORT_BAR, message.getRepeatedImportEnum(0));\n\n    Assert.assertEquals(\"224\", message.getRepeatedStringPiece(0));\n    Assert.assertEquals(\"225\", message.getRepeatedCord(0));\n\n    // Actually verify the second (modified) elements now.\n    Assert.assertEquals(501  , message.getRepeatedInt32   (1));\n    Assert.assertEquals(502L , message.getRepeatedInt64   (1));\n    Assert.assertEquals(503  , message.getRepeatedUint32  (1));\n    Assert.assertEquals(504L , message.getRepeatedUint64  (1));\n    Assert.assertEquals(505  , message.getRepeatedSint32  (1));\n    Assert.assertEquals(506L , message.getRepeatedSint64  (1));\n    Assert.assertEquals(507  , message.getRepeatedFixed32 (1));\n    Assert.assertEquals(508L , message.getRepeatedFixed64 (1));\n    Assert.assertEquals(509  , message.getRepeatedSfixed32(1));\n    Assert.assertEquals(510L , message.getRepeatedSfixed64(1));\n    Assert.assertEquals(511F , message.getRepeatedFloat   (1));\n    Assert.assertEquals(512D , message.getRepeatedDouble  (1));\n    Assert.assertEquals(true , message.getRepeatedBool    (1));\n    Assert.assertEquals(\"515\", message.getRepeatedString  (1));\n    Assert.assertEquals(toBytes(\"516\"), message.getRepeatedBytes(1));\n\n    Assert.assertEquals(517, message.getRepeatedGroup         (1).getA());\n    Assert.assertEquals(518, message.getRepeatedNestedMessage (1).getBb());\n    Assert.assertEquals(519, message.getRepeatedForeignMessage(1).getC());\n    Assert.assertEquals(520, message.getRepeatedImportMessage (1).getD());\n\n    Assert.assertEquals(TestAllTypes.NestedEnum.FOO, message.getRepeatedNestedEnum (1));\n    Assert.assertEquals(ForeignEnum.FOREIGN_FOO, message.getRepeatedForeignEnum(1));\n    Assert.assertEquals(ImportEnum.IMPORT_FOO, message.getRepeatedImportEnum(1));\n\n    Assert.assertEquals(\"524\", message.getRepeatedStringPiece(1));\n    Assert.assertEquals(\"525\", message.getRepeatedCord(1));\n  }\n\n  /**\n   * Set every field of {@code message} to a unique value.\n   */\n  public static void setPackedFields(TestPackedTypes.Builder message) {\n    message.addPackedInt32   (601);\n    message.addPackedInt64   (602);\n    message.addPackedUint32  (603);\n    message.addPackedUint64  (604);\n    message.addPackedSint32  (605);\n    message.addPackedSint64  (606);\n    message.addPackedFixed32 (607);\n    message.addPackedFixed64 (608);\n    message.addPackedSfixed32(609);\n    message.addPackedSfixed64(610);\n    message.addPackedFloat   (611);\n    message.addPackedDouble  (612);\n    message.addPackedBool    (true);\n    message.addPackedEnum    (ForeignEnum.FOREIGN_BAR);\n    // Add a second one of each field.\n    message.addPackedInt32   (701);\n    message.addPackedInt64   (702);\n    message.addPackedUint32  (703);\n    message.addPackedUint64  (704);\n    message.addPackedSint32  (705);\n    message.addPackedSint64  (706);\n    message.addPackedFixed32 (707);\n    message.addPackedFixed64 (708);\n    message.addPackedSfixed32(709);\n    message.addPackedSfixed64(710);\n    message.addPackedFloat   (711);\n    message.addPackedDouble  (712);\n    message.addPackedBool    (false);\n    message.addPackedEnum    (ForeignEnum.FOREIGN_BAZ);\n  }\n\n  /**\n   * Set every field of {@code message} to a unique value. Must correspond with\n   * the values applied by {@code setPackedFields}.\n   */\n  public static void setUnpackedFields(TestUnpackedTypes.Builder message) {\n    message.addUnpackedInt32   (601);\n    message.addUnpackedInt64   (602);\n    message.addUnpackedUint32  (603);\n    message.addUnpackedUint64  (604);\n    message.addUnpackedSint32  (605);\n    message.addUnpackedSint64  (606);\n    message.addUnpackedFixed32 (607);\n    message.addUnpackedFixed64 (608);\n    message.addUnpackedSfixed32(609);\n    message.addUnpackedSfixed64(610);\n    message.addUnpackedFloat   (611);\n    message.addUnpackedDouble  (612);\n    message.addUnpackedBool    (true);\n    message.addUnpackedEnum    (ForeignEnum.FOREIGN_BAR);\n    // Add a second one of each field.\n    message.addUnpackedInt32   (701);\n    message.addUnpackedInt64   (702);\n    message.addUnpackedUint32  (703);\n    message.addUnpackedUint64  (704);\n    message.addUnpackedSint32  (705);\n    message.addUnpackedSint64  (706);\n    message.addUnpackedFixed32 (707);\n    message.addUnpackedFixed64 (708);\n    message.addUnpackedSfixed32(709);\n    message.addUnpackedSfixed64(710);\n    message.addUnpackedFloat   (711);\n    message.addUnpackedDouble  (712);\n    message.addUnpackedBool    (false);\n    message.addUnpackedEnum    (ForeignEnum.FOREIGN_BAZ);\n  }\n\n  /**\n   * Assert (using {@code junit.framework.Assert}} that all fields of\n   * {@code message} are set to the values assigned by {@code setPackedFields}.\n   */\n  public static void assertPackedFieldsSet(TestPackedTypes message) {\n    Assert.assertEquals(2, message.getPackedInt32Count   ());\n    Assert.assertEquals(2, message.getPackedInt64Count   ());\n    Assert.assertEquals(2, message.getPackedUint32Count  ());\n    Assert.assertEquals(2, message.getPackedUint64Count  ());\n    Assert.assertEquals(2, message.getPackedSint32Count  ());\n    Assert.assertEquals(2, message.getPackedSint64Count  ());\n    Assert.assertEquals(2, message.getPackedFixed32Count ());\n    Assert.assertEquals(2, message.getPackedFixed64Count ());\n    Assert.assertEquals(2, message.getPackedSfixed32Count());\n    Assert.assertEquals(2, message.getPackedSfixed64Count());\n    Assert.assertEquals(2, message.getPackedFloatCount   ());\n    Assert.assertEquals(2, message.getPackedDoubleCount  ());\n    Assert.assertEquals(2, message.getPackedBoolCount    ());\n    Assert.assertEquals(2, message.getPackedEnumCount   ());\n    Assert.assertEquals(601  , message.getPackedInt32   (0));\n    Assert.assertEquals(602  , message.getPackedInt64   (0));\n    Assert.assertEquals(603  , message.getPackedUint32  (0));\n    Assert.assertEquals(604  , message.getPackedUint64  (0));\n    Assert.assertEquals(605  , message.getPackedSint32  (0));\n    Assert.assertEquals(606  , message.getPackedSint64  (0));\n    Assert.assertEquals(607  , message.getPackedFixed32 (0));\n    Assert.assertEquals(608  , message.getPackedFixed64 (0));\n    Assert.assertEquals(609  , message.getPackedSfixed32(0));\n    Assert.assertEquals(610  , message.getPackedSfixed64(0));\n    Assert.assertEquals(611  , message.getPackedFloat   (0), 0.0);\n    Assert.assertEquals(612  , message.getPackedDouble  (0), 0.0);\n    Assert.assertEquals(true , message.getPackedBool    (0));\n    Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getPackedEnum(0));\n    Assert.assertEquals(701  , message.getPackedInt32   (1));\n    Assert.assertEquals(702  , message.getPackedInt64   (1));\n    Assert.assertEquals(703  , message.getPackedUint32  (1));\n    Assert.assertEquals(704  , message.getPackedUint64  (1));\n    Assert.assertEquals(705  , message.getPackedSint32  (1));\n    Assert.assertEquals(706  , message.getPackedSint64  (1));\n    Assert.assertEquals(707  , message.getPackedFixed32 (1));\n    Assert.assertEquals(708  , message.getPackedFixed64 (1));\n    Assert.assertEquals(709  , message.getPackedSfixed32(1));\n    Assert.assertEquals(710  , message.getPackedSfixed64(1));\n    Assert.assertEquals(711  , message.getPackedFloat   (1), 0.0);\n    Assert.assertEquals(712  , message.getPackedDouble  (1), 0.0);\n    Assert.assertEquals(false, message.getPackedBool    (1));\n    Assert.assertEquals(ForeignEnum.FOREIGN_BAZ, message.getPackedEnum(1));\n  }\n\n  /**\n   * Assert (using {@code junit.framework.Assert}} that all fields of\n   * {@code message} are set to the values assigned by {@code setUnpackedFields}.\n   */\n  public static void assertUnpackedFieldsSet(TestUnpackedTypes message) {\n    Assert.assertEquals(2, message.getUnpackedInt32Count   ());\n    Assert.assertEquals(2, message.getUnpackedInt64Count   ());\n    Assert.assertEquals(2, message.getUnpackedUint32Count  ());\n    Assert.assertEquals(2, message.getUnpackedUint64Count  ());\n    Assert.assertEquals(2, message.getUnpackedSint32Count  ());\n    Assert.assertEquals(2, message.getUnpackedSint64Count  ());\n    Assert.assertEquals(2, message.getUnpackedFixed32Count ());\n    Assert.assertEquals(2, message.getUnpackedFixed64Count ());\n    Assert.assertEquals(2, message.getUnpackedSfixed32Count());\n    Assert.assertEquals(2, message.getUnpackedSfixed64Count());\n    Assert.assertEquals(2, message.getUnpackedFloatCount   ());\n    Assert.assertEquals(2, message.getUnpackedDoubleCount  ());\n    Assert.assertEquals(2, message.getUnpackedBoolCount    ());\n    Assert.assertEquals(2, message.getUnpackedEnumCount   ());\n    Assert.assertEquals(601  , message.getUnpackedInt32   (0));\n    Assert.assertEquals(602  , message.getUnpackedInt64   (0));\n    Assert.assertEquals(603  , message.getUnpackedUint32  (0));\n    Assert.assertEquals(604  , message.getUnpackedUint64  (0));\n    Assert.assertEquals(605  , message.getUnpackedSint32  (0));\n    Assert.assertEquals(606  , message.getUnpackedSint64  (0));\n    Assert.assertEquals(607  , message.getUnpackedFixed32 (0));\n    Assert.assertEquals(608  , message.getUnpackedFixed64 (0));\n    Assert.assertEquals(609  , message.getUnpackedSfixed32(0));\n    Assert.assertEquals(610  , message.getUnpackedSfixed64(0));\n    Assert.assertEquals(611  , message.getUnpackedFloat   (0), 0.0);\n    Assert.assertEquals(612  , message.getUnpackedDouble  (0), 0.0);\n    Assert.assertEquals(true , message.getUnpackedBool    (0));\n    Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getUnpackedEnum(0));\n    Assert.assertEquals(701  , message.getUnpackedInt32   (1));\n    Assert.assertEquals(702  , message.getUnpackedInt64   (1));\n    Assert.assertEquals(703  , message.getUnpackedUint32  (1));\n    Assert.assertEquals(704  , message.getUnpackedUint64  (1));\n    Assert.assertEquals(705  , message.getUnpackedSint32  (1));\n    Assert.assertEquals(706  , message.getUnpackedSint64  (1));\n    Assert.assertEquals(707  , message.getUnpackedFixed32 (1));\n    Assert.assertEquals(708  , message.getUnpackedFixed64 (1));\n    Assert.assertEquals(709  , message.getUnpackedSfixed32(1));\n    Assert.assertEquals(710  , message.getUnpackedSfixed64(1));\n    Assert.assertEquals(711  , message.getUnpackedFloat   (1), 0.0);\n    Assert.assertEquals(712  , message.getUnpackedDouble  (1), 0.0);\n    Assert.assertEquals(false, message.getUnpackedBool    (1));\n    Assert.assertEquals(ForeignEnum.FOREIGN_BAZ, message.getUnpackedEnum(1));\n  }\n\n  // ===================================================================\n  // Like above, but for extensions\n\n  // Java gets confused with things like assertEquals(int, Integer):  it can't\n  // decide whether to call assertEquals(int, int) or assertEquals(Object,\n  // Object).  So we define these methods to help it.\n  private static void assertEqualsExactType(int a, int b) {\n    Assert.assertEquals(a, b);\n  }\n  private static void assertEqualsExactType(long a, long b) {\n    Assert.assertEquals(a, b);\n  }\n  private static void assertEqualsExactType(float a, float b) {\n    Assert.assertEquals(a, b, 0.0);\n  }\n  private static void assertEqualsExactType(double a, double b) {\n    Assert.assertEquals(a, b, 0.0);\n  }\n  private static void assertEqualsExactType(boolean a, boolean b) {\n    Assert.assertEquals(a, b);\n  }\n  private static void assertEqualsExactType(String a, String b) {\n    Assert.assertEquals(a, b);\n  }\n  private static void assertEqualsExactType(ByteString a, ByteString b) {\n    Assert.assertEquals(a, b);\n  }\n  private static void assertEqualsExactType(TestAllTypes.NestedEnum a,\n                                            TestAllTypes.NestedEnum b) {\n    Assert.assertEquals(a, b);\n  }\n  private static void assertEqualsExactType(ForeignEnum a, ForeignEnum b) {\n    Assert.assertEquals(a, b);\n  }\n  private static void assertEqualsExactType(ImportEnum a, ImportEnum b) {\n    Assert.assertEquals(a, b);\n  }\n  private static void assertEqualsExactType(TestAllTypesLite.NestedEnum a,\n                                            TestAllTypesLite.NestedEnum b) {\n    Assert.assertEquals(a, b);\n  }\n  private static void assertEqualsExactType(ForeignEnumLite a,\n                                            ForeignEnumLite b) {\n    Assert.assertEquals(a, b);\n  }\n  private static void assertEqualsExactType(ImportEnumLite a,\n                                            ImportEnumLite b) {\n    Assert.assertEquals(a, b);\n  }\n\n  /**\n   * Get an unmodifiable {@link ExtensionRegistry} containing all the\n   * extensions of {@code TestAllExtensions}.\n   */\n  public static ExtensionRegistry getExtensionRegistry() {\n    ExtensionRegistry registry = ExtensionRegistry.newInstance();\n    registerAllExtensions(registry);\n    return registry.getUnmodifiable();\n  }\n\n  public static ExtensionRegistryLite getExtensionRegistryLite() {\n    ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance();\n    registerAllExtensionsLite(registry);\n    return registry.getUnmodifiable();\n  }\n\n  /**\n   * Register all of {@code TestAllExtensions}'s extensions with the\n   * given {@link ExtensionRegistry}.\n   */\n  public static void registerAllExtensions(ExtensionRegistry registry) {\n    UnittestProto.registerAllExtensions(registry);\n    registerAllExtensionsLite(registry);\n  }\n\n  public static void registerAllExtensionsLite(ExtensionRegistryLite registry) {\n    UnittestLite.registerAllExtensions(registry);\n  }\n\n  /**\n   * Set every field of {@code message} to the values expected by\n   * {@code assertAllExtensionsSet()}.\n   */\n  public static void setAllExtensions(TestAllExtensions.Builder message) {\n    message.setExtension(optionalInt32Extension   , 101);\n    message.setExtension(optionalInt64Extension   , 102L);\n    message.setExtension(optionalUint32Extension  , 103);\n    message.setExtension(optionalUint64Extension  , 104L);\n    message.setExtension(optionalSint32Extension  , 105);\n    message.setExtension(optionalSint64Extension  , 106L);\n    message.setExtension(optionalFixed32Extension , 107);\n    message.setExtension(optionalFixed64Extension , 108L);\n    message.setExtension(optionalSfixed32Extension, 109);\n    message.setExtension(optionalSfixed64Extension, 110L);\n    message.setExtension(optionalFloatExtension   , 111F);\n    message.setExtension(optionalDoubleExtension  , 112D);\n    message.setExtension(optionalBoolExtension    , true);\n    message.setExtension(optionalStringExtension  , \"115\");\n    message.setExtension(optionalBytesExtension   , toBytes(\"116\"));\n\n    message.setExtension(optionalGroupExtension,\n      OptionalGroup_extension.newBuilder().setA(117).build());\n    message.setExtension(optionalNestedMessageExtension,\n      TestAllTypes.NestedMessage.newBuilder().setBb(118).build());\n    message.setExtension(optionalForeignMessageExtension,\n      ForeignMessage.newBuilder().setC(119).build());\n    message.setExtension(optionalImportMessageExtension,\n      ImportMessage.newBuilder().setD(120).build());\n\n    message.setExtension(optionalNestedEnumExtension, TestAllTypes.NestedEnum.BAZ);\n    message.setExtension(optionalForeignEnumExtension, ForeignEnum.FOREIGN_BAZ);\n    message.setExtension(optionalImportEnumExtension, ImportEnum.IMPORT_BAZ);\n\n    message.setExtension(optionalStringPieceExtension, \"124\");\n    message.setExtension(optionalCordExtension, \"125\");\n\n    // -----------------------------------------------------------------\n\n    message.addExtension(repeatedInt32Extension   , 201);\n    message.addExtension(repeatedInt64Extension   , 202L);\n    message.addExtension(repeatedUint32Extension  , 203);\n    message.addExtension(repeatedUint64Extension  , 204L);\n    message.addExtension(repeatedSint32Extension  , 205);\n    message.addExtension(repeatedSint64Extension  , 206L);\n    message.addExtension(repeatedFixed32Extension , 207);\n    message.addExtension(repeatedFixed64Extension , 208L);\n    message.addExtension(repeatedSfixed32Extension, 209);\n    message.addExtension(repeatedSfixed64Extension, 210L);\n    message.addExtension(repeatedFloatExtension   , 211F);\n    message.addExtension(repeatedDoubleExtension  , 212D);\n    message.addExtension(repeatedBoolExtension    , true);\n    message.addExtension(repeatedStringExtension  , \"215\");\n    message.addExtension(repeatedBytesExtension   , toBytes(\"216\"));\n\n    message.addExtension(repeatedGroupExtension,\n      RepeatedGroup_extension.newBuilder().setA(217).build());\n    message.addExtension(repeatedNestedMessageExtension,\n      TestAllTypes.NestedMessage.newBuilder().setBb(218).build());\n    message.addExtension(repeatedForeignMessageExtension,\n      ForeignMessage.newBuilder().setC(219).build());\n    message.addExtension(repeatedImportMessageExtension,\n      ImportMessage.newBuilder().setD(220).build());\n\n    message.addExtension(repeatedNestedEnumExtension, TestAllTypes.NestedEnum.BAR);\n    message.addExtension(repeatedForeignEnumExtension, ForeignEnum.FOREIGN_BAR);\n    message.addExtension(repeatedImportEnumExtension, ImportEnum.IMPORT_BAR);\n\n    message.addExtension(repeatedStringPieceExtension, \"224\");\n    message.addExtension(repeatedCordExtension, \"225\");\n\n    // Add a second one of each field.\n    message.addExtension(repeatedInt32Extension   , 301);\n    message.addExtension(repeatedInt64Extension   , 302L);\n    message.addExtension(repeatedUint32Extension  , 303);\n    message.addExtension(repeatedUint64Extension  , 304L);\n    message.addExtension(repeatedSint32Extension  , 305);\n    message.addExtension(repeatedSint64Extension  , 306L);\n    message.addExtension(repeatedFixed32Extension , 307);\n    message.addExtension(repeatedFixed64Extension , 308L);\n    message.addExtension(repeatedSfixed32Extension, 309);\n    message.addExtension(repeatedSfixed64Extension, 310L);\n    message.addExtension(repeatedFloatExtension   , 311F);\n    message.addExtension(repeatedDoubleExtension  , 312D);\n    message.addExtension(repeatedBoolExtension    , false);\n    message.addExtension(repeatedStringExtension  , \"315\");\n    message.addExtension(repeatedBytesExtension   , toBytes(\"316\"));\n\n    message.addExtension(repeatedGroupExtension,\n      RepeatedGroup_extension.newBuilder().setA(317).build());\n    message.addExtension(repeatedNestedMessageExtension,\n      TestAllTypes.NestedMessage.newBuilder().setBb(318).build());\n    message.addExtension(repeatedForeignMessageExtension,\n      ForeignMessage.newBuilder().setC(319).build());\n    message.addExtension(repeatedImportMessageExtension,\n      ImportMessage.newBuilder().setD(320).build());\n\n    message.addExtension(repeatedNestedEnumExtension, TestAllTypes.NestedEnum.BAZ);\n    message.addExtension(repeatedForeignEnumExtension, ForeignEnum.FOREIGN_BAZ);\n    message.addExtension(repeatedImportEnumExtension, ImportEnum.IMPORT_BAZ);\n\n    message.addExtension(repeatedStringPieceExtension, \"324\");\n    message.addExtension(repeatedCordExtension, \"325\");\n\n    // -----------------------------------------------------------------\n\n    message.setExtension(defaultInt32Extension   , 401);\n    message.setExtension(defaultInt64Extension   , 402L);\n    message.setExtension(defaultUint32Extension  , 403);\n    message.setExtension(defaultUint64Extension  , 404L);\n    message.setExtension(defaultSint32Extension  , 405);\n    message.setExtension(defaultSint64Extension  , 406L);\n    message.setExtension(defaultFixed32Extension , 407);\n    message.setExtension(defaultFixed64Extension , 408L);\n    message.setExtension(defaultSfixed32Extension, 409);\n    message.setExtension(defaultSfixed64Extension, 410L);\n    message.setExtension(defaultFloatExtension   , 411F);\n    message.setExtension(defaultDoubleExtension  , 412D);\n    message.setExtension(defaultBoolExtension    , false);\n    message.setExtension(defaultStringExtension  , \"415\");\n    message.setExtension(defaultBytesExtension   , toBytes(\"416\"));\n\n    message.setExtension(defaultNestedEnumExtension, TestAllTypes.NestedEnum.FOO);\n    message.setExtension(defaultForeignEnumExtension, ForeignEnum.FOREIGN_FOO);\n    message.setExtension(defaultImportEnumExtension, ImportEnum.IMPORT_FOO);\n\n    message.setExtension(defaultStringPieceExtension, \"424\");\n    message.setExtension(defaultCordExtension, \"425\");\n  }\n\n  // -------------------------------------------------------------------\n\n  /**\n   * Modify the repeated extensions of {@code message} to contain the values\n   * expected by {@code assertRepeatedExtensionsModified()}.\n   */\n  public static void modifyRepeatedExtensions(\n      TestAllExtensions.Builder message) {\n    message.setExtension(repeatedInt32Extension   , 1, 501);\n    message.setExtension(repeatedInt64Extension   , 1, 502L);\n    message.setExtension(repeatedUint32Extension  , 1, 503);\n    message.setExtension(repeatedUint64Extension  , 1, 504L);\n    message.setExtension(repeatedSint32Extension  , 1, 505);\n    message.setExtension(repeatedSint64Extension  , 1, 506L);\n    message.setExtension(repeatedFixed32Extension , 1, 507);\n    message.setExtension(repeatedFixed64Extension , 1, 508L);\n    message.setExtension(repeatedSfixed32Extension, 1, 509);\n    message.setExtension(repeatedSfixed64Extension, 1, 510L);\n    message.setExtension(repeatedFloatExtension   , 1, 511F);\n    message.setExtension(repeatedDoubleExtension  , 1, 512D);\n    message.setExtension(repeatedBoolExtension    , 1, true);\n    message.setExtension(repeatedStringExtension  , 1, \"515\");\n    message.setExtension(repeatedBytesExtension   , 1, toBytes(\"516\"));\n\n    message.setExtension(repeatedGroupExtension, 1,\n      RepeatedGroup_extension.newBuilder().setA(517).build());\n    message.setExtension(repeatedNestedMessageExtension, 1,\n      TestAllTypes.NestedMessage.newBuilder().setBb(518).build());\n    message.setExtension(repeatedForeignMessageExtension, 1,\n      ForeignMessage.newBuilder().setC(519).build());\n    message.setExtension(repeatedImportMessageExtension, 1,\n      ImportMessage.newBuilder().setD(520).build());\n\n    message.setExtension(repeatedNestedEnumExtension , 1, TestAllTypes.NestedEnum.FOO);\n    message.setExtension(repeatedForeignEnumExtension, 1, ForeignEnum.FOREIGN_FOO);\n    message.setExtension(repeatedImportEnumExtension , 1, ImportEnum.IMPORT_FOO);\n\n    message.setExtension(repeatedStringPieceExtension, 1, \"524\");\n    message.setExtension(repeatedCordExtension, 1, \"525\");\n  }\n\n  // -------------------------------------------------------------------\n\n  /**\n   * Assert (using {@code junit.framework.Assert}} that all extensions of\n   * {@code message} are set to the values assigned by {@code setAllExtensions}.\n   */\n  public static void assertAllExtensionsSet(\n      TestAllExtensionsOrBuilder message) {\n    Assert.assertTrue(message.hasExtension(optionalInt32Extension   ));\n    Assert.assertTrue(message.hasExtension(optionalInt64Extension   ));\n    Assert.assertTrue(message.hasExtension(optionalUint32Extension  ));\n    Assert.assertTrue(message.hasExtension(optionalUint64Extension  ));\n    Assert.assertTrue(message.hasExtension(optionalSint32Extension  ));\n    Assert.assertTrue(message.hasExtension(optionalSint64Extension  ));\n    Assert.assertTrue(message.hasExtension(optionalFixed32Extension ));\n    Assert.assertTrue(message.hasExtension(optionalFixed64Extension ));\n    Assert.assertTrue(message.hasExtension(optionalSfixed32Extension));\n    Assert.assertTrue(message.hasExtension(optionalSfixed64Extension));\n    Assert.assertTrue(message.hasExtension(optionalFloatExtension   ));\n    Assert.assertTrue(message.hasExtension(optionalDoubleExtension  ));\n    Assert.assertTrue(message.hasExtension(optionalBoolExtension    ));\n    Assert.assertTrue(message.hasExtension(optionalStringExtension  ));\n    Assert.assertTrue(message.hasExtension(optionalBytesExtension   ));\n\n    Assert.assertTrue(message.hasExtension(optionalGroupExtension         ));\n    Assert.assertTrue(message.hasExtension(optionalNestedMessageExtension ));\n    Assert.assertTrue(message.hasExtension(optionalForeignMessageExtension));\n    Assert.assertTrue(message.hasExtension(optionalImportMessageExtension ));\n\n    Assert.assertTrue(message.getExtension(optionalGroupExtension         ).hasA());\n    Assert.assertTrue(message.getExtension(optionalNestedMessageExtension ).hasBb());\n    Assert.assertTrue(message.getExtension(optionalForeignMessageExtension).hasC());\n    Assert.assertTrue(message.getExtension(optionalImportMessageExtension ).hasD());\n\n    Assert.assertTrue(message.hasExtension(optionalNestedEnumExtension ));\n    Assert.assertTrue(message.hasExtension(optionalForeignEnumExtension));\n    Assert.assertTrue(message.hasExtension(optionalImportEnumExtension ));\n\n    Assert.assertTrue(message.hasExtension(optionalStringPieceExtension));\n    Assert.assertTrue(message.hasExtension(optionalCordExtension));\n\n    assertEqualsExactType(101  , message.getExtension(optionalInt32Extension   ));\n    assertEqualsExactType(102L , message.getExtension(optionalInt64Extension   ));\n    assertEqualsExactType(103  , message.getExtension(optionalUint32Extension  ));\n    assertEqualsExactType(104L , message.getExtension(optionalUint64Extension  ));\n    assertEqualsExactType(105  , message.getExtension(optionalSint32Extension  ));\n    assertEqualsExactType(106L , message.getExtension(optionalSint64Extension  ));\n    assertEqualsExactType(107  , message.getExtension(optionalFixed32Extension ));\n    assertEqualsExactType(108L , message.getExtension(optionalFixed64Extension ));\n    assertEqualsExactType(109  , message.getExtension(optionalSfixed32Extension));\n    assertEqualsExactType(110L , message.getExtension(optionalSfixed64Extension));\n    assertEqualsExactType(111F , message.getExtension(optionalFloatExtension   ));\n    assertEqualsExactType(112D , message.getExtension(optionalDoubleExtension  ));\n    assertEqualsExactType(true , message.getExtension(optionalBoolExtension    ));\n    assertEqualsExactType(\"115\", message.getExtension(optionalStringExtension  ));\n    assertEqualsExactType(toBytes(\"116\"), message.getExtension(optionalBytesExtension));\n\n    assertEqualsExactType(117, message.getExtension(optionalGroupExtension         ).getA());\n    assertEqualsExactType(118, message.getExtension(optionalNestedMessageExtension ).getBb());\n    assertEqualsExactType(119, message.getExtension(optionalForeignMessageExtension).getC());\n    assertEqualsExactType(120, message.getExtension(optionalImportMessageExtension ).getD());\n\n    assertEqualsExactType(TestAllTypes.NestedEnum.BAZ,\n      message.getExtension(optionalNestedEnumExtension));\n    assertEqualsExactType(ForeignEnum.FOREIGN_BAZ,\n      message.getExtension(optionalForeignEnumExtension));\n    assertEqualsExactType(ImportEnum.IMPORT_BAZ,\n      message.getExtension(optionalImportEnumExtension));\n\n    assertEqualsExactType(\"124\", message.getExtension(optionalStringPieceExtension));\n    assertEqualsExactType(\"125\", message.getExtension(optionalCordExtension));\n\n    // -----------------------------------------------------------------\n\n    Assert.assertEquals(2, message.getExtensionCount(repeatedInt32Extension   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedInt64Extension   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedUint32Extension  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedUint64Extension  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSint32Extension  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSint64Extension  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedFixed32Extension ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedFixed64Extension ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed32Extension));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed64Extension));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedFloatExtension   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedDoubleExtension  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedBoolExtension    ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedStringExtension  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedBytesExtension   ));\n\n    Assert.assertEquals(2, message.getExtensionCount(repeatedGroupExtension         ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedNestedMessageExtension ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedForeignMessageExtension));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedImportMessageExtension ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedNestedEnumExtension    ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedForeignEnumExtension   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedImportEnumExtension    ));\n\n    Assert.assertEquals(2, message.getExtensionCount(repeatedStringPieceExtension));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedCordExtension));\n\n    assertEqualsExactType(201  , message.getExtension(repeatedInt32Extension   , 0));\n    assertEqualsExactType(202L , message.getExtension(repeatedInt64Extension   , 0));\n    assertEqualsExactType(203  , message.getExtension(repeatedUint32Extension  , 0));\n    assertEqualsExactType(204L , message.getExtension(repeatedUint64Extension  , 0));\n    assertEqualsExactType(205  , message.getExtension(repeatedSint32Extension  , 0));\n    assertEqualsExactType(206L , message.getExtension(repeatedSint64Extension  , 0));\n    assertEqualsExactType(207  , message.getExtension(repeatedFixed32Extension , 0));\n    assertEqualsExactType(208L , message.getExtension(repeatedFixed64Extension , 0));\n    assertEqualsExactType(209  , message.getExtension(repeatedSfixed32Extension, 0));\n    assertEqualsExactType(210L , message.getExtension(repeatedSfixed64Extension, 0));\n    assertEqualsExactType(211F , message.getExtension(repeatedFloatExtension   , 0));\n    assertEqualsExactType(212D , message.getExtension(repeatedDoubleExtension  , 0));\n    assertEqualsExactType(true , message.getExtension(repeatedBoolExtension    , 0));\n    assertEqualsExactType(\"215\", message.getExtension(repeatedStringExtension  , 0));\n    assertEqualsExactType(toBytes(\"216\"), message.getExtension(repeatedBytesExtension, 0));\n\n    assertEqualsExactType(217, message.getExtension(repeatedGroupExtension         , 0).getA());\n    assertEqualsExactType(218, message.getExtension(repeatedNestedMessageExtension , 0).getBb());\n    assertEqualsExactType(219, message.getExtension(repeatedForeignMessageExtension, 0).getC());\n    assertEqualsExactType(220, message.getExtension(repeatedImportMessageExtension , 0).getD());\n\n    assertEqualsExactType(TestAllTypes.NestedEnum.BAR,\n      message.getExtension(repeatedNestedEnumExtension, 0));\n    assertEqualsExactType(ForeignEnum.FOREIGN_BAR,\n      message.getExtension(repeatedForeignEnumExtension, 0));\n    assertEqualsExactType(ImportEnum.IMPORT_BAR,\n      message.getExtension(repeatedImportEnumExtension, 0));\n\n    assertEqualsExactType(\"224\", message.getExtension(repeatedStringPieceExtension, 0));\n    assertEqualsExactType(\"225\", message.getExtension(repeatedCordExtension, 0));\n\n    assertEqualsExactType(301  , message.getExtension(repeatedInt32Extension   , 1));\n    assertEqualsExactType(302L , message.getExtension(repeatedInt64Extension   , 1));\n    assertEqualsExactType(303  , message.getExtension(repeatedUint32Extension  , 1));\n    assertEqualsExactType(304L , message.getExtension(repeatedUint64Extension  , 1));\n    assertEqualsExactType(305  , message.getExtension(repeatedSint32Extension  , 1));\n    assertEqualsExactType(306L , message.getExtension(repeatedSint64Extension  , 1));\n    assertEqualsExactType(307  , message.getExtension(repeatedFixed32Extension , 1));\n    assertEqualsExactType(308L , message.getExtension(repeatedFixed64Extension , 1));\n    assertEqualsExactType(309  , message.getExtension(repeatedSfixed32Extension, 1));\n    assertEqualsExactType(310L , message.getExtension(repeatedSfixed64Extension, 1));\n    assertEqualsExactType(311F , message.getExtension(repeatedFloatExtension   , 1));\n    assertEqualsExactType(312D , message.getExtension(repeatedDoubleExtension  , 1));\n    assertEqualsExactType(false, message.getExtension(repeatedBoolExtension    , 1));\n    assertEqualsExactType(\"315\", message.getExtension(repeatedStringExtension  , 1));\n    assertEqualsExactType(toBytes(\"316\"), message.getExtension(repeatedBytesExtension, 1));\n\n    assertEqualsExactType(317, message.getExtension(repeatedGroupExtension         , 1).getA());\n    assertEqualsExactType(318, message.getExtension(repeatedNestedMessageExtension , 1).getBb());\n    assertEqualsExactType(319, message.getExtension(repeatedForeignMessageExtension, 1).getC());\n    assertEqualsExactType(320, message.getExtension(repeatedImportMessageExtension , 1).getD());\n\n    assertEqualsExactType(TestAllTypes.NestedEnum.BAZ,\n      message.getExtension(repeatedNestedEnumExtension, 1));\n    assertEqualsExactType(ForeignEnum.FOREIGN_BAZ,\n      message.getExtension(repeatedForeignEnumExtension, 1));\n    assertEqualsExactType(ImportEnum.IMPORT_BAZ,\n      message.getExtension(repeatedImportEnumExtension, 1));\n\n    assertEqualsExactType(\"324\", message.getExtension(repeatedStringPieceExtension, 1));\n    assertEqualsExactType(\"325\", message.getExtension(repeatedCordExtension, 1));\n\n    // -----------------------------------------------------------------\n\n    Assert.assertTrue(message.hasExtension(defaultInt32Extension   ));\n    Assert.assertTrue(message.hasExtension(defaultInt64Extension   ));\n    Assert.assertTrue(message.hasExtension(defaultUint32Extension  ));\n    Assert.assertTrue(message.hasExtension(defaultUint64Extension  ));\n    Assert.assertTrue(message.hasExtension(defaultSint32Extension  ));\n    Assert.assertTrue(message.hasExtension(defaultSint64Extension  ));\n    Assert.assertTrue(message.hasExtension(defaultFixed32Extension ));\n    Assert.assertTrue(message.hasExtension(defaultFixed64Extension ));\n    Assert.assertTrue(message.hasExtension(defaultSfixed32Extension));\n    Assert.assertTrue(message.hasExtension(defaultSfixed64Extension));\n    Assert.assertTrue(message.hasExtension(defaultFloatExtension   ));\n    Assert.assertTrue(message.hasExtension(defaultDoubleExtension  ));\n    Assert.assertTrue(message.hasExtension(defaultBoolExtension    ));\n    Assert.assertTrue(message.hasExtension(defaultStringExtension  ));\n    Assert.assertTrue(message.hasExtension(defaultBytesExtension   ));\n\n    Assert.assertTrue(message.hasExtension(defaultNestedEnumExtension ));\n    Assert.assertTrue(message.hasExtension(defaultForeignEnumExtension));\n    Assert.assertTrue(message.hasExtension(defaultImportEnumExtension ));\n\n    Assert.assertTrue(message.hasExtension(defaultStringPieceExtension));\n    Assert.assertTrue(message.hasExtension(defaultCordExtension));\n\n    assertEqualsExactType(401  , message.getExtension(defaultInt32Extension   ));\n    assertEqualsExactType(402L , message.getExtension(defaultInt64Extension   ));\n    assertEqualsExactType(403  , message.getExtension(defaultUint32Extension  ));\n    assertEqualsExactType(404L , message.getExtension(defaultUint64Extension  ));\n    assertEqualsExactType(405  , message.getExtension(defaultSint32Extension  ));\n    assertEqualsExactType(406L , message.getExtension(defaultSint64Extension  ));\n    assertEqualsExactType(407  , message.getExtension(defaultFixed32Extension ));\n    assertEqualsExactType(408L , message.getExtension(defaultFixed64Extension ));\n    assertEqualsExactType(409  , message.getExtension(defaultSfixed32Extension));\n    assertEqualsExactType(410L , message.getExtension(defaultSfixed64Extension));\n    assertEqualsExactType(411F , message.getExtension(defaultFloatExtension   ));\n    assertEqualsExactType(412D , message.getExtension(defaultDoubleExtension  ));\n    assertEqualsExactType(false, message.getExtension(defaultBoolExtension    ));\n    assertEqualsExactType(\"415\", message.getExtension(defaultStringExtension  ));\n    assertEqualsExactType(toBytes(\"416\"), message.getExtension(defaultBytesExtension));\n\n    assertEqualsExactType(TestAllTypes.NestedEnum.FOO,\n      message.getExtension(defaultNestedEnumExtension ));\n    assertEqualsExactType(ForeignEnum.FOREIGN_FOO,\n      message.getExtension(defaultForeignEnumExtension));\n    assertEqualsExactType(ImportEnum.IMPORT_FOO,\n      message.getExtension(defaultImportEnumExtension));\n\n    assertEqualsExactType(\"424\", message.getExtension(defaultStringPieceExtension));\n    assertEqualsExactType(\"425\", message.getExtension(defaultCordExtension));\n  }\n\n  // -------------------------------------------------------------------\n\n  /**\n   * Assert (using {@code junit.framework.Assert}} that all extensions of\n   * {@code message} are cleared, and that getting the extensions returns their\n   * default values.\n   */\n  public static void assertExtensionsClear(TestAllExtensionsOrBuilder message) {\n    // hasBlah() should initially be false for all optional fields.\n    Assert.assertFalse(message.hasExtension(optionalInt32Extension   ));\n    Assert.assertFalse(message.hasExtension(optionalInt64Extension   ));\n    Assert.assertFalse(message.hasExtension(optionalUint32Extension  ));\n    Assert.assertFalse(message.hasExtension(optionalUint64Extension  ));\n    Assert.assertFalse(message.hasExtension(optionalSint32Extension  ));\n    Assert.assertFalse(message.hasExtension(optionalSint64Extension  ));\n    Assert.assertFalse(message.hasExtension(optionalFixed32Extension ));\n    Assert.assertFalse(message.hasExtension(optionalFixed64Extension ));\n    Assert.assertFalse(message.hasExtension(optionalSfixed32Extension));\n    Assert.assertFalse(message.hasExtension(optionalSfixed64Extension));\n    Assert.assertFalse(message.hasExtension(optionalFloatExtension   ));\n    Assert.assertFalse(message.hasExtension(optionalDoubleExtension  ));\n    Assert.assertFalse(message.hasExtension(optionalBoolExtension    ));\n    Assert.assertFalse(message.hasExtension(optionalStringExtension  ));\n    Assert.assertFalse(message.hasExtension(optionalBytesExtension   ));\n\n    Assert.assertFalse(message.hasExtension(optionalGroupExtension         ));\n    Assert.assertFalse(message.hasExtension(optionalNestedMessageExtension ));\n    Assert.assertFalse(message.hasExtension(optionalForeignMessageExtension));\n    Assert.assertFalse(message.hasExtension(optionalImportMessageExtension ));\n\n    Assert.assertFalse(message.hasExtension(optionalNestedEnumExtension ));\n    Assert.assertFalse(message.hasExtension(optionalForeignEnumExtension));\n    Assert.assertFalse(message.hasExtension(optionalImportEnumExtension ));\n\n    Assert.assertFalse(message.hasExtension(optionalStringPieceExtension));\n    Assert.assertFalse(message.hasExtension(optionalCordExtension));\n\n    // Optional fields without defaults are set to zero or something like it.\n    assertEqualsExactType(0    , message.getExtension(optionalInt32Extension   ));\n    assertEqualsExactType(0L   , message.getExtension(optionalInt64Extension   ));\n    assertEqualsExactType(0    , message.getExtension(optionalUint32Extension  ));\n    assertEqualsExactType(0L   , message.getExtension(optionalUint64Extension  ));\n    assertEqualsExactType(0    , message.getExtension(optionalSint32Extension  ));\n    assertEqualsExactType(0L   , message.getExtension(optionalSint64Extension  ));\n    assertEqualsExactType(0    , message.getExtension(optionalFixed32Extension ));\n    assertEqualsExactType(0L   , message.getExtension(optionalFixed64Extension ));\n    assertEqualsExactType(0    , message.getExtension(optionalSfixed32Extension));\n    assertEqualsExactType(0L   , message.getExtension(optionalSfixed64Extension));\n    assertEqualsExactType(0F   , message.getExtension(optionalFloatExtension   ));\n    assertEqualsExactType(0D   , message.getExtension(optionalDoubleExtension  ));\n    assertEqualsExactType(false, message.getExtension(optionalBoolExtension    ));\n    assertEqualsExactType(\"\"   , message.getExtension(optionalStringExtension  ));\n    assertEqualsExactType(ByteString.EMPTY, message.getExtension(optionalBytesExtension));\n\n    // Embedded messages should also be clear.\n    Assert.assertFalse(message.getExtension(optionalGroupExtension         ).hasA());\n    Assert.assertFalse(message.getExtension(optionalNestedMessageExtension ).hasBb());\n    Assert.assertFalse(message.getExtension(optionalForeignMessageExtension).hasC());\n    Assert.assertFalse(message.getExtension(optionalImportMessageExtension ).hasD());\n\n    assertEqualsExactType(0, message.getExtension(optionalGroupExtension         ).getA());\n    assertEqualsExactType(0, message.getExtension(optionalNestedMessageExtension ).getBb());\n    assertEqualsExactType(0, message.getExtension(optionalForeignMessageExtension).getC());\n    assertEqualsExactType(0, message.getExtension(optionalImportMessageExtension ).getD());\n\n    // Enums without defaults are set to the first value in the enum.\n    assertEqualsExactType(TestAllTypes.NestedEnum.FOO,\n      message.getExtension(optionalNestedEnumExtension ));\n    assertEqualsExactType(ForeignEnum.FOREIGN_FOO,\n      message.getExtension(optionalForeignEnumExtension));\n    assertEqualsExactType(ImportEnum.IMPORT_FOO,\n      message.getExtension(optionalImportEnumExtension));\n\n    assertEqualsExactType(\"\", message.getExtension(optionalStringPieceExtension));\n    assertEqualsExactType(\"\", message.getExtension(optionalCordExtension));\n\n    // Repeated fields are empty.\n    Assert.assertEquals(0, message.getExtensionCount(repeatedInt32Extension   ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedInt64Extension   ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedUint32Extension  ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedUint64Extension  ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedSint32Extension  ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedSint64Extension  ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedFixed32Extension ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedFixed64Extension ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedSfixed32Extension));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedSfixed64Extension));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedFloatExtension   ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedDoubleExtension  ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedBoolExtension    ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedStringExtension  ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedBytesExtension   ));\n\n    Assert.assertEquals(0, message.getExtensionCount(repeatedGroupExtension         ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedNestedMessageExtension ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedForeignMessageExtension));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedImportMessageExtension ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedNestedEnumExtension    ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedForeignEnumExtension   ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedImportEnumExtension    ));\n\n    Assert.assertEquals(0, message.getExtensionCount(repeatedStringPieceExtension));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedCordExtension));\n\n    // Repeated fields are empty via getExtension().size().\n    Assert.assertEquals(0, message.getExtension(repeatedInt32Extension   ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedInt64Extension   ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedUint32Extension  ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedUint64Extension  ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedSint32Extension  ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedSint64Extension  ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedFixed32Extension ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedFixed64Extension ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedSfixed32Extension).size());\n    Assert.assertEquals(0, message.getExtension(repeatedSfixed64Extension).size());\n    Assert.assertEquals(0, message.getExtension(repeatedFloatExtension   ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedDoubleExtension  ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedBoolExtension    ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedStringExtension  ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedBytesExtension   ).size());\n\n    Assert.assertEquals(0, message.getExtension(repeatedGroupExtension         ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedNestedMessageExtension ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedForeignMessageExtension).size());\n    Assert.assertEquals(0, message.getExtension(repeatedImportMessageExtension ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedNestedEnumExtension    ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedForeignEnumExtension   ).size());\n    Assert.assertEquals(0, message.getExtension(repeatedImportEnumExtension    ).size());\n\n    Assert.assertEquals(0, message.getExtension(repeatedStringPieceExtension).size());\n    Assert.assertEquals(0, message.getExtension(repeatedCordExtension).size());\n\n    // hasBlah() should also be false for all default fields.\n    Assert.assertFalse(message.hasExtension(defaultInt32Extension   ));\n    Assert.assertFalse(message.hasExtension(defaultInt64Extension   ));\n    Assert.assertFalse(message.hasExtension(defaultUint32Extension  ));\n    Assert.assertFalse(message.hasExtension(defaultUint64Extension  ));\n    Assert.assertFalse(message.hasExtension(defaultSint32Extension  ));\n    Assert.assertFalse(message.hasExtension(defaultSint64Extension  ));\n    Assert.assertFalse(message.hasExtension(defaultFixed32Extension ));\n    Assert.assertFalse(message.hasExtension(defaultFixed64Extension ));\n    Assert.assertFalse(message.hasExtension(defaultSfixed32Extension));\n    Assert.assertFalse(message.hasExtension(defaultSfixed64Extension));\n    Assert.assertFalse(message.hasExtension(defaultFloatExtension   ));\n    Assert.assertFalse(message.hasExtension(defaultDoubleExtension  ));\n    Assert.assertFalse(message.hasExtension(defaultBoolExtension    ));\n    Assert.assertFalse(message.hasExtension(defaultStringExtension  ));\n    Assert.assertFalse(message.hasExtension(defaultBytesExtension   ));\n\n    Assert.assertFalse(message.hasExtension(defaultNestedEnumExtension ));\n    Assert.assertFalse(message.hasExtension(defaultForeignEnumExtension));\n    Assert.assertFalse(message.hasExtension(defaultImportEnumExtension ));\n\n    Assert.assertFalse(message.hasExtension(defaultStringPieceExtension));\n    Assert.assertFalse(message.hasExtension(defaultCordExtension));\n\n    // Fields with defaults have their default values (duh).\n    assertEqualsExactType( 41    , message.getExtension(defaultInt32Extension   ));\n    assertEqualsExactType( 42L   , message.getExtension(defaultInt64Extension   ));\n    assertEqualsExactType( 43    , message.getExtension(defaultUint32Extension  ));\n    assertEqualsExactType( 44L   , message.getExtension(defaultUint64Extension  ));\n    assertEqualsExactType(-45    , message.getExtension(defaultSint32Extension  ));\n    assertEqualsExactType( 46L   , message.getExtension(defaultSint64Extension  ));\n    assertEqualsExactType( 47    , message.getExtension(defaultFixed32Extension ));\n    assertEqualsExactType( 48L   , message.getExtension(defaultFixed64Extension ));\n    assertEqualsExactType( 49    , message.getExtension(defaultSfixed32Extension));\n    assertEqualsExactType(-50L   , message.getExtension(defaultSfixed64Extension));\n    assertEqualsExactType( 51.5F , message.getExtension(defaultFloatExtension   ));\n    assertEqualsExactType( 52e3D , message.getExtension(defaultDoubleExtension  ));\n    assertEqualsExactType(true   , message.getExtension(defaultBoolExtension    ));\n    assertEqualsExactType(\"hello\", message.getExtension(defaultStringExtension  ));\n    assertEqualsExactType(toBytes(\"world\"), message.getExtension(defaultBytesExtension));\n\n    assertEqualsExactType(TestAllTypes.NestedEnum.BAR,\n      message.getExtension(defaultNestedEnumExtension ));\n    assertEqualsExactType(ForeignEnum.FOREIGN_BAR,\n      message.getExtension(defaultForeignEnumExtension));\n    assertEqualsExactType(ImportEnum.IMPORT_BAR,\n      message.getExtension(defaultImportEnumExtension));\n\n    assertEqualsExactType(\"abc\", message.getExtension(defaultStringPieceExtension));\n    assertEqualsExactType(\"123\", message.getExtension(defaultCordExtension));\n  }\n\n  // -------------------------------------------------------------------\n\n  /**\n   * Assert (using {@code junit.framework.Assert}} that all extensions of\n   * {@code message} are set to the values assigned by {@code setAllExtensions}\n   * followed by {@code modifyRepeatedExtensions}.\n   */\n  public static void assertRepeatedExtensionsModified(\n      TestAllExtensionsOrBuilder message) {\n    // ModifyRepeatedFields only sets the second repeated element of each\n    // field.  In addition to verifying this, we also verify that the first\n    // element and size were *not* modified.\n    Assert.assertEquals(2, message.getExtensionCount(repeatedInt32Extension   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedInt64Extension   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedUint32Extension  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedUint64Extension  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSint32Extension  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSint64Extension  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedFixed32Extension ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedFixed64Extension ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed32Extension));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed64Extension));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedFloatExtension   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedDoubleExtension  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedBoolExtension    ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedStringExtension  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedBytesExtension   ));\n\n    Assert.assertEquals(2, message.getExtensionCount(repeatedGroupExtension         ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedNestedMessageExtension ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedForeignMessageExtension));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedImportMessageExtension ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedNestedEnumExtension    ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedForeignEnumExtension   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedImportEnumExtension    ));\n\n    Assert.assertEquals(2, message.getExtensionCount(repeatedStringPieceExtension));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedCordExtension));\n\n    assertEqualsExactType(201  , message.getExtension(repeatedInt32Extension   , 0));\n    assertEqualsExactType(202L , message.getExtension(repeatedInt64Extension   , 0));\n    assertEqualsExactType(203  , message.getExtension(repeatedUint32Extension  , 0));\n    assertEqualsExactType(204L , message.getExtension(repeatedUint64Extension  , 0));\n    assertEqualsExactType(205  , message.getExtension(repeatedSint32Extension  , 0));\n    assertEqualsExactType(206L , message.getExtension(repeatedSint64Extension  , 0));\n    assertEqualsExactType(207  , message.getExtension(repeatedFixed32Extension , 0));\n    assertEqualsExactType(208L , message.getExtension(repeatedFixed64Extension , 0));\n    assertEqualsExactType(209  , message.getExtension(repeatedSfixed32Extension, 0));\n    assertEqualsExactType(210L , message.getExtension(repeatedSfixed64Extension, 0));\n    assertEqualsExactType(211F , message.getExtension(repeatedFloatExtension   , 0));\n    assertEqualsExactType(212D , message.getExtension(repeatedDoubleExtension  , 0));\n    assertEqualsExactType(true , message.getExtension(repeatedBoolExtension    , 0));\n    assertEqualsExactType(\"215\", message.getExtension(repeatedStringExtension  , 0));\n    assertEqualsExactType(toBytes(\"216\"), message.getExtension(repeatedBytesExtension, 0));\n\n    assertEqualsExactType(217, message.getExtension(repeatedGroupExtension         , 0).getA());\n    assertEqualsExactType(218, message.getExtension(repeatedNestedMessageExtension , 0).getBb());\n    assertEqualsExactType(219, message.getExtension(repeatedForeignMessageExtension, 0).getC());\n    assertEqualsExactType(220, message.getExtension(repeatedImportMessageExtension , 0).getD());\n\n    assertEqualsExactType(TestAllTypes.NestedEnum.BAR,\n      message.getExtension(repeatedNestedEnumExtension, 0));\n    assertEqualsExactType(ForeignEnum.FOREIGN_BAR,\n      message.getExtension(repeatedForeignEnumExtension, 0));\n    assertEqualsExactType(ImportEnum.IMPORT_BAR,\n      message.getExtension(repeatedImportEnumExtension, 0));\n\n    assertEqualsExactType(\"224\", message.getExtension(repeatedStringPieceExtension, 0));\n    assertEqualsExactType(\"225\", message.getExtension(repeatedCordExtension, 0));\n\n    // Actually verify the second (modified) elements now.\n    assertEqualsExactType(501  , message.getExtension(repeatedInt32Extension   , 1));\n    assertEqualsExactType(502L , message.getExtension(repeatedInt64Extension   , 1));\n    assertEqualsExactType(503  , message.getExtension(repeatedUint32Extension  , 1));\n    assertEqualsExactType(504L , message.getExtension(repeatedUint64Extension  , 1));\n    assertEqualsExactType(505  , message.getExtension(repeatedSint32Extension  , 1));\n    assertEqualsExactType(506L , message.getExtension(repeatedSint64Extension  , 1));\n    assertEqualsExactType(507  , message.getExtension(repeatedFixed32Extension , 1));\n    assertEqualsExactType(508L , message.getExtension(repeatedFixed64Extension , 1));\n    assertEqualsExactType(509  , message.getExtension(repeatedSfixed32Extension, 1));\n    assertEqualsExactType(510L , message.getExtension(repeatedSfixed64Extension, 1));\n    assertEqualsExactType(511F , message.getExtension(repeatedFloatExtension   , 1));\n    assertEqualsExactType(512D , message.getExtension(repeatedDoubleExtension  , 1));\n    assertEqualsExactType(true , message.getExtension(repeatedBoolExtension    , 1));\n    assertEqualsExactType(\"515\", message.getExtension(repeatedStringExtension  , 1));\n    assertEqualsExactType(toBytes(\"516\"), message.getExtension(repeatedBytesExtension, 1));\n\n    assertEqualsExactType(517, message.getExtension(repeatedGroupExtension         , 1).getA());\n    assertEqualsExactType(518, message.getExtension(repeatedNestedMessageExtension , 1).getBb());\n    assertEqualsExactType(519, message.getExtension(repeatedForeignMessageExtension, 1).getC());\n    assertEqualsExactType(520, message.getExtension(repeatedImportMessageExtension , 1).getD());\n\n    assertEqualsExactType(TestAllTypes.NestedEnum.FOO,\n      message.getExtension(repeatedNestedEnumExtension, 1));\n    assertEqualsExactType(ForeignEnum.FOREIGN_FOO,\n      message.getExtension(repeatedForeignEnumExtension, 1));\n    assertEqualsExactType(ImportEnum.IMPORT_FOO,\n      message.getExtension(repeatedImportEnumExtension, 1));\n\n    assertEqualsExactType(\"524\", message.getExtension(repeatedStringPieceExtension, 1));\n    assertEqualsExactType(\"525\", message.getExtension(repeatedCordExtension, 1));\n  }\n\n  public static void setPackedExtensions(TestPackedExtensions.Builder message) {\n    message.addExtension(packedInt32Extension   , 601);\n    message.addExtension(packedInt64Extension   , 602L);\n    message.addExtension(packedUint32Extension  , 603);\n    message.addExtension(packedUint64Extension  , 604L);\n    message.addExtension(packedSint32Extension  , 605);\n    message.addExtension(packedSint64Extension  , 606L);\n    message.addExtension(packedFixed32Extension , 607);\n    message.addExtension(packedFixed64Extension , 608L);\n    message.addExtension(packedSfixed32Extension, 609);\n    message.addExtension(packedSfixed64Extension, 610L);\n    message.addExtension(packedFloatExtension   , 611F);\n    message.addExtension(packedDoubleExtension  , 612D);\n    message.addExtension(packedBoolExtension    , true);\n    message.addExtension(packedEnumExtension, ForeignEnum.FOREIGN_BAR);\n    // Add a second one of each field.\n    message.addExtension(packedInt32Extension   , 701);\n    message.addExtension(packedInt64Extension   , 702L);\n    message.addExtension(packedUint32Extension  , 703);\n    message.addExtension(packedUint64Extension  , 704L);\n    message.addExtension(packedSint32Extension  , 705);\n    message.addExtension(packedSint64Extension  , 706L);\n    message.addExtension(packedFixed32Extension , 707);\n    message.addExtension(packedFixed64Extension , 708L);\n    message.addExtension(packedSfixed32Extension, 709);\n    message.addExtension(packedSfixed64Extension, 710L);\n    message.addExtension(packedFloatExtension   , 711F);\n    message.addExtension(packedDoubleExtension  , 712D);\n    message.addExtension(packedBoolExtension    , false);\n    message.addExtension(packedEnumExtension, ForeignEnum.FOREIGN_BAZ);\n  }\n\n  public static void assertPackedExtensionsSet(TestPackedExtensions message) {\n    Assert.assertEquals(2, message.getExtensionCount(packedInt32Extension   ));\n    Assert.assertEquals(2, message.getExtensionCount(packedInt64Extension   ));\n    Assert.assertEquals(2, message.getExtensionCount(packedUint32Extension  ));\n    Assert.assertEquals(2, message.getExtensionCount(packedUint64Extension  ));\n    Assert.assertEquals(2, message.getExtensionCount(packedSint32Extension  ));\n    Assert.assertEquals(2, message.getExtensionCount(packedSint64Extension  ));\n    Assert.assertEquals(2, message.getExtensionCount(packedFixed32Extension ));\n    Assert.assertEquals(2, message.getExtensionCount(packedFixed64Extension ));\n    Assert.assertEquals(2, message.getExtensionCount(packedSfixed32Extension));\n    Assert.assertEquals(2, message.getExtensionCount(packedSfixed64Extension));\n    Assert.assertEquals(2, message.getExtensionCount(packedFloatExtension   ));\n    Assert.assertEquals(2, message.getExtensionCount(packedDoubleExtension  ));\n    Assert.assertEquals(2, message.getExtensionCount(packedBoolExtension    ));\n    Assert.assertEquals(2, message.getExtensionCount(packedEnumExtension));\n    assertEqualsExactType(601  , message.getExtension(packedInt32Extension   , 0));\n    assertEqualsExactType(602L , message.getExtension(packedInt64Extension   , 0));\n    assertEqualsExactType(603  , message.getExtension(packedUint32Extension  , 0));\n    assertEqualsExactType(604L , message.getExtension(packedUint64Extension  , 0));\n    assertEqualsExactType(605  , message.getExtension(packedSint32Extension  , 0));\n    assertEqualsExactType(606L , message.getExtension(packedSint64Extension  , 0));\n    assertEqualsExactType(607  , message.getExtension(packedFixed32Extension , 0));\n    assertEqualsExactType(608L , message.getExtension(packedFixed64Extension , 0));\n    assertEqualsExactType(609  , message.getExtension(packedSfixed32Extension, 0));\n    assertEqualsExactType(610L , message.getExtension(packedSfixed64Extension, 0));\n    assertEqualsExactType(611F , message.getExtension(packedFloatExtension   , 0));\n    assertEqualsExactType(612D , message.getExtension(packedDoubleExtension  , 0));\n    assertEqualsExactType(true , message.getExtension(packedBoolExtension    , 0));\n    assertEqualsExactType(ForeignEnum.FOREIGN_BAR,\n                          message.getExtension(packedEnumExtension, 0));\n    assertEqualsExactType(701  , message.getExtension(packedInt32Extension   , 1));\n    assertEqualsExactType(702L , message.getExtension(packedInt64Extension   , 1));\n    assertEqualsExactType(703  , message.getExtension(packedUint32Extension  , 1));\n    assertEqualsExactType(704L , message.getExtension(packedUint64Extension  , 1));\n    assertEqualsExactType(705  , message.getExtension(packedSint32Extension  , 1));\n    assertEqualsExactType(706L , message.getExtension(packedSint64Extension  , 1));\n    assertEqualsExactType(707  , message.getExtension(packedFixed32Extension , 1));\n    assertEqualsExactType(708L , message.getExtension(packedFixed64Extension , 1));\n    assertEqualsExactType(709  , message.getExtension(packedSfixed32Extension, 1));\n    assertEqualsExactType(710L , message.getExtension(packedSfixed64Extension, 1));\n    assertEqualsExactType(711F , message.getExtension(packedFloatExtension   , 1));\n    assertEqualsExactType(712D , message.getExtension(packedDoubleExtension  , 1));\n    assertEqualsExactType(false, message.getExtension(packedBoolExtension    , 1));\n    assertEqualsExactType(ForeignEnum.FOREIGN_BAZ,\n                          message.getExtension(packedEnumExtension, 1));\n  }\n\n  // ===================================================================\n  // Lite extensions\n\n  /**\n   * Set every field of {@code message} to the values expected by\n   * {@code assertAllExtensionsSet()}.\n   */\n  public static void setAllExtensions(TestAllExtensionsLite.Builder message) {\n    message.setExtension(optionalInt32ExtensionLite   , 101);\n    message.setExtension(optionalInt64ExtensionLite   , 102L);\n    message.setExtension(optionalUint32ExtensionLite  , 103);\n    message.setExtension(optionalUint64ExtensionLite  , 104L);\n    message.setExtension(optionalSint32ExtensionLite  , 105);\n    message.setExtension(optionalSint64ExtensionLite  , 106L);\n    message.setExtension(optionalFixed32ExtensionLite , 107);\n    message.setExtension(optionalFixed64ExtensionLite , 108L);\n    message.setExtension(optionalSfixed32ExtensionLite, 109);\n    message.setExtension(optionalSfixed64ExtensionLite, 110L);\n    message.setExtension(optionalFloatExtensionLite   , 111F);\n    message.setExtension(optionalDoubleExtensionLite  , 112D);\n    message.setExtension(optionalBoolExtensionLite    , true);\n    message.setExtension(optionalStringExtensionLite  , \"115\");\n    message.setExtension(optionalBytesExtensionLite   , toBytes(\"116\"));\n\n    message.setExtension(optionalGroupExtensionLite,\n      OptionalGroup_extension_lite.newBuilder().setA(117).build());\n    message.setExtension(optionalNestedMessageExtensionLite,\n      TestAllTypesLite.NestedMessage.newBuilder().setBb(118).build());\n    message.setExtension(optionalForeignMessageExtensionLite,\n      ForeignMessageLite.newBuilder().setC(119).build());\n    message.setExtension(optionalImportMessageExtensionLite,\n      ImportMessageLite.newBuilder().setD(120).build());\n\n    message.setExtension(optionalNestedEnumExtensionLite, TestAllTypesLite.NestedEnum.BAZ);\n    message.setExtension(optionalForeignEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_BAZ);\n    message.setExtension(optionalImportEnumExtensionLite, ImportEnumLite.IMPORT_LITE_BAZ);\n\n    message.setExtension(optionalStringPieceExtensionLite, \"124\");\n    message.setExtension(optionalCordExtensionLite, \"125\");\n\n    // -----------------------------------------------------------------\n\n    message.addExtension(repeatedInt32ExtensionLite   , 201);\n    message.addExtension(repeatedInt64ExtensionLite   , 202L);\n    message.addExtension(repeatedUint32ExtensionLite  , 203);\n    message.addExtension(repeatedUint64ExtensionLite  , 204L);\n    message.addExtension(repeatedSint32ExtensionLite  , 205);\n    message.addExtension(repeatedSint64ExtensionLite  , 206L);\n    message.addExtension(repeatedFixed32ExtensionLite , 207);\n    message.addExtension(repeatedFixed64ExtensionLite , 208L);\n    message.addExtension(repeatedSfixed32ExtensionLite, 209);\n    message.addExtension(repeatedSfixed64ExtensionLite, 210L);\n    message.addExtension(repeatedFloatExtensionLite   , 211F);\n    message.addExtension(repeatedDoubleExtensionLite  , 212D);\n    message.addExtension(repeatedBoolExtensionLite    , true);\n    message.addExtension(repeatedStringExtensionLite  , \"215\");\n    message.addExtension(repeatedBytesExtensionLite   , toBytes(\"216\"));\n\n    message.addExtension(repeatedGroupExtensionLite,\n      RepeatedGroup_extension_lite.newBuilder().setA(217).build());\n    message.addExtension(repeatedNestedMessageExtensionLite,\n      TestAllTypesLite.NestedMessage.newBuilder().setBb(218).build());\n    message.addExtension(repeatedForeignMessageExtensionLite,\n      ForeignMessageLite.newBuilder().setC(219).build());\n    message.addExtension(repeatedImportMessageExtensionLite,\n      ImportMessageLite.newBuilder().setD(220).build());\n\n    message.addExtension(repeatedNestedEnumExtensionLite, TestAllTypesLite.NestedEnum.BAR);\n    message.addExtension(repeatedForeignEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_BAR);\n    message.addExtension(repeatedImportEnumExtensionLite, ImportEnumLite.IMPORT_LITE_BAR);\n\n    message.addExtension(repeatedStringPieceExtensionLite, \"224\");\n    message.addExtension(repeatedCordExtensionLite, \"225\");\n\n    // Add a second one of each field.\n    message.addExtension(repeatedInt32ExtensionLite   , 301);\n    message.addExtension(repeatedInt64ExtensionLite   , 302L);\n    message.addExtension(repeatedUint32ExtensionLite  , 303);\n    message.addExtension(repeatedUint64ExtensionLite  , 304L);\n    message.addExtension(repeatedSint32ExtensionLite  , 305);\n    message.addExtension(repeatedSint64ExtensionLite  , 306L);\n    message.addExtension(repeatedFixed32ExtensionLite , 307);\n    message.addExtension(repeatedFixed64ExtensionLite , 308L);\n    message.addExtension(repeatedSfixed32ExtensionLite, 309);\n    message.addExtension(repeatedSfixed64ExtensionLite, 310L);\n    message.addExtension(repeatedFloatExtensionLite   , 311F);\n    message.addExtension(repeatedDoubleExtensionLite  , 312D);\n    message.addExtension(repeatedBoolExtensionLite    , false);\n    message.addExtension(repeatedStringExtensionLite  , \"315\");\n    message.addExtension(repeatedBytesExtensionLite   , toBytes(\"316\"));\n\n    message.addExtension(repeatedGroupExtensionLite,\n      RepeatedGroup_extension_lite.newBuilder().setA(317).build());\n    message.addExtension(repeatedNestedMessageExtensionLite,\n      TestAllTypesLite.NestedMessage.newBuilder().setBb(318).build());\n    message.addExtension(repeatedForeignMessageExtensionLite,\n      ForeignMessageLite.newBuilder().setC(319).build());\n    message.addExtension(repeatedImportMessageExtensionLite,\n      ImportMessageLite.newBuilder().setD(320).build());\n\n    message.addExtension(repeatedNestedEnumExtensionLite, TestAllTypesLite.NestedEnum.BAZ);\n    message.addExtension(repeatedForeignEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_BAZ);\n    message.addExtension(repeatedImportEnumExtensionLite, ImportEnumLite.IMPORT_LITE_BAZ);\n\n    message.addExtension(repeatedStringPieceExtensionLite, \"324\");\n    message.addExtension(repeatedCordExtensionLite, \"325\");\n\n    // -----------------------------------------------------------------\n\n    message.setExtension(defaultInt32ExtensionLite   , 401);\n    message.setExtension(defaultInt64ExtensionLite   , 402L);\n    message.setExtension(defaultUint32ExtensionLite  , 403);\n    message.setExtension(defaultUint64ExtensionLite  , 404L);\n    message.setExtension(defaultSint32ExtensionLite  , 405);\n    message.setExtension(defaultSint64ExtensionLite  , 406L);\n    message.setExtension(defaultFixed32ExtensionLite , 407);\n    message.setExtension(defaultFixed64ExtensionLite , 408L);\n    message.setExtension(defaultSfixed32ExtensionLite, 409);\n    message.setExtension(defaultSfixed64ExtensionLite, 410L);\n    message.setExtension(defaultFloatExtensionLite   , 411F);\n    message.setExtension(defaultDoubleExtensionLite  , 412D);\n    message.setExtension(defaultBoolExtensionLite    , false);\n    message.setExtension(defaultStringExtensionLite  , \"415\");\n    message.setExtension(defaultBytesExtensionLite   , toBytes(\"416\"));\n\n    message.setExtension(defaultNestedEnumExtensionLite, TestAllTypesLite.NestedEnum.FOO);\n    message.setExtension(defaultForeignEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_FOO);\n    message.setExtension(defaultImportEnumExtensionLite, ImportEnumLite.IMPORT_LITE_FOO);\n\n    message.setExtension(defaultStringPieceExtensionLite, \"424\");\n    message.setExtension(defaultCordExtensionLite, \"425\");\n  }\n\n  // -------------------------------------------------------------------\n\n  /**\n   * Modify the repeated extensions of {@code message} to contain the values\n   * expected by {@code assertRepeatedExtensionsModified()}.\n   */\n  public static void modifyRepeatedExtensions(\n      TestAllExtensionsLite.Builder message) {\n    message.setExtension(repeatedInt32ExtensionLite   , 1, 501);\n    message.setExtension(repeatedInt64ExtensionLite   , 1, 502L);\n    message.setExtension(repeatedUint32ExtensionLite  , 1, 503);\n    message.setExtension(repeatedUint64ExtensionLite  , 1, 504L);\n    message.setExtension(repeatedSint32ExtensionLite  , 1, 505);\n    message.setExtension(repeatedSint64ExtensionLite  , 1, 506L);\n    message.setExtension(repeatedFixed32ExtensionLite , 1, 507);\n    message.setExtension(repeatedFixed64ExtensionLite , 1, 508L);\n    message.setExtension(repeatedSfixed32ExtensionLite, 1, 509);\n    message.setExtension(repeatedSfixed64ExtensionLite, 1, 510L);\n    message.setExtension(repeatedFloatExtensionLite   , 1, 511F);\n    message.setExtension(repeatedDoubleExtensionLite  , 1, 512D);\n    message.setExtension(repeatedBoolExtensionLite    , 1, true);\n    message.setExtension(repeatedStringExtensionLite  , 1, \"515\");\n    message.setExtension(repeatedBytesExtensionLite   , 1, toBytes(\"516\"));\n\n    message.setExtension(repeatedGroupExtensionLite, 1,\n      RepeatedGroup_extension_lite.newBuilder().setA(517).build());\n    message.setExtension(repeatedNestedMessageExtensionLite, 1,\n      TestAllTypesLite.NestedMessage.newBuilder().setBb(518).build());\n    message.setExtension(repeatedForeignMessageExtensionLite, 1,\n      ForeignMessageLite.newBuilder().setC(519).build());\n    message.setExtension(repeatedImportMessageExtensionLite, 1,\n      ImportMessageLite.newBuilder().setD(520).build());\n\n    message.setExtension(repeatedNestedEnumExtensionLite , 1, TestAllTypesLite.NestedEnum.FOO);\n    message.setExtension(repeatedForeignEnumExtensionLite, 1, ForeignEnumLite.FOREIGN_LITE_FOO);\n    message.setExtension(repeatedImportEnumExtensionLite , 1, ImportEnumLite.IMPORT_LITE_FOO);\n\n    message.setExtension(repeatedStringPieceExtensionLite, 1, \"524\");\n    message.setExtension(repeatedCordExtensionLite, 1, \"525\");\n  }\n\n  // -------------------------------------------------------------------\n\n  /**\n   * Assert (using {@code junit.framework.Assert}} that all extensions of\n   * {@code message} are set to the values assigned by {@code setAllExtensions}.\n   */\n  public static void assertAllExtensionsSet(\n      TestAllExtensionsLiteOrBuilder message) {\n    Assert.assertTrue(message.hasExtension(optionalInt32ExtensionLite   ));\n    Assert.assertTrue(message.hasExtension(optionalInt64ExtensionLite   ));\n    Assert.assertTrue(message.hasExtension(optionalUint32ExtensionLite  ));\n    Assert.assertTrue(message.hasExtension(optionalUint64ExtensionLite  ));\n    Assert.assertTrue(message.hasExtension(optionalSint32ExtensionLite  ));\n    Assert.assertTrue(message.hasExtension(optionalSint64ExtensionLite  ));\n    Assert.assertTrue(message.hasExtension(optionalFixed32ExtensionLite ));\n    Assert.assertTrue(message.hasExtension(optionalFixed64ExtensionLite ));\n    Assert.assertTrue(message.hasExtension(optionalSfixed32ExtensionLite));\n    Assert.assertTrue(message.hasExtension(optionalSfixed64ExtensionLite));\n    Assert.assertTrue(message.hasExtension(optionalFloatExtensionLite   ));\n    Assert.assertTrue(message.hasExtension(optionalDoubleExtensionLite  ));\n    Assert.assertTrue(message.hasExtension(optionalBoolExtensionLite    ));\n    Assert.assertTrue(message.hasExtension(optionalStringExtensionLite  ));\n    Assert.assertTrue(message.hasExtension(optionalBytesExtensionLite   ));\n\n    Assert.assertTrue(message.hasExtension(optionalGroupExtensionLite         ));\n    Assert.assertTrue(message.hasExtension(optionalNestedMessageExtensionLite ));\n    Assert.assertTrue(message.hasExtension(optionalForeignMessageExtensionLite));\n    Assert.assertTrue(message.hasExtension(optionalImportMessageExtensionLite ));\n\n    Assert.assertTrue(message.getExtension(optionalGroupExtensionLite         ).hasA());\n    Assert.assertTrue(message.getExtension(optionalNestedMessageExtensionLite ).hasBb());\n    Assert.assertTrue(message.getExtension(optionalForeignMessageExtensionLite).hasC());\n    Assert.assertTrue(message.getExtension(optionalImportMessageExtensionLite ).hasD());\n\n    Assert.assertTrue(message.hasExtension(optionalNestedEnumExtensionLite ));\n    Assert.assertTrue(message.hasExtension(optionalForeignEnumExtensionLite));\n    Assert.assertTrue(message.hasExtension(optionalImportEnumExtensionLite ));\n\n    Assert.assertTrue(message.hasExtension(optionalStringPieceExtensionLite));\n    Assert.assertTrue(message.hasExtension(optionalCordExtensionLite));\n\n    assertEqualsExactType(101  , message.getExtension(optionalInt32ExtensionLite   ));\n    assertEqualsExactType(102L , message.getExtension(optionalInt64ExtensionLite   ));\n    assertEqualsExactType(103  , message.getExtension(optionalUint32ExtensionLite  ));\n    assertEqualsExactType(104L , message.getExtension(optionalUint64ExtensionLite  ));\n    assertEqualsExactType(105  , message.getExtension(optionalSint32ExtensionLite  ));\n    assertEqualsExactType(106L , message.getExtension(optionalSint64ExtensionLite  ));\n    assertEqualsExactType(107  , message.getExtension(optionalFixed32ExtensionLite ));\n    assertEqualsExactType(108L , message.getExtension(optionalFixed64ExtensionLite ));\n    assertEqualsExactType(109  , message.getExtension(optionalSfixed32ExtensionLite));\n    assertEqualsExactType(110L , message.getExtension(optionalSfixed64ExtensionLite));\n    assertEqualsExactType(111F , message.getExtension(optionalFloatExtensionLite   ));\n    assertEqualsExactType(112D , message.getExtension(optionalDoubleExtensionLite  ));\n    assertEqualsExactType(true , message.getExtension(optionalBoolExtensionLite    ));\n    assertEqualsExactType(\"115\", message.getExtension(optionalStringExtensionLite  ));\n    assertEqualsExactType(toBytes(\"116\"), message.getExtension(optionalBytesExtensionLite));\n\n    assertEqualsExactType(117, message.getExtension(optionalGroupExtensionLite         ).getA());\n    assertEqualsExactType(118, message.getExtension(optionalNestedMessageExtensionLite ).getBb());\n    assertEqualsExactType(119, message.getExtension(optionalForeignMessageExtensionLite).getC());\n    assertEqualsExactType(120, message.getExtension(optionalImportMessageExtensionLite ).getD());\n\n    assertEqualsExactType(TestAllTypesLite.NestedEnum.BAZ,\n      message.getExtension(optionalNestedEnumExtensionLite));\n    assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAZ,\n      message.getExtension(optionalForeignEnumExtensionLite));\n    assertEqualsExactType(ImportEnumLite.IMPORT_LITE_BAZ,\n      message.getExtension(optionalImportEnumExtensionLite));\n\n    assertEqualsExactType(\"124\", message.getExtension(optionalStringPieceExtensionLite));\n    assertEqualsExactType(\"125\", message.getExtension(optionalCordExtensionLite));\n\n    // -----------------------------------------------------------------\n\n    Assert.assertEquals(2, message.getExtensionCount(repeatedInt32ExtensionLite   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedInt64ExtensionLite   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedUint32ExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedUint64ExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSint32ExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSint64ExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedFixed32ExtensionLite ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedFixed64ExtensionLite ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed32ExtensionLite));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed64ExtensionLite));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedFloatExtensionLite   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedDoubleExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedBoolExtensionLite    ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedStringExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedBytesExtensionLite   ));\n\n    Assert.assertEquals(2, message.getExtensionCount(repeatedGroupExtensionLite         ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedNestedMessageExtensionLite ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedForeignMessageExtensionLite));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedImportMessageExtensionLite ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedNestedEnumExtensionLite    ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedForeignEnumExtensionLite   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedImportEnumExtensionLite    ));\n\n    Assert.assertEquals(2, message.getExtensionCount(repeatedStringPieceExtensionLite));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedCordExtensionLite));\n\n    assertEqualsExactType(201  , message.getExtension(repeatedInt32ExtensionLite   , 0));\n    assertEqualsExactType(202L , message.getExtension(repeatedInt64ExtensionLite   , 0));\n    assertEqualsExactType(203  , message.getExtension(repeatedUint32ExtensionLite  , 0));\n    assertEqualsExactType(204L , message.getExtension(repeatedUint64ExtensionLite  , 0));\n    assertEqualsExactType(205  , message.getExtension(repeatedSint32ExtensionLite  , 0));\n    assertEqualsExactType(206L , message.getExtension(repeatedSint64ExtensionLite  , 0));\n    assertEqualsExactType(207  , message.getExtension(repeatedFixed32ExtensionLite , 0));\n    assertEqualsExactType(208L , message.getExtension(repeatedFixed64ExtensionLite , 0));\n    assertEqualsExactType(209  , message.getExtension(repeatedSfixed32ExtensionLite, 0));\n    assertEqualsExactType(210L , message.getExtension(repeatedSfixed64ExtensionLite, 0));\n    assertEqualsExactType(211F , message.getExtension(repeatedFloatExtensionLite   , 0));\n    assertEqualsExactType(212D , message.getExtension(repeatedDoubleExtensionLite  , 0));\n    assertEqualsExactType(true , message.getExtension(repeatedBoolExtensionLite    , 0));\n    assertEqualsExactType(\"215\", message.getExtension(repeatedStringExtensionLite  , 0));\n    assertEqualsExactType(toBytes(\"216\"), message.getExtension(repeatedBytesExtensionLite, 0));\n\n    assertEqualsExactType(217, message.getExtension(repeatedGroupExtensionLite         ,0).getA());\n    assertEqualsExactType(218, message.getExtension(repeatedNestedMessageExtensionLite ,0).getBb());\n    assertEqualsExactType(219, message.getExtension(repeatedForeignMessageExtensionLite,0).getC());\n    assertEqualsExactType(220, message.getExtension(repeatedImportMessageExtensionLite ,0).getD());\n\n    assertEqualsExactType(TestAllTypesLite.NestedEnum.BAR,\n      message.getExtension(repeatedNestedEnumExtensionLite, 0));\n    assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAR,\n      message.getExtension(repeatedForeignEnumExtensionLite, 0));\n    assertEqualsExactType(ImportEnumLite.IMPORT_LITE_BAR,\n      message.getExtension(repeatedImportEnumExtensionLite, 0));\n\n    assertEqualsExactType(\"224\", message.getExtension(repeatedStringPieceExtensionLite, 0));\n    assertEqualsExactType(\"225\", message.getExtension(repeatedCordExtensionLite, 0));\n\n    assertEqualsExactType(301  , message.getExtension(repeatedInt32ExtensionLite   , 1));\n    assertEqualsExactType(302L , message.getExtension(repeatedInt64ExtensionLite   , 1));\n    assertEqualsExactType(303  , message.getExtension(repeatedUint32ExtensionLite  , 1));\n    assertEqualsExactType(304L , message.getExtension(repeatedUint64ExtensionLite  , 1));\n    assertEqualsExactType(305  , message.getExtension(repeatedSint32ExtensionLite  , 1));\n    assertEqualsExactType(306L , message.getExtension(repeatedSint64ExtensionLite  , 1));\n    assertEqualsExactType(307  , message.getExtension(repeatedFixed32ExtensionLite , 1));\n    assertEqualsExactType(308L , message.getExtension(repeatedFixed64ExtensionLite , 1));\n    assertEqualsExactType(309  , message.getExtension(repeatedSfixed32ExtensionLite, 1));\n    assertEqualsExactType(310L , message.getExtension(repeatedSfixed64ExtensionLite, 1));\n    assertEqualsExactType(311F , message.getExtension(repeatedFloatExtensionLite   , 1));\n    assertEqualsExactType(312D , message.getExtension(repeatedDoubleExtensionLite  , 1));\n    assertEqualsExactType(false, message.getExtension(repeatedBoolExtensionLite    , 1));\n    assertEqualsExactType(\"315\", message.getExtension(repeatedStringExtensionLite  , 1));\n    assertEqualsExactType(toBytes(\"316\"), message.getExtension(repeatedBytesExtensionLite, 1));\n\n    assertEqualsExactType(317, message.getExtension(repeatedGroupExtensionLite         ,1).getA());\n    assertEqualsExactType(318, message.getExtension(repeatedNestedMessageExtensionLite ,1).getBb());\n    assertEqualsExactType(319, message.getExtension(repeatedForeignMessageExtensionLite,1).getC());\n    assertEqualsExactType(320, message.getExtension(repeatedImportMessageExtensionLite ,1).getD());\n\n    assertEqualsExactType(TestAllTypesLite.NestedEnum.BAZ,\n      message.getExtension(repeatedNestedEnumExtensionLite, 1));\n    assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAZ,\n      message.getExtension(repeatedForeignEnumExtensionLite, 1));\n    assertEqualsExactType(ImportEnumLite.IMPORT_LITE_BAZ,\n      message.getExtension(repeatedImportEnumExtensionLite, 1));\n\n    assertEqualsExactType(\"324\", message.getExtension(repeatedStringPieceExtensionLite, 1));\n    assertEqualsExactType(\"325\", message.getExtension(repeatedCordExtensionLite, 1));\n\n    // -----------------------------------------------------------------\n\n    Assert.assertTrue(message.hasExtension(defaultInt32ExtensionLite   ));\n    Assert.assertTrue(message.hasExtension(defaultInt64ExtensionLite   ));\n    Assert.assertTrue(message.hasExtension(defaultUint32ExtensionLite  ));\n    Assert.assertTrue(message.hasExtension(defaultUint64ExtensionLite  ));\n    Assert.assertTrue(message.hasExtension(defaultSint32ExtensionLite  ));\n    Assert.assertTrue(message.hasExtension(defaultSint64ExtensionLite  ));\n    Assert.assertTrue(message.hasExtension(defaultFixed32ExtensionLite ));\n    Assert.assertTrue(message.hasExtension(defaultFixed64ExtensionLite ));\n    Assert.assertTrue(message.hasExtension(defaultSfixed32ExtensionLite));\n    Assert.assertTrue(message.hasExtension(defaultSfixed64ExtensionLite));\n    Assert.assertTrue(message.hasExtension(defaultFloatExtensionLite   ));\n    Assert.assertTrue(message.hasExtension(defaultDoubleExtensionLite  ));\n    Assert.assertTrue(message.hasExtension(defaultBoolExtensionLite    ));\n    Assert.assertTrue(message.hasExtension(defaultStringExtensionLite  ));\n    Assert.assertTrue(message.hasExtension(defaultBytesExtensionLite   ));\n\n    Assert.assertTrue(message.hasExtension(defaultNestedEnumExtensionLite ));\n    Assert.assertTrue(message.hasExtension(defaultForeignEnumExtensionLite));\n    Assert.assertTrue(message.hasExtension(defaultImportEnumExtensionLite ));\n\n    Assert.assertTrue(message.hasExtension(defaultStringPieceExtensionLite));\n    Assert.assertTrue(message.hasExtension(defaultCordExtensionLite));\n\n    assertEqualsExactType(401  , message.getExtension(defaultInt32ExtensionLite   ));\n    assertEqualsExactType(402L , message.getExtension(defaultInt64ExtensionLite   ));\n    assertEqualsExactType(403  , message.getExtension(defaultUint32ExtensionLite  ));\n    assertEqualsExactType(404L , message.getExtension(defaultUint64ExtensionLite  ));\n    assertEqualsExactType(405  , message.getExtension(defaultSint32ExtensionLite  ));\n    assertEqualsExactType(406L , message.getExtension(defaultSint64ExtensionLite  ));\n    assertEqualsExactType(407  , message.getExtension(defaultFixed32ExtensionLite ));\n    assertEqualsExactType(408L , message.getExtension(defaultFixed64ExtensionLite ));\n    assertEqualsExactType(409  , message.getExtension(defaultSfixed32ExtensionLite));\n    assertEqualsExactType(410L , message.getExtension(defaultSfixed64ExtensionLite));\n    assertEqualsExactType(411F , message.getExtension(defaultFloatExtensionLite   ));\n    assertEqualsExactType(412D , message.getExtension(defaultDoubleExtensionLite  ));\n    assertEqualsExactType(false, message.getExtension(defaultBoolExtensionLite    ));\n    assertEqualsExactType(\"415\", message.getExtension(defaultStringExtensionLite  ));\n    assertEqualsExactType(toBytes(\"416\"), message.getExtension(defaultBytesExtensionLite));\n\n    assertEqualsExactType(TestAllTypesLite.NestedEnum.FOO,\n      message.getExtension(defaultNestedEnumExtensionLite ));\n    assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_FOO,\n      message.getExtension(defaultForeignEnumExtensionLite));\n    assertEqualsExactType(ImportEnumLite.IMPORT_LITE_FOO,\n      message.getExtension(defaultImportEnumExtensionLite));\n\n    assertEqualsExactType(\"424\", message.getExtension(defaultStringPieceExtensionLite));\n    assertEqualsExactType(\"425\", message.getExtension(defaultCordExtensionLite));\n  }\n\n  // -------------------------------------------------------------------\n\n  /**\n   * Assert (using {@code junit.framework.Assert}} that all extensions of\n   * {@code message} are cleared, and that getting the extensions returns their\n   * default values.\n   */\n  public static void assertExtensionsClear(\n      TestAllExtensionsLiteOrBuilder message) {\n    // hasBlah() should initially be false for all optional fields.\n    Assert.assertFalse(message.hasExtension(optionalInt32ExtensionLite   ));\n    Assert.assertFalse(message.hasExtension(optionalInt64ExtensionLite   ));\n    Assert.assertFalse(message.hasExtension(optionalUint32ExtensionLite  ));\n    Assert.assertFalse(message.hasExtension(optionalUint64ExtensionLite  ));\n    Assert.assertFalse(message.hasExtension(optionalSint32ExtensionLite  ));\n    Assert.assertFalse(message.hasExtension(optionalSint64ExtensionLite  ));\n    Assert.assertFalse(message.hasExtension(optionalFixed32ExtensionLite ));\n    Assert.assertFalse(message.hasExtension(optionalFixed64ExtensionLite ));\n    Assert.assertFalse(message.hasExtension(optionalSfixed32ExtensionLite));\n    Assert.assertFalse(message.hasExtension(optionalSfixed64ExtensionLite));\n    Assert.assertFalse(message.hasExtension(optionalFloatExtensionLite   ));\n    Assert.assertFalse(message.hasExtension(optionalDoubleExtensionLite  ));\n    Assert.assertFalse(message.hasExtension(optionalBoolExtensionLite    ));\n    Assert.assertFalse(message.hasExtension(optionalStringExtensionLite  ));\n    Assert.assertFalse(message.hasExtension(optionalBytesExtensionLite   ));\n\n    Assert.assertFalse(message.hasExtension(optionalGroupExtensionLite         ));\n    Assert.assertFalse(message.hasExtension(optionalNestedMessageExtensionLite ));\n    Assert.assertFalse(message.hasExtension(optionalForeignMessageExtensionLite));\n    Assert.assertFalse(message.hasExtension(optionalImportMessageExtensionLite ));\n\n    Assert.assertFalse(message.hasExtension(optionalNestedEnumExtensionLite ));\n    Assert.assertFalse(message.hasExtension(optionalForeignEnumExtensionLite));\n    Assert.assertFalse(message.hasExtension(optionalImportEnumExtensionLite ));\n\n    Assert.assertFalse(message.hasExtension(optionalStringPieceExtensionLite));\n    Assert.assertFalse(message.hasExtension(optionalCordExtensionLite));\n\n    // Optional fields without defaults are set to zero or something like it.\n    assertEqualsExactType(0    , message.getExtension(optionalInt32ExtensionLite   ));\n    assertEqualsExactType(0L   , message.getExtension(optionalInt64ExtensionLite   ));\n    assertEqualsExactType(0    , message.getExtension(optionalUint32ExtensionLite  ));\n    assertEqualsExactType(0L   , message.getExtension(optionalUint64ExtensionLite  ));\n    assertEqualsExactType(0    , message.getExtension(optionalSint32ExtensionLite  ));\n    assertEqualsExactType(0L   , message.getExtension(optionalSint64ExtensionLite  ));\n    assertEqualsExactType(0    , message.getExtension(optionalFixed32ExtensionLite ));\n    assertEqualsExactType(0L   , message.getExtension(optionalFixed64ExtensionLite ));\n    assertEqualsExactType(0    , message.getExtension(optionalSfixed32ExtensionLite));\n    assertEqualsExactType(0L   , message.getExtension(optionalSfixed64ExtensionLite));\n    assertEqualsExactType(0F   , message.getExtension(optionalFloatExtensionLite   ));\n    assertEqualsExactType(0D   , message.getExtension(optionalDoubleExtensionLite  ));\n    assertEqualsExactType(false, message.getExtension(optionalBoolExtensionLite    ));\n    assertEqualsExactType(\"\"   , message.getExtension(optionalStringExtensionLite  ));\n    assertEqualsExactType(ByteString.EMPTY, message.getExtension(optionalBytesExtensionLite));\n\n    // Embedded messages should also be clear.\n    Assert.assertFalse(message.getExtension(optionalGroupExtensionLite         ).hasA());\n    Assert.assertFalse(message.getExtension(optionalNestedMessageExtensionLite ).hasBb());\n    Assert.assertFalse(message.getExtension(optionalForeignMessageExtensionLite).hasC());\n    Assert.assertFalse(message.getExtension(optionalImportMessageExtensionLite ).hasD());\n\n    assertEqualsExactType(0, message.getExtension(optionalGroupExtensionLite         ).getA());\n    assertEqualsExactType(0, message.getExtension(optionalNestedMessageExtensionLite ).getBb());\n    assertEqualsExactType(0, message.getExtension(optionalForeignMessageExtensionLite).getC());\n    assertEqualsExactType(0, message.getExtension(optionalImportMessageExtensionLite ).getD());\n\n    // Enums without defaults are set to the first value in the enum.\n    assertEqualsExactType(TestAllTypesLite.NestedEnum.FOO,\n      message.getExtension(optionalNestedEnumExtensionLite ));\n    assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_FOO,\n      message.getExtension(optionalForeignEnumExtensionLite));\n    assertEqualsExactType(ImportEnumLite.IMPORT_LITE_FOO,\n      message.getExtension(optionalImportEnumExtensionLite));\n\n    assertEqualsExactType(\"\", message.getExtension(optionalStringPieceExtensionLite));\n    assertEqualsExactType(\"\", message.getExtension(optionalCordExtensionLite));\n\n    // Repeated fields are empty.\n    Assert.assertEquals(0, message.getExtensionCount(repeatedInt32ExtensionLite   ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedInt64ExtensionLite   ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedUint32ExtensionLite  ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedUint64ExtensionLite  ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedSint32ExtensionLite  ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedSint64ExtensionLite  ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedFixed32ExtensionLite ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedFixed64ExtensionLite ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedSfixed32ExtensionLite));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedSfixed64ExtensionLite));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedFloatExtensionLite   ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedDoubleExtensionLite  ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedBoolExtensionLite    ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedStringExtensionLite  ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedBytesExtensionLite   ));\n\n    Assert.assertEquals(0, message.getExtensionCount(repeatedGroupExtensionLite         ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedNestedMessageExtensionLite ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedForeignMessageExtensionLite));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedImportMessageExtensionLite ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedNestedEnumExtensionLite    ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedForeignEnumExtensionLite   ));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedImportEnumExtensionLite    ));\n\n    Assert.assertEquals(0, message.getExtensionCount(repeatedStringPieceExtensionLite));\n    Assert.assertEquals(0, message.getExtensionCount(repeatedCordExtensionLite));\n\n    // hasBlah() should also be false for all default fields.\n    Assert.assertFalse(message.hasExtension(defaultInt32ExtensionLite   ));\n    Assert.assertFalse(message.hasExtension(defaultInt64ExtensionLite   ));\n    Assert.assertFalse(message.hasExtension(defaultUint32ExtensionLite  ));\n    Assert.assertFalse(message.hasExtension(defaultUint64ExtensionLite  ));\n    Assert.assertFalse(message.hasExtension(defaultSint32ExtensionLite  ));\n    Assert.assertFalse(message.hasExtension(defaultSint64ExtensionLite  ));\n    Assert.assertFalse(message.hasExtension(defaultFixed32ExtensionLite ));\n    Assert.assertFalse(message.hasExtension(defaultFixed64ExtensionLite ));\n    Assert.assertFalse(message.hasExtension(defaultSfixed32ExtensionLite));\n    Assert.assertFalse(message.hasExtension(defaultSfixed64ExtensionLite));\n    Assert.assertFalse(message.hasExtension(defaultFloatExtensionLite   ));\n    Assert.assertFalse(message.hasExtension(defaultDoubleExtensionLite  ));\n    Assert.assertFalse(message.hasExtension(defaultBoolExtensionLite    ));\n    Assert.assertFalse(message.hasExtension(defaultStringExtensionLite  ));\n    Assert.assertFalse(message.hasExtension(defaultBytesExtensionLite   ));\n\n    Assert.assertFalse(message.hasExtension(defaultNestedEnumExtensionLite ));\n    Assert.assertFalse(message.hasExtension(defaultForeignEnumExtensionLite));\n    Assert.assertFalse(message.hasExtension(defaultImportEnumExtensionLite ));\n\n    Assert.assertFalse(message.hasExtension(defaultStringPieceExtensionLite));\n    Assert.assertFalse(message.hasExtension(defaultCordExtensionLite));\n\n    // Fields with defaults have their default values (duh).\n    assertEqualsExactType( 41    , message.getExtension(defaultInt32ExtensionLite   ));\n    assertEqualsExactType( 42L   , message.getExtension(defaultInt64ExtensionLite   ));\n    assertEqualsExactType( 43    , message.getExtension(defaultUint32ExtensionLite  ));\n    assertEqualsExactType( 44L   , message.getExtension(defaultUint64ExtensionLite  ));\n    assertEqualsExactType(-45    , message.getExtension(defaultSint32ExtensionLite  ));\n    assertEqualsExactType( 46L   , message.getExtension(defaultSint64ExtensionLite  ));\n    assertEqualsExactType( 47    , message.getExtension(defaultFixed32ExtensionLite ));\n    assertEqualsExactType( 48L   , message.getExtension(defaultFixed64ExtensionLite ));\n    assertEqualsExactType( 49    , message.getExtension(defaultSfixed32ExtensionLite));\n    assertEqualsExactType(-50L   , message.getExtension(defaultSfixed64ExtensionLite));\n    assertEqualsExactType( 51.5F , message.getExtension(defaultFloatExtensionLite   ));\n    assertEqualsExactType( 52e3D , message.getExtension(defaultDoubleExtensionLite  ));\n    assertEqualsExactType(true   , message.getExtension(defaultBoolExtensionLite    ));\n    assertEqualsExactType(\"hello\", message.getExtension(defaultStringExtensionLite  ));\n    assertEqualsExactType(toBytes(\"world\"), message.getExtension(defaultBytesExtensionLite));\n\n    assertEqualsExactType(TestAllTypesLite.NestedEnum.BAR,\n      message.getExtension(defaultNestedEnumExtensionLite ));\n    assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAR,\n      message.getExtension(defaultForeignEnumExtensionLite));\n    assertEqualsExactType(ImportEnumLite.IMPORT_LITE_BAR,\n      message.getExtension(defaultImportEnumExtensionLite));\n\n    assertEqualsExactType(\"abc\", message.getExtension(defaultStringPieceExtensionLite));\n    assertEqualsExactType(\"123\", message.getExtension(defaultCordExtensionLite));\n  }\n\n  // -------------------------------------------------------------------\n\n  /**\n   * Assert (using {@code junit.framework.Assert}} that all extensions of\n   * {@code message} are set to the values assigned by {@code setAllExtensions}\n   * followed by {@code modifyRepeatedExtensions}.\n   */\n  public static void assertRepeatedExtensionsModified(\n      TestAllExtensionsLiteOrBuilder message) {\n    // ModifyRepeatedFields only sets the second repeated element of each\n    // field.  In addition to verifying this, we also verify that the first\n    // element and size were *not* modified.\n    Assert.assertEquals(2, message.getExtensionCount(repeatedInt32ExtensionLite   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedInt64ExtensionLite   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedUint32ExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedUint64ExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSint32ExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSint64ExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedFixed32ExtensionLite ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedFixed64ExtensionLite ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed32ExtensionLite));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed64ExtensionLite));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedFloatExtensionLite   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedDoubleExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedBoolExtensionLite    ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedStringExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedBytesExtensionLite   ));\n\n    Assert.assertEquals(2, message.getExtensionCount(repeatedGroupExtensionLite         ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedNestedMessageExtensionLite ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedForeignMessageExtensionLite));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedImportMessageExtensionLite ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedNestedEnumExtensionLite    ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedForeignEnumExtensionLite   ));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedImportEnumExtensionLite    ));\n\n    Assert.assertEquals(2, message.getExtensionCount(repeatedStringPieceExtensionLite));\n    Assert.assertEquals(2, message.getExtensionCount(repeatedCordExtensionLite));\n\n    assertEqualsExactType(201  , message.getExtension(repeatedInt32ExtensionLite   , 0));\n    assertEqualsExactType(202L , message.getExtension(repeatedInt64ExtensionLite   , 0));\n    assertEqualsExactType(203  , message.getExtension(repeatedUint32ExtensionLite  , 0));\n    assertEqualsExactType(204L , message.getExtension(repeatedUint64ExtensionLite  , 0));\n    assertEqualsExactType(205  , message.getExtension(repeatedSint32ExtensionLite  , 0));\n    assertEqualsExactType(206L , message.getExtension(repeatedSint64ExtensionLite  , 0));\n    assertEqualsExactType(207  , message.getExtension(repeatedFixed32ExtensionLite , 0));\n    assertEqualsExactType(208L , message.getExtension(repeatedFixed64ExtensionLite , 0));\n    assertEqualsExactType(209  , message.getExtension(repeatedSfixed32ExtensionLite, 0));\n    assertEqualsExactType(210L , message.getExtension(repeatedSfixed64ExtensionLite, 0));\n    assertEqualsExactType(211F , message.getExtension(repeatedFloatExtensionLite   , 0));\n    assertEqualsExactType(212D , message.getExtension(repeatedDoubleExtensionLite  , 0));\n    assertEqualsExactType(true , message.getExtension(repeatedBoolExtensionLite    , 0));\n    assertEqualsExactType(\"215\", message.getExtension(repeatedStringExtensionLite  , 0));\n    assertEqualsExactType(toBytes(\"216\"), message.getExtension(repeatedBytesExtensionLite, 0));\n\n    assertEqualsExactType(217, message.getExtension(repeatedGroupExtensionLite         ,0).getA());\n    assertEqualsExactType(218, message.getExtension(repeatedNestedMessageExtensionLite ,0).getBb());\n    assertEqualsExactType(219, message.getExtension(repeatedForeignMessageExtensionLite,0).getC());\n    assertEqualsExactType(220, message.getExtension(repeatedImportMessageExtensionLite ,0).getD());\n\n    assertEqualsExactType(TestAllTypesLite.NestedEnum.BAR,\n      message.getExtension(repeatedNestedEnumExtensionLite, 0));\n    assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAR,\n      message.getExtension(repeatedForeignEnumExtensionLite, 0));\n    assertEqualsExactType(ImportEnumLite.IMPORT_LITE_BAR,\n      message.getExtension(repeatedImportEnumExtensionLite, 0));\n\n    assertEqualsExactType(\"224\", message.getExtension(repeatedStringPieceExtensionLite, 0));\n    assertEqualsExactType(\"225\", message.getExtension(repeatedCordExtensionLite, 0));\n\n    // Actually verify the second (modified) elements now.\n    assertEqualsExactType(501  , message.getExtension(repeatedInt32ExtensionLite   , 1));\n    assertEqualsExactType(502L , message.getExtension(repeatedInt64ExtensionLite   , 1));\n    assertEqualsExactType(503  , message.getExtension(repeatedUint32ExtensionLite  , 1));\n    assertEqualsExactType(504L , message.getExtension(repeatedUint64ExtensionLite  , 1));\n    assertEqualsExactType(505  , message.getExtension(repeatedSint32ExtensionLite  , 1));\n    assertEqualsExactType(506L , message.getExtension(repeatedSint64ExtensionLite  , 1));\n    assertEqualsExactType(507  , message.getExtension(repeatedFixed32ExtensionLite , 1));\n    assertEqualsExactType(508L , message.getExtension(repeatedFixed64ExtensionLite , 1));\n    assertEqualsExactType(509  , message.getExtension(repeatedSfixed32ExtensionLite, 1));\n    assertEqualsExactType(510L , message.getExtension(repeatedSfixed64ExtensionLite, 1));\n    assertEqualsExactType(511F , message.getExtension(repeatedFloatExtensionLite   , 1));\n    assertEqualsExactType(512D , message.getExtension(repeatedDoubleExtensionLite  , 1));\n    assertEqualsExactType(true , message.getExtension(repeatedBoolExtensionLite    , 1));\n    assertEqualsExactType(\"515\", message.getExtension(repeatedStringExtensionLite  , 1));\n    assertEqualsExactType(toBytes(\"516\"), message.getExtension(repeatedBytesExtensionLite, 1));\n\n    assertEqualsExactType(517, message.getExtension(repeatedGroupExtensionLite         ,1).getA());\n    assertEqualsExactType(518, message.getExtension(repeatedNestedMessageExtensionLite ,1).getBb());\n    assertEqualsExactType(519, message.getExtension(repeatedForeignMessageExtensionLite,1).getC());\n    assertEqualsExactType(520, message.getExtension(repeatedImportMessageExtensionLite ,1).getD());\n\n    assertEqualsExactType(TestAllTypesLite.NestedEnum.FOO,\n      message.getExtension(repeatedNestedEnumExtensionLite, 1));\n    assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_FOO,\n      message.getExtension(repeatedForeignEnumExtensionLite, 1));\n    assertEqualsExactType(ImportEnumLite.IMPORT_LITE_FOO,\n      message.getExtension(repeatedImportEnumExtensionLite, 1));\n\n    assertEqualsExactType(\"524\", message.getExtension(repeatedStringPieceExtensionLite, 1));\n    assertEqualsExactType(\"525\", message.getExtension(repeatedCordExtensionLite, 1));\n  }\n\n  public static void setPackedExtensions(TestPackedExtensionsLite.Builder message) {\n    message.addExtension(packedInt32ExtensionLite   , 601);\n    message.addExtension(packedInt64ExtensionLite   , 602L);\n    message.addExtension(packedUint32ExtensionLite  , 603);\n    message.addExtension(packedUint64ExtensionLite  , 604L);\n    message.addExtension(packedSint32ExtensionLite  , 605);\n    message.addExtension(packedSint64ExtensionLite  , 606L);\n    message.addExtension(packedFixed32ExtensionLite , 607);\n    message.addExtension(packedFixed64ExtensionLite , 608L);\n    message.addExtension(packedSfixed32ExtensionLite, 609);\n    message.addExtension(packedSfixed64ExtensionLite, 610L);\n    message.addExtension(packedFloatExtensionLite   , 611F);\n    message.addExtension(packedDoubleExtensionLite  , 612D);\n    message.addExtension(packedBoolExtensionLite    , true);\n    message.addExtension(packedEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_BAR);\n    // Add a second one of each field.\n    message.addExtension(packedInt32ExtensionLite   , 701);\n    message.addExtension(packedInt64ExtensionLite   , 702L);\n    message.addExtension(packedUint32ExtensionLite  , 703);\n    message.addExtension(packedUint64ExtensionLite  , 704L);\n    message.addExtension(packedSint32ExtensionLite  , 705);\n    message.addExtension(packedSint64ExtensionLite  , 706L);\n    message.addExtension(packedFixed32ExtensionLite , 707);\n    message.addExtension(packedFixed64ExtensionLite , 708L);\n    message.addExtension(packedSfixed32ExtensionLite, 709);\n    message.addExtension(packedSfixed64ExtensionLite, 710L);\n    message.addExtension(packedFloatExtensionLite   , 711F);\n    message.addExtension(packedDoubleExtensionLite  , 712D);\n    message.addExtension(packedBoolExtensionLite    , false);\n    message.addExtension(packedEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_BAZ);\n  }\n\n  public static void assertPackedExtensionsSet(TestPackedExtensionsLite message) {\n    Assert.assertEquals(2, message.getExtensionCount(packedInt32ExtensionLite   ));\n    Assert.assertEquals(2, message.getExtensionCount(packedInt64ExtensionLite   ));\n    Assert.assertEquals(2, message.getExtensionCount(packedUint32ExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(packedUint64ExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(packedSint32ExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(packedSint64ExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(packedFixed32ExtensionLite ));\n    Assert.assertEquals(2, message.getExtensionCount(packedFixed64ExtensionLite ));\n    Assert.assertEquals(2, message.getExtensionCount(packedSfixed32ExtensionLite));\n    Assert.assertEquals(2, message.getExtensionCount(packedSfixed64ExtensionLite));\n    Assert.assertEquals(2, message.getExtensionCount(packedFloatExtensionLite   ));\n    Assert.assertEquals(2, message.getExtensionCount(packedDoubleExtensionLite  ));\n    Assert.assertEquals(2, message.getExtensionCount(packedBoolExtensionLite    ));\n    Assert.assertEquals(2, message.getExtensionCount(packedEnumExtensionLite));\n    assertEqualsExactType(601  , message.getExtension(packedInt32ExtensionLite   , 0));\n    assertEqualsExactType(602L , message.getExtension(packedInt64ExtensionLite   , 0));\n    assertEqualsExactType(603  , message.getExtension(packedUint32ExtensionLite  , 0));\n    assertEqualsExactType(604L , message.getExtension(packedUint64ExtensionLite  , 0));\n    assertEqualsExactType(605  , message.getExtension(packedSint32ExtensionLite  , 0));\n    assertEqualsExactType(606L , message.getExtension(packedSint64ExtensionLite  , 0));\n    assertEqualsExactType(607  , message.getExtension(packedFixed32ExtensionLite , 0));\n    assertEqualsExactType(608L , message.getExtension(packedFixed64ExtensionLite , 0));\n    assertEqualsExactType(609  , message.getExtension(packedSfixed32ExtensionLite, 0));\n    assertEqualsExactType(610L , message.getExtension(packedSfixed64ExtensionLite, 0));\n    assertEqualsExactType(611F , message.getExtension(packedFloatExtensionLite   , 0));\n    assertEqualsExactType(612D , message.getExtension(packedDoubleExtensionLite  , 0));\n    assertEqualsExactType(true , message.getExtension(packedBoolExtensionLite    , 0));\n    assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAR,\n                          message.getExtension(packedEnumExtensionLite, 0));\n    assertEqualsExactType(701  , message.getExtension(packedInt32ExtensionLite   , 1));\n    assertEqualsExactType(702L , message.getExtension(packedInt64ExtensionLite   , 1));\n    assertEqualsExactType(703  , message.getExtension(packedUint32ExtensionLite  , 1));\n    assertEqualsExactType(704L , message.getExtension(packedUint64ExtensionLite  , 1));\n    assertEqualsExactType(705  , message.getExtension(packedSint32ExtensionLite  , 1));\n    assertEqualsExactType(706L , message.getExtension(packedSint64ExtensionLite  , 1));\n    assertEqualsExactType(707  , message.getExtension(packedFixed32ExtensionLite , 1));\n    assertEqualsExactType(708L , message.getExtension(packedFixed64ExtensionLite , 1));\n    assertEqualsExactType(709  , message.getExtension(packedSfixed32ExtensionLite, 1));\n    assertEqualsExactType(710L , message.getExtension(packedSfixed64ExtensionLite, 1));\n    assertEqualsExactType(711F , message.getExtension(packedFloatExtensionLite   , 1));\n    assertEqualsExactType(712D , message.getExtension(packedDoubleExtensionLite  , 1));\n    assertEqualsExactType(false, message.getExtension(packedBoolExtensionLite    , 1));\n    assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAZ,\n                          message.getExtension(packedEnumExtensionLite, 1));\n  }\n\n  // =================================================================\n\n  /**\n   * Performs the same things that the methods of {@code TestUtil} do, but\n   * via the reflection interface.  This is its own class because it needs\n   * to know what descriptor to use.\n   */\n  public static class ReflectionTester {\n    private final Descriptors.Descriptor baseDescriptor;\n    private final ExtensionRegistry extensionRegistry;\n\n    private final Descriptors.FileDescriptor file;\n    private final Descriptors.FileDescriptor importFile;\n\n    private final Descriptors.Descriptor optionalGroup;\n    private final Descriptors.Descriptor repeatedGroup;\n    private final Descriptors.Descriptor nestedMessage;\n    private final Descriptors.Descriptor foreignMessage;\n    private final Descriptors.Descriptor importMessage;\n\n    private final Descriptors.FieldDescriptor groupA;\n    private final Descriptors.FieldDescriptor repeatedGroupA;\n    private final Descriptors.FieldDescriptor nestedB;\n    private final Descriptors.FieldDescriptor foreignC;\n    private final Descriptors.FieldDescriptor importD;\n\n    private final Descriptors.EnumDescriptor nestedEnum;\n    private final Descriptors.EnumDescriptor foreignEnum;\n    private final Descriptors.EnumDescriptor importEnum;\n\n    private final Descriptors.EnumValueDescriptor nestedFoo;\n    private final Descriptors.EnumValueDescriptor nestedBar;\n    private final Descriptors.EnumValueDescriptor nestedBaz;\n    private final Descriptors.EnumValueDescriptor foreignFoo;\n    private final Descriptors.EnumValueDescriptor foreignBar;\n    private final Descriptors.EnumValueDescriptor foreignBaz;\n    private final Descriptors.EnumValueDescriptor importFoo;\n    private final Descriptors.EnumValueDescriptor importBar;\n    private final Descriptors.EnumValueDescriptor importBaz;\n\n    /**\n     * Construct a {@code ReflectionTester} that will expect messages using\n     * the given descriptor.\n     *\n     * Normally {@code baseDescriptor} should be a descriptor for the type\n     * {@code TestAllTypes}, defined in\n     * {@code google/protobuf/unittest.proto}.  However, if\n     * {@code extensionRegistry} is non-null, then {@code baseDescriptor} should\n     * be for {@code TestAllExtensions} instead, and instead of reading and\n     * writing normal fields, the tester will read and write extensions.\n     * All of {@code TestAllExtensions}' extensions must be registered in the\n     * registry.\n     */\n    public ReflectionTester(Descriptors.Descriptor baseDescriptor,\n                            ExtensionRegistry extensionRegistry) {\n      this.baseDescriptor = baseDescriptor;\n      this.extensionRegistry = extensionRegistry;\n\n      this.file = baseDescriptor.getFile();\n      Assert.assertEquals(1, file.getDependencies().size());\n      this.importFile = file.getDependencies().get(0);\n\n      Descriptors.Descriptor testAllTypes;\n      if (baseDescriptor.getName() == \"TestAllTypes\") {\n        testAllTypes = baseDescriptor;\n      } else {\n        testAllTypes = file.findMessageTypeByName(\"TestAllTypes\");\n        Assert.assertNotNull(testAllTypes);\n      }\n\n      if (extensionRegistry == null) {\n        // Use testAllTypes, rather than baseDescriptor, to allow\n        // initialization using TestPackedTypes descriptors. These objects\n        // won't be used by the methods for packed fields.\n        this.optionalGroup =\n          testAllTypes.findNestedTypeByName(\"OptionalGroup\");\n        this.repeatedGroup =\n          testAllTypes.findNestedTypeByName(\"RepeatedGroup\");\n      } else {\n        this.optionalGroup =\n          file.findMessageTypeByName(\"OptionalGroup_extension\");\n        this.repeatedGroup =\n          file.findMessageTypeByName(\"RepeatedGroup_extension\");\n      }\n      this.nestedMessage = testAllTypes.findNestedTypeByName(\"NestedMessage\");\n      this.foreignMessage = file.findMessageTypeByName(\"ForeignMessage\");\n      this.importMessage = importFile.findMessageTypeByName(\"ImportMessage\");\n\n      this.nestedEnum = testAllTypes.findEnumTypeByName(\"NestedEnum\");\n      this.foreignEnum = file.findEnumTypeByName(\"ForeignEnum\");\n      this.importEnum = importFile.findEnumTypeByName(\"ImportEnum\");\n\n      Assert.assertNotNull(optionalGroup );\n      Assert.assertNotNull(repeatedGroup );\n      Assert.assertNotNull(nestedMessage );\n      Assert.assertNotNull(foreignMessage);\n      Assert.assertNotNull(importMessage );\n      Assert.assertNotNull(nestedEnum    );\n      Assert.assertNotNull(foreignEnum   );\n      Assert.assertNotNull(importEnum    );\n\n      this.nestedB  = nestedMessage .findFieldByName(\"bb\");\n      this.foreignC = foreignMessage.findFieldByName(\"c\");\n      this.importD  = importMessage .findFieldByName(\"d\");\n      this.nestedFoo = nestedEnum.findValueByName(\"FOO\");\n      this.nestedBar = nestedEnum.findValueByName(\"BAR\");\n      this.nestedBaz = nestedEnum.findValueByName(\"BAZ\");\n      this.foreignFoo = foreignEnum.findValueByName(\"FOREIGN_FOO\");\n      this.foreignBar = foreignEnum.findValueByName(\"FOREIGN_BAR\");\n      this.foreignBaz = foreignEnum.findValueByName(\"FOREIGN_BAZ\");\n      this.importFoo = importEnum.findValueByName(\"IMPORT_FOO\");\n      this.importBar = importEnum.findValueByName(\"IMPORT_BAR\");\n      this.importBaz = importEnum.findValueByName(\"IMPORT_BAZ\");\n\n      this.groupA = optionalGroup.findFieldByName(\"a\");\n      this.repeatedGroupA = repeatedGroup.findFieldByName(\"a\");\n\n      Assert.assertNotNull(groupA        );\n      Assert.assertNotNull(repeatedGroupA);\n      Assert.assertNotNull(nestedB       );\n      Assert.assertNotNull(foreignC      );\n      Assert.assertNotNull(importD       );\n      Assert.assertNotNull(nestedFoo     );\n      Assert.assertNotNull(nestedBar     );\n      Assert.assertNotNull(nestedBaz     );\n      Assert.assertNotNull(foreignFoo    );\n      Assert.assertNotNull(foreignBar    );\n      Assert.assertNotNull(foreignBaz    );\n      Assert.assertNotNull(importFoo     );\n      Assert.assertNotNull(importBar     );\n      Assert.assertNotNull(importBaz     );\n    }\n\n    /**\n     * Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes.\n     */\n    private Descriptors.FieldDescriptor f(String name) {\n      Descriptors.FieldDescriptor result;\n      if (extensionRegistry == null) {\n        result = baseDescriptor.findFieldByName(name);\n      } else {\n        result = file.findExtensionByName(name + \"_extension\");\n      }\n      Assert.assertNotNull(result);\n      return result;\n    }\n\n    /**\n     * Calls {@code parent.newBuilderForField()} or uses the\n     * {@code ExtensionRegistry} to find an appropriate builder, depending\n     * on what type is being tested.\n     */\n    private Message.Builder newBuilderForField(\n        Message.Builder parent, Descriptors.FieldDescriptor field) {\n      if (extensionRegistry == null) {\n        return parent.newBuilderForField(field);\n      } else {\n        ExtensionRegistry.ExtensionInfo extension =\n          extensionRegistry.findExtensionByNumber(field.getContainingType(),\n                                                  field.getNumber());\n        Assert.assertNotNull(extension);\n        Assert.assertNotNull(extension.defaultInstance);\n        return extension.defaultInstance.newBuilderForType();\n      }\n    }\n\n    // -------------------------------------------------------------------\n\n    /**\n     * Set every field of {@code message} to the values expected by\n     * {@code assertAllFieldsSet()}, using the {@link Message.Builder}\n     * reflection interface.\n     */\n    void setAllFieldsViaReflection(Message.Builder message) {\n      message.setField(f(\"optional_int32\"   ), 101 );\n      message.setField(f(\"optional_int64\"   ), 102L);\n      message.setField(f(\"optional_uint32\"  ), 103 );\n      message.setField(f(\"optional_uint64\"  ), 104L);\n      message.setField(f(\"optional_sint32\"  ), 105 );\n      message.setField(f(\"optional_sint64\"  ), 106L);\n      message.setField(f(\"optional_fixed32\" ), 107 );\n      message.setField(f(\"optional_fixed64\" ), 108L);\n      message.setField(f(\"optional_sfixed32\"), 109 );\n      message.setField(f(\"optional_sfixed64\"), 110L);\n      message.setField(f(\"optional_float\"   ), 111F);\n      message.setField(f(\"optional_double\"  ), 112D);\n      message.setField(f(\"optional_bool\"    ), true);\n      message.setField(f(\"optional_string\"  ), \"115\");\n      message.setField(f(\"optional_bytes\"   ), toBytes(\"116\"));\n\n      message.setField(f(\"optionalgroup\"),\n        newBuilderForField(message, f(\"optionalgroup\"))\n               .setField(groupA, 117).build());\n      message.setField(f(\"optional_nested_message\"),\n        newBuilderForField(message, f(\"optional_nested_message\"))\n               .setField(nestedB, 118).build());\n      message.setField(f(\"optional_foreign_message\"),\n        newBuilderForField(message, f(\"optional_foreign_message\"))\n               .setField(foreignC, 119).build());\n      message.setField(f(\"optional_import_message\"),\n        newBuilderForField(message, f(\"optional_import_message\"))\n               .setField(importD, 120).build());\n\n      message.setField(f(\"optional_nested_enum\" ),  nestedBaz);\n      message.setField(f(\"optional_foreign_enum\"), foreignBaz);\n      message.setField(f(\"optional_import_enum\" ),  importBaz);\n\n      message.setField(f(\"optional_string_piece\" ), \"124\");\n      message.setField(f(\"optional_cord\" ), \"125\");\n\n      // -----------------------------------------------------------------\n\n      message.addRepeatedField(f(\"repeated_int32\"   ), 201 );\n      message.addRepeatedField(f(\"repeated_int64\"   ), 202L);\n      message.addRepeatedField(f(\"repeated_uint32\"  ), 203 );\n      message.addRepeatedField(f(\"repeated_uint64\"  ), 204L);\n      message.addRepeatedField(f(\"repeated_sint32\"  ), 205 );\n      message.addRepeatedField(f(\"repeated_sint64\"  ), 206L);\n      message.addRepeatedField(f(\"repeated_fixed32\" ), 207 );\n      message.addRepeatedField(f(\"repeated_fixed64\" ), 208L);\n      message.addRepeatedField(f(\"repeated_sfixed32\"), 209 );\n      message.addRepeatedField(f(\"repeated_sfixed64\"), 210L);\n      message.addRepeatedField(f(\"repeated_float\"   ), 211F);\n      message.addRepeatedField(f(\"repeated_double\"  ), 212D);\n      message.addRepeatedField(f(\"repeated_bool\"    ), true);\n      message.addRepeatedField(f(\"repeated_string\"  ), \"215\");\n      message.addRepeatedField(f(\"repeated_bytes\"   ), toBytes(\"216\"));\n\n      message.addRepeatedField(f(\"repeatedgroup\"),\n        newBuilderForField(message, f(\"repeatedgroup\"))\n               .setField(repeatedGroupA, 217).build());\n      message.addRepeatedField(f(\"repeated_nested_message\"),\n        newBuilderForField(message, f(\"repeated_nested_message\"))\n               .setField(nestedB, 218).build());\n      message.addRepeatedField(f(\"repeated_foreign_message\"),\n        newBuilderForField(message, f(\"repeated_foreign_message\"))\n               .setField(foreignC, 219).build());\n      message.addRepeatedField(f(\"repeated_import_message\"),\n        newBuilderForField(message, f(\"repeated_import_message\"))\n               .setField(importD, 220).build());\n\n      message.addRepeatedField(f(\"repeated_nested_enum\" ),  nestedBar);\n      message.addRepeatedField(f(\"repeated_foreign_enum\"), foreignBar);\n      message.addRepeatedField(f(\"repeated_import_enum\" ),  importBar);\n\n      message.addRepeatedField(f(\"repeated_string_piece\" ), \"224\");\n      message.addRepeatedField(f(\"repeated_cord\" ), \"225\");\n\n      // Add a second one of each field.\n      message.addRepeatedField(f(\"repeated_int32\"   ), 301 );\n      message.addRepeatedField(f(\"repeated_int64\"   ), 302L);\n      message.addRepeatedField(f(\"repeated_uint32\"  ), 303 );\n      message.addRepeatedField(f(\"repeated_uint64\"  ), 304L);\n      message.addRepeatedField(f(\"repeated_sint32\"  ), 305 );\n      message.addRepeatedField(f(\"repeated_sint64\"  ), 306L);\n      message.addRepeatedField(f(\"repeated_fixed32\" ), 307 );\n      message.addRepeatedField(f(\"repeated_fixed64\" ), 308L);\n      message.addRepeatedField(f(\"repeated_sfixed32\"), 309 );\n      message.addRepeatedField(f(\"repeated_sfixed64\"), 310L);\n      message.addRepeatedField(f(\"repeated_float\"   ), 311F);\n      message.addRepeatedField(f(\"repeated_double\"  ), 312D);\n      message.addRepeatedField(f(\"repeated_bool\"    ), false);\n      message.addRepeatedField(f(\"repeated_string\"  ), \"315\");\n      message.addRepeatedField(f(\"repeated_bytes\"   ), toBytes(\"316\"));\n\n      message.addRepeatedField(f(\"repeatedgroup\"),\n        newBuilderForField(message, f(\"repeatedgroup\"))\n               .setField(repeatedGroupA, 317).build());\n      message.addRepeatedField(f(\"repeated_nested_message\"),\n        newBuilderForField(message, f(\"repeated_nested_message\"))\n               .setField(nestedB, 318).build());\n      message.addRepeatedField(f(\"repeated_foreign_message\"),\n        newBuilderForField(message, f(\"repeated_foreign_message\"))\n               .setField(foreignC, 319).build());\n      message.addRepeatedField(f(\"repeated_import_message\"),\n        newBuilderForField(message, f(\"repeated_import_message\"))\n               .setField(importD, 320).build());\n\n      message.addRepeatedField(f(\"repeated_nested_enum\" ),  nestedBaz);\n      message.addRepeatedField(f(\"repeated_foreign_enum\"), foreignBaz);\n      message.addRepeatedField(f(\"repeated_import_enum\" ),  importBaz);\n\n      message.addRepeatedField(f(\"repeated_string_piece\" ), \"324\");\n      message.addRepeatedField(f(\"repeated_cord\" ), \"325\");\n\n      // -----------------------------------------------------------------\n\n      message.setField(f(\"default_int32\"   ), 401 );\n      message.setField(f(\"default_int64\"   ), 402L);\n      message.setField(f(\"default_uint32\"  ), 403 );\n      message.setField(f(\"default_uint64\"  ), 404L);\n      message.setField(f(\"default_sint32\"  ), 405 );\n      message.setField(f(\"default_sint64\"  ), 406L);\n      message.setField(f(\"default_fixed32\" ), 407 );\n      message.setField(f(\"default_fixed64\" ), 408L);\n      message.setField(f(\"default_sfixed32\"), 409 );\n      message.setField(f(\"default_sfixed64\"), 410L);\n      message.setField(f(\"default_float\"   ), 411F);\n      message.setField(f(\"default_double\"  ), 412D);\n      message.setField(f(\"default_bool\"    ), false);\n      message.setField(f(\"default_string\"  ), \"415\");\n      message.setField(f(\"default_bytes\"   ), toBytes(\"416\"));\n\n      message.setField(f(\"default_nested_enum\" ),  nestedFoo);\n      message.setField(f(\"default_foreign_enum\"), foreignFoo);\n      message.setField(f(\"default_import_enum\" ),  importFoo);\n\n      message.setField(f(\"default_string_piece\" ), \"424\");\n      message.setField(f(\"default_cord\" ), \"425\");\n    }\n\n    // -------------------------------------------------------------------\n\n    /**\n     * Modify the repeated fields of {@code message} to contain the values\n     * expected by {@code assertRepeatedFieldsModified()}, using the\n     * {@link Message.Builder} reflection interface.\n     */\n    void modifyRepeatedFieldsViaReflection(Message.Builder message) {\n      message.setRepeatedField(f(\"repeated_int32\"   ), 1, 501 );\n      message.setRepeatedField(f(\"repeated_int64\"   ), 1, 502L);\n      message.setRepeatedField(f(\"repeated_uint32\"  ), 1, 503 );\n      message.setRepeatedField(f(\"repeated_uint64\"  ), 1, 504L);\n      message.setRepeatedField(f(\"repeated_sint32\"  ), 1, 505 );\n      message.setRepeatedField(f(\"repeated_sint64\"  ), 1, 506L);\n      message.setRepeatedField(f(\"repeated_fixed32\" ), 1, 507 );\n      message.setRepeatedField(f(\"repeated_fixed64\" ), 1, 508L);\n      message.setRepeatedField(f(\"repeated_sfixed32\"), 1, 509 );\n      message.setRepeatedField(f(\"repeated_sfixed64\"), 1, 510L);\n      message.setRepeatedField(f(\"repeated_float\"   ), 1, 511F);\n      message.setRepeatedField(f(\"repeated_double\"  ), 1, 512D);\n      message.setRepeatedField(f(\"repeated_bool\"    ), 1, true);\n      message.setRepeatedField(f(\"repeated_string\"  ), 1, \"515\");\n      message.setRepeatedField(f(\"repeated_bytes\"   ), 1, toBytes(\"516\"));\n\n      message.setRepeatedField(f(\"repeatedgroup\"), 1,\n        newBuilderForField(message, f(\"repeatedgroup\"))\n               .setField(repeatedGroupA, 517).build());\n      message.setRepeatedField(f(\"repeated_nested_message\"), 1,\n        newBuilderForField(message, f(\"repeated_nested_message\"))\n               .setField(nestedB, 518).build());\n      message.setRepeatedField(f(\"repeated_foreign_message\"), 1,\n        newBuilderForField(message, f(\"repeated_foreign_message\"))\n               .setField(foreignC, 519).build());\n      message.setRepeatedField(f(\"repeated_import_message\"), 1,\n        newBuilderForField(message, f(\"repeated_import_message\"))\n               .setField(importD, 520).build());\n\n      message.setRepeatedField(f(\"repeated_nested_enum\" ), 1,  nestedFoo);\n      message.setRepeatedField(f(\"repeated_foreign_enum\"), 1, foreignFoo);\n      message.setRepeatedField(f(\"repeated_import_enum\" ), 1,  importFoo);\n\n      message.setRepeatedField(f(\"repeated_string_piece\"), 1, \"524\");\n      message.setRepeatedField(f(\"repeated_cord\"), 1, \"525\");\n    }\n\n    // -------------------------------------------------------------------\n\n    /**\n     * Assert (using {@code junit.framework.Assert}} that all fields of\n     * {@code message} are set to the values assigned by {@code setAllFields},\n     * using the {@link Message} reflection interface.\n     */\n    public void assertAllFieldsSetViaReflection(MessageOrBuilder message) {\n      Assert.assertTrue(message.hasField(f(\"optional_int32\"   )));\n      Assert.assertTrue(message.hasField(f(\"optional_int64\"   )));\n      Assert.assertTrue(message.hasField(f(\"optional_uint32\"  )));\n      Assert.assertTrue(message.hasField(f(\"optional_uint64\"  )));\n      Assert.assertTrue(message.hasField(f(\"optional_sint32\"  )));\n      Assert.assertTrue(message.hasField(f(\"optional_sint64\"  )));\n      Assert.assertTrue(message.hasField(f(\"optional_fixed32\" )));\n      Assert.assertTrue(message.hasField(f(\"optional_fixed64\" )));\n      Assert.assertTrue(message.hasField(f(\"optional_sfixed32\")));\n      Assert.assertTrue(message.hasField(f(\"optional_sfixed64\")));\n      Assert.assertTrue(message.hasField(f(\"optional_float\"   )));\n      Assert.assertTrue(message.hasField(f(\"optional_double\"  )));\n      Assert.assertTrue(message.hasField(f(\"optional_bool\"    )));\n      Assert.assertTrue(message.hasField(f(\"optional_string\"  )));\n      Assert.assertTrue(message.hasField(f(\"optional_bytes\"   )));\n\n      Assert.assertTrue(message.hasField(f(\"optionalgroup\"           )));\n      Assert.assertTrue(message.hasField(f(\"optional_nested_message\" )));\n      Assert.assertTrue(message.hasField(f(\"optional_foreign_message\")));\n      Assert.assertTrue(message.hasField(f(\"optional_import_message\" )));\n\n      Assert.assertTrue(\n        ((Message)message.getField(f(\"optionalgroup\"))).hasField(groupA));\n      Assert.assertTrue(\n        ((Message)message.getField(f(\"optional_nested_message\")))\n                         .hasField(nestedB));\n      Assert.assertTrue(\n        ((Message)message.getField(f(\"optional_foreign_message\")))\n                         .hasField(foreignC));\n      Assert.assertTrue(\n        ((Message)message.getField(f(\"optional_import_message\")))\n                         .hasField(importD));\n\n      Assert.assertTrue(message.hasField(f(\"optional_nested_enum\" )));\n      Assert.assertTrue(message.hasField(f(\"optional_foreign_enum\")));\n      Assert.assertTrue(message.hasField(f(\"optional_import_enum\" )));\n\n      Assert.assertTrue(message.hasField(f(\"optional_string_piece\")));\n      Assert.assertTrue(message.hasField(f(\"optional_cord\")));\n\n      Assert.assertEquals(101  , message.getField(f(\"optional_int32\"   )));\n      Assert.assertEquals(102L , message.getField(f(\"optional_int64\"   )));\n      Assert.assertEquals(103  , message.getField(f(\"optional_uint32\"  )));\n      Assert.assertEquals(104L , message.getField(f(\"optional_uint64\"  )));\n      Assert.assertEquals(105  , message.getField(f(\"optional_sint32\"  )));\n      Assert.assertEquals(106L , message.getField(f(\"optional_sint64\"  )));\n      Assert.assertEquals(107  , message.getField(f(\"optional_fixed32\" )));\n      Assert.assertEquals(108L , message.getField(f(\"optional_fixed64\" )));\n      Assert.assertEquals(109  , message.getField(f(\"optional_sfixed32\")));\n      Assert.assertEquals(110L , message.getField(f(\"optional_sfixed64\")));\n      Assert.assertEquals(111F , message.getField(f(\"optional_float\"   )));\n      Assert.assertEquals(112D , message.getField(f(\"optional_double\"  )));\n      Assert.assertEquals(true , message.getField(f(\"optional_bool\"    )));\n      Assert.assertEquals(\"115\", message.getField(f(\"optional_string\"  )));\n      Assert.assertEquals(toBytes(\"116\"), message.getField(f(\"optional_bytes\")));\n\n      Assert.assertEquals(117,\n        ((Message)message.getField(f(\"optionalgroup\"))).getField(groupA));\n      Assert.assertEquals(118,\n        ((Message)message.getField(f(\"optional_nested_message\")))\n                         .getField(nestedB));\n      Assert.assertEquals(119,\n        ((Message)message.getField(f(\"optional_foreign_message\")))\n                         .getField(foreignC));\n      Assert.assertEquals(120,\n        ((Message)message.getField(f(\"optional_import_message\")))\n                         .getField(importD));\n\n      Assert.assertEquals( nestedBaz, message.getField(f(\"optional_nested_enum\" )));\n      Assert.assertEquals(foreignBaz, message.getField(f(\"optional_foreign_enum\")));\n      Assert.assertEquals( importBaz, message.getField(f(\"optional_import_enum\" )));\n\n      Assert.assertEquals(\"124\", message.getField(f(\"optional_string_piece\")));\n      Assert.assertEquals(\"125\", message.getField(f(\"optional_cord\")));\n\n      // -----------------------------------------------------------------\n\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_int32\"   )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_int64\"   )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_uint32\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_uint64\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_sint32\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_sint64\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_fixed32\" )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_fixed64\" )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_sfixed32\")));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_sfixed64\")));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_float\"   )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_double\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_bool\"    )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_string\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_bytes\"   )));\n\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeatedgroup\"           )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_nested_message\" )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_foreign_message\")));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_import_message\" )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_nested_enum\"    )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_foreign_enum\"   )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_import_enum\"    )));\n\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_string_piece\")));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_cord\")));\n\n      Assert.assertEquals(201  , message.getRepeatedField(f(\"repeated_int32\"   ), 0));\n      Assert.assertEquals(202L , message.getRepeatedField(f(\"repeated_int64\"   ), 0));\n      Assert.assertEquals(203  , message.getRepeatedField(f(\"repeated_uint32\"  ), 0));\n      Assert.assertEquals(204L , message.getRepeatedField(f(\"repeated_uint64\"  ), 0));\n      Assert.assertEquals(205  , message.getRepeatedField(f(\"repeated_sint32\"  ), 0));\n      Assert.assertEquals(206L , message.getRepeatedField(f(\"repeated_sint64\"  ), 0));\n      Assert.assertEquals(207  , message.getRepeatedField(f(\"repeated_fixed32\" ), 0));\n      Assert.assertEquals(208L , message.getRepeatedField(f(\"repeated_fixed64\" ), 0));\n      Assert.assertEquals(209  , message.getRepeatedField(f(\"repeated_sfixed32\"), 0));\n      Assert.assertEquals(210L , message.getRepeatedField(f(\"repeated_sfixed64\"), 0));\n      Assert.assertEquals(211F , message.getRepeatedField(f(\"repeated_float\"   ), 0));\n      Assert.assertEquals(212D , message.getRepeatedField(f(\"repeated_double\"  ), 0));\n      Assert.assertEquals(true , message.getRepeatedField(f(\"repeated_bool\"    ), 0));\n      Assert.assertEquals(\"215\", message.getRepeatedField(f(\"repeated_string\"  ), 0));\n      Assert.assertEquals(toBytes(\"216\"), message.getRepeatedField(f(\"repeated_bytes\"), 0));\n\n      Assert.assertEquals(217,\n        ((Message)message.getRepeatedField(f(\"repeatedgroup\"), 0))\n                         .getField(repeatedGroupA));\n      Assert.assertEquals(218,\n        ((Message)message.getRepeatedField(f(\"repeated_nested_message\"), 0))\n                         .getField(nestedB));\n      Assert.assertEquals(219,\n        ((Message)message.getRepeatedField(f(\"repeated_foreign_message\"), 0))\n                         .getField(foreignC));\n      Assert.assertEquals(220,\n        ((Message)message.getRepeatedField(f(\"repeated_import_message\"), 0))\n                         .getField(importD));\n\n      Assert.assertEquals( nestedBar, message.getRepeatedField(f(\"repeated_nested_enum\" ),0));\n      Assert.assertEquals(foreignBar, message.getRepeatedField(f(\"repeated_foreign_enum\"),0));\n      Assert.assertEquals( importBar, message.getRepeatedField(f(\"repeated_import_enum\" ),0));\n\n      Assert.assertEquals(\"224\", message.getRepeatedField(f(\"repeated_string_piece\"), 0));\n      Assert.assertEquals(\"225\", message.getRepeatedField(f(\"repeated_cord\"), 0));\n\n      Assert.assertEquals(301  , message.getRepeatedField(f(\"repeated_int32\"   ), 1));\n      Assert.assertEquals(302L , message.getRepeatedField(f(\"repeated_int64\"   ), 1));\n      Assert.assertEquals(303  , message.getRepeatedField(f(\"repeated_uint32\"  ), 1));\n      Assert.assertEquals(304L , message.getRepeatedField(f(\"repeated_uint64\"  ), 1));\n      Assert.assertEquals(305  , message.getRepeatedField(f(\"repeated_sint32\"  ), 1));\n      Assert.assertEquals(306L , message.getRepeatedField(f(\"repeated_sint64\"  ), 1));\n      Assert.assertEquals(307  , message.getRepeatedField(f(\"repeated_fixed32\" ), 1));\n      Assert.assertEquals(308L , message.getRepeatedField(f(\"repeated_fixed64\" ), 1));\n      Assert.assertEquals(309  , message.getRepeatedField(f(\"repeated_sfixed32\"), 1));\n      Assert.assertEquals(310L , message.getRepeatedField(f(\"repeated_sfixed64\"), 1));\n      Assert.assertEquals(311F , message.getRepeatedField(f(\"repeated_float\"   ), 1));\n      Assert.assertEquals(312D , message.getRepeatedField(f(\"repeated_double\"  ), 1));\n      Assert.assertEquals(false, message.getRepeatedField(f(\"repeated_bool\"    ), 1));\n      Assert.assertEquals(\"315\", message.getRepeatedField(f(\"repeated_string\"  ), 1));\n      Assert.assertEquals(toBytes(\"316\"), message.getRepeatedField(f(\"repeated_bytes\"), 1));\n\n      Assert.assertEquals(317,\n        ((Message)message.getRepeatedField(f(\"repeatedgroup\"), 1))\n                         .getField(repeatedGroupA));\n      Assert.assertEquals(318,\n        ((Message)message.getRepeatedField(f(\"repeated_nested_message\"), 1))\n                         .getField(nestedB));\n      Assert.assertEquals(319,\n        ((Message)message.getRepeatedField(f(\"repeated_foreign_message\"), 1))\n                         .getField(foreignC));\n      Assert.assertEquals(320,\n        ((Message)message.getRepeatedField(f(\"repeated_import_message\"), 1))\n                         .getField(importD));\n\n      Assert.assertEquals( nestedBaz, message.getRepeatedField(f(\"repeated_nested_enum\" ),1));\n      Assert.assertEquals(foreignBaz, message.getRepeatedField(f(\"repeated_foreign_enum\"),1));\n      Assert.assertEquals( importBaz, message.getRepeatedField(f(\"repeated_import_enum\" ),1));\n\n      Assert.assertEquals(\"324\", message.getRepeatedField(f(\"repeated_string_piece\"), 1));\n      Assert.assertEquals(\"325\", message.getRepeatedField(f(\"repeated_cord\"), 1));\n\n      // -----------------------------------------------------------------\n\n      Assert.assertTrue(message.hasField(f(\"default_int32\"   )));\n      Assert.assertTrue(message.hasField(f(\"default_int64\"   )));\n      Assert.assertTrue(message.hasField(f(\"default_uint32\"  )));\n      Assert.assertTrue(message.hasField(f(\"default_uint64\"  )));\n      Assert.assertTrue(message.hasField(f(\"default_sint32\"  )));\n      Assert.assertTrue(message.hasField(f(\"default_sint64\"  )));\n      Assert.assertTrue(message.hasField(f(\"default_fixed32\" )));\n      Assert.assertTrue(message.hasField(f(\"default_fixed64\" )));\n      Assert.assertTrue(message.hasField(f(\"default_sfixed32\")));\n      Assert.assertTrue(message.hasField(f(\"default_sfixed64\")));\n      Assert.assertTrue(message.hasField(f(\"default_float\"   )));\n      Assert.assertTrue(message.hasField(f(\"default_double\"  )));\n      Assert.assertTrue(message.hasField(f(\"default_bool\"    )));\n      Assert.assertTrue(message.hasField(f(\"default_string\"  )));\n      Assert.assertTrue(message.hasField(f(\"default_bytes\"   )));\n\n      Assert.assertTrue(message.hasField(f(\"default_nested_enum\" )));\n      Assert.assertTrue(message.hasField(f(\"default_foreign_enum\")));\n      Assert.assertTrue(message.hasField(f(\"default_import_enum\" )));\n\n      Assert.assertTrue(message.hasField(f(\"default_string_piece\")));\n      Assert.assertTrue(message.hasField(f(\"default_cord\")));\n\n      Assert.assertEquals(401  , message.getField(f(\"default_int32\"   )));\n      Assert.assertEquals(402L , message.getField(f(\"default_int64\"   )));\n      Assert.assertEquals(403  , message.getField(f(\"default_uint32\"  )));\n      Assert.assertEquals(404L , message.getField(f(\"default_uint64\"  )));\n      Assert.assertEquals(405  , message.getField(f(\"default_sint32\"  )));\n      Assert.assertEquals(406L , message.getField(f(\"default_sint64\"  )));\n      Assert.assertEquals(407  , message.getField(f(\"default_fixed32\" )));\n      Assert.assertEquals(408L , message.getField(f(\"default_fixed64\" )));\n      Assert.assertEquals(409  , message.getField(f(\"default_sfixed32\")));\n      Assert.assertEquals(410L , message.getField(f(\"default_sfixed64\")));\n      Assert.assertEquals(411F , message.getField(f(\"default_float\"   )));\n      Assert.assertEquals(412D , message.getField(f(\"default_double\"  )));\n      Assert.assertEquals(false, message.getField(f(\"default_bool\"    )));\n      Assert.assertEquals(\"415\", message.getField(f(\"default_string\"  )));\n      Assert.assertEquals(toBytes(\"416\"), message.getField(f(\"default_bytes\")));\n\n      Assert.assertEquals( nestedFoo, message.getField(f(\"default_nested_enum\" )));\n      Assert.assertEquals(foreignFoo, message.getField(f(\"default_foreign_enum\")));\n      Assert.assertEquals( importFoo, message.getField(f(\"default_import_enum\" )));\n\n      Assert.assertEquals(\"424\", message.getField(f(\"default_string_piece\")));\n      Assert.assertEquals(\"425\", message.getField(f(\"default_cord\")));\n    }\n\n    // -------------------------------------------------------------------\n\n    /**\n     * Assert (using {@code junit.framework.Assert}} that all fields of\n     * {@code message} are cleared, and that getting the fields returns their\n     * default values, using the {@link Message} reflection interface.\n     */\n    public void assertClearViaReflection(MessageOrBuilder message) {\n      // has_blah() should initially be false for all optional fields.\n      Assert.assertFalse(message.hasField(f(\"optional_int32\"   )));\n      Assert.assertFalse(message.hasField(f(\"optional_int64\"   )));\n      Assert.assertFalse(message.hasField(f(\"optional_uint32\"  )));\n      Assert.assertFalse(message.hasField(f(\"optional_uint64\"  )));\n      Assert.assertFalse(message.hasField(f(\"optional_sint32\"  )));\n      Assert.assertFalse(message.hasField(f(\"optional_sint64\"  )));\n      Assert.assertFalse(message.hasField(f(\"optional_fixed32\" )));\n      Assert.assertFalse(message.hasField(f(\"optional_fixed64\" )));\n      Assert.assertFalse(message.hasField(f(\"optional_sfixed32\")));\n      Assert.assertFalse(message.hasField(f(\"optional_sfixed64\")));\n      Assert.assertFalse(message.hasField(f(\"optional_float\"   )));\n      Assert.assertFalse(message.hasField(f(\"optional_double\"  )));\n      Assert.assertFalse(message.hasField(f(\"optional_bool\"    )));\n      Assert.assertFalse(message.hasField(f(\"optional_string\"  )));\n      Assert.assertFalse(message.hasField(f(\"optional_bytes\"   )));\n\n      Assert.assertFalse(message.hasField(f(\"optionalgroup\"           )));\n      Assert.assertFalse(message.hasField(f(\"optional_nested_message\" )));\n      Assert.assertFalse(message.hasField(f(\"optional_foreign_message\")));\n      Assert.assertFalse(message.hasField(f(\"optional_import_message\" )));\n\n      Assert.assertFalse(message.hasField(f(\"optional_nested_enum\" )));\n      Assert.assertFalse(message.hasField(f(\"optional_foreign_enum\")));\n      Assert.assertFalse(message.hasField(f(\"optional_import_enum\" )));\n\n      Assert.assertFalse(message.hasField(f(\"optional_string_piece\")));\n      Assert.assertFalse(message.hasField(f(\"optional_cord\")));\n\n      // Optional fields without defaults are set to zero or something like it.\n      Assert.assertEquals(0    , message.getField(f(\"optional_int32\"   )));\n      Assert.assertEquals(0L   , message.getField(f(\"optional_int64\"   )));\n      Assert.assertEquals(0    , message.getField(f(\"optional_uint32\"  )));\n      Assert.assertEquals(0L   , message.getField(f(\"optional_uint64\"  )));\n      Assert.assertEquals(0    , message.getField(f(\"optional_sint32\"  )));\n      Assert.assertEquals(0L   , message.getField(f(\"optional_sint64\"  )));\n      Assert.assertEquals(0    , message.getField(f(\"optional_fixed32\" )));\n      Assert.assertEquals(0L   , message.getField(f(\"optional_fixed64\" )));\n      Assert.assertEquals(0    , message.getField(f(\"optional_sfixed32\")));\n      Assert.assertEquals(0L   , message.getField(f(\"optional_sfixed64\")));\n      Assert.assertEquals(0F   , message.getField(f(\"optional_float\"   )));\n      Assert.assertEquals(0D   , message.getField(f(\"optional_double\"  )));\n      Assert.assertEquals(false, message.getField(f(\"optional_bool\"    )));\n      Assert.assertEquals(\"\"   , message.getField(f(\"optional_string\"  )));\n      Assert.assertEquals(ByteString.EMPTY, message.getField(f(\"optional_bytes\")));\n\n      // Embedded messages should also be clear.\n      Assert.assertFalse(\n        ((Message)message.getField(f(\"optionalgroup\"))).hasField(groupA));\n      Assert.assertFalse(\n        ((Message)message.getField(f(\"optional_nested_message\")))\n                         .hasField(nestedB));\n      Assert.assertFalse(\n        ((Message)message.getField(f(\"optional_foreign_message\")))\n                         .hasField(foreignC));\n      Assert.assertFalse(\n        ((Message)message.getField(f(\"optional_import_message\")))\n                         .hasField(importD));\n\n      Assert.assertEquals(0,\n        ((Message)message.getField(f(\"optionalgroup\"))).getField(groupA));\n      Assert.assertEquals(0,\n        ((Message)message.getField(f(\"optional_nested_message\")))\n                         .getField(nestedB));\n      Assert.assertEquals(0,\n        ((Message)message.getField(f(\"optional_foreign_message\")))\n                         .getField(foreignC));\n      Assert.assertEquals(0,\n        ((Message)message.getField(f(\"optional_import_message\")))\n                         .getField(importD));\n\n      // Enums without defaults are set to the first value in the enum.\n      Assert.assertEquals( nestedFoo, message.getField(f(\"optional_nested_enum\" )));\n      Assert.assertEquals(foreignFoo, message.getField(f(\"optional_foreign_enum\")));\n      Assert.assertEquals( importFoo, message.getField(f(\"optional_import_enum\" )));\n\n      Assert.assertEquals(\"\", message.getField(f(\"optional_string_piece\")));\n      Assert.assertEquals(\"\", message.getField(f(\"optional_cord\")));\n\n      // Repeated fields are empty.\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_int32\"   )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_int64\"   )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_uint32\"  )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_uint64\"  )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_sint32\"  )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_sint64\"  )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_fixed32\" )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_fixed64\" )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_sfixed32\")));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_sfixed64\")));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_float\"   )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_double\"  )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_bool\"    )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_string\"  )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_bytes\"   )));\n\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeatedgroup\"           )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_nested_message\" )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_foreign_message\")));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_import_message\" )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_nested_enum\"    )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_foreign_enum\"   )));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_import_enum\"    )));\n\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_string_piece\")));\n      Assert.assertEquals(0, message.getRepeatedFieldCount(f(\"repeated_cord\")));\n\n      // has_blah() should also be false for all default fields.\n      Assert.assertFalse(message.hasField(f(\"default_int32\"   )));\n      Assert.assertFalse(message.hasField(f(\"default_int64\"   )));\n      Assert.assertFalse(message.hasField(f(\"default_uint32\"  )));\n      Assert.assertFalse(message.hasField(f(\"default_uint64\"  )));\n      Assert.assertFalse(message.hasField(f(\"default_sint32\"  )));\n      Assert.assertFalse(message.hasField(f(\"default_sint64\"  )));\n      Assert.assertFalse(message.hasField(f(\"default_fixed32\" )));\n      Assert.assertFalse(message.hasField(f(\"default_fixed64\" )));\n      Assert.assertFalse(message.hasField(f(\"default_sfixed32\")));\n      Assert.assertFalse(message.hasField(f(\"default_sfixed64\")));\n      Assert.assertFalse(message.hasField(f(\"default_float\"   )));\n      Assert.assertFalse(message.hasField(f(\"default_double\"  )));\n      Assert.assertFalse(message.hasField(f(\"default_bool\"    )));\n      Assert.assertFalse(message.hasField(f(\"default_string\"  )));\n      Assert.assertFalse(message.hasField(f(\"default_bytes\"   )));\n\n      Assert.assertFalse(message.hasField(f(\"default_nested_enum\" )));\n      Assert.assertFalse(message.hasField(f(\"default_foreign_enum\")));\n      Assert.assertFalse(message.hasField(f(\"default_import_enum\" )));\n\n      Assert.assertFalse(message.hasField(f(\"default_string_piece\" )));\n      Assert.assertFalse(message.hasField(f(\"default_cord\" )));\n\n      // Fields with defaults have their default values (duh).\n      Assert.assertEquals( 41    , message.getField(f(\"default_int32\"   )));\n      Assert.assertEquals( 42L   , message.getField(f(\"default_int64\"   )));\n      Assert.assertEquals( 43    , message.getField(f(\"default_uint32\"  )));\n      Assert.assertEquals( 44L   , message.getField(f(\"default_uint64\"  )));\n      Assert.assertEquals(-45    , message.getField(f(\"default_sint32\"  )));\n      Assert.assertEquals( 46L   , message.getField(f(\"default_sint64\"  )));\n      Assert.assertEquals( 47    , message.getField(f(\"default_fixed32\" )));\n      Assert.assertEquals( 48L   , message.getField(f(\"default_fixed64\" )));\n      Assert.assertEquals( 49    , message.getField(f(\"default_sfixed32\")));\n      Assert.assertEquals(-50L   , message.getField(f(\"default_sfixed64\")));\n      Assert.assertEquals( 51.5F , message.getField(f(\"default_float\"   )));\n      Assert.assertEquals( 52e3D , message.getField(f(\"default_double\"  )));\n      Assert.assertEquals(true   , message.getField(f(\"default_bool\"    )));\n      Assert.assertEquals(\"hello\", message.getField(f(\"default_string\"  )));\n      Assert.assertEquals(toBytes(\"world\"), message.getField(f(\"default_bytes\")));\n\n      Assert.assertEquals( nestedBar, message.getField(f(\"default_nested_enum\" )));\n      Assert.assertEquals(foreignBar, message.getField(f(\"default_foreign_enum\")));\n      Assert.assertEquals( importBar, message.getField(f(\"default_import_enum\" )));\n\n      Assert.assertEquals(\"abc\", message.getField(f(\"default_string_piece\")));\n      Assert.assertEquals(\"123\", message.getField(f(\"default_cord\")));\n    }\n\n\n    // ---------------------------------------------------------------\n\n    public void assertRepeatedFieldsModifiedViaReflection(\n        MessageOrBuilder message) {\n      // ModifyRepeatedFields only sets the second repeated element of each\n      // field.  In addition to verifying this, we also verify that the first\n      // element and size were *not* modified.\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_int32\"   )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_int64\"   )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_uint32\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_uint64\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_sint32\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_sint64\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_fixed32\" )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_fixed64\" )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_sfixed32\")));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_sfixed64\")));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_float\"   )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_double\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_bool\"    )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_string\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_bytes\"   )));\n\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeatedgroup\"           )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_nested_message\" )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_foreign_message\")));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_import_message\" )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_nested_enum\"    )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_foreign_enum\"   )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_import_enum\"    )));\n\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_string_piece\")));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"repeated_cord\")));\n\n      Assert.assertEquals(201  , message.getRepeatedField(f(\"repeated_int32\"   ), 0));\n      Assert.assertEquals(202L , message.getRepeatedField(f(\"repeated_int64\"   ), 0));\n      Assert.assertEquals(203  , message.getRepeatedField(f(\"repeated_uint32\"  ), 0));\n      Assert.assertEquals(204L , message.getRepeatedField(f(\"repeated_uint64\"  ), 0));\n      Assert.assertEquals(205  , message.getRepeatedField(f(\"repeated_sint32\"  ), 0));\n      Assert.assertEquals(206L , message.getRepeatedField(f(\"repeated_sint64\"  ), 0));\n      Assert.assertEquals(207  , message.getRepeatedField(f(\"repeated_fixed32\" ), 0));\n      Assert.assertEquals(208L , message.getRepeatedField(f(\"repeated_fixed64\" ), 0));\n      Assert.assertEquals(209  , message.getRepeatedField(f(\"repeated_sfixed32\"), 0));\n      Assert.assertEquals(210L , message.getRepeatedField(f(\"repeated_sfixed64\"), 0));\n      Assert.assertEquals(211F , message.getRepeatedField(f(\"repeated_float\"   ), 0));\n      Assert.assertEquals(212D , message.getRepeatedField(f(\"repeated_double\"  ), 0));\n      Assert.assertEquals(true , message.getRepeatedField(f(\"repeated_bool\"    ), 0));\n      Assert.assertEquals(\"215\", message.getRepeatedField(f(\"repeated_string\"  ), 0));\n      Assert.assertEquals(toBytes(\"216\"), message.getRepeatedField(f(\"repeated_bytes\"), 0));\n\n      Assert.assertEquals(217,\n        ((Message)message.getRepeatedField(f(\"repeatedgroup\"), 0))\n                         .getField(repeatedGroupA));\n      Assert.assertEquals(218,\n        ((Message)message.getRepeatedField(f(\"repeated_nested_message\"), 0))\n                         .getField(nestedB));\n      Assert.assertEquals(219,\n        ((Message)message.getRepeatedField(f(\"repeated_foreign_message\"), 0))\n                         .getField(foreignC));\n      Assert.assertEquals(220,\n        ((Message)message.getRepeatedField(f(\"repeated_import_message\"), 0))\n                         .getField(importD));\n\n      Assert.assertEquals( nestedBar, message.getRepeatedField(f(\"repeated_nested_enum\" ),0));\n      Assert.assertEquals(foreignBar, message.getRepeatedField(f(\"repeated_foreign_enum\"),0));\n      Assert.assertEquals( importBar, message.getRepeatedField(f(\"repeated_import_enum\" ),0));\n\n      Assert.assertEquals(\"224\", message.getRepeatedField(f(\"repeated_string_piece\"), 0));\n      Assert.assertEquals(\"225\", message.getRepeatedField(f(\"repeated_cord\"), 0));\n\n      Assert.assertEquals(501  , message.getRepeatedField(f(\"repeated_int32\"   ), 1));\n      Assert.assertEquals(502L , message.getRepeatedField(f(\"repeated_int64\"   ), 1));\n      Assert.assertEquals(503  , message.getRepeatedField(f(\"repeated_uint32\"  ), 1));\n      Assert.assertEquals(504L , message.getRepeatedField(f(\"repeated_uint64\"  ), 1));\n      Assert.assertEquals(505  , message.getRepeatedField(f(\"repeated_sint32\"  ), 1));\n      Assert.assertEquals(506L , message.getRepeatedField(f(\"repeated_sint64\"  ), 1));\n      Assert.assertEquals(507  , message.getRepeatedField(f(\"repeated_fixed32\" ), 1));\n      Assert.assertEquals(508L , message.getRepeatedField(f(\"repeated_fixed64\" ), 1));\n      Assert.assertEquals(509  , message.getRepeatedField(f(\"repeated_sfixed32\"), 1));\n      Assert.assertEquals(510L , message.getRepeatedField(f(\"repeated_sfixed64\"), 1));\n      Assert.assertEquals(511F , message.getRepeatedField(f(\"repeated_float\"   ), 1));\n      Assert.assertEquals(512D , message.getRepeatedField(f(\"repeated_double\"  ), 1));\n      Assert.assertEquals(true , message.getRepeatedField(f(\"repeated_bool\"    ), 1));\n      Assert.assertEquals(\"515\", message.getRepeatedField(f(\"repeated_string\"  ), 1));\n      Assert.assertEquals(toBytes(\"516\"), message.getRepeatedField(f(\"repeated_bytes\"), 1));\n\n      Assert.assertEquals(517,\n        ((Message)message.getRepeatedField(f(\"repeatedgroup\"), 1))\n                         .getField(repeatedGroupA));\n      Assert.assertEquals(518,\n        ((Message)message.getRepeatedField(f(\"repeated_nested_message\"), 1))\n                         .getField(nestedB));\n      Assert.assertEquals(519,\n        ((Message)message.getRepeatedField(f(\"repeated_foreign_message\"), 1))\n                         .getField(foreignC));\n      Assert.assertEquals(520,\n        ((Message)message.getRepeatedField(f(\"repeated_import_message\"), 1))\n                         .getField(importD));\n\n      Assert.assertEquals( nestedFoo, message.getRepeatedField(f(\"repeated_nested_enum\" ),1));\n      Assert.assertEquals(foreignFoo, message.getRepeatedField(f(\"repeated_foreign_enum\"),1));\n      Assert.assertEquals( importFoo, message.getRepeatedField(f(\"repeated_import_enum\" ),1));\n\n      Assert.assertEquals(\"524\", message.getRepeatedField(f(\"repeated_string_piece\"), 1));\n      Assert.assertEquals(\"525\", message.getRepeatedField(f(\"repeated_cord\"), 1));\n    }\n\n    public void setPackedFieldsViaReflection(Message.Builder message) {\n      message.addRepeatedField(f(\"packed_int32\"   ), 601 );\n      message.addRepeatedField(f(\"packed_int64\"   ), 602L);\n      message.addRepeatedField(f(\"packed_uint32\"  ), 603 );\n      message.addRepeatedField(f(\"packed_uint64\"  ), 604L);\n      message.addRepeatedField(f(\"packed_sint32\"  ), 605 );\n      message.addRepeatedField(f(\"packed_sint64\"  ), 606L);\n      message.addRepeatedField(f(\"packed_fixed32\" ), 607 );\n      message.addRepeatedField(f(\"packed_fixed64\" ), 608L);\n      message.addRepeatedField(f(\"packed_sfixed32\"), 609 );\n      message.addRepeatedField(f(\"packed_sfixed64\"), 610L);\n      message.addRepeatedField(f(\"packed_float\"   ), 611F);\n      message.addRepeatedField(f(\"packed_double\"  ), 612D);\n      message.addRepeatedField(f(\"packed_bool\"    ), true);\n      message.addRepeatedField(f(\"packed_enum\" ),  foreignBar);\n      // Add a second one of each field.\n      message.addRepeatedField(f(\"packed_int32\"   ), 701 );\n      message.addRepeatedField(f(\"packed_int64\"   ), 702L);\n      message.addRepeatedField(f(\"packed_uint32\"  ), 703 );\n      message.addRepeatedField(f(\"packed_uint64\"  ), 704L);\n      message.addRepeatedField(f(\"packed_sint32\"  ), 705 );\n      message.addRepeatedField(f(\"packed_sint64\"  ), 706L);\n      message.addRepeatedField(f(\"packed_fixed32\" ), 707 );\n      message.addRepeatedField(f(\"packed_fixed64\" ), 708L);\n      message.addRepeatedField(f(\"packed_sfixed32\"), 709 );\n      message.addRepeatedField(f(\"packed_sfixed64\"), 710L);\n      message.addRepeatedField(f(\"packed_float\"   ), 711F);\n      message.addRepeatedField(f(\"packed_double\"  ), 712D);\n      message.addRepeatedField(f(\"packed_bool\"    ), false);\n      message.addRepeatedField(f(\"packed_enum\" ),  foreignBaz);\n    }\n\n    public void assertPackedFieldsSetViaReflection(MessageOrBuilder message) {\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_int32\"   )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_int64\"   )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_uint32\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_uint64\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_sint32\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_sint64\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_fixed32\" )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_fixed64\" )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_sfixed32\")));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_sfixed64\")));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_float\"   )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_double\"  )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_bool\"    )));\n      Assert.assertEquals(2, message.getRepeatedFieldCount(f(\"packed_enum\"   )));\n      Assert.assertEquals(601  , message.getRepeatedField(f(\"packed_int32\"   ), 0));\n      Assert.assertEquals(602L , message.getRepeatedField(f(\"packed_int64\"   ), 0));\n      Assert.assertEquals(603  , message.getRepeatedField(f(\"packed_uint32\"  ), 0));\n      Assert.assertEquals(604L , message.getRepeatedField(f(\"packed_uint64\"  ), 0));\n      Assert.assertEquals(605  , message.getRepeatedField(f(\"packed_sint32\"  ), 0));\n      Assert.assertEquals(606L , message.getRepeatedField(f(\"packed_sint64\"  ), 0));\n      Assert.assertEquals(607  , message.getRepeatedField(f(\"packed_fixed32\" ), 0));\n      Assert.assertEquals(608L , message.getRepeatedField(f(\"packed_fixed64\" ), 0));\n      Assert.assertEquals(609  , message.getRepeatedField(f(\"packed_sfixed32\"), 0));\n      Assert.assertEquals(610L , message.getRepeatedField(f(\"packed_sfixed64\"), 0));\n      Assert.assertEquals(611F , message.getRepeatedField(f(\"packed_float\"   ), 0));\n      Assert.assertEquals(612D , message.getRepeatedField(f(\"packed_double\"  ), 0));\n      Assert.assertEquals(true , message.getRepeatedField(f(\"packed_bool\"    ), 0));\n      Assert.assertEquals(foreignBar, message.getRepeatedField(f(\"packed_enum\" ),0));\n      Assert.assertEquals(701  , message.getRepeatedField(f(\"packed_int32\"   ), 1));\n      Assert.assertEquals(702L , message.getRepeatedField(f(\"packed_int64\"   ), 1));\n      Assert.assertEquals(703  , message.getRepeatedField(f(\"packed_uint32\"  ), 1));\n      Assert.assertEquals(704L , message.getRepeatedField(f(\"packed_uint64\"  ), 1));\n      Assert.assertEquals(705  , message.getRepeatedField(f(\"packed_sint32\"  ), 1));\n      Assert.assertEquals(706L , message.getRepeatedField(f(\"packed_sint64\"  ), 1));\n      Assert.assertEquals(707  , message.getRepeatedField(f(\"packed_fixed32\" ), 1));\n      Assert.assertEquals(708L , message.getRepeatedField(f(\"packed_fixed64\" ), 1));\n      Assert.assertEquals(709  , message.getRepeatedField(f(\"packed_sfixed32\"), 1));\n      Assert.assertEquals(710L , message.getRepeatedField(f(\"packed_sfixed64\"), 1));\n      Assert.assertEquals(711F , message.getRepeatedField(f(\"packed_float\"   ), 1));\n      Assert.assertEquals(712D , message.getRepeatedField(f(\"packed_double\"  ), 1));\n      Assert.assertEquals(false, message.getRepeatedField(f(\"packed_bool\"    ), 1));\n      Assert.assertEquals(foreignBaz, message.getRepeatedField(f(\"packed_enum\" ),1));\n    }\n\n    /**\n     * Verifies that the reflection setters for the given.Builder object throw a\n     * NullPointerException if they are passed a null value.  Uses Assert to throw an\n     * appropriate assertion failure, if the condition is not verified.\n     */\n    public void assertReflectionSettersRejectNull(Message.Builder builder)\n        throws Exception {\n      try {\n        builder.setField(f(\"optional_string\"), null);\n        Assert.fail(\"Exception was not thrown\");\n      } catch (NullPointerException e) {\n        // We expect this exception.\n      }\n      try {\n        builder.setField(f(\"optional_bytes\"), null);\n        Assert.fail(\"Exception was not thrown\");\n      } catch (NullPointerException e) {\n        // We expect this exception.\n      }\n      try {\n        builder.setField(f(\"optional_nested_enum\"), null);\n        Assert.fail(\"Exception was not thrown\");\n      } catch (NullPointerException e) {\n        // We expect this exception.\n      }\n      try {\n        builder.setField(f(\"optional_nested_message\"),\n                         (TestAllTypes.NestedMessage) null);\n        Assert.fail(\"Exception was not thrown\");\n      } catch (NullPointerException e) {\n        // We expect this exception.\n      }\n      try {\n        builder.setField(f(\"optional_nested_message\"),\n                         (TestAllTypes.NestedMessage.Builder) null);\n        Assert.fail(\"Exception was not thrown\");\n      } catch (NullPointerException e) {\n        // We expect this exception.\n      }\n\n      try {\n        builder.addRepeatedField(f(\"repeated_string\"), null);\n        Assert.fail(\"Exception was not thrown\");\n      } catch (NullPointerException e) {\n        // We expect this exception.\n      }\n      try {\n        builder.addRepeatedField(f(\"repeated_bytes\"), null);\n        Assert.fail(\"Exception was not thrown\");\n      } catch (NullPointerException e) {\n        // We expect this exception.\n      }\n      try {\n        builder.addRepeatedField(f(\"repeated_nested_enum\"), null);\n        Assert.fail(\"Exception was not thrown\");\n      } catch (NullPointerException e) {\n        // We expect this exception.\n      }\n      try {\n        builder.addRepeatedField(f(\"repeated_nested_message\"), null);\n        Assert.fail(\"Exception was not thrown\");\n      } catch (NullPointerException e) {\n        // We expect this exception.\n      }\n    }\n\n    /**\n     * Verifies that the reflection repeated setters for the given Builder object throw a\n     * NullPointerException if they are passed a null value.  Uses Assert to throw an appropriate\n     * assertion failure, if the condition is not verified.\n     */\n    public void assertReflectionRepeatedSettersRejectNull(Message.Builder builder)\n        throws Exception {\n      builder.addRepeatedField(f(\"repeated_string\"), \"one\");\n      try {\n        builder.setRepeatedField(f(\"repeated_string\"), 0, null);\n        Assert.fail(\"Exception was not thrown\");\n      } catch (NullPointerException e) {\n        // We expect this exception.\n      }\n\n      builder.addRepeatedField(f(\"repeated_bytes\"), toBytes(\"one\"));\n      try {\n        builder.setRepeatedField(f(\"repeated_bytes\"), 0, null);\n        Assert.fail(\"Exception was not thrown\");\n      } catch (NullPointerException e) {\n        // We expect this exception.\n      }\n\n      builder.addRepeatedField(f(\"repeated_nested_enum\"), nestedBaz);\n      try {\n        builder.setRepeatedField(f(\"repeated_nested_enum\"), 0, null);\n        Assert.fail(\"Exception was not thrown\");\n      } catch (NullPointerException e) {\n        // We expect this exception.\n      }\n\n      builder.addRepeatedField(\n          f(\"repeated_nested_message\"),\n          TestAllTypes.NestedMessage.newBuilder().setBb(218).build());\n      try {\n        builder.setRepeatedField(f(\"repeated_nested_message\"), 0, null);\n        Assert.fail(\"Exception was not thrown\");\n      } catch (NullPointerException e) {\n        // We expect this exception.\n      }\n    }\n  }\n\n  /**\n   * @param filePath The path relative to\n   * {@link #getTestDataDir}.\n   */\n  public static String readTextFromFile(String filePath) {\n    return readBytesFromFile(filePath).toStringUtf8();\n  }\n\n  private static File getTestDataDir() {\n    // Search each parent directory looking for \"src/google/protobuf\".\n    File ancestor = new File(\".\");\n    try {\n      ancestor = ancestor.getCanonicalFile();\n    } catch (IOException e) {\n      throw new RuntimeException(\n        \"Couldn't get canonical name of working directory.\", e);\n    }\n    while (ancestor != null && ancestor.exists()) {\n      if (new File(ancestor, \"src/google/protobuf\").exists()) {\n        return new File(ancestor, \"src/google/protobuf/testdata\");\n      }\n      ancestor = ancestor.getParentFile();\n    }\n\n    throw new RuntimeException(\n      \"Could not find golden files.  This test must be run from within the \" +\n      \"protobuf source package so that it can read test data files from the \" +\n      \"C++ source tree.\");\n  }\n\n  /**\n   * @param filename The path relative to\n   * {@link #getTestDataDir}.\n   */\n  public static ByteString readBytesFromFile(String filename) {\n    File fullPath = new File(getTestDataDir(), filename);\n    try {\n      RandomAccessFile file = new RandomAccessFile(fullPath, \"r\");\n      byte[] content = new byte[(int) file.length()];\n      file.readFully(content);\n      return ByteString.copyFrom(content);\n    } catch (IOException e) {\n      // Throw a RuntimeException here so that we can call this function from\n      // static initializers.\n      throw new IllegalArgumentException(\n        \"Couldn't read file: \" + fullPath.getPath(), e);\n    }\n  }\n\n  /**\n   * Get the bytes of the \"golden message\".  This is a serialized TestAllTypes\n   * with all fields set as they would be by\n   * {@link #setAllFields(TestAllTypes.Builder)}, but it is loaded from a file\n   * on disk rather than generated dynamically.  The file is actually generated\n   * by C++ code, so testing against it verifies compatibility with C++.\n   */\n  public static ByteString getGoldenMessage() {\n    if (goldenMessage == null) {\n      goldenMessage = readBytesFromFile(\"golden_message\");\n    }\n    return goldenMessage;\n  }\n  private static ByteString goldenMessage = null;\n\n  /**\n   * Get the bytes of the \"golden packed fields message\".  This is a serialized\n   * TestPackedTypes with all fields set as they would be by\n   * {@link #setPackedFields(TestPackedTypes.Builder)}, but it is loaded from a\n   * file on disk rather than generated dynamically.  The file is actually\n   * generated by C++ code, so testing against it verifies compatibility with\n   * C++.\n   */\n  public static ByteString getGoldenPackedFieldsMessage() {\n    if (goldenPackedFieldsMessage == null) {\n      goldenPackedFieldsMessage =\n          readBytesFromFile(\"golden_packed_fields_message\");\n    }\n    return goldenPackedFieldsMessage;\n  }\n  private static ByteString goldenPackedFieldsMessage = null;\n\n  /**\n   * Mock implementation of {@link GeneratedMessage.BuilderParent} for testing.\n   *\n   * @author jonp@google.com (Jon Perlow)\n   */\n  public static class MockBuilderParent\n      implements GeneratedMessage.BuilderParent {\n\n    private int invalidations;\n\n    //@Override (Java 1.6 override semantics, but we must support 1.5)\n    public void markDirty() {\n      invalidations++;\n    }\n\n    public int getInvalidationCount() {\n      return invalidations;\n    }\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport com.google.protobuf.Descriptors.FieldDescriptor;\nimport protobuf_unittest.UnittestMset.TestMessageSet;\nimport protobuf_unittest.UnittestMset.TestMessageSetExtension1;\nimport protobuf_unittest.UnittestMset.TestMessageSetExtension2;\nimport protobuf_unittest.UnittestProto.OneString;\nimport protobuf_unittest.UnittestProto.TestAllExtensions;\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage;\nimport protobuf_unittest.UnittestProto.TestEmptyMessage;\n\nimport junit.framework.TestCase;\n\nimport java.io.StringReader;\n\n/**\n * Test case for {@link TextFormat}.\n *\n * TODO(wenboz): ExtensionTest and rest of text_format_unittest.cc.\n *\n * @author wenboz@google.com (Wenbo Zhu)\n */\npublic class TextFormatTest extends TestCase {\n\n  // A basic string with different escapable characters for testing.\n  private final static String kEscapeTestString =\n      \"\\\"A string with ' characters \\n and \\r newlines and \\t tabs and \\001 \"\n          + \"slashes \\\\\";\n\n  // A representation of the above string with all the characters escaped.\n  private final static String kEscapeTestStringEscaped =\n      \"\\\\\\\"A string with \\\\' characters \\\\n and \\\\r newlines \"\n          + \"and \\\\t tabs and \\\\001 slashes \\\\\\\\\";\n\n  private static String allFieldsSetText = TestUtil.readTextFromFile(\n    \"text_format_unittest_data.txt\");\n  private static String allExtensionsSetText = TestUtil.readTextFromFile(\n    \"text_format_unittest_extensions_data.txt\");\n\n  private static String exoticText =\n    \"repeated_int32: -1\\n\" +\n    \"repeated_int32: -2147483648\\n\" +\n    \"repeated_int64: -1\\n\" +\n    \"repeated_int64: -9223372036854775808\\n\" +\n    \"repeated_uint32: 4294967295\\n\" +\n    \"repeated_uint32: 2147483648\\n\" +\n    \"repeated_uint64: 18446744073709551615\\n\" +\n    \"repeated_uint64: 9223372036854775808\\n\" +\n    \"repeated_double: 123.0\\n\" +\n    \"repeated_double: 123.5\\n\" +\n    \"repeated_double: 0.125\\n\" +\n    \"repeated_double: .125\\n\" +\n    \"repeated_double: -.125\\n\" +\n    \"repeated_double: 1.23E17\\n\" +\n    \"repeated_double: 1.23E+17\\n\" +\n    \"repeated_double: -1.23e-17\\n\" +\n    \"repeated_double: .23e+17\\n\" +\n    \"repeated_double: -.23E17\\n\" +\n    \"repeated_double: 1.235E22\\n\" +\n    \"repeated_double: 1.235E-18\\n\" +\n    \"repeated_double: 123.456789\\n\" +\n    \"repeated_double: Infinity\\n\" +\n    \"repeated_double: -Infinity\\n\" +\n    \"repeated_double: NaN\\n\" +\n    \"repeated_string: \\\"\\\\000\\\\001\\\\a\\\\b\\\\f\\\\n\\\\r\\\\t\\\\v\\\\\\\\\\\\'\\\\\\\"\" +\n      \"\\\\341\\\\210\\\\264\\\"\\n\" +\n    \"repeated_bytes: \\\"\\\\000\\\\001\\\\a\\\\b\\\\f\\\\n\\\\r\\\\t\\\\v\\\\\\\\\\\\'\\\\\\\"\\\\376\\\"\\n\";\n\n  private static String canonicalExoticText =\n      exoticText.replace(\": .\", \": 0.\").replace(\": -.\", \": -0.\")   // short-form double\n      .replace(\"23e\", \"23E\").replace(\"E+\", \"E\").replace(\"0.23E17\", \"2.3E16\");\n\n  private String messageSetText =\n    \"[protobuf_unittest.TestMessageSetExtension1] {\\n\" +\n    \"  i: 123\\n\" +\n    \"}\\n\" +\n    \"[protobuf_unittest.TestMessageSetExtension2] {\\n\" +\n    \"  str: \\\"foo\\\"\\n\" +\n    \"}\\n\";\n\n  /** Print TestAllTypes and compare with golden file. */\n  public void testPrintMessage() throws Exception {\n    String javaText = TextFormat.printToString(TestUtil.getAllSet());\n\n    // Java likes to add a trailing \".0\" to floats and doubles.  C printf\n    // (with %g format) does not.  Our golden files are used for both\n    // C++ and Java TextFormat classes, so we need to conform.\n    javaText = javaText.replace(\".0\\n\", \"\\n\");\n\n    assertEquals(allFieldsSetText, javaText);\n  }\n\n  /** Print TestAllExtensions and compare with golden file. */\n  public void testPrintExtensions() throws Exception {\n    String javaText = TextFormat.printToString(TestUtil.getAllExtensionsSet());\n\n    // Java likes to add a trailing \".0\" to floats and doubles.  C printf\n    // (with %g format) does not.  Our golden files are used for both\n    // C++ and Java TextFormat classes, so we need to conform.\n    javaText = javaText.replace(\".0\\n\", \"\\n\");\n\n    assertEquals(allExtensionsSetText, javaText);\n  }\n\n  // Creates an example unknown field set.\n  private UnknownFieldSet makeUnknownFieldSet() {\n    return UnknownFieldSet.newBuilder()\n        .addField(5,\n            UnknownFieldSet.Field.newBuilder()\n            .addVarint(1)\n            .addFixed32(2)\n            .addFixed64(3)\n            .addLengthDelimited(ByteString.copyFromUtf8(\"4\"))\n            .addGroup(\n                UnknownFieldSet.newBuilder()\n                .addField(10,\n                    UnknownFieldSet.Field.newBuilder()\n                    .addVarint(5)\n                    .build())\n                .build())\n            .build())\n        .addField(8,\n            UnknownFieldSet.Field.newBuilder()\n            .addVarint(1)\n            .addVarint(2)\n            .addVarint(3)\n            .build())\n        .addField(15,\n            UnknownFieldSet.Field.newBuilder()\n            .addVarint(0xABCDEF1234567890L)\n            .addFixed32(0xABCD1234)\n            .addFixed64(0xABCDEF1234567890L)\n            .build())\n        .build();\n  }\n\n  public void testPrintUnknownFields() throws Exception {\n    // Test printing of unknown fields in a message.\n\n    TestEmptyMessage message =\n      TestEmptyMessage.newBuilder()\n        .setUnknownFields(makeUnknownFieldSet())\n        .build();\n\n    assertEquals(\n      \"5: 1\\n\" +\n      \"5: 0x00000002\\n\" +\n      \"5: 0x0000000000000003\\n\" +\n      \"5: \\\"4\\\"\\n\" +\n      \"5 {\\n\" +\n      \"  10: 5\\n\" +\n      \"}\\n\" +\n      \"8: 1\\n\" +\n      \"8: 2\\n\" +\n      \"8: 3\\n\" +\n      \"15: 12379813812177893520\\n\" +\n      \"15: 0xabcd1234\\n\" +\n      \"15: 0xabcdef1234567890\\n\",\n      TextFormat.printToString(message));\n  }\n\n  public void testPrintField() throws Exception {\n    final FieldDescriptor dataField =\n      OneString.getDescriptor().findFieldByName(\"data\");\n    assertEquals(\n      \"data: \\\"test data\\\"\\n\",\n      TextFormat.printFieldToString(dataField, \"test data\"));\n\n    final FieldDescriptor optionalField =\n      TestAllTypes.getDescriptor().findFieldByName(\"optional_nested_message\");\n    final Object value = NestedMessage.newBuilder().setBb(42).build();\n\n    assertEquals(\n      \"optional_nested_message {\\n  bb: 42\\n}\\n\",\n      TextFormat.printFieldToString(optionalField, value));\n  }\n\n  /**\n   * Helper to construct a ByteString from a String containing only 8-bit\n   * characters.  The characters are converted directly to bytes, *not*\n   * encoded using UTF-8.\n   */\n  private ByteString bytes(String str) throws Exception {\n    return ByteString.copyFrom(str.getBytes(\"ISO-8859-1\"));\n  }\n\n  /**\n   * Helper to construct a ByteString from a bunch of bytes.  The inputs are\n   * actually ints so that I can use hex notation and not get stupid errors\n   * about precision.\n   */\n  private ByteString bytes(int... bytesAsInts) {\n    byte[] bytes = new byte[bytesAsInts.length];\n    for (int i = 0; i < bytesAsInts.length; i++) {\n      bytes[i] = (byte) bytesAsInts[i];\n    }\n    return ByteString.copyFrom(bytes);\n  }\n\n  public void testPrintExotic() throws Exception {\n    Message message = TestAllTypes.newBuilder()\n      // Signed vs. unsigned numbers.\n      .addRepeatedInt32 (-1)\n      .addRepeatedUint32(-1)\n      .addRepeatedInt64 (-1)\n      .addRepeatedUint64(-1)\n\n      .addRepeatedInt32 (1  << 31)\n      .addRepeatedUint32(1  << 31)\n      .addRepeatedInt64 (1l << 63)\n      .addRepeatedUint64(1l << 63)\n\n      // Floats of various precisions and exponents.\n      .addRepeatedDouble(123)\n      .addRepeatedDouble(123.5)\n      .addRepeatedDouble(0.125)\n      .addRepeatedDouble(.125)\n      .addRepeatedDouble(-.125)\n      .addRepeatedDouble(123e15)\n      .addRepeatedDouble(123e15)\n      .addRepeatedDouble(-1.23e-17)\n      .addRepeatedDouble(.23e17)\n      .addRepeatedDouble(-23e15)\n      .addRepeatedDouble(123.5e20)\n      .addRepeatedDouble(123.5e-20)\n      .addRepeatedDouble(123.456789)\n      .addRepeatedDouble(Double.POSITIVE_INFINITY)\n      .addRepeatedDouble(Double.NEGATIVE_INFINITY)\n      .addRepeatedDouble(Double.NaN)\n\n      // Strings and bytes that needing escaping.\n      .addRepeatedString(\"\\0\\001\\007\\b\\f\\n\\r\\t\\013\\\\\\'\\\"\\u1234\")\n      .addRepeatedBytes(bytes(\"\\0\\001\\007\\b\\f\\n\\r\\t\\013\\\\\\'\\\"\\u00fe\"))\n      .build();\n\n    assertEquals(canonicalExoticText, message.toString());\n  }\n\n  public void testPrintMessageSet() throws Exception {\n    TestMessageSet messageSet =\n      TestMessageSet.newBuilder()\n        .setExtension(\n          TestMessageSetExtension1.messageSetExtension,\n          TestMessageSetExtension1.newBuilder().setI(123).build())\n        .setExtension(\n          TestMessageSetExtension2.messageSetExtension,\n          TestMessageSetExtension2.newBuilder().setStr(\"foo\").build())\n        .build();\n\n    assertEquals(messageSetText, messageSet.toString());\n  }\n\n  // =================================================================\n\n  public void testParse() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TextFormat.merge(allFieldsSetText, builder);\n    TestUtil.assertAllFieldsSet(builder.build());\n  }\n\n  public void testParseReader() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TextFormat.merge(new StringReader(allFieldsSetText), builder);\n    TestUtil.assertAllFieldsSet(builder.build());\n  }\n\n  public void testParseExtensions() throws Exception {\n    TestAllExtensions.Builder builder = TestAllExtensions.newBuilder();\n    TextFormat.merge(allExtensionsSetText,\n                     TestUtil.getExtensionRegistry(),\n                     builder);\n    TestUtil.assertAllExtensionsSet(builder.build());\n  }\n\n  public void testParseCompatibility() throws Exception {\n    String original = \"repeated_float: inf\\n\" +\n                      \"repeated_float: -inf\\n\" +\n                      \"repeated_float: nan\\n\" +\n                      \"repeated_float: inff\\n\" +\n                      \"repeated_float: -inff\\n\" +\n                      \"repeated_float: nanf\\n\" +\n                      \"repeated_float: 1.0f\\n\" +\n                      \"repeated_float: infinityf\\n\" +\n                      \"repeated_float: -Infinityf\\n\" +\n                      \"repeated_double: infinity\\n\" +\n                      \"repeated_double: -infinity\\n\" +\n                      \"repeated_double: nan\\n\";\n    String canonical =  \"repeated_float: Infinity\\n\" +\n                        \"repeated_float: -Infinity\\n\" +\n                        \"repeated_float: NaN\\n\" +\n                        \"repeated_float: Infinity\\n\" +\n                        \"repeated_float: -Infinity\\n\" +\n                        \"repeated_float: NaN\\n\" +\n                        \"repeated_float: 1.0\\n\" +\n                        \"repeated_float: Infinity\\n\" +\n                        \"repeated_float: -Infinity\\n\" +\n                        \"repeated_double: Infinity\\n\" +\n                        \"repeated_double: -Infinity\\n\" +\n                        \"repeated_double: NaN\\n\";\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TextFormat.merge(original, builder);\n    assertEquals(canonical, builder.build().toString());\n  }\n\n  public void testParseExotic() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TextFormat.merge(exoticText, builder);\n\n    // Too lazy to check things individually.  Don't try to debug this\n    // if testPrintExotic() is failing.\n    assertEquals(canonicalExoticText, builder.build().toString());\n  }\n\n  public void testParseMessageSet() throws Exception {\n    ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance();\n    extensionRegistry.add(TestMessageSetExtension1.messageSetExtension);\n    extensionRegistry.add(TestMessageSetExtension2.messageSetExtension);\n\n    TestMessageSet.Builder builder = TestMessageSet.newBuilder();\n    TextFormat.merge(messageSetText, extensionRegistry, builder);\n    TestMessageSet messageSet = builder.build();\n\n    assertTrue(messageSet.hasExtension(\n      TestMessageSetExtension1.messageSetExtension));\n    assertEquals(123, messageSet.getExtension(\n      TestMessageSetExtension1.messageSetExtension).getI());\n    assertTrue(messageSet.hasExtension(\n      TestMessageSetExtension2.messageSetExtension));\n    assertEquals(\"foo\", messageSet.getExtension(\n      TestMessageSetExtension2.messageSetExtension).getStr());\n  }\n\n  public void testParseNumericEnum() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TextFormat.merge(\"optional_nested_enum: 2\", builder);\n    assertEquals(TestAllTypes.NestedEnum.BAR, builder.getOptionalNestedEnum());\n  }\n\n  public void testParseAngleBrackets() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TextFormat.merge(\"OptionalGroup: < a: 1 >\", builder);\n    assertTrue(builder.hasOptionalGroup());\n    assertEquals(1, builder.getOptionalGroup().getA());\n  }\n\n  public void testParseComment() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TextFormat.merge(\n      \"# this is a comment\\n\" +\n      \"optional_int32: 1  # another comment\\n\" +\n      \"optional_int64: 2\\n\" +\n      \"# EOF comment\", builder);\n    assertEquals(1, builder.getOptionalInt32());\n    assertEquals(2, builder.getOptionalInt64());\n  }\n\n  private void assertParseError(String error, String text) {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    try {\n      TextFormat.merge(text, TestUtil.getExtensionRegistry(), builder);\n      fail(\"Expected parse exception.\");\n    } catch (TextFormat.ParseException e) {\n      assertEquals(error, e.getMessage());\n    }\n  }\n\n  public void testParseErrors() throws Exception {\n    assertParseError(\n      \"1:16: Expected \\\":\\\".\",\n      \"optional_int32 123\");\n    assertParseError(\n      \"1:23: Expected identifier.\",\n      \"optional_nested_enum: ?\");\n    assertParseError(\n      \"1:18: Couldn't parse integer: Number must be positive: -1\",\n      \"optional_uint32: -1\");\n    assertParseError(\n      \"1:17: Couldn't parse integer: Number out of range for 32-bit signed \" +\n        \"integer: 82301481290849012385230157\",\n      \"optional_int32: 82301481290849012385230157\");\n    assertParseError(\n      \"1:16: Expected \\\"true\\\" or \\\"false\\\".\",\n      \"optional_bool: maybe\");\n    assertParseError(\n      \"1:16: Expected \\\"true\\\" or \\\"false\\\".\",\n      \"optional_bool: 2\");\n    assertParseError(\n      \"1:18: Expected string.\",\n      \"optional_string: 123\");\n    assertParseError(\n      \"1:18: String missing ending quote.\",\n      \"optional_string: \\\"ueoauaoe\");\n    assertParseError(\n      \"1:18: String missing ending quote.\",\n      \"optional_string: \\\"ueoauaoe\\n\" +\n      \"optional_int32: 123\");\n    assertParseError(\n      \"1:18: Invalid escape sequence: '\\\\z'\",\n      \"optional_string: \\\"\\\\z\\\"\");\n    assertParseError(\n      \"1:18: String missing ending quote.\",\n      \"optional_string: \\\"ueoauaoe\\n\" +\n      \"optional_int32: 123\");\n    assertParseError(\n      \"1:2: Extension \\\"nosuchext\\\" not found in the ExtensionRegistry.\",\n      \"[nosuchext]: 123\");\n    assertParseError(\n      \"1:20: Extension \\\"protobuf_unittest.optional_int32_extension\\\" does \" +\n        \"not extend message type \\\"protobuf_unittest.TestAllTypes\\\".\",\n      \"[protobuf_unittest.optional_int32_extension]: 123\");\n    assertParseError(\n      \"1:1: Message type \\\"protobuf_unittest.TestAllTypes\\\" has no field \" +\n        \"named \\\"nosuchfield\\\".\",\n      \"nosuchfield: 123\");\n    assertParseError(\n      \"1:21: Expected \\\">\\\".\",\n      \"OptionalGroup < a: 1\");\n    assertParseError(\n      \"1:23: Enum type \\\"protobuf_unittest.TestAllTypes.NestedEnum\\\" has no \" +\n        \"value named \\\"NO_SUCH_VALUE\\\".\",\n      \"optional_nested_enum: NO_SUCH_VALUE\");\n    assertParseError(\n      \"1:23: Enum type \\\"protobuf_unittest.TestAllTypes.NestedEnum\\\" has no \" +\n        \"value with number 123.\",\n      \"optional_nested_enum: 123\");\n\n    // Delimiters must match.\n    assertParseError(\n      \"1:22: Expected identifier.\",\n      \"OptionalGroup < a: 1 }\");\n    assertParseError(\n      \"1:22: Expected identifier.\",\n      \"OptionalGroup { a: 1 >\");\n  }\n\n  // =================================================================\n\n  public void testEscape() throws Exception {\n    // Escape sequences.\n    assertEquals(\"\\\\000\\\\001\\\\a\\\\b\\\\f\\\\n\\\\r\\\\t\\\\v\\\\\\\\\\\\'\\\\\\\"\",\n      TextFormat.escapeBytes(bytes(\"\\0\\001\\007\\b\\f\\n\\r\\t\\013\\\\\\'\\\"\")));\n    assertEquals(\"\\\\000\\\\001\\\\a\\\\b\\\\f\\\\n\\\\r\\\\t\\\\v\\\\\\\\\\\\'\\\\\\\"\",\n      TextFormat.escapeText(\"\\0\\001\\007\\b\\f\\n\\r\\t\\013\\\\\\'\\\"\"));\n    assertEquals(bytes(\"\\0\\001\\007\\b\\f\\n\\r\\t\\013\\\\\\'\\\"\"),\n      TextFormat.unescapeBytes(\"\\\\000\\\\001\\\\a\\\\b\\\\f\\\\n\\\\r\\\\t\\\\v\\\\\\\\\\\\'\\\\\\\"\"));\n    assertEquals(\"\\0\\001\\007\\b\\f\\n\\r\\t\\013\\\\\\'\\\"\",\n      TextFormat.unescapeText(\"\\\\000\\\\001\\\\a\\\\b\\\\f\\\\n\\\\r\\\\t\\\\v\\\\\\\\\\\\'\\\\\\\"\"));\n    assertEquals(kEscapeTestStringEscaped,\n      TextFormat.escapeText(kEscapeTestString));\n    assertEquals(kEscapeTestString,\n      TextFormat.unescapeText(kEscapeTestStringEscaped));\n\n    // Unicode handling.\n    assertEquals(\"\\\\341\\\\210\\\\264\", TextFormat.escapeText(\"\\u1234\"));\n    assertEquals(\"\\\\341\\\\210\\\\264\",\n                 TextFormat.escapeBytes(bytes(0xe1, 0x88, 0xb4)));\n    assertEquals(\"\\u1234\", TextFormat.unescapeText(\"\\\\341\\\\210\\\\264\"));\n    assertEquals(bytes(0xe1, 0x88, 0xb4),\n                 TextFormat.unescapeBytes(\"\\\\341\\\\210\\\\264\"));\n    assertEquals(\"\\u1234\", TextFormat.unescapeText(\"\\\\xe1\\\\x88\\\\xb4\"));\n    assertEquals(bytes(0xe1, 0x88, 0xb4),\n                 TextFormat.unescapeBytes(\"\\\\xe1\\\\x88\\\\xb4\"));\n\n    // Handling of strings with unescaped Unicode characters > 255.\n    final String zh = \"\\u9999\\u6e2f\\u4e0a\\u6d77\\ud84f\\udf80\\u8c50\\u9280\\u884c\";\n    ByteString zhByteString = ByteString.copyFromUtf8(zh);\n    assertEquals(zhByteString, TextFormat.unescapeBytes(zh));\n\n    // Errors.\n    try {\n      TextFormat.unescapeText(\"\\\\x\");\n      fail(\"Should have thrown an exception.\");\n    } catch (TextFormat.InvalidEscapeSequenceException e) {\n      // success\n    }\n\n    try {\n      TextFormat.unescapeText(\"\\\\z\");\n      fail(\"Should have thrown an exception.\");\n    } catch (TextFormat.InvalidEscapeSequenceException e) {\n      // success\n    }\n\n    try {\n      TextFormat.unescapeText(\"\\\\\");\n      fail(\"Should have thrown an exception.\");\n    } catch (TextFormat.InvalidEscapeSequenceException e) {\n      // success\n    }\n  }\n\n  public void testParseInteger() throws Exception {\n    assertEquals(          0, TextFormat.parseInt32(          \"0\"));\n    assertEquals(          1, TextFormat.parseInt32(          \"1\"));\n    assertEquals(         -1, TextFormat.parseInt32(         \"-1\"));\n    assertEquals(      12345, TextFormat.parseInt32(      \"12345\"));\n    assertEquals(     -12345, TextFormat.parseInt32(     \"-12345\"));\n    assertEquals( 2147483647, TextFormat.parseInt32( \"2147483647\"));\n    assertEquals(-2147483648, TextFormat.parseInt32(\"-2147483648\"));\n\n    assertEquals(                0, TextFormat.parseUInt32(         \"0\"));\n    assertEquals(                1, TextFormat.parseUInt32(         \"1\"));\n    assertEquals(            12345, TextFormat.parseUInt32(     \"12345\"));\n    assertEquals(       2147483647, TextFormat.parseUInt32(\"2147483647\"));\n    assertEquals((int) 2147483648L, TextFormat.parseUInt32(\"2147483648\"));\n    assertEquals((int) 4294967295L, TextFormat.parseUInt32(\"4294967295\"));\n\n    assertEquals(          0L, TextFormat.parseInt64(          \"0\"));\n    assertEquals(          1L, TextFormat.parseInt64(          \"1\"));\n    assertEquals(         -1L, TextFormat.parseInt64(         \"-1\"));\n    assertEquals(      12345L, TextFormat.parseInt64(      \"12345\"));\n    assertEquals(     -12345L, TextFormat.parseInt64(     \"-12345\"));\n    assertEquals( 2147483647L, TextFormat.parseInt64( \"2147483647\"));\n    assertEquals(-2147483648L, TextFormat.parseInt64(\"-2147483648\"));\n    assertEquals( 4294967295L, TextFormat.parseInt64( \"4294967295\"));\n    assertEquals( 4294967296L, TextFormat.parseInt64( \"4294967296\"));\n    assertEquals(9223372036854775807L,\n                 TextFormat.parseInt64(\"9223372036854775807\"));\n    assertEquals(-9223372036854775808L,\n                 TextFormat.parseInt64(\"-9223372036854775808\"));\n\n    assertEquals(          0L, TextFormat.parseUInt64(          \"0\"));\n    assertEquals(          1L, TextFormat.parseUInt64(          \"1\"));\n    assertEquals(      12345L, TextFormat.parseUInt64(      \"12345\"));\n    assertEquals( 2147483647L, TextFormat.parseUInt64( \"2147483647\"));\n    assertEquals( 4294967295L, TextFormat.parseUInt64( \"4294967295\"));\n    assertEquals( 4294967296L, TextFormat.parseUInt64( \"4294967296\"));\n    assertEquals(9223372036854775807L,\n                 TextFormat.parseUInt64(\"9223372036854775807\"));\n    assertEquals(-9223372036854775808L,\n                 TextFormat.parseUInt64(\"9223372036854775808\"));\n    assertEquals(-1L, TextFormat.parseUInt64(\"18446744073709551615\"));\n\n    // Hex\n    assertEquals(0x1234abcd, TextFormat.parseInt32(\"0x1234abcd\"));\n    assertEquals(-0x1234abcd, TextFormat.parseInt32(\"-0x1234abcd\"));\n    assertEquals(-1, TextFormat.parseUInt64(\"0xffffffffffffffff\"));\n    assertEquals(0x7fffffffffffffffL,\n                 TextFormat.parseInt64(\"0x7fffffffffffffff\"));\n\n    // Octal\n    assertEquals(01234567, TextFormat.parseInt32(\"01234567\"));\n\n    // Out-of-range\n    try {\n      TextFormat.parseInt32(\"2147483648\");\n      fail(\"Should have thrown an exception.\");\n    } catch (NumberFormatException e) {\n      // success\n    }\n\n    try {\n      TextFormat.parseInt32(\"-2147483649\");\n      fail(\"Should have thrown an exception.\");\n    } catch (NumberFormatException e) {\n      // success\n    }\n\n    try {\n      TextFormat.parseUInt32(\"4294967296\");\n      fail(\"Should have thrown an exception.\");\n    } catch (NumberFormatException e) {\n      // success\n    }\n\n    try {\n      TextFormat.parseUInt32(\"-1\");\n      fail(\"Should have thrown an exception.\");\n    } catch (NumberFormatException e) {\n      // success\n    }\n\n    try {\n      TextFormat.parseInt64(\"9223372036854775808\");\n      fail(\"Should have thrown an exception.\");\n    } catch (NumberFormatException e) {\n      // success\n    }\n\n    try {\n      TextFormat.parseInt64(\"-9223372036854775809\");\n      fail(\"Should have thrown an exception.\");\n    } catch (NumberFormatException e) {\n      // success\n    }\n\n    try {\n      TextFormat.parseUInt64(\"18446744073709551616\");\n      fail(\"Should have thrown an exception.\");\n    } catch (NumberFormatException e) {\n      // success\n    }\n\n    try {\n      TextFormat.parseUInt64(\"-1\");\n      fail(\"Should have thrown an exception.\");\n    } catch (NumberFormatException e) {\n      // success\n    }\n\n    // Not a number.\n    try {\n      TextFormat.parseInt32(\"abcd\");\n      fail(\"Should have thrown an exception.\");\n    } catch (NumberFormatException e) {\n      // success\n    }\n  }\n\n  public void testParseString() throws Exception {\n    final String zh = \"\\u9999\\u6e2f\\u4e0a\\u6d77\\ud84f\\udf80\\u8c50\\u9280\\u884c\";\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TextFormat.merge(\"optional_string: \\\"\" + zh + \"\\\"\", builder);\n    assertEquals(zh, builder.getOptionalString());\n  }\n\n  public void testParseLongString() throws Exception {\n    String longText =\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\" +\n      \"123456789012345678901234567890123456789012345678901234567890\";\n\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TextFormat.merge(\"optional_string: \\\"\" + longText + \"\\\"\", builder);\n    assertEquals(longText, builder.getOptionalString());\n  }\n\n  public void testParseBoolean() throws Exception {\n    String goodText =\n        \"repeated_bool: t  repeated_bool : 0\\n\" +\n        \"repeated_bool :f repeated_bool:1\";\n    String goodTextCanonical =\n        \"repeated_bool: true\\n\" +\n        \"repeated_bool: false\\n\" +\n        \"repeated_bool: false\\n\" +\n        \"repeated_bool: true\\n\";\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TextFormat.merge(goodText, builder);\n    assertEquals(goodTextCanonical, builder.build().toString());\n\n    try {\n      TestAllTypes.Builder badBuilder = TestAllTypes.newBuilder();\n      TextFormat.merge(\"optional_bool:2\", badBuilder);\n      fail(\"Should have thrown an exception.\");\n    } catch (TextFormat.ParseException e) {\n      // success\n    }\n    try {\n      TestAllTypes.Builder badBuilder = TestAllTypes.newBuilder();\n      TextFormat.merge(\"optional_bool: foo\", badBuilder);\n      fail(\"Should have thrown an exception.\");\n    } catch (TextFormat.ParseException e) {\n      // success\n    }\n  }\n\n  public void testParseAdjacentStringLiterals() throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    TextFormat.merge(\"optional_string: \\\"foo\\\" 'corge' \\\"grault\\\"\", builder);\n    assertEquals(\"foocorgegrault\", builder.getOptionalString());\n  }\n\n  public void testPrintFieldValue() throws Exception {\n    assertPrintFieldValue(\"\\\"Hello\\\"\", \"Hello\", \"repeated_string\");\n    assertPrintFieldValue(\"123.0\",  123f, \"repeated_float\");\n    assertPrintFieldValue(\"123.0\",  123d, \"repeated_double\");\n    assertPrintFieldValue(\"123\",  123, \"repeated_int32\");\n    assertPrintFieldValue(\"123\",  123L, \"repeated_int64\");\n    assertPrintFieldValue(\"true\",  true, \"repeated_bool\");\n    assertPrintFieldValue(\"4294967295\", 0xFFFFFFFF, \"repeated_uint32\");\n    assertPrintFieldValue(\"18446744073709551615\",  0xFFFFFFFFFFFFFFFFL,\n        \"repeated_uint64\");\n    assertPrintFieldValue(\"\\\"\\\\001\\\\002\\\\003\\\"\",\n        ByteString.copyFrom(new byte[] {1, 2, 3}), \"repeated_bytes\");\n  }\n\n  private void assertPrintFieldValue(String expect, Object value,\n      String fieldName) throws Exception {\n    TestAllTypes.Builder builder = TestAllTypes.newBuilder();\n    StringBuilder sb = new StringBuilder();\n    TextFormat.printFieldValue(\n        TestAllTypes.getDescriptor().findFieldByName(fieldName),\n        value, sb);\n    assertEquals(expect, sb.toString());\n  }\n\n  public void testShortDebugString() {\n    assertEquals(\"optional_nested_message { bb: 42 } repeated_int32: 1\"\n        + \" repeated_uint32: 2\",\n        TextFormat.shortDebugString(TestAllTypes.newBuilder()\n            .addRepeatedInt32(1)\n            .addRepeatedUint32(2)\n            .setOptionalNestedMessage(\n                NestedMessage.newBuilder().setBb(42).build())\n            .build()));\n  }\n\n  public void testShortDebugString_unknown() {\n    assertEquals(\"5: 1 5: 0x00000002 5: 0x0000000000000003 5: \\\"4\\\" 5 { 10: 5 }\"\n        + \" 8: 1 8: 2 8: 3 15: 12379813812177893520 15: 0xabcd1234 15:\"\n        + \" 0xabcdef1234567890\",\n        TextFormat.shortDebugString(makeUnknownFieldSet()));\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport protobuf_unittest.UnittestProto;\nimport protobuf_unittest.UnittestProto.TestAllExtensions;\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestEmptyMessage;\nimport protobuf_unittest.UnittestProto.TestEmptyMessageWithExtensions;\n\nimport junit.framework.TestCase;\n\nimport java.util.Arrays;\nimport java.util.Map;\n\n/**\n * Tests related to unknown field handling.\n *\n * @author kenton@google.com (Kenton Varda)\n */\npublic class UnknownFieldSetTest extends TestCase {\n  public void setUp() throws Exception {\n    descriptor = TestAllTypes.getDescriptor();\n    allFields = TestUtil.getAllSet();\n    allFieldsData = allFields.toByteString();\n    emptyMessage = TestEmptyMessage.parseFrom(allFieldsData);\n    unknownFields = emptyMessage.getUnknownFields();\n  }\n\n  UnknownFieldSet.Field getField(String name) {\n    Descriptors.FieldDescriptor field = descriptor.findFieldByName(name);\n    assertNotNull(field);\n    return unknownFields.getField(field.getNumber());\n  }\n\n  // Constructs a protocol buffer which contains fields with all the same\n  // numbers as allFieldsData except that each field is some other wire\n  // type.\n  ByteString getBizarroData() throws Exception {\n    UnknownFieldSet.Builder bizarroFields = UnknownFieldSet.newBuilder();\n\n    UnknownFieldSet.Field varintField =\n      UnknownFieldSet.Field.newBuilder().addVarint(1).build();\n    UnknownFieldSet.Field fixed32Field =\n      UnknownFieldSet.Field.newBuilder().addFixed32(1).build();\n\n    for (Map.Entry<Integer, UnknownFieldSet.Field> entry :\n         unknownFields.asMap().entrySet()) {\n      if (entry.getValue().getVarintList().isEmpty()) {\n        // Original field is not a varint, so use a varint.\n        bizarroFields.addField(entry.getKey(), varintField);\n      } else {\n        // Original field *is* a varint, so use something else.\n        bizarroFields.addField(entry.getKey(), fixed32Field);\n      }\n    }\n\n    return bizarroFields.build().toByteString();\n  }\n\n  Descriptors.Descriptor descriptor;\n  TestAllTypes allFields;\n  ByteString allFieldsData;\n\n  // An empty message that has been parsed from allFieldsData.  So, it has\n  // unknown fields of every type.\n  TestEmptyMessage emptyMessage;\n  UnknownFieldSet unknownFields;\n\n  // =================================================================\n\n  public void testVarint() throws Exception {\n    UnknownFieldSet.Field field = getField(\"optional_int32\");\n    assertEquals(1, field.getVarintList().size());\n    assertEquals(allFields.getOptionalInt32(),\n                 (long) field.getVarintList().get(0));\n  }\n\n  public void testFixed32() throws Exception {\n    UnknownFieldSet.Field field = getField(\"optional_fixed32\");\n    assertEquals(1, field.getFixed32List().size());\n    assertEquals(allFields.getOptionalFixed32(),\n                 (int) field.getFixed32List().get(0));\n  }\n\n  public void testFixed64() throws Exception {\n    UnknownFieldSet.Field field = getField(\"optional_fixed64\");\n    assertEquals(1, field.getFixed64List().size());\n    assertEquals(allFields.getOptionalFixed64(),\n                 (long) field.getFixed64List().get(0));\n  }\n\n  public void testLengthDelimited() throws Exception {\n    UnknownFieldSet.Field field = getField(\"optional_bytes\");\n    assertEquals(1, field.getLengthDelimitedList().size());\n    assertEquals(allFields.getOptionalBytes(),\n                 field.getLengthDelimitedList().get(0));\n  }\n\n  public void testGroup() throws Exception {\n    Descriptors.FieldDescriptor nestedFieldDescriptor =\n      TestAllTypes.OptionalGroup.getDescriptor().findFieldByName(\"a\");\n    assertNotNull(nestedFieldDescriptor);\n\n    UnknownFieldSet.Field field = getField(\"optionalgroup\");\n    assertEquals(1, field.getGroupList().size());\n\n    UnknownFieldSet group = field.getGroupList().get(0);\n    assertEquals(1, group.asMap().size());\n    assertTrue(group.hasField(nestedFieldDescriptor.getNumber()));\n\n    UnknownFieldSet.Field nestedField =\n      group.getField(nestedFieldDescriptor.getNumber());\n    assertEquals(1, nestedField.getVarintList().size());\n    assertEquals(allFields.getOptionalGroup().getA(),\n                 (long) nestedField.getVarintList().get(0));\n  }\n\n  public void testSerialize() throws Exception {\n    // Check that serializing the UnknownFieldSet produces the original data\n    // again.\n    ByteString data = emptyMessage.toByteString();\n    assertEquals(allFieldsData, data);\n  }\n\n  public void testCopyFrom() throws Exception {\n    TestEmptyMessage message =\n      TestEmptyMessage.newBuilder().mergeFrom(emptyMessage).build();\n\n    assertEquals(emptyMessage.toString(), message.toString());\n  }\n\n  public void testMergeFrom() throws Exception {\n    TestEmptyMessage source =\n      TestEmptyMessage.newBuilder()\n        .setUnknownFields(\n          UnknownFieldSet.newBuilder()\n            .addField(2,\n              UnknownFieldSet.Field.newBuilder()\n                .addVarint(2).build())\n            .addField(3,\n              UnknownFieldSet.Field.newBuilder()\n                .addVarint(4).build())\n            .build())\n        .build();\n    TestEmptyMessage destination =\n      TestEmptyMessage.newBuilder()\n        .setUnknownFields(\n          UnknownFieldSet.newBuilder()\n            .addField(1,\n              UnknownFieldSet.Field.newBuilder()\n                .addVarint(1).build())\n            .addField(3,\n              UnknownFieldSet.Field.newBuilder()\n                .addVarint(3).build())\n            .build())\n        .mergeFrom(source)\n        .build();\n\n    assertEquals(\n      \"1: 1\\n\" +\n      \"2: 2\\n\" +\n      \"3: 3\\n\" +\n      \"3: 4\\n\",\n      destination.toString());\n  }\n\n  public void testClear() throws Exception {\n    UnknownFieldSet fields =\n      UnknownFieldSet.newBuilder().mergeFrom(unknownFields).clear().build();\n    assertTrue(fields.asMap().isEmpty());\n  }\n\n  public void testClearMessage() throws Exception {\n    TestEmptyMessage message =\n      TestEmptyMessage.newBuilder().mergeFrom(emptyMessage).clear().build();\n    assertEquals(0, message.getSerializedSize());\n  }\n\n  public void testParseKnownAndUnknown() throws Exception {\n    // Test mixing known and unknown fields when parsing.\n\n    UnknownFieldSet fields =\n      UnknownFieldSet.newBuilder(unknownFields)\n        .addField(123456,\n          UnknownFieldSet.Field.newBuilder().addVarint(654321).build())\n        .build();\n\n    ByteString data = fields.toByteString();\n    TestAllTypes destination = TestAllTypes.parseFrom(data);\n\n    TestUtil.assertAllFieldsSet(destination);\n    assertEquals(1, destination.getUnknownFields().asMap().size());\n\n    UnknownFieldSet.Field field =\n      destination.getUnknownFields().getField(123456);\n    assertEquals(1, field.getVarintList().size());\n    assertEquals(654321, (long) field.getVarintList().get(0));\n  }\n\n  public void testWrongTypeTreatedAsUnknown() throws Exception {\n    // Test that fields of the wrong wire type are treated like unknown fields\n    // when parsing.\n\n    ByteString bizarroData = getBizarroData();\n    TestAllTypes allTypesMessage = TestAllTypes.parseFrom(bizarroData);\n    TestEmptyMessage emptyMessage = TestEmptyMessage.parseFrom(bizarroData);\n\n    // All fields should have been interpreted as unknown, so the debug strings\n    // should be the same.\n    assertEquals(emptyMessage.toString(), allTypesMessage.toString());\n  }\n\n  public void testUnknownExtensions() throws Exception {\n    // Make sure fields are properly parsed to the UnknownFieldSet even when\n    // they are declared as extension numbers.\n\n    TestEmptyMessageWithExtensions message =\n      TestEmptyMessageWithExtensions.parseFrom(allFieldsData);\n\n    assertEquals(unknownFields.asMap().size(),\n                 message.getUnknownFields().asMap().size());\n    assertEquals(allFieldsData, message.toByteString());\n  }\n\n  public void testWrongExtensionTypeTreatedAsUnknown() throws Exception {\n    // Test that fields of the wrong wire type are treated like unknown fields\n    // when parsing extensions.\n\n    ByteString bizarroData = getBizarroData();\n    TestAllExtensions allExtensionsMessage =\n      TestAllExtensions.parseFrom(bizarroData);\n    TestEmptyMessage emptyMessage = TestEmptyMessage.parseFrom(bizarroData);\n\n    // All fields should have been interpreted as unknown, so the debug strings\n    // should be the same.\n    assertEquals(emptyMessage.toString(),\n                 allExtensionsMessage.toString());\n  }\n\n  public void testParseUnknownEnumValue() throws Exception {\n    Descriptors.FieldDescriptor singularField =\n      TestAllTypes.getDescriptor().findFieldByName(\"optional_nested_enum\");\n    Descriptors.FieldDescriptor repeatedField =\n      TestAllTypes.getDescriptor().findFieldByName(\"repeated_nested_enum\");\n    assertNotNull(singularField);\n    assertNotNull(repeatedField);\n\n    ByteString data =\n      UnknownFieldSet.newBuilder()\n        .addField(singularField.getNumber(),\n          UnknownFieldSet.Field.newBuilder()\n            .addVarint(TestAllTypes.NestedEnum.BAR.getNumber())\n            .addVarint(5)   // not valid\n            .build())\n        .addField(repeatedField.getNumber(),\n          UnknownFieldSet.Field.newBuilder()\n            .addVarint(TestAllTypes.NestedEnum.FOO.getNumber())\n            .addVarint(4)   // not valid\n            .addVarint(TestAllTypes.NestedEnum.BAZ.getNumber())\n            .addVarint(6)   // not valid\n            .build())\n        .build()\n        .toByteString();\n\n    {\n      TestAllTypes message = TestAllTypes.parseFrom(data);\n      assertEquals(TestAllTypes.NestedEnum.BAR,\n                   message.getOptionalNestedEnum());\n      assertEquals(\n        Arrays.asList(TestAllTypes.NestedEnum.FOO, TestAllTypes.NestedEnum.BAZ),\n        message.getRepeatedNestedEnumList());\n      assertEquals(Arrays.asList(5L),\n                   message.getUnknownFields()\n                          .getField(singularField.getNumber())\n                          .getVarintList());\n      assertEquals(Arrays.asList(4L, 6L),\n                   message.getUnknownFields()\n                          .getField(repeatedField.getNumber())\n                          .getVarintList());\n    }\n\n    {\n      TestAllExtensions message =\n        TestAllExtensions.parseFrom(data, TestUtil.getExtensionRegistry());\n      assertEquals(TestAllTypes.NestedEnum.BAR,\n        message.getExtension(UnittestProto.optionalNestedEnumExtension));\n      assertEquals(\n        Arrays.asList(TestAllTypes.NestedEnum.FOO, TestAllTypes.NestedEnum.BAZ),\n        message.getExtension(UnittestProto.repeatedNestedEnumExtension));\n      assertEquals(Arrays.asList(5L),\n                   message.getUnknownFields()\n                          .getField(singularField.getNumber())\n                          .getVarintList());\n      assertEquals(Arrays.asList(4L, 6L),\n                   message.getUnknownFields()\n                          .getField(repeatedField.getNumber())\n                          .getVarintList());\n    }\n  }\n\n  public void testLargeVarint() throws Exception {\n    ByteString data =\n      UnknownFieldSet.newBuilder()\n        .addField(1,\n          UnknownFieldSet.Field.newBuilder()\n            .addVarint(0x7FFFFFFFFFFFFFFFL)\n            .build())\n        .build()\n        .toByteString();\n    UnknownFieldSet parsed = UnknownFieldSet.parseFrom(data);\n    UnknownFieldSet.Field field = parsed.getField(1);\n    assertEquals(1, field.getVarintList().size());\n    assertEquals(0x7FFFFFFFFFFFFFFFL, (long)field.getVarintList().get(0));\n  }\n\n  public void testEqualsAndHashCode() {\n    UnknownFieldSet.Field fixed32Field =\n        UnknownFieldSet.Field.newBuilder()\n            .addFixed32(1)\n            .build();\n    UnknownFieldSet.Field fixed64Field =\n        UnknownFieldSet.Field.newBuilder()\n            .addFixed64(1)\n            .build();\n    UnknownFieldSet.Field varIntField =\n        UnknownFieldSet.Field.newBuilder()\n            .addVarint(1)\n            .build();\n    UnknownFieldSet.Field lengthDelimitedField =\n        UnknownFieldSet.Field.newBuilder()\n            .addLengthDelimited(ByteString.EMPTY)\n            .build();\n    UnknownFieldSet.Field groupField =\n        UnknownFieldSet.Field.newBuilder()\n            .addGroup(unknownFields)\n            .build();\n\n    UnknownFieldSet a =\n        UnknownFieldSet.newBuilder()\n            .addField(1, fixed32Field)\n            .build();\n    UnknownFieldSet b =\n        UnknownFieldSet.newBuilder()\n            .addField(1, fixed64Field)\n            .build();\n    UnknownFieldSet c =\n        UnknownFieldSet.newBuilder()\n            .addField(1, varIntField)\n            .build();\n    UnknownFieldSet d =\n        UnknownFieldSet.newBuilder()\n            .addField(1, lengthDelimitedField)\n            .build();\n    UnknownFieldSet e =\n        UnknownFieldSet.newBuilder()\n            .addField(1, groupField)\n            .build();\n\n    checkEqualsIsConsistent(a);\n    checkEqualsIsConsistent(b);\n    checkEqualsIsConsistent(c);\n    checkEqualsIsConsistent(d);\n    checkEqualsIsConsistent(e);\n\n    checkNotEqual(a, b);\n    checkNotEqual(a, c);\n    checkNotEqual(a, d);\n    checkNotEqual(a, e);\n    checkNotEqual(b, c);\n    checkNotEqual(b, d);\n    checkNotEqual(b, e);\n    checkNotEqual(c, d);\n    checkNotEqual(c, e);\n    checkNotEqual(d, e);\n  }\n\n  /**\n   * Asserts that the given field sets are not equal and have different\n   * hash codes.\n   *\n   * @warning It's valid for non-equal objects to have the same hash code, so\n   *   this test is stricter than it needs to be. However, this should happen\n   *   relatively rarely.\n   */\n  private void checkNotEqual(UnknownFieldSet s1, UnknownFieldSet s2) {\n    String equalsError = String.format(\"%s should not be equal to %s\", s1, s2);\n    assertFalse(equalsError, s1.equals(s2));\n    assertFalse(equalsError, s2.equals(s1));\n\n    assertFalse(\n        String.format(\"%s should have a different hash code from %s\", s1, s2),\n        s1.hashCode() == s2.hashCode());\n  }\n\n  /**\n   * Asserts that the given field sets are equal and have identical hash codes.\n   */\n  private void checkEqualsIsConsistent(UnknownFieldSet set) {\n    // Object should be equal to itself.\n    assertEquals(set, set);\n\n    // Object should be equal to a copy of itself.\n    UnknownFieldSet copy = UnknownFieldSet.newBuilder(set).build();\n    assertEquals(set, copy);\n    assertEquals(copy, set);\n    assertEquals(set.hashCode(), copy.hashCode());\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport junit.framework.TestCase;\n\nimport java.util.Iterator;\nimport java.util.ListIterator;\n\n/**\n * Tests for {@link UnmodifiableLazyStringList}.\n *\n * @author jonp@google.com (Jon Perlow)\n */\npublic class UnmodifiableLazyStringListTest extends TestCase {\n\n  private static String STRING_A = \"A\";\n  private static String STRING_B = \"B\";\n  private static String STRING_C = \"C\";\n\n  private static ByteString BYTE_STRING_A = ByteString.copyFromUtf8(\"A\");\n  private static ByteString BYTE_STRING_B = ByteString.copyFromUtf8(\"B\");\n  private static ByteString BYTE_STRING_C = ByteString.copyFromUtf8(\"C\");\n\n  public void testReadOnlyMethods() {\n    LazyStringArrayList rawList = createSampleList();\n    UnmodifiableLazyStringList list = new UnmodifiableLazyStringList(rawList);\n    assertEquals(3, list.size());\n    assertSame(STRING_A, list.get(0));\n    assertSame(STRING_B, list.get(1));\n    assertSame(STRING_C, list.get(2));\n    assertEquals(BYTE_STRING_A, list.getByteString(0));\n    assertEquals(BYTE_STRING_B, list.getByteString(1));\n    assertEquals(BYTE_STRING_C, list.getByteString(2));\n  }\n\n  public void testModifyMethods() {\n    LazyStringArrayList rawList = createSampleList();\n    UnmodifiableLazyStringList list = new UnmodifiableLazyStringList(rawList);\n\n    try {\n      list.remove(0);\n      fail();\n    } catch (UnsupportedOperationException e) {\n      // expected\n    }\n    assertEquals(3, list.size());\n\n    try {\n      list.add(STRING_B);\n      fail();\n    } catch (UnsupportedOperationException e) {\n      // expected\n    }\n    assertEquals(3, list.size());\n\n    try {\n      list.set(1, STRING_B);\n      fail();\n    } catch (UnsupportedOperationException e) {\n      // expected\n    }\n  }\n\n  public void testIterator() {\n    LazyStringArrayList rawList = createSampleList();\n    UnmodifiableLazyStringList list = new UnmodifiableLazyStringList(rawList);\n\n    Iterator<String> iter = list.iterator();\n    int count = 0;\n    while (iter.hasNext()) {\n      iter.next();\n      count++;\n      try {\n        iter.remove();\n        fail();\n      } catch (UnsupportedOperationException e) {\n        // expected\n      }\n    }\n    assertEquals(3, count);\n\n  }\n\n  public void testListIterator() {\n    LazyStringArrayList rawList = createSampleList();\n    UnmodifiableLazyStringList list = new UnmodifiableLazyStringList(rawList);\n\n    ListIterator<String> iter = list.listIterator();\n    int count = 0;\n    while (iter.hasNext()) {\n      iter.next();\n      count++;\n      try {\n        iter.remove();\n        fail();\n      } catch (UnsupportedOperationException e) {\n        // expected\n      }\n      try {\n        iter.set(\"bar\");\n        fail();\n      } catch (UnsupportedOperationException e) {\n        // expected\n      }\n      try {\n        iter.add(\"bar\");\n        fail();\n      } catch (UnsupportedOperationException e) {\n        // expected\n      }\n    }\n    assertEquals(3, count);\n\n  }\n\n  private LazyStringArrayList createSampleList() {\n    LazyStringArrayList rawList = new LazyStringArrayList();\n    rawList.add(STRING_A);\n    rawList.add(STRING_B);\n    rawList.add(STRING_C);\n    return rawList;\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage com.google.protobuf;\n\nimport junit.framework.TestCase;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\n\nimport protobuf_unittest.UnittestProto;\nimport protobuf_unittest.UnittestProto.TestAllExtensions;\nimport protobuf_unittest.UnittestProto.TestAllTypes;\nimport protobuf_unittest.UnittestProto.TestFieldOrderings;\nimport protobuf_unittest.UnittestProto.TestPackedExtensions;\nimport protobuf_unittest.UnittestProto.TestPackedTypes;\nimport protobuf_unittest.UnittestMset.TestMessageSet;\nimport protobuf_unittest.UnittestMset.RawMessageSet;\nimport protobuf_unittest.UnittestMset.TestMessageSetExtension1;\nimport protobuf_unittest.UnittestMset.TestMessageSetExtension2;\nimport com.google.protobuf.UnittestLite.TestAllExtensionsLite;\nimport com.google.protobuf.UnittestLite.TestPackedExtensionsLite;\n\n/**\n * Tests related to parsing and serialization.\n *\n * @author kenton@google.com (Kenton Varda)\n */\npublic class WireFormatTest extends TestCase {\n  public void testSerialization() throws Exception {\n    TestAllTypes message = TestUtil.getAllSet();\n\n    ByteString rawBytes = message.toByteString();\n    assertEquals(rawBytes.size(), message.getSerializedSize());\n\n    TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);\n\n    TestUtil.assertAllFieldsSet(message2);\n  }\n\n  public void testSerializationPacked() throws Exception {\n    TestPackedTypes message = TestUtil.getPackedSet();\n\n    ByteString rawBytes = message.toByteString();\n    assertEquals(rawBytes.size(), message.getSerializedSize());\n\n    TestPackedTypes message2 = TestPackedTypes.parseFrom(rawBytes);\n\n    TestUtil.assertPackedFieldsSet(message2);\n  }\n\n  public void testSerializeExtensions() throws Exception {\n    // TestAllTypes and TestAllExtensions should have compatible wire formats,\n    // so if we serialize a TestAllExtensions then parse it as TestAllTypes\n    // it should work.\n\n    TestAllExtensions message = TestUtil.getAllExtensionsSet();\n    ByteString rawBytes = message.toByteString();\n    assertEquals(rawBytes.size(), message.getSerializedSize());\n\n    TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);\n\n    TestUtil.assertAllFieldsSet(message2);\n  }\n\n  public void testSerializePackedExtensions() throws Exception {\n    // TestPackedTypes and TestPackedExtensions should have compatible wire\n    // formats; check that they serialize to the same string.\n    TestPackedExtensions message = TestUtil.getPackedExtensionsSet();\n    ByteString rawBytes = message.toByteString();\n\n    TestPackedTypes message2 = TestUtil.getPackedSet();\n    ByteString rawBytes2 = message2.toByteString();\n\n    assertEquals(rawBytes, rawBytes2);\n  }\n\n  public void testSerializationPackedWithoutGetSerializedSize()\n      throws Exception {\n    // Write directly to an OutputStream, without invoking getSerializedSize()\n    // This used to be a bug where the size of a packed field was incorrect,\n    // since getSerializedSize() was never invoked.\n    TestPackedTypes message = TestUtil.getPackedSet();\n\n    // Directly construct a CodedOutputStream around the actual OutputStream,\n    // in case writeTo(OutputStream output) invokes getSerializedSize();\n    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();\n    CodedOutputStream codedOutput = CodedOutputStream.newInstance(outputStream);\n\n    message.writeTo(codedOutput);\n\n    codedOutput.flush();\n\n    TestPackedTypes message2 = TestPackedTypes.parseFrom(\n        outputStream.toByteArray());\n\n    TestUtil.assertPackedFieldsSet(message2);\n  }\n\n  public void testSerializeExtensionsLite() throws Exception {\n    // TestAllTypes and TestAllExtensions should have compatible wire formats,\n    // so if we serialize a TestAllExtensions then parse it as TestAllTypes\n    // it should work.\n\n    TestAllExtensionsLite message = TestUtil.getAllLiteExtensionsSet();\n    ByteString rawBytes = message.toByteString();\n    assertEquals(rawBytes.size(), message.getSerializedSize());\n\n    TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);\n\n    TestUtil.assertAllFieldsSet(message2);\n  }\n\n  public void testSerializePackedExtensionsLite() throws Exception {\n    // TestPackedTypes and TestPackedExtensions should have compatible wire\n    // formats; check that they serialize to the same string.\n    TestPackedExtensionsLite message = TestUtil.getLitePackedExtensionsSet();\n    ByteString rawBytes = message.toByteString();\n\n    TestPackedTypes message2 = TestUtil.getPackedSet();\n    ByteString rawBytes2 = message2.toByteString();\n\n    assertEquals(rawBytes, rawBytes2);\n  }\n\n  public void testParseExtensions() throws Exception {\n    // TestAllTypes and TestAllExtensions should have compatible wire formats,\n    // so if we serialize a TestAllTypes then parse it as TestAllExtensions\n    // it should work.\n\n    TestAllTypes message = TestUtil.getAllSet();\n    ByteString rawBytes = message.toByteString();\n\n    ExtensionRegistry registry = TestUtil.getExtensionRegistry();\n\n    TestAllExtensions message2 =\n      TestAllExtensions.parseFrom(rawBytes, registry);\n\n    TestUtil.assertAllExtensionsSet(message2);\n  }\n\n  public void testParsePackedExtensions() throws Exception {\n    // Ensure that packed extensions can be properly parsed.\n    TestPackedExtensions message = TestUtil.getPackedExtensionsSet();\n    ByteString rawBytes = message.toByteString();\n\n    ExtensionRegistry registry = TestUtil.getExtensionRegistry();\n\n    TestPackedExtensions message2 =\n        TestPackedExtensions.parseFrom(rawBytes, registry);\n\n    TestUtil.assertPackedExtensionsSet(message2);\n  }\n\n  public void testParseExtensionsLite() throws Exception {\n    // TestAllTypes and TestAllExtensions should have compatible wire formats,\n    // so if we serialize a TestAllTypes then parse it as TestAllExtensions\n    // it should work.\n\n    TestAllTypes message = TestUtil.getAllSet();\n    ByteString rawBytes = message.toByteString();\n\n    ExtensionRegistryLite registry_lite = TestUtil.getExtensionRegistryLite();\n\n    TestAllExtensionsLite message2 =\n      TestAllExtensionsLite.parseFrom(rawBytes, registry_lite);\n\n    TestUtil.assertAllExtensionsSet(message2);\n\n    // Try again using a full extension registry.\n    ExtensionRegistry registry = TestUtil.getExtensionRegistry();\n\n    TestAllExtensionsLite message3 =\n      TestAllExtensionsLite.parseFrom(rawBytes, registry);\n\n    TestUtil.assertAllExtensionsSet(message3);\n  }\n\n  public void testParsePackedExtensionsLite() throws Exception {\n    // Ensure that packed extensions can be properly parsed.\n    TestPackedExtensionsLite message = TestUtil.getLitePackedExtensionsSet();\n    ByteString rawBytes = message.toByteString();\n\n    ExtensionRegistryLite registry = TestUtil.getExtensionRegistryLite();\n\n    TestPackedExtensionsLite message2 =\n        TestPackedExtensionsLite.parseFrom(rawBytes, registry);\n\n    TestUtil.assertPackedExtensionsSet(message2);\n  }\n\n  public void testExtensionsSerializedSize() throws Exception {\n    assertEquals(TestUtil.getAllSet().getSerializedSize(),\n                 TestUtil.getAllExtensionsSet().getSerializedSize());\n  }\n\n  public void testSerializeDelimited() throws Exception {\n    ByteArrayOutputStream output = new ByteArrayOutputStream();\n    TestUtil.getAllSet().writeDelimitedTo(output);\n    output.write(12);\n    TestUtil.getPackedSet().writeDelimitedTo(output);\n    output.write(34);\n\n    ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());\n\n    TestUtil.assertAllFieldsSet(TestAllTypes.parseDelimitedFrom(input));\n    assertEquals(12, input.read());\n    TestUtil.assertPackedFieldsSet(TestPackedTypes.parseDelimitedFrom(input));\n    assertEquals(34, input.read());\n    assertEquals(-1, input.read());\n\n    // We're at EOF, so parsing again should return null.\n    assertTrue(TestAllTypes.parseDelimitedFrom(input) == null);\n  }\n\n  private void assertFieldsInOrder(ByteString data) throws Exception {\n    CodedInputStream input = data.newCodedInput();\n    int previousTag = 0;\n\n    while (true) {\n      int tag = input.readTag();\n      if (tag == 0) {\n        break;\n      }\n\n      assertTrue(tag > previousTag);\n      previousTag = tag;\n      input.skipField(tag);\n    }\n  }\n\n  public void testInterleavedFieldsAndExtensions() throws Exception {\n    // Tests that fields are written in order even when extension ranges\n    // are interleaved with field numbers.\n    ByteString data =\n      TestFieldOrderings.newBuilder()\n        .setMyInt(1)\n        .setMyString(\"foo\")\n        .setMyFloat(1.0F)\n        .setExtension(UnittestProto.myExtensionInt, 23)\n        .setExtension(UnittestProto.myExtensionString, \"bar\")\n        .build().toByteString();\n    assertFieldsInOrder(data);\n\n    Descriptors.Descriptor descriptor = TestFieldOrderings.getDescriptor();\n    ByteString dynamic_data =\n      DynamicMessage.newBuilder(TestFieldOrderings.getDescriptor())\n        .setField(descriptor.findFieldByName(\"my_int\"), 1L)\n        .setField(descriptor.findFieldByName(\"my_string\"), \"foo\")\n        .setField(descriptor.findFieldByName(\"my_float\"), 1.0F)\n        .setField(UnittestProto.myExtensionInt.getDescriptor(), 23)\n        .setField(UnittestProto.myExtensionString.getDescriptor(), \"bar\")\n        .build().toByteString();\n    assertFieldsInOrder(dynamic_data);\n  }\n\n  private ExtensionRegistry getTestFieldOrderingsRegistry() {\n    ExtensionRegistry result = ExtensionRegistry.newInstance();\n    result.add(UnittestProto.myExtensionInt);\n    result.add(UnittestProto.myExtensionString);\n    return result;\n  }\n\n  public void testParseMultipleExtensionRanges() throws Exception {\n    // Make sure we can parse a message that contains multiple extensions\n    // ranges.\n    TestFieldOrderings source =\n      TestFieldOrderings.newBuilder()\n        .setMyInt(1)\n        .setMyString(\"foo\")\n        .setMyFloat(1.0F)\n        .setExtension(UnittestProto.myExtensionInt, 23)\n        .setExtension(UnittestProto.myExtensionString, \"bar\")\n        .build();\n    TestFieldOrderings dest =\n      TestFieldOrderings.parseFrom(source.toByteString(),\n                                   getTestFieldOrderingsRegistry());\n    assertEquals(source, dest);\n  }\n\n  public void testParseMultipleExtensionRangesDynamic() throws Exception {\n    // Same as above except with DynamicMessage.\n    Descriptors.Descriptor descriptor = TestFieldOrderings.getDescriptor();\n    DynamicMessage source =\n      DynamicMessage.newBuilder(TestFieldOrderings.getDescriptor())\n        .setField(descriptor.findFieldByName(\"my_int\"), 1L)\n        .setField(descriptor.findFieldByName(\"my_string\"), \"foo\")\n        .setField(descriptor.findFieldByName(\"my_float\"), 1.0F)\n        .setField(UnittestProto.myExtensionInt.getDescriptor(), 23)\n        .setField(UnittestProto.myExtensionString.getDescriptor(), \"bar\")\n        .build();\n    DynamicMessage dest =\n      DynamicMessage.parseFrom(descriptor, source.toByteString(),\n                               getTestFieldOrderingsRegistry());\n    assertEquals(source, dest);\n  }\n\n  private static final int UNKNOWN_TYPE_ID = 1550055;\n  private static final int TYPE_ID_1 =\n    TestMessageSetExtension1.getDescriptor().getExtensions().get(0).getNumber();\n  private static final int TYPE_ID_2 =\n    TestMessageSetExtension2.getDescriptor().getExtensions().get(0).getNumber();\n\n  public void testSerializeMessageSet() throws Exception {\n    // Set up a TestMessageSet with two known messages and an unknown one.\n    TestMessageSet messageSet =\n      TestMessageSet.newBuilder()\n        .setExtension(\n          TestMessageSetExtension1.messageSetExtension,\n          TestMessageSetExtension1.newBuilder().setI(123).build())\n        .setExtension(\n          TestMessageSetExtension2.messageSetExtension,\n          TestMessageSetExtension2.newBuilder().setStr(\"foo\").build())\n        .setUnknownFields(\n          UnknownFieldSet.newBuilder()\n            .addField(UNKNOWN_TYPE_ID,\n              UnknownFieldSet.Field.newBuilder()\n                .addLengthDelimited(ByteString.copyFromUtf8(\"bar\"))\n                .build())\n            .build())\n        .build();\n\n    ByteString data = messageSet.toByteString();\n\n    // Parse back using RawMessageSet and check the contents.\n    RawMessageSet raw = RawMessageSet.parseFrom(data);\n\n    assertTrue(raw.getUnknownFields().asMap().isEmpty());\n\n    assertEquals(3, raw.getItemCount());\n    assertEquals(TYPE_ID_1, raw.getItem(0).getTypeId());\n    assertEquals(TYPE_ID_2, raw.getItem(1).getTypeId());\n    assertEquals(UNKNOWN_TYPE_ID, raw.getItem(2).getTypeId());\n\n    TestMessageSetExtension1 message1 =\n      TestMessageSetExtension1.parseFrom(\n        raw.getItem(0).getMessage().toByteArray());\n    assertEquals(123, message1.getI());\n\n    TestMessageSetExtension2 message2 =\n      TestMessageSetExtension2.parseFrom(\n        raw.getItem(1).getMessage().toByteArray());\n    assertEquals(\"foo\", message2.getStr());\n\n    assertEquals(\"bar\", raw.getItem(2).getMessage().toStringUtf8());\n  }\n\n  public void testParseMessageSet() throws Exception {\n    ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance();\n    extensionRegistry.add(TestMessageSetExtension1.messageSetExtension);\n    extensionRegistry.add(TestMessageSetExtension2.messageSetExtension);\n\n    // Set up a RawMessageSet with two known messages and an unknown one.\n    RawMessageSet raw =\n      RawMessageSet.newBuilder()\n        .addItem(\n          RawMessageSet.Item.newBuilder()\n            .setTypeId(TYPE_ID_1)\n            .setMessage(\n              TestMessageSetExtension1.newBuilder()\n                .setI(123)\n                .build().toByteString())\n            .build())\n        .addItem(\n          RawMessageSet.Item.newBuilder()\n            .setTypeId(TYPE_ID_2)\n            .setMessage(\n              TestMessageSetExtension2.newBuilder()\n                .setStr(\"foo\")\n                .build().toByteString())\n            .build())\n        .addItem(\n          RawMessageSet.Item.newBuilder()\n            .setTypeId(UNKNOWN_TYPE_ID)\n            .setMessage(ByteString.copyFromUtf8(\"bar\"))\n            .build())\n        .build();\n\n    ByteString data = raw.toByteString();\n\n    // Parse as a TestMessageSet and check the contents.\n    TestMessageSet messageSet =\n      TestMessageSet.parseFrom(data, extensionRegistry);\n\n    assertEquals(123, messageSet.getExtension(\n      TestMessageSetExtension1.messageSetExtension).getI());\n    assertEquals(\"foo\", messageSet.getExtension(\n      TestMessageSetExtension2.messageSetExtension).getStr());\n\n    // Check for unknown field with type LENGTH_DELIMITED,\n    //   number UNKNOWN_TYPE_ID, and contents \"bar\".\n    UnknownFieldSet unknownFields = messageSet.getUnknownFields();\n    assertEquals(1, unknownFields.asMap().size());\n    assertTrue(unknownFields.hasField(UNKNOWN_TYPE_ID));\n\n    UnknownFieldSet.Field field = unknownFields.getField(UNKNOWN_TYPE_ID);\n    assertEquals(1, field.getLengthDelimitedList().size());\n    assertEquals(\"bar\", field.getLengthDelimitedList().get(0).toStringUtf8());\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// A proto file which tests the java_multiple_files option.\n\n\n// Some generic_services option(s) added automatically.\n// See:  http://go/proto2-generic-services-default\noption java_generic_services = true;   // auto-added\n\nimport \"google/protobuf/unittest.proto\";\n\npackage protobuf_unittest;\n\noption java_multiple_files = true;\noption java_outer_classname = \"MultipleFilesTestProto\";\n\nmessage MessageWithNoOuter {\n  message NestedMessage {\n    optional int32 i = 1;\n  }\n  enum NestedEnum {\n    BAZ = 3;\n  }\n  optional NestedMessage nested = 1;\n  repeated TestAllTypes foreign = 2;\n  optional NestedEnum nested_enum = 3;\n  optional EnumWithNoOuter foreign_enum = 4;\n}\n\nenum EnumWithNoOuter {\n  FOO = 1;\n  BAR = 2;\n}\n\nservice ServiceWithNoOuter {\n  rpc Foo(MessageWithNoOuter) returns(TestAllTypes);\n}\n\nextend TestAllExtensions {\n  optional int32 extension_with_outer = 1234567;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: jonp@google.com (Jon Perlow)\n//\n\npackage protobuf_unittest;\n\noption java_multiple_files = true;\noption java_outer_classname = \"NestedBuilders\";\n\n\nmessage Vehicle {\n  optional Engine engine = 1;\n  repeated Wheel wheel = 2;\n}\n\nmessage Engine {\n  optional int32 cylinder = 1;\n  optional int32 liters = 2;\n}\n\nmessage Wheel {\n  optional int32 radius = 1;\n  optional int32 width = 2;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Darick Tong (darick@google.com)\n//\n// A proto file with nested extensions. Note that this must be defined in\n// a separate file to properly test the initialization of the outer class.\n\n\nimport \"com/google/protobuf/non_nested_extension.proto\";\n\npackage protobuf_unittest;\n\nmessage MyNestedExtension {\n  extend MessageToBeExtended {\n    optional MessageToBeExtended recursiveExtension = 2;\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Darick Tong (darick@google.com)\n//\n// A proto file with nested extensions for a MessageLite messages. Note that\n// this must be defined in a separate file to properly test the initialization\n// of the outer class.\n\n\npackage protobuf_unittest;\n\noption optimize_for = LITE_RUNTIME;\n\nimport \"com/google/protobuf/non_nested_extension_lite.proto\";\n\nmessage MyNestedExtensionLite {\n  extend MessageLiteToBeExtended {\n    optional MessageLiteToBeExtended recursiveExtensionLite = 3;\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Darick Tong (darick@google.com)\n//\n// A proto file with extensions.\n\n\npackage protobuf_unittest;\n\nmessage MessageToBeExtended {\n  extensions 1 to max;\n}\n\nmessage MyNonNestedExtension {\n}\n\nextend MessageToBeExtended {\n  optional MyNonNestedExtension nonNestedExtension = 1;\n}\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: Darick Tong (darick@google.com)\n//\n// A proto file with extensions for a MessageLite messages.\n\n\npackage protobuf_unittest;\n\noption optimize_for = LITE_RUNTIME;\n\nmessage MessageLiteToBeExtended {\n  extensions 1 to max;\n}\n\nmessage MyNonNestedExtensionLite {\n}\n\nextend MessageLiteToBeExtended {\n  optional MyNonNestedExtensionLite nonNestedExtensionLite = 1;\n}\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: jonp@google.com (Jon Perlow)\n\n// This file tests that various identifiers work as field and type names even\n// though the same identifiers are used internally by the java code generator.\n\n\n// Some generic_services option(s) added automatically.\n// See:  http://go/proto2-generic-services-default\noption java_generic_services = true;   // auto-added\n\npackage io_protocol_tests;\n\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"TestBadIdentifiersProto\";\n\nmessage TestMessage {\n}\n\nmessage Deprecated {\n  enum TestEnum {\n    FOO = 1;\n  }\n\n  optional int32 field1 = 1 [deprecated=true];\n  optional TestEnum field2 = 2 [deprecated=true];\n  optional TestMessage field3 = 3 [deprecated=true];\n}\n\nmessage Override {\n  optional int32 override = 1;\n}\n\nmessage Object {\n  optional int32 object = 1;\n}\n\nmessage String {\n  optional string string = 1;\n}\n\nmessage Integer {\n  optional int32 integer = 1;\n}\n\nmessage Long {\n  optional int32 long = 1;\n}\n\nmessage Float {\n  optional float float = 1;\n}\n\nmessage Double {\n  optional double double = 1;\n}\n\nservice TestConflictingMethodNames {\n  rpc Override(TestMessage) returns (TestMessage);\n}\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/m4/ac_system_extensions.m4",
    "content": "dnl Provide AC_USE_SYSTEM_EXTENSIONS for old autoconf machines.\nAC_DEFUN([ACX_USE_SYSTEM_EXTENSIONS],[\n  ifdef([AC_USE_SYSTEM_EXTENSIONS],[\n    AC_USE_SYSTEM_EXTENSIONS\n  ],[\n    AC_BEFORE([$0], [AC_COMPILE_IFELSE])\n    AC_BEFORE([$0], [AC_RUN_IFELSE])\n\n    AC_REQUIRE([AC_GNU_SOURCE])\n    AC_REQUIRE([AC_AIX])\n    AC_REQUIRE([AC_MINIX])\n\n    AH_VERBATIM([__EXTENSIONS__],\n[/* Enable extensions on Solaris.  */\n#ifndef __EXTENSIONS__\n# undef __EXTENSIONS__\n#endif\n#ifndef _POSIX_PTHREAD_SEMANTICS\n# undef _POSIX_PTHREAD_SEMANTICS\n#endif\n#ifndef _TANDEM_SOURCE\n# undef _TANDEM_SOURCE\n#endif])\n    AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],\n      [ac_cv_safe_to_define___extensions__],\n      [AC_COMPILE_IFELSE(\n         [AC_LANG_PROGRAM([\n#           define __EXTENSIONS__ 1\n            AC_INCLUDES_DEFAULT])],\n         [ac_cv_safe_to_define___extensions__=yes],\n         [ac_cv_safe_to_define___extensions__=no])])\n    test $ac_cv_safe_to_define___extensions__ = yes &&\n      AC_DEFINE([__EXTENSIONS__])\n    AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])\n    AC_DEFINE([_TANDEM_SOURCE])\n  ])\n])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_check_suncc.m4",
    "content": "dnl Check for the presence of the Sun Studio compiler.\ndnl If Sun Studio compiler is found, set appropriate flags.\ndnl Additionally, Sun Studio doesn't default to 64-bit by itself,\ndnl nor does it automatically look in standard Solaris places for\ndnl 64-bit libs, so we must add those options and paths to the search\ndnl paths.\n\ndnl TODO(kenton):  This is pretty hacky.  It sets CXXFLAGS, which the autoconf\ndnl docs say should never be overridden except by the user.  It also isn't\ndnl cross-compile safe.  We should fix these problems, but since I don't have\ndnl Sun CC at my disposal for testing, someone else will have to do it.\n\nAC_DEFUN([ACX_CHECK_SUNCC],[\n\n  AC_LANG_PUSH([C++])\n  AC_CHECK_DECL([__SUNPRO_CC], [SUNCC=\"yes\"], [SUNCC=\"no\"])\n  AC_LANG_POP()\n\n\n  AC_ARG_ENABLE([64bit-solaris],\n    [AS_HELP_STRING([--disable-64bit-solaris],\n      [Build 64 bit binary on Solaris @<:@default=on@:>@])],\n             [ac_enable_64bit=\"$enableval\"],\n             [ac_enable_64bit=\"yes\"])\n\n  AS_IF([test \"$SUNCC\" = \"yes\" -a \"x${ac_cv_env_CXXFLAGS_set}\" = \"x\"],[\n    dnl Sun Studio has a crashing bug with -xO4 in some cases. Keep this\n    dnl at -xO3 until a proper test to detect those crashes can be done.\n    CXXFLAGS=\"-g0 -xO3 -xlibmil -xdepend -xbuiltin -mt -compat=5 -library=stlport4 -library=Crun -template=no%extdef ${CXXFLAGS}\"\n  ])\n\n  case $host_os in\n    *solaris*)\n      AC_CHECK_PROGS(ISAINFO, [isainfo], [no])\n      AS_IF([test \"x$ISAINFO\" != \"xno\"],\n            [isainfo_b=`${ISAINFO} -b`],\n            [isainfo_b=\"x\"])\n\n      AS_IF([test \"$isainfo_b\" != \"x\"],[\n\n        isainfo_k=`${ISAINFO} -k`\n\n        AS_IF([test \"x$ac_enable_64bit\" = \"xyes\"],[\n\n          AS_IF([test \"x$libdir\" = \"x\\${exec_prefix}/lib\"],[\n           dnl The user hasn't overridden the default libdir, so we'll\n           dnl the dir suffix to match solaris 32/64-bit policy\n           libdir=\"${libdir}/${isainfo_k}\"\n          ])\n\n          dnl This should just be set in CPPFLAGS and in LDFLAGS, but libtool\n          dnl does the wrong thing if you don't put it into CXXFLAGS. sigh.\n          dnl (It also needs it in CFLAGS, or it does a different wrong thing!)\n          AS_IF([test \"x${ac_cv_env_CXXFLAGS_set}\" = \"x\"],[\n            CXXFLAGS=\"${CXXFLAGS} -m64\"\n            ac_cv_env_CXXFLAGS_set=set\n            ac_cv_env_CXXFLAGS_value='-m64'\n          ])\n\n          AS_IF([test \"x${ac_cv_env_CFLAGS_set}\" = \"x\"],[\n            CFLAGS=\"${CFLAGS} -m64\"\n            ac_cv_env_CFLAGS_set=set\n            ac_cv_env_CFLAGS_value='-m64'\n          ])\n\n          AS_IF([test \"$target_cpu\" = \"sparc\" -a \"x$SUNCC\" = \"xyes\" ],[\n            CXXFLAGS=\"-xmemalign=8s ${CXXFLAGS}\"\n          ])\n        ])\n      ])\n    ;;\n  esac\n\n])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_pthread.m4",
    "content": "# This was retrieved from\n#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi\n# See also (perhaps for new versions?)\n#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi\n#\n# We've rewritten the inconsistency check code (from avahi), to work\n# more broadly.  In particular, it no longer assumes ld accepts -zdefs.\n# This caused a restructing of the code, but the functionality has only\n# changed a little.\n\ndnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])\ndnl\ndnl @summary figure out how to build C programs using POSIX threads\ndnl\ndnl This macro figures out how to build C programs using POSIX threads.\ndnl It sets the PTHREAD_LIBS output variable to the threads library and\ndnl linker flags, and the PTHREAD_CFLAGS output variable to any special\ndnl C compiler flags that are needed. (The user can also force certain\ndnl compiler flags/libs to be tested by setting these environment\ndnl variables.)\ndnl\ndnl Also sets PTHREAD_CC to any special C compiler that is needed for\ndnl multi-threaded programs (defaults to the value of CC otherwise).\ndnl (This is necessary on AIX to use the special cc_r compiler alias.)\ndnl\ndnl NOTE: You are assumed to not only compile your program with these\ndnl flags, but also link it with them as well. e.g. you should link\ndnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS\ndnl $LIBS\ndnl\ndnl If you are only building threads programs, you may wish to use\ndnl these variables in your default LIBS, CFLAGS, and CC:\ndnl\ndnl        LIBS=\"$PTHREAD_LIBS $LIBS\"\ndnl        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\ndnl        CC=\"$PTHREAD_CC\"\ndnl\ndnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute\ndnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to\ndnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).\ndnl\ndnl ACTION-IF-FOUND is a list of shell commands to run if a threads\ndnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to\ndnl run it if it is not found. If ACTION-IF-FOUND is not specified, the\ndnl default action will define HAVE_PTHREAD.\ndnl\ndnl Please let the authors know if this macro fails on any platform, or\ndnl if you have any other suggestions or comments. This macro was based\ndnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with\ndnl help from M. Frigo), as well as ac_pthread and hb_pthread macros\ndnl posted by Alejandro Forero Cuervo to the autoconf macro repository.\ndnl We are also grateful for the helpful feedback of numerous users.\ndnl\ndnl @category InstalledPackages\ndnl @author Steven G. Johnson <stevenj@alum.mit.edu>\ndnl @version 2006-05-29\ndnl @license GPLWithACException\ndnl \ndnl Checks for GCC shared/pthread inconsistency based on work by\ndnl Marcin Owsiany <marcin@owsiany.pl>\n\n\nAC_DEFUN([ACX_PTHREAD], [\nAC_REQUIRE([AC_CANONICAL_HOST])\nAC_LANG_SAVE\nAC_LANG_C\nacx_pthread_ok=no\n\n# We used to check for pthread.h first, but this fails if pthread.h\n# requires special compiler flags (e.g. on True64 or Sequent).\n# It gets checked for in the link test anyway.\n\n# First of all, check if the user has set any of the PTHREAD_LIBS,\n# etcetera environment variables, and if threads linking works using\n# them:\nif test x\"$PTHREAD_LIBS$PTHREAD_CFLAGS\" != x; then\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])\n        AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)\n        AC_MSG_RESULT($acx_pthread_ok)\n        if test x\"$acx_pthread_ok\" = xno; then\n                PTHREAD_LIBS=\"\"\n                PTHREAD_CFLAGS=\"\"\n        fi\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\nfi\n\n# We must check for the threads library under a number of different\n# names; the ordering is very important because some systems\n# (e.g. DEC) have both -lpthread and -lpthreads, where one of the\n# libraries is broken (non-POSIX).\n\n# Create a list of thread flags to try.  Items starting with a \"-\" are\n# C compiler flags, and other items are library names, except for \"none\"\n# which indicates that we try without any flags at all, and \"pthread-config\"\n# which is a program returning the flags for the Pth emulation library.\n\nacx_pthread_flags=\"pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config\"\n\n# The ordering *is* (sometimes) important.  Some notes on the\n# individual items follow:\n\n# pthreads: AIX (must check this before -lpthread)\n# none: in case threads are in libc; should be tried before -Kthread and\n#       other compiler flags to prevent continual compiler warnings\n# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)\n# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)\n# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)\n# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)\n# -pthreads: Solaris/gcc\n# -mthreads: Mingw32/gcc, Lynx/gcc\n# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it\n#      doesn't hurt to check since this sometimes defines pthreads too;\n#      also defines -D_REENTRANT)\n#      ... -mt is also the pthreads flag for HP/aCC\n# pthread: Linux, etcetera\n# --thread-safe: KAI C++\n# pthread-config: use pthread-config program (for GNU Pth library)\n\ncase \"${host_cpu}-${host_os}\" in\n        *solaris*)\n\n        # On Solaris (at least, for some versions), libc contains stubbed\n        # (non-functional) versions of the pthreads routines, so link-based\n        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/\n        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather\n        # a function called by this macro, so we could check for that, but\n        # who knows whether they'll stub that too in a future libc.)  So,\n        # we'll just look for -pthreads and -lpthread first:\n\n        acx_pthread_flags=\"-pthreads pthread -mt -pthread $acx_pthread_flags\"\n        ;;\nesac\n\nif test x\"$acx_pthread_ok\" = xno; then\nfor flag in $acx_pthread_flags; do\n\n        case $flag in\n                none)\n                AC_MSG_CHECKING([whether pthreads work without any flags])\n                ;;\n\n                -*)\n                AC_MSG_CHECKING([whether pthreads work with $flag])\n                PTHREAD_CFLAGS=\"$flag\"\n                ;;\n\n\t\tpthread-config)\n\t\tAC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)\n\t\tif test x\"$acx_pthread_config\" = xno; then continue; fi\n\t\tPTHREAD_CFLAGS=\"`pthread-config --cflags`\"\n\t\tPTHREAD_LIBS=\"`pthread-config --ldflags` `pthread-config --libs`\"\n\t\t;;\n\n                *)\n                AC_MSG_CHECKING([for the pthreads library -l$flag])\n                PTHREAD_LIBS=\"-l$flag\"\n                ;;\n        esac\n\n        save_LIBS=\"$LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Check for various functions.  We must include pthread.h,\n        # since some functions may be macros.  (On the Sequent, we\n        # need a special flag -Kthread to make this header compile.)\n        # We check for pthread_join because it is in -lpthread on IRIX\n        # while pthread_create is in libc.  We check for pthread_attr_init\n        # due to DEC craziness with -lpthreads.  We check for\n        # pthread_cleanup_push because it is one of the few pthread\n        # functions on Solaris that doesn't have a non-functional libc stub.\n        # We try pthread_create on general principles.\n        AC_TRY_LINK([#include <pthread.h>],\n                    [pthread_t th; pthread_join(th, 0);\n                     pthread_attr_init(0); pthread_cleanup_push(0, 0);\n                     pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n                    [acx_pthread_ok=yes])\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n\n        AC_MSG_RESULT($acx_pthread_ok)\n        if test \"x$acx_pthread_ok\" = xyes; then\n                break;\n        fi\n\n        PTHREAD_LIBS=\"\"\n        PTHREAD_CFLAGS=\"\"\ndone\nfi\n\n# Various other checks:\nif test \"x$acx_pthread_ok\" = xyes; then\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.\n\tAC_MSG_CHECKING([for joinable pthread attribute])\n\tattr_name=unknown\n\tfor attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do\n\t    AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],\n                        [attr_name=$attr; break])\n\tdone\n        AC_MSG_RESULT($attr_name)\n        if test \"$attr_name\" != PTHREAD_CREATE_JOINABLE; then\n            AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,\n                               [Define to necessary symbol if this constant\n                                uses a non-standard name on your system.])\n        fi\n\n        AC_MSG_CHECKING([if more special flags are required for pthreads])\n        flag=no\n        case \"${host_cpu}-${host_os}\" in\n            *-aix* | *-freebsd* | *-darwin*) flag=\"-D_THREAD_SAFE\";;\n            *solaris* | *-osf* | *-hpux*) flag=\"-D_REENTRANT\";;\n        esac\n        AC_MSG_RESULT(${flag})\n        if test \"x$flag\" != xno; then\n            PTHREAD_CFLAGS=\"$flag $PTHREAD_CFLAGS\"\n        fi\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n        # More AIX lossage: must compile with xlc_r or cc_r\n\tif test x\"$GCC\" != xyes; then\n          AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})\n        else\n          PTHREAD_CC=$CC\n\tfi\n\n\t# The next part tries to detect GCC inconsistency with -shared on some\n\t# architectures and systems. The problem is that in certain\n\t# configurations, when -shared is specified, GCC \"forgets\" to\n\t# internally use various flags which are still necessary.\n\t\n\t#\n\t# Prepare the flags\n\t#\n\tsave_CFLAGS=\"$CFLAGS\"\n\tsave_LIBS=\"$LIBS\"\n\tsave_CC=\"$CC\"\n\t\n\t# Try with the flags determined by the earlier checks.\n\t#\n\t# -Wl,-z,defs forces link-time symbol resolution, so that the\n\t# linking checks with -shared actually have any value\n\t#\n\t# FIXME: -fPIC is required for -shared on many architectures,\n\t# so we specify it here, but the right way would probably be to\n\t# properly detect whether it is actually required.\n\tCFLAGS=\"-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS\"\n\tLIBS=\"$PTHREAD_LIBS $LIBS\"\n\tCC=\"$PTHREAD_CC\"\n\t\n\t# In order not to create several levels of indentation, we test\n\t# the value of \"$done\" until we find the cure or run out of ideas.\n\tdone=\"no\"\n\t\n\t# First, make sure the CFLAGS we added are actually accepted by our\n\t# compiler.  If not (and OS X's ld, for instance, does not accept -z),\n\t# then we can't do this test.\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies])\n\t   AC_TRY_LINK(,, , [done=yes])\n\t\n\t   if test \"x$done\" = xyes ; then\n\t      AC_MSG_RESULT([no])\n\t   else\n\t      AC_MSG_RESULT([yes])\n\t   fi\n\tfi\n\t\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether -pthread is sufficient with -shared])\n\t   AC_TRY_LINK([#include <pthread.h>],\n\t      [pthread_t th; pthread_join(th, 0);\n\t      pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t      [done=yes])\n\t   \n\t   if test \"x$done\" = xyes; then\n\t      AC_MSG_RESULT([yes])\n\t   else\n\t      AC_MSG_RESULT([no])\n\t   fi\n\tfi\n\t\n\t#\n\t# Linux gcc on some architectures such as mips/mipsel forgets\n\t# about -lpthread\n\t#\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether -lpthread fixes that])\n\t   LIBS=\"-lpthread $PTHREAD_LIBS $save_LIBS\"\n\t   AC_TRY_LINK([#include <pthread.h>],\n\t      [pthread_t th; pthread_join(th, 0);\n\t      pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t      [done=yes])\n\t\n\t   if test \"x$done\" = xyes; then\n\t      AC_MSG_RESULT([yes])\n\t      PTHREAD_LIBS=\"-lpthread $PTHREAD_LIBS\"\n\t   else\n\t      AC_MSG_RESULT([no])\n\t   fi\n\tfi\n\t#\n\t# FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc\n\t#\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether -lc_r fixes that])\n\t   LIBS=\"-lc_r $PTHREAD_LIBS $save_LIBS\"\n\t   AC_TRY_LINK([#include <pthread.h>],\n\t       [pthread_t th; pthread_join(th, 0);\n\t        pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t        pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t       [done=yes])\n\t\n\t   if test \"x$done\" = xyes; then\n\t      AC_MSG_RESULT([yes])\n\t      PTHREAD_LIBS=\"-lc_r $PTHREAD_LIBS\"\n\t   else\n\t      AC_MSG_RESULT([no])\n\t   fi\n\tfi\n\tif test x\"$done\" = xno; then\n\t   # OK, we have run out of ideas\n\t   AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries])\n\t\n\t   # so it's not safe to assume that we may use pthreads\n\t   acx_pthread_ok=no\n\tfi\n\t\n\tAC_MSG_CHECKING([whether what we have so far is sufficient with -nostdlib])\n\tCFLAGS=\"-nostdlib $CFLAGS\"\n\t# we need c with nostdlib\n\tLIBS=\"$LIBS -lc\"\n\tAC_TRY_LINK([#include <pthread.h>],\n\t      [pthread_t th; pthread_join(th, 0);\n\t       pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t       pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t      [done=yes],[done=no])\n\n\tif test \"x$done\" = xyes; then\n\t   AC_MSG_RESULT([yes])\n\telse\n\t   AC_MSG_RESULT([no])\n\tfi\n\t\n\tif test x\"$done\" = xno; then\n\t   AC_MSG_CHECKING([whether -lpthread saves the day])\n\t   LIBS=\"-lpthread $LIBS\"\n\t   AC_TRY_LINK([#include <pthread.h>],\n\t      [pthread_t th; pthread_join(th, 0);\n\t       pthread_attr_init(0); pthread_cleanup_push(0, 0);\n\t       pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],\n\t      [done=yes],[done=no])\n\n\t   if test \"x$done\" = xyes; then\n\t      AC_MSG_RESULT([yes])\n\t      PTHREAD_LIBS=\"$PTHREAD_LIBS -lpthread\"\n\t   else\n\t      AC_MSG_RESULT([no])\n\t      AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries and -nostdlib])\n\t   fi\n\tfi\n\n\tCFLAGS=\"$save_CFLAGS\"\n\tLIBS=\"$save_LIBS\"\n\tCC=\"$save_CC\"\nelse\n        PTHREAD_CC=\"$CC\"\nfi\n\nAC_SUBST(PTHREAD_LIBS)\nAC_SUBST(PTHREAD_CFLAGS)\nAC_SUBST(PTHREAD_CC)\n\n# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:\nif test x\"$acx_pthread_ok\" = xyes; then\n        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])\n        :\nelse\n        acx_pthread_ok=no\n        $2\nfi\nAC_LANG_RESTORE\n])dnl ACX_PTHREAD\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/m4/stl_hash.m4",
    "content": "# We check two things: where the include file is for\n# unordered_map/hash_map (we prefer the first form), and what\n# namespace unordered/hash_map lives in within that include file.  We\n# include AC_TRY_COMPILE for all the combinations we've seen in the\n# wild.  We define HASH_MAP_H to the location of the header file, and\n# HASH_NAMESPACE to the namespace the class (unordered_map or\n# hash_map) is in.  We define HAVE_UNORDERED_MAP if the class we found\n# is named unordered_map, or leave it undefined if not.\n\n# This also checks if unordered map exists.\nAC_DEFUN([AC_CXX_STL_HASH],\n  [\n   AC_MSG_CHECKING(the location of hash_map)\n   AC_LANG_SAVE\n   AC_LANG_CPLUSPLUS\n   ac_cv_cxx_hash_map=\"\"\n   # First try unordered_map, but not on gcc's before 4.2 -- I've\n   # seen unexplainable unordered_map bugs with -O2 on older gcc's.\n   AC_TRY_COMPILE([#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2))\n                   # error GCC too old for unordered_map\n                   #endif\n                   ],\n                   [/* no program body necessary */],\n                   [stl_hash_old_gcc=no],\n                   [stl_hash_old_gcc=yes])\n   for location in unordered_map tr1/unordered_map; do\n     for namespace in std std::tr1; do\n       if test -z \"$ac_cv_cxx_hash_map\" -a \"$stl_hash_old_gcc\" != yes; then\n         # Some older gcc's have a buggy tr1, so test a bit of code.\n         AC_TRY_COMPILE([#include <$location>],\n                        [const ${namespace}::unordered_map<int, int> t;\n                         return t.find(5) == t.end();],\n                        [ac_cv_cxx_hash_map=\"<$location>\";\n                         ac_cv_cxx_hash_namespace=\"$namespace\";\n                         ac_cv_cxx_hash_map_class=\"unordered_map\";])\n       fi\n     done\n   done\n   # Now try hash_map\n   for location in ext/hash_map hash_map; do\n     for namespace in __gnu_cxx \"\" std stdext; do\n       if test -z \"$ac_cv_cxx_hash_map\"; then\n         AC_TRY_COMPILE([#include <$location>],\n                        [${namespace}::hash_map<int, int> t],\n                        [ac_cv_cxx_hash_map=\"<$location>\";\n                         ac_cv_cxx_hash_namespace=\"$namespace\";\n                         ac_cv_cxx_hash_map_class=\"hash_map\";])\n       fi\n     done\n   done\n   ac_cv_cxx_hash_set=`echo \"$ac_cv_cxx_hash_map\" | sed s/map/set/`;\n   ac_cv_cxx_hash_set_class=`echo \"$ac_cv_cxx_hash_map_class\" | sed s/map/set/`;\n   if test -n \"$ac_cv_cxx_hash_map\"; then\n      AC_DEFINE(HAVE_HASH_MAP, 1, [define if the compiler has hash_map])\n      AC_DEFINE(HAVE_HASH_SET, 1, [define if the compiler has hash_set])\n      AC_DEFINE_UNQUOTED(HASH_MAP_H,$ac_cv_cxx_hash_map,\n                         [the location of <unordered_map> or <hash_map>])\n      AC_DEFINE_UNQUOTED(HASH_SET_H,$ac_cv_cxx_hash_set,\n                         [the location of <unordered_set> or <hash_set>])\n      AC_DEFINE_UNQUOTED(HASH_NAMESPACE,$ac_cv_cxx_hash_namespace,\n                         [the namespace of hash_map/hash_set])\n      AC_DEFINE_UNQUOTED(HASH_MAP_CLASS,$ac_cv_cxx_hash_map_class,\n                         [the name of <hash_map>])\n      AC_DEFINE_UNQUOTED(HASH_SET_CLASS,$ac_cv_cxx_hash_set_class,\n                         [the name of <hash_set>])\n      AC_MSG_RESULT([$ac_cv_cxx_hash_map])\n   else\n      AC_MSG_RESULT()\n      AC_MSG_WARN([could not find an STL hash_map])\n   fi\n])\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/post_process_dist.sh",
    "content": "#! /bin/sh\n\n# This script takes the result of \"make dist\" and:\n# 1) Unpacks it.\n# 2) Ensures all contents are user-writable.  Some version control systems\n#    keep code read-only until you explicitly ask to edit it, and the normal\n#    \"make dist\" process does not correct for this, so the result is that\n#    the entire dist is still marked read-only when unpacked, which is\n#    annoying.  So, we fix it.\n# 3) Convert MSVC project files to MSVC 2005, so that anyone who has version\n#    2005 *or* 2008 can open them.  (In version control, we keep things in\n#    MSVC 2008 format since that's what we use in development.)\n# 4) Uses the result to create .tar.gz, .tar.bz2, and .zip versions and\n#    deposites them in the \"dist\" directory.  In the .zip version, all\n#    non-testdata .txt files are converted to Windows-style line endings.\n# 5) Cleans up after itself.\n\nif [ \"$1\" == \"\" ]; then\n  echo \"USAGE:  $1 DISTFILE\" >&2\n  exit 1\nfi\n\nif [ ! -e $1 ]; then\n  echo $1\": File not found.\" >&2\n  exit 1\nfi\n\nset -ex\n\nBASENAME=`basename $1 .tar.gz`\n\n# Create a directory called \"dist\", copy the tarball there and unpack it.\nmkdir dist\ncp $1 dist\ncd dist\ntar zxvf $BASENAME.tar.gz\nrm $BASENAME.tar.gz\n\n# Set the entire contents to be user-writable.\nchmod -R u+w $BASENAME\n\n# Convert the MSVC projects to MSVC 2005 format.\ncd $BASENAME/vsprojects\n./convert2008to2005.sh\ncd ..\n\n# Build the dist again in .tar.gz and .tar.bz2 formats.\n./configure\nmake dist-gzip\nmake dist-bzip2\n\n# Convert all text files to use DOS-style line endings, then build a .zip\n# distribution.\ntodos *.txt */*.txt\nmake dist-zip\n\n# Clean up.\nmv $BASENAME.tar.gz $BASENAME.tar.bz2 $BASENAME.zip ..\ncd ..\nrm -rf $BASENAME\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/protobuf-lite.pc.in",
    "content": "prefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: Protocol Buffers\nDescription: Google's Data Interchange Format\nVersion: @VERSION@\nLibs: -L${libdir} -lprotobuf-lite @PTHREAD_CFLAGS@ @PTHREAD_LIBS@\nCflags: -I${includedir} @PTHREAD_CFLAGS@\n# Commented out because it crashes pkg-config *sigh*:\n#   http://bugs.freedesktop.org/show_bug.cgi?id=13265\n# Conflicts: protobuf\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/protobuf.pc.in",
    "content": "prefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: Protocol Buffers\nDescription: Google's Data Interchange Format\nVersion: @VERSION@\nLibs: -L${libdir} -lprotobuf @LIBS@ @PTHREAD_CFLAGS@ @PTHREAD_LIBS@\nCflags: -I${includedir} @PTHREAD_CFLAGS@\n# Commented out because it crashes pkg-config *sigh*:\n#   http://bugs.freedesktop.org/show_bug.cgi?id=13265\n# Conflicts: protobuf-lite\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/README.txt",
    "content": "Protocol Buffers - Google's data interchange format\nCopyright 2008 Google Inc.\n\nThis directory contains the Python Protocol Buffers runtime library.\n\nNormally, this directory comes as part of the protobuf package, available\nfrom:\n\n  http://code.google.com/p/protobuf\n\nThe complete package includes the C++ source code, which includes the\nProtocol Compiler (protoc).  If you downloaded this package from PyPI\nor some other Python-specific source, you may have received only the\nPython part of the code.  In this case, you will need to obtain the\nProtocol Compiler from some other source before you can use this\npackage.\n\nDevelopment Warning\n===================\n\nThe Python implementation of Protocol Buffers is not as mature as the C++\nand Java implementations.  It may be more buggy, and it is known to be\npretty slow at this time.  If you would like to help fix these issues,\njoin the Protocol Buffers discussion list and let us know!\n\nInstallation\n============\n\n1) Make sure you have Python 2.4 or newer.  If in doubt, run:\n\n     $ python -V\n\n2) If you do not have setuptools installed, note that it will be\n   downloaded and installed automatically as soon as you run setup.py.\n   If you would rather install it manually, you may do so by following\n   the instructions on this page:\n\n     http://peak.telecommunity.com/DevCenter/EasyInstall#installation-instructions\n\n3) Build the C++ code, or install a binary distribution of protoc.  If\n   you install a binary distribution, make sure that it is the same\n   version as this package.  If in doubt, run:\n\n     $ protoc --version\n\n4) Run the tests:\n\n     $ python setup.py test\n\n   If some tests fail, this library may not work correctly on your\n   system.  Continue at your own risk.\n\n   Please note that there is a known problem with some versions of\n   Python on Cygwin which causes the tests to fail after printing the\n   error:  \"sem_init: Resource temporarily unavailable\".  This appears\n   to be a bug either in Cygwin or in Python:\n     http://www.cygwin.com/ml/cygwin/2005-07/msg01378.html\n   We do not know if or when it might me fixed.  We also do not know\n   how likely it is that this bug will affect users in practice.\n\n5) Install:\n\n     $ python setup.py install\n\n   This step may require superuser privileges.\n   NOTE: To use C++ implementation, you need to install C++ protobuf runtime\n   library of the same version and export the environment variable before this\n   step. See the \"C++ Implementation\" section below for more details.\n\nUsage\n=====\n\nThe complete documentation for Protocol Buffers is available via the\nweb at:\n\n  http://code.google.com/apis/protocolbuffers/\n\nC++ Implementation\n==================\n\nWARNING: This is EXPERIMENTAL and only available for CPython platforms.\n\nThe C++ implementation for Python messages is built as a Python extension to\nimprove the overall protobuf Python performance.\n\nTo use the C++ implementation, you need to:\n1) Install the C++ protobuf runtime library, please see instructions in the\n   parent directory.\n2) Export an environment variable:\n\n  $ export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp\n\nYou need to export this variable before running setup.py script to build and\ninstall the extension.  You must also set the variable at runtime, otherwise\nthe pure-Python implementation will be used. In a future release, we will\nchange the default so that C++ implementation is used whenever it is available.\nIt is strongly recommended to run `python setup.py test` after setting the\nvariable to \"cpp\", so the tests will be against C++ implemented Python\nmessages.\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/ez_setup.py",
    "content": "#!python\n\n# This file was obtained from:\n#   http://peak.telecommunity.com/dist/ez_setup.py\n# on 2011/1/21.\n\n\"\"\"Bootstrap setuptools installation\n\nIf you want to use setuptools in your package's setup.py, just include this\nfile in the same directory with it, and add this to the top of your setup.py::\n\n    from ez_setup import use_setuptools\n    use_setuptools()\n\nIf you want to require a specific version of setuptools, set a download\nmirror, or use an alternate download directory, you can do so by supplying\nthe appropriate options to ``use_setuptools()``.\n\nThis file can also be run as a script to install or upgrade setuptools.\n\"\"\"\nimport sys\nDEFAULT_VERSION = \"0.6c11\"\nDEFAULT_URL     = \"http://pypi.python.org/packages/%s/s/setuptools/\" % sys.version[:3]\n\nmd5_data = {\n    'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',\n    'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',\n    'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',\n    'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',\n    'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',\n    'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',\n    'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',\n    'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',\n    'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',\n    'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',\n    'setuptools-0.6c10-py2.3.egg': 'ce1e2ab5d3a0256456d9fc13800a7090',\n    'setuptools-0.6c10-py2.4.egg': '57d6d9d6e9b80772c59a53a8433a5dd4',\n    'setuptools-0.6c10-py2.5.egg': 'de46ac8b1c97c895572e5e8596aeb8c7',\n    'setuptools-0.6c10-py2.6.egg': '58ea40aef06da02ce641495523a0b7f5',\n    'setuptools-0.6c11-py2.3.egg': '2baeac6e13d414a9d28e7ba5b5a596de',\n    'setuptools-0.6c11-py2.4.egg': 'bd639f9b0eac4c42497034dec2ec0c2b',\n    'setuptools-0.6c11-py2.5.egg': '64c94f3bf7a72a13ec83e0b24f2749b2',\n    'setuptools-0.6c11-py2.6.egg': 'bfa92100bd772d5a213eedd356d64086',\n    'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',\n    'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',\n    'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',\n    'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',\n    'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',\n    'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',\n    'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',\n    'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',\n    'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',\n    'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',\n    'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',\n    'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',\n    'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',\n    'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',\n    'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',\n    'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',\n    'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',\n    'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',\n    'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',\n    'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',\n    'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',\n    'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',\n    'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',\n    'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',\n}\n\nimport sys, os\ntry: from hashlib import md5\nexcept ImportError: from md5 import md5\n\ndef _validate_md5(egg_name, data):\n    if egg_name in md5_data:\n        digest = md5(data).hexdigest()\n        if digest != md5_data[egg_name]:\n            print >>sys.stderr, (\n                \"md5 validation of %s failed!  (Possible download problem?)\"\n                % egg_name\n            )\n            sys.exit(2)\n    return data\n\ndef use_setuptools(\n    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,\n    download_delay=15\n):\n    \"\"\"Automatically find/download setuptools and make it available on sys.path\n\n    `version` should be a valid setuptools version number that is available\n    as an egg for download under the `download_base` URL (which should end with\n    a '/').  `to_dir` is the directory where setuptools will be downloaded, if\n    it is not already available.  If `download_delay` is specified, it should\n    be the number of seconds that will be paused before initiating a download,\n    should one be required.  If an older version of setuptools is installed,\n    this routine will print a message to ``sys.stderr`` and raise SystemExit in\n    an attempt to abort the calling script.\n    \"\"\"\n    was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules\n    def do_download():\n        egg = download_setuptools(version, download_base, to_dir, download_delay)\n        sys.path.insert(0, egg)\n        import setuptools; setuptools.bootstrap_install_from = egg\n    try:\n        import pkg_resources\n    except ImportError:\n        return do_download()       \n    try:\n        pkg_resources.require(\"setuptools>=\"+version); return\n    except pkg_resources.VersionConflict, e:\n        if was_imported:\n            print >>sys.stderr, (\n            \"The required version of setuptools (>=%s) is not available, and\\n\"\n            \"can't be installed while this script is running. Please install\\n\"\n            \" a more recent version first, using 'easy_install -U setuptools'.\"\n            \"\\n\\n(Currently using %r)\"\n            ) % (version, e.args[0])\n            sys.exit(2)\n    except pkg_resources.DistributionNotFound:\n        pass\n\n    del pkg_resources, sys.modules['pkg_resources']    # reload ok\n    return do_download()\n\ndef download_setuptools(\n    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,\n    delay = 15\n):\n    \"\"\"Download setuptools from a specified location and return its filename\n\n    `version` should be a valid setuptools version number that is available\n    as an egg for download under the `download_base` URL (which should end\n    with a '/'). `to_dir` is the directory where the egg will be downloaded.\n    `delay` is the number of seconds to pause before an actual download attempt.\n    \"\"\"\n    import urllib2, shutil\n    egg_name = \"setuptools-%s-py%s.egg\" % (version,sys.version[:3])\n    url = download_base + egg_name\n    saveto = os.path.join(to_dir, egg_name)\n    src = dst = None\n    if not os.path.exists(saveto):  # Avoid repeated downloads\n        try:\n            from distutils import log\n            if delay:\n                log.warn(\"\"\"\n---------------------------------------------------------------------------\nThis script requires setuptools version %s to run (even to display\nhelp).  I will attempt to download it for you (from\n%s), but\nyou may need to enable firewall access for this script first.\nI will start the download in %d seconds.\n\n(Note: if this machine does not have network access, please obtain the file\n\n   %s\n\nand place it in this directory before rerunning this script.)\n---------------------------------------------------------------------------\"\"\",\n                    version, download_base, delay, url\n                ); from time import sleep; sleep(delay)\n            log.warn(\"Downloading %s\", url)\n            src = urllib2.urlopen(url)\n            # Read/write all in one block, so we don't create a corrupt file\n            # if the download is interrupted.\n            data = _validate_md5(egg_name, src.read())\n            dst = open(saveto,\"wb\"); dst.write(data)\n        finally:\n            if src: src.close()\n            if dst: dst.close()\n    return os.path.realpath(saveto)\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ndef main(argv, version=DEFAULT_VERSION):\n    \"\"\"Install or upgrade setuptools and EasyInstall\"\"\"\n    try:\n        import setuptools\n    except ImportError:\n        egg = None\n        try:\n            egg = download_setuptools(version, delay=0)\n            sys.path.insert(0,egg)\n            from setuptools.command.easy_install import main\n            return main(list(argv)+[egg])   # we're done here\n        finally:\n            if egg and os.path.exists(egg):\n                os.unlink(egg)\n    else:\n        if setuptools.__version__ == '0.0.1':\n            print >>sys.stderr, (\n            \"You have an obsolete version of setuptools installed.  Please\\n\"\n            \"remove it from your system entirely before rerunning this script.\"\n            )\n            sys.exit(2)\n\n    req = \"setuptools>=\"+version\n    import pkg_resources\n    try:\n        pkg_resources.require(req)\n    except pkg_resources.VersionConflict:\n        try:\n            from setuptools.command.easy_install import main\n        except ImportError:\n            from easy_install import main\n        main(list(argv)+[download_setuptools(delay=0)])\n        sys.exit(0) # try to force an exit\n    else:\n        if argv:\n            from setuptools.command.easy_install import main\n            main(argv)\n        else:\n            print \"Setuptools version\",version,\"or greater has been installed.\"\n            print '(Run \"ez_setup.py -U setuptools\" to reinstall or upgrade.)'\n\ndef update_md5(filenames):\n    \"\"\"Update our built-in md5 registry\"\"\"\n\n    import re\n\n    for name in filenames:\n        base = os.path.basename(name)\n        f = open(name,'rb')\n        md5_data[base] = md5(f.read()).hexdigest()\n        f.close()\n\n    data = [\"    %r: %r,\\n\" % it for it in md5_data.items()]\n    data.sort()\n    repl = \"\".join(data)\n\n    import inspect\n    srcfile = inspect.getsourcefile(sys.modules[__name__])\n    f = open(srcfile, 'rb'); src = f.read(); f.close()\n\n    match = re.search(\"\\nmd5_data = {\\n([^}]+)}\", src)\n    if not match:\n        print >>sys.stderr, \"Internal error!\"\n        sys.exit(2)\n\n    src = src[:match.start(1)] + repl + src[match.end(1):]\n    f = open(srcfile,'w')\n    f.write(src)\n    f.close()\n\n\nif __name__=='__main__':\n    if len(sys.argv)>2 and sys.argv[1]=='--md5update':\n        update_md5(sys.argv[2:])\n    else:\n        main(sys.argv[1:])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/__init__.py",
    "content": "__import__('pkg_resources').declare_namespace(__name__)\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/__init__.py",
    "content": ""
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/descriptor.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Descriptors essentially contain exactly the information found in a .proto\nfile, in types that make this information accessible in Python.\n\"\"\"\n\n__author__ = 'robinson@google.com (Will Robinson)'\n\n\nfrom google.protobuf.internal import api_implementation\n\n\nif api_implementation.Type() == 'cpp':\n  from google.protobuf.internal import cpp_message\n\n\nclass Error(Exception):\n  \"\"\"Base error for this module.\"\"\"\n\n\nclass DescriptorBase(object):\n\n  \"\"\"Descriptors base class.\n\n  This class is the base of all descriptor classes. It provides common options\n  related functionaility.\n\n  Attributes:\n    has_options:  True if the descriptor has non-default options.  Usually it\n        is not necessary to read this -- just call GetOptions() which will\n        happily return the default instance.  However, it's sometimes useful\n        for efficiency, and also useful inside the protobuf implementation to\n        avoid some bootstrapping issues.\n  \"\"\"\n\n  def __init__(self, options, options_class_name):\n    \"\"\"Initialize the descriptor given its options message and the name of the\n    class of the options message. The name of the class is required in case\n    the options message is None and has to be created.\n    \"\"\"\n    self._options = options\n    self._options_class_name = options_class_name\n\n    # Does this descriptor have non-default options?\n    self.has_options = options is not None\n\n  def GetOptions(self):\n    \"\"\"Retrieves descriptor options.\n\n    This method returns the options set or creates the default options for the\n    descriptor.\n    \"\"\"\n    if self._options:\n      return self._options\n    from google.protobuf import descriptor_pb2\n    try:\n      options_class = getattr(descriptor_pb2, self._options_class_name)\n    except AttributeError:\n      raise RuntimeError('Unknown options class name %s!' %\n                         (self._options_class_name))\n    self._options = options_class()\n    return self._options\n\n\nclass _NestedDescriptorBase(DescriptorBase):\n  \"\"\"Common class for descriptors that can be nested.\"\"\"\n\n  def __init__(self, options, options_class_name, name, full_name,\n               file, containing_type, serialized_start=None,\n               serialized_end=None):\n    \"\"\"Constructor.\n\n    Args:\n      options: Protocol message options or None\n        to use default message options.\n      options_class_name: (str) The class name of the above options.\n\n      name: (str) Name of this protocol message type.\n      full_name: (str) Fully-qualified name of this protocol message type,\n        which will include protocol \"package\" name and the name of any\n        enclosing types.\n      file: (FileDescriptor) Reference to file info.\n      containing_type: if provided, this is a nested descriptor, with this\n        descriptor as parent, otherwise None.\n      serialized_start: The start index (inclusive) in block in the\n        file.serialized_pb that describes this descriptor.\n      serialized_end: The end index (exclusive) in block in the\n        file.serialized_pb that describes this descriptor.\n    \"\"\"\n    super(_NestedDescriptorBase, self).__init__(\n        options, options_class_name)\n\n    self.name = name\n    # TODO(falk): Add function to calculate full_name instead of having it in\n    #             memory?\n    self.full_name = full_name\n    self.file = file\n    self.containing_type = containing_type\n\n    self._serialized_start = serialized_start\n    self._serialized_end = serialized_end\n\n  def GetTopLevelContainingType(self):\n    \"\"\"Returns the root if this is a nested type, or itself if its the root.\"\"\"\n    desc = self\n    while desc.containing_type is not None:\n      desc = desc.containing_type\n    return desc\n\n  def CopyToProto(self, proto):\n    \"\"\"Copies this to the matching proto in descriptor_pb2.\n\n    Args:\n      proto: An empty proto instance from descriptor_pb2.\n\n    Raises:\n      Error: If self couldnt be serialized, due to to few constructor arguments.\n    \"\"\"\n    if (self.file is not None and\n        self._serialized_start is not None and\n        self._serialized_end is not None):\n      proto.ParseFromString(self.file.serialized_pb[\n          self._serialized_start:self._serialized_end])\n    else:\n      raise Error('Descriptor does not contain serialization.')\n\n\nclass Descriptor(_NestedDescriptorBase):\n\n  \"\"\"Descriptor for a protocol message type.\n\n  A Descriptor instance has the following attributes:\n\n    name: (str) Name of this protocol message type.\n    full_name: (str) Fully-qualified name of this protocol message type,\n      which will include protocol \"package\" name and the name of any\n      enclosing types.\n\n    containing_type: (Descriptor) Reference to the descriptor of the\n      type containing us, or None if this is top-level.\n\n    fields: (list of FieldDescriptors) Field descriptors for all\n      fields in this type.\n    fields_by_number: (dict int -> FieldDescriptor) Same FieldDescriptor\n      objects as in |fields|, but indexed by \"number\" attribute in each\n      FieldDescriptor.\n    fields_by_name: (dict str -> FieldDescriptor) Same FieldDescriptor\n      objects as in |fields|, but indexed by \"name\" attribute in each\n      FieldDescriptor.\n\n    nested_types: (list of Descriptors) Descriptor references\n      for all protocol message types nested within this one.\n    nested_types_by_name: (dict str -> Descriptor) Same Descriptor\n      objects as in |nested_types|, but indexed by \"name\" attribute\n      in each Descriptor.\n\n    enum_types: (list of EnumDescriptors) EnumDescriptor references\n      for all enums contained within this type.\n    enum_types_by_name: (dict str ->EnumDescriptor) Same EnumDescriptor\n      objects as in |enum_types|, but indexed by \"name\" attribute\n      in each EnumDescriptor.\n    enum_values_by_name: (dict str -> EnumValueDescriptor) Dict mapping\n      from enum value name to EnumValueDescriptor for that value.\n\n    extensions: (list of FieldDescriptor) All extensions defined directly\n      within this message type (NOT within a nested type).\n    extensions_by_name: (dict, string -> FieldDescriptor) Same FieldDescriptor\n      objects as |extensions|, but indexed by \"name\" attribute of each\n      FieldDescriptor.\n\n    is_extendable:  Does this type define any extension ranges?\n\n    options: (descriptor_pb2.MessageOptions) Protocol message options or None\n      to use default message options.\n\n    file: (FileDescriptor) Reference to file descriptor.\n  \"\"\"\n\n  def __init__(self, name, full_name, filename, containing_type, fields,\n               nested_types, enum_types, extensions, options=None,\n               is_extendable=True, extension_ranges=None, file=None,\n               serialized_start=None, serialized_end=None):\n    \"\"\"Arguments to __init__() are as described in the description\n    of Descriptor fields above.\n\n    Note that filename is an obsolete argument, that is not used anymore.\n    Please use file.name to access this as an attribute.\n    \"\"\"\n    super(Descriptor, self).__init__(\n        options, 'MessageOptions', name, full_name, file,\n        containing_type, serialized_start=serialized_start,\n        serialized_end=serialized_start)\n\n    # We have fields in addition to fields_by_name and fields_by_number,\n    # so that:\n    #   1. Clients can index fields by \"order in which they're listed.\"\n    #   2. Clients can easily iterate over all fields with the terse\n    #      syntax: for f in descriptor.fields: ...\n    self.fields = fields\n    for field in self.fields:\n      field.containing_type = self\n    self.fields_by_number = dict((f.number, f) for f in fields)\n    self.fields_by_name = dict((f.name, f) for f in fields)\n\n    self.nested_types = nested_types\n    self.nested_types_by_name = dict((t.name, t) for t in nested_types)\n\n    self.enum_types = enum_types\n    for enum_type in self.enum_types:\n      enum_type.containing_type = self\n    self.enum_types_by_name = dict((t.name, t) for t in enum_types)\n    self.enum_values_by_name = dict(\n        (v.name, v) for t in enum_types for v in t.values)\n\n    self.extensions = extensions\n    for extension in self.extensions:\n      extension.extension_scope = self\n    self.extensions_by_name = dict((f.name, f) for f in extensions)\n    self.is_extendable = is_extendable\n    self.extension_ranges = extension_ranges\n\n    self._serialized_start = serialized_start\n    self._serialized_end = serialized_end\n\n  def CopyToProto(self, proto):\n    \"\"\"Copies this to a descriptor_pb2.DescriptorProto.\n\n    Args:\n      proto: An empty descriptor_pb2.DescriptorProto.\n    \"\"\"\n    # This function is overriden to give a better doc comment.\n    super(Descriptor, self).CopyToProto(proto)\n\n\n# TODO(robinson): We should have aggressive checking here,\n# for example:\n#   * If you specify a repeated field, you should not be allowed\n#     to specify a default value.\n#   * [Other examples here as needed].\n#\n# TODO(robinson): for this and other *Descriptor classes, we\n# might also want to lock things down aggressively (e.g.,\n# prevent clients from setting the attributes).  Having\n# stronger invariants here in general will reduce the number\n# of runtime checks we must do in reflection.py...\nclass FieldDescriptor(DescriptorBase):\n\n  \"\"\"Descriptor for a single field in a .proto file.\n\n  A FieldDescriptor instance has the following attriubtes:\n\n    name: (str) Name of this field, exactly as it appears in .proto.\n    full_name: (str) Name of this field, including containing scope.  This is\n      particularly relevant for extensions.\n    index: (int) Dense, 0-indexed index giving the order that this\n      field textually appears within its message in the .proto file.\n    number: (int) Tag number declared for this field in the .proto file.\n\n    type: (One of the TYPE_* constants below) Declared type.\n    cpp_type: (One of the CPPTYPE_* constants below) C++ type used to\n      represent this field.\n\n    label: (One of the LABEL_* constants below) Tells whether this\n      field is optional, required, or repeated.\n    has_default_value: (bool) True if this field has a default value defined,\n      otherwise false.\n    default_value: (Varies) Default value of this field.  Only\n      meaningful for non-repeated scalar fields.  Repeated fields\n      should always set this to [], and non-repeated composite\n      fields should always set this to None.\n\n    containing_type: (Descriptor) Descriptor of the protocol message\n      type that contains this field.  Set by the Descriptor constructor\n      if we're passed into one.\n      Somewhat confusingly, for extension fields, this is the\n      descriptor of the EXTENDED message, not the descriptor\n      of the message containing this field.  (See is_extension and\n      extension_scope below).\n    message_type: (Descriptor) If a composite field, a descriptor\n      of the message type contained in this field.  Otherwise, this is None.\n    enum_type: (EnumDescriptor) If this field contains an enum, a\n      descriptor of that enum.  Otherwise, this is None.\n\n    is_extension: True iff this describes an extension field.\n    extension_scope: (Descriptor) Only meaningful if is_extension is True.\n      Gives the message that immediately contains this extension field.\n      Will be None iff we're a top-level (file-level) extension field.\n\n    options: (descriptor_pb2.FieldOptions) Protocol message field options or\n      None to use default field options.\n  \"\"\"\n\n  # Must be consistent with C++ FieldDescriptor::Type enum in\n  # descriptor.h.\n  #\n  # TODO(robinson): Find a way to eliminate this repetition.\n  TYPE_DOUBLE         = 1\n  TYPE_FLOAT          = 2\n  TYPE_INT64          = 3\n  TYPE_UINT64         = 4\n  TYPE_INT32          = 5\n  TYPE_FIXED64        = 6\n  TYPE_FIXED32        = 7\n  TYPE_BOOL           = 8\n  TYPE_STRING         = 9\n  TYPE_GROUP          = 10\n  TYPE_MESSAGE        = 11\n  TYPE_BYTES          = 12\n  TYPE_UINT32         = 13\n  TYPE_ENUM           = 14\n  TYPE_SFIXED32       = 15\n  TYPE_SFIXED64       = 16\n  TYPE_SINT32         = 17\n  TYPE_SINT64         = 18\n  MAX_TYPE            = 18\n\n  # Must be consistent with C++ FieldDescriptor::CppType enum in\n  # descriptor.h.\n  #\n  # TODO(robinson): Find a way to eliminate this repetition.\n  CPPTYPE_INT32       = 1\n  CPPTYPE_INT64       = 2\n  CPPTYPE_UINT32      = 3\n  CPPTYPE_UINT64      = 4\n  CPPTYPE_DOUBLE      = 5\n  CPPTYPE_FLOAT       = 6\n  CPPTYPE_BOOL        = 7\n  CPPTYPE_ENUM        = 8\n  CPPTYPE_STRING      = 9\n  CPPTYPE_MESSAGE     = 10\n  MAX_CPPTYPE         = 10\n\n  # Must be consistent with C++ FieldDescriptor::Label enum in\n  # descriptor.h.\n  #\n  # TODO(robinson): Find a way to eliminate this repetition.\n  LABEL_OPTIONAL      = 1\n  LABEL_REQUIRED      = 2\n  LABEL_REPEATED      = 3\n  MAX_LABEL           = 3\n\n  def __init__(self, name, full_name, index, number, type, cpp_type, label,\n               default_value, message_type, enum_type, containing_type,\n               is_extension, extension_scope, options=None,\n               has_default_value=True):\n    \"\"\"The arguments are as described in the description of FieldDescriptor\n    attributes above.\n\n    Note that containing_type may be None, and may be set later if necessary\n    (to deal with circular references between message types, for example).\n    Likewise for extension_scope.\n    \"\"\"\n    super(FieldDescriptor, self).__init__(options, 'FieldOptions')\n    self.name = name\n    self.full_name = full_name\n    self.index = index\n    self.number = number\n    self.type = type\n    self.cpp_type = cpp_type\n    self.label = label\n    self.has_default_value = has_default_value\n    self.default_value = default_value\n    self.containing_type = containing_type\n    self.message_type = message_type\n    self.enum_type = enum_type\n    self.is_extension = is_extension\n    self.extension_scope = extension_scope\n    if api_implementation.Type() == 'cpp':\n      if is_extension:\n        self._cdescriptor = cpp_message.GetExtensionDescriptor(full_name)\n      else:\n        self._cdescriptor = cpp_message.GetFieldDescriptor(full_name)\n    else:\n      self._cdescriptor = None\n\n\nclass EnumDescriptor(_NestedDescriptorBase):\n\n  \"\"\"Descriptor for an enum defined in a .proto file.\n\n  An EnumDescriptor instance has the following attributes:\n\n    name: (str) Name of the enum type.\n    full_name: (str) Full name of the type, including package name\n      and any enclosing type(s).\n\n    values: (list of EnumValueDescriptors) List of the values\n      in this enum.\n    values_by_name: (dict str -> EnumValueDescriptor) Same as |values|,\n      but indexed by the \"name\" field of each EnumValueDescriptor.\n    values_by_number: (dict int -> EnumValueDescriptor) Same as |values|,\n      but indexed by the \"number\" field of each EnumValueDescriptor.\n    containing_type: (Descriptor) Descriptor of the immediate containing\n      type of this enum, or None if this is an enum defined at the\n      top level in a .proto file.  Set by Descriptor's constructor\n      if we're passed into one.\n    file: (FileDescriptor) Reference to file descriptor.\n    options: (descriptor_pb2.EnumOptions) Enum options message or\n      None to use default enum options.\n  \"\"\"\n\n  def __init__(self, name, full_name, filename, values,\n               containing_type=None, options=None, file=None,\n               serialized_start=None, serialized_end=None):\n    \"\"\"Arguments are as described in the attribute description above.\n\n    Note that filename is an obsolete argument, that is not used anymore.\n    Please use file.name to access this as an attribute.\n    \"\"\"\n    super(EnumDescriptor, self).__init__(\n        options, 'EnumOptions', name, full_name, file,\n        containing_type, serialized_start=serialized_start,\n        serialized_end=serialized_start)\n\n    self.values = values\n    for value in self.values:\n      value.type = self\n    self.values_by_name = dict((v.name, v) for v in values)\n    self.values_by_number = dict((v.number, v) for v in values)\n\n    self._serialized_start = serialized_start\n    self._serialized_end = serialized_end\n\n  def CopyToProto(self, proto):\n    \"\"\"Copies this to a descriptor_pb2.EnumDescriptorProto.\n\n    Args:\n      proto: An empty descriptor_pb2.EnumDescriptorProto.\n    \"\"\"\n    # This function is overriden to give a better doc comment.\n    super(EnumDescriptor, self).CopyToProto(proto)\n\n\nclass EnumValueDescriptor(DescriptorBase):\n\n  \"\"\"Descriptor for a single value within an enum.\n\n    name: (str) Name of this value.\n    index: (int) Dense, 0-indexed index giving the order that this\n      value appears textually within its enum in the .proto file.\n    number: (int) Actual number assigned to this enum value.\n    type: (EnumDescriptor) EnumDescriptor to which this value\n      belongs.  Set by EnumDescriptor's constructor if we're\n      passed into one.\n    options: (descriptor_pb2.EnumValueOptions) Enum value options message or\n      None to use default enum value options options.\n  \"\"\"\n\n  def __init__(self, name, index, number, type=None, options=None):\n    \"\"\"Arguments are as described in the attribute description above.\"\"\"\n    super(EnumValueDescriptor, self).__init__(options, 'EnumValueOptions')\n    self.name = name\n    self.index = index\n    self.number = number\n    self.type = type\n\n\nclass ServiceDescriptor(_NestedDescriptorBase):\n\n  \"\"\"Descriptor for a service.\n\n    name: (str) Name of the service.\n    full_name: (str) Full name of the service, including package name.\n    index: (int) 0-indexed index giving the order that this services\n      definition appears withing the .proto file.\n    methods: (list of MethodDescriptor) List of methods provided by this\n      service.\n    options: (descriptor_pb2.ServiceOptions) Service options message or\n      None to use default service options.\n    file: (FileDescriptor) Reference to file info.\n  \"\"\"\n\n  def __init__(self, name, full_name, index, methods, options=None, file=None,\n               serialized_start=None, serialized_end=None):\n    super(ServiceDescriptor, self).__init__(\n        options, 'ServiceOptions', name, full_name, file,\n        None, serialized_start=serialized_start,\n        serialized_end=serialized_end)\n    self.index = index\n    self.methods = methods\n    # Set the containing service for each method in this service.\n    for method in self.methods:\n      method.containing_service = self\n\n  def FindMethodByName(self, name):\n    \"\"\"Searches for the specified method, and returns its descriptor.\"\"\"\n    for method in self.methods:\n      if name == method.name:\n        return method\n    return None\n\n  def CopyToProto(self, proto):\n    \"\"\"Copies this to a descriptor_pb2.ServiceDescriptorProto.\n\n    Args:\n      proto: An empty descriptor_pb2.ServiceDescriptorProto.\n    \"\"\"\n    # This function is overriden to give a better doc comment.\n    super(ServiceDescriptor, self).CopyToProto(proto)\n\n\nclass MethodDescriptor(DescriptorBase):\n\n  \"\"\"Descriptor for a method in a service.\n\n  name: (str) Name of the method within the service.\n  full_name: (str) Full name of method.\n  index: (int) 0-indexed index of the method inside the service.\n  containing_service: (ServiceDescriptor) The service that contains this\n    method.\n  input_type: The descriptor of the message that this method accepts.\n  output_type: The descriptor of the message that this method returns.\n  options: (descriptor_pb2.MethodOptions) Method options message or\n    None to use default method options.\n  \"\"\"\n\n  def __init__(self, name, full_name, index, containing_service,\n               input_type, output_type, options=None):\n    \"\"\"The arguments are as described in the description of MethodDescriptor\n    attributes above.\n\n    Note that containing_service may be None, and may be set later if necessary.\n    \"\"\"\n    super(MethodDescriptor, self).__init__(options, 'MethodOptions')\n    self.name = name\n    self.full_name = full_name\n    self.index = index\n    self.containing_service = containing_service\n    self.input_type = input_type\n    self.output_type = output_type\n\n\nclass FileDescriptor(DescriptorBase):\n  \"\"\"Descriptor for a file. Mimics the descriptor_pb2.FileDescriptorProto.\n\n  name: name of file, relative to root of source tree.\n  package: name of the package\n  serialized_pb: (str) Byte string of serialized\n    descriptor_pb2.FileDescriptorProto.\n  \"\"\"\n\n  def __init__(self, name, package, options=None, serialized_pb=None):\n    \"\"\"Constructor.\"\"\"\n    super(FileDescriptor, self).__init__(options, 'FileOptions')\n\n    self.message_types_by_name = {}\n    self.name = name\n    self.package = package\n    self.serialized_pb = serialized_pb\n    if (api_implementation.Type() == 'cpp' and\n        self.serialized_pb is not None):\n      cpp_message.BuildFile(self.serialized_pb)\n\n  def CopyToProto(self, proto):\n    \"\"\"Copies this to a descriptor_pb2.FileDescriptorProto.\n\n    Args:\n      proto: An empty descriptor_pb2.FileDescriptorProto.\n    \"\"\"\n    proto.ParseFromString(self.serialized_pb)\n\n\ndef _ParseOptions(message, string):\n  \"\"\"Parses serialized options.\n\n  This helper function is used to parse serialized options in generated\n  proto2 files. It must not be used outside proto2.\n  \"\"\"\n  message.ParseFromString(string)\n  return message\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/__init__.py",
    "content": ""
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/api_implementation.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"\nThis module is the central entity that determines which implementation of the\nAPI is used.\n\"\"\"\n\n__author__ = 'petar@google.com (Petar Petrov)'\n\nimport os\n# This environment variable can be used to switch to a certain implementation\n# of the Python API. Right now only 'python' and 'cpp' are valid values. Any\n# other value will be ignored.\n_implementation_type = os.getenv('PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION',\n                                 'python')\n\n\nif _implementation_type != 'python':\n  # For now, by default use the pure-Python implementation.\n  # The code below checks if the C extension is available and\n  # uses it if it is available.\n  _implementation_type = 'cpp'\n  ## Determine automatically which implementation to use.\n  #try:\n  #  from google.protobuf.internal import cpp_message\n  #  _implementation_type = 'cpp'\n  #except ImportError, e:\n  #  _implementation_type = 'python'\n\n\n# Usage of this function is discouraged. Clients shouldn't care which\n# implementation of the API is in use. Note that there is no guarantee\n# that differences between APIs will be maintained.\n# Please don't use this function if possible.\ndef Type():\n  return _implementation_type\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/containers.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Contains container classes to represent different protocol buffer types.\n\nThis file defines container classes which represent categories of protocol\nbuffer field types which need extra maintenance. Currently these categories\nare:\n  - Repeated scalar fields - These are all repeated fields which aren't\n    composite (e.g. they are of simple types like int32, string, etc).\n  - Repeated composite fields - Repeated fields which are composite. This\n    includes groups and nested messages.\n\"\"\"\n\n__author__ = 'petar@google.com (Petar Petrov)'\n\n\nclass BaseContainer(object):\n\n  \"\"\"Base container class.\"\"\"\n\n  # Minimizes memory usage and disallows assignment to other attributes.\n  __slots__ = ['_message_listener', '_values']\n\n  def __init__(self, message_listener):\n    \"\"\"\n    Args:\n      message_listener: A MessageListener implementation.\n        The RepeatedScalarFieldContainer will call this object's\n        Modified() method when it is modified.\n    \"\"\"\n    self._message_listener = message_listener\n    self._values = []\n\n  def __getitem__(self, key):\n    \"\"\"Retrieves item by the specified key.\"\"\"\n    return self._values[key]\n\n  def __len__(self):\n    \"\"\"Returns the number of elements in the container.\"\"\"\n    return len(self._values)\n\n  def __ne__(self, other):\n    \"\"\"Checks if another instance isn't equal to this one.\"\"\"\n    # The concrete classes should define __eq__.\n    return not self == other\n\n  def __hash__(self):\n    raise TypeError('unhashable object')\n\n  def __repr__(self):\n    return repr(self._values)\n\n  def sort(self, sort_function=cmp):\n    self._values.sort(sort_function)\n\n\nclass RepeatedScalarFieldContainer(BaseContainer):\n\n  \"\"\"Simple, type-checked, list-like container for holding repeated scalars.\"\"\"\n\n  # Disallows assignment to other attributes.\n  __slots__ = ['_type_checker']\n\n  def __init__(self, message_listener, type_checker):\n    \"\"\"\n    Args:\n      message_listener: A MessageListener implementation.\n        The RepeatedScalarFieldContainer will call this object's\n        Modified() method when it is modified.\n      type_checker: A type_checkers.ValueChecker instance to run on elements\n        inserted into this container.\n    \"\"\"\n    super(RepeatedScalarFieldContainer, self).__init__(message_listener)\n    self._type_checker = type_checker\n\n  def append(self, value):\n    \"\"\"Appends an item to the list. Similar to list.append().\"\"\"\n    self._type_checker.CheckValue(value)\n    self._values.append(value)\n    if not self._message_listener.dirty:\n      self._message_listener.Modified()\n\n  def insert(self, key, value):\n    \"\"\"Inserts the item at the specified position. Similar to list.insert().\"\"\"\n    self._type_checker.CheckValue(value)\n    self._values.insert(key, value)\n    if not self._message_listener.dirty:\n      self._message_listener.Modified()\n\n  def extend(self, elem_seq):\n    \"\"\"Extends by appending the given sequence. Similar to list.extend().\"\"\"\n    if not elem_seq:\n      return\n\n    new_values = []\n    for elem in elem_seq:\n      self._type_checker.CheckValue(elem)\n      new_values.append(elem)\n    self._values.extend(new_values)\n    self._message_listener.Modified()\n\n  def MergeFrom(self, other):\n    \"\"\"Appends the contents of another repeated field of the same type to this\n    one. We do not check the types of the individual fields.\n    \"\"\"\n    self._values.extend(other._values)\n    self._message_listener.Modified()\n\n  def remove(self, elem):\n    \"\"\"Removes an item from the list. Similar to list.remove().\"\"\"\n    self._values.remove(elem)\n    self._message_listener.Modified()\n\n  def __setitem__(self, key, value):\n    \"\"\"Sets the item on the specified position.\"\"\"\n    self._type_checker.CheckValue(value)\n    self._values[key] = value\n    self._message_listener.Modified()\n\n  def __getslice__(self, start, stop):\n    \"\"\"Retrieves the subset of items from between the specified indices.\"\"\"\n    return self._values[start:stop]\n\n  def __setslice__(self, start, stop, values):\n    \"\"\"Sets the subset of items from between the specified indices.\"\"\"\n    new_values = []\n    for value in values:\n      self._type_checker.CheckValue(value)\n      new_values.append(value)\n    self._values[start:stop] = new_values\n    self._message_listener.Modified()\n\n  def __delitem__(self, key):\n    \"\"\"Deletes the item at the specified position.\"\"\"\n    del self._values[key]\n    self._message_listener.Modified()\n\n  def __delslice__(self, start, stop):\n    \"\"\"Deletes the subset of items from between the specified indices.\"\"\"\n    del self._values[start:stop]\n    self._message_listener.Modified()\n\n  def __eq__(self, other):\n    \"\"\"Compares the current instance with another one.\"\"\"\n    if self is other:\n      return True\n    # Special case for the same type which should be common and fast.\n    if isinstance(other, self.__class__):\n      return other._values == self._values\n    # We are presumably comparing against some other sequence type.\n    return other == self._values\n\n\nclass RepeatedCompositeFieldContainer(BaseContainer):\n\n  \"\"\"Simple, list-like container for holding repeated composite fields.\"\"\"\n\n  # Disallows assignment to other attributes.\n  __slots__ = ['_message_descriptor']\n\n  def __init__(self, message_listener, message_descriptor):\n    \"\"\"\n    Note that we pass in a descriptor instead of the generated directly,\n    since at the time we construct a _RepeatedCompositeFieldContainer we\n    haven't yet necessarily initialized the type that will be contained in the\n    container.\n\n    Args:\n      message_listener: A MessageListener implementation.\n        The RepeatedCompositeFieldContainer will call this object's\n        Modified() method when it is modified.\n      message_descriptor: A Descriptor instance describing the protocol type\n        that should be present in this container.  We'll use the\n        _concrete_class field of this descriptor when the client calls add().\n    \"\"\"\n    super(RepeatedCompositeFieldContainer, self).__init__(message_listener)\n    self._message_descriptor = message_descriptor\n\n  def add(self, **kwargs):\n    \"\"\"Adds a new element at the end of the list and returns it. Keyword\n    arguments may be used to initialize the element.\n    \"\"\"\n    new_element = self._message_descriptor._concrete_class(**kwargs)\n    new_element._SetListener(self._message_listener)\n    self._values.append(new_element)\n    if not self._message_listener.dirty:\n      self._message_listener.Modified()\n    return new_element\n\n  def extend(self, elem_seq):\n    \"\"\"Extends by appending the given sequence of elements of the same type\n    as this one, copying each individual message.\n    \"\"\"\n    message_class = self._message_descriptor._concrete_class\n    listener = self._message_listener\n    values = self._values\n    for message in elem_seq:\n      new_element = message_class()\n      new_element._SetListener(listener)\n      new_element.MergeFrom(message)\n      values.append(new_element)\n    listener.Modified()\n\n  def MergeFrom(self, other):\n    \"\"\"Appends the contents of another repeated field of the same type to this\n    one, copying each individual message.\n    \"\"\"\n    self.extend(other._values)\n\n  def __getslice__(self, start, stop):\n    \"\"\"Retrieves the subset of items from between the specified indices.\"\"\"\n    return self._values[start:stop]\n\n  def __delitem__(self, key):\n    \"\"\"Deletes the item at the specified position.\"\"\"\n    del self._values[key]\n    self._message_listener.Modified()\n\n  def __delslice__(self, start, stop):\n    \"\"\"Deletes the subset of items from between the specified indices.\"\"\"\n    del self._values[start:stop]\n    self._message_listener.Modified()\n\n  def __eq__(self, other):\n    \"\"\"Compares the current instance with another one.\"\"\"\n    if self is other:\n      return True\n    if not isinstance(other, self.__class__):\n      raise TypeError('Can only compare repeated composite fields against '\n                      'other repeated composite fields.')\n    return self._values == other._values\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/cpp_message.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Contains helper functions used to create protocol message classes from\nDescriptor objects at runtime backed by the protocol buffer C++ API.\n\"\"\"\n\n__author__ = 'petar@google.com (Petar Petrov)'\n\nimport operator\nfrom google.protobuf.internal import _net_proto2___python\nfrom google.protobuf import message\n\n\n_LABEL_REPEATED = _net_proto2___python.LABEL_REPEATED\n_LABEL_OPTIONAL = _net_proto2___python.LABEL_OPTIONAL\n_CPPTYPE_MESSAGE = _net_proto2___python.CPPTYPE_MESSAGE\n_TYPE_MESSAGE = _net_proto2___python.TYPE_MESSAGE\n\n\ndef GetDescriptorPool():\n  \"\"\"Creates a new DescriptorPool C++ object.\"\"\"\n  return _net_proto2___python.NewCDescriptorPool()\n\n\n_pool = GetDescriptorPool()\n\n\ndef GetFieldDescriptor(full_field_name):\n  \"\"\"Searches for a field descriptor given a full field name.\"\"\"\n  return _pool.FindFieldByName(full_field_name)\n\n\ndef BuildFile(content):\n  \"\"\"Registers a new proto file in the underlying C++ descriptor pool.\"\"\"\n  _net_proto2___python.BuildFile(content)\n\n\ndef GetExtensionDescriptor(full_extension_name):\n  \"\"\"Searches for extension descriptor given a full field name.\"\"\"\n  return _pool.FindExtensionByName(full_extension_name)\n\n\ndef NewCMessage(full_message_name):\n  \"\"\"Creates a new C++ protocol message by its name.\"\"\"\n  return _net_proto2___python.NewCMessage(full_message_name)\n\n\ndef ScalarProperty(cdescriptor):\n  \"\"\"Returns a scalar property for the given descriptor.\"\"\"\n\n  def Getter(self):\n    return self._cmsg.GetScalar(cdescriptor)\n\n  def Setter(self, value):\n    self._cmsg.SetScalar(cdescriptor, value)\n\n  return property(Getter, Setter)\n\n\ndef CompositeProperty(cdescriptor, message_type):\n  \"\"\"Returns a Python property the given composite field.\"\"\"\n\n  def Getter(self):\n    sub_message = self._composite_fields.get(cdescriptor.name, None)\n    if sub_message is None:\n      cmessage = self._cmsg.NewSubMessage(cdescriptor)\n      sub_message = message_type._concrete_class(__cmessage=cmessage)\n      self._composite_fields[cdescriptor.name] = sub_message\n    return sub_message\n\n  return property(Getter)\n\n\nclass RepeatedScalarContainer(object):\n  \"\"\"Container for repeated scalar fields.\"\"\"\n\n  __slots__ = ['_message', '_cfield_descriptor', '_cmsg']\n\n  def __init__(self, msg, cfield_descriptor):\n    self._message = msg\n    self._cmsg = msg._cmsg\n    self._cfield_descriptor = cfield_descriptor\n\n  def append(self, value):\n    self._cmsg.AddRepeatedScalar(\n        self._cfield_descriptor, value)\n\n  def extend(self, sequence):\n    for element in sequence:\n      self.append(element)\n\n  def insert(self, key, value):\n    values = self[slice(None, None, None)]\n    values.insert(key, value)\n    self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values)\n\n  def remove(self, value):\n    values = self[slice(None, None, None)]\n    values.remove(value)\n    self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values)\n\n  def __setitem__(self, key, value):\n    values = self[slice(None, None, None)]\n    values[key] = value\n    self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values)\n\n  def __getitem__(self, key):\n    return self._cmsg.GetRepeatedScalar(self._cfield_descriptor, key)\n\n  def __delitem__(self, key):\n    self._cmsg.DeleteRepeatedField(self._cfield_descriptor, key)\n\n  def __len__(self):\n    return len(self[slice(None, None, None)])\n\n  def __eq__(self, other):\n    if self is other:\n      return True\n    if not operator.isSequenceType(other):\n      raise TypeError(\n          'Can only compare repeated scalar fields against sequences.')\n    # We are presumably comparing against some other sequence type.\n    return other == self[slice(None, None, None)]\n\n  def __ne__(self, other):\n    return not self == other\n\n  def __hash__(self):\n    raise TypeError('unhashable object')\n\n  def sort(self, sort_function=cmp):\n    values = self[slice(None, None, None)]\n    values.sort(sort_function)\n    self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values)\n\n\ndef RepeatedScalarProperty(cdescriptor):\n  \"\"\"Returns a Python property the given repeated scalar field.\"\"\"\n\n  def Getter(self):\n    container = self._composite_fields.get(cdescriptor.name, None)\n    if container is None:\n      container = RepeatedScalarContainer(self, cdescriptor)\n      self._composite_fields[cdescriptor.name] = container\n    return container\n\n  def Setter(self, new_value):\n    raise AttributeError('Assignment not allowed to repeated field '\n                         '\"%s\" in protocol message object.' % cdescriptor.name)\n\n  doc = 'Magic attribute generated for \"%s\" proto field.' % cdescriptor.name\n  return property(Getter, Setter, doc=doc)\n\n\nclass RepeatedCompositeContainer(object):\n  \"\"\"Container for repeated composite fields.\"\"\"\n\n  __slots__ = ['_message', '_subclass', '_cfield_descriptor', '_cmsg']\n\n  def __init__(self, msg, cfield_descriptor, subclass):\n    self._message = msg\n    self._cmsg = msg._cmsg\n    self._subclass = subclass\n    self._cfield_descriptor = cfield_descriptor\n\n  def add(self, **kwargs):\n    cmessage = self._cmsg.AddMessage(self._cfield_descriptor)\n    return self._subclass(__cmessage=cmessage, __owner=self._message, **kwargs)\n\n  def extend(self, elem_seq):\n    \"\"\"Extends by appending the given sequence of elements of the same type\n    as this one, copying each individual message.\n    \"\"\"\n    for message in elem_seq:\n      self.add().MergeFrom(message)\n\n  def MergeFrom(self, other):\n    for message in other[:]:\n      self.add().MergeFrom(message)\n\n  def __getitem__(self, key):\n    cmessages = self._cmsg.GetRepeatedMessage(\n        self._cfield_descriptor, key)\n    subclass = self._subclass\n    if not isinstance(cmessages, list):\n      return subclass(__cmessage=cmessages, __owner=self._message)\n\n    return [subclass(__cmessage=m, __owner=self._message) for m in cmessages]\n\n  def __delitem__(self, key):\n    self._cmsg.DeleteRepeatedField(\n        self._cfield_descriptor, key)\n\n  def __len__(self):\n    return self._cmsg.FieldLength(self._cfield_descriptor)\n\n  def __eq__(self, other):\n    \"\"\"Compares the current instance with another one.\"\"\"\n    if self is other:\n      return True\n    if not isinstance(other, self.__class__):\n      raise TypeError('Can only compare repeated composite fields against '\n                      'other repeated composite fields.')\n    messages = self[slice(None, None, None)]\n    other_messages = other[slice(None, None, None)]\n    return messages == other_messages\n\n  def __hash__(self):\n    raise TypeError('unhashable object')\n\n  def sort(self, sort_function=cmp):\n    messages = []\n    for index in range(len(self)):\n      # messages[i][0] is where the i-th element of the new array has to come\n      # from.\n      # messages[i][1] is where the i-th element of the old array has to go.\n      messages.append([index, 0, self[index]])\n    messages.sort(lambda x,y: sort_function(x[2], y[2]))\n\n    # Remember which position each elements has to move to.\n    for i in range(len(messages)):\n      messages[messages[i][0]][1] = i\n\n    # Apply the transposition.\n    for i in range(len(messages)):\n      from_position = messages[i][0]\n      if i == from_position:\n        continue\n      self._cmsg.SwapRepeatedFieldElements(\n          self._cfield_descriptor, i, from_position)\n      messages[messages[i][1]][0] = from_position\n\n\ndef RepeatedCompositeProperty(cdescriptor, message_type):\n  \"\"\"Returns a Python property for the given repeated composite field.\"\"\"\n\n  def Getter(self):\n    container = self._composite_fields.get(cdescriptor.name, None)\n    if container is None:\n      container = RepeatedCompositeContainer(\n          self, cdescriptor, message_type._concrete_class)\n      self._composite_fields[cdescriptor.name] = container\n    return container\n\n  def Setter(self, new_value):\n    raise AttributeError('Assignment not allowed to repeated field '\n                         '\"%s\" in protocol message object.' % cdescriptor.name)\n\n  doc = 'Magic attribute generated for \"%s\" proto field.' % cdescriptor.name\n  return property(Getter, Setter, doc=doc)\n\n\nclass ExtensionDict(object):\n  \"\"\"Extension dictionary added to each protocol message.\"\"\"\n\n  def __init__(self, msg):\n    self._message = msg\n    self._cmsg = msg._cmsg\n    self._values = {}\n\n  def __setitem__(self, extension, value):\n    from google.protobuf import descriptor\n    if not isinstance(extension, descriptor.FieldDescriptor):\n      raise KeyError('Bad extension %r.' % (extension,))\n    cdescriptor = extension._cdescriptor\n    if (cdescriptor.label != _LABEL_OPTIONAL or\n        cdescriptor.cpp_type == _CPPTYPE_MESSAGE):\n      raise TypeError('Extension %r is repeated and/or a composite type.' % (\n          extension.full_name,))\n    self._cmsg.SetScalar(cdescriptor, value)\n    self._values[extension] = value\n\n  def __getitem__(self, extension):\n    from google.protobuf import descriptor\n    if not isinstance(extension, descriptor.FieldDescriptor):\n      raise KeyError('Bad extension %r.' % (extension,))\n\n    cdescriptor = extension._cdescriptor\n    if (cdescriptor.label != _LABEL_REPEATED and\n        cdescriptor.cpp_type != _CPPTYPE_MESSAGE):\n      return self._cmsg.GetScalar(cdescriptor)\n\n    ext = self._values.get(extension, None)\n    if ext is not None:\n      return ext\n\n    ext = self._CreateNewHandle(extension)\n    self._values[extension] = ext\n    return ext\n\n  def ClearExtension(self, extension):\n    from google.protobuf import descriptor\n    if not isinstance(extension, descriptor.FieldDescriptor):\n      raise KeyError('Bad extension %r.' % (extension,))\n    self._cmsg.ClearFieldByDescriptor(extension._cdescriptor)\n    if extension in self._values:\n      del self._values[extension]\n\n  def HasExtension(self, extension):\n    from google.protobuf import descriptor\n    if not isinstance(extension, descriptor.FieldDescriptor):\n      raise KeyError('Bad extension %r.' % (extension,))\n    return self._cmsg.HasFieldByDescriptor(extension._cdescriptor)\n\n  def _FindExtensionByName(self, name):\n    \"\"\"Tries to find a known extension with the specified name.\n\n    Args:\n      name: Extension full name.\n\n    Returns:\n      Extension field descriptor.\n    \"\"\"\n    return self._message._extensions_by_name.get(name, None)\n\n  def _CreateNewHandle(self, extension):\n    cdescriptor = extension._cdescriptor\n    if (cdescriptor.label != _LABEL_REPEATED and\n        cdescriptor.cpp_type == _CPPTYPE_MESSAGE):\n      cmessage = self._cmsg.NewSubMessage(cdescriptor)\n      return extension.message_type._concrete_class(__cmessage=cmessage)\n\n    if cdescriptor.label == _LABEL_REPEATED:\n      if cdescriptor.cpp_type == _CPPTYPE_MESSAGE:\n        return RepeatedCompositeContainer(\n            self._message, cdescriptor, extension.message_type._concrete_class)\n      else:\n        return RepeatedScalarContainer(self._message, cdescriptor)\n    # This shouldn't happen!\n    assert False\n    return None\n\n\ndef NewMessage(message_descriptor, dictionary):\n  \"\"\"Creates a new protocol message *class*.\"\"\"\n  _AddClassAttributesForNestedExtensions(message_descriptor, dictionary)\n  _AddEnumValues(message_descriptor, dictionary)\n  _AddDescriptors(message_descriptor, dictionary)\n\n\ndef InitMessage(message_descriptor, cls):\n  \"\"\"Constructs a new message instance (called before instance's __init__).\"\"\"\n  cls._extensions_by_name = {}\n  _AddInitMethod(message_descriptor, cls)\n  _AddMessageMethods(message_descriptor, cls)\n  _AddPropertiesForExtensions(message_descriptor, cls)\n\n\ndef _AddDescriptors(message_descriptor, dictionary):\n  \"\"\"Sets up a new protocol message class dictionary.\n\n  Args:\n    message_descriptor: A Descriptor instance describing this message type.\n    dictionary: Class dictionary to which we'll add a '__slots__' entry.\n  \"\"\"\n  dictionary['__descriptors'] = {}\n  for field in message_descriptor.fields:\n    dictionary['__descriptors'][field.name] = GetFieldDescriptor(\n        field.full_name)\n\n  dictionary['__slots__'] = list(dictionary['__descriptors'].iterkeys()) + [\n      '_cmsg', '_owner', '_composite_fields', 'Extensions']\n\n\ndef _AddEnumValues(message_descriptor, dictionary):\n  \"\"\"Sets class-level attributes for all enum fields defined in this message.\n\n  Args:\n    message_descriptor: Descriptor object for this message type.\n    dictionary: Class dictionary that should be populated.\n  \"\"\"\n  for enum_type in message_descriptor.enum_types:\n    for enum_value in enum_type.values:\n      dictionary[enum_value.name] = enum_value.number\n\n\ndef _AddClassAttributesForNestedExtensions(message_descriptor, dictionary):\n  \"\"\"Adds class attributes for the nested extensions.\"\"\"\n  extension_dict = message_descriptor.extensions_by_name\n  for extension_name, extension_field in extension_dict.iteritems():\n    assert extension_name not in dictionary\n    dictionary[extension_name] = extension_field\n\n\ndef _AddInitMethod(message_descriptor, cls):\n  \"\"\"Adds an __init__ method to cls.\"\"\"\n\n  # Create and attach message field properties to the message class.\n  # This can be done just once per message class, since property setters and\n  # getters are passed the message instance.\n  # This makes message instantiation extremely fast, and at the same time it\n  # doesn't require the creation of property objects for each message instance,\n  # which saves a lot of memory.\n  for field in message_descriptor.fields:\n    field_cdescriptor = cls.__descriptors[field.name]\n    if field.label == _LABEL_REPEATED:\n      if field.cpp_type == _CPPTYPE_MESSAGE:\n        value = RepeatedCompositeProperty(field_cdescriptor, field.message_type)\n      else:\n        value = RepeatedScalarProperty(field_cdescriptor)\n    elif field.cpp_type == _CPPTYPE_MESSAGE:\n      value = CompositeProperty(field_cdescriptor, field.message_type)\n    else:\n      value = ScalarProperty(field_cdescriptor)\n    setattr(cls, field.name, value)\n\n    # Attach a constant with the field number.\n    constant_name = field.name.upper() + '_FIELD_NUMBER'\n    setattr(cls, constant_name, field.number)\n\n  def Init(self, **kwargs):\n    \"\"\"Message constructor.\"\"\"\n    cmessage = kwargs.pop('__cmessage', None)\n    if cmessage is None:\n      self._cmsg = NewCMessage(message_descriptor.full_name)\n    else:\n      self._cmsg = cmessage\n\n    # Keep a reference to the owner, as the owner keeps a reference to the\n    # underlying protocol buffer message.\n    owner = kwargs.pop('__owner', None)\n    if owner is not None:\n      self._owner = owner\n\n    self.Extensions = ExtensionDict(self)\n    self._composite_fields = {}\n\n    for field_name, field_value in kwargs.iteritems():\n      field_cdescriptor = self.__descriptors.get(field_name, None)\n      if field_cdescriptor is None:\n        raise ValueError('Protocol message has no \"%s\" field.' % field_name)\n      if field_cdescriptor.label == _LABEL_REPEATED:\n        if field_cdescriptor.cpp_type == _CPPTYPE_MESSAGE:\n          for val in field_value:\n            getattr(self, field_name).add().MergeFrom(val)\n        else:\n          getattr(self, field_name).extend(field_value)\n      elif field_cdescriptor.cpp_type == _CPPTYPE_MESSAGE:\n        getattr(self, field_name).MergeFrom(field_value)\n      else:\n        setattr(self, field_name, field_value)\n\n  Init.__module__ = None\n  Init.__doc__ = None\n  cls.__init__ = Init\n\n\ndef _IsMessageSetExtension(field):\n  \"\"\"Checks if a field is a message set extension.\"\"\"\n  return (field.is_extension and\n          field.containing_type.has_options and\n          field.containing_type.GetOptions().message_set_wire_format and\n          field.type == _TYPE_MESSAGE and\n          field.message_type == field.extension_scope and\n          field.label == _LABEL_OPTIONAL)\n\n\ndef _AddMessageMethods(message_descriptor, cls):\n  \"\"\"Adds the methods to a protocol message class.\"\"\"\n  if message_descriptor.is_extendable:\n\n    def ClearExtension(self, extension):\n      self.Extensions.ClearExtension(extension)\n\n    def HasExtension(self, extension):\n      return self.Extensions.HasExtension(extension)\n\n  def HasField(self, field_name):\n    return self._cmsg.HasField(field_name)\n\n  def ClearField(self, field_name):\n    if field_name in self._composite_fields:\n      del self._composite_fields[field_name]\n    self._cmsg.ClearField(field_name)\n\n  def Clear(self):\n    return self._cmsg.Clear()\n\n  def IsInitialized(self, errors=None):\n    if self._cmsg.IsInitialized():\n      return True\n    if errors is not None:\n      errors.extend(self.FindInitializationErrors());\n    return False\n\n  def SerializeToString(self):\n    if not self.IsInitialized():\n      raise message.EncodeError(\n          'Message is missing required fields: ' +\n          ','.join(self.FindInitializationErrors()))\n    return self._cmsg.SerializeToString()\n\n  def SerializePartialToString(self):\n    return self._cmsg.SerializePartialToString()\n\n  def ParseFromString(self, serialized):\n    self.Clear()\n    self.MergeFromString(serialized)\n\n  def MergeFromString(self, serialized):\n    byte_size = self._cmsg.MergeFromString(serialized)\n    if byte_size < 0:\n      raise message.DecodeError('Unable to merge from string.')\n    return byte_size\n\n  def MergeFrom(self, msg):\n    if not isinstance(msg, cls):\n      raise TypeError(\n          \"Parameter to MergeFrom() must be instance of same class.\")\n    self._cmsg.MergeFrom(msg._cmsg)\n\n  def CopyFrom(self, msg):\n    self._cmsg.CopyFrom(msg._cmsg)\n\n  def ByteSize(self):\n    return self._cmsg.ByteSize()\n\n  def SetInParent(self):\n    return self._cmsg.SetInParent()\n\n  def ListFields(self):\n    all_fields = []\n    field_list = self._cmsg.ListFields()\n    fields_by_name = cls.DESCRIPTOR.fields_by_name\n    for is_extension, field_name in field_list:\n      if is_extension:\n        extension = cls._extensions_by_name[field_name]\n        all_fields.append((extension, self.Extensions[extension]))\n      else:\n        field_descriptor = fields_by_name[field_name]\n        all_fields.append(\n            (field_descriptor, getattr(self, field_name)))\n    all_fields.sort(key=lambda item: item[0].number)\n    return all_fields\n\n  def FindInitializationErrors(self):\n    return self._cmsg.FindInitializationErrors()\n\n  def __str__(self):\n    return self._cmsg.DebugString()\n\n  def __eq__(self, other):\n    if self is other:\n      return True\n    if not isinstance(other, self.__class__):\n      return False\n    return self.ListFields() == other.ListFields()\n\n  def __ne__(self, other):\n    return not self == other\n\n  def __hash__(self):\n    raise TypeError('unhashable object')\n\n  def __unicode__(self):\n    return text_format.MessageToString(self, as_utf8=True).decode('utf-8')\n\n  # Attach the local methods to the message class.\n  for key, value in locals().copy().iteritems():\n    if key not in ('key', 'value', '__builtins__', '__name__', '__doc__'):\n      setattr(cls, key, value)\n\n  # Static methods:\n\n  def RegisterExtension(extension_handle):\n    extension_handle.containing_type = cls.DESCRIPTOR\n    cls._extensions_by_name[extension_handle.full_name] = extension_handle\n\n    if _IsMessageSetExtension(extension_handle):\n      # MessageSet extension.  Also register under type name.\n      cls._extensions_by_name[\n          extension_handle.message_type.full_name] = extension_handle\n  cls.RegisterExtension = staticmethod(RegisterExtension)\n\n  def FromString(string):\n    msg = cls()\n    msg.MergeFromString(string)\n    return msg\n  cls.FromString = staticmethod(FromString)\n\n\n\ndef _AddPropertiesForExtensions(message_descriptor, cls):\n  \"\"\"Adds properties for all fields in this protocol message type.\"\"\"\n  extension_dict = message_descriptor.extensions_by_name\n  for extension_name, extension_field in extension_dict.iteritems():\n    constant_name = extension_name.upper() + '_FIELD_NUMBER'\n    setattr(cls, constant_name, extension_field.number)\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/decoder.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Code for decoding protocol buffer primitives.\n\nThis code is very similar to encoder.py -- read the docs for that module first.\n\nA \"decoder\" is a function with the signature:\n  Decode(buffer, pos, end, message, field_dict)\nThe arguments are:\n  buffer:     The string containing the encoded message.\n  pos:        The current position in the string.\n  end:        The position in the string where the current message ends.  May be\n              less than len(buffer) if we're reading a sub-message.\n  message:    The message object into which we're parsing.\n  field_dict: message._fields (avoids a hashtable lookup).\nThe decoder reads the field and stores it into field_dict, returning the new\nbuffer position.  A decoder for a repeated field may proactively decode all of\nthe elements of that field, if they appear consecutively.\n\nNote that decoders may throw any of the following:\n  IndexError:  Indicates a truncated message.\n  struct.error:  Unpacking of a fixed-width field failed.\n  message.DecodeError:  Other errors.\n\nDecoders are expected to raise an exception if they are called with pos > end.\nThis allows callers to be lax about bounds checking:  it's fineto read past\n\"end\" as long as you are sure that someone else will notice and throw an\nexception later on.\n\nSomething up the call stack is expected to catch IndexError and struct.error\nand convert them to message.DecodeError.\n\nDecoders are constructed using decoder constructors with the signature:\n  MakeDecoder(field_number, is_repeated, is_packed, key, new_default)\nThe arguments are:\n  field_number:  The field number of the field we want to decode.\n  is_repeated:   Is the field a repeated field? (bool)\n  is_packed:     Is the field a packed field? (bool)\n  key:           The key to use when looking up the field within field_dict.\n                 (This is actually the FieldDescriptor but nothing in this\n                 file should depend on that.)\n  new_default:   A function which takes a message object as a parameter and\n                 returns a new instance of the default value for this field.\n                 (This is called for repeated fields and sub-messages, when an\n                 instance does not already exist.)\n\nAs with encoders, we define a decoder constructor for every type of field.\nThen, for every field of every message class we construct an actual decoder.\nThat decoder goes into a dict indexed by tag, so when we decode a message\nwe repeatedly read a tag, look up the corresponding decoder, and invoke it.\n\"\"\"\n\n__author__ = 'kenton@google.com (Kenton Varda)'\n\nimport struct\nfrom google.protobuf.internal import encoder\nfrom google.protobuf.internal import wire_format\nfrom google.protobuf import message\n\n\n# This will overflow and thus become IEEE-754 \"infinity\".  We would use\n# \"float('inf')\" but it doesn't work on Windows pre-Python-2.6.\n_POS_INF = 1e10000\n_NEG_INF = -_POS_INF\n_NAN = _POS_INF * 0\n\n\n# This is not for optimization, but rather to avoid conflicts with local\n# variables named \"message\".\n_DecodeError = message.DecodeError\n\n\ndef _VarintDecoder(mask):\n  \"\"\"Return an encoder for a basic varint value (does not include tag).\n\n  Decoded values will be bitwise-anded with the given mask before being\n  returned, e.g. to limit them to 32 bits.  The returned decoder does not\n  take the usual \"end\" parameter -- the caller is expected to do bounds checking\n  after the fact (often the caller can defer such checking until later).  The\n  decoder returns a (value, new_pos) pair.\n  \"\"\"\n\n  local_ord = ord\n  def DecodeVarint(buffer, pos):\n    result = 0\n    shift = 0\n    while 1:\n      b = local_ord(buffer[pos])\n      result |= ((b & 0x7f) << shift)\n      pos += 1\n      if not (b & 0x80):\n        result &= mask\n        return (result, pos)\n      shift += 7\n      if shift >= 64:\n        raise _DecodeError('Too many bytes when decoding varint.')\n  return DecodeVarint\n\n\ndef _SignedVarintDecoder(mask):\n  \"\"\"Like _VarintDecoder() but decodes signed values.\"\"\"\n\n  local_ord = ord\n  def DecodeVarint(buffer, pos):\n    result = 0\n    shift = 0\n    while 1:\n      b = local_ord(buffer[pos])\n      result |= ((b & 0x7f) << shift)\n      pos += 1\n      if not (b & 0x80):\n        if result > 0x7fffffffffffffff:\n          result -= (1 << 64)\n          result |= ~mask\n        else:\n          result &= mask\n        return (result, pos)\n      shift += 7\n      if shift >= 64:\n        raise _DecodeError('Too many bytes when decoding varint.')\n  return DecodeVarint\n\n\n_DecodeVarint = _VarintDecoder((1 << 64) - 1)\n_DecodeSignedVarint = _SignedVarintDecoder((1 << 64) - 1)\n\n# Use these versions for values which must be limited to 32 bits.\n_DecodeVarint32 = _VarintDecoder((1 << 32) - 1)\n_DecodeSignedVarint32 = _SignedVarintDecoder((1 << 32) - 1)\n\n\ndef ReadTag(buffer, pos):\n  \"\"\"Read a tag from the buffer, and return a (tag_bytes, new_pos) tuple.\n\n  We return the raw bytes of the tag rather than decoding them.  The raw\n  bytes can then be used to look up the proper decoder.  This effectively allows\n  us to trade some work that would be done in pure-python (decoding a varint)\n  for work that is done in C (searching for a byte string in a hash table).\n  In a low-level language it would be much cheaper to decode the varint and\n  use that, but not in Python.\n  \"\"\"\n\n  start = pos\n  while ord(buffer[pos]) & 0x80:\n    pos += 1\n  pos += 1\n  return (buffer[start:pos], pos)\n\n\n# --------------------------------------------------------------------\n\n\ndef _SimpleDecoder(wire_type, decode_value):\n  \"\"\"Return a constructor for a decoder for fields of a particular type.\n\n  Args:\n      wire_type:  The field's wire type.\n      decode_value:  A function which decodes an individual value, e.g.\n        _DecodeVarint()\n  \"\"\"\n\n  def SpecificDecoder(field_number, is_repeated, is_packed, key, new_default):\n    if is_packed:\n      local_DecodeVarint = _DecodeVarint\n      def DecodePackedField(buffer, pos, end, message, field_dict):\n        value = field_dict.get(key)\n        if value is None:\n          value = field_dict.setdefault(key, new_default(message))\n        (endpoint, pos) = local_DecodeVarint(buffer, pos)\n        endpoint += pos\n        if endpoint > end:\n          raise _DecodeError('Truncated message.')\n        while pos < endpoint:\n          (element, pos) = decode_value(buffer, pos)\n          value.append(element)\n        if pos > endpoint:\n          del value[-1]   # Discard corrupt value.\n          raise _DecodeError('Packed element was truncated.')\n        return pos\n      return DecodePackedField\n    elif is_repeated:\n      tag_bytes = encoder.TagBytes(field_number, wire_type)\n      tag_len = len(tag_bytes)\n      def DecodeRepeatedField(buffer, pos, end, message, field_dict):\n        value = field_dict.get(key)\n        if value is None:\n          value = field_dict.setdefault(key, new_default(message))\n        while 1:\n          (element, new_pos) = decode_value(buffer, pos)\n          value.append(element)\n          # Predict that the next tag is another copy of the same repeated\n          # field.\n          pos = new_pos + tag_len\n          if buffer[new_pos:pos] != tag_bytes or new_pos >= end:\n            # Prediction failed.  Return.\n            if new_pos > end:\n              raise _DecodeError('Truncated message.')\n            return new_pos\n      return DecodeRepeatedField\n    else:\n      def DecodeField(buffer, pos, end, message, field_dict):\n        (field_dict[key], pos) = decode_value(buffer, pos)\n        if pos > end:\n          del field_dict[key]  # Discard corrupt value.\n          raise _DecodeError('Truncated message.')\n        return pos\n      return DecodeField\n\n  return SpecificDecoder\n\n\ndef _ModifiedDecoder(wire_type, decode_value, modify_value):\n  \"\"\"Like SimpleDecoder but additionally invokes modify_value on every value\n  before storing it.  Usually modify_value is ZigZagDecode.\n  \"\"\"\n\n  # Reusing _SimpleDecoder is slightly slower than copying a bunch of code, but\n  # not enough to make a significant difference.\n\n  def InnerDecode(buffer, pos):\n    (result, new_pos) = decode_value(buffer, pos)\n    return (modify_value(result), new_pos)\n  return _SimpleDecoder(wire_type, InnerDecode)\n\n\ndef _StructPackDecoder(wire_type, format):\n  \"\"\"Return a constructor for a decoder for a fixed-width field.\n\n  Args:\n      wire_type:  The field's wire type.\n      format:  The format string to pass to struct.unpack().\n  \"\"\"\n\n  value_size = struct.calcsize(format)\n  local_unpack = struct.unpack\n\n  # Reusing _SimpleDecoder is slightly slower than copying a bunch of code, but\n  # not enough to make a significant difference.\n\n  # Note that we expect someone up-stack to catch struct.error and convert\n  # it to _DecodeError -- this way we don't have to set up exception-\n  # handling blocks every time we parse one value.\n\n  def InnerDecode(buffer, pos):\n    new_pos = pos + value_size\n    result = local_unpack(format, buffer[pos:new_pos])[0]\n    return (result, new_pos)\n  return _SimpleDecoder(wire_type, InnerDecode)\n\n\ndef _FloatDecoder():\n  \"\"\"Returns a decoder for a float field.\n\n  This code works around a bug in struct.unpack for non-finite 32-bit\n  floating-point values.\n  \"\"\"\n\n  local_unpack = struct.unpack\n\n  def InnerDecode(buffer, pos):\n    # We expect a 32-bit value in little-endian byte order.  Bit 1 is the sign\n    # bit, bits 2-9 represent the exponent, and bits 10-32 are the significand.\n    new_pos = pos + 4\n    float_bytes = buffer[pos:new_pos]\n\n    # If this value has all its exponent bits set, then it's non-finite.\n    # In Python 2.4, struct.unpack will convert it to a finite 64-bit value.\n    # To avoid that, we parse it specially.\n    if ((float_bytes[3] in '\\x7F\\xFF')\n        and (float_bytes[2] >= '\\x80')):\n      # If at least one significand bit is set...\n      if float_bytes[0:3] != '\\x00\\x00\\x80':\n        return (_NAN, new_pos)\n      # If sign bit is set...\n      if float_bytes[3] == '\\xFF':\n        return (_NEG_INF, new_pos)\n      return (_POS_INF, new_pos)\n\n    # Note that we expect someone up-stack to catch struct.error and convert\n    # it to _DecodeError -- this way we don't have to set up exception-\n    # handling blocks every time we parse one value.\n    result = local_unpack('<f', float_bytes)[0]\n    return (result, new_pos)\n  return _SimpleDecoder(wire_format.WIRETYPE_FIXED32, InnerDecode)\n\n\ndef _DoubleDecoder():\n  \"\"\"Returns a decoder for a double field.\n\n  This code works around a bug in struct.unpack for not-a-number.\n  \"\"\"\n\n  local_unpack = struct.unpack\n\n  def InnerDecode(buffer, pos):\n    # We expect a 64-bit value in little-endian byte order.  Bit 1 is the sign\n    # bit, bits 2-12 represent the exponent, and bits 13-64 are the significand.\n    new_pos = pos + 8\n    double_bytes = buffer[pos:new_pos]\n\n    # If this value has all its exponent bits set and at least one significand\n    # bit set, it's not a number.  In Python 2.4, struct.unpack will treat it\n    # as inf or -inf.  To avoid that, we treat it specially.\n    if ((double_bytes[7] in '\\x7F\\xFF')\n        and (double_bytes[6] >= '\\xF0')\n        and (double_bytes[0:7] != '\\x00\\x00\\x00\\x00\\x00\\x00\\xF0')):\n      return (_NAN, new_pos)\n\n    # Note that we expect someone up-stack to catch struct.error and convert\n    # it to _DecodeError -- this way we don't have to set up exception-\n    # handling blocks every time we parse one value.\n    result = local_unpack('<d', double_bytes)[0]\n    return (result, new_pos)\n  return _SimpleDecoder(wire_format.WIRETYPE_FIXED64, InnerDecode)\n\n\n# --------------------------------------------------------------------\n\n\nInt32Decoder = EnumDecoder = _SimpleDecoder(\n    wire_format.WIRETYPE_VARINT, _DecodeSignedVarint32)\n\nInt64Decoder = _SimpleDecoder(\n    wire_format.WIRETYPE_VARINT, _DecodeSignedVarint)\n\nUInt32Decoder = _SimpleDecoder(wire_format.WIRETYPE_VARINT, _DecodeVarint32)\nUInt64Decoder = _SimpleDecoder(wire_format.WIRETYPE_VARINT, _DecodeVarint)\n\nSInt32Decoder = _ModifiedDecoder(\n    wire_format.WIRETYPE_VARINT, _DecodeVarint32, wire_format.ZigZagDecode)\nSInt64Decoder = _ModifiedDecoder(\n    wire_format.WIRETYPE_VARINT, _DecodeVarint, wire_format.ZigZagDecode)\n\n# Note that Python conveniently guarantees that when using the '<' prefix on\n# formats, they will also have the same size across all platforms (as opposed\n# to without the prefix, where their sizes depend on the C compiler's basic\n# type sizes).\nFixed32Decoder  = _StructPackDecoder(wire_format.WIRETYPE_FIXED32, '<I')\nFixed64Decoder  = _StructPackDecoder(wire_format.WIRETYPE_FIXED64, '<Q')\nSFixed32Decoder = _StructPackDecoder(wire_format.WIRETYPE_FIXED32, '<i')\nSFixed64Decoder = _StructPackDecoder(wire_format.WIRETYPE_FIXED64, '<q')\nFloatDecoder = _FloatDecoder()\nDoubleDecoder = _DoubleDecoder()\n\nBoolDecoder = _ModifiedDecoder(\n    wire_format.WIRETYPE_VARINT, _DecodeVarint, bool)\n\n\ndef StringDecoder(field_number, is_repeated, is_packed, key, new_default):\n  \"\"\"Returns a decoder for a string field.\"\"\"\n\n  local_DecodeVarint = _DecodeVarint\n  local_unicode = unicode\n\n  assert not is_packed\n  if is_repeated:\n    tag_bytes = encoder.TagBytes(field_number,\n                                 wire_format.WIRETYPE_LENGTH_DELIMITED)\n    tag_len = len(tag_bytes)\n    def DecodeRepeatedField(buffer, pos, end, message, field_dict):\n      value = field_dict.get(key)\n      if value is None:\n        value = field_dict.setdefault(key, new_default(message))\n      while 1:\n        (size, pos) = local_DecodeVarint(buffer, pos)\n        new_pos = pos + size\n        if new_pos > end:\n          raise _DecodeError('Truncated string.')\n        value.append(local_unicode(buffer[pos:new_pos], 'utf-8'))\n        # Predict that the next tag is another copy of the same repeated field.\n        pos = new_pos + tag_len\n        if buffer[new_pos:pos] != tag_bytes or new_pos == end:\n          # Prediction failed.  Return.\n          return new_pos\n    return DecodeRepeatedField\n  else:\n    def DecodeField(buffer, pos, end, message, field_dict):\n      (size, pos) = local_DecodeVarint(buffer, pos)\n      new_pos = pos + size\n      if new_pos > end:\n        raise _DecodeError('Truncated string.')\n      field_dict[key] = local_unicode(buffer[pos:new_pos], 'utf-8')\n      return new_pos\n    return DecodeField\n\n\ndef BytesDecoder(field_number, is_repeated, is_packed, key, new_default):\n  \"\"\"Returns a decoder for a bytes field.\"\"\"\n\n  local_DecodeVarint = _DecodeVarint\n\n  assert not is_packed\n  if is_repeated:\n    tag_bytes = encoder.TagBytes(field_number,\n                                 wire_format.WIRETYPE_LENGTH_DELIMITED)\n    tag_len = len(tag_bytes)\n    def DecodeRepeatedField(buffer, pos, end, message, field_dict):\n      value = field_dict.get(key)\n      if value is None:\n        value = field_dict.setdefault(key, new_default(message))\n      while 1:\n        (size, pos) = local_DecodeVarint(buffer, pos)\n        new_pos = pos + size\n        if new_pos > end:\n          raise _DecodeError('Truncated string.')\n        value.append(buffer[pos:new_pos])\n        # Predict that the next tag is another copy of the same repeated field.\n        pos = new_pos + tag_len\n        if buffer[new_pos:pos] != tag_bytes or new_pos == end:\n          # Prediction failed.  Return.\n          return new_pos\n    return DecodeRepeatedField\n  else:\n    def DecodeField(buffer, pos, end, message, field_dict):\n      (size, pos) = local_DecodeVarint(buffer, pos)\n      new_pos = pos + size\n      if new_pos > end:\n        raise _DecodeError('Truncated string.')\n      field_dict[key] = buffer[pos:new_pos]\n      return new_pos\n    return DecodeField\n\n\ndef GroupDecoder(field_number, is_repeated, is_packed, key, new_default):\n  \"\"\"Returns a decoder for a group field.\"\"\"\n\n  end_tag_bytes = encoder.TagBytes(field_number,\n                                   wire_format.WIRETYPE_END_GROUP)\n  end_tag_len = len(end_tag_bytes)\n\n  assert not is_packed\n  if is_repeated:\n    tag_bytes = encoder.TagBytes(field_number,\n                                 wire_format.WIRETYPE_START_GROUP)\n    tag_len = len(tag_bytes)\n    def DecodeRepeatedField(buffer, pos, end, message, field_dict):\n      value = field_dict.get(key)\n      if value is None:\n        value = field_dict.setdefault(key, new_default(message))\n      while 1:\n        value = field_dict.get(key)\n        if value is None:\n          value = field_dict.setdefault(key, new_default(message))\n        # Read sub-message.\n        pos = value.add()._InternalParse(buffer, pos, end)\n        # Read end tag.\n        new_pos = pos+end_tag_len\n        if buffer[pos:new_pos] != end_tag_bytes or new_pos > end:\n          raise _DecodeError('Missing group end tag.')\n        # Predict that the next tag is another copy of the same repeated field.\n        pos = new_pos + tag_len\n        if buffer[new_pos:pos] != tag_bytes or new_pos == end:\n          # Prediction failed.  Return.\n          return new_pos\n    return DecodeRepeatedField\n  else:\n    def DecodeField(buffer, pos, end, message, field_dict):\n      value = field_dict.get(key)\n      if value is None:\n        value = field_dict.setdefault(key, new_default(message))\n      # Read sub-message.\n      pos = value._InternalParse(buffer, pos, end)\n      # Read end tag.\n      new_pos = pos+end_tag_len\n      if buffer[pos:new_pos] != end_tag_bytes or new_pos > end:\n        raise _DecodeError('Missing group end tag.')\n      return new_pos\n    return DecodeField\n\n\ndef MessageDecoder(field_number, is_repeated, is_packed, key, new_default):\n  \"\"\"Returns a decoder for a message field.\"\"\"\n\n  local_DecodeVarint = _DecodeVarint\n\n  assert not is_packed\n  if is_repeated:\n    tag_bytes = encoder.TagBytes(field_number,\n                                 wire_format.WIRETYPE_LENGTH_DELIMITED)\n    tag_len = len(tag_bytes)\n    def DecodeRepeatedField(buffer, pos, end, message, field_dict):\n      value = field_dict.get(key)\n      if value is None:\n        value = field_dict.setdefault(key, new_default(message))\n      while 1:\n        value = field_dict.get(key)\n        if value is None:\n          value = field_dict.setdefault(key, new_default(message))\n        # Read length.\n        (size, pos) = local_DecodeVarint(buffer, pos)\n        new_pos = pos + size\n        if new_pos > end:\n          raise _DecodeError('Truncated message.')\n        # Read sub-message.\n        if value.add()._InternalParse(buffer, pos, new_pos) != new_pos:\n          # The only reason _InternalParse would return early is if it\n          # encountered an end-group tag.\n          raise _DecodeError('Unexpected end-group tag.')\n        # Predict that the next tag is another copy of the same repeated field.\n        pos = new_pos + tag_len\n        if buffer[new_pos:pos] != tag_bytes or new_pos == end:\n          # Prediction failed.  Return.\n          return new_pos\n    return DecodeRepeatedField\n  else:\n    def DecodeField(buffer, pos, end, message, field_dict):\n      value = field_dict.get(key)\n      if value is None:\n        value = field_dict.setdefault(key, new_default(message))\n      # Read length.\n      (size, pos) = local_DecodeVarint(buffer, pos)\n      new_pos = pos + size\n      if new_pos > end:\n        raise _DecodeError('Truncated message.')\n      # Read sub-message.\n      if value._InternalParse(buffer, pos, new_pos) != new_pos:\n        # The only reason _InternalParse would return early is if it encountered\n        # an end-group tag.\n        raise _DecodeError('Unexpected end-group tag.')\n      return new_pos\n    return DecodeField\n\n\n# --------------------------------------------------------------------\n\nMESSAGE_SET_ITEM_TAG = encoder.TagBytes(1, wire_format.WIRETYPE_START_GROUP)\n\ndef MessageSetItemDecoder(extensions_by_number):\n  \"\"\"Returns a decoder for a MessageSet item.\n\n  The parameter is the _extensions_by_number map for the message class.\n\n  The message set message looks like this:\n    message MessageSet {\n      repeated group Item = 1 {\n        required int32 type_id = 2;\n        required string message = 3;\n      }\n    }\n  \"\"\"\n\n  type_id_tag_bytes = encoder.TagBytes(2, wire_format.WIRETYPE_VARINT)\n  message_tag_bytes = encoder.TagBytes(3, wire_format.WIRETYPE_LENGTH_DELIMITED)\n  item_end_tag_bytes = encoder.TagBytes(1, wire_format.WIRETYPE_END_GROUP)\n\n  local_ReadTag = ReadTag\n  local_DecodeVarint = _DecodeVarint\n  local_SkipField = SkipField\n\n  def DecodeItem(buffer, pos, end, message, field_dict):\n    type_id = -1\n    message_start = -1\n    message_end = -1\n\n    # Technically, type_id and message can appear in any order, so we need\n    # a little loop here.\n    while 1:\n      (tag_bytes, pos) = local_ReadTag(buffer, pos)\n      if tag_bytes == type_id_tag_bytes:\n        (type_id, pos) = local_DecodeVarint(buffer, pos)\n      elif tag_bytes == message_tag_bytes:\n        (size, message_start) = local_DecodeVarint(buffer, pos)\n        pos = message_end = message_start + size\n      elif tag_bytes == item_end_tag_bytes:\n        break\n      else:\n        pos = SkipField(buffer, pos, end, tag_bytes)\n        if pos == -1:\n          raise _DecodeError('Missing group end tag.')\n\n    if pos > end:\n      raise _DecodeError('Truncated message.')\n\n    if type_id == -1:\n      raise _DecodeError('MessageSet item missing type_id.')\n    if message_start == -1:\n      raise _DecodeError('MessageSet item missing message.')\n\n    extension = extensions_by_number.get(type_id)\n    if extension is not None:\n      value = field_dict.get(extension)\n      if value is None:\n        value = field_dict.setdefault(\n            extension, extension.message_type._concrete_class())\n      if value._InternalParse(buffer, message_start,message_end) != message_end:\n        # The only reason _InternalParse would return early is if it encountered\n        # an end-group tag.\n        raise _DecodeError('Unexpected end-group tag.')\n\n    return pos\n\n  return DecodeItem\n\n# --------------------------------------------------------------------\n# Optimization is not as heavy here because calls to SkipField() are rare,\n# except for handling end-group tags.\n\ndef _SkipVarint(buffer, pos, end):\n  \"\"\"Skip a varint value.  Returns the new position.\"\"\"\n\n  while ord(buffer[pos]) & 0x80:\n    pos += 1\n  pos += 1\n  if pos > end:\n    raise _DecodeError('Truncated message.')\n  return pos\n\ndef _SkipFixed64(buffer, pos, end):\n  \"\"\"Skip a fixed64 value.  Returns the new position.\"\"\"\n\n  pos += 8\n  if pos > end:\n    raise _DecodeError('Truncated message.')\n  return pos\n\ndef _SkipLengthDelimited(buffer, pos, end):\n  \"\"\"Skip a length-delimited value.  Returns the new position.\"\"\"\n\n  (size, pos) = _DecodeVarint(buffer, pos)\n  pos += size\n  if pos > end:\n    raise _DecodeError('Truncated message.')\n  return pos\n\ndef _SkipGroup(buffer, pos, end):\n  \"\"\"Skip sub-group.  Returns the new position.\"\"\"\n\n  while 1:\n    (tag_bytes, pos) = ReadTag(buffer, pos)\n    new_pos = SkipField(buffer, pos, end, tag_bytes)\n    if new_pos == -1:\n      return pos\n    pos = new_pos\n\ndef _EndGroup(buffer, pos, end):\n  \"\"\"Skipping an END_GROUP tag returns -1 to tell the parent loop to break.\"\"\"\n\n  return -1\n\ndef _SkipFixed32(buffer, pos, end):\n  \"\"\"Skip a fixed32 value.  Returns the new position.\"\"\"\n\n  pos += 4\n  if pos > end:\n    raise _DecodeError('Truncated message.')\n  return pos\n\ndef _RaiseInvalidWireType(buffer, pos, end):\n  \"\"\"Skip function for unknown wire types.  Raises an exception.\"\"\"\n\n  raise _DecodeError('Tag had invalid wire type.')\n\ndef _FieldSkipper():\n  \"\"\"Constructs the SkipField function.\"\"\"\n\n  WIRETYPE_TO_SKIPPER = [\n      _SkipVarint,\n      _SkipFixed64,\n      _SkipLengthDelimited,\n      _SkipGroup,\n      _EndGroup,\n      _SkipFixed32,\n      _RaiseInvalidWireType,\n      _RaiseInvalidWireType,\n      ]\n\n  wiretype_mask = wire_format.TAG_TYPE_MASK\n  local_ord = ord\n\n  def SkipField(buffer, pos, end, tag_bytes):\n    \"\"\"Skips a field with the specified tag.\n\n    |pos| should point to the byte immediately after the tag.\n\n    Returns:\n        The new position (after the tag value), or -1 if the tag is an end-group\n        tag (in which case the calling loop should break).\n    \"\"\"\n\n    # The wire type is always in the first byte since varints are little-endian.\n    wire_type = local_ord(tag_bytes[0]) & wiretype_mask\n    return WIRETYPE_TO_SKIPPER[wire_type](buffer, pos, end)\n\n  return SkipField\n\nSkipField = _FieldSkipper()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/descriptor_test.py",
    "content": "#! /usr/bin/python\n#\n# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unittest for google.protobuf.internal.descriptor.\"\"\"\n\n__author__ = 'robinson@google.com (Will Robinson)'\n\nimport unittest\nfrom google.protobuf import unittest_import_pb2\nfrom google.protobuf import unittest_pb2\nfrom google.protobuf import descriptor_pb2\nfrom google.protobuf import descriptor\nfrom google.protobuf import text_format\n\n\nTEST_EMPTY_MESSAGE_DESCRIPTOR_ASCII = \"\"\"\nname: 'TestEmptyMessage'\n\"\"\"\n\n\nclass DescriptorTest(unittest.TestCase):\n\n  def setUp(self):\n    self.my_file = descriptor.FileDescriptor(\n        name='some/filename/some.proto',\n        package='protobuf_unittest'\n        )\n    self.my_enum = descriptor.EnumDescriptor(\n        name='ForeignEnum',\n        full_name='protobuf_unittest.ForeignEnum',\n        filename=None,\n        file=self.my_file,\n        values=[\n          descriptor.EnumValueDescriptor(name='FOREIGN_FOO', index=0, number=4),\n          descriptor.EnumValueDescriptor(name='FOREIGN_BAR', index=1, number=5),\n          descriptor.EnumValueDescriptor(name='FOREIGN_BAZ', index=2, number=6),\n        ])\n    self.my_message = descriptor.Descriptor(\n        name='NestedMessage',\n        full_name='protobuf_unittest.TestAllTypes.NestedMessage',\n        filename=None,\n        file=self.my_file,\n        containing_type=None,\n        fields=[\n          descriptor.FieldDescriptor(\n            name='bb',\n            full_name='protobuf_unittest.TestAllTypes.NestedMessage.bb',\n            index=0, number=1,\n            type=5, cpp_type=1, label=1,\n            has_default_value=False, default_value=0,\n            message_type=None, enum_type=None, containing_type=None,\n            is_extension=False, extension_scope=None),\n        ],\n        nested_types=[],\n        enum_types=[\n          self.my_enum,\n        ],\n        extensions=[])\n    self.my_method = descriptor.MethodDescriptor(\n        name='Bar',\n        full_name='protobuf_unittest.TestService.Bar',\n        index=0,\n        containing_service=None,\n        input_type=None,\n        output_type=None)\n    self.my_service = descriptor.ServiceDescriptor(\n        name='TestServiceWithOptions',\n        full_name='protobuf_unittest.TestServiceWithOptions',\n        file=self.my_file,\n        index=0,\n        methods=[\n            self.my_method\n        ])\n\n  def testEnumFixups(self):\n    self.assertEqual(self.my_enum, self.my_enum.values[0].type)\n\n  def testContainingTypeFixups(self):\n    self.assertEqual(self.my_message, self.my_message.fields[0].containing_type)\n    self.assertEqual(self.my_message, self.my_enum.containing_type)\n\n  def testContainingServiceFixups(self):\n    self.assertEqual(self.my_service, self.my_method.containing_service)\n\n  def testGetOptions(self):\n    self.assertEqual(self.my_enum.GetOptions(),\n                     descriptor_pb2.EnumOptions())\n    self.assertEqual(self.my_enum.values[0].GetOptions(),\n                     descriptor_pb2.EnumValueOptions())\n    self.assertEqual(self.my_message.GetOptions(),\n                     descriptor_pb2.MessageOptions())\n    self.assertEqual(self.my_message.fields[0].GetOptions(),\n                     descriptor_pb2.FieldOptions())\n    self.assertEqual(self.my_method.GetOptions(),\n                     descriptor_pb2.MethodOptions())\n    self.assertEqual(self.my_service.GetOptions(),\n                     descriptor_pb2.ServiceOptions())\n\n  def testFileDescriptorReferences(self):\n    self.assertEqual(self.my_enum.file, self.my_file)\n    self.assertEqual(self.my_message.file, self.my_file)\n\n  def testFileDescriptor(self):\n    self.assertEqual(self.my_file.name, 'some/filename/some.proto')\n    self.assertEqual(self.my_file.package, 'protobuf_unittest')\n\n\nclass DescriptorCopyToProtoTest(unittest.TestCase):\n  \"\"\"Tests for CopyTo functions of Descriptor.\"\"\"\n\n  def _AssertProtoEqual(self, actual_proto, expected_class, expected_ascii):\n    expected_proto = expected_class()\n    text_format.Merge(expected_ascii, expected_proto)\n\n    self.assertEqual(\n        actual_proto, expected_proto,\n        'Not equal,\\nActual:\\n%s\\nExpected:\\n%s\\n'\n        % (str(actual_proto), str(expected_proto)))\n\n  def _InternalTestCopyToProto(self, desc, expected_proto_class,\n                               expected_proto_ascii):\n    actual = expected_proto_class()\n    desc.CopyToProto(actual)\n    self._AssertProtoEqual(\n        actual, expected_proto_class, expected_proto_ascii)\n\n  def testCopyToProto_EmptyMessage(self):\n    self._InternalTestCopyToProto(\n        unittest_pb2.TestEmptyMessage.DESCRIPTOR,\n        descriptor_pb2.DescriptorProto,\n        TEST_EMPTY_MESSAGE_DESCRIPTOR_ASCII)\n\n  def testCopyToProto_NestedMessage(self):\n    TEST_NESTED_MESSAGE_ASCII = \"\"\"\n      name: 'NestedMessage'\n      field: <\n        name: 'bb'\n        number: 1\n        label: 1  # Optional\n        type: 5  # TYPE_INT32\n      >\n      \"\"\"\n\n    self._InternalTestCopyToProto(\n        unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR,\n        descriptor_pb2.DescriptorProto,\n        TEST_NESTED_MESSAGE_ASCII)\n\n  def testCopyToProto_ForeignNestedMessage(self):\n    TEST_FOREIGN_NESTED_ASCII = \"\"\"\n      name: 'TestForeignNested'\n      field: <\n        name: 'foreign_nested'\n        number: 1\n        label: 1  # Optional\n        type: 11  # TYPE_MESSAGE\n        type_name: '.protobuf_unittest.TestAllTypes.NestedMessage'\n      >\n      \"\"\"\n\n    self._InternalTestCopyToProto(\n        unittest_pb2.TestForeignNested.DESCRIPTOR,\n        descriptor_pb2.DescriptorProto,\n        TEST_FOREIGN_NESTED_ASCII)\n\n  def testCopyToProto_ForeignEnum(self):\n    TEST_FOREIGN_ENUM_ASCII = \"\"\"\n      name: 'ForeignEnum'\n      value: <\n        name: 'FOREIGN_FOO'\n        number: 4\n      >\n      value: <\n        name: 'FOREIGN_BAR'\n        number: 5\n      >\n      value: <\n        name: 'FOREIGN_BAZ'\n        number: 6\n      >\n      \"\"\"\n\n    self._InternalTestCopyToProto(\n        unittest_pb2._FOREIGNENUM,\n        descriptor_pb2.EnumDescriptorProto,\n        TEST_FOREIGN_ENUM_ASCII)\n\n  def testCopyToProto_Options(self):\n    TEST_DEPRECATED_FIELDS_ASCII = \"\"\"\n      name: 'TestDeprecatedFields'\n      field: <\n        name: 'deprecated_int32'\n        number: 1\n        label: 1  # Optional\n        type: 5  # TYPE_INT32\n        options: <\n          deprecated: true\n        >\n      >\n      \"\"\"\n\n    self._InternalTestCopyToProto(\n        unittest_pb2.TestDeprecatedFields.DESCRIPTOR,\n        descriptor_pb2.DescriptorProto,\n        TEST_DEPRECATED_FIELDS_ASCII)\n\n  def testCopyToProto_AllExtensions(self):\n    TEST_EMPTY_MESSAGE_WITH_EXTENSIONS_ASCII = \"\"\"\n      name: 'TestEmptyMessageWithExtensions'\n      extension_range: <\n        start: 1\n        end: 536870912\n      >\n      \"\"\"\n\n    self._InternalTestCopyToProto(\n        unittest_pb2.TestEmptyMessageWithExtensions.DESCRIPTOR,\n        descriptor_pb2.DescriptorProto,\n        TEST_EMPTY_MESSAGE_WITH_EXTENSIONS_ASCII)\n\n  def testCopyToProto_SeveralExtensions(self):\n    TEST_MESSAGE_WITH_SEVERAL_EXTENSIONS_ASCII = \"\"\"\n      name: 'TestMultipleExtensionRanges'\n      extension_range: <\n        start: 42\n        end: 43\n      >\n      extension_range: <\n        start: 4143\n        end: 4244\n      >\n      extension_range: <\n        start: 65536\n        end: 536870912\n      >\n      \"\"\"\n\n    self._InternalTestCopyToProto(\n        unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR,\n        descriptor_pb2.DescriptorProto,\n        TEST_MESSAGE_WITH_SEVERAL_EXTENSIONS_ASCII)\n\n  def testCopyToProto_FileDescriptor(self):\n    UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII = (\"\"\"\n      name: 'google/protobuf/unittest_import.proto'\n      package: 'protobuf_unittest_import'\n      message_type: <\n        name: 'ImportMessage'\n        field: <\n          name: 'd'\n          number: 1\n          label: 1  # Optional\n          type: 5  # TYPE_INT32\n        >\n      >\n      \"\"\" +\n      \"\"\"enum_type: <\n        name: 'ImportEnum'\n        value: <\n          name: 'IMPORT_FOO'\n          number: 7\n        >\n        value: <\n          name: 'IMPORT_BAR'\n          number: 8\n        >\n        value: <\n          name: 'IMPORT_BAZ'\n          number: 9\n        >\n      >\n      options: <\n        java_package: 'com.google.protobuf.test'\n        optimize_for: 1  # SPEED\n      >\n      \"\"\")\n\n    self._InternalTestCopyToProto(\n        unittest_import_pb2.DESCRIPTOR,\n        descriptor_pb2.FileDescriptorProto,\n        UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII)\n\n  def testCopyToProto_ServiceDescriptor(self):\n    TEST_SERVICE_ASCII = \"\"\"\n      name: 'TestService'\n      method: <\n        name: 'Foo'\n        input_type: '.protobuf_unittest.FooRequest'\n        output_type: '.protobuf_unittest.FooResponse'\n      >\n      method: <\n        name: 'Bar'\n        input_type: '.protobuf_unittest.BarRequest'\n        output_type: '.protobuf_unittest.BarResponse'\n      >\n      \"\"\"\n\n    self._InternalTestCopyToProto(\n        unittest_pb2.TestService.DESCRIPTOR,\n        descriptor_pb2.ServiceDescriptorProto,\n        TEST_SERVICE_ASCII)\n\n\nif __name__ == '__main__':\n  unittest.main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/encoder.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Code for encoding protocol message primitives.\n\nContains the logic for encoding every logical protocol field type\ninto one of the 5 physical wire types.\n\nThis code is designed to push the Python interpreter's performance to the\nlimits.\n\nThe basic idea is that at startup time, for every field (i.e. every\nFieldDescriptor) we construct two functions:  a \"sizer\" and an \"encoder\".  The\nsizer takes a value of this field's type and computes its byte size.  The\nencoder takes a writer function and a value.  It encodes the value into byte\nstrings and invokes the writer function to write those strings.  Typically the\nwriter function is the write() method of a cStringIO.\n\nWe try to do as much work as possible when constructing the writer and the\nsizer rather than when calling them.  In particular:\n* We copy any needed global functions to local variables, so that we do not need\n  to do costly global table lookups at runtime.\n* Similarly, we try to do any attribute lookups at startup time if possible.\n* Every field's tag is encoded to bytes at startup, since it can't change at\n  runtime.\n* Whatever component of the field size we can compute at startup, we do.\n* We *avoid* sharing code if doing so would make the code slower and not sharing\n  does not burden us too much.  For example, encoders for repeated fields do\n  not just call the encoders for singular fields in a loop because this would\n  add an extra function call overhead for every loop iteration; instead, we\n  manually inline the single-value encoder into the loop.\n* If a Python function lacks a return statement, Python actually generates\n  instructions to pop the result of the last statement off the stack, push\n  None onto the stack, and then return that.  If we really don't care what\n  value is returned, then we can save two instructions by returning the\n  result of the last statement.  It looks funny but it helps.\n* We assume that type and bounds checking has happened at a higher level.\n\"\"\"\n\n__author__ = 'kenton@google.com (Kenton Varda)'\n\nimport struct\nfrom google.protobuf.internal import wire_format\n\n\n# This will overflow and thus become IEEE-754 \"infinity\".  We would use\n# \"float('inf')\" but it doesn't work on Windows pre-Python-2.6.\n_POS_INF = 1e10000\n_NEG_INF = -_POS_INF\n\n\ndef _VarintSize(value):\n  \"\"\"Compute the size of a varint value.\"\"\"\n  if value <= 0x7f: return 1\n  if value <= 0x3fff: return 2\n  if value <= 0x1fffff: return 3\n  if value <= 0xfffffff: return 4\n  if value <= 0x7ffffffff: return 5\n  if value <= 0x3ffffffffff: return 6\n  if value <= 0x1ffffffffffff: return 7\n  if value <= 0xffffffffffffff: return 8\n  if value <= 0x7fffffffffffffff: return 9\n  return 10\n\n\ndef _SignedVarintSize(value):\n  \"\"\"Compute the size of a signed varint value.\"\"\"\n  if value < 0: return 10\n  if value <= 0x7f: return 1\n  if value <= 0x3fff: return 2\n  if value <= 0x1fffff: return 3\n  if value <= 0xfffffff: return 4\n  if value <= 0x7ffffffff: return 5\n  if value <= 0x3ffffffffff: return 6\n  if value <= 0x1ffffffffffff: return 7\n  if value <= 0xffffffffffffff: return 8\n  if value <= 0x7fffffffffffffff: return 9\n  return 10\n\n\ndef _TagSize(field_number):\n  \"\"\"Returns the number of bytes required to serialize a tag with this field\n  number.\"\"\"\n  # Just pass in type 0, since the type won't affect the tag+type size.\n  return _VarintSize(wire_format.PackTag(field_number, 0))\n\n\n# --------------------------------------------------------------------\n# In this section we define some generic sizers.  Each of these functions\n# takes parameters specific to a particular field type, e.g. int32 or fixed64.\n# It returns another function which in turn takes parameters specific to a\n# particular field, e.g. the field number and whether it is repeated or packed.\n# Look at the next section to see how these are used.\n\n\ndef _SimpleSizer(compute_value_size):\n  \"\"\"A sizer which uses the function compute_value_size to compute the size of\n  each value.  Typically compute_value_size is _VarintSize.\"\"\"\n\n  def SpecificSizer(field_number, is_repeated, is_packed):\n    tag_size = _TagSize(field_number)\n    if is_packed:\n      local_VarintSize = _VarintSize\n      def PackedFieldSize(value):\n        result = 0\n        for element in value:\n          result += compute_value_size(element)\n        return result + local_VarintSize(result) + tag_size\n      return PackedFieldSize\n    elif is_repeated:\n      def RepeatedFieldSize(value):\n        result = tag_size * len(value)\n        for element in value:\n          result += compute_value_size(element)\n        return result\n      return RepeatedFieldSize\n    else:\n      def FieldSize(value):\n        return tag_size + compute_value_size(value)\n      return FieldSize\n\n  return SpecificSizer\n\n\ndef _ModifiedSizer(compute_value_size, modify_value):\n  \"\"\"Like SimpleSizer, but modify_value is invoked on each value before it is\n  passed to compute_value_size.  modify_value is typically ZigZagEncode.\"\"\"\n\n  def SpecificSizer(field_number, is_repeated, is_packed):\n    tag_size = _TagSize(field_number)\n    if is_packed:\n      local_VarintSize = _VarintSize\n      def PackedFieldSize(value):\n        result = 0\n        for element in value:\n          result += compute_value_size(modify_value(element))\n        return result + local_VarintSize(result) + tag_size\n      return PackedFieldSize\n    elif is_repeated:\n      def RepeatedFieldSize(value):\n        result = tag_size * len(value)\n        for element in value:\n          result += compute_value_size(modify_value(element))\n        return result\n      return RepeatedFieldSize\n    else:\n      def FieldSize(value):\n        return tag_size + compute_value_size(modify_value(value))\n      return FieldSize\n\n  return SpecificSizer\n\n\ndef _FixedSizer(value_size):\n  \"\"\"Like _SimpleSizer except for a fixed-size field.  The input is the size\n  of one value.\"\"\"\n\n  def SpecificSizer(field_number, is_repeated, is_packed):\n    tag_size = _TagSize(field_number)\n    if is_packed:\n      local_VarintSize = _VarintSize\n      def PackedFieldSize(value):\n        result = len(value) * value_size\n        return result + local_VarintSize(result) + tag_size\n      return PackedFieldSize\n    elif is_repeated:\n      element_size = value_size + tag_size\n      def RepeatedFieldSize(value):\n        return len(value) * element_size\n      return RepeatedFieldSize\n    else:\n      field_size = value_size + tag_size\n      def FieldSize(value):\n        return field_size\n      return FieldSize\n\n  return SpecificSizer\n\n\n# ====================================================================\n# Here we declare a sizer constructor for each field type.  Each \"sizer\n# constructor\" is a function that takes (field_number, is_repeated, is_packed)\n# as parameters and returns a sizer, which in turn takes a field value as\n# a parameter and returns its encoded size.\n\n\nInt32Sizer = Int64Sizer = EnumSizer = _SimpleSizer(_SignedVarintSize)\n\nUInt32Sizer = UInt64Sizer = _SimpleSizer(_VarintSize)\n\nSInt32Sizer = SInt64Sizer = _ModifiedSizer(\n    _SignedVarintSize, wire_format.ZigZagEncode)\n\nFixed32Sizer = SFixed32Sizer = FloatSizer  = _FixedSizer(4)\nFixed64Sizer = SFixed64Sizer = DoubleSizer = _FixedSizer(8)\n\nBoolSizer = _FixedSizer(1)\n\n\ndef StringSizer(field_number, is_repeated, is_packed):\n  \"\"\"Returns a sizer for a string field.\"\"\"\n\n  tag_size = _TagSize(field_number)\n  local_VarintSize = _VarintSize\n  local_len = len\n  assert not is_packed\n  if is_repeated:\n    def RepeatedFieldSize(value):\n      result = tag_size * len(value)\n      for element in value:\n        l = local_len(element.encode('utf-8'))\n        result += local_VarintSize(l) + l\n      return result\n    return RepeatedFieldSize\n  else:\n    def FieldSize(value):\n      l = local_len(value.encode('utf-8'))\n      return tag_size + local_VarintSize(l) + l\n    return FieldSize\n\n\ndef BytesSizer(field_number, is_repeated, is_packed):\n  \"\"\"Returns a sizer for a bytes field.\"\"\"\n\n  tag_size = _TagSize(field_number)\n  local_VarintSize = _VarintSize\n  local_len = len\n  assert not is_packed\n  if is_repeated:\n    def RepeatedFieldSize(value):\n      result = tag_size * len(value)\n      for element in value:\n        l = local_len(element)\n        result += local_VarintSize(l) + l\n      return result\n    return RepeatedFieldSize\n  else:\n    def FieldSize(value):\n      l = local_len(value)\n      return tag_size + local_VarintSize(l) + l\n    return FieldSize\n\n\ndef GroupSizer(field_number, is_repeated, is_packed):\n  \"\"\"Returns a sizer for a group field.\"\"\"\n\n  tag_size = _TagSize(field_number) * 2\n  assert not is_packed\n  if is_repeated:\n    def RepeatedFieldSize(value):\n      result = tag_size * len(value)\n      for element in value:\n        result += element.ByteSize()\n      return result\n    return RepeatedFieldSize\n  else:\n    def FieldSize(value):\n      return tag_size + value.ByteSize()\n    return FieldSize\n\n\ndef MessageSizer(field_number, is_repeated, is_packed):\n  \"\"\"Returns a sizer for a message field.\"\"\"\n\n  tag_size = _TagSize(field_number)\n  local_VarintSize = _VarintSize\n  assert not is_packed\n  if is_repeated:\n    def RepeatedFieldSize(value):\n      result = tag_size * len(value)\n      for element in value:\n        l = element.ByteSize()\n        result += local_VarintSize(l) + l\n      return result\n    return RepeatedFieldSize\n  else:\n    def FieldSize(value):\n      l = value.ByteSize()\n      return tag_size + local_VarintSize(l) + l\n    return FieldSize\n\n\n# --------------------------------------------------------------------\n# MessageSet is special.\n\n\ndef MessageSetItemSizer(field_number):\n  \"\"\"Returns a sizer for extensions of MessageSet.\n\n  The message set message looks like this:\n    message MessageSet {\n      repeated group Item = 1 {\n        required int32 type_id = 2;\n        required string message = 3;\n      }\n    }\n  \"\"\"\n  static_size = (_TagSize(1) * 2 + _TagSize(2) + _VarintSize(field_number) +\n                 _TagSize(3))\n  local_VarintSize = _VarintSize\n\n  def FieldSize(value):\n    l = value.ByteSize()\n    return static_size + local_VarintSize(l) + l\n\n  return FieldSize\n\n\n# ====================================================================\n# Encoders!\n\n\ndef _VarintEncoder():\n  \"\"\"Return an encoder for a basic varint value (does not include tag).\"\"\"\n\n  local_chr = chr\n  def EncodeVarint(write, value):\n    bits = value & 0x7f\n    value >>= 7\n    while value:\n      write(local_chr(0x80|bits))\n      bits = value & 0x7f\n      value >>= 7\n    return write(local_chr(bits))\n\n  return EncodeVarint\n\n\ndef _SignedVarintEncoder():\n  \"\"\"Return an encoder for a basic signed varint value (does not include\n  tag).\"\"\"\n\n  local_chr = chr\n  def EncodeSignedVarint(write, value):\n    if value < 0:\n      value += (1 << 64)\n    bits = value & 0x7f\n    value >>= 7\n    while value:\n      write(local_chr(0x80|bits))\n      bits = value & 0x7f\n      value >>= 7\n    return write(local_chr(bits))\n\n  return EncodeSignedVarint\n\n\n_EncodeVarint = _VarintEncoder()\n_EncodeSignedVarint = _SignedVarintEncoder()\n\n\ndef _VarintBytes(value):\n  \"\"\"Encode the given integer as a varint and return the bytes.  This is only\n  called at startup time so it doesn't need to be fast.\"\"\"\n\n  pieces = []\n  _EncodeVarint(pieces.append, value)\n  return \"\".join(pieces)\n\n\ndef TagBytes(field_number, wire_type):\n  \"\"\"Encode the given tag and return the bytes.  Only called at startup.\"\"\"\n\n  return _VarintBytes(wire_format.PackTag(field_number, wire_type))\n\n# --------------------------------------------------------------------\n# As with sizers (see above), we have a number of common encoder\n# implementations.\n\n\ndef _SimpleEncoder(wire_type, encode_value, compute_value_size):\n  \"\"\"Return a constructor for an encoder for fields of a particular type.\n\n  Args:\n      wire_type:  The field's wire type, for encoding tags.\n      encode_value:  A function which encodes an individual value, e.g.\n        _EncodeVarint().\n      compute_value_size:  A function which computes the size of an individual\n        value, e.g. _VarintSize().\n  \"\"\"\n\n  def SpecificEncoder(field_number, is_repeated, is_packed):\n    if is_packed:\n      tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)\n      local_EncodeVarint = _EncodeVarint\n      def EncodePackedField(write, value):\n        write(tag_bytes)\n        size = 0\n        for element in value:\n          size += compute_value_size(element)\n        local_EncodeVarint(write, size)\n        for element in value:\n          encode_value(write, element)\n      return EncodePackedField\n    elif is_repeated:\n      tag_bytes = TagBytes(field_number, wire_type)\n      def EncodeRepeatedField(write, value):\n        for element in value:\n          write(tag_bytes)\n          encode_value(write, element)\n      return EncodeRepeatedField\n    else:\n      tag_bytes = TagBytes(field_number, wire_type)\n      def EncodeField(write, value):\n        write(tag_bytes)\n        return encode_value(write, value)\n      return EncodeField\n\n  return SpecificEncoder\n\n\ndef _ModifiedEncoder(wire_type, encode_value, compute_value_size, modify_value):\n  \"\"\"Like SimpleEncoder but additionally invokes modify_value on every value\n  before passing it to encode_value.  Usually modify_value is ZigZagEncode.\"\"\"\n\n  def SpecificEncoder(field_number, is_repeated, is_packed):\n    if is_packed:\n      tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)\n      local_EncodeVarint = _EncodeVarint\n      def EncodePackedField(write, value):\n        write(tag_bytes)\n        size = 0\n        for element in value:\n          size += compute_value_size(modify_value(element))\n        local_EncodeVarint(write, size)\n        for element in value:\n          encode_value(write, modify_value(element))\n      return EncodePackedField\n    elif is_repeated:\n      tag_bytes = TagBytes(field_number, wire_type)\n      def EncodeRepeatedField(write, value):\n        for element in value:\n          write(tag_bytes)\n          encode_value(write, modify_value(element))\n      return EncodeRepeatedField\n    else:\n      tag_bytes = TagBytes(field_number, wire_type)\n      def EncodeField(write, value):\n        write(tag_bytes)\n        return encode_value(write, modify_value(value))\n      return EncodeField\n\n  return SpecificEncoder\n\n\ndef _StructPackEncoder(wire_type, format):\n  \"\"\"Return a constructor for an encoder for a fixed-width field.\n\n  Args:\n      wire_type:  The field's wire type, for encoding tags.\n      format:  The format string to pass to struct.pack().\n  \"\"\"\n\n  value_size = struct.calcsize(format)\n\n  def SpecificEncoder(field_number, is_repeated, is_packed):\n    local_struct_pack = struct.pack\n    if is_packed:\n      tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)\n      local_EncodeVarint = _EncodeVarint\n      def EncodePackedField(write, value):\n        write(tag_bytes)\n        local_EncodeVarint(write, len(value) * value_size)\n        for element in value:\n          write(local_struct_pack(format, element))\n      return EncodePackedField\n    elif is_repeated:\n      tag_bytes = TagBytes(field_number, wire_type)\n      def EncodeRepeatedField(write, value):\n        for element in value:\n          write(tag_bytes)\n          write(local_struct_pack(format, element))\n      return EncodeRepeatedField\n    else:\n      tag_bytes = TagBytes(field_number, wire_type)\n      def EncodeField(write, value):\n        write(tag_bytes)\n        return write(local_struct_pack(format, value))\n      return EncodeField\n\n  return SpecificEncoder\n\n\ndef _FloatingPointEncoder(wire_type, format):\n  \"\"\"Return a constructor for an encoder for float fields.\n\n  This is like StructPackEncoder, but catches errors that may be due to\n  passing non-finite floating-point values to struct.pack, and makes a\n  second attempt to encode those values.\n\n  Args:\n      wire_type:  The field's wire type, for encoding tags.\n      format:  The format string to pass to struct.pack().\n  \"\"\"\n\n  value_size = struct.calcsize(format)\n  if value_size == 4:\n    def EncodeNonFiniteOrRaise(write, value):\n      # Remember that the serialized form uses little-endian byte order.\n      if value == _POS_INF:\n        write('\\x00\\x00\\x80\\x7F')\n      elif value == _NEG_INF:\n        write('\\x00\\x00\\x80\\xFF')\n      elif value != value:           # NaN\n        write('\\x00\\x00\\xC0\\x7F')\n      else:\n        raise\n  elif value_size == 8:\n    def EncodeNonFiniteOrRaise(write, value):\n      if value == _POS_INF:\n        write('\\x00\\x00\\x00\\x00\\x00\\x00\\xF0\\x7F')\n      elif value == _NEG_INF:\n        write('\\x00\\x00\\x00\\x00\\x00\\x00\\xF0\\xFF')\n      elif value != value:                         # NaN\n        write('\\x00\\x00\\x00\\x00\\x00\\x00\\xF8\\x7F')\n      else:\n        raise\n  else:\n    raise ValueError('Can\\'t encode floating-point values that are '\n                     '%d bytes long (only 4 or 8)' % value_size)\n\n  def SpecificEncoder(field_number, is_repeated, is_packed):\n    local_struct_pack = struct.pack\n    if is_packed:\n      tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)\n      local_EncodeVarint = _EncodeVarint\n      def EncodePackedField(write, value):\n        write(tag_bytes)\n        local_EncodeVarint(write, len(value) * value_size)\n        for element in value:\n          # This try/except block is going to be faster than any code that\n          # we could write to check whether element is finite.\n          try:\n            write(local_struct_pack(format, element))\n          except SystemError:\n            EncodeNonFiniteOrRaise(write, element)\n      return EncodePackedField\n    elif is_repeated:\n      tag_bytes = TagBytes(field_number, wire_type)\n      def EncodeRepeatedField(write, value):\n        for element in value:\n          write(tag_bytes)\n          try:\n            write(local_struct_pack(format, element))\n          except SystemError:\n            EncodeNonFiniteOrRaise(write, element)\n      return EncodeRepeatedField\n    else:\n      tag_bytes = TagBytes(field_number, wire_type)\n      def EncodeField(write, value):\n        write(tag_bytes)\n        try:\n          write(local_struct_pack(format, value))\n        except SystemError:\n          EncodeNonFiniteOrRaise(write, value)\n      return EncodeField\n\n  return SpecificEncoder\n\n\n# ====================================================================\n# Here we declare an encoder constructor for each field type.  These work\n# very similarly to sizer constructors, described earlier.\n\n\nInt32Encoder = Int64Encoder = EnumEncoder = _SimpleEncoder(\n    wire_format.WIRETYPE_VARINT, _EncodeSignedVarint, _SignedVarintSize)\n\nUInt32Encoder = UInt64Encoder = _SimpleEncoder(\n    wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize)\n\nSInt32Encoder = SInt64Encoder = _ModifiedEncoder(\n    wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize,\n    wire_format.ZigZagEncode)\n\n# Note that Python conveniently guarantees that when using the '<' prefix on\n# formats, they will also have the same size across all platforms (as opposed\n# to without the prefix, where their sizes depend on the C compiler's basic\n# type sizes).\nFixed32Encoder  = _StructPackEncoder(wire_format.WIRETYPE_FIXED32, '<I')\nFixed64Encoder  = _StructPackEncoder(wire_format.WIRETYPE_FIXED64, '<Q')\nSFixed32Encoder = _StructPackEncoder(wire_format.WIRETYPE_FIXED32, '<i')\nSFixed64Encoder = _StructPackEncoder(wire_format.WIRETYPE_FIXED64, '<q')\nFloatEncoder    = _FloatingPointEncoder(wire_format.WIRETYPE_FIXED32, '<f')\nDoubleEncoder   = _FloatingPointEncoder(wire_format.WIRETYPE_FIXED64, '<d')\n\n\ndef BoolEncoder(field_number, is_repeated, is_packed):\n  \"\"\"Returns an encoder for a boolean field.\"\"\"\n\n  false_byte = chr(0)\n  true_byte = chr(1)\n  if is_packed:\n    tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)\n    local_EncodeVarint = _EncodeVarint\n    def EncodePackedField(write, value):\n      write(tag_bytes)\n      local_EncodeVarint(write, len(value))\n      for element in value:\n        if element:\n          write(true_byte)\n        else:\n          write(false_byte)\n    return EncodePackedField\n  elif is_repeated:\n    tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_VARINT)\n    def EncodeRepeatedField(write, value):\n      for element in value:\n        write(tag_bytes)\n        if element:\n          write(true_byte)\n        else:\n          write(false_byte)\n    return EncodeRepeatedField\n  else:\n    tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_VARINT)\n    def EncodeField(write, value):\n      write(tag_bytes)\n      if value:\n        return write(true_byte)\n      return write(false_byte)\n    return EncodeField\n\n\ndef StringEncoder(field_number, is_repeated, is_packed):\n  \"\"\"Returns an encoder for a string field.\"\"\"\n\n  tag = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)\n  local_EncodeVarint = _EncodeVarint\n  local_len = len\n  assert not is_packed\n  if is_repeated:\n    def EncodeRepeatedField(write, value):\n      for element in value:\n        encoded = element.encode('utf-8')\n        write(tag)\n        local_EncodeVarint(write, local_len(encoded))\n        write(encoded)\n    return EncodeRepeatedField\n  else:\n    def EncodeField(write, value):\n      encoded = value.encode('utf-8')\n      write(tag)\n      local_EncodeVarint(write, local_len(encoded))\n      return write(encoded)\n    return EncodeField\n\n\ndef BytesEncoder(field_number, is_repeated, is_packed):\n  \"\"\"Returns an encoder for a bytes field.\"\"\"\n\n  tag = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)\n  local_EncodeVarint = _EncodeVarint\n  local_len = len\n  assert not is_packed\n  if is_repeated:\n    def EncodeRepeatedField(write, value):\n      for element in value:\n        write(tag)\n        local_EncodeVarint(write, local_len(element))\n        write(element)\n    return EncodeRepeatedField\n  else:\n    def EncodeField(write, value):\n      write(tag)\n      local_EncodeVarint(write, local_len(value))\n      return write(value)\n    return EncodeField\n\n\ndef GroupEncoder(field_number, is_repeated, is_packed):\n  \"\"\"Returns an encoder for a group field.\"\"\"\n\n  start_tag = TagBytes(field_number, wire_format.WIRETYPE_START_GROUP)\n  end_tag = TagBytes(field_number, wire_format.WIRETYPE_END_GROUP)\n  assert not is_packed\n  if is_repeated:\n    def EncodeRepeatedField(write, value):\n      for element in value:\n        write(start_tag)\n        element._InternalSerialize(write)\n        write(end_tag)\n    return EncodeRepeatedField\n  else:\n    def EncodeField(write, value):\n      write(start_tag)\n      value._InternalSerialize(write)\n      return write(end_tag)\n    return EncodeField\n\n\ndef MessageEncoder(field_number, is_repeated, is_packed):\n  \"\"\"Returns an encoder for a message field.\"\"\"\n\n  tag = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)\n  local_EncodeVarint = _EncodeVarint\n  assert not is_packed\n  if is_repeated:\n    def EncodeRepeatedField(write, value):\n      for element in value:\n        write(tag)\n        local_EncodeVarint(write, element.ByteSize())\n        element._InternalSerialize(write)\n    return EncodeRepeatedField\n  else:\n    def EncodeField(write, value):\n      write(tag)\n      local_EncodeVarint(write, value.ByteSize())\n      return value._InternalSerialize(write)\n    return EncodeField\n\n\n# --------------------------------------------------------------------\n# As before, MessageSet is special.\n\n\ndef MessageSetItemEncoder(field_number):\n  \"\"\"Encoder for extensions of MessageSet.\n\n  The message set message looks like this:\n    message MessageSet {\n      repeated group Item = 1 {\n        required int32 type_id = 2;\n        required string message = 3;\n      }\n    }\n  \"\"\"\n  start_bytes = \"\".join([\n      TagBytes(1, wire_format.WIRETYPE_START_GROUP),\n      TagBytes(2, wire_format.WIRETYPE_VARINT),\n      _VarintBytes(field_number),\n      TagBytes(3, wire_format.WIRETYPE_LENGTH_DELIMITED)])\n  end_bytes = TagBytes(1, wire_format.WIRETYPE_END_GROUP)\n  local_EncodeVarint = _EncodeVarint\n\n  def EncodeField(write, value):\n    write(start_bytes)\n    local_EncodeVarint(write, value.ByteSize())\n    value._InternalSerialize(write)\n    return write(end_bytes)\n\n  return EncodeField\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/generator_test.py",
    "content": "#! /usr/bin/python\n#\n# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# TODO(robinson): Flesh this out considerably.  We focused on reflection_test.py\n# first, since it's testing the subtler code, and since it provides decent\n# indirect testing of the protocol compiler output.\n\n\"\"\"Unittest that directly tests the output of the pure-Python protocol\ncompiler.  See //google/protobuf/reflection_test.py for a test which\nfurther ensures that we can use Python protocol message objects as we expect.\n\"\"\"\n\n__author__ = 'robinson@google.com (Will Robinson)'\n\nimport unittest\nfrom google.protobuf import unittest_custom_options_pb2\nfrom google.protobuf import unittest_import_pb2\nfrom google.protobuf import unittest_mset_pb2\nfrom google.protobuf import unittest_pb2\nfrom google.protobuf import unittest_no_generic_services_pb2\nfrom google.protobuf import service\n\nMAX_EXTENSION = 536870912\n\n\nclass GeneratorTest(unittest.TestCase):\n\n  def testNestedMessageDescriptor(self):\n    field_name = 'optional_nested_message'\n    proto_type = unittest_pb2.TestAllTypes\n    self.assertEqual(\n        proto_type.NestedMessage.DESCRIPTOR,\n        proto_type.DESCRIPTOR.fields_by_name[field_name].message_type)\n\n  def testEnums(self):\n    # We test only module-level enums here.\n    # TODO(robinson): Examine descriptors directly to check\n    # enum descriptor output.\n    self.assertEqual(4, unittest_pb2.FOREIGN_FOO)\n    self.assertEqual(5, unittest_pb2.FOREIGN_BAR)\n    self.assertEqual(6, unittest_pb2.FOREIGN_BAZ)\n\n    proto = unittest_pb2.TestAllTypes()\n    self.assertEqual(1, proto.FOO)\n    self.assertEqual(1, unittest_pb2.TestAllTypes.FOO)\n    self.assertEqual(2, proto.BAR)\n    self.assertEqual(2, unittest_pb2.TestAllTypes.BAR)\n    self.assertEqual(3, proto.BAZ)\n    self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ)\n\n  def testExtremeDefaultValues(self):\n    message = unittest_pb2.TestExtremeDefaultValues()\n\n    # Python pre-2.6 does not have isinf() or isnan() functions, so we have\n    # to provide our own.\n    def isnan(val):\n      # NaN is never equal to itself.\n      return val != val\n    def isinf(val):\n      # Infinity times zero equals NaN.\n      return not isnan(val) and isnan(val * 0)\n\n    self.assertTrue(isinf(message.inf_double))\n    self.assertTrue(message.inf_double > 0)\n    self.assertTrue(isinf(message.neg_inf_double))\n    self.assertTrue(message.neg_inf_double < 0)\n    self.assertTrue(isnan(message.nan_double))\n\n    self.assertTrue(isinf(message.inf_float))\n    self.assertTrue(message.inf_float > 0)\n    self.assertTrue(isinf(message.neg_inf_float))\n    self.assertTrue(message.neg_inf_float < 0)\n    self.assertTrue(isnan(message.nan_float))\n    self.assertEqual(\"? ? ?? ?? ??? ??/ ??-\", message.cpp_trigraph)\n\n  def testHasDefaultValues(self):\n    desc = unittest_pb2.TestAllTypes.DESCRIPTOR\n\n    expected_has_default_by_name = {\n        'optional_int32': False,\n        'repeated_int32': False,\n        'optional_nested_message': False,\n        'default_int32': True,\n    }\n\n    has_default_by_name = dict(\n        [(f.name, f.has_default_value)\n         for f in desc.fields\n         if f.name in expected_has_default_by_name])\n    self.assertEqual(expected_has_default_by_name, has_default_by_name)\n\n  def testContainingTypeBehaviorForExtensions(self):\n    self.assertEqual(unittest_pb2.optional_int32_extension.containing_type,\n                     unittest_pb2.TestAllExtensions.DESCRIPTOR)\n    self.assertEqual(unittest_pb2.TestRequired.single.containing_type,\n                     unittest_pb2.TestAllExtensions.DESCRIPTOR)\n\n  def testExtensionScope(self):\n    self.assertEqual(unittest_pb2.optional_int32_extension.extension_scope,\n                     None)\n    self.assertEqual(unittest_pb2.TestRequired.single.extension_scope,\n                     unittest_pb2.TestRequired.DESCRIPTOR)\n\n  def testIsExtension(self):\n    self.assertTrue(unittest_pb2.optional_int32_extension.is_extension)\n    self.assertTrue(unittest_pb2.TestRequired.single.is_extension)\n\n    message_descriptor = unittest_pb2.TestRequired.DESCRIPTOR\n    non_extension_descriptor = message_descriptor.fields_by_name['a']\n    self.assertTrue(not non_extension_descriptor.is_extension)\n\n  def testOptions(self):\n    proto = unittest_mset_pb2.TestMessageSet()\n    self.assertTrue(proto.DESCRIPTOR.GetOptions().message_set_wire_format)\n\n  def testMessageWithCustomOptions(self):\n    proto = unittest_custom_options_pb2.TestMessageWithCustomOptions()\n    enum_options = proto.DESCRIPTOR.enum_types_by_name['AnEnum'].GetOptions()\n    self.assertTrue(enum_options is not None)\n    # TODO(gps): We really should test for the presense of the enum_opt1\n    # extension and for its value to be set to -789.\n\n  def testNestedTypes(self):\n    self.assertEquals(\n        set(unittest_pb2.TestAllTypes.DESCRIPTOR.nested_types),\n        set([\n            unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR,\n            unittest_pb2.TestAllTypes.OptionalGroup.DESCRIPTOR,\n            unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR,\n        ]))\n    self.assertEqual(unittest_pb2.TestEmptyMessage.DESCRIPTOR.nested_types, [])\n    self.assertEqual(\n        unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.nested_types, [])\n\n  def testContainingType(self):\n    self.assertTrue(\n        unittest_pb2.TestEmptyMessage.DESCRIPTOR.containing_type is None)\n    self.assertTrue(\n        unittest_pb2.TestAllTypes.DESCRIPTOR.containing_type is None)\n    self.assertEqual(\n        unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type,\n        unittest_pb2.TestAllTypes.DESCRIPTOR)\n    self.assertEqual(\n        unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type,\n        unittest_pb2.TestAllTypes.DESCRIPTOR)\n    self.assertEqual(\n        unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR.containing_type,\n        unittest_pb2.TestAllTypes.DESCRIPTOR)\n\n  def testContainingTypeInEnumDescriptor(self):\n    self.assertTrue(unittest_pb2._FOREIGNENUM.containing_type is None)\n    self.assertEqual(unittest_pb2._TESTALLTYPES_NESTEDENUM.containing_type,\n                     unittest_pb2.TestAllTypes.DESCRIPTOR)\n\n  def testPackage(self):\n    self.assertEqual(\n        unittest_pb2.TestAllTypes.DESCRIPTOR.file.package,\n        'protobuf_unittest')\n    desc = unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR\n    self.assertEqual(desc.file.package, 'protobuf_unittest')\n    self.assertEqual(\n        unittest_import_pb2.ImportMessage.DESCRIPTOR.file.package,\n        'protobuf_unittest_import')\n\n    self.assertEqual(\n        unittest_pb2._FOREIGNENUM.file.package, 'protobuf_unittest')\n    self.assertEqual(\n        unittest_pb2._TESTALLTYPES_NESTEDENUM.file.package,\n        'protobuf_unittest')\n    self.assertEqual(\n        unittest_import_pb2._IMPORTENUM.file.package,\n        'protobuf_unittest_import')\n\n  def testExtensionRange(self):\n    self.assertEqual(\n        unittest_pb2.TestAllTypes.DESCRIPTOR.extension_ranges, [])\n    self.assertEqual(\n        unittest_pb2.TestAllExtensions.DESCRIPTOR.extension_ranges,\n        [(1, MAX_EXTENSION)])\n    self.assertEqual(\n        unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR.extension_ranges,\n        [(42, 43), (4143, 4244), (65536, MAX_EXTENSION)])\n\n  def testFileDescriptor(self):\n    self.assertEqual(unittest_pb2.DESCRIPTOR.name,\n                     'google/protobuf/unittest.proto')\n    self.assertEqual(unittest_pb2.DESCRIPTOR.package, 'protobuf_unittest')\n    self.assertFalse(unittest_pb2.DESCRIPTOR.serialized_pb is None)\n\n  def testNoGenericServices(self):\n    self.assertTrue(hasattr(unittest_no_generic_services_pb2, \"TestMessage\"))\n    self.assertTrue(hasattr(unittest_no_generic_services_pb2, \"FOO\"))\n    self.assertTrue(hasattr(unittest_no_generic_services_pb2, \"test_extension\"))\n\n    # Make sure unittest_no_generic_services_pb2 has no services subclassing\n    # Proto2 Service class.\n    if hasattr(unittest_no_generic_services_pb2, \"TestService\"):\n      self.assertFalse(issubclass(unittest_no_generic_services_pb2.TestService,\n                                  service.Service))\n\n  def testMessageTypesByName(self):\n    file_type = unittest_pb2.DESCRIPTOR\n    self.assertEqual(\n        unittest_pb2._TESTALLTYPES,\n        file_type.message_types_by_name[unittest_pb2._TESTALLTYPES.name])\n\n    # Nested messages shouldn't be included in the message_types_by_name\n    # dictionary (like in the C++ API).\n    self.assertFalse(\n        unittest_pb2._TESTALLTYPES_NESTEDMESSAGE.name in\n        file_type.message_types_by_name)\n\n\nif __name__ == '__main__':\n  unittest.main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_listener.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Defines a listener interface for observing certain\nstate transitions on Message objects.\n\nAlso defines a null implementation of this interface.\n\"\"\"\n\n__author__ = 'robinson@google.com (Will Robinson)'\n\n\nclass MessageListener(object):\n\n  \"\"\"Listens for modifications made to a message.  Meant to be registered via\n  Message._SetListener().\n\n  Attributes:\n    dirty:  If True, then calling Modified() would be a no-op.  This can be\n            used to avoid these calls entirely in the common case.\n  \"\"\"\n\n  def Modified(self):\n    \"\"\"Called every time the message is modified in such a way that the parent\n    message may need to be updated.  This currently means either:\n    (a) The message was modified for the first time, so the parent message\n        should henceforth mark the message as present.\n    (b) The message's cached byte size became dirty -- i.e. the message was\n        modified for the first time after a previous call to ByteSize().\n        Therefore the parent should also mark its byte size as dirty.\n    Note that (a) implies (b), since new objects start out with a client cached\n    size (zero).  However, we document (a) explicitly because it is important.\n\n    Modified() will *only* be called in response to one of these two events --\n    not every time the sub-message is modified.\n\n    Note that if the listener's |dirty| attribute is true, then calling\n    Modified at the moment would be a no-op, so it can be skipped.  Performance-\n    sensitive callers should check this attribute directly before calling since\n    it will be true most of the time.\n    \"\"\"\n\n    raise NotImplementedError\n\n\nclass NullMessageListener(object):\n\n  \"\"\"No-op MessageListener implementation.\"\"\"\n\n  def Modified(self):\n    pass\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_test.py",
    "content": "#! /usr/bin/python\n#\n# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Tests python protocol buffers against the golden message.\n\nNote that the golden messages exercise every known field type, thus this\ntest ends up exercising and verifying nearly all of the parsing and\nserialization code in the whole library.\n\nTODO(kenton):  Merge with wire_format_test?  It doesn't make a whole lot of\nsense to call this a test of the \"message\" module, which only declares an\nabstract interface.\n\"\"\"\n\n__author__ = 'gps@google.com (Gregory P. Smith)'\n\nimport copy\nimport math\nimport unittest\nfrom google.protobuf import unittest_import_pb2\nfrom google.protobuf import unittest_pb2\nfrom google.protobuf.internal import test_util\n\n# Python pre-2.6 does not have isinf() or isnan() functions, so we have\n# to provide our own.\ndef isnan(val):\n  # NaN is never equal to itself.\n  return val != val\ndef isinf(val):\n  # Infinity times zero equals NaN.\n  return not isnan(val) and isnan(val * 0)\ndef IsPosInf(val):\n  return isinf(val) and (val > 0)\ndef IsNegInf(val):\n  return isinf(val) and (val < 0)\n\nclass MessageTest(unittest.TestCase):\n\n  def testGoldenMessage(self):\n    golden_data = test_util.GoldenFile('golden_message').read()\n    golden_message = unittest_pb2.TestAllTypes()\n    golden_message.ParseFromString(golden_data)\n    test_util.ExpectAllFieldsSet(self, golden_message)\n    self.assertTrue(golden_message.SerializeToString() == golden_data)\n    golden_copy = copy.deepcopy(golden_message)\n    self.assertTrue(golden_copy.SerializeToString() == golden_data)\n\n  def testGoldenExtensions(self):\n    golden_data = test_util.GoldenFile('golden_message').read()\n    golden_message = unittest_pb2.TestAllExtensions()\n    golden_message.ParseFromString(golden_data)\n    all_set = unittest_pb2.TestAllExtensions()\n    test_util.SetAllExtensions(all_set)\n    self.assertEquals(all_set, golden_message)\n    self.assertTrue(golden_message.SerializeToString() == golden_data)\n    golden_copy = copy.deepcopy(golden_message)\n    self.assertTrue(golden_copy.SerializeToString() == golden_data)\n\n  def testGoldenPackedMessage(self):\n    golden_data = test_util.GoldenFile('golden_packed_fields_message').read()\n    golden_message = unittest_pb2.TestPackedTypes()\n    golden_message.ParseFromString(golden_data)\n    all_set = unittest_pb2.TestPackedTypes()\n    test_util.SetAllPackedFields(all_set)\n    self.assertEquals(all_set, golden_message)\n    self.assertTrue(all_set.SerializeToString() == golden_data)\n    golden_copy = copy.deepcopy(golden_message)\n    self.assertTrue(golden_copy.SerializeToString() == golden_data)\n\n  def testGoldenPackedExtensions(self):\n    golden_data = test_util.GoldenFile('golden_packed_fields_message').read()\n    golden_message = unittest_pb2.TestPackedExtensions()\n    golden_message.ParseFromString(golden_data)\n    all_set = unittest_pb2.TestPackedExtensions()\n    test_util.SetAllPackedExtensions(all_set)\n    self.assertEquals(all_set, golden_message)\n    self.assertTrue(all_set.SerializeToString() == golden_data)\n    golden_copy = copy.deepcopy(golden_message)\n    self.assertTrue(golden_copy.SerializeToString() == golden_data)\n\n  def testPositiveInfinity(self):\n    golden_data = ('\\x5D\\x00\\x00\\x80\\x7F'\n                   '\\x61\\x00\\x00\\x00\\x00\\x00\\x00\\xF0\\x7F'\n                   '\\xCD\\x02\\x00\\x00\\x80\\x7F'\n                   '\\xD1\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\xF0\\x7F')\n    golden_message = unittest_pb2.TestAllTypes()\n    golden_message.ParseFromString(golden_data)\n    self.assertTrue(IsPosInf(golden_message.optional_float))\n    self.assertTrue(IsPosInf(golden_message.optional_double))\n    self.assertTrue(IsPosInf(golden_message.repeated_float[0]))\n    self.assertTrue(IsPosInf(golden_message.repeated_double[0]))\n    self.assertTrue(golden_message.SerializeToString() == golden_data)\n\n  def testNegativeInfinity(self):\n    golden_data = ('\\x5D\\x00\\x00\\x80\\xFF'\n                   '\\x61\\x00\\x00\\x00\\x00\\x00\\x00\\xF0\\xFF'\n                   '\\xCD\\x02\\x00\\x00\\x80\\xFF'\n                   '\\xD1\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\xF0\\xFF')\n    golden_message = unittest_pb2.TestAllTypes()\n    golden_message.ParseFromString(golden_data)\n    self.assertTrue(IsNegInf(golden_message.optional_float))\n    self.assertTrue(IsNegInf(golden_message.optional_double))\n    self.assertTrue(IsNegInf(golden_message.repeated_float[0]))\n    self.assertTrue(IsNegInf(golden_message.repeated_double[0]))\n    self.assertTrue(golden_message.SerializeToString() == golden_data)\n\n  def testNotANumber(self):\n    golden_data = ('\\x5D\\x00\\x00\\xC0\\x7F'\n                   '\\x61\\x00\\x00\\x00\\x00\\x00\\x00\\xF8\\x7F'\n                   '\\xCD\\x02\\x00\\x00\\xC0\\x7F'\n                   '\\xD1\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\xF8\\x7F')\n    golden_message = unittest_pb2.TestAllTypes()\n    golden_message.ParseFromString(golden_data)\n    self.assertTrue(isnan(golden_message.optional_float))\n    self.assertTrue(isnan(golden_message.optional_double))\n    self.assertTrue(isnan(golden_message.repeated_float[0]))\n    self.assertTrue(isnan(golden_message.repeated_double[0]))\n    self.assertTrue(golden_message.SerializeToString() == golden_data)\n\n  def testPositiveInfinityPacked(self):\n    golden_data = ('\\xA2\\x06\\x04\\x00\\x00\\x80\\x7F'\n                   '\\xAA\\x06\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xF0\\x7F')\n    golden_message = unittest_pb2.TestPackedTypes()\n    golden_message.ParseFromString(golden_data)\n    self.assertTrue(IsPosInf(golden_message.packed_float[0]))\n    self.assertTrue(IsPosInf(golden_message.packed_double[0]))\n    self.assertTrue(golden_message.SerializeToString() == golden_data)\n\n  def testNegativeInfinityPacked(self):\n    golden_data = ('\\xA2\\x06\\x04\\x00\\x00\\x80\\xFF'\n                   '\\xAA\\x06\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xF0\\xFF')\n    golden_message = unittest_pb2.TestPackedTypes()\n    golden_message.ParseFromString(golden_data)\n    self.assertTrue(IsNegInf(golden_message.packed_float[0]))\n    self.assertTrue(IsNegInf(golden_message.packed_double[0]))\n    self.assertTrue(golden_message.SerializeToString() == golden_data)\n\n  def testNotANumberPacked(self):\n    golden_data = ('\\xA2\\x06\\x04\\x00\\x00\\xC0\\x7F'\n                   '\\xAA\\x06\\x08\\x00\\x00\\x00\\x00\\x00\\x00\\xF8\\x7F')\n    golden_message = unittest_pb2.TestPackedTypes()\n    golden_message.ParseFromString(golden_data)\n    self.assertTrue(isnan(golden_message.packed_float[0]))\n    self.assertTrue(isnan(golden_message.packed_double[0]))\n    self.assertTrue(golden_message.SerializeToString() == golden_data)\n\n  def testExtremeFloatValues(self):\n    message = unittest_pb2.TestAllTypes()\n\n    # Most positive exponent, no significand bits set.\n    kMostPosExponentNoSigBits = math.pow(2, 127)\n    message.optional_float = kMostPosExponentNoSigBits\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_float == kMostPosExponentNoSigBits)\n\n    # Most positive exponent, one significand bit set.\n    kMostPosExponentOneSigBit = 1.5 * math.pow(2, 127)\n    message.optional_float = kMostPosExponentOneSigBit\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_float == kMostPosExponentOneSigBit)\n\n    # Repeat last two cases with values of same magnitude, but negative.\n    message.optional_float = -kMostPosExponentNoSigBits\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_float == -kMostPosExponentNoSigBits)\n\n    message.optional_float = -kMostPosExponentOneSigBit\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_float == -kMostPosExponentOneSigBit)\n\n    # Most negative exponent, no significand bits set.\n    kMostNegExponentNoSigBits = math.pow(2, -127)\n    message.optional_float = kMostNegExponentNoSigBits\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_float == kMostNegExponentNoSigBits)\n\n    # Most negative exponent, one significand bit set.\n    kMostNegExponentOneSigBit = 1.5 * math.pow(2, -127)\n    message.optional_float = kMostNegExponentOneSigBit\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_float == kMostNegExponentOneSigBit)\n\n    # Repeat last two cases with values of the same magnitude, but negative.\n    message.optional_float = -kMostNegExponentNoSigBits\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_float == -kMostNegExponentNoSigBits)\n\n    message.optional_float = -kMostNegExponentOneSigBit\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_float == -kMostNegExponentOneSigBit)\n\n  def testExtremeFloatValues(self):\n    message = unittest_pb2.TestAllTypes()\n\n    # Most positive exponent, no significand bits set.\n    kMostPosExponentNoSigBits = math.pow(2, 1023)\n    message.optional_double = kMostPosExponentNoSigBits\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_double == kMostPosExponentNoSigBits)\n\n    # Most positive exponent, one significand bit set.\n    kMostPosExponentOneSigBit = 1.5 * math.pow(2, 1023)\n    message.optional_double = kMostPosExponentOneSigBit\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_double == kMostPosExponentOneSigBit)\n\n    # Repeat last two cases with values of same magnitude, but negative.\n    message.optional_double = -kMostPosExponentNoSigBits\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_double == -kMostPosExponentNoSigBits)\n\n    message.optional_double = -kMostPosExponentOneSigBit\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_double == -kMostPosExponentOneSigBit)\n\n    # Most negative exponent, no significand bits set.\n    kMostNegExponentNoSigBits = math.pow(2, -1023)\n    message.optional_double = kMostNegExponentNoSigBits\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_double == kMostNegExponentNoSigBits)\n\n    # Most negative exponent, one significand bit set.\n    kMostNegExponentOneSigBit = 1.5 * math.pow(2, -1023)\n    message.optional_double = kMostNegExponentOneSigBit\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_double == kMostNegExponentOneSigBit)\n\n    # Repeat last two cases with values of the same magnitude, but negative.\n    message.optional_double = -kMostNegExponentNoSigBits\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_double == -kMostNegExponentNoSigBits)\n\n    message.optional_double = -kMostNegExponentOneSigBit\n    message.ParseFromString(message.SerializeToString())\n    self.assertTrue(message.optional_double == -kMostNegExponentOneSigBit)\n\n  def testSortingRepeatedScalarFieldsDefaultComparator(self):\n    \"\"\"Check some different types with the default comparator.\"\"\"\n    message = unittest_pb2.TestAllTypes()\n\n    # TODO(mattp): would testing more scalar types strengthen test?\n    message.repeated_int32.append(1)\n    message.repeated_int32.append(3)\n    message.repeated_int32.append(2)\n    message.repeated_int32.sort()\n    self.assertEqual(message.repeated_int32[0], 1)\n    self.assertEqual(message.repeated_int32[1], 2)\n    self.assertEqual(message.repeated_int32[2], 3)\n\n    message.repeated_float.append(1.1)\n    message.repeated_float.append(1.3)\n    message.repeated_float.append(1.2)\n    message.repeated_float.sort()\n    self.assertAlmostEqual(message.repeated_float[0], 1.1)\n    self.assertAlmostEqual(message.repeated_float[1], 1.2)\n    self.assertAlmostEqual(message.repeated_float[2], 1.3)\n\n    message.repeated_string.append('a')\n    message.repeated_string.append('c')\n    message.repeated_string.append('b')\n    message.repeated_string.sort()\n    self.assertEqual(message.repeated_string[0], 'a')\n    self.assertEqual(message.repeated_string[1], 'b')\n    self.assertEqual(message.repeated_string[2], 'c')\n\n    message.repeated_bytes.append('a')\n    message.repeated_bytes.append('c')\n    message.repeated_bytes.append('b')\n    message.repeated_bytes.sort()\n    self.assertEqual(message.repeated_bytes[0], 'a')\n    self.assertEqual(message.repeated_bytes[1], 'b')\n    self.assertEqual(message.repeated_bytes[2], 'c')\n\n  def testSortingRepeatedScalarFieldsCustomComparator(self):\n    \"\"\"Check some different types with custom comparator.\"\"\"\n    message = unittest_pb2.TestAllTypes()\n\n    message.repeated_int32.append(-3)\n    message.repeated_int32.append(-2)\n    message.repeated_int32.append(-1)\n    message.repeated_int32.sort(lambda x,y: cmp(abs(x), abs(y)))\n    self.assertEqual(message.repeated_int32[0], -1)\n    self.assertEqual(message.repeated_int32[1], -2)\n    self.assertEqual(message.repeated_int32[2], -3)\n\n    message.repeated_string.append('aaa')\n    message.repeated_string.append('bb')\n    message.repeated_string.append('c')\n    message.repeated_string.sort(lambda x,y: cmp(len(x), len(y)))\n    self.assertEqual(message.repeated_string[0], 'c')\n    self.assertEqual(message.repeated_string[1], 'bb')\n    self.assertEqual(message.repeated_string[2], 'aaa')\n\n  def testSortingRepeatedCompositeFieldsCustomComparator(self):\n    \"\"\"Check passing a custom comparator to sort a repeated composite field.\"\"\"\n    message = unittest_pb2.TestAllTypes()\n\n    message.repeated_nested_message.add().bb = 1\n    message.repeated_nested_message.add().bb = 3\n    message.repeated_nested_message.add().bb = 2\n    message.repeated_nested_message.add().bb = 6\n    message.repeated_nested_message.add().bb = 5\n    message.repeated_nested_message.add().bb = 4\n    message.repeated_nested_message.sort(lambda x,y: cmp(x.bb, y.bb))\n    self.assertEqual(message.repeated_nested_message[0].bb, 1)\n    self.assertEqual(message.repeated_nested_message[1].bb, 2)\n    self.assertEqual(message.repeated_nested_message[2].bb, 3)\n    self.assertEqual(message.repeated_nested_message[3].bb, 4)\n    self.assertEqual(message.repeated_nested_message[4].bb, 5)\n    self.assertEqual(message.repeated_nested_message[5].bb, 6)\n\n\nif __name__ == '__main__':\n  unittest.main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_extensions.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: robinson@google.com (Will Robinson)\n\n\npackage google.protobuf.internal;\n\n\nmessage TopLevelMessage {\n  optional ExtendedMessage submessage = 1;\n}\n\n\nmessage ExtendedMessage {\n  extensions 1 to max;\n}\n\n\nmessage ForeignMessage {\n  optional int32 foreign_message_int = 1;\n}\n\n\nextend ExtendedMessage {\n  optional int32 optional_int_extension = 1;\n  optional ForeignMessage optional_message_extension = 2;\n\n  repeated int32 repeated_int_extension = 3;\n  repeated ForeignMessage repeated_message_extension = 4;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_messages.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: robinson@google.com (Will Robinson)\n\n\npackage google.protobuf.internal;\n\n// A message where tag numbers are listed out of order, to allow us to test our\n// canonicalization of serialized output, which should always be in tag order.\n// We also mix in some extensions for extra fun.\nmessage OutOfOrderFields {\n  optional   sint32 optional_sint32   =  5;\n  extensions 4 to 4;\n  optional   uint32 optional_uint32   =  3;\n  extensions 2 to 2;\n  optional    int32 optional_int32    =  1;\n};\n\n\nextend OutOfOrderFields {\n  optional   uint64 optional_uint64   =  4;\n  optional    int64 optional_int64    =  2;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/python_message.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# This code is meant to work on Python 2.4 and above only.\n#\n# TODO(robinson): Helpers for verbose, common checks like seeing if a\n# descriptor's cpp_type is CPPTYPE_MESSAGE.\n\n\"\"\"Contains a metaclass and helper functions used to create\nprotocol message classes from Descriptor objects at runtime.\n\nRecall that a metaclass is the \"type\" of a class.\n(A class is to a metaclass what an instance is to a class.)\n\nIn this case, we use the GeneratedProtocolMessageType metaclass\nto inject all the useful functionality into the classes\noutput by the protocol compiler at compile-time.\n\nThe upshot of all this is that the real implementation\ndetails for ALL pure-Python protocol buffers are *here in\nthis file*.\n\"\"\"\n\n__author__ = 'robinson@google.com (Will Robinson)'\n\ntry:\n  from cStringIO import StringIO\nexcept ImportError:\n  from StringIO import StringIO\nimport struct\nimport weakref\n\n# We use \"as\" to avoid name collisions with variables.\nfrom google.protobuf.internal import containers\nfrom google.protobuf.internal import decoder\nfrom google.protobuf.internal import encoder\nfrom google.protobuf.internal import message_listener as message_listener_mod\nfrom google.protobuf.internal import type_checkers\nfrom google.protobuf.internal import wire_format\nfrom google.protobuf import descriptor as descriptor_mod\nfrom google.protobuf import message as message_mod\nfrom google.protobuf import text_format\n\n_FieldDescriptor = descriptor_mod.FieldDescriptor\n\n\ndef NewMessage(descriptor, dictionary):\n  _AddClassAttributesForNestedExtensions(descriptor, dictionary)\n  _AddSlots(descriptor, dictionary)\n\n\ndef InitMessage(descriptor, cls):\n  cls._decoders_by_tag = {}\n  cls._extensions_by_name = {}\n  cls._extensions_by_number = {}\n  if (descriptor.has_options and\n      descriptor.GetOptions().message_set_wire_format):\n    cls._decoders_by_tag[decoder.MESSAGE_SET_ITEM_TAG] = (\n        decoder.MessageSetItemDecoder(cls._extensions_by_number))\n\n  # Attach stuff to each FieldDescriptor for quick lookup later on.\n  for field in descriptor.fields:\n    _AttachFieldHelpers(cls, field)\n\n  _AddEnumValues(descriptor, cls)\n  _AddInitMethod(descriptor, cls)\n  _AddPropertiesForFields(descriptor, cls)\n  _AddPropertiesForExtensions(descriptor, cls)\n  _AddStaticMethods(cls)\n  _AddMessageMethods(descriptor, cls)\n  _AddPrivateHelperMethods(cls)\n\n\n# Stateless helpers for GeneratedProtocolMessageType below.\n# Outside clients should not access these directly.\n#\n# I opted not to make any of these methods on the metaclass, to make it more\n# clear that I'm not really using any state there and to keep clients from\n# thinking that they have direct access to these construction helpers.\n\n\ndef _PropertyName(proto_field_name):\n  \"\"\"Returns the name of the public property attribute which\n  clients can use to get and (in some cases) set the value\n  of a protocol message field.\n\n  Args:\n    proto_field_name: The protocol message field name, exactly\n      as it appears (or would appear) in a .proto file.\n  \"\"\"\n  # TODO(robinson): Escape Python keywords (e.g., yield), and test this support.\n  # nnorwitz makes my day by writing:\n  # \"\"\"\n  # FYI.  See the keyword module in the stdlib. This could be as simple as:\n  #\n  # if keyword.iskeyword(proto_field_name):\n  #   return proto_field_name + \"_\"\n  # return proto_field_name\n  # \"\"\"\n  # Kenton says:  The above is a BAD IDEA.  People rely on being able to use\n  #   getattr() and setattr() to reflectively manipulate field values.  If we\n  #   rename the properties, then every such user has to also make sure to apply\n  #   the same transformation.  Note that currently if you name a field \"yield\",\n  #   you can still access it just fine using getattr/setattr -- it's not even\n  #   that cumbersome to do so.\n  # TODO(kenton):  Remove this method entirely if/when everyone agrees with my\n  #   position.\n  return proto_field_name\n\n\ndef _VerifyExtensionHandle(message, extension_handle):\n  \"\"\"Verify that the given extension handle is valid.\"\"\"\n\n  if not isinstance(extension_handle, _FieldDescriptor):\n    raise KeyError('HasExtension() expects an extension handle, got: %s' %\n                   extension_handle)\n\n  if not extension_handle.is_extension:\n    raise KeyError('\"%s\" is not an extension.' % extension_handle.full_name)\n\n  if extension_handle.containing_type is not message.DESCRIPTOR:\n    raise KeyError('Extension \"%s\" extends message type \"%s\", but this '\n                   'message is of type \"%s\".' %\n                   (extension_handle.full_name,\n                    extension_handle.containing_type.full_name,\n                    message.DESCRIPTOR.full_name))\n\n\ndef _AddSlots(message_descriptor, dictionary):\n  \"\"\"Adds a __slots__ entry to dictionary, containing the names of all valid\n  attributes for this message type.\n\n  Args:\n    message_descriptor: A Descriptor instance describing this message type.\n    dictionary: Class dictionary to which we'll add a '__slots__' entry.\n  \"\"\"\n  dictionary['__slots__'] = ['_cached_byte_size',\n                             '_cached_byte_size_dirty',\n                             '_fields',\n                             '_is_present_in_parent',\n                             '_listener',\n                             '_listener_for_children',\n                             '__weakref__']\n\n\ndef _IsMessageSetExtension(field):\n  return (field.is_extension and\n          field.containing_type.has_options and\n          field.containing_type.GetOptions().message_set_wire_format and\n          field.type == _FieldDescriptor.TYPE_MESSAGE and\n          field.message_type == field.extension_scope and\n          field.label == _FieldDescriptor.LABEL_OPTIONAL)\n\n\ndef _AttachFieldHelpers(cls, field_descriptor):\n  is_repeated = (field_descriptor.label == _FieldDescriptor.LABEL_REPEATED)\n  is_packed = (field_descriptor.has_options and\n               field_descriptor.GetOptions().packed)\n\n  if _IsMessageSetExtension(field_descriptor):\n    field_encoder = encoder.MessageSetItemEncoder(field_descriptor.number)\n    sizer = encoder.MessageSetItemSizer(field_descriptor.number)\n  else:\n    field_encoder = type_checkers.TYPE_TO_ENCODER[field_descriptor.type](\n        field_descriptor.number, is_repeated, is_packed)\n    sizer = type_checkers.TYPE_TO_SIZER[field_descriptor.type](\n        field_descriptor.number, is_repeated, is_packed)\n\n  field_descriptor._encoder = field_encoder\n  field_descriptor._sizer = sizer\n  field_descriptor._default_constructor = _DefaultValueConstructorForField(\n      field_descriptor)\n\n  def AddDecoder(wiretype, is_packed):\n    tag_bytes = encoder.TagBytes(field_descriptor.number, wiretype)\n    cls._decoders_by_tag[tag_bytes] = (\n        type_checkers.TYPE_TO_DECODER[field_descriptor.type](\n            field_descriptor.number, is_repeated, is_packed,\n            field_descriptor, field_descriptor._default_constructor))\n\n  AddDecoder(type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type],\n             False)\n\n  if is_repeated and wire_format.IsTypePackable(field_descriptor.type):\n    # To support wire compatibility of adding packed = true, add a decoder for\n    # packed values regardless of the field's options.\n    AddDecoder(wire_format.WIRETYPE_LENGTH_DELIMITED, True)\n\n\ndef _AddClassAttributesForNestedExtensions(descriptor, dictionary):\n  extension_dict = descriptor.extensions_by_name\n  for extension_name, extension_field in extension_dict.iteritems():\n    assert extension_name not in dictionary\n    dictionary[extension_name] = extension_field\n\n\ndef _AddEnumValues(descriptor, cls):\n  \"\"\"Sets class-level attributes for all enum fields defined in this message.\n\n  Args:\n    descriptor: Descriptor object for this message type.\n    cls: Class we're constructing for this message type.\n  \"\"\"\n  for enum_type in descriptor.enum_types:\n    for enum_value in enum_type.values:\n      setattr(cls, enum_value.name, enum_value.number)\n\n\ndef _DefaultValueConstructorForField(field):\n  \"\"\"Returns a function which returns a default value for a field.\n\n  Args:\n    field: FieldDescriptor object for this field.\n\n  The returned function has one argument:\n    message: Message instance containing this field, or a weakref proxy\n      of same.\n\n  That function in turn returns a default value for this field.  The default\n    value may refer back to |message| via a weak reference.\n  \"\"\"\n\n  if field.label == _FieldDescriptor.LABEL_REPEATED:\n    if field.default_value != []:\n      raise ValueError('Repeated field default value not empty list: %s' % (\n          field.default_value))\n    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:\n      # We can't look at _concrete_class yet since it might not have\n      # been set.  (Depends on order in which we initialize the classes).\n      message_type = field.message_type\n      def MakeRepeatedMessageDefault(message):\n        return containers.RepeatedCompositeFieldContainer(\n            message._listener_for_children, field.message_type)\n      return MakeRepeatedMessageDefault\n    else:\n      type_checker = type_checkers.GetTypeChecker(field.cpp_type, field.type)\n      def MakeRepeatedScalarDefault(message):\n        return containers.RepeatedScalarFieldContainer(\n            message._listener_for_children, type_checker)\n      return MakeRepeatedScalarDefault\n\n  if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:\n    # _concrete_class may not yet be initialized.\n    message_type = field.message_type\n    def MakeSubMessageDefault(message):\n      result = message_type._concrete_class()\n      result._SetListener(message._listener_for_children)\n      return result\n    return MakeSubMessageDefault\n\n  def MakeScalarDefault(message):\n    return field.default_value\n  return MakeScalarDefault\n\n\ndef _AddInitMethod(message_descriptor, cls):\n  \"\"\"Adds an __init__ method to cls.\"\"\"\n  fields = message_descriptor.fields\n  def init(self, **kwargs):\n    self._cached_byte_size = 0\n    self._cached_byte_size_dirty = len(kwargs) > 0\n    self._fields = {}\n    self._is_present_in_parent = False\n    self._listener = message_listener_mod.NullMessageListener()\n    self._listener_for_children = _Listener(self)\n    for field_name, field_value in kwargs.iteritems():\n      field = _GetFieldByName(message_descriptor, field_name)\n      if field is None:\n        raise TypeError(\"%s() got an unexpected keyword argument '%s'\" %\n                        (message_descriptor.name, field_name))\n      if field.label == _FieldDescriptor.LABEL_REPEATED:\n        copy = field._default_constructor(self)\n        if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:  # Composite\n          for val in field_value:\n            copy.add().MergeFrom(val)\n        else:  # Scalar\n          copy.extend(field_value)\n        self._fields[field] = copy\n      elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:\n        copy = field._default_constructor(self)\n        copy.MergeFrom(field_value)\n        self._fields[field] = copy\n      else:\n        setattr(self, field_name, field_value)\n\n  init.__module__ = None\n  init.__doc__ = None\n  cls.__init__ = init\n\n\ndef _GetFieldByName(message_descriptor, field_name):\n  \"\"\"Returns a field descriptor by field name.\n\n  Args:\n    message_descriptor: A Descriptor describing all fields in message.\n    field_name: The name of the field to retrieve.\n  Returns:\n    The field descriptor associated with the field name.\n  \"\"\"\n  try:\n    return message_descriptor.fields_by_name[field_name]\n  except KeyError:\n    raise ValueError('Protocol message has no \"%s\" field.' % field_name)\n\n\ndef _AddPropertiesForFields(descriptor, cls):\n  \"\"\"Adds properties for all fields in this protocol message type.\"\"\"\n  for field in descriptor.fields:\n    _AddPropertiesForField(field, cls)\n\n  if descriptor.is_extendable:\n    # _ExtensionDict is just an adaptor with no state so we allocate a new one\n    # every time it is accessed.\n    cls.Extensions = property(lambda self: _ExtensionDict(self))\n\n\ndef _AddPropertiesForField(field, cls):\n  \"\"\"Adds a public property for a protocol message field.\n  Clients can use this property to get and (in the case\n  of non-repeated scalar fields) directly set the value\n  of a protocol message field.\n\n  Args:\n    field: A FieldDescriptor for this field.\n    cls: The class we're constructing.\n  \"\"\"\n  # Catch it if we add other types that we should\n  # handle specially here.\n  assert _FieldDescriptor.MAX_CPPTYPE == 10\n\n  constant_name = field.name.upper() + \"_FIELD_NUMBER\"\n  setattr(cls, constant_name, field.number)\n\n  if field.label == _FieldDescriptor.LABEL_REPEATED:\n    _AddPropertiesForRepeatedField(field, cls)\n  elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:\n    _AddPropertiesForNonRepeatedCompositeField(field, cls)\n  else:\n    _AddPropertiesForNonRepeatedScalarField(field, cls)\n\n\ndef _AddPropertiesForRepeatedField(field, cls):\n  \"\"\"Adds a public property for a \"repeated\" protocol message field.  Clients\n  can use this property to get the value of the field, which will be either a\n  _RepeatedScalarFieldContainer or _RepeatedCompositeFieldContainer (see\n  below).\n\n  Note that when clients add values to these containers, we perform\n  type-checking in the case of repeated scalar fields, and we also set any\n  necessary \"has\" bits as a side-effect.\n\n  Args:\n    field: A FieldDescriptor for this field.\n    cls: The class we're constructing.\n  \"\"\"\n  proto_field_name = field.name\n  property_name = _PropertyName(proto_field_name)\n\n  def getter(self):\n    field_value = self._fields.get(field)\n    if field_value is None:\n      # Construct a new object to represent this field.\n      field_value = field._default_constructor(self)\n\n      # Atomically check if another thread has preempted us and, if not, swap\n      # in the new object we just created.  If someone has preempted us, we\n      # take that object and discard ours.\n      # WARNING:  We are relying on setdefault() being atomic.  This is true\n      #   in CPython but we haven't investigated others.  This warning appears\n      #   in several other locations in this file.\n      field_value = self._fields.setdefault(field, field_value)\n    return field_value\n  getter.__module__ = None\n  getter.__doc__ = 'Getter for %s.' % proto_field_name\n\n  # We define a setter just so we can throw an exception with a more\n  # helpful error message.\n  def setter(self, new_value):\n    raise AttributeError('Assignment not allowed to repeated field '\n                         '\"%s\" in protocol message object.' % proto_field_name)\n\n  doc = 'Magic attribute generated for \"%s\" proto field.' % proto_field_name\n  setattr(cls, property_name, property(getter, setter, doc=doc))\n\n\ndef _AddPropertiesForNonRepeatedScalarField(field, cls):\n  \"\"\"Adds a public property for a nonrepeated, scalar protocol message field.\n  Clients can use this property to get and directly set the value of the field.\n  Note that when the client sets the value of a field by using this property,\n  all necessary \"has\" bits are set as a side-effect, and we also perform\n  type-checking.\n\n  Args:\n    field: A FieldDescriptor for this field.\n    cls: The class we're constructing.\n  \"\"\"\n  proto_field_name = field.name\n  property_name = _PropertyName(proto_field_name)\n  type_checker = type_checkers.GetTypeChecker(field.cpp_type, field.type)\n  default_value = field.default_value\n  valid_values = set()\n\n  def getter(self):\n    return self._fields.get(field, default_value)\n  getter.__module__ = None\n  getter.__doc__ = 'Getter for %s.' % proto_field_name\n  def setter(self, new_value):\n    type_checker.CheckValue(new_value)\n    self._fields[field] = new_value\n    # Check _cached_byte_size_dirty inline to improve performance, since scalar\n    # setters are called frequently.\n    if not self._cached_byte_size_dirty:\n      self._Modified()\n\n  setter.__module__ = None\n  setter.__doc__ = 'Setter for %s.' % proto_field_name\n\n  # Add a property to encapsulate the getter/setter.\n  doc = 'Magic attribute generated for \"%s\" proto field.' % proto_field_name\n  setattr(cls, property_name, property(getter, setter, doc=doc))\n\n\ndef _AddPropertiesForNonRepeatedCompositeField(field, cls):\n  \"\"\"Adds a public property for a nonrepeated, composite protocol message field.\n  A composite field is a \"group\" or \"message\" field.\n\n  Clients can use this property to get the value of the field, but cannot\n  assign to the property directly.\n\n  Args:\n    field: A FieldDescriptor for this field.\n    cls: The class we're constructing.\n  \"\"\"\n  # TODO(robinson): Remove duplication with similar method\n  # for non-repeated scalars.\n  proto_field_name = field.name\n  property_name = _PropertyName(proto_field_name)\n  message_type = field.message_type\n\n  def getter(self):\n    field_value = self._fields.get(field)\n    if field_value is None:\n      # Construct a new object to represent this field.\n      field_value = message_type._concrete_class()\n      field_value._SetListener(self._listener_for_children)\n\n      # Atomically check if another thread has preempted us and, if not, swap\n      # in the new object we just created.  If someone has preempted us, we\n      # take that object and discard ours.\n      # WARNING:  We are relying on setdefault() being atomic.  This is true\n      #   in CPython but we haven't investigated others.  This warning appears\n      #   in several other locations in this file.\n      field_value = self._fields.setdefault(field, field_value)\n    return field_value\n  getter.__module__ = None\n  getter.__doc__ = 'Getter for %s.' % proto_field_name\n\n  # We define a setter just so we can throw an exception with a more\n  # helpful error message.\n  def setter(self, new_value):\n    raise AttributeError('Assignment not allowed to composite field '\n                         '\"%s\" in protocol message object.' % proto_field_name)\n\n  # Add a property to encapsulate the getter.\n  doc = 'Magic attribute generated for \"%s\" proto field.' % proto_field_name\n  setattr(cls, property_name, property(getter, setter, doc=doc))\n\n\ndef _AddPropertiesForExtensions(descriptor, cls):\n  \"\"\"Adds properties for all fields in this protocol message type.\"\"\"\n  extension_dict = descriptor.extensions_by_name\n  for extension_name, extension_field in extension_dict.iteritems():\n    constant_name = extension_name.upper() + \"_FIELD_NUMBER\"\n    setattr(cls, constant_name, extension_field.number)\n\n\ndef _AddStaticMethods(cls):\n  # TODO(robinson): This probably needs to be thread-safe(?)\n  def RegisterExtension(extension_handle):\n    extension_handle.containing_type = cls.DESCRIPTOR\n    _AttachFieldHelpers(cls, extension_handle)\n\n    # Try to insert our extension, failing if an extension with the same number\n    # already exists.\n    actual_handle = cls._extensions_by_number.setdefault(\n        extension_handle.number, extension_handle)\n    if actual_handle is not extension_handle:\n      raise AssertionError(\n          'Extensions \"%s\" and \"%s\" both try to extend message type \"%s\" with '\n          'field number %d.' %\n          (extension_handle.full_name, actual_handle.full_name,\n           cls.DESCRIPTOR.full_name, extension_handle.number))\n\n    cls._extensions_by_name[extension_handle.full_name] = extension_handle\n\n    handle = extension_handle  # avoid line wrapping\n    if _IsMessageSetExtension(handle):\n      # MessageSet extension.  Also register under type name.\n      cls._extensions_by_name[\n          extension_handle.message_type.full_name] = extension_handle\n\n  cls.RegisterExtension = staticmethod(RegisterExtension)\n\n  def FromString(s):\n    message = cls()\n    message.MergeFromString(s)\n    return message\n  cls.FromString = staticmethod(FromString)\n\n\ndef _IsPresent(item):\n  \"\"\"Given a (FieldDescriptor, value) tuple from _fields, return true if the\n  value should be included in the list returned by ListFields().\"\"\"\n\n  if item[0].label == _FieldDescriptor.LABEL_REPEATED:\n    return bool(item[1])\n  elif item[0].cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:\n    return item[1]._is_present_in_parent\n  else:\n    return True\n\n\ndef _AddListFieldsMethod(message_descriptor, cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n\n  def ListFields(self):\n    all_fields = [item for item in self._fields.iteritems() if _IsPresent(item)]\n    all_fields.sort(key = lambda item: item[0].number)\n    return all_fields\n\n  cls.ListFields = ListFields\n\n\ndef _AddHasFieldMethod(message_descriptor, cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n\n  singular_fields = {}\n  for field in message_descriptor.fields:\n    if field.label != _FieldDescriptor.LABEL_REPEATED:\n      singular_fields[field.name] = field\n\n  def HasField(self, field_name):\n    try:\n      field = singular_fields[field_name]\n    except KeyError:\n      raise ValueError(\n          'Protocol message has no singular \"%s\" field.' % field_name)\n\n    if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:\n      value = self._fields.get(field)\n      return value is not None and value._is_present_in_parent\n    else:\n      return field in self._fields\n  cls.HasField = HasField\n\n\ndef _AddClearFieldMethod(message_descriptor, cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n  def ClearField(self, field_name):\n    try:\n      field = message_descriptor.fields_by_name[field_name]\n    except KeyError:\n      raise ValueError('Protocol message has no \"%s\" field.' % field_name)\n\n    if field in self._fields:\n      # Note:  If the field is a sub-message, its listener will still point\n      #   at us.  That's fine, because the worst than can happen is that it\n      #   will call _Modified() and invalidate our byte size.  Big deal.\n      del self._fields[field]\n\n    # Always call _Modified() -- even if nothing was changed, this is\n    # a mutating method, and thus calling it should cause the field to become\n    # present in the parent message.\n    self._Modified()\n\n  cls.ClearField = ClearField\n\n\ndef _AddClearExtensionMethod(cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n  def ClearExtension(self, extension_handle):\n    _VerifyExtensionHandle(self, extension_handle)\n\n    # Similar to ClearField(), above.\n    if extension_handle in self._fields:\n      del self._fields[extension_handle]\n    self._Modified()\n  cls.ClearExtension = ClearExtension\n\n\ndef _AddClearMethod(message_descriptor, cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n  def Clear(self):\n    # Clear fields.\n    self._fields = {}\n    self._Modified()\n  cls.Clear = Clear\n\n\ndef _AddHasExtensionMethod(cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n  def HasExtension(self, extension_handle):\n    _VerifyExtensionHandle(self, extension_handle)\n    if extension_handle.label == _FieldDescriptor.LABEL_REPEATED:\n      raise KeyError('\"%s\" is repeated.' % extension_handle.full_name)\n\n    if extension_handle.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:\n      value = self._fields.get(extension_handle)\n      return value is not None and value._is_present_in_parent\n    else:\n      return extension_handle in self._fields\n  cls.HasExtension = HasExtension\n\n\ndef _AddEqualsMethod(message_descriptor, cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n  def __eq__(self, other):\n    if (not isinstance(other, message_mod.Message) or\n        other.DESCRIPTOR != self.DESCRIPTOR):\n      return False\n\n    if self is other:\n      return True\n\n    return self.ListFields() == other.ListFields()\n\n  cls.__eq__ = __eq__\n\n\ndef _AddStrMethod(message_descriptor, cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n  def __str__(self):\n    return text_format.MessageToString(self)\n  cls.__str__ = __str__\n\n\ndef _AddUnicodeMethod(unused_message_descriptor, cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n\n  def __unicode__(self):\n    return text_format.MessageToString(self, as_utf8=True).decode('utf-8')\n  cls.__unicode__ = __unicode__\n\n\ndef _AddSetListenerMethod(cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n  def SetListener(self, listener):\n    if listener is None:\n      self._listener = message_listener_mod.NullMessageListener()\n    else:\n      self._listener = listener\n  cls._SetListener = SetListener\n\n\ndef _BytesForNonRepeatedElement(value, field_number, field_type):\n  \"\"\"Returns the number of bytes needed to serialize a non-repeated element.\n  The returned byte count includes space for tag information and any\n  other additional space associated with serializing value.\n\n  Args:\n    value: Value we're serializing.\n    field_number: Field number of this value.  (Since the field number\n      is stored as part of a varint-encoded tag, this has an impact\n      on the total bytes required to serialize the value).\n    field_type: The type of the field.  One of the TYPE_* constants\n      within FieldDescriptor.\n  \"\"\"\n  try:\n    fn = type_checkers.TYPE_TO_BYTE_SIZE_FN[field_type]\n    return fn(field_number, value)\n  except KeyError:\n    raise message_mod.EncodeError('Unrecognized field type: %d' % field_type)\n\n\ndef _AddByteSizeMethod(message_descriptor, cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n\n  def ByteSize(self):\n    if not self._cached_byte_size_dirty:\n      return self._cached_byte_size\n\n    size = 0\n    for field_descriptor, field_value in self.ListFields():\n      size += field_descriptor._sizer(field_value)\n\n    self._cached_byte_size = size\n    self._cached_byte_size_dirty = False\n    self._listener_for_children.dirty = False\n    return size\n\n  cls.ByteSize = ByteSize\n\n\ndef _AddSerializeToStringMethod(message_descriptor, cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n\n  def SerializeToString(self):\n    # Check if the message has all of its required fields set.\n    errors = []\n    if not self.IsInitialized():\n      raise message_mod.EncodeError(\n          'Message is missing required fields: ' +\n          ','.join(self.FindInitializationErrors()))\n    return self.SerializePartialToString()\n  cls.SerializeToString = SerializeToString\n\n\ndef _AddSerializePartialToStringMethod(message_descriptor, cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n\n  def SerializePartialToString(self):\n    out = StringIO()\n    self._InternalSerialize(out.write)\n    return out.getvalue()\n  cls.SerializePartialToString = SerializePartialToString\n\n  def InternalSerialize(self, write_bytes):\n    for field_descriptor, field_value in self.ListFields():\n      field_descriptor._encoder(write_bytes, field_value)\n  cls._InternalSerialize = InternalSerialize\n\n\ndef _AddMergeFromStringMethod(message_descriptor, cls):\n  \"\"\"Helper for _AddMessageMethods().\"\"\"\n  def MergeFromString(self, serialized):\n    length = len(serialized)\n    try:\n      if self._InternalParse(serialized, 0, length) != length:\n        # The only reason _InternalParse would return early is if it\n        # encountered an end-group tag.\n        raise message_mod.DecodeError('Unexpected end-group tag.')\n    except IndexError:\n      raise message_mod.DecodeError('Truncated message.')\n    except struct.error, e:\n      raise message_mod.DecodeError(e)\n    return length   # Return this for legacy reasons.\n  cls.MergeFromString = MergeFromString\n\n  local_ReadTag = decoder.ReadTag\n  local_SkipField = decoder.SkipField\n  decoders_by_tag = cls._decoders_by_tag\n\n  def InternalParse(self, buffer, pos, end):\n    self._Modified()\n    field_dict = self._fields\n    while pos != end:\n      (tag_bytes, new_pos) = local_ReadTag(buffer, pos)\n      field_decoder = decoders_by_tag.get(tag_bytes)\n      if field_decoder is None:\n        new_pos = local_SkipField(buffer, new_pos, end, tag_bytes)\n        if new_pos == -1:\n          return pos\n        pos = new_pos\n      else:\n        pos = field_decoder(buffer, new_pos, end, self, field_dict)\n    return pos\n  cls._InternalParse = InternalParse\n\n\ndef _AddIsInitializedMethod(message_descriptor, cls):\n  \"\"\"Adds the IsInitialized and FindInitializationError methods to the\n  protocol message class.\"\"\"\n\n  required_fields = [field for field in message_descriptor.fields\n                           if field.label == _FieldDescriptor.LABEL_REQUIRED]\n\n  def IsInitialized(self, errors=None):\n    \"\"\"Checks if all required fields of a message are set.\n\n    Args:\n      errors:  A list which, if provided, will be populated with the field\n               paths of all missing required fields.\n\n    Returns:\n      True iff the specified message has all required fields set.\n    \"\"\"\n\n    # Performance is critical so we avoid HasField() and ListFields().\n\n    for field in required_fields:\n      if (field not in self._fields or\n          (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and\n           not self._fields[field]._is_present_in_parent)):\n        if errors is not None:\n          errors.extend(self.FindInitializationErrors())\n        return False\n\n    for field, value in self._fields.iteritems():\n      if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:\n        if field.label == _FieldDescriptor.LABEL_REPEATED:\n          for element in value:\n            if not element.IsInitialized():\n              if errors is not None:\n                errors.extend(self.FindInitializationErrors())\n              return False\n        elif value._is_present_in_parent and not value.IsInitialized():\n          if errors is not None:\n            errors.extend(self.FindInitializationErrors())\n          return False\n\n    return True\n\n  cls.IsInitialized = IsInitialized\n\n  def FindInitializationErrors(self):\n    \"\"\"Finds required fields which are not initialized.\n\n    Returns:\n      A list of strings.  Each string is a path to an uninitialized field from\n      the top-level message, e.g. \"foo.bar[5].baz\".\n    \"\"\"\n\n    errors = []  # simplify things\n\n    for field in required_fields:\n      if not self.HasField(field.name):\n        errors.append(field.name)\n\n    for field, value in self.ListFields():\n      if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:\n        if field.is_extension:\n          name = \"(%s)\" % field.full_name\n        else:\n          name = field.name\n\n        if field.label == _FieldDescriptor.LABEL_REPEATED:\n          for i in xrange(len(value)):\n            element = value[i]\n            prefix = \"%s[%d].\" % (name, i)\n            sub_errors = element.FindInitializationErrors()\n            errors += [ prefix + error for error in sub_errors ]\n        else:\n          prefix = name + \".\"\n          sub_errors = value.FindInitializationErrors()\n          errors += [ prefix + error for error in sub_errors ]\n\n    return errors\n\n  cls.FindInitializationErrors = FindInitializationErrors\n\n\ndef _AddMergeFromMethod(cls):\n  LABEL_REPEATED = _FieldDescriptor.LABEL_REPEATED\n  CPPTYPE_MESSAGE = _FieldDescriptor.CPPTYPE_MESSAGE\n\n  def MergeFrom(self, msg):\n    if not isinstance(msg, cls):\n      raise TypeError(\n          \"Parameter to MergeFrom() must be instance of same class.\")\n\n    assert msg is not self\n    self._Modified()\n\n    fields = self._fields\n\n    for field, value in msg._fields.iteritems():\n      if field.label == LABEL_REPEATED:\n        field_value = fields.get(field)\n        if field_value is None:\n          # Construct a new object to represent this field.\n          field_value = field._default_constructor(self)\n          fields[field] = field_value\n        field_value.MergeFrom(value)\n      elif field.cpp_type == CPPTYPE_MESSAGE:\n        if value._is_present_in_parent:\n          field_value = fields.get(field)\n          if field_value is None:\n            # Construct a new object to represent this field.\n            field_value = field._default_constructor(self)\n            fields[field] = field_value\n          field_value.MergeFrom(value)\n      else:\n        self._fields[field] = value\n  cls.MergeFrom = MergeFrom\n\n\ndef _AddMessageMethods(message_descriptor, cls):\n  \"\"\"Adds implementations of all Message methods to cls.\"\"\"\n  _AddListFieldsMethod(message_descriptor, cls)\n  _AddHasFieldMethod(message_descriptor, cls)\n  _AddClearFieldMethod(message_descriptor, cls)\n  if message_descriptor.is_extendable:\n    _AddClearExtensionMethod(cls)\n    _AddHasExtensionMethod(cls)\n  _AddClearMethod(message_descriptor, cls)\n  _AddEqualsMethod(message_descriptor, cls)\n  _AddStrMethod(message_descriptor, cls)\n  _AddUnicodeMethod(message_descriptor, cls)\n  _AddSetListenerMethod(cls)\n  _AddByteSizeMethod(message_descriptor, cls)\n  _AddSerializeToStringMethod(message_descriptor, cls)\n  _AddSerializePartialToStringMethod(message_descriptor, cls)\n  _AddMergeFromStringMethod(message_descriptor, cls)\n  _AddIsInitializedMethod(message_descriptor, cls)\n  _AddMergeFromMethod(cls)\n\n\ndef _AddPrivateHelperMethods(cls):\n  \"\"\"Adds implementation of private helper methods to cls.\"\"\"\n\n  def Modified(self):\n    \"\"\"Sets the _cached_byte_size_dirty bit to true,\n    and propagates this to our listener iff this was a state change.\n    \"\"\"\n\n    # Note:  Some callers check _cached_byte_size_dirty before calling\n    #   _Modified() as an extra optimization.  So, if this method is ever\n    #   changed such that it does stuff even when _cached_byte_size_dirty is\n    #   already true, the callers need to be updated.\n    if not self._cached_byte_size_dirty:\n      self._cached_byte_size_dirty = True\n      self._listener_for_children.dirty = True\n      self._is_present_in_parent = True\n      self._listener.Modified()\n\n  cls._Modified = Modified\n  cls.SetInParent = Modified\n\n\nclass _Listener(object):\n\n  \"\"\"MessageListener implementation that a parent message registers with its\n  child message.\n\n  In order to support semantics like:\n\n    foo.bar.baz.qux = 23\n    assert foo.HasField('bar')\n\n  ...child objects must have back references to their parents.\n  This helper class is at the heart of this support.\n  \"\"\"\n\n  def __init__(self, parent_message):\n    \"\"\"Args:\n      parent_message: The message whose _Modified() method we should call when\n        we receive Modified() messages.\n    \"\"\"\n    # This listener establishes a back reference from a child (contained) object\n    # to its parent (containing) object.  We make this a weak reference to avoid\n    # creating cyclic garbage when the client finishes with the 'parent' object\n    # in the tree.\n    if isinstance(parent_message, weakref.ProxyType):\n      self._parent_message_weakref = parent_message\n    else:\n      self._parent_message_weakref = weakref.proxy(parent_message)\n\n    # As an optimization, we also indicate directly on the listener whether\n    # or not the parent message is dirty.  This way we can avoid traversing\n    # up the tree in the common case.\n    self.dirty = False\n\n  def Modified(self):\n    if self.dirty:\n      return\n    try:\n      # Propagate the signal to our parents iff this is the first field set.\n      self._parent_message_weakref._Modified()\n    except ReferenceError:\n      # We can get here if a client has kept a reference to a child object,\n      # and is now setting a field on it, but the child's parent has been\n      # garbage-collected.  This is not an error.\n      pass\n\n\n# TODO(robinson): Move elsewhere?  This file is getting pretty ridiculous...\n# TODO(robinson): Unify error handling of \"unknown extension\" crap.\n# TODO(robinson): Support iteritems()-style iteration over all\n# extensions with the \"has\" bits turned on?\nclass _ExtensionDict(object):\n\n  \"\"\"Dict-like container for supporting an indexable \"Extensions\"\n  field on proto instances.\n\n  Note that in all cases we expect extension handles to be\n  FieldDescriptors.\n  \"\"\"\n\n  def __init__(self, extended_message):\n    \"\"\"extended_message: Message instance for which we are the Extensions dict.\n    \"\"\"\n\n    self._extended_message = extended_message\n\n  def __getitem__(self, extension_handle):\n    \"\"\"Returns the current value of the given extension handle.\"\"\"\n\n    _VerifyExtensionHandle(self._extended_message, extension_handle)\n\n    result = self._extended_message._fields.get(extension_handle)\n    if result is not None:\n      return result\n\n    if extension_handle.label == _FieldDescriptor.LABEL_REPEATED:\n      result = extension_handle._default_constructor(self._extended_message)\n    elif extension_handle.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:\n      result = extension_handle.message_type._concrete_class()\n      try:\n        result._SetListener(self._extended_message._listener_for_children)\n      except ReferenceError:\n        pass\n    else:\n      # Singular scalar -- just return the default without inserting into the\n      # dict.\n      return extension_handle.default_value\n\n    # Atomically check if another thread has preempted us and, if not, swap\n    # in the new object we just created.  If someone has preempted us, we\n    # take that object and discard ours.\n    # WARNING:  We are relying on setdefault() being atomic.  This is true\n    #   in CPython but we haven't investigated others.  This warning appears\n    #   in several other locations in this file.\n    result = self._extended_message._fields.setdefault(\n        extension_handle, result)\n\n    return result\n\n  def __eq__(self, other):\n    if not isinstance(other, self.__class__):\n      return False\n\n    my_fields = self._extended_message.ListFields()\n    other_fields = other._extended_message.ListFields()\n\n    # Get rid of non-extension fields.\n    my_fields    = [ field for field in my_fields    if field.is_extension ]\n    other_fields = [ field for field in other_fields if field.is_extension ]\n\n    return my_fields == other_fields\n\n  def __ne__(self, other):\n    return not self == other\n\n  def __hash__(self):\n    raise TypeError('unhashable object')\n\n  # Note that this is only meaningful for non-repeated, scalar extension\n  # fields.  Note also that we may have to call _Modified() when we do\n  # successfully set a field this way, to set any necssary \"has\" bits in the\n  # ancestors of the extended message.\n  def __setitem__(self, extension_handle, value):\n    \"\"\"If extension_handle specifies a non-repeated, scalar extension\n    field, sets the value of that field.\n    \"\"\"\n\n    _VerifyExtensionHandle(self._extended_message, extension_handle)\n\n    if (extension_handle.label == _FieldDescriptor.LABEL_REPEATED or\n        extension_handle.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE):\n      raise TypeError(\n          'Cannot assign to extension \"%s\" because it is a repeated or '\n          'composite type.' % extension_handle.full_name)\n\n    # It's slightly wasteful to lookup the type checker each time,\n    # but we expect this to be a vanishingly uncommon case anyway.\n    type_checker = type_checkers.GetTypeChecker(\n        extension_handle.cpp_type, extension_handle.type)\n    type_checker.CheckValue(value)\n    self._extended_message._fields[extension_handle] = value\n    self._extended_message._Modified()\n\n  def _FindExtensionByName(self, name):\n    \"\"\"Tries to find a known extension with the specified name.\n\n    Args:\n      name: Extension full name.\n\n    Returns:\n      Extension field descriptor.\n    \"\"\"\n    return self._extended_message._extensions_by_name.get(name, None)\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/reflection_test.py",
    "content": "#! /usr/bin/python\n# -*- coding: utf-8 -*-\n#\n# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Unittest for reflection.py, which also indirectly tests the output of the\npure-Python protocol compiler.\n\"\"\"\n\n__author__ = 'robinson@google.com (Will Robinson)'\n\nimport operator\nimport struct\n\nimport unittest\nfrom google.protobuf import unittest_import_pb2\nfrom google.protobuf import unittest_mset_pb2\nfrom google.protobuf import unittest_pb2\nfrom google.protobuf import descriptor_pb2\nfrom google.protobuf import descriptor\nfrom google.protobuf import message\nfrom google.protobuf import reflection\nfrom google.protobuf.internal import api_implementation\nfrom google.protobuf.internal import more_extensions_pb2\nfrom google.protobuf.internal import more_messages_pb2\nfrom google.protobuf.internal import wire_format\nfrom google.protobuf.internal import test_util\nfrom google.protobuf.internal import decoder\n\n\nclass _MiniDecoder(object):\n  \"\"\"Decodes a stream of values from a string.\n\n  Once upon a time we actually had a class called decoder.Decoder.  Then we\n  got rid of it during a redesign that made decoding much, much faster overall.\n  But a couple tests in this file used it to check that the serialized form of\n  a message was correct.  So, this class implements just the methods that were\n  used by said tests, so that we don't have to rewrite the tests.\n  \"\"\"\n\n  def __init__(self, bytes):\n    self._bytes = bytes\n    self._pos = 0\n\n  def ReadVarint(self):\n    result, self._pos = decoder._DecodeVarint(self._bytes, self._pos)\n    return result\n\n  ReadInt32 = ReadVarint\n  ReadInt64 = ReadVarint\n  ReadUInt32 = ReadVarint\n  ReadUInt64 = ReadVarint\n\n  def ReadSInt64(self):\n    return wire_format.ZigZagDecode(self.ReadVarint())\n\n  ReadSInt32 = ReadSInt64\n\n  def ReadFieldNumberAndWireType(self):\n    return wire_format.UnpackTag(self.ReadVarint())\n\n  def ReadFloat(self):\n    result = struct.unpack(\"<f\", self._bytes[self._pos:self._pos+4])[0]\n    self._pos += 4\n    return result\n\n  def ReadDouble(self):\n    result = struct.unpack(\"<d\", self._bytes[self._pos:self._pos+8])[0]\n    self._pos += 8\n    return result\n\n  def EndOfStream(self):\n    return self._pos == len(self._bytes)\n\n\nclass ReflectionTest(unittest.TestCase):\n\n  def assertListsEqual(self, values, others):\n    self.assertEqual(len(values), len(others))\n    for i in range(len(values)):\n      self.assertEqual(values[i], others[i])\n\n  def testScalarConstructor(self):\n    # Constructor with only scalar types should succeed.\n    proto = unittest_pb2.TestAllTypes(\n        optional_int32=24,\n        optional_double=54.321,\n        optional_string='optional_string')\n\n    self.assertEqual(24, proto.optional_int32)\n    self.assertEqual(54.321, proto.optional_double)\n    self.assertEqual('optional_string', proto.optional_string)\n\n  def testRepeatedScalarConstructor(self):\n    # Constructor with only repeated scalar types should succeed.\n    proto = unittest_pb2.TestAllTypes(\n        repeated_int32=[1, 2, 3, 4],\n        repeated_double=[1.23, 54.321],\n        repeated_bool=[True, False, False],\n        repeated_string=[\"optional_string\"])\n\n    self.assertEquals([1, 2, 3, 4], list(proto.repeated_int32))\n    self.assertEquals([1.23, 54.321], list(proto.repeated_double))\n    self.assertEquals([True, False, False], list(proto.repeated_bool))\n    self.assertEquals([\"optional_string\"], list(proto.repeated_string))\n\n  def testRepeatedCompositeConstructor(self):\n    # Constructor with only repeated composite types should succeed.\n    proto = unittest_pb2.TestAllTypes(\n        repeated_nested_message=[\n            unittest_pb2.TestAllTypes.NestedMessage(\n                bb=unittest_pb2.TestAllTypes.FOO),\n            unittest_pb2.TestAllTypes.NestedMessage(\n                bb=unittest_pb2.TestAllTypes.BAR)],\n        repeated_foreign_message=[\n            unittest_pb2.ForeignMessage(c=-43),\n            unittest_pb2.ForeignMessage(c=45324),\n            unittest_pb2.ForeignMessage(c=12)],\n        repeatedgroup=[\n            unittest_pb2.TestAllTypes.RepeatedGroup(),\n            unittest_pb2.TestAllTypes.RepeatedGroup(a=1),\n            unittest_pb2.TestAllTypes.RepeatedGroup(a=2)])\n\n    self.assertEquals(\n        [unittest_pb2.TestAllTypes.NestedMessage(\n            bb=unittest_pb2.TestAllTypes.FOO),\n         unittest_pb2.TestAllTypes.NestedMessage(\n             bb=unittest_pb2.TestAllTypes.BAR)],\n        list(proto.repeated_nested_message))\n    self.assertEquals(\n        [unittest_pb2.ForeignMessage(c=-43),\n         unittest_pb2.ForeignMessage(c=45324),\n         unittest_pb2.ForeignMessage(c=12)],\n        list(proto.repeated_foreign_message))\n    self.assertEquals(\n        [unittest_pb2.TestAllTypes.RepeatedGroup(),\n         unittest_pb2.TestAllTypes.RepeatedGroup(a=1),\n         unittest_pb2.TestAllTypes.RepeatedGroup(a=2)],\n        list(proto.repeatedgroup))\n\n  def testMixedConstructor(self):\n    # Constructor with only mixed types should succeed.\n    proto = unittest_pb2.TestAllTypes(\n        optional_int32=24,\n        optional_string='optional_string',\n        repeated_double=[1.23, 54.321],\n        repeated_bool=[True, False, False],\n        repeated_nested_message=[\n            unittest_pb2.TestAllTypes.NestedMessage(\n                bb=unittest_pb2.TestAllTypes.FOO),\n            unittest_pb2.TestAllTypes.NestedMessage(\n                bb=unittest_pb2.TestAllTypes.BAR)],\n        repeated_foreign_message=[\n            unittest_pb2.ForeignMessage(c=-43),\n            unittest_pb2.ForeignMessage(c=45324),\n            unittest_pb2.ForeignMessage(c=12)])\n\n    self.assertEqual(24, proto.optional_int32)\n    self.assertEqual('optional_string', proto.optional_string)\n    self.assertEquals([1.23, 54.321], list(proto.repeated_double))\n    self.assertEquals([True, False, False], list(proto.repeated_bool))\n    self.assertEquals(\n        [unittest_pb2.TestAllTypes.NestedMessage(\n            bb=unittest_pb2.TestAllTypes.FOO),\n         unittest_pb2.TestAllTypes.NestedMessage(\n             bb=unittest_pb2.TestAllTypes.BAR)],\n        list(proto.repeated_nested_message))\n    self.assertEquals(\n        [unittest_pb2.ForeignMessage(c=-43),\n         unittest_pb2.ForeignMessage(c=45324),\n         unittest_pb2.ForeignMessage(c=12)],\n        list(proto.repeated_foreign_message))\n\n  def testConstructorTypeError(self):\n    self.assertRaises(\n        TypeError, unittest_pb2.TestAllTypes, optional_int32=\"foo\")\n    self.assertRaises(\n        TypeError, unittest_pb2.TestAllTypes, optional_string=1234)\n    self.assertRaises(\n        TypeError, unittest_pb2.TestAllTypes, optional_nested_message=1234)\n    self.assertRaises(\n        TypeError, unittest_pb2.TestAllTypes, repeated_int32=1234)\n    self.assertRaises(\n        TypeError, unittest_pb2.TestAllTypes, repeated_int32=[\"foo\"])\n    self.assertRaises(\n        TypeError, unittest_pb2.TestAllTypes, repeated_string=1234)\n    self.assertRaises(\n        TypeError, unittest_pb2.TestAllTypes, repeated_string=[1234])\n    self.assertRaises(\n        TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=1234)\n    self.assertRaises(\n        TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=[1234])\n\n  def testConstructorInvalidatesCachedByteSize(self):\n    message = unittest_pb2.TestAllTypes(optional_int32 = 12)\n    self.assertEquals(2, message.ByteSize())\n\n    message = unittest_pb2.TestAllTypes(\n        optional_nested_message = unittest_pb2.TestAllTypes.NestedMessage())\n    self.assertEquals(3, message.ByteSize())\n\n    message = unittest_pb2.TestAllTypes(repeated_int32 = [12])\n    self.assertEquals(3, message.ByteSize())\n\n    message = unittest_pb2.TestAllTypes(\n        repeated_nested_message = [unittest_pb2.TestAllTypes.NestedMessage()])\n    self.assertEquals(3, message.ByteSize())\n\n  def testSimpleHasBits(self):\n    # Test a scalar.\n    proto = unittest_pb2.TestAllTypes()\n    self.assertTrue(not proto.HasField('optional_int32'))\n    self.assertEqual(0, proto.optional_int32)\n    # HasField() shouldn't be true if all we've done is\n    # read the default value.\n    self.assertTrue(not proto.HasField('optional_int32'))\n    proto.optional_int32 = 1\n    # Setting a value however *should* set the \"has\" bit.\n    self.assertTrue(proto.HasField('optional_int32'))\n    proto.ClearField('optional_int32')\n    # And clearing that value should unset the \"has\" bit.\n    self.assertTrue(not proto.HasField('optional_int32'))\n\n  def testHasBitsWithSinglyNestedScalar(self):\n    # Helper used to test foreign messages and groups.\n    #\n    # composite_field_name should be the name of a non-repeated\n    # composite (i.e., foreign or group) field in TestAllTypes,\n    # and scalar_field_name should be the name of an integer-valued\n    # scalar field within that composite.\n    #\n    # I never thought I'd miss C++ macros and templates so much. :(\n    # This helper is semantically just:\n    #\n    #   assert proto.composite_field.scalar_field == 0\n    #   assert not proto.composite_field.HasField('scalar_field')\n    #   assert not proto.HasField('composite_field')\n    #\n    #   proto.composite_field.scalar_field = 10\n    #   old_composite_field = proto.composite_field\n    #\n    #   assert proto.composite_field.scalar_field == 10\n    #   assert proto.composite_field.HasField('scalar_field')\n    #   assert proto.HasField('composite_field')\n    #\n    #   proto.ClearField('composite_field')\n    #\n    #   assert not proto.composite_field.HasField('scalar_field')\n    #   assert not proto.HasField('composite_field')\n    #   assert proto.composite_field.scalar_field == 0\n    #\n    #   # Now ensure that ClearField('composite_field') disconnected\n    #   # the old field object from the object tree...\n    #   assert old_composite_field is not proto.composite_field\n    #   old_composite_field.scalar_field = 20\n    #   assert not proto.composite_field.HasField('scalar_field')\n    #   assert not proto.HasField('composite_field')\n    def TestCompositeHasBits(composite_field_name, scalar_field_name):\n      proto = unittest_pb2.TestAllTypes()\n      # First, check that we can get the scalar value, and see that it's the\n      # default (0), but that proto.HasField('omposite') and\n      # proto.composite.HasField('scalar') will still return False.\n      composite_field = getattr(proto, composite_field_name)\n      original_scalar_value = getattr(composite_field, scalar_field_name)\n      self.assertEqual(0, original_scalar_value)\n      # Assert that the composite object does not \"have\" the scalar.\n      self.assertTrue(not composite_field.HasField(scalar_field_name))\n      # Assert that proto does not \"have\" the composite field.\n      self.assertTrue(not proto.HasField(composite_field_name))\n\n      # Now set the scalar within the composite field.  Ensure that the setting\n      # is reflected, and that proto.HasField('composite') and\n      # proto.composite.HasField('scalar') now both return True.\n      new_val = 20\n      setattr(composite_field, scalar_field_name, new_val)\n      self.assertEqual(new_val, getattr(composite_field, scalar_field_name))\n      # Hold on to a reference to the current composite_field object.\n      old_composite_field = composite_field\n      # Assert that the has methods now return true.\n      self.assertTrue(composite_field.HasField(scalar_field_name))\n      self.assertTrue(proto.HasField(composite_field_name))\n\n      # Now call the clear method...\n      proto.ClearField(composite_field_name)\n\n      # ...and ensure that the \"has\" bits are all back to False...\n      composite_field = getattr(proto, composite_field_name)\n      self.assertTrue(not composite_field.HasField(scalar_field_name))\n      self.assertTrue(not proto.HasField(composite_field_name))\n      # ...and ensure that the scalar field has returned to its default.\n      self.assertEqual(0, getattr(composite_field, scalar_field_name))\n\n      # Finally, ensure that modifications to the old composite field object\n      # don't have any effect on the parent. Possible only with the pure-python\n      # implementation of the API.\n      #\n      # (NOTE that when we clear the composite field in the parent, we actually\n      # don't recursively clear down the tree.  Instead, we just disconnect the\n      # cleared composite from the tree.)\n      if api_implementation.Type() != 'python':\n        return\n      self.assertTrue(old_composite_field is not composite_field)\n      setattr(old_composite_field, scalar_field_name, new_val)\n      self.assertTrue(not composite_field.HasField(scalar_field_name))\n      self.assertTrue(not proto.HasField(composite_field_name))\n      self.assertEqual(0, getattr(composite_field, scalar_field_name))\n\n    # Test simple, single-level nesting when we set a scalar.\n    TestCompositeHasBits('optionalgroup', 'a')\n    TestCompositeHasBits('optional_nested_message', 'bb')\n    TestCompositeHasBits('optional_foreign_message', 'c')\n    TestCompositeHasBits('optional_import_message', 'd')\n\n  def testReferencesToNestedMessage(self):\n    proto = unittest_pb2.TestAllTypes()\n    nested = proto.optional_nested_message\n    del proto\n    # A previous version had a bug where this would raise an exception when\n    # hitting a now-dead weak reference.\n    nested.bb = 23\n\n  def testDisconnectingNestedMessageBeforeSettingField(self):\n    if api_implementation.Type() != 'python':\n      return\n    proto = unittest_pb2.TestAllTypes()\n    nested = proto.optional_nested_message\n    proto.ClearField('optional_nested_message')  # Should disconnect from parent\n    self.assertTrue(nested is not proto.optional_nested_message)\n    nested.bb = 23\n    self.assertTrue(not proto.HasField('optional_nested_message'))\n    self.assertEqual(0, proto.optional_nested_message.bb)\n\n  def testHasBitsWhenModifyingRepeatedFields(self):\n    # Test nesting when we add an element to a repeated field in a submessage.\n    proto = unittest_pb2.TestNestedMessageHasBits()\n    proto.optional_nested_message.nestedmessage_repeated_int32.append(5)\n    self.assertEqual(\n        [5], proto.optional_nested_message.nestedmessage_repeated_int32)\n    self.assertTrue(proto.HasField('optional_nested_message'))\n\n    # Do the same test, but with a repeated composite field within the\n    # submessage.\n    proto.ClearField('optional_nested_message')\n    self.assertTrue(not proto.HasField('optional_nested_message'))\n    proto.optional_nested_message.nestedmessage_repeated_foreignmessage.add()\n    self.assertTrue(proto.HasField('optional_nested_message'))\n\n  def testHasBitsForManyLevelsOfNesting(self):\n    # Test nesting many levels deep.\n    recursive_proto = unittest_pb2.TestMutualRecursionA()\n    self.assertTrue(not recursive_proto.HasField('bb'))\n    self.assertEqual(0, recursive_proto.bb.a.bb.a.bb.optional_int32)\n    self.assertTrue(not recursive_proto.HasField('bb'))\n    recursive_proto.bb.a.bb.a.bb.optional_int32 = 5\n    self.assertEqual(5, recursive_proto.bb.a.bb.a.bb.optional_int32)\n    self.assertTrue(recursive_proto.HasField('bb'))\n    self.assertTrue(recursive_proto.bb.HasField('a'))\n    self.assertTrue(recursive_proto.bb.a.HasField('bb'))\n    self.assertTrue(recursive_proto.bb.a.bb.HasField('a'))\n    self.assertTrue(recursive_proto.bb.a.bb.a.HasField('bb'))\n    self.assertTrue(not recursive_proto.bb.a.bb.a.bb.HasField('a'))\n    self.assertTrue(recursive_proto.bb.a.bb.a.bb.HasField('optional_int32'))\n\n  def testSingularListFields(self):\n    proto = unittest_pb2.TestAllTypes()\n    proto.optional_fixed32 = 1\n    proto.optional_int32 = 5\n    proto.optional_string = 'foo'\n    # Access sub-message but don't set it yet.\n    nested_message = proto.optional_nested_message\n    self.assertEqual(\n      [ (proto.DESCRIPTOR.fields_by_name['optional_int32'  ], 5),\n        (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1),\n        (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo') ],\n      proto.ListFields())\n\n    proto.optional_nested_message.bb = 123\n    self.assertEqual(\n      [ (proto.DESCRIPTOR.fields_by_name['optional_int32'  ], 5),\n        (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1),\n        (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo'),\n        (proto.DESCRIPTOR.fields_by_name['optional_nested_message' ],\n             nested_message) ],\n      proto.ListFields())\n\n  def testRepeatedListFields(self):\n    proto = unittest_pb2.TestAllTypes()\n    proto.repeated_fixed32.append(1)\n    proto.repeated_int32.append(5)\n    proto.repeated_int32.append(11)\n    proto.repeated_string.extend(['foo', 'bar'])\n    proto.repeated_string.extend([])\n    proto.repeated_string.append('baz')\n    proto.repeated_string.extend(str(x) for x in xrange(2))\n    proto.optional_int32 = 21\n    proto.repeated_bool  # Access but don't set anything; should not be listed.\n    self.assertEqual(\n      [ (proto.DESCRIPTOR.fields_by_name['optional_int32'  ], 21),\n        (proto.DESCRIPTOR.fields_by_name['repeated_int32'  ], [5, 11]),\n        (proto.DESCRIPTOR.fields_by_name['repeated_fixed32'], [1]),\n        (proto.DESCRIPTOR.fields_by_name['repeated_string' ],\n          ['foo', 'bar', 'baz', '0', '1']) ],\n      proto.ListFields())\n\n  def testSingularListExtensions(self):\n    proto = unittest_pb2.TestAllExtensions()\n    proto.Extensions[unittest_pb2.optional_fixed32_extension] = 1\n    proto.Extensions[unittest_pb2.optional_int32_extension  ] = 5\n    proto.Extensions[unittest_pb2.optional_string_extension ] = 'foo'\n    self.assertEqual(\n      [ (unittest_pb2.optional_int32_extension  , 5),\n        (unittest_pb2.optional_fixed32_extension, 1),\n        (unittest_pb2.optional_string_extension , 'foo') ],\n      proto.ListFields())\n\n  def testRepeatedListExtensions(self):\n    proto = unittest_pb2.TestAllExtensions()\n    proto.Extensions[unittest_pb2.repeated_fixed32_extension].append(1)\n    proto.Extensions[unittest_pb2.repeated_int32_extension  ].append(5)\n    proto.Extensions[unittest_pb2.repeated_int32_extension  ].append(11)\n    proto.Extensions[unittest_pb2.repeated_string_extension ].append('foo')\n    proto.Extensions[unittest_pb2.repeated_string_extension ].append('bar')\n    proto.Extensions[unittest_pb2.repeated_string_extension ].append('baz')\n    proto.Extensions[unittest_pb2.optional_int32_extension  ] = 21\n    self.assertEqual(\n      [ (unittest_pb2.optional_int32_extension  , 21),\n        (unittest_pb2.repeated_int32_extension  , [5, 11]),\n        (unittest_pb2.repeated_fixed32_extension, [1]),\n        (unittest_pb2.repeated_string_extension , ['foo', 'bar', 'baz']) ],\n      proto.ListFields())\n\n  def testListFieldsAndExtensions(self):\n    proto = unittest_pb2.TestFieldOrderings()\n    test_util.SetAllFieldsAndExtensions(proto)\n    unittest_pb2.my_extension_int\n    self.assertEqual(\n      [ (proto.DESCRIPTOR.fields_by_name['my_int'   ], 1),\n        (unittest_pb2.my_extension_int               , 23),\n        (proto.DESCRIPTOR.fields_by_name['my_string'], 'foo'),\n        (unittest_pb2.my_extension_string            , 'bar'),\n        (proto.DESCRIPTOR.fields_by_name['my_float' ], 1.0) ],\n      proto.ListFields())\n\n  def testDefaultValues(self):\n    proto = unittest_pb2.TestAllTypes()\n    self.assertEqual(0, proto.optional_int32)\n    self.assertEqual(0, proto.optional_int64)\n    self.assertEqual(0, proto.optional_uint32)\n    self.assertEqual(0, proto.optional_uint64)\n    self.assertEqual(0, proto.optional_sint32)\n    self.assertEqual(0, proto.optional_sint64)\n    self.assertEqual(0, proto.optional_fixed32)\n    self.assertEqual(0, proto.optional_fixed64)\n    self.assertEqual(0, proto.optional_sfixed32)\n    self.assertEqual(0, proto.optional_sfixed64)\n    self.assertEqual(0.0, proto.optional_float)\n    self.assertEqual(0.0, proto.optional_double)\n    self.assertEqual(False, proto.optional_bool)\n    self.assertEqual('', proto.optional_string)\n    self.assertEqual('', proto.optional_bytes)\n\n    self.assertEqual(41, proto.default_int32)\n    self.assertEqual(42, proto.default_int64)\n    self.assertEqual(43, proto.default_uint32)\n    self.assertEqual(44, proto.default_uint64)\n    self.assertEqual(-45, proto.default_sint32)\n    self.assertEqual(46, proto.default_sint64)\n    self.assertEqual(47, proto.default_fixed32)\n    self.assertEqual(48, proto.default_fixed64)\n    self.assertEqual(49, proto.default_sfixed32)\n    self.assertEqual(-50, proto.default_sfixed64)\n    self.assertEqual(51.5, proto.default_float)\n    self.assertEqual(52e3, proto.default_double)\n    self.assertEqual(True, proto.default_bool)\n    self.assertEqual('hello', proto.default_string)\n    self.assertEqual('world', proto.default_bytes)\n    self.assertEqual(unittest_pb2.TestAllTypes.BAR, proto.default_nested_enum)\n    self.assertEqual(unittest_pb2.FOREIGN_BAR, proto.default_foreign_enum)\n    self.assertEqual(unittest_import_pb2.IMPORT_BAR,\n                     proto.default_import_enum)\n\n    proto = unittest_pb2.TestExtremeDefaultValues()\n    self.assertEqual(u'\\u1234', proto.utf8_string)\n\n  def testHasFieldWithUnknownFieldName(self):\n    proto = unittest_pb2.TestAllTypes()\n    self.assertRaises(ValueError, proto.HasField, 'nonexistent_field')\n\n  def testClearFieldWithUnknownFieldName(self):\n    proto = unittest_pb2.TestAllTypes()\n    self.assertRaises(ValueError, proto.ClearField, 'nonexistent_field')\n\n  def testDisallowedAssignments(self):\n    # It's illegal to assign values directly to repeated fields\n    # or to nonrepeated composite fields.  Ensure that this fails.\n    proto = unittest_pb2.TestAllTypes()\n    # Repeated fields.\n    self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', 10)\n    # Lists shouldn't work, either.\n    self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', [10])\n    # Composite fields.\n    self.assertRaises(AttributeError, setattr, proto,\n                      'optional_nested_message', 23)\n    # Assignment to a repeated nested message field without specifying\n    # the index in the array of nested messages.\n    self.assertRaises(AttributeError, setattr, proto.repeated_nested_message,\n                      'bb', 34)\n    # Assignment to an attribute of a repeated field.\n    self.assertRaises(AttributeError, setattr, proto.repeated_float,\n                      'some_attribute', 34)\n    # proto.nonexistent_field = 23 should fail as well.\n    self.assertRaises(AttributeError, setattr, proto, 'nonexistent_field', 23)\n\n  def testSingleScalarTypeSafety(self):\n    proto = unittest_pb2.TestAllTypes()\n    self.assertRaises(TypeError, setattr, proto, 'optional_int32', 1.1)\n    self.assertRaises(TypeError, setattr, proto, 'optional_int32', 'foo')\n    self.assertRaises(TypeError, setattr, proto, 'optional_string', 10)\n    self.assertRaises(TypeError, setattr, proto, 'optional_bytes', 10)\n\n  def testSingleScalarBoundsChecking(self):\n    def TestMinAndMaxIntegers(field_name, expected_min, expected_max):\n      pb = unittest_pb2.TestAllTypes()\n      setattr(pb, field_name, expected_min)\n      self.assertEqual(expected_min, getattr(pb, field_name))\n      setattr(pb, field_name, expected_max)\n      self.assertEqual(expected_max, getattr(pb, field_name))\n      self.assertRaises(ValueError, setattr, pb, field_name, expected_min - 1)\n      self.assertRaises(ValueError, setattr, pb, field_name, expected_max + 1)\n\n    TestMinAndMaxIntegers('optional_int32', -(1 << 31), (1 << 31) - 1)\n    TestMinAndMaxIntegers('optional_uint32', 0, 0xffffffff)\n    TestMinAndMaxIntegers('optional_int64', -(1 << 63), (1 << 63) - 1)\n    TestMinAndMaxIntegers('optional_uint64', 0, 0xffffffffffffffff)\n\n    pb = unittest_pb2.TestAllTypes()\n    pb.optional_nested_enum = 1\n    self.assertEqual(1, pb.optional_nested_enum)\n\n    # Invalid enum values.\n    pb.optional_nested_enum = 0\n    self.assertEqual(0, pb.optional_nested_enum)\n\n    bytes_size_before = pb.ByteSize()\n\n    pb.optional_nested_enum = 4\n    self.assertEqual(4, pb.optional_nested_enum)\n\n    pb.optional_nested_enum = 0\n    self.assertEqual(0, pb.optional_nested_enum)\n\n    # Make sure that setting the same enum field doesn't just add unknown\n    # fields (but overwrites them).\n    self.assertEqual(bytes_size_before, pb.ByteSize())\n\n    # Is the invalid value preserved after serialization?\n    serialized = pb.SerializeToString()\n    pb2 = unittest_pb2.TestAllTypes()\n    pb2.ParseFromString(serialized)\n    self.assertEqual(0, pb2.optional_nested_enum)\n    self.assertEqual(pb, pb2)\n\n  def testRepeatedScalarTypeSafety(self):\n    proto = unittest_pb2.TestAllTypes()\n    self.assertRaises(TypeError, proto.repeated_int32.append, 1.1)\n    self.assertRaises(TypeError, proto.repeated_int32.append, 'foo')\n    self.assertRaises(TypeError, proto.repeated_string, 10)\n    self.assertRaises(TypeError, proto.repeated_bytes, 10)\n\n    proto.repeated_int32.append(10)\n    proto.repeated_int32[0] = 23\n    self.assertRaises(IndexError, proto.repeated_int32.__setitem__, 500, 23)\n    self.assertRaises(TypeError, proto.repeated_int32.__setitem__, 0, 'abc')\n\n    # Repeated enums tests.\n    #proto.repeated_nested_enum.append(0)\n\n  def testSingleScalarGettersAndSetters(self):\n    proto = unittest_pb2.TestAllTypes()\n    self.assertEqual(0, proto.optional_int32)\n    proto.optional_int32 = 1\n    self.assertEqual(1, proto.optional_int32)\n\n    proto.optional_uint64 = 0xffffffffffff\n    self.assertEqual(0xffffffffffff, proto.optional_uint64)\n    proto.optional_uint64 = 0xffffffffffffffff\n    self.assertEqual(0xffffffffffffffff, proto.optional_uint64)\n    # TODO(robinson): Test all other scalar field types.\n\n  def testSingleScalarClearField(self):\n    proto = unittest_pb2.TestAllTypes()\n    # Should be allowed to clear something that's not there (a no-op).\n    proto.ClearField('optional_int32')\n    proto.optional_int32 = 1\n    self.assertTrue(proto.HasField('optional_int32'))\n    proto.ClearField('optional_int32')\n    self.assertEqual(0, proto.optional_int32)\n    self.assertTrue(not proto.HasField('optional_int32'))\n    # TODO(robinson): Test all other scalar field types.\n\n  def testEnums(self):\n    proto = unittest_pb2.TestAllTypes()\n    self.assertEqual(1, proto.FOO)\n    self.assertEqual(1, unittest_pb2.TestAllTypes.FOO)\n    self.assertEqual(2, proto.BAR)\n    self.assertEqual(2, unittest_pb2.TestAllTypes.BAR)\n    self.assertEqual(3, proto.BAZ)\n    self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ)\n\n  def testRepeatedScalars(self):\n    proto = unittest_pb2.TestAllTypes()\n\n    self.assertTrue(not proto.repeated_int32)\n    self.assertEqual(0, len(proto.repeated_int32))\n    proto.repeated_int32.append(5)\n    proto.repeated_int32.append(10)\n    proto.repeated_int32.append(15)\n    self.assertTrue(proto.repeated_int32)\n    self.assertEqual(3, len(proto.repeated_int32))\n\n    self.assertEqual([5, 10, 15], proto.repeated_int32)\n\n    # Test single retrieval.\n    self.assertEqual(5, proto.repeated_int32[0])\n    self.assertEqual(15, proto.repeated_int32[-1])\n    # Test out-of-bounds indices.\n    self.assertRaises(IndexError, proto.repeated_int32.__getitem__, 1234)\n    self.assertRaises(IndexError, proto.repeated_int32.__getitem__, -1234)\n    # Test incorrect types passed to __getitem__.\n    self.assertRaises(TypeError, proto.repeated_int32.__getitem__, 'foo')\n    self.assertRaises(TypeError, proto.repeated_int32.__getitem__, None)\n\n    # Test single assignment.\n    proto.repeated_int32[1] = 20\n    self.assertEqual([5, 20, 15], proto.repeated_int32)\n\n    # Test insertion.\n    proto.repeated_int32.insert(1, 25)\n    self.assertEqual([5, 25, 20, 15], proto.repeated_int32)\n\n    # Test slice retrieval.\n    proto.repeated_int32.append(30)\n    self.assertEqual([25, 20, 15], proto.repeated_int32[1:4])\n    self.assertEqual([5, 25, 20, 15, 30], proto.repeated_int32[:])\n\n    # Test slice assignment with an iterator\n    proto.repeated_int32[1:4] = (i for i in xrange(3))\n    self.assertEqual([5, 0, 1, 2, 30], proto.repeated_int32)\n\n    # Test slice assignment.\n    proto.repeated_int32[1:4] = [35, 40, 45]\n    self.assertEqual([5, 35, 40, 45, 30], proto.repeated_int32)\n\n    # Test that we can use the field as an iterator.\n    result = []\n    for i in proto.repeated_int32:\n      result.append(i)\n    self.assertEqual([5, 35, 40, 45, 30], result)\n\n    # Test single deletion.\n    del proto.repeated_int32[2]\n    self.assertEqual([5, 35, 45, 30], proto.repeated_int32)\n\n    # Test slice deletion.\n    del proto.repeated_int32[2:]\n    self.assertEqual([5, 35], proto.repeated_int32)\n\n    # Test extending.\n    proto.repeated_int32.extend([3, 13])\n    self.assertEqual([5, 35, 3, 13], proto.repeated_int32)\n\n    # Test clearing.\n    proto.ClearField('repeated_int32')\n    self.assertTrue(not proto.repeated_int32)\n    self.assertEqual(0, len(proto.repeated_int32))\n\n    proto.repeated_int32.append(1)\n    self.assertEqual(1, proto.repeated_int32[-1])\n    # Test assignment to a negative index.\n    proto.repeated_int32[-1] = 2\n    self.assertEqual(2, proto.repeated_int32[-1])\n\n    # Test deletion at negative indices.\n    proto.repeated_int32[:] = [0, 1, 2, 3]\n    del proto.repeated_int32[-1]\n    self.assertEqual([0, 1, 2], proto.repeated_int32)\n\n    del proto.repeated_int32[-2]\n    self.assertEqual([0, 2], proto.repeated_int32)\n\n    self.assertRaises(IndexError, proto.repeated_int32.__delitem__, -3)\n    self.assertRaises(IndexError, proto.repeated_int32.__delitem__, 300)\n\n    del proto.repeated_int32[-2:-1]\n    self.assertEqual([2], proto.repeated_int32)\n\n    del proto.repeated_int32[100:10000]\n    self.assertEqual([2], proto.repeated_int32)\n\n  def testRepeatedScalarsRemove(self):\n    proto = unittest_pb2.TestAllTypes()\n\n    self.assertTrue(not proto.repeated_int32)\n    self.assertEqual(0, len(proto.repeated_int32))\n    proto.repeated_int32.append(5)\n    proto.repeated_int32.append(10)\n    proto.repeated_int32.append(5)\n    proto.repeated_int32.append(5)\n\n    self.assertEqual(4, len(proto.repeated_int32))\n    proto.repeated_int32.remove(5)\n    self.assertEqual(3, len(proto.repeated_int32))\n    self.assertEqual(10, proto.repeated_int32[0])\n    self.assertEqual(5, proto.repeated_int32[1])\n    self.assertEqual(5, proto.repeated_int32[2])\n\n    proto.repeated_int32.remove(5)\n    self.assertEqual(2, len(proto.repeated_int32))\n    self.assertEqual(10, proto.repeated_int32[0])\n    self.assertEqual(5, proto.repeated_int32[1])\n\n    proto.repeated_int32.remove(10)\n    self.assertEqual(1, len(proto.repeated_int32))\n    self.assertEqual(5, proto.repeated_int32[0])\n\n    # Remove a non-existent element.\n    self.assertRaises(ValueError, proto.repeated_int32.remove, 123)\n\n  def testRepeatedComposites(self):\n    proto = unittest_pb2.TestAllTypes()\n    self.assertTrue(not proto.repeated_nested_message)\n    self.assertEqual(0, len(proto.repeated_nested_message))\n    m0 = proto.repeated_nested_message.add()\n    m1 = proto.repeated_nested_message.add()\n    self.assertTrue(proto.repeated_nested_message)\n    self.assertEqual(2, len(proto.repeated_nested_message))\n    self.assertListsEqual([m0, m1], proto.repeated_nested_message)\n    self.assertTrue(isinstance(m0, unittest_pb2.TestAllTypes.NestedMessage))\n\n    # Test out-of-bounds indices.\n    self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__,\n                      1234)\n    self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__,\n                      -1234)\n\n    # Test incorrect types passed to __getitem__.\n    self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__,\n                      'foo')\n    self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__,\n                      None)\n\n    # Test slice retrieval.\n    m2 = proto.repeated_nested_message.add()\n    m3 = proto.repeated_nested_message.add()\n    m4 = proto.repeated_nested_message.add()\n    self.assertListsEqual(\n        [m1, m2, m3], proto.repeated_nested_message[1:4])\n    self.assertListsEqual(\n        [m0, m1, m2, m3, m4], proto.repeated_nested_message[:])\n    self.assertListsEqual(\n        [m0, m1], proto.repeated_nested_message[:2])\n    self.assertListsEqual(\n        [m2, m3, m4], proto.repeated_nested_message[2:])\n    self.assertEqual(\n        m0, proto.repeated_nested_message[0])\n    self.assertListsEqual(\n        [m0], proto.repeated_nested_message[:1])\n\n    # Test that we can use the field as an iterator.\n    result = []\n    for i in proto.repeated_nested_message:\n      result.append(i)\n    self.assertListsEqual([m0, m1, m2, m3, m4], result)\n\n    # Test single deletion.\n    del proto.repeated_nested_message[2]\n    self.assertListsEqual([m0, m1, m3, m4], proto.repeated_nested_message)\n\n    # Test slice deletion.\n    del proto.repeated_nested_message[2:]\n    self.assertListsEqual([m0, m1], proto.repeated_nested_message)\n\n    # Test extending.\n    n1 = unittest_pb2.TestAllTypes.NestedMessage(bb=1)\n    n2 = unittest_pb2.TestAllTypes.NestedMessage(bb=2)\n    proto.repeated_nested_message.extend([n1,n2])\n    self.assertEqual(4, len(proto.repeated_nested_message))\n    self.assertEqual(n1, proto.repeated_nested_message[2])\n    self.assertEqual(n2, proto.repeated_nested_message[3])\n\n    # Test clearing.\n    proto.ClearField('repeated_nested_message')\n    self.assertTrue(not proto.repeated_nested_message)\n    self.assertEqual(0, len(proto.repeated_nested_message))\n\n    # Test constructing an element while adding it.\n    proto.repeated_nested_message.add(bb=23)\n    self.assertEqual(1, len(proto.repeated_nested_message))\n    self.assertEqual(23, proto.repeated_nested_message[0].bb)\n\n  def testHandWrittenReflection(self):\n    # Hand written extensions are only supported by the pure-Python\n    # implementation of the API.\n    if api_implementation.Type() != 'python':\n      return\n\n    FieldDescriptor = descriptor.FieldDescriptor\n    foo_field_descriptor = FieldDescriptor(\n        name='foo_field', full_name='MyProto.foo_field',\n        index=0, number=1, type=FieldDescriptor.TYPE_INT64,\n        cpp_type=FieldDescriptor.CPPTYPE_INT64,\n        label=FieldDescriptor.LABEL_OPTIONAL, default_value=0,\n        containing_type=None, message_type=None, enum_type=None,\n        is_extension=False, extension_scope=None,\n        options=descriptor_pb2.FieldOptions())\n    mydescriptor = descriptor.Descriptor(\n        name='MyProto', full_name='MyProto', filename='ignored',\n        containing_type=None, nested_types=[], enum_types=[],\n        fields=[foo_field_descriptor], extensions=[],\n        options=descriptor_pb2.MessageOptions())\n    class MyProtoClass(message.Message):\n      DESCRIPTOR = mydescriptor\n      __metaclass__ = reflection.GeneratedProtocolMessageType\n    myproto_instance = MyProtoClass()\n    self.assertEqual(0, myproto_instance.foo_field)\n    self.assertTrue(not myproto_instance.HasField('foo_field'))\n    myproto_instance.foo_field = 23\n    self.assertEqual(23, myproto_instance.foo_field)\n    self.assertTrue(myproto_instance.HasField('foo_field'))\n\n  def testTopLevelExtensionsForOptionalScalar(self):\n    extendee_proto = unittest_pb2.TestAllExtensions()\n    extension = unittest_pb2.optional_int32_extension\n    self.assertTrue(not extendee_proto.HasExtension(extension))\n    self.assertEqual(0, extendee_proto.Extensions[extension])\n    # As with normal scalar fields, just doing a read doesn't actually set the\n    # \"has\" bit.\n    self.assertTrue(not extendee_proto.HasExtension(extension))\n    # Actually set the thing.\n    extendee_proto.Extensions[extension] = 23\n    self.assertEqual(23, extendee_proto.Extensions[extension])\n    self.assertTrue(extendee_proto.HasExtension(extension))\n    # Ensure that clearing works as well.\n    extendee_proto.ClearExtension(extension)\n    self.assertEqual(0, extendee_proto.Extensions[extension])\n    self.assertTrue(not extendee_proto.HasExtension(extension))\n\n  def testTopLevelExtensionsForRepeatedScalar(self):\n    extendee_proto = unittest_pb2.TestAllExtensions()\n    extension = unittest_pb2.repeated_string_extension\n    self.assertEqual(0, len(extendee_proto.Extensions[extension]))\n    extendee_proto.Extensions[extension].append('foo')\n    self.assertEqual(['foo'], extendee_proto.Extensions[extension])\n    string_list = extendee_proto.Extensions[extension]\n    extendee_proto.ClearExtension(extension)\n    self.assertEqual(0, len(extendee_proto.Extensions[extension]))\n    self.assertTrue(string_list is not extendee_proto.Extensions[extension])\n    # Shouldn't be allowed to do Extensions[extension] = 'a'\n    self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,\n                      extension, 'a')\n\n  def testTopLevelExtensionsForOptionalMessage(self):\n    extendee_proto = unittest_pb2.TestAllExtensions()\n    extension = unittest_pb2.optional_foreign_message_extension\n    self.assertTrue(not extendee_proto.HasExtension(extension))\n    self.assertEqual(0, extendee_proto.Extensions[extension].c)\n    # As with normal (non-extension) fields, merely reading from the\n    # thing shouldn't set the \"has\" bit.\n    self.assertTrue(not extendee_proto.HasExtension(extension))\n    extendee_proto.Extensions[extension].c = 23\n    self.assertEqual(23, extendee_proto.Extensions[extension].c)\n    self.assertTrue(extendee_proto.HasExtension(extension))\n    # Save a reference here.\n    foreign_message = extendee_proto.Extensions[extension]\n    extendee_proto.ClearExtension(extension)\n    self.assertTrue(foreign_message is not extendee_proto.Extensions[extension])\n    # Setting a field on foreign_message now shouldn't set\n    # any \"has\" bits on extendee_proto.\n    foreign_message.c = 42\n    self.assertEqual(42, foreign_message.c)\n    self.assertTrue(foreign_message.HasField('c'))\n    self.assertTrue(not extendee_proto.HasExtension(extension))\n    # Shouldn't be allowed to do Extensions[extension] = 'a'\n    self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,\n                      extension, 'a')\n\n  def testTopLevelExtensionsForRepeatedMessage(self):\n    extendee_proto = unittest_pb2.TestAllExtensions()\n    extension = unittest_pb2.repeatedgroup_extension\n    self.assertEqual(0, len(extendee_proto.Extensions[extension]))\n    group = extendee_proto.Extensions[extension].add()\n    group.a = 23\n    self.assertEqual(23, extendee_proto.Extensions[extension][0].a)\n    group.a = 42\n    self.assertEqual(42, extendee_proto.Extensions[extension][0].a)\n    group_list = extendee_proto.Extensions[extension]\n    extendee_proto.ClearExtension(extension)\n    self.assertEqual(0, len(extendee_proto.Extensions[extension]))\n    self.assertTrue(group_list is not extendee_proto.Extensions[extension])\n    # Shouldn't be allowed to do Extensions[extension] = 'a'\n    self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,\n                      extension, 'a')\n\n  def testNestedExtensions(self):\n    extendee_proto = unittest_pb2.TestAllExtensions()\n    extension = unittest_pb2.TestRequired.single\n\n    # We just test the non-repeated case.\n    self.assertTrue(not extendee_proto.HasExtension(extension))\n    required = extendee_proto.Extensions[extension]\n    self.assertEqual(0, required.a)\n    self.assertTrue(not extendee_proto.HasExtension(extension))\n    required.a = 23\n    self.assertEqual(23, extendee_proto.Extensions[extension].a)\n    self.assertTrue(extendee_proto.HasExtension(extension))\n    extendee_proto.ClearExtension(extension)\n    self.assertTrue(required is not extendee_proto.Extensions[extension])\n    self.assertTrue(not extendee_proto.HasExtension(extension))\n\n  # If message A directly contains message B, and\n  # a.HasField('b') is currently False, then mutating any\n  # extension in B should change a.HasField('b') to True\n  # (and so on up the object tree).\n  def testHasBitsForAncestorsOfExtendedMessage(self):\n    # Optional scalar extension.\n    toplevel = more_extensions_pb2.TopLevelMessage()\n    self.assertTrue(not toplevel.HasField('submessage'))\n    self.assertEqual(0, toplevel.submessage.Extensions[\n        more_extensions_pb2.optional_int_extension])\n    self.assertTrue(not toplevel.HasField('submessage'))\n    toplevel.submessage.Extensions[\n        more_extensions_pb2.optional_int_extension] = 23\n    self.assertEqual(23, toplevel.submessage.Extensions[\n        more_extensions_pb2.optional_int_extension])\n    self.assertTrue(toplevel.HasField('submessage'))\n\n    # Repeated scalar extension.\n    toplevel = more_extensions_pb2.TopLevelMessage()\n    self.assertTrue(not toplevel.HasField('submessage'))\n    self.assertEqual([], toplevel.submessage.Extensions[\n        more_extensions_pb2.repeated_int_extension])\n    self.assertTrue(not toplevel.HasField('submessage'))\n    toplevel.submessage.Extensions[\n        more_extensions_pb2.repeated_int_extension].append(23)\n    self.assertEqual([23], toplevel.submessage.Extensions[\n        more_extensions_pb2.repeated_int_extension])\n    self.assertTrue(toplevel.HasField('submessage'))\n\n    # Optional message extension.\n    toplevel = more_extensions_pb2.TopLevelMessage()\n    self.assertTrue(not toplevel.HasField('submessage'))\n    self.assertEqual(0, toplevel.submessage.Extensions[\n        more_extensions_pb2.optional_message_extension].foreign_message_int)\n    self.assertTrue(not toplevel.HasField('submessage'))\n    toplevel.submessage.Extensions[\n        more_extensions_pb2.optional_message_extension].foreign_message_int = 23\n    self.assertEqual(23, toplevel.submessage.Extensions[\n        more_extensions_pb2.optional_message_extension].foreign_message_int)\n    self.assertTrue(toplevel.HasField('submessage'))\n\n    # Repeated message extension.\n    toplevel = more_extensions_pb2.TopLevelMessage()\n    self.assertTrue(not toplevel.HasField('submessage'))\n    self.assertEqual(0, len(toplevel.submessage.Extensions[\n        more_extensions_pb2.repeated_message_extension]))\n    self.assertTrue(not toplevel.HasField('submessage'))\n    foreign = toplevel.submessage.Extensions[\n        more_extensions_pb2.repeated_message_extension].add()\n    self.assertEqual(foreign, toplevel.submessage.Extensions[\n        more_extensions_pb2.repeated_message_extension][0])\n    self.assertTrue(toplevel.HasField('submessage'))\n\n  def testDisconnectionAfterClearingEmptyMessage(self):\n    toplevel = more_extensions_pb2.TopLevelMessage()\n    extendee_proto = toplevel.submessage\n    extension = more_extensions_pb2.optional_message_extension\n    extension_proto = extendee_proto.Extensions[extension]\n    extendee_proto.ClearExtension(extension)\n    extension_proto.foreign_message_int = 23\n\n    self.assertTrue(extension_proto is not extendee_proto.Extensions[extension])\n\n  def testExtensionFailureModes(self):\n    extendee_proto = unittest_pb2.TestAllExtensions()\n\n    # Try non-extension-handle arguments to HasExtension,\n    # ClearExtension(), and Extensions[]...\n    self.assertRaises(KeyError, extendee_proto.HasExtension, 1234)\n    self.assertRaises(KeyError, extendee_proto.ClearExtension, 1234)\n    self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__, 1234)\n    self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__, 1234, 5)\n\n    # Try something that *is* an extension handle, just not for\n    # this message...\n    unknown_handle = more_extensions_pb2.optional_int_extension\n    self.assertRaises(KeyError, extendee_proto.HasExtension,\n                      unknown_handle)\n    self.assertRaises(KeyError, extendee_proto.ClearExtension,\n                      unknown_handle)\n    self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__,\n                      unknown_handle)\n    self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__,\n                      unknown_handle, 5)\n\n    # Try call HasExtension() with a valid handle, but for a\n    # *repeated* field.  (Just as with non-extension repeated\n    # fields, Has*() isn't supported for extension repeated fields).\n    self.assertRaises(KeyError, extendee_proto.HasExtension,\n                      unittest_pb2.repeated_string_extension)\n\n  def testStaticParseFrom(self):\n    proto1 = unittest_pb2.TestAllTypes()\n    test_util.SetAllFields(proto1)\n\n    string1 = proto1.SerializeToString()\n    proto2 = unittest_pb2.TestAllTypes.FromString(string1)\n\n    # Messages should be equal.\n    self.assertEqual(proto2, proto1)\n\n  def testMergeFromSingularField(self):\n    # Test merge with just a singular field.\n    proto1 = unittest_pb2.TestAllTypes()\n    proto1.optional_int32 = 1\n\n    proto2 = unittest_pb2.TestAllTypes()\n    # This shouldn't get overwritten.\n    proto2.optional_string = 'value'\n\n    proto2.MergeFrom(proto1)\n    self.assertEqual(1, proto2.optional_int32)\n    self.assertEqual('value', proto2.optional_string)\n\n  def testMergeFromRepeatedField(self):\n    # Test merge with just a repeated field.\n    proto1 = unittest_pb2.TestAllTypes()\n    proto1.repeated_int32.append(1)\n    proto1.repeated_int32.append(2)\n\n    proto2 = unittest_pb2.TestAllTypes()\n    proto2.repeated_int32.append(0)\n    proto2.MergeFrom(proto1)\n\n    self.assertEqual(0, proto2.repeated_int32[0])\n    self.assertEqual(1, proto2.repeated_int32[1])\n    self.assertEqual(2, proto2.repeated_int32[2])\n\n  def testMergeFromOptionalGroup(self):\n    # Test merge with an optional group.\n    proto1 = unittest_pb2.TestAllTypes()\n    proto1.optionalgroup.a = 12\n    proto2 = unittest_pb2.TestAllTypes()\n    proto2.MergeFrom(proto1)\n    self.assertEqual(12, proto2.optionalgroup.a)\n\n  def testMergeFromRepeatedNestedMessage(self):\n    # Test merge with a repeated nested message.\n    proto1 = unittest_pb2.TestAllTypes()\n    m = proto1.repeated_nested_message.add()\n    m.bb = 123\n    m = proto1.repeated_nested_message.add()\n    m.bb = 321\n\n    proto2 = unittest_pb2.TestAllTypes()\n    m = proto2.repeated_nested_message.add()\n    m.bb = 999\n    proto2.MergeFrom(proto1)\n    self.assertEqual(999, proto2.repeated_nested_message[0].bb)\n    self.assertEqual(123, proto2.repeated_nested_message[1].bb)\n    self.assertEqual(321, proto2.repeated_nested_message[2].bb)\n\n    proto3 = unittest_pb2.TestAllTypes()\n    proto3.repeated_nested_message.MergeFrom(proto2.repeated_nested_message)\n    self.assertEqual(999, proto3.repeated_nested_message[0].bb)\n    self.assertEqual(123, proto3.repeated_nested_message[1].bb)\n    self.assertEqual(321, proto3.repeated_nested_message[2].bb)\n\n  def testMergeFromAllFields(self):\n    # With all fields set.\n    proto1 = unittest_pb2.TestAllTypes()\n    test_util.SetAllFields(proto1)\n    proto2 = unittest_pb2.TestAllTypes()\n    proto2.MergeFrom(proto1)\n\n    # Messages should be equal.\n    self.assertEqual(proto2, proto1)\n\n    # Serialized string should be equal too.\n    string1 = proto1.SerializeToString()\n    string2 = proto2.SerializeToString()\n    self.assertEqual(string1, string2)\n\n  def testMergeFromExtensionsSingular(self):\n    proto1 = unittest_pb2.TestAllExtensions()\n    proto1.Extensions[unittest_pb2.optional_int32_extension] = 1\n\n    proto2 = unittest_pb2.TestAllExtensions()\n    proto2.MergeFrom(proto1)\n    self.assertEqual(\n        1, proto2.Extensions[unittest_pb2.optional_int32_extension])\n\n  def testMergeFromExtensionsRepeated(self):\n    proto1 = unittest_pb2.TestAllExtensions()\n    proto1.Extensions[unittest_pb2.repeated_int32_extension].append(1)\n    proto1.Extensions[unittest_pb2.repeated_int32_extension].append(2)\n\n    proto2 = unittest_pb2.TestAllExtensions()\n    proto2.Extensions[unittest_pb2.repeated_int32_extension].append(0)\n    proto2.MergeFrom(proto1)\n    self.assertEqual(\n        3, len(proto2.Extensions[unittest_pb2.repeated_int32_extension]))\n    self.assertEqual(\n        0, proto2.Extensions[unittest_pb2.repeated_int32_extension][0])\n    self.assertEqual(\n        1, proto2.Extensions[unittest_pb2.repeated_int32_extension][1])\n    self.assertEqual(\n        2, proto2.Extensions[unittest_pb2.repeated_int32_extension][2])\n\n  def testMergeFromExtensionsNestedMessage(self):\n    proto1 = unittest_pb2.TestAllExtensions()\n    ext1 = proto1.Extensions[\n        unittest_pb2.repeated_nested_message_extension]\n    m = ext1.add()\n    m.bb = 222\n    m = ext1.add()\n    m.bb = 333\n\n    proto2 = unittest_pb2.TestAllExtensions()\n    ext2 = proto2.Extensions[\n        unittest_pb2.repeated_nested_message_extension]\n    m = ext2.add()\n    m.bb = 111\n\n    proto2.MergeFrom(proto1)\n    ext2 = proto2.Extensions[\n        unittest_pb2.repeated_nested_message_extension]\n    self.assertEqual(3, len(ext2))\n    self.assertEqual(111, ext2[0].bb)\n    self.assertEqual(222, ext2[1].bb)\n    self.assertEqual(333, ext2[2].bb)\n\n  def testMergeFromBug(self):\n    message1 = unittest_pb2.TestAllTypes()\n    message2 = unittest_pb2.TestAllTypes()\n\n    # Cause optional_nested_message to be instantiated within message1, even\n    # though it is not considered to be \"present\".\n    message1.optional_nested_message\n    self.assertFalse(message1.HasField('optional_nested_message'))\n\n    # Merge into message2.  This should not instantiate the field is message2.\n    message2.MergeFrom(message1)\n    self.assertFalse(message2.HasField('optional_nested_message'))\n\n  def testCopyFromSingularField(self):\n    # Test copy with just a singular field.\n    proto1 = unittest_pb2.TestAllTypes()\n    proto1.optional_int32 = 1\n    proto1.optional_string = 'important-text'\n\n    proto2 = unittest_pb2.TestAllTypes()\n    proto2.optional_string = 'value'\n\n    proto2.CopyFrom(proto1)\n    self.assertEqual(1, proto2.optional_int32)\n    self.assertEqual('important-text', proto2.optional_string)\n\n  def testCopyFromRepeatedField(self):\n    # Test copy with a repeated field.\n    proto1 = unittest_pb2.TestAllTypes()\n    proto1.repeated_int32.append(1)\n    proto1.repeated_int32.append(2)\n\n    proto2 = unittest_pb2.TestAllTypes()\n    proto2.repeated_int32.append(0)\n    proto2.CopyFrom(proto1)\n\n    self.assertEqual(1, proto2.repeated_int32[0])\n    self.assertEqual(2, proto2.repeated_int32[1])\n\n  def testCopyFromAllFields(self):\n    # With all fields set.\n    proto1 = unittest_pb2.TestAllTypes()\n    test_util.SetAllFields(proto1)\n    proto2 = unittest_pb2.TestAllTypes()\n    proto2.CopyFrom(proto1)\n\n    # Messages should be equal.\n    self.assertEqual(proto2, proto1)\n\n    # Serialized string should be equal too.\n    string1 = proto1.SerializeToString()\n    string2 = proto2.SerializeToString()\n    self.assertEqual(string1, string2)\n\n  def testCopyFromSelf(self):\n    proto1 = unittest_pb2.TestAllTypes()\n    proto1.repeated_int32.append(1)\n    proto1.optional_int32 = 2\n    proto1.optional_string = 'important-text'\n\n    proto1.CopyFrom(proto1)\n    self.assertEqual(1, proto1.repeated_int32[0])\n    self.assertEqual(2, proto1.optional_int32)\n    self.assertEqual('important-text', proto1.optional_string)\n\n  def testCopyFromBadType(self):\n    # The python implementation doesn't raise an exception in this\n    # case. In theory it should.\n    if api_implementation.Type() == 'python':\n      return\n    proto1 = unittest_pb2.TestAllTypes()\n    proto2 = unittest_pb2.TestAllExtensions()\n    self.assertRaises(TypeError, proto1.CopyFrom, proto2)\n\n  def testClear(self):\n    proto = unittest_pb2.TestAllTypes()\n    test_util.SetAllFields(proto)\n    # Clear the message.\n    proto.Clear()\n    self.assertEquals(proto.ByteSize(), 0)\n    empty_proto = unittest_pb2.TestAllTypes()\n    self.assertEquals(proto, empty_proto)\n\n    # Test if extensions which were set are cleared.\n    proto = unittest_pb2.TestAllExtensions()\n    test_util.SetAllExtensions(proto)\n    # Clear the message.\n    proto.Clear()\n    self.assertEquals(proto.ByteSize(), 0)\n    empty_proto = unittest_pb2.TestAllExtensions()\n    self.assertEquals(proto, empty_proto)\n\n  def assertInitialized(self, proto):\n    self.assertTrue(proto.IsInitialized())\n    # Neither method should raise an exception.\n    proto.SerializeToString()\n    proto.SerializePartialToString()\n\n  def assertNotInitialized(self, proto):\n    self.assertFalse(proto.IsInitialized())\n    self.assertRaises(message.EncodeError, proto.SerializeToString)\n    # \"Partial\" serialization doesn't care if message is uninitialized.\n    proto.SerializePartialToString()\n\n  def testIsInitialized(self):\n    # Trivial cases - all optional fields and extensions.\n    proto = unittest_pb2.TestAllTypes()\n    self.assertInitialized(proto)\n    proto = unittest_pb2.TestAllExtensions()\n    self.assertInitialized(proto)\n\n    # The case of uninitialized required fields.\n    proto = unittest_pb2.TestRequired()\n    self.assertNotInitialized(proto)\n    proto.a = proto.b = proto.c = 2\n    self.assertInitialized(proto)\n\n    # The case of uninitialized submessage.\n    proto = unittest_pb2.TestRequiredForeign()\n    self.assertInitialized(proto)\n    proto.optional_message.a = 1\n    self.assertNotInitialized(proto)\n    proto.optional_message.b = 0\n    proto.optional_message.c = 0\n    self.assertInitialized(proto)\n\n    # Uninitialized repeated submessage.\n    message1 = proto.repeated_message.add()\n    self.assertNotInitialized(proto)\n    message1.a = message1.b = message1.c = 0\n    self.assertInitialized(proto)\n\n    # Uninitialized repeated group in an extension.\n    proto = unittest_pb2.TestAllExtensions()\n    extension = unittest_pb2.TestRequired.multi\n    message1 = proto.Extensions[extension].add()\n    message2 = proto.Extensions[extension].add()\n    self.assertNotInitialized(proto)\n    message1.a = 1\n    message1.b = 1\n    message1.c = 1\n    self.assertNotInitialized(proto)\n    message2.a = 2\n    message2.b = 2\n    message2.c = 2\n    self.assertInitialized(proto)\n\n    # Uninitialized nonrepeated message in an extension.\n    proto = unittest_pb2.TestAllExtensions()\n    extension = unittest_pb2.TestRequired.single\n    proto.Extensions[extension].a = 1\n    self.assertNotInitialized(proto)\n    proto.Extensions[extension].b = 2\n    proto.Extensions[extension].c = 3\n    self.assertInitialized(proto)\n\n    # Try passing an errors list.\n    errors = []\n    proto = unittest_pb2.TestRequired()\n    self.assertFalse(proto.IsInitialized(errors))\n    self.assertEqual(errors, ['a', 'b', 'c'])\n\n  def testStringUTF8Encoding(self):\n    proto = unittest_pb2.TestAllTypes()\n\n    # Assignment of a unicode object to a field of type 'bytes' is not allowed.\n    self.assertRaises(TypeError,\n                      setattr, proto, 'optional_bytes', u'unicode object')\n\n    # Check that the default value is of python's 'unicode' type.\n    self.assertEqual(type(proto.optional_string), unicode)\n\n    proto.optional_string = unicode('Testing')\n    self.assertEqual(proto.optional_string, str('Testing'))\n\n    # Assign a value of type 'str' which can be encoded in UTF-8.\n    proto.optional_string = str('Testing')\n    self.assertEqual(proto.optional_string, unicode('Testing'))\n\n    if api_implementation.Type() == 'python':\n      # Values of type 'str' are also accepted as long as they can be\n      # encoded in UTF-8.\n      self.assertEqual(type(proto.optional_string), str)\n\n    # Try to assign a 'str' value which contains bytes that aren't 7-bit ASCII.\n    self.assertRaises(ValueError,\n                      setattr, proto, 'optional_string', str('a\\x80a'))\n    # Assign a 'str' object which contains a UTF-8 encoded string.\n    self.assertRaises(ValueError,\n                      setattr, proto, 'optional_string', 'Тест')\n    # No exception thrown.\n    proto.optional_string = 'abc'\n\n  def testStringUTF8Serialization(self):\n    proto = unittest_mset_pb2.TestMessageSet()\n    extension_message = unittest_mset_pb2.TestMessageSetExtension2\n    extension = extension_message.message_set_extension\n\n    test_utf8 = u'Тест'\n    test_utf8_bytes = test_utf8.encode('utf-8')\n\n    # 'Test' in another language, using UTF-8 charset.\n    proto.Extensions[extension].str = test_utf8\n\n    # Serialize using the MessageSet wire format (this is specified in the\n    # .proto file).\n    serialized = proto.SerializeToString()\n\n    # Check byte size.\n    self.assertEqual(proto.ByteSize(), len(serialized))\n\n    raw = unittest_mset_pb2.RawMessageSet()\n    raw.MergeFromString(serialized)\n\n    message2 = unittest_mset_pb2.TestMessageSetExtension2()\n\n    self.assertEqual(1, len(raw.item))\n    # Check that the type_id is the same as the tag ID in the .proto file.\n    self.assertEqual(raw.item[0].type_id, 1547769)\n\n    # Check the actual bytes on the wire.\n    self.assertTrue(\n        raw.item[0].message.endswith(test_utf8_bytes))\n    message2.MergeFromString(raw.item[0].message)\n\n    self.assertEqual(type(message2.str), unicode)\n    self.assertEqual(message2.str, test_utf8)\n\n    # The pure Python API throws an exception on MergeFromString(),\n    # if any of the string fields of the message can't be UTF-8 decoded.\n    # The C++ implementation of the API has no way to check that on\n    # MergeFromString and thus has no way to throw the exception.\n    #\n    # The pure Python API always returns objects of type 'unicode' (UTF-8\n    # encoded), or 'str' (in 7 bit ASCII).\n    bytes = raw.item[0].message.replace(\n        test_utf8_bytes, len(test_utf8_bytes) * '\\xff')\n\n    unicode_decode_failed = False\n    try:\n      message2.MergeFromString(bytes)\n    except UnicodeDecodeError, e:\n      unicode_decode_failed = True\n    string_field = message2.str\n    self.assertTrue(unicode_decode_failed or type(string_field) == str)\n\n  def testEmptyNestedMessage(self):\n    proto = unittest_pb2.TestAllTypes()\n    proto.optional_nested_message.MergeFrom(\n        unittest_pb2.TestAllTypes.NestedMessage())\n    self.assertTrue(proto.HasField('optional_nested_message'))\n\n    proto = unittest_pb2.TestAllTypes()\n    proto.optional_nested_message.CopyFrom(\n        unittest_pb2.TestAllTypes.NestedMessage())\n    self.assertTrue(proto.HasField('optional_nested_message'))\n\n    proto = unittest_pb2.TestAllTypes()\n    proto.optional_nested_message.MergeFromString('')\n    self.assertTrue(proto.HasField('optional_nested_message'))\n\n    proto = unittest_pb2.TestAllTypes()\n    proto.optional_nested_message.ParseFromString('')\n    self.assertTrue(proto.HasField('optional_nested_message'))\n\n    serialized = proto.SerializeToString()\n    proto2 = unittest_pb2.TestAllTypes()\n    proto2.MergeFromString(serialized)\n    self.assertTrue(proto2.HasField('optional_nested_message'))\n\n  def testSetInParent(self):\n    proto = unittest_pb2.TestAllTypes()\n    self.assertFalse(proto.HasField('optionalgroup'))\n    proto.optionalgroup.SetInParent()\n    self.assertTrue(proto.HasField('optionalgroup'))\n\n\n#  Since we had so many tests for protocol buffer equality, we broke these out\n#  into separate TestCase classes.\n\n\nclass TestAllTypesEqualityTest(unittest.TestCase):\n\n  def setUp(self):\n    self.first_proto = unittest_pb2.TestAllTypes()\n    self.second_proto = unittest_pb2.TestAllTypes()\n\n  def testNotHashable(self):\n    self.assertRaises(TypeError, hash, self.first_proto)\n\n  def testSelfEquality(self):\n    self.assertEqual(self.first_proto, self.first_proto)\n\n  def testEmptyProtosEqual(self):\n    self.assertEqual(self.first_proto, self.second_proto)\n\n\nclass FullProtosEqualityTest(unittest.TestCase):\n\n  \"\"\"Equality tests using completely-full protos as a starting point.\"\"\"\n\n  def setUp(self):\n    self.first_proto = unittest_pb2.TestAllTypes()\n    self.second_proto = unittest_pb2.TestAllTypes()\n    test_util.SetAllFields(self.first_proto)\n    test_util.SetAllFields(self.second_proto)\n\n  def testNotHashable(self):\n    self.assertRaises(TypeError, hash, self.first_proto)\n\n  def testNoneNotEqual(self):\n    self.assertNotEqual(self.first_proto, None)\n    self.assertNotEqual(None, self.second_proto)\n\n  def testNotEqualToOtherMessage(self):\n    third_proto = unittest_pb2.TestRequired()\n    self.assertNotEqual(self.first_proto, third_proto)\n    self.assertNotEqual(third_proto, self.second_proto)\n\n  def testAllFieldsFilledEquality(self):\n    self.assertEqual(self.first_proto, self.second_proto)\n\n  def testNonRepeatedScalar(self):\n    # Nonrepeated scalar field change should cause inequality.\n    self.first_proto.optional_int32 += 1\n    self.assertNotEqual(self.first_proto, self.second_proto)\n    # ...as should clearing a field.\n    self.first_proto.ClearField('optional_int32')\n    self.assertNotEqual(self.first_proto, self.second_proto)\n\n  def testNonRepeatedComposite(self):\n    # Change a nonrepeated composite field.\n    self.first_proto.optional_nested_message.bb += 1\n    self.assertNotEqual(self.first_proto, self.second_proto)\n    self.first_proto.optional_nested_message.bb -= 1\n    self.assertEqual(self.first_proto, self.second_proto)\n    # Clear a field in the nested message.\n    self.first_proto.optional_nested_message.ClearField('bb')\n    self.assertNotEqual(self.first_proto, self.second_proto)\n    self.first_proto.optional_nested_message.bb = (\n        self.second_proto.optional_nested_message.bb)\n    self.assertEqual(self.first_proto, self.second_proto)\n    # Remove the nested message entirely.\n    self.first_proto.ClearField('optional_nested_message')\n    self.assertNotEqual(self.first_proto, self.second_proto)\n\n  def testRepeatedScalar(self):\n    # Change a repeated scalar field.\n    self.first_proto.repeated_int32.append(5)\n    self.assertNotEqual(self.first_proto, self.second_proto)\n    self.first_proto.ClearField('repeated_int32')\n    self.assertNotEqual(self.first_proto, self.second_proto)\n\n  def testRepeatedComposite(self):\n    # Change value within a repeated composite field.\n    self.first_proto.repeated_nested_message[0].bb += 1\n    self.assertNotEqual(self.first_proto, self.second_proto)\n    self.first_proto.repeated_nested_message[0].bb -= 1\n    self.assertEqual(self.first_proto, self.second_proto)\n    # Add a value to a repeated composite field.\n    self.first_proto.repeated_nested_message.add()\n    self.assertNotEqual(self.first_proto, self.second_proto)\n    self.second_proto.repeated_nested_message.add()\n    self.assertEqual(self.first_proto, self.second_proto)\n\n  def testNonRepeatedScalarHasBits(self):\n    # Ensure that we test \"has\" bits as well as value for\n    # nonrepeated scalar field.\n    self.first_proto.ClearField('optional_int32')\n    self.second_proto.optional_int32 = 0\n    self.assertNotEqual(self.first_proto, self.second_proto)\n\n  def testNonRepeatedCompositeHasBits(self):\n    # Ensure that we test \"has\" bits as well as value for\n    # nonrepeated composite field.\n    self.first_proto.ClearField('optional_nested_message')\n    self.second_proto.optional_nested_message.ClearField('bb')\n    self.assertNotEqual(self.first_proto, self.second_proto)\n    self.first_proto.optional_nested_message.bb = 0\n    self.first_proto.optional_nested_message.ClearField('bb')\n    self.assertEqual(self.first_proto, self.second_proto)\n\n\nclass ExtensionEqualityTest(unittest.TestCase):\n\n  def testExtensionEquality(self):\n    first_proto = unittest_pb2.TestAllExtensions()\n    second_proto = unittest_pb2.TestAllExtensions()\n    self.assertEqual(first_proto, second_proto)\n    test_util.SetAllExtensions(first_proto)\n    self.assertNotEqual(first_proto, second_proto)\n    test_util.SetAllExtensions(second_proto)\n    self.assertEqual(first_proto, second_proto)\n\n    # Ensure that we check value equality.\n    first_proto.Extensions[unittest_pb2.optional_int32_extension] += 1\n    self.assertNotEqual(first_proto, second_proto)\n    first_proto.Extensions[unittest_pb2.optional_int32_extension] -= 1\n    self.assertEqual(first_proto, second_proto)\n\n    # Ensure that we also look at \"has\" bits.\n    first_proto.ClearExtension(unittest_pb2.optional_int32_extension)\n    second_proto.Extensions[unittest_pb2.optional_int32_extension] = 0\n    self.assertNotEqual(first_proto, second_proto)\n    first_proto.Extensions[unittest_pb2.optional_int32_extension] = 0\n    self.assertEqual(first_proto, second_proto)\n\n    # Ensure that differences in cached values\n    # don't matter if \"has\" bits are both false.\n    first_proto = unittest_pb2.TestAllExtensions()\n    second_proto = unittest_pb2.TestAllExtensions()\n    self.assertEqual(\n        0, first_proto.Extensions[unittest_pb2.optional_int32_extension])\n    self.assertEqual(first_proto, second_proto)\n\n\nclass MutualRecursionEqualityTest(unittest.TestCase):\n\n  def testEqualityWithMutualRecursion(self):\n    first_proto = unittest_pb2.TestMutualRecursionA()\n    second_proto = unittest_pb2.TestMutualRecursionA()\n    self.assertEqual(first_proto, second_proto)\n    first_proto.bb.a.bb.optional_int32 = 23\n    self.assertNotEqual(first_proto, second_proto)\n    second_proto.bb.a.bb.optional_int32 = 23\n    self.assertEqual(first_proto, second_proto)\n\n\nclass ByteSizeTest(unittest.TestCase):\n\n  def setUp(self):\n    self.proto = unittest_pb2.TestAllTypes()\n    self.extended_proto = more_extensions_pb2.ExtendedMessage()\n    self.packed_proto = unittest_pb2.TestPackedTypes()\n    self.packed_extended_proto = unittest_pb2.TestPackedExtensions()\n\n  def Size(self):\n    return self.proto.ByteSize()\n\n  def testEmptyMessage(self):\n    self.assertEqual(0, self.proto.ByteSize())\n\n  def testSizedOnKwargs(self):\n    # Use a separate message to ensure testing right after creation.\n    proto = unittest_pb2.TestAllTypes()\n    self.assertEqual(0, proto.ByteSize())\n    proto_kwargs = unittest_pb2.TestAllTypes(optional_int64 = 1)\n    # One byte for the tag, one to encode varint 1.\n    self.assertEqual(2, proto_kwargs.ByteSize())\n\n  def testVarints(self):\n    def Test(i, expected_varint_size):\n      self.proto.Clear()\n      self.proto.optional_int64 = i\n      # Add one to the varint size for the tag info\n      # for tag 1.\n      self.assertEqual(expected_varint_size + 1, self.Size())\n    Test(0, 1)\n    Test(1, 1)\n    for i, num_bytes in zip(range(7, 63, 7), range(1, 10000)):\n      Test((1 << i) - 1, num_bytes)\n    Test(-1, 10)\n    Test(-2, 10)\n    Test(-(1 << 63), 10)\n\n  def testStrings(self):\n    self.proto.optional_string = ''\n    # Need one byte for tag info (tag #14), and one byte for length.\n    self.assertEqual(2, self.Size())\n\n    self.proto.optional_string = 'abc'\n    # Need one byte for tag info (tag #14), and one byte for length.\n    self.assertEqual(2 + len(self.proto.optional_string), self.Size())\n\n    self.proto.optional_string = 'x' * 128\n    # Need one byte for tag info (tag #14), and TWO bytes for length.\n    self.assertEqual(3 + len(self.proto.optional_string), self.Size())\n\n  def testOtherNumerics(self):\n    self.proto.optional_fixed32 = 1234\n    # One byte for tag and 4 bytes for fixed32.\n    self.assertEqual(5, self.Size())\n    self.proto = unittest_pb2.TestAllTypes()\n\n    self.proto.optional_fixed64 = 1234\n    # One byte for tag and 8 bytes for fixed64.\n    self.assertEqual(9, self.Size())\n    self.proto = unittest_pb2.TestAllTypes()\n\n    self.proto.optional_float = 1.234\n    # One byte for tag and 4 bytes for float.\n    self.assertEqual(5, self.Size())\n    self.proto = unittest_pb2.TestAllTypes()\n\n    self.proto.optional_double = 1.234\n    # One byte for tag and 8 bytes for float.\n    self.assertEqual(9, self.Size())\n    self.proto = unittest_pb2.TestAllTypes()\n\n    self.proto.optional_sint32 = 64\n    # One byte for tag and 2 bytes for zig-zag-encoded 64.\n    self.assertEqual(3, self.Size())\n    self.proto = unittest_pb2.TestAllTypes()\n\n  def testComposites(self):\n    # 3 bytes.\n    self.proto.optional_nested_message.bb = (1 << 14)\n    # Plus one byte for bb tag.\n    # Plus 1 byte for optional_nested_message serialized size.\n    # Plus two bytes for optional_nested_message tag.\n    self.assertEqual(3 + 1 + 1 + 2, self.Size())\n\n  def testGroups(self):\n    # 4 bytes.\n    self.proto.optionalgroup.a = (1 << 21)\n    # Plus two bytes for |a| tag.\n    # Plus 2 * two bytes for START_GROUP and END_GROUP tags.\n    self.assertEqual(4 + 2 + 2*2, self.Size())\n\n  def testRepeatedScalars(self):\n    self.proto.repeated_int32.append(10)  # 1 byte.\n    self.proto.repeated_int32.append(128)  # 2 bytes.\n    # Also need 2 bytes for each entry for tag.\n    self.assertEqual(1 + 2 + 2*2, self.Size())\n\n  def testRepeatedScalarsExtend(self):\n    self.proto.repeated_int32.extend([10, 128])  # 3 bytes.\n    # Also need 2 bytes for each entry for tag.\n    self.assertEqual(1 + 2 + 2*2, self.Size())\n\n  def testRepeatedScalarsRemove(self):\n    self.proto.repeated_int32.append(10)  # 1 byte.\n    self.proto.repeated_int32.append(128)  # 2 bytes.\n    # Also need 2 bytes for each entry for tag.\n    self.assertEqual(1 + 2 + 2*2, self.Size())\n    self.proto.repeated_int32.remove(128)\n    self.assertEqual(1 + 2, self.Size())\n\n  def testRepeatedComposites(self):\n    # Empty message.  2 bytes tag plus 1 byte length.\n    foreign_message_0 = self.proto.repeated_nested_message.add()\n    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.\n    foreign_message_1 = self.proto.repeated_nested_message.add()\n    foreign_message_1.bb = 7\n    self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size())\n\n  def testRepeatedCompositesDelete(self):\n    # Empty message.  2 bytes tag plus 1 byte length.\n    foreign_message_0 = self.proto.repeated_nested_message.add()\n    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.\n    foreign_message_1 = self.proto.repeated_nested_message.add()\n    foreign_message_1.bb = 9\n    self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size())\n\n    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.\n    del self.proto.repeated_nested_message[0]\n    self.assertEqual(2 + 1 + 1 + 1, self.Size())\n\n    # Now add a new message.\n    foreign_message_2 = self.proto.repeated_nested_message.add()\n    foreign_message_2.bb = 12\n\n    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.\n    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.\n    self.assertEqual(2 + 1 + 1 + 1 + 2 + 1 + 1 + 1, self.Size())\n\n    # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.\n    del self.proto.repeated_nested_message[1]\n    self.assertEqual(2 + 1 + 1 + 1, self.Size())\n\n    del self.proto.repeated_nested_message[0]\n    self.assertEqual(0, self.Size())\n\n  def testRepeatedGroups(self):\n    # 2-byte START_GROUP plus 2-byte END_GROUP.\n    group_0 = self.proto.repeatedgroup.add()\n    # 2-byte START_GROUP plus 2-byte |a| tag + 1-byte |a|\n    # plus 2-byte END_GROUP.\n    group_1 = self.proto.repeatedgroup.add()\n    group_1.a =  7\n    self.assertEqual(2 + 2 + 2 + 2 + 1 + 2, self.Size())\n\n  def testExtensions(self):\n    proto = unittest_pb2.TestAllExtensions()\n    self.assertEqual(0, proto.ByteSize())\n    extension = unittest_pb2.optional_int32_extension  # Field #1, 1 byte.\n    proto.Extensions[extension] = 23\n    # 1 byte for tag, 1 byte for value.\n    self.assertEqual(2, proto.ByteSize())\n\n  def testCacheInvalidationForNonrepeatedScalar(self):\n    # Test non-extension.\n    self.proto.optional_int32 = 1\n    self.assertEqual(2, self.proto.ByteSize())\n    self.proto.optional_int32 = 128\n    self.assertEqual(3, self.proto.ByteSize())\n    self.proto.ClearField('optional_int32')\n    self.assertEqual(0, self.proto.ByteSize())\n\n    # Test within extension.\n    extension = more_extensions_pb2.optional_int_extension\n    self.extended_proto.Extensions[extension] = 1\n    self.assertEqual(2, self.extended_proto.ByteSize())\n    self.extended_proto.Extensions[extension] = 128\n    self.assertEqual(3, self.extended_proto.ByteSize())\n    self.extended_proto.ClearExtension(extension)\n    self.assertEqual(0, self.extended_proto.ByteSize())\n\n  def testCacheInvalidationForRepeatedScalar(self):\n    # Test non-extension.\n    self.proto.repeated_int32.append(1)\n    self.assertEqual(3, self.proto.ByteSize())\n    self.proto.repeated_int32.append(1)\n    self.assertEqual(6, self.proto.ByteSize())\n    self.proto.repeated_int32[1] = 128\n    self.assertEqual(7, self.proto.ByteSize())\n    self.proto.ClearField('repeated_int32')\n    self.assertEqual(0, self.proto.ByteSize())\n\n    # Test within extension.\n    extension = more_extensions_pb2.repeated_int_extension\n    repeated = self.extended_proto.Extensions[extension]\n    repeated.append(1)\n    self.assertEqual(2, self.extended_proto.ByteSize())\n    repeated.append(1)\n    self.assertEqual(4, self.extended_proto.ByteSize())\n    repeated[1] = 128\n    self.assertEqual(5, self.extended_proto.ByteSize())\n    self.extended_proto.ClearExtension(extension)\n    self.assertEqual(0, self.extended_proto.ByteSize())\n\n  def testCacheInvalidationForNonrepeatedMessage(self):\n    # Test non-extension.\n    self.proto.optional_foreign_message.c = 1\n    self.assertEqual(5, self.proto.ByteSize())\n    self.proto.optional_foreign_message.c = 128\n    self.assertEqual(6, self.proto.ByteSize())\n    self.proto.optional_foreign_message.ClearField('c')\n    self.assertEqual(3, self.proto.ByteSize())\n    self.proto.ClearField('optional_foreign_message')\n    self.assertEqual(0, self.proto.ByteSize())\n\n    if api_implementation.Type() == 'python':\n      # This is only possible in pure-Python implementation of the API.\n      child = self.proto.optional_foreign_message\n      self.proto.ClearField('optional_foreign_message')\n      child.c = 128\n      self.assertEqual(0, self.proto.ByteSize())\n\n    # Test within extension.\n    extension = more_extensions_pb2.optional_message_extension\n    child = self.extended_proto.Extensions[extension]\n    self.assertEqual(0, self.extended_proto.ByteSize())\n    child.foreign_message_int = 1\n    self.assertEqual(4, self.extended_proto.ByteSize())\n    child.foreign_message_int = 128\n    self.assertEqual(5, self.extended_proto.ByteSize())\n    self.extended_proto.ClearExtension(extension)\n    self.assertEqual(0, self.extended_proto.ByteSize())\n\n  def testCacheInvalidationForRepeatedMessage(self):\n    # Test non-extension.\n    child0 = self.proto.repeated_foreign_message.add()\n    self.assertEqual(3, self.proto.ByteSize())\n    self.proto.repeated_foreign_message.add()\n    self.assertEqual(6, self.proto.ByteSize())\n    child0.c = 1\n    self.assertEqual(8, self.proto.ByteSize())\n    self.proto.ClearField('repeated_foreign_message')\n    self.assertEqual(0, self.proto.ByteSize())\n\n    # Test within extension.\n    extension = more_extensions_pb2.repeated_message_extension\n    child_list = self.extended_proto.Extensions[extension]\n    child0 = child_list.add()\n    self.assertEqual(2, self.extended_proto.ByteSize())\n    child_list.add()\n    self.assertEqual(4, self.extended_proto.ByteSize())\n    child0.foreign_message_int = 1\n    self.assertEqual(6, self.extended_proto.ByteSize())\n    child0.ClearField('foreign_message_int')\n    self.assertEqual(4, self.extended_proto.ByteSize())\n    self.extended_proto.ClearExtension(extension)\n    self.assertEqual(0, self.extended_proto.ByteSize())\n\n  def testPackedRepeatedScalars(self):\n    self.assertEqual(0, self.packed_proto.ByteSize())\n\n    self.packed_proto.packed_int32.append(10)   # 1 byte.\n    self.packed_proto.packed_int32.append(128)  # 2 bytes.\n    # The tag is 2 bytes (the field number is 90), and the varint\n    # storing the length is 1 byte.\n    int_size = 1 + 2 + 3\n    self.assertEqual(int_size, self.packed_proto.ByteSize())\n\n    self.packed_proto.packed_double.append(4.2)   # 8 bytes\n    self.packed_proto.packed_double.append(3.25)  # 8 bytes\n    # 2 more tag bytes, 1 more length byte.\n    double_size = 8 + 8 + 3\n    self.assertEqual(int_size+double_size, self.packed_proto.ByteSize())\n\n    self.packed_proto.ClearField('packed_int32')\n    self.assertEqual(double_size, self.packed_proto.ByteSize())\n\n  def testPackedExtensions(self):\n    self.assertEqual(0, self.packed_extended_proto.ByteSize())\n    extension = self.packed_extended_proto.Extensions[\n        unittest_pb2.packed_fixed32_extension]\n    extension.extend([1, 2, 3, 4])   # 16 bytes\n    # Tag is 3 bytes.\n    self.assertEqual(19, self.packed_extended_proto.ByteSize())\n\n\n# Issues to be sure to cover include:\n#   * Handling of unrecognized tags (\"uninterpreted_bytes\").\n#   * Handling of MessageSets.\n#   * Consistent ordering of tags in the wire format,\n#     including ordering between extensions and non-extension\n#     fields.\n#   * Consistent serialization of negative numbers, especially\n#     negative int32s.\n#   * Handling of empty submessages (with and without \"has\"\n#     bits set).\n\nclass SerializationTest(unittest.TestCase):\n\n  def testSerializeEmtpyMessage(self):\n    first_proto = unittest_pb2.TestAllTypes()\n    second_proto = unittest_pb2.TestAllTypes()\n    serialized = first_proto.SerializeToString()\n    self.assertEqual(first_proto.ByteSize(), len(serialized))\n    second_proto.MergeFromString(serialized)\n    self.assertEqual(first_proto, second_proto)\n\n  def testSerializeAllFields(self):\n    first_proto = unittest_pb2.TestAllTypes()\n    second_proto = unittest_pb2.TestAllTypes()\n    test_util.SetAllFields(first_proto)\n    serialized = first_proto.SerializeToString()\n    self.assertEqual(first_proto.ByteSize(), len(serialized))\n    second_proto.MergeFromString(serialized)\n    self.assertEqual(first_proto, second_proto)\n\n  def testSerializeAllExtensions(self):\n    first_proto = unittest_pb2.TestAllExtensions()\n    second_proto = unittest_pb2.TestAllExtensions()\n    test_util.SetAllExtensions(first_proto)\n    serialized = first_proto.SerializeToString()\n    second_proto.MergeFromString(serialized)\n    self.assertEqual(first_proto, second_proto)\n\n  def testSerializeNegativeValues(self):\n    first_proto = unittest_pb2.TestAllTypes()\n\n    first_proto.optional_int32 = -1\n    first_proto.optional_int64 = -(2 << 40)\n    first_proto.optional_sint32 = -3\n    first_proto.optional_sint64 = -(4 << 40)\n    first_proto.optional_sfixed32 = -5\n    first_proto.optional_sfixed64 = -(6 << 40)\n\n    second_proto = unittest_pb2.TestAllTypes.FromString(\n        first_proto.SerializeToString())\n\n    self.assertEqual(first_proto, second_proto)\n\n  def testParseTruncated(self):\n    # This test is only applicable for the Python implementation of the API.\n    if api_implementation.Type() != 'python':\n      return\n\n    first_proto = unittest_pb2.TestAllTypes()\n    test_util.SetAllFields(first_proto)\n    serialized = first_proto.SerializeToString()\n\n    for truncation_point in xrange(len(serialized) + 1):\n      try:\n        second_proto = unittest_pb2.TestAllTypes()\n        unknown_fields = unittest_pb2.TestEmptyMessage()\n        pos = second_proto._InternalParse(serialized, 0, truncation_point)\n        # If we didn't raise an error then we read exactly the amount expected.\n        self.assertEqual(truncation_point, pos)\n\n        # Parsing to unknown fields should not throw if parsing to known fields\n        # did not.\n        try:\n          pos2 = unknown_fields._InternalParse(serialized, 0, truncation_point)\n          self.assertEqual(truncation_point, pos2)\n        except message.DecodeError:\n          self.fail('Parsing unknown fields failed when parsing known fields '\n                    'did not.')\n      except message.DecodeError:\n        # Parsing unknown fields should also fail.\n        self.assertRaises(message.DecodeError, unknown_fields._InternalParse,\n                          serialized, 0, truncation_point)\n\n  def testCanonicalSerializationOrder(self):\n    proto = more_messages_pb2.OutOfOrderFields()\n    # These are also their tag numbers.  Even though we're setting these in\n    # reverse-tag order AND they're listed in reverse tag-order in the .proto\n    # file, they should nonetheless be serialized in tag order.\n    proto.optional_sint32 = 5\n    proto.Extensions[more_messages_pb2.optional_uint64] = 4\n    proto.optional_uint32 = 3\n    proto.Extensions[more_messages_pb2.optional_int64] = 2\n    proto.optional_int32 = 1\n    serialized = proto.SerializeToString()\n    self.assertEqual(proto.ByteSize(), len(serialized))\n    d = _MiniDecoder(serialized)\n    ReadTag = d.ReadFieldNumberAndWireType\n    self.assertEqual((1, wire_format.WIRETYPE_VARINT), ReadTag())\n    self.assertEqual(1, d.ReadInt32())\n    self.assertEqual((2, wire_format.WIRETYPE_VARINT), ReadTag())\n    self.assertEqual(2, d.ReadInt64())\n    self.assertEqual((3, wire_format.WIRETYPE_VARINT), ReadTag())\n    self.assertEqual(3, d.ReadUInt32())\n    self.assertEqual((4, wire_format.WIRETYPE_VARINT), ReadTag())\n    self.assertEqual(4, d.ReadUInt64())\n    self.assertEqual((5, wire_format.WIRETYPE_VARINT), ReadTag())\n    self.assertEqual(5, d.ReadSInt32())\n\n  def testCanonicalSerializationOrderSameAsCpp(self):\n    # Copy of the same test we use for C++.\n    proto = unittest_pb2.TestFieldOrderings()\n    test_util.SetAllFieldsAndExtensions(proto)\n    serialized = proto.SerializeToString()\n    test_util.ExpectAllFieldsAndExtensionsInOrder(serialized)\n\n  def testMergeFromStringWhenFieldsAlreadySet(self):\n    first_proto = unittest_pb2.TestAllTypes()\n    first_proto.repeated_string.append('foobar')\n    first_proto.optional_int32 = 23\n    first_proto.optional_nested_message.bb = 42\n    serialized = first_proto.SerializeToString()\n\n    second_proto = unittest_pb2.TestAllTypes()\n    second_proto.repeated_string.append('baz')\n    second_proto.optional_int32 = 100\n    second_proto.optional_nested_message.bb = 999\n\n    second_proto.MergeFromString(serialized)\n    # Ensure that we append to repeated fields.\n    self.assertEqual(['baz', 'foobar'], list(second_proto.repeated_string))\n    # Ensure that we overwrite nonrepeatd scalars.\n    self.assertEqual(23, second_proto.optional_int32)\n    # Ensure that we recursively call MergeFromString() on\n    # submessages.\n    self.assertEqual(42, second_proto.optional_nested_message.bb)\n\n  def testMessageSetWireFormat(self):\n    proto = unittest_mset_pb2.TestMessageSet()\n    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1\n    extension_message2 = unittest_mset_pb2.TestMessageSetExtension2\n    extension1 = extension_message1.message_set_extension\n    extension2 = extension_message2.message_set_extension\n    proto.Extensions[extension1].i = 123\n    proto.Extensions[extension2].str = 'foo'\n\n    # Serialize using the MessageSet wire format (this is specified in the\n    # .proto file).\n    serialized = proto.SerializeToString()\n\n    raw = unittest_mset_pb2.RawMessageSet()\n    self.assertEqual(False,\n                     raw.DESCRIPTOR.GetOptions().message_set_wire_format)\n    raw.MergeFromString(serialized)\n    self.assertEqual(2, len(raw.item))\n\n    message1 = unittest_mset_pb2.TestMessageSetExtension1()\n    message1.MergeFromString(raw.item[0].message)\n    self.assertEqual(123, message1.i)\n\n    message2 = unittest_mset_pb2.TestMessageSetExtension2()\n    message2.MergeFromString(raw.item[1].message)\n    self.assertEqual('foo', message2.str)\n\n    # Deserialize using the MessageSet wire format.\n    proto2 = unittest_mset_pb2.TestMessageSet()\n    proto2.MergeFromString(serialized)\n    self.assertEqual(123, proto2.Extensions[extension1].i)\n    self.assertEqual('foo', proto2.Extensions[extension2].str)\n\n    # Check byte size.\n    self.assertEqual(proto2.ByteSize(), len(serialized))\n    self.assertEqual(proto.ByteSize(), len(serialized))\n\n  def testMessageSetWireFormatUnknownExtension(self):\n    # Create a message using the message set wire format with an unknown\n    # message.\n    raw = unittest_mset_pb2.RawMessageSet()\n\n    # Add an item.\n    item = raw.item.add()\n    item.type_id = 1545008\n    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1\n    message1 = unittest_mset_pb2.TestMessageSetExtension1()\n    message1.i = 12345\n    item.message = message1.SerializeToString()\n\n    # Add a second, unknown extension.\n    item = raw.item.add()\n    item.type_id = 1545009\n    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1\n    message1 = unittest_mset_pb2.TestMessageSetExtension1()\n    message1.i = 12346\n    item.message = message1.SerializeToString()\n\n    # Add another unknown extension.\n    item = raw.item.add()\n    item.type_id = 1545010\n    message1 = unittest_mset_pb2.TestMessageSetExtension2()\n    message1.str = 'foo'\n    item.message = message1.SerializeToString()\n\n    serialized = raw.SerializeToString()\n\n    # Parse message using the message set wire format.\n    proto = unittest_mset_pb2.TestMessageSet()\n    proto.MergeFromString(serialized)\n\n    # Check that the message parsed well.\n    extension_message1 = unittest_mset_pb2.TestMessageSetExtension1\n    extension1 = extension_message1.message_set_extension\n    self.assertEquals(12345, proto.Extensions[extension1].i)\n\n  def testUnknownFields(self):\n    proto = unittest_pb2.TestAllTypes()\n    test_util.SetAllFields(proto)\n\n    serialized = proto.SerializeToString()\n\n    # The empty message should be parsable with all of the fields\n    # unknown.\n    proto2 = unittest_pb2.TestEmptyMessage()\n\n    # Parsing this message should succeed.\n    proto2.MergeFromString(serialized)\n\n    # Now test with a int64 field set.\n    proto = unittest_pb2.TestAllTypes()\n    proto.optional_int64 = 0x0fffffffffffffff\n    serialized = proto.SerializeToString()\n    # The empty message should be parsable with all of the fields\n    # unknown.\n    proto2 = unittest_pb2.TestEmptyMessage()\n    # Parsing this message should succeed.\n    proto2.MergeFromString(serialized)\n\n  def _CheckRaises(self, exc_class, callable_obj, exception):\n    \"\"\"This method checks if the excpetion type and message are as expected.\"\"\"\n    try:\n      callable_obj()\n    except exc_class, ex:\n      # Check if the exception message is the right one.\n      self.assertEqual(exception, str(ex))\n      return\n    else:\n      raise self.failureException('%s not raised' % str(exc_class))\n\n  def testSerializeUninitialized(self):\n    proto = unittest_pb2.TestRequired()\n    self._CheckRaises(\n        message.EncodeError,\n        proto.SerializeToString,\n        'Message is missing required fields: a,b,c')\n    # Shouldn't raise exceptions.\n    partial = proto.SerializePartialToString()\n\n    proto.a = 1\n    self._CheckRaises(\n        message.EncodeError,\n        proto.SerializeToString,\n        'Message is missing required fields: b,c')\n    # Shouldn't raise exceptions.\n    partial = proto.SerializePartialToString()\n\n    proto.b = 2\n    self._CheckRaises(\n        message.EncodeError,\n        proto.SerializeToString,\n        'Message is missing required fields: c')\n    # Shouldn't raise exceptions.\n    partial = proto.SerializePartialToString()\n\n    proto.c = 3\n    serialized = proto.SerializeToString()\n    # Shouldn't raise exceptions.\n    partial = proto.SerializePartialToString()\n\n    proto2 = unittest_pb2.TestRequired()\n    proto2.MergeFromString(serialized)\n    self.assertEqual(1, proto2.a)\n    self.assertEqual(2, proto2.b)\n    self.assertEqual(3, proto2.c)\n    proto2.ParseFromString(partial)\n    self.assertEqual(1, proto2.a)\n    self.assertEqual(2, proto2.b)\n    self.assertEqual(3, proto2.c)\n\n  def testSerializeUninitializedSubMessage(self):\n    proto = unittest_pb2.TestRequiredForeign()\n\n    # Sub-message doesn't exist yet, so this succeeds.\n    proto.SerializeToString()\n\n    proto.optional_message.a = 1\n    self._CheckRaises(\n        message.EncodeError,\n        proto.SerializeToString,\n        'Message is missing required fields: '\n        'optional_message.b,optional_message.c')\n\n    proto.optional_message.b = 2\n    proto.optional_message.c = 3\n    proto.SerializeToString()\n\n    proto.repeated_message.add().a = 1\n    proto.repeated_message.add().b = 2\n    self._CheckRaises(\n        message.EncodeError,\n        proto.SerializeToString,\n        'Message is missing required fields: '\n        'repeated_message[0].b,repeated_message[0].c,'\n        'repeated_message[1].a,repeated_message[1].c')\n\n    proto.repeated_message[0].b = 2\n    proto.repeated_message[0].c = 3\n    proto.repeated_message[1].a = 1\n    proto.repeated_message[1].c = 3\n    proto.SerializeToString()\n\n  def testSerializeAllPackedFields(self):\n    first_proto = unittest_pb2.TestPackedTypes()\n    second_proto = unittest_pb2.TestPackedTypes()\n    test_util.SetAllPackedFields(first_proto)\n    serialized = first_proto.SerializeToString()\n    self.assertEqual(first_proto.ByteSize(), len(serialized))\n    bytes_read = second_proto.MergeFromString(serialized)\n    self.assertEqual(second_proto.ByteSize(), bytes_read)\n    self.assertEqual(first_proto, second_proto)\n\n  def testSerializeAllPackedExtensions(self):\n    first_proto = unittest_pb2.TestPackedExtensions()\n    second_proto = unittest_pb2.TestPackedExtensions()\n    test_util.SetAllPackedExtensions(first_proto)\n    serialized = first_proto.SerializeToString()\n    bytes_read = second_proto.MergeFromString(serialized)\n    self.assertEqual(second_proto.ByteSize(), bytes_read)\n    self.assertEqual(first_proto, second_proto)\n\n  def testMergePackedFromStringWhenSomeFieldsAlreadySet(self):\n    first_proto = unittest_pb2.TestPackedTypes()\n    first_proto.packed_int32.extend([1, 2])\n    first_proto.packed_double.append(3.0)\n    serialized = first_proto.SerializeToString()\n\n    second_proto = unittest_pb2.TestPackedTypes()\n    second_proto.packed_int32.append(3)\n    second_proto.packed_double.extend([1.0, 2.0])\n    second_proto.packed_sint32.append(4)\n\n    second_proto.MergeFromString(serialized)\n    self.assertEqual([3, 1, 2], second_proto.packed_int32)\n    self.assertEqual([1.0, 2.0, 3.0], second_proto.packed_double)\n    self.assertEqual([4], second_proto.packed_sint32)\n\n  def testPackedFieldsWireFormat(self):\n    proto = unittest_pb2.TestPackedTypes()\n    proto.packed_int32.extend([1, 2, 150, 3])  # 1 + 1 + 2 + 1 bytes\n    proto.packed_double.extend([1.0, 1000.0])  # 8 + 8 bytes\n    proto.packed_float.append(2.0)             # 4 bytes, will be before double\n    serialized = proto.SerializeToString()\n    self.assertEqual(proto.ByteSize(), len(serialized))\n    d = _MiniDecoder(serialized)\n    ReadTag = d.ReadFieldNumberAndWireType\n    self.assertEqual((90, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())\n    self.assertEqual(1+1+1+2, d.ReadInt32())\n    self.assertEqual(1, d.ReadInt32())\n    self.assertEqual(2, d.ReadInt32())\n    self.assertEqual(150, d.ReadInt32())\n    self.assertEqual(3, d.ReadInt32())\n    self.assertEqual((100, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())\n    self.assertEqual(4, d.ReadInt32())\n    self.assertEqual(2.0, d.ReadFloat())\n    self.assertEqual((101, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())\n    self.assertEqual(8+8, d.ReadInt32())\n    self.assertEqual(1.0, d.ReadDouble())\n    self.assertEqual(1000.0, d.ReadDouble())\n    self.assertTrue(d.EndOfStream())\n\n  def testParsePackedFromUnpacked(self):\n    unpacked = unittest_pb2.TestUnpackedTypes()\n    test_util.SetAllUnpackedFields(unpacked)\n    packed = unittest_pb2.TestPackedTypes()\n    packed.MergeFromString(unpacked.SerializeToString())\n    expected = unittest_pb2.TestPackedTypes()\n    test_util.SetAllPackedFields(expected)\n    self.assertEqual(expected, packed)\n\n  def testParseUnpackedFromPacked(self):\n    packed = unittest_pb2.TestPackedTypes()\n    test_util.SetAllPackedFields(packed)\n    unpacked = unittest_pb2.TestUnpackedTypes()\n    unpacked.MergeFromString(packed.SerializeToString())\n    expected = unittest_pb2.TestUnpackedTypes()\n    test_util.SetAllUnpackedFields(expected)\n    self.assertEqual(expected, unpacked)\n\n  def testFieldNumbers(self):\n    proto = unittest_pb2.TestAllTypes()\n    self.assertEqual(unittest_pb2.TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1)\n    self.assertEqual(unittest_pb2.TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1)\n    self.assertEqual(unittest_pb2.TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16)\n    self.assertEqual(\n      unittest_pb2.TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18)\n    self.assertEqual(\n      unittest_pb2.TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21)\n    self.assertEqual(unittest_pb2.TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31)\n    self.assertEqual(unittest_pb2.TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46)\n    self.assertEqual(\n      unittest_pb2.TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48)\n    self.assertEqual(\n      unittest_pb2.TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51)\n\n  def testExtensionFieldNumbers(self):\n    self.assertEqual(unittest_pb2.TestRequired.single.number, 1000)\n    self.assertEqual(unittest_pb2.TestRequired.SINGLE_FIELD_NUMBER, 1000)\n    self.assertEqual(unittest_pb2.TestRequired.multi.number, 1001)\n    self.assertEqual(unittest_pb2.TestRequired.MULTI_FIELD_NUMBER, 1001)\n    self.assertEqual(unittest_pb2.optional_int32_extension.number, 1)\n    self.assertEqual(unittest_pb2.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1)\n    self.assertEqual(unittest_pb2.optionalgroup_extension.number, 16)\n    self.assertEqual(unittest_pb2.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16)\n    self.assertEqual(unittest_pb2.optional_nested_message_extension.number, 18)\n    self.assertEqual(\n      unittest_pb2.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18)\n    self.assertEqual(unittest_pb2.optional_nested_enum_extension.number, 21)\n    self.assertEqual(unittest_pb2.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER,\n      21)\n    self.assertEqual(unittest_pb2.repeated_int32_extension.number, 31)\n    self.assertEqual(unittest_pb2.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31)\n    self.assertEqual(unittest_pb2.repeatedgroup_extension.number, 46)\n    self.assertEqual(unittest_pb2.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46)\n    self.assertEqual(unittest_pb2.repeated_nested_message_extension.number, 48)\n    self.assertEqual(\n      unittest_pb2.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48)\n    self.assertEqual(unittest_pb2.repeated_nested_enum_extension.number, 51)\n    self.assertEqual(unittest_pb2.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER,\n      51)\n\n  def testInitKwargs(self):\n    proto = unittest_pb2.TestAllTypes(\n        optional_int32=1,\n        optional_string='foo',\n        optional_bool=True,\n        optional_bytes='bar',\n        optional_nested_message=unittest_pb2.TestAllTypes.NestedMessage(bb=1),\n        optional_foreign_message=unittest_pb2.ForeignMessage(c=1),\n        optional_nested_enum=unittest_pb2.TestAllTypes.FOO,\n        optional_foreign_enum=unittest_pb2.FOREIGN_FOO,\n        repeated_int32=[1, 2, 3])\n    self.assertTrue(proto.IsInitialized())\n    self.assertTrue(proto.HasField('optional_int32'))\n    self.assertTrue(proto.HasField('optional_string'))\n    self.assertTrue(proto.HasField('optional_bool'))\n    self.assertTrue(proto.HasField('optional_bytes'))\n    self.assertTrue(proto.HasField('optional_nested_message'))\n    self.assertTrue(proto.HasField('optional_foreign_message'))\n    self.assertTrue(proto.HasField('optional_nested_enum'))\n    self.assertTrue(proto.HasField('optional_foreign_enum'))\n    self.assertEqual(1, proto.optional_int32)\n    self.assertEqual('foo', proto.optional_string)\n    self.assertEqual(True, proto.optional_bool)\n    self.assertEqual('bar', proto.optional_bytes)\n    self.assertEqual(1, proto.optional_nested_message.bb)\n    self.assertEqual(1, proto.optional_foreign_message.c)\n    self.assertEqual(unittest_pb2.TestAllTypes.FOO,\n                     proto.optional_nested_enum)\n    self.assertEqual(unittest_pb2.FOREIGN_FOO, proto.optional_foreign_enum)\n    self.assertEqual([1, 2, 3], proto.repeated_int32)\n\n  def testInitArgsUnknownFieldName(self):\n    def InitalizeEmptyMessageWithExtraKeywordArg():\n      unused_proto = unittest_pb2.TestEmptyMessage(unknown='unknown')\n    self._CheckRaises(ValueError,\n                      InitalizeEmptyMessageWithExtraKeywordArg,\n                      'Protocol message has no \"unknown\" field.')\n\n  def testInitRequiredKwargs(self):\n    proto = unittest_pb2.TestRequired(a=1, b=1, c=1)\n    self.assertTrue(proto.IsInitialized())\n    self.assertTrue(proto.HasField('a'))\n    self.assertTrue(proto.HasField('b'))\n    self.assertTrue(proto.HasField('c'))\n    self.assertTrue(not proto.HasField('dummy2'))\n    self.assertEqual(1, proto.a)\n    self.assertEqual(1, proto.b)\n    self.assertEqual(1, proto.c)\n\n  def testInitRequiredForeignKwargs(self):\n    proto = unittest_pb2.TestRequiredForeign(\n        optional_message=unittest_pb2.TestRequired(a=1, b=1, c=1))\n    self.assertTrue(proto.IsInitialized())\n    self.assertTrue(proto.HasField('optional_message'))\n    self.assertTrue(proto.optional_message.IsInitialized())\n    self.assertTrue(proto.optional_message.HasField('a'))\n    self.assertTrue(proto.optional_message.HasField('b'))\n    self.assertTrue(proto.optional_message.HasField('c'))\n    self.assertTrue(not proto.optional_message.HasField('dummy2'))\n    self.assertEqual(unittest_pb2.TestRequired(a=1, b=1, c=1),\n                     proto.optional_message)\n    self.assertEqual(1, proto.optional_message.a)\n    self.assertEqual(1, proto.optional_message.b)\n    self.assertEqual(1, proto.optional_message.c)\n\n  def testInitRepeatedKwargs(self):\n    proto = unittest_pb2.TestAllTypes(repeated_int32=[1, 2, 3])\n    self.assertTrue(proto.IsInitialized())\n    self.assertEqual(1, proto.repeated_int32[0])\n    self.assertEqual(2, proto.repeated_int32[1])\n    self.assertEqual(3, proto.repeated_int32[2])\n\n\nclass OptionsTest(unittest.TestCase):\n\n  def testMessageOptions(self):\n    proto = unittest_mset_pb2.TestMessageSet()\n    self.assertEqual(True,\n                     proto.DESCRIPTOR.GetOptions().message_set_wire_format)\n    proto = unittest_pb2.TestAllTypes()\n    self.assertEqual(False,\n                     proto.DESCRIPTOR.GetOptions().message_set_wire_format)\n\n  def testPackedOptions(self):\n    proto = unittest_pb2.TestAllTypes()\n    proto.optional_int32 = 1\n    proto.optional_double = 3.0\n    for field_descriptor, _ in proto.ListFields():\n      self.assertEqual(False, field_descriptor.GetOptions().packed)\n\n    proto = unittest_pb2.TestPackedTypes()\n    proto.packed_int32.append(1)\n    proto.packed_double.append(3.0)\n    for field_descriptor, _ in proto.ListFields():\n      self.assertEqual(True, field_descriptor.GetOptions().packed)\n      self.assertEqual(reflection._FieldDescriptor.LABEL_REPEATED,\n                       field_descriptor.label)\n\n\n\nif __name__ == '__main__':\n  unittest.main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/service_reflection_test.py",
    "content": "#! /usr/bin/python\n#\n# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Tests for google.protobuf.internal.service_reflection.\"\"\"\n\n__author__ = 'petar@google.com (Petar Petrov)'\n\nimport unittest\nfrom google.protobuf import unittest_pb2\nfrom google.protobuf import service_reflection\nfrom google.protobuf import service\n\n\nclass FooUnitTest(unittest.TestCase):\n\n  def testService(self):\n    class MockRpcChannel(service.RpcChannel):\n      def CallMethod(self, method, controller, request, response, callback):\n        self.method = method\n        self.controller = controller\n        self.request = request\n        callback(response)\n\n    class MockRpcController(service.RpcController):\n      def SetFailed(self, msg):\n        self.failure_message = msg\n\n    self.callback_response = None\n\n    class MyService(unittest_pb2.TestService):\n      pass\n\n    self.callback_response = None\n\n    def MyCallback(response):\n      self.callback_response = response\n\n    rpc_controller = MockRpcController()\n    channel = MockRpcChannel()\n    srvc = MyService()\n    srvc.Foo(rpc_controller, unittest_pb2.FooRequest(), MyCallback)\n    self.assertEqual('Method Foo not implemented.',\n                     rpc_controller.failure_message)\n    self.assertEqual(None, self.callback_response)\n\n    rpc_controller.failure_message = None\n\n    service_descriptor = unittest_pb2.TestService.GetDescriptor()\n    srvc.CallMethod(service_descriptor.methods[1], rpc_controller,\n                    unittest_pb2.BarRequest(), MyCallback)\n    self.assertEqual('Method Bar not implemented.',\n                     rpc_controller.failure_message)\n    self.assertEqual(None, self.callback_response)\n    \n    class MyServiceImpl(unittest_pb2.TestService):\n      def Foo(self, rpc_controller, request, done):\n        self.foo_called = True\n      def Bar(self, rpc_controller, request, done):\n        self.bar_called = True\n\n    srvc = MyServiceImpl()\n    rpc_controller.failure_message = None\n    srvc.Foo(rpc_controller, unittest_pb2.FooRequest(), MyCallback)\n    self.assertEqual(None, rpc_controller.failure_message)\n    self.assertEqual(True, srvc.foo_called)\n\n    rpc_controller.failure_message = None\n    srvc.CallMethod(service_descriptor.methods[1], rpc_controller,\n                    unittest_pb2.BarRequest(), MyCallback)\n    self.assertEqual(None, rpc_controller.failure_message)\n    self.assertEqual(True, srvc.bar_called)\n\n  def testServiceStub(self):\n    class MockRpcChannel(service.RpcChannel):\n      def CallMethod(self, method, controller, request,\n                     response_class, callback):\n        self.method = method\n        self.controller = controller\n        self.request = request\n        callback(response_class())\n\n    self.callback_response = None\n\n    def MyCallback(response):\n      self.callback_response = response\n\n    channel = MockRpcChannel()\n    stub = unittest_pb2.TestService_Stub(channel)\n    rpc_controller = 'controller'\n    request = 'request'\n\n    # GetDescriptor now static, still works as instance method for compatability\n    self.assertEqual(unittest_pb2.TestService_Stub.GetDescriptor(),\n                     stub.GetDescriptor())\n\n    # Invoke method.\n    stub.Foo(rpc_controller, request, MyCallback)\n\n    self.assertTrue(isinstance(self.callback_response,\n                               unittest_pb2.FooResponse))\n    self.assertEqual(request, channel.request)\n    self.assertEqual(rpc_controller, channel.controller)\n    self.assertEqual(stub.GetDescriptor().methods[0], channel.method)\n\n\nif __name__ == '__main__':\n  unittest.main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/test_util.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Utilities for Python proto2 tests.\n\nThis is intentionally modeled on C++ code in\n//google/protobuf/test_util.*.\n\"\"\"\n\n__author__ = 'robinson@google.com (Will Robinson)'\n\nimport os.path\n\nfrom google.protobuf import unittest_import_pb2\nfrom google.protobuf import unittest_pb2\n\n\ndef SetAllFields(message):\n  \"\"\"Sets every field in the message to a unique value.\n\n  Args:\n    message: A unittest_pb2.TestAllTypes instance.\n  \"\"\"\n\n  #\n  # Optional fields.\n  #\n\n  message.optional_int32    = 101\n  message.optional_int64    = 102\n  message.optional_uint32   = 103\n  message.optional_uint64   = 104\n  message.optional_sint32   = 105\n  message.optional_sint64   = 106\n  message.optional_fixed32  = 107\n  message.optional_fixed64  = 108\n  message.optional_sfixed32 = 109\n  message.optional_sfixed64 = 110\n  message.optional_float    = 111\n  message.optional_double   = 112\n  message.optional_bool     = True\n  # TODO(robinson): Firmly spec out and test how\n  # protos interact with unicode.  One specific example:\n  # what happens if we change the literal below to\n  # u'115'?  What *should* happen?  Still some discussion\n  # to finish with Kenton about bytes vs. strings\n  # and forcing everything to be utf8. :-/\n  message.optional_string   = '115'\n  message.optional_bytes    = '116'\n\n  message.optionalgroup.a = 117\n  message.optional_nested_message.bb = 118\n  message.optional_foreign_message.c = 119\n  message.optional_import_message.d = 120\n\n  message.optional_nested_enum = unittest_pb2.TestAllTypes.BAZ\n  message.optional_foreign_enum = unittest_pb2.FOREIGN_BAZ\n  message.optional_import_enum = unittest_import_pb2.IMPORT_BAZ\n\n  message.optional_string_piece = '124'\n  message.optional_cord = '125'\n\n  #\n  # Repeated fields.\n  #\n\n  message.repeated_int32.append(201)\n  message.repeated_int64.append(202)\n  message.repeated_uint32.append(203)\n  message.repeated_uint64.append(204)\n  message.repeated_sint32.append(205)\n  message.repeated_sint64.append(206)\n  message.repeated_fixed32.append(207)\n  message.repeated_fixed64.append(208)\n  message.repeated_sfixed32.append(209)\n  message.repeated_sfixed64.append(210)\n  message.repeated_float.append(211)\n  message.repeated_double.append(212)\n  message.repeated_bool.append(True)\n  message.repeated_string.append('215')\n  message.repeated_bytes.append('216')\n\n  message.repeatedgroup.add().a = 217\n  message.repeated_nested_message.add().bb = 218\n  message.repeated_foreign_message.add().c = 219\n  message.repeated_import_message.add().d = 220\n\n  message.repeated_nested_enum.append(unittest_pb2.TestAllTypes.BAR)\n  message.repeated_foreign_enum.append(unittest_pb2.FOREIGN_BAR)\n  message.repeated_import_enum.append(unittest_import_pb2.IMPORT_BAR)\n\n  message.repeated_string_piece.append('224')\n  message.repeated_cord.append('225')\n\n  # Add a second one of each field.\n  message.repeated_int32.append(301)\n  message.repeated_int64.append(302)\n  message.repeated_uint32.append(303)\n  message.repeated_uint64.append(304)\n  message.repeated_sint32.append(305)\n  message.repeated_sint64.append(306)\n  message.repeated_fixed32.append(307)\n  message.repeated_fixed64.append(308)\n  message.repeated_sfixed32.append(309)\n  message.repeated_sfixed64.append(310)\n  message.repeated_float.append(311)\n  message.repeated_double.append(312)\n  message.repeated_bool.append(False)\n  message.repeated_string.append('315')\n  message.repeated_bytes.append('316')\n\n  message.repeatedgroup.add().a = 317\n  message.repeated_nested_message.add().bb = 318\n  message.repeated_foreign_message.add().c = 319\n  message.repeated_import_message.add().d = 320\n\n  message.repeated_nested_enum.append(unittest_pb2.TestAllTypes.BAZ)\n  message.repeated_foreign_enum.append(unittest_pb2.FOREIGN_BAZ)\n  message.repeated_import_enum.append(unittest_import_pb2.IMPORT_BAZ)\n\n  message.repeated_string_piece.append('324')\n  message.repeated_cord.append('325')\n\n  #\n  # Fields that have defaults.\n  #\n\n  message.default_int32 = 401\n  message.default_int64 = 402\n  message.default_uint32 = 403\n  message.default_uint64 = 404\n  message.default_sint32 = 405\n  message.default_sint64 = 406\n  message.default_fixed32 = 407\n  message.default_fixed64 = 408\n  message.default_sfixed32 = 409\n  message.default_sfixed64 = 410\n  message.default_float = 411\n  message.default_double = 412\n  message.default_bool = False\n  message.default_string = '415'\n  message.default_bytes = '416'\n\n  message.default_nested_enum = unittest_pb2.TestAllTypes.FOO\n  message.default_foreign_enum = unittest_pb2.FOREIGN_FOO\n  message.default_import_enum = unittest_import_pb2.IMPORT_FOO\n\n  message.default_string_piece = '424'\n  message.default_cord = '425'\n\n\ndef SetAllExtensions(message):\n  \"\"\"Sets every extension in the message to a unique value.\n\n  Args:\n    message: A unittest_pb2.TestAllExtensions instance.\n  \"\"\"\n\n  extensions = message.Extensions\n  pb2 = unittest_pb2\n  import_pb2 = unittest_import_pb2\n\n  #\n  # Optional fields.\n  #\n\n  extensions[pb2.optional_int32_extension] = 101\n  extensions[pb2.optional_int64_extension] = 102\n  extensions[pb2.optional_uint32_extension] = 103\n  extensions[pb2.optional_uint64_extension] = 104\n  extensions[pb2.optional_sint32_extension] = 105\n  extensions[pb2.optional_sint64_extension] = 106\n  extensions[pb2.optional_fixed32_extension] = 107\n  extensions[pb2.optional_fixed64_extension] = 108\n  extensions[pb2.optional_sfixed32_extension] = 109\n  extensions[pb2.optional_sfixed64_extension] = 110\n  extensions[pb2.optional_float_extension] = 111\n  extensions[pb2.optional_double_extension] = 112\n  extensions[pb2.optional_bool_extension] = True\n  extensions[pb2.optional_string_extension] = '115'\n  extensions[pb2.optional_bytes_extension] = '116'\n\n  extensions[pb2.optionalgroup_extension].a = 117\n  extensions[pb2.optional_nested_message_extension].bb = 118\n  extensions[pb2.optional_foreign_message_extension].c = 119\n  extensions[pb2.optional_import_message_extension].d = 120\n\n  extensions[pb2.optional_nested_enum_extension] = pb2.TestAllTypes.BAZ\n  extensions[pb2.optional_nested_enum_extension] = pb2.TestAllTypes.BAZ\n  extensions[pb2.optional_foreign_enum_extension] = pb2.FOREIGN_BAZ\n  extensions[pb2.optional_import_enum_extension] = import_pb2.IMPORT_BAZ\n\n  extensions[pb2.optional_string_piece_extension] = '124'\n  extensions[pb2.optional_cord_extension] = '125'\n\n  #\n  # Repeated fields.\n  #\n\n  extensions[pb2.repeated_int32_extension].append(201)\n  extensions[pb2.repeated_int64_extension].append(202)\n  extensions[pb2.repeated_uint32_extension].append(203)\n  extensions[pb2.repeated_uint64_extension].append(204)\n  extensions[pb2.repeated_sint32_extension].append(205)\n  extensions[pb2.repeated_sint64_extension].append(206)\n  extensions[pb2.repeated_fixed32_extension].append(207)\n  extensions[pb2.repeated_fixed64_extension].append(208)\n  extensions[pb2.repeated_sfixed32_extension].append(209)\n  extensions[pb2.repeated_sfixed64_extension].append(210)\n  extensions[pb2.repeated_float_extension].append(211)\n  extensions[pb2.repeated_double_extension].append(212)\n  extensions[pb2.repeated_bool_extension].append(True)\n  extensions[pb2.repeated_string_extension].append('215')\n  extensions[pb2.repeated_bytes_extension].append('216')\n\n  extensions[pb2.repeatedgroup_extension].add().a = 217\n  extensions[pb2.repeated_nested_message_extension].add().bb = 218\n  extensions[pb2.repeated_foreign_message_extension].add().c = 219\n  extensions[pb2.repeated_import_message_extension].add().d = 220\n\n  extensions[pb2.repeated_nested_enum_extension].append(pb2.TestAllTypes.BAR)\n  extensions[pb2.repeated_foreign_enum_extension].append(pb2.FOREIGN_BAR)\n  extensions[pb2.repeated_import_enum_extension].append(import_pb2.IMPORT_BAR)\n\n  extensions[pb2.repeated_string_piece_extension].append('224')\n  extensions[pb2.repeated_cord_extension].append('225')\n\n  # Append a second one of each field.\n  extensions[pb2.repeated_int32_extension].append(301)\n  extensions[pb2.repeated_int64_extension].append(302)\n  extensions[pb2.repeated_uint32_extension].append(303)\n  extensions[pb2.repeated_uint64_extension].append(304)\n  extensions[pb2.repeated_sint32_extension].append(305)\n  extensions[pb2.repeated_sint64_extension].append(306)\n  extensions[pb2.repeated_fixed32_extension].append(307)\n  extensions[pb2.repeated_fixed64_extension].append(308)\n  extensions[pb2.repeated_sfixed32_extension].append(309)\n  extensions[pb2.repeated_sfixed64_extension].append(310)\n  extensions[pb2.repeated_float_extension].append(311)\n  extensions[pb2.repeated_double_extension].append(312)\n  extensions[pb2.repeated_bool_extension].append(False)\n  extensions[pb2.repeated_string_extension].append('315')\n  extensions[pb2.repeated_bytes_extension].append('316')\n\n  extensions[pb2.repeatedgroup_extension].add().a = 317\n  extensions[pb2.repeated_nested_message_extension].add().bb = 318\n  extensions[pb2.repeated_foreign_message_extension].add().c = 319\n  extensions[pb2.repeated_import_message_extension].add().d = 320\n\n  extensions[pb2.repeated_nested_enum_extension].append(pb2.TestAllTypes.BAZ)\n  extensions[pb2.repeated_foreign_enum_extension].append(pb2.FOREIGN_BAZ)\n  extensions[pb2.repeated_import_enum_extension].append(import_pb2.IMPORT_BAZ)\n\n  extensions[pb2.repeated_string_piece_extension].append('324')\n  extensions[pb2.repeated_cord_extension].append('325')\n\n  #\n  # Fields with defaults.\n  #\n\n  extensions[pb2.default_int32_extension] = 401\n  extensions[pb2.default_int64_extension] = 402\n  extensions[pb2.default_uint32_extension] = 403\n  extensions[pb2.default_uint64_extension] = 404\n  extensions[pb2.default_sint32_extension] = 405\n  extensions[pb2.default_sint64_extension] = 406\n  extensions[pb2.default_fixed32_extension] = 407\n  extensions[pb2.default_fixed64_extension] = 408\n  extensions[pb2.default_sfixed32_extension] = 409\n  extensions[pb2.default_sfixed64_extension] = 410\n  extensions[pb2.default_float_extension] = 411\n  extensions[pb2.default_double_extension] = 412\n  extensions[pb2.default_bool_extension] = False\n  extensions[pb2.default_string_extension] = '415'\n  extensions[pb2.default_bytes_extension] = '416'\n\n  extensions[pb2.default_nested_enum_extension] = pb2.TestAllTypes.FOO\n  extensions[pb2.default_foreign_enum_extension] = pb2.FOREIGN_FOO\n  extensions[pb2.default_import_enum_extension] = import_pb2.IMPORT_FOO\n\n  extensions[pb2.default_string_piece_extension] = '424'\n  extensions[pb2.default_cord_extension] = '425'\n\n\ndef SetAllFieldsAndExtensions(message):\n  \"\"\"Sets every field and extension in the message to a unique value.\n\n  Args:\n    message: A unittest_pb2.TestAllExtensions message.\n  \"\"\"\n  message.my_int = 1\n  message.my_string = 'foo'\n  message.my_float = 1.0\n  message.Extensions[unittest_pb2.my_extension_int] = 23\n  message.Extensions[unittest_pb2.my_extension_string] = 'bar'\n\n\ndef ExpectAllFieldsAndExtensionsInOrder(serialized):\n  \"\"\"Ensures that serialized is the serialization we expect for a message\n  filled with SetAllFieldsAndExtensions().  (Specifically, ensures that the\n  serialization is in canonical, tag-number order).\n  \"\"\"\n  my_extension_int = unittest_pb2.my_extension_int\n  my_extension_string = unittest_pb2.my_extension_string\n  expected_strings = []\n  message = unittest_pb2.TestFieldOrderings()\n  message.my_int = 1  # Field 1.\n  expected_strings.append(message.SerializeToString())\n  message.Clear()\n  message.Extensions[my_extension_int] = 23  # Field 5.\n  expected_strings.append(message.SerializeToString())\n  message.Clear()\n  message.my_string = 'foo'  # Field 11.\n  expected_strings.append(message.SerializeToString())\n  message.Clear()\n  message.Extensions[my_extension_string] = 'bar'  # Field 50.\n  expected_strings.append(message.SerializeToString())\n  message.Clear()\n  message.my_float = 1.0\n  expected_strings.append(message.SerializeToString())\n  message.Clear()\n  expected = ''.join(expected_strings)\n\n  if expected != serialized:\n    raise ValueError('Expected %r, found %r' % (expected, serialized))\n\n\ndef ExpectAllFieldsSet(test_case, message):\n  \"\"\"Check all fields for correct values have after Set*Fields() is called.\"\"\"\n  test_case.assertTrue(message.HasField('optional_int32'))\n  test_case.assertTrue(message.HasField('optional_int64'))\n  test_case.assertTrue(message.HasField('optional_uint32'))\n  test_case.assertTrue(message.HasField('optional_uint64'))\n  test_case.assertTrue(message.HasField('optional_sint32'))\n  test_case.assertTrue(message.HasField('optional_sint64'))\n  test_case.assertTrue(message.HasField('optional_fixed32'))\n  test_case.assertTrue(message.HasField('optional_fixed64'))\n  test_case.assertTrue(message.HasField('optional_sfixed32'))\n  test_case.assertTrue(message.HasField('optional_sfixed64'))\n  test_case.assertTrue(message.HasField('optional_float'))\n  test_case.assertTrue(message.HasField('optional_double'))\n  test_case.assertTrue(message.HasField('optional_bool'))\n  test_case.assertTrue(message.HasField('optional_string'))\n  test_case.assertTrue(message.HasField('optional_bytes'))\n\n  test_case.assertTrue(message.HasField('optionalgroup'))\n  test_case.assertTrue(message.HasField('optional_nested_message'))\n  test_case.assertTrue(message.HasField('optional_foreign_message'))\n  test_case.assertTrue(message.HasField('optional_import_message'))\n\n  test_case.assertTrue(message.optionalgroup.HasField('a'))\n  test_case.assertTrue(message.optional_nested_message.HasField('bb'))\n  test_case.assertTrue(message.optional_foreign_message.HasField('c'))\n  test_case.assertTrue(message.optional_import_message.HasField('d'))\n\n  test_case.assertTrue(message.HasField('optional_nested_enum'))\n  test_case.assertTrue(message.HasField('optional_foreign_enum'))\n  test_case.assertTrue(message.HasField('optional_import_enum'))\n\n  test_case.assertTrue(message.HasField('optional_string_piece'))\n  test_case.assertTrue(message.HasField('optional_cord'))\n\n  test_case.assertEqual(101, message.optional_int32)\n  test_case.assertEqual(102, message.optional_int64)\n  test_case.assertEqual(103, message.optional_uint32)\n  test_case.assertEqual(104, message.optional_uint64)\n  test_case.assertEqual(105, message.optional_sint32)\n  test_case.assertEqual(106, message.optional_sint64)\n  test_case.assertEqual(107, message.optional_fixed32)\n  test_case.assertEqual(108, message.optional_fixed64)\n  test_case.assertEqual(109, message.optional_sfixed32)\n  test_case.assertEqual(110, message.optional_sfixed64)\n  test_case.assertEqual(111, message.optional_float)\n  test_case.assertEqual(112, message.optional_double)\n  test_case.assertEqual(True, message.optional_bool)\n  test_case.assertEqual('115', message.optional_string)\n  test_case.assertEqual('116', message.optional_bytes)\n\n  test_case.assertEqual(117, message.optionalgroup.a)\n  test_case.assertEqual(118, message.optional_nested_message.bb)\n  test_case.assertEqual(119, message.optional_foreign_message.c)\n  test_case.assertEqual(120, message.optional_import_message.d)\n\n  test_case.assertEqual(unittest_pb2.TestAllTypes.BAZ,\n                        message.optional_nested_enum)\n  test_case.assertEqual(unittest_pb2.FOREIGN_BAZ,\n                        message.optional_foreign_enum)\n  test_case.assertEqual(unittest_import_pb2.IMPORT_BAZ,\n                        message.optional_import_enum)\n\n  # -----------------------------------------------------------------\n\n  test_case.assertEqual(2, len(message.repeated_int32))\n  test_case.assertEqual(2, len(message.repeated_int64))\n  test_case.assertEqual(2, len(message.repeated_uint32))\n  test_case.assertEqual(2, len(message.repeated_uint64))\n  test_case.assertEqual(2, len(message.repeated_sint32))\n  test_case.assertEqual(2, len(message.repeated_sint64))\n  test_case.assertEqual(2, len(message.repeated_fixed32))\n  test_case.assertEqual(2, len(message.repeated_fixed64))\n  test_case.assertEqual(2, len(message.repeated_sfixed32))\n  test_case.assertEqual(2, len(message.repeated_sfixed64))\n  test_case.assertEqual(2, len(message.repeated_float))\n  test_case.assertEqual(2, len(message.repeated_double))\n  test_case.assertEqual(2, len(message.repeated_bool))\n  test_case.assertEqual(2, len(message.repeated_string))\n  test_case.assertEqual(2, len(message.repeated_bytes))\n\n  test_case.assertEqual(2, len(message.repeatedgroup))\n  test_case.assertEqual(2, len(message.repeated_nested_message))\n  test_case.assertEqual(2, len(message.repeated_foreign_message))\n  test_case.assertEqual(2, len(message.repeated_import_message))\n  test_case.assertEqual(2, len(message.repeated_nested_enum))\n  test_case.assertEqual(2, len(message.repeated_foreign_enum))\n  test_case.assertEqual(2, len(message.repeated_import_enum))\n\n  test_case.assertEqual(2, len(message.repeated_string_piece))\n  test_case.assertEqual(2, len(message.repeated_cord))\n\n  test_case.assertEqual(201, message.repeated_int32[0])\n  test_case.assertEqual(202, message.repeated_int64[0])\n  test_case.assertEqual(203, message.repeated_uint32[0])\n  test_case.assertEqual(204, message.repeated_uint64[0])\n  test_case.assertEqual(205, message.repeated_sint32[0])\n  test_case.assertEqual(206, message.repeated_sint64[0])\n  test_case.assertEqual(207, message.repeated_fixed32[0])\n  test_case.assertEqual(208, message.repeated_fixed64[0])\n  test_case.assertEqual(209, message.repeated_sfixed32[0])\n  test_case.assertEqual(210, message.repeated_sfixed64[0])\n  test_case.assertEqual(211, message.repeated_float[0])\n  test_case.assertEqual(212, message.repeated_double[0])\n  test_case.assertEqual(True, message.repeated_bool[0])\n  test_case.assertEqual('215', message.repeated_string[0])\n  test_case.assertEqual('216', message.repeated_bytes[0])\n\n  test_case.assertEqual(217, message.repeatedgroup[0].a)\n  test_case.assertEqual(218, message.repeated_nested_message[0].bb)\n  test_case.assertEqual(219, message.repeated_foreign_message[0].c)\n  test_case.assertEqual(220, message.repeated_import_message[0].d)\n\n  test_case.assertEqual(unittest_pb2.TestAllTypes.BAR,\n                        message.repeated_nested_enum[0])\n  test_case.assertEqual(unittest_pb2.FOREIGN_BAR,\n                        message.repeated_foreign_enum[0])\n  test_case.assertEqual(unittest_import_pb2.IMPORT_BAR,\n                        message.repeated_import_enum[0])\n\n  test_case.assertEqual(301, message.repeated_int32[1])\n  test_case.assertEqual(302, message.repeated_int64[1])\n  test_case.assertEqual(303, message.repeated_uint32[1])\n  test_case.assertEqual(304, message.repeated_uint64[1])\n  test_case.assertEqual(305, message.repeated_sint32[1])\n  test_case.assertEqual(306, message.repeated_sint64[1])\n  test_case.assertEqual(307, message.repeated_fixed32[1])\n  test_case.assertEqual(308, message.repeated_fixed64[1])\n  test_case.assertEqual(309, message.repeated_sfixed32[1])\n  test_case.assertEqual(310, message.repeated_sfixed64[1])\n  test_case.assertEqual(311, message.repeated_float[1])\n  test_case.assertEqual(312, message.repeated_double[1])\n  test_case.assertEqual(False, message.repeated_bool[1])\n  test_case.assertEqual('315', message.repeated_string[1])\n  test_case.assertEqual('316', message.repeated_bytes[1])\n\n  test_case.assertEqual(317, message.repeatedgroup[1].a)\n  test_case.assertEqual(318, message.repeated_nested_message[1].bb)\n  test_case.assertEqual(319, message.repeated_foreign_message[1].c)\n  test_case.assertEqual(320, message.repeated_import_message[1].d)\n\n  test_case.assertEqual(unittest_pb2.TestAllTypes.BAZ,\n                        message.repeated_nested_enum[1])\n  test_case.assertEqual(unittest_pb2.FOREIGN_BAZ,\n                        message.repeated_foreign_enum[1])\n  test_case.assertEqual(unittest_import_pb2.IMPORT_BAZ,\n                        message.repeated_import_enum[1])\n\n  # -----------------------------------------------------------------\n\n  test_case.assertTrue(message.HasField('default_int32'))\n  test_case.assertTrue(message.HasField('default_int64'))\n  test_case.assertTrue(message.HasField('default_uint32'))\n  test_case.assertTrue(message.HasField('default_uint64'))\n  test_case.assertTrue(message.HasField('default_sint32'))\n  test_case.assertTrue(message.HasField('default_sint64'))\n  test_case.assertTrue(message.HasField('default_fixed32'))\n  test_case.assertTrue(message.HasField('default_fixed64'))\n  test_case.assertTrue(message.HasField('default_sfixed32'))\n  test_case.assertTrue(message.HasField('default_sfixed64'))\n  test_case.assertTrue(message.HasField('default_float'))\n  test_case.assertTrue(message.HasField('default_double'))\n  test_case.assertTrue(message.HasField('default_bool'))\n  test_case.assertTrue(message.HasField('default_string'))\n  test_case.assertTrue(message.HasField('default_bytes'))\n\n  test_case.assertTrue(message.HasField('default_nested_enum'))\n  test_case.assertTrue(message.HasField('default_foreign_enum'))\n  test_case.assertTrue(message.HasField('default_import_enum'))\n\n  test_case.assertEqual(401, message.default_int32)\n  test_case.assertEqual(402, message.default_int64)\n  test_case.assertEqual(403, message.default_uint32)\n  test_case.assertEqual(404, message.default_uint64)\n  test_case.assertEqual(405, message.default_sint32)\n  test_case.assertEqual(406, message.default_sint64)\n  test_case.assertEqual(407, message.default_fixed32)\n  test_case.assertEqual(408, message.default_fixed64)\n  test_case.assertEqual(409, message.default_sfixed32)\n  test_case.assertEqual(410, message.default_sfixed64)\n  test_case.assertEqual(411, message.default_float)\n  test_case.assertEqual(412, message.default_double)\n  test_case.assertEqual(False, message.default_bool)\n  test_case.assertEqual('415', message.default_string)\n  test_case.assertEqual('416', message.default_bytes)\n\n  test_case.assertEqual(unittest_pb2.TestAllTypes.FOO,\n                        message.default_nested_enum)\n  test_case.assertEqual(unittest_pb2.FOREIGN_FOO,\n                        message.default_foreign_enum)\n  test_case.assertEqual(unittest_import_pb2.IMPORT_FOO,\n                        message.default_import_enum)\n\ndef GoldenFile(filename):\n  \"\"\"Finds the given golden file and returns a file object representing it.\"\"\"\n\n  # Search up the directory tree looking for the C++ protobuf source code.\n  path = '.'\n  while os.path.exists(path):\n    if os.path.exists(os.path.join(path, 'src/google/protobuf')):\n      # Found it.  Load the golden file from the testdata directory.\n      full_path = os.path.join(path, 'src/google/protobuf/testdata', filename)\n      return open(full_path, 'rb')\n    path = os.path.join(path, '..')\n\n  raise RuntimeError(\n    'Could not find golden files.  This test must be run from within the '\n    'protobuf source package so that it can read test data files from the '\n    'C++ source tree.')\n\n\ndef SetAllPackedFields(message):\n  \"\"\"Sets every field in the message to a unique value.\n\n  Args:\n    message: A unittest_pb2.TestPackedTypes instance.\n  \"\"\"\n  message.packed_int32.extend([601, 701])\n  message.packed_int64.extend([602, 702])\n  message.packed_uint32.extend([603, 703])\n  message.packed_uint64.extend([604, 704])\n  message.packed_sint32.extend([605, 705])\n  message.packed_sint64.extend([606, 706])\n  message.packed_fixed32.extend([607, 707])\n  message.packed_fixed64.extend([608, 708])\n  message.packed_sfixed32.extend([609, 709])\n  message.packed_sfixed64.extend([610, 710])\n  message.packed_float.extend([611.0, 711.0])\n  message.packed_double.extend([612.0, 712.0])\n  message.packed_bool.extend([True, False])\n  message.packed_enum.extend([unittest_pb2.FOREIGN_BAR,\n                              unittest_pb2.FOREIGN_BAZ])\n\n\ndef SetAllPackedExtensions(message):\n  \"\"\"Sets every extension in the message to a unique value.\n\n  Args:\n    message: A unittest_pb2.TestPackedExtensions instance.\n  \"\"\"\n  extensions = message.Extensions\n  pb2 = unittest_pb2\n\n  extensions[pb2.packed_int32_extension].extend([601, 701])\n  extensions[pb2.packed_int64_extension].extend([602, 702])\n  extensions[pb2.packed_uint32_extension].extend([603, 703])\n  extensions[pb2.packed_uint64_extension].extend([604, 704])\n  extensions[pb2.packed_sint32_extension].extend([605, 705])\n  extensions[pb2.packed_sint64_extension].extend([606, 706])\n  extensions[pb2.packed_fixed32_extension].extend([607, 707])\n  extensions[pb2.packed_fixed64_extension].extend([608, 708])\n  extensions[pb2.packed_sfixed32_extension].extend([609, 709])\n  extensions[pb2.packed_sfixed64_extension].extend([610, 710])\n  extensions[pb2.packed_float_extension].extend([611.0, 711.0])\n  extensions[pb2.packed_double_extension].extend([612.0, 712.0])\n  extensions[pb2.packed_bool_extension].extend([True, False])\n  extensions[pb2.packed_enum_extension].extend([unittest_pb2.FOREIGN_BAR,\n                                                unittest_pb2.FOREIGN_BAZ])\n\n\ndef SetAllUnpackedFields(message):\n  \"\"\"Sets every field in the message to a unique value.\n\n  Args:\n    message: A unittest_pb2.TestUnpackedTypes instance.\n  \"\"\"\n  message.unpacked_int32.extend([601, 701])\n  message.unpacked_int64.extend([602, 702])\n  message.unpacked_uint32.extend([603, 703])\n  message.unpacked_uint64.extend([604, 704])\n  message.unpacked_sint32.extend([605, 705])\n  message.unpacked_sint64.extend([606, 706])\n  message.unpacked_fixed32.extend([607, 707])\n  message.unpacked_fixed64.extend([608, 708])\n  message.unpacked_sfixed32.extend([609, 709])\n  message.unpacked_sfixed64.extend([610, 710])\n  message.unpacked_float.extend([611.0, 711.0])\n  message.unpacked_double.extend([612.0, 712.0])\n  message.unpacked_bool.extend([True, False])\n  message.unpacked_enum.extend([unittest_pb2.FOREIGN_BAR,\n                                unittest_pb2.FOREIGN_BAZ])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/text_format_test.py",
    "content": "#! /usr/bin/python\n#\n# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Test for google.protobuf.text_format.\"\"\"\n\n__author__ = 'kenton@google.com (Kenton Varda)'\n\nimport difflib\nimport re\n\nimport unittest\nfrom google.protobuf import text_format\nfrom google.protobuf.internal import test_util\nfrom google.protobuf import unittest_pb2\nfrom google.protobuf import unittest_mset_pb2\n\n\nclass TextFormatTest(unittest.TestCase):\n  def ReadGolden(self, golden_filename):\n    f = test_util.GoldenFile(golden_filename)\n    golden_lines = f.readlines()\n    f.close()\n    return golden_lines\n\n  def CompareToGoldenFile(self, text, golden_filename):\n    golden_lines = self.ReadGolden(golden_filename)\n    self.CompareToGoldenLines(text, golden_lines)\n\n  def CompareToGoldenText(self, text, golden_text):\n    self.CompareToGoldenLines(text, golden_text.splitlines(1))\n\n  def CompareToGoldenLines(self, text, golden_lines):\n    actual_lines = text.splitlines(1)\n    self.assertEqual(golden_lines, actual_lines,\n      \"Text doesn't match golden.  Diff:\\n\" +\n      ''.join(difflib.ndiff(golden_lines, actual_lines)))\n\n  def testPrintAllFields(self):\n    message = unittest_pb2.TestAllTypes()\n    test_util.SetAllFields(message)\n    self.CompareToGoldenFile(\n      self.RemoveRedundantZeros(text_format.MessageToString(message)),\n      'text_format_unittest_data.txt')\n\n  def testPrintAllExtensions(self):\n    message = unittest_pb2.TestAllExtensions()\n    test_util.SetAllExtensions(message)\n    self.CompareToGoldenFile(\n      self.RemoveRedundantZeros(text_format.MessageToString(message)),\n      'text_format_unittest_extensions_data.txt')\n\n  def testPrintMessageSet(self):\n    message = unittest_mset_pb2.TestMessageSetContainer()\n    ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension\n    ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension\n    message.message_set.Extensions[ext1].i = 23\n    message.message_set.Extensions[ext2].str = 'foo'\n    self.CompareToGoldenText(text_format.MessageToString(message),\n      'message_set {\\n'\n      '  [protobuf_unittest.TestMessageSetExtension1] {\\n'\n      '    i: 23\\n'\n      '  }\\n'\n      '  [protobuf_unittest.TestMessageSetExtension2] {\\n'\n      '    str: \\\"foo\\\"\\n'\n      '  }\\n'\n      '}\\n')\n\n  def testPrintExotic(self):\n    message = unittest_pb2.TestAllTypes()\n    message.repeated_int64.append(-9223372036854775808)\n    message.repeated_uint64.append(18446744073709551615)\n    message.repeated_double.append(123.456)\n    message.repeated_double.append(1.23e22)\n    message.repeated_double.append(1.23e-18)\n    message.repeated_string.append('\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\"')\n    message.repeated_string.append(u'\\u00fc\\ua71f')\n    self.CompareToGoldenText(\n      self.RemoveRedundantZeros(text_format.MessageToString(message)),\n      'repeated_int64: -9223372036854775808\\n'\n      'repeated_uint64: 18446744073709551615\\n'\n      'repeated_double: 123.456\\n'\n      'repeated_double: 1.23e+22\\n'\n      'repeated_double: 1.23e-18\\n'\n      'repeated_string: '\n        '\"\\\\000\\\\001\\\\007\\\\010\\\\014\\\\n\\\\r\\\\t\\\\013\\\\\\\\\\\\\\'\\\\\"\"\\n'\n      'repeated_string: \"\\\\303\\\\274\\\\352\\\\234\\\\237\"\\n')\n\n  def testPrintNestedMessageAsOneLine(self):\n    message = unittest_pb2.TestAllTypes()\n    msg = message.repeated_nested_message.add()\n    msg.bb = 42;\n    self.CompareToGoldenText(\n        text_format.MessageToString(message, as_one_line=True),\n        'repeated_nested_message { bb: 42 }')\n\n  def testPrintRepeatedFieldsAsOneLine(self):\n    message = unittest_pb2.TestAllTypes()\n    message.repeated_int32.append(1)\n    message.repeated_int32.append(1)\n    message.repeated_int32.append(3)\n    message.repeated_string.append(\"Google\")\n    message.repeated_string.append(\"Zurich\")\n    self.CompareToGoldenText(\n        text_format.MessageToString(message, as_one_line=True),\n        'repeated_int32: 1 repeated_int32: 1 repeated_int32: 3 '\n        'repeated_string: \"Google\" repeated_string: \"Zurich\"')\n\n  def testPrintNestedNewLineInStringAsOneLine(self):\n    message = unittest_pb2.TestAllTypes()\n    message.optional_string = \"a\\nnew\\nline\"\n    self.CompareToGoldenText(\n        text_format.MessageToString(message, as_one_line=True),\n        'optional_string: \"a\\\\nnew\\\\nline\"')\n\n  def testPrintMessageSetAsOneLine(self):\n    message = unittest_mset_pb2.TestMessageSetContainer()\n    ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension\n    ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension\n    message.message_set.Extensions[ext1].i = 23\n    message.message_set.Extensions[ext2].str = 'foo'\n    self.CompareToGoldenText(\n        text_format.MessageToString(message, as_one_line=True),\n        'message_set {'\n        ' [protobuf_unittest.TestMessageSetExtension1] {'\n        ' i: 23'\n        ' }'\n        ' [protobuf_unittest.TestMessageSetExtension2] {'\n        ' str: \\\"foo\\\"'\n        ' }'\n        ' }')\n\n  def testPrintExoticAsOneLine(self):\n    message = unittest_pb2.TestAllTypes()\n    message.repeated_int64.append(-9223372036854775808)\n    message.repeated_uint64.append(18446744073709551615)\n    message.repeated_double.append(123.456)\n    message.repeated_double.append(1.23e22)\n    message.repeated_double.append(1.23e-18)\n    message.repeated_string.append('\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\"')\n    message.repeated_string.append(u'\\u00fc\\ua71f')\n    self.CompareToGoldenText(\n      self.RemoveRedundantZeros(\n          text_format.MessageToString(message, as_one_line=True)),\n      'repeated_int64: -9223372036854775808'\n      ' repeated_uint64: 18446744073709551615'\n      ' repeated_double: 123.456'\n      ' repeated_double: 1.23e+22'\n      ' repeated_double: 1.23e-18'\n      ' repeated_string: '\n      '\"\\\\000\\\\001\\\\007\\\\010\\\\014\\\\n\\\\r\\\\t\\\\013\\\\\\\\\\\\\\'\\\\\"\"'\n      ' repeated_string: \"\\\\303\\\\274\\\\352\\\\234\\\\237\"')\n\n  def testRoundTripExoticAsOneLine(self):\n    message = unittest_pb2.TestAllTypes()\n    message.repeated_int64.append(-9223372036854775808)\n    message.repeated_uint64.append(18446744073709551615)\n    message.repeated_double.append(123.456)\n    message.repeated_double.append(1.23e22)\n    message.repeated_double.append(1.23e-18)\n    message.repeated_string.append('\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\"')\n    message.repeated_string.append(u'\\u00fc\\ua71f')\n\n    # Test as_utf8 = False.\n    wire_text = text_format.MessageToString(\n        message, as_one_line=True, as_utf8=False)\n    parsed_message = unittest_pb2.TestAllTypes()\n    text_format.Merge(wire_text, parsed_message)\n    self.assertEquals(message, parsed_message)\n\n    # Test as_utf8 = True.\n    wire_text = text_format.MessageToString(\n        message, as_one_line=True, as_utf8=True)\n    parsed_message = unittest_pb2.TestAllTypes()\n    text_format.Merge(wire_text, parsed_message)\n    self.assertEquals(message, parsed_message)\n\n  def testPrintRawUtf8String(self):\n    message = unittest_pb2.TestAllTypes()\n    message.repeated_string.append(u'\\u00fc\\ua71f')\n    text = text_format.MessageToString(message, as_utf8 = True)\n    self.CompareToGoldenText(text, 'repeated_string: \"\\303\\274\\352\\234\\237\"\\n')\n    parsed_message = unittest_pb2.TestAllTypes()\n    text_format.Merge(text, parsed_message)\n    self.assertEquals(message, parsed_message)\n\n  def testMessageToString(self):\n    message = unittest_pb2.ForeignMessage()\n    message.c = 123\n    self.assertEqual('c: 123\\n', str(message))\n\n  def RemoveRedundantZeros(self, text):\n    # Some platforms print 1e+5 as 1e+005.  This is fine, but we need to remove\n    # these zeros in order to match the golden file.\n    text = text.replace('e+0','e+').replace('e+0','e+') \\\n               .replace('e-0','e-').replace('e-0','e-')\n    # Floating point fields are printed with .0 suffix even if they are\n    # actualy integer numbers.\n    text = re.compile('\\.0$', re.MULTILINE).sub('', text)\n    return text\n\n  def testMergeGolden(self):\n    golden_text = '\\n'.join(self.ReadGolden('text_format_unittest_data.txt'))\n    parsed_message = unittest_pb2.TestAllTypes()\n    text_format.Merge(golden_text, parsed_message)\n\n    message = unittest_pb2.TestAllTypes()\n    test_util.SetAllFields(message)\n    self.assertEquals(message, parsed_message)\n\n  def testMergeGoldenExtensions(self):\n    golden_text = '\\n'.join(self.ReadGolden(\n        'text_format_unittest_extensions_data.txt'))\n    parsed_message = unittest_pb2.TestAllExtensions()\n    text_format.Merge(golden_text, parsed_message)\n\n    message = unittest_pb2.TestAllExtensions()\n    test_util.SetAllExtensions(message)\n    self.assertEquals(message, parsed_message)\n\n  def testMergeAllFields(self):\n    message = unittest_pb2.TestAllTypes()\n    test_util.SetAllFields(message)\n    ascii_text = text_format.MessageToString(message)\n\n    parsed_message = unittest_pb2.TestAllTypes()\n    text_format.Merge(ascii_text, parsed_message)\n    self.assertEqual(message, parsed_message)\n    test_util.ExpectAllFieldsSet(self, message)\n\n  def testMergeAllExtensions(self):\n    message = unittest_pb2.TestAllExtensions()\n    test_util.SetAllExtensions(message)\n    ascii_text = text_format.MessageToString(message)\n\n    parsed_message = unittest_pb2.TestAllExtensions()\n    text_format.Merge(ascii_text, parsed_message)\n    self.assertEqual(message, parsed_message)\n\n  def testMergeMessageSet(self):\n    message = unittest_pb2.TestAllTypes()\n    text = ('repeated_uint64: 1\\n'\n            'repeated_uint64: 2\\n')\n    text_format.Merge(text, message)\n    self.assertEqual(1, message.repeated_uint64[0])\n    self.assertEqual(2, message.repeated_uint64[1])\n\n    message = unittest_mset_pb2.TestMessageSetContainer()\n    text = ('message_set {\\n'\n            '  [protobuf_unittest.TestMessageSetExtension1] {\\n'\n            '    i: 23\\n'\n            '  }\\n'\n            '  [protobuf_unittest.TestMessageSetExtension2] {\\n'\n            '    str: \\\"foo\\\"\\n'\n            '  }\\n'\n            '}\\n')\n    text_format.Merge(text, message)\n    ext1 = unittest_mset_pb2.TestMessageSetExtension1.message_set_extension\n    ext2 = unittest_mset_pb2.TestMessageSetExtension2.message_set_extension\n    self.assertEquals(23, message.message_set.Extensions[ext1].i)\n    self.assertEquals('foo', message.message_set.Extensions[ext2].str)\n\n  def testMergeExotic(self):\n    message = unittest_pb2.TestAllTypes()\n    text = ('repeated_int64: -9223372036854775808\\n'\n            'repeated_uint64: 18446744073709551615\\n'\n            'repeated_double: 123.456\\n'\n            'repeated_double: 1.23e+22\\n'\n            'repeated_double: 1.23e-18\\n'\n            'repeated_string: \\n'\n            '\"\\\\000\\\\001\\\\007\\\\010\\\\014\\\\n\\\\r\\\\t\\\\013\\\\\\\\\\\\\\'\\\\\"\"\\n'\n            'repeated_string: \"foo\" \\'corge\\' \"grault\"\\n'\n            'repeated_string: \"\\\\303\\\\274\\\\352\\\\234\\\\237\"\\n'\n            'repeated_string: \"\\\\xc3\\\\xbc\"\\n'\n            'repeated_string: \"\\xc3\\xbc\"\\n')\n    text_format.Merge(text, message)\n\n    self.assertEqual(-9223372036854775808, message.repeated_int64[0])\n    self.assertEqual(18446744073709551615, message.repeated_uint64[0])\n    self.assertEqual(123.456, message.repeated_double[0])\n    self.assertEqual(1.23e22, message.repeated_double[1])\n    self.assertEqual(1.23e-18, message.repeated_double[2])\n    self.assertEqual(\n        '\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\"', message.repeated_string[0])\n    self.assertEqual('foocorgegrault', message.repeated_string[1])\n    self.assertEqual(u'\\u00fc\\ua71f', message.repeated_string[2])\n    self.assertEqual(u'\\u00fc', message.repeated_string[3])\n\n  def testMergeEmptyText(self):\n    message = unittest_pb2.TestAllTypes()\n    text = ''\n    text_format.Merge(text, message)\n    self.assertEquals(unittest_pb2.TestAllTypes(), message)\n\n  def testMergeInvalidUtf8(self):\n    message = unittest_pb2.TestAllTypes()\n    text = 'repeated_string: \"\\\\xc3\\\\xc3\"'\n    self.assertRaises(text_format.ParseError, text_format.Merge, text, message)\n\n  def testMergeSingleWord(self):\n    message = unittest_pb2.TestAllTypes()\n    text = 'foo'\n    self.assertRaisesWithMessage(\n        text_format.ParseError,\n        ('1:1 : Message type \"protobuf_unittest.TestAllTypes\" has no field named '\n         '\"foo\".'),\n        text_format.Merge, text, message)\n\n  def testMergeUnknownField(self):\n    message = unittest_pb2.TestAllTypes()\n    text = 'unknown_field: 8\\n'\n    self.assertRaisesWithMessage(\n        text_format.ParseError,\n        ('1:1 : Message type \"protobuf_unittest.TestAllTypes\" has no field named '\n         '\"unknown_field\".'),\n        text_format.Merge, text, message)\n\n  def testMergeBadExtension(self):\n    message = unittest_pb2.TestAllExtensions()\n    text = '[unknown_extension]: 8\\n'\n    self.assertRaisesWithMessage(\n        text_format.ParseError,\n        '1:2 : Extension \"unknown_extension\" not registered.',\n        text_format.Merge, text, message)\n    message = unittest_pb2.TestAllTypes()\n    self.assertRaisesWithMessage(\n        text_format.ParseError,\n        ('1:2 : Message type \"protobuf_unittest.TestAllTypes\" does not have '\n         'extensions.'),\n        text_format.Merge, text, message)\n\n  def testMergeGroupNotClosed(self):\n    message = unittest_pb2.TestAllTypes()\n    text = 'RepeatedGroup: <'\n    self.assertRaisesWithMessage(\n        text_format.ParseError, '1:16 : Expected \">\".',\n        text_format.Merge, text, message)\n\n    text = 'RepeatedGroup: {'\n    self.assertRaisesWithMessage(\n        text_format.ParseError, '1:16 : Expected \"}\".',\n        text_format.Merge, text, message)\n\n  def testMergeEmptyGroup(self):\n    message = unittest_pb2.TestAllTypes()\n    text = 'OptionalGroup: {}'\n    text_format.Merge(text, message)\n    self.assertTrue(message.HasField('optionalgroup'))\n\n    message.Clear()\n\n    message = unittest_pb2.TestAllTypes()\n    text = 'OptionalGroup: <>'\n    text_format.Merge(text, message)\n    self.assertTrue(message.HasField('optionalgroup'))\n\n  def testMergeBadEnumValue(self):\n    message = unittest_pb2.TestAllTypes()\n    text = 'optional_nested_enum: BARR'\n    self.assertRaisesWithMessage(\n        text_format.ParseError,\n        ('1:23 : Enum type \"protobuf_unittest.TestAllTypes.NestedEnum\" '\n         'has no value named BARR.'),\n        text_format.Merge, text, message)\n\n    message = unittest_pb2.TestAllTypes()\n    text = 'optional_nested_enum: 100'\n    self.assertRaisesWithMessage(\n        text_format.ParseError,\n        ('1:23 : Enum type \"protobuf_unittest.TestAllTypes.NestedEnum\" '\n         'has no value with number 100.'),\n        text_format.Merge, text, message)\n\n  def assertRaisesWithMessage(self, e_class, e, func, *args, **kwargs):\n    \"\"\"Same as assertRaises, but also compares the exception message.\"\"\"\n    if hasattr(e_class, '__name__'):\n      exc_name = e_class.__name__\n    else:\n      exc_name = str(e_class)\n\n    try:\n      func(*args, **kwargs)\n    except e_class, expr:\n      if str(expr) != e:\n        msg = '%s raised, but with wrong message: \"%s\" instead of \"%s\"'\n        raise self.failureException(msg % (exc_name,\n                                           str(expr).encode('string_escape'),\n                                           e.encode('string_escape')))\n      return\n    else:\n      raise self.failureException('%s not raised' % exc_name)\n\n\nclass TokenizerTest(unittest.TestCase):\n\n  def testSimpleTokenCases(self):\n    text = ('identifier1:\"string1\"\\n     \\n\\n'\n            'identifier2 : \\n \\n123  \\n  identifier3 :\\'string\\'\\n'\n            'identifiER_4 : 1.1e+2 ID5:-0.23 ID6:\\'aaaa\\\\\\'bbbb\\'\\n'\n            'ID7 : \"aa\\\\\"bb\"\\n\\n\\n\\n ID8: {A:inf B:-inf C:true D:false}\\n'\n            'ID9: 22 ID10: -111111111111111111 ID11: -22\\n'\n            'ID12: 2222222222222222222 '\n            'false_bool:  0 true_BOOL:t \\n true_bool1:  1 false_BOOL1:f ' )\n    tokenizer = text_format._Tokenizer(text)\n    methods = [(tokenizer.ConsumeIdentifier, 'identifier1'),\n               ':',\n               (tokenizer.ConsumeString, 'string1'),\n               (tokenizer.ConsumeIdentifier, 'identifier2'),\n               ':',\n               (tokenizer.ConsumeInt32, 123),\n               (tokenizer.ConsumeIdentifier, 'identifier3'),\n               ':',\n               (tokenizer.ConsumeString, 'string'),\n               (tokenizer.ConsumeIdentifier, 'identifiER_4'),\n               ':',\n               (tokenizer.ConsumeFloat, 1.1e+2),\n               (tokenizer.ConsumeIdentifier, 'ID5'),\n               ':',\n               (tokenizer.ConsumeFloat, -0.23),\n               (tokenizer.ConsumeIdentifier, 'ID6'),\n               ':',\n               (tokenizer.ConsumeString, 'aaaa\\'bbbb'),\n               (tokenizer.ConsumeIdentifier, 'ID7'),\n               ':',\n               (tokenizer.ConsumeString, 'aa\\\"bb'),\n               (tokenizer.ConsumeIdentifier, 'ID8'),\n               ':',\n               '{',\n               (tokenizer.ConsumeIdentifier, 'A'),\n               ':',\n               (tokenizer.ConsumeFloat, text_format._INFINITY),\n               (tokenizer.ConsumeIdentifier, 'B'),\n               ':',\n               (tokenizer.ConsumeFloat, -text_format._INFINITY),\n               (tokenizer.ConsumeIdentifier, 'C'),\n               ':',\n               (tokenizer.ConsumeBool, True),\n               (tokenizer.ConsumeIdentifier, 'D'),\n               ':',\n               (tokenizer.ConsumeBool, False),\n               '}',\n               (tokenizer.ConsumeIdentifier, 'ID9'),\n               ':',\n               (tokenizer.ConsumeUint32, 22),\n               (tokenizer.ConsumeIdentifier, 'ID10'),\n               ':',\n               (tokenizer.ConsumeInt64, -111111111111111111),\n               (tokenizer.ConsumeIdentifier, 'ID11'),\n               ':',\n               (tokenizer.ConsumeInt32, -22),\n               (tokenizer.ConsumeIdentifier, 'ID12'),\n               ':',\n               (tokenizer.ConsumeUint64, 2222222222222222222),\n               (tokenizer.ConsumeIdentifier, 'false_bool'),\n               ':',\n               (tokenizer.ConsumeBool, False),\n               (tokenizer.ConsumeIdentifier, 'true_BOOL'),\n               ':',\n               (tokenizer.ConsumeBool, True),\n               (tokenizer.ConsumeIdentifier, 'true_bool1'),\n               ':',\n               (tokenizer.ConsumeBool, True),\n               (tokenizer.ConsumeIdentifier, 'false_BOOL1'),\n               ':',\n               (tokenizer.ConsumeBool, False)]\n\n    i = 0\n    while not tokenizer.AtEnd():\n      m = methods[i]\n      if type(m) == str:\n        token = tokenizer.token\n        self.assertEqual(token, m)\n        tokenizer.NextToken()\n      else:\n        self.assertEqual(m[1], m[0]())\n      i += 1\n\n  def testConsumeIntegers(self):\n    # This test only tests the failures in the integer parsing methods as well\n    # as the '0' special cases.\n    int64_max = (1 << 63) - 1\n    uint32_max = (1 << 32) - 1\n    text = '-1 %d %d' % (uint32_max + 1, int64_max + 1)\n    tokenizer = text_format._Tokenizer(text)\n    self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32)\n    self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint64)\n    self.assertEqual(-1, tokenizer.ConsumeInt32())\n\n    self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32)\n    self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt32)\n    self.assertEqual(uint32_max + 1, tokenizer.ConsumeInt64())\n\n    self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt64)\n    self.assertEqual(int64_max + 1, tokenizer.ConsumeUint64())\n    self.assertTrue(tokenizer.AtEnd())\n\n    text = '-0 -0 0 0'\n    tokenizer = text_format._Tokenizer(text)\n    self.assertEqual(0, tokenizer.ConsumeUint32())\n    self.assertEqual(0, tokenizer.ConsumeUint64())\n    self.assertEqual(0, tokenizer.ConsumeUint32())\n    self.assertEqual(0, tokenizer.ConsumeUint64())\n    self.assertTrue(tokenizer.AtEnd())\n\n  def testConsumeByteString(self):\n    text = '\"string1\\''\n    tokenizer = text_format._Tokenizer(text)\n    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)\n\n    text = 'string1\"'\n    tokenizer = text_format._Tokenizer(text)\n    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)\n\n    text = '\\n\"\\\\xt\"'\n    tokenizer = text_format._Tokenizer(text)\n    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)\n\n    text = '\\n\"\\\\\"'\n    tokenizer = text_format._Tokenizer(text)\n    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)\n\n    text = '\\n\"\\\\x\"'\n    tokenizer = text_format._Tokenizer(text)\n    self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString)\n\n  def testConsumeBool(self):\n    text = 'not-a-bool'\n    tokenizer = text_format._Tokenizer(text)\n    self.assertRaises(text_format.ParseError, tokenizer.ConsumeBool)\n\n  def testInfNan(self):\n    # Make sure our infinity and NaN definitions are sound.\n    self.assertEquals(float, type(text_format._INFINITY))\n    self.assertEquals(float, type(text_format._NAN))\n    self.assertTrue(text_format._NAN != text_format._NAN)\n\n    inf_times_zero = text_format._INFINITY * 0\n    self.assertTrue(inf_times_zero != inf_times_zero)\n    self.assertTrue(text_format._INFINITY > 0)\n\n\nif __name__ == '__main__':\n  unittest.main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/type_checkers.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Provides type checking routines.\n\nThis module defines type checking utilities in the forms of dictionaries:\n\nVALUE_CHECKERS: A dictionary of field types and a value validation object.\nTYPE_TO_BYTE_SIZE_FN: A dictionary with field types and a size computing\n  function.\nTYPE_TO_SERIALIZE_METHOD: A dictionary with field types and serialization\n  function.\nFIELD_TYPE_TO_WIRE_TYPE: A dictionary with field typed and their\n  coresponding wire types.\nTYPE_TO_DESERIALIZE_METHOD: A dictionary with field types and deserialization\n  function.\n\"\"\"\n\n__author__ = 'robinson@google.com (Will Robinson)'\n\nfrom google.protobuf.internal import decoder\nfrom google.protobuf.internal import encoder\nfrom google.protobuf.internal import wire_format\nfrom google.protobuf import descriptor\n\n_FieldDescriptor = descriptor.FieldDescriptor\n\n\ndef GetTypeChecker(cpp_type, field_type):\n  \"\"\"Returns a type checker for a message field of the specified types.\n\n  Args:\n    cpp_type: C++ type of the field (see descriptor.py).\n    field_type: Protocol message field type (see descriptor.py).\n\n  Returns:\n    An instance of TypeChecker which can be used to verify the types\n    of values assigned to a field of the specified type.\n  \"\"\"\n  if (cpp_type == _FieldDescriptor.CPPTYPE_STRING and\n      field_type == _FieldDescriptor.TYPE_STRING):\n    return UnicodeValueChecker()\n  return _VALUE_CHECKERS[cpp_type]\n\n\n# None of the typecheckers below make any attempt to guard against people\n# subclassing builtin types and doing weird things.  We're not trying to\n# protect against malicious clients here, just people accidentally shooting\n# themselves in the foot in obvious ways.\n\nclass TypeChecker(object):\n\n  \"\"\"Type checker used to catch type errors as early as possible\n  when the client is setting scalar fields in protocol messages.\n  \"\"\"\n\n  def __init__(self, *acceptable_types):\n    self._acceptable_types = acceptable_types\n\n  def CheckValue(self, proposed_value):\n    if not isinstance(proposed_value, self._acceptable_types):\n      message = ('%.1024r has type %s, but expected one of: %s' %\n                 (proposed_value, type(proposed_value), self._acceptable_types))\n      raise TypeError(message)\n\n\n# IntValueChecker and its subclasses perform integer type-checks\n# and bounds-checks.\nclass IntValueChecker(object):\n\n  \"\"\"Checker used for integer fields.  Performs type-check and range check.\"\"\"\n\n  def CheckValue(self, proposed_value):\n    if not isinstance(proposed_value, (int, long)):\n      message = ('%.1024r has type %s, but expected one of: %s' %\n                 (proposed_value, type(proposed_value), (int, long)))\n      raise TypeError(message)\n    if not self._MIN <= proposed_value <= self._MAX:\n      raise ValueError('Value out of range: %d' % proposed_value)\n\n\nclass UnicodeValueChecker(object):\n\n  \"\"\"Checker used for string fields.\"\"\"\n\n  def CheckValue(self, proposed_value):\n    if not isinstance(proposed_value, (str, unicode)):\n      message = ('%.1024r has type %s, but expected one of: %s' %\n                 (proposed_value, type(proposed_value), (str, unicode)))\n      raise TypeError(message)\n\n    # If the value is of type 'str' make sure that it is in 7-bit ASCII\n    # encoding.\n    if isinstance(proposed_value, str):\n      try:\n        unicode(proposed_value, 'ascii')\n      except UnicodeDecodeError:\n        raise ValueError('%.1024r has type str, but isn\\'t in 7-bit ASCII '\n                         'encoding. Non-ASCII strings must be converted to '\n                         'unicode objects before being added.' %\n                         (proposed_value))\n\n\nclass Int32ValueChecker(IntValueChecker):\n  # We're sure to use ints instead of longs here since comparison may be more\n  # efficient.\n  _MIN = -2147483648\n  _MAX = 2147483647\n\n\nclass Uint32ValueChecker(IntValueChecker):\n  _MIN = 0\n  _MAX = (1 << 32) - 1\n\n\nclass Int64ValueChecker(IntValueChecker):\n  _MIN = -(1 << 63)\n  _MAX = (1 << 63) - 1\n\n\nclass Uint64ValueChecker(IntValueChecker):\n  _MIN = 0\n  _MAX = (1 << 64) - 1\n\n\n# Type-checkers for all scalar CPPTYPEs.\n_VALUE_CHECKERS = {\n    _FieldDescriptor.CPPTYPE_INT32: Int32ValueChecker(),\n    _FieldDescriptor.CPPTYPE_INT64: Int64ValueChecker(),\n    _FieldDescriptor.CPPTYPE_UINT32: Uint32ValueChecker(),\n    _FieldDescriptor.CPPTYPE_UINT64: Uint64ValueChecker(),\n    _FieldDescriptor.CPPTYPE_DOUBLE: TypeChecker(\n        float, int, long),\n    _FieldDescriptor.CPPTYPE_FLOAT: TypeChecker(\n        float, int, long),\n    _FieldDescriptor.CPPTYPE_BOOL: TypeChecker(bool, int),\n    _FieldDescriptor.CPPTYPE_ENUM: Int32ValueChecker(),\n    _FieldDescriptor.CPPTYPE_STRING: TypeChecker(str),\n    }\n\n\n# Map from field type to a function F, such that F(field_num, value)\n# gives the total byte size for a value of the given type.  This\n# byte size includes tag information and any other additional space\n# associated with serializing \"value\".\nTYPE_TO_BYTE_SIZE_FN = {\n    _FieldDescriptor.TYPE_DOUBLE: wire_format.DoubleByteSize,\n    _FieldDescriptor.TYPE_FLOAT: wire_format.FloatByteSize,\n    _FieldDescriptor.TYPE_INT64: wire_format.Int64ByteSize,\n    _FieldDescriptor.TYPE_UINT64: wire_format.UInt64ByteSize,\n    _FieldDescriptor.TYPE_INT32: wire_format.Int32ByteSize,\n    _FieldDescriptor.TYPE_FIXED64: wire_format.Fixed64ByteSize,\n    _FieldDescriptor.TYPE_FIXED32: wire_format.Fixed32ByteSize,\n    _FieldDescriptor.TYPE_BOOL: wire_format.BoolByteSize,\n    _FieldDescriptor.TYPE_STRING: wire_format.StringByteSize,\n    _FieldDescriptor.TYPE_GROUP: wire_format.GroupByteSize,\n    _FieldDescriptor.TYPE_MESSAGE: wire_format.MessageByteSize,\n    _FieldDescriptor.TYPE_BYTES: wire_format.BytesByteSize,\n    _FieldDescriptor.TYPE_UINT32: wire_format.UInt32ByteSize,\n    _FieldDescriptor.TYPE_ENUM: wire_format.EnumByteSize,\n    _FieldDescriptor.TYPE_SFIXED32: wire_format.SFixed32ByteSize,\n    _FieldDescriptor.TYPE_SFIXED64: wire_format.SFixed64ByteSize,\n    _FieldDescriptor.TYPE_SINT32: wire_format.SInt32ByteSize,\n    _FieldDescriptor.TYPE_SINT64: wire_format.SInt64ByteSize\n    }\n\n\n# Maps from field types to encoder constructors.\nTYPE_TO_ENCODER = {\n    _FieldDescriptor.TYPE_DOUBLE: encoder.DoubleEncoder,\n    _FieldDescriptor.TYPE_FLOAT: encoder.FloatEncoder,\n    _FieldDescriptor.TYPE_INT64: encoder.Int64Encoder,\n    _FieldDescriptor.TYPE_UINT64: encoder.UInt64Encoder,\n    _FieldDescriptor.TYPE_INT32: encoder.Int32Encoder,\n    _FieldDescriptor.TYPE_FIXED64: encoder.Fixed64Encoder,\n    _FieldDescriptor.TYPE_FIXED32: encoder.Fixed32Encoder,\n    _FieldDescriptor.TYPE_BOOL: encoder.BoolEncoder,\n    _FieldDescriptor.TYPE_STRING: encoder.StringEncoder,\n    _FieldDescriptor.TYPE_GROUP: encoder.GroupEncoder,\n    _FieldDescriptor.TYPE_MESSAGE: encoder.MessageEncoder,\n    _FieldDescriptor.TYPE_BYTES: encoder.BytesEncoder,\n    _FieldDescriptor.TYPE_UINT32: encoder.UInt32Encoder,\n    _FieldDescriptor.TYPE_ENUM: encoder.EnumEncoder,\n    _FieldDescriptor.TYPE_SFIXED32: encoder.SFixed32Encoder,\n    _FieldDescriptor.TYPE_SFIXED64: encoder.SFixed64Encoder,\n    _FieldDescriptor.TYPE_SINT32: encoder.SInt32Encoder,\n    _FieldDescriptor.TYPE_SINT64: encoder.SInt64Encoder,\n    }\n\n\n# Maps from field types to sizer constructors.\nTYPE_TO_SIZER = {\n    _FieldDescriptor.TYPE_DOUBLE: encoder.DoubleSizer,\n    _FieldDescriptor.TYPE_FLOAT: encoder.FloatSizer,\n    _FieldDescriptor.TYPE_INT64: encoder.Int64Sizer,\n    _FieldDescriptor.TYPE_UINT64: encoder.UInt64Sizer,\n    _FieldDescriptor.TYPE_INT32: encoder.Int32Sizer,\n    _FieldDescriptor.TYPE_FIXED64: encoder.Fixed64Sizer,\n    _FieldDescriptor.TYPE_FIXED32: encoder.Fixed32Sizer,\n    _FieldDescriptor.TYPE_BOOL: encoder.BoolSizer,\n    _FieldDescriptor.TYPE_STRING: encoder.StringSizer,\n    _FieldDescriptor.TYPE_GROUP: encoder.GroupSizer,\n    _FieldDescriptor.TYPE_MESSAGE: encoder.MessageSizer,\n    _FieldDescriptor.TYPE_BYTES: encoder.BytesSizer,\n    _FieldDescriptor.TYPE_UINT32: encoder.UInt32Sizer,\n    _FieldDescriptor.TYPE_ENUM: encoder.EnumSizer,\n    _FieldDescriptor.TYPE_SFIXED32: encoder.SFixed32Sizer,\n    _FieldDescriptor.TYPE_SFIXED64: encoder.SFixed64Sizer,\n    _FieldDescriptor.TYPE_SINT32: encoder.SInt32Sizer,\n    _FieldDescriptor.TYPE_SINT64: encoder.SInt64Sizer,\n    }\n\n\n# Maps from field type to a decoder constructor.\nTYPE_TO_DECODER = {\n    _FieldDescriptor.TYPE_DOUBLE: decoder.DoubleDecoder,\n    _FieldDescriptor.TYPE_FLOAT: decoder.FloatDecoder,\n    _FieldDescriptor.TYPE_INT64: decoder.Int64Decoder,\n    _FieldDescriptor.TYPE_UINT64: decoder.UInt64Decoder,\n    _FieldDescriptor.TYPE_INT32: decoder.Int32Decoder,\n    _FieldDescriptor.TYPE_FIXED64: decoder.Fixed64Decoder,\n    _FieldDescriptor.TYPE_FIXED32: decoder.Fixed32Decoder,\n    _FieldDescriptor.TYPE_BOOL: decoder.BoolDecoder,\n    _FieldDescriptor.TYPE_STRING: decoder.StringDecoder,\n    _FieldDescriptor.TYPE_GROUP: decoder.GroupDecoder,\n    _FieldDescriptor.TYPE_MESSAGE: decoder.MessageDecoder,\n    _FieldDescriptor.TYPE_BYTES: decoder.BytesDecoder,\n    _FieldDescriptor.TYPE_UINT32: decoder.UInt32Decoder,\n    _FieldDescriptor.TYPE_ENUM: decoder.EnumDecoder,\n    _FieldDescriptor.TYPE_SFIXED32: decoder.SFixed32Decoder,\n    _FieldDescriptor.TYPE_SFIXED64: decoder.SFixed64Decoder,\n    _FieldDescriptor.TYPE_SINT32: decoder.SInt32Decoder,\n    _FieldDescriptor.TYPE_SINT64: decoder.SInt64Decoder,\n    }\n\n# Maps from field type to expected wiretype.\nFIELD_TYPE_TO_WIRE_TYPE = {\n    _FieldDescriptor.TYPE_DOUBLE: wire_format.WIRETYPE_FIXED64,\n    _FieldDescriptor.TYPE_FLOAT: wire_format.WIRETYPE_FIXED32,\n    _FieldDescriptor.TYPE_INT64: wire_format.WIRETYPE_VARINT,\n    _FieldDescriptor.TYPE_UINT64: wire_format.WIRETYPE_VARINT,\n    _FieldDescriptor.TYPE_INT32: wire_format.WIRETYPE_VARINT,\n    _FieldDescriptor.TYPE_FIXED64: wire_format.WIRETYPE_FIXED64,\n    _FieldDescriptor.TYPE_FIXED32: wire_format.WIRETYPE_FIXED32,\n    _FieldDescriptor.TYPE_BOOL: wire_format.WIRETYPE_VARINT,\n    _FieldDescriptor.TYPE_STRING:\n      wire_format.WIRETYPE_LENGTH_DELIMITED,\n    _FieldDescriptor.TYPE_GROUP: wire_format.WIRETYPE_START_GROUP,\n    _FieldDescriptor.TYPE_MESSAGE:\n      wire_format.WIRETYPE_LENGTH_DELIMITED,\n    _FieldDescriptor.TYPE_BYTES:\n      wire_format.WIRETYPE_LENGTH_DELIMITED,\n    _FieldDescriptor.TYPE_UINT32: wire_format.WIRETYPE_VARINT,\n    _FieldDescriptor.TYPE_ENUM: wire_format.WIRETYPE_VARINT,\n    _FieldDescriptor.TYPE_SFIXED32: wire_format.WIRETYPE_FIXED32,\n    _FieldDescriptor.TYPE_SFIXED64: wire_format.WIRETYPE_FIXED64,\n    _FieldDescriptor.TYPE_SINT32: wire_format.WIRETYPE_VARINT,\n    _FieldDescriptor.TYPE_SINT64: wire_format.WIRETYPE_VARINT,\n    }\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Constants and static functions to support protocol buffer wire format.\"\"\"\n\n__author__ = 'robinson@google.com (Will Robinson)'\n\nimport struct\nfrom google.protobuf import descriptor\nfrom google.protobuf import message\n\n\nTAG_TYPE_BITS = 3  # Number of bits used to hold type info in a proto tag.\nTAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1  # 0x7\n\n# These numbers identify the wire type of a protocol buffer value.\n# We use the least-significant TAG_TYPE_BITS bits of the varint-encoded\n# tag-and-type to store one of these WIRETYPE_* constants.\n# These values must match WireType enum in google/protobuf/wire_format.h.\nWIRETYPE_VARINT = 0\nWIRETYPE_FIXED64 = 1\nWIRETYPE_LENGTH_DELIMITED = 2\nWIRETYPE_START_GROUP = 3\nWIRETYPE_END_GROUP = 4\nWIRETYPE_FIXED32 = 5\n_WIRETYPE_MAX = 5\n\n\n# Bounds for various integer types.\nINT32_MAX = int((1 << 31) - 1)\nINT32_MIN = int(-(1 << 31))\nUINT32_MAX = (1 << 32) - 1\n\nINT64_MAX = (1 << 63) - 1\nINT64_MIN = -(1 << 63)\nUINT64_MAX = (1 << 64) - 1\n\n# \"struct\" format strings that will encode/decode the specified formats.\nFORMAT_UINT32_LITTLE_ENDIAN = '<I'\nFORMAT_UINT64_LITTLE_ENDIAN = '<Q'\nFORMAT_FLOAT_LITTLE_ENDIAN = '<f'\nFORMAT_DOUBLE_LITTLE_ENDIAN = '<d'\n\n\n# We'll have to provide alternate implementations of AppendLittleEndian*() on\n# any architectures where these checks fail.\nif struct.calcsize(FORMAT_UINT32_LITTLE_ENDIAN) != 4:\n  raise AssertionError('Format \"I\" is not a 32-bit number.')\nif struct.calcsize(FORMAT_UINT64_LITTLE_ENDIAN) != 8:\n  raise AssertionError('Format \"Q\" is not a 64-bit number.')\n\n\ndef PackTag(field_number, wire_type):\n  \"\"\"Returns an unsigned 32-bit integer that encodes the field number and\n  wire type information in standard protocol message wire format.\n\n  Args:\n    field_number: Expected to be an integer in the range [1, 1 << 29)\n    wire_type: One of the WIRETYPE_* constants.\n  \"\"\"\n  if not 0 <= wire_type <= _WIRETYPE_MAX:\n    raise message.EncodeError('Unknown wire type: %d' % wire_type)\n  return (field_number << TAG_TYPE_BITS) | wire_type\n\n\ndef UnpackTag(tag):\n  \"\"\"The inverse of PackTag().  Given an unsigned 32-bit number,\n  returns a (field_number, wire_type) tuple.\n  \"\"\"\n  return (tag >> TAG_TYPE_BITS), (tag & TAG_TYPE_MASK)\n\n\ndef ZigZagEncode(value):\n  \"\"\"ZigZag Transform:  Encodes signed integers so that they can be\n  effectively used with varint encoding.  See wire_format.h for\n  more details.\n  \"\"\"\n  if value >= 0:\n    return value << 1\n  return (value << 1) ^ (~0)\n\n\ndef ZigZagDecode(value):\n  \"\"\"Inverse of ZigZagEncode().\"\"\"\n  if not value & 0x1:\n    return value >> 1\n  return (value >> 1) ^ (~0)\n\n\n\n# The *ByteSize() functions below return the number of bytes required to\n# serialize \"field number + type\" information and then serialize the value.\n\n\ndef Int32ByteSize(field_number, int32):\n  return Int64ByteSize(field_number, int32)\n\n\ndef Int32ByteSizeNoTag(int32):\n  return _VarUInt64ByteSizeNoTag(0xffffffffffffffff & int32)\n\n\ndef Int64ByteSize(field_number, int64):\n  # Have to convert to uint before calling UInt64ByteSize().\n  return UInt64ByteSize(field_number, 0xffffffffffffffff & int64)\n\n\ndef UInt32ByteSize(field_number, uint32):\n  return UInt64ByteSize(field_number, uint32)\n\n\ndef UInt64ByteSize(field_number, uint64):\n  return TagByteSize(field_number) + _VarUInt64ByteSizeNoTag(uint64)\n\n\ndef SInt32ByteSize(field_number, int32):\n  return UInt32ByteSize(field_number, ZigZagEncode(int32))\n\n\ndef SInt64ByteSize(field_number, int64):\n  return UInt64ByteSize(field_number, ZigZagEncode(int64))\n\n\ndef Fixed32ByteSize(field_number, fixed32):\n  return TagByteSize(field_number) + 4\n\n\ndef Fixed64ByteSize(field_number, fixed64):\n  return TagByteSize(field_number) + 8\n\n\ndef SFixed32ByteSize(field_number, sfixed32):\n  return TagByteSize(field_number) + 4\n\n\ndef SFixed64ByteSize(field_number, sfixed64):\n  return TagByteSize(field_number) + 8\n\n\ndef FloatByteSize(field_number, flt):\n  return TagByteSize(field_number) + 4\n\n\ndef DoubleByteSize(field_number, double):\n  return TagByteSize(field_number) + 8\n\n\ndef BoolByteSize(field_number, b):\n  return TagByteSize(field_number) + 1\n\n\ndef EnumByteSize(field_number, enum):\n  return UInt32ByteSize(field_number, enum)\n\n\ndef StringByteSize(field_number, string):\n  return BytesByteSize(field_number, string.encode('utf-8'))\n\n\ndef BytesByteSize(field_number, b):\n  return (TagByteSize(field_number)\n          + _VarUInt64ByteSizeNoTag(len(b))\n          + len(b))\n\n\ndef GroupByteSize(field_number, message):\n  return (2 * TagByteSize(field_number)  # START and END group.\n          + message.ByteSize())\n\n\ndef MessageByteSize(field_number, message):\n  return (TagByteSize(field_number)\n          + _VarUInt64ByteSizeNoTag(message.ByteSize())\n          + message.ByteSize())\n\n\ndef MessageSetItemByteSize(field_number, msg):\n  # First compute the sizes of the tags.\n  # There are 2 tags for the beginning and ending of the repeated group, that\n  # is field number 1, one with field number 2 (type_id) and one with field\n  # number 3 (message).\n  total_size = (2 * TagByteSize(1) + TagByteSize(2) + TagByteSize(3))\n\n  # Add the number of bytes for type_id.\n  total_size += _VarUInt64ByteSizeNoTag(field_number)\n\n  message_size = msg.ByteSize()\n\n  # The number of bytes for encoding the length of the message.\n  total_size += _VarUInt64ByteSizeNoTag(message_size)\n\n  # The size of the message.\n  total_size += message_size\n  return total_size\n\n\ndef TagByteSize(field_number):\n  \"\"\"Returns the bytes required to serialize a tag with this field number.\"\"\"\n  # Just pass in type 0, since the type won't affect the tag+type size.\n  return _VarUInt64ByteSizeNoTag(PackTag(field_number, 0))\n\n\n# Private helper function for the *ByteSize() functions above.\n\ndef _VarUInt64ByteSizeNoTag(uint64):\n  \"\"\"Returns the number of bytes required to serialize a single varint\n  using boundary value comparisons. (unrolled loop optimization -WPierce)\n  uint64 must be unsigned.\n  \"\"\"\n  if uint64 <= 0x7f: return 1\n  if uint64 <= 0x3fff: return 2\n  if uint64 <= 0x1fffff: return 3\n  if uint64 <= 0xfffffff: return 4\n  if uint64 <= 0x7ffffffff: return 5\n  if uint64 <= 0x3ffffffffff: return 6\n  if uint64 <= 0x1ffffffffffff: return 7\n  if uint64 <= 0xffffffffffffff: return 8\n  if uint64 <= 0x7fffffffffffffff: return 9\n  if uint64 > UINT64_MAX:\n    raise message.EncodeError('Value out of range: %d' % uint64)\n  return 10\n\n\nNON_PACKABLE_TYPES = (\n  descriptor.FieldDescriptor.TYPE_STRING,\n  descriptor.FieldDescriptor.TYPE_GROUP,\n  descriptor.FieldDescriptor.TYPE_MESSAGE,\n  descriptor.FieldDescriptor.TYPE_BYTES\n)\n\n\ndef IsTypePackable(field_type):\n  \"\"\"Return true iff packable = true is valid for fields of this type.\n\n  Args:\n    field_type: a FieldDescriptor::Type value.\n\n  Returns:\n    True iff fields of this type are packable.\n  \"\"\"\n  return field_type not in NON_PACKABLE_TYPES\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format_test.py",
    "content": "#! /usr/bin/python\n#\n# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Test for google.protobuf.internal.wire_format.\"\"\"\n\n__author__ = 'robinson@google.com (Will Robinson)'\n\nimport unittest\nfrom google.protobuf import message\nfrom google.protobuf.internal import wire_format\n\n\nclass WireFormatTest(unittest.TestCase):\n\n  def testPackTag(self):\n    field_number = 0xabc\n    tag_type = 2\n    self.assertEqual((field_number << 3) | tag_type,\n                     wire_format.PackTag(field_number, tag_type))\n    PackTag = wire_format.PackTag\n    # Number too high.\n    self.assertRaises(message.EncodeError, PackTag, field_number, 6)\n    # Number too low.\n    self.assertRaises(message.EncodeError, PackTag, field_number, -1)\n\n  def testUnpackTag(self):\n    # Test field numbers that will require various varint sizes.\n    for expected_field_number in (1, 15, 16, 2047, 2048):\n      for expected_wire_type in range(6):  # Highest-numbered wiretype is 5.\n        field_number, wire_type = wire_format.UnpackTag(\n            wire_format.PackTag(expected_field_number, expected_wire_type))\n        self.assertEqual(expected_field_number, field_number)\n        self.assertEqual(expected_wire_type, wire_type)\n\n    self.assertRaises(TypeError, wire_format.UnpackTag, None)\n    self.assertRaises(TypeError, wire_format.UnpackTag, 'abc')\n    self.assertRaises(TypeError, wire_format.UnpackTag, 0.0)\n    self.assertRaises(TypeError, wire_format.UnpackTag, object())\n\n  def testZigZagEncode(self):\n    Z = wire_format.ZigZagEncode\n    self.assertEqual(0, Z(0))\n    self.assertEqual(1, Z(-1))\n    self.assertEqual(2, Z(1))\n    self.assertEqual(3, Z(-2))\n    self.assertEqual(4, Z(2))\n    self.assertEqual(0xfffffffe, Z(0x7fffffff))\n    self.assertEqual(0xffffffff, Z(-0x80000000))\n    self.assertEqual(0xfffffffffffffffe, Z(0x7fffffffffffffff))\n    self.assertEqual(0xffffffffffffffff, Z(-0x8000000000000000))\n\n    self.assertRaises(TypeError, Z, None)\n    self.assertRaises(TypeError, Z, 'abcd')\n    self.assertRaises(TypeError, Z, 0.0)\n    self.assertRaises(TypeError, Z, object())\n\n  def testZigZagDecode(self):\n    Z = wire_format.ZigZagDecode\n    self.assertEqual(0, Z(0))\n    self.assertEqual(-1, Z(1))\n    self.assertEqual(1, Z(2))\n    self.assertEqual(-2, Z(3))\n    self.assertEqual(2, Z(4))\n    self.assertEqual(0x7fffffff, Z(0xfffffffe))\n    self.assertEqual(-0x80000000, Z(0xffffffff))\n    self.assertEqual(0x7fffffffffffffff, Z(0xfffffffffffffffe))\n    self.assertEqual(-0x8000000000000000, Z(0xffffffffffffffff))\n\n    self.assertRaises(TypeError, Z, None)\n    self.assertRaises(TypeError, Z, 'abcd')\n    self.assertRaises(TypeError, Z, 0.0)\n    self.assertRaises(TypeError, Z, object())\n\n  def NumericByteSizeTestHelper(self, byte_size_fn, value, expected_value_size):\n    # Use field numbers that cause various byte sizes for the tag information.\n    for field_number, tag_bytes in ((15, 1), (16, 2), (2047, 2), (2048, 3)):\n      expected_size = expected_value_size + tag_bytes\n      actual_size = byte_size_fn(field_number, value)\n      self.assertEqual(expected_size, actual_size,\n                       'byte_size_fn: %s, field_number: %d, value: %r\\n'\n                       'Expected: %d, Actual: %d'% (\n          byte_size_fn, field_number, value, expected_size, actual_size))\n\n  def testByteSizeFunctions(self):\n    # Test all numeric *ByteSize() functions.\n    NUMERIC_ARGS = [\n        # Int32ByteSize().\n        [wire_format.Int32ByteSize, 0, 1],\n        [wire_format.Int32ByteSize, 127, 1],\n        [wire_format.Int32ByteSize, 128, 2],\n        [wire_format.Int32ByteSize, -1, 10],\n        # Int64ByteSize().\n        [wire_format.Int64ByteSize, 0, 1],\n        [wire_format.Int64ByteSize, 127, 1],\n        [wire_format.Int64ByteSize, 128, 2],\n        [wire_format.Int64ByteSize, -1, 10],\n        # UInt32ByteSize().\n        [wire_format.UInt32ByteSize, 0, 1],\n        [wire_format.UInt32ByteSize, 127, 1],\n        [wire_format.UInt32ByteSize, 128, 2],\n        [wire_format.UInt32ByteSize, wire_format.UINT32_MAX, 5],\n        # UInt64ByteSize().\n        [wire_format.UInt64ByteSize, 0, 1],\n        [wire_format.UInt64ByteSize, 127, 1],\n        [wire_format.UInt64ByteSize, 128, 2],\n        [wire_format.UInt64ByteSize, wire_format.UINT64_MAX, 10],\n        # SInt32ByteSize().\n        [wire_format.SInt32ByteSize, 0, 1],\n        [wire_format.SInt32ByteSize, -1, 1],\n        [wire_format.SInt32ByteSize, 1, 1],\n        [wire_format.SInt32ByteSize, -63, 1],\n        [wire_format.SInt32ByteSize, 63, 1],\n        [wire_format.SInt32ByteSize, -64, 1],\n        [wire_format.SInt32ByteSize, 64, 2],\n        # SInt64ByteSize().\n        [wire_format.SInt64ByteSize, 0, 1],\n        [wire_format.SInt64ByteSize, -1, 1],\n        [wire_format.SInt64ByteSize, 1, 1],\n        [wire_format.SInt64ByteSize, -63, 1],\n        [wire_format.SInt64ByteSize, 63, 1],\n        [wire_format.SInt64ByteSize, -64, 1],\n        [wire_format.SInt64ByteSize, 64, 2],\n        # Fixed32ByteSize().\n        [wire_format.Fixed32ByteSize, 0, 4],\n        [wire_format.Fixed32ByteSize, wire_format.UINT32_MAX, 4],\n        # Fixed64ByteSize().\n        [wire_format.Fixed64ByteSize, 0, 8],\n        [wire_format.Fixed64ByteSize, wire_format.UINT64_MAX, 8],\n        # SFixed32ByteSize().\n        [wire_format.SFixed32ByteSize, 0, 4],\n        [wire_format.SFixed32ByteSize, wire_format.INT32_MIN, 4],\n        [wire_format.SFixed32ByteSize, wire_format.INT32_MAX, 4],\n        # SFixed64ByteSize().\n        [wire_format.SFixed64ByteSize, 0, 8],\n        [wire_format.SFixed64ByteSize, wire_format.INT64_MIN, 8],\n        [wire_format.SFixed64ByteSize, wire_format.INT64_MAX, 8],\n        # FloatByteSize().\n        [wire_format.FloatByteSize, 0.0, 4],\n        [wire_format.FloatByteSize, 1000000000.0, 4],\n        [wire_format.FloatByteSize, -1000000000.0, 4],\n        # DoubleByteSize().\n        [wire_format.DoubleByteSize, 0.0, 8],\n        [wire_format.DoubleByteSize, 1000000000.0, 8],\n        [wire_format.DoubleByteSize, -1000000000.0, 8],\n        # BoolByteSize().\n        [wire_format.BoolByteSize, False, 1],\n        [wire_format.BoolByteSize, True, 1],\n        # EnumByteSize().\n        [wire_format.EnumByteSize, 0, 1],\n        [wire_format.EnumByteSize, 127, 1],\n        [wire_format.EnumByteSize, 128, 2],\n        [wire_format.EnumByteSize, wire_format.UINT32_MAX, 5],\n        ]\n    for args in NUMERIC_ARGS:\n      self.NumericByteSizeTestHelper(*args)\n\n    # Test strings and bytes.\n    for byte_size_fn in (wire_format.StringByteSize, wire_format.BytesByteSize):\n      # 1 byte for tag, 1 byte for length, 3 bytes for contents.\n      self.assertEqual(5, byte_size_fn(10, 'abc'))\n      # 2 bytes for tag, 1 byte for length, 3 bytes for contents.\n      self.assertEqual(6, byte_size_fn(16, 'abc'))\n      # 2 bytes for tag, 2 bytes for length, 128 bytes for contents.\n      self.assertEqual(132, byte_size_fn(16, 'a' * 128))\n\n    # Test UTF-8 string byte size calculation.\n    # 1 byte for tag, 1 byte for length, 8 bytes for content.\n    self.assertEqual(10, wire_format.StringByteSize(\n        5, unicode('\\xd0\\xa2\\xd0\\xb5\\xd1\\x81\\xd1\\x82', 'utf-8')))\n\n    class MockMessage(object):\n      def __init__(self, byte_size):\n        self.byte_size = byte_size\n      def ByteSize(self):\n        return self.byte_size\n\n    message_byte_size = 10\n    mock_message = MockMessage(byte_size=message_byte_size)\n    # Test groups.\n    # (2 * 1) bytes for begin and end tags, plus message_byte_size.\n    self.assertEqual(2 + message_byte_size,\n                     wire_format.GroupByteSize(1, mock_message))\n    # (2 * 2) bytes for begin and end tags, plus message_byte_size.\n    self.assertEqual(4 + message_byte_size,\n                     wire_format.GroupByteSize(16, mock_message))\n\n    # Test messages.\n    # 1 byte for tag, plus 1 byte for length, plus contents.\n    self.assertEqual(2 + mock_message.byte_size,\n                     wire_format.MessageByteSize(1, mock_message))\n    # 2 bytes for tag, plus 1 byte for length, plus contents.\n    self.assertEqual(3 + mock_message.byte_size,\n                     wire_format.MessageByteSize(16, mock_message))\n    # 2 bytes for tag, plus 2 bytes for length, plus contents.\n    mock_message.byte_size = 128\n    self.assertEqual(4 + mock_message.byte_size,\n                     wire_format.MessageByteSize(16, mock_message))\n\n\n    # Test message set item byte size.\n    # 4 bytes for tags, plus 1 byte for length, plus 1 byte for type_id,\n    # plus contents.\n    mock_message.byte_size = 10\n    self.assertEqual(mock_message.byte_size + 6,\n                     wire_format.MessageSetItemByteSize(1, mock_message))\n\n    # 4 bytes for tags, plus 2 bytes for length, plus 1 byte for type_id,\n    # plus contents.\n    mock_message.byte_size = 128\n    self.assertEqual(mock_message.byte_size + 7,\n                     wire_format.MessageSetItemByteSize(1, mock_message))\n\n    # 4 bytes for tags, plus 2 bytes for length, plus 2 byte for type_id,\n    # plus contents.\n    self.assertEqual(mock_message.byte_size + 8,\n                     wire_format.MessageSetItemByteSize(128, mock_message))\n\n    # Too-long varint.\n    self.assertRaises(message.EncodeError,\n                      wire_format.UInt64ByteSize, 1, 1 << 128)\n\n\nif __name__ == '__main__':\n  unittest.main()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/message.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# TODO(robinson): We should just make these methods all \"pure-virtual\" and move\n# all implementation out, into reflection.py for now.\n\n\n\"\"\"Contains an abstract base class for protocol messages.\"\"\"\n\n__author__ = 'robinson@google.com (Will Robinson)'\n\n\nclass Error(Exception): pass\nclass DecodeError(Error): pass\nclass EncodeError(Error): pass\n\n\nclass Message(object):\n\n  \"\"\"Abstract base class for protocol messages.\n\n  Protocol message classes are almost always generated by the protocol\n  compiler.  These generated types subclass Message and implement the methods\n  shown below.\n\n  TODO(robinson): Link to an HTML document here.\n\n  TODO(robinson): Document that instances of this class will also\n  have an Extensions attribute with __getitem__ and __setitem__.\n  Again, not sure how to best convey this.\n\n  TODO(robinson): Document that the class must also have a static\n    RegisterExtension(extension_field) method.\n    Not sure how to best express at this point.\n  \"\"\"\n\n  # TODO(robinson): Document these fields and methods.\n\n  __slots__ = []\n\n  DESCRIPTOR = None\n\n  def __deepcopy__(self, memo=None):\n    clone = type(self)()\n    clone.MergeFrom(self)\n    return clone\n\n  def __eq__(self, other_msg):\n    raise NotImplementedError\n\n  def __ne__(self, other_msg):\n    # Can't just say self != other_msg, since that would infinitely recurse. :)\n    return not self == other_msg\n\n  def __hash__(self):\n    raise TypeError('unhashable object')\n\n  def __str__(self):\n    raise NotImplementedError\n\n  def __unicode__(self):\n    raise NotImplementedError\n\n  def MergeFrom(self, other_msg):\n    \"\"\"Merges the contents of the specified message into current message.\n\n    This method merges the contents of the specified message into the current\n    message. Singular fields that are set in the specified message overwrite\n    the corresponding fields in the current message. Repeated fields are\n    appended. Singular sub-messages and groups are recursively merged.\n\n    Args:\n      other_msg: Message to merge into the current message.\n    \"\"\"\n    raise NotImplementedError\n\n  def CopyFrom(self, other_msg):\n    \"\"\"Copies the content of the specified message into the current message.\n\n    The method clears the current message and then merges the specified\n    message using MergeFrom.\n\n    Args:\n      other_msg: Message to copy into the current one.\n    \"\"\"\n    if self is other_msg:\n      return\n    self.Clear()\n    self.MergeFrom(other_msg)\n\n  def Clear(self):\n    \"\"\"Clears all data that was set in the message.\"\"\"\n    raise NotImplementedError\n\n  def SetInParent(self):\n    \"\"\"Mark this as present in the parent.\n\n    This normally happens automatically when you assign a field of a\n    sub-message, but sometimes you want to make the sub-message\n    present while keeping it empty.  If you find yourself using this,\n    you may want to reconsider your design.\"\"\"\n    raise NotImplementedError\n\n  def IsInitialized(self):\n    \"\"\"Checks if the message is initialized.\n\n    Returns:\n      The method returns True if the message is initialized (i.e. all of its\n      required fields are set).\n    \"\"\"\n    raise NotImplementedError\n\n  # TODO(robinson): MergeFromString() should probably return None and be\n  # implemented in terms of a helper that returns the # of bytes read.  Our\n  # deserialization routines would use the helper when recursively\n  # deserializing, but the end user would almost always just want the no-return\n  # MergeFromString().\n\n  def MergeFromString(self, serialized):\n    \"\"\"Merges serialized protocol buffer data into this message.\n\n    When we find a field in |serialized| that is already present\n    in this message:\n      - If it's a \"repeated\" field, we append to the end of our list.\n      - Else, if it's a scalar, we overwrite our field.\n      - Else, (it's a nonrepeated composite), we recursively merge\n        into the existing composite.\n\n    TODO(robinson): Document handling of unknown fields.\n\n    Args:\n      serialized: Any object that allows us to call buffer(serialized)\n        to access a string of bytes using the buffer interface.\n\n    TODO(robinson): When we switch to a helper, this will return None.\n\n    Returns:\n      The number of bytes read from |serialized|.\n      For non-group messages, this will always be len(serialized),\n      but for messages which are actually groups, this will\n      generally be less than len(serialized), since we must\n      stop when we reach an END_GROUP tag.  Note that if\n      we *do* stop because of an END_GROUP tag, the number\n      of bytes returned does not include the bytes\n      for the END_GROUP tag information.\n    \"\"\"\n    raise NotImplementedError\n\n  def ParseFromString(self, serialized):\n    \"\"\"Like MergeFromString(), except we clear the object first.\"\"\"\n    self.Clear()\n    self.MergeFromString(serialized)\n\n  def SerializeToString(self):\n    \"\"\"Serializes the protocol message to a binary string.\n\n    Returns:\n      A binary string representation of the message if all of the required\n      fields in the message are set (i.e. the message is initialized).\n\n    Raises:\n      message.EncodeError if the message isn't initialized.\n    \"\"\"\n    raise NotImplementedError\n\n  def SerializePartialToString(self):\n    \"\"\"Serializes the protocol message to a binary string.\n\n    This method is similar to SerializeToString but doesn't check if the\n    message is initialized.\n\n    Returns:\n      A string representation of the partial message.\n    \"\"\"\n    raise NotImplementedError\n\n  # TODO(robinson): Decide whether we like these better\n  # than auto-generated has_foo() and clear_foo() methods\n  # on the instances themselves.  This way is less consistent\n  # with C++, but it makes reflection-type access easier and\n  # reduces the number of magically autogenerated things.\n  #\n  # TODO(robinson): Be sure to document (and test) exactly\n  # which field names are accepted here.  Are we case-sensitive?\n  # What do we do with fields that share names with Python keywords\n  # like 'lambda' and 'yield'?\n  #\n  # nnorwitz says:\n  # \"\"\"\n  # Typically (in python), an underscore is appended to names that are\n  # keywords. So they would become lambda_ or yield_.\n  # \"\"\"\n  def ListFields(self):\n    \"\"\"Returns a list of (FieldDescriptor, value) tuples for all\n    fields in the message which are not empty.  A singular field is non-empty\n    if HasField() would return true, and a repeated field is non-empty if\n    it contains at least one element.  The fields are ordered by field\n    number\"\"\"\n    raise NotImplementedError\n\n  def HasField(self, field_name):\n    \"\"\"Checks if a certain field is set for the message. Note if the\n    field_name is not defined in the message descriptor, ValueError will be\n    raised.\"\"\"\n    raise NotImplementedError\n\n  def ClearField(self, field_name):\n    raise NotImplementedError\n\n  def HasExtension(self, extension_handle):\n    raise NotImplementedError\n\n  def ClearExtension(self, extension_handle):\n    raise NotImplementedError\n\n  def ByteSize(self):\n    \"\"\"Returns the serialized size of this message.\n    Recursively calls ByteSize() on all contained messages.\n    \"\"\"\n    raise NotImplementedError\n\n  def _SetListener(self, message_listener):\n    \"\"\"Internal method used by the protocol message implementation.\n    Clients should not call this directly.\n\n    Sets a listener that this message will call on certain state transitions.\n\n    The purpose of this method is to register back-edges from children to\n    parents at runtime, for the purpose of setting \"has\" bits and\n    byte-size-dirty bits in the parent and ancestor objects whenever a child or\n    descendant object is modified.\n\n    If the client wants to disconnect this Message from the object tree, she\n    explicitly sets callback to None.\n\n    If message_listener is None, unregisters any existing listener.  Otherwise,\n    message_listener must implement the MessageListener interface in\n    internal/message_listener.py, and we discard any listener registered\n    via a previous _SetListener() call.\n    \"\"\"\n    raise NotImplementedError\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python-proto2.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: petar@google.com (Petar Petrov)\n\n#include <Python.h>\n#include <map>\n#include <string>\n#include <vector>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/pyext/python_descriptor.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/dynamic_message.h>\n#include <google/protobuf/message.h>\n#include <google/protobuf/unknown_field_set.h>\n#include <google/protobuf/pyext/python_protobuf.h>\n\n/* Is 64bit */\n#define IS_64BIT (SIZEOF_LONG == 8)\n\n#define FIELD_BELONGS_TO_MESSAGE(field_descriptor, message) \\\n    ((message)->GetDescriptor() == (field_descriptor)->containing_type())\n\n#define FIELD_IS_REPEATED(field_descriptor)                 \\\n    ((field_descriptor)->label() == google::protobuf::FieldDescriptor::LABEL_REPEATED)\n\n#define GOOGLE_CHECK_GET_INT32(arg, value)                         \\\n    int32 value;                                            \\\n    if (!CheckAndGetInteger(arg, &value, kint32min_py, kint32max_py)) { \\\n      return NULL;                                          \\\n    }\n\n#define GOOGLE_CHECK_GET_INT64(arg, value)                         \\\n    int64 value;                                            \\\n    if (!CheckAndGetInteger(arg, &value, kint64min_py, kint64max_py)) { \\\n      return NULL;                                          \\\n    }\n\n#define GOOGLE_CHECK_GET_UINT32(arg, value)                        \\\n    uint32 value;                                           \\\n    if (!CheckAndGetInteger(arg, &value, kPythonZero, kuint32max_py)) { \\\n      return NULL;                                          \\\n    }\n\n#define GOOGLE_CHECK_GET_UINT64(arg, value)                        \\\n    uint64 value;                                           \\\n    if (!CheckAndGetInteger(arg, &value, kPythonZero, kuint64max_py)) { \\\n      return NULL;                                          \\\n    }\n\n#define GOOGLE_CHECK_GET_FLOAT(arg, value)                         \\\n    float value;                                            \\\n    if (!CheckAndGetFloat(arg, &value)) {                   \\\n      return NULL;                                          \\\n    }                                                       \\\n\n#define GOOGLE_CHECK_GET_DOUBLE(arg, value)                        \\\n    double value;                                           \\\n    if (!CheckAndGetDouble(arg, &value)) {                  \\\n      return NULL;                                          \\\n    }\n\n#define GOOGLE_CHECK_GET_BOOL(arg, value)                          \\\n    bool value;                                             \\\n    if (!CheckAndGetBool(arg, &value)) {                    \\\n      return NULL;                                          \\\n    }\n\n#define C(str) const_cast<char*>(str)\n\n// --- Globals:\n\n// Constants used for integer type range checking.\nstatic PyObject* kPythonZero;\nstatic PyObject* kint32min_py;\nstatic PyObject* kint32max_py;\nstatic PyObject* kuint32max_py;\nstatic PyObject* kint64min_py;\nstatic PyObject* kint64max_py;\nstatic PyObject* kuint64max_py;\n\nnamespace google {\nnamespace protobuf {\nnamespace python {\n\n// --- Support Routines:\n\nstatic void AddConstants(PyObject* module) {\n  struct NameValue {\n    char* name;\n    int32 value;\n  } constants[] = {\n    // Labels:\n    {\"LABEL_OPTIONAL\", google::protobuf::FieldDescriptor::LABEL_OPTIONAL},\n    {\"LABEL_REQUIRED\", google::protobuf::FieldDescriptor::LABEL_REQUIRED},\n    {\"LABEL_REPEATED\", google::protobuf::FieldDescriptor::LABEL_REPEATED},\n    // CPP types:\n    {\"CPPTYPE_MESSAGE\", google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE},\n    // Field Types:\n    {\"TYPE_MESSAGE\", google::protobuf::FieldDescriptor::TYPE_MESSAGE},\n    // End.\n    {NULL, 0}\n  };\n\n  for (NameValue* constant = constants;\n       constant->name != NULL; constant++) {\n    PyModule_AddIntConstant(module, constant->name, constant->value);\n  }\n}\n\n// --- CMessage Custom Type:\n\n// ------ Type Forward Declaration:\n\nstruct CMessage;\nstruct CMessage_Type;\n\nstatic void CMessageDealloc(CMessage* self);\nstatic int CMessageInit(CMessage* self, PyObject *args, PyObject *kwds);\nstatic PyObject* CMessageStr(CMessage* self);\n\nstatic PyObject* CMessage_AddMessage(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_AddRepeatedScalar(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_AssignRepeatedScalar(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_ByteSize(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_Clear(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_ClearField(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_ClearFieldByDescriptor(\n    CMessage* self, PyObject* args);\nstatic PyObject* CMessage_CopyFrom(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_DebugString(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_DeleteRepeatedField(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_Equals(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_FieldLength(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_FindInitializationErrors(CMessage* self);\nstatic PyObject* CMessage_GetRepeatedMessage(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_GetRepeatedScalar(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_GetScalar(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_HasField(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_HasFieldByDescriptor(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_IsInitialized(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_ListFields(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_MergeFrom(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_MergeFromString(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_MutableMessage(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_NewSubMessage(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_SetScalar(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_SerializePartialToString(\n    CMessage* self, PyObject* args);\nstatic PyObject* CMessage_SerializeToString(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_SetInParent(CMessage* self, PyObject* args);\nstatic PyObject* CMessage_SwapRepeatedFieldElements(\n    CMessage* self, PyObject* args);\n\n// ------ Object Definition:\n\ntypedef struct CMessage {\n  PyObject_HEAD\n\n  struct CMessage* parent;  // NULL if wasn't created from another message.\n  CFieldDescriptor* parent_field;\n  const char* full_name;\n  google::protobuf::Message* message;\n  bool free_message;\n  bool read_only;\n} CMessage;\n\n// ------ Method Table:\n\n#define CMETHOD(name, args, doc)   \\\n  { C(#name), (PyCFunction)CMessage_##name, args, C(doc) }\nstatic PyMethodDef CMessageMethods[] = {\n  CMETHOD(AddMessage, METH_O,\n          \"Adds a new message to a repeated composite field.\"),\n  CMETHOD(AddRepeatedScalar, METH_VARARGS,\n          \"Adds a scalar to a repeated scalar field.\"),\n  CMETHOD(AssignRepeatedScalar, METH_VARARGS,\n          \"Clears and sets the values of a repeated scalar field.\"),\n  CMETHOD(ByteSize, METH_NOARGS,\n          \"Returns the size of the message in bytes.\"),\n  CMETHOD(Clear, METH_NOARGS,\n          \"Clears a protocol message.\"),\n  CMETHOD(ClearField, METH_O,\n          \"Clears a protocol message field by name.\"),\n  CMETHOD(ClearFieldByDescriptor, METH_O,\n          \"Clears a protocol message field by descriptor.\"),\n  CMETHOD(CopyFrom, METH_O,\n          \"Copies a protocol message into the current message.\"),\n  CMETHOD(DebugString, METH_NOARGS,\n          \"Returns the debug string of a protocol message.\"),\n  CMETHOD(DeleteRepeatedField, METH_VARARGS,\n          \"Deletes a slice of values from a repeated field.\"),\n  CMETHOD(Equals, METH_O,\n          \"Checks if two protocol messages are equal (by identity).\"),\n  CMETHOD(FieldLength, METH_O,\n          \"Returns the number of elements in a repeated field.\"),\n  CMETHOD(FindInitializationErrors, METH_NOARGS,\n          \"Returns the initialization errors of a message.\"),\n  CMETHOD(GetRepeatedMessage, METH_VARARGS,\n          \"Returns a message from a repeated composite field.\"),\n  CMETHOD(GetRepeatedScalar, METH_VARARGS,\n          \"Returns a scalar value from a repeated scalar field.\"),\n  CMETHOD(GetScalar, METH_O,\n          \"Returns the scalar value of a field.\"),\n  CMETHOD(HasField, METH_O,\n          \"Checks if a message field is set.\"),\n  CMETHOD(HasFieldByDescriptor, METH_O,\n          \"Checks if a message field is set by given its descriptor\"),\n  CMETHOD(IsInitialized, METH_NOARGS,\n          \"Checks if all required fields of a protocol message are set.\"),\n  CMETHOD(ListFields, METH_NOARGS,\n          \"Lists all set fields of a message.\"),\n  CMETHOD(MergeFrom, METH_O,\n          \"Merges a protocol message into the current message.\"),\n  CMETHOD(MergeFromString, METH_O,\n          \"Merges a serialized message into the current message.\"),\n  CMETHOD(MutableMessage, METH_O,\n          \"Returns a new instance of a nested protocol message.\"),\n  CMETHOD(NewSubMessage, METH_O,\n          \"Creates and returns a python message given the descriptor of a \"\n          \"composite field of the current message.\"),\n  CMETHOD(SetScalar, METH_VARARGS,\n          \"Sets the value of a singular scalar field.\"),\n  CMETHOD(SerializePartialToString, METH_VARARGS,\n          \"Serializes the message to a string, even if it isn't initialized.\"),\n  CMETHOD(SerializeToString, METH_NOARGS,\n          \"Serializes the message to a string, only for initialized messages.\"),\n  CMETHOD(SetInParent, METH_NOARGS,\n          \"Sets the has bit of the given field in its parent message.\"),\n  CMETHOD(SwapRepeatedFieldElements, METH_VARARGS,\n          \"Swaps the elements in two positions in a repeated field.\"),\n  { NULL, NULL }\n};\n#undef CMETHOD\n\nstatic PyMemberDef CMessageMembers[] = {\n  { C(\"full_name\"), T_STRING, offsetof(CMessage, full_name), 0, \"Full name\" },\n  { NULL }\n};\n\n// ------ Type Definition:\n\n// The definition for the type object that captures the type of CMessage\n// in Python.\nPyTypeObject CMessage_Type = {\n  PyObject_HEAD_INIT(&PyType_Type)\n  0,\n  C(\"google3.net.google.protobuf.python.internal.\"\n    \"_net_proto2___python.\"\n    \"CMessage\"),                       // tp_name\n  sizeof(CMessage),                    //  tp_basicsize\n  0,                                   //  tp_itemsize\n  (destructor)CMessageDealloc,         //  tp_dealloc\n  0,                                   //  tp_print\n  0,                                   //  tp_getattr\n  0,                                   //  tp_setattr\n  0,                                   //  tp_compare\n  0,                                   //  tp_repr\n  0,                                   //  tp_as_number\n  0,                                   //  tp_as_sequence\n  0,                                   //  tp_as_mapping\n  0,                                   //  tp_hash\n  0,                                   //  tp_call\n  (reprfunc)CMessageStr,               //  tp_str\n  0,                                   //  tp_getattro\n  0,                                   //  tp_setattro\n  0,                                   //  tp_as_buffer\n  Py_TPFLAGS_DEFAULT,                  //  tp_flags\n  C(\"A ProtocolMessage\"),              //  tp_doc\n  0,                                   //  tp_traverse\n  0,                                   //  tp_clear\n  0,                                   //  tp_richcompare\n  0,                                   //  tp_weaklistoffset\n  0,                                   //  tp_iter\n  0,                                   //  tp_iternext\n  CMessageMethods,                     //  tp_methods\n  CMessageMembers,                     //  tp_members\n  0,                                   //  tp_getset\n  0,                                   //  tp_base\n  0,                                   //  tp_dict\n  0,                                   //  tp_descr_get\n  0,                                   //  tp_descr_set\n  0,                                   //  tp_dictoffset\n  (initproc)CMessageInit,              //  tp_init\n  PyType_GenericAlloc,                 //  tp_alloc\n  PyType_GenericNew,                   //  tp_new\n  PyObject_Del,                        //  tp_free\n};\n\n// ------ Helper Functions:\n\nstatic void FormatTypeError(PyObject* arg, char* expected_types) {\n  PyObject* s = PyObject_Str(PyObject_Type(arg));\n  PyObject* repr = PyObject_Repr(PyObject_Type(arg));\n  PyErr_Format(PyExc_TypeError,\n               \"%.100s has type %.100s, but expected one of: %s\",\n               PyString_AS_STRING(repr),\n               PyString_AS_STRING(s),\n               expected_types);\n  Py_DECREF(s);\n  Py_DECREF(repr);\n}\n\ntemplate <class T>\nstatic bool CheckAndGetInteger(\n    PyObject* arg, T* value, PyObject* min, PyObject* max) {\n  bool is_long = PyLong_Check(arg);\n  if (!PyInt_Check(arg) && !is_long) {\n    FormatTypeError(arg, \"int, long\");\n    return false;\n  }\n\n  if (PyObject_Compare(min, arg) > 0 || PyObject_Compare(max, arg) < 0) {\n    PyObject* s = PyObject_Str(arg);\n    PyErr_Format(PyExc_ValueError,\n                 \"Value out of range: %s\",\n                 PyString_AS_STRING(s));\n    Py_DECREF(s);\n    return false;\n  }\n  if (is_long) {\n    if (min == kPythonZero) {\n      *value = static_cast<T>(PyLong_AsUnsignedLongLong(arg));\n    } else {\n      *value = static_cast<T>(PyLong_AsLongLong(arg));\n    }\n  } else {\n    *value = static_cast<T>(PyInt_AsLong(arg));\n  }\n  return true;\n}\n\nstatic bool CheckAndGetDouble(PyObject* arg, double* value) {\n  if (!PyInt_Check(arg) && !PyLong_Check(arg) &&\n      !PyFloat_Check(arg)) {\n    FormatTypeError(arg, \"int, long, float\");\n    return false;\n  }\n  *value = PyFloat_AsDouble(arg);\n  return true;\n}\n\nstatic bool CheckAndGetFloat(PyObject* arg, float* value) {\n  double double_value;\n  if (!CheckAndGetDouble(arg, &double_value)) {\n    return false;\n  }\n  *value = static_cast<float>(double_value);\n  return true;\n}\n\nstatic bool CheckAndGetBool(PyObject* arg, bool* value) {\n  if (!PyInt_Check(arg) && !PyBool_Check(arg) && !PyLong_Check(arg)) {\n    FormatTypeError(arg, \"int, long, bool\");\n    return false;\n  }\n  *value = static_cast<bool>(PyInt_AsLong(arg));\n  return true;\n}\n\ngoogle::protobuf::DynamicMessageFactory* global_message_factory = NULL;\nstatic const google::protobuf::Message* CreateMessage(const char* message_type) {\n  string message_name(message_type);\n  const google::protobuf::Descriptor* descriptor =\n      GetDescriptorPool()->FindMessageTypeByName(message_name);\n  if (descriptor == NULL) {\n    return NULL;\n  }\n  return global_message_factory->GetPrototype(descriptor);\n}\n\nstatic bool CheckAndSetString(\n    PyObject* arg, google::protobuf::Message* message,\n    const google::protobuf::FieldDescriptor* descriptor,\n    const google::protobuf::Reflection* reflection,\n    bool append,\n    int index) {\n  GOOGLE_DCHECK(descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING ||\n         descriptor->type() == google::protobuf::FieldDescriptor::TYPE_BYTES);\n  if (descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING) {\n    if (!PyString_Check(arg) && !PyUnicode_Check(arg)) {\n      FormatTypeError(arg, \"str, unicode\");\n      return false;\n    }\n\n    if (PyString_Check(arg)) {\n      PyObject* unicode = PyUnicode_FromEncodedObject(arg, \"ascii\", NULL);\n      if (unicode == NULL) {\n        PyObject* repr = PyObject_Repr(arg);\n        PyErr_Format(PyExc_ValueError,\n                     \"%s has type str, but isn't in 7-bit ASCII \"\n                     \"encoding. Non-ASCII strings must be converted to \"\n                     \"unicode objects before being added.\",\n                     PyString_AS_STRING(repr));\n        Py_DECREF(repr);\n        return false;\n      } else {\n        Py_DECREF(unicode);\n      }\n    }\n  } else if (!PyString_Check(arg)) {\n    FormatTypeError(arg, \"str\");\n    return false;\n  }\n\n  PyObject* encoded_string = NULL;\n  if (descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING) {\n    if (PyString_Check(arg)) {\n      encoded_string = PyString_AsEncodedObject(arg, \"utf-8\", NULL);\n    } else {\n      encoded_string = PyUnicode_AsEncodedObject(arg, \"utf-8\", NULL);\n    }\n  } else {\n    // In this case field type is \"bytes\".\n    encoded_string = arg;\n    Py_INCREF(encoded_string);\n  }\n\n  if (encoded_string == NULL) {\n    return false;\n  }\n\n  char* value;\n  Py_ssize_t value_len;\n  if (PyString_AsStringAndSize(encoded_string, &value, &value_len) < 0) {\n    Py_DECREF(encoded_string);\n    return false;\n  }\n\n  string value_string(value, value_len);\n  if (append) {\n    reflection->AddString(message, descriptor, value_string);\n  } else if (index < 0) {\n    reflection->SetString(message, descriptor, value_string);\n  } else {\n    reflection->SetRepeatedString(message, descriptor, index, value_string);\n  }\n  Py_DECREF(encoded_string);\n  return true;\n}\n\nstatic PyObject* ToStringObject(\n    const google::protobuf::FieldDescriptor* descriptor, string value) {\n  if (descriptor->type() != google::protobuf::FieldDescriptor::TYPE_STRING) {\n    return PyString_FromStringAndSize(value.c_str(), value.length());\n  }\n\n  PyObject* result = PyUnicode_DecodeUTF8(value.c_str(), value.length(), NULL);\n  // If the string can't be decoded in UTF-8, just return a string object that\n  // contains the raw bytes. This can't happen if the value was assigned using\n  // the members of the Python message object, but can happen if the values were\n  // parsed from the wire (binary).\n  if (result == NULL) {\n    PyErr_Clear();\n    result = PyString_FromStringAndSize(value.c_str(), value.length());\n  }\n  return result;\n}\n\nstatic void AssureWritable(CMessage* self) {\n  if (self == NULL ||\n      self->parent == NULL ||\n      self->parent_field == NULL) {\n    return;\n  }\n\n  if (!self->read_only) {\n    return;\n  }\n\n  AssureWritable(self->parent);\n\n  google::protobuf::Message* message = self->parent->message;\n  const google::protobuf::Reflection* reflection = message->GetReflection();\n  self->message = reflection->MutableMessage(\n      message, self->parent_field->descriptor, global_message_factory);\n  self->read_only = false;\n  self->parent = NULL;\n  self->parent_field = NULL;\n}\n\nstatic PyObject* InternalGetScalar(\n    google::protobuf::Message* message,\n    const google::protobuf::FieldDescriptor* field_descriptor) {\n  const google::protobuf::Reflection* reflection = message->GetReflection();\n\n  if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) {\n    PyErr_SetString(\n        PyExc_KeyError, \"Field does not belong to message!\");\n    return NULL;\n  }\n\n  PyObject* result = NULL;\n  switch (field_descriptor->cpp_type()) {\n    case google::protobuf::FieldDescriptor::CPPTYPE_INT32: {\n      int32 value = reflection->GetInt32(*message, field_descriptor);\n      result = PyInt_FromLong(value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_INT64: {\n      int64 value = reflection->GetInt64(*message, field_descriptor);\n#if IS_64BIT\n      result = PyInt_FromLong(value);\n#else\n      result = PyLong_FromLongLong(value);\n#endif\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: {\n      uint32 value = reflection->GetUInt32(*message, field_descriptor);\n#if IS_64BIT\n      result = PyInt_FromLong(value);\n#else\n      result = PyLong_FromLongLong(value);\n#endif\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: {\n      uint64 value = reflection->GetUInt64(*message, field_descriptor);\n#if IS_64BIT\n      if (value <= static_cast<uint64>(kint64max)) {\n        result = PyInt_FromLong(static_cast<uint64>(value));\n      }\n#else\n      if (value <= static_cast<uint32>(kint32max)) {\n        result = PyInt_FromLong(static_cast<uint32>(value));\n      }\n#endif\n      else {  // NOLINT\n        result = PyLong_FromUnsignedLongLong(value);\n      }\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: {\n      float value = reflection->GetFloat(*message, field_descriptor);\n      result = PyFloat_FromDouble(value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: {\n      double value = reflection->GetDouble(*message, field_descriptor);\n      result = PyFloat_FromDouble(value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: {\n      bool value = reflection->GetBool(*message, field_descriptor);\n      result = PyBool_FromLong(value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_STRING: {\n      string value = reflection->GetString(*message, field_descriptor);\n      result = ToStringObject(field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: {\n      if (!message->GetReflection()->HasField(*message, field_descriptor)) {\n        // Look for the value in the unknown fields.\n        google::protobuf::UnknownFieldSet* unknown_field_set =\n            message->GetReflection()->MutableUnknownFields(message);\n        for (int i = 0; i < unknown_field_set->field_count(); ++i) {\n          if (unknown_field_set->field(i).number() ==\n              field_descriptor->number()) {\n            result = PyInt_FromLong(unknown_field_set->field(i).varint());\n            break;\n          }\n        }\n      }\n\n      if (result == NULL) {\n        const google::protobuf::EnumValueDescriptor* enum_value =\n            message->GetReflection()->GetEnum(*message, field_descriptor);\n        result = PyInt_FromLong(enum_value->number());\n      }\n      break;\n    }\n    default:\n      PyErr_Format(\n          PyExc_SystemError, \"Getting a value from a field of unknown type %d\",\n          field_descriptor->cpp_type());\n  }\n\n  return result;\n}\n\nstatic PyObject* InternalSetScalar(\n    google::protobuf::Message* message, const google::protobuf::FieldDescriptor* field_descriptor,\n    PyObject* arg) {\n  const google::protobuf::Reflection* reflection = message->GetReflection();\n\n  if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) {\n    PyErr_SetString(\n        PyExc_KeyError, \"Field does not belong to message!\");\n    return NULL;\n  }\n\n  switch (field_descriptor->cpp_type()) {\n    case google::protobuf::FieldDescriptor::CPPTYPE_INT32: {\n      GOOGLE_CHECK_GET_INT32(arg, value);\n      reflection->SetInt32(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_INT64: {\n      GOOGLE_CHECK_GET_INT64(arg, value);\n      reflection->SetInt64(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: {\n      GOOGLE_CHECK_GET_UINT32(arg, value);\n      reflection->SetUInt32(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: {\n      GOOGLE_CHECK_GET_UINT64(arg, value);\n      reflection->SetUInt64(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: {\n      GOOGLE_CHECK_GET_FLOAT(arg, value);\n      reflection->SetFloat(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: {\n      GOOGLE_CHECK_GET_DOUBLE(arg, value);\n      reflection->SetDouble(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: {\n      GOOGLE_CHECK_GET_BOOL(arg, value);\n      reflection->SetBool(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_STRING: {\n      if (!CheckAndSetString(\n          arg, message, field_descriptor, reflection, false, -1)) {\n        return NULL;\n      }\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: {\n      GOOGLE_CHECK_GET_INT32(arg, value);\n      const google::protobuf::EnumDescriptor* enum_descriptor =\n          field_descriptor->enum_type();\n      const google::protobuf::EnumValueDescriptor* enum_value =\n          enum_descriptor->FindValueByNumber(value);\n      if (enum_value != NULL) {\n        reflection->SetEnum(message, field_descriptor, enum_value);\n      } else {\n        bool added = false;\n        // Add the value to the unknown fields.\n        google::protobuf::UnknownFieldSet* unknown_field_set =\n            message->GetReflection()->MutableUnknownFields(message);\n        for (int i = 0; i < unknown_field_set->field_count(); ++i) {\n          if (unknown_field_set->field(i).number() ==\n              field_descriptor->number()) {\n            unknown_field_set->mutable_field(i)->set_varint(value);\n            added = true;\n            break;\n          }\n        }\n\n        if (!added) {\n          unknown_field_set->AddVarint(field_descriptor->number(), value);\n        }\n        reflection->ClearField(message, field_descriptor);\n      }\n      break;\n    }\n    default:\n      PyErr_Format(\n          PyExc_SystemError, \"Setting value to a field of unknown type %d\",\n          field_descriptor->cpp_type());\n  }\n\n  Py_RETURN_NONE;\n}\n\nstatic PyObject* InternalAddRepeatedScalar(\n    google::protobuf::Message* message, const google::protobuf::FieldDescriptor* field_descriptor,\n    PyObject* arg) {\n\n  if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) {\n    PyErr_SetString(\n        PyExc_KeyError, \"Field does not belong to message!\");\n    return NULL;\n  }\n\n  const google::protobuf::Reflection* reflection = message->GetReflection();\n  switch (field_descriptor->cpp_type()) {\n    case google::protobuf::FieldDescriptor::CPPTYPE_INT32: {\n      GOOGLE_CHECK_GET_INT32(arg, value);\n      reflection->AddInt32(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_INT64: {\n      GOOGLE_CHECK_GET_INT64(arg, value);\n      reflection->AddInt64(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: {\n      GOOGLE_CHECK_GET_UINT32(arg, value);\n      reflection->AddUInt32(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: {\n      GOOGLE_CHECK_GET_UINT64(arg, value);\n      reflection->AddUInt64(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: {\n      GOOGLE_CHECK_GET_FLOAT(arg, value);\n      reflection->AddFloat(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: {\n      GOOGLE_CHECK_GET_DOUBLE(arg, value);\n      reflection->AddDouble(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: {\n      GOOGLE_CHECK_GET_BOOL(arg, value);\n      reflection->AddBool(message, field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_STRING: {\n      if (!CheckAndSetString(\n          arg, message, field_descriptor, reflection, true, -1)) {\n        return NULL;\n      }\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: {\n      GOOGLE_CHECK_GET_INT32(arg, value);\n      const google::protobuf::EnumDescriptor* enum_descriptor =\n          field_descriptor->enum_type();\n      const google::protobuf::EnumValueDescriptor* enum_value =\n          enum_descriptor->FindValueByNumber(value);\n      if (enum_value != NULL) {\n        reflection->AddEnum(message, field_descriptor, enum_value);\n      } else {\n        PyObject* s = PyObject_Str(arg);\n        PyErr_Format(PyExc_ValueError, \"Unknown enum value: %s\",\n                     PyString_AS_STRING(s));\n        Py_DECREF(s);\n        return NULL;\n      }\n      break;\n    }\n    default:\n      PyErr_Format(\n          PyExc_SystemError, \"Adding value to a field of unknown type %d\",\n          field_descriptor->cpp_type());\n  }\n\n  Py_RETURN_NONE;\n}\n\nstatic PyObject* InternalGetRepeatedScalar(\n    CMessage* cmessage, const google::protobuf::FieldDescriptor* field_descriptor,\n    int index) {\n  google::protobuf::Message* message = cmessage->message;\n  const google::protobuf::Reflection* reflection = message->GetReflection();\n\n  int field_size = reflection->FieldSize(*message, field_descriptor);\n  if (index < 0) {\n    index = field_size + index;\n  }\n  if (index < 0 || index >= field_size) {\n    PyErr_Format(PyExc_IndexError,\n                 \"list assignment index (%d) out of range\", index);\n    return NULL;\n  }\n\n  PyObject* result = NULL;\n  switch (field_descriptor->cpp_type()) {\n    case google::protobuf::FieldDescriptor::CPPTYPE_INT32: {\n      int32 value = reflection->GetRepeatedInt32(\n          *message, field_descriptor, index);\n      result = PyInt_FromLong(value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_INT64: {\n      int64 value = reflection->GetRepeatedInt64(\n          *message, field_descriptor, index);\n      result = PyLong_FromLongLong(value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: {\n      uint32 value = reflection->GetRepeatedUInt32(\n          *message, field_descriptor, index);\n      result = PyLong_FromLongLong(value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: {\n      uint64 value = reflection->GetRepeatedUInt64(\n          *message, field_descriptor, index);\n      result = PyLong_FromUnsignedLongLong(value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: {\n      float value = reflection->GetRepeatedFloat(\n          *message, field_descriptor, index);\n      result = PyFloat_FromDouble(value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: {\n      double value = reflection->GetRepeatedDouble(\n          *message, field_descriptor, index);\n      result = PyFloat_FromDouble(value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: {\n      bool value = reflection->GetRepeatedBool(\n          *message, field_descriptor, index);\n      result = PyBool_FromLong(value ? 1 : 0);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: {\n      const google::protobuf::EnumValueDescriptor* enum_value =\n          message->GetReflection()->GetRepeatedEnum(\n              *message, field_descriptor, index);\n      result = PyInt_FromLong(enum_value->number());\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_STRING: {\n      string value = reflection->GetRepeatedString(\n          *message, field_descriptor, index);\n      result = ToStringObject(field_descriptor, value);\n      break;\n    }\n    case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: {\n      CMessage* py_cmsg = PyObject_New(CMessage, &CMessage_Type);\n      if (py_cmsg == NULL) {\n        return NULL;\n      }\n      const google::protobuf::Message& msg = reflection->GetRepeatedMessage(\n          *message, field_descriptor, index);\n      py_cmsg->parent = cmessage;\n      py_cmsg->full_name = field_descriptor->full_name().c_str();\n      py_cmsg->message = const_cast<google::protobuf::Message*>(&msg);\n      py_cmsg->free_message = false;\n      py_cmsg->read_only = false;\n      result = reinterpret_cast<PyObject*>(py_cmsg);\n      break;\n    }\n    default:\n      PyErr_Format(\n          PyExc_SystemError,\n          \"Getting value from a repeated field of unknown type %d\",\n          field_descriptor->cpp_type());\n  }\n\n  return result;\n}\n\nstatic PyObject* InternalGetRepeatedScalarSlice(\n    CMessage* cmessage, const google::protobuf::FieldDescriptor* field_descriptor,\n    PyObject* slice) {\n  Py_ssize_t from;\n  Py_ssize_t to;\n  Py_ssize_t step;\n  Py_ssize_t length;\n  bool return_list = false;\n  google::protobuf::Message* message = cmessage->message;\n\n  if (PyInt_Check(slice)) {\n    from = to = PyInt_AsLong(slice);\n  } else if (PyLong_Check(slice)) {\n    from = to = PyLong_AsLong(slice);\n  } else if (PySlice_Check(slice)) {\n    const google::protobuf::Reflection* reflection = message->GetReflection();\n    length = reflection->FieldSize(*message, field_descriptor);\n    PySlice_GetIndices(\n        reinterpret_cast<PySliceObject*>(slice), length, &from, &to, &step);\n    return_list = true;\n  } else {\n    PyErr_SetString(PyExc_TypeError, \"list indices must be integers\");\n    return NULL;\n  }\n\n  if (!return_list) {\n    return InternalGetRepeatedScalar(cmessage, field_descriptor, from);\n  }\n\n  PyObject* list = PyList_New(0);\n  if (list == NULL) {\n    return NULL;\n  }\n\n  if (from <= to) {\n    if (step < 0) return list;\n    for (Py_ssize_t index = from; index < to; index += step) {\n      if (index < 0 || index >= length) break;\n      PyObject* s = InternalGetRepeatedScalar(\n          cmessage, field_descriptor, index);\n      PyList_Append(list, s);\n      Py_DECREF(s);\n    }\n  } else {\n    if (step > 0) return list;\n    for (Py_ssize_t index = from; index > to; index += step) {\n      if (index < 0 || index >= length) break;\n      PyObject* s = InternalGetRepeatedScalar(\n          cmessage, field_descriptor, index);\n      PyList_Append(list, s);\n      Py_DECREF(s);\n    }\n  }\n  return list;\n}\n\n// ------ C Constructor/Destructor:\n\nstatic int CMessageInit(CMessage* self, PyObject *args, PyObject *kwds) {\n  self->message = NULL;\n  return 0;\n}\n\nstatic void CMessageDealloc(CMessage* self) {\n  if (self->free_message) {\n    if (self->read_only) {\n      PyErr_WriteUnraisable(reinterpret_cast<PyObject*>(self));\n    }\n    delete self->message;\n  }\n  self->ob_type->tp_free(reinterpret_cast<PyObject*>(self));\n}\n\n// ------ Methods:\n\nstatic PyObject* CMessage_Clear(CMessage* self, PyObject* args) {\n  AssureWritable(self);\n  self->message->Clear();\n  Py_RETURN_NONE;\n}\n\nstatic PyObject* CMessage_IsInitialized(CMessage* self, PyObject* args) {\n  return PyBool_FromLong(self->message->IsInitialized() ? 1 : 0);\n}\n\nstatic PyObject* CMessage_HasField(CMessage* self, PyObject* arg) {\n  char* field_name;\n  if (PyString_AsStringAndSize(arg, &field_name, NULL) < 0) {\n    return NULL;\n  }\n\n  google::protobuf::Message* message = self->message;\n  const google::protobuf::Descriptor* descriptor = message->GetDescriptor();\n  const google::protobuf::FieldDescriptor* field_descriptor =\n      descriptor->FindFieldByName(field_name);\n  if (field_descriptor == NULL) {\n    PyErr_Format(PyExc_ValueError, \"Unknown field %s.\", field_name);\n    return NULL;\n  }\n\n  bool has_field =\n      message->GetReflection()->HasField(*message, field_descriptor);\n  return PyBool_FromLong(has_field ? 1 : 0);\n}\n\nstatic PyObject* CMessage_HasFieldByDescriptor(CMessage* self, PyObject* arg) {\n  CFieldDescriptor* cfield_descriptor = NULL;\n  if (!PyObject_TypeCheck(reinterpret_cast<PyObject *>(arg),\n                          &CFieldDescriptor_Type)) {\n    PyErr_SetString(PyExc_TypeError, \"Must be a field descriptor\");\n    return NULL;\n  }\n  cfield_descriptor = reinterpret_cast<CFieldDescriptor*>(arg);\n\n  google::protobuf::Message* message = self->message;\n  const google::protobuf::FieldDescriptor* field_descriptor =\n      cfield_descriptor->descriptor;\n\n  if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) {\n    PyErr_SetString(PyExc_KeyError,\n                    \"Field does not belong to message!\");\n    return NULL;\n  }\n\n  if (FIELD_IS_REPEATED(field_descriptor)) {\n    PyErr_SetString(PyExc_KeyError,\n                    \"Field is repeated. A singular method is required.\");\n    return NULL;\n  }\n\n  bool has_field =\n      message->GetReflection()->HasField(*message, field_descriptor);\n  return PyBool_FromLong(has_field ? 1 : 0);\n}\n\nstatic PyObject* CMessage_ClearFieldByDescriptor(\n    CMessage* self, PyObject* arg) {\n  CFieldDescriptor* cfield_descriptor = NULL;\n  if (!PyObject_TypeCheck(reinterpret_cast<PyObject *>(arg),\n                          &CFieldDescriptor_Type)) {\n    PyErr_SetString(PyExc_TypeError, \"Must be a field descriptor\");\n    return NULL;\n  }\n  cfield_descriptor = reinterpret_cast<CFieldDescriptor*>(arg);\n\n  google::protobuf::Message* message = self->message;\n  const google::protobuf::FieldDescriptor* field_descriptor =\n      cfield_descriptor->descriptor;\n\n  if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) {\n    PyErr_SetString(PyExc_KeyError,\n                    \"Field does not belong to message!\");\n    return NULL;\n  }\n\n  message->GetReflection()->ClearField(message, field_descriptor);\n  Py_RETURN_NONE;\n}\n\nstatic PyObject* CMessage_ClearField(CMessage* self, PyObject* arg) {\n  char* field_name;\n  if (PyString_AsStringAndSize(arg, &field_name, NULL) < 0) {\n    return NULL;\n  }\n\n  google::protobuf::Message* message = self->message;\n  const google::protobuf::Descriptor* descriptor = message->GetDescriptor();\n  const google::protobuf::FieldDescriptor* field_descriptor =\n      descriptor->FindFieldByName(field_name);\n  if (field_descriptor == NULL) {\n    PyErr_Format(PyExc_ValueError, \"Unknown field %s.\", field_name);\n    return NULL;\n  }\n\n  message->GetReflection()->ClearField(message, field_descriptor);\n  Py_RETURN_NONE;\n}\n\nstatic PyObject* CMessage_GetScalar(CMessage* self, PyObject* arg) {\n  CFieldDescriptor* cdescriptor = NULL;\n  if (!PyObject_TypeCheck(reinterpret_cast<PyObject *>(arg),\n                          &CFieldDescriptor_Type)) {\n    PyErr_SetString(PyExc_TypeError, \"Must be a field descriptor\");\n    return NULL;\n  }\n  cdescriptor = reinterpret_cast<CFieldDescriptor*>(arg);\n\n  google::protobuf::Message* message = self->message;\n  return InternalGetScalar(message, cdescriptor->descriptor);\n}\n\nstatic PyObject* CMessage_GetRepeatedScalar(CMessage* self, PyObject* args) {\n  CFieldDescriptor* cfield_descriptor;\n  PyObject* slice;\n  if (!PyArg_ParseTuple(args, C(\"O!O:GetRepeatedScalar\"),\n                        &CFieldDescriptor_Type, &cfield_descriptor, &slice)) {\n    return NULL;\n  }\n\n  return InternalGetRepeatedScalarSlice(\n      self, cfield_descriptor->descriptor, slice);\n}\n\nstatic PyObject* CMessage_AssignRepeatedScalar(CMessage* self, PyObject* args) {\n  CFieldDescriptor* cfield_descriptor;\n  PyObject* slice;\n  if (!PyArg_ParseTuple(args, C(\"O!O:AssignRepeatedScalar\"),\n                        &CFieldDescriptor_Type, &cfield_descriptor, &slice)) {\n    return NULL;\n  }\n\n  AssureWritable(self);\n  google::protobuf::Message* message = self->message;\n  message->GetReflection()->ClearField(message, cfield_descriptor->descriptor);\n\n  PyObject* iter = PyObject_GetIter(slice);\n  PyObject* next;\n  while ((next = PyIter_Next(iter)) != NULL) {\n    if (InternalAddRepeatedScalar(\n            message, cfield_descriptor->descriptor, next) == NULL) {\n      Py_DECREF(next);\n      Py_DECREF(iter);\n      return NULL;\n    }\n    Py_DECREF(next);\n  }\n  Py_DECREF(iter);\n  Py_RETURN_NONE;\n}\n\nstatic PyObject* CMessage_DeleteRepeatedField(CMessage* self, PyObject* args) {\n  CFieldDescriptor* cfield_descriptor;\n  PyObject* slice;\n  if (!PyArg_ParseTuple(args, C(\"O!O:DeleteRepeatedField\"),\n                        &CFieldDescriptor_Type, &cfield_descriptor, &slice)) {\n    return NULL;\n  }\n  AssureWritable(self);\n\n  Py_ssize_t length, from, to, step, slice_length;\n  google::protobuf::Message* message = self->message;\n  const google::protobuf::FieldDescriptor* field_descriptor =\n      cfield_descriptor->descriptor;\n  const google::protobuf::Reflection* reflection = message->GetReflection();\n  int min, max;\n  length = reflection->FieldSize(*message, field_descriptor);\n\n  if (PyInt_Check(slice) || PyLong_Check(slice)) {\n    from = to = PyLong_AsLong(slice);\n    if (from < 0) {\n      from = to = length + from;\n    }\n    step = 1;\n    min = max = from;\n\n    // Range check.\n    if (from < 0 || from >= length) {\n      PyErr_Format(PyExc_IndexError, \"list assignment index out of range\");\n      return NULL;\n    }\n  } else if (PySlice_Check(slice)) {\n    from = to = step = slice_length = 0;\n    PySlice_GetIndicesEx(\n        reinterpret_cast<PySliceObject*>(slice),\n        length, &from, &to, &step, &slice_length);\n    if (from < to) {\n      min = from;\n      max = to - 1;\n    } else {\n      min = to + 1;\n      max = from;\n    }\n  } else {\n    PyErr_SetString(PyExc_TypeError, \"list indices must be integers\");\n    return NULL;\n  }\n\n  Py_ssize_t i = from;\n  std::vector<bool> to_delete(length, false);\n  while (i >= min && i <= max) {\n    to_delete[i] = true;\n    i += step;\n  }\n\n  to = 0;\n  for (i = 0; i < length; ++i) {\n    if (!to_delete[i]) {\n      if (i != to) {\n        reflection->SwapElements(message, field_descriptor, i, to);\n      }\n      ++to;\n    }\n  }\n\n  while (i > to) {\n    reflection->RemoveLast(message, field_descriptor);\n    --i;\n  }\n\n  Py_RETURN_NONE;\n}\n\n\nstatic PyObject* CMessage_SetScalar(CMessage* self, PyObject* args) {\n  CFieldDescriptor* cfield_descriptor;\n  PyObject* arg;\n  if (!PyArg_ParseTuple(args, C(\"O!O:SetScalar\"),\n                        &CFieldDescriptor_Type, &cfield_descriptor, &arg)) {\n    return NULL;\n  }\n  AssureWritable(self);\n\n  return InternalSetScalar(self->message, cfield_descriptor->descriptor, arg);\n}\n\nstatic PyObject* CMessage_AddRepeatedScalar(CMessage* self, PyObject* args) {\n  CFieldDescriptor* cfield_descriptor;\n  PyObject* value;\n  if (!PyArg_ParseTuple(args, C(\"O!O:AddRepeatedScalar\"),\n                        &CFieldDescriptor_Type, &cfield_descriptor, &value)) {\n    return NULL;\n  }\n  AssureWritable(self);\n\n  return InternalAddRepeatedScalar(\n      self->message, cfield_descriptor->descriptor, value);\n}\n\nstatic PyObject* CMessage_FieldLength(CMessage* self, PyObject* arg) {\n  CFieldDescriptor* cfield_descriptor;\n  if (!PyObject_TypeCheck(reinterpret_cast<PyObject *>(arg),\n                          &CFieldDescriptor_Type)) {\n    PyErr_SetString(PyExc_TypeError, \"Must be a field descriptor\");\n    return NULL;\n  }\n  cfield_descriptor = reinterpret_cast<CFieldDescriptor*>(arg);\n\n  google::protobuf::Message* message = self->message;\n  int length = message->GetReflection()->FieldSize(\n      *message, cfield_descriptor->descriptor);\n  return PyInt_FromLong(length);\n}\n\nstatic PyObject* CMessage_DebugString(CMessage* self, PyObject* args) {\n  return PyString_FromString(self->message->DebugString().c_str());\n}\n\nstatic PyObject* CMessage_SerializeToString(CMessage* self, PyObject* args) {\n  int size = self->message->ByteSize();\n  if (size <= 0) {\n    return PyString_FromString(\"\");\n  }\n  PyObject* result = PyString_FromStringAndSize(NULL, size);\n  if (result == NULL) {\n    return NULL;\n  }\n  char* buffer = PyString_AS_STRING(result);\n  self->message->SerializeWithCachedSizesToArray(\n      reinterpret_cast<uint8*>(buffer));\n  return result;\n}\n\nstatic PyObject* CMessage_SerializePartialToString(\n    CMessage* self, PyObject* args) {\n  string contents;\n  self->message->SerializePartialToString(&contents);\n  return PyString_FromStringAndSize(contents.c_str(), contents.size());\n}\n\nstatic PyObject* CMessageStr(CMessage* self) {\n  char str[1024];\n  str[sizeof(str) - 1] = 0;\n  snprintf(str, sizeof(str) - 1, \"CMessage: <%p>\", self->message);\n  return PyString_FromString(str);\n}\n\nstatic PyObject* CMessage_MergeFrom(CMessage* self, PyObject* arg) {\n  CMessage* other_message;\n  if (!PyObject_TypeCheck(reinterpret_cast<PyObject *>(arg), &CMessage_Type)) {\n    PyErr_SetString(PyExc_TypeError, \"Must be a message\");\n    return NULL;\n  }\n\n  other_message = reinterpret_cast<CMessage*>(arg);\n  if (other_message->message->GetDescriptor() !=\n      self->message->GetDescriptor()) {\n    PyErr_Format(PyExc_TypeError,\n                 \"Tried to merge from a message with a different type. \"\n                 \"to: %s, from: %s\",\n                 self->message->GetDescriptor()->full_name().c_str(),\n                 other_message->message->GetDescriptor()->full_name().c_str());\n    return NULL;\n  }\n  AssureWritable(self);\n\n  self->message->MergeFrom(*other_message->message);\n  Py_RETURN_NONE;\n}\n\nstatic PyObject* CMessage_CopyFrom(CMessage* self, PyObject* arg) {\n  CMessage* other_message;\n  if (!PyObject_TypeCheck(reinterpret_cast<PyObject *>(arg), &CMessage_Type)) {\n    PyErr_SetString(PyExc_TypeError, \"Must be a message\");\n    return NULL;\n  }\n\n  other_message = reinterpret_cast<CMessage*>(arg);\n  if (other_message->message->GetDescriptor() !=\n      self->message->GetDescriptor()) {\n    PyErr_Format(PyExc_TypeError,\n                 \"Tried to copy from a message with a different type. \"\n                 \"to: %s, from: %s\",\n                 self->message->GetDescriptor()->full_name().c_str(),\n                 other_message->message->GetDescriptor()->full_name().c_str());\n    return NULL;\n  }\n\n  AssureWritable(self);\n\n  self->message->CopyFrom(*other_message->message);\n  Py_RETURN_NONE;\n}\n\nstatic PyObject* CMessage_MergeFromString(CMessage* self, PyObject* arg) {\n  const void* data;\n  Py_ssize_t data_length;\n  if (PyObject_AsReadBuffer(arg, &data, &data_length) < 0) {\n    return NULL;\n  }\n\n  AssureWritable(self);\n  google::protobuf::io::CodedInputStream input(\n      reinterpret_cast<const uint8*>(data), data_length);\n  bool success = self->message->MergePartialFromCodedStream(&input);\n  if (success) {\n    return PyInt_FromLong(self->message->ByteSize());\n  } else {\n    return PyInt_FromLong(-1);\n  }\n}\n\nstatic PyObject* CMessage_ByteSize(CMessage* self, PyObject* args) {\n  return PyLong_FromLong(self->message->ByteSize());\n}\n\nstatic PyObject* CMessage_SetInParent(CMessage* self, PyObject* args) {\n  AssureWritable(self);\n  Py_RETURN_NONE;\n}\n\nstatic PyObject* CMessage_SwapRepeatedFieldElements(\n    CMessage* self, PyObject* args) {\n  CFieldDescriptor* cfield_descriptor;\n  int index1, index2;\n  if (!PyArg_ParseTuple(args, C(\"O!ii:SwapRepeatedFieldElements\"),\n                        &CFieldDescriptor_Type, &cfield_descriptor,\n                        &index1, &index2)) {\n    return NULL;\n  }\n\n  google::protobuf::Message* message = self->message;\n  const google::protobuf::Reflection* reflection = message->GetReflection();\n\n  reflection->SwapElements(\n      message, cfield_descriptor->descriptor, index1, index2);\n  Py_RETURN_NONE;\n}\n\nstatic PyObject* CMessage_AddMessage(CMessage* self, PyObject* arg) {\n  CFieldDescriptor* cfield_descriptor;\n  if (!PyObject_TypeCheck(reinterpret_cast<PyObject *>(arg),\n                          &CFieldDescriptor_Type)) {\n    PyErr_SetString(PyExc_TypeError, \"Must be a field descriptor\");\n    return NULL;\n  }\n  cfield_descriptor = reinterpret_cast<CFieldDescriptor*>(arg);\n  AssureWritable(self);\n\n  CMessage* py_cmsg = PyObject_New(CMessage, &CMessage_Type);\n  if (py_cmsg == NULL) {\n    return NULL;\n  }\n\n  google::protobuf::Message* message = self->message;\n  const google::protobuf::Reflection* reflection = message->GetReflection();\n  google::protobuf::Message* sub_message =\n      reflection->AddMessage(message, cfield_descriptor->descriptor);\n\n  py_cmsg->parent = NULL;\n  py_cmsg->full_name = sub_message->GetDescriptor()->full_name().c_str();\n  py_cmsg->message = sub_message;\n  py_cmsg->free_message = false;\n  py_cmsg->read_only = false;\n  return reinterpret_cast<PyObject*>(py_cmsg);\n}\n\nstatic PyObject* CMessage_GetRepeatedMessage(CMessage* self, PyObject* args) {\n  CFieldDescriptor* cfield_descriptor;\n  PyObject* slice;\n  if (!PyArg_ParseTuple(args, C(\"O!O:GetRepeatedMessage\"),\n                        &CFieldDescriptor_Type, &cfield_descriptor, &slice)) {\n    return NULL;\n  }\n\n  return InternalGetRepeatedScalarSlice(\n      self, cfield_descriptor->descriptor, slice);\n}\n\nstatic PyObject* CMessage_NewSubMessage(CMessage* self, PyObject* arg) {\n  CFieldDescriptor* cfield_descriptor;\n  if (!PyObject_TypeCheck(reinterpret_cast<PyObject *>(arg),\n                          &CFieldDescriptor_Type)) {\n    PyErr_SetString(PyExc_TypeError, \"Must be a field descriptor\");\n    return NULL;\n  }\n  cfield_descriptor = reinterpret_cast<CFieldDescriptor*>(arg);\n\n  CMessage* py_cmsg = PyObject_New(CMessage, &CMessage_Type);\n  if (py_cmsg == NULL) {\n    return NULL;\n  }\n\n  google::protobuf::Message* message = self->message;\n  const google::protobuf::Reflection* reflection = message->GetReflection();\n  const google::protobuf::Message& sub_message =\n      reflection->GetMessage(*message, cfield_descriptor->descriptor,\n                             global_message_factory);\n\n  py_cmsg->full_name = sub_message.GetDescriptor()->full_name().c_str();\n  py_cmsg->parent = self;\n  py_cmsg->parent_field = cfield_descriptor;\n  py_cmsg->message = const_cast<google::protobuf::Message*>(&sub_message);\n  py_cmsg->free_message = false;\n  py_cmsg->read_only = true;\n  return reinterpret_cast<PyObject*>(py_cmsg);\n}\n\nstatic PyObject* CMessage_MutableMessage(CMessage* self, PyObject* arg) {\n  CFieldDescriptor* cfield_descriptor;\n  if (!PyObject_TypeCheck(reinterpret_cast<PyObject *>(arg),\n                          &CFieldDescriptor_Type)) {\n    PyErr_SetString(PyExc_TypeError, \"Must be a field descriptor\");\n    return NULL;\n  }\n  cfield_descriptor = reinterpret_cast<CFieldDescriptor*>(arg);\n  AssureWritable(self);\n\n  CMessage* py_cmsg = PyObject_New(CMessage, &CMessage_Type);\n  if (py_cmsg == NULL) {\n    return NULL;\n  }\n\n  google::protobuf::Message* message = self->message;\n  const google::protobuf::Reflection* reflection = message->GetReflection();\n  google::protobuf::Message* mutable_message =\n      reflection->MutableMessage(message, cfield_descriptor->descriptor,\n                                 global_message_factory);\n\n  py_cmsg->full_name = mutable_message->GetDescriptor()->full_name().c_str();\n  py_cmsg->message = mutable_message;\n  py_cmsg->free_message = false;\n  py_cmsg->read_only = false;\n  return reinterpret_cast<PyObject*>(py_cmsg);\n}\n\nstatic PyObject* CMessage_Equals(CMessage* self, PyObject* arg) {\n  CMessage* other_message;\n  if (!PyObject_TypeCheck(reinterpret_cast<PyObject *>(arg), &CMessage_Type)) {\n    PyErr_SetString(PyExc_TypeError, \"Must be a message\");\n    return NULL;\n  }\n  other_message = reinterpret_cast<CMessage*>(arg);\n\n  if (other_message->message == self->message) {\n    return PyBool_FromLong(1);\n  }\n\n  if (other_message->message->GetDescriptor() !=\n      self->message->GetDescriptor()) {\n    return PyBool_FromLong(0);\n  }\n\n  return PyBool_FromLong(1);\n}\n\nstatic PyObject* CMessage_ListFields(CMessage* self, PyObject* args) {\n  google::protobuf::Message* message = self->message;\n  const google::protobuf::Reflection* reflection = message->GetReflection();\n  vector<const google::protobuf::FieldDescriptor*> fields;\n  reflection->ListFields(*message, &fields);\n\n  PyObject* list = PyList_New(fields.size());\n  if (list == NULL) {\n    return NULL;\n  }\n\n  for (unsigned int i = 0; i < fields.size(); ++i) {\n    bool is_extension = fields[i]->is_extension();\n    PyObject* t = PyTuple_New(2);\n    if (t == NULL) {\n      Py_DECREF(list);\n      return NULL;\n    }\n\n    PyObject* is_extension_object = PyBool_FromLong(is_extension ? 1 : 0);\n\n    PyObject* field_name;\n    const string* s;\n    if (is_extension) {\n      s = &fields[i]->full_name();\n    } else {\n      s = &fields[i]->name();\n    }\n    field_name = PyString_FromStringAndSize(s->c_str(), s->length());\n    if (field_name == NULL) {\n      Py_DECREF(list);\n      Py_DECREF(t);\n      return NULL;\n    }\n\n    PyTuple_SET_ITEM(t, 0, is_extension_object);\n    PyTuple_SET_ITEM(t, 1, field_name);\n    PyList_SET_ITEM(list, i, t);\n  }\n\n  return list;\n}\n\nstatic PyObject* CMessage_FindInitializationErrors(CMessage* self) {\n  google::protobuf::Message* message = self->message;\n  vector<string> errors;\n  message->FindInitializationErrors(&errors);\n\n  PyObject* error_list = PyList_New(errors.size());\n  if (error_list == NULL) {\n    return NULL;\n  }\n  for (unsigned int i = 0; i < errors.size(); ++i) {\n    const string& error = errors[i];\n    PyObject* error_string = PyString_FromStringAndSize(\n        error.c_str(), error.length());\n    if (error_string == NULL) {\n      Py_DECREF(error_list);\n      return NULL;\n    }\n    PyList_SET_ITEM(error_list, i, error_string);\n  }\n  return error_list;\n}\n\n// ------ Python Constructor:\n\nPyObject* Python_NewCMessage(PyObject* ignored, PyObject* arg) {\n  const char* message_type = PyString_AsString(arg);\n  if (message_type == NULL) {\n    return NULL;\n  }\n\n  const google::protobuf::Message* message = CreateMessage(message_type);\n  if (message == NULL) {\n    PyErr_Format(PyExc_TypeError, \"Couldn't create message of type %s!\",\n                 message_type);\n    return NULL;\n  }\n\n  CMessage* py_cmsg = PyObject_New(CMessage, &CMessage_Type);\n  if (py_cmsg == NULL) {\n    return NULL;\n  }\n  py_cmsg->message = message->New();\n  py_cmsg->free_message = true;\n  py_cmsg->full_name = message->GetDescriptor()->full_name().c_str();\n  py_cmsg->read_only = false;\n  py_cmsg->parent = NULL;\n  py_cmsg->parent_field = NULL;\n  return reinterpret_cast<PyObject*>(py_cmsg);\n}\n\n// --- Module Functions (exposed to Python):\n\nPyMethodDef methods[] = {\n  { C(\"NewCMessage\"), (PyCFunction)Python_NewCMessage,\n    METH_O,\n    C(\"Creates a new C++ protocol message, given its full name.\") },\n  { C(\"NewCDescriptorPool\"), (PyCFunction)Python_NewCDescriptorPool,\n    METH_NOARGS,\n    C(\"Creates a new C++ descriptor pool.\") },\n  { C(\"BuildFile\"), (PyCFunction)Python_BuildFile,\n    METH_O,\n    C(\"Registers a new protocol buffer file in the global C++ descriptor \"\n      \"pool.\") },\n  {NULL}\n};\n\n// --- Exposing the C proto living inside Python proto to C code:\n\nextern const Message* (*GetCProtoInsidePyProtoPtr)(PyObject* msg);\nextern Message* (*MutableCProtoInsidePyProtoPtr)(PyObject* msg);\n\nstatic const google::protobuf::Message* GetCProtoInsidePyProtoImpl(PyObject* msg) {\n  PyObject* c_msg_obj = PyObject_GetAttrString(msg, \"_cmsg\");\n  if (c_msg_obj == NULL) {\n    PyErr_Clear();\n    return NULL;\n  }\n  Py_DECREF(c_msg_obj);\n  if (!PyObject_TypeCheck(c_msg_obj, &CMessage_Type)) {\n    return NULL;\n  }\n  CMessage* c_msg = reinterpret_cast<CMessage*>(c_msg_obj);\n  return c_msg->message;\n}\n\nstatic google::protobuf::Message* MutableCProtoInsidePyProtoImpl(PyObject* msg) {\n  PyObject* c_msg_obj = PyObject_GetAttrString(msg, \"_cmsg\");\n  if (c_msg_obj == NULL) {\n    PyErr_Clear();\n    return NULL;\n  }\n  Py_DECREF(c_msg_obj);\n  if (!PyObject_TypeCheck(c_msg_obj, &CMessage_Type)) {\n    return NULL;\n  }\n  CMessage* c_msg = reinterpret_cast<CMessage*>(c_msg_obj);\n  AssureWritable(c_msg);\n  return c_msg->message;\n}\n\n// --- Module Init Function:\n\nstatic const char module_docstring[] =\n\"python-proto2 is a module that can be used to enhance proto2 Python API\\n\"\n\"performance.\\n\"\n\"\\n\"\n\"It provides access to the protocol buffers C++ reflection API that\\n\"\n\"implements the basic protocol buffer functions.\";\n\nextern \"C\" {\n  void init_net_proto2___python() {\n    // Initialize constants.\n    kPythonZero = PyInt_FromLong(0);\n    kint32min_py = PyInt_FromLong(kint32min);\n    kint32max_py = PyInt_FromLong(kint32max);\n    kuint32max_py = PyLong_FromLongLong(kuint32max);\n    kint64min_py = PyLong_FromLongLong(kint64min);\n    kint64max_py = PyLong_FromLongLong(kint64max);\n    kuint64max_py = PyLong_FromUnsignedLongLong(kuint64max);\n\n    global_message_factory = new DynamicMessageFactory(GetDescriptorPool());\n    global_message_factory->SetDelegateToGeneratedFactory(true);\n\n    // Export our functions to Python.\n    PyObject *m;\n    m = Py_InitModule3(C(\"_net_proto2___python\"), methods, C(module_docstring));\n    if (m == NULL) {\n      return;\n    }\n\n    AddConstants(m);\n\n    CMessage_Type.tp_new = PyType_GenericNew;\n    if (PyType_Ready(&CMessage_Type) < 0) {\n      return;\n    }\n\n    if (!InitDescriptor()) {\n      return;\n    }\n\n    // Override {Get,Mutable}CProtoInsidePyProto.\n    GetCProtoInsidePyProtoPtr = GetCProtoInsidePyProtoImpl;\n    MutableCProtoInsidePyProtoPtr = MutableCProtoInsidePyProtoImpl;\n  }\n}\n\n}  // namespace python\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: petar@google.com (Petar Petrov)\n\n#include <Python.h>\n\n#include <google/protobuf/pyext/python_descriptor.h>\n#include <google/protobuf/descriptor.pb.h>\n\n#define C(str) const_cast<char*>(str)\n\nnamespace google {\nnamespace protobuf {\nnamespace python {\n\nstatic void CFieldDescriptorDealloc(CFieldDescriptor* self);\n\nstatic google::protobuf::DescriptorPool* g_descriptor_pool = NULL;\n\nstatic PyObject* CFieldDescriptor_GetFullName(\n    CFieldDescriptor* self, void *closure) {\n  Py_XINCREF(self->full_name);\n  return self->full_name;\n}\n\nstatic PyObject* CFieldDescriptor_GetName(\n    CFieldDescriptor *self, void *closure) {\n  Py_XINCREF(self->name);\n  return self->name;\n}\n\nstatic PyObject* CFieldDescriptor_GetCppType(\n    CFieldDescriptor *self, void *closure) {\n  Py_XINCREF(self->cpp_type);\n  return self->cpp_type;\n}\n\nstatic PyObject* CFieldDescriptor_GetLabel(\n    CFieldDescriptor *self, void *closure) {\n  Py_XINCREF(self->label);\n  return self->label;\n}\n\nstatic PyObject* CFieldDescriptor_GetID(\n    CFieldDescriptor *self, void *closure) {\n  Py_XINCREF(self->id);\n  return self->id;\n}\n\n\nstatic PyGetSetDef CFieldDescriptorGetters[] = {\n  { C(\"full_name\"),\n    (getter)CFieldDescriptor_GetFullName, NULL, \"Full name\", NULL},\n  { C(\"name\"),\n    (getter)CFieldDescriptor_GetName, NULL, \"last name\", NULL},\n  { C(\"cpp_type\"),\n    (getter)CFieldDescriptor_GetCppType, NULL, \"C++ Type\", NULL},\n  { C(\"label\"),\n    (getter)CFieldDescriptor_GetLabel, NULL, \"Label\", NULL},\n  { C(\"id\"),\n    (getter)CFieldDescriptor_GetID, NULL, \"ID\", NULL},\n  {NULL}\n};\n\nPyTypeObject CFieldDescriptor_Type = {\n  PyObject_HEAD_INIT(&PyType_Type)\n  0,\n  C(\"google3.net.google.protobuf.python.internal.\"\n    \"_net_proto2___python.\"\n    \"CFieldDescriptor\"),                // tp_name\n  sizeof(CFieldDescriptor),             // tp_basicsize\n  0,                                    // tp_itemsize\n  (destructor)CFieldDescriptorDealloc,  // tp_dealloc\n  0,                                    // tp_print\n  0,                                    // tp_getattr\n  0,                                    // tp_setattr\n  0,                                    // tp_compare\n  0,                                    // tp_repr\n  0,                                    // tp_as_number\n  0,                                    // tp_as_sequence\n  0,                                    // tp_as_mapping\n  0,                                    // tp_hash\n  0,                                    // tp_call\n  0,                                    // tp_str\n  0,                                    // tp_getattro\n  0,                                    // tp_setattro\n  0,                                    // tp_as_buffer\n  Py_TPFLAGS_DEFAULT,                   // tp_flags\n  C(\"A Field Descriptor\"),              // tp_doc\n  0,                                    // tp_traverse\n  0,                                    // tp_clear\n  0,                                    // tp_richcompare\n  0,                                    // tp_weaklistoffset\n  0,                                    // tp_iter\n  0,                                    // tp_iternext\n  0,                                    // tp_methods\n  0,                                    // tp_members\n  CFieldDescriptorGetters,              // tp_getset\n  0,                                    // tp_base\n  0,                                    // tp_dict\n  0,                                    // tp_descr_get\n  0,                                    // tp_descr_set\n  0,                                    // tp_dictoffset\n  0,                                    // tp_init\n  PyType_GenericAlloc,                  // tp_alloc\n  PyType_GenericNew,                    // tp_new\n  PyObject_Del,                         // tp_free\n};\n\nstatic void CFieldDescriptorDealloc(CFieldDescriptor* self) {\n  Py_DECREF(self->full_name);\n  Py_DECREF(self->name);\n  Py_DECREF(self->cpp_type);\n  Py_DECREF(self->label);\n  Py_DECREF(self->id);\n  self->ob_type->tp_free(reinterpret_cast<PyObject*>(self));\n}\n\ntypedef struct {\n  PyObject_HEAD\n\n  const google::protobuf::DescriptorPool* pool;\n} CDescriptorPool;\n\nstatic void CDescriptorPoolDealloc(CDescriptorPool* self);\n\nstatic PyObject* CDescriptorPool_NewCDescriptor(\n    const google::protobuf::FieldDescriptor* field_descriptor) {\n  CFieldDescriptor* cfield_descriptor = PyObject_New(\n      CFieldDescriptor, &CFieldDescriptor_Type);\n  if (cfield_descriptor == NULL) {\n    return NULL;\n  }\n  cfield_descriptor->descriptor = field_descriptor;\n\n  cfield_descriptor->full_name = PyString_FromString(\n      field_descriptor->full_name().c_str());\n  cfield_descriptor->name = PyString_FromString(\n      field_descriptor->name().c_str());\n  cfield_descriptor->cpp_type = PyLong_FromLong(field_descriptor->cpp_type());\n  cfield_descriptor->label = PyLong_FromLong(field_descriptor->label());\n  cfield_descriptor->id = PyLong_FromVoidPtr(cfield_descriptor);\n  return reinterpret_cast<PyObject*>(cfield_descriptor);\n}\n\nstatic PyObject* CDescriptorPool_FindFieldByName(\n    CDescriptorPool* self, PyObject* arg) {\n  const char* full_field_name = PyString_AsString(arg);\n  if (full_field_name == NULL) {\n    return NULL;\n  }\n\n  const google::protobuf::FieldDescriptor* field_descriptor = NULL;\n\n  field_descriptor = self->pool->FindFieldByName(full_field_name);\n  if (field_descriptor == NULL) {\n    PyErr_Format(PyExc_TypeError, \"Couldn't find field %.200s\",\n                 full_field_name);\n    return NULL;\n  }\n\n  return CDescriptorPool_NewCDescriptor(field_descriptor);\n}\n\nstatic PyObject* CDescriptorPool_FindExtensionByName(\n    CDescriptorPool* self, PyObject* arg) {\n  const char* full_field_name = PyString_AsString(arg);\n  if (full_field_name == NULL) {\n    return NULL;\n  }\n\n  const google::protobuf::FieldDescriptor* field_descriptor =\n      self->pool->FindExtensionByName(full_field_name);\n  if (field_descriptor == NULL) {\n    PyErr_Format(PyExc_TypeError, \"Couldn't find field %.200s\",\n                 full_field_name);\n    return NULL;\n  }\n\n  return CDescriptorPool_NewCDescriptor(field_descriptor);\n}\n\nstatic PyMethodDef CDescriptorPoolMethods[] = {\n  { C(\"FindFieldByName\"),\n    (PyCFunction)CDescriptorPool_FindFieldByName,\n    METH_O,\n    C(\"Searches for a field descriptor by full name.\") },\n  { C(\"FindExtensionByName\"),\n    (PyCFunction)CDescriptorPool_FindExtensionByName,\n    METH_O,\n    C(\"Searches for extension descriptor by full name.\") },\n  {NULL}\n};\n\nPyTypeObject CDescriptorPool_Type = {\n  PyObject_HEAD_INIT(&PyType_Type)\n  0,\n  C(\"google3.net.google.protobuf.python.internal.\"\n    \"_net_proto2___python.\"\n    \"CFieldDescriptor\"),               // tp_name\n  sizeof(CDescriptorPool),             // tp_basicsize\n  0,                                   // tp_itemsize\n  (destructor)CDescriptorPoolDealloc,  // tp_dealloc\n  0,                                   // tp_print\n  0,                                   // tp_getattr\n  0,                                   // tp_setattr\n  0,                                   // tp_compare\n  0,                                   // tp_repr\n  0,                                   // tp_as_number\n  0,                                   // tp_as_sequence\n  0,                                   // tp_as_mapping\n  0,                                   // tp_hash\n  0,                                   // tp_call\n  0,                                   // tp_str\n  0,                                   // tp_getattro\n  0,                                   // tp_setattro\n  0,                                   // tp_as_buffer\n  Py_TPFLAGS_DEFAULT,                  // tp_flags\n  C(\"A Descriptor Pool\"),              // tp_doc\n  0,                                   // tp_traverse\n  0,                                   // tp_clear\n  0,                                   // tp_richcompare\n  0,                                   // tp_weaklistoffset\n  0,                                   // tp_iter\n  0,                                   // tp_iternext\n  CDescriptorPoolMethods,              // tp_methods\n  0,                                   // tp_members\n  0,                                   // tp_getset\n  0,                                   // tp_base\n  0,                                   // tp_dict\n  0,                                   // tp_descr_get\n  0,                                   // tp_descr_set\n  0,                                   // tp_dictoffset\n  0,                                   // tp_init\n  PyType_GenericAlloc,                 // tp_alloc\n  PyType_GenericNew,                   // tp_new\n  PyObject_Del,                        // tp_free\n};\n\nstatic void CDescriptorPoolDealloc(CDescriptorPool* self) {\n  self->ob_type->tp_free(reinterpret_cast<PyObject*>(self));\n}\n\ngoogle::protobuf::DescriptorPool* GetDescriptorPool() {\n  if (g_descriptor_pool == NULL) {\n    g_descriptor_pool = new google::protobuf::DescriptorPool(\n        google::protobuf::DescriptorPool::generated_pool());\n  }\n  return g_descriptor_pool;\n}\n\nPyObject* Python_NewCDescriptorPool(PyObject* ignored, PyObject* args) {\n  CDescriptorPool* cdescriptor_pool = PyObject_New(\n      CDescriptorPool, &CDescriptorPool_Type);\n  if (cdescriptor_pool == NULL) {\n    return NULL;\n  }\n  cdescriptor_pool->pool = GetDescriptorPool();\n  return reinterpret_cast<PyObject*>(cdescriptor_pool);\n}\n\nPyObject* Python_BuildFile(PyObject* ignored, PyObject* arg) {\n  char* message_type;\n  Py_ssize_t message_len;\n\n  if (PyString_AsStringAndSize(arg, &message_type, &message_len) < 0) {\n    return NULL;\n  }\n\n  google::protobuf::FileDescriptorProto file_proto;\n  if (!file_proto.ParseFromArray(message_type, message_len)) {\n    PyErr_SetString(PyExc_TypeError, \"Couldn't parse file content!\");\n    return NULL;\n  }\n\n  // If this file is already in the generated pool, don't add it again.\n  if (google::protobuf::DescriptorPool::generated_pool()->FindFileByName(\n      file_proto.name()) != NULL) {\n    Py_RETURN_NONE;\n  }\n\n  const google::protobuf::FileDescriptor* descriptor = GetDescriptorPool()->BuildFile(\n      file_proto);\n  if (descriptor == NULL) {\n    PyErr_SetString(PyExc_TypeError,\n                    \"Couldn't build proto file into descriptor pool!\");\n    return NULL;\n  }\n\n  Py_RETURN_NONE;\n}\n\nbool InitDescriptor() {\n  CFieldDescriptor_Type.tp_new = PyType_GenericNew;\n  if (PyType_Ready(&CFieldDescriptor_Type) < 0)\n    return false;\n\n  CDescriptorPool_Type.tp_new = PyType_GenericNew;\n  if (PyType_Ready(&CDescriptorPool_Type) < 0)\n    return false;\n  return true;\n}\n\n}  // namespace python\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: petar@google.com (Petar Petrov)\n\n#ifndef GOOGLE_PROTOBUF_PYTHON_DESCRIPTOR_H__\n#define GOOGLE_PROTOBUF_PYTHON_DESCRIPTOR_H__\n\n#include <Python.h>\n#include <structmember.h>\n\n#include <google/protobuf/descriptor.h>\n\n#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)\ntypedef int Py_ssize_t;\n#define PY_SSIZE_T_MAX INT_MAX\n#define PY_SSIZE_T_MIN INT_MIN\n#endif\n\nnamespace google {\nnamespace protobuf {\nnamespace python {\n\ntypedef struct {\n  PyObject_HEAD\n\n  // The proto2 descriptor that this object represents.\n  const google::protobuf::FieldDescriptor* descriptor;\n\n  // Full name of the field (PyString).\n  PyObject* full_name;\n\n  // Name of the field (PyString).\n  PyObject* name;\n\n  // C++ type of the field (PyLong).\n  PyObject* cpp_type;\n\n  // Name of the field (PyLong).\n  PyObject* label;\n\n  // Identity of the descriptor (PyLong used as a poiner).\n  PyObject* id;\n} CFieldDescriptor;\n\nextern PyTypeObject CFieldDescriptor_Type;\n\nextern PyTypeObject CDescriptorPool_Type;\n\n\nPyObject* Python_NewCDescriptorPool(PyObject* ignored, PyObject* args);\nPyObject* Python_BuildFile(PyObject* ignored, PyObject* args);\nbool InitDescriptor();\ngoogle::protobuf::DescriptorPool* GetDescriptorPool();\n\n}  // namespace python\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_PYTHON_DESCRIPTOR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: qrczak@google.com (Marcin Kowalczyk)\n\n#include <google/protobuf/pyext/python_protobuf.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace python {\n\nstatic const Message* GetCProtoInsidePyProtoStub(PyObject* msg) {\n  return NULL;\n}\nstatic Message* MutableCProtoInsidePyProtoStub(PyObject* msg) {\n  return NULL;\n}\n\n// This is initialized with a default, stub implementation.\n// If python-google.protobuf.cc is loaded, the function pointer is overridden\n// with a full implementation.\nconst Message* (*GetCProtoInsidePyProtoPtr)(PyObject* msg) =\n    GetCProtoInsidePyProtoStub;\nMessage* (*MutableCProtoInsidePyProtoPtr)(PyObject* msg) =\n    MutableCProtoInsidePyProtoStub;\n\nconst Message* GetCProtoInsidePyProto(PyObject* msg) {\n  return GetCProtoInsidePyProtoPtr(msg);\n}\nMessage* MutableCProtoInsidePyProto(PyObject* msg) {\n  return MutableCProtoInsidePyProtoPtr(msg);\n}\n\n}  // namespace python\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: qrczak@google.com (Marcin Kowalczyk)\n//\n// This module exposes the C proto inside the given Python proto, in\n// case the Python proto is implemented with a C proto.\n\n#ifndef GOOGLE_PROTOBUF_PYTHON_PYTHON_PROTOBUF_H__\n#define GOOGLE_PROTOBUF_PYTHON_PYTHON_PROTOBUF_H__\n\n#include <Python.h>\n\nnamespace google {\nnamespace protobuf {\n\nclass Message;\n\nnamespace python {\n\n// Return the pointer to the C proto inside the given Python proto,\n// or NULL when this is not a Python proto implemented with a C proto.\nconst Message* GetCProtoInsidePyProto(PyObject* msg);\nMessage* MutableCProtoInsidePyProto(PyObject* msg);\n\n}  // namespace python\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_PYTHON_PYTHON_PROTOBUF_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/reflection.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# This code is meant to work on Python 2.4 and above only.\n\n\"\"\"Contains a metaclass and helper functions used to create\nprotocol message classes from Descriptor objects at runtime.\n\nRecall that a metaclass is the \"type\" of a class.\n(A class is to a metaclass what an instance is to a class.)\n\nIn this case, we use the GeneratedProtocolMessageType metaclass\nto inject all the useful functionality into the classes\noutput by the protocol compiler at compile-time.\n\nThe upshot of all this is that the real implementation\ndetails for ALL pure-Python protocol buffers are *here in\nthis file*.\n\"\"\"\n\n__author__ = 'robinson@google.com (Will Robinson)'\n\n\nfrom google.protobuf.internal import api_implementation\nfrom google.protobuf import descriptor as descriptor_mod\n_FieldDescriptor = descriptor_mod.FieldDescriptor\n\n\nif api_implementation.Type() == 'cpp':\n  from google.protobuf.internal import cpp_message\n  _NewMessage = cpp_message.NewMessage\n  _InitMessage = cpp_message.InitMessage\nelse:\n  from google.protobuf.internal import python_message\n  _NewMessage = python_message.NewMessage\n  _InitMessage = python_message.InitMessage\n\n\nclass GeneratedProtocolMessageType(type):\n\n  \"\"\"Metaclass for protocol message classes created at runtime from Descriptors.\n\n  We add implementations for all methods described in the Message class.  We\n  also create properties to allow getting/setting all fields in the protocol\n  message.  Finally, we create slots to prevent users from accidentally\n  \"setting\" nonexistent fields in the protocol message, which then wouldn't get\n  serialized / deserialized properly.\n\n  The protocol compiler currently uses this metaclass to create protocol\n  message classes at runtime.  Clients can also manually create their own\n  classes at runtime, as in this example:\n\n  mydescriptor = Descriptor(.....)\n  class MyProtoClass(Message):\n    __metaclass__ = GeneratedProtocolMessageType\n    DESCRIPTOR = mydescriptor\n  myproto_instance = MyProtoClass()\n  myproto.foo_field = 23\n  ...\n  \"\"\"\n\n  # Must be consistent with the protocol-compiler code in\n  # proto2/compiler/internal/generator.*.\n  _DESCRIPTOR_KEY = 'DESCRIPTOR'\n\n  def __new__(cls, name, bases, dictionary):\n    \"\"\"Custom allocation for runtime-generated class types.\n\n    We override __new__ because this is apparently the only place\n    where we can meaningfully set __slots__ on the class we're creating(?).\n    (The interplay between metaclasses and slots is not very well-documented).\n\n    Args:\n      name: Name of the class (ignored, but required by the\n        metaclass protocol).\n      bases: Base classes of the class we're constructing.\n        (Should be message.Message).  We ignore this field, but\n        it's required by the metaclass protocol\n      dictionary: The class dictionary of the class we're\n        constructing.  dictionary[_DESCRIPTOR_KEY] must contain\n        a Descriptor object describing this protocol message\n        type.\n\n    Returns:\n      Newly-allocated class.\n    \"\"\"\n    descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY]\n    _NewMessage(descriptor, dictionary)\n    superclass = super(GeneratedProtocolMessageType, cls)\n\n    new_class = superclass.__new__(cls, name, bases, dictionary)\n    setattr(descriptor, '_concrete_class', new_class)\n    return new_class\n\n  def __init__(cls, name, bases, dictionary):\n    \"\"\"Here we perform the majority of our work on the class.\n    We add enum getters, an __init__ method, implementations\n    of all Message methods, and properties for all fields\n    in the protocol type.\n\n    Args:\n      name: Name of the class (ignored, but required by the\n        metaclass protocol).\n      bases: Base classes of the class we're constructing.\n        (Should be message.Message).  We ignore this field, but\n        it's required by the metaclass protocol\n      dictionary: The class dictionary of the class we're\n        constructing.  dictionary[_DESCRIPTOR_KEY] must contain\n        a Descriptor object describing this protocol message\n        type.\n    \"\"\"\n    descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY]\n    _InitMessage(descriptor, cls)\n    superclass = super(GeneratedProtocolMessageType, cls)\n    superclass.__init__(name, bases, dictionary)\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"DEPRECATED:  Declares the RPC service interfaces.\n\nThis module declares the abstract interfaces underlying proto2 RPC\nservices.  These are intended to be independent of any particular RPC\nimplementation, so that proto2 services can be used on top of a variety\nof implementations.  Starting with version 2.3.0, RPC implementations should\nnot try to build on these, but should instead provide code generator plugins\nwhich generate code specific to the particular RPC implementation.  This way\nthe generated code can be more appropriate for the implementation in use\nand can avoid unnecessary layers of indirection.\n\"\"\"\n\n__author__ = 'petar@google.com (Petar Petrov)'\n\n\nclass RpcException(Exception):\n  \"\"\"Exception raised on failed blocking RPC method call.\"\"\"\n  pass\n\n\nclass Service(object):\n\n  \"\"\"Abstract base interface for protocol-buffer-based RPC services.\n\n  Services themselves are abstract classes (implemented either by servers or as\n  stubs), but they subclass this base interface. The methods of this\n  interface can be used to call the methods of the service without knowing\n  its exact type at compile time (analogous to the Message interface).\n  \"\"\"\n\n  def GetDescriptor():\n    \"\"\"Retrieves this service's descriptor.\"\"\"\n    raise NotImplementedError\n\n  def CallMethod(self, method_descriptor, rpc_controller,\n                 request, done):\n    \"\"\"Calls a method of the service specified by method_descriptor.\n\n    If \"done\" is None then the call is blocking and the response\n    message will be returned directly.  Otherwise the call is asynchronous\n    and \"done\" will later be called with the response value.\n\n    In the blocking case, RpcException will be raised on error.\n\n    Preconditions:\n    * method_descriptor.service == GetDescriptor\n    * request is of the exact same classes as returned by\n      GetRequestClass(method).\n    * After the call has started, the request must not be modified.\n    * \"rpc_controller\" is of the correct type for the RPC implementation being\n      used by this Service.  For stubs, the \"correct type\" depends on the\n      RpcChannel which the stub is using.\n\n    Postconditions:\n    * \"done\" will be called when the method is complete.  This may be\n      before CallMethod() returns or it may be at some point in the future.\n    * If the RPC failed, the response value passed to \"done\" will be None.\n      Further details about the failure can be found by querying the\n      RpcController.\n    \"\"\"\n    raise NotImplementedError\n\n  def GetRequestClass(self, method_descriptor):\n    \"\"\"Returns the class of the request message for the specified method.\n\n    CallMethod() requires that the request is of a particular subclass of\n    Message. GetRequestClass() gets the default instance of this required\n    type.\n\n    Example:\n      method = service.GetDescriptor().FindMethodByName(\"Foo\")\n      request = stub.GetRequestClass(method)()\n      request.ParseFromString(input)\n      service.CallMethod(method, request, callback)\n    \"\"\"\n    raise NotImplementedError\n\n  def GetResponseClass(self, method_descriptor):\n    \"\"\"Returns the class of the response message for the specified method.\n\n    This method isn't really needed, as the RpcChannel's CallMethod constructs\n    the response protocol message. It's provided anyway in case it is useful\n    for the caller to know the response type in advance.\n    \"\"\"\n    raise NotImplementedError\n\n\nclass RpcController(object):\n\n  \"\"\"An RpcController mediates a single method call.\n\n  The primary purpose of the controller is to provide a way to manipulate\n  settings specific to the RPC implementation and to find out about RPC-level\n  errors. The methods provided by the RpcController interface are intended\n  to be a \"least common denominator\" set of features which we expect all\n  implementations to support.  Specific implementations may provide more\n  advanced features (e.g. deadline propagation).\n  \"\"\"\n\n  # Client-side methods below\n\n  def Reset(self):\n    \"\"\"Resets the RpcController to its initial state.\n\n    After the RpcController has been reset, it may be reused in\n    a new call. Must not be called while an RPC is in progress.\n    \"\"\"\n    raise NotImplementedError\n\n  def Failed(self):\n    \"\"\"Returns true if the call failed.\n\n    After a call has finished, returns true if the call failed.  The possible\n    reasons for failure depend on the RPC implementation.  Failed() must not\n    be called before a call has finished.  If Failed() returns true, the\n    contents of the response message are undefined.\n    \"\"\"\n    raise NotImplementedError\n\n  def ErrorText(self):\n    \"\"\"If Failed is true, returns a human-readable description of the error.\"\"\"\n    raise NotImplementedError\n\n  def StartCancel(self):\n    \"\"\"Initiate cancellation.\n\n    Advises the RPC system that the caller desires that the RPC call be\n    canceled.  The RPC system may cancel it immediately, may wait awhile and\n    then cancel it, or may not even cancel the call at all.  If the call is\n    canceled, the \"done\" callback will still be called and the RpcController\n    will indicate that the call failed at that time.\n    \"\"\"\n    raise NotImplementedError\n\n  # Server-side methods below\n\n  def SetFailed(self, reason):\n    \"\"\"Sets a failure reason.\n\n    Causes Failed() to return true on the client side.  \"reason\" will be\n    incorporated into the message returned by ErrorText().  If you find\n    you need to return machine-readable information about failures, you\n    should incorporate it into your response protocol buffer and should\n    NOT call SetFailed().\n    \"\"\"\n    raise NotImplementedError\n\n  def IsCanceled(self):\n    \"\"\"Checks if the client cancelled the RPC.\n\n    If true, indicates that the client canceled the RPC, so the server may\n    as well give up on replying to it.  The server should still call the\n    final \"done\" callback.\n    \"\"\"\n    raise NotImplementedError\n\n  def NotifyOnCancel(self, callback):\n    \"\"\"Sets a callback to invoke on cancel.\n\n    Asks that the given callback be called when the RPC is canceled.  The\n    callback will always be called exactly once.  If the RPC completes without\n    being canceled, the callback will be called after completion.  If the RPC\n    has already been canceled when NotifyOnCancel() is called, the callback\n    will be called immediately.\n\n    NotifyOnCancel() must be called no more than once per request.\n    \"\"\"\n    raise NotImplementedError\n\n\nclass RpcChannel(object):\n\n  \"\"\"Abstract interface for an RPC channel.\n\n  An RpcChannel represents a communication line to a service which can be used\n  to call that service's methods.  The service may be running on another\n  machine. Normally, you should not use an RpcChannel directly, but instead\n  construct a stub {@link Service} wrapping it.  Example:\n\n  Example:\n    RpcChannel channel = rpcImpl.Channel(\"remotehost.example.com:1234\")\n    RpcController controller = rpcImpl.Controller()\n    MyService service = MyService_Stub(channel)\n    service.MyMethod(controller, request, callback)\n  \"\"\"\n\n  def CallMethod(self, method_descriptor, rpc_controller,\n                 request, response_class, done):\n    \"\"\"Calls the method identified by the descriptor.\n\n    Call the given method of the remote service.  The signature of this\n    procedure looks the same as Service.CallMethod(), but the requirements\n    are less strict in one important way:  the request object doesn't have to\n    be of any specific class as long as its descriptor is method.input_type.\n    \"\"\"\n    raise NotImplementedError\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service_reflection.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Contains metaclasses used to create protocol service and service stub\nclasses from ServiceDescriptor objects at runtime.\n\nThe GeneratedServiceType and GeneratedServiceStubType metaclasses are used to\ninject all useful functionality into the classes output by the protocol\ncompiler at compile-time.\n\"\"\"\n\n__author__ = 'petar@google.com (Petar Petrov)'\n\n\nclass GeneratedServiceType(type):\n\n  \"\"\"Metaclass for service classes created at runtime from ServiceDescriptors.\n\n  Implementations for all methods described in the Service class are added here\n  by this class. We also create properties to allow getting/setting all fields\n  in the protocol message.\n\n  The protocol compiler currently uses this metaclass to create protocol service\n  classes at runtime. Clients can also manually create their own classes at\n  runtime, as in this example:\n\n  mydescriptor = ServiceDescriptor(.....)\n  class MyProtoService(service.Service):\n    __metaclass__ = GeneratedServiceType\n    DESCRIPTOR = mydescriptor\n  myservice_instance = MyProtoService()\n  ...\n  \"\"\"\n\n  _DESCRIPTOR_KEY = 'DESCRIPTOR'\n\n  def __init__(cls, name, bases, dictionary):\n    \"\"\"Creates a message service class.\n\n    Args:\n      name: Name of the class (ignored, but required by the metaclass\n        protocol).\n      bases: Base classes of the class being constructed.\n      dictionary: The class dictionary of the class being constructed.\n        dictionary[_DESCRIPTOR_KEY] must contain a ServiceDescriptor object\n        describing this protocol service type.\n    \"\"\"\n    # Don't do anything if this class doesn't have a descriptor. This happens\n    # when a service class is subclassed.\n    if GeneratedServiceType._DESCRIPTOR_KEY not in dictionary:\n      return\n    descriptor = dictionary[GeneratedServiceType._DESCRIPTOR_KEY]\n    service_builder = _ServiceBuilder(descriptor)\n    service_builder.BuildService(cls)\n\n\nclass GeneratedServiceStubType(GeneratedServiceType):\n\n  \"\"\"Metaclass for service stubs created at runtime from ServiceDescriptors.\n\n  This class has similar responsibilities as GeneratedServiceType, except that\n  it creates the service stub classes.\n  \"\"\"\n\n  _DESCRIPTOR_KEY = 'DESCRIPTOR'\n\n  def __init__(cls, name, bases, dictionary):\n    \"\"\"Creates a message service stub class.\n\n    Args:\n      name: Name of the class (ignored, here).\n      bases: Base classes of the class being constructed.\n      dictionary: The class dictionary of the class being constructed.\n        dictionary[_DESCRIPTOR_KEY] must contain a ServiceDescriptor object\n        describing this protocol service type.\n    \"\"\"\n    super(GeneratedServiceStubType, cls).__init__(name, bases, dictionary)\n    # Don't do anything if this class doesn't have a descriptor. This happens\n    # when a service stub is subclassed.\n    if GeneratedServiceStubType._DESCRIPTOR_KEY not in dictionary:\n      return\n    descriptor = dictionary[GeneratedServiceStubType._DESCRIPTOR_KEY]\n    service_stub_builder = _ServiceStubBuilder(descriptor)\n    service_stub_builder.BuildServiceStub(cls)\n\n\nclass _ServiceBuilder(object):\n\n  \"\"\"This class constructs a protocol service class using a service descriptor.\n\n  Given a service descriptor, this class constructs a class that represents\n  the specified service descriptor. One service builder instance constructs\n  exactly one service class. That means all instances of that class share the\n  same builder.\n  \"\"\"\n\n  def __init__(self, service_descriptor):\n    \"\"\"Initializes an instance of the service class builder.\n\n    Args:\n      service_descriptor: ServiceDescriptor to use when constructing the\n        service class.\n    \"\"\"\n    self.descriptor = service_descriptor\n\n  def BuildService(self, cls):\n    \"\"\"Constructs the service class.\n\n    Args:\n      cls: The class that will be constructed.\n    \"\"\"\n\n    # CallMethod needs to operate with an instance of the Service class. This\n    # internal wrapper function exists only to be able to pass the service\n    # instance to the method that does the real CallMethod work.\n    def _WrapCallMethod(srvc, method_descriptor,\n                        rpc_controller, request, callback):\n      return self._CallMethod(srvc, method_descriptor,\n                       rpc_controller, request, callback)\n    self.cls = cls\n    cls.CallMethod = _WrapCallMethod\n    cls.GetDescriptor = staticmethod(lambda: self.descriptor)\n    cls.GetDescriptor.__doc__ = \"Returns the service descriptor.\"\n    cls.GetRequestClass = self._GetRequestClass\n    cls.GetResponseClass = self._GetResponseClass\n    for method in self.descriptor.methods:\n      setattr(cls, method.name, self._GenerateNonImplementedMethod(method))\n\n  def _CallMethod(self, srvc, method_descriptor,\n                  rpc_controller, request, callback):\n    \"\"\"Calls the method described by a given method descriptor.\n\n    Args:\n      srvc: Instance of the service for which this method is called.\n      method_descriptor: Descriptor that represent the method to call.\n      rpc_controller: RPC controller to use for this method's execution.\n      request: Request protocol message.\n      callback: A callback to invoke after the method has completed.\n    \"\"\"\n    if method_descriptor.containing_service != self.descriptor:\n      raise RuntimeError(\n          'CallMethod() given method descriptor for wrong service type.')\n    method = getattr(srvc, method_descriptor.name)\n    return method(rpc_controller, request, callback)\n\n  def _GetRequestClass(self, method_descriptor):\n    \"\"\"Returns the class of the request protocol message.\n\n    Args:\n      method_descriptor: Descriptor of the method for which to return the\n        request protocol message class.\n\n    Returns:\n      A class that represents the input protocol message of the specified\n      method.\n    \"\"\"\n    if method_descriptor.containing_service != self.descriptor:\n      raise RuntimeError(\n          'GetRequestClass() given method descriptor for wrong service type.')\n    return method_descriptor.input_type._concrete_class\n\n  def _GetResponseClass(self, method_descriptor):\n    \"\"\"Returns the class of the response protocol message.\n\n    Args:\n      method_descriptor: Descriptor of the method for which to return the\n        response protocol message class.\n\n    Returns:\n      A class that represents the output protocol message of the specified\n      method.\n    \"\"\"\n    if method_descriptor.containing_service != self.descriptor:\n      raise RuntimeError(\n          'GetResponseClass() given method descriptor for wrong service type.')\n    return method_descriptor.output_type._concrete_class\n\n  def _GenerateNonImplementedMethod(self, method):\n    \"\"\"Generates and returns a method that can be set for a service methods.\n\n    Args:\n      method: Descriptor of the service method for which a method is to be\n        generated.\n\n    Returns:\n      A method that can be added to the service class.\n    \"\"\"\n    return lambda inst, rpc_controller, request, callback: (\n        self._NonImplementedMethod(method.name, rpc_controller, callback))\n\n  def _NonImplementedMethod(self, method_name, rpc_controller, callback):\n    \"\"\"The body of all methods in the generated service class.\n\n    Args:\n      method_name: Name of the method being executed.\n      rpc_controller: RPC controller used to execute this method.\n      callback: A callback which will be invoked when the method finishes.\n    \"\"\"\n    rpc_controller.SetFailed('Method %s not implemented.' % method_name)\n    callback(None)\n\n\nclass _ServiceStubBuilder(object):\n\n  \"\"\"Constructs a protocol service stub class using a service descriptor.\n\n  Given a service descriptor, this class constructs a suitable stub class.\n  A stub is just a type-safe wrapper around an RpcChannel which emulates a\n  local implementation of the service.\n\n  One service stub builder instance constructs exactly one class. It means all\n  instances of that class share the same service stub builder.\n  \"\"\"\n\n  def __init__(self, service_descriptor):\n    \"\"\"Initializes an instance of the service stub class builder.\n\n    Args:\n      service_descriptor: ServiceDescriptor to use when constructing the\n        stub class.\n    \"\"\"\n    self.descriptor = service_descriptor\n\n  def BuildServiceStub(self, cls):\n    \"\"\"Constructs the stub class.\n\n    Args:\n      cls: The class that will be constructed.\n    \"\"\"\n\n    def _ServiceStubInit(stub, rpc_channel):\n      stub.rpc_channel = rpc_channel\n    self.cls = cls\n    cls.__init__ = _ServiceStubInit\n    for method in self.descriptor.methods:\n      setattr(cls, method.name, self._GenerateStubMethod(method))\n\n  def _GenerateStubMethod(self, method):\n    return (lambda inst, rpc_controller, request, callback=None:\n        self._StubMethod(inst, method, rpc_controller, request, callback))\n\n  def _StubMethod(self, stub, method_descriptor,\n                  rpc_controller, request, callback):\n    \"\"\"The body of all service methods in the generated stub class.\n\n    Args:\n      stub: Stub instance.\n      method_descriptor: Descriptor of the invoked method.\n      rpc_controller: Rpc controller to execute the method.\n      request: Request protocol message.\n      callback: A callback to execute when the method finishes.\n    Returns:\n      Response message (in case of blocking call).\n    \"\"\"\n    return stub.rpc_channel.CallMethod(\n        method_descriptor, rpc_controller, request,\n        method_descriptor.output_type._concrete_class, callback)\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/text_format.py",
    "content": "# Protocol Buffers - Google's data interchange format\n# Copyright 2008 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Contains routines for printing protocol messages in text format.\"\"\"\n\n__author__ = 'kenton@google.com (Kenton Varda)'\n\nimport cStringIO\nimport re\n\nfrom collections import deque\nfrom google.protobuf.internal import type_checkers\nfrom google.protobuf import descriptor\n\n__all__ = [ 'MessageToString', 'PrintMessage', 'PrintField',\n            'PrintFieldValue', 'Merge' ]\n\n\n# Infinity and NaN are not explicitly supported by Python pre-2.6, and\n# float('inf') does not work on Windows (pre-2.6).\n_INFINITY = 1e10000    # overflows, thus will actually be infinity.\n_NAN = _INFINITY * 0\n\n\nclass ParseError(Exception):\n  \"\"\"Thrown in case of ASCII parsing error.\"\"\"\n\n\ndef MessageToString(message, as_utf8=False, as_one_line=False):\n  out = cStringIO.StringIO()\n  PrintMessage(message, out, as_utf8=as_utf8, as_one_line=as_one_line)\n  result = out.getvalue()\n  out.close()\n  if as_one_line:\n    return result.rstrip()\n  return result\n\n\ndef PrintMessage(message, out, indent=0, as_utf8=False, as_one_line=False):\n  for field, value in message.ListFields():\n    if field.label == descriptor.FieldDescriptor.LABEL_REPEATED:\n      for element in value:\n        PrintField(field, element, out, indent, as_utf8, as_one_line)\n    else:\n      PrintField(field, value, out, indent, as_utf8, as_one_line)\n\n\ndef PrintField(field, value, out, indent=0, as_utf8=False, as_one_line=False):\n  \"\"\"Print a single field name/value pair.  For repeated fields, the value\n  should be a single element.\"\"\"\n\n  out.write(' ' * indent);\n  if field.is_extension:\n    out.write('[')\n    if (field.containing_type.GetOptions().message_set_wire_format and\n        field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and\n        field.message_type == field.extension_scope and\n        field.label == descriptor.FieldDescriptor.LABEL_OPTIONAL):\n      out.write(field.message_type.full_name)\n    else:\n      out.write(field.full_name)\n    out.write(']')\n  elif field.type == descriptor.FieldDescriptor.TYPE_GROUP:\n    # For groups, use the capitalized name.\n    out.write(field.message_type.name)\n  else:\n    out.write(field.name)\n\n  if field.cpp_type != descriptor.FieldDescriptor.CPPTYPE_MESSAGE:\n    # The colon is optional in this case, but our cross-language golden files\n    # don't include it.\n    out.write(': ')\n\n  PrintFieldValue(field, value, out, indent, as_utf8, as_one_line)\n  if as_one_line:\n    out.write(' ')\n  else:\n    out.write('\\n')\n\n\ndef PrintFieldValue(field, value, out, indent=0,\n                    as_utf8=False, as_one_line=False):\n  \"\"\"Print a single field value (not including name).  For repeated fields,\n  the value should be a single element.\"\"\"\n\n  if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:\n    if as_one_line:\n      out.write(' { ')\n      PrintMessage(value, out, indent, as_utf8, as_one_line)\n      out.write('}')\n    else:\n      out.write(' {\\n')\n      PrintMessage(value, out, indent + 2, as_utf8, as_one_line)\n      out.write(' ' * indent + '}')\n  elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM:\n    out.write(field.enum_type.values_by_number[value].name)\n  elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_STRING:\n    out.write('\\\"')\n    if type(value) is unicode:\n      out.write(_CEscape(value.encode('utf-8'), as_utf8))\n    else:\n      out.write(_CEscape(value, as_utf8))\n    out.write('\\\"')\n  elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_BOOL:\n    if value:\n      out.write(\"true\")\n    else:\n      out.write(\"false\")\n  else:\n    out.write(str(value))\n\n\ndef Merge(text, message):\n  \"\"\"Merges an ASCII representation of a protocol message into a message.\n\n  Args:\n    text: Message ASCII representation.\n    message: A protocol buffer message to merge into.\n\n  Raises:\n    ParseError: On ASCII parsing problems.\n  \"\"\"\n  tokenizer = _Tokenizer(text)\n  while not tokenizer.AtEnd():\n    _MergeField(tokenizer, message)\n\n\ndef _MergeField(tokenizer, message):\n  \"\"\"Merges a single protocol message field into a message.\n\n  Args:\n    tokenizer: A tokenizer to parse the field name and values.\n    message: A protocol message to record the data.\n\n  Raises:\n    ParseError: In case of ASCII parsing problems.\n  \"\"\"\n  message_descriptor = message.DESCRIPTOR\n  if tokenizer.TryConsume('['):\n    name = [tokenizer.ConsumeIdentifier()]\n    while tokenizer.TryConsume('.'):\n      name.append(tokenizer.ConsumeIdentifier())\n    name = '.'.join(name)\n\n    if not message_descriptor.is_extendable:\n      raise tokenizer.ParseErrorPreviousToken(\n          'Message type \"%s\" does not have extensions.' %\n          message_descriptor.full_name)\n    field = message.Extensions._FindExtensionByName(name)\n    if not field:\n      raise tokenizer.ParseErrorPreviousToken(\n          'Extension \"%s\" not registered.' % name)\n    elif message_descriptor != field.containing_type:\n      raise tokenizer.ParseErrorPreviousToken(\n          'Extension \"%s\" does not extend message type \"%s\".' % (\n              name, message_descriptor.full_name))\n    tokenizer.Consume(']')\n  else:\n    name = tokenizer.ConsumeIdentifier()\n    field = message_descriptor.fields_by_name.get(name, None)\n\n    # Group names are expected to be capitalized as they appear in the\n    # .proto file, which actually matches their type names, not their field\n    # names.\n    if not field:\n      field = message_descriptor.fields_by_name.get(name.lower(), None)\n      if field and field.type != descriptor.FieldDescriptor.TYPE_GROUP:\n        field = None\n\n    if (field and field.type == descriptor.FieldDescriptor.TYPE_GROUP and\n        field.message_type.name != name):\n      field = None\n\n    if not field:\n      raise tokenizer.ParseErrorPreviousToken(\n          'Message type \"%s\" has no field named \"%s\".' % (\n              message_descriptor.full_name, name))\n\n  if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE:\n    tokenizer.TryConsume(':')\n\n    if tokenizer.TryConsume('<'):\n      end_token = '>'\n    else:\n      tokenizer.Consume('{')\n      end_token = '}'\n\n    if field.label == descriptor.FieldDescriptor.LABEL_REPEATED:\n      if field.is_extension:\n        sub_message = message.Extensions[field].add()\n      else:\n        sub_message = getattr(message, field.name).add()\n    else:\n      if field.is_extension:\n        sub_message = message.Extensions[field]\n      else:\n        sub_message = getattr(message, field.name)\n      sub_message.SetInParent()\n\n    while not tokenizer.TryConsume(end_token):\n      if tokenizer.AtEnd():\n        raise tokenizer.ParseErrorPreviousToken('Expected \"%s\".' % (end_token))\n      _MergeField(tokenizer, sub_message)\n  else:\n    _MergeScalarField(tokenizer, message, field)\n\n\ndef _MergeScalarField(tokenizer, message, field):\n  \"\"\"Merges a single protocol message scalar field into a message.\n\n  Args:\n    tokenizer: A tokenizer to parse the field value.\n    message: A protocol message to record the data.\n    field: The descriptor of the field to be merged.\n\n  Raises:\n    ParseError: In case of ASCII parsing problems.\n    RuntimeError: On runtime errors.\n  \"\"\"\n  tokenizer.Consume(':')\n  value = None\n\n  if field.type in (descriptor.FieldDescriptor.TYPE_INT32,\n                    descriptor.FieldDescriptor.TYPE_SINT32,\n                    descriptor.FieldDescriptor.TYPE_SFIXED32):\n    value = tokenizer.ConsumeInt32()\n  elif field.type in (descriptor.FieldDescriptor.TYPE_INT64,\n                      descriptor.FieldDescriptor.TYPE_SINT64,\n                      descriptor.FieldDescriptor.TYPE_SFIXED64):\n    value = tokenizer.ConsumeInt64()\n  elif field.type in (descriptor.FieldDescriptor.TYPE_UINT32,\n                      descriptor.FieldDescriptor.TYPE_FIXED32):\n    value = tokenizer.ConsumeUint32()\n  elif field.type in (descriptor.FieldDescriptor.TYPE_UINT64,\n                      descriptor.FieldDescriptor.TYPE_FIXED64):\n    value = tokenizer.ConsumeUint64()\n  elif field.type in (descriptor.FieldDescriptor.TYPE_FLOAT,\n                      descriptor.FieldDescriptor.TYPE_DOUBLE):\n    value = tokenizer.ConsumeFloat()\n  elif field.type == descriptor.FieldDescriptor.TYPE_BOOL:\n    value = tokenizer.ConsumeBool()\n  elif field.type == descriptor.FieldDescriptor.TYPE_STRING:\n    value = tokenizer.ConsumeString()\n  elif field.type == descriptor.FieldDescriptor.TYPE_BYTES:\n    value = tokenizer.ConsumeByteString()\n  elif field.type == descriptor.FieldDescriptor.TYPE_ENUM:\n    # Enum can be specified by a number (the enum value), or by\n    # a string literal (the enum name).\n    enum_descriptor = field.enum_type\n    if tokenizer.LookingAtInteger():\n      number = tokenizer.ConsumeInt32()\n      enum_value = enum_descriptor.values_by_number.get(number, None)\n      if enum_value is None:\n        raise tokenizer.ParseErrorPreviousToken(\n            'Enum type \"%s\" has no value with number %d.' % (\n                enum_descriptor.full_name, number))\n    else:\n      identifier = tokenizer.ConsumeIdentifier()\n      enum_value = enum_descriptor.values_by_name.get(identifier, None)\n      if enum_value is None:\n        raise tokenizer.ParseErrorPreviousToken(\n            'Enum type \"%s\" has no value named %s.' % (\n                enum_descriptor.full_name, identifier))\n    value = enum_value.number\n  else:\n    raise RuntimeError('Unknown field type %d' % field.type)\n\n  if field.label == descriptor.FieldDescriptor.LABEL_REPEATED:\n    if field.is_extension:\n      message.Extensions[field].append(value)\n    else:\n      getattr(message, field.name).append(value)\n  else:\n    if field.is_extension:\n      message.Extensions[field] = value\n    else:\n      setattr(message, field.name, value)\n\n\nclass _Tokenizer(object):\n  \"\"\"Protocol buffer ASCII representation tokenizer.\n\n  This class handles the lower level string parsing by splitting it into\n  meaningful tokens.\n\n  It was directly ported from the Java protocol buffer API.\n  \"\"\"\n\n  _WHITESPACE = re.compile('(\\\\s|(#.*$))+', re.MULTILINE)\n  _TOKEN = re.compile(\n      '[a-zA-Z_][0-9a-zA-Z_+-]*|'           # an identifier\n      '[0-9+-][0-9a-zA-Z_.+-]*|'            # a number\n      '\\\"([^\\\"\\n\\\\\\\\]|\\\\\\\\.)*(\\\"|\\\\\\\\?$)|'  # a double-quoted string\n      '\\'([^\\'\\n\\\\\\\\]|\\\\\\\\.)*(\\'|\\\\\\\\?$)')  # a single-quoted string\n  _IDENTIFIER = re.compile('\\w+')\n  _INTEGER_CHECKERS = [type_checkers.Uint32ValueChecker(),\n                       type_checkers.Int32ValueChecker(),\n                       type_checkers.Uint64ValueChecker(),\n                       type_checkers.Int64ValueChecker()]\n  _FLOAT_INFINITY = re.compile('-?inf(inity)?f?', re.IGNORECASE)\n  _FLOAT_NAN = re.compile(\"nanf?\", re.IGNORECASE)\n\n  def __init__(self, text_message):\n    self._text_message = text_message\n\n    self._position = 0\n    self._line = -1\n    self._column = 0\n    self._token_start = None\n    self.token = ''\n    self._lines = deque(text_message.split('\\n'))\n    self._current_line = ''\n    self._previous_line = 0\n    self._previous_column = 0\n    self._SkipWhitespace()\n    self.NextToken()\n\n  def AtEnd(self):\n    \"\"\"Checks the end of the text was reached.\n\n    Returns:\n      True iff the end was reached.\n    \"\"\"\n    return self.token == ''\n\n  def _PopLine(self):\n    while len(self._current_line) <= self._column:\n      if not self._lines:\n        self._current_line = ''\n        return\n      self._line += 1\n      self._column = 0\n      self._current_line = self._lines.popleft()\n\n  def _SkipWhitespace(self):\n    while True:\n      self._PopLine()\n      match = self._WHITESPACE.match(self._current_line, self._column)\n      if not match:\n        break\n      length = len(match.group(0))\n      self._column += length\n\n  def TryConsume(self, token):\n    \"\"\"Tries to consume a given piece of text.\n\n    Args:\n      token: Text to consume.\n\n    Returns:\n      True iff the text was consumed.\n    \"\"\"\n    if self.token == token:\n      self.NextToken()\n      return True\n    return False\n\n  def Consume(self, token):\n    \"\"\"Consumes a piece of text.\n\n    Args:\n      token: Text to consume.\n\n    Raises:\n      ParseError: If the text couldn't be consumed.\n    \"\"\"\n    if not self.TryConsume(token):\n      raise self._ParseError('Expected \"%s\".' % token)\n\n  def LookingAtInteger(self):\n    \"\"\"Checks if the current token is an integer.\n\n    Returns:\n      True iff the current token is an integer.\n    \"\"\"\n    if not self.token:\n      return False\n    c = self.token[0]\n    return (c >= '0' and c <= '9') or c == '-' or c == '+'\n\n  def ConsumeIdentifier(self):\n    \"\"\"Consumes protocol message field identifier.\n\n    Returns:\n      Identifier string.\n\n    Raises:\n      ParseError: If an identifier couldn't be consumed.\n    \"\"\"\n    result = self.token\n    if not self._IDENTIFIER.match(result):\n      raise self._ParseError('Expected identifier.')\n    self.NextToken()\n    return result\n\n  def ConsumeInt32(self):\n    \"\"\"Consumes a signed 32bit integer number.\n\n    Returns:\n      The integer parsed.\n\n    Raises:\n      ParseError: If a signed 32bit integer couldn't be consumed.\n    \"\"\"\n    try:\n      result = self._ParseInteger(self.token, is_signed=True, is_long=False)\n    except ValueError, e:\n      raise self._IntegerParseError(e)\n    self.NextToken()\n    return result\n\n  def ConsumeUint32(self):\n    \"\"\"Consumes an unsigned 32bit integer number.\n\n    Returns:\n      The integer parsed.\n\n    Raises:\n      ParseError: If an unsigned 32bit integer couldn't be consumed.\n    \"\"\"\n    try:\n      result = self._ParseInteger(self.token, is_signed=False, is_long=False)\n    except ValueError, e:\n      raise self._IntegerParseError(e)\n    self.NextToken()\n    return result\n\n  def ConsumeInt64(self):\n    \"\"\"Consumes a signed 64bit integer number.\n\n    Returns:\n      The integer parsed.\n\n    Raises:\n      ParseError: If a signed 64bit integer couldn't be consumed.\n    \"\"\"\n    try:\n      result = self._ParseInteger(self.token, is_signed=True, is_long=True)\n    except ValueError, e:\n      raise self._IntegerParseError(e)\n    self.NextToken()\n    return result\n\n  def ConsumeUint64(self):\n    \"\"\"Consumes an unsigned 64bit integer number.\n\n    Returns:\n      The integer parsed.\n\n    Raises:\n      ParseError: If an unsigned 64bit integer couldn't be consumed.\n    \"\"\"\n    try:\n      result = self._ParseInteger(self.token, is_signed=False, is_long=True)\n    except ValueError, e:\n      raise self._IntegerParseError(e)\n    self.NextToken()\n    return result\n\n  def ConsumeFloat(self):\n    \"\"\"Consumes an floating point number.\n\n    Returns:\n      The number parsed.\n\n    Raises:\n      ParseError: If a floating point number couldn't be consumed.\n    \"\"\"\n    text = self.token\n    if self._FLOAT_INFINITY.match(text):\n      self.NextToken()\n      if text.startswith('-'):\n        return -_INFINITY\n      return _INFINITY\n\n    if self._FLOAT_NAN.match(text):\n      self.NextToken()\n      return _NAN\n\n    try:\n      result = float(text)\n    except ValueError, e:\n      raise self._FloatParseError(e)\n    self.NextToken()\n    return result\n\n  def ConsumeBool(self):\n    \"\"\"Consumes a boolean value.\n\n    Returns:\n      The bool parsed.\n\n    Raises:\n      ParseError: If a boolean value couldn't be consumed.\n    \"\"\"\n    if self.token in ('true', 't', '1'):\n      self.NextToken()\n      return True\n    elif self.token in ('false', 'f', '0'):\n      self.NextToken()\n      return False\n    else:\n      raise self._ParseError('Expected \"true\" or \"false\".')\n\n  def ConsumeString(self):\n    \"\"\"Consumes a string value.\n\n    Returns:\n      The string parsed.\n\n    Raises:\n      ParseError: If a string value couldn't be consumed.\n    \"\"\"\n    bytes = self.ConsumeByteString()\n    try:\n      return unicode(bytes, 'utf-8')\n    except UnicodeDecodeError, e:\n      raise self._StringParseError(e)\n\n  def ConsumeByteString(self):\n    \"\"\"Consumes a byte array value.\n\n    Returns:\n      The array parsed (as a string).\n\n    Raises:\n      ParseError: If a byte array value couldn't be consumed.\n    \"\"\"\n    list = [self._ConsumeSingleByteString()]\n    while len(self.token) > 0 and self.token[0] in ('\\'', '\"'):\n      list.append(self._ConsumeSingleByteString())\n    return \"\".join(list)\n\n  def _ConsumeSingleByteString(self):\n    \"\"\"Consume one token of a string literal.\n\n    String literals (whether bytes or text) can come in multiple adjacent\n    tokens which are automatically concatenated, like in C or Python.  This\n    method only consumes one token.\n    \"\"\"\n    text = self.token\n    if len(text) < 1 or text[0] not in ('\\'', '\"'):\n      raise self._ParseError('Exptected string.')\n\n    if len(text) < 2 or text[-1] != text[0]:\n      raise self._ParseError('String missing ending quote.')\n\n    try:\n      result = _CUnescape(text[1:-1])\n    except ValueError, e:\n      raise self._ParseError(str(e))\n    self.NextToken()\n    return result\n\n  def _ParseInteger(self, text, is_signed=False, is_long=False):\n    \"\"\"Parses an integer.\n\n    Args:\n      text: The text to parse.\n      is_signed: True if a signed integer must be parsed.\n      is_long: True if a long integer must be parsed.\n\n    Returns:\n      The integer value.\n\n    Raises:\n      ValueError: Thrown Iff the text is not a valid integer.\n    \"\"\"\n    pos = 0\n    if text.startswith('-'):\n      pos += 1\n\n    base = 10\n    if text.startswith('0x', pos) or text.startswith('0X', pos):\n      base = 16\n    elif text.startswith('0', pos):\n      base = 8\n\n    # Do the actual parsing. Exception handling is propagated to caller.\n    result = int(text, base)\n\n    # Check if the integer is sane. Exceptions handled by callers.\n    checker = self._INTEGER_CHECKERS[2 * int(is_long) + int(is_signed)]\n    checker.CheckValue(result)\n    return result\n\n  def ParseErrorPreviousToken(self, message):\n    \"\"\"Creates and *returns* a ParseError for the previously read token.\n\n    Args:\n      message: A message to set for the exception.\n\n    Returns:\n      A ParseError instance.\n    \"\"\"\n    return ParseError('%d:%d : %s' % (\n        self._previous_line + 1, self._previous_column + 1, message))\n\n  def _ParseError(self, message):\n    \"\"\"Creates and *returns* a ParseError for the current token.\"\"\"\n    return ParseError('%d:%d : %s' % (\n        self._line + 1, self._column - len(self.token) + 1, message))\n\n  def _IntegerParseError(self, e):\n    return self._ParseError('Couldn\\'t parse integer: ' + str(e))\n\n  def _FloatParseError(self, e):\n    return self._ParseError('Couldn\\'t parse number: ' + str(e))\n\n  def _StringParseError(self, e):\n    return self._ParseError('Couldn\\'t parse string: ' + str(e))\n\n  def NextToken(self):\n    \"\"\"Reads the next meaningful token.\"\"\"\n    self._previous_line = self._line\n    self._previous_column = self._column\n\n    self._column += len(self.token)\n    self._SkipWhitespace()\n\n    if not self._lines and len(self._current_line) <= self._column:\n      self.token = ''\n      return\n\n    match = self._TOKEN.match(self._current_line, self._column)\n    if match:\n      token = match.group(0)\n      self.token = token\n    else:\n      self.token = self._current_line[self._column]\n\n\n# text.encode('string_escape') does not seem to satisfy our needs as it\n# encodes unprintable characters using two-digit hex escapes whereas our\n# C++ unescaping function allows hex escapes to be any length.  So,\n# \"\\0011\".encode('string_escape') ends up being \"\\\\x011\", which will be\n# decoded in C++ as a single-character string with char code 0x11.\ndef _CEscape(text, as_utf8):\n  def escape(c):\n    o = ord(c)\n    if o == 10: return r\"\\n\"   # optional escape\n    if o == 13: return r\"\\r\"   # optional escape\n    if o ==  9: return r\"\\t\"   # optional escape\n    if o == 39: return r\"\\'\"   # optional escape\n\n    if o == 34: return r'\\\"'   # necessary escape\n    if o == 92: return r\"\\\\\"   # necessary escape\n\n    # necessary escapes\n    if not as_utf8 and (o >= 127 or o < 32): return \"\\\\%03o\" % o\n    return c\n  return \"\".join([escape(c) for c in text])\n\n\n_CUNESCAPE_HEX = re.compile('\\\\\\\\x([0-9a-fA-F]{2}|[0-9a-fA-F])')\n\n\ndef _CUnescape(text):\n  def ReplaceHex(m):\n    return chr(int(m.group(0)[2:], 16))\n  # This is required because the 'string_escape' encoding doesn't\n  # allow single-digit hex escapes (like '\\xf').\n  result = _CUNESCAPE_HEX.sub(ReplaceHex, text)\n  return result.decode('string_escape')\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/mox.py",
    "content": "#!/usr/bin/python2.4\n#\n# Copyright 2008 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# This file is used for testing.  The original is at:\n#   http://code.google.com/p/pymox/\n\n\"\"\"Mox, an object-mocking framework for Python.\n\nMox works in the record-replay-verify paradigm.  When you first create\na mock object, it is in record mode.  You then programmatically set\nthe expected behavior of the mock object (what methods are to be\ncalled on it, with what parameters, what they should return, and in\nwhat order).\n\nOnce you have set up the expected mock behavior, you put it in replay\nmode.  Now the mock responds to method calls just as you told it to.\nIf an unexpected method (or an expected method with unexpected\nparameters) is called, then an exception will be raised.\n\nOnce you are done interacting with the mock, you need to verify that\nall the expected interactions occured.  (Maybe your code exited\nprematurely without calling some cleanup method!)  The verify phase\nensures that every expected method was called; otherwise, an exception\nwill be raised.\n\nSuggested usage / workflow:\n\n  # Create Mox factory\n  my_mox = Mox()\n\n  # Create a mock data access object\n  mock_dao = my_mox.CreateMock(DAOClass)\n\n  # Set up expected behavior\n  mock_dao.RetrievePersonWithIdentifier('1').AndReturn(person)\n  mock_dao.DeletePerson(person)\n\n  # Put mocks in replay mode\n  my_mox.ReplayAll()\n\n  # Inject mock object and run test\n  controller.SetDao(mock_dao)\n  controller.DeletePersonById('1')\n\n  # Verify all methods were called as expected\n  my_mox.VerifyAll()\n\"\"\"\n\nfrom collections import deque\nimport re\nimport types\nimport unittest\n\nimport stubout\n\nclass Error(AssertionError):\n  \"\"\"Base exception for this module.\"\"\"\n\n  pass\n\n\nclass ExpectedMethodCallsError(Error):\n  \"\"\"Raised when Verify() is called before all expected methods have been called\n  \"\"\"\n\n  def __init__(self, expected_methods):\n    \"\"\"Init exception.\n\n    Args:\n      # expected_methods: A sequence of MockMethod objects that should have been\n      #   called.\n      expected_methods: [MockMethod]\n\n    Raises:\n      ValueError: if expected_methods contains no methods.\n    \"\"\"\n\n    if not expected_methods:\n      raise ValueError(\"There must be at least one expected method\")\n    Error.__init__(self)\n    self._expected_methods = expected_methods\n\n  def __str__(self):\n    calls = \"\\n\".join([\"%3d.  %s\" % (i, m)\n                       for i, m in enumerate(self._expected_methods)])\n    return \"Verify: Expected methods never called:\\n%s\" % (calls,)\n\n\nclass UnexpectedMethodCallError(Error):\n  \"\"\"Raised when an unexpected method is called.\n\n  This can occur if a method is called with incorrect parameters, or out of the\n  specified order.\n  \"\"\"\n\n  def __init__(self, unexpected_method, expected):\n    \"\"\"Init exception.\n\n    Args:\n      # unexpected_method: MockMethod that was called but was not at the head of\n      #   the expected_method queue.\n      # expected: MockMethod or UnorderedGroup the method should have\n      #   been in.\n      unexpected_method: MockMethod\n      expected: MockMethod or UnorderedGroup\n    \"\"\"\n\n    Error.__init__(self)\n    self._unexpected_method = unexpected_method\n    self._expected = expected\n\n  def __str__(self):\n    return \"Unexpected method call: %s.  Expecting: %s\" % \\\n      (self._unexpected_method, self._expected)\n\n\nclass UnknownMethodCallError(Error):\n  \"\"\"Raised if an unknown method is requested of the mock object.\"\"\"\n\n  def __init__(self, unknown_method_name):\n    \"\"\"Init exception.\n\n    Args:\n      # unknown_method_name: Method call that is not part of the mocked class's\n      #   public interface.\n      unknown_method_name: str\n    \"\"\"\n\n    Error.__init__(self)\n    self._unknown_method_name = unknown_method_name\n\n  def __str__(self):\n    return \"Method called is not a member of the object: %s\" % \\\n      self._unknown_method_name\n\n\nclass Mox(object):\n  \"\"\"Mox: a factory for creating mock objects.\"\"\"\n\n  # A list of types that should be stubbed out with MockObjects (as\n  # opposed to MockAnythings).\n  _USE_MOCK_OBJECT = [types.ClassType, types.InstanceType, types.ModuleType,\n                      types.ObjectType, types.TypeType]\n\n  def __init__(self):\n    \"\"\"Initialize a new Mox.\"\"\"\n\n    self._mock_objects = []\n    self.stubs = stubout.StubOutForTesting()\n\n  def CreateMock(self, class_to_mock):\n    \"\"\"Create a new mock object.\n\n    Args:\n      # class_to_mock: the class to be mocked\n      class_to_mock: class\n\n    Returns:\n      MockObject that can be used as the class_to_mock would be.\n    \"\"\"\n\n    new_mock = MockObject(class_to_mock)\n    self._mock_objects.append(new_mock)\n    return new_mock\n\n  def CreateMockAnything(self):\n    \"\"\"Create a mock that will accept any method calls.\n\n    This does not enforce an interface.\n    \"\"\"\n\n    new_mock = MockAnything()\n    self._mock_objects.append(new_mock)\n    return new_mock\n\n  def ReplayAll(self):\n    \"\"\"Set all mock objects to replay mode.\"\"\"\n\n    for mock_obj in self._mock_objects:\n      mock_obj._Replay()\n\n\n  def VerifyAll(self):\n    \"\"\"Call verify on all mock objects created.\"\"\"\n\n    for mock_obj in self._mock_objects:\n      mock_obj._Verify()\n\n  def ResetAll(self):\n    \"\"\"Call reset on all mock objects.  This does not unset stubs.\"\"\"\n\n    for mock_obj in self._mock_objects:\n      mock_obj._Reset()\n\n  def StubOutWithMock(self, obj, attr_name, use_mock_anything=False):\n    \"\"\"Replace a method, attribute, etc. with a Mock.\n\n    This will replace a class or module with a MockObject, and everything else\n    (method, function, etc) with a MockAnything.  This can be overridden to\n    always use a MockAnything by setting use_mock_anything to True.\n\n    Args:\n      obj: A Python object (class, module, instance, callable).\n      attr_name: str.  The name of the attribute to replace with a mock.\n      use_mock_anything: bool. True if a MockAnything should be used regardless\n        of the type of attribute.\n    \"\"\"\n\n    attr_to_replace = getattr(obj, attr_name)\n    if type(attr_to_replace) in self._USE_MOCK_OBJECT and not use_mock_anything:\n      stub = self.CreateMock(attr_to_replace)\n    else:\n      stub = self.CreateMockAnything()\n\n    self.stubs.Set(obj, attr_name, stub)\n\n  def UnsetStubs(self):\n    \"\"\"Restore stubs to their original state.\"\"\"\n\n    self.stubs.UnsetAll()\n\ndef Replay(*args):\n  \"\"\"Put mocks into Replay mode.\n\n  Args:\n    # args is any number of mocks to put into replay mode.\n  \"\"\"\n\n  for mock in args:\n    mock._Replay()\n\n\ndef Verify(*args):\n  \"\"\"Verify mocks.\n\n  Args:\n    # args is any number of mocks to be verified.\n  \"\"\"\n\n  for mock in args:\n    mock._Verify()\n\n\ndef Reset(*args):\n  \"\"\"Reset mocks.\n\n  Args:\n    # args is any number of mocks to be reset.\n  \"\"\"\n\n  for mock in args:\n    mock._Reset()\n\n\nclass MockAnything:\n  \"\"\"A mock that can be used to mock anything.\n\n  This is helpful for mocking classes that do not provide a public interface.\n  \"\"\"\n\n  def __init__(self):\n    \"\"\" \"\"\"\n    self._Reset()\n\n  def __getattr__(self, method_name):\n    \"\"\"Intercept method calls on this object.\n\n     A new MockMethod is returned that is aware of the MockAnything's\n     state (record or replay).  The call will be recorded or replayed\n     by the MockMethod's __call__.\n\n    Args:\n      # method name: the name of the method being called.\n      method_name: str\n\n    Returns:\n      A new MockMethod aware of MockAnything's state (record or replay).\n    \"\"\"\n\n    return self._CreateMockMethod(method_name)\n\n  def _CreateMockMethod(self, method_name):\n    \"\"\"Create a new mock method call and return it.\n\n    Args:\n      # method name: the name of the method being called.\n      method_name: str\n\n    Returns:\n      A new MockMethod aware of MockAnything's state (record or replay).\n    \"\"\"\n\n    return MockMethod(method_name, self._expected_calls_queue,\n                      self._replay_mode)\n\n  def __nonzero__(self):\n    \"\"\"Return 1 for nonzero so the mock can be used as a conditional.\"\"\"\n\n    return 1\n\n  def __eq__(self, rhs):\n    \"\"\"Provide custom logic to compare objects.\"\"\"\n\n    return (isinstance(rhs, MockAnything) and\n            self._replay_mode == rhs._replay_mode and\n            self._expected_calls_queue == rhs._expected_calls_queue)\n\n  def __ne__(self, rhs):\n    \"\"\"Provide custom logic to compare objects.\"\"\"\n\n    return not self == rhs\n\n  def _Replay(self):\n    \"\"\"Start replaying expected method calls.\"\"\"\n\n    self._replay_mode = True\n\n  def _Verify(self):\n    \"\"\"Verify that all of the expected calls have been made.\n\n    Raises:\n      ExpectedMethodCallsError: if there are still more method calls in the\n        expected queue.\n    \"\"\"\n\n    # If the list of expected calls is not empty, raise an exception\n    if self._expected_calls_queue:\n      # The last MultipleTimesGroup is not popped from the queue.\n      if (len(self._expected_calls_queue) == 1 and\n          isinstance(self._expected_calls_queue[0], MultipleTimesGroup) and\n          self._expected_calls_queue[0].IsSatisfied()):\n        pass\n      else:\n        raise ExpectedMethodCallsError(self._expected_calls_queue)\n\n  def _Reset(self):\n    \"\"\"Reset the state of this mock to record mode with an empty queue.\"\"\"\n\n    # Maintain a list of method calls we are expecting\n    self._expected_calls_queue = deque()\n\n    # Make sure we are in setup mode, not replay mode\n    self._replay_mode = False\n\n\nclass MockObject(MockAnything, object):\n  \"\"\"A mock object that simulates the public/protected interface of a class.\"\"\"\n\n  def __init__(self, class_to_mock):\n    \"\"\"Initialize a mock object.\n\n    This determines the methods and properties of the class and stores them.\n\n    Args:\n      # class_to_mock: class to be mocked\n      class_to_mock: class\n    \"\"\"\n\n    # This is used to hack around the mixin/inheritance of MockAnything, which\n    # is not a proper object (it can be anything. :-)\n    MockAnything.__dict__['__init__'](self)\n\n    # Get a list of all the public and special methods we should mock.\n    self._known_methods = set()\n    self._known_vars = set()\n    self._class_to_mock = class_to_mock\n    for method in dir(class_to_mock):\n      if callable(getattr(class_to_mock, method)):\n        self._known_methods.add(method)\n      else:\n        self._known_vars.add(method)\n\n  def __getattr__(self, name):\n    \"\"\"Intercept attribute request on this object.\n\n    If the attribute is a public class variable, it will be returned and not\n    recorded as a call.\n\n    If the attribute is not a variable, it is handled like a method\n    call. The method name is checked against the set of mockable\n    methods, and a new MockMethod is returned that is aware of the\n    MockObject's state (record or replay).  The call will be recorded\n    or replayed by the MockMethod's __call__.\n\n    Args:\n      # name: the name of the attribute being requested.\n      name: str\n\n    Returns:\n      Either a class variable or a new MockMethod that is aware of the state\n      of the mock (record or replay).\n\n    Raises:\n      UnknownMethodCallError if the MockObject does not mock the requested\n          method.\n    \"\"\"\n\n    if name in self._known_vars:\n      return getattr(self._class_to_mock, name)\n\n    if name in self._known_methods:\n      return self._CreateMockMethod(name)\n\n    raise UnknownMethodCallError(name)\n\n  def __eq__(self, rhs):\n    \"\"\"Provide custom logic to compare objects.\"\"\"\n\n    return (isinstance(rhs, MockObject) and\n            self._class_to_mock == rhs._class_to_mock and\n            self._replay_mode == rhs._replay_mode and\n            self._expected_calls_queue == rhs._expected_calls_queue)\n\n  def __setitem__(self, key, value):\n    \"\"\"Provide custom logic for mocking classes that support item assignment.\n\n    Args:\n      key: Key to set the value for.\n      value: Value to set.\n\n    Returns:\n      Expected return value in replay mode.  A MockMethod object for the\n      __setitem__ method that has already been called if not in replay mode.\n\n    Raises:\n      TypeError if the underlying class does not support item assignment.\n      UnexpectedMethodCallError if the object does not expect the call to\n        __setitem__.\n\n    \"\"\"\n    setitem = self._class_to_mock.__dict__.get('__setitem__', None)\n\n    # Verify the class supports item assignment.\n    if setitem is None:\n      raise TypeError('object does not support item assignment')\n\n    # If we are in replay mode then simply call the mock __setitem__ method.\n    if self._replay_mode:\n      return MockMethod('__setitem__', self._expected_calls_queue,\n                        self._replay_mode)(key, value)\n\n\n    # Otherwise, create a mock method __setitem__.\n    return self._CreateMockMethod('__setitem__')(key, value)\n\n  def __getitem__(self, key):\n    \"\"\"Provide custom logic for mocking classes that are subscriptable.\n\n    Args:\n      key: Key to return the value for.\n\n    Returns:\n      Expected return value in replay mode.  A MockMethod object for the\n      __getitem__ method that has already been called if not in replay mode.\n\n    Raises:\n      TypeError if the underlying class is not subscriptable.\n      UnexpectedMethodCallError if the object does not expect the call to\n        __setitem__.\n\n    \"\"\"\n    getitem = self._class_to_mock.__dict__.get('__getitem__', None)\n\n    # Verify the class supports item assignment.\n    if getitem is None:\n      raise TypeError('unsubscriptable object')\n\n    # If we are in replay mode then simply call the mock __getitem__ method.\n    if self._replay_mode:\n      return MockMethod('__getitem__', self._expected_calls_queue,\n                        self._replay_mode)(key)\n\n\n    # Otherwise, create a mock method __getitem__.\n    return self._CreateMockMethod('__getitem__')(key)\n\n  def __call__(self, *params, **named_params):\n    \"\"\"Provide custom logic for mocking classes that are callable.\"\"\"\n\n    # Verify the class we are mocking is callable\n    callable = self._class_to_mock.__dict__.get('__call__', None)\n    if callable is None:\n      raise TypeError('Not callable')\n\n    # Because the call is happening directly on this object instead of a method,\n    # the call on the mock method is made right here\n    mock_method = self._CreateMockMethod('__call__')\n    return mock_method(*params, **named_params)\n\n  @property\n  def __class__(self):\n    \"\"\"Return the class that is being mocked.\"\"\"\n\n    return self._class_to_mock\n\n\nclass MockMethod(object):\n  \"\"\"Callable mock method.\n\n  A MockMethod should act exactly like the method it mocks, accepting parameters\n  and returning a value, or throwing an exception (as specified).  When this\n  method is called, it can optionally verify whether the called method (name and\n  signature) matches the expected method.\n  \"\"\"\n\n  def __init__(self, method_name, call_queue, replay_mode):\n    \"\"\"Construct a new mock method.\n\n    Args:\n      # method_name: the name of the method\n      # call_queue: deque of calls, verify this call against the head, or add\n      #     this call to the queue.\n      # replay_mode: False if we are recording, True if we are verifying calls\n      #     against the call queue.\n      method_name: str\n      call_queue: list or deque\n      replay_mode: bool\n    \"\"\"\n\n    self._name = method_name\n    self._call_queue = call_queue\n    if not isinstance(call_queue, deque):\n      self._call_queue = deque(self._call_queue)\n    self._replay_mode = replay_mode\n\n    self._params = None\n    self._named_params = None\n    self._return_value = None\n    self._exception = None\n    self._side_effects = None\n\n  def __call__(self, *params, **named_params):\n    \"\"\"Log parameters and return the specified return value.\n\n    If the Mock(Anything/Object) associated with this call is in record mode,\n    this MockMethod will be pushed onto the expected call queue.  If the mock\n    is in replay mode, this will pop a MockMethod off the top of the queue and\n    verify this call is equal to the expected call.\n\n    Raises:\n      UnexpectedMethodCall if this call is supposed to match an expected method\n        call and it does not.\n    \"\"\"\n\n    self._params = params\n    self._named_params = named_params\n\n    if not self._replay_mode:\n      self._call_queue.append(self)\n      return self\n\n    expected_method = self._VerifyMethodCall()\n\n    if expected_method._side_effects:\n      expected_method._side_effects(*params, **named_params)\n\n    if expected_method._exception:\n      raise expected_method._exception\n\n    return expected_method._return_value\n\n  def __getattr__(self, name):\n    \"\"\"Raise an AttributeError with a helpful message.\"\"\"\n\n    raise AttributeError('MockMethod has no attribute \"%s\". '\n        'Did you remember to put your mocks in replay mode?' % name)\n\n  def _PopNextMethod(self):\n    \"\"\"Pop the next method from our call queue.\"\"\"\n    try:\n      return self._call_queue.popleft()\n    except IndexError:\n      raise UnexpectedMethodCallError(self, None)\n\n  def _VerifyMethodCall(self):\n    \"\"\"Verify the called method is expected.\n\n    This can be an ordered method, or part of an unordered set.\n\n    Returns:\n      The expected mock method.\n\n    Raises:\n      UnexpectedMethodCall if the method called was not expected.\n    \"\"\"\n\n    expected = self._PopNextMethod()\n\n    # Loop here, because we might have a MethodGroup followed by another\n    # group.\n    while isinstance(expected, MethodGroup):\n      expected, method = expected.MethodCalled(self)\n      if method is not None:\n        return method\n\n    # This is a mock method, so just check equality.\n    if expected != self:\n      raise UnexpectedMethodCallError(self, expected)\n\n    return expected\n\n  def __str__(self):\n    params = ', '.join(\n        [repr(p) for p in self._params or []] +\n        ['%s=%r' % x for x in sorted((self._named_params or {}).items())])\n    desc = \"%s(%s) -> %r\" % (self._name, params, self._return_value)\n    return desc\n\n  def __eq__(self, rhs):\n    \"\"\"Test whether this MockMethod is equivalent to another MockMethod.\n\n    Args:\n      # rhs: the right hand side of the test\n      rhs: MockMethod\n    \"\"\"\n\n    return (isinstance(rhs, MockMethod) and\n            self._name == rhs._name and\n            self._params == rhs._params and\n            self._named_params == rhs._named_params)\n\n  def __ne__(self, rhs):\n    \"\"\"Test whether this MockMethod is not equivalent to another MockMethod.\n\n    Args:\n      # rhs: the right hand side of the test\n      rhs: MockMethod\n    \"\"\"\n\n    return not self == rhs\n\n  def GetPossibleGroup(self):\n    \"\"\"Returns a possible group from the end of the call queue or None if no\n    other methods are on the stack.\n    \"\"\"\n\n    # Remove this method from the tail of the queue so we can add it to a group.\n    this_method = self._call_queue.pop()\n    assert this_method == self\n\n    # Determine if the tail of the queue is a group, or just a regular ordered\n    # mock method.\n    group = None\n    try:\n      group = self._call_queue[-1]\n    except IndexError:\n      pass\n\n    return group\n\n  def _CheckAndCreateNewGroup(self, group_name, group_class):\n    \"\"\"Checks if the last method (a possible group) is an instance of our\n    group_class. Adds the current method to this group or creates a new one.\n\n    Args:\n\n      group_name: the name of the group.\n      group_class: the class used to create instance of this new group\n    \"\"\"\n    group = self.GetPossibleGroup()\n\n    # If this is a group, and it is the correct group, add the method.\n    if isinstance(group, group_class) and group.group_name() == group_name:\n      group.AddMethod(self)\n      return self\n\n    # Create a new group and add the method.\n    new_group = group_class(group_name)\n    new_group.AddMethod(self)\n    self._call_queue.append(new_group)\n    return self\n\n  def InAnyOrder(self, group_name=\"default\"):\n    \"\"\"Move this method into a group of unordered calls.\n\n    A group of unordered calls must be defined together, and must be executed\n    in full before the next expected method can be called.  There can be\n    multiple groups that are expected serially, if they are given\n    different group names.  The same group name can be reused if there is a\n    standard method call, or a group with a different name, spliced between\n    usages.\n\n    Args:\n      group_name: the name of the unordered group.\n\n    Returns:\n      self\n    \"\"\"\n    return self._CheckAndCreateNewGroup(group_name, UnorderedGroup)\n\n  def MultipleTimes(self, group_name=\"default\"):\n    \"\"\"Move this method into group of calls which may be called multiple times.\n\n    A group of repeating calls must be defined together, and must be executed in\n    full before the next expected mehtod can be called.\n\n    Args:\n      group_name: the name of the unordered group.\n\n    Returns:\n      self\n    \"\"\"\n    return self._CheckAndCreateNewGroup(group_name, MultipleTimesGroup)\n\n  def AndReturn(self, return_value):\n    \"\"\"Set the value to return when this method is called.\n\n    Args:\n      # return_value can be anything.\n    \"\"\"\n\n    self._return_value = return_value\n    return return_value\n\n  def AndRaise(self, exception):\n    \"\"\"Set the exception to raise when this method is called.\n\n    Args:\n      # exception: the exception to raise when this method is called.\n      exception: Exception\n    \"\"\"\n\n    self._exception = exception\n\n  def WithSideEffects(self, side_effects):\n    \"\"\"Set the side effects that are simulated when this method is called.\n\n    Args:\n      side_effects: A callable which modifies the parameters or other relevant\n        state which a given test case depends on.\n\n    Returns:\n      Self for chaining with AndReturn and AndRaise.\n    \"\"\"\n    self._side_effects = side_effects\n    return self\n\nclass Comparator:\n  \"\"\"Base class for all Mox comparators.\n\n  A Comparator can be used as a parameter to a mocked method when the exact\n  value is not known.  For example, the code you are testing might build up a\n  long SQL string that is passed to your mock DAO. You're only interested that\n  the IN clause contains the proper primary keys, so you can set your mock\n  up as follows:\n\n  mock_dao.RunQuery(StrContains('IN (1, 2, 4, 5)')).AndReturn(mock_result)\n\n  Now whatever query is passed in must contain the string 'IN (1, 2, 4, 5)'.\n\n  A Comparator may replace one or more parameters, for example:\n  # return at most 10 rows\n  mock_dao.RunQuery(StrContains('SELECT'), 10)\n\n  or\n\n  # Return some non-deterministic number of rows\n  mock_dao.RunQuery(StrContains('SELECT'), IsA(int))\n  \"\"\"\n\n  def equals(self, rhs):\n    \"\"\"Special equals method that all comparators must implement.\n\n    Args:\n      rhs: any python object\n    \"\"\"\n\n    raise NotImplementedError, 'method must be implemented by a subclass.'\n\n  def __eq__(self, rhs):\n    return self.equals(rhs)\n\n  def __ne__(self, rhs):\n    return not self.equals(rhs)\n\n\nclass IsA(Comparator):\n  \"\"\"This class wraps a basic Python type or class.  It is used to verify\n  that a parameter is of the given type or class.\n\n  Example:\n  mock_dao.Connect(IsA(DbConnectInfo))\n  \"\"\"\n\n  def __init__(self, class_name):\n    \"\"\"Initialize IsA\n\n    Args:\n      class_name: basic python type or a class\n    \"\"\"\n\n    self._class_name = class_name\n\n  def equals(self, rhs):\n    \"\"\"Check to see if the RHS is an instance of class_name.\n\n    Args:\n      # rhs: the right hand side of the test\n      rhs: object\n\n    Returns:\n      bool\n    \"\"\"\n\n    try:\n      return isinstance(rhs, self._class_name)\n    except TypeError:\n      # Check raw types if there was a type error.  This is helpful for\n      # things like cStringIO.StringIO.\n      return type(rhs) == type(self._class_name)\n\n  def __repr__(self):\n    return str(self._class_name)\n\nclass IsAlmost(Comparator):\n  \"\"\"Comparison class used to check whether a parameter is nearly equal\n  to a given value.  Generally useful for floating point numbers.\n\n  Example mock_dao.SetTimeout((IsAlmost(3.9)))\n  \"\"\"\n\n  def __init__(self, float_value, places=7):\n    \"\"\"Initialize IsAlmost.\n\n    Args:\n      float_value: The value for making the comparison.\n      places: The number of decimal places to round to.\n    \"\"\"\n\n    self._float_value = float_value\n    self._places = places\n\n  def equals(self, rhs):\n    \"\"\"Check to see if RHS is almost equal to float_value\n\n    Args:\n      rhs: the value to compare to float_value\n\n    Returns:\n      bool\n    \"\"\"\n\n    try:\n      return round(rhs-self._float_value, self._places) == 0\n    except TypeError:\n      # This is probably because either float_value or rhs is not a number.\n      return False\n\n  def __repr__(self):\n    return str(self._float_value)\n\nclass StrContains(Comparator):\n  \"\"\"Comparison class used to check whether a substring exists in a\n  string parameter.  This can be useful in mocking a database with SQL\n  passed in as a string parameter, for example.\n\n  Example:\n  mock_dao.RunQuery(StrContains('IN (1, 2, 4, 5)')).AndReturn(mock_result)\n  \"\"\"\n\n  def __init__(self, search_string):\n    \"\"\"Initialize.\n\n    Args:\n      # search_string: the string you are searching for\n      search_string: str\n    \"\"\"\n\n    self._search_string = search_string\n\n  def equals(self, rhs):\n    \"\"\"Check to see if the search_string is contained in the rhs string.\n\n    Args:\n      # rhs: the right hand side of the test\n      rhs: object\n\n    Returns:\n      bool\n    \"\"\"\n\n    try:\n      return rhs.find(self._search_string) > -1\n    except Exception:\n      return False\n\n  def __repr__(self):\n    return '<str containing \\'%s\\'>' % self._search_string\n\n\nclass Regex(Comparator):\n  \"\"\"Checks if a string matches a regular expression.\n\n  This uses a given regular expression to determine equality.\n  \"\"\"\n\n  def __init__(self, pattern, flags=0):\n    \"\"\"Initialize.\n\n    Args:\n      # pattern is the regular expression to search for\n      pattern: str\n      # flags passed to re.compile function as the second argument\n      flags: int\n    \"\"\"\n\n    self.regex = re.compile(pattern, flags=flags)\n\n  def equals(self, rhs):\n    \"\"\"Check to see if rhs matches regular expression pattern.\n\n    Returns:\n      bool\n    \"\"\"\n\n    return self.regex.search(rhs) is not None\n\n  def __repr__(self):\n    s = '<regular expression \\'%s\\'' % self.regex.pattern\n    if self.regex.flags:\n      s += ', flags=%d' % self.regex.flags\n    s += '>'\n    return s\n\n\nclass In(Comparator):\n  \"\"\"Checks whether an item (or key) is in a list (or dict) parameter.\n\n  Example:\n  mock_dao.GetUsersInfo(In('expectedUserName')).AndReturn(mock_result)\n  \"\"\"\n\n  def __init__(self, key):\n    \"\"\"Initialize.\n\n    Args:\n      # key is any thing that could be in a list or a key in a dict\n    \"\"\"\n\n    self._key = key\n\n  def equals(self, rhs):\n    \"\"\"Check to see whether key is in rhs.\n\n    Args:\n      rhs: dict\n\n    Returns:\n      bool\n    \"\"\"\n\n    return self._key in rhs\n\n  def __repr__(self):\n    return '<sequence or map containing \\'%s\\'>' % self._key\n\n\nclass ContainsKeyValue(Comparator):\n  \"\"\"Checks whether a key/value pair is in a dict parameter.\n\n  Example:\n  mock_dao.UpdateUsers(ContainsKeyValue('stevepm', stevepm_user_info))\n  \"\"\"\n\n  def __init__(self, key, value):\n    \"\"\"Initialize.\n\n    Args:\n      # key: a key in a dict\n      # value: the corresponding value\n    \"\"\"\n\n    self._key = key\n    self._value = value\n\n  def equals(self, rhs):\n    \"\"\"Check whether the given key/value pair is in the rhs dict.\n\n    Returns:\n      bool\n    \"\"\"\n\n    try:\n      return rhs[self._key] == self._value\n    except Exception:\n      return False\n\n  def __repr__(self):\n    return '<map containing the entry \\'%s: %s\\'>' % (self._key, self._value)\n\n\nclass SameElementsAs(Comparator):\n  \"\"\"Checks whether iterables contain the same elements (ignoring order).\n\n  Example:\n  mock_dao.ProcessUsers(SameElementsAs('stevepm', 'salomaki'))\n  \"\"\"\n\n  def __init__(self, expected_seq):\n    \"\"\"Initialize.\n\n    Args:\n      expected_seq: a sequence\n    \"\"\"\n\n    self._expected_seq = expected_seq\n\n  def equals(self, actual_seq):\n    \"\"\"Check to see whether actual_seq has same elements as expected_seq.\n\n    Args:\n      actual_seq: sequence\n\n    Returns:\n      bool\n    \"\"\"\n\n    try:\n      expected = dict([(element, None) for element in self._expected_seq])\n      actual = dict([(element, None) for element in actual_seq])\n    except TypeError:\n      # Fall back to slower list-compare if any of the objects are unhashable.\n      expected = list(self._expected_seq)\n      actual = list(actual_seq)\n      expected.sort()\n      actual.sort()\n    return expected == actual\n\n  def __repr__(self):\n    return '<sequence with same elements as \\'%s\\'>' % self._expected_seq\n\n\nclass And(Comparator):\n  \"\"\"Evaluates one or more Comparators on RHS and returns an AND of the results.\n  \"\"\"\n\n  def __init__(self, *args):\n    \"\"\"Initialize.\n\n    Args:\n      *args: One or more Comparator\n    \"\"\"\n\n    self._comparators = args\n\n  def equals(self, rhs):\n    \"\"\"Checks whether all Comparators are equal to rhs.\n\n    Args:\n      # rhs: can be anything\n\n    Returns:\n      bool\n    \"\"\"\n\n    for comparator in self._comparators:\n      if not comparator.equals(rhs):\n        return False\n\n    return True\n\n  def __repr__(self):\n    return '<AND %s>' % str(self._comparators)\n\n\nclass Or(Comparator):\n  \"\"\"Evaluates one or more Comparators on RHS and returns an OR of the results.\n  \"\"\"\n\n  def __init__(self, *args):\n    \"\"\"Initialize.\n\n    Args:\n      *args: One or more Mox comparators\n    \"\"\"\n\n    self._comparators = args\n\n  def equals(self, rhs):\n    \"\"\"Checks whether any Comparator is equal to rhs.\n\n    Args:\n      # rhs: can be anything\n\n    Returns:\n      bool\n    \"\"\"\n\n    for comparator in self._comparators:\n      if comparator.equals(rhs):\n        return True\n\n    return False\n\n  def __repr__(self):\n    return '<OR %s>' % str(self._comparators)\n\n\nclass Func(Comparator):\n  \"\"\"Call a function that should verify the parameter passed in is correct.\n\n  You may need the ability to perform more advanced operations on the parameter\n  in order to validate it.  You can use this to have a callable validate any\n  parameter. The callable should return either True or False.\n\n\n  Example:\n\n  def myParamValidator(param):\n    # Advanced logic here\n    return True\n\n  mock_dao.DoSomething(Func(myParamValidator), true)\n  \"\"\"\n\n  def __init__(self, func):\n    \"\"\"Initialize.\n\n    Args:\n      func: callable that takes one parameter and returns a bool\n    \"\"\"\n\n    self._func = func\n\n  def equals(self, rhs):\n    \"\"\"Test whether rhs passes the function test.\n\n    rhs is passed into func.\n\n    Args:\n      rhs: any python object\n\n    Returns:\n      the result of func(rhs)\n    \"\"\"\n\n    return self._func(rhs)\n\n  def __repr__(self):\n    return str(self._func)\n\n\nclass IgnoreArg(Comparator):\n  \"\"\"Ignore an argument.\n\n  This can be used when we don't care about an argument of a method call.\n\n  Example:\n  # Check if CastMagic is called with 3 as first arg and 'disappear' as third.\n  mymock.CastMagic(3, IgnoreArg(), 'disappear')\n  \"\"\"\n\n  def equals(self, unused_rhs):\n    \"\"\"Ignores arguments and returns True.\n\n    Args:\n      unused_rhs: any python object\n\n    Returns:\n      always returns True\n    \"\"\"\n\n    return True\n\n  def __repr__(self):\n    return '<IgnoreArg>'\n\n\nclass MethodGroup(object):\n  \"\"\"Base class containing common behaviour for MethodGroups.\"\"\"\n\n  def __init__(self, group_name):\n    self._group_name = group_name\n\n  def group_name(self):\n    return self._group_name\n\n  def __str__(self):\n    return '<%s \"%s\">' % (self.__class__.__name__, self._group_name)\n\n  def AddMethod(self, mock_method):\n    raise NotImplementedError\n\n  def MethodCalled(self, mock_method):\n    raise NotImplementedError\n\n  def IsSatisfied(self):\n    raise NotImplementedError\n\nclass UnorderedGroup(MethodGroup):\n  \"\"\"UnorderedGroup holds a set of method calls that may occur in any order.\n\n  This construct is helpful for non-deterministic events, such as iterating\n  over the keys of a dict.\n  \"\"\"\n\n  def __init__(self, group_name):\n    super(UnorderedGroup, self).__init__(group_name)\n    self._methods = []\n\n  def AddMethod(self, mock_method):\n    \"\"\"Add a method to this group.\n\n    Args:\n      mock_method: A mock method to be added to this group.\n    \"\"\"\n\n    self._methods.append(mock_method)\n\n  def MethodCalled(self, mock_method):\n    \"\"\"Remove a method call from the group.\n\n    If the method is not in the set, an UnexpectedMethodCallError will be\n    raised.\n\n    Args:\n      mock_method: a mock method that should be equal to a method in the group.\n\n    Returns:\n      The mock method from the group\n\n    Raises:\n      UnexpectedMethodCallError if the mock_method was not in the group.\n    \"\"\"\n\n    # Check to see if this method exists, and if so, remove it from the set\n    # and return it.\n    for method in self._methods:\n      if method == mock_method:\n        # Remove the called mock_method instead of the method in the group.\n        # The called method will match any comparators when equality is checked\n        # during removal.  The method in the group could pass a comparator to\n        # another comparator during the equality check.\n        self._methods.remove(mock_method)\n\n        # If this group is not empty, put it back at the head of the queue.\n        if not self.IsSatisfied():\n          mock_method._call_queue.appendleft(self)\n\n        return self, method\n\n    raise UnexpectedMethodCallError(mock_method, self)\n\n  def IsSatisfied(self):\n    \"\"\"Return True if there are not any methods in this group.\"\"\"\n\n    return len(self._methods) == 0\n\n\nclass MultipleTimesGroup(MethodGroup):\n  \"\"\"MultipleTimesGroup holds methods that may be called any number of times.\n\n  Note: Each method must be called at least once.\n\n  This is helpful, if you don't know or care how many times a method is called.\n  \"\"\"\n\n  def __init__(self, group_name):\n    super(MultipleTimesGroup, self).__init__(group_name)\n    self._methods = set()\n    self._methods_called = set()\n\n  def AddMethod(self, mock_method):\n    \"\"\"Add a method to this group.\n\n    Args:\n      mock_method: A mock method to be added to this group.\n    \"\"\"\n\n    self._methods.add(mock_method)\n\n  def MethodCalled(self, mock_method):\n    \"\"\"Remove a method call from the group.\n\n    If the method is not in the set, an UnexpectedMethodCallError will be\n    raised.\n\n    Args:\n      mock_method: a mock method that should be equal to a method in the group.\n\n    Returns:\n      The mock method from the group\n\n    Raises:\n      UnexpectedMethodCallError if the mock_method was not in the group.\n    \"\"\"\n\n    # Check to see if this method exists, and if so add it to the set of\n    # called methods.\n\n    for method in self._methods:\n      if method == mock_method:\n        self._methods_called.add(mock_method)\n        # Always put this group back on top of the queue, because we don't know\n        # when we are done.\n        mock_method._call_queue.appendleft(self)\n        return self, method\n\n    if self.IsSatisfied():\n      next_method = mock_method._PopNextMethod();\n      return next_method, None\n    else:\n      raise UnexpectedMethodCallError(mock_method, self)\n\n  def IsSatisfied(self):\n    \"\"\"Return True if all methods in this group are called at least once.\"\"\"\n    # NOTE(psycho): We can't use the simple set difference here because we want\n    # to match different parameters which are considered the same e.g. IsA(str)\n    # and some string. This solution is O(n^2) but n should be small.\n    tmp = self._methods.copy()\n    for called in self._methods_called:\n      for expected in tmp:\n        if called == expected:\n          tmp.remove(expected)\n          if not tmp:\n            return True\n          break\n    return False\n\n\nclass MoxMetaTestBase(type):\n  \"\"\"Metaclass to add mox cleanup and verification to every test.\n\n  As the mox unit testing class is being constructed (MoxTestBase or a\n  subclass), this metaclass will modify all test functions to call the\n  CleanUpMox method of the test class after they finish. This means that\n  unstubbing and verifying will happen for every test with no additional code,\n  and any failures will result in test failures as opposed to errors.\n  \"\"\"\n\n  def __init__(cls, name, bases, d):\n    type.__init__(cls, name, bases, d)\n\n    # also get all the attributes from the base classes to account\n    # for a case when test class is not the immediate child of MoxTestBase\n    for base in bases:\n      for attr_name in dir(base):\n        d[attr_name] = getattr(base, attr_name)\n\n    for func_name, func in d.items():\n      if func_name.startswith('test') and callable(func):\n        setattr(cls, func_name, MoxMetaTestBase.CleanUpTest(cls, func))\n\n  @staticmethod\n  def CleanUpTest(cls, func):\n    \"\"\"Adds Mox cleanup code to any MoxTestBase method.\n\n    Always unsets stubs after a test. Will verify all mocks for tests that\n    otherwise pass.\n\n    Args:\n      cls: MoxTestBase or subclass; the class whose test method we are altering.\n      func: method; the method of the MoxTestBase test class we wish to alter.\n\n    Returns:\n      The modified method.\n    \"\"\"\n    def new_method(self, *args, **kwargs):\n      mox_obj = getattr(self, 'mox', None)\n      cleanup_mox = False\n      if mox_obj and isinstance(mox_obj, Mox):\n        cleanup_mox = True\n      try:\n        func(self, *args, **kwargs)\n      finally:\n        if cleanup_mox:\n          mox_obj.UnsetStubs()\n      if cleanup_mox:\n        mox_obj.VerifyAll()\n    new_method.__name__ = func.__name__\n    new_method.__doc__ = func.__doc__\n    new_method.__module__ = func.__module__\n    return new_method\n\n\nclass MoxTestBase(unittest.TestCase):\n  \"\"\"Convenience test class to make stubbing easier.\n\n  Sets up a \"mox\" attribute which is an instance of Mox - any mox tests will\n  want this. Also automatically unsets any stubs and verifies that all mock\n  methods have been called at the end of each test, eliminating boilerplate\n  code.\n  \"\"\"\n\n  __metaclass__ = MoxMetaTestBase\n\n  def setUp(self):\n    self.mox = Mox()\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/setup.py",
    "content": "#! /usr/bin/python\n#\n# See README for usage instructions.\n\n# We must use setuptools, not distutils, because we need to use the\n# namespace_packages option for the \"google\" package.\nfrom ez_setup import use_setuptools\nuse_setuptools()\n\nfrom setuptools import setup, Extension\nfrom distutils.spawn import find_executable\nimport sys\nimport os\nimport subprocess\n\nmaintainer_email = \"protobuf@googlegroups.com\"\n\n# Find the Protocol Compiler.\nif os.path.exists(\"../src/protoc\"):\n  protoc = \"../src/protoc\"\nelif os.path.exists(\"../src/protoc.exe\"):\n  protoc = \"../src/protoc.exe\"\nelif os.path.exists(\"../vsprojects/Debug/protoc.exe\"):\n  protoc = \"../vsprojects/Debug/protoc.exe\"\nelif os.path.exists(\"../vsprojects/Release/protoc.exe\"):\n  protoc = \"../vsprojects/Release/protoc.exe\"\nelse:\n  protoc = find_executable(\"protoc\")\n\ndef generate_proto(source):\n  \"\"\"Invokes the Protocol Compiler to generate a _pb2.py from the given\n  .proto file.  Does nothing if the output already exists and is newer than\n  the input.\"\"\"\n\n  output = source.replace(\".proto\", \"_pb2.py\").replace(\"../src/\", \"\")\n\n  if not os.path.exists(source):\n    print \"Can't find required file: \" + source\n    sys.exit(-1)\n\n  if (not os.path.exists(output) or\n      (os.path.exists(source) and\n       os.path.getmtime(source) > os.path.getmtime(output))):\n    print \"Generating %s...\" % output\n\n    if protoc == None:\n      sys.stderr.write(\n          \"protoc is not installed nor found in ../src.  Please compile it \"\n          \"or install the binary package.\\n\")\n      sys.exit(-1)\n\n    protoc_command = [ protoc, \"-I../src\", \"-I.\", \"--python_out=.\", source ]\n    if subprocess.call(protoc_command) != 0:\n      sys.exit(-1)\n\ndef MakeTestSuite():\n  # This is apparently needed on some systems to make sure that the tests\n  # work even if a previous version is already installed.\n  if 'google' in sys.modules:\n    del sys.modules['google']\n\n  generate_proto(\"../src/google/protobuf/unittest.proto\")\n  generate_proto(\"../src/google/protobuf/unittest_custom_options.proto\")\n  generate_proto(\"../src/google/protobuf/unittest_import.proto\")\n  generate_proto(\"../src/google/protobuf/unittest_mset.proto\")\n  generate_proto(\"../src/google/protobuf/unittest_no_generic_services.proto\")\n  generate_proto(\"google/protobuf/internal/more_extensions.proto\")\n  generate_proto(\"google/protobuf/internal/more_messages.proto\")\n\n  import unittest\n  import google.protobuf.internal.generator_test     as generator_test\n  import google.protobuf.internal.descriptor_test    as descriptor_test\n  import google.protobuf.internal.reflection_test    as reflection_test\n  import google.protobuf.internal.service_reflection_test \\\n    as service_reflection_test\n  import google.protobuf.internal.text_format_test   as text_format_test\n  import google.protobuf.internal.wire_format_test   as wire_format_test\n\n  loader = unittest.defaultTestLoader\n  suite = unittest.TestSuite()\n  for test in [ generator_test,\n                descriptor_test,\n                reflection_test,\n                service_reflection_test,\n                text_format_test,\n                wire_format_test ]:\n    suite.addTest(loader.loadTestsFromModule(test))\n\n  return suite\n\nif __name__ == '__main__':\n  # TODO(kenton):  Integrate this into setuptools somehow?\n  if len(sys.argv) >= 2 and sys.argv[1] == \"clean\":\n    # Delete generated _pb2.py files and .pyc files in the code tree.\n    for (dirpath, dirnames, filenames) in os.walk(\".\"):\n      for filename in filenames:\n        filepath = os.path.join(dirpath, filename)\n        if filepath.endswith(\"_pb2.py\") or filepath.endswith(\".pyc\") or \\\n          filepath.endswith(\".so\") or filepath.endswith(\".o\"):\n          os.remove(filepath)\n  else:\n    # Generate necessary .proto file if it doesn't exist.\n    # TODO(kenton):  Maybe we should hook this into a distutils command?\n    generate_proto(\"../src/google/protobuf/descriptor.proto\")\n    generate_proto(\"../src/google/protobuf/compiler/plugin.proto\")\n\n  ext_module_list = []\n\n  # C++ implementation extension\n  if os.getenv(\"PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION\", \"python\") == \"cpp\":\n    print \"Using EXPERIMENTAL C++ Implmenetation.\"\n    ext_module_list.append(Extension(\n        \"google.protobuf.internal._net_proto2___python\",\n        [ \"google/protobuf/pyext/python_descriptor.cc\",\n          \"google/protobuf/pyext/python_protobuf.cc\",\n          \"google/protobuf/pyext/python-proto2.cc\" ],\n        include_dirs = [ \".\" ],\n        libraries = [ \"protobuf\" ]))\n\n  setup(name = 'protobuf',\n        version = '2.4.2-pre',\n        packages = [ 'google' ],\n        namespace_packages = [ 'google' ],\n        test_suite = 'setup.MakeTestSuite',\n        # Must list modules explicitly so that we don't install tests.\n        py_modules = [\n          'google.protobuf.internal.api_implementation',\n          'google.protobuf.internal.containers',\n          'google.protobuf.internal.cpp_message',\n          'google.protobuf.internal.decoder',\n          'google.protobuf.internal.encoder',\n          'google.protobuf.internal.message_listener',\n          'google.protobuf.internal.python_message',\n          'google.protobuf.internal.type_checkers',\n          'google.protobuf.internal.wire_format',\n          'google.protobuf.descriptor',\n          'google.protobuf.descriptor_pb2',\n          'google.protobuf.compiler.plugin_pb2',\n          'google.protobuf.message',\n          'google.protobuf.reflection',\n          'google.protobuf.service',\n          'google.protobuf.service_reflection',\n          'google.protobuf.text_format' ],\n        ext_modules = ext_module_list,\n        url = 'http://code.google.com/p/protobuf/',\n        maintainer = maintainer_email,\n        maintainer_email = 'protobuf@googlegroups.com',\n        license = 'New BSD License',\n        description = 'Protocol Buffers',\n        long_description =\n          \"Protocol Buffers are Google's data interchange format.\",\n        )\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/python/stubout.py",
    "content": "#!/usr/bin/python2.4\n#\n# Copyright 2008 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\n# This file is used for testing.  The original is at:\n#   http://code.google.com/p/pymox/\n\nclass StubOutForTesting:\n  \"\"\"Sample Usage:\n     You want os.path.exists() to always return true during testing.\n\n     stubs = StubOutForTesting()\n     stubs.Set(os.path, 'exists', lambda x: 1)\n       ...\n     stubs.UnsetAll()\n\n     The above changes os.path.exists into a lambda that returns 1.  Once\n     the ... part of the code finishes, the UnsetAll() looks up the old value\n     of os.path.exists and restores it.\n\n  \"\"\"\n  def __init__(self):\n    self.cache = []\n    self.stubs = []\n\n  def __del__(self):\n    self.SmartUnsetAll()\n    self.UnsetAll()\n\n  def SmartSet(self, obj, attr_name, new_attr):\n    \"\"\"Replace obj.attr_name with new_attr. This method is smart and works\n       at the module, class, and instance level while preserving proper\n       inheritance. It will not stub out C types however unless that has been\n       explicitly allowed by the type.\n\n       This method supports the case where attr_name is a staticmethod or a\n       classmethod of obj.\n\n       Notes:\n      - If obj is an instance, then it is its class that will actually be\n        stubbed. Note that the method Set() does not do that: if obj is\n        an instance, it (and not its class) will be stubbed.\n      - The stubbing is using the builtin getattr and setattr. So, the __get__\n        and __set__ will be called when stubbing (TODO: A better idea would\n        probably be to manipulate obj.__dict__ instead of getattr() and\n        setattr()).\n\n       Raises AttributeError if the attribute cannot be found.\n    \"\"\"\n    if (inspect.ismodule(obj) or\n        (not inspect.isclass(obj) and obj.__dict__.has_key(attr_name))):\n      orig_obj = obj\n      orig_attr = getattr(obj, attr_name)\n\n    else:\n      if not inspect.isclass(obj):\n        mro = list(inspect.getmro(obj.__class__))\n      else:\n        mro = list(inspect.getmro(obj))\n\n      mro.reverse()\n\n      orig_attr = None\n\n      for cls in mro:\n        try:\n          orig_obj = cls\n          orig_attr = getattr(obj, attr_name)\n        except AttributeError:\n          continue\n\n    if orig_attr is None:\n      raise AttributeError(\"Attribute not found.\")\n\n    # Calling getattr() on a staticmethod transforms it to a 'normal' function.\n    # We need to ensure that we put it back as a staticmethod.\n    old_attribute = obj.__dict__.get(attr_name)\n    if old_attribute is not None and isinstance(old_attribute, staticmethod):\n      orig_attr = staticmethod(orig_attr)\n\n    self.stubs.append((orig_obj, attr_name, orig_attr))\n    setattr(orig_obj, attr_name, new_attr)\n\n  def SmartUnsetAll(self):\n    \"\"\"Reverses all the SmartSet() calls, restoring things to their original\n    definition.  Its okay to call SmartUnsetAll() repeatedly, as later calls\n    have no effect if no SmartSet() calls have been made.\n\n    \"\"\"\n    self.stubs.reverse()\n\n    for args in self.stubs:\n      setattr(*args)\n\n    self.stubs = []\n\n  def Set(self, parent, child_name, new_child):\n    \"\"\"Replace child_name's old definition with new_child, in the context\n    of the given parent.  The parent could be a module when the child is a\n    function at module scope.  Or the parent could be a class when a class'\n    method is being replaced.  The named child is set to new_child, while\n    the prior definition is saved away for later, when UnsetAll() is called.\n\n    This method supports the case where child_name is a staticmethod or a\n    classmethod of parent.\n    \"\"\"\n    old_child = getattr(parent, child_name)\n\n    old_attribute = parent.__dict__.get(child_name)\n    if old_attribute is not None and isinstance(old_attribute, staticmethod):\n      old_child = staticmethod(old_child)\n\n    self.cache.append((parent, old_child, child_name))\n    setattr(parent, child_name, new_child)\n\n  def UnsetAll(self):\n    \"\"\"Reverses all the Set() calls, restoring things to their original\n    definition.  Its okay to call UnsetAll() repeatedly, as later calls have\n    no effect if no Set() calls have been made.\n\n    \"\"\"\n    # Undo calls to Set() in reverse order, in case Set() was called on the\n    # same arguments repeatedly (want the original call to be last one undone)\n    self.cache.reverse()\n\n    for (parent, old_child, child_name) in self.cache:\n      setattr(parent, child_name, old_child)\n    self.cache = []\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/SEBS",
    "content": "# **EXPERIMENTAL**\n#\n# See http://sebs.googlecode.com\n#\n# This is an experimental build definition file using the SEBS build system.\n# I (Kenton Varda, maintainer of Protocol Buffers) happen to be the author of\n# SEBS, though SEBS is not a Google project.  I'm sticking this file in\n# protobuf's SVN because that's the easiest place for me to put it, and it\n# shouldn't harm anyone.  This file is not included in the distribution.\n#\n# Currently, to use this file, you must generate config.h and put it at the\n# top level of the source tree.\n\n_cpp = sebs.import_(\"//sebs/cpp.sebs\")\n\n# ====================================================================\n# Public targets\n\nprotobuf_lite = _cpp.Library(\n  name = \"protobuf-lite\",\n  srcs = [ \"stubs/common.cc\",\n           \"stubs/once.cc\",\n           \"stubs/hash.cc\",\n           \"stubs/hash.h\",\n           \"stubs/map-util.h\",\n           \"stubs/stl_util-inl.h\",\n           \"extension_set.cc\",\n           \"generated_message_util.cc\",\n           \"message_lite.cc\",\n           \"repeated_field.cc\",\n           \"wire_format_lite.cc\",\n           \"io/coded_stream.cc\",\n           \"io/zero_copy_stream.cc\",\n           \"io/zero_copy_stream_impl_lite.cc\" ],\n  deps = [ _cpp.SystemLibrary(name = \"pthread\") ])\n\nprotobuf = _cpp.Library(\n  name = \"protobuf\",\n  srcs = [ \"stubs/strutil.cc\",\n           \"stubs/strutil.h\",\n           \"stubs/substitute.cc\",\n           \"stubs/substitute.h\",\n           \"stubs/structurally_valid.cc\",\n           \"descriptor.cc\",\n           \"descriptor.pb.cc\",\n           \"descriptor_database.cc\",\n           \"dynamic_message.cc\",\n           \"extension_set_heavy.cc\",\n           \"generated_message_reflection.cc\",\n           \"message.cc\",\n           \"reflection_ops.cc\",\n           \"service.cc\",\n           \"text_format.cc\",\n           \"unknown_field_set.cc\",\n           \"wire_format.cc\",\n           \"io/gzip_stream.cc\",\n           \"io/printer.cc\",\n           \"io/tokenizer.cc\",\n           \"io/zero_copy_stream_impl.cc\",\n           \"compiler/importer.cc\",\n           \"compiler/parser.cc\" ],\n  deps = [ protobuf_lite,\n           _cpp.SystemLibrary(name = \"z\") ])\n\nlibprotoc = _cpp.Library(\n  name = \"protoc\",\n  srcs = [ \"compiler/code_generator.cc\",\n           \"compiler/command_line_interface.cc\",\n           \"compiler/cpp/cpp_enum.cc\",\n           \"compiler/cpp/cpp_enum.h\",\n           \"compiler/cpp/cpp_enum_field.cc\",\n           \"compiler/cpp/cpp_enum_field.h\",\n           \"compiler/cpp/cpp_extension.cc\",\n           \"compiler/cpp/cpp_extension.h\",\n           \"compiler/cpp/cpp_field.cc\",\n           \"compiler/cpp/cpp_field.h\",\n           \"compiler/cpp/cpp_file.cc\",\n           \"compiler/cpp/cpp_file.h\",\n           \"compiler/cpp/cpp_generator.cc\",\n           \"compiler/cpp/cpp_helpers.cc\",\n           \"compiler/cpp/cpp_helpers.h\",\n           \"compiler/cpp/cpp_message.cc\",\n           \"compiler/cpp/cpp_message.h\",\n           \"compiler/cpp/cpp_message_field.cc\",\n           \"compiler/cpp/cpp_message_field.h\",\n           \"compiler/cpp/cpp_primitive_field.cc\",\n           \"compiler/cpp/cpp_primitive_field.h\",\n           \"compiler/cpp/cpp_service.cc\",\n           \"compiler/cpp/cpp_service.h\",\n           \"compiler/cpp/cpp_string_field.cc\",\n           \"compiler/cpp/cpp_string_field.h\",\n           \"compiler/java/java_enum.cc\",\n           \"compiler/java/java_enum.h\",\n           \"compiler/java/java_enum_field.cc\",\n           \"compiler/java/java_enum_field.h\",\n           \"compiler/java/java_extension.cc\",\n           \"compiler/java/java_extension.h\",\n           \"compiler/java/java_field.cc\",\n           \"compiler/java/java_field.h\",\n           \"compiler/java/java_file.cc\",\n           \"compiler/java/java_file.h\",\n           \"compiler/java/java_generator.cc\",\n           \"compiler/java/java_helpers.cc\",\n           \"compiler/java/java_helpers.h\",\n           \"compiler/java/java_message.cc\",\n           \"compiler/java/java_message.h\",\n           \"compiler/java/java_message_field.cc\",\n           \"compiler/java/java_message_field.h\",\n           \"compiler/java/java_primitive_field.cc\",\n           \"compiler/java/java_primitive_field.h\",\n           \"compiler/java/java_service.cc\",\n           \"compiler/java/java_service.h\",\n           \"compiler/python/python_generator.cc\" ],\n  deps = [ protobuf ])\n\nprotoc = _cpp.Binary(\n  name = \"protoc\",\n  srcs = [ \"compiler/main.cc\" ],\n  deps = [ libprotoc ])\n\n# ====================================================================\n# ProtobufLibrary rule class\n\nclass ProtobufLibrary(sebs.Rule):\n  argument_spec = sebs.ArgumentSpec(srcs = [sebs.Artifact],\n                                    deps = ([sebs.Rule], []),\n                                    lite = (bool, False))\n\n  def _expand(self, args):\n    for dep in args.deps:\n      if not isinstance(dep, ProtobufLibrary):\n        raise sebs.DefinitionError(\n          \"Dependency of ProtobufLibrary is not a ProtobufLibrary: %s\" % dep)\n\n    protoc.expand_once()\n\n    # We must build protoc for the host configuration to allow cross-compiling.\n    host_protoc = self.context.configured_artifact(protoc.binary, \"host\")\n\n    protoc_action = self.context.action(self, \"protobuf\")\n    protoc_args = [host_protoc, \"-Isrc\", \"-Itmp\", \"-Iinclude\",\"--cpp_out=tmp\"]\n\n    cpp_srcs = []\n    for src in args.srcs:\n      protoc_args.append(src)\n\n      # We cannot build .proto files from other packages because the .pb.cc\n      # and .pb.h files would be written to that package, and we aren't allowed\n      # to write to other packages.\n      if self.context.local_filename(src) is None:\n        raise sebs.DefinitionError(\n          \"Source file is not in this package: %s\" % src)\n\n      cc_artifact = self.context.derived_artifact(src, \".pb.cc\", protoc_action)\n      header_artifact = self.context.derived_artifact(\n          src, \".pb.h\", protoc_action)\n\n      cpp_srcs.append(cc_artifact)\n      cpp_srcs.append(header_artifact)\n\n    protoc_action.set_command(\n      sebs.SubprocessCommand(protoc_action, protoc_args, implicit = cpp_srcs))\n\n    deps = list(args.deps)\n    if args.lite:\n      deps.append(protobuf_lite)\n    else:\n      deps.append(protobuf)\n\n    self.__cpp_library = _cpp.Library(srcs = cpp_srcs, deps = deps,\n                                      context = self.context)\n    self.__cpp_library.label = self.label\n    self.outputs = []\n\n  def as_cpp_library(self):\n    self.expand_once()\n    return self.__cpp_library\n\n# ====================================================================\n# Tests\n\n_lite_test_protos = ProtobufLibrary(\n  srcs = [ \"unittest_lite.proto\",\n           \"unittest_import_lite.proto\" ],\n  lite = True)\n_test_protos = ProtobufLibrary(\n  srcs = [ \"unittest.proto\",\n           \"unittest_empty.proto\",\n           \"unittest_import.proto\",\n           \"unittest_mset.proto\",\n           \"unittest_optimize_for.proto\",\n           \"unittest_embed_optimize_for.proto\",\n           \"unittest_custom_options.proto\",\n           \"unittest_lite_imports_nonlite.proto\",\n           \"compiler/cpp/cpp_test_bad_identifiers.proto\" ],\n  deps = [ _lite_test_protos ])\n\n_test_util = _cpp.Library(\n  name = \"test_util\",\n  srcs = [ \"test_util.cc\",\n           \"test_util.h\",\n           \"testing/googletest.cc\",\n           \"testing/googletest.h\",\n           \"testing/file.cc\",\n           \"testing/file.h\" ],\n  deps = [ protobuf, _test_protos, _cpp.SystemLibrary(name = \"gtest\")] )\n\nprotobuf_lite_test = _cpp.Test(\n  srcs = [ \"lite_unittest.cc\",\n           \"test_util_lite.cc\",\n           \"test_util_lite.h\" ],\n  deps = [ _lite_test_protos ])\n\nprotobuf_test = _cpp.Test(\n  srcs = [ \"stubs/common_unittest.cc\",\n           \"stubs/once_unittest.cc\",\n           \"stubs/strutil_unittest.cc\",\n           \"stubs/structurally_valid_unittest.cc\",\n           \"descriptor_database_unittest.cc\",\n           \"descriptor_unittest.cc\",\n           \"dynamic_message_unittest.cc\",\n           \"extension_set_unittest.cc\",\n           \"generated_message_reflection_unittest.cc\",\n           \"message_unittest.cc\",\n           \"reflection_ops_unittest.cc\",\n           \"repeated_field_unittest.cc\",\n           \"text_format_unittest.cc\",\n           \"unknown_field_set_unittest.cc\",\n           \"wire_format_unittest.cc\",\n           \"io/coded_stream_unittest.cc\",\n           \"io/printer_unittest.cc\",\n           \"io/tokenizer_unittest.cc\",\n           \"io/zero_copy_stream_unittest.cc\",\n           \"compiler/command_line_interface_unittest.cc\",\n           \"compiler/importer_unittest.cc\",\n           \"compiler/parser_unittest.cc\",\n           \"compiler/cpp/cpp_bootstrap_unittest.cc\",\n           \"compiler/cpp/cpp_unittest.cc\" ],\n  deps = [ protobuf, libprotoc, _test_util,\n           _cpp.SystemLibrary(name = \"gtest_main\") ])\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/code_generator.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\nCodeGenerator::~CodeGenerator() {}\nGeneratorContext::~GeneratorContext() {}\n\nio::ZeroCopyOutputStream* GeneratorContext::OpenForInsert(\n    const string& filename, const string& insertion_point) {\n  GOOGLE_LOG(FATAL) << \"This GeneratorContext does not support insertion.\";\n  return NULL;  // make compiler happy\n}\n\nvoid GeneratorContext::ListParsedFiles(\n    vector<const FileDescriptor*>* output) {\n  GOOGLE_LOG(FATAL) << \"This GeneratorContext does not support ListParsedFiles\";\n}\n\n// Parses a set of comma-delimited name/value pairs.\nvoid ParseGeneratorParameter(const string& text,\n                             vector<pair<string, string> >* output) {\n  vector<string> parts;\n  SplitStringUsing(text, \",\", &parts);\n\n  for (int i = 0; i < parts.size(); i++) {\n    string::size_type equals_pos = parts[i].find_first_of('=');\n    pair<string, string> value;\n    if (equals_pos == string::npos) {\n      value.first = parts[i];\n      value.second = \"\";\n    } else {\n      value.first = parts[i].substr(0, equals_pos);\n      value.second = parts[i].substr(equals_pos + 1);\n    }\n    output->push_back(value);\n  }\n}\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Defines the abstract interface implemented by each of the language-specific\n// code generators.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_H__\n#define GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_H__\n\n#include <google/protobuf/stubs/common.h>\n#include <string>\n#include <vector>\n#include <utility>\n\nnamespace google {\nnamespace protobuf {\n\nnamespace io { class ZeroCopyOutputStream; }\nclass FileDescriptor;\n\nnamespace compiler {\n\n// Defined in this file.\nclass CodeGenerator;\nclass GeneratorContext;\n\n// The abstract interface to a class which generates code implementing a\n// particular proto file in a particular language.  A number of these may\n// be registered with CommandLineInterface to support various languages.\nclass LIBPROTOC_EXPORT CodeGenerator {\n public:\n  inline CodeGenerator() {}\n  virtual ~CodeGenerator();\n\n  // Generates code for the given proto file, generating one or more files in\n  // the given output directory.\n  //\n  // A parameter to be passed to the generator can be specified on the\n  // command line.  This is intended to be used by Java and similar languages\n  // to specify which specific class from the proto file is to be generated,\n  // though it could have other uses as well.  It is empty if no parameter was\n  // given.\n  //\n  // Returns true if successful.  Otherwise, sets *error to a description of\n  // the problem (e.g. \"invalid parameter\") and returns false.\n  virtual bool Generate(const FileDescriptor* file,\n                        const string& parameter,\n                        GeneratorContext* generator_context,\n                        string* error) const = 0;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodeGenerator);\n};\n\n// CodeGenerators generate one or more files in a given directory.  This\n// abstract interface represents the directory to which the CodeGenerator is\n// to write and other information about the context in which the Generator\n// runs.\nclass LIBPROTOC_EXPORT GeneratorContext {\n public:\n  inline GeneratorContext() {}\n  virtual ~GeneratorContext();\n\n  // Opens the given file, truncating it if it exists, and returns a\n  // ZeroCopyOutputStream that writes to the file.  The caller takes ownership\n  // of the returned object.  This method never fails (a dummy stream will be\n  // returned instead).\n  //\n  // The filename given should be relative to the root of the source tree.\n  // E.g. the C++ generator, when generating code for \"foo/bar.proto\", will\n  // generate the files \"foo/bar.pb.h\" and \"foo/bar.pb.cc\"; note that\n  // \"foo/\" is included in these filenames.  The filename is not allowed to\n  // contain \".\" or \"..\" components.\n  virtual io::ZeroCopyOutputStream* Open(const string& filename) = 0;\n\n  // Creates a ZeroCopyOutputStream which will insert code into the given file\n  // at the given insertion point.  See plugin.proto (plugin.pb.h) for more\n  // information on insertion points.  The default implementation\n  // assert-fails -- it exists only for backwards-compatibility.\n  //\n  // WARNING:  This feature is currently EXPERIMENTAL and is subject to change.\n  virtual io::ZeroCopyOutputStream* OpenForInsert(\n      const string& filename, const string& insertion_point);\n\n  // Returns a vector of FileDescriptors for all the files being compiled\n  // in this run.  Useful for languages, such as Go, that treat files\n  // differently when compiled as a set rather than individually.\n  virtual void ListParsedFiles(vector<const FileDescriptor*>* output);\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratorContext);\n};\n\n// The type GeneratorContext was once called OutputDirectory. This typedef\n// provides backward compatibility.\ntypedef GeneratorContext OutputDirectory;\n\n// Several code generators treat the parameter argument as holding a\n// list of options separated by commas.  This helper function parses\n// a set of comma-delimited name/value pairs: e.g.,\n//   \"foo=bar,baz,qux=corge\"\n// parses to the pairs:\n//   (\"foo\", \"bar\"), (\"baz\", \"\"), (\"qux\", \"corge\")\nextern void ParseGeneratorParameter(const string&,\n            vector<pair<string, string> >*);\n\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/command_line_interface.h>\n\n#include <stdio.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#ifdef _MSC_VER\n#include <io.h>\n#include <direct.h>\n#else\n#include <unistd.h>\n#endif\n#include <errno.h>\n#include <iostream>\n#include <ctype.h>\n\n#include <google/protobuf/stubs/hash.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/compiler/importer.h>\n#include <google/protobuf/compiler/code_generator.h>\n#include <google/protobuf/compiler/plugin.pb.h>\n#include <google/protobuf/compiler/subprocess.h>\n#include <google/protobuf/compiler/zip_writer.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/text_format.h>\n#include <google/protobuf/dynamic_message.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n#include <google/protobuf/stubs/map-util.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\n#if defined(_WIN32)\n#define mkdir(name, mode) mkdir(name)\n#ifndef W_OK\n#define W_OK 02  // not defined by MSVC for whatever reason\n#endif\n#ifndef F_OK\n#define F_OK 00  // not defined by MSVC for whatever reason\n#endif\n#ifndef STDIN_FILENO\n#define STDIN_FILENO 0\n#endif\n#ifndef STDOUT_FILENO\n#define STDOUT_FILENO 1\n#endif\n#endif\n\n#ifndef O_BINARY\n#ifdef _O_BINARY\n#define O_BINARY _O_BINARY\n#else\n#define O_BINARY 0     // If this isn't defined, the platform doesn't need it.\n#endif\n#endif\n\nnamespace {\n#if defined(_WIN32) && !defined(__CYGWIN__)\nstatic const char* kPathSeparator = \";\";\n#else\nstatic const char* kPathSeparator = \":\";\n#endif\n\n// Returns true if the text looks like a Windows-style absolute path, starting\n// with a drive letter.  Example:  \"C:\\foo\".  TODO(kenton):  Share this with\n// copy in importer.cc?\nstatic bool IsWindowsAbsolutePath(const string& text) {\n#if defined(_WIN32) || defined(__CYGWIN__)\n  return text.size() >= 3 && text[1] == ':' &&\n         isalpha(text[0]) &&\n         (text[2] == '/' || text[2] == '\\\\') &&\n         text.find_last_of(':') == 1;\n#else\n  return false;\n#endif\n}\n\nvoid SetFdToTextMode(int fd) {\n#ifdef _WIN32\n  if (_setmode(fd, _O_TEXT) == -1) {\n    // This should never happen, I think.\n    GOOGLE_LOG(WARNING) << \"_setmode(\" << fd << \", _O_TEXT): \" << strerror(errno);\n  }\n#endif\n  // (Text and binary are the same on non-Windows platforms.)\n}\n\nvoid SetFdToBinaryMode(int fd) {\n#ifdef _WIN32\n  if (_setmode(fd, _O_BINARY) == -1) {\n    // This should never happen, I think.\n    GOOGLE_LOG(WARNING) << \"_setmode(\" << fd << \", _O_BINARY): \" << strerror(errno);\n  }\n#endif\n  // (Text and binary are the same on non-Windows platforms.)\n}\n\nvoid AddTrailingSlash(string* path) {\n  if (!path->empty() && path->at(path->size() - 1) != '/') {\n    path->push_back('/');\n  }\n}\n\nbool VerifyDirectoryExists(const string& path) {\n  if (path.empty()) return true;\n\n  if (access(path.c_str(), W_OK) == -1) {\n    cerr << path << \": \" << strerror(errno) << endl;\n    return false;\n  } else {\n    return true;\n  }\n}\n\n// Try to create the parent directory of the given file, creating the parent's\n// parent if necessary, and so on.  The full file name is actually\n// (prefix + filename), but we assume |prefix| already exists and only create\n// directories listed in |filename|.\nbool TryCreateParentDirectory(const string& prefix, const string& filename) {\n  // Recursively create parent directories to the output file.\n  vector<string> parts;\n  SplitStringUsing(filename, \"/\", &parts);\n  string path_so_far = prefix;\n  for (int i = 0; i < parts.size() - 1; i++) {\n    path_so_far += parts[i];\n    if (mkdir(path_so_far.c_str(), 0777) != 0) {\n      if (errno != EEXIST) {\n        cerr << filename << \": while trying to create directory \"\n             << path_so_far << \": \" << strerror(errno) << endl;\n        return false;\n      }\n    }\n    path_so_far += '/';\n  }\n\n  return true;\n}\n\n}  // namespace\n\n// A MultiFileErrorCollector that prints errors to stderr.\nclass CommandLineInterface::ErrorPrinter : public MultiFileErrorCollector,\n                                           public io::ErrorCollector {\n public:\n  ErrorPrinter(ErrorFormat format, DiskSourceTree *tree = NULL)\n    : format_(format), tree_(tree) {}\n  ~ErrorPrinter() {}\n\n  // implements MultiFileErrorCollector ------------------------------\n  void AddError(const string& filename, int line, int column,\n                const string& message) {\n\n    // Print full path when running under MSVS\n    string dfile;\n    if (format_ == CommandLineInterface::ERROR_FORMAT_MSVS &&\n        tree_ != NULL &&\n        tree_->VirtualFileToDiskFile(filename, &dfile)) {\n      cerr << dfile;\n    } else {\n      cerr << filename;\n    }\n\n    // Users typically expect 1-based line/column numbers, so we add 1\n    // to each here.\n    if (line != -1) {\n      // Allow for both GCC- and Visual-Studio-compatible output.\n      switch (format_) {\n        case CommandLineInterface::ERROR_FORMAT_GCC:\n          cerr << \":\" << (line + 1) << \":\" << (column + 1);\n          break;\n        case CommandLineInterface::ERROR_FORMAT_MSVS:\n          cerr << \"(\" << (line + 1) << \") : error in column=\" << (column + 1);\n          break;\n      }\n    }\n\n    cerr << \": \" << message << endl;\n  }\n\n  // implements io::ErrorCollector -----------------------------------\n  void AddError(int line, int column, const string& message) {\n    AddError(\"input\", line, column, message);\n  }\n\n private:\n  const ErrorFormat format_;\n  DiskSourceTree *tree_;\n};\n\n// -------------------------------------------------------------------\n\n// A GeneratorContext implementation that buffers files in memory, then dumps\n// them all to disk on demand.\nclass CommandLineInterface::GeneratorContextImpl : public GeneratorContext {\n public:\n  GeneratorContextImpl(const vector<const FileDescriptor*>& parsed_files);\n  ~GeneratorContextImpl();\n\n  // Write all files in the directory to disk at the given output location,\n  // which must end in a '/'.\n  bool WriteAllToDisk(const string& prefix);\n\n  // Write the contents of this directory to a ZIP-format archive with the\n  // given name.\n  bool WriteAllToZip(const string& filename);\n\n  // Add a boilerplate META-INF/MANIFEST.MF file as required by the Java JAR\n  // format, unless one has already been written.\n  void AddJarManifest();\n\n  // implements GeneratorContext --------------------------------------\n  io::ZeroCopyOutputStream* Open(const string& filename);\n  io::ZeroCopyOutputStream* OpenForInsert(\n      const string& filename, const string& insertion_point);\n  void ListParsedFiles(vector<const FileDescriptor*>* output) {\n    *output = parsed_files_;\n  }\n\n private:\n  friend class MemoryOutputStream;\n\n  // map instead of hash_map so that files are written in order (good when\n  // writing zips).\n  map<string, string*> files_;\n  const vector<const FileDescriptor*>& parsed_files_;\n  bool had_error_;\n};\n\nclass CommandLineInterface::MemoryOutputStream\n    : public io::ZeroCopyOutputStream {\n public:\n  MemoryOutputStream(GeneratorContextImpl* directory, const string& filename);\n  MemoryOutputStream(GeneratorContextImpl* directory, const string& filename,\n                     const string& insertion_point);\n  virtual ~MemoryOutputStream();\n\n  // implements ZeroCopyOutputStream ---------------------------------\n  virtual bool Next(void** data, int* size) { return inner_->Next(data, size); }\n  virtual void BackUp(int count)            {        inner_->BackUp(count);    }\n  virtual int64 ByteCount() const           { return inner_->ByteCount();      }\n\n private:\n  // Where to insert the string when it's done.\n  GeneratorContextImpl* directory_;\n  string filename_;\n  string insertion_point_;\n\n  // The string we're building.\n  string data_;\n\n  // StringOutputStream writing to data_.\n  scoped_ptr<io::StringOutputStream> inner_;\n};\n\n// -------------------------------------------------------------------\n\nCommandLineInterface::GeneratorContextImpl::GeneratorContextImpl(\n    const vector<const FileDescriptor*>& parsed_files)\n    : parsed_files_(parsed_files),\n      had_error_(false) {\n}\n\nCommandLineInterface::GeneratorContextImpl::~GeneratorContextImpl() {\n  STLDeleteValues(&files_);\n}\n\nbool CommandLineInterface::GeneratorContextImpl::WriteAllToDisk(\n    const string& prefix) {\n  if (had_error_) {\n    return false;\n  }\n\n  if (!VerifyDirectoryExists(prefix)) {\n    return false;\n  }\n\n  for (map<string, string*>::const_iterator iter = files_.begin();\n       iter != files_.end(); ++iter) {\n    const string& relative_filename = iter->first;\n    const char* data = iter->second->data();\n    int size = iter->second->size();\n\n    if (!TryCreateParentDirectory(prefix, relative_filename)) {\n      return false;\n    }\n    string filename = prefix + relative_filename;\n\n    // Create the output file.\n    int file_descriptor;\n    do {\n      file_descriptor =\n        open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666);\n    } while (file_descriptor < 0 && errno == EINTR);\n\n    if (file_descriptor < 0) {\n      int error = errno;\n      cerr << filename << \": \" << strerror(error);\n      return false;\n    }\n\n    // Write the file.\n    while (size > 0) {\n      int write_result;\n      do {\n        write_result = write(file_descriptor, data, size);\n      } while (write_result < 0 && errno == EINTR);\n\n      if (write_result <= 0) {\n        // Write error.\n\n        // FIXME(kenton):  According to the man page, if write() returns zero,\n        //   there was no error; write() simply did not write anything.  It's\n        //   unclear under what circumstances this might happen, but presumably\n        //   errno won't be set in this case.  I am confused as to how such an\n        //   event should be handled.  For now I'm treating it as an error,\n        //   since retrying seems like it could lead to an infinite loop.  I\n        //   suspect this never actually happens anyway.\n\n        if (write_result < 0) {\n          int error = errno;\n          cerr << filename << \": write: \" << strerror(error);\n        } else {\n          cerr << filename << \": write() returned zero?\" << endl;\n        }\n        return false;\n      }\n\n      data += write_result;\n      size -= write_result;\n    }\n\n    if (close(file_descriptor) != 0) {\n      int error = errno;\n      cerr << filename << \": close: \" << strerror(error);\n      return false;\n    }\n  }\n\n  return true;\n}\n\nbool CommandLineInterface::GeneratorContextImpl::WriteAllToZip(\n    const string& filename) {\n  if (had_error_) {\n    return false;\n  }\n\n  // Create the output file.\n  int file_descriptor;\n  do {\n    file_descriptor =\n      open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666);\n  } while (file_descriptor < 0 && errno == EINTR);\n\n  if (file_descriptor < 0) {\n    int error = errno;\n    cerr << filename << \": \" << strerror(error);\n    return false;\n  }\n\n  // Create the ZipWriter\n  io::FileOutputStream stream(file_descriptor);\n  ZipWriter zip_writer(&stream);\n\n  for (map<string, string*>::const_iterator iter = files_.begin();\n       iter != files_.end(); ++iter) {\n    zip_writer.Write(iter->first, *iter->second);\n  }\n\n  zip_writer.WriteDirectory();\n\n  if (stream.GetErrno() != 0) {\n    cerr << filename << \": \" << strerror(stream.GetErrno()) << endl;\n  }\n\n  if (!stream.Close()) {\n    cerr << filename << \": \" << strerror(stream.GetErrno()) << endl;\n  }\n\n  return true;\n}\n\nvoid CommandLineInterface::GeneratorContextImpl::AddJarManifest() {\n  string** map_slot = &files_[\"META-INF/MANIFEST.MF\"];\n  if (*map_slot == NULL) {\n    *map_slot = new string(\n        \"Manifest-Version: 1.0\\n\"\n        \"Created-By: 1.6.0 (protoc)\\n\"\n        \"\\n\");\n  }\n}\n\nio::ZeroCopyOutputStream* CommandLineInterface::GeneratorContextImpl::Open(\n    const string& filename) {\n  return new MemoryOutputStream(this, filename);\n}\n\nio::ZeroCopyOutputStream*\nCommandLineInterface::GeneratorContextImpl::OpenForInsert(\n    const string& filename, const string& insertion_point) {\n  return new MemoryOutputStream(this, filename, insertion_point);\n}\n\n// -------------------------------------------------------------------\n\nCommandLineInterface::MemoryOutputStream::MemoryOutputStream(\n    GeneratorContextImpl* directory, const string& filename)\n    : directory_(directory),\n      filename_(filename),\n      inner_(new io::StringOutputStream(&data_)) {\n}\n\nCommandLineInterface::MemoryOutputStream::MemoryOutputStream(\n    GeneratorContextImpl* directory, const string& filename,\n    const string& insertion_point)\n    : directory_(directory),\n      filename_(filename),\n      insertion_point_(insertion_point),\n      inner_(new io::StringOutputStream(&data_)) {\n}\n\nCommandLineInterface::MemoryOutputStream::~MemoryOutputStream() {\n  // Make sure all data has been written.\n  inner_.reset();\n\n  // Insert into the directory.\n  string** map_slot = &directory_->files_[filename_];\n\n  if (insertion_point_.empty()) {\n    // This was just a regular Open().\n    if (*map_slot != NULL) {\n      cerr << filename_ << \": Tried to write the same file twice.\" << endl;\n      directory_->had_error_ = true;\n      return;\n    }\n\n    *map_slot = new string;\n    (*map_slot)->swap(data_);\n  } else {\n    // This was an OpenForInsert().\n\n    // If the data doens't end with a clean line break, add one.\n    if (!data_.empty() && data_[data_.size() - 1] != '\\n') {\n      data_.push_back('\\n');\n    }\n\n    // Find the file we are going to insert into.\n    if (*map_slot == NULL) {\n      cerr << filename_ << \": Tried to insert into file that doesn't exist.\"\n           << endl;\n      directory_->had_error_ = true;\n      return;\n    }\n    string* target = *map_slot;\n\n    // Find the insertion point.\n    string magic_string = strings::Substitute(\n        \"@@protoc_insertion_point($0)\", insertion_point_);\n    string::size_type pos = target->find(magic_string);\n\n    if (pos == string::npos) {\n      cerr << filename_ << \": insertion point \\\"\" << insertion_point_\n           << \"\\\" not found.\" << endl;\n      directory_->had_error_ = true;\n      return;\n    }\n\n    // Seek backwards to the beginning of the line, which is where we will\n    // insert the data.  Note that this has the effect of pushing the insertion\n    // point down, so the data is inserted before it.  This is intentional\n    // because it means that multiple insertions at the same point will end\n    // up in the expected order in the final output.\n    pos = target->find_last_of('\\n', pos);\n    if (pos == string::npos) {\n      // Insertion point is on the first line.\n      pos = 0;\n    } else {\n      // Advance to character after '\\n'.\n      ++pos;\n    }\n\n    // Extract indent.\n    string indent_(*target, pos, target->find_first_not_of(\" \\t\", pos) - pos);\n\n    if (indent_.empty()) {\n      // No indent.  This makes things easier.\n      target->insert(pos, data_);\n    } else {\n      // Calculate how much space we need.\n      int indent_size = 0;\n      for (int i = 0; i < data_.size(); i++) {\n        if (data_[i] == '\\n') indent_size += indent_.size();\n      }\n\n      // Make a hole for it.\n      target->insert(pos, data_.size() + indent_size, '\\0');\n\n      // Now copy in the data.\n      string::size_type data_pos = 0;\n      char* target_ptr = string_as_array(target) + pos;\n      while (data_pos < data_.size()) {\n        // Copy indent.\n        memcpy(target_ptr, indent_.data(), indent_.size());\n        target_ptr += indent_.size();\n\n        // Copy line from data_.\n        // We already guaranteed that data_ ends with a newline (above), so this\n        // search can't fail.\n        string::size_type line_length =\n            data_.find_first_of('\\n', data_pos) + 1 - data_pos;\n        memcpy(target_ptr, data_.data() + data_pos, line_length);\n        target_ptr += line_length;\n        data_pos += line_length;\n      }\n\n      GOOGLE_CHECK_EQ(target_ptr,\n          string_as_array(target) + pos + data_.size() + indent_size);\n    }\n  }\n}\n\n// ===================================================================\n\nCommandLineInterface::CommandLineInterface()\n  : mode_(MODE_COMPILE),\n    error_format_(ERROR_FORMAT_GCC),\n    imports_in_descriptor_set_(false),\n    disallow_services_(false),\n    inputs_are_proto_path_relative_(false) {}\nCommandLineInterface::~CommandLineInterface() {}\n\nvoid CommandLineInterface::RegisterGenerator(const string& flag_name,\n                                             CodeGenerator* generator,\n                                             const string& help_text) {\n  GeneratorInfo info;\n  info.generator = generator;\n  info.help_text = help_text;\n  generators_[flag_name] = info;\n}\n\nvoid CommandLineInterface::AllowPlugins(const string& exe_name_prefix) {\n  plugin_prefix_ = exe_name_prefix;\n}\n\nint CommandLineInterface::Run(int argc, const char* const argv[]) {\n  Clear();\n  if (!ParseArguments(argc, argv)) return 1;\n\n  // Set up the source tree.\n  DiskSourceTree source_tree;\n  for (int i = 0; i < proto_path_.size(); i++) {\n    source_tree.MapPath(proto_path_[i].first, proto_path_[i].second);\n  }\n\n  // Map input files to virtual paths if necessary.\n  if (!inputs_are_proto_path_relative_) {\n    if (!MakeInputsBeProtoPathRelative(&source_tree)) {\n      return 1;\n    }\n  }\n\n  // Allocate the Importer.\n  ErrorPrinter error_collector(error_format_, &source_tree);\n  Importer importer(&source_tree, &error_collector);\n\n  vector<const FileDescriptor*> parsed_files;\n\n  // Parse each file.\n  for (int i = 0; i < input_files_.size(); i++) {\n    // Import the file.\n    const FileDescriptor* parsed_file = importer.Import(input_files_[i]);\n    if (parsed_file == NULL) return 1;\n    parsed_files.push_back(parsed_file);\n\n    // Enforce --disallow_services.\n    if (disallow_services_ && parsed_file->service_count() > 0) {\n      cerr << parsed_file->name() << \": This file contains services, but \"\n              \"--disallow_services was used.\" << endl;\n      return 1;\n    }\n  }\n\n  // We construct a separate GeneratorContext for each output location.  Note\n  // that two code generators may output to the same location, in which case\n  // they should share a single GeneratorContext so that OpenForInsert() works.\n  typedef hash_map<string, GeneratorContextImpl*> GeneratorContextMap;\n  GeneratorContextMap output_directories;\n\n  // Generate output.\n  if (mode_ == MODE_COMPILE) {\n    for (int i = 0; i < output_directives_.size(); i++) {\n      string output_location = output_directives_[i].output_location;\n      if (!HasSuffixString(output_location, \".zip\") &&\n          !HasSuffixString(output_location, \".jar\")) {\n        AddTrailingSlash(&output_location);\n      }\n      GeneratorContextImpl** map_slot = &output_directories[output_location];\n\n      if (*map_slot == NULL) {\n        // First time we've seen this output location.\n        *map_slot = new GeneratorContextImpl(parsed_files);\n      }\n\n      if (!GenerateOutput(parsed_files, output_directives_[i], *map_slot)) {\n        STLDeleteValues(&output_directories);\n        return 1;\n      }\n    }\n  }\n\n  // Write all output to disk.\n  for (GeneratorContextMap::iterator iter = output_directories.begin();\n       iter != output_directories.end(); ++iter) {\n    const string& location = iter->first;\n    GeneratorContextImpl* directory = iter->second;\n    if (HasSuffixString(location, \"/\")) {\n      if (!directory->WriteAllToDisk(location)) {\n        STLDeleteValues(&output_directories);\n        return 1;\n      }\n    } else {\n      if (HasSuffixString(location, \".jar\")) {\n        directory->AddJarManifest();\n      }\n\n      if (!directory->WriteAllToZip(location)) {\n        STLDeleteValues(&output_directories);\n        return 1;\n      }\n    }\n  }\n\n  STLDeleteValues(&output_directories);\n\n  if (!descriptor_set_name_.empty()) {\n    if (!WriteDescriptorSet(parsed_files)) {\n      return 1;\n    }\n  }\n\n  if (mode_ == MODE_ENCODE || mode_ == MODE_DECODE) {\n    if (codec_type_.empty()) {\n      // HACK:  Define an EmptyMessage type to use for decoding.\n      DescriptorPool pool;\n      FileDescriptorProto file;\n      file.set_name(\"empty_message.proto\");\n      file.add_message_type()->set_name(\"EmptyMessage\");\n      GOOGLE_CHECK(pool.BuildFile(file) != NULL);\n      codec_type_ = \"EmptyMessage\";\n      if (!EncodeOrDecode(&pool)) {\n        return 1;\n      }\n    } else {\n      if (!EncodeOrDecode(importer.pool())) {\n        return 1;\n      }\n    }\n  }\n\n  return 0;\n}\n\nvoid CommandLineInterface::Clear() {\n  // Clear all members that are set by Run().  Note that we must not clear\n  // members which are set by other methods before Run() is called.\n  executable_name_.clear();\n  proto_path_.clear();\n  input_files_.clear();\n  output_directives_.clear();\n  codec_type_.clear();\n  descriptor_set_name_.clear();\n\n  mode_ = MODE_COMPILE;\n  imports_in_descriptor_set_ = false;\n  disallow_services_ = false;\n}\n\nbool CommandLineInterface::MakeInputsBeProtoPathRelative(\n    DiskSourceTree* source_tree) {\n  for (int i = 0; i < input_files_.size(); i++) {\n    string virtual_file, shadowing_disk_file;\n    switch (source_tree->DiskFileToVirtualFile(\n        input_files_[i], &virtual_file, &shadowing_disk_file)) {\n      case DiskSourceTree::SUCCESS:\n        input_files_[i] = virtual_file;\n        break;\n      case DiskSourceTree::SHADOWED:\n        cerr << input_files_[i] << \": Input is shadowed in the --proto_path \"\n                \"by \\\"\" << shadowing_disk_file << \"\\\".  Either use the latter \"\n                \"file as your input or reorder the --proto_path so that the \"\n                \"former file's location comes first.\" << endl;\n        return false;\n      case DiskSourceTree::CANNOT_OPEN:\n        cerr << input_files_[i] << \": \" << strerror(errno) << endl;\n        return false;\n      case DiskSourceTree::NO_MAPPING:\n        // First check if the file exists at all.\n        if (access(input_files_[i].c_str(), F_OK) < 0) {\n          // File does not even exist.\n          cerr << input_files_[i] << \": \" << strerror(ENOENT) << endl;\n        } else {\n          cerr << input_files_[i] << \": File does not reside within any path \"\n                  \"specified using --proto_path (or -I).  You must specify a \"\n                  \"--proto_path which encompasses this file.  Note that the \"\n                  \"proto_path must be an exact prefix of the .proto file \"\n                  \"names -- protoc is too dumb to figure out when two paths \"\n                  \"(e.g. absolute and relative) are equivalent (it's harder \"\n                  \"than you think).\" << endl;\n        }\n        return false;\n    }\n  }\n\n  return true;\n}\n\nbool CommandLineInterface::ParseArguments(int argc, const char* const argv[]) {\n  executable_name_ = argv[0];\n\n  // Iterate through all arguments and parse them.\n  for (int i = 1; i < argc; i++) {\n    string name, value;\n\n    if (ParseArgument(argv[i], &name, &value)) {\n      // Returned true => Use the next argument as the flag value.\n      if (i + 1 == argc || argv[i+1][0] == '-') {\n        cerr << \"Missing value for flag: \" << name << endl;\n        if (name == \"--decode\") {\n          cerr << \"To decode an unknown message, use --decode_raw.\" << endl;\n        }\n        return false;\n      } else {\n        ++i;\n        value = argv[i];\n      }\n    }\n\n    if (!InterpretArgument(name, value)) return false;\n  }\n\n  // If no --proto_path was given, use the current working directory.\n  if (proto_path_.empty()) {\n    proto_path_.push_back(make_pair<string, string>(\"\", \".\"));\n  }\n\n  // Check some errror cases.\n  bool decoding_raw = (mode_ == MODE_DECODE) && codec_type_.empty();\n  if (decoding_raw && !input_files_.empty()) {\n    cerr << \"When using --decode_raw, no input files should be given.\" << endl;\n    return false;\n  } else if (!decoding_raw && input_files_.empty()) {\n    cerr << \"Missing input file.\" << endl;\n    return false;\n  }\n  if (mode_ == MODE_COMPILE && output_directives_.empty() &&\n      descriptor_set_name_.empty()) {\n    cerr << \"Missing output directives.\" << endl;\n    return false;\n  }\n  if (imports_in_descriptor_set_ && descriptor_set_name_.empty()) {\n    cerr << \"--include_imports only makes sense when combined with \"\n            \"--descriptor_set_out.\" << endl;\n  }\n\n  return true;\n}\n\nbool CommandLineInterface::ParseArgument(const char* arg,\n                                         string* name, string* value) {\n  bool parsed_value = false;\n\n  if (arg[0] != '-') {\n    // Not a flag.\n    name->clear();\n    parsed_value = true;\n    *value = arg;\n  } else if (arg[1] == '-') {\n    // Two dashes:  Multi-character name, with '=' separating name and\n    //   value.\n    const char* equals_pos = strchr(arg, '=');\n    if (equals_pos != NULL) {\n      *name = string(arg, equals_pos - arg);\n      *value = equals_pos + 1;\n      parsed_value = true;\n    } else {\n      *name = arg;\n    }\n  } else {\n    // One dash:  One-character name, all subsequent characters are the\n    //   value.\n    if (arg[1] == '\\0') {\n      // arg is just \"-\".  We treat this as an input file, except that at\n      // present this will just lead to a \"file not found\" error.\n      name->clear();\n      *value = arg;\n      parsed_value = true;\n    } else {\n      *name = string(arg, 2);\n      *value = arg + 2;\n      parsed_value = !value->empty();\n    }\n  }\n\n  // Need to return true iff the next arg should be used as the value for this\n  // one, false otherwise.\n\n  if (parsed_value) {\n    // We already parsed a value for this flag.\n    return false;\n  }\n\n  if (*name == \"-h\" || *name == \"--help\" ||\n      *name == \"--disallow_services\" ||\n      *name == \"--include_imports\" ||\n      *name == \"--version\" ||\n      *name == \"--decode_raw\") {\n    // HACK:  These are the only flags that don't take a value.\n    //   They probably should not be hard-coded like this but for now it's\n    //   not worth doing better.\n    return false;\n  }\n\n  // Next argument is the flag value.\n  return true;\n}\n\nbool CommandLineInterface::InterpretArgument(const string& name,\n                                             const string& value) {\n  if (name.empty()) {\n    // Not a flag.  Just a filename.\n    if (value.empty()) {\n      cerr << \"You seem to have passed an empty string as one of the \"\n              \"arguments to \" << executable_name_ << \".  This is actually \"\n              \"sort of hard to do.  Congrats.  Unfortunately it is not valid \"\n              \"input so the program is going to die now.\" << endl;\n      return false;\n    }\n\n    input_files_.push_back(value);\n\n  } else if (name == \"-I\" || name == \"--proto_path\") {\n    // Java's -classpath (and some other languages) delimits path components\n    // with colons.  Let's accept that syntax too just to make things more\n    // intuitive.\n    vector<string> parts;\n    SplitStringUsing(value, kPathSeparator, &parts);\n\n    for (int i = 0; i < parts.size(); i++) {\n      string virtual_path;\n      string disk_path;\n\n      int equals_pos = parts[i].find_first_of('=');\n      if (equals_pos == string::npos) {\n        virtual_path = \"\";\n        disk_path = parts[i];\n      } else {\n        virtual_path = parts[i].substr(0, equals_pos);\n        disk_path = parts[i].substr(equals_pos + 1);\n      }\n\n      if (disk_path.empty()) {\n        cerr << \"--proto_path passed empty directory name.  (Use \\\".\\\" for \"\n                \"current directory.)\" << endl;\n        return false;\n      }\n\n      // Make sure disk path exists, warn otherwise.\n      if (access(disk_path.c_str(), F_OK) < 0) {\n        cerr << disk_path << \": warning: directory does not exist.\" << endl;\n      }\n\n      proto_path_.push_back(make_pair<string, string>(virtual_path, disk_path));\n    }\n\n  } else if (name == \"-o\" || name == \"--descriptor_set_out\") {\n    if (!descriptor_set_name_.empty()) {\n      cerr << name << \" may only be passed once.\" << endl;\n      return false;\n    }\n    if (value.empty()) {\n      cerr << name << \" requires a non-empty value.\" << endl;\n      return false;\n    }\n    if (mode_ != MODE_COMPILE) {\n      cerr << \"Cannot use --encode or --decode and generate descriptors at the \"\n              \"same time.\" << endl;\n      return false;\n    }\n    descriptor_set_name_ = value;\n\n  } else if (name == \"--include_imports\") {\n    if (imports_in_descriptor_set_) {\n      cerr << name << \" may only be passed once.\" << endl;\n      return false;\n    }\n    imports_in_descriptor_set_ = true;\n\n  } else if (name == \"-h\" || name == \"--help\") {\n    PrintHelpText();\n    return false;  // Exit without running compiler.\n\n  } else if (name == \"--version\") {\n    if (!version_info_.empty()) {\n      cout << version_info_ << endl;\n    }\n    cout << \"libprotoc \"\n         << protobuf::internal::VersionString(GOOGLE_PROTOBUF_VERSION)\n         << endl;\n    return false;  // Exit without running compiler.\n\n  } else if (name == \"--disallow_services\") {\n    disallow_services_ = true;\n\n  } else if (name == \"--encode\" || name == \"--decode\" ||\n             name == \"--decode_raw\") {\n    if (mode_ != MODE_COMPILE) {\n      cerr << \"Only one of --encode and --decode can be specified.\" << endl;\n      return false;\n    }\n    if (!output_directives_.empty() || !descriptor_set_name_.empty()) {\n      cerr << \"Cannot use \" << name\n           << \" and generate code or descriptors at the same time.\" << endl;\n      return false;\n    }\n\n    mode_ = (name == \"--encode\") ? MODE_ENCODE : MODE_DECODE;\n\n    if (value.empty() && name != \"--decode_raw\") {\n      cerr << \"Type name for \" << name << \" cannot be blank.\" << endl;\n      if (name == \"--decode\") {\n        cerr << \"To decode an unknown message, use --decode_raw.\" << endl;\n      }\n      return false;\n    } else if (!value.empty() && name == \"--decode_raw\") {\n      cerr << \"--decode_raw does not take a parameter.\" << endl;\n      return false;\n    }\n\n    codec_type_ = value;\n\n  } else if (name == \"--error_format\") {\n    if (value == \"gcc\") {\n      error_format_ = ERROR_FORMAT_GCC;\n    } else if (value == \"msvs\") {\n      error_format_ = ERROR_FORMAT_MSVS;\n    } else {\n      cerr << \"Unknown error format: \" << value << endl;\n      return false;\n    }\n\n  } else if (name == \"--plugin\") {\n    if (plugin_prefix_.empty()) {\n      cerr << \"This compiler does not support plugins.\" << endl;\n      return false;\n    }\n\n    string name;\n    string path;\n\n    string::size_type equals_pos = value.find_first_of('=');\n    if (equals_pos == string::npos) {\n      // Use the basename of the file.\n      string::size_type slash_pos = value.find_last_of('/');\n      if (slash_pos == string::npos) {\n        name = value;\n      } else {\n        name = value.substr(slash_pos + 1);\n      }\n      path = value;\n    } else {\n      name = value.substr(0, equals_pos);\n      path = value.substr(equals_pos + 1);\n    }\n\n    plugins_[name] = path;\n\n  } else {\n    // Some other flag.  Look it up in the generators list.\n    const GeneratorInfo* generator_info = FindOrNull(generators_, name);\n    if (generator_info == NULL &&\n        (plugin_prefix_.empty() || !HasSuffixString(name, \"_out\"))) {\n      cerr << \"Unknown flag: \" << name << endl;\n      return false;\n    }\n\n    // It's an output flag.  Add it to the output directives.\n    if (mode_ != MODE_COMPILE) {\n      cerr << \"Cannot use --encode or --decode and generate code at the \"\n              \"same time.\" << endl;\n      return false;\n    }\n\n    OutputDirective directive;\n    directive.name = name;\n    if (generator_info == NULL) {\n      directive.generator = NULL;\n    } else {\n      directive.generator = generator_info->generator;\n    }\n\n    // Split value at ':' to separate the generator parameter from the\n    // filename.  However, avoid doing this if the colon is part of a valid\n    // Windows-style absolute path.\n    string::size_type colon_pos = value.find_first_of(':');\n    if (colon_pos == string::npos || IsWindowsAbsolutePath(value)) {\n      directive.output_location = value;\n    } else {\n      directive.parameter = value.substr(0, colon_pos);\n      directive.output_location = value.substr(colon_pos + 1);\n    }\n\n    output_directives_.push_back(directive);\n  }\n\n  return true;\n}\n\nvoid CommandLineInterface::PrintHelpText() {\n  // Sorry for indentation here; line wrapping would be uglier.\n  cerr <<\n\"Usage: \" << executable_name_ << \" [OPTION] PROTO_FILES\\n\"\n\"Parse PROTO_FILES and generate output based on the options given:\\n\"\n\"  -IPATH, --proto_path=PATH   Specify the directory in which to search for\\n\"\n\"                              imports.  May be specified multiple times;\\n\"\n\"                              directories will be searched in order.  If not\\n\"\n\"                              given, the current working directory is used.\\n\"\n\"  --version                   Show version info and exit.\\n\"\n\"  -h, --help                  Show this text and exit.\\n\"\n\"  --encode=MESSAGE_TYPE       Read a text-format message of the given type\\n\"\n\"                              from standard input and write it in binary\\n\"\n\"                              to standard output.  The message type must\\n\"\n\"                              be defined in PROTO_FILES or their imports.\\n\"\n\"  --decode=MESSAGE_TYPE       Read a binary message of the given type from\\n\"\n\"                              standard input and write it in text format\\n\"\n\"                              to standard output.  The message type must\\n\"\n\"                              be defined in PROTO_FILES or their imports.\\n\"\n\"  --decode_raw                Read an arbitrary protocol message from\\n\"\n\"                              standard input and write the raw tag/value\\n\"\n\"                              pairs in text format to standard output.  No\\n\"\n\"                              PROTO_FILES should be given when using this\\n\"\n\"                              flag.\\n\"\n\"  -oFILE,                     Writes a FileDescriptorSet (a protocol buffer,\\n\"\n\"    --descriptor_set_out=FILE defined in descriptor.proto) containing all of\\n\"\n\"                              the input files to FILE.\\n\"\n\"  --include_imports           When using --descriptor_set_out, also include\\n\"\n\"                              all dependencies of the input files in the\\n\"\n\"                              set, so that the set is self-contained.\\n\"\n\"  --error_format=FORMAT       Set the format in which to print errors.\\n\"\n\"                              FORMAT may be 'gcc' (the default) or 'msvs'\\n\"\n\"                              (Microsoft Visual Studio format).\" << endl;\n  if (!plugin_prefix_.empty()) {\n    cerr <<\n\"  --plugin=EXECUTABLE         Specifies a plugin executable to use.\\n\"\n\"                              Normally, protoc searches the PATH for\\n\"\n\"                              plugins, but you may specify additional\\n\"\n\"                              executables not in the path using this flag.\\n\"\n\"                              Additionally, EXECUTABLE may be of the form\\n\"\n\"                              NAME=PATH, in which case the given plugin name\\n\"\n\"                              is mapped to the given executable even if\\n\"\n\"                              the executable's own name differs.\" << endl;\n  }\n\n  for (GeneratorMap::iterator iter = generators_.begin();\n       iter != generators_.end(); ++iter) {\n    // FIXME(kenton):  If the text is long enough it will wrap, which is ugly,\n    //   but fixing this nicely (e.g. splitting on spaces) is probably more\n    //   trouble than it's worth.\n    cerr << \"  \" << iter->first << \"=OUT_DIR \"\n         << string(19 - iter->first.size(), ' ')  // Spaces for alignment.\n         << iter->second.help_text << endl;\n  }\n}\n\nbool CommandLineInterface::GenerateOutput(\n    const vector<const FileDescriptor*>& parsed_files,\n    const OutputDirective& output_directive,\n    GeneratorContext* generator_context) {\n  // Call the generator.\n  string error;\n  if (output_directive.generator == NULL) {\n    // This is a plugin.\n    GOOGLE_CHECK(HasPrefixString(output_directive.name, \"--\") &&\n          HasSuffixString(output_directive.name, \"_out\"))\n        << \"Bad name for plugin generator: \" << output_directive.name;\n\n    // Strip the \"--\" and \"_out\" and add the plugin prefix.\n    string plugin_name = plugin_prefix_ + \"gen-\" +\n        output_directive.name.substr(2, output_directive.name.size() - 6);\n\n    if (!GeneratePluginOutput(parsed_files, plugin_name,\n                              output_directive.parameter,\n                              generator_context, &error)) {\n      cerr << output_directive.name << \": \" << error << endl;\n      return false;\n    }\n  } else {\n    // Regular generator.\n    for (int i = 0; i < parsed_files.size(); i++) {\n      if (!output_directive.generator->Generate(\n          parsed_files[i], output_directive.parameter,\n          generator_context, &error)) {\n        // Generator returned an error.\n        cerr << output_directive.name << \": \" << parsed_files[i]->name() << \": \"\n             << error << endl;\n        return false;\n      }\n    }\n  }\n\n  return true;\n}\n\nbool CommandLineInterface::GeneratePluginOutput(\n    const vector<const FileDescriptor*>& parsed_files,\n    const string& plugin_name,\n    const string& parameter,\n    GeneratorContext* generator_context,\n    string* error) {\n  CodeGeneratorRequest request;\n  CodeGeneratorResponse response;\n\n  // Build the request.\n  if (!parameter.empty()) {\n    request.set_parameter(parameter);\n  }\n\n  set<const FileDescriptor*> already_seen;\n  for (int i = 0; i < parsed_files.size(); i++) {\n    request.add_file_to_generate(parsed_files[i]->name());\n    GetTransitiveDependencies(parsed_files[i], &already_seen,\n                              request.mutable_proto_file());\n  }\n\n  // Invoke the plugin.\n  Subprocess subprocess;\n\n  if (plugins_.count(plugin_name) > 0) {\n    subprocess.Start(plugins_[plugin_name], Subprocess::EXACT_NAME);\n  } else {\n    subprocess.Start(plugin_name, Subprocess::SEARCH_PATH);\n  }\n\n  string communicate_error;\n  if (!subprocess.Communicate(request, &response, &communicate_error)) {\n    *error = strings::Substitute(\"$0: $1\", plugin_name, communicate_error);\n    return false;\n  }\n\n  // Write the files.  We do this even if there was a generator error in order\n  // to match the behavior of a compiled-in generator.\n  scoped_ptr<io::ZeroCopyOutputStream> current_output;\n  for (int i = 0; i < response.file_size(); i++) {\n    const CodeGeneratorResponse::File& output_file = response.file(i);\n\n    if (!output_file.insertion_point().empty()) {\n      // Open a file for insert.\n      // We reset current_output to NULL first so that the old file is closed\n      // before the new one is opened.\n      current_output.reset();\n      current_output.reset(generator_context->OpenForInsert(\n          output_file.name(), output_file.insertion_point()));\n    } else if (!output_file.name().empty()) {\n      // Starting a new file.  Open it.\n      // We reset current_output to NULL first so that the old file is closed\n      // before the new one is opened.\n      current_output.reset();\n      current_output.reset(generator_context->Open(output_file.name()));\n    } else if (current_output == NULL) {\n      *error = strings::Substitute(\n        \"$0: First file chunk returned by plugin did not specify a file name.\",\n        plugin_name);\n      return false;\n    }\n\n    // Use CodedOutputStream for convenience; otherwise we'd need to provide\n    // our own buffer-copying loop.\n    io::CodedOutputStream writer(current_output.get());\n    writer.WriteString(output_file.content());\n  }\n\n  // Check for errors.\n  if (!response.error().empty()) {\n    // Generator returned an error.\n    *error = response.error();\n    return false;\n  }\n\n  return true;\n}\n\nbool CommandLineInterface::EncodeOrDecode(const DescriptorPool* pool) {\n  // Look up the type.\n  const Descriptor* type = pool->FindMessageTypeByName(codec_type_);\n  if (type == NULL) {\n    cerr << \"Type not defined: \" << codec_type_ << endl;\n    return false;\n  }\n\n  DynamicMessageFactory dynamic_factory(pool);\n  scoped_ptr<Message> message(dynamic_factory.GetPrototype(type)->New());\n\n  if (mode_ == MODE_ENCODE) {\n    SetFdToTextMode(STDIN_FILENO);\n    SetFdToBinaryMode(STDOUT_FILENO);\n  } else {\n    SetFdToBinaryMode(STDIN_FILENO);\n    SetFdToTextMode(STDOUT_FILENO);\n  }\n\n  io::FileInputStream in(STDIN_FILENO);\n  io::FileOutputStream out(STDOUT_FILENO);\n\n  if (mode_ == MODE_ENCODE) {\n    // Input is text.\n    ErrorPrinter error_collector(error_format_);\n    TextFormat::Parser parser;\n    parser.RecordErrorsTo(&error_collector);\n    parser.AllowPartialMessage(true);\n\n    if (!parser.Parse(&in, message.get())) {\n      cerr << \"Failed to parse input.\" << endl;\n      return false;\n    }\n  } else {\n    // Input is binary.\n    if (!message->ParsePartialFromZeroCopyStream(&in)) {\n      cerr << \"Failed to parse input.\" << endl;\n      return false;\n    }\n  }\n\n  if (!message->IsInitialized()) {\n    cerr << \"warning:  Input message is missing required fields:  \"\n         << message->InitializationErrorString() << endl;\n  }\n\n  if (mode_ == MODE_ENCODE) {\n    // Output is binary.\n    if (!message->SerializePartialToZeroCopyStream(&out)) {\n      cerr << \"output: I/O error.\" << endl;\n      return false;\n    }\n  } else {\n    // Output is text.\n    if (!TextFormat::Print(*message, &out)) {\n      cerr << \"output: I/O error.\" << endl;\n      return false;\n    }\n  }\n\n  return true;\n}\n\nbool CommandLineInterface::WriteDescriptorSet(\n    const vector<const FileDescriptor*> parsed_files) {\n  FileDescriptorSet file_set;\n\n  if (imports_in_descriptor_set_) {\n    set<const FileDescriptor*> already_seen;\n    for (int i = 0; i < parsed_files.size(); i++) {\n      GetTransitiveDependencies(\n          parsed_files[i], &already_seen, file_set.mutable_file());\n    }\n  } else {\n    for (int i = 0; i < parsed_files.size(); i++) {\n      parsed_files[i]->CopyTo(file_set.add_file());\n    }\n  }\n\n  int fd;\n  do {\n    fd = open(descriptor_set_name_.c_str(),\n              O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666);\n  } while (fd < 0 && errno == EINTR);\n\n  if (fd < 0) {\n    perror(descriptor_set_name_.c_str());\n    return false;\n  }\n\n  io::FileOutputStream out(fd);\n  if (!file_set.SerializeToZeroCopyStream(&out)) {\n    cerr << descriptor_set_name_ << \": \" << strerror(out.GetErrno()) << endl;\n    out.Close();\n    return false;\n  }\n  if (!out.Close()) {\n    cerr << descriptor_set_name_ << \": \" << strerror(out.GetErrno()) << endl;\n    return false;\n  }\n\n  return true;\n}\n\nvoid CommandLineInterface::GetTransitiveDependencies(\n    const FileDescriptor* file,\n    set<const FileDescriptor*>* already_seen,\n    RepeatedPtrField<FileDescriptorProto>* output) {\n  if (!already_seen->insert(file).second) {\n    // Already saw this file.  Skip.\n    return;\n  }\n\n  // Add all dependencies.\n  for (int i = 0; i < file->dependency_count(); i++) {\n    GetTransitiveDependencies(file->dependency(i), already_seen, output);\n  }\n\n  // Add this file.\n  file->CopyTo(output->Add());\n}\n\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Implements the Protocol Compiler front-end such that it may be reused by\n// custom compilers written to support other languages.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__\n#define GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__\n\n#include <google/protobuf/stubs/common.h>\n#include <string>\n#include <vector>\n#include <map>\n#include <set>\n#include <utility>\n\nnamespace google {\nnamespace protobuf {\n\nclass FileDescriptor;        // descriptor.h\nclass DescriptorPool;        // descriptor.h\nclass FileDescriptorProto;   // descriptor.pb.h\ntemplate<typename T> class RepeatedPtrField;  // repeated_field.h\n\nnamespace compiler {\n\nclass CodeGenerator;        // code_generator.h\nclass GeneratorContext;      // code_generator.h\nclass DiskSourceTree;       // importer.h\n\n// This class implements the command-line interface to the protocol compiler.\n// It is designed to make it very easy to create a custom protocol compiler\n// supporting the languages of your choice.  For example, if you wanted to\n// create a custom protocol compiler binary which includes both the regular\n// C++ support plus support for your own custom output \"Foo\", you would\n// write a class \"FooGenerator\" which implements the CodeGenerator interface,\n// then write a main() procedure like this:\n//\n//   int main(int argc, char* argv[]) {\n//     google::protobuf::compiler::CommandLineInterface cli;\n//\n//     // Support generation of C++ source and headers.\n//     google::protobuf::compiler::cpp::CppGenerator cpp_generator;\n//     cli.RegisterGenerator(\"--cpp_out\", &cpp_generator,\n//       \"Generate C++ source and header.\");\n//\n//     // Support generation of Foo code.\n//     FooGenerator foo_generator;\n//     cli.RegisterGenerator(\"--foo_out\", &foo_generator,\n//       \"Generate Foo file.\");\n//\n//     return cli.Run(argc, argv);\n//   }\n//\n// The compiler is invoked with syntax like:\n//   protoc --cpp_out=outdir --foo_out=outdir --proto_path=src src/foo.proto\n//\n// For a full description of the command-line syntax, invoke it with --help.\nclass LIBPROTOC_EXPORT CommandLineInterface {\n public:\n  CommandLineInterface();\n  ~CommandLineInterface();\n\n  // Register a code generator for a language.\n  //\n  // Parameters:\n  // * flag_name: The command-line flag used to specify an output file of\n  //   this type.  The name must start with a '-'.  If the name is longer\n  //   than one letter, it must start with two '-'s.\n  // * generator: The CodeGenerator which will be called to generate files\n  //   of this type.\n  // * help_text: Text describing this flag in the --help output.\n  //\n  // Some generators accept extra parameters.  You can specify this parameter\n  // on the command-line by placing it before the output directory, separated\n  // by a colon:\n  //   protoc --foo_out=enable_bar:outdir\n  // The text before the colon is passed to CodeGenerator::Generate() as the\n  // \"parameter\".\n  void RegisterGenerator(const string& flag_name,\n                         CodeGenerator* generator,\n                         const string& help_text);\n\n  // Enables \"plugins\".  In this mode, if a command-line flag ends with \"_out\"\n  // but does not match any registered generator, the compiler will attempt to\n  // find a \"plugin\" to implement the generator.  Plugins are just executables.\n  // They should live somewhere in the PATH.\n  //\n  // The compiler determines the executable name to search for by concatenating\n  // exe_name_prefix with the unrecognized flag name, removing \"_out\".  So, for\n  // example, if exe_name_prefix is \"protoc-\" and you pass the flag --foo_out,\n  // the compiler will try to run the program \"protoc-foo\".\n  //\n  // The plugin program should implement the following usage:\n  //   plugin [--out=OUTDIR] [--parameter=PARAMETER] PROTO_FILES < DESCRIPTORS\n  // --out indicates the output directory (as passed to the --foo_out\n  // parameter); if omitted, the current directory should be used.  --parameter\n  // gives the generator parameter, if any was provided.  The PROTO_FILES list\n  // the .proto files which were given on the compiler command-line; these are\n  // the files for which the plugin is expected to generate output code.\n  // Finally, DESCRIPTORS is an encoded FileDescriptorSet (as defined in\n  // descriptor.proto).  This is piped to the plugin's stdin.  The set will\n  // include descriptors for all the files listed in PROTO_FILES as well as\n  // all files that they import.  The plugin MUST NOT attempt to read the\n  // PROTO_FILES directly -- it must use the FileDescriptorSet.\n  //\n  // The plugin should generate whatever files are necessary, as code generators\n  // normally do.  It should write the names of all files it generates to\n  // stdout.  The names should be relative to the output directory, NOT absolute\n  // names or relative to the current directory.  If any errors occur, error\n  // messages should be written to stderr.  If an error is fatal, the plugin\n  // should exit with a non-zero exit code.\n  void AllowPlugins(const string& exe_name_prefix);\n\n  // Run the Protocol Compiler with the given command-line parameters.\n  // Returns the error code which should be returned by main().\n  //\n  // It may not be safe to call Run() in a multi-threaded environment because\n  // it calls strerror().  I'm not sure why you'd want to do this anyway.\n  int Run(int argc, const char* const argv[]);\n\n  // Call SetInputsAreCwdRelative(true) if the input files given on the command\n  // line should be interpreted relative to the proto import path specified\n  // using --proto_path or -I flags.  Otherwise, input file names will be\n  // interpreted relative to the current working directory (or as absolute\n  // paths if they start with '/'), though they must still reside inside\n  // a directory given by --proto_path or the compiler will fail.  The latter\n  // mode is generally more intuitive and easier to use, especially e.g. when\n  // defining implicit rules in Makefiles.\n  void SetInputsAreProtoPathRelative(bool enable) {\n    inputs_are_proto_path_relative_ = enable;\n  }\n\n  // Provides some text which will be printed when the --version flag is\n  // used.  The version of libprotoc will also be printed on the next line\n  // after this text.\n  void SetVersionInfo(const string& text) {\n    version_info_ = text;\n  }\n\n\n private:\n  // -----------------------------------------------------------------\n\n  class ErrorPrinter;\n  class GeneratorContextImpl;\n  class MemoryOutputStream;\n\n  // Clear state from previous Run().\n  void Clear();\n\n  // Remaps each file in input_files_ so that it is relative to one of the\n  // directories in proto_path_.  Returns false if an error occurred.  This\n  // is only used if inputs_are_proto_path_relative_ is false.\n  bool MakeInputsBeProtoPathRelative(\n    DiskSourceTree* source_tree);\n\n  // Parse all command-line arguments.\n  bool ParseArguments(int argc, const char* const argv[]);\n\n  // Parses a command-line argument into a name/value pair.  Returns\n  // true if the next argument in the argv should be used as the value,\n  // false otherwise.\n  //\n  // Exmaples:\n  //   \"-Isrc/protos\" ->\n  //     name = \"-I\", value = \"src/protos\"\n  //   \"--cpp_out=src/foo.pb2.cc\" ->\n  //     name = \"--cpp_out\", value = \"src/foo.pb2.cc\"\n  //   \"foo.proto\" ->\n  //     name = \"\", value = \"foo.proto\"\n  bool ParseArgument(const char* arg, string* name, string* value);\n\n  // Interprets arguments parsed with ParseArgument.\n  bool InterpretArgument(const string& name, const string& value);\n\n  // Print the --help text to stderr.\n  void PrintHelpText();\n\n  // Generate the given output file from the given input.\n  struct OutputDirective;  // see below\n  bool GenerateOutput(const vector<const FileDescriptor*>& parsed_files,\n                      const OutputDirective& output_directive,\n                      GeneratorContext* generator_context);\n  bool GeneratePluginOutput(const vector<const FileDescriptor*>& parsed_files,\n                            const string& plugin_name,\n                            const string& parameter,\n                            GeneratorContext* generator_context,\n                            string* error);\n\n  // Implements --encode and --decode.\n  bool EncodeOrDecode(const DescriptorPool* pool);\n\n  // Implements the --descriptor_set_out option.\n  bool WriteDescriptorSet(const vector<const FileDescriptor*> parsed_files);\n\n  // Get all transitive dependencies of the given file (including the file\n  // itself), adding them to the given list of FileDescriptorProtos.  The\n  // protos will be ordered such that every file is listed before any file that\n  // depends on it, so that you can call DescriptorPool::BuildFile() on them\n  // in order.  Any files in *already_seen will not be added, and each file\n  // added will be inserted into *already_seen.\n  static void GetTransitiveDependencies(\n      const FileDescriptor* file,\n      set<const FileDescriptor*>* already_seen,\n      RepeatedPtrField<FileDescriptorProto>* output);\n\n  // -----------------------------------------------------------------\n\n  // The name of the executable as invoked (i.e. argv[0]).\n  string executable_name_;\n\n  // Version info set with SetVersionInfo().\n  string version_info_;\n\n  // Map from flag names to registered generators.\n  struct GeneratorInfo {\n    CodeGenerator* generator;\n    string help_text;\n  };\n  typedef map<string, GeneratorInfo> GeneratorMap;\n  GeneratorMap generators_;\n\n  // See AllowPlugins().  If this is empty, plugins aren't allowed.\n  string plugin_prefix_;\n\n  // Maps specific plugin names to files.  When executing a plugin, this map\n  // is searched first to find the plugin executable.  If not found here, the\n  // PATH (or other OS-specific search strategy) is searched.\n  map<string, string> plugins_;\n\n  // Stuff parsed from command line.\n  enum Mode {\n    MODE_COMPILE,  // Normal mode:  parse .proto files and compile them.\n    MODE_ENCODE,   // --encode:  read text from stdin, write binary to stdout.\n    MODE_DECODE    // --decode:  read binary from stdin, write text to stdout.\n  };\n\n  Mode mode_;\n\n  enum ErrorFormat {\n    ERROR_FORMAT_GCC,   // GCC error output format (default).\n    ERROR_FORMAT_MSVS   // Visual Studio output (--error_format=msvs).\n  };\n\n  ErrorFormat error_format_;\n\n  vector<pair<string, string> > proto_path_;  // Search path for proto files.\n  vector<string> input_files_;                // Names of the input proto files.\n\n  // output_directives_ lists all the files we are supposed to output and what\n  // generator to use for each.\n  struct OutputDirective {\n    string name;                // E.g. \"--foo_out\"\n    CodeGenerator* generator;   // NULL for plugins\n    string parameter;\n    string output_location;\n  };\n  vector<OutputDirective> output_directives_;\n\n  // When using --encode or --decode, this names the type we are encoding or\n  // decoding.  (Empty string indicates --decode_raw.)\n  string codec_type_;\n\n  // If --descriptor_set_out was given, this is the filename to which the\n  // FileDescriptorSet should be written.  Otherwise, empty.\n  string descriptor_set_name_;\n\n  // True if --include_imports was given, meaning that we should\n  // write all transitive dependencies to the DescriptorSet.  Otherwise, only\n  // the .proto files listed on the command-line are added.\n  bool imports_in_descriptor_set_;\n\n  // Was the --disallow_services flag used?\n  bool disallow_services_;\n\n  // See SetInputsAreProtoPathRelative().\n  bool inputs_are_proto_path_relative_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CommandLineInterface);\n};\n\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#ifdef _MSC_VER\n#include <io.h>\n#else\n#include <unistd.h>\n#endif\n#include <vector>\n\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/compiler/command_line_interface.h>\n#include <google/protobuf/compiler/code_generator.h>\n#include <google/protobuf/compiler/mock_code_generator.h>\n#include <google/protobuf/compiler/subprocess.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/unittest.pb.h>\n#include <google/protobuf/testing/file.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\n#if defined(_WIN32)\n#ifndef STDIN_FILENO\n#define STDIN_FILENO 0\n#endif\n#ifndef STDOUT_FILENO\n#define STDOUT_FILENO 1\n#endif\n#ifndef F_OK\n#define F_OK 00  // not defined by MSVC for whatever reason\n#endif\n#endif\n\nnamespace {\n\nclass CommandLineInterfaceTest : public testing::Test {\n protected:\n  virtual void SetUp();\n  virtual void TearDown();\n\n  // Runs the CommandLineInterface with the given command line.  The\n  // command is automatically split on spaces, and the string \"$tmpdir\"\n  // is replaced with TestTempDir().\n  void Run(const string& command);\n\n  // -----------------------------------------------------------------\n  // Methods to set up the test (called before Run()).\n\n  class NullCodeGenerator;\n\n  // Normally plugins are allowed for all tests.  Call this to explicitly\n  // disable them.\n  void DisallowPlugins() { disallow_plugins_ = true; }\n\n  // Create a temp file within temp_directory_ with the given name.\n  // The containing directory is also created if necessary.\n  void CreateTempFile(const string& name, const string& contents);\n\n  // Create a subdirectory within temp_directory_.\n  void CreateTempDir(const string& name);\n\n  void SetInputsAreProtoPathRelative(bool enable) {\n    cli_.SetInputsAreProtoPathRelative(enable);\n  }\n\n  // -----------------------------------------------------------------\n  // Methods to check the test results (called after Run()).\n\n  // Checks that no text was written to stderr during Run(), and Run()\n  // returned 0.\n  void ExpectNoErrors();\n\n  // Checks that Run() returned non-zero and the stderr output is exactly\n  // the text given.  expected_test may contain references to \"$tmpdir\",\n  // which will be replaced by the temporary directory path.\n  void ExpectErrorText(const string& expected_text);\n\n  // Checks that Run() returned non-zero and the stderr contains the given\n  // substring.\n  void ExpectErrorSubstring(const string& expected_substring);\n\n  // Returns true if ExpectErrorSubstring(expected_substring) would pass, but\n  // does not fail otherwise.\n  bool HasAlternateErrorSubstring(const string& expected_substring);\n\n  // Checks that MockCodeGenerator::Generate() was called in the given\n  // context (or the generator in test_plugin.cc, which produces the same\n  // output).  That is, this tests if the generator with the given name\n  // was called with the given parameter and proto file and produced the\n  // given output file.  This is checked by reading the output file and\n  // checking that it contains the content that MockCodeGenerator would\n  // generate given these inputs.  message_name is the name of the first\n  // message that appeared in the proto file; this is just to make extra\n  // sure that the correct file was parsed.\n  void ExpectGenerated(const string& generator_name,\n                       const string& parameter,\n                       const string& proto_name,\n                       const string& message_name);\n  void ExpectGenerated(const string& generator_name,\n                       const string& parameter,\n                       const string& proto_name,\n                       const string& message_name,\n                       const string& output_directory);\n  void ExpectGeneratedWithMultipleInputs(const string& generator_name,\n                                         const string& all_proto_names,\n                                         const string& proto_name,\n                                         const string& message_name);\n  void ExpectGeneratedWithInsertions(const string& generator_name,\n                                     const string& parameter,\n                                     const string& insertions,\n                                     const string& proto_name,\n                                     const string& message_name);\n\n  void ExpectNullCodeGeneratorCalled(const string& parameter);\n\n  void ReadDescriptorSet(const string& filename,\n                         FileDescriptorSet* descriptor_set);\n\n private:\n  // The object we are testing.\n  CommandLineInterface cli_;\n\n  // Was DisallowPlugins() called?\n  bool disallow_plugins_;\n\n  // We create a directory within TestTempDir() in order to add extra\n  // protection against accidentally deleting user files (since we recursively\n  // delete this directory during the test).  This is the full path of that\n  // directory.\n  string temp_directory_;\n\n  // The result of Run().\n  int return_code_;\n\n  // The captured stderr output.\n  string error_text_;\n\n  // Pointers which need to be deleted later.\n  vector<CodeGenerator*> mock_generators_to_delete_;\n\n  NullCodeGenerator* null_generator_;\n};\n\nclass CommandLineInterfaceTest::NullCodeGenerator : public CodeGenerator {\n public:\n  NullCodeGenerator() : called_(false) {}\n  ~NullCodeGenerator() {}\n\n  mutable bool called_;\n  mutable string parameter_;\n\n  // implements CodeGenerator ----------------------------------------\n  bool Generate(const FileDescriptor* file,\n                const string& parameter,\n                GeneratorContext* context,\n                string* error) const {\n    called_ = true;\n    parameter_ = parameter;\n    return true;\n  }\n};\n\n// ===================================================================\n\nvoid CommandLineInterfaceTest::SetUp() {\n  // Most of these tests were written before this option was added, so we\n  // run with the option on (which used to be the only way) except in certain\n  // tests where we turn it off.\n  cli_.SetInputsAreProtoPathRelative(true);\n\n  temp_directory_ = TestTempDir() + \"/proto2_cli_test_temp\";\n\n  // If the temp directory already exists, it must be left over from a\n  // previous run.  Delete it.\n  if (File::Exists(temp_directory_)) {\n    File::DeleteRecursively(temp_directory_, NULL, NULL);\n  }\n\n  // Create the temp directory.\n  GOOGLE_CHECK(File::CreateDir(temp_directory_.c_str(), DEFAULT_FILE_MODE));\n\n  // Register generators.\n  CodeGenerator* generator = new MockCodeGenerator(\"test_generator\");\n  mock_generators_to_delete_.push_back(generator);\n  cli_.RegisterGenerator(\"--test_out\", generator, \"Test output.\");\n  cli_.RegisterGenerator(\"-t\", generator, \"Test output.\");\n\n  generator = new MockCodeGenerator(\"alt_generator\");\n  mock_generators_to_delete_.push_back(generator);\n  cli_.RegisterGenerator(\"--alt_out\", generator, \"Alt output.\");\n\n  generator = null_generator_ = new NullCodeGenerator();\n  mock_generators_to_delete_.push_back(generator);\n  cli_.RegisterGenerator(\"--null_out\", generator, \"Null output.\");\n\n  disallow_plugins_ = false;\n}\n\nvoid CommandLineInterfaceTest::TearDown() {\n  // Delete the temp directory.\n  File::DeleteRecursively(temp_directory_, NULL, NULL);\n\n  // Delete all the MockCodeGenerators.\n  for (int i = 0; i < mock_generators_to_delete_.size(); i++) {\n    delete mock_generators_to_delete_[i];\n  }\n  mock_generators_to_delete_.clear();\n}\n\nvoid CommandLineInterfaceTest::Run(const string& command) {\n  vector<string> args;\n  SplitStringUsing(command, \" \", &args);\n\n  if (!disallow_plugins_) {\n    cli_.AllowPlugins(\"prefix-\");\n    const char* possible_paths[] = {\n      // When building with shared libraries, libtool hides the real executable\n      // in .libs and puts a fake wrapper in the current directory.\n      // Unfortunately, due to an apparent bug on Cygwin/MinGW, if one program\n      // wrapped in this way (e.g. protobuf-tests.exe) tries to execute another\n      // program wrapped in this way (e.g. test_plugin.exe), the latter fails\n      // with error code 127 and no explanation message.  Presumably the problem\n      // is that the wrapper for protobuf-tests.exe set some environment\n      // variables that confuse the wrapper for test_plugin.exe.  Luckily, it\n      // turns out that if we simply invoke the wrapped test_plugin.exe\n      // directly, it works -- I guess the environment variables set by the\n      // protobuf-tests.exe wrapper happen to be correct for it too.  So we do\n      // that.\n      \".libs/test_plugin.exe\",  // Win32 w/autotool (Cygwin / MinGW)\n      \"test_plugin.exe\",        // Other Win32 (MSVC)\n      \"test_plugin\",            // Unix\n    };\n\n    string plugin_path;\n\n    for (int i = 0; i < GOOGLE_ARRAYSIZE(possible_paths); i++) {\n      if (access(possible_paths[i], F_OK) == 0) {\n        plugin_path = possible_paths[i];\n        break;\n      }\n    }\n\n    if (plugin_path.empty()) {\n      GOOGLE_LOG(ERROR)\n          << \"Plugin executable not found.  Plugin tests are likely to fail.\";\n    } else {\n      args.push_back(\"--plugin=prefix-gen-plug=\" + plugin_path);\n    }\n  }\n\n  scoped_array<const char*> argv(new const char*[args.size()]);\n\n  for (int i = 0; i < args.size(); i++) {\n    args[i] = StringReplace(args[i], \"$tmpdir\", temp_directory_, true);\n    argv[i] = args[i].c_str();\n  }\n\n  CaptureTestStderr();\n\n  return_code_ = cli_.Run(args.size(), argv.get());\n\n  error_text_ = GetCapturedTestStderr();\n}\n\n// -------------------------------------------------------------------\n\nvoid CommandLineInterfaceTest::CreateTempFile(\n    const string& name,\n    const string& contents) {\n  // Create parent directory, if necessary.\n  string::size_type slash_pos = name.find_last_of('/');\n  if (slash_pos != string::npos) {\n    string dir = name.substr(0, slash_pos);\n    File::RecursivelyCreateDir(temp_directory_ + \"/\" + dir, 0777);\n  }\n\n  // Write file.\n  string full_name = temp_directory_ + \"/\" + name;\n  File::WriteStringToFileOrDie(contents, full_name);\n}\n\nvoid CommandLineInterfaceTest::CreateTempDir(const string& name) {\n  File::RecursivelyCreateDir(temp_directory_ + \"/\" + name, 0777);\n}\n\n// -------------------------------------------------------------------\n\nvoid CommandLineInterfaceTest::ExpectNoErrors() {\n  EXPECT_EQ(0, return_code_);\n  EXPECT_EQ(\"\", error_text_);\n}\n\nvoid CommandLineInterfaceTest::ExpectErrorText(const string& expected_text) {\n  EXPECT_NE(0, return_code_);\n  EXPECT_EQ(StringReplace(expected_text, \"$tmpdir\", temp_directory_, true),\n            error_text_);\n}\n\nvoid CommandLineInterfaceTest::ExpectErrorSubstring(\n    const string& expected_substring) {\n  EXPECT_NE(0, return_code_);\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_substring, error_text_);\n}\n\nbool CommandLineInterfaceTest::HasAlternateErrorSubstring(\n    const string& expected_substring) {\n  EXPECT_NE(0, return_code_);\n  return error_text_.find(expected_substring) != string::npos;\n}\n\nvoid CommandLineInterfaceTest::ExpectGenerated(\n    const string& generator_name,\n    const string& parameter,\n    const string& proto_name,\n    const string& message_name) {\n  MockCodeGenerator::ExpectGenerated(\n      generator_name, parameter, \"\", proto_name, message_name, proto_name,\n      temp_directory_);\n}\n\nvoid CommandLineInterfaceTest::ExpectGenerated(\n    const string& generator_name,\n    const string& parameter,\n    const string& proto_name,\n    const string& message_name,\n    const string& output_directory) {\n  MockCodeGenerator::ExpectGenerated(\n      generator_name, parameter, \"\", proto_name, message_name, proto_name,\n      temp_directory_ + \"/\" + output_directory);\n}\n\nvoid CommandLineInterfaceTest::ExpectGeneratedWithMultipleInputs(\n    const string& generator_name,\n    const string& all_proto_names,\n    const string& proto_name,\n    const string& message_name) {\n  MockCodeGenerator::ExpectGenerated(\n      generator_name, \"\", \"\", proto_name, message_name,\n      all_proto_names,\n      temp_directory_);\n}\n\nvoid CommandLineInterfaceTest::ExpectGeneratedWithInsertions(\n    const string& generator_name,\n    const string& parameter,\n    const string& insertions,\n    const string& proto_name,\n    const string& message_name) {\n  MockCodeGenerator::ExpectGenerated(\n      generator_name, parameter, insertions, proto_name, message_name,\n      proto_name, temp_directory_);\n}\n\nvoid CommandLineInterfaceTest::ExpectNullCodeGeneratorCalled(\n    const string& parameter) {\n  EXPECT_TRUE(null_generator_->called_);\n  EXPECT_EQ(parameter, null_generator_->parameter_);\n}\n\nvoid CommandLineInterfaceTest::ReadDescriptorSet(\n    const string& filename, FileDescriptorSet* descriptor_set) {\n  string path = temp_directory_ + \"/\" + filename;\n  string file_contents;\n  if (!File::ReadFileToString(path, &file_contents)) {\n    FAIL() << \"File not found: \" << path;\n  }\n  if (!descriptor_set->ParseFromString(file_contents)) {\n    FAIL() << \"Could not parse file contents: \" << path;\n  }\n}\n\n// ===================================================================\n\nTEST_F(CommandLineInterfaceTest, BasicOutput) {\n  // Test that the common case works.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"foo.proto\", \"Foo\");\n}\n\nTEST_F(CommandLineInterfaceTest, BasicPlugin) {\n  // Test that basic plugins work.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --plug_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_plugin\", \"\", \"foo.proto\", \"Foo\");\n}\n\nTEST_F(CommandLineInterfaceTest, GeneratorAndPlugin) {\n  // Invoke a generator and a plugin at the same time.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"foo.proto\", \"Foo\");\n  ExpectGenerated(\"test_plugin\", \"\", \"foo.proto\", \"Foo\");\n}\n\nTEST_F(CommandLineInterfaceTest, MultipleInputs) {\n  // Test parsing multiple input files.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n  CreateTempFile(\"bar.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Bar {}\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto bar.proto\");\n\n  ExpectNoErrors();\n  ExpectGeneratedWithMultipleInputs(\"test_generator\", \"foo.proto,bar.proto\",\n                                    \"foo.proto\", \"Foo\");\n  ExpectGeneratedWithMultipleInputs(\"test_generator\", \"foo.proto,bar.proto\",\n                                    \"bar.proto\", \"Bar\");\n  ExpectGeneratedWithMultipleInputs(\"test_plugin\", \"foo.proto,bar.proto\",\n                                    \"foo.proto\", \"Foo\");\n  ExpectGeneratedWithMultipleInputs(\"test_plugin\", \"foo.proto,bar.proto\",\n                                    \"bar.proto\", \"Bar\");\n}\n\nTEST_F(CommandLineInterfaceTest, MultipleInputsWithImport) {\n  // Test parsing multiple input files with an import of a separate file.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n  CreateTempFile(\"bar.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"import \\\"baz.proto\\\";\\n\"\n    \"message Bar {\\n\"\n    \"  optional Baz a = 1;\\n\"\n    \"}\\n\");\n  CreateTempFile(\"baz.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Baz {}\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto bar.proto\");\n\n  ExpectNoErrors();\n  ExpectGeneratedWithMultipleInputs(\"test_generator\", \"foo.proto,bar.proto\",\n                                    \"foo.proto\", \"Foo\");\n  ExpectGeneratedWithMultipleInputs(\"test_generator\", \"foo.proto,bar.proto\",\n                                    \"bar.proto\", \"Bar\");\n  ExpectGeneratedWithMultipleInputs(\"test_plugin\", \"foo.proto,bar.proto\",\n                                    \"foo.proto\", \"Foo\");\n  ExpectGeneratedWithMultipleInputs(\"test_plugin\", \"foo.proto,bar.proto\",\n                                    \"bar.proto\", \"Bar\");\n}\n\nTEST_F(CommandLineInterfaceTest, CreateDirectory) {\n  // Test that when we output to a sub-directory, it is created.\n\n  CreateTempFile(\"bar/baz/foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n  CreateTempDir(\"out\");\n  CreateTempDir(\"plugout\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir/out --plug_out=$tmpdir/plugout \"\n      \"--proto_path=$tmpdir bar/baz/foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"bar/baz/foo.proto\", \"Foo\", \"out\");\n  ExpectGenerated(\"test_plugin\", \"\", \"bar/baz/foo.proto\", \"Foo\", \"plugout\");\n}\n\nTEST_F(CommandLineInterfaceTest, GeneratorParameters) {\n  // Test that generator parameters are correctly parsed from the command line.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --test_out=TestParameter:$tmpdir \"\n      \"--plug_out=TestPluginParameter:$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"TestParameter\", \"foo.proto\", \"Foo\");\n  ExpectGenerated(\"test_plugin\", \"TestPluginParameter\", \"foo.proto\", \"Foo\");\n}\n\nTEST_F(CommandLineInterfaceTest, Insert) {\n  // Test running a generator that inserts code into another's output.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler \"\n      \"--test_out=TestParameter:$tmpdir \"\n      \"--plug_out=TestPluginParameter:$tmpdir \"\n      \"--test_out=insert=test_generator,test_plugin:$tmpdir \"\n      \"--plug_out=insert=test_generator,test_plugin:$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGeneratedWithInsertions(\n      \"test_generator\", \"TestParameter\", \"test_generator,test_plugin\",\n      \"foo.proto\", \"Foo\");\n  ExpectGeneratedWithInsertions(\n      \"test_plugin\", \"TestPluginParameter\", \"test_generator,test_plugin\",\n      \"foo.proto\", \"Foo\");\n}\n\n#if defined(_WIN32)\n\nTEST_F(CommandLineInterfaceTest, WindowsOutputPath) {\n  // Test that the output path can be a Windows-style path.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\");\n\n  Run(\"protocol_compiler --null_out=C:\\\\ \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectNoErrors();\n  ExpectNullCodeGeneratorCalled(\"\");\n}\n\nTEST_F(CommandLineInterfaceTest, WindowsOutputPathAndParameter) {\n  // Test that we can have a windows-style output path and a parameter.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\");\n\n  Run(\"protocol_compiler --null_out=bar:C:\\\\ \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectNoErrors();\n  ExpectNullCodeGeneratorCalled(\"bar\");\n}\n\nTEST_F(CommandLineInterfaceTest, TrailingBackslash) {\n  // Test that the directories can end in backslashes.  Some users claim this\n  // doesn't work on their system.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir\\\\ \"\n      \"--proto_path=$tmpdir\\\\ foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"foo.proto\", \"Foo\");\n}\n\n#endif  // defined(_WIN32) || defined(__CYGWIN__)\n\nTEST_F(CommandLineInterfaceTest, PathLookup) {\n  // Test that specifying multiple directories in the proto search path works.\n\n  CreateTempFile(\"b/bar.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Bar {}\\n\");\n  CreateTempFile(\"a/foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"import \\\"bar.proto\\\";\\n\"\n    \"message Foo {\\n\"\n    \"  optional Bar a = 1;\\n\"\n    \"}\\n\");\n  CreateTempFile(\"b/foo.proto\", \"this should not be parsed\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir/a --proto_path=$tmpdir/b foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"foo.proto\", \"Foo\");\n}\n\nTEST_F(CommandLineInterfaceTest, ColonDelimitedPath) {\n  // Same as PathLookup, but we provide the proto_path in a single flag.\n\n  CreateTempFile(\"b/bar.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Bar {}\\n\");\n  CreateTempFile(\"a/foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"import \\\"bar.proto\\\";\\n\"\n    \"message Foo {\\n\"\n    \"  optional Bar a = 1;\\n\"\n    \"}\\n\");\n  CreateTempFile(\"b/foo.proto\", \"this should not be parsed\\n\");\n\n#undef PATH_SEPARATOR\n#if defined(_WIN32)\n#define PATH_SEPARATOR \";\"\n#else\n#define PATH_SEPARATOR \":\"\n#endif\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir/a\"PATH_SEPARATOR\"$tmpdir/b foo.proto\");\n\n#undef PATH_SEPARATOR\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"foo.proto\", \"Foo\");\n}\n\nTEST_F(CommandLineInterfaceTest, NonRootMapping) {\n  // Test setting up a search path mapping a directory to a non-root location.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=bar=$tmpdir bar/foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"bar/foo.proto\", \"Foo\");\n}\n\nTEST_F(CommandLineInterfaceTest, MultipleGenerators) {\n  // Test that we can have multiple generators and use both in one invocation,\n  // each with a different output directory.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n  // Create the \"a\" and \"b\" sub-directories.\n  CreateTempDir(\"a\");\n  CreateTempDir(\"b\");\n\n  Run(\"protocol_compiler \"\n      \"--test_out=$tmpdir/a \"\n      \"--alt_out=$tmpdir/b \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"foo.proto\", \"Foo\", \"a\");\n  ExpectGenerated(\"alt_generator\", \"\", \"foo.proto\", \"Foo\", \"b\");\n}\n\nTEST_F(CommandLineInterfaceTest, DisallowServicesNoServices) {\n  // Test that --disallow_services doesn't cause a problem when there are no\n  // services.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --disallow_services --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"foo.proto\", \"Foo\");\n}\n\nTEST_F(CommandLineInterfaceTest, DisallowServicesHasService) {\n  // Test that --disallow_services produces an error when there are services.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\"\n    \"service Bar {}\\n\");\n\n  Run(\"protocol_compiler --disallow_services --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectErrorSubstring(\"foo.proto: This file contains services\");\n}\n\nTEST_F(CommandLineInterfaceTest, AllowServicesHasService) {\n  // Test that services work fine as long as --disallow_services is not used.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\"\n    \"service Bar {}\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"foo.proto\", \"Foo\");\n}\n\nTEST_F(CommandLineInterfaceTest, CwdRelativeInputs) {\n  // Test that we can accept working-directory-relative input files.\n\n  SetInputsAreProtoPathRelative(false);\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir $tmpdir/foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"foo.proto\", \"Foo\");\n}\n\nTEST_F(CommandLineInterfaceTest, WriteDescriptorSet) {\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n  CreateTempFile(\"bar.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"import \\\"foo.proto\\\";\\n\"\n    \"message Bar {\\n\"\n    \"  optional Foo foo = 1;\\n\"\n    \"}\\n\");\n\n  Run(\"protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set \"\n      \"--proto_path=$tmpdir bar.proto\");\n\n  ExpectNoErrors();\n\n  FileDescriptorSet descriptor_set;\n  ReadDescriptorSet(\"descriptor_set\", &descriptor_set);\n  if (HasFatalFailure()) return;\n  ASSERT_EQ(1, descriptor_set.file_size());\n  EXPECT_EQ(\"bar.proto\", descriptor_set.file(0).name());\n}\n\nTEST_F(CommandLineInterfaceTest, WriteTransitiveDescriptorSet) {\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n  CreateTempFile(\"bar.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"import \\\"foo.proto\\\";\\n\"\n    \"message Bar {\\n\"\n    \"  optional Foo foo = 1;\\n\"\n    \"}\\n\");\n\n  Run(\"protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set \"\n      \"--include_imports --proto_path=$tmpdir bar.proto\");\n\n  ExpectNoErrors();\n\n  FileDescriptorSet descriptor_set;\n  ReadDescriptorSet(\"descriptor_set\", &descriptor_set);\n  if (HasFatalFailure()) return;\n  ASSERT_EQ(2, descriptor_set.file_size());\n  if (descriptor_set.file(0).name() == \"bar.proto\") {\n    std::swap(descriptor_set.mutable_file()->mutable_data()[0],\n              descriptor_set.mutable_file()->mutable_data()[1]);\n  }\n  EXPECT_EQ(\"foo.proto\", descriptor_set.file(0).name());\n  EXPECT_EQ(\"bar.proto\", descriptor_set.file(1).name());\n}\n\n// -------------------------------------------------------------------\n\nTEST_F(CommandLineInterfaceTest, ParseErrors) {\n  // Test that parse errors are reported.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"badsyntax\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectErrorText(\n    \"foo.proto:2:1: Expected top-level statement (e.g. \\\"message\\\").\\n\");\n}\n\nTEST_F(CommandLineInterfaceTest, ParseErrorsMultipleFiles) {\n  // Test that parse errors are reported from multiple files.\n\n  // We set up files such that foo.proto actually depends on bar.proto in\n  // two ways:  Directly and through baz.proto.  bar.proto's errors should\n  // only be reported once.\n  CreateTempFile(\"bar.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"badsyntax\\n\");\n  CreateTempFile(\"baz.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"import \\\"bar.proto\\\";\\n\");\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"import \\\"bar.proto\\\";\\n\"\n    \"import \\\"baz.proto\\\";\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectErrorText(\n    \"bar.proto:2:1: Expected top-level statement (e.g. \\\"message\\\").\\n\"\n    \"baz.proto: Import \\\"bar.proto\\\" was not found or had errors.\\n\"\n    \"foo.proto: Import \\\"bar.proto\\\" was not found or had errors.\\n\"\n    \"foo.proto: Import \\\"baz.proto\\\" was not found or had errors.\\n\");\n}\n\nTEST_F(CommandLineInterfaceTest, InputNotFoundError) {\n  // Test what happens if the input file is not found.\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectErrorText(\n    \"foo.proto: File not found.\\n\");\n}\n\nTEST_F(CommandLineInterfaceTest, CwdRelativeInputNotFoundError) {\n  // Test what happens when a working-directory-relative input file is not\n  // found.\n\n  SetInputsAreProtoPathRelative(false);\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir $tmpdir/foo.proto\");\n\n  ExpectErrorText(\n    \"$tmpdir/foo.proto: No such file or directory\\n\");\n}\n\nTEST_F(CommandLineInterfaceTest, CwdRelativeInputNotMappedError) {\n  // Test what happens when a working-directory-relative input file is not\n  // mapped to a virtual path.\n\n  SetInputsAreProtoPathRelative(false);\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  // Create a directory called \"bar\" so that we can point --proto_path at it.\n  CreateTempFile(\"bar/dummy\", \"\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir/bar $tmpdir/foo.proto\");\n\n  ExpectErrorText(\n    \"$tmpdir/foo.proto: File does not reside within any path \"\n      \"specified using --proto_path (or -I).  You must specify a \"\n      \"--proto_path which encompasses this file.  Note that the \"\n      \"proto_path must be an exact prefix of the .proto file \"\n      \"names -- protoc is too dumb to figure out when two paths \"\n      \"(e.g. absolute and relative) are equivalent (it's harder \"\n      \"than you think).\\n\");\n}\n\nTEST_F(CommandLineInterfaceTest, CwdRelativeInputNotFoundAndNotMappedError) {\n  // Check what happens if the input file is not found *and* is not mapped\n  // in the proto_path.\n\n  SetInputsAreProtoPathRelative(false);\n\n  // Create a directory called \"bar\" so that we can point --proto_path at it.\n  CreateTempFile(\"bar/dummy\", \"\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir/bar $tmpdir/foo.proto\");\n\n  ExpectErrorText(\n    \"$tmpdir/foo.proto: No such file or directory\\n\");\n}\n\nTEST_F(CommandLineInterfaceTest, CwdRelativeInputShadowedError) {\n  // Test what happens when a working-directory-relative input file is shadowed\n  // by another file in the virtual path.\n\n  SetInputsAreProtoPathRelative(false);\n\n  CreateTempFile(\"foo/foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n  CreateTempFile(\"bar/foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Bar {}\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir/foo --proto_path=$tmpdir/bar \"\n      \"$tmpdir/bar/foo.proto\");\n\n  ExpectErrorText(\n    \"$tmpdir/bar/foo.proto: Input is shadowed in the --proto_path \"\n    \"by \\\"$tmpdir/foo/foo.proto\\\".  Either use the latter \"\n    \"file as your input or reorder the --proto_path so that the \"\n    \"former file's location comes first.\\n\");\n}\n\nTEST_F(CommandLineInterfaceTest, ProtoPathNotFoundError) {\n  // Test what happens if the input file is not found.\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir/foo foo.proto\");\n\n  ExpectErrorText(\n    \"$tmpdir/foo: warning: directory does not exist.\\n\"\n    \"foo.proto: File not found.\\n\");\n}\n\nTEST_F(CommandLineInterfaceTest, MissingInputError) {\n  // Test that we get an error if no inputs are given.\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir\");\n\n  ExpectErrorText(\"Missing input file.\\n\");\n}\n\nTEST_F(CommandLineInterfaceTest, MissingOutputError) {\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --proto_path=$tmpdir foo.proto\");\n\n  ExpectErrorText(\"Missing output directives.\\n\");\n}\n\nTEST_F(CommandLineInterfaceTest, OutputWriteError) {\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  string output_file =\n      MockCodeGenerator::GetOutputFileName(\"test_generator\", \"foo.proto\");\n\n  // Create a directory blocking our output location.\n  CreateTempDir(output_file);\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  // MockCodeGenerator no longer detects an error because we actually write to\n  // an in-memory location first, then dump to disk at the end.  This is no\n  // big deal.\n  //   ExpectErrorSubstring(\"MockCodeGenerator detected write error.\");\n\n#if defined(_WIN32) && !defined(__CYGWIN__)\n  // Windows with MSVCRT.dll produces EPERM instead of EISDIR.\n  if (HasAlternateErrorSubstring(output_file + \": Permission denied\")) {\n    return;\n  }\n#endif\n\n  ExpectErrorSubstring(output_file + \": Is a directory\");\n}\n\nTEST_F(CommandLineInterfaceTest, PluginOutputWriteError) {\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  string output_file =\n      MockCodeGenerator::GetOutputFileName(\"test_plugin\", \"foo.proto\");\n\n  // Create a directory blocking our output location.\n  CreateTempDir(output_file);\n\n  Run(\"protocol_compiler --plug_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n#if defined(_WIN32) && !defined(__CYGWIN__)\n  // Windows with MSVCRT.dll produces EPERM instead of EISDIR.\n  if (HasAlternateErrorSubstring(output_file + \": Permission denied\")) {\n    return;\n  }\n#endif\n\n  ExpectErrorSubstring(output_file + \": Is a directory\");\n}\n\nTEST_F(CommandLineInterfaceTest, OutputDirectoryNotFoundError) {\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir/nosuchdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectErrorSubstring(\"nosuchdir/: No such file or directory\");\n}\n\nTEST_F(CommandLineInterfaceTest, PluginOutputDirectoryNotFoundError) {\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --plug_out=$tmpdir/nosuchdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectErrorSubstring(\"nosuchdir/: No such file or directory\");\n}\n\nTEST_F(CommandLineInterfaceTest, OutputDirectoryIsFileError) {\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir/foo.proto \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n#if defined(_WIN32) && !defined(__CYGWIN__)\n  // Windows with MSVCRT.dll produces EINVAL instead of ENOTDIR.\n  if (HasAlternateErrorSubstring(\"foo.proto/: Invalid argument\")) {\n    return;\n  }\n#endif\n\n  ExpectErrorSubstring(\"foo.proto/: Not a directory\");\n}\n\nTEST_F(CommandLineInterfaceTest, GeneratorError) {\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message MockCodeGenerator_Error {}\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectErrorSubstring(\n      \"--test_out: foo.proto: Saw message type MockCodeGenerator_Error.\");\n}\n\nTEST_F(CommandLineInterfaceTest, GeneratorPluginError) {\n  // Test a generator plugin that returns an error.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message MockCodeGenerator_Error {}\\n\");\n\n  Run(\"protocol_compiler --plug_out=TestParameter:$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectErrorSubstring(\n      \"--plug_out: foo.proto: Saw message type MockCodeGenerator_Error.\");\n}\n\nTEST_F(CommandLineInterfaceTest, GeneratorPluginFail) {\n  // Test a generator plugin that exits with an error code.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message MockCodeGenerator_Exit {}\\n\");\n\n  Run(\"protocol_compiler --plug_out=TestParameter:$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectErrorSubstring(\"Saw message type MockCodeGenerator_Exit.\");\n  ExpectErrorSubstring(\n      \"--plug_out: prefix-gen-plug: Plugin failed with status code 123.\");\n}\n\nTEST_F(CommandLineInterfaceTest, GeneratorPluginCrash) {\n  // Test a generator plugin that crashes.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message MockCodeGenerator_Abort {}\\n\");\n\n  Run(\"protocol_compiler --plug_out=TestParameter:$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectErrorSubstring(\"Saw message type MockCodeGenerator_Abort.\");\n\n#ifdef _WIN32\n  // Windows doesn't have signals.  It looks like abort()ing causes the process\n  // to exit with status code 3, but let's not depend on the exact number here.\n  ExpectErrorSubstring(\n      \"--plug_out: prefix-gen-plug: Plugin failed with status code\");\n#else\n  // Don't depend on the exact signal number.\n  ExpectErrorSubstring(\n      \"--plug_out: prefix-gen-plug: Plugin killed by signal\");\n#endif\n}\n\nTEST_F(CommandLineInterfaceTest, GeneratorPluginNotFound) {\n  // Test what happens if the plugin isn't found.\n\n  CreateTempFile(\"error.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --badplug_out=TestParameter:$tmpdir \"\n      \"--plugin=prefix-gen-badplug=no_such_file \"\n      \"--proto_path=$tmpdir error.proto\");\n\n#ifdef _WIN32\n  ExpectErrorSubstring(\"--badplug_out: prefix-gen-badplug: \" +\n      Subprocess::Win32ErrorMessage(ERROR_FILE_NOT_FOUND));\n#else\n  // Error written to stdout by child process after exec() fails.\n  ExpectErrorSubstring(\n      \"no_such_file: program not found or is not executable\");\n\n  // Error written by parent process when child fails.\n  ExpectErrorSubstring(\n      \"--badplug_out: prefix-gen-badplug: Plugin failed with status code 1.\");\n#endif\n}\n\nTEST_F(CommandLineInterfaceTest, GeneratorPluginNotAllowed) {\n  // Test what happens if plugins aren't allowed.\n\n  CreateTempFile(\"error.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  DisallowPlugins();\n  Run(\"protocol_compiler --plug_out=TestParameter:$tmpdir \"\n      \"--proto_path=$tmpdir error.proto\");\n\n  ExpectErrorSubstring(\"Unknown flag: --plug_out\");\n}\n\nTEST_F(CommandLineInterfaceTest, HelpText) {\n  Run(\"test_exec_name --help\");\n\n  ExpectErrorSubstring(\"Usage: test_exec_name \");\n  ExpectErrorSubstring(\"--test_out=OUT_DIR\");\n  ExpectErrorSubstring(\"Test output.\");\n  ExpectErrorSubstring(\"--alt_out=OUT_DIR\");\n  ExpectErrorSubstring(\"Alt output.\");\n}\n\nTEST_F(CommandLineInterfaceTest, GccFormatErrors) {\n  // Test --error_format=gcc (which is the default, but we want to verify\n  // that it can be set explicitly).\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"badsyntax\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir --error_format=gcc foo.proto\");\n\n  ExpectErrorText(\n    \"foo.proto:2:1: Expected top-level statement (e.g. \\\"message\\\").\\n\");\n}\n\nTEST_F(CommandLineInterfaceTest, MsvsFormatErrors) {\n  // Test --error_format=msvs\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"badsyntax\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir --error_format=msvs foo.proto\");\n\n  ExpectErrorText(\n    \"$tmpdir/foo.proto(2) : error in column=1: Expected top-level statement \"\n      \"(e.g. \\\"message\\\").\\n\");\n}\n\nTEST_F(CommandLineInterfaceTest, InvalidErrorFormat) {\n  // Test --error_format=msvs\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"badsyntax\\n\");\n\n  Run(\"protocol_compiler --test_out=$tmpdir \"\n      \"--proto_path=$tmpdir --error_format=invalid foo.proto\");\n\n  ExpectErrorText(\n    \"Unknown error format: invalid\\n\");\n}\n\n// -------------------------------------------------------------------\n// Flag parsing tests\n\nTEST_F(CommandLineInterfaceTest, ParseSingleCharacterFlag) {\n  // Test that a single-character flag works.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler -t$tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"foo.proto\", \"Foo\");\n}\n\nTEST_F(CommandLineInterfaceTest, ParseSpaceDelimitedValue) {\n  // Test that separating the flag value with a space works.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler --test_out $tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"foo.proto\", \"Foo\");\n}\n\nTEST_F(CommandLineInterfaceTest, ParseSingleCharacterSpaceDelimitedValue) {\n  // Test that separating the flag value with a space works for\n  // single-character flags.\n\n  CreateTempFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  Run(\"protocol_compiler -t $tmpdir \"\n      \"--proto_path=$tmpdir foo.proto\");\n\n  ExpectNoErrors();\n  ExpectGenerated(\"test_generator\", \"\", \"foo.proto\", \"Foo\");\n}\n\nTEST_F(CommandLineInterfaceTest, MissingValueError) {\n  // Test that we get an error if a flag is missing its value.\n\n  Run(\"protocol_compiler --test_out --proto_path=$tmpdir foo.proto\");\n\n  ExpectErrorText(\"Missing value for flag: --test_out\\n\");\n}\n\nTEST_F(CommandLineInterfaceTest, MissingValueAtEndError) {\n  // Test that we get an error if the last argument is a flag requiring a\n  // value.\n\n  Run(\"protocol_compiler --test_out\");\n\n  ExpectErrorText(\"Missing value for flag: --test_out\\n\");\n}\n\n// ===================================================================\n\n// Test for --encode and --decode.  Note that it would be easier to do this\n// test as a shell script, but we'd like to be able to run the test on\n// platforms that don't have a Bourne-compatible shell available (especially\n// Windows/MSVC).\nclass EncodeDecodeTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    duped_stdin_ = dup(STDIN_FILENO);\n  }\n\n  virtual void TearDown() {\n    dup2(duped_stdin_, STDIN_FILENO);\n    close(duped_stdin_);\n  }\n\n  void RedirectStdinFromText(const string& input) {\n    string filename = TestTempDir() + \"/test_stdin\";\n    File::WriteStringToFileOrDie(input, filename);\n    GOOGLE_CHECK(RedirectStdinFromFile(filename));\n  }\n\n  bool RedirectStdinFromFile(const string& filename) {\n    int fd = open(filename.c_str(), O_RDONLY);\n    if (fd < 0) return false;\n    dup2(fd, STDIN_FILENO);\n    close(fd);\n    return true;\n  }\n\n  // Remove '\\r' characters from text.\n  string StripCR(const string& text) {\n    string result;\n\n    for (int i = 0; i < text.size(); i++) {\n      if (text[i] != '\\r') {\n        result.push_back(text[i]);\n      }\n    }\n\n    return result;\n  }\n\n  enum Type { TEXT, BINARY };\n  enum ReturnCode { SUCCESS, ERROR };\n\n  bool Run(const string& command) {\n    vector<string> args;\n    args.push_back(\"protoc\");\n    SplitStringUsing(command, \" \", &args);\n    args.push_back(\"--proto_path=\" + TestSourceDir());\n\n    scoped_array<const char*> argv(new const char*[args.size()]);\n    for (int i = 0; i < args.size(); i++) {\n      argv[i] = args[i].c_str();\n    }\n\n    CommandLineInterface cli;\n    cli.SetInputsAreProtoPathRelative(true);\n\n    CaptureTestStdout();\n    CaptureTestStderr();\n\n    int result = cli.Run(args.size(), argv.get());\n\n    captured_stdout_ = GetCapturedTestStdout();\n    captured_stderr_ = GetCapturedTestStderr();\n\n    return result == 0;\n  }\n\n  void ExpectStdoutMatchesBinaryFile(const string& filename) {\n    string expected_output;\n    ASSERT_TRUE(File::ReadFileToString(filename, &expected_output));\n\n    // Don't use EXPECT_EQ because we don't want to print raw binary data to\n    // stdout on failure.\n    EXPECT_TRUE(captured_stdout_ == expected_output);\n  }\n\n  void ExpectStdoutMatchesTextFile(const string& filename) {\n    string expected_output;\n    ASSERT_TRUE(File::ReadFileToString(filename, &expected_output));\n\n    ExpectStdoutMatchesText(expected_output);\n  }\n\n  void ExpectStdoutMatchesText(const string& expected_text) {\n    EXPECT_EQ(StripCR(expected_text), StripCR(captured_stdout_));\n  }\n\n  void ExpectStderrMatchesText(const string& expected_text) {\n    EXPECT_EQ(StripCR(expected_text), StripCR(captured_stderr_));\n  }\n\n private:\n  int duped_stdin_;\n  string captured_stdout_;\n  string captured_stderr_;\n};\n\nTEST_F(EncodeDecodeTest, Encode) {\n  RedirectStdinFromFile(TestSourceDir() +\n    \"/google/protobuf/testdata/text_format_unittest_data.txt\");\n  EXPECT_TRUE(Run(\"google/protobuf/unittest.proto \"\n                  \"--encode=protobuf_unittest.TestAllTypes\"));\n  ExpectStdoutMatchesBinaryFile(TestSourceDir() +\n    \"/google/protobuf/testdata/golden_message\");\n  ExpectStderrMatchesText(\"\");\n}\n\nTEST_F(EncodeDecodeTest, Decode) {\n  RedirectStdinFromFile(TestSourceDir() +\n    \"/google/protobuf/testdata/golden_message\");\n  EXPECT_TRUE(Run(\"google/protobuf/unittest.proto \"\n                  \"--decode=protobuf_unittest.TestAllTypes\"));\n  ExpectStdoutMatchesTextFile(TestSourceDir() +\n    \"/google/protobuf/testdata/text_format_unittest_data.txt\");\n  ExpectStderrMatchesText(\"\");\n}\n\nTEST_F(EncodeDecodeTest, Partial) {\n  RedirectStdinFromText(\"\");\n  EXPECT_TRUE(Run(\"google/protobuf/unittest.proto \"\n                  \"--encode=protobuf_unittest.TestRequired\"));\n  ExpectStdoutMatchesText(\"\");\n  ExpectStderrMatchesText(\n    \"warning:  Input message is missing required fields:  a, b, c\\n\");\n}\n\nTEST_F(EncodeDecodeTest, DecodeRaw) {\n  protobuf_unittest::TestAllTypes message;\n  message.set_optional_int32(123);\n  message.set_optional_string(\"foo\");\n  string data;\n  message.SerializeToString(&data);\n\n  RedirectStdinFromText(data);\n  EXPECT_TRUE(Run(\"--decode_raw\"));\n  ExpectStdoutMatchesText(\"1: 123\\n\"\n                          \"14: \\\"foo\\\"\\n\");\n  ExpectStderrMatchesText(\"\");\n}\n\nTEST_F(EncodeDecodeTest, UnknownType) {\n  EXPECT_FALSE(Run(\"google/protobuf/unittest.proto \"\n                   \"--encode=NoSuchType\"));\n  ExpectStdoutMatchesText(\"\");\n  ExpectStderrMatchesText(\"Type not defined: NoSuchType\\n\");\n}\n\nTEST_F(EncodeDecodeTest, ProtoParseError) {\n  EXPECT_FALSE(Run(\"google/protobuf/no_such_file.proto \"\n                   \"--encode=NoSuchType\"));\n  ExpectStdoutMatchesText(\"\");\n  ExpectStderrMatchesText(\n    \"google/protobuf/no_such_file.proto: File not found.\\n\");\n}\n\n}  // anonymous namespace\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This test insures that google/protobuf/descriptor.pb.{h,cc} match exactly\n// what would be generated by the protocol compiler.  These files are not\n// generated automatically at build time because they are compiled into the\n// protocol compiler itself.  So, if they were auto-generated, you'd have a\n// chicken-and-egg problem.\n//\n// If this test fails, run the script\n// \"generate_descriptor_proto.sh\" and add\n// descriptor.pb.{h,cc} to your changelist.\n\n#include <map>\n\n#include <google/protobuf/compiler/cpp/cpp_generator.h>\n#include <google/protobuf/compiler/importer.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n#include <google/protobuf/stubs/map-util.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n\n#include <google/protobuf/testing/file.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nnamespace {\n\nclass MockErrorCollector : public MultiFileErrorCollector {\n public:\n  MockErrorCollector() {}\n  ~MockErrorCollector() {}\n\n  string text_;\n\n  // implements ErrorCollector ---------------------------------------\n  void AddError(const string& filename, int line, int column,\n                const string& message) {\n    strings::SubstituteAndAppend(&text_, \"$0:$1:$2: $3\\n\",\n                                 filename, line, column, message);\n  }\n};\n\nclass MockGeneratorContext : public GeneratorContext {\n public:\n  MockGeneratorContext() {}\n  ~MockGeneratorContext() {\n    STLDeleteValues(&files_);\n  }\n\n  void ExpectFileMatches(const string& virtual_filename,\n                         const string& physical_filename) {\n    string* expected_contents = FindPtrOrNull(files_, virtual_filename);\n    ASSERT_TRUE(expected_contents != NULL)\n      << \"Generator failed to generate file: \" << virtual_filename;\n\n    string actual_contents;\n    File::ReadFileToStringOrDie(\n      TestSourceDir() + \"/\" + physical_filename,\n      &actual_contents);\n    EXPECT_TRUE(actual_contents == *expected_contents)\n      << physical_filename << \" needs to be regenerated.  Please run \"\n         \"generate_descriptor_proto.sh and add this file \"\n         \"to your CL.\";\n  }\n\n  // implements GeneratorContext --------------------------------------\n\n  virtual io::ZeroCopyOutputStream* Open(const string& filename) {\n    string** map_slot = &files_[filename];\n    if (*map_slot != NULL) delete *map_slot;\n    *map_slot = new string;\n\n    return new io::StringOutputStream(*map_slot);\n  }\n\n private:\n  map<string, string*> files_;\n};\n\nTEST(BootstrapTest, GeneratedDescriptorMatches) {\n  MockErrorCollector error_collector;\n  DiskSourceTree source_tree;\n  source_tree.MapPath(\"\", TestSourceDir());\n  Importer importer(&source_tree, &error_collector);\n  const FileDescriptor* proto_file =\n    importer.Import(\"google/protobuf/descriptor.proto\");\n  const FileDescriptor* plugin_proto_file =\n    importer.Import(\"google/protobuf/compiler/plugin.proto\");\n  EXPECT_EQ(\"\", error_collector.text_);\n  ASSERT_TRUE(proto_file != NULL);\n  ASSERT_TRUE(plugin_proto_file != NULL);\n\n  CppGenerator generator;\n  MockGeneratorContext context;\n  string error;\n  string parameter;\n  parameter = \"dllexport_decl=LIBPROTOBUF_EXPORT\";\n  ASSERT_TRUE(generator.Generate(proto_file, parameter,\n                                 &context, &error));\n  parameter = \"dllexport_decl=LIBPROTOC_EXPORT\";\n  ASSERT_TRUE(generator.Generate(plugin_proto_file, parameter,\n                                 &context, &error));\n\n  context.ExpectFileMatches(\"google/protobuf/descriptor.pb.h\",\n                            \"google/protobuf/descriptor.pb.h\");\n  context.ExpectFileMatches(\"google/protobuf/descriptor.pb.cc\",\n                            \"google/protobuf/descriptor.pb.cc\");\n  context.ExpectFileMatches(\"google/protobuf/compiler/plugin.pb.h\",\n                            \"google/protobuf/compiler/plugin.pb.h\");\n  context.ExpectFileMatches(\"google/protobuf/compiler/plugin.pb.cc\",\n                            \"google/protobuf/compiler/plugin.pb.cc\");\n}\n\n}  // namespace\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <set>\n#include <map>\n\n#include <google/protobuf/compiler/cpp/cpp_enum.h>\n#include <google/protobuf/compiler/cpp/cpp_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nEnumGenerator::EnumGenerator(const EnumDescriptor* descriptor,\n                             const string& dllexport_decl)\n  : descriptor_(descriptor),\n    classname_(ClassName(descriptor, false)),\n    dllexport_decl_(dllexport_decl) {\n}\n\nEnumGenerator::~EnumGenerator() {}\n\nvoid EnumGenerator::GenerateDefinition(io::Printer* printer) {\n  map<string, string> vars;\n  vars[\"classname\"] = classname_;\n  vars[\"short_name\"] = descriptor_->name();\n\n  printer->Print(vars, \"enum $classname$ {\\n\");\n  printer->Indent();\n\n  const EnumValueDescriptor* min_value = descriptor_->value(0);\n  const EnumValueDescriptor* max_value = descriptor_->value(0);\n\n  for (int i = 0; i < descriptor_->value_count(); i++) {\n    vars[\"name\"] = descriptor_->value(i)->name();\n    vars[\"number\"] = SimpleItoa(descriptor_->value(i)->number());\n    vars[\"prefix\"] = (descriptor_->containing_type() == NULL) ?\n      \"\" : classname_ + \"_\";\n\n    if (i > 0) printer->Print(\",\\n\");\n    printer->Print(vars, \"$prefix$$name$ = $number$\");\n\n    if (descriptor_->value(i)->number() < min_value->number()) {\n      min_value = descriptor_->value(i);\n    }\n    if (descriptor_->value(i)->number() > max_value->number()) {\n      max_value = descriptor_->value(i);\n    }\n  }\n\n  printer->Outdent();\n  printer->Print(\"\\n};\\n\");\n\n  vars[\"min_name\"] = min_value->name();\n  vars[\"max_name\"] = max_value->name();\n\n  if (dllexport_decl_.empty()) {\n    vars[\"dllexport\"] = \"\";\n  } else {\n    vars[\"dllexport\"] = dllexport_decl_ + \" \";\n  }\n\n  printer->Print(vars,\n    \"$dllexport$bool $classname$_IsValid(int value);\\n\"\n    \"const $classname$ $prefix$$short_name$_MIN = $prefix$$min_name$;\\n\"\n    \"const $classname$ $prefix$$short_name$_MAX = $prefix$$max_name$;\\n\"\n    \"const int $prefix$$short_name$_ARRAYSIZE = $prefix$$short_name$_MAX + 1;\\n\"\n    \"\\n\");\n\n  if (HasDescriptorMethods(descriptor_->file())) {\n    printer->Print(vars,\n      \"$dllexport$const ::google::protobuf::EnumDescriptor* $classname$_descriptor();\\n\");\n    // The _Name and _Parse methods\n    printer->Print(vars,\n      \"inline const ::std::string& $classname$_Name($classname$ value) {\\n\"\n      \"  return ::google::protobuf::internal::NameOfEnum(\\n\"\n      \"    $classname$_descriptor(), value);\\n\"\n      \"}\\n\");\n    printer->Print(vars,\n      \"inline bool $classname$_Parse(\\n\"\n      \"    const ::std::string& name, $classname$* value) {\\n\"\n      \"  return ::google::protobuf::internal::ParseNamedEnum<$classname$>(\\n\"\n      \"    $classname$_descriptor(), name, value);\\n\"\n      \"}\\n\");\n  }\n}\n\nvoid EnumGenerator::\nGenerateGetEnumDescriptorSpecializations(io::Printer* printer) {\n  if (HasDescriptorMethods(descriptor_->file())) {\n    printer->Print(\n      \"template <>\\n\"\n      \"inline const EnumDescriptor* GetEnumDescriptor< $classname$>() {\\n\"\n      \"  return $classname$_descriptor();\\n\"\n      \"}\\n\",\n      \"classname\", ClassName(descriptor_, true));\n  }\n}\n\nvoid EnumGenerator::GenerateSymbolImports(io::Printer* printer) {\n  map<string, string> vars;\n  vars[\"nested_name\"] = descriptor_->name();\n  vars[\"classname\"] = classname_;\n  printer->Print(vars, \"typedef $classname$ $nested_name$;\\n\");\n\n  for (int j = 0; j < descriptor_->value_count(); j++) {\n    vars[\"tag\"] = descriptor_->value(j)->name();\n    printer->Print(vars,\n      \"static const $nested_name$ $tag$ = $classname$_$tag$;\\n\");\n  }\n\n  printer->Print(vars,\n    \"static inline bool $nested_name$_IsValid(int value) {\\n\"\n    \"  return $classname$_IsValid(value);\\n\"\n    \"}\\n\"\n    \"static const $nested_name$ $nested_name$_MIN =\\n\"\n    \"  $classname$_$nested_name$_MIN;\\n\"\n    \"static const $nested_name$ $nested_name$_MAX =\\n\"\n    \"  $classname$_$nested_name$_MAX;\\n\"\n    \"static const int $nested_name$_ARRAYSIZE =\\n\"\n    \"  $classname$_$nested_name$_ARRAYSIZE;\\n\");\n\n  if (HasDescriptorMethods(descriptor_->file())) {\n    printer->Print(vars,\n      \"static inline const ::google::protobuf::EnumDescriptor*\\n\"\n      \"$nested_name$_descriptor() {\\n\"\n      \"  return $classname$_descriptor();\\n\"\n      \"}\\n\");\n    printer->Print(vars,\n      \"static inline const ::std::string& $nested_name$_Name($nested_name$ value) {\\n\"\n      \"  return $classname$_Name(value);\\n\"\n      \"}\\n\");\n    printer->Print(vars,\n      \"static inline bool $nested_name$_Parse(const ::std::string& name,\\n\"\n      \"    $nested_name$* value) {\\n\"\n      \"  return $classname$_Parse(name, value);\\n\"\n      \"}\\n\");\n  }\n}\n\nvoid EnumGenerator::GenerateDescriptorInitializer(\n    io::Printer* printer, int index) {\n  map<string, string> vars;\n  vars[\"classname\"] = classname_;\n  vars[\"index\"] = SimpleItoa(index);\n\n  if (descriptor_->containing_type() == NULL) {\n    printer->Print(vars,\n      \"$classname$_descriptor_ = file->enum_type($index$);\\n\");\n  } else {\n    vars[\"parent\"] = ClassName(descriptor_->containing_type(), false);\n    printer->Print(vars,\n      \"$classname$_descriptor_ = $parent$_descriptor_->enum_type($index$);\\n\");\n  }\n}\n\nvoid EnumGenerator::GenerateMethods(io::Printer* printer) {\n  map<string, string> vars;\n  vars[\"classname\"] = classname_;\n\n  if (HasDescriptorMethods(descriptor_->file())) {\n    printer->Print(vars,\n      \"const ::google::protobuf::EnumDescriptor* $classname$_descriptor() {\\n\"\n      \"  protobuf_AssignDescriptorsOnce();\\n\"\n      \"  return $classname$_descriptor_;\\n\"\n      \"}\\n\");\n  }\n\n  printer->Print(vars,\n    \"bool $classname$_IsValid(int value) {\\n\"\n    \"  switch(value) {\\n\");\n\n  // Multiple values may have the same number.  Make sure we only cover\n  // each number once by first constructing a set containing all valid\n  // numbers, then printing a case statement for each element.\n\n  set<int> numbers;\n  for (int j = 0; j < descriptor_->value_count(); j++) {\n    const EnumValueDescriptor* value = descriptor_->value(j);\n    numbers.insert(value->number());\n  }\n\n  for (set<int>::iterator iter = numbers.begin();\n       iter != numbers.end(); ++iter) {\n    printer->Print(\n      \"    case $number$:\\n\",\n      \"number\", SimpleItoa(*iter));\n  }\n\n  printer->Print(vars,\n    \"      return true;\\n\"\n    \"    default:\\n\"\n    \"      return false;\\n\"\n    \"  }\\n\"\n    \"}\\n\"\n    \"\\n\");\n\n  if (descriptor_->containing_type() != NULL) {\n    // We need to \"define\" the static constants which were declared in the\n    // header, to give the linker a place to put them.  Or at least the C++\n    // standard says we have to.  MSVC actually insists tha we do _not_ define\n    // them again in the .cc file.\n    printer->Print(\"#ifndef _MSC_VER\\n\");\n\n    vars[\"parent\"] = ClassName(descriptor_->containing_type(), false);\n    vars[\"nested_name\"] = descriptor_->name();\n    for (int i = 0; i < descriptor_->value_count(); i++) {\n      vars[\"value\"] = descriptor_->value(i)->name();\n      printer->Print(vars,\n        \"const $classname$ $parent$::$value$;\\n\");\n    }\n    printer->Print(vars,\n      \"const $classname$ $parent$::$nested_name$_MIN;\\n\"\n      \"const $classname$ $parent$::$nested_name$_MAX;\\n\"\n      \"const int $parent$::$nested_name$_ARRAYSIZE;\\n\");\n\n    printer->Print(\"#endif  // _MSC_VER\\n\");\n  }\n}\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_H__\n#define GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_H__\n\n#include <string>\n#include <google/protobuf/descriptor.h>\n\nnamespace google {\nnamespace protobuf {\n  namespace io {\n    class Printer;             // printer.h\n  }\n}\n\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nclass EnumGenerator {\n public:\n  // See generator.cc for the meaning of dllexport_decl.\n  explicit EnumGenerator(const EnumDescriptor* descriptor,\n                         const string& dllexport_decl);\n  ~EnumGenerator();\n\n  // Header stuff.\n\n  // Generate header code defining the enum.  This code should be placed\n  // within the enum's package namespace, but NOT within any class, even for\n  // nested enums.\n  void GenerateDefinition(io::Printer* printer);\n\n  // Generate specialization of GetEnumDescriptor<MyEnum>().\n  // Precondition: in ::google::protobuf namespace.\n  void GenerateGetEnumDescriptorSpecializations(io::Printer* printer);\n\n  // For enums nested within a message, generate code to import all the enum's\n  // symbols (e.g. the enum type name, all its values, etc.) into the class's\n  // namespace.  This should be placed inside the class definition in the\n  // header.\n  void GenerateSymbolImports(io::Printer* printer);\n\n  // Source file stuff.\n\n  // Generate code that initializes the global variable storing the enum's\n  // descriptor.\n  void GenerateDescriptorInitializer(io::Printer* printer, int index);\n\n  // Generate non-inline methods related to the enum, such as IsValidValue().\n  // Goes in the .cc file.\n  void GenerateMethods(io::Printer* printer);\n\n private:\n  const EnumDescriptor* descriptor_;\n  string classname_;\n  string dllexport_decl_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumGenerator);\n};\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/cpp/cpp_enum_field.h>\n#include <google/protobuf/compiler/cpp/cpp_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nnamespace {\n\nvoid SetEnumVariables(const FieldDescriptor* descriptor,\n                      map<string, string>* variables) {\n  SetCommonFieldVariables(descriptor, variables);\n  const EnumValueDescriptor* default_value = descriptor->default_value_enum();\n  (*variables)[\"type\"] = ClassName(descriptor->enum_type(), true);\n  (*variables)[\"default\"] = SimpleItoa(default_value->number());\n}\n\n}  // namespace\n\n// ===================================================================\n\nEnumFieldGenerator::\nEnumFieldGenerator(const FieldDescriptor* descriptor)\n  : descriptor_(descriptor) {\n  SetEnumVariables(descriptor, &variables_);\n}\n\nEnumFieldGenerator::~EnumFieldGenerator() {}\n\nvoid EnumFieldGenerator::\nGeneratePrivateMembers(io::Printer* printer) const {\n  printer->Print(variables_, \"int $name$_;\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateAccessorDeclarations(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline $type$ $name$() const$deprecation$;\\n\"\n    \"inline void set_$name$($type$ value)$deprecation$;\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateInlineAccessorDefinitions(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline $type$ $classname$::$name$() const {\\n\"\n    \"  return static_cast< $type$ >($name$_);\\n\"\n    \"}\\n\"\n    \"inline void $classname$::set_$name$($type$ value) {\\n\"\n    \"  GOOGLE_DCHECK($type$_IsValid(value));\\n\"\n    \"  set_has_$name$();\\n\"\n    \"  $name$_ = value;\\n\"\n    \"}\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateClearingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_ = $default$;\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"set_$name$(from.$name$());\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateSwappingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"std::swap($name$_, other->$name$_);\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateConstructorCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_ = $default$;\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateMergeFromCodedStream(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"int value;\\n\"\n    \"DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\\n\"\n    \"         int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\\n\"\n    \"       input, &value)));\\n\"\n    \"if ($type$_IsValid(value)) {\\n\"\n    \"  set_$name$(static_cast< $type$ >(value));\\n\");\n  if (HasUnknownFields(descriptor_->file())) {\n    printer->Print(variables_,\n      \"} else {\\n\"\n      \"  mutable_unknown_fields()->AddVarint($number$, value);\\n\");\n  }\n  printer->Print(variables_,\n    \"}\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateSerializeWithCachedSizes(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"::google::protobuf::internal::WireFormatLite::WriteEnum(\\n\"\n    \"  $number$, this->$name$(), output);\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\\n\"\n    \"  $number$, this->$name$(), target);\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateByteSize(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"total_size += $tag_size$ +\\n\"\n    \"  ::google::protobuf::internal::WireFormatLite::EnumSize(this->$name$());\\n\");\n}\n\n// ===================================================================\n\nRepeatedEnumFieldGenerator::\nRepeatedEnumFieldGenerator(const FieldDescriptor* descriptor)\n  : descriptor_(descriptor) {\n  SetEnumVariables(descriptor, &variables_);\n}\n\nRepeatedEnumFieldGenerator::~RepeatedEnumFieldGenerator() {}\n\nvoid RepeatedEnumFieldGenerator::\nGeneratePrivateMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"::google::protobuf::RepeatedField<int> $name$_;\\n\");\n  if (descriptor_->options().packed() && HasGeneratedMethods(descriptor_->file())) {\n    printer->Print(variables_,\n      \"mutable int _$name$_cached_byte_size_;\\n\");\n  }\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateAccessorDeclarations(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline $type$ $name$(int index) const$deprecation$;\\n\"\n    \"inline void set_$name$(int index, $type$ value)$deprecation$;\\n\"\n    \"inline void add_$name$($type$ value)$deprecation$;\\n\");\n  printer->Print(variables_,\n    \"inline const ::google::protobuf::RepeatedField<int>& $name$() const$deprecation$;\\n\"\n    \"inline ::google::protobuf::RepeatedField<int>* mutable_$name$()$deprecation$;\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateInlineAccessorDefinitions(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline $type$ $classname$::$name$(int index) const {\\n\"\n    \"  return static_cast< $type$ >($name$_.Get(index));\\n\"\n    \"}\\n\"\n    \"inline void $classname$::set_$name$(int index, $type$ value) {\\n\"\n    \"  GOOGLE_DCHECK($type$_IsValid(value));\\n\"\n    \"  $name$_.Set(index, value);\\n\"\n    \"}\\n\"\n    \"inline void $classname$::add_$name$($type$ value) {\\n\"\n    \"  GOOGLE_DCHECK($type$_IsValid(value));\\n\"\n    \"  $name$_.Add(value);\\n\"\n    \"}\\n\");\n  printer->Print(variables_,\n    \"inline const ::google::protobuf::RepeatedField<int>&\\n\"\n    \"$classname$::$name$() const {\\n\"\n    \"  return $name$_;\\n\"\n    \"}\\n\"\n    \"inline ::google::protobuf::RepeatedField<int>*\\n\"\n    \"$classname$::mutable_$name$() {\\n\"\n    \"  return &$name$_;\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateClearingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_.Clear();\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_.MergeFrom(from.$name$_);\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateSwappingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_.Swap(&other->$name$_);\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateConstructorCode(io::Printer* printer) const {\n  // Not needed for repeated fields.\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateMergeFromCodedStream(io::Printer* printer) const {\n  // Don't use ReadRepeatedPrimitive here so that the enum can be validated.\n  printer->Print(variables_,\n    \"int value;\\n\"\n    \"DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\\n\"\n    \"         int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\\n\"\n    \"       input, &value)));\\n\"\n    \"if ($type$_IsValid(value)) {\\n\"\n    \"  add_$name$(static_cast< $type$ >(value));\\n\");\n  if (HasUnknownFields(descriptor_->file())) {\n    printer->Print(variables_,\n      \"} else {\\n\"\n      \"  mutable_unknown_fields()->AddVarint($number$, value);\\n\");\n  }\n  printer->Print(\"}\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const {\n  if (!descriptor_->options().packed()) {\n    // We use a non-inlined implementation in this case, since this path will\n    // rarely be executed.\n    printer->Print(variables_,\n      \"DO_((::google::protobuf::internal::WireFormatLite::ReadPackedEnumNoInline(\\n\"\n      \"       input,\\n\"\n      \"       &$type$_IsValid,\\n\"\n      \"       this->mutable_$name$())));\\n\");\n  } else {\n    printer->Print(variables_,\n      \"::google::protobuf::uint32 length;\\n\"\n      \"DO_(input->ReadVarint32(&length));\\n\"\n      \"::google::protobuf::io::CodedInputStream::Limit limit = \"\n          \"input->PushLimit(length);\\n\"\n      \"while (input->BytesUntilLimit() > 0) {\\n\"\n      \"  int value;\\n\"\n      \"  DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\\n\"\n      \"         int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\\n\"\n      \"       input, &value)));\\n\"\n      \"  if ($type$_IsValid(value)) {\\n\"\n      \"    add_$name$(static_cast< $type$ >(value));\\n\"\n      \"  }\\n\"\n      \"}\\n\"\n      \"input->PopLimit(limit);\\n\");\n  }\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateSerializeWithCachedSizes(io::Printer* printer) const {\n  if (descriptor_->options().packed()) {\n    // Write the tag and the size.\n    printer->Print(variables_,\n      \"if (this->$name$_size() > 0) {\\n\"\n      \"  ::google::protobuf::internal::WireFormatLite::WriteTag(\\n\"\n      \"    $number$,\\n\"\n      \"    ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\\n\"\n      \"    output);\\n\"\n      \"  output->WriteVarint32(_$name$_cached_byte_size_);\\n\"\n      \"}\\n\");\n  }\n  printer->Print(variables_,\n      \"for (int i = 0; i < this->$name$_size(); i++) {\\n\");\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"  ::google::protobuf::internal::WireFormatLite::WriteEnumNoTag(\\n\"\n      \"    this->$name$(i), output);\\n\");\n  } else {\n    printer->Print(variables_,\n      \"  ::google::protobuf::internal::WireFormatLite::WriteEnum(\\n\"\n      \"    $number$, this->$name$(i), output);\\n\");\n  }\n  printer->Print(\"}\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {\n  if (descriptor_->options().packed()) {\n    // Write the tag and the size.\n    printer->Print(variables_,\n      \"if (this->$name$_size() > 0) {\\n\"\n      \"  target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray(\\n\"\n      \"    $number$,\\n\"\n      \"    ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\\n\"\n      \"    target);\\n\"\n      \"  target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(\"\n      \"    _$name$_cached_byte_size_, target);\\n\"\n      \"}\\n\");\n  }\n  printer->Print(variables_,\n      \"for (int i = 0; i < this->$name$_size(); i++) {\\n\");\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"  target = ::google::protobuf::internal::WireFormatLite::WriteEnumNoTagToArray(\\n\"\n      \"    this->$name$(i), target);\\n\");\n  } else {\n    printer->Print(variables_,\n      \"  target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\\n\"\n      \"    $number$, this->$name$(i), target);\\n\");\n  }\n  printer->Print(\"}\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateByteSize(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"{\\n\"\n    \"  int data_size = 0;\\n\");\n  printer->Indent();\n  printer->Print(variables_,\n      \"for (int i = 0; i < this->$name$_size(); i++) {\\n\"\n      \"  data_size += ::google::protobuf::internal::WireFormatLite::EnumSize(\\n\"\n      \"    this->$name$(i));\\n\"\n      \"}\\n\");\n\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"if (data_size > 0) {\\n\"\n      \"  total_size += $tag_size$ +\\n\"\n      \"    ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);\\n\"\n      \"}\\n\"\n      \"_$name$_cached_byte_size_ = data_size;\\n\"\n      \"total_size += data_size;\\n\");\n  } else {\n    printer->Print(variables_,\n      \"total_size += $tag_size$ * this->$name$_size() + data_size;\\n\");\n  }\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_FIELD_H__\n#define GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_FIELD_H__\n\n#include <map>\n#include <string>\n#include <google/protobuf/compiler/cpp/cpp_field.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nclass EnumFieldGenerator : public FieldGenerator {\n public:\n  explicit EnumFieldGenerator(const FieldDescriptor* descriptor);\n  ~EnumFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  void GeneratePrivateMembers(io::Printer* printer) const;\n  void GenerateAccessorDeclarations(io::Printer* printer) const;\n  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;\n  void GenerateClearingCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateSwappingCode(io::Printer* printer) const;\n  void GenerateConstructorCode(io::Printer* printer) const;\n  void GenerateMergeFromCodedStream(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizes(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;\n  void GenerateByteSize(io::Printer* printer) const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumFieldGenerator);\n};\n\nclass RepeatedEnumFieldGenerator : public FieldGenerator {\n public:\n  explicit RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor);\n  ~RepeatedEnumFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  void GeneratePrivateMembers(io::Printer* printer) const;\n  void GenerateAccessorDeclarations(io::Printer* printer) const;\n  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;\n  void GenerateClearingCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateSwappingCode(io::Printer* printer) const;\n  void GenerateConstructorCode(io::Printer* printer) const;\n  void GenerateMergeFromCodedStream(io::Printer* printer) const;\n  void GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizes(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;\n  void GenerateByteSize(io::Printer* printer) const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedEnumFieldGenerator);\n};\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_FIELD_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/cpp/cpp_extension.h>\n#include <map>\n#include <google/protobuf/compiler/cpp/cpp_helpers.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/descriptor.pb.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nnamespace {\n\n// Returns the fully-qualified class name of the message that this field\n// extends. This function is used in the Google-internal code to handle some\n// legacy cases.\nstring ExtendeeClassName(const FieldDescriptor* descriptor) {\n  const Descriptor* extendee = descriptor->containing_type();\n  return ClassName(extendee, true);\n}\n\n}  // anonymous namespace\n\nExtensionGenerator::ExtensionGenerator(const FieldDescriptor* descriptor,\n                                       const string& dllexport_decl)\n  : descriptor_(descriptor),\n    dllexport_decl_(dllexport_decl) {\n  // Construct type_traits_.\n  if (descriptor_->is_repeated()) {\n    type_traits_ = \"Repeated\";\n  }\n\n  switch (descriptor_->cpp_type()) {\n    case FieldDescriptor::CPPTYPE_ENUM:\n      type_traits_.append(\"EnumTypeTraits< \");\n      type_traits_.append(ClassName(descriptor_->enum_type(), true));\n      type_traits_.append(\", \");\n      type_traits_.append(ClassName(descriptor_->enum_type(), true));\n      type_traits_.append(\"_IsValid>\");\n      break;\n    case FieldDescriptor::CPPTYPE_STRING:\n      type_traits_.append(\"StringTypeTraits\");\n      break;\n    case FieldDescriptor::CPPTYPE_MESSAGE:\n      type_traits_.append(\"MessageTypeTraits< \");\n      type_traits_.append(ClassName(descriptor_->message_type(), true));\n      type_traits_.append(\" >\");\n      break;\n    default:\n      type_traits_.append(\"PrimitiveTypeTraits< \");\n      type_traits_.append(PrimitiveTypeName(descriptor_->cpp_type()));\n      type_traits_.append(\" >\");\n      break;\n  }\n}\n\nExtensionGenerator::~ExtensionGenerator() {}\n\nvoid ExtensionGenerator::GenerateDeclaration(io::Printer* printer) {\n  map<string, string> vars;\n  vars[\"extendee\"     ] = ExtendeeClassName(descriptor_);\n  vars[\"number\"       ] = SimpleItoa(descriptor_->number());\n  vars[\"type_traits\"  ] = type_traits_;\n  vars[\"name\"         ] = descriptor_->name();\n  vars[\"field_type\"   ] = SimpleItoa(static_cast<int>(descriptor_->type()));\n  vars[\"packed\"       ] = descriptor_->options().packed() ? \"true\" : \"false\";\n  vars[\"constant_name\"] = FieldConstantName(descriptor_);\n\n  // If this is a class member, it needs to be declared \"static\".  Otherwise,\n  // it needs to be \"extern\".  In the latter case, it also needs the DLL\n  // export/import specifier.\n  if (descriptor_->extension_scope() == NULL) {\n    vars[\"qualifier\"] = \"extern\";\n    if (!dllexport_decl_.empty()) {\n      vars[\"qualifier\"] = dllexport_decl_ + \" \" + vars[\"qualifier\"];\n    }\n  } else {\n    vars[\"qualifier\"] = \"static\";\n  }\n\n  printer->Print(vars,\n    \"static const int $constant_name$ = $number$;\\n\"\n    \"$qualifier$ ::google::protobuf::internal::ExtensionIdentifier< $extendee$,\\n\"\n    \"    ::google::protobuf::internal::$type_traits$, $field_type$, $packed$ >\\n\"\n    \"  $name$;\\n\"\n    );\n\n}\n\nvoid ExtensionGenerator::GenerateDefinition(io::Printer* printer) {\n  // If this is a class member, it needs to be declared in its class scope.\n  string scope = (descriptor_->extension_scope() == NULL) ? \"\" :\n    ClassName(descriptor_->extension_scope(), false) + \"::\";\n  string name = scope + descriptor_->name();\n\n  map<string, string> vars;\n  vars[\"extendee\"     ] = ExtendeeClassName(descriptor_);\n  vars[\"type_traits\"  ] = type_traits_;\n  vars[\"name\"         ] = name;\n  vars[\"constant_name\"] = FieldConstantName(descriptor_);\n  vars[\"default\"      ] = DefaultValue(descriptor_);\n  vars[\"field_type\"   ] = SimpleItoa(static_cast<int>(descriptor_->type()));\n  vars[\"packed\"       ] = descriptor_->options().packed() ? \"true\" : \"false\";\n  vars[\"scope\"        ] = scope;\n\n  if (descriptor_->cpp_type() == FieldDescriptor::CPPTYPE_STRING) {\n    // We need to declare a global string which will contain the default value.\n    // We cannot declare it at class scope because that would require exposing\n    // it in the header which would be annoying for other reasons.  So we\n    // replace :: with _ in the name and declare it as a global.\n    string global_name = StringReplace(name, \"::\", \"_\", true);\n    vars[\"global_name\"] = global_name;\n    printer->Print(vars,\n      \"const ::std::string $global_name$_default($default$);\\n\");\n\n    // Update the default to refer to the string global.\n    vars[\"default\"] = global_name + \"_default\";\n  }\n\n  // Likewise, class members need to declare the field constant variable.\n  if (descriptor_->extension_scope() != NULL) {\n    printer->Print(vars,\n      \"#ifndef _MSC_VER\\n\"\n      \"const int $scope$$constant_name$;\\n\"\n      \"#endif\\n\");\n  }\n\n  printer->Print(vars,\n    \"::google::protobuf::internal::ExtensionIdentifier< $extendee$,\\n\"\n    \"    ::google::protobuf::internal::$type_traits$, $field_type$, $packed$ >\\n\"\n    \"  $name$($constant_name$, $default$);\\n\");\n}\n\nvoid ExtensionGenerator::GenerateRegistration(io::Printer* printer) {\n  map<string, string> vars;\n  vars[\"extendee\"   ] = ExtendeeClassName(descriptor_);\n  vars[\"number\"     ] = SimpleItoa(descriptor_->number());\n  vars[\"field_type\" ] = SimpleItoa(static_cast<int>(descriptor_->type()));\n  vars[\"is_repeated\"] = descriptor_->is_repeated() ? \"true\" : \"false\";\n  vars[\"is_packed\"  ] = (descriptor_->is_repeated() &&\n                         descriptor_->options().packed())\n                        ? \"true\" : \"false\";\n\n  switch (descriptor_->cpp_type()) {\n    case FieldDescriptor::CPPTYPE_ENUM:\n      printer->Print(vars,\n        \"::google::protobuf::internal::ExtensionSet::RegisterEnumExtension(\\n\"\n        \"  &$extendee$::default_instance(),\\n\"\n        \"  $number$, $field_type$, $is_repeated$, $is_packed$,\\n\");\n      printer->Print(\n        \"  &$type$_IsValid);\\n\",\n        \"type\", ClassName(descriptor_->enum_type(), true));\n      break;\n    case FieldDescriptor::CPPTYPE_MESSAGE:\n      printer->Print(vars,\n        \"::google::protobuf::internal::ExtensionSet::RegisterMessageExtension(\\n\"\n        \"  &$extendee$::default_instance(),\\n\"\n        \"  $number$, $field_type$, $is_repeated$, $is_packed$,\\n\");\n      printer->Print(\n        \"  &$type$::default_instance());\\n\",\n        \"type\", ClassName(descriptor_->message_type(), true));\n      break;\n    default:\n      printer->Print(vars,\n        \"::google::protobuf::internal::ExtensionSet::RegisterExtension(\\n\"\n        \"  &$extendee$::default_instance(),\\n\"\n        \"  $number$, $field_type$, $is_repeated$, $is_packed$);\\n\");\n      break;\n  }\n}\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_EXTENSION_H__\n#define GOOGLE_PROTOBUF_COMPILER_CPP_EXTENSION_H__\n\n#include <string>\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\n  class FieldDescriptor;       // descriptor.h\n  namespace io {\n    class Printer;             // printer.h\n  }\n}\n\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\n// Generates code for an extension, which may be within the scope of some\n// message or may be at file scope.  This is much simpler than FieldGenerator\n// since extensions are just simple identifiers with interesting types.\nclass ExtensionGenerator {\n public:\n  // See generator.cc for the meaning of dllexport_decl.\n  explicit ExtensionGenerator(const FieldDescriptor* descriptor,\n                              const string& dllexport_decl);\n  ~ExtensionGenerator();\n\n  // Header stuff.\n  void GenerateDeclaration(io::Printer* printer);\n\n  // Source file stuff.\n  void GenerateDefinition(io::Printer* printer);\n\n  // Generate code to register the extension.\n  void GenerateRegistration(io::Printer* printer);\n\n private:\n  const FieldDescriptor* descriptor_;\n  string type_traits_;\n  string dllexport_decl_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionGenerator);\n};\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/cpp/cpp_field.h>\n#include <google/protobuf/compiler/cpp/cpp_helpers.h>\n#include <google/protobuf/compiler/cpp/cpp_primitive_field.h>\n#include <google/protobuf/compiler/cpp/cpp_string_field.h>\n#include <google/protobuf/compiler/cpp/cpp_enum_field.h>\n#include <google/protobuf/compiler/cpp/cpp_message_field.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nusing internal::WireFormat;\n\nvoid SetCommonFieldVariables(const FieldDescriptor* descriptor,\n                             map<string, string>* variables) {\n  (*variables)[\"name\"] = FieldName(descriptor);\n  (*variables)[\"index\"] = SimpleItoa(descriptor->index());\n  (*variables)[\"number\"] = SimpleItoa(descriptor->number());\n  (*variables)[\"classname\"] = ClassName(FieldScope(descriptor), false);\n  (*variables)[\"declared_type\"] = DeclaredTypeMethodName(descriptor->type());\n\n  (*variables)[\"tag_size\"] = SimpleItoa(\n    WireFormat::TagSize(descriptor->number(), descriptor->type()));\n  (*variables)[\"deprecation\"] = descriptor->options().deprecated()\n      ? \" PROTOBUF_DEPRECATED\" : \"\";\n\n}\n\nFieldGenerator::~FieldGenerator() {}\n\nvoid FieldGenerator::\nGenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const {\n  // Reaching here indicates a bug. Cases are:\n  //   - This FieldGenerator should support packing, but this method should be\n  //     overridden.\n  //   - This FieldGenerator doesn't support packing, and this method should\n  //     never have been called.\n  GOOGLE_LOG(FATAL) << \"GenerateMergeFromCodedStreamWithPacking() \"\n             << \"called on field generator that does not support packing.\";\n\n}\n\nFieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor)\n  : descriptor_(descriptor),\n    field_generators_(\n      new scoped_ptr<FieldGenerator>[descriptor->field_count()]) {\n  // Construct all the FieldGenerators.\n  for (int i = 0; i < descriptor->field_count(); i++) {\n    field_generators_[i].reset(MakeGenerator(descriptor->field(i)));\n  }\n}\n\nFieldGenerator* FieldGeneratorMap::MakeGenerator(const FieldDescriptor* field) {\n  if (field->is_repeated()) {\n    switch (field->cpp_type()) {\n      case FieldDescriptor::CPPTYPE_MESSAGE:\n        return new RepeatedMessageFieldGenerator(field);\n      case FieldDescriptor::CPPTYPE_STRING:\n        switch (field->options().ctype()) {\n          default:  // RepeatedStringFieldGenerator handles unknown ctypes.\n          case FieldOptions::STRING:\n            return new RepeatedStringFieldGenerator(field);\n        }\n      case FieldDescriptor::CPPTYPE_ENUM:\n        return new RepeatedEnumFieldGenerator(field);\n      default:\n        return new RepeatedPrimitiveFieldGenerator(field);\n    }\n  } else {\n    switch (field->cpp_type()) {\n      case FieldDescriptor::CPPTYPE_MESSAGE:\n        return new MessageFieldGenerator(field);\n      case FieldDescriptor::CPPTYPE_STRING:\n        switch (field->options().ctype()) {\n          default:  // StringFieldGenerator handles unknown ctypes.\n          case FieldOptions::STRING:\n            return new StringFieldGenerator(field);\n        }\n      case FieldDescriptor::CPPTYPE_ENUM:\n        return new EnumFieldGenerator(field);\n      default:\n        return new PrimitiveFieldGenerator(field);\n    }\n  }\n}\n\nFieldGeneratorMap::~FieldGeneratorMap() {}\n\nconst FieldGenerator& FieldGeneratorMap::get(\n    const FieldDescriptor* field) const {\n  GOOGLE_CHECK_EQ(field->containing_type(), descriptor_);\n  return *field_generators_[field->index()];\n}\n\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_FIELD_H__\n#define GOOGLE_PROTOBUF_COMPILER_CPP_FIELD_H__\n\n#include <map>\n#include <string>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/descriptor.h>\n\nnamespace google {\nnamespace protobuf {\n  namespace io {\n    class Printer;             // printer.h\n  }\n}\n\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\n// Helper function: set variables in the map that are the same for all\n// field code generators.\n// ['name', 'index', 'number', 'classname', 'declared_type', 'tag_size',\n// 'deprecation'].\nvoid SetCommonFieldVariables(const FieldDescriptor* descriptor,\n                             map<string, string>* variables);\n\nclass FieldGenerator {\n public:\n  FieldGenerator() {}\n  virtual ~FieldGenerator();\n\n  // Generate lines of code declaring members fields of the message class\n  // needed to represent this field.  These are placed inside the message\n  // class.\n  virtual void GeneratePrivateMembers(io::Printer* printer) const = 0;\n\n  // Generate prototypes for all of the accessor functions related to this\n  // field.  These are placed inside the class definition.\n  virtual void GenerateAccessorDeclarations(io::Printer* printer) const = 0;\n\n  // Generate inline definitions of accessor functions for this field.\n  // These are placed inside the header after all class definitions.\n  virtual void GenerateInlineAccessorDefinitions(\n    io::Printer* printer) const = 0;\n\n  // Generate definitions of accessors that aren't inlined.  These are\n  // placed somewhere in the .cc file.\n  // Most field types don't need this, so the default implementation is empty.\n  virtual void GenerateNonInlineAccessorDefinitions(\n    io::Printer* printer) const {}\n\n  // Generate lines of code (statements, not declarations) which clear the\n  // field.  This is used to define the clear_$name$() method as well as\n  // the Clear() method for the whole message.\n  virtual void GenerateClearingCode(io::Printer* printer) const = 0;\n\n  // Generate lines of code (statements, not declarations) which merges the\n  // contents of the field from the current message to the target message,\n  // which is stored in the generated code variable \"from\".\n  // This is used to fill in the MergeFrom method for the whole message.\n  // Details of this usage can be found in message.cc under the\n  // GenerateMergeFrom method.\n  virtual void GenerateMergingCode(io::Printer* printer) const = 0;\n\n  // Generate lines of code (statements, not declarations) which swaps\n  // this field and the corresponding field of another message, which\n  // is stored in the generated code variable \"other\". This is used to\n  // define the Swap method. Details of usage can be found in\n  // message.cc under the GenerateSwap method.\n  virtual void GenerateSwappingCode(io::Printer* printer) const = 0;\n\n  // Generate initialization code for private members declared by\n  // GeneratePrivateMembers(). These go into the message class's SharedCtor()\n  // method, invoked by each of the generated constructors.\n  virtual void GenerateConstructorCode(io::Printer* printer) const = 0;\n\n  // Generate any code that needs to go in the class's SharedDtor() method,\n  // invoked by the destructor.\n  // Most field types don't need this, so the default implementation is empty.\n  virtual void GenerateDestructorCode(io::Printer* printer) const {}\n\n  // Generate lines to decode this field, which will be placed inside the\n  // message's MergeFromCodedStream() method.\n  virtual void GenerateMergeFromCodedStream(io::Printer* printer) const = 0;\n\n  // Generate lines to decode this field from a packed value, which will be\n  // placed inside the message's MergeFromCodedStream() method.\n  virtual void GenerateMergeFromCodedStreamWithPacking(io::Printer* printer)\n      const;\n\n  // Generate lines to serialize this field, which are placed within the\n  // message's SerializeWithCachedSizes() method.\n  virtual void GenerateSerializeWithCachedSizes(io::Printer* printer) const = 0;\n\n  // Generate lines to serialize this field directly to the array \"target\",\n  // which are placed within the message's SerializeWithCachedSizesToArray()\n  // method. This must also advance \"target\" past the written bytes.\n  virtual void GenerateSerializeWithCachedSizesToArray(\n      io::Printer* printer) const = 0;\n\n  // Generate lines to compute the serialized size of this field, which\n  // are placed in the message's ByteSize() method.\n  virtual void GenerateByteSize(io::Printer* printer) const = 0;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGenerator);\n};\n\n// Convenience class which constructs FieldGenerators for a Descriptor.\nclass FieldGeneratorMap {\n public:\n  explicit FieldGeneratorMap(const Descriptor* descriptor);\n  ~FieldGeneratorMap();\n\n  const FieldGenerator& get(const FieldDescriptor* field) const;\n\n private:\n  const Descriptor* descriptor_;\n  scoped_array<scoped_ptr<FieldGenerator> > field_generators_;\n\n  static FieldGenerator* MakeGenerator(const FieldDescriptor* field);\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorMap);\n};\n\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_FIELD_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/cpp/cpp_file.h>\n#include <google/protobuf/compiler/cpp/cpp_enum.h>\n#include <google/protobuf/compiler/cpp/cpp_service.h>\n#include <google/protobuf/compiler/cpp/cpp_extension.h>\n#include <google/protobuf/compiler/cpp/cpp_helpers.h>\n#include <google/protobuf/compiler/cpp/cpp_message.h>\n#include <google/protobuf/compiler/cpp/cpp_field.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\n// ===================================================================\n\nFileGenerator::FileGenerator(const FileDescriptor* file,\n                             const string& dllexport_decl)\n  : file_(file),\n    message_generators_(\n      new scoped_ptr<MessageGenerator>[file->message_type_count()]),\n    enum_generators_(\n      new scoped_ptr<EnumGenerator>[file->enum_type_count()]),\n    service_generators_(\n      new scoped_ptr<ServiceGenerator>[file->service_count()]),\n    extension_generators_(\n      new scoped_ptr<ExtensionGenerator>[file->extension_count()]),\n    dllexport_decl_(dllexport_decl) {\n\n  for (int i = 0; i < file->message_type_count(); i++) {\n    message_generators_[i].reset(\n      new MessageGenerator(file->message_type(i), dllexport_decl));\n  }\n\n  for (int i = 0; i < file->enum_type_count(); i++) {\n    enum_generators_[i].reset(\n      new EnumGenerator(file->enum_type(i), dllexport_decl));\n  }\n\n  for (int i = 0; i < file->service_count(); i++) {\n    service_generators_[i].reset(\n      new ServiceGenerator(file->service(i), dllexport_decl));\n  }\n\n  for (int i = 0; i < file->extension_count(); i++) {\n    extension_generators_[i].reset(\n      new ExtensionGenerator(file->extension(i), dllexport_decl));\n  }\n\n  SplitStringUsing(file_->package(), \".\", &package_parts_);\n}\n\nFileGenerator::~FileGenerator() {}\n\nvoid FileGenerator::GenerateHeader(io::Printer* printer) {\n  string filename_identifier = FilenameIdentifier(file_->name());\n\n  // Generate top of header.\n  printer->Print(\n    \"// Generated by the protocol buffer compiler.  DO NOT EDIT!\\n\"\n    \"// source: $filename$\\n\"\n    \"\\n\"\n    \"#ifndef PROTOBUF_$filename_identifier$__INCLUDED\\n\"\n    \"#define PROTOBUF_$filename_identifier$__INCLUDED\\n\"\n    \"\\n\"\n    \"#include <string>\\n\"\n    \"\\n\",\n    \"filename\", file_->name(),\n    \"filename_identifier\", filename_identifier);\n\n  printer->Print(\n    \"#include <google/protobuf/stubs/common.h>\\n\"\n    \"\\n\");\n\n  // Verify the protobuf library header version is compatible with the protoc\n  // version before going any further.\n  printer->Print(\n    \"#if GOOGLE_PROTOBUF_VERSION < $min_header_version$\\n\"\n    \"#error This file was generated by a newer version of protoc which is\\n\"\n    \"#error incompatible with your Protocol Buffer headers.  Please update\\n\"\n    \"#error your headers.\\n\"\n    \"#endif\\n\"\n    \"#if $protoc_version$ < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION\\n\"\n    \"#error This file was generated by an older version of protoc which is\\n\"\n    \"#error incompatible with your Protocol Buffer headers.  Please\\n\"\n    \"#error regenerate this file with a newer version of protoc.\\n\"\n    \"#endif\\n\"\n    \"\\n\",\n    \"min_header_version\",\n      SimpleItoa(protobuf::internal::kMinHeaderVersionForProtoc),\n    \"protoc_version\", SimpleItoa(GOOGLE_PROTOBUF_VERSION));\n\n  // OK, it's now safe to #include other files.\n  printer->Print(\n    \"#include <google/protobuf/generated_message_util.h>\\n\"\n    \"#include <google/protobuf/repeated_field.h>\\n\"\n    \"#include <google/protobuf/extension_set.h>\\n\");\n\n  if (HasDescriptorMethods(file_)) {\n    printer->Print(\n      \"#include <google/protobuf/generated_message_reflection.h>\\n\");\n  }\n\n  if (HasGenericServices(file_)) {\n    printer->Print(\n      \"#include <google/protobuf/service.h>\\n\");\n  }\n\n\n  for (int i = 0; i < file_->dependency_count(); i++) {\n    printer->Print(\n      \"#include \\\"$dependency$.pb.h\\\"\\n\",\n      \"dependency\", StripProto(file_->dependency(i)->name()));\n  }\n\n  printer->Print(\n    \"// @@protoc_insertion_point(includes)\\n\");\n\n  // Open namespace.\n  GenerateNamespaceOpeners(printer);\n\n  // Forward-declare the AddDescriptors, AssignDescriptors, and ShutdownFile\n  // functions, so that we can declare them to be friends of each class.\n  printer->Print(\n    \"\\n\"\n    \"// Internal implementation detail -- do not call these.\\n\"\n    \"void $dllexport_decl$ $adddescriptorsname$();\\n\",\n    \"adddescriptorsname\", GlobalAddDescriptorsName(file_->name()),\n    \"dllexport_decl\", dllexport_decl_);\n\n  printer->Print(\n    // Note that we don't put dllexport_decl on these because they are only\n    // called by the .pb.cc file in which they are defined.\n    \"void $assigndescriptorsname$();\\n\"\n    \"void $shutdownfilename$();\\n\"\n    \"\\n\",\n    \"assigndescriptorsname\", GlobalAssignDescriptorsName(file_->name()),\n    \"shutdownfilename\", GlobalShutdownFileName(file_->name()));\n\n  // Generate forward declarations of classes.\n  for (int i = 0; i < file_->message_type_count(); i++) {\n    message_generators_[i]->GenerateForwardDeclaration(printer);\n  }\n\n  printer->Print(\"\\n\");\n\n  // Generate enum definitions.\n  for (int i = 0; i < file_->message_type_count(); i++) {\n    message_generators_[i]->GenerateEnumDefinitions(printer);\n  }\n  for (int i = 0; i < file_->enum_type_count(); i++) {\n    enum_generators_[i]->GenerateDefinition(printer);\n  }\n\n  printer->Print(kThickSeparator);\n  printer->Print(\"\\n\");\n\n  // Generate class definitions.\n  for (int i = 0; i < file_->message_type_count(); i++) {\n    if (i > 0) {\n      printer->Print(\"\\n\");\n      printer->Print(kThinSeparator);\n      printer->Print(\"\\n\");\n    }\n    message_generators_[i]->GenerateClassDefinition(printer);\n  }\n\n  printer->Print(\"\\n\");\n  printer->Print(kThickSeparator);\n  printer->Print(\"\\n\");\n\n  if (HasGenericServices(file_)) {\n    // Generate service definitions.\n    for (int i = 0; i < file_->service_count(); i++) {\n      if (i > 0) {\n        printer->Print(\"\\n\");\n        printer->Print(kThinSeparator);\n        printer->Print(\"\\n\");\n      }\n      service_generators_[i]->GenerateDeclarations(printer);\n    }\n\n    printer->Print(\"\\n\");\n    printer->Print(kThickSeparator);\n    printer->Print(\"\\n\");\n  }\n\n  // Declare extension identifiers.\n  for (int i = 0; i < file_->extension_count(); i++) {\n    extension_generators_[i]->GenerateDeclaration(printer);\n  }\n\n  printer->Print(\"\\n\");\n  printer->Print(kThickSeparator);\n  printer->Print(\"\\n\");\n\n  // Generate class inline methods.\n  for (int i = 0; i < file_->message_type_count(); i++) {\n    if (i > 0) {\n      printer->Print(kThinSeparator);\n      printer->Print(\"\\n\");\n    }\n    message_generators_[i]->GenerateInlineMethods(printer);\n  }\n\n  printer->Print(\n    \"\\n\"\n    \"// @@protoc_insertion_point(namespace_scope)\\n\");\n\n  // Close up namespace.\n  GenerateNamespaceClosers(printer);\n\n  // Emit GetEnumDescriptor specializations into google::protobuf namespace:\n  if (HasDescriptorMethods(file_)) {\n    // The SWIG conditional is to avoid a null-pointer dereference\n    // (bug 1984964) in swig-1.3.21 resulting from the following syntax:\n    //   namespace X { void Y<Z::W>(); }\n    // which appears in GetEnumDescriptor() specializations.\n    printer->Print(\n        \"\\n\"\n        \"#ifndef SWIG\\n\"\n        \"namespace google {\\nnamespace protobuf {\\n\"\n        \"\\n\");\n    for (int i = 0; i < file_->message_type_count(); i++) {\n      message_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);\n    }\n    for (int i = 0; i < file_->enum_type_count(); i++) {\n      enum_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);\n    }\n    printer->Print(\n        \"\\n\"\n        \"}  // namespace google\\n}  // namespace protobuf\\n\"\n        \"#endif  // SWIG\\n\");\n  }\n\n  printer->Print(\n    \"\\n\"\n    \"// @@protoc_insertion_point(global_scope)\\n\"\n    \"\\n\");\n\n  printer->Print(\n    \"#endif  // PROTOBUF_$filename_identifier$__INCLUDED\\n\",\n    \"filename_identifier\", filename_identifier);\n}\n\nvoid FileGenerator::GenerateSource(io::Printer* printer) {\n  printer->Print(\n    \"// Generated by the protocol buffer compiler.  DO NOT EDIT!\\n\"\n    \"\\n\"\n\n    // The generated code calls accessors that might be deprecated. We don't\n    // want the compiler to warn in generated code.\n    \"#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION\\n\"\n    \"#include \\\"$basename$.pb.h\\\"\\n\"\n    \"\\n\"\n    \"#include <algorithm>\\n\"    // for swap()\n    \"\\n\"\n    \"#include <google/protobuf/stubs/once.h>\\n\"\n    \"#include <google/protobuf/io/coded_stream.h>\\n\"\n    \"#include <google/protobuf/wire_format_lite_inl.h>\\n\",\n    \"basename\", StripProto(file_->name()));\n\n  if (HasDescriptorMethods(file_)) {\n    printer->Print(\n      \"#include <google/protobuf/descriptor.h>\\n\"\n      \"#include <google/protobuf/reflection_ops.h>\\n\"\n      \"#include <google/protobuf/wire_format.h>\\n\");\n  }\n\n  printer->Print(\n    \"// @@protoc_insertion_point(includes)\\n\");\n\n  GenerateNamespaceOpeners(printer);\n\n  if (HasDescriptorMethods(file_)) {\n    printer->Print(\n      \"\\n\"\n      \"namespace {\\n\"\n      \"\\n\");\n    for (int i = 0; i < file_->message_type_count(); i++) {\n      message_generators_[i]->GenerateDescriptorDeclarations(printer);\n    }\n    for (int i = 0; i < file_->enum_type_count(); i++) {\n      printer->Print(\n        \"const ::google::protobuf::EnumDescriptor* $name$_descriptor_ = NULL;\\n\",\n        \"name\", ClassName(file_->enum_type(i), false));\n    }\n\n    if (HasGenericServices(file_)) {\n      for (int i = 0; i < file_->service_count(); i++) {\n        printer->Print(\n          \"const ::google::protobuf::ServiceDescriptor* $name$_descriptor_ = NULL;\\n\",\n          \"name\", file_->service(i)->name());\n      }\n    }\n\n    printer->Print(\n      \"\\n\"\n      \"}  // namespace\\n\"\n      \"\\n\");\n  }\n\n  // Define our externally-visible BuildDescriptors() function.  (For the lite\n  // library, all this does is initialize default instances.)\n  GenerateBuildDescriptors(printer);\n\n  // Generate enums.\n  for (int i = 0; i < file_->enum_type_count(); i++) {\n    enum_generators_[i]->GenerateMethods(printer);\n  }\n\n  // Generate classes.\n  for (int i = 0; i < file_->message_type_count(); i++) {\n    printer->Print(\"\\n\");\n    printer->Print(kThickSeparator);\n    printer->Print(\"\\n\");\n    message_generators_[i]->GenerateClassMethods(printer);\n  }\n\n  if (HasGenericServices(file_)) {\n    // Generate services.\n    for (int i = 0; i < file_->service_count(); i++) {\n      if (i == 0) printer->Print(\"\\n\");\n      printer->Print(kThickSeparator);\n      printer->Print(\"\\n\");\n      service_generators_[i]->GenerateImplementation(printer);\n    }\n  }\n\n  // Define extensions.\n  for (int i = 0; i < file_->extension_count(); i++) {\n    extension_generators_[i]->GenerateDefinition(printer);\n  }\n\n  printer->Print(\n    \"\\n\"\n    \"// @@protoc_insertion_point(namespace_scope)\\n\");\n\n  GenerateNamespaceClosers(printer);\n\n  printer->Print(\n    \"\\n\"\n    \"// @@protoc_insertion_point(global_scope)\\n\");\n}\n\nvoid FileGenerator::GenerateBuildDescriptors(io::Printer* printer) {\n  // AddDescriptors() is a file-level procedure which adds the encoded\n  // FileDescriptorProto for this .proto file to the global DescriptorPool\n  // for generated files (DescriptorPool::generated_pool()).  It always runs\n  // at static initialization time, so all files will be registered before\n  // main() starts.  This procedure also constructs default instances and\n  // registers extensions.\n  //\n  // Its sibling, AssignDescriptors(), actually pulls the compiled\n  // FileDescriptor from the DescriptorPool and uses it to populate all of\n  // the global variables which store pointers to the descriptor objects.\n  // It also constructs the reflection objects.  It is called the first time\n  // anyone calls descriptor() or GetReflection() on one of the types defined\n  // in the file.\n\n  // In optimize_for = LITE_RUNTIME mode, we don't generate AssignDescriptors()\n  // and we only use AddDescriptors() to allocate default instances.\n  if (HasDescriptorMethods(file_)) {\n    printer->Print(\n      \"\\n\"\n      \"void $assigndescriptorsname$() {\\n\",\n      \"assigndescriptorsname\", GlobalAssignDescriptorsName(file_->name()));\n    printer->Indent();\n\n    // Make sure the file has found its way into the pool.  If a descriptor\n    // is requested *during* static init then AddDescriptors() may not have\n    // been called yet, so we call it manually.  Note that it's fine if\n    // AddDescriptors() is called multiple times.\n    printer->Print(\n      \"$adddescriptorsname$();\\n\",\n      \"adddescriptorsname\", GlobalAddDescriptorsName(file_->name()));\n\n    // Get the file's descriptor from the pool.\n    printer->Print(\n      \"const ::google::protobuf::FileDescriptor* file =\\n\"\n      \"  ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(\\n\"\n      \"    \\\"$filename$\\\");\\n\"\n      // Note that this GOOGLE_CHECK is necessary to prevent a warning about \"file\"\n      // being unused when compiling an empty .proto file.\n      \"GOOGLE_CHECK(file != NULL);\\n\",\n      \"filename\", file_->name());\n\n    // Go through all the stuff defined in this file and generated code to\n    // assign the global descriptor pointers based on the file descriptor.\n    for (int i = 0; i < file_->message_type_count(); i++) {\n      message_generators_[i]->GenerateDescriptorInitializer(printer, i);\n    }\n    for (int i = 0; i < file_->enum_type_count(); i++) {\n      enum_generators_[i]->GenerateDescriptorInitializer(printer, i);\n    }\n    if (HasGenericServices(file_)) {\n      for (int i = 0; i < file_->service_count(); i++) {\n        service_generators_[i]->GenerateDescriptorInitializer(printer, i);\n      }\n    }\n\n    printer->Outdent();\n    printer->Print(\n      \"}\\n\"\n      \"\\n\");\n\n    // ---------------------------------------------------------------\n\n    // protobuf_AssignDescriptorsOnce():  The first time it is called, calls\n    // AssignDescriptors().  All later times, waits for the first call to\n    // complete and then returns.\n    printer->Print(\n      \"namespace {\\n\"\n      \"\\n\"\n      \"GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);\\n\"\n      \"inline void protobuf_AssignDescriptorsOnce() {\\n\"\n      \"  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,\\n\"\n      \"                 &$assigndescriptorsname$);\\n\"\n      \"}\\n\"\n      \"\\n\",\n      \"assigndescriptorsname\", GlobalAssignDescriptorsName(file_->name()));\n\n    // protobuf_RegisterTypes():  Calls\n    // MessageFactory::InternalRegisterGeneratedType() for each message type.\n    printer->Print(\n      \"void protobuf_RegisterTypes(const ::std::string&) {\\n\"\n      \"  protobuf_AssignDescriptorsOnce();\\n\");\n    printer->Indent();\n\n    for (int i = 0; i < file_->message_type_count(); i++) {\n      message_generators_[i]->GenerateTypeRegistrations(printer);\n    }\n\n    printer->Outdent();\n    printer->Print(\n      \"}\\n\"\n      \"\\n\"\n      \"}  // namespace\\n\");\n  }\n\n  // -----------------------------------------------------------------\n\n  // ShutdownFile():  Deletes descriptors, default instances, etc. on shutdown.\n  printer->Print(\n    \"\\n\"\n    \"void $shutdownfilename$() {\\n\",\n    \"shutdownfilename\", GlobalShutdownFileName(file_->name()));\n  printer->Indent();\n\n  for (int i = 0; i < file_->message_type_count(); i++) {\n    message_generators_[i]->GenerateShutdownCode(printer);\n  }\n\n  printer->Outdent();\n  printer->Print(\n    \"}\\n\");\n\n  // -----------------------------------------------------------------\n\n  // Now generate the AddDescriptors() function.\n  printer->Print(\n    \"\\n\"\n    \"void $adddescriptorsname$() {\\n\"\n    // We don't need any special synchronization here because this code is\n    // called at static init time before any threads exist.\n    \"  static bool already_here = false;\\n\"\n    \"  if (already_here) return;\\n\"\n    \"  already_here = true;\\n\"\n    \"  GOOGLE_PROTOBUF_VERIFY_VERSION;\\n\"\n    \"\\n\",\n    \"adddescriptorsname\", GlobalAddDescriptorsName(file_->name()));\n  printer->Indent();\n\n  // Call the AddDescriptors() methods for all of our dependencies, to make\n  // sure they get added first.\n  for (int i = 0; i < file_->dependency_count(); i++) {\n    const FileDescriptor* dependency = file_->dependency(i);\n    // Print the namespace prefix for the dependency.\n    vector<string> dependency_package_parts;\n    SplitStringUsing(dependency->package(), \".\", &dependency_package_parts);\n    printer->Print(\"::\");\n    for (int i = 0; i < dependency_package_parts.size(); i++) {\n      printer->Print(\"$name$::\",\n                     \"name\", dependency_package_parts[i]);\n    }\n    // Call its AddDescriptors function.\n    printer->Print(\n      \"$name$();\\n\",\n      \"name\", GlobalAddDescriptorsName(dependency->name()));\n  }\n\n  if (HasDescriptorMethods(file_)) {\n    // Embed the descriptor.  We simply serialize the entire FileDescriptorProto\n    // and embed it as a string literal, which is parsed and built into real\n    // descriptors at initialization time.\n    FileDescriptorProto file_proto;\n    file_->CopyTo(&file_proto);\n    string file_data;\n    file_proto.SerializeToString(&file_data);\n\n    printer->Print(\n      \"::google::protobuf::DescriptorPool::InternalAddGeneratedFile(\");\n\n    // Only write 40 bytes per line.\n    static const int kBytesPerLine = 40;\n    for (int i = 0; i < file_data.size(); i += kBytesPerLine) {\n      printer->Print(\"\\n  \\\"$data$\\\"\",\n        \"data\", EscapeTrigraphs(CEscape(file_data.substr(i, kBytesPerLine))));\n    }\n    printer->Print(\n      \", $size$);\\n\",\n      \"size\", SimpleItoa(file_data.size()));\n\n    // Call MessageFactory::InternalRegisterGeneratedFile().\n    printer->Print(\n      \"::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(\\n\"\n      \"  \\\"$filename$\\\", &protobuf_RegisterTypes);\\n\",\n      \"filename\", file_->name());\n  }\n\n  // Allocate and initialize default instances.  This can't be done lazily\n  // since default instances are returned by simple accessors and are used with\n  // extensions.  Speaking of which, we also register extensions at this time.\n  for (int i = 0; i < file_->message_type_count(); i++) {\n    message_generators_[i]->GenerateDefaultInstanceAllocator(printer);\n  }\n  for (int i = 0; i < file_->extension_count(); i++) {\n    extension_generators_[i]->GenerateRegistration(printer);\n  }\n  for (int i = 0; i < file_->message_type_count(); i++) {\n    message_generators_[i]->GenerateDefaultInstanceInitializer(printer);\n  }\n\n  printer->Print(\n    \"::google::protobuf::internal::OnShutdown(&$shutdownfilename$);\\n\",\n    \"shutdownfilename\", GlobalShutdownFileName(file_->name()));\n\n  printer->Outdent();\n\n  printer->Print(\n    \"}\\n\"\n    \"\\n\"\n    \"// Force AddDescriptors() to be called at static initialization time.\\n\"\n    \"struct StaticDescriptorInitializer_$filename$ {\\n\"\n    \"  StaticDescriptorInitializer_$filename$() {\\n\"\n    \"    $adddescriptorsname$();\\n\"\n    \"  }\\n\"\n    \"} static_descriptor_initializer_$filename$_;\\n\"\n    \"\\n\",\n    \"adddescriptorsname\", GlobalAddDescriptorsName(file_->name()),\n    \"filename\", FilenameIdentifier(file_->name()));\n}\n\nvoid FileGenerator::GenerateNamespaceOpeners(io::Printer* printer) {\n  if (package_parts_.size() > 0) printer->Print(\"\\n\");\n\n  for (int i = 0; i < package_parts_.size(); i++) {\n    printer->Print(\"namespace $part$ {\\n\",\n                   \"part\", package_parts_[i]);\n  }\n}\n\nvoid FileGenerator::GenerateNamespaceClosers(io::Printer* printer) {\n  if (package_parts_.size() > 0) printer->Print(\"\\n\");\n\n  for (int i = package_parts_.size() - 1; i >= 0; i--) {\n    printer->Print(\"}  // namespace $part$\\n\",\n                   \"part\", package_parts_[i]);\n  }\n}\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__\n#define GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__\n\n#include <string>\n#include <vector>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/compiler/cpp/cpp_field.h>\n\nnamespace google {\nnamespace protobuf {\n  class FileDescriptor;        // descriptor.h\n  namespace io {\n    class Printer;             // printer.h\n  }\n}\n\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nclass EnumGenerator;           // enum.h\nclass MessageGenerator;        // message.h\nclass ServiceGenerator;        // service.h\nclass ExtensionGenerator;      // extension.h\n\nclass FileGenerator {\n public:\n  // See generator.cc for the meaning of dllexport_decl.\n  explicit FileGenerator(const FileDescriptor* file,\n                         const string& dllexport_decl);\n  ~FileGenerator();\n\n  void GenerateHeader(io::Printer* printer);\n  void GenerateSource(io::Printer* printer);\n\n private:\n  // Generate the BuildDescriptors() procedure, which builds all descriptors\n  // for types defined in the file.\n  void GenerateBuildDescriptors(io::Printer* printer);\n\n  void GenerateNamespaceOpeners(io::Printer* printer);\n  void GenerateNamespaceClosers(io::Printer* printer);\n\n  const FileDescriptor* file_;\n\n  scoped_array<scoped_ptr<MessageGenerator> > message_generators_;\n  scoped_array<scoped_ptr<EnumGenerator> > enum_generators_;\n  scoped_array<scoped_ptr<ServiceGenerator> > service_generators_;\n  scoped_array<scoped_ptr<ExtensionGenerator> > extension_generators_;\n\n  // E.g. if the package is foo.bar, package_parts_ is {\"foo\", \"bar\"}.\n  vector<string> package_parts_;\n\n  string dllexport_decl_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator);\n};\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/cpp/cpp_generator.h>\n\n#include <vector>\n#include <utility>\n\n#include <google/protobuf/compiler/cpp/cpp_file.h>\n#include <google/protobuf/compiler/cpp/cpp_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/descriptor.pb.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nCppGenerator::CppGenerator() {}\nCppGenerator::~CppGenerator() {}\n\nbool CppGenerator::Generate(const FileDescriptor* file,\n                            const string& parameter,\n                            GeneratorContext* generator_context,\n                            string* error) const {\n  vector<pair<string, string> > options;\n  ParseGeneratorParameter(parameter, &options);\n\n  // -----------------------------------------------------------------\n  // parse generator options\n\n  // TODO(kenton):  If we ever have more options, we may want to create a\n  //   class that encapsulates them which we can pass down to all the\n  //   generator classes.  Currently we pass dllexport_decl down to all of\n  //   them via the constructors, but we don't want to have to add another\n  //   constructor parameter for every option.\n\n  // If the dllexport_decl option is passed to the compiler, we need to write\n  // it in front of every symbol that should be exported if this .proto is\n  // compiled into a Windows DLL.  E.g., if the user invokes the protocol\n  // compiler as:\n  //   protoc --cpp_out=dllexport_decl=FOO_EXPORT:outdir foo.proto\n  // then we'll define classes like this:\n  //   class FOO_EXPORT Foo {\n  //     ...\n  //   }\n  // FOO_EXPORT is a macro which should expand to __declspec(dllexport) or\n  // __declspec(dllimport) depending on what is being compiled.\n  string dllexport_decl;\n\n  for (int i = 0; i < options.size(); i++) {\n    if (options[i].first == \"dllexport_decl\") {\n      dllexport_decl = options[i].second;\n    } else {\n      *error = \"Unknown generator option: \" + options[i].first;\n      return false;\n    }\n  }\n\n  // -----------------------------------------------------------------\n\n\n  string basename = StripProto(file->name());\n  basename.append(\".pb\");\n\n  FileGenerator file_generator(file, dllexport_decl);\n\n  // Generate header.\n  {\n    scoped_ptr<io::ZeroCopyOutputStream> output(\n      generator_context->Open(basename + \".h\"));\n    io::Printer printer(output.get(), '$');\n    file_generator.GenerateHeader(&printer);\n  }\n\n  // Generate cc file.\n  {\n    scoped_ptr<io::ZeroCopyOutputStream> output(\n      generator_context->Open(basename + \".cc\"));\n    io::Printer printer(output.get(), '$');\n    file_generator.GenerateSource(&printer);\n  }\n\n  return true;\n}\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Generates C++ code for a given .proto file.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_GENERATOR_H__\n#define GOOGLE_PROTOBUF_COMPILER_CPP_GENERATOR_H__\n\n#include <string>\n#include <google/protobuf/compiler/code_generator.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\n// CodeGenerator implementation which generates a C++ source file and\n// header.  If you create your own protocol compiler binary and you want\n// it to support C++ output, you can do so by registering an instance of this\n// CodeGenerator with the CommandLineInterface in your main() function.\nclass LIBPROTOC_EXPORT CppGenerator : public CodeGenerator {\n public:\n  CppGenerator();\n  ~CppGenerator();\n\n  // implements CodeGenerator ----------------------------------------\n  bool Generate(const FileDescriptor* file,\n                const string& parameter,\n                GeneratorContext* generator_context,\n                string* error) const;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CppGenerator);\n};\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_GENERATOR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <limits>\n#include <vector>\n#include <google/protobuf/stubs/hash.h>\n\n#include <google/protobuf/compiler/cpp/cpp_helpers.h>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nnamespace {\n\nstring DotsToUnderscores(const string& name) {\n  return StringReplace(name, \".\", \"_\", true);\n}\n\nstring DotsToColons(const string& name) {\n  return StringReplace(name, \".\", \"::\", true);\n}\n\nconst char* const kKeywordList[] = {\n  \"and\", \"and_eq\", \"asm\", \"auto\", \"bitand\", \"bitor\", \"bool\", \"break\", \"case\",\n  \"catch\", \"char\", \"class\", \"compl\", \"const\", \"const_cast\", \"continue\",\n  \"default\", \"delete\", \"do\", \"double\", \"dynamic_cast\", \"else\", \"enum\",\n  \"explicit\", \"extern\", \"false\", \"float\", \"for\", \"friend\", \"goto\", \"if\",\n  \"inline\", \"int\", \"long\", \"mutable\", \"namespace\", \"new\", \"not\", \"not_eq\",\n  \"operator\", \"or\", \"or_eq\", \"private\", \"protected\", \"public\", \"register\",\n  \"reinterpret_cast\", \"return\", \"short\", \"signed\", \"sizeof\", \"static\",\n  \"static_cast\", \"struct\", \"switch\", \"template\", \"this\", \"throw\", \"true\", \"try\",\n  \"typedef\", \"typeid\", \"typename\", \"union\", \"unsigned\", \"using\", \"virtual\",\n  \"void\", \"volatile\", \"wchar_t\", \"while\", \"xor\", \"xor_eq\"\n};\n\nhash_set<string> MakeKeywordsMap() {\n  hash_set<string> result;\n  for (int i = 0; i < GOOGLE_ARRAYSIZE(kKeywordList); i++) {\n    result.insert(kKeywordList[i]);\n  }\n  return result;\n}\n\nhash_set<string> kKeywords = MakeKeywordsMap();\n\nstring UnderscoresToCamelCase(const string& input, bool cap_next_letter) {\n  string result;\n  // Note:  I distrust ctype.h due to locales.\n  for (int i = 0; i < input.size(); i++) {\n    if ('a' <= input[i] && input[i] <= 'z') {\n      if (cap_next_letter) {\n        result += input[i] + ('A' - 'a');\n      } else {\n        result += input[i];\n      }\n      cap_next_letter = false;\n    } else if ('A' <= input[i] && input[i] <= 'Z') {\n      // Capital letters are left as-is.\n      result += input[i];\n      cap_next_letter = false;\n    } else if ('0' <= input[i] && input[i] <= '9') {\n      result += input[i];\n      cap_next_letter = true;\n    } else {\n      cap_next_letter = true;\n    }\n  }\n  return result;\n}\n\n}  // namespace\n\nconst char kThickSeparator[] =\n  \"// ===================================================================\\n\";\nconst char kThinSeparator[] =\n  \"// -------------------------------------------------------------------\\n\";\n\nstring ClassName(const Descriptor* descriptor, bool qualified) {\n\n  // Find \"outer\", the descriptor of the top-level message in which\n  // \"descriptor\" is embedded.\n  const Descriptor* outer = descriptor;\n  while (outer->containing_type() != NULL) outer = outer->containing_type();\n\n  const string& outer_name = outer->full_name();\n  string inner_name = descriptor->full_name().substr(outer_name.size());\n\n  if (qualified) {\n    return \"::\" + DotsToColons(outer_name) + DotsToUnderscores(inner_name);\n  } else {\n    return outer->name() + DotsToUnderscores(inner_name);\n  }\n}\n\nstring ClassName(const EnumDescriptor* enum_descriptor, bool qualified) {\n  if (enum_descriptor->containing_type() == NULL) {\n    if (qualified) {\n      return DotsToColons(enum_descriptor->full_name());\n    } else {\n      return enum_descriptor->name();\n    }\n  } else {\n    string result = ClassName(enum_descriptor->containing_type(), qualified);\n    result += '_';\n    result += enum_descriptor->name();\n    return result;\n  }\n}\n\n\nstring SuperClassName(const Descriptor* descriptor) {\n  return HasDescriptorMethods(descriptor->file()) ?\n      \"::google::protobuf::Message\" : \"::google::protobuf::MessageLite\";\n}\n\nstring FieldName(const FieldDescriptor* field) {\n  string result = field->name();\n  LowerString(&result);\n  if (kKeywords.count(result) > 0) {\n    result.append(\"_\");\n  }\n  return result;\n}\n\nstring FieldConstantName(const FieldDescriptor *field) {\n  string field_name = UnderscoresToCamelCase(field->name(), true);\n  string result = \"k\" + field_name + \"FieldNumber\";\n\n  if (!field->is_extension() &&\n      field->containing_type()->FindFieldByCamelcaseName(\n        field->camelcase_name()) != field) {\n    // This field's camelcase name is not unique.  As a hack, add the field\n    // number to the constant name.  This makes the constant rather useless,\n    // but what can we do?\n    result += \"_\" + SimpleItoa(field->number());\n  }\n\n  return result;\n}\n\nstring FieldMessageTypeName(const FieldDescriptor* field) {\n  // Note:  The Google-internal version of Protocol Buffers uses this function\n  //   as a hook point for hacks to support legacy code.\n  return ClassName(field->message_type(), true);\n}\n\nstring StripProto(const string& filename) {\n  if (HasSuffixString(filename, \".protodevel\")) {\n    return StripSuffixString(filename, \".protodevel\");\n  } else {\n    return StripSuffixString(filename, \".proto\");\n  }\n}\n\nconst char* PrimitiveTypeName(FieldDescriptor::CppType type) {\n  switch (type) {\n    case FieldDescriptor::CPPTYPE_INT32  : return \"::google::protobuf::int32\";\n    case FieldDescriptor::CPPTYPE_INT64  : return \"::google::protobuf::int64\";\n    case FieldDescriptor::CPPTYPE_UINT32 : return \"::google::protobuf::uint32\";\n    case FieldDescriptor::CPPTYPE_UINT64 : return \"::google::protobuf::uint64\";\n    case FieldDescriptor::CPPTYPE_DOUBLE : return \"double\";\n    case FieldDescriptor::CPPTYPE_FLOAT  : return \"float\";\n    case FieldDescriptor::CPPTYPE_BOOL   : return \"bool\";\n    case FieldDescriptor::CPPTYPE_ENUM   : return \"int\";\n    case FieldDescriptor::CPPTYPE_STRING : return \"::std::string\";\n    case FieldDescriptor::CPPTYPE_MESSAGE: return NULL;\n\n    // No default because we want the compiler to complain if any new\n    // CppTypes are added.\n  }\n\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return NULL;\n}\n\nconst char* DeclaredTypeMethodName(FieldDescriptor::Type type) {\n  switch (type) {\n    case FieldDescriptor::TYPE_INT32   : return \"Int32\";\n    case FieldDescriptor::TYPE_INT64   : return \"Int64\";\n    case FieldDescriptor::TYPE_UINT32  : return \"UInt32\";\n    case FieldDescriptor::TYPE_UINT64  : return \"UInt64\";\n    case FieldDescriptor::TYPE_SINT32  : return \"SInt32\";\n    case FieldDescriptor::TYPE_SINT64  : return \"SInt64\";\n    case FieldDescriptor::TYPE_FIXED32 : return \"Fixed32\";\n    case FieldDescriptor::TYPE_FIXED64 : return \"Fixed64\";\n    case FieldDescriptor::TYPE_SFIXED32: return \"SFixed32\";\n    case FieldDescriptor::TYPE_SFIXED64: return \"SFixed64\";\n    case FieldDescriptor::TYPE_FLOAT   : return \"Float\";\n    case FieldDescriptor::TYPE_DOUBLE  : return \"Double\";\n\n    case FieldDescriptor::TYPE_BOOL    : return \"Bool\";\n    case FieldDescriptor::TYPE_ENUM    : return \"Enum\";\n\n    case FieldDescriptor::TYPE_STRING  : return \"String\";\n    case FieldDescriptor::TYPE_BYTES   : return \"Bytes\";\n    case FieldDescriptor::TYPE_GROUP   : return \"Group\";\n    case FieldDescriptor::TYPE_MESSAGE : return \"Message\";\n\n    // No default because we want the compiler to complain if any new\n    // types are added.\n  }\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return \"\";\n}\n\nstring DefaultValue(const FieldDescriptor* field) {\n  switch (field->cpp_type()) {\n    case FieldDescriptor::CPPTYPE_INT32:\n      return SimpleItoa(field->default_value_int32());\n    case FieldDescriptor::CPPTYPE_UINT32:\n      return SimpleItoa(field->default_value_uint32()) + \"u\";\n    case FieldDescriptor::CPPTYPE_INT64:\n      return \"GOOGLE_LONGLONG(\" + SimpleItoa(field->default_value_int64()) + \")\";\n    case FieldDescriptor::CPPTYPE_UINT64:\n      return \"GOOGLE_ULONGLONG(\" + SimpleItoa(field->default_value_uint64())+ \")\";\n    case FieldDescriptor::CPPTYPE_DOUBLE: {\n      double value = field->default_value_double();\n      if (value == numeric_limits<double>::infinity()) {\n        return \"::google::protobuf::internal::Infinity()\";\n      } else if (value == -numeric_limits<double>::infinity()) {\n        return \"-::google::protobuf::internal::Infinity()\";\n      } else if (value != value) {\n        return \"::google::protobuf::internal::NaN()\";\n      } else {\n        return SimpleDtoa(value);\n      }\n    }\n    case FieldDescriptor::CPPTYPE_FLOAT:\n      {\n        float value = field->default_value_float();\n        if (value == numeric_limits<float>::infinity()) {\n          return \"static_cast<float>(::google::protobuf::internal::Infinity())\";\n        } else if (value == -numeric_limits<float>::infinity()) {\n          return \"static_cast<float>(-::google::protobuf::internal::Infinity())\";\n        } else if (value != value) {\n          return \"static_cast<float>(::google::protobuf::internal::NaN())\";\n        } else {\n          string float_value = SimpleFtoa(value);\n          // If floating point value contains a period (.) or an exponent\n          // (either E or e), then append suffix 'f' to make it a float\n          // literal.\n          if (float_value.find_first_of(\".eE\") != string::npos) {\n            float_value.push_back('f');\n          }\n          return float_value;\n        }\n      }\n    case FieldDescriptor::CPPTYPE_BOOL:\n      return field->default_value_bool() ? \"true\" : \"false\";\n    case FieldDescriptor::CPPTYPE_ENUM:\n      // Lazy:  Generate a static_cast because we don't have a helper function\n      //   that constructs the full name of an enum value.\n      return strings::Substitute(\n          \"static_cast< $0 >($1)\",\n          ClassName(field->enum_type(), true),\n          field->default_value_enum()->number());\n    case FieldDescriptor::CPPTYPE_STRING:\n      return \"\\\"\" + EscapeTrigraphs(CEscape(field->default_value_string())) +\n             \"\\\"\";\n    case FieldDescriptor::CPPTYPE_MESSAGE:\n      return FieldMessageTypeName(field) + \"::default_instance()\";\n  }\n  // Can't actually get here; make compiler happy.  (We could add a default\n  // case above but then we wouldn't get the nice compiler warning when a\n  // new type is added.)\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return \"\";\n}\n\n// Convert a file name into a valid identifier.\nstring FilenameIdentifier(const string& filename) {\n  string result;\n  for (int i = 0; i < filename.size(); i++) {\n    if (ascii_isalnum(filename[i])) {\n      result.push_back(filename[i]);\n    } else {\n      // Not alphanumeric.  To avoid any possibility of name conflicts we\n      // use the hex code for the character.\n      result.push_back('_');\n      char buffer[kFastToBufferSize];\n      result.append(FastHexToBuffer(static_cast<uint8>(filename[i]), buffer));\n    }\n  }\n  return result;\n}\n\n// Return the name of the AddDescriptors() function for a given file.\nstring GlobalAddDescriptorsName(const string& filename) {\n  return \"protobuf_AddDesc_\" + FilenameIdentifier(filename);\n}\n\n// Return the name of the AssignDescriptors() function for a given file.\nstring GlobalAssignDescriptorsName(const string& filename) {\n  return \"protobuf_AssignDesc_\" + FilenameIdentifier(filename);\n}\n\n// Return the name of the ShutdownFile() function for a given file.\nstring GlobalShutdownFileName(const string& filename) {\n  return \"protobuf_ShutdownFile_\" + FilenameIdentifier(filename);\n}\n\n// Escape C++ trigraphs by escaping question marks to \\?\nstring EscapeTrigraphs(const string& to_escape) {\n  return StringReplace(to_escape, \"?\", \"\\\\?\", true);\n}\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_HELPERS_H__\n#define GOOGLE_PROTOBUF_COMPILER_CPP_HELPERS_H__\n\n#include <string>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/descriptor.pb.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\n// Commonly-used separator comments.  Thick is a line of '=', thin is a line\n// of '-'.\nextern const char kThickSeparator[];\nextern const char kThinSeparator[];\n\n// Returns the non-nested type name for the given type.  If \"qualified\" is\n// true, prefix the type with the full namespace.  For example, if you had:\n//   package foo.bar;\n//   message Baz { message Qux {} }\n// Then the qualified ClassName for Qux would be:\n//   ::foo::bar::Baz_Qux\n// While the non-qualified version would be:\n//   Baz_Qux\nstring ClassName(const Descriptor* descriptor, bool qualified);\nstring ClassName(const EnumDescriptor* enum_descriptor, bool qualified);\n\nstring SuperClassName(const Descriptor* descriptor);\n\n// Get the (unqualified) name that should be used for this field in C++ code.\n// The name is coerced to lower-case to emulate proto1 behavior.  People\n// should be using lowercase-with-underscores style for proto field names\n// anyway, so normally this just returns field->name().\nstring FieldName(const FieldDescriptor* field);\n\n// Get the unqualified name that should be used for a field's field\n// number constant.\nstring FieldConstantName(const FieldDescriptor *field);\n\n// Returns the scope where the field was defined (for extensions, this is\n// different from the message type to which the field applies).\ninline const Descriptor* FieldScope(const FieldDescriptor* field) {\n  return field->is_extension() ?\n    field->extension_scope() : field->containing_type();\n}\n\n// Returns the fully-qualified type name field->message_type().  Usually this\n// is just ClassName(field->message_type(), true);\nstring FieldMessageTypeName(const FieldDescriptor* field);\n\n// Strips \".proto\" or \".protodevel\" from the end of a filename.\nstring StripProto(const string& filename);\n\n// Get the C++ type name for a primitive type (e.g. \"double\", \"::google::protobuf::int32\", etc.).\n// Note:  non-built-in type names will be qualified, meaning they will start\n// with a ::.  If you are using the type as a template parameter, you will\n// need to insure there is a space between the < and the ::, because the\n// ridiculous C++ standard defines \"<:\" to be a synonym for \"[\".\nconst char* PrimitiveTypeName(FieldDescriptor::CppType type);\n\n// Get the declared type name in CamelCase format, as is used e.g. for the\n// methods of WireFormat.  For example, TYPE_INT32 becomes \"Int32\".\nconst char* DeclaredTypeMethodName(FieldDescriptor::Type type);\n\n// Get code that evaluates to the field's default value.\nstring DefaultValue(const FieldDescriptor* field);\n\n// Convert a file name into a valid identifier.\nstring FilenameIdentifier(const string& filename);\n\n// Return the name of the AddDescriptors() function for a given file.\nstring GlobalAddDescriptorsName(const string& filename);\n\n// Return the name of the AssignDescriptors() function for a given file.\nstring GlobalAssignDescriptorsName(const string& filename);\n\n// Return the name of the ShutdownFile() function for a given file.\nstring GlobalShutdownFileName(const string& filename);\n\n// Escape C++ trigraphs by escaping question marks to \\?\nstring EscapeTrigraphs(const string& to_escape);\n\n// Do message classes in this file keep track of unknown fields?\ninline bool HasUnknownFields(const FileDescriptor *file) {\n  return file->options().optimize_for() != FileOptions::LITE_RUNTIME;\n}\n\n// Does this file have generated parsing, serialization, and other\n// standard methods for which reflection-based fallback implementations exist?\ninline bool HasGeneratedMethods(const FileDescriptor *file) {\n  return file->options().optimize_for() != FileOptions::CODE_SIZE;\n}\n\n// Do message classes in this file have descriptor and refelction methods?\ninline bool HasDescriptorMethods(const FileDescriptor *file) {\n  return file->options().optimize_for() != FileOptions::LITE_RUNTIME;\n}\n\n// Should we generate generic services for this file?\ninline bool HasGenericServices(const FileDescriptor *file) {\n  return file->service_count() > 0 &&\n         file->options().optimize_for() != FileOptions::LITE_RUNTIME &&\n         file->options().cc_generic_services();\n}\n\n// Should string fields in this file verify that their contents are UTF-8?\ninline bool HasUtf8Verification(const FileDescriptor* file) {\n  return file->options().optimize_for() != FileOptions::LITE_RUNTIME;\n}\n\n// Should we generate a separate, super-optimized code path for serializing to\n// flat arrays?  We don't do this in Lite mode because we'd rather reduce code\n// size.\ninline bool HasFastArraySerialization(const FileDescriptor* file) {\n  return file->options().optimize_for() == FileOptions::SPEED;\n}\n\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_HELPERS_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <algorithm>\n#include <google/protobuf/stubs/hash.h>\n#include <map>\n#include <utility>\n#include <vector>\n#include <google/protobuf/compiler/cpp/cpp_message.h>\n#include <google/protobuf/compiler/cpp/cpp_field.h>\n#include <google/protobuf/compiler/cpp/cpp_enum.h>\n#include <google/protobuf/compiler/cpp/cpp_extension.h>\n#include <google/protobuf/compiler/cpp/cpp_helpers.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/descriptor.pb.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nusing internal::WireFormat;\nusing internal::WireFormatLite;\n\nnamespace {\n\nvoid PrintFieldComment(io::Printer* printer, const FieldDescriptor* field) {\n  // Print the field's proto-syntax definition as a comment.  We don't want to\n  // print group bodies so we cut off after the first line.\n  string def = field->DebugString();\n  printer->Print(\"// $def$\\n\",\n    \"def\", def.substr(0, def.find_first_of('\\n')));\n}\n\nstruct FieldOrderingByNumber {\n  inline bool operator()(const FieldDescriptor* a,\n                         const FieldDescriptor* b) const {\n    return a->number() < b->number();\n  }\n};\n\nconst char* kWireTypeNames[] = {\n  \"VARINT\",\n  \"FIXED64\",\n  \"LENGTH_DELIMITED\",\n  \"START_GROUP\",\n  \"END_GROUP\",\n  \"FIXED32\",\n};\n\n// Sort the fields of the given Descriptor by number into a new[]'d array\n// and return it.\nconst FieldDescriptor** SortFieldsByNumber(const Descriptor* descriptor) {\n  const FieldDescriptor** fields =\n    new const FieldDescriptor*[descriptor->field_count()];\n  for (int i = 0; i < descriptor->field_count(); i++) {\n    fields[i] = descriptor->field(i);\n  }\n  sort(fields, fields + descriptor->field_count(),\n       FieldOrderingByNumber());\n  return fields;\n}\n\n// Functor for sorting extension ranges by their \"start\" field number.\nstruct ExtensionRangeSorter {\n  bool operator()(const Descriptor::ExtensionRange* left,\n                  const Descriptor::ExtensionRange* right) const {\n    return left->start < right->start;\n  }\n};\n\n// Returns true if the message type has any required fields.  If it doesn't,\n// we can optimize out calls to its IsInitialized() method.\n//\n// already_seen is used to avoid checking the same type multiple times\n// (and also to protect against recursion).\nstatic bool HasRequiredFields(\n    const Descriptor* type,\n    hash_set<const Descriptor*>* already_seen) {\n  if (already_seen->count(type) > 0) {\n    // Since the first occurrence of a required field causes the whole\n    // function to return true, we can assume that if the type is already\n    // in the cache it didn't have any required fields.\n    return false;\n  }\n  already_seen->insert(type);\n\n  // If the type has extensions, an extension with message type could contain\n  // required fields, so we have to be conservative and assume such an\n  // extension exists.\n  if (type->extension_range_count() > 0) return true;\n\n  for (int i = 0; i < type->field_count(); i++) {\n    const FieldDescriptor* field = type->field(i);\n    if (field->is_required()) {\n      return true;\n    }\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      if (HasRequiredFields(field->message_type(), already_seen)) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nstatic bool HasRequiredFields(const Descriptor* type) {\n  hash_set<const Descriptor*> already_seen;\n  return HasRequiredFields(type, &already_seen);\n}\n\n// This returns an estimate of the compiler's alignment for the field.  This\n// can't guarantee to be correct because the generated code could be compiled on\n// different systems with different alignment rules.  The estimates below assume\n// 64-bit pointers.\nint EstimateAlignmentSize(const FieldDescriptor* field) {\n  if (field == NULL) return 0;\n  if (field->is_repeated()) return 8;\n  switch (field->cpp_type()) {\n    case FieldDescriptor::CPPTYPE_BOOL:\n      return 1;\n\n    case FieldDescriptor::CPPTYPE_INT32:\n    case FieldDescriptor::CPPTYPE_UINT32:\n    case FieldDescriptor::CPPTYPE_ENUM:\n    case FieldDescriptor::CPPTYPE_FLOAT:\n      return 4;\n\n    case FieldDescriptor::CPPTYPE_INT64:\n    case FieldDescriptor::CPPTYPE_UINT64:\n    case FieldDescriptor::CPPTYPE_DOUBLE:\n    case FieldDescriptor::CPPTYPE_STRING:\n    case FieldDescriptor::CPPTYPE_MESSAGE:\n      return 8;\n  }\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return -1;  // Make compiler happy.\n}\n\n// FieldGroup is just a helper for OptimizePadding below.  It holds a vector of\n// fields that are grouped together because they have compatible alignment, and\n// a preferred location in the final field ordering.\nclass FieldGroup {\n public:\n  FieldGroup()\n      : preferred_location_(0) {}\n\n  // A group with a single field.\n  FieldGroup(float preferred_location, const FieldDescriptor* field)\n      : preferred_location_(preferred_location),\n        fields_(1, field) {}\n\n  // Append the fields in 'other' to this group.\n  void Append(const FieldGroup& other) {\n    if (other.fields_.empty()) {\n      return;\n    }\n    // Preferred location is the average among all the fields, so we weight by\n    // the number of fields on each FieldGroup object.\n    preferred_location_ =\n        (preferred_location_ * fields_.size() +\n         (other.preferred_location_ * other.fields_.size())) /\n        (fields_.size() + other.fields_.size());\n    fields_.insert(fields_.end(), other.fields_.begin(), other.fields_.end());\n  }\n\n  void SetPreferredLocation(float location) { preferred_location_ = location; }\n  const vector<const FieldDescriptor*>& fields() const { return fields_; }\n\n  // FieldGroup objects sort by their preferred location.\n  bool operator<(const FieldGroup& other) const {\n    return preferred_location_ < other.preferred_location_;\n  }\n\n private:\n  // \"preferred_location_\" is an estimate of where this group should go in the\n  // final list of fields.  We compute this by taking the average index of each\n  // field in this group in the original ordering of fields.  This is very\n  // approximate, but should put this group close to where its member fields\n  // originally went.\n  float preferred_location_;\n  vector<const FieldDescriptor*> fields_;\n  // We rely on the default copy constructor and operator= so this type can be\n  // used in a vector.\n};\n\n// Reorder 'fields' so that if the fields are output into a c++ class in the new\n// order, the alignment padding is minimized.  We try to do this while keeping\n// each field as close as possible to its original position so that we don't\n// reduce cache locality much for function that access each field in order.\nvoid OptimizePadding(vector<const FieldDescriptor*>* fields) {\n  // First divide fields into those that align to 1 byte, 4 bytes or 8 bytes.\n  vector<FieldGroup> aligned_to_1, aligned_to_4, aligned_to_8;\n  for (int i = 0; i < fields->size(); ++i) {\n    switch (EstimateAlignmentSize((*fields)[i])) {\n      case 1: aligned_to_1.push_back(FieldGroup(i, (*fields)[i])); break;\n      case 4: aligned_to_4.push_back(FieldGroup(i, (*fields)[i])); break;\n      case 8: aligned_to_8.push_back(FieldGroup(i, (*fields)[i])); break;\n      default:\n        GOOGLE_LOG(FATAL) << \"Unknown alignment size.\";\n    }\n  }\n\n  // Now group fields aligned to 1 byte into sets of 4, and treat those like a\n  // single field aligned to 4 bytes.\n  for (int i = 0; i < aligned_to_1.size(); i += 4) {\n    FieldGroup field_group;\n    for (int j = i; j < aligned_to_1.size() && j < i + 4; ++j) {\n      field_group.Append(aligned_to_1[j]);\n    }\n    aligned_to_4.push_back(field_group);\n  }\n  // Sort by preferred location to keep fields as close to their original\n  // location as possible.\n  sort(aligned_to_4.begin(), aligned_to_4.end());\n\n  // Now group fields aligned to 4 bytes (or the 4-field groups created above)\n  // into pairs, and treat those like a single field aligned to 8 bytes.\n  for (int i = 0; i < aligned_to_4.size(); i += 2) {\n    FieldGroup field_group;\n    for (int j = i; j < aligned_to_4.size() && j < i + 2; ++j) {\n      field_group.Append(aligned_to_4[j]);\n    }\n    if (i == aligned_to_4.size() - 1) {\n      // Move incomplete 4-byte block to the end.\n      field_group.SetPreferredLocation(fields->size() + 1);\n    }\n    aligned_to_8.push_back(field_group);\n  }\n  // Sort by preferred location to keep fields as close to their original\n  // location as possible.\n  sort(aligned_to_8.begin(), aligned_to_8.end());\n\n  // Now pull out all the FieldDescriptors in order.\n  fields->clear();\n  for (int i = 0; i < aligned_to_8.size(); ++i) {\n    fields->insert(fields->end(),\n                   aligned_to_8[i].fields().begin(),\n                   aligned_to_8[i].fields().end());\n  }\n}\n\n}\n\n// ===================================================================\n\nMessageGenerator::MessageGenerator(const Descriptor* descriptor,\n                                   const string& dllexport_decl)\n  : descriptor_(descriptor),\n    classname_(ClassName(descriptor, false)),\n    dllexport_decl_(dllexport_decl),\n    field_generators_(descriptor),\n    nested_generators_(new scoped_ptr<MessageGenerator>[\n      descriptor->nested_type_count()]),\n    enum_generators_(new scoped_ptr<EnumGenerator>[\n      descriptor->enum_type_count()]),\n    extension_generators_(new scoped_ptr<ExtensionGenerator>[\n      descriptor->extension_count()]) {\n\n  for (int i = 0; i < descriptor->nested_type_count(); i++) {\n    nested_generators_[i].reset(\n      new MessageGenerator(descriptor->nested_type(i), dllexport_decl));\n  }\n\n  for (int i = 0; i < descriptor->enum_type_count(); i++) {\n    enum_generators_[i].reset(\n      new EnumGenerator(descriptor->enum_type(i), dllexport_decl));\n  }\n\n  for (int i = 0; i < descriptor->extension_count(); i++) {\n    extension_generators_[i].reset(\n      new ExtensionGenerator(descriptor->extension(i), dllexport_decl));\n  }\n}\n\nMessageGenerator::~MessageGenerator() {}\n\nvoid MessageGenerator::\nGenerateForwardDeclaration(io::Printer* printer) {\n  printer->Print(\"class $classname$;\\n\",\n                 \"classname\", classname_);\n\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    nested_generators_[i]->GenerateForwardDeclaration(printer);\n  }\n}\n\nvoid MessageGenerator::\nGenerateEnumDefinitions(io::Printer* printer) {\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    nested_generators_[i]->GenerateEnumDefinitions(printer);\n  }\n\n  for (int i = 0; i < descriptor_->enum_type_count(); i++) {\n    enum_generators_[i]->GenerateDefinition(printer);\n  }\n}\n\nvoid MessageGenerator::\nGenerateGetEnumDescriptorSpecializations(io::Printer* printer) {\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    nested_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);\n  }\n  for (int i = 0; i < descriptor_->enum_type_count(); i++) {\n    enum_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);\n  }\n}\n\nvoid MessageGenerator::\nGenerateFieldAccessorDeclarations(io::Printer* printer) {\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n\n    PrintFieldComment(printer, field);\n\n    map<string, string> vars;\n    SetCommonFieldVariables(field, &vars);\n    vars[\"constant_name\"] = FieldConstantName(field);\n\n    if (field->is_repeated()) {\n      printer->Print(vars, \"inline int $name$_size() const$deprecation$;\\n\");\n    } else {\n      printer->Print(vars, \"inline bool has_$name$() const$deprecation$;\\n\");\n    }\n\n    printer->Print(vars, \"inline void clear_$name$()$deprecation$;\\n\");\n    printer->Print(vars, \"static const int $constant_name$ = $number$;\\n\");\n\n    // Generate type-specific accessor declarations.\n    field_generators_.get(field).GenerateAccessorDeclarations(printer);\n\n    printer->Print(\"\\n\");\n  }\n\n  if (descriptor_->extension_range_count() > 0) {\n    // Generate accessors for extensions.  We just call a macro located in\n    // extension_set.h since the accessors about 80 lines of static code.\n    printer->Print(\n      \"GOOGLE_PROTOBUF_EXTENSION_ACCESSORS($classname$)\\n\",\n      \"classname\", classname_);\n  }\n}\n\nvoid MessageGenerator::\nGenerateFieldAccessorDefinitions(io::Printer* printer) {\n  printer->Print(\"// $classname$\\n\\n\", \"classname\", classname_);\n\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n\n    PrintFieldComment(printer, field);\n\n    map<string, string> vars;\n    SetCommonFieldVariables(field, &vars);\n\n    // Generate has_$name$() or $name$_size().\n    if (field->is_repeated()) {\n      printer->Print(vars,\n        \"inline int $classname$::$name$_size() const {\\n\"\n        \"  return $name$_.size();\\n\"\n        \"}\\n\");\n    } else {\n      // Singular field.\n      char buffer[kFastToBufferSize];\n      vars[\"has_array_index\"] = SimpleItoa(field->index() / 32);\n      vars[\"has_mask\"] = FastHex32ToBuffer(1u << (field->index() % 32), buffer);\n      printer->Print(vars,\n        \"inline bool $classname$::has_$name$() const {\\n\"\n        \"  return (_has_bits_[$has_array_index$] & 0x$has_mask$u) != 0;\\n\"\n        \"}\\n\"\n        \"inline void $classname$::set_has_$name$() {\\n\"\n        \"  _has_bits_[$has_array_index$] |= 0x$has_mask$u;\\n\"\n        \"}\\n\"\n        \"inline void $classname$::clear_has_$name$() {\\n\"\n        \"  _has_bits_[$has_array_index$] &= ~0x$has_mask$u;\\n\"\n        \"}\\n\"\n        );\n    }\n\n    // Generate clear_$name$()\n    printer->Print(vars,\n      \"inline void $classname$::clear_$name$() {\\n\");\n\n    printer->Indent();\n    field_generators_.get(field).GenerateClearingCode(printer);\n    printer->Outdent();\n\n    if (!field->is_repeated()) {\n      printer->Print(vars,\n                     \"  clear_has_$name$();\\n\");\n    }\n\n    printer->Print(\"}\\n\");\n\n    // Generate type-specific accessors.\n    field_generators_.get(field).GenerateInlineAccessorDefinitions(printer);\n\n    printer->Print(\"\\n\");\n  }\n}\n\nvoid MessageGenerator::\nGenerateClassDefinition(io::Printer* printer) {\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    nested_generators_[i]->GenerateClassDefinition(printer);\n    printer->Print(\"\\n\");\n    printer->Print(kThinSeparator);\n    printer->Print(\"\\n\");\n  }\n\n  map<string, string> vars;\n  vars[\"classname\"] = classname_;\n  vars[\"field_count\"] = SimpleItoa(descriptor_->field_count());\n  if (dllexport_decl_.empty()) {\n    vars[\"dllexport\"] = \"\";\n  } else {\n    vars[\"dllexport\"] = dllexport_decl_ + \" \";\n  }\n  vars[\"superclass\"] = SuperClassName(descriptor_);\n\n  printer->Print(vars,\n    \"class $dllexport$$classname$ : public $superclass$ {\\n\"\n    \" public:\\n\");\n  printer->Indent();\n\n  printer->Print(vars,\n    \"$classname$();\\n\"\n    \"virtual ~$classname$();\\n\"\n    \"\\n\"\n    \"$classname$(const $classname$& from);\\n\"\n    \"\\n\"\n    \"inline $classname$& operator=(const $classname$& from) {\\n\"\n    \"  CopyFrom(from);\\n\"\n    \"  return *this;\\n\"\n    \"}\\n\"\n    \"\\n\");\n\n  if (HasUnknownFields(descriptor_->file())) {\n    printer->Print(\n      \"inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\\n\"\n      \"  return _unknown_fields_;\\n\"\n      \"}\\n\"\n      \"\\n\"\n      \"inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\\n\"\n      \"  return &_unknown_fields_;\\n\"\n      \"}\\n\"\n      \"\\n\");\n  }\n\n  // Only generate this member if it's not disabled.\n  if (HasDescriptorMethods(descriptor_->file()) &&\n      !descriptor_->options().no_standard_descriptor_accessor()) {\n    printer->Print(vars,\n      \"static const ::google::protobuf::Descriptor* descriptor();\\n\");\n  }\n\n  printer->Print(vars,\n    \"static const $classname$& default_instance();\\n\"\n    \"\\n\");\n\n\n  printer->Print(vars,\n    \"void Swap($classname$* other);\\n\"\n    \"\\n\"\n    \"// implements Message ----------------------------------------------\\n\"\n    \"\\n\"\n    \"$classname$* New() const;\\n\");\n\n  if (HasGeneratedMethods(descriptor_->file())) {\n    if (HasDescriptorMethods(descriptor_->file())) {\n      printer->Print(vars,\n        \"void CopyFrom(const ::google::protobuf::Message& from);\\n\"\n        \"void MergeFrom(const ::google::protobuf::Message& from);\\n\");\n    } else {\n      printer->Print(vars,\n        \"void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from);\\n\");\n    }\n\n    printer->Print(vars,\n      \"void CopyFrom(const $classname$& from);\\n\"\n      \"void MergeFrom(const $classname$& from);\\n\"\n      \"void Clear();\\n\"\n      \"bool IsInitialized() const;\\n\"\n      \"\\n\"\n      \"int ByteSize() const;\\n\"\n      \"bool MergePartialFromCodedStream(\\n\"\n      \"    ::google::protobuf::io::CodedInputStream* input);\\n\"\n      \"void SerializeWithCachedSizes(\\n\"\n      \"    ::google::protobuf::io::CodedOutputStream* output) const;\\n\");\n    if (HasFastArraySerialization(descriptor_->file())) {\n      printer->Print(\n        \"::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\\n\");\n    }\n  }\n\n  printer->Print(vars,\n    \"int GetCachedSize() const { return _cached_size_; }\\n\"\n    \"private:\\n\"\n    \"void SharedCtor();\\n\"\n    \"void SharedDtor();\\n\"\n    \"void SetCachedSize(int size) const;\\n\"\n    \"public:\\n\"\n    \"\\n\");\n\n  if (HasDescriptorMethods(descriptor_->file())) {\n    printer->Print(\n      \"::google::protobuf::Metadata GetMetadata() const;\\n\"\n      \"\\n\");\n  } else {\n    printer->Print(\n      \"::std::string GetTypeName() const;\\n\"\n      \"\\n\");\n  }\n\n  printer->Print(\n    \"// nested types ----------------------------------------------------\\n\"\n    \"\\n\");\n\n  // Import all nested message classes into this class's scope with typedefs.\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    const Descriptor* nested_type = descriptor_->nested_type(i);\n    printer->Print(\"typedef $nested_full_name$ $nested_name$;\\n\",\n                   \"nested_name\", nested_type->name(),\n                   \"nested_full_name\", ClassName(nested_type, false));\n  }\n\n  if (descriptor_->nested_type_count() > 0) {\n    printer->Print(\"\\n\");\n  }\n\n  // Import all nested enums and their values into this class's scope with\n  // typedefs and constants.\n  for (int i = 0; i < descriptor_->enum_type_count(); i++) {\n    enum_generators_[i]->GenerateSymbolImports(printer);\n    printer->Print(\"\\n\");\n  }\n\n  printer->Print(\n    \"// accessors -------------------------------------------------------\\n\"\n    \"\\n\");\n\n  // Generate accessor methods for all fields.\n  GenerateFieldAccessorDeclarations(printer);\n\n  // Declare extension identifiers.\n  for (int i = 0; i < descriptor_->extension_count(); i++) {\n    extension_generators_[i]->GenerateDeclaration(printer);\n  }\n\n\n  printer->Print(\n    \"// @@protoc_insertion_point(class_scope:$full_name$)\\n\",\n    \"full_name\", descriptor_->full_name());\n\n  // Generate private members.\n  printer->Outdent();\n  printer->Print(\" private:\\n\");\n  printer->Indent();\n\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    if (!descriptor_->field(i)->is_repeated()) {\n      printer->Print(\n        \"inline void set_has_$name$();\\n\",\n        \"name\", FieldName(descriptor_->field(i)));\n      printer->Print(\n        \"inline void clear_has_$name$();\\n\",\n        \"name\", FieldName(descriptor_->field(i)));\n    }\n  }\n  printer->Print(\"\\n\");\n\n  // To minimize padding, data members are divided into three sections:\n  // (1) members assumed to align to 8 bytes\n  // (2) members corresponding to message fields, re-ordered to optimize\n  //     alignment.\n  // (3) members assumed to align to 4 bytes.\n\n  // Members assumed to align to 8 bytes:\n\n  if (descriptor_->extension_range_count() > 0) {\n    printer->Print(\n      \"::google::protobuf::internal::ExtensionSet _extensions_;\\n\"\n      \"\\n\");\n  }\n\n  if (HasUnknownFields(descriptor_->file())) {\n    printer->Print(\n      \"::google::protobuf::UnknownFieldSet _unknown_fields_;\\n\"\n      \"\\n\");\n  }\n\n  // Field members:\n\n  vector<const FieldDescriptor*> fields;\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    fields.push_back(descriptor_->field(i));\n  }\n  OptimizePadding(&fields);\n  for (int i = 0; i < fields.size(); ++i) {\n    field_generators_.get(fields[i]).GeneratePrivateMembers(printer);\n  }\n\n  // Members assumed to align to 4 bytes:\n\n  // TODO(kenton):  Make _cached_size_ an atomic<int> when C++ supports it.\n  printer->Print(\n      \"\\n\"\n      \"mutable int _cached_size_;\\n\");\n\n  // Generate _has_bits_.\n  if (descriptor_->field_count() > 0) {\n    printer->Print(vars,\n      \"::google::protobuf::uint32 _has_bits_[($field_count$ + 31) / 32];\\n\"\n      \"\\n\");\n  } else {\n    // Zero-size arrays aren't technically allowed, and MSVC in particular\n    // doesn't like them.  We still need to declare these arrays to make\n    // other code compile.  Since this is an uncommon case, we'll just declare\n    // them with size 1 and waste some space.  Oh well.\n    printer->Print(\n      \"::google::protobuf::uint32 _has_bits_[1];\\n\"\n      \"\\n\");\n  }\n\n  // Declare AddDescriptors(), BuildDescriptors(), and ShutdownFile() as\n  // friends so that they can access private static variables like\n  // default_instance_ and reflection_.\n  printer->Print(\n    \"friend void $dllexport_decl$ $adddescriptorsname$();\\n\",\n    \"dllexport_decl\", dllexport_decl_,\n    \"adddescriptorsname\",\n      GlobalAddDescriptorsName(descriptor_->file()->name()));\n  printer->Print(\n    \"friend void $assigndescriptorsname$();\\n\"\n    \"friend void $shutdownfilename$();\\n\"\n    \"\\n\",\n    \"assigndescriptorsname\",\n      GlobalAssignDescriptorsName(descriptor_->file()->name()),\n    \"shutdownfilename\", GlobalShutdownFileName(descriptor_->file()->name()));\n\n  printer->Print(\n    \"void InitAsDefaultInstance();\\n\"\n    \"static $classname$* default_instance_;\\n\",\n    \"classname\", classname_);\n\n  printer->Outdent();\n  printer->Print(vars, \"};\");\n}\n\nvoid MessageGenerator::\nGenerateInlineMethods(io::Printer* printer) {\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    nested_generators_[i]->GenerateInlineMethods(printer);\n    printer->Print(kThinSeparator);\n    printer->Print(\"\\n\");\n  }\n\n  GenerateFieldAccessorDefinitions(printer);\n}\n\nvoid MessageGenerator::\nGenerateDescriptorDeclarations(io::Printer* printer) {\n  printer->Print(\n    \"const ::google::protobuf::Descriptor* $name$_descriptor_ = NULL;\\n\"\n    \"const ::google::protobuf::internal::GeneratedMessageReflection*\\n\"\n    \"  $name$_reflection_ = NULL;\\n\",\n    \"name\", classname_);\n\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    nested_generators_[i]->GenerateDescriptorDeclarations(printer);\n  }\n\n  for (int i = 0; i < descriptor_->enum_type_count(); i++) {\n    printer->Print(\n      \"const ::google::protobuf::EnumDescriptor* $name$_descriptor_ = NULL;\\n\",\n      \"name\", ClassName(descriptor_->enum_type(i), false));\n  }\n}\n\nvoid MessageGenerator::\nGenerateDescriptorInitializer(io::Printer* printer, int index) {\n  // TODO(kenton):  Passing the index to this method is redundant; just use\n  //   descriptor_->index() instead.\n  map<string, string> vars;\n  vars[\"classname\"] = classname_;\n  vars[\"index\"] = SimpleItoa(index);\n\n  // Obtain the descriptor from the parent's descriptor.\n  if (descriptor_->containing_type() == NULL) {\n    printer->Print(vars,\n      \"$classname$_descriptor_ = file->message_type($index$);\\n\");\n  } else {\n    vars[\"parent\"] = ClassName(descriptor_->containing_type(), false);\n    printer->Print(vars,\n      \"$classname$_descriptor_ = \"\n        \"$parent$_descriptor_->nested_type($index$);\\n\");\n  }\n\n  // Generate the offsets.\n  GenerateOffsets(printer);\n\n  // Construct the reflection object.\n  printer->Print(vars,\n    \"$classname$_reflection_ =\\n\"\n    \"  new ::google::protobuf::internal::GeneratedMessageReflection(\\n\"\n    \"    $classname$_descriptor_,\\n\"\n    \"    $classname$::default_instance_,\\n\"\n    \"    $classname$_offsets_,\\n\"\n    \"    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, _has_bits_[0]),\\n\"\n    \"    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(\"\n      \"$classname$, _unknown_fields_),\\n\");\n  if (descriptor_->extension_range_count() > 0) {\n    printer->Print(vars,\n      \"    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(\"\n        \"$classname$, _extensions_),\\n\");\n  } else {\n    // No extensions.\n    printer->Print(vars,\n      \"    -1,\\n\");\n  }\n  printer->Print(vars,\n    \"    ::google::protobuf::DescriptorPool::generated_pool(),\\n\"\n    \"    ::google::protobuf::MessageFactory::generated_factory(),\\n\"\n    \"    sizeof($classname$));\\n\");\n\n  // Handle nested types.\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    nested_generators_[i]->GenerateDescriptorInitializer(printer, i);\n  }\n\n  for (int i = 0; i < descriptor_->enum_type_count(); i++) {\n    enum_generators_[i]->GenerateDescriptorInitializer(printer, i);\n  }\n}\n\nvoid MessageGenerator::\nGenerateTypeRegistrations(io::Printer* printer) {\n  // Register this message type with the message factory.\n  printer->Print(\n    \"::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\\n\"\n    \"  $classname$_descriptor_, &$classname$::default_instance());\\n\",\n    \"classname\", classname_);\n\n  // Handle nested types.\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    nested_generators_[i]->GenerateTypeRegistrations(printer);\n  }\n}\n\nvoid MessageGenerator::\nGenerateDefaultInstanceAllocator(io::Printer* printer) {\n  // Construct the default instance.  We can't call InitAsDefaultInstance() yet\n  // because we need to make sure all default instances that this one might\n  // depend on are constructed first.\n  printer->Print(\n    \"$classname$::default_instance_ = new $classname$();\\n\",\n    \"classname\", classname_);\n\n  // Handle nested types.\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    nested_generators_[i]->GenerateDefaultInstanceAllocator(printer);\n  }\n\n}\n\nvoid MessageGenerator::\nGenerateDefaultInstanceInitializer(io::Printer* printer) {\n  printer->Print(\n    \"$classname$::default_instance_->InitAsDefaultInstance();\\n\",\n    \"classname\", classname_);\n\n  // Register extensions.\n  for (int i = 0; i < descriptor_->extension_count(); i++) {\n    extension_generators_[i]->GenerateRegistration(printer);\n  }\n\n  // Handle nested types.\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    nested_generators_[i]->GenerateDefaultInstanceInitializer(printer);\n  }\n}\n\nvoid MessageGenerator::\nGenerateShutdownCode(io::Printer* printer) {\n  printer->Print(\n    \"delete $classname$::default_instance_;\\n\",\n    \"classname\", classname_);\n\n  if (HasDescriptorMethods(descriptor_->file())) {\n    printer->Print(\n      \"delete $classname$_reflection_;\\n\",\n      \"classname\", classname_);\n  }\n\n  // Handle nested types.\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    nested_generators_[i]->GenerateShutdownCode(printer);\n  }\n}\n\nvoid MessageGenerator::\nGenerateClassMethods(io::Printer* printer) {\n  for (int i = 0; i < descriptor_->enum_type_count(); i++) {\n    enum_generators_[i]->GenerateMethods(printer);\n  }\n\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    nested_generators_[i]->GenerateClassMethods(printer);\n    printer->Print(\"\\n\");\n    printer->Print(kThinSeparator);\n    printer->Print(\"\\n\");\n  }\n\n  // Generate non-inline field definitions.\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    field_generators_.get(descriptor_->field(i))\n                     .GenerateNonInlineAccessorDefinitions(printer);\n  }\n\n  // Generate field number constants.\n  printer->Print(\"#ifndef _MSC_VER\\n\");\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor *field = descriptor_->field(i);\n    printer->Print(\n      \"const int $classname$::$constant_name$;\\n\",\n      \"classname\", ClassName(FieldScope(field), false),\n      \"constant_name\", FieldConstantName(field));\n  }\n  printer->Print(\n    \"#endif  // !_MSC_VER\\n\"\n    \"\\n\");\n\n  // Define extension identifiers.\n  for (int i = 0; i < descriptor_->extension_count(); i++) {\n    extension_generators_[i]->GenerateDefinition(printer);\n  }\n\n  GenerateStructors(printer);\n  printer->Print(\"\\n\");\n\n  if (HasGeneratedMethods(descriptor_->file())) {\n    GenerateClear(printer);\n    printer->Print(\"\\n\");\n\n    GenerateMergeFromCodedStream(printer);\n    printer->Print(\"\\n\");\n\n    GenerateSerializeWithCachedSizes(printer);\n    printer->Print(\"\\n\");\n\n    if (HasFastArraySerialization(descriptor_->file())) {\n      GenerateSerializeWithCachedSizesToArray(printer);\n      printer->Print(\"\\n\");\n    }\n\n    GenerateByteSize(printer);\n    printer->Print(\"\\n\");\n\n    GenerateMergeFrom(printer);\n    printer->Print(\"\\n\");\n\n    GenerateCopyFrom(printer);\n    printer->Print(\"\\n\");\n\n    GenerateIsInitialized(printer);\n    printer->Print(\"\\n\");\n  }\n\n  GenerateSwap(printer);\n  printer->Print(\"\\n\");\n\n  if (HasDescriptorMethods(descriptor_->file())) {\n    printer->Print(\n      \"::google::protobuf::Metadata $classname$::GetMetadata() const {\\n\"\n      \"  protobuf_AssignDescriptorsOnce();\\n\"\n      \"  ::google::protobuf::Metadata metadata;\\n\"\n      \"  metadata.descriptor = $classname$_descriptor_;\\n\"\n      \"  metadata.reflection = $classname$_reflection_;\\n\"\n      \"  return metadata;\\n\"\n      \"}\\n\"\n      \"\\n\",\n      \"classname\", classname_);\n  } else {\n    printer->Print(\n      \"::std::string $classname$::GetTypeName() const {\\n\"\n      \"  return \\\"$type_name$\\\";\\n\"\n      \"}\\n\"\n      \"\\n\",\n      \"classname\", classname_,\n      \"type_name\", descriptor_->full_name());\n  }\n\n}\n\nvoid MessageGenerator::\nGenerateOffsets(io::Printer* printer) {\n  printer->Print(\n    \"static const int $classname$_offsets_[$field_count$] = {\\n\",\n    \"classname\", classname_,\n    \"field_count\", SimpleItoa(max(1, descriptor_->field_count())));\n  printer->Indent();\n\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n    printer->Print(\n      \"GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, $name$_),\\n\",\n      \"classname\", classname_,\n      \"name\", FieldName(field));\n  }\n\n  printer->Outdent();\n  printer->Print(\"};\\n\");\n}\n\nvoid MessageGenerator::\nGenerateSharedConstructorCode(io::Printer* printer) {\n  printer->Print(\n    \"void $classname$::SharedCtor() {\\n\",\n    \"classname\", classname_);\n  printer->Indent();\n\n  printer->Print(\n    \"_cached_size_ = 0;\\n\");\n\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    field_generators_.get(descriptor_->field(i))\n                     .GenerateConstructorCode(printer);\n  }\n\n  printer->Print(\n    \"::memset(_has_bits_, 0, sizeof(_has_bits_));\\n\");\n\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n}\n\nvoid MessageGenerator::\nGenerateSharedDestructorCode(io::Printer* printer) {\n  printer->Print(\n    \"void $classname$::SharedDtor() {\\n\",\n    \"classname\", classname_);\n  printer->Indent();\n  // Write the destructors for each field.\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    field_generators_.get(descriptor_->field(i))\n                     .GenerateDestructorCode(printer);\n  }\n\n  printer->Print(\n    \"if (this != default_instance_) {\\n\");\n\n  // We need to delete all embedded messages.\n  // TODO(kenton):  If we make unset messages point at default instances\n  //   instead of NULL, then it would make sense to move this code into\n  //   MessageFieldGenerator::GenerateDestructorCode().\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n\n    if (!field->is_repeated() &&\n        field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      printer->Print(\"  delete $name$_;\\n\",\n                     \"name\", FieldName(field));\n    }\n  }\n\n  printer->Outdent();\n  printer->Print(\n    \"  }\\n\"\n    \"}\\n\"\n    \"\\n\");\n}\n\nvoid MessageGenerator::\nGenerateStructors(io::Printer* printer) {\n  string superclass = SuperClassName(descriptor_);\n\n  // Generate the default constructor.\n  printer->Print(\n    \"$classname$::$classname$()\\n\"\n    \"  : $superclass$() {\\n\"\n    \"  SharedCtor();\\n\"\n    \"}\\n\",\n    \"classname\", classname_,\n    \"superclass\", superclass);\n\n  printer->Print(\n    \"\\n\"\n    \"void $classname$::InitAsDefaultInstance() {\\n\",\n    \"classname\", classname_);\n\n  // The default instance needs all of its embedded message pointers\n  // cross-linked to other default instances.  We can't do this initialization\n  // in the constructor because some other default instances may not have been\n  // constructed yet at that time.\n  // TODO(kenton):  Maybe all message fields (even for non-default messages)\n  //   should be initialized to point at default instances rather than NULL?\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n\n    if (!field->is_repeated() &&\n        field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      printer->Print(\n          \"  $name$_ = const_cast< $type$*>(&$type$::default_instance());\\n\",\n          \"name\", FieldName(field),\n          \"type\", FieldMessageTypeName(field));\n    }\n  }\n  printer->Print(\n    \"}\\n\"\n    \"\\n\");\n\n  // Generate the copy constructor.\n  printer->Print(\n    \"$classname$::$classname$(const $classname$& from)\\n\"\n    \"  : $superclass$() {\\n\"\n    \"  SharedCtor();\\n\"\n    \"  MergeFrom(from);\\n\"\n    \"}\\n\"\n    \"\\n\",\n    \"classname\", classname_,\n    \"superclass\", superclass);\n\n  // Generate the shared constructor code.\n  GenerateSharedConstructorCode(printer);\n\n  // Generate the destructor.\n  printer->Print(\n    \"$classname$::~$classname$() {\\n\"\n    \"  SharedDtor();\\n\"\n    \"}\\n\"\n    \"\\n\",\n    \"classname\", classname_);\n\n  // Generate the shared destructor code.\n  GenerateSharedDestructorCode(printer);\n\n  // Generate SetCachedSize.\n  printer->Print(\n    \"void $classname$::SetCachedSize(int size) const {\\n\"\n    \"  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\\n\"\n    \"  _cached_size_ = size;\\n\"\n    \"  GOOGLE_SAFE_CONCURRENT_WRITES_END();\\n\"\n    \"}\\n\",\n    \"classname\", classname_);\n\n  // Only generate this member if it's not disabled.\n  if (HasDescriptorMethods(descriptor_->file()) &&\n      !descriptor_->options().no_standard_descriptor_accessor()) {\n    printer->Print(\n      \"const ::google::protobuf::Descriptor* $classname$::descriptor() {\\n\"\n      \"  protobuf_AssignDescriptorsOnce();\\n\"\n      \"  return $classname$_descriptor_;\\n\"\n      \"}\\n\"\n      \"\\n\",\n      \"classname\", classname_,\n      \"adddescriptorsname\",\n      GlobalAddDescriptorsName(descriptor_->file()->name()));\n  }\n\n  printer->Print(\n    \"const $classname$& $classname$::default_instance() {\\n\"\n    \"  if (default_instance_ == NULL) $adddescriptorsname$();\"\n    \"  return *default_instance_;\\n\"\n    \"}\\n\"\n    \"\\n\"\n    \"$classname$* $classname$::default_instance_ = NULL;\\n\"\n    \"\\n\"\n    \"$classname$* $classname$::New() const {\\n\"\n    \"  return new $classname$;\\n\"\n    \"}\\n\",\n    \"classname\", classname_,\n    \"adddescriptorsname\",\n    GlobalAddDescriptorsName(descriptor_->file()->name()));\n\n}\n\nvoid MessageGenerator::\nGenerateClear(io::Printer* printer) {\n  printer->Print(\"void $classname$::Clear() {\\n\",\n                 \"classname\", classname_);\n  printer->Indent();\n\n  int last_index = -1;\n\n  if (descriptor_->extension_range_count() > 0) {\n    printer->Print(\"_extensions_.Clear();\\n\");\n  }\n\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n\n    if (!field->is_repeated()) {\n      // We can use the fact that _has_bits_ is a giant bitfield to our\n      // advantage:  We can check up to 32 bits at a time for equality to\n      // zero, and skip the whole range if so.  This can improve the speed\n      // of Clear() for messages which contain a very large number of\n      // optional fields of which only a few are used at a time.  Here,\n      // we've chosen to check 8 bits at a time rather than 32.\n      if (i / 8 != last_index / 8 || last_index < 0) {\n        if (last_index >= 0) {\n          printer->Outdent();\n          printer->Print(\"}\\n\");\n        }\n        printer->Print(\n          \"if (_has_bits_[$index$ / 32] & (0xffu << ($index$ % 32))) {\\n\",\n          \"index\", SimpleItoa(field->index()));\n        printer->Indent();\n      }\n      last_index = i;\n\n      // It's faster to just overwrite primitive types, but we should\n      // only clear strings and messages if they were set.\n      // TODO(kenton):  Let the CppFieldGenerator decide this somehow.\n      bool should_check_bit =\n        field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE ||\n        field->cpp_type() == FieldDescriptor::CPPTYPE_STRING;\n\n      if (should_check_bit) {\n        printer->Print(\n          \"if (has_$name$()) {\\n\",\n          \"name\", FieldName(field));\n        printer->Indent();\n      }\n\n      field_generators_.get(field).GenerateClearingCode(printer);\n\n      if (should_check_bit) {\n        printer->Outdent();\n        printer->Print(\"}\\n\");\n      }\n    }\n  }\n\n  if (last_index >= 0) {\n    printer->Outdent();\n    printer->Print(\"}\\n\");\n  }\n\n  // Repeated fields don't use _has_bits_ so we clear them in a separate\n  // pass.\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n\n    if (field->is_repeated()) {\n      field_generators_.get(field).GenerateClearingCode(printer);\n    }\n  }\n\n  printer->Print(\n    \"::memset(_has_bits_, 0, sizeof(_has_bits_));\\n\");\n\n  if (HasUnknownFields(descriptor_->file())) {\n    printer->Print(\n      \"mutable_unknown_fields()->Clear();\\n\");\n  }\n\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nvoid MessageGenerator::\nGenerateSwap(io::Printer* printer) {\n  // Generate the Swap member function.\n  printer->Print(\"void $classname$::Swap($classname$* other) {\\n\",\n                 \"classname\", classname_);\n  printer->Indent();\n  printer->Print(\"if (other != this) {\\n\");\n  printer->Indent();\n\n  if (HasGeneratedMethods(descriptor_->file())) {\n    for (int i = 0; i < descriptor_->field_count(); i++) {\n      const FieldDescriptor* field = descriptor_->field(i);\n      field_generators_.get(field).GenerateSwappingCode(printer);\n    }\n\n    for (int i = 0; i < (descriptor_->field_count() + 31) / 32; ++i) {\n      printer->Print(\"std::swap(_has_bits_[$i$], other->_has_bits_[$i$]);\\n\",\n                     \"i\", SimpleItoa(i));\n    }\n\n    if (HasUnknownFields(descriptor_->file())) {\n      printer->Print(\"_unknown_fields_.Swap(&other->_unknown_fields_);\\n\");\n    }\n    printer->Print(\"std::swap(_cached_size_, other->_cached_size_);\\n\");\n    if (descriptor_->extension_range_count() > 0) {\n      printer->Print(\"_extensions_.Swap(&other->_extensions_);\\n\");\n    }\n  } else {\n    printer->Print(\"GetReflection()->Swap(this, other);\");\n  }\n\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nvoid MessageGenerator::\nGenerateMergeFrom(io::Printer* printer) {\n  if (HasDescriptorMethods(descriptor_->file())) {\n    // Generate the generalized MergeFrom (aka that which takes in the Message\n    // base class as a parameter).\n    printer->Print(\n      \"void $classname$::MergeFrom(const ::google::protobuf::Message& from) {\\n\"\n      \"  GOOGLE_CHECK_NE(&from, this);\\n\",\n      \"classname\", classname_);\n    printer->Indent();\n\n    // Cast the message to the proper type. If we find that the message is\n    // *not* of the proper type, we can still call Merge via the reflection\n    // system, as the GOOGLE_CHECK above ensured that we have the same descriptor\n    // for each message.\n    printer->Print(\n      \"const $classname$* source =\\n\"\n      \"  ::google::protobuf::internal::dynamic_cast_if_available<const $classname$*>(\\n\"\n      \"    &from);\\n\"\n      \"if (source == NULL) {\\n\"\n      \"  ::google::protobuf::internal::ReflectionOps::Merge(from, this);\\n\"\n      \"} else {\\n\"\n      \"  MergeFrom(*source);\\n\"\n      \"}\\n\",\n      \"classname\", classname_);\n\n    printer->Outdent();\n    printer->Print(\"}\\n\\n\");\n  } else {\n    // Generate CheckTypeAndMergeFrom().\n    printer->Print(\n      \"void $classname$::CheckTypeAndMergeFrom(\\n\"\n      \"    const ::google::protobuf::MessageLite& from) {\\n\"\n      \"  MergeFrom(*::google::protobuf::down_cast<const $classname$*>(&from));\\n\"\n      \"}\\n\"\n      \"\\n\",\n      \"classname\", classname_);\n  }\n\n  // Generate the class-specific MergeFrom, which avoids the GOOGLE_CHECK and cast.\n  printer->Print(\n    \"void $classname$::MergeFrom(const $classname$& from) {\\n\"\n    \"  GOOGLE_CHECK_NE(&from, this);\\n\",\n    \"classname\", classname_);\n  printer->Indent();\n\n  // Merge Repeated fields. These fields do not require a\n  // check as we can simply iterate over them.\n  for (int i = 0; i < descriptor_->field_count(); ++i) {\n    const FieldDescriptor* field = descriptor_->field(i);\n\n    if (field->is_repeated()) {\n      field_generators_.get(field).GenerateMergingCode(printer);\n    }\n  }\n\n  // Merge Optional and Required fields (after a _has_bit check).\n  int last_index = -1;\n\n  for (int i = 0; i < descriptor_->field_count(); ++i) {\n    const FieldDescriptor* field = descriptor_->field(i);\n\n    if (!field->is_repeated()) {\n      // See above in GenerateClear for an explanation of this.\n      if (i / 8 != last_index / 8 || last_index < 0) {\n        if (last_index >= 0) {\n          printer->Outdent();\n          printer->Print(\"}\\n\");\n        }\n        printer->Print(\n          \"if (from._has_bits_[$index$ / 32] & (0xffu << ($index$ % 32))) {\\n\",\n          \"index\", SimpleItoa(field->index()));\n        printer->Indent();\n      }\n\n      last_index = i;\n\n      printer->Print(\n        \"if (from.has_$name$()) {\\n\",\n        \"name\", FieldName(field));\n      printer->Indent();\n\n      field_generators_.get(field).GenerateMergingCode(printer);\n\n      printer->Outdent();\n      printer->Print(\"}\\n\");\n    }\n  }\n\n  if (last_index >= 0) {\n    printer->Outdent();\n    printer->Print(\"}\\n\");\n  }\n\n  if (descriptor_->extension_range_count() > 0) {\n    printer->Print(\"_extensions_.MergeFrom(from._extensions_);\\n\");\n  }\n\n  if (HasUnknownFields(descriptor_->file())) {\n    printer->Print(\n      \"mutable_unknown_fields()->MergeFrom(from.unknown_fields());\\n\");\n  }\n\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nvoid MessageGenerator::\nGenerateCopyFrom(io::Printer* printer) {\n  if (HasDescriptorMethods(descriptor_->file())) {\n    // Generate the generalized CopyFrom (aka that which takes in the Message\n    // base class as a parameter).\n    printer->Print(\n      \"void $classname$::CopyFrom(const ::google::protobuf::Message& from) {\\n\",\n      \"classname\", classname_);\n    printer->Indent();\n\n    printer->Print(\n      \"if (&from == this) return;\\n\"\n      \"Clear();\\n\"\n      \"MergeFrom(from);\\n\");\n\n    printer->Outdent();\n    printer->Print(\"}\\n\\n\");\n  }\n\n  // Generate the class-specific CopyFrom.\n  printer->Print(\n    \"void $classname$::CopyFrom(const $classname$& from) {\\n\",\n    \"classname\", classname_);\n  printer->Indent();\n\n  printer->Print(\n    \"if (&from == this) return;\\n\"\n    \"Clear();\\n\"\n    \"MergeFrom(from);\\n\");\n\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nvoid MessageGenerator::\nGenerateMergeFromCodedStream(io::Printer* printer) {\n  if (descriptor_->options().message_set_wire_format()) {\n    // Special-case MessageSet.\n    printer->Print(\n      \"bool $classname$::MergePartialFromCodedStream(\\n\"\n      \"    ::google::protobuf::io::CodedInputStream* input) {\\n\"\n      \"  return _extensions_.ParseMessageSet(input, default_instance_,\\n\"\n      \"                                      mutable_unknown_fields());\\n\"\n      \"}\\n\",\n      \"classname\", classname_);\n    return;\n  }\n\n  printer->Print(\n    \"bool $classname$::MergePartialFromCodedStream(\\n\"\n    \"    ::google::protobuf::io::CodedInputStream* input) {\\n\"\n    \"#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\\n\"\n    \"  ::google::protobuf::uint32 tag;\\n\"\n    \"  while ((tag = input->ReadTag()) != 0) {\\n\",\n    \"classname\", classname_);\n\n  printer->Indent();\n  printer->Indent();\n\n  if (descriptor_->field_count() > 0) {\n    // We don't even want to print the switch() if we have no fields because\n    // MSVC dislikes switch() statements that contain only a default value.\n\n    // Note:  If we just switched on the tag rather than the field number, we\n    // could avoid the need for the if() to check the wire type at the beginning\n    // of each case.  However, this is actually a bit slower in practice as it\n    // creates a jump table that is 8x larger and sparser, and meanwhile the\n    // if()s are highly predictable.\n    printer->Print(\n      \"switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\\n\");\n\n    printer->Indent();\n\n    scoped_array<const FieldDescriptor*> ordered_fields(\n      SortFieldsByNumber(descriptor_));\n\n    for (int i = 0; i < descriptor_->field_count(); i++) {\n      const FieldDescriptor* field = ordered_fields[i];\n\n      PrintFieldComment(printer, field);\n\n      printer->Print(\n        \"case $number$: {\\n\",\n        \"number\", SimpleItoa(field->number()));\n      printer->Indent();\n      const FieldGenerator& field_generator = field_generators_.get(field);\n\n      // Emit code to parse the common, expected case.\n      printer->Print(\n        \"if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\\n\"\n        \"    ::google::protobuf::internal::WireFormatLite::WIRETYPE_$wiretype$) {\\n\",\n        \"wiretype\", kWireTypeNames[WireFormat::WireTypeForField(field)]);\n\n      if (i > 0 || (field->is_repeated() && !field->options().packed())) {\n        printer->Print(\n          \" parse_$name$:\\n\",\n          \"name\", field->name());\n      }\n\n      printer->Indent();\n      if (field->options().packed()) {\n        field_generator.GenerateMergeFromCodedStreamWithPacking(printer);\n      } else {\n        field_generator.GenerateMergeFromCodedStream(printer);\n      }\n      printer->Outdent();\n\n      // Emit code to parse unexpectedly packed or unpacked values.\n      if (field->is_packable() && field->options().packed()) {\n        printer->Print(\n          \"} else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag)\\n\"\n          \"           == ::google::protobuf::internal::WireFormatLite::\\n\"\n          \"              WIRETYPE_$wiretype$) {\\n\",\n          \"wiretype\",\n          kWireTypeNames[WireFormat::WireTypeForFieldType(field->type())]);\n        printer->Indent();\n        field_generator.GenerateMergeFromCodedStream(printer);\n        printer->Outdent();\n      } else if (field->is_packable() && !field->options().packed()) {\n        printer->Print(\n          \"} else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag)\\n\"\n          \"           == ::google::protobuf::internal::WireFormatLite::\\n\"\n          \"              WIRETYPE_LENGTH_DELIMITED) {\\n\");\n        printer->Indent();\n        field_generator.GenerateMergeFromCodedStreamWithPacking(printer);\n        printer->Outdent();\n      }\n\n      printer->Print(\n        \"} else {\\n\"\n        \"  goto handle_uninterpreted;\\n\"\n        \"}\\n\");\n\n      // switch() is slow since it can't be predicted well.  Insert some if()s\n      // here that attempt to predict the next tag.\n      if (field->is_repeated() && !field->options().packed()) {\n        // Expect repeats of this field.\n        printer->Print(\n          \"if (input->ExpectTag($tag$)) goto parse_$name$;\\n\",\n          \"tag\", SimpleItoa(WireFormat::MakeTag(field)),\n          \"name\", field->name());\n      }\n\n      if (i + 1 < descriptor_->field_count()) {\n        // Expect the next field in order.\n        const FieldDescriptor* next_field = ordered_fields[i + 1];\n        printer->Print(\n          \"if (input->ExpectTag($next_tag$)) goto parse_$next_name$;\\n\",\n          \"next_tag\", SimpleItoa(WireFormat::MakeTag(next_field)),\n          \"next_name\", next_field->name());\n      } else {\n        // Expect EOF.\n        // TODO(kenton):  Expect group end-tag?\n        printer->Print(\n          \"if (input->ExpectAtEnd()) return true;\\n\");\n      }\n\n      printer->Print(\n        \"break;\\n\");\n\n      printer->Outdent();\n      printer->Print(\"}\\n\\n\");\n    }\n\n    printer->Print(\n      \"default: {\\n\"\n      \"handle_uninterpreted:\\n\");\n    printer->Indent();\n  }\n\n  // Is this an end-group tag?  If so, this must be the end of the message.\n  printer->Print(\n    \"if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\\n\"\n    \"    ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\\n\"\n    \"  return true;\\n\"\n    \"}\\n\");\n\n  // Handle extension ranges.\n  if (descriptor_->extension_range_count() > 0) {\n    printer->Print(\n      \"if (\");\n    for (int i = 0; i < descriptor_->extension_range_count(); i++) {\n      const Descriptor::ExtensionRange* range =\n        descriptor_->extension_range(i);\n      if (i > 0) printer->Print(\" ||\\n    \");\n\n      uint32 start_tag = WireFormatLite::MakeTag(\n        range->start, static_cast<WireFormatLite::WireType>(0));\n      uint32 end_tag = WireFormatLite::MakeTag(\n        range->end, static_cast<WireFormatLite::WireType>(0));\n\n      if (range->end > FieldDescriptor::kMaxNumber) {\n        printer->Print(\n          \"($start$u <= tag)\",\n          \"start\", SimpleItoa(start_tag));\n      } else {\n        printer->Print(\n          \"($start$u <= tag && tag < $end$u)\",\n          \"start\", SimpleItoa(start_tag),\n          \"end\", SimpleItoa(end_tag));\n      }\n    }\n    printer->Print(\") {\\n\");\n    if (HasUnknownFields(descriptor_->file())) {\n      printer->Print(\n        \"  DO_(_extensions_.ParseField(tag, input, default_instance_,\\n\"\n        \"                              mutable_unknown_fields()));\\n\");\n    } else {\n      printer->Print(\n        \"  DO_(_extensions_.ParseField(tag, input, default_instance_));\\n\");\n    }\n    printer->Print(\n      \"  continue;\\n\"\n      \"}\\n\");\n  }\n\n  // We really don't recognize this tag.  Skip it.\n  if (HasUnknownFields(descriptor_->file())) {\n    printer->Print(\n      \"DO_(::google::protobuf::internal::WireFormat::SkipField(\\n\"\n      \"      input, tag, mutable_unknown_fields()));\\n\");\n  } else {\n    printer->Print(\n      \"DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));\\n\");\n  }\n\n  if (descriptor_->field_count() > 0) {\n    printer->Print(\"break;\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\");    // default:\n    printer->Outdent();\n    printer->Print(\"}\\n\");    // switch\n  }\n\n  printer->Outdent();\n  printer->Outdent();\n  printer->Print(\n    \"  }\\n\"                   // while\n    \"  return true;\\n\"\n    \"#undef DO_\\n\"\n    \"}\\n\");\n}\n\nvoid MessageGenerator::GenerateSerializeOneField(\n    io::Printer* printer, const FieldDescriptor* field, bool to_array) {\n  PrintFieldComment(printer, field);\n\n  if (!field->is_repeated()) {\n    printer->Print(\n      \"if (has_$name$()) {\\n\",\n      \"name\", FieldName(field));\n    printer->Indent();\n  }\n\n  if (to_array) {\n    field_generators_.get(field).GenerateSerializeWithCachedSizesToArray(\n        printer);\n  } else {\n    field_generators_.get(field).GenerateSerializeWithCachedSizes(printer);\n  }\n\n  if (!field->is_repeated()) {\n    printer->Outdent();\n    printer->Print(\"}\\n\");\n  }\n  printer->Print(\"\\n\");\n}\n\nvoid MessageGenerator::GenerateSerializeOneExtensionRange(\n    io::Printer* printer, const Descriptor::ExtensionRange* range,\n    bool to_array) {\n  map<string, string> vars;\n  vars[\"start\"] = SimpleItoa(range->start);\n  vars[\"end\"] = SimpleItoa(range->end);\n  printer->Print(vars,\n    \"// Extension range [$start$, $end$)\\n\");\n  if (to_array) {\n    printer->Print(vars,\n      \"target = _extensions_.SerializeWithCachedSizesToArray(\\n\"\n      \"    $start$, $end$, target);\\n\\n\");\n  } else {\n    printer->Print(vars,\n      \"_extensions_.SerializeWithCachedSizes(\\n\"\n      \"    $start$, $end$, output);\\n\\n\");\n  }\n}\n\nvoid MessageGenerator::\nGenerateSerializeWithCachedSizes(io::Printer* printer) {\n  if (descriptor_->options().message_set_wire_format()) {\n    // Special-case MessageSet.\n    printer->Print(\n      \"void $classname$::SerializeWithCachedSizes(\\n\"\n      \"    ::google::protobuf::io::CodedOutputStream* output) const {\\n\"\n      \"  _extensions_.SerializeMessageSetWithCachedSizes(output);\\n\",\n      \"classname\", classname_);\n    if (HasUnknownFields(descriptor_->file())) {\n      printer->Print(\n        \"  ::google::protobuf::internal::WireFormat::SerializeUnknownMessageSetItems(\\n\"\n        \"      unknown_fields(), output);\\n\");\n    }\n    printer->Print(\n      \"}\\n\");\n    return;\n  }\n\n  printer->Print(\n    \"void $classname$::SerializeWithCachedSizes(\\n\"\n    \"    ::google::protobuf::io::CodedOutputStream* output) const {\\n\",\n    \"classname\", classname_);\n  printer->Indent();\n\n  GenerateSerializeWithCachedSizesBody(printer, false);\n\n  printer->Outdent();\n  printer->Print(\n    \"}\\n\");\n}\n\nvoid MessageGenerator::\nGenerateSerializeWithCachedSizesToArray(io::Printer* printer) {\n  if (descriptor_->options().message_set_wire_format()) {\n    // Special-case MessageSet.\n    printer->Print(\n      \"::google::protobuf::uint8* $classname$::SerializeWithCachedSizesToArray(\\n\"\n      \"    ::google::protobuf::uint8* target) const {\\n\"\n      \"  target =\\n\"\n      \"      _extensions_.SerializeMessageSetWithCachedSizesToArray(target);\\n\",\n      \"classname\", classname_);\n    if (HasUnknownFields(descriptor_->file())) {\n      printer->Print(\n        \"  target = ::google::protobuf::internal::WireFormat::\\n\"\n        \"             SerializeUnknownMessageSetItemsToArray(\\n\"\n        \"               unknown_fields(), target);\\n\");\n    }\n    printer->Print(\n      \"  return target;\\n\"\n      \"}\\n\");\n    return;\n  }\n\n  printer->Print(\n    \"::google::protobuf::uint8* $classname$::SerializeWithCachedSizesToArray(\\n\"\n    \"    ::google::protobuf::uint8* target) const {\\n\",\n    \"classname\", classname_);\n  printer->Indent();\n\n  GenerateSerializeWithCachedSizesBody(printer, true);\n\n  printer->Outdent();\n  printer->Print(\n    \"  return target;\\n\"\n    \"}\\n\");\n}\n\nvoid MessageGenerator::\nGenerateSerializeWithCachedSizesBody(io::Printer* printer, bool to_array) {\n  scoped_array<const FieldDescriptor*> ordered_fields(\n    SortFieldsByNumber(descriptor_));\n\n  vector<const Descriptor::ExtensionRange*> sorted_extensions;\n  for (int i = 0; i < descriptor_->extension_range_count(); ++i) {\n    sorted_extensions.push_back(descriptor_->extension_range(i));\n  }\n  sort(sorted_extensions.begin(), sorted_extensions.end(),\n       ExtensionRangeSorter());\n\n  // Merge the fields and the extension ranges, both sorted by field number.\n  int i, j;\n  for (i = 0, j = 0;\n       i < descriptor_->field_count() || j < sorted_extensions.size();\n       ) {\n    if (i == descriptor_->field_count()) {\n      GenerateSerializeOneExtensionRange(printer,\n                                         sorted_extensions[j++],\n                                         to_array);\n    } else if (j == sorted_extensions.size()) {\n      GenerateSerializeOneField(printer, ordered_fields[i++], to_array);\n    } else if (ordered_fields[i]->number() < sorted_extensions[j]->start) {\n      GenerateSerializeOneField(printer, ordered_fields[i++], to_array);\n    } else {\n      GenerateSerializeOneExtensionRange(printer,\n                                         sorted_extensions[j++],\n                                         to_array);\n    }\n  }\n\n  if (HasUnknownFields(descriptor_->file())) {\n    printer->Print(\"if (!unknown_fields().empty()) {\\n\");\n    printer->Indent();\n    if (to_array) {\n      printer->Print(\n        \"target = \"\n            \"::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\\n\"\n        \"    unknown_fields(), target);\\n\");\n    } else {\n      printer->Print(\n        \"::google::protobuf::internal::WireFormat::SerializeUnknownFields(\\n\"\n        \"    unknown_fields(), output);\\n\");\n    }\n    printer->Outdent();\n\n    printer->Print(\n      \"}\\n\");\n  }\n}\n\nvoid MessageGenerator::\nGenerateByteSize(io::Printer* printer) {\n  if (descriptor_->options().message_set_wire_format()) {\n    // Special-case MessageSet.\n    printer->Print(\n      \"int $classname$::ByteSize() const {\\n\"\n      \"  int total_size = _extensions_.MessageSetByteSize();\\n\",\n      \"classname\", classname_);\n    if (HasUnknownFields(descriptor_->file())) {\n      printer->Print(\n        \"  total_size += ::google::protobuf::internal::WireFormat::\\n\"\n        \"      ComputeUnknownMessageSetItemsSize(unknown_fields());\\n\");\n    }\n    printer->Print(\n      \"  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\\n\"\n      \"  _cached_size_ = total_size;\\n\"\n      \"  GOOGLE_SAFE_CONCURRENT_WRITES_END();\\n\"\n      \"  return total_size;\\n\"\n      \"}\\n\");\n    return;\n  }\n\n  printer->Print(\n    \"int $classname$::ByteSize() const {\\n\",\n    \"classname\", classname_);\n  printer->Indent();\n  printer->Print(\n    \"int total_size = 0;\\n\"\n    \"\\n\");\n\n  int last_index = -1;\n\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n\n    if (!field->is_repeated()) {\n      // See above in GenerateClear for an explanation of this.\n      // TODO(kenton):  Share code?  Unclear how to do so without\n      //   over-engineering.\n      if ((i / 8) != (last_index / 8) ||\n          last_index < 0) {\n        if (last_index >= 0) {\n          printer->Outdent();\n          printer->Print(\"}\\n\");\n        }\n        printer->Print(\n          \"if (_has_bits_[$index$ / 32] & (0xffu << ($index$ % 32))) {\\n\",\n          \"index\", SimpleItoa(field->index()));\n        printer->Indent();\n      }\n      last_index = i;\n\n      PrintFieldComment(printer, field);\n\n      printer->Print(\n        \"if (has_$name$()) {\\n\",\n        \"name\", FieldName(field));\n      printer->Indent();\n\n      field_generators_.get(field).GenerateByteSize(printer);\n\n      printer->Outdent();\n      printer->Print(\n        \"}\\n\"\n        \"\\n\");\n    }\n  }\n\n  if (last_index >= 0) {\n    printer->Outdent();\n    printer->Print(\"}\\n\");\n  }\n\n  // Repeated fields don't use _has_bits_ so we count them in a separate\n  // pass.\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n\n    if (field->is_repeated()) {\n      PrintFieldComment(printer, field);\n      field_generators_.get(field).GenerateByteSize(printer);\n      printer->Print(\"\\n\");\n    }\n  }\n\n  if (descriptor_->extension_range_count() > 0) {\n    printer->Print(\n      \"total_size += _extensions_.ByteSize();\\n\"\n      \"\\n\");\n  }\n\n  if (HasUnknownFields(descriptor_->file())) {\n    printer->Print(\"if (!unknown_fields().empty()) {\\n\");\n    printer->Indent();\n    printer->Print(\n      \"total_size +=\\n\"\n      \"  ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\\n\"\n      \"    unknown_fields());\\n\");\n    printer->Outdent();\n    printer->Print(\"}\\n\");\n  }\n\n  // We update _cached_size_ even though this is a const method.  In theory,\n  // this is not thread-compatible, because concurrent writes have undefined\n  // results.  In practice, since any concurrent writes will be writing the\n  // exact same value, it works on all common processors.  In a future version\n  // of C++, _cached_size_ should be made into an atomic<int>.\n  printer->Print(\n    \"GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\\n\"\n    \"_cached_size_ = total_size;\\n\"\n    \"GOOGLE_SAFE_CONCURRENT_WRITES_END();\\n\"\n    \"return total_size;\\n\");\n\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nvoid MessageGenerator::\nGenerateIsInitialized(io::Printer* printer) {\n  printer->Print(\n    \"bool $classname$::IsInitialized() const {\\n\",\n    \"classname\", classname_);\n  printer->Indent();\n\n  // Check that all required fields in this message are set.  We can do this\n  // most efficiently by checking 32 \"has bits\" at a time.\n  int has_bits_array_size = (descriptor_->field_count() + 31) / 32;\n  for (int i = 0; i < has_bits_array_size; i++) {\n    uint32 mask = 0;\n    for (int bit = 0; bit < 32; bit++) {\n      int index = i * 32 + bit;\n      if (index >= descriptor_->field_count()) break;\n      const FieldDescriptor* field = descriptor_->field(index);\n\n      if (field->is_required()) {\n        mask |= 1 << bit;\n      }\n    }\n\n    if (mask != 0) {\n      char buffer[kFastToBufferSize];\n      printer->Print(\n        \"if ((_has_bits_[$i$] & 0x$mask$) != 0x$mask$) return false;\\n\",\n        \"i\", SimpleItoa(i),\n        \"mask\", FastHex32ToBuffer(mask, buffer));\n    }\n  }\n\n  // Now check that all embedded messages are initialized.\n  printer->Print(\"\\n\");\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&\n        HasRequiredFields(field->message_type())) {\n      if (field->is_repeated()) {\n        printer->Print(\n          \"for (int i = 0; i < $name$_size(); i++) {\\n\"\n          \"  if (!this->$name$(i).IsInitialized()) return false;\\n\"\n          \"}\\n\",\n          \"name\", FieldName(field));\n      } else {\n        printer->Print(\n          \"if (has_$name$()) {\\n\"\n          \"  if (!this->$name$().IsInitialized()) return false;\\n\"\n          \"}\\n\",\n          \"name\", FieldName(field));\n      }\n    }\n  }\n\n  if (descriptor_->extension_range_count() > 0) {\n    printer->Print(\n      \"\\n\"\n      \"if (!_extensions_.IsInitialized()) return false;\");\n  }\n\n  printer->Outdent();\n  printer->Print(\n    \"  return true;\\n\"\n    \"}\\n\");\n}\n\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__\n#define GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__\n\n#include <string>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/compiler/cpp/cpp_field.h>\n\nnamespace google {\nnamespace protobuf {\n  namespace io {\n    class Printer;             // printer.h\n  }\n}\n\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nclass EnumGenerator;           // enum.h\nclass ExtensionGenerator;      // extension.h\n\nclass MessageGenerator {\n public:\n  // See generator.cc for the meaning of dllexport_decl.\n  explicit MessageGenerator(const Descriptor* descriptor,\n                            const string& dllexport_decl);\n  ~MessageGenerator();\n\n  // Header stuff.\n\n  // Generate foward declarations for this class and all its nested types.\n  void GenerateForwardDeclaration(io::Printer* printer);\n\n  // Generate definitions of all nested enums (must come before class\n  // definitions because those classes use the enums definitions).\n  void GenerateEnumDefinitions(io::Printer* printer);\n\n  // Generate specializations of GetEnumDescriptor<MyEnum>().\n  // Precondition: in ::google::protobuf namespace.\n  void GenerateGetEnumDescriptorSpecializations(io::Printer* printer);\n\n  // Generate definitions for this class and all its nested types.\n  void GenerateClassDefinition(io::Printer* printer);\n\n  // Generate definitions of inline methods (placed at the end of the header\n  // file).\n  void GenerateInlineMethods(io::Printer* printer);\n\n  // Source file stuff.\n\n  // Generate code which declares all the global descriptor pointers which\n  // will be initialized by the methods below.\n  void GenerateDescriptorDeclarations(io::Printer* printer);\n\n  // Generate code that initializes the global variable storing the message's\n  // descriptor.\n  void GenerateDescriptorInitializer(io::Printer* printer, int index);\n\n  // Generate code that calls MessageFactory::InternalRegisterGeneratedMessage()\n  // for all types.\n  void GenerateTypeRegistrations(io::Printer* printer);\n\n  // Generates code that allocates the message's default instance.\n  void GenerateDefaultInstanceAllocator(io::Printer* printer);\n\n  // Generates code that initializes the message's default instance.  This\n  // is separate from allocating because all default instances must be\n  // allocated before any can be initialized.\n  void GenerateDefaultInstanceInitializer(io::Printer* printer);\n\n  // Generates code that should be run when ShutdownProtobufLibrary() is called,\n  // to delete all dynamically-allocated objects.\n  void GenerateShutdownCode(io::Printer* printer);\n\n  // Generate all non-inline methods for this class.\n  void GenerateClassMethods(io::Printer* printer);\n\n private:\n  // Generate declarations and definitions of accessors for fields.\n  void GenerateFieldAccessorDeclarations(io::Printer* printer);\n  void GenerateFieldAccessorDefinitions(io::Printer* printer);\n\n  // Generate the field offsets array.\n  void GenerateOffsets(io::Printer* printer);\n\n  // Generate constructors and destructor.\n  void GenerateStructors(io::Printer* printer);\n\n  // The compiler typically generates multiple copies of each constructor and\n  // destructor: http://gcc.gnu.org/bugs.html#nonbugs_cxx\n  // Placing common code in a separate method reduces the generated code size.\n  //\n  // Generate the shared constructor code.\n  void GenerateSharedConstructorCode(io::Printer* printer);\n  // Generate the shared destructor code.\n  void GenerateSharedDestructorCode(io::Printer* printer);\n\n  // Generate standard Message methods.\n  void GenerateClear(io::Printer* printer);\n  void GenerateMergeFromCodedStream(io::Printer* printer);\n  void GenerateSerializeWithCachedSizes(io::Printer* printer);\n  void GenerateSerializeWithCachedSizesToArray(io::Printer* printer);\n  void GenerateSerializeWithCachedSizesBody(io::Printer* printer,\n                                            bool to_array);\n  void GenerateByteSize(io::Printer* printer);\n  void GenerateMergeFrom(io::Printer* printer);\n  void GenerateCopyFrom(io::Printer* printer);\n  void GenerateSwap(io::Printer* printer);\n  void GenerateIsInitialized(io::Printer* printer);\n\n  // Helpers for GenerateSerializeWithCachedSizes().\n  void GenerateSerializeOneField(io::Printer* printer,\n                                 const FieldDescriptor* field,\n                                 bool unbounded);\n  void GenerateSerializeOneExtensionRange(\n      io::Printer* printer, const Descriptor::ExtensionRange* range,\n      bool unbounded);\n\n\n  const Descriptor* descriptor_;\n  string classname_;\n  string dllexport_decl_;\n  FieldGeneratorMap field_generators_;\n  scoped_array<scoped_ptr<MessageGenerator> > nested_generators_;\n  scoped_array<scoped_ptr<EnumGenerator> > enum_generators_;\n  scoped_array<scoped_ptr<ExtensionGenerator> > extension_generators_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageGenerator);\n};\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/cpp/cpp_message_field.h>\n#include <google/protobuf/compiler/cpp/cpp_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nnamespace {\n\nvoid SetMessageVariables(const FieldDescriptor* descriptor,\n                         map<string, string>* variables) {\n  SetCommonFieldVariables(descriptor, variables);\n  (*variables)[\"type\"] = FieldMessageTypeName(descriptor);\n  (*variables)[\"stream_writer\"] = (*variables)[\"declared_type\"] +\n      (HasFastArraySerialization(descriptor->message_type()->file()) ?\n       \"MaybeToArray\" :\n       \"\");\n}\n\n}  // namespace\n\n// ===================================================================\n\nMessageFieldGenerator::\nMessageFieldGenerator(const FieldDescriptor* descriptor)\n  : descriptor_(descriptor) {\n  SetMessageVariables(descriptor, &variables_);\n}\n\nMessageFieldGenerator::~MessageFieldGenerator() {}\n\nvoid MessageFieldGenerator::\nGeneratePrivateMembers(io::Printer* printer) const {\n  printer->Print(variables_, \"$type$* $name$_;\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateAccessorDeclarations(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline const $type$& $name$() const$deprecation$;\\n\"\n    \"inline $type$* mutable_$name$()$deprecation$;\\n\"\n    \"inline $type$* release_$name$()$deprecation$;\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateInlineAccessorDefinitions(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline const $type$& $classname$::$name$() const {\\n\"\n    \"  return $name$_ != NULL ? *$name$_ : *default_instance_->$name$_;\\n\"\n    \"}\\n\"\n    \"inline $type$* $classname$::mutable_$name$() {\\n\"\n    \"  set_has_$name$();\\n\"\n    \"  if ($name$_ == NULL) $name$_ = new $type$;\\n\"\n    \"  return $name$_;\\n\"\n    \"}\\n\"\n    \"inline $type$* $classname$::release_$name$() {\\n\"\n    \"  clear_has_$name$();\\n\"\n    \"  $type$* temp = $name$_;\\n\"\n    \"  $name$_ = NULL;\\n\"\n    \"  return temp;\\n\"\n    \"}\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateClearingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if ($name$_ != NULL) $name$_->$type$::Clear();\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"mutable_$name$()->$type$::MergeFrom(from.$name$());\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateSwappingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"std::swap($name$_, other->$name$_);\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateConstructorCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_ = NULL;\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateMergeFromCodedStream(io::Printer* printer) const {\n  if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) {\n    printer->Print(variables_,\n      \"DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\\n\"\n      \"     input, mutable_$name$()));\\n\");\n  } else {\n    printer->Print(variables_,\n      \"DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\\n\"\n      \"      $number$, input, mutable_$name$()));\\n\");\n  }\n}\n\nvoid MessageFieldGenerator::\nGenerateSerializeWithCachedSizes(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\\n\"\n    \"  $number$, this->$name$(), output);\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"target = ::google::protobuf::internal::WireFormatLite::\\n\"\n    \"  Write$declared_type$NoVirtualToArray(\\n\"\n    \"    $number$, this->$name$(), target);\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateByteSize(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"total_size += $tag_size$ +\\n\"\n    \"  ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\\n\"\n    \"    this->$name$());\\n\");\n}\n\n// ===================================================================\n\nRepeatedMessageFieldGenerator::\nRepeatedMessageFieldGenerator(const FieldDescriptor* descriptor)\n  : descriptor_(descriptor) {\n  SetMessageVariables(descriptor, &variables_);\n}\n\nRepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {}\n\nvoid RepeatedMessageFieldGenerator::\nGeneratePrivateMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"::google::protobuf::RepeatedPtrField< $type$ > $name$_;\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateAccessorDeclarations(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline const $type$& $name$(int index) const$deprecation$;\\n\"\n    \"inline $type$* mutable_$name$(int index)$deprecation$;\\n\"\n    \"inline $type$* add_$name$()$deprecation$;\\n\");\n  printer->Print(variables_,\n    \"inline const ::google::protobuf::RepeatedPtrField< $type$ >&\\n\"\n    \"    $name$() const$deprecation$;\\n\"\n    \"inline ::google::protobuf::RepeatedPtrField< $type$ >*\\n\"\n    \"    mutable_$name$()$deprecation$;\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateInlineAccessorDefinitions(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline const $type$& $classname$::$name$(int index) const {\\n\"\n    \"  return $name$_.Get(index);\\n\"\n    \"}\\n\"\n    \"inline $type$* $classname$::mutable_$name$(int index) {\\n\"\n    \"  return $name$_.Mutable(index);\\n\"\n    \"}\\n\"\n    \"inline $type$* $classname$::add_$name$() {\\n\"\n    \"  return $name$_.Add();\\n\"\n    \"}\\n\");\n  printer->Print(variables_,\n    \"inline const ::google::protobuf::RepeatedPtrField< $type$ >&\\n\"\n    \"$classname$::$name$() const {\\n\"\n    \"  return $name$_;\\n\"\n    \"}\\n\"\n    \"inline ::google::protobuf::RepeatedPtrField< $type$ >*\\n\"\n    \"$classname$::mutable_$name$() {\\n\"\n    \"  return &$name$_;\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateClearingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_.Clear();\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_.MergeFrom(from.$name$_);\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateSwappingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_.Swap(&other->$name$_);\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateConstructorCode(io::Printer* printer) const {\n  // Not needed for repeated fields.\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateMergeFromCodedStream(io::Printer* printer) const {\n  if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) {\n    printer->Print(variables_,\n      \"DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\\n\"\n      \"      input, add_$name$()));\\n\");\n  } else {\n    printer->Print(variables_,\n      \"DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\\n\"\n      \"      $number$, input, add_$name$()));\\n\");\n  }\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateSerializeWithCachedSizes(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"for (int i = 0; i < this->$name$_size(); i++) {\\n\"\n    \"  ::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\\n\"\n    \"    $number$, this->$name$(i), output);\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"for (int i = 0; i < this->$name$_size(); i++) {\\n\"\n    \"  target = ::google::protobuf::internal::WireFormatLite::\\n\"\n    \"    Write$declared_type$NoVirtualToArray(\\n\"\n    \"      $number$, this->$name$(i), target);\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateByteSize(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"total_size += $tag_size$ * this->$name$_size();\\n\"\n    \"for (int i = 0; i < this->$name$_size(); i++) {\\n\"\n    \"  total_size +=\\n\"\n    \"    ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\\n\"\n    \"      this->$name$(i));\\n\"\n    \"}\\n\");\n}\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_FIELD_H__\n#define GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_FIELD_H__\n\n#include <map>\n#include <string>\n#include <google/protobuf/compiler/cpp/cpp_field.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nclass MessageFieldGenerator : public FieldGenerator {\n public:\n  explicit MessageFieldGenerator(const FieldDescriptor* descriptor);\n  ~MessageFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  void GeneratePrivateMembers(io::Printer* printer) const;\n  void GenerateAccessorDeclarations(io::Printer* printer) const;\n  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;\n  void GenerateClearingCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateSwappingCode(io::Printer* printer) const;\n  void GenerateConstructorCode(io::Printer* printer) const;\n  void GenerateMergeFromCodedStream(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizes(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;\n  void GenerateByteSize(io::Printer* printer) const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator);\n};\n\nclass RepeatedMessageFieldGenerator : public FieldGenerator {\n public:\n  explicit RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor);\n  ~RepeatedMessageFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  void GeneratePrivateMembers(io::Printer* printer) const;\n  void GenerateAccessorDeclarations(io::Printer* printer) const;\n  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;\n  void GenerateClearingCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateSwappingCode(io::Printer* printer) const;\n  void GenerateConstructorCode(io::Printer* printer) const;\n  void GenerateMergeFromCodedStream(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizes(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;\n  void GenerateByteSize(io::Printer* printer) const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator);\n};\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_FIELD_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// TODO(kenton):  Share code with the versions of this test in other languages?\n//   It seemed like parameterizing it would add more complexity than it is\n//   worth.\n\n#include <google/protobuf/compiler/cpp/cpp_generator.h>\n#include <google/protobuf/compiler/command_line_interface.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/io/printer.h>\n\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n#include <google/protobuf/testing/file.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\nnamespace {\n\nclass TestGenerator : public CodeGenerator {\n public:\n  TestGenerator() {}\n  ~TestGenerator() {}\n\n  virtual bool Generate(const FileDescriptor* file,\n                        const string& parameter,\n                        GeneratorContext* context,\n                        string* error) const {\n    TryInsert(\"test.pb.h\", \"includes\", context);\n    TryInsert(\"test.pb.h\", \"namespace_scope\", context);\n    TryInsert(\"test.pb.h\", \"global_scope\", context);\n    TryInsert(\"test.pb.h\", \"class_scope:foo.Bar\", context);\n    TryInsert(\"test.pb.h\", \"class_scope:foo.Bar.Baz\", context);\n\n    TryInsert(\"test.pb.cc\", \"includes\", context);\n    TryInsert(\"test.pb.cc\", \"namespace_scope\", context);\n    TryInsert(\"test.pb.cc\", \"global_scope\", context);\n    return true;\n  }\n\n  void TryInsert(const string& filename, const string& insertion_point,\n                 GeneratorContext* context) const {\n    scoped_ptr<io::ZeroCopyOutputStream> output(\n      context->OpenForInsert(filename, insertion_point));\n    io::Printer printer(output.get(), '$');\n    printer.Print(\"// inserted $name$\\n\", \"name\", insertion_point);\n  }\n};\n\n// This test verifies that all the expected insertion points exist.  It does\n// not verify that they are correctly-placed; that would require actually\n// compiling the output which is a bit more than I care to do for this test.\nTEST(CppPluginTest, PluginTest) {\n  File::WriteStringToFileOrDie(\n      \"syntax = \\\"proto2\\\";\\n\"\n      \"package foo;\\n\"\n      \"message Bar {\\n\"\n      \"  message Baz {}\\n\"\n      \"}\\n\",\n      TestTempDir() + \"/test.proto\");\n\n  google::protobuf::compiler::CommandLineInterface cli;\n  cli.SetInputsAreProtoPathRelative(true);\n\n  CppGenerator cpp_generator;\n  TestGenerator test_generator;\n  cli.RegisterGenerator(\"--cpp_out\", &cpp_generator, \"\");\n  cli.RegisterGenerator(\"--test_out\", &test_generator, \"\");\n\n  string proto_path = \"-I\" + TestTempDir();\n  string cpp_out = \"--cpp_out=\" + TestTempDir();\n  string test_out = \"--test_out=\" + TestTempDir();\n\n  const char* argv[] = {\n    \"protoc\",\n    proto_path.c_str(),\n    cpp_out.c_str(),\n    test_out.c_str(),\n    \"test.proto\"\n  };\n\n  EXPECT_EQ(0, cli.Run(5, argv));\n}\n\n}  // namespace\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/cpp/cpp_primitive_field.h>\n#include <google/protobuf/compiler/cpp/cpp_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nusing internal::WireFormatLite;\n\nnamespace {\n\n// For encodings with fixed sizes, returns that size in bytes.  Otherwise\n// returns -1.\nint FixedSize(FieldDescriptor::Type type) {\n  switch (type) {\n    case FieldDescriptor::TYPE_INT32   : return -1;\n    case FieldDescriptor::TYPE_INT64   : return -1;\n    case FieldDescriptor::TYPE_UINT32  : return -1;\n    case FieldDescriptor::TYPE_UINT64  : return -1;\n    case FieldDescriptor::TYPE_SINT32  : return -1;\n    case FieldDescriptor::TYPE_SINT64  : return -1;\n    case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size;\n    case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size;\n    case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size;\n    case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size;\n    case FieldDescriptor::TYPE_FLOAT   : return WireFormatLite::kFloatSize;\n    case FieldDescriptor::TYPE_DOUBLE  : return WireFormatLite::kDoubleSize;\n\n    case FieldDescriptor::TYPE_BOOL    : return WireFormatLite::kBoolSize;\n    case FieldDescriptor::TYPE_ENUM    : return -1;\n\n    case FieldDescriptor::TYPE_STRING  : return -1;\n    case FieldDescriptor::TYPE_BYTES   : return -1;\n    case FieldDescriptor::TYPE_GROUP   : return -1;\n    case FieldDescriptor::TYPE_MESSAGE : return -1;\n\n    // No default because we want the compiler to complain if any new\n    // types are added.\n  }\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return -1;\n}\n\nvoid SetPrimitiveVariables(const FieldDescriptor* descriptor,\n                           map<string, string>* variables) {\n  SetCommonFieldVariables(descriptor, variables);\n  (*variables)[\"type\"] = PrimitiveTypeName(descriptor->cpp_type());\n  (*variables)[\"default\"] = DefaultValue(descriptor);\n  (*variables)[\"tag\"] = SimpleItoa(internal::WireFormat::MakeTag(descriptor));\n  int fixed_size = FixedSize(descriptor->type());\n  if (fixed_size != -1) {\n    (*variables)[\"fixed_size\"] = SimpleItoa(fixed_size);\n  }\n  (*variables)[\"wire_format_field_type\"] =\n      \"::google::protobuf::internal::WireFormatLite::\" + FieldDescriptorProto_Type_Name(\n          static_cast<FieldDescriptorProto_Type>(descriptor->type()));\n}\n\n}  // namespace\n\n// ===================================================================\n\nPrimitiveFieldGenerator::\nPrimitiveFieldGenerator(const FieldDescriptor* descriptor)\n  : descriptor_(descriptor) {\n  SetPrimitiveVariables(descriptor, &variables_);\n}\n\nPrimitiveFieldGenerator::~PrimitiveFieldGenerator() {}\n\nvoid PrimitiveFieldGenerator::\nGeneratePrivateMembers(io::Printer* printer) const {\n  printer->Print(variables_, \"$type$ $name$_;\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateAccessorDeclarations(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline $type$ $name$() const$deprecation$;\\n\"\n    \"inline void set_$name$($type$ value)$deprecation$;\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateInlineAccessorDefinitions(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline $type$ $classname$::$name$() const {\\n\"\n    \"  return $name$_;\\n\"\n    \"}\\n\"\n    \"inline void $classname$::set_$name$($type$ value) {\\n\"\n    \"  set_has_$name$();\\n\"\n    \"  $name$_ = value;\\n\"\n    \"}\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateClearingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_ = $default$;\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"set_$name$(from.$name$());\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateSwappingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"std::swap($name$_, other->$name$_);\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateConstructorCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_ = $default$;\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateMergeFromCodedStream(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\\n\"\n    \"         $type$, $wire_format_field_type$>(\\n\"\n    \"       input, &$name$_)));\\n\"\n    \"set_has_$name$();\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateSerializeWithCachedSizes(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"::google::protobuf::internal::WireFormatLite::Write$declared_type$(\"\n      \"$number$, this->$name$(), output);\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"target = ::google::protobuf::internal::WireFormatLite::Write$declared_type$ToArray(\"\n      \"$number$, this->$name$(), target);\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateByteSize(io::Printer* printer) const {\n  int fixed_size = FixedSize(descriptor_->type());\n  if (fixed_size == -1) {\n    printer->Print(variables_,\n      \"total_size += $tag_size$ +\\n\"\n      \"  ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\\n\"\n      \"    this->$name$());\\n\");\n  } else {\n    printer->Print(variables_,\n      \"total_size += $tag_size$ + $fixed_size$;\\n\");\n  }\n}\n\n// ===================================================================\n\nRepeatedPrimitiveFieldGenerator::\nRepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor)\n  : descriptor_(descriptor) {\n  SetPrimitiveVariables(descriptor, &variables_);\n\n  if (descriptor->options().packed()) {\n    variables_[\"packed_reader\"] = \"ReadPackedPrimitive\";\n    variables_[\"repeated_reader\"] = \"ReadRepeatedPrimitiveNoInline\";\n  } else {\n    variables_[\"packed_reader\"] = \"ReadPackedPrimitiveNoInline\";\n    variables_[\"repeated_reader\"] = \"ReadRepeatedPrimitive\";\n  }\n}\n\nRepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGeneratePrivateMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"::google::protobuf::RepeatedField< $type$ > $name$_;\\n\");\n  if (descriptor_->options().packed() && HasGeneratedMethods(descriptor_->file())) {\n    printer->Print(variables_,\n      \"mutable int _$name$_cached_byte_size_;\\n\");\n  }\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateAccessorDeclarations(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline $type$ $name$(int index) const$deprecation$;\\n\"\n    \"inline void set_$name$(int index, $type$ value)$deprecation$;\\n\"\n    \"inline void add_$name$($type$ value)$deprecation$;\\n\");\n  printer->Print(variables_,\n    \"inline const ::google::protobuf::RepeatedField< $type$ >&\\n\"\n    \"    $name$() const$deprecation$;\\n\"\n    \"inline ::google::protobuf::RepeatedField< $type$ >*\\n\"\n    \"    mutable_$name$()$deprecation$;\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateInlineAccessorDefinitions(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline $type$ $classname$::$name$(int index) const {\\n\"\n    \"  return $name$_.Get(index);\\n\"\n    \"}\\n\"\n    \"inline void $classname$::set_$name$(int index, $type$ value) {\\n\"\n    \"  $name$_.Set(index, value);\\n\"\n    \"}\\n\"\n    \"inline void $classname$::add_$name$($type$ value) {\\n\"\n    \"  $name$_.Add(value);\\n\"\n    \"}\\n\");\n  printer->Print(variables_,\n    \"inline const ::google::protobuf::RepeatedField< $type$ >&\\n\"\n    \"$classname$::$name$() const {\\n\"\n    \"  return $name$_;\\n\"\n    \"}\\n\"\n    \"inline ::google::protobuf::RepeatedField< $type$ >*\\n\"\n    \"$classname$::mutable_$name$() {\\n\"\n    \"  return &$name$_;\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateClearingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_.Clear();\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_.MergeFrom(from.$name$_);\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateSwappingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_.Swap(&other->$name$_);\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateConstructorCode(io::Printer* printer) const {\n  // Not needed for repeated fields.\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateMergeFromCodedStream(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"DO_((::google::protobuf::internal::WireFormatLite::$repeated_reader$<\\n\"\n    \"         $type$, $wire_format_field_type$>(\\n\"\n    \"       $tag_size$, $tag$, input, this->mutable_$name$())));\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"DO_((::google::protobuf::internal::WireFormatLite::$packed_reader$<\\n\"\n    \"         $type$, $wire_format_field_type$>(\\n\"\n    \"       input, this->mutable_$name$())));\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateSerializeWithCachedSizes(io::Printer* printer) const {\n  if (descriptor_->options().packed()) {\n    // Write the tag and the size.\n    printer->Print(variables_,\n      \"if (this->$name$_size() > 0) {\\n\"\n      \"  ::google::protobuf::internal::WireFormatLite::WriteTag(\"\n          \"$number$, \"\n          \"::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, \"\n          \"output);\\n\"\n      \"  output->WriteVarint32(_$name$_cached_byte_size_);\\n\"\n      \"}\\n\");\n  }\n  printer->Print(variables_,\n      \"for (int i = 0; i < this->$name$_size(); i++) {\\n\");\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"  ::google::protobuf::internal::WireFormatLite::Write$declared_type$NoTag(\\n\"\n      \"    this->$name$(i), output);\\n\");\n  } else {\n    printer->Print(variables_,\n      \"  ::google::protobuf::internal::WireFormatLite::Write$declared_type$(\\n\"\n      \"    $number$, this->$name$(i), output);\\n\");\n  }\n  printer->Print(\"}\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {\n  if (descriptor_->options().packed()) {\n    // Write the tag and the size.\n    printer->Print(variables_,\n      \"if (this->$name$_size() > 0) {\\n\"\n      \"  target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray(\\n\"\n      \"    $number$,\\n\"\n      \"    ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\\n\"\n      \"    target);\\n\"\n      \"  target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(\\n\"\n      \"    _$name$_cached_byte_size_, target);\\n\"\n      \"}\\n\");\n  }\n  printer->Print(variables_,\n      \"for (int i = 0; i < this->$name$_size(); i++) {\\n\");\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"  target = ::google::protobuf::internal::WireFormatLite::\\n\"\n      \"    Write$declared_type$NoTagToArray(this->$name$(i), target);\\n\");\n  } else {\n    printer->Print(variables_,\n      \"  target = ::google::protobuf::internal::WireFormatLite::\\n\"\n      \"    Write$declared_type$ToArray($number$, this->$name$(i), target);\\n\");\n  }\n  printer->Print(\"}\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateByteSize(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"{\\n\"\n    \"  int data_size = 0;\\n\");\n  printer->Indent();\n  int fixed_size = FixedSize(descriptor_->type());\n  if (fixed_size == -1) {\n    printer->Print(variables_,\n      \"for (int i = 0; i < this->$name$_size(); i++) {\\n\"\n      \"  data_size += ::google::protobuf::internal::WireFormatLite::\\n\"\n      \"    $declared_type$Size(this->$name$(i));\\n\"\n      \"}\\n\");\n  } else {\n    printer->Print(variables_,\n      \"data_size = $fixed_size$ * this->$name$_size();\\n\");\n  }\n\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"if (data_size > 0) {\\n\"\n      \"  total_size += $tag_size$ +\\n\"\n      \"    ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);\\n\"\n      \"}\\n\"\n      \"_$name$_cached_byte_size_ = data_size;\\n\"\n      \"total_size += data_size;\\n\");\n  } else {\n    printer->Print(variables_,\n      \"total_size += $tag_size$ * this->$name$_size() + data_size;\\n\");\n  }\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_PRIMITIVE_FIELD_H__\n#define GOOGLE_PROTOBUF_COMPILER_CPP_PRIMITIVE_FIELD_H__\n\n#include <map>\n#include <string>\n#include <google/protobuf/compiler/cpp/cpp_field.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nclass PrimitiveFieldGenerator : public FieldGenerator {\n public:\n  explicit PrimitiveFieldGenerator(const FieldDescriptor* descriptor);\n  ~PrimitiveFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  void GeneratePrivateMembers(io::Printer* printer) const;\n  void GenerateAccessorDeclarations(io::Printer* printer) const;\n  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;\n  void GenerateClearingCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateSwappingCode(io::Printer* printer) const;\n  void GenerateConstructorCode(io::Printer* printer) const;\n  void GenerateMergeFromCodedStream(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizes(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;\n  void GenerateByteSize(io::Printer* printer) const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator);\n};\n\nclass RepeatedPrimitiveFieldGenerator : public FieldGenerator {\n public:\n  explicit RepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor);\n  ~RepeatedPrimitiveFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  void GeneratePrivateMembers(io::Printer* printer) const;\n  void GenerateAccessorDeclarations(io::Printer* printer) const;\n  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;\n  void GenerateClearingCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateSwappingCode(io::Printer* printer) const;\n  void GenerateConstructorCode(io::Printer* printer) const;\n  void GenerateMergeFromCodedStream(io::Printer* printer) const;\n  void GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizes(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;\n  void GenerateByteSize(io::Printer* printer) const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPrimitiveFieldGenerator);\n};\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_PRIMITIVE_FIELD_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/cpp/cpp_service.h>\n#include <google/protobuf/compiler/cpp/cpp_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nServiceGenerator::ServiceGenerator(const ServiceDescriptor* descriptor,\n                                   const string& dllexport_decl)\n  : descriptor_(descriptor) {\n  vars_[\"classname\"] = descriptor_->name();\n  vars_[\"full_name\"] = descriptor_->full_name();\n  if (dllexport_decl.empty()) {\n    vars_[\"dllexport\"] = \"\";\n  } else {\n    vars_[\"dllexport\"] = dllexport_decl + \" \";\n  }\n}\n\nServiceGenerator::~ServiceGenerator() {}\n\nvoid ServiceGenerator::GenerateDeclarations(io::Printer* printer) {\n  // Forward-declare the stub type.\n  printer->Print(vars_,\n    \"class $classname$_Stub;\\n\"\n    \"\\n\");\n\n  GenerateInterface(printer);\n  GenerateStubDefinition(printer);\n}\n\nvoid ServiceGenerator::GenerateInterface(io::Printer* printer) {\n  printer->Print(vars_,\n    \"class $dllexport$$classname$ : public ::google::protobuf::Service {\\n\"\n    \" protected:\\n\"\n    \"  // This class should be treated as an abstract interface.\\n\"\n    \"  inline $classname$() {};\\n\"\n    \" public:\\n\"\n    \"  virtual ~$classname$();\\n\");\n  printer->Indent();\n\n  printer->Print(vars_,\n    \"\\n\"\n    \"typedef $classname$_Stub Stub;\\n\"\n    \"\\n\"\n    \"static const ::google::protobuf::ServiceDescriptor* descriptor();\\n\"\n    \"\\n\");\n\n  GenerateMethodSignatures(VIRTUAL, printer);\n\n  printer->Print(\n    \"\\n\"\n    \"// implements Service ----------------------------------------------\\n\"\n    \"\\n\"\n    \"const ::google::protobuf::ServiceDescriptor* GetDescriptor();\\n\"\n    \"void CallMethod(const ::google::protobuf::MethodDescriptor* method,\\n\"\n    \"                ::google::protobuf::RpcController* controller,\\n\"\n    \"                const ::google::protobuf::Message* request,\\n\"\n    \"                ::google::protobuf::Message* response,\\n\"\n    \"                ::google::protobuf::Closure* done);\\n\"\n    \"const ::google::protobuf::Message& GetRequestPrototype(\\n\"\n    \"  const ::google::protobuf::MethodDescriptor* method) const;\\n\"\n    \"const ::google::protobuf::Message& GetResponsePrototype(\\n\"\n    \"  const ::google::protobuf::MethodDescriptor* method) const;\\n\");\n\n  printer->Outdent();\n  printer->Print(vars_,\n    \"\\n\"\n    \" private:\\n\"\n    \"  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS($classname$);\\n\"\n    \"};\\n\"\n    \"\\n\");\n}\n\nvoid ServiceGenerator::GenerateStubDefinition(io::Printer* printer) {\n  printer->Print(vars_,\n    \"class $dllexport$$classname$_Stub : public $classname$ {\\n\"\n    \" public:\\n\");\n\n  printer->Indent();\n\n  printer->Print(vars_,\n    \"$classname$_Stub(::google::protobuf::RpcChannel* channel);\\n\"\n    \"$classname$_Stub(::google::protobuf::RpcChannel* channel,\\n\"\n    \"                 ::google::protobuf::Service::ChannelOwnership ownership);\\n\"\n    \"~$classname$_Stub();\\n\"\n    \"\\n\"\n    \"inline ::google::protobuf::RpcChannel* channel() { return channel_; }\\n\"\n    \"\\n\"\n    \"// implements $classname$ ------------------------------------------\\n\"\n    \"\\n\");\n\n  GenerateMethodSignatures(NON_VIRTUAL, printer);\n\n  printer->Outdent();\n  printer->Print(vars_,\n    \" private:\\n\"\n    \"  ::google::protobuf::RpcChannel* channel_;\\n\"\n    \"  bool owns_channel_;\\n\"\n    \"  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS($classname$_Stub);\\n\"\n    \"};\\n\"\n    \"\\n\");\n}\n\nvoid ServiceGenerator::GenerateMethodSignatures(\n    VirtualOrNon virtual_or_non, io::Printer* printer) {\n  for (int i = 0; i < descriptor_->method_count(); i++) {\n    const MethodDescriptor* method = descriptor_->method(i);\n    map<string, string> sub_vars;\n    sub_vars[\"name\"] = method->name();\n    sub_vars[\"input_type\"] = ClassName(method->input_type(), true);\n    sub_vars[\"output_type\"] = ClassName(method->output_type(), true);\n    sub_vars[\"virtual\"] = virtual_or_non == VIRTUAL ? \"virtual \" : \"\";\n\n    printer->Print(sub_vars,\n      \"$virtual$void $name$(::google::protobuf::RpcController* controller,\\n\"\n      \"                     const $input_type$* request,\\n\"\n      \"                     $output_type$* response,\\n\"\n      \"                     ::google::protobuf::Closure* done);\\n\");\n  }\n}\n\n// ===================================================================\n\nvoid ServiceGenerator::GenerateDescriptorInitializer(\n    io::Printer* printer, int index) {\n  map<string, string> vars;\n  vars[\"classname\"] = descriptor_->name();\n  vars[\"index\"] = SimpleItoa(index);\n\n  printer->Print(vars,\n    \"$classname$_descriptor_ = file->service($index$);\\n\");\n}\n\n// ===================================================================\n\nvoid ServiceGenerator::GenerateImplementation(io::Printer* printer) {\n  printer->Print(vars_,\n    \"$classname$::~$classname$() {}\\n\"\n    \"\\n\"\n    \"const ::google::protobuf::ServiceDescriptor* $classname$::descriptor() {\\n\"\n    \"  protobuf_AssignDescriptorsOnce();\\n\"\n    \"  return $classname$_descriptor_;\\n\"\n    \"}\\n\"\n    \"\\n\"\n    \"const ::google::protobuf::ServiceDescriptor* $classname$::GetDescriptor() {\\n\"\n    \"  protobuf_AssignDescriptorsOnce();\\n\"\n    \"  return $classname$_descriptor_;\\n\"\n    \"}\\n\"\n    \"\\n\");\n\n  // Generate methods of the interface.\n  GenerateNotImplementedMethods(printer);\n  GenerateCallMethod(printer);\n  GenerateGetPrototype(REQUEST, printer);\n  GenerateGetPrototype(RESPONSE, printer);\n\n  // Generate stub implementation.\n  printer->Print(vars_,\n    \"$classname$_Stub::$classname$_Stub(::google::protobuf::RpcChannel* channel)\\n\"\n    \"  : channel_(channel), owns_channel_(false) {}\\n\"\n    \"$classname$_Stub::$classname$_Stub(\\n\"\n    \"    ::google::protobuf::RpcChannel* channel,\\n\"\n    \"    ::google::protobuf::Service::ChannelOwnership ownership)\\n\"\n    \"  : channel_(channel),\\n\"\n    \"    owns_channel_(ownership == ::google::protobuf::Service::STUB_OWNS_CHANNEL) {}\\n\"\n    \"$classname$_Stub::~$classname$_Stub() {\\n\"\n    \"  if (owns_channel_) delete channel_;\\n\"\n    \"}\\n\"\n    \"\\n\");\n\n  GenerateStubMethods(printer);\n}\n\nvoid ServiceGenerator::GenerateNotImplementedMethods(io::Printer* printer) {\n  for (int i = 0; i < descriptor_->method_count(); i++) {\n    const MethodDescriptor* method = descriptor_->method(i);\n    map<string, string> sub_vars;\n    sub_vars[\"classname\"] = descriptor_->name();\n    sub_vars[\"name\"] = method->name();\n    sub_vars[\"index\"] = SimpleItoa(i);\n    sub_vars[\"input_type\"] = ClassName(method->input_type(), true);\n    sub_vars[\"output_type\"] = ClassName(method->output_type(), true);\n\n    printer->Print(sub_vars,\n      \"void $classname$::$name$(::google::protobuf::RpcController* controller,\\n\"\n      \"                         const $input_type$*,\\n\"\n      \"                         $output_type$*,\\n\"\n      \"                         ::google::protobuf::Closure* done) {\\n\"\n      \"  controller->SetFailed(\\\"Method $name$() not implemented.\\\");\\n\"\n      \"  done->Run();\\n\"\n      \"}\\n\"\n      \"\\n\");\n  }\n}\n\nvoid ServiceGenerator::GenerateCallMethod(io::Printer* printer) {\n  printer->Print(vars_,\n    \"void $classname$::CallMethod(const ::google::protobuf::MethodDescriptor* method,\\n\"\n    \"                             ::google::protobuf::RpcController* controller,\\n\"\n    \"                             const ::google::protobuf::Message* request,\\n\"\n    \"                             ::google::protobuf::Message* response,\\n\"\n    \"                             ::google::protobuf::Closure* done) {\\n\"\n    \"  GOOGLE_DCHECK_EQ(method->service(), $classname$_descriptor_);\\n\"\n    \"  switch(method->index()) {\\n\");\n\n  for (int i = 0; i < descriptor_->method_count(); i++) {\n    const MethodDescriptor* method = descriptor_->method(i);\n    map<string, string> sub_vars;\n    sub_vars[\"name\"] = method->name();\n    sub_vars[\"index\"] = SimpleItoa(i);\n    sub_vars[\"input_type\"] = ClassName(method->input_type(), true);\n    sub_vars[\"output_type\"] = ClassName(method->output_type(), true);\n\n    // Note:  down_cast does not work here because it only works on pointers,\n    //   not references.\n    printer->Print(sub_vars,\n      \"    case $index$:\\n\"\n      \"      $name$(controller,\\n\"\n      \"             ::google::protobuf::down_cast<const $input_type$*>(request),\\n\"\n      \"             ::google::protobuf::down_cast< $output_type$*>(response),\\n\"\n      \"             done);\\n\"\n      \"      break;\\n\");\n  }\n\n  printer->Print(vars_,\n    \"    default:\\n\"\n    \"      GOOGLE_LOG(FATAL) << \\\"Bad method index; this should never happen.\\\";\\n\"\n    \"      break;\\n\"\n    \"  }\\n\"\n    \"}\\n\"\n    \"\\n\");\n}\n\nvoid ServiceGenerator::GenerateGetPrototype(RequestOrResponse which,\n                                            io::Printer* printer) {\n  if (which == REQUEST) {\n    printer->Print(vars_,\n      \"const ::google::protobuf::Message& $classname$::GetRequestPrototype(\\n\");\n  } else {\n    printer->Print(vars_,\n      \"const ::google::protobuf::Message& $classname$::GetResponsePrototype(\\n\");\n  }\n\n  printer->Print(vars_,\n    \"    const ::google::protobuf::MethodDescriptor* method) const {\\n\"\n    \"  GOOGLE_DCHECK_EQ(method->service(), descriptor());\\n\"\n    \"  switch(method->index()) {\\n\");\n\n  for (int i = 0; i < descriptor_->method_count(); i++) {\n    const MethodDescriptor* method = descriptor_->method(i);\n    const Descriptor* type =\n      (which == REQUEST) ? method->input_type() : method->output_type();\n\n    map<string, string> sub_vars;\n    sub_vars[\"index\"] = SimpleItoa(i);\n    sub_vars[\"type\"] = ClassName(type, true);\n\n    printer->Print(sub_vars,\n      \"    case $index$:\\n\"\n      \"      return $type$::default_instance();\\n\");\n  }\n\n  printer->Print(vars_,\n    \"    default:\\n\"\n    \"      GOOGLE_LOG(FATAL) << \\\"Bad method index; this should never happen.\\\";\\n\"\n    \"      return *reinterpret_cast< ::google::protobuf::Message*>(NULL);\\n\"\n    \"  }\\n\"\n    \"}\\n\"\n    \"\\n\");\n}\n\nvoid ServiceGenerator::GenerateStubMethods(io::Printer* printer) {\n  for (int i = 0; i < descriptor_->method_count(); i++) {\n    const MethodDescriptor* method = descriptor_->method(i);\n    map<string, string> sub_vars;\n    sub_vars[\"classname\"] = descriptor_->name();\n    sub_vars[\"name\"] = method->name();\n    sub_vars[\"index\"] = SimpleItoa(i);\n    sub_vars[\"input_type\"] = ClassName(method->input_type(), true);\n    sub_vars[\"output_type\"] = ClassName(method->output_type(), true);\n\n    printer->Print(sub_vars,\n      \"void $classname$_Stub::$name$(::google::protobuf::RpcController* controller,\\n\"\n      \"                              const $input_type$* request,\\n\"\n      \"                              $output_type$* response,\\n\"\n      \"                              ::google::protobuf::Closure* done) {\\n\"\n      \"  channel_->CallMethod(descriptor()->method($index$),\\n\"\n      \"                       controller, request, response, done);\\n\"\n      \"}\\n\");\n  }\n}\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_SERVICE_H__\n#define GOOGLE_PROTOBUF_COMPILER_CPP_SERVICE_H__\n\n#include <map>\n#include <string>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/descriptor.h>\n\nnamespace google {\nnamespace protobuf {\n  namespace io {\n    class Printer;             // printer.h\n  }\n}\n\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nclass ServiceGenerator {\n public:\n  // See generator.cc for the meaning of dllexport_decl.\n  explicit ServiceGenerator(const ServiceDescriptor* descriptor,\n                            const string& dllexport_decl);\n  ~ServiceGenerator();\n\n  // Header stuff.\n\n  // Generate the class definitions for the service's interface and the\n  // stub implementation.\n  void GenerateDeclarations(io::Printer* printer);\n\n  // Source file stuff.\n\n  // Generate code that initializes the global variable storing the service's\n  // descriptor.\n  void GenerateDescriptorInitializer(io::Printer* printer, int index);\n\n  // Generate implementations of everything declared by GenerateDeclarations().\n  void GenerateImplementation(io::Printer* printer);\n\n private:\n  enum RequestOrResponse { REQUEST, RESPONSE };\n  enum VirtualOrNon { VIRTUAL, NON_VIRTUAL };\n\n  // Header stuff.\n\n  // Generate the service abstract interface.\n  void GenerateInterface(io::Printer* printer);\n\n  // Generate the stub class definition.\n  void GenerateStubDefinition(io::Printer* printer);\n\n  // Prints signatures for all methods in the\n  void GenerateMethodSignatures(VirtualOrNon virtual_or_non,\n                                io::Printer* printer);\n\n  // Source file stuff.\n\n  // Generate the default implementations of the service methods, which\n  // produce a \"not implemented\" error.\n  void GenerateNotImplementedMethods(io::Printer* printer);\n\n  // Generate the CallMethod() method of the service.\n  void GenerateCallMethod(io::Printer* printer);\n\n  // Generate the Get{Request,Response}Prototype() methods.\n  void GenerateGetPrototype(RequestOrResponse which, io::Printer* printer);\n\n  // Generate the stub's implementations of the service methods.\n  void GenerateStubMethods(io::Printer* printer);\n\n  const ServiceDescriptor* descriptor_;\n  map<string, string> vars_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceGenerator);\n};\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_SERVICE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/cpp/cpp_string_field.h>\n#include <google/protobuf/compiler/cpp/cpp_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nnamespace {\n\nvoid SetStringVariables(const FieldDescriptor* descriptor,\n                        map<string, string>* variables) {\n  SetCommonFieldVariables(descriptor, variables);\n  (*variables)[\"default\"] = DefaultValue(descriptor);\n  (*variables)[\"default_variable\"] = descriptor->default_value_string().empty()\n      ? \"::google::protobuf::internal::kEmptyString\"\n      : \"_default_\" + FieldName(descriptor) + \"_\";\n  (*variables)[\"pointer_type\"] =\n      descriptor->type() == FieldDescriptor::TYPE_BYTES ? \"void\" : \"char\";\n}\n\n}  // namespace\n\n// ===================================================================\n\nStringFieldGenerator::\nStringFieldGenerator(const FieldDescriptor* descriptor)\n  : descriptor_(descriptor) {\n  SetStringVariables(descriptor, &variables_);\n}\n\nStringFieldGenerator::~StringFieldGenerator() {}\n\nvoid StringFieldGenerator::\nGeneratePrivateMembers(io::Printer* printer) const {\n  printer->Print(variables_, \"::std::string* $name$_;\\n\");\n  if (!descriptor_->default_value_string().empty()) {\n    printer->Print(variables_, \"static const ::std::string $default_variable$;\\n\");\n  }\n}\n\nvoid StringFieldGenerator::\nGenerateAccessorDeclarations(io::Printer* printer) const {\n  // If we're using StringFieldGenerator for a field with a ctype, it's\n  // because that ctype isn't actually implemented.  In particular, this is\n  // true of ctype=CORD and ctype=STRING_PIECE in the open source release.\n  // We aren't releasing Cord because it has too many Google-specific\n  // dependencies and we aren't releasing StringPiece because it's hardly\n  // useful outside of Google and because it would get confusing to have\n  // multiple instances of the StringPiece class in different libraries (PCRE\n  // already includes it for their C++ bindings, which came from Google).\n  //\n  // In any case, we make all the accessors private while still actually\n  // using a string to represent the field internally.  This way, we can\n  // guarantee that if we do ever implement the ctype, it won't break any\n  // existing users who might be -- for whatever reason -- already using .proto\n  // files that applied the ctype.  The field can still be accessed via the\n  // reflection interface since the reflection interface is independent of\n  // the string's underlying representation.\n  if (descriptor_->options().ctype() != FieldOptions::STRING) {\n    printer->Outdent();\n    printer->Print(\n      \" private:\\n\"\n      \"  // Hidden due to unknown ctype option.\\n\");\n    printer->Indent();\n  }\n\n  printer->Print(variables_,\n    \"inline const ::std::string& $name$() const$deprecation$;\\n\"\n    \"inline void set_$name$(const ::std::string& value)$deprecation$;\\n\"\n    \"inline void set_$name$(const char* value)$deprecation$;\\n\"\n    \"inline void set_$name$(const $pointer_type$* value, size_t size)\"\n                 \"$deprecation$;\\n\"\n    \"inline ::std::string* mutable_$name$()$deprecation$;\\n\"\n    \"inline ::std::string* release_$name$()$deprecation$;\\n\");\n\n  if (descriptor_->options().ctype() != FieldOptions::STRING) {\n    printer->Outdent();\n    printer->Print(\" public:\\n\");\n    printer->Indent();\n  }\n}\n\nvoid StringFieldGenerator::\nGenerateInlineAccessorDefinitions(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline const ::std::string& $classname$::$name$() const {\\n\"\n    \"  return *$name$_;\\n\"\n    \"}\\n\"\n    \"inline void $classname$::set_$name$(const ::std::string& value) {\\n\"\n    \"  set_has_$name$();\\n\"\n    \"  if ($name$_ == &$default_variable$) {\\n\"\n    \"    $name$_ = new ::std::string;\\n\"\n    \"  }\\n\"\n    \"  $name$_->assign(value);\\n\"\n    \"}\\n\"\n    \"inline void $classname$::set_$name$(const char* value) {\\n\"\n    \"  set_has_$name$();\\n\"\n    \"  if ($name$_ == &$default_variable$) {\\n\"\n    \"    $name$_ = new ::std::string;\\n\"\n    \"  }\\n\"\n    \"  $name$_->assign(value);\\n\"\n    \"}\\n\"\n    \"inline \"\n    \"void $classname$::set_$name$(const $pointer_type$* value, size_t size) {\\n\"\n    \"  set_has_$name$();\\n\"\n    \"  if ($name$_ == &$default_variable$) {\\n\"\n    \"    $name$_ = new ::std::string;\\n\"\n    \"  }\\n\"\n    \"  $name$_->assign(reinterpret_cast<const char*>(value), size);\\n\"\n    \"}\\n\"\n    \"inline ::std::string* $classname$::mutable_$name$() {\\n\"\n    \"  set_has_$name$();\\n\"\n    \"  if ($name$_ == &$default_variable$) {\\n\");\n  if (descriptor_->default_value_string().empty()) {\n    printer->Print(variables_,\n      \"    $name$_ = new ::std::string;\\n\");\n  } else {\n    printer->Print(variables_,\n      \"    $name$_ = new ::std::string($default_variable$);\\n\");\n  }\n  printer->Print(variables_,\n    \"  }\\n\"\n    \"  return $name$_;\\n\"\n    \"}\\n\"\n    \"inline ::std::string* $classname$::release_$name$() {\\n\"\n    \"  clear_has_$name$();\\n\"\n    \"  if ($name$_ == &$default_variable$) {\\n\"\n    \"    return NULL;\\n\"\n    \"  } else {\\n\"\n    \"    ::std::string* temp = $name$_;\\n\"\n    \"    $name$_ = const_cast< ::std::string*>(&$default_variable$);\\n\"\n    \"    return temp;\\n\"\n    \"  }\\n\"\n    \"}\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateNonInlineAccessorDefinitions(io::Printer* printer) const {\n  if (!descriptor_->default_value_string().empty()) {\n    printer->Print(variables_,\n      \"const ::std::string $classname$::$default_variable$($default$);\\n\");\n  }\n}\n\nvoid StringFieldGenerator::\nGenerateClearingCode(io::Printer* printer) const {\n  if (descriptor_->default_value_string().empty()) {\n    printer->Print(variables_,\n      \"if ($name$_ != &$default_variable$) {\\n\"\n      \"  $name$_->clear();\\n\"\n      \"}\\n\");\n  } else {\n    printer->Print(variables_,\n      \"if ($name$_ != &$default_variable$) {\\n\"\n      \"  $name$_->assign($default_variable$);\\n\"\n      \"}\\n\");\n  }\n}\n\nvoid StringFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"set_$name$(from.$name$());\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateSwappingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"std::swap($name$_, other->$name$_);\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateConstructorCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$name$_ = const_cast< ::std::string*>(&$default_variable$);\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateDestructorCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if ($name$_ != &$default_variable$) {\\n\"\n    \"  delete $name$_;\\n\"\n    \"}\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateMergeFromCodedStream(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"DO_(::google::protobuf::internal::WireFormatLite::Read$declared_type$(\\n\"\n    \"      input, this->mutable_$name$()));\\n\");\n  if (HasUtf8Verification(descriptor_->file()) &&\n      descriptor_->type() == FieldDescriptor::TYPE_STRING) {\n    printer->Print(variables_,\n      \"::google::protobuf::internal::WireFormat::VerifyUTF8String(\\n\"\n      \"  this->$name$().data(), this->$name$().length(),\\n\"\n      \"  ::google::protobuf::internal::WireFormat::PARSE);\\n\");\n  }\n}\n\nvoid StringFieldGenerator::\nGenerateSerializeWithCachedSizes(io::Printer* printer) const {\n  if (HasUtf8Verification(descriptor_->file()) &&\n      descriptor_->type() == FieldDescriptor::TYPE_STRING) {\n    printer->Print(variables_,\n      \"::google::protobuf::internal::WireFormat::VerifyUTF8String(\\n\"\n      \"  this->$name$().data(), this->$name$().length(),\\n\"\n      \"  ::google::protobuf::internal::WireFormat::SERIALIZE);\\n\");\n  }\n  printer->Print(variables_,\n    \"::google::protobuf::internal::WireFormatLite::Write$declared_type$(\\n\"\n    \"  $number$, this->$name$(), output);\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {\n  if (HasUtf8Verification(descriptor_->file()) &&\n      descriptor_->type() == FieldDescriptor::TYPE_STRING) {\n    printer->Print(variables_,\n      \"::google::protobuf::internal::WireFormat::VerifyUTF8String(\\n\"\n      \"  this->$name$().data(), this->$name$().length(),\\n\"\n      \"  ::google::protobuf::internal::WireFormat::SERIALIZE);\\n\");\n  }\n  printer->Print(variables_,\n    \"target =\\n\"\n    \"  ::google::protobuf::internal::WireFormatLite::Write$declared_type$ToArray(\\n\"\n    \"    $number$, this->$name$(), target);\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateByteSize(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"total_size += $tag_size$ +\\n\"\n    \"  ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\\n\"\n    \"    this->$name$());\\n\");\n}\n\n// ===================================================================\n\nRepeatedStringFieldGenerator::\nRepeatedStringFieldGenerator(const FieldDescriptor* descriptor)\n  : descriptor_(descriptor) {\n  SetStringVariables(descriptor, &variables_);\n}\n\nRepeatedStringFieldGenerator::~RepeatedStringFieldGenerator() {}\n\nvoid RepeatedStringFieldGenerator::\nGeneratePrivateMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"::google::protobuf::RepeatedPtrField< ::std::string> $name$_;\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateAccessorDeclarations(io::Printer* printer) const {\n  // See comment above about unknown ctypes.\n  if (descriptor_->options().ctype() != FieldOptions::STRING) {\n    printer->Outdent();\n    printer->Print(\n      \" private:\\n\"\n      \"  // Hidden due to unknown ctype option.\\n\");\n    printer->Indent();\n  }\n\n  printer->Print(variables_,\n    \"inline const ::std::string& $name$(int index) const$deprecation$;\\n\"\n    \"inline ::std::string* mutable_$name$(int index)$deprecation$;\\n\"\n    \"inline void set_$name$(int index, const ::std::string& value)$deprecation$;\\n\"\n    \"inline void set_$name$(int index, const char* value)$deprecation$;\\n\"\n    \"inline \"\n    \"void set_$name$(int index, const $pointer_type$* value, size_t size)\"\n                 \"$deprecation$;\\n\"\n    \"inline ::std::string* add_$name$()$deprecation$;\\n\"\n    \"inline void add_$name$(const ::std::string& value)$deprecation$;\\n\"\n    \"inline void add_$name$(const char* value)$deprecation$;\\n\"\n    \"inline void add_$name$(const $pointer_type$* value, size_t size)\"\n                 \"$deprecation$;\\n\");\n\n  printer->Print(variables_,\n    \"inline const ::google::protobuf::RepeatedPtrField< ::std::string>& $name$() const\"\n                 \"$deprecation$;\\n\"\n    \"inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_$name$()\"\n                 \"$deprecation$;\\n\");\n\n  if (descriptor_->options().ctype() != FieldOptions::STRING) {\n    printer->Outdent();\n    printer->Print(\" public:\\n\");\n    printer->Indent();\n  }\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateInlineAccessorDefinitions(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"inline const ::std::string& $classname$::$name$(int index) const {\\n\"\n    \"  return $name$_.Get(index);\\n\"\n    \"}\\n\"\n    \"inline ::std::string* $classname$::mutable_$name$(int index) {\\n\"\n    \"  return $name$_.Mutable(index);\\n\"\n    \"}\\n\"\n    \"inline void $classname$::set_$name$(int index, const ::std::string& value) {\\n\"\n    \"  $name$_.Mutable(index)->assign(value);\\n\"\n    \"}\\n\"\n    \"inline void $classname$::set_$name$(int index, const char* value) {\\n\"\n    \"  $name$_.Mutable(index)->assign(value);\\n\"\n    \"}\\n\"\n    \"inline void \"\n    \"$classname$::set_$name$\"\n    \"(int index, const $pointer_type$* value, size_t size) {\\n\"\n    \"  $name$_.Mutable(index)->assign(\\n\"\n    \"    reinterpret_cast<const char*>(value), size);\\n\"\n    \"}\\n\"\n    \"inline ::std::string* $classname$::add_$name$() {\\n\"\n    \"  return $name$_.Add();\\n\"\n    \"}\\n\"\n    \"inline void $classname$::add_$name$(const ::std::string& value) {\\n\"\n    \"  $name$_.Add()->assign(value);\\n\"\n    \"}\\n\"\n    \"inline void $classname$::add_$name$(const char* value) {\\n\"\n    \"  $name$_.Add()->assign(value);\\n\"\n    \"}\\n\"\n    \"inline void \"\n    \"$classname$::add_$name$(const $pointer_type$* value, size_t size) {\\n\"\n    \"  $name$_.Add()->assign(reinterpret_cast<const char*>(value), size);\\n\"\n    \"}\\n\");\n  printer->Print(variables_,\n    \"inline const ::google::protobuf::RepeatedPtrField< ::std::string>&\\n\"\n    \"$classname$::$name$() const {\\n\"\n    \"  return $name$_;\\n\"\n    \"}\\n\"\n    \"inline ::google::protobuf::RepeatedPtrField< ::std::string>*\\n\"\n    \"$classname$::mutable_$name$() {\\n\"\n    \"  return &$name$_;\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateClearingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_.Clear();\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_.MergeFrom(from.$name$_);\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateSwappingCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_.Swap(&other->$name$_);\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateConstructorCode(io::Printer* printer) const {\n  // Not needed for repeated fields.\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateMergeFromCodedStream(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"DO_(::google::protobuf::internal::WireFormatLite::Read$declared_type$(\\n\"\n    \"      input, this->add_$name$()));\\n\");\n  if (HasUtf8Verification(descriptor_->file()) &&\n      descriptor_->type() == FieldDescriptor::TYPE_STRING) {\n    printer->Print(variables_,\n      \"::google::protobuf::internal::WireFormat::VerifyUTF8String(\\n\"\n      \"  this->$name$(0).data(), this->$name$(0).length(),\\n\"\n      \"  ::google::protobuf::internal::WireFormat::PARSE);\\n\");\n  }\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateSerializeWithCachedSizes(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"for (int i = 0; i < this->$name$_size(); i++) {\\n\");\n  if (HasUtf8Verification(descriptor_->file()) &&\n      descriptor_->type() == FieldDescriptor::TYPE_STRING) {\n    printer->Print(variables_,\n      \"::google::protobuf::internal::WireFormat::VerifyUTF8String(\\n\"\n      \"  this->$name$(i).data(), this->$name$(i).length(),\\n\"\n      \"  ::google::protobuf::internal::WireFormat::SERIALIZE);\\n\");\n  }\n  printer->Print(variables_,\n    \"  ::google::protobuf::internal::WireFormatLite::Write$declared_type$(\\n\"\n    \"    $number$, this->$name$(i), output);\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"for (int i = 0; i < this->$name$_size(); i++) {\\n\");\n  if (HasUtf8Verification(descriptor_->file()) &&\n      descriptor_->type() == FieldDescriptor::TYPE_STRING) {\n    printer->Print(variables_,\n      \"  ::google::protobuf::internal::WireFormat::VerifyUTF8String(\\n\"\n      \"    this->$name$(i).data(), this->$name$(i).length(),\\n\"\n      \"    ::google::protobuf::internal::WireFormat::SERIALIZE);\\n\");\n  }\n  printer->Print(variables_,\n    \"  target = ::google::protobuf::internal::WireFormatLite::\\n\"\n    \"    Write$declared_type$ToArray($number$, this->$name$(i), target);\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateByteSize(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"total_size += $tag_size$ * this->$name$_size();\\n\"\n    \"for (int i = 0; i < this->$name$_size(); i++) {\\n\"\n    \"  total_size += ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\\n\"\n    \"    this->$name$(i));\\n\"\n    \"}\\n\");\n}\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_STRING_FIELD_H__\n#define GOOGLE_PROTOBUF_COMPILER_CPP_STRING_FIELD_H__\n\n#include <map>\n#include <string>\n#include <google/protobuf/compiler/cpp/cpp_field.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\nclass StringFieldGenerator : public FieldGenerator {\n public:\n  explicit StringFieldGenerator(const FieldDescriptor* descriptor);\n  ~StringFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  void GeneratePrivateMembers(io::Printer* printer) const;\n  void GenerateAccessorDeclarations(io::Printer* printer) const;\n  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;\n  void GenerateNonInlineAccessorDefinitions(io::Printer* printer) const;\n  void GenerateClearingCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateSwappingCode(io::Printer* printer) const;\n  void GenerateConstructorCode(io::Printer* printer) const;\n  void GenerateDestructorCode(io::Printer* printer) const;\n  void GenerateMergeFromCodedStream(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizes(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;\n  void GenerateByteSize(io::Printer* printer) const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringFieldGenerator);\n};\n\nclass RepeatedStringFieldGenerator : public FieldGenerator {\n public:\n  explicit RepeatedStringFieldGenerator(const FieldDescriptor* descriptor);\n  ~RepeatedStringFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  void GeneratePrivateMembers(io::Printer* printer) const;\n  void GenerateAccessorDeclarations(io::Printer* printer) const;\n  void GenerateInlineAccessorDefinitions(io::Printer* printer) const;\n  void GenerateClearingCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateSwappingCode(io::Printer* printer) const;\n  void GenerateConstructorCode(io::Printer* printer) const;\n  void GenerateMergeFromCodedStream(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizes(io::Printer* printer) const;\n  void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const;\n  void GenerateByteSize(io::Printer* printer) const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedStringFieldGenerator);\n};\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_STRING_FIELD_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file tests that various identifiers work as field and type names even\n// though the same identifiers are used internally by the C++ code generator.\n\n\n// Some generic_services option(s) added automatically.\n// See:  http://go/proto2-generic-services-default\noption cc_generic_services = true;     // auto-added\n\n// We don't put this in a package within proto2 because we need to make sure\n// that the generated code doesn't depend on being in the proto2 namespace.\npackage protobuf_unittest;\n\n// Test that fields can have names like \"input\" and \"i\" which are also used\n// internally by the code generator for local variables.\nmessage TestConflictingSymbolNames {\n  message BuildDescriptors {}\n  message TypeTraits {}\n\n  optional int32 input = 1;\n  optional int32 output = 2;\n  optional string length = 3;\n  repeated int32 i = 4;\n  repeated string new_element = 5 [ctype=STRING_PIECE];\n  optional int32 total_size = 6;\n  optional int32 tag = 7;\n\n  enum TestEnum { FOO = 1; }\n  message Data1 { repeated int32 data = 1; }\n  message Data2 { repeated TestEnum data = 1; }\n  message Data3 { repeated string data = 1; }\n  message Data4 { repeated Data4 data = 1; }\n  message Data5 { repeated string data = 1 [ctype=STRING_PIECE]; }\n  message Data6 { repeated string data = 1 [ctype=CORD]; }\n\n  optional int32 source = 8;\n  optional int32 value = 9;\n  optional int32 file = 10;\n  optional int32 from = 11;\n  optional int32 handle_uninterpreted = 12;\n  repeated int32 index = 13;\n  optional int32 controller = 14;\n  optional int32 already_here = 15;\n\n  optional uint32 uint32 = 16;\n  optional uint64 uint64 = 17;\n  optional string string = 18;\n  optional int32 memset = 19;\n  optional int32 int32 = 20;\n  optional int64 int64 = 21;\n\n  optional uint32 cached_size = 22;\n  optional uint32 extensions = 23;\n  optional uint32 bit = 24;\n  optional uint32 bits = 25;\n  optional uint32 offsets = 26;\n  optional uint32 reflection = 27;\n\n  message Cord {}\n  optional string some_cord = 28 [ctype=CORD];\n\n  message StringPiece {}\n  optional string some_string_piece = 29 [ctype=STRING_PIECE];\n\n  // Some keywords.\n  optional uint32 int = 30;\n  optional uint32 friend = 31;\n\n  // The generator used to #define a macro called \"DO\" inside the .cc file.\n  message DO {}\n  optional DO do = 32;\n\n  extensions 1000 to max;\n}\n\nmessage DummyMessage {}\n\nservice TestConflictingMethodNames {\n  rpc Closure(DummyMessage) returns (DummyMessage);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// To test the code generator, we actually use it to generate code for\n// google/protobuf/unittest.proto, then test that.  This means that we\n// are actually testing the parser and other parts of the system at the same\n// time, and that problems in the generator may show up as compile-time errors\n// rather than unittest failures, which may be surprising.  However, testing\n// the output of the C++ generator directly would be very hard.  We can't very\n// well just check it against golden files since those files would have to be\n// updated for any small change; such a test would be very brittle and probably\n// not very helpful.  What we really want to test is that the code compiles\n// correctly and produces the interfaces we expect, which is why this test\n// is written this way.\n\n#include <vector>\n\n#include <google/protobuf/unittest.pb.h>\n#include <google/protobuf/unittest_optimize_for.pb.h>\n#include <google/protobuf/unittest_embed_optimize_for.pb.h>\n#include <google/protobuf/unittest_no_generic_services.pb.h>\n#include <google/protobuf/test_util.h>\n#include <google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h>\n#include <google/protobuf/compiler/importer.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/dynamic_message.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace cpp {\n\n// Can't use an anonymous namespace here due to brokenness of Tru64 compiler.\nnamespace cpp_unittest {\n\n\nclass MockErrorCollector : public MultiFileErrorCollector {\n public:\n  MockErrorCollector() {}\n  ~MockErrorCollector() {}\n\n  string text_;\n\n  // implements ErrorCollector ---------------------------------------\n  void AddError(const string& filename, int line, int column,\n                const string& message) {\n    strings::SubstituteAndAppend(&text_, \"$0:$1:$2: $3\\n\",\n                                 filename, line, column, message);\n  }\n};\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n\n// Test that generated code has proper descriptors:\n// Parse a descriptor directly (using google::protobuf::compiler::Importer) and\n// compare it to the one that was produced by generated code.\nTEST(GeneratedDescriptorTest, IdenticalDescriptors) {\n  const FileDescriptor* generated_descriptor =\n    unittest::TestAllTypes::descriptor()->file();\n\n  // Set up the Importer.\n  MockErrorCollector error_collector;\n  DiskSourceTree source_tree;\n  source_tree.MapPath(\"\", TestSourceDir());\n  Importer importer(&source_tree, &error_collector);\n\n  // Import (parse) unittest.proto.\n  const FileDescriptor* parsed_descriptor =\n    importer.Import(\"google/protobuf/unittest.proto\");\n  EXPECT_EQ(\"\", error_collector.text_);\n  ASSERT_TRUE(parsed_descriptor != NULL);\n\n  // Test that descriptors are generated correctly by converting them to\n  // FileDescriptorProtos and comparing.\n  FileDescriptorProto generated_decsriptor_proto, parsed_descriptor_proto;\n  generated_descriptor->CopyTo(&generated_decsriptor_proto);\n  parsed_descriptor->CopyTo(&parsed_descriptor_proto);\n\n  EXPECT_EQ(parsed_descriptor_proto.DebugString(),\n            generated_decsriptor_proto.DebugString());\n}\n\n#endif  // !PROTOBUF_TEST_NO_DESCRIPTORS\n\n// ===================================================================\n\nTEST(GeneratedMessageTest, Defaults) {\n  // Check that all default values are set correctly in the initial message.\n  unittest::TestAllTypes message;\n\n  TestUtil::ExpectClear(message);\n\n  // Messages should return pointers to default instances until first use.\n  // (This is not checked by ExpectClear() since it is not actually true after\n  // the fields have been set and then cleared.)\n  EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(),\n            &message.optionalgroup());\n  EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(),\n            &message.optional_nested_message());\n  EXPECT_EQ(&unittest::ForeignMessage::default_instance(),\n            &message.optional_foreign_message());\n  EXPECT_EQ(&unittest_import::ImportMessage::default_instance(),\n            &message.optional_import_message());\n}\n\nTEST(GeneratedMessageTest, FloatingPointDefaults) {\n  const unittest::TestExtremeDefaultValues& extreme_default =\n      unittest::TestExtremeDefaultValues::default_instance();\n\n  EXPECT_EQ(0.0f, extreme_default.zero_float());\n  EXPECT_EQ(1.0f, extreme_default.one_float());\n  EXPECT_EQ(1.5f, extreme_default.small_float());\n  EXPECT_EQ(-1.0f, extreme_default.negative_one_float());\n  EXPECT_EQ(-1.5f, extreme_default.negative_float());\n  EXPECT_EQ(2.0e8f, extreme_default.large_float());\n  EXPECT_EQ(-8e-28f, extreme_default.small_negative_float());\n  EXPECT_EQ(numeric_limits<double>::infinity(),\n            extreme_default.inf_double());\n  EXPECT_EQ(-numeric_limits<double>::infinity(),\n            extreme_default.neg_inf_double());\n  EXPECT_TRUE(extreme_default.nan_double() != extreme_default.nan_double());\n  EXPECT_EQ(numeric_limits<float>::infinity(),\n            extreme_default.inf_float());\n  EXPECT_EQ(-numeric_limits<float>::infinity(),\n            extreme_default.neg_inf_float());\n  EXPECT_TRUE(extreme_default.nan_float() != extreme_default.nan_float());\n}\n\nTEST(GeneratedMessageTest, Trigraph) {\n  const unittest::TestExtremeDefaultValues& extreme_default =\n      unittest::TestExtremeDefaultValues::default_instance();\n\n  EXPECT_EQ(\"? ? ?? ?? ??? ?\\?/ ?\\?-\", extreme_default.cpp_trigraph());\n}\n\nTEST(GeneratedMessageTest, Accessors) {\n  // Set every field to a unique value then go back and check all those\n  // values.\n  unittest::TestAllTypes message;\n\n  TestUtil::SetAllFields(&message);\n  TestUtil::ExpectAllFieldsSet(message);\n\n  TestUtil::ModifyRepeatedFields(&message);\n  TestUtil::ExpectRepeatedFieldsModified(message);\n}\n\nTEST(GeneratedMessageTest, MutableStringDefault) {\n  // mutable_foo() for a string should return a string initialized to its\n  // default value.\n  unittest::TestAllTypes message;\n\n  EXPECT_EQ(\"hello\", *message.mutable_default_string());\n\n  // Note that the first time we call mutable_foo(), we get a newly-allocated\n  // string, but if we clear it and call it again, we get the same object again.\n  // We should verify that it has its default value in both cases.\n  message.set_default_string(\"blah\");\n  message.Clear();\n\n  EXPECT_EQ(\"hello\", *message.mutable_default_string());\n}\n\nTEST(GeneratedMessageTest, ReleaseString) {\n  // Check that release_foo() starts out NULL, and gives us a value\n  // that we can delete after it's been set.\n  unittest::TestAllTypes message;\n\n  EXPECT_EQ(NULL, message.release_default_string());\n  EXPECT_FALSE(message.has_default_string());\n  EXPECT_EQ(\"hello\", message.default_string());\n\n  message.set_default_string(\"blah\");\n  EXPECT_TRUE(message.has_default_string());\n  string* str = message.release_default_string();\n  EXPECT_FALSE(message.has_default_string());\n  ASSERT_TRUE(str != NULL);\n  EXPECT_EQ(\"blah\", *str);\n  delete str;\n\n  EXPECT_EQ(NULL, message.release_default_string());\n  EXPECT_FALSE(message.has_default_string());\n  EXPECT_EQ(\"hello\", message.default_string());\n}\n\nTEST(GeneratedMessageTest, ReleaseMessage) {\n  // Check that release_foo() starts out NULL, and gives us a value\n  // that we can delete after it's been set.\n  unittest::TestAllTypes message;\n\n  EXPECT_EQ(NULL, message.release_optional_nested_message());\n  EXPECT_FALSE(message.has_optional_nested_message());\n\n  message.mutable_optional_nested_message()->set_bb(1);\n  unittest::TestAllTypes::NestedMessage* nest =\n      message.release_optional_nested_message();\n  EXPECT_FALSE(message.has_optional_nested_message());\n  ASSERT_TRUE(nest != NULL);\n  EXPECT_EQ(1, nest->bb());\n  delete nest;\n\n  EXPECT_EQ(NULL, message.release_optional_nested_message());\n  EXPECT_FALSE(message.has_optional_nested_message());\n}\n\nTEST(GeneratedMessageTest, Clear) {\n  // Set every field to a unique value, clear the message, then check that\n  // it is cleared.\n  unittest::TestAllTypes message;\n\n  TestUtil::SetAllFields(&message);\n  message.Clear();\n  TestUtil::ExpectClear(message);\n\n  // Unlike with the defaults test, we do NOT expect that requesting embedded\n  // messages will return a pointer to the default instance.  Instead, they\n  // should return the objects that were created when mutable_blah() was\n  // called.\n  EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(),\n            &message.optionalgroup());\n  EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),\n            &message.optional_nested_message());\n  EXPECT_NE(&unittest::ForeignMessage::default_instance(),\n            &message.optional_foreign_message());\n  EXPECT_NE(&unittest_import::ImportMessage::default_instance(),\n            &message.optional_import_message());\n}\n\nTEST(GeneratedMessageTest, EmbeddedNullsInBytesCharStar) {\n  unittest::TestAllTypes message;\n\n  const char* value = \"\\0lalala\\0\\0\";\n  message.set_optional_bytes(value, 9);\n  ASSERT_EQ(9, message.optional_bytes().size());\n  EXPECT_EQ(0, memcmp(value, message.optional_bytes().data(), 9));\n\n  message.add_repeated_bytes(value, 9);\n  ASSERT_EQ(9, message.repeated_bytes(0).size());\n  EXPECT_EQ(0, memcmp(value, message.repeated_bytes(0).data(), 9));\n}\n\nTEST(GeneratedMessageTest, ClearOneField) {\n  // Set every field to a unique value, then clear one value and insure that\n  // only that one value is cleared.\n  unittest::TestAllTypes message;\n\n  TestUtil::SetAllFields(&message);\n  int64 original_value = message.optional_int64();\n\n  // Clear the field and make sure it shows up as cleared.\n  message.clear_optional_int64();\n  EXPECT_FALSE(message.has_optional_int64());\n  EXPECT_EQ(0, message.optional_int64());\n\n  // Other adjacent fields should not be cleared.\n  EXPECT_TRUE(message.has_optional_int32());\n  EXPECT_TRUE(message.has_optional_uint32());\n\n  // Make sure if we set it again, then all fields are set.\n  message.set_optional_int64(original_value);\n  TestUtil::ExpectAllFieldsSet(message);\n}\n\nTEST(GeneratedMessageTest, StringCharStarLength) {\n  // Verify that we can use a char*,length to set one of the string fields.\n  unittest::TestAllTypes message;\n  message.set_optional_string(\"abcdef\", 3);\n  EXPECT_EQ(\"abc\", message.optional_string());\n\n  // Verify that we can use a char*,length to add to a repeated string field.\n  message.add_repeated_string(\"abcdef\", 3);\n  EXPECT_EQ(1, message.repeated_string_size());\n  EXPECT_EQ(\"abc\", message.repeated_string(0));\n\n  // Verify that we can use a char*,length to set a repeated string field.\n  message.set_repeated_string(0, \"wxyz\", 2);\n  EXPECT_EQ(\"wx\", message.repeated_string(0));\n}\n\n\nTEST(GeneratedMessageTest, CopyFrom) {\n  unittest::TestAllTypes message1, message2;\n\n  TestUtil::SetAllFields(&message1);\n  message2.CopyFrom(message1);\n  TestUtil::ExpectAllFieldsSet(message2);\n\n  // Copying from self should be a no-op.\n  message2.CopyFrom(message2);\n  TestUtil::ExpectAllFieldsSet(message2);\n}\n\n\nTEST(GeneratedMessageTest, SwapWithEmpty) {\n  unittest::TestAllTypes message1, message2;\n  TestUtil::SetAllFields(&message1);\n\n  TestUtil::ExpectAllFieldsSet(message1);\n  TestUtil::ExpectClear(message2);\n  message1.Swap(&message2);\n  TestUtil::ExpectAllFieldsSet(message2);\n  TestUtil::ExpectClear(message1);\n}\n\nTEST(GeneratedMessageTest, SwapWithSelf) {\n  unittest::TestAllTypes message;\n  TestUtil::SetAllFields(&message);\n  TestUtil::ExpectAllFieldsSet(message);\n  message.Swap(&message);\n  TestUtil::ExpectAllFieldsSet(message);\n}\n\nTEST(GeneratedMessageTest, SwapWithOther) {\n  unittest::TestAllTypes message1, message2;\n\n  message1.set_optional_int32(123);\n  message1.set_optional_string(\"abc\");\n  message1.mutable_optional_nested_message()->set_bb(1);\n  message1.set_optional_nested_enum(unittest::TestAllTypes::FOO);\n  message1.add_repeated_int32(1);\n  message1.add_repeated_int32(2);\n  message1.add_repeated_string(\"a\");\n  message1.add_repeated_string(\"b\");\n  message1.add_repeated_nested_message()->set_bb(7);\n  message1.add_repeated_nested_message()->set_bb(8);\n  message1.add_repeated_nested_enum(unittest::TestAllTypes::FOO);\n  message1.add_repeated_nested_enum(unittest::TestAllTypes::BAR);\n\n  message2.set_optional_int32(456);\n  message2.set_optional_string(\"def\");\n  message2.mutable_optional_nested_message()->set_bb(2);\n  message2.set_optional_nested_enum(unittest::TestAllTypes::BAR);\n  message2.add_repeated_int32(3);\n  message2.add_repeated_string(\"c\");\n  message2.add_repeated_nested_message()->set_bb(9);\n  message2.add_repeated_nested_enum(unittest::TestAllTypes::BAZ);\n\n  message1.Swap(&message2);\n\n  EXPECT_EQ(456, message1.optional_int32());\n  EXPECT_EQ(\"def\", message1.optional_string());\n  EXPECT_EQ(2, message1.optional_nested_message().bb());\n  EXPECT_EQ(unittest::TestAllTypes::BAR, message1.optional_nested_enum());\n  ASSERT_EQ(1, message1.repeated_int32_size());\n  EXPECT_EQ(3, message1.repeated_int32(0));\n  ASSERT_EQ(1, message1.repeated_string_size());\n  EXPECT_EQ(\"c\", message1.repeated_string(0));\n  ASSERT_EQ(1, message1.repeated_nested_message_size());\n  EXPECT_EQ(9, message1.repeated_nested_message(0).bb());\n  ASSERT_EQ(1, message1.repeated_nested_enum_size());\n  EXPECT_EQ(unittest::TestAllTypes::BAZ, message1.repeated_nested_enum(0));\n\n  EXPECT_EQ(123, message2.optional_int32());\n  EXPECT_EQ(\"abc\", message2.optional_string());\n  EXPECT_EQ(1, message2.optional_nested_message().bb());\n  EXPECT_EQ(unittest::TestAllTypes::FOO, message2.optional_nested_enum());\n  ASSERT_EQ(2, message2.repeated_int32_size());\n  EXPECT_EQ(1, message2.repeated_int32(0));\n  EXPECT_EQ(2, message2.repeated_int32(1));\n  ASSERT_EQ(2, message2.repeated_string_size());\n  EXPECT_EQ(\"a\", message2.repeated_string(0));\n  EXPECT_EQ(\"b\", message2.repeated_string(1));\n  ASSERT_EQ(2, message2.repeated_nested_message_size());\n  EXPECT_EQ(7, message2.repeated_nested_message(0).bb());\n  EXPECT_EQ(8, message2.repeated_nested_message(1).bb());\n  ASSERT_EQ(2, message2.repeated_nested_enum_size());\n  EXPECT_EQ(unittest::TestAllTypes::FOO, message2.repeated_nested_enum(0));\n  EXPECT_EQ(unittest::TestAllTypes::BAR, message2.repeated_nested_enum(1));\n}\n\nTEST(GeneratedMessageTest, CopyConstructor) {\n  unittest::TestAllTypes message1;\n  TestUtil::SetAllFields(&message1);\n\n  unittest::TestAllTypes message2(message1);\n  TestUtil::ExpectAllFieldsSet(message2);\n}\n\nTEST(GeneratedMessageTest, CopyAssignmentOperator) {\n  unittest::TestAllTypes message1;\n  TestUtil::SetAllFields(&message1);\n\n  unittest::TestAllTypes message2;\n  message2 = message1;\n  TestUtil::ExpectAllFieldsSet(message2);\n\n  // Make sure that self-assignment does something sane.\n  message2.operator=(message2);\n  TestUtil::ExpectAllFieldsSet(message2);\n}\n\nTEST(GeneratedMessageTest, UpcastCopyFrom) {\n  // Test the CopyFrom method that takes in the generic const Message&\n  // parameter.\n  unittest::TestAllTypes message1, message2;\n\n  TestUtil::SetAllFields(&message1);\n\n  const Message* source = implicit_cast<const Message*>(&message1);\n  message2.CopyFrom(*source);\n\n  TestUtil::ExpectAllFieldsSet(message2);\n}\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n\nTEST(GeneratedMessageTest, DynamicMessageCopyFrom) {\n  // Test copying from a DynamicMessage, which must fall back to using\n  // reflection.\n  unittest::TestAllTypes message2;\n\n  // Construct a new version of the dynamic message via the factory.\n  DynamicMessageFactory factory;\n  scoped_ptr<Message> message1;\n  message1.reset(factory.GetPrototype(\n                     unittest::TestAllTypes::descriptor())->New());\n\n  TestUtil::ReflectionTester reflection_tester(\n    unittest::TestAllTypes::descriptor());\n  reflection_tester.SetAllFieldsViaReflection(message1.get());\n\n  message2.CopyFrom(*message1);\n\n  TestUtil::ExpectAllFieldsSet(message2);\n}\n\n#endif  // !PROTOBUF_TEST_NO_DESCRIPTORS\n\nTEST(GeneratedMessageTest, NonEmptyMergeFrom) {\n  // Test merging with a non-empty message. Code is a modified form\n  // of that found in google/protobuf/reflection_ops_unittest.cc.\n  unittest::TestAllTypes message1, message2;\n\n  TestUtil::SetAllFields(&message1);\n\n  // This field will test merging into an empty spot.\n  message2.set_optional_int32(message1.optional_int32());\n  message1.clear_optional_int32();\n\n  // This tests overwriting.\n  message2.set_optional_string(message1.optional_string());\n  message1.set_optional_string(\"something else\");\n\n  // This tests concatenating.\n  message2.add_repeated_int32(message1.repeated_int32(1));\n  int32 i = message1.repeated_int32(0);\n  message1.clear_repeated_int32();\n  message1.add_repeated_int32(i);\n\n  message1.MergeFrom(message2);\n\n  TestUtil::ExpectAllFieldsSet(message1);\n}\n\n#ifdef GTEST_HAS_DEATH_TEST\n\nTEST(GeneratedMessageTest, MergeFromSelf) {\n  unittest::TestAllTypes message;\n  EXPECT_DEATH(message.MergeFrom(message), \"&from\");\n  EXPECT_DEATH(message.MergeFrom(implicit_cast<const Message&>(message)),\n               \"&from\");\n}\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n// Test the generated SerializeWithCachedSizesToArray(),\nTEST(GeneratedMessageTest, SerializationToArray) {\n  unittest::TestAllTypes message1, message2;\n  string data;\n  TestUtil::SetAllFields(&message1);\n  int size = message1.ByteSize();\n  data.resize(size);\n  uint8* start = reinterpret_cast<uint8*>(string_as_array(&data));\n  uint8* end = message1.SerializeWithCachedSizesToArray(start);\n  EXPECT_EQ(size, end - start);\n  EXPECT_TRUE(message2.ParseFromString(data));\n  TestUtil::ExpectAllFieldsSet(message2);\n\n}\n\nTEST(GeneratedMessageTest, PackedFieldsSerializationToArray) {\n  unittest::TestPackedTypes packed_message1, packed_message2;\n  string packed_data;\n  TestUtil::SetPackedFields(&packed_message1);\n  int packed_size = packed_message1.ByteSize();\n  packed_data.resize(packed_size);\n  uint8* start = reinterpret_cast<uint8*>(string_as_array(&packed_data));\n  uint8* end = packed_message1.SerializeWithCachedSizesToArray(start);\n  EXPECT_EQ(packed_size, end - start);\n  EXPECT_TRUE(packed_message2.ParseFromString(packed_data));\n  TestUtil::ExpectPackedFieldsSet(packed_message2);\n}\n\n// Test the generated SerializeWithCachedSizes() by forcing the buffer to write\n// one byte at a time.\nTEST(GeneratedMessageTest, SerializationToStream) {\n  unittest::TestAllTypes message1, message2;\n  TestUtil::SetAllFields(&message1);\n  int size = message1.ByteSize();\n  string data;\n  data.resize(size);\n  {\n    // Allow the output stream to buffer only one byte at a time.\n    io::ArrayOutputStream array_stream(string_as_array(&data), size, 1);\n    io::CodedOutputStream output_stream(&array_stream);\n    message1.SerializeWithCachedSizes(&output_stream);\n    EXPECT_FALSE(output_stream.HadError());\n    EXPECT_EQ(size, output_stream.ByteCount());\n  }\n  EXPECT_TRUE(message2.ParseFromString(data));\n  TestUtil::ExpectAllFieldsSet(message2);\n\n}\n\nTEST(GeneratedMessageTest, PackedFieldsSerializationToStream) {\n  unittest::TestPackedTypes message1, message2;\n  TestUtil::SetPackedFields(&message1);\n  int size = message1.ByteSize();\n  string data;\n  data.resize(size);\n  {\n    // Allow the output stream to buffer only one byte at a time.\n    io::ArrayOutputStream array_stream(string_as_array(&data), size, 1);\n    io::CodedOutputStream output_stream(&array_stream);\n    message1.SerializeWithCachedSizes(&output_stream);\n    EXPECT_FALSE(output_stream.HadError());\n    EXPECT_EQ(size, output_stream.ByteCount());\n  }\n  EXPECT_TRUE(message2.ParseFromString(data));\n  TestUtil::ExpectPackedFieldsSet(message2);\n}\n\n\nTEST(GeneratedMessageTest, Required) {\n  // Test that IsInitialized() returns false if required fields are missing.\n  unittest::TestRequired message;\n\n  EXPECT_FALSE(message.IsInitialized());\n  message.set_a(1);\n  EXPECT_FALSE(message.IsInitialized());\n  message.set_b(2);\n  EXPECT_FALSE(message.IsInitialized());\n  message.set_c(3);\n  EXPECT_TRUE(message.IsInitialized());\n}\n\nTEST(GeneratedMessageTest, RequiredForeign) {\n  // Test that IsInitialized() returns false if required fields in nested\n  // messages are missing.\n  unittest::TestRequiredForeign message;\n\n  EXPECT_TRUE(message.IsInitialized());\n\n  message.mutable_optional_message();\n  EXPECT_FALSE(message.IsInitialized());\n\n  message.mutable_optional_message()->set_a(1);\n  message.mutable_optional_message()->set_b(2);\n  message.mutable_optional_message()->set_c(3);\n  EXPECT_TRUE(message.IsInitialized());\n\n  message.add_repeated_message();\n  EXPECT_FALSE(message.IsInitialized());\n\n  message.mutable_repeated_message(0)->set_a(1);\n  message.mutable_repeated_message(0)->set_b(2);\n  message.mutable_repeated_message(0)->set_c(3);\n  EXPECT_TRUE(message.IsInitialized());\n}\n\nTEST(GeneratedMessageTest, ForeignNested) {\n  // Test that TestAllTypes::NestedMessage can be embedded directly into\n  // another message.\n  unittest::TestForeignNested message;\n\n  // If this compiles and runs without crashing, it must work.  We have\n  // nothing more to test.\n  unittest::TestAllTypes::NestedMessage* nested =\n    message.mutable_foreign_nested();\n  nested->set_bb(1);\n}\n\nTEST(GeneratedMessageTest, ReallyLargeTagNumber) {\n  // Test that really large tag numbers don't break anything.\n  unittest::TestReallyLargeTagNumber message1, message2;\n  string data;\n\n  // For the most part, if this compiles and runs then we're probably good.\n  // (The most likely cause for failure would be if something were attempting\n  // to allocate a lookup table of some sort using tag numbers as the index.)\n  // We'll try serializing just for fun.\n  message1.set_a(1234);\n  message1.set_bb(5678);\n  message1.SerializeToString(&data);\n  EXPECT_TRUE(message2.ParseFromString(data));\n  EXPECT_EQ(1234, message2.a());\n  EXPECT_EQ(5678, message2.bb());\n}\n\nTEST(GeneratedMessageTest, MutualRecursion) {\n  // Test that mutually-recursive message types work.\n  unittest::TestMutualRecursionA message;\n  unittest::TestMutualRecursionA* nested = message.mutable_bb()->mutable_a();\n  unittest::TestMutualRecursionA* nested2 = nested->mutable_bb()->mutable_a();\n\n  // Again, if the above compiles and runs, that's all we really have to\n  // test, but just for run we'll check that the system didn't somehow come\n  // up with a pointer loop...\n  EXPECT_NE(&message, nested);\n  EXPECT_NE(&message, nested2);\n  EXPECT_NE(nested, nested2);\n}\n\nTEST(GeneratedMessageTest, CamelCaseFieldNames) {\n  // This test is mainly checking that the following compiles, which verifies\n  // that the field names were coerced to lower-case.\n  //\n  // Protocol buffers standard style is to use lowercase-with-underscores for\n  // field names.  Some old proto1 .protos unfortunately used camel-case field\n  // names.  In proto1, these names were forced to lower-case.  So, we do the\n  // same thing in proto2.\n\n  unittest::TestCamelCaseFieldNames message;\n\n  message.set_primitivefield(2);\n  message.set_stringfield(\"foo\");\n  message.set_enumfield(unittest::FOREIGN_FOO);\n  message.mutable_messagefield()->set_c(6);\n\n  message.add_repeatedprimitivefield(8);\n  message.add_repeatedstringfield(\"qux\");\n  message.add_repeatedenumfield(unittest::FOREIGN_BAR);\n  message.add_repeatedmessagefield()->set_c(15);\n\n  EXPECT_EQ(2, message.primitivefield());\n  EXPECT_EQ(\"foo\", message.stringfield());\n  EXPECT_EQ(unittest::FOREIGN_FOO, message.enumfield());\n  EXPECT_EQ(6, message.messagefield().c());\n\n  EXPECT_EQ(8, message.repeatedprimitivefield(0));\n  EXPECT_EQ(\"qux\", message.repeatedstringfield(0));\n  EXPECT_EQ(unittest::FOREIGN_BAR, message.repeatedenumfield(0));\n  EXPECT_EQ(15, message.repeatedmessagefield(0).c());\n}\n\nTEST(GeneratedMessageTest, TestConflictingSymbolNames) {\n  // test_bad_identifiers.proto successfully compiled, then it works.  The\n  // following is just a token usage to insure that the code is, in fact,\n  // being compiled and linked.\n\n  protobuf_unittest::TestConflictingSymbolNames message;\n  message.set_uint32(1);\n  EXPECT_EQ(3, message.ByteSize());\n\n  message.set_friend_(5);\n  EXPECT_EQ(5, message.friend_());\n}\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n\nTEST(GeneratedMessageTest, TestOptimizedForSize) {\n  // We rely on the tests in reflection_ops_unittest and wire_format_unittest\n  // to really test that reflection-based methods work.  Here we are mostly\n  // just making sure that TestOptimizedForSize actually builds and seems to\n  // function.\n\n  protobuf_unittest::TestOptimizedForSize message, message2;\n  message.set_i(1);\n  message.mutable_msg()->set_c(2);\n  message2.CopyFrom(message);\n  EXPECT_EQ(1, message2.i());\n  EXPECT_EQ(2, message2.msg().c());\n}\n\nTEST(GeneratedMessageTest, TestEmbedOptimizedForSize) {\n  // Verifies that something optimized for speed can contain something optimized\n  // for size.\n\n  protobuf_unittest::TestEmbedOptimizedForSize message, message2;\n  message.mutable_optional_message()->set_i(1);\n  message.add_repeated_message()->mutable_msg()->set_c(2);\n  string data;\n  message.SerializeToString(&data);\n  ASSERT_TRUE(message2.ParseFromString(data));\n  EXPECT_EQ(1, message2.optional_message().i());\n  EXPECT_EQ(2, message2.repeated_message(0).msg().c());\n}\n\nTEST(GeneratedMessageTest, TestSpaceUsed) {\n  unittest::TestAllTypes message1;\n  // sizeof provides a lower bound on SpaceUsed().\n  EXPECT_LE(sizeof(unittest::TestAllTypes), message1.SpaceUsed());\n  const int empty_message_size = message1.SpaceUsed();\n\n  // Setting primitive types shouldn't affect the space used.\n  message1.set_optional_int32(123);\n  message1.set_optional_int64(12345);\n  message1.set_optional_uint32(123);\n  message1.set_optional_uint64(12345);\n  EXPECT_EQ(empty_message_size, message1.SpaceUsed());\n\n  // On some STL implementations, setting the string to a small value should\n  // only increase SpaceUsed() by the size of a string object, though this is\n  // not true everywhere.\n  message1.set_optional_string(\"abc\");\n  EXPECT_LE(empty_message_size + sizeof(string), message1.SpaceUsed());\n\n  // Setting a string to a value larger than the string object itself should\n  // increase SpaceUsed(), because it cannot store the value internally.\n  message1.set_optional_string(string(sizeof(string) + 1, 'x'));\n  int min_expected_increase = message1.optional_string().capacity() +\n      sizeof(string);\n  EXPECT_LE(empty_message_size + min_expected_increase,\n            message1.SpaceUsed());\n\n  int previous_size = message1.SpaceUsed();\n  // Adding an optional message should increase the size by the size of the\n  // nested message type. NestedMessage is simple enough (1 int field) that it\n  // is equal to sizeof(NestedMessage)\n  message1.mutable_optional_nested_message();\n  ASSERT_EQ(sizeof(unittest::TestAllTypes::NestedMessage),\n            message1.optional_nested_message().SpaceUsed());\n  EXPECT_EQ(previous_size +\n            sizeof(unittest::TestAllTypes::NestedMessage),\n            message1.SpaceUsed());\n}\n\n#endif  // !PROTOBUF_TEST_NO_DESCRIPTORS\n\n\nTEST(GeneratedMessageTest, FieldConstantValues) {\n  unittest::TestRequired message;\n  EXPECT_EQ(unittest::TestAllTypes_NestedMessage::kBbFieldNumber, 1);\n  EXPECT_EQ(unittest::TestAllTypes::kOptionalInt32FieldNumber, 1);\n  EXPECT_EQ(unittest::TestAllTypes::kOptionalgroupFieldNumber, 16);\n  EXPECT_EQ(unittest::TestAllTypes::kOptionalNestedMessageFieldNumber, 18);\n  EXPECT_EQ(unittest::TestAllTypes::kOptionalNestedEnumFieldNumber, 21);\n  EXPECT_EQ(unittest::TestAllTypes::kRepeatedInt32FieldNumber, 31);\n  EXPECT_EQ(unittest::TestAllTypes::kRepeatedgroupFieldNumber, 46);\n  EXPECT_EQ(unittest::TestAllTypes::kRepeatedNestedMessageFieldNumber, 48);\n  EXPECT_EQ(unittest::TestAllTypes::kRepeatedNestedEnumFieldNumber, 51);\n}\n\nTEST(GeneratedMessageTest, ExtensionConstantValues) {\n  EXPECT_EQ(unittest::TestRequired::kSingleFieldNumber, 1000);\n  EXPECT_EQ(unittest::TestRequired::kMultiFieldNumber, 1001);\n  EXPECT_EQ(unittest::kOptionalInt32ExtensionFieldNumber, 1);\n  EXPECT_EQ(unittest::kOptionalgroupExtensionFieldNumber, 16);\n  EXPECT_EQ(unittest::kOptionalNestedMessageExtensionFieldNumber, 18);\n  EXPECT_EQ(unittest::kOptionalNestedEnumExtensionFieldNumber, 21);\n  EXPECT_EQ(unittest::kRepeatedInt32ExtensionFieldNumber, 31);\n  EXPECT_EQ(unittest::kRepeatedgroupExtensionFieldNumber, 46);\n  EXPECT_EQ(unittest::kRepeatedNestedMessageExtensionFieldNumber, 48);\n  EXPECT_EQ(unittest::kRepeatedNestedEnumExtensionFieldNumber, 51);\n}\n\n// ===================================================================\n\nTEST(GeneratedEnumTest, EnumValuesAsSwitchCases) {\n  // Test that our nested enum values can be used as switch cases.  This test\n  // doesn't actually do anything, the proof that it works is that it\n  // compiles.\n  int i =0;\n  unittest::TestAllTypes::NestedEnum a = unittest::TestAllTypes::BAR;\n  switch (a) {\n    case unittest::TestAllTypes::FOO:\n      i = 1;\n      break;\n    case unittest::TestAllTypes::BAR:\n      i = 2;\n      break;\n    case unittest::TestAllTypes::BAZ:\n      i = 3;\n      break;\n    // no default case:  We want to make sure the compiler recognizes that\n    //   all cases are covered.  (GCC warns if you do not cover all cases of\n    //   an enum in a switch.)\n  }\n\n  // Token check just for fun.\n  EXPECT_EQ(2, i);\n}\n\nTEST(GeneratedEnumTest, IsValidValue) {\n  // Test enum IsValidValue.\n  EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(1));\n  EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(2));\n  EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(3));\n\n  EXPECT_FALSE(unittest::TestAllTypes::NestedEnum_IsValid(0));\n  EXPECT_FALSE(unittest::TestAllTypes::NestedEnum_IsValid(4));\n\n  // Make sure it also works when there are dups.\n  EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(1));\n  EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(2));\n  EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(3));\n\n  EXPECT_FALSE(unittest::TestEnumWithDupValue_IsValid(0));\n  EXPECT_FALSE(unittest::TestEnumWithDupValue_IsValid(4));\n}\n\nTEST(GeneratedEnumTest, MinAndMax) {\n  EXPECT_EQ(unittest::TestAllTypes::FOO,\n            unittest::TestAllTypes::NestedEnum_MIN);\n  EXPECT_EQ(unittest::TestAllTypes::BAZ,\n            unittest::TestAllTypes::NestedEnum_MAX);\n  EXPECT_EQ(4, unittest::TestAllTypes::NestedEnum_ARRAYSIZE);\n\n  EXPECT_EQ(unittest::FOREIGN_FOO, unittest::ForeignEnum_MIN);\n  EXPECT_EQ(unittest::FOREIGN_BAZ, unittest::ForeignEnum_MAX);\n  EXPECT_EQ(7, unittest::ForeignEnum_ARRAYSIZE);\n\n  EXPECT_EQ(1, unittest::TestEnumWithDupValue_MIN);\n  EXPECT_EQ(3, unittest::TestEnumWithDupValue_MAX);\n  EXPECT_EQ(4, unittest::TestEnumWithDupValue_ARRAYSIZE);\n\n  EXPECT_EQ(unittest::SPARSE_E, unittest::TestSparseEnum_MIN);\n  EXPECT_EQ(unittest::SPARSE_C, unittest::TestSparseEnum_MAX);\n  EXPECT_EQ(12589235, unittest::TestSparseEnum_ARRAYSIZE);\n\n  // Make sure we can take the address of _MIN, _MAX and _ARRAYSIZE.\n  void* null_pointer = 0;  // NULL may be integer-type, not pointer-type.\n  EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_MIN);\n  EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_MAX);\n  EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_ARRAYSIZE);\n\n  EXPECT_NE(null_pointer, &unittest::ForeignEnum_MIN);\n  EXPECT_NE(null_pointer, &unittest::ForeignEnum_MAX);\n  EXPECT_NE(null_pointer, &unittest::ForeignEnum_ARRAYSIZE);\n\n  // Make sure we can use _MIN, _MAX and _ARRAYSIZE as switch cases.\n  switch (unittest::SPARSE_A) {\n    case unittest::TestSparseEnum_MIN:\n    case unittest::TestSparseEnum_MAX:\n    case unittest::TestSparseEnum_ARRAYSIZE:\n      break;\n    default:\n      break;\n  }\n}\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n\nTEST(GeneratedEnumTest, Name) {\n  // \"Names\" in the presence of dup values are a bit arbitrary.\n  EXPECT_EQ(\"FOO1\", unittest::TestEnumWithDupValue_Name(unittest::FOO1));\n  EXPECT_EQ(\"FOO1\", unittest::TestEnumWithDupValue_Name(unittest::FOO2));\n\n  EXPECT_EQ(\"SPARSE_A\", unittest::TestSparseEnum_Name(unittest::SPARSE_A));\n  EXPECT_EQ(\"SPARSE_B\", unittest::TestSparseEnum_Name(unittest::SPARSE_B));\n  EXPECT_EQ(\"SPARSE_C\", unittest::TestSparseEnum_Name(unittest::SPARSE_C));\n  EXPECT_EQ(\"SPARSE_D\", unittest::TestSparseEnum_Name(unittest::SPARSE_D));\n  EXPECT_EQ(\"SPARSE_E\", unittest::TestSparseEnum_Name(unittest::SPARSE_E));\n  EXPECT_EQ(\"SPARSE_F\", unittest::TestSparseEnum_Name(unittest::SPARSE_F));\n  EXPECT_EQ(\"SPARSE_G\", unittest::TestSparseEnum_Name(unittest::SPARSE_G));\n}\n\nTEST(GeneratedEnumTest, Parse) {\n  unittest::TestEnumWithDupValue dup_value = unittest::FOO1;\n  EXPECT_TRUE(unittest::TestEnumWithDupValue_Parse(\"FOO1\", &dup_value));\n  EXPECT_EQ(unittest::FOO1, dup_value);\n  EXPECT_TRUE(unittest::TestEnumWithDupValue_Parse(\"FOO2\", &dup_value));\n  EXPECT_EQ(unittest::FOO2, dup_value);\n  EXPECT_FALSE(unittest::TestEnumWithDupValue_Parse(\"FOO\", &dup_value));\n}\n\nTEST(GeneratedEnumTest, GetEnumDescriptor) {\n  EXPECT_EQ(unittest::TestAllTypes::NestedEnum_descriptor(),\n            GetEnumDescriptor<unittest::TestAllTypes::NestedEnum>());\n  EXPECT_EQ(unittest::ForeignEnum_descriptor(),\n            GetEnumDescriptor<unittest::ForeignEnum>());\n  EXPECT_EQ(unittest::TestEnumWithDupValue_descriptor(),\n            GetEnumDescriptor<unittest::TestEnumWithDupValue>());\n  EXPECT_EQ(unittest::TestSparseEnum_descriptor(),\n            GetEnumDescriptor<unittest::TestSparseEnum>());\n}\n\n#endif  // PROTOBUF_TEST_NO_DESCRIPTORS\n\n// ===================================================================\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n\n// Support code for testing services.\nclass GeneratedServiceTest : public testing::Test {\n protected:\n  class MockTestService : public unittest::TestService {\n   public:\n    MockTestService()\n      : called_(false),\n        method_(\"\"),\n        controller_(NULL),\n        request_(NULL),\n        response_(NULL),\n        done_(NULL) {}\n\n    ~MockTestService() {}\n\n    void Reset() { called_ = false; }\n\n    // implements TestService ----------------------------------------\n\n    void Foo(RpcController* controller,\n             const unittest::FooRequest* request,\n             unittest::FooResponse* response,\n             Closure* done) {\n      ASSERT_FALSE(called_);\n      called_ = true;\n      method_ = \"Foo\";\n      controller_ = controller;\n      request_ = request;\n      response_ = response;\n      done_ = done;\n    }\n\n    void Bar(RpcController* controller,\n             const unittest::BarRequest* request,\n             unittest::BarResponse* response,\n             Closure* done) {\n      ASSERT_FALSE(called_);\n      called_ = true;\n      method_ = \"Bar\";\n      controller_ = controller;\n      request_ = request;\n      response_ = response;\n      done_ = done;\n    }\n\n    // ---------------------------------------------------------------\n\n    bool called_;\n    string method_;\n    RpcController* controller_;\n    const Message* request_;\n    Message* response_;\n    Closure* done_;\n  };\n\n  class MockRpcChannel : public RpcChannel {\n   public:\n    MockRpcChannel()\n      : called_(false),\n        method_(NULL),\n        controller_(NULL),\n        request_(NULL),\n        response_(NULL),\n        done_(NULL),\n        destroyed_(NULL) {}\n\n    ~MockRpcChannel() {\n      if (destroyed_ != NULL) *destroyed_ = true;\n    }\n\n    void Reset() { called_ = false; }\n\n    // implements TestService ----------------------------------------\n\n    void CallMethod(const MethodDescriptor* method,\n                    RpcController* controller,\n                    const Message* request,\n                    Message* response,\n                    Closure* done) {\n      ASSERT_FALSE(called_);\n      called_ = true;\n      method_ = method;\n      controller_ = controller;\n      request_ = request;\n      response_ = response;\n      done_ = done;\n    }\n\n    // ---------------------------------------------------------------\n\n    bool called_;\n    const MethodDescriptor* method_;\n    RpcController* controller_;\n    const Message* request_;\n    Message* response_;\n    Closure* done_;\n    bool* destroyed_;\n  };\n\n  class MockController : public RpcController {\n   public:\n    void Reset() {\n      ADD_FAILURE() << \"Reset() not expected during this test.\";\n    }\n    bool Failed() const {\n      ADD_FAILURE() << \"Failed() not expected during this test.\";\n      return false;\n    }\n    string ErrorText() const {\n      ADD_FAILURE() << \"ErrorText() not expected during this test.\";\n      return \"\";\n    }\n    void StartCancel() {\n      ADD_FAILURE() << \"StartCancel() not expected during this test.\";\n    }\n    void SetFailed(const string& reason) {\n      ADD_FAILURE() << \"SetFailed() not expected during this test.\";\n    }\n    bool IsCanceled() const {\n      ADD_FAILURE() << \"IsCanceled() not expected during this test.\";\n      return false;\n    }\n    void NotifyOnCancel(Closure* callback) {\n      ADD_FAILURE() << \"NotifyOnCancel() not expected during this test.\";\n    }\n  };\n\n  GeneratedServiceTest()\n    : descriptor_(unittest::TestService::descriptor()),\n      foo_(descriptor_->FindMethodByName(\"Foo\")),\n      bar_(descriptor_->FindMethodByName(\"Bar\")),\n      stub_(&mock_channel_),\n      done_(NewPermanentCallback(&DoNothing)) {}\n\n  virtual void SetUp() {\n    ASSERT_TRUE(foo_ != NULL);\n    ASSERT_TRUE(bar_ != NULL);\n  }\n\n  const ServiceDescriptor* descriptor_;\n  const MethodDescriptor* foo_;\n  const MethodDescriptor* bar_;\n\n  MockTestService mock_service_;\n  MockController mock_controller_;\n\n  MockRpcChannel mock_channel_;\n  unittest::TestService::Stub stub_;\n\n  // Just so we don't have to re-define these with every test.\n  unittest::FooRequest foo_request_;\n  unittest::FooResponse foo_response_;\n  unittest::BarRequest bar_request_;\n  unittest::BarResponse bar_response_;\n  scoped_ptr<Closure> done_;\n};\n\nTEST_F(GeneratedServiceTest, GetDescriptor) {\n  // Test that GetDescriptor() works.\n\n  EXPECT_EQ(descriptor_, mock_service_.GetDescriptor());\n}\n\nTEST_F(GeneratedServiceTest, GetChannel) {\n  EXPECT_EQ(&mock_channel_, stub_.channel());\n}\n\nTEST_F(GeneratedServiceTest, OwnsChannel) {\n  MockRpcChannel* channel = new MockRpcChannel;\n  bool destroyed = false;\n  channel->destroyed_ = &destroyed;\n\n  {\n    unittest::TestService::Stub owning_stub(channel,\n                                            Service::STUB_OWNS_CHANNEL);\n    EXPECT_FALSE(destroyed);\n  }\n\n  EXPECT_TRUE(destroyed);\n}\n\nTEST_F(GeneratedServiceTest, CallMethod) {\n  // Test that CallMethod() works.\n\n  // Call Foo() via CallMethod().\n  mock_service_.CallMethod(foo_, &mock_controller_,\n                           &foo_request_, &foo_response_, done_.get());\n\n  ASSERT_TRUE(mock_service_.called_);\n\n  EXPECT_EQ(\"Foo\"            , mock_service_.method_    );\n  EXPECT_EQ(&mock_controller_, mock_service_.controller_);\n  EXPECT_EQ(&foo_request_    , mock_service_.request_   );\n  EXPECT_EQ(&foo_response_   , mock_service_.response_  );\n  EXPECT_EQ(done_.get()      , mock_service_.done_      );\n\n  // Try again, but call Bar() instead.\n  mock_service_.Reset();\n  mock_service_.CallMethod(bar_, &mock_controller_,\n                           &bar_request_, &bar_response_, done_.get());\n\n  ASSERT_TRUE(mock_service_.called_);\n  EXPECT_EQ(\"Bar\", mock_service_.method_);\n}\n\nTEST_F(GeneratedServiceTest, CallMethodTypeFailure) {\n  // Verify death if we call Foo() with Bar's message types.\n\n#ifdef GTEST_HAS_DEATH_TEST  // death tests do not work on Windows yet\n  EXPECT_DEBUG_DEATH(\n    mock_service_.CallMethod(foo_, &mock_controller_,\n                             &foo_request_, &bar_response_, done_.get()),\n    \"dynamic_cast\");\n\n  mock_service_.Reset();\n  EXPECT_DEBUG_DEATH(\n    mock_service_.CallMethod(foo_, &mock_controller_,\n                             &bar_request_, &foo_response_, done_.get()),\n    \"dynamic_cast\");\n#endif  // GTEST_HAS_DEATH_TEST\n}\n\nTEST_F(GeneratedServiceTest, GetPrototypes) {\n  // Test Get{Request,Response}Prototype() methods.\n\n  EXPECT_EQ(&unittest::FooRequest::default_instance(),\n            &mock_service_.GetRequestPrototype(foo_));\n  EXPECT_EQ(&unittest::BarRequest::default_instance(),\n            &mock_service_.GetRequestPrototype(bar_));\n\n  EXPECT_EQ(&unittest::FooResponse::default_instance(),\n            &mock_service_.GetResponsePrototype(foo_));\n  EXPECT_EQ(&unittest::BarResponse::default_instance(),\n            &mock_service_.GetResponsePrototype(bar_));\n}\n\nTEST_F(GeneratedServiceTest, Stub) {\n  // Test that the stub class works.\n\n  // Call Foo() via the stub.\n  stub_.Foo(&mock_controller_, &foo_request_, &foo_response_, done_.get());\n\n  ASSERT_TRUE(mock_channel_.called_);\n\n  EXPECT_EQ(foo_             , mock_channel_.method_    );\n  EXPECT_EQ(&mock_controller_, mock_channel_.controller_);\n  EXPECT_EQ(&foo_request_    , mock_channel_.request_   );\n  EXPECT_EQ(&foo_response_   , mock_channel_.response_  );\n  EXPECT_EQ(done_.get()      , mock_channel_.done_      );\n\n  // Call Bar() via the stub.\n  mock_channel_.Reset();\n  stub_.Bar(&mock_controller_, &bar_request_, &bar_response_, done_.get());\n\n  ASSERT_TRUE(mock_channel_.called_);\n  EXPECT_EQ(bar_, mock_channel_.method_);\n}\n\nTEST_F(GeneratedServiceTest, NotImplemented) {\n  // Test that failing to implement a method of a service causes it to fail\n  // with a \"not implemented\" error message.\n\n  // A service which doesn't implement any methods.\n  class UnimplementedService : public unittest::TestService {\n   public:\n    UnimplementedService() {}\n  };\n\n  UnimplementedService unimplemented_service;\n\n  // And a controller which expects to get a \"not implemented\" error.\n  class ExpectUnimplementedController : public MockController {\n   public:\n    ExpectUnimplementedController() : called_(false) {}\n\n    void SetFailed(const string& reason) {\n      EXPECT_FALSE(called_);\n      called_ = true;\n      EXPECT_EQ(\"Method Foo() not implemented.\", reason);\n    }\n\n    bool called_;\n  };\n\n  ExpectUnimplementedController controller;\n\n  // Call Foo.\n  unimplemented_service.Foo(&controller, &foo_request_, &foo_response_,\n                            done_.get());\n\n  EXPECT_TRUE(controller.called_);\n}\n\n}  // namespace cpp_unittest\n}  // namespace cpp\n}  // namespace compiler\n\nnamespace no_generic_services_test {\n  // Verify that no class called \"TestService\" was defined in\n  // unittest_no_generic_services.pb.h by defining a different type by the same\n  // name.  If such a service was generated, this will not compile.\n  struct TestService {\n    int i;\n  };\n}\n\nnamespace compiler {\nnamespace cpp {\nnamespace cpp_unittest {\n\nTEST_F(GeneratedServiceTest, NoGenericServices) {\n  // Verify that non-services in unittest_no_generic_services.proto were\n  // generated.\n  no_generic_services_test::TestMessage message;\n  message.set_a(1);\n  message.SetExtension(no_generic_services_test::test_extension, 123);\n  no_generic_services_test::TestEnum e = no_generic_services_test::FOO;\n  EXPECT_EQ(e, 1);\n\n  // Verify that a ServiceDescriptor is generated for the service even if the\n  // class itself is not.\n  const FileDescriptor* file =\n      no_generic_services_test::TestMessage::descriptor()->file();\n\n  ASSERT_EQ(1, file->service_count());\n  EXPECT_EQ(\"TestService\", file->service(0)->name());\n  ASSERT_EQ(1, file->service(0)->method_count());\n  EXPECT_EQ(\"Foo\", file->service(0)->method(0)->name());\n}\n\n#endif  // !PROTOBUF_TEST_NO_DESCRIPTORS\n\n// ===================================================================\n\n// This test must run last.  It verifies that descriptors were or were not\n// initialized depending on whether PROTOBUF_TEST_NO_DESCRIPTORS was defined.\n// When this is defined, we skip all tests which are expected to trigger\n// descriptor initialization.  This verifies that everything else still works\n// if descriptors are not initialized.\nTEST(DescriptorInitializationTest, Initialized) {\n#ifdef PROTOBUF_TEST_NO_DESCRIPTORS\n  bool should_have_descriptors = false;\n#else\n  bool should_have_descriptors = true;\n#endif\n\n  EXPECT_EQ(should_have_descriptors,\n    DescriptorPool::generated_pool()->InternalIsFileLoaded(\n      \"google/protobuf/unittest.proto\"));\n}\n\n}  // namespace cpp_unittest\n\n}  // namespace cpp\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifdef _MSC_VER\n#include <io.h>\n#else\n#include <unistd.h>\n#endif\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <errno.h>\n\n#include <algorithm>\n\n#include <google/protobuf/compiler/importer.h>\n\n#include <google/protobuf/compiler/parser.h>\n#include <google/protobuf/io/tokenizer.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\n#ifdef _WIN32\n#ifndef F_OK\n#define F_OK 00  // not defined by MSVC for whatever reason\n#endif\n#include <ctype.h>\n#endif\n\n// Returns true if the text looks like a Windows-style absolute path, starting\n// with a drive letter.  Example:  \"C:\\foo\".  TODO(kenton):  Share this with\n// copy in command_line_interface.cc?\nstatic bool IsWindowsAbsolutePath(const string& text) {\n#if defined(_WIN32) || defined(__CYGWIN__)\n  return text.size() >= 3 && text[1] == ':' &&\n         isalpha(text[0]) &&\n         (text[2] == '/' || text[2] == '\\\\') &&\n         text.find_last_of(':') == 1;\n#else\n  return false;\n#endif\n}\n\nMultiFileErrorCollector::~MultiFileErrorCollector() {}\n\n// This class serves two purposes:\n// - It implements the ErrorCollector interface (used by Tokenizer and Parser)\n//   in terms of MultiFileErrorCollector, using a particular filename.\n// - It lets us check if any errors have occurred.\nclass SourceTreeDescriptorDatabase::SingleFileErrorCollector\n    : public io::ErrorCollector {\n public:\n  SingleFileErrorCollector(const string& filename,\n                           MultiFileErrorCollector* multi_file_error_collector)\n    : filename_(filename),\n      multi_file_error_collector_(multi_file_error_collector),\n      had_errors_(false) {}\n  ~SingleFileErrorCollector() {}\n\n  bool had_errors() { return had_errors_; }\n\n  // implements ErrorCollector ---------------------------------------\n  void AddError(int line, int column, const string& message) {\n    if (multi_file_error_collector_ != NULL) {\n      multi_file_error_collector_->AddError(filename_, line, column, message);\n    }\n    had_errors_ = true;\n  }\n\n private:\n  string filename_;\n  MultiFileErrorCollector* multi_file_error_collector_;\n  bool had_errors_;\n};\n\n// ===================================================================\n\nSourceTreeDescriptorDatabase::SourceTreeDescriptorDatabase(\n    SourceTree* source_tree)\n  : source_tree_(source_tree),\n    error_collector_(NULL),\n    using_validation_error_collector_(false),\n    validation_error_collector_(this) {}\n\nSourceTreeDescriptorDatabase::~SourceTreeDescriptorDatabase() {}\n\nbool SourceTreeDescriptorDatabase::FindFileByName(\n    const string& filename, FileDescriptorProto* output) {\n  scoped_ptr<io::ZeroCopyInputStream> input(source_tree_->Open(filename));\n  if (input == NULL) {\n    if (error_collector_ != NULL) {\n      error_collector_->AddError(filename, -1, 0, \"File not found.\");\n    }\n    return false;\n  }\n\n  // Set up the tokenizer and parser.\n  SingleFileErrorCollector file_error_collector(filename, error_collector_);\n  io::Tokenizer tokenizer(input.get(), &file_error_collector);\n\n  Parser parser;\n  if (error_collector_ != NULL) {\n    parser.RecordErrorsTo(&file_error_collector);\n  }\n  if (using_validation_error_collector_) {\n    parser.RecordSourceLocationsTo(&source_locations_);\n  }\n\n  // Parse it.\n  output->set_name(filename);\n  return parser.Parse(&tokenizer, output) &&\n         !file_error_collector.had_errors();\n}\n\nbool SourceTreeDescriptorDatabase::FindFileContainingSymbol(\n    const string& symbol_name, FileDescriptorProto* output) {\n  return false;\n}\n\nbool SourceTreeDescriptorDatabase::FindFileContainingExtension(\n    const string& containing_type, int field_number,\n    FileDescriptorProto* output) {\n  return false;\n}\n\n// -------------------------------------------------------------------\n\nSourceTreeDescriptorDatabase::ValidationErrorCollector::\nValidationErrorCollector(SourceTreeDescriptorDatabase* owner)\n  : owner_(owner) {}\n\nSourceTreeDescriptorDatabase::ValidationErrorCollector::\n~ValidationErrorCollector() {}\n\nvoid SourceTreeDescriptorDatabase::ValidationErrorCollector::AddError(\n    const string& filename,\n    const string& element_name,\n    const Message* descriptor,\n    ErrorLocation location,\n    const string& message) {\n  if (owner_->error_collector_ == NULL) return;\n\n  int line, column;\n  owner_->source_locations_.Find(descriptor, location, &line, &column);\n  owner_->error_collector_->AddError(filename, line, column, message);\n}\n\n// ===================================================================\n\nImporter::Importer(SourceTree* source_tree,\n                   MultiFileErrorCollector* error_collector)\n  : database_(source_tree),\n    pool_(&database_, database_.GetValidationErrorCollector()) {\n  database_.RecordErrorsTo(error_collector);\n}\n\nImporter::~Importer() {}\n\nconst FileDescriptor* Importer::Import(const string& filename) {\n  return pool_.FindFileByName(filename);\n}\n\n// ===================================================================\n\nSourceTree::~SourceTree() {}\n\nDiskSourceTree::DiskSourceTree() {}\n\nDiskSourceTree::~DiskSourceTree() {}\n\nstatic inline char LastChar(const string& str) {\n  return str[str.size() - 1];\n}\n\n// Given a path, returns an equivalent path with these changes:\n// - On Windows, any backslashes are replaced with forward slashes.\n// - Any instances of the directory \".\" are removed.\n// - Any consecutive '/'s are collapsed into a single slash.\n// Note that the resulting string may be empty.\n//\n// TODO(kenton):  It would be nice to handle \"..\", e.g. so that we can figure\n//   out that \"foo/bar.proto\" is inside \"baz/../foo\".  However, if baz is a\n//   symlink or doesn't exist, then things get complicated, and we can't\n//   actually determine this without investigating the filesystem, probably\n//   in non-portable ways.  So, we punt.\n//\n// TODO(kenton):  It would be nice to use realpath() here except that it\n//   resolves symbolic links.  This could cause problems if people place\n//   symbolic links in their source tree.  For example, if you executed:\n//     protoc --proto_path=foo foo/bar/baz.proto\n//   then if foo/bar is a symbolic link, foo/bar/baz.proto will canonicalize\n//   to a path which does not appear to be under foo, and thus the compiler\n//   will complain that baz.proto is not inside the --proto_path.\nstatic string CanonicalizePath(string path) {\n#ifdef _WIN32\n  // The Win32 API accepts forward slashes as a path delimiter even though\n  // backslashes are standard.  Let's avoid confusion and use only forward\n  // slashes.\n  if (HasPrefixString(path, \"\\\\\\\\\")) {\n    // Avoid converting two leading backslashes.\n    path = \"\\\\\\\\\" + StringReplace(path.substr(2), \"\\\\\", \"/\", true);\n  } else {\n    path = StringReplace(path, \"\\\\\", \"/\", true);\n  }\n#endif\n\n  vector<string> parts;\n  vector<string> canonical_parts;\n  SplitStringUsing(path, \"/\", &parts);  // Note:  Removes empty parts.\n  for (int i = 0; i < parts.size(); i++) {\n    if (parts[i] == \".\") {\n      // Ignore.\n    } else {\n      canonical_parts.push_back(parts[i]);\n    }\n  }\n  string result = JoinStrings(canonical_parts, \"/\");\n  if (!path.empty() && path[0] == '/') {\n    // Restore leading slash.\n    result = '/' + result;\n  }\n  if (!path.empty() && LastChar(path) == '/' &&\n      !result.empty() && LastChar(result) != '/') {\n    // Restore trailing slash.\n    result += '/';\n  }\n  return result;\n}\n\nstatic inline bool ContainsParentReference(const string& path) {\n  return path == \"..\" ||\n         HasPrefixString(path, \"../\") ||\n         HasSuffixString(path, \"/..\") ||\n         path.find(\"/../\") != string::npos;\n}\n\n// Maps a file from an old location to a new one.  Typically, old_prefix is\n// a virtual path and new_prefix is its corresponding disk path.  Returns\n// false if the filename did not start with old_prefix, otherwise replaces\n// old_prefix with new_prefix and stores the result in *result.  Examples:\n//   string result;\n//   assert(ApplyMapping(\"foo/bar\", \"\", \"baz\", &result));\n//   assert(result == \"baz/foo/bar\");\n//\n//   assert(ApplyMapping(\"foo/bar\", \"foo\", \"baz\", &result));\n//   assert(result == \"baz/bar\");\n//\n//   assert(ApplyMapping(\"foo\", \"foo\", \"bar\", &result));\n//   assert(result == \"bar\");\n//\n//   assert(!ApplyMapping(\"foo/bar\", \"baz\", \"qux\", &result));\n//   assert(!ApplyMapping(\"foo/bar\", \"baz\", \"qux\", &result));\n//   assert(!ApplyMapping(\"foobar\", \"foo\", \"baz\", &result));\nstatic bool ApplyMapping(const string& filename,\n                         const string& old_prefix,\n                         const string& new_prefix,\n                         string* result) {\n  if (old_prefix.empty()) {\n    // old_prefix matches any relative path.\n    if (ContainsParentReference(filename)) {\n      // We do not allow the file name to use \"..\".\n      return false;\n    }\n    if (HasPrefixString(filename, \"/\") ||\n        IsWindowsAbsolutePath(filename)) {\n      // This is an absolute path, so it isn't matched by the empty string.\n      return false;\n    }\n    result->assign(new_prefix);\n    if (!result->empty()) result->push_back('/');\n    result->append(filename);\n    return true;\n  } else if (HasPrefixString(filename, old_prefix)) {\n    // old_prefix is a prefix of the filename.  Is it the whole filename?\n    if (filename.size() == old_prefix.size()) {\n      // Yep, it's an exact match.\n      *result = new_prefix;\n      return true;\n    } else {\n      // Not an exact match.  Is the next character a '/'?  Otherwise,\n      // this isn't actually a match at all.  E.g. the prefix \"foo/bar\"\n      // does not match the filename \"foo/barbaz\".\n      int after_prefix_start = -1;\n      if (filename[old_prefix.size()] == '/') {\n        after_prefix_start = old_prefix.size() + 1;\n      } else if (filename[old_prefix.size() - 1] == '/') {\n        // old_prefix is never empty, and canonicalized paths never have\n        // consecutive '/' characters.\n        after_prefix_start = old_prefix.size();\n      }\n      if (after_prefix_start != -1) {\n        // Yep.  So the prefixes are directories and the filename is a file\n        // inside them.\n        string after_prefix = filename.substr(after_prefix_start);\n        if (ContainsParentReference(after_prefix)) {\n          // We do not allow the file name to use \"..\".\n          return false;\n        }\n        result->assign(new_prefix);\n        if (!result->empty()) result->push_back('/');\n        result->append(after_prefix);\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nvoid DiskSourceTree::MapPath(const string& virtual_path,\n                             const string& disk_path) {\n  mappings_.push_back(Mapping(virtual_path, CanonicalizePath(disk_path)));\n}\n\nDiskSourceTree::DiskFileToVirtualFileResult\nDiskSourceTree::DiskFileToVirtualFile(\n    const string& disk_file,\n    string* virtual_file,\n    string* shadowing_disk_file) {\n  int mapping_index = -1;\n  string canonical_disk_file = CanonicalizePath(disk_file);\n\n  for (int i = 0; i < mappings_.size(); i++) {\n    // Apply the mapping in reverse.\n    if (ApplyMapping(canonical_disk_file, mappings_[i].disk_path,\n                     mappings_[i].virtual_path, virtual_file)) {\n      // Success.\n      mapping_index = i;\n      break;\n    }\n  }\n\n  if (mapping_index == -1) {\n    return NO_MAPPING;\n  }\n\n  // Iterate through all mappings with higher precedence and verify that none\n  // of them map this file to some other existing file.\n  for (int i = 0; i < mapping_index; i++) {\n    if (ApplyMapping(*virtual_file, mappings_[i].virtual_path,\n                     mappings_[i].disk_path, shadowing_disk_file)) {\n      if (access(shadowing_disk_file->c_str(), F_OK) >= 0) {\n        // File exists.\n        return SHADOWED;\n      }\n    }\n  }\n  shadowing_disk_file->clear();\n\n  // Verify that we can open the file.  Note that this also has the side-effect\n  // of verifying that we are not canonicalizing away any non-existent\n  // directories.\n  scoped_ptr<io::ZeroCopyInputStream> stream(OpenDiskFile(disk_file));\n  if (stream == NULL) {\n    return CANNOT_OPEN;\n  }\n\n  return SUCCESS;\n}\n\nbool DiskSourceTree::VirtualFileToDiskFile(const string& virtual_file,\n                                           string* disk_file) {\n  scoped_ptr<io::ZeroCopyInputStream> stream(OpenVirtualFile(virtual_file,\n                                                             disk_file));\n  return stream != NULL;\n}\n\nio::ZeroCopyInputStream* DiskSourceTree::Open(const string& filename) {\n  return OpenVirtualFile(filename, NULL);\n}\n\nio::ZeroCopyInputStream* DiskSourceTree::OpenVirtualFile(\n    const string& virtual_file,\n    string* disk_file) {\n  if (virtual_file != CanonicalizePath(virtual_file) ||\n      ContainsParentReference(virtual_file)) {\n    // We do not allow importing of paths containing things like \"..\" or\n    // consecutive slashes since the compiler expects files to be uniquely\n    // identified by file name.\n    return NULL;\n  }\n\n  for (int i = 0; i < mappings_.size(); i++) {\n    string temp_disk_file;\n    if (ApplyMapping(virtual_file, mappings_[i].virtual_path,\n                     mappings_[i].disk_path, &temp_disk_file)) {\n      io::ZeroCopyInputStream* stream = OpenDiskFile(temp_disk_file);\n      if (stream != NULL) {\n        if (disk_file != NULL) {\n          *disk_file = temp_disk_file;\n        }\n        return stream;\n      }\n\n      if (errno == EACCES) {\n        // The file exists but is not readable.\n        // TODO(kenton):  Find a way to report this more nicely.\n        GOOGLE_LOG(WARNING) << \"Read access is denied for file: \" << temp_disk_file;\n        return NULL;\n      }\n    }\n  }\n\n  return NULL;\n}\n\nio::ZeroCopyInputStream* DiskSourceTree::OpenDiskFile(\n    const string& filename) {\n  int file_descriptor;\n  do {\n    file_descriptor = open(filename.c_str(), O_RDONLY);\n  } while (file_descriptor < 0 && errno == EINTR);\n  if (file_descriptor >= 0) {\n    io::FileInputStream* result = new io::FileInputStream(file_descriptor);\n    result->SetCloseOnDelete(true);\n    return result;\n  } else {\n    return NULL;\n  }\n}\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file is the public interface to the .proto file parser.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_IMPORTER_H__\n#define GOOGLE_PROTOBUF_COMPILER_IMPORTER_H__\n\n#include <string>\n#include <vector>\n#include <set>\n#include <utility>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/descriptor_database.h>\n#include <google/protobuf/compiler/parser.h>\n\nnamespace google {\nnamespace protobuf {\n\nnamespace io { class ZeroCopyInputStream; }\n\nnamespace compiler {\n\n// Defined in this file.\nclass Importer;\nclass MultiFileErrorCollector;\nclass SourceTree;\nclass DiskSourceTree;\n\n// TODO(kenton):  Move all SourceTree stuff to a separate file?\n\n// An implementation of DescriptorDatabase which loads files from a SourceTree\n// and parses them.\n//\n// Note:  This class is not thread-safe since it maintains a table of source\n//   code locations for error reporting.  However, when a DescriptorPool wraps\n//   a DescriptorDatabase, it uses mutex locking to make sure only one method\n//   of the database is called at a time, even if the DescriptorPool is used\n//   from multiple threads.  Therefore, there is only a problem if you create\n//   multiple DescriptorPools wrapping the same SourceTreeDescriptorDatabase\n//   and use them from multiple threads.\n//\n// Note:  This class does not implement FindFileContainingSymbol() or\n//   FindFileContainingExtension(); these will always return false.\nclass LIBPROTOBUF_EXPORT SourceTreeDescriptorDatabase : public DescriptorDatabase {\n public:\n  SourceTreeDescriptorDatabase(SourceTree* source_tree);\n  ~SourceTreeDescriptorDatabase();\n\n  // Instructs the SourceTreeDescriptorDatabase to report any parse errors\n  // to the given MultiFileErrorCollector.  This should be called before\n  // parsing.  error_collector must remain valid until either this method\n  // is called again or the SourceTreeDescriptorDatabase is destroyed.\n  void RecordErrorsTo(MultiFileErrorCollector* error_collector) {\n    error_collector_ = error_collector;\n  }\n\n  // Gets a DescriptorPool::ErrorCollector which records errors to the\n  // MultiFileErrorCollector specified with RecordErrorsTo().  This collector\n  // has the ability to determine exact line and column numbers of errors\n  // from the information given to it by the DescriptorPool.\n  DescriptorPool::ErrorCollector* GetValidationErrorCollector() {\n    using_validation_error_collector_ = true;\n    return &validation_error_collector_;\n  }\n\n  // implements DescriptorDatabase -----------------------------------\n  bool FindFileByName(const string& filename, FileDescriptorProto* output);\n  bool FindFileContainingSymbol(const string& symbol_name,\n                                FileDescriptorProto* output);\n  bool FindFileContainingExtension(const string& containing_type,\n                                   int field_number,\n                                   FileDescriptorProto* output);\n\n private:\n  class SingleFileErrorCollector;\n\n  SourceTree* source_tree_;\n  MultiFileErrorCollector* error_collector_;\n\n  class LIBPROTOBUF_EXPORT ValidationErrorCollector : public DescriptorPool::ErrorCollector {\n   public:\n    ValidationErrorCollector(SourceTreeDescriptorDatabase* owner);\n    ~ValidationErrorCollector();\n\n    // implements ErrorCollector ---------------------------------------\n    void AddError(const string& filename,\n                  const string& element_name,\n                  const Message* descriptor,\n                  ErrorLocation location,\n                  const string& message);\n\n   private:\n    SourceTreeDescriptorDatabase* owner_;\n  };\n  friend class ValidationErrorCollector;\n\n  bool using_validation_error_collector_;\n  SourceLocationTable source_locations_;\n  ValidationErrorCollector validation_error_collector_;\n};\n\n// Simple interface for parsing .proto files.  This wraps the process\n// of opening the file, parsing it with a Parser, recursively parsing all its\n// imports, and then cross-linking the results to produce a FileDescriptor.\n//\n// This is really just a thin wrapper around SourceTreeDescriptorDatabase.\n// You may find that SourceTreeDescriptorDatabase is more flexible.\n//\n// TODO(kenton):  I feel like this class is not well-named.\nclass LIBPROTOBUF_EXPORT Importer {\n public:\n  Importer(SourceTree* source_tree,\n           MultiFileErrorCollector* error_collector);\n  ~Importer();\n\n  // Import the given file and build a FileDescriptor representing it.  If\n  // the file is already in the DescriptorPool, the existing FileDescriptor\n  // will be returned.  The FileDescriptor is property of the DescriptorPool,\n  // and will remain valid until it is destroyed.  If any errors occur, they\n  // will be reported using the error collector and Import() will return NULL.\n  //\n  // A particular Importer object will only report errors for a particular\n  // file once.  All future attempts to import the same file will return NULL\n  // without reporting any errors.  The idea is that you might want to import\n  // a lot of files without seeing the same errors over and over again.  If\n  // you want to see errors for the same files repeatedly, you can use a\n  // separate Importer object to import each one (but use the same\n  // DescriptorPool so that they can be cross-linked).\n  const FileDescriptor* Import(const string& filename);\n\n  // The DescriptorPool in which all imported FileDescriptors and their\n  // contents are stored.\n  inline const DescriptorPool* pool() const {\n    return &pool_;\n  }\n\n private:\n  SourceTreeDescriptorDatabase database_;\n  DescriptorPool pool_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Importer);\n};\n\n// If the importer encounters problems while trying to import the proto files,\n// it reports them to a MultiFileErrorCollector.\nclass LIBPROTOBUF_EXPORT MultiFileErrorCollector {\n public:\n  inline MultiFileErrorCollector() {}\n  virtual ~MultiFileErrorCollector();\n\n  // Line and column numbers are zero-based.  A line number of -1 indicates\n  // an error with the entire file (e.g. \"not found\").\n  virtual void AddError(const string& filename, int line, int column,\n                        const string& message) = 0;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MultiFileErrorCollector);\n};\n\n// Abstract interface which represents a directory tree containing proto files.\n// Used by the default implementation of Importer to resolve import statements\n// Most users will probably want to use the DiskSourceTree implementation,\n// below.\nclass LIBPROTOBUF_EXPORT SourceTree {\n public:\n  inline SourceTree() {}\n  virtual ~SourceTree();\n\n  // Open the given file and return a stream that reads it, or NULL if not\n  // found.  The caller takes ownership of the returned object.  The filename\n  // must be a path relative to the root of the source tree and must not\n  // contain \".\" or \"..\" components.\n  virtual io::ZeroCopyInputStream* Open(const string& filename) = 0;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SourceTree);\n};\n\n// An implementation of SourceTree which loads files from locations on disk.\n// Multiple mappings can be set up to map locations in the DiskSourceTree to\n// locations in the physical filesystem.\nclass LIBPROTOBUF_EXPORT DiskSourceTree : public SourceTree {\n public:\n  DiskSourceTree();\n  ~DiskSourceTree();\n\n  // Map a path on disk to a location in the SourceTree.  The path may be\n  // either a file or a directory.  If it is a directory, the entire tree\n  // under it will be mapped to the given virtual location.  To map a directory\n  // to the root of the source tree, pass an empty string for virtual_path.\n  //\n  // If multiple mapped paths apply when opening a file, they will be searched\n  // in order.  For example, if you do:\n  //   MapPath(\"bar\", \"foo/bar\");\n  //   MapPath(\"\", \"baz\");\n  // and then you do:\n  //   Open(\"bar/qux\");\n  // the DiskSourceTree will first try to open foo/bar/qux, then baz/bar/qux,\n  // returning the first one that opens successfuly.\n  //\n  // disk_path may be an absolute path or relative to the current directory,\n  // just like a path you'd pass to open().\n  void MapPath(const string& virtual_path, const string& disk_path);\n\n  // Return type for DiskFileToVirtualFile().\n  enum DiskFileToVirtualFileResult {\n    SUCCESS,\n    SHADOWED,\n    CANNOT_OPEN,\n    NO_MAPPING\n  };\n\n  // Given a path to a file on disk, find a virtual path mapping to that\n  // file.  The first mapping created with MapPath() whose disk_path contains\n  // the filename is used.  However, that virtual path may not actually be\n  // usable to open the given file.  Possible return values are:\n  // * SUCCESS: The mapping was found.  *virtual_file is filled in so that\n  //   calling Open(*virtual_file) will open the file named by disk_file.\n  // * SHADOWED: A mapping was found, but using Open() to open this virtual\n  //   path will end up returning some different file.  This is because some\n  //   other mapping with a higher precedence also matches this virtual path\n  //   and maps it to a different file that exists on disk.  *virtual_file\n  //   is filled in as it would be in the SUCCESS case.  *shadowing_disk_file\n  //   is filled in with the disk path of the file which would be opened if\n  //   you were to call Open(*virtual_file).\n  // * CANNOT_OPEN: The mapping was found and was not shadowed, but the\n  //   file specified cannot be opened.  When this value is returned,\n  //   errno will indicate the reason the file cannot be opened.  *virtual_file\n  //   will be set to the virtual path as in the SUCCESS case, even though\n  //   it is not useful.\n  // * NO_MAPPING: Indicates that no mapping was found which contains this\n  //   file.\n  DiskFileToVirtualFileResult\n    DiskFileToVirtualFile(const string& disk_file,\n                          string* virtual_file,\n                          string* shadowing_disk_file);\n\n  // Given a virtual path, find the path to the file on disk.\n  // Return true and update disk_file with the on-disk path if the file exists.\n  // Return false and leave disk_file untouched if the file doesn't exist.\n  bool VirtualFileToDiskFile(const string& virtual_file, string* disk_file);\n\n  // implements SourceTree -------------------------------------------\n  io::ZeroCopyInputStream* Open(const string& filename);\n\n private:\n  struct Mapping {\n    string virtual_path;\n    string disk_path;\n\n    inline Mapping(const string& virtual_path, const string& disk_path)\n      : virtual_path(virtual_path), disk_path(disk_path) {}\n  };\n  vector<Mapping> mappings_;\n\n  // Like Open(), but returns the on-disk path in disk_file if disk_file is\n  // non-NULL and the file could be successfully opened.\n  io::ZeroCopyInputStream* OpenVirtualFile(const string& virtual_file,\n                                           string* disk_file);\n\n  // Like Open() but given the actual on-disk path.\n  io::ZeroCopyInputStream* OpenDiskFile(const string& filename);\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DiskSourceTree);\n};\n\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_IMPORTER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/stubs/hash.h>\n\n#include <google/protobuf/compiler/importer.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n\n#include <google/protobuf/stubs/map-util.h>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/testing/file.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\nnamespace {\n\n#define EXPECT_SUBSTRING(needle, haystack) \\\n  EXPECT_PRED_FORMAT2(testing::IsSubstring, (needle), (haystack))\n\nclass MockErrorCollector : public MultiFileErrorCollector {\n public:\n  MockErrorCollector() {}\n  ~MockErrorCollector() {}\n\n  string text_;\n\n  // implements ErrorCollector ---------------------------------------\n  void AddError(const string& filename, int line, int column,\n                const string& message) {\n    strings::SubstituteAndAppend(&text_, \"$0:$1:$2: $3\\n\",\n                                 filename, line, column, message);\n  }\n};\n\n// -------------------------------------------------------------------\n\n// A dummy implementation of SourceTree backed by a simple map.\nclass MockSourceTree : public SourceTree {\n public:\n  MockSourceTree() {}\n  ~MockSourceTree() {}\n\n  void AddFile(const string& name, const char* contents) {\n    files_[name] = contents;\n  }\n\n  // implements SourceTree -------------------------------------------\n  io::ZeroCopyInputStream* Open(const string& filename) {\n    const char* contents = FindPtrOrNull(files_, filename);\n    if (contents == NULL) {\n      return NULL;\n    } else {\n      return new io::ArrayInputStream(contents, strlen(contents));\n    }\n  }\n\n private:\n  hash_map<string, const char*> files_;\n};\n\n// ===================================================================\n\nclass ImporterTest : public testing::Test {\n protected:\n  ImporterTest()\n    : importer_(&source_tree_, &error_collector_) {}\n\n  void AddFile(const string& filename, const char* text) {\n    source_tree_.AddFile(filename, text);\n  }\n\n  // Return the collected error text\n  string error() const { return error_collector_.text_; }\n\n  MockErrorCollector error_collector_;\n  MockSourceTree source_tree_;\n  Importer importer_;\n};\n\nTEST_F(ImporterTest, Import) {\n  // Test normal importing.\n  AddFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Foo {}\\n\");\n\n  const FileDescriptor* file = importer_.Import(\"foo.proto\");\n  EXPECT_EQ(\"\", error_collector_.text_);\n  ASSERT_TRUE(file != NULL);\n\n  ASSERT_EQ(1, file->message_type_count());\n  EXPECT_EQ(\"Foo\", file->message_type(0)->name());\n\n  // Importing again should return same object.\n  EXPECT_EQ(file, importer_.Import(\"foo.proto\"));\n}\n\nTEST_F(ImporterTest, ImportNested) {\n  // Test that importing a file which imports another file works.\n  AddFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"import \\\"bar.proto\\\";\\n\"\n    \"message Foo {\\n\"\n    \"  optional Bar bar = 1;\\n\"\n    \"}\\n\");\n  AddFile(\"bar.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message Bar {}\\n\");\n\n  // Note that both files are actually parsed by the first call to Import()\n  // here, since foo.proto imports bar.proto.  The second call just returns\n  // the same ProtoFile for bar.proto which was constructed while importing\n  // foo.proto.  We test that this is the case below by checking that bar\n  // is among foo's dependencies (by pointer).\n  const FileDescriptor* foo = importer_.Import(\"foo.proto\");\n  const FileDescriptor* bar = importer_.Import(\"bar.proto\");\n  EXPECT_EQ(\"\", error_collector_.text_);\n  ASSERT_TRUE(foo != NULL);\n  ASSERT_TRUE(bar != NULL);\n\n  // Check that foo's dependency is the same object as bar.\n  ASSERT_EQ(1, foo->dependency_count());\n  EXPECT_EQ(bar, foo->dependency(0));\n\n  // Check that foo properly cross-links bar.\n  ASSERT_EQ(1, foo->message_type_count());\n  ASSERT_EQ(1, bar->message_type_count());\n  ASSERT_EQ(1, foo->message_type(0)->field_count());\n  ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE,\n            foo->message_type(0)->field(0)->type());\n  EXPECT_EQ(bar->message_type(0),\n            foo->message_type(0)->field(0)->message_type());\n}\n\nTEST_F(ImporterTest, FileNotFound) {\n  // Error:  Parsing a file that doesn't exist.\n  EXPECT_TRUE(importer_.Import(\"foo.proto\") == NULL);\n  EXPECT_EQ(\n    \"foo.proto:-1:0: File not found.\\n\",\n    error_collector_.text_);\n}\n\nTEST_F(ImporterTest, ImportNotFound) {\n  // Error:  Importing a file that doesn't exist.\n  AddFile(\"foo.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"import \\\"bar.proto\\\";\\n\");\n\n  EXPECT_TRUE(importer_.Import(\"foo.proto\") == NULL);\n  EXPECT_EQ(\n    \"bar.proto:-1:0: File not found.\\n\"\n    \"foo.proto:-1:0: Import \\\"bar.proto\\\" was not found or had errors.\\n\",\n    error_collector_.text_);\n}\n\nTEST_F(ImporterTest, RecursiveImport) {\n  // Error:  Recursive import.\n  AddFile(\"recursive1.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"import \\\"recursive2.proto\\\";\\n\");\n  AddFile(\"recursive2.proto\",\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"import \\\"recursive1.proto\\\";\\n\");\n\n  EXPECT_TRUE(importer_.Import(\"recursive1.proto\") == NULL);\n  EXPECT_EQ(\n    \"recursive1.proto:-1:0: File recursively imports itself: recursive1.proto \"\n      \"-> recursive2.proto -> recursive1.proto\\n\"\n    \"recursive2.proto:-1:0: Import \\\"recursive1.proto\\\" was not found \"\n      \"or had errors.\\n\"\n    \"recursive1.proto:-1:0: Import \\\"recursive2.proto\\\" was not found \"\n      \"or had errors.\\n\",\n    error_collector_.text_);\n}\n\n// TODO(sanjay): The MapField tests below more properly belong in\n// descriptor_unittest, but are more convenient to test here.\nTEST_F(ImporterTest, MapFieldValid) {\n  AddFile(\n      \"map.proto\",\n      \"syntax = \\\"proto2\\\";\\n\"\n      \"message Item {\\n\"\n      \"  required string key = 1;\\n\"\n      \"}\\n\"\n      \"message Map {\\n\"\n      \"  repeated Item items = 1 [experimental_map_key = \\\"key\\\"];\\n\"\n      \"}\\n\"\n      );\n  const FileDescriptor* file = importer_.Import(\"map.proto\");\n  ASSERT_TRUE(file != NULL) << error_collector_.text_;\n  EXPECT_EQ(\"\", error_collector_.text_);\n\n  // Check that Map::items points to Item::key\n  const Descriptor* item_type = file->FindMessageTypeByName(\"Item\");\n  ASSERT_TRUE(item_type != NULL);\n  const Descriptor* map_type = file->FindMessageTypeByName(\"Map\");\n  ASSERT_TRUE(map_type != NULL);\n  const FieldDescriptor* key_field = item_type->FindFieldByName(\"key\");\n  ASSERT_TRUE(key_field != NULL);\n  const FieldDescriptor* items_field = map_type->FindFieldByName(\"items\");\n  ASSERT_TRUE(items_field != NULL);\n  EXPECT_EQ(items_field->experimental_map_key(), key_field);\n}\n\nTEST_F(ImporterTest, MapFieldNotRepeated) {\n  AddFile(\n      \"map.proto\",\n      \"syntax = \\\"proto2\\\";\\n\"\n      \"message Item {\\n\"\n      \"  required string key = 1;\\n\"\n      \"}\\n\"\n      \"message Map {\\n\"\n      \"  required Item items = 1 [experimental_map_key = \\\"key\\\"];\\n\"\n      \"}\\n\"\n      );\n  EXPECT_TRUE(importer_.Import(\"map.proto\") == NULL);\n  EXPECT_SUBSTRING(\"only allowed for repeated fields\", error());\n}\n\nTEST_F(ImporterTest, MapFieldNotMessageType) {\n  AddFile(\n      \"map.proto\",\n      \"syntax = \\\"proto2\\\";\\n\"\n      \"message Map {\\n\"\n      \"  repeated int32 items = 1 [experimental_map_key = \\\"key\\\"];\\n\"\n      \"}\\n\"\n      );\n  EXPECT_TRUE(importer_.Import(\"map.proto\") == NULL);\n  EXPECT_SUBSTRING(\"only allowed for fields with a message type\", error());\n}\n\nTEST_F(ImporterTest, MapFieldTypeNotFound) {\n  AddFile(\n      \"map.proto\",\n      \"syntax = \\\"proto2\\\";\\n\"\n      \"message Map {\\n\"\n      \"  repeated Unknown items = 1 [experimental_map_key = \\\"key\\\"];\\n\"\n      \"}\\n\"\n      );\n  EXPECT_TRUE(importer_.Import(\"map.proto\") == NULL);\n  EXPECT_SUBSTRING(\"not defined\", error());\n}\n\nTEST_F(ImporterTest, MapFieldKeyNotFound) {\n  AddFile(\n      \"map.proto\",\n      \"syntax = \\\"proto2\\\";\\n\"\n      \"message Item {\\n\"\n      \"  required string key = 1;\\n\"\n      \"}\\n\"\n      \"message Map {\\n\"\n      \"  repeated Item items = 1 [experimental_map_key = \\\"badkey\\\"];\\n\"\n      \"}\\n\"\n      );\n  EXPECT_TRUE(importer_.Import(\"map.proto\") == NULL);\n  EXPECT_SUBSTRING(\"Could not find field\", error());\n}\n\nTEST_F(ImporterTest, MapFieldKeyRepeated) {\n  AddFile(\n      \"map.proto\",\n      \"syntax = \\\"proto2\\\";\\n\"\n      \"message Item {\\n\"\n      \"  repeated string key = 1;\\n\"\n      \"}\\n\"\n      \"message Map {\\n\"\n      \"  repeated Item items = 1 [experimental_map_key = \\\"key\\\"];\\n\"\n      \"}\\n\"\n      );\n  EXPECT_TRUE(importer_.Import(\"map.proto\") == NULL);\n  EXPECT_SUBSTRING(\"must not name a repeated field\", error());\n}\n\nTEST_F(ImporterTest, MapFieldKeyNotScalar) {\n  AddFile(\n      \"map.proto\",\n      \"syntax = \\\"proto2\\\";\\n\"\n      \"message ItemKey { }\\n\"\n      \"message Item {\\n\"\n      \"  required ItemKey key = 1;\\n\"\n      \"}\\n\"\n      \"message Map {\\n\"\n      \"  repeated Item items = 1 [experimental_map_key = \\\"key\\\"];\\n\"\n      \"}\\n\"\n      );\n  EXPECT_TRUE(importer_.Import(\"map.proto\") == NULL);\n  EXPECT_SUBSTRING(\"must name a scalar or string\", error());\n}\n\n// ===================================================================\n\nclass DiskSourceTreeTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    dirnames_.push_back(TestTempDir() + \"/test_proto2_import_path_1\");\n    dirnames_.push_back(TestTempDir() + \"/test_proto2_import_path_2\");\n\n    for (int i = 0; i < dirnames_.size(); i++) {\n      if (File::Exists(dirnames_[i])) {\n        File::DeleteRecursively(dirnames_[i], NULL, NULL);\n      }\n      GOOGLE_CHECK(File::CreateDir(dirnames_[i].c_str(), DEFAULT_FILE_MODE));\n    }\n  }\n\n  virtual void TearDown() {\n    for (int i = 0; i < dirnames_.size(); i++) {\n      File::DeleteRecursively(dirnames_[i], NULL, NULL);\n    }\n  }\n\n  void AddFile(const string& filename, const char* contents) {\n    File::WriteStringToFileOrDie(contents, filename);\n  }\n\n  void AddSubdir(const string& dirname) {\n    GOOGLE_CHECK(File::CreateDir(dirname.c_str(), DEFAULT_FILE_MODE));\n  }\n\n  void ExpectFileContents(const string& filename,\n                          const char* expected_contents) {\n    scoped_ptr<io::ZeroCopyInputStream> input(source_tree_.Open(filename));\n\n    ASSERT_FALSE(input == NULL);\n\n    // Read all the data from the file.\n    string file_contents;\n    const void* data;\n    int size;\n    while (input->Next(&data, &size)) {\n      file_contents.append(reinterpret_cast<const char*>(data), size);\n    }\n\n    EXPECT_EQ(expected_contents, file_contents);\n  }\n\n  void ExpectFileNotFound(const string& filename) {\n    scoped_ptr<io::ZeroCopyInputStream> input(source_tree_.Open(filename));\n    EXPECT_TRUE(input == NULL);\n  }\n\n  DiskSourceTree source_tree_;\n\n  // Paths of two on-disk directories to use during the test.\n  vector<string> dirnames_;\n};\n\nTEST_F(DiskSourceTreeTest, MapRoot) {\n  // Test opening a file in a directory that is mapped to the root of the\n  // source tree.\n  AddFile(dirnames_[0] + \"/foo\", \"Hello World!\");\n  source_tree_.MapPath(\"\", dirnames_[0]);\n\n  ExpectFileContents(\"foo\", \"Hello World!\");\n  ExpectFileNotFound(\"bar\");\n}\n\nTEST_F(DiskSourceTreeTest, MapDirectory) {\n  // Test opening a file in a directory that is mapped to somewhere other\n  // than the root of the source tree.\n\n  AddFile(dirnames_[0] + \"/foo\", \"Hello World!\");\n  source_tree_.MapPath(\"baz\", dirnames_[0]);\n\n  ExpectFileContents(\"baz/foo\", \"Hello World!\");\n  ExpectFileNotFound(\"baz/bar\");\n  ExpectFileNotFound(\"foo\");\n  ExpectFileNotFound(\"bar\");\n\n  // Non-canonical file names should not work.\n  ExpectFileNotFound(\"baz//foo\");\n  ExpectFileNotFound(\"baz/../baz/foo\");\n  ExpectFileNotFound(\"baz/./foo\");\n  ExpectFileNotFound(\"baz/foo/\");\n}\n\nTEST_F(DiskSourceTreeTest, NoParent) {\n  // Test that we cannot open files in a parent of a mapped directory.\n\n  AddFile(dirnames_[0] + \"/foo\", \"Hello World!\");\n  AddSubdir(dirnames_[0] + \"/bar\");\n  AddFile(dirnames_[0] + \"/bar/baz\", \"Blah.\");\n  source_tree_.MapPath(\"\", dirnames_[0] + \"/bar\");\n\n  ExpectFileContents(\"baz\", \"Blah.\");\n  ExpectFileNotFound(\"../foo\");\n  ExpectFileNotFound(\"../bar/baz\");\n}\n\nTEST_F(DiskSourceTreeTest, MapFile) {\n  // Test opening a file that is mapped directly into the source tree.\n\n  AddFile(dirnames_[0] + \"/foo\", \"Hello World!\");\n  source_tree_.MapPath(\"foo\", dirnames_[0] + \"/foo\");\n\n  ExpectFileContents(\"foo\", \"Hello World!\");\n  ExpectFileNotFound(\"bar\");\n}\n\nTEST_F(DiskSourceTreeTest, SearchMultipleDirectories) {\n  // Test mapping and searching multiple directories.\n\n  AddFile(dirnames_[0] + \"/foo\", \"Hello World!\");\n  AddFile(dirnames_[1] + \"/foo\", \"This file should be hidden.\");\n  AddFile(dirnames_[1] + \"/bar\", \"Goodbye World!\");\n  source_tree_.MapPath(\"\", dirnames_[0]);\n  source_tree_.MapPath(\"\", dirnames_[1]);\n\n  ExpectFileContents(\"foo\", \"Hello World!\");\n  ExpectFileContents(\"bar\", \"Goodbye World!\");\n  ExpectFileNotFound(\"baz\");\n}\n\nTEST_F(DiskSourceTreeTest, OrderingTrumpsSpecificity) {\n  // Test that directories are always searched in order, even when a latter\n  // directory is more-specific than a former one.\n\n  // Create the \"bar\" directory so we can put a file in it.\n  ASSERT_TRUE(File::CreateDir((dirnames_[0] + \"/bar\").c_str(),\n                              DEFAULT_FILE_MODE));\n\n  // Add files and map paths.\n  AddFile(dirnames_[0] + \"/bar/foo\", \"Hello World!\");\n  AddFile(dirnames_[1] + \"/foo\", \"This file should be hidden.\");\n  source_tree_.MapPath(\"\", dirnames_[0]);\n  source_tree_.MapPath(\"bar\", dirnames_[1]);\n\n  // Check.\n  ExpectFileContents(\"bar/foo\", \"Hello World!\");\n}\n\nTEST_F(DiskSourceTreeTest, DiskFileToVirtualFile) {\n  // Test DiskFileToVirtualFile.\n\n  AddFile(dirnames_[0] + \"/foo\", \"Hello World!\");\n  AddFile(dirnames_[1] + \"/foo\", \"This file should be hidden.\");\n  source_tree_.MapPath(\"bar\", dirnames_[0]);\n  source_tree_.MapPath(\"bar\", dirnames_[1]);\n\n  string virtual_file;\n  string shadowing_disk_file;\n\n  EXPECT_EQ(DiskSourceTree::NO_MAPPING,\n    source_tree_.DiskFileToVirtualFile(\n      \"/foo\", &virtual_file, &shadowing_disk_file));\n\n  EXPECT_EQ(DiskSourceTree::SHADOWED,\n    source_tree_.DiskFileToVirtualFile(\n      dirnames_[1] + \"/foo\", &virtual_file, &shadowing_disk_file));\n  EXPECT_EQ(\"bar/foo\", virtual_file);\n  EXPECT_EQ(dirnames_[0] + \"/foo\", shadowing_disk_file);\n\n  EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,\n    source_tree_.DiskFileToVirtualFile(\n      dirnames_[1] + \"/baz\", &virtual_file, &shadowing_disk_file));\n  EXPECT_EQ(\"bar/baz\", virtual_file);\n\n  EXPECT_EQ(DiskSourceTree::SUCCESS,\n    source_tree_.DiskFileToVirtualFile(\n      dirnames_[0] + \"/foo\", &virtual_file, &shadowing_disk_file));\n  EXPECT_EQ(\"bar/foo\", virtual_file);\n}\n\nTEST_F(DiskSourceTreeTest, DiskFileToVirtualFileCanonicalization) {\n  // Test handling of \"..\", \".\", etc. in DiskFileToVirtualFile().\n\n  source_tree_.MapPath(\"dir1\", \"..\");\n  source_tree_.MapPath(\"dir2\", \"../../foo\");\n  source_tree_.MapPath(\"dir3\", \"./foo/bar/.\");\n  source_tree_.MapPath(\"dir4\", \".\");\n  source_tree_.MapPath(\"\", \"/qux\");\n  source_tree_.MapPath(\"dir5\", \"/quux/\");\n\n  string virtual_file;\n  string shadowing_disk_file;\n\n  // \"../..\" should not be considered to be under \"..\".\n  EXPECT_EQ(DiskSourceTree::NO_MAPPING,\n    source_tree_.DiskFileToVirtualFile(\n      \"../../baz\", &virtual_file, &shadowing_disk_file));\n\n  // \"/foo\" is not mapped (it should not be misintepreted as being under \".\").\n  EXPECT_EQ(DiskSourceTree::NO_MAPPING,\n    source_tree_.DiskFileToVirtualFile(\n      \"/foo\", &virtual_file, &shadowing_disk_file));\n\n#ifdef WIN32\n  // \"C:\\foo\" is not mapped (it should not be misintepreted as being under \".\").\n  EXPECT_EQ(DiskSourceTree::NO_MAPPING,\n    source_tree_.DiskFileToVirtualFile(\n      \"C:\\\\foo\", &virtual_file, &shadowing_disk_file));\n#endif  // WIN32\n\n  // But \"../baz\" should be.\n  EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,\n    source_tree_.DiskFileToVirtualFile(\n      \"../baz\", &virtual_file, &shadowing_disk_file));\n  EXPECT_EQ(\"dir1/baz\", virtual_file);\n\n  // \"../../foo/baz\" is under \"../../foo\".\n  EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,\n    source_tree_.DiskFileToVirtualFile(\n      \"../../foo/baz\", &virtual_file, &shadowing_disk_file));\n  EXPECT_EQ(\"dir2/baz\", virtual_file);\n\n  // \"foo/./bar/baz\" is under \"./foo/bar/.\".\n  EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,\n    source_tree_.DiskFileToVirtualFile(\n      \"foo/bar/baz\", &virtual_file, &shadowing_disk_file));\n  EXPECT_EQ(\"dir3/baz\", virtual_file);\n\n  // \"bar\" is under \".\".\n  EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,\n    source_tree_.DiskFileToVirtualFile(\n      \"bar\", &virtual_file, &shadowing_disk_file));\n  EXPECT_EQ(\"dir4/bar\", virtual_file);\n\n  // \"/qux/baz\" is under \"/qux\".\n  EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,\n    source_tree_.DiskFileToVirtualFile(\n      \"/qux/baz\", &virtual_file, &shadowing_disk_file));\n  EXPECT_EQ(\"baz\", virtual_file);\n\n  // \"/quux/bar\" is under \"/quux\".\n  EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,\n    source_tree_.DiskFileToVirtualFile(\n      \"/quux/bar\", &virtual_file, &shadowing_disk_file));\n  EXPECT_EQ(\"dir5/bar\", virtual_file);\n}\n\nTEST_F(DiskSourceTreeTest, VirtualFileToDiskFile) {\n  // Test VirtualFileToDiskFile.\n\n  AddFile(dirnames_[0] + \"/foo\", \"Hello World!\");\n  AddFile(dirnames_[1] + \"/foo\", \"This file should be hidden.\");\n  AddFile(dirnames_[1] + \"/quux\", \"This file should not be hidden.\");\n  source_tree_.MapPath(\"bar\", dirnames_[0]);\n  source_tree_.MapPath(\"bar\", dirnames_[1]);\n\n  // Existent files, shadowed and non-shadowed case.\n  string disk_file;\n  EXPECT_TRUE(source_tree_.VirtualFileToDiskFile(\"bar/foo\", &disk_file));\n  EXPECT_EQ(dirnames_[0] + \"/foo\", disk_file);\n  EXPECT_TRUE(source_tree_.VirtualFileToDiskFile(\"bar/quux\", &disk_file));\n  EXPECT_EQ(dirnames_[1] + \"/quux\", disk_file);\n\n  // Nonexistent file in existent directory and vice versa.\n  string not_touched = \"not touched\";\n  EXPECT_FALSE(source_tree_.VirtualFileToDiskFile(\"bar/baz\", &not_touched));\n  EXPECT_EQ(\"not touched\", not_touched);\n  EXPECT_FALSE(source_tree_.VirtualFileToDiskFile(\"baz/foo\", &not_touched));\n  EXPECT_EQ(\"not touched\", not_touched);\n\n  // Accept NULL as output parameter.\n  EXPECT_TRUE(source_tree_.VirtualFileToDiskFile(\"bar/foo\", NULL));\n  EXPECT_FALSE(source_tree_.VirtualFileToDiskFile(\"baz/foo\", NULL));\n}\n\n}  // namespace\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <map>\n#include <string>\n\n#include <google/protobuf/compiler/java/java_enum.h>\n#include <google/protobuf/compiler/java/java_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nEnumGenerator::EnumGenerator(const EnumDescriptor* descriptor)\n  : descriptor_(descriptor) {\n  for (int i = 0; i < descriptor_->value_count(); i++) {\n    const EnumValueDescriptor* value = descriptor_->value(i);\n    const EnumValueDescriptor* canonical_value =\n      descriptor_->FindValueByNumber(value->number());\n\n    if (value == canonical_value) {\n      canonical_values_.push_back(value);\n    } else {\n      Alias alias;\n      alias.value = value;\n      alias.canonical_value = canonical_value;\n      aliases_.push_back(alias);\n    }\n  }\n}\n\nEnumGenerator::~EnumGenerator() {}\n\nvoid EnumGenerator::Generate(io::Printer* printer) {\n  if (HasDescriptorMethods(descriptor_)) {\n    printer->Print(\n      \"public enum $classname$\\n\"\n      \"    implements com.google.protobuf.ProtocolMessageEnum {\\n\",\n      \"classname\", descriptor_->name());\n  } else {\n    printer->Print(\n      \"public enum $classname$\\n\"\n      \"    implements com.google.protobuf.Internal.EnumLite {\\n\",\n      \"classname\", descriptor_->name());\n  }\n  printer->Indent();\n\n  for (int i = 0; i < canonical_values_.size(); i++) {\n    map<string, string> vars;\n    vars[\"name\"] = canonical_values_[i]->name();\n    vars[\"index\"] = SimpleItoa(canonical_values_[i]->index());\n    vars[\"number\"] = SimpleItoa(canonical_values_[i]->number());\n    printer->Print(vars,\n      \"$name$($index$, $number$),\\n\");\n  }\n\n  printer->Print(\n    \";\\n\"\n    \"\\n\");\n\n  // -----------------------------------------------------------------\n\n  for (int i = 0; i < aliases_.size(); i++) {\n    map<string, string> vars;\n    vars[\"classname\"] = descriptor_->name();\n    vars[\"name\"] = aliases_[i].value->name();\n    vars[\"canonical_name\"] = aliases_[i].canonical_value->name();\n    printer->Print(vars,\n      \"public static final $classname$ $name$ = $canonical_name$;\\n\");\n  }\n\n  for (int i = 0; i < descriptor_->value_count(); i++) {\n    map<string, string> vars;\n    vars[\"name\"] = descriptor_->value(i)->name();\n    vars[\"number\"] = SimpleItoa(descriptor_->value(i)->number());\n    printer->Print(vars,\n      \"public static final int $name$_VALUE = $number$;\\n\");\n  }\n  printer->Print(\"\\n\");\n\n  // -----------------------------------------------------------------\n\n  printer->Print(\n    \"\\n\"\n    \"public final int getNumber() { return value; }\\n\"\n    \"\\n\"\n    \"public static $classname$ valueOf(int value) {\\n\"\n    \"  switch (value) {\\n\",\n    \"classname\", descriptor_->name());\n  printer->Indent();\n  printer->Indent();\n\n  for (int i = 0; i < canonical_values_.size(); i++) {\n    printer->Print(\n      \"case $number$: return $name$;\\n\",\n      \"name\", canonical_values_[i]->name(),\n      \"number\", SimpleItoa(canonical_values_[i]->number()));\n  }\n\n  printer->Outdent();\n  printer->Outdent();\n  printer->Print(\n    \"    default: return null;\\n\"\n    \"  }\\n\"\n    \"}\\n\"\n    \"\\n\"\n    \"public static com.google.protobuf.Internal.EnumLiteMap<$classname$>\\n\"\n    \"    internalGetValueMap() {\\n\"\n    \"  return internalValueMap;\\n\"\n    \"}\\n\"\n    \"private static com.google.protobuf.Internal.EnumLiteMap<$classname$>\\n\"\n    \"    internalValueMap =\\n\"\n    \"      new com.google.protobuf.Internal.EnumLiteMap<$classname$>() {\\n\"\n    \"        public $classname$ findValueByNumber(int number) {\\n\"\n    \"          return $classname$.valueOf(number);\\n\"\n    \"        }\\n\"\n    \"      };\\n\"\n    \"\\n\",\n    \"classname\", descriptor_->name());\n\n  // -----------------------------------------------------------------\n  // Reflection\n\n  if (HasDescriptorMethods(descriptor_)) {\n    printer->Print(\n      \"public final com.google.protobuf.Descriptors.EnumValueDescriptor\\n\"\n      \"    getValueDescriptor() {\\n\"\n      \"  return getDescriptor().getValues().get(index);\\n\"\n      \"}\\n\"\n      \"public final com.google.protobuf.Descriptors.EnumDescriptor\\n\"\n      \"    getDescriptorForType() {\\n\"\n      \"  return getDescriptor();\\n\"\n      \"}\\n\"\n      \"public static final com.google.protobuf.Descriptors.EnumDescriptor\\n\"\n      \"    getDescriptor() {\\n\");\n\n    // TODO(kenton):  Cache statically?  Note that we can't access descriptors\n    //   at module init time because it wouldn't work with descriptor.proto, but\n    //   we can cache the value the first time getDescriptor() is called.\n    if (descriptor_->containing_type() == NULL) {\n      printer->Print(\n        \"  return $file$.getDescriptor().getEnumTypes().get($index$);\\n\",\n        \"file\", ClassName(descriptor_->file()),\n        \"index\", SimpleItoa(descriptor_->index()));\n    } else {\n      printer->Print(\n        \"  return $parent$.getDescriptor().getEnumTypes().get($index$);\\n\",\n        \"parent\", ClassName(descriptor_->containing_type()),\n        \"index\", SimpleItoa(descriptor_->index()));\n    }\n\n    printer->Print(\n      \"}\\n\"\n      \"\\n\"\n      \"private static final $classname$[] VALUES = {\\n\"\n      \"  \",\n      \"classname\", descriptor_->name());\n\n    for (int i = 0; i < descriptor_->value_count(); i++) {\n      printer->Print(\"$name$, \",\n        \"name\", descriptor_->value(i)->name());\n    }\n\n    printer->Print(\n      \"\\n\"\n      \"};\\n\"\n      \"\\n\"\n      \"public static $classname$ valueOf(\\n\"\n      \"    com.google.protobuf.Descriptors.EnumValueDescriptor desc) {\\n\"\n      \"  if (desc.getType() != getDescriptor()) {\\n\"\n      \"    throw new java.lang.IllegalArgumentException(\\n\"\n      \"      \\\"EnumValueDescriptor is not for this type.\\\");\\n\"\n      \"  }\\n\"\n      \"  return VALUES[desc.getIndex()];\\n\"\n      \"}\\n\"\n      \"\\n\",\n      \"classname\", descriptor_->name());\n\n    // index is only used for reflection; lite implementation does not need it\n    printer->Print(\"private final int index;\\n\");\n  }\n\n  // -----------------------------------------------------------------\n\n  printer->Print(\n    \"private final int value;\\n\\n\"\n    \"private $classname$(int index, int value) {\\n\",\n    \"classname\", descriptor_->name());\n  if (HasDescriptorMethods(descriptor_)) {\n    printer->Print(\"  this.index = index;\\n\");\n  }\n  printer->Print(\n    \"  this.value = value;\\n\"\n    \"}\\n\");\n\n  printer->Print(\n    \"\\n\"\n    \"// @@protoc_insertion_point(enum_scope:$full_name$)\\n\",\n    \"full_name\", descriptor_->full_name());\n\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n}\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_H__\n#define GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_H__\n\n#include <string>\n#include <vector>\n#include <google/protobuf/descriptor.h>\n\nnamespace google {\nnamespace protobuf {\n  namespace io {\n    class Printer;             // printer.h\n  }\n}\n\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nclass EnumGenerator {\n public:\n  explicit EnumGenerator(const EnumDescriptor* descriptor);\n  ~EnumGenerator();\n\n  void Generate(io::Printer* printer);\n\n private:\n  const EnumDescriptor* descriptor_;\n\n  // The proto language allows multiple enum constants to have the same numeric\n  // value.  Java, however, does not allow multiple enum constants to be\n  // considered equivalent.  We treat the first defined constant for any\n  // given numeric value as \"canonical\" and the rest as aliases of that\n  // canonical value.\n  vector<const EnumValueDescriptor*> canonical_values_;\n\n  struct Alias {\n    const EnumValueDescriptor* value;\n    const EnumValueDescriptor* canonical_value;\n  };\n  vector<Alias> aliases_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumGenerator);\n};\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <map>\n#include <string>\n\n#include <google/protobuf/compiler/java/java_enum_field.h>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/compiler/java/java_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nnamespace {\n\n// TODO(kenton):  Factor out a \"SetCommonFieldVariables()\" to get rid of\n//   repeat code between this and the other field types.\nvoid SetEnumVariables(const FieldDescriptor* descriptor,\n                      int messageBitIndex,\n                      int builderBitIndex,\n                      map<string, string>* variables) {\n  (*variables)[\"name\"] =\n    UnderscoresToCamelCase(descriptor);\n  (*variables)[\"capitalized_name\"] =\n    UnderscoresToCapitalizedCamelCase(descriptor);\n  (*variables)[\"constant_name\"] = FieldConstantName(descriptor);\n  (*variables)[\"number\"] = SimpleItoa(descriptor->number());\n  (*variables)[\"type\"] = ClassName(descriptor->enum_type());\n  (*variables)[\"default\"] = DefaultValue(descriptor);\n  (*variables)[\"tag\"] = SimpleItoa(internal::WireFormat::MakeTag(descriptor));\n  (*variables)[\"tag_size\"] = SimpleItoa(\n      internal::WireFormat::TagSize(descriptor->number(), GetType(descriptor)));\n  // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported\n  // by the proto compiler\n  (*variables)[\"deprecation\"] = descriptor->options().deprecated()\n      ? \"@java.lang.Deprecated \" : \"\";\n  (*variables)[\"on_changed\"] =\n      HasDescriptorMethods(descriptor->containing_type()) ? \"onChanged();\" : \"\";\n\n  // For singular messages and builders, one bit is used for the hasField bit.\n  (*variables)[\"get_has_field_bit_message\"] = GenerateGetBit(messageBitIndex);\n\n  (*variables)[\"get_has_field_bit_builder\"] = GenerateGetBit(builderBitIndex);\n  (*variables)[\"set_has_field_bit_builder\"] = GenerateSetBit(builderBitIndex);\n  (*variables)[\"clear_has_field_bit_builder\"] =\n      GenerateClearBit(builderBitIndex);\n\n  // For repated builders, one bit is used for whether the array is immutable.\n  (*variables)[\"get_mutable_bit_builder\"] = GenerateGetBit(builderBitIndex);\n  (*variables)[\"set_mutable_bit_builder\"] = GenerateSetBit(builderBitIndex);\n  (*variables)[\"clear_mutable_bit_builder\"] = GenerateClearBit(builderBitIndex);\n\n  (*variables)[\"get_has_field_bit_from_local\"] =\n      GenerateGetBitFromLocal(builderBitIndex);\n  (*variables)[\"set_has_field_bit_to_local\"] =\n      GenerateSetBitToLocal(messageBitIndex);\n}\n\n}  // namespace\n\n// ===================================================================\n\nEnumFieldGenerator::\nEnumFieldGenerator(const FieldDescriptor* descriptor,\n                      int messageBitIndex,\n                      int builderBitIndex)\n  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),\n    builderBitIndex_(builderBitIndex) {\n  SetEnumVariables(descriptor, messageBitIndex, builderBitIndex, &variables_);\n}\n\nEnumFieldGenerator::~EnumFieldGenerator() {}\n\nint EnumFieldGenerator::GetNumBitsForMessage() const {\n  return 1;\n}\n\nint EnumFieldGenerator::GetNumBitsForBuilder() const {\n  return 1;\n}\n\nvoid EnumFieldGenerator::\nGenerateInterfaceMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$deprecation$boolean has$capitalized_name$();\\n\"\n    \"$deprecation$$type$ get$capitalized_name$();\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"private $type$ $name$_;\\n\"\n    \"$deprecation$public boolean has$capitalized_name$() {\\n\"\n    \"  return $get_has_field_bit_message$;\\n\"\n    \"}\\n\"\n    \"$deprecation$public $type$ get$capitalized_name$() {\\n\"\n    \"  return $name$_;\\n\"\n    \"}\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateBuilderMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"private $type$ $name$_ = $default$;\\n\"\n    \"$deprecation$public boolean has$capitalized_name$() {\\n\"\n    \"  return $get_has_field_bit_builder$;\\n\"\n    \"}\\n\"\n    \"$deprecation$public $type$ get$capitalized_name$() {\\n\"\n    \"  return $name$_;\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder set$capitalized_name$($type$ value) {\\n\"\n    \"  if (value == null) {\\n\"\n    \"    throw new NullPointerException();\\n\"\n    \"  }\\n\"\n    \"  $set_has_field_bit_builder$;\\n\"\n    \"  $name$_ = value;\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder clear$capitalized_name$() {\\n\"\n    \"  $clear_has_field_bit_builder$;\\n\"\n    \"  $name$_ = $default$;\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateFieldBuilderInitializationCode(io::Printer* printer)  const {\n  // noop for enums\n}\n\nvoid EnumFieldGenerator::\nGenerateInitializationCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_ = $default$;\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateBuilderClearCode(io::Printer* printer) const {\n  printer->Print(variables_,\n      \"$name$_ = $default$;\\n\"\n      \"$clear_has_field_bit_builder$;\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if (other.has$capitalized_name$()) {\\n\"\n    \"  set$capitalized_name$(other.get$capitalized_name$());\\n\"\n    \"}\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateBuildingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if ($get_has_field_bit_from_local$) {\\n\"\n    \"  $set_has_field_bit_to_local$;\\n\"\n    \"}\\n\"\n    \"result.$name$_ = $name$_;\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateParsingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"int rawValue = input.readEnum();\\n\"\n    \"$type$ value = $type$.valueOf(rawValue);\\n\");\n  if (HasUnknownFields(descriptor_->containing_type())) {\n    printer->Print(variables_,\n      \"if (value == null) {\\n\"\n      \"  unknownFields.mergeVarintField($number$, rawValue);\\n\"\n      \"} else {\\n\");\n  } else {\n    printer->Print(variables_,\n      \"if (value != null) {\\n\");\n  }\n  printer->Print(variables_,\n    \"  $set_has_field_bit_builder$;\\n\"\n    \"  $name$_ = value;\\n\"\n    \"}\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateSerializationCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if ($get_has_field_bit_message$) {\\n\"\n    \"  output.writeEnum($number$, $name$_.getNumber());\\n\"\n    \"}\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateSerializedSizeCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if ($get_has_field_bit_message$) {\\n\"\n    \"  size += com.google.protobuf.CodedOutputStream\\n\"\n    \"    .computeEnumSize($number$, $name$_.getNumber());\\n\"\n    \"}\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateEqualsCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"result = result &&\\n\"\n    \"    (get$capitalized_name$() == other.get$capitalized_name$());\\n\");\n}\n\nvoid EnumFieldGenerator::\nGenerateHashCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"hash = (37 * hash) + $constant_name$;\\n\"\n    \"hash = (53 * hash) + hashEnum(get$capitalized_name$());\\n\");\n}\n\nstring EnumFieldGenerator::GetBoxedType() const {\n  return ClassName(descriptor_->enum_type());\n}\n\n// ===================================================================\n\nRepeatedEnumFieldGenerator::\nRepeatedEnumFieldGenerator(const FieldDescriptor* descriptor,\n                           int messageBitIndex,\n                           int builderBitIndex)\n  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),\n    builderBitIndex_(builderBitIndex) {\n  SetEnumVariables(descriptor, messageBitIndex, builderBitIndex, &variables_);\n}\n\nRepeatedEnumFieldGenerator::~RepeatedEnumFieldGenerator() {}\n\nint RepeatedEnumFieldGenerator::GetNumBitsForMessage() const {\n  return 0;\n}\n\nint RepeatedEnumFieldGenerator::GetNumBitsForBuilder() const {\n  return 1;\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateInterfaceMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$deprecation$java.util.List<$type$> get$capitalized_name$List();\\n\"\n    \"$deprecation$int get$capitalized_name$Count();\\n\"\n    \"$deprecation$$type$ get$capitalized_name$(int index);\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"private java.util.List<$type$> $name$_;\\n\"\n    \"$deprecation$public java.util.List<$type$> get$capitalized_name$List() {\\n\"\n    \"  return $name$_;\\n\"   // note:  unmodifiable list\n    \"}\\n\"\n    \"$deprecation$public int get$capitalized_name$Count() {\\n\"\n    \"  return $name$_.size();\\n\"\n    \"}\\n\"\n    \"$deprecation$public $type$ get$capitalized_name$(int index) {\\n\"\n    \"  return $name$_.get(index);\\n\"\n    \"}\\n\");\n\n  if (descriptor_->options().packed() &&\n      HasGeneratedMethods(descriptor_->containing_type())) {\n    printer->Print(variables_,\n      \"private int $name$MemoizedSerializedSize;\\n\");\n  }\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateBuilderMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    // One field is the list and the other field keeps track of whether the\n    // list is immutable. If it's immutable, the invariant is that it must\n    // either an instance of Collections.emptyList() or it's an ArrayList\n    // wrapped in a Collections.unmodifiableList() wrapper and nobody else has\n    // a refererence to the underlying ArrayList. This invariant allows us to\n    // share instances of lists between protocol buffers avoiding expensive\n    // memory allocations. Note, immutable is a strong guarantee here -- not\n    // just that the list cannot be modified via the reference but that the\n    // list can never be modified.\n    \"private java.util.List<$type$> $name$_ =\\n\"\n    \"  java.util.Collections.emptyList();\\n\"\n\n    \"private void ensure$capitalized_name$IsMutable() {\\n\"\n    \"  if (!$get_mutable_bit_builder$) {\\n\"\n    \"    $name$_ = new java.util.ArrayList<$type$>($name$_);\\n\"\n    \"    $set_mutable_bit_builder$;\\n\"\n    \"  }\\n\"\n    \"}\\n\"\n\n    // Note:  We return an unmodifiable list because otherwise the caller\n    //   could hold on to the returned list and modify it after the message\n    //   has been built, thus mutating the message which is supposed to be\n    //   immutable.\n    \"$deprecation$public java.util.List<$type$> get$capitalized_name$List() {\\n\"\n    \"  return java.util.Collections.unmodifiableList($name$_);\\n\"\n    \"}\\n\"\n    \"$deprecation$public int get$capitalized_name$Count() {\\n\"\n    \"  return $name$_.size();\\n\"\n    \"}\\n\"\n    \"$deprecation$public $type$ get$capitalized_name$(int index) {\\n\"\n    \"  return $name$_.get(index);\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder set$capitalized_name$(\\n\"\n    \"    int index, $type$ value) {\\n\"\n    \"  if (value == null) {\\n\"\n    \"    throw new NullPointerException();\\n\"\n    \"  }\\n\"\n    \"  ensure$capitalized_name$IsMutable();\\n\"\n    \"  $name$_.set(index, value);\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder add$capitalized_name$($type$ value) {\\n\"\n    \"  if (value == null) {\\n\"\n    \"    throw new NullPointerException();\\n\"\n    \"  }\\n\"\n    \"  ensure$capitalized_name$IsMutable();\\n\"\n    \"  $name$_.add(value);\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder addAll$capitalized_name$(\\n\"\n    \"    java.lang.Iterable<? extends $type$> values) {\\n\"\n    \"  ensure$capitalized_name$IsMutable();\\n\"\n    \"  super.addAll(values, $name$_);\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder clear$capitalized_name$() {\\n\"\n    \"  $name$_ = java.util.Collections.emptyList();\\n\"\n    \"  $clear_mutable_bit_builder$;\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateFieldBuilderInitializationCode(io::Printer* printer)  const {\n  // noop for enums\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateInitializationCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_ = java.util.Collections.emptyList();\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateBuilderClearCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$name$_ = java.util.Collections.emptyList();\\n\"\n    \"$clear_mutable_bit_builder$;\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  // The code below does two optimizations:\n  //   1. If the other list is empty, there's nothing to do. This ensures we\n  //      don't allocate a new array if we already have an immutable one.\n  //   2. If the other list is non-empty and our current list is empty, we can\n  //      reuse the other list which is guaranteed to be immutable.\n  printer->Print(variables_,\n    \"if (!other.$name$_.isEmpty()) {\\n\"\n    \"  if ($name$_.isEmpty()) {\\n\"\n    \"    $name$_ = other.$name$_;\\n\"\n    \"    $clear_mutable_bit_builder$;\\n\"\n    \"  } else {\\n\"\n    \"    ensure$capitalized_name$IsMutable();\\n\"\n    \"    $name$_.addAll(other.$name$_);\\n\"\n    \"  }\\n\"\n    \"  $on_changed$\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateBuildingCode(io::Printer* printer) const {\n  // The code below ensures that the result has an immutable list. If our\n  // list is immutable, we can just reuse it. If not, we make it immutable.\n  printer->Print(variables_,\n    \"if ($get_mutable_bit_builder$) {\\n\"\n    \"  $name$_ = java.util.Collections.unmodifiableList($name$_);\\n\"\n    \"  $clear_mutable_bit_builder$;\\n\"\n    \"}\\n\"\n    \"result.$name$_ = $name$_;\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateParsingCode(io::Printer* printer) const {\n  // Read and store the enum\n  printer->Print(variables_,\n    \"int rawValue = input.readEnum();\\n\"\n    \"$type$ value = $type$.valueOf(rawValue);\\n\");\n  if (HasUnknownFields(descriptor_->containing_type())) {\n    printer->Print(variables_,\n      \"if (value == null) {\\n\"\n      \"  unknownFields.mergeVarintField($number$, rawValue);\\n\"\n      \"} else {\\n\");\n  } else {\n    printer->Print(variables_,\n      \"if (value != null) {\\n\");\n  }\n  printer->Print(variables_,\n    \"  add$capitalized_name$(value);\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateParsingCodeFromPacked(io::Printer* printer) const {\n  // Wrap GenerateParsingCode's contents with a while loop.\n\n  printer->Print(variables_,\n    \"int length = input.readRawVarint32();\\n\"\n    \"int oldLimit = input.pushLimit(length);\\n\"\n    \"while(input.getBytesUntilLimit() > 0) {\\n\");\n  printer->Indent();\n\n  GenerateParsingCode(printer);\n\n  printer->Outdent();\n  printer->Print(variables_,\n    \"}\\n\"\n    \"input.popLimit(oldLimit);\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateSerializationCode(io::Printer* printer) const {\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"if (get$capitalized_name$List().size() > 0) {\\n\"\n      \"  output.writeRawVarint32($tag$);\\n\"\n      \"  output.writeRawVarint32($name$MemoizedSerializedSize);\\n\"\n      \"}\\n\"\n      \"for (int i = 0; i < $name$_.size(); i++) {\\n\"\n      \"  output.writeEnumNoTag($name$_.get(i).getNumber());\\n\"\n      \"}\\n\");\n  } else {\n    printer->Print(variables_,\n      \"for (int i = 0; i < $name$_.size(); i++) {\\n\"\n      \"  output.writeEnum($number$, $name$_.get(i).getNumber());\\n\"\n      \"}\\n\");\n  }\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateSerializedSizeCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"{\\n\"\n    \"  int dataSize = 0;\\n\");\n  printer->Indent();\n\n  printer->Print(variables_,\n    \"for (int i = 0; i < $name$_.size(); i++) {\\n\"\n    \"  dataSize += com.google.protobuf.CodedOutputStream\\n\"\n    \"    .computeEnumSizeNoTag($name$_.get(i).getNumber());\\n\"\n    \"}\\n\");\n  printer->Print(\n    \"size += dataSize;\\n\");\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"if (!get$capitalized_name$List().isEmpty()) {\"\n      \"  size += $tag_size$;\\n\"\n      \"  size += com.google.protobuf.CodedOutputStream\\n\"\n      \"    .computeRawVarint32Size(dataSize);\\n\"\n      \"}\");\n  } else {\n    printer->Print(variables_,\n      \"size += $tag_size$ * $name$_.size();\\n\");\n  }\n\n  // cache the data size for packed fields.\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"$name$MemoizedSerializedSize = dataSize;\\n\");\n  }\n\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateEqualsCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"result = result && get$capitalized_name$List()\\n\"\n    \"    .equals(other.get$capitalized_name$List());\\n\");\n}\n\nvoid RepeatedEnumFieldGenerator::\nGenerateHashCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if (get$capitalized_name$Count() > 0) {\\n\"\n    \"  hash = (37 * hash) + $constant_name$;\\n\"\n    \"  hash = (53 * hash) + hashEnumList(get$capitalized_name$List());\\n\"\n    \"}\\n\");\n}\n\nstring RepeatedEnumFieldGenerator::GetBoxedType() const {\n  return ClassName(descriptor_->enum_type());\n}\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_H__\n#define GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_H__\n\n#include <map>\n#include <string>\n#include <google/protobuf/compiler/java/java_field.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nclass EnumFieldGenerator : public FieldGenerator {\n public:\n  explicit EnumFieldGenerator(const FieldDescriptor* descriptor,\n      int messageBitIndex, int builderBitIndex);\n  ~EnumFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  int GetNumBitsForMessage() const;\n  int GetNumBitsForBuilder() const;\n  void GenerateInterfaceMembers(io::Printer* printer) const;\n  void GenerateMembers(io::Printer* printer) const;\n  void GenerateBuilderMembers(io::Printer* printer) const;\n  void GenerateInitializationCode(io::Printer* printer) const;\n  void GenerateBuilderClearCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateBuildingCode(io::Printer* printer) const;\n  void GenerateParsingCode(io::Printer* printer) const;\n  void GenerateSerializationCode(io::Printer* printer) const;\n  void GenerateSerializedSizeCode(io::Printer* printer) const;\n  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;\n  void GenerateEqualsCode(io::Printer* printer) const;\n  void GenerateHashCode(io::Printer* printer) const;\n\n  string GetBoxedType() const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n  const int messageBitIndex_;\n  const int builderBitIndex_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumFieldGenerator);\n};\n\nclass RepeatedEnumFieldGenerator : public FieldGenerator {\n public:\n  explicit RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor,\n      int messageBitIndex, int builderBitIndex);\n  ~RepeatedEnumFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  int GetNumBitsForMessage() const;\n  int GetNumBitsForBuilder() const;\n  void GenerateInterfaceMembers(io::Printer* printer) const;\n  void GenerateMembers(io::Printer* printer) const;\n  void GenerateBuilderMembers(io::Printer* printer) const;\n  void GenerateInitializationCode(io::Printer* printer) const;\n  void GenerateBuilderClearCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateBuildingCode(io::Printer* printer) const;\n  void GenerateParsingCode(io::Printer* printer) const;\n  void GenerateParsingCodeFromPacked(io::Printer* printer) const;\n  void GenerateSerializationCode(io::Printer* printer) const;\n  void GenerateSerializedSizeCode(io::Printer* printer) const;\n  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;\n  void GenerateEqualsCode(io::Printer* printer) const;\n  void GenerateHashCode(io::Printer* printer) const;\n\n  string GetBoxedType() const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n  const int messageBitIndex_;\n  const int builderBitIndex_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedEnumFieldGenerator);\n};\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/java/java_extension.h>\n#include <google/protobuf/compiler/java/java_helpers.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/io/printer.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nnamespace {\n\nconst char* TypeName(FieldDescriptor::Type field_type) {\n  switch (field_type) {\n    case FieldDescriptor::TYPE_INT32   : return \"INT32\";\n    case FieldDescriptor::TYPE_UINT32  : return \"UINT32\";\n    case FieldDescriptor::TYPE_SINT32  : return \"SINT32\";\n    case FieldDescriptor::TYPE_FIXED32 : return \"FIXED32\";\n    case FieldDescriptor::TYPE_SFIXED32: return \"SFIXED32\";\n    case FieldDescriptor::TYPE_INT64   : return \"INT64\";\n    case FieldDescriptor::TYPE_UINT64  : return \"UINT64\";\n    case FieldDescriptor::TYPE_SINT64  : return \"SINT64\";\n    case FieldDescriptor::TYPE_FIXED64 : return \"FIXED64\";\n    case FieldDescriptor::TYPE_SFIXED64: return \"SFIXED64\";\n    case FieldDescriptor::TYPE_FLOAT   : return \"FLOAT\";\n    case FieldDescriptor::TYPE_DOUBLE  : return \"DOUBLE\";\n    case FieldDescriptor::TYPE_BOOL    : return \"BOOL\";\n    case FieldDescriptor::TYPE_STRING  : return \"STRING\";\n    case FieldDescriptor::TYPE_BYTES   : return \"BYTES\";\n    case FieldDescriptor::TYPE_ENUM    : return \"ENUM\";\n    case FieldDescriptor::TYPE_GROUP   : return \"GROUP\";\n    case FieldDescriptor::TYPE_MESSAGE : return \"MESSAGE\";\n\n    // No default because we want the compiler to complain if any new\n    // types are added.\n  }\n\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return NULL;\n}\n\n}\n\nExtensionGenerator::ExtensionGenerator(const FieldDescriptor* descriptor)\n  : descriptor_(descriptor) {\n  if (descriptor_->extension_scope() != NULL) {\n    scope_ = ClassName(descriptor_->extension_scope());\n  } else {\n    scope_ = ClassName(descriptor_->file());\n  }\n}\n\nExtensionGenerator::~ExtensionGenerator() {}\n\n// Initializes the vars referenced in the generated code templates.\nvoid InitTemplateVars(const FieldDescriptor* descriptor,\n                      const string& scope,\n                      map<string, string>* vars_pointer) {\n  map<string, string> &vars = *vars_pointer;\n  vars[\"scope\"] = scope;\n  vars[\"name\"] = UnderscoresToCamelCase(descriptor);\n  vars[\"containing_type\"] = ClassName(descriptor->containing_type());\n  vars[\"number\"] = SimpleItoa(descriptor->number());\n  vars[\"constant_name\"] = FieldConstantName(descriptor);\n  vars[\"index\"] = SimpleItoa(descriptor->index());\n  vars[\"default\"] =\n      descriptor->is_repeated() ? \"\" : DefaultValue(descriptor);\n  vars[\"type_constant\"] = TypeName(GetType(descriptor));\n  vars[\"packed\"] = descriptor->options().packed() ? \"true\" : \"false\";\n  vars[\"enum_map\"] = \"null\";\n  vars[\"prototype\"] = \"null\";\n\n  JavaType java_type = GetJavaType(descriptor);\n  string singular_type;\n  switch (java_type) {\n    case JAVATYPE_MESSAGE:\n      singular_type = ClassName(descriptor->message_type());\n      vars[\"prototype\"] = singular_type + \".getDefaultInstance()\";\n      break;\n    case JAVATYPE_ENUM:\n      singular_type = ClassName(descriptor->enum_type());\n      vars[\"enum_map\"] = singular_type + \".internalGetValueMap()\";\n      break;\n    default:\n      singular_type = BoxedPrimitiveTypeName(java_type);\n      break;\n  }\n  vars[\"type\"] = descriptor->is_repeated() ?\n      \"java.util.List<\" + singular_type + \">\" : singular_type;\n  vars[\"singular_type\"] = singular_type;\n}\n\nvoid ExtensionGenerator::Generate(io::Printer* printer) {\n  map<string, string> vars;\n  InitTemplateVars(descriptor_, scope_, &vars);\n  printer->Print(vars,\n      \"public static final int $constant_name$ = $number$;\\n\");\n\n  if (HasDescriptorMethods(descriptor_->file())) {\n    // Non-lite extensions\n    if (descriptor_->extension_scope() == NULL) {\n      // Non-nested\n      printer->Print(\n          vars,\n          \"public static final\\n\"\n          \"  com.google.protobuf.GeneratedMessage.GeneratedExtension<\\n\"\n          \"    $containing_type$,\\n\"\n          \"    $type$> $name$ = com.google.protobuf.GeneratedMessage\\n\"\n          \"        .newFileScopedGeneratedExtension(\\n\"\n          \"      $singular_type$.class,\\n\"\n          \"      $prototype$);\\n\");\n    } else {\n      // Nested\n      printer->Print(\n          vars,\n          \"public static final\\n\"\n          \"  com.google.protobuf.GeneratedMessage.GeneratedExtension<\\n\"\n          \"    $containing_type$,\\n\"\n          \"    $type$> $name$ = com.google.protobuf.GeneratedMessage\\n\"\n          \"        .newMessageScopedGeneratedExtension(\\n\"\n          \"      $scope$.getDefaultInstance(),\\n\"\n          \"      $index$,\\n\"\n          \"      $singular_type$.class,\\n\"\n          \"      $prototype$);\\n\");\n    }\n  } else {\n    // Lite extensions\n    if (descriptor_->is_repeated()) {\n      printer->Print(\n          vars,\n          \"public static final\\n\"\n          \"  com.google.protobuf.GeneratedMessageLite.GeneratedExtension<\\n\"\n          \"    $containing_type$,\\n\"\n          \"    $type$> $name$ = com.google.protobuf.GeneratedMessageLite\\n\"\n          \"        .newRepeatedGeneratedExtension(\\n\"\n          \"      $containing_type$.getDefaultInstance(),\\n\"\n          \"      $prototype$,\\n\"\n          \"      $enum_map$,\\n\"\n          \"      $number$,\\n\"\n          \"      com.google.protobuf.WireFormat.FieldType.$type_constant$,\\n\"\n          \"      $packed$);\\n\");\n    } else {\n      printer->Print(\n          vars,\n          \"public static final\\n\"\n          \"  com.google.protobuf.GeneratedMessageLite.GeneratedExtension<\\n\"\n          \"    $containing_type$,\\n\"\n          \"    $type$> $name$ = com.google.protobuf.GeneratedMessageLite\\n\"\n          \"        .newSingularGeneratedExtension(\\n\"\n          \"      $containing_type$.getDefaultInstance(),\\n\"\n          \"      $default$,\\n\"\n          \"      $prototype$,\\n\"\n          \"      $enum_map$,\\n\"\n          \"      $number$,\\n\"\n          \"      com.google.protobuf.WireFormat.FieldType.$type_constant$);\\n\");\n    }\n  }\n}\n\nvoid ExtensionGenerator::GenerateNonNestedInitializationCode(\n    io::Printer* printer) {\n  if (descriptor_->extension_scope() == NULL &&\n      HasDescriptorMethods(descriptor_->file())) {\n    // Only applies to non-nested, non-lite extensions.\n    printer->Print(\n        \"$name$.internalInit(descriptor.getExtensions().get($index$));\\n\",\n        \"name\", UnderscoresToCamelCase(descriptor_),\n        \"index\", SimpleItoa(descriptor_->index()));\n  }\n}\n\nvoid ExtensionGenerator::GenerateRegistrationCode(io::Printer* printer) {\n  printer->Print(\n    \"registry.add($scope$.$name$);\\n\",\n    \"scope\", scope_,\n    \"name\", UnderscoresToCamelCase(descriptor_));\n}\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_EXTENSION_H__\n#define GOOGLE_PROTOBUF_COMPILER_JAVA_EXTENSION_H__\n\n#include <string>\n\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\n  class FieldDescriptor;       // descriptor.h\n  namespace io {\n    class Printer;             // printer.h\n  }\n}\n\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\n// Generates code for an extension, which may be within the scope of some\n// message or may be at file scope.  This is much simpler than FieldGenerator\n// since extensions are just simple identifiers with interesting types.\nclass ExtensionGenerator {\n public:\n  explicit ExtensionGenerator(const FieldDescriptor* descriptor);\n  ~ExtensionGenerator();\n\n  void Generate(io::Printer* printer);\n  void GenerateNonNestedInitializationCode(io::Printer* printer);\n  void GenerateRegistrationCode(io::Printer* printer);\n\n private:\n  const FieldDescriptor* descriptor_;\n  string scope_;\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionGenerator);\n};\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/java/java_field.h>\n#include <google/protobuf/compiler/java/java_helpers.h>\n#include <google/protobuf/compiler/java/java_primitive_field.h>\n#include <google/protobuf/compiler/java/java_enum_field.h>\n#include <google/protobuf/compiler/java/java_message_field.h>\n#include <google/protobuf/compiler/java/java_string_field.h>\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nFieldGenerator::~FieldGenerator() {}\n\nvoid FieldGenerator::GenerateParsingCodeFromPacked(io::Printer* printer) const {\n  // Reaching here indicates a bug. Cases are:\n  //   - This FieldGenerator should support packing, but this method should be\n  //     overridden.\n  //   - This FieldGenerator doesn't support packing, and this method should\n  //     never have been called.\n  GOOGLE_LOG(FATAL) << \"GenerateParsingCodeFromPacked() \"\n             << \"called on field generator that does not support packing.\";\n}\n\nFieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor)\n  : descriptor_(descriptor),\n    field_generators_(\n      new scoped_ptr<FieldGenerator>[descriptor->field_count()]),\n    extension_generators_(\n      new scoped_ptr<FieldGenerator>[descriptor->extension_count()]) {\n\n  // Construct all the FieldGenerators and assign them bit indices for their\n  // bit fields.\n  int messageBitIndex = 0;\n  int builderBitIndex = 0;\n  for (int i = 0; i < descriptor->field_count(); i++) {\n    FieldGenerator* generator = MakeGenerator(descriptor->field(i),\n        messageBitIndex, builderBitIndex);\n    field_generators_[i].reset(generator);\n    messageBitIndex += generator->GetNumBitsForMessage();\n    builderBitIndex += generator->GetNumBitsForBuilder();\n  }\n  for (int i = 0; i < descriptor->extension_count(); i++) {\n    FieldGenerator* generator = MakeGenerator(descriptor->extension(i),\n        messageBitIndex, builderBitIndex);\n    extension_generators_[i].reset(generator);\n    messageBitIndex += generator->GetNumBitsForMessage();\n    builderBitIndex += generator->GetNumBitsForBuilder();\n  }\n}\n\nFieldGenerator* FieldGeneratorMap::MakeGenerator(\n    const FieldDescriptor* field, int messageBitIndex, int builderBitIndex) {\n  if (field->is_repeated()) {\n    switch (GetJavaType(field)) {\n      case JAVATYPE_MESSAGE:\n        return new RepeatedMessageFieldGenerator(\n            field, messageBitIndex, builderBitIndex);\n      case JAVATYPE_ENUM:\n        return new RepeatedEnumFieldGenerator(\n            field, messageBitIndex, builderBitIndex);\n      case JAVATYPE_STRING:\n        return new RepeatedStringFieldGenerator(\n            field, messageBitIndex, builderBitIndex);\n      default:\n        return new RepeatedPrimitiveFieldGenerator(\n            field, messageBitIndex, builderBitIndex);\n    }\n  } else {\n    switch (GetJavaType(field)) {\n      case JAVATYPE_MESSAGE:\n        return new MessageFieldGenerator(\n            field, messageBitIndex, builderBitIndex);\n      case JAVATYPE_ENUM:\n        return new EnumFieldGenerator(\n            field, messageBitIndex, builderBitIndex);\n      case JAVATYPE_STRING:\n        return new StringFieldGenerator(\n            field, messageBitIndex, builderBitIndex);\n      default:\n        return new PrimitiveFieldGenerator(\n            field, messageBitIndex, builderBitIndex);\n    }\n  }\n}\n\nFieldGeneratorMap::~FieldGeneratorMap() {}\n\nconst FieldGenerator& FieldGeneratorMap::get(\n    const FieldDescriptor* field) const {\n  GOOGLE_CHECK_EQ(field->containing_type(), descriptor_);\n  return *field_generators_[field->index()];\n}\n\nconst FieldGenerator& FieldGeneratorMap::get_extension(int index) const {\n  return *extension_generators_[index];\n}\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_FIELD_H__\n#define GOOGLE_PROTOBUF_COMPILER_JAVA_FIELD_H__\n\n#include <string>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/descriptor.h>\n\nnamespace google {\nnamespace protobuf {\n  namespace io {\n    class Printer;             // printer.h\n  }\n}\n\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nclass FieldGenerator {\n public:\n  FieldGenerator() {}\n  virtual ~FieldGenerator();\n\n  virtual int GetNumBitsForMessage() const = 0;\n  virtual int GetNumBitsForBuilder() const = 0;\n  virtual void GenerateInterfaceMembers(io::Printer* printer) const = 0;\n  virtual void GenerateMembers(io::Printer* printer) const = 0;\n  virtual void GenerateBuilderMembers(io::Printer* printer) const = 0;\n  virtual void GenerateInitializationCode(io::Printer* printer) const = 0;\n  virtual void GenerateBuilderClearCode(io::Printer* printer) const = 0;\n  virtual void GenerateMergingCode(io::Printer* printer) const = 0;\n  virtual void GenerateBuildingCode(io::Printer* printer) const = 0;\n  virtual void GenerateParsingCode(io::Printer* printer) const = 0;\n  virtual void GenerateParsingCodeFromPacked(io::Printer* printer) const;\n  virtual void GenerateSerializationCode(io::Printer* printer) const = 0;\n  virtual void GenerateSerializedSizeCode(io::Printer* printer) const = 0;\n  virtual void GenerateFieldBuilderInitializationCode(io::Printer* printer)\n      const = 0;\n\n  virtual void GenerateEqualsCode(io::Printer* printer) const = 0;\n  virtual void GenerateHashCode(io::Printer* printer) const = 0;\n\n  virtual string GetBoxedType() const = 0;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGenerator);\n};\n\n// Convenience class which constructs FieldGenerators for a Descriptor.\nclass FieldGeneratorMap {\n public:\n  explicit FieldGeneratorMap(const Descriptor* descriptor);\n  ~FieldGeneratorMap();\n\n  const FieldGenerator& get(const FieldDescriptor* field) const;\n  const FieldGenerator& get_extension(int index) const;\n\n private:\n  const Descriptor* descriptor_;\n  scoped_array<scoped_ptr<FieldGenerator> > field_generators_;\n  scoped_array<scoped_ptr<FieldGenerator> > extension_generators_;\n\n  static FieldGenerator* MakeGenerator(const FieldDescriptor* field,\n      int messageBitIndex, int builderBitIndex);\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorMap);\n};\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_JAVA_FIELD_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/java/java_file.h>\n#include <google/protobuf/compiler/java/java_enum.h>\n#include <google/protobuf/compiler/java/java_service.h>\n#include <google/protobuf/compiler/java/java_extension.h>\n#include <google/protobuf/compiler/java/java_helpers.h>\n#include <google/protobuf/compiler/java/java_message.h>\n#include <google/protobuf/compiler/code_generator.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nnamespace {\n\n// Recursively searches the given message to see if it contains any extensions.\nbool UsesExtensions(const Message& message) {\n  const Reflection* reflection = message.GetReflection();\n\n  // We conservatively assume that unknown fields are extensions.\n  if (reflection->GetUnknownFields(message).field_count() > 0) return true;\n\n  vector<const FieldDescriptor*> fields;\n  reflection->ListFields(message, &fields);\n\n  for (int i = 0; i < fields.size(); i++) {\n    if (fields[i]->is_extension()) return true;\n\n    if (GetJavaType(fields[i]) == JAVATYPE_MESSAGE) {\n      if (fields[i]->is_repeated()) {\n        int size = reflection->FieldSize(message, fields[i]);\n        for (int j = 0; j < size; j++) {\n          const Message& sub_message =\n            reflection->GetRepeatedMessage(message, fields[i], j);\n          if (UsesExtensions(sub_message)) return true;\n        }\n      } else {\n        const Message& sub_message = reflection->GetMessage(message, fields[i]);\n        if (UsesExtensions(sub_message)) return true;\n      }\n    }\n  }\n\n  return false;\n}\n\n\n}  // namespace\n\nFileGenerator::FileGenerator(const FileDescriptor* file)\n  : file_(file),\n    java_package_(FileJavaPackage(file)),\n    classname_(FileClassName(file)) {\n}\n\nFileGenerator::~FileGenerator() {}\n\nbool FileGenerator::Validate(string* error) {\n  // Check that no class name matches the file's class name.  This is a common\n  // problem that leads to Java compile errors that can be hard to understand.\n  // It's especially bad when using the java_multiple_files, since we would\n  // end up overwriting the outer class with one of the inner ones.\n\n  bool found_conflict = false;\n  for (int i = 0; i < file_->enum_type_count() && !found_conflict; i++) {\n    if (file_->enum_type(i)->name() == classname_) {\n      found_conflict = true;\n    }\n  }\n  for (int i = 0; i < file_->message_type_count() && !found_conflict; i++) {\n    if (file_->message_type(i)->name() == classname_) {\n      found_conflict = true;\n    }\n  }\n  for (int i = 0; i < file_->service_count() && !found_conflict; i++) {\n    if (file_->service(i)->name() == classname_) {\n      found_conflict = true;\n    }\n  }\n\n  if (found_conflict) {\n    error->assign(file_->name());\n    error->append(\n      \": Cannot generate Java output because the file's outer class name, \\\"\");\n    error->append(classname_);\n    error->append(\n      \"\\\", matches the name of one of the types declared inside it.  \"\n      \"Please either rename the type or use the java_outer_classname \"\n      \"option to specify a different outer class name for the .proto file.\");\n    return false;\n  }\n\n  return true;\n}\n\nvoid FileGenerator::Generate(io::Printer* printer) {\n  // We don't import anything because we refer to all classes by their\n  // fully-qualified names in the generated source.\n  printer->Print(\n    \"// Generated by the protocol buffer compiler.  DO NOT EDIT!\\n\"\n    \"// source: $filename$\\n\"\n    \"\\n\",\n    \"filename\", file_->name());\n  if (!java_package_.empty()) {\n    printer->Print(\n      \"package $package$;\\n\"\n      \"\\n\",\n      \"package\", java_package_);\n  }\n  printer->Print(\n    \"public final class $classname$ {\\n\"\n    \"  private $classname$() {}\\n\",\n    \"classname\", classname_);\n  printer->Indent();\n\n  // -----------------------------------------------------------------\n\n  printer->Print(\n    \"public static void registerAllExtensions(\\n\"\n    \"    com.google.protobuf.ExtensionRegistry$lite$ registry) {\\n\",\n    \"lite\", HasDescriptorMethods(file_) ? \"\" : \"Lite\");\n\n  printer->Indent();\n\n  for (int i = 0; i < file_->extension_count(); i++) {\n    ExtensionGenerator(file_->extension(i)).GenerateRegistrationCode(printer);\n  }\n\n  for (int i = 0; i < file_->message_type_count(); i++) {\n    MessageGenerator(file_->message_type(i))\n      .GenerateExtensionRegistrationCode(printer);\n  }\n\n  printer->Outdent();\n  printer->Print(\n    \"}\\n\");\n\n  // -----------------------------------------------------------------\n\n  if (!file_->options().java_multiple_files()) {\n    for (int i = 0; i < file_->enum_type_count(); i++) {\n      EnumGenerator(file_->enum_type(i)).Generate(printer);\n    }\n    for (int i = 0; i < file_->message_type_count(); i++) {\n      MessageGenerator messageGenerator(file_->message_type(i));\n      messageGenerator.GenerateInterface(printer);\n      messageGenerator.Generate(printer);\n    }\n    if (HasGenericServices(file_)) {\n      for (int i = 0; i < file_->service_count(); i++) {\n        ServiceGenerator(file_->service(i)).Generate(printer);\n      }\n    }\n  }\n\n  // Extensions must be generated in the outer class since they are values,\n  // not classes.\n  for (int i = 0; i < file_->extension_count(); i++) {\n    ExtensionGenerator(file_->extension(i)).Generate(printer);\n  }\n\n  // Static variables.\n  for (int i = 0; i < file_->message_type_count(); i++) {\n    // TODO(kenton):  Reuse MessageGenerator objects?\n    MessageGenerator(file_->message_type(i)).GenerateStaticVariables(printer);\n  }\n\n  printer->Print(\"\\n\");\n\n  if (HasDescriptorMethods(file_)) {\n    GenerateEmbeddedDescriptor(printer);\n  } else {\n    printer->Print(\n      \"static {\\n\");\n    printer->Indent();\n\n    for (int i = 0; i < file_->message_type_count(); i++) {\n      // TODO(kenton):  Reuse MessageGenerator objects?\n      MessageGenerator(file_->message_type(i))\n        .GenerateStaticVariableInitializers(printer);\n    }\n\n    printer->Outdent();\n    printer->Print(\n      \"}\\n\");\n  }\n\n  printer->Print(\n    \"\\n\"\n    \"// @@protoc_insertion_point(outer_class_scope)\\n\");\n\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nvoid FileGenerator::GenerateEmbeddedDescriptor(io::Printer* printer) {\n  // Embed the descriptor.  We simply serialize the entire FileDescriptorProto\n  // and embed it as a string literal, which is parsed and built into real\n  // descriptors at initialization time.  We unfortunately have to put it in\n  // a string literal, not a byte array, because apparently using a literal\n  // byte array causes the Java compiler to generate *instructions* to\n  // initialize each and every byte of the array, e.g. as if you typed:\n  //   b[0] = 123; b[1] = 456; b[2] = 789;\n  // This makes huge bytecode files and can easily hit the compiler's internal\n  // code size limits (error \"code to large\").  String literals are apparently\n  // embedded raw, which is what we want.\n  FileDescriptorProto file_proto;\n  file_->CopyTo(&file_proto);\n\n  string file_data;\n  file_proto.SerializeToString(&file_data);\n\n  printer->Print(\n    \"public static com.google.protobuf.Descriptors.FileDescriptor\\n\"\n    \"    getDescriptor() {\\n\"\n    \"  return descriptor;\\n\"\n    \"}\\n\"\n    \"private static com.google.protobuf.Descriptors.FileDescriptor\\n\"\n    \"    descriptor;\\n\"\n    \"static {\\n\"\n    \"  java.lang.String[] descriptorData = {\\n\");\n  printer->Indent();\n  printer->Indent();\n\n  // Only write 40 bytes per line.\n  static const int kBytesPerLine = 40;\n  for (int i = 0; i < file_data.size(); i += kBytesPerLine) {\n    if (i > 0) {\n      // Every 400 lines, start a new string literal, in order to avoid the\n      // 64k length limit.\n      if (i % 400 == 0) {\n        printer->Print(\",\\n\");\n      } else {\n        printer->Print(\" +\\n\");\n      }\n    }\n    printer->Print(\"\\\"$data$\\\"\",\n      \"data\", CEscape(file_data.substr(i, kBytesPerLine)));\n  }\n\n  printer->Outdent();\n  printer->Print(\"\\n};\\n\");\n\n  // -----------------------------------------------------------------\n  // Create the InternalDescriptorAssigner.\n\n  printer->Print(\n    \"com.google.protobuf.Descriptors.FileDescriptor.\"\n      \"InternalDescriptorAssigner assigner =\\n\"\n    \"  new com.google.protobuf.Descriptors.FileDescriptor.\"\n      \"InternalDescriptorAssigner() {\\n\"\n    \"    public com.google.protobuf.ExtensionRegistry assignDescriptors(\\n\"\n    \"        com.google.protobuf.Descriptors.FileDescriptor root) {\\n\"\n    \"      descriptor = root;\\n\");\n\n  printer->Indent();\n  printer->Indent();\n  printer->Indent();\n\n  for (int i = 0; i < file_->message_type_count(); i++) {\n    // TODO(kenton):  Reuse MessageGenerator objects?\n    MessageGenerator(file_->message_type(i))\n      .GenerateStaticVariableInitializers(printer);\n  }\n  for (int i = 0; i < file_->extension_count(); i++) {\n    // TODO(kenton):  Reuse ExtensionGenerator objects?\n    ExtensionGenerator(file_->extension(i))\n        .GenerateNonNestedInitializationCode(printer);\n  }\n\n  if (UsesExtensions(file_proto)) {\n    // Must construct an ExtensionRegistry containing all possible extensions\n    // and return it.\n    printer->Print(\n      \"com.google.protobuf.ExtensionRegistry registry =\\n\"\n      \"  com.google.protobuf.ExtensionRegistry.newInstance();\\n\"\n      \"registerAllExtensions(registry);\\n\");\n    for (int i = 0; i < file_->dependency_count(); i++) {\n      if (ShouldIncludeDependency(file_->dependency(i))) {\n        printer->Print(\n            \"$dependency$.registerAllExtensions(registry);\\n\",\n            \"dependency\", ClassName(file_->dependency(i)));\n      }\n    }\n    printer->Print(\n      \"return registry;\\n\");\n  } else {\n    printer->Print(\n      \"return null;\\n\");\n  }\n\n  printer->Outdent();\n  printer->Outdent();\n  printer->Outdent();\n\n  printer->Print(\n    \"    }\\n\"\n    \"  };\\n\");\n\n  // -----------------------------------------------------------------\n  // Invoke internalBuildGeneratedFileFrom() to build the file.\n\n  printer->Print(\n    \"com.google.protobuf.Descriptors.FileDescriptor\\n\"\n    \"  .internalBuildGeneratedFileFrom(descriptorData,\\n\"\n    \"    new com.google.protobuf.Descriptors.FileDescriptor[] {\\n\");\n\n  for (int i = 0; i < file_->dependency_count(); i++) {\n    if (ShouldIncludeDependency(file_->dependency(i))) {\n      printer->Print(\n        \"      $dependency$.getDescriptor(),\\n\",\n        \"dependency\", ClassName(file_->dependency(i)));\n    }\n  }\n\n  printer->Print(\n    \"    }, assigner);\\n\");\n\n  printer->Outdent();\n  printer->Print(\n    \"}\\n\");\n}\n\ntemplate<typename GeneratorClass, typename DescriptorClass>\nstatic void GenerateSibling(const string& package_dir,\n                            const string& java_package,\n                            const DescriptorClass* descriptor,\n                            GeneratorContext* context,\n                            vector<string>* file_list,\n                            const string& name_suffix,\n                            void (GeneratorClass::*pfn)(io::Printer* printer)) {\n  string filename = package_dir + descriptor->name() + name_suffix + \".java\";\n  file_list->push_back(filename);\n\n  scoped_ptr<io::ZeroCopyOutputStream> output(context->Open(filename));\n  io::Printer printer(output.get(), '$');\n\n  printer.Print(\n    \"// Generated by the protocol buffer compiler.  DO NOT EDIT!\\n\"\n    \"\\n\");\n  if (!java_package.empty()) {\n    printer.Print(\n      \"package $package$;\\n\"\n      \"\\n\",\n      \"package\", java_package);\n  }\n\n  GeneratorClass generator(descriptor);\n  (generator.*pfn)(&printer);\n}\n\nvoid FileGenerator::GenerateSiblings(const string& package_dir,\n                                     GeneratorContext* context,\n                                     vector<string>* file_list) {\n  if (file_->options().java_multiple_files()) {\n    for (int i = 0; i < file_->enum_type_count(); i++) {\n      GenerateSibling<EnumGenerator>(package_dir, java_package_,\n                                     file_->enum_type(i),\n                                     context, file_list, \"\",\n                                     &EnumGenerator::Generate);\n    }\n    for (int i = 0; i < file_->message_type_count(); i++) {\n      GenerateSibling<MessageGenerator>(package_dir, java_package_,\n                                        file_->message_type(i),\n                                        context, file_list, \"OrBuilder\",\n                                        &MessageGenerator::GenerateInterface);\n      GenerateSibling<MessageGenerator>(package_dir, java_package_,\n                                        file_->message_type(i),\n                                        context, file_list, \"\",\n                                        &MessageGenerator::Generate);\n    }\n    if (HasGenericServices(file_)) {\n      for (int i = 0; i < file_->service_count(); i++) {\n        GenerateSibling<ServiceGenerator>(package_dir, java_package_,\n                                          file_->service(i),\n                                          context, file_list, \"\",\n                                          &ServiceGenerator::Generate);\n      }\n    }\n  }\n}\n\nbool FileGenerator::ShouldIncludeDependency(const FileDescriptor* descriptor) {\n  return true;\n}\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_FILE_H__\n#define GOOGLE_PROTOBUF_COMPILER_JAVA_FILE_H__\n\n#include <string>\n#include <vector>\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\n  class FileDescriptor;        // descriptor.h\n  namespace io {\n    class Printer;             // printer.h\n  }\n  namespace compiler {\n    class GeneratorContext;     // code_generator.h\n  }\n}\n\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nclass FileGenerator {\n public:\n  explicit FileGenerator(const FileDescriptor* file);\n  ~FileGenerator();\n\n  // Checks for problems that would otherwise lead to cryptic compile errors.\n  // Returns true if there are no problems, or writes an error description to\n  // the given string and returns false otherwise.\n  bool Validate(string* error);\n\n  void Generate(io::Printer* printer);\n\n  // If we aren't putting everything into one file, this will write all the\n  // files other than the outer file (i.e. one for each message, enum, and\n  // service type).\n  void GenerateSiblings(const string& package_dir,\n                        GeneratorContext* generator_context,\n                        vector<string>* file_list);\n\n  const string& java_package() { return java_package_; }\n  const string& classname()    { return classname_;    }\n\n\n private:\n  // Returns whether the dependency should be included in the output file.\n  // Always returns true for opensource, but used internally at Google to help\n  // improve compatibility with version 1 of protocol buffers.\n  bool ShouldIncludeDependency(const FileDescriptor* descriptor);\n\n  const FileDescriptor* file_;\n  string java_package_;\n  string classname_;\n\n\n  void GenerateEmbeddedDescriptor(io::Printer* printer);\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator);\n};\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_JAVA_FILE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/java/java_generator.h>\n#include <google/protobuf/compiler/java/java_file.h>\n#include <google/protobuf/compiler/java/java_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\n\nJavaGenerator::JavaGenerator() {}\nJavaGenerator::~JavaGenerator() {}\n\nbool JavaGenerator::Generate(const FileDescriptor* file,\n                             const string& parameter,\n                             GeneratorContext* context,\n                             string* error) const {\n  // -----------------------------------------------------------------\n  // parse generator options\n\n  // Name a file where we will write a list of generated file names, one\n  // per line.\n  string output_list_file;\n\n\n  vector<pair<string, string> > options;\n  ParseGeneratorParameter(parameter, &options);\n\n  for (int i = 0; i < options.size(); i++) {\n    if (options[i].first == \"output_list_file\") {\n      output_list_file = options[i].second;\n    } else {\n      *error = \"Unknown generator option: \" + options[i].first;\n      return false;\n    }\n  }\n\n  // -----------------------------------------------------------------\n\n\n  if (file->options().optimize_for() == FileOptions::LITE_RUNTIME &&\n      file->options().java_generate_equals_and_hash()) {\n    *error = \"The \\\"java_generate_equals_and_hash\\\" option is incompatible \"\n             \"with \\\"optimize_for = LITE_RUNTIME\\\".  You must optimize for \"\n             \"SPEED or CODE_SIZE if you want to use this option.\";\n    return false;\n  }\n\n  FileGenerator file_generator(file);\n  if (!file_generator.Validate(error)) {\n    return false;\n  }\n\n  string package_dir = JavaPackageToDir(file_generator.java_package());\n\n  vector<string> all_files;\n\n  string java_filename = package_dir;\n  java_filename += file_generator.classname();\n  java_filename += \".java\";\n  all_files.push_back(java_filename);\n\n  // Generate main java file.\n  scoped_ptr<io::ZeroCopyOutputStream> output(\n    context->Open(java_filename));\n  io::Printer printer(output.get(), '$');\n  file_generator.Generate(&printer);\n\n  // Generate sibling files.\n  file_generator.GenerateSiblings(package_dir, context, &all_files);\n\n  // Generate output list if requested.\n  if (!output_list_file.empty()) {\n    // Generate output list.  This is just a simple text file placed in a\n    // deterministic location which lists the .java files being generated.\n    scoped_ptr<io::ZeroCopyOutputStream> srclist_raw_output(\n      context->Open(output_list_file));\n    io::Printer srclist_printer(srclist_raw_output.get(), '$');\n    for (int i = 0; i < all_files.size(); i++) {\n      srclist_printer.Print(\"$filename$\\n\", \"filename\", all_files[i]);\n    }\n  }\n\n  return true;\n}\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Generates Java code for a given .proto file.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_H__\n#define GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_H__\n\n#include <string>\n#include <google/protobuf/compiler/code_generator.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\n// CodeGenerator implementation which generates Java code.  If you create your\n// own protocol compiler binary and you want it to support Java output, you\n// can do so by registering an instance of this CodeGenerator with the\n// CommandLineInterface in your main() function.\nclass LIBPROTOC_EXPORT JavaGenerator : public CodeGenerator {\n public:\n  JavaGenerator();\n  ~JavaGenerator();\n\n  // implements CodeGenerator ----------------------------------------\n  bool Generate(const FileDescriptor* file,\n                const string& parameter,\n                GeneratorContext* context,\n                string* error) const;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(JavaGenerator);\n};\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <limits>\n#include <vector>\n\n#include <google/protobuf/compiler/java/java_helpers.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nconst char kThickSeparator[] =\n  \"// ===================================================================\\n\";\nconst char kThinSeparator[] =\n  \"// -------------------------------------------------------------------\\n\";\n\nnamespace {\n\nconst char* kDefaultPackage = \"\";\n\nconst string& FieldName(const FieldDescriptor* field) {\n  // Groups are hacky:  The name of the field is just the lower-cased name\n  // of the group type.  In Java, though, we would like to retain the original\n  // capitalization of the type name.\n  if (GetType(field) == FieldDescriptor::TYPE_GROUP) {\n    return field->message_type()->name();\n  } else {\n    return field->name();\n  }\n}\n\nstring UnderscoresToCamelCaseImpl(const string& input, bool cap_next_letter) {\n  string result;\n  // Note:  I distrust ctype.h due to locales.\n  for (int i = 0; i < input.size(); i++) {\n    if ('a' <= input[i] && input[i] <= 'z') {\n      if (cap_next_letter) {\n        result += input[i] + ('A' - 'a');\n      } else {\n        result += input[i];\n      }\n      cap_next_letter = false;\n    } else if ('A' <= input[i] && input[i] <= 'Z') {\n      if (i == 0 && !cap_next_letter) {\n        // Force first letter to lower-case unless explicitly told to\n        // capitalize it.\n        result += input[i] + ('a' - 'A');\n      } else {\n        // Capital letters after the first are left as-is.\n        result += input[i];\n      }\n      cap_next_letter = false;\n    } else if ('0' <= input[i] && input[i] <= '9') {\n      result += input[i];\n      cap_next_letter = true;\n    } else {\n      cap_next_letter = true;\n    }\n  }\n  return result;\n}\n\n}  // namespace\n\nstring UnderscoresToCamelCase(const FieldDescriptor* field) {\n  return UnderscoresToCamelCaseImpl(FieldName(field), false);\n}\n\nstring UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field) {\n  return UnderscoresToCamelCaseImpl(FieldName(field), true);\n}\n\nstring UnderscoresToCamelCase(const MethodDescriptor* method) {\n  return UnderscoresToCamelCaseImpl(method->name(), false);\n}\n\nstring StripProto(const string& filename) {\n  if (HasSuffixString(filename, \".protodevel\")) {\n    return StripSuffixString(filename, \".protodevel\");\n  } else {\n    return StripSuffixString(filename, \".proto\");\n  }\n}\n\nstring FileClassName(const FileDescriptor* file) {\n  if (file->options().has_java_outer_classname()) {\n    return file->options().java_outer_classname();\n  } else {\n    string basename;\n    string::size_type last_slash = file->name().find_last_of('/');\n    if (last_slash == string::npos) {\n      basename = file->name();\n    } else {\n      basename = file->name().substr(last_slash + 1);\n    }\n    return UnderscoresToCamelCaseImpl(StripProto(basename), true);\n  }\n}\n\nstring FileJavaPackage(const FileDescriptor* file) {\n  string result;\n\n  if (file->options().has_java_package()) {\n    result = file->options().java_package();\n  } else {\n    result = kDefaultPackage;\n    if (!file->package().empty()) {\n      if (!result.empty()) result += '.';\n      result += file->package();\n    }\n  }\n\n\n  return result;\n}\n\nstring JavaPackageToDir(string package_name) {\n  string package_dir =\n    StringReplace(package_name, \".\", \"/\", true);\n  if (!package_dir.empty()) package_dir += \"/\";\n  return package_dir;\n}\n\nstring ToJavaName(const string& full_name, const FileDescriptor* file) {\n  string result;\n  if (file->options().java_multiple_files()) {\n    result = FileJavaPackage(file);\n  } else {\n    result = ClassName(file);\n  }\n  if (!result.empty()) {\n    result += '.';\n  }\n  if (file->package().empty()) {\n    result += full_name;\n  } else {\n    // Strip the proto package from full_name since we've replaced it with\n    // the Java package.\n    result += full_name.substr(file->package().size() + 1);\n  }\n  return result;\n}\n\nstring ClassName(const FileDescriptor* descriptor) {\n  string result = FileJavaPackage(descriptor);\n  if (!result.empty()) result += '.';\n  result += FileClassName(descriptor);\n  return result;\n}\n\nstring FieldConstantName(const FieldDescriptor *field) {\n  string name = field->name() + \"_FIELD_NUMBER\";\n  UpperString(&name);\n  return name;\n}\n\nFieldDescriptor::Type GetType(const FieldDescriptor* field) {\n  return field->type();\n}\n\nJavaType GetJavaType(const FieldDescriptor* field) {\n  switch (GetType(field)) {\n    case FieldDescriptor::TYPE_INT32:\n    case FieldDescriptor::TYPE_UINT32:\n    case FieldDescriptor::TYPE_SINT32:\n    case FieldDescriptor::TYPE_FIXED32:\n    case FieldDescriptor::TYPE_SFIXED32:\n      return JAVATYPE_INT;\n\n    case FieldDescriptor::TYPE_INT64:\n    case FieldDescriptor::TYPE_UINT64:\n    case FieldDescriptor::TYPE_SINT64:\n    case FieldDescriptor::TYPE_FIXED64:\n    case FieldDescriptor::TYPE_SFIXED64:\n      return JAVATYPE_LONG;\n\n    case FieldDescriptor::TYPE_FLOAT:\n      return JAVATYPE_FLOAT;\n\n    case FieldDescriptor::TYPE_DOUBLE:\n      return JAVATYPE_DOUBLE;\n\n    case FieldDescriptor::TYPE_BOOL:\n      return JAVATYPE_BOOLEAN;\n\n    case FieldDescriptor::TYPE_STRING:\n      return JAVATYPE_STRING;\n\n    case FieldDescriptor::TYPE_BYTES:\n      return JAVATYPE_BYTES;\n\n    case FieldDescriptor::TYPE_ENUM:\n      return JAVATYPE_ENUM;\n\n    case FieldDescriptor::TYPE_GROUP:\n    case FieldDescriptor::TYPE_MESSAGE:\n      return JAVATYPE_MESSAGE;\n\n    // No default because we want the compiler to complain if any new\n    // types are added.\n  }\n\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return JAVATYPE_INT;\n}\n\nconst char* BoxedPrimitiveTypeName(JavaType type) {\n  switch (type) {\n    case JAVATYPE_INT    : return \"java.lang.Integer\";\n    case JAVATYPE_LONG   : return \"java.lang.Long\";\n    case JAVATYPE_FLOAT  : return \"java.lang.Float\";\n    case JAVATYPE_DOUBLE : return \"java.lang.Double\";\n    case JAVATYPE_BOOLEAN: return \"java.lang.Boolean\";\n    case JAVATYPE_STRING : return \"java.lang.String\";\n    case JAVATYPE_BYTES  : return \"com.google.protobuf.ByteString\";\n    case JAVATYPE_ENUM   : return NULL;\n    case JAVATYPE_MESSAGE: return NULL;\n\n    // No default because we want the compiler to complain if any new\n    // JavaTypes are added.\n  }\n\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return NULL;\n}\n\nbool AllAscii(const string& text) {\n  for (int i = 0; i < text.size(); i++) {\n    if ((text[i] & 0x80) != 0) {\n      return false;\n    }\n  }\n  return true;\n}\n\nstring DefaultValue(const FieldDescriptor* field) {\n  // Switch on CppType since we need to know which default_value_* method\n  // of FieldDescriptor to call.\n  switch (field->cpp_type()) {\n    case FieldDescriptor::CPPTYPE_INT32:\n      return SimpleItoa(field->default_value_int32());\n    case FieldDescriptor::CPPTYPE_UINT32:\n      // Need to print as a signed int since Java has no unsigned.\n      return SimpleItoa(static_cast<int32>(field->default_value_uint32()));\n    case FieldDescriptor::CPPTYPE_INT64:\n      return SimpleItoa(field->default_value_int64()) + \"L\";\n    case FieldDescriptor::CPPTYPE_UINT64:\n      return SimpleItoa(static_cast<int64>(field->default_value_uint64())) +\n             \"L\";\n    case FieldDescriptor::CPPTYPE_DOUBLE: {\n      double value = field->default_value_double();\n      if (value == numeric_limits<double>::infinity()) {\n        return \"Double.POSITIVE_INFINITY\";\n      } else if (value == -numeric_limits<double>::infinity()) {\n        return \"Double.NEGATIVE_INFINITY\";\n      } else if (value != value) {\n        return \"Double.NaN\";\n      } else {\n        return SimpleDtoa(value) + \"D\";\n      }\n    }\n    case FieldDescriptor::CPPTYPE_FLOAT: {\n      float value = field->default_value_float();\n      if (value == numeric_limits<float>::infinity()) {\n        return \"Float.POSITIVE_INFINITY\";\n      } else if (value == -numeric_limits<float>::infinity()) {\n        return \"Float.NEGATIVE_INFINITY\";\n      } else if (value != value) {\n        return \"Float.NaN\";\n      } else {\n        return SimpleFtoa(value) + \"F\";\n      }\n    }\n    case FieldDescriptor::CPPTYPE_BOOL:\n      return field->default_value_bool() ? \"true\" : \"false\";\n    case FieldDescriptor::CPPTYPE_STRING:\n      if (GetType(field) == FieldDescriptor::TYPE_BYTES) {\n        if (field->has_default_value()) {\n          // See comments in Internal.java for gory details.\n          return strings::Substitute(\n            \"com.google.protobuf.Internal.bytesDefaultValue(\\\"$0\\\")\",\n            CEscape(field->default_value_string()));\n        } else {\n          return \"com.google.protobuf.ByteString.EMPTY\";\n        }\n      } else {\n        if (AllAscii(field->default_value_string())) {\n          // All chars are ASCII.  In this case CEscape() works fine.\n          return \"\\\"\" + CEscape(field->default_value_string()) + \"\\\"\";\n        } else {\n          // See comments in Internal.java for gory details.\n          return strings::Substitute(\n            \"com.google.protobuf.Internal.stringDefaultValue(\\\"$0\\\")\",\n            CEscape(field->default_value_string()));\n        }\n      }\n\n    case FieldDescriptor::CPPTYPE_ENUM:\n      return ClassName(field->enum_type()) + \".\" +\n             field->default_value_enum()->name();\n\n    case FieldDescriptor::CPPTYPE_MESSAGE:\n      return ClassName(field->message_type()) + \".getDefaultInstance()\";\n\n    // No default because we want the compiler to complain if any new\n    // types are added.\n  }\n\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return \"\";\n}\n\nbool IsDefaultValueJavaDefault(const FieldDescriptor* field) {\n  // Switch on CppType since we need to know which default_value_* method\n  // of FieldDescriptor to call.\n  switch (field->cpp_type()) {\n    case FieldDescriptor::CPPTYPE_INT32:\n      return field->default_value_int32() == 0;\n    case FieldDescriptor::CPPTYPE_UINT32:\n      return field->default_value_uint32() == 0;\n    case FieldDescriptor::CPPTYPE_INT64:\n      return field->default_value_int64() == 0L;\n    case FieldDescriptor::CPPTYPE_UINT64:\n      return field->default_value_uint64() == 0L;\n    case FieldDescriptor::CPPTYPE_DOUBLE:\n      return field->default_value_double() == 0.0;\n    case FieldDescriptor::CPPTYPE_FLOAT:\n      return field->default_value_float() == 0.0;\n    case FieldDescriptor::CPPTYPE_BOOL:\n      return field->default_value_bool() == false;\n\n    case FieldDescriptor::CPPTYPE_STRING:\n    case FieldDescriptor::CPPTYPE_ENUM:\n    case FieldDescriptor::CPPTYPE_MESSAGE:\n      return false;\n\n    // No default because we want the compiler to complain if any new\n    // types are added.\n  }\n\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return false;\n}\n\nconst char* bit_masks[] = {\n  \"0x00000001\",\n  \"0x00000002\",\n  \"0x00000004\",\n  \"0x00000008\",\n  \"0x00000010\",\n  \"0x00000020\",\n  \"0x00000040\",\n  \"0x00000080\",\n\n  \"0x00000100\",\n  \"0x00000200\",\n  \"0x00000400\",\n  \"0x00000800\",\n  \"0x00001000\",\n  \"0x00002000\",\n  \"0x00004000\",\n  \"0x00008000\",\n\n  \"0x00010000\",\n  \"0x00020000\",\n  \"0x00040000\",\n  \"0x00080000\",\n  \"0x00100000\",\n  \"0x00200000\",\n  \"0x00400000\",\n  \"0x00800000\",\n\n  \"0x01000000\",\n  \"0x02000000\",\n  \"0x04000000\",\n  \"0x08000000\",\n  \"0x10000000\",\n  \"0x20000000\",\n  \"0x40000000\",\n  \"0x80000000\",\n};\n\nstring GetBitFieldName(int index) {\n  string varName = \"bitField\";\n  varName += SimpleItoa(index);\n  varName += \"_\";\n  return varName;\n}\n\nstring GetBitFieldNameForBit(int bitIndex) {\n  return GetBitFieldName(bitIndex / 32);\n}\n\nstring GenerateGetBit(int bitIndex) {\n  string varName = GetBitFieldNameForBit(bitIndex);\n  int bitInVarIndex = bitIndex % 32;\n\n  string mask = bit_masks[bitInVarIndex];\n  string result = \"((\" + varName + \" & \" + mask + \") == \" + mask + \")\";\n  return result;\n}\n\nstring GenerateSetBit(int bitIndex) {\n  string varName = GetBitFieldNameForBit(bitIndex);\n  int bitInVarIndex = bitIndex % 32;\n\n  string mask = bit_masks[bitInVarIndex];\n  string result = varName + \" |= \" + mask;\n  return result;\n}\n\nstring GenerateClearBit(int bitIndex) {\n  string varName = GetBitFieldNameForBit(bitIndex);\n  int bitInVarIndex = bitIndex % 32;\n\n  string mask = bit_masks[bitInVarIndex];\n  string result = varName + \" = (\" + varName + \" & ~\" + mask + \")\";\n  return result;\n}\n\nstring GenerateGetBitFromLocal(int bitIndex) {\n  string varName = \"from_\" + GetBitFieldNameForBit(bitIndex);\n  int bitInVarIndex = bitIndex % 32;\n\n  string mask = bit_masks[bitInVarIndex];\n  string result = \"((\" + varName + \" & \" + mask + \") == \" + mask + \")\";\n  return result;\n}\n\nstring GenerateSetBitToLocal(int bitIndex) {\n  string varName = \"to_\" + GetBitFieldNameForBit(bitIndex);\n  int bitInVarIndex = bitIndex % 32;\n\n  string mask = bit_masks[bitInVarIndex];\n  string result = varName + \" |= \" + mask;\n  return result;\n}\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__\n#define GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__\n\n#include <string>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/descriptor.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\n// Commonly-used separator comments.  Thick is a line of '=', thin is a line\n// of '-'.\nextern const char kThickSeparator[];\nextern const char kThinSeparator[];\n\n// Converts the field's name to camel-case, e.g. \"foo_bar_baz\" becomes\n// \"fooBarBaz\" or \"FooBarBaz\", respectively.\nstring UnderscoresToCamelCase(const FieldDescriptor* field);\nstring UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field);\n\n// Similar, but for method names.  (Typically, this merely has the effect\n// of lower-casing the first letter of the name.)\nstring UnderscoresToCamelCase(const MethodDescriptor* method);\n\n// Strips \".proto\" or \".protodevel\" from the end of a filename.\nstring StripProto(const string& filename);\n\n// Gets the unqualified class name for the file.  Each .proto file becomes a\n// single Java class, with all its contents nested in that class.\nstring FileClassName(const FileDescriptor* file);\n\n// Returns the file's Java package name.\nstring FileJavaPackage(const FileDescriptor* file);\n\n// Returns output directory for the given package name.\nstring JavaPackageToDir(string package_name);\n\n// Converts the given fully-qualified name in the proto namespace to its\n// fully-qualified name in the Java namespace, given that it is in the given\n// file.\nstring ToJavaName(const string& full_name, const FileDescriptor* file);\n\n// These return the fully-qualified class name corresponding to the given\n// descriptor.\ninline string ClassName(const Descriptor* descriptor) {\n  return ToJavaName(descriptor->full_name(), descriptor->file());\n}\ninline string ClassName(const EnumDescriptor* descriptor) {\n  return ToJavaName(descriptor->full_name(), descriptor->file());\n}\ninline string ClassName(const ServiceDescriptor* descriptor) {\n  return ToJavaName(descriptor->full_name(), descriptor->file());\n}\ninline string ExtensionIdentifierName(const FieldDescriptor* descriptor) {\n  return ToJavaName(descriptor->full_name(), descriptor->file());\n}\nstring ClassName(const FileDescriptor* descriptor);\n\n// Get the unqualified name that should be used for a field's field\n// number constant.\nstring FieldConstantName(const FieldDescriptor *field);\n\n// Returns the type of the FieldDescriptor.\n// This does nothing interesting for the open source release, but is used for\n// hacks that improve compatability with version 1 protocol buffers at Google.\nFieldDescriptor::Type GetType(const FieldDescriptor* field);\n\nenum JavaType {\n  JAVATYPE_INT,\n  JAVATYPE_LONG,\n  JAVATYPE_FLOAT,\n  JAVATYPE_DOUBLE,\n  JAVATYPE_BOOLEAN,\n  JAVATYPE_STRING,\n  JAVATYPE_BYTES,\n  JAVATYPE_ENUM,\n  JAVATYPE_MESSAGE\n};\n\nJavaType GetJavaType(const FieldDescriptor* field);\n\n// Get the fully-qualified class name for a boxed primitive type, e.g.\n// \"java.lang.Integer\" for JAVATYPE_INT.  Returns NULL for enum and message\n// types.\nconst char* BoxedPrimitiveTypeName(JavaType type);\n\nstring DefaultValue(const FieldDescriptor* field);\nbool IsDefaultValueJavaDefault(const FieldDescriptor* field);\n\n// Does this message class keep track of unknown fields?\ninline bool HasUnknownFields(const Descriptor* descriptor) {\n  return descriptor->file()->options().optimize_for() !=\n           FileOptions::LITE_RUNTIME;\n}\n\n// Does this message class have generated parsing, serialization, and other\n// standard methods for which reflection-based fallback implementations exist?\ninline bool HasGeneratedMethods(const Descriptor* descriptor) {\n  return descriptor->file()->options().optimize_for() !=\n           FileOptions::CODE_SIZE;\n}\n\n// Does this message have specialized equals() and hashCode() methods?\ninline bool HasEqualsAndHashCode(const Descriptor* descriptor) {\n  return descriptor->file()->options().java_generate_equals_and_hash();\n}\n\n// Does this message class have descriptor and reflection methods?\ninline bool HasDescriptorMethods(const Descriptor* descriptor) {\n  return descriptor->file()->options().optimize_for() !=\n           FileOptions::LITE_RUNTIME;\n}\ninline bool HasDescriptorMethods(const EnumDescriptor* descriptor) {\n  return descriptor->file()->options().optimize_for() !=\n           FileOptions::LITE_RUNTIME;\n}\ninline bool HasDescriptorMethods(const FileDescriptor* descriptor) {\n  return descriptor->options().optimize_for() !=\n           FileOptions::LITE_RUNTIME;\n}\n\ninline bool HasNestedBuilders(const Descriptor* descriptor) {\n  // The proto-lite version doesn't support nested builders.\n  return descriptor->file()->options().optimize_for() !=\n           FileOptions::LITE_RUNTIME;\n}\n\n// Should we generate generic services for this file?\ninline bool HasGenericServices(const FileDescriptor *file) {\n  return file->service_count() > 0 &&\n         file->options().optimize_for() != FileOptions::LITE_RUNTIME &&\n         file->options().java_generic_services();\n}\n\n\n// Methods for shared bitfields.\n\n// Gets the name of the shared bitfield for the given index.\nstring GetBitFieldName(int index);\n\n// Gets the name of the shared bitfield for the given bit index.\n// Effectively, GetBitFieldName(bitIndex / 32)\nstring GetBitFieldNameForBit(int bitIndex);\n\n// Generates the java code for the expression that returns the boolean value\n// of the bit of the shared bitfields for the given bit index.\n// Example: \"((bitField1_ & 0x04) == 0x04)\"\nstring GenerateGetBit(int bitIndex);\n\n// Generates the java code for the expression that sets the bit of the shared\n// bitfields for the given bit index.\n// Example: \"bitField1_ = (bitField1_ | 0x04)\"\nstring GenerateSetBit(int bitIndex);\n\n// Generates the java code for the expression that clears the bit of the shared\n// bitfields for the given bit index.\n// Example: \"bitField1_ = (bitField1_ & ~0x04)\"\nstring GenerateClearBit(int bitIndex);\n\n// Does the same as GenerateGetBit but operates on the bit field on a local\n// variable. This is used by the builder to copy the value in the builder to\n// the message.\n// Example: \"((from_bitField1_ & 0x04) == 0x04)\"\nstring GenerateGetBitFromLocal(int bitIndex);\n\n// Does the same as GenerateSetBit but operates on the bit field on a local\n// variable. This is used by the builder to copy the value in the builder to\n// the message.\n// Example: \"to_bitField1_ = (to_bitField1_ | 0x04)\"\nstring GenerateSetBitToLocal(int bitIndex);\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <algorithm>\n#include <google/protobuf/stubs/hash.h>\n#include <google/protobuf/compiler/java/java_message.h>\n#include <google/protobuf/compiler/java/java_enum.h>\n#include <google/protobuf/compiler/java/java_extension.h>\n#include <google/protobuf/compiler/java/java_helpers.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/descriptor.pb.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nusing internal::WireFormat;\nusing internal::WireFormatLite;\n\nnamespace {\n\nvoid PrintFieldComment(io::Printer* printer, const FieldDescriptor* field) {\n  // Print the field's proto-syntax definition as a comment.  We don't want to\n  // print group bodies so we cut off after the first line.\n  string def = field->DebugString();\n  printer->Print(\"// $def$\\n\",\n    \"def\", def.substr(0, def.find_first_of('\\n')));\n}\n\nstruct FieldOrderingByNumber {\n  inline bool operator()(const FieldDescriptor* a,\n                         const FieldDescriptor* b) const {\n    return a->number() < b->number();\n  }\n};\n\nstruct ExtensionRangeOrdering {\n  bool operator()(const Descriptor::ExtensionRange* a,\n                  const Descriptor::ExtensionRange* b) const {\n    return a->start < b->start;\n  }\n};\n\n// Sort the fields of the given Descriptor by number into a new[]'d array\n// and return it.\nconst FieldDescriptor** SortFieldsByNumber(const Descriptor* descriptor) {\n  const FieldDescriptor** fields =\n    new const FieldDescriptor*[descriptor->field_count()];\n  for (int i = 0; i < descriptor->field_count(); i++) {\n    fields[i] = descriptor->field(i);\n  }\n  sort(fields, fields + descriptor->field_count(),\n       FieldOrderingByNumber());\n  return fields;\n}\n\n// Get an identifier that uniquely identifies this type within the file.\n// This is used to declare static variables related to this type at the\n// outermost file scope.\nstring UniqueFileScopeIdentifier(const Descriptor* descriptor) {\n  return \"static_\" + StringReplace(descriptor->full_name(), \".\", \"_\", true);\n}\n\n// Returns true if the message type has any required fields.  If it doesn't,\n// we can optimize out calls to its isInitialized() method.\n//\n// already_seen is used to avoid checking the same type multiple times\n// (and also to protect against recursion).\nstatic bool HasRequiredFields(\n    const Descriptor* type,\n    hash_set<const Descriptor*>* already_seen) {\n  if (already_seen->count(type) > 0) {\n    // The type is already in cache.  This means that either:\n    // a. The type has no required fields.\n    // b. We are in the midst of checking if the type has required fields,\n    //    somewhere up the stack.  In this case, we know that if the type\n    //    has any required fields, they'll be found when we return to it,\n    //    and the whole call to HasRequiredFields() will return true.\n    //    Therefore, we don't have to check if this type has required fields\n    //    here.\n    return false;\n  }\n  already_seen->insert(type);\n\n  // If the type has extensions, an extension with message type could contain\n  // required fields, so we have to be conservative and assume such an\n  // extension exists.\n  if (type->extension_range_count() > 0) return true;\n\n  for (int i = 0; i < type->field_count(); i++) {\n    const FieldDescriptor* field = type->field(i);\n    if (field->is_required()) {\n      return true;\n    }\n    if (GetJavaType(field) == JAVATYPE_MESSAGE) {\n      if (HasRequiredFields(field->message_type(), already_seen)) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nstatic bool HasRequiredFields(const Descriptor* type) {\n  hash_set<const Descriptor*> already_seen;\n  return HasRequiredFields(type, &already_seen);\n}\n\n}  // namespace\n\n// ===================================================================\n\nMessageGenerator::MessageGenerator(const Descriptor* descriptor)\n  : descriptor_(descriptor),\n    field_generators_(descriptor) {\n}\n\nMessageGenerator::~MessageGenerator() {}\n\nvoid MessageGenerator::GenerateStaticVariables(io::Printer* printer) {\n  if (HasDescriptorMethods(descriptor_)) {\n    // Because descriptor.proto (com.google.protobuf.DescriptorProtos) is\n    // used in the construction of descriptors, we have a tricky bootstrapping\n    // problem.  To help control static initialization order, we make sure all\n    // descriptors and other static data that depends on them are members of\n    // the outermost class in the file.  This way, they will be initialized in\n    // a deterministic order.\n\n    map<string, string> vars;\n    vars[\"identifier\"] = UniqueFileScopeIdentifier(descriptor_);\n    vars[\"index\"] = SimpleItoa(descriptor_->index());\n    vars[\"classname\"] = ClassName(descriptor_);\n    if (descriptor_->containing_type() != NULL) {\n      vars[\"parent\"] = UniqueFileScopeIdentifier(\n          descriptor_->containing_type());\n    }\n    if (descriptor_->file()->options().java_multiple_files()) {\n      // We can only make these package-private since the classes that use them\n      // are in separate files.\n      vars[\"private\"] = \"\";\n    } else {\n      vars[\"private\"] = \"private \";\n    }\n\n    // The descriptor for this type.\n    printer->Print(vars,\n      \"$private$static com.google.protobuf.Descriptors.Descriptor\\n\"\n      \"  internal_$identifier$_descriptor;\\n\");\n\n    // And the FieldAccessorTable.\n    printer->Print(vars,\n      \"$private$static\\n\"\n      \"  com.google.protobuf.GeneratedMessage.FieldAccessorTable\\n\"\n      \"    internal_$identifier$_fieldAccessorTable;\\n\");\n  }\n\n  // Generate static members for all nested types.\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    // TODO(kenton):  Reuse MessageGenerator objects?\n    MessageGenerator(descriptor_->nested_type(i))\n      .GenerateStaticVariables(printer);\n  }\n}\n\nvoid MessageGenerator::GenerateStaticVariableInitializers(\n    io::Printer* printer) {\n  if (HasDescriptorMethods(descriptor_)) {\n    map<string, string> vars;\n    vars[\"identifier\"] = UniqueFileScopeIdentifier(descriptor_);\n    vars[\"index\"] = SimpleItoa(descriptor_->index());\n    vars[\"classname\"] = ClassName(descriptor_);\n    if (descriptor_->containing_type() != NULL) {\n      vars[\"parent\"] = UniqueFileScopeIdentifier(\n          descriptor_->containing_type());\n    }\n\n    // The descriptor for this type.\n    if (descriptor_->containing_type() == NULL) {\n      printer->Print(vars,\n        \"internal_$identifier$_descriptor =\\n\"\n        \"  getDescriptor().getMessageTypes().get($index$);\\n\");\n    } else {\n      printer->Print(vars,\n        \"internal_$identifier$_descriptor =\\n\"\n        \"  internal_$parent$_descriptor.getNestedTypes().get($index$);\\n\");\n    }\n\n    // And the FieldAccessorTable.\n    printer->Print(vars,\n      \"internal_$identifier$_fieldAccessorTable = new\\n\"\n      \"  com.google.protobuf.GeneratedMessage.FieldAccessorTable(\\n\"\n      \"    internal_$identifier$_descriptor,\\n\"\n      \"    new java.lang.String[] { \");\n    for (int i = 0; i < descriptor_->field_count(); i++) {\n      printer->Print(\n        \"\\\"$field_name$\\\", \",\n        \"field_name\",\n          UnderscoresToCapitalizedCamelCase(descriptor_->field(i)));\n    }\n    printer->Print(\"},\\n\"\n      \"    $classname$.class,\\n\"\n      \"    $classname$.Builder.class);\\n\",\n      \"classname\", ClassName(descriptor_));\n  }\n\n  // Generate static member initializers for all nested types.\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    // TODO(kenton):  Reuse MessageGenerator objects?\n    MessageGenerator(descriptor_->nested_type(i))\n      .GenerateStaticVariableInitializers(printer);\n  }\n}\n\n// ===================================================================\n\nvoid MessageGenerator::GenerateInterface(io::Printer* printer) {\n\n  if (descriptor_->extension_range_count() > 0) {\n    if (HasDescriptorMethods(descriptor_)) {\n      printer->Print(\n        \"public interface $classname$OrBuilder extends\\n\"\n        \"    com.google.protobuf.GeneratedMessage.\\n\"\n        \"        ExtendableMessageOrBuilder<$classname$> {\\n\",\n        \"classname\", descriptor_->name());\n    } else {\n      printer->Print(\n        \"public interface $classname$OrBuilder extends \\n\"\n        \"     com.google.protobuf.GeneratedMessageLite.\\n\"\n        \"          ExtendableMessageOrBuilder<$classname$> {\\n\",\n        \"classname\", descriptor_->name());\n    }\n  } else {\n    if (HasDescriptorMethods(descriptor_)) {\n      printer->Print(\n        \"public interface $classname$OrBuilder\\n\"\n        \"    extends com.google.protobuf.MessageOrBuilder {\\n\",\n        \"classname\", descriptor_->name());\n    } else {\n      printer->Print(\n        \"public interface $classname$OrBuilder\\n\"\n        \"    extends com.google.protobuf.MessageLiteOrBuilder {\\n\",\n        \"classname\", descriptor_->name());\n    }\n  }\n\n  printer->Indent();\n    for (int i = 0; i < descriptor_->field_count(); i++) {\n      printer->Print(\"\\n\");\n      PrintFieldComment(printer, descriptor_->field(i));\n      field_generators_.get(descriptor_->field(i))\n                       .GenerateInterfaceMembers(printer);\n    }\n  printer->Outdent();\n\n  printer->Print(\"}\\n\");\n}\n\n// ===================================================================\n\nvoid MessageGenerator::Generate(io::Printer* printer) {\n  bool is_own_file =\n    descriptor_->containing_type() == NULL &&\n    descriptor_->file()->options().java_multiple_files();\n\n  if (descriptor_->extension_range_count() > 0) {\n    if (HasDescriptorMethods(descriptor_)) {\n      printer->Print(\n        \"public $static$ final class $classname$ extends\\n\"\n        \"    com.google.protobuf.GeneratedMessage.ExtendableMessage<\\n\"\n        \"      $classname$> implements $classname$OrBuilder {\\n\",\n        \"static\", is_own_file ? \"\" : \"static\",\n        \"classname\", descriptor_->name());\n    } else {\n      printer->Print(\n        \"public $static$ final class $classname$ extends\\n\"\n        \"    com.google.protobuf.GeneratedMessageLite.ExtendableMessage<\\n\"\n        \"      $classname$> implements $classname$OrBuilder {\\n\",\n        \"static\", is_own_file ? \"\" : \"static\",\n        \"classname\", descriptor_->name());\n    }\n  } else {\n    if (HasDescriptorMethods(descriptor_)) {\n      printer->Print(\n        \"public $static$ final class $classname$ extends\\n\"\n        \"    com.google.protobuf.GeneratedMessage\\n\"\n        \"    implements $classname$OrBuilder {\\n\",\n        \"static\", is_own_file ? \"\" : \"static\",\n        \"classname\", descriptor_->name());\n    } else {\n      printer->Print(\n        \"public $static$ final class $classname$ extends\\n\"\n        \"    com.google.protobuf.GeneratedMessageLite\\n\"\n        \"    implements $classname$OrBuilder {\\n\",\n        \"static\", is_own_file ? \"\" : \"static\",\n        \"classname\", descriptor_->name());\n    }\n  }\n  printer->Indent();\n  printer->Print(\n    \"// Use $classname$.newBuilder() to construct.\\n\"\n    \"private $classname$(Builder builder) {\\n\"\n    \"  super(builder);\\n\"\n    \"}\\n\"\n    // Used when constructing the default instance, which cannot be initialized\n    // immediately because it may cyclically refer to other default instances.\n    \"private $classname$(boolean noInit) {}\\n\"\n    \"\\n\"\n    \"private static final $classname$ defaultInstance;\\n\"\n    \"public static $classname$ getDefaultInstance() {\\n\"\n    \"  return defaultInstance;\\n\"\n    \"}\\n\"\n    \"\\n\"\n    \"public $classname$ getDefaultInstanceForType() {\\n\"\n    \"  return defaultInstance;\\n\"\n    \"}\\n\"\n    \"\\n\",\n    \"classname\", descriptor_->name());\n\n  GenerateDescriptorMethods(printer);\n\n  // Nested types\n  for (int i = 0; i < descriptor_->enum_type_count(); i++) {\n    EnumGenerator(descriptor_->enum_type(i)).Generate(printer);\n  }\n\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    MessageGenerator messageGenerator(descriptor_->nested_type(i));\n    messageGenerator.GenerateInterface(printer);\n    messageGenerator.Generate(printer);\n  }\n\n  // Integers for bit fields.\n  int totalBits = 0;\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    totalBits += field_generators_.get(descriptor_->field(i))\n        .GetNumBitsForMessage();\n  }\n  int totalInts = (totalBits + 31) / 32;\n  for (int i = 0; i < totalInts; i++) {\n    printer->Print(\"private int $bit_field_name$;\\n\",\n      \"bit_field_name\", GetBitFieldName(i));\n  }\n\n  // Fields\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    PrintFieldComment(printer, descriptor_->field(i));\n    printer->Print(\"public static final int $constant_name$ = $number$;\\n\",\n      \"constant_name\", FieldConstantName(descriptor_->field(i)),\n      \"number\", SimpleItoa(descriptor_->field(i)->number()));\n    field_generators_.get(descriptor_->field(i)).GenerateMembers(printer);\n    printer->Print(\"\\n\");\n  }\n\n  // Called by the constructor, except in the case of the default instance,\n  // in which case this is called by static init code later on.\n  printer->Print(\"private void initFields() {\\n\");\n  printer->Indent();\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    field_generators_.get(descriptor_->field(i))\n                     .GenerateInitializationCode(printer);\n  }\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n\n  if (HasGeneratedMethods(descriptor_)) {\n    GenerateIsInitialized(printer, MEMOIZE);\n    GenerateMessageSerializationMethods(printer);\n  }\n\n  if (HasEqualsAndHashCode(descriptor_)) {\n    GenerateEqualsAndHashCode(printer);\n  }\n\n  GenerateParseFromMethods(printer);\n  GenerateBuilder(printer);\n\n  // Carefully initialize the default instance in such a way that it doesn't\n  // conflict with other initialization.\n  printer->Print(\n    \"\\n\"\n    \"static {\\n\"\n    \"  defaultInstance = new $classname$(true);\\n\"\n    \"  defaultInstance.initFields();\\n\"\n    \"}\\n\"\n    \"\\n\"\n    \"// @@protoc_insertion_point(class_scope:$full_name$)\\n\",\n    \"classname\", descriptor_->name(),\n    \"full_name\", descriptor_->full_name());\n\n  // Extensions must be declared after the defaultInstance is initialized\n  // because the defaultInstance is used by the extension to lazily retrieve\n  // the outer class's FileDescriptor.\n  for (int i = 0; i < descriptor_->extension_count(); i++) {\n    ExtensionGenerator(descriptor_->extension(i)).Generate(printer);\n  }\n\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n}\n\n\n// ===================================================================\n\nvoid MessageGenerator::\nGenerateMessageSerializationMethods(io::Printer* printer) {\n  scoped_array<const FieldDescriptor*> sorted_fields(\n    SortFieldsByNumber(descriptor_));\n\n  vector<const Descriptor::ExtensionRange*> sorted_extensions;\n  for (int i = 0; i < descriptor_->extension_range_count(); ++i) {\n    sorted_extensions.push_back(descriptor_->extension_range(i));\n  }\n  sort(sorted_extensions.begin(), sorted_extensions.end(),\n       ExtensionRangeOrdering());\n\n  printer->Print(\n    \"public void writeTo(com.google.protobuf.CodedOutputStream output)\\n\"\n    \"                    throws java.io.IOException {\\n\");\n  printer->Indent();\n  // writeTo(CodedOutputStream output) might be invoked without\n  // getSerializedSize() ever being called, but we need the memoized\n  // sizes in case this message has packed fields. Rather than emit checks for\n  // each packed field, just call getSerializedSize() up front for all messages.\n  // In most cases, getSerializedSize() will have already been called anyway by\n  // one of the wrapper writeTo() methods, making this call cheap.\n  printer->Print(\n    \"getSerializedSize();\\n\");\n\n  if (descriptor_->extension_range_count() > 0) {\n    if (descriptor_->options().message_set_wire_format()) {\n      printer->Print(\n        \"com.google.protobuf.GeneratedMessage$lite$\\n\"\n        \"  .ExtendableMessage<$classname$>.ExtensionWriter extensionWriter =\\n\"\n        \"    newMessageSetExtensionWriter();\\n\",\n        \"lite\", HasDescriptorMethods(descriptor_) ? \"\" : \"Lite\",\n        \"classname\", ClassName(descriptor_));\n    } else {\n      printer->Print(\n        \"com.google.protobuf.GeneratedMessage$lite$\\n\"\n        \"  .ExtendableMessage<$classname$>.ExtensionWriter extensionWriter =\\n\"\n        \"    newExtensionWriter();\\n\",\n        \"lite\", HasDescriptorMethods(descriptor_) ? \"\" : \"Lite\",\n        \"classname\", ClassName(descriptor_));\n    }\n  }\n\n  // Merge the fields and the extension ranges, both sorted by field number.\n  for (int i = 0, j = 0;\n       i < descriptor_->field_count() || j < sorted_extensions.size();\n       ) {\n    if (i == descriptor_->field_count()) {\n      GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]);\n    } else if (j == sorted_extensions.size()) {\n      GenerateSerializeOneField(printer, sorted_fields[i++]);\n    } else if (sorted_fields[i]->number() < sorted_extensions[j]->start) {\n      GenerateSerializeOneField(printer, sorted_fields[i++]);\n    } else {\n      GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]);\n    }\n  }\n\n  if (HasUnknownFields(descriptor_)) {\n    if (descriptor_->options().message_set_wire_format()) {\n      printer->Print(\n        \"getUnknownFields().writeAsMessageSetTo(output);\\n\");\n    } else {\n      printer->Print(\n        \"getUnknownFields().writeTo(output);\\n\");\n    }\n  }\n\n  printer->Outdent();\n  printer->Print(\n    \"}\\n\"\n    \"\\n\"\n    \"private int memoizedSerializedSize = -1;\\n\"\n    \"public int getSerializedSize() {\\n\"\n    \"  int size = memoizedSerializedSize;\\n\"\n    \"  if (size != -1) return size;\\n\"\n    \"\\n\"\n    \"  size = 0;\\n\");\n  printer->Indent();\n\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    field_generators_.get(sorted_fields[i]).GenerateSerializedSizeCode(printer);\n  }\n\n  if (descriptor_->extension_range_count() > 0) {\n    if (descriptor_->options().message_set_wire_format()) {\n      printer->Print(\n        \"size += extensionsSerializedSizeAsMessageSet();\\n\");\n    } else {\n      printer->Print(\n        \"size += extensionsSerializedSize();\\n\");\n    }\n  }\n\n  if (HasUnknownFields(descriptor_)) {\n    if (descriptor_->options().message_set_wire_format()) {\n      printer->Print(\n        \"size += getUnknownFields().getSerializedSizeAsMessageSet();\\n\");\n    } else {\n      printer->Print(\n        \"size += getUnknownFields().getSerializedSize();\\n\");\n    }\n  }\n\n  printer->Outdent();\n  printer->Print(\n    \"  memoizedSerializedSize = size;\\n\"\n    \"  return size;\\n\"\n    \"}\\n\"\n    \"\\n\");\n\n  printer->Print(\n    \"private static final long serialVersionUID = 0L;\\n\"\n    \"@java.lang.Override\\n\"\n    \"protected java.lang.Object writeReplace()\\n\"\n    \"    throws java.io.ObjectStreamException {\\n\"\n    \"  return super.writeReplace();\\n\"\n    \"}\\n\"\n    \"\\n\");\n}\n\nvoid MessageGenerator::\nGenerateParseFromMethods(io::Printer* printer) {\n  // Note:  These are separate from GenerateMessageSerializationMethods()\n  //   because they need to be generated even for messages that are optimized\n  //   for code size.\n  printer->Print(\n    \"public static $classname$ parseFrom(\\n\"\n    \"    com.google.protobuf.ByteString data)\\n\"\n    \"    throws com.google.protobuf.InvalidProtocolBufferException {\\n\"\n    \"  return newBuilder().mergeFrom(data).buildParsed();\\n\"\n    \"}\\n\"\n    \"public static $classname$ parseFrom(\\n\"\n    \"    com.google.protobuf.ByteString data,\\n\"\n    \"    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\\n\"\n    \"    throws com.google.protobuf.InvalidProtocolBufferException {\\n\"\n    \"  return newBuilder().mergeFrom(data, extensionRegistry)\\n\"\n    \"           .buildParsed();\\n\"\n    \"}\\n\"\n    \"public static $classname$ parseFrom(byte[] data)\\n\"\n    \"    throws com.google.protobuf.InvalidProtocolBufferException {\\n\"\n    \"  return newBuilder().mergeFrom(data).buildParsed();\\n\"\n    \"}\\n\"\n    \"public static $classname$ parseFrom(\\n\"\n    \"    byte[] data,\\n\"\n    \"    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\\n\"\n    \"    throws com.google.protobuf.InvalidProtocolBufferException {\\n\"\n    \"  return newBuilder().mergeFrom(data, extensionRegistry)\\n\"\n    \"           .buildParsed();\\n\"\n    \"}\\n\"\n    \"public static $classname$ parseFrom(java.io.InputStream input)\\n\"\n    \"    throws java.io.IOException {\\n\"\n    \"  return newBuilder().mergeFrom(input).buildParsed();\\n\"\n    \"}\\n\"\n    \"public static $classname$ parseFrom(\\n\"\n    \"    java.io.InputStream input,\\n\"\n    \"    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\\n\"\n    \"    throws java.io.IOException {\\n\"\n    \"  return newBuilder().mergeFrom(input, extensionRegistry)\\n\"\n    \"           .buildParsed();\\n\"\n    \"}\\n\"\n    \"public static $classname$ parseDelimitedFrom(java.io.InputStream input)\\n\"\n    \"    throws java.io.IOException {\\n\"\n    \"  Builder builder = newBuilder();\\n\"\n    \"  if (builder.mergeDelimitedFrom(input)) {\\n\"\n    \"    return builder.buildParsed();\\n\"\n    \"  } else {\\n\"\n    \"    return null;\\n\"\n    \"  }\\n\"\n    \"}\\n\"\n    \"public static $classname$ parseDelimitedFrom(\\n\"\n    \"    java.io.InputStream input,\\n\"\n    \"    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\\n\"\n    \"    throws java.io.IOException {\\n\"\n    \"  Builder builder = newBuilder();\\n\"\n    \"  if (builder.mergeDelimitedFrom(input, extensionRegistry)) {\\n\"\n    \"    return builder.buildParsed();\\n\"\n    \"  } else {\\n\"\n    \"    return null;\\n\"\n    \"  }\\n\"\n    \"}\\n\"\n    \"public static $classname$ parseFrom(\\n\"\n    \"    com.google.protobuf.CodedInputStream input)\\n\"\n    \"    throws java.io.IOException {\\n\"\n    \"  return newBuilder().mergeFrom(input).buildParsed();\\n\"\n    \"}\\n\"\n    \"public static $classname$ parseFrom(\\n\"\n    \"    com.google.protobuf.CodedInputStream input,\\n\"\n    \"    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\\n\"\n    \"    throws java.io.IOException {\\n\"\n    \"  return newBuilder().mergeFrom(input, extensionRegistry)\\n\"\n    \"           .buildParsed();\\n\"\n    \"}\\n\"\n    \"\\n\",\n    \"classname\", ClassName(descriptor_));\n}\n\nvoid MessageGenerator::GenerateSerializeOneField(\n    io::Printer* printer, const FieldDescriptor* field) {\n  field_generators_.get(field).GenerateSerializationCode(printer);\n}\n\nvoid MessageGenerator::GenerateSerializeOneExtensionRange(\n    io::Printer* printer, const Descriptor::ExtensionRange* range) {\n  printer->Print(\n    \"extensionWriter.writeUntil($end$, output);\\n\",\n    \"end\", SimpleItoa(range->end));\n}\n\n// ===================================================================\n\nvoid MessageGenerator::GenerateBuilder(io::Printer* printer) {\n  printer->Print(\n    \"public static Builder newBuilder() { return Builder.create(); }\\n\"\n    \"public Builder newBuilderForType() { return newBuilder(); }\\n\"\n    \"public static Builder newBuilder($classname$ prototype) {\\n\"\n    \"  return newBuilder().mergeFrom(prototype);\\n\"\n    \"}\\n\"\n    \"public Builder toBuilder() { return newBuilder(this); }\\n\"\n    \"\\n\",\n    \"classname\", ClassName(descriptor_));\n\n  if (HasNestedBuilders(descriptor_)) {\n     printer->Print(\n      \"@java.lang.Override\\n\"\n      \"protected Builder newBuilderForType(\\n\"\n      \"    com.google.protobuf.GeneratedMessage.BuilderParent parent) {\\n\"\n      \"  Builder builder = new Builder(parent);\\n\"\n      \"  return builder;\\n\"\n      \"}\\n\");\n  }\n\n  if (descriptor_->extension_range_count() > 0) {\n    if (HasDescriptorMethods(descriptor_)) {\n      printer->Print(\n        \"public static final class Builder extends\\n\"\n        \"    com.google.protobuf.GeneratedMessage.ExtendableBuilder<\\n\"\n        \"      $classname$, Builder> implements $classname$OrBuilder {\\n\",\n        \"classname\", ClassName(descriptor_));\n    } else {\n      printer->Print(\n        \"public static final class Builder extends\\n\"\n        \"    com.google.protobuf.GeneratedMessageLite.ExtendableBuilder<\\n\"\n        \"      $classname$, Builder> implements $classname$OrBuilder {\\n\",\n        \"classname\", ClassName(descriptor_));\n    }\n  } else {\n    if (HasDescriptorMethods(descriptor_)) {\n      printer->Print(\n        \"public static final class Builder extends\\n\"\n        \"    com.google.protobuf.GeneratedMessage.Builder<Builder>\\n\"\n         \"   implements $classname$OrBuilder {\\n\",\n        \"classname\", ClassName(descriptor_));\n    } else {\n      printer->Print(\n        \"public static final class Builder extends\\n\"\n        \"    com.google.protobuf.GeneratedMessageLite.Builder<\\n\"\n        \"      $classname$, Builder>\\n\"\n        \"    implements $classname$OrBuilder {\\n\",\n        \"classname\", ClassName(descriptor_));\n    }\n  }\n  printer->Indent();\n\n  GenerateDescriptorMethods(printer);\n  GenerateCommonBuilderMethods(printer);\n\n  if (HasGeneratedMethods(descriptor_)) {\n    GenerateIsInitialized(printer, DONT_MEMOIZE);\n    GenerateBuilderParsingMethods(printer);\n  }\n\n  // Integers for bit fields.\n  int totalBits = 0;\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    totalBits += field_generators_.get(descriptor_->field(i))\n        .GetNumBitsForBuilder();\n  }\n  int totalInts = (totalBits + 31) / 32;\n  for (int i = 0; i < totalInts; i++) {\n    printer->Print(\"private int $bit_field_name$;\\n\",\n      \"bit_field_name\", GetBitFieldName(i));\n  }\n\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    printer->Print(\"\\n\");\n    PrintFieldComment(printer, descriptor_->field(i));\n    field_generators_.get(descriptor_->field(i))\n                     .GenerateBuilderMembers(printer);\n  }\n\n  printer->Print(\n    \"\\n\"\n    \"// @@protoc_insertion_point(builder_scope:$full_name$)\\n\",\n    \"full_name\", descriptor_->full_name());\n\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nvoid MessageGenerator::GenerateDescriptorMethods(io::Printer* printer) {\n  if (HasDescriptorMethods(descriptor_)) {\n    printer->Print(\n      \"public static final com.google.protobuf.Descriptors.Descriptor\\n\"\n      \"    getDescriptor() {\\n\"\n      \"  return $fileclass$.internal_$identifier$_descriptor;\\n\"\n      \"}\\n\"\n      \"\\n\"\n      \"protected com.google.protobuf.GeneratedMessage.FieldAccessorTable\\n\"\n      \"    internalGetFieldAccessorTable() {\\n\"\n      \"  return $fileclass$.internal_$identifier$_fieldAccessorTable;\\n\"\n      \"}\\n\"\n      \"\\n\",\n      \"fileclass\", ClassName(descriptor_->file()),\n      \"identifier\", UniqueFileScopeIdentifier(descriptor_));\n  }\n}\n\n// ===================================================================\n\nvoid MessageGenerator::GenerateCommonBuilderMethods(io::Printer* printer) {\n  printer->Print(\n    \"// Construct using $classname$.newBuilder()\\n\"\n    \"private Builder() {\\n\"\n    \"  maybeForceBuilderInitialization();\\n\"\n    \"}\\n\"\n    \"\\n\",\n    \"classname\", ClassName(descriptor_));\n\n  if (HasDescriptorMethods(descriptor_)) {\n    printer->Print(\n      \"private Builder(BuilderParent parent) {\\n\"\n      \"  super(parent);\\n\"\n      \"  maybeForceBuilderInitialization();\\n\"\n      \"}\\n\",\n      \"classname\", ClassName(descriptor_));\n  }\n\n\n  if (HasNestedBuilders(descriptor_)) {\n    printer->Print(\n      \"private void maybeForceBuilderInitialization() {\\n\"\n      \"  if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {\\n\");\n\n    printer->Indent();\n    printer->Indent();\n    for (int i = 0; i < descriptor_->field_count(); i++) {\n      field_generators_.get(descriptor_->field(i))\n          .GenerateFieldBuilderInitializationCode(printer);\n    }\n    printer->Outdent();\n    printer->Outdent();\n\n    printer->Print(\n      \"  }\\n\"\n      \"}\\n\");\n  } else {\n    printer->Print(\n      \"private void maybeForceBuilderInitialization() {\\n\"\n      \"}\\n\");\n  }\n\n  printer->Print(\n    \"private static Builder create() {\\n\"\n    \"  return new Builder();\\n\"\n    \"}\\n\"\n    \"\\n\"\n    \"public Builder clear() {\\n\"\n    \"  super.clear();\\n\",\n    \"classname\", ClassName(descriptor_));\n\n  printer->Indent();\n\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    field_generators_.get(descriptor_->field(i))\n        .GenerateBuilderClearCode(printer);\n  }\n\n  printer->Outdent();\n\n  printer->Print(\n    \"  return this;\\n\"\n    \"}\\n\"\n    \"\\n\"\n    \"public Builder clone() {\\n\"\n    \"  return create().mergeFrom(buildPartial());\\n\"\n    \"}\\n\"\n    \"\\n\",\n    \"classname\", ClassName(descriptor_));\n  if (HasDescriptorMethods(descriptor_)) {\n    printer->Print(\n      \"public com.google.protobuf.Descriptors.Descriptor\\n\"\n      \"    getDescriptorForType() {\\n\"\n      \"  return $classname$.getDescriptor();\\n\"\n      \"}\\n\"\n      \"\\n\",\n      \"classname\", ClassName(descriptor_));\n  }\n  printer->Print(\n    \"public $classname$ getDefaultInstanceForType() {\\n\"\n    \"  return $classname$.getDefaultInstance();\\n\"\n    \"}\\n\"\n    \"\\n\",\n    \"classname\", ClassName(descriptor_));\n\n  // -----------------------------------------------------------------\n\n  printer->Print(\n    \"public $classname$ build() {\\n\"\n    \"  $classname$ result = buildPartial();\\n\"\n    \"  if (!result.isInitialized()) {\\n\"\n    \"    throw newUninitializedMessageException(result);\\n\"\n    \"  }\\n\"\n    \"  return result;\\n\"\n    \"}\\n\"\n    \"\\n\"\n    \"private $classname$ buildParsed()\\n\"\n    \"    throws com.google.protobuf.InvalidProtocolBufferException {\\n\"\n    \"  $classname$ result = buildPartial();\\n\"\n    \"  if (!result.isInitialized()) {\\n\"\n    \"    throw newUninitializedMessageException(\\n\"\n    \"      result).asInvalidProtocolBufferException();\\n\"\n    \"  }\\n\"\n    \"  return result;\\n\"\n    \"}\\n\"\n    \"\\n\"\n    \"public $classname$ buildPartial() {\\n\"\n    \"  $classname$ result = new $classname$(this);\\n\",\n    \"classname\", ClassName(descriptor_));\n\n  printer->Indent();\n\n  // Local vars for from and to bit fields to avoid accessing the builder and\n  // message over and over for these fields. Seems to provide a slight\n  // perforamance improvement in micro benchmark and this is also what proto1\n  // code does.\n  int totalBuilderBits = 0;\n  int totalMessageBits = 0;\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldGenerator& field = field_generators_.get(descriptor_->field(i));\n    totalBuilderBits += field.GetNumBitsForBuilder();\n    totalMessageBits += field.GetNumBitsForMessage();\n  }\n  int totalBuilderInts = (totalBuilderBits + 31) / 32;\n  int totalMessageInts = (totalMessageBits + 31) / 32;\n  for (int i = 0; i < totalBuilderInts; i++) {\n    printer->Print(\"int from_$bit_field_name$ = $bit_field_name$;\\n\",\n      \"bit_field_name\", GetBitFieldName(i));\n  }\n  for (int i = 0; i < totalMessageInts; i++) {\n    printer->Print(\"int to_$bit_field_name$ = 0;\\n\",\n      \"bit_field_name\", GetBitFieldName(i));\n  }\n\n  // Output generation code for each field.\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    field_generators_.get(descriptor_->field(i)).GenerateBuildingCode(printer);\n  }\n\n  // Copy the bit field results to the generated message\n  for (int i = 0; i < totalMessageInts; i++) {\n    printer->Print(\"result.$bit_field_name$ = to_$bit_field_name$;\\n\",\n      \"bit_field_name\", GetBitFieldName(i));\n  }\n\n  printer->Outdent();\n\n  if (HasDescriptorMethods(descriptor_)) {\n    printer->Print(\n    \"  onBuilt();\\n\");\n  }\n\n  printer->Print(\n    \"  return result;\\n\"\n    \"}\\n\"\n    \"\\n\",\n    \"classname\", ClassName(descriptor_));\n\n  // -----------------------------------------------------------------\n\n  if (HasGeneratedMethods(descriptor_)) {\n    // MergeFrom(Message other) requires the ability to distinguish the other\n    // messages type by its descriptor.\n    if (HasDescriptorMethods(descriptor_)) {\n      printer->Print(\n        \"public Builder mergeFrom(com.google.protobuf.Message other) {\\n\"\n        \"  if (other instanceof $classname$) {\\n\"\n        \"    return mergeFrom(($classname$)other);\\n\"\n        \"  } else {\\n\"\n        \"    super.mergeFrom(other);\\n\"\n        \"    return this;\\n\"\n        \"  }\\n\"\n        \"}\\n\"\n        \"\\n\",\n        \"classname\", ClassName(descriptor_));\n    }\n\n    printer->Print(\n      \"public Builder mergeFrom($classname$ other) {\\n\"\n      // Optimization:  If other is the default instance, we know none of its\n      //   fields are set so we can skip the merge.\n      \"  if (other == $classname$.getDefaultInstance()) return this;\\n\",\n      \"classname\", ClassName(descriptor_));\n    printer->Indent();\n\n    for (int i = 0; i < descriptor_->field_count(); i++) {\n      field_generators_.get(descriptor_->field(i)).GenerateMergingCode(printer);\n    }\n\n    printer->Outdent();\n\n    // if message type has extensions\n    if (descriptor_->extension_range_count() > 0) {\n      printer->Print(\n        \"  this.mergeExtensionFields(other);\\n\");\n    }\n\n    if (HasUnknownFields(descriptor_)) {\n      printer->Print(\n        \"  this.mergeUnknownFields(other.getUnknownFields());\\n\");\n    }\n\n    printer->Print(\n      \"  return this;\\n\"\n      \"}\\n\"\n      \"\\n\");\n  }\n}\n\n// ===================================================================\n\nvoid MessageGenerator::GenerateBuilderParsingMethods(io::Printer* printer) {\n  scoped_array<const FieldDescriptor*> sorted_fields(\n    SortFieldsByNumber(descriptor_));\n\n  printer->Print(\n    \"public Builder mergeFrom(\\n\"\n    \"    com.google.protobuf.CodedInputStream input,\\n\"\n    \"    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\\n\"\n    \"    throws java.io.IOException {\\n\");\n  printer->Indent();\n\n  if (HasUnknownFields(descriptor_)) {\n    printer->Print(\n      \"com.google.protobuf.UnknownFieldSet.Builder unknownFields =\\n\"\n      \"  com.google.protobuf.UnknownFieldSet.newBuilder(\\n\"\n      \"    this.getUnknownFields());\\n\");\n  }\n\n  printer->Print(\n    \"while (true) {\\n\");\n  printer->Indent();\n\n  printer->Print(\n    \"int tag = input.readTag();\\n\"\n    \"switch (tag) {\\n\");\n  printer->Indent();\n\n  if (HasUnknownFields(descriptor_)) {\n    printer->Print(\n      \"case 0:\\n\"          // zero signals EOF / limit reached\n      \"  this.setUnknownFields(unknownFields.build());\\n\"\n      \"  $on_changed$\\n\"\n      \"  return this;\\n\"\n      \"default: {\\n\"\n      \"  if (!parseUnknownField(input, unknownFields,\\n\"\n      \"                         extensionRegistry, tag)) {\\n\"\n      \"    this.setUnknownFields(unknownFields.build());\\n\"\n      \"    $on_changed$\\n\"\n      \"    return this;\\n\"   // it's an endgroup tag\n      \"  }\\n\"\n      \"  break;\\n\"\n      \"}\\n\",\n      \"on_changed\", HasDescriptorMethods(descriptor_) ? \"onChanged();\" : \"\");\n  } else {\n    printer->Print(\n      \"case 0:\\n\"          // zero signals EOF / limit reached\n      \"  $on_changed$\\n\"\n      \"  return this;\\n\"\n      \"default: {\\n\"\n      \"  if (!parseUnknownField(input, extensionRegistry, tag)) {\\n\"\n      \"    $on_changed$\\n\"\n      \"    return this;\\n\"   // it's an endgroup tag\n      \"  }\\n\"\n      \"  break;\\n\"\n      \"}\\n\",\n      \"on_changed\", HasDescriptorMethods(descriptor_) ? \"onChanged();\" : \"\");\n  }\n\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = sorted_fields[i];\n    uint32 tag = WireFormatLite::MakeTag(field->number(),\n      WireFormat::WireTypeForFieldType(field->type()));\n\n    printer->Print(\n      \"case $tag$: {\\n\",\n      \"tag\", SimpleItoa(tag));\n    printer->Indent();\n\n    field_generators_.get(field).GenerateParsingCode(printer);\n\n    printer->Outdent();\n    printer->Print(\n      \"  break;\\n\"\n      \"}\\n\");\n\n    if (field->is_packable()) {\n      // To make packed = true wire compatible, we generate parsing code from a\n      // packed version of this field regardless of field->options().packed().\n      uint32 packed_tag = WireFormatLite::MakeTag(field->number(),\n        WireFormatLite::WIRETYPE_LENGTH_DELIMITED);\n      printer->Print(\n        \"case $tag$: {\\n\",\n        \"tag\", SimpleItoa(packed_tag));\n      printer->Indent();\n\n      field_generators_.get(field).GenerateParsingCodeFromPacked(printer);\n\n      printer->Outdent();\n      printer->Print(\n        \"  break;\\n\"\n        \"}\\n\");\n    }\n  }\n\n  printer->Outdent();\n  printer->Outdent();\n  printer->Outdent();\n  printer->Print(\n    \"    }\\n\"     // switch (tag)\n    \"  }\\n\"       // while (true)\n    \"}\\n\"\n\n    \"\\n\");\n}\n\n// ===================================================================\n\nvoid MessageGenerator::GenerateIsInitialized(\n    io::Printer* printer, UseMemoization useMemoization) {\n  bool memoization = useMemoization == MEMOIZE;\n  if (memoization) {\n    // Memoizes whether the protocol buffer is fully initialized (has all\n    // required fields). -1 means not yet computed. 0 means false and 1 means\n    // true.\n    printer->Print(\n      \"private byte memoizedIsInitialized = -1;\\n\");\n  }\n  printer->Print(\n    \"public final boolean isInitialized() {\\n\");\n  printer->Indent();\n\n  if (memoization) {\n    printer->Print(\n      \"byte isInitialized = memoizedIsInitialized;\\n\"\n      \"if (isInitialized != -1) return isInitialized == 1;\\n\"\n      \"\\n\");\n  }\n\n  // Check that all required fields in this message are set.\n  // TODO(kenton):  We can optimize this when we switch to putting all the\n  //   \"has\" fields into a single bitfield.\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n\n    if (field->is_required()) {\n      printer->Print(\n        \"if (!has$name$()) {\\n\"\n        \"  $memoize$\\n\"\n        \"  return false;\\n\"\n        \"}\\n\",\n        \"name\", UnderscoresToCapitalizedCamelCase(field),\n        \"memoize\", memoization ? \"memoizedIsInitialized = 0;\" : \"\");\n    }\n  }\n\n  // Now check that all embedded messages are initialized.\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n    if (GetJavaType(field) == JAVATYPE_MESSAGE &&\n        HasRequiredFields(field->message_type())) {\n      switch (field->label()) {\n        case FieldDescriptor::LABEL_REQUIRED:\n          printer->Print(\n            \"if (!get$name$().isInitialized()) {\\n\"\n             \"  $memoize$\\n\"\n             \"  return false;\\n\"\n             \"}\\n\",\n            \"type\", ClassName(field->message_type()),\n            \"name\", UnderscoresToCapitalizedCamelCase(field),\n            \"memoize\", memoization ? \"memoizedIsInitialized = 0;\" : \"\");\n          break;\n        case FieldDescriptor::LABEL_OPTIONAL:\n          printer->Print(\n            \"if (has$name$()) {\\n\"\n            \"  if (!get$name$().isInitialized()) {\\n\"\n            \"    $memoize$\\n\"\n            \"    return false;\\n\"\n            \"  }\\n\"\n            \"}\\n\",\n            \"type\", ClassName(field->message_type()),\n            \"name\", UnderscoresToCapitalizedCamelCase(field),\n            \"memoize\", memoization ? \"memoizedIsInitialized = 0;\" : \"\");\n          break;\n        case FieldDescriptor::LABEL_REPEATED:\n          printer->Print(\n            \"for (int i = 0; i < get$name$Count(); i++) {\\n\"\n            \"  if (!get$name$(i).isInitialized()) {\\n\"\n            \"    $memoize$\\n\"\n            \"    return false;\\n\"\n            \"  }\\n\"\n            \"}\\n\",\n            \"type\", ClassName(field->message_type()),\n            \"name\", UnderscoresToCapitalizedCamelCase(field),\n            \"memoize\", memoization ? \"memoizedIsInitialized = 0;\" : \"\");\n          break;\n      }\n    }\n  }\n\n  if (descriptor_->extension_range_count() > 0) {\n    printer->Print(\n      \"if (!extensionsAreInitialized()) {\\n\"\n      \"  $memoize$\\n\"\n      \"  return false;\\n\"\n      \"}\\n\",\n      \"memoize\", memoization ? \"memoizedIsInitialized = 0;\" : \"\");\n  }\n\n  printer->Outdent();\n\n  if (memoization) {\n    printer->Print(\n      \"  memoizedIsInitialized = 1;\\n\");\n  }\n\n  printer->Print(\n    \"  return true;\\n\"\n    \"}\\n\"\n    \"\\n\");\n}\n\n// ===================================================================\n\nvoid MessageGenerator::GenerateEqualsAndHashCode(io::Printer* printer) {\n  printer->Print(\n    \"@java.lang.Override\\n\"\n    \"public boolean equals(final java.lang.Object obj) {\\n\");\n  printer->Indent();\n  printer->Print(\n    \"if (obj == this) {\\n\"\n    \" return true;\\n\"\n    \"}\\n\"\n    \"if (!(obj instanceof $classname$)) {\\n\"\n    \"  return super.equals(obj);\\n\"\n    \"}\\n\"\n    \"$classname$ other = ($classname$) obj;\\n\"\n    \"\\n\",\n    \"classname\", ClassName(descriptor_));\n\n  printer->Print(\"boolean result = true;\\n\");\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n    if (!field->is_repeated()) {\n      printer->Print(\n        \"result = result && (has$name$() == other.has$name$());\\n\"\n        \"if (has$name$()) {\\n\",\n        \"name\", UnderscoresToCapitalizedCamelCase(field));\n      printer->Indent();\n    }\n    field_generators_.get(field).GenerateEqualsCode(printer);\n    if (!field->is_repeated()) {\n      printer->Outdent();\n      printer->Print(\n        \"}\\n\");\n    }\n  }\n  if (HasDescriptorMethods(descriptor_)) {\n    printer->Print(\n      \"result = result &&\\n\"\n      \"    getUnknownFields().equals(other.getUnknownFields());\\n\");\n    if (descriptor_->extension_range_count() > 0) {\n      printer->Print(\n        \"result = result &&\\n\"\n        \"    getExtensionFields().equals(other.getExtensionFields());\\n\");\n    }\n  }\n  printer->Print(\n    \"return result;\\n\");\n  printer->Outdent();\n  printer->Print(\n    \"}\\n\"\n    \"\\n\");\n\n  printer->Print(\n    \"@java.lang.Override\\n\"\n    \"public int hashCode() {\\n\");\n  printer->Indent();\n  printer->Print(\n    \"int hash = 41;\\n\"\n    \"hash = (19 * hash) + getDescriptorForType().hashCode();\\n\");\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n    if (!field->is_repeated()) {\n      printer->Print(\n        \"if (has$name$()) {\\n\",\n        \"name\", UnderscoresToCapitalizedCamelCase(field));\n      printer->Indent();\n    }\n    field_generators_.get(field).GenerateHashCode(printer);\n    if (!field->is_repeated()) {\n      printer->Outdent();\n      printer->Print(\"}\\n\");\n    }\n  }\n  if (HasDescriptorMethods(descriptor_)) {\n    if (descriptor_->extension_range_count() > 0) {\n      printer->Print(\n        \"hash = hashFields(hash, getExtensionFields());\\n\");\n    }\n  }\n  printer->Print(\n    \"hash = (29 * hash) + getUnknownFields().hashCode();\\n\"\n    \"return hash;\\n\");\n  printer->Outdent();\n  printer->Print(\n    \"}\\n\"\n    \"\\n\");\n}\n\n// ===================================================================\n\nvoid MessageGenerator::GenerateExtensionRegistrationCode(io::Printer* printer) {\n  for (int i = 0; i < descriptor_->extension_count(); i++) {\n    ExtensionGenerator(descriptor_->extension(i))\n      .GenerateRegistrationCode(printer);\n  }\n\n  for (int i = 0; i < descriptor_->nested_type_count(); i++) {\n    MessageGenerator(descriptor_->nested_type(i))\n      .GenerateExtensionRegistrationCode(printer);\n  }\n}\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_H__\n#define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_H__\n\n#include <string>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/compiler/java/java_field.h>\n\nnamespace google {\nnamespace protobuf {\n  namespace io {\n    class Printer;             // printer.h\n  }\n}\n\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nclass MessageGenerator {\n public:\n  explicit MessageGenerator(const Descriptor* descriptor);\n  ~MessageGenerator();\n\n  // All static variables have to be declared at the top-level of the file\n  // so that we can control initialization order, which is important for\n  // DescriptorProto bootstrapping to work.\n  void GenerateStaticVariables(io::Printer* printer);\n\n  // Output code which initializes the static variables generated by\n  // GenerateStaticVariables().\n  void GenerateStaticVariableInitializers(io::Printer* printer);\n\n  // Generate the class itself.\n  void Generate(io::Printer* printer);\n\n  // Generates the base interface that both the class and its builder implement\n  void GenerateInterface(io::Printer* printer);\n\n  // Generate code to register all contained extensions with an\n  // ExtensionRegistry.\n  void GenerateExtensionRegistrationCode(io::Printer* printer);\n\n private:\n  enum UseMemoization {\n    MEMOIZE,\n    DONT_MEMOIZE\n  };\n\n  void GenerateMessageSerializationMethods(io::Printer* printer);\n  void GenerateParseFromMethods(io::Printer* printer);\n  void GenerateSerializeOneField(io::Printer* printer,\n                                 const FieldDescriptor* field);\n  void GenerateSerializeOneExtensionRange(\n      io::Printer* printer, const Descriptor::ExtensionRange* range);\n\n  void GenerateBuilder(io::Printer* printer);\n  void GenerateCommonBuilderMethods(io::Printer* printer);\n  void GenerateDescriptorMethods(io::Printer* printer);\n  void GenerateBuilderParsingMethods(io::Printer* printer);\n  void GenerateIsInitialized(io::Printer* printer,\n      UseMemoization useMemoization);\n  void GenerateEqualsAndHashCode(io::Printer* printer);\n\n  const Descriptor* descriptor_;\n  FieldGeneratorMap field_generators_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageGenerator);\n};\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <map>\n#include <string>\n\n#include <google/protobuf/compiler/java/java_message_field.h>\n#include <google/protobuf/compiler/java/java_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nnamespace {\n\n// TODO(kenton):  Factor out a \"SetCommonFieldVariables()\" to get rid of\n//   repeat code between this and the other field types.\nvoid SetMessageVariables(const FieldDescriptor* descriptor,\n                         int messageBitIndex,\n                         int builderBitIndex,\n                         map<string, string>* variables) {\n  (*variables)[\"name\"] =\n    UnderscoresToCamelCase(descriptor);\n  (*variables)[\"capitalized_name\"] =\n    UnderscoresToCapitalizedCamelCase(descriptor);\n  (*variables)[\"constant_name\"] = FieldConstantName(descriptor);\n  (*variables)[\"number\"] = SimpleItoa(descriptor->number());\n  (*variables)[\"type\"] = ClassName(descriptor->message_type());\n  (*variables)[\"group_or_message\"] =\n    (GetType(descriptor) == FieldDescriptor::TYPE_GROUP) ?\n    \"Group\" : \"Message\";\n  // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported\n  // by the proto compiler\n  (*variables)[\"deprecation\"] = descriptor->options().deprecated()\n      ? \"@java.lang.Deprecated \" : \"\";\n  (*variables)[\"on_changed\"] =\n      HasDescriptorMethods(descriptor->containing_type()) ? \"onChanged();\" : \"\";\n\n  // For singular messages and builders, one bit is used for the hasField bit.\n  (*variables)[\"get_has_field_bit_message\"] = GenerateGetBit(messageBitIndex);\n\n  (*variables)[\"get_has_field_bit_builder\"] = GenerateGetBit(builderBitIndex);\n  (*variables)[\"set_has_field_bit_builder\"] = GenerateSetBit(builderBitIndex);\n  (*variables)[\"clear_has_field_bit_builder\"] =\n      GenerateClearBit(builderBitIndex);\n\n  // For repated builders, one bit is used for whether the array is immutable.\n  (*variables)[\"get_mutable_bit_builder\"] = GenerateGetBit(builderBitIndex);\n  (*variables)[\"set_mutable_bit_builder\"] = GenerateSetBit(builderBitIndex);\n  (*variables)[\"clear_mutable_bit_builder\"] = GenerateClearBit(builderBitIndex);\n\n  (*variables)[\"get_has_field_bit_from_local\"] =\n      GenerateGetBitFromLocal(builderBitIndex);\n  (*variables)[\"set_has_field_bit_to_local\"] =\n      GenerateSetBitToLocal(messageBitIndex);\n}\n\n}  // namespace\n\n// ===================================================================\n\nMessageFieldGenerator::\nMessageFieldGenerator(const FieldDescriptor* descriptor,\n                      int messageBitIndex,\n                      int builderBitIndex)\n  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),\n    builderBitIndex_(builderBitIndex) {\n  SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,\n                      &variables_);\n}\n\nMessageFieldGenerator::~MessageFieldGenerator() {}\n\nint MessageFieldGenerator::GetNumBitsForMessage() const {\n  return 1;\n}\n\nint MessageFieldGenerator::GetNumBitsForBuilder() const {\n  return 1;\n}\n\nvoid MessageFieldGenerator::\nGenerateInterfaceMembers(io::Printer* printer) const {\n  // TODO(jonp): In the future, consider having a method specific to the\n  // interface so that builders can choose dynamically to either return a\n  // message or a nested builder, so that asking for the interface doesn't\n  // cause a message to ever be built.\n  printer->Print(variables_,\n    \"$deprecation$boolean has$capitalized_name$();\\n\"\n    \"$deprecation$$type$ get$capitalized_name$();\\n\");\n\n  if (HasNestedBuilders(descriptor_->containing_type())) {\n    printer->Print(variables_,\n      \"$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder();\\n\");\n  }\n}\n\nvoid MessageFieldGenerator::\nGenerateMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"private $type$ $name$_;\\n\"\n    \"$deprecation$public boolean has$capitalized_name$() {\\n\"\n    \"  return $get_has_field_bit_message$;\\n\"\n    \"}\\n\"\n    \"$deprecation$public $type$ get$capitalized_name$() {\\n\"\n    \"  return $name$_;\\n\"\n    \"}\\n\");\n\n  if (HasNestedBuilders(descriptor_->containing_type())) {\n    printer->Print(variables_,\n      \"$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\\n\"\n      \"  return $name$_;\\n\"\n      \"}\\n\");\n  }\n}\n\nvoid MessageFieldGenerator::PrintNestedBuilderCondition(\n    io::Printer* printer,\n    const char* regular_case,\n    const char* nested_builder_case) const {\n  if (HasNestedBuilders(descriptor_->containing_type())) {\n     printer->Print(variables_, \"if ($name$Builder_ == null) {\\n\");\n     printer->Indent();\n     printer->Print(variables_, regular_case);\n     printer->Outdent();\n     printer->Print(\"} else {\\n\");\n     printer->Indent();\n     printer->Print(variables_, nested_builder_case);\n     printer->Outdent();\n     printer->Print(\"}\\n\");\n   } else {\n     printer->Print(variables_, regular_case);\n   }\n}\n\nvoid MessageFieldGenerator::PrintNestedBuilderFunction(\n    io::Printer* printer,\n    const char* method_prototype,\n    const char* regular_case,\n    const char* nested_builder_case,\n    const char* trailing_code) const {\n  printer->Print(variables_, method_prototype);\n  printer->Print(\" {\\n\");\n  printer->Indent();\n  PrintNestedBuilderCondition(printer, regular_case, nested_builder_case);\n  if (trailing_code != NULL) {\n    printer->Print(variables_, trailing_code);\n  }\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateBuilderMembers(io::Printer* printer) const {\n  // When using nested-builders, the code initially works just like the\n  // non-nested builder case. It only creates a nested builder lazily on\n  // demand and then forever delegates to it after creation.\n\n  printer->Print(variables_,\n    // Used when the builder is null.\n    \"private $type$ $name$_ = $type$.getDefaultInstance();\\n\");\n\n  if (HasNestedBuilders(descriptor_->containing_type())) {\n    printer->Print(variables_,\n      // If this builder is non-null, it is used and the other fields are\n      // ignored.\n      \"private com.google.protobuf.SingleFieldBuilder<\\n\"\n      \"    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\"\n      \"\\n\");\n  }\n\n  // The comments above the methods below are based on a hypothetical\n  // field of type \"Field\" called \"Field\".\n\n  // boolean hasField()\n  printer->Print(variables_,\n    \"$deprecation$public boolean has$capitalized_name$() {\\n\"\n    \"  return $get_has_field_bit_builder$;\\n\"\n    \"}\\n\");\n\n  // Field getField()\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public $type$ get$capitalized_name$()\",\n\n    \"return $name$_;\\n\",\n\n    \"return $name$Builder_.getMessage();\\n\",\n\n    NULL);\n\n  // Field.Builder setField(Field value)\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public Builder set$capitalized_name$($type$ value)\",\n\n    \"if (value == null) {\\n\"\n    \"  throw new NullPointerException();\\n\"\n    \"}\\n\"\n    \"$name$_ = value;\\n\"\n    \"$on_changed$\\n\",\n\n    \"$name$Builder_.setMessage(value);\\n\",\n\n    \"$set_has_field_bit_builder$;\\n\"\n    \"return this;\\n\");\n\n  // Field.Builder setField(Field.Builder builderForValue)\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public Builder set$capitalized_name$(\\n\"\n    \"    $type$.Builder builderForValue)\",\n\n    \"$name$_ = builderForValue.build();\\n\"\n    \"$on_changed$\\n\",\n\n    \"$name$Builder_.setMessage(builderForValue.build());\\n\",\n\n    \"$set_has_field_bit_builder$;\\n\"\n    \"return this;\\n\");\n\n  // Field.Builder mergeField(Field value)\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public Builder merge$capitalized_name$($type$ value)\",\n\n    \"if ($get_has_field_bit_builder$ &&\\n\"\n    \"    $name$_ != $type$.getDefaultInstance()) {\\n\"\n    \"  $name$_ =\\n\"\n    \"    $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\\n\"\n    \"} else {\\n\"\n    \"  $name$_ = value;\\n\"\n    \"}\\n\"\n    \"$on_changed$\\n\",\n\n    \"$name$Builder_.mergeFrom(value);\\n\",\n\n    \"$set_has_field_bit_builder$;\\n\"\n    \"return this;\\n\");\n\n  // Field.Builder clearField()\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public Builder clear$capitalized_name$()\",\n\n    \"$name$_ = $type$.getDefaultInstance();\\n\"\n    \"$on_changed$\\n\",\n\n    \"$name$Builder_.clear();\\n\",\n\n    \"$clear_has_field_bit_builder$;\\n\"\n    \"return this;\\n\");\n\n  if (HasNestedBuilders(descriptor_->containing_type())) {\n    printer->Print(variables_,\n      \"$deprecation$public $type$.Builder get$capitalized_name$Builder() {\\n\"\n      \"  $set_has_field_bit_builder$;\\n\"\n      \"  $on_changed$\\n\"\n      \"  return get$capitalized_name$FieldBuilder().getBuilder();\\n\"\n      \"}\\n\"\n      \"$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\\n\"\n      \"  if ($name$Builder_ != null) {\\n\"\n      \"    return $name$Builder_.getMessageOrBuilder();\\n\"\n      \"  } else {\\n\"\n      \"    return $name$_;\\n\"\n      \"  }\\n\"\n      \"}\\n\"\n      \"private com.google.protobuf.SingleFieldBuilder<\\n\"\n      \"    $type$, $type$.Builder, $type$OrBuilder> \\n\"\n      \"    get$capitalized_name$FieldBuilder() {\\n\"\n      \"  if ($name$Builder_ == null) {\\n\"\n      \"    $name$Builder_ = new com.google.protobuf.SingleFieldBuilder<\\n\"\n      \"        $type$, $type$.Builder, $type$OrBuilder>(\\n\"\n      \"            $name$_,\\n\"\n      \"            getParentForChildren(),\\n\"\n      \"            isClean());\\n\"\n      \"    $name$_ = null;\\n\"\n      \"  }\\n\"\n      \"  return $name$Builder_;\\n\"\n      \"}\\n\");\n  }\n}\n\nvoid MessageFieldGenerator::\nGenerateFieldBuilderInitializationCode(io::Printer* printer)  const {\n  printer->Print(variables_,\n    \"get$capitalized_name$FieldBuilder();\\n\");\n}\n\n\nvoid MessageFieldGenerator::\nGenerateInitializationCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_ = $type$.getDefaultInstance();\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateBuilderClearCode(io::Printer* printer) const {\n  PrintNestedBuilderCondition(printer,\n    \"$name$_ = $type$.getDefaultInstance();\\n\",\n\n    \"$name$Builder_.clear();\\n\");\n  printer->Print(variables_, \"$clear_has_field_bit_builder$;\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if (other.has$capitalized_name$()) {\\n\"\n    \"  merge$capitalized_name$(other.get$capitalized_name$());\\n\"\n    \"}\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateBuildingCode(io::Printer* printer) const {\n\n  printer->Print(variables_,\n      \"if ($get_has_field_bit_from_local$) {\\n\"\n      \"  $set_has_field_bit_to_local$;\\n\"\n      \"}\\n\");\n\n  PrintNestedBuilderCondition(printer,\n    \"result.$name$_ = $name$_;\\n\",\n\n    \"result.$name$_ = $name$Builder_.build();\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateParsingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$type$.Builder subBuilder = $type$.newBuilder();\\n\"\n    \"if (has$capitalized_name$()) {\\n\"\n    \"  subBuilder.mergeFrom(get$capitalized_name$());\\n\"\n    \"}\\n\");\n\n  if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {\n    printer->Print(variables_,\n      \"input.readGroup($number$, subBuilder, extensionRegistry);\\n\");\n  } else {\n    printer->Print(variables_,\n      \"input.readMessage(subBuilder, extensionRegistry);\\n\");\n  }\n\n  printer->Print(variables_,\n    \"set$capitalized_name$(subBuilder.buildPartial());\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateSerializationCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if ($get_has_field_bit_message$) {\\n\"\n    \"  output.write$group_or_message$($number$, $name$_);\\n\"\n    \"}\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateSerializedSizeCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if ($get_has_field_bit_message$) {\\n\"\n    \"  size += com.google.protobuf.CodedOutputStream\\n\"\n    \"    .compute$group_or_message$Size($number$, $name$_);\\n\"\n    \"}\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateEqualsCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"result = result && get$capitalized_name$()\\n\"\n    \"    .equals(other.get$capitalized_name$());\\n\");\n}\n\nvoid MessageFieldGenerator::\nGenerateHashCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"hash = (37 * hash) + $constant_name$;\\n\"\n    \"hash = (53 * hash) + get$capitalized_name$().hashCode();\\n\");\n}\n\nstring MessageFieldGenerator::GetBoxedType() const {\n  return ClassName(descriptor_->message_type());\n}\n\n// ===================================================================\n\nRepeatedMessageFieldGenerator::\nRepeatedMessageFieldGenerator(const FieldDescriptor* descriptor,\n                              int messageBitIndex,\n                              int builderBitIndex)\n  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),\n    builderBitIndex_(builderBitIndex) {\n  SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,\n                      &variables_);\n}\n\nRepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {}\n\nint RepeatedMessageFieldGenerator::GetNumBitsForMessage() const {\n  return 0;\n}\n\nint RepeatedMessageFieldGenerator::GetNumBitsForBuilder() const {\n  return 1;\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateInterfaceMembers(io::Printer* printer) const {\n  // TODO(jonp): In the future, consider having methods specific to the\n  // interface so that builders can choose dynamically to either return a\n  // message or a nested builder, so that asking for the interface doesn't\n  // cause a message to ever be built.\n  printer->Print(variables_,\n    \"$deprecation$java.util.List<$type$> \\n\"\n    \"    get$capitalized_name$List();\\n\"\n    \"$deprecation$$type$ get$capitalized_name$(int index);\\n\"\n    \"$deprecation$int get$capitalized_name$Count();\\n\");\n  if (HasNestedBuilders(descriptor_->containing_type())) {\n    printer->Print(variables_,\n      \"$deprecation$java.util.List<? extends $type$OrBuilder> \\n\"\n      \"    get$capitalized_name$OrBuilderList();\\n\"\n      \"$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder(\\n\"\n      \"    int index);\\n\");\n  }\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"private java.util.List<$type$> $name$_;\\n\"\n    \"$deprecation$public java.util.List<$type$> get$capitalized_name$List() {\\n\"\n    \"  return $name$_;\\n\"   // note:  unmodifiable list\n    \"}\\n\"\n    \"$deprecation$public java.util.List<? extends $type$OrBuilder> \\n\"\n    \"    get$capitalized_name$OrBuilderList() {\\n\"\n    \"  return $name$_;\\n\"\n    \"}\\n\"\n    \"$deprecation$public int get$capitalized_name$Count() {\\n\"\n    \"  return $name$_.size();\\n\"\n    \"}\\n\"\n    \"$deprecation$public $type$ get$capitalized_name$(int index) {\\n\"\n    \"  return $name$_.get(index);\\n\"\n    \"}\\n\"\n    \"$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\\n\"\n    \"    int index) {\\n\"\n    \"  return $name$_.get(index);\\n\"\n    \"}\\n\");\n\n}\n\nvoid RepeatedMessageFieldGenerator::PrintNestedBuilderCondition(\n    io::Printer* printer,\n    const char* regular_case,\n    const char* nested_builder_case) const {\n  if (HasNestedBuilders(descriptor_->containing_type())) {\n     printer->Print(variables_, \"if ($name$Builder_ == null) {\\n\");\n     printer->Indent();\n     printer->Print(variables_, regular_case);\n     printer->Outdent();\n     printer->Print(\"} else {\\n\");\n     printer->Indent();\n     printer->Print(variables_, nested_builder_case);\n     printer->Outdent();\n     printer->Print(\"}\\n\");\n   } else {\n     printer->Print(variables_, regular_case);\n   }\n}\n\nvoid RepeatedMessageFieldGenerator::PrintNestedBuilderFunction(\n    io::Printer* printer,\n    const char* method_prototype,\n    const char* regular_case,\n    const char* nested_builder_case,\n    const char* trailing_code) const {\n  printer->Print(variables_, method_prototype);\n  printer->Print(\" {\\n\");\n  printer->Indent();\n  PrintNestedBuilderCondition(printer, regular_case, nested_builder_case);\n  if (trailing_code != NULL) {\n    printer->Print(variables_, trailing_code);\n  }\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateBuilderMembers(io::Printer* printer) const {\n  // When using nested-builders, the code initially works just like the\n  // non-nested builder case. It only creates a nested builder lazily on\n  // demand and then forever delegates to it after creation.\n\n  printer->Print(variables_,\n    // Used when the builder is null.\n    // One field is the list and the other field keeps track of whether the\n    // list is immutable. If it's immutable, the invariant is that it must\n    // either an instance of Collections.emptyList() or it's an ArrayList\n    // wrapped in a Collections.unmodifiableList() wrapper and nobody else has\n    // a refererence to the underlying ArrayList. This invariant allows us to\n    // share instances of lists between protocol buffers avoiding expensive\n    // memory allocations. Note, immutable is a strong guarantee here -- not\n    // just that the list cannot be modified via the reference but that the\n    // list can never be modified.\n    \"private java.util.List<$type$> $name$_ =\\n\"\n    \"  java.util.Collections.emptyList();\\n\"\n\n    \"private void ensure$capitalized_name$IsMutable() {\\n\"\n    \"  if (!$get_mutable_bit_builder$) {\\n\"\n    \"    $name$_ = new java.util.ArrayList<$type$>($name$_);\\n\"\n    \"    $set_mutable_bit_builder$;\\n\"\n    \"   }\\n\"\n    \"}\\n\"\n    \"\\n\");\n\n  if (HasNestedBuilders(descriptor_->containing_type())) {\n    printer->Print(variables_,\n      // If this builder is non-null, it is used and the other fields are\n      // ignored.\n      \"private com.google.protobuf.RepeatedFieldBuilder<\\n\"\n      \"    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\\n\"\n      \"\\n\");\n  }\n\n  // The comments above the methods below are based on a hypothetical\n  // repeated field of type \"Field\" called \"RepeatedField\".\n\n  // List<Field> getRepeatedFieldList()\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public java.util.List<$type$> get$capitalized_name$List()\",\n\n    \"return java.util.Collections.unmodifiableList($name$_);\\n\",\n    \"return $name$Builder_.getMessageList();\\n\",\n\n    NULL);\n\n  // int getRepeatedFieldCount()\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public int get$capitalized_name$Count()\",\n\n    \"return $name$_.size();\\n\",\n    \"return $name$Builder_.getCount();\\n\",\n\n    NULL);\n\n  // Field getRepeatedField(int index)\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public $type$ get$capitalized_name$(int index)\",\n\n    \"return $name$_.get(index);\\n\",\n\n    \"return $name$Builder_.getMessage(index);\\n\",\n\n    NULL);\n\n  // Builder setRepeatedField(int index, Field value)\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public Builder set$capitalized_name$(\\n\"\n    \"    int index, $type$ value)\",\n    \"if (value == null) {\\n\"\n    \"  throw new NullPointerException();\\n\"\n    \"}\\n\"\n    \"ensure$capitalized_name$IsMutable();\\n\"\n    \"$name$_.set(index, value);\\n\"\n    \"$on_changed$\\n\",\n    \"$name$Builder_.setMessage(index, value);\\n\",\n    \"return this;\\n\");\n\n  // Builder setRepeatedField(int index, Field.Builder builderForValue)\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public Builder set$capitalized_name$(\\n\"\n    \"    int index, $type$.Builder builderForValue)\",\n\n    \"ensure$capitalized_name$IsMutable();\\n\"\n    \"$name$_.set(index, builderForValue.build());\\n\"\n    \"$on_changed$\\n\",\n\n    \"$name$Builder_.setMessage(index, builderForValue.build());\\n\",\n\n    \"return this;\\n\");\n\n  // Builder addRepeatedField(Field value)\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public Builder add$capitalized_name$($type$ value)\",\n\n    \"if (value == null) {\\n\"\n    \"  throw new NullPointerException();\\n\"\n    \"}\\n\"\n    \"ensure$capitalized_name$IsMutable();\\n\"\n    \"$name$_.add(value);\\n\"\n\n    \"$on_changed$\\n\",\n\n    \"$name$Builder_.addMessage(value);\\n\",\n\n    \"return this;\\n\");\n\n  // Builder addRepeatedField(int index, Field value)\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public Builder add$capitalized_name$(\\n\"\n    \"    int index, $type$ value)\",\n\n    \"if (value == null) {\\n\"\n    \"  throw new NullPointerException();\\n\"\n    \"}\\n\"\n    \"ensure$capitalized_name$IsMutable();\\n\"\n    \"$name$_.add(index, value);\\n\"\n    \"$on_changed$\\n\",\n\n    \"$name$Builder_.addMessage(index, value);\\n\",\n\n    \"return this;\\n\");\n\n  // Builder addRepeatedField(Field.Builder builderForValue)\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public Builder add$capitalized_name$(\\n\"\n    \"    $type$.Builder builderForValue)\",\n\n    \"ensure$capitalized_name$IsMutable();\\n\"\n    \"$name$_.add(builderForValue.build());\\n\"\n    \"$on_changed$\\n\",\n\n    \"$name$Builder_.addMessage(builderForValue.build());\\n\",\n\n    \"return this;\\n\");\n\n  // Builder addRepeatedField(int index, Field.Builder builderForValue)\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public Builder add$capitalized_name$(\\n\"\n    \"    int index, $type$.Builder builderForValue)\",\n\n    \"ensure$capitalized_name$IsMutable();\\n\"\n    \"$name$_.add(index, builderForValue.build());\\n\"\n    \"$on_changed$\\n\",\n\n    \"$name$Builder_.addMessage(index, builderForValue.build());\\n\",\n\n    \"return this;\\n\");\n\n  // Builder addAllRepeatedField(Iterable<Field> values)\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public Builder addAll$capitalized_name$(\\n\"\n    \"    java.lang.Iterable<? extends $type$> values)\",\n\n    \"ensure$capitalized_name$IsMutable();\\n\"\n    \"super.addAll(values, $name$_);\\n\"\n    \"$on_changed$\\n\",\n\n    \"$name$Builder_.addAllMessages(values);\\n\",\n\n    \"return this;\\n\");\n\n  // Builder clearAllRepeatedField()\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public Builder clear$capitalized_name$()\",\n\n    \"$name$_ = java.util.Collections.emptyList();\\n\"\n    \"$clear_mutable_bit_builder$;\\n\"\n    \"$on_changed$\\n\",\n\n    \"$name$Builder_.clear();\\n\",\n\n    \"return this;\\n\");\n\n  // Builder removeRepeatedField(int index)\n  PrintNestedBuilderFunction(printer,\n    \"$deprecation$public Builder remove$capitalized_name$(int index)\",\n\n    \"ensure$capitalized_name$IsMutable();\\n\"\n    \"$name$_.remove(index);\\n\"\n    \"$on_changed$\\n\",\n\n    \"$name$Builder_.remove(index);\\n\",\n\n    \"return this;\\n\");\n\n  if (HasNestedBuilders(descriptor_->containing_type())) {\n    printer->Print(variables_,\n      \"$deprecation$public $type$.Builder get$capitalized_name$Builder(\\n\"\n      \"    int index) {\\n\"\n      \"  return get$capitalized_name$FieldBuilder().getBuilder(index);\\n\"\n      \"}\\n\"\n\n      \"$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\\n\"\n      \"    int index) {\\n\"\n      \"  if ($name$Builder_ == null) {\\n\"\n      \"    return $name$_.get(index);\"\n      \"  } else {\\n\"\n      \"    return $name$Builder_.getMessageOrBuilder(index);\\n\"\n      \"  }\\n\"\n      \"}\\n\"\n\n      \"$deprecation$public java.util.List<? extends $type$OrBuilder> \\n\"\n      \"     get$capitalized_name$OrBuilderList() {\\n\"\n      \"  if ($name$Builder_ != null) {\\n\"\n      \"    return $name$Builder_.getMessageOrBuilderList();\\n\"\n      \"  } else {\\n\"\n      \"    return java.util.Collections.unmodifiableList($name$_);\\n\"\n      \"  }\\n\"\n      \"}\\n\"\n\n      \"$deprecation$public $type$.Builder add$capitalized_name$Builder() {\\n\"\n      \"  return get$capitalized_name$FieldBuilder().addBuilder(\\n\"\n      \"      $type$.getDefaultInstance());\\n\"\n      \"}\\n\"\n      \"$deprecation$public $type$.Builder add$capitalized_name$Builder(\\n\"\n      \"    int index) {\\n\"\n      \"  return get$capitalized_name$FieldBuilder().addBuilder(\\n\"\n      \"      index, $type$.getDefaultInstance());\\n\"\n      \"}\\n\"\n      \"$deprecation$public java.util.List<$type$.Builder> \\n\"\n      \"     get$capitalized_name$BuilderList() {\\n\"\n      \"  return get$capitalized_name$FieldBuilder().getBuilderList();\\n\"\n      \"}\\n\"\n      \"private com.google.protobuf.RepeatedFieldBuilder<\\n\"\n      \"    $type$, $type$.Builder, $type$OrBuilder> \\n\"\n      \"    get$capitalized_name$FieldBuilder() {\\n\"\n      \"  if ($name$Builder_ == null) {\\n\"\n      \"    $name$Builder_ = new com.google.protobuf.RepeatedFieldBuilder<\\n\"\n      \"        $type$, $type$.Builder, $type$OrBuilder>(\\n\"\n      \"            $name$_,\\n\"\n      \"            $get_mutable_bit_builder$,\\n\"\n      \"            getParentForChildren(),\\n\"\n      \"            isClean());\\n\"\n      \"    $name$_ = null;\\n\"\n      \"  }\\n\"\n      \"  return $name$Builder_;\\n\"\n      \"}\\n\");\n  }\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateFieldBuilderInitializationCode(io::Printer* printer)  const {\n  printer->Print(variables_,\n    \"get$capitalized_name$FieldBuilder();\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateInitializationCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_ = java.util.Collections.emptyList();\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateBuilderClearCode(io::Printer* printer) const {\n  PrintNestedBuilderCondition(printer,\n    \"$name$_ = java.util.Collections.emptyList();\\n\"\n    \"$clear_mutable_bit_builder$;\\n\",\n\n    \"$name$Builder_.clear();\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  // The code below does two optimizations (non-nested builder case):\n  //   1. If the other list is empty, there's nothing to do. This ensures we\n  //      don't allocate a new array if we already have an immutable one.\n  //   2. If the other list is non-empty and our current list is empty, we can\n  //      reuse the other list which is guaranteed to be immutable.\n  PrintNestedBuilderCondition(printer,\n    \"if (!other.$name$_.isEmpty()) {\\n\"\n    \"  if ($name$_.isEmpty()) {\\n\"\n    \"    $name$_ = other.$name$_;\\n\"\n    \"    $clear_mutable_bit_builder$;\\n\"\n    \"  } else {\\n\"\n    \"    ensure$capitalized_name$IsMutable();\\n\"\n    \"    $name$_.addAll(other.$name$_);\\n\"\n    \"  }\\n\"\n    \"  $on_changed$\\n\"\n    \"}\\n\",\n\n    \"if (!other.$name$_.isEmpty()) {\\n\"\n    \"  if ($name$Builder_.isEmpty()) {\\n\"\n    \"    $name$Builder_.dispose();\\n\"\n    \"    $name$Builder_ = null;\\n\"\n    \"    $name$_ = other.$name$_;\\n\"\n    \"    $clear_mutable_bit_builder$;\\n\"\n    \"    $name$Builder_ = \\n\"\n    \"      com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?\\n\"\n    \"         get$capitalized_name$FieldBuilder() : null;\\n\"\n    \"  } else {\\n\"\n    \"    $name$Builder_.addAllMessages(other.$name$_);\\n\"\n    \"  }\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateBuildingCode(io::Printer* printer) const {\n  // The code below (non-nested builder case) ensures that the result has an\n  // immutable list. If our list is immutable, we can just reuse it. If not,\n  // we make it immutable.\n  PrintNestedBuilderCondition(printer,\n    \"if ($get_mutable_bit_builder$) {\\n\"\n    \"  $name$_ = java.util.Collections.unmodifiableList($name$_);\\n\"\n    \"  $clear_mutable_bit_builder$;\\n\"\n    \"}\\n\"\n    \"result.$name$_ = $name$_;\\n\",\n\n    \"result.$name$_ = $name$Builder_.build();\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateParsingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$type$.Builder subBuilder = $type$.newBuilder();\\n\");\n\n  if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {\n    printer->Print(variables_,\n      \"input.readGroup($number$, subBuilder, extensionRegistry);\\n\");\n  } else {\n    printer->Print(variables_,\n      \"input.readMessage(subBuilder, extensionRegistry);\\n\");\n  }\n\n  printer->Print(variables_,\n    \"add$capitalized_name$(subBuilder.buildPartial());\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateSerializationCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"for (int i = 0; i < $name$_.size(); i++) {\\n\"\n    \"  output.write$group_or_message$($number$, $name$_.get(i));\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateSerializedSizeCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"for (int i = 0; i < $name$_.size(); i++) {\\n\"\n    \"  size += com.google.protobuf.CodedOutputStream\\n\"\n    \"    .compute$group_or_message$Size($number$, $name$_.get(i));\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateEqualsCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"result = result && get$capitalized_name$List()\\n\"\n    \"    .equals(other.get$capitalized_name$List());\\n\");\n}\n\nvoid RepeatedMessageFieldGenerator::\nGenerateHashCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if (get$capitalized_name$Count() > 0) {\\n\"\n    \"  hash = (37 * hash) + $constant_name$;\\n\"\n    \"  hash = (53 * hash) + get$capitalized_name$List().hashCode();\\n\"\n    \"}\\n\");\n}\n\nstring RepeatedMessageFieldGenerator::GetBoxedType() const {\n  return ClassName(descriptor_->message_type());\n}\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_H__\n#define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_H__\n\n#include <map>\n#include <string>\n#include <google/protobuf/compiler/java/java_field.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nclass MessageFieldGenerator : public FieldGenerator {\n public:\n  explicit MessageFieldGenerator(const FieldDescriptor* descriptor,\n      int messageBitIndex, int builderBitIndex);\n  ~MessageFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  int GetNumBitsForMessage() const;\n  int GetNumBitsForBuilder() const;\n  void GenerateInterfaceMembers(io::Printer* printer) const;\n  void GenerateMembers(io::Printer* printer) const;\n  void GenerateBuilderMembers(io::Printer* printer) const;\n  void GenerateInitializationCode(io::Printer* printer) const;\n  void GenerateBuilderClearCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateBuildingCode(io::Printer* printer) const;\n  void GenerateParsingCode(io::Printer* printer) const;\n  void GenerateSerializationCode(io::Printer* printer) const;\n  void GenerateSerializedSizeCode(io::Printer* printer) const;\n  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;\n  void GenerateEqualsCode(io::Printer* printer) const;\n  void GenerateHashCode(io::Printer* printer) const;\n\n  string GetBoxedType() const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n  const int messageBitIndex_;\n  const int builderBitIndex_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator);\n\n  void PrintNestedBuilderCondition(io::Printer* printer,\n      const char* regular_case, const char* nested_builder_case) const;\n  void PrintNestedBuilderFunction(io::Printer* printer,\n      const char* method_prototype, const char* regular_case,\n      const char* nested_builder_case,\n      const char* trailing_code) const;\n};\n\nclass RepeatedMessageFieldGenerator : public FieldGenerator {\n public:\n  explicit RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor,\n      int messageBitIndex, int builderBitIndex);\n  ~RepeatedMessageFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  int GetNumBitsForMessage() const;\n  int GetNumBitsForBuilder() const;\n  void GenerateInterfaceMembers(io::Printer* printer) const;\n  void GenerateMembers(io::Printer* printer) const;\n  void GenerateBuilderMembers(io::Printer* printer) const;\n  void GenerateInitializationCode(io::Printer* printer) const;\n  void GenerateBuilderClearCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateBuildingCode(io::Printer* printer) const;\n  void GenerateParsingCode(io::Printer* printer) const;\n  void GenerateSerializationCode(io::Printer* printer) const;\n  void GenerateSerializedSizeCode(io::Printer* printer) const;\n  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;\n  void GenerateEqualsCode(io::Printer* printer) const;\n  void GenerateHashCode(io::Printer* printer) const;\n\n  string GetBoxedType() const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n  const int messageBitIndex_;\n  const int builderBitIndex_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator);\n\n  void PrintNestedBuilderCondition(io::Printer* printer,\n      const char* regular_case, const char* nested_builder_case) const;\n  void PrintNestedBuilderFunction(io::Printer* printer,\n      const char* method_prototype, const char* regular_case,\n      const char* nested_builder_case,\n      const char* trailing_code) const;\n};\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// TODO(kenton):  Share code with the versions of this test in other languages?\n//   It seemed like parameterizing it would add more complexity than it is\n//   worth.\n\n#include <google/protobuf/compiler/java/java_generator.h>\n#include <google/protobuf/compiler/command_line_interface.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/io/printer.h>\n\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n#include <google/protobuf/testing/file.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\nnamespace {\n\nclass TestGenerator : public CodeGenerator {\n public:\n  TestGenerator() {}\n  ~TestGenerator() {}\n\n  virtual bool Generate(const FileDescriptor* file,\n                        const string& parameter,\n                        GeneratorContext* context,\n                        string* error) const {\n    string filename = \"Test.java\";\n    TryInsert(filename, \"outer_class_scope\", context);\n    TryInsert(filename, \"class_scope:foo.Bar\", context);\n    TryInsert(filename, \"class_scope:foo.Bar.Baz\", context);\n    TryInsert(filename, \"builder_scope:foo.Bar\", context);\n    TryInsert(filename, \"builder_scope:foo.Bar.Baz\", context);\n    TryInsert(filename, \"enum_scope:foo.Qux\", context);\n    return true;\n  }\n\n  void TryInsert(const string& filename, const string& insertion_point,\n                 GeneratorContext* context) const {\n    scoped_ptr<io::ZeroCopyOutputStream> output(\n      context->OpenForInsert(filename, insertion_point));\n    io::Printer printer(output.get(), '$');\n    printer.Print(\"// inserted $name$\\n\", \"name\", insertion_point);\n  }\n};\n\n// This test verifies that all the expected insertion points exist.  It does\n// not verify that they are correctly-placed; that would require actually\n// compiling the output which is a bit more than I care to do for this test.\nTEST(JavaPluginTest, PluginTest) {\n  File::WriteStringToFileOrDie(\n      \"syntax = \\\"proto2\\\";\\n\"\n      \"package foo;\\n\"\n      \"option java_package = \\\"\\\";\\n\"\n      \"option java_outer_classname = \\\"Test\\\";\\n\"\n      \"message Bar {\\n\"\n      \"  message Baz {}\\n\"\n      \"}\\n\"\n      \"enum Qux { BLAH = 1; }\\n\",\n      TestTempDir() + \"/test.proto\");\n\n  google::protobuf::compiler::CommandLineInterface cli;\n  cli.SetInputsAreProtoPathRelative(true);\n\n  JavaGenerator java_generator;\n  TestGenerator test_generator;\n  cli.RegisterGenerator(\"--java_out\", &java_generator, \"\");\n  cli.RegisterGenerator(\"--test_out\", &test_generator, \"\");\n\n  string proto_path = \"-I\" + TestTempDir();\n  string java_out = \"--java_out=\" + TestTempDir();\n  string test_out = \"--test_out=\" + TestTempDir();\n\n  const char* argv[] = {\n    \"protoc\",\n    proto_path.c_str(),\n    java_out.c_str(),\n    test_out.c_str(),\n    \"test.proto\"\n  };\n\n  EXPECT_EQ(0, cli.Run(5, argv));\n}\n\n}  // namespace\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <map>\n#include <string>\n\n#include <google/protobuf/compiler/java/java_primitive_field.h>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/compiler/java/java_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nusing internal::WireFormat;\nusing internal::WireFormatLite;\n\nnamespace {\n\nconst char* PrimitiveTypeName(JavaType type) {\n  switch (type) {\n    case JAVATYPE_INT    : return \"int\";\n    case JAVATYPE_LONG   : return \"long\";\n    case JAVATYPE_FLOAT  : return \"float\";\n    case JAVATYPE_DOUBLE : return \"double\";\n    case JAVATYPE_BOOLEAN: return \"boolean\";\n    case JAVATYPE_STRING : return \"java.lang.String\";\n    case JAVATYPE_BYTES  : return \"com.google.protobuf.ByteString\";\n    case JAVATYPE_ENUM   : return NULL;\n    case JAVATYPE_MESSAGE: return NULL;\n\n    // No default because we want the compiler to complain if any new\n    // JavaTypes are added.\n  }\n\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return NULL;\n}\n\nbool IsReferenceType(JavaType type) {\n  switch (type) {\n    case JAVATYPE_INT    : return false;\n    case JAVATYPE_LONG   : return false;\n    case JAVATYPE_FLOAT  : return false;\n    case JAVATYPE_DOUBLE : return false;\n    case JAVATYPE_BOOLEAN: return false;\n    case JAVATYPE_STRING : return true;\n    case JAVATYPE_BYTES  : return true;\n    case JAVATYPE_ENUM   : return true;\n    case JAVATYPE_MESSAGE: return true;\n\n    // No default because we want the compiler to complain if any new\n    // JavaTypes are added.\n  }\n\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return false;\n}\n\nconst char* GetCapitalizedType(const FieldDescriptor* field) {\n  switch (GetType(field)) {\n    case FieldDescriptor::TYPE_INT32   : return \"Int32\"   ;\n    case FieldDescriptor::TYPE_UINT32  : return \"UInt32\"  ;\n    case FieldDescriptor::TYPE_SINT32  : return \"SInt32\"  ;\n    case FieldDescriptor::TYPE_FIXED32 : return \"Fixed32\" ;\n    case FieldDescriptor::TYPE_SFIXED32: return \"SFixed32\";\n    case FieldDescriptor::TYPE_INT64   : return \"Int64\"   ;\n    case FieldDescriptor::TYPE_UINT64  : return \"UInt64\"  ;\n    case FieldDescriptor::TYPE_SINT64  : return \"SInt64\"  ;\n    case FieldDescriptor::TYPE_FIXED64 : return \"Fixed64\" ;\n    case FieldDescriptor::TYPE_SFIXED64: return \"SFixed64\";\n    case FieldDescriptor::TYPE_FLOAT   : return \"Float\"   ;\n    case FieldDescriptor::TYPE_DOUBLE  : return \"Double\"  ;\n    case FieldDescriptor::TYPE_BOOL    : return \"Bool\"    ;\n    case FieldDescriptor::TYPE_STRING  : return \"String\"  ;\n    case FieldDescriptor::TYPE_BYTES   : return \"Bytes\"   ;\n    case FieldDescriptor::TYPE_ENUM    : return \"Enum\"    ;\n    case FieldDescriptor::TYPE_GROUP   : return \"Group\"   ;\n    case FieldDescriptor::TYPE_MESSAGE : return \"Message\" ;\n\n    // No default because we want the compiler to complain if any new\n    // types are added.\n  }\n\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return NULL;\n}\n\n// For encodings with fixed sizes, returns that size in bytes.  Otherwise\n// returns -1.\nint FixedSize(FieldDescriptor::Type type) {\n  switch (type) {\n    case FieldDescriptor::TYPE_INT32   : return -1;\n    case FieldDescriptor::TYPE_INT64   : return -1;\n    case FieldDescriptor::TYPE_UINT32  : return -1;\n    case FieldDescriptor::TYPE_UINT64  : return -1;\n    case FieldDescriptor::TYPE_SINT32  : return -1;\n    case FieldDescriptor::TYPE_SINT64  : return -1;\n    case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size;\n    case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size;\n    case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size;\n    case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size;\n    case FieldDescriptor::TYPE_FLOAT   : return WireFormatLite::kFloatSize;\n    case FieldDescriptor::TYPE_DOUBLE  : return WireFormatLite::kDoubleSize;\n\n    case FieldDescriptor::TYPE_BOOL    : return WireFormatLite::kBoolSize;\n    case FieldDescriptor::TYPE_ENUM    : return -1;\n\n    case FieldDescriptor::TYPE_STRING  : return -1;\n    case FieldDescriptor::TYPE_BYTES   : return -1;\n    case FieldDescriptor::TYPE_GROUP   : return -1;\n    case FieldDescriptor::TYPE_MESSAGE : return -1;\n\n    // No default because we want the compiler to complain if any new\n    // types are added.\n  }\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return -1;\n}\n\nvoid SetPrimitiveVariables(const FieldDescriptor* descriptor,\n                           int messageBitIndex,\n                           int builderBitIndex,\n                           map<string, string>* variables) {\n  (*variables)[\"name\"] =\n    UnderscoresToCamelCase(descriptor);\n  (*variables)[\"capitalized_name\"] =\n    UnderscoresToCapitalizedCamelCase(descriptor);\n  (*variables)[\"constant_name\"] = FieldConstantName(descriptor);\n  (*variables)[\"number\"] = SimpleItoa(descriptor->number());\n  (*variables)[\"type\"] = PrimitiveTypeName(GetJavaType(descriptor));\n  (*variables)[\"boxed_type\"] = BoxedPrimitiveTypeName(GetJavaType(descriptor));\n  (*variables)[\"field_type\"] = (*variables)[\"type\"];\n  (*variables)[\"field_list_type\"] = \"java.util.List<\" +\n      (*variables)[\"boxed_type\"] + \">\";\n  (*variables)[\"empty_list\"] = \"java.util.Collections.emptyList()\";\n  (*variables)[\"default\"] = DefaultValue(descriptor);\n  (*variables)[\"default_init\"] = IsDefaultValueJavaDefault(descriptor) ?\n      \"\" : (\"= \" + DefaultValue(descriptor));\n  (*variables)[\"capitalized_type\"] = GetCapitalizedType(descriptor);\n  (*variables)[\"tag\"] = SimpleItoa(WireFormat::MakeTag(descriptor));\n  (*variables)[\"tag_size\"] = SimpleItoa(\n      WireFormat::TagSize(descriptor->number(), GetType(descriptor)));\n  if (IsReferenceType(GetJavaType(descriptor))) {\n    (*variables)[\"null_check\"] =\n        \"  if (value == null) {\\n\"\n        \"    throw new NullPointerException();\\n\"\n        \"  }\\n\";\n  } else {\n    (*variables)[\"null_check\"] = \"\";\n  }\n  // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported\n  // by the proto compiler\n  (*variables)[\"deprecation\"] = descriptor->options().deprecated()\n      ? \"@java.lang.Deprecated \" : \"\";\n  int fixed_size = FixedSize(GetType(descriptor));\n  if (fixed_size != -1) {\n    (*variables)[\"fixed_size\"] = SimpleItoa(fixed_size);\n  }\n  (*variables)[\"on_changed\"] =\n      HasDescriptorMethods(descriptor->containing_type()) ? \"onChanged();\" : \"\";\n\n  // For singular messages and builders, one bit is used for the hasField bit.\n  (*variables)[\"get_has_field_bit_message\"] = GenerateGetBit(messageBitIndex);\n\n  (*variables)[\"get_has_field_bit_builder\"] = GenerateGetBit(builderBitIndex);\n  (*variables)[\"set_has_field_bit_builder\"] = GenerateSetBit(builderBitIndex);\n  (*variables)[\"clear_has_field_bit_builder\"] =\n      GenerateClearBit(builderBitIndex);\n\n  // For repated builders, one bit is used for whether the array is immutable.\n  (*variables)[\"get_mutable_bit_builder\"] = GenerateGetBit(builderBitIndex);\n  (*variables)[\"set_mutable_bit_builder\"] = GenerateSetBit(builderBitIndex);\n  (*variables)[\"clear_mutable_bit_builder\"] = GenerateClearBit(builderBitIndex);\n\n  (*variables)[\"get_has_field_bit_from_local\"] =\n      GenerateGetBitFromLocal(builderBitIndex);\n  (*variables)[\"set_has_field_bit_to_local\"] =\n      GenerateSetBitToLocal(messageBitIndex);\n}\n\n}  // namespace\n\n// ===================================================================\n\nPrimitiveFieldGenerator::\nPrimitiveFieldGenerator(const FieldDescriptor* descriptor,\n                        int messageBitIndex,\n                        int builderBitIndex)\n  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),\n    builderBitIndex_(builderBitIndex) {\n  SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,\n                        &variables_);\n}\n\nPrimitiveFieldGenerator::~PrimitiveFieldGenerator() {}\n\nint PrimitiveFieldGenerator::GetNumBitsForMessage() const {\n  return 1;\n}\n\nint PrimitiveFieldGenerator::GetNumBitsForBuilder() const {\n  return 1;\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateInterfaceMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$deprecation$boolean has$capitalized_name$();\\n\"\n    \"$deprecation$$type$ get$capitalized_name$();\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"private $field_type$ $name$_;\\n\"\n    \"$deprecation$public boolean has$capitalized_name$() {\\n\"\n    \"  return $get_has_field_bit_message$;\\n\"\n    \"}\\n\");\n\n  printer->Print(variables_,\n    \"$deprecation$public $type$ get$capitalized_name$() {\\n\"\n    \"  return $name$_;\\n\"\n    \"}\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateBuilderMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"private $field_type$ $name$_ $default_init$;\\n\"\n    \"$deprecation$public boolean has$capitalized_name$() {\\n\"\n    \"  return $get_has_field_bit_builder$;\\n\"\n    \"}\\n\");\n\n  printer->Print(variables_,\n    \"$deprecation$public $type$ get$capitalized_name$() {\\n\"\n    \"  return $name$_;\\n\"\n    \"}\\n\");\n\n  printer->Print(variables_,\n    \"$deprecation$public Builder set$capitalized_name$($type$ value) {\\n\"\n    \"$null_check$\"\n    \"  $set_has_field_bit_builder$;\\n\"\n    \"  $name$_ = value;\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder clear$capitalized_name$() {\\n\"\n    \"  $clear_has_field_bit_builder$;\\n\");\n  JavaType type = GetJavaType(descriptor_);\n  if (type == JAVATYPE_STRING || type == JAVATYPE_BYTES) {\n    // The default value is not a simple literal so we want to avoid executing\n    // it multiple times.  Instead, get the default out of the default instance.\n    printer->Print(variables_,\n      \"  $name$_ = getDefaultInstance().get$capitalized_name$();\\n\");\n  } else {\n    printer->Print(variables_,\n      \"  $name$_ = $default$;\\n\");\n  }\n  printer->Print(variables_,\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateFieldBuilderInitializationCode(io::Printer* printer)  const {\n  // noop for primitives\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateInitializationCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_ = $default$;\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateBuilderClearCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$name$_ = $default$;\\n\"\n    \"$clear_has_field_bit_builder$;\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if (other.has$capitalized_name$()) {\\n\"\n    \"  set$capitalized_name$(other.get$capitalized_name$());\\n\"\n    \"}\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateBuildingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if ($get_has_field_bit_from_local$) {\\n\"\n    \"  $set_has_field_bit_to_local$;\\n\"\n    \"}\\n\"\n    \"result.$name$_ = $name$_;\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateParsingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$set_has_field_bit_builder$;\\n\"\n    \"$name$_ = input.read$capitalized_type$();\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateSerializationCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if ($get_has_field_bit_message$) {\\n\"\n    \"  output.write$capitalized_type$($number$, $name$_);\\n\"\n    \"}\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateSerializedSizeCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if ($get_has_field_bit_message$) {\\n\"\n    \"  size += com.google.protobuf.CodedOutputStream\\n\"\n    \"    .compute$capitalized_type$Size($number$, $name$_);\\n\"\n    \"}\\n\");\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateEqualsCode(io::Printer* printer) const {\n  switch (GetJavaType(descriptor_)) {\n    case JAVATYPE_INT:\n    case JAVATYPE_LONG:\n    case JAVATYPE_BOOLEAN:\n      printer->Print(variables_,\n        \"result = result && (get$capitalized_name$()\\n\"\n        \"    == other.get$capitalized_name$());\\n\");\n      break;\n\n    case JAVATYPE_FLOAT:\n      printer->Print(variables_,\n        \"result = result && (Float.floatToIntBits(get$capitalized_name$())\"\n        \"    == Float.floatToIntBits(other.get$capitalized_name$()));\\n\");\n      break;\n\n    case JAVATYPE_DOUBLE:\n      printer->Print(variables_,\n        \"result = result && (Double.doubleToLongBits(get$capitalized_name$())\"\n        \"    == Double.doubleToLongBits(other.get$capitalized_name$()));\\n\");\n      break;\n\n    case JAVATYPE_STRING:\n    case JAVATYPE_BYTES:\n      printer->Print(variables_,\n        \"result = result && get$capitalized_name$()\\n\"\n        \"    .equals(other.get$capitalized_name$());\\n\");\n      break;\n\n    case JAVATYPE_ENUM:\n    case JAVATYPE_MESSAGE:\n    default:\n      GOOGLE_LOG(FATAL) << \"Can't get here.\";\n      break;\n  }\n}\n\nvoid PrimitiveFieldGenerator::\nGenerateHashCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"hash = (37 * hash) + $constant_name$;\\n\");\n  switch (GetJavaType(descriptor_)) {\n    case JAVATYPE_INT:\n      printer->Print(variables_,\n        \"hash = (53 * hash) + get$capitalized_name$();\\n\");\n      break;\n\n    case JAVATYPE_LONG:\n      printer->Print(variables_,\n        \"hash = (53 * hash) + hashLong(get$capitalized_name$());\\n\");\n      break;\n\n    case JAVATYPE_BOOLEAN:\n      printer->Print(variables_,\n        \"hash = (53 * hash) + hashBoolean(get$capitalized_name$());\\n\");\n      break;\n\n    case JAVATYPE_FLOAT:\n      printer->Print(variables_,\n        \"hash = (53 * hash) + Float.floatToIntBits(\\n\"\n        \"    get$capitalized_name$());\\n\");\n      break;\n\n    case JAVATYPE_DOUBLE:\n      printer->Print(variables_,\n        \"hash = (53 * hash) + hashLong(\\n\"\n        \"    Double.doubleToLongBits(get$capitalized_name$()));\\n\");\n      break;\n\n    case JAVATYPE_STRING:\n    case JAVATYPE_BYTES:\n      printer->Print(variables_,\n        \"hash = (53 * hash) + get$capitalized_name$().hashCode();\\n\");\n      break;\n\n    case JAVATYPE_ENUM:\n    case JAVATYPE_MESSAGE:\n    default:\n      GOOGLE_LOG(FATAL) << \"Can't get here.\";\n      break;\n  }\n}\n\nstring PrimitiveFieldGenerator::GetBoxedType() const {\n  return BoxedPrimitiveTypeName(GetJavaType(descriptor_));\n}\n\n// ===================================================================\n\nRepeatedPrimitiveFieldGenerator::\nRepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor,\n                                int messageBitIndex,\n                                int builderBitIndex)\n  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),\n    builderBitIndex_(builderBitIndex) {\n  SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,\n                        &variables_);\n}\n\nRepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {}\n\nint RepeatedPrimitiveFieldGenerator::GetNumBitsForMessage() const {\n  return 0;\n}\n\nint RepeatedPrimitiveFieldGenerator::GetNumBitsForBuilder() const {\n  return 1;\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateInterfaceMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$deprecation$java.util.List<$boxed_type$> get$capitalized_name$List();\\n\"\n    \"$deprecation$int get$capitalized_name$Count();\\n\"\n    \"$deprecation$$type$ get$capitalized_name$(int index);\\n\");\n}\n\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"private $field_list_type$ $name$_;\\n\"\n    \"$deprecation$public java.util.List<$boxed_type$>\\n\"\n    \"    get$capitalized_name$List() {\\n\"\n    \"  return $name$_;\\n\"   // note:  unmodifiable list\n    \"}\\n\"\n    \"$deprecation$public int get$capitalized_name$Count() {\\n\"\n    \"  return $name$_.size();\\n\"\n    \"}\\n\"\n    \"$deprecation$public $type$ get$capitalized_name$(int index) {\\n\"\n    \"  return $name$_.get(index);\\n\"\n    \"}\\n\");\n\n  if (descriptor_->options().packed() &&\n      HasGeneratedMethods(descriptor_->containing_type())) {\n    printer->Print(variables_,\n      \"private int $name$MemoizedSerializedSize = -1;\\n\");\n  }\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateBuilderMembers(io::Printer* printer) const {\n  // One field is the list and the bit field keeps track of whether the\n  // list is immutable. If it's immutable, the invariant is that it must\n  // either an instance of Collections.emptyList() or it's an ArrayList\n  // wrapped in a Collections.unmodifiableList() wrapper and nobody else has\n  // a refererence to the underlying ArrayList. This invariant allows us to\n  // share instances of lists between protocol buffers avoiding expensive\n  // memory allocations. Note, immutable is a strong guarantee here -- not\n  // just that the list cannot be modified via the reference but that the\n  // list can never be modified.\n  printer->Print(variables_,\n    \"private $field_list_type$ $name$_ = $empty_list$;\\n\");\n\n  printer->Print(variables_,\n    \"private void ensure$capitalized_name$IsMutable() {\\n\"\n    \"  if (!$get_mutable_bit_builder$) {\\n\"\n    \"    $name$_ = new java.util.ArrayList<$boxed_type$>($name$_);\\n\"\n    \"    $set_mutable_bit_builder$;\\n\"\n    \"   }\\n\"\n    \"}\\n\");\n\n    // Note:  We return an unmodifiable list because otherwise the caller\n    //   could hold on to the returned list and modify it after the message\n    //   has been built, thus mutating the message which is supposed to be\n    //   immutable.\n  printer->Print(variables_,\n    \"$deprecation$public java.util.List<$boxed_type$>\\n\"\n    \"    get$capitalized_name$List() {\\n\"\n    \"  return java.util.Collections.unmodifiableList($name$_);\\n\"\n    \"}\\n\"\n    \"$deprecation$public int get$capitalized_name$Count() {\\n\"\n    \"  return $name$_.size();\\n\"\n    \"}\\n\"\n    \"$deprecation$public $type$ get$capitalized_name$(int index) {\\n\"\n    \"  return $name$_.get(index);\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder set$capitalized_name$(\\n\"\n    \"    int index, $type$ value) {\\n\"\n    \"$null_check$\"\n    \"  ensure$capitalized_name$IsMutable();\\n\"\n    \"  $name$_.set(index, value);\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder add$capitalized_name$($type$ value) {\\n\"\n    \"$null_check$\"\n    \"  ensure$capitalized_name$IsMutable();\\n\"\n    \"  $name$_.add(value);\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder addAll$capitalized_name$(\\n\"\n    \"    java.lang.Iterable<? extends $boxed_type$> values) {\\n\"\n    \"  ensure$capitalized_name$IsMutable();\\n\"\n    \"  super.addAll(values, $name$_);\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder clear$capitalized_name$() {\\n\"\n    \"  $name$_ = $empty_list$;\\n\"\n    \"  $clear_mutable_bit_builder$;\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateFieldBuilderInitializationCode(io::Printer* printer)  const {\n  // noop for primitives\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateInitializationCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_ = $empty_list$;\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateBuilderClearCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$name$_ = $empty_list$;\\n\"\n    \"$clear_mutable_bit_builder$;\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  // The code below does two optimizations:\n  //   1. If the other list is empty, there's nothing to do. This ensures we\n  //      don't allocate a new array if we already have an immutable one.\n  //   2. If the other list is non-empty and our current list is empty, we can\n  //      reuse the other list which is guaranteed to be immutable.\n  printer->Print(variables_,\n    \"if (!other.$name$_.isEmpty()) {\\n\"\n    \"  if ($name$_.isEmpty()) {\\n\"\n    \"    $name$_ = other.$name$_;\\n\"\n    \"    $clear_mutable_bit_builder$;\\n\"\n    \"  } else {\\n\"\n    \"    ensure$capitalized_name$IsMutable();\\n\"\n    \"    $name$_.addAll(other.$name$_);\\n\"\n    \"  }\\n\"\n    \"  $on_changed$\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateBuildingCode(io::Printer* printer) const {\n  // The code below ensures that the result has an immutable list. If our\n  // list is immutable, we can just reuse it. If not, we make it immutable.\n  printer->Print(variables_,\n    \"if ($get_mutable_bit_builder$) {\\n\"\n    \"  $name$_ = java.util.Collections.unmodifiableList($name$_);\\n\"\n    \"  $clear_mutable_bit_builder$;\\n\"\n    \"}\\n\"\n    \"result.$name$_ = $name$_;\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateParsingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"ensure$capitalized_name$IsMutable();\\n\"\n    \"$name$_.add(input.read$capitalized_type$());\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateParsingCodeFromPacked(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"int length = input.readRawVarint32();\\n\"\n    \"int limit = input.pushLimit(length);\\n\"\n    \"while (input.getBytesUntilLimit() > 0) {\\n\"\n    \"  add$capitalized_name$(input.read$capitalized_type$());\\n\"\n    \"}\\n\"\n    \"input.popLimit(limit);\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateSerializationCode(io::Printer* printer) const {\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"if (get$capitalized_name$List().size() > 0) {\\n\"\n      \"  output.writeRawVarint32($tag$);\\n\"\n      \"  output.writeRawVarint32($name$MemoizedSerializedSize);\\n\"\n      \"}\\n\"\n      \"for (int i = 0; i < $name$_.size(); i++) {\\n\"\n      \"  output.write$capitalized_type$NoTag($name$_.get(i));\\n\"\n      \"}\\n\");\n  } else {\n    printer->Print(variables_,\n      \"for (int i = 0; i < $name$_.size(); i++) {\\n\"\n      \"  output.write$capitalized_type$($number$, $name$_.get(i));\\n\"\n      \"}\\n\");\n  }\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateSerializedSizeCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"{\\n\"\n    \"  int dataSize = 0;\\n\");\n  printer->Indent();\n\n  if (FixedSize(GetType(descriptor_)) == -1) {\n    printer->Print(variables_,\n      \"for (int i = 0; i < $name$_.size(); i++) {\\n\"\n      \"  dataSize += com.google.protobuf.CodedOutputStream\\n\"\n      \"    .compute$capitalized_type$SizeNoTag($name$_.get(i));\\n\"\n      \"}\\n\");\n  } else {\n    printer->Print(variables_,\n      \"dataSize = $fixed_size$ * get$capitalized_name$List().size();\\n\");\n  }\n\n  printer->Print(\n      \"size += dataSize;\\n\");\n\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"if (!get$capitalized_name$List().isEmpty()) {\\n\"\n      \"  size += $tag_size$;\\n\"\n      \"  size += com.google.protobuf.CodedOutputStream\\n\"\n      \"      .computeInt32SizeNoTag(dataSize);\\n\"\n      \"}\\n\");\n  } else {\n    printer->Print(variables_,\n      \"size += $tag_size$ * get$capitalized_name$List().size();\\n\");\n  }\n\n  // cache the data size for packed fields.\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"$name$MemoizedSerializedSize = dataSize;\\n\");\n  }\n\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateEqualsCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"result = result && get$capitalized_name$List()\\n\"\n    \"    .equals(other.get$capitalized_name$List());\\n\");\n}\n\nvoid RepeatedPrimitiveFieldGenerator::\nGenerateHashCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if (get$capitalized_name$Count() > 0) {\\n\"\n    \"  hash = (37 * hash) + $constant_name$;\\n\"\n    \"  hash = (53 * hash) + get$capitalized_name$List().hashCode();\\n\"\n    \"}\\n\");\n}\n\nstring RepeatedPrimitiveFieldGenerator::GetBoxedType() const {\n  return BoxedPrimitiveTypeName(GetJavaType(descriptor_));\n}\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_PRIMITIVE_FIELD_H__\n#define GOOGLE_PROTOBUF_COMPILER_JAVA_PRIMITIVE_FIELD_H__\n\n#include <map>\n#include <string>\n#include <google/protobuf/compiler/java/java_field.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nclass PrimitiveFieldGenerator : public FieldGenerator {\n public:\n  explicit PrimitiveFieldGenerator(const FieldDescriptor* descriptor,\n      int messageBitIndex, int builderBitIndex);\n  ~PrimitiveFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  int GetNumBitsForMessage() const;\n  int GetNumBitsForBuilder() const;\n  void GenerateInterfaceMembers(io::Printer* printer) const;\n  void GenerateMembers(io::Printer* printer) const;\n  void GenerateBuilderMembers(io::Printer* printer) const;\n  void GenerateInitializationCode(io::Printer* printer) const;\n  void GenerateBuilderClearCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateBuildingCode(io::Printer* printer) const;\n  void GenerateParsingCode(io::Printer* printer) const;\n  void GenerateSerializationCode(io::Printer* printer) const;\n  void GenerateSerializedSizeCode(io::Printer* printer) const;\n  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;\n  void GenerateEqualsCode(io::Printer* printer) const;\n  void GenerateHashCode(io::Printer* printer) const;\n\n  string GetBoxedType() const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n  const int messageBitIndex_;\n  const int builderBitIndex_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator);\n};\n\nclass RepeatedPrimitiveFieldGenerator : public FieldGenerator {\n public:\n  explicit RepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor,\n      int messageBitIndex, int builderBitIndex);\n  ~RepeatedPrimitiveFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  int GetNumBitsForMessage() const;\n  int GetNumBitsForBuilder() const;\n  void GenerateInterfaceMembers(io::Printer* printer) const;\n  void GenerateMembers(io::Printer* printer) const;\n  void GenerateBuilderMembers(io::Printer* printer) const;\n  void GenerateInitializationCode(io::Printer* printer) const;\n  void GenerateBuilderClearCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateBuildingCode(io::Printer* printer) const;\n  void GenerateParsingCode(io::Printer* printer) const;\n  void GenerateParsingCodeFromPacked(io::Printer* printer) const;\n  void GenerateSerializationCode(io::Printer* printer) const;\n  void GenerateSerializedSizeCode(io::Printer* printer) const;\n  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;\n  void GenerateEqualsCode(io::Printer* printer) const;\n  void GenerateHashCode(io::Printer* printer) const;\n\n  string GetBoxedType() const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n  const int messageBitIndex_;\n  const int builderBitIndex_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPrimitiveFieldGenerator);\n};\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_JAVA_PRIMITIVE_FIELD_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/compiler/java/java_service.h>\n#include <google/protobuf/compiler/java/java_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nServiceGenerator::ServiceGenerator(const ServiceDescriptor* descriptor)\n  : descriptor_(descriptor) {}\n\nServiceGenerator::~ServiceGenerator() {}\n\nvoid ServiceGenerator::Generate(io::Printer* printer) {\n  bool is_own_file = descriptor_->file()->options().java_multiple_files();\n  printer->Print(\n    \"public $static$ abstract class $classname$\\n\"\n    \"    implements com.google.protobuf.Service {\\n\",\n    \"static\", is_own_file ? \"\" : \"static\",\n    \"classname\", descriptor_->name());\n  printer->Indent();\n\n  printer->Print(\n    \"protected $classname$() {}\\n\\n\",\n    \"classname\", descriptor_->name());\n\n  GenerateInterface(printer);\n\n  GenerateNewReflectiveServiceMethod(printer);\n  GenerateNewReflectiveBlockingServiceMethod(printer);\n\n  GenerateAbstractMethods(printer);\n\n  // Generate getDescriptor() and getDescriptorForType().\n  printer->Print(\n    \"public static final\\n\"\n    \"    com.google.protobuf.Descriptors.ServiceDescriptor\\n\"\n    \"    getDescriptor() {\\n\"\n    \"  return $file$.getDescriptor().getServices().get($index$);\\n\"\n    \"}\\n\",\n    \"file\", ClassName(descriptor_->file()),\n    \"index\", SimpleItoa(descriptor_->index()));\n  GenerateGetDescriptorForType(printer);\n\n  // Generate more stuff.\n  GenerateCallMethod(printer);\n  GenerateGetPrototype(REQUEST, printer);\n  GenerateGetPrototype(RESPONSE, printer);\n  GenerateStub(printer);\n  GenerateBlockingStub(printer);\n\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n}\n\nvoid ServiceGenerator::GenerateGetDescriptorForType(io::Printer* printer) {\n  printer->Print(\n    \"public final com.google.protobuf.Descriptors.ServiceDescriptor\\n\"\n    \"    getDescriptorForType() {\\n\"\n    \"  return getDescriptor();\\n\"\n    \"}\\n\");\n}\n\nvoid ServiceGenerator::GenerateInterface(io::Printer* printer) {\n  printer->Print(\"public interface Interface {\\n\");\n  printer->Indent();\n  GenerateAbstractMethods(printer);\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n}\n\nvoid ServiceGenerator::GenerateNewReflectiveServiceMethod(\n    io::Printer* printer) {\n  printer->Print(\n    \"public static com.google.protobuf.Service newReflectiveService(\\n\"\n    \"    final Interface impl) {\\n\"\n    \"  return new $classname$() {\\n\",\n    \"classname\", descriptor_->name());\n  printer->Indent();\n  printer->Indent();\n\n  for (int i = 0; i < descriptor_->method_count(); i++) {\n    const MethodDescriptor* method = descriptor_->method(i);\n    printer->Print(\"@java.lang.Override\\n\");\n    GenerateMethodSignature(printer, method, IS_CONCRETE);\n    printer->Print(\n      \" {\\n\"\n      \"  impl.$method$(controller, request, done);\\n\"\n      \"}\\n\\n\",\n      \"method\", UnderscoresToCamelCase(method));\n  }\n\n  printer->Outdent();\n  printer->Print(\"};\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n}\n\nvoid ServiceGenerator::GenerateNewReflectiveBlockingServiceMethod(\n    io::Printer* printer) {\n  printer->Print(\n    \"public static com.google.protobuf.BlockingService\\n\"\n    \"    newReflectiveBlockingService(final BlockingInterface impl) {\\n\"\n    \"  return new com.google.protobuf.BlockingService() {\\n\");\n  printer->Indent();\n  printer->Indent();\n\n  GenerateGetDescriptorForType(printer);\n\n  GenerateCallBlockingMethod(printer);\n  GenerateGetPrototype(REQUEST, printer);\n  GenerateGetPrototype(RESPONSE, printer);\n\n  printer->Outdent();\n  printer->Print(\"};\\n\");\n  printer->Outdent();\n  printer->Print(\"}\\n\\n\");\n}\n\nvoid ServiceGenerator::GenerateAbstractMethods(io::Printer* printer) {\n  for (int i = 0; i < descriptor_->method_count(); i++) {\n    const MethodDescriptor* method = descriptor_->method(i);\n    GenerateMethodSignature(printer, method, IS_ABSTRACT);\n    printer->Print(\";\\n\\n\");\n  }\n}\n\nvoid ServiceGenerator::GenerateCallMethod(io::Printer* printer) {\n  printer->Print(\n    \"\\n\"\n    \"public final void callMethod(\\n\"\n    \"    com.google.protobuf.Descriptors.MethodDescriptor method,\\n\"\n    \"    com.google.protobuf.RpcController controller,\\n\"\n    \"    com.google.protobuf.Message request,\\n\"\n    \"    com.google.protobuf.RpcCallback<\\n\"\n    \"      com.google.protobuf.Message> done) {\\n\"\n    \"  if (method.getService() != getDescriptor()) {\\n\"\n    \"    throw new java.lang.IllegalArgumentException(\\n\"\n    \"      \\\"Service.callMethod() given method descriptor for wrong \\\" +\\n\"\n    \"      \\\"service type.\\\");\\n\"\n    \"  }\\n\"\n    \"  switch(method.getIndex()) {\\n\");\n  printer->Indent();\n  printer->Indent();\n\n  for (int i = 0; i < descriptor_->method_count(); i++) {\n    const MethodDescriptor* method = descriptor_->method(i);\n    map<string, string> vars;\n    vars[\"index\"] = SimpleItoa(i);\n    vars[\"method\"] = UnderscoresToCamelCase(method);\n    vars[\"input\"] = ClassName(method->input_type());\n    vars[\"output\"] = ClassName(method->output_type());\n    printer->Print(vars,\n      \"case $index$:\\n\"\n      \"  this.$method$(controller, ($input$)request,\\n\"\n      \"    com.google.protobuf.RpcUtil.<$output$>specializeCallback(\\n\"\n      \"      done));\\n\"\n      \"  return;\\n\");\n  }\n\n  printer->Print(\n    \"default:\\n\"\n    \"  throw new java.lang.AssertionError(\\\"Can't get here.\\\");\\n\");\n\n  printer->Outdent();\n  printer->Outdent();\n\n  printer->Print(\n    \"  }\\n\"\n    \"}\\n\"\n    \"\\n\");\n}\n\nvoid ServiceGenerator::GenerateCallBlockingMethod(io::Printer* printer) {\n  printer->Print(\n    \"\\n\"\n    \"public final com.google.protobuf.Message callBlockingMethod(\\n\"\n    \"    com.google.protobuf.Descriptors.MethodDescriptor method,\\n\"\n    \"    com.google.protobuf.RpcController controller,\\n\"\n    \"    com.google.protobuf.Message request)\\n\"\n    \"    throws com.google.protobuf.ServiceException {\\n\"\n    \"  if (method.getService() != getDescriptor()) {\\n\"\n    \"    throw new java.lang.IllegalArgumentException(\\n\"\n    \"      \\\"Service.callBlockingMethod() given method descriptor for \\\" +\\n\"\n    \"      \\\"wrong service type.\\\");\\n\"\n    \"  }\\n\"\n    \"  switch(method.getIndex()) {\\n\");\n  printer->Indent();\n  printer->Indent();\n\n  for (int i = 0; i < descriptor_->method_count(); i++) {\n    const MethodDescriptor* method = descriptor_->method(i);\n    map<string, string> vars;\n    vars[\"index\"] = SimpleItoa(i);\n    vars[\"method\"] = UnderscoresToCamelCase(method);\n    vars[\"input\"] = ClassName(method->input_type());\n    vars[\"output\"] = ClassName(method->output_type());\n    printer->Print(vars,\n      \"case $index$:\\n\"\n      \"  return impl.$method$(controller, ($input$)request);\\n\");\n  }\n\n  printer->Print(\n    \"default:\\n\"\n    \"  throw new java.lang.AssertionError(\\\"Can't get here.\\\");\\n\");\n\n  printer->Outdent();\n  printer->Outdent();\n\n  printer->Print(\n    \"  }\\n\"\n    \"}\\n\"\n    \"\\n\");\n}\n\nvoid ServiceGenerator::GenerateGetPrototype(RequestOrResponse which,\n                                            io::Printer* printer) {\n  /*\n   * TODO(cpovirk): The exception message says \"Service.foo\" when it may be\n   * \"BlockingService.foo.\"  Consider fixing.\n   */\n  printer->Print(\n    \"public final com.google.protobuf.Message\\n\"\n    \"    get$request_or_response$Prototype(\\n\"\n    \"    com.google.protobuf.Descriptors.MethodDescriptor method) {\\n\"\n    \"  if (method.getService() != getDescriptor()) {\\n\"\n    \"    throw new java.lang.IllegalArgumentException(\\n\"\n    \"      \\\"Service.get$request_or_response$Prototype() given method \\\" +\\n\"\n    \"      \\\"descriptor for wrong service type.\\\");\\n\"\n    \"  }\\n\"\n    \"  switch(method.getIndex()) {\\n\",\n    \"request_or_response\", (which == REQUEST) ? \"Request\" : \"Response\");\n  printer->Indent();\n  printer->Indent();\n\n  for (int i = 0; i < descriptor_->method_count(); i++) {\n    const MethodDescriptor* method = descriptor_->method(i);\n    map<string, string> vars;\n    vars[\"index\"] = SimpleItoa(i);\n    vars[\"type\"] = ClassName(\n      (which == REQUEST) ? method->input_type() : method->output_type());\n    printer->Print(vars,\n      \"case $index$:\\n\"\n      \"  return $type$.getDefaultInstance();\\n\");\n  }\n\n  printer->Print(\n    \"default:\\n\"\n    \"  throw new java.lang.AssertionError(\\\"Can't get here.\\\");\\n\");\n\n  printer->Outdent();\n  printer->Outdent();\n\n  printer->Print(\n    \"  }\\n\"\n    \"}\\n\"\n    \"\\n\");\n}\n\nvoid ServiceGenerator::GenerateStub(io::Printer* printer) {\n  printer->Print(\n    \"public static Stub newStub(\\n\"\n    \"    com.google.protobuf.RpcChannel channel) {\\n\"\n    \"  return new Stub(channel);\\n\"\n    \"}\\n\"\n    \"\\n\"\n    \"public static final class Stub extends $classname$ implements Interface {\"\n    \"\\n\",\n    \"classname\", ClassName(descriptor_));\n  printer->Indent();\n\n  printer->Print(\n    \"private Stub(com.google.protobuf.RpcChannel channel) {\\n\"\n    \"  this.channel = channel;\\n\"\n    \"}\\n\"\n    \"\\n\"\n    \"private final com.google.protobuf.RpcChannel channel;\\n\"\n    \"\\n\"\n    \"public com.google.protobuf.RpcChannel getChannel() {\\n\"\n    \"  return channel;\\n\"\n    \"}\\n\");\n\n  for (int i = 0; i < descriptor_->method_count(); i++) {\n    const MethodDescriptor* method = descriptor_->method(i);\n    printer->Print(\"\\n\");\n    GenerateMethodSignature(printer, method, IS_CONCRETE);\n    printer->Print(\" {\\n\");\n    printer->Indent();\n\n    map<string, string> vars;\n    vars[\"index\"] = SimpleItoa(i);\n    vars[\"output\"] = ClassName(method->output_type());\n    printer->Print(vars,\n      \"channel.callMethod(\\n\"\n      \"  getDescriptor().getMethods().get($index$),\\n\"\n      \"  controller,\\n\"\n      \"  request,\\n\"\n      \"  $output$.getDefaultInstance(),\\n\"\n      \"  com.google.protobuf.RpcUtil.generalizeCallback(\\n\"\n      \"    done,\\n\"\n      \"    $output$.class,\\n\"\n      \"    $output$.getDefaultInstance()));\\n\");\n\n    printer->Outdent();\n    printer->Print(\"}\\n\");\n  }\n\n  printer->Outdent();\n  printer->Print(\n    \"}\\n\"\n    \"\\n\");\n}\n\nvoid ServiceGenerator::GenerateBlockingStub(io::Printer* printer) {\n  printer->Print(\n    \"public static BlockingInterface newBlockingStub(\\n\"\n    \"    com.google.protobuf.BlockingRpcChannel channel) {\\n\"\n    \"  return new BlockingStub(channel);\\n\"\n    \"}\\n\"\n    \"\\n\");\n\n  printer->Print(\n    \"public interface BlockingInterface {\");\n  printer->Indent();\n\n  for (int i = 0; i < descriptor_->method_count(); i++) {\n    const MethodDescriptor* method = descriptor_->method(i);\n    GenerateBlockingMethodSignature(printer, method);\n    printer->Print(\";\\n\");\n  }\n\n  printer->Outdent();\n  printer->Print(\n    \"}\\n\"\n    \"\\n\");\n\n  printer->Print(\n    \"private static final class BlockingStub implements BlockingInterface {\\n\");\n  printer->Indent();\n\n  printer->Print(\n    \"private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) {\\n\"\n    \"  this.channel = channel;\\n\"\n    \"}\\n\"\n    \"\\n\"\n    \"private final com.google.protobuf.BlockingRpcChannel channel;\\n\");\n\n  for (int i = 0; i < descriptor_->method_count(); i++) {\n    const MethodDescriptor* method = descriptor_->method(i);\n    GenerateBlockingMethodSignature(printer, method);\n    printer->Print(\" {\\n\");\n    printer->Indent();\n\n    map<string, string> vars;\n    vars[\"index\"] = SimpleItoa(i);\n    vars[\"output\"] = ClassName(method->output_type());\n    printer->Print(vars,\n      \"return ($output$) channel.callBlockingMethod(\\n\"\n      \"  getDescriptor().getMethods().get($index$),\\n\"\n      \"  controller,\\n\"\n      \"  request,\\n\"\n      \"  $output$.getDefaultInstance());\\n\");\n\n    printer->Outdent();\n    printer->Print(\n      \"}\\n\"\n      \"\\n\");\n  }\n\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nvoid ServiceGenerator::GenerateMethodSignature(io::Printer* printer,\n                                               const MethodDescriptor* method,\n                                               IsAbstract is_abstract) {\n  map<string, string> vars;\n  vars[\"name\"] = UnderscoresToCamelCase(method);\n  vars[\"input\"] = ClassName(method->input_type());\n  vars[\"output\"] = ClassName(method->output_type());\n  vars[\"abstract\"] = (is_abstract == IS_ABSTRACT) ? \"abstract\" : \"\";\n  printer->Print(vars,\n    \"public $abstract$ void $name$(\\n\"\n    \"    com.google.protobuf.RpcController controller,\\n\"\n    \"    $input$ request,\\n\"\n    \"    com.google.protobuf.RpcCallback<$output$> done)\");\n}\n\nvoid ServiceGenerator::GenerateBlockingMethodSignature(\n    io::Printer* printer,\n    const MethodDescriptor* method) {\n  map<string, string> vars;\n  vars[\"method\"] = UnderscoresToCamelCase(method);\n  vars[\"input\"] = ClassName(method->input_type());\n  vars[\"output\"] = ClassName(method->output_type());\n  printer->Print(vars,\n    \"\\n\"\n    \"public $output$ $method$(\\n\"\n    \"    com.google.protobuf.RpcController controller,\\n\"\n    \"    $input$ request)\\n\"\n    \"    throws com.google.protobuf.ServiceException\");\n}\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_SERVICE_H__\n#define GOOGLE_PROTOBUF_COMPILER_JAVA_SERVICE_H__\n\n#include <map>\n#include <google/protobuf/descriptor.h>\n\nnamespace google {\nnamespace protobuf {\n  namespace io {\n    class Printer;             // printer.h\n  }\n}\n\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nclass ServiceGenerator {\n public:\n  explicit ServiceGenerator(const ServiceDescriptor* descriptor);\n  ~ServiceGenerator();\n\n  void Generate(io::Printer* printer);\n\n private:\n\n  // Generate the getDescriptorForType() method.\n  void GenerateGetDescriptorForType(io::Printer* printer);\n\n  // Generate a Java interface for the service.\n  void GenerateInterface(io::Printer* printer);\n\n  // Generate newReflectiveService() method.\n  void GenerateNewReflectiveServiceMethod(io::Printer* printer);\n\n  // Generate newReflectiveBlockingService() method.\n  void GenerateNewReflectiveBlockingServiceMethod(io::Printer* printer);\n\n  // Generate abstract method declarations for all methods.\n  void GenerateAbstractMethods(io::Printer* printer);\n\n  // Generate the implementation of Service.callMethod().\n  void GenerateCallMethod(io::Printer* printer);\n\n  // Generate the implementation of BlockingService.callBlockingMethod().\n  void GenerateCallBlockingMethod(io::Printer* printer);\n\n  // Generate the implementations of Service.get{Request,Response}Prototype().\n  enum RequestOrResponse { REQUEST, RESPONSE };\n  void GenerateGetPrototype(RequestOrResponse which, io::Printer* printer);\n\n  // Generate a stub implementation of the service.\n  void GenerateStub(io::Printer* printer);\n\n  // Generate a method signature, possibly abstract, without body or trailing\n  // semicolon.\n  enum IsAbstract { IS_ABSTRACT, IS_CONCRETE };\n  void GenerateMethodSignature(io::Printer* printer,\n                               const MethodDescriptor* method,\n                               IsAbstract is_abstract);\n\n  // Generate a blocking stub interface and implementation of the service.\n  void GenerateBlockingStub(io::Printer* printer);\n\n  // Generate the method signature for one method of a blocking stub.\n  void GenerateBlockingMethodSignature(io::Printer* printer,\n                                       const MethodDescriptor* method);\n\n  const ServiceDescriptor* descriptor_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceGenerator);\n};\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n\n#endif  // NET_PROTO2_COMPILER_JAVA_SERVICE_H__\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n// Author: jonp@google.com (Jon Perlow)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <map>\n#include <string>\n\n#include <google/protobuf/compiler/java/java_string_field.h>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/compiler/java/java_helpers.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nusing internal::WireFormat;\nusing internal::WireFormatLite;\n\nnamespace {\n\nvoid SetPrimitiveVariables(const FieldDescriptor* descriptor,\n                           int messageBitIndex,\n                           int builderBitIndex,\n                           map<string, string>* variables) {\n  (*variables)[\"name\"] =\n    UnderscoresToCamelCase(descriptor);\n  (*variables)[\"capitalized_name\"] =\n    UnderscoresToCapitalizedCamelCase(descriptor);\n  (*variables)[\"constant_name\"] = FieldConstantName(descriptor);\n  (*variables)[\"number\"] = SimpleItoa(descriptor->number());\n  (*variables)[\"empty_list\"] = \"com.google.protobuf.LazyStringArrayList.EMPTY\";\n\n  (*variables)[\"default\"] = DefaultValue(descriptor);\n  (*variables)[\"default_init\"] = (\"= \" + DefaultValue(descriptor));\n  (*variables)[\"capitalized_type\"] = \"String\";\n  (*variables)[\"tag\"] = SimpleItoa(WireFormat::MakeTag(descriptor));\n  (*variables)[\"tag_size\"] = SimpleItoa(\n      WireFormat::TagSize(descriptor->number(), GetType(descriptor)));\n  (*variables)[\"null_check\"] =\n      \"  if (value == null) {\\n\"\n      \"    throw new NullPointerException();\\n\"\n      \"  }\\n\";\n\n  // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported\n  // by the proto compiler\n  (*variables)[\"deprecation\"] = descriptor->options().deprecated()\n      ? \"@java.lang.Deprecated \" : \"\";\n  (*variables)[\"on_changed\"] =\n      HasDescriptorMethods(descriptor->containing_type()) ? \"onChanged();\" : \"\";\n\n  // For singular messages and builders, one bit is used for the hasField bit.\n  (*variables)[\"get_has_field_bit_message\"] = GenerateGetBit(messageBitIndex);\n\n  (*variables)[\"get_has_field_bit_builder\"] = GenerateGetBit(builderBitIndex);\n  (*variables)[\"set_has_field_bit_builder\"] = GenerateSetBit(builderBitIndex);\n  (*variables)[\"clear_has_field_bit_builder\"] =\n      GenerateClearBit(builderBitIndex);\n\n  // For repated builders, one bit is used for whether the array is immutable.\n  (*variables)[\"get_mutable_bit_builder\"] = GenerateGetBit(builderBitIndex);\n  (*variables)[\"set_mutable_bit_builder\"] = GenerateSetBit(builderBitIndex);\n  (*variables)[\"clear_mutable_bit_builder\"] = GenerateClearBit(builderBitIndex);\n\n  (*variables)[\"get_has_field_bit_from_local\"] =\n      GenerateGetBitFromLocal(builderBitIndex);\n  (*variables)[\"set_has_field_bit_to_local\"] =\n      GenerateSetBitToLocal(messageBitIndex);\n}\n\n}  // namespace\n\n// ===================================================================\n\nStringFieldGenerator::\nStringFieldGenerator(const FieldDescriptor* descriptor,\n                     int messageBitIndex,\n                     int builderBitIndex)\n  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),\n    builderBitIndex_(builderBitIndex) {\n  SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,\n                        &variables_);\n}\n\nStringFieldGenerator::~StringFieldGenerator() {}\n\nint StringFieldGenerator::GetNumBitsForMessage() const {\n  return 1;\n}\n\nint StringFieldGenerator::GetNumBitsForBuilder() const {\n  return 1;\n}\n\n// A note about how strings are handled. This code used to just store a String\n// in the Message. This had two issues:\n//\n//  1. It wouldn't roundtrip byte arrays that were not vaid UTF-8 encoded\n//     strings, but rather fields that were raw bytes incorrectly marked\n//     as strings in the proto file. This is common because in the proto1\n//     syntax, string was the way to indicate bytes and C++ engineers can\n//     easily make this mistake without affecting the C++ API. By converting to\n//     strings immediately, some java code might corrupt these byte arrays as\n//     it passes through a java server even if the field was never accessed by\n//     application code.\n//\n//  2. There's a performance hit to converting between bytes and strings and\n//     it many cases, the field is never even read by the application code. This\n//     avoids unnecessary conversions in the common use cases.\n//\n// So now, the field for String is maintained as an Object reference which can\n// either store a String or a ByteString. The code uses an instanceof check\n// to see which one it has and converts to the other one if needed. It remembers\n// the last value requested (in a thread safe manner) as this is most likely\n// the one needed next. The thread safety is such that if two threads both\n// convert the field because the changes made by each thread were not visible to\n// the other, they may cause a conversion to happen more times than would\n// otherwise be necessary. This was deemed better than adding synchronization\n// overhead. It will not cause any corruption issues or affect the behavior of\n// the API. The instanceof check is also highly optimized in the JVM and we\n// decided it was better to reduce the memory overhead by not having two\n// separate fields but rather use dynamic type checking.\n//\n// For single fields, the logic for this is done inside the generated code. For\n// repeated fields, the logic is done in LazyStringArrayList and\n// UnmodifiableLazyStringList.\nvoid StringFieldGenerator::\nGenerateInterfaceMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$deprecation$boolean has$capitalized_name$();\\n\"\n    \"$deprecation$java.lang.String get$capitalized_name$();\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"private java.lang.Object $name$_;\\n\"\n    \"$deprecation$public boolean has$capitalized_name$() {\\n\"\n    \"  return $get_has_field_bit_message$;\\n\"\n    \"}\\n\");\n\n  printer->Print(variables_,\n    \"$deprecation$public java.lang.String get$capitalized_name$() {\\n\"\n    \"  java.lang.Object ref = $name$_;\\n\"\n    \"  if (ref instanceof java.lang.String) {\\n\"\n    \"    return (java.lang.String) ref;\\n\"\n    \"  } else {\\n\"\n    \"    com.google.protobuf.ByteString bs = \\n\"\n    \"        (com.google.protobuf.ByteString) ref;\\n\"\n    \"    java.lang.String s = bs.toStringUtf8();\\n\"\n    \"    if (com.google.protobuf.Internal.isValidUtf8(bs)) {\\n\"\n    \"      $name$_ = s;\\n\"\n    \"    }\\n\"\n    \"    return s;\\n\"\n    \"  }\\n\"\n    \"}\\n\"\n    \"private com.google.protobuf.ByteString get$capitalized_name$Bytes() {\\n\"\n    \"  java.lang.Object ref = $name$_;\\n\"\n    \"  if (ref instanceof java.lang.String) {\\n\"\n    \"    com.google.protobuf.ByteString b = \\n\"\n    \"        com.google.protobuf.ByteString.copyFromUtf8(\\n\"\n    \"            (java.lang.String) ref);\\n\"\n    \"    $name$_ = b;\\n\"\n    \"    return b;\\n\"\n    \"  } else {\\n\"\n    \"    return (com.google.protobuf.ByteString) ref;\\n\"\n    \"  }\\n\"\n    \"}\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateBuilderMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"private java.lang.Object $name$_ $default_init$;\\n\"\n    \"$deprecation$public boolean has$capitalized_name$() {\\n\"\n    \"  return $get_has_field_bit_builder$;\\n\"\n    \"}\\n\");\n\n  printer->Print(variables_,\n    \"$deprecation$public java.lang.String get$capitalized_name$() {\\n\"\n    \"  java.lang.Object ref = $name$_;\\n\"\n    \"  if (!(ref instanceof java.lang.String)) {\\n\"\n    \"    java.lang.String s = ((com.google.protobuf.ByteString) ref)\\n\"\n    \"        .toStringUtf8();\\n\"\n    \"    $name$_ = s;\\n\"\n    \"    return s;\\n\"\n    \"  } else {\\n\"\n    \"    return (java.lang.String) ref;\\n\"\n    \"  }\\n\"\n    \"}\\n\");\n\n  printer->Print(variables_,\n    \"$deprecation$public Builder set$capitalized_name$(\\n\"\n    \"    java.lang.String value) {\\n\"\n    \"$null_check$\"\n    \"  $set_has_field_bit_builder$;\\n\"\n    \"  $name$_ = value;\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder clear$capitalized_name$() {\\n\"\n    \"  $clear_has_field_bit_builder$;\\n\");\n  // The default value is not a simple literal so we want to avoid executing\n  // it multiple times.  Instead, get the default out of the default instance.\n  printer->Print(variables_,\n    \"  $name$_ = getDefaultInstance().get$capitalized_name$();\\n\");\n  printer->Print(variables_,\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\");\n\n  printer->Print(variables_,\n    \"void set$capitalized_name$(com.google.protobuf.ByteString value) {\\n\"\n    \"  $set_has_field_bit_builder$;\\n\"\n    \"  $name$_ = value;\\n\"\n    \"  $on_changed$\\n\"\n    \"}\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateFieldBuilderInitializationCode(io::Printer* printer)  const {\n  // noop for primitives\n}\n\nvoid StringFieldGenerator::\nGenerateInitializationCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_ = $default$;\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateBuilderClearCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$name$_ = $default$;\\n\"\n    \"$clear_has_field_bit_builder$;\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if (other.has$capitalized_name$()) {\\n\"\n    \"  set$capitalized_name$(other.get$capitalized_name$());\\n\"\n    \"}\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateBuildingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if ($get_has_field_bit_from_local$) {\\n\"\n    \"  $set_has_field_bit_to_local$;\\n\"\n    \"}\\n\"\n    \"result.$name$_ = $name$_;\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateParsingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$set_has_field_bit_builder$;\\n\"\n    \"$name$_ = input.readBytes();\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateSerializationCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if ($get_has_field_bit_message$) {\\n\"\n    \"  output.writeBytes($number$, get$capitalized_name$Bytes());\\n\"\n    \"}\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateSerializedSizeCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if ($get_has_field_bit_message$) {\\n\"\n    \"  size += com.google.protobuf.CodedOutputStream\\n\"\n    \"    .computeBytesSize($number$, get$capitalized_name$Bytes());\\n\"\n    \"}\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateEqualsCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"result = result && get$capitalized_name$()\\n\"\n    \"    .equals(other.get$capitalized_name$());\\n\");\n}\n\nvoid StringFieldGenerator::\nGenerateHashCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"hash = (37 * hash) + $constant_name$;\\n\");\n  printer->Print(variables_,\n    \"hash = (53 * hash) + get$capitalized_name$().hashCode();\\n\");\n}\n\nstring StringFieldGenerator::GetBoxedType() const {\n  return \"java.lang.String\";\n}\n\n\n// ===================================================================\n\nRepeatedStringFieldGenerator::\nRepeatedStringFieldGenerator(const FieldDescriptor* descriptor,\n                             int messageBitIndex,\n                             int builderBitIndex)\n  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),\n    builderBitIndex_(builderBitIndex) {\n  SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,\n                        &variables_);\n}\n\nRepeatedStringFieldGenerator::~RepeatedStringFieldGenerator() {}\n\nint RepeatedStringFieldGenerator::GetNumBitsForMessage() const {\n  return 0;\n}\n\nint RepeatedStringFieldGenerator::GetNumBitsForBuilder() const {\n  return 1;\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateInterfaceMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$deprecation$java.util.List<java.lang.String>\\n\"\n    \"    get$capitalized_name$List();\\n\"\n    \"$deprecation$int get$capitalized_name$Count();\\n\"\n    \"$deprecation$java.lang.String get$capitalized_name$(int index);\\n\");\n}\n\n\nvoid RepeatedStringFieldGenerator::\nGenerateMembers(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"private com.google.protobuf.LazyStringList $name$_;\\n\"\n    \"$deprecation$public java.util.List<java.lang.String>\\n\"\n    \"    get$capitalized_name$List() {\\n\"\n    \"  return $name$_;\\n\"   // note:  unmodifiable list\n    \"}\\n\"\n    \"$deprecation$public int get$capitalized_name$Count() {\\n\"\n    \"  return $name$_.size();\\n\"\n    \"}\\n\"\n    \"$deprecation$public java.lang.String get$capitalized_name$(int index) {\\n\"\n    \"  return $name$_.get(index);\\n\"\n    \"}\\n\");\n\n  if (descriptor_->options().packed() &&\n      HasGeneratedMethods(descriptor_->containing_type())) {\n    printer->Print(variables_,\n      \"private int $name$MemoizedSerializedSize = -1;\\n\");\n  }\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateBuilderMembers(io::Printer* printer) const {\n  // One field is the list and the bit field keeps track of whether the\n  // list is immutable. If it's immutable, the invariant is that it must\n  // either an instance of Collections.emptyList() or it's an ArrayList\n  // wrapped in a Collections.unmodifiableList() wrapper and nobody else has\n  // a refererence to the underlying ArrayList. This invariant allows us to\n  // share instances of lists between protocol buffers avoiding expensive\n  // memory allocations. Note, immutable is a strong guarantee here -- not\n  // just that the list cannot be modified via the reference but that the\n  // list can never be modified.\n  printer->Print(variables_,\n    \"private com.google.protobuf.LazyStringList $name$_ = $empty_list$;\\n\");\n\n  printer->Print(variables_,\n    \"private void ensure$capitalized_name$IsMutable() {\\n\"\n    \"  if (!$get_mutable_bit_builder$) {\\n\"\n    \"    $name$_ = new com.google.protobuf.LazyStringArrayList($name$_);\\n\"\n    \"    $set_mutable_bit_builder$;\\n\"\n    \"   }\\n\"\n    \"}\\n\");\n\n    // Note:  We return an unmodifiable list because otherwise the caller\n    //   could hold on to the returned list and modify it after the message\n    //   has been built, thus mutating the message which is supposed to be\n    //   immutable.\n  printer->Print(variables_,\n    \"$deprecation$public java.util.List<java.lang.String>\\n\"\n    \"    get$capitalized_name$List() {\\n\"\n    \"  return java.util.Collections.unmodifiableList($name$_);\\n\"\n    \"}\\n\"\n    \"$deprecation$public int get$capitalized_name$Count() {\\n\"\n    \"  return $name$_.size();\\n\"\n    \"}\\n\"\n    \"$deprecation$public java.lang.String get$capitalized_name$(int index) {\\n\"\n    \"  return $name$_.get(index);\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder set$capitalized_name$(\\n\"\n    \"    int index, java.lang.String value) {\\n\"\n    \"$null_check$\"\n    \"  ensure$capitalized_name$IsMutable();\\n\"\n    \"  $name$_.set(index, value);\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder add$capitalized_name$(\\n\"\n    \"    java.lang.String value) {\\n\"\n    \"$null_check$\"\n    \"  ensure$capitalized_name$IsMutable();\\n\"\n    \"  $name$_.add(value);\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder addAll$capitalized_name$(\\n\"\n    \"    java.lang.Iterable<java.lang.String> values) {\\n\"\n    \"  ensure$capitalized_name$IsMutable();\\n\"\n    \"  super.addAll(values, $name$_);\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\"\n    \"$deprecation$public Builder clear$capitalized_name$() {\\n\"\n    \"  $name$_ = $empty_list$;\\n\"\n    \"  $clear_mutable_bit_builder$;\\n\"\n    \"  $on_changed$\\n\"\n    \"  return this;\\n\"\n    \"}\\n\");\n\n  printer->Print(variables_,\n    \"void add$capitalized_name$(com.google.protobuf.ByteString value) {\\n\"\n    \"  ensure$capitalized_name$IsMutable();\\n\"\n    \"  $name$_.add(value);\\n\"\n    \"  $on_changed$\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateFieldBuilderInitializationCode(io::Printer* printer)  const {\n  // noop for primitives\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateInitializationCode(io::Printer* printer) const {\n  printer->Print(variables_, \"$name$_ = $empty_list$;\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateBuilderClearCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"$name$_ = $empty_list$;\\n\"\n    \"$clear_mutable_bit_builder$;\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateMergingCode(io::Printer* printer) const {\n  // The code below does two optimizations:\n  //   1. If the other list is empty, there's nothing to do. This ensures we\n  //      don't allocate a new array if we already have an immutable one.\n  //   2. If the other list is non-empty and our current list is empty, we can\n  //      reuse the other list which is guaranteed to be immutable.\n  printer->Print(variables_,\n    \"if (!other.$name$_.isEmpty()) {\\n\"\n    \"  if ($name$_.isEmpty()) {\\n\"\n    \"    $name$_ = other.$name$_;\\n\"\n    \"    $clear_mutable_bit_builder$;\\n\"\n    \"  } else {\\n\"\n    \"    ensure$capitalized_name$IsMutable();\\n\"\n    \"    $name$_.addAll(other.$name$_);\\n\"\n    \"  }\\n\"\n    \"  $on_changed$\\n\"\n    \"}\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateBuildingCode(io::Printer* printer) const {\n  // The code below ensures that the result has an immutable list. If our\n  // list is immutable, we can just reuse it. If not, we make it immutable.\n\n  printer->Print(variables_,\n    \"if ($get_mutable_bit_builder$) {\\n\"\n    \"  $name$_ = new com.google.protobuf.UnmodifiableLazyStringList(\\n\"\n    \"      $name$_);\\n\"\n    \"  $clear_mutable_bit_builder$;\\n\"\n    \"}\\n\"\n    \"result.$name$_ = $name$_;\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateParsingCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"ensure$capitalized_name$IsMutable();\\n\"\n    \"$name$_.add(input.readBytes());\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateParsingCodeFromPacked(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"int length = input.readRawVarint32();\\n\"\n    \"int limit = input.pushLimit(length);\\n\"\n    \"while (input.getBytesUntilLimit() > 0) {\\n\"\n    \"  add$capitalized_name$(input.read$capitalized_type$());\\n\"\n    \"}\\n\"\n    \"input.popLimit(limit);\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateSerializationCode(io::Printer* printer) const {\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"if (get$capitalized_name$List().size() > 0) {\\n\"\n      \"  output.writeRawVarint32($tag$);\\n\"\n      \"  output.writeRawVarint32($name$MemoizedSerializedSize);\\n\"\n      \"}\\n\"\n      \"for (int i = 0; i < $name$_.size(); i++) {\\n\"\n      \"  output.write$capitalized_type$NoTag($name$_.get(i));\\n\"\n      \"}\\n\");\n  } else {\n    printer->Print(variables_,\n      \"for (int i = 0; i < $name$_.size(); i++) {\\n\"\n      \"  output.writeBytes($number$, $name$_.getByteString(i));\\n\"\n      \"}\\n\");\n  }\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateSerializedSizeCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"{\\n\"\n    \"  int dataSize = 0;\\n\");\n  printer->Indent();\n\n  printer->Print(variables_,\n    \"for (int i = 0; i < $name$_.size(); i++) {\\n\"\n    \"  dataSize += com.google.protobuf.CodedOutputStream\\n\"\n    \"    .computeBytesSizeNoTag($name$_.getByteString(i));\\n\"\n    \"}\\n\");\n\n  printer->Print(\n      \"size += dataSize;\\n\");\n\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"if (!get$capitalized_name$List().isEmpty()) {\\n\"\n      \"  size += $tag_size$;\\n\"\n      \"  size += com.google.protobuf.CodedOutputStream\\n\"\n      \"      .computeInt32SizeNoTag(dataSize);\\n\"\n      \"}\\n\");\n  } else {\n    printer->Print(variables_,\n      \"size += $tag_size$ * get$capitalized_name$List().size();\\n\");\n  }\n\n  // cache the data size for packed fields.\n  if (descriptor_->options().packed()) {\n    printer->Print(variables_,\n      \"$name$MemoizedSerializedSize = dataSize;\\n\");\n  }\n\n  printer->Outdent();\n  printer->Print(\"}\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateEqualsCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"result = result && get$capitalized_name$List()\\n\"\n    \"    .equals(other.get$capitalized_name$List());\\n\");\n}\n\nvoid RepeatedStringFieldGenerator::\nGenerateHashCode(io::Printer* printer) const {\n  printer->Print(variables_,\n    \"if (get$capitalized_name$Count() > 0) {\\n\"\n    \"  hash = (37 * hash) + $constant_name$;\\n\"\n    \"  hash = (53 * hash) + get$capitalized_name$List().hashCode();\\n\"\n    \"}\\n\");\n}\n\nstring RepeatedStringFieldGenerator::GetBoxedType() const {\n  return \"String\";\n}\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n// Author: jonp@google.com (Jon Perlow)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_STRING_FIELD_H__\n#define GOOGLE_PROTOBUF_COMPILER_JAVA_STRING_FIELD_H__\n\n#include <map>\n#include <string>\n#include <google/protobuf/compiler/java/java_field.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace java {\n\nclass StringFieldGenerator : public FieldGenerator {\n public:\n  explicit StringFieldGenerator(const FieldDescriptor* descriptor,\n      int messageBitIndex, int builderBitIndex);\n  ~StringFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  int GetNumBitsForMessage() const;\n  int GetNumBitsForBuilder() const;\n  void GenerateInterfaceMembers(io::Printer* printer) const;\n  void GenerateMembers(io::Printer* printer) const;\n  void GenerateBuilderMembers(io::Printer* printer) const;\n  void GenerateInitializationCode(io::Printer* printer) const;\n  void GenerateBuilderClearCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateBuildingCode(io::Printer* printer) const;\n  void GenerateParsingCode(io::Printer* printer) const;\n  void GenerateSerializationCode(io::Printer* printer) const;\n  void GenerateSerializedSizeCode(io::Printer* printer) const;\n  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;\n  void GenerateEqualsCode(io::Printer* printer) const;\n  void GenerateHashCode(io::Printer* printer) const;\n  string GetBoxedType() const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n  const int messageBitIndex_;\n  const int builderBitIndex_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringFieldGenerator);\n};\n\nclass RepeatedStringFieldGenerator : public FieldGenerator {\n public:\n  explicit RepeatedStringFieldGenerator(const FieldDescriptor* descriptor,\n      int messageBitIndex, int builderBitIndex);\n  ~RepeatedStringFieldGenerator();\n\n  // implements FieldGenerator ---------------------------------------\n  int GetNumBitsForMessage() const;\n  int GetNumBitsForBuilder() const;\n  void GenerateInterfaceMembers(io::Printer* printer) const;\n  void GenerateMembers(io::Printer* printer) const;\n  void GenerateBuilderMembers(io::Printer* printer) const;\n  void GenerateInitializationCode(io::Printer* printer) const;\n  void GenerateBuilderClearCode(io::Printer* printer) const;\n  void GenerateMergingCode(io::Printer* printer) const;\n  void GenerateBuildingCode(io::Printer* printer) const;\n  void GenerateParsingCode(io::Printer* printer) const;\n  void GenerateParsingCodeFromPacked(io::Printer* printer) const;\n  void GenerateSerializationCode(io::Printer* printer) const;\n  void GenerateSerializedSizeCode(io::Printer* printer) const;\n  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;\n  void GenerateEqualsCode(io::Printer* printer) const;\n  void GenerateHashCode(io::Printer* printer) const;\n  string GetBoxedType() const;\n\n private:\n  const FieldDescriptor* descriptor_;\n  map<string, string> variables_;\n  const int messageBitIndex_;\n  const int builderBitIndex_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedStringFieldGenerator);\n};\n\n}  // namespace java\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_JAVA_STRING_FIELD_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/main.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\n#include <google/protobuf/compiler/command_line_interface.h>\n#include <google/protobuf/compiler/cpp/cpp_generator.h>\n#include <google/protobuf/compiler/python/python_generator.h>\n#include <google/protobuf/compiler/java/java_generator.h>\n\n\nint main(int argc, char* argv[]) {\n\n  google::protobuf::compiler::CommandLineInterface cli;\n  cli.AllowPlugins(\"protoc-\");\n\n  // Proto2 C++\n  google::protobuf::compiler::cpp::CppGenerator cpp_generator;\n  cli.RegisterGenerator(\"--cpp_out\", &cpp_generator,\n                        \"Generate C++ header and source.\");\n\n  // Proto2 Java\n  google::protobuf::compiler::java::JavaGenerator java_generator;\n  cli.RegisterGenerator(\"--java_out\", &java_generator,\n                        \"Generate Java source file.\");\n\n\n  // Proto2 Python\n  google::protobuf::compiler::python::Generator py_generator;\n  cli.RegisterGenerator(\"--python_out\", &py_generator,\n                        \"Generate Python source file.\");\n\n  return cli.Run(argc, argv);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\n#include <google/protobuf/compiler/mock_code_generator.h>\n\n#include <google/protobuf/testing/file.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n#include <gtest/gtest.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\n// Returns the list of the names of files in all_files in the form of a\n// comma-separated string.\nstring CommaSeparatedList(const vector<const FileDescriptor*> all_files) {\n  vector<string> names;\n  for (int i = 0; i < all_files.size(); i++) {\n    names.push_back(all_files[i]->name());\n  }\n  return JoinStrings(names, \",\");\n}\n\nstatic const char* kFirstInsertionPointName = \"first_mock_insertion_point\";\nstatic const char* kSecondInsertionPointName = \"second_mock_insertion_point\";\nstatic const char* kFirstInsertionPoint =\n    \"# @@protoc_insertion_point(first_mock_insertion_point) is here\\n\";\nstatic const char* kSecondInsertionPoint =\n    \"  # @@protoc_insertion_point(second_mock_insertion_point) is here\\n\";\n\nMockCodeGenerator::MockCodeGenerator(const string& name)\n    : name_(name) {}\n\nMockCodeGenerator::~MockCodeGenerator() {}\n\nvoid MockCodeGenerator::ExpectGenerated(\n    const string& name,\n    const string& parameter,\n    const string& insertions,\n    const string& file,\n    const string& first_message_name,\n    const string& first_parsed_file_name,\n    const string& output_directory) {\n  string content;\n  ASSERT_TRUE(File::ReadFileToString(\n      output_directory + \"/\" + GetOutputFileName(name, file), &content));\n\n  vector<string> lines;\n  SplitStringUsing(content, \"\\n\", &lines);\n\n  while (!lines.empty() && lines.back().empty()) {\n    lines.pop_back();\n  }\n  for (int i = 0; i < lines.size(); i++) {\n    lines[i] += \"\\n\";\n  }\n\n  vector<string> insertion_list;\n  if (!insertions.empty()) {\n    SplitStringUsing(insertions, \",\", &insertion_list);\n  }\n\n  ASSERT_EQ(lines.size(), 3 + insertion_list.size() * 2);\n  EXPECT_EQ(GetOutputFileContent(name, parameter, file,\n                                 first_parsed_file_name, first_message_name),\n            lines[0]);\n\n  EXPECT_EQ(kFirstInsertionPoint, lines[1 + insertion_list.size()]);\n  EXPECT_EQ(kSecondInsertionPoint, lines[2 + insertion_list.size() * 2]);\n\n  for (int i = 0; i < insertion_list.size(); i++) {\n    EXPECT_EQ(GetOutputFileContent(insertion_list[i], \"first_insert\",\n                                   file, file, first_message_name),\n              lines[1 + i]);\n    // Second insertion point is indented, so the inserted text should\n    // automatically be indented too.\n    EXPECT_EQ(\"  \" + GetOutputFileContent(insertion_list[i], \"second_insert\",\n                                          file, file, first_message_name),\n              lines[2 + insertion_list.size() + i]);\n  }\n}\n\nbool MockCodeGenerator::Generate(\n    const FileDescriptor* file,\n    const string& parameter,\n    GeneratorContext* context,\n    string* error) const {\n  for (int i = 0; i < file->message_type_count(); i++) {\n    if (HasPrefixString(file->message_type(i)->name(), \"MockCodeGenerator_\")) {\n      string command = StripPrefixString(file->message_type(i)->name(),\n                                         \"MockCodeGenerator_\");\n      if (command == \"Error\") {\n        *error = \"Saw message type MockCodeGenerator_Error.\";\n        return false;\n      } else if (command == \"Exit\") {\n        cerr << \"Saw message type MockCodeGenerator_Exit.\" << endl;\n        exit(123);\n      } else if (command == \"Abort\") {\n        cerr << \"Saw message type MockCodeGenerator_Abort.\" << endl;\n        abort();\n      } else {\n        GOOGLE_LOG(FATAL) << \"Unknown MockCodeGenerator command: \" << command;\n      }\n    }\n  }\n\n  if (HasPrefixString(parameter, \"insert=\")) {\n    vector<string> insert_into;\n    SplitStringUsing(StripPrefixString(parameter, \"insert=\"),\n                     \",\", &insert_into);\n\n    for (int i = 0; i < insert_into.size(); i++) {\n      {\n        scoped_ptr<io::ZeroCopyOutputStream> output(\n            context->OpenForInsert(\n              GetOutputFileName(insert_into[i], file),\n              kFirstInsertionPointName));\n        io::Printer printer(output.get(), '$');\n        printer.PrintRaw(GetOutputFileContent(name_, \"first_insert\",\n                                              file, context));\n        if (printer.failed()) {\n          *error = \"MockCodeGenerator detected write error.\";\n          return false;\n        }\n      }\n\n      {\n        scoped_ptr<io::ZeroCopyOutputStream> output(\n            context->OpenForInsert(\n              GetOutputFileName(insert_into[i], file),\n              kSecondInsertionPointName));\n        io::Printer printer(output.get(), '$');\n        printer.PrintRaw(GetOutputFileContent(name_, \"second_insert\",\n                                              file, context));\n        if (printer.failed()) {\n          *error = \"MockCodeGenerator detected write error.\";\n          return false;\n        }\n      }\n    }\n  } else {\n    scoped_ptr<io::ZeroCopyOutputStream> output(\n        context->Open(GetOutputFileName(name_, file)));\n\n    io::Printer printer(output.get(), '$');\n    printer.PrintRaw(GetOutputFileContent(name_, parameter,\n                                          file, context));\n    printer.PrintRaw(kFirstInsertionPoint);\n    printer.PrintRaw(kSecondInsertionPoint);\n\n    if (printer.failed()) {\n      *error = \"MockCodeGenerator detected write error.\";\n      return false;\n    }\n  }\n\n  return true;\n}\n\nstring MockCodeGenerator::GetOutputFileName(const string& generator_name,\n                                            const FileDescriptor* file) {\n  return GetOutputFileName(generator_name, file->name());\n}\n\nstring MockCodeGenerator::GetOutputFileName(const string& generator_name,\n                                            const string& file) {\n  return file + \".MockCodeGenerator.\" + generator_name;\n}\n\nstring MockCodeGenerator::GetOutputFileContent(\n    const string& generator_name,\n    const string& parameter,\n    const FileDescriptor* file,\n    GeneratorContext *context) {\n  vector<const FileDescriptor*> all_files;\n  context->ListParsedFiles(&all_files);\n  return GetOutputFileContent(\n      generator_name, parameter, file->name(),\n      CommaSeparatedList(all_files),\n      file->message_type_count() > 0 ?\n          file->message_type(0)->name() : \"(none)\");\n}\n\nstring MockCodeGenerator::GetOutputFileContent(\n    const string& generator_name,\n    const string& parameter,\n    const string& file,\n    const string& parsed_file_list,\n    const string& first_message_name) {\n  return strings::Substitute(\"$0: $1, $2, $3, $4\\n\",\n      generator_name, parameter, file,\n      first_message_name, parsed_file_list);\n}\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_MOCK_CODE_GENERATOR_H__\n#define GOOGLE_PROTOBUF_COMPILER_MOCK_CODE_GENERATOR_H__\n\n#include <string>\n#include <google/protobuf/compiler/code_generator.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\n// A mock CodeGenerator, used by command_line_interface_unittest.  This is in\n// its own file so that it can be used both directly and as a plugin.\n//\n// Generate() produces some output which can be checked by ExpectCalled().  The\n// generator can run in a different process (e.g. a plugin).\n//\n// If the parameter is \"insert=NAMES\", the MockCodeGenerator will insert lines\n// into the files generated by other MockCodeGenerators instead of creating\n// its own file.  NAMES is a comma-separated list of the names of those other\n// MockCodeGenerators.\n//\n// MockCodeGenerator will also modify its behavior slightly if the input file\n// contains a message type with one of the following names:\n//   MockCodeGenerator_Error:  Causes Generate() to return false and set the\n//     error message to \"Saw message type MockCodeGenerator_Error.\"\n//   MockCodeGenerator_Exit:  Generate() prints \"Saw message type\n//     MockCodeGenerator_Exit.\" to stderr and then calls exit(123).\n//   MockCodeGenerator_Abort:  Generate() prints \"Saw message type\n//     MockCodeGenerator_Abort.\" to stderr and then calls abort().\nclass MockCodeGenerator : public CodeGenerator {\n public:\n  MockCodeGenerator(const string& name);\n  virtual ~MockCodeGenerator();\n\n  // Expect (via gTest) that a MockCodeGenerator with the given name was called\n  // with the given parameters by inspecting the output location.\n  //\n  // |insertions| is a comma-separated list of names of MockCodeGenerators which\n  // should have inserted lines into this file.\n  // |parsed_file_list| is a comma-separated list of names of the files\n  // that are being compiled together in this run.\n  static void ExpectGenerated(const string& name,\n                              const string& parameter,\n                              const string& insertions,\n                              const string& file,\n                              const string& first_message_name,\n                              const string& parsed_file_list,\n                              const string& output_directory);\n\n  // Get the name of the file which would be written by the given generator.\n  static string GetOutputFileName(const string& generator_name,\n                                  const FileDescriptor* file);\n  static string GetOutputFileName(const string& generator_name,\n                                  const string& file);\n\n  // implements CodeGenerator ----------------------------------------\n\n  virtual bool Generate(const FileDescriptor* file,\n                        const string& parameter,\n                        GeneratorContext* context,\n                        string* error) const;\n\n private:\n  string name_;\n\n  static string GetOutputFileContent(const string& generator_name,\n                                     const string& parameter,\n                                     const FileDescriptor* file,\n                                     GeneratorContext *context);\n  static string GetOutputFileContent(const string& generator_name,\n                                     const string& parameter,\n                                     const string& file,\n                                     const string& parsed_file_list,\n                                     const string& first_message_name);\n};\n\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_MOCK_CODE_GENERATOR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/package_info.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file exists solely to document the google::protobuf::compiler namespace.\n// It is not compiled into anything, but it may be read by an automated\n// documentation generator.\n\nnamespace google {\n\nnamespace protobuf {\n\n// Implementation of the Protocol Buffer compiler.\n//\n// This package contains code for parsing .proto files and generating code\n// based on them.  There are two reasons you might be interested in this\n// package:\n// - You want to parse .proto files at runtime.  In this case, you should\n//   look at importer.h.  Since this functionality is widely useful, it is\n//   included in the libprotobuf base library; you do not have to link against\n//   libprotoc.\n// - You want to write a custom protocol compiler which generates different\n//   kinds of code, e.g. code in a different language which is not supported\n//   by the official compiler.  For this purpose, command_line_interface.h\n//   provides you with a complete compiler front-end, so all you need to do\n//   is write a custom implementation of CodeGenerator and a trivial main()\n//   function.  You can even make your compiler support the official languages\n//   in addition to your own.  Since this functionality is only useful to those\n//   writing custom compilers, it is in a separate library called \"libprotoc\"\n//   which you will have to link against.\nnamespace compiler {}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Recursive descent FTW.\n\n#include <float.h>\n#include <google/protobuf/stubs/hash.h>\n#include <limits>\n\n\n#include <google/protobuf/compiler/parser.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/io/tokenizer.h>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/map-util.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\nusing internal::WireFormat;\n\nnamespace {\n\ntypedef hash_map<string, FieldDescriptorProto::Type> TypeNameMap;\n\nTypeNameMap MakeTypeNameTable() {\n  TypeNameMap result;\n\n  result[\"double\"  ] = FieldDescriptorProto::TYPE_DOUBLE;\n  result[\"float\"   ] = FieldDescriptorProto::TYPE_FLOAT;\n  result[\"uint64\"  ] = FieldDescriptorProto::TYPE_UINT64;\n  result[\"fixed64\" ] = FieldDescriptorProto::TYPE_FIXED64;\n  result[\"fixed32\" ] = FieldDescriptorProto::TYPE_FIXED32;\n  result[\"bool\"    ] = FieldDescriptorProto::TYPE_BOOL;\n  result[\"string\"  ] = FieldDescriptorProto::TYPE_STRING;\n  result[\"group\"   ] = FieldDescriptorProto::TYPE_GROUP;\n\n  result[\"bytes\"   ] = FieldDescriptorProto::TYPE_BYTES;\n  result[\"uint32\"  ] = FieldDescriptorProto::TYPE_UINT32;\n  result[\"sfixed32\"] = FieldDescriptorProto::TYPE_SFIXED32;\n  result[\"sfixed64\"] = FieldDescriptorProto::TYPE_SFIXED64;\n  result[\"int32\"   ] = FieldDescriptorProto::TYPE_INT32;\n  result[\"int64\"   ] = FieldDescriptorProto::TYPE_INT64;\n  result[\"sint32\"  ] = FieldDescriptorProto::TYPE_SINT32;\n  result[\"sint64\"  ] = FieldDescriptorProto::TYPE_SINT64;\n\n  return result;\n}\n\nconst TypeNameMap kTypeNames = MakeTypeNameTable();\n\n}  // anonymous namespace\n\n// Makes code slightly more readable.  The meaning of \"DO(foo)\" is\n// \"Execute foo and fail if it fails.\", where failure is indicated by\n// returning false.\n#define DO(STATEMENT) if (STATEMENT) {} else return false\n\n// ===================================================================\n\nParser::Parser()\n  : input_(NULL),\n    error_collector_(NULL),\n    source_location_table_(NULL),\n    had_errors_(false),\n    require_syntax_identifier_(false),\n    stop_after_syntax_identifier_(false) {\n}\n\nParser::~Parser() {\n}\n\n// ===================================================================\n\ninline bool Parser::LookingAt(const char* text) {\n  return input_->current().text == text;\n}\n\ninline bool Parser::LookingAtType(io::Tokenizer::TokenType token_type) {\n  return input_->current().type == token_type;\n}\n\ninline bool Parser::AtEnd() {\n  return LookingAtType(io::Tokenizer::TYPE_END);\n}\n\nbool Parser::TryConsume(const char* text) {\n  if (LookingAt(text)) {\n    input_->Next();\n    return true;\n  } else {\n    return false;\n  }\n}\n\nbool Parser::Consume(const char* text, const char* error) {\n  if (TryConsume(text)) {\n    return true;\n  } else {\n    AddError(error);\n    return false;\n  }\n}\n\nbool Parser::Consume(const char* text) {\n  if (TryConsume(text)) {\n    return true;\n  } else {\n    AddError(\"Expected \\\"\" + string(text) + \"\\\".\");\n    return false;\n  }\n}\n\nbool Parser::ConsumeIdentifier(string* output, const char* error) {\n  if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) {\n    *output = input_->current().text;\n    input_->Next();\n    return true;\n  } else {\n    AddError(error);\n    return false;\n  }\n}\n\nbool Parser::ConsumeInteger(int* output, const char* error) {\n  if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) {\n    uint64 value = 0;\n    if (!io::Tokenizer::ParseInteger(input_->current().text,\n                                     kint32max, &value)) {\n      AddError(\"Integer out of range.\");\n      // We still return true because we did, in fact, parse an integer.\n    }\n    *output = value;\n    input_->Next();\n    return true;\n  } else {\n    AddError(error);\n    return false;\n  }\n}\n\nbool Parser::ConsumeInteger64(uint64 max_value, uint64* output,\n                              const char* error) {\n  if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) {\n    if (!io::Tokenizer::ParseInteger(input_->current().text, max_value,\n                                     output)) {\n      AddError(\"Integer out of range.\");\n      // We still return true because we did, in fact, parse an integer.\n      *output = 0;\n    }\n    input_->Next();\n    return true;\n  } else {\n    AddError(error);\n    return false;\n  }\n}\n\nbool Parser::ConsumeNumber(double* output, const char* error) {\n  if (LookingAtType(io::Tokenizer::TYPE_FLOAT)) {\n    *output = io::Tokenizer::ParseFloat(input_->current().text);\n    input_->Next();\n    return true;\n  } else if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) {\n    // Also accept integers.\n    uint64 value = 0;\n    if (!io::Tokenizer::ParseInteger(input_->current().text,\n                                     kuint64max, &value)) {\n      AddError(\"Integer out of range.\");\n      // We still return true because we did, in fact, parse a number.\n    }\n    *output = value;\n    input_->Next();\n    return true;\n  } else if (LookingAt(\"inf\")) {\n    *output = numeric_limits<double>::infinity();\n    input_->Next();\n    return true;\n  } else if (LookingAt(\"nan\")) {\n    *output = numeric_limits<double>::quiet_NaN();\n    input_->Next();\n    return true;\n  } else {\n    AddError(error);\n    return false;\n  }\n}\n\nbool Parser::ConsumeString(string* output, const char* error) {\n  if (LookingAtType(io::Tokenizer::TYPE_STRING)) {\n    io::Tokenizer::ParseString(input_->current().text, output);\n    input_->Next();\n    // Allow C++ like concatenation of adjacent string tokens.\n    while (LookingAtType(io::Tokenizer::TYPE_STRING)) {\n      io::Tokenizer::ParseStringAppend(input_->current().text, output);\n      input_->Next();\n    }\n    return true;\n  } else {\n    AddError(error);\n    return false;\n  }\n}\n\n// -------------------------------------------------------------------\n\nvoid Parser::AddError(int line, int column, const string& error) {\n  if (error_collector_ != NULL) {\n    error_collector_->AddError(line, column, error);\n  }\n  had_errors_ = true;\n}\n\nvoid Parser::AddError(const string& error) {\n  AddError(input_->current().line, input_->current().column, error);\n}\n\n// -------------------------------------------------------------------\n\nParser::LocationRecorder::LocationRecorder(Parser* parser)\n  : parser_(parser),\n    location_(parser_->source_code_info_->add_location()) {\n  location_->add_span(parser_->input_->current().line);\n  location_->add_span(parser_->input_->current().column);\n}\n\nParser::LocationRecorder::LocationRecorder(const LocationRecorder& parent) {\n  Init(parent);\n}\n\nParser::LocationRecorder::LocationRecorder(const LocationRecorder& parent,\n                                           int path1) {\n  Init(parent);\n  AddPath(path1);\n}\n\nParser::LocationRecorder::LocationRecorder(const LocationRecorder& parent,\n                                           int path1, int path2) {\n  Init(parent);\n  AddPath(path1);\n  AddPath(path2);\n}\n\nvoid Parser::LocationRecorder::Init(const LocationRecorder& parent) {\n  parser_ = parent.parser_;\n  location_ = parser_->source_code_info_->add_location();\n  location_->mutable_path()->CopyFrom(parent.location_->path());\n\n  location_->add_span(parser_->input_->current().line);\n  location_->add_span(parser_->input_->current().column);\n}\n\nParser::LocationRecorder::~LocationRecorder() {\n  if (location_->span_size() <= 2) {\n    EndAt(parser_->input_->previous());\n  }\n}\n\nvoid Parser::LocationRecorder::AddPath(int path_component) {\n  location_->add_path(path_component);\n}\n\nvoid Parser::LocationRecorder::StartAt(const io::Tokenizer::Token& token) {\n  location_->set_span(0, token.line);\n  location_->set_span(1, token.column);\n}\n\nvoid Parser::LocationRecorder::EndAt(const io::Tokenizer::Token& token) {\n  if (token.line != location_->span(0)) {\n    location_->add_span(token.line);\n  }\n  location_->add_span(token.end_column);\n}\n\nvoid Parser::LocationRecorder::RecordLegacyLocation(const Message* descriptor,\n    DescriptorPool::ErrorCollector::ErrorLocation location) {\n  if (parser_->source_location_table_ != NULL) {\n    parser_->source_location_table_->Add(\n        descriptor, location, location_->span(0), location_->span(1));\n  }\n}\n\n// -------------------------------------------------------------------\n\nvoid Parser::SkipStatement() {\n  while (true) {\n    if (AtEnd()) {\n      return;\n    } else if (LookingAtType(io::Tokenizer::TYPE_SYMBOL)) {\n      if (TryConsume(\";\")) {\n        return;\n      } else if (TryConsume(\"{\")) {\n        SkipRestOfBlock();\n        return;\n      } else if (LookingAt(\"}\")) {\n        return;\n      }\n    }\n    input_->Next();\n  }\n}\n\nvoid Parser::SkipRestOfBlock() {\n  while (true) {\n    if (AtEnd()) {\n      return;\n    } else if (LookingAtType(io::Tokenizer::TYPE_SYMBOL)) {\n      if (TryConsume(\"}\")) {\n        return;\n      } else if (TryConsume(\"{\")) {\n        SkipRestOfBlock();\n      }\n    }\n    input_->Next();\n  }\n}\n\n// ===================================================================\n\nbool Parser::Parse(io::Tokenizer* input, FileDescriptorProto* file) {\n  input_ = input;\n  had_errors_ = false;\n  syntax_identifier_.clear();\n\n  // Note that |file| could be NULL at this point if\n  // stop_after_syntax_identifier_ is true.  So, we conservatively allocate\n  // SourceCodeInfo on the stack, then swap it into the FileDescriptorProto\n  // later on.\n  SourceCodeInfo source_code_info;\n  source_code_info_ = &source_code_info;\n\n  if (LookingAtType(io::Tokenizer::TYPE_START)) {\n    // Advance to first token.\n    input_->Next();\n  }\n\n  {\n    LocationRecorder root_location(this);\n\n    if (require_syntax_identifier_ || LookingAt(\"syntax\")) {\n      if (!ParseSyntaxIdentifier()) {\n        // Don't attempt to parse the file if we didn't recognize the syntax\n        // identifier.\n        return false;\n      }\n    } else if (!stop_after_syntax_identifier_) {\n      syntax_identifier_ = \"proto2\";\n    }\n\n    if (stop_after_syntax_identifier_) return !had_errors_;\n\n    // Repeatedly parse statements until we reach the end of the file.\n    while (!AtEnd()) {\n      if (!ParseTopLevelStatement(file, root_location)) {\n        // This statement failed to parse.  Skip it, but keep looping to parse\n        // other statements.\n        SkipStatement();\n\n        if (LookingAt(\"}\")) {\n          AddError(\"Unmatched \\\"}\\\".\");\n          input_->Next();\n        }\n      }\n    }\n  }\n\n  input_ = NULL;\n  source_code_info_ = NULL;\n  source_code_info.Swap(file->mutable_source_code_info());\n  return !had_errors_;\n}\n\nbool Parser::ParseSyntaxIdentifier() {\n  DO(Consume(\"syntax\", \"File must begin with 'syntax = \\\"proto2\\\";'.\"));\n  DO(Consume(\"=\"));\n  io::Tokenizer::Token syntax_token = input_->current();\n  string syntax;\n  DO(ConsumeString(&syntax, \"Expected syntax identifier.\"));\n  DO(Consume(\";\"));\n\n  syntax_identifier_ = syntax;\n\n  if (syntax != \"proto2\" && !stop_after_syntax_identifier_) {\n    AddError(syntax_token.line, syntax_token.column,\n      \"Unrecognized syntax identifier \\\"\" + syntax + \"\\\".  This parser \"\n      \"only recognizes \\\"proto2\\\".\");\n    return false;\n  }\n\n  return true;\n}\n\nbool Parser::ParseTopLevelStatement(FileDescriptorProto* file,\n                                    const LocationRecorder& root_location) {\n  if (TryConsume(\";\")) {\n    // empty statement; ignore\n    return true;\n  } else if (LookingAt(\"message\")) {\n    LocationRecorder location(root_location,\n      FileDescriptorProto::kMessageTypeFieldNumber, file->message_type_size());\n    return ParseMessageDefinition(file->add_message_type(), location);\n  } else if (LookingAt(\"enum\")) {\n    LocationRecorder location(root_location,\n      FileDescriptorProto::kEnumTypeFieldNumber, file->enum_type_size());\n    return ParseEnumDefinition(file->add_enum_type(), location);\n  } else if (LookingAt(\"service\")) {\n    LocationRecorder location(root_location,\n      FileDescriptorProto::kServiceFieldNumber, file->service_size());\n    return ParseServiceDefinition(file->add_service(), location);\n  } else if (LookingAt(\"extend\")) {\n    LocationRecorder location(root_location,\n        FileDescriptorProto::kExtensionFieldNumber);\n    return ParseExtend(file->mutable_extension(),\n                       file->mutable_message_type(),\n                       root_location,\n                       FileDescriptorProto::kMessageTypeFieldNumber,\n                       location);\n  } else if (LookingAt(\"import\")) {\n    int index = file->dependency_size();\n    return ParseImport(file->add_dependency(), root_location, index);\n  } else if (LookingAt(\"package\")) {\n    return ParsePackage(file, root_location);\n  } else if (LookingAt(\"option\")) {\n    LocationRecorder location(root_location,\n        FileDescriptorProto::kOptionsFieldNumber);\n    return ParseOption(file->mutable_options(), location);\n  } else {\n    AddError(\"Expected top-level statement (e.g. \\\"message\\\").\");\n    return false;\n  }\n}\n\n// -------------------------------------------------------------------\n// Messages\n\nbool Parser::ParseMessageDefinition(DescriptorProto* message,\n                                    const LocationRecorder& message_location) {\n  DO(Consume(\"message\"));\n  {\n    LocationRecorder location(message_location,\n                              DescriptorProto::kNameFieldNumber);\n    location.RecordLegacyLocation(\n        message, DescriptorPool::ErrorCollector::NAME);\n    DO(ConsumeIdentifier(message->mutable_name(), \"Expected message name.\"));\n  }\n  DO(ParseMessageBlock(message, message_location));\n  return true;\n}\n\nbool Parser::ParseMessageBlock(DescriptorProto* message,\n                               const LocationRecorder& message_location) {\n  DO(Consume(\"{\"));\n\n  while (!TryConsume(\"}\")) {\n    if (AtEnd()) {\n      AddError(\"Reached end of input in message definition (missing '}').\");\n      return false;\n    }\n\n    if (!ParseMessageStatement(message, message_location)) {\n      // This statement failed to parse.  Skip it, but keep looping to parse\n      // other statements.\n      SkipStatement();\n    }\n  }\n\n  return true;\n}\n\nbool Parser::ParseMessageStatement(DescriptorProto* message,\n                                   const LocationRecorder& message_location) {\n  if (TryConsume(\";\")) {\n    // empty statement; ignore\n    return true;\n  } else if (LookingAt(\"message\")) {\n    LocationRecorder location(message_location,\n                              DescriptorProto::kNestedTypeFieldNumber,\n                              message->nested_type_size());\n    return ParseMessageDefinition(message->add_nested_type(), location);\n  } else if (LookingAt(\"enum\")) {\n    LocationRecorder location(message_location,\n                              DescriptorProto::kEnumTypeFieldNumber,\n                              message->enum_type_size());\n    return ParseEnumDefinition(message->add_enum_type(), location);\n  } else if (LookingAt(\"extensions\")) {\n    LocationRecorder location(message_location,\n                              DescriptorProto::kExtensionRangeFieldNumber);\n    return ParseExtensions(message, location);\n  } else if (LookingAt(\"extend\")) {\n    LocationRecorder location(message_location,\n                              DescriptorProto::kExtensionFieldNumber);\n    return ParseExtend(message->mutable_extension(),\n                       message->mutable_nested_type(),\n                       message_location,\n                       DescriptorProto::kNestedTypeFieldNumber,\n                       location);\n  } else if (LookingAt(\"option\")) {\n    LocationRecorder location(message_location,\n                              DescriptorProto::kOptionsFieldNumber);\n    return ParseOption(message->mutable_options(), location);\n  } else {\n    LocationRecorder location(message_location,\n                              DescriptorProto::kFieldFieldNumber,\n                              message->field_size());\n    return ParseMessageField(message->add_field(),\n                             message->mutable_nested_type(),\n                             message_location,\n                             DescriptorProto::kNestedTypeFieldNumber,\n                             location);\n  }\n}\n\nbool Parser::ParseMessageField(FieldDescriptorProto* field,\n                               RepeatedPtrField<DescriptorProto>* messages,\n                               const LocationRecorder& parent_location,\n                               int location_field_number_for_nested_type,\n                               const LocationRecorder& field_location) {\n  // Parse label and type.\n  io::Tokenizer::Token label_token = input_->current();\n  {\n    LocationRecorder location(field_location,\n                              FieldDescriptorProto::kLabelFieldNumber);\n    FieldDescriptorProto::Label label;\n    DO(ParseLabel(&label));\n    field->set_label(label);\n  }\n\n  {\n    LocationRecorder location(field_location);  // add path later\n    location.RecordLegacyLocation(field, DescriptorPool::ErrorCollector::TYPE);\n\n    FieldDescriptorProto::Type type = FieldDescriptorProto::TYPE_INT32;\n    string type_name;\n    DO(ParseType(&type, &type_name));\n    if (type_name.empty()) {\n      location.AddPath(FieldDescriptorProto::kTypeFieldNumber);\n      field->set_type(type);\n    } else {\n      location.AddPath(FieldDescriptorProto::kTypeNameFieldNumber);\n      field->set_type_name(type_name);\n    }\n  }\n\n  // Parse name and '='.\n  io::Tokenizer::Token name_token = input_->current();\n  {\n    LocationRecorder location(field_location,\n                              FieldDescriptorProto::kNameFieldNumber);\n    location.RecordLegacyLocation(field, DescriptorPool::ErrorCollector::NAME);\n    DO(ConsumeIdentifier(field->mutable_name(), \"Expected field name.\"));\n  }\n  DO(Consume(\"=\", \"Missing field number.\"));\n\n  // Parse field number.\n  {\n    LocationRecorder location(field_location,\n                              FieldDescriptorProto::kNumberFieldNumber);\n    location.RecordLegacyLocation(\n        field, DescriptorPool::ErrorCollector::NUMBER);\n    int number;\n    DO(ConsumeInteger(&number, \"Expected field number.\"));\n    field->set_number(number);\n  }\n\n  // Parse options.\n  DO(ParseFieldOptions(field, field_location));\n\n  // Deal with groups.\n  if (field->has_type() && field->type() == FieldDescriptorProto::TYPE_GROUP) {\n    // Awkward:  Since a group declares both a message type and a field, we\n    //   have to create overlapping locations.\n    LocationRecorder group_location(parent_location);\n    group_location.StartAt(label_token);\n    group_location.AddPath(location_field_number_for_nested_type);\n    group_location.AddPath(messages->size());\n\n    DescriptorProto* group = messages->Add();\n    group->set_name(field->name());\n\n    // Record name location to match the field name's location.\n    {\n      LocationRecorder location(group_location,\n                                DescriptorProto::kNameFieldNumber);\n      location.StartAt(name_token);\n      location.EndAt(name_token);\n      location.RecordLegacyLocation(\n          group, DescriptorPool::ErrorCollector::NAME);\n    }\n\n    // The field's type_name also comes from the name.  Confusing!\n    {\n      LocationRecorder location(field_location,\n                                FieldDescriptorProto::kTypeNameFieldNumber);\n      location.StartAt(name_token);\n      location.EndAt(name_token);\n    }\n\n    // As a hack for backwards-compatibility, we force the group name to start\n    // with a capital letter and lower-case the field name.  New code should\n    // not use groups; it should use nested messages.\n    if (group->name()[0] < 'A' || 'Z' < group->name()[0]) {\n      AddError(name_token.line, name_token.column,\n        \"Group names must start with a capital letter.\");\n    }\n    LowerString(field->mutable_name());\n\n    field->set_type_name(group->name());\n    if (LookingAt(\"{\")) {\n      DO(ParseMessageBlock(group, group_location));\n    } else {\n      AddError(\"Missing group body.\");\n      return false;\n    }\n  } else {\n    DO(Consume(\";\"));\n  }\n\n  return true;\n}\n\nbool Parser::ParseFieldOptions(FieldDescriptorProto* field,\n                               const LocationRecorder& field_location) {\n  if (!LookingAt(\"[\")) return true;\n\n  LocationRecorder location(field_location,\n                            FieldDescriptorProto::kOptionsFieldNumber);\n\n  DO(Consume(\"[\"));\n\n  // Parse field options.\n  do {\n    if (LookingAt(\"default\")) {\n      // We intentionally pass field_location rather than location here, since\n      // the default value is not actually an option.\n      DO(ParseDefaultAssignment(field, field_location));\n    } else {\n      DO(ParseOptionAssignment(field->mutable_options(), location));\n    }\n  } while (TryConsume(\",\"));\n\n  DO(Consume(\"]\"));\n  return true;\n}\n\nbool Parser::ParseDefaultAssignment(FieldDescriptorProto* field,\n                                    const LocationRecorder& field_location) {\n  if (field->has_default_value()) {\n    AddError(\"Already set option \\\"default\\\".\");\n    field->clear_default_value();\n  }\n\n  DO(Consume(\"default\"));\n  DO(Consume(\"=\"));\n\n  LocationRecorder location(field_location,\n                            FieldDescriptorProto::kDefaultValueFieldNumber);\n  location.RecordLegacyLocation(\n      field, DescriptorPool::ErrorCollector::DEFAULT_VALUE);\n  string* default_value = field->mutable_default_value();\n\n  if (!field->has_type()) {\n    // The field has a type name, but we don't know if it is a message or an\n    // enum yet.  Assume an enum for now.\n    DO(ConsumeIdentifier(default_value, \"Expected identifier.\"));\n    return true;\n  }\n\n  switch (field->type()) {\n    case FieldDescriptorProto::TYPE_INT32:\n    case FieldDescriptorProto::TYPE_INT64:\n    case FieldDescriptorProto::TYPE_SINT32:\n    case FieldDescriptorProto::TYPE_SINT64:\n    case FieldDescriptorProto::TYPE_SFIXED32:\n    case FieldDescriptorProto::TYPE_SFIXED64: {\n      uint64 max_value = kint64max;\n      if (field->type() == FieldDescriptorProto::TYPE_INT32 ||\n          field->type() == FieldDescriptorProto::TYPE_SINT32 ||\n          field->type() == FieldDescriptorProto::TYPE_SFIXED32) {\n        max_value = kint32max;\n      }\n\n      // These types can be negative.\n      if (TryConsume(\"-\")) {\n        default_value->append(\"-\");\n        // Two's complement always has one more negative value than positive.\n        ++max_value;\n      }\n      // Parse the integer to verify that it is not out-of-range.\n      uint64 value;\n      DO(ConsumeInteger64(max_value, &value, \"Expected integer.\"));\n      // And stringify it again.\n      default_value->append(SimpleItoa(value));\n      break;\n    }\n\n    case FieldDescriptorProto::TYPE_UINT32:\n    case FieldDescriptorProto::TYPE_UINT64:\n    case FieldDescriptorProto::TYPE_FIXED32:\n    case FieldDescriptorProto::TYPE_FIXED64: {\n      uint64 max_value = kuint64max;\n      if (field->type() == FieldDescriptorProto::TYPE_UINT32 ||\n          field->type() == FieldDescriptorProto::TYPE_FIXED32) {\n        max_value = kuint32max;\n      }\n\n      // Numeric, not negative.\n      if (TryConsume(\"-\")) {\n        AddError(\"Unsigned field can't have negative default value.\");\n      }\n      // Parse the integer to verify that it is not out-of-range.\n      uint64 value;\n      DO(ConsumeInteger64(max_value, &value, \"Expected integer.\"));\n      // And stringify it again.\n      default_value->append(SimpleItoa(value));\n      break;\n    }\n\n    case FieldDescriptorProto::TYPE_FLOAT:\n    case FieldDescriptorProto::TYPE_DOUBLE:\n      // These types can be negative.\n      if (TryConsume(\"-\")) {\n        default_value->append(\"-\");\n      }\n      // Parse the integer because we have to convert hex integers to decimal\n      // floats.\n      double value;\n      DO(ConsumeNumber(&value, \"Expected number.\"));\n      // And stringify it again.\n      default_value->append(SimpleDtoa(value));\n      break;\n\n    case FieldDescriptorProto::TYPE_BOOL:\n      if (TryConsume(\"true\")) {\n        default_value->assign(\"true\");\n      } else if (TryConsume(\"false\")) {\n        default_value->assign(\"false\");\n      } else {\n        AddError(\"Expected \\\"true\\\" or \\\"false\\\".\");\n        return false;\n      }\n      break;\n\n    case FieldDescriptorProto::TYPE_STRING:\n      DO(ConsumeString(default_value, \"Expected string.\"));\n      break;\n\n    case FieldDescriptorProto::TYPE_BYTES:\n      DO(ConsumeString(default_value, \"Expected string.\"));\n      *default_value = CEscape(*default_value);\n      break;\n\n    case FieldDescriptorProto::TYPE_ENUM:\n      DO(ConsumeIdentifier(default_value, \"Expected identifier.\"));\n      break;\n\n    case FieldDescriptorProto::TYPE_MESSAGE:\n    case FieldDescriptorProto::TYPE_GROUP:\n      AddError(\"Messages can't have default values.\");\n      return false;\n  }\n\n  return true;\n}\n\nbool Parser::ParseOptionNamePart(UninterpretedOption* uninterpreted_option,\n                                 const LocationRecorder& part_location) {\n  UninterpretedOption::NamePart* name = uninterpreted_option->add_name();\n  string identifier;  // We parse identifiers into this string.\n  if (LookingAt(\"(\")) {  // This is an extension.\n    DO(Consume(\"(\"));\n\n    {\n      LocationRecorder location(\n          part_location, UninterpretedOption::NamePart::kNamePartFieldNumber);\n      // An extension name consists of dot-separated identifiers, and may begin\n      // with a dot.\n      if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) {\n        DO(ConsumeIdentifier(&identifier, \"Expected identifier.\"));\n        name->mutable_name_part()->append(identifier);\n      }\n      while (LookingAt(\".\")) {\n        DO(Consume(\".\"));\n        name->mutable_name_part()->append(\".\");\n        DO(ConsumeIdentifier(&identifier, \"Expected identifier.\"));\n        name->mutable_name_part()->append(identifier);\n      }\n    }\n\n    DO(Consume(\")\"));\n    name->set_is_extension(true);\n  } else {  // This is a regular field.\n    LocationRecorder location(\n        part_location, UninterpretedOption::NamePart::kNamePartFieldNumber);\n    DO(ConsumeIdentifier(&identifier, \"Expected identifier.\"));\n    name->mutable_name_part()->append(identifier);\n    name->set_is_extension(false);\n  }\n  return true;\n}\n\nbool Parser::ParseUninterpretedBlock(string* value) {\n  // Note that enclosing braces are not added to *value.\n  DO(Consume(\"{\"));\n  int brace_depth = 1;\n  while (!AtEnd()) {\n    if (LookingAt(\"{\")) {\n      brace_depth++;\n    } else if (LookingAt(\"}\")) {\n      brace_depth--;\n      if (brace_depth == 0) {\n        input_->Next();\n        return true;\n      }\n    }\n    // TODO(sanjay): Interpret line/column numbers to preserve formatting\n    if (!value->empty()) value->push_back(' ');\n    value->append(input_->current().text);\n    input_->Next();\n  }\n  AddError(\"Unexpected end of stream while parsing aggregate value.\");\n  return false;\n}\n\n// We don't interpret the option here. Instead we store it in an\n// UninterpretedOption, to be interpreted later.\nbool Parser::ParseOptionAssignment(Message* options,\n                                   const LocationRecorder& options_location) {\n  // Create an entry in the uninterpreted_option field.\n  const FieldDescriptor* uninterpreted_option_field = options->GetDescriptor()->\n      FindFieldByName(\"uninterpreted_option\");\n  GOOGLE_CHECK(uninterpreted_option_field != NULL)\n      << \"No field named \\\"uninterpreted_option\\\" in the Options proto.\";\n\n  const Reflection* reflection = options->GetReflection();\n\n  LocationRecorder location(\n      options_location, uninterpreted_option_field->number(),\n      reflection->FieldSize(*options, uninterpreted_option_field));\n\n  UninterpretedOption* uninterpreted_option = down_cast<UninterpretedOption*>(\n      options->GetReflection()->AddMessage(options,\n                                           uninterpreted_option_field));\n\n  // Parse dot-separated name.\n  {\n    LocationRecorder name_location(location,\n                                   UninterpretedOption::kNameFieldNumber);\n    name_location.RecordLegacyLocation(\n        uninterpreted_option, DescriptorPool::ErrorCollector::OPTION_NAME);\n\n    {\n      LocationRecorder part_location(name_location,\n                                     uninterpreted_option->name_size());\n      DO(ParseOptionNamePart(uninterpreted_option, part_location));\n    }\n\n    while (LookingAt(\".\")) {\n      DO(Consume(\".\"));\n      LocationRecorder part_location(name_location,\n                                     uninterpreted_option->name_size());\n      DO(ParseOptionNamePart(uninterpreted_option, part_location));\n    }\n  }\n\n  DO(Consume(\"=\"));\n\n  LocationRecorder value_location(location);\n  value_location.RecordLegacyLocation(\n      uninterpreted_option, DescriptorPool::ErrorCollector::OPTION_VALUE);\n\n  // All values are a single token, except for negative numbers, which consist\n  // of a single '-' symbol, followed by a positive number.\n  bool is_negative = TryConsume(\"-\");\n\n  switch (input_->current().type) {\n    case io::Tokenizer::TYPE_START:\n      GOOGLE_LOG(FATAL) << \"Trying to read value before any tokens have been read.\";\n      return false;\n\n    case io::Tokenizer::TYPE_END:\n      AddError(\"Unexpected end of stream while parsing option value.\");\n      return false;\n\n    case io::Tokenizer::TYPE_IDENTIFIER: {\n      value_location.AddPath(UninterpretedOption::kIdentifierValueFieldNumber);\n      if (is_negative) {\n        AddError(\"Invalid '-' symbol before identifier.\");\n        return false;\n      }\n      string value;\n      DO(ConsumeIdentifier(&value, \"Expected identifier.\"));\n      uninterpreted_option->set_identifier_value(value);\n      break;\n    }\n\n    case io::Tokenizer::TYPE_INTEGER: {\n      uint64 value;\n      uint64 max_value =\n          is_negative ? static_cast<uint64>(kint64max) + 1 : kuint64max;\n      DO(ConsumeInteger64(max_value, &value, \"Expected integer.\"));\n      if (is_negative) {\n        value_location.AddPath(\n            UninterpretedOption::kNegativeIntValueFieldNumber);\n        uninterpreted_option->set_negative_int_value(-static_cast<int64>(value));\n      } else {\n        value_location.AddPath(\n            UninterpretedOption::kPositiveIntValueFieldNumber);\n        uninterpreted_option->set_positive_int_value(value);\n      }\n      break;\n    }\n\n    case io::Tokenizer::TYPE_FLOAT: {\n      value_location.AddPath(UninterpretedOption::kDoubleValueFieldNumber);\n      double value;\n      DO(ConsumeNumber(&value, \"Expected number.\"));\n      uninterpreted_option->set_double_value(is_negative ? -value : value);\n      break;\n    }\n\n    case io::Tokenizer::TYPE_STRING: {\n      value_location.AddPath(UninterpretedOption::kStringValueFieldNumber);\n      if (is_negative) {\n        AddError(\"Invalid '-' symbol before string.\");\n        return false;\n      }\n      string value;\n      DO(ConsumeString(&value, \"Expected string.\"));\n      uninterpreted_option->set_string_value(value);\n      break;\n    }\n\n    case io::Tokenizer::TYPE_SYMBOL:\n      if (LookingAt(\"{\")) {\n        value_location.AddPath(UninterpretedOption::kAggregateValueFieldNumber);\n        DO(ParseUninterpretedBlock(\n            uninterpreted_option->mutable_aggregate_value()));\n      } else {\n        AddError(\"Expected option value.\");\n        return false;\n      }\n      break;\n  }\n\n  return true;\n}\n\nbool Parser::ParseExtensions(DescriptorProto* message,\n                             const LocationRecorder& extensions_location) {\n  // Parse the declaration.\n  DO(Consume(\"extensions\"));\n\n  do {\n    // Note that kExtensionRangeFieldNumber was already pushed by the parent.\n    LocationRecorder location(extensions_location,\n                              message->extension_range_size());\n\n    DescriptorProto::ExtensionRange* range = message->add_extension_range();\n    location.RecordLegacyLocation(\n        range, DescriptorPool::ErrorCollector::NUMBER);\n\n    int start, end;\n    io::Tokenizer::Token start_token;\n\n    {\n      LocationRecorder start_location(\n          location, DescriptorProto::ExtensionRange::kStartFieldNumber);\n      start_token = input_->current();\n      DO(ConsumeInteger(&start, \"Expected field number range.\"));\n    }\n\n    if (TryConsume(\"to\")) {\n      LocationRecorder end_location(\n          location, DescriptorProto::ExtensionRange::kEndFieldNumber);\n      if (TryConsume(\"max\")) {\n        end = FieldDescriptor::kMaxNumber;\n      } else {\n        DO(ConsumeInteger(&end, \"Expected integer.\"));\n      }\n    } else {\n      LocationRecorder end_location(\n          location, DescriptorProto::ExtensionRange::kEndFieldNumber);\n      end_location.StartAt(start_token);\n      end_location.EndAt(start_token);\n      end = start;\n    }\n\n    // Users like to specify inclusive ranges, but in code we like the end\n    // number to be exclusive.\n    ++end;\n\n    range->set_start(start);\n    range->set_end(end);\n  } while (TryConsume(\",\"));\n\n  DO(Consume(\";\"));\n  return true;\n}\n\nbool Parser::ParseExtend(RepeatedPtrField<FieldDescriptorProto>* extensions,\n                         RepeatedPtrField<DescriptorProto>* messages,\n                         const LocationRecorder& parent_location,\n                         int location_field_number_for_nested_type,\n                         const LocationRecorder& extend_location) {\n  DO(Consume(\"extend\"));\n\n  // Parse the extendee type.\n  io::Tokenizer::Token extendee_start = input_->current();\n  string extendee;\n  DO(ParseUserDefinedType(&extendee));\n  io::Tokenizer::Token extendee_end = input_->previous();\n\n  // Parse the block.\n  DO(Consume(\"{\"));\n\n  bool is_first = true;\n\n  do {\n    if (AtEnd()) {\n      AddError(\"Reached end of input in extend definition (missing '}').\");\n      return false;\n    }\n\n    // Note that kExtensionFieldNumber was already pushed by the parent.\n    LocationRecorder location(extend_location, extensions->size());\n\n    FieldDescriptorProto* field = extensions->Add();\n\n    {\n      LocationRecorder extendee_location(\n          location, FieldDescriptorProto::kExtendeeFieldNumber);\n      extendee_location.StartAt(extendee_start);\n      extendee_location.EndAt(extendee_end);\n\n      if (is_first) {\n        extendee_location.RecordLegacyLocation(\n            field, DescriptorPool::ErrorCollector::EXTENDEE);\n        is_first = false;\n      }\n    }\n\n    field->set_extendee(extendee);\n\n    if (!ParseMessageField(field, messages, parent_location,\n                           location_field_number_for_nested_type,\n                           location)) {\n      // This statement failed to parse.  Skip it, but keep looping to parse\n      // other statements.\n      SkipStatement();\n    }\n  } while(!TryConsume(\"}\"));\n\n  return true;\n}\n\n// -------------------------------------------------------------------\n// Enums\n\nbool Parser::ParseEnumDefinition(EnumDescriptorProto* enum_type,\n                                 const LocationRecorder& enum_location) {\n  DO(Consume(\"enum\"));\n\n  {\n    LocationRecorder location(enum_location,\n                              EnumDescriptorProto::kNameFieldNumber);\n    location.RecordLegacyLocation(\n        enum_type, DescriptorPool::ErrorCollector::NAME);\n    DO(ConsumeIdentifier(enum_type->mutable_name(), \"Expected enum name.\"));\n  }\n\n  DO(ParseEnumBlock(enum_type, enum_location));\n  return true;\n}\n\nbool Parser::ParseEnumBlock(EnumDescriptorProto* enum_type,\n                            const LocationRecorder& enum_location) {\n  DO(Consume(\"{\"));\n\n  while (!TryConsume(\"}\")) {\n    if (AtEnd()) {\n      AddError(\"Reached end of input in enum definition (missing '}').\");\n      return false;\n    }\n\n    if (!ParseEnumStatement(enum_type, enum_location)) {\n      // This statement failed to parse.  Skip it, but keep looping to parse\n      // other statements.\n      SkipStatement();\n    }\n  }\n\n  return true;\n}\n\nbool Parser::ParseEnumStatement(EnumDescriptorProto* enum_type,\n                                const LocationRecorder& enum_location) {\n  if (TryConsume(\";\")) {\n    // empty statement; ignore\n    return true;\n  } else if (LookingAt(\"option\")) {\n    LocationRecorder location(enum_location,\n                              EnumDescriptorProto::kOptionsFieldNumber);\n    return ParseOption(enum_type->mutable_options(), location);\n  } else {\n    LocationRecorder location(enum_location,\n        EnumDescriptorProto::kValueFieldNumber, enum_type->value_size());\n    return ParseEnumConstant(enum_type->add_value(), location);\n  }\n}\n\nbool Parser::ParseEnumConstant(EnumValueDescriptorProto* enum_value,\n                               const LocationRecorder& enum_value_location) {\n  // Parse name.\n  {\n    LocationRecorder location(enum_value_location,\n                              EnumValueDescriptorProto::kNameFieldNumber);\n    location.RecordLegacyLocation(\n        enum_value, DescriptorPool::ErrorCollector::NAME);\n    DO(ConsumeIdentifier(enum_value->mutable_name(),\n                         \"Expected enum constant name.\"));\n  }\n\n  DO(Consume(\"=\", \"Missing numeric value for enum constant.\"));\n\n  // Parse value.\n  {\n    LocationRecorder location(\n        enum_value_location, EnumValueDescriptorProto::kNumberFieldNumber);\n    location.RecordLegacyLocation(\n        enum_value, DescriptorPool::ErrorCollector::NUMBER);\n\n    bool is_negative = TryConsume(\"-\");\n    int number;\n    DO(ConsumeInteger(&number, \"Expected integer.\"));\n    if (is_negative) number *= -1;\n    enum_value->set_number(number);\n  }\n\n  DO(ParseEnumConstantOptions(enum_value, enum_value_location));\n\n  DO(Consume(\";\"));\n\n  return true;\n}\n\nbool Parser::ParseEnumConstantOptions(\n    EnumValueDescriptorProto* value,\n    const LocationRecorder& enum_value_location) {\n  if (!LookingAt(\"[\")) return true;\n\n  LocationRecorder location(\n      enum_value_location, EnumValueDescriptorProto::kOptionsFieldNumber);\n\n  DO(Consume(\"[\"));\n\n  do {\n    DO(ParseOptionAssignment(value->mutable_options(), location));\n  } while (TryConsume(\",\"));\n\n  DO(Consume(\"]\"));\n  return true;\n}\n\n// -------------------------------------------------------------------\n// Services\n\nbool Parser::ParseServiceDefinition(ServiceDescriptorProto* service,\n                                    const LocationRecorder& service_location) {\n  DO(Consume(\"service\"));\n\n  {\n    LocationRecorder location(service_location,\n                              ServiceDescriptorProto::kNameFieldNumber);\n    location.RecordLegacyLocation(\n        service, DescriptorPool::ErrorCollector::NAME);\n    DO(ConsumeIdentifier(service->mutable_name(), \"Expected service name.\"));\n  }\n\n  DO(ParseServiceBlock(service, service_location));\n  return true;\n}\n\nbool Parser::ParseServiceBlock(ServiceDescriptorProto* service,\n                               const LocationRecorder& service_location) {\n  DO(Consume(\"{\"));\n\n  while (!TryConsume(\"}\")) {\n    if (AtEnd()) {\n      AddError(\"Reached end of input in service definition (missing '}').\");\n      return false;\n    }\n\n    if (!ParseServiceStatement(service, service_location)) {\n      // This statement failed to parse.  Skip it, but keep looping to parse\n      // other statements.\n      SkipStatement();\n    }\n  }\n\n  return true;\n}\n\nbool Parser::ParseServiceStatement(ServiceDescriptorProto* service,\n                                   const LocationRecorder& service_location) {\n  if (TryConsume(\";\")) {\n    // empty statement; ignore\n    return true;\n  } else if (LookingAt(\"option\")) {\n    LocationRecorder location(\n        service_location, ServiceDescriptorProto::kOptionsFieldNumber);\n    return ParseOption(service->mutable_options(), location);\n  } else {\n    LocationRecorder location(service_location,\n        ServiceDescriptorProto::kMethodFieldNumber, service->method_size());\n    return ParseServiceMethod(service->add_method(), location);\n  }\n}\n\nbool Parser::ParseServiceMethod(MethodDescriptorProto* method,\n                                const LocationRecorder& method_location) {\n  DO(Consume(\"rpc\"));\n\n  {\n    LocationRecorder location(method_location,\n                              MethodDescriptorProto::kNameFieldNumber);\n    location.RecordLegacyLocation(\n        method, DescriptorPool::ErrorCollector::NAME);\n    DO(ConsumeIdentifier(method->mutable_name(), \"Expected method name.\"));\n  }\n\n  // Parse input type.\n  DO(Consume(\"(\"));\n  {\n    LocationRecorder location(method_location,\n                              MethodDescriptorProto::kInputTypeFieldNumber);\n    location.RecordLegacyLocation(\n        method, DescriptorPool::ErrorCollector::INPUT_TYPE);\n    DO(ParseUserDefinedType(method->mutable_input_type()));\n  }\n  DO(Consume(\")\"));\n\n  // Parse output type.\n  DO(Consume(\"returns\"));\n  DO(Consume(\"(\"));\n  {\n    LocationRecorder location(method_location,\n                              MethodDescriptorProto::kOutputTypeFieldNumber);\n    location.RecordLegacyLocation(\n        method, DescriptorPool::ErrorCollector::OUTPUT_TYPE);\n    DO(ParseUserDefinedType(method->mutable_output_type()));\n  }\n  DO(Consume(\")\"));\n\n  if (TryConsume(\"{\")) {\n    // Options!\n    while (!TryConsume(\"}\")) {\n      if (AtEnd()) {\n        AddError(\"Reached end of input in method options (missing '}').\");\n        return false;\n      }\n\n      if (TryConsume(\";\")) {\n        // empty statement; ignore\n      } else {\n        LocationRecorder location(method_location,\n                                  MethodDescriptorProto::kOptionsFieldNumber);\n        if (!ParseOption(method->mutable_options(), location)) {\n          // This statement failed to parse.  Skip it, but keep looping to\n          // parse other statements.\n          SkipStatement();\n        }\n      }\n    }\n  } else {\n    DO(Consume(\";\"));\n  }\n\n  return true;\n}\n\n// -------------------------------------------------------------------\n\nbool Parser::ParseLabel(FieldDescriptorProto::Label* label) {\n  if (TryConsume(\"optional\")) {\n    *label = FieldDescriptorProto::LABEL_OPTIONAL;\n    return true;\n  } else if (TryConsume(\"repeated\")) {\n    *label = FieldDescriptorProto::LABEL_REPEATED;\n    return true;\n  } else if (TryConsume(\"required\")) {\n    *label = FieldDescriptorProto::LABEL_REQUIRED;\n    return true;\n  } else {\n    AddError(\"Expected \\\"required\\\", \\\"optional\\\", or \\\"repeated\\\".\");\n    // We can actually reasonably recover here by just assuming the user\n    // forgot the label altogether.\n    *label = FieldDescriptorProto::LABEL_OPTIONAL;\n    return true;\n  }\n}\n\nbool Parser::ParseType(FieldDescriptorProto::Type* type,\n                       string* type_name) {\n  TypeNameMap::const_iterator iter = kTypeNames.find(input_->current().text);\n  if (iter != kTypeNames.end()) {\n    *type = iter->second;\n    input_->Next();\n  } else {\n    DO(ParseUserDefinedType(type_name));\n  }\n  return true;\n}\n\nbool Parser::ParseUserDefinedType(string* type_name) {\n  type_name->clear();\n\n  TypeNameMap::const_iterator iter = kTypeNames.find(input_->current().text);\n  if (iter != kTypeNames.end()) {\n    // Note:  The only place enum types are allowed is for field types, but\n    //   if we are parsing a field type then we would not get here because\n    //   primitives are allowed there as well.  So this error message doesn't\n    //   need to account for enums.\n    AddError(\"Expected message type.\");\n\n    // Pretend to accept this type so that we can go on parsing.\n    *type_name = input_->current().text;\n    input_->Next();\n    return true;\n  }\n\n  // A leading \".\" means the name is fully-qualified.\n  if (TryConsume(\".\")) type_name->append(\".\");\n\n  // Consume the first part of the name.\n  string identifier;\n  DO(ConsumeIdentifier(&identifier, \"Expected type name.\"));\n  type_name->append(identifier);\n\n  // Consume more parts.\n  while (TryConsume(\".\")) {\n    type_name->append(\".\");\n    DO(ConsumeIdentifier(&identifier, \"Expected identifier.\"));\n    type_name->append(identifier);\n  }\n\n  return true;\n}\n\n// ===================================================================\n\nbool Parser::ParsePackage(FileDescriptorProto* file,\n                          const LocationRecorder& root_location) {\n  if (file->has_package()) {\n    AddError(\"Multiple package definitions.\");\n    // Don't append the new package to the old one.  Just replace it.  Not\n    // that it really matters since this is an error anyway.\n    file->clear_package();\n  }\n\n  DO(Consume(\"package\"));\n\n  {\n    LocationRecorder location(root_location,\n                              FileDescriptorProto::kPackageFieldNumber);\n    location.RecordLegacyLocation(file, DescriptorPool::ErrorCollector::NAME);\n\n    while (true) {\n      string identifier;\n      DO(ConsumeIdentifier(&identifier, \"Expected identifier.\"));\n      file->mutable_package()->append(identifier);\n      if (!TryConsume(\".\")) break;\n      file->mutable_package()->append(\".\");\n    }\n  }\n\n  DO(Consume(\";\"));\n  return true;\n}\n\nbool Parser::ParseImport(string* import_filename,\n                         const LocationRecorder& root_location,\n                         int index) {\n  DO(Consume(\"import\"));\n  {\n    LocationRecorder location(root_location,\n                              FileDescriptorProto::kDependencyFieldNumber,\n                              index);\n    DO(ConsumeString(import_filename,\n      \"Expected a string naming the file to import.\"));\n  }\n  DO(Consume(\";\"));\n  return true;\n}\n\nbool Parser::ParseOption(Message* options,\n                         const LocationRecorder& options_location) {\n  DO(Consume(\"option\"));\n  DO(ParseOptionAssignment(options, options_location));\n  DO(Consume(\";\"));\n  return true;\n}\n\n// ===================================================================\n\nSourceLocationTable::SourceLocationTable() {}\nSourceLocationTable::~SourceLocationTable() {}\n\nbool SourceLocationTable::Find(\n    const Message* descriptor,\n    DescriptorPool::ErrorCollector::ErrorLocation location,\n    int* line, int* column) const {\n  const pair<int, int>* result =\n    FindOrNull(location_map_, make_pair(descriptor, location));\n  if (result == NULL) {\n    *line   = -1;\n    *column = 0;\n    return false;\n  } else {\n    *line   = result->first;\n    *column = result->second;\n    return true;\n  }\n}\n\nvoid SourceLocationTable::Add(\n    const Message* descriptor,\n    DescriptorPool::ErrorCollector::ErrorLocation location,\n    int line, int column) {\n  location_map_[make_pair(descriptor, location)] = make_pair(line, column);\n}\n\nvoid SourceLocationTable::Clear() {\n  location_map_.clear();\n}\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Implements parsing of .proto files to FileDescriptorProtos.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_PARSER_H__\n#define GOOGLE_PROTOBUF_COMPILER_PARSER_H__\n\n#include <map>\n#include <string>\n#include <utility>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/repeated_field.h>\n#include <google/protobuf/io/tokenizer.h>\n\nnamespace google {\nnamespace protobuf { class Message; }\n\nnamespace protobuf {\nnamespace compiler {\n\n// Defined in this file.\nclass Parser;\nclass SourceLocationTable;\n\n// Implements parsing of protocol definitions (such as .proto files).\n//\n// Note that most users will be more interested in the Importer class.\n// Parser is a lower-level class which simply converts a single .proto file\n// to a FileDescriptorProto.  It does not resolve import directives or perform\n// many other kinds of validation needed to construct a complete\n// FileDescriptor.\nclass LIBPROTOBUF_EXPORT Parser {\n public:\n  Parser();\n  ~Parser();\n\n  // Parse the entire input and construct a FileDescriptorProto representing\n  // it.  Returns true if no errors occurred, false otherwise.\n  bool Parse(io::Tokenizer* input, FileDescriptorProto* file);\n\n  // Optional fetaures:\n\n  // DEPRECATED:  New code should use the SourceCodeInfo embedded in the\n  //   FileDescriptorProto.\n  //\n  // Requests that locations of certain definitions be recorded to the given\n  // SourceLocationTable while parsing.  This can be used to look up exact line\n  // and column numbers for errors reported by DescriptorPool during validation.\n  // Set to NULL (the default) to discard source location information.\n  void RecordSourceLocationsTo(SourceLocationTable* location_table) {\n    source_location_table_ = location_table;\n  }\n\n  // Requests that errors be recorded to the given ErrorCollector while\n  // parsing.  Set to NULL (the default) to discard error messages.\n  void RecordErrorsTo(io::ErrorCollector* error_collector) {\n    error_collector_ = error_collector;\n  }\n\n  // Returns the identifier used in the \"syntax = \" declaration, if one was\n  // seen during the last call to Parse(), or the empty string otherwise.\n  const string& GetSyntaxIdentifier() { return syntax_identifier_; }\n\n  // If set true, input files will be required to begin with a syntax\n  // identifier.  Otherwise, files may omit this.  If a syntax identifier\n  // is provided, it must be 'syntax = \"proto2\";' and must appear at the\n  // top of this file regardless of whether or not it was required.\n  void SetRequireSyntaxIdentifier(bool value) {\n    require_syntax_identifier_ = value;\n  }\n\n  // Call SetStopAfterSyntaxIdentifier(true) to tell the parser to stop\n  // parsing as soon as it has seen the syntax identifier, or lack thereof.\n  // This is useful for quickly identifying the syntax of the file without\n  // parsing the whole thing.  If this is enabled, no error will be recorded\n  // if the syntax identifier is something other than \"proto2\" (since\n  // presumably the caller intends to deal with that), but other kinds of\n  // errors (e.g. parse errors) will still be reported.  When this is enabled,\n  // you may pass a NULL FileDescriptorProto to Parse().\n  void SetStopAfterSyntaxIdentifier(bool value) {\n    stop_after_syntax_identifier_ = value;\n  }\n\n private:\n  // =================================================================\n  // Error recovery helpers\n\n  // Consume the rest of the current statement.  This consumes tokens\n  // until it sees one of:\n  //   ';'  Consumes the token and returns.\n  //   '{'  Consumes the brace then calls SkipRestOfBlock().\n  //   '}'  Returns without consuming.\n  //   EOF  Returns (can't consume).\n  // The Parser often calls SkipStatement() after encountering a syntax\n  // error.  This allows it to go on parsing the following lines, allowing\n  // it to report more than just one error in the file.\n  void SkipStatement();\n\n  // Consume the rest of the current block, including nested blocks,\n  // ending after the closing '}' is encountered and consumed, or at EOF.\n  void SkipRestOfBlock();\n\n  // -----------------------------------------------------------------\n  // Single-token consuming helpers\n  //\n  // These make parsing code more readable.\n\n  // True if the current token is TYPE_END.\n  inline bool AtEnd();\n\n  // True if the next token matches the given text.\n  inline bool LookingAt(const char* text);\n  // True if the next token is of the given type.\n  inline bool LookingAtType(io::Tokenizer::TokenType token_type);\n\n  // If the next token exactly matches the text given, consume it and return\n  // true.  Otherwise, return false without logging an error.\n  bool TryConsume(const char* text);\n\n  // These attempt to read some kind of token from the input.  If successful,\n  // they return true.  Otherwise they return false and add the given error\n  // to the error list.\n\n  // Consume a token with the exact text given.\n  bool Consume(const char* text, const char* error);\n  // Same as above, but automatically generates the error \"Expected \\\"text\\\".\",\n  // where \"text\" is the expected token text.\n  bool Consume(const char* text);\n  // Consume a token of type IDENTIFIER and store its text in \"output\".\n  bool ConsumeIdentifier(string* output, const char* error);\n  // Consume an integer and store its value in \"output\".\n  bool ConsumeInteger(int* output, const char* error);\n  // Consume a 64-bit integer and store its value in \"output\".  If the value\n  // is greater than max_value, an error will be reported.\n  bool ConsumeInteger64(uint64 max_value, uint64* output, const char* error);\n  // Consume a number and store its value in \"output\".  This will accept\n  // tokens of either INTEGER or FLOAT type.\n  bool ConsumeNumber(double* output, const char* error);\n  // Consume a string literal and store its (unescaped) value in \"output\".\n  bool ConsumeString(string* output, const char* error);\n\n  // -----------------------------------------------------------------\n  // Error logging helpers\n\n  // Invokes error_collector_->AddError(), if error_collector_ is not NULL.\n  void AddError(int line, int column, const string& error);\n\n  // Invokes error_collector_->AddError() with the line and column number\n  // of the current token.\n  void AddError(const string& error);\n\n  // Records a location in the SourceCodeInfo.location table (see\n  // descriptor.proto).  We use RAII to ensure that the start and end locations\n  // are recorded -- the constructor records the start location and the\n  // destructor records the end location.  Since the parser is\n  // recursive-descent, this works out beautifully.\n  class LIBPROTOBUF_EXPORT LocationRecorder {\n   public:\n    // Construct the file's \"root\" location.\n    LocationRecorder(Parser* parser);\n\n    // Construct a location that represents a declaration nested within the\n    // given parent.  E.g. a field's location is nested within the location\n    // for a message type.  The parent's path will be copied, so you should\n    // call AddPath() only to add the path components leading from the parent\n    // to the child (as opposed to leading from the root to the child).\n    LocationRecorder(const LocationRecorder& parent);\n\n    // Convenience constructors that call AddPath() one or two times.\n    LocationRecorder(const LocationRecorder& parent, int path1);\n    LocationRecorder(const LocationRecorder& parent, int path1, int path2);\n\n    ~LocationRecorder();\n\n    // Add a path component.  See SourceCodeInfo.Location.path in\n    // descriptor.proto.\n    void AddPath(int path_component);\n\n    // By default the location is considered to start at the current token at\n    // the time the LocationRecorder is created.  StartAt() sets the start\n    // location to the given token instead.\n    void StartAt(const io::Tokenizer::Token& token);\n\n    // By default the location is considered to end at the previous token at\n    // the time the LocationRecorder is destroyed.  EndAt() sets the end\n    // location to the given token instead.\n    void EndAt(const io::Tokenizer::Token& token);\n\n    // Records the start point of this location to the SourceLocationTable that\n    // was passed to RecordSourceLocationsTo(), if any.  SourceLocationTable\n    // is an older way of keeping track of source locations which is still\n    // used in some places.\n    void RecordLegacyLocation(const Message* descriptor,\n        DescriptorPool::ErrorCollector::ErrorLocation location);\n\n   private:\n    Parser* parser_;\n    SourceCodeInfo::Location* location_;\n\n    void Init(const LocationRecorder& parent);\n  };\n\n  // =================================================================\n  // Parsers for various language constructs\n\n  // Parses the \"syntax = \\\"proto2\\\";\" line at the top of the file.  Returns\n  // false if it failed to parse or if the syntax identifier was not\n  // recognized.\n  bool ParseSyntaxIdentifier();\n\n  // These methods parse various individual bits of code.  They return\n  // false if they completely fail to parse the construct.  In this case,\n  // it is probably necessary to skip the rest of the statement to recover.\n  // However, if these methods return true, it does NOT mean that there\n  // were no errors; only that there were no *syntax* errors.  For instance,\n  // if a service method is defined using proper syntax but uses a primitive\n  // type as its input or output, ParseMethodField() still returns true\n  // and only reports the error by calling AddError().  In practice, this\n  // makes logic much simpler for the caller.\n\n  // Parse a top-level message, enum, service, etc.\n  bool ParseTopLevelStatement(FileDescriptorProto* file,\n                              const LocationRecorder& root_location);\n\n  // Parse various language high-level language construrcts.\n  bool ParseMessageDefinition(DescriptorProto* message,\n                              const LocationRecorder& message_location);\n  bool ParseEnumDefinition(EnumDescriptorProto* enum_type,\n                           const LocationRecorder& enum_location);\n  bool ParseServiceDefinition(ServiceDescriptorProto* service,\n                              const LocationRecorder& service_location);\n  bool ParsePackage(FileDescriptorProto* file,\n                    const LocationRecorder& root_location);\n  bool ParseImport(string* import_filename,\n                   const LocationRecorder& root_location,\n                   int index);\n  bool ParseOption(Message* options,\n                   const LocationRecorder& options_location);\n\n  // These methods parse the contents of a message, enum, or service type and\n  // add them to the given object.  They consume the entire block including\n  // the beginning and ending brace.\n  bool ParseMessageBlock(DescriptorProto* message,\n                         const LocationRecorder& message_location);\n  bool ParseEnumBlock(EnumDescriptorProto* enum_type,\n                      const LocationRecorder& enum_location);\n  bool ParseServiceBlock(ServiceDescriptorProto* service,\n                         const LocationRecorder& service_location);\n\n  // Parse one statement within a message, enum, or service block, inclunding\n  // final semicolon.\n  bool ParseMessageStatement(DescriptorProto* message,\n                             const LocationRecorder& message_location);\n  bool ParseEnumStatement(EnumDescriptorProto* message,\n                          const LocationRecorder& enum_location);\n  bool ParseServiceStatement(ServiceDescriptorProto* message,\n                             const LocationRecorder& service_location);\n\n  // Parse a field of a message.  If the field is a group, its type will be\n  // added to \"messages\".\n  //\n  // parent_location and location_field_number_for_nested_type are needed when\n  // parsing groups -- we need to generate a nested message type within the\n  // parent and record its location accordingly.  Since the parent could be\n  // either a FileDescriptorProto or a DescriptorProto, we must pass in the\n  // correct field number to use.\n  bool ParseMessageField(FieldDescriptorProto* field,\n                         RepeatedPtrField<DescriptorProto>* messages,\n                         const LocationRecorder& parent_location,\n                         int location_field_number_for_nested_type,\n                         const LocationRecorder& field_location);\n\n  // Parse an \"extensions\" declaration.\n  bool ParseExtensions(DescriptorProto* message,\n                       const LocationRecorder& extensions_location);\n\n  // Parse an \"extend\" declaration.  (See also comments for\n  // ParseMessageField().)\n  bool ParseExtend(RepeatedPtrField<FieldDescriptorProto>* extensions,\n                   RepeatedPtrField<DescriptorProto>* messages,\n                   const LocationRecorder& parent_location,\n                   int location_field_number_for_nested_type,\n                   const LocationRecorder& extend_location);\n\n  // Parse a single enum value within an enum block.\n  bool ParseEnumConstant(EnumValueDescriptorProto* enum_value,\n                         const LocationRecorder& enum_value_location);\n\n  // Parse enum constant options, i.e. the list in square brackets at the end\n  // of the enum constant value definition.\n  bool ParseEnumConstantOptions(EnumValueDescriptorProto* value,\n                                const LocationRecorder& enum_value_location);\n\n  // Parse a single method within a service definition.\n  bool ParseServiceMethod(MethodDescriptorProto* method,\n                          const LocationRecorder& method_location);\n\n  // Parse \"required\", \"optional\", or \"repeated\" and fill in \"label\"\n  // with the value.\n  bool ParseLabel(FieldDescriptorProto::Label* label);\n\n  // Parse a type name and fill in \"type\" (if it is a primitive) or\n  // \"type_name\" (if it is not) with the type parsed.\n  bool ParseType(FieldDescriptorProto::Type* type,\n                 string* type_name);\n  // Parse a user-defined type and fill in \"type_name\" with the name.\n  // If a primitive type is named, it is treated as an error.\n  bool ParseUserDefinedType(string* type_name);\n\n  // Parses field options, i.e. the stuff in square brackets at the end\n  // of a field definition.  Also parses default value.\n  bool ParseFieldOptions(FieldDescriptorProto* field,\n                         const LocationRecorder& field_location);\n\n  // Parse the \"default\" option.  This needs special handling because its\n  // type is the field's type.\n  bool ParseDefaultAssignment(FieldDescriptorProto* field,\n                              const LocationRecorder& field_location);\n\n  // Parse a single option name/value pair, e.g. \"ctype = CORD\".  The name\n  // identifies a field of the given Message, and the value of that field\n  // is set to the parsed value.\n  bool ParseOptionAssignment(Message* options,\n                             const LocationRecorder& options_location);\n\n  // Parses a single part of a multipart option name. A multipart name consists\n  // of names separated by dots. Each name is either an identifier or a series\n  // of identifiers separated by dots and enclosed in parentheses. E.g.,\n  // \"foo.(bar.baz).qux\".\n  bool ParseOptionNamePart(UninterpretedOption* uninterpreted_option,\n                           const LocationRecorder& part_location);\n\n  // Parses a string surrounded by balanced braces.  Strips off the outer\n  // braces and stores the enclosed string in *value.\n  // E.g.,\n  //     { foo }                     *value gets 'foo'\n  //     { foo { bar: box } }        *value gets 'foo { bar: box }'\n  //     {}                          *value gets ''\n  //\n  // REQUIRES: LookingAt(\"{\")\n  // When finished successfully, we are looking at the first token past\n  // the ending brace.\n  bool ParseUninterpretedBlock(string* value);\n\n  // =================================================================\n\n  io::Tokenizer* input_;\n  io::ErrorCollector* error_collector_;\n  SourceCodeInfo* source_code_info_;\n  SourceLocationTable* source_location_table_;  // legacy\n  bool had_errors_;\n  bool require_syntax_identifier_;\n  bool stop_after_syntax_identifier_;\n  string syntax_identifier_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Parser);\n};\n\n// A table mapping (descriptor, ErrorLocation) pairs -- as reported by\n// DescriptorPool when validating descriptors -- to line and column numbers\n// within the original source code.\n//\n// This is semi-obsolete:  FileDescriptorProto.source_code_info now contains\n// far more complete information about source locations.  However, as of this\n// writing you still need to use SourceLocationTable when integrating with\n// DescriptorPool.\nclass LIBPROTOBUF_EXPORT SourceLocationTable {\n public:\n  SourceLocationTable();\n  ~SourceLocationTable();\n\n  // Finds the precise location of the given error and fills in *line and\n  // *column with the line and column numbers.  If not found, sets *line to\n  // -1 and *column to 0 (since line = -1 is used to mean \"error has no exact\n  // location\" in the ErrorCollector interface).  Returns true if found, false\n  // otherwise.\n  bool Find(const Message* descriptor,\n            DescriptorPool::ErrorCollector::ErrorLocation location,\n            int* line, int* column) const;\n\n  // Adds a location to the table.\n  void Add(const Message* descriptor,\n           DescriptorPool::ErrorCollector::ErrorLocation location,\n           int line, int column);\n\n  // Clears the contents of the table.\n  void Clear();\n\n private:\n  typedef map<\n    pair<const Message*, DescriptorPool::ErrorCollector::ErrorLocation>,\n    pair<int, int> > LocationMap;\n  LocationMap location_map_;\n};\n\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_PARSER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <vector>\n#include <algorithm>\n#include <map>\n\n#include <google/protobuf/compiler/parser.h>\n\n#include <google/protobuf/io/tokenizer.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/text_format.h>\n#include <google/protobuf/unittest.pb.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n#include <google/protobuf/stubs/map-util.h>\n\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\nnamespace {\n\nclass MockErrorCollector : public io::ErrorCollector {\n public:\n  MockErrorCollector() {}\n  ~MockErrorCollector() {}\n\n  string text_;\n\n  // implements ErrorCollector ---------------------------------------\n  void AddError(int line, int column, const string& message) {\n    strings::SubstituteAndAppend(&text_, \"$0:$1: $2\\n\",\n                                 line, column, message);\n  }\n};\n\nclass MockValidationErrorCollector : public DescriptorPool::ErrorCollector {\n public:\n  MockValidationErrorCollector(const SourceLocationTable& source_locations,\n                               io::ErrorCollector* wrapped_collector)\n    : source_locations_(source_locations),\n      wrapped_collector_(wrapped_collector) {}\n  ~MockValidationErrorCollector() {}\n\n  // implements ErrorCollector ---------------------------------------\n  void AddError(const string& filename,\n                const string& element_name,\n                const Message* descriptor,\n                ErrorLocation location,\n                const string& message) {\n    int line, column;\n    source_locations_.Find(descriptor, location, &line, &column);\n    wrapped_collector_->AddError(line, column, message);\n  }\n\n private:\n  const SourceLocationTable& source_locations_;\n  io::ErrorCollector* wrapped_collector_;\n};\n\nclass ParserTest : public testing::Test {\n protected:\n  ParserTest()\n    : require_syntax_identifier_(false) {}\n\n  // Set up the parser to parse the given text.\n  void SetupParser(const char* text) {\n    raw_input_.reset(new io::ArrayInputStream(text, strlen(text)));\n    input_.reset(new io::Tokenizer(raw_input_.get(), &error_collector_));\n    parser_.reset(new Parser());\n    parser_->RecordErrorsTo(&error_collector_);\n    parser_->SetRequireSyntaxIdentifier(require_syntax_identifier_);\n  }\n\n  // Parse the input and expect that the resulting FileDescriptorProto matches\n  // the given output.  The output is a FileDescriptorProto in protocol buffer\n  // text format.\n  void ExpectParsesTo(const char* input, const char* output) {\n    SetupParser(input);\n    FileDescriptorProto actual, expected;\n\n    parser_->Parse(input_.get(), &actual);\n    EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type);\n    ASSERT_EQ(\"\", error_collector_.text_);\n\n    // We don't cover SourceCodeInfo in these tests.\n    actual.clear_source_code_info();\n\n    // Parse the ASCII representation in order to canonicalize it.  We could\n    // just compare directly to actual.DebugString(), but that would require\n    // that the caller precisely match the formatting that DebugString()\n    // produces.\n    ASSERT_TRUE(TextFormat::ParseFromString(output, &expected));\n\n    // Compare by comparing debug strings.\n    // TODO(kenton):  Use differencer, once it is available.\n    EXPECT_EQ(expected.DebugString(), actual.DebugString());\n  }\n\n  // Parse the text and expect that the given errors are reported.\n  void ExpectHasErrors(const char* text, const char* expected_errors) {\n    ExpectHasEarlyExitErrors(text, expected_errors);\n    EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type);\n  }\n\n  // Same as above but does not expect that the parser parses the complete\n  // input.\n  void ExpectHasEarlyExitErrors(const char* text, const char* expected_errors) {\n    SetupParser(text);\n    FileDescriptorProto file;\n    parser_->Parse(input_.get(), &file);\n    EXPECT_EQ(expected_errors, error_collector_.text_);\n  }\n\n  // Parse the text as a file and validate it (with a DescriptorPool), and\n  // expect that the validation step reports the given errors.\n  void ExpectHasValidationErrors(const char* text,\n                                 const char* expected_errors) {\n    SetupParser(text);\n    SourceLocationTable source_locations;\n    parser_->RecordSourceLocationsTo(&source_locations);\n\n    FileDescriptorProto file;\n    file.set_name(\"foo.proto\");\n    parser_->Parse(input_.get(), &file);\n    EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type);\n    ASSERT_EQ(\"\", error_collector_.text_);\n\n    MockValidationErrorCollector validation_error_collector(\n      source_locations, &error_collector_);\n    EXPECT_TRUE(pool_.BuildFileCollectingErrors(\n      file, &validation_error_collector) == NULL);\n    EXPECT_EQ(expected_errors, error_collector_.text_);\n  }\n\n  MockErrorCollector error_collector_;\n  DescriptorPool pool_;\n\n  scoped_ptr<io::ZeroCopyInputStream> raw_input_;\n  scoped_ptr<io::Tokenizer> input_;\n  scoped_ptr<Parser> parser_;\n  bool require_syntax_identifier_;\n};\n\n// ===================================================================\n\nTEST_F(ParserTest, StopAfterSyntaxIdentifier) {\n  SetupParser(\n    \"// blah\\n\"\n    \"syntax = \\\"foobar\\\";\\n\"\n    \"this line will not be parsed\\n\");\n  parser_->SetStopAfterSyntaxIdentifier(true);\n  EXPECT_TRUE(parser_->Parse(input_.get(), NULL));\n  EXPECT_EQ(\"\", error_collector_.text_);\n  EXPECT_EQ(\"foobar\", parser_->GetSyntaxIdentifier());\n}\n\nTEST_F(ParserTest, StopAfterOmittedSyntaxIdentifier) {\n  SetupParser(\n    \"// blah\\n\"\n    \"this line will not be parsed\\n\");\n  parser_->SetStopAfterSyntaxIdentifier(true);\n  EXPECT_TRUE(parser_->Parse(input_.get(), NULL));\n  EXPECT_EQ(\"\", error_collector_.text_);\n  EXPECT_EQ(\"\", parser_->GetSyntaxIdentifier());\n}\n\nTEST_F(ParserTest, StopAfterSyntaxIdentifierWithErrors) {\n  SetupParser(\n    \"// blah\\n\"\n    \"syntax = error;\\n\");\n  parser_->SetStopAfterSyntaxIdentifier(true);\n  EXPECT_FALSE(parser_->Parse(input_.get(), NULL));\n  EXPECT_EQ(\"1:9: Expected syntax identifier.\\n\", error_collector_.text_);\n}\n\n// ===================================================================\n\ntypedef ParserTest ParseMessageTest;\n\nTEST_F(ParseMessageTest, SimpleMessage) {\n  ExpectParsesTo(\n    \"message TestMessage {\\n\"\n    \"  required int32 foo = 1;\\n\"\n    \"}\\n\",\n\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }\"\n    \"}\");\n}\n\nTEST_F(ParseMessageTest, ImplicitSyntaxIdentifier) {\n  require_syntax_identifier_ = false;\n  ExpectParsesTo(\n    \"message TestMessage {\\n\"\n    \"  required int32 foo = 1;\\n\"\n    \"}\\n\",\n\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }\"\n    \"}\");\n  EXPECT_EQ(\"proto2\", parser_->GetSyntaxIdentifier());\n}\n\nTEST_F(ParseMessageTest, ExplicitSyntaxIdentifier) {\n  ExpectParsesTo(\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message TestMessage {\\n\"\n    \"  required int32 foo = 1;\\n\"\n    \"}\\n\",\n\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }\"\n    \"}\");\n  EXPECT_EQ(\"proto2\", parser_->GetSyntaxIdentifier());\n}\n\nTEST_F(ParseMessageTest, ExplicitRequiredSyntaxIdentifier) {\n  require_syntax_identifier_ = true;\n  ExpectParsesTo(\n    \"syntax = \\\"proto2\\\";\\n\"\n    \"message TestMessage {\\n\"\n    \"  required int32 foo = 1;\\n\"\n    \"}\\n\",\n\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }\"\n    \"}\");\n  EXPECT_EQ(\"proto2\", parser_->GetSyntaxIdentifier());\n}\n\nTEST_F(ParseMessageTest, SimpleFields) {\n  ExpectParsesTo(\n    \"message TestMessage {\\n\"\n    \"  required int32 foo = 15;\\n\"\n    \"  optional int32 bar = 34;\\n\"\n    \"  repeated int32 baz = 3;\\n\"\n    \"}\\n\",\n\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_INT32 number:15 }\"\n    \"  field { name:\\\"bar\\\" label:LABEL_OPTIONAL type:TYPE_INT32 number:34 }\"\n    \"  field { name:\\\"baz\\\" label:LABEL_REPEATED type:TYPE_INT32 number:3  }\"\n    \"}\");\n}\n\nTEST_F(ParseMessageTest, PrimitiveFieldTypes) {\n  ExpectParsesTo(\n    \"message TestMessage {\\n\"\n    \"  required int32    foo = 1;\\n\"\n    \"  required int64    foo = 1;\\n\"\n    \"  required uint32   foo = 1;\\n\"\n    \"  required uint64   foo = 1;\\n\"\n    \"  required sint32   foo = 1;\\n\"\n    \"  required sint64   foo = 1;\\n\"\n    \"  required fixed32  foo = 1;\\n\"\n    \"  required fixed64  foo = 1;\\n\"\n    \"  required sfixed32 foo = 1;\\n\"\n    \"  required sfixed64 foo = 1;\\n\"\n    \"  required float    foo = 1;\\n\"\n    \"  required double   foo = 1;\\n\"\n    \"  required string   foo = 1;\\n\"\n    \"  required bytes    foo = 1;\\n\"\n    \"  required bool     foo = 1;\\n\"\n    \"}\\n\",\n\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_INT32    number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_INT64    number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_UINT32   number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_UINT64   number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_SINT32   number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_SINT64   number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_FIXED32  number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_FIXED64  number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_SFIXED32 number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_SFIXED64 number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_FLOAT    number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_DOUBLE   number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_STRING   number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_BYTES    number:1 }\"\n    \"  field { name:\\\"foo\\\" label:LABEL_REQUIRED type:TYPE_BOOL     number:1 }\"\n    \"}\");\n}\n\nTEST_F(ParseMessageTest, FieldDefaults) {\n  ExpectParsesTo(\n    \"message TestMessage {\\n\"\n    \"  required int32  foo = 1 [default=  1  ];\\n\"\n    \"  required int32  foo = 1 [default= -2  ];\\n\"\n    \"  required int64  foo = 1 [default=  3  ];\\n\"\n    \"  required int64  foo = 1 [default= -4  ];\\n\"\n    \"  required uint32 foo = 1 [default=  5  ];\\n\"\n    \"  required uint64 foo = 1 [default=  6  ];\\n\"\n    \"  required float  foo = 1 [default=  7.5];\\n\"\n    \"  required float  foo = 1 [default= -8.5];\\n\"\n    \"  required float  foo = 1 [default=  9  ];\\n\"\n    \"  required double foo = 1 [default= 10.5];\\n\"\n    \"  required double foo = 1 [default=-11.5];\\n\"\n    \"  required double foo = 1 [default= 12  ];\\n\"\n    \"  required double foo = 1 [default= inf ];\\n\"\n    \"  required double foo = 1 [default=-inf ];\\n\"\n    \"  required double foo = 1 [default= nan ];\\n\"\n    \"  required string foo = 1 [default='13\\\\001'];\\n\"\n    \"  required string foo = 1 [default='a' \\\"b\\\" \\n \\\"c\\\"];\\n\"\n    \"  required bytes  foo = 1 [default='14\\\\002'];\\n\"\n    \"  required bytes  foo = 1 [default='a' \\\"b\\\" \\n 'c'];\\n\"\n    \"  required bool   foo = 1 [default=true ];\\n\"\n    \"  required Foo    foo = 1 [default=FOO  ];\\n\"\n\n    \"  required int32  foo = 1 [default= 0x7FFFFFFF];\\n\"\n    \"  required int32  foo = 1 [default=-0x80000000];\\n\"\n    \"  required uint32 foo = 1 [default= 0xFFFFFFFF];\\n\"\n    \"  required int64  foo = 1 [default= 0x7FFFFFFFFFFFFFFF];\\n\"\n    \"  required int64  foo = 1 [default=-0x8000000000000000];\\n\"\n    \"  required uint64 foo = 1 [default= 0xFFFFFFFFFFFFFFFF];\\n\"\n    \"  required double foo = 1 [default= 0xabcd];\\n\"\n    \"}\\n\",\n\n#define ETC \"name:\\\"foo\\\" label:LABEL_REQUIRED number:1\"\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  field { type:TYPE_INT32   default_value:\\\"1\\\"         \"ETC\" }\"\n    \"  field { type:TYPE_INT32   default_value:\\\"-2\\\"        \"ETC\" }\"\n    \"  field { type:TYPE_INT64   default_value:\\\"3\\\"         \"ETC\" }\"\n    \"  field { type:TYPE_INT64   default_value:\\\"-4\\\"        \"ETC\" }\"\n    \"  field { type:TYPE_UINT32  default_value:\\\"5\\\"         \"ETC\" }\"\n    \"  field { type:TYPE_UINT64  default_value:\\\"6\\\"         \"ETC\" }\"\n    \"  field { type:TYPE_FLOAT   default_value:\\\"7.5\\\"       \"ETC\" }\"\n    \"  field { type:TYPE_FLOAT   default_value:\\\"-8.5\\\"      \"ETC\" }\"\n    \"  field { type:TYPE_FLOAT   default_value:\\\"9\\\"         \"ETC\" }\"\n    \"  field { type:TYPE_DOUBLE  default_value:\\\"10.5\\\"      \"ETC\" }\"\n    \"  field { type:TYPE_DOUBLE  default_value:\\\"-11.5\\\"     \"ETC\" }\"\n    \"  field { type:TYPE_DOUBLE  default_value:\\\"12\\\"        \"ETC\" }\"\n    \"  field { type:TYPE_DOUBLE  default_value:\\\"inf\\\"       \"ETC\" }\"\n    \"  field { type:TYPE_DOUBLE  default_value:\\\"-inf\\\"      \"ETC\" }\"\n    \"  field { type:TYPE_DOUBLE  default_value:\\\"nan\\\"       \"ETC\" }\"\n    \"  field { type:TYPE_STRING  default_value:\\\"13\\\\001\\\"   \"ETC\" }\"\n    \"  field { type:TYPE_STRING  default_value:\\\"abc\\\"       \"ETC\" }\"\n    \"  field { type:TYPE_BYTES   default_value:\\\"14\\\\\\\\002\\\" \"ETC\" }\"\n    \"  field { type:TYPE_BYTES   default_value:\\\"abc\\\"       \"ETC\" }\"\n    \"  field { type:TYPE_BOOL    default_value:\\\"true\\\"      \"ETC\" }\"\n    \"  field { type_name:\\\"Foo\\\" default_value:\\\"FOO\\\"       \"ETC\" }\"\n\n    \"  field { type:TYPE_INT32   default_value:\\\"2147483647\\\"           \"ETC\" }\"\n    \"  field { type:TYPE_INT32   default_value:\\\"-2147483648\\\"          \"ETC\" }\"\n    \"  field { type:TYPE_UINT32  default_value:\\\"4294967295\\\"           \"ETC\" }\"\n    \"  field { type:TYPE_INT64   default_value:\\\"9223372036854775807\\\"  \"ETC\" }\"\n    \"  field { type:TYPE_INT64   default_value:\\\"-9223372036854775808\\\" \"ETC\" }\"\n    \"  field { type:TYPE_UINT64  default_value:\\\"18446744073709551615\\\" \"ETC\" }\"\n    \"  field { type:TYPE_DOUBLE  default_value:\\\"43981\\\"                \"ETC\" }\"\n    \"}\");\n#undef ETC\n}\n\nTEST_F(ParseMessageTest, FieldOptions) {\n  ExpectParsesTo(\n    \"message TestMessage {\\n\"\n    \"  optional string foo = 1\\n\"\n    \"      [ctype=CORD, (foo)=7, foo.(.bar.baz).qux.quux.(corge)=-33, \\n\"\n    \"       (quux)=\\\"x\\040y\\\", (baz.qux)=hey];\\n\"\n    \"}\\n\",\n\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  field { name: \\\"foo\\\" label: LABEL_OPTIONAL type: TYPE_STRING number: 1\"\n    \"          options { uninterpreted_option: { name { name_part: \\\"ctype\\\" \"\n    \"                                                   is_extension: false } \"\n    \"                                            identifier_value: \\\"CORD\\\"  }\"\n    \"                    uninterpreted_option: { name { name_part: \\\"foo\\\" \"\n    \"                                                   is_extension: true } \"\n    \"                                            positive_int_value: 7  }\"\n    \"                    uninterpreted_option: { name { name_part: \\\"foo\\\" \"\n    \"                                                   is_extension: false } \"\n    \"                                            name { name_part: \\\".bar.baz\\\"\"\n    \"                                                   is_extension: true } \"\n    \"                                            name { name_part: \\\"qux\\\" \"\n    \"                                                   is_extension: false } \"\n    \"                                            name { name_part: \\\"quux\\\" \"\n    \"                                                   is_extension: false } \"\n    \"                                            name { name_part: \\\"corge\\\" \"\n    \"                                                   is_extension: true } \"\n    \"                                            negative_int_value: -33 }\"\n    \"                    uninterpreted_option: { name { name_part: \\\"quux\\\" \"\n    \"                                                   is_extension: true } \"\n    \"                                            string_value: \\\"x y\\\" }\"\n    \"                    uninterpreted_option: { name { name_part: \\\"baz.qux\\\" \"\n    \"                                                   is_extension: true } \"\n    \"                                            identifier_value: \\\"hey\\\" }\"\n    \"          }\"\n    \"  }\"\n    \"}\");\n}\n\nTEST_F(ParseMessageTest, Group) {\n  ExpectParsesTo(\n    \"message TestMessage {\\n\"\n    \"  optional group TestGroup = 1 {};\\n\"\n    \"}\\n\",\n\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  nested_type { name: \\\"TestGroup\\\" }\"\n    \"  field { name:\\\"testgroup\\\" label:LABEL_OPTIONAL number:1\"\n    \"          type:TYPE_GROUP type_name: \\\"TestGroup\\\" }\"\n    \"}\");\n}\n\nTEST_F(ParseMessageTest, NestedMessage) {\n  ExpectParsesTo(\n    \"message TestMessage {\\n\"\n    \"  message Nested {}\\n\"\n    \"  optional Nested test_nested = 1;\\n\"\n    \"}\\n\",\n\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  nested_type { name: \\\"Nested\\\" }\"\n    \"  field { name:\\\"test_nested\\\" label:LABEL_OPTIONAL number:1\"\n    \"          type_name: \\\"Nested\\\" }\"\n    \"}\");\n}\n\nTEST_F(ParseMessageTest, NestedEnum) {\n  ExpectParsesTo(\n    \"message TestMessage {\\n\"\n    \"  enum NestedEnum {}\\n\"\n    \"  optional NestedEnum test_enum = 1;\\n\"\n    \"}\\n\",\n\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  enum_type { name: \\\"NestedEnum\\\" }\"\n    \"  field { name:\\\"test_enum\\\" label:LABEL_OPTIONAL number:1\"\n    \"          type_name: \\\"NestedEnum\\\" }\"\n    \"}\");\n}\n\nTEST_F(ParseMessageTest, ExtensionRange) {\n  ExpectParsesTo(\n    \"message TestMessage {\\n\"\n    \"  extensions 10 to 19;\\n\"\n    \"  extensions 30 to max;\\n\"\n    \"}\\n\",\n\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  extension_range { start:10 end:20        }\"\n    \"  extension_range { start:30 end:536870912 }\"\n    \"}\");\n}\n\nTEST_F(ParseMessageTest, CompoundExtensionRange) {\n  ExpectParsesTo(\n    \"message TestMessage {\\n\"\n    \"  extensions 2, 15, 9 to 11, 100 to max, 3;\\n\"\n    \"}\\n\",\n\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  extension_range { start:2   end:3         }\"\n    \"  extension_range { start:15  end:16        }\"\n    \"  extension_range { start:9   end:12        }\"\n    \"  extension_range { start:100 end:536870912 }\"\n    \"  extension_range { start:3   end:4         }\"\n    \"}\");\n}\n\nTEST_F(ParseMessageTest, Extensions) {\n  ExpectParsesTo(\n    \"extend Extendee1 { optional int32 foo = 12; }\\n\"\n    \"extend Extendee2 { repeated TestMessage bar = 22; }\\n\",\n\n    \"extension { name:\\\"foo\\\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12\"\n    \"            extendee: \\\"Extendee1\\\" } \"\n    \"extension { name:\\\"bar\\\" label:LABEL_REPEATED number:22\"\n    \"            type_name:\\\"TestMessage\\\" extendee: \\\"Extendee2\\\" }\");\n}\n\nTEST_F(ParseMessageTest, ExtensionsInMessageScope) {\n  ExpectParsesTo(\n    \"message TestMessage {\\n\"\n    \"  extend Extendee1 { optional int32 foo = 12; }\\n\"\n    \"  extend Extendee2 { repeated TestMessage bar = 22; }\\n\"\n    \"}\\n\",\n\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  extension { name:\\\"foo\\\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12\"\n    \"              extendee: \\\"Extendee1\\\" }\"\n    \"  extension { name:\\\"bar\\\" label:LABEL_REPEATED number:22\"\n    \"              type_name:\\\"TestMessage\\\" extendee: \\\"Extendee2\\\" }\"\n    \"}\");\n}\n\nTEST_F(ParseMessageTest, MultipleExtensionsOneExtendee) {\n  ExpectParsesTo(\n    \"extend Extendee1 {\\n\"\n    \"  optional int32 foo = 12;\\n\"\n    \"  repeated TestMessage bar = 22;\\n\"\n    \"}\\n\",\n\n    \"extension { name:\\\"foo\\\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12\"\n    \"            extendee: \\\"Extendee1\\\" } \"\n    \"extension { name:\\\"bar\\\" label:LABEL_REPEATED number:22\"\n    \"            type_name:\\\"TestMessage\\\" extendee: \\\"Extendee1\\\" }\");\n}\n\n// ===================================================================\n\ntypedef ParserTest ParseEnumTest;\n\nTEST_F(ParseEnumTest, SimpleEnum) {\n  ExpectParsesTo(\n    \"enum TestEnum {\\n\"\n    \"  FOO = 0;\\n\"\n    \"}\\n\",\n\n    \"enum_type {\"\n    \"  name: \\\"TestEnum\\\"\"\n    \"  value { name:\\\"FOO\\\" number:0 }\"\n    \"}\");\n}\n\nTEST_F(ParseEnumTest, Values) {\n  ExpectParsesTo(\n    \"enum TestEnum {\\n\"\n    \"  FOO = 13;\\n\"\n    \"  BAR = -10;\\n\"\n    \"  BAZ = 500;\\n\"\n    \"}\\n\",\n\n    \"enum_type {\"\n    \"  name: \\\"TestEnum\\\"\"\n    \"  value { name:\\\"FOO\\\" number:13 }\"\n    \"  value { name:\\\"BAR\\\" number:-10 }\"\n    \"  value { name:\\\"BAZ\\\" number:500 }\"\n    \"}\");\n}\n\nTEST_F(ParseEnumTest, ValueOptions) {\n  ExpectParsesTo(\n    \"enum TestEnum {\\n\"\n    \"  FOO = 13;\\n\"\n    \"  BAR = -10 [ (something.text) = 'abc' ];\\n\"\n    \"  BAZ = 500 [ (something.text) = 'def', other = 1 ];\\n\"\n    \"}\\n\",\n\n    \"enum_type {\"\n    \"  name: \\\"TestEnum\\\"\"\n    \"  value { name: \\\"FOO\\\" number: 13 }\"\n    \"  value { name: \\\"BAR\\\" number: -10 \"\n    \"    options { \"\n    \"      uninterpreted_option { \"\n    \"        name { name_part: \\\"something.text\\\" is_extension: true } \"\n    \"        string_value: \\\"abc\\\" \"\n    \"      } \"\n    \"    } \"\n    \"  } \"\n    \"  value { name: \\\"BAZ\\\" number: 500 \"\n    \"    options { \"\n    \"      uninterpreted_option { \"\n    \"        name { name_part: \\\"something.text\\\" is_extension: true } \"\n    \"        string_value: \\\"def\\\" \"\n    \"      } \"\n    \"      uninterpreted_option { \"\n    \"        name { name_part: \\\"other\\\" is_extension: false } \"\n    \"        positive_int_value: 1 \"\n    \"      } \"\n    \"    } \"\n    \"  } \"\n    \"}\");\n}\n\n// ===================================================================\n\ntypedef ParserTest ParseServiceTest;\n\nTEST_F(ParseServiceTest, SimpleService) {\n  ExpectParsesTo(\n    \"service TestService {\\n\"\n    \"  rpc Foo(In) returns (Out);\\n\"\n    \"}\\n\",\n\n    \"service {\"\n    \"  name: \\\"TestService\\\"\"\n    \"  method { name:\\\"Foo\\\" input_type:\\\"In\\\" output_type:\\\"Out\\\" }\"\n    \"}\");\n}\n\nTEST_F(ParseServiceTest, Methods) {\n  ExpectParsesTo(\n    \"service TestService {\\n\"\n    \"  rpc Foo(In1) returns (Out1);\\n\"\n    \"  rpc Bar(In2) returns (Out2);\\n\"\n    \"  rpc Baz(In3) returns (Out3);\\n\"\n    \"}\\n\",\n\n    \"service {\"\n    \"  name: \\\"TestService\\\"\"\n    \"  method { name:\\\"Foo\\\" input_type:\\\"In1\\\" output_type:\\\"Out1\\\" }\"\n    \"  method { name:\\\"Bar\\\" input_type:\\\"In2\\\" output_type:\\\"Out2\\\" }\"\n    \"  method { name:\\\"Baz\\\" input_type:\\\"In3\\\" output_type:\\\"Out3\\\" }\"\n    \"}\");\n}\n\n// ===================================================================\n// imports and packages\n\ntypedef ParserTest ParseMiscTest;\n\nTEST_F(ParseMiscTest, ParseImport) {\n  ExpectParsesTo(\n    \"import \\\"foo/bar/baz.proto\\\";\\n\",\n    \"dependency: \\\"foo/bar/baz.proto\\\"\");\n}\n\nTEST_F(ParseMiscTest, ParseMultipleImports) {\n  ExpectParsesTo(\n    \"import \\\"foo.proto\\\";\\n\"\n    \"import \\\"bar.proto\\\";\\n\"\n    \"import \\\"baz.proto\\\";\\n\",\n    \"dependency: \\\"foo.proto\\\"\"\n    \"dependency: \\\"bar.proto\\\"\"\n    \"dependency: \\\"baz.proto\\\"\");\n}\n\nTEST_F(ParseMiscTest, ParsePackage) {\n  ExpectParsesTo(\n    \"package foo.bar.baz;\\n\",\n    \"package: \\\"foo.bar.baz\\\"\");\n}\n\nTEST_F(ParseMiscTest, ParsePackageWithSpaces) {\n  ExpectParsesTo(\n    \"package foo   .   bar.  \\n\"\n    \"  baz;\\n\",\n    \"package: \\\"foo.bar.baz\\\"\");\n}\n\n// ===================================================================\n// options\n\nTEST_F(ParseMiscTest, ParseFileOptions) {\n  ExpectParsesTo(\n    \"option java_package = \\\"com.google.foo\\\";\\n\"\n    \"option optimize_for = CODE_SIZE;\",\n\n    \"options {\"\n    \"uninterpreted_option { name { name_part: \\\"java_package\\\" \"\n    \"                              is_extension: false }\"\n    \"                       string_value: \\\"com.google.foo\\\"} \"\n    \"uninterpreted_option { name { name_part: \\\"optimize_for\\\" \"\n    \"                              is_extension: false }\"\n    \"                       identifier_value: \\\"CODE_SIZE\\\" } \"\n    \"}\");\n}\n\n// ===================================================================\n// Error tests\n//\n// There are a very large number of possible errors that the parser could\n// report, so it's infeasible to test every single one of them.  Instead,\n// we test each unique call to AddError() in parser.h.  This does not mean\n// we are testing every possible error that Parser can generate because\n// each variant of the Consume() helper only counts as one unique call to\n// AddError().\n\ntypedef ParserTest ParseErrorTest;\n\nTEST_F(ParseErrorTest, MissingSyntaxIdentifier) {\n  require_syntax_identifier_ = true;\n  ExpectHasEarlyExitErrors(\n    \"message TestMessage {}\",\n    \"0:0: File must begin with 'syntax = \\\"proto2\\\";'.\\n\");\n  EXPECT_EQ(\"\", parser_->GetSyntaxIdentifier());\n}\n\nTEST_F(ParseErrorTest, UnknownSyntaxIdentifier) {\n  ExpectHasEarlyExitErrors(\n    \"syntax = \\\"no_such_syntax\\\";\",\n    \"0:9: Unrecognized syntax identifier \\\"no_such_syntax\\\".  This parser \"\n      \"only recognizes \\\"proto2\\\".\\n\");\n  EXPECT_EQ(\"no_such_syntax\", parser_->GetSyntaxIdentifier());\n}\n\nTEST_F(ParseErrorTest, SimpleSyntaxError) {\n  ExpectHasErrors(\n    \"message TestMessage @#$ { blah }\",\n    \"0:20: Expected \\\"{\\\".\\n\");\n  EXPECT_EQ(\"proto2\", parser_->GetSyntaxIdentifier());\n}\n\nTEST_F(ParseErrorTest, ExpectedTopLevel) {\n  ExpectHasErrors(\n    \"blah;\",\n    \"0:0: Expected top-level statement (e.g. \\\"message\\\").\\n\");\n}\n\nTEST_F(ParseErrorTest, UnmatchedCloseBrace) {\n  // This used to cause an infinite loop.  Doh.\n  ExpectHasErrors(\n    \"}\",\n    \"0:0: Expected top-level statement (e.g. \\\"message\\\").\\n\"\n    \"0:0: Unmatched \\\"}\\\".\\n\");\n}\n\n// -------------------------------------------------------------------\n// Message errors\n\nTEST_F(ParseErrorTest, MessageMissingName) {\n  ExpectHasErrors(\n    \"message {}\",\n    \"0:8: Expected message name.\\n\");\n}\n\nTEST_F(ParseErrorTest, MessageMissingBody) {\n  ExpectHasErrors(\n    \"message TestMessage;\",\n    \"0:19: Expected \\\"{\\\".\\n\");\n}\n\nTEST_F(ParseErrorTest, EofInMessage) {\n  ExpectHasErrors(\n    \"message TestMessage {\",\n    \"0:21: Reached end of input in message definition (missing '}').\\n\");\n}\n\nTEST_F(ParseErrorTest, MissingFieldNumber) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional int32 foo;\\n\"\n    \"}\\n\",\n    \"1:20: Missing field number.\\n\");\n}\n\nTEST_F(ParseErrorTest, ExpectedFieldNumber) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional int32 foo = ;\\n\"\n    \"}\\n\",\n    \"1:23: Expected field number.\\n\");\n}\n\nTEST_F(ParseErrorTest, FieldNumberOutOfRange) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional int32 foo = 0x100000000;\\n\"\n    \"}\\n\",\n    \"1:23: Integer out of range.\\n\");\n}\n\nTEST_F(ParseErrorTest, MissingLabel) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  int32 foo = 1;\\n\"\n    \"}\\n\",\n    \"1:2: Expected \\\"required\\\", \\\"optional\\\", or \\\"repeated\\\".\\n\");\n}\n\nTEST_F(ParseErrorTest, ExpectedOptionName) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional uint32 foo = 1 [];\\n\"\n    \"}\\n\",\n    \"1:27: Expected identifier.\\n\");\n}\n\nTEST_F(ParseErrorTest, NonExtensionOptionNameBeginningWithDot) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional uint32 foo = 1 [.foo=1];\\n\"\n    \"}\\n\",\n    \"1:27: Expected identifier.\\n\");\n}\n\nTEST_F(ParseErrorTest, DefaultValueTypeMismatch) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional uint32 foo = 1 [default=true];\\n\"\n    \"}\\n\",\n    \"1:35: Expected integer.\\n\");\n}\n\nTEST_F(ParseErrorTest, DefaultValueNotBoolean) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional bool foo = 1 [default=blah];\\n\"\n    \"}\\n\",\n    \"1:33: Expected \\\"true\\\" or \\\"false\\\".\\n\");\n}\n\nTEST_F(ParseErrorTest, DefaultValueNotString) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional string foo = 1 [default=1];\\n\"\n    \"}\\n\",\n    \"1:35: Expected string.\\n\");\n}\n\nTEST_F(ParseErrorTest, DefaultValueUnsignedNegative) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional uint32 foo = 1 [default=-1];\\n\"\n    \"}\\n\",\n    \"1:36: Unsigned field can't have negative default value.\\n\");\n}\n\nTEST_F(ParseErrorTest, DefaultValueTooLarge) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional int32  foo = 1 [default= 0x80000000];\\n\"\n    \"  optional int32  foo = 1 [default=-0x80000001];\\n\"\n    \"  optional uint32 foo = 1 [default= 0x100000000];\\n\"\n    \"  optional int64  foo = 1 [default= 0x80000000000000000];\\n\"\n    \"  optional int64  foo = 1 [default=-0x80000000000000001];\\n\"\n    \"  optional uint64 foo = 1 [default= 0x100000000000000000];\\n\"\n    \"}\\n\",\n    \"1:36: Integer out of range.\\n\"\n    \"2:36: Integer out of range.\\n\"\n    \"3:36: Integer out of range.\\n\"\n    \"4:36: Integer out of range.\\n\"\n    \"5:36: Integer out of range.\\n\"\n    \"6:36: Integer out of range.\\n\");\n}\n\nTEST_F(ParseErrorTest, DefaultValueMissing) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional uint32 foo = 1 [default=];\\n\"\n    \"}\\n\",\n    \"1:35: Expected integer.\\n\");\n}\n\nTEST_F(ParseErrorTest, DefaultValueForGroup) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional group Foo = 1 [default=blah] {}\\n\"\n    \"}\\n\",\n    \"1:34: Messages can't have default values.\\n\");\n}\n\nTEST_F(ParseErrorTest, DuplicateDefaultValue) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional uint32 foo = 1 [default=1,default=2];\\n\"\n    \"}\\n\",\n    \"1:37: Already set option \\\"default\\\".\\n\");\n}\n\nTEST_F(ParseErrorTest, GroupNotCapitalized) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional group foo = 1 {}\\n\"\n    \"}\\n\",\n    \"1:17: Group names must start with a capital letter.\\n\");\n}\n\nTEST_F(ParseErrorTest, GroupMissingBody) {\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional group Foo = 1;\\n\"\n    \"}\\n\",\n    \"1:24: Missing group body.\\n\");\n}\n\nTEST_F(ParseErrorTest, ExtendingPrimitive) {\n  ExpectHasErrors(\n    \"extend int32 { optional string foo = 4; }\\n\",\n    \"0:7: Expected message type.\\n\");\n}\n\nTEST_F(ParseErrorTest, ErrorInExtension) {\n  ExpectHasErrors(\n    \"message Foo { extensions 100 to 199; }\\n\"\n    \"extend Foo { optional string foo; }\\n\",\n    \"1:32: Missing field number.\\n\");\n}\n\nTEST_F(ParseErrorTest, MultipleParseErrors) {\n  // When a statement has a parse error, the parser should be able to continue\n  // parsing at the next statement.\n  ExpectHasErrors(\n    \"message TestMessage {\\n\"\n    \"  optional int32 foo;\\n\"\n    \"  !invalid statement ending in a block { blah blah { blah } blah }\\n\"\n    \"  optional int32 bar = 3 {}\\n\"\n    \"}\\n\",\n    \"1:20: Missing field number.\\n\"\n    \"2:2: Expected \\\"required\\\", \\\"optional\\\", or \\\"repeated\\\".\\n\"\n    \"2:2: Expected type name.\\n\"\n    \"3:25: Expected \\\";\\\".\\n\");\n}\n\nTEST_F(ParseErrorTest, EofInAggregateValue) {\n  ExpectHasErrors(\n      \"option (fileopt) = { i:100\\n\",\n      \"1:0: Unexpected end of stream while parsing aggregate value.\\n\");\n}\n\n// -------------------------------------------------------------------\n// Enum errors\n\nTEST_F(ParseErrorTest, EofInEnum) {\n  ExpectHasErrors(\n    \"enum TestEnum {\",\n    \"0:15: Reached end of input in enum definition (missing '}').\\n\");\n}\n\nTEST_F(ParseErrorTest, EnumValueMissingNumber) {\n  ExpectHasErrors(\n    \"enum TestEnum {\\n\"\n    \"  FOO;\\n\"\n    \"}\\n\",\n    \"1:5: Missing numeric value for enum constant.\\n\");\n}\n\n// -------------------------------------------------------------------\n// Service errors\n\nTEST_F(ParseErrorTest, EofInService) {\n  ExpectHasErrors(\n    \"service TestService {\",\n    \"0:21: Reached end of input in service definition (missing '}').\\n\");\n}\n\nTEST_F(ParseErrorTest, ServiceMethodPrimitiveParams) {\n  ExpectHasErrors(\n    \"service TestService {\\n\"\n    \"  rpc Foo(int32) returns (string);\\n\"\n    \"}\\n\",\n    \"1:10: Expected message type.\\n\"\n    \"1:26: Expected message type.\\n\");\n}\n\nTEST_F(ParseErrorTest, EofInMethodOptions) {\n  ExpectHasErrors(\n    \"service TestService {\\n\"\n    \"  rpc Foo(Bar) returns(Bar) {\",\n    \"1:29: Reached end of input in method options (missing '}').\\n\"\n    \"1:29: Reached end of input in service definition (missing '}').\\n\");\n}\n\nTEST_F(ParseErrorTest, PrimitiveMethodInput) {\n  ExpectHasErrors(\n    \"service TestService {\\n\"\n    \"  rpc Foo(int32) returns(Bar);\\n\"\n    \"}\\n\",\n    \"1:10: Expected message type.\\n\");\n}\n\nTEST_F(ParseErrorTest, MethodOptionTypeError) {\n  // This used to cause an infinite loop.\n  ExpectHasErrors(\n    \"message Baz {}\\n\"\n    \"service Foo {\\n\"\n    \"  rpc Bar(Baz) returns(Baz) { option invalid syntax; }\\n\"\n    \"}\\n\",\n    \"2:45: Expected \\\"=\\\".\\n\");\n}\n\n// -------------------------------------------------------------------\n// Import and package errors\n\nTEST_F(ParseErrorTest, ImportNotQuoted) {\n  ExpectHasErrors(\n    \"import foo;\\n\",\n    \"0:7: Expected a string naming the file to import.\\n\");\n}\n\nTEST_F(ParseErrorTest, MultiplePackagesInFile) {\n  ExpectHasErrors(\n    \"package foo;\\n\"\n    \"package bar;\\n\",\n    \"1:0: Multiple package definitions.\\n\");\n}\n\n// ===================================================================\n// Test that errors detected by DescriptorPool correctly report line and\n// column numbers.  We have one test for every call to RecordLocation() in\n// parser.cc.\n\ntypedef ParserTest ParserValidationErrorTest;\n\nTEST_F(ParserValidationErrorTest, PackageNameError) {\n  // Create another file which defines symbol \"foo\".\n  FileDescriptorProto other_file;\n  other_file.set_name(\"bar.proto\");\n  other_file.add_message_type()->set_name(\"foo\");\n  EXPECT_TRUE(pool_.BuildFile(other_file) != NULL);\n\n  // Now try to define it as a package.\n  ExpectHasValidationErrors(\n    \"package foo.bar;\",\n    \"0:8: \\\"foo\\\" is already defined (as something other than a package) \"\n      \"in file \\\"bar.proto\\\".\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, MessageNameError) {\n  ExpectHasValidationErrors(\n    \"message Foo {}\\n\"\n    \"message Foo {}\\n\",\n    \"1:8: \\\"Foo\\\" is already defined.\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, FieldNameError) {\n  ExpectHasValidationErrors(\n    \"message Foo {\\n\"\n    \"  optional int32 bar = 1;\\n\"\n    \"  optional int32 bar = 2;\\n\"\n    \"}\\n\",\n    \"2:17: \\\"bar\\\" is already defined in \\\"Foo\\\".\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, FieldTypeError) {\n  ExpectHasValidationErrors(\n    \"message Foo {\\n\"\n    \"  optional Baz bar = 1;\\n\"\n    \"}\\n\",\n    \"1:11: \\\"Baz\\\" is not defined.\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, FieldNumberError) {\n  ExpectHasValidationErrors(\n    \"message Foo {\\n\"\n    \"  optional int32 bar = 0;\\n\"\n    \"}\\n\",\n    \"1:23: Field numbers must be positive integers.\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, FieldExtendeeError) {\n  ExpectHasValidationErrors(\n    \"extend Baz { optional int32 bar = 1; }\\n\",\n    \"0:7: \\\"Baz\\\" is not defined.\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, FieldDefaultValueError) {\n  ExpectHasValidationErrors(\n    \"enum Baz { QUX = 1; }\\n\"\n    \"message Foo {\\n\"\n    \"  optional Baz bar = 1 [default=NO_SUCH_VALUE];\\n\"\n    \"}\\n\",\n    \"2:32: Enum type \\\"Baz\\\" has no value named \\\"NO_SUCH_VALUE\\\".\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, FileOptionNameError) {\n  ExpectHasValidationErrors(\n    \"option foo = 5;\",\n    \"0:7: Option \\\"foo\\\" unknown.\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, FileOptionValueError) {\n  ExpectHasValidationErrors(\n    \"option java_outer_classname = 5;\",\n    \"0:30: Value must be quoted string for string option \"\n    \"\\\"google.protobuf.FileOptions.java_outer_classname\\\".\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, FieldOptionNameError) {\n  ExpectHasValidationErrors(\n    \"message Foo {\\n\"\n    \"  optional bool bar = 1 [foo=1];\\n\"\n    \"}\\n\",\n    \"1:25: Option \\\"foo\\\" unknown.\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, FieldOptionValueError) {\n  ExpectHasValidationErrors(\n    \"message Foo {\\n\"\n    \"  optional int32 bar = 1 [ctype=1];\\n\"\n    \"}\\n\",\n    \"1:32: Value must be identifier for enum-valued option \"\n    \"\\\"google.protobuf.FieldOptions.ctype\\\".\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, ExtensionRangeNumberError) {\n  ExpectHasValidationErrors(\n    \"message Foo {\\n\"\n    \"  extensions 0;\\n\"\n    \"}\\n\",\n    \"1:13: Extension numbers must be positive integers.\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, EnumNameError) {\n  ExpectHasValidationErrors(\n    \"enum Foo {A = 1;}\\n\"\n    \"enum Foo {B = 1;}\\n\",\n    \"1:5: \\\"Foo\\\" is already defined.\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, EnumValueNameError) {\n  ExpectHasValidationErrors(\n    \"enum Foo {\\n\"\n    \"  BAR = 1;\\n\"\n    \"  BAR = 1;\\n\"\n    \"}\\n\",\n    \"2:2: \\\"BAR\\\" is already defined.\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, ServiceNameError) {\n  ExpectHasValidationErrors(\n    \"service Foo {}\\n\"\n    \"service Foo {}\\n\",\n    \"1:8: \\\"Foo\\\" is already defined.\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, MethodNameError) {\n  ExpectHasValidationErrors(\n    \"message Baz {}\\n\"\n    \"service Foo {\\n\"\n    \"  rpc Bar(Baz) returns(Baz);\\n\"\n    \"  rpc Bar(Baz) returns(Baz);\\n\"\n    \"}\\n\",\n    \"3:6: \\\"Bar\\\" is already defined in \\\"Foo\\\".\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, MethodInputTypeError) {\n  ExpectHasValidationErrors(\n    \"message Baz {}\\n\"\n    \"service Foo {\\n\"\n    \"  rpc Bar(Qux) returns(Baz);\\n\"\n    \"}\\n\",\n    \"2:10: \\\"Qux\\\" is not defined.\\n\");\n}\n\nTEST_F(ParserValidationErrorTest, MethodOutputTypeError) {\n  ExpectHasValidationErrors(\n    \"message Baz {}\\n\"\n    \"service Foo {\\n\"\n    \"  rpc Bar(Baz) returns(Qux);\\n\"\n    \"}\\n\",\n    \"2:23: \\\"Qux\\\" is not defined.\\n\");\n}\n\n// ===================================================================\n// Test that the output from FileDescriptor::DebugString() (and all other\n// descriptor types) is parseable, and results in the same Descriptor\n// definitions again afoter parsing (not, however, that the order of messages\n// cannot be guaranteed to be the same)\n\ntypedef ParserTest ParseDecriptorDebugTest;\n\nclass CompareDescriptorNames {\n public:\n  bool operator()(const DescriptorProto* left, const DescriptorProto* right) {\n    return left->name() < right->name();\n  }\n};\n\n// Sorts nested DescriptorProtos of a DescriptoProto, by name.\nvoid SortMessages(DescriptorProto *descriptor_proto) {\n  int size = descriptor_proto->nested_type_size();\n  // recursively sort; we can't guarantee the order of nested messages either\n  for (int i = 0; i < size; ++i) {\n    SortMessages(descriptor_proto->mutable_nested_type(i));\n  }\n  DescriptorProto **data =\n    descriptor_proto->mutable_nested_type()->mutable_data();\n  sort(data, data + size, CompareDescriptorNames());\n}\n\n// Sorts DescriptorProtos belonging to a FileDescriptorProto, by name.\nvoid SortMessages(FileDescriptorProto *file_descriptor_proto) {\n  int size = file_descriptor_proto->message_type_size();\n  // recursively sort; we can't guarantee the order of nested messages either\n  for (int i = 0; i < size; ++i) {\n    SortMessages(file_descriptor_proto->mutable_message_type(i));\n  }\n  DescriptorProto **data =\n    file_descriptor_proto->mutable_message_type()->mutable_data();\n  sort(data, data + size, CompareDescriptorNames());\n}\n\nTEST_F(ParseDecriptorDebugTest, TestAllDescriptorTypes) {\n  const FileDescriptor* original_file =\n     protobuf_unittest::TestAllTypes::descriptor()->file();\n  FileDescriptorProto expected;\n  original_file->CopyTo(&expected);\n\n  // Get the DebugString of the unittest.proto FileDecriptor, which includes\n  // all other descriptor types\n  string debug_string = original_file->DebugString();\n\n  // Parse the debug string\n  SetupParser(debug_string.c_str());\n  FileDescriptorProto parsed;\n  parser_->Parse(input_.get(), &parsed);\n  EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type);\n  ASSERT_EQ(\"\", error_collector_.text_);\n\n  // We now have a FileDescriptorProto, but to compare with the expected we\n  // need to link to a FileDecriptor, then output back to a proto. We'll\n  // also need to give it the same name as the original.\n  parsed.set_name(\"google/protobuf/unittest.proto\");\n  // We need the imported dependency before we can build our parsed proto\n  const FileDescriptor* import =\n       protobuf_unittest_import::ImportMessage::descriptor()->file();\n  FileDescriptorProto import_proto;\n  import->CopyTo(&import_proto);\n  ASSERT_TRUE(pool_.BuildFile(import_proto) != NULL);\n  const FileDescriptor* actual = pool_.BuildFile(parsed);\n  parsed.Clear();\n  actual->CopyTo(&parsed);\n  ASSERT_TRUE(actual != NULL);\n\n  // The messages might be in different orders, making them hard to compare.\n  // So, sort the messages in the descriptor protos (including nested messages,\n  // recursively).\n  SortMessages(&expected);\n  SortMessages(&parsed);\n\n  // I really wanted to use StringDiff here for the debug output on fail,\n  // but the strings are too long for it, and if I increase its max size,\n  // we get a memory allocation failure :(\n  EXPECT_EQ(expected.DebugString(), parsed.DebugString());\n}\n\n// ===================================================================\n// SourceCodeInfo tests.\n\n// Follows a path -- as defined by SourceCodeInfo.Location.path -- from a\n// message to a particular sub-field.\n// * If the target is itself a message, sets *output_message to point at it,\n//   *output_field to NULL, and *output_index to -1.\n// * Otherwise, if the target is an element of a repeated field, sets\n//   *output_message to the containing message, *output_field to the descriptor\n//   of the field, and *output_index to the index of the element.\n// * Otherwise, the target is a field (possibly a repeated field, but not any\n//   one element).  Sets *output_message to the containing message,\n//   *output_field to the descriptor of the field, and *output_index to -1.\n// Returns true if the path was valid, false otherwise.  A gTest failure is\n// recorded before returning false.\nbool FollowPath(const Message& root,\n                const int* path_begin, const int* path_end,\n                const Message** output_message,\n                const FieldDescriptor** output_field,\n                int* output_index) {\n  if (path_begin == path_end) {\n    // Path refers to this whole message.\n    *output_message = &root;\n    *output_field = NULL;\n    *output_index = -1;\n    return true;\n  }\n\n  const Descriptor* descriptor = root.GetDescriptor();\n  const Reflection* reflection = root.GetReflection();\n\n  const FieldDescriptor* field = descriptor->FindFieldByNumber(*path_begin);\n\n  if (field == NULL) {\n    ADD_FAILURE() << descriptor->name() << \" has no field number: \"\n                  << *path_begin;\n    return false;\n  }\n\n  ++path_begin;\n\n  if (field->is_repeated()) {\n    if (path_begin == path_end) {\n      // Path refers to the whole repeated field.\n      *output_message = &root;\n      *output_field = field;\n      *output_index = -1;\n      return true;\n    }\n\n    int index = *path_begin++;\n    int size = reflection->FieldSize(root, field);\n\n    if (index >= size) {\n      ADD_FAILURE() << descriptor->name() << \".\" << field->name()\n                    << \" has size \" << size << \", but path contained index: \"\n                    << index;\n      return false;\n    }\n\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      // Descend into child message.\n      const Message& child = reflection->GetRepeatedMessage(root, field, index);\n      return FollowPath(child, path_begin, path_end,\n                        output_message, output_field, output_index);\n    } else if (path_begin == path_end) {\n      // Path refers to this element.\n      *output_message = &root;\n      *output_field = field;\n      *output_index = index;\n      return true;\n    } else {\n      ADD_FAILURE() << descriptor->name() << \".\" << field->name()\n                    << \" is not a message; cannot descend into it.\";\n      return false;\n    }\n  } else {\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      const Message& child = reflection->GetMessage(root, field);\n      return FollowPath(child, path_begin, path_end,\n                        output_message, output_field, output_index);\n    } else if (path_begin == path_end) {\n      // Path refers to this field.\n      *output_message = &root;\n      *output_field = field;\n      *output_index = -1;\n      return true;\n    } else {\n      ADD_FAILURE() << descriptor->name() << \".\" << field->name()\n                    << \" is not a message; cannot descend into it.\";\n      return false;\n    }\n  }\n}\n\n// Split some text on line breaks.  The line breaks are retained in the output,\n// so each line (except the last) ends with a '\\n', and the lines can be\n// concatenated to produce the original text.\n//\n// I couldn't find the proper string utility function for this.  Our\n// split-on-delimiter functions don't include the delimiter in the output.\nvoid SplitLines(const string& text, vector<string>* lines) {\n  string::size_type pos = 0;\n\n  while (pos != string::npos) {\n    string::size_type last_pos = pos;\n    pos = text.find_first_of('\\n', pos);\n    if (pos != string::npos) ++pos;\n    lines->push_back(text.substr(last_pos, pos - last_pos));\n  }\n}\n\n// Look for the given tags in the given text and construct a span (as defined\n// by SourceCodeInfo.Location.span) from them.  E.g. for text like:\n//   /*a*/message /*b*/Foo/*c*/ {}/*d*/\n// There are four tags:  \"a\", \"b\", \"c\", and \"d\".  The constructed span starts\n// immediately after the start tag's trailing '/' and ends immediately before\n// the end tags leading '/'.\nvoid MakeExpectedSpan(const vector<string>& lines,\n                      const string& start_tag, const string& end_tag,\n                      RepeatedField<int>* output) {\n  string start_comment = \"/*\" + start_tag + \"*/\";\n  string end_comment = \"/*\" + end_tag + \"*/\";\n\n  int start_line = -1;\n  int start_column = -1;\n  for (int i = 0; i < lines.size(); i++) {\n    string::size_type pos = lines[i].find(start_comment);\n    if (pos != string::npos) {\n      start_line = i;\n      start_column = pos + start_comment.size();\n      break;\n    }\n  }\n  ASSERT_NE(start_line, -1)\n      << \"Tag \\\"\" << start_comment << \"\\\" not found in text.\";\n\n  int end_line = -1;\n  int end_column = -1;\n  for (int i = start_line; i < lines.size(); i++) {\n    string::size_type pos = lines[i].find(end_comment);\n    if (pos != string::npos) {\n      end_line = i;\n      end_column = pos;\n      break;\n    }\n  }\n  ASSERT_NE(end_line, -1)\n      << \"Tag \\\"\" << end_comment << \"\\\" not found in text.\";\n\n  output->Add(start_line);\n  output->Add(start_column);\n  if (end_line != start_line) output->Add(end_line);\n  output->Add(end_column);\n}\n\n// Check if two spans are equal.\nbool CompareSpans(const RepeatedField<int>& span1,\n                  const RepeatedField<int>& span2) {\n  if (span1.size() != span2.size()) return false;\n  for (int i = 0; i < span1.size(); i++) {\n    if (span1.Get(i) != span2.Get(i)) return false;\n  }\n  return true;\n}\n\n// Test fixture for source info tests, which check that source locations are\n// recorded correctly in FileDescriptorProto.source_code_info.location.\nclass SourceInfoTest : public ParserTest {\n protected:\n  // The parsed file (initialized by Parse()).\n  FileDescriptorProto file_;\n\n  // Parse the given text as a .proto file and populate the spans_ map with\n  // all the source location spans in its SourceCodeInfo table.\n  bool Parse(const char* text) {\n    SetupParser(text);\n    SplitLines(text, &lines_);\n    if (!parser_->Parse(input_.get(), &file_)) {\n      return false;\n    }\n\n    const SourceCodeInfo& source_info = file_.source_code_info();\n    for (int i = 0; i < source_info.location_size(); i++) {\n      const SourceCodeInfo::Location& location = source_info.location(i);\n      const Message* descriptor_proto = NULL;\n      const FieldDescriptor* field = NULL;\n      int index = 0;\n      if (!FollowPath(file_, location.path().begin(), location.path().end(),\n                      &descriptor_proto, &field, &index)) {\n        return false;\n      }\n\n      spans_.insert(make_pair(SpanKey(*descriptor_proto, field, index),\n                              &location));\n    }\n\n    return true;\n  }\n\n  virtual void TearDown() {\n    EXPECT_TRUE(spans_.empty())\n        << \"Forgot to call HasSpan() for:\\n\"\n        << spans_.begin()->second->DebugString();\n  }\n\n  // -----------------------------------------------------------------\n  // HasSpan() checks that the span of source code delimited by the given\n  // tags (comments) correspond via the SourceCodeInfo table to the given\n  // part of the FileDescriptorProto.  (If unclear, look at the actual tests;\n  // it should quickly become obvious.)\n\n  bool HasSpan(const char* start_tag, const char* end_tag,\n               const Message& descriptor_proto) {\n    return HasSpan(start_tag, end_tag, descriptor_proto, NULL, -1);\n  }\n\n  bool HasSpan(const char* start_tag, const char* end_tag,\n               const Message& descriptor_proto, const string& field_name) {\n    return HasSpan(start_tag, end_tag, descriptor_proto, field_name, -1);\n  }\n\n  bool HasSpan(const char* start_tag, const char* end_tag,\n               const Message& descriptor_proto, const string& field_name,\n               int index) {\n    const FieldDescriptor* field =\n        descriptor_proto.GetDescriptor()->FindFieldByName(field_name);\n    if (field == NULL) {\n      ADD_FAILURE() << descriptor_proto.GetDescriptor()->name()\n                    << \" has no such field: \" << field_name;\n      return false;\n    }\n\n    return HasSpan(start_tag, end_tag, descriptor_proto, field, index);\n  }\n\n  bool HasSpan(const Message& descriptor_proto) {\n    return HasSpan(NULL, NULL, descriptor_proto, NULL, -1);\n  }\n\n  bool HasSpan(const Message& descriptor_proto, const string& field_name) {\n    return HasSpan(NULL, NULL, descriptor_proto, field_name, -1);\n  }\n\n  bool HasSpan(const Message& descriptor_proto, const string& field_name,\n               int index) {\n    return HasSpan(NULL, NULL, descriptor_proto, field_name, index);\n  }\n\n  bool HasSpan(const char* start_tag, const char* end_tag,\n               const Message& descriptor_proto, const FieldDescriptor* field,\n               int index) {\n    pair<SpanMap::iterator, SpanMap::iterator> range =\n        spans_.equal_range(SpanKey(descriptor_proto, field, index));\n\n    if (start_tag == NULL) {\n      if (range.first == range.second) {\n        return false;\n      } else {\n        spans_.erase(range.first);\n        return true;\n      }\n    } else {\n      RepeatedField<int> expected_span;\n      MakeExpectedSpan(lines_, start_tag, end_tag, &expected_span);\n\n      for (SpanMap::iterator iter = range.first; iter != range.second; ++iter) {\n        if (CompareSpans(expected_span, iter->second->span())) {\n          spans_.erase(iter);\n          return true;\n        }\n      }\n\n      return false;\n    }\n  }\n\n private:\n  struct SpanKey {\n    const Message* descriptor_proto;\n    const FieldDescriptor* field;\n    int index;\n\n    inline SpanKey() {}\n    inline SpanKey(const Message& descriptor_proto,\n                   const FieldDescriptor* field,\n                   int index)\n        : descriptor_proto(&descriptor_proto), field(field), index(index) {}\n\n    inline bool operator<(const SpanKey& other) const {\n      if (descriptor_proto < other.descriptor_proto) return true;\n      if (descriptor_proto > other.descriptor_proto) return false;\n      if (field < other.field) return true;\n      if (field > other.field) return false;\n      return index < other.index;\n    }\n  };\n\n  typedef multimap<SpanKey, const SourceCodeInfo::Location*> SpanMap;\n  SpanMap spans_;\n  vector<string> lines_;\n};\n\nTEST_F(SourceInfoTest, BasicFileDecls) {\n  EXPECT_TRUE(Parse(\n      \"/*a*/syntax = \\\"proto2\\\";\\n\"\n      \"package /*b*/foo.bar/*c*/;\\n\"\n      \"import /*d*/\\\"baz.proto\\\"/*e*/;\\n\"\n      \"import /*f*/\\\"qux.proto\\\"/*g*/;/*h*/\\n\"\n      \"// comment ignored\\n\"));\n\n  EXPECT_TRUE(HasSpan(\"a\", \"h\", file_));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", file_, \"package\"));\n  EXPECT_TRUE(HasSpan(\"d\", \"e\", file_, \"dependency\", 0));\n  EXPECT_TRUE(HasSpan(\"f\", \"g\", file_, \"dependency\", 1));\n}\n\nTEST_F(SourceInfoTest, Messages) {\n  EXPECT_TRUE(Parse(\n      \"/*a*/message /*b*/Foo/*c*/ {}/*d*/\\n\"\n      \"/*e*/message /*f*/Bar/*g*/ {}/*h*/\\n\"));\n\n  EXPECT_TRUE(HasSpan(\"a\", \"d\", file_.message_type(0)));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", file_.message_type(0), \"name\"));\n  EXPECT_TRUE(HasSpan(\"e\", \"h\", file_.message_type(1)));\n  EXPECT_TRUE(HasSpan(\"f\", \"g\", file_.message_type(1), \"name\"));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n}\n\nTEST_F(SourceInfoTest, Fields) {\n  EXPECT_TRUE(Parse(\n      \"message Foo {\\n\"\n      \"  /*a*/optional/*b*/ /*c*/int32/*d*/ /*e*/bar/*f*/ = /*g*/1/*h*/;/*i*/\\n\"\n      \"  /*j*/repeated/*k*/ /*l*/X.Y/*m*/ /*n*/baz/*o*/ = /*p*/2/*q*/;/*r*/\\n\"\n      \"}\\n\"));\n\n  const FieldDescriptorProto& field1 = file_.message_type(0).field(0);\n  const FieldDescriptorProto& field2 = file_.message_type(0).field(1);\n\n  EXPECT_TRUE(HasSpan(\"a\", \"i\", field1));\n  EXPECT_TRUE(HasSpan(\"a\", \"b\", field1, \"label\"));\n  EXPECT_TRUE(HasSpan(\"c\", \"d\", field1, \"type\"));\n  EXPECT_TRUE(HasSpan(\"e\", \"f\", field1, \"name\"));\n  EXPECT_TRUE(HasSpan(\"g\", \"h\", field1, \"number\"));\n\n  EXPECT_TRUE(HasSpan(\"j\", \"r\", field2));\n  EXPECT_TRUE(HasSpan(\"j\", \"k\", field2, \"label\"));\n  EXPECT_TRUE(HasSpan(\"l\", \"m\", field2, \"type_name\"));\n  EXPECT_TRUE(HasSpan(\"n\", \"o\", field2, \"name\"));\n  EXPECT_TRUE(HasSpan(\"p\", \"q\", field2, \"number\"));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n  EXPECT_TRUE(HasSpan(file_.message_type(0)));\n  EXPECT_TRUE(HasSpan(file_.message_type(0), \"name\"));\n}\n\nTEST_F(SourceInfoTest, Extensions) {\n  EXPECT_TRUE(Parse(\n      \"/*a*/extend /*b*/Foo/*c*/ {\\n\"\n      \"  /*d*/optional/*e*/ int32 bar = 1;/*f*/\\n\"\n      \"  /*g*/repeated/*h*/ X.Y baz = 2;/*i*/\\n\"\n      \"}/*j*/\\n\"\n      \"/*k*/extend /*l*/Bar/*m*/ {\\n\"\n      \"  /*n*/optional int32 qux = 1;/*o*/\\n\"\n      \"}/*p*/\\n\"));\n\n  const FieldDescriptorProto& field1 = file_.extension(0);\n  const FieldDescriptorProto& field2 = file_.extension(1);\n  const FieldDescriptorProto& field3 = file_.extension(2);\n\n  EXPECT_TRUE(HasSpan(\"a\", \"j\", file_, \"extension\"));\n  EXPECT_TRUE(HasSpan(\"k\", \"p\", file_, \"extension\"));\n\n  EXPECT_TRUE(HasSpan(\"d\", \"f\", field1));\n  EXPECT_TRUE(HasSpan(\"d\", \"e\", field1, \"label\"));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", field1, \"extendee\"));\n\n  EXPECT_TRUE(HasSpan(\"g\", \"i\", field2));\n  EXPECT_TRUE(HasSpan(\"g\", \"h\", field2, \"label\"));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", field2, \"extendee\"));\n\n  EXPECT_TRUE(HasSpan(\"n\", \"o\", field3));\n  EXPECT_TRUE(HasSpan(\"l\", \"m\", field3, \"extendee\"));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n  EXPECT_TRUE(HasSpan(field1, \"type\"));\n  EXPECT_TRUE(HasSpan(field1, \"name\"));\n  EXPECT_TRUE(HasSpan(field1, \"number\"));\n  EXPECT_TRUE(HasSpan(field2, \"type_name\"));\n  EXPECT_TRUE(HasSpan(field2, \"name\"));\n  EXPECT_TRUE(HasSpan(field2, \"number\"));\n  EXPECT_TRUE(HasSpan(field3, \"label\"));\n  EXPECT_TRUE(HasSpan(field3, \"type\"));\n  EXPECT_TRUE(HasSpan(field3, \"name\"));\n  EXPECT_TRUE(HasSpan(field3, \"number\"));\n}\n\nTEST_F(SourceInfoTest, NestedExtensions) {\n  EXPECT_TRUE(Parse(\n      \"message Message {\\n\"\n      \"  /*a*/extend /*b*/Foo/*c*/ {\\n\"\n      \"    /*d*/optional/*e*/ int32 bar = 1;/*f*/\\n\"\n      \"    /*g*/repeated/*h*/ X.Y baz = 2;/*i*/\\n\"\n      \"  }/*j*/\\n\"\n      \"  /*k*/extend /*l*/Bar/*m*/ {\\n\"\n      \"    /*n*/optional int32 qux = 1;/*o*/\\n\"\n      \"  }/*p*/\\n\"\n      \"}\\n\"));\n\n  const FieldDescriptorProto& field1 = file_.message_type(0).extension(0);\n  const FieldDescriptorProto& field2 = file_.message_type(0).extension(1);\n  const FieldDescriptorProto& field3 = file_.message_type(0).extension(2);\n\n  EXPECT_TRUE(HasSpan(\"a\", \"j\", file_.message_type(0), \"extension\"));\n  EXPECT_TRUE(HasSpan(\"k\", \"p\", file_.message_type(0), \"extension\"));\n\n  EXPECT_TRUE(HasSpan(\"d\", \"f\", field1));\n  EXPECT_TRUE(HasSpan(\"d\", \"e\", field1, \"label\"));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", field1, \"extendee\"));\n\n  EXPECT_TRUE(HasSpan(\"g\", \"i\", field2));\n  EXPECT_TRUE(HasSpan(\"g\", \"h\", field2, \"label\"));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", field2, \"extendee\"));\n\n  EXPECT_TRUE(HasSpan(\"n\", \"o\", field3));\n  EXPECT_TRUE(HasSpan(\"l\", \"m\", field3, \"extendee\"));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n  EXPECT_TRUE(HasSpan(file_.message_type(0)));\n  EXPECT_TRUE(HasSpan(file_.message_type(0), \"name\"));\n  EXPECT_TRUE(HasSpan(field1, \"type\"));\n  EXPECT_TRUE(HasSpan(field1, \"name\"));\n  EXPECT_TRUE(HasSpan(field1, \"number\"));\n  EXPECT_TRUE(HasSpan(field2, \"type_name\"));\n  EXPECT_TRUE(HasSpan(field2, \"name\"));\n  EXPECT_TRUE(HasSpan(field2, \"number\"));\n  EXPECT_TRUE(HasSpan(field3, \"label\"));\n  EXPECT_TRUE(HasSpan(field3, \"type\"));\n  EXPECT_TRUE(HasSpan(field3, \"name\"));\n  EXPECT_TRUE(HasSpan(field3, \"number\"));\n}\n\nTEST_F(SourceInfoTest, ExtensionRanges) {\n  EXPECT_TRUE(Parse(\n      \"message Message {\\n\"\n      \"  /*a*/extensions /*b*/1/*c*/ to /*d*/4/*e*/, /*f*/6/*g*/;/*h*/\\n\"\n      \"  /*i*/extensions /*j*/8/*k*/ to /*l*/max/*m*/;/*n*/\\n\"\n      \"}\\n\"));\n\n  const DescriptorProto::ExtensionRange& range1 =\n      file_.message_type(0).extension_range(0);\n  const DescriptorProto::ExtensionRange& range2 =\n      file_.message_type(0).extension_range(1);\n  const DescriptorProto::ExtensionRange& range3 =\n      file_.message_type(0).extension_range(2);\n\n  EXPECT_TRUE(HasSpan(\"a\", \"h\", file_.message_type(0), \"extension_range\"));\n  EXPECT_TRUE(HasSpan(\"i\", \"n\", file_.message_type(0), \"extension_range\"));\n\n  EXPECT_TRUE(HasSpan(\"b\", \"e\", range1));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", range1, \"start\"));\n  EXPECT_TRUE(HasSpan(\"d\", \"e\", range1, \"end\"));\n\n  EXPECT_TRUE(HasSpan(\"f\", \"g\", range2));\n  EXPECT_TRUE(HasSpan(\"f\", \"g\", range2, \"start\"));\n  EXPECT_TRUE(HasSpan(\"f\", \"g\", range2, \"end\"));\n\n  EXPECT_TRUE(HasSpan(\"j\", \"m\", range3));\n  EXPECT_TRUE(HasSpan(\"j\", \"k\", range3, \"start\"));\n  EXPECT_TRUE(HasSpan(\"l\", \"m\", range3, \"end\"));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n  EXPECT_TRUE(HasSpan(file_.message_type(0)));\n  EXPECT_TRUE(HasSpan(file_.message_type(0), \"name\"));\n}\n\nTEST_F(SourceInfoTest, NestedMessages) {\n  EXPECT_TRUE(Parse(\n      \"message Foo {\\n\"\n      \"  /*a*/message /*b*/Bar/*c*/ {\\n\"\n      \"    /*d*/message /*e*/Baz/*f*/ {}/*g*/\\n\"\n      \"  }/*h*/\\n\"\n      \"  /*i*/message /*j*/Qux/*k*/ {}/*l*/\\n\"\n      \"}\\n\"));\n\n  const DescriptorProto& bar = file_.message_type(0).nested_type(0);\n  const DescriptorProto& baz = bar.nested_type(0);\n  const DescriptorProto& qux = file_.message_type(0).nested_type(1);\n\n  EXPECT_TRUE(HasSpan(\"a\", \"h\", bar));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", bar, \"name\"));\n  EXPECT_TRUE(HasSpan(\"d\", \"g\", baz));\n  EXPECT_TRUE(HasSpan(\"e\", \"f\", baz, \"name\"));\n  EXPECT_TRUE(HasSpan(\"i\", \"l\", qux));\n  EXPECT_TRUE(HasSpan(\"j\", \"k\", qux, \"name\"));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n  EXPECT_TRUE(HasSpan(file_.message_type(0)));\n  EXPECT_TRUE(HasSpan(file_.message_type(0), \"name\"));\n}\n\nTEST_F(SourceInfoTest, Groups) {\n  EXPECT_TRUE(Parse(\n      \"message Foo {\\n\"\n      \"  message Bar {}\\n\"\n      \"  /*a*/optional/*b*/ /*c*/group/*d*/ /*e*/Baz/*f*/ = /*g*/1/*h*/ {\\n\"\n      \"    /*i*/message Qux {}/*j*/\\n\"\n      \"  }/*k*/\\n\"\n      \"}\\n\"));\n\n  const DescriptorProto& bar = file_.message_type(0).nested_type(0);\n  const DescriptorProto& baz = file_.message_type(0).nested_type(1);\n  const DescriptorProto& qux = baz.nested_type(0);\n  const FieldDescriptorProto& field = file_.message_type(0).field(0);\n\n  EXPECT_TRUE(HasSpan(\"a\", \"k\", field));\n  EXPECT_TRUE(HasSpan(\"a\", \"b\", field, \"label\"));\n  EXPECT_TRUE(HasSpan(\"c\", \"d\", field, \"type\"));\n  EXPECT_TRUE(HasSpan(\"e\", \"f\", field, \"name\"));\n  EXPECT_TRUE(HasSpan(\"e\", \"f\", field, \"type_name\"));\n  EXPECT_TRUE(HasSpan(\"g\", \"h\", field, \"number\"));\n\n  EXPECT_TRUE(HasSpan(\"a\", \"k\", baz));\n  EXPECT_TRUE(HasSpan(\"e\", \"f\", baz, \"name\"));\n  EXPECT_TRUE(HasSpan(\"i\", \"j\", qux));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n  EXPECT_TRUE(HasSpan(file_.message_type(0)));\n  EXPECT_TRUE(HasSpan(file_.message_type(0), \"name\"));\n  EXPECT_TRUE(HasSpan(bar));\n  EXPECT_TRUE(HasSpan(bar, \"name\"));\n  EXPECT_TRUE(HasSpan(qux, \"name\"));\n}\n\nTEST_F(SourceInfoTest, Enums) {\n  EXPECT_TRUE(Parse(\n      \"/*a*/enum /*b*/Foo/*c*/ {}/*d*/\\n\"\n      \"/*e*/enum /*f*/Bar/*g*/ {}/*h*/\\n\"));\n\n  EXPECT_TRUE(HasSpan(\"a\", \"d\", file_.enum_type(0)));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", file_.enum_type(0), \"name\"));\n  EXPECT_TRUE(HasSpan(\"e\", \"h\", file_.enum_type(1)));\n  EXPECT_TRUE(HasSpan(\"f\", \"g\", file_.enum_type(1), \"name\"));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n}\n\nTEST_F(SourceInfoTest, EnumValues) {\n  EXPECT_TRUE(Parse(\n      \"enum Foo {\\n\"\n      \"  /*a*/BAR/*b*/ = /*c*/1/*d*/;/*e*/\\n\"\n      \"  /*f*/BAZ/*g*/ = /*h*/2/*i*/;/*j*/\\n\"\n      \"}\"));\n\n  const EnumValueDescriptorProto& bar = file_.enum_type(0).value(0);\n  const EnumValueDescriptorProto& baz = file_.enum_type(0).value(1);\n\n  EXPECT_TRUE(HasSpan(\"a\", \"e\", bar));\n  EXPECT_TRUE(HasSpan(\"a\", \"b\", bar, \"name\"));\n  EXPECT_TRUE(HasSpan(\"c\", \"d\", bar, \"number\"));\n  EXPECT_TRUE(HasSpan(\"f\", \"j\", baz));\n  EXPECT_TRUE(HasSpan(\"f\", \"g\", baz, \"name\"));\n  EXPECT_TRUE(HasSpan(\"h\", \"i\", baz, \"number\"));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n  EXPECT_TRUE(HasSpan(file_.enum_type(0)));\n  EXPECT_TRUE(HasSpan(file_.enum_type(0), \"name\"));\n}\n\nTEST_F(SourceInfoTest, NestedEnums) {\n  EXPECT_TRUE(Parse(\n      \"message Foo {\\n\"\n      \"  /*a*/enum /*b*/Bar/*c*/ {}/*d*/\\n\"\n      \"  /*e*/enum /*f*/Baz/*g*/ {}/*h*/\\n\"\n      \"}\\n\"));\n\n  const EnumDescriptorProto& bar = file_.message_type(0).enum_type(0);\n  const EnumDescriptorProto& baz = file_.message_type(0).enum_type(1);\n\n  EXPECT_TRUE(HasSpan(\"a\", \"d\", bar));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", bar, \"name\"));\n  EXPECT_TRUE(HasSpan(\"e\", \"h\", baz));\n  EXPECT_TRUE(HasSpan(\"f\", \"g\", baz, \"name\"));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n  EXPECT_TRUE(HasSpan(file_.message_type(0)));\n  EXPECT_TRUE(HasSpan(file_.message_type(0), \"name\"));\n}\n\nTEST_F(SourceInfoTest, Services) {\n  EXPECT_TRUE(Parse(\n      \"/*a*/service /*b*/Foo/*c*/ {}/*d*/\\n\"\n      \"/*e*/service /*f*/Bar/*g*/ {}/*h*/\\n\"));\n\n  EXPECT_TRUE(HasSpan(\"a\", \"d\", file_.service(0)));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", file_.service(0), \"name\"));\n  EXPECT_TRUE(HasSpan(\"e\", \"h\", file_.service(1)));\n  EXPECT_TRUE(HasSpan(\"f\", \"g\", file_.service(1), \"name\"));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n}\n\nTEST_F(SourceInfoTest, Methods) {\n  EXPECT_TRUE(Parse(\n      \"service Foo {\\n\"\n      \"  /*a*/rpc /*b*/Bar/*c*/(/*d*/X/*e*/) returns(/*f*/Y/*g*/);/*h*/\"\n      \"  /*i*/rpc /*j*/Baz/*k*/(/*l*/Z/*m*/) returns(/*n*/W/*o*/);/*p*/\"\n      \"}\"));\n\n  const MethodDescriptorProto& bar = file_.service(0).method(0);\n  const MethodDescriptorProto& baz = file_.service(0).method(1);\n\n  EXPECT_TRUE(HasSpan(\"a\", \"h\", bar));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", bar, \"name\"));\n  EXPECT_TRUE(HasSpan(\"d\", \"e\", bar, \"input_type\"));\n  EXPECT_TRUE(HasSpan(\"f\", \"g\", bar, \"output_type\"));\n\n  EXPECT_TRUE(HasSpan(\"i\", \"p\", baz));\n  EXPECT_TRUE(HasSpan(\"j\", \"k\", baz, \"name\"));\n  EXPECT_TRUE(HasSpan(\"l\", \"m\", baz, \"input_type\"));\n  EXPECT_TRUE(HasSpan(\"n\", \"o\", baz, \"output_type\"));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n  EXPECT_TRUE(HasSpan(file_.service(0)));\n  EXPECT_TRUE(HasSpan(file_.service(0), \"name\"));\n}\n\nTEST_F(SourceInfoTest, Options) {\n  EXPECT_TRUE(Parse(\n      \"/*a*/option /*b*/foo/*c*/./*d*/(/*e*/bar.baz/*f*/)/*g*/ = \"\n          \"/*h*/123/*i*/;/*j*/\\n\"\n      \"/*k*/option qux = /*l*/-123/*m*/;/*n*/\\n\"\n      \"/*o*/option corge = /*p*/abc/*q*/;/*r*/\\n\"\n      \"/*s*/option grault = /*t*/'blah'/*u*/;/*v*/\\n\"\n      \"/*w*/option garply = /*x*/{ yadda yadda }/*y*/;/*z*/\\n\"\n      \"/*0*/option waldo = /*1*/123.0/*2*/;/*3*/\\n\"\n  ));\n\n  const UninterpretedOption& option1 = file_.options().uninterpreted_option(0);\n  const UninterpretedOption& option2 = file_.options().uninterpreted_option(1);\n  const UninterpretedOption& option3 = file_.options().uninterpreted_option(2);\n  const UninterpretedOption& option4 = file_.options().uninterpreted_option(3);\n  const UninterpretedOption& option5 = file_.options().uninterpreted_option(4);\n  const UninterpretedOption& option6 = file_.options().uninterpreted_option(5);\n\n  EXPECT_TRUE(HasSpan(\"a\", \"j\", file_.options()));\n  EXPECT_TRUE(HasSpan(\"b\", \"i\", option1));\n  EXPECT_TRUE(HasSpan(\"b\", \"g\", option1, \"name\"));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", option1.name(0)));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", option1.name(0), \"name_part\"));\n  EXPECT_TRUE(HasSpan(\"d\", \"g\", option1.name(1)));\n  EXPECT_TRUE(HasSpan(\"e\", \"f\", option1.name(1), \"name_part\"));\n  EXPECT_TRUE(HasSpan(\"h\", \"i\", option1, \"positive_int_value\"));\n\n  EXPECT_TRUE(HasSpan(\"k\", \"n\", file_.options()));\n  EXPECT_TRUE(HasSpan(\"l\", \"m\", option2, \"negative_int_value\"));\n\n  EXPECT_TRUE(HasSpan(\"o\", \"r\", file_.options()));\n  EXPECT_TRUE(HasSpan(\"p\", \"q\", option3, \"identifier_value\"));\n\n  EXPECT_TRUE(HasSpan(\"s\", \"v\", file_.options()));\n  EXPECT_TRUE(HasSpan(\"t\", \"u\", option4, \"string_value\"));\n\n  EXPECT_TRUE(HasSpan(\"w\", \"z\", file_.options()));\n  EXPECT_TRUE(HasSpan(\"x\", \"y\", option5, \"aggregate_value\"));\n\n  EXPECT_TRUE(HasSpan(\"0\", \"3\", file_.options()));\n  EXPECT_TRUE(HasSpan(\"1\", \"2\", option6, \"double_value\"));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n  EXPECT_TRUE(HasSpan(option2));\n  EXPECT_TRUE(HasSpan(option3));\n  EXPECT_TRUE(HasSpan(option4));\n  EXPECT_TRUE(HasSpan(option5));\n  EXPECT_TRUE(HasSpan(option6));\n  EXPECT_TRUE(HasSpan(option2, \"name\"));\n  EXPECT_TRUE(HasSpan(option3, \"name\"));\n  EXPECT_TRUE(HasSpan(option4, \"name\"));\n  EXPECT_TRUE(HasSpan(option5, \"name\"));\n  EXPECT_TRUE(HasSpan(option6, \"name\"));\n  EXPECT_TRUE(HasSpan(option2.name(0)));\n  EXPECT_TRUE(HasSpan(option3.name(0)));\n  EXPECT_TRUE(HasSpan(option4.name(0)));\n  EXPECT_TRUE(HasSpan(option5.name(0)));\n  EXPECT_TRUE(HasSpan(option6.name(0)));\n  EXPECT_TRUE(HasSpan(option2.name(0), \"name_part\"));\n  EXPECT_TRUE(HasSpan(option3.name(0), \"name_part\"));\n  EXPECT_TRUE(HasSpan(option4.name(0), \"name_part\"));\n  EXPECT_TRUE(HasSpan(option5.name(0), \"name_part\"));\n  EXPECT_TRUE(HasSpan(option6.name(0), \"name_part\"));\n}\n\nTEST_F(SourceInfoTest, ScopedOptions) {\n  EXPECT_TRUE(Parse(\n    \"message Foo {\\n\"\n    \"  /*a*/option mopt = 1;/*b*/\\n\"\n    \"}\\n\"\n    \"enum Bar {\\n\"\n    \"  /*c*/option eopt = 1;/*d*/\\n\"\n    \"}\\n\"\n    \"service Baz {\\n\"\n    \"  /*e*/option sopt = 1;/*f*/\\n\"\n    \"  rpc M(X) returns(Y) {\\n\"\n    \"    /*g*/option mopt = 1;/*h*/\\n\"\n    \"  }\\n\"\n    \"}\\n\"));\n\n  EXPECT_TRUE(HasSpan(\"a\", \"b\", file_.message_type(0).options()));\n  EXPECT_TRUE(HasSpan(\"c\", \"d\", file_.enum_type(0).options()));\n  EXPECT_TRUE(HasSpan(\"e\", \"f\", file_.service(0).options()));\n  EXPECT_TRUE(HasSpan(\"g\", \"h\", file_.service(0).method(0).options()));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n  EXPECT_TRUE(HasSpan(file_.message_type(0)));\n  EXPECT_TRUE(HasSpan(file_.message_type(0), \"name\"));\n  EXPECT_TRUE(HasSpan(file_.message_type(0).options()\n                      .uninterpreted_option(0)));\n  EXPECT_TRUE(HasSpan(file_.message_type(0).options()\n                      .uninterpreted_option(0), \"name\"));\n  EXPECT_TRUE(HasSpan(file_.message_type(0).options()\n                      .uninterpreted_option(0).name(0)));\n  EXPECT_TRUE(HasSpan(file_.message_type(0).options()\n                      .uninterpreted_option(0).name(0), \"name_part\"));\n  EXPECT_TRUE(HasSpan(file_.message_type(0).options()\n                      .uninterpreted_option(0), \"positive_int_value\"));\n  EXPECT_TRUE(HasSpan(file_.enum_type(0)));\n  EXPECT_TRUE(HasSpan(file_.enum_type(0), \"name\"));\n  EXPECT_TRUE(HasSpan(file_.enum_type(0).options()\n                      .uninterpreted_option(0)));\n  EXPECT_TRUE(HasSpan(file_.enum_type(0).options()\n                      .uninterpreted_option(0), \"name\"));\n  EXPECT_TRUE(HasSpan(file_.enum_type(0).options()\n                      .uninterpreted_option(0).name(0)));\n  EXPECT_TRUE(HasSpan(file_.enum_type(0).options()\n                      .uninterpreted_option(0).name(0), \"name_part\"));\n  EXPECT_TRUE(HasSpan(file_.enum_type(0).options()\n                      .uninterpreted_option(0), \"positive_int_value\"));\n  EXPECT_TRUE(HasSpan(file_.service(0)));\n  EXPECT_TRUE(HasSpan(file_.service(0), \"name\"));\n  EXPECT_TRUE(HasSpan(file_.service(0).method(0)));\n  EXPECT_TRUE(HasSpan(file_.service(0).options()\n                      .uninterpreted_option(0)));\n  EXPECT_TRUE(HasSpan(file_.service(0).options()\n                      .uninterpreted_option(0), \"name\"));\n  EXPECT_TRUE(HasSpan(file_.service(0).options()\n                      .uninterpreted_option(0).name(0)));\n  EXPECT_TRUE(HasSpan(file_.service(0).options()\n                      .uninterpreted_option(0).name(0), \"name_part\"));\n  EXPECT_TRUE(HasSpan(file_.service(0).options()\n                      .uninterpreted_option(0), \"positive_int_value\"));\n  EXPECT_TRUE(HasSpan(file_.service(0).method(0), \"name\"));\n  EXPECT_TRUE(HasSpan(file_.service(0).method(0), \"input_type\"));\n  EXPECT_TRUE(HasSpan(file_.service(0).method(0), \"output_type\"));\n  EXPECT_TRUE(HasSpan(file_.service(0).method(0).options()\n                      .uninterpreted_option(0)));\n  EXPECT_TRUE(HasSpan(file_.service(0).method(0).options()\n                      .uninterpreted_option(0), \"name\"));\n  EXPECT_TRUE(HasSpan(file_.service(0).method(0).options()\n                      .uninterpreted_option(0).name(0)));\n  EXPECT_TRUE(HasSpan(file_.service(0).method(0).options()\n                      .uninterpreted_option(0).name(0), \"name_part\"));\n  EXPECT_TRUE(HasSpan(file_.service(0).method(0).options()\n                      .uninterpreted_option(0), \"positive_int_value\"));\n}\n\nTEST_F(SourceInfoTest, FieldOptions) {\n  // The actual \"name = value\" pairs are parsed by the same code as for\n  // top-level options so we won't re-test that -- just make sure that the\n  // syntax used for field options is understood.\n  EXPECT_TRUE(Parse(\n      \"message Foo {\"\n      \"  optional int32 bar = 1 \"\n          \"/*a*/[default=/*b*/123/*c*/,/*d*/opt1=123/*e*/,\"\n          \"/*f*/opt2='hi'/*g*/]/*h*/;\"\n      \"}\\n\"\n  ));\n\n  const FieldDescriptorProto& field = file_.message_type(0).field(0);\n  const UninterpretedOption& option1 = field.options().uninterpreted_option(0);\n  const UninterpretedOption& option2 = field.options().uninterpreted_option(1);\n\n  EXPECT_TRUE(HasSpan(\"a\", \"h\", field.options()));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", field, \"default_value\"));\n  EXPECT_TRUE(HasSpan(\"d\", \"e\", option1));\n  EXPECT_TRUE(HasSpan(\"f\", \"g\", option2));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n  EXPECT_TRUE(HasSpan(file_.message_type(0)));\n  EXPECT_TRUE(HasSpan(file_.message_type(0), \"name\"));\n  EXPECT_TRUE(HasSpan(field));\n  EXPECT_TRUE(HasSpan(field, \"label\"));\n  EXPECT_TRUE(HasSpan(field, \"type\"));\n  EXPECT_TRUE(HasSpan(field, \"name\"));\n  EXPECT_TRUE(HasSpan(field, \"number\"));\n  EXPECT_TRUE(HasSpan(option1, \"name\"));\n  EXPECT_TRUE(HasSpan(option2, \"name\"));\n  EXPECT_TRUE(HasSpan(option1.name(0)));\n  EXPECT_TRUE(HasSpan(option2.name(0)));\n  EXPECT_TRUE(HasSpan(option1.name(0), \"name_part\"));\n  EXPECT_TRUE(HasSpan(option2.name(0), \"name_part\"));\n  EXPECT_TRUE(HasSpan(option1, \"positive_int_value\"));\n  EXPECT_TRUE(HasSpan(option2, \"string_value\"));\n}\n\nTEST_F(SourceInfoTest, EnumValueOptions) {\n  // The actual \"name = value\" pairs are parsed by the same code as for\n  // top-level options so we won't re-test that -- just make sure that the\n  // syntax used for enum options is understood.\n  EXPECT_TRUE(Parse(\n      \"enum Foo {\"\n      \"  BAR = 1 /*a*/[/*b*/opt1=123/*c*/,/*d*/opt2='hi'/*e*/]/*f*/;\"\n      \"}\\n\"\n  ));\n\n  const EnumValueDescriptorProto& value = file_.enum_type(0).value(0);\n  const UninterpretedOption& option1 = value.options().uninterpreted_option(0);\n  const UninterpretedOption& option2 = value.options().uninterpreted_option(1);\n\n  EXPECT_TRUE(HasSpan(\"a\", \"f\", value.options()));\n  EXPECT_TRUE(HasSpan(\"b\", \"c\", option1));\n  EXPECT_TRUE(HasSpan(\"d\", \"e\", option2));\n\n  // Ignore these.\n  EXPECT_TRUE(HasSpan(file_));\n  EXPECT_TRUE(HasSpan(file_.enum_type(0)));\n  EXPECT_TRUE(HasSpan(file_.enum_type(0), \"name\"));\n  EXPECT_TRUE(HasSpan(value));\n  EXPECT_TRUE(HasSpan(value, \"name\"));\n  EXPECT_TRUE(HasSpan(value, \"number\"));\n  EXPECT_TRUE(HasSpan(option1, \"name\"));\n  EXPECT_TRUE(HasSpan(option2, \"name\"));\n  EXPECT_TRUE(HasSpan(option1.name(0)));\n  EXPECT_TRUE(HasSpan(option2.name(0)));\n  EXPECT_TRUE(HasSpan(option1.name(0), \"name_part\"));\n  EXPECT_TRUE(HasSpan(option2.name(0), \"name_part\"));\n  EXPECT_TRUE(HasSpan(option1, \"positive_int_value\"));\n  EXPECT_TRUE(HasSpan(option2, \"string_value\"));\n}\n\n// ===================================================================\n\n}  // anonymous namespace\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\n#include <google/protobuf/compiler/plugin.h>\n\n#include <iostream>\n#include <set>\n\n#ifdef _WIN32\n#include <io.h>\n#include <fcntl.h>\n#ifndef STDIN_FILENO\n#define STDIN_FILENO 0\n#endif\n#ifndef STDOUT_FILENO\n#define STDOUT_FILENO 1\n#endif\n#else\n#include <unistd.h>\n#endif\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/compiler/plugin.pb.h>\n#include <google/protobuf/compiler/code_generator.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\nclass GeneratorResponseContext : public GeneratorContext {\n public:\n  GeneratorResponseContext(CodeGeneratorResponse* response,\n                           const vector<const FileDescriptor*>& parsed_files)\n      : response_(response),\n        parsed_files_(parsed_files) {}\n  virtual ~GeneratorResponseContext() {}\n\n  // implements GeneratorContext --------------------------------------\n\n  virtual io::ZeroCopyOutputStream* Open(const string& filename) {\n    CodeGeneratorResponse::File* file = response_->add_file();\n    file->set_name(filename);\n    return new io::StringOutputStream(file->mutable_content());\n  }\n\n  virtual io::ZeroCopyOutputStream* OpenForInsert(\n      const string& filename, const string& insertion_point) {\n    CodeGeneratorResponse::File* file = response_->add_file();\n    file->set_name(filename);\n    file->set_insertion_point(insertion_point);\n    return new io::StringOutputStream(file->mutable_content());\n  }\n\n  void ListParsedFiles(vector<const FileDescriptor*>* output) {\n    *output = parsed_files_;\n  }\n\n private:\n  CodeGeneratorResponse* response_;\n  const vector<const FileDescriptor*>& parsed_files_;\n};\n\nint PluginMain(int argc, char* argv[], const CodeGenerator* generator) {\n\n  if (argc > 1) {\n    cerr << argv[0] << \": Unknown option: \" << argv[1] << endl;\n    return 1;\n  }\n\n#ifdef _WIN32\n  _setmode(STDIN_FILENO, _O_BINARY);\n  _setmode(STDOUT_FILENO, _O_BINARY);\n#endif\n\n  CodeGeneratorRequest request;\n  if (!request.ParseFromFileDescriptor(STDIN_FILENO)) {\n    cerr << argv[0] << \": protoc sent unparseable request to plugin.\" << endl;\n    return 1;\n  }\n\n  DescriptorPool pool;\n  for (int i = 0; i < request.proto_file_size(); i++) {\n    const FileDescriptor* file = pool.BuildFile(request.proto_file(i));\n    if (file == NULL) {\n      // BuildFile() already wrote an error message.\n      return 1;\n    }\n  }\n\n  vector<const FileDescriptor*> parsed_files;\n  for (int i = 0; i < request.file_to_generate_size(); i++) {\n    parsed_files.push_back(pool.FindFileByName(request.file_to_generate(i)));\n    if (parsed_files.back() == NULL) {\n      cerr << argv[0] << \": protoc asked plugin to generate a file but \"\n              \"did not provide a descriptor for the file: \"\n           << request.file_to_generate(i) << endl;\n      return 1;\n    }\n  }\n\n  CodeGeneratorResponse response;\n  GeneratorResponseContext context(&response, parsed_files);\n\n  for (int i = 0; i < parsed_files.size(); i++) {\n    const FileDescriptor* file = parsed_files[i];\n\n    string error;\n    bool succeeded = generator->Generate(\n        file, request.parameter(), &context, &error);\n\n    if (!succeeded && error.empty()) {\n      error = \"Code generator returned false but provided no error \"\n              \"description.\";\n    }\n    if (!error.empty()) {\n      response.set_error(file->name() + \": \" + error);\n      break;\n    }\n  }\n\n  if (!response.SerializeToFileDescriptor(STDOUT_FILENO)) {\n    cerr << argv[0] << \": Error writing to stdout.\" << endl;\n    return 1;\n  }\n\n  return 0;\n}\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// Front-end for protoc code generator plugins written in C++.\n//\n// To implement a protoc plugin in C++, simply write an implementation of\n// CodeGenerator, then create a main() function like:\n//   int main(int argc, char* argv[]) {\n//     MyCodeGenerator generator;\n//     return google::protobuf::compiler::PluginMain(argc, argv, &generator);\n//   }\n// You must link your plugin against libprotobuf and libprotoc.\n//\n// To get protoc to use the plugin, do one of the following:\n// * Place the plugin binary somewhere in the PATH and give it the name\n//   \"protoc-gen-NAME\" (replacing \"NAME\" with the name of your plugin).  If you\n//   then invoke protoc with the parameter --NAME_out=OUT_DIR (again, replace\n//   \"NAME\" with your plugin's name), protoc will invoke your plugin to generate\n//   the output, which will be placed in OUT_DIR.\n// * Place the plugin binary anywhere, with any name, and pass the --plugin\n//   parameter to protoc to direct it to your plugin like so:\n//     protoc --plugin=protoc-gen-NAME=path/to/mybinary --NAME_out=OUT_DIR\n//   On Windows, make sure to include the .exe suffix:\n//     protoc --plugin=protoc-gen-NAME=path/to/mybinary.exe --NAME_out=OUT_DIR\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_PLUGIN_H__\n#define GOOGLE_PROTOBUF_COMPILER_PLUGIN_H__\n\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\nclass CodeGenerator;    // code_generator.h\n\n// Implements main() for a protoc plugin exposing the given code generator.\nLIBPROTOC_EXPORT int PluginMain(int argc, char* argv[], const CodeGenerator* generator);\n\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_PLUGIN_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.cc",
    "content": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n\n#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION\n#include \"google/protobuf/compiler/plugin.pb.h\"\n\n#include <algorithm>\n\n#include <google/protobuf/stubs/once.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/wire_format_lite_inl.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/reflection_ops.h>\n#include <google/protobuf/wire_format.h>\n// @@protoc_insertion_point(includes)\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\nnamespace {\n\nconst ::google::protobuf::Descriptor* CodeGeneratorRequest_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  CodeGeneratorRequest_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* CodeGeneratorResponse_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  CodeGeneratorResponse_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* CodeGeneratorResponse_File_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  CodeGeneratorResponse_File_reflection_ = NULL;\n\n}  // namespace\n\n\nvoid protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto() {\n  protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\n  const ::google::protobuf::FileDescriptor* file =\n    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(\n      \"google/protobuf/compiler/plugin.proto\");\n  GOOGLE_CHECK(file != NULL);\n  CodeGeneratorRequest_descriptor_ = file->message_type(0);\n  static const int CodeGeneratorRequest_offsets_[3] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, file_to_generate_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, parameter_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, proto_file_),\n  };\n  CodeGeneratorRequest_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      CodeGeneratorRequest_descriptor_,\n      CodeGeneratorRequest::default_instance_,\n      CodeGeneratorRequest_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(CodeGeneratorRequest));\n  CodeGeneratorResponse_descriptor_ = file->message_type(1);\n  static const int CodeGeneratorResponse_offsets_[2] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse, error_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse, file_),\n  };\n  CodeGeneratorResponse_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      CodeGeneratorResponse_descriptor_,\n      CodeGeneratorResponse::default_instance_,\n      CodeGeneratorResponse_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(CodeGeneratorResponse));\n  CodeGeneratorResponse_File_descriptor_ = CodeGeneratorResponse_descriptor_->nested_type(0);\n  static const int CodeGeneratorResponse_File_offsets_[3] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, name_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, insertion_point_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, content_),\n  };\n  CodeGeneratorResponse_File_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      CodeGeneratorResponse_File_descriptor_,\n      CodeGeneratorResponse_File::default_instance_,\n      CodeGeneratorResponse_File_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(CodeGeneratorResponse_File));\n}\n\nnamespace {\n\nGOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);\ninline void protobuf_AssignDescriptorsOnce() {\n  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,\n                 &protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto);\n}\n\nvoid protobuf_RegisterTypes(const ::std::string&) {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    CodeGeneratorRequest_descriptor_, &CodeGeneratorRequest::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    CodeGeneratorResponse_descriptor_, &CodeGeneratorResponse::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    CodeGeneratorResponse_File_descriptor_, &CodeGeneratorResponse_File::default_instance());\n}\n\n}  // namespace\n\nvoid protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto() {\n  delete CodeGeneratorRequest::default_instance_;\n  delete CodeGeneratorRequest_reflection_;\n  delete CodeGeneratorResponse::default_instance_;\n  delete CodeGeneratorResponse_reflection_;\n  delete CodeGeneratorResponse_File::default_instance_;\n  delete CodeGeneratorResponse_File_reflection_;\n}\n\nvoid protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto() {\n  static bool already_here = false;\n  if (already_here) return;\n  already_here = true;\n  GOOGLE_PROTOBUF_VERIFY_VERSION;\n\n  ::google::protobuf::protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(\n    \"\\n%google/protobuf/compiler/plugin.proto\\022\"\n    \"\\030google.protobuf.compiler\\032 google/protob\"\n    \"uf/descriptor.proto\\\"}\\n\\024CodeGeneratorRequ\"\n    \"est\\022\\030\\n\\020file_to_generate\\030\\001 \\003(\\t\\022\\021\\n\\tparamet\"\n    \"er\\030\\002 \\001(\\t\\0228\\n\\nproto_file\\030\\017 \\003(\\0132$.google.pr\"\n    \"otobuf.FileDescriptorProto\\\"\\252\\001\\n\\025CodeGener\"\n    \"atorResponse\\022\\r\\n\\005error\\030\\001 \\001(\\t\\022B\\n\\004file\\030\\017 \\003(\"\n    \"\\01324.google.protobuf.compiler.CodeGenerat\"\n    \"orResponse.File\\032>\\n\\004File\\022\\014\\n\\004name\\030\\001 \\001(\\t\\022\\027\\n\"\n    \"\\017insertion_point\\030\\002 \\001(\\t\\022\\017\\n\\007content\\030\\017 \\001(\\t\", 399);\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(\n    \"google/protobuf/compiler/plugin.proto\", &protobuf_RegisterTypes);\n  CodeGeneratorRequest::default_instance_ = new CodeGeneratorRequest();\n  CodeGeneratorResponse::default_instance_ = new CodeGeneratorResponse();\n  CodeGeneratorResponse_File::default_instance_ = new CodeGeneratorResponse_File();\n  CodeGeneratorRequest::default_instance_->InitAsDefaultInstance();\n  CodeGeneratorResponse::default_instance_->InitAsDefaultInstance();\n  CodeGeneratorResponse_File::default_instance_->InitAsDefaultInstance();\n  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto);\n}\n\n// Force AddDescriptors() to be called at static initialization time.\nstruct StaticDescriptorInitializer_google_2fprotobuf_2fcompiler_2fplugin_2eproto {\n  StaticDescriptorInitializer_google_2fprotobuf_2fcompiler_2fplugin_2eproto() {\n    protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\n  }\n} static_descriptor_initializer_google_2fprotobuf_2fcompiler_2fplugin_2eproto_;\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int CodeGeneratorRequest::kFileToGenerateFieldNumber;\nconst int CodeGeneratorRequest::kParameterFieldNumber;\nconst int CodeGeneratorRequest::kProtoFileFieldNumber;\n#endif  // !_MSC_VER\n\nCodeGeneratorRequest::CodeGeneratorRequest()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid CodeGeneratorRequest::InitAsDefaultInstance() {\n}\n\nCodeGeneratorRequest::CodeGeneratorRequest(const CodeGeneratorRequest& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid CodeGeneratorRequest::SharedCtor() {\n  _cached_size_ = 0;\n  parameter_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nCodeGeneratorRequest::~CodeGeneratorRequest() {\n  SharedDtor();\n}\n\nvoid CodeGeneratorRequest::SharedDtor() {\n  if (parameter_ != &::google::protobuf::internal::kEmptyString) {\n    delete parameter_;\n  }\n  if (this != default_instance_) {\n  }\n}\n\nvoid CodeGeneratorRequest::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* CodeGeneratorRequest::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return CodeGeneratorRequest_descriptor_;\n}\n\nconst CodeGeneratorRequest& CodeGeneratorRequest::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();  return *default_instance_;\n}\n\nCodeGeneratorRequest* CodeGeneratorRequest::default_instance_ = NULL;\n\nCodeGeneratorRequest* CodeGeneratorRequest::New() const {\n  return new CodeGeneratorRequest;\n}\n\nvoid CodeGeneratorRequest::Clear() {\n  if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) {\n    if (has_parameter()) {\n      if (parameter_ != &::google::protobuf::internal::kEmptyString) {\n        parameter_->clear();\n      }\n    }\n  }\n  file_to_generate_.Clear();\n  proto_file_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool CodeGeneratorRequest::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // repeated string file_to_generate = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_file_to_generate:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->add_file_to_generate()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->file_to_generate(0).data(), this->file_to_generate(0).length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(10)) goto parse_file_to_generate;\n        if (input->ExpectTag(18)) goto parse_parameter;\n        break;\n      }\n      \n      // optional string parameter = 2;\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_parameter:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_parameter()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->parameter().data(), this->parameter().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(122)) goto parse_proto_file;\n        break;\n      }\n      \n      // repeated .google.protobuf.FileDescriptorProto proto_file = 15;\n      case 15: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_proto_file:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_proto_file()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(122)) goto parse_proto_file;\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid CodeGeneratorRequest::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // repeated string file_to_generate = 1;\n  for (int i = 0; i < this->file_to_generate_size(); i++) {\n  ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n    this->file_to_generate(i).data(), this->file_to_generate(i).length(),\n    ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->file_to_generate(i), output);\n  }\n  \n  // optional string parameter = 2;\n  if (has_parameter()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->parameter().data(), this->parameter().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      2, this->parameter(), output);\n  }\n  \n  // repeated .google.protobuf.FileDescriptorProto proto_file = 15;\n  for (int i = 0; i < this->proto_file_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      15, this->proto_file(i), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* CodeGeneratorRequest::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // repeated string file_to_generate = 1;\n  for (int i = 0; i < this->file_to_generate_size(); i++) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->file_to_generate(i).data(), this->file_to_generate(i).length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteStringToArray(1, this->file_to_generate(i), target);\n  }\n  \n  // optional string parameter = 2;\n  if (has_parameter()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->parameter().data(), this->parameter().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        2, this->parameter(), target);\n  }\n  \n  // repeated .google.protobuf.FileDescriptorProto proto_file = 15;\n  for (int i = 0; i < this->proto_file_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        15, this->proto_file(i), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint CodeGeneratorRequest::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) {\n    // optional string parameter = 2;\n    if (has_parameter()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->parameter());\n    }\n    \n  }\n  // repeated string file_to_generate = 1;\n  total_size += 1 * this->file_to_generate_size();\n  for (int i = 0; i < this->file_to_generate_size(); i++) {\n    total_size += ::google::protobuf::internal::WireFormatLite::StringSize(\n      this->file_to_generate(i));\n  }\n  \n  // repeated .google.protobuf.FileDescriptorProto proto_file = 15;\n  total_size += 1 * this->proto_file_size();\n  for (int i = 0; i < this->proto_file_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->proto_file(i));\n  }\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid CodeGeneratorRequest::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const CodeGeneratorRequest* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const CodeGeneratorRequest*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid CodeGeneratorRequest::MergeFrom(const CodeGeneratorRequest& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  file_to_generate_.MergeFrom(from.file_to_generate_);\n  proto_file_.MergeFrom(from.proto_file_);\n  if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) {\n    if (from.has_parameter()) {\n      set_parameter(from.parameter());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid CodeGeneratorRequest::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid CodeGeneratorRequest::CopyFrom(const CodeGeneratorRequest& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool CodeGeneratorRequest::IsInitialized() const {\n  \n  for (int i = 0; i < proto_file_size(); i++) {\n    if (!this->proto_file(i).IsInitialized()) return false;\n  }\n  return true;\n}\n\nvoid CodeGeneratorRequest::Swap(CodeGeneratorRequest* other) {\n  if (other != this) {\n    file_to_generate_.Swap(&other->file_to_generate_);\n    std::swap(parameter_, other->parameter_);\n    proto_file_.Swap(&other->proto_file_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata CodeGeneratorRequest::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = CodeGeneratorRequest_descriptor_;\n  metadata.reflection = CodeGeneratorRequest_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int CodeGeneratorResponse_File::kNameFieldNumber;\nconst int CodeGeneratorResponse_File::kInsertionPointFieldNumber;\nconst int CodeGeneratorResponse_File::kContentFieldNumber;\n#endif  // !_MSC_VER\n\nCodeGeneratorResponse_File::CodeGeneratorResponse_File()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid CodeGeneratorResponse_File::InitAsDefaultInstance() {\n}\n\nCodeGeneratorResponse_File::CodeGeneratorResponse_File(const CodeGeneratorResponse_File& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid CodeGeneratorResponse_File::SharedCtor() {\n  _cached_size_ = 0;\n  name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  insertion_point_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  content_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nCodeGeneratorResponse_File::~CodeGeneratorResponse_File() {\n  SharedDtor();\n}\n\nvoid CodeGeneratorResponse_File::SharedDtor() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    delete name_;\n  }\n  if (insertion_point_ != &::google::protobuf::internal::kEmptyString) {\n    delete insertion_point_;\n  }\n  if (content_ != &::google::protobuf::internal::kEmptyString) {\n    delete content_;\n  }\n  if (this != default_instance_) {\n  }\n}\n\nvoid CodeGeneratorResponse_File::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* CodeGeneratorResponse_File::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return CodeGeneratorResponse_File_descriptor_;\n}\n\nconst CodeGeneratorResponse_File& CodeGeneratorResponse_File::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();  return *default_instance_;\n}\n\nCodeGeneratorResponse_File* CodeGeneratorResponse_File::default_instance_ = NULL;\n\nCodeGeneratorResponse_File* CodeGeneratorResponse_File::New() const {\n  return new CodeGeneratorResponse_File;\n}\n\nvoid CodeGeneratorResponse_File::Clear() {\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (has_name()) {\n      if (name_ != &::google::protobuf::internal::kEmptyString) {\n        name_->clear();\n      }\n    }\n    if (has_insertion_point()) {\n      if (insertion_point_ != &::google::protobuf::internal::kEmptyString) {\n        insertion_point_->clear();\n      }\n    }\n    if (has_content()) {\n      if (content_ != &::google::protobuf::internal::kEmptyString) {\n        content_->clear();\n      }\n    }\n  }\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool CodeGeneratorResponse_File::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // optional string name = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_name()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->name().data(), this->name().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(18)) goto parse_insertion_point;\n        break;\n      }\n      \n      // optional string insertion_point = 2;\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_insertion_point:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_insertion_point()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->insertion_point().data(), this->insertion_point().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(122)) goto parse_content;\n        break;\n      }\n      \n      // optional string content = 15;\n      case 15: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_content:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_content()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->content().data(), this->content().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid CodeGeneratorResponse_File::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->name(), output);\n  }\n  \n  // optional string insertion_point = 2;\n  if (has_insertion_point()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->insertion_point().data(), this->insertion_point().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      2, this->insertion_point(), output);\n  }\n  \n  // optional string content = 15;\n  if (has_content()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->content().data(), this->content().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      15, this->content(), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* CodeGeneratorResponse_File::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        1, this->name(), target);\n  }\n  \n  // optional string insertion_point = 2;\n  if (has_insertion_point()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->insertion_point().data(), this->insertion_point().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        2, this->insertion_point(), target);\n  }\n  \n  // optional string content = 15;\n  if (has_content()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->content().data(), this->content().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        15, this->content(), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint CodeGeneratorResponse_File::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // optional string name = 1;\n    if (has_name()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->name());\n    }\n    \n    // optional string insertion_point = 2;\n    if (has_insertion_point()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->insertion_point());\n    }\n    \n    // optional string content = 15;\n    if (has_content()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->content());\n    }\n    \n  }\n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid CodeGeneratorResponse_File::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const CodeGeneratorResponse_File* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const CodeGeneratorResponse_File*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid CodeGeneratorResponse_File::MergeFrom(const CodeGeneratorResponse_File& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_name()) {\n      set_name(from.name());\n    }\n    if (from.has_insertion_point()) {\n      set_insertion_point(from.insertion_point());\n    }\n    if (from.has_content()) {\n      set_content(from.content());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid CodeGeneratorResponse_File::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid CodeGeneratorResponse_File::CopyFrom(const CodeGeneratorResponse_File& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool CodeGeneratorResponse_File::IsInitialized() const {\n  \n  return true;\n}\n\nvoid CodeGeneratorResponse_File::Swap(CodeGeneratorResponse_File* other) {\n  if (other != this) {\n    std::swap(name_, other->name_);\n    std::swap(insertion_point_, other->insertion_point_);\n    std::swap(content_, other->content_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata CodeGeneratorResponse_File::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = CodeGeneratorResponse_File_descriptor_;\n  metadata.reflection = CodeGeneratorResponse_File_reflection_;\n  return metadata;\n}\n\n\n// -------------------------------------------------------------------\n\n#ifndef _MSC_VER\nconst int CodeGeneratorResponse::kErrorFieldNumber;\nconst int CodeGeneratorResponse::kFileFieldNumber;\n#endif  // !_MSC_VER\n\nCodeGeneratorResponse::CodeGeneratorResponse()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid CodeGeneratorResponse::InitAsDefaultInstance() {\n}\n\nCodeGeneratorResponse::CodeGeneratorResponse(const CodeGeneratorResponse& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid CodeGeneratorResponse::SharedCtor() {\n  _cached_size_ = 0;\n  error_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nCodeGeneratorResponse::~CodeGeneratorResponse() {\n  SharedDtor();\n}\n\nvoid CodeGeneratorResponse::SharedDtor() {\n  if (error_ != &::google::protobuf::internal::kEmptyString) {\n    delete error_;\n  }\n  if (this != default_instance_) {\n  }\n}\n\nvoid CodeGeneratorResponse::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* CodeGeneratorResponse::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return CodeGeneratorResponse_descriptor_;\n}\n\nconst CodeGeneratorResponse& CodeGeneratorResponse::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();  return *default_instance_;\n}\n\nCodeGeneratorResponse* CodeGeneratorResponse::default_instance_ = NULL;\n\nCodeGeneratorResponse* CodeGeneratorResponse::New() const {\n  return new CodeGeneratorResponse;\n}\n\nvoid CodeGeneratorResponse::Clear() {\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (has_error()) {\n      if (error_ != &::google::protobuf::internal::kEmptyString) {\n        error_->clear();\n      }\n    }\n  }\n  file_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool CodeGeneratorResponse::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // optional string error = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_error()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->error().data(), this->error().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(122)) goto parse_file;\n        break;\n      }\n      \n      // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;\n      case 15: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_file:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_file()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(122)) goto parse_file;\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid CodeGeneratorResponse::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // optional string error = 1;\n  if (has_error()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->error().data(), this->error().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->error(), output);\n  }\n  \n  // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;\n  for (int i = 0; i < this->file_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      15, this->file(i), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* CodeGeneratorResponse::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // optional string error = 1;\n  if (has_error()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->error().data(), this->error().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        1, this->error(), target);\n  }\n  \n  // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;\n  for (int i = 0; i < this->file_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        15, this->file(i), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint CodeGeneratorResponse::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // optional string error = 1;\n    if (has_error()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->error());\n    }\n    \n  }\n  // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;\n  total_size += 1 * this->file_size();\n  for (int i = 0; i < this->file_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->file(i));\n  }\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid CodeGeneratorResponse::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const CodeGeneratorResponse* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const CodeGeneratorResponse*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid CodeGeneratorResponse::MergeFrom(const CodeGeneratorResponse& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  file_.MergeFrom(from.file_);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_error()) {\n      set_error(from.error());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid CodeGeneratorResponse::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid CodeGeneratorResponse::CopyFrom(const CodeGeneratorResponse& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool CodeGeneratorResponse::IsInitialized() const {\n  \n  return true;\n}\n\nvoid CodeGeneratorResponse::Swap(CodeGeneratorResponse* other) {\n  if (other != this) {\n    std::swap(error_, other->error_);\n    file_.Swap(&other->file_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata CodeGeneratorResponse::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = CodeGeneratorResponse_descriptor_;\n  metadata.reflection = CodeGeneratorResponse_reflection_;\n  return metadata;\n}\n\n\n// @@protoc_insertion_point(namespace_scope)\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n\n// @@protoc_insertion_point(global_scope)\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.h",
    "content": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n// source: google/protobuf/compiler/plugin.proto\n\n#ifndef PROTOBUF_google_2fprotobuf_2fcompiler_2fplugin_2eproto__INCLUDED\n#define PROTOBUF_google_2fprotobuf_2fcompiler_2fplugin_2eproto__INCLUDED\n\n#include <string>\n\n#include <google/protobuf/stubs/common.h>\n\n#if GOOGLE_PROTOBUF_VERSION < 2004000\n#error This file was generated by a newer version of protoc which is\n#error incompatible with your Protocol Buffer headers.  Please update\n#error your headers.\n#endif\n#if 2004002 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION\n#error This file was generated by an older version of protoc which is\n#error incompatible with your Protocol Buffer headers.  Please\n#error regenerate this file with a newer version of protoc.\n#endif\n\n#include <google/protobuf/generated_message_util.h>\n#include <google/protobuf/repeated_field.h>\n#include <google/protobuf/extension_set.h>\n#include <google/protobuf/generated_message_reflection.h>\n#include \"google/protobuf/descriptor.pb.h\"\n// @@protoc_insertion_point(includes)\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\n// Internal implementation detail -- do not call these.\nvoid LIBPROTOC_EXPORT protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\nvoid protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\nvoid protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\n\nclass CodeGeneratorRequest;\nclass CodeGeneratorResponse;\nclass CodeGeneratorResponse_File;\n\n// ===================================================================\n\nclass LIBPROTOC_EXPORT CodeGeneratorRequest : public ::google::protobuf::Message {\n public:\n  CodeGeneratorRequest();\n  virtual ~CodeGeneratorRequest();\n  \n  CodeGeneratorRequest(const CodeGeneratorRequest& from);\n  \n  inline CodeGeneratorRequest& operator=(const CodeGeneratorRequest& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const CodeGeneratorRequest& default_instance();\n  \n  void Swap(CodeGeneratorRequest* other);\n  \n  // implements Message ----------------------------------------------\n  \n  CodeGeneratorRequest* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const CodeGeneratorRequest& from);\n  void MergeFrom(const CodeGeneratorRequest& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // repeated string file_to_generate = 1;\n  inline int file_to_generate_size() const;\n  inline void clear_file_to_generate();\n  static const int kFileToGenerateFieldNumber = 1;\n  inline const ::std::string& file_to_generate(int index) const;\n  inline ::std::string* mutable_file_to_generate(int index);\n  inline void set_file_to_generate(int index, const ::std::string& value);\n  inline void set_file_to_generate(int index, const char* value);\n  inline void set_file_to_generate(int index, const char* value, size_t size);\n  inline ::std::string* add_file_to_generate();\n  inline void add_file_to_generate(const ::std::string& value);\n  inline void add_file_to_generate(const char* value);\n  inline void add_file_to_generate(const char* value, size_t size);\n  inline const ::google::protobuf::RepeatedPtrField< ::std::string>& file_to_generate() const;\n  inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_file_to_generate();\n  \n  // optional string parameter = 2;\n  inline bool has_parameter() const;\n  inline void clear_parameter();\n  static const int kParameterFieldNumber = 2;\n  inline const ::std::string& parameter() const;\n  inline void set_parameter(const ::std::string& value);\n  inline void set_parameter(const char* value);\n  inline void set_parameter(const char* value, size_t size);\n  inline ::std::string* mutable_parameter();\n  inline ::std::string* release_parameter();\n  \n  // repeated .google.protobuf.FileDescriptorProto proto_file = 15;\n  inline int proto_file_size() const;\n  inline void clear_proto_file();\n  static const int kProtoFileFieldNumber = 15;\n  inline const ::google::protobuf::FileDescriptorProto& proto_file(int index) const;\n  inline ::google::protobuf::FileDescriptorProto* mutable_proto_file(int index);\n  inline ::google::protobuf::FileDescriptorProto* add_proto_file();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >&\n      proto_file() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >*\n      mutable_proto_file();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorRequest)\n private:\n  inline void set_has_parameter();\n  inline void clear_has_parameter();\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::google::protobuf::RepeatedPtrField< ::std::string> file_to_generate_;\n  ::std::string* parameter_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto > proto_file_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32];\n  \n  friend void LIBPROTOC_EXPORT protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\n  \n  void InitAsDefaultInstance();\n  static CodeGeneratorRequest* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOC_EXPORT CodeGeneratorResponse_File : public ::google::protobuf::Message {\n public:\n  CodeGeneratorResponse_File();\n  virtual ~CodeGeneratorResponse_File();\n  \n  CodeGeneratorResponse_File(const CodeGeneratorResponse_File& from);\n  \n  inline CodeGeneratorResponse_File& operator=(const CodeGeneratorResponse_File& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const CodeGeneratorResponse_File& default_instance();\n  \n  void Swap(CodeGeneratorResponse_File* other);\n  \n  // implements Message ----------------------------------------------\n  \n  CodeGeneratorResponse_File* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const CodeGeneratorResponse_File& from);\n  void MergeFrom(const CodeGeneratorResponse_File& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // optional string name = 1;\n  inline bool has_name() const;\n  inline void clear_name();\n  static const int kNameFieldNumber = 1;\n  inline const ::std::string& name() const;\n  inline void set_name(const ::std::string& value);\n  inline void set_name(const char* value);\n  inline void set_name(const char* value, size_t size);\n  inline ::std::string* mutable_name();\n  inline ::std::string* release_name();\n  \n  // optional string insertion_point = 2;\n  inline bool has_insertion_point() const;\n  inline void clear_insertion_point();\n  static const int kInsertionPointFieldNumber = 2;\n  inline const ::std::string& insertion_point() const;\n  inline void set_insertion_point(const ::std::string& value);\n  inline void set_insertion_point(const char* value);\n  inline void set_insertion_point(const char* value, size_t size);\n  inline ::std::string* mutable_insertion_point();\n  inline ::std::string* release_insertion_point();\n  \n  // optional string content = 15;\n  inline bool has_content() const;\n  inline void clear_content();\n  static const int kContentFieldNumber = 15;\n  inline const ::std::string& content() const;\n  inline void set_content(const ::std::string& value);\n  inline void set_content(const char* value);\n  inline void set_content(const char* value, size_t size);\n  inline ::std::string* mutable_content();\n  inline ::std::string* release_content();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse.File)\n private:\n  inline void set_has_name();\n  inline void clear_has_name();\n  inline void set_has_insertion_point();\n  inline void clear_has_insertion_point();\n  inline void set_has_content();\n  inline void clear_has_content();\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::std::string* name_;\n  ::std::string* insertion_point_;\n  ::std::string* content_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32];\n  \n  friend void LIBPROTOC_EXPORT protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\n  \n  void InitAsDefaultInstance();\n  static CodeGeneratorResponse_File* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOC_EXPORT CodeGeneratorResponse : public ::google::protobuf::Message {\n public:\n  CodeGeneratorResponse();\n  virtual ~CodeGeneratorResponse();\n  \n  CodeGeneratorResponse(const CodeGeneratorResponse& from);\n  \n  inline CodeGeneratorResponse& operator=(const CodeGeneratorResponse& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const CodeGeneratorResponse& default_instance();\n  \n  void Swap(CodeGeneratorResponse* other);\n  \n  // implements Message ----------------------------------------------\n  \n  CodeGeneratorResponse* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const CodeGeneratorResponse& from);\n  void MergeFrom(const CodeGeneratorResponse& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  typedef CodeGeneratorResponse_File File;\n  \n  // accessors -------------------------------------------------------\n  \n  // optional string error = 1;\n  inline bool has_error() const;\n  inline void clear_error();\n  static const int kErrorFieldNumber = 1;\n  inline const ::std::string& error() const;\n  inline void set_error(const ::std::string& value);\n  inline void set_error(const char* value);\n  inline void set_error(const char* value, size_t size);\n  inline ::std::string* mutable_error();\n  inline ::std::string* release_error();\n  \n  // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;\n  inline int file_size() const;\n  inline void clear_file();\n  static const int kFileFieldNumber = 15;\n  inline const ::google::protobuf::compiler::CodeGeneratorResponse_File& file(int index) const;\n  inline ::google::protobuf::compiler::CodeGeneratorResponse_File* mutable_file(int index);\n  inline ::google::protobuf::compiler::CodeGeneratorResponse_File* add_file();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >&\n      file() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >*\n      mutable_file();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse)\n private:\n  inline void set_has_error();\n  inline void clear_has_error();\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::std::string* error_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File > file_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32];\n  \n  friend void LIBPROTOC_EXPORT protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto();\n  \n  void InitAsDefaultInstance();\n  static CodeGeneratorResponse* default_instance_;\n};\n// ===================================================================\n\n\n// ===================================================================\n\n// CodeGeneratorRequest\n\n// repeated string file_to_generate = 1;\ninline int CodeGeneratorRequest::file_to_generate_size() const {\n  return file_to_generate_.size();\n}\ninline void CodeGeneratorRequest::clear_file_to_generate() {\n  file_to_generate_.Clear();\n}\ninline const ::std::string& CodeGeneratorRequest::file_to_generate(int index) const {\n  return file_to_generate_.Get(index);\n}\ninline ::std::string* CodeGeneratorRequest::mutable_file_to_generate(int index) {\n  return file_to_generate_.Mutable(index);\n}\ninline void CodeGeneratorRequest::set_file_to_generate(int index, const ::std::string& value) {\n  file_to_generate_.Mutable(index)->assign(value);\n}\ninline void CodeGeneratorRequest::set_file_to_generate(int index, const char* value) {\n  file_to_generate_.Mutable(index)->assign(value);\n}\ninline void CodeGeneratorRequest::set_file_to_generate(int index, const char* value, size_t size) {\n  file_to_generate_.Mutable(index)->assign(\n    reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* CodeGeneratorRequest::add_file_to_generate() {\n  return file_to_generate_.Add();\n}\ninline void CodeGeneratorRequest::add_file_to_generate(const ::std::string& value) {\n  file_to_generate_.Add()->assign(value);\n}\ninline void CodeGeneratorRequest::add_file_to_generate(const char* value) {\n  file_to_generate_.Add()->assign(value);\n}\ninline void CodeGeneratorRequest::add_file_to_generate(const char* value, size_t size) {\n  file_to_generate_.Add()->assign(reinterpret_cast<const char*>(value), size);\n}\ninline const ::google::protobuf::RepeatedPtrField< ::std::string>&\nCodeGeneratorRequest::file_to_generate() const {\n  return file_to_generate_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::std::string>*\nCodeGeneratorRequest::mutable_file_to_generate() {\n  return &file_to_generate_;\n}\n\n// optional string parameter = 2;\ninline bool CodeGeneratorRequest::has_parameter() const {\n  return (_has_bits_[0] & 0x00000002u) != 0;\n}\ninline void CodeGeneratorRequest::set_has_parameter() {\n  _has_bits_[0] |= 0x00000002u;\n}\ninline void CodeGeneratorRequest::clear_has_parameter() {\n  _has_bits_[0] &= ~0x00000002u;\n}\ninline void CodeGeneratorRequest::clear_parameter() {\n  if (parameter_ != &::google::protobuf::internal::kEmptyString) {\n    parameter_->clear();\n  }\n  clear_has_parameter();\n}\ninline const ::std::string& CodeGeneratorRequest::parameter() const {\n  return *parameter_;\n}\ninline void CodeGeneratorRequest::set_parameter(const ::std::string& value) {\n  set_has_parameter();\n  if (parameter_ == &::google::protobuf::internal::kEmptyString) {\n    parameter_ = new ::std::string;\n  }\n  parameter_->assign(value);\n}\ninline void CodeGeneratorRequest::set_parameter(const char* value) {\n  set_has_parameter();\n  if (parameter_ == &::google::protobuf::internal::kEmptyString) {\n    parameter_ = new ::std::string;\n  }\n  parameter_->assign(value);\n}\ninline void CodeGeneratorRequest::set_parameter(const char* value, size_t size) {\n  set_has_parameter();\n  if (parameter_ == &::google::protobuf::internal::kEmptyString) {\n    parameter_ = new ::std::string;\n  }\n  parameter_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* CodeGeneratorRequest::mutable_parameter() {\n  set_has_parameter();\n  if (parameter_ == &::google::protobuf::internal::kEmptyString) {\n    parameter_ = new ::std::string;\n  }\n  return parameter_;\n}\ninline ::std::string* CodeGeneratorRequest::release_parameter() {\n  clear_has_parameter();\n  if (parameter_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = parameter_;\n    parameter_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// repeated .google.protobuf.FileDescriptorProto proto_file = 15;\ninline int CodeGeneratorRequest::proto_file_size() const {\n  return proto_file_.size();\n}\ninline void CodeGeneratorRequest::clear_proto_file() {\n  proto_file_.Clear();\n}\ninline const ::google::protobuf::FileDescriptorProto& CodeGeneratorRequest::proto_file(int index) const {\n  return proto_file_.Get(index);\n}\ninline ::google::protobuf::FileDescriptorProto* CodeGeneratorRequest::mutable_proto_file(int index) {\n  return proto_file_.Mutable(index);\n}\ninline ::google::protobuf::FileDescriptorProto* CodeGeneratorRequest::add_proto_file() {\n  return proto_file_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >&\nCodeGeneratorRequest::proto_file() const {\n  return proto_file_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >*\nCodeGeneratorRequest::mutable_proto_file() {\n  return &proto_file_;\n}\n\n// -------------------------------------------------------------------\n\n// CodeGeneratorResponse_File\n\n// optional string name = 1;\ninline bool CodeGeneratorResponse_File::has_name() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void CodeGeneratorResponse_File::set_has_name() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void CodeGeneratorResponse_File::clear_has_name() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void CodeGeneratorResponse_File::clear_name() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    name_->clear();\n  }\n  clear_has_name();\n}\ninline const ::std::string& CodeGeneratorResponse_File::name() const {\n  return *name_;\n}\ninline void CodeGeneratorResponse_File::set_name(const ::std::string& value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void CodeGeneratorResponse_File::set_name(const char* value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void CodeGeneratorResponse_File::set_name(const char* value, size_t size) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* CodeGeneratorResponse_File::mutable_name() {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  return name_;\n}\ninline ::std::string* CodeGeneratorResponse_File::release_name() {\n  clear_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = name_;\n    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional string insertion_point = 2;\ninline bool CodeGeneratorResponse_File::has_insertion_point() const {\n  return (_has_bits_[0] & 0x00000002u) != 0;\n}\ninline void CodeGeneratorResponse_File::set_has_insertion_point() {\n  _has_bits_[0] |= 0x00000002u;\n}\ninline void CodeGeneratorResponse_File::clear_has_insertion_point() {\n  _has_bits_[0] &= ~0x00000002u;\n}\ninline void CodeGeneratorResponse_File::clear_insertion_point() {\n  if (insertion_point_ != &::google::protobuf::internal::kEmptyString) {\n    insertion_point_->clear();\n  }\n  clear_has_insertion_point();\n}\ninline const ::std::string& CodeGeneratorResponse_File::insertion_point() const {\n  return *insertion_point_;\n}\ninline void CodeGeneratorResponse_File::set_insertion_point(const ::std::string& value) {\n  set_has_insertion_point();\n  if (insertion_point_ == &::google::protobuf::internal::kEmptyString) {\n    insertion_point_ = new ::std::string;\n  }\n  insertion_point_->assign(value);\n}\ninline void CodeGeneratorResponse_File::set_insertion_point(const char* value) {\n  set_has_insertion_point();\n  if (insertion_point_ == &::google::protobuf::internal::kEmptyString) {\n    insertion_point_ = new ::std::string;\n  }\n  insertion_point_->assign(value);\n}\ninline void CodeGeneratorResponse_File::set_insertion_point(const char* value, size_t size) {\n  set_has_insertion_point();\n  if (insertion_point_ == &::google::protobuf::internal::kEmptyString) {\n    insertion_point_ = new ::std::string;\n  }\n  insertion_point_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* CodeGeneratorResponse_File::mutable_insertion_point() {\n  set_has_insertion_point();\n  if (insertion_point_ == &::google::protobuf::internal::kEmptyString) {\n    insertion_point_ = new ::std::string;\n  }\n  return insertion_point_;\n}\ninline ::std::string* CodeGeneratorResponse_File::release_insertion_point() {\n  clear_has_insertion_point();\n  if (insertion_point_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = insertion_point_;\n    insertion_point_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional string content = 15;\ninline bool CodeGeneratorResponse_File::has_content() const {\n  return (_has_bits_[0] & 0x00000004u) != 0;\n}\ninline void CodeGeneratorResponse_File::set_has_content() {\n  _has_bits_[0] |= 0x00000004u;\n}\ninline void CodeGeneratorResponse_File::clear_has_content() {\n  _has_bits_[0] &= ~0x00000004u;\n}\ninline void CodeGeneratorResponse_File::clear_content() {\n  if (content_ != &::google::protobuf::internal::kEmptyString) {\n    content_->clear();\n  }\n  clear_has_content();\n}\ninline const ::std::string& CodeGeneratorResponse_File::content() const {\n  return *content_;\n}\ninline void CodeGeneratorResponse_File::set_content(const ::std::string& value) {\n  set_has_content();\n  if (content_ == &::google::protobuf::internal::kEmptyString) {\n    content_ = new ::std::string;\n  }\n  content_->assign(value);\n}\ninline void CodeGeneratorResponse_File::set_content(const char* value) {\n  set_has_content();\n  if (content_ == &::google::protobuf::internal::kEmptyString) {\n    content_ = new ::std::string;\n  }\n  content_->assign(value);\n}\ninline void CodeGeneratorResponse_File::set_content(const char* value, size_t size) {\n  set_has_content();\n  if (content_ == &::google::protobuf::internal::kEmptyString) {\n    content_ = new ::std::string;\n  }\n  content_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* CodeGeneratorResponse_File::mutable_content() {\n  set_has_content();\n  if (content_ == &::google::protobuf::internal::kEmptyString) {\n    content_ = new ::std::string;\n  }\n  return content_;\n}\ninline ::std::string* CodeGeneratorResponse_File::release_content() {\n  clear_has_content();\n  if (content_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = content_;\n    content_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// -------------------------------------------------------------------\n\n// CodeGeneratorResponse\n\n// optional string error = 1;\ninline bool CodeGeneratorResponse::has_error() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void CodeGeneratorResponse::set_has_error() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void CodeGeneratorResponse::clear_has_error() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void CodeGeneratorResponse::clear_error() {\n  if (error_ != &::google::protobuf::internal::kEmptyString) {\n    error_->clear();\n  }\n  clear_has_error();\n}\ninline const ::std::string& CodeGeneratorResponse::error() const {\n  return *error_;\n}\ninline void CodeGeneratorResponse::set_error(const ::std::string& value) {\n  set_has_error();\n  if (error_ == &::google::protobuf::internal::kEmptyString) {\n    error_ = new ::std::string;\n  }\n  error_->assign(value);\n}\ninline void CodeGeneratorResponse::set_error(const char* value) {\n  set_has_error();\n  if (error_ == &::google::protobuf::internal::kEmptyString) {\n    error_ = new ::std::string;\n  }\n  error_->assign(value);\n}\ninline void CodeGeneratorResponse::set_error(const char* value, size_t size) {\n  set_has_error();\n  if (error_ == &::google::protobuf::internal::kEmptyString) {\n    error_ = new ::std::string;\n  }\n  error_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* CodeGeneratorResponse::mutable_error() {\n  set_has_error();\n  if (error_ == &::google::protobuf::internal::kEmptyString) {\n    error_ = new ::std::string;\n  }\n  return error_;\n}\ninline ::std::string* CodeGeneratorResponse::release_error() {\n  clear_has_error();\n  if (error_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = error_;\n    error_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;\ninline int CodeGeneratorResponse::file_size() const {\n  return file_.size();\n}\ninline void CodeGeneratorResponse::clear_file() {\n  file_.Clear();\n}\ninline const ::google::protobuf::compiler::CodeGeneratorResponse_File& CodeGeneratorResponse::file(int index) const {\n  return file_.Get(index);\n}\ninline ::google::protobuf::compiler::CodeGeneratorResponse_File* CodeGeneratorResponse::mutable_file(int index) {\n  return file_.Mutable(index);\n}\ninline ::google::protobuf::compiler::CodeGeneratorResponse_File* CodeGeneratorResponse::add_file() {\n  return file_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >&\nCodeGeneratorResponse::file() const {\n  return file_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >*\nCodeGeneratorResponse::mutable_file() {\n  return &file_;\n}\n\n\n// @@protoc_insertion_point(namespace_scope)\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n\n#ifndef SWIG\nnamespace google {\nnamespace protobuf {\n\n\n}  // namespace google\n}  // namespace protobuf\n#endif  // SWIG\n\n// @@protoc_insertion_point(global_scope)\n\n#endif  // PROTOBUF_google_2fprotobuf_2fcompiler_2fplugin_2eproto__INCLUDED\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// WARNING:  The plugin interface is currently EXPERIMENTAL and is subject to\n//   change.\n//\n// protoc (aka the Protocol Compiler) can be extended via plugins.  A plugin is\n// just a program that reads a CodeGeneratorRequest from stdin and writes a\n// CodeGeneratorResponse to stdout.\n//\n// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead\n// of dealing with the raw protocol defined here.\n//\n// A plugin executable needs only to be placed somewhere in the path.  The\n// plugin should be named \"protoc-gen-$NAME\", and will then be used when the\n// flag \"--${NAME}_out\" is passed to protoc.\n\npackage google.protobuf.compiler;\n\nimport \"google/protobuf/descriptor.proto\";\n\n// An encoded CodeGeneratorRequest is written to the plugin's stdin.\nmessage CodeGeneratorRequest {\n  // The .proto files that were explicitly listed on the command-line.  The\n  // code generator should generate code only for these files.  Each file's\n  // descriptor will be included in proto_file, below.\n  repeated string file_to_generate = 1;\n\n  // The generator parameter passed on the command-line.\n  optional string parameter = 2;\n\n  // FileDescriptorProtos for all files in files_to_generate and everything\n  // they import.  The files will appear in topological order, so each file\n  // appears before any file that imports it.\n  //\n  // protoc guarantees that all proto_files will be written after\n  // the fields above, even though this is not technically guaranteed by the\n  // protobuf wire format.  This theoretically could allow a plugin to stream\n  // in the FileDescriptorProtos and handle them one by one rather than read\n  // the entire set into memory at once.  However, as of this writing, this\n  // is not similarly optimized on protoc's end -- it will store all fields in\n  // memory at once before sending them to the plugin.\n  repeated FileDescriptorProto proto_file = 15;\n}\n\n// The plugin writes an encoded CodeGeneratorResponse to stdout.\nmessage CodeGeneratorResponse {\n  // Error message.  If non-empty, code generation failed.  The plugin process\n  // should exit with status code zero even if it reports an error in this way.\n  //\n  // This should be used to indicate errors in .proto files which prevent the\n  // code generator from generating correct code.  Errors which indicate a\n  // problem in protoc itself -- such as the input CodeGeneratorRequest being\n  // unparseable -- should be reported by writing a message to stderr and\n  // exiting with a non-zero status code.\n  optional string error = 1;\n\n  // Represents a single generated file.\n  message File {\n    // The file name, relative to the output directory.  The name must not\n    // contain \".\" or \"..\" components and must be relative, not be absolute (so,\n    // the file cannot lie outside the output directory).  \"/\" must be used as\n    // the path separator, not \"\\\".\n    //\n    // If the name is omitted, the content will be appended to the previous\n    // file.  This allows the generator to break large files into small chunks,\n    // and allows the generated text to be streamed back to protoc so that large\n    // files need not reside completely in memory at one time.  Note that as of\n    // this writing protoc does not optimize for this -- it will read the entire\n    // CodeGeneratorResponse before writing files to disk.\n    optional string name = 1;\n\n    // If non-empty, indicates that the named file should already exist, and the\n    // content here is to be inserted into that file at a defined insertion\n    // point.  This feature allows a code generator to extend the output\n    // produced by another code generator.  The original generator may provide\n    // insertion points by placing special annotations in the file that look\n    // like:\n    //   @@protoc_insertion_point(NAME)\n    // The annotation can have arbitrary text before and after it on the line,\n    // which allows it to be placed in a comment.  NAME should be replaced with\n    // an identifier naming the point -- this is what other generators will use\n    // as the insertion_point.  Code inserted at this point will be placed\n    // immediately above the line containing the insertion point (thus multiple\n    // insertions to the same point will come out in the order they were added).\n    // The double-@ is intended to make it unlikely that the generated code\n    // could contain things that look like insertion points by accident.\n    //\n    // For example, the C++ code generator places the following line in the\n    // .pb.h files that it generates:\n    //   // @@protoc_insertion_point(namespace_scope)\n    // This line appears within the scope of the file's package namespace, but\n    // outside of any particular class.  Another plugin can then specify the\n    // insertion_point \"namespace_scope\" to generate additional classes or\n    // other declarations that should be placed in this scope.\n    //\n    // Note that if the line containing the insertion point begins with\n    // whitespace, the same whitespace will be added to every line of the\n    // inserted text.  This is useful for languages like Python, where\n    // indentation matters.  In these languages, the insertion point comment\n    // should be indented the same amount as any inserted code will need to be\n    // in order to work correctly in that context.\n    //\n    // The code generator that generates the initial file and the one which\n    // inserts into it must both run as part of a single invocation of protoc.\n    // Code generators are executed in the order in which they appear on the\n    // command line.\n    //\n    // If |insertion_point| is present, |name| must also be present.\n    optional string insertion_point = 2;\n\n    // The file contents.\n    optional string content = 15;\n  }\n  repeated File file = 15;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: robinson@google.com (Will Robinson)\n//\n// This module outputs pure-Python protocol message classes that will\n// largely be constructed at runtime via the metaclass in reflection.py.\n// In other words, our job is basically to output a Python equivalent\n// of the C++ *Descriptor objects, and fix up all circular references\n// within these objects.\n//\n// Note that the runtime performance of protocol message classes created in\n// this way is expected to be lousy.  The plan is to create an alternate\n// generator that outputs a Python/C extension module that lets\n// performance-minded Python code leverage the fast C++ implementation\n// directly.\n\n#include <limits>\n#include <map>\n#include <utility>\n#include <string>\n#include <vector>\n\n#include <google/protobuf/compiler/python/python_generator.h>\n#include <google/protobuf/descriptor.pb.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace python {\n\nnamespace {\n\n// Returns a copy of |filename| with any trailing \".protodevel\" or \".proto\n// suffix stripped.\n// TODO(robinson): Unify with copy in compiler/cpp/internal/helpers.cc.\nstring StripProto(const string& filename) {\n  const char* suffix = HasSuffixString(filename, \".protodevel\")\n      ? \".protodevel\" : \".proto\";\n  return StripSuffixString(filename, suffix);\n}\n\n\n// Returns the Python module name expected for a given .proto filename.\nstring ModuleName(const string& filename) {\n  string basename = StripProto(filename);\n  StripString(&basename, \"-\", '_');\n  StripString(&basename, \"/\", '.');\n  return basename + \"_pb2\";\n}\n\n\n// Returns the name of all containing types for descriptor,\n// in order from outermost to innermost, followed by descriptor's\n// own name.  Each name is separated by |separator|.\ntemplate <typename DescriptorT>\nstring NamePrefixedWithNestedTypes(const DescriptorT& descriptor,\n                                   const string& separator) {\n  string name = descriptor.name();\n  for (const Descriptor* current = descriptor.containing_type();\n       current != NULL; current = current->containing_type()) {\n    name = current->name() + separator + name;\n  }\n  return name;\n}\n\n\n// Name of the class attribute where we store the Python\n// descriptor.Descriptor instance for the generated class.\n// Must stay consistent with the _DESCRIPTOR_KEY constant\n// in proto2/public/reflection.py.\nconst char kDescriptorKey[] = \"DESCRIPTOR\";\n\n\n// Should we generate generic services for this file?\ninline bool HasGenericServices(const FileDescriptor *file) {\n  return file->service_count() > 0 &&\n         file->options().py_generic_services();\n}\n\n\n// Prints the common boilerplate needed at the top of every .py\n// file output by this generator.\nvoid PrintTopBoilerplate(\n    io::Printer* printer, const FileDescriptor* file, bool descriptor_proto) {\n  // TODO(robinson): Allow parameterization of Python version?\n  printer->Print(\n      \"# Generated by the protocol buffer compiler.  DO NOT EDIT!\\n\"\n      \"\\n\"\n      \"from google.protobuf import descriptor\\n\"\n      \"from google.protobuf import message\\n\"\n      \"from google.protobuf import reflection\\n\");\n  if (HasGenericServices(file)) {\n    printer->Print(\n        \"from google.protobuf import service\\n\"\n        \"from google.protobuf import service_reflection\\n\");\n  }\n\n  // Avoid circular imports if this module is descriptor_pb2.\n  if (!descriptor_proto) {\n    printer->Print(\n        \"from google.protobuf import descriptor_pb2\\n\");\n  }\n  printer->Print(\n    \"# @@protoc_insertion_point(imports)\\n\");\n  printer->Print(\"\\n\\n\");\n}\n\n\n// Returns a Python literal giving the default value for a field.\n// If the field specifies no explicit default value, we'll return\n// the default default value for the field type (zero for numbers,\n// empty string for strings, empty list for repeated fields, and\n// None for non-repeated, composite fields).\n//\n// TODO(robinson): Unify with code from\n// //compiler/cpp/internal/primitive_field.cc\n// //compiler/cpp/internal/enum_field.cc\n// //compiler/cpp/internal/string_field.cc\nstring StringifyDefaultValue(const FieldDescriptor& field) {\n  if (field.is_repeated()) {\n    return \"[]\";\n  }\n\n  switch (field.cpp_type()) {\n    case FieldDescriptor::CPPTYPE_INT32:\n      return SimpleItoa(field.default_value_int32());\n    case FieldDescriptor::CPPTYPE_UINT32:\n      return SimpleItoa(field.default_value_uint32());\n    case FieldDescriptor::CPPTYPE_INT64:\n      return SimpleItoa(field.default_value_int64());\n    case FieldDescriptor::CPPTYPE_UINT64:\n      return SimpleItoa(field.default_value_uint64());\n    case FieldDescriptor::CPPTYPE_DOUBLE: {\n      double value = field.default_value_double();\n      if (value == numeric_limits<double>::infinity()) {\n        // Python pre-2.6 on Windows does not parse \"inf\" correctly.  However,\n        // a numeric literal that is too big for a double will become infinity.\n        return \"1e10000\";\n      } else if (value == -numeric_limits<double>::infinity()) {\n        // See above.\n        return \"-1e10000\";\n      } else if (value != value) {\n        // infinity * 0 = nan\n        return \"(1e10000 * 0)\";\n      } else {\n        return SimpleDtoa(value);\n      }\n    }\n    case FieldDescriptor::CPPTYPE_FLOAT: {\n      float value = field.default_value_float();\n      if (value == numeric_limits<float>::infinity()) {\n        // Python pre-2.6 on Windows does not parse \"inf\" correctly.  However,\n        // a numeric literal that is too big for a double will become infinity.\n        return \"1e10000\";\n      } else if (value == -numeric_limits<float>::infinity()) {\n        // See above.\n        return \"-1e10000\";\n      } else if (value != value) {\n        // infinity - infinity = nan\n        return \"(1e10000 * 0)\";\n      } else {\n        return SimpleFtoa(value);\n      }\n    }\n    case FieldDescriptor::CPPTYPE_BOOL:\n      return field.default_value_bool() ? \"True\" : \"False\";\n    case FieldDescriptor::CPPTYPE_ENUM:\n      return SimpleItoa(field.default_value_enum()->number());\n    case FieldDescriptor::CPPTYPE_STRING:\n      if (field.type() == FieldDescriptor::TYPE_STRING) {\n        return \"unicode(\\\"\" + CEscape(field.default_value_string()) +\n            \"\\\", \\\"utf-8\\\")\";\n      } else {\n        return \"\\\"\" + CEscape(field.default_value_string()) + \"\\\"\";\n      }\n    case FieldDescriptor::CPPTYPE_MESSAGE:\n      return \"None\";\n  }\n  // (We could add a default case above but then we wouldn't get the nice\n  // compiler warning when a new type is added.)\n  GOOGLE_LOG(FATAL) << \"Not reached.\";\n  return \"\";\n}\n\n\n\n}  // namespace\n\n\nGenerator::Generator() : file_(NULL) {\n}\n\nGenerator::~Generator() {\n}\n\nbool Generator::Generate(const FileDescriptor* file,\n                         const string& parameter,\n                         GeneratorContext* context,\n                         string* error) const {\n\n  // Completely serialize all Generate() calls on this instance.  The\n  // thread-safety constraints of the CodeGenerator interface aren't clear so\n  // just be as conservative as possible.  It's easier to relax this later if\n  // we need to, but I doubt it will be an issue.\n  // TODO(kenton):  The proper thing to do would be to allocate any state on\n  //   the stack and use that, so that the Generator class itself does not need\n  //   to have any mutable members.  Then it is implicitly thread-safe.\n  MutexLock lock(&mutex_);\n  file_ = file;\n  string module_name = ModuleName(file->name());\n  string filename = module_name;\n  StripString(&filename, \".\", '/');\n  filename += \".py\";\n\n  FileDescriptorProto fdp;\n  file_->CopyTo(&fdp);\n  fdp.SerializeToString(&file_descriptor_serialized_);\n\n\n  scoped_ptr<io::ZeroCopyOutputStream> output(context->Open(filename));\n  GOOGLE_CHECK(output.get());\n  io::Printer printer(output.get(), '$');\n  printer_ = &printer;\n\n  PrintTopBoilerplate(printer_, file_, GeneratingDescriptorProto());\n  PrintImports();\n  PrintFileDescriptor();\n  PrintTopLevelEnums();\n  PrintTopLevelExtensions();\n  PrintAllNestedEnumsInFile();\n  PrintMessageDescriptors();\n  FixForeignFieldsInDescriptors();\n  PrintMessages();\n  // We have to fix up the extensions after the message classes themselves,\n  // since they need to call static RegisterExtension() methods on these\n  // classes.\n  FixForeignFieldsInExtensions();\n  if (HasGenericServices(file)) {\n    PrintServices();\n  }\n\n  printer.Print(\n    \"# @@protoc_insertion_point(module_scope)\\n\");\n\n  return !printer.failed();\n}\n\n// Prints Python imports for all modules imported by |file|.\nvoid Generator::PrintImports() const {\n  for (int i = 0; i < file_->dependency_count(); ++i) {\n    string module_name = ModuleName(file_->dependency(i)->name());\n    printer_->Print(\"import $module$\\n\", \"module\",\n                    module_name);\n  }\n  printer_->Print(\"\\n\");\n}\n\n// Prints the single file descriptor for this file.\nvoid Generator::PrintFileDescriptor() const {\n  map<string, string> m;\n  m[\"descriptor_name\"] = kDescriptorKey;\n  m[\"name\"] = file_->name();\n  m[\"package\"] = file_->package();\n  const char file_descriptor_template[] =\n      \"$descriptor_name$ = descriptor.FileDescriptor(\\n\"\n      \"  name='$name$',\\n\"\n      \"  package='$package$',\\n\";\n  printer_->Print(m, file_descriptor_template);\n  printer_->Indent();\n  printer_->Print(\n      \"serialized_pb='$value$'\",\n      \"value\", strings::CHexEscape(file_descriptor_serialized_));\n\n  // TODO(falk): Also print options and fix the message_type, enum_type,\n  //             service and extension later in the generation.\n\n  printer_->Outdent();\n  printer_->Print(\")\\n\");\n  printer_->Print(\"\\n\");\n}\n\n// Prints descriptors and module-level constants for all top-level\n// enums defined in |file|.\nvoid Generator::PrintTopLevelEnums() const {\n  vector<pair<string, int> > top_level_enum_values;\n  for (int i = 0; i < file_->enum_type_count(); ++i) {\n    const EnumDescriptor& enum_descriptor = *file_->enum_type(i);\n    PrintEnum(enum_descriptor);\n    printer_->Print(\"\\n\");\n\n    for (int j = 0; j < enum_descriptor.value_count(); ++j) {\n      const EnumValueDescriptor& value_descriptor = *enum_descriptor.value(j);\n      top_level_enum_values.push_back(\n          make_pair(value_descriptor.name(), value_descriptor.number()));\n    }\n  }\n\n  for (int i = 0; i < top_level_enum_values.size(); ++i) {\n    printer_->Print(\"$name$ = $value$\\n\",\n                    \"name\", top_level_enum_values[i].first,\n                    \"value\", SimpleItoa(top_level_enum_values[i].second));\n  }\n  printer_->Print(\"\\n\");\n}\n\n// Prints all enums contained in all message types in |file|.\nvoid Generator::PrintAllNestedEnumsInFile() const {\n  for (int i = 0; i < file_->message_type_count(); ++i) {\n    PrintNestedEnums(*file_->message_type(i));\n  }\n}\n\n// Prints a Python statement assigning the appropriate module-level\n// enum name to a Python EnumDescriptor object equivalent to\n// enum_descriptor.\nvoid Generator::PrintEnum(const EnumDescriptor& enum_descriptor) const {\n  map<string, string> m;\n  m[\"descriptor_name\"] = ModuleLevelDescriptorName(enum_descriptor);\n  m[\"name\"] = enum_descriptor.name();\n  m[\"full_name\"] = enum_descriptor.full_name();\n  m[\"file\"] = kDescriptorKey;\n  const char enum_descriptor_template[] =\n      \"$descriptor_name$ = descriptor.EnumDescriptor(\\n\"\n      \"  name='$name$',\\n\"\n      \"  full_name='$full_name$',\\n\"\n      \"  filename=None,\\n\"\n      \"  file=$file$,\\n\"\n      \"  values=[\\n\";\n  string options_string;\n  enum_descriptor.options().SerializeToString(&options_string);\n  printer_->Print(m, enum_descriptor_template);\n  printer_->Indent();\n  printer_->Indent();\n  for (int i = 0; i < enum_descriptor.value_count(); ++i) {\n    PrintEnumValueDescriptor(*enum_descriptor.value(i));\n    printer_->Print(\",\\n\");\n  }\n  printer_->Outdent();\n  printer_->Print(\"],\\n\");\n  printer_->Print(\"containing_type=None,\\n\");\n  printer_->Print(\"options=$options_value$,\\n\",\n                  \"options_value\",\n                  OptionsValue(\"EnumOptions\", options_string));\n  EnumDescriptorProto edp;\n  PrintSerializedPbInterval(enum_descriptor, edp);\n  printer_->Outdent();\n  printer_->Print(\")\\n\");\n  printer_->Print(\"\\n\");\n}\n\n// Recursively prints enums in nested types within descriptor, then\n// prints enums contained at the top level in descriptor.\nvoid Generator::PrintNestedEnums(const Descriptor& descriptor) const {\n  for (int i = 0; i < descriptor.nested_type_count(); ++i) {\n    PrintNestedEnums(*descriptor.nested_type(i));\n  }\n\n  for (int i = 0; i < descriptor.enum_type_count(); ++i) {\n    PrintEnum(*descriptor.enum_type(i));\n  }\n}\n\nvoid Generator::PrintTopLevelExtensions() const {\n  const bool is_extension = true;\n  for (int i = 0; i < file_->extension_count(); ++i) {\n    const FieldDescriptor& extension_field = *file_->extension(i);\n    string constant_name = extension_field.name() + \"_FIELD_NUMBER\";\n    UpperString(&constant_name);\n    printer_->Print(\"$constant_name$ = $number$\\n\",\n      \"constant_name\", constant_name,\n      \"number\", SimpleItoa(extension_field.number()));\n    printer_->Print(\"$name$ = \", \"name\", extension_field.name());\n    PrintFieldDescriptor(extension_field, is_extension);\n    printer_->Print(\"\\n\");\n  }\n  printer_->Print(\"\\n\");\n}\n\n// Prints Python equivalents of all Descriptors in |file|.\nvoid Generator::PrintMessageDescriptors() const {\n  for (int i = 0; i < file_->message_type_count(); ++i) {\n    PrintDescriptor(*file_->message_type(i));\n    printer_->Print(\"\\n\");\n  }\n}\n\nvoid Generator::PrintServices() const {\n  for (int i = 0; i < file_->service_count(); ++i) {\n    PrintServiceDescriptor(*file_->service(i));\n    PrintServiceClass(*file_->service(i));\n    PrintServiceStub(*file_->service(i));\n    printer_->Print(\"\\n\");\n  }\n}\n\nvoid Generator::PrintServiceDescriptor(\n    const ServiceDescriptor& descriptor) const {\n  printer_->Print(\"\\n\");\n  string service_name = ModuleLevelServiceDescriptorName(descriptor);\n  string options_string;\n  descriptor.options().SerializeToString(&options_string);\n\n  printer_->Print(\n      \"$service_name$ = descriptor.ServiceDescriptor(\\n\",\n      \"service_name\", service_name);\n  printer_->Indent();\n  map<string, string> m;\n  m[\"name\"] = descriptor.name();\n  m[\"full_name\"] = descriptor.full_name();\n  m[\"file\"] = kDescriptorKey;\n  m[\"index\"] = SimpleItoa(descriptor.index());\n  m[\"options_value\"] = OptionsValue(\"ServiceOptions\", options_string);\n  const char required_function_arguments[] =\n      \"name='$name$',\\n\"\n      \"full_name='$full_name$',\\n\"\n      \"file=$file$,\\n\"\n      \"index=$index$,\\n\"\n      \"options=$options_value$,\\n\";\n  printer_->Print(m, required_function_arguments);\n\n  ServiceDescriptorProto sdp;\n  PrintSerializedPbInterval(descriptor, sdp);\n\n  printer_->Print(\"methods=[\\n\");\n  for (int i = 0; i < descriptor.method_count(); ++i) {\n    const MethodDescriptor* method = descriptor.method(i);\n    string options_string;\n    method->options().SerializeToString(&options_string);\n\n    m.clear();\n    m[\"name\"] = method->name();\n    m[\"full_name\"] = method->full_name();\n    m[\"index\"] = SimpleItoa(method->index());\n    m[\"serialized_options\"] = CEscape(options_string);\n    m[\"input_type\"] = ModuleLevelDescriptorName(*(method->input_type()));\n    m[\"output_type\"] = ModuleLevelDescriptorName(*(method->output_type()));\n    m[\"options_value\"] = OptionsValue(\"MethodOptions\", options_string);\n    printer_->Print(\"descriptor.MethodDescriptor(\\n\");\n    printer_->Indent();\n    printer_->Print(\n        m,\n        \"name='$name$',\\n\"\n        \"full_name='$full_name$',\\n\"\n        \"index=$index$,\\n\"\n        \"containing_service=None,\\n\"\n        \"input_type=$input_type$,\\n\"\n        \"output_type=$output_type$,\\n\"\n        \"options=$options_value$,\\n\");\n    printer_->Outdent();\n    printer_->Print(\"),\\n\");\n  }\n\n  printer_->Outdent();\n  printer_->Print(\"])\\n\\n\");\n}\n\nvoid Generator::PrintServiceClass(const ServiceDescriptor& descriptor) const {\n  // Print the service.\n  printer_->Print(\"class $class_name$(service.Service):\\n\",\n                  \"class_name\", descriptor.name());\n  printer_->Indent();\n  printer_->Print(\n      \"__metaclass__ = service_reflection.GeneratedServiceType\\n\"\n      \"$descriptor_key$ = $descriptor_name$\\n\",\n      \"descriptor_key\", kDescriptorKey,\n      \"descriptor_name\", ModuleLevelServiceDescriptorName(descriptor));\n  printer_->Outdent();\n}\n\nvoid Generator::PrintServiceStub(const ServiceDescriptor& descriptor) const {\n  // Print the service stub.\n  printer_->Print(\"class $class_name$_Stub($class_name$):\\n\",\n                  \"class_name\", descriptor.name());\n  printer_->Indent();\n  printer_->Print(\n      \"__metaclass__ = service_reflection.GeneratedServiceStubType\\n\"\n      \"$descriptor_key$ = $descriptor_name$\\n\",\n      \"descriptor_key\", kDescriptorKey,\n      \"descriptor_name\", ModuleLevelServiceDescriptorName(descriptor));\n  printer_->Outdent();\n}\n\n// Prints statement assigning ModuleLevelDescriptorName(message_descriptor)\n// to a Python Descriptor object for message_descriptor.\n//\n// Mutually recursive with PrintNestedDescriptors().\nvoid Generator::PrintDescriptor(const Descriptor& message_descriptor) const {\n  PrintNestedDescriptors(message_descriptor);\n\n  printer_->Print(\"\\n\");\n  printer_->Print(\"$descriptor_name$ = descriptor.Descriptor(\\n\",\n                  \"descriptor_name\",\n                  ModuleLevelDescriptorName(message_descriptor));\n  printer_->Indent();\n  map<string, string> m;\n  m[\"name\"] = message_descriptor.name();\n  m[\"full_name\"] = message_descriptor.full_name();\n  m[\"file\"] = kDescriptorKey;\n  const char required_function_arguments[] =\n      \"name='$name$',\\n\"\n      \"full_name='$full_name$',\\n\"\n      \"filename=None,\\n\"\n      \"file=$file$,\\n\"\n      \"containing_type=None,\\n\";\n  printer_->Print(m, required_function_arguments);\n  PrintFieldsInDescriptor(message_descriptor);\n  PrintExtensionsInDescriptor(message_descriptor);\n\n  // Nested types\n  printer_->Print(\"nested_types=[\");\n  for (int i = 0; i < message_descriptor.nested_type_count(); ++i) {\n    const string nested_name = ModuleLevelDescriptorName(\n        *message_descriptor.nested_type(i));\n    printer_->Print(\"$name$, \", \"name\", nested_name);\n  }\n  printer_->Print(\"],\\n\");\n\n  // Enum types\n  printer_->Print(\"enum_types=[\\n\");\n  printer_->Indent();\n  for (int i = 0; i < message_descriptor.enum_type_count(); ++i) {\n    const string descriptor_name = ModuleLevelDescriptorName(\n        *message_descriptor.enum_type(i));\n    printer_->Print(descriptor_name.c_str());\n    printer_->Print(\",\\n\");\n  }\n  printer_->Outdent();\n  printer_->Print(\"],\\n\");\n  string options_string;\n  message_descriptor.options().SerializeToString(&options_string);\n  printer_->Print(\n      \"options=$options_value$,\\n\"\n      \"is_extendable=$extendable$\",\n      \"options_value\", OptionsValue(\"MessageOptions\", options_string),\n      \"extendable\", message_descriptor.extension_range_count() > 0 ?\n                      \"True\" : \"False\");\n  printer_->Print(\",\\n\");\n\n  // Extension ranges\n  printer_->Print(\"extension_ranges=[\");\n  for (int i = 0; i < message_descriptor.extension_range_count(); ++i) {\n    const Descriptor::ExtensionRange* range =\n        message_descriptor.extension_range(i);\n    printer_->Print(\"($start$, $end$), \",\n                    \"start\", SimpleItoa(range->start),\n                    \"end\", SimpleItoa(range->end));\n  }\n  printer_->Print(\"],\\n\");\n\n  // Serialization of proto\n  DescriptorProto edp;\n  PrintSerializedPbInterval(message_descriptor, edp);\n\n  printer_->Outdent();\n  printer_->Print(\")\\n\");\n}\n\n// Prints Python Descriptor objects for all nested types contained in\n// message_descriptor.\n//\n// Mutually recursive with PrintDescriptor().\nvoid Generator::PrintNestedDescriptors(\n    const Descriptor& containing_descriptor) const {\n  for (int i = 0; i < containing_descriptor.nested_type_count(); ++i) {\n    PrintDescriptor(*containing_descriptor.nested_type(i));\n  }\n}\n\n// Prints all messages in |file|.\nvoid Generator::PrintMessages() const {\n  for (int i = 0; i < file_->message_type_count(); ++i) {\n    PrintMessage(*file_->message_type(i));\n    printer_->Print(\"\\n\");\n  }\n}\n\n// Prints a Python class for the given message descriptor.  We defer to the\n// metaclass to do almost all of the work of actually creating a useful class.\n// The purpose of this function and its many helper functions above is merely\n// to output a Python version of the descriptors, which the metaclass in\n// reflection.py will use to construct the meat of the class itself.\n//\n// Mutually recursive with PrintNestedMessages().\nvoid Generator::PrintMessage(\n    const Descriptor& message_descriptor) const {\n  printer_->Print(\"class $name$(message.Message):\\n\", \"name\",\n                  message_descriptor.name());\n  printer_->Indent();\n  printer_->Print(\"__metaclass__ = reflection.GeneratedProtocolMessageType\\n\");\n  PrintNestedMessages(message_descriptor);\n  map<string, string> m;\n  m[\"descriptor_key\"] = kDescriptorKey;\n  m[\"descriptor_name\"] = ModuleLevelDescriptorName(message_descriptor);\n  printer_->Print(m, \"$descriptor_key$ = $descriptor_name$\\n\");\n\n  printer_->Print(\n    \"\\n\"\n    \"# @@protoc_insertion_point(class_scope:$full_name$)\\n\",\n    \"full_name\", message_descriptor.full_name());\n\n  printer_->Outdent();\n}\n\n// Prints all nested messages within |containing_descriptor|.\n// Mutually recursive with PrintMessage().\nvoid Generator::PrintNestedMessages(\n    const Descriptor& containing_descriptor) const {\n  for (int i = 0; i < containing_descriptor.nested_type_count(); ++i) {\n    printer_->Print(\"\\n\");\n    PrintMessage(*containing_descriptor.nested_type(i));\n  }\n}\n\n// Recursively fixes foreign fields in all nested types in |descriptor|, then\n// sets the message_type and enum_type of all message and enum fields to point\n// to their respective descriptors.\n// Args:\n//   descriptor: descriptor to print fields for.\n//   containing_descriptor: if descriptor is a nested type, this is its\n//       containing type, or NULL if this is a root/top-level type.\nvoid Generator::FixForeignFieldsInDescriptor(\n    const Descriptor& descriptor,\n    const Descriptor* containing_descriptor) const {\n  for (int i = 0; i < descriptor.nested_type_count(); ++i) {\n    FixForeignFieldsInDescriptor(*descriptor.nested_type(i), &descriptor);\n  }\n\n  for (int i = 0; i < descriptor.field_count(); ++i) {\n    const FieldDescriptor& field_descriptor = *descriptor.field(i);\n    FixForeignFieldsInField(&descriptor, field_descriptor, \"fields_by_name\");\n  }\n\n  FixContainingTypeInDescriptor(descriptor, containing_descriptor);\n  for (int i = 0; i < descriptor.enum_type_count(); ++i) {\n    const EnumDescriptor& enum_descriptor = *descriptor.enum_type(i);\n    FixContainingTypeInDescriptor(enum_descriptor, &descriptor);\n  }\n}\n\nvoid Generator::AddMessageToFileDescriptor(const Descriptor& descriptor) const {\n  map<string, string> m;\n  m[\"descriptor_name\"] = kDescriptorKey;\n  m[\"message_name\"] = descriptor.name();\n  m[\"message_descriptor_name\"] = ModuleLevelDescriptorName(descriptor);\n  const char file_descriptor_template[] =\n      \"$descriptor_name$.message_types_by_name['$message_name$'] = \"\n      \"$message_descriptor_name$\\n\";\n  printer_->Print(m, file_descriptor_template);\n}\n\n// Sets any necessary message_type and enum_type attributes\n// for the Python version of |field|.\n//\n// containing_type may be NULL, in which case this is a module-level field.\n//\n// python_dict_name is the name of the Python dict where we should\n// look the field up in the containing type.  (e.g., fields_by_name\n// or extensions_by_name).  We ignore python_dict_name if containing_type\n// is NULL.\nvoid Generator::FixForeignFieldsInField(const Descriptor* containing_type,\n                                        const FieldDescriptor& field,\n                                        const string& python_dict_name) const {\n  const string field_referencing_expression = FieldReferencingExpression(\n      containing_type, field, python_dict_name);\n  map<string, string> m;\n  m[\"field_ref\"] = field_referencing_expression;\n  const Descriptor* foreign_message_type = field.message_type();\n  if (foreign_message_type) {\n    m[\"foreign_type\"] = ModuleLevelDescriptorName(*foreign_message_type);\n    printer_->Print(m, \"$field_ref$.message_type = $foreign_type$\\n\");\n  }\n  const EnumDescriptor* enum_type = field.enum_type();\n  if (enum_type) {\n    m[\"enum_type\"] = ModuleLevelDescriptorName(*enum_type);\n    printer_->Print(m, \"$field_ref$.enum_type = $enum_type$\\n\");\n  }\n}\n\n// Returns the module-level expression for the given FieldDescriptor.\n// Only works for fields in the .proto file this Generator is generating for.\n//\n// containing_type may be NULL, in which case this is a module-level field.\n//\n// python_dict_name is the name of the Python dict where we should\n// look the field up in the containing type.  (e.g., fields_by_name\n// or extensions_by_name).  We ignore python_dict_name if containing_type\n// is NULL.\nstring Generator::FieldReferencingExpression(\n    const Descriptor* containing_type,\n    const FieldDescriptor& field,\n    const string& python_dict_name) const {\n  // We should only ever be looking up fields in the current file.\n  // The only things we refer to from other files are message descriptors.\n  GOOGLE_CHECK_EQ(field.file(), file_) << field.file()->name() << \" vs. \"\n                                << file_->name();\n  if (!containing_type) {\n    return field.name();\n  }\n  return strings::Substitute(\n      \"$0.$1['$2']\",\n      ModuleLevelDescriptorName(*containing_type),\n      python_dict_name, field.name());\n}\n\n// Prints containing_type for nested descriptors or enum descriptors.\ntemplate <typename DescriptorT>\nvoid Generator::FixContainingTypeInDescriptor(\n    const DescriptorT& descriptor,\n    const Descriptor* containing_descriptor) const {\n  if (containing_descriptor != NULL) {\n    const string nested_name = ModuleLevelDescriptorName(descriptor);\n    const string parent_name = ModuleLevelDescriptorName(\n        *containing_descriptor);\n    printer_->Print(\n        \"$nested_name$.containing_type = $parent_name$;\\n\",\n        \"nested_name\", nested_name,\n        \"parent_name\", parent_name);\n  }\n}\n\n// Prints statements setting the message_type and enum_type fields in the\n// Python descriptor objects we've already output in ths file.  We must\n// do this in a separate step due to circular references (otherwise, we'd\n// just set everything in the initial assignment statements).\nvoid Generator::FixForeignFieldsInDescriptors() const {\n  for (int i = 0; i < file_->message_type_count(); ++i) {\n    FixForeignFieldsInDescriptor(*file_->message_type(i), NULL);\n  }\n  for (int i = 0; i < file_->message_type_count(); ++i) {\n    AddMessageToFileDescriptor(*file_->message_type(i));\n  }\n  printer_->Print(\"\\n\");\n}\n\n// We need to not only set any necessary message_type fields, but\n// also need to call RegisterExtension() on each message we're\n// extending.\nvoid Generator::FixForeignFieldsInExtensions() const {\n  // Top-level extensions.\n  for (int i = 0; i < file_->extension_count(); ++i) {\n    FixForeignFieldsInExtension(*file_->extension(i));\n  }\n  // Nested extensions.\n  for (int i = 0; i < file_->message_type_count(); ++i) {\n    FixForeignFieldsInNestedExtensions(*file_->message_type(i));\n  }\n}\n\nvoid Generator::FixForeignFieldsInExtension(\n    const FieldDescriptor& extension_field) const {\n  GOOGLE_CHECK(extension_field.is_extension());\n  // extension_scope() will be NULL for top-level extensions, which is\n  // exactly what FixForeignFieldsInField() wants.\n  FixForeignFieldsInField(extension_field.extension_scope(), extension_field,\n                          \"extensions_by_name\");\n\n  map<string, string> m;\n  // Confusingly, for FieldDescriptors that happen to be extensions,\n  // containing_type() means \"extended type.\"\n  // On the other hand, extension_scope() will give us what we normally\n  // mean by containing_type().\n  m[\"extended_message_class\"] = ModuleLevelMessageName(\n      *extension_field.containing_type());\n  m[\"field\"] = FieldReferencingExpression(extension_field.extension_scope(),\n                                          extension_field,\n                                          \"extensions_by_name\");\n  printer_->Print(m, \"$extended_message_class$.RegisterExtension($field$)\\n\");\n}\n\nvoid Generator::FixForeignFieldsInNestedExtensions(\n    const Descriptor& descriptor) const {\n  // Recursively fix up extensions in all nested types.\n  for (int i = 0; i < descriptor.nested_type_count(); ++i) {\n    FixForeignFieldsInNestedExtensions(*descriptor.nested_type(i));\n  }\n  // Fix up extensions directly contained within this type.\n  for (int i = 0; i < descriptor.extension_count(); ++i) {\n    FixForeignFieldsInExtension(*descriptor.extension(i));\n  }\n}\n\n// Returns a Python expression that instantiates a Python EnumValueDescriptor\n// object for the given C++ descriptor.\nvoid Generator::PrintEnumValueDescriptor(\n    const EnumValueDescriptor& descriptor) const {\n  // TODO(robinson): Fix up EnumValueDescriptor \"type\" fields.\n  // More circular references.  ::sigh::\n  string options_string;\n  descriptor.options().SerializeToString(&options_string);\n  map<string, string> m;\n  m[\"name\"] = descriptor.name();\n  m[\"index\"] = SimpleItoa(descriptor.index());\n  m[\"number\"] = SimpleItoa(descriptor.number());\n  m[\"options\"] = OptionsValue(\"EnumValueOptions\", options_string);\n  printer_->Print(\n      m,\n      \"descriptor.EnumValueDescriptor(\\n\"\n      \"  name='$name$', index=$index$, number=$number$,\\n\"\n      \"  options=$options$,\\n\"\n      \"  type=None)\");\n}\n\n// Returns a Python expression that calls descriptor._ParseOptions using\n// the given descriptor class name and serialized options protobuf string.\nstring Generator::OptionsValue(\n    const string& class_name, const string& serialized_options) const {\n  if (serialized_options.length() == 0 || GeneratingDescriptorProto()) {\n    return \"None\";\n  } else {\n    string full_class_name = \"descriptor_pb2.\" + class_name;\n    return \"descriptor._ParseOptions(\" + full_class_name + \"(), '\"\n        + CEscape(serialized_options)+ \"')\";\n  }\n}\n\n// Prints an expression for a Python FieldDescriptor for |field|.\nvoid Generator::PrintFieldDescriptor(\n    const FieldDescriptor& field, bool is_extension) const {\n  string options_string;\n  field.options().SerializeToString(&options_string);\n  map<string, string> m;\n  m[\"name\"] = field.name();\n  m[\"full_name\"] = field.full_name();\n  m[\"index\"] = SimpleItoa(field.index());\n  m[\"number\"] = SimpleItoa(field.number());\n  m[\"type\"] = SimpleItoa(field.type());\n  m[\"cpp_type\"] = SimpleItoa(field.cpp_type());\n  m[\"label\"] = SimpleItoa(field.label());\n  m[\"has_default_value\"] = field.has_default_value() ? \"True\" : \"False\";\n  m[\"default_value\"] = StringifyDefaultValue(field);\n  m[\"is_extension\"] = is_extension ? \"True\" : \"False\";\n  m[\"options\"] = OptionsValue(\"FieldOptions\", options_string);\n  // We always set message_type and enum_type to None at this point, and then\n  // these fields in correctly after all referenced descriptors have been\n  // defined and/or imported (see FixForeignFieldsInDescriptors()).\n  const char field_descriptor_decl[] =\n    \"descriptor.FieldDescriptor(\\n\"\n    \"  name='$name$', full_name='$full_name$', index=$index$,\\n\"\n    \"  number=$number$, type=$type$, cpp_type=$cpp_type$, label=$label$,\\n\"\n    \"  has_default_value=$has_default_value$, default_value=$default_value$,\\n\"\n    \"  message_type=None, enum_type=None, containing_type=None,\\n\"\n    \"  is_extension=$is_extension$, extension_scope=None,\\n\"\n    \"  options=$options$)\";\n  printer_->Print(m, field_descriptor_decl);\n}\n\n// Helper for Print{Fields,Extensions}InDescriptor().\nvoid Generator::PrintFieldDescriptorsInDescriptor(\n    const Descriptor& message_descriptor,\n    bool is_extension,\n    const string& list_variable_name,\n    int (Descriptor::*CountFn)() const,\n    const FieldDescriptor* (Descriptor::*GetterFn)(int) const) const {\n  printer_->Print(\"$list$=[\\n\", \"list\", list_variable_name);\n  printer_->Indent();\n  for (int i = 0; i < (message_descriptor.*CountFn)(); ++i) {\n    PrintFieldDescriptor(*(message_descriptor.*GetterFn)(i),\n                         is_extension);\n    printer_->Print(\",\\n\");\n  }\n  printer_->Outdent();\n  printer_->Print(\"],\\n\");\n}\n\n// Prints a statement assigning \"fields\" to a list of Python FieldDescriptors,\n// one for each field present in message_descriptor.\nvoid Generator::PrintFieldsInDescriptor(\n    const Descriptor& message_descriptor) const {\n  const bool is_extension = false;\n  PrintFieldDescriptorsInDescriptor(\n      message_descriptor, is_extension, \"fields\",\n      &Descriptor::field_count, &Descriptor::field);\n}\n\n// Prints a statement assigning \"extensions\" to a list of Python\n// FieldDescriptors, one for each extension present in message_descriptor.\nvoid Generator::PrintExtensionsInDescriptor(\n    const Descriptor& message_descriptor) const {\n  const bool is_extension = true;\n  PrintFieldDescriptorsInDescriptor(\n      message_descriptor, is_extension, \"extensions\",\n      &Descriptor::extension_count, &Descriptor::extension);\n}\n\nbool Generator::GeneratingDescriptorProto() const {\n  return file_->name() == \"google/protobuf/descriptor.proto\";\n}\n\n// Returns the unique Python module-level identifier given to a descriptor.\n// This name is module-qualified iff the given descriptor describes an\n// entity that doesn't come from the current file.\ntemplate <typename DescriptorT>\nstring Generator::ModuleLevelDescriptorName(\n    const DescriptorT& descriptor) const {\n  // FIXME(robinson):\n  // We currently don't worry about collisions with underscores in the type\n  // names, so these would collide in nasty ways if found in the same file:\n  //   OuterProto.ProtoA.ProtoB\n  //   OuterProto_ProtoA.ProtoB  # Underscore instead of period.\n  // As would these:\n  //   OuterProto.ProtoA_.ProtoB\n  //   OuterProto.ProtoA._ProtoB  # Leading vs. trailing underscore.\n  // (Contrived, but certainly possible).\n  //\n  // The C++ implementation doesn't guard against this either.  Leaving\n  // it for now...\n  string name = NamePrefixedWithNestedTypes(descriptor, \"_\");\n  UpperString(&name);\n  // Module-private for now.  Easy to make public later; almost impossible\n  // to make private later.\n  name = \"_\" + name;\n  // We now have the name relative to its own module.  Also qualify with\n  // the module name iff this descriptor is from a different .proto file.\n  if (descriptor.file() != file_) {\n    name = ModuleName(descriptor.file()->name()) + \".\" + name;\n  }\n  return name;\n}\n\n// Returns the name of the message class itself, not the descriptor.\n// Like ModuleLevelDescriptorName(), module-qualifies the name iff\n// the given descriptor describes an entity that doesn't come from\n// the current file.\nstring Generator::ModuleLevelMessageName(const Descriptor& descriptor) const {\n  string name = NamePrefixedWithNestedTypes(descriptor, \".\");\n  if (descriptor.file() != file_) {\n    name = ModuleName(descriptor.file()->name()) + \".\" + name;\n  }\n  return name;\n}\n\n// Returns the unique Python module-level identifier given to a service\n// descriptor.\nstring Generator::ModuleLevelServiceDescriptorName(\n    const ServiceDescriptor& descriptor) const {\n  string name = descriptor.name();\n  UpperString(&name);\n  name = \"_\" + name;\n  if (descriptor.file() != file_) {\n    name = ModuleName(descriptor.file()->name()) + \".\" + name;\n  }\n  return name;\n}\n\n// Prints standard constructor arguments serialized_start and serialized_end.\n// Args:\n//   descriptor: The cpp descriptor to have a serialized reference.\n//   proto: A proto\n// Example printer output:\n// serialized_start=41,\n// serialized_end=43,\n//\ntemplate <typename DescriptorT, typename DescriptorProtoT>\nvoid Generator::PrintSerializedPbInterval(\n    const DescriptorT& descriptor, DescriptorProtoT& proto) const {\n  descriptor.CopyTo(&proto);\n  string sp;\n  proto.SerializeToString(&sp);\n  int offset = file_descriptor_serialized_.find(sp);\n  GOOGLE_CHECK_GE(offset, 0);\n\n  printer_->Print(\"serialized_start=$serialized_start$,\\n\"\n                  \"serialized_end=$serialized_end$,\\n\",\n                  \"serialized_start\", SimpleItoa(offset),\n                  \"serialized_end\", SimpleItoa(offset + sp.size()));\n}\n\n}  // namespace python\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: robinson@google.com (Will Robinson)\n//\n// Generates Python code for a given .proto file.\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_PYTHON_GENERATOR_H__\n#define GOOGLE_PROTOBUF_COMPILER_PYTHON_GENERATOR_H__\n\n#include <string>\n\n#include <google/protobuf/compiler/code_generator.h>\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\n\nclass Descriptor;\nclass EnumDescriptor;\nclass EnumValueDescriptor;\nclass FieldDescriptor;\nclass ServiceDescriptor;\n\nnamespace io { class Printer; }\n\nnamespace compiler {\nnamespace python {\n\n// CodeGenerator implementation for generated Python protocol buffer classes.\n// If you create your own protocol compiler binary and you want it to support\n// Python output, you can do so by registering an instance of this\n// CodeGenerator with the CommandLineInterface in your main() function.\nclass LIBPROTOC_EXPORT Generator : public CodeGenerator {\n public:\n  Generator();\n  virtual ~Generator();\n\n  // CodeGenerator methods.\n  virtual bool Generate(const FileDescriptor* file,\n                        const string& parameter,\n                        GeneratorContext* generator_context,\n                        string* error) const;\n\n private:\n  void PrintImports() const;\n  void PrintFileDescriptor() const;\n  void PrintTopLevelEnums() const;\n  void PrintAllNestedEnumsInFile() const;\n  void PrintNestedEnums(const Descriptor& descriptor) const;\n  void PrintEnum(const EnumDescriptor& enum_descriptor) const;\n\n  void PrintTopLevelExtensions() const;\n\n  void PrintFieldDescriptor(\n      const FieldDescriptor& field, bool is_extension) const;\n  void PrintFieldDescriptorsInDescriptor(\n      const Descriptor& message_descriptor,\n      bool is_extension,\n      const string& list_variable_name,\n      int (Descriptor::*CountFn)() const,\n      const FieldDescriptor* (Descriptor::*GetterFn)(int) const) const;\n  void PrintFieldsInDescriptor(const Descriptor& message_descriptor) const;\n  void PrintExtensionsInDescriptor(const Descriptor& message_descriptor) const;\n  void PrintMessageDescriptors() const;\n  void PrintDescriptor(const Descriptor& message_descriptor) const;\n  void PrintNestedDescriptors(const Descriptor& containing_descriptor) const;\n\n  void PrintMessages() const;\n  void PrintMessage(const Descriptor& message_descriptor) const;\n  void PrintNestedMessages(const Descriptor& containing_descriptor) const;\n\n  void FixForeignFieldsInDescriptors() const;\n  void FixForeignFieldsInDescriptor(\n      const Descriptor& descriptor,\n      const Descriptor* containing_descriptor) const;\n  void FixForeignFieldsInField(const Descriptor* containing_type,\n                               const FieldDescriptor& field,\n                               const string& python_dict_name) const;\n  void AddMessageToFileDescriptor(const Descriptor& descriptor) const;\n  string FieldReferencingExpression(const Descriptor* containing_type,\n                                    const FieldDescriptor& field,\n                                    const string& python_dict_name) const;\n  template <typename DescriptorT>\n  void FixContainingTypeInDescriptor(\n      const DescriptorT& descriptor,\n      const Descriptor* containing_descriptor) const;\n\n  void FixForeignFieldsInExtensions() const;\n  void FixForeignFieldsInExtension(\n      const FieldDescriptor& extension_field) const;\n  void FixForeignFieldsInNestedExtensions(const Descriptor& descriptor) const;\n\n  void PrintServices() const;\n  void PrintServiceDescriptor(const ServiceDescriptor& descriptor) const;\n  void PrintServiceClass(const ServiceDescriptor& descriptor) const;\n  void PrintServiceStub(const ServiceDescriptor& descriptor) const;\n\n  void PrintEnumValueDescriptor(const EnumValueDescriptor& descriptor) const;\n  string OptionsValue(const string& class_name,\n                      const string& serialized_options) const;\n  bool GeneratingDescriptorProto() const;\n\n  template <typename DescriptorT>\n  string ModuleLevelDescriptorName(const DescriptorT& descriptor) const;\n  string ModuleLevelMessageName(const Descriptor& descriptor) const;\n  string ModuleLevelServiceDescriptorName(\n      const ServiceDescriptor& descriptor) const;\n\n  template <typename DescriptorT, typename DescriptorProtoT>\n  void PrintSerializedPbInterval(\n      const DescriptorT& descriptor, DescriptorProtoT& proto) const;\n\n  // Very coarse-grained lock to ensure that Generate() is reentrant.\n  // Guards file_, printer_ and file_descriptor_serialized_.\n  mutable Mutex mutex_;\n  mutable const FileDescriptor* file_;  // Set in Generate().  Under mutex_.\n  mutable string file_descriptor_serialized_;\n  mutable io::Printer* printer_;  // Set in Generate().  Under mutex_.\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Generator);\n};\n\n}  // namespace python\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_PYTHON_GENERATOR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// TODO(kenton):  Share code with the versions of this test in other languages?\n//   It seemed like parameterizing it would add more complexity than it is\n//   worth.\n\n#include <google/protobuf/compiler/python/python_generator.h>\n#include <google/protobuf/compiler/command_line_interface.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/io/printer.h>\n\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n#include <google/protobuf/testing/file.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\nnamespace python {\nnamespace {\n\nclass TestGenerator : public CodeGenerator {\n public:\n  TestGenerator() {}\n  ~TestGenerator() {}\n\n  virtual bool Generate(const FileDescriptor* file,\n                        const string& parameter,\n                        GeneratorContext* context,\n                        string* error) const {\n    TryInsert(\"test_pb2.py\", \"imports\", context);\n    TryInsert(\"test_pb2.py\", \"module_scope\", context);\n    TryInsert(\"test_pb2.py\", \"class_scope:foo.Bar\", context);\n    TryInsert(\"test_pb2.py\", \"class_scope:foo.Bar.Baz\", context);\n    return true;\n  }\n\n  void TryInsert(const string& filename, const string& insertion_point,\n                 GeneratorContext* context) const {\n    scoped_ptr<io::ZeroCopyOutputStream> output(\n      context->OpenForInsert(filename, insertion_point));\n    io::Printer printer(output.get(), '$');\n    printer.Print(\"// inserted $name$\\n\", \"name\", insertion_point);\n  }\n};\n\n// This test verifies that all the expected insertion points exist.  It does\n// not verify that they are correctly-placed; that would require actually\n// compiling the output which is a bit more than I care to do for this test.\nTEST(PythonPluginTest, PluginTest) {\n  File::WriteStringToFileOrDie(\n      \"syntax = \\\"proto2\\\";\\n\"\n      \"package foo;\\n\"\n      \"message Bar {\\n\"\n      \"  message Baz {}\\n\"\n      \"}\\n\",\n      TestTempDir() + \"/test.proto\");\n\n  google::protobuf::compiler::CommandLineInterface cli;\n  cli.SetInputsAreProtoPathRelative(true);\n\n  python::Generator python_generator;\n  TestGenerator test_generator;\n  cli.RegisterGenerator(\"--python_out\", &python_generator, \"\");\n  cli.RegisterGenerator(\"--test_out\", &test_generator, \"\");\n\n  string proto_path = \"-I\" + TestTempDir();\n  string python_out = \"--python_out=\" + TestTempDir();\n  string test_out = \"--test_out=\" + TestTempDir();\n\n  const char* argv[] = {\n    \"protoc\",\n    proto_path.c_str(),\n    python_out.c_str(),\n    test_out.c_str(),\n    \"test.proto\"\n  };\n\n  EXPECT_EQ(0, cli.Run(5, argv));\n}\n\n}  // namespace\n}  // namespace python\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\n#include <google/protobuf/compiler/subprocess.h>\n\n#include <algorithm>\n\n#ifndef _WIN32\n#include <errno.h>\n#include <sys/select.h>\n#include <sys/wait.h>\n#include <signal.h>\n#endif\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/message.h>\n#include <google/protobuf/stubs/substitute.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\n#ifdef _WIN32\n\nstatic void CloseHandleOrDie(HANDLE handle) {\n  if (!CloseHandle(handle)) {\n    GOOGLE_LOG(FATAL) << \"CloseHandle: \"\n                      << Subprocess::Win32ErrorMessage(GetLastError());\n  }\n}\n\nSubprocess::Subprocess()\n    : process_start_error_(ERROR_SUCCESS),\n      child_handle_(NULL), child_stdin_(NULL), child_stdout_(NULL) {}\n\nSubprocess::~Subprocess() {\n  if (child_stdin_ != NULL) {\n    CloseHandleOrDie(child_stdin_);\n  }\n  if (child_stdout_ != NULL) {\n    CloseHandleOrDie(child_stdout_);\n  }\n}\n\nvoid Subprocess::Start(const string& program, SearchMode search_mode) {\n  // Create the pipes.\n  HANDLE stdin_pipe_read;\n  HANDLE stdin_pipe_write;\n  HANDLE stdout_pipe_read;\n  HANDLE stdout_pipe_write;\n\n  if (!CreatePipe(&stdin_pipe_read, &stdin_pipe_write, NULL, 0)) {\n    GOOGLE_LOG(FATAL) << \"CreatePipe: \" << Win32ErrorMessage(GetLastError());\n  }\n  if (!CreatePipe(&stdout_pipe_read, &stdout_pipe_write, NULL, 0)) {\n    GOOGLE_LOG(FATAL) << \"CreatePipe: \" << Win32ErrorMessage(GetLastError());\n  }\n\n  // Make child side of the pipes inheritable.\n  if (!SetHandleInformation(stdin_pipe_read,\n                            HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)) {\n    GOOGLE_LOG(FATAL) << \"SetHandleInformation: \"\n                      << Win32ErrorMessage(GetLastError());\n  }\n  if (!SetHandleInformation(stdout_pipe_write,\n                            HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)) {\n    GOOGLE_LOG(FATAL) << \"SetHandleInformation: \"\n                      << Win32ErrorMessage(GetLastError());\n  }\n\n  // Setup STARTUPINFO to redirect handles.\n  STARTUPINFOA startup_info;\n  ZeroMemory(&startup_info, sizeof(startup_info));\n  startup_info.cb = sizeof(startup_info);\n  startup_info.dwFlags = STARTF_USESTDHANDLES;\n  startup_info.hStdInput = stdin_pipe_read;\n  startup_info.hStdOutput = stdout_pipe_write;\n  startup_info.hStdError = GetStdHandle(STD_ERROR_HANDLE);\n\n  if (startup_info.hStdError == INVALID_HANDLE_VALUE) {\n    GOOGLE_LOG(FATAL) << \"GetStdHandle: \"\n                      << Win32ErrorMessage(GetLastError());\n  }\n\n  // CreateProcess() mutates its second parameter.  WTF?\n  char* name_copy = strdup(program.c_str());\n\n  // Create the process.\n  PROCESS_INFORMATION process_info;\n\n  if (CreateProcessA((search_mode == SEARCH_PATH) ? NULL : program.c_str(),\n                     (search_mode == SEARCH_PATH) ? name_copy : NULL,\n                     NULL,  // process security attributes\n                     NULL,  // thread security attributes\n                     TRUE,  // inherit handles?\n                     0,     // obscure creation flags\n                     NULL,  // environment (inherit from parent)\n                     NULL,  // current directory (inherit from parent)\n                     &startup_info,\n                     &process_info)) {\n    child_handle_ = process_info.hProcess;\n    CloseHandleOrDie(process_info.hThread);\n    child_stdin_ = stdin_pipe_write;\n    child_stdout_ = stdout_pipe_read;\n  } else {\n    process_start_error_ = GetLastError();\n    CloseHandleOrDie(stdin_pipe_write);\n    CloseHandleOrDie(stdout_pipe_read);\n  }\n\n  CloseHandleOrDie(stdin_pipe_read);\n  CloseHandleOrDie(stdout_pipe_write);\n  free(name_copy);\n}\n\nbool Subprocess::Communicate(const Message& input, Message* output,\n                             string* error) {\n  if (process_start_error_ != ERROR_SUCCESS) {\n    *error = Win32ErrorMessage(process_start_error_);\n    return false;\n  }\n\n  GOOGLE_CHECK(child_handle_ != NULL) << \"Must call Start() first.\";\n\n  string input_data = input.SerializeAsString();\n  string output_data;\n\n  int input_pos = 0;\n\n  while (child_stdout_ != NULL) {\n    HANDLE handles[2];\n    int handle_count = 0;\n\n    if (child_stdin_ != NULL) {\n      handles[handle_count++] = child_stdin_;\n    }\n    if (child_stdout_ != NULL) {\n      handles[handle_count++] = child_stdout_;\n    }\n\n    DWORD wait_result =\n        WaitForMultipleObjects(handle_count, handles, FALSE, INFINITE);\n\n    HANDLE signaled_handle;\n    if (wait_result >= WAIT_OBJECT_0 &&\n        wait_result < WAIT_OBJECT_0 + handle_count) {\n      signaled_handle = handles[wait_result - WAIT_OBJECT_0];\n    } else if (wait_result == WAIT_FAILED) {\n      GOOGLE_LOG(FATAL) << \"WaitForMultipleObjects: \"\n                        << Win32ErrorMessage(GetLastError());\n    } else {\n      GOOGLE_LOG(FATAL) << \"WaitForMultipleObjects: Unexpected return code: \"\n                        << wait_result;\n    }\n\n    if (signaled_handle == child_stdin_) {\n      DWORD n;\n      if (!WriteFile(child_stdin_,\n                     input_data.data() + input_pos,\n                     input_data.size() - input_pos,\n                     &n, NULL)) {\n        // Child closed pipe.  Presumably it will report an error later.\n        // Pretend we're done for now.\n        input_pos = input_data.size();\n      } else {\n        input_pos += n;\n      }\n\n      if (input_pos == input_data.size()) {\n        // We're done writing.  Close.\n        CloseHandleOrDie(child_stdin_);\n        child_stdin_ = NULL;\n      }\n    } else if (signaled_handle == child_stdout_) {\n      char buffer[4096];\n      DWORD n;\n\n      if (!ReadFile(child_stdout_, buffer, sizeof(buffer), &n, NULL)) {\n        // We're done reading.  Close.\n        CloseHandleOrDie(child_stdout_);\n        child_stdout_ = NULL;\n      } else {\n        output_data.append(buffer, n);\n      }\n    }\n  }\n\n  if (child_stdin_ != NULL) {\n    // Child did not finish reading input before it closed the output.\n    // Presumably it exited with an error.\n    CloseHandleOrDie(child_stdin_);\n    child_stdin_ = NULL;\n  }\n\n  DWORD wait_result = WaitForSingleObject(child_handle_, INFINITE);\n\n  if (wait_result == WAIT_FAILED) {\n    GOOGLE_LOG(FATAL) << \"WaitForSingleObject: \"\n                      << Win32ErrorMessage(GetLastError());\n  } else if (wait_result != WAIT_OBJECT_0) {\n    GOOGLE_LOG(FATAL) << \"WaitForSingleObject: Unexpected return code: \"\n                      << wait_result;\n  }\n\n  DWORD exit_code;\n  if (!GetExitCodeProcess(child_handle_, &exit_code)) {\n    GOOGLE_LOG(FATAL) << \"GetExitCodeProcess: \"\n                      << Win32ErrorMessage(GetLastError());\n  }\n\n  CloseHandleOrDie(child_handle_);\n  child_handle_ = NULL;\n\n  if (exit_code != 0) {\n    *error = strings::Substitute(\n        \"Plugin failed with status code $0.\", exit_code);\n    return false;\n  }\n\n  if (!output->ParseFromString(output_data)) {\n    *error = \"Plugin output is unparseable: \" + CEscape(output_data);\n    return false;\n  }\n\n  return true;\n}\n\nstring Subprocess::Win32ErrorMessage(DWORD error_code) {\n  char* message;\n\n  // WTF?\n  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |\n                FORMAT_MESSAGE_FROM_SYSTEM |\n                FORMAT_MESSAGE_IGNORE_INSERTS,\n                NULL, error_code, 0,\n                (LPTSTR)&message,  // NOT A BUG!\n                0, NULL);\n\n  string result = message;\n  LocalFree(message);\n  return result;\n}\n\n// ===================================================================\n\n#else  // _WIN32\n\nSubprocess::Subprocess()\n    : child_pid_(-1), child_stdin_(-1), child_stdout_(-1) {}\n\nSubprocess::~Subprocess() {\n  if (child_stdin_ != -1) {\n    close(child_stdin_);\n  }\n  if (child_stdout_ != -1) {\n    close(child_stdout_);\n  }\n}\n\nvoid Subprocess::Start(const string& program, SearchMode search_mode) {\n  // Note that we assume that there are no other threads, thus we don't have to\n  // do crazy stuff like using socket pairs or avoiding libc locks.\n\n  // [0] is read end, [1] is write end.\n  int stdin_pipe[2];\n  int stdout_pipe[2];\n\n  pipe(stdin_pipe);\n  pipe(stdout_pipe);\n\n  char* argv[2] = { strdup(program.c_str()), NULL };\n\n  child_pid_ = fork();\n  if (child_pid_ == -1) {\n    GOOGLE_LOG(FATAL) << \"fork: \" << strerror(errno);\n  } else if (child_pid_ == 0) {\n    // We are the child.\n    dup2(stdin_pipe[0], STDIN_FILENO);\n    dup2(stdout_pipe[1], STDOUT_FILENO);\n\n    close(stdin_pipe[0]);\n    close(stdin_pipe[1]);\n    close(stdout_pipe[0]);\n    close(stdout_pipe[1]);\n\n    switch (search_mode) {\n      case SEARCH_PATH:\n        execvp(argv[0], argv);\n        break;\n      case EXACT_NAME:\n        execv(argv[0], argv);\n        break;\n    }\n\n    // Write directly to STDERR_FILENO to avoid stdio code paths that may do\n    // stuff that is unsafe here.\n    write(STDERR_FILENO, argv[0], strlen(argv[0]));\n    const char* message = \": program not found or is not executable\\n\";\n    write(STDERR_FILENO, message, strlen(message));\n\n    // Must use _exit() rather than exit() to avoid flushing output buffers\n    // that will also be flushed by the parent.\n    _exit(1);\n  } else {\n    free(argv[0]);\n\n    close(stdin_pipe[0]);\n    close(stdout_pipe[1]);\n\n    child_stdin_ = stdin_pipe[1];\n    child_stdout_ = stdout_pipe[0];\n  }\n}\n\nbool Subprocess::Communicate(const Message& input, Message* output,\n                             string* error) {\n\n  GOOGLE_CHECK_NE(child_stdin_, -1) << \"Must call Start() first.\";\n\n  // The \"sighandler_t\" typedef is GNU-specific, so define our own.\n  typedef void SignalHandler(int);\n\n  // Make sure SIGPIPE is disabled so that if the child dies it doesn't kill us.\n  SignalHandler* old_pipe_handler = signal(SIGPIPE, SIG_IGN);\n\n  string input_data = input.SerializeAsString();\n  string output_data;\n\n  int input_pos = 0;\n  int max_fd = max(child_stdin_, child_stdout_);\n\n  while (child_stdout_ != -1) {\n    fd_set read_fds;\n    fd_set write_fds;\n    FD_ZERO(&read_fds);\n    FD_ZERO(&write_fds);\n    if (child_stdout_ != -1) {\n      FD_SET(child_stdout_, &read_fds);\n    }\n    if (child_stdin_ != -1) {\n      FD_SET(child_stdin_, &write_fds);\n    }\n\n    if (select(max_fd + 1, &read_fds, &write_fds, NULL, NULL) < 0) {\n      if (errno == EINTR) {\n        // Interrupted by signal.  Try again.\n        continue;\n      } else {\n        GOOGLE_LOG(FATAL) << \"select: \" << strerror(errno);\n      }\n    }\n\n    if (child_stdin_ != -1 && FD_ISSET(child_stdin_, &write_fds)) {\n      int n = write(child_stdin_, input_data.data() + input_pos,\n                                  input_data.size() - input_pos);\n      if (n < 0) {\n        // Child closed pipe.  Presumably it will report an error later.\n        // Pretend we're done for now.\n        input_pos = input_data.size();\n      } else {\n        input_pos += n;\n      }\n\n      if (input_pos == input_data.size()) {\n        // We're done writing.  Close.\n        close(child_stdin_);\n        child_stdin_ = -1;\n      }\n    }\n\n    if (child_stdout_ != -1 && FD_ISSET(child_stdout_, &read_fds)) {\n      char buffer[4096];\n      int n = read(child_stdout_, buffer, sizeof(buffer));\n\n      if (n > 0) {\n        output_data.append(buffer, n);\n      } else {\n        // We're done reading.  Close.\n        close(child_stdout_);\n        child_stdout_ = -1;\n      }\n    }\n  }\n\n  if (child_stdin_ != -1) {\n    // Child did not finish reading input before it closed the output.\n    // Presumably it exited with an error.\n    close(child_stdin_);\n    child_stdin_ = -1;\n  }\n\n  int status;\n  while (waitpid(child_pid_, &status, 0) == -1) {\n    if (errno != EINTR) {\n      GOOGLE_LOG(FATAL) << \"waitpid: \" << strerror(errno);\n    }\n  }\n\n  // Restore SIGPIPE handling.\n  signal(SIGPIPE, old_pipe_handler);\n\n  if (WIFEXITED(status)) {\n    if (WEXITSTATUS(status) != 0) {\n      int error_code = WEXITSTATUS(status);\n      *error = strings::Substitute(\n          \"Plugin failed with status code $0.\", error_code);\n      return false;\n    }\n  } else if (WIFSIGNALED(status)) {\n    int signal = WTERMSIG(status);\n    *error = strings::Substitute(\n        \"Plugin killed by signal $0.\", signal);\n    return false;\n  } else {\n    *error = \"Neither WEXITSTATUS nor WTERMSIG is true?\";\n    return false;\n  }\n\n  if (!output->ParseFromString(output_data)) {\n    *error = \"Plugin output is unparseable.\";\n    return false;\n  }\n\n  return true;\n}\n\n#endif  // !_WIN32\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\n#ifndef GOOGLE_PROTOBUF_COMPILER_SUBPROCESS_H__\n#define GOOGLE_PROTOBUF_COMPILER_SUBPROCESS_H__\n\n#ifdef _WIN32\n#define WIN32_LEAN_AND_MEAN   // right...\n#include <windows.h>\n#else  // _WIN32\n#include <sys/types.h>\n#include <unistd.h>\n#endif  // !_WIN32\n#include <google/protobuf/stubs/common.h>\n\n#include <string>\n\n\nnamespace google {\nnamespace protobuf {\n\nclass Message;\n\nnamespace compiler {\n\n// Utility class for launching sub-processes.\nclass LIBPROTOC_EXPORT Subprocess {\n public:\n  Subprocess();\n  ~Subprocess();\n\n  enum SearchMode {\n    SEARCH_PATH,   // Use PATH environment variable.\n    EXACT_NAME     // Program is an exact file name; don't use the PATH.\n  };\n\n  // Start the subprocess.  Currently we don't provide a way to specify\n  // arguments as protoc plugins don't have any.\n  void Start(const string& program, SearchMode search_mode);\n\n  // Serialize the input message and pipe it to the subprocess's stdin, then\n  // close the pipe.  Meanwhile, read from the subprocess's stdout and parse\n  // the data into *output.  All this is done carefully to avoid deadlocks.\n  // Returns true if successful.  On any sort of error, returns false and sets\n  // *error to a description of the problem.\n  bool Communicate(const Message& input, Message* output, string* error);\n\n#ifdef _WIN32\n  // Given an error code, returns a human-readable error message.  This is\n  // defined here so that CommandLineInterface can share it.\n  static string Win32ErrorMessage(DWORD error_code);\n#endif\n\n private:\n#ifdef _WIN32\n  DWORD process_start_error_;\n  HANDLE child_handle_;\n\n  // The file handles for our end of the child's pipes.  We close each and\n  // set it to NULL when no longer needed.\n  HANDLE child_stdin_;\n  HANDLE child_stdout_;\n\n#else  // _WIN32\n  pid_t child_pid_;\n\n  // The file descriptors for our end of the child's pipes.  We close each and\n  // set it to -1 when no longer needed.\n  int child_stdin_;\n  int child_stdout_;\n\n#endif  // !_WIN32\n};\n\n}  // namespace compiler\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_COMPILER_SUBPROCESS_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/test_plugin.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// This is a dummy code generator plugin used by\n// command_line_interface_unittest.\n\n#include <string>\n#include <stdlib.h>\n#include <google/protobuf/compiler/plugin.h>\n#include <google/protobuf/compiler/mock_code_generator.h>\n#include <google/protobuf/stubs/strutil.h>\n\nint main(int argc, char* argv[]) {\n#ifdef _MSC_VER\n  // Don't print a silly message or stick a modal dialog box in my face,\n  // please.\n  _set_abort_behavior(0, ~0);\n#endif  // !_MSC_VER\n\n  google::protobuf::compiler::MockCodeGenerator generator(\"test_plugin\");\n  return google::protobuf::compiler::PluginMain(argc, argv, &generator);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh",
    "content": "#!/bin/sh\n#\n# Protocol Buffers - Google's data interchange format\n# Copyright 2009 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# Author: kenton@google.com (Kenton Varda)\n#\n# Test protoc's zip output mode.\n\nfail() {\n  echo \"$@\" >&2\n  exit 1\n}\n\nTEST_TMPDIR=.\nPROTOC=./protoc\n\necho '\n  syntax = \"proto2\";\n  option java_multiple_files = true;\n  option java_package = \"test.jar\";\n  option java_outer_classname = \"Outer\";\n  message Foo {}\n  message Bar {}\n' > $TEST_TMPDIR/testzip.proto\n\n$PROTOC \\\n    --cpp_out=$TEST_TMPDIR/testzip.zip --python_out=$TEST_TMPDIR/testzip.zip \\\n    --java_out=$TEST_TMPDIR/testzip.jar -I$TEST_TMPDIR testzip.proto \\\n    || fail 'protoc failed.'\n\necho \"Testing output to zip...\"\nif unzip -h > /dev/null; then\n  unzip -t $TEST_TMPDIR/testzip.zip > $TEST_TMPDIR/testzip.list || fail 'unzip failed.'\n\n  grep 'testing: testzip\\.pb\\.cc *OK$' $TEST_TMPDIR/testzip.list > /dev/null \\\n    || fail 'testzip.pb.cc not found in output zip.'\n  grep 'testing: testzip\\.pb\\.h *OK$' $TEST_TMPDIR/testzip.list > /dev/null \\\n    || fail 'testzip.pb.h not found in output zip.'\n  grep 'testing: testzip_pb2\\.py *OK$' $TEST_TMPDIR/testzip.list > /dev/null \\\n    || fail 'testzip_pb2.py not found in output zip.'\n  grep -i 'manifest' $TEST_TMPDIR/testzip.list > /dev/null \\\n    && fail 'Zip file contained manifest.'\nelse\n  echo \"Warning:  'unzip' command not available.  Skipping test.\"\nfi\n\necho \"Testing output to jar...\"\nif jar c $TEST_TMPDIR/testzip.proto > /dev/null; then\n  jar tf $TEST_TMPDIR/testzip.jar > $TEST_TMPDIR/testzip.list || fail 'jar failed.'\n\n  grep '^test/jar/Foo\\.java$' $TEST_TMPDIR/testzip.list > /dev/null \\\n    || fail 'Foo.java not found in output jar.'\n  grep '^test/jar/Bar\\.java$' $TEST_TMPDIR/testzip.list > /dev/null \\\n    || fail 'Bar.java not found in output jar.'\n  grep '^test/jar/Outer\\.java$' $TEST_TMPDIR/testzip.list > /dev/null \\\n    || fail 'Outer.java not found in output jar.'\n  grep '^META-INF/MANIFEST\\.MF$' $TEST_TMPDIR/testzip.list > /dev/null \\\n    || fail 'Manifest not found in output jar.'\nelse\n  echo \"Warning:  'jar' command not available.  Skipping test.\"\nfi\n\necho PASS\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: ambrose@google.com (Ambrose Feinstein),\n//         kenton@google.com (Kenton Varda)\n//\n// Based on http://www.pkware.com/documents/casestudies/APPNOTE.TXT\n\n#include <google/protobuf/compiler/zip_writer.h>\n#include <google/protobuf/io/coded_stream.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\nstatic const uint32 kCRC32Table[256] = {\n  0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,\n  0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,\n  0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,\n  0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,\n  0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,\n  0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,\n  0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,\n  0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,\n  0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,\n  0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,\n  0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,\n  0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,\n  0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,\n  0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,\n  0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,\n  0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,\n  0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,\n  0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,\n  0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,\n  0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,\n  0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,\n  0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,\n  0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,\n  0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,\n  0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,\n  0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,\n  0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,\n  0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,\n  0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,\n  0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,\n  0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,\n  0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,\n  0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,\n  0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,\n  0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,\n  0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,\n  0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,\n  0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,\n  0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,\n  0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,\n  0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,\n  0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,\n  0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d\n};\n\nstatic uint32 ComputeCRC32(const string &buf) {\n  uint32 x = ~0U;\n  for (int i = 0; i < buf.size(); ++i) {\n    unsigned char c = buf[i];\n    x = kCRC32Table[(x ^ c) & 0xff] ^ (x >> 8);\n  }\n  return ~x;\n}\n\nstatic void WriteShort(io::CodedOutputStream *out, uint16 val) {\n  uint8 p[2];\n  p[0] = static_cast<uint8>(val);\n  p[1] = static_cast<uint8>(val >> 8);\n  out->WriteRaw(p, 2);\n}\n\nZipWriter::ZipWriter(io::ZeroCopyOutputStream* raw_output)\n  : raw_output_(raw_output) {}\nZipWriter::~ZipWriter() {}\n\nbool ZipWriter::Write(const string& filename, const string& contents) {\n  FileInfo info;\n\n  info.name = filename;\n  uint16 filename_size = filename.size();\n  info.offset = raw_output_->ByteCount();\n  info.size = contents.size();\n  info.crc32 = ComputeCRC32(contents);\n\n  files_.push_back(info);\n\n  // write file header\n  io::CodedOutputStream output(raw_output_);\n  output.WriteLittleEndian32(0x04034b50);  // magic\n  WriteShort(&output, 10);  // version needed to extract\n  WriteShort(&output, 0);  // flags\n  WriteShort(&output, 0);  // compression method: stored\n  WriteShort(&output, 0);  // last modified time\n  WriteShort(&output, 0);  // last modified date\n  output.WriteLittleEndian32(info.crc32);  // crc-32\n  output.WriteLittleEndian32(info.size);  // compressed size\n  output.WriteLittleEndian32(info.size);  // uncompressed size\n  WriteShort(&output, filename_size);  // file name length\n  WriteShort(&output, 0);   // extra field length\n  output.WriteString(filename);  // file name\n  output.WriteString(contents);  // file data\n\n  return !output.HadError();\n}\n\nbool ZipWriter::WriteDirectory() {\n  uint16 num_entries = files_.size();\n  uint32 dir_ofs = raw_output_->ByteCount();\n\n  // write central directory\n  io::CodedOutputStream output(raw_output_);\n  for (int i = 0; i < num_entries; ++i) {\n    const string &filename = files_[i].name;\n    uint16 filename_size = filename.size();\n    uint32 crc32 = files_[i].crc32;\n    uint32 size = files_[i].size;\n    uint32 offset = files_[i].offset;\n\n    output.WriteLittleEndian32(0x02014b50);  // magic\n    WriteShort(&output, 10);  // version made by\n    WriteShort(&output, 10);  // version needed to extract\n    WriteShort(&output, 0);  // flags\n    WriteShort(&output, 0);  // compression method: stored\n    WriteShort(&output, 0);  // last modified time\n    WriteShort(&output, 0);  // last modified date\n    output.WriteLittleEndian32(crc32);  // crc-32\n    output.WriteLittleEndian32(size);  // compressed size\n    output.WriteLittleEndian32(size);  // uncompressed size\n    WriteShort(&output, filename_size);  // file name length\n    WriteShort(&output, 0);   // extra field length\n    WriteShort(&output, 0);   // file comment length\n    WriteShort(&output, 0);   // starting disk number\n    WriteShort(&output, 0);   // internal file attributes\n    output.WriteLittleEndian32(0);  // external file attributes\n    output.WriteLittleEndian32(offset);  // local header offset\n    output.WriteString(filename);  // file name\n  }\n  uint32 dir_len = output.ByteCount();\n\n  // write end of central directory marker\n  output.WriteLittleEndian32(0x06054b50);  // magic\n  WriteShort(&output, 0);  // disk number\n  WriteShort(&output, 0);  // disk with start of central directory\n  WriteShort(&output, num_entries);  // central directory entries (this disk)\n  WriteShort(&output, num_entries);  // central directory entries (total)\n  output.WriteLittleEndian32(dir_len);  // central directory byte size\n  output.WriteLittleEndian32(dir_ofs);  // central directory offset\n  WriteShort(&output, 0);   // comment length\n\n  return output.HadError();\n}\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\n#include <vector>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace compiler {\n\nclass ZipWriter {\n public:\n  ZipWriter(io::ZeroCopyOutputStream* raw_output);\n  ~ZipWriter();\n\n  bool Write(const string& filename, const string& contents);\n  bool WriteDirectory();\n\n private:\n  struct FileInfo {\n    string name;\n    uint32 offset;\n    uint32 size;\n    uint32 crc32;\n  };\n\n  io::ZeroCopyOutputStream* raw_output_;\n  vector<FileInfo> files_;\n};\n\n}  // namespace compiler\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/stubs/hash.h>\n#include <map>\n#include <set>\n#include <vector>\n#include <algorithm>\n#include <limits>\n\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/descriptor_database.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/dynamic_message.h>\n#include <google/protobuf/text_format.h>\n#include <google/protobuf/unknown_field_set.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/io/tokenizer.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/once.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n#include <google/protobuf/stubs/map-util.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\n#undef PACKAGE  // autoheader #defines this.  :(\n\nnamespace google {\nnamespace protobuf {\n\nconst FieldDescriptor::CppType\nFieldDescriptor::kTypeToCppTypeMap[MAX_TYPE + 1] = {\n  static_cast<CppType>(0),  // 0 is reserved for errors\n\n  CPPTYPE_DOUBLE,   // TYPE_DOUBLE\n  CPPTYPE_FLOAT,    // TYPE_FLOAT\n  CPPTYPE_INT64,    // TYPE_INT64\n  CPPTYPE_UINT64,   // TYPE_UINT64\n  CPPTYPE_INT32,    // TYPE_INT32\n  CPPTYPE_UINT64,   // TYPE_FIXED64\n  CPPTYPE_UINT32,   // TYPE_FIXED32\n  CPPTYPE_BOOL,     // TYPE_BOOL\n  CPPTYPE_STRING,   // TYPE_STRING\n  CPPTYPE_MESSAGE,  // TYPE_GROUP\n  CPPTYPE_MESSAGE,  // TYPE_MESSAGE\n  CPPTYPE_STRING,   // TYPE_BYTES\n  CPPTYPE_UINT32,   // TYPE_UINT32\n  CPPTYPE_ENUM,     // TYPE_ENUM\n  CPPTYPE_INT32,    // TYPE_SFIXED32\n  CPPTYPE_INT64,    // TYPE_SFIXED64\n  CPPTYPE_INT32,    // TYPE_SINT32\n  CPPTYPE_INT64,    // TYPE_SINT64\n};\n\nconst char * const FieldDescriptor::kTypeToName[MAX_TYPE + 1] = {\n  \"ERROR\",     // 0 is reserved for errors\n\n  \"double\",    // TYPE_DOUBLE\n  \"float\",     // TYPE_FLOAT\n  \"int64\",     // TYPE_INT64\n  \"uint64\",    // TYPE_UINT64\n  \"int32\",     // TYPE_INT32\n  \"fixed64\",   // TYPE_FIXED64\n  \"fixed32\",   // TYPE_FIXED32\n  \"bool\",      // TYPE_BOOL\n  \"string\",    // TYPE_STRING\n  \"group\",     // TYPE_GROUP\n  \"message\",   // TYPE_MESSAGE\n  \"bytes\",     // TYPE_BYTES\n  \"uint32\",    // TYPE_UINT32\n  \"enum\",      // TYPE_ENUM\n  \"sfixed32\",  // TYPE_SFIXED32\n  \"sfixed64\",  // TYPE_SFIXED64\n  \"sint32\",    // TYPE_SINT32\n  \"sint64\",    // TYPE_SINT64\n};\n\nconst char * const FieldDescriptor::kLabelToName[MAX_LABEL + 1] = {\n  \"ERROR\",     // 0 is reserved for errors\n\n  \"optional\",  // LABEL_OPTIONAL\n  \"required\",  // LABEL_REQUIRED\n  \"repeated\",  // LABEL_REPEATED\n};\n\n#ifndef _MSC_VER  // MSVC doesn't need these and won't even accept them.\nconst int FieldDescriptor::kMaxNumber;\nconst int FieldDescriptor::kFirstReservedNumber;\nconst int FieldDescriptor::kLastReservedNumber;\n#endif\n\nnamespace {\n\nconst string kEmptyString;\n\nstring ToCamelCase(const string& input) {\n  bool capitalize_next = false;\n  string result;\n  result.reserve(input.size());\n\n  for (int i = 0; i < input.size(); i++) {\n    if (input[i] == '_') {\n      capitalize_next = true;\n    } else if (capitalize_next) {\n      // Note:  I distrust ctype.h due to locales.\n      if ('a' <= input[i] && input[i] <= 'z') {\n        result.push_back(input[i] - 'a' + 'A');\n      } else {\n        result.push_back(input[i]);\n      }\n      capitalize_next = false;\n    } else {\n      result.push_back(input[i]);\n    }\n  }\n\n  // Lower-case the first letter.\n  if (!result.empty() && 'A' <= result[0] && result[0] <= 'Z') {\n    result[0] = result[0] - 'A' + 'a';\n  }\n\n  return result;\n}\n\n// A DescriptorPool contains a bunch of hash_maps to implement the\n// various Find*By*() methods.  Since hashtable lookups are O(1), it's\n// most efficient to construct a fixed set of large hash_maps used by\n// all objects in the pool rather than construct one or more small\n// hash_maps for each object.\n//\n// The keys to these hash_maps are (parent, name) or (parent, number)\n// pairs.  Unfortunately STL doesn't provide hash functions for pair<>,\n// so we must invent our own.\n//\n// TODO(kenton):  Use StringPiece rather than const char* in keys?  It would\n//   be a lot cleaner but we'd just have to convert it back to const char*\n//   for the open source release.\n\ntypedef pair<const void*, const char*> PointerStringPair;\n\nstruct PointerStringPairEqual {\n  inline bool operator()(const PointerStringPair& a,\n                         const PointerStringPair& b) const {\n    return a.first == b.first && strcmp(a.second, b.second) == 0;\n  }\n};\n\ntemplate<typename PairType>\nstruct PointerIntegerPairHash {\n  size_t operator()(const PairType& p) const {\n    // FIXME(kenton):  What is the best way to compute this hash?  I have\n    // no idea!  This seems a bit better than an XOR.\n    return reinterpret_cast<intptr_t>(p.first) * ((1 << 16) - 1) + p.second;\n  }\n\n  // Used only by MSVC and platforms where hash_map is not available.\n  static const size_t bucket_size = 4;\n  static const size_t min_buckets = 8;\n  inline bool operator()(const PairType& a, const PairType& b) const {\n    return a.first < b.first ||\n          (a.first == b.first && a.second < b.second);\n  }\n};\n\ntypedef pair<const Descriptor*, int> DescriptorIntPair;\ntypedef pair<const EnumDescriptor*, int> EnumIntPair;\n\nstruct PointerStringPairHash {\n  size_t operator()(const PointerStringPair& p) const {\n    // FIXME(kenton):  What is the best way to compute this hash?  I have\n    // no idea!  This seems a bit better than an XOR.\n    hash<const char*> cstring_hash;\n    return reinterpret_cast<intptr_t>(p.first) * ((1 << 16) - 1) +\n           cstring_hash(p.second);\n  }\n\n  // Used only by MSVC and platforms where hash_map is not available.\n  static const size_t bucket_size = 4;\n  static const size_t min_buckets = 8;\n  inline bool operator()(const PointerStringPair& a,\n                         const PointerStringPair& b) const {\n    if (a.first < b.first) return true;\n    if (a.first > b.first) return false;\n    return strcmp(a.second, b.second) < 0;\n  }\n};\n\n\nstruct Symbol {\n  enum Type {\n    NULL_SYMBOL, MESSAGE, FIELD, ENUM, ENUM_VALUE, SERVICE, METHOD, PACKAGE\n  };\n  Type type;\n  union {\n    const Descriptor* descriptor;\n    const FieldDescriptor* field_descriptor;\n    const EnumDescriptor* enum_descriptor;\n    const EnumValueDescriptor* enum_value_descriptor;\n    const ServiceDescriptor* service_descriptor;\n    const MethodDescriptor* method_descriptor;\n    const FileDescriptor* package_file_descriptor;\n  };\n\n  inline Symbol() : type(NULL_SYMBOL) { descriptor = NULL; }\n  inline bool IsNull() const { return type == NULL_SYMBOL; }\n  inline bool IsType() const {\n    return type == MESSAGE || type == ENUM;\n  }\n  inline bool IsAggregate() const {\n    return type == MESSAGE || type == PACKAGE\n        || type == ENUM || type == SERVICE;\n  }\n\n#define CONSTRUCTOR(TYPE, TYPE_CONSTANT, FIELD)  \\\n  inline explicit Symbol(const TYPE* value) {    \\\n    type = TYPE_CONSTANT;                        \\\n    this->FIELD = value;                         \\\n  }\n\n  CONSTRUCTOR(Descriptor         , MESSAGE   , descriptor             )\n  CONSTRUCTOR(FieldDescriptor    , FIELD     , field_descriptor       )\n  CONSTRUCTOR(EnumDescriptor     , ENUM      , enum_descriptor        )\n  CONSTRUCTOR(EnumValueDescriptor, ENUM_VALUE, enum_value_descriptor  )\n  CONSTRUCTOR(ServiceDescriptor  , SERVICE   , service_descriptor     )\n  CONSTRUCTOR(MethodDescriptor   , METHOD    , method_descriptor      )\n  CONSTRUCTOR(FileDescriptor     , PACKAGE   , package_file_descriptor)\n#undef CONSTRUCTOR\n\n  const FileDescriptor* GetFile() const {\n    switch (type) {\n      case NULL_SYMBOL: return NULL;\n      case MESSAGE    : return descriptor           ->file();\n      case FIELD      : return field_descriptor     ->file();\n      case ENUM       : return enum_descriptor      ->file();\n      case ENUM_VALUE : return enum_value_descriptor->type()->file();\n      case SERVICE    : return service_descriptor   ->file();\n      case METHOD     : return method_descriptor    ->service()->file();\n      case PACKAGE    : return package_file_descriptor;\n    }\n    return NULL;\n  }\n};\n\nconst Symbol kNullSymbol;\n\ntypedef hash_map<const char*, Symbol,\n                 hash<const char*>, streq>\n  SymbolsByNameMap;\ntypedef hash_map<PointerStringPair, Symbol,\n                 PointerStringPairHash, PointerStringPairEqual>\n  SymbolsByParentMap;\ntypedef hash_map<const char*, const FileDescriptor*,\n                 hash<const char*>, streq>\n  FilesByNameMap;\ntypedef hash_map<PointerStringPair, const FieldDescriptor*,\n                 PointerStringPairHash, PointerStringPairEqual>\n  FieldsByNameMap;\ntypedef hash_map<DescriptorIntPair, const FieldDescriptor*,\n                 PointerIntegerPairHash<DescriptorIntPair> >\n  FieldsByNumberMap;\ntypedef hash_map<EnumIntPair, const EnumValueDescriptor*,\n                 PointerIntegerPairHash<EnumIntPair> >\n  EnumValuesByNumberMap;\n// This is a map rather than a hash_map, since we use it to iterate\n// through all the extensions that extend a given Descriptor, and an\n// ordered data structure that implements lower_bound is convenient\n// for that.\ntypedef map<DescriptorIntPair, const FieldDescriptor*>\n  ExtensionsGroupedByDescriptorMap;\n\n}  // anonymous namespace\n\n// ===================================================================\n// DescriptorPool::Tables\n\nclass DescriptorPool::Tables {\n public:\n  Tables();\n  ~Tables();\n\n  // Checkpoint the state of the tables.  Future calls to Rollback() will\n  // return the Tables to this state.  This is used when building files, since\n  // some kinds of validation errors cannot be detected until the file's\n  // descriptors have already been added to the tables.  BuildFile() calls\n  // Checkpoint() before it starts building and Rollback() if it encounters\n  // an error.\n  void Checkpoint();\n\n  // Roll back the Tables to the state of the last Checkpoint(), removing\n  // everything that was added after that point.\n  void Rollback();\n\n  // The stack of files which are currently being built.  Used to detect\n  // cyclic dependencies when loading files from a DescriptorDatabase.  Not\n  // used when fallback_database_ == NULL.\n  vector<string> pending_files_;\n\n  // A set of files which we have tried to load from the fallback database\n  // and encountered errors.  We will not attempt to load them again.\n  // Not used when fallback_database_ == NULL.\n  hash_set<string> known_bad_files_;\n\n  // The set of descriptors for which we've already loaded the full\n  // set of extensions numbers from fallback_database_.\n  hash_set<const Descriptor*> extensions_loaded_from_db_;\n\n  // -----------------------------------------------------------------\n  // Finding items.\n\n  // Find symbols.  This returns a null Symbol (symbol.IsNull() is true)\n  // if not found.\n  inline Symbol FindSymbol(const string& key) const;\n\n  // This implements the body of DescriptorPool::Find*ByName().  It should\n  // really be a private method of DescriptorPool, but that would require\n  // declaring Symbol in descriptor.h, which would drag all kinds of other\n  // stuff into the header.  Yay C++.\n  Symbol FindByNameHelper(\n    const DescriptorPool* pool, const string& name) const;\n\n  // These return NULL if not found.\n  inline const FileDescriptor* FindFile(const string& key) const;\n  inline const FieldDescriptor* FindExtension(const Descriptor* extendee,\n                                              int number);\n  inline void FindAllExtensions(const Descriptor* extendee,\n                                vector<const FieldDescriptor*>* out) const;\n\n  // -----------------------------------------------------------------\n  // Adding items.\n\n  // These add items to the corresponding tables.  They return false if\n  // the key already exists in the table.  For AddSymbol(), the string passed\n  // in must be one that was constructed using AllocateString(), as it will\n  // be used as a key in the symbols_by_name_ map without copying.\n  bool AddSymbol(const string& full_name, Symbol symbol);\n  bool AddFile(const FileDescriptor* file);\n  bool AddExtension(const FieldDescriptor* field);\n\n  // -----------------------------------------------------------------\n  // Allocating memory.\n\n  // Allocate an object which will be reclaimed when the pool is\n  // destroyed.  Note that the object's destructor will never be called,\n  // so its fields must be plain old data (primitive data types and\n  // pointers).  All of the descriptor types are such objects.\n  template<typename Type> Type* Allocate();\n\n  // Allocate an array of objects which will be reclaimed when the\n  // pool in destroyed.  Again, destructors are never called.\n  template<typename Type> Type* AllocateArray(int count);\n\n  // Allocate a string which will be destroyed when the pool is destroyed.\n  // The string is initialized to the given value for convenience.\n  string* AllocateString(const string& value);\n\n  // Allocate a protocol message object.  Some older versions of GCC have\n  // trouble understanding explicit template instantiations in some cases, so\n  // in those cases we have to pass a dummy pointer of the right type as the\n  // parameter instead of specifying the type explicitly.\n  template<typename Type> Type* AllocateMessage(Type* dummy = NULL);\n\n  // Allocate a FileDescriptorTables object.\n  FileDescriptorTables* AllocateFileTables();\n\n private:\n  vector<string*> strings_;    // All strings in the pool.\n  vector<Message*> messages_;  // All messages in the pool.\n  vector<FileDescriptorTables*> file_tables_;  // All file tables in the pool.\n  vector<void*> allocations_;  // All other memory allocated in the pool.\n\n  SymbolsByNameMap      symbols_by_name_;\n  FilesByNameMap        files_by_name_;\n  ExtensionsGroupedByDescriptorMap extensions_;\n\n  int strings_before_checkpoint_;\n  int messages_before_checkpoint_;\n  int file_tables_before_checkpoint_;\n  int allocations_before_checkpoint_;\n  vector<const char*      > symbols_after_checkpoint_;\n  vector<const char*      > files_after_checkpoint_;\n  vector<DescriptorIntPair> extensions_after_checkpoint_;\n\n  // Allocate some bytes which will be reclaimed when the pool is\n  // destroyed.\n  void* AllocateBytes(int size);\n};\n\n// Contains tables specific to a particular file.  These tables are not\n// modified once the file has been constructed, so they need not be\n// protected by a mutex.  This makes operations that depend only on the\n// contents of a single file -- e.g. Descriptor::FindFieldByName() --\n// lock-free.\n//\n// For historical reasons, the definitions of the methods of\n// FileDescriptorTables and DescriptorPool::Tables are interleaved below.\n// These used to be a single class.\nclass FileDescriptorTables {\n public:\n  FileDescriptorTables();\n  ~FileDescriptorTables();\n\n  // Empty table, used with placeholder files.\n  static const FileDescriptorTables kEmpty;\n\n  // -----------------------------------------------------------------\n  // Finding items.\n\n  // Find symbols.  These return a null Symbol (symbol.IsNull() is true)\n  // if not found.\n  inline Symbol FindNestedSymbol(const void* parent,\n                                 const string& name) const;\n  inline Symbol FindNestedSymbolOfType(const void* parent,\n                                       const string& name,\n                                       const Symbol::Type type) const;\n\n  // These return NULL if not found.\n  inline const FieldDescriptor* FindFieldByNumber(\n    const Descriptor* parent, int number) const;\n  inline const FieldDescriptor* FindFieldByLowercaseName(\n    const void* parent, const string& lowercase_name) const;\n  inline const FieldDescriptor* FindFieldByCamelcaseName(\n    const void* parent, const string& camelcase_name) const;\n  inline const EnumValueDescriptor* FindEnumValueByNumber(\n    const EnumDescriptor* parent, int number) const;\n\n  // -----------------------------------------------------------------\n  // Adding items.\n\n  // These add items to the corresponding tables.  They return false if\n  // the key already exists in the table.  For AddAliasUnderParent(), the\n  // string passed in must be one that was constructed using AllocateString(),\n  // as it will be used as a key in the symbols_by_parent_ map without copying.\n  bool AddAliasUnderParent(const void* parent, const string& name,\n                           Symbol symbol);\n  bool AddFieldByNumber(const FieldDescriptor* field);\n  bool AddEnumValueByNumber(const EnumValueDescriptor* value);\n\n  // Adds the field to the lowercase_name and camelcase_name maps.  Never\n  // fails because we allow duplicates; the first field by the name wins.\n  void AddFieldByStylizedNames(const FieldDescriptor* field);\n\n private:\n  SymbolsByParentMap    symbols_by_parent_;\n  FieldsByNameMap       fields_by_lowercase_name_;\n  FieldsByNameMap       fields_by_camelcase_name_;\n  FieldsByNumberMap     fields_by_number_;       // Not including extensions.\n  EnumValuesByNumberMap enum_values_by_number_;\n};\n\nDescriptorPool::Tables::Tables()\n  : strings_before_checkpoint_(0),\n    messages_before_checkpoint_(0),\n    allocations_before_checkpoint_(0) {}\n\nDescriptorPool::Tables::~Tables() {\n  // Note that the deletion order is important, since the destructors of some\n  // messages may refer to objects in allocations_.\n  STLDeleteElements(&messages_);\n  for (int i = 0; i < allocations_.size(); i++) {\n    operator delete(allocations_[i]);\n  }\n  STLDeleteElements(&strings_);\n  STLDeleteElements(&file_tables_);\n}\n\nFileDescriptorTables::FileDescriptorTables() {}\nFileDescriptorTables::~FileDescriptorTables() {}\n\nconst FileDescriptorTables FileDescriptorTables::kEmpty;\n\nvoid DescriptorPool::Tables::Checkpoint() {\n  strings_before_checkpoint_ = strings_.size();\n  messages_before_checkpoint_ = messages_.size();\n  file_tables_before_checkpoint_ = file_tables_.size();\n  allocations_before_checkpoint_ = allocations_.size();\n\n  symbols_after_checkpoint_.clear();\n  files_after_checkpoint_.clear();\n  extensions_after_checkpoint_.clear();\n}\n\nvoid DescriptorPool::Tables::Rollback() {\n  for (int i = 0; i < symbols_after_checkpoint_.size(); i++) {\n    symbols_by_name_.erase(symbols_after_checkpoint_[i]);\n  }\n  for (int i = 0; i < files_after_checkpoint_.size(); i++) {\n    files_by_name_.erase(files_after_checkpoint_[i]);\n  }\n  for (int i = 0; i < extensions_after_checkpoint_.size(); i++) {\n    extensions_.erase(extensions_after_checkpoint_[i]);\n  }\n\n  symbols_after_checkpoint_.clear();\n  files_after_checkpoint_.clear();\n  extensions_after_checkpoint_.clear();\n\n  STLDeleteContainerPointers(\n    strings_.begin() + strings_before_checkpoint_, strings_.end());\n  STLDeleteContainerPointers(\n    messages_.begin() + messages_before_checkpoint_, messages_.end());\n  STLDeleteContainerPointers(\n    file_tables_.begin() + file_tables_before_checkpoint_, file_tables_.end());\n  for (int i = allocations_before_checkpoint_; i < allocations_.size(); i++) {\n    operator delete(allocations_[i]);\n  }\n\n  strings_.resize(strings_before_checkpoint_);\n  messages_.resize(messages_before_checkpoint_);\n  file_tables_.resize(file_tables_before_checkpoint_);\n  allocations_.resize(allocations_before_checkpoint_);\n}\n\n// -------------------------------------------------------------------\n\ninline Symbol DescriptorPool::Tables::FindSymbol(const string& key) const {\n  const Symbol* result = FindOrNull(symbols_by_name_, key.c_str());\n  if (result == NULL) {\n    return kNullSymbol;\n  } else {\n    return *result;\n  }\n}\n\ninline Symbol FileDescriptorTables::FindNestedSymbol(\n    const void* parent, const string& name) const {\n  const Symbol* result =\n    FindOrNull(symbols_by_parent_, PointerStringPair(parent, name.c_str()));\n  if (result == NULL) {\n    return kNullSymbol;\n  } else {\n    return *result;\n  }\n}\n\ninline Symbol FileDescriptorTables::FindNestedSymbolOfType(\n    const void* parent, const string& name, const Symbol::Type type) const {\n  Symbol result = FindNestedSymbol(parent, name);\n  if (result.type != type) return kNullSymbol;\n  return result;\n}\n\nSymbol DescriptorPool::Tables::FindByNameHelper(\n    const DescriptorPool* pool, const string& name) const {\n  MutexLockMaybe lock(pool->mutex_);\n  Symbol result = FindSymbol(name);\n\n  if (result.IsNull() && pool->underlay_ != NULL) {\n    // Symbol not found; check the underlay.\n    result =\n      pool->underlay_->tables_->FindByNameHelper(pool->underlay_, name);\n  }\n\n  if (result.IsNull()) {\n    // Symbol still not found, so check fallback database.\n    if (pool->TryFindSymbolInFallbackDatabase(name)) {\n      result = FindSymbol(name);\n    }\n  }\n\n  return result;\n}\n\ninline const FileDescriptor* DescriptorPool::Tables::FindFile(\n    const string& key) const {\n  return FindPtrOrNull(files_by_name_, key.c_str());\n}\n\ninline const FieldDescriptor* FileDescriptorTables::FindFieldByNumber(\n    const Descriptor* parent, int number) const {\n  return FindPtrOrNull(fields_by_number_, make_pair(parent, number));\n}\n\ninline const FieldDescriptor* FileDescriptorTables::FindFieldByLowercaseName(\n    const void* parent, const string& lowercase_name) const {\n  return FindPtrOrNull(fields_by_lowercase_name_,\n                       PointerStringPair(parent, lowercase_name.c_str()));\n}\n\ninline const FieldDescriptor* FileDescriptorTables::FindFieldByCamelcaseName(\n    const void* parent, const string& camelcase_name) const {\n  return FindPtrOrNull(fields_by_camelcase_name_,\n                       PointerStringPair(parent, camelcase_name.c_str()));\n}\n\ninline const EnumValueDescriptor* FileDescriptorTables::FindEnumValueByNumber(\n    const EnumDescriptor* parent, int number) const {\n  return FindPtrOrNull(enum_values_by_number_, make_pair(parent, number));\n}\n\ninline const FieldDescriptor* DescriptorPool::Tables::FindExtension(\n    const Descriptor* extendee, int number) {\n  return FindPtrOrNull(extensions_, make_pair(extendee, number));\n}\n\ninline void DescriptorPool::Tables::FindAllExtensions(\n    const Descriptor* extendee, vector<const FieldDescriptor*>* out) const {\n  ExtensionsGroupedByDescriptorMap::const_iterator it =\n      extensions_.lower_bound(make_pair(extendee, 0));\n  for (; it != extensions_.end() && it->first.first == extendee; ++it) {\n    out->push_back(it->second);\n  }\n}\n\n// -------------------------------------------------------------------\n\nbool DescriptorPool::Tables::AddSymbol(\n    const string& full_name, Symbol symbol) {\n  if (InsertIfNotPresent(&symbols_by_name_, full_name.c_str(), symbol)) {\n    symbols_after_checkpoint_.push_back(full_name.c_str());\n    return true;\n  } else {\n    return false;\n  }\n}\n\nbool FileDescriptorTables::AddAliasUnderParent(\n    const void* parent, const string& name, Symbol symbol) {\n  PointerStringPair by_parent_key(parent, name.c_str());\n  return InsertIfNotPresent(&symbols_by_parent_, by_parent_key, symbol);\n}\n\nbool DescriptorPool::Tables::AddFile(const FileDescriptor* file) {\n  if (InsertIfNotPresent(&files_by_name_, file->name().c_str(), file)) {\n    files_after_checkpoint_.push_back(file->name().c_str());\n    return true;\n  } else {\n    return false;\n  }\n}\n\nvoid FileDescriptorTables::AddFieldByStylizedNames(\n    const FieldDescriptor* field) {\n  const void* parent;\n  if (field->is_extension()) {\n    if (field->extension_scope() == NULL) {\n      parent = field->file();\n    } else {\n      parent = field->extension_scope();\n    }\n  } else {\n    parent = field->containing_type();\n  }\n\n  PointerStringPair lowercase_key(parent, field->lowercase_name().c_str());\n  InsertIfNotPresent(&fields_by_lowercase_name_, lowercase_key, field);\n\n  PointerStringPair camelcase_key(parent, field->camelcase_name().c_str());\n  InsertIfNotPresent(&fields_by_camelcase_name_, camelcase_key, field);\n}\n\nbool FileDescriptorTables::AddFieldByNumber(const FieldDescriptor* field) {\n  DescriptorIntPair key(field->containing_type(), field->number());\n  return InsertIfNotPresent(&fields_by_number_, key, field);\n}\n\nbool FileDescriptorTables::AddEnumValueByNumber(\n    const EnumValueDescriptor* value) {\n  EnumIntPair key(value->type(), value->number());\n  return InsertIfNotPresent(&enum_values_by_number_, key, value);\n}\n\nbool DescriptorPool::Tables::AddExtension(const FieldDescriptor* field) {\n  DescriptorIntPair key(field->containing_type(), field->number());\n  if (InsertIfNotPresent(&extensions_, key, field)) {\n    extensions_after_checkpoint_.push_back(key);\n    return true;\n  } else {\n    return false;\n  }\n}\n\n// -------------------------------------------------------------------\n\ntemplate<typename Type>\nType* DescriptorPool::Tables::Allocate() {\n  return reinterpret_cast<Type*>(AllocateBytes(sizeof(Type)));\n}\n\ntemplate<typename Type>\nType* DescriptorPool::Tables::AllocateArray(int count) {\n  return reinterpret_cast<Type*>(AllocateBytes(sizeof(Type) * count));\n}\n\nstring* DescriptorPool::Tables::AllocateString(const string& value) {\n  string* result = new string(value);\n  strings_.push_back(result);\n  return result;\n}\n\ntemplate<typename Type>\nType* DescriptorPool::Tables::AllocateMessage(Type* dummy) {\n  Type* result = new Type;\n  messages_.push_back(result);\n  return result;\n}\n\nFileDescriptorTables* DescriptorPool::Tables::AllocateFileTables() {\n  FileDescriptorTables* result = new FileDescriptorTables;\n  file_tables_.push_back(result);\n  return result;\n}\n\nvoid* DescriptorPool::Tables::AllocateBytes(int size) {\n  // TODO(kenton):  Would it be worthwhile to implement this in some more\n  // sophisticated way?  Probably not for the open source release, but for\n  // internal use we could easily plug in one of our existing memory pool\n  // allocators...\n  if (size == 0) return NULL;\n\n  void* result = operator new(size);\n  allocations_.push_back(result);\n  return result;\n}\n\n// ===================================================================\n// DescriptorPool\n\nDescriptorPool::ErrorCollector::~ErrorCollector() {}\n\nDescriptorPool::DescriptorPool()\n  : mutex_(NULL),\n    fallback_database_(NULL),\n    default_error_collector_(NULL),\n    underlay_(NULL),\n    tables_(new Tables),\n    enforce_dependencies_(true),\n    allow_unknown_(false) {}\n\nDescriptorPool::DescriptorPool(DescriptorDatabase* fallback_database,\n                               ErrorCollector* error_collector)\n  : mutex_(new Mutex),\n    fallback_database_(fallback_database),\n    default_error_collector_(error_collector),\n    underlay_(NULL),\n    tables_(new Tables),\n    enforce_dependencies_(true),\n    allow_unknown_(false) {\n}\n\nDescriptorPool::DescriptorPool(const DescriptorPool* underlay)\n  : mutex_(NULL),\n    fallback_database_(NULL),\n    default_error_collector_(NULL),\n    underlay_(underlay),\n    tables_(new Tables),\n    enforce_dependencies_(true),\n    allow_unknown_(false) {}\n\nDescriptorPool::~DescriptorPool() {\n  if (mutex_ != NULL) delete mutex_;\n}\n\n// DescriptorPool::BuildFile() defined later.\n// DescriptorPool::BuildFileCollectingErrors() defined later.\n\nvoid DescriptorPool::InternalDontEnforceDependencies() {\n  enforce_dependencies_ = false;\n}\n\nbool DescriptorPool::InternalIsFileLoaded(const string& filename) const {\n  MutexLockMaybe lock(mutex_);\n  return tables_->FindFile(filename) != NULL;\n}\n\n// generated_pool ====================================================\n\nnamespace {\n\n\nEncodedDescriptorDatabase* generated_database_ = NULL;\nDescriptorPool* generated_pool_ = NULL;\nGOOGLE_PROTOBUF_DECLARE_ONCE(generated_pool_init_);\n\nvoid DeleteGeneratedPool() {\n  delete generated_database_;\n  generated_database_ = NULL;\n  delete generated_pool_;\n  generated_pool_ = NULL;\n}\n\nvoid InitGeneratedPool() {\n  generated_database_ = new EncodedDescriptorDatabase;\n  generated_pool_ = new DescriptorPool(generated_database_);\n\n  internal::OnShutdown(&DeleteGeneratedPool);\n}\n\ninline void InitGeneratedPoolOnce() {\n  ::google::protobuf::GoogleOnceInit(&generated_pool_init_, &InitGeneratedPool);\n}\n\n}  // anonymous namespace\n\nconst DescriptorPool* DescriptorPool::generated_pool() {\n  InitGeneratedPoolOnce();\n  return generated_pool_;\n}\n\nDescriptorPool* DescriptorPool::internal_generated_pool() {\n  InitGeneratedPoolOnce();\n  return generated_pool_;\n}\n\nvoid DescriptorPool::InternalAddGeneratedFile(\n    const void* encoded_file_descriptor, int size) {\n  // So, this function is called in the process of initializing the\n  // descriptors for generated proto classes.  Each generated .pb.cc file\n  // has an internal procedure called AddDescriptors() which is called at\n  // process startup, and that function calls this one in order to register\n  // the raw bytes of the FileDescriptorProto representing the file.\n  //\n  // We do not actually construct the descriptor objects right away.  We just\n  // hang on to the bytes until they are actually needed.  We actually construct\n  // the descriptor the first time one of the following things happens:\n  // * Someone calls a method like descriptor(), GetDescriptor(), or\n  //   GetReflection() on the generated types, which requires returning the\n  //   descriptor or an object based on it.\n  // * Someone looks up the descriptor in DescriptorPool::generated_pool().\n  //\n  // Once one of these happens, the DescriptorPool actually parses the\n  // FileDescriptorProto and generates a FileDescriptor (and all its children)\n  // based on it.\n  //\n  // Note that FileDescriptorProto is itself a generated protocol message.\n  // Therefore, when we parse one, we have to be very careful to avoid using\n  // any descriptor-based operations, since this might cause infinite recursion\n  // or deadlock.\n  InitGeneratedPoolOnce();\n  GOOGLE_CHECK(generated_database_->Add(encoded_file_descriptor, size));\n}\n\n\n// Find*By* methods ==================================================\n\n// TODO(kenton):  There's a lot of repeated code here, but I'm not sure if\n//   there's any good way to factor it out.  Think about this some time when\n//   there's nothing more important to do (read: never).\n\nconst FileDescriptor* DescriptorPool::FindFileByName(const string& name) const {\n  MutexLockMaybe lock(mutex_);\n  const FileDescriptor* result = tables_->FindFile(name);\n  if (result != NULL) return result;\n  if (underlay_ != NULL) {\n    const FileDescriptor* result = underlay_->FindFileByName(name);\n    if (result != NULL) return result;\n  }\n  if (TryFindFileInFallbackDatabase(name)) {\n    const FileDescriptor* result = tables_->FindFile(name);\n    if (result != NULL) return result;\n  }\n  return NULL;\n}\n\nconst FileDescriptor* DescriptorPool::FindFileContainingSymbol(\n    const string& symbol_name) const {\n  MutexLockMaybe lock(mutex_);\n  Symbol result = tables_->FindSymbol(symbol_name);\n  if (!result.IsNull()) return result.GetFile();\n  if (underlay_ != NULL) {\n    const FileDescriptor* result =\n      underlay_->FindFileContainingSymbol(symbol_name);\n    if (result != NULL) return result;\n  }\n  if (TryFindSymbolInFallbackDatabase(symbol_name)) {\n    Symbol result = tables_->FindSymbol(symbol_name);\n    if (!result.IsNull()) return result.GetFile();\n  }\n  return NULL;\n}\n\nconst Descriptor* DescriptorPool::FindMessageTypeByName(\n    const string& name) const {\n  Symbol result = tables_->FindByNameHelper(this, name);\n  return (result.type == Symbol::MESSAGE) ? result.descriptor : NULL;\n}\n\nconst FieldDescriptor* DescriptorPool::FindFieldByName(\n    const string& name) const {\n  Symbol result = tables_->FindByNameHelper(this, name);\n  if (result.type == Symbol::FIELD &&\n      !result.field_descriptor->is_extension()) {\n    return result.field_descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst FieldDescriptor* DescriptorPool::FindExtensionByName(\n    const string& name) const {\n  Symbol result = tables_->FindByNameHelper(this, name);\n  if (result.type == Symbol::FIELD &&\n      result.field_descriptor->is_extension()) {\n    return result.field_descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst EnumDescriptor* DescriptorPool::FindEnumTypeByName(\n    const string& name) const {\n  Symbol result = tables_->FindByNameHelper(this, name);\n  return (result.type == Symbol::ENUM) ? result.enum_descriptor : NULL;\n}\n\nconst EnumValueDescriptor* DescriptorPool::FindEnumValueByName(\n    const string& name) const {\n  Symbol result = tables_->FindByNameHelper(this, name);\n  return (result.type == Symbol::ENUM_VALUE) ?\n    result.enum_value_descriptor : NULL;\n}\n\nconst ServiceDescriptor* DescriptorPool::FindServiceByName(\n    const string& name) const {\n  Symbol result = tables_->FindByNameHelper(this, name);\n  return (result.type == Symbol::SERVICE) ? result.service_descriptor : NULL;\n}\n\nconst MethodDescriptor* DescriptorPool::FindMethodByName(\n    const string& name) const {\n  Symbol result = tables_->FindByNameHelper(this, name);\n  return (result.type == Symbol::METHOD) ? result.method_descriptor : NULL;\n}\n\nconst FieldDescriptor* DescriptorPool::FindExtensionByNumber(\n    const Descriptor* extendee, int number) const {\n  MutexLockMaybe lock(mutex_);\n  const FieldDescriptor* result = tables_->FindExtension(extendee, number);\n  if (result != NULL) {\n    return result;\n  }\n  if (underlay_ != NULL) {\n    const FieldDescriptor* result =\n      underlay_->FindExtensionByNumber(extendee, number);\n    if (result != NULL) return result;\n  }\n  if (TryFindExtensionInFallbackDatabase(extendee, number)) {\n    const FieldDescriptor* result = tables_->FindExtension(extendee, number);\n    if (result != NULL) {\n      return result;\n    }\n  }\n  return NULL;\n}\n\nvoid DescriptorPool::FindAllExtensions(\n    const Descriptor* extendee, vector<const FieldDescriptor*>* out) const {\n  MutexLockMaybe lock(mutex_);\n\n  // Initialize tables_->extensions_ from the fallback database first\n  // (but do this only once per descriptor).\n  if (fallback_database_ != NULL &&\n      tables_->extensions_loaded_from_db_.count(extendee) == 0) {\n    vector<int> numbers;\n    if (fallback_database_->FindAllExtensionNumbers(extendee->full_name(),\n                                                    &numbers)) {\n      for (int i = 0; i < numbers.size(); ++i) {\n        int number = numbers[i];\n        if (tables_->FindExtension(extendee, number) == NULL) {\n          TryFindExtensionInFallbackDatabase(extendee, number);\n        }\n      }\n      tables_->extensions_loaded_from_db_.insert(extendee);\n    }\n  }\n\n  tables_->FindAllExtensions(extendee, out);\n  if (underlay_ != NULL) {\n    underlay_->FindAllExtensions(extendee, out);\n  }\n}\n\n// -------------------------------------------------------------------\n\nconst FieldDescriptor*\nDescriptor::FindFieldByNumber(int key) const {\n  const FieldDescriptor* result =\n    file()->tables_->FindFieldByNumber(this, key);\n  if (result == NULL || result->is_extension()) {\n    return NULL;\n  } else {\n    return result;\n  }\n}\n\nconst FieldDescriptor*\nDescriptor::FindFieldByLowercaseName(const string& key) const {\n  const FieldDescriptor* result =\n    file()->tables_->FindFieldByLowercaseName(this, key);\n  if (result == NULL || result->is_extension()) {\n    return NULL;\n  } else {\n    return result;\n  }\n}\n\nconst FieldDescriptor*\nDescriptor::FindFieldByCamelcaseName(const string& key) const {\n  const FieldDescriptor* result =\n    file()->tables_->FindFieldByCamelcaseName(this, key);\n  if (result == NULL || result->is_extension()) {\n    return NULL;\n  } else {\n    return result;\n  }\n}\n\nconst FieldDescriptor*\nDescriptor::FindFieldByName(const string& key) const {\n  Symbol result =\n    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD);\n  if (!result.IsNull() && !result.field_descriptor->is_extension()) {\n    return result.field_descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst FieldDescriptor*\nDescriptor::FindExtensionByName(const string& key) const {\n  Symbol result =\n    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD);\n  if (!result.IsNull() && result.field_descriptor->is_extension()) {\n    return result.field_descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst FieldDescriptor*\nDescriptor::FindExtensionByLowercaseName(const string& key) const {\n  const FieldDescriptor* result =\n    file()->tables_->FindFieldByLowercaseName(this, key);\n  if (result == NULL || !result->is_extension()) {\n    return NULL;\n  } else {\n    return result;\n  }\n}\n\nconst FieldDescriptor*\nDescriptor::FindExtensionByCamelcaseName(const string& key) const {\n  const FieldDescriptor* result =\n    file()->tables_->FindFieldByCamelcaseName(this, key);\n  if (result == NULL || !result->is_extension()) {\n    return NULL;\n  } else {\n    return result;\n  }\n}\n\nconst Descriptor*\nDescriptor::FindNestedTypeByName(const string& key) const {\n  Symbol result =\n    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::MESSAGE);\n  if (!result.IsNull()) {\n    return result.descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst EnumDescriptor*\nDescriptor::FindEnumTypeByName(const string& key) const {\n  Symbol result =\n    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM);\n  if (!result.IsNull()) {\n    return result.enum_descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst EnumValueDescriptor*\nDescriptor::FindEnumValueByName(const string& key) const {\n  Symbol result =\n    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE);\n  if (!result.IsNull()) {\n    return result.enum_value_descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst EnumValueDescriptor*\nEnumDescriptor::FindValueByName(const string& key) const {\n  Symbol result =\n    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE);\n  if (!result.IsNull()) {\n    return result.enum_value_descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst EnumValueDescriptor*\nEnumDescriptor::FindValueByNumber(int key) const {\n  return file()->tables_->FindEnumValueByNumber(this, key);\n}\n\nconst MethodDescriptor*\nServiceDescriptor::FindMethodByName(const string& key) const {\n  Symbol result =\n    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::METHOD);\n  if (!result.IsNull()) {\n    return result.method_descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst Descriptor*\nFileDescriptor::FindMessageTypeByName(const string& key) const {\n  Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::MESSAGE);\n  if (!result.IsNull()) {\n    return result.descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst EnumDescriptor*\nFileDescriptor::FindEnumTypeByName(const string& key) const {\n  Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM);\n  if (!result.IsNull()) {\n    return result.enum_descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst EnumValueDescriptor*\nFileDescriptor::FindEnumValueByName(const string& key) const {\n  Symbol result =\n    tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE);\n  if (!result.IsNull()) {\n    return result.enum_value_descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst ServiceDescriptor*\nFileDescriptor::FindServiceByName(const string& key) const {\n  Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::SERVICE);\n  if (!result.IsNull()) {\n    return result.service_descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst FieldDescriptor*\nFileDescriptor::FindExtensionByName(const string& key) const {\n  Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD);\n  if (!result.IsNull() && result.field_descriptor->is_extension()) {\n    return result.field_descriptor;\n  } else {\n    return NULL;\n  }\n}\n\nconst FieldDescriptor*\nFileDescriptor::FindExtensionByLowercaseName(const string& key) const {\n  const FieldDescriptor* result = tables_->FindFieldByLowercaseName(this, key);\n  if (result == NULL || !result->is_extension()) {\n    return NULL;\n  } else {\n    return result;\n  }\n}\n\nconst FieldDescriptor*\nFileDescriptor::FindExtensionByCamelcaseName(const string& key) const {\n  const FieldDescriptor* result = tables_->FindFieldByCamelcaseName(this, key);\n  if (result == NULL || !result->is_extension()) {\n    return NULL;\n  } else {\n    return result;\n  }\n}\n\nbool Descriptor::IsExtensionNumber(int number) const {\n  // Linear search should be fine because we don't expect a message to have\n  // more than a couple extension ranges.\n  for (int i = 0; i < extension_range_count(); i++) {\n    if (number >= extension_range(i)->start &&\n        number <  extension_range(i)->end) {\n      return true;\n    }\n  }\n  return false;\n}\n\n// -------------------------------------------------------------------\n\nbool DescriptorPool::TryFindFileInFallbackDatabase(const string& name) const {\n  if (fallback_database_ == NULL) return false;\n\n  if (tables_->known_bad_files_.count(name) > 0) return false;\n\n  FileDescriptorProto file_proto;\n  if (!fallback_database_->FindFileByName(name, &file_proto) ||\n      BuildFileFromDatabase(file_proto) == NULL) {\n    tables_->known_bad_files_.insert(name);\n    return false;\n  }\n\n  return true;\n}\n\nbool DescriptorPool::TryFindSymbolInFallbackDatabase(const string& name) const {\n  if (fallback_database_ == NULL) return false;\n\n  FileDescriptorProto file_proto;\n  if (!fallback_database_->FindFileContainingSymbol(name, &file_proto)) {\n    return false;\n  }\n\n  if (tables_->FindFile(file_proto.name()) != NULL) {\n    // We've already loaded this file, and it apparently doesn't contain the\n    // symbol we're looking for.  Some DescriptorDatabases return false\n    // positives.\n    return false;\n  }\n\n  if (BuildFileFromDatabase(file_proto) == NULL) {\n    return false;\n  }\n\n  return true;\n}\n\nbool DescriptorPool::TryFindExtensionInFallbackDatabase(\n    const Descriptor* containing_type, int field_number) const {\n  if (fallback_database_ == NULL) return false;\n\n  FileDescriptorProto file_proto;\n  if (!fallback_database_->FindFileContainingExtension(\n        containing_type->full_name(), field_number, &file_proto)) {\n    return false;\n  }\n\n  if (tables_->FindFile(file_proto.name()) != NULL) {\n    // We've already loaded this file, and it apparently doesn't contain the\n    // extension we're looking for.  Some DescriptorDatabases return false\n    // positives.\n    return false;\n  }\n\n  if (BuildFileFromDatabase(file_proto) == NULL) {\n    return false;\n  }\n\n  return true;\n}\n\n// ===================================================================\n\nstring FieldDescriptor::DefaultValueAsString(bool quote_string_type) const {\n  GOOGLE_CHECK(has_default_value()) << \"No default value\";\n  switch (cpp_type()) {\n    case CPPTYPE_INT32:\n      return SimpleItoa(default_value_int32());\n      break;\n    case CPPTYPE_INT64:\n      return SimpleItoa(default_value_int64());\n      break;\n    case CPPTYPE_UINT32:\n      return SimpleItoa(default_value_uint32());\n      break;\n    case CPPTYPE_UINT64:\n      return SimpleItoa(default_value_uint64());\n      break;\n    case CPPTYPE_FLOAT:\n      return SimpleFtoa(default_value_float());\n      break;\n    case CPPTYPE_DOUBLE:\n      return SimpleDtoa(default_value_double());\n      break;\n    case CPPTYPE_BOOL:\n      return default_value_bool() ? \"true\" : \"false\";\n      break;\n    case CPPTYPE_STRING:\n      if (quote_string_type) {\n        return \"\\\"\" + CEscape(default_value_string()) + \"\\\"\";\n      } else {\n        if (type() == TYPE_BYTES) {\n          return CEscape(default_value_string());\n        } else {\n          return default_value_string();\n        }\n      }\n      break;\n    case CPPTYPE_ENUM:\n      return default_value_enum()->name();\n      break;\n    case CPPTYPE_MESSAGE:\n      GOOGLE_LOG(DFATAL) << \"Messages can't have default values!\";\n      break;\n  }\n  GOOGLE_LOG(FATAL) << \"Can't get here: failed to get default value as string\";\n  return \"\";\n}\n\n// CopyTo methods ====================================================\n\nvoid FileDescriptor::CopyTo(FileDescriptorProto* proto) const {\n  proto->set_name(name());\n  if (!package().empty()) proto->set_package(package());\n\n  for (int i = 0; i < dependency_count(); i++) {\n    proto->add_dependency(dependency(i)->name());\n  }\n\n  for (int i = 0; i < message_type_count(); i++) {\n    message_type(i)->CopyTo(proto->add_message_type());\n  }\n  for (int i = 0; i < enum_type_count(); i++) {\n    enum_type(i)->CopyTo(proto->add_enum_type());\n  }\n  for (int i = 0; i < service_count(); i++) {\n    service(i)->CopyTo(proto->add_service());\n  }\n  for (int i = 0; i < extension_count(); i++) {\n    extension(i)->CopyTo(proto->add_extension());\n  }\n\n  if (&options() != &FileOptions::default_instance()) {\n    proto->mutable_options()->CopyFrom(options());\n  }\n}\n\nvoid Descriptor::CopyTo(DescriptorProto* proto) const {\n  proto->set_name(name());\n\n  for (int i = 0; i < field_count(); i++) {\n    field(i)->CopyTo(proto->add_field());\n  }\n  for (int i = 0; i < nested_type_count(); i++) {\n    nested_type(i)->CopyTo(proto->add_nested_type());\n  }\n  for (int i = 0; i < enum_type_count(); i++) {\n    enum_type(i)->CopyTo(proto->add_enum_type());\n  }\n  for (int i = 0; i < extension_range_count(); i++) {\n    DescriptorProto::ExtensionRange* range = proto->add_extension_range();\n    range->set_start(extension_range(i)->start);\n    range->set_end(extension_range(i)->end);\n  }\n  for (int i = 0; i < extension_count(); i++) {\n    extension(i)->CopyTo(proto->add_extension());\n  }\n\n  if (&options() != &MessageOptions::default_instance()) {\n    proto->mutable_options()->CopyFrom(options());\n  }\n}\n\nvoid FieldDescriptor::CopyTo(FieldDescriptorProto* proto) const {\n  proto->set_name(name());\n  proto->set_number(number());\n\n  // Some compilers do not allow static_cast directly between two enum types,\n  // so we must cast to int first.\n  proto->set_label(static_cast<FieldDescriptorProto::Label>(\n                     implicit_cast<int>(label())));\n  proto->set_type(static_cast<FieldDescriptorProto::Type>(\n                    implicit_cast<int>(type())));\n\n  if (is_extension()) {\n    if (!containing_type()->is_unqualified_placeholder_) {\n      proto->set_extendee(\".\");\n    }\n    proto->mutable_extendee()->append(containing_type()->full_name());\n  }\n\n  if (cpp_type() == CPPTYPE_MESSAGE) {\n    if (message_type()->is_placeholder_) {\n      // We don't actually know if the type is a message type.  It could be\n      // an enum.\n      proto->clear_type();\n    }\n\n    if (!message_type()->is_unqualified_placeholder_) {\n      proto->set_type_name(\".\");\n    }\n    proto->mutable_type_name()->append(message_type()->full_name());\n  } else if (cpp_type() == CPPTYPE_ENUM) {\n    if (!enum_type()->is_unqualified_placeholder_) {\n      proto->set_type_name(\".\");\n    }\n    proto->mutable_type_name()->append(enum_type()->full_name());\n  }\n\n  if (has_default_value()) {\n    proto->set_default_value(DefaultValueAsString(false));\n  }\n\n  if (&options() != &FieldOptions::default_instance()) {\n    proto->mutable_options()->CopyFrom(options());\n  }\n}\n\nvoid EnumDescriptor::CopyTo(EnumDescriptorProto* proto) const {\n  proto->set_name(name());\n\n  for (int i = 0; i < value_count(); i++) {\n    value(i)->CopyTo(proto->add_value());\n  }\n\n  if (&options() != &EnumOptions::default_instance()) {\n    proto->mutable_options()->CopyFrom(options());\n  }\n}\n\nvoid EnumValueDescriptor::CopyTo(EnumValueDescriptorProto* proto) const {\n  proto->set_name(name());\n  proto->set_number(number());\n\n  if (&options() != &EnumValueOptions::default_instance()) {\n    proto->mutable_options()->CopyFrom(options());\n  }\n}\n\nvoid ServiceDescriptor::CopyTo(ServiceDescriptorProto* proto) const {\n  proto->set_name(name());\n\n  for (int i = 0; i < method_count(); i++) {\n    method(i)->CopyTo(proto->add_method());\n  }\n\n  if (&options() != &ServiceOptions::default_instance()) {\n    proto->mutable_options()->CopyFrom(options());\n  }\n}\n\nvoid MethodDescriptor::CopyTo(MethodDescriptorProto* proto) const {\n  proto->set_name(name());\n\n  if (!input_type()->is_unqualified_placeholder_) {\n    proto->set_input_type(\".\");\n  }\n  proto->mutable_input_type()->append(input_type()->full_name());\n\n  if (!output_type()->is_unqualified_placeholder_) {\n    proto->set_output_type(\".\");\n  }\n  proto->mutable_output_type()->append(output_type()->full_name());\n\n  if (&options() != &MethodOptions::default_instance()) {\n    proto->mutable_options()->CopyFrom(options());\n  }\n}\n\n// DebugString methods ===============================================\n\nnamespace {\n\n// Used by each of the option formatters.\nbool RetrieveOptions(const Message &options, vector<string> *option_entries) {\n  option_entries->clear();\n  const Reflection* reflection = options.GetReflection();\n  vector<const FieldDescriptor*> fields;\n  reflection->ListFields(options, &fields);\n  for (int i = 0; i < fields.size(); i++) {\n    // Doesn't make sense to have message type fields here\n    if (fields[i]->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      continue;\n    }\n    int count = 1;\n    bool repeated = false;\n    if (fields[i]->is_repeated()) {\n      count = reflection->FieldSize(options, fields[i]);\n      repeated = true;\n    }\n    for (int j = 0; j < count; j++) {\n      string fieldval;\n      TextFormat::PrintFieldValueToString(options, fields[i],\n                                          repeated ? count : -1, &fieldval);\n      option_entries->push_back(fields[i]->name() + \" = \" + fieldval);\n    }\n  }\n  return !option_entries->empty();\n}\n\n// Formats options that all appear together in brackets. Does not include\n// brackets.\nbool FormatBracketedOptions(const Message &options, string *output) {\n  vector<string> all_options;\n  if (RetrieveOptions(options, &all_options)) {\n    output->append(JoinStrings(all_options, \", \"));\n  }\n  return !all_options.empty();\n}\n\n// Formats options one per line\nbool FormatLineOptions(int depth, const Message &options, string *output) {\n  string prefix(depth * 2, ' ');\n  vector<string> all_options;\n  if (RetrieveOptions(options, &all_options)) {\n    for (int i = 0; i < all_options.size(); i++) {\n      strings::SubstituteAndAppend(output, \"$0option $1;\\n\",\n                                   prefix, all_options[i]);\n    }\n  }\n  return !all_options.empty();\n}\n\n}  // anonymous namespace\n\nstring FileDescriptor::DebugString() const {\n  string contents = \"syntax = \\\"proto2\\\";\\n\\n\";\n\n  for (int i = 0; i < dependency_count(); i++) {\n    strings::SubstituteAndAppend(&contents, \"import \\\"$0\\\";\\n\",\n                                 dependency(i)->name());\n  }\n\n  if (!package().empty()) {\n    strings::SubstituteAndAppend(&contents, \"package $0;\\n\\n\", package());\n  }\n\n  if (FormatLineOptions(0, options(), &contents)) {\n    contents.append(\"\\n\");  // add some space if we had options\n  }\n\n  for (int i = 0; i < enum_type_count(); i++) {\n    enum_type(i)->DebugString(0, &contents);\n    contents.append(\"\\n\");\n  }\n\n  // Find all the 'group' type extensions; we will not output their nested\n  // definitions (those will be done with their group field descriptor).\n  set<const Descriptor*> groups;\n  for (int i = 0; i < extension_count(); i++) {\n    if (extension(i)->type() == FieldDescriptor::TYPE_GROUP) {\n      groups.insert(extension(i)->message_type());\n    }\n  }\n\n  for (int i = 0; i < message_type_count(); i++) {\n    if (groups.count(message_type(i)) == 0) {\n      strings::SubstituteAndAppend(&contents, \"message $0\",\n                                   message_type(i)->name());\n      message_type(i)->DebugString(0, &contents);\n      contents.append(\"\\n\");\n    }\n  }\n\n  for (int i = 0; i < service_count(); i++) {\n    service(i)->DebugString(&contents);\n    contents.append(\"\\n\");\n  }\n\n  const Descriptor* containing_type = NULL;\n  for (int i = 0; i < extension_count(); i++) {\n    if (extension(i)->containing_type() != containing_type) {\n      if (i > 0) contents.append(\"}\\n\\n\");\n      containing_type = extension(i)->containing_type();\n      strings::SubstituteAndAppend(&contents, \"extend .$0 {\\n\",\n                                   containing_type->full_name());\n    }\n    extension(i)->DebugString(1, &contents);\n  }\n  if (extension_count() > 0) contents.append(\"}\\n\\n\");\n\n  return contents;\n}\n\nstring Descriptor::DebugString() const {\n  string contents;\n  strings::SubstituteAndAppend(&contents, \"message $0\", name());\n  DebugString(0, &contents);\n  return contents;\n}\n\nvoid Descriptor::DebugString(int depth, string *contents) const {\n  string prefix(depth * 2, ' ');\n  ++depth;\n  contents->append(\" {\\n\");\n\n  FormatLineOptions(depth, options(), contents);\n\n  // Find all the 'group' types for fields and extensions; we will not output\n  // their nested definitions (those will be done with their group field\n  // descriptor).\n  set<const Descriptor*> groups;\n  for (int i = 0; i < field_count(); i++) {\n    if (field(i)->type() == FieldDescriptor::TYPE_GROUP) {\n      groups.insert(field(i)->message_type());\n    }\n  }\n  for (int i = 0; i < extension_count(); i++) {\n    if (extension(i)->type() == FieldDescriptor::TYPE_GROUP) {\n      groups.insert(extension(i)->message_type());\n    }\n  }\n\n  for (int i = 0; i < nested_type_count(); i++) {\n    if (groups.count(nested_type(i)) == 0) {\n      strings::SubstituteAndAppend(contents, \"$0  message $1\",\n                                   prefix, nested_type(i)->name());\n      nested_type(i)->DebugString(depth, contents);\n    }\n  }\n  for (int i = 0; i < enum_type_count(); i++) {\n    enum_type(i)->DebugString(depth, contents);\n  }\n  for (int i = 0; i < field_count(); i++) {\n    field(i)->DebugString(depth, contents);\n  }\n\n  for (int i = 0; i < extension_range_count(); i++) {\n    strings::SubstituteAndAppend(contents, \"$0  extensions $1 to $2;\\n\",\n                                 prefix,\n                                 extension_range(i)->start,\n                                 extension_range(i)->end - 1);\n  }\n\n  // Group extensions by what they extend, so they can be printed out together.\n  const Descriptor* containing_type = NULL;\n  for (int i = 0; i < extension_count(); i++) {\n    if (extension(i)->containing_type() != containing_type) {\n      if (i > 0) strings::SubstituteAndAppend(contents, \"$0  }\\n\", prefix);\n      containing_type = extension(i)->containing_type();\n      strings::SubstituteAndAppend(contents, \"$0  extend .$1 {\\n\",\n                                   prefix, containing_type->full_name());\n    }\n    extension(i)->DebugString(depth + 1, contents);\n  }\n  if (extension_count() > 0)\n    strings::SubstituteAndAppend(contents, \"$0  }\\n\", prefix);\n\n  strings::SubstituteAndAppend(contents, \"$0}\\n\", prefix);\n}\n\nstring FieldDescriptor::DebugString() const {\n  string contents;\n  int depth = 0;\n  if (is_extension()) {\n    strings::SubstituteAndAppend(&contents, \"extend .$0 {\\n\",\n                                 containing_type()->full_name());\n    depth = 1;\n  }\n  DebugString(depth, &contents);\n  if (is_extension()) {\n     contents.append(\"}\\n\");\n  }\n  return contents;\n}\n\nvoid FieldDescriptor::DebugString(int depth, string *contents) const {\n  string prefix(depth * 2, ' ');\n  string field_type;\n  switch (type()) {\n    case TYPE_MESSAGE:\n      field_type = \".\" + message_type()->full_name();\n      break;\n    case TYPE_ENUM:\n      field_type = \".\" + enum_type()->full_name();\n      break;\n    default:\n      field_type = kTypeToName[type()];\n  }\n\n  strings::SubstituteAndAppend(contents, \"$0$1 $2 $3 = $4\",\n                               prefix,\n                               kLabelToName[label()],\n                               field_type,\n                               type() == TYPE_GROUP ? message_type()->name() :\n                                                      name(),\n                               number());\n\n  bool bracketed = false;\n  if (has_default_value()) {\n    bracketed = true;\n    strings::SubstituteAndAppend(contents, \" [default = $0\",\n                                 DefaultValueAsString(true));\n  }\n\n  string formatted_options;\n  if (FormatBracketedOptions(options(), &formatted_options)) {\n    contents->append(bracketed ? \", \" : \" [\");\n    bracketed = true;\n    contents->append(formatted_options);\n  }\n\n  if (bracketed) {\n    contents->append(\"]\");\n  }\n\n  if (type() == TYPE_GROUP) {\n    message_type()->DebugString(depth, contents);\n  } else {\n    contents->append(\";\\n\");\n  }\n}\n\nstring EnumDescriptor::DebugString() const {\n  string contents;\n  DebugString(0, &contents);\n  return contents;\n}\n\nvoid EnumDescriptor::DebugString(int depth, string *contents) const {\n  string prefix(depth * 2, ' ');\n  ++depth;\n  strings::SubstituteAndAppend(contents, \"$0enum $1 {\\n\",\n                               prefix, name());\n\n  FormatLineOptions(depth, options(), contents);\n\n  for (int i = 0; i < value_count(); i++) {\n    value(i)->DebugString(depth, contents);\n  }\n  strings::SubstituteAndAppend(contents, \"$0}\\n\", prefix);\n}\n\nstring EnumValueDescriptor::DebugString() const {\n  string contents;\n  DebugString(0, &contents);\n  return contents;\n}\n\nvoid EnumValueDescriptor::DebugString(int depth, string *contents) const {\n  string prefix(depth * 2, ' ');\n  strings::SubstituteAndAppend(contents, \"$0$1 = $2\",\n                               prefix, name(), number());\n\n  string formatted_options;\n  if (FormatBracketedOptions(options(), &formatted_options)) {\n    strings::SubstituteAndAppend(contents, \" [$0]\", formatted_options);\n  }\n  contents->append(\";\\n\");\n}\n\nstring ServiceDescriptor::DebugString() const {\n  string contents;\n  DebugString(&contents);\n  return contents;\n}\n\nvoid ServiceDescriptor::DebugString(string *contents) const {\n  strings::SubstituteAndAppend(contents, \"service $0 {\\n\", name());\n\n  FormatLineOptions(1, options(), contents);\n\n  for (int i = 0; i < method_count(); i++) {\n    method(i)->DebugString(1, contents);\n  }\n\n  contents->append(\"}\\n\");\n}\n\nstring MethodDescriptor::DebugString() const {\n  string contents;\n  DebugString(0, &contents);\n  return contents;\n}\n\nvoid MethodDescriptor::DebugString(int depth, string *contents) const {\n  string prefix(depth * 2, ' ');\n  ++depth;\n  strings::SubstituteAndAppend(contents, \"$0rpc $1(.$2) returns (.$3)\",\n                               prefix, name(),\n                               input_type()->full_name(),\n                               output_type()->full_name());\n\n  string formatted_options;\n  if (FormatLineOptions(depth, options(), &formatted_options)) {\n    strings::SubstituteAndAppend(contents, \" {\\n$0$1}\\n\",\n                                 formatted_options, prefix);\n  } else {\n    contents->append(\";\\n\");\n  }\n}\n// ===================================================================\n\nnamespace {\n\n// Represents an options message to interpret. Extension names in the option\n// name are respolved relative to name_scope. element_name and orig_opt are\n// used only for error reporting (since the parser records locations against\n// pointers in the original options, not the mutable copy). The Message must be\n// one of the Options messages in descriptor.proto.\nstruct OptionsToInterpret {\n  OptionsToInterpret(const string& ns,\n                     const string& el,\n                     const Message* orig_opt,\n                     Message* opt)\n      : name_scope(ns),\n        element_name(el),\n        original_options(orig_opt),\n        options(opt) {\n  }\n  string name_scope;\n  string element_name;\n  const Message* original_options;\n  Message* options;\n};\n\n}  // namespace\n\nclass DescriptorBuilder {\n public:\n  DescriptorBuilder(const DescriptorPool* pool,\n                    DescriptorPool::Tables* tables,\n                    DescriptorPool::ErrorCollector* error_collector);\n  ~DescriptorBuilder();\n\n  const FileDescriptor* BuildFile(const FileDescriptorProto& proto);\n\n private:\n  friend class OptionInterpreter;\n\n  const DescriptorPool* pool_;\n  DescriptorPool::Tables* tables_;  // for convenience\n  DescriptorPool::ErrorCollector* error_collector_;\n\n  // As we build descriptors we store copies of the options messages in\n  // them. We put pointers to those copies in this vector, as we build, so we\n  // can later (after cross-linking) interpret those options.\n  vector<OptionsToInterpret> options_to_interpret_;\n\n  bool had_errors_;\n  string filename_;\n  FileDescriptor* file_;\n  FileDescriptorTables* file_tables_;\n\n  // If LookupSymbol() finds a symbol that is in a file which is not a declared\n  // dependency of this file, it will fail, but will set\n  // possible_undeclared_dependency_ to point at that file.  This is only used\n  // by AddNotDefinedError() to report a more useful error message.\n  // possible_undeclared_dependency_name_ is the name of the symbol that was\n  // actually found in possible_undeclared_dependency_, which may be a parent\n  // of the symbol actually looked for.\n  const FileDescriptor* possible_undeclared_dependency_;\n  string possible_undeclared_dependency_name_;\n\n  void AddError(const string& element_name,\n                const Message& descriptor,\n                DescriptorPool::ErrorCollector::ErrorLocation location,\n                const string& error);\n\n  // Adds an error indicating that undefined_symbol was not defined.  Must\n  // only be called after LookupSymbol() fails.\n  void AddNotDefinedError(\n    const string& element_name,\n    const Message& descriptor,\n    DescriptorPool::ErrorCollector::ErrorLocation location,\n    const string& undefined_symbol);\n\n  // Silly helper which determines if the given file is in the given package.\n  // I.e., either file->package() == package_name or file->package() is a\n  // nested package within package_name.\n  bool IsInPackage(const FileDescriptor* file, const string& package_name);\n\n  // Like tables_->FindSymbol(), but additionally:\n  // - Search the pool's underlay if not found in tables_.\n  // - Insure that the resulting Symbol is from one of the file's declared\n  //   dependencies.\n  Symbol FindSymbol(const string& name);\n\n  // Like FindSymbol() but does not require that the symbol is in one of the\n  // file's declared dependencies.\n  Symbol FindSymbolNotEnforcingDeps(const string& name);\n\n  // Like FindSymbol(), but looks up the name relative to some other symbol\n  // name.  This first searches siblings of relative_to, then siblings of its\n  // parents, etc.  For example, LookupSymbol(\"foo.bar\", \"baz.qux.corge\") makes\n  // the following calls, returning the first non-null result:\n  // FindSymbol(\"baz.qux.foo.bar\"), FindSymbol(\"baz.foo.bar\"),\n  // FindSymbol(\"foo.bar\").  If AllowUnknownDependencies() has been called\n  // on the DescriptorPool, this will generate a placeholder type if\n  // the name is not found (unless the name itself is malformed).  The\n  // placeholder_type parameter indicates what kind of placeholder should be\n  // constructed in this case.  The resolve_mode parameter determines whether\n  // any symbol is returned, or only symbols that are types.  Note, however,\n  // that LookupSymbol may still return a non-type symbol in LOOKUP_TYPES mode,\n  // if it believes that's all it could refer to.  The caller should always\n  // check that it receives the type of symbol it was expecting.\n  enum PlaceholderType {\n    PLACEHOLDER_MESSAGE,\n    PLACEHOLDER_ENUM,\n    PLACEHOLDER_EXTENDABLE_MESSAGE\n  };\n  enum ResolveMode {\n    LOOKUP_ALL, LOOKUP_TYPES\n  };\n  Symbol LookupSymbol(const string& name, const string& relative_to,\n                      PlaceholderType placeholder_type = PLACEHOLDER_MESSAGE,\n                      ResolveMode resolve_mode = LOOKUP_ALL);\n\n  // Like LookupSymbol() but will not return a placeholder even if\n  // AllowUnknownDependencies() has been used.\n  Symbol LookupSymbolNoPlaceholder(const string& name,\n                                   const string& relative_to,\n                                   ResolveMode resolve_mode = LOOKUP_ALL);\n\n  // Creates a placeholder type suitable for return from LookupSymbol().  May\n  // return kNullSymbol if the name is not a valid type name.\n  Symbol NewPlaceholder(const string& name, PlaceholderType placeholder_type);\n\n  // Creates a placeholder file.  Never returns NULL.  This is used when an\n  // import is not found and AllowUnknownDependencies() is enabled.\n  const FileDescriptor* NewPlaceholderFile(const string& name);\n\n  // Calls tables_->AddSymbol() and records an error if it fails.  Returns\n  // true if successful or false if failed, though most callers can ignore\n  // the return value since an error has already been recorded.\n  bool AddSymbol(const string& full_name,\n                 const void* parent, const string& name,\n                 const Message& proto, Symbol symbol);\n\n  // Like AddSymbol(), but succeeds if the symbol is already defined as long\n  // as the existing definition is also a package (because it's OK to define\n  // the same package in two different files).  Also adds all parents of the\n  // packgae to the symbol table (e.g. AddPackage(\"foo.bar\", ...) will add\n  // \"foo.bar\" and \"foo\" to the table).\n  void AddPackage(const string& name, const Message& proto,\n                  const FileDescriptor* file);\n\n  // Checks that the symbol name contains only alphanumeric characters and\n  // underscores.  Records an error otherwise.\n  void ValidateSymbolName(const string& name, const string& full_name,\n                          const Message& proto);\n\n  // Like ValidateSymbolName(), but the name is allowed to contain periods and\n  // an error is indicated by returning false (not recording the error).\n  bool ValidateQualifiedName(const string& name);\n\n  // Used by BUILD_ARRAY macro (below) to avoid having to have the type\n  // specified as a macro parameter.\n  template <typename Type>\n  inline void AllocateArray(int size, Type** output) {\n    *output = tables_->AllocateArray<Type>(size);\n  }\n\n  // Allocates a copy of orig_options in tables_ and stores it in the\n  // descriptor. Remembers its uninterpreted options, to be interpreted\n  // later. DescriptorT must be one of the Descriptor messages from\n  // descriptor.proto.\n  template<class DescriptorT> void AllocateOptions(\n      const typename DescriptorT::OptionsType& orig_options,\n      DescriptorT* descriptor);\n  // Specialization for FileOptions.\n  void AllocateOptions(const FileOptions& orig_options,\n                       FileDescriptor* descriptor);\n\n  // Implementation for AllocateOptions(). Don't call this directly.\n  template<class DescriptorT> void AllocateOptionsImpl(\n      const string& name_scope,\n      const string& element_name,\n      const typename DescriptorT::OptionsType& orig_options,\n      DescriptorT* descriptor);\n\n  // These methods all have the same signature for the sake of the BUILD_ARRAY\n  // macro, below.\n  void BuildMessage(const DescriptorProto& proto,\n                    const Descriptor* parent,\n                    Descriptor* result);\n  void BuildFieldOrExtension(const FieldDescriptorProto& proto,\n                             const Descriptor* parent,\n                             FieldDescriptor* result,\n                             bool is_extension);\n  void BuildField(const FieldDescriptorProto& proto,\n                  const Descriptor* parent,\n                  FieldDescriptor* result) {\n    BuildFieldOrExtension(proto, parent, result, false);\n  }\n  void BuildExtension(const FieldDescriptorProto& proto,\n                      const Descriptor* parent,\n                      FieldDescriptor* result) {\n    BuildFieldOrExtension(proto, parent, result, true);\n  }\n  void BuildExtensionRange(const DescriptorProto::ExtensionRange& proto,\n                           const Descriptor* parent,\n                           Descriptor::ExtensionRange* result);\n  void BuildEnum(const EnumDescriptorProto& proto,\n                 const Descriptor* parent,\n                 EnumDescriptor* result);\n  void BuildEnumValue(const EnumValueDescriptorProto& proto,\n                      const EnumDescriptor* parent,\n                      EnumValueDescriptor* result);\n  void BuildService(const ServiceDescriptorProto& proto,\n                    const void* dummy,\n                    ServiceDescriptor* result);\n  void BuildMethod(const MethodDescriptorProto& proto,\n                   const ServiceDescriptor* parent,\n                   MethodDescriptor* result);\n\n  // Must be run only after building.\n  //\n  // NOTE: Options will not be available during cross-linking, as they\n  // have not yet been interpreted. Defer any handling of options to the\n  // Validate*Options methods.\n  void CrossLinkFile(FileDescriptor* file, const FileDescriptorProto& proto);\n  void CrossLinkMessage(Descriptor* message, const DescriptorProto& proto);\n  void CrossLinkField(FieldDescriptor* field,\n                      const FieldDescriptorProto& proto);\n  void CrossLinkEnum(EnumDescriptor* enum_type,\n                     const EnumDescriptorProto& proto);\n  void CrossLinkEnumValue(EnumValueDescriptor* enum_value,\n                          const EnumValueDescriptorProto& proto);\n  void CrossLinkService(ServiceDescriptor* service,\n                        const ServiceDescriptorProto& proto);\n  void CrossLinkMethod(MethodDescriptor* method,\n                       const MethodDescriptorProto& proto);\n\n  // Must be run only after cross-linking.\n  void InterpretOptions();\n\n  // A helper class for interpreting options.\n  class OptionInterpreter {\n   public:\n    // Creates an interpreter that operates in the context of the pool of the\n    // specified builder, which must not be NULL. We don't take ownership of the\n    // builder.\n    explicit OptionInterpreter(DescriptorBuilder* builder);\n\n    ~OptionInterpreter();\n\n    // Interprets the uninterpreted options in the specified Options message.\n    // On error, calls AddError() on the underlying builder and returns false.\n    // Otherwise returns true.\n    bool InterpretOptions(OptionsToInterpret* options_to_interpret);\n\n    class AggregateOptionFinder;\n\n   private:\n    // Interprets uninterpreted_option_ on the specified message, which\n    // must be the mutable copy of the original options message to which\n    // uninterpreted_option_ belongs.\n    bool InterpretSingleOption(Message* options);\n\n    // Adds the uninterpreted_option to the given options message verbatim.\n    // Used when AllowUnknownDependencies() is in effect and we can't find\n    // the option's definition.\n    void AddWithoutInterpreting(const UninterpretedOption& uninterpreted_option,\n                                Message* options);\n\n    // A recursive helper function that drills into the intermediate fields\n    // in unknown_fields to check if field innermost_field is set on the\n    // innermost message. Returns false and sets an error if so.\n    bool ExamineIfOptionIsSet(\n        vector<const FieldDescriptor*>::const_iterator intermediate_fields_iter,\n        vector<const FieldDescriptor*>::const_iterator intermediate_fields_end,\n        const FieldDescriptor* innermost_field, const string& debug_msg_name,\n        const UnknownFieldSet& unknown_fields);\n\n    // Validates the value for the option field of the currently interpreted\n    // option and then sets it on the unknown_field.\n    bool SetOptionValue(const FieldDescriptor* option_field,\n                        UnknownFieldSet* unknown_fields);\n\n    // Parses an aggregate value for a CPPTYPE_MESSAGE option and\n    // saves it into *unknown_fields.\n    bool SetAggregateOption(const FieldDescriptor* option_field,\n                            UnknownFieldSet* unknown_fields);\n\n    // Convenience functions to set an int field the right way, depending on\n    // its wire type (a single int CppType can represent multiple wire types).\n    void SetInt32(int number, int32 value, FieldDescriptor::Type type,\n                  UnknownFieldSet* unknown_fields);\n    void SetInt64(int number, int64 value, FieldDescriptor::Type type,\n                  UnknownFieldSet* unknown_fields);\n    void SetUInt32(int number, uint32 value, FieldDescriptor::Type type,\n                   UnknownFieldSet* unknown_fields);\n    void SetUInt64(int number, uint64 value, FieldDescriptor::Type type,\n                   UnknownFieldSet* unknown_fields);\n\n    // A helper function that adds an error at the specified location of the\n    // option we're currently interpreting, and returns false.\n    bool AddOptionError(DescriptorPool::ErrorCollector::ErrorLocation location,\n                        const string& msg) {\n      builder_->AddError(options_to_interpret_->element_name,\n                         *uninterpreted_option_, location, msg);\n      return false;\n    }\n\n    // A helper function that adds an error at the location of the option name\n    // and returns false.\n    bool AddNameError(const string& msg) {\n      return AddOptionError(DescriptorPool::ErrorCollector::OPTION_NAME, msg);\n    }\n\n    // A helper function that adds an error at the location of the option name\n    // and returns false.\n    bool AddValueError(const string& msg) {\n      return AddOptionError(DescriptorPool::ErrorCollector::OPTION_VALUE, msg);\n    }\n\n    // We interpret against this builder's pool. Is never NULL. We don't own\n    // this pointer.\n    DescriptorBuilder* builder_;\n\n    // The options we're currently interpreting, or NULL if we're not in a call\n    // to InterpretOptions.\n    const OptionsToInterpret* options_to_interpret_;\n\n    // The option we're currently interpreting within options_to_interpret_, or\n    // NULL if we're not in a call to InterpretOptions(). This points to a\n    // submessage of the original option, not the mutable copy. Therefore we\n    // can use it to find locations recorded by the parser.\n    const UninterpretedOption* uninterpreted_option_;\n\n    // Factory used to create the dynamic messages we need to parse\n    // any aggregate option values we encounter.\n    DynamicMessageFactory dynamic_factory_;\n\n    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OptionInterpreter);\n  };\n\n  // Work-around for broken compilers:  According to the C++ standard,\n  // OptionInterpreter should have access to the private members of any class\n  // which has declared DescriptorBuilder as a friend.  Unfortunately some old\n  // versions of GCC and other compilers do not implement this correctly.  So,\n  // we have to have these intermediate methods to provide access.  We also\n  // redundantly declare OptionInterpreter a friend just to make things extra\n  // clear for these bad compilers.\n  friend class OptionInterpreter;\n  friend class OptionInterpreter::AggregateOptionFinder;\n\n  static inline bool get_allow_unknown(const DescriptorPool* pool) {\n    return pool->allow_unknown_;\n  }\n  static inline bool get_is_placeholder(const Descriptor* descriptor) {\n    return descriptor->is_placeholder_;\n  }\n  static inline void assert_mutex_held(const DescriptorPool* pool) {\n    if (pool->mutex_ != NULL) {\n      pool->mutex_->AssertHeld();\n    }\n  }\n\n  // Must be run only after options have been interpreted.\n  //\n  // NOTE: Validation code must only reference the options in the mutable\n  // descriptors, which are the ones that have been interpreted. The const\n  // proto references are passed in only so they can be provided to calls to\n  // AddError(). Do not look at their options, which have not been interpreted.\n  void ValidateFileOptions(FileDescriptor* file,\n                           const FileDescriptorProto& proto);\n  void ValidateMessageOptions(Descriptor* message,\n                              const DescriptorProto& proto);\n  void ValidateFieldOptions(FieldDescriptor* field,\n                            const FieldDescriptorProto& proto);\n  void ValidateEnumOptions(EnumDescriptor* enm,\n                           const EnumDescriptorProto& proto);\n  void ValidateEnumValueOptions(EnumValueDescriptor* enum_value,\n                                const EnumValueDescriptorProto& proto);\n  void ValidateServiceOptions(ServiceDescriptor* service,\n                              const ServiceDescriptorProto& proto);\n  void ValidateMethodOptions(MethodDescriptor* method,\n                             const MethodDescriptorProto& proto);\n\n  void ValidateMapKey(FieldDescriptor* field,\n                      const FieldDescriptorProto& proto);\n};\n\nconst FileDescriptor* DescriptorPool::BuildFile(\n    const FileDescriptorProto& proto) {\n  GOOGLE_CHECK(fallback_database_ == NULL)\n    << \"Cannot call BuildFile on a DescriptorPool that uses a \"\n       \"DescriptorDatabase.  You must instead find a way to get your file \"\n       \"into the underlying database.\";\n  GOOGLE_CHECK(mutex_ == NULL);   // Implied by the above GOOGLE_CHECK.\n  return DescriptorBuilder(this, tables_.get(), NULL).BuildFile(proto);\n}\n\nconst FileDescriptor* DescriptorPool::BuildFileCollectingErrors(\n    const FileDescriptorProto& proto,\n    ErrorCollector* error_collector) {\n  GOOGLE_CHECK(fallback_database_ == NULL)\n    << \"Cannot call BuildFile on a DescriptorPool that uses a \"\n       \"DescriptorDatabase.  You must instead find a way to get your file \"\n       \"into the underlying database.\";\n  GOOGLE_CHECK(mutex_ == NULL);   // Implied by the above GOOGLE_CHECK.\n  return DescriptorBuilder(this, tables_.get(),\n                           error_collector).BuildFile(proto);\n}\n\nconst FileDescriptor* DescriptorPool::BuildFileFromDatabase(\n    const FileDescriptorProto& proto) const {\n  mutex_->AssertHeld();\n  return DescriptorBuilder(this, tables_.get(),\n                           default_error_collector_).BuildFile(proto);\n}\n\nDescriptorBuilder::DescriptorBuilder(\n    const DescriptorPool* pool,\n    DescriptorPool::Tables* tables,\n    DescriptorPool::ErrorCollector* error_collector)\n  : pool_(pool),\n    tables_(tables),\n    error_collector_(error_collector),\n    had_errors_(false),\n    possible_undeclared_dependency_(NULL) {}\n\nDescriptorBuilder::~DescriptorBuilder() {}\n\nvoid DescriptorBuilder::AddError(\n    const string& element_name,\n    const Message& descriptor,\n    DescriptorPool::ErrorCollector::ErrorLocation location,\n    const string& error) {\n  if (error_collector_ == NULL) {\n    if (!had_errors_) {\n      GOOGLE_LOG(ERROR) << \"Invalid proto descriptor for file \\\"\" << filename_\n                 << \"\\\":\";\n    }\n    GOOGLE_LOG(ERROR) << \"  \" << element_name << \": \" << error;\n  } else {\n    error_collector_->AddError(filename_, element_name,\n                               &descriptor, location, error);\n  }\n  had_errors_ = true;\n}\n\nvoid DescriptorBuilder::AddNotDefinedError(\n    const string& element_name,\n    const Message& descriptor,\n    DescriptorPool::ErrorCollector::ErrorLocation location,\n    const string& undefined_symbol) {\n  if (possible_undeclared_dependency_ == NULL) {\n    AddError(element_name, descriptor, location,\n             \"\\\"\" + undefined_symbol + \"\\\" is not defined.\");\n  } else {\n    AddError(element_name, descriptor, location,\n             \"\\\"\" + possible_undeclared_dependency_name_ +\n             \"\\\" seems to be defined in \\\"\" +\n             possible_undeclared_dependency_->name() + \"\\\", which is not \"\n             \"imported by \\\"\" + filename_ + \"\\\".  To use it here, please \"\n             \"add the necessary import.\");\n  }\n}\n\nbool DescriptorBuilder::IsInPackage(const FileDescriptor* file,\n                                    const string& package_name) {\n  return HasPrefixString(file->package(), package_name) &&\n           (file->package().size() == package_name.size() ||\n            file->package()[package_name.size()] == '.');\n}\n\nSymbol DescriptorBuilder::FindSymbolNotEnforcingDeps(const string& name) {\n  Symbol result;\n\n  // We need to search our pool and all its underlays.\n  const DescriptorPool* pool = pool_;\n  while (true) {\n    // If we are looking at an underlay, we must lock its mutex_, since we are\n    // accessing the underlay's tables_ dircetly.\n    MutexLockMaybe lock((pool == pool_) ? NULL : pool->mutex_);\n\n    // Note that we don't have to check fallback_database_ here because the\n    // symbol has to be in one of its file's direct dependencies, and we have\n    // already loaded those by the time we get here.\n    result = pool->tables_->FindSymbol(name);\n    if (!result.IsNull()) break;\n    if (pool->underlay_ == NULL) return kNullSymbol;\n    pool = pool->underlay_;\n  }\n\n  return result;\n}\n\nSymbol DescriptorBuilder::FindSymbol(const string& name) {\n  Symbol result = FindSymbolNotEnforcingDeps(name);\n\n  if (!pool_->enforce_dependencies_) {\n    // Hack for CompilerUpgrader.\n    return result;\n  }\n\n  // Only find symbols which were defined in this file or one of its\n  // dependencies.\n  const FileDescriptor* file = result.GetFile();\n  if (file == file_) return result;\n  for (int i = 0; i < file_->dependency_count(); i++) {\n    if (file == file_->dependency(i)) return result;\n  }\n\n  if (result.type == Symbol::PACKAGE) {\n    // Arg, this is overcomplicated.  The symbol is a package name.  It could\n    // be that the package was defined in multiple files.  result.GetFile()\n    // returns the first file we saw that used this package.  We've determined\n    // that that file is not a direct dependency of the file we are currently\n    // building, but it could be that some other file which *is* a direct\n    // dependency also defines the same package.  We can't really rule out this\n    // symbol unless none of the dependencies define it.\n    if (IsInPackage(file_, name)) return result;\n    for (int i = 0; i < file_->dependency_count(); i++) {\n      // Note:  A dependency may be NULL if it was not found or had errors.\n      if (file_->dependency(i) != NULL &&\n          IsInPackage(file_->dependency(i), name)) {\n        return result;\n      }\n    }\n  }\n\n  possible_undeclared_dependency_ = file;\n  possible_undeclared_dependency_name_ = name;\n  return kNullSymbol;\n}\n\nSymbol DescriptorBuilder::LookupSymbolNoPlaceholder(\n    const string& name, const string& relative_to, ResolveMode resolve_mode) {\n  possible_undeclared_dependency_ = NULL;\n\n  if (name.size() > 0 && name[0] == '.') {\n    // Fully-qualified name.\n    return FindSymbol(name.substr(1));\n  }\n\n  // If name is something like \"Foo.Bar.baz\", and symbols named \"Foo\" are\n  // defined in multiple parent scopes, we only want to find \"Bar.baz\" in the\n  // innermost one.  E.g., the following should produce an error:\n  //   message Bar { message Baz {} }\n  //   message Foo {\n  //     message Bar {\n  //     }\n  //     optional Bar.Baz baz = 1;\n  //   }\n  // So, we look for just \"Foo\" first, then look for \"Bar.baz\" within it if\n  // found.\n  int name_dot_pos = name.find_first_of('.');\n  string first_part_of_name;\n  if (name_dot_pos == string::npos) {\n    first_part_of_name = name;\n  } else {\n    first_part_of_name = name.substr(0, name_dot_pos);\n  }\n\n  string scope_to_try(relative_to);\n\n  while (true) {\n    // Chop off the last component of the scope.\n    string::size_type dot_pos = scope_to_try.find_last_of('.');\n    if (dot_pos == string::npos) {\n      return FindSymbol(name);\n    } else {\n      scope_to_try.erase(dot_pos);\n    }\n\n    // Append \".first_part_of_name\" and try to find.\n    string::size_type old_size = scope_to_try.size();\n    scope_to_try.append(1, '.');\n    scope_to_try.append(first_part_of_name);\n    Symbol result = FindSymbol(scope_to_try);\n    if (!result.IsNull()) {\n      if (first_part_of_name.size() < name.size()) {\n        // name is a compound symbol, of which we only found the first part.\n        // Now try to look up the rest of it.\n        if (result.IsAggregate()) {\n          scope_to_try.append(name, first_part_of_name.size(),\n                              name.size() - first_part_of_name.size());\n          return FindSymbol(scope_to_try);\n        } else {\n          // We found a symbol but it's not an aggregate.  Continue the loop.\n        }\n      } else {\n        if (resolve_mode == LOOKUP_TYPES && !result.IsType()) {\n          // We found a symbol but it's not a type.  Continue the loop.\n        } else {\n          return result;\n        }\n      }\n    }\n\n    // Not found.  Remove the name so we can try again.\n    scope_to_try.erase(old_size);\n  }\n}\n\nSymbol DescriptorBuilder::LookupSymbol(\n    const string& name, const string& relative_to,\n    PlaceholderType placeholder_type, ResolveMode resolve_mode) {\n  Symbol result = LookupSymbolNoPlaceholder(\n      name, relative_to, resolve_mode);\n  if (result.IsNull() && pool_->allow_unknown_) {\n    // Not found, but AllowUnknownDependencies() is enabled.  Return a\n    // placeholder instead.\n    result = NewPlaceholder(name, placeholder_type);\n  }\n  return result;\n}\n\nSymbol DescriptorBuilder::NewPlaceholder(const string& name,\n                                         PlaceholderType placeholder_type) {\n  // Compute names.\n  const string* placeholder_full_name;\n  const string* placeholder_name;\n  const string* placeholder_package;\n\n  if (!ValidateQualifiedName(name)) return kNullSymbol;\n  if (name[0] == '.') {\n    // Fully-qualified.\n    placeholder_full_name = tables_->AllocateString(name.substr(1));\n  } else {\n    placeholder_full_name = tables_->AllocateString(name);\n  }\n\n  string::size_type dotpos = placeholder_full_name->find_last_of('.');\n  if (dotpos != string::npos) {\n    placeholder_package = tables_->AllocateString(\n      placeholder_full_name->substr(0, dotpos));\n    placeholder_name = tables_->AllocateString(\n      placeholder_full_name->substr(dotpos + 1));\n  } else {\n    placeholder_package = &kEmptyString;\n    placeholder_name = placeholder_full_name;\n  }\n\n  // Create the placeholders.\n  FileDescriptor* placeholder_file = tables_->Allocate<FileDescriptor>();\n  memset(placeholder_file, 0, sizeof(*placeholder_file));\n\n  placeholder_file->name_ =\n    tables_->AllocateString(*placeholder_full_name + \".placeholder.proto\");\n  placeholder_file->package_ = placeholder_package;\n  placeholder_file->pool_ = pool_;\n  placeholder_file->options_ = &FileOptions::default_instance();\n  placeholder_file->tables_ = &FileDescriptorTables::kEmpty;\n  // All other fields are zero or NULL.\n\n  if (placeholder_type == PLACEHOLDER_ENUM) {\n    placeholder_file->enum_type_count_ = 1;\n    placeholder_file->enum_types_ =\n      tables_->AllocateArray<EnumDescriptor>(1);\n\n    EnumDescriptor* placeholder_enum = &placeholder_file->enum_types_[0];\n    memset(placeholder_enum, 0, sizeof(*placeholder_enum));\n\n    placeholder_enum->full_name_ = placeholder_full_name;\n    placeholder_enum->name_ = placeholder_name;\n    placeholder_enum->file_ = placeholder_file;\n    placeholder_enum->options_ = &EnumOptions::default_instance();\n    placeholder_enum->is_placeholder_ = true;\n    placeholder_enum->is_unqualified_placeholder_ = (name[0] != '.');\n\n    // Enums must have at least one value.\n    placeholder_enum->value_count_ = 1;\n    placeholder_enum->values_ = tables_->AllocateArray<EnumValueDescriptor>(1);\n\n    EnumValueDescriptor* placeholder_value = &placeholder_enum->values_[0];\n    memset(placeholder_value, 0, sizeof(*placeholder_value));\n\n    placeholder_value->name_ = tables_->AllocateString(\"PLACEHOLDER_VALUE\");\n    // Note that enum value names are siblings of their type, not children.\n    placeholder_value->full_name_ =\n      placeholder_package->empty() ? placeholder_value->name_ :\n        tables_->AllocateString(*placeholder_package + \".PLACEHOLDER_VALUE\");\n\n    placeholder_value->number_ = 0;\n    placeholder_value->type_ = placeholder_enum;\n    placeholder_value->options_ = &EnumValueOptions::default_instance();\n\n    return Symbol(placeholder_enum);\n  } else {\n    placeholder_file->message_type_count_ = 1;\n    placeholder_file->message_types_ =\n      tables_->AllocateArray<Descriptor>(1);\n\n    Descriptor* placeholder_message = &placeholder_file->message_types_[0];\n    memset(placeholder_message, 0, sizeof(*placeholder_message));\n\n    placeholder_message->full_name_ = placeholder_full_name;\n    placeholder_message->name_ = placeholder_name;\n    placeholder_message->file_ = placeholder_file;\n    placeholder_message->options_ = &MessageOptions::default_instance();\n    placeholder_message->is_placeholder_ = true;\n    placeholder_message->is_unqualified_placeholder_ = (name[0] != '.');\n\n    if (placeholder_type == PLACEHOLDER_EXTENDABLE_MESSAGE) {\n      placeholder_message->extension_range_count_ = 1;\n      placeholder_message->extension_ranges_ =\n        tables_->AllocateArray<Descriptor::ExtensionRange>(1);\n      placeholder_message->extension_ranges_->start = 1;\n      // kMaxNumber + 1 because ExtensionRange::end is exclusive.\n      placeholder_message->extension_ranges_->end =\n        FieldDescriptor::kMaxNumber + 1;\n    }\n\n    return Symbol(placeholder_message);\n  }\n}\n\nconst FileDescriptor* DescriptorBuilder::NewPlaceholderFile(\n    const string& name) {\n  FileDescriptor* placeholder = tables_->Allocate<FileDescriptor>();\n  memset(placeholder, 0, sizeof(*placeholder));\n\n  placeholder->name_ = tables_->AllocateString(name);\n  placeholder->package_ = &kEmptyString;\n  placeholder->pool_ = pool_;\n  placeholder->options_ = &FileOptions::default_instance();\n  placeholder->tables_ = &FileDescriptorTables::kEmpty;\n  // All other fields are zero or NULL.\n\n  return placeholder;\n}\n\nbool DescriptorBuilder::AddSymbol(\n    const string& full_name, const void* parent, const string& name,\n    const Message& proto, Symbol symbol) {\n  // If the caller passed NULL for the parent, the symbol is at file scope.\n  // Use its file as the parent instead.\n  if (parent == NULL) parent = file_;\n\n  if (tables_->AddSymbol(full_name, symbol)) {\n    if (!file_tables_->AddAliasUnderParent(parent, name, symbol)) {\n      GOOGLE_LOG(DFATAL) << \"\\\"\" << full_name << \"\\\" not previously defined in \"\n                     \"symbols_by_name_, but was defined in symbols_by_parent_; \"\n                     \"this shouldn't be possible.\";\n      return false;\n    }\n    return true;\n  } else {\n    const FileDescriptor* other_file = tables_->FindSymbol(full_name).GetFile();\n    if (other_file == file_) {\n      string::size_type dot_pos = full_name.find_last_of('.');\n      if (dot_pos == string::npos) {\n        AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME,\n                 \"\\\"\" + full_name + \"\\\" is already defined.\");\n      } else {\n        AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME,\n                 \"\\\"\" + full_name.substr(dot_pos + 1) +\n                 \"\\\" is already defined in \\\"\" +\n                 full_name.substr(0, dot_pos) + \"\\\".\");\n      }\n    } else {\n      // Symbol seems to have been defined in a different file.\n      AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME,\n               \"\\\"\" + full_name + \"\\\" is already defined in file \\\"\" +\n               other_file->name() + \"\\\".\");\n    }\n    return false;\n  }\n}\n\nvoid DescriptorBuilder::AddPackage(\n    const string& name, const Message& proto, const FileDescriptor* file) {\n  if (tables_->AddSymbol(name, Symbol(file))) {\n    // Success.  Also add parent package, if any.\n    string::size_type dot_pos = name.find_last_of('.');\n    if (dot_pos == string::npos) {\n      // No parents.\n      ValidateSymbolName(name, name, proto);\n    } else {\n      // Has parent.\n      string* parent_name = tables_->AllocateString(name.substr(0, dot_pos));\n      AddPackage(*parent_name, proto, file);\n      ValidateSymbolName(name.substr(dot_pos + 1), name, proto);\n    }\n  } else {\n    Symbol existing_symbol = tables_->FindSymbol(name);\n    // It's OK to redefine a package.\n    if (existing_symbol.type != Symbol::PACKAGE) {\n      // Symbol seems to have been defined in a different file.\n      AddError(name, proto, DescriptorPool::ErrorCollector::NAME,\n               \"\\\"\" + name + \"\\\" is already defined (as something other than \"\n               \"a package) in file \\\"\" + existing_symbol.GetFile()->name() +\n               \"\\\".\");\n    }\n  }\n}\n\nvoid DescriptorBuilder::ValidateSymbolName(\n    const string& name, const string& full_name, const Message& proto) {\n  if (name.empty()) {\n    AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME,\n             \"Missing name.\");\n  } else {\n    for (int i = 0; i < name.size(); i++) {\n      // I don't trust isalnum() due to locales.  :(\n      if ((name[i] < 'a' || 'z' < name[i]) &&\n          (name[i] < 'A' || 'Z' < name[i]) &&\n          (name[i] < '0' || '9' < name[i]) &&\n          (name[i] != '_')) {\n        AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME,\n                 \"\\\"\" + name + \"\\\" is not a valid identifier.\");\n      }\n    }\n  }\n}\n\nbool DescriptorBuilder::ValidateQualifiedName(const string& name) {\n  bool last_was_period = false;\n\n  for (int i = 0; i < name.size(); i++) {\n    // I don't trust isalnum() due to locales.  :(\n    if (('a' <= name[i] && name[i] <= 'z') ||\n        ('A' <= name[i] && name[i] <= 'Z') ||\n        ('0' <= name[i] && name[i] <= '9') ||\n        (name[i] == '_')) {\n      last_was_period = false;\n    } else if (name[i] == '.') {\n      if (last_was_period) return false;\n      last_was_period = true;\n    } else {\n      return false;\n    }\n  }\n\n  return !name.empty() && !last_was_period;\n}\n\n// -------------------------------------------------------------------\n\n// This generic implementation is good for all descriptors except\n// FileDescriptor.\ntemplate<class DescriptorT> void DescriptorBuilder::AllocateOptions(\n    const typename DescriptorT::OptionsType& orig_options,\n    DescriptorT* descriptor) {\n  AllocateOptionsImpl(descriptor->full_name(), descriptor->full_name(),\n                      orig_options, descriptor);\n}\n\n// We specialize for FileDescriptor.\nvoid DescriptorBuilder::AllocateOptions(const FileOptions& orig_options,\n                                        FileDescriptor* descriptor) {\n  // We add the dummy token so that LookupSymbol does the right thing.\n  AllocateOptionsImpl(descriptor->package() + \".dummy\", descriptor->name(),\n                      orig_options, descriptor);\n}\n\ntemplate<class DescriptorT> void DescriptorBuilder::AllocateOptionsImpl(\n    const string& name_scope,\n    const string& element_name,\n    const typename DescriptorT::OptionsType& orig_options,\n    DescriptorT* descriptor) {\n  // We need to use a dummy pointer to work around a bug in older versions of\n  // GCC.  Otherwise, the following two lines could be replaced with:\n  //   typename DescriptorT::OptionsType* options =\n  //       tables_->AllocateMessage<typename DescriptorT::OptionsType>();\n  typename DescriptorT::OptionsType* const dummy = NULL;\n  typename DescriptorT::OptionsType* options = tables_->AllocateMessage(dummy);\n  options->CopyFrom(orig_options);\n  descriptor->options_ = options;\n\n  // Don't add to options_to_interpret_ unless there were uninterpreted\n  // options.  This not only avoids unnecessary work, but prevents a\n  // bootstrapping problem when building descriptors for descriptor.proto.\n  // descriptor.proto does not contain any uninterpreted options, but\n  // attempting to interpret options anyway will cause\n  // OptionsType::GetDescriptor() to be called which may then deadlock since\n  // we're still trying to build it.\n  if (options->uninterpreted_option_size() > 0) {\n    options_to_interpret_.push_back(\n        OptionsToInterpret(name_scope, element_name, &orig_options, options));\n  }\n}\n\n\n// A common pattern:  We want to convert a repeated field in the descriptor\n// to an array of values, calling some method to build each value.\n#define BUILD_ARRAY(INPUT, OUTPUT, NAME, METHOD, PARENT)             \\\n  OUTPUT->NAME##_count_ = INPUT.NAME##_size();                       \\\n  AllocateArray(INPUT.NAME##_size(), &OUTPUT->NAME##s_);             \\\n  for (int i = 0; i < INPUT.NAME##_size(); i++) {                    \\\n    METHOD(INPUT.NAME(i), PARENT, OUTPUT->NAME##s_ + i);             \\\n  }\n\nconst FileDescriptor* DescriptorBuilder::BuildFile(\n    const FileDescriptorProto& proto) {\n  filename_ = proto.name();\n\n  // Check if the file already exists and is identical to the one being built.\n  // Note:  This only works if the input is canonical -- that is, it\n  //   fully-qualifies all type names, has no UninterpretedOptions, etc.\n  //   This is fine, because this idempotency \"feature\" really only exists to\n  //   accomodate one hack in the proto1->proto2 migration layer.\n  const FileDescriptor* existing_file = tables_->FindFile(filename_);\n  if (existing_file != NULL) {\n    // File already in pool.  Compare the existing one to the input.\n    FileDescriptorProto existing_proto;\n    existing_file->CopyTo(&existing_proto);\n    if (existing_proto.SerializeAsString() == proto.SerializeAsString()) {\n      // They're identical.  Return the existing descriptor.\n      return existing_file;\n    }\n\n    // Not a match.  The error will be detected and handled later.\n  }\n\n  // Check to see if this file is already on the pending files list.\n  // TODO(kenton):  Allow recursive imports?  It may not work with some\n  //   (most?) programming languages.  E.g., in C++, a forward declaration\n  //   of a type is not sufficient to allow it to be used even in a\n  //   generated header file due to inlining.  This could perhaps be\n  //   worked around using tricks involving inserting #include statements\n  //   mid-file, but that's pretty ugly, and I'm pretty sure there are\n  //   some languages out there that do not allow recursive dependencies\n  //   at all.\n  for (int i = 0; i < tables_->pending_files_.size(); i++) {\n    if (tables_->pending_files_[i] == proto.name()) {\n      string error_message(\"File recursively imports itself: \");\n      for (; i < tables_->pending_files_.size(); i++) {\n        error_message.append(tables_->pending_files_[i]);\n        error_message.append(\" -> \");\n      }\n      error_message.append(proto.name());\n\n      AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER,\n               error_message);\n      return NULL;\n    }\n  }\n\n  // If we have a fallback_database_, attempt to load all dependencies now,\n  // before checkpointing tables_.  This avoids confusion with recursive\n  // checkpoints.\n  if (pool_->fallback_database_ != NULL) {\n    tables_->pending_files_.push_back(proto.name());\n    for (int i = 0; i < proto.dependency_size(); i++) {\n      if (tables_->FindFile(proto.dependency(i)) == NULL &&\n          (pool_->underlay_ == NULL ||\n           pool_->underlay_->FindFileByName(proto.dependency(i)) == NULL)) {\n        // We don't care what this returns since we'll find out below anyway.\n        pool_->TryFindFileInFallbackDatabase(proto.dependency(i));\n      }\n    }\n    tables_->pending_files_.pop_back();\n  }\n\n  // Checkpoint the tables so that we can roll back if something goes wrong.\n  tables_->Checkpoint();\n\n  FileDescriptor* result = tables_->Allocate<FileDescriptor>();\n  file_ = result;\n\n  file_tables_ = tables_->AllocateFileTables();\n  file_->tables_ = file_tables_;\n\n  if (!proto.has_name()) {\n    AddError(\"\", proto, DescriptorPool::ErrorCollector::OTHER,\n             \"Missing field: FileDescriptorProto.name.\");\n  }\n\n  result->name_ = tables_->AllocateString(proto.name());\n  if (proto.has_package()) {\n    result->package_ = tables_->AllocateString(proto.package());\n  } else {\n    // We cannot rely on proto.package() returning a valid string if\n    // proto.has_package() is false, because we might be running at static\n    // initialization time, in which case default values have not yet been\n    // initialized.\n    result->package_ = tables_->AllocateString(\"\");\n  }\n  result->pool_ = pool_;\n\n  // Add to tables.\n  if (!tables_->AddFile(result)) {\n    AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER,\n             \"A file with this name is already in the pool.\");\n    // Bail out early so that if this is actually the exact same file, we\n    // don't end up reporting that every single symbol is already defined.\n    tables_->Rollback();\n    return NULL;\n  }\n  if (!result->package().empty()) {\n    AddPackage(result->package(), proto, result);\n  }\n\n  // Make sure all dependencies are loaded.\n  set<string> seen_dependencies;\n  result->dependency_count_ = proto.dependency_size();\n  result->dependencies_ =\n    tables_->AllocateArray<const FileDescriptor*>(proto.dependency_size());\n  for (int i = 0; i < proto.dependency_size(); i++) {\n    if (!seen_dependencies.insert(proto.dependency(i)).second) {\n      AddError(proto.name(), proto,\n               DescriptorPool::ErrorCollector::OTHER,\n               \"Import \\\"\" + proto.dependency(i) + \"\\\" was listed twice.\");\n    }\n\n    const FileDescriptor* dependency = tables_->FindFile(proto.dependency(i));\n    if (dependency == NULL && pool_->underlay_ != NULL) {\n      dependency = pool_->underlay_->FindFileByName(proto.dependency(i));\n    }\n\n    if (dependency == NULL) {\n      if (pool_->allow_unknown_) {\n        dependency = NewPlaceholderFile(proto.dependency(i));\n      } else {\n        string message;\n        if (pool_->fallback_database_ == NULL) {\n          message = \"Import \\\"\" + proto.dependency(i) +\n                    \"\\\" has not been loaded.\";\n        } else {\n          message = \"Import \\\"\" + proto.dependency(i) +\n                    \"\\\" was not found or had errors.\";\n        }\n        AddError(proto.name(), proto,\n                 DescriptorPool::ErrorCollector::OTHER,\n                 message);\n      }\n    }\n\n    result->dependencies_[i] = dependency;\n  }\n\n  // Convert children.\n  BUILD_ARRAY(proto, result, message_type, BuildMessage  , NULL);\n  BUILD_ARRAY(proto, result, enum_type   , BuildEnum     , NULL);\n  BUILD_ARRAY(proto, result, service     , BuildService  , NULL);\n  BUILD_ARRAY(proto, result, extension   , BuildExtension, NULL);\n\n  // Copy options.\n  if (!proto.has_options()) {\n    result->options_ = NULL;  // Will set to default_instance later.\n  } else {\n    AllocateOptions(proto.options(), result);\n  }\n\n  // Note that the following steps must occur in exactly the specified order.\n\n  // Cross-link.\n  CrossLinkFile(result, proto);\n\n  // Interpret any remaining uninterpreted options gathered into\n  // options_to_interpret_ during descriptor building.  Cross-linking has made\n  // extension options known, so all interpretations should now succeed.\n  if (!had_errors_) {\n    OptionInterpreter option_interpreter(this);\n    for (vector<OptionsToInterpret>::iterator iter =\n             options_to_interpret_.begin();\n         iter != options_to_interpret_.end(); ++iter) {\n      option_interpreter.InterpretOptions(&(*iter));\n    }\n    options_to_interpret_.clear();\n  }\n\n  // Validate options.\n  if (!had_errors_) {\n    ValidateFileOptions(result, proto);\n  }\n\n  if (had_errors_) {\n    tables_->Rollback();\n    return NULL;\n  } else {\n    tables_->Checkpoint();\n    return result;\n  }\n}\n\nvoid DescriptorBuilder::BuildMessage(const DescriptorProto& proto,\n                                     const Descriptor* parent,\n                                     Descriptor* result) {\n  const string& scope = (parent == NULL) ?\n    file_->package() : parent->full_name();\n  string* full_name = tables_->AllocateString(scope);\n  if (!full_name->empty()) full_name->append(1, '.');\n  full_name->append(proto.name());\n\n  ValidateSymbolName(proto.name(), *full_name, proto);\n\n  result->name_            = tables_->AllocateString(proto.name());\n  result->full_name_       = full_name;\n  result->file_            = file_;\n  result->containing_type_ = parent;\n  result->is_placeholder_  = false;\n  result->is_unqualified_placeholder_ = false;\n\n  BUILD_ARRAY(proto, result, field          , BuildField         , result);\n  BUILD_ARRAY(proto, result, nested_type    , BuildMessage       , result);\n  BUILD_ARRAY(proto, result, enum_type      , BuildEnum          , result);\n  BUILD_ARRAY(proto, result, extension_range, BuildExtensionRange, result);\n  BUILD_ARRAY(proto, result, extension      , BuildExtension     , result);\n\n  // Copy options.\n  if (!proto.has_options()) {\n    result->options_ = NULL;  // Will set to default_instance later.\n  } else {\n    AllocateOptions(proto.options(), result);\n  }\n\n  AddSymbol(result->full_name(), parent, result->name(),\n            proto, Symbol(result));\n\n  // Check that no fields have numbers in extension ranges.\n  for (int i = 0; i < result->field_count(); i++) {\n    const FieldDescriptor* field = result->field(i);\n    for (int j = 0; j < result->extension_range_count(); j++) {\n      const Descriptor::ExtensionRange* range = result->extension_range(j);\n      if (range->start <= field->number() && field->number() < range->end) {\n        AddError(field->full_name(), proto.extension_range(j),\n                 DescriptorPool::ErrorCollector::NUMBER,\n                 strings::Substitute(\n                   \"Extension range $0 to $1 includes field \\\"$2\\\" ($3).\",\n                   range->start, range->end - 1,\n                   field->name(), field->number()));\n      }\n    }\n  }\n\n  // Check that extension ranges don't overlap.\n  for (int i = 0; i < result->extension_range_count(); i++) {\n    const Descriptor::ExtensionRange* range1 = result->extension_range(i);\n    for (int j = i + 1; j < result->extension_range_count(); j++) {\n      const Descriptor::ExtensionRange* range2 = result->extension_range(j);\n      if (range1->end > range2->start && range2->end > range1->start) {\n        AddError(result->full_name(), proto.extension_range(j),\n                 DescriptorPool::ErrorCollector::NUMBER,\n                 strings::Substitute(\"Extension range $0 to $1 overlaps with \"\n                                     \"already-defined range $2 to $3.\",\n                                     range2->start, range2->end - 1,\n                                     range1->start, range1->end - 1));\n      }\n    }\n  }\n}\n\nvoid DescriptorBuilder::BuildFieldOrExtension(const FieldDescriptorProto& proto,\n                                              const Descriptor* parent,\n                                              FieldDescriptor* result,\n                                              bool is_extension) {\n  const string& scope = (parent == NULL) ?\n    file_->package() : parent->full_name();\n  string* full_name = tables_->AllocateString(scope);\n  if (!full_name->empty()) full_name->append(1, '.');\n  full_name->append(proto.name());\n\n  ValidateSymbolName(proto.name(), *full_name, proto);\n\n  result->name_         = tables_->AllocateString(proto.name());\n  result->full_name_    = full_name;\n  result->file_         = file_;\n  result->number_       = proto.number();\n  result->is_extension_ = is_extension;\n\n  // If .proto files follow the style guide then the name should already be\n  // lower-cased.  If that's the case we can just reuse the string we already\n  // allocated rather than allocate a new one.\n  string lowercase_name(proto.name());\n  LowerString(&lowercase_name);\n  if (lowercase_name == proto.name()) {\n    result->lowercase_name_ = result->name_;\n  } else {\n    result->lowercase_name_ = tables_->AllocateString(lowercase_name);\n  }\n\n  // Don't bother with the above optimization for camel-case names since\n  // .proto files that follow the guide shouldn't be using names in this\n  // format, so the optimization wouldn't help much.\n  result->camelcase_name_ = tables_->AllocateString(ToCamelCase(proto.name()));\n\n  // Some compilers do not allow static_cast directly between two enum types,\n  // so we must cast to int first.\n  result->type_  = static_cast<FieldDescriptor::Type>(\n                     implicit_cast<int>(proto.type()));\n  result->label_ = static_cast<FieldDescriptor::Label>(\n                     implicit_cast<int>(proto.label()));\n\n  // Some of these may be filled in when cross-linking.\n  result->containing_type_ = NULL;\n  result->extension_scope_ = NULL;\n  result->experimental_map_key_ = NULL;\n  result->message_type_ = NULL;\n  result->enum_type_ = NULL;\n\n  result->has_default_value_ = proto.has_default_value();\n  if (proto.has_default_value() && result->is_repeated()) {\n    AddError(result->full_name(), proto,\n             DescriptorPool::ErrorCollector::DEFAULT_VALUE,\n             \"Repeated fields can't have default values.\");\n  }\n\n  if (proto.has_type()) {\n    if (proto.has_default_value()) {\n      char* end_pos = NULL;\n      switch (result->cpp_type()) {\n        case FieldDescriptor::CPPTYPE_INT32:\n          result->default_value_int32_ =\n            strtol(proto.default_value().c_str(), &end_pos, 0);\n          break;\n        case FieldDescriptor::CPPTYPE_INT64:\n          result->default_value_int64_ =\n            strto64(proto.default_value().c_str(), &end_pos, 0);\n          break;\n        case FieldDescriptor::CPPTYPE_UINT32:\n          result->default_value_uint32_ =\n            strtoul(proto.default_value().c_str(), &end_pos, 0);\n          break;\n        case FieldDescriptor::CPPTYPE_UINT64:\n          result->default_value_uint64_ =\n            strtou64(proto.default_value().c_str(), &end_pos, 0);\n          break;\n        case FieldDescriptor::CPPTYPE_FLOAT:\n          if (proto.default_value() == \"inf\") {\n            result->default_value_float_ = numeric_limits<float>::infinity();\n          } else if (proto.default_value() == \"-inf\") {\n            result->default_value_float_ = -numeric_limits<float>::infinity();\n          } else if (proto.default_value() == \"nan\") {\n            result->default_value_float_ = numeric_limits<float>::quiet_NaN();\n          } else  {\n            result->default_value_float_ =\n              NoLocaleStrtod(proto.default_value().c_str(), &end_pos);\n          }\n          break;\n        case FieldDescriptor::CPPTYPE_DOUBLE:\n          if (proto.default_value() == \"inf\") {\n            result->default_value_double_ = numeric_limits<double>::infinity();\n          } else if (proto.default_value() == \"-inf\") {\n            result->default_value_double_ = -numeric_limits<double>::infinity();\n          } else if (proto.default_value() == \"nan\") {\n            result->default_value_double_ = numeric_limits<double>::quiet_NaN();\n          } else  {\n            result->default_value_double_ =\n              NoLocaleStrtod(proto.default_value().c_str(), &end_pos);\n          }\n          break;\n        case FieldDescriptor::CPPTYPE_BOOL:\n          if (proto.default_value() == \"true\") {\n            result->default_value_bool_ = true;\n          } else if (proto.default_value() == \"false\") {\n            result->default_value_bool_ = false;\n          } else {\n            AddError(result->full_name(), proto,\n                     DescriptorPool::ErrorCollector::DEFAULT_VALUE,\n                     \"Boolean default must be true or false.\");\n          }\n          break;\n        case FieldDescriptor::CPPTYPE_ENUM:\n          // This will be filled in when cross-linking.\n          result->default_value_enum_ = NULL;\n          break;\n        case FieldDescriptor::CPPTYPE_STRING:\n          if (result->type() == FieldDescriptor::TYPE_BYTES) {\n            result->default_value_string_ = tables_->AllocateString(\n              UnescapeCEscapeString(proto.default_value()));\n          } else {\n            result->default_value_string_ =\n              tables_->AllocateString(proto.default_value());\n          }\n          break;\n        case FieldDescriptor::CPPTYPE_MESSAGE:\n          AddError(result->full_name(), proto,\n                   DescriptorPool::ErrorCollector::DEFAULT_VALUE,\n                   \"Messages can't have default values.\");\n          result->has_default_value_ = false;\n          break;\n      }\n\n      if (end_pos != NULL) {\n        // end_pos is only set non-NULL by the parsers for numeric types, above.\n        // This checks that the default was non-empty and had no extra junk\n        // after the end of the number.\n        if (proto.default_value().empty() || *end_pos != '\\0') {\n          AddError(result->full_name(), proto,\n                   DescriptorPool::ErrorCollector::DEFAULT_VALUE,\n                   \"Couldn't parse default value.\");\n        }\n      }\n    } else {\n      // No explicit default value\n      switch (result->cpp_type()) {\n        case FieldDescriptor::CPPTYPE_INT32:\n          result->default_value_int32_ = 0;\n          break;\n        case FieldDescriptor::CPPTYPE_INT64:\n          result->default_value_int64_ = 0;\n          break;\n        case FieldDescriptor::CPPTYPE_UINT32:\n          result->default_value_uint32_ = 0;\n          break;\n        case FieldDescriptor::CPPTYPE_UINT64:\n          result->default_value_uint64_ = 0;\n          break;\n        case FieldDescriptor::CPPTYPE_FLOAT:\n          result->default_value_float_ = 0.0f;\n          break;\n        case FieldDescriptor::CPPTYPE_DOUBLE:\n          result->default_value_double_ = 0.0;\n          break;\n        case FieldDescriptor::CPPTYPE_BOOL:\n          result->default_value_bool_ = false;\n          break;\n        case FieldDescriptor::CPPTYPE_ENUM:\n          // This will be filled in when cross-linking.\n          result->default_value_enum_ = NULL;\n          break;\n        case FieldDescriptor::CPPTYPE_STRING:\n          result->default_value_string_ = &kEmptyString;\n          break;\n        case FieldDescriptor::CPPTYPE_MESSAGE:\n          break;\n      }\n    }\n  }\n\n  if (result->number() <= 0) {\n    AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER,\n             \"Field numbers must be positive integers.\");\n  } else if (result->number() > FieldDescriptor::kMaxNumber) {\n    AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER,\n             strings::Substitute(\"Field numbers cannot be greater than $0.\",\n                                 FieldDescriptor::kMaxNumber));\n  } else if (result->number() >= FieldDescriptor::kFirstReservedNumber &&\n             result->number() <= FieldDescriptor::kLastReservedNumber) {\n    AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER,\n             strings::Substitute(\n               \"Field numbers $0 through $1 are reserved for the protocol \"\n               \"buffer library implementation.\",\n               FieldDescriptor::kFirstReservedNumber,\n               FieldDescriptor::kLastReservedNumber));\n  }\n\n  if (is_extension) {\n    if (!proto.has_extendee()) {\n      AddError(result->full_name(), proto,\n               DescriptorPool::ErrorCollector::EXTENDEE,\n               \"FieldDescriptorProto.extendee not set for extension field.\");\n    }\n\n    result->extension_scope_ = parent;\n  } else {\n    if (proto.has_extendee()) {\n      AddError(result->full_name(), proto,\n               DescriptorPool::ErrorCollector::EXTENDEE,\n               \"FieldDescriptorProto.extendee set for non-extension field.\");\n    }\n\n    result->containing_type_ = parent;\n  }\n\n  // Copy options.\n  if (!proto.has_options()) {\n    result->options_ = NULL;  // Will set to default_instance later.\n  } else {\n    AllocateOptions(proto.options(), result);\n  }\n\n  AddSymbol(result->full_name(), parent, result->name(),\n            proto, Symbol(result));\n}\n\nvoid DescriptorBuilder::BuildExtensionRange(\n    const DescriptorProto::ExtensionRange& proto,\n    const Descriptor* parent,\n    Descriptor::ExtensionRange* result) {\n  result->start = proto.start();\n  result->end = proto.end();\n  if (result->start <= 0) {\n    AddError(parent->full_name(), proto,\n             DescriptorPool::ErrorCollector::NUMBER,\n             \"Extension numbers must be positive integers.\");\n  }\n\n  if (result->end > FieldDescriptor::kMaxNumber + 1) {\n    AddError(parent->full_name(), proto,\n             DescriptorPool::ErrorCollector::NUMBER,\n             strings::Substitute(\"Extension numbers cannot be greater than $0.\",\n                                 FieldDescriptor::kMaxNumber));\n  }\n\n  if (result->start >= result->end) {\n    AddError(parent->full_name(), proto,\n             DescriptorPool::ErrorCollector::NUMBER,\n             \"Extension range end number must be greater than start number.\");\n  }\n}\n\nvoid DescriptorBuilder::BuildEnum(const EnumDescriptorProto& proto,\n                                  const Descriptor* parent,\n                                  EnumDescriptor* result) {\n  const string& scope = (parent == NULL) ?\n    file_->package() : parent->full_name();\n  string* full_name = tables_->AllocateString(scope);\n  if (!full_name->empty()) full_name->append(1, '.');\n  full_name->append(proto.name());\n\n  ValidateSymbolName(proto.name(), *full_name, proto);\n\n  result->name_            = tables_->AllocateString(proto.name());\n  result->full_name_       = full_name;\n  result->file_            = file_;\n  result->containing_type_ = parent;\n  result->is_placeholder_  = false;\n  result->is_unqualified_placeholder_ = false;\n\n  if (proto.value_size() == 0) {\n    // We cannot allow enums with no values because this would mean there\n    // would be no valid default value for fields of this type.\n    AddError(result->full_name(), proto,\n             DescriptorPool::ErrorCollector::NAME,\n             \"Enums must contain at least one value.\");\n  }\n\n  BUILD_ARRAY(proto, result, value, BuildEnumValue, result);\n\n  // Copy options.\n  if (!proto.has_options()) {\n    result->options_ = NULL;  // Will set to default_instance later.\n  } else {\n    AllocateOptions(proto.options(), result);\n  }\n\n  AddSymbol(result->full_name(), parent, result->name(),\n            proto, Symbol(result));\n}\n\nvoid DescriptorBuilder::BuildEnumValue(const EnumValueDescriptorProto& proto,\n                                       const EnumDescriptor* parent,\n                                       EnumValueDescriptor* result) {\n  result->name_   = tables_->AllocateString(proto.name());\n  result->number_ = proto.number();\n  result->type_   = parent;\n\n  // Note:  full_name for enum values is a sibling to the parent's name, not a\n  //   child of it.\n  string* full_name = tables_->AllocateString(*parent->full_name_);\n  full_name->resize(full_name->size() - parent->name_->size());\n  full_name->append(*result->name_);\n  result->full_name_ = full_name;\n\n  ValidateSymbolName(proto.name(), *full_name, proto);\n\n  // Copy options.\n  if (!proto.has_options()) {\n    result->options_ = NULL;  // Will set to default_instance later.\n  } else {\n    AllocateOptions(proto.options(), result);\n  }\n\n  // Again, enum values are weird because we makes them appear as siblings\n  // of the enum type instead of children of it.  So, we use\n  // parent->containing_type() as the value's parent.\n  bool added_to_outer_scope =\n    AddSymbol(result->full_name(), parent->containing_type(), result->name(),\n              proto, Symbol(result));\n\n  // However, we also want to be able to search for values within a single\n  // enum type, so we add it as a child of the enum type itself, too.\n  // Note:  This could fail, but if it does, the error has already been\n  //   reported by the above AddSymbol() call, so we ignore the return code.\n  bool added_to_inner_scope =\n    file_tables_->AddAliasUnderParent(parent, result->name(), Symbol(result));\n\n  if (added_to_inner_scope && !added_to_outer_scope) {\n    // This value did not conflict with any values defined in the same enum,\n    // but it did conflict with some other symbol defined in the enum type's\n    // scope.  Let's print an additional error to explain this.\n    string outer_scope;\n    if (parent->containing_type() == NULL) {\n      outer_scope = file_->package();\n    } else {\n      outer_scope = parent->containing_type()->full_name();\n    }\n\n    if (outer_scope.empty()) {\n      outer_scope = \"the global scope\";\n    } else {\n      outer_scope = \"\\\"\" + outer_scope + \"\\\"\";\n    }\n\n    AddError(result->full_name(), proto,\n             DescriptorPool::ErrorCollector::NAME,\n             \"Note that enum values use C++ scoping rules, meaning that \"\n             \"enum values are siblings of their type, not children of it.  \"\n             \"Therefore, \\\"\" + result->name() + \"\\\" must be unique within \"\n             + outer_scope + \", not just within \\\"\" + parent->name() + \"\\\".\");\n  }\n\n  // An enum is allowed to define two numbers that refer to the same value.\n  // FindValueByNumber() should return the first such value, so we simply\n  // ignore AddEnumValueByNumber()'s return code.\n  file_tables_->AddEnumValueByNumber(result);\n}\n\nvoid DescriptorBuilder::BuildService(const ServiceDescriptorProto& proto,\n                                     const void* dummy,\n                                     ServiceDescriptor* result) {\n  string* full_name = tables_->AllocateString(file_->package());\n  if (!full_name->empty()) full_name->append(1, '.');\n  full_name->append(proto.name());\n\n  ValidateSymbolName(proto.name(), *full_name, proto);\n\n  result->name_      = tables_->AllocateString(proto.name());\n  result->full_name_ = full_name;\n  result->file_      = file_;\n\n  BUILD_ARRAY(proto, result, method, BuildMethod, result);\n\n  // Copy options.\n  if (!proto.has_options()) {\n    result->options_ = NULL;  // Will set to default_instance later.\n  } else {\n    AllocateOptions(proto.options(), result);\n  }\n\n  AddSymbol(result->full_name(), NULL, result->name(),\n            proto, Symbol(result));\n}\n\nvoid DescriptorBuilder::BuildMethod(const MethodDescriptorProto& proto,\n                                    const ServiceDescriptor* parent,\n                                    MethodDescriptor* result) {\n  result->name_    = tables_->AllocateString(proto.name());\n  result->service_ = parent;\n\n  string* full_name = tables_->AllocateString(parent->full_name());\n  full_name->append(1, '.');\n  full_name->append(*result->name_);\n  result->full_name_ = full_name;\n\n  ValidateSymbolName(proto.name(), *full_name, proto);\n\n  // These will be filled in when cross-linking.\n  result->input_type_ = NULL;\n  result->output_type_ = NULL;\n\n  // Copy options.\n  if (!proto.has_options()) {\n    result->options_ = NULL;  // Will set to default_instance later.\n  } else {\n    AllocateOptions(proto.options(), result);\n  }\n\n  AddSymbol(result->full_name(), parent, result->name(),\n            proto, Symbol(result));\n}\n\n#undef BUILD_ARRAY\n\n// -------------------------------------------------------------------\n\nvoid DescriptorBuilder::CrossLinkFile(\n    FileDescriptor* file, const FileDescriptorProto& proto) {\n  if (file->options_ == NULL) {\n    file->options_ = &FileOptions::default_instance();\n  }\n\n  for (int i = 0; i < file->message_type_count(); i++) {\n    CrossLinkMessage(&file->message_types_[i], proto.message_type(i));\n  }\n\n  for (int i = 0; i < file->extension_count(); i++) {\n    CrossLinkField(&file->extensions_[i], proto.extension(i));\n  }\n\n  for (int i = 0; i < file->enum_type_count(); i++) {\n    CrossLinkEnum(&file->enum_types_[i], proto.enum_type(i));\n  }\n\n  for (int i = 0; i < file->service_count(); i++) {\n    CrossLinkService(&file->services_[i], proto.service(i));\n  }\n}\n\nvoid DescriptorBuilder::CrossLinkMessage(\n    Descriptor* message, const DescriptorProto& proto) {\n  if (message->options_ == NULL) {\n    message->options_ = &MessageOptions::default_instance();\n  }\n\n  for (int i = 0; i < message->nested_type_count(); i++) {\n    CrossLinkMessage(&message->nested_types_[i], proto.nested_type(i));\n  }\n\n  for (int i = 0; i < message->enum_type_count(); i++) {\n    CrossLinkEnum(&message->enum_types_[i], proto.enum_type(i));\n  }\n\n  for (int i = 0; i < message->field_count(); i++) {\n    CrossLinkField(&message->fields_[i], proto.field(i));\n  }\n\n  for (int i = 0; i < message->extension_count(); i++) {\n    CrossLinkField(&message->extensions_[i], proto.extension(i));\n  }\n}\n\nvoid DescriptorBuilder::CrossLinkField(\n    FieldDescriptor* field, const FieldDescriptorProto& proto) {\n  if (field->options_ == NULL) {\n    field->options_ = &FieldOptions::default_instance();\n  }\n\n  if (proto.has_extendee()) {\n    Symbol extendee = LookupSymbol(proto.extendee(), field->full_name(),\n                                   PLACEHOLDER_EXTENDABLE_MESSAGE);\n    if (extendee.IsNull()) {\n      AddNotDefinedError(field->full_name(), proto,\n                         DescriptorPool::ErrorCollector::EXTENDEE,\n                         proto.extendee());\n      return;\n    } else if (extendee.type != Symbol::MESSAGE) {\n      AddError(field->full_name(), proto,\n               DescriptorPool::ErrorCollector::EXTENDEE,\n               \"\\\"\" + proto.extendee() + \"\\\" is not a message type.\");\n      return;\n    }\n    field->containing_type_ = extendee.descriptor;\n\n    if (!field->containing_type()->IsExtensionNumber(field->number())) {\n      AddError(field->full_name(), proto,\n               DescriptorPool::ErrorCollector::NUMBER,\n               strings::Substitute(\"\\\"$0\\\" does not declare $1 as an \"\n                                   \"extension number.\",\n                                   field->containing_type()->full_name(),\n                                   field->number()));\n    }\n  }\n\n  if (proto.has_type_name()) {\n    // Assume we are expecting a message type unless the proto contains some\n    // evidence that it expects an enum type.  This only makes a difference if\n    // we end up creating a placeholder.\n    bool expecting_enum = (proto.type() == FieldDescriptorProto::TYPE_ENUM) ||\n                          proto.has_default_value();\n\n    Symbol type =\n      LookupSymbol(proto.type_name(), field->full_name(),\n                   expecting_enum ? PLACEHOLDER_ENUM : PLACEHOLDER_MESSAGE,\n                   LOOKUP_TYPES);\n\n    if (type.IsNull()) {\n      AddNotDefinedError(field->full_name(), proto,\n                         DescriptorPool::ErrorCollector::TYPE,\n                         proto.type_name());\n      return;\n    }\n\n    if (!proto.has_type()) {\n      // Choose field type based on symbol.\n      if (type.type == Symbol::MESSAGE) {\n        field->type_ = FieldDescriptor::TYPE_MESSAGE;\n      } else if (type.type == Symbol::ENUM) {\n        field->type_ = FieldDescriptor::TYPE_ENUM;\n      } else {\n        AddError(field->full_name(), proto,\n                 DescriptorPool::ErrorCollector::TYPE,\n                 \"\\\"\" + proto.type_name() + \"\\\" is not a type.\");\n        return;\n      }\n    }\n\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      if (type.type != Symbol::MESSAGE) {\n        AddError(field->full_name(), proto,\n                 DescriptorPool::ErrorCollector::TYPE,\n                 \"\\\"\" + proto.type_name() + \"\\\" is not a message type.\");\n        return;\n      }\n      field->message_type_ = type.descriptor;\n\n      if (field->has_default_value()) {\n        AddError(field->full_name(), proto,\n                 DescriptorPool::ErrorCollector::DEFAULT_VALUE,\n                 \"Messages can't have default values.\");\n      }\n    } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) {\n      if (type.type != Symbol::ENUM) {\n        AddError(field->full_name(), proto,\n                 DescriptorPool::ErrorCollector::TYPE,\n                 \"\\\"\" + proto.type_name() + \"\\\" is not an enum type.\");\n        return;\n      }\n      field->enum_type_ = type.enum_descriptor;\n\n      if (field->enum_type()->is_placeholder_) {\n        // We can't look up default values for placeholder types.  We'll have\n        // to just drop them.\n        field->has_default_value_ = false;\n      }\n\n      if (field->has_default_value()) {\n        // We can't just use field->enum_type()->FindValueByName() here\n        // because that locks the pool's mutex, which we have already locked\n        // at this point.\n        Symbol default_value =\n          LookupSymbolNoPlaceholder(proto.default_value(),\n                                    field->enum_type()->full_name());\n\n        if (default_value.type == Symbol::ENUM_VALUE &&\n            default_value.enum_value_descriptor->type() == field->enum_type()) {\n          field->default_value_enum_ = default_value.enum_value_descriptor;\n        } else {\n          AddError(field->full_name(), proto,\n                   DescriptorPool::ErrorCollector::DEFAULT_VALUE,\n                   \"Enum type \\\"\" + field->enum_type()->full_name() +\n                   \"\\\" has no value named \\\"\" + proto.default_value() + \"\\\".\");\n        }\n      } else if (field->enum_type()->value_count() > 0) {\n        // All enums must have at least one value, or we would have reported\n        // an error elsewhere.  We use the first defined value as the default\n        // if a default is not explicitly defined.\n        field->default_value_enum_ = field->enum_type()->value(0);\n      }\n    } else {\n      AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,\n               \"Field with primitive type has type_name.\");\n    }\n  } else {\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE ||\n        field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) {\n      AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,\n               \"Field with message or enum type missing type_name.\");\n    }\n  }\n\n  // Add the field to the fields-by-number table.\n  // Note:  We have to do this *after* cross-linking because extensions do not\n  //   know their containing type until now.\n  if (!file_tables_->AddFieldByNumber(field)) {\n    const FieldDescriptor* conflicting_field =\n      file_tables_->FindFieldByNumber(field->containing_type(),\n                                      field->number());\n    if (field->is_extension()) {\n      AddError(field->full_name(), proto,\n               DescriptorPool::ErrorCollector::NUMBER,\n               strings::Substitute(\"Extension number $0 has already been used \"\n                                   \"in \\\"$1\\\" by extension \\\"$2\\\".\",\n                                   field->number(),\n                                   field->containing_type()->full_name(),\n                                   conflicting_field->full_name()));\n    } else {\n      AddError(field->full_name(), proto,\n               DescriptorPool::ErrorCollector::NUMBER,\n               strings::Substitute(\"Field number $0 has already been used in \"\n                                   \"\\\"$1\\\" by field \\\"$2\\\".\",\n                                   field->number(),\n                                   field->containing_type()->full_name(),\n                                   conflicting_field->name()));\n    }\n  }\n\n  if (field->is_extension()) {\n    // No need for error checking: if the extension number collided,\n    // we've already been informed of it by the if() above.\n    tables_->AddExtension(field);\n  }\n\n  // Add the field to the lowercase-name and camelcase-name tables.\n  file_tables_->AddFieldByStylizedNames(field);\n}\n\nvoid DescriptorBuilder::CrossLinkEnum(\n    EnumDescriptor* enum_type, const EnumDescriptorProto& proto) {\n  if (enum_type->options_ == NULL) {\n    enum_type->options_ = &EnumOptions::default_instance();\n  }\n\n  for (int i = 0; i < enum_type->value_count(); i++) {\n    CrossLinkEnumValue(&enum_type->values_[i], proto.value(i));\n  }\n}\n\nvoid DescriptorBuilder::CrossLinkEnumValue(\n    EnumValueDescriptor* enum_value, const EnumValueDescriptorProto& proto) {\n  if (enum_value->options_ == NULL) {\n    enum_value->options_ = &EnumValueOptions::default_instance();\n  }\n}\n\nvoid DescriptorBuilder::CrossLinkService(\n    ServiceDescriptor* service, const ServiceDescriptorProto& proto) {\n  if (service->options_ == NULL) {\n    service->options_ = &ServiceOptions::default_instance();\n  }\n\n  for (int i = 0; i < service->method_count(); i++) {\n    CrossLinkMethod(&service->methods_[i], proto.method(i));\n  }\n}\n\nvoid DescriptorBuilder::CrossLinkMethod(\n    MethodDescriptor* method, const MethodDescriptorProto& proto) {\n  if (method->options_ == NULL) {\n    method->options_ = &MethodOptions::default_instance();\n  }\n\n  Symbol input_type = LookupSymbol(proto.input_type(), method->full_name());\n  if (input_type.IsNull()) {\n    AddNotDefinedError(method->full_name(), proto,\n                       DescriptorPool::ErrorCollector::INPUT_TYPE,\n                       proto.input_type());\n  } else if (input_type.type != Symbol::MESSAGE) {\n    AddError(method->full_name(), proto,\n             DescriptorPool::ErrorCollector::INPUT_TYPE,\n             \"\\\"\" + proto.input_type() + \"\\\" is not a message type.\");\n  } else {\n    method->input_type_ = input_type.descriptor;\n  }\n\n  Symbol output_type = LookupSymbol(proto.output_type(), method->full_name());\n  if (output_type.IsNull()) {\n    AddNotDefinedError(method->full_name(), proto,\n                       DescriptorPool::ErrorCollector::OUTPUT_TYPE,\n                       proto.output_type());\n  } else if (output_type.type != Symbol::MESSAGE) {\n    AddError(method->full_name(), proto,\n             DescriptorPool::ErrorCollector::OUTPUT_TYPE,\n             \"\\\"\" + proto.output_type() + \"\\\" is not a message type.\");\n  } else {\n    method->output_type_ = output_type.descriptor;\n  }\n}\n\n// -------------------------------------------------------------------\n\n#define VALIDATE_OPTIONS_FROM_ARRAY(descriptor, array_name, type)  \\\n  for (int i = 0; i < descriptor->array_name##_count(); ++i) {     \\\n    Validate##type##Options(descriptor->array_name##s_ + i,        \\\n                            proto.array_name(i));                  \\\n  }\n\n// Determine if the file uses optimize_for = LITE_RUNTIME, being careful to\n// avoid problems that exist at init time.\nstatic bool IsLite(const FileDescriptor* file) {\n  // TODO(kenton):  I don't even remember how many of these conditions are\n  //   actually possible.  I'm just being super-safe.\n  return file != NULL &&\n         &file->options() != NULL &&\n         &file->options() != &FileOptions::default_instance() &&\n         file->options().optimize_for() == FileOptions::LITE_RUNTIME;\n}\n\nvoid DescriptorBuilder::ValidateFileOptions(FileDescriptor* file,\n                                            const FileDescriptorProto& proto) {\n  VALIDATE_OPTIONS_FROM_ARRAY(file, message_type, Message);\n  VALIDATE_OPTIONS_FROM_ARRAY(file, enum_type, Enum);\n  VALIDATE_OPTIONS_FROM_ARRAY(file, service, Service);\n  VALIDATE_OPTIONS_FROM_ARRAY(file, extension, Field);\n\n  // Lite files can only be imported by other Lite files.\n  if (!IsLite(file)) {\n    for (int i = 0; i < file->dependency_count(); i++) {\n      if (IsLite(file->dependency(i))) {\n        AddError(\n          file->name(), proto,\n          DescriptorPool::ErrorCollector::OTHER,\n          \"Files that do not use optimize_for = LITE_RUNTIME cannot import \"\n          \"files which do use this option.  This file is not lite, but it \"\n          \"imports \\\"\" + file->dependency(i)->name() + \"\\\" which is.\");\n        break;\n      }\n    }\n  }\n}\n\nvoid DescriptorBuilder::ValidateMessageOptions(Descriptor* message,\n                                               const DescriptorProto& proto) {\n  VALIDATE_OPTIONS_FROM_ARRAY(message, field, Field);\n  VALIDATE_OPTIONS_FROM_ARRAY(message, nested_type, Message);\n  VALIDATE_OPTIONS_FROM_ARRAY(message, enum_type, Enum);\n  VALIDATE_OPTIONS_FROM_ARRAY(message, extension, Field);\n}\n\nvoid DescriptorBuilder::ValidateFieldOptions(FieldDescriptor* field,\n    const FieldDescriptorProto& proto) {\n  if (field->options().has_experimental_map_key()) {\n    ValidateMapKey(field, proto);\n  }\n\n  // Only repeated primitive fields may be packed.\n  if (field->options().packed() && !field->is_packable()) {\n    AddError(\n      field->full_name(), proto,\n      DescriptorPool::ErrorCollector::TYPE,\n      \"[packed = true] can only be specified for repeated primitive fields.\");\n  }\n\n  // Note:  Default instance may not yet be initialized here, so we have to\n  //   avoid reading from it.\n  if (field->containing_type_ != NULL &&\n      &field->containing_type()->options() !=\n      &MessageOptions::default_instance() &&\n      field->containing_type()->options().message_set_wire_format()) {\n    if (field->is_extension()) {\n      if (!field->is_optional() ||\n          field->type() != FieldDescriptor::TYPE_MESSAGE) {\n        AddError(field->full_name(), proto,\n                 DescriptorPool::ErrorCollector::TYPE,\n                 \"Extensions of MessageSets must be optional messages.\");\n      }\n    } else {\n      AddError(field->full_name(), proto,\n               DescriptorPool::ErrorCollector::NAME,\n               \"MessageSets cannot have fields, only extensions.\");\n    }\n  }\n\n  // Lite extensions can only be of Lite types.\n  if (IsLite(field->file()) &&\n      field->containing_type_ != NULL &&\n      !IsLite(field->containing_type()->file())) {\n    AddError(field->full_name(), proto,\n             DescriptorPool::ErrorCollector::EXTENDEE,\n             \"Extensions to non-lite types can only be declared in non-lite \"\n             \"files.  Note that you cannot extend a non-lite type to contain \"\n             \"a lite type, but the reverse is allowed.\");\n  }\n}\n\nvoid DescriptorBuilder::ValidateEnumOptions(EnumDescriptor* enm,\n                                            const EnumDescriptorProto& proto) {\n  VALIDATE_OPTIONS_FROM_ARRAY(enm, value, EnumValue);\n}\n\nvoid DescriptorBuilder::ValidateEnumValueOptions(\n    EnumValueDescriptor* enum_value, const EnumValueDescriptorProto& proto) {\n  // Nothing to do so far.\n}\nvoid DescriptorBuilder::ValidateServiceOptions(ServiceDescriptor* service,\n    const ServiceDescriptorProto& proto) {\n  if (IsLite(service->file()) &&\n      (service->file()->options().cc_generic_services() ||\n       service->file()->options().java_generic_services())) {\n    AddError(service->full_name(), proto,\n             DescriptorPool::ErrorCollector::NAME,\n             \"Files with optimize_for = LITE_RUNTIME cannot define services \"\n             \"unless you set both options cc_generic_services and \"\n             \"java_generic_sevices to false.\");\n  }\n\n  VALIDATE_OPTIONS_FROM_ARRAY(service, method, Method);\n}\n\nvoid DescriptorBuilder::ValidateMethodOptions(MethodDescriptor* method,\n    const MethodDescriptorProto& proto) {\n  // Nothing to do so far.\n}\n\nvoid DescriptorBuilder::ValidateMapKey(FieldDescriptor* field,\n                                       const FieldDescriptorProto& proto) {\n  if (!field->is_repeated()) {\n    AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,\n             \"map type is only allowed for repeated fields.\");\n    return;\n  }\n\n  if (field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {\n    AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,\n             \"map type is only allowed for fields with a message type.\");\n    return;\n  }\n\n  const Descriptor* item_type = field->message_type();\n  if (item_type == NULL) {\n    AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,\n             \"Could not find field type.\");\n    return;\n  }\n\n  // Find the field in item_type named by \"experimental_map_key\"\n  const string& key_name = field->options().experimental_map_key();\n  const Symbol key_symbol = LookupSymbol(\n      key_name,\n      // We append \".key_name\" to the containing type's name since\n      // LookupSymbol() searches for peers of the supplied name, not\n      // children of the supplied name.\n      item_type->full_name() + \".\" + key_name);\n\n  if (key_symbol.IsNull() || key_symbol.field_descriptor->is_extension()) {\n    AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,\n             \"Could not find field named \\\"\" + key_name + \"\\\" in type \\\"\" +\n             item_type->full_name() + \"\\\".\");\n    return;\n  }\n  const FieldDescriptor* key_field = key_symbol.field_descriptor;\n\n  if (key_field->is_repeated()) {\n    AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,\n             \"map_key must not name a repeated field.\");\n    return;\n  }\n\n  if (key_field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n    AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,\n             \"map key must name a scalar or string field.\");\n    return;\n  }\n\n  field->experimental_map_key_ = key_field;\n}\n\n#undef VALIDATE_OPTIONS_FROM_ARRAY\n\n// -------------------------------------------------------------------\n\nDescriptorBuilder::OptionInterpreter::OptionInterpreter(\n    DescriptorBuilder* builder) : builder_(builder) {\n  GOOGLE_CHECK(builder_);\n}\n\nDescriptorBuilder::OptionInterpreter::~OptionInterpreter() {\n}\n\nbool DescriptorBuilder::OptionInterpreter::InterpretOptions(\n    OptionsToInterpret* options_to_interpret) {\n  // Note that these may be in different pools, so we can't use the same\n  // descriptor and reflection objects on both.\n  Message* options = options_to_interpret->options;\n  const Message* original_options = options_to_interpret->original_options;\n\n  bool failed = false;\n  options_to_interpret_ = options_to_interpret;\n\n  // Find the uninterpreted_option field in the mutable copy of the options\n  // and clear them, since we're about to interpret them.\n  const FieldDescriptor* uninterpreted_options_field =\n      options->GetDescriptor()->FindFieldByName(\"uninterpreted_option\");\n  GOOGLE_CHECK(uninterpreted_options_field != NULL)\n      << \"No field named \\\"uninterpreted_option\\\" in the Options proto.\";\n  options->GetReflection()->ClearField(options, uninterpreted_options_field);\n\n  // Find the uninterpreted_option field in the original options.\n  const FieldDescriptor* original_uninterpreted_options_field =\n      original_options->GetDescriptor()->\n          FindFieldByName(\"uninterpreted_option\");\n  GOOGLE_CHECK(original_uninterpreted_options_field != NULL)\n      << \"No field named \\\"uninterpreted_option\\\" in the Options proto.\";\n\n  const int num_uninterpreted_options = original_options->GetReflection()->\n      FieldSize(*original_options, original_uninterpreted_options_field);\n  for (int i = 0; i < num_uninterpreted_options; ++i) {\n    uninterpreted_option_ = down_cast<const UninterpretedOption*>(\n        &original_options->GetReflection()->GetRepeatedMessage(\n            *original_options, original_uninterpreted_options_field, i));\n    if (!InterpretSingleOption(options)) {\n      // Error already added by InterpretSingleOption().\n      failed = true;\n      break;\n    }\n  }\n  // Reset these, so we don't have any dangling pointers.\n  uninterpreted_option_ = NULL;\n  options_to_interpret_ = NULL;\n\n  if (!failed) {\n    // InterpretSingleOption() added the interpreted options in the\n    // UnknownFieldSet, in case the option isn't yet known to us.  Now we\n    // serialize the options message and deserialize it back.  That way, any\n    // option fields that we do happen to know about will get moved from the\n    // UnknownFieldSet into the real fields, and thus be available right away.\n    // If they are not known, that's OK too. They will get reparsed into the\n    // UnknownFieldSet and wait there until the message is parsed by something\n    // that does know about the options.\n    string buf;\n    options->AppendToString(&buf);\n    GOOGLE_CHECK(options->ParseFromString(buf))\n        << \"Protocol message serialized itself in invalid fashion.\";\n  }\n\n  return !failed;\n}\n\nbool DescriptorBuilder::OptionInterpreter::InterpretSingleOption(\n    Message* options) {\n  // First do some basic validation.\n  if (uninterpreted_option_->name_size() == 0) {\n    // This should never happen unless the parser has gone seriously awry or\n    // someone has manually created the uninterpreted option badly.\n    return AddNameError(\"Option must have a name.\");\n  }\n  if (uninterpreted_option_->name(0).name_part() == \"uninterpreted_option\") {\n    return AddNameError(\"Option must not use reserved name \"\n                        \"\\\"uninterpreted_option\\\".\");\n  }\n\n  const Descriptor* options_descriptor = NULL;\n  // Get the options message's descriptor from the builder's pool, so that we\n  // get the version that knows about any extension options declared in the\n  // file we're currently building. The descriptor should be there as long as\n  // the file we're building imported \"google/protobuf/descriptors.proto\".\n\n  // Note that we use DescriptorBuilder::FindSymbol(), not\n  // DescriptorPool::FindMessageTypeByName() because we're already holding the\n  // pool's mutex, and the latter method locks it again.\n  Symbol symbol = builder_->FindSymbolNotEnforcingDeps(\n    options->GetDescriptor()->full_name());\n  if (!symbol.IsNull() && symbol.type == Symbol::MESSAGE) {\n    options_descriptor = symbol.descriptor;\n  } else {\n    // The options message's descriptor was not in the builder's pool, so use\n    // the standard version from the generated pool. We're not holding the\n    // generated pool's mutex, so we can search it the straightforward way.\n    options_descriptor = options->GetDescriptor();\n  }\n  GOOGLE_CHECK(options_descriptor);\n\n  // We iterate over the name parts to drill into the submessages until we find\n  // the leaf field for the option. As we drill down we remember the current\n  // submessage's descriptor in |descriptor| and the next field in that\n  // submessage in |field|. We also track the fields we're drilling down\n  // through in |intermediate_fields|. As we go, we reconstruct the full option\n  // name in |debug_msg_name|, for use in error messages.\n  const Descriptor* descriptor = options_descriptor;\n  const FieldDescriptor* field = NULL;\n  vector<const FieldDescriptor*> intermediate_fields;\n  string debug_msg_name = \"\";\n\n  for (int i = 0; i < uninterpreted_option_->name_size(); ++i) {\n    const string& name_part = uninterpreted_option_->name(i).name_part();\n    if (debug_msg_name.size() > 0) {\n      debug_msg_name += \".\";\n    }\n    if (uninterpreted_option_->name(i).is_extension()) {\n      debug_msg_name += \"(\" + name_part + \")\";\n      // Search for the extension's descriptor as an extension in the builder's\n      // pool. Note that we use DescriptorBuilder::LookupSymbol(), not\n      // DescriptorPool::FindExtensionByName(), for two reasons: 1) It allows\n      // relative lookups, and 2) because we're already holding the pool's\n      // mutex, and the latter method locks it again.\n      Symbol symbol = builder_->LookupSymbol(name_part,\n                                             options_to_interpret_->name_scope);\n      if (!symbol.IsNull() && symbol.type == Symbol::FIELD) {\n        field = symbol.field_descriptor;\n      }\n      // If we don't find the field then the field's descriptor was not in the\n      // builder's pool, but there's no point in looking in the generated\n      // pool. We require that you import the file that defines any extensions\n      // you use, so they must be present in the builder's pool.\n    } else {\n      debug_msg_name += name_part;\n      // Search for the field's descriptor as a regular field.\n      field = descriptor->FindFieldByName(name_part);\n    }\n\n    if (field == NULL) {\n      if (get_allow_unknown(builder_->pool_)) {\n        // We can't find the option, but AllowUnknownDependencies() is enabled,\n        // so we will just leave it as uninterpreted.\n        AddWithoutInterpreting(*uninterpreted_option_, options);\n        return true;\n      } else {\n        return AddNameError(\"Option \\\"\" + debug_msg_name + \"\\\" unknown.\");\n      }\n    } else if (field->containing_type() != descriptor) {\n      if (get_is_placeholder(field->containing_type())) {\n        // The field is an extension of a placeholder type, so we can't\n        // reliably verify whether it is a valid extension to use here (e.g.\n        // we don't know if it is an extension of the correct *Options message,\n        // or if it has a valid field number, etc.).  Just leave it as\n        // uninterpreted instead.\n        AddWithoutInterpreting(*uninterpreted_option_, options);\n        return true;\n      } else {\n        // This can only happen if, due to some insane misconfiguration of the\n        // pools, we find the options message in one pool but the field in\n        // another. This would probably imply a hefty bug somewhere.\n        return AddNameError(\"Option field \\\"\" + debug_msg_name +\n                            \"\\\" is not a field or extension of message \\\"\" +\n                            descriptor->name() + \"\\\".\");\n      }\n    } else if (field->is_repeated()) {\n      return AddNameError(\"Option field \\\"\" + debug_msg_name +\n                          \"\\\" is repeated. Repeated options are not \"\n                          \"supported.\");\n    } else if (i < uninterpreted_option_->name_size() - 1) {\n      if (field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {\n        return AddNameError(\"Option \\\"\" +  debug_msg_name +\n                            \"\\\" is an atomic type, not a message.\");\n      } else {\n        // Drill down into the submessage.\n        intermediate_fields.push_back(field);\n        descriptor = field->message_type();\n      }\n    }\n  }\n\n  // We've found the leaf field. Now we use UnknownFieldSets to set its value\n  // on the options message. We do so because the message may not yet know\n  // about its extension fields, so we may not be able to set the fields\n  // directly. But the UnknownFieldSets will serialize to the same wire-format\n  // message, so reading that message back in once the extension fields are\n  // known will populate them correctly.\n\n  // First see if the option is already set.\n  if (!ExamineIfOptionIsSet(\n          intermediate_fields.begin(),\n          intermediate_fields.end(),\n          field, debug_msg_name,\n          options->GetReflection()->GetUnknownFields(*options))) {\n    return false;  // ExamineIfOptionIsSet() already added the error.\n  }\n\n\n  // First set the value on the UnknownFieldSet corresponding to the\n  // innermost message.\n  scoped_ptr<UnknownFieldSet> unknown_fields(new UnknownFieldSet());\n  if (!SetOptionValue(field, unknown_fields.get())) {\n    return false;  // SetOptionValue() already added the error.\n  }\n\n  // Now wrap the UnknownFieldSet with UnknownFieldSets corresponding to all\n  // the intermediate messages.\n  for (vector<const FieldDescriptor*>::reverse_iterator iter =\n           intermediate_fields.rbegin();\n       iter != intermediate_fields.rend(); ++iter) {\n    scoped_ptr<UnknownFieldSet> parent_unknown_fields(new UnknownFieldSet());\n    switch ((*iter)->type()) {\n      case FieldDescriptor::TYPE_MESSAGE: {\n        io::StringOutputStream outstr(\n            parent_unknown_fields->AddLengthDelimited((*iter)->number()));\n        io::CodedOutputStream out(&outstr);\n        internal::WireFormat::SerializeUnknownFields(*unknown_fields, &out);\n        GOOGLE_CHECK(!out.HadError())\n            << \"Unexpected failure while serializing option submessage \"\n            << debug_msg_name << \"\\\".\";\n        break;\n      }\n\n      case FieldDescriptor::TYPE_GROUP: {\n         parent_unknown_fields->AddGroup((*iter)->number())\n                              ->MergeFrom(*unknown_fields);\n        break;\n      }\n\n      default:\n        GOOGLE_LOG(FATAL) << \"Invalid wire type for CPPTYPE_MESSAGE: \"\n                   << (*iter)->type();\n        return false;\n    }\n    unknown_fields.reset(parent_unknown_fields.release());\n  }\n\n  // Now merge the UnknownFieldSet corresponding to the top-level message into\n  // the options message.\n  options->GetReflection()->MutableUnknownFields(options)->MergeFrom(\n      *unknown_fields);\n\n  return true;\n}\n\nvoid DescriptorBuilder::OptionInterpreter::AddWithoutInterpreting(\n    const UninterpretedOption& uninterpreted_option, Message* options) {\n  const FieldDescriptor* field =\n    options->GetDescriptor()->FindFieldByName(\"uninterpreted_option\");\n  GOOGLE_CHECK(field != NULL);\n\n  options->GetReflection()->AddMessage(options, field)\n    ->CopyFrom(uninterpreted_option);\n}\n\nbool DescriptorBuilder::OptionInterpreter::ExamineIfOptionIsSet(\n    vector<const FieldDescriptor*>::const_iterator intermediate_fields_iter,\n    vector<const FieldDescriptor*>::const_iterator intermediate_fields_end,\n    const FieldDescriptor* innermost_field, const string& debug_msg_name,\n    const UnknownFieldSet& unknown_fields) {\n  // We do linear searches of the UnknownFieldSet and its sub-groups.  This\n  // should be fine since it's unlikely that any one options structure will\n  // contain more than a handful of options.\n\n  if (intermediate_fields_iter == intermediate_fields_end) {\n    // We're at the innermost submessage.\n    for (int i = 0; i < unknown_fields.field_count(); i++) {\n      if (unknown_fields.field(i).number() == innermost_field->number()) {\n        return AddNameError(\"Option \\\"\" + debug_msg_name +\n                            \"\\\" was already set.\");\n      }\n    }\n    return true;\n  }\n\n  for (int i = 0; i < unknown_fields.field_count(); i++) {\n    if (unknown_fields.field(i).number() ==\n        (*intermediate_fields_iter)->number()) {\n      const UnknownField* unknown_field = &unknown_fields.field(i);\n      FieldDescriptor::Type type = (*intermediate_fields_iter)->type();\n      // Recurse into the next submessage.\n      switch (type) {\n        case FieldDescriptor::TYPE_MESSAGE:\n          if (unknown_field->type() == UnknownField::TYPE_LENGTH_DELIMITED) {\n            UnknownFieldSet intermediate_unknown_fields;\n            if (intermediate_unknown_fields.ParseFromString(\n                    unknown_field->length_delimited()) &&\n                !ExamineIfOptionIsSet(intermediate_fields_iter + 1,\n                                      intermediate_fields_end,\n                                      innermost_field, debug_msg_name,\n                                      intermediate_unknown_fields)) {\n              return false;  // Error already added.\n            }\n          }\n          break;\n\n        case FieldDescriptor::TYPE_GROUP:\n          if (unknown_field->type() == UnknownField::TYPE_GROUP) {\n            if (!ExamineIfOptionIsSet(intermediate_fields_iter + 1,\n                                      intermediate_fields_end,\n                                      innermost_field, debug_msg_name,\n                                      unknown_field->group())) {\n              return false;  // Error already added.\n            }\n          }\n          break;\n\n        default:\n          GOOGLE_LOG(FATAL) << \"Invalid wire type for CPPTYPE_MESSAGE: \" << type;\n          return false;\n      }\n    }\n  }\n  return true;\n}\n\nbool DescriptorBuilder::OptionInterpreter::SetOptionValue(\n    const FieldDescriptor* option_field,\n    UnknownFieldSet* unknown_fields) {\n  // We switch on the CppType to validate.\n  switch (option_field->cpp_type()) {\n\n    case FieldDescriptor::CPPTYPE_INT32:\n      if (uninterpreted_option_->has_positive_int_value()) {\n        if (uninterpreted_option_->positive_int_value() >\n            static_cast<uint64>(kint32max)) {\n          return AddValueError(\"Value out of range for int32 option \\\"\" +\n                               option_field->full_name() + \"\\\".\");\n        } else {\n          SetInt32(option_field->number(),\n                   uninterpreted_option_->positive_int_value(),\n                   option_field->type(), unknown_fields);\n        }\n      } else if (uninterpreted_option_->has_negative_int_value()) {\n        if (uninterpreted_option_->negative_int_value() <\n            static_cast<int64>(kint32min)) {\n          return AddValueError(\"Value out of range for int32 option \\\"\" +\n                               option_field->full_name() + \"\\\".\");\n        } else {\n          SetInt32(option_field->number(),\n                   uninterpreted_option_->negative_int_value(),\n                   option_field->type(), unknown_fields);\n        }\n      } else {\n        return AddValueError(\"Value must be integer for int32 option \\\"\" +\n                             option_field->full_name() + \"\\\".\");\n      }\n      break;\n\n    case FieldDescriptor::CPPTYPE_INT64:\n      if (uninterpreted_option_->has_positive_int_value()) {\n        if (uninterpreted_option_->positive_int_value() >\n            static_cast<uint64>(kint64max)) {\n          return AddValueError(\"Value out of range for int64 option \\\"\" +\n                               option_field->full_name() + \"\\\".\");\n        } else {\n          SetInt64(option_field->number(),\n                   uninterpreted_option_->positive_int_value(),\n                   option_field->type(), unknown_fields);\n        }\n      } else if (uninterpreted_option_->has_negative_int_value()) {\n        SetInt64(option_field->number(),\n                 uninterpreted_option_->negative_int_value(),\n                 option_field->type(), unknown_fields);\n      } else {\n        return AddValueError(\"Value must be integer for int64 option \\\"\" +\n                             option_field->full_name() + \"\\\".\");\n      }\n      break;\n\n    case FieldDescriptor::CPPTYPE_UINT32:\n      if (uninterpreted_option_->has_positive_int_value()) {\n        if (uninterpreted_option_->positive_int_value() > kuint32max) {\n          return AddValueError(\"Value out of range for uint32 option \\\"\" +\n                               option_field->name() + \"\\\".\");\n        } else {\n          SetUInt32(option_field->number(),\n                    uninterpreted_option_->positive_int_value(),\n                    option_field->type(), unknown_fields);\n        }\n      } else {\n        return AddValueError(\"Value must be non-negative integer for uint32 \"\n                             \"option \\\"\" + option_field->full_name() + \"\\\".\");\n      }\n      break;\n\n    case FieldDescriptor::CPPTYPE_UINT64:\n      if (uninterpreted_option_->has_positive_int_value()) {\n        SetUInt64(option_field->number(),\n                  uninterpreted_option_->positive_int_value(),\n                  option_field->type(), unknown_fields);\n      } else {\n        return AddValueError(\"Value must be non-negative integer for uint64 \"\n                             \"option \\\"\" + option_field->full_name() + \"\\\".\");\n      }\n      break;\n\n    case FieldDescriptor::CPPTYPE_FLOAT: {\n      float value;\n      if (uninterpreted_option_->has_double_value()) {\n        value = uninterpreted_option_->double_value();\n      } else if (uninterpreted_option_->has_positive_int_value()) {\n        value = uninterpreted_option_->positive_int_value();\n      } else if (uninterpreted_option_->has_negative_int_value()) {\n        value = uninterpreted_option_->negative_int_value();\n      } else {\n        return AddValueError(\"Value must be number for float option \\\"\" +\n                             option_field->full_name() + \"\\\".\");\n      }\n      unknown_fields->AddFixed32(option_field->number(),\n          google::protobuf::internal::WireFormatLite::EncodeFloat(value));\n      break;\n    }\n\n    case FieldDescriptor::CPPTYPE_DOUBLE: {\n      double value;\n      if (uninterpreted_option_->has_double_value()) {\n        value = uninterpreted_option_->double_value();\n      } else if (uninterpreted_option_->has_positive_int_value()) {\n        value = uninterpreted_option_->positive_int_value();\n      } else if (uninterpreted_option_->has_negative_int_value()) {\n        value = uninterpreted_option_->negative_int_value();\n      } else {\n        return AddValueError(\"Value must be number for double option \\\"\" +\n                             option_field->full_name() + \"\\\".\");\n      }\n      unknown_fields->AddFixed64(option_field->number(),\n          google::protobuf::internal::WireFormatLite::EncodeDouble(value));\n      break;\n    }\n\n    case FieldDescriptor::CPPTYPE_BOOL:\n      uint64 value;\n      if (!uninterpreted_option_->has_identifier_value()) {\n        return AddValueError(\"Value must be identifier for boolean option \"\n                             \"\\\"\" + option_field->full_name() + \"\\\".\");\n      }\n      if (uninterpreted_option_->identifier_value() == \"true\") {\n        value = 1;\n      } else if (uninterpreted_option_->identifier_value() == \"false\") {\n        value = 0;\n      } else {\n        return AddValueError(\"Value must be \\\"true\\\" or \\\"false\\\" for boolean \"\n                             \"option \\\"\" + option_field->full_name() + \"\\\".\");\n      }\n      unknown_fields->AddVarint(option_field->number(), value);\n      break;\n\n    case FieldDescriptor::CPPTYPE_ENUM: {\n      if (!uninterpreted_option_->has_identifier_value()) {\n        return AddValueError(\"Value must be identifier for enum-valued option \"\n                             \"\\\"\" + option_field->full_name() + \"\\\".\");\n      }\n      const EnumDescriptor* enum_type = option_field->enum_type();\n      const string& value_name = uninterpreted_option_->identifier_value();\n      const EnumValueDescriptor* enum_value = NULL;\n\n      if (enum_type->file()->pool() != DescriptorPool::generated_pool()) {\n        // Note that the enum value's fully-qualified name is a sibling of the\n        // enum's name, not a child of it.\n        string fully_qualified_name = enum_type->full_name();\n        fully_qualified_name.resize(fully_qualified_name.size() -\n                                    enum_type->name().size());\n        fully_qualified_name += value_name;\n\n        // Search for the enum value's descriptor in the builder's pool. Note\n        // that we use DescriptorBuilder::FindSymbolNotEnforcingDeps(), not\n        // DescriptorPool::FindEnumValueByName() because we're already holding\n        // the pool's mutex, and the latter method locks it again.\n        Symbol symbol =\n          builder_->FindSymbolNotEnforcingDeps(fully_qualified_name);\n        if (!symbol.IsNull() && symbol.type == Symbol::ENUM_VALUE) {\n          if (symbol.enum_value_descriptor->type() != enum_type) {\n            return AddValueError(\"Enum type \\\"\" + enum_type->full_name() +\n                \"\\\" has no value named \\\"\" + value_name + \"\\\" for option \\\"\" +\n                option_field->full_name() +\n                \"\\\". This appears to be a value from a sibling type.\");\n          } else {\n            enum_value = symbol.enum_value_descriptor;\n          }\n        }\n      } else {\n        // The enum type is in the generated pool, so we can search for the\n        // value there.\n        enum_value = enum_type->FindValueByName(value_name);\n      }\n\n      if (enum_value == NULL) {\n        return AddValueError(\"Enum type \\\"\" +\n                             option_field->enum_type()->full_name() +\n                             \"\\\" has no value named \\\"\" + value_name + \"\\\" for \"\n                             \"option \\\"\" + option_field->full_name() + \"\\\".\");\n      } else {\n        // Sign-extension is not a problem, since we cast directly from int32 to\n        // uint64, without first going through uint32.\n        unknown_fields->AddVarint(option_field->number(),\n          static_cast<uint64>(static_cast<int64>(enum_value->number())));\n      }\n      break;\n    }\n\n    case FieldDescriptor::CPPTYPE_STRING:\n      if (!uninterpreted_option_->has_string_value()) {\n        return AddValueError(\"Value must be quoted string for string option \"\n                             \"\\\"\" + option_field->full_name() + \"\\\".\");\n      }\n      // The string has already been unquoted and unescaped by the parser.\n      unknown_fields->AddLengthDelimited(option_field->number(),\n          uninterpreted_option_->string_value());\n      break;\n\n    case FieldDescriptor::CPPTYPE_MESSAGE:\n      if (!SetAggregateOption(option_field, unknown_fields)) {\n        return false;\n      }\n      break;\n  }\n\n  return true;\n}\n\nclass DescriptorBuilder::OptionInterpreter::AggregateOptionFinder\n    : public TextFormat::Finder {\n public:\n  DescriptorBuilder* builder_;\n\n  virtual const FieldDescriptor* FindExtension(\n      Message* message, const string& name) const {\n    assert_mutex_held(builder_->pool_);\n    Symbol result = builder_->LookupSymbolNoPlaceholder(\n        name, message->GetDescriptor()->full_name());\n    if (result.type == Symbol::FIELD &&\n        result.field_descriptor->is_extension()) {\n      return result.field_descriptor;\n    } else {\n      return NULL;\n    }\n  }\n};\n\n// A custom error collector to record any text-format parsing errors\nnamespace {\nclass AggregateErrorCollector : public io::ErrorCollector {\n public:\n  string error_;\n\n  virtual void AddError(int line, int column, const string& message) {\n    if (!error_.empty()) {\n      error_ += \"; \";\n    }\n    error_ += message;\n  }\n\n  virtual void AddWarning(int line, int column, const string& message) {\n    // Ignore warnings\n  }\n};\n}\n\n// We construct a dynamic message of the type corresponding to\n// option_field, parse the supplied text-format string into this\n// message, and serialize the resulting message to produce the value.\nbool DescriptorBuilder::OptionInterpreter::SetAggregateOption(\n    const FieldDescriptor* option_field,\n    UnknownFieldSet* unknown_fields) {\n  if (!uninterpreted_option_->has_aggregate_value()) {\n    return AddValueError(\"Option \\\"\" + option_field->full_name() +\n                         \"\\\" is a message. To set the entire message, use \"\n                         \"syntax like \\\"\" + option_field->name() +\n                         \" = { <proto text format> }\\\". \"\n                         \"To set fields within it, use \"\n                         \"syntax like \\\"\" + option_field->name() +\n                         \".foo = value\\\".\");\n  }\n\n  const Descriptor* type = option_field->message_type();\n  scoped_ptr<Message> dynamic(dynamic_factory_.GetPrototype(type)->New());\n  GOOGLE_CHECK(dynamic.get() != NULL)\n      << \"Could not create an instance of \" << option_field->DebugString();\n\n  AggregateErrorCollector collector;\n  AggregateOptionFinder finder;\n  finder.builder_ = builder_;\n  TextFormat::Parser parser;\n  parser.RecordErrorsTo(&collector);\n  parser.SetFinder(&finder);\n  if (!parser.ParseFromString(uninterpreted_option_->aggregate_value(),\n                              dynamic.get())) {\n    AddValueError(\"Error while parsing option value for \\\"\" +\n                  option_field->name() + \"\\\": \" + collector.error_);\n    return false;\n  } else {\n    string serial;\n    dynamic->SerializeToString(&serial);  // Never fails\n    unknown_fields->AddLengthDelimited(option_field->number(), serial);\n    return true;\n  }\n}\n\nvoid DescriptorBuilder::OptionInterpreter::SetInt32(int number, int32 value,\n    FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) {\n  switch (type) {\n    case FieldDescriptor::TYPE_INT32:\n      unknown_fields->AddVarint(number,\n        static_cast<uint64>(static_cast<int64>(value)));\n      break;\n\n    case FieldDescriptor::TYPE_SFIXED32:\n      unknown_fields->AddFixed32(number, static_cast<uint32>(value));\n      break;\n\n    case FieldDescriptor::TYPE_SINT32:\n      unknown_fields->AddVarint(number,\n          google::protobuf::internal::WireFormatLite::ZigZagEncode32(value));\n      break;\n\n    default:\n      GOOGLE_LOG(FATAL) << \"Invalid wire type for CPPTYPE_INT32: \" << type;\n      break;\n  }\n}\n\nvoid DescriptorBuilder::OptionInterpreter::SetInt64(int number, int64 value,\n    FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) {\n  switch (type) {\n    case FieldDescriptor::TYPE_INT64:\n      unknown_fields->AddVarint(number, static_cast<uint64>(value));\n      break;\n\n    case FieldDescriptor::TYPE_SFIXED64:\n      unknown_fields->AddFixed64(number, static_cast<uint64>(value));\n      break;\n\n    case FieldDescriptor::TYPE_SINT64:\n      unknown_fields->AddVarint(number,\n          google::protobuf::internal::WireFormatLite::ZigZagEncode64(value));\n      break;\n\n    default:\n      GOOGLE_LOG(FATAL) << \"Invalid wire type for CPPTYPE_INT64: \" << type;\n      break;\n  }\n}\n\nvoid DescriptorBuilder::OptionInterpreter::SetUInt32(int number, uint32 value,\n    FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) {\n  switch (type) {\n    case FieldDescriptor::TYPE_UINT32:\n      unknown_fields->AddVarint(number, static_cast<uint64>(value));\n      break;\n\n    case FieldDescriptor::TYPE_FIXED32:\n      unknown_fields->AddFixed32(number, static_cast<uint32>(value));\n      break;\n\n    default:\n      GOOGLE_LOG(FATAL) << \"Invalid wire type for CPPTYPE_UINT32: \" << type;\n      break;\n  }\n}\n\nvoid DescriptorBuilder::OptionInterpreter::SetUInt64(int number, uint64 value,\n    FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) {\n  switch (type) {\n    case FieldDescriptor::TYPE_UINT64:\n      unknown_fields->AddVarint(number, value);\n      break;\n\n    case FieldDescriptor::TYPE_FIXED64:\n      unknown_fields->AddFixed64(number, value);\n      break;\n\n    default:\n      GOOGLE_LOG(FATAL) << \"Invalid wire type for CPPTYPE_UINT64: \" << type;\n      break;\n  }\n}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file contains classes which describe a type of protocol message.\n// You can use a message's descriptor to learn at runtime what fields\n// it contains and what the types of those fields are.  The Message\n// interface also allows you to dynamically access and modify individual\n// fields by passing the FieldDescriptor of the field you are interested\n// in.\n//\n// Most users will not care about descriptors, because they will write\n// code specific to certain protocol types and will simply use the classes\n// generated by the protocol compiler directly.  Advanced users who want\n// to operate on arbitrary types (not known at compile time) may want to\n// read descriptors in order to learn about the contents of a message.\n// A very small number of users will want to construct their own\n// Descriptors, either because they are implementing Message manually or\n// because they are writing something like the protocol compiler.\n//\n// For an example of how you might use descriptors, see the code example\n// at the top of message.h.\n\n#ifndef GOOGLE_PROTOBUF_DESCRIPTOR_H__\n#define GOOGLE_PROTOBUF_DESCRIPTOR_H__\n\n#include <string>\n#include <vector>\n#include <google/protobuf/stubs/common.h>\n\n\nnamespace google {\nnamespace protobuf {\n\n// Defined in this file.\nclass Descriptor;\nclass FieldDescriptor;\nclass EnumDescriptor;\nclass EnumValueDescriptor;\nclass ServiceDescriptor;\nclass MethodDescriptor;\nclass FileDescriptor;\nclass DescriptorDatabase;\nclass DescriptorPool;\n\n// Defined in descriptor.proto\nclass DescriptorProto;\nclass FieldDescriptorProto;\nclass EnumDescriptorProto;\nclass EnumValueDescriptorProto;\nclass ServiceDescriptorProto;\nclass MethodDescriptorProto;\nclass FileDescriptorProto;\nclass MessageOptions;\nclass FieldOptions;\nclass EnumOptions;\nclass EnumValueOptions;\nclass ServiceOptions;\nclass MethodOptions;\nclass FileOptions;\nclass UninterpretedOption;\n\n// Defined in message.h\nclass Message;\n\n// Defined in descriptor.cc\nclass DescriptorBuilder;\nclass FileDescriptorTables;\n\n// Defined in unknown_field_set.h.\nclass UnknownField;\n\n// Describes a type of protocol message, or a particular group within a\n// message.  To obtain the Descriptor for a given message object, call\n// Message::GetDescriptor().  Generated message classes also have a\n// static method called descriptor() which returns the type's descriptor.\n// Use DescriptorPool to construct your own descriptors.\nclass LIBPROTOBUF_EXPORT Descriptor {\n public:\n  // The name of the message type, not including its scope.\n  const string& name() const;\n\n  // The fully-qualified name of the message type, scope delimited by\n  // periods.  For example, message type \"Foo\" which is declared in package\n  // \"bar\" has full name \"bar.Foo\".  If a type \"Baz\" is nested within\n  // Foo, Baz's full_name is \"bar.Foo.Baz\".  To get only the part that\n  // comes after the last '.', use name().\n  const string& full_name() const;\n\n  // Index of this descriptor within the file or containing type's message\n  // type array.\n  int index() const;\n\n  // The .proto file in which this message type was defined.  Never NULL.\n  const FileDescriptor* file() const;\n\n  // If this Descriptor describes a nested type, this returns the type\n  // in which it is nested.  Otherwise, returns NULL.\n  const Descriptor* containing_type() const;\n\n  // Get options for this message type.  These are specified in the .proto file\n  // by placing lines like \"option foo = 1234;\" in the message definition.\n  // Allowed options are defined by MessageOptions in\n  // google/protobuf/descriptor.proto, and any available extensions of that\n  // message.\n  const MessageOptions& options() const;\n\n  // Write the contents of this Descriptor into the given DescriptorProto.\n  // The target DescriptorProto must be clear before calling this; if it\n  // isn't, the result may be garbage.\n  void CopyTo(DescriptorProto* proto) const;\n\n  // Write the contents of this decriptor in a human-readable form. Output\n  // will be suitable for re-parsing.\n  string DebugString() const;\n\n  // Field stuff -----------------------------------------------------\n\n  // The number of fields in this message type.\n  int field_count() const;\n  // Gets a field by index, where 0 <= index < field_count().\n  // These are returned in the order they were defined in the .proto file.\n  const FieldDescriptor* field(int index) const;\n\n  // Looks up a field by declared tag number.  Returns NULL if no such field\n  // exists.\n  const FieldDescriptor* FindFieldByNumber(int number) const;\n  // Looks up a field by name.  Returns NULL if no such field exists.\n  const FieldDescriptor* FindFieldByName(const string& name) const;\n\n  // Looks up a field by lowercased name (as returned by lowercase_name()).\n  // This lookup may be ambiguous if multiple field names differ only by case,\n  // in which case the field returned is chosen arbitrarily from the matches.\n  const FieldDescriptor* FindFieldByLowercaseName(\n      const string& lowercase_name) const;\n\n  // Looks up a field by camel-case name (as returned by camelcase_name()).\n  // This lookup may be ambiguous if multiple field names differ in a way that\n  // leads them to have identical camel-case names, in which case the field\n  // returned is chosen arbitrarily from the matches.\n  const FieldDescriptor* FindFieldByCamelcaseName(\n      const string& camelcase_name) const;\n\n  // Nested type stuff -----------------------------------------------\n\n  // The number of nested types in this message type.\n  int nested_type_count() const;\n  // Gets a nested type by index, where 0 <= index < nested_type_count().\n  // These are returned in the order they were defined in the .proto file.\n  const Descriptor* nested_type(int index) const;\n\n  // Looks up a nested type by name.  Returns NULL if no such nested type\n  // exists.\n  const Descriptor* FindNestedTypeByName(const string& name) const;\n\n  // Enum stuff ------------------------------------------------------\n\n  // The number of enum types in this message type.\n  int enum_type_count() const;\n  // Gets an enum type by index, where 0 <= index < enum_type_count().\n  // These are returned in the order they were defined in the .proto file.\n  const EnumDescriptor* enum_type(int index) const;\n\n  // Looks up an enum type by name.  Returns NULL if no such enum type exists.\n  const EnumDescriptor* FindEnumTypeByName(const string& name) const;\n\n  // Looks up an enum value by name, among all enum types in this message.\n  // Returns NULL if no such value exists.\n  const EnumValueDescriptor* FindEnumValueByName(const string& name) const;\n\n  // Extensions ------------------------------------------------------\n\n  // A range of field numbers which are designated for third-party\n  // extensions.\n  struct ExtensionRange {\n    int start;  // inclusive\n    int end;    // exclusive\n  };\n\n  // The number of extension ranges in this message type.\n  int extension_range_count() const;\n  // Gets an extension range by index, where 0 <= index <\n  // extension_range_count(). These are returned in the order they were defined\n  // in the .proto file.\n  const ExtensionRange* extension_range(int index) const;\n\n  // Returns true if the number is in one of the extension ranges.\n  bool IsExtensionNumber(int number) const;\n\n  // The number of extensions -- extending *other* messages -- that were\n  // defined nested within this message type's scope.\n  int extension_count() const;\n  // Get an extension by index, where 0 <= index < extension_count().\n  // These are returned in the order they were defined in the .proto file.\n  const FieldDescriptor* extension(int index) const;\n\n  // Looks up a named extension (which extends some *other* message type)\n  // defined within this message type's scope.\n  const FieldDescriptor* FindExtensionByName(const string& name) const;\n\n  // Similar to FindFieldByLowercaseName(), but finds extensions defined within\n  // this message type's scope.\n  const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const;\n\n  // Similar to FindFieldByCamelcaseName(), but finds extensions defined within\n  // this message type's scope.\n  const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const;\n\n private:\n  typedef MessageOptions OptionsType;\n\n  // Internal version of DebugString; controls the level of indenting for\n  // correct depth\n  void DebugString(int depth, string *contents) const;\n\n  const string* name_;\n  const string* full_name_;\n  const FileDescriptor* file_;\n  const Descriptor* containing_type_;\n  const MessageOptions* options_;\n\n  // True if this is a placeholder for an unknown type.\n  bool is_placeholder_;\n  // True if this is a placeholder and the type name wasn't fully-qualified.\n  bool is_unqualified_placeholder_;\n\n  int field_count_;\n  FieldDescriptor* fields_;\n  int nested_type_count_;\n  Descriptor* nested_types_;\n  int enum_type_count_;\n  EnumDescriptor* enum_types_;\n  int extension_range_count_;\n  ExtensionRange* extension_ranges_;\n  int extension_count_;\n  FieldDescriptor* extensions_;\n  // IMPORTANT:  If you add a new field, make sure to search for all instances\n  // of Allocate<Descriptor>() and AllocateArray<Descriptor>() in descriptor.cc\n  // and update them to initialize the field.\n\n  // Must be constructed using DescriptorPool.\n  Descriptor() {}\n  friend class DescriptorBuilder;\n  friend class EnumDescriptor;\n  friend class FieldDescriptor;\n  friend class MethodDescriptor;\n  friend class FileDescriptor;\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Descriptor);\n};\n\n// Describes a single field of a message.  To get the descriptor for a given\n// field, first get the Descriptor for the message in which it is defined,\n// then call Descriptor::FindFieldByName().  To get a FieldDescriptor for\n// an extension, do one of the following:\n// - Get the Descriptor or FileDescriptor for its containing scope, then\n//   call Descriptor::FindExtensionByName() or\n//   FileDescriptor::FindExtensionByName().\n// - Given a DescriptorPool, call DescriptorPool::FindExtensionByNumber().\n// - Given a Reflection for a message object, call\n//   Reflection::FindKnownExtensionByName() or\n//   Reflection::FindKnownExtensionByNumber().\n// Use DescriptorPool to construct your own descriptors.\nclass LIBPROTOBUF_EXPORT FieldDescriptor {\n public:\n  // Identifies a field type.  0 is reserved for errors.  The order is weird\n  // for historical reasons.  Types 12 and up are new in proto2.\n  enum Type {\n    TYPE_DOUBLE         = 1,   // double, exactly eight bytes on the wire.\n    TYPE_FLOAT          = 2,   // float, exactly four bytes on the wire.\n    TYPE_INT64          = 3,   // int64, varint on the wire.  Negative numbers\n                               // take 10 bytes.  Use TYPE_SINT64 if negative\n                               // values are likely.\n    TYPE_UINT64         = 4,   // uint64, varint on the wire.\n    TYPE_INT32          = 5,   // int32, varint on the wire.  Negative numbers\n                               // take 10 bytes.  Use TYPE_SINT32 if negative\n                               // values are likely.\n    TYPE_FIXED64        = 6,   // uint64, exactly eight bytes on the wire.\n    TYPE_FIXED32        = 7,   // uint32, exactly four bytes on the wire.\n    TYPE_BOOL           = 8,   // bool, varint on the wire.\n    TYPE_STRING         = 9,   // UTF-8 text.\n    TYPE_GROUP          = 10,  // Tag-delimited message.  Deprecated.\n    TYPE_MESSAGE        = 11,  // Length-delimited message.\n\n    TYPE_BYTES          = 12,  // Arbitrary byte array.\n    TYPE_UINT32         = 13,  // uint32, varint on the wire\n    TYPE_ENUM           = 14,  // Enum, varint on the wire\n    TYPE_SFIXED32       = 15,  // int32, exactly four bytes on the wire\n    TYPE_SFIXED64       = 16,  // int64, exactly eight bytes on the wire\n    TYPE_SINT32         = 17,  // int32, ZigZag-encoded varint on the wire\n    TYPE_SINT64         = 18,  // int64, ZigZag-encoded varint on the wire\n\n    MAX_TYPE            = 18,  // Constant useful for defining lookup tables\n                               // indexed by Type.\n  };\n\n  // Specifies the C++ data type used to represent the field.  There is a\n  // fixed mapping from Type to CppType where each Type maps to exactly one\n  // CppType.  0 is reserved for errors.\n  enum CppType {\n    CPPTYPE_INT32       = 1,     // TYPE_INT32, TYPE_SINT32, TYPE_SFIXED32\n    CPPTYPE_INT64       = 2,     // TYPE_INT64, TYPE_SINT64, TYPE_SFIXED64\n    CPPTYPE_UINT32      = 3,     // TYPE_UINT32, TYPE_FIXED32\n    CPPTYPE_UINT64      = 4,     // TYPE_UINT64, TYPE_FIXED64\n    CPPTYPE_DOUBLE      = 5,     // TYPE_DOUBLE\n    CPPTYPE_FLOAT       = 6,     // TYPE_FLOAT\n    CPPTYPE_BOOL        = 7,     // TYPE_BOOL\n    CPPTYPE_ENUM        = 8,     // TYPE_ENUM\n    CPPTYPE_STRING      = 9,     // TYPE_STRING, TYPE_BYTES\n    CPPTYPE_MESSAGE     = 10,    // TYPE_MESSAGE, TYPE_GROUP\n\n    MAX_CPPTYPE         = 10,    // Constant useful for defining lookup tables\n                                 // indexed by CppType.\n  };\n\n  // Identifies whether the field is optional, required, or repeated.  0 is\n  // reserved for errors.\n  enum Label {\n    LABEL_OPTIONAL      = 1,    // optional\n    LABEL_REQUIRED      = 2,    // required\n    LABEL_REPEATED      = 3,    // repeated\n\n    MAX_LABEL           = 3,    // Constant useful for defining lookup tables\n                                // indexed by Label.\n  };\n\n  // Valid field numbers are positive integers up to kMaxNumber.\n  static const int kMaxNumber = (1 << 29) - 1;\n\n  // First field number reserved for the protocol buffer library implementation.\n  // Users may not declare fields that use reserved numbers.\n  static const int kFirstReservedNumber = 19000;\n  // Last field number reserved for the protocol buffer library implementation.\n  // Users may not declare fields that use reserved numbers.\n  static const int kLastReservedNumber  = 19999;\n\n  const string& name() const;        // Name of this field within the message.\n  const string& full_name() const;   // Fully-qualified name of the field.\n  const FileDescriptor* file() const;// File in which this field was defined.\n  bool is_extension() const;         // Is this an extension field?\n  int number() const;                // Declared tag number.\n\n  // Same as name() except converted to lower-case.  This (and especially the\n  // FindFieldByLowercaseName() method) can be useful when parsing formats\n  // which prefer to use lowercase naming style.  (Although, technically\n  // field names should be lowercased anyway according to the protobuf style\n  // guide, so this only makes a difference when dealing with old .proto files\n  // which do not follow the guide.)\n  const string& lowercase_name() const;\n\n  // Same as name() except converted to camel-case.  In this conversion, any\n  // time an underscore appears in the name, it is removed and the next\n  // letter is capitalized.  Furthermore, the first letter of the name is\n  // lower-cased.  Examples:\n  //   FooBar -> fooBar\n  //   foo_bar -> fooBar\n  //   fooBar -> fooBar\n  // This (and especially the FindFieldByCamelcaseName() method) can be useful\n  // when parsing formats which prefer to use camel-case naming style.\n  const string& camelcase_name() const;\n\n  Type type() const;                 // Declared type of this field.\n  CppType cpp_type() const;          // C++ type of this field.\n  Label label() const;               // optional/required/repeated\n\n  bool is_required() const;      // shorthand for label() == LABEL_REQUIRED\n  bool is_optional() const;      // shorthand for label() == LABEL_OPTIONAL\n  bool is_repeated() const;      // shorthand for label() == LABEL_REPEATED\n  bool is_packable() const;      // shorthand for is_repeated() &&\n                                 //               IsTypePackable(type())\n\n  // Index of this field within the message's field array, or the file or\n  // extension scope's extensions array.\n  int index() const;\n\n  // Does this field have an explicitly-declared default value?\n  bool has_default_value() const;\n\n  // Get the field default value if cpp_type() == CPPTYPE_INT32.  If no\n  // explicit default was defined, the default is 0.\n  int32 default_value_int32() const;\n  // Get the field default value if cpp_type() == CPPTYPE_INT64.  If no\n  // explicit default was defined, the default is 0.\n  int64 default_value_int64() const;\n  // Get the field default value if cpp_type() == CPPTYPE_UINT32.  If no\n  // explicit default was defined, the default is 0.\n  uint32 default_value_uint32() const;\n  // Get the field default value if cpp_type() == CPPTYPE_UINT64.  If no\n  // explicit default was defined, the default is 0.\n  uint64 default_value_uint64() const;\n  // Get the field default value if cpp_type() == CPPTYPE_FLOAT.  If no\n  // explicit default was defined, the default is 0.0.\n  float default_value_float() const;\n  // Get the field default value if cpp_type() == CPPTYPE_DOUBLE.  If no\n  // explicit default was defined, the default is 0.0.\n  double default_value_double() const;\n  // Get the field default value if cpp_type() == CPPTYPE_BOOL.  If no\n  // explicit default was defined, the default is false.\n  bool default_value_bool() const;\n  // Get the field default value if cpp_type() == CPPTYPE_ENUM.  If no\n  // explicit default was defined, the default is the first value defined\n  // in the enum type (all enum types are required to have at least one value).\n  // This never returns NULL.\n  const EnumValueDescriptor* default_value_enum() const;\n  // Get the field default value if cpp_type() == CPPTYPE_STRING.  If no\n  // explicit default was defined, the default is the empty string.\n  const string& default_value_string() const;\n\n  // The Descriptor for the message of which this is a field.  For extensions,\n  // this is the extended type.  Never NULL.\n  const Descriptor* containing_type() const;\n\n  // An extension may be declared within the scope of another message.  If this\n  // field is an extension (is_extension() is true), then extension_scope()\n  // returns that message, or NULL if the extension was declared at global\n  // scope.  If this is not an extension, extension_scope() is undefined (may\n  // assert-fail).\n  const Descriptor* extension_scope() const;\n\n  // If type is TYPE_MESSAGE or TYPE_GROUP, returns a descriptor for the\n  // message or the group type.  Otherwise, undefined.\n  const Descriptor* message_type() const;\n  // If type is TYPE_ENUM, returns a descriptor for the enum.  Otherwise,\n  // undefined.\n  const EnumDescriptor* enum_type() const;\n\n  // EXPERIMENTAL; DO NOT USE.\n  // If this field is a map field, experimental_map_key() is the field\n  // that is the key for this map.\n  // experimental_map_key()->containing_type() is the same as message_type().\n  const FieldDescriptor* experimental_map_key() const;\n\n  // Get the FieldOptions for this field.  This includes things listed in\n  // square brackets after the field definition.  E.g., the field:\n  //   optional string text = 1 [ctype=CORD];\n  // has the \"ctype\" option set.  Allowed options are defined by FieldOptions\n  // in google/protobuf/descriptor.proto, and any available extensions of that\n  // message.\n  const FieldOptions& options() const;\n\n  // See Descriptor::CopyTo().\n  void CopyTo(FieldDescriptorProto* proto) const;\n\n  // See Descriptor::DebugString().\n  string DebugString() const;\n\n  // Helper method to get the CppType for a particular Type.\n  static CppType TypeToCppType(Type type);\n\n  // Return true iff [packed = true] is valid for fields of this type.\n  static inline bool IsTypePackable(Type field_type);\n\n private:\n  typedef FieldOptions OptionsType;\n\n  // See Descriptor::DebugString().\n  void DebugString(int depth, string *contents) const;\n\n  // formats the default value appropriately and returns it as a string.\n  // Must have a default value to call this. If quote_string_type is true, then\n  // types of CPPTYPE_STRING whill be surrounded by quotes and CEscaped.\n  string DefaultValueAsString(bool quote_string_type) const;\n\n  const string* name_;\n  const string* full_name_;\n  const string* lowercase_name_;\n  const string* camelcase_name_;\n  const FileDescriptor* file_;\n  int number_;\n  Type type_;\n  Label label_;\n  bool is_extension_;\n  const Descriptor* containing_type_;\n  const Descriptor* extension_scope_;\n  const Descriptor* message_type_;\n  const EnumDescriptor* enum_type_;\n  const FieldDescriptor* experimental_map_key_;\n  const FieldOptions* options_;\n  // IMPORTANT:  If you add a new field, make sure to search for all instances\n  // of Allocate<FieldDescriptor>() and AllocateArray<FieldDescriptor>() in\n  // descriptor.cc and update them to initialize the field.\n\n  bool has_default_value_;\n  union {\n    int32  default_value_int32_;\n    int64  default_value_int64_;\n    uint32 default_value_uint32_;\n    uint64 default_value_uint64_;\n    float  default_value_float_;\n    double default_value_double_;\n    bool   default_value_bool_;\n\n    const EnumValueDescriptor* default_value_enum_;\n    const string* default_value_string_;\n  };\n\n  static const CppType kTypeToCppTypeMap[MAX_TYPE + 1];\n\n  static const char * const kTypeToName[MAX_TYPE + 1];\n\n  static const char * const kLabelToName[MAX_LABEL + 1];\n\n  // Must be constructed using DescriptorPool.\n  FieldDescriptor() {}\n  friend class DescriptorBuilder;\n  friend class FileDescriptor;\n  friend class Descriptor;\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldDescriptor);\n};\n\n// Describes an enum type defined in a .proto file.  To get the EnumDescriptor\n// for a generated enum type, call TypeName_descriptor().  Use DescriptorPool\n// to construct your own descriptors.\nclass LIBPROTOBUF_EXPORT EnumDescriptor {\n public:\n  // The name of this enum type in the containing scope.\n  const string& name() const;\n\n  // The fully-qualified name of the enum type, scope delimited by periods.\n  const string& full_name() const;\n\n  // Index of this enum within the file or containing message's enum array.\n  int index() const;\n\n  // The .proto file in which this enum type was defined.  Never NULL.\n  const FileDescriptor* file() const;\n\n  // The number of values for this EnumDescriptor.  Guaranteed to be greater\n  // than zero.\n  int value_count() const;\n  // Gets a value by index, where 0 <= index < value_count().\n  // These are returned in the order they were defined in the .proto file.\n  const EnumValueDescriptor* value(int index) const;\n\n  // Looks up a value by name.  Returns NULL if no such value exists.\n  const EnumValueDescriptor* FindValueByName(const string& name) const;\n  // Looks up a value by number.  Returns NULL if no such value exists.  If\n  // multiple values have this number, the first one defined is returned.\n  const EnumValueDescriptor* FindValueByNumber(int number) const;\n\n  // If this enum type is nested in a message type, this is that message type.\n  // Otherwise, NULL.\n  const Descriptor* containing_type() const;\n\n  // Get options for this enum type.  These are specified in the .proto file by\n  // placing lines like \"option foo = 1234;\" in the enum definition.  Allowed\n  // options are defined by EnumOptions in google/protobuf/descriptor.proto,\n  // and any available extensions of that message.\n  const EnumOptions& options() const;\n\n  // See Descriptor::CopyTo().\n  void CopyTo(EnumDescriptorProto* proto) const;\n\n  // See Descriptor::DebugString().\n  string DebugString() const;\n\n private:\n  typedef EnumOptions OptionsType;\n\n  // See Descriptor::DebugString().\n  void DebugString(int depth, string *contents) const;\n\n  const string* name_;\n  const string* full_name_;\n  const FileDescriptor* file_;\n  const Descriptor* containing_type_;\n  const EnumOptions* options_;\n\n  // True if this is a placeholder for an unknown type.\n  bool is_placeholder_;\n  // True if this is a placeholder and the type name wasn't fully-qualified.\n  bool is_unqualified_placeholder_;\n\n  int value_count_;\n  EnumValueDescriptor* values_;\n  // IMPORTANT:  If you add a new field, make sure to search for all instances\n  // of Allocate<EnumDescriptor>() and AllocateArray<EnumDescriptor>() in\n  // descriptor.cc and update them to initialize the field.\n\n  // Must be constructed using DescriptorPool.\n  EnumDescriptor() {}\n  friend class DescriptorBuilder;\n  friend class Descriptor;\n  friend class FieldDescriptor;\n  friend class EnumValueDescriptor;\n  friend class FileDescriptor;\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumDescriptor);\n};\n\n// Describes an individual enum constant of a particular type.  To get the\n// EnumValueDescriptor for a given enum value, first get the EnumDescriptor\n// for its type, then use EnumDescriptor::FindValueByName() or\n// EnumDescriptor::FindValueByNumber().  Use DescriptorPool to construct\n// your own descriptors.\nclass LIBPROTOBUF_EXPORT EnumValueDescriptor {\n public:\n  const string& name() const;  // Name of this enum constant.\n  int index() const;           // Index within the enums's Descriptor.\n  int number() const;          // Numeric value of this enum constant.\n\n  // The full_name of an enum value is a sibling symbol of the enum type.\n  // e.g. the full name of FieldDescriptorProto::TYPE_INT32 is actually\n  // \"google.protobuf.FieldDescriptorProto.TYPE_INT32\", NOT\n  // \"google.protobuf.FieldDescriptorProto.Type.TYPE_INT32\".  This is to conform\n  // with C++ scoping rules for enums.\n  const string& full_name() const;\n\n  // The type of this value.  Never NULL.\n  const EnumDescriptor* type() const;\n\n  // Get options for this enum value.  These are specified in the .proto file\n  // by adding text like \"[foo = 1234]\" after an enum value definition.\n  // Allowed options are defined by EnumValueOptions in\n  // google/protobuf/descriptor.proto, and any available extensions of that\n  // message.\n  const EnumValueOptions& options() const;\n\n  // See Descriptor::CopyTo().\n  void CopyTo(EnumValueDescriptorProto* proto) const;\n\n  // See Descriptor::DebugString().\n  string DebugString() const;\n\n private:\n  typedef EnumValueOptions OptionsType;\n\n  // See Descriptor::DebugString().\n  void DebugString(int depth, string *contents) const;\n\n  const string* name_;\n  const string* full_name_;\n  int number_;\n  const EnumDescriptor* type_;\n  const EnumValueOptions* options_;\n  // IMPORTANT:  If you add a new field, make sure to search for all instances\n  // of Allocate<EnumValueDescriptor>() and AllocateArray<EnumValueDescriptor>()\n  // in descriptor.cc and update them to initialize the field.\n\n  // Must be constructed using DescriptorPool.\n  EnumValueDescriptor() {}\n  friend class DescriptorBuilder;\n  friend class EnumDescriptor;\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumValueDescriptor);\n};\n\n// Describes an RPC service.  To get the ServiceDescriptor for a service,\n// call Service::GetDescriptor().  Generated service classes also have a\n// static method called descriptor() which returns the type's\n// ServiceDescriptor.  Use DescriptorPool to construct your own descriptors.\nclass LIBPROTOBUF_EXPORT ServiceDescriptor {\n public:\n  // The name of the service, not including its containing scope.\n  const string& name() const;\n  // The fully-qualified name of the service, scope delimited by periods.\n  const string& full_name() const;\n  // Index of this service within the file's services array.\n  int index() const;\n\n  // The .proto file in which this service was defined.  Never NULL.\n  const FileDescriptor* file() const;\n\n  // Get options for this service type.  These are specified in the .proto file\n  // by placing lines like \"option foo = 1234;\" in the service definition.\n  // Allowed options are defined by ServiceOptions in\n  // google/protobuf/descriptor.proto, and any available extensions of that\n  // message.\n  const ServiceOptions& options() const;\n\n  // The number of methods this service defines.\n  int method_count() const;\n  // Gets a MethodDescriptor by index, where 0 <= index < method_count().\n  // These are returned in the order they were defined in the .proto file.\n  const MethodDescriptor* method(int index) const;\n\n  // Look up a MethodDescriptor by name.\n  const MethodDescriptor* FindMethodByName(const string& name) const;\n\n  // See Descriptor::CopyTo().\n  void CopyTo(ServiceDescriptorProto* proto) const;\n\n  // See Descriptor::DebugString().\n  string DebugString() const;\n\n private:\n  typedef ServiceOptions OptionsType;\n\n  // See Descriptor::DebugString().\n  void DebugString(string *contents) const;\n\n  const string* name_;\n  const string* full_name_;\n  const FileDescriptor* file_;\n  const ServiceOptions* options_;\n  int method_count_;\n  MethodDescriptor* methods_;\n  // IMPORTANT:  If you add a new field, make sure to search for all instances\n  // of Allocate<ServiceDescriptor>() and AllocateArray<ServiceDescriptor>() in\n  // descriptor.cc and update them to initialize the field.\n\n  // Must be constructed using DescriptorPool.\n  ServiceDescriptor() {}\n  friend class DescriptorBuilder;\n  friend class FileDescriptor;\n  friend class MethodDescriptor;\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceDescriptor);\n};\n\n// Describes an individual service method.  To obtain a MethodDescriptor given\n// a service, first get its ServiceDescriptor, then call\n// ServiceDescriptor::FindMethodByName().  Use DescriptorPool to construct your\n// own descriptors.\nclass LIBPROTOBUF_EXPORT MethodDescriptor {\n public:\n  // Name of this method, not including containing scope.\n  const string& name() const;\n  // The fully-qualified name of the method, scope delimited by periods.\n  const string& full_name() const;\n  // Index within the service's Descriptor.\n  int index() const;\n\n  // Gets the service to which this method belongs.  Never NULL.\n  const ServiceDescriptor* service() const;\n\n  // Gets the type of protocol message which this method accepts as input.\n  const Descriptor* input_type() const;\n  // Gets the type of protocol message which this message produces as output.\n  const Descriptor* output_type() const;\n\n  // Get options for this method.  These are specified in the .proto file by\n  // placing lines like \"option foo = 1234;\" in curly-braces after a method\n  // declaration.  Allowed options are defined by MethodOptions in\n  // google/protobuf/descriptor.proto, and any available extensions of that\n  // message.\n  const MethodOptions& options() const;\n\n  // See Descriptor::CopyTo().\n  void CopyTo(MethodDescriptorProto* proto) const;\n\n  // See Descriptor::DebugString().\n  string DebugString() const;\n\n private:\n  typedef MethodOptions OptionsType;\n\n  // See Descriptor::DebugString().\n  void DebugString(int depth, string *contents) const;\n\n  const string* name_;\n  const string* full_name_;\n  const ServiceDescriptor* service_;\n  const Descriptor* input_type_;\n  const Descriptor* output_type_;\n  const MethodOptions* options_;\n  // IMPORTANT:  If you add a new field, make sure to search for all instances\n  // of Allocate<MethodDescriptor>() and AllocateArray<MethodDescriptor>() in\n  // descriptor.cc and update them to initialize the field.\n\n  // Must be constructed using DescriptorPool.\n  MethodDescriptor() {}\n  friend class DescriptorBuilder;\n  friend class ServiceDescriptor;\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MethodDescriptor);\n};\n\n// Describes a whole .proto file.  To get the FileDescriptor for a compiled-in\n// file, get the descriptor for something defined in that file and call\n// descriptor->file().  Use DescriptorPool to construct your own descriptors.\nclass LIBPROTOBUF_EXPORT FileDescriptor {\n public:\n  // The filename, relative to the source tree.\n  // e.g. \"google/protobuf/descriptor.proto\"\n  const string& name() const;\n\n  // The package, e.g. \"google.protobuf.compiler\".\n  const string& package() const;\n\n  // The DescriptorPool in which this FileDescriptor and all its contents were\n  // allocated.  Never NULL.\n  const DescriptorPool* pool() const;\n\n  // The number of files imported by this one.\n  int dependency_count() const;\n  // Gets an imported file by index, where 0 <= index < dependency_count().\n  // These are returned in the order they were defined in the .proto file.\n  const FileDescriptor* dependency(int index) const;\n\n  // Number of top-level message types defined in this file.  (This does not\n  // include nested types.)\n  int message_type_count() const;\n  // Gets a top-level message type, where 0 <= index < message_type_count().\n  // These are returned in the order they were defined in the .proto file.\n  const Descriptor* message_type(int index) const;\n\n  // Number of top-level enum types defined in this file.  (This does not\n  // include nested types.)\n  int enum_type_count() const;\n  // Gets a top-level enum type, where 0 <= index < enum_type_count().\n  // These are returned in the order they were defined in the .proto file.\n  const EnumDescriptor* enum_type(int index) const;\n\n  // Number of services defined in this file.\n  int service_count() const;\n  // Gets a service, where 0 <= index < service_count().\n  // These are returned in the order they were defined in the .proto file.\n  const ServiceDescriptor* service(int index) const;\n\n  // Number of extensions defined at file scope.  (This does not include\n  // extensions nested within message types.)\n  int extension_count() const;\n  // Gets an extension's descriptor, where 0 <= index < extension_count().\n  // These are returned in the order they were defined in the .proto file.\n  const FieldDescriptor* extension(int index) const;\n\n  // Get options for this file.  These are specified in the .proto file by\n  // placing lines like \"option foo = 1234;\" at the top level, outside of any\n  // other definitions.  Allowed options are defined by FileOptions in\n  // google/protobuf/descriptor.proto, and any available extensions of that\n  // message.\n  const FileOptions& options() const;\n\n  // Find a top-level message type by name.  Returns NULL if not found.\n  const Descriptor* FindMessageTypeByName(const string& name) const;\n  // Find a top-level enum type by name.  Returns NULL if not found.\n  const EnumDescriptor* FindEnumTypeByName(const string& name) const;\n  // Find an enum value defined in any top-level enum by name.  Returns NULL if\n  // not found.\n  const EnumValueDescriptor* FindEnumValueByName(const string& name) const;\n  // Find a service definition by name.  Returns NULL if not found.\n  const ServiceDescriptor* FindServiceByName(const string& name) const;\n  // Find a top-level extension definition by name.  Returns NULL if not found.\n  const FieldDescriptor* FindExtensionByName(const string& name) const;\n  // Similar to FindExtensionByName(), but searches by lowercased-name.  See\n  // Descriptor::FindFieldByLowercaseName().\n  const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const;\n  // Similar to FindExtensionByName(), but searches by camelcased-name.  See\n  // Descriptor::FindFieldByCamelcaseName().\n  const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const;\n\n  // See Descriptor::CopyTo().\n  void CopyTo(FileDescriptorProto* proto) const;\n\n  // See Descriptor::DebugString().\n  string DebugString() const;\n\n private:\n  typedef FileOptions OptionsType;\n\n  const string* name_;\n  const string* package_;\n  const DescriptorPool* pool_;\n  int dependency_count_;\n  const FileDescriptor** dependencies_;\n  int message_type_count_;\n  Descriptor* message_types_;\n  int enum_type_count_;\n  EnumDescriptor* enum_types_;\n  int service_count_;\n  ServiceDescriptor* services_;\n  int extension_count_;\n  FieldDescriptor* extensions_;\n  const FileOptions* options_;\n\n  const FileDescriptorTables* tables_;\n  // IMPORTANT:  If you add a new field, make sure to search for all instances\n  // of Allocate<FileDescriptor>() and AllocateArray<FileDescriptor>() in\n  // descriptor.cc and update them to initialize the field.\n\n  FileDescriptor() {}\n  friend class DescriptorBuilder;\n  friend class Descriptor;\n  friend class FieldDescriptor;\n  friend class EnumDescriptor;\n  friend class ServiceDescriptor;\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileDescriptor);\n};\n\n// ===================================================================\n\n// Used to construct descriptors.\n//\n// Normally you won't want to build your own descriptors.  Message classes\n// constructed by the protocol compiler will provide them for you.  However,\n// if you are implementing Message on your own, or if you are writing a\n// program which can operate on totally arbitrary types and needs to load\n// them from some sort of database, you might need to.\n//\n// Since Descriptors are composed of a whole lot of cross-linked bits of\n// data that would be a pain to put together manually, the\n// DescriptorPool class is provided to make the process easier.  It can\n// take a FileDescriptorProto (defined in descriptor.proto), validate it,\n// and convert it to a set of nicely cross-linked Descriptors.\n//\n// DescriptorPool also helps with memory management.  Descriptors are\n// composed of many objects containing static data and pointers to each\n// other.  In all likelihood, when it comes time to delete this data,\n// you'll want to delete it all at once.  In fact, it is not uncommon to\n// have a whole pool of descriptors all cross-linked with each other which\n// you wish to delete all at once.  This class represents such a pool, and\n// handles the memory management for you.\n//\n// You can also search for descriptors within a DescriptorPool by name, and\n// extensions by number.\nclass LIBPROTOBUF_EXPORT DescriptorPool {\n public:\n  // Create a normal, empty DescriptorPool.\n  DescriptorPool();\n\n  // Constructs a DescriptorPool that, when it can't find something among the\n  // descriptors already in the pool, looks for it in the given\n  // DescriptorDatabase.\n  // Notes:\n  // - If a DescriptorPool is constructed this way, its BuildFile*() methods\n  //   must not be called (they will assert-fail).  The only way to populate\n  //   the pool with descriptors is to call the Find*By*() methods.\n  // - The Find*By*() methods may block the calling thread if the\n  //   DescriptorDatabase blocks.  This in turn means that parsing messages\n  //   may block if they need to look up extensions.\n  // - The Find*By*() methods will use mutexes for thread-safety, thus making\n  //   them slower even when they don't have to fall back to the database.\n  //   In fact, even the Find*By*() methods of descriptor objects owned by\n  //   this pool will be slower, since they will have to obtain locks too.\n  // - An ErrorCollector may optionally be given to collect validation errors\n  //   in files loaded from the database.  If not given, errors will be printed\n  //   to GOOGLE_LOG(ERROR).  Remember that files are built on-demand, so this\n  //   ErrorCollector may be called from any thread that calls one of the\n  //   Find*By*() methods.\n  class ErrorCollector;\n  explicit DescriptorPool(DescriptorDatabase* fallback_database,\n                          ErrorCollector* error_collector = NULL);\n\n  ~DescriptorPool();\n\n  // Get a pointer to the generated pool.  Generated protocol message classes\n  // which are compiled into the binary will allocate their descriptors in\n  // this pool.  Do not add your own descriptors to this pool.\n  static const DescriptorPool* generated_pool();\n\n  // Find a FileDescriptor in the pool by file name.  Returns NULL if not\n  // found.\n  const FileDescriptor* FindFileByName(const string& name) const;\n\n  // Find the FileDescriptor in the pool which defines the given symbol.\n  // If any of the Find*ByName() methods below would succeed, then this is\n  // equivalent to calling that method and calling the result's file() method.\n  // Otherwise this returns NULL.\n  const FileDescriptor* FindFileContainingSymbol(\n      const string& symbol_name) const;\n\n  // Looking up descriptors ------------------------------------------\n  // These find descriptors by fully-qualified name.  These will find both\n  // top-level descriptors and nested descriptors.  They return NULL if not\n  // found.\n\n  const Descriptor* FindMessageTypeByName(const string& name) const;\n  const FieldDescriptor* FindFieldByName(const string& name) const;\n  const FieldDescriptor* FindExtensionByName(const string& name) const;\n  const EnumDescriptor* FindEnumTypeByName(const string& name) const;\n  const EnumValueDescriptor* FindEnumValueByName(const string& name) const;\n  const ServiceDescriptor* FindServiceByName(const string& name) const;\n  const MethodDescriptor* FindMethodByName(const string& name) const;\n\n  // Finds an extension of the given type by number.  The extendee must be\n  // a member of this DescriptorPool or one of its underlays.\n  const FieldDescriptor* FindExtensionByNumber(const Descriptor* extendee,\n                                               int number) const;\n\n  // Finds extensions of extendee. The extensions will be appended to\n  // out in an undefined order. Only extensions defined directly in\n  // this DescriptorPool or one of its underlays are guaranteed to be\n  // found: extensions defined in the fallback database might not be found\n  // depending on the database implementation.\n  void FindAllExtensions(const Descriptor* extendee,\n                         vector<const FieldDescriptor*>* out) const;\n\n  // Building descriptors --------------------------------------------\n\n  // When converting a FileDescriptorProto to a FileDescriptor, various\n  // errors might be detected in the input.  The caller may handle these\n  // programmatically by implementing an ErrorCollector.\n  class LIBPROTOBUF_EXPORT ErrorCollector {\n   public:\n    inline ErrorCollector() {}\n    virtual ~ErrorCollector();\n\n    // These constants specify what exact part of the construct is broken.\n    // This is useful e.g. for mapping the error back to an exact location\n    // in a .proto file.\n    enum ErrorLocation {\n      NAME,              // the symbol name, or the package name for files\n      NUMBER,            // field or extension range number\n      TYPE,              // field type\n      EXTENDEE,          // field extendee\n      DEFAULT_VALUE,     // field default value\n      INPUT_TYPE,        // method input type\n      OUTPUT_TYPE,       // method output type\n      OPTION_NAME,       // name in assignment\n      OPTION_VALUE,      // value in option assignment\n      OTHER              // some other problem\n    };\n\n    // Reports an error in the FileDescriptorProto.\n    virtual void AddError(\n      const string& filename,      // File name in which the error occurred.\n      const string& element_name,  // Full name of the erroneous element.\n      const Message* descriptor,   // Descriptor of the erroneous element.\n      ErrorLocation location,      // One of the location constants, above.\n      const string& message        // Human-readable error message.\n      ) = 0;\n\n   private:\n    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector);\n  };\n\n  // Convert the FileDescriptorProto to real descriptors and place them in\n  // this DescriptorPool.  All dependencies of the file must already be in\n  // the pool.  Returns the resulting FileDescriptor, or NULL if there were\n  // problems with the input (e.g. the message was invalid, or dependencies\n  // were missing).  Details about the errors are written to GOOGLE_LOG(ERROR).\n  const FileDescriptor* BuildFile(const FileDescriptorProto& proto);\n\n  // Same as BuildFile() except errors are sent to the given ErrorCollector.\n  const FileDescriptor* BuildFileCollectingErrors(\n    const FileDescriptorProto& proto,\n    ErrorCollector* error_collector);\n\n  // By default, it is an error if a FileDescriptorProto contains references\n  // to types or other files that are not found in the DescriptorPool (or its\n  // backing DescriptorDatabase, if any).  If you call\n  // AllowUnknownDependencies(), however, then unknown types and files\n  // will be replaced by placeholder descriptors.  This can allow you to\n  // perform some useful operations with a .proto file even if you do not\n  // have access to other .proto files on which it depends.  However, some\n  // heuristics must be used to fill in the gaps in information, and these\n  // can lead to descriptors which are inaccurate.  For example, the\n  // DescriptorPool may be forced to guess whether an unknown type is a message\n  // or an enum, as well as what package it resides in.  Furthermore,\n  // placeholder types will not be discoverable via FindMessageTypeByName()\n  // and similar methods, which could confuse some descriptor-based algorithms.\n  // Generally, the results of this option should only be relied upon for\n  // debugging purposes.\n  void AllowUnknownDependencies() { allow_unknown_ = true; }\n\n  // Internal stuff --------------------------------------------------\n  // These methods MUST NOT be called from outside the proto2 library.\n  // These methods may contain hidden pitfalls and may be removed in a\n  // future library version.\n\n  // Create a DescriptorPool which is overlaid on top of some other pool.\n  // If you search for a descriptor in the overlay and it is not found, the\n  // underlay will be searched as a backup.  If the underlay has its own\n  // underlay, that will be searched next, and so on.  This also means that\n  // files built in the overlay will be cross-linked with the underlay's\n  // descriptors if necessary.  The underlay remains property of the caller;\n  // it must remain valid for the lifetime of the newly-constructed pool.\n  //\n  // Example:  Say you want to parse a .proto file at runtime in order to use\n  // its type with a DynamicMessage.  Say this .proto file has dependencies,\n  // but you know that all the dependencies will be things that are already\n  // compiled into the binary.  For ease of use, you'd like to load the types\n  // right out of generated_pool() rather than have to parse redundant copies\n  // of all these .protos and runtime.  But, you don't want to add the parsed\n  // types directly into generated_pool(): this is not allowed, and would be\n  // bad design anyway.  So, instead, you could use generated_pool() as an\n  // underlay for a new DescriptorPool in which you add only the new file.\n  //\n  // WARNING:  Use of underlays can lead to many subtle gotchas.  Instead,\n  //   try to formulate what you want to do in terms of DescriptorDatabases.\n  explicit DescriptorPool(const DescriptorPool* underlay);\n\n  // Called by generated classes at init time to add their descriptors to\n  // generated_pool.  Do NOT call this in your own code!  filename must be a\n  // permanent string (e.g. a string literal).\n  static void InternalAddGeneratedFile(\n      const void* encoded_file_descriptor, int size);\n\n\n  // For internal use only:  Gets a non-const pointer to the generated pool.\n  // This is called at static-initialization time only, so thread-safety is\n  // not a concern.  If both an underlay and a fallback database are present,\n  // the fallback database takes precedence.\n  static DescriptorPool* internal_generated_pool();\n\n  // For internal use only:  Changes the behavior of BuildFile() such that it\n  // allows the file to make reference to message types declared in other files\n  // which it did not officially declare as dependencies.\n  void InternalDontEnforceDependencies();\n\n  // For internal use only.\n  void internal_set_underlay(const DescriptorPool* underlay) {\n    underlay_ = underlay;\n  }\n\n  // For internal (unit test) use only:  Returns true if a FileDescriptor has\n  // been constructed for the given file, false otherwise.  Useful for testing\n  // lazy descriptor initialization behavior.\n  bool InternalIsFileLoaded(const string& filename) const;\n\n private:\n  friend class Descriptor;\n  friend class FieldDescriptor;\n  friend class EnumDescriptor;\n  friend class ServiceDescriptor;\n  friend class FileDescriptor;\n  friend class DescriptorBuilder;\n\n  // Tries to find something in the fallback database and link in the\n  // corresponding proto file.  Returns true if successful, in which case\n  // the caller should search for the thing again.  These are declared\n  // const because they are called by (semantically) const methods.\n  bool TryFindFileInFallbackDatabase(const string& name) const;\n  bool TryFindSymbolInFallbackDatabase(const string& name) const;\n  bool TryFindExtensionInFallbackDatabase(const Descriptor* containing_type,\n                                          int field_number) const;\n\n  // Like BuildFile() but called internally when the file has been loaded from\n  // fallback_database_.  Declared const because it is called by (semantically)\n  // const methods.\n  const FileDescriptor* BuildFileFromDatabase(\n    const FileDescriptorProto& proto) const;\n\n  // If fallback_database_ is NULL, this is NULL.  Otherwise, this is a mutex\n  // which must be locked while accessing tables_.\n  Mutex* mutex_;\n\n  // See constructor.\n  DescriptorDatabase* fallback_database_;\n  ErrorCollector* default_error_collector_;\n  const DescriptorPool* underlay_;\n\n  // This class contains a lot of hash maps with complicated types that\n  // we'd like to keep out of the header.\n  class Tables;\n  scoped_ptr<Tables> tables_;\n\n  bool enforce_dependencies_;\n  bool allow_unknown_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPool);\n};\n\n// inline methods ====================================================\n\n// These macros makes this repetitive code more readable.\n#define PROTOBUF_DEFINE_ACCESSOR(CLASS, FIELD, TYPE) \\\n  inline TYPE CLASS::FIELD() const { return FIELD##_; }\n\n// Strings fields are stored as pointers but returned as const references.\n#define PROTOBUF_DEFINE_STRING_ACCESSOR(CLASS, FIELD) \\\n  inline const string& CLASS::FIELD() const { return *FIELD##_; }\n\n// Arrays take an index parameter, obviously.\n#define PROTOBUF_DEFINE_ARRAY_ACCESSOR(CLASS, FIELD, TYPE) \\\n  inline TYPE CLASS::FIELD(int index) const { return FIELD##s_ + index; }\n\n#define PROTOBUF_DEFINE_OPTIONS_ACCESSOR(CLASS, TYPE) \\\n  inline const TYPE& CLASS::options() const { return *options_; }\n\nPROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, name)\nPROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, full_name)\nPROTOBUF_DEFINE_ACCESSOR(Descriptor, file, const FileDescriptor*)\nPROTOBUF_DEFINE_ACCESSOR(Descriptor, containing_type, const Descriptor*)\n\nPROTOBUF_DEFINE_ACCESSOR(Descriptor, field_count, int)\nPROTOBUF_DEFINE_ACCESSOR(Descriptor, nested_type_count, int)\nPROTOBUF_DEFINE_ACCESSOR(Descriptor, enum_type_count, int)\n\nPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, field, const FieldDescriptor*)\nPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, nested_type, const Descriptor*)\nPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, enum_type, const EnumDescriptor*)\n\nPROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_range_count, int)\nPROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_count, int)\nPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension_range,\n                               const Descriptor::ExtensionRange*)\nPROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension,\n                               const FieldDescriptor*)\nPROTOBUF_DEFINE_OPTIONS_ACCESSOR(Descriptor, MessageOptions);\n\nPROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, name)\nPROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, full_name)\nPROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, lowercase_name)\nPROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, camelcase_name)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, file, const FileDescriptor*)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, number, int)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, is_extension, bool)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, type, FieldDescriptor::Type)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, label, FieldDescriptor::Label)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_type, const Descriptor*)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, extension_scope, const Descriptor*)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, message_type, const Descriptor*)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, enum_type, const EnumDescriptor*)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, experimental_map_key,\n                         const FieldDescriptor*)\nPROTOBUF_DEFINE_OPTIONS_ACCESSOR(FieldDescriptor, FieldOptions);\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, has_default_value, bool)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int32 , int32 )\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int64 , int64 )\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint32, uint32)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint64, uint64)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_float , float )\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_double, double)\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_bool  , bool  )\nPROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_enum,\n                         const EnumValueDescriptor*)\nPROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, default_value_string)\n\nPROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, name)\nPROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, full_name)\nPROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, file, const FileDescriptor*)\nPROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, containing_type, const Descriptor*)\nPROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, value_count, int)\nPROTOBUF_DEFINE_ARRAY_ACCESSOR(EnumDescriptor, value,\n                               const EnumValueDescriptor*)\nPROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumDescriptor, EnumOptions);\n\nPROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, name)\nPROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, full_name)\nPROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, number, int)\nPROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, type, const EnumDescriptor*)\nPROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumValueDescriptor, EnumValueOptions);\n\nPROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, name)\nPROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, full_name)\nPROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, file, const FileDescriptor*)\nPROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, method_count, int)\nPROTOBUF_DEFINE_ARRAY_ACCESSOR(ServiceDescriptor, method,\n                               const MethodDescriptor*)\nPROTOBUF_DEFINE_OPTIONS_ACCESSOR(ServiceDescriptor, ServiceOptions);\n\nPROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, name)\nPROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, full_name)\nPROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, service, const ServiceDescriptor*)\nPROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, input_type, const Descriptor*)\nPROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, output_type, const Descriptor*)\nPROTOBUF_DEFINE_OPTIONS_ACCESSOR(MethodDescriptor, MethodOptions);\n\nPROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, name)\nPROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, package)\nPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, pool, const DescriptorPool*)\nPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, dependency_count, int)\nPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, message_type_count, int)\nPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, enum_type_count, int)\nPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, service_count, int)\nPROTOBUF_DEFINE_ACCESSOR(FileDescriptor, extension_count, int)\nPROTOBUF_DEFINE_OPTIONS_ACCESSOR(FileDescriptor, FileOptions);\n\nPROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, message_type, const Descriptor*)\nPROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, enum_type, const EnumDescriptor*)\nPROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, service,\n                               const ServiceDescriptor*)\nPROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, extension,\n                               const FieldDescriptor*)\n\n#undef PROTOBUF_DEFINE_ACCESSOR\n#undef PROTOBUF_DEFINE_STRING_ACCESSOR\n#undef PROTOBUF_DEFINE_ARRAY_ACCESSOR\n\n// A few accessors differ from the macros...\n\ninline bool FieldDescriptor::is_required() const {\n  return label() == LABEL_REQUIRED;\n}\n\ninline bool FieldDescriptor::is_optional() const {\n  return label() == LABEL_OPTIONAL;\n}\n\ninline bool FieldDescriptor::is_repeated() const {\n  return label() == LABEL_REPEATED;\n}\n\ninline bool FieldDescriptor::is_packable() const {\n  return is_repeated() && IsTypePackable(type());\n}\n\n// To save space, index() is computed by looking at the descriptor's position\n// in the parent's array of children.\ninline int FieldDescriptor::index() const {\n  if (!is_extension_) {\n    return this - containing_type_->fields_;\n  } else if (extension_scope_ != NULL) {\n    return this - extension_scope_->extensions_;\n  } else {\n    return this - file_->extensions_;\n  }\n}\n\ninline int Descriptor::index() const {\n  if (containing_type_ == NULL) {\n    return this - file_->message_types_;\n  } else {\n    return this - containing_type_->nested_types_;\n  }\n}\n\ninline int EnumDescriptor::index() const {\n  if (containing_type_ == NULL) {\n    return this - file_->enum_types_;\n  } else {\n    return this - containing_type_->enum_types_;\n  }\n}\n\ninline int EnumValueDescriptor::index() const {\n  return this - type_->values_;\n}\n\ninline int ServiceDescriptor::index() const {\n  return this - file_->services_;\n}\n\ninline int MethodDescriptor::index() const {\n  return this - service_->methods_;\n}\n\ninline FieldDescriptor::CppType FieldDescriptor::cpp_type() const {\n  return kTypeToCppTypeMap[type_];\n}\n\ninline FieldDescriptor::CppType FieldDescriptor::TypeToCppType(Type type) {\n  return kTypeToCppTypeMap[type];\n}\n\ninline bool FieldDescriptor::IsTypePackable(Type field_type) {\n  return (field_type != FieldDescriptor::TYPE_STRING &&\n          field_type != FieldDescriptor::TYPE_GROUP &&\n          field_type != FieldDescriptor::TYPE_MESSAGE &&\n          field_type != FieldDescriptor::TYPE_BYTES);\n}\n\ninline const FileDescriptor* FileDescriptor::dependency(int index) const {\n  return dependencies_[index];\n}\n\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_DESCRIPTOR_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.cc",
    "content": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n\n#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION\n#include \"google/protobuf/descriptor.pb.h\"\n\n#include <algorithm>\n\n#include <google/protobuf/stubs/once.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/wire_format_lite_inl.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/reflection_ops.h>\n#include <google/protobuf/wire_format.h>\n// @@protoc_insertion_point(includes)\n\nnamespace google {\nnamespace protobuf {\n\nnamespace {\n\nconst ::google::protobuf::Descriptor* FileDescriptorSet_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  FileDescriptorSet_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* FileDescriptorProto_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  FileDescriptorProto_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* DescriptorProto_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  DescriptorProto_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* DescriptorProto_ExtensionRange_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  DescriptorProto_ExtensionRange_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* FieldDescriptorProto_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  FieldDescriptorProto_reflection_ = NULL;\nconst ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Type_descriptor_ = NULL;\nconst ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Label_descriptor_ = NULL;\nconst ::google::protobuf::Descriptor* EnumDescriptorProto_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  EnumDescriptorProto_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* EnumValueDescriptorProto_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  EnumValueDescriptorProto_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* ServiceDescriptorProto_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  ServiceDescriptorProto_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* MethodDescriptorProto_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  MethodDescriptorProto_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* FileOptions_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  FileOptions_reflection_ = NULL;\nconst ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor_ = NULL;\nconst ::google::protobuf::Descriptor* MessageOptions_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  MessageOptions_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* FieldOptions_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  FieldOptions_reflection_ = NULL;\nconst ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor_ = NULL;\nconst ::google::protobuf::Descriptor* EnumOptions_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  EnumOptions_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* EnumValueOptions_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  EnumValueOptions_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* ServiceOptions_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  ServiceOptions_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* MethodOptions_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  MethodOptions_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* UninterpretedOption_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  UninterpretedOption_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* UninterpretedOption_NamePart_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  UninterpretedOption_NamePart_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* SourceCodeInfo_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  SourceCodeInfo_reflection_ = NULL;\nconst ::google::protobuf::Descriptor* SourceCodeInfo_Location_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  SourceCodeInfo_Location_reflection_ = NULL;\n\n}  // namespace\n\n\nvoid protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto() {\n  protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  const ::google::protobuf::FileDescriptor* file =\n    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(\n      \"google/protobuf/descriptor.proto\");\n  GOOGLE_CHECK(file != NULL);\n  FileDescriptorSet_descriptor_ = file->message_type(0);\n  static const int FileDescriptorSet_offsets_[1] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorSet, file_),\n  };\n  FileDescriptorSet_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      FileDescriptorSet_descriptor_,\n      FileDescriptorSet::default_instance_,\n      FileDescriptorSet_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorSet, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorSet, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(FileDescriptorSet));\n  FileDescriptorProto_descriptor_ = file->message_type(1);\n  static const int FileDescriptorProto_offsets_[9] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, name_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, package_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, dependency_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, message_type_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, enum_type_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, service_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, extension_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, options_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, source_code_info_),\n  };\n  FileDescriptorProto_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      FileDescriptorProto_descriptor_,\n      FileDescriptorProto::default_instance_,\n      FileDescriptorProto_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(FileDescriptorProto));\n  DescriptorProto_descriptor_ = file->message_type(2);\n  static const int DescriptorProto_offsets_[7] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, name_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, field_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, extension_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, nested_type_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, enum_type_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, extension_range_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, options_),\n  };\n  DescriptorProto_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      DescriptorProto_descriptor_,\n      DescriptorProto::default_instance_,\n      DescriptorProto_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(DescriptorProto));\n  DescriptorProto_ExtensionRange_descriptor_ = DescriptorProto_descriptor_->nested_type(0);\n  static const int DescriptorProto_ExtensionRange_offsets_[2] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, start_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, end_),\n  };\n  DescriptorProto_ExtensionRange_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      DescriptorProto_ExtensionRange_descriptor_,\n      DescriptorProto_ExtensionRange::default_instance_,\n      DescriptorProto_ExtensionRange_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(DescriptorProto_ExtensionRange));\n  FieldDescriptorProto_descriptor_ = file->message_type(3);\n  static const int FieldDescriptorProto_offsets_[8] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, name_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, number_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, label_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, type_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, type_name_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, extendee_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, default_value_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, options_),\n  };\n  FieldDescriptorProto_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      FieldDescriptorProto_descriptor_,\n      FieldDescriptorProto::default_instance_,\n      FieldDescriptorProto_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(FieldDescriptorProto));\n  FieldDescriptorProto_Type_descriptor_ = FieldDescriptorProto_descriptor_->enum_type(0);\n  FieldDescriptorProto_Label_descriptor_ = FieldDescriptorProto_descriptor_->enum_type(1);\n  EnumDescriptorProto_descriptor_ = file->message_type(4);\n  static const int EnumDescriptorProto_offsets_[3] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, name_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, value_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, options_),\n  };\n  EnumDescriptorProto_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      EnumDescriptorProto_descriptor_,\n      EnumDescriptorProto::default_instance_,\n      EnumDescriptorProto_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(EnumDescriptorProto));\n  EnumValueDescriptorProto_descriptor_ = file->message_type(5);\n  static const int EnumValueDescriptorProto_offsets_[3] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, name_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, number_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, options_),\n  };\n  EnumValueDescriptorProto_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      EnumValueDescriptorProto_descriptor_,\n      EnumValueDescriptorProto::default_instance_,\n      EnumValueDescriptorProto_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(EnumValueDescriptorProto));\n  ServiceDescriptorProto_descriptor_ = file->message_type(6);\n  static const int ServiceDescriptorProto_offsets_[3] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, name_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, method_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, options_),\n  };\n  ServiceDescriptorProto_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      ServiceDescriptorProto_descriptor_,\n      ServiceDescriptorProto::default_instance_,\n      ServiceDescriptorProto_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(ServiceDescriptorProto));\n  MethodDescriptorProto_descriptor_ = file->message_type(7);\n  static const int MethodDescriptorProto_offsets_[4] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, name_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, input_type_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, output_type_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, options_),\n  };\n  MethodDescriptorProto_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      MethodDescriptorProto_descriptor_,\n      MethodDescriptorProto::default_instance_,\n      MethodDescriptorProto_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(MethodDescriptorProto));\n  FileOptions_descriptor_ = file->message_type(8);\n  static const int FileOptions_offsets_[9] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_package_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_outer_classname_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_multiple_files_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_generate_equals_and_hash_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, optimize_for_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, cc_generic_services_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_generic_services_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, py_generic_services_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, uninterpreted_option_),\n  };\n  FileOptions_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      FileOptions_descriptor_,\n      FileOptions::default_instance_,\n      FileOptions_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, _unknown_fields_),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, _extensions_),\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(FileOptions));\n  FileOptions_OptimizeMode_descriptor_ = FileOptions_descriptor_->enum_type(0);\n  MessageOptions_descriptor_ = file->message_type(9);\n  static const int MessageOptions_offsets_[3] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, message_set_wire_format_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, no_standard_descriptor_accessor_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, uninterpreted_option_),\n  };\n  MessageOptions_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      MessageOptions_descriptor_,\n      MessageOptions::default_instance_,\n      MessageOptions_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, _unknown_fields_),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, _extensions_),\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(MessageOptions));\n  FieldOptions_descriptor_ = file->message_type(10);\n  static const int FieldOptions_offsets_[5] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, ctype_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, packed_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, deprecated_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, experimental_map_key_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, uninterpreted_option_),\n  };\n  FieldOptions_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      FieldOptions_descriptor_,\n      FieldOptions::default_instance_,\n      FieldOptions_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, _unknown_fields_),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, _extensions_),\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(FieldOptions));\n  FieldOptions_CType_descriptor_ = FieldOptions_descriptor_->enum_type(0);\n  EnumOptions_descriptor_ = file->message_type(11);\n  static const int EnumOptions_offsets_[1] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, uninterpreted_option_),\n  };\n  EnumOptions_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      EnumOptions_descriptor_,\n      EnumOptions::default_instance_,\n      EnumOptions_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, _unknown_fields_),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, _extensions_),\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(EnumOptions));\n  EnumValueOptions_descriptor_ = file->message_type(12);\n  static const int EnumValueOptions_offsets_[1] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, uninterpreted_option_),\n  };\n  EnumValueOptions_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      EnumValueOptions_descriptor_,\n      EnumValueOptions::default_instance_,\n      EnumValueOptions_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, _unknown_fields_),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, _extensions_),\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(EnumValueOptions));\n  ServiceOptions_descriptor_ = file->message_type(13);\n  static const int ServiceOptions_offsets_[1] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, uninterpreted_option_),\n  };\n  ServiceOptions_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      ServiceOptions_descriptor_,\n      ServiceOptions::default_instance_,\n      ServiceOptions_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, _unknown_fields_),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, _extensions_),\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(ServiceOptions));\n  MethodOptions_descriptor_ = file->message_type(14);\n  static const int MethodOptions_offsets_[1] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, uninterpreted_option_),\n  };\n  MethodOptions_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      MethodOptions_descriptor_,\n      MethodOptions::default_instance_,\n      MethodOptions_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, _unknown_fields_),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, _extensions_),\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(MethodOptions));\n  UninterpretedOption_descriptor_ = file->message_type(15);\n  static const int UninterpretedOption_offsets_[7] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, name_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, identifier_value_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, positive_int_value_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, negative_int_value_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, double_value_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, string_value_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, aggregate_value_),\n  };\n  UninterpretedOption_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      UninterpretedOption_descriptor_,\n      UninterpretedOption::default_instance_,\n      UninterpretedOption_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(UninterpretedOption));\n  UninterpretedOption_NamePart_descriptor_ = UninterpretedOption_descriptor_->nested_type(0);\n  static const int UninterpretedOption_NamePart_offsets_[2] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, name_part_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, is_extension_),\n  };\n  UninterpretedOption_NamePart_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      UninterpretedOption_NamePart_descriptor_,\n      UninterpretedOption_NamePart::default_instance_,\n      UninterpretedOption_NamePart_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(UninterpretedOption_NamePart));\n  SourceCodeInfo_descriptor_ = file->message_type(16);\n  static const int SourceCodeInfo_offsets_[1] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo, location_),\n  };\n  SourceCodeInfo_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      SourceCodeInfo_descriptor_,\n      SourceCodeInfo::default_instance_,\n      SourceCodeInfo_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(SourceCodeInfo));\n  SourceCodeInfo_Location_descriptor_ = SourceCodeInfo_descriptor_->nested_type(0);\n  static const int SourceCodeInfo_Location_offsets_[2] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, path_),\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, span_),\n  };\n  SourceCodeInfo_Location_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      SourceCodeInfo_Location_descriptor_,\n      SourceCodeInfo_Location::default_instance_,\n      SourceCodeInfo_Location_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(SourceCodeInfo_Location));\n}\n\nnamespace {\n\nGOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);\ninline void protobuf_AssignDescriptorsOnce() {\n  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,\n                 &protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto);\n}\n\nvoid protobuf_RegisterTypes(const ::std::string&) {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    FileDescriptorSet_descriptor_, &FileDescriptorSet::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    FileDescriptorProto_descriptor_, &FileDescriptorProto::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    DescriptorProto_descriptor_, &DescriptorProto::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    DescriptorProto_ExtensionRange_descriptor_, &DescriptorProto_ExtensionRange::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    FieldDescriptorProto_descriptor_, &FieldDescriptorProto::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    EnumDescriptorProto_descriptor_, &EnumDescriptorProto::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    EnumValueDescriptorProto_descriptor_, &EnumValueDescriptorProto::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    ServiceDescriptorProto_descriptor_, &ServiceDescriptorProto::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    MethodDescriptorProto_descriptor_, &MethodDescriptorProto::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    FileOptions_descriptor_, &FileOptions::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    MessageOptions_descriptor_, &MessageOptions::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    FieldOptions_descriptor_, &FieldOptions::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    EnumOptions_descriptor_, &EnumOptions::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    EnumValueOptions_descriptor_, &EnumValueOptions::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    ServiceOptions_descriptor_, &ServiceOptions::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    MethodOptions_descriptor_, &MethodOptions::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    UninterpretedOption_descriptor_, &UninterpretedOption::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    UninterpretedOption_NamePart_descriptor_, &UninterpretedOption_NamePart::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    SourceCodeInfo_descriptor_, &SourceCodeInfo::default_instance());\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    SourceCodeInfo_Location_descriptor_, &SourceCodeInfo_Location::default_instance());\n}\n\n}  // namespace\n\nvoid protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto() {\n  delete FileDescriptorSet::default_instance_;\n  delete FileDescriptorSet_reflection_;\n  delete FileDescriptorProto::default_instance_;\n  delete FileDescriptorProto_reflection_;\n  delete DescriptorProto::default_instance_;\n  delete DescriptorProto_reflection_;\n  delete DescriptorProto_ExtensionRange::default_instance_;\n  delete DescriptorProto_ExtensionRange_reflection_;\n  delete FieldDescriptorProto::default_instance_;\n  delete FieldDescriptorProto_reflection_;\n  delete EnumDescriptorProto::default_instance_;\n  delete EnumDescriptorProto_reflection_;\n  delete EnumValueDescriptorProto::default_instance_;\n  delete EnumValueDescriptorProto_reflection_;\n  delete ServiceDescriptorProto::default_instance_;\n  delete ServiceDescriptorProto_reflection_;\n  delete MethodDescriptorProto::default_instance_;\n  delete MethodDescriptorProto_reflection_;\n  delete FileOptions::default_instance_;\n  delete FileOptions_reflection_;\n  delete MessageOptions::default_instance_;\n  delete MessageOptions_reflection_;\n  delete FieldOptions::default_instance_;\n  delete FieldOptions_reflection_;\n  delete EnumOptions::default_instance_;\n  delete EnumOptions_reflection_;\n  delete EnumValueOptions::default_instance_;\n  delete EnumValueOptions_reflection_;\n  delete ServiceOptions::default_instance_;\n  delete ServiceOptions_reflection_;\n  delete MethodOptions::default_instance_;\n  delete MethodOptions_reflection_;\n  delete UninterpretedOption::default_instance_;\n  delete UninterpretedOption_reflection_;\n  delete UninterpretedOption_NamePart::default_instance_;\n  delete UninterpretedOption_NamePart_reflection_;\n  delete SourceCodeInfo::default_instance_;\n  delete SourceCodeInfo_reflection_;\n  delete SourceCodeInfo_Location::default_instance_;\n  delete SourceCodeInfo_Location_reflection_;\n}\n\nvoid protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto() {\n  static bool already_here = false;\n  if (already_here) return;\n  already_here = true;\n  GOOGLE_PROTOBUF_VERIFY_VERSION;\n\n  ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(\n    \"\\n google/protobuf/descriptor.proto\\022\\017goog\"\n    \"le.protobuf\\\"G\\n\\021FileDescriptorSet\\0222\\n\\004file\"\n    \"\\030\\001 \\003(\\0132$.google.protobuf.FileDescriptorP\"\n    \"roto\\\"\\227\\003\\n\\023FileDescriptorProto\\022\\014\\n\\004name\\030\\001 \\001\"\n    \"(\\t\\022\\017\\n\\007package\\030\\002 \\001(\\t\\022\\022\\n\\ndependency\\030\\003 \\003(\\t\\022\"\n    \"6\\n\\014message_type\\030\\004 \\003(\\0132 .google.protobuf.\"\n    \"DescriptorProto\\0227\\n\\tenum_type\\030\\005 \\003(\\0132$.goo\"\n    \"gle.protobuf.EnumDescriptorProto\\0228\\n\\007serv\"\n    \"ice\\030\\006 \\003(\\0132\\'.google.protobuf.ServiceDescr\"\n    \"iptorProto\\0228\\n\\textension\\030\\007 \\003(\\0132%.google.p\"\n    \"rotobuf.FieldDescriptorProto\\022-\\n\\007options\\030\"\n    \"\\010 \\001(\\0132\\034.google.protobuf.FileOptions\\0229\\n\\020s\"\n    \"ource_code_info\\030\\t \\001(\\0132\\037.google.protobuf.\"\n    \"SourceCodeInfo\\\"\\251\\003\\n\\017DescriptorProto\\022\\014\\n\\004na\"\n    \"me\\030\\001 \\001(\\t\\0224\\n\\005field\\030\\002 \\003(\\0132%.google.protobu\"\n    \"f.FieldDescriptorProto\\0228\\n\\textension\\030\\006 \\003(\"\n    \"\\0132%.google.protobuf.FieldDescriptorProto\"\n    \"\\0225\\n\\013nested_type\\030\\003 \\003(\\0132 .google.protobuf.\"\n    \"DescriptorProto\\0227\\n\\tenum_type\\030\\004 \\003(\\0132$.goo\"\n    \"gle.protobuf.EnumDescriptorProto\\022H\\n\\017exte\"\n    \"nsion_range\\030\\005 \\003(\\0132/.google.protobuf.Desc\"\n    \"riptorProto.ExtensionRange\\0220\\n\\007options\\030\\007 \"\n    \"\\001(\\0132\\037.google.protobuf.MessageOptions\\032,\\n\\016\"\n    \"ExtensionRange\\022\\r\\n\\005start\\030\\001 \\001(\\005\\022\\013\\n\\003end\\030\\002 \\001\"\n    \"(\\005\\\"\\224\\005\\n\\024FieldDescriptorProto\\022\\014\\n\\004name\\030\\001 \\001(\"\n    \"\\t\\022\\016\\n\\006number\\030\\003 \\001(\\005\\022:\\n\\005label\\030\\004 \\001(\\0162+.googl\"\n    \"e.protobuf.FieldDescriptorProto.Label\\0228\\n\"\n    \"\\004type\\030\\005 \\001(\\0162*.google.protobuf.FieldDescr\"\n    \"iptorProto.Type\\022\\021\\n\\ttype_name\\030\\006 \\001(\\t\\022\\020\\n\\010ex\"\n    \"tendee\\030\\002 \\001(\\t\\022\\025\\n\\rdefault_value\\030\\007 \\001(\\t\\022.\\n\\007o\"\n    \"ptions\\030\\010 \\001(\\0132\\035.google.protobuf.FieldOpti\"\n    \"ons\\\"\\266\\002\\n\\004Type\\022\\017\\n\\013TYPE_DOUBLE\\020\\001\\022\\016\\n\\nTYPE_FL\"\n    \"OAT\\020\\002\\022\\016\\n\\nTYPE_INT64\\020\\003\\022\\017\\n\\013TYPE_UINT64\\020\\004\\022\\016\"\n    \"\\n\\nTYPE_INT32\\020\\005\\022\\020\\n\\014TYPE_FIXED64\\020\\006\\022\\020\\n\\014TYPE\"\n    \"_FIXED32\\020\\007\\022\\r\\n\\tTYPE_BOOL\\020\\010\\022\\017\\n\\013TYPE_STRING\"\n    \"\\020\\t\\022\\016\\n\\nTYPE_GROUP\\020\\n\\022\\020\\n\\014TYPE_MESSAGE\\020\\013\\022\\016\\n\\n\"\n    \"TYPE_BYTES\\020\\014\\022\\017\\n\\013TYPE_UINT32\\020\\r\\022\\r\\n\\tTYPE_EN\"\n    \"UM\\020\\016\\022\\021\\n\\rTYPE_SFIXED32\\020\\017\\022\\021\\n\\rTYPE_SFIXED64\"\n    \"\\020\\020\\022\\017\\n\\013TYPE_SINT32\\020\\021\\022\\017\\n\\013TYPE_SINT64\\020\\022\\\"C\\n\\005\"\n    \"Label\\022\\022\\n\\016LABEL_OPTIONAL\\020\\001\\022\\022\\n\\016LABEL_REQUI\"\n    \"RED\\020\\002\\022\\022\\n\\016LABEL_REPEATED\\020\\003\\\"\\214\\001\\n\\023EnumDescri\"\n    \"ptorProto\\022\\014\\n\\004name\\030\\001 \\001(\\t\\0228\\n\\005value\\030\\002 \\003(\\0132)\"\n    \".google.protobuf.EnumValueDescriptorProt\"\n    \"o\\022-\\n\\007options\\030\\003 \\001(\\0132\\034.google.protobuf.Enu\"\n    \"mOptions\\\"l\\n\\030EnumValueDescriptorProto\\022\\014\\n\\004\"\n    \"name\\030\\001 \\001(\\t\\022\\016\\n\\006number\\030\\002 \\001(\\005\\0222\\n\\007options\\030\\003 \"\n    \"\\001(\\0132!.google.protobuf.EnumValueOptions\\\"\\220\"\n    \"\\001\\n\\026ServiceDescriptorProto\\022\\014\\n\\004name\\030\\001 \\001(\\t\\022\"\n    \"6\\n\\006method\\030\\002 \\003(\\0132&.google.protobuf.Method\"\n    \"DescriptorProto\\0220\\n\\007options\\030\\003 \\001(\\0132\\037.googl\"\n    \"e.protobuf.ServiceOptions\\\"\\177\\n\\025MethodDescr\"\n    \"iptorProto\\022\\014\\n\\004name\\030\\001 \\001(\\t\\022\\022\\n\\ninput_type\\030\\002\"\n    \" \\001(\\t\\022\\023\\n\\013output_type\\030\\003 \\001(\\t\\022/\\n\\007options\\030\\004 \\001\"\n    \"(\\0132\\036.google.protobuf.MethodOptions\\\"\\325\\003\\n\\013F\"\n    \"ileOptions\\022\\024\\n\\014java_package\\030\\001 \\001(\\t\\022\\034\\n\\024java\"\n    \"_outer_classname\\030\\010 \\001(\\t\\022\\\"\\n\\023java_multiple_\"\n    \"files\\030\\n \\001(\\010:\\005false\\022,\\n\\035java_generate_equa\"\n    \"ls_and_hash\\030\\024 \\001(\\010:\\005false\\022F\\n\\014optimize_for\"\n    \"\\030\\t \\001(\\0162).google.protobuf.FileOptions.Opt\"\n    \"imizeMode:\\005SPEED\\022\\\"\\n\\023cc_generic_services\\030\"\n    \"\\020 \\001(\\010:\\005false\\022$\\n\\025java_generic_services\\030\\021 \"\n    \"\\001(\\010:\\005false\\022\\\"\\n\\023py_generic_services\\030\\022 \\001(\\010:\"\n    \"\\005false\\022C\\n\\024uninterpreted_option\\030\\347\\007 \\003(\\0132$.\"\n    \"google.protobuf.UninterpretedOption\\\":\\n\\014O\"\n    \"ptimizeMode\\022\\t\\n\\005SPEED\\020\\001\\022\\r\\n\\tCODE_SIZE\\020\\002\\022\\020\\n\"\n    \"\\014LITE_RUNTIME\\020\\003*\\t\\010\\350\\007\\020\\200\\200\\200\\200\\002\\\"\\270\\001\\n\\016MessageOp\"\n    \"tions\\022&\\n\\027message_set_wire_format\\030\\001 \\001(\\010:\\005\"\n    \"false\\022.\\n\\037no_standard_descriptor_accessor\"\n    \"\\030\\002 \\001(\\010:\\005false\\022C\\n\\024uninterpreted_option\\030\\347\\007\"\n    \" \\003(\\0132$.google.protobuf.UninterpretedOpti\"\n    \"on*\\t\\010\\350\\007\\020\\200\\200\\200\\200\\002\\\"\\224\\002\\n\\014FieldOptions\\022:\\n\\005ctype\\030\"\n    \"\\001 \\001(\\0162#.google.protobuf.FieldOptions.CTy\"\n    \"pe:\\006STRING\\022\\016\\n\\006packed\\030\\002 \\001(\\010\\022\\031\\n\\ndeprecated\"\n    \"\\030\\003 \\001(\\010:\\005false\\022\\034\\n\\024experimental_map_key\\030\\t \"\n    \"\\001(\\t\\022C\\n\\024uninterpreted_option\\030\\347\\007 \\003(\\0132$.goo\"\n    \"gle.protobuf.UninterpretedOption\\\"/\\n\\005CTyp\"\n    \"e\\022\\n\\n\\006STRING\\020\\000\\022\\010\\n\\004CORD\\020\\001\\022\\020\\n\\014STRING_PIECE\\020\"\n    \"\\002*\\t\\010\\350\\007\\020\\200\\200\\200\\200\\002\\\"]\\n\\013EnumOptions\\022C\\n\\024uninterpr\"\n    \"eted_option\\030\\347\\007 \\003(\\0132$.google.protobuf.Uni\"\n    \"nterpretedOption*\\t\\010\\350\\007\\020\\200\\200\\200\\200\\002\\\"b\\n\\020EnumValue\"\n    \"Options\\022C\\n\\024uninterpreted_option\\030\\347\\007 \\003(\\0132$\"\n    \".google.protobuf.UninterpretedOption*\\t\\010\\350\"\n    \"\\007\\020\\200\\200\\200\\200\\002\\\"`\\n\\016ServiceOptions\\022C\\n\\024uninterpret\"\n    \"ed_option\\030\\347\\007 \\003(\\0132$.google.protobuf.Unint\"\n    \"erpretedOption*\\t\\010\\350\\007\\020\\200\\200\\200\\200\\002\\\"_\\n\\rMethodOptio\"\n    \"ns\\022C\\n\\024uninterpreted_option\\030\\347\\007 \\003(\\0132$.goog\"\n    \"le.protobuf.UninterpretedOption*\\t\\010\\350\\007\\020\\200\\200\\200\"\n    \"\\200\\002\\\"\\236\\002\\n\\023UninterpretedOption\\022;\\n\\004name\\030\\002 \\003(\\013\"\n    \"2-.google.protobuf.UninterpretedOption.N\"\n    \"amePart\\022\\030\\n\\020identifier_value\\030\\003 \\001(\\t\\022\\032\\n\\022pos\"\n    \"itive_int_value\\030\\004 \\001(\\004\\022\\032\\n\\022negative_int_va\"\n    \"lue\\030\\005 \\001(\\003\\022\\024\\n\\014double_value\\030\\006 \\001(\\001\\022\\024\\n\\014strin\"\n    \"g_value\\030\\007 \\001(\\014\\022\\027\\n\\017aggregate_value\\030\\010 \\001(\\t\\0323\"\n    \"\\n\\010NamePart\\022\\021\\n\\tname_part\\030\\001 \\002(\\t\\022\\024\\n\\014is_exte\"\n    \"nsion\\030\\002 \\002(\\010\\\"|\\n\\016SourceCodeInfo\\022:\\n\\010locatio\"\n    \"n\\030\\001 \\003(\\0132(.google.protobuf.SourceCodeInfo\"\n    \".Location\\032.\\n\\010Location\\022\\020\\n\\004path\\030\\001 \\003(\\005B\\002\\020\\001\\022\"\n    \"\\020\\n\\004span\\030\\002 \\003(\\005B\\002\\020\\001B)\\n\\023com.google.protobuf\"\n    \"B\\020DescriptorProtosH\\001\", 3940);\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(\n    \"google/protobuf/descriptor.proto\", &protobuf_RegisterTypes);\n  FileDescriptorSet::default_instance_ = new FileDescriptorSet();\n  FileDescriptorProto::default_instance_ = new FileDescriptorProto();\n  DescriptorProto::default_instance_ = new DescriptorProto();\n  DescriptorProto_ExtensionRange::default_instance_ = new DescriptorProto_ExtensionRange();\n  FieldDescriptorProto::default_instance_ = new FieldDescriptorProto();\n  EnumDescriptorProto::default_instance_ = new EnumDescriptorProto();\n  EnumValueDescriptorProto::default_instance_ = new EnumValueDescriptorProto();\n  ServiceDescriptorProto::default_instance_ = new ServiceDescriptorProto();\n  MethodDescriptorProto::default_instance_ = new MethodDescriptorProto();\n  FileOptions::default_instance_ = new FileOptions();\n  MessageOptions::default_instance_ = new MessageOptions();\n  FieldOptions::default_instance_ = new FieldOptions();\n  EnumOptions::default_instance_ = new EnumOptions();\n  EnumValueOptions::default_instance_ = new EnumValueOptions();\n  ServiceOptions::default_instance_ = new ServiceOptions();\n  MethodOptions::default_instance_ = new MethodOptions();\n  UninterpretedOption::default_instance_ = new UninterpretedOption();\n  UninterpretedOption_NamePart::default_instance_ = new UninterpretedOption_NamePart();\n  SourceCodeInfo::default_instance_ = new SourceCodeInfo();\n  SourceCodeInfo_Location::default_instance_ = new SourceCodeInfo_Location();\n  FileDescriptorSet::default_instance_->InitAsDefaultInstance();\n  FileDescriptorProto::default_instance_->InitAsDefaultInstance();\n  DescriptorProto::default_instance_->InitAsDefaultInstance();\n  DescriptorProto_ExtensionRange::default_instance_->InitAsDefaultInstance();\n  FieldDescriptorProto::default_instance_->InitAsDefaultInstance();\n  EnumDescriptorProto::default_instance_->InitAsDefaultInstance();\n  EnumValueDescriptorProto::default_instance_->InitAsDefaultInstance();\n  ServiceDescriptorProto::default_instance_->InitAsDefaultInstance();\n  MethodDescriptorProto::default_instance_->InitAsDefaultInstance();\n  FileOptions::default_instance_->InitAsDefaultInstance();\n  MessageOptions::default_instance_->InitAsDefaultInstance();\n  FieldOptions::default_instance_->InitAsDefaultInstance();\n  EnumOptions::default_instance_->InitAsDefaultInstance();\n  EnumValueOptions::default_instance_->InitAsDefaultInstance();\n  ServiceOptions::default_instance_->InitAsDefaultInstance();\n  MethodOptions::default_instance_->InitAsDefaultInstance();\n  UninterpretedOption::default_instance_->InitAsDefaultInstance();\n  UninterpretedOption_NamePart::default_instance_->InitAsDefaultInstance();\n  SourceCodeInfo::default_instance_->InitAsDefaultInstance();\n  SourceCodeInfo_Location::default_instance_->InitAsDefaultInstance();\n  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto);\n}\n\n// Force AddDescriptors() to be called at static initialization time.\nstruct StaticDescriptorInitializer_google_2fprotobuf_2fdescriptor_2eproto {\n  StaticDescriptorInitializer_google_2fprotobuf_2fdescriptor_2eproto() {\n    protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  }\n} static_descriptor_initializer_google_2fprotobuf_2fdescriptor_2eproto_;\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int FileDescriptorSet::kFileFieldNumber;\n#endif  // !_MSC_VER\n\nFileDescriptorSet::FileDescriptorSet()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid FileDescriptorSet::InitAsDefaultInstance() {\n}\n\nFileDescriptorSet::FileDescriptorSet(const FileDescriptorSet& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid FileDescriptorSet::SharedCtor() {\n  _cached_size_ = 0;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nFileDescriptorSet::~FileDescriptorSet() {\n  SharedDtor();\n}\n\nvoid FileDescriptorSet::SharedDtor() {\n  if (this != default_instance_) {\n  }\n}\n\nvoid FileDescriptorSet::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* FileDescriptorSet::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return FileDescriptorSet_descriptor_;\n}\n\nconst FileDescriptorSet& FileDescriptorSet::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nFileDescriptorSet* FileDescriptorSet::default_instance_ = NULL;\n\nFileDescriptorSet* FileDescriptorSet::New() const {\n  return new FileDescriptorSet;\n}\n\nvoid FileDescriptorSet::Clear() {\n  file_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool FileDescriptorSet::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // repeated .google.protobuf.FileDescriptorProto file = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_file:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_file()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(10)) goto parse_file;\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid FileDescriptorSet::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // repeated .google.protobuf.FileDescriptorProto file = 1;\n  for (int i = 0; i < this->file_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      1, this->file(i), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* FileDescriptorSet::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // repeated .google.protobuf.FileDescriptorProto file = 1;\n  for (int i = 0; i < this->file_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        1, this->file(i), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint FileDescriptorSet::ByteSize() const {\n  int total_size = 0;\n  \n  // repeated .google.protobuf.FileDescriptorProto file = 1;\n  total_size += 1 * this->file_size();\n  for (int i = 0; i < this->file_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->file(i));\n  }\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid FileDescriptorSet::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const FileDescriptorSet* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const FileDescriptorSet*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid FileDescriptorSet::MergeFrom(const FileDescriptorSet& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  file_.MergeFrom(from.file_);\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid FileDescriptorSet::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid FileDescriptorSet::CopyFrom(const FileDescriptorSet& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool FileDescriptorSet::IsInitialized() const {\n  \n  for (int i = 0; i < file_size(); i++) {\n    if (!this->file(i).IsInitialized()) return false;\n  }\n  return true;\n}\n\nvoid FileDescriptorSet::Swap(FileDescriptorSet* other) {\n  if (other != this) {\n    file_.Swap(&other->file_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata FileDescriptorSet::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = FileDescriptorSet_descriptor_;\n  metadata.reflection = FileDescriptorSet_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int FileDescriptorProto::kNameFieldNumber;\nconst int FileDescriptorProto::kPackageFieldNumber;\nconst int FileDescriptorProto::kDependencyFieldNumber;\nconst int FileDescriptorProto::kMessageTypeFieldNumber;\nconst int FileDescriptorProto::kEnumTypeFieldNumber;\nconst int FileDescriptorProto::kServiceFieldNumber;\nconst int FileDescriptorProto::kExtensionFieldNumber;\nconst int FileDescriptorProto::kOptionsFieldNumber;\nconst int FileDescriptorProto::kSourceCodeInfoFieldNumber;\n#endif  // !_MSC_VER\n\nFileDescriptorProto::FileDescriptorProto()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid FileDescriptorProto::InitAsDefaultInstance() {\n  options_ = const_cast< ::google::protobuf::FileOptions*>(&::google::protobuf::FileOptions::default_instance());\n  source_code_info_ = const_cast< ::google::protobuf::SourceCodeInfo*>(&::google::protobuf::SourceCodeInfo::default_instance());\n}\n\nFileDescriptorProto::FileDescriptorProto(const FileDescriptorProto& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid FileDescriptorProto::SharedCtor() {\n  _cached_size_ = 0;\n  name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  package_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  options_ = NULL;\n  source_code_info_ = NULL;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nFileDescriptorProto::~FileDescriptorProto() {\n  SharedDtor();\n}\n\nvoid FileDescriptorProto::SharedDtor() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    delete name_;\n  }\n  if (package_ != &::google::protobuf::internal::kEmptyString) {\n    delete package_;\n  }\n  if (this != default_instance_) {\n    delete options_;\n    delete source_code_info_;\n  }\n}\n\nvoid FileDescriptorProto::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* FileDescriptorProto::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return FileDescriptorProto_descriptor_;\n}\n\nconst FileDescriptorProto& FileDescriptorProto::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nFileDescriptorProto* FileDescriptorProto::default_instance_ = NULL;\n\nFileDescriptorProto* FileDescriptorProto::New() const {\n  return new FileDescriptorProto;\n}\n\nvoid FileDescriptorProto::Clear() {\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (has_name()) {\n      if (name_ != &::google::protobuf::internal::kEmptyString) {\n        name_->clear();\n      }\n    }\n    if (has_package()) {\n      if (package_ != &::google::protobuf::internal::kEmptyString) {\n        package_->clear();\n      }\n    }\n    if (has_options()) {\n      if (options_ != NULL) options_->::google::protobuf::FileOptions::Clear();\n    }\n  }\n  if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) {\n    if (has_source_code_info()) {\n      if (source_code_info_ != NULL) source_code_info_->::google::protobuf::SourceCodeInfo::Clear();\n    }\n  }\n  dependency_.Clear();\n  message_type_.Clear();\n  enum_type_.Clear();\n  service_.Clear();\n  extension_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool FileDescriptorProto::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // optional string name = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_name()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->name().data(), this->name().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(18)) goto parse_package;\n        break;\n      }\n      \n      // optional string package = 2;\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_package:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_package()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->package().data(), this->package().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(26)) goto parse_dependency;\n        break;\n      }\n      \n      // repeated string dependency = 3;\n      case 3: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_dependency:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->add_dependency()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->dependency(0).data(), this->dependency(0).length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(26)) goto parse_dependency;\n        if (input->ExpectTag(34)) goto parse_message_type;\n        break;\n      }\n      \n      // repeated .google.protobuf.DescriptorProto message_type = 4;\n      case 4: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_message_type:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_message_type()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(34)) goto parse_message_type;\n        if (input->ExpectTag(42)) goto parse_enum_type;\n        break;\n      }\n      \n      // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;\n      case 5: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_enum_type:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_enum_type()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(42)) goto parse_enum_type;\n        if (input->ExpectTag(50)) goto parse_service;\n        break;\n      }\n      \n      // repeated .google.protobuf.ServiceDescriptorProto service = 6;\n      case 6: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_service:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_service()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(50)) goto parse_service;\n        if (input->ExpectTag(58)) goto parse_extension;\n        break;\n      }\n      \n      // repeated .google.protobuf.FieldDescriptorProto extension = 7;\n      case 7: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_extension:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_extension()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(58)) goto parse_extension;\n        if (input->ExpectTag(66)) goto parse_options;\n        break;\n      }\n      \n      // optional .google.protobuf.FileOptions options = 8;\n      case 8: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_options:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n               input, mutable_options()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(74)) goto parse_source_code_info;\n        break;\n      }\n      \n      // optional .google.protobuf.SourceCodeInfo source_code_info = 9;\n      case 9: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_source_code_info:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n               input, mutable_source_code_info()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid FileDescriptorProto::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->name(), output);\n  }\n  \n  // optional string package = 2;\n  if (has_package()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->package().data(), this->package().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      2, this->package(), output);\n  }\n  \n  // repeated string dependency = 3;\n  for (int i = 0; i < this->dependency_size(); i++) {\n  ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n    this->dependency(i).data(), this->dependency(i).length(),\n    ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      3, this->dependency(i), output);\n  }\n  \n  // repeated .google.protobuf.DescriptorProto message_type = 4;\n  for (int i = 0; i < this->message_type_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      4, this->message_type(i), output);\n  }\n  \n  // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;\n  for (int i = 0; i < this->enum_type_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      5, this->enum_type(i), output);\n  }\n  \n  // repeated .google.protobuf.ServiceDescriptorProto service = 6;\n  for (int i = 0; i < this->service_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      6, this->service(i), output);\n  }\n  \n  // repeated .google.protobuf.FieldDescriptorProto extension = 7;\n  for (int i = 0; i < this->extension_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      7, this->extension(i), output);\n  }\n  \n  // optional .google.protobuf.FileOptions options = 8;\n  if (has_options()) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      8, this->options(), output);\n  }\n  \n  // optional .google.protobuf.SourceCodeInfo source_code_info = 9;\n  if (has_source_code_info()) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      9, this->source_code_info(), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* FileDescriptorProto::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        1, this->name(), target);\n  }\n  \n  // optional string package = 2;\n  if (has_package()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->package().data(), this->package().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        2, this->package(), target);\n  }\n  \n  // repeated string dependency = 3;\n  for (int i = 0; i < this->dependency_size(); i++) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->dependency(i).data(), this->dependency(i).length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteStringToArray(3, this->dependency(i), target);\n  }\n  \n  // repeated .google.protobuf.DescriptorProto message_type = 4;\n  for (int i = 0; i < this->message_type_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        4, this->message_type(i), target);\n  }\n  \n  // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;\n  for (int i = 0; i < this->enum_type_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        5, this->enum_type(i), target);\n  }\n  \n  // repeated .google.protobuf.ServiceDescriptorProto service = 6;\n  for (int i = 0; i < this->service_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        6, this->service(i), target);\n  }\n  \n  // repeated .google.protobuf.FieldDescriptorProto extension = 7;\n  for (int i = 0; i < this->extension_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        7, this->extension(i), target);\n  }\n  \n  // optional .google.protobuf.FileOptions options = 8;\n  if (has_options()) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        8, this->options(), target);\n  }\n  \n  // optional .google.protobuf.SourceCodeInfo source_code_info = 9;\n  if (has_source_code_info()) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        9, this->source_code_info(), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint FileDescriptorProto::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // optional string name = 1;\n    if (has_name()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->name());\n    }\n    \n    // optional string package = 2;\n    if (has_package()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->package());\n    }\n    \n    // optional .google.protobuf.FileOptions options = 8;\n    if (has_options()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n          this->options());\n    }\n    \n  }\n  if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) {\n    // optional .google.protobuf.SourceCodeInfo source_code_info = 9;\n    if (has_source_code_info()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n          this->source_code_info());\n    }\n    \n  }\n  // repeated string dependency = 3;\n  total_size += 1 * this->dependency_size();\n  for (int i = 0; i < this->dependency_size(); i++) {\n    total_size += ::google::protobuf::internal::WireFormatLite::StringSize(\n      this->dependency(i));\n  }\n  \n  // repeated .google.protobuf.DescriptorProto message_type = 4;\n  total_size += 1 * this->message_type_size();\n  for (int i = 0; i < this->message_type_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->message_type(i));\n  }\n  \n  // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;\n  total_size += 1 * this->enum_type_size();\n  for (int i = 0; i < this->enum_type_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->enum_type(i));\n  }\n  \n  // repeated .google.protobuf.ServiceDescriptorProto service = 6;\n  total_size += 1 * this->service_size();\n  for (int i = 0; i < this->service_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->service(i));\n  }\n  \n  // repeated .google.protobuf.FieldDescriptorProto extension = 7;\n  total_size += 1 * this->extension_size();\n  for (int i = 0; i < this->extension_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->extension(i));\n  }\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid FileDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const FileDescriptorProto* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const FileDescriptorProto*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid FileDescriptorProto::MergeFrom(const FileDescriptorProto& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  dependency_.MergeFrom(from.dependency_);\n  message_type_.MergeFrom(from.message_type_);\n  enum_type_.MergeFrom(from.enum_type_);\n  service_.MergeFrom(from.service_);\n  extension_.MergeFrom(from.extension_);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_name()) {\n      set_name(from.name());\n    }\n    if (from.has_package()) {\n      set_package(from.package());\n    }\n    if (from.has_options()) {\n      mutable_options()->::google::protobuf::FileOptions::MergeFrom(from.options());\n    }\n  }\n  if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) {\n    if (from.has_source_code_info()) {\n      mutable_source_code_info()->::google::protobuf::SourceCodeInfo::MergeFrom(from.source_code_info());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid FileDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid FileDescriptorProto::CopyFrom(const FileDescriptorProto& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool FileDescriptorProto::IsInitialized() const {\n  \n  for (int i = 0; i < message_type_size(); i++) {\n    if (!this->message_type(i).IsInitialized()) return false;\n  }\n  for (int i = 0; i < enum_type_size(); i++) {\n    if (!this->enum_type(i).IsInitialized()) return false;\n  }\n  for (int i = 0; i < service_size(); i++) {\n    if (!this->service(i).IsInitialized()) return false;\n  }\n  for (int i = 0; i < extension_size(); i++) {\n    if (!this->extension(i).IsInitialized()) return false;\n  }\n  if (has_options()) {\n    if (!this->options().IsInitialized()) return false;\n  }\n  return true;\n}\n\nvoid FileDescriptorProto::Swap(FileDescriptorProto* other) {\n  if (other != this) {\n    std::swap(name_, other->name_);\n    std::swap(package_, other->package_);\n    dependency_.Swap(&other->dependency_);\n    message_type_.Swap(&other->message_type_);\n    enum_type_.Swap(&other->enum_type_);\n    service_.Swap(&other->service_);\n    extension_.Swap(&other->extension_);\n    std::swap(options_, other->options_);\n    std::swap(source_code_info_, other->source_code_info_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata FileDescriptorProto::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = FileDescriptorProto_descriptor_;\n  metadata.reflection = FileDescriptorProto_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int DescriptorProto_ExtensionRange::kStartFieldNumber;\nconst int DescriptorProto_ExtensionRange::kEndFieldNumber;\n#endif  // !_MSC_VER\n\nDescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid DescriptorProto_ExtensionRange::InitAsDefaultInstance() {\n}\n\nDescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange(const DescriptorProto_ExtensionRange& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid DescriptorProto_ExtensionRange::SharedCtor() {\n  _cached_size_ = 0;\n  start_ = 0;\n  end_ = 0;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nDescriptorProto_ExtensionRange::~DescriptorProto_ExtensionRange() {\n  SharedDtor();\n}\n\nvoid DescriptorProto_ExtensionRange::SharedDtor() {\n  if (this != default_instance_) {\n  }\n}\n\nvoid DescriptorProto_ExtensionRange::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* DescriptorProto_ExtensionRange::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return DescriptorProto_ExtensionRange_descriptor_;\n}\n\nconst DescriptorProto_ExtensionRange& DescriptorProto_ExtensionRange::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nDescriptorProto_ExtensionRange* DescriptorProto_ExtensionRange::default_instance_ = NULL;\n\nDescriptorProto_ExtensionRange* DescriptorProto_ExtensionRange::New() const {\n  return new DescriptorProto_ExtensionRange;\n}\n\nvoid DescriptorProto_ExtensionRange::Clear() {\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    start_ = 0;\n    end_ = 0;\n  }\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool DescriptorProto_ExtensionRange::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // optional int32 start = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(\n                 input, &start_)));\n          set_has_start();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(16)) goto parse_end;\n        break;\n      }\n      \n      // optional int32 end = 2;\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_end:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(\n                 input, &end_)));\n          set_has_end();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid DescriptorProto_ExtensionRange::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // optional int32 start = 1;\n  if (has_start()) {\n    ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->start(), output);\n  }\n  \n  // optional int32 end = 2;\n  if (has_end()) {\n    ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->end(), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* DescriptorProto_ExtensionRange::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // optional int32 start = 1;\n  if (has_start()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->start(), target);\n  }\n  \n  // optional int32 end = 2;\n  if (has_end()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->end(), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint DescriptorProto_ExtensionRange::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // optional int32 start = 1;\n    if (has_start()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::Int32Size(\n          this->start());\n    }\n    \n    // optional int32 end = 2;\n    if (has_end()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::Int32Size(\n          this->end());\n    }\n    \n  }\n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid DescriptorProto_ExtensionRange::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const DescriptorProto_ExtensionRange* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const DescriptorProto_ExtensionRange*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid DescriptorProto_ExtensionRange::MergeFrom(const DescriptorProto_ExtensionRange& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_start()) {\n      set_start(from.start());\n    }\n    if (from.has_end()) {\n      set_end(from.end());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid DescriptorProto_ExtensionRange::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid DescriptorProto_ExtensionRange::CopyFrom(const DescriptorProto_ExtensionRange& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool DescriptorProto_ExtensionRange::IsInitialized() const {\n  \n  return true;\n}\n\nvoid DescriptorProto_ExtensionRange::Swap(DescriptorProto_ExtensionRange* other) {\n  if (other != this) {\n    std::swap(start_, other->start_);\n    std::swap(end_, other->end_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata DescriptorProto_ExtensionRange::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = DescriptorProto_ExtensionRange_descriptor_;\n  metadata.reflection = DescriptorProto_ExtensionRange_reflection_;\n  return metadata;\n}\n\n\n// -------------------------------------------------------------------\n\n#ifndef _MSC_VER\nconst int DescriptorProto::kNameFieldNumber;\nconst int DescriptorProto::kFieldFieldNumber;\nconst int DescriptorProto::kExtensionFieldNumber;\nconst int DescriptorProto::kNestedTypeFieldNumber;\nconst int DescriptorProto::kEnumTypeFieldNumber;\nconst int DescriptorProto::kExtensionRangeFieldNumber;\nconst int DescriptorProto::kOptionsFieldNumber;\n#endif  // !_MSC_VER\n\nDescriptorProto::DescriptorProto()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid DescriptorProto::InitAsDefaultInstance() {\n  options_ = const_cast< ::google::protobuf::MessageOptions*>(&::google::protobuf::MessageOptions::default_instance());\n}\n\nDescriptorProto::DescriptorProto(const DescriptorProto& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid DescriptorProto::SharedCtor() {\n  _cached_size_ = 0;\n  name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  options_ = NULL;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nDescriptorProto::~DescriptorProto() {\n  SharedDtor();\n}\n\nvoid DescriptorProto::SharedDtor() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    delete name_;\n  }\n  if (this != default_instance_) {\n    delete options_;\n  }\n}\n\nvoid DescriptorProto::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* DescriptorProto::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return DescriptorProto_descriptor_;\n}\n\nconst DescriptorProto& DescriptorProto::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nDescriptorProto* DescriptorProto::default_instance_ = NULL;\n\nDescriptorProto* DescriptorProto::New() const {\n  return new DescriptorProto;\n}\n\nvoid DescriptorProto::Clear() {\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (has_name()) {\n      if (name_ != &::google::protobuf::internal::kEmptyString) {\n        name_->clear();\n      }\n    }\n    if (has_options()) {\n      if (options_ != NULL) options_->::google::protobuf::MessageOptions::Clear();\n    }\n  }\n  field_.Clear();\n  extension_.Clear();\n  nested_type_.Clear();\n  enum_type_.Clear();\n  extension_range_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool DescriptorProto::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // optional string name = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_name()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->name().data(), this->name().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(18)) goto parse_field;\n        break;\n      }\n      \n      // repeated .google.protobuf.FieldDescriptorProto field = 2;\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_field:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_field()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(18)) goto parse_field;\n        if (input->ExpectTag(26)) goto parse_nested_type;\n        break;\n      }\n      \n      // repeated .google.protobuf.DescriptorProto nested_type = 3;\n      case 3: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_nested_type:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_nested_type()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(26)) goto parse_nested_type;\n        if (input->ExpectTag(34)) goto parse_enum_type;\n        break;\n      }\n      \n      // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;\n      case 4: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_enum_type:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_enum_type()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(34)) goto parse_enum_type;\n        if (input->ExpectTag(42)) goto parse_extension_range;\n        break;\n      }\n      \n      // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;\n      case 5: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_extension_range:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_extension_range()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(42)) goto parse_extension_range;\n        if (input->ExpectTag(50)) goto parse_extension;\n        break;\n      }\n      \n      // repeated .google.protobuf.FieldDescriptorProto extension = 6;\n      case 6: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_extension:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_extension()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(50)) goto parse_extension;\n        if (input->ExpectTag(58)) goto parse_options;\n        break;\n      }\n      \n      // optional .google.protobuf.MessageOptions options = 7;\n      case 7: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_options:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n               input, mutable_options()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid DescriptorProto::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->name(), output);\n  }\n  \n  // repeated .google.protobuf.FieldDescriptorProto field = 2;\n  for (int i = 0; i < this->field_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      2, this->field(i), output);\n  }\n  \n  // repeated .google.protobuf.DescriptorProto nested_type = 3;\n  for (int i = 0; i < this->nested_type_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      3, this->nested_type(i), output);\n  }\n  \n  // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;\n  for (int i = 0; i < this->enum_type_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      4, this->enum_type(i), output);\n  }\n  \n  // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;\n  for (int i = 0; i < this->extension_range_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      5, this->extension_range(i), output);\n  }\n  \n  // repeated .google.protobuf.FieldDescriptorProto extension = 6;\n  for (int i = 0; i < this->extension_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      6, this->extension(i), output);\n  }\n  \n  // optional .google.protobuf.MessageOptions options = 7;\n  if (has_options()) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      7, this->options(), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* DescriptorProto::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        1, this->name(), target);\n  }\n  \n  // repeated .google.protobuf.FieldDescriptorProto field = 2;\n  for (int i = 0; i < this->field_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        2, this->field(i), target);\n  }\n  \n  // repeated .google.protobuf.DescriptorProto nested_type = 3;\n  for (int i = 0; i < this->nested_type_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        3, this->nested_type(i), target);\n  }\n  \n  // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;\n  for (int i = 0; i < this->enum_type_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        4, this->enum_type(i), target);\n  }\n  \n  // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;\n  for (int i = 0; i < this->extension_range_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        5, this->extension_range(i), target);\n  }\n  \n  // repeated .google.protobuf.FieldDescriptorProto extension = 6;\n  for (int i = 0; i < this->extension_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        6, this->extension(i), target);\n  }\n  \n  // optional .google.protobuf.MessageOptions options = 7;\n  if (has_options()) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        7, this->options(), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint DescriptorProto::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // optional string name = 1;\n    if (has_name()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->name());\n    }\n    \n    // optional .google.protobuf.MessageOptions options = 7;\n    if (has_options()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n          this->options());\n    }\n    \n  }\n  // repeated .google.protobuf.FieldDescriptorProto field = 2;\n  total_size += 1 * this->field_size();\n  for (int i = 0; i < this->field_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->field(i));\n  }\n  \n  // repeated .google.protobuf.FieldDescriptorProto extension = 6;\n  total_size += 1 * this->extension_size();\n  for (int i = 0; i < this->extension_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->extension(i));\n  }\n  \n  // repeated .google.protobuf.DescriptorProto nested_type = 3;\n  total_size += 1 * this->nested_type_size();\n  for (int i = 0; i < this->nested_type_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->nested_type(i));\n  }\n  \n  // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;\n  total_size += 1 * this->enum_type_size();\n  for (int i = 0; i < this->enum_type_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->enum_type(i));\n  }\n  \n  // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;\n  total_size += 1 * this->extension_range_size();\n  for (int i = 0; i < this->extension_range_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->extension_range(i));\n  }\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid DescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const DescriptorProto* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const DescriptorProto*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid DescriptorProto::MergeFrom(const DescriptorProto& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  field_.MergeFrom(from.field_);\n  extension_.MergeFrom(from.extension_);\n  nested_type_.MergeFrom(from.nested_type_);\n  enum_type_.MergeFrom(from.enum_type_);\n  extension_range_.MergeFrom(from.extension_range_);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_name()) {\n      set_name(from.name());\n    }\n    if (from.has_options()) {\n      mutable_options()->::google::protobuf::MessageOptions::MergeFrom(from.options());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid DescriptorProto::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid DescriptorProto::CopyFrom(const DescriptorProto& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool DescriptorProto::IsInitialized() const {\n  \n  for (int i = 0; i < field_size(); i++) {\n    if (!this->field(i).IsInitialized()) return false;\n  }\n  for (int i = 0; i < extension_size(); i++) {\n    if (!this->extension(i).IsInitialized()) return false;\n  }\n  for (int i = 0; i < nested_type_size(); i++) {\n    if (!this->nested_type(i).IsInitialized()) return false;\n  }\n  for (int i = 0; i < enum_type_size(); i++) {\n    if (!this->enum_type(i).IsInitialized()) return false;\n  }\n  if (has_options()) {\n    if (!this->options().IsInitialized()) return false;\n  }\n  return true;\n}\n\nvoid DescriptorProto::Swap(DescriptorProto* other) {\n  if (other != this) {\n    std::swap(name_, other->name_);\n    field_.Swap(&other->field_);\n    extension_.Swap(&other->extension_);\n    nested_type_.Swap(&other->nested_type_);\n    enum_type_.Swap(&other->enum_type_);\n    extension_range_.Swap(&other->extension_range_);\n    std::swap(options_, other->options_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata DescriptorProto::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = DescriptorProto_descriptor_;\n  metadata.reflection = DescriptorProto_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\nconst ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Type_descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return FieldDescriptorProto_Type_descriptor_;\n}\nbool FieldDescriptorProto_Type_IsValid(int value) {\n  switch(value) {\n    case 1:\n    case 2:\n    case 3:\n    case 4:\n    case 5:\n    case 6:\n    case 7:\n    case 8:\n    case 9:\n    case 10:\n    case 11:\n    case 12:\n    case 13:\n    case 14:\n    case 15:\n    case 16:\n    case 17:\n    case 18:\n      return true;\n    default:\n      return false;\n  }\n}\n\n#ifndef _MSC_VER\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_DOUBLE;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_FLOAT;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_INT64;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_UINT64;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_INT32;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_FIXED64;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_FIXED32;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_BOOL;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_STRING;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_GROUP;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_MESSAGE;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_BYTES;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_UINT32;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_ENUM;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SFIXED32;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SFIXED64;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SINT32;\nconst FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SINT64;\nconst FieldDescriptorProto_Type FieldDescriptorProto::Type_MIN;\nconst FieldDescriptorProto_Type FieldDescriptorProto::Type_MAX;\nconst int FieldDescriptorProto::Type_ARRAYSIZE;\n#endif  // _MSC_VER\nconst ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Label_descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return FieldDescriptorProto_Label_descriptor_;\n}\nbool FieldDescriptorProto_Label_IsValid(int value) {\n  switch(value) {\n    case 1:\n    case 2:\n    case 3:\n      return true;\n    default:\n      return false;\n  }\n}\n\n#ifndef _MSC_VER\nconst FieldDescriptorProto_Label FieldDescriptorProto::LABEL_OPTIONAL;\nconst FieldDescriptorProto_Label FieldDescriptorProto::LABEL_REQUIRED;\nconst FieldDescriptorProto_Label FieldDescriptorProto::LABEL_REPEATED;\nconst FieldDescriptorProto_Label FieldDescriptorProto::Label_MIN;\nconst FieldDescriptorProto_Label FieldDescriptorProto::Label_MAX;\nconst int FieldDescriptorProto::Label_ARRAYSIZE;\n#endif  // _MSC_VER\n#ifndef _MSC_VER\nconst int FieldDescriptorProto::kNameFieldNumber;\nconst int FieldDescriptorProto::kNumberFieldNumber;\nconst int FieldDescriptorProto::kLabelFieldNumber;\nconst int FieldDescriptorProto::kTypeFieldNumber;\nconst int FieldDescriptorProto::kTypeNameFieldNumber;\nconst int FieldDescriptorProto::kExtendeeFieldNumber;\nconst int FieldDescriptorProto::kDefaultValueFieldNumber;\nconst int FieldDescriptorProto::kOptionsFieldNumber;\n#endif  // !_MSC_VER\n\nFieldDescriptorProto::FieldDescriptorProto()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid FieldDescriptorProto::InitAsDefaultInstance() {\n  options_ = const_cast< ::google::protobuf::FieldOptions*>(&::google::protobuf::FieldOptions::default_instance());\n}\n\nFieldDescriptorProto::FieldDescriptorProto(const FieldDescriptorProto& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid FieldDescriptorProto::SharedCtor() {\n  _cached_size_ = 0;\n  name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  number_ = 0;\n  label_ = 1;\n  type_ = 1;\n  type_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  extendee_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  default_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  options_ = NULL;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nFieldDescriptorProto::~FieldDescriptorProto() {\n  SharedDtor();\n}\n\nvoid FieldDescriptorProto::SharedDtor() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    delete name_;\n  }\n  if (type_name_ != &::google::protobuf::internal::kEmptyString) {\n    delete type_name_;\n  }\n  if (extendee_ != &::google::protobuf::internal::kEmptyString) {\n    delete extendee_;\n  }\n  if (default_value_ != &::google::protobuf::internal::kEmptyString) {\n    delete default_value_;\n  }\n  if (this != default_instance_) {\n    delete options_;\n  }\n}\n\nvoid FieldDescriptorProto::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* FieldDescriptorProto::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return FieldDescriptorProto_descriptor_;\n}\n\nconst FieldDescriptorProto& FieldDescriptorProto::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nFieldDescriptorProto* FieldDescriptorProto::default_instance_ = NULL;\n\nFieldDescriptorProto* FieldDescriptorProto::New() const {\n  return new FieldDescriptorProto;\n}\n\nvoid FieldDescriptorProto::Clear() {\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (has_name()) {\n      if (name_ != &::google::protobuf::internal::kEmptyString) {\n        name_->clear();\n      }\n    }\n    number_ = 0;\n    label_ = 1;\n    type_ = 1;\n    if (has_type_name()) {\n      if (type_name_ != &::google::protobuf::internal::kEmptyString) {\n        type_name_->clear();\n      }\n    }\n    if (has_extendee()) {\n      if (extendee_ != &::google::protobuf::internal::kEmptyString) {\n        extendee_->clear();\n      }\n    }\n    if (has_default_value()) {\n      if (default_value_ != &::google::protobuf::internal::kEmptyString) {\n        default_value_->clear();\n      }\n    }\n    if (has_options()) {\n      if (options_ != NULL) options_->::google::protobuf::FieldOptions::Clear();\n    }\n  }\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool FieldDescriptorProto::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // optional string name = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_name()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->name().data(), this->name().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(18)) goto parse_extendee;\n        break;\n      }\n      \n      // optional string extendee = 2;\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_extendee:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_extendee()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->extendee().data(), this->extendee().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(24)) goto parse_number;\n        break;\n      }\n      \n      // optional int32 number = 3;\n      case 3: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_number:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(\n                 input, &number_)));\n          set_has_number();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(32)) goto parse_label;\n        break;\n      }\n      \n      // optional .google.protobuf.FieldDescriptorProto.Label label = 4;\n      case 4: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_label:\n          int value;\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n                 input, &value)));\n          if (::google::protobuf::FieldDescriptorProto_Label_IsValid(value)) {\n            set_label(static_cast< ::google::protobuf::FieldDescriptorProto_Label >(value));\n          } else {\n            mutable_unknown_fields()->AddVarint(4, value);\n          }\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(40)) goto parse_type;\n        break;\n      }\n      \n      // optional .google.protobuf.FieldDescriptorProto.Type type = 5;\n      case 5: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_type:\n          int value;\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n                 input, &value)));\n          if (::google::protobuf::FieldDescriptorProto_Type_IsValid(value)) {\n            set_type(static_cast< ::google::protobuf::FieldDescriptorProto_Type >(value));\n          } else {\n            mutable_unknown_fields()->AddVarint(5, value);\n          }\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(50)) goto parse_type_name;\n        break;\n      }\n      \n      // optional string type_name = 6;\n      case 6: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_type_name:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_type_name()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->type_name().data(), this->type_name().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(58)) goto parse_default_value;\n        break;\n      }\n      \n      // optional string default_value = 7;\n      case 7: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_default_value:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_default_value()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->default_value().data(), this->default_value().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(66)) goto parse_options;\n        break;\n      }\n      \n      // optional .google.protobuf.FieldOptions options = 8;\n      case 8: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_options:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n               input, mutable_options()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid FieldDescriptorProto::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->name(), output);\n  }\n  \n  // optional string extendee = 2;\n  if (has_extendee()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->extendee().data(), this->extendee().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      2, this->extendee(), output);\n  }\n  \n  // optional int32 number = 3;\n  if (has_number()) {\n    ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->number(), output);\n  }\n  \n  // optional .google.protobuf.FieldDescriptorProto.Label label = 4;\n  if (has_label()) {\n    ::google::protobuf::internal::WireFormatLite::WriteEnum(\n      4, this->label(), output);\n  }\n  \n  // optional .google.protobuf.FieldDescriptorProto.Type type = 5;\n  if (has_type()) {\n    ::google::protobuf::internal::WireFormatLite::WriteEnum(\n      5, this->type(), output);\n  }\n  \n  // optional string type_name = 6;\n  if (has_type_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->type_name().data(), this->type_name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      6, this->type_name(), output);\n  }\n  \n  // optional string default_value = 7;\n  if (has_default_value()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->default_value().data(), this->default_value().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      7, this->default_value(), output);\n  }\n  \n  // optional .google.protobuf.FieldOptions options = 8;\n  if (has_options()) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      8, this->options(), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* FieldDescriptorProto::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        1, this->name(), target);\n  }\n  \n  // optional string extendee = 2;\n  if (has_extendee()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->extendee().data(), this->extendee().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        2, this->extendee(), target);\n  }\n  \n  // optional int32 number = 3;\n  if (has_number()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(3, this->number(), target);\n  }\n  \n  // optional .google.protobuf.FieldDescriptorProto.Label label = 4;\n  if (has_label()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\n      4, this->label(), target);\n  }\n  \n  // optional .google.protobuf.FieldDescriptorProto.Type type = 5;\n  if (has_type()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\n      5, this->type(), target);\n  }\n  \n  // optional string type_name = 6;\n  if (has_type_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->type_name().data(), this->type_name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        6, this->type_name(), target);\n  }\n  \n  // optional string default_value = 7;\n  if (has_default_value()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->default_value().data(), this->default_value().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        7, this->default_value(), target);\n  }\n  \n  // optional .google.protobuf.FieldOptions options = 8;\n  if (has_options()) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        8, this->options(), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint FieldDescriptorProto::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // optional string name = 1;\n    if (has_name()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->name());\n    }\n    \n    // optional int32 number = 3;\n    if (has_number()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::Int32Size(\n          this->number());\n    }\n    \n    // optional .google.protobuf.FieldDescriptorProto.Label label = 4;\n    if (has_label()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::EnumSize(this->label());\n    }\n    \n    // optional .google.protobuf.FieldDescriptorProto.Type type = 5;\n    if (has_type()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::EnumSize(this->type());\n    }\n    \n    // optional string type_name = 6;\n    if (has_type_name()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->type_name());\n    }\n    \n    // optional string extendee = 2;\n    if (has_extendee()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->extendee());\n    }\n    \n    // optional string default_value = 7;\n    if (has_default_value()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->default_value());\n    }\n    \n    // optional .google.protobuf.FieldOptions options = 8;\n    if (has_options()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n          this->options());\n    }\n    \n  }\n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid FieldDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const FieldDescriptorProto* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const FieldDescriptorProto*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid FieldDescriptorProto::MergeFrom(const FieldDescriptorProto& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_name()) {\n      set_name(from.name());\n    }\n    if (from.has_number()) {\n      set_number(from.number());\n    }\n    if (from.has_label()) {\n      set_label(from.label());\n    }\n    if (from.has_type()) {\n      set_type(from.type());\n    }\n    if (from.has_type_name()) {\n      set_type_name(from.type_name());\n    }\n    if (from.has_extendee()) {\n      set_extendee(from.extendee());\n    }\n    if (from.has_default_value()) {\n      set_default_value(from.default_value());\n    }\n    if (from.has_options()) {\n      mutable_options()->::google::protobuf::FieldOptions::MergeFrom(from.options());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid FieldDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid FieldDescriptorProto::CopyFrom(const FieldDescriptorProto& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool FieldDescriptorProto::IsInitialized() const {\n  \n  if (has_options()) {\n    if (!this->options().IsInitialized()) return false;\n  }\n  return true;\n}\n\nvoid FieldDescriptorProto::Swap(FieldDescriptorProto* other) {\n  if (other != this) {\n    std::swap(name_, other->name_);\n    std::swap(number_, other->number_);\n    std::swap(label_, other->label_);\n    std::swap(type_, other->type_);\n    std::swap(type_name_, other->type_name_);\n    std::swap(extendee_, other->extendee_);\n    std::swap(default_value_, other->default_value_);\n    std::swap(options_, other->options_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata FieldDescriptorProto::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = FieldDescriptorProto_descriptor_;\n  metadata.reflection = FieldDescriptorProto_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int EnumDescriptorProto::kNameFieldNumber;\nconst int EnumDescriptorProto::kValueFieldNumber;\nconst int EnumDescriptorProto::kOptionsFieldNumber;\n#endif  // !_MSC_VER\n\nEnumDescriptorProto::EnumDescriptorProto()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid EnumDescriptorProto::InitAsDefaultInstance() {\n  options_ = const_cast< ::google::protobuf::EnumOptions*>(&::google::protobuf::EnumOptions::default_instance());\n}\n\nEnumDescriptorProto::EnumDescriptorProto(const EnumDescriptorProto& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid EnumDescriptorProto::SharedCtor() {\n  _cached_size_ = 0;\n  name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  options_ = NULL;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nEnumDescriptorProto::~EnumDescriptorProto() {\n  SharedDtor();\n}\n\nvoid EnumDescriptorProto::SharedDtor() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    delete name_;\n  }\n  if (this != default_instance_) {\n    delete options_;\n  }\n}\n\nvoid EnumDescriptorProto::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* EnumDescriptorProto::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return EnumDescriptorProto_descriptor_;\n}\n\nconst EnumDescriptorProto& EnumDescriptorProto::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nEnumDescriptorProto* EnumDescriptorProto::default_instance_ = NULL;\n\nEnumDescriptorProto* EnumDescriptorProto::New() const {\n  return new EnumDescriptorProto;\n}\n\nvoid EnumDescriptorProto::Clear() {\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (has_name()) {\n      if (name_ != &::google::protobuf::internal::kEmptyString) {\n        name_->clear();\n      }\n    }\n    if (has_options()) {\n      if (options_ != NULL) options_->::google::protobuf::EnumOptions::Clear();\n    }\n  }\n  value_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool EnumDescriptorProto::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // optional string name = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_name()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->name().data(), this->name().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(18)) goto parse_value;\n        break;\n      }\n      \n      // repeated .google.protobuf.EnumValueDescriptorProto value = 2;\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_value:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_value()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(18)) goto parse_value;\n        if (input->ExpectTag(26)) goto parse_options;\n        break;\n      }\n      \n      // optional .google.protobuf.EnumOptions options = 3;\n      case 3: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_options:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n               input, mutable_options()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid EnumDescriptorProto::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->name(), output);\n  }\n  \n  // repeated .google.protobuf.EnumValueDescriptorProto value = 2;\n  for (int i = 0; i < this->value_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      2, this->value(i), output);\n  }\n  \n  // optional .google.protobuf.EnumOptions options = 3;\n  if (has_options()) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      3, this->options(), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* EnumDescriptorProto::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        1, this->name(), target);\n  }\n  \n  // repeated .google.protobuf.EnumValueDescriptorProto value = 2;\n  for (int i = 0; i < this->value_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        2, this->value(i), target);\n  }\n  \n  // optional .google.protobuf.EnumOptions options = 3;\n  if (has_options()) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        3, this->options(), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint EnumDescriptorProto::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // optional string name = 1;\n    if (has_name()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->name());\n    }\n    \n    // optional .google.protobuf.EnumOptions options = 3;\n    if (has_options()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n          this->options());\n    }\n    \n  }\n  // repeated .google.protobuf.EnumValueDescriptorProto value = 2;\n  total_size += 1 * this->value_size();\n  for (int i = 0; i < this->value_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->value(i));\n  }\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid EnumDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const EnumDescriptorProto* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const EnumDescriptorProto*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid EnumDescriptorProto::MergeFrom(const EnumDescriptorProto& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  value_.MergeFrom(from.value_);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_name()) {\n      set_name(from.name());\n    }\n    if (from.has_options()) {\n      mutable_options()->::google::protobuf::EnumOptions::MergeFrom(from.options());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid EnumDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid EnumDescriptorProto::CopyFrom(const EnumDescriptorProto& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool EnumDescriptorProto::IsInitialized() const {\n  \n  for (int i = 0; i < value_size(); i++) {\n    if (!this->value(i).IsInitialized()) return false;\n  }\n  if (has_options()) {\n    if (!this->options().IsInitialized()) return false;\n  }\n  return true;\n}\n\nvoid EnumDescriptorProto::Swap(EnumDescriptorProto* other) {\n  if (other != this) {\n    std::swap(name_, other->name_);\n    value_.Swap(&other->value_);\n    std::swap(options_, other->options_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata EnumDescriptorProto::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = EnumDescriptorProto_descriptor_;\n  metadata.reflection = EnumDescriptorProto_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int EnumValueDescriptorProto::kNameFieldNumber;\nconst int EnumValueDescriptorProto::kNumberFieldNumber;\nconst int EnumValueDescriptorProto::kOptionsFieldNumber;\n#endif  // !_MSC_VER\n\nEnumValueDescriptorProto::EnumValueDescriptorProto()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid EnumValueDescriptorProto::InitAsDefaultInstance() {\n  options_ = const_cast< ::google::protobuf::EnumValueOptions*>(&::google::protobuf::EnumValueOptions::default_instance());\n}\n\nEnumValueDescriptorProto::EnumValueDescriptorProto(const EnumValueDescriptorProto& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid EnumValueDescriptorProto::SharedCtor() {\n  _cached_size_ = 0;\n  name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  number_ = 0;\n  options_ = NULL;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nEnumValueDescriptorProto::~EnumValueDescriptorProto() {\n  SharedDtor();\n}\n\nvoid EnumValueDescriptorProto::SharedDtor() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    delete name_;\n  }\n  if (this != default_instance_) {\n    delete options_;\n  }\n}\n\nvoid EnumValueDescriptorProto::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* EnumValueDescriptorProto::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return EnumValueDescriptorProto_descriptor_;\n}\n\nconst EnumValueDescriptorProto& EnumValueDescriptorProto::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nEnumValueDescriptorProto* EnumValueDescriptorProto::default_instance_ = NULL;\n\nEnumValueDescriptorProto* EnumValueDescriptorProto::New() const {\n  return new EnumValueDescriptorProto;\n}\n\nvoid EnumValueDescriptorProto::Clear() {\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (has_name()) {\n      if (name_ != &::google::protobuf::internal::kEmptyString) {\n        name_->clear();\n      }\n    }\n    number_ = 0;\n    if (has_options()) {\n      if (options_ != NULL) options_->::google::protobuf::EnumValueOptions::Clear();\n    }\n  }\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool EnumValueDescriptorProto::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // optional string name = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_name()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->name().data(), this->name().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(16)) goto parse_number;\n        break;\n      }\n      \n      // optional int32 number = 2;\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_number:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(\n                 input, &number_)));\n          set_has_number();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(26)) goto parse_options;\n        break;\n      }\n      \n      // optional .google.protobuf.EnumValueOptions options = 3;\n      case 3: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_options:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n               input, mutable_options()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid EnumValueDescriptorProto::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->name(), output);\n  }\n  \n  // optional int32 number = 2;\n  if (has_number()) {\n    ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->number(), output);\n  }\n  \n  // optional .google.protobuf.EnumValueOptions options = 3;\n  if (has_options()) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      3, this->options(), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* EnumValueDescriptorProto::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        1, this->name(), target);\n  }\n  \n  // optional int32 number = 2;\n  if (has_number()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->number(), target);\n  }\n  \n  // optional .google.protobuf.EnumValueOptions options = 3;\n  if (has_options()) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        3, this->options(), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint EnumValueDescriptorProto::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // optional string name = 1;\n    if (has_name()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->name());\n    }\n    \n    // optional int32 number = 2;\n    if (has_number()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::Int32Size(\n          this->number());\n    }\n    \n    // optional .google.protobuf.EnumValueOptions options = 3;\n    if (has_options()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n          this->options());\n    }\n    \n  }\n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid EnumValueDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const EnumValueDescriptorProto* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const EnumValueDescriptorProto*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid EnumValueDescriptorProto::MergeFrom(const EnumValueDescriptorProto& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_name()) {\n      set_name(from.name());\n    }\n    if (from.has_number()) {\n      set_number(from.number());\n    }\n    if (from.has_options()) {\n      mutable_options()->::google::protobuf::EnumValueOptions::MergeFrom(from.options());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid EnumValueDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid EnumValueDescriptorProto::CopyFrom(const EnumValueDescriptorProto& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool EnumValueDescriptorProto::IsInitialized() const {\n  \n  if (has_options()) {\n    if (!this->options().IsInitialized()) return false;\n  }\n  return true;\n}\n\nvoid EnumValueDescriptorProto::Swap(EnumValueDescriptorProto* other) {\n  if (other != this) {\n    std::swap(name_, other->name_);\n    std::swap(number_, other->number_);\n    std::swap(options_, other->options_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata EnumValueDescriptorProto::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = EnumValueDescriptorProto_descriptor_;\n  metadata.reflection = EnumValueDescriptorProto_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int ServiceDescriptorProto::kNameFieldNumber;\nconst int ServiceDescriptorProto::kMethodFieldNumber;\nconst int ServiceDescriptorProto::kOptionsFieldNumber;\n#endif  // !_MSC_VER\n\nServiceDescriptorProto::ServiceDescriptorProto()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid ServiceDescriptorProto::InitAsDefaultInstance() {\n  options_ = const_cast< ::google::protobuf::ServiceOptions*>(&::google::protobuf::ServiceOptions::default_instance());\n}\n\nServiceDescriptorProto::ServiceDescriptorProto(const ServiceDescriptorProto& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid ServiceDescriptorProto::SharedCtor() {\n  _cached_size_ = 0;\n  name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  options_ = NULL;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nServiceDescriptorProto::~ServiceDescriptorProto() {\n  SharedDtor();\n}\n\nvoid ServiceDescriptorProto::SharedDtor() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    delete name_;\n  }\n  if (this != default_instance_) {\n    delete options_;\n  }\n}\n\nvoid ServiceDescriptorProto::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* ServiceDescriptorProto::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return ServiceDescriptorProto_descriptor_;\n}\n\nconst ServiceDescriptorProto& ServiceDescriptorProto::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nServiceDescriptorProto* ServiceDescriptorProto::default_instance_ = NULL;\n\nServiceDescriptorProto* ServiceDescriptorProto::New() const {\n  return new ServiceDescriptorProto;\n}\n\nvoid ServiceDescriptorProto::Clear() {\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (has_name()) {\n      if (name_ != &::google::protobuf::internal::kEmptyString) {\n        name_->clear();\n      }\n    }\n    if (has_options()) {\n      if (options_ != NULL) options_->::google::protobuf::ServiceOptions::Clear();\n    }\n  }\n  method_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool ServiceDescriptorProto::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // optional string name = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_name()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->name().data(), this->name().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(18)) goto parse_method;\n        break;\n      }\n      \n      // repeated .google.protobuf.MethodDescriptorProto method = 2;\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_method:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_method()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(18)) goto parse_method;\n        if (input->ExpectTag(26)) goto parse_options;\n        break;\n      }\n      \n      // optional .google.protobuf.ServiceOptions options = 3;\n      case 3: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_options:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n               input, mutable_options()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid ServiceDescriptorProto::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->name(), output);\n  }\n  \n  // repeated .google.protobuf.MethodDescriptorProto method = 2;\n  for (int i = 0; i < this->method_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      2, this->method(i), output);\n  }\n  \n  // optional .google.protobuf.ServiceOptions options = 3;\n  if (has_options()) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      3, this->options(), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* ServiceDescriptorProto::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        1, this->name(), target);\n  }\n  \n  // repeated .google.protobuf.MethodDescriptorProto method = 2;\n  for (int i = 0; i < this->method_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        2, this->method(i), target);\n  }\n  \n  // optional .google.protobuf.ServiceOptions options = 3;\n  if (has_options()) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        3, this->options(), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint ServiceDescriptorProto::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // optional string name = 1;\n    if (has_name()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->name());\n    }\n    \n    // optional .google.protobuf.ServiceOptions options = 3;\n    if (has_options()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n          this->options());\n    }\n    \n  }\n  // repeated .google.protobuf.MethodDescriptorProto method = 2;\n  total_size += 1 * this->method_size();\n  for (int i = 0; i < this->method_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->method(i));\n  }\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid ServiceDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const ServiceDescriptorProto* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const ServiceDescriptorProto*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid ServiceDescriptorProto::MergeFrom(const ServiceDescriptorProto& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  method_.MergeFrom(from.method_);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_name()) {\n      set_name(from.name());\n    }\n    if (from.has_options()) {\n      mutable_options()->::google::protobuf::ServiceOptions::MergeFrom(from.options());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid ServiceDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid ServiceDescriptorProto::CopyFrom(const ServiceDescriptorProto& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool ServiceDescriptorProto::IsInitialized() const {\n  \n  for (int i = 0; i < method_size(); i++) {\n    if (!this->method(i).IsInitialized()) return false;\n  }\n  if (has_options()) {\n    if (!this->options().IsInitialized()) return false;\n  }\n  return true;\n}\n\nvoid ServiceDescriptorProto::Swap(ServiceDescriptorProto* other) {\n  if (other != this) {\n    std::swap(name_, other->name_);\n    method_.Swap(&other->method_);\n    std::swap(options_, other->options_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata ServiceDescriptorProto::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = ServiceDescriptorProto_descriptor_;\n  metadata.reflection = ServiceDescriptorProto_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int MethodDescriptorProto::kNameFieldNumber;\nconst int MethodDescriptorProto::kInputTypeFieldNumber;\nconst int MethodDescriptorProto::kOutputTypeFieldNumber;\nconst int MethodDescriptorProto::kOptionsFieldNumber;\n#endif  // !_MSC_VER\n\nMethodDescriptorProto::MethodDescriptorProto()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid MethodDescriptorProto::InitAsDefaultInstance() {\n  options_ = const_cast< ::google::protobuf::MethodOptions*>(&::google::protobuf::MethodOptions::default_instance());\n}\n\nMethodDescriptorProto::MethodDescriptorProto(const MethodDescriptorProto& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid MethodDescriptorProto::SharedCtor() {\n  _cached_size_ = 0;\n  name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  input_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  output_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  options_ = NULL;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nMethodDescriptorProto::~MethodDescriptorProto() {\n  SharedDtor();\n}\n\nvoid MethodDescriptorProto::SharedDtor() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    delete name_;\n  }\n  if (input_type_ != &::google::protobuf::internal::kEmptyString) {\n    delete input_type_;\n  }\n  if (output_type_ != &::google::protobuf::internal::kEmptyString) {\n    delete output_type_;\n  }\n  if (this != default_instance_) {\n    delete options_;\n  }\n}\n\nvoid MethodDescriptorProto::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* MethodDescriptorProto::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return MethodDescriptorProto_descriptor_;\n}\n\nconst MethodDescriptorProto& MethodDescriptorProto::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nMethodDescriptorProto* MethodDescriptorProto::default_instance_ = NULL;\n\nMethodDescriptorProto* MethodDescriptorProto::New() const {\n  return new MethodDescriptorProto;\n}\n\nvoid MethodDescriptorProto::Clear() {\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (has_name()) {\n      if (name_ != &::google::protobuf::internal::kEmptyString) {\n        name_->clear();\n      }\n    }\n    if (has_input_type()) {\n      if (input_type_ != &::google::protobuf::internal::kEmptyString) {\n        input_type_->clear();\n      }\n    }\n    if (has_output_type()) {\n      if (output_type_ != &::google::protobuf::internal::kEmptyString) {\n        output_type_->clear();\n      }\n    }\n    if (has_options()) {\n      if (options_ != NULL) options_->::google::protobuf::MethodOptions::Clear();\n    }\n  }\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool MethodDescriptorProto::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // optional string name = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_name()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->name().data(), this->name().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(18)) goto parse_input_type;\n        break;\n      }\n      \n      // optional string input_type = 2;\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_input_type:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_input_type()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->input_type().data(), this->input_type().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(26)) goto parse_output_type;\n        break;\n      }\n      \n      // optional string output_type = 3;\n      case 3: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_output_type:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_output_type()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->output_type().data(), this->output_type().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(34)) goto parse_options;\n        break;\n      }\n      \n      // optional .google.protobuf.MethodOptions options = 4;\n      case 4: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_options:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n               input, mutable_options()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid MethodDescriptorProto::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->name(), output);\n  }\n  \n  // optional string input_type = 2;\n  if (has_input_type()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->input_type().data(), this->input_type().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      2, this->input_type(), output);\n  }\n  \n  // optional string output_type = 3;\n  if (has_output_type()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->output_type().data(), this->output_type().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      3, this->output_type(), output);\n  }\n  \n  // optional .google.protobuf.MethodOptions options = 4;\n  if (has_options()) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      4, this->options(), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* MethodDescriptorProto::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // optional string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        1, this->name(), target);\n  }\n  \n  // optional string input_type = 2;\n  if (has_input_type()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->input_type().data(), this->input_type().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        2, this->input_type(), target);\n  }\n  \n  // optional string output_type = 3;\n  if (has_output_type()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->output_type().data(), this->output_type().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        3, this->output_type(), target);\n  }\n  \n  // optional .google.protobuf.MethodOptions options = 4;\n  if (has_options()) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        4, this->options(), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint MethodDescriptorProto::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // optional string name = 1;\n    if (has_name()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->name());\n    }\n    \n    // optional string input_type = 2;\n    if (has_input_type()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->input_type());\n    }\n    \n    // optional string output_type = 3;\n    if (has_output_type()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->output_type());\n    }\n    \n    // optional .google.protobuf.MethodOptions options = 4;\n    if (has_options()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n          this->options());\n    }\n    \n  }\n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid MethodDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const MethodDescriptorProto* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const MethodDescriptorProto*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid MethodDescriptorProto::MergeFrom(const MethodDescriptorProto& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_name()) {\n      set_name(from.name());\n    }\n    if (from.has_input_type()) {\n      set_input_type(from.input_type());\n    }\n    if (from.has_output_type()) {\n      set_output_type(from.output_type());\n    }\n    if (from.has_options()) {\n      mutable_options()->::google::protobuf::MethodOptions::MergeFrom(from.options());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid MethodDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid MethodDescriptorProto::CopyFrom(const MethodDescriptorProto& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool MethodDescriptorProto::IsInitialized() const {\n  \n  if (has_options()) {\n    if (!this->options().IsInitialized()) return false;\n  }\n  return true;\n}\n\nvoid MethodDescriptorProto::Swap(MethodDescriptorProto* other) {\n  if (other != this) {\n    std::swap(name_, other->name_);\n    std::swap(input_type_, other->input_type_);\n    std::swap(output_type_, other->output_type_);\n    std::swap(options_, other->options_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata MethodDescriptorProto::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = MethodDescriptorProto_descriptor_;\n  metadata.reflection = MethodDescriptorProto_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\nconst ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return FileOptions_OptimizeMode_descriptor_;\n}\nbool FileOptions_OptimizeMode_IsValid(int value) {\n  switch(value) {\n    case 1:\n    case 2:\n    case 3:\n      return true;\n    default:\n      return false;\n  }\n}\n\n#ifndef _MSC_VER\nconst FileOptions_OptimizeMode FileOptions::SPEED;\nconst FileOptions_OptimizeMode FileOptions::CODE_SIZE;\nconst FileOptions_OptimizeMode FileOptions::LITE_RUNTIME;\nconst FileOptions_OptimizeMode FileOptions::OptimizeMode_MIN;\nconst FileOptions_OptimizeMode FileOptions::OptimizeMode_MAX;\nconst int FileOptions::OptimizeMode_ARRAYSIZE;\n#endif  // _MSC_VER\n#ifndef _MSC_VER\nconst int FileOptions::kJavaPackageFieldNumber;\nconst int FileOptions::kJavaOuterClassnameFieldNumber;\nconst int FileOptions::kJavaMultipleFilesFieldNumber;\nconst int FileOptions::kJavaGenerateEqualsAndHashFieldNumber;\nconst int FileOptions::kOptimizeForFieldNumber;\nconst int FileOptions::kCcGenericServicesFieldNumber;\nconst int FileOptions::kJavaGenericServicesFieldNumber;\nconst int FileOptions::kPyGenericServicesFieldNumber;\nconst int FileOptions::kUninterpretedOptionFieldNumber;\n#endif  // !_MSC_VER\n\nFileOptions::FileOptions()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid FileOptions::InitAsDefaultInstance() {\n}\n\nFileOptions::FileOptions(const FileOptions& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid FileOptions::SharedCtor() {\n  _cached_size_ = 0;\n  java_package_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  java_outer_classname_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  java_multiple_files_ = false;\n  java_generate_equals_and_hash_ = false;\n  optimize_for_ = 1;\n  cc_generic_services_ = false;\n  java_generic_services_ = false;\n  py_generic_services_ = false;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nFileOptions::~FileOptions() {\n  SharedDtor();\n}\n\nvoid FileOptions::SharedDtor() {\n  if (java_package_ != &::google::protobuf::internal::kEmptyString) {\n    delete java_package_;\n  }\n  if (java_outer_classname_ != &::google::protobuf::internal::kEmptyString) {\n    delete java_outer_classname_;\n  }\n  if (this != default_instance_) {\n  }\n}\n\nvoid FileOptions::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* FileOptions::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return FileOptions_descriptor_;\n}\n\nconst FileOptions& FileOptions::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nFileOptions* FileOptions::default_instance_ = NULL;\n\nFileOptions* FileOptions::New() const {\n  return new FileOptions;\n}\n\nvoid FileOptions::Clear() {\n  _extensions_.Clear();\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (has_java_package()) {\n      if (java_package_ != &::google::protobuf::internal::kEmptyString) {\n        java_package_->clear();\n      }\n    }\n    if (has_java_outer_classname()) {\n      if (java_outer_classname_ != &::google::protobuf::internal::kEmptyString) {\n        java_outer_classname_->clear();\n      }\n    }\n    java_multiple_files_ = false;\n    java_generate_equals_and_hash_ = false;\n    optimize_for_ = 1;\n    cc_generic_services_ = false;\n    java_generic_services_ = false;\n    py_generic_services_ = false;\n  }\n  uninterpreted_option_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool FileOptions::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // optional string java_package = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_java_package()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->java_package().data(), this->java_package().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(66)) goto parse_java_outer_classname;\n        break;\n      }\n      \n      // optional string java_outer_classname = 8;\n      case 8: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_java_outer_classname:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_java_outer_classname()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->java_outer_classname().data(), this->java_outer_classname().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(72)) goto parse_optimize_for;\n        break;\n      }\n      \n      // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];\n      case 9: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_optimize_for:\n          int value;\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n                 input, &value)));\n          if (::google::protobuf::FileOptions_OptimizeMode_IsValid(value)) {\n            set_optimize_for(static_cast< ::google::protobuf::FileOptions_OptimizeMode >(value));\n          } else {\n            mutable_unknown_fields()->AddVarint(9, value);\n          }\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(80)) goto parse_java_multiple_files;\n        break;\n      }\n      \n      // optional bool java_multiple_files = 10 [default = false];\n      case 10: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_java_multiple_files:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(\n                 input, &java_multiple_files_)));\n          set_has_java_multiple_files();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(128)) goto parse_cc_generic_services;\n        break;\n      }\n      \n      // optional bool cc_generic_services = 16 [default = false];\n      case 16: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_cc_generic_services:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(\n                 input, &cc_generic_services_)));\n          set_has_cc_generic_services();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(136)) goto parse_java_generic_services;\n        break;\n      }\n      \n      // optional bool java_generic_services = 17 [default = false];\n      case 17: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_java_generic_services:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(\n                 input, &java_generic_services_)));\n          set_has_java_generic_services();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(144)) goto parse_py_generic_services;\n        break;\n      }\n      \n      // optional bool py_generic_services = 18 [default = false];\n      case 18: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_py_generic_services:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(\n                 input, &py_generic_services_)));\n          set_has_py_generic_services();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(160)) goto parse_java_generate_equals_and_hash;\n        break;\n      }\n      \n      // optional bool java_generate_equals_and_hash = 20 [default = false];\n      case 20: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_java_generate_equals_and_hash:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(\n                 input, &java_generate_equals_and_hash_)));\n          set_has_java_generate_equals_and_hash();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;\n        break;\n      }\n      \n      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n      case 999: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_uninterpreted_option:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_uninterpreted_option()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        if ((8000u <= tag)) {\n          DO_(_extensions_.ParseField(tag, input, default_instance_,\n                                      mutable_unknown_fields()));\n          continue;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid FileOptions::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // optional string java_package = 1;\n  if (has_java_package()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->java_package().data(), this->java_package().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->java_package(), output);\n  }\n  \n  // optional string java_outer_classname = 8;\n  if (has_java_outer_classname()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->java_outer_classname().data(), this->java_outer_classname().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      8, this->java_outer_classname(), output);\n  }\n  \n  // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];\n  if (has_optimize_for()) {\n    ::google::protobuf::internal::WireFormatLite::WriteEnum(\n      9, this->optimize_for(), output);\n  }\n  \n  // optional bool java_multiple_files = 10 [default = false];\n  if (has_java_multiple_files()) {\n    ::google::protobuf::internal::WireFormatLite::WriteBool(10, this->java_multiple_files(), output);\n  }\n  \n  // optional bool cc_generic_services = 16 [default = false];\n  if (has_cc_generic_services()) {\n    ::google::protobuf::internal::WireFormatLite::WriteBool(16, this->cc_generic_services(), output);\n  }\n  \n  // optional bool java_generic_services = 17 [default = false];\n  if (has_java_generic_services()) {\n    ::google::protobuf::internal::WireFormatLite::WriteBool(17, this->java_generic_services(), output);\n  }\n  \n  // optional bool py_generic_services = 18 [default = false];\n  if (has_py_generic_services()) {\n    ::google::protobuf::internal::WireFormatLite::WriteBool(18, this->py_generic_services(), output);\n  }\n  \n  // optional bool java_generate_equals_and_hash = 20 [default = false];\n  if (has_java_generate_equals_and_hash()) {\n    ::google::protobuf::internal::WireFormatLite::WriteBool(20, this->java_generate_equals_and_hash(), output);\n  }\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      999, this->uninterpreted_option(i), output);\n  }\n  \n  // Extension range [1000, 536870912)\n  _extensions_.SerializeWithCachedSizes(\n      1000, 536870912, output);\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* FileOptions::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // optional string java_package = 1;\n  if (has_java_package()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->java_package().data(), this->java_package().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        1, this->java_package(), target);\n  }\n  \n  // optional string java_outer_classname = 8;\n  if (has_java_outer_classname()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->java_outer_classname().data(), this->java_outer_classname().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        8, this->java_outer_classname(), target);\n  }\n  \n  // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];\n  if (has_optimize_for()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\n      9, this->optimize_for(), target);\n  }\n  \n  // optional bool java_multiple_files = 10 [default = false];\n  if (has_java_multiple_files()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(10, this->java_multiple_files(), target);\n  }\n  \n  // optional bool cc_generic_services = 16 [default = false];\n  if (has_cc_generic_services()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(16, this->cc_generic_services(), target);\n  }\n  \n  // optional bool java_generic_services = 17 [default = false];\n  if (has_java_generic_services()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(17, this->java_generic_services(), target);\n  }\n  \n  // optional bool py_generic_services = 18 [default = false];\n  if (has_py_generic_services()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(18, this->py_generic_services(), target);\n  }\n  \n  // optional bool java_generate_equals_and_hash = 20 [default = false];\n  if (has_java_generate_equals_and_hash()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(20, this->java_generate_equals_and_hash(), target);\n  }\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        999, this->uninterpreted_option(i), target);\n  }\n  \n  // Extension range [1000, 536870912)\n  target = _extensions_.SerializeWithCachedSizesToArray(\n      1000, 536870912, target);\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint FileOptions::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // optional string java_package = 1;\n    if (has_java_package()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->java_package());\n    }\n    \n    // optional string java_outer_classname = 8;\n    if (has_java_outer_classname()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->java_outer_classname());\n    }\n    \n    // optional bool java_multiple_files = 10 [default = false];\n    if (has_java_multiple_files()) {\n      total_size += 1 + 1;\n    }\n    \n    // optional bool java_generate_equals_and_hash = 20 [default = false];\n    if (has_java_generate_equals_and_hash()) {\n      total_size += 2 + 1;\n    }\n    \n    // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];\n    if (has_optimize_for()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::EnumSize(this->optimize_for());\n    }\n    \n    // optional bool cc_generic_services = 16 [default = false];\n    if (has_cc_generic_services()) {\n      total_size += 2 + 1;\n    }\n    \n    // optional bool java_generic_services = 17 [default = false];\n    if (has_java_generic_services()) {\n      total_size += 2 + 1;\n    }\n    \n    // optional bool py_generic_services = 18 [default = false];\n    if (has_py_generic_services()) {\n      total_size += 2 + 1;\n    }\n    \n  }\n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  total_size += 2 * this->uninterpreted_option_size();\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->uninterpreted_option(i));\n  }\n  \n  total_size += _extensions_.ByteSize();\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid FileOptions::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const FileOptions* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const FileOptions*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid FileOptions::MergeFrom(const FileOptions& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  uninterpreted_option_.MergeFrom(from.uninterpreted_option_);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_java_package()) {\n      set_java_package(from.java_package());\n    }\n    if (from.has_java_outer_classname()) {\n      set_java_outer_classname(from.java_outer_classname());\n    }\n    if (from.has_java_multiple_files()) {\n      set_java_multiple_files(from.java_multiple_files());\n    }\n    if (from.has_java_generate_equals_and_hash()) {\n      set_java_generate_equals_and_hash(from.java_generate_equals_and_hash());\n    }\n    if (from.has_optimize_for()) {\n      set_optimize_for(from.optimize_for());\n    }\n    if (from.has_cc_generic_services()) {\n      set_cc_generic_services(from.cc_generic_services());\n    }\n    if (from.has_java_generic_services()) {\n      set_java_generic_services(from.java_generic_services());\n    }\n    if (from.has_py_generic_services()) {\n      set_py_generic_services(from.py_generic_services());\n    }\n  }\n  _extensions_.MergeFrom(from._extensions_);\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid FileOptions::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid FileOptions::CopyFrom(const FileOptions& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool FileOptions::IsInitialized() const {\n  \n  for (int i = 0; i < uninterpreted_option_size(); i++) {\n    if (!this->uninterpreted_option(i).IsInitialized()) return false;\n  }\n  \n  if (!_extensions_.IsInitialized()) return false;  return true;\n}\n\nvoid FileOptions::Swap(FileOptions* other) {\n  if (other != this) {\n    std::swap(java_package_, other->java_package_);\n    std::swap(java_outer_classname_, other->java_outer_classname_);\n    std::swap(java_multiple_files_, other->java_multiple_files_);\n    std::swap(java_generate_equals_and_hash_, other->java_generate_equals_and_hash_);\n    std::swap(optimize_for_, other->optimize_for_);\n    std::swap(cc_generic_services_, other->cc_generic_services_);\n    std::swap(java_generic_services_, other->java_generic_services_);\n    std::swap(py_generic_services_, other->py_generic_services_);\n    uninterpreted_option_.Swap(&other->uninterpreted_option_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n    _extensions_.Swap(&other->_extensions_);\n  }\n}\n\n::google::protobuf::Metadata FileOptions::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = FileOptions_descriptor_;\n  metadata.reflection = FileOptions_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int MessageOptions::kMessageSetWireFormatFieldNumber;\nconst int MessageOptions::kNoStandardDescriptorAccessorFieldNumber;\nconst int MessageOptions::kUninterpretedOptionFieldNumber;\n#endif  // !_MSC_VER\n\nMessageOptions::MessageOptions()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid MessageOptions::InitAsDefaultInstance() {\n}\n\nMessageOptions::MessageOptions(const MessageOptions& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid MessageOptions::SharedCtor() {\n  _cached_size_ = 0;\n  message_set_wire_format_ = false;\n  no_standard_descriptor_accessor_ = false;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nMessageOptions::~MessageOptions() {\n  SharedDtor();\n}\n\nvoid MessageOptions::SharedDtor() {\n  if (this != default_instance_) {\n  }\n}\n\nvoid MessageOptions::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* MessageOptions::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return MessageOptions_descriptor_;\n}\n\nconst MessageOptions& MessageOptions::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nMessageOptions* MessageOptions::default_instance_ = NULL;\n\nMessageOptions* MessageOptions::New() const {\n  return new MessageOptions;\n}\n\nvoid MessageOptions::Clear() {\n  _extensions_.Clear();\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    message_set_wire_format_ = false;\n    no_standard_descriptor_accessor_ = false;\n  }\n  uninterpreted_option_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool MessageOptions::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // optional bool message_set_wire_format = 1 [default = false];\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(\n                 input, &message_set_wire_format_)));\n          set_has_message_set_wire_format();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(16)) goto parse_no_standard_descriptor_accessor;\n        break;\n      }\n      \n      // optional bool no_standard_descriptor_accessor = 2 [default = false];\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_no_standard_descriptor_accessor:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(\n                 input, &no_standard_descriptor_accessor_)));\n          set_has_no_standard_descriptor_accessor();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;\n        break;\n      }\n      \n      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n      case 999: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_uninterpreted_option:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_uninterpreted_option()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        if ((8000u <= tag)) {\n          DO_(_extensions_.ParseField(tag, input, default_instance_,\n                                      mutable_unknown_fields()));\n          continue;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid MessageOptions::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // optional bool message_set_wire_format = 1 [default = false];\n  if (has_message_set_wire_format()) {\n    ::google::protobuf::internal::WireFormatLite::WriteBool(1, this->message_set_wire_format(), output);\n  }\n  \n  // optional bool no_standard_descriptor_accessor = 2 [default = false];\n  if (has_no_standard_descriptor_accessor()) {\n    ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->no_standard_descriptor_accessor(), output);\n  }\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      999, this->uninterpreted_option(i), output);\n  }\n  \n  // Extension range [1000, 536870912)\n  _extensions_.SerializeWithCachedSizes(\n      1000, 536870912, output);\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* MessageOptions::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // optional bool message_set_wire_format = 1 [default = false];\n  if (has_message_set_wire_format()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(1, this->message_set_wire_format(), target);\n  }\n  \n  // optional bool no_standard_descriptor_accessor = 2 [default = false];\n  if (has_no_standard_descriptor_accessor()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->no_standard_descriptor_accessor(), target);\n  }\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        999, this->uninterpreted_option(i), target);\n  }\n  \n  // Extension range [1000, 536870912)\n  target = _extensions_.SerializeWithCachedSizesToArray(\n      1000, 536870912, target);\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint MessageOptions::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // optional bool message_set_wire_format = 1 [default = false];\n    if (has_message_set_wire_format()) {\n      total_size += 1 + 1;\n    }\n    \n    // optional bool no_standard_descriptor_accessor = 2 [default = false];\n    if (has_no_standard_descriptor_accessor()) {\n      total_size += 1 + 1;\n    }\n    \n  }\n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  total_size += 2 * this->uninterpreted_option_size();\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->uninterpreted_option(i));\n  }\n  \n  total_size += _extensions_.ByteSize();\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid MessageOptions::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const MessageOptions* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const MessageOptions*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid MessageOptions::MergeFrom(const MessageOptions& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  uninterpreted_option_.MergeFrom(from.uninterpreted_option_);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_message_set_wire_format()) {\n      set_message_set_wire_format(from.message_set_wire_format());\n    }\n    if (from.has_no_standard_descriptor_accessor()) {\n      set_no_standard_descriptor_accessor(from.no_standard_descriptor_accessor());\n    }\n  }\n  _extensions_.MergeFrom(from._extensions_);\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid MessageOptions::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid MessageOptions::CopyFrom(const MessageOptions& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool MessageOptions::IsInitialized() const {\n  \n  for (int i = 0; i < uninterpreted_option_size(); i++) {\n    if (!this->uninterpreted_option(i).IsInitialized()) return false;\n  }\n  \n  if (!_extensions_.IsInitialized()) return false;  return true;\n}\n\nvoid MessageOptions::Swap(MessageOptions* other) {\n  if (other != this) {\n    std::swap(message_set_wire_format_, other->message_set_wire_format_);\n    std::swap(no_standard_descriptor_accessor_, other->no_standard_descriptor_accessor_);\n    uninterpreted_option_.Swap(&other->uninterpreted_option_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n    _extensions_.Swap(&other->_extensions_);\n  }\n}\n\n::google::protobuf::Metadata MessageOptions::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = MessageOptions_descriptor_;\n  metadata.reflection = MessageOptions_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\nconst ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return FieldOptions_CType_descriptor_;\n}\nbool FieldOptions_CType_IsValid(int value) {\n  switch(value) {\n    case 0:\n    case 1:\n    case 2:\n      return true;\n    default:\n      return false;\n  }\n}\n\n#ifndef _MSC_VER\nconst FieldOptions_CType FieldOptions::STRING;\nconst FieldOptions_CType FieldOptions::CORD;\nconst FieldOptions_CType FieldOptions::STRING_PIECE;\nconst FieldOptions_CType FieldOptions::CType_MIN;\nconst FieldOptions_CType FieldOptions::CType_MAX;\nconst int FieldOptions::CType_ARRAYSIZE;\n#endif  // _MSC_VER\n#ifndef _MSC_VER\nconst int FieldOptions::kCtypeFieldNumber;\nconst int FieldOptions::kPackedFieldNumber;\nconst int FieldOptions::kDeprecatedFieldNumber;\nconst int FieldOptions::kExperimentalMapKeyFieldNumber;\nconst int FieldOptions::kUninterpretedOptionFieldNumber;\n#endif  // !_MSC_VER\n\nFieldOptions::FieldOptions()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid FieldOptions::InitAsDefaultInstance() {\n}\n\nFieldOptions::FieldOptions(const FieldOptions& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid FieldOptions::SharedCtor() {\n  _cached_size_ = 0;\n  ctype_ = 0;\n  packed_ = false;\n  deprecated_ = false;\n  experimental_map_key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nFieldOptions::~FieldOptions() {\n  SharedDtor();\n}\n\nvoid FieldOptions::SharedDtor() {\n  if (experimental_map_key_ != &::google::protobuf::internal::kEmptyString) {\n    delete experimental_map_key_;\n  }\n  if (this != default_instance_) {\n  }\n}\n\nvoid FieldOptions::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* FieldOptions::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return FieldOptions_descriptor_;\n}\n\nconst FieldOptions& FieldOptions::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nFieldOptions* FieldOptions::default_instance_ = NULL;\n\nFieldOptions* FieldOptions::New() const {\n  return new FieldOptions;\n}\n\nvoid FieldOptions::Clear() {\n  _extensions_.Clear();\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    ctype_ = 0;\n    packed_ = false;\n    deprecated_ = false;\n    if (has_experimental_map_key()) {\n      if (experimental_map_key_ != &::google::protobuf::internal::kEmptyString) {\n        experimental_map_key_->clear();\n      }\n    }\n  }\n  uninterpreted_option_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool FieldOptions::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n          int value;\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n                 input, &value)));\n          if (::google::protobuf::FieldOptions_CType_IsValid(value)) {\n            set_ctype(static_cast< ::google::protobuf::FieldOptions_CType >(value));\n          } else {\n            mutable_unknown_fields()->AddVarint(1, value);\n          }\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(16)) goto parse_packed;\n        break;\n      }\n      \n      // optional bool packed = 2;\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_packed:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(\n                 input, &packed_)));\n          set_has_packed();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(24)) goto parse_deprecated;\n        break;\n      }\n      \n      // optional bool deprecated = 3 [default = false];\n      case 3: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_deprecated:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(\n                 input, &deprecated_)));\n          set_has_deprecated();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(74)) goto parse_experimental_map_key;\n        break;\n      }\n      \n      // optional string experimental_map_key = 9;\n      case 9: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_experimental_map_key:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_experimental_map_key()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->experimental_map_key().data(), this->experimental_map_key().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;\n        break;\n      }\n      \n      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n      case 999: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_uninterpreted_option:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_uninterpreted_option()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        if ((8000u <= tag)) {\n          DO_(_extensions_.ParseField(tag, input, default_instance_,\n                                      mutable_unknown_fields()));\n          continue;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid FieldOptions::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];\n  if (has_ctype()) {\n    ::google::protobuf::internal::WireFormatLite::WriteEnum(\n      1, this->ctype(), output);\n  }\n  \n  // optional bool packed = 2;\n  if (has_packed()) {\n    ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->packed(), output);\n  }\n  \n  // optional bool deprecated = 3 [default = false];\n  if (has_deprecated()) {\n    ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->deprecated(), output);\n  }\n  \n  // optional string experimental_map_key = 9;\n  if (has_experimental_map_key()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->experimental_map_key().data(), this->experimental_map_key().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      9, this->experimental_map_key(), output);\n  }\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      999, this->uninterpreted_option(i), output);\n  }\n  \n  // Extension range [1000, 536870912)\n  _extensions_.SerializeWithCachedSizes(\n      1000, 536870912, output);\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* FieldOptions::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];\n  if (has_ctype()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\n      1, this->ctype(), target);\n  }\n  \n  // optional bool packed = 2;\n  if (has_packed()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->packed(), target);\n  }\n  \n  // optional bool deprecated = 3 [default = false];\n  if (has_deprecated()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(3, this->deprecated(), target);\n  }\n  \n  // optional string experimental_map_key = 9;\n  if (has_experimental_map_key()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->experimental_map_key().data(), this->experimental_map_key().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        9, this->experimental_map_key(), target);\n  }\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        999, this->uninterpreted_option(i), target);\n  }\n  \n  // Extension range [1000, 536870912)\n  target = _extensions_.SerializeWithCachedSizesToArray(\n      1000, 536870912, target);\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint FieldOptions::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];\n    if (has_ctype()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::EnumSize(this->ctype());\n    }\n    \n    // optional bool packed = 2;\n    if (has_packed()) {\n      total_size += 1 + 1;\n    }\n    \n    // optional bool deprecated = 3 [default = false];\n    if (has_deprecated()) {\n      total_size += 1 + 1;\n    }\n    \n    // optional string experimental_map_key = 9;\n    if (has_experimental_map_key()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->experimental_map_key());\n    }\n    \n  }\n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  total_size += 2 * this->uninterpreted_option_size();\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->uninterpreted_option(i));\n  }\n  \n  total_size += _extensions_.ByteSize();\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid FieldOptions::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const FieldOptions* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const FieldOptions*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid FieldOptions::MergeFrom(const FieldOptions& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  uninterpreted_option_.MergeFrom(from.uninterpreted_option_);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_ctype()) {\n      set_ctype(from.ctype());\n    }\n    if (from.has_packed()) {\n      set_packed(from.packed());\n    }\n    if (from.has_deprecated()) {\n      set_deprecated(from.deprecated());\n    }\n    if (from.has_experimental_map_key()) {\n      set_experimental_map_key(from.experimental_map_key());\n    }\n  }\n  _extensions_.MergeFrom(from._extensions_);\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid FieldOptions::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid FieldOptions::CopyFrom(const FieldOptions& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool FieldOptions::IsInitialized() const {\n  \n  for (int i = 0; i < uninterpreted_option_size(); i++) {\n    if (!this->uninterpreted_option(i).IsInitialized()) return false;\n  }\n  \n  if (!_extensions_.IsInitialized()) return false;  return true;\n}\n\nvoid FieldOptions::Swap(FieldOptions* other) {\n  if (other != this) {\n    std::swap(ctype_, other->ctype_);\n    std::swap(packed_, other->packed_);\n    std::swap(deprecated_, other->deprecated_);\n    std::swap(experimental_map_key_, other->experimental_map_key_);\n    uninterpreted_option_.Swap(&other->uninterpreted_option_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n    _extensions_.Swap(&other->_extensions_);\n  }\n}\n\n::google::protobuf::Metadata FieldOptions::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = FieldOptions_descriptor_;\n  metadata.reflection = FieldOptions_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int EnumOptions::kUninterpretedOptionFieldNumber;\n#endif  // !_MSC_VER\n\nEnumOptions::EnumOptions()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid EnumOptions::InitAsDefaultInstance() {\n}\n\nEnumOptions::EnumOptions(const EnumOptions& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid EnumOptions::SharedCtor() {\n  _cached_size_ = 0;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nEnumOptions::~EnumOptions() {\n  SharedDtor();\n}\n\nvoid EnumOptions::SharedDtor() {\n  if (this != default_instance_) {\n  }\n}\n\nvoid EnumOptions::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* EnumOptions::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return EnumOptions_descriptor_;\n}\n\nconst EnumOptions& EnumOptions::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nEnumOptions* EnumOptions::default_instance_ = NULL;\n\nEnumOptions* EnumOptions::New() const {\n  return new EnumOptions;\n}\n\nvoid EnumOptions::Clear() {\n  _extensions_.Clear();\n  uninterpreted_option_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool EnumOptions::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n      case 999: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_uninterpreted_option:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_uninterpreted_option()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        if ((8000u <= tag)) {\n          DO_(_extensions_.ParseField(tag, input, default_instance_,\n                                      mutable_unknown_fields()));\n          continue;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid EnumOptions::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      999, this->uninterpreted_option(i), output);\n  }\n  \n  // Extension range [1000, 536870912)\n  _extensions_.SerializeWithCachedSizes(\n      1000, 536870912, output);\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* EnumOptions::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        999, this->uninterpreted_option(i), target);\n  }\n  \n  // Extension range [1000, 536870912)\n  target = _extensions_.SerializeWithCachedSizesToArray(\n      1000, 536870912, target);\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint EnumOptions::ByteSize() const {\n  int total_size = 0;\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  total_size += 2 * this->uninterpreted_option_size();\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->uninterpreted_option(i));\n  }\n  \n  total_size += _extensions_.ByteSize();\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid EnumOptions::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const EnumOptions* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const EnumOptions*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid EnumOptions::MergeFrom(const EnumOptions& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  uninterpreted_option_.MergeFrom(from.uninterpreted_option_);\n  _extensions_.MergeFrom(from._extensions_);\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid EnumOptions::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid EnumOptions::CopyFrom(const EnumOptions& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool EnumOptions::IsInitialized() const {\n  \n  for (int i = 0; i < uninterpreted_option_size(); i++) {\n    if (!this->uninterpreted_option(i).IsInitialized()) return false;\n  }\n  \n  if (!_extensions_.IsInitialized()) return false;  return true;\n}\n\nvoid EnumOptions::Swap(EnumOptions* other) {\n  if (other != this) {\n    uninterpreted_option_.Swap(&other->uninterpreted_option_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n    _extensions_.Swap(&other->_extensions_);\n  }\n}\n\n::google::protobuf::Metadata EnumOptions::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = EnumOptions_descriptor_;\n  metadata.reflection = EnumOptions_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int EnumValueOptions::kUninterpretedOptionFieldNumber;\n#endif  // !_MSC_VER\n\nEnumValueOptions::EnumValueOptions()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid EnumValueOptions::InitAsDefaultInstance() {\n}\n\nEnumValueOptions::EnumValueOptions(const EnumValueOptions& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid EnumValueOptions::SharedCtor() {\n  _cached_size_ = 0;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nEnumValueOptions::~EnumValueOptions() {\n  SharedDtor();\n}\n\nvoid EnumValueOptions::SharedDtor() {\n  if (this != default_instance_) {\n  }\n}\n\nvoid EnumValueOptions::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* EnumValueOptions::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return EnumValueOptions_descriptor_;\n}\n\nconst EnumValueOptions& EnumValueOptions::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nEnumValueOptions* EnumValueOptions::default_instance_ = NULL;\n\nEnumValueOptions* EnumValueOptions::New() const {\n  return new EnumValueOptions;\n}\n\nvoid EnumValueOptions::Clear() {\n  _extensions_.Clear();\n  uninterpreted_option_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool EnumValueOptions::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n      case 999: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_uninterpreted_option:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_uninterpreted_option()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        if ((8000u <= tag)) {\n          DO_(_extensions_.ParseField(tag, input, default_instance_,\n                                      mutable_unknown_fields()));\n          continue;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid EnumValueOptions::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      999, this->uninterpreted_option(i), output);\n  }\n  \n  // Extension range [1000, 536870912)\n  _extensions_.SerializeWithCachedSizes(\n      1000, 536870912, output);\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* EnumValueOptions::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        999, this->uninterpreted_option(i), target);\n  }\n  \n  // Extension range [1000, 536870912)\n  target = _extensions_.SerializeWithCachedSizesToArray(\n      1000, 536870912, target);\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint EnumValueOptions::ByteSize() const {\n  int total_size = 0;\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  total_size += 2 * this->uninterpreted_option_size();\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->uninterpreted_option(i));\n  }\n  \n  total_size += _extensions_.ByteSize();\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid EnumValueOptions::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const EnumValueOptions* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const EnumValueOptions*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid EnumValueOptions::MergeFrom(const EnumValueOptions& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  uninterpreted_option_.MergeFrom(from.uninterpreted_option_);\n  _extensions_.MergeFrom(from._extensions_);\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid EnumValueOptions::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid EnumValueOptions::CopyFrom(const EnumValueOptions& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool EnumValueOptions::IsInitialized() const {\n  \n  for (int i = 0; i < uninterpreted_option_size(); i++) {\n    if (!this->uninterpreted_option(i).IsInitialized()) return false;\n  }\n  \n  if (!_extensions_.IsInitialized()) return false;  return true;\n}\n\nvoid EnumValueOptions::Swap(EnumValueOptions* other) {\n  if (other != this) {\n    uninterpreted_option_.Swap(&other->uninterpreted_option_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n    _extensions_.Swap(&other->_extensions_);\n  }\n}\n\n::google::protobuf::Metadata EnumValueOptions::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = EnumValueOptions_descriptor_;\n  metadata.reflection = EnumValueOptions_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int ServiceOptions::kUninterpretedOptionFieldNumber;\n#endif  // !_MSC_VER\n\nServiceOptions::ServiceOptions()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid ServiceOptions::InitAsDefaultInstance() {\n}\n\nServiceOptions::ServiceOptions(const ServiceOptions& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid ServiceOptions::SharedCtor() {\n  _cached_size_ = 0;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nServiceOptions::~ServiceOptions() {\n  SharedDtor();\n}\n\nvoid ServiceOptions::SharedDtor() {\n  if (this != default_instance_) {\n  }\n}\n\nvoid ServiceOptions::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* ServiceOptions::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return ServiceOptions_descriptor_;\n}\n\nconst ServiceOptions& ServiceOptions::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nServiceOptions* ServiceOptions::default_instance_ = NULL;\n\nServiceOptions* ServiceOptions::New() const {\n  return new ServiceOptions;\n}\n\nvoid ServiceOptions::Clear() {\n  _extensions_.Clear();\n  uninterpreted_option_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool ServiceOptions::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n      case 999: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_uninterpreted_option:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_uninterpreted_option()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        if ((8000u <= tag)) {\n          DO_(_extensions_.ParseField(tag, input, default_instance_,\n                                      mutable_unknown_fields()));\n          continue;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid ServiceOptions::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      999, this->uninterpreted_option(i), output);\n  }\n  \n  // Extension range [1000, 536870912)\n  _extensions_.SerializeWithCachedSizes(\n      1000, 536870912, output);\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* ServiceOptions::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        999, this->uninterpreted_option(i), target);\n  }\n  \n  // Extension range [1000, 536870912)\n  target = _extensions_.SerializeWithCachedSizesToArray(\n      1000, 536870912, target);\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint ServiceOptions::ByteSize() const {\n  int total_size = 0;\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  total_size += 2 * this->uninterpreted_option_size();\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->uninterpreted_option(i));\n  }\n  \n  total_size += _extensions_.ByteSize();\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid ServiceOptions::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const ServiceOptions* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const ServiceOptions*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid ServiceOptions::MergeFrom(const ServiceOptions& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  uninterpreted_option_.MergeFrom(from.uninterpreted_option_);\n  _extensions_.MergeFrom(from._extensions_);\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid ServiceOptions::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid ServiceOptions::CopyFrom(const ServiceOptions& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool ServiceOptions::IsInitialized() const {\n  \n  for (int i = 0; i < uninterpreted_option_size(); i++) {\n    if (!this->uninterpreted_option(i).IsInitialized()) return false;\n  }\n  \n  if (!_extensions_.IsInitialized()) return false;  return true;\n}\n\nvoid ServiceOptions::Swap(ServiceOptions* other) {\n  if (other != this) {\n    uninterpreted_option_.Swap(&other->uninterpreted_option_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n    _extensions_.Swap(&other->_extensions_);\n  }\n}\n\n::google::protobuf::Metadata ServiceOptions::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = ServiceOptions_descriptor_;\n  metadata.reflection = ServiceOptions_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int MethodOptions::kUninterpretedOptionFieldNumber;\n#endif  // !_MSC_VER\n\nMethodOptions::MethodOptions()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid MethodOptions::InitAsDefaultInstance() {\n}\n\nMethodOptions::MethodOptions(const MethodOptions& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid MethodOptions::SharedCtor() {\n  _cached_size_ = 0;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nMethodOptions::~MethodOptions() {\n  SharedDtor();\n}\n\nvoid MethodOptions::SharedDtor() {\n  if (this != default_instance_) {\n  }\n}\n\nvoid MethodOptions::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* MethodOptions::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return MethodOptions_descriptor_;\n}\n\nconst MethodOptions& MethodOptions::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nMethodOptions* MethodOptions::default_instance_ = NULL;\n\nMethodOptions* MethodOptions::New() const {\n  return new MethodOptions;\n}\n\nvoid MethodOptions::Clear() {\n  _extensions_.Clear();\n  uninterpreted_option_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool MethodOptions::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n      case 999: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_uninterpreted_option:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_uninterpreted_option()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(7994)) goto parse_uninterpreted_option;\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        if ((8000u <= tag)) {\n          DO_(_extensions_.ParseField(tag, input, default_instance_,\n                                      mutable_unknown_fields()));\n          continue;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid MethodOptions::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      999, this->uninterpreted_option(i), output);\n  }\n  \n  // Extension range [1000, 536870912)\n  _extensions_.SerializeWithCachedSizes(\n      1000, 536870912, output);\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* MethodOptions::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        999, this->uninterpreted_option(i), target);\n  }\n  \n  // Extension range [1000, 536870912)\n  target = _extensions_.SerializeWithCachedSizesToArray(\n      1000, 536870912, target);\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint MethodOptions::ByteSize() const {\n  int total_size = 0;\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  total_size += 2 * this->uninterpreted_option_size();\n  for (int i = 0; i < this->uninterpreted_option_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->uninterpreted_option(i));\n  }\n  \n  total_size += _extensions_.ByteSize();\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid MethodOptions::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const MethodOptions* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const MethodOptions*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid MethodOptions::MergeFrom(const MethodOptions& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  uninterpreted_option_.MergeFrom(from.uninterpreted_option_);\n  _extensions_.MergeFrom(from._extensions_);\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid MethodOptions::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid MethodOptions::CopyFrom(const MethodOptions& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool MethodOptions::IsInitialized() const {\n  \n  for (int i = 0; i < uninterpreted_option_size(); i++) {\n    if (!this->uninterpreted_option(i).IsInitialized()) return false;\n  }\n  \n  if (!_extensions_.IsInitialized()) return false;  return true;\n}\n\nvoid MethodOptions::Swap(MethodOptions* other) {\n  if (other != this) {\n    uninterpreted_option_.Swap(&other->uninterpreted_option_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n    _extensions_.Swap(&other->_extensions_);\n  }\n}\n\n::google::protobuf::Metadata MethodOptions::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = MethodOptions_descriptor_;\n  metadata.reflection = MethodOptions_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int UninterpretedOption_NamePart::kNamePartFieldNumber;\nconst int UninterpretedOption_NamePart::kIsExtensionFieldNumber;\n#endif  // !_MSC_VER\n\nUninterpretedOption_NamePart::UninterpretedOption_NamePart()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid UninterpretedOption_NamePart::InitAsDefaultInstance() {\n}\n\nUninterpretedOption_NamePart::UninterpretedOption_NamePart(const UninterpretedOption_NamePart& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid UninterpretedOption_NamePart::SharedCtor() {\n  _cached_size_ = 0;\n  name_part_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  is_extension_ = false;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nUninterpretedOption_NamePart::~UninterpretedOption_NamePart() {\n  SharedDtor();\n}\n\nvoid UninterpretedOption_NamePart::SharedDtor() {\n  if (name_part_ != &::google::protobuf::internal::kEmptyString) {\n    delete name_part_;\n  }\n  if (this != default_instance_) {\n  }\n}\n\nvoid UninterpretedOption_NamePart::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* UninterpretedOption_NamePart::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return UninterpretedOption_NamePart_descriptor_;\n}\n\nconst UninterpretedOption_NamePart& UninterpretedOption_NamePart::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nUninterpretedOption_NamePart* UninterpretedOption_NamePart::default_instance_ = NULL;\n\nUninterpretedOption_NamePart* UninterpretedOption_NamePart::New() const {\n  return new UninterpretedOption_NamePart;\n}\n\nvoid UninterpretedOption_NamePart::Clear() {\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (has_name_part()) {\n      if (name_part_ != &::google::protobuf::internal::kEmptyString) {\n        name_part_->clear();\n      }\n    }\n    is_extension_ = false;\n  }\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool UninterpretedOption_NamePart::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // required string name_part = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_name_part()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->name_part().data(), this->name_part().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(16)) goto parse_is_extension;\n        break;\n      }\n      \n      // required bool is_extension = 2;\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_is_extension:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(\n                 input, &is_extension_)));\n          set_has_is_extension();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid UninterpretedOption_NamePart::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // required string name_part = 1;\n  if (has_name_part()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name_part().data(), this->name_part().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->name_part(), output);\n  }\n  \n  // required bool is_extension = 2;\n  if (has_is_extension()) {\n    ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->is_extension(), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* UninterpretedOption_NamePart::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // required string name_part = 1;\n  if (has_name_part()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name_part().data(), this->name_part().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        1, this->name_part(), target);\n  }\n  \n  // required bool is_extension = 2;\n  if (has_is_extension()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->is_extension(), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint UninterpretedOption_NamePart::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // required string name_part = 1;\n    if (has_name_part()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->name_part());\n    }\n    \n    // required bool is_extension = 2;\n    if (has_is_extension()) {\n      total_size += 1 + 1;\n    }\n    \n  }\n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid UninterpretedOption_NamePart::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const UninterpretedOption_NamePart* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const UninterpretedOption_NamePart*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid UninterpretedOption_NamePart::MergeFrom(const UninterpretedOption_NamePart& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_name_part()) {\n      set_name_part(from.name_part());\n    }\n    if (from.has_is_extension()) {\n      set_is_extension(from.is_extension());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid UninterpretedOption_NamePart::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid UninterpretedOption_NamePart::CopyFrom(const UninterpretedOption_NamePart& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool UninterpretedOption_NamePart::IsInitialized() const {\n  if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false;\n  \n  return true;\n}\n\nvoid UninterpretedOption_NamePart::Swap(UninterpretedOption_NamePart* other) {\n  if (other != this) {\n    std::swap(name_part_, other->name_part_);\n    std::swap(is_extension_, other->is_extension_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata UninterpretedOption_NamePart::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = UninterpretedOption_NamePart_descriptor_;\n  metadata.reflection = UninterpretedOption_NamePart_reflection_;\n  return metadata;\n}\n\n\n// -------------------------------------------------------------------\n\n#ifndef _MSC_VER\nconst int UninterpretedOption::kNameFieldNumber;\nconst int UninterpretedOption::kIdentifierValueFieldNumber;\nconst int UninterpretedOption::kPositiveIntValueFieldNumber;\nconst int UninterpretedOption::kNegativeIntValueFieldNumber;\nconst int UninterpretedOption::kDoubleValueFieldNumber;\nconst int UninterpretedOption::kStringValueFieldNumber;\nconst int UninterpretedOption::kAggregateValueFieldNumber;\n#endif  // !_MSC_VER\n\nUninterpretedOption::UninterpretedOption()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid UninterpretedOption::InitAsDefaultInstance() {\n}\n\nUninterpretedOption::UninterpretedOption(const UninterpretedOption& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid UninterpretedOption::SharedCtor() {\n  _cached_size_ = 0;\n  identifier_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  positive_int_value_ = GOOGLE_ULONGLONG(0);\n  negative_int_value_ = GOOGLE_LONGLONG(0);\n  double_value_ = 0;\n  string_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  aggregate_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nUninterpretedOption::~UninterpretedOption() {\n  SharedDtor();\n}\n\nvoid UninterpretedOption::SharedDtor() {\n  if (identifier_value_ != &::google::protobuf::internal::kEmptyString) {\n    delete identifier_value_;\n  }\n  if (string_value_ != &::google::protobuf::internal::kEmptyString) {\n    delete string_value_;\n  }\n  if (aggregate_value_ != &::google::protobuf::internal::kEmptyString) {\n    delete aggregate_value_;\n  }\n  if (this != default_instance_) {\n  }\n}\n\nvoid UninterpretedOption::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* UninterpretedOption::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return UninterpretedOption_descriptor_;\n}\n\nconst UninterpretedOption& UninterpretedOption::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nUninterpretedOption* UninterpretedOption::default_instance_ = NULL;\n\nUninterpretedOption* UninterpretedOption::New() const {\n  return new UninterpretedOption;\n}\n\nvoid UninterpretedOption::Clear() {\n  if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) {\n    if (has_identifier_value()) {\n      if (identifier_value_ != &::google::protobuf::internal::kEmptyString) {\n        identifier_value_->clear();\n      }\n    }\n    positive_int_value_ = GOOGLE_ULONGLONG(0);\n    negative_int_value_ = GOOGLE_LONGLONG(0);\n    double_value_ = 0;\n    if (has_string_value()) {\n      if (string_value_ != &::google::protobuf::internal::kEmptyString) {\n        string_value_->clear();\n      }\n    }\n    if (has_aggregate_value()) {\n      if (aggregate_value_ != &::google::protobuf::internal::kEmptyString) {\n        aggregate_value_->clear();\n      }\n    }\n  }\n  name_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool UninterpretedOption::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_name:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_name()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(18)) goto parse_name;\n        if (input->ExpectTag(26)) goto parse_identifier_value;\n        break;\n      }\n      \n      // optional string identifier_value = 3;\n      case 3: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_identifier_value:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_identifier_value()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->identifier_value().data(), this->identifier_value().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(32)) goto parse_positive_int_value;\n        break;\n      }\n      \n      // optional uint64 positive_int_value = 4;\n      case 4: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_positive_int_value:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>(\n                 input, &positive_int_value_)));\n          set_has_positive_int_value();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(40)) goto parse_negative_int_value;\n        break;\n      }\n      \n      // optional int64 negative_int_value = 5;\n      case 5: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {\n         parse_negative_int_value:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>(\n                 input, &negative_int_value_)));\n          set_has_negative_int_value();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(49)) goto parse_double_value;\n        break;\n      }\n      \n      // optional double double_value = 6;\n      case 6: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED64) {\n         parse_double_value:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n                   double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>(\n                 input, &double_value_)));\n          set_has_double_value();\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(58)) goto parse_string_value;\n        break;\n      }\n      \n      // optional bytes string_value = 7;\n      case 7: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_string_value:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadBytes(\n                input, this->mutable_string_value()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(66)) goto parse_aggregate_value;\n        break;\n      }\n      \n      // optional string aggregate_value = 8;\n      case 8: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_aggregate_value:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_aggregate_value()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->aggregate_value().data(), this->aggregate_value().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid UninterpretedOption::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;\n  for (int i = 0; i < this->name_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      2, this->name(i), output);\n  }\n  \n  // optional string identifier_value = 3;\n  if (has_identifier_value()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->identifier_value().data(), this->identifier_value().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      3, this->identifier_value(), output);\n  }\n  \n  // optional uint64 positive_int_value = 4;\n  if (has_positive_int_value()) {\n    ::google::protobuf::internal::WireFormatLite::WriteUInt64(4, this->positive_int_value(), output);\n  }\n  \n  // optional int64 negative_int_value = 5;\n  if (has_negative_int_value()) {\n    ::google::protobuf::internal::WireFormatLite::WriteInt64(5, this->negative_int_value(), output);\n  }\n  \n  // optional double double_value = 6;\n  if (has_double_value()) {\n    ::google::protobuf::internal::WireFormatLite::WriteDouble(6, this->double_value(), output);\n  }\n  \n  // optional bytes string_value = 7;\n  if (has_string_value()) {\n    ::google::protobuf::internal::WireFormatLite::WriteBytes(\n      7, this->string_value(), output);\n  }\n  \n  // optional string aggregate_value = 8;\n  if (has_aggregate_value()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->aggregate_value().data(), this->aggregate_value().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      8, this->aggregate_value(), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* UninterpretedOption::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;\n  for (int i = 0; i < this->name_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        2, this->name(i), target);\n  }\n  \n  // optional string identifier_value = 3;\n  if (has_identifier_value()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->identifier_value().data(), this->identifier_value().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        3, this->identifier_value(), target);\n  }\n  \n  // optional uint64 positive_int_value = 4;\n  if (has_positive_int_value()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(4, this->positive_int_value(), target);\n  }\n  \n  // optional int64 negative_int_value = 5;\n  if (has_negative_int_value()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteInt64ToArray(5, this->negative_int_value(), target);\n  }\n  \n  // optional double double_value = 6;\n  if (has_double_value()) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(6, this->double_value(), target);\n  }\n  \n  // optional bytes string_value = 7;\n  if (has_string_value()) {\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteBytesToArray(\n        7, this->string_value(), target);\n  }\n  \n  // optional string aggregate_value = 8;\n  if (has_aggregate_value()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->aggregate_value().data(), this->aggregate_value().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        8, this->aggregate_value(), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint UninterpretedOption::ByteSize() const {\n  int total_size = 0;\n  \n  if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) {\n    // optional string identifier_value = 3;\n    if (has_identifier_value()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->identifier_value());\n    }\n    \n    // optional uint64 positive_int_value = 4;\n    if (has_positive_int_value()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::UInt64Size(\n          this->positive_int_value());\n    }\n    \n    // optional int64 negative_int_value = 5;\n    if (has_negative_int_value()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::Int64Size(\n          this->negative_int_value());\n    }\n    \n    // optional double double_value = 6;\n    if (has_double_value()) {\n      total_size += 1 + 8;\n    }\n    \n    // optional bytes string_value = 7;\n    if (has_string_value()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::BytesSize(\n          this->string_value());\n    }\n    \n    // optional string aggregate_value = 8;\n    if (has_aggregate_value()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->aggregate_value());\n    }\n    \n  }\n  // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;\n  total_size += 1 * this->name_size();\n  for (int i = 0; i < this->name_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->name(i));\n  }\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid UninterpretedOption::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const UninterpretedOption* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const UninterpretedOption*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid UninterpretedOption::MergeFrom(const UninterpretedOption& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  name_.MergeFrom(from.name_);\n  if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) {\n    if (from.has_identifier_value()) {\n      set_identifier_value(from.identifier_value());\n    }\n    if (from.has_positive_int_value()) {\n      set_positive_int_value(from.positive_int_value());\n    }\n    if (from.has_negative_int_value()) {\n      set_negative_int_value(from.negative_int_value());\n    }\n    if (from.has_double_value()) {\n      set_double_value(from.double_value());\n    }\n    if (from.has_string_value()) {\n      set_string_value(from.string_value());\n    }\n    if (from.has_aggregate_value()) {\n      set_aggregate_value(from.aggregate_value());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid UninterpretedOption::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid UninterpretedOption::CopyFrom(const UninterpretedOption& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool UninterpretedOption::IsInitialized() const {\n  \n  for (int i = 0; i < name_size(); i++) {\n    if (!this->name(i).IsInitialized()) return false;\n  }\n  return true;\n}\n\nvoid UninterpretedOption::Swap(UninterpretedOption* other) {\n  if (other != this) {\n    name_.Swap(&other->name_);\n    std::swap(identifier_value_, other->identifier_value_);\n    std::swap(positive_int_value_, other->positive_int_value_);\n    std::swap(negative_int_value_, other->negative_int_value_);\n    std::swap(double_value_, other->double_value_);\n    std::swap(string_value_, other->string_value_);\n    std::swap(aggregate_value_, other->aggregate_value_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata UninterpretedOption::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = UninterpretedOption_descriptor_;\n  metadata.reflection = UninterpretedOption_reflection_;\n  return metadata;\n}\n\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int SourceCodeInfo_Location::kPathFieldNumber;\nconst int SourceCodeInfo_Location::kSpanFieldNumber;\n#endif  // !_MSC_VER\n\nSourceCodeInfo_Location::SourceCodeInfo_Location()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid SourceCodeInfo_Location::InitAsDefaultInstance() {\n}\n\nSourceCodeInfo_Location::SourceCodeInfo_Location(const SourceCodeInfo_Location& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid SourceCodeInfo_Location::SharedCtor() {\n  _cached_size_ = 0;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nSourceCodeInfo_Location::~SourceCodeInfo_Location() {\n  SharedDtor();\n}\n\nvoid SourceCodeInfo_Location::SharedDtor() {\n  if (this != default_instance_) {\n  }\n}\n\nvoid SourceCodeInfo_Location::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* SourceCodeInfo_Location::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return SourceCodeInfo_Location_descriptor_;\n}\n\nconst SourceCodeInfo_Location& SourceCodeInfo_Location::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nSourceCodeInfo_Location* SourceCodeInfo_Location::default_instance_ = NULL;\n\nSourceCodeInfo_Location* SourceCodeInfo_Location::New() const {\n  return new SourceCodeInfo_Location;\n}\n\nvoid SourceCodeInfo_Location::Clear() {\n  path_.Clear();\n  span_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool SourceCodeInfo_Location::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // repeated int32 path = 1 [packed = true];\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive<\n                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(\n                 input, this->mutable_path())));\n        } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag)\n                   == ::google::protobuf::internal::WireFormatLite::\n                      WIRETYPE_VARINT) {\n          DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline<\n                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(\n                 1, 10, input, this->mutable_path())));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(18)) goto parse_span;\n        break;\n      }\n      \n      // repeated int32 span = 2 [packed = true];\n      case 2: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_span:\n          DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive<\n                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(\n                 input, this->mutable_span())));\n        } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag)\n                   == ::google::protobuf::internal::WireFormatLite::\n                      WIRETYPE_VARINT) {\n          DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline<\n                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(\n                 1, 18, input, this->mutable_span())));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid SourceCodeInfo_Location::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // repeated int32 path = 1 [packed = true];\n  if (this->path_size() > 0) {\n    ::google::protobuf::internal::WireFormatLite::WriteTag(1, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);\n    output->WriteVarint32(_path_cached_byte_size_);\n  }\n  for (int i = 0; i < this->path_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag(\n      this->path(i), output);\n  }\n  \n  // repeated int32 span = 2 [packed = true];\n  if (this->span_size() > 0) {\n    ::google::protobuf::internal::WireFormatLite::WriteTag(2, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);\n    output->WriteVarint32(_span_cached_byte_size_);\n  }\n  for (int i = 0; i < this->span_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag(\n      this->span(i), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* SourceCodeInfo_Location::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // repeated int32 path = 1 [packed = true];\n  if (this->path_size() > 0) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray(\n      1,\n      ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n      target);\n    target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(\n      _path_cached_byte_size_, target);\n  }\n  for (int i = 0; i < this->path_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteInt32NoTagToArray(this->path(i), target);\n  }\n  \n  // repeated int32 span = 2 [packed = true];\n  if (this->span_size() > 0) {\n    target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray(\n      2,\n      ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n      target);\n    target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(\n      _span_cached_byte_size_, target);\n  }\n  for (int i = 0; i < this->span_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteInt32NoTagToArray(this->span(i), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint SourceCodeInfo_Location::ByteSize() const {\n  int total_size = 0;\n  \n  // repeated int32 path = 1 [packed = true];\n  {\n    int data_size = 0;\n    for (int i = 0; i < this->path_size(); i++) {\n      data_size += ::google::protobuf::internal::WireFormatLite::\n        Int32Size(this->path(i));\n    }\n    if (data_size > 0) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);\n    }\n    _path_cached_byte_size_ = data_size;\n    total_size += data_size;\n  }\n  \n  // repeated int32 span = 2 [packed = true];\n  {\n    int data_size = 0;\n    for (int i = 0; i < this->span_size(); i++) {\n      data_size += ::google::protobuf::internal::WireFormatLite::\n        Int32Size(this->span(i));\n    }\n    if (data_size > 0) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);\n    }\n    _span_cached_byte_size_ = data_size;\n    total_size += data_size;\n  }\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid SourceCodeInfo_Location::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const SourceCodeInfo_Location* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const SourceCodeInfo_Location*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid SourceCodeInfo_Location::MergeFrom(const SourceCodeInfo_Location& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  path_.MergeFrom(from.path_);\n  span_.MergeFrom(from.span_);\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid SourceCodeInfo_Location::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid SourceCodeInfo_Location::CopyFrom(const SourceCodeInfo_Location& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool SourceCodeInfo_Location::IsInitialized() const {\n  \n  return true;\n}\n\nvoid SourceCodeInfo_Location::Swap(SourceCodeInfo_Location* other) {\n  if (other != this) {\n    path_.Swap(&other->path_);\n    span_.Swap(&other->span_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata SourceCodeInfo_Location::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = SourceCodeInfo_Location_descriptor_;\n  metadata.reflection = SourceCodeInfo_Location_reflection_;\n  return metadata;\n}\n\n\n// -------------------------------------------------------------------\n\n#ifndef _MSC_VER\nconst int SourceCodeInfo::kLocationFieldNumber;\n#endif  // !_MSC_VER\n\nSourceCodeInfo::SourceCodeInfo()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid SourceCodeInfo::InitAsDefaultInstance() {\n}\n\nSourceCodeInfo::SourceCodeInfo(const SourceCodeInfo& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid SourceCodeInfo::SharedCtor() {\n  _cached_size_ = 0;\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nSourceCodeInfo::~SourceCodeInfo() {\n  SharedDtor();\n}\n\nvoid SourceCodeInfo::SharedDtor() {\n  if (this != default_instance_) {\n  }\n}\n\nvoid SourceCodeInfo::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* SourceCodeInfo::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return SourceCodeInfo_descriptor_;\n}\n\nconst SourceCodeInfo& SourceCodeInfo::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();  return *default_instance_;\n}\n\nSourceCodeInfo* SourceCodeInfo::default_instance_ = NULL;\n\nSourceCodeInfo* SourceCodeInfo::New() const {\n  return new SourceCodeInfo;\n}\n\nvoid SourceCodeInfo::Clear() {\n  location_.Clear();\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool SourceCodeInfo::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // repeated .google.protobuf.SourceCodeInfo.Location location = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n         parse_location:\n          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n                input, add_location()));\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectTag(10)) goto parse_location;\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n      \n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid SourceCodeInfo::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // repeated .google.protobuf.SourceCodeInfo.Location location = 1;\n  for (int i = 0; i < this->location_size(); i++) {\n    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(\n      1, this->location(i), output);\n  }\n  \n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* SourceCodeInfo::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // repeated .google.protobuf.SourceCodeInfo.Location location = 1;\n  for (int i = 0; i < this->location_size(); i++) {\n    target = ::google::protobuf::internal::WireFormatLite::\n      WriteMessageNoVirtualToArray(\n        1, this->location(i), target);\n  }\n  \n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint SourceCodeInfo::ByteSize() const {\n  int total_size = 0;\n  \n  // repeated .google.protobuf.SourceCodeInfo.Location location = 1;\n  total_size += 1 * this->location_size();\n  for (int i = 0; i < this->location_size(); i++) {\n    total_size +=\n      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(\n        this->location(i));\n  }\n  \n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid SourceCodeInfo::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const SourceCodeInfo* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const SourceCodeInfo*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid SourceCodeInfo::MergeFrom(const SourceCodeInfo& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  location_.MergeFrom(from.location_);\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid SourceCodeInfo::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid SourceCodeInfo::CopyFrom(const SourceCodeInfo& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool SourceCodeInfo::IsInitialized() const {\n  \n  return true;\n}\n\nvoid SourceCodeInfo::Swap(SourceCodeInfo* other) {\n  if (other != this) {\n    location_.Swap(&other->location_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata SourceCodeInfo::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = SourceCodeInfo_descriptor_;\n  metadata.reflection = SourceCodeInfo_reflection_;\n  return metadata;\n}\n\n\n// @@protoc_insertion_point(namespace_scope)\n\n}  // namespace protobuf\n}  // namespace google\n\n// @@protoc_insertion_point(global_scope)\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.h",
    "content": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n// source: google/protobuf/descriptor.proto\n\n#ifndef PROTOBUF_google_2fprotobuf_2fdescriptor_2eproto__INCLUDED\n#define PROTOBUF_google_2fprotobuf_2fdescriptor_2eproto__INCLUDED\n\n#include <string>\n\n#include <google/protobuf/stubs/common.h>\n\n#if GOOGLE_PROTOBUF_VERSION < 2004000\n#error This file was generated by a newer version of protoc which is\n#error incompatible with your Protocol Buffer headers.  Please update\n#error your headers.\n#endif\n#if 2004002 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION\n#error This file was generated by an older version of protoc which is\n#error incompatible with your Protocol Buffer headers.  Please\n#error regenerate this file with a newer version of protoc.\n#endif\n\n#include <google/protobuf/generated_message_util.h>\n#include <google/protobuf/repeated_field.h>\n#include <google/protobuf/extension_set.h>\n#include <google/protobuf/generated_message_reflection.h>\n// @@protoc_insertion_point(includes)\n\nnamespace google {\nnamespace protobuf {\n\n// Internal implementation detail -- do not call these.\nvoid LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\nvoid protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\nvoid protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n\nclass FileDescriptorSet;\nclass FileDescriptorProto;\nclass DescriptorProto;\nclass DescriptorProto_ExtensionRange;\nclass FieldDescriptorProto;\nclass EnumDescriptorProto;\nclass EnumValueDescriptorProto;\nclass ServiceDescriptorProto;\nclass MethodDescriptorProto;\nclass FileOptions;\nclass MessageOptions;\nclass FieldOptions;\nclass EnumOptions;\nclass EnumValueOptions;\nclass ServiceOptions;\nclass MethodOptions;\nclass UninterpretedOption;\nclass UninterpretedOption_NamePart;\nclass SourceCodeInfo;\nclass SourceCodeInfo_Location;\n\nenum FieldDescriptorProto_Type {\n  FieldDescriptorProto_Type_TYPE_DOUBLE = 1,\n  FieldDescriptorProto_Type_TYPE_FLOAT = 2,\n  FieldDescriptorProto_Type_TYPE_INT64 = 3,\n  FieldDescriptorProto_Type_TYPE_UINT64 = 4,\n  FieldDescriptorProto_Type_TYPE_INT32 = 5,\n  FieldDescriptorProto_Type_TYPE_FIXED64 = 6,\n  FieldDescriptorProto_Type_TYPE_FIXED32 = 7,\n  FieldDescriptorProto_Type_TYPE_BOOL = 8,\n  FieldDescriptorProto_Type_TYPE_STRING = 9,\n  FieldDescriptorProto_Type_TYPE_GROUP = 10,\n  FieldDescriptorProto_Type_TYPE_MESSAGE = 11,\n  FieldDescriptorProto_Type_TYPE_BYTES = 12,\n  FieldDescriptorProto_Type_TYPE_UINT32 = 13,\n  FieldDescriptorProto_Type_TYPE_ENUM = 14,\n  FieldDescriptorProto_Type_TYPE_SFIXED32 = 15,\n  FieldDescriptorProto_Type_TYPE_SFIXED64 = 16,\n  FieldDescriptorProto_Type_TYPE_SINT32 = 17,\n  FieldDescriptorProto_Type_TYPE_SINT64 = 18\n};\nLIBPROTOBUF_EXPORT bool FieldDescriptorProto_Type_IsValid(int value);\nconst FieldDescriptorProto_Type FieldDescriptorProto_Type_Type_MIN = FieldDescriptorProto_Type_TYPE_DOUBLE;\nconst FieldDescriptorProto_Type FieldDescriptorProto_Type_Type_MAX = FieldDescriptorProto_Type_TYPE_SINT64;\nconst int FieldDescriptorProto_Type_Type_ARRAYSIZE = FieldDescriptorProto_Type_Type_MAX + 1;\n\nLIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Type_descriptor();\ninline const ::std::string& FieldDescriptorProto_Type_Name(FieldDescriptorProto_Type value) {\n  return ::google::protobuf::internal::NameOfEnum(\n    FieldDescriptorProto_Type_descriptor(), value);\n}\ninline bool FieldDescriptorProto_Type_Parse(\n    const ::std::string& name, FieldDescriptorProto_Type* value) {\n  return ::google::protobuf::internal::ParseNamedEnum<FieldDescriptorProto_Type>(\n    FieldDescriptorProto_Type_descriptor(), name, value);\n}\nenum FieldDescriptorProto_Label {\n  FieldDescriptorProto_Label_LABEL_OPTIONAL = 1,\n  FieldDescriptorProto_Label_LABEL_REQUIRED = 2,\n  FieldDescriptorProto_Label_LABEL_REPEATED = 3\n};\nLIBPROTOBUF_EXPORT bool FieldDescriptorProto_Label_IsValid(int value);\nconst FieldDescriptorProto_Label FieldDescriptorProto_Label_Label_MIN = FieldDescriptorProto_Label_LABEL_OPTIONAL;\nconst FieldDescriptorProto_Label FieldDescriptorProto_Label_Label_MAX = FieldDescriptorProto_Label_LABEL_REPEATED;\nconst int FieldDescriptorProto_Label_Label_ARRAYSIZE = FieldDescriptorProto_Label_Label_MAX + 1;\n\nLIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Label_descriptor();\ninline const ::std::string& FieldDescriptorProto_Label_Name(FieldDescriptorProto_Label value) {\n  return ::google::protobuf::internal::NameOfEnum(\n    FieldDescriptorProto_Label_descriptor(), value);\n}\ninline bool FieldDescriptorProto_Label_Parse(\n    const ::std::string& name, FieldDescriptorProto_Label* value) {\n  return ::google::protobuf::internal::ParseNamedEnum<FieldDescriptorProto_Label>(\n    FieldDescriptorProto_Label_descriptor(), name, value);\n}\nenum FileOptions_OptimizeMode {\n  FileOptions_OptimizeMode_SPEED = 1,\n  FileOptions_OptimizeMode_CODE_SIZE = 2,\n  FileOptions_OptimizeMode_LITE_RUNTIME = 3\n};\nLIBPROTOBUF_EXPORT bool FileOptions_OptimizeMode_IsValid(int value);\nconst FileOptions_OptimizeMode FileOptions_OptimizeMode_OptimizeMode_MIN = FileOptions_OptimizeMode_SPEED;\nconst FileOptions_OptimizeMode FileOptions_OptimizeMode_OptimizeMode_MAX = FileOptions_OptimizeMode_LITE_RUNTIME;\nconst int FileOptions_OptimizeMode_OptimizeMode_ARRAYSIZE = FileOptions_OptimizeMode_OptimizeMode_MAX + 1;\n\nLIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor();\ninline const ::std::string& FileOptions_OptimizeMode_Name(FileOptions_OptimizeMode value) {\n  return ::google::protobuf::internal::NameOfEnum(\n    FileOptions_OptimizeMode_descriptor(), value);\n}\ninline bool FileOptions_OptimizeMode_Parse(\n    const ::std::string& name, FileOptions_OptimizeMode* value) {\n  return ::google::protobuf::internal::ParseNamedEnum<FileOptions_OptimizeMode>(\n    FileOptions_OptimizeMode_descriptor(), name, value);\n}\nenum FieldOptions_CType {\n  FieldOptions_CType_STRING = 0,\n  FieldOptions_CType_CORD = 1,\n  FieldOptions_CType_STRING_PIECE = 2\n};\nLIBPROTOBUF_EXPORT bool FieldOptions_CType_IsValid(int value);\nconst FieldOptions_CType FieldOptions_CType_CType_MIN = FieldOptions_CType_STRING;\nconst FieldOptions_CType FieldOptions_CType_CType_MAX = FieldOptions_CType_STRING_PIECE;\nconst int FieldOptions_CType_CType_ARRAYSIZE = FieldOptions_CType_CType_MAX + 1;\n\nLIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor();\ninline const ::std::string& FieldOptions_CType_Name(FieldOptions_CType value) {\n  return ::google::protobuf::internal::NameOfEnum(\n    FieldOptions_CType_descriptor(), value);\n}\ninline bool FieldOptions_CType_Parse(\n    const ::std::string& name, FieldOptions_CType* value) {\n  return ::google::protobuf::internal::ParseNamedEnum<FieldOptions_CType>(\n    FieldOptions_CType_descriptor(), name, value);\n}\n// ===================================================================\n\nclass LIBPROTOBUF_EXPORT FileDescriptorSet : public ::google::protobuf::Message {\n public:\n  FileDescriptorSet();\n  virtual ~FileDescriptorSet();\n  \n  FileDescriptorSet(const FileDescriptorSet& from);\n  \n  inline FileDescriptorSet& operator=(const FileDescriptorSet& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const FileDescriptorSet& default_instance();\n  \n  void Swap(FileDescriptorSet* other);\n  \n  // implements Message ----------------------------------------------\n  \n  FileDescriptorSet* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const FileDescriptorSet& from);\n  void MergeFrom(const FileDescriptorSet& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // repeated .google.protobuf.FileDescriptorProto file = 1;\n  inline int file_size() const;\n  inline void clear_file();\n  static const int kFileFieldNumber = 1;\n  inline const ::google::protobuf::FileDescriptorProto& file(int index) const;\n  inline ::google::protobuf::FileDescriptorProto* mutable_file(int index);\n  inline ::google::protobuf::FileDescriptorProto* add_file();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >&\n      file() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >*\n      mutable_file();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorSet)\n private:\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto > file_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static FileDescriptorSet* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT FileDescriptorProto : public ::google::protobuf::Message {\n public:\n  FileDescriptorProto();\n  virtual ~FileDescriptorProto();\n  \n  FileDescriptorProto(const FileDescriptorProto& from);\n  \n  inline FileDescriptorProto& operator=(const FileDescriptorProto& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const FileDescriptorProto& default_instance();\n  \n  void Swap(FileDescriptorProto* other);\n  \n  // implements Message ----------------------------------------------\n  \n  FileDescriptorProto* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const FileDescriptorProto& from);\n  void MergeFrom(const FileDescriptorProto& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // optional string name = 1;\n  inline bool has_name() const;\n  inline void clear_name();\n  static const int kNameFieldNumber = 1;\n  inline const ::std::string& name() const;\n  inline void set_name(const ::std::string& value);\n  inline void set_name(const char* value);\n  inline void set_name(const char* value, size_t size);\n  inline ::std::string* mutable_name();\n  inline ::std::string* release_name();\n  \n  // optional string package = 2;\n  inline bool has_package() const;\n  inline void clear_package();\n  static const int kPackageFieldNumber = 2;\n  inline const ::std::string& package() const;\n  inline void set_package(const ::std::string& value);\n  inline void set_package(const char* value);\n  inline void set_package(const char* value, size_t size);\n  inline ::std::string* mutable_package();\n  inline ::std::string* release_package();\n  \n  // repeated string dependency = 3;\n  inline int dependency_size() const;\n  inline void clear_dependency();\n  static const int kDependencyFieldNumber = 3;\n  inline const ::std::string& dependency(int index) const;\n  inline ::std::string* mutable_dependency(int index);\n  inline void set_dependency(int index, const ::std::string& value);\n  inline void set_dependency(int index, const char* value);\n  inline void set_dependency(int index, const char* value, size_t size);\n  inline ::std::string* add_dependency();\n  inline void add_dependency(const ::std::string& value);\n  inline void add_dependency(const char* value);\n  inline void add_dependency(const char* value, size_t size);\n  inline const ::google::protobuf::RepeatedPtrField< ::std::string>& dependency() const;\n  inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_dependency();\n  \n  // repeated .google.protobuf.DescriptorProto message_type = 4;\n  inline int message_type_size() const;\n  inline void clear_message_type();\n  static const int kMessageTypeFieldNumber = 4;\n  inline const ::google::protobuf::DescriptorProto& message_type(int index) const;\n  inline ::google::protobuf::DescriptorProto* mutable_message_type(int index);\n  inline ::google::protobuf::DescriptorProto* add_message_type();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >&\n      message_type() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >*\n      mutable_message_type();\n  \n  // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;\n  inline int enum_type_size() const;\n  inline void clear_enum_type();\n  static const int kEnumTypeFieldNumber = 5;\n  inline const ::google::protobuf::EnumDescriptorProto& enum_type(int index) const;\n  inline ::google::protobuf::EnumDescriptorProto* mutable_enum_type(int index);\n  inline ::google::protobuf::EnumDescriptorProto* add_enum_type();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >&\n      enum_type() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >*\n      mutable_enum_type();\n  \n  // repeated .google.protobuf.ServiceDescriptorProto service = 6;\n  inline int service_size() const;\n  inline void clear_service();\n  static const int kServiceFieldNumber = 6;\n  inline const ::google::protobuf::ServiceDescriptorProto& service(int index) const;\n  inline ::google::protobuf::ServiceDescriptorProto* mutable_service(int index);\n  inline ::google::protobuf::ServiceDescriptorProto* add_service();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >&\n      service() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >*\n      mutable_service();\n  \n  // repeated .google.protobuf.FieldDescriptorProto extension = 7;\n  inline int extension_size() const;\n  inline void clear_extension();\n  static const int kExtensionFieldNumber = 7;\n  inline const ::google::protobuf::FieldDescriptorProto& extension(int index) const;\n  inline ::google::protobuf::FieldDescriptorProto* mutable_extension(int index);\n  inline ::google::protobuf::FieldDescriptorProto* add_extension();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >&\n      extension() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >*\n      mutable_extension();\n  \n  // optional .google.protobuf.FileOptions options = 8;\n  inline bool has_options() const;\n  inline void clear_options();\n  static const int kOptionsFieldNumber = 8;\n  inline const ::google::protobuf::FileOptions& options() const;\n  inline ::google::protobuf::FileOptions* mutable_options();\n  inline ::google::protobuf::FileOptions* release_options();\n  \n  // optional .google.protobuf.SourceCodeInfo source_code_info = 9;\n  inline bool has_source_code_info() const;\n  inline void clear_source_code_info();\n  static const int kSourceCodeInfoFieldNumber = 9;\n  inline const ::google::protobuf::SourceCodeInfo& source_code_info() const;\n  inline ::google::protobuf::SourceCodeInfo* mutable_source_code_info();\n  inline ::google::protobuf::SourceCodeInfo* release_source_code_info();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorProto)\n private:\n  inline void set_has_name();\n  inline void clear_has_name();\n  inline void set_has_package();\n  inline void clear_has_package();\n  inline void set_has_options();\n  inline void clear_has_options();\n  inline void set_has_source_code_info();\n  inline void clear_has_source_code_info();\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::std::string* name_;\n  ::std::string* package_;\n  ::google::protobuf::RepeatedPtrField< ::std::string> dependency_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto > message_type_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto > enum_type_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto > service_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > extension_;\n  ::google::protobuf::FileOptions* options_;\n  ::google::protobuf::SourceCodeInfo* source_code_info_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(9 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static FileDescriptorProto* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT DescriptorProto_ExtensionRange : public ::google::protobuf::Message {\n public:\n  DescriptorProto_ExtensionRange();\n  virtual ~DescriptorProto_ExtensionRange();\n  \n  DescriptorProto_ExtensionRange(const DescriptorProto_ExtensionRange& from);\n  \n  inline DescriptorProto_ExtensionRange& operator=(const DescriptorProto_ExtensionRange& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const DescriptorProto_ExtensionRange& default_instance();\n  \n  void Swap(DescriptorProto_ExtensionRange* other);\n  \n  // implements Message ----------------------------------------------\n  \n  DescriptorProto_ExtensionRange* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const DescriptorProto_ExtensionRange& from);\n  void MergeFrom(const DescriptorProto_ExtensionRange& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // optional int32 start = 1;\n  inline bool has_start() const;\n  inline void clear_start();\n  static const int kStartFieldNumber = 1;\n  inline ::google::protobuf::int32 start() const;\n  inline void set_start(::google::protobuf::int32 value);\n  \n  // optional int32 end = 2;\n  inline bool has_end() const;\n  inline void clear_end();\n  static const int kEndFieldNumber = 2;\n  inline ::google::protobuf::int32 end() const;\n  inline void set_end(::google::protobuf::int32 value);\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto.ExtensionRange)\n private:\n  inline void set_has_start();\n  inline void clear_has_start();\n  inline void set_has_end();\n  inline void clear_has_end();\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::google::protobuf::int32 start_;\n  ::google::protobuf::int32 end_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static DescriptorProto_ExtensionRange* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT DescriptorProto : public ::google::protobuf::Message {\n public:\n  DescriptorProto();\n  virtual ~DescriptorProto();\n  \n  DescriptorProto(const DescriptorProto& from);\n  \n  inline DescriptorProto& operator=(const DescriptorProto& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const DescriptorProto& default_instance();\n  \n  void Swap(DescriptorProto* other);\n  \n  // implements Message ----------------------------------------------\n  \n  DescriptorProto* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const DescriptorProto& from);\n  void MergeFrom(const DescriptorProto& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  typedef DescriptorProto_ExtensionRange ExtensionRange;\n  \n  // accessors -------------------------------------------------------\n  \n  // optional string name = 1;\n  inline bool has_name() const;\n  inline void clear_name();\n  static const int kNameFieldNumber = 1;\n  inline const ::std::string& name() const;\n  inline void set_name(const ::std::string& value);\n  inline void set_name(const char* value);\n  inline void set_name(const char* value, size_t size);\n  inline ::std::string* mutable_name();\n  inline ::std::string* release_name();\n  \n  // repeated .google.protobuf.FieldDescriptorProto field = 2;\n  inline int field_size() const;\n  inline void clear_field();\n  static const int kFieldFieldNumber = 2;\n  inline const ::google::protobuf::FieldDescriptorProto& field(int index) const;\n  inline ::google::protobuf::FieldDescriptorProto* mutable_field(int index);\n  inline ::google::protobuf::FieldDescriptorProto* add_field();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >&\n      field() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >*\n      mutable_field();\n  \n  // repeated .google.protobuf.FieldDescriptorProto extension = 6;\n  inline int extension_size() const;\n  inline void clear_extension();\n  static const int kExtensionFieldNumber = 6;\n  inline const ::google::protobuf::FieldDescriptorProto& extension(int index) const;\n  inline ::google::protobuf::FieldDescriptorProto* mutable_extension(int index);\n  inline ::google::protobuf::FieldDescriptorProto* add_extension();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >&\n      extension() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >*\n      mutable_extension();\n  \n  // repeated .google.protobuf.DescriptorProto nested_type = 3;\n  inline int nested_type_size() const;\n  inline void clear_nested_type();\n  static const int kNestedTypeFieldNumber = 3;\n  inline const ::google::protobuf::DescriptorProto& nested_type(int index) const;\n  inline ::google::protobuf::DescriptorProto* mutable_nested_type(int index);\n  inline ::google::protobuf::DescriptorProto* add_nested_type();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >&\n      nested_type() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >*\n      mutable_nested_type();\n  \n  // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;\n  inline int enum_type_size() const;\n  inline void clear_enum_type();\n  static const int kEnumTypeFieldNumber = 4;\n  inline const ::google::protobuf::EnumDescriptorProto& enum_type(int index) const;\n  inline ::google::protobuf::EnumDescriptorProto* mutable_enum_type(int index);\n  inline ::google::protobuf::EnumDescriptorProto* add_enum_type();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >&\n      enum_type() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >*\n      mutable_enum_type();\n  \n  // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;\n  inline int extension_range_size() const;\n  inline void clear_extension_range();\n  static const int kExtensionRangeFieldNumber = 5;\n  inline const ::google::protobuf::DescriptorProto_ExtensionRange& extension_range(int index) const;\n  inline ::google::protobuf::DescriptorProto_ExtensionRange* mutable_extension_range(int index);\n  inline ::google::protobuf::DescriptorProto_ExtensionRange* add_extension_range();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >&\n      extension_range() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >*\n      mutable_extension_range();\n  \n  // optional .google.protobuf.MessageOptions options = 7;\n  inline bool has_options() const;\n  inline void clear_options();\n  static const int kOptionsFieldNumber = 7;\n  inline const ::google::protobuf::MessageOptions& options() const;\n  inline ::google::protobuf::MessageOptions* mutable_options();\n  inline ::google::protobuf::MessageOptions* release_options();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto)\n private:\n  inline void set_has_name();\n  inline void clear_has_name();\n  inline void set_has_options();\n  inline void clear_has_options();\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::std::string* name_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > field_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > extension_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto > nested_type_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto > enum_type_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange > extension_range_;\n  ::google::protobuf::MessageOptions* options_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(7 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static DescriptorProto* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT FieldDescriptorProto : public ::google::protobuf::Message {\n public:\n  FieldDescriptorProto();\n  virtual ~FieldDescriptorProto();\n  \n  FieldDescriptorProto(const FieldDescriptorProto& from);\n  \n  inline FieldDescriptorProto& operator=(const FieldDescriptorProto& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const FieldDescriptorProto& default_instance();\n  \n  void Swap(FieldDescriptorProto* other);\n  \n  // implements Message ----------------------------------------------\n  \n  FieldDescriptorProto* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const FieldDescriptorProto& from);\n  void MergeFrom(const FieldDescriptorProto& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  typedef FieldDescriptorProto_Type Type;\n  static const Type TYPE_DOUBLE = FieldDescriptorProto_Type_TYPE_DOUBLE;\n  static const Type TYPE_FLOAT = FieldDescriptorProto_Type_TYPE_FLOAT;\n  static const Type TYPE_INT64 = FieldDescriptorProto_Type_TYPE_INT64;\n  static const Type TYPE_UINT64 = FieldDescriptorProto_Type_TYPE_UINT64;\n  static const Type TYPE_INT32 = FieldDescriptorProto_Type_TYPE_INT32;\n  static const Type TYPE_FIXED64 = FieldDescriptorProto_Type_TYPE_FIXED64;\n  static const Type TYPE_FIXED32 = FieldDescriptorProto_Type_TYPE_FIXED32;\n  static const Type TYPE_BOOL = FieldDescriptorProto_Type_TYPE_BOOL;\n  static const Type TYPE_STRING = FieldDescriptorProto_Type_TYPE_STRING;\n  static const Type TYPE_GROUP = FieldDescriptorProto_Type_TYPE_GROUP;\n  static const Type TYPE_MESSAGE = FieldDescriptorProto_Type_TYPE_MESSAGE;\n  static const Type TYPE_BYTES = FieldDescriptorProto_Type_TYPE_BYTES;\n  static const Type TYPE_UINT32 = FieldDescriptorProto_Type_TYPE_UINT32;\n  static const Type TYPE_ENUM = FieldDescriptorProto_Type_TYPE_ENUM;\n  static const Type TYPE_SFIXED32 = FieldDescriptorProto_Type_TYPE_SFIXED32;\n  static const Type TYPE_SFIXED64 = FieldDescriptorProto_Type_TYPE_SFIXED64;\n  static const Type TYPE_SINT32 = FieldDescriptorProto_Type_TYPE_SINT32;\n  static const Type TYPE_SINT64 = FieldDescriptorProto_Type_TYPE_SINT64;\n  static inline bool Type_IsValid(int value) {\n    return FieldDescriptorProto_Type_IsValid(value);\n  }\n  static const Type Type_MIN =\n    FieldDescriptorProto_Type_Type_MIN;\n  static const Type Type_MAX =\n    FieldDescriptorProto_Type_Type_MAX;\n  static const int Type_ARRAYSIZE =\n    FieldDescriptorProto_Type_Type_ARRAYSIZE;\n  static inline const ::google::protobuf::EnumDescriptor*\n  Type_descriptor() {\n    return FieldDescriptorProto_Type_descriptor();\n  }\n  static inline const ::std::string& Type_Name(Type value) {\n    return FieldDescriptorProto_Type_Name(value);\n  }\n  static inline bool Type_Parse(const ::std::string& name,\n      Type* value) {\n    return FieldDescriptorProto_Type_Parse(name, value);\n  }\n  \n  typedef FieldDescriptorProto_Label Label;\n  static const Label LABEL_OPTIONAL = FieldDescriptorProto_Label_LABEL_OPTIONAL;\n  static const Label LABEL_REQUIRED = FieldDescriptorProto_Label_LABEL_REQUIRED;\n  static const Label LABEL_REPEATED = FieldDescriptorProto_Label_LABEL_REPEATED;\n  static inline bool Label_IsValid(int value) {\n    return FieldDescriptorProto_Label_IsValid(value);\n  }\n  static const Label Label_MIN =\n    FieldDescriptorProto_Label_Label_MIN;\n  static const Label Label_MAX =\n    FieldDescriptorProto_Label_Label_MAX;\n  static const int Label_ARRAYSIZE =\n    FieldDescriptorProto_Label_Label_ARRAYSIZE;\n  static inline const ::google::protobuf::EnumDescriptor*\n  Label_descriptor() {\n    return FieldDescriptorProto_Label_descriptor();\n  }\n  static inline const ::std::string& Label_Name(Label value) {\n    return FieldDescriptorProto_Label_Name(value);\n  }\n  static inline bool Label_Parse(const ::std::string& name,\n      Label* value) {\n    return FieldDescriptorProto_Label_Parse(name, value);\n  }\n  \n  // accessors -------------------------------------------------------\n  \n  // optional string name = 1;\n  inline bool has_name() const;\n  inline void clear_name();\n  static const int kNameFieldNumber = 1;\n  inline const ::std::string& name() const;\n  inline void set_name(const ::std::string& value);\n  inline void set_name(const char* value);\n  inline void set_name(const char* value, size_t size);\n  inline ::std::string* mutable_name();\n  inline ::std::string* release_name();\n  \n  // optional int32 number = 3;\n  inline bool has_number() const;\n  inline void clear_number();\n  static const int kNumberFieldNumber = 3;\n  inline ::google::protobuf::int32 number() const;\n  inline void set_number(::google::protobuf::int32 value);\n  \n  // optional .google.protobuf.FieldDescriptorProto.Label label = 4;\n  inline bool has_label() const;\n  inline void clear_label();\n  static const int kLabelFieldNumber = 4;\n  inline ::google::protobuf::FieldDescriptorProto_Label label() const;\n  inline void set_label(::google::protobuf::FieldDescriptorProto_Label value);\n  \n  // optional .google.protobuf.FieldDescriptorProto.Type type = 5;\n  inline bool has_type() const;\n  inline void clear_type();\n  static const int kTypeFieldNumber = 5;\n  inline ::google::protobuf::FieldDescriptorProto_Type type() const;\n  inline void set_type(::google::protobuf::FieldDescriptorProto_Type value);\n  \n  // optional string type_name = 6;\n  inline bool has_type_name() const;\n  inline void clear_type_name();\n  static const int kTypeNameFieldNumber = 6;\n  inline const ::std::string& type_name() const;\n  inline void set_type_name(const ::std::string& value);\n  inline void set_type_name(const char* value);\n  inline void set_type_name(const char* value, size_t size);\n  inline ::std::string* mutable_type_name();\n  inline ::std::string* release_type_name();\n  \n  // optional string extendee = 2;\n  inline bool has_extendee() const;\n  inline void clear_extendee();\n  static const int kExtendeeFieldNumber = 2;\n  inline const ::std::string& extendee() const;\n  inline void set_extendee(const ::std::string& value);\n  inline void set_extendee(const char* value);\n  inline void set_extendee(const char* value, size_t size);\n  inline ::std::string* mutable_extendee();\n  inline ::std::string* release_extendee();\n  \n  // optional string default_value = 7;\n  inline bool has_default_value() const;\n  inline void clear_default_value();\n  static const int kDefaultValueFieldNumber = 7;\n  inline const ::std::string& default_value() const;\n  inline void set_default_value(const ::std::string& value);\n  inline void set_default_value(const char* value);\n  inline void set_default_value(const char* value, size_t size);\n  inline ::std::string* mutable_default_value();\n  inline ::std::string* release_default_value();\n  \n  // optional .google.protobuf.FieldOptions options = 8;\n  inline bool has_options() const;\n  inline void clear_options();\n  static const int kOptionsFieldNumber = 8;\n  inline const ::google::protobuf::FieldOptions& options() const;\n  inline ::google::protobuf::FieldOptions* mutable_options();\n  inline ::google::protobuf::FieldOptions* release_options();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.FieldDescriptorProto)\n private:\n  inline void set_has_name();\n  inline void clear_has_name();\n  inline void set_has_number();\n  inline void clear_has_number();\n  inline void set_has_label();\n  inline void clear_has_label();\n  inline void set_has_type();\n  inline void clear_has_type();\n  inline void set_has_type_name();\n  inline void clear_has_type_name();\n  inline void set_has_extendee();\n  inline void clear_has_extendee();\n  inline void set_has_default_value();\n  inline void clear_has_default_value();\n  inline void set_has_options();\n  inline void clear_has_options();\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::std::string* name_;\n  ::google::protobuf::int32 number_;\n  int label_;\n  ::std::string* type_name_;\n  ::std::string* extendee_;\n  ::std::string* default_value_;\n  ::google::protobuf::FieldOptions* options_;\n  int type_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(8 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static FieldDescriptorProto* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT EnumDescriptorProto : public ::google::protobuf::Message {\n public:\n  EnumDescriptorProto();\n  virtual ~EnumDescriptorProto();\n  \n  EnumDescriptorProto(const EnumDescriptorProto& from);\n  \n  inline EnumDescriptorProto& operator=(const EnumDescriptorProto& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const EnumDescriptorProto& default_instance();\n  \n  void Swap(EnumDescriptorProto* other);\n  \n  // implements Message ----------------------------------------------\n  \n  EnumDescriptorProto* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const EnumDescriptorProto& from);\n  void MergeFrom(const EnumDescriptorProto& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // optional string name = 1;\n  inline bool has_name() const;\n  inline void clear_name();\n  static const int kNameFieldNumber = 1;\n  inline const ::std::string& name() const;\n  inline void set_name(const ::std::string& value);\n  inline void set_name(const char* value);\n  inline void set_name(const char* value, size_t size);\n  inline ::std::string* mutable_name();\n  inline ::std::string* release_name();\n  \n  // repeated .google.protobuf.EnumValueDescriptorProto value = 2;\n  inline int value_size() const;\n  inline void clear_value();\n  static const int kValueFieldNumber = 2;\n  inline const ::google::protobuf::EnumValueDescriptorProto& value(int index) const;\n  inline ::google::protobuf::EnumValueDescriptorProto* mutable_value(int index);\n  inline ::google::protobuf::EnumValueDescriptorProto* add_value();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >&\n      value() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >*\n      mutable_value();\n  \n  // optional .google.protobuf.EnumOptions options = 3;\n  inline bool has_options() const;\n  inline void clear_options();\n  static const int kOptionsFieldNumber = 3;\n  inline const ::google::protobuf::EnumOptions& options() const;\n  inline ::google::protobuf::EnumOptions* mutable_options();\n  inline ::google::protobuf::EnumOptions* release_options();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.EnumDescriptorProto)\n private:\n  inline void set_has_name();\n  inline void clear_has_name();\n  inline void set_has_options();\n  inline void clear_has_options();\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::std::string* name_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto > value_;\n  ::google::protobuf::EnumOptions* options_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static EnumDescriptorProto* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT EnumValueDescriptorProto : public ::google::protobuf::Message {\n public:\n  EnumValueDescriptorProto();\n  virtual ~EnumValueDescriptorProto();\n  \n  EnumValueDescriptorProto(const EnumValueDescriptorProto& from);\n  \n  inline EnumValueDescriptorProto& operator=(const EnumValueDescriptorProto& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const EnumValueDescriptorProto& default_instance();\n  \n  void Swap(EnumValueDescriptorProto* other);\n  \n  // implements Message ----------------------------------------------\n  \n  EnumValueDescriptorProto* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const EnumValueDescriptorProto& from);\n  void MergeFrom(const EnumValueDescriptorProto& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // optional string name = 1;\n  inline bool has_name() const;\n  inline void clear_name();\n  static const int kNameFieldNumber = 1;\n  inline const ::std::string& name() const;\n  inline void set_name(const ::std::string& value);\n  inline void set_name(const char* value);\n  inline void set_name(const char* value, size_t size);\n  inline ::std::string* mutable_name();\n  inline ::std::string* release_name();\n  \n  // optional int32 number = 2;\n  inline bool has_number() const;\n  inline void clear_number();\n  static const int kNumberFieldNumber = 2;\n  inline ::google::protobuf::int32 number() const;\n  inline void set_number(::google::protobuf::int32 value);\n  \n  // optional .google.protobuf.EnumValueOptions options = 3;\n  inline bool has_options() const;\n  inline void clear_options();\n  static const int kOptionsFieldNumber = 3;\n  inline const ::google::protobuf::EnumValueOptions& options() const;\n  inline ::google::protobuf::EnumValueOptions* mutable_options();\n  inline ::google::protobuf::EnumValueOptions* release_options();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.EnumValueDescriptorProto)\n private:\n  inline void set_has_name();\n  inline void clear_has_name();\n  inline void set_has_number();\n  inline void clear_has_number();\n  inline void set_has_options();\n  inline void clear_has_options();\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::std::string* name_;\n  ::google::protobuf::EnumValueOptions* options_;\n  ::google::protobuf::int32 number_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static EnumValueDescriptorProto* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT ServiceDescriptorProto : public ::google::protobuf::Message {\n public:\n  ServiceDescriptorProto();\n  virtual ~ServiceDescriptorProto();\n  \n  ServiceDescriptorProto(const ServiceDescriptorProto& from);\n  \n  inline ServiceDescriptorProto& operator=(const ServiceDescriptorProto& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const ServiceDescriptorProto& default_instance();\n  \n  void Swap(ServiceDescriptorProto* other);\n  \n  // implements Message ----------------------------------------------\n  \n  ServiceDescriptorProto* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const ServiceDescriptorProto& from);\n  void MergeFrom(const ServiceDescriptorProto& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // optional string name = 1;\n  inline bool has_name() const;\n  inline void clear_name();\n  static const int kNameFieldNumber = 1;\n  inline const ::std::string& name() const;\n  inline void set_name(const ::std::string& value);\n  inline void set_name(const char* value);\n  inline void set_name(const char* value, size_t size);\n  inline ::std::string* mutable_name();\n  inline ::std::string* release_name();\n  \n  // repeated .google.protobuf.MethodDescriptorProto method = 2;\n  inline int method_size() const;\n  inline void clear_method();\n  static const int kMethodFieldNumber = 2;\n  inline const ::google::protobuf::MethodDescriptorProto& method(int index) const;\n  inline ::google::protobuf::MethodDescriptorProto* mutable_method(int index);\n  inline ::google::protobuf::MethodDescriptorProto* add_method();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >&\n      method() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >*\n      mutable_method();\n  \n  // optional .google.protobuf.ServiceOptions options = 3;\n  inline bool has_options() const;\n  inline void clear_options();\n  static const int kOptionsFieldNumber = 3;\n  inline const ::google::protobuf::ServiceOptions& options() const;\n  inline ::google::protobuf::ServiceOptions* mutable_options();\n  inline ::google::protobuf::ServiceOptions* release_options();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.ServiceDescriptorProto)\n private:\n  inline void set_has_name();\n  inline void clear_has_name();\n  inline void set_has_options();\n  inline void clear_has_options();\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::std::string* name_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto > method_;\n  ::google::protobuf::ServiceOptions* options_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static ServiceDescriptorProto* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT MethodDescriptorProto : public ::google::protobuf::Message {\n public:\n  MethodDescriptorProto();\n  virtual ~MethodDescriptorProto();\n  \n  MethodDescriptorProto(const MethodDescriptorProto& from);\n  \n  inline MethodDescriptorProto& operator=(const MethodDescriptorProto& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const MethodDescriptorProto& default_instance();\n  \n  void Swap(MethodDescriptorProto* other);\n  \n  // implements Message ----------------------------------------------\n  \n  MethodDescriptorProto* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const MethodDescriptorProto& from);\n  void MergeFrom(const MethodDescriptorProto& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // optional string name = 1;\n  inline bool has_name() const;\n  inline void clear_name();\n  static const int kNameFieldNumber = 1;\n  inline const ::std::string& name() const;\n  inline void set_name(const ::std::string& value);\n  inline void set_name(const char* value);\n  inline void set_name(const char* value, size_t size);\n  inline ::std::string* mutable_name();\n  inline ::std::string* release_name();\n  \n  // optional string input_type = 2;\n  inline bool has_input_type() const;\n  inline void clear_input_type();\n  static const int kInputTypeFieldNumber = 2;\n  inline const ::std::string& input_type() const;\n  inline void set_input_type(const ::std::string& value);\n  inline void set_input_type(const char* value);\n  inline void set_input_type(const char* value, size_t size);\n  inline ::std::string* mutable_input_type();\n  inline ::std::string* release_input_type();\n  \n  // optional string output_type = 3;\n  inline bool has_output_type() const;\n  inline void clear_output_type();\n  static const int kOutputTypeFieldNumber = 3;\n  inline const ::std::string& output_type() const;\n  inline void set_output_type(const ::std::string& value);\n  inline void set_output_type(const char* value);\n  inline void set_output_type(const char* value, size_t size);\n  inline ::std::string* mutable_output_type();\n  inline ::std::string* release_output_type();\n  \n  // optional .google.protobuf.MethodOptions options = 4;\n  inline bool has_options() const;\n  inline void clear_options();\n  static const int kOptionsFieldNumber = 4;\n  inline const ::google::protobuf::MethodOptions& options() const;\n  inline ::google::protobuf::MethodOptions* mutable_options();\n  inline ::google::protobuf::MethodOptions* release_options();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.MethodDescriptorProto)\n private:\n  inline void set_has_name();\n  inline void clear_has_name();\n  inline void set_has_input_type();\n  inline void clear_has_input_type();\n  inline void set_has_output_type();\n  inline void clear_has_output_type();\n  inline void set_has_options();\n  inline void clear_has_options();\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::std::string* name_;\n  ::std::string* input_type_;\n  ::std::string* output_type_;\n  ::google::protobuf::MethodOptions* options_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(4 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static MethodDescriptorProto* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT FileOptions : public ::google::protobuf::Message {\n public:\n  FileOptions();\n  virtual ~FileOptions();\n  \n  FileOptions(const FileOptions& from);\n  \n  inline FileOptions& operator=(const FileOptions& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const FileOptions& default_instance();\n  \n  void Swap(FileOptions* other);\n  \n  // implements Message ----------------------------------------------\n  \n  FileOptions* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const FileOptions& from);\n  void MergeFrom(const FileOptions& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  typedef FileOptions_OptimizeMode OptimizeMode;\n  static const OptimizeMode SPEED = FileOptions_OptimizeMode_SPEED;\n  static const OptimizeMode CODE_SIZE = FileOptions_OptimizeMode_CODE_SIZE;\n  static const OptimizeMode LITE_RUNTIME = FileOptions_OptimizeMode_LITE_RUNTIME;\n  static inline bool OptimizeMode_IsValid(int value) {\n    return FileOptions_OptimizeMode_IsValid(value);\n  }\n  static const OptimizeMode OptimizeMode_MIN =\n    FileOptions_OptimizeMode_OptimizeMode_MIN;\n  static const OptimizeMode OptimizeMode_MAX =\n    FileOptions_OptimizeMode_OptimizeMode_MAX;\n  static const int OptimizeMode_ARRAYSIZE =\n    FileOptions_OptimizeMode_OptimizeMode_ARRAYSIZE;\n  static inline const ::google::protobuf::EnumDescriptor*\n  OptimizeMode_descriptor() {\n    return FileOptions_OptimizeMode_descriptor();\n  }\n  static inline const ::std::string& OptimizeMode_Name(OptimizeMode value) {\n    return FileOptions_OptimizeMode_Name(value);\n  }\n  static inline bool OptimizeMode_Parse(const ::std::string& name,\n      OptimizeMode* value) {\n    return FileOptions_OptimizeMode_Parse(name, value);\n  }\n  \n  // accessors -------------------------------------------------------\n  \n  // optional string java_package = 1;\n  inline bool has_java_package() const;\n  inline void clear_java_package();\n  static const int kJavaPackageFieldNumber = 1;\n  inline const ::std::string& java_package() const;\n  inline void set_java_package(const ::std::string& value);\n  inline void set_java_package(const char* value);\n  inline void set_java_package(const char* value, size_t size);\n  inline ::std::string* mutable_java_package();\n  inline ::std::string* release_java_package();\n  \n  // optional string java_outer_classname = 8;\n  inline bool has_java_outer_classname() const;\n  inline void clear_java_outer_classname();\n  static const int kJavaOuterClassnameFieldNumber = 8;\n  inline const ::std::string& java_outer_classname() const;\n  inline void set_java_outer_classname(const ::std::string& value);\n  inline void set_java_outer_classname(const char* value);\n  inline void set_java_outer_classname(const char* value, size_t size);\n  inline ::std::string* mutable_java_outer_classname();\n  inline ::std::string* release_java_outer_classname();\n  \n  // optional bool java_multiple_files = 10 [default = false];\n  inline bool has_java_multiple_files() const;\n  inline void clear_java_multiple_files();\n  static const int kJavaMultipleFilesFieldNumber = 10;\n  inline bool java_multiple_files() const;\n  inline void set_java_multiple_files(bool value);\n  \n  // optional bool java_generate_equals_and_hash = 20 [default = false];\n  inline bool has_java_generate_equals_and_hash() const;\n  inline void clear_java_generate_equals_and_hash();\n  static const int kJavaGenerateEqualsAndHashFieldNumber = 20;\n  inline bool java_generate_equals_and_hash() const;\n  inline void set_java_generate_equals_and_hash(bool value);\n  \n  // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];\n  inline bool has_optimize_for() const;\n  inline void clear_optimize_for();\n  static const int kOptimizeForFieldNumber = 9;\n  inline ::google::protobuf::FileOptions_OptimizeMode optimize_for() const;\n  inline void set_optimize_for(::google::protobuf::FileOptions_OptimizeMode value);\n  \n  // optional bool cc_generic_services = 16 [default = false];\n  inline bool has_cc_generic_services() const;\n  inline void clear_cc_generic_services();\n  static const int kCcGenericServicesFieldNumber = 16;\n  inline bool cc_generic_services() const;\n  inline void set_cc_generic_services(bool value);\n  \n  // optional bool java_generic_services = 17 [default = false];\n  inline bool has_java_generic_services() const;\n  inline void clear_java_generic_services();\n  static const int kJavaGenericServicesFieldNumber = 17;\n  inline bool java_generic_services() const;\n  inline void set_java_generic_services(bool value);\n  \n  // optional bool py_generic_services = 18 [default = false];\n  inline bool has_py_generic_services() const;\n  inline void clear_py_generic_services();\n  static const int kPyGenericServicesFieldNumber = 18;\n  inline bool py_generic_services() const;\n  inline void set_py_generic_services(bool value);\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  inline int uninterpreted_option_size() const;\n  inline void clear_uninterpreted_option();\n  static const int kUninterpretedOptionFieldNumber = 999;\n  inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const;\n  inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index);\n  inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\n      uninterpreted_option() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\n      mutable_uninterpreted_option();\n  \n  GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(FileOptions)\n  // @@protoc_insertion_point(class_scope:google.protobuf.FileOptions)\n private:\n  inline void set_has_java_package();\n  inline void clear_has_java_package();\n  inline void set_has_java_outer_classname();\n  inline void clear_has_java_outer_classname();\n  inline void set_has_java_multiple_files();\n  inline void clear_has_java_multiple_files();\n  inline void set_has_java_generate_equals_and_hash();\n  inline void clear_has_java_generate_equals_and_hash();\n  inline void set_has_optimize_for();\n  inline void clear_has_optimize_for();\n  inline void set_has_cc_generic_services();\n  inline void clear_has_cc_generic_services();\n  inline void set_has_java_generic_services();\n  inline void clear_has_java_generic_services();\n  inline void set_has_py_generic_services();\n  inline void clear_has_py_generic_services();\n  \n  ::google::protobuf::internal::ExtensionSet _extensions_;\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::std::string* java_package_;\n  ::std::string* java_outer_classname_;\n  int optimize_for_;\n  bool java_multiple_files_;\n  bool java_generate_equals_and_hash_;\n  bool cc_generic_services_;\n  bool java_generic_services_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;\n  bool py_generic_services_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(9 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static FileOptions* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT MessageOptions : public ::google::protobuf::Message {\n public:\n  MessageOptions();\n  virtual ~MessageOptions();\n  \n  MessageOptions(const MessageOptions& from);\n  \n  inline MessageOptions& operator=(const MessageOptions& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const MessageOptions& default_instance();\n  \n  void Swap(MessageOptions* other);\n  \n  // implements Message ----------------------------------------------\n  \n  MessageOptions* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const MessageOptions& from);\n  void MergeFrom(const MessageOptions& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // optional bool message_set_wire_format = 1 [default = false];\n  inline bool has_message_set_wire_format() const;\n  inline void clear_message_set_wire_format();\n  static const int kMessageSetWireFormatFieldNumber = 1;\n  inline bool message_set_wire_format() const;\n  inline void set_message_set_wire_format(bool value);\n  \n  // optional bool no_standard_descriptor_accessor = 2 [default = false];\n  inline bool has_no_standard_descriptor_accessor() const;\n  inline void clear_no_standard_descriptor_accessor();\n  static const int kNoStandardDescriptorAccessorFieldNumber = 2;\n  inline bool no_standard_descriptor_accessor() const;\n  inline void set_no_standard_descriptor_accessor(bool value);\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  inline int uninterpreted_option_size() const;\n  inline void clear_uninterpreted_option();\n  static const int kUninterpretedOptionFieldNumber = 999;\n  inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const;\n  inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index);\n  inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\n      uninterpreted_option() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\n      mutable_uninterpreted_option();\n  \n  GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(MessageOptions)\n  // @@protoc_insertion_point(class_scope:google.protobuf.MessageOptions)\n private:\n  inline void set_has_message_set_wire_format();\n  inline void clear_has_message_set_wire_format();\n  inline void set_has_no_standard_descriptor_accessor();\n  inline void clear_has_no_standard_descriptor_accessor();\n  \n  ::google::protobuf::internal::ExtensionSet _extensions_;\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;\n  bool message_set_wire_format_;\n  bool no_standard_descriptor_accessor_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static MessageOptions* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT FieldOptions : public ::google::protobuf::Message {\n public:\n  FieldOptions();\n  virtual ~FieldOptions();\n  \n  FieldOptions(const FieldOptions& from);\n  \n  inline FieldOptions& operator=(const FieldOptions& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const FieldOptions& default_instance();\n  \n  void Swap(FieldOptions* other);\n  \n  // implements Message ----------------------------------------------\n  \n  FieldOptions* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const FieldOptions& from);\n  void MergeFrom(const FieldOptions& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  typedef FieldOptions_CType CType;\n  static const CType STRING = FieldOptions_CType_STRING;\n  static const CType CORD = FieldOptions_CType_CORD;\n  static const CType STRING_PIECE = FieldOptions_CType_STRING_PIECE;\n  static inline bool CType_IsValid(int value) {\n    return FieldOptions_CType_IsValid(value);\n  }\n  static const CType CType_MIN =\n    FieldOptions_CType_CType_MIN;\n  static const CType CType_MAX =\n    FieldOptions_CType_CType_MAX;\n  static const int CType_ARRAYSIZE =\n    FieldOptions_CType_CType_ARRAYSIZE;\n  static inline const ::google::protobuf::EnumDescriptor*\n  CType_descriptor() {\n    return FieldOptions_CType_descriptor();\n  }\n  static inline const ::std::string& CType_Name(CType value) {\n    return FieldOptions_CType_Name(value);\n  }\n  static inline bool CType_Parse(const ::std::string& name,\n      CType* value) {\n    return FieldOptions_CType_Parse(name, value);\n  }\n  \n  // accessors -------------------------------------------------------\n  \n  // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];\n  inline bool has_ctype() const;\n  inline void clear_ctype();\n  static const int kCtypeFieldNumber = 1;\n  inline ::google::protobuf::FieldOptions_CType ctype() const;\n  inline void set_ctype(::google::protobuf::FieldOptions_CType value);\n  \n  // optional bool packed = 2;\n  inline bool has_packed() const;\n  inline void clear_packed();\n  static const int kPackedFieldNumber = 2;\n  inline bool packed() const;\n  inline void set_packed(bool value);\n  \n  // optional bool deprecated = 3 [default = false];\n  inline bool has_deprecated() const;\n  inline void clear_deprecated();\n  static const int kDeprecatedFieldNumber = 3;\n  inline bool deprecated() const;\n  inline void set_deprecated(bool value);\n  \n  // optional string experimental_map_key = 9;\n  inline bool has_experimental_map_key() const;\n  inline void clear_experimental_map_key();\n  static const int kExperimentalMapKeyFieldNumber = 9;\n  inline const ::std::string& experimental_map_key() const;\n  inline void set_experimental_map_key(const ::std::string& value);\n  inline void set_experimental_map_key(const char* value);\n  inline void set_experimental_map_key(const char* value, size_t size);\n  inline ::std::string* mutable_experimental_map_key();\n  inline ::std::string* release_experimental_map_key();\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  inline int uninterpreted_option_size() const;\n  inline void clear_uninterpreted_option();\n  static const int kUninterpretedOptionFieldNumber = 999;\n  inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const;\n  inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index);\n  inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\n      uninterpreted_option() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\n      mutable_uninterpreted_option();\n  \n  GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(FieldOptions)\n  // @@protoc_insertion_point(class_scope:google.protobuf.FieldOptions)\n private:\n  inline void set_has_ctype();\n  inline void clear_has_ctype();\n  inline void set_has_packed();\n  inline void clear_has_packed();\n  inline void set_has_deprecated();\n  inline void clear_has_deprecated();\n  inline void set_has_experimental_map_key();\n  inline void clear_has_experimental_map_key();\n  \n  ::google::protobuf::internal::ExtensionSet _extensions_;\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  int ctype_;\n  bool packed_;\n  bool deprecated_;\n  ::std::string* experimental_map_key_;\n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(5 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static FieldOptions* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT EnumOptions : public ::google::protobuf::Message {\n public:\n  EnumOptions();\n  virtual ~EnumOptions();\n  \n  EnumOptions(const EnumOptions& from);\n  \n  inline EnumOptions& operator=(const EnumOptions& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const EnumOptions& default_instance();\n  \n  void Swap(EnumOptions* other);\n  \n  // implements Message ----------------------------------------------\n  \n  EnumOptions* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const EnumOptions& from);\n  void MergeFrom(const EnumOptions& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  inline int uninterpreted_option_size() const;\n  inline void clear_uninterpreted_option();\n  static const int kUninterpretedOptionFieldNumber = 999;\n  inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const;\n  inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index);\n  inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\n      uninterpreted_option() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\n      mutable_uninterpreted_option();\n  \n  GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(EnumOptions)\n  // @@protoc_insertion_point(class_scope:google.protobuf.EnumOptions)\n private:\n  \n  ::google::protobuf::internal::ExtensionSet _extensions_;\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static EnumOptions* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT EnumValueOptions : public ::google::protobuf::Message {\n public:\n  EnumValueOptions();\n  virtual ~EnumValueOptions();\n  \n  EnumValueOptions(const EnumValueOptions& from);\n  \n  inline EnumValueOptions& operator=(const EnumValueOptions& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const EnumValueOptions& default_instance();\n  \n  void Swap(EnumValueOptions* other);\n  \n  // implements Message ----------------------------------------------\n  \n  EnumValueOptions* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const EnumValueOptions& from);\n  void MergeFrom(const EnumValueOptions& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  inline int uninterpreted_option_size() const;\n  inline void clear_uninterpreted_option();\n  static const int kUninterpretedOptionFieldNumber = 999;\n  inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const;\n  inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index);\n  inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\n      uninterpreted_option() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\n      mutable_uninterpreted_option();\n  \n  GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(EnumValueOptions)\n  // @@protoc_insertion_point(class_scope:google.protobuf.EnumValueOptions)\n private:\n  \n  ::google::protobuf::internal::ExtensionSet _extensions_;\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static EnumValueOptions* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT ServiceOptions : public ::google::protobuf::Message {\n public:\n  ServiceOptions();\n  virtual ~ServiceOptions();\n  \n  ServiceOptions(const ServiceOptions& from);\n  \n  inline ServiceOptions& operator=(const ServiceOptions& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const ServiceOptions& default_instance();\n  \n  void Swap(ServiceOptions* other);\n  \n  // implements Message ----------------------------------------------\n  \n  ServiceOptions* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const ServiceOptions& from);\n  void MergeFrom(const ServiceOptions& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  inline int uninterpreted_option_size() const;\n  inline void clear_uninterpreted_option();\n  static const int kUninterpretedOptionFieldNumber = 999;\n  inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const;\n  inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index);\n  inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\n      uninterpreted_option() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\n      mutable_uninterpreted_option();\n  \n  GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(ServiceOptions)\n  // @@protoc_insertion_point(class_scope:google.protobuf.ServiceOptions)\n private:\n  \n  ::google::protobuf::internal::ExtensionSet _extensions_;\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static ServiceOptions* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT MethodOptions : public ::google::protobuf::Message {\n public:\n  MethodOptions();\n  virtual ~MethodOptions();\n  \n  MethodOptions(const MethodOptions& from);\n  \n  inline MethodOptions& operator=(const MethodOptions& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const MethodOptions& default_instance();\n  \n  void Swap(MethodOptions* other);\n  \n  // implements Message ----------------------------------------------\n  \n  MethodOptions* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const MethodOptions& from);\n  void MergeFrom(const MethodOptions& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\n  inline int uninterpreted_option_size() const;\n  inline void clear_uninterpreted_option();\n  static const int kUninterpretedOptionFieldNumber = 999;\n  inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const;\n  inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index);\n  inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\n      uninterpreted_option() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\n      mutable_uninterpreted_option();\n  \n  GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(MethodOptions)\n  // @@protoc_insertion_point(class_scope:google.protobuf.MethodOptions)\n private:\n  \n  ::google::protobuf::internal::ExtensionSet _extensions_;\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static MethodOptions* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT UninterpretedOption_NamePart : public ::google::protobuf::Message {\n public:\n  UninterpretedOption_NamePart();\n  virtual ~UninterpretedOption_NamePart();\n  \n  UninterpretedOption_NamePart(const UninterpretedOption_NamePart& from);\n  \n  inline UninterpretedOption_NamePart& operator=(const UninterpretedOption_NamePart& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const UninterpretedOption_NamePart& default_instance();\n  \n  void Swap(UninterpretedOption_NamePart* other);\n  \n  // implements Message ----------------------------------------------\n  \n  UninterpretedOption_NamePart* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const UninterpretedOption_NamePart& from);\n  void MergeFrom(const UninterpretedOption_NamePart& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // required string name_part = 1;\n  inline bool has_name_part() const;\n  inline void clear_name_part();\n  static const int kNamePartFieldNumber = 1;\n  inline const ::std::string& name_part() const;\n  inline void set_name_part(const ::std::string& value);\n  inline void set_name_part(const char* value);\n  inline void set_name_part(const char* value, size_t size);\n  inline ::std::string* mutable_name_part();\n  inline ::std::string* release_name_part();\n  \n  // required bool is_extension = 2;\n  inline bool has_is_extension() const;\n  inline void clear_is_extension();\n  static const int kIsExtensionFieldNumber = 2;\n  inline bool is_extension() const;\n  inline void set_is_extension(bool value);\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption.NamePart)\n private:\n  inline void set_has_name_part();\n  inline void clear_has_name_part();\n  inline void set_has_is_extension();\n  inline void clear_has_is_extension();\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::std::string* name_part_;\n  bool is_extension_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static UninterpretedOption_NamePart* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT UninterpretedOption : public ::google::protobuf::Message {\n public:\n  UninterpretedOption();\n  virtual ~UninterpretedOption();\n  \n  UninterpretedOption(const UninterpretedOption& from);\n  \n  inline UninterpretedOption& operator=(const UninterpretedOption& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const UninterpretedOption& default_instance();\n  \n  void Swap(UninterpretedOption* other);\n  \n  // implements Message ----------------------------------------------\n  \n  UninterpretedOption* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const UninterpretedOption& from);\n  void MergeFrom(const UninterpretedOption& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  typedef UninterpretedOption_NamePart NamePart;\n  \n  // accessors -------------------------------------------------------\n  \n  // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;\n  inline int name_size() const;\n  inline void clear_name();\n  static const int kNameFieldNumber = 2;\n  inline const ::google::protobuf::UninterpretedOption_NamePart& name(int index) const;\n  inline ::google::protobuf::UninterpretedOption_NamePart* mutable_name(int index);\n  inline ::google::protobuf::UninterpretedOption_NamePart* add_name();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >&\n      name() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >*\n      mutable_name();\n  \n  // optional string identifier_value = 3;\n  inline bool has_identifier_value() const;\n  inline void clear_identifier_value();\n  static const int kIdentifierValueFieldNumber = 3;\n  inline const ::std::string& identifier_value() const;\n  inline void set_identifier_value(const ::std::string& value);\n  inline void set_identifier_value(const char* value);\n  inline void set_identifier_value(const char* value, size_t size);\n  inline ::std::string* mutable_identifier_value();\n  inline ::std::string* release_identifier_value();\n  \n  // optional uint64 positive_int_value = 4;\n  inline bool has_positive_int_value() const;\n  inline void clear_positive_int_value();\n  static const int kPositiveIntValueFieldNumber = 4;\n  inline ::google::protobuf::uint64 positive_int_value() const;\n  inline void set_positive_int_value(::google::protobuf::uint64 value);\n  \n  // optional int64 negative_int_value = 5;\n  inline bool has_negative_int_value() const;\n  inline void clear_negative_int_value();\n  static const int kNegativeIntValueFieldNumber = 5;\n  inline ::google::protobuf::int64 negative_int_value() const;\n  inline void set_negative_int_value(::google::protobuf::int64 value);\n  \n  // optional double double_value = 6;\n  inline bool has_double_value() const;\n  inline void clear_double_value();\n  static const int kDoubleValueFieldNumber = 6;\n  inline double double_value() const;\n  inline void set_double_value(double value);\n  \n  // optional bytes string_value = 7;\n  inline bool has_string_value() const;\n  inline void clear_string_value();\n  static const int kStringValueFieldNumber = 7;\n  inline const ::std::string& string_value() const;\n  inline void set_string_value(const ::std::string& value);\n  inline void set_string_value(const char* value);\n  inline void set_string_value(const void* value, size_t size);\n  inline ::std::string* mutable_string_value();\n  inline ::std::string* release_string_value();\n  \n  // optional string aggregate_value = 8;\n  inline bool has_aggregate_value() const;\n  inline void clear_aggregate_value();\n  static const int kAggregateValueFieldNumber = 8;\n  inline const ::std::string& aggregate_value() const;\n  inline void set_aggregate_value(const ::std::string& value);\n  inline void set_aggregate_value(const char* value);\n  inline void set_aggregate_value(const char* value, size_t size);\n  inline ::std::string* mutable_aggregate_value();\n  inline ::std::string* release_aggregate_value();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption)\n private:\n  inline void set_has_identifier_value();\n  inline void clear_has_identifier_value();\n  inline void set_has_positive_int_value();\n  inline void clear_has_positive_int_value();\n  inline void set_has_negative_int_value();\n  inline void clear_has_negative_int_value();\n  inline void set_has_double_value();\n  inline void clear_has_double_value();\n  inline void set_has_string_value();\n  inline void clear_has_string_value();\n  inline void set_has_aggregate_value();\n  inline void clear_has_aggregate_value();\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart > name_;\n  ::std::string* identifier_value_;\n  ::google::protobuf::uint64 positive_int_value_;\n  ::google::protobuf::int64 negative_int_value_;\n  double double_value_;\n  ::std::string* string_value_;\n  ::std::string* aggregate_value_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(7 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static UninterpretedOption* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT SourceCodeInfo_Location : public ::google::protobuf::Message {\n public:\n  SourceCodeInfo_Location();\n  virtual ~SourceCodeInfo_Location();\n  \n  SourceCodeInfo_Location(const SourceCodeInfo_Location& from);\n  \n  inline SourceCodeInfo_Location& operator=(const SourceCodeInfo_Location& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const SourceCodeInfo_Location& default_instance();\n  \n  void Swap(SourceCodeInfo_Location* other);\n  \n  // implements Message ----------------------------------------------\n  \n  SourceCodeInfo_Location* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const SourceCodeInfo_Location& from);\n  void MergeFrom(const SourceCodeInfo_Location& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  // accessors -------------------------------------------------------\n  \n  // repeated int32 path = 1 [packed = true];\n  inline int path_size() const;\n  inline void clear_path();\n  static const int kPathFieldNumber = 1;\n  inline ::google::protobuf::int32 path(int index) const;\n  inline void set_path(int index, ::google::protobuf::int32 value);\n  inline void add_path(::google::protobuf::int32 value);\n  inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&\n      path() const;\n  inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*\n      mutable_path();\n  \n  // repeated int32 span = 2 [packed = true];\n  inline int span_size() const;\n  inline void clear_span();\n  static const int kSpanFieldNumber = 2;\n  inline ::google::protobuf::int32 span(int index) const;\n  inline void set_span(int index, ::google::protobuf::int32 value);\n  inline void add_span(::google::protobuf::int32 value);\n  inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&\n      span() const;\n  inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*\n      mutable_span();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo.Location)\n private:\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::google::protobuf::RepeatedField< ::google::protobuf::int32 > path_;\n  mutable int _path_cached_byte_size_;\n  ::google::protobuf::RepeatedField< ::google::protobuf::int32 > span_;\n  mutable int _span_cached_byte_size_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static SourceCodeInfo_Location* default_instance_;\n};\n// -------------------------------------------------------------------\n\nclass LIBPROTOBUF_EXPORT SourceCodeInfo : public ::google::protobuf::Message {\n public:\n  SourceCodeInfo();\n  virtual ~SourceCodeInfo();\n  \n  SourceCodeInfo(const SourceCodeInfo& from);\n  \n  inline SourceCodeInfo& operator=(const SourceCodeInfo& from) {\n    CopyFrom(from);\n    return *this;\n  }\n  \n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n  \n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n  \n  static const ::google::protobuf::Descriptor* descriptor();\n  static const SourceCodeInfo& default_instance();\n  \n  void Swap(SourceCodeInfo* other);\n  \n  // implements Message ----------------------------------------------\n  \n  SourceCodeInfo* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const SourceCodeInfo& from);\n  void MergeFrom(const SourceCodeInfo& from);\n  void Clear();\n  bool IsInitialized() const;\n  \n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n  \n  ::google::protobuf::Metadata GetMetadata() const;\n  \n  // nested types ----------------------------------------------------\n  \n  typedef SourceCodeInfo_Location Location;\n  \n  // accessors -------------------------------------------------------\n  \n  // repeated .google.protobuf.SourceCodeInfo.Location location = 1;\n  inline int location_size() const;\n  inline void clear_location();\n  static const int kLocationFieldNumber = 1;\n  inline const ::google::protobuf::SourceCodeInfo_Location& location(int index) const;\n  inline ::google::protobuf::SourceCodeInfo_Location* mutable_location(int index);\n  inline ::google::protobuf::SourceCodeInfo_Location* add_location();\n  inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >&\n      location() const;\n  inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >*\n      mutable_location();\n  \n  // @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo)\n private:\n  \n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n  \n  ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location > location_;\n  \n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32];\n  \n  friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto();\n  friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto();\n  \n  void InitAsDefaultInstance();\n  static SourceCodeInfo* default_instance_;\n};\n// ===================================================================\n\n\n// ===================================================================\n\n// FileDescriptorSet\n\n// repeated .google.protobuf.FileDescriptorProto file = 1;\ninline int FileDescriptorSet::file_size() const {\n  return file_.size();\n}\ninline void FileDescriptorSet::clear_file() {\n  file_.Clear();\n}\ninline const ::google::protobuf::FileDescriptorProto& FileDescriptorSet::file(int index) const {\n  return file_.Get(index);\n}\ninline ::google::protobuf::FileDescriptorProto* FileDescriptorSet::mutable_file(int index) {\n  return file_.Mutable(index);\n}\ninline ::google::protobuf::FileDescriptorProto* FileDescriptorSet::add_file() {\n  return file_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >&\nFileDescriptorSet::file() const {\n  return file_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >*\nFileDescriptorSet::mutable_file() {\n  return &file_;\n}\n\n// -------------------------------------------------------------------\n\n// FileDescriptorProto\n\n// optional string name = 1;\ninline bool FileDescriptorProto::has_name() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void FileDescriptorProto::set_has_name() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void FileDescriptorProto::clear_has_name() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void FileDescriptorProto::clear_name() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    name_->clear();\n  }\n  clear_has_name();\n}\ninline const ::std::string& FileDescriptorProto::name() const {\n  return *name_;\n}\ninline void FileDescriptorProto::set_name(const ::std::string& value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void FileDescriptorProto::set_name(const char* value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void FileDescriptorProto::set_name(const char* value, size_t size) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* FileDescriptorProto::mutable_name() {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  return name_;\n}\ninline ::std::string* FileDescriptorProto::release_name() {\n  clear_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = name_;\n    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional string package = 2;\ninline bool FileDescriptorProto::has_package() const {\n  return (_has_bits_[0] & 0x00000002u) != 0;\n}\ninline void FileDescriptorProto::set_has_package() {\n  _has_bits_[0] |= 0x00000002u;\n}\ninline void FileDescriptorProto::clear_has_package() {\n  _has_bits_[0] &= ~0x00000002u;\n}\ninline void FileDescriptorProto::clear_package() {\n  if (package_ != &::google::protobuf::internal::kEmptyString) {\n    package_->clear();\n  }\n  clear_has_package();\n}\ninline const ::std::string& FileDescriptorProto::package() const {\n  return *package_;\n}\ninline void FileDescriptorProto::set_package(const ::std::string& value) {\n  set_has_package();\n  if (package_ == &::google::protobuf::internal::kEmptyString) {\n    package_ = new ::std::string;\n  }\n  package_->assign(value);\n}\ninline void FileDescriptorProto::set_package(const char* value) {\n  set_has_package();\n  if (package_ == &::google::protobuf::internal::kEmptyString) {\n    package_ = new ::std::string;\n  }\n  package_->assign(value);\n}\ninline void FileDescriptorProto::set_package(const char* value, size_t size) {\n  set_has_package();\n  if (package_ == &::google::protobuf::internal::kEmptyString) {\n    package_ = new ::std::string;\n  }\n  package_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* FileDescriptorProto::mutable_package() {\n  set_has_package();\n  if (package_ == &::google::protobuf::internal::kEmptyString) {\n    package_ = new ::std::string;\n  }\n  return package_;\n}\ninline ::std::string* FileDescriptorProto::release_package() {\n  clear_has_package();\n  if (package_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = package_;\n    package_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// repeated string dependency = 3;\ninline int FileDescriptorProto::dependency_size() const {\n  return dependency_.size();\n}\ninline void FileDescriptorProto::clear_dependency() {\n  dependency_.Clear();\n}\ninline const ::std::string& FileDescriptorProto::dependency(int index) const {\n  return dependency_.Get(index);\n}\ninline ::std::string* FileDescriptorProto::mutable_dependency(int index) {\n  return dependency_.Mutable(index);\n}\ninline void FileDescriptorProto::set_dependency(int index, const ::std::string& value) {\n  dependency_.Mutable(index)->assign(value);\n}\ninline void FileDescriptorProto::set_dependency(int index, const char* value) {\n  dependency_.Mutable(index)->assign(value);\n}\ninline void FileDescriptorProto::set_dependency(int index, const char* value, size_t size) {\n  dependency_.Mutable(index)->assign(\n    reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* FileDescriptorProto::add_dependency() {\n  return dependency_.Add();\n}\ninline void FileDescriptorProto::add_dependency(const ::std::string& value) {\n  dependency_.Add()->assign(value);\n}\ninline void FileDescriptorProto::add_dependency(const char* value) {\n  dependency_.Add()->assign(value);\n}\ninline void FileDescriptorProto::add_dependency(const char* value, size_t size) {\n  dependency_.Add()->assign(reinterpret_cast<const char*>(value), size);\n}\ninline const ::google::protobuf::RepeatedPtrField< ::std::string>&\nFileDescriptorProto::dependency() const {\n  return dependency_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::std::string>*\nFileDescriptorProto::mutable_dependency() {\n  return &dependency_;\n}\n\n// repeated .google.protobuf.DescriptorProto message_type = 4;\ninline int FileDescriptorProto::message_type_size() const {\n  return message_type_.size();\n}\ninline void FileDescriptorProto::clear_message_type() {\n  message_type_.Clear();\n}\ninline const ::google::protobuf::DescriptorProto& FileDescriptorProto::message_type(int index) const {\n  return message_type_.Get(index);\n}\ninline ::google::protobuf::DescriptorProto* FileDescriptorProto::mutable_message_type(int index) {\n  return message_type_.Mutable(index);\n}\ninline ::google::protobuf::DescriptorProto* FileDescriptorProto::add_message_type() {\n  return message_type_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >&\nFileDescriptorProto::message_type() const {\n  return message_type_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >*\nFileDescriptorProto::mutable_message_type() {\n  return &message_type_;\n}\n\n// repeated .google.protobuf.EnumDescriptorProto enum_type = 5;\ninline int FileDescriptorProto::enum_type_size() const {\n  return enum_type_.size();\n}\ninline void FileDescriptorProto::clear_enum_type() {\n  enum_type_.Clear();\n}\ninline const ::google::protobuf::EnumDescriptorProto& FileDescriptorProto::enum_type(int index) const {\n  return enum_type_.Get(index);\n}\ninline ::google::protobuf::EnumDescriptorProto* FileDescriptorProto::mutable_enum_type(int index) {\n  return enum_type_.Mutable(index);\n}\ninline ::google::protobuf::EnumDescriptorProto* FileDescriptorProto::add_enum_type() {\n  return enum_type_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >&\nFileDescriptorProto::enum_type() const {\n  return enum_type_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >*\nFileDescriptorProto::mutable_enum_type() {\n  return &enum_type_;\n}\n\n// repeated .google.protobuf.ServiceDescriptorProto service = 6;\ninline int FileDescriptorProto::service_size() const {\n  return service_.size();\n}\ninline void FileDescriptorProto::clear_service() {\n  service_.Clear();\n}\ninline const ::google::protobuf::ServiceDescriptorProto& FileDescriptorProto::service(int index) const {\n  return service_.Get(index);\n}\ninline ::google::protobuf::ServiceDescriptorProto* FileDescriptorProto::mutable_service(int index) {\n  return service_.Mutable(index);\n}\ninline ::google::protobuf::ServiceDescriptorProto* FileDescriptorProto::add_service() {\n  return service_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >&\nFileDescriptorProto::service() const {\n  return service_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >*\nFileDescriptorProto::mutable_service() {\n  return &service_;\n}\n\n// repeated .google.protobuf.FieldDescriptorProto extension = 7;\ninline int FileDescriptorProto::extension_size() const {\n  return extension_.size();\n}\ninline void FileDescriptorProto::clear_extension() {\n  extension_.Clear();\n}\ninline const ::google::protobuf::FieldDescriptorProto& FileDescriptorProto::extension(int index) const {\n  return extension_.Get(index);\n}\ninline ::google::protobuf::FieldDescriptorProto* FileDescriptorProto::mutable_extension(int index) {\n  return extension_.Mutable(index);\n}\ninline ::google::protobuf::FieldDescriptorProto* FileDescriptorProto::add_extension() {\n  return extension_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >&\nFileDescriptorProto::extension() const {\n  return extension_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >*\nFileDescriptorProto::mutable_extension() {\n  return &extension_;\n}\n\n// optional .google.protobuf.FileOptions options = 8;\ninline bool FileDescriptorProto::has_options() const {\n  return (_has_bits_[0] & 0x00000080u) != 0;\n}\ninline void FileDescriptorProto::set_has_options() {\n  _has_bits_[0] |= 0x00000080u;\n}\ninline void FileDescriptorProto::clear_has_options() {\n  _has_bits_[0] &= ~0x00000080u;\n}\ninline void FileDescriptorProto::clear_options() {\n  if (options_ != NULL) options_->::google::protobuf::FileOptions::Clear();\n  clear_has_options();\n}\ninline const ::google::protobuf::FileOptions& FileDescriptorProto::options() const {\n  return options_ != NULL ? *options_ : *default_instance_->options_;\n}\ninline ::google::protobuf::FileOptions* FileDescriptorProto::mutable_options() {\n  set_has_options();\n  if (options_ == NULL) options_ = new ::google::protobuf::FileOptions;\n  return options_;\n}\ninline ::google::protobuf::FileOptions* FileDescriptorProto::release_options() {\n  clear_has_options();\n  ::google::protobuf::FileOptions* temp = options_;\n  options_ = NULL;\n  return temp;\n}\n\n// optional .google.protobuf.SourceCodeInfo source_code_info = 9;\ninline bool FileDescriptorProto::has_source_code_info() const {\n  return (_has_bits_[0] & 0x00000100u) != 0;\n}\ninline void FileDescriptorProto::set_has_source_code_info() {\n  _has_bits_[0] |= 0x00000100u;\n}\ninline void FileDescriptorProto::clear_has_source_code_info() {\n  _has_bits_[0] &= ~0x00000100u;\n}\ninline void FileDescriptorProto::clear_source_code_info() {\n  if (source_code_info_ != NULL) source_code_info_->::google::protobuf::SourceCodeInfo::Clear();\n  clear_has_source_code_info();\n}\ninline const ::google::protobuf::SourceCodeInfo& FileDescriptorProto::source_code_info() const {\n  return source_code_info_ != NULL ? *source_code_info_ : *default_instance_->source_code_info_;\n}\ninline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::mutable_source_code_info() {\n  set_has_source_code_info();\n  if (source_code_info_ == NULL) source_code_info_ = new ::google::protobuf::SourceCodeInfo;\n  return source_code_info_;\n}\ninline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::release_source_code_info() {\n  clear_has_source_code_info();\n  ::google::protobuf::SourceCodeInfo* temp = source_code_info_;\n  source_code_info_ = NULL;\n  return temp;\n}\n\n// -------------------------------------------------------------------\n\n// DescriptorProto_ExtensionRange\n\n// optional int32 start = 1;\ninline bool DescriptorProto_ExtensionRange::has_start() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void DescriptorProto_ExtensionRange::set_has_start() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void DescriptorProto_ExtensionRange::clear_has_start() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void DescriptorProto_ExtensionRange::clear_start() {\n  start_ = 0;\n  clear_has_start();\n}\ninline ::google::protobuf::int32 DescriptorProto_ExtensionRange::start() const {\n  return start_;\n}\ninline void DescriptorProto_ExtensionRange::set_start(::google::protobuf::int32 value) {\n  set_has_start();\n  start_ = value;\n}\n\n// optional int32 end = 2;\ninline bool DescriptorProto_ExtensionRange::has_end() const {\n  return (_has_bits_[0] & 0x00000002u) != 0;\n}\ninline void DescriptorProto_ExtensionRange::set_has_end() {\n  _has_bits_[0] |= 0x00000002u;\n}\ninline void DescriptorProto_ExtensionRange::clear_has_end() {\n  _has_bits_[0] &= ~0x00000002u;\n}\ninline void DescriptorProto_ExtensionRange::clear_end() {\n  end_ = 0;\n  clear_has_end();\n}\ninline ::google::protobuf::int32 DescriptorProto_ExtensionRange::end() const {\n  return end_;\n}\ninline void DescriptorProto_ExtensionRange::set_end(::google::protobuf::int32 value) {\n  set_has_end();\n  end_ = value;\n}\n\n// -------------------------------------------------------------------\n\n// DescriptorProto\n\n// optional string name = 1;\ninline bool DescriptorProto::has_name() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void DescriptorProto::set_has_name() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void DescriptorProto::clear_has_name() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void DescriptorProto::clear_name() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    name_->clear();\n  }\n  clear_has_name();\n}\ninline const ::std::string& DescriptorProto::name() const {\n  return *name_;\n}\ninline void DescriptorProto::set_name(const ::std::string& value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void DescriptorProto::set_name(const char* value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void DescriptorProto::set_name(const char* value, size_t size) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* DescriptorProto::mutable_name() {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  return name_;\n}\ninline ::std::string* DescriptorProto::release_name() {\n  clear_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = name_;\n    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// repeated .google.protobuf.FieldDescriptorProto field = 2;\ninline int DescriptorProto::field_size() const {\n  return field_.size();\n}\ninline void DescriptorProto::clear_field() {\n  field_.Clear();\n}\ninline const ::google::protobuf::FieldDescriptorProto& DescriptorProto::field(int index) const {\n  return field_.Get(index);\n}\ninline ::google::protobuf::FieldDescriptorProto* DescriptorProto::mutable_field(int index) {\n  return field_.Mutable(index);\n}\ninline ::google::protobuf::FieldDescriptorProto* DescriptorProto::add_field() {\n  return field_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >&\nDescriptorProto::field() const {\n  return field_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >*\nDescriptorProto::mutable_field() {\n  return &field_;\n}\n\n// repeated .google.protobuf.FieldDescriptorProto extension = 6;\ninline int DescriptorProto::extension_size() const {\n  return extension_.size();\n}\ninline void DescriptorProto::clear_extension() {\n  extension_.Clear();\n}\ninline const ::google::protobuf::FieldDescriptorProto& DescriptorProto::extension(int index) const {\n  return extension_.Get(index);\n}\ninline ::google::protobuf::FieldDescriptorProto* DescriptorProto::mutable_extension(int index) {\n  return extension_.Mutable(index);\n}\ninline ::google::protobuf::FieldDescriptorProto* DescriptorProto::add_extension() {\n  return extension_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >&\nDescriptorProto::extension() const {\n  return extension_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >*\nDescriptorProto::mutable_extension() {\n  return &extension_;\n}\n\n// repeated .google.protobuf.DescriptorProto nested_type = 3;\ninline int DescriptorProto::nested_type_size() const {\n  return nested_type_.size();\n}\ninline void DescriptorProto::clear_nested_type() {\n  nested_type_.Clear();\n}\ninline const ::google::protobuf::DescriptorProto& DescriptorProto::nested_type(int index) const {\n  return nested_type_.Get(index);\n}\ninline ::google::protobuf::DescriptorProto* DescriptorProto::mutable_nested_type(int index) {\n  return nested_type_.Mutable(index);\n}\ninline ::google::protobuf::DescriptorProto* DescriptorProto::add_nested_type() {\n  return nested_type_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >&\nDescriptorProto::nested_type() const {\n  return nested_type_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >*\nDescriptorProto::mutable_nested_type() {\n  return &nested_type_;\n}\n\n// repeated .google.protobuf.EnumDescriptorProto enum_type = 4;\ninline int DescriptorProto::enum_type_size() const {\n  return enum_type_.size();\n}\ninline void DescriptorProto::clear_enum_type() {\n  enum_type_.Clear();\n}\ninline const ::google::protobuf::EnumDescriptorProto& DescriptorProto::enum_type(int index) const {\n  return enum_type_.Get(index);\n}\ninline ::google::protobuf::EnumDescriptorProto* DescriptorProto::mutable_enum_type(int index) {\n  return enum_type_.Mutable(index);\n}\ninline ::google::protobuf::EnumDescriptorProto* DescriptorProto::add_enum_type() {\n  return enum_type_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >&\nDescriptorProto::enum_type() const {\n  return enum_type_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >*\nDescriptorProto::mutable_enum_type() {\n  return &enum_type_;\n}\n\n// repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;\ninline int DescriptorProto::extension_range_size() const {\n  return extension_range_.size();\n}\ninline void DescriptorProto::clear_extension_range() {\n  extension_range_.Clear();\n}\ninline const ::google::protobuf::DescriptorProto_ExtensionRange& DescriptorProto::extension_range(int index) const {\n  return extension_range_.Get(index);\n}\ninline ::google::protobuf::DescriptorProto_ExtensionRange* DescriptorProto::mutable_extension_range(int index) {\n  return extension_range_.Mutable(index);\n}\ninline ::google::protobuf::DescriptorProto_ExtensionRange* DescriptorProto::add_extension_range() {\n  return extension_range_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >&\nDescriptorProto::extension_range() const {\n  return extension_range_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >*\nDescriptorProto::mutable_extension_range() {\n  return &extension_range_;\n}\n\n// optional .google.protobuf.MessageOptions options = 7;\ninline bool DescriptorProto::has_options() const {\n  return (_has_bits_[0] & 0x00000040u) != 0;\n}\ninline void DescriptorProto::set_has_options() {\n  _has_bits_[0] |= 0x00000040u;\n}\ninline void DescriptorProto::clear_has_options() {\n  _has_bits_[0] &= ~0x00000040u;\n}\ninline void DescriptorProto::clear_options() {\n  if (options_ != NULL) options_->::google::protobuf::MessageOptions::Clear();\n  clear_has_options();\n}\ninline const ::google::protobuf::MessageOptions& DescriptorProto::options() const {\n  return options_ != NULL ? *options_ : *default_instance_->options_;\n}\ninline ::google::protobuf::MessageOptions* DescriptorProto::mutable_options() {\n  set_has_options();\n  if (options_ == NULL) options_ = new ::google::protobuf::MessageOptions;\n  return options_;\n}\ninline ::google::protobuf::MessageOptions* DescriptorProto::release_options() {\n  clear_has_options();\n  ::google::protobuf::MessageOptions* temp = options_;\n  options_ = NULL;\n  return temp;\n}\n\n// -------------------------------------------------------------------\n\n// FieldDescriptorProto\n\n// optional string name = 1;\ninline bool FieldDescriptorProto::has_name() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void FieldDescriptorProto::set_has_name() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void FieldDescriptorProto::clear_has_name() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void FieldDescriptorProto::clear_name() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    name_->clear();\n  }\n  clear_has_name();\n}\ninline const ::std::string& FieldDescriptorProto::name() const {\n  return *name_;\n}\ninline void FieldDescriptorProto::set_name(const ::std::string& value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void FieldDescriptorProto::set_name(const char* value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void FieldDescriptorProto::set_name(const char* value, size_t size) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* FieldDescriptorProto::mutable_name() {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  return name_;\n}\ninline ::std::string* FieldDescriptorProto::release_name() {\n  clear_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = name_;\n    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional int32 number = 3;\ninline bool FieldDescriptorProto::has_number() const {\n  return (_has_bits_[0] & 0x00000002u) != 0;\n}\ninline void FieldDescriptorProto::set_has_number() {\n  _has_bits_[0] |= 0x00000002u;\n}\ninline void FieldDescriptorProto::clear_has_number() {\n  _has_bits_[0] &= ~0x00000002u;\n}\ninline void FieldDescriptorProto::clear_number() {\n  number_ = 0;\n  clear_has_number();\n}\ninline ::google::protobuf::int32 FieldDescriptorProto::number() const {\n  return number_;\n}\ninline void FieldDescriptorProto::set_number(::google::protobuf::int32 value) {\n  set_has_number();\n  number_ = value;\n}\n\n// optional .google.protobuf.FieldDescriptorProto.Label label = 4;\ninline bool FieldDescriptorProto::has_label() const {\n  return (_has_bits_[0] & 0x00000004u) != 0;\n}\ninline void FieldDescriptorProto::set_has_label() {\n  _has_bits_[0] |= 0x00000004u;\n}\ninline void FieldDescriptorProto::clear_has_label() {\n  _has_bits_[0] &= ~0x00000004u;\n}\ninline void FieldDescriptorProto::clear_label() {\n  label_ = 1;\n  clear_has_label();\n}\ninline ::google::protobuf::FieldDescriptorProto_Label FieldDescriptorProto::label() const {\n  return static_cast< ::google::protobuf::FieldDescriptorProto_Label >(label_);\n}\ninline void FieldDescriptorProto::set_label(::google::protobuf::FieldDescriptorProto_Label value) {\n  GOOGLE_DCHECK(::google::protobuf::FieldDescriptorProto_Label_IsValid(value));\n  set_has_label();\n  label_ = value;\n}\n\n// optional .google.protobuf.FieldDescriptorProto.Type type = 5;\ninline bool FieldDescriptorProto::has_type() const {\n  return (_has_bits_[0] & 0x00000008u) != 0;\n}\ninline void FieldDescriptorProto::set_has_type() {\n  _has_bits_[0] |= 0x00000008u;\n}\ninline void FieldDescriptorProto::clear_has_type() {\n  _has_bits_[0] &= ~0x00000008u;\n}\ninline void FieldDescriptorProto::clear_type() {\n  type_ = 1;\n  clear_has_type();\n}\ninline ::google::protobuf::FieldDescriptorProto_Type FieldDescriptorProto::type() const {\n  return static_cast< ::google::protobuf::FieldDescriptorProto_Type >(type_);\n}\ninline void FieldDescriptorProto::set_type(::google::protobuf::FieldDescriptorProto_Type value) {\n  GOOGLE_DCHECK(::google::protobuf::FieldDescriptorProto_Type_IsValid(value));\n  set_has_type();\n  type_ = value;\n}\n\n// optional string type_name = 6;\ninline bool FieldDescriptorProto::has_type_name() const {\n  return (_has_bits_[0] & 0x00000010u) != 0;\n}\ninline void FieldDescriptorProto::set_has_type_name() {\n  _has_bits_[0] |= 0x00000010u;\n}\ninline void FieldDescriptorProto::clear_has_type_name() {\n  _has_bits_[0] &= ~0x00000010u;\n}\ninline void FieldDescriptorProto::clear_type_name() {\n  if (type_name_ != &::google::protobuf::internal::kEmptyString) {\n    type_name_->clear();\n  }\n  clear_has_type_name();\n}\ninline const ::std::string& FieldDescriptorProto::type_name() const {\n  return *type_name_;\n}\ninline void FieldDescriptorProto::set_type_name(const ::std::string& value) {\n  set_has_type_name();\n  if (type_name_ == &::google::protobuf::internal::kEmptyString) {\n    type_name_ = new ::std::string;\n  }\n  type_name_->assign(value);\n}\ninline void FieldDescriptorProto::set_type_name(const char* value) {\n  set_has_type_name();\n  if (type_name_ == &::google::protobuf::internal::kEmptyString) {\n    type_name_ = new ::std::string;\n  }\n  type_name_->assign(value);\n}\ninline void FieldDescriptorProto::set_type_name(const char* value, size_t size) {\n  set_has_type_name();\n  if (type_name_ == &::google::protobuf::internal::kEmptyString) {\n    type_name_ = new ::std::string;\n  }\n  type_name_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* FieldDescriptorProto::mutable_type_name() {\n  set_has_type_name();\n  if (type_name_ == &::google::protobuf::internal::kEmptyString) {\n    type_name_ = new ::std::string;\n  }\n  return type_name_;\n}\ninline ::std::string* FieldDescriptorProto::release_type_name() {\n  clear_has_type_name();\n  if (type_name_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = type_name_;\n    type_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional string extendee = 2;\ninline bool FieldDescriptorProto::has_extendee() const {\n  return (_has_bits_[0] & 0x00000020u) != 0;\n}\ninline void FieldDescriptorProto::set_has_extendee() {\n  _has_bits_[0] |= 0x00000020u;\n}\ninline void FieldDescriptorProto::clear_has_extendee() {\n  _has_bits_[0] &= ~0x00000020u;\n}\ninline void FieldDescriptorProto::clear_extendee() {\n  if (extendee_ != &::google::protobuf::internal::kEmptyString) {\n    extendee_->clear();\n  }\n  clear_has_extendee();\n}\ninline const ::std::string& FieldDescriptorProto::extendee() const {\n  return *extendee_;\n}\ninline void FieldDescriptorProto::set_extendee(const ::std::string& value) {\n  set_has_extendee();\n  if (extendee_ == &::google::protobuf::internal::kEmptyString) {\n    extendee_ = new ::std::string;\n  }\n  extendee_->assign(value);\n}\ninline void FieldDescriptorProto::set_extendee(const char* value) {\n  set_has_extendee();\n  if (extendee_ == &::google::protobuf::internal::kEmptyString) {\n    extendee_ = new ::std::string;\n  }\n  extendee_->assign(value);\n}\ninline void FieldDescriptorProto::set_extendee(const char* value, size_t size) {\n  set_has_extendee();\n  if (extendee_ == &::google::protobuf::internal::kEmptyString) {\n    extendee_ = new ::std::string;\n  }\n  extendee_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* FieldDescriptorProto::mutable_extendee() {\n  set_has_extendee();\n  if (extendee_ == &::google::protobuf::internal::kEmptyString) {\n    extendee_ = new ::std::string;\n  }\n  return extendee_;\n}\ninline ::std::string* FieldDescriptorProto::release_extendee() {\n  clear_has_extendee();\n  if (extendee_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = extendee_;\n    extendee_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional string default_value = 7;\ninline bool FieldDescriptorProto::has_default_value() const {\n  return (_has_bits_[0] & 0x00000040u) != 0;\n}\ninline void FieldDescriptorProto::set_has_default_value() {\n  _has_bits_[0] |= 0x00000040u;\n}\ninline void FieldDescriptorProto::clear_has_default_value() {\n  _has_bits_[0] &= ~0x00000040u;\n}\ninline void FieldDescriptorProto::clear_default_value() {\n  if (default_value_ != &::google::protobuf::internal::kEmptyString) {\n    default_value_->clear();\n  }\n  clear_has_default_value();\n}\ninline const ::std::string& FieldDescriptorProto::default_value() const {\n  return *default_value_;\n}\ninline void FieldDescriptorProto::set_default_value(const ::std::string& value) {\n  set_has_default_value();\n  if (default_value_ == &::google::protobuf::internal::kEmptyString) {\n    default_value_ = new ::std::string;\n  }\n  default_value_->assign(value);\n}\ninline void FieldDescriptorProto::set_default_value(const char* value) {\n  set_has_default_value();\n  if (default_value_ == &::google::protobuf::internal::kEmptyString) {\n    default_value_ = new ::std::string;\n  }\n  default_value_->assign(value);\n}\ninline void FieldDescriptorProto::set_default_value(const char* value, size_t size) {\n  set_has_default_value();\n  if (default_value_ == &::google::protobuf::internal::kEmptyString) {\n    default_value_ = new ::std::string;\n  }\n  default_value_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* FieldDescriptorProto::mutable_default_value() {\n  set_has_default_value();\n  if (default_value_ == &::google::protobuf::internal::kEmptyString) {\n    default_value_ = new ::std::string;\n  }\n  return default_value_;\n}\ninline ::std::string* FieldDescriptorProto::release_default_value() {\n  clear_has_default_value();\n  if (default_value_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = default_value_;\n    default_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional .google.protobuf.FieldOptions options = 8;\ninline bool FieldDescriptorProto::has_options() const {\n  return (_has_bits_[0] & 0x00000080u) != 0;\n}\ninline void FieldDescriptorProto::set_has_options() {\n  _has_bits_[0] |= 0x00000080u;\n}\ninline void FieldDescriptorProto::clear_has_options() {\n  _has_bits_[0] &= ~0x00000080u;\n}\ninline void FieldDescriptorProto::clear_options() {\n  if (options_ != NULL) options_->::google::protobuf::FieldOptions::Clear();\n  clear_has_options();\n}\ninline const ::google::protobuf::FieldOptions& FieldDescriptorProto::options() const {\n  return options_ != NULL ? *options_ : *default_instance_->options_;\n}\ninline ::google::protobuf::FieldOptions* FieldDescriptorProto::mutable_options() {\n  set_has_options();\n  if (options_ == NULL) options_ = new ::google::protobuf::FieldOptions;\n  return options_;\n}\ninline ::google::protobuf::FieldOptions* FieldDescriptorProto::release_options() {\n  clear_has_options();\n  ::google::protobuf::FieldOptions* temp = options_;\n  options_ = NULL;\n  return temp;\n}\n\n// -------------------------------------------------------------------\n\n// EnumDescriptorProto\n\n// optional string name = 1;\ninline bool EnumDescriptorProto::has_name() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void EnumDescriptorProto::set_has_name() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void EnumDescriptorProto::clear_has_name() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void EnumDescriptorProto::clear_name() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    name_->clear();\n  }\n  clear_has_name();\n}\ninline const ::std::string& EnumDescriptorProto::name() const {\n  return *name_;\n}\ninline void EnumDescriptorProto::set_name(const ::std::string& value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void EnumDescriptorProto::set_name(const char* value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void EnumDescriptorProto::set_name(const char* value, size_t size) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* EnumDescriptorProto::mutable_name() {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  return name_;\n}\ninline ::std::string* EnumDescriptorProto::release_name() {\n  clear_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = name_;\n    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// repeated .google.protobuf.EnumValueDescriptorProto value = 2;\ninline int EnumDescriptorProto::value_size() const {\n  return value_.size();\n}\ninline void EnumDescriptorProto::clear_value() {\n  value_.Clear();\n}\ninline const ::google::protobuf::EnumValueDescriptorProto& EnumDescriptorProto::value(int index) const {\n  return value_.Get(index);\n}\ninline ::google::protobuf::EnumValueDescriptorProto* EnumDescriptorProto::mutable_value(int index) {\n  return value_.Mutable(index);\n}\ninline ::google::protobuf::EnumValueDescriptorProto* EnumDescriptorProto::add_value() {\n  return value_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >&\nEnumDescriptorProto::value() const {\n  return value_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >*\nEnumDescriptorProto::mutable_value() {\n  return &value_;\n}\n\n// optional .google.protobuf.EnumOptions options = 3;\ninline bool EnumDescriptorProto::has_options() const {\n  return (_has_bits_[0] & 0x00000004u) != 0;\n}\ninline void EnumDescriptorProto::set_has_options() {\n  _has_bits_[0] |= 0x00000004u;\n}\ninline void EnumDescriptorProto::clear_has_options() {\n  _has_bits_[0] &= ~0x00000004u;\n}\ninline void EnumDescriptorProto::clear_options() {\n  if (options_ != NULL) options_->::google::protobuf::EnumOptions::Clear();\n  clear_has_options();\n}\ninline const ::google::protobuf::EnumOptions& EnumDescriptorProto::options() const {\n  return options_ != NULL ? *options_ : *default_instance_->options_;\n}\ninline ::google::protobuf::EnumOptions* EnumDescriptorProto::mutable_options() {\n  set_has_options();\n  if (options_ == NULL) options_ = new ::google::protobuf::EnumOptions;\n  return options_;\n}\ninline ::google::protobuf::EnumOptions* EnumDescriptorProto::release_options() {\n  clear_has_options();\n  ::google::protobuf::EnumOptions* temp = options_;\n  options_ = NULL;\n  return temp;\n}\n\n// -------------------------------------------------------------------\n\n// EnumValueDescriptorProto\n\n// optional string name = 1;\ninline bool EnumValueDescriptorProto::has_name() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void EnumValueDescriptorProto::set_has_name() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void EnumValueDescriptorProto::clear_has_name() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void EnumValueDescriptorProto::clear_name() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    name_->clear();\n  }\n  clear_has_name();\n}\ninline const ::std::string& EnumValueDescriptorProto::name() const {\n  return *name_;\n}\ninline void EnumValueDescriptorProto::set_name(const ::std::string& value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void EnumValueDescriptorProto::set_name(const char* value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void EnumValueDescriptorProto::set_name(const char* value, size_t size) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* EnumValueDescriptorProto::mutable_name() {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  return name_;\n}\ninline ::std::string* EnumValueDescriptorProto::release_name() {\n  clear_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = name_;\n    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional int32 number = 2;\ninline bool EnumValueDescriptorProto::has_number() const {\n  return (_has_bits_[0] & 0x00000002u) != 0;\n}\ninline void EnumValueDescriptorProto::set_has_number() {\n  _has_bits_[0] |= 0x00000002u;\n}\ninline void EnumValueDescriptorProto::clear_has_number() {\n  _has_bits_[0] &= ~0x00000002u;\n}\ninline void EnumValueDescriptorProto::clear_number() {\n  number_ = 0;\n  clear_has_number();\n}\ninline ::google::protobuf::int32 EnumValueDescriptorProto::number() const {\n  return number_;\n}\ninline void EnumValueDescriptorProto::set_number(::google::protobuf::int32 value) {\n  set_has_number();\n  number_ = value;\n}\n\n// optional .google.protobuf.EnumValueOptions options = 3;\ninline bool EnumValueDescriptorProto::has_options() const {\n  return (_has_bits_[0] & 0x00000004u) != 0;\n}\ninline void EnumValueDescriptorProto::set_has_options() {\n  _has_bits_[0] |= 0x00000004u;\n}\ninline void EnumValueDescriptorProto::clear_has_options() {\n  _has_bits_[0] &= ~0x00000004u;\n}\ninline void EnumValueDescriptorProto::clear_options() {\n  if (options_ != NULL) options_->::google::protobuf::EnumValueOptions::Clear();\n  clear_has_options();\n}\ninline const ::google::protobuf::EnumValueOptions& EnumValueDescriptorProto::options() const {\n  return options_ != NULL ? *options_ : *default_instance_->options_;\n}\ninline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::mutable_options() {\n  set_has_options();\n  if (options_ == NULL) options_ = new ::google::protobuf::EnumValueOptions;\n  return options_;\n}\ninline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::release_options() {\n  clear_has_options();\n  ::google::protobuf::EnumValueOptions* temp = options_;\n  options_ = NULL;\n  return temp;\n}\n\n// -------------------------------------------------------------------\n\n// ServiceDescriptorProto\n\n// optional string name = 1;\ninline bool ServiceDescriptorProto::has_name() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void ServiceDescriptorProto::set_has_name() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void ServiceDescriptorProto::clear_has_name() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void ServiceDescriptorProto::clear_name() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    name_->clear();\n  }\n  clear_has_name();\n}\ninline const ::std::string& ServiceDescriptorProto::name() const {\n  return *name_;\n}\ninline void ServiceDescriptorProto::set_name(const ::std::string& value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void ServiceDescriptorProto::set_name(const char* value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void ServiceDescriptorProto::set_name(const char* value, size_t size) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* ServiceDescriptorProto::mutable_name() {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  return name_;\n}\ninline ::std::string* ServiceDescriptorProto::release_name() {\n  clear_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = name_;\n    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// repeated .google.protobuf.MethodDescriptorProto method = 2;\ninline int ServiceDescriptorProto::method_size() const {\n  return method_.size();\n}\ninline void ServiceDescriptorProto::clear_method() {\n  method_.Clear();\n}\ninline const ::google::protobuf::MethodDescriptorProto& ServiceDescriptorProto::method(int index) const {\n  return method_.Get(index);\n}\ninline ::google::protobuf::MethodDescriptorProto* ServiceDescriptorProto::mutable_method(int index) {\n  return method_.Mutable(index);\n}\ninline ::google::protobuf::MethodDescriptorProto* ServiceDescriptorProto::add_method() {\n  return method_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >&\nServiceDescriptorProto::method() const {\n  return method_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >*\nServiceDescriptorProto::mutable_method() {\n  return &method_;\n}\n\n// optional .google.protobuf.ServiceOptions options = 3;\ninline bool ServiceDescriptorProto::has_options() const {\n  return (_has_bits_[0] & 0x00000004u) != 0;\n}\ninline void ServiceDescriptorProto::set_has_options() {\n  _has_bits_[0] |= 0x00000004u;\n}\ninline void ServiceDescriptorProto::clear_has_options() {\n  _has_bits_[0] &= ~0x00000004u;\n}\ninline void ServiceDescriptorProto::clear_options() {\n  if (options_ != NULL) options_->::google::protobuf::ServiceOptions::Clear();\n  clear_has_options();\n}\ninline const ::google::protobuf::ServiceOptions& ServiceDescriptorProto::options() const {\n  return options_ != NULL ? *options_ : *default_instance_->options_;\n}\ninline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::mutable_options() {\n  set_has_options();\n  if (options_ == NULL) options_ = new ::google::protobuf::ServiceOptions;\n  return options_;\n}\ninline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::release_options() {\n  clear_has_options();\n  ::google::protobuf::ServiceOptions* temp = options_;\n  options_ = NULL;\n  return temp;\n}\n\n// -------------------------------------------------------------------\n\n// MethodDescriptorProto\n\n// optional string name = 1;\ninline bool MethodDescriptorProto::has_name() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void MethodDescriptorProto::set_has_name() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void MethodDescriptorProto::clear_has_name() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void MethodDescriptorProto::clear_name() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    name_->clear();\n  }\n  clear_has_name();\n}\ninline const ::std::string& MethodDescriptorProto::name() const {\n  return *name_;\n}\ninline void MethodDescriptorProto::set_name(const ::std::string& value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void MethodDescriptorProto::set_name(const char* value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void MethodDescriptorProto::set_name(const char* value, size_t size) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* MethodDescriptorProto::mutable_name() {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  return name_;\n}\ninline ::std::string* MethodDescriptorProto::release_name() {\n  clear_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = name_;\n    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional string input_type = 2;\ninline bool MethodDescriptorProto::has_input_type() const {\n  return (_has_bits_[0] & 0x00000002u) != 0;\n}\ninline void MethodDescriptorProto::set_has_input_type() {\n  _has_bits_[0] |= 0x00000002u;\n}\ninline void MethodDescriptorProto::clear_has_input_type() {\n  _has_bits_[0] &= ~0x00000002u;\n}\ninline void MethodDescriptorProto::clear_input_type() {\n  if (input_type_ != &::google::protobuf::internal::kEmptyString) {\n    input_type_->clear();\n  }\n  clear_has_input_type();\n}\ninline const ::std::string& MethodDescriptorProto::input_type() const {\n  return *input_type_;\n}\ninline void MethodDescriptorProto::set_input_type(const ::std::string& value) {\n  set_has_input_type();\n  if (input_type_ == &::google::protobuf::internal::kEmptyString) {\n    input_type_ = new ::std::string;\n  }\n  input_type_->assign(value);\n}\ninline void MethodDescriptorProto::set_input_type(const char* value) {\n  set_has_input_type();\n  if (input_type_ == &::google::protobuf::internal::kEmptyString) {\n    input_type_ = new ::std::string;\n  }\n  input_type_->assign(value);\n}\ninline void MethodDescriptorProto::set_input_type(const char* value, size_t size) {\n  set_has_input_type();\n  if (input_type_ == &::google::protobuf::internal::kEmptyString) {\n    input_type_ = new ::std::string;\n  }\n  input_type_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* MethodDescriptorProto::mutable_input_type() {\n  set_has_input_type();\n  if (input_type_ == &::google::protobuf::internal::kEmptyString) {\n    input_type_ = new ::std::string;\n  }\n  return input_type_;\n}\ninline ::std::string* MethodDescriptorProto::release_input_type() {\n  clear_has_input_type();\n  if (input_type_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = input_type_;\n    input_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional string output_type = 3;\ninline bool MethodDescriptorProto::has_output_type() const {\n  return (_has_bits_[0] & 0x00000004u) != 0;\n}\ninline void MethodDescriptorProto::set_has_output_type() {\n  _has_bits_[0] |= 0x00000004u;\n}\ninline void MethodDescriptorProto::clear_has_output_type() {\n  _has_bits_[0] &= ~0x00000004u;\n}\ninline void MethodDescriptorProto::clear_output_type() {\n  if (output_type_ != &::google::protobuf::internal::kEmptyString) {\n    output_type_->clear();\n  }\n  clear_has_output_type();\n}\ninline const ::std::string& MethodDescriptorProto::output_type() const {\n  return *output_type_;\n}\ninline void MethodDescriptorProto::set_output_type(const ::std::string& value) {\n  set_has_output_type();\n  if (output_type_ == &::google::protobuf::internal::kEmptyString) {\n    output_type_ = new ::std::string;\n  }\n  output_type_->assign(value);\n}\ninline void MethodDescriptorProto::set_output_type(const char* value) {\n  set_has_output_type();\n  if (output_type_ == &::google::protobuf::internal::kEmptyString) {\n    output_type_ = new ::std::string;\n  }\n  output_type_->assign(value);\n}\ninline void MethodDescriptorProto::set_output_type(const char* value, size_t size) {\n  set_has_output_type();\n  if (output_type_ == &::google::protobuf::internal::kEmptyString) {\n    output_type_ = new ::std::string;\n  }\n  output_type_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* MethodDescriptorProto::mutable_output_type() {\n  set_has_output_type();\n  if (output_type_ == &::google::protobuf::internal::kEmptyString) {\n    output_type_ = new ::std::string;\n  }\n  return output_type_;\n}\ninline ::std::string* MethodDescriptorProto::release_output_type() {\n  clear_has_output_type();\n  if (output_type_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = output_type_;\n    output_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional .google.protobuf.MethodOptions options = 4;\ninline bool MethodDescriptorProto::has_options() const {\n  return (_has_bits_[0] & 0x00000008u) != 0;\n}\ninline void MethodDescriptorProto::set_has_options() {\n  _has_bits_[0] |= 0x00000008u;\n}\ninline void MethodDescriptorProto::clear_has_options() {\n  _has_bits_[0] &= ~0x00000008u;\n}\ninline void MethodDescriptorProto::clear_options() {\n  if (options_ != NULL) options_->::google::protobuf::MethodOptions::Clear();\n  clear_has_options();\n}\ninline const ::google::protobuf::MethodOptions& MethodDescriptorProto::options() const {\n  return options_ != NULL ? *options_ : *default_instance_->options_;\n}\ninline ::google::protobuf::MethodOptions* MethodDescriptorProto::mutable_options() {\n  set_has_options();\n  if (options_ == NULL) options_ = new ::google::protobuf::MethodOptions;\n  return options_;\n}\ninline ::google::protobuf::MethodOptions* MethodDescriptorProto::release_options() {\n  clear_has_options();\n  ::google::protobuf::MethodOptions* temp = options_;\n  options_ = NULL;\n  return temp;\n}\n\n// -------------------------------------------------------------------\n\n// FileOptions\n\n// optional string java_package = 1;\ninline bool FileOptions::has_java_package() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void FileOptions::set_has_java_package() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void FileOptions::clear_has_java_package() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void FileOptions::clear_java_package() {\n  if (java_package_ != &::google::protobuf::internal::kEmptyString) {\n    java_package_->clear();\n  }\n  clear_has_java_package();\n}\ninline const ::std::string& FileOptions::java_package() const {\n  return *java_package_;\n}\ninline void FileOptions::set_java_package(const ::std::string& value) {\n  set_has_java_package();\n  if (java_package_ == &::google::protobuf::internal::kEmptyString) {\n    java_package_ = new ::std::string;\n  }\n  java_package_->assign(value);\n}\ninline void FileOptions::set_java_package(const char* value) {\n  set_has_java_package();\n  if (java_package_ == &::google::protobuf::internal::kEmptyString) {\n    java_package_ = new ::std::string;\n  }\n  java_package_->assign(value);\n}\ninline void FileOptions::set_java_package(const char* value, size_t size) {\n  set_has_java_package();\n  if (java_package_ == &::google::protobuf::internal::kEmptyString) {\n    java_package_ = new ::std::string;\n  }\n  java_package_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* FileOptions::mutable_java_package() {\n  set_has_java_package();\n  if (java_package_ == &::google::protobuf::internal::kEmptyString) {\n    java_package_ = new ::std::string;\n  }\n  return java_package_;\n}\ninline ::std::string* FileOptions::release_java_package() {\n  clear_has_java_package();\n  if (java_package_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = java_package_;\n    java_package_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional string java_outer_classname = 8;\ninline bool FileOptions::has_java_outer_classname() const {\n  return (_has_bits_[0] & 0x00000002u) != 0;\n}\ninline void FileOptions::set_has_java_outer_classname() {\n  _has_bits_[0] |= 0x00000002u;\n}\ninline void FileOptions::clear_has_java_outer_classname() {\n  _has_bits_[0] &= ~0x00000002u;\n}\ninline void FileOptions::clear_java_outer_classname() {\n  if (java_outer_classname_ != &::google::protobuf::internal::kEmptyString) {\n    java_outer_classname_->clear();\n  }\n  clear_has_java_outer_classname();\n}\ninline const ::std::string& FileOptions::java_outer_classname() const {\n  return *java_outer_classname_;\n}\ninline void FileOptions::set_java_outer_classname(const ::std::string& value) {\n  set_has_java_outer_classname();\n  if (java_outer_classname_ == &::google::protobuf::internal::kEmptyString) {\n    java_outer_classname_ = new ::std::string;\n  }\n  java_outer_classname_->assign(value);\n}\ninline void FileOptions::set_java_outer_classname(const char* value) {\n  set_has_java_outer_classname();\n  if (java_outer_classname_ == &::google::protobuf::internal::kEmptyString) {\n    java_outer_classname_ = new ::std::string;\n  }\n  java_outer_classname_->assign(value);\n}\ninline void FileOptions::set_java_outer_classname(const char* value, size_t size) {\n  set_has_java_outer_classname();\n  if (java_outer_classname_ == &::google::protobuf::internal::kEmptyString) {\n    java_outer_classname_ = new ::std::string;\n  }\n  java_outer_classname_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* FileOptions::mutable_java_outer_classname() {\n  set_has_java_outer_classname();\n  if (java_outer_classname_ == &::google::protobuf::internal::kEmptyString) {\n    java_outer_classname_ = new ::std::string;\n  }\n  return java_outer_classname_;\n}\ninline ::std::string* FileOptions::release_java_outer_classname() {\n  clear_has_java_outer_classname();\n  if (java_outer_classname_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = java_outer_classname_;\n    java_outer_classname_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional bool java_multiple_files = 10 [default = false];\ninline bool FileOptions::has_java_multiple_files() const {\n  return (_has_bits_[0] & 0x00000004u) != 0;\n}\ninline void FileOptions::set_has_java_multiple_files() {\n  _has_bits_[0] |= 0x00000004u;\n}\ninline void FileOptions::clear_has_java_multiple_files() {\n  _has_bits_[0] &= ~0x00000004u;\n}\ninline void FileOptions::clear_java_multiple_files() {\n  java_multiple_files_ = false;\n  clear_has_java_multiple_files();\n}\ninline bool FileOptions::java_multiple_files() const {\n  return java_multiple_files_;\n}\ninline void FileOptions::set_java_multiple_files(bool value) {\n  set_has_java_multiple_files();\n  java_multiple_files_ = value;\n}\n\n// optional bool java_generate_equals_and_hash = 20 [default = false];\ninline bool FileOptions::has_java_generate_equals_and_hash() const {\n  return (_has_bits_[0] & 0x00000008u) != 0;\n}\ninline void FileOptions::set_has_java_generate_equals_and_hash() {\n  _has_bits_[0] |= 0x00000008u;\n}\ninline void FileOptions::clear_has_java_generate_equals_and_hash() {\n  _has_bits_[0] &= ~0x00000008u;\n}\ninline void FileOptions::clear_java_generate_equals_and_hash() {\n  java_generate_equals_and_hash_ = false;\n  clear_has_java_generate_equals_and_hash();\n}\ninline bool FileOptions::java_generate_equals_and_hash() const {\n  return java_generate_equals_and_hash_;\n}\ninline void FileOptions::set_java_generate_equals_and_hash(bool value) {\n  set_has_java_generate_equals_and_hash();\n  java_generate_equals_and_hash_ = value;\n}\n\n// optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];\ninline bool FileOptions::has_optimize_for() const {\n  return (_has_bits_[0] & 0x00000010u) != 0;\n}\ninline void FileOptions::set_has_optimize_for() {\n  _has_bits_[0] |= 0x00000010u;\n}\ninline void FileOptions::clear_has_optimize_for() {\n  _has_bits_[0] &= ~0x00000010u;\n}\ninline void FileOptions::clear_optimize_for() {\n  optimize_for_ = 1;\n  clear_has_optimize_for();\n}\ninline ::google::protobuf::FileOptions_OptimizeMode FileOptions::optimize_for() const {\n  return static_cast< ::google::protobuf::FileOptions_OptimizeMode >(optimize_for_);\n}\ninline void FileOptions::set_optimize_for(::google::protobuf::FileOptions_OptimizeMode value) {\n  GOOGLE_DCHECK(::google::protobuf::FileOptions_OptimizeMode_IsValid(value));\n  set_has_optimize_for();\n  optimize_for_ = value;\n}\n\n// optional bool cc_generic_services = 16 [default = false];\ninline bool FileOptions::has_cc_generic_services() const {\n  return (_has_bits_[0] & 0x00000020u) != 0;\n}\ninline void FileOptions::set_has_cc_generic_services() {\n  _has_bits_[0] |= 0x00000020u;\n}\ninline void FileOptions::clear_has_cc_generic_services() {\n  _has_bits_[0] &= ~0x00000020u;\n}\ninline void FileOptions::clear_cc_generic_services() {\n  cc_generic_services_ = false;\n  clear_has_cc_generic_services();\n}\ninline bool FileOptions::cc_generic_services() const {\n  return cc_generic_services_;\n}\ninline void FileOptions::set_cc_generic_services(bool value) {\n  set_has_cc_generic_services();\n  cc_generic_services_ = value;\n}\n\n// optional bool java_generic_services = 17 [default = false];\ninline bool FileOptions::has_java_generic_services() const {\n  return (_has_bits_[0] & 0x00000040u) != 0;\n}\ninline void FileOptions::set_has_java_generic_services() {\n  _has_bits_[0] |= 0x00000040u;\n}\ninline void FileOptions::clear_has_java_generic_services() {\n  _has_bits_[0] &= ~0x00000040u;\n}\ninline void FileOptions::clear_java_generic_services() {\n  java_generic_services_ = false;\n  clear_has_java_generic_services();\n}\ninline bool FileOptions::java_generic_services() const {\n  return java_generic_services_;\n}\ninline void FileOptions::set_java_generic_services(bool value) {\n  set_has_java_generic_services();\n  java_generic_services_ = value;\n}\n\n// optional bool py_generic_services = 18 [default = false];\ninline bool FileOptions::has_py_generic_services() const {\n  return (_has_bits_[0] & 0x00000080u) != 0;\n}\ninline void FileOptions::set_has_py_generic_services() {\n  _has_bits_[0] |= 0x00000080u;\n}\ninline void FileOptions::clear_has_py_generic_services() {\n  _has_bits_[0] &= ~0x00000080u;\n}\ninline void FileOptions::clear_py_generic_services() {\n  py_generic_services_ = false;\n  clear_has_py_generic_services();\n}\ninline bool FileOptions::py_generic_services() const {\n  return py_generic_services_;\n}\ninline void FileOptions::set_py_generic_services(bool value) {\n  set_has_py_generic_services();\n  py_generic_services_ = value;\n}\n\n// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\ninline int FileOptions::uninterpreted_option_size() const {\n  return uninterpreted_option_.size();\n}\ninline void FileOptions::clear_uninterpreted_option() {\n  uninterpreted_option_.Clear();\n}\ninline const ::google::protobuf::UninterpretedOption& FileOptions::uninterpreted_option(int index) const {\n  return uninterpreted_option_.Get(index);\n}\ninline ::google::protobuf::UninterpretedOption* FileOptions::mutable_uninterpreted_option(int index) {\n  return uninterpreted_option_.Mutable(index);\n}\ninline ::google::protobuf::UninterpretedOption* FileOptions::add_uninterpreted_option() {\n  return uninterpreted_option_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\nFileOptions::uninterpreted_option() const {\n  return uninterpreted_option_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\nFileOptions::mutable_uninterpreted_option() {\n  return &uninterpreted_option_;\n}\n\n// -------------------------------------------------------------------\n\n// MessageOptions\n\n// optional bool message_set_wire_format = 1 [default = false];\ninline bool MessageOptions::has_message_set_wire_format() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void MessageOptions::set_has_message_set_wire_format() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void MessageOptions::clear_has_message_set_wire_format() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void MessageOptions::clear_message_set_wire_format() {\n  message_set_wire_format_ = false;\n  clear_has_message_set_wire_format();\n}\ninline bool MessageOptions::message_set_wire_format() const {\n  return message_set_wire_format_;\n}\ninline void MessageOptions::set_message_set_wire_format(bool value) {\n  set_has_message_set_wire_format();\n  message_set_wire_format_ = value;\n}\n\n// optional bool no_standard_descriptor_accessor = 2 [default = false];\ninline bool MessageOptions::has_no_standard_descriptor_accessor() const {\n  return (_has_bits_[0] & 0x00000002u) != 0;\n}\ninline void MessageOptions::set_has_no_standard_descriptor_accessor() {\n  _has_bits_[0] |= 0x00000002u;\n}\ninline void MessageOptions::clear_has_no_standard_descriptor_accessor() {\n  _has_bits_[0] &= ~0x00000002u;\n}\ninline void MessageOptions::clear_no_standard_descriptor_accessor() {\n  no_standard_descriptor_accessor_ = false;\n  clear_has_no_standard_descriptor_accessor();\n}\ninline bool MessageOptions::no_standard_descriptor_accessor() const {\n  return no_standard_descriptor_accessor_;\n}\ninline void MessageOptions::set_no_standard_descriptor_accessor(bool value) {\n  set_has_no_standard_descriptor_accessor();\n  no_standard_descriptor_accessor_ = value;\n}\n\n// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\ninline int MessageOptions::uninterpreted_option_size() const {\n  return uninterpreted_option_.size();\n}\ninline void MessageOptions::clear_uninterpreted_option() {\n  uninterpreted_option_.Clear();\n}\ninline const ::google::protobuf::UninterpretedOption& MessageOptions::uninterpreted_option(int index) const {\n  return uninterpreted_option_.Get(index);\n}\ninline ::google::protobuf::UninterpretedOption* MessageOptions::mutable_uninterpreted_option(int index) {\n  return uninterpreted_option_.Mutable(index);\n}\ninline ::google::protobuf::UninterpretedOption* MessageOptions::add_uninterpreted_option() {\n  return uninterpreted_option_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\nMessageOptions::uninterpreted_option() const {\n  return uninterpreted_option_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\nMessageOptions::mutable_uninterpreted_option() {\n  return &uninterpreted_option_;\n}\n\n// -------------------------------------------------------------------\n\n// FieldOptions\n\n// optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];\ninline bool FieldOptions::has_ctype() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void FieldOptions::set_has_ctype() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void FieldOptions::clear_has_ctype() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void FieldOptions::clear_ctype() {\n  ctype_ = 0;\n  clear_has_ctype();\n}\ninline ::google::protobuf::FieldOptions_CType FieldOptions::ctype() const {\n  return static_cast< ::google::protobuf::FieldOptions_CType >(ctype_);\n}\ninline void FieldOptions::set_ctype(::google::protobuf::FieldOptions_CType value) {\n  GOOGLE_DCHECK(::google::protobuf::FieldOptions_CType_IsValid(value));\n  set_has_ctype();\n  ctype_ = value;\n}\n\n// optional bool packed = 2;\ninline bool FieldOptions::has_packed() const {\n  return (_has_bits_[0] & 0x00000002u) != 0;\n}\ninline void FieldOptions::set_has_packed() {\n  _has_bits_[0] |= 0x00000002u;\n}\ninline void FieldOptions::clear_has_packed() {\n  _has_bits_[0] &= ~0x00000002u;\n}\ninline void FieldOptions::clear_packed() {\n  packed_ = false;\n  clear_has_packed();\n}\ninline bool FieldOptions::packed() const {\n  return packed_;\n}\ninline void FieldOptions::set_packed(bool value) {\n  set_has_packed();\n  packed_ = value;\n}\n\n// optional bool deprecated = 3 [default = false];\ninline bool FieldOptions::has_deprecated() const {\n  return (_has_bits_[0] & 0x00000004u) != 0;\n}\ninline void FieldOptions::set_has_deprecated() {\n  _has_bits_[0] |= 0x00000004u;\n}\ninline void FieldOptions::clear_has_deprecated() {\n  _has_bits_[0] &= ~0x00000004u;\n}\ninline void FieldOptions::clear_deprecated() {\n  deprecated_ = false;\n  clear_has_deprecated();\n}\ninline bool FieldOptions::deprecated() const {\n  return deprecated_;\n}\ninline void FieldOptions::set_deprecated(bool value) {\n  set_has_deprecated();\n  deprecated_ = value;\n}\n\n// optional string experimental_map_key = 9;\ninline bool FieldOptions::has_experimental_map_key() const {\n  return (_has_bits_[0] & 0x00000008u) != 0;\n}\ninline void FieldOptions::set_has_experimental_map_key() {\n  _has_bits_[0] |= 0x00000008u;\n}\ninline void FieldOptions::clear_has_experimental_map_key() {\n  _has_bits_[0] &= ~0x00000008u;\n}\ninline void FieldOptions::clear_experimental_map_key() {\n  if (experimental_map_key_ != &::google::protobuf::internal::kEmptyString) {\n    experimental_map_key_->clear();\n  }\n  clear_has_experimental_map_key();\n}\ninline const ::std::string& FieldOptions::experimental_map_key() const {\n  return *experimental_map_key_;\n}\ninline void FieldOptions::set_experimental_map_key(const ::std::string& value) {\n  set_has_experimental_map_key();\n  if (experimental_map_key_ == &::google::protobuf::internal::kEmptyString) {\n    experimental_map_key_ = new ::std::string;\n  }\n  experimental_map_key_->assign(value);\n}\ninline void FieldOptions::set_experimental_map_key(const char* value) {\n  set_has_experimental_map_key();\n  if (experimental_map_key_ == &::google::protobuf::internal::kEmptyString) {\n    experimental_map_key_ = new ::std::string;\n  }\n  experimental_map_key_->assign(value);\n}\ninline void FieldOptions::set_experimental_map_key(const char* value, size_t size) {\n  set_has_experimental_map_key();\n  if (experimental_map_key_ == &::google::protobuf::internal::kEmptyString) {\n    experimental_map_key_ = new ::std::string;\n  }\n  experimental_map_key_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* FieldOptions::mutable_experimental_map_key() {\n  set_has_experimental_map_key();\n  if (experimental_map_key_ == &::google::protobuf::internal::kEmptyString) {\n    experimental_map_key_ = new ::std::string;\n  }\n  return experimental_map_key_;\n}\ninline ::std::string* FieldOptions::release_experimental_map_key() {\n  clear_has_experimental_map_key();\n  if (experimental_map_key_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = experimental_map_key_;\n    experimental_map_key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\ninline int FieldOptions::uninterpreted_option_size() const {\n  return uninterpreted_option_.size();\n}\ninline void FieldOptions::clear_uninterpreted_option() {\n  uninterpreted_option_.Clear();\n}\ninline const ::google::protobuf::UninterpretedOption& FieldOptions::uninterpreted_option(int index) const {\n  return uninterpreted_option_.Get(index);\n}\ninline ::google::protobuf::UninterpretedOption* FieldOptions::mutable_uninterpreted_option(int index) {\n  return uninterpreted_option_.Mutable(index);\n}\ninline ::google::protobuf::UninterpretedOption* FieldOptions::add_uninterpreted_option() {\n  return uninterpreted_option_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\nFieldOptions::uninterpreted_option() const {\n  return uninterpreted_option_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\nFieldOptions::mutable_uninterpreted_option() {\n  return &uninterpreted_option_;\n}\n\n// -------------------------------------------------------------------\n\n// EnumOptions\n\n// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\ninline int EnumOptions::uninterpreted_option_size() const {\n  return uninterpreted_option_.size();\n}\ninline void EnumOptions::clear_uninterpreted_option() {\n  uninterpreted_option_.Clear();\n}\ninline const ::google::protobuf::UninterpretedOption& EnumOptions::uninterpreted_option(int index) const {\n  return uninterpreted_option_.Get(index);\n}\ninline ::google::protobuf::UninterpretedOption* EnumOptions::mutable_uninterpreted_option(int index) {\n  return uninterpreted_option_.Mutable(index);\n}\ninline ::google::protobuf::UninterpretedOption* EnumOptions::add_uninterpreted_option() {\n  return uninterpreted_option_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\nEnumOptions::uninterpreted_option() const {\n  return uninterpreted_option_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\nEnumOptions::mutable_uninterpreted_option() {\n  return &uninterpreted_option_;\n}\n\n// -------------------------------------------------------------------\n\n// EnumValueOptions\n\n// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\ninline int EnumValueOptions::uninterpreted_option_size() const {\n  return uninterpreted_option_.size();\n}\ninline void EnumValueOptions::clear_uninterpreted_option() {\n  uninterpreted_option_.Clear();\n}\ninline const ::google::protobuf::UninterpretedOption& EnumValueOptions::uninterpreted_option(int index) const {\n  return uninterpreted_option_.Get(index);\n}\ninline ::google::protobuf::UninterpretedOption* EnumValueOptions::mutable_uninterpreted_option(int index) {\n  return uninterpreted_option_.Mutable(index);\n}\ninline ::google::protobuf::UninterpretedOption* EnumValueOptions::add_uninterpreted_option() {\n  return uninterpreted_option_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\nEnumValueOptions::uninterpreted_option() const {\n  return uninterpreted_option_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\nEnumValueOptions::mutable_uninterpreted_option() {\n  return &uninterpreted_option_;\n}\n\n// -------------------------------------------------------------------\n\n// ServiceOptions\n\n// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\ninline int ServiceOptions::uninterpreted_option_size() const {\n  return uninterpreted_option_.size();\n}\ninline void ServiceOptions::clear_uninterpreted_option() {\n  uninterpreted_option_.Clear();\n}\ninline const ::google::protobuf::UninterpretedOption& ServiceOptions::uninterpreted_option(int index) const {\n  return uninterpreted_option_.Get(index);\n}\ninline ::google::protobuf::UninterpretedOption* ServiceOptions::mutable_uninterpreted_option(int index) {\n  return uninterpreted_option_.Mutable(index);\n}\ninline ::google::protobuf::UninterpretedOption* ServiceOptions::add_uninterpreted_option() {\n  return uninterpreted_option_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\nServiceOptions::uninterpreted_option() const {\n  return uninterpreted_option_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\nServiceOptions::mutable_uninterpreted_option() {\n  return &uninterpreted_option_;\n}\n\n// -------------------------------------------------------------------\n\n// MethodOptions\n\n// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;\ninline int MethodOptions::uninterpreted_option_size() const {\n  return uninterpreted_option_.size();\n}\ninline void MethodOptions::clear_uninterpreted_option() {\n  uninterpreted_option_.Clear();\n}\ninline const ::google::protobuf::UninterpretedOption& MethodOptions::uninterpreted_option(int index) const {\n  return uninterpreted_option_.Get(index);\n}\ninline ::google::protobuf::UninterpretedOption* MethodOptions::mutable_uninterpreted_option(int index) {\n  return uninterpreted_option_.Mutable(index);\n}\ninline ::google::protobuf::UninterpretedOption* MethodOptions::add_uninterpreted_option() {\n  return uninterpreted_option_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >&\nMethodOptions::uninterpreted_option() const {\n  return uninterpreted_option_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >*\nMethodOptions::mutable_uninterpreted_option() {\n  return &uninterpreted_option_;\n}\n\n// -------------------------------------------------------------------\n\n// UninterpretedOption_NamePart\n\n// required string name_part = 1;\ninline bool UninterpretedOption_NamePart::has_name_part() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void UninterpretedOption_NamePart::set_has_name_part() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void UninterpretedOption_NamePart::clear_has_name_part() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void UninterpretedOption_NamePart::clear_name_part() {\n  if (name_part_ != &::google::protobuf::internal::kEmptyString) {\n    name_part_->clear();\n  }\n  clear_has_name_part();\n}\ninline const ::std::string& UninterpretedOption_NamePart::name_part() const {\n  return *name_part_;\n}\ninline void UninterpretedOption_NamePart::set_name_part(const ::std::string& value) {\n  set_has_name_part();\n  if (name_part_ == &::google::protobuf::internal::kEmptyString) {\n    name_part_ = new ::std::string;\n  }\n  name_part_->assign(value);\n}\ninline void UninterpretedOption_NamePart::set_name_part(const char* value) {\n  set_has_name_part();\n  if (name_part_ == &::google::protobuf::internal::kEmptyString) {\n    name_part_ = new ::std::string;\n  }\n  name_part_->assign(value);\n}\ninline void UninterpretedOption_NamePart::set_name_part(const char* value, size_t size) {\n  set_has_name_part();\n  if (name_part_ == &::google::protobuf::internal::kEmptyString) {\n    name_part_ = new ::std::string;\n  }\n  name_part_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* UninterpretedOption_NamePart::mutable_name_part() {\n  set_has_name_part();\n  if (name_part_ == &::google::protobuf::internal::kEmptyString) {\n    name_part_ = new ::std::string;\n  }\n  return name_part_;\n}\ninline ::std::string* UninterpretedOption_NamePart::release_name_part() {\n  clear_has_name_part();\n  if (name_part_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = name_part_;\n    name_part_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// required bool is_extension = 2;\ninline bool UninterpretedOption_NamePart::has_is_extension() const {\n  return (_has_bits_[0] & 0x00000002u) != 0;\n}\ninline void UninterpretedOption_NamePart::set_has_is_extension() {\n  _has_bits_[0] |= 0x00000002u;\n}\ninline void UninterpretedOption_NamePart::clear_has_is_extension() {\n  _has_bits_[0] &= ~0x00000002u;\n}\ninline void UninterpretedOption_NamePart::clear_is_extension() {\n  is_extension_ = false;\n  clear_has_is_extension();\n}\ninline bool UninterpretedOption_NamePart::is_extension() const {\n  return is_extension_;\n}\ninline void UninterpretedOption_NamePart::set_is_extension(bool value) {\n  set_has_is_extension();\n  is_extension_ = value;\n}\n\n// -------------------------------------------------------------------\n\n// UninterpretedOption\n\n// repeated .google.protobuf.UninterpretedOption.NamePart name = 2;\ninline int UninterpretedOption::name_size() const {\n  return name_.size();\n}\ninline void UninterpretedOption::clear_name() {\n  name_.Clear();\n}\ninline const ::google::protobuf::UninterpretedOption_NamePart& UninterpretedOption::name(int index) const {\n  return name_.Get(index);\n}\ninline ::google::protobuf::UninterpretedOption_NamePart* UninterpretedOption::mutable_name(int index) {\n  return name_.Mutable(index);\n}\ninline ::google::protobuf::UninterpretedOption_NamePart* UninterpretedOption::add_name() {\n  return name_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >&\nUninterpretedOption::name() const {\n  return name_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >*\nUninterpretedOption::mutable_name() {\n  return &name_;\n}\n\n// optional string identifier_value = 3;\ninline bool UninterpretedOption::has_identifier_value() const {\n  return (_has_bits_[0] & 0x00000002u) != 0;\n}\ninline void UninterpretedOption::set_has_identifier_value() {\n  _has_bits_[0] |= 0x00000002u;\n}\ninline void UninterpretedOption::clear_has_identifier_value() {\n  _has_bits_[0] &= ~0x00000002u;\n}\ninline void UninterpretedOption::clear_identifier_value() {\n  if (identifier_value_ != &::google::protobuf::internal::kEmptyString) {\n    identifier_value_->clear();\n  }\n  clear_has_identifier_value();\n}\ninline const ::std::string& UninterpretedOption::identifier_value() const {\n  return *identifier_value_;\n}\ninline void UninterpretedOption::set_identifier_value(const ::std::string& value) {\n  set_has_identifier_value();\n  if (identifier_value_ == &::google::protobuf::internal::kEmptyString) {\n    identifier_value_ = new ::std::string;\n  }\n  identifier_value_->assign(value);\n}\ninline void UninterpretedOption::set_identifier_value(const char* value) {\n  set_has_identifier_value();\n  if (identifier_value_ == &::google::protobuf::internal::kEmptyString) {\n    identifier_value_ = new ::std::string;\n  }\n  identifier_value_->assign(value);\n}\ninline void UninterpretedOption::set_identifier_value(const char* value, size_t size) {\n  set_has_identifier_value();\n  if (identifier_value_ == &::google::protobuf::internal::kEmptyString) {\n    identifier_value_ = new ::std::string;\n  }\n  identifier_value_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* UninterpretedOption::mutable_identifier_value() {\n  set_has_identifier_value();\n  if (identifier_value_ == &::google::protobuf::internal::kEmptyString) {\n    identifier_value_ = new ::std::string;\n  }\n  return identifier_value_;\n}\ninline ::std::string* UninterpretedOption::release_identifier_value() {\n  clear_has_identifier_value();\n  if (identifier_value_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = identifier_value_;\n    identifier_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional uint64 positive_int_value = 4;\ninline bool UninterpretedOption::has_positive_int_value() const {\n  return (_has_bits_[0] & 0x00000004u) != 0;\n}\ninline void UninterpretedOption::set_has_positive_int_value() {\n  _has_bits_[0] |= 0x00000004u;\n}\ninline void UninterpretedOption::clear_has_positive_int_value() {\n  _has_bits_[0] &= ~0x00000004u;\n}\ninline void UninterpretedOption::clear_positive_int_value() {\n  positive_int_value_ = GOOGLE_ULONGLONG(0);\n  clear_has_positive_int_value();\n}\ninline ::google::protobuf::uint64 UninterpretedOption::positive_int_value() const {\n  return positive_int_value_;\n}\ninline void UninterpretedOption::set_positive_int_value(::google::protobuf::uint64 value) {\n  set_has_positive_int_value();\n  positive_int_value_ = value;\n}\n\n// optional int64 negative_int_value = 5;\ninline bool UninterpretedOption::has_negative_int_value() const {\n  return (_has_bits_[0] & 0x00000008u) != 0;\n}\ninline void UninterpretedOption::set_has_negative_int_value() {\n  _has_bits_[0] |= 0x00000008u;\n}\ninline void UninterpretedOption::clear_has_negative_int_value() {\n  _has_bits_[0] &= ~0x00000008u;\n}\ninline void UninterpretedOption::clear_negative_int_value() {\n  negative_int_value_ = GOOGLE_LONGLONG(0);\n  clear_has_negative_int_value();\n}\ninline ::google::protobuf::int64 UninterpretedOption::negative_int_value() const {\n  return negative_int_value_;\n}\ninline void UninterpretedOption::set_negative_int_value(::google::protobuf::int64 value) {\n  set_has_negative_int_value();\n  negative_int_value_ = value;\n}\n\n// optional double double_value = 6;\ninline bool UninterpretedOption::has_double_value() const {\n  return (_has_bits_[0] & 0x00000010u) != 0;\n}\ninline void UninterpretedOption::set_has_double_value() {\n  _has_bits_[0] |= 0x00000010u;\n}\ninline void UninterpretedOption::clear_has_double_value() {\n  _has_bits_[0] &= ~0x00000010u;\n}\ninline void UninterpretedOption::clear_double_value() {\n  double_value_ = 0;\n  clear_has_double_value();\n}\ninline double UninterpretedOption::double_value() const {\n  return double_value_;\n}\ninline void UninterpretedOption::set_double_value(double value) {\n  set_has_double_value();\n  double_value_ = value;\n}\n\n// optional bytes string_value = 7;\ninline bool UninterpretedOption::has_string_value() const {\n  return (_has_bits_[0] & 0x00000020u) != 0;\n}\ninline void UninterpretedOption::set_has_string_value() {\n  _has_bits_[0] |= 0x00000020u;\n}\ninline void UninterpretedOption::clear_has_string_value() {\n  _has_bits_[0] &= ~0x00000020u;\n}\ninline void UninterpretedOption::clear_string_value() {\n  if (string_value_ != &::google::protobuf::internal::kEmptyString) {\n    string_value_->clear();\n  }\n  clear_has_string_value();\n}\ninline const ::std::string& UninterpretedOption::string_value() const {\n  return *string_value_;\n}\ninline void UninterpretedOption::set_string_value(const ::std::string& value) {\n  set_has_string_value();\n  if (string_value_ == &::google::protobuf::internal::kEmptyString) {\n    string_value_ = new ::std::string;\n  }\n  string_value_->assign(value);\n}\ninline void UninterpretedOption::set_string_value(const char* value) {\n  set_has_string_value();\n  if (string_value_ == &::google::protobuf::internal::kEmptyString) {\n    string_value_ = new ::std::string;\n  }\n  string_value_->assign(value);\n}\ninline void UninterpretedOption::set_string_value(const void* value, size_t size) {\n  set_has_string_value();\n  if (string_value_ == &::google::protobuf::internal::kEmptyString) {\n    string_value_ = new ::std::string;\n  }\n  string_value_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* UninterpretedOption::mutable_string_value() {\n  set_has_string_value();\n  if (string_value_ == &::google::protobuf::internal::kEmptyString) {\n    string_value_ = new ::std::string;\n  }\n  return string_value_;\n}\ninline ::std::string* UninterpretedOption::release_string_value() {\n  clear_has_string_value();\n  if (string_value_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = string_value_;\n    string_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// optional string aggregate_value = 8;\ninline bool UninterpretedOption::has_aggregate_value() const {\n  return (_has_bits_[0] & 0x00000040u) != 0;\n}\ninline void UninterpretedOption::set_has_aggregate_value() {\n  _has_bits_[0] |= 0x00000040u;\n}\ninline void UninterpretedOption::clear_has_aggregate_value() {\n  _has_bits_[0] &= ~0x00000040u;\n}\ninline void UninterpretedOption::clear_aggregate_value() {\n  if (aggregate_value_ != &::google::protobuf::internal::kEmptyString) {\n    aggregate_value_->clear();\n  }\n  clear_has_aggregate_value();\n}\ninline const ::std::string& UninterpretedOption::aggregate_value() const {\n  return *aggregate_value_;\n}\ninline void UninterpretedOption::set_aggregate_value(const ::std::string& value) {\n  set_has_aggregate_value();\n  if (aggregate_value_ == &::google::protobuf::internal::kEmptyString) {\n    aggregate_value_ = new ::std::string;\n  }\n  aggregate_value_->assign(value);\n}\ninline void UninterpretedOption::set_aggregate_value(const char* value) {\n  set_has_aggregate_value();\n  if (aggregate_value_ == &::google::protobuf::internal::kEmptyString) {\n    aggregate_value_ = new ::std::string;\n  }\n  aggregate_value_->assign(value);\n}\ninline void UninterpretedOption::set_aggregate_value(const char* value, size_t size) {\n  set_has_aggregate_value();\n  if (aggregate_value_ == &::google::protobuf::internal::kEmptyString) {\n    aggregate_value_ = new ::std::string;\n  }\n  aggregate_value_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* UninterpretedOption::mutable_aggregate_value() {\n  set_has_aggregate_value();\n  if (aggregate_value_ == &::google::protobuf::internal::kEmptyString) {\n    aggregate_value_ = new ::std::string;\n  }\n  return aggregate_value_;\n}\ninline ::std::string* UninterpretedOption::release_aggregate_value() {\n  clear_has_aggregate_value();\n  if (aggregate_value_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = aggregate_value_;\n    aggregate_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\n\n// -------------------------------------------------------------------\n\n// SourceCodeInfo_Location\n\n// repeated int32 path = 1 [packed = true];\ninline int SourceCodeInfo_Location::path_size() const {\n  return path_.size();\n}\ninline void SourceCodeInfo_Location::clear_path() {\n  path_.Clear();\n}\ninline ::google::protobuf::int32 SourceCodeInfo_Location::path(int index) const {\n  return path_.Get(index);\n}\ninline void SourceCodeInfo_Location::set_path(int index, ::google::protobuf::int32 value) {\n  path_.Set(index, value);\n}\ninline void SourceCodeInfo_Location::add_path(::google::protobuf::int32 value) {\n  path_.Add(value);\n}\ninline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&\nSourceCodeInfo_Location::path() const {\n  return path_;\n}\ninline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*\nSourceCodeInfo_Location::mutable_path() {\n  return &path_;\n}\n\n// repeated int32 span = 2 [packed = true];\ninline int SourceCodeInfo_Location::span_size() const {\n  return span_.size();\n}\ninline void SourceCodeInfo_Location::clear_span() {\n  span_.Clear();\n}\ninline ::google::protobuf::int32 SourceCodeInfo_Location::span(int index) const {\n  return span_.Get(index);\n}\ninline void SourceCodeInfo_Location::set_span(int index, ::google::protobuf::int32 value) {\n  span_.Set(index, value);\n}\ninline void SourceCodeInfo_Location::add_span(::google::protobuf::int32 value) {\n  span_.Add(value);\n}\ninline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >&\nSourceCodeInfo_Location::span() const {\n  return span_;\n}\ninline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >*\nSourceCodeInfo_Location::mutable_span() {\n  return &span_;\n}\n\n// -------------------------------------------------------------------\n\n// SourceCodeInfo\n\n// repeated .google.protobuf.SourceCodeInfo.Location location = 1;\ninline int SourceCodeInfo::location_size() const {\n  return location_.size();\n}\ninline void SourceCodeInfo::clear_location() {\n  location_.Clear();\n}\ninline const ::google::protobuf::SourceCodeInfo_Location& SourceCodeInfo::location(int index) const {\n  return location_.Get(index);\n}\ninline ::google::protobuf::SourceCodeInfo_Location* SourceCodeInfo::mutable_location(int index) {\n  return location_.Mutable(index);\n}\ninline ::google::protobuf::SourceCodeInfo_Location* SourceCodeInfo::add_location() {\n  return location_.Add();\n}\ninline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >&\nSourceCodeInfo::location() const {\n  return location_;\n}\ninline ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >*\nSourceCodeInfo::mutable_location() {\n  return &location_;\n}\n\n\n// @@protoc_insertion_point(namespace_scope)\n\n}  // namespace protobuf\n}  // namespace google\n\n#ifndef SWIG\nnamespace google {\nnamespace protobuf {\n\ntemplate <>\ninline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldDescriptorProto_Type>() {\n  return ::google::protobuf::FieldDescriptorProto_Type_descriptor();\n}\ntemplate <>\ninline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldDescriptorProto_Label>() {\n  return ::google::protobuf::FieldDescriptorProto_Label_descriptor();\n}\ntemplate <>\ninline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FileOptions_OptimizeMode>() {\n  return ::google::protobuf::FileOptions_OptimizeMode_descriptor();\n}\ntemplate <>\ninline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldOptions_CType>() {\n  return ::google::protobuf::FieldOptions_CType_descriptor();\n}\n\n}  // namespace google\n}  // namespace protobuf\n#endif  // SWIG\n\n// @@protoc_insertion_point(global_scope)\n\n#endif  // PROTOBUF_google_2fprotobuf_2fdescriptor_2eproto__INCLUDED\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// The messages in this file describe the definitions found in .proto files.\n// A valid .proto file can be translated directly to a FileDescriptorProto\n// without any other information (e.g. without reading its imports).\n\n\n\npackage google.protobuf;\noption java_package = \"com.google.protobuf\";\noption java_outer_classname = \"DescriptorProtos\";\n\n// descriptor.proto must be optimized for speed because reflection-based\n// algorithms don't work during bootstrapping.\noption optimize_for = SPEED;\n\n// The protocol compiler can output a FileDescriptorSet containing the .proto\n// files it parses.\nmessage FileDescriptorSet {\n  repeated FileDescriptorProto file = 1;\n}\n\n// Describes a complete .proto file.\nmessage FileDescriptorProto {\n  optional string name = 1;       // file name, relative to root of source tree\n  optional string package = 2;    // e.g. \"foo\", \"foo.bar\", etc.\n\n  // Names of files imported by this file.\n  repeated string dependency = 3;\n\n  // All top-level definitions in this file.\n  repeated DescriptorProto message_type = 4;\n  repeated EnumDescriptorProto enum_type = 5;\n  repeated ServiceDescriptorProto service = 6;\n  repeated FieldDescriptorProto extension = 7;\n\n  optional FileOptions options = 8;\n\n  // This field contains optional information about the original source code.\n  // You may safely remove this entire field whithout harming runtime\n  // functionality of the descriptors -- the information is needed only by\n  // development tools.\n  optional SourceCodeInfo source_code_info = 9;\n}\n\n// Describes a message type.\nmessage DescriptorProto {\n  optional string name = 1;\n\n  repeated FieldDescriptorProto field = 2;\n  repeated FieldDescriptorProto extension = 6;\n\n  repeated DescriptorProto nested_type = 3;\n  repeated EnumDescriptorProto enum_type = 4;\n\n  message ExtensionRange {\n    optional int32 start = 1;\n    optional int32 end = 2;\n  }\n  repeated ExtensionRange extension_range = 5;\n\n  optional MessageOptions options = 7;\n}\n\n// Describes a field within a message.\nmessage FieldDescriptorProto {\n  enum Type {\n    // 0 is reserved for errors.\n    // Order is weird for historical reasons.\n    TYPE_DOUBLE         = 1;\n    TYPE_FLOAT          = 2;\n    TYPE_INT64          = 3;   // Not ZigZag encoded.  Negative numbers\n                               // take 10 bytes.  Use TYPE_SINT64 if negative\n                               // values are likely.\n    TYPE_UINT64         = 4;\n    TYPE_INT32          = 5;   // Not ZigZag encoded.  Negative numbers\n                               // take 10 bytes.  Use TYPE_SINT32 if negative\n                               // values are likely.\n    TYPE_FIXED64        = 6;\n    TYPE_FIXED32        = 7;\n    TYPE_BOOL           = 8;\n    TYPE_STRING         = 9;\n    TYPE_GROUP          = 10;  // Tag-delimited aggregate.\n    TYPE_MESSAGE        = 11;  // Length-delimited aggregate.\n\n    // New in version 2.\n    TYPE_BYTES          = 12;\n    TYPE_UINT32         = 13;\n    TYPE_ENUM           = 14;\n    TYPE_SFIXED32       = 15;\n    TYPE_SFIXED64       = 16;\n    TYPE_SINT32         = 17;  // Uses ZigZag encoding.\n    TYPE_SINT64         = 18;  // Uses ZigZag encoding.\n  };\n\n  enum Label {\n    // 0 is reserved for errors\n    LABEL_OPTIONAL      = 1;\n    LABEL_REQUIRED      = 2;\n    LABEL_REPEATED      = 3;\n    // TODO(sanjay): Should we add LABEL_MAP?\n  };\n\n  optional string name = 1;\n  optional int32 number = 3;\n  optional Label label = 4;\n\n  // If type_name is set, this need not be set.  If both this and type_name\n  // are set, this must be either TYPE_ENUM or TYPE_MESSAGE.\n  optional Type type = 5;\n\n  // For message and enum types, this is the name of the type.  If the name\n  // starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping\n  // rules are used to find the type (i.e. first the nested types within this\n  // message are searched, then within the parent, on up to the root\n  // namespace).\n  optional string type_name = 6;\n\n  // For extensions, this is the name of the type being extended.  It is\n  // resolved in the same manner as type_name.\n  optional string extendee = 2;\n\n  // For numeric types, contains the original text representation of the value.\n  // For booleans, \"true\" or \"false\".\n  // For strings, contains the default text contents (not escaped in any way).\n  // For bytes, contains the C escaped value.  All bytes >= 128 are escaped.\n  // TODO(kenton):  Base-64 encode?\n  optional string default_value = 7;\n\n  optional FieldOptions options = 8;\n}\n\n// Describes an enum type.\nmessage EnumDescriptorProto {\n  optional string name = 1;\n\n  repeated EnumValueDescriptorProto value = 2;\n\n  optional EnumOptions options = 3;\n}\n\n// Describes a value within an enum.\nmessage EnumValueDescriptorProto {\n  optional string name = 1;\n  optional int32 number = 2;\n\n  optional EnumValueOptions options = 3;\n}\n\n// Describes a service.\nmessage ServiceDescriptorProto {\n  optional string name = 1;\n  repeated MethodDescriptorProto method = 2;\n\n  optional ServiceOptions options = 3;\n}\n\n// Describes a method of a service.\nmessage MethodDescriptorProto {\n  optional string name = 1;\n\n  // Input and output type names.  These are resolved in the same way as\n  // FieldDescriptorProto.type_name, but must refer to a message type.\n  optional string input_type = 2;\n  optional string output_type = 3;\n\n  optional MethodOptions options = 4;\n}\n\n// ===================================================================\n// Options\n\n// Each of the definitions above may have \"options\" attached.  These are\n// just annotations which may cause code to be generated slightly differently\n// or may contain hints for code that manipulates protocol messages.\n//\n// Clients may define custom options as extensions of the *Options messages.\n// These extensions may not yet be known at parsing time, so the parser cannot\n// store the values in them.  Instead it stores them in a field in the *Options\n// message called uninterpreted_option. This field must have the same name\n// across all *Options messages. We then use this field to populate the\n// extensions when we build a descriptor, at which point all protos have been\n// parsed and so all extensions are known.\n//\n// Extension numbers for custom options may be chosen as follows:\n// * For options which will only be used within a single application or\n//   organization, or for experimental options, use field numbers 50000\n//   through 99999.  It is up to you to ensure that you do not use the\n//   same number for multiple options.\n// * For options which will be published and used publicly by multiple\n//   independent entities, e-mail protobuf-global-extension-registry@google.com\n//   to reserve extension numbers. Simply provide your project name (e.g.\n//   Object-C plugin) and your porject website (if available) -- there's no need\n//   to explain how you intend to use them. Usually you only need one extension\n//   number. You can declare multiple options with only one extension number by\n//   putting them in a sub-message. See the Custom Options section of the docs\n//   for examples:\n//   http://code.google.com/apis/protocolbuffers/docs/proto.html#options\n//   If this turns out to be popular, a web service will be set up\n//   to automatically assign option numbers.\n\n\nmessage FileOptions {\n\n  // Sets the Java package where classes generated from this .proto will be\n  // placed.  By default, the proto package is used, but this is often\n  // inappropriate because proto packages do not normally start with backwards\n  // domain names.\n  optional string java_package = 1;\n\n\n  // If set, all the classes from the .proto file are wrapped in a single\n  // outer class with the given name.  This applies to both Proto1\n  // (equivalent to the old \"--one_java_file\" option) and Proto2 (where\n  // a .proto always translates to a single class, but you may want to\n  // explicitly choose the class name).\n  optional string java_outer_classname = 8;\n\n  // If set true, then the Java code generator will generate a separate .java\n  // file for each top-level message, enum, and service defined in the .proto\n  // file.  Thus, these types will *not* be nested inside the outer class\n  // named by java_outer_classname.  However, the outer class will still be\n  // generated to contain the file's getDescriptor() method as well as any\n  // top-level extensions defined in the file.\n  optional bool java_multiple_files = 10 [default=false];\n\n  // If set true, then the Java code generator will generate equals() and\n  // hashCode() methods for all messages defined in the .proto file. This is\n  // purely a speed optimization, as the AbstractMessage base class includes\n  // reflection-based implementations of these methods.\n  optional bool java_generate_equals_and_hash = 20 [default=false];\n\n  // Generated classes can be optimized for speed or code size.\n  enum OptimizeMode {\n    SPEED = 1;        // Generate complete code for parsing, serialization,\n                      // etc.\n    CODE_SIZE = 2;    // Use ReflectionOps to implement these methods.\n    LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime.\n  }\n  optional OptimizeMode optimize_for = 9 [default=SPEED];\n\n\n\n\n  // Should generic services be generated in each language?  \"Generic\" services\n  // are not specific to any particular RPC system.  They are generated by the\n  // main code generators in each language (without additional plugins).\n  // Generic services were the only kind of service generation supported by\n  // early versions of proto2.\n  //\n  // Generic services are now considered deprecated in favor of using plugins\n  // that generate code specific to your particular RPC system.  Therefore,\n  // these default to false.  Old code which depends on generic services should\n  // explicitly set them to true.\n  optional bool cc_generic_services = 16 [default=false];\n  optional bool java_generic_services = 17 [default=false];\n  optional bool py_generic_services = 18 [default=false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage MessageOptions {\n  // Set true to use the old proto1 MessageSet wire format for extensions.\n  // This is provided for backwards-compatibility with the MessageSet wire\n  // format.  You should not use this for any other reason:  It's less\n  // efficient, has fewer features, and is more complicated.\n  //\n  // The message must be defined exactly as follows:\n  //   message Foo {\n  //     option message_set_wire_format = true;\n  //     extensions 4 to max;\n  //   }\n  // Note that the message cannot have any defined fields; MessageSets only\n  // have extensions.\n  //\n  // All extensions of your type must be singular messages; e.g. they cannot\n  // be int32s, enums, or repeated messages.\n  //\n  // Because this is an option, the above two restrictions are not enforced by\n  // the protocol compiler.\n  optional bool message_set_wire_format = 1 [default=false];\n\n  // Disables the generation of the standard \"descriptor()\" accessor, which can\n  // conflict with a field of the same name.  This is meant to make migration\n  // from proto1 easier; new code should avoid fields named \"descriptor\".\n  optional bool no_standard_descriptor_accessor = 2 [default=false];\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage FieldOptions {\n  // The ctype option instructs the C++ code generator to use a different\n  // representation of the field than it normally would.  See the specific\n  // options below.  This option is not yet implemented in the open source\n  // release -- sorry, we'll try to include it in a future version!\n  optional CType ctype = 1 [default = STRING];\n  enum CType {\n    // Default mode.\n    STRING = 0;\n\n    CORD = 1;\n\n    STRING_PIECE = 2;\n  }\n  // The packed option can be enabled for repeated primitive fields to enable\n  // a more efficient representation on the wire. Rather than repeatedly\n  // writing the tag and type for each element, the entire array is encoded as\n  // a single length-delimited blob.\n  optional bool packed = 2;\n\n\n  // Is this field deprecated?\n  // Depending on the target platform, this can emit Deprecated annotations\n  // for accessors, or it will be completely ignored; in the very least, this\n  // is a formalization for deprecating fields.\n  optional bool deprecated = 3 [default=false];\n\n  // EXPERIMENTAL.  DO NOT USE.\n  // For \"map\" fields, the name of the field in the enclosed type that\n  // is the key for this map.  For example, suppose we have:\n  //   message Item {\n  //     required string name = 1;\n  //     required string value = 2;\n  //   }\n  //   message Config {\n  //     repeated Item items = 1 [experimental_map_key=\"name\"];\n  //   }\n  // In this situation, the map key for Item will be set to \"name\".\n  // TODO: Fully-implement this, then remove the \"experimental_\" prefix.\n  optional string experimental_map_key = 9;\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumOptions {\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage EnumValueOptions {\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage ServiceOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\nmessage MethodOptions {\n\n  // Note:  Field numbers 1 through 32 are reserved for Google's internal RPC\n  //   framework.  We apologize for hoarding these numbers to ourselves, but\n  //   we were already using them long before we decided to release Protocol\n  //   Buffers.\n\n  // The parser stores options it doesn't recognize here. See above.\n  repeated UninterpretedOption uninterpreted_option = 999;\n\n  // Clients can define custom options in extensions of this message. See above.\n  extensions 1000 to max;\n}\n\n// A message representing a option the parser does not recognize. This only\n// appears in options protos created by the compiler::Parser class.\n// DescriptorPool resolves these when building Descriptor objects. Therefore,\n// options protos in descriptor objects (e.g. returned by Descriptor::options(),\n// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions\n// in them.\nmessage UninterpretedOption {\n  // The name of the uninterpreted option.  Each string represents a segment in\n  // a dot-separated name.  is_extension is true iff a segment represents an\n  // extension (denoted with parentheses in options specs in .proto files).\n  // E.g.,{ [\"foo\", false], [\"bar.baz\", true], [\"qux\", false] } represents\n  // \"foo.(bar.baz).qux\".\n  message NamePart {\n    required string name_part = 1;\n    required bool is_extension = 2;\n  }\n  repeated NamePart name = 2;\n\n  // The value of the uninterpreted option, in whatever type the tokenizer\n  // identified it as during parsing. Exactly one of these should be set.\n  optional string identifier_value = 3;\n  optional uint64 positive_int_value = 4;\n  optional int64 negative_int_value = 5;\n  optional double double_value = 6;\n  optional bytes string_value = 7;\n  optional string aggregate_value = 8;\n}\n\n// ===================================================================\n// Optional source code info\n\n// Encapsulates information about the original source file from which a\n// FileDescriptorProto was generated.\nmessage SourceCodeInfo {\n  // A Location identifies a piece of source code in a .proto file which\n  // corresponds to a particular definition.  This information is intended\n  // to be useful to IDEs, code indexers, documentation generators, and similar\n  // tools.\n  //\n  // For example, say we have a file like:\n  //   message Foo {\n  //     optional string foo = 1;\n  //   }\n  // Let's look at just the field definition:\n  //   optional string foo = 1;\n  //   ^       ^^     ^^  ^  ^^^\n  //   a       bc     de  f  ghi\n  // We have the following locations:\n  //   span   path               represents\n  //   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.\n  //   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).\n  //   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).\n  //   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).\n  //   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).\n  //\n  // Notes:\n  // - A location may refer to a repeated field itself (i.e. not to any\n  //   particular index within it).  This is used whenever a set of elements are\n  //   logically enclosed in a single code segment.  For example, an entire\n  //   extend block (possibly containing multiple extension definitions) will\n  //   have an outer location whose path refers to the \"extensions\" repeated\n  //   field without an index.\n  // - Multiple locations may have the same path.  This happens when a single\n  //   logical declaration is spread out across multiple places.  The most\n  //   obvious example is the \"extend\" block again -- there may be multiple\n  //   extend blocks in the same scope, each of which will have the same path.\n  // - A location's span is not always a subset of its parent's span.  For\n  //   example, the \"extendee\" of an extension declaration appears at the\n  //   beginning of the \"extend\" block and is shared by all extensions within\n  //   the block.\n  // - Just because a location's span is a subset of some other location's span\n  //   does not mean that it is a descendent.  For example, a \"group\" defines\n  //   both a type and a field in a single declaration.  Thus, the locations\n  //   corresponding to the type and field and their components will overlap.\n  // - Code which tries to interpret locations should probably be designed to\n  //   ignore those that it doesn't understand, as more types of locations could\n  //   be recorded in the future.\n  repeated Location location = 1;\n  message Location {\n    // Identifies which part of the FileDescriptorProto was defined at this\n    // location.\n    //\n    // Each element is a field number or an index.  They form a path from\n    // the root FileDescriptorProto to the place where the definition.  For\n    // example, this path:\n    //   [ 4, 3, 2, 7, 1 ]\n    // refers to:\n    //   file.message_type(3)  // 4, 3\n    //       .field(7)         // 2, 7\n    //       .name()           // 1\n    // This is because FileDescriptorProto.message_type has field number 4:\n    //   repeated DescriptorProto message_type = 4;\n    // and DescriptorProto.field has field number 2:\n    //   repeated FieldDescriptorProto field = 2;\n    // and FieldDescriptorProto.name has field number 1:\n    //   optional string name = 1;\n    //\n    // Thus, the above path gives the location of a field name.  If we removed\n    // the last element:\n    //   [ 4, 3, 2, 7 ]\n    // this path refers to the whole field declaration (from the beginning\n    // of the label to the terminating semicolon).\n    repeated int32 path = 1 [packed=true];\n\n    // Always has exactly three or four elements: start line, start column,\n    // end line (optional, otherwise assumed same as start line), end column.\n    // These are packed into a single field for efficiency.  Note that line\n    // and column numbers are zero-based -- typically you will want to add\n    // 1 to each before displaying to a user.\n    repeated int32 span = 2 [packed=true];\n\n    // TODO(kenton):  Record comments appearing before and after the\n    // declaration.\n  }\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/descriptor_database.h>\n\n#include <set>\n\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/wire_format_lite_inl.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n#include <google/protobuf/stubs/map-util.h>\n\nnamespace google {\nnamespace protobuf {\n\nDescriptorDatabase::~DescriptorDatabase() {}\n\n// ===================================================================\n\ntemplate <typename Value>\nbool SimpleDescriptorDatabase::DescriptorIndex<Value>::AddFile(\n    const FileDescriptorProto& file,\n    Value value) {\n  if (!InsertIfNotPresent(&by_name_, file.name(), value)) {\n    GOOGLE_LOG(ERROR) << \"File already exists in database: \" << file.name();\n    return false;\n  }\n\n  // We must be careful here -- calling file.package() if file.has_package() is\n  // false could access an uninitialized static-storage variable if we are being\n  // run at startup time.\n  string path = file.has_package() ? file.package() : string();\n  if (!path.empty()) path += '.';\n\n  for (int i = 0; i < file.message_type_size(); i++) {\n    if (!AddSymbol(path + file.message_type(i).name(), value)) return false;\n    if (!AddNestedExtensions(file.message_type(i), value)) return false;\n  }\n  for (int i = 0; i < file.enum_type_size(); i++) {\n    if (!AddSymbol(path + file.enum_type(i).name(), value)) return false;\n  }\n  for (int i = 0; i < file.extension_size(); i++) {\n    if (!AddSymbol(path + file.extension(i).name(), value)) return false;\n    if (!AddExtension(file.extension(i), value)) return false;\n  }\n  for (int i = 0; i < file.service_size(); i++) {\n    if (!AddSymbol(path + file.service(i).name(), value)) return false;\n  }\n\n  return true;\n}\n\ntemplate <typename Value>\nbool SimpleDescriptorDatabase::DescriptorIndex<Value>::AddSymbol(\n    const string& name, Value value) {\n  // We need to make sure not to violate our map invariant.\n\n  // If the symbol name is invalid it could break our lookup algorithm (which\n  // relies on the fact that '.' sorts before all other characters that are\n  // valid in symbol names).\n  if (!ValidateSymbolName(name)) {\n    GOOGLE_LOG(ERROR) << \"Invalid symbol name: \" << name;\n    return false;\n  }\n\n  // Try to look up the symbol to make sure a super-symbol doesn't already\n  // exist.\n  typename map<string, Value>::iterator iter = FindLastLessOrEqual(name);\n\n  if (iter == by_symbol_.end()) {\n    // Apparently the map is currently empty.  Just insert and be done with it.\n    by_symbol_.insert(typename map<string, Value>::value_type(name, value));\n    return true;\n  }\n\n  if (IsSubSymbol(iter->first, name)) {\n    GOOGLE_LOG(ERROR) << \"Symbol name \\\"\" << name << \"\\\" conflicts with the existing \"\n                  \"symbol \\\"\" << iter->first << \"\\\".\";\n    return false;\n  }\n\n  // OK, that worked.  Now we have to make sure that no symbol in the map is\n  // a sub-symbol of the one we are inserting.  The only symbol which could\n  // be so is the first symbol that is greater than the new symbol.  Since\n  // |iter| points at the last symbol that is less than or equal, we just have\n  // to increment it.\n  ++iter;\n\n  if (iter != by_symbol_.end() && IsSubSymbol(name, iter->first)) {\n    GOOGLE_LOG(ERROR) << \"Symbol name \\\"\" << name << \"\\\" conflicts with the existing \"\n                  \"symbol \\\"\" << iter->first << \"\\\".\";\n    return false;\n  }\n\n  // OK, no conflicts.\n\n  // Insert the new symbol using the iterator as a hint, the new entry will\n  // appear immediately before the one the iterator is pointing at.\n  by_symbol_.insert(iter, typename map<string, Value>::value_type(name, value));\n\n  return true;\n}\n\ntemplate <typename Value>\nbool SimpleDescriptorDatabase::DescriptorIndex<Value>::AddNestedExtensions(\n    const DescriptorProto& message_type,\n    Value value) {\n  for (int i = 0; i < message_type.nested_type_size(); i++) {\n    if (!AddNestedExtensions(message_type.nested_type(i), value)) return false;\n  }\n  for (int i = 0; i < message_type.extension_size(); i++) {\n    if (!AddExtension(message_type.extension(i), value)) return false;\n  }\n  return true;\n}\n\ntemplate <typename Value>\nbool SimpleDescriptorDatabase::DescriptorIndex<Value>::AddExtension(\n    const FieldDescriptorProto& field,\n    Value value) {\n  if (!field.extendee().empty() && field.extendee()[0] == '.') {\n    // The extension is fully-qualified.  We can use it as a lookup key in\n    // the by_symbol_ table.\n    if (!InsertIfNotPresent(&by_extension_,\n                            make_pair(field.extendee().substr(1),\n                                      field.number()),\n                            value)) {\n      GOOGLE_LOG(ERROR) << \"Extension conflicts with extension already in database: \"\n                    \"extend \" << field.extendee() << \" { \"\n                 << field.name() << \" = \" << field.number() << \" }\";\n      return false;\n    }\n  } else {\n    // Not fully-qualified.  We can't really do anything here, unfortunately.\n    // We don't consider this an error, though, because the descriptor is\n    // valid.\n  }\n  return true;\n}\n\ntemplate <typename Value>\nValue SimpleDescriptorDatabase::DescriptorIndex<Value>::FindFile(\n    const string& filename) {\n  return FindWithDefault(by_name_, filename, Value());\n}\n\ntemplate <typename Value>\nValue SimpleDescriptorDatabase::DescriptorIndex<Value>::FindSymbol(\n    const string& name) {\n  typename map<string, Value>::iterator iter = FindLastLessOrEqual(name);\n\n  return (iter != by_symbol_.end() && IsSubSymbol(iter->first, name)) ?\n         iter->second : Value();\n}\n\ntemplate <typename Value>\nValue SimpleDescriptorDatabase::DescriptorIndex<Value>::FindExtension(\n    const string& containing_type,\n    int field_number) {\n  return FindWithDefault(by_extension_,\n                         make_pair(containing_type, field_number),\n                         Value());\n}\n\ntemplate <typename Value>\nbool SimpleDescriptorDatabase::DescriptorIndex<Value>::FindAllExtensionNumbers(\n    const string& containing_type,\n    vector<int>* output) {\n  typename map<pair<string, int>, Value >::const_iterator it =\n      by_extension_.lower_bound(make_pair(containing_type, 0));\n  bool success = false;\n\n  for (; it != by_extension_.end() && it->first.first == containing_type;\n       ++it) {\n    output->push_back(it->first.second);\n    success = true;\n  }\n\n  return success;\n}\n\ntemplate <typename Value>\ntypename map<string, Value>::iterator\nSimpleDescriptorDatabase::DescriptorIndex<Value>::FindLastLessOrEqual(\n    const string& name) {\n  // Find the last key in the map which sorts less than or equal to the\n  // symbol name.  Since upper_bound() returns the *first* key that sorts\n  // *greater* than the input, we want the element immediately before that.\n  typename map<string, Value>::iterator iter = by_symbol_.upper_bound(name);\n  if (iter != by_symbol_.begin()) --iter;\n  return iter;\n}\n\ntemplate <typename Value>\nbool SimpleDescriptorDatabase::DescriptorIndex<Value>::IsSubSymbol(\n    const string& sub_symbol, const string& super_symbol) {\n  return sub_symbol == super_symbol ||\n         (HasPrefixString(super_symbol, sub_symbol) &&\n             super_symbol[sub_symbol.size()] == '.');\n}\n\ntemplate <typename Value>\nbool SimpleDescriptorDatabase::DescriptorIndex<Value>::ValidateSymbolName(\n    const string& name) {\n  for (int i = 0; i < name.size(); i++) {\n    // I don't trust ctype.h due to locales.  :(\n    if (name[i] != '.' && name[i] != '_' &&\n        (name[i] < '0' || name[i] > '9') &&\n        (name[i] < 'A' || name[i] > 'Z') &&\n        (name[i] < 'a' || name[i] > 'z')) {\n      return false;\n    }\n  }\n  return true;\n}\n\n// -------------------------------------------------------------------\n\nSimpleDescriptorDatabase::SimpleDescriptorDatabase() {}\nSimpleDescriptorDatabase::~SimpleDescriptorDatabase() {\n  STLDeleteElements(&files_to_delete_);\n}\n\nbool SimpleDescriptorDatabase::Add(const FileDescriptorProto& file) {\n  FileDescriptorProto* new_file = new FileDescriptorProto;\n  new_file->CopyFrom(file);\n  return AddAndOwn(new_file);\n}\n\nbool SimpleDescriptorDatabase::AddAndOwn(const FileDescriptorProto* file) {\n  files_to_delete_.push_back(file);\n  return index_.AddFile(*file, file);\n}\n\nbool SimpleDescriptorDatabase::FindFileByName(\n    const string& filename,\n    FileDescriptorProto* output) {\n  return MaybeCopy(index_.FindFile(filename), output);\n}\n\nbool SimpleDescriptorDatabase::FindFileContainingSymbol(\n    const string& symbol_name,\n    FileDescriptorProto* output) {\n  return MaybeCopy(index_.FindSymbol(symbol_name), output);\n}\n\nbool SimpleDescriptorDatabase::FindFileContainingExtension(\n    const string& containing_type,\n    int field_number,\n    FileDescriptorProto* output) {\n  return MaybeCopy(index_.FindExtension(containing_type, field_number), output);\n}\n\nbool SimpleDescriptorDatabase::FindAllExtensionNumbers(\n    const string& extendee_type,\n    vector<int>* output) {\n  return index_.FindAllExtensionNumbers(extendee_type, output);\n}\n\nbool SimpleDescriptorDatabase::MaybeCopy(const FileDescriptorProto* file,\n                                         FileDescriptorProto* output) {\n  if (file == NULL) return false;\n  output->CopyFrom(*file);\n  return true;\n}\n\n// -------------------------------------------------------------------\n\nEncodedDescriptorDatabase::EncodedDescriptorDatabase() {}\nEncodedDescriptorDatabase::~EncodedDescriptorDatabase() {\n  for (int i = 0; i < files_to_delete_.size(); i++) {\n    operator delete(files_to_delete_[i]);\n  }\n}\n\nbool EncodedDescriptorDatabase::Add(\n    const void* encoded_file_descriptor, int size) {\n  FileDescriptorProto file;\n  if (file.ParseFromArray(encoded_file_descriptor, size)) {\n    return index_.AddFile(file, make_pair(encoded_file_descriptor, size));\n  } else {\n    GOOGLE_LOG(ERROR) << \"Invalid file descriptor data passed to \"\n                  \"EncodedDescriptorDatabase::Add().\";\n    return false;\n  }\n}\n\nbool EncodedDescriptorDatabase::AddCopy(\n    const void* encoded_file_descriptor, int size) {\n  void* copy = operator new(size);\n  memcpy(copy, encoded_file_descriptor, size);\n  files_to_delete_.push_back(copy);\n  return Add(copy, size);\n}\n\nbool EncodedDescriptorDatabase::FindFileByName(\n    const string& filename,\n    FileDescriptorProto* output) {\n  return MaybeParse(index_.FindFile(filename), output);\n}\n\nbool EncodedDescriptorDatabase::FindFileContainingSymbol(\n    const string& symbol_name,\n    FileDescriptorProto* output) {\n  return MaybeParse(index_.FindSymbol(symbol_name), output);\n}\n\nbool EncodedDescriptorDatabase::FindNameOfFileContainingSymbol(\n    const string& symbol_name,\n    string* output) {\n  pair<const void*, int> encoded_file = index_.FindSymbol(symbol_name);\n  if (encoded_file.first == NULL) return false;\n\n  // Optimization:  The name should be the first field in the encoded message.\n  //   Try to just read it directly.\n  io::CodedInputStream input(reinterpret_cast<const uint8*>(encoded_file.first),\n                             encoded_file.second);\n\n  const uint32 kNameTag = internal::WireFormatLite::MakeTag(\n      FileDescriptorProto::kNameFieldNumber,\n      internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED);\n\n  if (input.ReadTag() == kNameTag) {\n    // Success!\n    return internal::WireFormatLite::ReadString(&input, output);\n  } else {\n    // Slow path.  Parse whole message.\n    FileDescriptorProto file_proto;\n    if (!file_proto.ParseFromArray(encoded_file.first, encoded_file.second)) {\n      return false;\n    }\n    *output = file_proto.name();\n    return true;\n  }\n}\n\nbool EncodedDescriptorDatabase::FindFileContainingExtension(\n    const string& containing_type,\n    int field_number,\n    FileDescriptorProto* output) {\n  return MaybeParse(index_.FindExtension(containing_type, field_number),\n                    output);\n}\n\nbool EncodedDescriptorDatabase::FindAllExtensionNumbers(\n    const string& extendee_type,\n    vector<int>* output) {\n  return index_.FindAllExtensionNumbers(extendee_type, output);\n}\n\nbool EncodedDescriptorDatabase::MaybeParse(\n    pair<const void*, int> encoded_file,\n    FileDescriptorProto* output) {\n  if (encoded_file.first == NULL) return false;\n  return output->ParseFromArray(encoded_file.first, encoded_file.second);\n}\n\n// ===================================================================\n\nDescriptorPoolDatabase::DescriptorPoolDatabase(const DescriptorPool& pool)\n  : pool_(pool) {}\nDescriptorPoolDatabase::~DescriptorPoolDatabase() {}\n\nbool DescriptorPoolDatabase::FindFileByName(\n    const string& filename,\n    FileDescriptorProto* output) {\n  const FileDescriptor* file = pool_.FindFileByName(filename);\n  if (file == NULL) return false;\n  output->Clear();\n  file->CopyTo(output);\n  return true;\n}\n\nbool DescriptorPoolDatabase::FindFileContainingSymbol(\n    const string& symbol_name,\n    FileDescriptorProto* output) {\n  const FileDescriptor* file = pool_.FindFileContainingSymbol(symbol_name);\n  if (file == NULL) return false;\n  output->Clear();\n  file->CopyTo(output);\n  return true;\n}\n\nbool DescriptorPoolDatabase::FindFileContainingExtension(\n    const string& containing_type,\n    int field_number,\n    FileDescriptorProto* output) {\n  const Descriptor* extendee = pool_.FindMessageTypeByName(containing_type);\n  if (extendee == NULL) return false;\n\n  const FieldDescriptor* extension =\n    pool_.FindExtensionByNumber(extendee, field_number);\n  if (extension == NULL) return false;\n\n  output->Clear();\n  extension->file()->CopyTo(output);\n  return true;\n}\n\nbool DescriptorPoolDatabase::FindAllExtensionNumbers(\n    const string& extendee_type,\n    vector<int>* output) {\n  const Descriptor* extendee = pool_.FindMessageTypeByName(extendee_type);\n  if (extendee == NULL) return false;\n\n  vector<const FieldDescriptor*> extensions;\n  pool_.FindAllExtensions(extendee, &extensions);\n\n  for (int i = 0; i < extensions.size(); ++i) {\n    output->push_back(extensions[i]->number());\n  }\n\n  return true;\n}\n\n// ===================================================================\n\nMergedDescriptorDatabase::MergedDescriptorDatabase(\n    DescriptorDatabase* source1,\n    DescriptorDatabase* source2) {\n  sources_.push_back(source1);\n  sources_.push_back(source2);\n}\nMergedDescriptorDatabase::MergedDescriptorDatabase(\n    const vector<DescriptorDatabase*>& sources)\n  : sources_(sources) {}\nMergedDescriptorDatabase::~MergedDescriptorDatabase() {}\n\nbool MergedDescriptorDatabase::FindFileByName(\n    const string& filename,\n    FileDescriptorProto* output) {\n  for (int i = 0; i < sources_.size(); i++) {\n    if (sources_[i]->FindFileByName(filename, output)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nbool MergedDescriptorDatabase::FindFileContainingSymbol(\n    const string& symbol_name,\n    FileDescriptorProto* output) {\n  for (int i = 0; i < sources_.size(); i++) {\n    if (sources_[i]->FindFileContainingSymbol(symbol_name, output)) {\n      // The symbol was found in source i.  However, if one of the previous\n      // sources defines a file with the same name (which presumably doesn't\n      // contain the symbol, since it wasn't found in that source), then we\n      // must hide it from the caller.\n      FileDescriptorProto temp;\n      for (int j = 0; j < i; j++) {\n        if (sources_[j]->FindFileByName(output->name(), &temp)) {\n          // Found conflicting file in a previous source.\n          return false;\n        }\n      }\n      return true;\n    }\n  }\n  return false;\n}\n\nbool MergedDescriptorDatabase::FindFileContainingExtension(\n    const string& containing_type,\n    int field_number,\n    FileDescriptorProto* output) {\n  for (int i = 0; i < sources_.size(); i++) {\n    if (sources_[i]->FindFileContainingExtension(\n          containing_type, field_number, output)) {\n      // The symbol was found in source i.  However, if one of the previous\n      // sources defines a file with the same name (which presumably doesn't\n      // contain the symbol, since it wasn't found in that source), then we\n      // must hide it from the caller.\n      FileDescriptorProto temp;\n      for (int j = 0; j < i; j++) {\n        if (sources_[j]->FindFileByName(output->name(), &temp)) {\n          // Found conflicting file in a previous source.\n          return false;\n        }\n      }\n      return true;\n    }\n  }\n  return false;\n}\n\nbool MergedDescriptorDatabase::FindAllExtensionNumbers(\n    const string& extendee_type,\n    vector<int>* output) {\n  set<int> merged_results;\n  vector<int> results;\n  bool success = false;\n\n  for (int i = 0; i < sources_.size(); i++) {\n    if (sources_[i]->FindAllExtensionNumbers(extendee_type, &results)) {\n      copy(results.begin(), results.end(),\n           insert_iterator<set<int> >(merged_results, merged_results.begin()));\n      success = true;\n    }\n    results.clear();\n  }\n\n  copy(merged_results.begin(), merged_results.end(),\n       insert_iterator<vector<int> >(*output, output->end()));\n\n  return success;\n}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Interface for manipulating databases of descriptors.\n\n#ifndef GOOGLE_PROTOBUF_DESCRIPTOR_DATABASE_H__\n#define GOOGLE_PROTOBUF_DESCRIPTOR_DATABASE_H__\n\n#include <map>\n#include <string>\n#include <utility>\n#include <vector>\n#include <google/protobuf/descriptor.h>\n\nnamespace google {\nnamespace protobuf {\n\n// Defined in this file.\nclass DescriptorDatabase;\nclass SimpleDescriptorDatabase;\nclass EncodedDescriptorDatabase;\nclass DescriptorPoolDatabase;\nclass MergedDescriptorDatabase;\n\n// Abstract interface for a database of descriptors.\n//\n// This is useful if you want to create a DescriptorPool which loads\n// descriptors on-demand from some sort of large database.  If the database\n// is large, it may be inefficient to enumerate every .proto file inside it\n// calling DescriptorPool::BuildFile() for each one.  Instead, a DescriptorPool\n// can be created which wraps a DescriptorDatabase and only builds particular\n// descriptors when they are needed.\nclass LIBPROTOBUF_EXPORT DescriptorDatabase {\n public:\n  inline DescriptorDatabase() {}\n  virtual ~DescriptorDatabase();\n\n  // Find a file by file name.  Fills in in *output and returns true if found.\n  // Otherwise, returns false, leaving the contents of *output undefined.\n  virtual bool FindFileByName(const string& filename,\n                              FileDescriptorProto* output) = 0;\n\n  // Find the file that declares the given fully-qualified symbol name.\n  // If found, fills in *output and returns true, otherwise returns false\n  // and leaves *output undefined.\n  virtual bool FindFileContainingSymbol(const string& symbol_name,\n                                        FileDescriptorProto* output) = 0;\n\n  // Find the file which defines an extension extending the given message type\n  // with the given field number.  If found, fills in *output and returns true,\n  // otherwise returns false and leaves *output undefined.  containing_type\n  // must be a fully-qualified type name.\n  virtual bool FindFileContainingExtension(const string& containing_type,\n                                           int field_number,\n                                           FileDescriptorProto* output) = 0;\n\n  // Finds the tag numbers used by all known extensions of\n  // extendee_type, and appends them to output in an undefined\n  // order. This method is best-effort: it's not guaranteed that the\n  // database will find all extensions, and it's not guaranteed that\n  // FindFileContainingExtension will return true on all of the found\n  // numbers. Returns true if the search was successful, otherwise\n  // returns false and leaves output unchanged.\n  //\n  // This method has a default implementation that always returns\n  // false.\n  virtual bool FindAllExtensionNumbers(const string& extendee_type,\n                                       vector<int>* output) {\n    return false;\n  }\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorDatabase);\n};\n\n// A DescriptorDatabase into which you can insert files manually.\n//\n// FindFileContainingSymbol() is fully-implemented.  When you add a file, its\n// symbols will be indexed for this purpose.  Note that the implementation\n// may return false positives, but only if it isn't possible for the symbol\n// to be defined in any other file.  In particular, if a file defines a symbol\n// \"Foo\", then searching for \"Foo.[anything]\" will match that file.  This way,\n// the database does not need to aggressively index all children of a symbol.\n//\n// FindFileContainingExtension() is mostly-implemented.  It works if and only\n// if the original FieldDescriptorProto defining the extension has a\n// fully-qualified type name in its \"extendee\" field (i.e. starts with a '.').\n// If the extendee is a relative name, SimpleDescriptorDatabase will not\n// attempt to resolve the type, so it will not know what type the extension is\n// extending.  Therefore, calling FindFileContainingExtension() with the\n// extension's containing type will never actually find that extension.  Note\n// that this is an unlikely problem, as all FileDescriptorProtos created by the\n// protocol compiler (as well as ones created by calling\n// FileDescriptor::CopyTo()) will always use fully-qualified names for all\n// types.  You only need to worry if you are constructing FileDescriptorProtos\n// yourself, or are calling compiler::Parser directly.\nclass LIBPROTOBUF_EXPORT SimpleDescriptorDatabase : public DescriptorDatabase {\n public:\n  SimpleDescriptorDatabase();\n  ~SimpleDescriptorDatabase();\n\n  // Adds the FileDescriptorProto to the database, making a copy.  The object\n  // can be deleted after Add() returns.  Returns false if the file conflicted\n  // with a file already in the database, in which case an error will have\n  // been written to GOOGLE_LOG(ERROR).\n  bool Add(const FileDescriptorProto& file);\n\n  // Adds the FileDescriptorProto to the database and takes ownership of it.\n  bool AddAndOwn(const FileDescriptorProto* file);\n\n  // implements DescriptorDatabase -----------------------------------\n  bool FindFileByName(const string& filename,\n                      FileDescriptorProto* output);\n  bool FindFileContainingSymbol(const string& symbol_name,\n                                FileDescriptorProto* output);\n  bool FindFileContainingExtension(const string& containing_type,\n                                   int field_number,\n                                   FileDescriptorProto* output);\n  bool FindAllExtensionNumbers(const string& extendee_type,\n                               vector<int>* output);\n\n private:\n  // So that it can use DescriptorIndex.\n  friend class EncodedDescriptorDatabase;\n\n  // An index mapping file names, symbol names, and extension numbers to\n  // some sort of values.\n  template <typename Value>\n  class DescriptorIndex {\n   public:\n    // Helpers to recursively add particular descriptors and all their contents\n    // to the index.\n    bool AddFile(const FileDescriptorProto& file,\n                 Value value);\n    bool AddSymbol(const string& name, Value value);\n    bool AddNestedExtensions(const DescriptorProto& message_type,\n                             Value value);\n    bool AddExtension(const FieldDescriptorProto& field,\n                      Value value);\n\n    Value FindFile(const string& filename);\n    Value FindSymbol(const string& name);\n    Value FindExtension(const string& containing_type, int field_number);\n    bool FindAllExtensionNumbers(const string& containing_type,\n                                 vector<int>* output);\n\n   private:\n    map<string, Value> by_name_;\n    map<string, Value> by_symbol_;\n    map<pair<string, int>, Value> by_extension_;\n\n    // Invariant:  The by_symbol_ map does not contain any symbols which are\n    // prefixes of other symbols in the map.  For example, \"foo.bar\" is a\n    // prefix of \"foo.bar.baz\" (but is not a prefix of \"foo.barbaz\").\n    //\n    // This invariant is important because it means that given a symbol name,\n    // we can find a key in the map which is a prefix of the symbol in O(lg n)\n    // time, and we know that there is at most one such key.\n    //\n    // The prefix lookup algorithm works like so:\n    // 1) Find the last key in the map which is less than or equal to the\n    //    search key.\n    // 2) If the found key is a prefix of the search key, then return it.\n    //    Otherwise, there is no match.\n    //\n    // I am sure this algorithm has been described elsewhere, but since I\n    // wasn't able to find it quickly I will instead prove that it works\n    // myself.  The key to the algorithm is that if a match exists, step (1)\n    // will find it.  Proof:\n    // 1) Define the \"search key\" to be the key we are looking for, the \"found\n    //    key\" to be the key found in step (1), and the \"match key\" to be the\n    //    key which actually matches the serach key (i.e. the key we're trying\n    //    to find).\n    // 2) The found key must be less than or equal to the search key by\n    //    definition.\n    // 3) The match key must also be less than or equal to the search key\n    //    (because it is a prefix).\n    // 4) The match key cannot be greater than the found key, because if it\n    //    were, then step (1) of the algorithm would have returned the match\n    //    key instead (since it finds the *greatest* key which is less than or\n    //    equal to the search key).\n    // 5) Therefore, the found key must be between the match key and the search\n    //    key, inclusive.\n    // 6) Since the search key must be a sub-symbol of the match key, if it is\n    //    not equal to the match key, then search_key[match_key.size()] must\n    //    be '.'.\n    // 7) Since '.' sorts before any other character that is valid in a symbol\n    //    name, then if the found key is not equal to the match key, then\n    //    found_key[match_key.size()] must also be '.', because any other value\n    //    would make it sort after the search key.\n    // 8) Therefore, if the found key is not equal to the match key, then the\n    //    found key must be a sub-symbol of the match key.  However, this would\n    //    contradict our map invariant which says that no symbol in the map is\n    //    a sub-symbol of any other.\n    // 9) Therefore, the found key must match the match key.\n    //\n    // The above proof assumes the match key exists.  In the case that the\n    // match key does not exist, then step (1) will return some other symbol.\n    // That symbol cannot be a super-symbol of the search key since if it were,\n    // then it would be a match, and we're assuming the match key doesn't exist.\n    // Therefore, step 2 will correctly return no match.\n\n    // Find the last entry in the by_symbol_ map whose key is less than or\n    // equal to the given name.\n    typename map<string, Value>::iterator FindLastLessOrEqual(\n        const string& name);\n\n    // True if either the arguments are equal or super_symbol identifies a\n    // parent symbol of sub_symbol (e.g. \"foo.bar\" is a parent of\n    // \"foo.bar.baz\", but not a parent of \"foo.barbaz\").\n    bool IsSubSymbol(const string& sub_symbol, const string& super_symbol);\n\n    // Returns true if and only if all characters in the name are alphanumerics,\n    // underscores, or periods.\n    bool ValidateSymbolName(const string& name);\n  };\n\n\n  DescriptorIndex<const FileDescriptorProto*> index_;\n  vector<const FileDescriptorProto*> files_to_delete_;\n\n  // If file is non-NULL, copy it into *output and return true, otherwise\n  // return false.\n  bool MaybeCopy(const FileDescriptorProto* file,\n                 FileDescriptorProto* output);\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SimpleDescriptorDatabase);\n};\n\n// Very similar to SimpleDescriptorDatabase, but stores all the descriptors\n// as raw bytes and generally tries to use as little memory as possible.\n//\n// The same caveats regarding FindFileContainingExtension() apply as with\n// SimpleDescriptorDatabase.\nclass LIBPROTOBUF_EXPORT EncodedDescriptorDatabase : public DescriptorDatabase {\n public:\n  EncodedDescriptorDatabase();\n  ~EncodedDescriptorDatabase();\n\n  // Adds the FileDescriptorProto to the database.  The descriptor is provided\n  // in encoded form.  The database does not make a copy of the bytes, nor\n  // does it take ownership; it's up to the caller to make sure the bytes\n  // remain valid for the life of the database.  Returns false and logs an error\n  // if the bytes are not a valid FileDescriptorProto or if the file conflicted\n  // with a file already in the database.\n  bool Add(const void* encoded_file_descriptor, int size);\n\n  // Like Add(), but makes a copy of the data, so that the caller does not\n  // need to keep it around.\n  bool AddCopy(const void* encoded_file_descriptor, int size);\n\n  // Like FindFileContainingSymbol but returns only the name of the file.\n  bool FindNameOfFileContainingSymbol(const string& symbol_name,\n                                      string* output);\n\n  // implements DescriptorDatabase -----------------------------------\n  bool FindFileByName(const string& filename,\n                      FileDescriptorProto* output);\n  bool FindFileContainingSymbol(const string& symbol_name,\n                                FileDescriptorProto* output);\n  bool FindFileContainingExtension(const string& containing_type,\n                                   int field_number,\n                                   FileDescriptorProto* output);\n  bool FindAllExtensionNumbers(const string& extendee_type,\n                               vector<int>* output);\n\n private:\n  SimpleDescriptorDatabase::DescriptorIndex<pair<const void*, int> > index_;\n  vector<void*> files_to_delete_;\n\n  // If encoded_file.first is non-NULL, parse the data into *output and return\n  // true, otherwise return false.\n  bool MaybeParse(pair<const void*, int> encoded_file,\n                  FileDescriptorProto* output);\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EncodedDescriptorDatabase);\n};\n\n// A DescriptorDatabase that fetches files from a given pool.\nclass LIBPROTOBUF_EXPORT DescriptorPoolDatabase : public DescriptorDatabase {\n public:\n  DescriptorPoolDatabase(const DescriptorPool& pool);\n  ~DescriptorPoolDatabase();\n\n  // implements DescriptorDatabase -----------------------------------\n  bool FindFileByName(const string& filename,\n                      FileDescriptorProto* output);\n  bool FindFileContainingSymbol(const string& symbol_name,\n                                FileDescriptorProto* output);\n  bool FindFileContainingExtension(const string& containing_type,\n                                   int field_number,\n                                   FileDescriptorProto* output);\n  bool FindAllExtensionNumbers(const string& extendee_type,\n                               vector<int>* output);\n\n private:\n  const DescriptorPool& pool_;\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPoolDatabase);\n};\n\n// A DescriptorDatabase that wraps two or more others.  It first searches the\n// first database and, if that fails, tries the second, and so on.\nclass LIBPROTOBUF_EXPORT MergedDescriptorDatabase : public DescriptorDatabase {\n public:\n  // Merge just two databases.  The sources remain property of the caller.\n  MergedDescriptorDatabase(DescriptorDatabase* source1,\n                           DescriptorDatabase* source2);\n  // Merge more than two databases.  The sources remain property of the caller.\n  // The vector may be deleted after the constructor returns but the\n  // DescriptorDatabases need to stick around.\n  MergedDescriptorDatabase(const vector<DescriptorDatabase*>& sources);\n  ~MergedDescriptorDatabase();\n\n  // implements DescriptorDatabase -----------------------------------\n  bool FindFileByName(const string& filename,\n                      FileDescriptorProto* output);\n  bool FindFileContainingSymbol(const string& symbol_name,\n                                FileDescriptorProto* output);\n  bool FindFileContainingExtension(const string& containing_type,\n                                   int field_number,\n                                   FileDescriptorProto* output);\n  // Merges the results of calling all databases. Returns true iff any\n  // of the databases returned true.\n  bool FindAllExtensionNumbers(const string& extendee_type,\n                               vector<int>* output);\n\n private:\n  vector<DescriptorDatabase*> sources_;\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MergedDescriptorDatabase);\n};\n\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_DESCRIPTOR_DATABASE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file makes extensive use of RFC 3092.  :)\n\n#include <algorithm>\n\n#include <google/protobuf/descriptor_database.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/text_format.h>\n#include <google/protobuf/stubs/strutil.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace {\n\nstatic void AddToDatabase(SimpleDescriptorDatabase* database,\n                          const char* file_text) {\n  FileDescriptorProto file_proto;\n  EXPECT_TRUE(TextFormat::ParseFromString(file_text, &file_proto));\n  database->Add(file_proto);\n}\n\nstatic void ExpectContainsType(const FileDescriptorProto& proto,\n                               const string& type_name) {\n  for (int i = 0; i < proto.message_type_size(); i++) {\n    if (proto.message_type(i).name() == type_name) return;\n  }\n  ADD_FAILURE() << \"\\\"\" << proto.name()\n                << \"\\\" did not contain expected type \\\"\"\n                << type_name << \"\\\".\";\n}\n\n// ===================================================================\n\n#if GTEST_HAS_PARAM_TEST\n\n// SimpleDescriptorDatabase, EncodedDescriptorDatabase, and\n// DescriptorPoolDatabase call for very similar tests.  Instead of writing\n// three nearly-identical sets of tests, we use parameterized tests to apply\n// the same code to all three.\n\n// The parameterized test runs against a DescriptarDatabaseTestCase.  We have\n// implementations for each of the three classes we want to test.\nclass DescriptorDatabaseTestCase {\n public:\n  virtual ~DescriptorDatabaseTestCase() {}\n\n  virtual DescriptorDatabase* GetDatabase() = 0;\n  virtual bool AddToDatabase(const FileDescriptorProto& file) = 0;\n};\n\n// Factory function type.\ntypedef DescriptorDatabaseTestCase* DescriptorDatabaseTestCaseFactory();\n\n// Specialization for SimpleDescriptorDatabase.\nclass SimpleDescriptorDatabaseTestCase : public DescriptorDatabaseTestCase {\n public:\n  static DescriptorDatabaseTestCase* New() {\n    return new SimpleDescriptorDatabaseTestCase;\n  }\n\n  virtual ~SimpleDescriptorDatabaseTestCase() {}\n\n  virtual DescriptorDatabase* GetDatabase() {\n    return &database_;\n  }\n  virtual bool AddToDatabase(const FileDescriptorProto& file) {\n    return database_.Add(file);\n  }\n\n private:\n  SimpleDescriptorDatabase database_;\n};\n\n// Specialization for EncodedDescriptorDatabase.\nclass EncodedDescriptorDatabaseTestCase : public DescriptorDatabaseTestCase {\n public:\n  static DescriptorDatabaseTestCase* New() {\n    return new EncodedDescriptorDatabaseTestCase;\n  }\n\n  virtual ~EncodedDescriptorDatabaseTestCase() {}\n\n  virtual DescriptorDatabase* GetDatabase() {\n    return &database_;\n  }\n  virtual bool AddToDatabase(const FileDescriptorProto& file) {\n    string data;\n    file.SerializeToString(&data);\n    return database_.AddCopy(data.data(), data.size());\n  }\n\n private:\n  EncodedDescriptorDatabase database_;\n};\n\n// Specialization for DescriptorPoolDatabase.\nclass DescriptorPoolDatabaseTestCase : public DescriptorDatabaseTestCase {\n public:\n  static DescriptorDatabaseTestCase* New() {\n    return new EncodedDescriptorDatabaseTestCase;\n  }\n\n  DescriptorPoolDatabaseTestCase() : database_(pool_) {}\n  virtual ~DescriptorPoolDatabaseTestCase() {}\n\n  virtual DescriptorDatabase* GetDatabase() {\n    return &database_;\n  }\n  virtual bool AddToDatabase(const FileDescriptorProto& file) {\n    return pool_.BuildFile(file);\n  }\n\n private:\n  DescriptorPool pool_;\n  DescriptorPoolDatabase database_;\n};\n\n// -------------------------------------------------------------------\n\nclass DescriptorDatabaseTest\n    : public testing::TestWithParam<DescriptorDatabaseTestCaseFactory*> {\n protected:\n  virtual void SetUp() {\n    test_case_.reset(GetParam()());\n    database_ = test_case_->GetDatabase();\n  }\n\n  void AddToDatabase(const char* file_descriptor_text) {\n    FileDescriptorProto file_proto;\n    EXPECT_TRUE(TextFormat::ParseFromString(file_descriptor_text, &file_proto));\n    EXPECT_TRUE(test_case_->AddToDatabase(file_proto));\n  }\n\n  void AddToDatabaseWithError(const char* file_descriptor_text) {\n    FileDescriptorProto file_proto;\n    EXPECT_TRUE(TextFormat::ParseFromString(file_descriptor_text, &file_proto));\n    EXPECT_FALSE(test_case_->AddToDatabase(file_proto));\n  }\n\n  scoped_ptr<DescriptorDatabaseTestCase> test_case_;\n  DescriptorDatabase* database_;\n};\n\nTEST_P(DescriptorDatabaseTest, FindFileByName) {\n  AddToDatabase(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { name:\\\"Foo\\\" }\");\n  AddToDatabase(\n    \"name: \\\"bar.proto\\\" \"\n    \"message_type { name:\\\"Bar\\\" }\");\n\n  {\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileByName(\"foo.proto\", &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n    ExpectContainsType(file, \"Foo\");\n  }\n\n  {\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileByName(\"bar.proto\", &file));\n    EXPECT_EQ(\"bar.proto\", file.name());\n    ExpectContainsType(file, \"Bar\");\n  }\n\n  {\n    // Fails to find undefined files.\n    FileDescriptorProto file;\n    EXPECT_FALSE(database_->FindFileByName(\"baz.proto\", &file));\n  }\n}\n\nTEST_P(DescriptorDatabaseTest, FindFileContainingSymbol) {\n  AddToDatabase(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"Foo\\\" \"\n    \"  field { name:\\\"qux\\\" }\"\n    \"  nested_type { name: \\\"Grault\\\" } \"\n    \"  enum_type { name: \\\"Garply\\\" } \"\n    \"} \"\n    \"enum_type { \"\n    \"  name: \\\"Waldo\\\" \"\n    \"  value { name:\\\"FRED\\\" } \"\n    \"} \"\n    \"extension { name: \\\"plugh\\\" } \"\n    \"service { \"\n    \"  name: \\\"Xyzzy\\\" \"\n    \"  method { name: \\\"Thud\\\" } \"\n    \"}\"\n    );\n  AddToDatabase(\n    \"name: \\\"bar.proto\\\" \"\n    \"package: \\\"corge\\\" \"\n    \"message_type { name: \\\"Bar\\\" }\");\n\n  {\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileContainingSymbol(\"Foo\", &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n  }\n\n  {\n    // Can find fields.\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileContainingSymbol(\"Foo.qux\", &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n  }\n\n  {\n    // Can find nested types.\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileContainingSymbol(\"Foo.Grault\", &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n  }\n\n  {\n    // Can find nested enums.\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileContainingSymbol(\"Foo.Garply\", &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n  }\n\n  {\n    // Can find enum types.\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileContainingSymbol(\"Waldo\", &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n  }\n\n  {\n    // Can find enum values.\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileContainingSymbol(\"Waldo.FRED\", &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n  }\n\n  {\n    // Can find extensions.\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileContainingSymbol(\"plugh\", &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n  }\n\n  {\n    // Can find services.\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileContainingSymbol(\"Xyzzy\", &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n  }\n\n  {\n    // Can find methods.\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileContainingSymbol(\"Xyzzy.Thud\", &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n  }\n\n  {\n    // Can find things in packages.\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileContainingSymbol(\"corge.Bar\", &file));\n    EXPECT_EQ(\"bar.proto\", file.name());\n  }\n\n  {\n    // Fails to find undefined symbols.\n    FileDescriptorProto file;\n    EXPECT_FALSE(database_->FindFileContainingSymbol(\"Baz\", &file));\n  }\n\n  {\n    // Names must be fully-qualified.\n    FileDescriptorProto file;\n    EXPECT_FALSE(database_->FindFileContainingSymbol(\"Bar\", &file));\n  }\n}\n\nTEST_P(DescriptorDatabaseTest, FindFileContainingExtension) {\n  AddToDatabase(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"Foo\\\" \"\n    \"  extension_range { start: 1 end: 1000 } \"\n    \"  extension { name:\\\"qux\\\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 \"\n    \"              extendee: \\\".Foo\\\" }\"\n    \"}\");\n  AddToDatabase(\n    \"name: \\\"bar.proto\\\" \"\n    \"package: \\\"corge\\\" \"\n    \"dependency: \\\"foo.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"Bar\\\" \"\n    \"  extension_range { start: 1 end: 1000 } \"\n    \"} \"\n    \"extension { name:\\\"grault\\\" extendee: \\\".Foo\\\"       number:32 } \"\n    \"extension { name:\\\"garply\\\" extendee: \\\".corge.Bar\\\" number:70 } \"\n    \"extension { name:\\\"waldo\\\"  extendee: \\\"Bar\\\"        number:56 } \");\n\n  {\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileContainingExtension(\"Foo\", 5, &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n  }\n\n  {\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileContainingExtension(\"Foo\", 32, &file));\n    EXPECT_EQ(\"bar.proto\", file.name());\n  }\n\n  {\n    // Can find extensions for qualified type names.\n    FileDescriptorProto file;\n    EXPECT_TRUE(database_->FindFileContainingExtension(\"corge.Bar\", 70, &file));\n    EXPECT_EQ(\"bar.proto\", file.name());\n  }\n\n  {\n    // Can't find extensions whose extendee was not fully-qualified in the\n    // FileDescriptorProto.\n    FileDescriptorProto file;\n    EXPECT_FALSE(database_->FindFileContainingExtension(\"Bar\", 56, &file));\n    EXPECT_FALSE(\n        database_->FindFileContainingExtension(\"corge.Bar\", 56, &file));\n  }\n\n  {\n    // Can't find non-existent extension numbers.\n    FileDescriptorProto file;\n    EXPECT_FALSE(database_->FindFileContainingExtension(\"Foo\", 12, &file));\n  }\n\n  {\n    // Can't find extensions for non-existent types.\n    FileDescriptorProto file;\n    EXPECT_FALSE(\n        database_->FindFileContainingExtension(\"NoSuchType\", 5, &file));\n  }\n\n  {\n    // Can't find extensions for unqualified type names.\n    FileDescriptorProto file;\n    EXPECT_FALSE(database_->FindFileContainingExtension(\"Bar\", 70, &file));\n  }\n}\n\nTEST_P(DescriptorDatabaseTest, FindAllExtensionNumbers) {\n  AddToDatabase(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"Foo\\\" \"\n    \"  extension_range { start: 1 end: 1000 } \"\n    \"  extension { name:\\\"qux\\\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 \"\n    \"              extendee: \\\".Foo\\\" }\"\n    \"}\");\n  AddToDatabase(\n    \"name: \\\"bar.proto\\\" \"\n    \"package: \\\"corge\\\" \"\n    \"dependency: \\\"foo.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"Bar\\\" \"\n    \"  extension_range { start: 1 end: 1000 } \"\n    \"} \"\n    \"extension { name:\\\"grault\\\" extendee: \\\".Foo\\\"       number:32 } \"\n    \"extension { name:\\\"garply\\\" extendee: \\\".corge.Bar\\\" number:70 } \"\n    \"extension { name:\\\"waldo\\\"  extendee: \\\"Bar\\\"        number:56 } \");\n\n  {\n    vector<int> numbers;\n    EXPECT_TRUE(database_->FindAllExtensionNumbers(\"Foo\", &numbers));\n    ASSERT_EQ(2, numbers.size());\n    sort(numbers.begin(), numbers.end());\n    EXPECT_EQ(5, numbers[0]);\n    EXPECT_EQ(32, numbers[1]);\n  }\n\n  {\n    vector<int> numbers;\n    EXPECT_TRUE(database_->FindAllExtensionNumbers(\"corge.Bar\", &numbers));\n    // Note: won't find extension 56 due to the name not being fully qualified.\n    ASSERT_EQ(1, numbers.size());\n    EXPECT_EQ(70, numbers[0]);\n  }\n\n  {\n    // Can't find extensions for non-existent types.\n    vector<int> numbers;\n    EXPECT_FALSE(database_->FindAllExtensionNumbers(\"NoSuchType\", &numbers));\n  }\n\n  {\n    // Can't find extensions for unqualified types.\n    vector<int> numbers;\n    EXPECT_FALSE(database_->FindAllExtensionNumbers(\"Bar\", &numbers));\n  }\n}\n\nTEST_P(DescriptorDatabaseTest, ConflictingFileError) {\n  AddToDatabase(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"Foo\\\" \"\n    \"}\");\n  AddToDatabaseWithError(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"Bar\\\" \"\n    \"}\");\n}\n\nTEST_P(DescriptorDatabaseTest, ConflictingTypeError) {\n  AddToDatabase(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"Foo\\\" \"\n    \"}\");\n  AddToDatabaseWithError(\n    \"name: \\\"bar.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"Foo\\\" \"\n    \"}\");\n}\n\nTEST_P(DescriptorDatabaseTest, ConflictingExtensionError) {\n  AddToDatabase(\n    \"name: \\\"foo.proto\\\" \"\n    \"extension { name:\\\"foo\\\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 \"\n    \"            extendee: \\\".Foo\\\" }\");\n  AddToDatabaseWithError(\n    \"name: \\\"bar.proto\\\" \"\n    \"extension { name:\\\"bar\\\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 \"\n    \"            extendee: \\\".Foo\\\" }\");\n}\n\nINSTANTIATE_TEST_CASE_P(Simple, DescriptorDatabaseTest,\n    testing::Values(&SimpleDescriptorDatabaseTestCase::New));\nINSTANTIATE_TEST_CASE_P(MemoryConserving, DescriptorDatabaseTest,\n    testing::Values(&EncodedDescriptorDatabaseTestCase::New));\nINSTANTIATE_TEST_CASE_P(Pool, DescriptorDatabaseTest,\n    testing::Values(&DescriptorPoolDatabaseTestCase::New));\n\n#endif  // GTEST_HAS_PARAM_TEST\n\nTEST(EncodedDescriptorDatabaseExtraTest, FindNameOfFileContainingSymbol) {\n  // Create two files, one of which is in two parts.\n  FileDescriptorProto file1, file2a, file2b;\n  file1.set_name(\"foo.proto\");\n  file1.set_package(\"foo\");\n  file1.add_message_type()->set_name(\"Foo\");\n  file2a.set_name(\"bar.proto\");\n  file2b.set_package(\"bar\");\n  file2b.add_message_type()->set_name(\"Bar\");\n\n  // Normal serialization allows our optimization to kick in.\n  string data1 = file1.SerializeAsString();\n\n  // Force out-of-order serialization to test slow path.\n  string data2 = file2b.SerializeAsString() + file2a.SerializeAsString();\n\n  // Create EncodedDescriptorDatabase containing both files.\n  EncodedDescriptorDatabase db;\n  db.Add(data1.data(), data1.size());\n  db.Add(data2.data(), data2.size());\n\n  // Test!\n  string filename;\n  EXPECT_TRUE(db.FindNameOfFileContainingSymbol(\"foo.Foo\", &filename));\n  EXPECT_EQ(\"foo.proto\", filename);\n  EXPECT_TRUE(db.FindNameOfFileContainingSymbol(\"foo.Foo.Blah\", &filename));\n  EXPECT_EQ(\"foo.proto\", filename);\n  EXPECT_TRUE(db.FindNameOfFileContainingSymbol(\"bar.Bar\", &filename));\n  EXPECT_EQ(\"bar.proto\", filename);\n  EXPECT_FALSE(db.FindNameOfFileContainingSymbol(\"foo\", &filename));\n  EXPECT_FALSE(db.FindNameOfFileContainingSymbol(\"bar\", &filename));\n  EXPECT_FALSE(db.FindNameOfFileContainingSymbol(\"baz.Baz\", &filename));\n}\n\n// ===================================================================\n\nclass MergedDescriptorDatabaseTest : public testing::Test {\n protected:\n  MergedDescriptorDatabaseTest()\n    : forward_merged_(&database1_, &database2_),\n      reverse_merged_(&database2_, &database1_) {}\n\n  virtual void SetUp() {\n    AddToDatabase(&database1_,\n      \"name: \\\"foo.proto\\\" \"\n      \"message_type { name:\\\"Foo\\\" extension_range { start: 1 end: 100 } } \"\n      \"extension { name:\\\"foo_ext\\\" extendee: \\\".Foo\\\" number:3 \"\n      \"            label:LABEL_OPTIONAL type:TYPE_INT32 } \");\n    AddToDatabase(&database2_,\n      \"name: \\\"bar.proto\\\" \"\n      \"message_type { name:\\\"Bar\\\" extension_range { start: 1 end: 100 } } \"\n      \"extension { name:\\\"bar_ext\\\" extendee: \\\".Bar\\\" number:5 \"\n      \"            label:LABEL_OPTIONAL type:TYPE_INT32 } \");\n\n    // baz.proto exists in both pools, with different definitions.\n    AddToDatabase(&database1_,\n      \"name: \\\"baz.proto\\\" \"\n      \"message_type { name:\\\"Baz\\\" extension_range { start: 1 end: 100 } } \"\n      \"message_type { name:\\\"FromPool1\\\" } \"\n      \"extension { name:\\\"baz_ext\\\" extendee: \\\".Baz\\\" number:12 \"\n      \"            label:LABEL_OPTIONAL type:TYPE_INT32 } \"\n      \"extension { name:\\\"database1_only_ext\\\" extendee: \\\".Baz\\\" number:13 \"\n      \"            label:LABEL_OPTIONAL type:TYPE_INT32 } \");\n    AddToDatabase(&database2_,\n      \"name: \\\"baz.proto\\\" \"\n      \"message_type { name:\\\"Baz\\\" extension_range { start: 1 end: 100 } } \"\n      \"message_type { name:\\\"FromPool2\\\" } \"\n      \"extension { name:\\\"baz_ext\\\" extendee: \\\".Baz\\\" number:12 \"\n      \"            label:LABEL_OPTIONAL type:TYPE_INT32 } \");\n  }\n\n  SimpleDescriptorDatabase database1_;\n  SimpleDescriptorDatabase database2_;\n\n  MergedDescriptorDatabase forward_merged_;\n  MergedDescriptorDatabase reverse_merged_;\n};\n\nTEST_F(MergedDescriptorDatabaseTest, FindFileByName) {\n  {\n    // Can find file that is only in database1_.\n    FileDescriptorProto file;\n    EXPECT_TRUE(forward_merged_.FindFileByName(\"foo.proto\", &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n    ExpectContainsType(file, \"Foo\");\n  }\n\n  {\n    // Can find file that is only in database2_.\n    FileDescriptorProto file;\n    EXPECT_TRUE(forward_merged_.FindFileByName(\"bar.proto\", &file));\n    EXPECT_EQ(\"bar.proto\", file.name());\n    ExpectContainsType(file, \"Bar\");\n  }\n\n  {\n    // In forward_merged_, database1_'s baz.proto takes precedence.\n    FileDescriptorProto file;\n    EXPECT_TRUE(forward_merged_.FindFileByName(\"baz.proto\", &file));\n    EXPECT_EQ(\"baz.proto\", file.name());\n    ExpectContainsType(file, \"FromPool1\");\n  }\n\n  {\n    // In reverse_merged_, database2_'s baz.proto takes precedence.\n    FileDescriptorProto file;\n    EXPECT_TRUE(reverse_merged_.FindFileByName(\"baz.proto\", &file));\n    EXPECT_EQ(\"baz.proto\", file.name());\n    ExpectContainsType(file, \"FromPool2\");\n  }\n\n  {\n    // Can't find non-existent file.\n    FileDescriptorProto file;\n    EXPECT_FALSE(forward_merged_.FindFileByName(\"no_such.proto\", &file));\n  }\n}\n\nTEST_F(MergedDescriptorDatabaseTest, FindFileContainingSymbol) {\n  {\n    // Can find file that is only in database1_.\n    FileDescriptorProto file;\n    EXPECT_TRUE(forward_merged_.FindFileContainingSymbol(\"Foo\", &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n    ExpectContainsType(file, \"Foo\");\n  }\n\n  {\n    // Can find file that is only in database2_.\n    FileDescriptorProto file;\n    EXPECT_TRUE(forward_merged_.FindFileContainingSymbol(\"Bar\", &file));\n    EXPECT_EQ(\"bar.proto\", file.name());\n    ExpectContainsType(file, \"Bar\");\n  }\n\n  {\n    // In forward_merged_, database1_'s baz.proto takes precedence.\n    FileDescriptorProto file;\n    EXPECT_TRUE(forward_merged_.FindFileContainingSymbol(\"Baz\", &file));\n    EXPECT_EQ(\"baz.proto\", file.name());\n    ExpectContainsType(file, \"FromPool1\");\n  }\n\n  {\n    // In reverse_merged_, database2_'s baz.proto takes precedence.\n    FileDescriptorProto file;\n    EXPECT_TRUE(reverse_merged_.FindFileContainingSymbol(\"Baz\", &file));\n    EXPECT_EQ(\"baz.proto\", file.name());\n    ExpectContainsType(file, \"FromPool2\");\n  }\n\n  {\n    // FromPool1 only shows up in forward_merged_ because it is masked by\n    // database2_'s baz.proto in reverse_merged_.\n    FileDescriptorProto file;\n    EXPECT_TRUE(forward_merged_.FindFileContainingSymbol(\"FromPool1\", &file));\n    EXPECT_FALSE(reverse_merged_.FindFileContainingSymbol(\"FromPool1\", &file));\n  }\n\n  {\n    // Can't find non-existent symbol.\n    FileDescriptorProto file;\n    EXPECT_FALSE(\n      forward_merged_.FindFileContainingSymbol(\"NoSuchType\", &file));\n  }\n}\n\nTEST_F(MergedDescriptorDatabaseTest, FindFileContainingExtension) {\n  {\n    // Can find file that is only in database1_.\n    FileDescriptorProto file;\n    EXPECT_TRUE(\n      forward_merged_.FindFileContainingExtension(\"Foo\", 3, &file));\n    EXPECT_EQ(\"foo.proto\", file.name());\n    ExpectContainsType(file, \"Foo\");\n  }\n\n  {\n    // Can find file that is only in database2_.\n    FileDescriptorProto file;\n    EXPECT_TRUE(\n      forward_merged_.FindFileContainingExtension(\"Bar\", 5, &file));\n    EXPECT_EQ(\"bar.proto\", file.name());\n    ExpectContainsType(file, \"Bar\");\n  }\n\n  {\n    // In forward_merged_, database1_'s baz.proto takes precedence.\n    FileDescriptorProto file;\n    EXPECT_TRUE(\n      forward_merged_.FindFileContainingExtension(\"Baz\", 12, &file));\n    EXPECT_EQ(\"baz.proto\", file.name());\n    ExpectContainsType(file, \"FromPool1\");\n  }\n\n  {\n    // In reverse_merged_, database2_'s baz.proto takes precedence.\n    FileDescriptorProto file;\n    EXPECT_TRUE(\n      reverse_merged_.FindFileContainingExtension(\"Baz\", 12, &file));\n    EXPECT_EQ(\"baz.proto\", file.name());\n    ExpectContainsType(file, \"FromPool2\");\n  }\n\n  {\n    // Baz's extension 13 only shows up in forward_merged_ because it is\n    // masked by database2_'s baz.proto in reverse_merged_.\n    FileDescriptorProto file;\n    EXPECT_TRUE(forward_merged_.FindFileContainingExtension(\"Baz\", 13, &file));\n    EXPECT_FALSE(reverse_merged_.FindFileContainingExtension(\"Baz\", 13, &file));\n  }\n\n  {\n    // Can't find non-existent extension.\n    FileDescriptorProto file;\n    EXPECT_FALSE(\n      forward_merged_.FindFileContainingExtension(\"Foo\", 6, &file));\n  }\n}\n\nTEST_F(MergedDescriptorDatabaseTest, FindAllExtensionNumbers) {\n  {\n    // Message only has extension in database1_\n    vector<int> numbers;\n    EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers(\"Foo\", &numbers));\n    ASSERT_EQ(1, numbers.size());\n    EXPECT_EQ(3, numbers[0]);\n  }\n\n  {\n    // Message only has extension in database2_\n    vector<int> numbers;\n    EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers(\"Bar\", &numbers));\n    ASSERT_EQ(1, numbers.size());\n    EXPECT_EQ(5, numbers[0]);\n  }\n\n  {\n    // Merge results from the two databases.\n    vector<int> numbers;\n    EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers(\"Baz\", &numbers));\n    ASSERT_EQ(2, numbers.size());\n    sort(numbers.begin(), numbers.end());\n    EXPECT_EQ(12, numbers[0]);\n    EXPECT_EQ(13, numbers[1]);\n  }\n\n  {\n    vector<int> numbers;\n    EXPECT_TRUE(reverse_merged_.FindAllExtensionNumbers(\"Baz\", &numbers));\n    ASSERT_EQ(2, numbers.size());\n    sort(numbers.begin(), numbers.end());\n    EXPECT_EQ(12, numbers[0]);\n    EXPECT_EQ(13, numbers[1]);\n  }\n\n  {\n    // Can't find extensions for a non-existent message.\n    vector<int> numbers;\n    EXPECT_FALSE(reverse_merged_.FindAllExtensionNumbers(\"Blah\", &numbers));\n  }\n}\n\n}  // anonymous namespace\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file makes extensive use of RFC 3092.  :)\n\n#include <vector>\n\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/descriptor_database.h>\n#include <google/protobuf/dynamic_message.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/text_format.h>\n#include <google/protobuf/unittest.pb.h>\n#include <google/protobuf/unittest_custom_options.pb.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\n\n// Can't use an anonymous namespace here due to brokenness of Tru64 compiler.\nnamespace descriptor_unittest {\n\n// Some helpers to make assembling descriptors faster.\nDescriptorProto* AddMessage(FileDescriptorProto* file, const string& name) {\n  DescriptorProto* result = file->add_message_type();\n  result->set_name(name);\n  return result;\n}\n\nDescriptorProto* AddNestedMessage(DescriptorProto* parent, const string& name) {\n  DescriptorProto* result = parent->add_nested_type();\n  result->set_name(name);\n  return result;\n}\n\nEnumDescriptorProto* AddEnum(FileDescriptorProto* file, const string& name) {\n  EnumDescriptorProto* result = file->add_enum_type();\n  result->set_name(name);\n  return result;\n}\n\nEnumDescriptorProto* AddNestedEnum(DescriptorProto* parent,\n                                   const string& name) {\n  EnumDescriptorProto* result = parent->add_enum_type();\n  result->set_name(name);\n  return result;\n}\n\nServiceDescriptorProto* AddService(FileDescriptorProto* file,\n                                   const string& name) {\n  ServiceDescriptorProto* result = file->add_service();\n  result->set_name(name);\n  return result;\n}\n\nFieldDescriptorProto* AddField(DescriptorProto* parent,\n                               const string& name, int number,\n                               FieldDescriptorProto::Label label,\n                               FieldDescriptorProto::Type type) {\n  FieldDescriptorProto* result = parent->add_field();\n  result->set_name(name);\n  result->set_number(number);\n  result->set_label(label);\n  result->set_type(type);\n  return result;\n}\n\nFieldDescriptorProto* AddExtension(FileDescriptorProto* file,\n                                   const string& extendee,\n                                   const string& name, int number,\n                                   FieldDescriptorProto::Label label,\n                                   FieldDescriptorProto::Type type) {\n  FieldDescriptorProto* result = file->add_extension();\n  result->set_name(name);\n  result->set_number(number);\n  result->set_label(label);\n  result->set_type(type);\n  result->set_extendee(extendee);\n  return result;\n}\n\nFieldDescriptorProto* AddNestedExtension(DescriptorProto* parent,\n                                         const string& extendee,\n                                         const string& name, int number,\n                                         FieldDescriptorProto::Label label,\n                                         FieldDescriptorProto::Type type) {\n  FieldDescriptorProto* result = parent->add_extension();\n  result->set_name(name);\n  result->set_number(number);\n  result->set_label(label);\n  result->set_type(type);\n  result->set_extendee(extendee);\n  return result;\n}\n\nDescriptorProto::ExtensionRange* AddExtensionRange(DescriptorProto* parent,\n                                                   int start, int end) {\n  DescriptorProto::ExtensionRange* result = parent->add_extension_range();\n  result->set_start(start);\n  result->set_end(end);\n  return result;\n}\n\nEnumValueDescriptorProto* AddEnumValue(EnumDescriptorProto* enum_proto,\n                                       const string& name, int number) {\n  EnumValueDescriptorProto* result = enum_proto->add_value();\n  result->set_name(name);\n  result->set_number(number);\n  return result;\n}\n\nMethodDescriptorProto* AddMethod(ServiceDescriptorProto* service,\n                                 const string& name,\n                                 const string& input_type,\n                                 const string& output_type) {\n  MethodDescriptorProto* result = service->add_method();\n  result->set_name(name);\n  result->set_input_type(input_type);\n  result->set_output_type(output_type);\n  return result;\n}\n\n// Empty enums technically aren't allowed.  We need to insert a dummy value\n// into them.\nvoid AddEmptyEnum(FileDescriptorProto* file, const string& name) {\n  AddEnumValue(AddEnum(file, name), name + \"_DUMMY\", 1);\n}\n\n// ===================================================================\n\n// Test simple files.\nclass FileDescriptorTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    // Build descriptors for the following definitions:\n    //\n    //   // in \"foo.proto\"\n    //   message FooMessage { extensions 1; }\n    //   enum FooEnum {FOO_ENUM_VALUE = 1;}\n    //   service FooService {}\n    //   extend FooMessage { optional int32 foo_extension = 1; }\n    //\n    //   // in \"bar.proto\"\n    //   package bar_package;\n    //   message BarMessage { extensions 1; }\n    //   enum BarEnum {BAR_ENUM_VALUE = 1;}\n    //   service BarService {}\n    //   extend BarMessage { optional int32 bar_extension = 1; }\n    //\n    // Also, we have an empty file \"baz.proto\".  This file's purpose is to\n    // make sure that even though it has the same package as foo.proto,\n    // searching it for members of foo.proto won't work.\n\n    FileDescriptorProto foo_file;\n    foo_file.set_name(\"foo.proto\");\n    AddExtensionRange(AddMessage(&foo_file, \"FooMessage\"), 1, 2);\n    AddEnumValue(AddEnum(&foo_file, \"FooEnum\"), \"FOO_ENUM_VALUE\", 1);\n    AddService(&foo_file, \"FooService\");\n    AddExtension(&foo_file, \"FooMessage\", \"foo_extension\", 1,\n                 FieldDescriptorProto::LABEL_OPTIONAL,\n                 FieldDescriptorProto::TYPE_INT32);\n\n    FileDescriptorProto bar_file;\n    bar_file.set_name(\"bar.proto\");\n    bar_file.set_package(\"bar_package\");\n    bar_file.add_dependency(\"foo.proto\");\n    AddExtensionRange(AddMessage(&bar_file, \"BarMessage\"), 1, 2);\n    AddEnumValue(AddEnum(&bar_file, \"BarEnum\"), \"BAR_ENUM_VALUE\", 1);\n    AddService(&bar_file, \"BarService\");\n    AddExtension(&bar_file, \"bar_package.BarMessage\", \"bar_extension\", 1,\n                 FieldDescriptorProto::LABEL_OPTIONAL,\n                 FieldDescriptorProto::TYPE_INT32);\n\n    FileDescriptorProto baz_file;\n    baz_file.set_name(\"baz.proto\");\n\n    // Build the descriptors and get the pointers.\n    foo_file_ = pool_.BuildFile(foo_file);\n    ASSERT_TRUE(foo_file_ != NULL);\n\n    bar_file_ = pool_.BuildFile(bar_file);\n    ASSERT_TRUE(bar_file_ != NULL);\n\n    baz_file_ = pool_.BuildFile(baz_file);\n    ASSERT_TRUE(baz_file_ != NULL);\n\n    ASSERT_EQ(1, foo_file_->message_type_count());\n    foo_message_ = foo_file_->message_type(0);\n    ASSERT_EQ(1, foo_file_->enum_type_count());\n    foo_enum_ = foo_file_->enum_type(0);\n    ASSERT_EQ(1, foo_enum_->value_count());\n    foo_enum_value_ = foo_enum_->value(0);\n    ASSERT_EQ(1, foo_file_->service_count());\n    foo_service_ = foo_file_->service(0);\n    ASSERT_EQ(1, foo_file_->extension_count());\n    foo_extension_ = foo_file_->extension(0);\n\n    ASSERT_EQ(1, bar_file_->message_type_count());\n    bar_message_ = bar_file_->message_type(0);\n    ASSERT_EQ(1, bar_file_->enum_type_count());\n    bar_enum_ = bar_file_->enum_type(0);\n    ASSERT_EQ(1, bar_enum_->value_count());\n    bar_enum_value_ = bar_enum_->value(0);\n    ASSERT_EQ(1, bar_file_->service_count());\n    bar_service_ = bar_file_->service(0);\n    ASSERT_EQ(1, bar_file_->extension_count());\n    bar_extension_ = bar_file_->extension(0);\n  }\n\n  DescriptorPool pool_;\n\n  const FileDescriptor* foo_file_;\n  const FileDescriptor* bar_file_;\n  const FileDescriptor* baz_file_;\n\n  const Descriptor*          foo_message_;\n  const EnumDescriptor*      foo_enum_;\n  const EnumValueDescriptor* foo_enum_value_;\n  const ServiceDescriptor*   foo_service_;\n  const FieldDescriptor*     foo_extension_;\n\n  const Descriptor*          bar_message_;\n  const EnumDescriptor*      bar_enum_;\n  const EnumValueDescriptor* bar_enum_value_;\n  const ServiceDescriptor*   bar_service_;\n  const FieldDescriptor*     bar_extension_;\n};\n\nTEST_F(FileDescriptorTest, Name) {\n  EXPECT_EQ(\"foo.proto\", foo_file_->name());\n  EXPECT_EQ(\"bar.proto\", bar_file_->name());\n  EXPECT_EQ(\"baz.proto\", baz_file_->name());\n}\n\nTEST_F(FileDescriptorTest, Package) {\n  EXPECT_EQ(\"\", foo_file_->package());\n  EXPECT_EQ(\"bar_package\", bar_file_->package());\n}\n\nTEST_F(FileDescriptorTest, Dependencies) {\n  EXPECT_EQ(0, foo_file_->dependency_count());\n  EXPECT_EQ(1, bar_file_->dependency_count());\n  EXPECT_EQ(foo_file_, bar_file_->dependency(0));\n}\n\nTEST_F(FileDescriptorTest, FindMessageTypeByName) {\n  EXPECT_EQ(foo_message_, foo_file_->FindMessageTypeByName(\"FooMessage\"));\n  EXPECT_EQ(bar_message_, bar_file_->FindMessageTypeByName(\"BarMessage\"));\n\n  EXPECT_TRUE(foo_file_->FindMessageTypeByName(\"BarMessage\") == NULL);\n  EXPECT_TRUE(bar_file_->FindMessageTypeByName(\"FooMessage\") == NULL);\n  EXPECT_TRUE(baz_file_->FindMessageTypeByName(\"FooMessage\") == NULL);\n\n  EXPECT_TRUE(foo_file_->FindMessageTypeByName(\"NoSuchMessage\") == NULL);\n  EXPECT_TRUE(foo_file_->FindMessageTypeByName(\"FooEnum\") == NULL);\n}\n\nTEST_F(FileDescriptorTest, FindEnumTypeByName) {\n  EXPECT_EQ(foo_enum_, foo_file_->FindEnumTypeByName(\"FooEnum\"));\n  EXPECT_EQ(bar_enum_, bar_file_->FindEnumTypeByName(\"BarEnum\"));\n\n  EXPECT_TRUE(foo_file_->FindEnumTypeByName(\"BarEnum\") == NULL);\n  EXPECT_TRUE(bar_file_->FindEnumTypeByName(\"FooEnum\") == NULL);\n  EXPECT_TRUE(baz_file_->FindEnumTypeByName(\"FooEnum\") == NULL);\n\n  EXPECT_TRUE(foo_file_->FindEnumTypeByName(\"NoSuchEnum\") == NULL);\n  EXPECT_TRUE(foo_file_->FindEnumTypeByName(\"FooMessage\") == NULL);\n}\n\nTEST_F(FileDescriptorTest, FindEnumValueByName) {\n  EXPECT_EQ(foo_enum_value_, foo_file_->FindEnumValueByName(\"FOO_ENUM_VALUE\"));\n  EXPECT_EQ(bar_enum_value_, bar_file_->FindEnumValueByName(\"BAR_ENUM_VALUE\"));\n\n  EXPECT_TRUE(foo_file_->FindEnumValueByName(\"BAR_ENUM_VALUE\") == NULL);\n  EXPECT_TRUE(bar_file_->FindEnumValueByName(\"FOO_ENUM_VALUE\") == NULL);\n  EXPECT_TRUE(baz_file_->FindEnumValueByName(\"FOO_ENUM_VALUE\") == NULL);\n\n  EXPECT_TRUE(foo_file_->FindEnumValueByName(\"NO_SUCH_VALUE\") == NULL);\n  EXPECT_TRUE(foo_file_->FindEnumValueByName(\"FooMessage\") == NULL);\n}\n\nTEST_F(FileDescriptorTest, FindServiceByName) {\n  EXPECT_EQ(foo_service_, foo_file_->FindServiceByName(\"FooService\"));\n  EXPECT_EQ(bar_service_, bar_file_->FindServiceByName(\"BarService\"));\n\n  EXPECT_TRUE(foo_file_->FindServiceByName(\"BarService\") == NULL);\n  EXPECT_TRUE(bar_file_->FindServiceByName(\"FooService\") == NULL);\n  EXPECT_TRUE(baz_file_->FindServiceByName(\"FooService\") == NULL);\n\n  EXPECT_TRUE(foo_file_->FindServiceByName(\"NoSuchService\") == NULL);\n  EXPECT_TRUE(foo_file_->FindServiceByName(\"FooMessage\") == NULL);\n}\n\nTEST_F(FileDescriptorTest, FindExtensionByName) {\n  EXPECT_EQ(foo_extension_, foo_file_->FindExtensionByName(\"foo_extension\"));\n  EXPECT_EQ(bar_extension_, bar_file_->FindExtensionByName(\"bar_extension\"));\n\n  EXPECT_TRUE(foo_file_->FindExtensionByName(\"bar_extension\") == NULL);\n  EXPECT_TRUE(bar_file_->FindExtensionByName(\"foo_extension\") == NULL);\n  EXPECT_TRUE(baz_file_->FindExtensionByName(\"foo_extension\") == NULL);\n\n  EXPECT_TRUE(foo_file_->FindExtensionByName(\"no_such_extension\") == NULL);\n  EXPECT_TRUE(foo_file_->FindExtensionByName(\"FooMessage\") == NULL);\n}\n\nTEST_F(FileDescriptorTest, FindExtensionByNumber) {\n  EXPECT_EQ(foo_extension_, pool_.FindExtensionByNumber(foo_message_, 1));\n  EXPECT_EQ(bar_extension_, pool_.FindExtensionByNumber(bar_message_, 1));\n\n  EXPECT_TRUE(pool_.FindExtensionByNumber(foo_message_, 2) == NULL);\n}\n\nTEST_F(FileDescriptorTest, BuildAgain) {\n  // Test that if te call BuildFile again on the same input we get the same\n  // FileDescriptor back.\n  FileDescriptorProto file;\n  foo_file_->CopyTo(&file);\n  EXPECT_EQ(foo_file_, pool_.BuildFile(file));\n\n  // But if we change the file then it won't work.\n  file.set_package(\"some.other.package\");\n  EXPECT_TRUE(pool_.BuildFile(file) == NULL);\n}\n\n// ===================================================================\n\n// Test simple flat messages and fields.\nclass DescriptorTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    // Build descriptors for the following definitions:\n    //\n    //   // in \"foo.proto\"\n    //   message TestForeign {}\n    //   enum TestEnum {}\n    //\n    //   message TestMessage {\n    //     required string      foo = 1;\n    //     optional TestEnum    bar = 6;\n    //     repeated TestForeign baz = 500000000;\n    //     optional group       qux = 15 {}\n    //   }\n    //\n    //   // in \"bar.proto\"\n    //   package corge.grault;\n    //   message TestMessage2 {\n    //     required string foo = 1;\n    //     required string bar = 2;\n    //     required string quux = 6;\n    //   }\n    //\n    // We cheat and use TestForeign as the type for qux rather than create\n    // an actual nested type.\n    //\n    // Since all primitive types (including string) use the same building\n    // code, there's no need to test each one individually.\n    //\n    // TestMessage2 is primarily here to test FindFieldByName and friends.\n    // All messages created from the same DescriptorPool share the same lookup\n    // table, so we need to insure that they don't interfere.\n\n    FileDescriptorProto foo_file;\n    foo_file.set_name(\"foo.proto\");\n    AddMessage(&foo_file, \"TestForeign\");\n    AddEmptyEnum(&foo_file, \"TestEnum\");\n\n    DescriptorProto* message = AddMessage(&foo_file, \"TestMessage\");\n    AddField(message, \"foo\", 1,\n             FieldDescriptorProto::LABEL_REQUIRED,\n             FieldDescriptorProto::TYPE_STRING);\n    AddField(message, \"bar\", 6,\n             FieldDescriptorProto::LABEL_OPTIONAL,\n             FieldDescriptorProto::TYPE_ENUM)\n      ->set_type_name(\"TestEnum\");\n    AddField(message, \"baz\", 500000000,\n             FieldDescriptorProto::LABEL_REPEATED,\n             FieldDescriptorProto::TYPE_MESSAGE)\n      ->set_type_name(\"TestForeign\");\n    AddField(message, \"qux\", 15,\n             FieldDescriptorProto::LABEL_OPTIONAL,\n             FieldDescriptorProto::TYPE_GROUP)\n      ->set_type_name(\"TestForeign\");\n\n    FileDescriptorProto bar_file;\n    bar_file.set_name(\"bar.proto\");\n    bar_file.set_package(\"corge.grault\");\n\n    DescriptorProto* message2 = AddMessage(&bar_file, \"TestMessage2\");\n    AddField(message2, \"foo\", 1,\n             FieldDescriptorProto::LABEL_REQUIRED,\n             FieldDescriptorProto::TYPE_STRING);\n    AddField(message2, \"bar\", 2,\n             FieldDescriptorProto::LABEL_REQUIRED,\n             FieldDescriptorProto::TYPE_STRING);\n    AddField(message2, \"quux\", 6,\n             FieldDescriptorProto::LABEL_REQUIRED,\n             FieldDescriptorProto::TYPE_STRING);\n\n    // Build the descriptors and get the pointers.\n    foo_file_ = pool_.BuildFile(foo_file);\n    ASSERT_TRUE(foo_file_ != NULL);\n\n    bar_file_ = pool_.BuildFile(bar_file);\n    ASSERT_TRUE(bar_file_ != NULL);\n\n    ASSERT_EQ(1, foo_file_->enum_type_count());\n    enum_ = foo_file_->enum_type(0);\n\n    ASSERT_EQ(2, foo_file_->message_type_count());\n    foreign_ = foo_file_->message_type(0);\n    message_ = foo_file_->message_type(1);\n\n    ASSERT_EQ(4, message_->field_count());\n    foo_ = message_->field(0);\n    bar_ = message_->field(1);\n    baz_ = message_->field(2);\n    qux_ = message_->field(3);\n\n    ASSERT_EQ(1, bar_file_->message_type_count());\n    message2_ = bar_file_->message_type(0);\n\n    ASSERT_EQ(3, message2_->field_count());\n    foo2_  = message2_->field(0);\n    bar2_  = message2_->field(1);\n    quux2_ = message2_->field(2);\n  }\n\n  DescriptorPool pool_;\n\n  const FileDescriptor* foo_file_;\n  const FileDescriptor* bar_file_;\n\n  const Descriptor* message_;\n  const Descriptor* message2_;\n  const Descriptor* foreign_;\n  const EnumDescriptor* enum_;\n\n  const FieldDescriptor* foo_;\n  const FieldDescriptor* bar_;\n  const FieldDescriptor* baz_;\n  const FieldDescriptor* qux_;\n\n  const FieldDescriptor* foo2_;\n  const FieldDescriptor* bar2_;\n  const FieldDescriptor* quux2_;\n};\n\nTEST_F(DescriptorTest, Name) {\n  EXPECT_EQ(\"TestMessage\", message_->name());\n  EXPECT_EQ(\"TestMessage\", message_->full_name());\n  EXPECT_EQ(foo_file_, message_->file());\n\n  EXPECT_EQ(\"TestMessage2\", message2_->name());\n  EXPECT_EQ(\"corge.grault.TestMessage2\", message2_->full_name());\n  EXPECT_EQ(bar_file_, message2_->file());\n}\n\nTEST_F(DescriptorTest, ContainingType) {\n  EXPECT_TRUE(message_->containing_type() == NULL);\n  EXPECT_TRUE(message2_->containing_type() == NULL);\n}\n\nTEST_F(DescriptorTest, FieldsByIndex) {\n  ASSERT_EQ(4, message_->field_count());\n  EXPECT_EQ(foo_, message_->field(0));\n  EXPECT_EQ(bar_, message_->field(1));\n  EXPECT_EQ(baz_, message_->field(2));\n  EXPECT_EQ(qux_, message_->field(3));\n}\n\nTEST_F(DescriptorTest, FindFieldByName) {\n  // All messages in the same DescriptorPool share a single lookup table for\n  // fields.  So, in addition to testing that FindFieldByName finds the fields\n  // of the message, we need to test that it does *not* find the fields of\n  // *other* messages.\n\n  EXPECT_EQ(foo_, message_->FindFieldByName(\"foo\"));\n  EXPECT_EQ(bar_, message_->FindFieldByName(\"bar\"));\n  EXPECT_EQ(baz_, message_->FindFieldByName(\"baz\"));\n  EXPECT_EQ(qux_, message_->FindFieldByName(\"qux\"));\n  EXPECT_TRUE(message_->FindFieldByName(\"no_such_field\") == NULL);\n  EXPECT_TRUE(message_->FindFieldByName(\"quux\") == NULL);\n\n  EXPECT_EQ(foo2_ , message2_->FindFieldByName(\"foo\" ));\n  EXPECT_EQ(bar2_ , message2_->FindFieldByName(\"bar\" ));\n  EXPECT_EQ(quux2_, message2_->FindFieldByName(\"quux\"));\n  EXPECT_TRUE(message2_->FindFieldByName(\"baz\") == NULL);\n  EXPECT_TRUE(message2_->FindFieldByName(\"qux\") == NULL);\n}\n\nTEST_F(DescriptorTest, FindFieldByNumber) {\n  EXPECT_EQ(foo_, message_->FindFieldByNumber(1));\n  EXPECT_EQ(bar_, message_->FindFieldByNumber(6));\n  EXPECT_EQ(baz_, message_->FindFieldByNumber(500000000));\n  EXPECT_EQ(qux_, message_->FindFieldByNumber(15));\n  EXPECT_TRUE(message_->FindFieldByNumber(837592) == NULL);\n  EXPECT_TRUE(message_->FindFieldByNumber(2) == NULL);\n\n  EXPECT_EQ(foo2_ , message2_->FindFieldByNumber(1));\n  EXPECT_EQ(bar2_ , message2_->FindFieldByNumber(2));\n  EXPECT_EQ(quux2_, message2_->FindFieldByNumber(6));\n  EXPECT_TRUE(message2_->FindFieldByNumber(15) == NULL);\n  EXPECT_TRUE(message2_->FindFieldByNumber(500000000) == NULL);\n}\n\nTEST_F(DescriptorTest, FieldName) {\n  EXPECT_EQ(\"foo\", foo_->name());\n  EXPECT_EQ(\"bar\", bar_->name());\n  EXPECT_EQ(\"baz\", baz_->name());\n  EXPECT_EQ(\"qux\", qux_->name());\n}\n\nTEST_F(DescriptorTest, FieldFullName) {\n  EXPECT_EQ(\"TestMessage.foo\", foo_->full_name());\n  EXPECT_EQ(\"TestMessage.bar\", bar_->full_name());\n  EXPECT_EQ(\"TestMessage.baz\", baz_->full_name());\n  EXPECT_EQ(\"TestMessage.qux\", qux_->full_name());\n\n  EXPECT_EQ(\"corge.grault.TestMessage2.foo\", foo2_->full_name());\n  EXPECT_EQ(\"corge.grault.TestMessage2.bar\", bar2_->full_name());\n  EXPECT_EQ(\"corge.grault.TestMessage2.quux\", quux2_->full_name());\n}\n\nTEST_F(DescriptorTest, FieldFile) {\n  EXPECT_EQ(foo_file_, foo_->file());\n  EXPECT_EQ(foo_file_, bar_->file());\n  EXPECT_EQ(foo_file_, baz_->file());\n  EXPECT_EQ(foo_file_, qux_->file());\n\n  EXPECT_EQ(bar_file_, foo2_->file());\n  EXPECT_EQ(bar_file_, bar2_->file());\n  EXPECT_EQ(bar_file_, quux2_->file());\n}\n\nTEST_F(DescriptorTest, FieldIndex) {\n  EXPECT_EQ(0, foo_->index());\n  EXPECT_EQ(1, bar_->index());\n  EXPECT_EQ(2, baz_->index());\n  EXPECT_EQ(3, qux_->index());\n}\n\nTEST_F(DescriptorTest, FieldNumber) {\n  EXPECT_EQ(        1, foo_->number());\n  EXPECT_EQ(        6, bar_->number());\n  EXPECT_EQ(500000000, baz_->number());\n  EXPECT_EQ(       15, qux_->number());\n}\n\nTEST_F(DescriptorTest, FieldType) {\n  EXPECT_EQ(FieldDescriptor::TYPE_STRING , foo_->type());\n  EXPECT_EQ(FieldDescriptor::TYPE_ENUM   , bar_->type());\n  EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_->type());\n  EXPECT_EQ(FieldDescriptor::TYPE_GROUP  , qux_->type());\n}\n\nTEST_F(DescriptorTest, FieldLabel) {\n  EXPECT_EQ(FieldDescriptor::LABEL_REQUIRED, foo_->label());\n  EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, bar_->label());\n  EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, baz_->label());\n  EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, qux_->label());\n\n  EXPECT_TRUE (foo_->is_required());\n  EXPECT_FALSE(foo_->is_optional());\n  EXPECT_FALSE(foo_->is_repeated());\n\n  EXPECT_FALSE(bar_->is_required());\n  EXPECT_TRUE (bar_->is_optional());\n  EXPECT_FALSE(bar_->is_repeated());\n\n  EXPECT_FALSE(baz_->is_required());\n  EXPECT_FALSE(baz_->is_optional());\n  EXPECT_TRUE (baz_->is_repeated());\n}\n\nTEST_F(DescriptorTest, FieldHasDefault) {\n  EXPECT_FALSE(foo_->has_default_value());\n  EXPECT_FALSE(bar_->has_default_value());\n  EXPECT_FALSE(baz_->has_default_value());\n  EXPECT_FALSE(qux_->has_default_value());\n}\n\nTEST_F(DescriptorTest, FieldContainingType) {\n  EXPECT_EQ(message_, foo_->containing_type());\n  EXPECT_EQ(message_, bar_->containing_type());\n  EXPECT_EQ(message_, baz_->containing_type());\n  EXPECT_EQ(message_, qux_->containing_type());\n\n  EXPECT_EQ(message2_, foo2_ ->containing_type());\n  EXPECT_EQ(message2_, bar2_ ->containing_type());\n  EXPECT_EQ(message2_, quux2_->containing_type());\n}\n\nTEST_F(DescriptorTest, FieldMessageType) {\n  EXPECT_TRUE(foo_->message_type() == NULL);\n  EXPECT_TRUE(bar_->message_type() == NULL);\n\n  EXPECT_EQ(foreign_, baz_->message_type());\n  EXPECT_EQ(foreign_, qux_->message_type());\n}\n\nTEST_F(DescriptorTest, FieldEnumType) {\n  EXPECT_TRUE(foo_->enum_type() == NULL);\n  EXPECT_TRUE(baz_->enum_type() == NULL);\n  EXPECT_TRUE(qux_->enum_type() == NULL);\n\n  EXPECT_EQ(enum_, bar_->enum_type());\n}\n\n// ===================================================================\n\nclass StylizedFieldNamesTest : public testing::Test {\n protected:\n  void SetUp() {\n    FileDescriptorProto file;\n    file.set_name(\"foo.proto\");\n\n    AddExtensionRange(AddMessage(&file, \"ExtendableMessage\"), 1, 1000);\n\n    DescriptorProto* message = AddMessage(&file, \"TestMessage\");\n    AddField(message, \"foo_foo\", 1,\n             FieldDescriptorProto::LABEL_OPTIONAL,\n             FieldDescriptorProto::TYPE_INT32);\n    AddField(message, \"FooBar\", 2,\n             FieldDescriptorProto::LABEL_OPTIONAL,\n             FieldDescriptorProto::TYPE_INT32);\n    AddField(message, \"fooBaz\", 3,\n             FieldDescriptorProto::LABEL_OPTIONAL,\n             FieldDescriptorProto::TYPE_INT32);\n    AddField(message, \"fooFoo\", 4,  // Camel-case conflict with foo_foo.\n             FieldDescriptorProto::LABEL_OPTIONAL,\n             FieldDescriptorProto::TYPE_INT32);\n    AddField(message, \"foobar\", 5,  // Lower-case conflict with FooBar.\n             FieldDescriptorProto::LABEL_OPTIONAL,\n             FieldDescriptorProto::TYPE_INT32);\n\n    AddNestedExtension(message, \"ExtendableMessage\", \"bar_foo\", 1,\n                       FieldDescriptorProto::LABEL_OPTIONAL,\n                       FieldDescriptorProto::TYPE_INT32);\n    AddNestedExtension(message, \"ExtendableMessage\", \"BarBar\", 2,\n                       FieldDescriptorProto::LABEL_OPTIONAL,\n                       FieldDescriptorProto::TYPE_INT32);\n    AddNestedExtension(message, \"ExtendableMessage\", \"BarBaz\", 3,\n                       FieldDescriptorProto::LABEL_OPTIONAL,\n                       FieldDescriptorProto::TYPE_INT32);\n    AddNestedExtension(message, \"ExtendableMessage\", \"barFoo\", 4,  // Conflict\n                       FieldDescriptorProto::LABEL_OPTIONAL,\n                       FieldDescriptorProto::TYPE_INT32);\n    AddNestedExtension(message, \"ExtendableMessage\", \"barbar\", 5,  // Conflict\n                       FieldDescriptorProto::LABEL_OPTIONAL,\n                       FieldDescriptorProto::TYPE_INT32);\n\n    AddExtension(&file, \"ExtendableMessage\", \"baz_foo\", 11,\n                 FieldDescriptorProto::LABEL_OPTIONAL,\n                 FieldDescriptorProto::TYPE_INT32);\n    AddExtension(&file, \"ExtendableMessage\", \"BazBar\", 12,\n                 FieldDescriptorProto::LABEL_OPTIONAL,\n                 FieldDescriptorProto::TYPE_INT32);\n    AddExtension(&file, \"ExtendableMessage\", \"BazBaz\", 13,\n                 FieldDescriptorProto::LABEL_OPTIONAL,\n                 FieldDescriptorProto::TYPE_INT32);\n    AddExtension(&file, \"ExtendableMessage\", \"bazFoo\", 14,  // Conflict\n                 FieldDescriptorProto::LABEL_OPTIONAL,\n                 FieldDescriptorProto::TYPE_INT32);\n    AddExtension(&file, \"ExtendableMessage\", \"bazbar\", 15,  // Conflict\n                 FieldDescriptorProto::LABEL_OPTIONAL,\n                 FieldDescriptorProto::TYPE_INT32);\n\n    file_ = pool_.BuildFile(file);\n    ASSERT_TRUE(file_ != NULL);\n    ASSERT_EQ(2, file_->message_type_count());\n    message_ = file_->message_type(1);\n    ASSERT_EQ(\"TestMessage\", message_->name());\n    ASSERT_EQ(5, message_->field_count());\n    ASSERT_EQ(5, message_->extension_count());\n    ASSERT_EQ(5, file_->extension_count());\n  }\n\n  DescriptorPool pool_;\n  const FileDescriptor* file_;\n  const Descriptor* message_;\n};\n\nTEST_F(StylizedFieldNamesTest, LowercaseName) {\n  EXPECT_EQ(\"foo_foo\", message_->field(0)->lowercase_name());\n  EXPECT_EQ(\"foobar\" , message_->field(1)->lowercase_name());\n  EXPECT_EQ(\"foobaz\" , message_->field(2)->lowercase_name());\n  EXPECT_EQ(\"foofoo\" , message_->field(3)->lowercase_name());\n  EXPECT_EQ(\"foobar\" , message_->field(4)->lowercase_name());\n\n  EXPECT_EQ(\"bar_foo\", message_->extension(0)->lowercase_name());\n  EXPECT_EQ(\"barbar\" , message_->extension(1)->lowercase_name());\n  EXPECT_EQ(\"barbaz\" , message_->extension(2)->lowercase_name());\n  EXPECT_EQ(\"barfoo\" , message_->extension(3)->lowercase_name());\n  EXPECT_EQ(\"barbar\" , message_->extension(4)->lowercase_name());\n\n  EXPECT_EQ(\"baz_foo\", file_->extension(0)->lowercase_name());\n  EXPECT_EQ(\"bazbar\" , file_->extension(1)->lowercase_name());\n  EXPECT_EQ(\"bazbaz\" , file_->extension(2)->lowercase_name());\n  EXPECT_EQ(\"bazfoo\" , file_->extension(3)->lowercase_name());\n  EXPECT_EQ(\"bazbar\" , file_->extension(4)->lowercase_name());\n}\n\nTEST_F(StylizedFieldNamesTest, CamelcaseName) {\n  EXPECT_EQ(\"fooFoo\", message_->field(0)->camelcase_name());\n  EXPECT_EQ(\"fooBar\", message_->field(1)->camelcase_name());\n  EXPECT_EQ(\"fooBaz\", message_->field(2)->camelcase_name());\n  EXPECT_EQ(\"fooFoo\", message_->field(3)->camelcase_name());\n  EXPECT_EQ(\"foobar\", message_->field(4)->camelcase_name());\n\n  EXPECT_EQ(\"barFoo\", message_->extension(0)->camelcase_name());\n  EXPECT_EQ(\"barBar\", message_->extension(1)->camelcase_name());\n  EXPECT_EQ(\"barBaz\", message_->extension(2)->camelcase_name());\n  EXPECT_EQ(\"barFoo\", message_->extension(3)->camelcase_name());\n  EXPECT_EQ(\"barbar\", message_->extension(4)->camelcase_name());\n\n  EXPECT_EQ(\"bazFoo\", file_->extension(0)->camelcase_name());\n  EXPECT_EQ(\"bazBar\", file_->extension(1)->camelcase_name());\n  EXPECT_EQ(\"bazBaz\", file_->extension(2)->camelcase_name());\n  EXPECT_EQ(\"bazFoo\", file_->extension(3)->camelcase_name());\n  EXPECT_EQ(\"bazbar\", file_->extension(4)->camelcase_name());\n}\n\nTEST_F(StylizedFieldNamesTest, FindByLowercaseName) {\n  EXPECT_EQ(message_->field(0),\n            message_->FindFieldByLowercaseName(\"foo_foo\"));\n  EXPECT_EQ(message_->field(1),\n            message_->FindFieldByLowercaseName(\"foobar\"));\n  EXPECT_EQ(message_->field(2),\n            message_->FindFieldByLowercaseName(\"foobaz\"));\n  EXPECT_TRUE(message_->FindFieldByLowercaseName(\"FooBar\") == NULL);\n  EXPECT_TRUE(message_->FindFieldByLowercaseName(\"fooBaz\") == NULL);\n  EXPECT_TRUE(message_->FindFieldByLowercaseName(\"bar_foo\") == NULL);\n  EXPECT_TRUE(message_->FindFieldByLowercaseName(\"nosuchfield\") == NULL);\n\n  EXPECT_EQ(message_->extension(0),\n            message_->FindExtensionByLowercaseName(\"bar_foo\"));\n  EXPECT_EQ(message_->extension(1),\n            message_->FindExtensionByLowercaseName(\"barbar\"));\n  EXPECT_EQ(message_->extension(2),\n            message_->FindExtensionByLowercaseName(\"barbaz\"));\n  EXPECT_TRUE(message_->FindExtensionByLowercaseName(\"BarBar\") == NULL);\n  EXPECT_TRUE(message_->FindExtensionByLowercaseName(\"barBaz\") == NULL);\n  EXPECT_TRUE(message_->FindExtensionByLowercaseName(\"foo_foo\") == NULL);\n  EXPECT_TRUE(message_->FindExtensionByLowercaseName(\"nosuchfield\") == NULL);\n\n  EXPECT_EQ(file_->extension(0),\n            file_->FindExtensionByLowercaseName(\"baz_foo\"));\n  EXPECT_EQ(file_->extension(1),\n            file_->FindExtensionByLowercaseName(\"bazbar\"));\n  EXPECT_EQ(file_->extension(2),\n            file_->FindExtensionByLowercaseName(\"bazbaz\"));\n  EXPECT_TRUE(file_->FindExtensionByLowercaseName(\"BazBar\") == NULL);\n  EXPECT_TRUE(file_->FindExtensionByLowercaseName(\"bazBaz\") == NULL);\n  EXPECT_TRUE(file_->FindExtensionByLowercaseName(\"nosuchfield\") == NULL);\n}\n\nTEST_F(StylizedFieldNamesTest, FindByCamelcaseName) {\n  EXPECT_EQ(message_->field(0),\n            message_->FindFieldByCamelcaseName(\"fooFoo\"));\n  EXPECT_EQ(message_->field(1),\n            message_->FindFieldByCamelcaseName(\"fooBar\"));\n  EXPECT_EQ(message_->field(2),\n            message_->FindFieldByCamelcaseName(\"fooBaz\"));\n  EXPECT_TRUE(message_->FindFieldByCamelcaseName(\"foo_foo\") == NULL);\n  EXPECT_TRUE(message_->FindFieldByCamelcaseName(\"FooBar\") == NULL);\n  EXPECT_TRUE(message_->FindFieldByCamelcaseName(\"barFoo\") == NULL);\n  EXPECT_TRUE(message_->FindFieldByCamelcaseName(\"nosuchfield\") == NULL);\n\n  EXPECT_EQ(message_->extension(0),\n            message_->FindExtensionByCamelcaseName(\"barFoo\"));\n  EXPECT_EQ(message_->extension(1),\n            message_->FindExtensionByCamelcaseName(\"barBar\"));\n  EXPECT_EQ(message_->extension(2),\n            message_->FindExtensionByCamelcaseName(\"barBaz\"));\n  EXPECT_TRUE(message_->FindExtensionByCamelcaseName(\"bar_foo\") == NULL);\n  EXPECT_TRUE(message_->FindExtensionByCamelcaseName(\"BarBar\") == NULL);\n  EXPECT_TRUE(message_->FindExtensionByCamelcaseName(\"fooFoo\") == NULL);\n  EXPECT_TRUE(message_->FindExtensionByCamelcaseName(\"nosuchfield\") == NULL);\n\n  EXPECT_EQ(file_->extension(0),\n            file_->FindExtensionByCamelcaseName(\"bazFoo\"));\n  EXPECT_EQ(file_->extension(1),\n            file_->FindExtensionByCamelcaseName(\"bazBar\"));\n  EXPECT_EQ(file_->extension(2),\n            file_->FindExtensionByCamelcaseName(\"bazBaz\"));\n  EXPECT_TRUE(file_->FindExtensionByCamelcaseName(\"baz_foo\") == NULL);\n  EXPECT_TRUE(file_->FindExtensionByCamelcaseName(\"BazBar\") == NULL);\n  EXPECT_TRUE(file_->FindExtensionByCamelcaseName(\"nosuchfield\") == NULL);\n}\n\n// ===================================================================\n\n// Test enum descriptors.\nclass EnumDescriptorTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    // Build descriptors for the following definitions:\n    //\n    //   // in \"foo.proto\"\n    //   enum TestEnum {\n    //     FOO = 1;\n    //     BAR = 2;\n    //   }\n    //\n    //   // in \"bar.proto\"\n    //   package corge.grault;\n    //   enum TestEnum2 {\n    //     FOO = 1;\n    //     BAZ = 3;\n    //   }\n    //\n    // TestEnum2 is primarily here to test FindValueByName and friends.\n    // All enums created from the same DescriptorPool share the same lookup\n    // table, so we need to insure that they don't interfere.\n\n    // TestEnum\n    FileDescriptorProto foo_file;\n    foo_file.set_name(\"foo.proto\");\n\n    EnumDescriptorProto* enum_proto = AddEnum(&foo_file, \"TestEnum\");\n    AddEnumValue(enum_proto, \"FOO\", 1);\n    AddEnumValue(enum_proto, \"BAR\", 2);\n\n    // TestEnum2\n    FileDescriptorProto bar_file;\n    bar_file.set_name(\"bar.proto\");\n    bar_file.set_package(\"corge.grault\");\n\n    EnumDescriptorProto* enum2_proto = AddEnum(&bar_file, \"TestEnum2\");\n    AddEnumValue(enum2_proto, \"FOO\", 1);\n    AddEnumValue(enum2_proto, \"BAZ\", 3);\n\n    // Build the descriptors and get the pointers.\n    foo_file_ = pool_.BuildFile(foo_file);\n    ASSERT_TRUE(foo_file_ != NULL);\n\n    bar_file_ = pool_.BuildFile(bar_file);\n    ASSERT_TRUE(bar_file_ != NULL);\n\n    ASSERT_EQ(1, foo_file_->enum_type_count());\n    enum_ = foo_file_->enum_type(0);\n\n    ASSERT_EQ(2, enum_->value_count());\n    foo_ = enum_->value(0);\n    bar_ = enum_->value(1);\n\n    ASSERT_EQ(1, bar_file_->enum_type_count());\n    enum2_ = bar_file_->enum_type(0);\n\n    ASSERT_EQ(2, enum2_->value_count());\n    foo2_ = enum2_->value(0);\n    baz2_ = enum2_->value(1);\n  }\n\n  DescriptorPool pool_;\n\n  const FileDescriptor* foo_file_;\n  const FileDescriptor* bar_file_;\n\n  const EnumDescriptor* enum_;\n  const EnumDescriptor* enum2_;\n\n  const EnumValueDescriptor* foo_;\n  const EnumValueDescriptor* bar_;\n\n  const EnumValueDescriptor* foo2_;\n  const EnumValueDescriptor* baz2_;\n};\n\nTEST_F(EnumDescriptorTest, Name) {\n  EXPECT_EQ(\"TestEnum\", enum_->name());\n  EXPECT_EQ(\"TestEnum\", enum_->full_name());\n  EXPECT_EQ(foo_file_, enum_->file());\n\n  EXPECT_EQ(\"TestEnum2\", enum2_->name());\n  EXPECT_EQ(\"corge.grault.TestEnum2\", enum2_->full_name());\n  EXPECT_EQ(bar_file_, enum2_->file());\n}\n\nTEST_F(EnumDescriptorTest, ContainingType) {\n  EXPECT_TRUE(enum_->containing_type() == NULL);\n  EXPECT_TRUE(enum2_->containing_type() == NULL);\n}\n\nTEST_F(EnumDescriptorTest, ValuesByIndex) {\n  ASSERT_EQ(2, enum_->value_count());\n  EXPECT_EQ(foo_, enum_->value(0));\n  EXPECT_EQ(bar_, enum_->value(1));\n}\n\nTEST_F(EnumDescriptorTest, FindValueByName) {\n  EXPECT_EQ(foo_ , enum_ ->FindValueByName(\"FOO\"));\n  EXPECT_EQ(bar_ , enum_ ->FindValueByName(\"BAR\"));\n  EXPECT_EQ(foo2_, enum2_->FindValueByName(\"FOO\"));\n  EXPECT_EQ(baz2_, enum2_->FindValueByName(\"BAZ\"));\n\n  EXPECT_TRUE(enum_ ->FindValueByName(\"NO_SUCH_VALUE\") == NULL);\n  EXPECT_TRUE(enum_ ->FindValueByName(\"BAZ\"          ) == NULL);\n  EXPECT_TRUE(enum2_->FindValueByName(\"BAR\"          ) == NULL);\n}\n\nTEST_F(EnumDescriptorTest, FindValueByNumber) {\n  EXPECT_EQ(foo_ , enum_ ->FindValueByNumber(1));\n  EXPECT_EQ(bar_ , enum_ ->FindValueByNumber(2));\n  EXPECT_EQ(foo2_, enum2_->FindValueByNumber(1));\n  EXPECT_EQ(baz2_, enum2_->FindValueByNumber(3));\n\n  EXPECT_TRUE(enum_ ->FindValueByNumber(416) == NULL);\n  EXPECT_TRUE(enum_ ->FindValueByNumber(3) == NULL);\n  EXPECT_TRUE(enum2_->FindValueByNumber(2) == NULL);\n}\n\nTEST_F(EnumDescriptorTest, ValueName) {\n  EXPECT_EQ(\"FOO\", foo_->name());\n  EXPECT_EQ(\"BAR\", bar_->name());\n}\n\nTEST_F(EnumDescriptorTest, ValueFullName) {\n  EXPECT_EQ(\"FOO\", foo_->full_name());\n  EXPECT_EQ(\"BAR\", bar_->full_name());\n  EXPECT_EQ(\"corge.grault.FOO\", foo2_->full_name());\n  EXPECT_EQ(\"corge.grault.BAZ\", baz2_->full_name());\n}\n\nTEST_F(EnumDescriptorTest, ValueIndex) {\n  EXPECT_EQ(0, foo_->index());\n  EXPECT_EQ(1, bar_->index());\n}\n\nTEST_F(EnumDescriptorTest, ValueNumber) {\n  EXPECT_EQ(1, foo_->number());\n  EXPECT_EQ(2, bar_->number());\n}\n\nTEST_F(EnumDescriptorTest, ValueType) {\n  EXPECT_EQ(enum_ , foo_ ->type());\n  EXPECT_EQ(enum_ , bar_ ->type());\n  EXPECT_EQ(enum2_, foo2_->type());\n  EXPECT_EQ(enum2_, baz2_->type());\n}\n\n// ===================================================================\n\n// Test service descriptors.\nclass ServiceDescriptorTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    // Build descriptors for the following messages and service:\n    //    // in \"foo.proto\"\n    //    message FooRequest  {}\n    //    message FooResponse {}\n    //    message BarRequest  {}\n    //    message BarResponse {}\n    //    message BazRequest  {}\n    //    message BazResponse {}\n    //\n    //    service TestService {\n    //      rpc Foo(FooRequest) returns (FooResponse);\n    //      rpc Bar(BarRequest) returns (BarResponse);\n    //    }\n    //\n    //    // in \"bar.proto\"\n    //    package corge.grault\n    //    service TestService2 {\n    //      rpc Foo(FooRequest) returns (FooResponse);\n    //      rpc Baz(BazRequest) returns (BazResponse);\n    //    }\n\n    FileDescriptorProto foo_file;\n    foo_file.set_name(\"foo.proto\");\n\n    AddMessage(&foo_file, \"FooRequest\");\n    AddMessage(&foo_file, \"FooResponse\");\n    AddMessage(&foo_file, \"BarRequest\");\n    AddMessage(&foo_file, \"BarResponse\");\n    AddMessage(&foo_file, \"BazRequest\");\n    AddMessage(&foo_file, \"BazResponse\");\n\n    ServiceDescriptorProto* service = AddService(&foo_file, \"TestService\");\n    AddMethod(service, \"Foo\", \"FooRequest\", \"FooResponse\");\n    AddMethod(service, \"Bar\", \"BarRequest\", \"BarResponse\");\n\n    FileDescriptorProto bar_file;\n    bar_file.set_name(\"bar.proto\");\n    bar_file.set_package(\"corge.grault\");\n    bar_file.add_dependency(\"foo.proto\");\n\n    ServiceDescriptorProto* service2 = AddService(&bar_file, \"TestService2\");\n    AddMethod(service2, \"Foo\", \"FooRequest\", \"FooResponse\");\n    AddMethod(service2, \"Baz\", \"BazRequest\", \"BazResponse\");\n\n    // Build the descriptors and get the pointers.\n    foo_file_ = pool_.BuildFile(foo_file);\n    ASSERT_TRUE(foo_file_ != NULL);\n\n    bar_file_ = pool_.BuildFile(bar_file);\n    ASSERT_TRUE(bar_file_ != NULL);\n\n    ASSERT_EQ(6, foo_file_->message_type_count());\n    foo_request_  = foo_file_->message_type(0);\n    foo_response_ = foo_file_->message_type(1);\n    bar_request_  = foo_file_->message_type(2);\n    bar_response_ = foo_file_->message_type(3);\n    baz_request_  = foo_file_->message_type(4);\n    baz_response_ = foo_file_->message_type(5);\n\n    ASSERT_EQ(1, foo_file_->service_count());\n    service_ = foo_file_->service(0);\n\n    ASSERT_EQ(2, service_->method_count());\n    foo_ = service_->method(0);\n    bar_ = service_->method(1);\n\n    ASSERT_EQ(1, bar_file_->service_count());\n    service2_ = bar_file_->service(0);\n\n    ASSERT_EQ(2, service2_->method_count());\n    foo2_ = service2_->method(0);\n    baz2_ = service2_->method(1);\n  }\n\n  DescriptorPool pool_;\n\n  const FileDescriptor* foo_file_;\n  const FileDescriptor* bar_file_;\n\n  const Descriptor* foo_request_;\n  const Descriptor* foo_response_;\n  const Descriptor* bar_request_;\n  const Descriptor* bar_response_;\n  const Descriptor* baz_request_;\n  const Descriptor* baz_response_;\n\n  const ServiceDescriptor* service_;\n  const ServiceDescriptor* service2_;\n\n  const MethodDescriptor* foo_;\n  const MethodDescriptor* bar_;\n\n  const MethodDescriptor* foo2_;\n  const MethodDescriptor* baz2_;\n};\n\nTEST_F(ServiceDescriptorTest, Name) {\n  EXPECT_EQ(\"TestService\", service_->name());\n  EXPECT_EQ(\"TestService\", service_->full_name());\n  EXPECT_EQ(foo_file_, service_->file());\n\n  EXPECT_EQ(\"TestService2\", service2_->name());\n  EXPECT_EQ(\"corge.grault.TestService2\", service2_->full_name());\n  EXPECT_EQ(bar_file_, service2_->file());\n}\n\nTEST_F(ServiceDescriptorTest, MethodsByIndex) {\n  ASSERT_EQ(2, service_->method_count());\n  EXPECT_EQ(foo_, service_->method(0));\n  EXPECT_EQ(bar_, service_->method(1));\n}\n\nTEST_F(ServiceDescriptorTest, FindMethodByName) {\n  EXPECT_EQ(foo_ , service_ ->FindMethodByName(\"Foo\"));\n  EXPECT_EQ(bar_ , service_ ->FindMethodByName(\"Bar\"));\n  EXPECT_EQ(foo2_, service2_->FindMethodByName(\"Foo\"));\n  EXPECT_EQ(baz2_, service2_->FindMethodByName(\"Baz\"));\n\n  EXPECT_TRUE(service_ ->FindMethodByName(\"NoSuchMethod\") == NULL);\n  EXPECT_TRUE(service_ ->FindMethodByName(\"Baz\"         ) == NULL);\n  EXPECT_TRUE(service2_->FindMethodByName(\"Bar\"         ) == NULL);\n}\n\nTEST_F(ServiceDescriptorTest, MethodName) {\n  EXPECT_EQ(\"Foo\", foo_->name());\n  EXPECT_EQ(\"Bar\", bar_->name());\n}\n\nTEST_F(ServiceDescriptorTest, MethodFullName) {\n  EXPECT_EQ(\"TestService.Foo\", foo_->full_name());\n  EXPECT_EQ(\"TestService.Bar\", bar_->full_name());\n  EXPECT_EQ(\"corge.grault.TestService2.Foo\", foo2_->full_name());\n  EXPECT_EQ(\"corge.grault.TestService2.Baz\", baz2_->full_name());\n}\n\nTEST_F(ServiceDescriptorTest, MethodIndex) {\n  EXPECT_EQ(0, foo_->index());\n  EXPECT_EQ(1, bar_->index());\n}\n\nTEST_F(ServiceDescriptorTest, MethodParent) {\n  EXPECT_EQ(service_, foo_->service());\n  EXPECT_EQ(service_, bar_->service());\n}\n\nTEST_F(ServiceDescriptorTest, MethodInputType) {\n  EXPECT_EQ(foo_request_, foo_->input_type());\n  EXPECT_EQ(bar_request_, bar_->input_type());\n}\n\nTEST_F(ServiceDescriptorTest, MethodOutputType) {\n  EXPECT_EQ(foo_response_, foo_->output_type());\n  EXPECT_EQ(bar_response_, bar_->output_type());\n}\n\n// ===================================================================\n\n// Test nested types.\nclass NestedDescriptorTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    // Build descriptors for the following definitions:\n    //\n    //   // in \"foo.proto\"\n    //   message TestMessage {\n    //     message Foo {}\n    //     message Bar {}\n    //     enum Baz { A = 1; }\n    //     enum Qux { B = 1; }\n    //   }\n    //\n    //   // in \"bar.proto\"\n    //   package corge.grault;\n    //   message TestMessage2 {\n    //     message Foo {}\n    //     message Baz {}\n    //     enum Qux  { A = 1; }\n    //     enum Quux { C = 1; }\n    //   }\n    //\n    // TestMessage2 is primarily here to test FindNestedTypeByName and friends.\n    // All messages created from the same DescriptorPool share the same lookup\n    // table, so we need to insure that they don't interfere.\n    //\n    // We add enum values to the enums in order to test searching for enum\n    // values across a message's scope.\n\n    FileDescriptorProto foo_file;\n    foo_file.set_name(\"foo.proto\");\n\n    DescriptorProto* message = AddMessage(&foo_file, \"TestMessage\");\n    AddNestedMessage(message, \"Foo\");\n    AddNestedMessage(message, \"Bar\");\n    EnumDescriptorProto* baz = AddNestedEnum(message, \"Baz\");\n    AddEnumValue(baz, \"A\", 1);\n    EnumDescriptorProto* qux = AddNestedEnum(message, \"Qux\");\n    AddEnumValue(qux, \"B\", 1);\n\n    FileDescriptorProto bar_file;\n    bar_file.set_name(\"bar.proto\");\n    bar_file.set_package(\"corge.grault\");\n\n    DescriptorProto* message2 = AddMessage(&bar_file, \"TestMessage2\");\n    AddNestedMessage(message2, \"Foo\");\n    AddNestedMessage(message2, \"Baz\");\n    EnumDescriptorProto* qux2 = AddNestedEnum(message2, \"Qux\");\n    AddEnumValue(qux2, \"A\", 1);\n    EnumDescriptorProto* quux2 = AddNestedEnum(message2, \"Quux\");\n    AddEnumValue(quux2, \"C\", 1);\n\n    // Build the descriptors and get the pointers.\n    foo_file_ = pool_.BuildFile(foo_file);\n    ASSERT_TRUE(foo_file_ != NULL);\n\n    bar_file_ = pool_.BuildFile(bar_file);\n    ASSERT_TRUE(bar_file_ != NULL);\n\n    ASSERT_EQ(1, foo_file_->message_type_count());\n    message_ = foo_file_->message_type(0);\n\n    ASSERT_EQ(2, message_->nested_type_count());\n    foo_ = message_->nested_type(0);\n    bar_ = message_->nested_type(1);\n\n    ASSERT_EQ(2, message_->enum_type_count());\n    baz_ = message_->enum_type(0);\n    qux_ = message_->enum_type(1);\n\n    ASSERT_EQ(1, baz_->value_count());\n    a_ = baz_->value(0);\n    ASSERT_EQ(1, qux_->value_count());\n    b_ = qux_->value(0);\n\n    ASSERT_EQ(1, bar_file_->message_type_count());\n    message2_ = bar_file_->message_type(0);\n\n    ASSERT_EQ(2, message2_->nested_type_count());\n    foo2_ = message2_->nested_type(0);\n    baz2_ = message2_->nested_type(1);\n\n    ASSERT_EQ(2, message2_->enum_type_count());\n    qux2_ = message2_->enum_type(0);\n    quux2_ = message2_->enum_type(1);\n\n    ASSERT_EQ(1, qux2_->value_count());\n    a2_ = qux2_->value(0);\n    ASSERT_EQ(1, quux2_->value_count());\n    c2_ = quux2_->value(0);\n  }\n\n  DescriptorPool pool_;\n\n  const FileDescriptor* foo_file_;\n  const FileDescriptor* bar_file_;\n\n  const Descriptor* message_;\n  const Descriptor* message2_;\n\n  const Descriptor* foo_;\n  const Descriptor* bar_;\n  const EnumDescriptor* baz_;\n  const EnumDescriptor* qux_;\n  const EnumValueDescriptor* a_;\n  const EnumValueDescriptor* b_;\n\n  const Descriptor* foo2_;\n  const Descriptor* baz2_;\n  const EnumDescriptor* qux2_;\n  const EnumDescriptor* quux2_;\n  const EnumValueDescriptor* a2_;\n  const EnumValueDescriptor* c2_;\n};\n\nTEST_F(NestedDescriptorTest, MessageName) {\n  EXPECT_EQ(\"Foo\", foo_ ->name());\n  EXPECT_EQ(\"Bar\", bar_ ->name());\n  EXPECT_EQ(\"Foo\", foo2_->name());\n  EXPECT_EQ(\"Baz\", baz2_->name());\n\n  EXPECT_EQ(\"TestMessage.Foo\", foo_->full_name());\n  EXPECT_EQ(\"TestMessage.Bar\", bar_->full_name());\n  EXPECT_EQ(\"corge.grault.TestMessage2.Foo\", foo2_->full_name());\n  EXPECT_EQ(\"corge.grault.TestMessage2.Baz\", baz2_->full_name());\n}\n\nTEST_F(NestedDescriptorTest, MessageContainingType) {\n  EXPECT_EQ(message_ , foo_ ->containing_type());\n  EXPECT_EQ(message_ , bar_ ->containing_type());\n  EXPECT_EQ(message2_, foo2_->containing_type());\n  EXPECT_EQ(message2_, baz2_->containing_type());\n}\n\nTEST_F(NestedDescriptorTest, NestedMessagesByIndex) {\n  ASSERT_EQ(2, message_->nested_type_count());\n  EXPECT_EQ(foo_, message_->nested_type(0));\n  EXPECT_EQ(bar_, message_->nested_type(1));\n}\n\nTEST_F(NestedDescriptorTest, FindFieldByNameDoesntFindNestedTypes) {\n  EXPECT_TRUE(message_->FindFieldByName(\"Foo\") == NULL);\n  EXPECT_TRUE(message_->FindFieldByName(\"Qux\") == NULL);\n  EXPECT_TRUE(message_->FindExtensionByName(\"Foo\") == NULL);\n  EXPECT_TRUE(message_->FindExtensionByName(\"Qux\") == NULL);\n}\n\nTEST_F(NestedDescriptorTest, FindNestedTypeByName) {\n  EXPECT_EQ(foo_ , message_ ->FindNestedTypeByName(\"Foo\"));\n  EXPECT_EQ(bar_ , message_ ->FindNestedTypeByName(\"Bar\"));\n  EXPECT_EQ(foo2_, message2_->FindNestedTypeByName(\"Foo\"));\n  EXPECT_EQ(baz2_, message2_->FindNestedTypeByName(\"Baz\"));\n\n  EXPECT_TRUE(message_ ->FindNestedTypeByName(\"NoSuchType\") == NULL);\n  EXPECT_TRUE(message_ ->FindNestedTypeByName(\"Baz\"       ) == NULL);\n  EXPECT_TRUE(message2_->FindNestedTypeByName(\"Bar\"       ) == NULL);\n\n  EXPECT_TRUE(message_->FindNestedTypeByName(\"Qux\") == NULL);\n}\n\nTEST_F(NestedDescriptorTest, EnumName) {\n  EXPECT_EQ(\"Baz\" , baz_ ->name());\n  EXPECT_EQ(\"Qux\" , qux_ ->name());\n  EXPECT_EQ(\"Qux\" , qux2_->name());\n  EXPECT_EQ(\"Quux\", quux2_->name());\n\n  EXPECT_EQ(\"TestMessage.Baz\", baz_->full_name());\n  EXPECT_EQ(\"TestMessage.Qux\", qux_->full_name());\n  EXPECT_EQ(\"corge.grault.TestMessage2.Qux\" , qux2_ ->full_name());\n  EXPECT_EQ(\"corge.grault.TestMessage2.Quux\", quux2_->full_name());\n}\n\nTEST_F(NestedDescriptorTest, EnumContainingType) {\n  EXPECT_EQ(message_ , baz_  ->containing_type());\n  EXPECT_EQ(message_ , qux_  ->containing_type());\n  EXPECT_EQ(message2_, qux2_ ->containing_type());\n  EXPECT_EQ(message2_, quux2_->containing_type());\n}\n\nTEST_F(NestedDescriptorTest, NestedEnumsByIndex) {\n  ASSERT_EQ(2, message_->nested_type_count());\n  EXPECT_EQ(foo_, message_->nested_type(0));\n  EXPECT_EQ(bar_, message_->nested_type(1));\n}\n\nTEST_F(NestedDescriptorTest, FindEnumTypeByName) {\n  EXPECT_EQ(baz_  , message_ ->FindEnumTypeByName(\"Baz\" ));\n  EXPECT_EQ(qux_  , message_ ->FindEnumTypeByName(\"Qux\" ));\n  EXPECT_EQ(qux2_ , message2_->FindEnumTypeByName(\"Qux\" ));\n  EXPECT_EQ(quux2_, message2_->FindEnumTypeByName(\"Quux\"));\n\n  EXPECT_TRUE(message_ ->FindEnumTypeByName(\"NoSuchType\") == NULL);\n  EXPECT_TRUE(message_ ->FindEnumTypeByName(\"Quux\"      ) == NULL);\n  EXPECT_TRUE(message2_->FindEnumTypeByName(\"Baz\"       ) == NULL);\n\n  EXPECT_TRUE(message_->FindEnumTypeByName(\"Foo\") == NULL);\n}\n\nTEST_F(NestedDescriptorTest, FindEnumValueByName) {\n  EXPECT_EQ(a_ , message_ ->FindEnumValueByName(\"A\"));\n  EXPECT_EQ(b_ , message_ ->FindEnumValueByName(\"B\"));\n  EXPECT_EQ(a2_, message2_->FindEnumValueByName(\"A\"));\n  EXPECT_EQ(c2_, message2_->FindEnumValueByName(\"C\"));\n\n  EXPECT_TRUE(message_ ->FindEnumValueByName(\"NO_SUCH_VALUE\") == NULL);\n  EXPECT_TRUE(message_ ->FindEnumValueByName(\"C\"            ) == NULL);\n  EXPECT_TRUE(message2_->FindEnumValueByName(\"B\"            ) == NULL);\n\n  EXPECT_TRUE(message_->FindEnumValueByName(\"Foo\") == NULL);\n}\n\n// ===================================================================\n\n// Test extensions.\nclass ExtensionDescriptorTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    // Build descriptors for the following definitions:\n    //\n    //   enum Baz {}\n    //   message Qux {}\n    //\n    //   message Foo {\n    //     extensions 10 to 19;\n    //     extensions 30 to 39;\n    //   }\n    //   extends Foo with optional int32 foo_int32 = 10;\n    //   extends Foo with repeated TestEnum foo_enum = 19;\n    //   message Bar {\n    //     extends Foo with optional Qux foo_message = 30;\n    //     // (using Qux as the group type)\n    //     extends Foo with repeated group foo_group = 39;\n    //   }\n\n    FileDescriptorProto foo_file;\n    foo_file.set_name(\"foo.proto\");\n\n    AddEmptyEnum(&foo_file, \"Baz\");\n    AddMessage(&foo_file, \"Qux\");\n\n    DescriptorProto* foo = AddMessage(&foo_file, \"Foo\");\n    AddExtensionRange(foo, 10, 20);\n    AddExtensionRange(foo, 30, 40);\n\n    AddExtension(&foo_file, \"Foo\", \"foo_int32\", 10,\n                 FieldDescriptorProto::LABEL_OPTIONAL,\n                 FieldDescriptorProto::TYPE_INT32);\n    AddExtension(&foo_file, \"Foo\", \"foo_enum\", 19,\n                 FieldDescriptorProto::LABEL_REPEATED,\n                 FieldDescriptorProto::TYPE_ENUM)\n      ->set_type_name(\"Baz\");\n\n    DescriptorProto* bar = AddMessage(&foo_file, \"Bar\");\n    AddNestedExtension(bar, \"Foo\", \"foo_message\", 30,\n                       FieldDescriptorProto::LABEL_OPTIONAL,\n                       FieldDescriptorProto::TYPE_MESSAGE)\n      ->set_type_name(\"Qux\");\n    AddNestedExtension(bar, \"Foo\", \"foo_group\", 39,\n                       FieldDescriptorProto::LABEL_REPEATED,\n                       FieldDescriptorProto::TYPE_GROUP)\n      ->set_type_name(\"Qux\");\n\n    // Build the descriptors and get the pointers.\n    foo_file_ = pool_.BuildFile(foo_file);\n    ASSERT_TRUE(foo_file_ != NULL);\n\n    ASSERT_EQ(1, foo_file_->enum_type_count());\n    baz_ = foo_file_->enum_type(0);\n\n    ASSERT_EQ(3, foo_file_->message_type_count());\n    qux_ = foo_file_->message_type(0);\n    foo_ = foo_file_->message_type(1);\n    bar_ = foo_file_->message_type(2);\n  }\n\n  DescriptorPool pool_;\n\n  const FileDescriptor* foo_file_;\n\n  const Descriptor* foo_;\n  const Descriptor* bar_;\n  const EnumDescriptor* baz_;\n  const Descriptor* qux_;\n};\n\nTEST_F(ExtensionDescriptorTest, ExtensionRanges) {\n  EXPECT_EQ(0, bar_->extension_range_count());\n  ASSERT_EQ(2, foo_->extension_range_count());\n\n  EXPECT_EQ(10, foo_->extension_range(0)->start);\n  EXPECT_EQ(30, foo_->extension_range(1)->start);\n\n  EXPECT_EQ(20, foo_->extension_range(0)->end);\n  EXPECT_EQ(40, foo_->extension_range(1)->end);\n};\n\nTEST_F(ExtensionDescriptorTest, Extensions) {\n  EXPECT_EQ(0, foo_->extension_count());\n  ASSERT_EQ(2, foo_file_->extension_count());\n  ASSERT_EQ(2, bar_->extension_count());\n\n  EXPECT_TRUE(foo_file_->extension(0)->is_extension());\n  EXPECT_TRUE(foo_file_->extension(1)->is_extension());\n  EXPECT_TRUE(bar_->extension(0)->is_extension());\n  EXPECT_TRUE(bar_->extension(1)->is_extension());\n\n  EXPECT_EQ(\"foo_int32\"  , foo_file_->extension(0)->name());\n  EXPECT_EQ(\"foo_enum\"   , foo_file_->extension(1)->name());\n  EXPECT_EQ(\"foo_message\", bar_->extension(0)->name());\n  EXPECT_EQ(\"foo_group\"  , bar_->extension(1)->name());\n\n  EXPECT_EQ(10, foo_file_->extension(0)->number());\n  EXPECT_EQ(19, foo_file_->extension(1)->number());\n  EXPECT_EQ(30, bar_->extension(0)->number());\n  EXPECT_EQ(39, bar_->extension(1)->number());\n\n  EXPECT_EQ(FieldDescriptor::TYPE_INT32  , foo_file_->extension(0)->type());\n  EXPECT_EQ(FieldDescriptor::TYPE_ENUM   , foo_file_->extension(1)->type());\n  EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, bar_->extension(0)->type());\n  EXPECT_EQ(FieldDescriptor::TYPE_GROUP  , bar_->extension(1)->type());\n\n  EXPECT_EQ(baz_, foo_file_->extension(1)->enum_type());\n  EXPECT_EQ(qux_, bar_->extension(0)->message_type());\n  EXPECT_EQ(qux_, bar_->extension(1)->message_type());\n\n  EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, foo_file_->extension(0)->label());\n  EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, foo_file_->extension(1)->label());\n  EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, bar_->extension(0)->label());\n  EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, bar_->extension(1)->label());\n\n  EXPECT_EQ(foo_, foo_file_->extension(0)->containing_type());\n  EXPECT_EQ(foo_, foo_file_->extension(1)->containing_type());\n  EXPECT_EQ(foo_, bar_->extension(0)->containing_type());\n  EXPECT_EQ(foo_, bar_->extension(1)->containing_type());\n\n  EXPECT_TRUE(foo_file_->extension(0)->extension_scope() == NULL);\n  EXPECT_TRUE(foo_file_->extension(1)->extension_scope() == NULL);\n  EXPECT_EQ(bar_, bar_->extension(0)->extension_scope());\n  EXPECT_EQ(bar_, bar_->extension(1)->extension_scope());\n};\n\nTEST_F(ExtensionDescriptorTest, IsExtensionNumber) {\n  EXPECT_FALSE(foo_->IsExtensionNumber( 9));\n  EXPECT_TRUE (foo_->IsExtensionNumber(10));\n  EXPECT_TRUE (foo_->IsExtensionNumber(19));\n  EXPECT_FALSE(foo_->IsExtensionNumber(20));\n  EXPECT_FALSE(foo_->IsExtensionNumber(29));\n  EXPECT_TRUE (foo_->IsExtensionNumber(30));\n  EXPECT_TRUE (foo_->IsExtensionNumber(39));\n  EXPECT_FALSE(foo_->IsExtensionNumber(40));\n}\n\nTEST_F(ExtensionDescriptorTest, FindExtensionByName) {\n  // Note that FileDescriptor::FindExtensionByName() is tested by\n  // FileDescriptorTest.\n  ASSERT_EQ(2, bar_->extension_count());\n\n  EXPECT_EQ(bar_->extension(0), bar_->FindExtensionByName(\"foo_message\"));\n  EXPECT_EQ(bar_->extension(1), bar_->FindExtensionByName(\"foo_group\"  ));\n\n  EXPECT_TRUE(bar_->FindExtensionByName(\"no_such_extension\") == NULL);\n  EXPECT_TRUE(foo_->FindExtensionByName(\"foo_int32\") == NULL);\n  EXPECT_TRUE(foo_->FindExtensionByName(\"foo_message\") == NULL);\n}\n\nTEST_F(ExtensionDescriptorTest, FindAllExtensions) {\n  vector<const FieldDescriptor*> extensions;\n  pool_.FindAllExtensions(foo_, &extensions);\n  ASSERT_EQ(4, extensions.size());\n  EXPECT_EQ(10, extensions[0]->number());\n  EXPECT_EQ(19, extensions[1]->number());\n  EXPECT_EQ(30, extensions[2]->number());\n  EXPECT_EQ(39, extensions[3]->number());\n}\n\n// ===================================================================\n\nclass MiscTest : public testing::Test {\n protected:\n  // Function which makes a field of the given type just to find out what its\n  // cpp_type is.\n  FieldDescriptor::CppType GetCppTypeForFieldType(FieldDescriptor::Type type) {\n    FileDescriptorProto file_proto;\n    file_proto.set_name(\"foo.proto\");\n    AddEmptyEnum(&file_proto, \"DummyEnum\");\n\n    DescriptorProto* message = AddMessage(&file_proto, \"TestMessage\");\n    FieldDescriptorProto* field =\n      AddField(message, \"foo\", 1, FieldDescriptorProto::LABEL_OPTIONAL,\n               static_cast<FieldDescriptorProto::Type>(static_cast<int>(type)));\n\n    if (type == FieldDescriptor::TYPE_MESSAGE ||\n        type == FieldDescriptor::TYPE_GROUP) {\n      field->set_type_name(\"TestMessage\");\n    } else if (type == FieldDescriptor::TYPE_ENUM) {\n      field->set_type_name(\"DummyEnum\");\n    }\n\n    // Build the descriptors and get the pointers.\n    DescriptorPool pool;\n    const FileDescriptor* file = pool.BuildFile(file_proto);\n\n    if (file != NULL &&\n        file->message_type_count() == 1 &&\n        file->message_type(0)->field_count() == 1) {\n      return file->message_type(0)->field(0)->cpp_type();\n    } else {\n      return static_cast<FieldDescriptor::CppType>(0);\n    }\n  }\n};\n\nTEST_F(MiscTest, CppTypes) {\n  // Test that CPP types are assigned correctly.\n\n  typedef FieldDescriptor FD;  // avoid ugly line wrapping\n\n  EXPECT_EQ(FD::CPPTYPE_DOUBLE , GetCppTypeForFieldType(FD::TYPE_DOUBLE  ));\n  EXPECT_EQ(FD::CPPTYPE_FLOAT  , GetCppTypeForFieldType(FD::TYPE_FLOAT   ));\n  EXPECT_EQ(FD::CPPTYPE_INT64  , GetCppTypeForFieldType(FD::TYPE_INT64   ));\n  EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_UINT64  ));\n  EXPECT_EQ(FD::CPPTYPE_INT32  , GetCppTypeForFieldType(FD::TYPE_INT32   ));\n  EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_FIXED64 ));\n  EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_FIXED32 ));\n  EXPECT_EQ(FD::CPPTYPE_BOOL   , GetCppTypeForFieldType(FD::TYPE_BOOL    ));\n  EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_STRING  ));\n  EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_GROUP   ));\n  EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_MESSAGE ));\n  EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_BYTES   ));\n  EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_UINT32  ));\n  EXPECT_EQ(FD::CPPTYPE_ENUM   , GetCppTypeForFieldType(FD::TYPE_ENUM    ));\n  EXPECT_EQ(FD::CPPTYPE_INT32  , GetCppTypeForFieldType(FD::TYPE_SFIXED32));\n  EXPECT_EQ(FD::CPPTYPE_INT64  , GetCppTypeForFieldType(FD::TYPE_SFIXED64));\n  EXPECT_EQ(FD::CPPTYPE_INT32  , GetCppTypeForFieldType(FD::TYPE_SINT32  ));\n  EXPECT_EQ(FD::CPPTYPE_INT64  , GetCppTypeForFieldType(FD::TYPE_SINT64  ));\n}\n\nTEST_F(MiscTest, DefaultValues) {\n  // Test that setting default values works.\n  FileDescriptorProto file_proto;\n  file_proto.set_name(\"foo.proto\");\n\n  EnumDescriptorProto* enum_type_proto = AddEnum(&file_proto, \"DummyEnum\");\n  AddEnumValue(enum_type_proto, \"A\", 1);\n  AddEnumValue(enum_type_proto, \"B\", 2);\n\n  DescriptorProto* message_proto = AddMessage(&file_proto, \"TestMessage\");\n\n  typedef FieldDescriptorProto FD;  // avoid ugly line wrapping\n  const FD::Label label = FD::LABEL_OPTIONAL;\n\n  // Create fields of every CPP type with default values.\n  AddField(message_proto, \"int32\" , 1, label, FD::TYPE_INT32 )\n    ->set_default_value(\"-1\");\n  AddField(message_proto, \"int64\" , 2, label, FD::TYPE_INT64 )\n    ->set_default_value(\"-1000000000000\");\n  AddField(message_proto, \"uint32\", 3, label, FD::TYPE_UINT32)\n    ->set_default_value(\"42\");\n  AddField(message_proto, \"uint64\", 4, label, FD::TYPE_UINT64)\n    ->set_default_value(\"2000000000000\");\n  AddField(message_proto, \"float\" , 5, label, FD::TYPE_FLOAT )\n    ->set_default_value(\"4.5\");\n  AddField(message_proto, \"double\", 6, label, FD::TYPE_DOUBLE)\n    ->set_default_value(\"10e100\");\n  AddField(message_proto, \"bool\"  , 7, label, FD::TYPE_BOOL  )\n    ->set_default_value(\"true\");\n  AddField(message_proto, \"string\", 8, label, FD::TYPE_STRING)\n    ->set_default_value(\"hello\");\n  AddField(message_proto, \"data\"  , 9, label, FD::TYPE_BYTES )\n    ->set_default_value(\"\\\\001\\\\002\\\\003\");\n\n  FieldDescriptorProto* enum_field =\n    AddField(message_proto, \"enum\", 10, label, FD::TYPE_ENUM);\n  enum_field->set_type_name(\"DummyEnum\");\n  enum_field->set_default_value(\"B\");\n\n  // Strings are allowed to have empty defaults.  (At one point, due to\n  // a bug, empty defaults for strings were rejected.  Oops.)\n  AddField(message_proto, \"empty_string\", 11, label, FD::TYPE_STRING)\n    ->set_default_value(\"\");\n\n  // Add a second set of fields with implicit defalut values.\n  AddField(message_proto, \"implicit_int32\" , 21, label, FD::TYPE_INT32 );\n  AddField(message_proto, \"implicit_int64\" , 22, label, FD::TYPE_INT64 );\n  AddField(message_proto, \"implicit_uint32\", 23, label, FD::TYPE_UINT32);\n  AddField(message_proto, \"implicit_uint64\", 24, label, FD::TYPE_UINT64);\n  AddField(message_proto, \"implicit_float\" , 25, label, FD::TYPE_FLOAT );\n  AddField(message_proto, \"implicit_double\", 26, label, FD::TYPE_DOUBLE);\n  AddField(message_proto, \"implicit_bool\"  , 27, label, FD::TYPE_BOOL  );\n  AddField(message_proto, \"implicit_string\", 28, label, FD::TYPE_STRING);\n  AddField(message_proto, \"implicit_data\"  , 29, label, FD::TYPE_BYTES );\n  AddField(message_proto, \"implicit_enum\"  , 30, label, FD::TYPE_ENUM)\n    ->set_type_name(\"DummyEnum\");\n\n  // Build it.\n  DescriptorPool pool;\n  const FileDescriptor* file = pool.BuildFile(file_proto);\n  ASSERT_TRUE(file != NULL);\n\n  ASSERT_EQ(1, file->enum_type_count());\n  const EnumDescriptor* enum_type = file->enum_type(0);\n  ASSERT_EQ(2, enum_type->value_count());\n  const EnumValueDescriptor* enum_value_a = enum_type->value(0);\n  const EnumValueDescriptor* enum_value_b = enum_type->value(1);\n\n  ASSERT_EQ(1, file->message_type_count());\n  const Descriptor* message = file->message_type(0);\n\n  ASSERT_EQ(21, message->field_count());\n\n  // Check the default values.\n  ASSERT_TRUE(message->field(0)->has_default_value());\n  ASSERT_TRUE(message->field(1)->has_default_value());\n  ASSERT_TRUE(message->field(2)->has_default_value());\n  ASSERT_TRUE(message->field(3)->has_default_value());\n  ASSERT_TRUE(message->field(4)->has_default_value());\n  ASSERT_TRUE(message->field(5)->has_default_value());\n  ASSERT_TRUE(message->field(6)->has_default_value());\n  ASSERT_TRUE(message->field(7)->has_default_value());\n  ASSERT_TRUE(message->field(8)->has_default_value());\n  ASSERT_TRUE(message->field(9)->has_default_value());\n  ASSERT_TRUE(message->field(10)->has_default_value());\n\n  EXPECT_EQ(-1              , message->field(0)->default_value_int32 ());\n  EXPECT_EQ(-GOOGLE_ULONGLONG(1000000000000),\n            message->field(1)->default_value_int64 ());\n  EXPECT_EQ(42              , message->field(2)->default_value_uint32());\n  EXPECT_EQ(GOOGLE_ULONGLONG(2000000000000),\n            message->field(3)->default_value_uint64());\n  EXPECT_EQ(4.5             , message->field(4)->default_value_float ());\n  EXPECT_EQ(10e100          , message->field(5)->default_value_double());\n  EXPECT_EQ(true            , message->field(6)->default_value_bool  ());\n  EXPECT_EQ(\"hello\"         , message->field(7)->default_value_string());\n  EXPECT_EQ(\"\\001\\002\\003\"  , message->field(8)->default_value_string());\n  EXPECT_EQ(enum_value_b    , message->field(9)->default_value_enum  ());\n  EXPECT_EQ(\"\"              , message->field(10)->default_value_string());\n\n  ASSERT_FALSE(message->field(11)->has_default_value());\n  ASSERT_FALSE(message->field(12)->has_default_value());\n  ASSERT_FALSE(message->field(13)->has_default_value());\n  ASSERT_FALSE(message->field(14)->has_default_value());\n  ASSERT_FALSE(message->field(15)->has_default_value());\n  ASSERT_FALSE(message->field(16)->has_default_value());\n  ASSERT_FALSE(message->field(17)->has_default_value());\n  ASSERT_FALSE(message->field(18)->has_default_value());\n  ASSERT_FALSE(message->field(19)->has_default_value());\n  ASSERT_FALSE(message->field(20)->has_default_value());\n\n  EXPECT_EQ(0    , message->field(11)->default_value_int32 ());\n  EXPECT_EQ(0    , message->field(12)->default_value_int64 ());\n  EXPECT_EQ(0    , message->field(13)->default_value_uint32());\n  EXPECT_EQ(0    , message->field(14)->default_value_uint64());\n  EXPECT_EQ(0.0f , message->field(15)->default_value_float ());\n  EXPECT_EQ(0.0  , message->field(16)->default_value_double());\n  EXPECT_EQ(false, message->field(17)->default_value_bool  ());\n  EXPECT_EQ(\"\"   , message->field(18)->default_value_string());\n  EXPECT_EQ(\"\"   , message->field(19)->default_value_string());\n  EXPECT_EQ(enum_value_a, message->field(20)->default_value_enum());\n}\n\nTEST_F(MiscTest, FieldOptions) {\n  // Try setting field options.\n\n  FileDescriptorProto file_proto;\n  file_proto.set_name(\"foo.proto\");\n\n  DescriptorProto* message_proto = AddMessage(&file_proto, \"TestMessage\");\n  AddField(message_proto, \"foo\", 1,\n           FieldDescriptorProto::LABEL_OPTIONAL,\n           FieldDescriptorProto::TYPE_INT32);\n  FieldDescriptorProto* bar_proto =\n    AddField(message_proto, \"bar\", 2,\n             FieldDescriptorProto::LABEL_OPTIONAL,\n             FieldDescriptorProto::TYPE_INT32);\n\n  FieldOptions* options = bar_proto->mutable_options();\n  options->set_ctype(FieldOptions::CORD);\n\n  // Build the descriptors and get the pointers.\n  DescriptorPool pool;\n  const FileDescriptor* file = pool.BuildFile(file_proto);\n  ASSERT_TRUE(file != NULL);\n\n  ASSERT_EQ(1, file->message_type_count());\n  const Descriptor* message = file->message_type(0);\n\n  ASSERT_EQ(2, message->field_count());\n  const FieldDescriptor* foo = message->field(0);\n  const FieldDescriptor* bar = message->field(1);\n\n  // \"foo\" had no options set, so it should return the default options.\n  EXPECT_EQ(&FieldOptions::default_instance(), &foo->options());\n\n  // \"bar\" had options set.\n  EXPECT_NE(&FieldOptions::default_instance(), options);\n  EXPECT_TRUE(bar->options().has_ctype());\n  EXPECT_EQ(FieldOptions::CORD, bar->options().ctype());\n}\n\n// ===================================================================\n\nclass AllowUnknownDependenciesTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    FileDescriptorProto foo_proto, bar_proto;\n\n    pool_.AllowUnknownDependencies();\n\n    ASSERT_TRUE(TextFormat::ParseFromString(\n      \"name: 'foo.proto'\"\n      \"dependency: 'bar.proto'\"\n      \"dependency: 'baz.proto'\"\n      \"message_type {\"\n      \"  name: 'Foo'\"\n      \"  field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'Bar' }\"\n      \"  field { name:'baz' number:2 label:LABEL_OPTIONAL type_name:'Baz' }\"\n      \"  field { name:'qux' number:3 label:LABEL_OPTIONAL\"\n      \"    type_name: '.corge.Qux'\"\n      \"    type: TYPE_ENUM\"\n      \"    options {\"\n      \"      uninterpreted_option {\"\n      \"        name {\"\n      \"          name_part: 'grault'\"\n      \"          is_extension: true\"\n      \"        }\"\n      \"        positive_int_value: 1234\"\n      \"      }\"\n      \"    }\"\n      \"  }\"\n      \"}\",\n      &foo_proto));\n    ASSERT_TRUE(TextFormat::ParseFromString(\n      \"name: 'bar.proto'\"\n      \"message_type { name: 'Bar' }\",\n      &bar_proto));\n\n    // Collect pointers to stuff.\n    bar_file_ = pool_.BuildFile(bar_proto);\n    ASSERT_TRUE(bar_file_ != NULL);\n\n    ASSERT_EQ(1, bar_file_->message_type_count());\n    bar_type_ = bar_file_->message_type(0);\n\n    foo_file_ = pool_.BuildFile(foo_proto);\n    ASSERT_TRUE(foo_file_ != NULL);\n\n    ASSERT_EQ(1, foo_file_->message_type_count());\n    foo_type_ = foo_file_->message_type(0);\n\n    ASSERT_EQ(3, foo_type_->field_count());\n    bar_field_ = foo_type_->field(0);\n    baz_field_ = foo_type_->field(1);\n    qux_field_ = foo_type_->field(2);\n  }\n\n  const FileDescriptor* bar_file_;\n  const Descriptor* bar_type_;\n  const FileDescriptor* foo_file_;\n  const Descriptor* foo_type_;\n  const FieldDescriptor* bar_field_;\n  const FieldDescriptor* baz_field_;\n  const FieldDescriptor* qux_field_;\n\n  DescriptorPool pool_;\n};\n\nTEST_F(AllowUnknownDependenciesTest, PlaceholderFile) {\n  ASSERT_EQ(2, foo_file_->dependency_count());\n  EXPECT_EQ(bar_file_, foo_file_->dependency(0));\n\n  const FileDescriptor* baz_file = foo_file_->dependency(1);\n  EXPECT_EQ(\"baz.proto\", baz_file->name());\n  EXPECT_EQ(0, baz_file->message_type_count());\n\n  // Placeholder files should not be findable.\n  EXPECT_EQ(bar_file_, pool_.FindFileByName(bar_file_->name()));\n  EXPECT_TRUE(pool_.FindFileByName(baz_file->name()) == NULL);\n}\n\nTEST_F(AllowUnknownDependenciesTest, PlaceholderTypes) {\n  ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, bar_field_->type());\n  EXPECT_EQ(bar_type_, bar_field_->message_type());\n\n  ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_field_->type());\n  const Descriptor* baz_type = baz_field_->message_type();\n  EXPECT_EQ(\"Baz\", baz_type->name());\n  EXPECT_EQ(\"Baz\", baz_type->full_name());\n  EXPECT_EQ(\"Baz.placeholder.proto\", baz_type->file()->name());\n  EXPECT_EQ(0, baz_type->extension_range_count());\n\n  ASSERT_EQ(FieldDescriptor::TYPE_ENUM, qux_field_->type());\n  const EnumDescriptor* qux_type = qux_field_->enum_type();\n  EXPECT_EQ(\"Qux\", qux_type->name());\n  EXPECT_EQ(\"corge.Qux\", qux_type->full_name());\n  EXPECT_EQ(\"corge.Qux.placeholder.proto\", qux_type->file()->name());\n\n  // Placeholder types should not be findable.\n  EXPECT_EQ(bar_type_, pool_.FindMessageTypeByName(bar_type_->full_name()));\n  EXPECT_TRUE(pool_.FindMessageTypeByName(baz_type->full_name()) == NULL);\n  EXPECT_TRUE(pool_.FindEnumTypeByName(qux_type->full_name()) == NULL);\n}\n\nTEST_F(AllowUnknownDependenciesTest, CopyTo) {\n  // FieldDescriptor::CopyTo() should write non-fully-qualified type names\n  // for placeholder types which were not originally fully-qualified.\n  FieldDescriptorProto proto;\n\n  // Bar is not a placeholder, so it is fully-qualified.\n  bar_field_->CopyTo(&proto);\n  EXPECT_EQ(\".Bar\", proto.type_name());\n  EXPECT_EQ(FieldDescriptorProto::TYPE_MESSAGE, proto.type());\n\n  // Baz is an unqualified placeholder.\n  proto.Clear();\n  baz_field_->CopyTo(&proto);\n  EXPECT_EQ(\"Baz\", proto.type_name());\n  EXPECT_FALSE(proto.has_type());\n\n  // Qux is a fully-qualified placeholder.\n  proto.Clear();\n  qux_field_->CopyTo(&proto);\n  EXPECT_EQ(\".corge.Qux\", proto.type_name());\n  EXPECT_EQ(FieldDescriptorProto::TYPE_ENUM, proto.type());\n}\n\nTEST_F(AllowUnknownDependenciesTest, CustomOptions) {\n  // Qux should still have the uninterpreted option attached.\n  ASSERT_EQ(1, qux_field_->options().uninterpreted_option_size());\n  const UninterpretedOption& option =\n    qux_field_->options().uninterpreted_option(0);\n  ASSERT_EQ(1, option.name_size());\n  EXPECT_EQ(\"grault\", option.name(0).name_part());\n}\n\nTEST_F(AllowUnknownDependenciesTest, UnknownExtendee) {\n  // Test that we can extend an unknown type.  This is slightly tricky because\n  // it means that the placeholder type must have an extension range.\n\n  FileDescriptorProto extension_proto;\n\n  ASSERT_TRUE(TextFormat::ParseFromString(\n    \"name: 'extension.proto'\"\n    \"extension { extendee: 'UnknownType' name:'some_extension' number:123\"\n    \"            label:LABEL_OPTIONAL type:TYPE_INT32 }\",\n    &extension_proto));\n  const FileDescriptor* file = pool_.BuildFile(extension_proto);\n\n  ASSERT_TRUE(file != NULL);\n\n  ASSERT_EQ(1, file->extension_count());\n  const Descriptor* extendee = file->extension(0)->containing_type();\n  EXPECT_EQ(\"UnknownType\", extendee->name());\n  ASSERT_EQ(1, extendee->extension_range_count());\n  EXPECT_EQ(1, extendee->extension_range(0)->start);\n  EXPECT_EQ(FieldDescriptor::kMaxNumber + 1, extendee->extension_range(0)->end);\n}\n\nTEST_F(AllowUnknownDependenciesTest, CustomOption) {\n  // Test that we can use a custom option without having parsed\n  // descriptor.proto.\n\n  FileDescriptorProto option_proto;\n\n  ASSERT_TRUE(TextFormat::ParseFromString(\n    \"name: \\\"unknown_custom_options.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { \"\n    \"  extendee: \\\"google.protobuf.FileOptions\\\" \"\n    \"  name: \\\"some_option\\\" \"\n    \"  number: 123456 \"\n    \"  label: LABEL_OPTIONAL \"\n    \"  type: TYPE_INT32 \"\n    \"} \"\n    \"options { \"\n    \"  uninterpreted_option { \"\n    \"    name { \"\n    \"      name_part: \\\"some_option\\\" \"\n    \"      is_extension: true \"\n    \"    } \"\n    \"    positive_int_value: 1234 \"\n    \"  } \"\n    \"  uninterpreted_option { \"\n    \"    name { \"\n    \"      name_part: \\\"unknown_option\\\" \"\n    \"      is_extension: true \"\n    \"    } \"\n    \"    positive_int_value: 1234 \"\n    \"  } \"\n    \"  uninterpreted_option { \"\n    \"    name { \"\n    \"      name_part: \\\"optimize_for\\\" \"\n    \"      is_extension: false \"\n    \"    } \"\n    \"    identifier_value: \\\"SPEED\\\" \"\n    \"  } \"\n    \"}\",\n    &option_proto));\n\n  const FileDescriptor* file = pool_.BuildFile(option_proto);\n  ASSERT_TRUE(file != NULL);\n\n  // Verify that no extension options were set, but they were left as\n  // uninterpreted_options.\n  vector<const FieldDescriptor*> fields;\n  file->options().GetReflection()->ListFields(file->options(), &fields);\n  ASSERT_EQ(2, fields.size());\n  EXPECT_TRUE(file->options().has_optimize_for());\n  EXPECT_EQ(2, file->options().uninterpreted_option_size());\n}\n\n// ===================================================================\n\nTEST(CustomOptions, OptionLocations) {\n  const Descriptor* message =\n      protobuf_unittest::TestMessageWithCustomOptions::descriptor();\n  const FileDescriptor* file = message->file();\n  const FieldDescriptor* field = message->FindFieldByName(\"field1\");\n  const EnumDescriptor* enm = message->FindEnumTypeByName(\"AnEnum\");\n  // TODO(benjy): Support EnumValue options, once the compiler does.\n  const ServiceDescriptor* service =\n      file->FindServiceByName(\"TestServiceWithCustomOptions\");\n  const MethodDescriptor* method = service->FindMethodByName(\"Foo\");\n\n  EXPECT_EQ(GOOGLE_LONGLONG(9876543210),\n            file->options().GetExtension(protobuf_unittest::file_opt1));\n  EXPECT_EQ(-56,\n            message->options().GetExtension(protobuf_unittest::message_opt1));\n  EXPECT_EQ(GOOGLE_LONGLONG(8765432109),\n            field->options().GetExtension(protobuf_unittest::field_opt1));\n  EXPECT_EQ(42,  // Check that we get the default for an option we don't set.\n            field->options().GetExtension(protobuf_unittest::field_opt2));\n  EXPECT_EQ(-789,\n            enm->options().GetExtension(protobuf_unittest::enum_opt1));\n  EXPECT_EQ(123,\n            enm->value(1)->options().GetExtension(\n              protobuf_unittest::enum_value_opt1));\n  EXPECT_EQ(GOOGLE_LONGLONG(-9876543210),\n            service->options().GetExtension(protobuf_unittest::service_opt1));\n  EXPECT_EQ(protobuf_unittest::METHODOPT1_VAL2,\n            method->options().GetExtension(protobuf_unittest::method_opt1));\n\n  // See that the regular options went through unscathed.\n  EXPECT_TRUE(message->options().has_message_set_wire_format());\n  EXPECT_EQ(FieldOptions::CORD, field->options().ctype());\n}\n\nTEST(CustomOptions, OptionTypes) {\n  const MessageOptions* options = NULL;\n\n  options =\n      &protobuf_unittest::CustomOptionMinIntegerValues::descriptor()->options();\n  EXPECT_EQ(false    , options->GetExtension(protobuf_unittest::bool_opt));\n  EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::int32_opt));\n  EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::int64_opt));\n  EXPECT_EQ(0        , options->GetExtension(protobuf_unittest::uint32_opt));\n  EXPECT_EQ(0        , options->GetExtension(protobuf_unittest::uint64_opt));\n  EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::sint32_opt));\n  EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::sint64_opt));\n  EXPECT_EQ(0        , options->GetExtension(protobuf_unittest::fixed32_opt));\n  EXPECT_EQ(0        , options->GetExtension(protobuf_unittest::fixed64_opt));\n  EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::sfixed32_opt));\n  EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::sfixed64_opt));\n\n  options =\n      &protobuf_unittest::CustomOptionMaxIntegerValues::descriptor()->options();\n  EXPECT_EQ(true      , options->GetExtension(protobuf_unittest::bool_opt));\n  EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::int32_opt));\n  EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::int64_opt));\n  EXPECT_EQ(kuint32max, options->GetExtension(protobuf_unittest::uint32_opt));\n  EXPECT_EQ(kuint64max, options->GetExtension(protobuf_unittest::uint64_opt));\n  EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::sint32_opt));\n  EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::sint64_opt));\n  EXPECT_EQ(kuint32max, options->GetExtension(protobuf_unittest::fixed32_opt));\n  EXPECT_EQ(kuint64max, options->GetExtension(protobuf_unittest::fixed64_opt));\n  EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::sfixed32_opt));\n  EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::sfixed64_opt));\n\n  options =\n      &protobuf_unittest::CustomOptionOtherValues::descriptor()->options();\n  EXPECT_EQ(-100, options->GetExtension(protobuf_unittest::int32_opt));\n  EXPECT_FLOAT_EQ(12.3456789,\n                  options->GetExtension(protobuf_unittest::float_opt));\n  EXPECT_DOUBLE_EQ(1.234567890123456789,\n                   options->GetExtension(protobuf_unittest::double_opt));\n  EXPECT_EQ(\"Hello, \\\"World\\\"\",\n            options->GetExtension(protobuf_unittest::string_opt));\n\n  EXPECT_EQ(string(\"Hello\\0World\", 11),\n            options->GetExtension(protobuf_unittest::bytes_opt));\n\n  EXPECT_EQ(protobuf_unittest::DummyMessageContainingEnum::TEST_OPTION_ENUM_TYPE2,\n            options->GetExtension(protobuf_unittest::enum_opt));\n\n  options =\n      &protobuf_unittest::SettingRealsFromPositiveInts::descriptor()->options();\n  EXPECT_FLOAT_EQ(12, options->GetExtension(protobuf_unittest::float_opt));\n  EXPECT_DOUBLE_EQ(154, options->GetExtension(protobuf_unittest::double_opt));\n\n  options =\n      &protobuf_unittest::SettingRealsFromNegativeInts::descriptor()->options();\n  EXPECT_FLOAT_EQ(-12, options->GetExtension(protobuf_unittest::float_opt));\n  EXPECT_DOUBLE_EQ(-154, options->GetExtension(protobuf_unittest::double_opt));\n}\n\nTEST(CustomOptions, ComplexExtensionOptions) {\n  const MessageOptions* options =\n      &protobuf_unittest::VariousComplexOptions::descriptor()->options();\n  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1).foo(), 42);\n  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1).\n            GetExtension(protobuf_unittest::quux), 324);\n  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1).\n            GetExtension(protobuf_unittest::corge).qux(), 876);\n  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).baz(), 987);\n  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).\n            GetExtension(protobuf_unittest::grault), 654);\n  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar().foo(),\n            743);\n  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar().\n            GetExtension(protobuf_unittest::quux), 1999);\n  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar().\n            GetExtension(protobuf_unittest::corge).qux(), 2008);\n  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).\n            GetExtension(protobuf_unittest::garply).foo(), 741);\n  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).\n            GetExtension(protobuf_unittest::garply).\n            GetExtension(protobuf_unittest::quux), 1998);\n  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).\n            GetExtension(protobuf_unittest::garply).\n            GetExtension(protobuf_unittest::corge).qux(), 2121);\n  EXPECT_EQ(options->GetExtension(\n      protobuf_unittest::ComplexOptionType2::ComplexOptionType4::complex_opt4).\n            waldo(), 1971);\n  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).\n            fred().waldo(), 321);\n  EXPECT_EQ(9, options->GetExtension(protobuf_unittest::complex_opt3).qux());\n  EXPECT_EQ(22, options->GetExtension(protobuf_unittest::complex_opt3).\n                complexoptiontype5().plugh());\n  EXPECT_EQ(24, options->GetExtension(protobuf_unittest::complexopt6).xyzzy());\n}\n\nTEST(CustomOptions, OptionsFromOtherFile) {\n  // Test that to use a custom option, we only need to import the file\n  // defining the option; we do not also have to import descriptor.proto.\n  DescriptorPool pool;\n\n  FileDescriptorProto file_proto;\n  FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto);\n  ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);\n\n  protobuf_unittest::TestMessageWithCustomOptions::descriptor()\n    ->file()->CopyTo(&file_proto);\n  ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);\n\n  ASSERT_TRUE(TextFormat::ParseFromString(\n    \"name: \\\"custom_options_import.proto\\\" \"\n    \"package: \\\"protobuf_unittest\\\" \"\n    \"dependency: \\\"google/protobuf/unittest_custom_options.proto\\\" \"\n    \"options { \"\n    \"  uninterpreted_option { \"\n    \"    name { \"\n    \"      name_part: \\\"file_opt1\\\" \"\n    \"      is_extension: true \"\n    \"    } \"\n    \"    positive_int_value: 1234 \"\n    \"  } \"\n    // Test a non-extension option too.  (At one point this failed due to a\n    // bug.)\n    \"  uninterpreted_option { \"\n    \"    name { \"\n    \"      name_part: \\\"java_package\\\" \"\n    \"      is_extension: false \"\n    \"    } \"\n    \"    string_value: \\\"foo\\\" \"\n    \"  } \"\n    // Test that enum-typed options still work too.  (At one point this also\n    // failed due to a bug.)\n    \"  uninterpreted_option { \"\n    \"    name { \"\n    \"      name_part: \\\"optimize_for\\\" \"\n    \"      is_extension: false \"\n    \"    } \"\n    \"    identifier_value: \\\"SPEED\\\" \"\n    \"  } \"\n    \"}\"\n    ,\n    &file_proto));\n\n  const FileDescriptor* file = pool.BuildFile(file_proto);\n  ASSERT_TRUE(file != NULL);\n  EXPECT_EQ(1234, file->options().GetExtension(protobuf_unittest::file_opt1));\n  EXPECT_TRUE(file->options().has_java_package());\n  EXPECT_EQ(\"foo\", file->options().java_package());\n  EXPECT_TRUE(file->options().has_optimize_for());\n  EXPECT_EQ(FileOptions::SPEED, file->options().optimize_for());\n}\n\nTEST(CustomOptions, MessageOptionThreeFieldsSet) {\n  // This tests a bug which previously existed in custom options parsing.  The\n  // bug occurred when you defined a custom option with message type and then\n  // set three fields of that option on a single definition (see the example\n  // below).  The bug is a bit hard to explain, so check the change history if\n  // you want to know more.\n  DescriptorPool pool;\n\n  FileDescriptorProto file_proto;\n  FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto);\n  ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);\n\n  protobuf_unittest::TestMessageWithCustomOptions::descriptor()\n    ->file()->CopyTo(&file_proto);\n  ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);\n\n  // The following represents the definition:\n  //\n  //   import \"google/protobuf/unittest_custom_options.proto\"\n  //   package protobuf_unittest;\n  //   message Foo {\n  //     option (complex_opt1).foo  = 1234;\n  //     option (complex_opt1).foo2 = 1234;\n  //     option (complex_opt1).foo3 = 1234;\n  //   }\n  ASSERT_TRUE(TextFormat::ParseFromString(\n    \"name: \\\"custom_options_import.proto\\\" \"\n    \"package: \\\"protobuf_unittest\\\" \"\n    \"dependency: \\\"google/protobuf/unittest_custom_options.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"Foo\\\" \"\n    \"  options { \"\n    \"    uninterpreted_option { \"\n    \"      name { \"\n    \"        name_part: \\\"complex_opt1\\\" \"\n    \"        is_extension: true \"\n    \"      } \"\n    \"      name { \"\n    \"        name_part: \\\"foo\\\" \"\n    \"        is_extension: false \"\n    \"      } \"\n    \"      positive_int_value: 1234 \"\n    \"    } \"\n    \"    uninterpreted_option { \"\n    \"      name { \"\n    \"        name_part: \\\"complex_opt1\\\" \"\n    \"        is_extension: true \"\n    \"      } \"\n    \"      name { \"\n    \"        name_part: \\\"foo2\\\" \"\n    \"        is_extension: false \"\n    \"      } \"\n    \"      positive_int_value: 1234 \"\n    \"    } \"\n    \"    uninterpreted_option { \"\n    \"      name { \"\n    \"        name_part: \\\"complex_opt1\\\" \"\n    \"        is_extension: true \"\n    \"      } \"\n    \"      name { \"\n    \"        name_part: \\\"foo3\\\" \"\n    \"        is_extension: false \"\n    \"      } \"\n    \"      positive_int_value: 1234 \"\n    \"    } \"\n    \"  } \"\n    \"}\",\n    &file_proto));\n\n  const FileDescriptor* file = pool.BuildFile(file_proto);\n  ASSERT_TRUE(file != NULL);\n  ASSERT_EQ(1, file->message_type_count());\n\n  const MessageOptions& options = file->message_type(0)->options();\n  EXPECT_EQ(1234, options.GetExtension(protobuf_unittest::complex_opt1).foo());\n}\n\n// Check that aggregate options were parsed and saved correctly in\n// the appropriate descriptors.\nTEST(CustomOptions, AggregateOptions) {\n  const Descriptor* msg = protobuf_unittest::AggregateMessage::descriptor();\n  const FileDescriptor* file = msg->file();\n  const FieldDescriptor* field = msg->FindFieldByName(\"fieldname\");\n  const EnumDescriptor* enumd = file->FindEnumTypeByName(\"AggregateEnum\");\n  const EnumValueDescriptor* enumv = enumd->FindValueByName(\"VALUE\");\n  const ServiceDescriptor* service = file->FindServiceByName(\n      \"AggregateService\");\n  const MethodDescriptor* method = service->FindMethodByName(\"Method\");\n\n  // Tests for the different types of data embedded in fileopt\n  const protobuf_unittest::Aggregate& file_options =\n      file->options().GetExtension(protobuf_unittest::fileopt);\n  EXPECT_EQ(100, file_options.i());\n  EXPECT_EQ(\"FileAnnotation\", file_options.s());\n  EXPECT_EQ(\"NestedFileAnnotation\", file_options.sub().s());\n  EXPECT_EQ(\"FileExtensionAnnotation\",\n            file_options.file().GetExtension(protobuf_unittest::fileopt).s());\n  EXPECT_EQ(\"EmbeddedMessageSetElement\",\n            file_options.mset().GetExtension(\n                protobuf_unittest::AggregateMessageSetElement\n                ::message_set_extension).s());\n\n  // Simple tests for all the other types of annotations\n  EXPECT_EQ(\"MessageAnnotation\",\n            msg->options().GetExtension(protobuf_unittest::msgopt).s());\n  EXPECT_EQ(\"FieldAnnotation\",\n            field->options().GetExtension(protobuf_unittest::fieldopt).s());\n  EXPECT_EQ(\"EnumAnnotation\",\n            enumd->options().GetExtension(protobuf_unittest::enumopt).s());\n  EXPECT_EQ(\"EnumValueAnnotation\",\n            enumv->options().GetExtension(protobuf_unittest::enumvalopt).s());\n  EXPECT_EQ(\"ServiceAnnotation\",\n            service->options().GetExtension(protobuf_unittest::serviceopt).s());\n  EXPECT_EQ(\"MethodAnnotation\",\n            method->options().GetExtension(protobuf_unittest::methodopt).s());\n}\n\n// ===================================================================\n\n// The tests below trigger every unique call to AddError() in descriptor.cc,\n// in the order in which they appear in that file.  I'm using TextFormat here\n// to specify the input descriptors because building them using code would\n// be too bulky.\n\nclass MockErrorCollector : public DescriptorPool::ErrorCollector {\n public:\n  MockErrorCollector() {}\n  ~MockErrorCollector() {}\n\n  string text_;\n\n  // implements ErrorCollector ---------------------------------------\n  void AddError(const string& filename,\n                const string& element_name, const Message* descriptor,\n                ErrorLocation location, const string& message) {\n    const char* location_name = NULL;\n    switch (location) {\n      case NAME         : location_name = \"NAME\"         ; break;\n      case NUMBER       : location_name = \"NUMBER\"       ; break;\n      case TYPE         : location_name = \"TYPE\"         ; break;\n      case EXTENDEE     : location_name = \"EXTENDEE\"     ; break;\n      case DEFAULT_VALUE: location_name = \"DEFAULT_VALUE\"; break;\n      case OPTION_NAME  : location_name = \"OPTION_NAME\"  ; break;\n      case OPTION_VALUE : location_name = \"OPTION_VALUE\" ; break;\n      case INPUT_TYPE   : location_name = \"INPUT_TYPE\"   ; break;\n      case OUTPUT_TYPE  : location_name = \"OUTPUT_TYPE\"  ; break;\n      case OTHER        : location_name = \"OTHER\"        ; break;\n    }\n\n    strings::SubstituteAndAppend(\n      &text_, \"$0: $1: $2: $3\\n\",\n      filename, element_name, location_name, message);\n  }\n};\n\nclass ValidationErrorTest : public testing::Test {\n protected:\n  // Parse file_text as a FileDescriptorProto in text format and add it\n  // to the DescriptorPool.  Expect no errors.\n  void BuildFile(const string& file_text) {\n    FileDescriptorProto file_proto;\n    ASSERT_TRUE(TextFormat::ParseFromString(file_text, &file_proto));\n    ASSERT_TRUE(pool_.BuildFile(file_proto) != NULL);\n  }\n\n  // Parse file_text as a FileDescriptorProto in text format and add it\n  // to the DescriptorPool.  Expect errors to be produced which match the\n  // given error text.\n  void BuildFileWithErrors(const string& file_text,\n                           const string& expected_errors) {\n    FileDescriptorProto file_proto;\n    ASSERT_TRUE(TextFormat::ParseFromString(file_text, &file_proto));\n\n    MockErrorCollector error_collector;\n    EXPECT_TRUE(\n      pool_.BuildFileCollectingErrors(file_proto, &error_collector) == NULL);\n    EXPECT_EQ(expected_errors, error_collector.text_);\n  }\n\n  // Builds some already-parsed file in our test pool.\n  void BuildFileInTestPool(const FileDescriptor* file) {\n    FileDescriptorProto file_proto;\n    file->CopyTo(&file_proto);\n    ASSERT_TRUE(pool_.BuildFile(file_proto) != NULL);\n  }\n\n  // Build descriptor.proto in our test pool. This allows us to extend it in\n  // the test pool, so we can test custom options.\n  void BuildDescriptorMessagesInTestPool() {\n    BuildFileInTestPool(DescriptorProto::descriptor()->file());\n  }\n\n  DescriptorPool pool_;\n};\n\nTEST_F(ValidationErrorTest, AlreadyDefined) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { name: \\\"Foo\\\" }\"\n    \"message_type { name: \\\"Foo\\\" }\",\n\n    \"foo.proto: Foo: NAME: \\\"Foo\\\" is already defined.\\n\");\n}\n\nTEST_F(ValidationErrorTest, AlreadyDefinedInPackage) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"package: \\\"foo.bar\\\" \"\n    \"message_type { name: \\\"Foo\\\" }\"\n    \"message_type { name: \\\"Foo\\\" }\",\n\n    \"foo.proto: foo.bar.Foo: NAME: \\\"Foo\\\" is already defined in \"\n      \"\\\"foo.bar\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, AlreadyDefinedInOtherFile) {\n  BuildFile(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { name: \\\"Foo\\\" }\");\n\n  BuildFileWithErrors(\n    \"name: \\\"bar.proto\\\" \"\n    \"message_type { name: \\\"Foo\\\" }\",\n\n    \"bar.proto: Foo: NAME: \\\"Foo\\\" is already defined in file \"\n      \"\\\"foo.proto\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, PackageAlreadyDefined) {\n  BuildFile(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { name: \\\"foo\\\" }\");\n  BuildFileWithErrors(\n    \"name: \\\"bar.proto\\\" \"\n    \"package: \\\"foo.bar\\\"\",\n\n    \"bar.proto: foo: NAME: \\\"foo\\\" is already defined (as something other \"\n      \"than a package) in file \\\"foo.proto\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, EnumValueAlreadyDefinedInParent) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"enum_type { name: \\\"Foo\\\" value { name: \\\"FOO\\\" number: 1 } } \"\n    \"enum_type { name: \\\"Bar\\\" value { name: \\\"FOO\\\" number: 1 } } \",\n\n    \"foo.proto: FOO: NAME: \\\"FOO\\\" is already defined.\\n\"\n    \"foo.proto: FOO: NAME: Note that enum values use C++ scoping rules, \"\n      \"meaning that enum values are siblings of their type, not children of \"\n      \"it.  Therefore, \\\"FOO\\\" must be unique within the global scope, not \"\n      \"just within \\\"Bar\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, EnumValueAlreadyDefinedInParentNonGlobal) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"package: \\\"pkg\\\" \"\n    \"enum_type { name: \\\"Foo\\\" value { name: \\\"FOO\\\" number: 1 } } \"\n    \"enum_type { name: \\\"Bar\\\" value { name: \\\"FOO\\\" number: 1 } } \",\n\n    \"foo.proto: pkg.FOO: NAME: \\\"FOO\\\" is already defined in \\\"pkg\\\".\\n\"\n    \"foo.proto: pkg.FOO: NAME: Note that enum values use C++ scoping rules, \"\n      \"meaning that enum values are siblings of their type, not children of \"\n      \"it.  Therefore, \\\"FOO\\\" must be unique within \\\"pkg\\\", not just within \"\n      \"\\\"Bar\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, MissingName) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { }\",\n\n    \"foo.proto: : NAME: Missing name.\\n\");\n}\n\nTEST_F(ValidationErrorTest, InvalidName) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { name: \\\"$\\\" }\",\n\n    \"foo.proto: $: NAME: \\\"$\\\" is not a valid identifier.\\n\");\n}\n\nTEST_F(ValidationErrorTest, InvalidPackageName) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"package: \\\"foo.$\\\"\",\n\n    \"foo.proto: foo.$: NAME: \\\"$\\\" is not a valid identifier.\\n\");\n}\n\nTEST_F(ValidationErrorTest, MissingFileName) {\n  BuildFileWithErrors(\n    \"\",\n\n    \": : OTHER: Missing field: FileDescriptorProto.name.\\n\");\n}\n\nTEST_F(ValidationErrorTest, DupeDependency) {\n  BuildFile(\"name: \\\"foo.proto\\\"\");\n  BuildFileWithErrors(\n    \"name: \\\"bar.proto\\\" \"\n    \"dependency: \\\"foo.proto\\\" \"\n    \"dependency: \\\"foo.proto\\\" \",\n\n    \"bar.proto: bar.proto: OTHER: Import \\\"foo.proto\\\" was listed twice.\\n\");\n}\n\nTEST_F(ValidationErrorTest, UnknownDependency) {\n  BuildFileWithErrors(\n    \"name: \\\"bar.proto\\\" \"\n    \"dependency: \\\"foo.proto\\\" \",\n\n    \"bar.proto: bar.proto: OTHER: Import \\\"foo.proto\\\" has not been loaded.\\n\");\n}\n\nTEST_F(ValidationErrorTest, ForeignUnimportedPackageNoCrash) {\n  // Used to crash:  If we depend on a non-existent file and then refer to a\n  // package defined in a file that we didn't import, and that package is\n  // nested within a parent package which this file is also in, and we don't\n  // include that parent package in the name (i.e. we do a relative lookup)...\n  // Yes, really.\n  BuildFile(\n    \"name: 'foo.proto' \"\n    \"package: 'outer.foo' \");\n  BuildFileWithErrors(\n    \"name: 'bar.proto' \"\n    \"dependency: 'baz.proto' \"\n    \"package: 'outer.bar' \"\n    \"message_type { \"\n    \"  name: 'Bar' \"\n    \"  field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'foo.Foo' }\"\n    \"}\",\n\n    \"bar.proto: bar.proto: OTHER: Import \\\"baz.proto\\\" has not been loaded.\\n\"\n    \"bar.proto: outer.bar.Bar.bar: TYPE: \\\"outer.foo\\\" seems to be defined in \"\n      \"\\\"foo.proto\\\", which is not imported by \\\"bar.proto\\\".  To use it here, \"\n      \"please add the necessary import.\\n\");\n}\n\nTEST_F(ValidationErrorTest, DupeFile) {\n  BuildFile(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { name: \\\"Foo\\\" }\");\n  // Note:  We should *not* get redundant errors about \"Foo\" already being\n  //   defined.\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { name: \\\"Foo\\\" } \"\n    // Add another type so that the files aren't identical (in which case there\n    // would be no error).\n    \"enum_type { name: \\\"Bar\\\" }\",\n\n    \"foo.proto: foo.proto: OTHER: A file with this name is already in the \"\n      \"pool.\\n\");\n}\n\nTEST_F(ValidationErrorTest, FieldInExtensionRange) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name: \\\"foo\\\" number:  9 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"  field { name: \\\"bar\\\" number: 10 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"  field { name: \\\"baz\\\" number: 19 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"  field { name: \\\"qux\\\" number: 20 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"  extension_range { start: 10 end: 20 }\"\n    \"}\",\n\n    \"foo.proto: Foo.bar: NUMBER: Extension range 10 to 19 includes field \"\n      \"\\\"bar\\\" (10).\\n\"\n    \"foo.proto: Foo.baz: NUMBER: Extension range 10 to 19 includes field \"\n      \"\\\"baz\\\" (19).\\n\");\n}\n\nTEST_F(ValidationErrorTest, OverlappingExtensionRanges) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  extension_range { start: 10 end: 20 }\"\n    \"  extension_range { start: 20 end: 30 }\"\n    \"  extension_range { start: 19 end: 21 }\"\n    \"}\",\n\n    \"foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with \"\n      \"already-defined range 10 to 19.\\n\"\n    \"foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with \"\n      \"already-defined range 20 to 29.\\n\");\n}\n\nTEST_F(ValidationErrorTest, InvalidDefaults) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n\n    // Invalid number.\n    \"  field { name: \\\"foo\\\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32\"\n    \"          default_value: \\\"abc\\\" }\"\n\n    // Empty default value.\n    \"  field { name: \\\"bar\\\" number: 2 label: LABEL_OPTIONAL type: TYPE_INT32\"\n    \"          default_value: \\\"\\\" }\"\n\n    // Invalid boolean.\n    \"  field { name: \\\"baz\\\" number: 3 label: LABEL_OPTIONAL type: TYPE_BOOL\"\n    \"          default_value: \\\"abc\\\" }\"\n\n    // Messages can't have defaults.\n    \"  field { name: \\\"qux\\\" number: 4 label: LABEL_OPTIONAL type: TYPE_MESSAGE\"\n    \"          default_value: \\\"abc\\\" type_name: \\\"Foo\\\" }\"\n\n    // Same thing, but we don't know that this field has message type until\n    // we look up the type name.\n    \"  field { name: \\\"quux\\\" number: 5 label: LABEL_OPTIONAL\"\n    \"          default_value: \\\"abc\\\" type_name: \\\"Foo\\\" }\"\n\n    // Repeateds can't have defaults.\n    \"  field { name: \\\"corge\\\" number: 6 label: LABEL_REPEATED type: TYPE_INT32\"\n    \"          default_value: \\\"1\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: DEFAULT_VALUE: Couldn't parse default value.\\n\"\n    \"foo.proto: Foo.bar: DEFAULT_VALUE: Couldn't parse default value.\\n\"\n    \"foo.proto: Foo.baz: DEFAULT_VALUE: Boolean default must be true or \"\n      \"false.\\n\"\n    \"foo.proto: Foo.qux: DEFAULT_VALUE: Messages can't have default values.\\n\"\n    \"foo.proto: Foo.corge: DEFAULT_VALUE: Repeated fields can't have default \"\n      \"values.\\n\"\n    // This ends up being reported later because the error is detected at\n    // cross-linking time.\n    \"foo.proto: Foo.quux: DEFAULT_VALUE: Messages can't have default \"\n      \"values.\\n\");\n}\n\nTEST_F(ValidationErrorTest, NegativeFieldNumber) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name: \\\"foo\\\" number: -1 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: NUMBER: Field numbers must be positive integers.\\n\");\n}\n\nTEST_F(ValidationErrorTest, HugeFieldNumber) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name: \\\"foo\\\" number: 0x70000000 \"\n    \"          label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: NUMBER: Field numbers cannot be greater than \"\n      \"536870911.\\n\");\n}\n\nTEST_F(ValidationErrorTest, ReservedFieldNumber) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field {name:\\\"foo\\\" number: 18999 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"  field {name:\\\"bar\\\" number: 19000 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"  field {name:\\\"baz\\\" number: 19999 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"  field {name:\\\"qux\\\" number: 20000 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"}\",\n\n    \"foo.proto: Foo.bar: NUMBER: Field numbers 19000 through 19999 are \"\n      \"reserved for the protocol buffer library implementation.\\n\"\n    \"foo.proto: Foo.baz: NUMBER: Field numbers 19000 through 19999 are \"\n      \"reserved for the protocol buffer library implementation.\\n\");\n}\n\nTEST_F(ValidationErrorTest, ExtensionMissingExtendee) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  extension { name: \\\"foo\\\" number: 1 label: LABEL_OPTIONAL\"\n    \"              type_name: \\\"Foo\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee not set for \"\n      \"extension field.\\n\");\n}\n\nTEST_F(ValidationErrorTest, NonExtensionWithExtendee) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Bar\\\"\"\n    \"  extension_range { start: 1 end: 2 }\"\n    \"}\"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name: \\\"foo\\\" number: 1 label: LABEL_OPTIONAL\"\n    \"          type_name: \\\"Foo\\\" extendee: \\\"Bar\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee set for \"\n      \"non-extension field.\\n\");\n}\n\nTEST_F(ValidationErrorTest, FieldNumberConflict) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name: \\\"foo\\\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"  field { name: \\\"bar\\\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"}\",\n\n    \"foo.proto: Foo.bar: NUMBER: Field number 1 has already been used in \"\n      \"\\\"Foo\\\" by field \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, BadMessageSetExtensionType) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"MessageSet\\\"\"\n    \"  options { message_set_wire_format: true }\"\n    \"  extension_range { start: 4 end: 5 }\"\n    \"}\"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  extension { name:\\\"foo\\\" number:4 label:LABEL_OPTIONAL type:TYPE_INT32\"\n    \"              extendee: \\\"MessageSet\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional \"\n      \"messages.\\n\");\n}\n\nTEST_F(ValidationErrorTest, BadMessageSetExtensionLabel) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"MessageSet\\\"\"\n    \"  options { message_set_wire_format: true }\"\n    \"  extension_range { start: 4 end: 5 }\"\n    \"}\"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  extension { name:\\\"foo\\\" number:4 label:LABEL_REPEATED type:TYPE_MESSAGE\"\n    \"              type_name: \\\"Foo\\\" extendee: \\\"MessageSet\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional \"\n      \"messages.\\n\");\n}\n\nTEST_F(ValidationErrorTest, FieldInMessageSet) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  options { message_set_wire_format: true }\"\n    \"  field { name: \\\"foo\\\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: NAME: MessageSets cannot have fields, only \"\n      \"extensions.\\n\");\n}\n\nTEST_F(ValidationErrorTest, NegativeExtensionRangeNumber) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  extension_range { start: -10 end: -1 }\"\n    \"}\",\n\n    \"foo.proto: Foo: NUMBER: Extension numbers must be positive integers.\\n\");\n}\n\nTEST_F(ValidationErrorTest, HugeExtensionRangeNumber) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  extension_range { start: 1 end: 0x70000000 }\"\n    \"}\",\n\n    \"foo.proto: Foo: NUMBER: Extension numbers cannot be greater than \"\n      \"536870911.\\n\");\n}\n\nTEST_F(ValidationErrorTest, ExtensionRangeEndBeforeStart) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  extension_range { start: 10 end: 10 }\"\n    \"  extension_range { start: 10 end: 5 }\"\n    \"}\",\n\n    \"foo.proto: Foo: NUMBER: Extension range end number must be greater than \"\n      \"start number.\\n\"\n    \"foo.proto: Foo: NUMBER: Extension range end number must be greater than \"\n      \"start number.\\n\");\n}\n\nTEST_F(ValidationErrorTest, EmptyEnum) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"enum_type { name: \\\"Foo\\\" }\"\n    // Also use the empty enum in a message to make sure there are no crashes\n    // during validation (possible if the code attempts to derive a default\n    // value for the field).\n    \"message_type {\"\n    \"  name: \\\"Bar\\\"\"\n    \"  field { name: \\\"foo\\\" number: 1 label:LABEL_OPTIONAL type_name:\\\"Foo\\\" }\"\n    \"  field { name: \\\"bar\\\" number: 2 label:LABEL_OPTIONAL type_name:\\\"Foo\\\" \"\n    \"          default_value: \\\"NO_SUCH_VALUE\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo: NAME: Enums must contain at least one value.\\n\"\n    \"foo.proto: Bar.bar: DEFAULT_VALUE: Enum type \\\"Foo\\\" has no value named \"\n      \"\\\"NO_SUCH_VALUE\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, UndefinedExtendee) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  extension { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32\"\n    \"              extendee: \\\"Bar\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: EXTENDEE: \\\"Bar\\\" is not defined.\\n\");\n}\n\nTEST_F(ValidationErrorTest, NonMessageExtendee) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"enum_type { name: \\\"Bar\\\" value { name:\\\"DUMMY\\\" number:0 } }\"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  extension { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32\"\n    \"              extendee: \\\"Bar\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: EXTENDEE: \\\"Bar\\\" is not a message type.\\n\");\n}\n\nTEST_F(ValidationErrorTest, NotAnExtensionNumber) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Bar\\\"\"\n    \"}\"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  extension { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32\"\n    \"              extendee: \\\"Bar\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: NUMBER: \\\"Bar\\\" does not declare 1 as an extension \"\n      \"number.\\n\");\n}\n\nTEST_F(ValidationErrorTest, UndefinedFieldType) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type_name:\\\"Bar\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: TYPE: \\\"Bar\\\" is not defined.\\n\");\n}\n\nTEST_F(ValidationErrorTest, FieldTypeDefinedInUndeclaredDependency) {\n  BuildFile(\n    \"name: \\\"bar.proto\\\" \"\n    \"message_type { name: \\\"Bar\\\" } \");\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type_name:\\\"Bar\\\" }\"\n    \"}\",\n    \"foo.proto: Foo.foo: TYPE: \\\"Bar\\\" seems to be defined in \\\"bar.proto\\\", \"\n      \"which is not imported by \\\"foo.proto\\\".  To use it here, please add the \"\n      \"necessary import.\\n\");\n}\n\nTEST_F(ValidationErrorTest, SearchMostLocalFirst) {\n  // The following should produce an error that Bar.Baz is not defined:\n  //   message Bar { message Baz {} }\n  //   message Foo {\n  //     message Bar {\n  //       // Placing \"message Baz{}\" here, or removing Foo.Bar altogether,\n  //       // would fix the error.\n  //     }\n  //     optional Bar.Baz baz = 1;\n  //   }\n  // An one point the lookup code incorrectly did not produce an error in this\n  // case, because when looking for Bar.Baz, it would try \"Foo.Bar.Baz\" first,\n  // fail, and ten try \"Bar.Baz\" and succeed, even though \"Bar\" should actually\n  // refer to the inner Bar, not the outer one.\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Bar\\\"\"\n    \"  nested_type { name: \\\"Baz\\\" }\"\n    \"}\"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  nested_type { name: \\\"Bar\\\" }\"\n    \"  field { name:\\\"baz\\\" number:1 label:LABEL_OPTIONAL\"\n    \"          type_name:\\\"Bar.Baz\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.baz: TYPE: \\\"Bar.Baz\\\" is not defined.\\n\");\n}\n\nTEST_F(ValidationErrorTest, SearchMostLocalFirst2) {\n  // This test would find the most local \"Bar\" first, and does, but\n  // proceeds to find the outer one because the inner one's not an\n  // aggregate.\n  BuildFile(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Bar\\\"\"\n    \"  nested_type { name: \\\"Baz\\\" }\"\n    \"}\"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name: \\\"Bar\\\" number:1 type:TYPE_BYTES } \"\n    \"  field { name:\\\"baz\\\" number:2 label:LABEL_OPTIONAL\"\n    \"          type_name:\\\"Bar.Baz\\\" }\"\n    \"}\");\n}\n\nTEST_F(ValidationErrorTest, PackageOriginallyDeclaredInTransitiveDependent) {\n  // Imagine we have the following:\n  //\n  // foo.proto:\n  //   package foo.bar;\n  // bar.proto:\n  //   package foo.bar;\n  //   import \"foo.proto\";\n  //   message Bar {}\n  // baz.proto:\n  //   package foo;\n  //   import \"bar.proto\"\n  //   message Baz { optional bar.Bar qux = 1; }\n  //\n  // When validating baz.proto, we will look up \"bar.Bar\".  As part of this\n  // lookup, we first lookup \"bar\" then try to find \"Bar\" within it.  \"bar\"\n  // should resolve to \"foo.bar\".  Note, though, that \"foo.bar\" was originally\n  // defined in foo.proto, which is not a direct dependency of baz.proto.  The\n  // implementation of FindSymbol() normally only returns symbols in direct\n  // dependencies, not indirect ones.  This test insures that this does not\n  // prevent it from finding \"foo.bar\".\n\n  BuildFile(\n    \"name: \\\"foo.proto\\\" \"\n    \"package: \\\"foo.bar\\\" \");\n  BuildFile(\n    \"name: \\\"bar.proto\\\" \"\n    \"package: \\\"foo.bar\\\" \"\n    \"dependency: \\\"foo.proto\\\" \"\n    \"message_type { name: \\\"Bar\\\" }\");\n  BuildFile(\n    \"name: \\\"baz.proto\\\" \"\n    \"package: \\\"foo\\\" \"\n    \"dependency: \\\"bar.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"Baz\\\" \"\n    \"  field { name:\\\"qux\\\" number:1 label:LABEL_OPTIONAL \"\n    \"          type_name:\\\"bar.Bar\\\" }\"\n    \"}\");\n}\n\nTEST_F(ValidationErrorTest, FieldTypeNotAType) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL \"\n    \"          type_name:\\\".Foo.bar\\\" }\"\n    \"  field { name:\\\"bar\\\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: TYPE: \\\".Foo.bar\\\" is not a type.\\n\");\n}\n\nTEST_F(ValidationErrorTest, RelativeFieldTypeNotAType) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  nested_type {\"\n    \"    name: \\\"Bar\\\"\"\n    \"    field { name:\\\"Baz\\\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }\"\n    \"  }\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL \"\n    \"          type_name:\\\"Bar.Baz\\\" }\"\n    \"}\",\n    \"foo.proto: Foo.foo: TYPE: \\\"Bar.Baz\\\" is not a type.\\n\");\n}\n\nTEST_F(ValidationErrorTest, FieldTypeMayBeItsName) {\n  BuildFile(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Bar\\\"\"\n    \"}\"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name:\\\"Bar\\\" number:1 label:LABEL_OPTIONAL type_name:\\\"Bar\\\" }\"\n    \"}\");\n}\n\nTEST_F(ValidationErrorTest, EnumFieldTypeIsMessage) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { name: \\\"Bar\\\" } \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type:TYPE_ENUM\"\n    \"          type_name:\\\"Bar\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: TYPE: \\\"Bar\\\" is not an enum type.\\n\");\n}\n\nTEST_F(ValidationErrorTest, MessageFieldTypeIsEnum) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"enum_type { name: \\\"Bar\\\" value { name:\\\"DUMMY\\\" number:0 } } \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE\"\n    \"          type_name:\\\"Bar\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: TYPE: \\\"Bar\\\" is not a message type.\\n\");\n}\n\nTEST_F(ValidationErrorTest, BadEnumDefaultValue) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"enum_type { name: \\\"Bar\\\" value { name:\\\"DUMMY\\\" number:0 } } \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type_name:\\\"Bar\\\"\"\n    \"          default_value:\\\"NO_SUCH_VALUE\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: DEFAULT_VALUE: Enum type \\\"Bar\\\" has no value named \"\n      \"\\\"NO_SUCH_VALUE\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, PrimitiveWithTypeName) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32\"\n    \"          type_name:\\\"Foo\\\" }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: TYPE: Field with primitive type has type_name.\\n\");\n}\n\nTEST_F(ValidationErrorTest, NonPrimitiveWithoutTypeName) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE }\"\n    \"}\",\n\n    \"foo.proto: Foo.foo: TYPE: Field with message or enum type missing \"\n      \"type_name.\\n\");\n}\n\nTEST_F(ValidationErrorTest, InputTypeNotDefined) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { name: \\\"Foo\\\" } \"\n    \"service {\"\n    \"  name: \\\"TestService\\\"\"\n    \"  method { name: \\\"A\\\" input_type: \\\"Bar\\\" output_type: \\\"Foo\\\" }\"\n    \"}\",\n\n    \"foo.proto: TestService.A: INPUT_TYPE: \\\"Bar\\\" is not defined.\\n\");\n}\n\nTEST_F(ValidationErrorTest, InputTypeNotAMessage) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { name: \\\"Foo\\\" } \"\n    \"enum_type { name: \\\"Bar\\\" value { name:\\\"DUMMY\\\" number:0 } } \"\n    \"service {\"\n    \"  name: \\\"TestService\\\"\"\n    \"  method { name: \\\"A\\\" input_type: \\\"Bar\\\" output_type: \\\"Foo\\\" }\"\n    \"}\",\n\n    \"foo.proto: TestService.A: INPUT_TYPE: \\\"Bar\\\" is not a message type.\\n\");\n}\n\nTEST_F(ValidationErrorTest, OutputTypeNotDefined) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { name: \\\"Foo\\\" } \"\n    \"service {\"\n    \"  name: \\\"TestService\\\"\"\n    \"  method { name: \\\"A\\\" input_type: \\\"Foo\\\" output_type: \\\"Bar\\\" }\"\n    \"}\",\n\n    \"foo.proto: TestService.A: OUTPUT_TYPE: \\\"Bar\\\" is not defined.\\n\");\n}\n\nTEST_F(ValidationErrorTest, OutputTypeNotAMessage) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { name: \\\"Foo\\\" } \"\n    \"enum_type { name: \\\"Bar\\\" value { name:\\\"DUMMY\\\" number:0 } } \"\n    \"service {\"\n    \"  name: \\\"TestService\\\"\"\n    \"  method { name: \\\"A\\\" input_type: \\\"Foo\\\" output_type: \\\"Bar\\\" }\"\n    \"}\",\n\n    \"foo.proto: TestService.A: OUTPUT_TYPE: \\\"Bar\\\" is not a message type.\\n\");\n}\n\nTEST_F(ValidationErrorTest, IllegalPackedField) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\\n\"\n    \"  name: \\\"Foo\\\"\"\n    \"  field { name:\\\"packed_string\\\" number:1 label:LABEL_REPEATED \"\n    \"          type:TYPE_STRING \"\n    \"          options { uninterpreted_option {\"\n    \"            name { name_part: \\\"packed\\\" is_extension: false }\"\n    \"            identifier_value: \\\"true\\\" }}}\\n\"\n    \"  field { name:\\\"packed_message\\\" number:3 label:LABEL_REPEATED \"\n    \"          type_name: \\\"Foo\\\"\"\n    \"          options { uninterpreted_option {\"\n    \"            name { name_part: \\\"packed\\\" is_extension: false }\"\n    \"            identifier_value: \\\"true\\\" }}}\\n\"\n    \"  field { name:\\\"optional_int32\\\" number: 4 label: LABEL_OPTIONAL \"\n    \"          type:TYPE_INT32 \"\n    \"          options { uninterpreted_option {\"\n    \"            name { name_part: \\\"packed\\\" is_extension: false }\"\n    \"            identifier_value: \\\"true\\\" }}}\\n\"\n    \"}\",\n\n    \"foo.proto: Foo.packed_string: TYPE: [packed = true] can only be \"\n        \"specified for repeated primitive fields.\\n\"\n    \"foo.proto: Foo.packed_message: TYPE: [packed = true] can only be \"\n        \"specified for repeated primitive fields.\\n\"\n    \"foo.proto: Foo.optional_int32: TYPE: [packed = true] can only be \"\n        \"specified for repeated primitive fields.\\n\"\n        );\n}\n\nTEST_F(ValidationErrorTest, OptionWrongType) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"TestMessage\\\" \"\n    \"  field { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING \"\n    \"          options { uninterpreted_option { name { name_part: \\\"ctype\\\" \"\n    \"                                                  is_extension: false }\"\n    \"                                           positive_int_value: 1 }\"\n    \"          }\"\n    \"  }\"\n    \"}\\n\",\n\n    \"foo.proto: TestMessage.foo: OPTION_VALUE: Value must be identifier for \"\n    \"enum-valued option \\\"google.protobuf.FieldOptions.ctype\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, OptionExtendsAtomicType) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"TestMessage\\\" \"\n    \"  field { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING \"\n    \"          options { uninterpreted_option { name { name_part: \\\"ctype\\\" \"\n    \"                                                  is_extension: false }\"\n    \"                                           name { name_part: \\\"foo\\\" \"\n    \"                                                  is_extension: true }\"\n    \"                                           positive_int_value: 1 }\"\n    \"          }\"\n    \"  }\"\n    \"}\\n\",\n\n    \"foo.proto: TestMessage.foo: OPTION_NAME: Option \\\"ctype\\\" is an \"\n    \"atomic type, not a message.\\n\");\n}\n\nTEST_F(ValidationErrorTest, DupOption) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"TestMessage\\\" \"\n    \"  field { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type:TYPE_UINT32 \"\n    \"          options { uninterpreted_option { name { name_part: \\\"ctype\\\" \"\n    \"                                                  is_extension: false }\"\n    \"                                           identifier_value: \\\"CORD\\\" }\"\n    \"                    uninterpreted_option { name { name_part: \\\"ctype\\\" \"\n    \"                                                  is_extension: false }\"\n    \"                                           identifier_value: \\\"CORD\\\" }\"\n    \"          }\"\n    \"  }\"\n    \"}\\n\",\n\n    \"foo.proto: TestMessage.foo: OPTION_NAME: Option \\\"ctype\\\" was \"\n    \"already set.\\n\");\n}\n\nTEST_F(ValidationErrorTest, InvalidOptionName) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { \"\n    \"  name: \\\"TestMessage\\\" \"\n    \"  field { name:\\\"foo\\\" number:1 label:LABEL_OPTIONAL type:TYPE_BOOL \"\n    \"          options { uninterpreted_option { \"\n    \"                      name { name_part: \\\"uninterpreted_option\\\" \"\n    \"                             is_extension: false }\"\n    \"                      positive_int_value: 1 \"\n    \"                    }\"\n    \"          }\"\n    \"  }\"\n    \"}\\n\",\n\n    \"foo.proto: TestMessage.foo: OPTION_NAME: Option must not use \"\n    \"reserved name \\\"uninterpreted_option\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, RepeatedOption) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_REPEATED \"\n    \"            type: TYPE_FLOAT extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 double_value: 1.2 } }\",\n\n    \"foo.proto: foo.proto: OPTION_NAME: Option field \\\"(foo)\\\" is repeated. \"\n    \"Repeated options are not supported.\\n\");\n}\n\nTEST_F(ValidationErrorTest, CustomOptionConflictingFieldNumber) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo1\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_INT32 extendee: \\\"google.protobuf.FieldOptions\\\" }\"\n    \"extension { name: \\\"foo2\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_INT32 extendee: \\\"google.protobuf.FieldOptions\\\" }\",\n\n    \"foo.proto: foo2: NUMBER: Extension number 7672757 has already been used \"\n    \"in \\\"google.protobuf.FieldOptions\\\" by extension \\\"foo1\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, Int32OptionValueOutOfPositiveRange) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_INT32 extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 positive_int_value: 0x80000000 } \"\n    \"}\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Value out of range \"\n    \"for int32 option \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, Int32OptionValueOutOfNegativeRange) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_INT32 extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 negative_int_value: -0x80000001 } \"\n    \"}\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Value out of range \"\n    \"for int32 option \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, Int32OptionValueIsNotPositiveInt) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_INT32 extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 string_value: \\\"5\\\" } }\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Value must be integer \"\n    \"for int32 option \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, Int64OptionValueOutOfRange) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_INT64 extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 positive_int_value: 0x8000000000000000 } \"\n    \"}\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Value out of range \"\n    \"for int64 option \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, Int64OptionValueIsNotPositiveInt) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_INT64 extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 identifier_value: \\\"5\\\" } }\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Value must be integer \"\n    \"for int64 option \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, UInt32OptionValueOutOfRange) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_UINT32 extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 positive_int_value: 0x100000000 } }\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Value out of range \"\n    \"for uint32 option \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, UInt32OptionValueIsNotPositiveInt) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_UINT32 extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 double_value: -5.6 } }\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer \"\n    \"for uint32 option \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, UInt64OptionValueIsNotPositiveInt) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_UINT64 extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 negative_int_value: -5 } }\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer \"\n    \"for uint64 option \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, FloatOptionValueIsNotNumber) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_FLOAT extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 string_value: \\\"bar\\\" } }\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Value must be number \"\n    \"for float option \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, DoubleOptionValueIsNotNumber) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_DOUBLE extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 string_value: \\\"bar\\\" } }\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Value must be number \"\n    \"for double option \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, BoolOptionValueIsNotTrueOrFalse) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_BOOL extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 identifier_value: \\\"bar\\\" } }\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Value must be \\\"true\\\" or \\\"false\\\" \"\n    \"for boolean option \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, EnumOptionValueIsNotIdentifier) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"enum_type { name: \\\"FooEnum\\\" value { name: \\\"BAR\\\" number: 1 } \"\n    \"                              value { name: \\\"BAZ\\\" number: 2 } }\"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_ENUM type_name: \\\"FooEnum\\\" \"\n    \"            extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 string_value: \\\"QUUX\\\" } }\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Value must be identifier for \"\n    \"enum-valued option \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, EnumOptionValueIsNotEnumValueName) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"enum_type { name: \\\"FooEnum\\\" value { name: \\\"BAR\\\" number: 1 } \"\n    \"                              value { name: \\\"BAZ\\\" number: 2 } }\"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_ENUM type_name: \\\"FooEnum\\\" \"\n    \"            extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 identifier_value: \\\"QUUX\\\" } }\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Enum type \\\"FooEnum\\\" has no value \"\n    \"named \\\"QUUX\\\" for option \\\"foo\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, EnumOptionValueIsSiblingEnumValueName) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"enum_type { name: \\\"FooEnum1\\\" value { name: \\\"BAR\\\" number: 1 } \"\n    \"                               value { name: \\\"BAZ\\\" number: 2 } }\"\n    \"enum_type { name: \\\"FooEnum2\\\" value { name: \\\"QUX\\\" number: 1 } \"\n    \"                               value { name: \\\"QUUX\\\" number: 2 } }\"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_ENUM type_name: \\\"FooEnum1\\\" \"\n    \"            extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 identifier_value: \\\"QUUX\\\" } }\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Enum type \\\"FooEnum1\\\" has no value \"\n    \"named \\\"QUUX\\\" for option \\\"foo\\\". This appears to be a value from a \"\n    \"sibling type.\\n\");\n}\n\nTEST_F(ValidationErrorTest, StringOptionValueIsNotString) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n    \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_STRING extendee: \\\"google.protobuf.FileOptions\\\" }\"\n    \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n    \"                                        is_extension: true } \"\n    \"                                 identifier_value: \\\"QUUX\\\" } }\",\n\n    \"foo.proto: foo.proto: OPTION_VALUE: Value must be quoted string for \"\n    \"string option \\\"foo\\\".\\n\");\n}\n\n// Helper function for tests that check for aggregate value parsing\n// errors.  The \"value\" argument is embedded inside the\n// \"uninterpreted_option\" portion of the result.\nstatic string EmbedAggregateValue(const char* value) {\n  return strings::Substitute(\n      \"name: \\\"foo.proto\\\" \"\n      \"dependency: \\\"google/protobuf/descriptor.proto\\\" \"\n      \"message_type { name: \\\"Foo\\\" } \"\n      \"extension { name: \\\"foo\\\" number: 7672757 label: LABEL_OPTIONAL \"\n      \"            type: TYPE_MESSAGE type_name: \\\"Foo\\\" \"\n      \"            extendee: \\\"google.protobuf.FileOptions\\\" }\"\n      \"options { uninterpreted_option { name { name_part: \\\"foo\\\" \"\n      \"                                        is_extension: true } \"\n      \"                                 $0 } }\",\n      value);\n}\n\nTEST_F(ValidationErrorTest, AggregateValueNotFound) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n      EmbedAggregateValue(\"string_value: \\\"\\\"\"),\n      \"foo.proto: foo.proto: OPTION_VALUE: Option \\\"foo\\\" is a message. \"\n      \"To set the entire message, use syntax like \"\n      \"\\\"foo = { <proto text format> }\\\". To set fields within it, use \"\n      \"syntax like \\\"foo.foo = value\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, AggregateValueParseError) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n      EmbedAggregateValue(\"aggregate_value: \\\"1+2\\\"\"),\n      \"foo.proto: foo.proto: OPTION_VALUE: Error while parsing option \"\n      \"value for \\\"foo\\\": Expected identifier.\\n\");\n}\n\nTEST_F(ValidationErrorTest, AggregateValueUnknownFields) {\n  BuildDescriptorMessagesInTestPool();\n\n  BuildFileWithErrors(\n      EmbedAggregateValue(\"aggregate_value: \\\"x:100\\\"\"),\n      \"foo.proto: foo.proto: OPTION_VALUE: Error while parsing option \"\n      \"value for \\\"foo\\\": Message type \\\"Foo\\\" has no field named \\\"x\\\".\\n\");\n}\n\nTEST_F(ValidationErrorTest, NotLiteImportsLite) {\n  BuildFile(\n    \"name: \\\"bar.proto\\\" \"\n    \"options { optimize_for: LITE_RUNTIME } \");\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"bar.proto\\\" \",\n\n    \"foo.proto: foo.proto: OTHER: Files that do not use optimize_for = \"\n      \"LITE_RUNTIME cannot import files which do use this option.  This file \"\n      \"is not lite, but it imports \\\"bar.proto\\\" which is.\\n\");\n}\n\nTEST_F(ValidationErrorTest, LiteExtendsNotLite) {\n  BuildFile(\n    \"name: \\\"bar.proto\\\" \"\n    \"message_type: {\"\n    \"  name: \\\"Bar\\\"\"\n    \"  extension_range { start: 1 end: 1000 }\"\n    \"}\");\n\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"dependency: \\\"bar.proto\\\" \"\n    \"options { optimize_for: LITE_RUNTIME } \"\n    \"extension { name: \\\"ext\\\" number: 123 label: LABEL_OPTIONAL \"\n    \"            type: TYPE_INT32 extendee: \\\"Bar\\\" }\",\n\n    \"foo.proto: ext: EXTENDEE: Extensions to non-lite types can only be \"\n      \"declared in non-lite files.  Note that you cannot extend a non-lite \"\n      \"type to contain a lite type, but the reverse is allowed.\\n\");\n}\n\nTEST_F(ValidationErrorTest, NoLiteServices) {\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"options {\"\n    \"  optimize_for: LITE_RUNTIME\"\n    \"  cc_generic_services: true\"\n    \"  java_generic_services: true\"\n    \"} \"\n    \"service { name: \\\"Foo\\\" }\",\n\n    \"foo.proto: Foo: NAME: Files with optimize_for = LITE_RUNTIME cannot \"\n    \"define services unless you set both options cc_generic_services and \"\n    \"java_generic_sevices to false.\\n\");\n\n  BuildFile(\n    \"name: \\\"bar.proto\\\" \"\n    \"options {\"\n    \"  optimize_for: LITE_RUNTIME\"\n    \"  cc_generic_services: false\"\n    \"  java_generic_services: false\"\n    \"} \"\n    \"service { name: \\\"Bar\\\" }\");\n}\n\nTEST_F(ValidationErrorTest, RollbackAfterError) {\n  // Build a file which contains every kind of construct but references an\n  // undefined type.  All these constructs will be added to the symbol table\n  // before the undefined type error is noticed.  The DescriptorPool will then\n  // have to roll everything back.\n  BuildFileWithErrors(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  field { name:\\\"foo\\\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }\"\n    \"} \"\n    \"enum_type {\"\n    \"  name: \\\"TestEnum\\\"\"\n    \"  value { name:\\\"BAR\\\" number:1 }\"\n    \"} \"\n    \"service {\"\n    \"  name: \\\"TestService\\\"\"\n    \"  method {\"\n    \"    name: \\\"Baz\\\"\"\n    \"    input_type: \\\"NoSuchType\\\"\"    // error\n    \"    output_type: \\\"TestMessage\\\"\"\n    \"  }\"\n    \"}\",\n\n    \"foo.proto: TestService.Baz: INPUT_TYPE: \\\"NoSuchType\\\" is not defined.\\n\");\n\n  // Make sure that if we build the same file again with the error fixed,\n  // it works.  If the above rollback was incomplete, then some symbols will\n  // be left defined, and this second attempt will fail since it tries to\n  // re-define the same symbols.\n  BuildFile(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type {\"\n    \"  name: \\\"TestMessage\\\"\"\n    \"  field { name:\\\"foo\\\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }\"\n    \"} \"\n    \"enum_type {\"\n    \"  name: \\\"TestEnum\\\"\"\n    \"  value { name:\\\"BAR\\\" number:1 }\"\n    \"} \"\n    \"service {\"\n    \"  name: \\\"TestService\\\"\"\n    \"  method { name:\\\"Baz\\\"\"\n    \"           input_type:\\\"TestMessage\\\"\"\n    \"           output_type:\\\"TestMessage\\\" }\"\n    \"}\");\n}\n\nTEST_F(ValidationErrorTest, ErrorsReportedToLogError) {\n  // Test that errors are reported to GOOGLE_LOG(ERROR) if no error collector is\n  // provided.\n\n  FileDescriptorProto file_proto;\n  ASSERT_TRUE(TextFormat::ParseFromString(\n    \"name: \\\"foo.proto\\\" \"\n    \"message_type { name: \\\"Foo\\\" } \"\n    \"message_type { name: \\\"Foo\\\" } \",\n    &file_proto));\n\n  vector<string> errors;\n\n  {\n    ScopedMemoryLog log;\n    EXPECT_TRUE(pool_.BuildFile(file_proto) == NULL);\n    errors = log.GetMessages(ERROR);\n  }\n\n  ASSERT_EQ(2, errors.size());\n\n  EXPECT_EQ(\"Invalid proto descriptor for file \\\"foo.proto\\\":\", errors[0]);\n  EXPECT_EQ(\"  Foo: \\\"Foo\\\" is already defined.\", errors[1]);\n}\n\n// ===================================================================\n// DescriptorDatabase\n\nstatic void AddToDatabase(SimpleDescriptorDatabase* database,\n                          const char* file_text) {\n  FileDescriptorProto file_proto;\n  EXPECT_TRUE(TextFormat::ParseFromString(file_text, &file_proto));\n  database->Add(file_proto);\n}\n\nclass DatabaseBackedPoolTest : public testing::Test {\n protected:\n  DatabaseBackedPoolTest() {}\n\n  SimpleDescriptorDatabase database_;\n\n  virtual void SetUp() {\n    AddToDatabase(&database_,\n      \"name: \\\"foo.proto\\\" \"\n      \"message_type { name:\\\"Foo\\\" extension_range { start: 1 end: 100 } } \"\n      \"enum_type { name:\\\"TestEnum\\\" value { name:\\\"DUMMY\\\" number:0 } } \"\n      \"service { name:\\\"TestService\\\" } \");\n    AddToDatabase(&database_,\n      \"name: \\\"bar.proto\\\" \"\n      \"dependency: \\\"foo.proto\\\" \"\n      \"message_type { name:\\\"Bar\\\" } \"\n      \"extension { name:\\\"foo_ext\\\" extendee: \\\".Foo\\\" number:5 \"\n      \"            label:LABEL_OPTIONAL type:TYPE_INT32 } \");\n  }\n\n  // We can't inject a file containing errors into a DescriptorPool, so we\n  // need an actual mock DescriptorDatabase to test errors.\n  class ErrorDescriptorDatabase : public DescriptorDatabase {\n   public:\n    ErrorDescriptorDatabase() {}\n    ~ErrorDescriptorDatabase() {}\n\n    // implements DescriptorDatabase ---------------------------------\n    bool FindFileByName(const string& filename,\n                        FileDescriptorProto* output) {\n      // error.proto and error2.proto cyclically import each other.\n      if (filename == \"error.proto\") {\n        output->Clear();\n        output->set_name(\"error.proto\");\n        output->add_dependency(\"error2.proto\");\n        return true;\n      } else if (filename == \"error2.proto\") {\n        output->Clear();\n        output->set_name(\"error2.proto\");\n        output->add_dependency(\"error.proto\");\n        return true;\n      } else {\n        return false;\n      }\n    }\n    bool FindFileContainingSymbol(const string& symbol_name,\n                                  FileDescriptorProto* output) {\n      return false;\n    }\n    bool FindFileContainingExtension(const string& containing_type,\n                                     int field_number,\n                                     FileDescriptorProto* output) {\n      return false;\n    }\n  };\n\n  // A DescriptorDatabase that counts how many times each method has been\n  // called and forwards to some other DescriptorDatabase.\n  class CallCountingDatabase : public DescriptorDatabase {\n   public:\n    CallCountingDatabase(DescriptorDatabase* wrapped_db)\n      : wrapped_db_(wrapped_db) {\n      Clear();\n    }\n    ~CallCountingDatabase() {}\n\n    DescriptorDatabase* wrapped_db_;\n\n    int call_count_;\n\n    void Clear() {\n      call_count_ = 0;\n    }\n\n    // implements DescriptorDatabase ---------------------------------\n    bool FindFileByName(const string& filename,\n                        FileDescriptorProto* output) {\n      ++call_count_;\n      return wrapped_db_->FindFileByName(filename, output);\n    }\n    bool FindFileContainingSymbol(const string& symbol_name,\n                                  FileDescriptorProto* output) {\n      ++call_count_;\n      return wrapped_db_->FindFileContainingSymbol(symbol_name, output);\n    }\n    bool FindFileContainingExtension(const string& containing_type,\n                                     int field_number,\n                                     FileDescriptorProto* output) {\n      ++call_count_;\n      return wrapped_db_->FindFileContainingExtension(\n        containing_type, field_number, output);\n    }\n  };\n\n  // A DescriptorDatabase which falsely always returns foo.proto when searching\n  // for any symbol or extension number.  This shouldn't cause the\n  // DescriptorPool to reload foo.proto if it is already loaded.\n  class FalsePositiveDatabase : public DescriptorDatabase {\n   public:\n    FalsePositiveDatabase(DescriptorDatabase* wrapped_db)\n      : wrapped_db_(wrapped_db) {}\n    ~FalsePositiveDatabase() {}\n\n    DescriptorDatabase* wrapped_db_;\n\n    // implements DescriptorDatabase ---------------------------------\n    bool FindFileByName(const string& filename,\n                        FileDescriptorProto* output) {\n      return wrapped_db_->FindFileByName(filename, output);\n    }\n    bool FindFileContainingSymbol(const string& symbol_name,\n                                  FileDescriptorProto* output) {\n      return FindFileByName(\"foo.proto\", output);\n    }\n    bool FindFileContainingExtension(const string& containing_type,\n                                     int field_number,\n                                     FileDescriptorProto* output) {\n      return FindFileByName(\"foo.proto\", output);\n    }\n  };\n};\n\nTEST_F(DatabaseBackedPoolTest, FindFileByName) {\n  DescriptorPool pool(&database_);\n\n  const FileDescriptor* foo = pool.FindFileByName(\"foo.proto\");\n  ASSERT_TRUE(foo != NULL);\n  EXPECT_EQ(\"foo.proto\", foo->name());\n  ASSERT_EQ(1, foo->message_type_count());\n  EXPECT_EQ(\"Foo\", foo->message_type(0)->name());\n\n  EXPECT_EQ(foo, pool.FindFileByName(\"foo.proto\"));\n\n  EXPECT_TRUE(pool.FindFileByName(\"no_such_file.proto\") == NULL);\n}\n\nTEST_F(DatabaseBackedPoolTest, FindDependencyBeforeDependent) {\n  DescriptorPool pool(&database_);\n\n  const FileDescriptor* foo = pool.FindFileByName(\"foo.proto\");\n  ASSERT_TRUE(foo != NULL);\n  EXPECT_EQ(\"foo.proto\", foo->name());\n  ASSERT_EQ(1, foo->message_type_count());\n  EXPECT_EQ(\"Foo\", foo->message_type(0)->name());\n\n  const FileDescriptor* bar = pool.FindFileByName(\"bar.proto\");\n  ASSERT_TRUE(bar != NULL);\n  EXPECT_EQ(\"bar.proto\", bar->name());\n  ASSERT_EQ(1, bar->message_type_count());\n  EXPECT_EQ(\"Bar\", bar->message_type(0)->name());\n\n  ASSERT_EQ(1, bar->dependency_count());\n  EXPECT_EQ(foo, bar->dependency(0));\n}\n\nTEST_F(DatabaseBackedPoolTest, FindDependentBeforeDependency) {\n  DescriptorPool pool(&database_);\n\n  const FileDescriptor* bar = pool.FindFileByName(\"bar.proto\");\n  ASSERT_TRUE(bar != NULL);\n  EXPECT_EQ(\"bar.proto\", bar->name());\n  ASSERT_EQ(1, bar->message_type_count());\n  ASSERT_EQ(\"Bar\", bar->message_type(0)->name());\n\n  const FileDescriptor* foo = pool.FindFileByName(\"foo.proto\");\n  ASSERT_TRUE(foo != NULL);\n  EXPECT_EQ(\"foo.proto\", foo->name());\n  ASSERT_EQ(1, foo->message_type_count());\n  ASSERT_EQ(\"Foo\", foo->message_type(0)->name());\n\n  ASSERT_EQ(1, bar->dependency_count());\n  EXPECT_EQ(foo, bar->dependency(0));\n}\n\nTEST_F(DatabaseBackedPoolTest, FindFileContainingSymbol) {\n  DescriptorPool pool(&database_);\n\n  const FileDescriptor* file = pool.FindFileContainingSymbol(\"Foo\");\n  ASSERT_TRUE(file != NULL);\n  EXPECT_EQ(\"foo.proto\", file->name());\n  EXPECT_EQ(file, pool.FindFileByName(\"foo.proto\"));\n\n  EXPECT_TRUE(pool.FindFileContainingSymbol(\"NoSuchSymbol\") == NULL);\n}\n\nTEST_F(DatabaseBackedPoolTest, FindMessageTypeByName) {\n  DescriptorPool pool(&database_);\n\n  const Descriptor* type = pool.FindMessageTypeByName(\"Foo\");\n  ASSERT_TRUE(type != NULL);\n  EXPECT_EQ(\"Foo\", type->name());\n  EXPECT_EQ(type->file(), pool.FindFileByName(\"foo.proto\"));\n\n  EXPECT_TRUE(pool.FindMessageTypeByName(\"NoSuchType\") == NULL);\n}\n\nTEST_F(DatabaseBackedPoolTest, FindExtensionByNumber) {\n  DescriptorPool pool(&database_);\n\n  const Descriptor* foo = pool.FindMessageTypeByName(\"Foo\");\n  ASSERT_TRUE(foo != NULL);\n\n  const FieldDescriptor* extension = pool.FindExtensionByNumber(foo, 5);\n  ASSERT_TRUE(extension != NULL);\n  EXPECT_EQ(\"foo_ext\", extension->name());\n  EXPECT_EQ(extension->file(), pool.FindFileByName(\"bar.proto\"));\n\n  EXPECT_TRUE(pool.FindExtensionByNumber(foo, 12) == NULL);\n}\n\nTEST_F(DatabaseBackedPoolTest, FindAllExtensions) {\n  DescriptorPool pool(&database_);\n\n  const Descriptor* foo = pool.FindMessageTypeByName(\"Foo\");\n\n  for (int i = 0; i < 2; ++i) {\n    // Repeat the lookup twice, to check that we get consistent\n    // results despite the fallback database lookup mutating the pool.\n    vector<const FieldDescriptor*> extensions;\n    pool.FindAllExtensions(foo, &extensions);\n    ASSERT_EQ(1, extensions.size());\n    EXPECT_EQ(5, extensions[0]->number());\n  }\n}\n\nTEST_F(DatabaseBackedPoolTest, ErrorWithoutErrorCollector) {\n  ErrorDescriptorDatabase error_database;\n  DescriptorPool pool(&error_database);\n\n  vector<string> errors;\n\n  {\n    ScopedMemoryLog log;\n    EXPECT_TRUE(pool.FindFileByName(\"error.proto\") == NULL);\n    errors = log.GetMessages(ERROR);\n  }\n\n  EXPECT_FALSE(errors.empty());\n}\n\nTEST_F(DatabaseBackedPoolTest, ErrorWithErrorCollector) {\n  ErrorDescriptorDatabase error_database;\n  MockErrorCollector error_collector;\n  DescriptorPool pool(&error_database, &error_collector);\n\n  EXPECT_TRUE(pool.FindFileByName(\"error.proto\") == NULL);\n  EXPECT_EQ(\n    \"error.proto: error.proto: OTHER: File recursively imports itself: \"\n      \"error.proto -> error2.proto -> error.proto\\n\"\n    \"error2.proto: error2.proto: OTHER: Import \\\"error.proto\\\" was not \"\n      \"found or had errors.\\n\"\n    \"error.proto: error.proto: OTHER: Import \\\"error2.proto\\\" was not \"\n      \"found or had errors.\\n\",\n    error_collector.text_);\n}\n\nTEST_F(DatabaseBackedPoolTest, UnittestProto) {\n  // Try to load all of unittest.proto from a DescriptorDatabase.  This should\n  // thoroughly test all paths through DescriptorBuilder to insure that there\n  // are no deadlocking problems when pool_->mutex_ is non-NULL.\n  const FileDescriptor* original_file =\n    protobuf_unittest::TestAllTypes::descriptor()->file();\n\n  DescriptorPoolDatabase database(*DescriptorPool::generated_pool());\n  DescriptorPool pool(&database);\n  const FileDescriptor* file_from_database =\n    pool.FindFileByName(original_file->name());\n\n  ASSERT_TRUE(file_from_database != NULL);\n\n  FileDescriptorProto original_file_proto;\n  original_file->CopyTo(&original_file_proto);\n\n  FileDescriptorProto file_from_database_proto;\n  file_from_database->CopyTo(&file_from_database_proto);\n\n  EXPECT_EQ(original_file_proto.DebugString(),\n            file_from_database_proto.DebugString());\n}\n\nTEST_F(DatabaseBackedPoolTest, DoesntRetryDbUnnecessarily) {\n  // Searching for a child of an existing descriptor should never fall back\n  // to the DescriptorDatabase even if it isn't found, because we know all\n  // children are already loaded.\n  CallCountingDatabase call_counter(&database_);\n  DescriptorPool pool(&call_counter);\n\n  const FileDescriptor* file = pool.FindFileByName(\"foo.proto\");\n  ASSERT_TRUE(file != NULL);\n  const Descriptor* foo = pool.FindMessageTypeByName(\"Foo\");\n  ASSERT_TRUE(foo != NULL);\n  const EnumDescriptor* test_enum = pool.FindEnumTypeByName(\"TestEnum\");\n  ASSERT_TRUE(test_enum != NULL);\n  const ServiceDescriptor* test_service = pool.FindServiceByName(\"TestService\");\n  ASSERT_TRUE(test_service != NULL);\n\n  EXPECT_NE(0, call_counter.call_count_);\n  call_counter.Clear();\n\n  EXPECT_TRUE(foo->FindFieldByName(\"no_such_field\") == NULL);\n  EXPECT_TRUE(foo->FindExtensionByName(\"no_such_extension\") == NULL);\n  EXPECT_TRUE(foo->FindNestedTypeByName(\"NoSuchMessageType\") == NULL);\n  EXPECT_TRUE(foo->FindEnumTypeByName(\"NoSuchEnumType\") == NULL);\n  EXPECT_TRUE(foo->FindEnumValueByName(\"NO_SUCH_VALUE\") == NULL);\n  EXPECT_TRUE(test_enum->FindValueByName(\"NO_SUCH_VALUE\") == NULL);\n  EXPECT_TRUE(test_service->FindMethodByName(\"NoSuchMethod\") == NULL);\n\n  EXPECT_TRUE(file->FindMessageTypeByName(\"NoSuchMessageType\") == NULL);\n  EXPECT_TRUE(file->FindEnumTypeByName(\"NoSuchEnumType\") == NULL);\n  EXPECT_TRUE(file->FindEnumValueByName(\"NO_SUCH_VALUE\") == NULL);\n  EXPECT_TRUE(file->FindServiceByName(\"NO_SUCH_VALUE\") == NULL);\n  EXPECT_TRUE(file->FindExtensionByName(\"no_such_extension\") == NULL);\n  EXPECT_EQ(0, call_counter.call_count_);\n}\n\nTEST_F(DatabaseBackedPoolTest, DoesntReloadFilesUncesessarily) {\n  // If FindFileContainingSymbol() or FindFileContainingExtension() return a\n  // file that is already in the DescriptorPool, it should not attempt to\n  // reload the file.\n  FalsePositiveDatabase false_positive_database(&database_);\n  MockErrorCollector error_collector;\n  DescriptorPool pool(&false_positive_database, &error_collector);\n\n  // First make sure foo.proto is loaded.\n  const Descriptor* foo = pool.FindMessageTypeByName(\"Foo\");\n  ASSERT_TRUE(foo != NULL);\n\n  // Try inducing false positives.\n  EXPECT_TRUE(pool.FindMessageTypeByName(\"NoSuchSymbol\") == NULL);\n  EXPECT_TRUE(pool.FindExtensionByNumber(foo, 22) == NULL);\n\n  // No errors should have been reported.  (If foo.proto was incorrectly\n  // loaded multiple times, errors would have been reported.)\n  EXPECT_EQ(\"\", error_collector.text_);\n}\n\nTEST_F(DatabaseBackedPoolTest, DoesntReloadKnownBadFiles) {\n  ErrorDescriptorDatabase error_database;\n  MockErrorCollector error_collector;\n  DescriptorPool pool(&error_database, &error_collector);\n\n  EXPECT_TRUE(pool.FindFileByName(\"error.proto\") == NULL);\n  error_collector.text_.clear();\n  EXPECT_TRUE(pool.FindFileByName(\"error.proto\") == NULL);\n  EXPECT_EQ(\"\", error_collector.text_);\n}\n\nTEST_F(DatabaseBackedPoolTest, DoesntFallbackOnWrongType) {\n  // If a lookup finds a symbol of the wrong type (e.g. we pass a type name\n  // to FindFieldByName()), we should fail fast, without checking the fallback\n  // database.\n  CallCountingDatabase call_counter(&database_);\n  DescriptorPool pool(&call_counter);\n\n  const FileDescriptor* file = pool.FindFileByName(\"foo.proto\");\n  ASSERT_TRUE(file != NULL);\n  const Descriptor* foo = pool.FindMessageTypeByName(\"Foo\");\n  ASSERT_TRUE(foo != NULL);\n  const EnumDescriptor* test_enum = pool.FindEnumTypeByName(\"TestEnum\");\n  ASSERT_TRUE(test_enum != NULL);\n\n  EXPECT_NE(0, call_counter.call_count_);\n  call_counter.Clear();\n\n  EXPECT_TRUE(pool.FindMessageTypeByName(\"TestEnum\") == NULL);\n  EXPECT_TRUE(pool.FindFieldByName(\"Foo\") == NULL);\n  EXPECT_TRUE(pool.FindExtensionByName(\"Foo\") == NULL);\n  EXPECT_TRUE(pool.FindEnumTypeByName(\"Foo\") == NULL);\n  EXPECT_TRUE(pool.FindEnumValueByName(\"Foo\") == NULL);\n  EXPECT_TRUE(pool.FindServiceByName(\"Foo\") == NULL);\n  EXPECT_TRUE(pool.FindMethodByName(\"Foo\") == NULL);\n\n  EXPECT_EQ(0, call_counter.call_count_);\n}\n\n// ===================================================================\n\n\n}  // namespace descriptor_unittest\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// DynamicMessage is implemented by constructing a data structure which\n// has roughly the same memory layout as a generated message would have.\n// Then, we use GeneratedMessageReflection to implement our reflection\n// interface.  All the other operations we need to implement (e.g.\n// parsing, copying, etc.) are already implemented in terms of\n// Reflection, so the rest is easy.\n//\n// The up side of this strategy is that it's very efficient.  We don't\n// need to use hash_maps or generic representations of fields.  The\n// down side is that this is a low-level memory management hack which\n// can be tricky to get right.\n//\n// As mentioned in the header, we only expose a DynamicMessageFactory\n// publicly, not the DynamicMessage class itself.  This is because\n// GenericMessageReflection wants to have a pointer to a \"default\"\n// copy of the class, with all fields initialized to their default\n// values.  We only want to construct one of these per message type,\n// so DynamicMessageFactory stores a cache of default messages for\n// each type it sees (each unique Descriptor pointer).  The code\n// refers to the \"default\" copy of the class as the \"prototype\".\n//\n// Note on memory allocation:  This module often calls \"operator new()\"\n// to allocate untyped memory, rather than calling something like\n// \"new uint8[]\".  This is because \"operator new()\" means \"Give me some\n// space which I can use as I please.\" while \"new uint8[]\" means \"Give\n// me an array of 8-bit integers.\".  In practice, the later may return\n// a pointer that is not aligned correctly for general use.  I believe\n// Item 8 of \"More Effective C++\" discusses this in more detail, though\n// I don't have the book on me right now so I'm not sure.\n\n#include <algorithm>\n#include <google/protobuf/stubs/hash.h>\n\n#include <google/protobuf/stubs/common.h>\n\n#include <google/protobuf/dynamic_message.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/generated_message_util.h>\n#include <google/protobuf/generated_message_reflection.h>\n#include <google/protobuf/reflection_ops.h>\n#include <google/protobuf/repeated_field.h>\n#include <google/protobuf/extension_set.h>\n#include <google/protobuf/wire_format.h>\n\nnamespace google {\nnamespace protobuf {\n\nusing internal::WireFormat;\nusing internal::ExtensionSet;\nusing internal::GeneratedMessageReflection;\n\n\n// ===================================================================\n// Some helper tables and functions...\n\nnamespace {\n\n// Compute the byte size of the in-memory representation of the field.\nint FieldSpaceUsed(const FieldDescriptor* field) {\n  typedef FieldDescriptor FD;  // avoid line wrapping\n  if (field->label() == FD::LABEL_REPEATED) {\n    switch (field->cpp_type()) {\n      case FD::CPPTYPE_INT32  : return sizeof(RepeatedField<int32   >);\n      case FD::CPPTYPE_INT64  : return sizeof(RepeatedField<int64   >);\n      case FD::CPPTYPE_UINT32 : return sizeof(RepeatedField<uint32  >);\n      case FD::CPPTYPE_UINT64 : return sizeof(RepeatedField<uint64  >);\n      case FD::CPPTYPE_DOUBLE : return sizeof(RepeatedField<double  >);\n      case FD::CPPTYPE_FLOAT  : return sizeof(RepeatedField<float   >);\n      case FD::CPPTYPE_BOOL   : return sizeof(RepeatedField<bool    >);\n      case FD::CPPTYPE_ENUM   : return sizeof(RepeatedField<int     >);\n      case FD::CPPTYPE_MESSAGE: return sizeof(RepeatedPtrField<Message>);\n\n      case FD::CPPTYPE_STRING:\n        switch (field->options().ctype()) {\n          default:  // TODO(kenton):  Support other string reps.\n          case FieldOptions::STRING:\n            return sizeof(RepeatedPtrField<string>);\n        }\n        break;\n    }\n  } else {\n    switch (field->cpp_type()) {\n      case FD::CPPTYPE_INT32  : return sizeof(int32   );\n      case FD::CPPTYPE_INT64  : return sizeof(int64   );\n      case FD::CPPTYPE_UINT32 : return sizeof(uint32  );\n      case FD::CPPTYPE_UINT64 : return sizeof(uint64  );\n      case FD::CPPTYPE_DOUBLE : return sizeof(double  );\n      case FD::CPPTYPE_FLOAT  : return sizeof(float   );\n      case FD::CPPTYPE_BOOL   : return sizeof(bool    );\n      case FD::CPPTYPE_ENUM   : return sizeof(int     );\n      case FD::CPPTYPE_MESSAGE: return sizeof(Message*);\n\n      case FD::CPPTYPE_STRING:\n        switch (field->options().ctype()) {\n          default:  // TODO(kenton):  Support other string reps.\n          case FieldOptions::STRING:\n            return sizeof(string*);\n        }\n        break;\n    }\n  }\n\n  GOOGLE_LOG(DFATAL) << \"Can't get here.\";\n  return 0;\n}\n\ninline int DivideRoundingUp(int i, int j) {\n  return (i + (j - 1)) / j;\n}\n\nstatic const int kSafeAlignment = sizeof(uint64);\n\ninline int AlignTo(int offset, int alignment) {\n  return DivideRoundingUp(offset, alignment) * alignment;\n}\n\n// Rounds the given byte offset up to the next offset aligned such that any\n// type may be stored at it.\ninline int AlignOffset(int offset) {\n  return AlignTo(offset, kSafeAlignment);\n}\n\n#define bitsizeof(T) (sizeof(T) * 8)\n\n}  // namespace\n\n// ===================================================================\n\nclass DynamicMessage : public Message {\n public:\n  struct TypeInfo {\n    int size;\n    int has_bits_offset;\n    int unknown_fields_offset;\n    int extensions_offset;\n\n    // Not owned by the TypeInfo.\n    DynamicMessageFactory* factory;  // The factory that created this object.\n    const DescriptorPool* pool;      // The factory's DescriptorPool.\n    const Descriptor* type;          // Type of this DynamicMessage.\n\n    // Warning:  The order in which the following pointers are defined is\n    //   important (the prototype must be deleted *before* the offsets).\n    scoped_array<int> offsets;\n    scoped_ptr<const GeneratedMessageReflection> reflection;\n    scoped_ptr<const DynamicMessage> prototype;\n  };\n\n  DynamicMessage(const TypeInfo* type_info);\n  ~DynamicMessage();\n\n  // Called on the prototype after construction to initialize message fields.\n  void CrossLinkPrototypes();\n\n  // implements Message ----------------------------------------------\n\n  Message* New() const;\n\n  int GetCachedSize() const;\n  void SetCachedSize(int size) const;\n\n  Metadata GetMetadata() const;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessage);\n\n  inline bool is_prototype() const {\n    return type_info_->prototype == this ||\n           // If type_info_->prototype is NULL, then we must be constructing\n           // the prototype now, which means we must be the prototype.\n           type_info_->prototype == NULL;\n  }\n\n  inline void* OffsetToPointer(int offset) {\n    return reinterpret_cast<uint8*>(this) + offset;\n  }\n  inline const void* OffsetToPointer(int offset) const {\n    return reinterpret_cast<const uint8*>(this) + offset;\n  }\n\n  const TypeInfo* type_info_;\n\n  // TODO(kenton):  Make this an atomic<int> when C++ supports it.\n  mutable int cached_byte_size_;\n};\n\nDynamicMessage::DynamicMessage(const TypeInfo* type_info)\n  : type_info_(type_info),\n    cached_byte_size_(0) {\n  // We need to call constructors for various fields manually and set\n  // default values where appropriate.  We use placement new to call\n  // constructors.  If you haven't heard of placement new, I suggest Googling\n  // it now.  We use placement new even for primitive types that don't have\n  // constructors for consistency.  (In theory, placement new should be used\n  // any time you are trying to convert untyped memory to typed memory, though\n  // in practice that's not strictly necessary for types that don't have a\n  // constructor.)\n\n  const Descriptor* descriptor = type_info_->type;\n\n  new(OffsetToPointer(type_info_->unknown_fields_offset)) UnknownFieldSet;\n\n  if (type_info_->extensions_offset != -1) {\n    new(OffsetToPointer(type_info_->extensions_offset)) ExtensionSet;\n  }\n\n  for (int i = 0; i < descriptor->field_count(); i++) {\n    const FieldDescriptor* field = descriptor->field(i);\n    void* field_ptr = OffsetToPointer(type_info_->offsets[i]);\n    switch (field->cpp_type()) {\n#define HANDLE_TYPE(CPPTYPE, TYPE)                                           \\\n      case FieldDescriptor::CPPTYPE_##CPPTYPE:                               \\\n        if (!field->is_repeated()) {                                         \\\n          new(field_ptr) TYPE(field->default_value_##TYPE());                \\\n        } else {                                                             \\\n          new(field_ptr) RepeatedField<TYPE>();                              \\\n        }                                                                    \\\n        break;\n\n      HANDLE_TYPE(INT32 , int32 );\n      HANDLE_TYPE(INT64 , int64 );\n      HANDLE_TYPE(UINT32, uint32);\n      HANDLE_TYPE(UINT64, uint64);\n      HANDLE_TYPE(DOUBLE, double);\n      HANDLE_TYPE(FLOAT , float );\n      HANDLE_TYPE(BOOL  , bool  );\n#undef HANDLE_TYPE\n\n      case FieldDescriptor::CPPTYPE_ENUM:\n        if (!field->is_repeated()) {\n          new(field_ptr) int(field->default_value_enum()->number());\n        } else {\n          new(field_ptr) RepeatedField<int>();\n        }\n        break;\n\n      case FieldDescriptor::CPPTYPE_STRING:\n        switch (field->options().ctype()) {\n          default:  // TODO(kenton):  Support other string reps.\n          case FieldOptions::STRING:\n            if (!field->is_repeated()) {\n              if (is_prototype()) {\n                new(field_ptr) const string*(&field->default_value_string());\n              } else {\n                string* default_value =\n                  *reinterpret_cast<string* const*>(\n                    type_info_->prototype->OffsetToPointer(\n                      type_info_->offsets[i]));\n                new(field_ptr) string*(default_value);\n              }\n            } else {\n              new(field_ptr) RepeatedPtrField<string>();\n            }\n            break;\n        }\n        break;\n\n      case FieldDescriptor::CPPTYPE_MESSAGE: {\n        if (!field->is_repeated()) {\n          new(field_ptr) Message*(NULL);\n        } else {\n          new(field_ptr) RepeatedPtrField<Message>();\n        }\n        break;\n      }\n    }\n  }\n}\n\nDynamicMessage::~DynamicMessage() {\n  const Descriptor* descriptor = type_info_->type;\n\n  reinterpret_cast<UnknownFieldSet*>(\n    OffsetToPointer(type_info_->unknown_fields_offset))->~UnknownFieldSet();\n\n  if (type_info_->extensions_offset != -1) {\n    reinterpret_cast<ExtensionSet*>(\n      OffsetToPointer(type_info_->extensions_offset))->~ExtensionSet();\n  }\n\n  // We need to manually run the destructors for repeated fields and strings,\n  // just as we ran their constructors in the the DynamicMessage constructor.\n  // Additionally, if any singular embedded messages have been allocated, we\n  // need to delete them, UNLESS we are the prototype message of this type,\n  // in which case any embedded messages are other prototypes and shouldn't\n  // be touched.\n  for (int i = 0; i < descriptor->field_count(); i++) {\n    const FieldDescriptor* field = descriptor->field(i);\n    void* field_ptr = OffsetToPointer(type_info_->offsets[i]);\n\n    if (field->is_repeated()) {\n      switch (field->cpp_type()) {\n#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \\\n        case FieldDescriptor::CPPTYPE_##UPPERCASE :                           \\\n          reinterpret_cast<RepeatedField<LOWERCASE>*>(field_ptr)              \\\n              ->~RepeatedField<LOWERCASE>();                                  \\\n          break\n\n        HANDLE_TYPE( INT32,  int32);\n        HANDLE_TYPE( INT64,  int64);\n        HANDLE_TYPE(UINT32, uint32);\n        HANDLE_TYPE(UINT64, uint64);\n        HANDLE_TYPE(DOUBLE, double);\n        HANDLE_TYPE( FLOAT,  float);\n        HANDLE_TYPE(  BOOL,   bool);\n        HANDLE_TYPE(  ENUM,    int);\n#undef HANDLE_TYPE\n\n        case FieldDescriptor::CPPTYPE_STRING:\n          switch (field->options().ctype()) {\n            default:  // TODO(kenton):  Support other string reps.\n            case FieldOptions::STRING:\n              reinterpret_cast<RepeatedPtrField<string>*>(field_ptr)\n                  ->~RepeatedPtrField<string>();\n              break;\n          }\n          break;\n\n        case FieldDescriptor::CPPTYPE_MESSAGE:\n          reinterpret_cast<RepeatedPtrField<Message>*>(field_ptr)\n              ->~RepeatedPtrField<Message>();\n          break;\n      }\n\n    } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) {\n      switch (field->options().ctype()) {\n        default:  // TODO(kenton):  Support other string reps.\n        case FieldOptions::STRING: {\n          string* ptr = *reinterpret_cast<string**>(field_ptr);\n          if (ptr != &field->default_value_string()) {\n            delete ptr;\n          }\n          break;\n        }\n      }\n    } else if ((field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) &&\n               !is_prototype()) {\n      Message* message = *reinterpret_cast<Message**>(field_ptr);\n      if (message != NULL) {\n        delete message;\n      }\n    }\n  }\n}\n\nvoid DynamicMessage::CrossLinkPrototypes() {\n  // This should only be called on the prototype message.\n  GOOGLE_CHECK(is_prototype());\n\n  DynamicMessageFactory* factory = type_info_->factory;\n  const Descriptor* descriptor = type_info_->type;\n\n  // Cross-link default messages.\n  for (int i = 0; i < descriptor->field_count(); i++) {\n    const FieldDescriptor* field = descriptor->field(i);\n    void* field_ptr = OffsetToPointer(type_info_->offsets[i]);\n\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&\n        !field->is_repeated()) {\n      // For fields with message types, we need to cross-link with the\n      // prototype for the field's type.\n      // For singular fields, the field is just a pointer which should\n      // point to the prototype.\n      *reinterpret_cast<const Message**>(field_ptr) =\n        factory->GetPrototypeNoLock(field->message_type());\n    }\n  }\n}\n\nMessage* DynamicMessage::New() const {\n  void* new_base = reinterpret_cast<uint8*>(operator new(type_info_->size));\n  memset(new_base, 0, type_info_->size);\n  return new(new_base) DynamicMessage(type_info_);\n}\n\nint DynamicMessage::GetCachedSize() const {\n  return cached_byte_size_;\n}\n\nvoid DynamicMessage::SetCachedSize(int size) const {\n  // This is theoretically not thread-compatible, but in practice it works\n  // because if multiple threads write this simultaneously, they will be\n  // writing the exact same value.\n  cached_byte_size_ = size;\n}\n\nMetadata DynamicMessage::GetMetadata() const {\n  Metadata metadata;\n  metadata.descriptor = type_info_->type;\n  metadata.reflection = type_info_->reflection.get();\n  return metadata;\n}\n\n// ===================================================================\n\nstruct DynamicMessageFactory::PrototypeMap {\n  typedef hash_map<const Descriptor*, const DynamicMessage::TypeInfo*> Map;\n  Map map_;\n};\n\nDynamicMessageFactory::DynamicMessageFactory()\n  : pool_(NULL), delegate_to_generated_factory_(false),\n    prototypes_(new PrototypeMap) {\n}\n\nDynamicMessageFactory::DynamicMessageFactory(const DescriptorPool* pool)\n  : pool_(pool), delegate_to_generated_factory_(false),\n    prototypes_(new PrototypeMap) {\n}\n\nDynamicMessageFactory::~DynamicMessageFactory() {\n  for (PrototypeMap::Map::iterator iter = prototypes_->map_.begin();\n       iter != prototypes_->map_.end(); ++iter) {\n    delete iter->second;\n  }\n}\n\nconst Message* DynamicMessageFactory::GetPrototype(const Descriptor* type) {\n  MutexLock lock(&prototypes_mutex_);\n  return GetPrototypeNoLock(type);\n}\n\nconst Message* DynamicMessageFactory::GetPrototypeNoLock(\n    const Descriptor* type) {\n  if (delegate_to_generated_factory_ &&\n      type->file()->pool() == DescriptorPool::generated_pool()) {\n    return MessageFactory::generated_factory()->GetPrototype(type);\n  }\n\n  const DynamicMessage::TypeInfo** target = &prototypes_->map_[type];\n  if (*target != NULL) {\n    // Already exists.\n    return (*target)->prototype.get();\n  }\n\n  DynamicMessage::TypeInfo* type_info = new DynamicMessage::TypeInfo;\n  *target = type_info;\n\n  type_info->type = type;\n  type_info->pool = (pool_ == NULL) ? type->file()->pool() : pool_;\n  type_info->factory = this;\n\n  // We need to construct all the structures passed to\n  // GeneratedMessageReflection's constructor.  This includes:\n  // - A block of memory that contains space for all the message's fields.\n  // - An array of integers indicating the byte offset of each field within\n  //   this block.\n  // - A big bitfield containing a bit for each field indicating whether\n  //   or not that field is set.\n\n  // Compute size and offsets.\n  int* offsets = new int[type->field_count()];\n  type_info->offsets.reset(offsets);\n\n  // Decide all field offsets by packing in order.\n  // We place the DynamicMessage object itself at the beginning of the allocated\n  // space.\n  int size = sizeof(DynamicMessage);\n  size = AlignOffset(size);\n\n  // Next the has_bits, which is an array of uint32s.\n  type_info->has_bits_offset = size;\n  int has_bits_array_size =\n    DivideRoundingUp(type->field_count(), bitsizeof(uint32));\n  size += has_bits_array_size * sizeof(uint32);\n  size = AlignOffset(size);\n\n  // The ExtensionSet, if any.\n  if (type->extension_range_count() > 0) {\n    type_info->extensions_offset = size;\n    size += sizeof(ExtensionSet);\n    size = AlignOffset(size);\n  } else {\n    // No extensions.\n    type_info->extensions_offset = -1;\n  }\n\n  // All the fields.\n  for (int i = 0; i < type->field_count(); i++) {\n    // Make sure field is aligned to avoid bus errors.\n    int field_size = FieldSpaceUsed(type->field(i));\n    size = AlignTo(size, min(kSafeAlignment, field_size));\n    offsets[i] = size;\n    size += field_size;\n  }\n\n  // Add the UnknownFieldSet to the end.\n  size = AlignOffset(size);\n  type_info->unknown_fields_offset = size;\n  size += sizeof(UnknownFieldSet);\n\n  // Align the final size to make sure no clever allocators think that\n  // alignment is not necessary.\n  size = AlignOffset(size);\n  type_info->size = size;\n\n  // Allocate the prototype.\n  void* base = operator new(size);\n  memset(base, 0, size);\n  DynamicMessage* prototype = new(base) DynamicMessage(type_info);\n  type_info->prototype.reset(prototype);\n\n  // Construct the reflection object.\n  type_info->reflection.reset(\n    new GeneratedMessageReflection(\n      type_info->type,\n      type_info->prototype.get(),\n      type_info->offsets.get(),\n      type_info->has_bits_offset,\n      type_info->unknown_fields_offset,\n      type_info->extensions_offset,\n      type_info->pool,\n      this,\n      type_info->size));\n\n  // Cross link prototypes.\n  prototype->CrossLinkPrototypes();\n\n  return prototype;\n}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Defines an implementation of Message which can emulate types which are not\n// known at compile-time.\n\n#ifndef GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__\n#define GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__\n\n#include <google/protobuf/message.h>\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\n\n// Defined in other files.\nclass Descriptor;        // descriptor.h\nclass DescriptorPool;    // descriptor.h\n\n// Constructs implementations of Message which can emulate types which are not\n// known at compile-time.\n//\n// Sometimes you want to be able to manipulate protocol types that you don't\n// know about at compile time.  It would be nice to be able to construct\n// a Message object which implements the message type given by any arbitrary\n// Descriptor.  DynamicMessage provides this.\n//\n// As it turns out, a DynamicMessage needs to construct extra\n// information about its type in order to operate.  Most of this information\n// can be shared between all DynamicMessages of the same type.  But, caching\n// this information in some sort of global map would be a bad idea, since\n// the cached information for a particular descriptor could outlive the\n// descriptor itself.  To avoid this problem, DynamicMessageFactory\n// encapsulates this \"cache\".  All DynamicMessages of the same type created\n// from the same factory will share the same support data.  Any Descriptors\n// used with a particular factory must outlive the factory.\nclass LIBPROTOBUF_EXPORT DynamicMessageFactory : public MessageFactory {\n public:\n  // Construct a DynamicMessageFactory that will search for extensions in\n  // the DescriptorPool in which the exendee is defined.\n  DynamicMessageFactory();\n\n  // Construct a DynamicMessageFactory that will search for extensions in\n  // the given DescriptorPool.\n  //\n  // DEPRECATED:  Use CodedInputStream::SetExtensionRegistry() to tell the\n  //   parser to look for extensions in an alternate pool.  However, note that\n  //   this is almost never what you want to do.  Almost all users should use\n  //   the zero-arg constructor.\n  DynamicMessageFactory(const DescriptorPool* pool);\n\n  ~DynamicMessageFactory();\n\n  // Call this to tell the DynamicMessageFactory that if it is given a\n  // Descriptor d for which:\n  //   d->file()->pool() == DescriptorPool::generated_pool(),\n  // then it should delegate to MessageFactory::generated_factory() instead\n  // of constructing a dynamic implementation of the message.  In theory there\n  // is no down side to doing this, so it may become the default in the future.\n  void SetDelegateToGeneratedFactory(bool enable) {\n    delegate_to_generated_factory_ = enable;\n  }\n\n  // implements MessageFactory ---------------------------------------\n\n  // Given a Descriptor, constructs the default (prototype) Message of that\n  // type.  You can then call that message's New() method to construct a\n  // mutable message of that type.\n  //\n  // Calling this method twice with the same Descriptor returns the same\n  // object.  The returned object remains property of the factory and will\n  // be destroyed when the factory is destroyed.  Also, any objects created\n  // by calling the prototype's New() method share some data with the\n  // prototype, so these must be destoyed before the DynamicMessageFactory\n  // is destroyed.\n  //\n  // The given descriptor must outlive the returned message, and hence must\n  // outlive the DynamicMessageFactory.\n  //\n  // The method is thread-safe.\n  const Message* GetPrototype(const Descriptor* type);\n\n private:\n  const DescriptorPool* pool_;\n  bool delegate_to_generated_factory_;\n\n  // This struct just contains a hash_map.  We can't #include <google/protobuf/stubs/hash.h> from\n  // this header due to hacks needed for hash_map portability in the open source\n  // release.  Namely, stubs/hash.h, which defines hash_map portably, is not a\n  // public header (for good reason), but dynamic_message.h is, and public\n  // headers may only #include other public headers.\n  struct PrototypeMap;\n  scoped_ptr<PrototypeMap> prototypes_;\n  mutable Mutex prototypes_mutex_;\n\n  friend class DynamicMessage;\n  const Message* GetPrototypeNoLock(const Descriptor* type);\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessageFactory);\n};\n\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Since the reflection interface for DynamicMessage is implemented by\n// GenericMessageReflection, the only thing we really have to test is\n// that DynamicMessage correctly sets up the information that\n// GenericMessageReflection needs to use.  So, we focus on that in this\n// test.  Other tests, such as generic_message_reflection_unittest and\n// reflection_ops_unittest, cover the rest of the functionality used by\n// DynamicMessage.\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/dynamic_message.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/test_util.h>\n#include <google/protobuf/unittest.pb.h>\n\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\n\nclass DynamicMessageTest : public testing::Test {\n protected:\n  DescriptorPool pool_;\n  DynamicMessageFactory factory_;\n  const Descriptor* descriptor_;\n  const Message* prototype_;\n  const Descriptor* extensions_descriptor_;\n  const Message* extensions_prototype_;\n  const Descriptor* packed_descriptor_;\n  const Message* packed_prototype_;\n\n  DynamicMessageTest(): factory_(&pool_) {}\n\n  virtual void SetUp() {\n    // We want to make sure that DynamicMessage works (particularly with\n    // extensions) even if we use descriptors that are *not* from compiled-in\n    // types, so we make copies of the descriptors for unittest.proto and\n    // unittest_import.proto.\n    FileDescriptorProto unittest_file;\n    FileDescriptorProto unittest_import_file;\n\n    unittest::TestAllTypes::descriptor()->file()->CopyTo(&unittest_file);\n    unittest_import::ImportMessage::descriptor()->file()->CopyTo(\n      &unittest_import_file);\n\n    ASSERT_TRUE(pool_.BuildFile(unittest_import_file) != NULL);\n    ASSERT_TRUE(pool_.BuildFile(unittest_file) != NULL);\n\n    descriptor_ = pool_.FindMessageTypeByName(\"protobuf_unittest.TestAllTypes\");\n    ASSERT_TRUE(descriptor_ != NULL);\n    prototype_ = factory_.GetPrototype(descriptor_);\n\n    extensions_descriptor_ =\n      pool_.FindMessageTypeByName(\"protobuf_unittest.TestAllExtensions\");\n    ASSERT_TRUE(extensions_descriptor_ != NULL);\n    extensions_prototype_ = factory_.GetPrototype(extensions_descriptor_);\n\n    packed_descriptor_ =\n      pool_.FindMessageTypeByName(\"protobuf_unittest.TestPackedTypes\");\n    ASSERT_TRUE(packed_descriptor_ != NULL);\n    packed_prototype_ = factory_.GetPrototype(packed_descriptor_);\n  }\n};\n\nTEST_F(DynamicMessageTest, Descriptor) {\n  // Check that the descriptor on the DynamicMessage matches the descriptor\n  // passed to GetPrototype().\n  EXPECT_EQ(prototype_->GetDescriptor(), descriptor_);\n}\n\nTEST_F(DynamicMessageTest, OnePrototype) {\n  // Check that requesting the same prototype twice produces the same object.\n  EXPECT_EQ(prototype_, factory_.GetPrototype(descriptor_));\n}\n\nTEST_F(DynamicMessageTest, Defaults) {\n  // Check that all default values are set correctly in the initial message.\n  TestUtil::ReflectionTester reflection_tester(descriptor_);\n  reflection_tester.ExpectClearViaReflection(*prototype_);\n}\n\nTEST_F(DynamicMessageTest, IndependentOffsets) {\n  // Check that all fields have independent offsets by setting each\n  // one to a unique value then checking that they all still have those\n  // unique values (i.e. they don't stomp each other).\n  scoped_ptr<Message> message(prototype_->New());\n  TestUtil::ReflectionTester reflection_tester(descriptor_);\n\n  reflection_tester.SetAllFieldsViaReflection(message.get());\n  reflection_tester.ExpectAllFieldsSetViaReflection(*message);\n}\n\nTEST_F(DynamicMessageTest, Extensions) {\n  // Check that extensions work.\n  scoped_ptr<Message> message(extensions_prototype_->New());\n  TestUtil::ReflectionTester reflection_tester(extensions_descriptor_);\n\n  reflection_tester.SetAllFieldsViaReflection(message.get());\n  reflection_tester.ExpectAllFieldsSetViaReflection(*message);\n}\n\nTEST_F(DynamicMessageTest, PackedFields) {\n  // Check that packed fields work properly.\n  scoped_ptr<Message> message(packed_prototype_->New());\n  TestUtil::ReflectionTester reflection_tester(packed_descriptor_);\n\n  reflection_tester.SetPackedFieldsViaReflection(message.get());\n  reflection_tester.ExpectPackedFieldsSetViaReflection(*message);\n}\n\nTEST_F(DynamicMessageTest, SpaceUsed) {\n  // Test that SpaceUsed() works properly\n\n  // Since we share the implementation with generated messages, we don't need\n  // to test very much here.  Just make sure it appears to be working.\n\n  scoped_ptr<Message> message(prototype_->New());\n  TestUtil::ReflectionTester reflection_tester(descriptor_);\n\n  int initial_space_used = message->SpaceUsed();\n\n  reflection_tester.SetAllFieldsViaReflection(message.get());\n  EXPECT_LT(initial_space_used, message->SpaceUsed());\n}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/stubs/hash.h>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/once.h>\n#include <google/protobuf/extension_set.h>\n#include <google/protobuf/message_lite.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/wire_format_lite_inl.h>\n#include <google/protobuf/repeated_field.h>\n#include <google/protobuf/stubs/map-util.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\n\nnamespace {\n\ninline WireFormatLite::FieldType real_type(FieldType type) {\n  GOOGLE_DCHECK(type > 0 && type <= WireFormatLite::MAX_FIELD_TYPE);\n  return static_cast<WireFormatLite::FieldType>(type);\n}\n\ninline WireFormatLite::CppType cpp_type(FieldType type) {\n  return WireFormatLite::FieldTypeToCppType(real_type(type));\n}\n\n// Registry stuff.\ntypedef hash_map<pair<const MessageLite*, int>,\n                 ExtensionInfo> ExtensionRegistry;\nExtensionRegistry* registry_ = NULL;\nGOOGLE_PROTOBUF_DECLARE_ONCE(registry_init_);\n\nvoid DeleteRegistry() {\n  delete registry_;\n  registry_ = NULL;\n}\n\nvoid InitRegistry() {\n  registry_ = new ExtensionRegistry;\n  internal::OnShutdown(&DeleteRegistry);\n}\n\n// This function is only called at startup, so there is no need for thread-\n// safety.\nvoid Register(const MessageLite* containing_type,\n              int number, ExtensionInfo info) {\n  ::google::protobuf::GoogleOnceInit(&registry_init_, &InitRegistry);\n\n  if (!InsertIfNotPresent(registry_, make_pair(containing_type, number),\n                          info)) {\n    GOOGLE_LOG(FATAL) << \"Multiple extension registrations for type \\\"\"\n               << containing_type->GetTypeName()\n               << \"\\\", field number \" << number << \".\";\n  }\n}\n\nconst ExtensionInfo* FindRegisteredExtension(\n    const MessageLite* containing_type, int number) {\n  return (registry_ == NULL) ? NULL :\n         FindOrNull(*registry_, make_pair(containing_type, number));\n}\n\n}  // namespace\n\nExtensionFinder::~ExtensionFinder() {}\n\nbool GeneratedExtensionFinder::Find(int number, ExtensionInfo* output) {\n  const ExtensionInfo* extension =\n      FindRegisteredExtension(containing_type_, number);\n  if (extension == NULL) {\n    return false;\n  } else {\n    *output = *extension;\n    return true;\n  }\n}\n\nvoid ExtensionSet::RegisterExtension(const MessageLite* containing_type,\n                                     int number, FieldType type,\n                                     bool is_repeated, bool is_packed) {\n  GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_ENUM);\n  GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_MESSAGE);\n  GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_GROUP);\n  ExtensionInfo info(type, is_repeated, is_packed);\n  Register(containing_type, number, info);\n}\n\nstatic bool CallNoArgValidityFunc(const void* arg, int number) {\n  // Note:  Must use C-style cast here rather than reinterpret_cast because\n  //   the C++ standard at one point did not allow casts between function and\n  //   data pointers and some compilers enforce this for C++-style casts.  No\n  //   compiler enforces it for C-style casts since lots of C-style code has\n  //   relied on these kinds of casts for a long time, despite being\n  //   technically undefined.  See:\n  //     http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#195\n  // Also note:  Some compilers do not allow function pointers to be \"const\".\n  //   Which makes sense, I suppose, because it's meaningless.\n  return ((EnumValidityFunc*)arg)(number);\n}\n\nvoid ExtensionSet::RegisterEnumExtension(const MessageLite* containing_type,\n                                         int number, FieldType type,\n                                         bool is_repeated, bool is_packed,\n                                         EnumValidityFunc* is_valid) {\n  GOOGLE_CHECK_EQ(type, WireFormatLite::TYPE_ENUM);\n  ExtensionInfo info(type, is_repeated, is_packed);\n  info.enum_validity_check.func = CallNoArgValidityFunc;\n  // See comment in CallNoArgValidityFunc() about why we use a c-style cast.\n  info.enum_validity_check.arg = (void*)is_valid;\n  Register(containing_type, number, info);\n}\n\nvoid ExtensionSet::RegisterMessageExtension(const MessageLite* containing_type,\n                                            int number, FieldType type,\n                                            bool is_repeated, bool is_packed,\n                                            const MessageLite* prototype) {\n  GOOGLE_CHECK(type == WireFormatLite::TYPE_MESSAGE ||\n        type == WireFormatLite::TYPE_GROUP);\n  ExtensionInfo info(type, is_repeated, is_packed);\n  info.message_prototype = prototype;\n  Register(containing_type, number, info);\n}\n\n\n// ===================================================================\n// Constructors and basic methods.\n\nExtensionSet::ExtensionSet() {}\n\nExtensionSet::~ExtensionSet() {\n  for (map<int, Extension>::iterator iter = extensions_.begin();\n       iter != extensions_.end(); ++iter) {\n    iter->second.Free();\n  }\n}\n\n// Defined in extension_set_heavy.cc.\n// void ExtensionSet::AppendToList(const Descriptor* containing_type,\n//                                 const DescriptorPool* pool,\n//                                 vector<const FieldDescriptor*>* output) const\n\nbool ExtensionSet::Has(int number) const {\n  map<int, Extension>::const_iterator iter = extensions_.find(number);\n  if (iter == extensions_.end()) return false;\n  GOOGLE_DCHECK(!iter->second.is_repeated);\n  return !iter->second.is_cleared;\n}\n\nint ExtensionSet::ExtensionSize(int number) const {\n  map<int, Extension>::const_iterator iter = extensions_.find(number);\n  if (iter == extensions_.end()) return false;\n  return iter->second.GetSize();\n}\n\nFieldType ExtensionSet::ExtensionType(int number) const {\n  map<int, Extension>::const_iterator iter = extensions_.find(number);\n  if (iter == extensions_.end()) {\n    GOOGLE_LOG(DFATAL) << \"Don't lookup extension types if they aren't present (1). \";\n    return 0;\n  }\n  if (iter->second.is_cleared) {\n    GOOGLE_LOG(DFATAL) << \"Don't lookup extension types if they aren't present (2). \";\n  }\n  return iter->second.type;\n}\n\nvoid ExtensionSet::ClearExtension(int number) {\n  map<int, Extension>::iterator iter = extensions_.find(number);\n  if (iter == extensions_.end()) return;\n  iter->second.Clear();\n}\n\n// ===================================================================\n// Field accessors\n\nnamespace {\n\nenum Cardinality {\n  REPEATED,\n  OPTIONAL\n};\n\n}  // namespace\n\n#define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE)                             \\\n  GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? REPEATED : OPTIONAL, LABEL);         \\\n  GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), WireFormatLite::CPPTYPE_##CPPTYPE)\n\n// -------------------------------------------------------------------\n// Primitives\n\n#define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE)                   \\\n                                                                               \\\nLOWERCASE ExtensionSet::Get##CAMELCASE(int number,                             \\\n                                       LOWERCASE default_value) const {        \\\n  map<int, Extension>::const_iterator iter = extensions_.find(number);         \\\n  if (iter == extensions_.end() || iter->second.is_cleared) {                  \\\n    return default_value;                                                      \\\n  } else {                                                                     \\\n    GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, UPPERCASE);                            \\\n    return iter->second.LOWERCASE##_value;                                     \\\n  }                                                                            \\\n}                                                                              \\\n                                                                               \\\nvoid ExtensionSet::Set##CAMELCASE(int number, FieldType type,                  \\\n                                  LOWERCASE value,                             \\\n                                  const FieldDescriptor* descriptor) {         \\\n  Extension* extension;                                                        \\\n  if (MaybeNewExtension(number, descriptor, &extension)) {                     \\\n    extension->type = type;                                                    \\\n    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \\\n    extension->is_repeated = false;                                            \\\n  } else {                                                                     \\\n    GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, UPPERCASE);                              \\\n  }                                                                            \\\n  extension->is_cleared = false;                                               \\\n  extension->LOWERCASE##_value = value;                                        \\\n}                                                                              \\\n                                                                               \\\nLOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) const {  \\\n  map<int, Extension>::const_iterator iter = extensions_.find(number);         \\\n  GOOGLE_CHECK(iter != extensions_.end()) << \"Index out-of-bounds (field is empty).\"; \\\n  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE);                              \\\n  return iter->second.repeated_##LOWERCASE##_value->Get(index);                \\\n}                                                                              \\\n                                                                               \\\nvoid ExtensionSet::SetRepeated##CAMELCASE(                                     \\\n    int number, int index, LOWERCASE value) {                                  \\\n  map<int, Extension>::iterator iter = extensions_.find(number);               \\\n  GOOGLE_CHECK(iter != extensions_.end()) << \"Index out-of-bounds (field is empty).\"; \\\n  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE);                              \\\n  iter->second.repeated_##LOWERCASE##_value->Set(index, value);                \\\n}                                                                              \\\n                                                                               \\\nvoid ExtensionSet::Add##CAMELCASE(int number, FieldType type,                  \\\n                                  bool packed, LOWERCASE value,                \\\n                                  const FieldDescriptor* descriptor) {         \\\n  Extension* extension;                                                        \\\n  if (MaybeNewExtension(number, descriptor, &extension)) {                     \\\n    extension->type = type;                                                    \\\n    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \\\n    extension->is_repeated = true;                                             \\\n    extension->is_packed = packed;                                             \\\n    extension->repeated_##LOWERCASE##_value = new RepeatedField<LOWERCASE>();  \\\n  } else {                                                                     \\\n    GOOGLE_DCHECK_TYPE(*extension, REPEATED, UPPERCASE);                              \\\n    GOOGLE_DCHECK_EQ(extension->is_packed, packed);                                   \\\n  }                                                                            \\\n  extension->repeated_##LOWERCASE##_value->Add(value);                         \\\n}\n\nPRIMITIVE_ACCESSORS( INT32,  int32,  Int32)\nPRIMITIVE_ACCESSORS( INT64,  int64,  Int64)\nPRIMITIVE_ACCESSORS(UINT32, uint32, UInt32)\nPRIMITIVE_ACCESSORS(UINT64, uint64, UInt64)\nPRIMITIVE_ACCESSORS( FLOAT,  float,  Float)\nPRIMITIVE_ACCESSORS(DOUBLE, double, Double)\nPRIMITIVE_ACCESSORS(  BOOL,   bool,   Bool)\n\n#undef PRIMITIVE_ACCESSORS\n\n// -------------------------------------------------------------------\n// Enums\n\nint ExtensionSet::GetEnum(int number, int default_value) const {\n  map<int, Extension>::const_iterator iter = extensions_.find(number);\n  if (iter == extensions_.end() || iter->second.is_cleared) {\n    // Not present.  Return the default value.\n    return default_value;\n  } else {\n    GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, ENUM);\n    return iter->second.enum_value;\n  }\n}\n\nvoid ExtensionSet::SetEnum(int number, FieldType type, int value,\n                           const FieldDescriptor* descriptor) {\n  Extension* extension;\n  if (MaybeNewExtension(number, descriptor, &extension)) {\n    extension->type = type;\n    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM);\n    extension->is_repeated = false;\n  } else {\n    GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, ENUM);\n  }\n  extension->is_cleared = false;\n  extension->enum_value = value;\n}\n\nint ExtensionSet::GetRepeatedEnum(int number, int index) const {\n  map<int, Extension>::const_iterator iter = extensions_.find(number);\n  GOOGLE_CHECK(iter != extensions_.end()) << \"Index out-of-bounds (field is empty).\";\n  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM);\n  return iter->second.repeated_enum_value->Get(index);\n}\n\nvoid ExtensionSet::SetRepeatedEnum(int number, int index, int value) {\n  map<int, Extension>::iterator iter = extensions_.find(number);\n  GOOGLE_CHECK(iter != extensions_.end()) << \"Index out-of-bounds (field is empty).\";\n  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM);\n  iter->second.repeated_enum_value->Set(index, value);\n}\n\nvoid ExtensionSet::AddEnum(int number, FieldType type,\n                           bool packed, int value,\n                           const FieldDescriptor* descriptor) {\n  Extension* extension;\n  if (MaybeNewExtension(number, descriptor, &extension)) {\n    extension->type = type;\n    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM);\n    extension->is_repeated = true;\n    extension->is_packed = packed;\n    extension->repeated_enum_value = new RepeatedField<int>();\n  } else {\n    GOOGLE_DCHECK_TYPE(*extension, REPEATED, ENUM);\n    GOOGLE_DCHECK_EQ(extension->is_packed, packed);\n  }\n  extension->repeated_enum_value->Add(value);\n}\n\n// -------------------------------------------------------------------\n// Strings\n\nconst string& ExtensionSet::GetString(int number,\n                                      const string& default_value) const {\n  map<int, Extension>::const_iterator iter = extensions_.find(number);\n  if (iter == extensions_.end() || iter->second.is_cleared) {\n    // Not present.  Return the default value.\n    return default_value;\n  } else {\n    GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, STRING);\n    return *iter->second.string_value;\n  }\n}\n\nstring* ExtensionSet::MutableString(int number, FieldType type,\n                                    const FieldDescriptor* descriptor) {\n  Extension* extension;\n  if (MaybeNewExtension(number, descriptor, &extension)) {\n    extension->type = type;\n    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);\n    extension->is_repeated = false;\n    extension->string_value = new string;\n  } else {\n    GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, STRING);\n  }\n  extension->is_cleared = false;\n  return extension->string_value;\n}\n\nconst string& ExtensionSet::GetRepeatedString(int number, int index) const {\n  map<int, Extension>::const_iterator iter = extensions_.find(number);\n  GOOGLE_CHECK(iter != extensions_.end()) << \"Index out-of-bounds (field is empty).\";\n  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);\n  return iter->second.repeated_string_value->Get(index);\n}\n\nstring* ExtensionSet::MutableRepeatedString(int number, int index) {\n  map<int, Extension>::iterator iter = extensions_.find(number);\n  GOOGLE_CHECK(iter != extensions_.end()) << \"Index out-of-bounds (field is empty).\";\n  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING);\n  return iter->second.repeated_string_value->Mutable(index);\n}\n\nstring* ExtensionSet::AddString(int number, FieldType type,\n                                const FieldDescriptor* descriptor) {\n  Extension* extension;\n  if (MaybeNewExtension(number, descriptor, &extension)) {\n    extension->type = type;\n    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING);\n    extension->is_repeated = true;\n    extension->is_packed = false;\n    extension->repeated_string_value = new RepeatedPtrField<string>();\n  } else {\n    GOOGLE_DCHECK_TYPE(*extension, REPEATED, STRING);\n  }\n  return extension->repeated_string_value->Add();\n}\n\n// -------------------------------------------------------------------\n// Messages\n\nconst MessageLite& ExtensionSet::GetMessage(\n    int number, const MessageLite& default_value) const {\n  map<int, Extension>::const_iterator iter = extensions_.find(number);\n  if (iter == extensions_.end()) {\n    // Not present.  Return the default value.\n    return default_value;\n  } else {\n    GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);\n    return *iter->second.message_value;\n  }\n}\n\n// Defined in extension_set_heavy.cc.\n// const MessageLite& ExtensionSet::GetMessage(int number,\n//                                             const Descriptor* message_type,\n//                                             MessageFactory* factory) const\n\nMessageLite* ExtensionSet::MutableMessage(int number, FieldType type,\n                                          const MessageLite& prototype,\n                                          const FieldDescriptor* descriptor) {\n  Extension* extension;\n  if (MaybeNewExtension(number, descriptor, &extension)) {\n    extension->type = type;\n    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE);\n    extension->is_repeated = false;\n    extension->message_value = prototype.New();\n  } else {\n    GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE);\n  }\n  extension->is_cleared = false;\n  return extension->message_value;\n}\n\n// Defined in extension_set_heavy.cc.\n// MessageLite* ExtensionSet::MutableMessage(int number, FieldType type,\n//                                           const Descriptor* message_type,\n//                                           MessageFactory* factory)\n\nconst MessageLite& ExtensionSet::GetRepeatedMessage(\n    int number, int index) const {\n  map<int, Extension>::const_iterator iter = extensions_.find(number);\n  GOOGLE_CHECK(iter != extensions_.end()) << \"Index out-of-bounds (field is empty).\";\n  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE);\n  return iter->second.repeated_message_value->Get(index);\n}\n\nMessageLite* ExtensionSet::MutableRepeatedMessage(int number, int index) {\n  map<int, Extension>::iterator iter = extensions_.find(number);\n  GOOGLE_CHECK(iter != extensions_.end()) << \"Index out-of-bounds (field is empty).\";\n  GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE);\n  return iter->second.repeated_message_value->Mutable(index);\n}\n\nMessageLite* ExtensionSet::AddMessage(int number, FieldType type,\n                                      const MessageLite& prototype,\n                                      const FieldDescriptor* descriptor) {\n  Extension* extension;\n  if (MaybeNewExtension(number, descriptor, &extension)) {\n    extension->type = type;\n    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE);\n    extension->is_repeated = true;\n    extension->repeated_message_value =\n      new RepeatedPtrField<MessageLite>();\n  } else {\n    GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE);\n  }\n\n  // RepeatedPtrField<MessageLite> does not know how to Add() since it cannot\n  // allocate an abstract object, so we have to be tricky.\n  MessageLite* result = extension->repeated_message_value\n      ->AddFromCleared<internal::GenericTypeHandler<MessageLite> >();\n  if (result == NULL) {\n    result = prototype.New();\n    extension->repeated_message_value->AddAllocated(result);\n  }\n  return result;\n}\n\n// Defined in extension_set_heavy.cc.\n// MessageLite* ExtensionSet::AddMessage(int number, FieldType type,\n//                                       const Descriptor* message_type,\n//                                       MessageFactory* factory)\n\n#undef GOOGLE_DCHECK_TYPE\n\nvoid ExtensionSet::RemoveLast(int number) {\n  map<int, Extension>::iterator iter = extensions_.find(number);\n  GOOGLE_CHECK(iter != extensions_.end()) << \"Index out-of-bounds (field is empty).\";\n\n  Extension* extension = &iter->second;\n  GOOGLE_DCHECK(extension->is_repeated);\n\n  switch(cpp_type(extension->type)) {\n    case WireFormatLite::CPPTYPE_INT32:\n      extension->repeated_int32_value->RemoveLast();\n      break;\n    case WireFormatLite::CPPTYPE_INT64:\n      extension->repeated_int64_value->RemoveLast();\n      break;\n    case WireFormatLite::CPPTYPE_UINT32:\n      extension->repeated_uint32_value->RemoveLast();\n      break;\n    case WireFormatLite::CPPTYPE_UINT64:\n      extension->repeated_uint64_value->RemoveLast();\n      break;\n    case WireFormatLite::CPPTYPE_FLOAT:\n      extension->repeated_float_value->RemoveLast();\n      break;\n    case WireFormatLite::CPPTYPE_DOUBLE:\n      extension->repeated_double_value->RemoveLast();\n      break;\n    case WireFormatLite::CPPTYPE_BOOL:\n      extension->repeated_bool_value->RemoveLast();\n      break;\n    case WireFormatLite::CPPTYPE_ENUM:\n      extension->repeated_enum_value->RemoveLast();\n      break;\n    case WireFormatLite::CPPTYPE_STRING:\n      extension->repeated_string_value->RemoveLast();\n      break;\n    case WireFormatLite::CPPTYPE_MESSAGE:\n      extension->repeated_message_value->RemoveLast();\n      break;\n  }\n}\n\nvoid ExtensionSet::SwapElements(int number, int index1, int index2) {\n  map<int, Extension>::iterator iter = extensions_.find(number);\n  GOOGLE_CHECK(iter != extensions_.end()) << \"Index out-of-bounds (field is empty).\";\n\n  Extension* extension = &iter->second;\n  GOOGLE_DCHECK(extension->is_repeated);\n\n  switch(cpp_type(extension->type)) {\n    case WireFormatLite::CPPTYPE_INT32:\n      extension->repeated_int32_value->SwapElements(index1, index2);\n      break;\n    case WireFormatLite::CPPTYPE_INT64:\n      extension->repeated_int64_value->SwapElements(index1, index2);\n      break;\n    case WireFormatLite::CPPTYPE_UINT32:\n      extension->repeated_uint32_value->SwapElements(index1, index2);\n      break;\n    case WireFormatLite::CPPTYPE_UINT64:\n      extension->repeated_uint64_value->SwapElements(index1, index2);\n      break;\n    case WireFormatLite::CPPTYPE_FLOAT:\n      extension->repeated_float_value->SwapElements(index1, index2);\n      break;\n    case WireFormatLite::CPPTYPE_DOUBLE:\n      extension->repeated_double_value->SwapElements(index1, index2);\n      break;\n    case WireFormatLite::CPPTYPE_BOOL:\n      extension->repeated_bool_value->SwapElements(index1, index2);\n      break;\n    case WireFormatLite::CPPTYPE_ENUM:\n      extension->repeated_enum_value->SwapElements(index1, index2);\n      break;\n    case WireFormatLite::CPPTYPE_STRING:\n      extension->repeated_string_value->SwapElements(index1, index2);\n      break;\n    case WireFormatLite::CPPTYPE_MESSAGE:\n      extension->repeated_message_value->SwapElements(index1, index2);\n      break;\n  }\n}\n\n// ===================================================================\n\nvoid ExtensionSet::Clear() {\n  for (map<int, Extension>::iterator iter = extensions_.begin();\n       iter != extensions_.end(); ++iter) {\n    iter->second.Clear();\n  }\n}\n\nvoid ExtensionSet::MergeFrom(const ExtensionSet& other) {\n  for (map<int, Extension>::const_iterator iter = other.extensions_.begin();\n       iter != other.extensions_.end(); ++iter) {\n    const Extension& other_extension = iter->second;\n\n    if (other_extension.is_repeated) {\n      Extension* extension;\n      bool is_new = MaybeNewExtension(iter->first, other_extension.descriptor,\n                                      &extension);\n      if (is_new) {\n        // Extension did not already exist in set.\n        extension->type = other_extension.type;\n        extension->is_repeated = true;\n      } else {\n        GOOGLE_DCHECK_EQ(extension->type, other_extension.type);\n        GOOGLE_DCHECK(extension->is_repeated);\n      }\n\n      switch (cpp_type(other_extension.type)) {\n#define HANDLE_TYPE(UPPERCASE, LOWERCASE, REPEATED_TYPE)             \\\n        case WireFormatLite::CPPTYPE_##UPPERCASE:                    \\\n          if (is_new) {                                              \\\n            extension->repeated_##LOWERCASE##_value =                \\\n              new REPEATED_TYPE;                                     \\\n          }                                                          \\\n          extension->repeated_##LOWERCASE##_value->MergeFrom(        \\\n            *other_extension.repeated_##LOWERCASE##_value);          \\\n          break;\n\n        HANDLE_TYPE(  INT32,   int32, RepeatedField   <  int32>);\n        HANDLE_TYPE(  INT64,   int64, RepeatedField   <  int64>);\n        HANDLE_TYPE( UINT32,  uint32, RepeatedField   < uint32>);\n        HANDLE_TYPE( UINT64,  uint64, RepeatedField   < uint64>);\n        HANDLE_TYPE(  FLOAT,   float, RepeatedField   <  float>);\n        HANDLE_TYPE( DOUBLE,  double, RepeatedField   < double>);\n        HANDLE_TYPE(   BOOL,    bool, RepeatedField   <   bool>);\n        HANDLE_TYPE(   ENUM,    enum, RepeatedField   <    int>);\n        HANDLE_TYPE( STRING,  string, RepeatedPtrField< string>);\n#undef HANDLE_TYPE\n\n        case WireFormatLite::CPPTYPE_MESSAGE:\n          if (is_new) {\n            extension->repeated_message_value =\n              new RepeatedPtrField<MessageLite>();\n          }\n          // We can't call RepeatedPtrField<MessageLite>::MergeFrom() because\n          // it would attempt to allocate new objects.\n          RepeatedPtrField<MessageLite>* other_repeated_message =\n              other_extension.repeated_message_value;\n          for (int i = 0; i < other_repeated_message->size(); i++) {\n            const MessageLite& other_message = other_repeated_message->Get(i);\n            MessageLite* target = extension->repeated_message_value\n                     ->AddFromCleared<GenericTypeHandler<MessageLite> >();\n            if (target == NULL) {\n              target = other_message.New();\n              extension->repeated_message_value->AddAllocated(target);\n            }\n            target->CheckTypeAndMergeFrom(other_message);\n          }\n          break;\n      }\n    } else {\n      if (!other_extension.is_cleared) {\n        switch (cpp_type(other_extension.type)) {\n#define HANDLE_TYPE(UPPERCASE, LOWERCASE, CAMELCASE)                         \\\n          case WireFormatLite::CPPTYPE_##UPPERCASE:                          \\\n            Set##CAMELCASE(iter->first, other_extension.type,                \\\n                           other_extension.LOWERCASE##_value,                \\\n                           other_extension.descriptor);                      \\\n            break;\n\n          HANDLE_TYPE( INT32,  int32,  Int32);\n          HANDLE_TYPE( INT64,  int64,  Int64);\n          HANDLE_TYPE(UINT32, uint32, UInt32);\n          HANDLE_TYPE(UINT64, uint64, UInt64);\n          HANDLE_TYPE( FLOAT,  float,  Float);\n          HANDLE_TYPE(DOUBLE, double, Double);\n          HANDLE_TYPE(  BOOL,   bool,   Bool);\n          HANDLE_TYPE(  ENUM,   enum,   Enum);\n#undef HANDLE_TYPE\n          case WireFormatLite::CPPTYPE_STRING:\n            SetString(iter->first, other_extension.type,\n                      *other_extension.string_value,\n                      other_extension.descriptor);\n            break;\n          case WireFormatLite::CPPTYPE_MESSAGE:\n            MutableMessage(iter->first, other_extension.type,\n                           *other_extension.message_value,\n                           other_extension.descriptor)\n              ->CheckTypeAndMergeFrom(*other_extension.message_value);\n            break;\n        }\n      }\n    }\n  }\n}\n\nvoid ExtensionSet::Swap(ExtensionSet* x) {\n  extensions_.swap(x->extensions_);\n}\n\nbool ExtensionSet::IsInitialized() const {\n  // Extensions are never required.  However, we need to check that all\n  // embedded messages are initialized.\n  for (map<int, Extension>::const_iterator iter = extensions_.begin();\n       iter != extensions_.end(); ++iter) {\n    const Extension& extension = iter->second;\n    if (cpp_type(extension.type) == WireFormatLite::CPPTYPE_MESSAGE) {\n      if (extension.is_repeated) {\n        for (int i = 0; i < extension.repeated_message_value->size(); i++) {\n          if (!extension.repeated_message_value->Get(i).IsInitialized()) {\n            return false;\n          }\n        }\n      } else {\n        if (!extension.is_cleared) {\n          if (!extension.message_value->IsInitialized()) return false;\n        }\n      }\n    }\n  }\n\n  return true;\n}\n\nbool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,\n                              ExtensionFinder* extension_finder,\n                              FieldSkipper* field_skipper) {\n  int number = WireFormatLite::GetTagFieldNumber(tag);\n  WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag);\n\n  ExtensionInfo extension;\n  bool is_unknown;\n  if (!extension_finder->Find(number, &extension)) {\n    is_unknown = true;\n  } else if (extension.is_packed) {\n    is_unknown = (wire_type != WireFormatLite::WIRETYPE_LENGTH_DELIMITED);\n  } else {\n    WireFormatLite::WireType expected_wire_type =\n        WireFormatLite::WireTypeForFieldType(real_type(extension.type));\n    is_unknown = (wire_type != expected_wire_type);\n  }\n\n  if (is_unknown) {\n    field_skipper->SkipField(input, tag);\n  } else if (extension.is_packed) {\n    uint32 size;\n    if (!input->ReadVarint32(&size)) return false;\n    io::CodedInputStream::Limit limit = input->PushLimit(size);\n\n    switch (extension.type) {\n#define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE)        \\\n      case WireFormatLite::TYPE_##UPPERCASE:                                   \\\n        while (input->BytesUntilLimit() > 0) {                                 \\\n          CPP_LOWERCASE value;                                                 \\\n          if (!WireFormatLite::ReadPrimitive<                                  \\\n                  CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>(            \\\n                input, &value)) return false;                                  \\\n          Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE,         \\\n                             true, value, extension.descriptor);               \\\n        }                                                                      \\\n        break\n\n      HANDLE_TYPE(   INT32,  Int32,   int32);\n      HANDLE_TYPE(   INT64,  Int64,   int64);\n      HANDLE_TYPE(  UINT32, UInt32,  uint32);\n      HANDLE_TYPE(  UINT64, UInt64,  uint64);\n      HANDLE_TYPE(  SINT32,  Int32,   int32);\n      HANDLE_TYPE(  SINT64,  Int64,   int64);\n      HANDLE_TYPE( FIXED32, UInt32,  uint32);\n      HANDLE_TYPE( FIXED64, UInt64,  uint64);\n      HANDLE_TYPE(SFIXED32,  Int32,   int32);\n      HANDLE_TYPE(SFIXED64,  Int64,   int64);\n      HANDLE_TYPE(   FLOAT,  Float,   float);\n      HANDLE_TYPE(  DOUBLE, Double,  double);\n      HANDLE_TYPE(    BOOL,   Bool,    bool);\n#undef HANDLE_TYPE\n\n      case WireFormatLite::TYPE_ENUM:\n        while (input->BytesUntilLimit() > 0) {\n          int value;\n          if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(\n                  input, &value)) return false;\n          if (extension.enum_validity_check.func(\n                  extension.enum_validity_check.arg, value)) {\n            AddEnum(number, WireFormatLite::TYPE_ENUM, true, value,\n                    extension.descriptor);\n          }\n        }\n        break;\n\n      case WireFormatLite::TYPE_STRING:\n      case WireFormatLite::TYPE_BYTES:\n      case WireFormatLite::TYPE_GROUP:\n      case WireFormatLite::TYPE_MESSAGE:\n        GOOGLE_LOG(FATAL) << \"Non-primitive types can't be packed.\";\n        break;\n    }\n\n    input->PopLimit(limit);\n  } else {\n    switch (extension.type) {\n#define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE)                   \\\n      case WireFormatLite::TYPE_##UPPERCASE: {                                 \\\n        CPP_LOWERCASE value;                                                   \\\n        if (!WireFormatLite::ReadPrimitive<                                    \\\n                CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>(              \\\n               input, &value)) return false;                                   \\\n        if (extension.is_repeated) {                                          \\\n          Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE,         \\\n                             false, value, extension.descriptor);              \\\n        } else {                                                               \\\n          Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value,  \\\n                             extension.descriptor);                            \\\n        }                                                                      \\\n      } break\n\n      HANDLE_TYPE(   INT32,  Int32,   int32);\n      HANDLE_TYPE(   INT64,  Int64,   int64);\n      HANDLE_TYPE(  UINT32, UInt32,  uint32);\n      HANDLE_TYPE(  UINT64, UInt64,  uint64);\n      HANDLE_TYPE(  SINT32,  Int32,   int32);\n      HANDLE_TYPE(  SINT64,  Int64,   int64);\n      HANDLE_TYPE( FIXED32, UInt32,  uint32);\n      HANDLE_TYPE( FIXED64, UInt64,  uint64);\n      HANDLE_TYPE(SFIXED32,  Int32,   int32);\n      HANDLE_TYPE(SFIXED64,  Int64,   int64);\n      HANDLE_TYPE(   FLOAT,  Float,   float);\n      HANDLE_TYPE(  DOUBLE, Double,  double);\n      HANDLE_TYPE(    BOOL,   Bool,    bool);\n#undef HANDLE_TYPE\n\n      case WireFormatLite::TYPE_ENUM: {\n        int value;\n        if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(\n                input, &value)) return false;\n\n        if (!extension.enum_validity_check.func(\n                extension.enum_validity_check.arg, value)) {\n          // Invalid value.  Treat as unknown.\n          field_skipper->SkipUnknownEnum(number, value);\n        } else if (extension.is_repeated) {\n          AddEnum(number, WireFormatLite::TYPE_ENUM, false, value,\n                  extension.descriptor);\n        } else {\n          SetEnum(number, WireFormatLite::TYPE_ENUM, value,\n                  extension.descriptor);\n        }\n        break;\n      }\n\n      case WireFormatLite::TYPE_STRING:  {\n        string* value = extension.is_repeated ?\n          AddString(number, WireFormatLite::TYPE_STRING, extension.descriptor) :\n          MutableString(number, WireFormatLite::TYPE_STRING,\n                        extension.descriptor);\n        if (!WireFormatLite::ReadString(input, value)) return false;\n        break;\n      }\n\n      case WireFormatLite::TYPE_BYTES:  {\n        string* value = extension.is_repeated ?\n          AddString(number, WireFormatLite::TYPE_STRING, extension.descriptor) :\n          MutableString(number, WireFormatLite::TYPE_STRING,\n                        extension.descriptor);\n        if (!WireFormatLite::ReadBytes(input, value)) return false;\n        break;\n      }\n\n      case WireFormatLite::TYPE_GROUP: {\n        MessageLite* value = extension.is_repeated ?\n            AddMessage(number, WireFormatLite::TYPE_GROUP,\n                       *extension.message_prototype, extension.descriptor) :\n            MutableMessage(number, WireFormatLite::TYPE_GROUP,\n                           *extension.message_prototype, extension.descriptor);\n        if (!WireFormatLite::ReadGroup(number, input, value)) return false;\n        break;\n      }\n\n      case WireFormatLite::TYPE_MESSAGE: {\n        MessageLite* value = extension.is_repeated ?\n            AddMessage(number, WireFormatLite::TYPE_MESSAGE,\n                       *extension.message_prototype, extension.descriptor) :\n            MutableMessage(number, WireFormatLite::TYPE_MESSAGE,\n                           *extension.message_prototype, extension.descriptor);\n        if (!WireFormatLite::ReadMessage(input, value)) return false;\n        break;\n      }\n    }\n  }\n\n  return true;\n}\n\nbool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,\n                              const MessageLite* containing_type) {\n  FieldSkipper skipper;\n  GeneratedExtensionFinder finder(containing_type);\n  return ParseField(tag, input, &finder, &skipper);\n}\n\n// Defined in extension_set_heavy.cc.\n// bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,\n//                               const MessageLite* containing_type,\n//                               UnknownFieldSet* unknown_fields)\n\nbool ExtensionSet::ParseMessageSet(io::CodedInputStream* input,\n                                   ExtensionFinder* extension_finder,\n                                   FieldSkipper* field_skipper) {\n  while (true) {\n    uint32 tag = input->ReadTag();\n    switch (tag) {\n      case 0:\n        return true;\n      case WireFormatLite::kMessageSetItemStartTag:\n        if (!ParseMessageSetItem(input, extension_finder, field_skipper)) {\n          return false;\n        }\n        break;\n      default:\n        if (!ParseField(tag, input, extension_finder, field_skipper)) {\n          return false;\n        }\n        break;\n    }\n  }\n}\n\nbool ExtensionSet::ParseMessageSet(io::CodedInputStream* input,\n                                   const MessageLite* containing_type) {\n  FieldSkipper skipper;\n  GeneratedExtensionFinder finder(containing_type);\n  return ParseMessageSet(input, &finder, &skipper);\n}\n\n// Defined in extension_set_heavy.cc.\n// bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input,\n//                                    const MessageLite* containing_type,\n//                                    UnknownFieldSet* unknown_fields);\n\nbool ExtensionSet::ParseMessageSetItem(io::CodedInputStream* input,\n                                       ExtensionFinder* extension_finder,\n                                       FieldSkipper* field_skipper) {\n  // TODO(kenton):  It would be nice to share code between this and\n  // WireFormatLite::ParseAndMergeMessageSetItem(), but I think the\n  // differences would be hard to factor out.\n\n  // This method parses a group which should contain two fields:\n  //   required int32 type_id = 2;\n  //   required data message = 3;\n\n  // Once we see a type_id, we'll construct a fake tag for this extension\n  // which is the tag it would have had under the proto2 extensions wire\n  // format.\n  uint32 fake_tag = 0;\n\n  // If we see message data before the type_id, we'll append it to this so\n  // we can parse it later.  This will probably never happen in practice,\n  // as no MessageSet encoder I know of writes the message before the type ID.\n  // But, it's technically valid so we should allow it.\n  // TODO(kenton):  Use a Cord instead?  Do I care?\n  string message_data;\n\n  while (true) {\n    uint32 tag = input->ReadTag();\n    if (tag == 0) return false;\n\n    switch (tag) {\n      case WireFormatLite::kMessageSetTypeIdTag: {\n        uint32 type_id;\n        if (!input->ReadVarint32(&type_id)) return false;\n        fake_tag = WireFormatLite::MakeTag(type_id,\n            WireFormatLite::WIRETYPE_LENGTH_DELIMITED);\n\n        if (!message_data.empty()) {\n          // We saw some message data before the type_id.  Have to parse it\n          // now.\n          io::CodedInputStream sub_input(\n              reinterpret_cast<const uint8*>(message_data.data()),\n              message_data.size());\n          if (!ParseField(fake_tag, &sub_input,\n                          extension_finder, field_skipper)) {\n            return false;\n          }\n          message_data.clear();\n        }\n\n        break;\n      }\n\n      case WireFormatLite::kMessageSetMessageTag: {\n        if (fake_tag == 0) {\n          // We haven't seen a type_id yet.  Append this data to message_data.\n          string temp;\n          uint32 length;\n          if (!input->ReadVarint32(&length)) return false;\n          if (!input->ReadString(&temp, length)) return false;\n          message_data.append(temp);\n        } else {\n          // Already saw type_id, so we can parse this directly.\n          if (!ParseField(fake_tag, input,\n                          extension_finder, field_skipper)) {\n            return false;\n          }\n        }\n\n        break;\n      }\n\n      case WireFormatLite::kMessageSetItemEndTag: {\n        return true;\n      }\n\n      default: {\n        if (!field_skipper->SkipField(input, tag)) return false;\n      }\n    }\n  }\n}\n\nvoid ExtensionSet::SerializeWithCachedSizes(\n    int start_field_number, int end_field_number,\n    io::CodedOutputStream* output) const {\n  map<int, Extension>::const_iterator iter;\n  for (iter = extensions_.lower_bound(start_field_number);\n       iter != extensions_.end() && iter->first < end_field_number;\n       ++iter) {\n    iter->second.SerializeFieldWithCachedSizes(iter->first, output);\n  }\n}\n\nvoid ExtensionSet::SerializeMessageSetWithCachedSizes(\n    io::CodedOutputStream* output) const {\n  map<int, Extension>::const_iterator iter;\n  for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) {\n    iter->second.SerializeMessageSetItemWithCachedSizes(iter->first, output);\n  }\n}\n\nint ExtensionSet::ByteSize() const {\n  int total_size = 0;\n\n  for (map<int, Extension>::const_iterator iter = extensions_.begin();\n       iter != extensions_.end(); ++iter) {\n    total_size += iter->second.ByteSize(iter->first);\n  }\n\n  return total_size;\n}\n\nint ExtensionSet::MessageSetByteSize() const {\n  int total_size = 0;\n\n  for (map<int, Extension>::const_iterator iter = extensions_.begin();\n       iter != extensions_.end(); ++iter) {\n    total_size += iter->second.MessageSetItemByteSize(iter->first);\n  }\n\n  return total_size;\n}\n\n// Defined in extension_set_heavy.cc.\n// int ExtensionSet::SpaceUsedExcludingSelf() const\n\nbool ExtensionSet::MaybeNewExtension(int number,\n                                     const FieldDescriptor* descriptor,\n                                     Extension** result) {\n  pair<map<int, Extension>::iterator, bool> insert_result =\n      extensions_.insert(make_pair(number, Extension()));\n  *result = &insert_result.first->second;\n  (*result)->descriptor = descriptor;\n  return insert_result.second;\n}\n\n// ===================================================================\n// Methods of ExtensionSet::Extension\n\nvoid ExtensionSet::Extension::Clear() {\n  if (is_repeated) {\n    switch (cpp_type(type)) {\n#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                          \\\n      case WireFormatLite::CPPTYPE_##UPPERCASE:                    \\\n        repeated_##LOWERCASE##_value->Clear();                     \\\n        break\n\n      HANDLE_TYPE(  INT32,   int32);\n      HANDLE_TYPE(  INT64,   int64);\n      HANDLE_TYPE( UINT32,  uint32);\n      HANDLE_TYPE( UINT64,  uint64);\n      HANDLE_TYPE(  FLOAT,   float);\n      HANDLE_TYPE( DOUBLE,  double);\n      HANDLE_TYPE(   BOOL,    bool);\n      HANDLE_TYPE(   ENUM,    enum);\n      HANDLE_TYPE( STRING,  string);\n      HANDLE_TYPE(MESSAGE, message);\n#undef HANDLE_TYPE\n    }\n  } else {\n    if (!is_cleared) {\n      switch (cpp_type(type)) {\n        case WireFormatLite::CPPTYPE_STRING:\n          string_value->clear();\n          break;\n        case WireFormatLite::CPPTYPE_MESSAGE:\n          message_value->Clear();\n          break;\n        default:\n          // No need to do anything.  Get*() will return the default value\n          // as long as is_cleared is true and Set*() will overwrite the\n          // previous value.\n          break;\n      }\n\n      is_cleared = true;\n    }\n  }\n}\n\nvoid ExtensionSet::Extension::SerializeFieldWithCachedSizes(\n    int number,\n    io::CodedOutputStream* output) const {\n  if (is_repeated) {\n    if (is_packed) {\n      if (cached_size == 0) return;\n\n      WireFormatLite::WriteTag(number,\n          WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);\n      output->WriteVarint32(cached_size);\n\n      switch (real_type(type)) {\n#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \\\n        case WireFormatLite::TYPE_##UPPERCASE:                              \\\n          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \\\n            WireFormatLite::Write##CAMELCASE##NoTag(                        \\\n              repeated_##LOWERCASE##_value->Get(i), output);                \\\n          }                                                                 \\\n          break\n\n        HANDLE_TYPE(   INT32,    Int32,   int32);\n        HANDLE_TYPE(   INT64,    Int64,   int64);\n        HANDLE_TYPE(  UINT32,   UInt32,  uint32);\n        HANDLE_TYPE(  UINT64,   UInt64,  uint64);\n        HANDLE_TYPE(  SINT32,   SInt32,   int32);\n        HANDLE_TYPE(  SINT64,   SInt64,   int64);\n        HANDLE_TYPE( FIXED32,  Fixed32,  uint32);\n        HANDLE_TYPE( FIXED64,  Fixed64,  uint64);\n        HANDLE_TYPE(SFIXED32, SFixed32,   int32);\n        HANDLE_TYPE(SFIXED64, SFixed64,   int64);\n        HANDLE_TYPE(   FLOAT,    Float,   float);\n        HANDLE_TYPE(  DOUBLE,   Double,  double);\n        HANDLE_TYPE(    BOOL,     Bool,    bool);\n        HANDLE_TYPE(    ENUM,     Enum,    enum);\n#undef HANDLE_TYPE\n\n        case WireFormatLite::TYPE_STRING:\n        case WireFormatLite::TYPE_BYTES:\n        case WireFormatLite::TYPE_GROUP:\n        case WireFormatLite::TYPE_MESSAGE:\n          GOOGLE_LOG(FATAL) << \"Non-primitive types can't be packed.\";\n          break;\n      }\n    } else {\n      switch (real_type(type)) {\n#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \\\n        case WireFormatLite::TYPE_##UPPERCASE:                              \\\n          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \\\n            WireFormatLite::Write##CAMELCASE(number,                        \\\n              repeated_##LOWERCASE##_value->Get(i), output);                \\\n          }                                                                 \\\n          break\n\n        HANDLE_TYPE(   INT32,    Int32,   int32);\n        HANDLE_TYPE(   INT64,    Int64,   int64);\n        HANDLE_TYPE(  UINT32,   UInt32,  uint32);\n        HANDLE_TYPE(  UINT64,   UInt64,  uint64);\n        HANDLE_TYPE(  SINT32,   SInt32,   int32);\n        HANDLE_TYPE(  SINT64,   SInt64,   int64);\n        HANDLE_TYPE( FIXED32,  Fixed32,  uint32);\n        HANDLE_TYPE( FIXED64,  Fixed64,  uint64);\n        HANDLE_TYPE(SFIXED32, SFixed32,   int32);\n        HANDLE_TYPE(SFIXED64, SFixed64,   int64);\n        HANDLE_TYPE(   FLOAT,    Float,   float);\n        HANDLE_TYPE(  DOUBLE,   Double,  double);\n        HANDLE_TYPE(    BOOL,     Bool,    bool);\n        HANDLE_TYPE(  STRING,   String,  string);\n        HANDLE_TYPE(   BYTES,    Bytes,  string);\n        HANDLE_TYPE(    ENUM,     Enum,    enum);\n        HANDLE_TYPE(   GROUP,    Group, message);\n        HANDLE_TYPE( MESSAGE,  Message, message);\n#undef HANDLE_TYPE\n      }\n    }\n  } else if (!is_cleared) {\n    switch (real_type(type)) {\n#define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE)                 \\\n      case WireFormatLite::TYPE_##UPPERCASE:                     \\\n        WireFormatLite::Write##CAMELCASE(number, VALUE, output); \\\n        break\n\n      HANDLE_TYPE(   INT32,    Int32,    int32_value);\n      HANDLE_TYPE(   INT64,    Int64,    int64_value);\n      HANDLE_TYPE(  UINT32,   UInt32,   uint32_value);\n      HANDLE_TYPE(  UINT64,   UInt64,   uint64_value);\n      HANDLE_TYPE(  SINT32,   SInt32,    int32_value);\n      HANDLE_TYPE(  SINT64,   SInt64,    int64_value);\n      HANDLE_TYPE( FIXED32,  Fixed32,   uint32_value);\n      HANDLE_TYPE( FIXED64,  Fixed64,   uint64_value);\n      HANDLE_TYPE(SFIXED32, SFixed32,    int32_value);\n      HANDLE_TYPE(SFIXED64, SFixed64,    int64_value);\n      HANDLE_TYPE(   FLOAT,    Float,    float_value);\n      HANDLE_TYPE(  DOUBLE,   Double,   double_value);\n      HANDLE_TYPE(    BOOL,     Bool,     bool_value);\n      HANDLE_TYPE(  STRING,   String,  *string_value);\n      HANDLE_TYPE(   BYTES,    Bytes,  *string_value);\n      HANDLE_TYPE(    ENUM,     Enum,     enum_value);\n      HANDLE_TYPE(   GROUP,    Group, *message_value);\n      HANDLE_TYPE( MESSAGE,  Message, *message_value);\n#undef HANDLE_TYPE\n    }\n  }\n}\n\nvoid ExtensionSet::Extension::SerializeMessageSetItemWithCachedSizes(\n    int number,\n    io::CodedOutputStream* output) const {\n  if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) {\n    // Not a valid MessageSet extension, but serialize it the normal way.\n    SerializeFieldWithCachedSizes(number, output);\n    return;\n  }\n\n  if (is_cleared) return;\n\n  // Start group.\n  output->WriteTag(WireFormatLite::kMessageSetItemStartTag);\n\n  // Write type ID.\n  WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber,\n                              number,\n                              output);\n  // Write message.\n  WireFormatLite::WriteMessageMaybeToArray(\n      WireFormatLite::kMessageSetMessageNumber,\n      *message_value,\n      output);\n\n  // End group.\n  output->WriteTag(WireFormatLite::kMessageSetItemEndTag);\n}\n\nint ExtensionSet::Extension::ByteSize(int number) const {\n  int result = 0;\n\n  if (is_repeated) {\n    if (is_packed) {\n      switch (real_type(type)) {\n#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \\\n        case WireFormatLite::TYPE_##UPPERCASE:                              \\\n          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \\\n            result += WireFormatLite::CAMELCASE##Size(                      \\\n              repeated_##LOWERCASE##_value->Get(i));                        \\\n          }                                                                 \\\n          break\n\n        HANDLE_TYPE(   INT32,    Int32,   int32);\n        HANDLE_TYPE(   INT64,    Int64,   int64);\n        HANDLE_TYPE(  UINT32,   UInt32,  uint32);\n        HANDLE_TYPE(  UINT64,   UInt64,  uint64);\n        HANDLE_TYPE(  SINT32,   SInt32,   int32);\n        HANDLE_TYPE(  SINT64,   SInt64,   int64);\n        HANDLE_TYPE(    ENUM,     Enum,    enum);\n#undef HANDLE_TYPE\n\n        // Stuff with fixed size.\n#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \\\n        case WireFormatLite::TYPE_##UPPERCASE:                              \\\n          result += WireFormatLite::k##CAMELCASE##Size *                    \\\n                    repeated_##LOWERCASE##_value->size();                   \\\n          break\n        HANDLE_TYPE( FIXED32,  Fixed32, uint32);\n        HANDLE_TYPE( FIXED64,  Fixed64, uint64);\n        HANDLE_TYPE(SFIXED32, SFixed32,  int32);\n        HANDLE_TYPE(SFIXED64, SFixed64,  int64);\n        HANDLE_TYPE(   FLOAT,    Float,  float);\n        HANDLE_TYPE(  DOUBLE,   Double, double);\n        HANDLE_TYPE(    BOOL,     Bool,   bool);\n#undef HANDLE_TYPE\n\n        case WireFormatLite::TYPE_STRING:\n        case WireFormatLite::TYPE_BYTES:\n        case WireFormatLite::TYPE_GROUP:\n        case WireFormatLite::TYPE_MESSAGE:\n          GOOGLE_LOG(FATAL) << \"Non-primitive types can't be packed.\";\n          break;\n      }\n\n      cached_size = result;\n      if (result > 0) {\n        result += io::CodedOutputStream::VarintSize32(result);\n        result += io::CodedOutputStream::VarintSize32(\n            WireFormatLite::MakeTag(number,\n                WireFormatLite::WIRETYPE_LENGTH_DELIMITED));\n      }\n    } else {\n      int tag_size = WireFormatLite::TagSize(number, real_type(type));\n\n      switch (real_type(type)) {\n#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \\\n        case WireFormatLite::TYPE_##UPPERCASE:                              \\\n          result += tag_size * repeated_##LOWERCASE##_value->size();        \\\n          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \\\n            result += WireFormatLite::CAMELCASE##Size(                      \\\n              repeated_##LOWERCASE##_value->Get(i));                        \\\n          }                                                                 \\\n          break\n\n        HANDLE_TYPE(   INT32,    Int32,   int32);\n        HANDLE_TYPE(   INT64,    Int64,   int64);\n        HANDLE_TYPE(  UINT32,   UInt32,  uint32);\n        HANDLE_TYPE(  UINT64,   UInt64,  uint64);\n        HANDLE_TYPE(  SINT32,   SInt32,   int32);\n        HANDLE_TYPE(  SINT64,   SInt64,   int64);\n        HANDLE_TYPE(  STRING,   String,  string);\n        HANDLE_TYPE(   BYTES,    Bytes,  string);\n        HANDLE_TYPE(    ENUM,     Enum,    enum);\n        HANDLE_TYPE(   GROUP,    Group, message);\n        HANDLE_TYPE( MESSAGE,  Message, message);\n#undef HANDLE_TYPE\n\n        // Stuff with fixed size.\n#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \\\n        case WireFormatLite::TYPE_##UPPERCASE:                              \\\n          result += (tag_size + WireFormatLite::k##CAMELCASE##Size) *       \\\n                    repeated_##LOWERCASE##_value->size();                   \\\n          break\n        HANDLE_TYPE( FIXED32,  Fixed32, uint32);\n        HANDLE_TYPE( FIXED64,  Fixed64, uint64);\n        HANDLE_TYPE(SFIXED32, SFixed32,  int32);\n        HANDLE_TYPE(SFIXED64, SFixed64,  int64);\n        HANDLE_TYPE(   FLOAT,    Float,  float);\n        HANDLE_TYPE(  DOUBLE,   Double, double);\n        HANDLE_TYPE(    BOOL,     Bool,   bool);\n#undef HANDLE_TYPE\n      }\n    }\n  } else if (!is_cleared) {\n    result += WireFormatLite::TagSize(number, real_type(type));\n    switch (real_type(type)) {\n#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                      \\\n      case WireFormatLite::TYPE_##UPPERCASE:                              \\\n        result += WireFormatLite::CAMELCASE##Size(LOWERCASE);             \\\n        break\n\n      HANDLE_TYPE(   INT32,    Int32,    int32_value);\n      HANDLE_TYPE(   INT64,    Int64,    int64_value);\n      HANDLE_TYPE(  UINT32,   UInt32,   uint32_value);\n      HANDLE_TYPE(  UINT64,   UInt64,   uint64_value);\n      HANDLE_TYPE(  SINT32,   SInt32,    int32_value);\n      HANDLE_TYPE(  SINT64,   SInt64,    int64_value);\n      HANDLE_TYPE(  STRING,   String,  *string_value);\n      HANDLE_TYPE(   BYTES,    Bytes,  *string_value);\n      HANDLE_TYPE(    ENUM,     Enum,     enum_value);\n      HANDLE_TYPE(   GROUP,    Group, *message_value);\n      HANDLE_TYPE( MESSAGE,  Message, *message_value);\n#undef HANDLE_TYPE\n\n      // Stuff with fixed size.\n#define HANDLE_TYPE(UPPERCASE, CAMELCASE)                                 \\\n      case WireFormatLite::TYPE_##UPPERCASE:                              \\\n        result += WireFormatLite::k##CAMELCASE##Size;                     \\\n        break\n      HANDLE_TYPE( FIXED32,  Fixed32);\n      HANDLE_TYPE( FIXED64,  Fixed64);\n      HANDLE_TYPE(SFIXED32, SFixed32);\n      HANDLE_TYPE(SFIXED64, SFixed64);\n      HANDLE_TYPE(   FLOAT,    Float);\n      HANDLE_TYPE(  DOUBLE,   Double);\n      HANDLE_TYPE(    BOOL,     Bool);\n#undef HANDLE_TYPE\n    }\n  }\n\n  return result;\n}\n\nint ExtensionSet::Extension::MessageSetItemByteSize(int number) const {\n  if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) {\n    // Not a valid MessageSet extension, but compute the byte size for it the\n    // normal way.\n    return ByteSize(number);\n  }\n\n  if (is_cleared) return 0;\n\n  int our_size = WireFormatLite::kMessageSetItemTagsSize;\n\n  // type_id\n  our_size += io::CodedOutputStream::VarintSize32(number);\n\n  // message\n  int message_size = message_value->ByteSize();\n\n  our_size += io::CodedOutputStream::VarintSize32(message_size);\n  our_size += message_size;\n\n  return our_size;\n}\n\nint ExtensionSet::Extension::GetSize() const {\n  GOOGLE_DCHECK(is_repeated);\n  switch (cpp_type(type)) {\n#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                        \\\n    case WireFormatLite::CPPTYPE_##UPPERCASE:                    \\\n      return repeated_##LOWERCASE##_value->size()\n\n    HANDLE_TYPE(  INT32,   int32);\n    HANDLE_TYPE(  INT64,   int64);\n    HANDLE_TYPE( UINT32,  uint32);\n    HANDLE_TYPE( UINT64,  uint64);\n    HANDLE_TYPE(  FLOAT,   float);\n    HANDLE_TYPE( DOUBLE,  double);\n    HANDLE_TYPE(   BOOL,    bool);\n    HANDLE_TYPE(   ENUM,    enum);\n    HANDLE_TYPE( STRING,  string);\n    HANDLE_TYPE(MESSAGE, message);\n#undef HANDLE_TYPE\n  }\n\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n  return 0;\n}\n\nvoid ExtensionSet::Extension::Free() {\n  if (is_repeated) {\n    switch (cpp_type(type)) {\n#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                          \\\n      case WireFormatLite::CPPTYPE_##UPPERCASE:                    \\\n        delete repeated_##LOWERCASE##_value;                       \\\n        break\n\n      HANDLE_TYPE(  INT32,   int32);\n      HANDLE_TYPE(  INT64,   int64);\n      HANDLE_TYPE( UINT32,  uint32);\n      HANDLE_TYPE( UINT64,  uint64);\n      HANDLE_TYPE(  FLOAT,   float);\n      HANDLE_TYPE( DOUBLE,  double);\n      HANDLE_TYPE(   BOOL,    bool);\n      HANDLE_TYPE(   ENUM,    enum);\n      HANDLE_TYPE( STRING,  string);\n      HANDLE_TYPE(MESSAGE, message);\n#undef HANDLE_TYPE\n    }\n  } else {\n    switch (cpp_type(type)) {\n      case WireFormatLite::CPPTYPE_STRING:\n        delete string_value;\n        break;\n      case WireFormatLite::CPPTYPE_MESSAGE:\n        delete message_value;\n        break;\n      default:\n        break;\n    }\n  }\n}\n\n// Defined in extension_set_heavy.cc.\n// int ExtensionSet::Extension::SpaceUsedExcludingSelf() const\n\n}  // namespace internal\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This header is logically internal, but is made public because it is used\n// from protocol-compiler-generated code, which may reside in other components.\n\n#ifndef GOOGLE_PROTOBUF_EXTENSION_SET_H__\n#define GOOGLE_PROTOBUF_EXTENSION_SET_H__\n\n#include <vector>\n#include <map>\n#include <utility>\n#include <string>\n\n\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\n\nnamespace protobuf {\n  class Descriptor;                                    // descriptor.h\n  class FieldDescriptor;                               // descriptor.h\n  class DescriptorPool;                                // descriptor.h\n  class MessageLite;                                   // message_lite.h\n  class Message;                                       // message.h\n  class MessageFactory;                                // message.h\n  class UnknownFieldSet;                               // unknown_field_set.h\n  namespace io {\n    class CodedInputStream;                              // coded_stream.h\n    class CodedOutputStream;                             // coded_stream.h\n  }\n  namespace internal {\n    class FieldSkipper;                                  // wire_format_lite.h\n    class RepeatedPtrFieldBase;                          // repeated_field.h\n  }\n  template <typename Element> class RepeatedField;     // repeated_field.h\n  template <typename Element> class RepeatedPtrField;  // repeated_field.h\n}\n\nnamespace protobuf {\nnamespace internal {\n\n// Used to store values of type WireFormatLite::FieldType without having to\n// #include wire_format_lite.h.  Also, ensures that we use only one byte to\n// store these values, which is important to keep the layout of\n// ExtensionSet::Extension small.\ntypedef uint8 FieldType;\n\n// A function which, given an integer value, returns true if the number\n// matches one of the defined values for the corresponding enum type.  This\n// is used with RegisterEnumExtension, below.\ntypedef bool EnumValidityFunc(int number);\n\n// Version of the above which takes an argument.  This is needed to deal with\n// extensions that are not compiled in.\ntypedef bool EnumValidityFuncWithArg(const void* arg, int number);\n\n// Information about a registered extension.\nstruct ExtensionInfo {\n  inline ExtensionInfo() {}\n  inline ExtensionInfo(FieldType type, bool is_repeated, bool is_packed)\n      : type(type), is_repeated(is_repeated), is_packed(is_packed),\n        descriptor(NULL) {}\n\n  FieldType type;\n  bool is_repeated;\n  bool is_packed;\n\n  struct EnumValidityCheck {\n    EnumValidityFuncWithArg* func;\n    const void* arg;\n  };\n\n  union {\n    EnumValidityCheck enum_validity_check;\n    const MessageLite* message_prototype;\n  };\n\n  // The descriptor for this extension, if one exists and is known.  May be\n  // NULL.  Must not be NULL if the descriptor for the extension does not\n  // live in the same pool as the descriptor for the containing type.\n  const FieldDescriptor* descriptor;\n};\n\n// Abstract interface for an object which looks up extension definitions.  Used\n// when parsing.\nclass LIBPROTOBUF_EXPORT ExtensionFinder {\n public:\n  virtual ~ExtensionFinder();\n\n  // Find the extension with the given containing type and number.\n  virtual bool Find(int number, ExtensionInfo* output) = 0;\n};\n\n// Implementation of ExtensionFinder which finds extensions defined in .proto\n// files which have been compiled into the binary.\nclass LIBPROTOBUF_EXPORT GeneratedExtensionFinder : public ExtensionFinder {\n public:\n  GeneratedExtensionFinder(const MessageLite* containing_type)\n      : containing_type_(containing_type) {}\n  virtual ~GeneratedExtensionFinder() {}\n\n  // Returns true and fills in *output if found, otherwise returns false.\n  virtual bool Find(int number, ExtensionInfo* output);\n\n private:\n  const MessageLite* containing_type_;\n};\n\n// Note:  extension_set_heavy.cc defines DescriptorPoolExtensionFinder for\n// finding extensions from a DescriptorPool.\n\n// This is an internal helper class intended for use within the protocol buffer\n// library and generated classes.  Clients should not use it directly.  Instead,\n// use the generated accessors such as GetExtension() of the class being\n// extended.\n//\n// This class manages extensions for a protocol message object.  The\n// message's HasExtension(), GetExtension(), MutableExtension(), and\n// ClearExtension() methods are just thin wrappers around the embedded\n// ExtensionSet.  When parsing, if a tag number is encountered which is\n// inside one of the message type's extension ranges, the tag is passed\n// off to the ExtensionSet for parsing.  Etc.\nclass LIBPROTOBUF_EXPORT ExtensionSet {\n public:\n  ExtensionSet();\n  ~ExtensionSet();\n\n  // These are called at startup by protocol-compiler-generated code to\n  // register known extensions.  The registrations are used by ParseField()\n  // to look up extensions for parsed field numbers.  Note that dynamic parsing\n  // does not use ParseField(); only protocol-compiler-generated parsing\n  // methods do.\n  static void RegisterExtension(const MessageLite* containing_type,\n                                int number, FieldType type,\n                                bool is_repeated, bool is_packed);\n  static void RegisterEnumExtension(const MessageLite* containing_type,\n                                    int number, FieldType type,\n                                    bool is_repeated, bool is_packed,\n                                    EnumValidityFunc* is_valid);\n  static void RegisterMessageExtension(const MessageLite* containing_type,\n                                       int number, FieldType type,\n                                       bool is_repeated, bool is_packed,\n                                       const MessageLite* prototype);\n\n  // =================================================================\n\n  // Add all fields which are currently present to the given vector.  This\n  // is useful to implement Reflection::ListFields().\n  void AppendToList(const Descriptor* containing_type,\n                    const DescriptorPool* pool,\n                    vector<const FieldDescriptor*>* output) const;\n\n  // =================================================================\n  // Accessors\n  //\n  // Generated message classes include type-safe templated wrappers around\n  // these methods.  Generally you should use those rather than call these\n  // directly, unless you are doing low-level memory management.\n  //\n  // When calling any of these accessors, the extension number requested\n  // MUST exist in the DescriptorPool provided to the constructor.  Otheriwse,\n  // the method will fail an assert.  Normally, though, you would not call\n  // these directly; you would either call the generated accessors of your\n  // message class (e.g. GetExtension()) or you would call the accessors\n  // of the reflection interface.  In both cases, it is impossible to\n  // trigger this assert failure:  the generated accessors only accept\n  // linked-in extension types as parameters, while the Reflection interface\n  // requires you to provide the FieldDescriptor describing the extension.\n  //\n  // When calling any of these accessors, a protocol-compiler-generated\n  // implementation of the extension corresponding to the number MUST\n  // be linked in, and the FieldDescriptor used to refer to it MUST be\n  // the one generated by that linked-in code.  Otherwise, the method will\n  // die on an assert failure.  The message objects returned by the message\n  // accessors are guaranteed to be of the correct linked-in type.\n  //\n  // These methods pretty much match Reflection except that:\n  // - They're not virtual.\n  // - They identify fields by number rather than FieldDescriptors.\n  // - They identify enum values using integers rather than descriptors.\n  // - Strings provide Mutable() in addition to Set() accessors.\n\n  bool Has(int number) const;\n  int ExtensionSize(int number) const;   // Size of a repeated extension.\n  FieldType ExtensionType(int number) const;\n  void ClearExtension(int number);\n\n  // singular fields -------------------------------------------------\n\n  int32  GetInt32 (int number, int32  default_value) const;\n  int64  GetInt64 (int number, int64  default_value) const;\n  uint32 GetUInt32(int number, uint32 default_value) const;\n  uint64 GetUInt64(int number, uint64 default_value) const;\n  float  GetFloat (int number, float  default_value) const;\n  double GetDouble(int number, double default_value) const;\n  bool   GetBool  (int number, bool   default_value) const;\n  int    GetEnum  (int number, int    default_value) const;\n  const string & GetString (int number, const string&  default_value) const;\n  const MessageLite& GetMessage(int number,\n                                const MessageLite& default_value) const;\n  const MessageLite& GetMessage(int number, const Descriptor* message_type,\n                                MessageFactory* factory) const;\n\n  // |descriptor| may be NULL so long as it is known that the descriptor for\n  // the extension lives in the same pool as the descriptor for the containing\n  // type.\n#define desc const FieldDescriptor* descriptor  // avoid line wrapping\n  void SetInt32 (int number, FieldType type, int32  value, desc);\n  void SetInt64 (int number, FieldType type, int64  value, desc);\n  void SetUInt32(int number, FieldType type, uint32 value, desc);\n  void SetUInt64(int number, FieldType type, uint64 value, desc);\n  void SetFloat (int number, FieldType type, float  value, desc);\n  void SetDouble(int number, FieldType type, double value, desc);\n  void SetBool  (int number, FieldType type, bool   value, desc);\n  void SetEnum  (int number, FieldType type, int    value, desc);\n  void SetString(int number, FieldType type, const string& value, desc);\n  string * MutableString (int number, FieldType type, desc);\n  MessageLite* MutableMessage(int number, FieldType type,\n                              const MessageLite& prototype, desc);\n  MessageLite* MutableMessage(const FieldDescriptor* decsriptor,\n                              MessageFactory* factory);\n#undef desc\n\n  // repeated fields -------------------------------------------------\n\n  int32  GetRepeatedInt32 (int number, int index) const;\n  int64  GetRepeatedInt64 (int number, int index) const;\n  uint32 GetRepeatedUInt32(int number, int index) const;\n  uint64 GetRepeatedUInt64(int number, int index) const;\n  float  GetRepeatedFloat (int number, int index) const;\n  double GetRepeatedDouble(int number, int index) const;\n  bool   GetRepeatedBool  (int number, int index) const;\n  int    GetRepeatedEnum  (int number, int index) const;\n  const string & GetRepeatedString (int number, int index) const;\n  const MessageLite& GetRepeatedMessage(int number, int index) const;\n\n  void SetRepeatedInt32 (int number, int index, int32  value);\n  void SetRepeatedInt64 (int number, int index, int64  value);\n  void SetRepeatedUInt32(int number, int index, uint32 value);\n  void SetRepeatedUInt64(int number, int index, uint64 value);\n  void SetRepeatedFloat (int number, int index, float  value);\n  void SetRepeatedDouble(int number, int index, double value);\n  void SetRepeatedBool  (int number, int index, bool   value);\n  void SetRepeatedEnum  (int number, int index, int    value);\n  void SetRepeatedString(int number, int index, const string& value);\n  string * MutableRepeatedString (int number, int index);\n  MessageLite* MutableRepeatedMessage(int number, int index);\n\n#define desc const FieldDescriptor* descriptor  // avoid line wrapping\n  void AddInt32 (int number, FieldType type, bool packed, int32  value, desc);\n  void AddInt64 (int number, FieldType type, bool packed, int64  value, desc);\n  void AddUInt32(int number, FieldType type, bool packed, uint32 value, desc);\n  void AddUInt64(int number, FieldType type, bool packed, uint64 value, desc);\n  void AddFloat (int number, FieldType type, bool packed, float  value, desc);\n  void AddDouble(int number, FieldType type, bool packed, double value, desc);\n  void AddBool  (int number, FieldType type, bool packed, bool   value, desc);\n  void AddEnum  (int number, FieldType type, bool packed, int    value, desc);\n  void AddString(int number, FieldType type, const string& value, desc);\n  string * AddString (int number, FieldType type, desc);\n  MessageLite* AddMessage(int number, FieldType type,\n                          const MessageLite& prototype, desc);\n  MessageLite* AddMessage(const FieldDescriptor* descriptor,\n                          MessageFactory* factory);\n#undef desc\n\n  void RemoveLast(int number);\n  void SwapElements(int number, int index1, int index2);\n\n  // -----------------------------------------------------------------\n  // TODO(kenton):  Hardcore memory management accessors\n\n  // =================================================================\n  // convenience methods for implementing methods of Message\n  //\n  // These could all be implemented in terms of the other methods of this\n  // class, but providing them here helps keep the generated code size down.\n\n  void Clear();\n  void MergeFrom(const ExtensionSet& other);\n  void Swap(ExtensionSet* other);\n  bool IsInitialized() const;\n\n  // Parses a single extension from the input.  The input should start out\n  // positioned immediately after the tag.  |containing_type| is the default\n  // instance for the containing message; it is used only to look up the\n  // extension by number.  See RegisterExtension(), above.  Unlike the other\n  // methods of ExtensionSet, this only works for generated message types --\n  // it looks up extensions registered using RegisterExtension().\n  bool ParseField(uint32 tag, io::CodedInputStream* input,\n                  ExtensionFinder* extension_finder,\n                  FieldSkipper* field_skipper);\n\n  // Specific versions for lite or full messages (constructs the appropriate\n  // FieldSkipper automatically).\n  bool ParseField(uint32 tag, io::CodedInputStream* input,\n                  const MessageLite* containing_type);\n  bool ParseField(uint32 tag, io::CodedInputStream* input,\n                  const Message* containing_type,\n                  UnknownFieldSet* unknown_fields);\n\n  // Parse an entire message in MessageSet format.  Such messages have no\n  // fields, only extensions.\n  bool ParseMessageSet(io::CodedInputStream* input,\n                       ExtensionFinder* extension_finder,\n                       FieldSkipper* field_skipper);\n\n  // Specific versions for lite or full messages (constructs the appropriate\n  // FieldSkipper automatically).\n  bool ParseMessageSet(io::CodedInputStream* input,\n                       const MessageLite* containing_type);\n  bool ParseMessageSet(io::CodedInputStream* input,\n                       const Message* containing_type,\n                       UnknownFieldSet* unknown_fields);\n\n  // Write all extension fields with field numbers in the range\n  //   [start_field_number, end_field_number)\n  // to the output stream, using the cached sizes computed when ByteSize() was\n  // last called.  Note that the range bounds are inclusive-exclusive.\n  void SerializeWithCachedSizes(int start_field_number,\n                                int end_field_number,\n                                io::CodedOutputStream* output) const;\n\n  // Same as SerializeWithCachedSizes, but without any bounds checking.\n  // The caller must ensure that target has sufficient capacity for the\n  // serialized extensions.\n  //\n  // Returns a pointer past the last written byte.\n  uint8* SerializeWithCachedSizesToArray(int start_field_number,\n                                         int end_field_number,\n                                         uint8* target) const;\n\n  // Like above but serializes in MessageSet format.\n  void SerializeMessageSetWithCachedSizes(io::CodedOutputStream* output) const;\n  uint8* SerializeMessageSetWithCachedSizesToArray(uint8* target) const;\n\n  // Returns the total serialized size of all the extensions.\n  int ByteSize() const;\n\n  // Like ByteSize() but uses MessageSet format.\n  int MessageSetByteSize() const;\n\n  // Returns (an estimate of) the total number of bytes used for storing the\n  // extensions in memory, excluding sizeof(*this).  If the ExtensionSet is\n  // for a lite message (and thus possibly contains lite messages), the results\n  // are undefined (might work, might crash, might corrupt data, might not even\n  // be linked in).  It's up to the protocol compiler to avoid calling this on\n  // such ExtensionSets (easy enough since lite messages don't implement\n  // SpaceUsed()).\n  int SpaceUsedExcludingSelf() const;\n\n private:\n\n  struct Extension {\n    union {\n      int32        int32_value;\n      int64        int64_value;\n      uint32       uint32_value;\n      uint64       uint64_value;\n      float        float_value;\n      double       double_value;\n      bool         bool_value;\n      int          enum_value;\n      string*      string_value;\n      MessageLite* message_value;\n\n      RepeatedField   <int32      >* repeated_int32_value;\n      RepeatedField   <int64      >* repeated_int64_value;\n      RepeatedField   <uint32     >* repeated_uint32_value;\n      RepeatedField   <uint64     >* repeated_uint64_value;\n      RepeatedField   <float      >* repeated_float_value;\n      RepeatedField   <double     >* repeated_double_value;\n      RepeatedField   <bool       >* repeated_bool_value;\n      RepeatedField   <int        >* repeated_enum_value;\n      RepeatedPtrField<string     >* repeated_string_value;\n      RepeatedPtrField<MessageLite>* repeated_message_value;\n    };\n\n    FieldType type;\n    bool is_repeated;\n\n    // For singular types, indicates if the extension is \"cleared\".  This\n    // happens when an extension is set and then later cleared by the caller.\n    // We want to keep the Extension object around for reuse, so instead of\n    // removing it from the map, we just set is_cleared = true.  This has no\n    // meaning for repeated types; for those, the size of the RepeatedField\n    // simply becomes zero when cleared.\n    bool is_cleared;\n\n    // For repeated types, this indicates if the [packed=true] option is set.\n    bool is_packed;\n\n    // The descriptor for this extension, if one exists and is known.  May be\n    // NULL.  Must not be NULL if the descriptor for the extension does not\n    // live in the same pool as the descriptor for the containing type.\n    const FieldDescriptor* descriptor;\n\n    // For packed fields, the size of the packed data is recorded here when\n    // ByteSize() is called then used during serialization.\n    // TODO(kenton):  Use atomic<int> when C++ supports it.\n    mutable int cached_size;\n\n    // Some helper methods for operations on a single Extension.\n    void SerializeFieldWithCachedSizes(\n        int number,\n        io::CodedOutputStream* output) const;\n    uint8* SerializeFieldWithCachedSizesToArray(\n        int number,\n        uint8* target) const;\n    void SerializeMessageSetItemWithCachedSizes(\n        int number,\n        io::CodedOutputStream* output) const;\n    uint8* SerializeMessageSetItemWithCachedSizesToArray(\n        int number,\n        uint8* target) const;\n    int ByteSize(int number) const;\n    int MessageSetItemByteSize(int number) const;\n    void Clear();\n    int GetSize() const;\n    void Free();\n    int SpaceUsedExcludingSelf() const;\n  };\n\n\n  // Gets the extension with the given number, creating it if it does not\n  // already exist.  Returns true if the extension did not already exist.\n  bool MaybeNewExtension(int number, const FieldDescriptor* descriptor,\n                         Extension** result);\n\n  // Parse a single MessageSet item -- called just after the item group start\n  // tag has been read.\n  bool ParseMessageSetItem(io::CodedInputStream* input,\n                           ExtensionFinder* extension_finder,\n                           FieldSkipper* field_skipper);\n\n\n  // Hack:  RepeatedPtrFieldBase declares ExtensionSet as a friend.  This\n  //   friendship should automatically extend to ExtensionSet::Extension, but\n  //   unfortunately some older compilers (e.g. GCC 3.4.4) do not implement this\n  //   correctly.  So, we must provide helpers for calling methods of that\n  //   class.\n\n  // Defined in extension_set_heavy.cc.\n  static inline int RepeatedMessage_SpaceUsedExcludingSelf(\n      RepeatedPtrFieldBase* field);\n\n  // The Extension struct is small enough to be passed by value, so we use it\n  // directly as the value type in the map rather than use pointers.  We use\n  // a map rather than hash_map here because we expect most ExtensionSets will\n  // only contain a small number of extensions whereas hash_map is optimized\n  // for 100 elements or more.  Also, we want AppendToList() to order fields\n  // by field number.\n  map<int, Extension> extensions_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionSet);\n};\n\n// These are just for convenience...\ninline void ExtensionSet::SetString(int number, FieldType type,\n                                    const string& value,\n                                    const FieldDescriptor* descriptor) {\n  MutableString(number, type, descriptor)->assign(value);\n}\ninline void ExtensionSet::SetRepeatedString(int number, int index,\n                                            const string& value) {\n  MutableRepeatedString(number, index)->assign(value);\n}\ninline void ExtensionSet::AddString(int number, FieldType type,\n                                    const string& value,\n                                    const FieldDescriptor* descriptor) {\n  AddString(number, type, descriptor)->assign(value);\n}\n\n// ===================================================================\n// Glue for generated extension accessors\n\n// -------------------------------------------------------------------\n// Template magic\n\n// First we have a set of classes representing \"type traits\" for different\n// field types.  A type traits class knows how to implement basic accessors\n// for extensions of a particular type given an ExtensionSet.  The signature\n// for a type traits class looks like this:\n//\n//   class TypeTraits {\n//    public:\n//     typedef ? ConstType;\n//     typedef ? MutableType;\n//\n//     static inline ConstType Get(int number, const ExtensionSet& set);\n//     static inline void Set(int number, ConstType value, ExtensionSet* set);\n//     static inline MutableType Mutable(int number, ExtensionSet* set);\n//\n//     // Variants for repeated fields.\n//     static inline ConstType Get(int number, const ExtensionSet& set,\n//                                 int index);\n//     static inline void Set(int number, int index,\n//                            ConstType value, ExtensionSet* set);\n//     static inline MutableType Mutable(int number, int index,\n//                                       ExtensionSet* set);\n//     static inline void Add(int number, ConstType value, ExtensionSet* set);\n//     static inline MutableType Add(int number, ExtensionSet* set);\n//   };\n//\n// Not all of these methods make sense for all field types.  For example, the\n// \"Mutable\" methods only make sense for strings and messages, and the\n// repeated methods only make sense for repeated types.  So, each type\n// traits class implements only the set of methods from this signature that it\n// actually supports.  This will cause a compiler error if the user tries to\n// access an extension using a method that doesn't make sense for its type.\n// For example, if \"foo\" is an extension of type \"optional int32\", then if you\n// try to write code like:\n//   my_message.MutableExtension(foo)\n// you will get a compile error because PrimitiveTypeTraits<int32> does not\n// have a \"Mutable()\" method.\n\n// -------------------------------------------------------------------\n// PrimitiveTypeTraits\n\n// Since the ExtensionSet has different methods for each primitive type,\n// we must explicitly define the methods of the type traits class for each\n// known type.\ntemplate <typename Type>\nclass PrimitiveTypeTraits {\n public:\n  typedef Type ConstType;\n\n  static inline ConstType Get(int number, const ExtensionSet& set,\n                              ConstType default_value);\n  static inline void Set(int number, FieldType field_type,\n                         ConstType value, ExtensionSet* set);\n};\n\ntemplate <typename Type>\nclass RepeatedPrimitiveTypeTraits {\n public:\n  typedef Type ConstType;\n\n  static inline Type Get(int number, const ExtensionSet& set, int index);\n  static inline void Set(int number, int index, Type value, ExtensionSet* set);\n  static inline void Add(int number, FieldType field_type,\n                         bool is_packed, Type value, ExtensionSet* set);\n};\n\n#define PROTOBUF_DEFINE_PRIMITIVE_TYPE(TYPE, METHOD)                       \\\ntemplate<> inline TYPE PrimitiveTypeTraits<TYPE>::Get(                     \\\n    int number, const ExtensionSet& set, TYPE default_value) {             \\\n  return set.Get##METHOD(number, default_value);                           \\\n}                                                                          \\\ntemplate<> inline void PrimitiveTypeTraits<TYPE>::Set(                     \\\n    int number, FieldType field_type, TYPE value, ExtensionSet* set) {     \\\n  set->Set##METHOD(number, field_type, value, NULL);                       \\\n}                                                                          \\\n                                                                           \\\ntemplate<> inline TYPE RepeatedPrimitiveTypeTraits<TYPE>::Get(             \\\n    int number, const ExtensionSet& set, int index) {                      \\\n  return set.GetRepeated##METHOD(number, index);                           \\\n}                                                                          \\\ntemplate<> inline void RepeatedPrimitiveTypeTraits<TYPE>::Set(             \\\n    int number, int index, TYPE value, ExtensionSet* set) {                \\\n  set->SetRepeated##METHOD(number, index, value);                          \\\n}                                                                          \\\ntemplate<> inline void RepeatedPrimitiveTypeTraits<TYPE>::Add(             \\\n    int number, FieldType field_type, bool is_packed,                      \\\n    TYPE value, ExtensionSet* set) {                                       \\\n  set->Add##METHOD(number, field_type, is_packed, value, NULL);            \\\n}\n\nPROTOBUF_DEFINE_PRIMITIVE_TYPE( int32,  Int32)\nPROTOBUF_DEFINE_PRIMITIVE_TYPE( int64,  Int64)\nPROTOBUF_DEFINE_PRIMITIVE_TYPE(uint32, UInt32)\nPROTOBUF_DEFINE_PRIMITIVE_TYPE(uint64, UInt64)\nPROTOBUF_DEFINE_PRIMITIVE_TYPE( float,  Float)\nPROTOBUF_DEFINE_PRIMITIVE_TYPE(double, Double)\nPROTOBUF_DEFINE_PRIMITIVE_TYPE(  bool,   Bool)\n\n#undef PROTOBUF_DEFINE_PRIMITIVE_TYPE\n\n// -------------------------------------------------------------------\n// StringTypeTraits\n\n// Strings support both Set() and Mutable().\nclass LIBPROTOBUF_EXPORT StringTypeTraits {\n public:\n  typedef const string& ConstType;\n  typedef string* MutableType;\n\n  static inline const string& Get(int number, const ExtensionSet& set,\n                                  ConstType default_value) {\n    return set.GetString(number, default_value);\n  }\n  static inline void Set(int number, FieldType field_type,\n                         const string& value, ExtensionSet* set) {\n    set->SetString(number, field_type, value, NULL);\n  }\n  static inline string* Mutable(int number, FieldType field_type,\n                                ExtensionSet* set) {\n    return set->MutableString(number, field_type, NULL);\n  }\n};\n\nclass LIBPROTOBUF_EXPORT RepeatedStringTypeTraits {\n public:\n  typedef const string& ConstType;\n  typedef string* MutableType;\n\n  static inline const string& Get(int number, const ExtensionSet& set,\n                                  int index) {\n    return set.GetRepeatedString(number, index);\n  }\n  static inline void Set(int number, int index,\n                         const string& value, ExtensionSet* set) {\n    set->SetRepeatedString(number, index, value);\n  }\n  static inline string* Mutable(int number, int index, ExtensionSet* set) {\n    return set->MutableRepeatedString(number, index);\n  }\n  static inline void Add(int number, FieldType field_type,\n                         bool /*is_packed*/, const string& value,\n                         ExtensionSet* set) {\n    set->AddString(number, field_type, value, NULL);\n  }\n  static inline string* Add(int number, FieldType field_type,\n                            ExtensionSet* set) {\n    return set->AddString(number, field_type, NULL);\n  }\n};\n\n// -------------------------------------------------------------------\n// EnumTypeTraits\n\n// ExtensionSet represents enums using integers internally, so we have to\n// static_cast around.\ntemplate <typename Type, bool IsValid(int)>\nclass EnumTypeTraits {\n public:\n  typedef Type ConstType;\n\n  static inline ConstType Get(int number, const ExtensionSet& set,\n                              ConstType default_value) {\n    return static_cast<Type>(set.GetEnum(number, default_value));\n  }\n  static inline void Set(int number, FieldType field_type,\n                         ConstType value, ExtensionSet* set) {\n    GOOGLE_DCHECK(IsValid(value));\n    set->SetEnum(number, field_type, value, NULL);\n  }\n};\n\ntemplate <typename Type, bool IsValid(int)>\nclass RepeatedEnumTypeTraits {\n public:\n  typedef Type ConstType;\n\n  static inline ConstType Get(int number, const ExtensionSet& set, int index) {\n    return static_cast<Type>(set.GetRepeatedEnum(number, index));\n  }\n  static inline void Set(int number, int index,\n                         ConstType value, ExtensionSet* set) {\n    GOOGLE_DCHECK(IsValid(value));\n    set->SetRepeatedEnum(number, index, value);\n  }\n  static inline void Add(int number, FieldType field_type,\n                         bool is_packed, ConstType value, ExtensionSet* set) {\n    GOOGLE_DCHECK(IsValid(value));\n    set->AddEnum(number, field_type, is_packed, value, NULL);\n  }\n};\n\n// -------------------------------------------------------------------\n// MessageTypeTraits\n\n// ExtensionSet guarantees that when manipulating extensions with message\n// types, the implementation used will be the compiled-in class representing\n// that type.  So, we can static_cast down to the exact type we expect.\ntemplate <typename Type>\nclass MessageTypeTraits {\n public:\n  typedef const Type& ConstType;\n  typedef Type* MutableType;\n\n  static inline ConstType Get(int number, const ExtensionSet& set,\n                              ConstType default_value) {\n    return static_cast<const Type&>(\n        set.GetMessage(number, default_value));\n  }\n  static inline MutableType Mutable(int number, FieldType field_type,\n                                    ExtensionSet* set) {\n    return static_cast<Type*>(\n      set->MutableMessage(number, field_type, Type::default_instance(), NULL));\n  }\n};\n\ntemplate <typename Type>\nclass RepeatedMessageTypeTraits {\n public:\n  typedef const Type& ConstType;\n  typedef Type* MutableType;\n\n  static inline ConstType Get(int number, const ExtensionSet& set, int index) {\n    return static_cast<const Type&>(set.GetRepeatedMessage(number, index));\n  }\n  static inline MutableType Mutable(int number, int index, ExtensionSet* set) {\n    return static_cast<Type*>(set->MutableRepeatedMessage(number, index));\n  }\n  static inline MutableType Add(int number, FieldType field_type,\n                                ExtensionSet* set) {\n    return static_cast<Type*>(\n        set->AddMessage(number, field_type, Type::default_instance(), NULL));\n  }\n};\n\n// -------------------------------------------------------------------\n// ExtensionIdentifier\n\n// This is the type of actual extension objects.  E.g. if you have:\n//   extends Foo with optional int32 bar = 1234;\n// then \"bar\" will be defined in C++ as:\n//   ExtensionIdentifier<Foo, PrimitiveTypeTraits<int32>, 1, false> bar(1234);\n//\n// Note that we could, in theory, supply the field number as a template\n// parameter, and thus make an instance of ExtensionIdentifier have no\n// actual contents.  However, if we did that, then using at extension\n// identifier would not necessarily cause the compiler to output any sort\n// of reference to any simple defined in the extension's .pb.o file.  Some\n// linkers will actually drop object files that are not explicitly referenced,\n// but that would be bad because it would cause this extension to not be\n// registered at static initialization, and therefore using it would crash.\n\ntemplate <typename ExtendeeType, typename TypeTraitsType,\n          FieldType field_type, bool is_packed>\nclass ExtensionIdentifier {\n public:\n  typedef TypeTraitsType TypeTraits;\n  typedef ExtendeeType Extendee;\n\n  ExtensionIdentifier(int number, typename TypeTraits::ConstType default_value)\n      : number_(number), default_value_(default_value) {}\n  inline int number() const { return number_; }\n  typename TypeTraits::ConstType default_value() const {\n    return default_value_;\n  }\n\n private:\n  const int number_;\n  typename TypeTraits::ConstType default_value_;\n};\n\n// -------------------------------------------------------------------\n// Generated accessors\n\n// This macro should be expanded in the context of a generated type which\n// has extensions.\n//\n// We use \"_proto_TypeTraits\" as a type name below because \"TypeTraits\"\n// causes problems if the class has a nested message or enum type with that\n// name and \"_TypeTraits\" is technically reserved for the C++ library since\n// it starts with an underscore followed by a capital letter.\n#define GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(CLASSNAME)                        \\\n  /* Has, Size, Clear */                                                      \\\n  template <typename _proto_TypeTraits,                                       \\\n            ::google::protobuf::internal::FieldType field_type,                         \\\n            bool is_packed>                                                   \\\n  inline bool HasExtension(                                                   \\\n      const ::google::protobuf::internal::ExtensionIdentifier<                          \\\n        CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const {     \\\n    return _extensions_.Has(id.number());                                     \\\n  }                                                                           \\\n                                                                              \\\n  template <typename _proto_TypeTraits,                                       \\\n            ::google::protobuf::internal::FieldType field_type,                         \\\n            bool is_packed>                                                   \\\n  inline void ClearExtension(                                                 \\\n      const ::google::protobuf::internal::ExtensionIdentifier<                          \\\n        CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) {           \\\n    _extensions_.ClearExtension(id.number());                                 \\\n  }                                                                           \\\n                                                                              \\\n  template <typename _proto_TypeTraits,                                       \\\n            ::google::protobuf::internal::FieldType field_type,                         \\\n            bool is_packed>                                                   \\\n  inline int ExtensionSize(                                                   \\\n      const ::google::protobuf::internal::ExtensionIdentifier<                          \\\n        CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const {     \\\n    return _extensions_.ExtensionSize(id.number());                           \\\n  }                                                                           \\\n                                                                              \\\n  /* Singular accessors */                                                    \\\n  template <typename _proto_TypeTraits,                                       \\\n            ::google::protobuf::internal::FieldType field_type,                         \\\n            bool is_packed>                                                   \\\n  inline typename _proto_TypeTraits::ConstType GetExtension(                  \\\n      const ::google::protobuf::internal::ExtensionIdentifier<                          \\\n        CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const {     \\\n    return _proto_TypeTraits::Get(id.number(), _extensions_,                  \\\n                                  id.default_value());                        \\\n  }                                                                           \\\n                                                                              \\\n  template <typename _proto_TypeTraits,                                       \\\n            ::google::protobuf::internal::FieldType field_type,                         \\\n            bool is_packed>                                                   \\\n  inline typename _proto_TypeTraits::MutableType MutableExtension(            \\\n      const ::google::protobuf::internal::ExtensionIdentifier<                          \\\n        CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) {           \\\n    return _proto_TypeTraits::Mutable(id.number(), field_type, &_extensions_);\\\n  }                                                                           \\\n                                                                              \\\n  template <typename _proto_TypeTraits,                                       \\\n            ::google::protobuf::internal::FieldType field_type,                         \\\n            bool is_packed>                                                   \\\n  inline void SetExtension(                                                   \\\n      const ::google::protobuf::internal::ExtensionIdentifier<                          \\\n        CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id,             \\\n      typename _proto_TypeTraits::ConstType value) {                          \\\n    _proto_TypeTraits::Set(id.number(), field_type, value, &_extensions_);    \\\n  }                                                                           \\\n                                                                              \\\n  /* Repeated accessors */                                                    \\\n  template <typename _proto_TypeTraits,                                       \\\n            ::google::protobuf::internal::FieldType field_type,                         \\\n            bool is_packed>                                                   \\\n  inline typename _proto_TypeTraits::ConstType GetExtension(                  \\\n      const ::google::protobuf::internal::ExtensionIdentifier<                          \\\n        CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id,             \\\n      int index) const {                                                      \\\n    return _proto_TypeTraits::Get(id.number(), _extensions_, index);          \\\n  }                                                                           \\\n                                                                              \\\n  template <typename _proto_TypeTraits,                                       \\\n            ::google::protobuf::internal::FieldType field_type,                         \\\n            bool is_packed>                                                   \\\n  inline typename _proto_TypeTraits::MutableType MutableExtension(            \\\n      const ::google::protobuf::internal::ExtensionIdentifier<                          \\\n        CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id,             \\\n      int index) {                                                            \\\n    return _proto_TypeTraits::Mutable(id.number(), index, &_extensions_);     \\\n  }                                                                           \\\n                                                                              \\\n  template <typename _proto_TypeTraits,                                       \\\n            ::google::protobuf::internal::FieldType field_type,                         \\\n            bool is_packed>                                                   \\\n  inline void SetExtension(                                                   \\\n      const ::google::protobuf::internal::ExtensionIdentifier<                          \\\n        CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id,             \\\n      int index, typename _proto_TypeTraits::ConstType value) {               \\\n    _proto_TypeTraits::Set(id.number(), index, value, &_extensions_);         \\\n  }                                                                           \\\n                                                                              \\\n  template <typename _proto_TypeTraits,                                       \\\n            ::google::protobuf::internal::FieldType field_type,                         \\\n            bool is_packed>                                                   \\\n  inline typename _proto_TypeTraits::MutableType AddExtension(                \\\n      const ::google::protobuf::internal::ExtensionIdentifier<                          \\\n        CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) {           \\\n    return _proto_TypeTraits::Add(id.number(), field_type, &_extensions_);    \\\n  }                                                                           \\\n                                                                              \\\n  template <typename _proto_TypeTraits,                                       \\\n            ::google::protobuf::internal::FieldType field_type,                         \\\n            bool is_packed>                                                   \\\n  inline void AddExtension(                                                   \\\n      const ::google::protobuf::internal::ExtensionIdentifier<                          \\\n        CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id,             \\\n      typename _proto_TypeTraits::ConstType value) {                          \\\n    _proto_TypeTraits::Add(id.number(), field_type, is_packed,                \\\n                           value, &_extensions_);                             \\\n  }\n\n}  // namespace internal\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_EXTENSION_SET_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_heavy.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Contains methods defined in extension_set.h which cannot be part of the\n// lite library because they use descriptors or reflection.\n\n#include <google/protobuf/extension_set.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/message.h>\n#include <google/protobuf/repeated_field.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/wire_format_lite_inl.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\n\n// Implementation of ExtensionFinder which finds extensions in a given\n// DescriptorPool, using the given MessageFactory to construct sub-objects.\n// This class is implemented in extension_set_heavy.cc.\nclass DescriptorPoolExtensionFinder : public ExtensionFinder {\n public:\n  DescriptorPoolExtensionFinder(const DescriptorPool* pool,\n                                MessageFactory* factory,\n                                const Descriptor* containing_type)\n      : pool_(pool), factory_(factory), containing_type_(containing_type) {}\n  virtual ~DescriptorPoolExtensionFinder() {}\n\n  virtual bool Find(int number, ExtensionInfo* output);\n\n private:\n  const DescriptorPool* pool_;\n  MessageFactory* factory_;\n  const Descriptor* containing_type_;\n};\n\nvoid ExtensionSet::AppendToList(const Descriptor* containing_type,\n                                const DescriptorPool* pool,\n                                vector<const FieldDescriptor*>* output) const {\n  for (map<int, Extension>::const_iterator iter = extensions_.begin();\n       iter != extensions_.end(); ++iter) {\n    bool has = false;\n    if (iter->second.is_repeated) {\n      has = iter->second.GetSize() > 0;\n    } else {\n      has = !iter->second.is_cleared;\n    }\n\n    if (has) {\n      // TODO(kenton): Looking up each field by number is somewhat unfortunate.\n      //   Is there a better way?  The problem is that descriptors are lazily-\n      //   initialized, so they might not even be constructed until\n      //   AppendToList() is called.\n\n      if (iter->second.descriptor == NULL) {\n        output->push_back(pool->FindExtensionByNumber(\n            containing_type, iter->first));\n      } else {\n        output->push_back(iter->second.descriptor);\n      }\n    }\n  }\n}\n\ninline FieldDescriptor::Type real_type(FieldType type) {\n  GOOGLE_DCHECK(type > 0 && type <= FieldDescriptor::MAX_TYPE);\n  return static_cast<FieldDescriptor::Type>(type);\n}\n\ninline FieldDescriptor::CppType cpp_type(FieldType type) {\n  return FieldDescriptor::TypeToCppType(\n      static_cast<FieldDescriptor::Type>(type));\n}\n\n#define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE)                            \\\n  GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? FieldDescriptor::LABEL_REPEATED     \\\n                                  : FieldDescriptor::LABEL_OPTIONAL,      \\\n            FieldDescriptor::LABEL_##LABEL);                              \\\n  GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), FieldDescriptor::CPPTYPE_##CPPTYPE)\n\nconst MessageLite& ExtensionSet::GetMessage(int number,\n                                            const Descriptor* message_type,\n                                            MessageFactory* factory) const {\n  map<int, Extension>::const_iterator iter = extensions_.find(number);\n  if (iter == extensions_.end() || iter->second.is_cleared) {\n    // Not present.  Return the default value.\n    return *factory->GetPrototype(message_type);\n  } else {\n    GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE);\n    return *iter->second.message_value;\n  }\n}\n\nMessageLite* ExtensionSet::MutableMessage(const FieldDescriptor* descriptor,\n                                          MessageFactory* factory) {\n  Extension* extension;\n  if (MaybeNewExtension(descriptor->number(), descriptor, &extension)) {\n    extension->type = descriptor->type();\n    GOOGLE_DCHECK_EQ(cpp_type(extension->type), FieldDescriptor::CPPTYPE_MESSAGE);\n    extension->is_repeated = false;\n    extension->is_packed = false;\n    const MessageLite* prototype =\n        factory->GetPrototype(descriptor->message_type());\n    GOOGLE_CHECK(prototype != NULL);\n    extension->message_value = prototype->New();\n  } else {\n    GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE);\n  }\n  extension->is_cleared = false;\n  return extension->message_value;\n}\n\nMessageLite* ExtensionSet::AddMessage(const FieldDescriptor* descriptor,\n                                      MessageFactory* factory) {\n  Extension* extension;\n  if (MaybeNewExtension(descriptor->number(), descriptor, &extension)) {\n    extension->type = descriptor->type();\n    GOOGLE_DCHECK_EQ(cpp_type(extension->type), FieldDescriptor::CPPTYPE_MESSAGE);\n    extension->is_repeated = true;\n    extension->repeated_message_value =\n      new RepeatedPtrField<MessageLite>();\n  } else {\n    GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE);\n  }\n\n  // RepeatedPtrField<Message> does not know how to Add() since it cannot\n  // allocate an abstract object, so we have to be tricky.\n  MessageLite* result = extension->repeated_message_value\n      ->AddFromCleared<internal::GenericTypeHandler<MessageLite> >();\n  if (result == NULL) {\n    const MessageLite* prototype;\n    if (extension->repeated_message_value->size() == 0) {\n      prototype = factory->GetPrototype(descriptor->message_type());\n      GOOGLE_CHECK(prototype != NULL);\n    } else {\n      prototype = &extension->repeated_message_value->Get(0);\n    }\n    result = prototype->New();\n    extension->repeated_message_value->AddAllocated(result);\n  }\n  return result;\n}\n\nstatic bool ValidateEnumUsingDescriptor(const void* arg, int number) {\n  return reinterpret_cast<const EnumDescriptor*>(arg)\n      ->FindValueByNumber(number) != NULL;\n}\n\nbool DescriptorPoolExtensionFinder::Find(int number, ExtensionInfo* output) {\n  const FieldDescriptor* extension =\n      pool_->FindExtensionByNumber(containing_type_, number);\n  if (extension == NULL) {\n    return false;\n  } else {\n    output->type = extension->type();\n    output->is_repeated = extension->is_repeated();\n    output->is_packed = extension->options().packed();\n    output->descriptor = extension;\n    if (extension->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      output->message_prototype =\n          factory_->GetPrototype(extension->message_type());\n      GOOGLE_CHECK(output->message_prototype != NULL)\n          << \"Extension factory's GetPrototype() returned NULL for extension: \"\n          << extension->full_name();\n    } else if (extension->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) {\n      output->enum_validity_check.func = ValidateEnumUsingDescriptor;\n      output->enum_validity_check.arg = extension->enum_type();\n    }\n\n    return true;\n  }\n}\n\nbool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input,\n                              const Message* containing_type,\n                              UnknownFieldSet* unknown_fields) {\n  UnknownFieldSetFieldSkipper skipper(unknown_fields);\n  if (input->GetExtensionPool() == NULL) {\n    GeneratedExtensionFinder finder(containing_type);\n    return ParseField(tag, input, &finder, &skipper);\n  } else {\n    DescriptorPoolExtensionFinder finder(input->GetExtensionPool(),\n                                         input->GetExtensionFactory(),\n                                         containing_type->GetDescriptor());\n    return ParseField(tag, input, &finder, &skipper);\n  }\n}\n\nbool ExtensionSet::ParseMessageSet(io::CodedInputStream* input,\n                                   const Message* containing_type,\n                                   UnknownFieldSet* unknown_fields) {\n  UnknownFieldSetFieldSkipper skipper(unknown_fields);\n  if (input->GetExtensionPool() == NULL) {\n    GeneratedExtensionFinder finder(containing_type);\n    return ParseMessageSet(input, &finder, &skipper);\n  } else {\n    DescriptorPoolExtensionFinder finder(input->GetExtensionPool(),\n                                         input->GetExtensionFactory(),\n                                         containing_type->GetDescriptor());\n    return ParseMessageSet(input, &finder, &skipper);\n  }\n}\n\nint ExtensionSet::SpaceUsedExcludingSelf() const {\n  int total_size =\n      extensions_.size() * sizeof(map<int, Extension>::value_type);\n  for (map<int, Extension>::const_iterator iter = extensions_.begin(),\n       end = extensions_.end();\n       iter != end;\n       ++iter) {\n    total_size += iter->second.SpaceUsedExcludingSelf();\n  }\n  return total_size;\n}\n\ninline int ExtensionSet::RepeatedMessage_SpaceUsedExcludingSelf(\n    RepeatedPtrFieldBase* field) {\n  return field->SpaceUsedExcludingSelf<GenericTypeHandler<Message> >();\n}\n\nint ExtensionSet::Extension::SpaceUsedExcludingSelf() const {\n  int total_size = 0;\n  if (is_repeated) {\n    switch (cpp_type(type)) {\n#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                          \\\n      case FieldDescriptor::CPPTYPE_##UPPERCASE:                   \\\n        total_size += sizeof(*repeated_##LOWERCASE##_value) +      \\\n            repeated_##LOWERCASE##_value->SpaceUsedExcludingSelf();\\\n        break\n\n      HANDLE_TYPE(  INT32,   int32);\n      HANDLE_TYPE(  INT64,   int64);\n      HANDLE_TYPE( UINT32,  uint32);\n      HANDLE_TYPE( UINT64,  uint64);\n      HANDLE_TYPE(  FLOAT,   float);\n      HANDLE_TYPE( DOUBLE,  double);\n      HANDLE_TYPE(   BOOL,    bool);\n      HANDLE_TYPE(   ENUM,    enum);\n      HANDLE_TYPE( STRING,  string);\n#undef HANDLE_TYPE\n\n      case FieldDescriptor::CPPTYPE_MESSAGE:\n        // repeated_message_value is actually a RepeatedPtrField<MessageLite>,\n        // but MessageLite has no SpaceUsed(), so we must directly call\n        // RepeatedPtrFieldBase::SpaceUsedExcludingSelf() with a different type\n        // handler.\n        total_size += sizeof(*repeated_message_value) +\n            RepeatedMessage_SpaceUsedExcludingSelf(repeated_message_value);\n        break;\n    }\n  } else {\n    switch (cpp_type(type)) {\n      case FieldDescriptor::CPPTYPE_STRING:\n        total_size += sizeof(*string_value) +\n                      StringSpaceUsedExcludingSelf(*string_value);\n        break;\n      case FieldDescriptor::CPPTYPE_MESSAGE:\n        total_size += down_cast<Message*>(message_value)->SpaceUsed();\n        break;\n      default:\n        // No extra storage costs for primitive types.\n        break;\n    }\n  }\n  return total_size;\n}\n\n// The Serialize*ToArray methods are only needed in the heavy library, as\n// the lite library only generates SerializeWithCachedSizes.\nuint8* ExtensionSet::SerializeWithCachedSizesToArray(\n    int start_field_number, int end_field_number,\n    uint8* target) const {\n  map<int, Extension>::const_iterator iter;\n  for (iter = extensions_.lower_bound(start_field_number);\n       iter != extensions_.end() && iter->first < end_field_number;\n       ++iter) {\n    target = iter->second.SerializeFieldWithCachedSizesToArray(iter->first,\n                                                               target);\n  }\n  return target;\n}\n\nuint8* ExtensionSet::SerializeMessageSetWithCachedSizesToArray(\n    uint8* target) const {\n  map<int, Extension>::const_iterator iter;\n  for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) {\n    target = iter->second.SerializeMessageSetItemWithCachedSizesToArray(\n        iter->first, target);\n  }\n  return target;\n}\n\nuint8* ExtensionSet::Extension::SerializeFieldWithCachedSizesToArray(\n    int number, uint8* target) const {\n  if (is_repeated) {\n    if (is_packed) {\n      if (cached_size == 0) return target;\n\n      target = WireFormatLite::WriteTagToArray(number,\n          WireFormatLite::WIRETYPE_LENGTH_DELIMITED, target);\n      target = WireFormatLite::WriteInt32NoTagToArray(cached_size, target);\n\n      switch (real_type(type)) {\n#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \\\n        case FieldDescriptor::TYPE_##UPPERCASE:                             \\\n          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \\\n            target = WireFormatLite::Write##CAMELCASE##NoTagToArray(        \\\n              repeated_##LOWERCASE##_value->Get(i), target);                \\\n          }                                                                 \\\n          break\n\n        HANDLE_TYPE(   INT32,    Int32,   int32);\n        HANDLE_TYPE(   INT64,    Int64,   int64);\n        HANDLE_TYPE(  UINT32,   UInt32,  uint32);\n        HANDLE_TYPE(  UINT64,   UInt64,  uint64);\n        HANDLE_TYPE(  SINT32,   SInt32,   int32);\n        HANDLE_TYPE(  SINT64,   SInt64,   int64);\n        HANDLE_TYPE( FIXED32,  Fixed32,  uint32);\n        HANDLE_TYPE( FIXED64,  Fixed64,  uint64);\n        HANDLE_TYPE(SFIXED32, SFixed32,   int32);\n        HANDLE_TYPE(SFIXED64, SFixed64,   int64);\n        HANDLE_TYPE(   FLOAT,    Float,   float);\n        HANDLE_TYPE(  DOUBLE,   Double,  double);\n        HANDLE_TYPE(    BOOL,     Bool,    bool);\n        HANDLE_TYPE(    ENUM,     Enum,    enum);\n#undef HANDLE_TYPE\n\n        case WireFormatLite::TYPE_STRING:\n        case WireFormatLite::TYPE_BYTES:\n        case WireFormatLite::TYPE_GROUP:\n        case WireFormatLite::TYPE_MESSAGE:\n          GOOGLE_LOG(FATAL) << \"Non-primitive types can't be packed.\";\n          break;\n      }\n    } else {\n      switch (real_type(type)) {\n#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \\\n        case FieldDescriptor::TYPE_##UPPERCASE:                             \\\n          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \\\n            target = WireFormatLite::Write##CAMELCASE##ToArray(number,      \\\n              repeated_##LOWERCASE##_value->Get(i), target);                \\\n          }                                                                 \\\n          break\n\n        HANDLE_TYPE(   INT32,    Int32,   int32);\n        HANDLE_TYPE(   INT64,    Int64,   int64);\n        HANDLE_TYPE(  UINT32,   UInt32,  uint32);\n        HANDLE_TYPE(  UINT64,   UInt64,  uint64);\n        HANDLE_TYPE(  SINT32,   SInt32,   int32);\n        HANDLE_TYPE(  SINT64,   SInt64,   int64);\n        HANDLE_TYPE( FIXED32,  Fixed32,  uint32);\n        HANDLE_TYPE( FIXED64,  Fixed64,  uint64);\n        HANDLE_TYPE(SFIXED32, SFixed32,   int32);\n        HANDLE_TYPE(SFIXED64, SFixed64,   int64);\n        HANDLE_TYPE(   FLOAT,    Float,   float);\n        HANDLE_TYPE(  DOUBLE,   Double,  double);\n        HANDLE_TYPE(    BOOL,     Bool,    bool);\n        HANDLE_TYPE(  STRING,   String,  string);\n        HANDLE_TYPE(   BYTES,    Bytes,  string);\n        HANDLE_TYPE(    ENUM,     Enum,    enum);\n        HANDLE_TYPE(   GROUP,    Group, message);\n        HANDLE_TYPE( MESSAGE,  Message, message);\n#undef HANDLE_TYPE\n      }\n    }\n  } else if (!is_cleared) {\n    switch (real_type(type)) {\n#define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE)                 \\\n      case FieldDescriptor::TYPE_##UPPERCASE:                    \\\n        target = WireFormatLite::Write##CAMELCASE##ToArray(      \\\n            number, VALUE, target); \\\n        break\n\n      HANDLE_TYPE(   INT32,    Int32,    int32_value);\n      HANDLE_TYPE(   INT64,    Int64,    int64_value);\n      HANDLE_TYPE(  UINT32,   UInt32,   uint32_value);\n      HANDLE_TYPE(  UINT64,   UInt64,   uint64_value);\n      HANDLE_TYPE(  SINT32,   SInt32,    int32_value);\n      HANDLE_TYPE(  SINT64,   SInt64,    int64_value);\n      HANDLE_TYPE( FIXED32,  Fixed32,   uint32_value);\n      HANDLE_TYPE( FIXED64,  Fixed64,   uint64_value);\n      HANDLE_TYPE(SFIXED32, SFixed32,    int32_value);\n      HANDLE_TYPE(SFIXED64, SFixed64,    int64_value);\n      HANDLE_TYPE(   FLOAT,    Float,    float_value);\n      HANDLE_TYPE(  DOUBLE,   Double,   double_value);\n      HANDLE_TYPE(    BOOL,     Bool,     bool_value);\n      HANDLE_TYPE(  STRING,   String,  *string_value);\n      HANDLE_TYPE(   BYTES,    Bytes,  *string_value);\n      HANDLE_TYPE(    ENUM,     Enum,     enum_value);\n      HANDLE_TYPE(   GROUP,    Group, *message_value);\n      HANDLE_TYPE( MESSAGE,  Message, *message_value);\n#undef HANDLE_TYPE\n    }\n  }\n  return target;\n}\n\nuint8* ExtensionSet::Extension::SerializeMessageSetItemWithCachedSizesToArray(\n    int number,\n    uint8* target) const {\n  if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) {\n    // Not a valid MessageSet extension, but serialize it the normal way.\n    GOOGLE_LOG(WARNING) << \"Invalid message set extension.\";\n    return SerializeFieldWithCachedSizesToArray(number, target);\n  }\n\n  if (is_cleared) return target;\n\n  // Start group.\n  target = io::CodedOutputStream::WriteTagToArray(\n      WireFormatLite::kMessageSetItemStartTag, target);\n  // Write type ID.\n  target = WireFormatLite::WriteUInt32ToArray(\n      WireFormatLite::kMessageSetTypeIdNumber, number, target);\n  // Write message.\n  target = WireFormatLite::WriteMessageToArray(\n      WireFormatLite::kMessageSetMessageNumber, *message_value, target);\n  // End group.\n  target = io::CodedOutputStream::WriteTagToArray(\n      WireFormatLite::kMessageSetItemEndTag, target);\n  return target;\n}\n\n}  // namespace internal\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/extension_set.h>\n#include <google/protobuf/unittest.pb.h>\n#include <google/protobuf/test_util.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/dynamic_message.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\nnamespace {\n\n// This test closely mirrors google/protobuf/compiler/cpp/unittest.cc\n// except that it uses extensions rather than regular fields.\n\nTEST(ExtensionSetTest, Defaults) {\n  // Check that all default values are set correctly in the initial message.\n  unittest::TestAllExtensions message;\n\n  TestUtil::ExpectExtensionsClear(message);\n\n  // Messages should return pointers to default instances until first use.\n  // (This is not checked by ExpectClear() since it is not actually true after\n  // the fields have been set and then cleared.)\n  EXPECT_EQ(&unittest::OptionalGroup_extension::default_instance(),\n            &message.GetExtension(unittest::optionalgroup_extension));\n  EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(),\n            &message.GetExtension(unittest::optional_nested_message_extension));\n  EXPECT_EQ(&unittest::ForeignMessage::default_instance(),\n            &message.GetExtension(\n              unittest::optional_foreign_message_extension));\n  EXPECT_EQ(&unittest_import::ImportMessage::default_instance(),\n            &message.GetExtension(unittest::optional_import_message_extension));\n}\n\nTEST(ExtensionSetTest, Accessors) {\n  // Set every field to a unique value then go back and check all those\n  // values.\n  unittest::TestAllExtensions message;\n\n  TestUtil::SetAllExtensions(&message);\n  TestUtil::ExpectAllExtensionsSet(message);\n\n  TestUtil::ModifyRepeatedExtensions(&message);\n  TestUtil::ExpectRepeatedExtensionsModified(message);\n}\n\nTEST(ExtensionSetTest, Clear) {\n  // Set every field to a unique value, clear the message, then check that\n  // it is cleared.\n  unittest::TestAllExtensions message;\n\n  TestUtil::SetAllExtensions(&message);\n  message.Clear();\n  TestUtil::ExpectExtensionsClear(message);\n\n  // Unlike with the defaults test, we do NOT expect that requesting embedded\n  // messages will return a pointer to the default instance.  Instead, they\n  // should return the objects that were created when mutable_blah() was\n  // called.\n  EXPECT_NE(&unittest::OptionalGroup_extension::default_instance(),\n            &message.GetExtension(unittest::optionalgroup_extension));\n  EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),\n            &message.GetExtension(unittest::optional_nested_message_extension));\n  EXPECT_NE(&unittest::ForeignMessage::default_instance(),\n            &message.GetExtension(\n              unittest::optional_foreign_message_extension));\n  EXPECT_NE(&unittest_import::ImportMessage::default_instance(),\n            &message.GetExtension(unittest::optional_import_message_extension));\n\n  // Make sure setting stuff again after clearing works.  (This takes slightly\n  // different code paths since the objects are reused.)\n  TestUtil::SetAllExtensions(&message);\n  TestUtil::ExpectAllExtensionsSet(message);\n}\n\nTEST(ExtensionSetTest, ClearOneField) {\n  // Set every field to a unique value, then clear one value and insure that\n  // only that one value is cleared.\n  unittest::TestAllExtensions message;\n\n  TestUtil::SetAllExtensions(&message);\n  int64 original_value =\n    message.GetExtension(unittest::optional_int64_extension);\n\n  // Clear the field and make sure it shows up as cleared.\n  message.ClearExtension(unittest::optional_int64_extension);\n  EXPECT_FALSE(message.HasExtension(unittest::optional_int64_extension));\n  EXPECT_EQ(0, message.GetExtension(unittest::optional_int64_extension));\n\n  // Other adjacent fields should not be cleared.\n  EXPECT_TRUE(message.HasExtension(unittest::optional_int32_extension));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_uint32_extension));\n\n  // Make sure if we set it again, then all fields are set.\n  message.SetExtension(unittest::optional_int64_extension, original_value);\n  TestUtil::ExpectAllExtensionsSet(message);\n}\n\nTEST(ExtensionSetTest, CopyFrom) {\n  unittest::TestAllExtensions message1, message2;\n  string data;\n\n  TestUtil::SetAllExtensions(&message1);\n  message2.CopyFrom(message1);\n  TestUtil::ExpectAllExtensionsSet(message2);\n}\n\nTEST(ExtensionSetTest, CopyFromUpcasted) {\n  unittest::TestAllExtensions message1, message2;\n  string data;\n  const Message& upcasted_message = message1;\n\n  TestUtil::SetAllExtensions(&message1);\n  message2.CopyFrom(upcasted_message);\n  TestUtil::ExpectAllExtensionsSet(message2);\n}\n\nTEST(ExtensionSetTest, SwapWithEmpty) {\n  unittest::TestAllExtensions message1, message2;\n  TestUtil::SetAllExtensions(&message1);\n\n  TestUtil::ExpectAllExtensionsSet(message1);\n  TestUtil::ExpectExtensionsClear(message2);\n  message1.Swap(&message2);\n  TestUtil::ExpectAllExtensionsSet(message2);\n  TestUtil::ExpectExtensionsClear(message1);\n}\n\nTEST(ExtensionSetTest, SwapWithSelf) {\n  unittest::TestAllExtensions message;\n  TestUtil::SetAllExtensions(&message);\n\n  TestUtil::ExpectAllExtensionsSet(message);\n  message.Swap(&message);\n  TestUtil::ExpectAllExtensionsSet(message);\n}\n\nTEST(ExtensionSetTest, SerializationToArray) {\n  // Serialize as TestAllExtensions and parse as TestAllTypes to insure wire\n  // compatibility of extensions.\n  //\n  // This checks serialization to a flat array by explicitly reserving space in\n  // the string and calling the generated message's\n  // SerializeWithCachedSizesToArray.\n  unittest::TestAllExtensions source;\n  unittest::TestAllTypes destination;\n  TestUtil::SetAllExtensions(&source);\n  int size = source.ByteSize();\n  string data;\n  data.resize(size);\n  uint8* target = reinterpret_cast<uint8*>(string_as_array(&data));\n  uint8* end = source.SerializeWithCachedSizesToArray(target);\n  EXPECT_EQ(size, end - target);\n  EXPECT_TRUE(destination.ParseFromString(data));\n  TestUtil::ExpectAllFieldsSet(destination);\n}\n\nTEST(ExtensionSetTest, SerializationToStream) {\n  // Serialize as TestAllExtensions and parse as TestAllTypes to insure wire\n  // compatibility of extensions.\n  //\n  // This checks serialization to an output stream by creating an array output\n  // stream that can only buffer 1 byte at a time - this prevents the message\n  // from ever jumping to the fast path, ensuring that serialization happens via\n  // the CodedOutputStream.\n  unittest::TestAllExtensions source;\n  unittest::TestAllTypes destination;\n  TestUtil::SetAllExtensions(&source);\n  int size = source.ByteSize();\n  string data;\n  data.resize(size);\n  {\n    io::ArrayOutputStream array_stream(string_as_array(&data), size, 1);\n    io::CodedOutputStream output_stream(&array_stream);\n    source.SerializeWithCachedSizes(&output_stream);\n    ASSERT_FALSE(output_stream.HadError());\n  }\n  EXPECT_TRUE(destination.ParseFromString(data));\n  TestUtil::ExpectAllFieldsSet(destination);\n}\n\nTEST(ExtensionSetTest, PackedSerializationToArray) {\n  // Serialize as TestPackedExtensions and parse as TestPackedTypes to insure\n  // wire compatibility of extensions.\n  //\n  // This checks serialization to a flat array by explicitly reserving space in\n  // the string and calling the generated message's\n  // SerializeWithCachedSizesToArray.\n  unittest::TestPackedExtensions source;\n  unittest::TestPackedTypes destination;\n  TestUtil::SetPackedExtensions(&source);\n  int size = source.ByteSize();\n  string data;\n  data.resize(size);\n  uint8* target = reinterpret_cast<uint8*>(string_as_array(&data));\n  uint8* end = source.SerializeWithCachedSizesToArray(target);\n  EXPECT_EQ(size, end - target);\n  EXPECT_TRUE(destination.ParseFromString(data));\n  TestUtil::ExpectPackedFieldsSet(destination);\n}\n\nTEST(ExtensionSetTest, PackedSerializationToStream) {\n  // Serialize as TestPackedExtensions and parse as TestPackedTypes to insure\n  // wire compatibility of extensions.\n  //\n  // This checks serialization to an output stream by creating an array output\n  // stream that can only buffer 1 byte at a time - this prevents the message\n  // from ever jumping to the fast path, ensuring that serialization happens via\n  // the CodedOutputStream.\n  unittest::TestPackedExtensions source;\n  unittest::TestPackedTypes destination;\n  TestUtil::SetPackedExtensions(&source);\n  int size = source.ByteSize();\n  string data;\n  data.resize(size);\n  {\n    io::ArrayOutputStream array_stream(string_as_array(&data), size, 1);\n    io::CodedOutputStream output_stream(&array_stream);\n    source.SerializeWithCachedSizes(&output_stream);\n    ASSERT_FALSE(output_stream.HadError());\n  }\n  EXPECT_TRUE(destination.ParseFromString(data));\n  TestUtil::ExpectPackedFieldsSet(destination);\n}\n\nTEST(ExtensionSetTest, Parsing) {\n  // Serialize as TestAllTypes and parse as TestAllExtensions.\n  unittest::TestAllTypes source;\n  unittest::TestAllExtensions destination;\n  string data;\n\n  TestUtil::SetAllFields(&source);\n  source.SerializeToString(&data);\n  EXPECT_TRUE(destination.ParseFromString(data));\n  TestUtil::ExpectAllExtensionsSet(destination);\n}\n\nTEST(ExtensionSetTest, PackedParsing) {\n  // Serialize as TestPackedTypes and parse as TestPackedExtensions.\n  unittest::TestPackedTypes source;\n  unittest::TestPackedExtensions destination;\n  string data;\n\n  TestUtil::SetPackedFields(&source);\n  source.SerializeToString(&data);\n  EXPECT_TRUE(destination.ParseFromString(data));\n  TestUtil::ExpectPackedExtensionsSet(destination);\n}\n\nTEST(ExtensionSetTest, IsInitialized) {\n  // Test that IsInitialized() returns false if required fields in nested\n  // extensions are missing.\n  unittest::TestAllExtensions message;\n\n  EXPECT_TRUE(message.IsInitialized());\n\n  message.MutableExtension(unittest::TestRequired::single);\n  EXPECT_FALSE(message.IsInitialized());\n\n  message.MutableExtension(unittest::TestRequired::single)->set_a(1);\n  EXPECT_FALSE(message.IsInitialized());\n  message.MutableExtension(unittest::TestRequired::single)->set_b(2);\n  EXPECT_FALSE(message.IsInitialized());\n  message.MutableExtension(unittest::TestRequired::single)->set_c(3);\n  EXPECT_TRUE(message.IsInitialized());\n\n  message.AddExtension(unittest::TestRequired::multi);\n  EXPECT_FALSE(message.IsInitialized());\n\n  message.MutableExtension(unittest::TestRequired::multi, 0)->set_a(1);\n  EXPECT_FALSE(message.IsInitialized());\n  message.MutableExtension(unittest::TestRequired::multi, 0)->set_b(2);\n  EXPECT_FALSE(message.IsInitialized());\n  message.MutableExtension(unittest::TestRequired::multi, 0)->set_c(3);\n  EXPECT_TRUE(message.IsInitialized());\n}\n\nTEST(ExtensionSetTest, MutableString) {\n  // Test the mutable string accessors.\n  unittest::TestAllExtensions message;\n\n  message.MutableExtension(unittest::optional_string_extension)->assign(\"foo\");\n  EXPECT_TRUE(message.HasExtension(unittest::optional_string_extension));\n  EXPECT_EQ(\"foo\", message.GetExtension(unittest::optional_string_extension));\n\n  message.AddExtension(unittest::repeated_string_extension)->assign(\"bar\");\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_string_extension));\n  EXPECT_EQ(\"bar\",\n            message.GetExtension(unittest::repeated_string_extension, 0));\n}\n\nTEST(ExtensionSetTest, SpaceUsedExcludingSelf) {\n  // Scalar primitive extensions should increase the extension set size by a\n  // minimum of the size of the primitive type.\n#define TEST_SCALAR_EXTENSIONS_SPACE_USED(type, value)                        \\\n  do {                                                                        \\\n    unittest::TestAllExtensions message;                                      \\\n    const int base_size = message.SpaceUsed();                                \\\n    message.SetExtension(unittest::optional_##type##_extension, value);       \\\n    int min_expected_size = base_size +                                       \\\n        sizeof(message.GetExtension(unittest::optional_##type##_extension));  \\\n    EXPECT_LE(min_expected_size, message.SpaceUsed());                        \\\n  } while (0)\n\n  TEST_SCALAR_EXTENSIONS_SPACE_USED(int32   , 101);\n  TEST_SCALAR_EXTENSIONS_SPACE_USED(int64   , 102);\n  TEST_SCALAR_EXTENSIONS_SPACE_USED(uint32  , 103);\n  TEST_SCALAR_EXTENSIONS_SPACE_USED(uint64  , 104);\n  TEST_SCALAR_EXTENSIONS_SPACE_USED(sint32  , 105);\n  TEST_SCALAR_EXTENSIONS_SPACE_USED(sint64  , 106);\n  TEST_SCALAR_EXTENSIONS_SPACE_USED(fixed32 , 107);\n  TEST_SCALAR_EXTENSIONS_SPACE_USED(fixed64 , 108);\n  TEST_SCALAR_EXTENSIONS_SPACE_USED(sfixed32, 109);\n  TEST_SCALAR_EXTENSIONS_SPACE_USED(sfixed64, 110);\n  TEST_SCALAR_EXTENSIONS_SPACE_USED(float   , 111);\n  TEST_SCALAR_EXTENSIONS_SPACE_USED(double  , 112);\n  TEST_SCALAR_EXTENSIONS_SPACE_USED(bool    , true);\n#undef TEST_SCALAR_EXTENSIONS_SPACE_USED\n  {\n    unittest::TestAllExtensions message;\n    const int base_size = message.SpaceUsed();\n    message.SetExtension(unittest::optional_nested_enum_extension,\n                         unittest::TestAllTypes::FOO);\n    int min_expected_size = base_size +\n        sizeof(message.GetExtension(unittest::optional_nested_enum_extension));\n    EXPECT_LE(min_expected_size, message.SpaceUsed());\n  }\n  {\n    // Strings may cause extra allocations depending on their length; ensure\n    // that gets included as well.\n    unittest::TestAllExtensions message;\n    const int base_size = message.SpaceUsed();\n    const string s(\"this is a fairly large string that will cause some \"\n                   \"allocation in order to store it in the extension\");\n    message.SetExtension(unittest::optional_string_extension, s);\n    int min_expected_size = base_size + s.length();\n    EXPECT_LE(min_expected_size, message.SpaceUsed());\n  }\n  {\n    // Messages also have additional allocation that need to be counted.\n    unittest::TestAllExtensions message;\n    const int base_size = message.SpaceUsed();\n    unittest::ForeignMessage foreign;\n    foreign.set_c(42);\n    message.MutableExtension(unittest::optional_foreign_message_extension)->\n        CopyFrom(foreign);\n    int min_expected_size = base_size + foreign.SpaceUsed();\n    EXPECT_LE(min_expected_size, message.SpaceUsed());\n  }\n\n  // Repeated primitive extensions will increase space used by at least a\n  // RepeatedField<T>, and will cause additional allocations when the array\n  // gets too big for the initial space.\n  // This macro:\n  //   - Adds a value to the repeated extension, then clears it, establishing\n  //     the base size.\n  //   - Adds a small number of values, testing that it doesn't increase the\n  //     SpaceUsed()\n  //   - Adds a large number of values (requiring allocation in the repeated\n  //     field), and ensures that that allocation is included in SpaceUsed()\n#define TEST_REPEATED_EXTENSIONS_SPACE_USED(type, cpptype, value)              \\\n  do {                                                                         \\\n    unittest::TestAllExtensions message;                                       \\\n    const int base_size = message.SpaceUsed();                                 \\\n    int min_expected_size = sizeof(RepeatedField<cpptype>) + base_size;        \\\n    message.AddExtension(unittest::repeated_##type##_extension, value);        \\\n    message.ClearExtension(unittest::repeated_##type##_extension);             \\\n    const int empty_repeated_field_size = message.SpaceUsed();                 \\\n    EXPECT_LE(min_expected_size, empty_repeated_field_size) << #type;          \\\n    message.AddExtension(unittest::repeated_##type##_extension, value);        \\\n    message.AddExtension(unittest::repeated_##type##_extension, value);        \\\n    EXPECT_EQ(empty_repeated_field_size, message.SpaceUsed()) << #type;        \\\n    message.ClearExtension(unittest::repeated_##type##_extension);             \\\n    for (int i = 0; i < 16; ++i) {                                             \\\n      message.AddExtension(unittest::repeated_##type##_extension, value);      \\\n    }                                                                          \\\n    int expected_size = sizeof(cpptype) * 16 + empty_repeated_field_size;      \\\n    EXPECT_EQ(expected_size, message.SpaceUsed()) << #type;                    \\\n  } while (0)\n\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(int32   , int32 , 101);\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(int64   , int64 , 102);\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(uint32  , uint32, 103);\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(uint64  , uint64, 104);\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(sint32  , int32 , 105);\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(sint64  , int64 , 106);\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed32 , uint32, 107);\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed64 , uint64, 108);\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed32, int32 , 109);\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed64, int64 , 110);\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(float   , float , 111);\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(double  , double, 112);\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(bool    , bool  , true);\n  TEST_REPEATED_EXTENSIONS_SPACE_USED(nested_enum, int,\n                                      unittest::TestAllTypes::FOO);\n#undef TEST_REPEATED_EXTENSIONS_SPACE_USED\n  // Repeated strings\n  {\n    unittest::TestAllExtensions message;\n    const int base_size = message.SpaceUsed();\n    int min_expected_size = sizeof(RepeatedPtrField<string>) + base_size;\n    const string value(256, 'x');\n    // Once items are allocated, they may stick around even when cleared so\n    // without the hardcore memory management accessors there isn't a notion of\n    // the empty repeated field memory usage as there is with primitive types.\n    for (int i = 0; i < 16; ++i) {\n      message.AddExtension(unittest::repeated_string_extension, value);\n    }\n    min_expected_size += (sizeof(value) + value.size()) * 16;\n    EXPECT_LE(min_expected_size, message.SpaceUsed());\n  }\n  // Repeated messages\n  {\n    unittest::TestAllExtensions message;\n    const int base_size = message.SpaceUsed();\n    int min_expected_size = sizeof(RepeatedPtrField<unittest::ForeignMessage>) +\n        base_size;\n    unittest::ForeignMessage prototype;\n    prototype.set_c(2);\n    for (int i = 0; i < 16; ++i) {\n      message.AddExtension(unittest::repeated_foreign_message_extension)->\n          CopyFrom(prototype);\n    }\n    min_expected_size += 16 * prototype.SpaceUsed();\n    EXPECT_LE(min_expected_size, message.SpaceUsed());\n  }\n}\n\n#ifdef GTEST_HAS_DEATH_TEST\n\nTEST(ExtensionSetTest, InvalidEnumDeath) {\n  unittest::TestAllExtensions message;\n  EXPECT_DEBUG_DEATH(\n    message.SetExtension(unittest::optional_foreign_enum_extension,\n                         static_cast<unittest::ForeignEnum>(53)),\n    \"IsValid\");\n}\n\n#endif  // GTEST_HAS_DEATH_TEST\n\nTEST(ExtensionSetTest, DynamicExtensions) {\n  // Test adding a dynamic extension to a compiled-in message object.\n\n  FileDescriptorProto dynamic_proto;\n  dynamic_proto.set_name(\"dynamic_extensions_test.proto\");\n  dynamic_proto.add_dependency(\n      unittest::TestAllExtensions::descriptor()->file()->name());\n  dynamic_proto.set_package(\"dynamic_extensions\");\n\n  // Copy the fields and nested types from TestDynamicExtensions into our new\n  // proto, converting the fields into extensions.\n  const Descriptor* template_descriptor =\n      unittest::TestDynamicExtensions::descriptor();\n  DescriptorProto template_descriptor_proto;\n  template_descriptor->CopyTo(&template_descriptor_proto);\n  dynamic_proto.mutable_message_type()->MergeFrom(\n      template_descriptor_proto.nested_type());\n  dynamic_proto.mutable_enum_type()->MergeFrom(\n      template_descriptor_proto.enum_type());\n  dynamic_proto.mutable_extension()->MergeFrom(\n      template_descriptor_proto.field());\n\n  // For each extension that we added...\n  for (int i = 0; i < dynamic_proto.extension_size(); i++) {\n    // Set its extendee to TestAllExtensions.\n    FieldDescriptorProto* extension = dynamic_proto.mutable_extension(i);\n    extension->set_extendee(\n        unittest::TestAllExtensions::descriptor()->full_name());\n\n    // If the field refers to one of the types nested in TestDynamicExtensions,\n    // make it refer to the type in our dynamic proto instead.\n    string prefix = \".\" + template_descriptor->full_name() + \".\";\n    if (extension->has_type_name()) {\n      string* type_name = extension->mutable_type_name();\n      if (HasPrefixString(*type_name, prefix)) {\n        type_name->replace(0, prefix.size(), \".dynamic_extensions.\");\n      }\n    }\n  }\n\n  // Now build the file, using the generated pool as an underlay.\n  DescriptorPool dynamic_pool(DescriptorPool::generated_pool());\n  const FileDescriptor* file = dynamic_pool.BuildFile(dynamic_proto);\n  ASSERT_TRUE(file != NULL);\n  DynamicMessageFactory dynamic_factory(&dynamic_pool);\n  dynamic_factory.SetDelegateToGeneratedFactory(true);\n\n  // Construct a message that we can parse with the extensions we defined.\n  // Since the extensions were based off of the fields of TestDynamicExtensions,\n  // we can use that message to create this test message.\n  string data;\n  {\n    unittest::TestDynamicExtensions message;\n    message.set_scalar_extension(123);\n    message.set_enum_extension(unittest::FOREIGN_BAR);\n    message.set_dynamic_enum_extension(\n        unittest::TestDynamicExtensions::DYNAMIC_BAZ);\n    message.mutable_message_extension()->set_c(456);\n    message.mutable_dynamic_message_extension()->set_dynamic_field(789);\n    message.add_repeated_extension(\"foo\");\n    message.add_repeated_extension(\"bar\");\n    message.add_packed_extension(12);\n    message.add_packed_extension(-34);\n    message.add_packed_extension(56);\n    message.add_packed_extension(-78);\n\n    // Also add some unknown fields.\n\n    // An unknown enum value (for a known field).\n    message.mutable_unknown_fields()->AddVarint(\n      unittest::TestDynamicExtensions::kDynamicEnumExtensionFieldNumber,\n      12345);\n    // A regular unknown field.\n    message.mutable_unknown_fields()->AddLengthDelimited(54321, \"unknown\");\n\n    message.SerializeToString(&data);\n  }\n\n  // Now we can parse this using our dynamic extension definitions...\n  unittest::TestAllExtensions message;\n  {\n    io::ArrayInputStream raw_input(data.data(), data.size());\n    io::CodedInputStream input(&raw_input);\n    input.SetExtensionRegistry(&dynamic_pool, &dynamic_factory);\n    ASSERT_TRUE(message.ParseFromCodedStream(&input));\n    ASSERT_TRUE(input.ConsumedEntireMessage());\n  }\n\n  // Can we print it?\n  EXPECT_EQ(\n    \"[dynamic_extensions.scalar_extension]: 123\\n\"\n    \"[dynamic_extensions.enum_extension]: FOREIGN_BAR\\n\"\n    \"[dynamic_extensions.dynamic_enum_extension]: DYNAMIC_BAZ\\n\"\n    \"[dynamic_extensions.message_extension] {\\n\"\n    \"  c: 456\\n\"\n    \"}\\n\"\n    \"[dynamic_extensions.dynamic_message_extension] {\\n\"\n    \"  dynamic_field: 789\\n\"\n    \"}\\n\"\n    \"[dynamic_extensions.repeated_extension]: \\\"foo\\\"\\n\"\n    \"[dynamic_extensions.repeated_extension]: \\\"bar\\\"\\n\"\n    \"[dynamic_extensions.packed_extension]: 12\\n\"\n    \"[dynamic_extensions.packed_extension]: -34\\n\"\n    \"[dynamic_extensions.packed_extension]: 56\\n\"\n    \"[dynamic_extensions.packed_extension]: -78\\n\"\n    \"2002: 12345\\n\"\n    \"54321: \\\"unknown\\\"\\n\",\n    message.DebugString());\n\n  // Can we serialize it?\n  // (Don't use EXPECT_EQ because we don't want to dump raw binary data to the\n  // terminal on failure.)\n  EXPECT_TRUE(message.SerializeAsString() == data);\n\n  // What if we parse using the reflection-based parser?\n  {\n    unittest::TestAllExtensions message2;\n    io::ArrayInputStream raw_input(data.data(), data.size());\n    io::CodedInputStream input(&raw_input);\n    input.SetExtensionRegistry(&dynamic_pool, &dynamic_factory);\n    ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &message2));\n    ASSERT_TRUE(input.ConsumedEntireMessage());\n    EXPECT_EQ(message.DebugString(), message2.DebugString());\n  }\n\n  // Are the embedded generated types actually using the generated objects?\n  {\n    const FieldDescriptor* message_extension =\n        file->FindExtensionByName(\"message_extension\");\n    ASSERT_TRUE(message_extension != NULL);\n    const Message& sub_message =\n        message.GetReflection()->GetMessage(message, message_extension);\n    const unittest::ForeignMessage* typed_sub_message =\n        dynamic_cast<const unittest::ForeignMessage*>(&sub_message);\n    ASSERT_TRUE(typed_sub_message != NULL);\n    EXPECT_EQ(456, typed_sub_message->c());\n  }\n\n  // What does GetMessage() return for the embedded dynamic type if it isn't\n  // present?\n  {\n    const FieldDescriptor* dynamic_message_extension =\n        file->FindExtensionByName(\"dynamic_message_extension\");\n    ASSERT_TRUE(dynamic_message_extension != NULL);\n    const Message& parent = unittest::TestAllExtensions::default_instance();\n    const Message& sub_message =\n        parent.GetReflection()->GetMessage(parent, dynamic_message_extension,\n                                           &dynamic_factory);\n    const Message* prototype =\n        dynamic_factory.GetPrototype(dynamic_message_extension->message_type());\n    EXPECT_EQ(prototype, &sub_message);\n  }\n}\n\n}  // namespace\n}  // namespace internal\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <algorithm>\n#include <google/protobuf/generated_message_reflection.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/repeated_field.h>\n#include <google/protobuf/extension_set.h>\n#include <google/protobuf/generated_message_util.h>\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\n\nint StringSpaceUsedExcludingSelf(const string& str) {\n  const void* start = &str;\n  const void* end = &str + 1;\n\n  if (start <= str.data() && str.data() <= end) {\n    // The string's data is stored inside the string object itself.\n    return 0;\n  } else {\n    return str.capacity();\n  }\n}\n\nbool ParseNamedEnum(const EnumDescriptor* descriptor,\n                    const string& name,\n                    int* value) {\n  const EnumValueDescriptor* d = descriptor->FindValueByName(name);\n  if (d == NULL) return false;\n  *value = d->number();\n  return true;\n}\n\nconst string& NameOfEnum(const EnumDescriptor* descriptor, int value) {\n  const EnumValueDescriptor* d = descriptor->FindValueByNumber(value);\n  return (d == NULL ? kEmptyString : d->name());\n}\n\n// ===================================================================\n// Helpers for reporting usage errors (e.g. trying to use GetInt32() on\n// a string field).\n\nnamespace {\n\nvoid ReportReflectionUsageError(\n    const Descriptor* descriptor, const FieldDescriptor* field,\n    const char* method, const char* description) {\n  GOOGLE_LOG(FATAL)\n    << \"Protocol Buffer reflection usage error:\\n\"\n       \"  Method      : google::protobuf::Reflection::\" << method << \"\\n\"\n       \"  Message type: \" << descriptor->full_name() << \"\\n\"\n       \"  Field       : \" << field->full_name() << \"\\n\"\n       \"  Problem     : \" << description;\n}\n\nconst char* cpptype_names_[FieldDescriptor::MAX_CPPTYPE + 1] = {\n  \"INVALID_CPPTYPE\",\n  \"CPPTYPE_INT32\",\n  \"CPPTYPE_INT64\",\n  \"CPPTYPE_UINT32\",\n  \"CPPTYPE_UINT64\",\n  \"CPPTYPE_DOUBLE\",\n  \"CPPTYPE_FLOAT\",\n  \"CPPTYPE_BOOL\",\n  \"CPPTYPE_ENUM\",\n  \"CPPTYPE_STRING\",\n  \"CPPTYPE_MESSAGE\"\n};\n\nstatic void ReportReflectionUsageTypeError(\n    const Descriptor* descriptor, const FieldDescriptor* field,\n    const char* method,\n    FieldDescriptor::CppType expected_type) {\n  GOOGLE_LOG(FATAL)\n    << \"Protocol Buffer reflection usage error:\\n\"\n       \"  Method      : google::protobuf::Reflection::\" << method << \"\\n\"\n       \"  Message type: \" << descriptor->full_name() << \"\\n\"\n       \"  Field       : \" << field->full_name() << \"\\n\"\n       \"  Problem     : Field is not the right type for this message:\\n\"\n       \"    Expected  : \" << cpptype_names_[expected_type] << \"\\n\"\n       \"    Field type: \" << cpptype_names_[field->cpp_type()];\n}\n\nstatic void ReportReflectionUsageEnumTypeError(\n    const Descriptor* descriptor, const FieldDescriptor* field,\n    const char* method, const EnumValueDescriptor* value) {\n  GOOGLE_LOG(FATAL)\n    << \"Protocol Buffer reflection usage error:\\n\"\n       \"  Method      : google::protobuf::Reflection::\" << method << \"\\n\"\n       \"  Message type: \" << descriptor->full_name() << \"\\n\"\n       \"  Field       : \" << field->full_name() << \"\\n\"\n       \"  Problem     : Enum value did not match field type:\\n\"\n       \"    Expected  : \" << field->enum_type()->full_name() << \"\\n\"\n       \"    Actual    : \" << value->full_name();\n}\n\n#define USAGE_CHECK(CONDITION, METHOD, ERROR_DESCRIPTION)                      \\\n  if (!(CONDITION))                                                            \\\n    ReportReflectionUsageError(descriptor_, field, #METHOD, ERROR_DESCRIPTION)\n#define USAGE_CHECK_EQ(A, B, METHOD, ERROR_DESCRIPTION)                        \\\n  USAGE_CHECK((A) == (B), METHOD, ERROR_DESCRIPTION)\n#define USAGE_CHECK_NE(A, B, METHOD, ERROR_DESCRIPTION)                        \\\n  USAGE_CHECK((A) != (B), METHOD, ERROR_DESCRIPTION)\n\n#define USAGE_CHECK_TYPE(METHOD, CPPTYPE)                                      \\\n  if (field->cpp_type() != FieldDescriptor::CPPTYPE_##CPPTYPE)                 \\\n    ReportReflectionUsageTypeError(descriptor_, field, #METHOD,                \\\n                                   FieldDescriptor::CPPTYPE_##CPPTYPE)\n\n#define USAGE_CHECK_ENUM_VALUE(METHOD)                                         \\\n  if (value->type() != field->enum_type())                                     \\\n    ReportReflectionUsageEnumTypeError(descriptor_, field, #METHOD, value)\n\n#define USAGE_CHECK_MESSAGE_TYPE(METHOD)                                       \\\n  USAGE_CHECK_EQ(field->containing_type(), descriptor_,                        \\\n                 METHOD, \"Field does not match message type.\");\n#define USAGE_CHECK_SINGULAR(METHOD)                                           \\\n  USAGE_CHECK_NE(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD,      \\\n                 \"Field is repeated; the method requires a singular field.\")\n#define USAGE_CHECK_REPEATED(METHOD)                                           \\\n  USAGE_CHECK_EQ(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD,      \\\n                 \"Field is singular; the method requires a repeated field.\")\n\n#define USAGE_CHECK_ALL(METHOD, LABEL, CPPTYPE)                       \\\n    USAGE_CHECK_MESSAGE_TYPE(METHOD);                                 \\\n    USAGE_CHECK_##LABEL(METHOD);                                      \\\n    USAGE_CHECK_TYPE(METHOD, CPPTYPE)\n\n}  // namespace\n\n// ===================================================================\n\nGeneratedMessageReflection::GeneratedMessageReflection(\n    const Descriptor* descriptor,\n    const Message* default_instance,\n    const int offsets[],\n    int has_bits_offset,\n    int unknown_fields_offset,\n    int extensions_offset,\n    const DescriptorPool* descriptor_pool,\n    MessageFactory* factory,\n    int object_size)\n  : descriptor_       (descriptor),\n    default_instance_ (default_instance),\n    offsets_          (offsets),\n    has_bits_offset_  (has_bits_offset),\n    unknown_fields_offset_(unknown_fields_offset),\n    extensions_offset_(extensions_offset),\n    object_size_      (object_size),\n    descriptor_pool_  ((descriptor_pool == NULL) ?\n                         DescriptorPool::generated_pool() :\n                         descriptor_pool),\n    message_factory_  (factory) {\n}\n\nGeneratedMessageReflection::~GeneratedMessageReflection() {}\n\nconst UnknownFieldSet& GeneratedMessageReflection::GetUnknownFields(\n    const Message& message) const {\n  const void* ptr = reinterpret_cast<const uint8*>(&message) +\n                    unknown_fields_offset_;\n  return *reinterpret_cast<const UnknownFieldSet*>(ptr);\n}\nUnknownFieldSet* GeneratedMessageReflection::MutableUnknownFields(\n    Message* message) const {\n  void* ptr = reinterpret_cast<uint8*>(message) + unknown_fields_offset_;\n  return reinterpret_cast<UnknownFieldSet*>(ptr);\n}\n\nint GeneratedMessageReflection::SpaceUsed(const Message& message) const {\n  // object_size_ already includes the in-memory representation of each field\n  // in the message, so we only need to account for additional memory used by\n  // the fields.\n  int total_size = object_size_;\n\n  total_size += GetUnknownFields(message).SpaceUsedExcludingSelf();\n\n  if (extensions_offset_ != -1) {\n    total_size += GetExtensionSet(message).SpaceUsedExcludingSelf();\n  }\n\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n\n    if (field->is_repeated()) {\n      switch (field->cpp_type()) {\n#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \\\n        case FieldDescriptor::CPPTYPE_##UPPERCASE :                           \\\n          total_size += GetRaw<RepeatedField<LOWERCASE> >(message, field)     \\\n                          .SpaceUsedExcludingSelf();                          \\\n          break\n\n        HANDLE_TYPE( INT32,  int32);\n        HANDLE_TYPE( INT64,  int64);\n        HANDLE_TYPE(UINT32, uint32);\n        HANDLE_TYPE(UINT64, uint64);\n        HANDLE_TYPE(DOUBLE, double);\n        HANDLE_TYPE( FLOAT,  float);\n        HANDLE_TYPE(  BOOL,   bool);\n        HANDLE_TYPE(  ENUM,    int);\n#undef HANDLE_TYPE\n\n        case FieldDescriptor::CPPTYPE_STRING:\n          switch (field->options().ctype()) {\n            default:  // TODO(kenton):  Support other string reps.\n            case FieldOptions::STRING:\n              total_size += GetRaw<RepeatedPtrField<string> >(message, field)\n                              .SpaceUsedExcludingSelf();\n              break;\n          }\n          break;\n\n        case FieldDescriptor::CPPTYPE_MESSAGE:\n          // We don't know which subclass of RepeatedPtrFieldBase the type is,\n          // so we use RepeatedPtrFieldBase directly.\n          total_size +=\n              GetRaw<RepeatedPtrFieldBase>(message, field)\n                .SpaceUsedExcludingSelf<GenericTypeHandler<Message> >();\n          break;\n      }\n    } else {\n      switch (field->cpp_type()) {\n        case FieldDescriptor::CPPTYPE_INT32 :\n        case FieldDescriptor::CPPTYPE_INT64 :\n        case FieldDescriptor::CPPTYPE_UINT32:\n        case FieldDescriptor::CPPTYPE_UINT64:\n        case FieldDescriptor::CPPTYPE_DOUBLE:\n        case FieldDescriptor::CPPTYPE_FLOAT :\n        case FieldDescriptor::CPPTYPE_BOOL  :\n        case FieldDescriptor::CPPTYPE_ENUM  :\n          // Field is inline, so we've already counted it.\n          break;\n\n        case FieldDescriptor::CPPTYPE_STRING: {\n          switch (field->options().ctype()) {\n            default:  // TODO(kenton):  Support other string reps.\n            case FieldOptions::STRING: {\n              const string* ptr = GetField<const string*>(message, field);\n\n              // Initially, the string points to the default value stored in\n              // the prototype. Only count the string if it has been changed\n              // from the default value.\n              const string* default_ptr = DefaultRaw<const string*>(field);\n\n              if (ptr != default_ptr) {\n                // string fields are represented by just a pointer, so also\n                // include sizeof(string) as well.\n                total_size += sizeof(*ptr) + StringSpaceUsedExcludingSelf(*ptr);\n              }\n              break;\n            }\n          }\n          break;\n        }\n\n        case FieldDescriptor::CPPTYPE_MESSAGE:\n          if (&message == default_instance_) {\n            // For singular fields, the prototype just stores a pointer to the\n            // external type's prototype, so there is no extra memory usage.\n          } else {\n            const Message* sub_message = GetRaw<const Message*>(message, field);\n            if (sub_message != NULL) {\n              total_size += sub_message->SpaceUsed();\n            }\n          }\n          break;\n      }\n    }\n  }\n\n  return total_size;\n}\n\nvoid GeneratedMessageReflection::Swap(\n    Message* message1,\n    Message* message2) const {\n  if (message1 == message2) return;\n\n  // TODO(kenton):  Other Reflection methods should probably check this too.\n  GOOGLE_CHECK_EQ(message1->GetReflection(), this)\n    << \"First argument to Swap() (of type \\\"\"\n    << message1->GetDescriptor()->full_name()\n    << \"\\\") is not compatible with this reflection object (which is for type \\\"\"\n    << descriptor_->full_name()\n    << \"\\\").  Note that the exact same class is required; not just the same \"\n       \"descriptor.\";\n  GOOGLE_CHECK_EQ(message2->GetReflection(), this)\n    << \"Second argument to Swap() (of type \\\"\"\n    << message1->GetDescriptor()->full_name()\n    << \"\\\") is not compatible with this reflection object (which is for type \\\"\"\n    << descriptor_->full_name()\n    << \"\\\").  Note that the exact same class is required; not just the same \"\n       \"descriptor.\";\n\n  uint32* has_bits1 = MutableHasBits(message1);\n  uint32* has_bits2 = MutableHasBits(message2);\n  int has_bits_size = (descriptor_->field_count() + 31) / 32;\n\n  for (int i = 0; i < has_bits_size; i++) {\n    std::swap(has_bits1[i], has_bits2[i]);\n  }\n\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n    if (field->is_repeated()) {\n      switch (field->cpp_type()) {\n#define SWAP_ARRAYS(CPPTYPE, TYPE)                                           \\\n        case FieldDescriptor::CPPTYPE_##CPPTYPE:                             \\\n          MutableRaw<RepeatedField<TYPE> >(message1, field)->Swap(           \\\n              MutableRaw<RepeatedField<TYPE> >(message2, field));            \\\n          break;\n\n          SWAP_ARRAYS(INT32 , int32 );\n          SWAP_ARRAYS(INT64 , int64 );\n          SWAP_ARRAYS(UINT32, uint32);\n          SWAP_ARRAYS(UINT64, uint64);\n          SWAP_ARRAYS(FLOAT , float );\n          SWAP_ARRAYS(DOUBLE, double);\n          SWAP_ARRAYS(BOOL  , bool  );\n          SWAP_ARRAYS(ENUM  , int   );\n#undef SWAP_ARRAYS\n\n        case FieldDescriptor::CPPTYPE_STRING:\n        case FieldDescriptor::CPPTYPE_MESSAGE:\n          MutableRaw<RepeatedPtrFieldBase>(message1, field)->Swap(\n              MutableRaw<RepeatedPtrFieldBase>(message2, field));\n          break;\n\n        default:\n          GOOGLE_LOG(FATAL) << \"Unimplemented type: \" << field->cpp_type();\n      }\n    } else {\n      switch (field->cpp_type()) {\n#define SWAP_VALUES(CPPTYPE, TYPE)                                           \\\n        case FieldDescriptor::CPPTYPE_##CPPTYPE:                             \\\n          std::swap(*MutableRaw<TYPE>(message1, field),                      \\\n                    *MutableRaw<TYPE>(message2, field));                     \\\n          break;\n\n          SWAP_VALUES(INT32 , int32 );\n          SWAP_VALUES(INT64 , int64 );\n          SWAP_VALUES(UINT32, uint32);\n          SWAP_VALUES(UINT64, uint64);\n          SWAP_VALUES(FLOAT , float );\n          SWAP_VALUES(DOUBLE, double);\n          SWAP_VALUES(BOOL  , bool  );\n          SWAP_VALUES(ENUM  , int   );\n          SWAP_VALUES(MESSAGE, Message*);\n#undef SWAP_VALUES\n\n        case FieldDescriptor::CPPTYPE_STRING:\n          switch (field->options().ctype()) {\n            default:  // TODO(kenton):  Support other string reps.\n            case FieldOptions::STRING:\n              std::swap(*MutableRaw<string*>(message1, field),\n                        *MutableRaw<string*>(message2, field));\n              break;\n          }\n          break;\n\n        default:\n          GOOGLE_LOG(FATAL) << \"Unimplemented type: \" << field->cpp_type();\n      }\n    }\n  }\n\n  if (extensions_offset_ != -1) {\n    MutableExtensionSet(message1)->Swap(MutableExtensionSet(message2));\n  }\n\n  MutableUnknownFields(message1)->Swap(MutableUnknownFields(message2));\n}\n\n// -------------------------------------------------------------------\n\nbool GeneratedMessageReflection::HasField(const Message& message,\n                                          const FieldDescriptor* field) const {\n  USAGE_CHECK_MESSAGE_TYPE(HasField);\n  USAGE_CHECK_SINGULAR(HasField);\n\n  if (field->is_extension()) {\n    return GetExtensionSet(message).Has(field->number());\n  } else {\n    return HasBit(message, field);\n  }\n}\n\nint GeneratedMessageReflection::FieldSize(const Message& message,\n                                          const FieldDescriptor* field) const {\n  USAGE_CHECK_MESSAGE_TYPE(FieldSize);\n  USAGE_CHECK_REPEATED(FieldSize);\n\n  if (field->is_extension()) {\n    return GetExtensionSet(message).ExtensionSize(field->number());\n  } else {\n    switch (field->cpp_type()) {\n#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \\\n      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \\\n        return GetRaw<RepeatedField<LOWERCASE> >(message, field).size()\n\n      HANDLE_TYPE( INT32,  int32);\n      HANDLE_TYPE( INT64,  int64);\n      HANDLE_TYPE(UINT32, uint32);\n      HANDLE_TYPE(UINT64, uint64);\n      HANDLE_TYPE(DOUBLE, double);\n      HANDLE_TYPE( FLOAT,  float);\n      HANDLE_TYPE(  BOOL,   bool);\n      HANDLE_TYPE(  ENUM,    int);\n#undef HANDLE_TYPE\n\n      case FieldDescriptor::CPPTYPE_STRING:\n      case FieldDescriptor::CPPTYPE_MESSAGE:\n        return GetRaw<RepeatedPtrFieldBase>(message, field).size();\n    }\n\n    GOOGLE_LOG(FATAL) << \"Can't get here.\";\n    return 0;\n  }\n}\n\nvoid GeneratedMessageReflection::ClearField(\n    Message* message, const FieldDescriptor* field) const {\n  USAGE_CHECK_MESSAGE_TYPE(ClearField);\n\n  if (field->is_extension()) {\n    MutableExtensionSet(message)->ClearExtension(field->number());\n  } else if (!field->is_repeated()) {\n    if (HasBit(*message, field)) {\n      ClearBit(message, field);\n\n      // We need to set the field back to its default value.\n      switch (field->cpp_type()) {\n#define CLEAR_TYPE(CPPTYPE, TYPE)                                            \\\n        case FieldDescriptor::CPPTYPE_##CPPTYPE:                             \\\n          *MutableRaw<TYPE>(message, field) =                                \\\n            field->default_value_##TYPE();                                   \\\n          break;\n\n        CLEAR_TYPE(INT32 , int32 );\n        CLEAR_TYPE(INT64 , int64 );\n        CLEAR_TYPE(UINT32, uint32);\n        CLEAR_TYPE(UINT64, uint64);\n        CLEAR_TYPE(FLOAT , float );\n        CLEAR_TYPE(DOUBLE, double);\n        CLEAR_TYPE(BOOL  , bool  );\n#undef CLEAR_TYPE\n\n        case FieldDescriptor::CPPTYPE_ENUM:\n          *MutableRaw<int>(message, field) =\n            field->default_value_enum()->number();\n          break;\n\n        case FieldDescriptor::CPPTYPE_STRING: {\n          switch (field->options().ctype()) {\n            default:  // TODO(kenton):  Support other string reps.\n            case FieldOptions::STRING:\n              const string* default_ptr = DefaultRaw<const string*>(field);\n              string** value = MutableRaw<string*>(message, field);\n              if (*value != default_ptr) {\n                if (field->has_default_value()) {\n                  (*value)->assign(field->default_value_string());\n                } else {\n                  (*value)->clear();\n                }\n              }\n              break;\n          }\n          break;\n        }\n\n        case FieldDescriptor::CPPTYPE_MESSAGE:\n          (*MutableRaw<Message*>(message, field))->Clear();\n          break;\n      }\n    }\n  } else {\n    switch (field->cpp_type()) {\n#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \\\n      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \\\n        MutableRaw<RepeatedField<LOWERCASE> >(message, field)->Clear();       \\\n        break\n\n      HANDLE_TYPE( INT32,  int32);\n      HANDLE_TYPE( INT64,  int64);\n      HANDLE_TYPE(UINT32, uint32);\n      HANDLE_TYPE(UINT64, uint64);\n      HANDLE_TYPE(DOUBLE, double);\n      HANDLE_TYPE( FLOAT,  float);\n      HANDLE_TYPE(  BOOL,   bool);\n      HANDLE_TYPE(  ENUM,    int);\n#undef HANDLE_TYPE\n\n      case FieldDescriptor::CPPTYPE_STRING: {\n        switch (field->options().ctype()) {\n          default:  // TODO(kenton):  Support other string reps.\n          case FieldOptions::STRING:\n            MutableRaw<RepeatedPtrField<string> >(message, field)->Clear();\n            break;\n        }\n        break;\n      }\n\n      case FieldDescriptor::CPPTYPE_MESSAGE: {\n        // We don't know which subclass of RepeatedPtrFieldBase the type is,\n        // so we use RepeatedPtrFieldBase directly.\n        MutableRaw<RepeatedPtrFieldBase>(message, field)\n            ->Clear<GenericTypeHandler<Message> >();\n        break;\n      }\n    }\n  }\n}\n\nvoid GeneratedMessageReflection::RemoveLast(\n    Message* message,\n    const FieldDescriptor* field) const {\n  USAGE_CHECK_MESSAGE_TYPE(RemoveLast);\n  USAGE_CHECK_REPEATED(RemoveLast);\n\n  if (field->is_extension()) {\n    MutableExtensionSet(message)->RemoveLast(field->number());\n  } else {\n    switch (field->cpp_type()) {\n#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \\\n      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \\\n        MutableRaw<RepeatedField<LOWERCASE> >(message, field)->RemoveLast();  \\\n        break\n\n      HANDLE_TYPE( INT32,  int32);\n      HANDLE_TYPE( INT64,  int64);\n      HANDLE_TYPE(UINT32, uint32);\n      HANDLE_TYPE(UINT64, uint64);\n      HANDLE_TYPE(DOUBLE, double);\n      HANDLE_TYPE( FLOAT,  float);\n      HANDLE_TYPE(  BOOL,   bool);\n      HANDLE_TYPE(  ENUM,    int);\n#undef HANDLE_TYPE\n\n      case FieldDescriptor::CPPTYPE_STRING:\n        switch (field->options().ctype()) {\n          default:  // TODO(kenton):  Support other string reps.\n          case FieldOptions::STRING:\n            MutableRaw<RepeatedPtrField<string> >(message, field)->RemoveLast();\n            break;\n        }\n        break;\n\n      case FieldDescriptor::CPPTYPE_MESSAGE:\n        MutableRaw<RepeatedPtrFieldBase>(message, field)\n            ->RemoveLast<GenericTypeHandler<Message> >();\n        break;\n    }\n  }\n}\n\nvoid GeneratedMessageReflection::SwapElements(\n    Message* message,\n    const FieldDescriptor* field,\n    int index1,\n    int index2) const {\n  USAGE_CHECK_MESSAGE_TYPE(Swap);\n  USAGE_CHECK_REPEATED(Swap);\n\n  if (field->is_extension()) {\n    MutableExtensionSet(message)->SwapElements(field->number(), index1, index2);\n  } else {\n    switch (field->cpp_type()) {\n#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \\\n      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \\\n        MutableRaw<RepeatedField<LOWERCASE> >(message, field)                 \\\n            ->SwapElements(index1, index2);                                   \\\n        break\n\n      HANDLE_TYPE( INT32,  int32);\n      HANDLE_TYPE( INT64,  int64);\n      HANDLE_TYPE(UINT32, uint32);\n      HANDLE_TYPE(UINT64, uint64);\n      HANDLE_TYPE(DOUBLE, double);\n      HANDLE_TYPE( FLOAT,  float);\n      HANDLE_TYPE(  BOOL,   bool);\n      HANDLE_TYPE(  ENUM,    int);\n#undef HANDLE_TYPE\n\n      case FieldDescriptor::CPPTYPE_STRING:\n      case FieldDescriptor::CPPTYPE_MESSAGE:\n        MutableRaw<RepeatedPtrFieldBase>(message, field)\n            ->SwapElements(index1, index2);\n        break;\n    }\n  }\n}\n\nnamespace {\n// Comparison functor for sorting FieldDescriptors by field number.\nstruct FieldNumberSorter {\n  bool operator()(const FieldDescriptor* left,\n                  const FieldDescriptor* right) const {\n    return left->number() < right->number();\n  }\n};\n}  // namespace\n\nvoid GeneratedMessageReflection::ListFields(\n    const Message& message,\n    vector<const FieldDescriptor*>* output) const {\n  output->clear();\n\n  // Optimization:  The default instance never has any fields set.\n  if (&message == default_instance_) return;\n\n  for (int i = 0; i < descriptor_->field_count(); i++) {\n    const FieldDescriptor* field = descriptor_->field(i);\n    if (field->is_repeated()) {\n      if (FieldSize(message, field) > 0) {\n        output->push_back(field);\n      }\n    } else {\n      if (HasBit(message, field)) {\n        output->push_back(field);\n      }\n    }\n  }\n\n  if (extensions_offset_ != -1) {\n    GetExtensionSet(message).AppendToList(descriptor_, descriptor_pool_,\n                                          output);\n  }\n\n  // ListFields() must sort output by field number.\n  sort(output->begin(), output->end(), FieldNumberSorter());\n}\n\n// -------------------------------------------------------------------\n\n#undef DEFINE_PRIMITIVE_ACCESSORS\n#define DEFINE_PRIMITIVE_ACCESSORS(TYPENAME, TYPE, PASSTYPE, CPPTYPE)        \\\n  PASSTYPE GeneratedMessageReflection::Get##TYPENAME(                        \\\n      const Message& message, const FieldDescriptor* field) const {          \\\n    USAGE_CHECK_ALL(Get##TYPENAME, SINGULAR, CPPTYPE);                       \\\n    if (field->is_extension()) {                                             \\\n      return GetExtensionSet(message).Get##TYPENAME(                         \\\n        field->number(), field->default_value_##PASSTYPE());                 \\\n    } else {                                                                 \\\n      return GetField<TYPE>(message, field);                                 \\\n    }                                                                        \\\n  }                                                                          \\\n                                                                             \\\n  void GeneratedMessageReflection::Set##TYPENAME(                            \\\n      Message* message, const FieldDescriptor* field,                        \\\n      PASSTYPE value) const {                                                \\\n    USAGE_CHECK_ALL(Set##TYPENAME, SINGULAR, CPPTYPE);                       \\\n    if (field->is_extension()) {                                             \\\n      return MutableExtensionSet(message)->Set##TYPENAME(                    \\\n        field->number(), field->type(), value, field);                       \\\n    } else {                                                                 \\\n      SetField<TYPE>(message, field, value);                                 \\\n    }                                                                        \\\n  }                                                                          \\\n                                                                             \\\n  PASSTYPE GeneratedMessageReflection::GetRepeated##TYPENAME(                \\\n      const Message& message,                                                \\\n      const FieldDescriptor* field, int index) const {                       \\\n    USAGE_CHECK_ALL(GetRepeated##TYPENAME, REPEATED, CPPTYPE);               \\\n    if (field->is_extension()) {                                             \\\n      return GetExtensionSet(message).GetRepeated##TYPENAME(                 \\\n        field->number(), index);                                             \\\n    } else {                                                                 \\\n      return GetRepeatedField<TYPE>(message, field, index);                  \\\n    }                                                                        \\\n  }                                                                          \\\n                                                                             \\\n  void GeneratedMessageReflection::SetRepeated##TYPENAME(                    \\\n      Message* message, const FieldDescriptor* field,                        \\\n      int index, PASSTYPE value) const {                                     \\\n    USAGE_CHECK_ALL(SetRepeated##TYPENAME, REPEATED, CPPTYPE);               \\\n    if (field->is_extension()) {                                             \\\n      MutableExtensionSet(message)->SetRepeated##TYPENAME(                   \\\n        field->number(), index, value);                                      \\\n    } else {                                                                 \\\n      SetRepeatedField<TYPE>(message, field, index, value);                  \\\n    }                                                                        \\\n  }                                                                          \\\n                                                                             \\\n  void GeneratedMessageReflection::Add##TYPENAME(                            \\\n      Message* message, const FieldDescriptor* field,                        \\\n      PASSTYPE value) const {                                                \\\n    USAGE_CHECK_ALL(Add##TYPENAME, REPEATED, CPPTYPE);                       \\\n    if (field->is_extension()) {                                             \\\n      MutableExtensionSet(message)->Add##TYPENAME(                           \\\n        field->number(), field->type(), field->options().packed(), value,    \\\n        field);                                                              \\\n    } else {                                                                 \\\n      AddField<TYPE>(message, field, value);                                 \\\n    }                                                                        \\\n  }\n\nDEFINE_PRIMITIVE_ACCESSORS(Int32 , int32 , int32 , INT32 )\nDEFINE_PRIMITIVE_ACCESSORS(Int64 , int64 , int64 , INT64 )\nDEFINE_PRIMITIVE_ACCESSORS(UInt32, uint32, uint32, UINT32)\nDEFINE_PRIMITIVE_ACCESSORS(UInt64, uint64, uint64, UINT64)\nDEFINE_PRIMITIVE_ACCESSORS(Float , float , float , FLOAT )\nDEFINE_PRIMITIVE_ACCESSORS(Double, double, double, DOUBLE)\nDEFINE_PRIMITIVE_ACCESSORS(Bool  , bool  , bool  , BOOL  )\n#undef DEFINE_PRIMITIVE_ACCESSORS\n\n// -------------------------------------------------------------------\n\nstring GeneratedMessageReflection::GetString(\n    const Message& message, const FieldDescriptor* field) const {\n  USAGE_CHECK_ALL(GetString, SINGULAR, STRING);\n  if (field->is_extension()) {\n    return GetExtensionSet(message).GetString(field->number(),\n                                              field->default_value_string());\n  } else {\n    switch (field->options().ctype()) {\n      default:  // TODO(kenton):  Support other string reps.\n      case FieldOptions::STRING:\n        return *GetField<const string*>(message, field);\n    }\n\n    GOOGLE_LOG(FATAL) << \"Can't get here.\";\n    return kEmptyString;  // Make compiler happy.\n  }\n}\n\nconst string& GeneratedMessageReflection::GetStringReference(\n    const Message& message,\n    const FieldDescriptor* field, string* scratch) const {\n  USAGE_CHECK_ALL(GetStringReference, SINGULAR, STRING);\n  if (field->is_extension()) {\n    return GetExtensionSet(message).GetString(field->number(),\n                                              field->default_value_string());\n  } else {\n    switch (field->options().ctype()) {\n      default:  // TODO(kenton):  Support other string reps.\n      case FieldOptions::STRING:\n        return *GetField<const string*>(message, field);\n    }\n\n    GOOGLE_LOG(FATAL) << \"Can't get here.\";\n    return kEmptyString;  // Make compiler happy.\n  }\n}\n\n\nvoid GeneratedMessageReflection::SetString(\n    Message* message, const FieldDescriptor* field,\n    const string& value) const {\n  USAGE_CHECK_ALL(SetString, SINGULAR, STRING);\n  if (field->is_extension()) {\n    return MutableExtensionSet(message)->SetString(field->number(),\n                                                   field->type(), value, field);\n  } else {\n    switch (field->options().ctype()) {\n      default:  // TODO(kenton):  Support other string reps.\n      case FieldOptions::STRING: {\n        string** ptr = MutableField<string*>(message, field);\n        if (*ptr == DefaultRaw<const string*>(field)) {\n          *ptr = new string(value);\n        } else {\n          (*ptr)->assign(value);\n        }\n        break;\n      }\n    }\n  }\n}\n\n\nstring GeneratedMessageReflection::GetRepeatedString(\n    const Message& message, const FieldDescriptor* field, int index) const {\n  USAGE_CHECK_ALL(GetRepeatedString, REPEATED, STRING);\n  if (field->is_extension()) {\n    return GetExtensionSet(message).GetRepeatedString(field->number(), index);\n  } else {\n    switch (field->options().ctype()) {\n      default:  // TODO(kenton):  Support other string reps.\n      case FieldOptions::STRING:\n        return GetRepeatedPtrField<string>(message, field, index);\n    }\n\n    GOOGLE_LOG(FATAL) << \"Can't get here.\";\n    return kEmptyString;  // Make compiler happy.\n  }\n}\n\nconst string& GeneratedMessageReflection::GetRepeatedStringReference(\n    const Message& message, const FieldDescriptor* field,\n    int index, string* scratch) const {\n  USAGE_CHECK_ALL(GetRepeatedStringReference, REPEATED, STRING);\n  if (field->is_extension()) {\n    return GetExtensionSet(message).GetRepeatedString(field->number(), index);\n  } else {\n    switch (field->options().ctype()) {\n      default:  // TODO(kenton):  Support other string reps.\n      case FieldOptions::STRING:\n        return GetRepeatedPtrField<string>(message, field, index);\n    }\n\n    GOOGLE_LOG(FATAL) << \"Can't get here.\";\n    return kEmptyString;  // Make compiler happy.\n  }\n}\n\n\nvoid GeneratedMessageReflection::SetRepeatedString(\n    Message* message, const FieldDescriptor* field,\n    int index, const string& value) const {\n  USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING);\n  if (field->is_extension()) {\n    MutableExtensionSet(message)->SetRepeatedString(\n      field->number(), index, value);\n  } else {\n    switch (field->options().ctype()) {\n      default:  // TODO(kenton):  Support other string reps.\n      case FieldOptions::STRING:\n        *MutableRepeatedField<string>(message, field, index) = value;\n        break;\n    }\n  }\n}\n\n\nvoid GeneratedMessageReflection::AddString(\n    Message* message, const FieldDescriptor* field,\n    const string& value) const {\n  USAGE_CHECK_ALL(AddString, REPEATED, STRING);\n  if (field->is_extension()) {\n    MutableExtensionSet(message)->AddString(field->number(),\n                                            field->type(), value, field);\n  } else {\n    switch (field->options().ctype()) {\n      default:  // TODO(kenton):  Support other string reps.\n      case FieldOptions::STRING:\n        *AddField<string>(message, field) = value;\n        break;\n    }\n  }\n}\n\n\n// -------------------------------------------------------------------\n\nconst EnumValueDescriptor* GeneratedMessageReflection::GetEnum(\n    const Message& message, const FieldDescriptor* field) const {\n  USAGE_CHECK_ALL(GetEnum, SINGULAR, ENUM);\n\n  int value;\n  if (field->is_extension()) {\n    value = GetExtensionSet(message).GetEnum(\n      field->number(), field->default_value_enum()->number());\n  } else {\n    value = GetField<int>(message, field);\n  }\n  const EnumValueDescriptor* result =\n    field->enum_type()->FindValueByNumber(value);\n  GOOGLE_CHECK(result != NULL);\n  return result;\n}\n\nvoid GeneratedMessageReflection::SetEnum(\n    Message* message, const FieldDescriptor* field,\n    const EnumValueDescriptor* value) const {\n  USAGE_CHECK_ALL(SetEnum, SINGULAR, ENUM);\n  USAGE_CHECK_ENUM_VALUE(SetEnum);\n\n  if (field->is_extension()) {\n    MutableExtensionSet(message)->SetEnum(field->number(), field->type(),\n                                          value->number(), field);\n  } else {\n    SetField<int>(message, field, value->number());\n  }\n}\n\nconst EnumValueDescriptor* GeneratedMessageReflection::GetRepeatedEnum(\n    const Message& message, const FieldDescriptor* field, int index) const {\n  USAGE_CHECK_ALL(GetRepeatedEnum, REPEATED, ENUM);\n\n  int value;\n  if (field->is_extension()) {\n    value = GetExtensionSet(message).GetRepeatedEnum(field->number(), index);\n  } else {\n    value = GetRepeatedField<int>(message, field, index);\n  }\n  const EnumValueDescriptor* result =\n    field->enum_type()->FindValueByNumber(value);\n  GOOGLE_CHECK(result != NULL);\n  return result;\n}\n\nvoid GeneratedMessageReflection::SetRepeatedEnum(\n    Message* message,\n    const FieldDescriptor* field, int index,\n    const EnumValueDescriptor* value) const {\n  USAGE_CHECK_ALL(SetRepeatedEnum, REPEATED, ENUM);\n  USAGE_CHECK_ENUM_VALUE(SetRepeatedEnum);\n\n  if (field->is_extension()) {\n    MutableExtensionSet(message)->SetRepeatedEnum(\n      field->number(), index, value->number());\n  } else {\n    SetRepeatedField<int>(message, field, index, value->number());\n  }\n}\n\nvoid GeneratedMessageReflection::AddEnum(\n    Message* message, const FieldDescriptor* field,\n    const EnumValueDescriptor* value) const {\n  USAGE_CHECK_ALL(AddEnum, REPEATED, ENUM);\n  USAGE_CHECK_ENUM_VALUE(AddEnum);\n\n  if (field->is_extension()) {\n    MutableExtensionSet(message)->AddEnum(field->number(), field->type(),\n                                          field->options().packed(),\n                                          value->number(), field);\n  } else {\n    AddField<int>(message, field, value->number());\n  }\n}\n\n// -------------------------------------------------------------------\n\nconst Message& GeneratedMessageReflection::GetMessage(\n    const Message& message, const FieldDescriptor* field,\n    MessageFactory* factory) const {\n  USAGE_CHECK_ALL(GetMessage, SINGULAR, MESSAGE);\n\n  if (field->is_extension()) {\n    return static_cast<const Message&>(\n        GetExtensionSet(message).GetMessage(\n          field->number(), field->message_type(),\n          factory == NULL ? message_factory_ : factory));\n  } else {\n    const Message* result = GetRaw<const Message*>(message, field);\n    if (result == NULL) {\n      result = DefaultRaw<const Message*>(field);\n    }\n    return *result;\n  }\n}\n\nMessage* GeneratedMessageReflection::MutableMessage(\n    Message* message, const FieldDescriptor* field,\n    MessageFactory* factory) const {\n  USAGE_CHECK_ALL(MutableMessage, SINGULAR, MESSAGE);\n\n  if (field->is_extension()) {\n    return static_cast<Message*>(\n        MutableExtensionSet(message)->MutableMessage(field,\n          factory == NULL ? message_factory_ : factory));\n  } else {\n    Message** result = MutableField<Message*>(message, field);\n    if (*result == NULL) {\n      const Message* default_message = DefaultRaw<const Message*>(field);\n      *result = default_message->New();\n    }\n    return *result;\n  }\n}\n\nconst Message& GeneratedMessageReflection::GetRepeatedMessage(\n    const Message& message, const FieldDescriptor* field, int index) const {\n  USAGE_CHECK_ALL(GetRepeatedMessage, REPEATED, MESSAGE);\n\n  if (field->is_extension()) {\n    return static_cast<const Message&>(\n        GetExtensionSet(message).GetRepeatedMessage(field->number(), index));\n  } else {\n    return GetRaw<RepeatedPtrFieldBase>(message, field)\n        .Get<GenericTypeHandler<Message> >(index);\n  }\n}\n\nMessage* GeneratedMessageReflection::MutableRepeatedMessage(\n    Message* message, const FieldDescriptor* field, int index) const {\n  USAGE_CHECK_ALL(MutableRepeatedMessage, REPEATED, MESSAGE);\n\n  if (field->is_extension()) {\n    return static_cast<Message*>(\n        MutableExtensionSet(message)->MutableRepeatedMessage(\n          field->number(), index));\n  } else {\n    return MutableRaw<RepeatedPtrFieldBase>(message, field)\n        ->Mutable<GenericTypeHandler<Message> >(index);\n  }\n}\n\nMessage* GeneratedMessageReflection::AddMessage(\n    Message* message, const FieldDescriptor* field,\n    MessageFactory* factory) const {\n  USAGE_CHECK_ALL(AddMessage, REPEATED, MESSAGE);\n\n  if (factory == NULL) factory = message_factory_;\n\n  if (field->is_extension()) {\n    return static_cast<Message*>(\n        MutableExtensionSet(message)->AddMessage(field, factory));\n  } else {\n    // We can't use AddField<Message>() because RepeatedPtrFieldBase doesn't\n    // know how to allocate one.\n    RepeatedPtrFieldBase* repeated =\n      MutableRaw<RepeatedPtrFieldBase>(message, field);\n    Message* result = repeated->AddFromCleared<GenericTypeHandler<Message> >();\n    if (result == NULL) {\n      // We must allocate a new object.\n      const Message* prototype;\n      if (repeated->size() == 0) {\n        prototype = factory->GetPrototype(field->message_type());\n      } else {\n        prototype = &repeated->Get<GenericTypeHandler<Message> >(0);\n      }\n      result = prototype->New();\n      repeated->AddAllocated<GenericTypeHandler<Message> >(result);\n    }\n    return result;\n  }\n}\n\n// -------------------------------------------------------------------\n\nconst FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByName(\n    const string& name) const {\n  if (extensions_offset_ == -1) return NULL;\n\n  const FieldDescriptor* result = descriptor_pool_->FindExtensionByName(name);\n  if (result != NULL && result->containing_type() == descriptor_) {\n    return result;\n  }\n\n  if (descriptor_->options().message_set_wire_format()) {\n    // MessageSet extensions may be identified by type name.\n    const Descriptor* type = descriptor_pool_->FindMessageTypeByName(name);\n    if (type != NULL) {\n      // Look for a matching extension in the foreign type's scope.\n      for (int i = 0; i < type->extension_count(); i++) {\n        const FieldDescriptor* extension = type->extension(i);\n        if (extension->containing_type() == descriptor_ &&\n            extension->type() == FieldDescriptor::TYPE_MESSAGE &&\n            extension->is_optional() &&\n            extension->message_type() == type) {\n          // Found it.\n          return extension;\n        }\n      }\n    }\n  }\n\n  return NULL;\n}\n\nconst FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByNumber(\n    int number) const {\n  if (extensions_offset_ == -1) return NULL;\n  return descriptor_pool_->FindExtensionByNumber(descriptor_, number);\n}\n\n// ===================================================================\n// Some private helpers.\n\n// These simple template accessors obtain pointers (or references) to\n// the given field.\ntemplate <typename Type>\ninline const Type& GeneratedMessageReflection::GetRaw(\n    const Message& message, const FieldDescriptor* field) const {\n  const void* ptr = reinterpret_cast<const uint8*>(&message) +\n                    offsets_[field->index()];\n  return *reinterpret_cast<const Type*>(ptr);\n}\n\ntemplate <typename Type>\ninline Type* GeneratedMessageReflection::MutableRaw(\n    Message* message, const FieldDescriptor* field) const {\n  void* ptr = reinterpret_cast<uint8*>(message) + offsets_[field->index()];\n  return reinterpret_cast<Type*>(ptr);\n}\n\ntemplate <typename Type>\ninline const Type& GeneratedMessageReflection::DefaultRaw(\n    const FieldDescriptor* field) const {\n  const void* ptr = reinterpret_cast<const uint8*>(default_instance_) +\n                    offsets_[field->index()];\n  return *reinterpret_cast<const Type*>(ptr);\n}\n\ninline const uint32* GeneratedMessageReflection::GetHasBits(\n    const Message& message) const {\n  const void* ptr = reinterpret_cast<const uint8*>(&message) + has_bits_offset_;\n  return reinterpret_cast<const uint32*>(ptr);\n}\ninline uint32* GeneratedMessageReflection::MutableHasBits(\n    Message* message) const {\n  void* ptr = reinterpret_cast<uint8*>(message) + has_bits_offset_;\n  return reinterpret_cast<uint32*>(ptr);\n}\n\ninline const ExtensionSet& GeneratedMessageReflection::GetExtensionSet(\n    const Message& message) const {\n  GOOGLE_DCHECK_NE(extensions_offset_, -1);\n  const void* ptr = reinterpret_cast<const uint8*>(&message) +\n                    extensions_offset_;\n  return *reinterpret_cast<const ExtensionSet*>(ptr);\n}\ninline ExtensionSet* GeneratedMessageReflection::MutableExtensionSet(\n    Message* message) const {\n  GOOGLE_DCHECK_NE(extensions_offset_, -1);\n  void* ptr = reinterpret_cast<uint8*>(message) + extensions_offset_;\n  return reinterpret_cast<ExtensionSet*>(ptr);\n}\n\n// Simple accessors for manipulating has_bits_.\ninline bool GeneratedMessageReflection::HasBit(\n    const Message& message, const FieldDescriptor* field) const {\n  return GetHasBits(message)[field->index() / 32] &\n    (1 << (field->index() % 32));\n}\n\ninline void GeneratedMessageReflection::SetBit(\n    Message* message, const FieldDescriptor* field) const {\n  MutableHasBits(message)[field->index() / 32] |= (1 << (field->index() % 32));\n}\n\ninline void GeneratedMessageReflection::ClearBit(\n    Message* message, const FieldDescriptor* field) const {\n  MutableHasBits(message)[field->index() / 32] &= ~(1 << (field->index() % 32));\n}\n\n// Template implementations of basic accessors.  Inline because each\n// template instance is only called from one location.  These are\n// used for all types except messages.\ntemplate <typename Type>\ninline const Type& GeneratedMessageReflection::GetField(\n    const Message& message, const FieldDescriptor* field) const {\n  return GetRaw<Type>(message, field);\n}\n\ntemplate <typename Type>\ninline void GeneratedMessageReflection::SetField(\n    Message* message, const FieldDescriptor* field, const Type& value) const {\n  *MutableRaw<Type>(message, field) = value;\n  SetBit(message, field);\n}\n\ntemplate <typename Type>\ninline Type* GeneratedMessageReflection::MutableField(\n    Message* message, const FieldDescriptor* field) const {\n  SetBit(message, field);\n  return MutableRaw<Type>(message, field);\n}\n\ntemplate <typename Type>\ninline const Type& GeneratedMessageReflection::GetRepeatedField(\n    const Message& message, const FieldDescriptor* field, int index) const {\n  return GetRaw<RepeatedField<Type> >(message, field).Get(index);\n}\n\ntemplate <typename Type>\ninline const Type& GeneratedMessageReflection::GetRepeatedPtrField(\n    const Message& message, const FieldDescriptor* field, int index) const {\n  return GetRaw<RepeatedPtrField<Type> >(message, field).Get(index);\n}\n\ntemplate <typename Type>\ninline void GeneratedMessageReflection::SetRepeatedField(\n    Message* message, const FieldDescriptor* field,\n    int index, Type value) const {\n  MutableRaw<RepeatedField<Type> >(message, field)->Set(index, value);\n}\n\ntemplate <typename Type>\ninline Type* GeneratedMessageReflection::MutableRepeatedField(\n    Message* message, const FieldDescriptor* field, int index) const {\n  RepeatedPtrField<Type>* repeated =\n    MutableRaw<RepeatedPtrField<Type> >(message, field);\n  return repeated->Mutable(index);\n}\n\ntemplate <typename Type>\ninline void GeneratedMessageReflection::AddField(\n    Message* message, const FieldDescriptor* field, const Type& value) const {\n  MutableRaw<RepeatedField<Type> >(message, field)->Add(value);\n}\n\ntemplate <typename Type>\ninline Type* GeneratedMessageReflection::AddField(\n    Message* message, const FieldDescriptor* field) const {\n  RepeatedPtrField<Type>* repeated =\n    MutableRaw<RepeatedPtrField<Type> >(message, field);\n  return repeated->Add();\n}\n\n}  // namespace internal\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This header is logically internal, but is made public because it is used\n// from protocol-compiler-generated code, which may reside in other components.\n\n#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__\n#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__\n\n#include <string>\n#include <vector>\n#include <google/protobuf/message.h>\n#include <google/protobuf/unknown_field_set.h>\n\n\nnamespace google {\nnamespace protobuf {\n  class DescriptorPool;\n  // Generated code needs these to have been forward-declared.  Easier to do it\n  // here than to print them inside every .pb.h file.\n  class FileDescriptor;\n  class EnumDescriptor;\n}\n\nnamespace protobuf {\nnamespace internal {\n\n// Defined in this file.\nclass GeneratedMessageReflection;\n\n// Defined in other files.\nclass ExtensionSet;             // extension_set.h\n\n// THIS CLASS IS NOT INTENDED FOR DIRECT USE.  It is intended for use\n// by generated code.  This class is just a big hack that reduces code\n// size.\n//\n// A GeneratedMessageReflection is an implementation of Reflection\n// which expects all fields to be backed by simple variables located in\n// memory.  The locations are given using a base pointer and a set of\n// offsets.\n//\n// It is required that the user represents fields of each type in a standard\n// way, so that GeneratedMessageReflection can cast the void* pointer to\n// the appropriate type.  For primitive fields and string fields, each field\n// should be represented using the obvious C++ primitive type.  Enums and\n// Messages are different:\n//  - Singular Message fields are stored as a pointer to a Message.  These\n//    should start out NULL, except for in the default instance where they\n//    should start out pointing to other default instances.\n//  - Enum fields are stored as an int.  This int must always contain\n//    a valid value, such that EnumDescriptor::FindValueByNumber() would\n//    not return NULL.\n//  - Repeated fields are stored as RepeatedFields or RepeatedPtrFields\n//    of whatever type the individual field would be.  Strings and\n//    Messages use RepeatedPtrFields while everything else uses\n//    RepeatedFields.\nclass LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection {\n public:\n  // Constructs a GeneratedMessageReflection.\n  // Parameters:\n  //   descriptor:    The descriptor for the message type being implemented.\n  //   default_instance:  The default instance of the message.  This is only\n  //                  used to obtain pointers to default instances of embedded\n  //                  messages, which GetMessage() will return if the particular\n  //                  sub-message has not been initialized yet.  (Thus, all\n  //                  embedded message fields *must* have non-NULL pointers\n  //                  in the default instance.)\n  //   offsets:       An array of ints giving the byte offsets, relative to\n  //                  the start of the message object, of each field.  These can\n  //                  be computed at compile time using the\n  //                  GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET() macro, defined\n  //                  below.\n  //   has_bits_offset:  Offset in the message of an array of uint32s of size\n  //                  descriptor->field_count()/32, rounded up.  This is a\n  //                  bitfield where each bit indicates whether or not the\n  //                  corresponding field of the message has been initialized.\n  //                  The bit for field index i is obtained by the expression:\n  //                    has_bits[i / 32] & (1 << (i % 32))\n  //   unknown_fields_offset:  Offset in the message of the UnknownFieldSet for\n  //                  the message.\n  //   extensions_offset:  Offset in the message of the ExtensionSet for the\n  //                  message, or -1 if the message type has no extension\n  //                  ranges.\n  //   pool:          DescriptorPool to search for extension definitions.  Only\n  //                  used by FindKnownExtensionByName() and\n  //                  FindKnownExtensionByNumber().\n  //   factory:       MessageFactory to use to construct extension messages.\n  //   object_size:   The size of a message object of this type, as measured\n  //                  by sizeof().\n  GeneratedMessageReflection(const Descriptor* descriptor,\n                             const Message* default_instance,\n                             const int offsets[],\n                             int has_bits_offset,\n                             int unknown_fields_offset,\n                             int extensions_offset,\n                             const DescriptorPool* pool,\n                             MessageFactory* factory,\n                             int object_size);\n  ~GeneratedMessageReflection();\n\n  // implements Reflection -------------------------------------------\n\n  const UnknownFieldSet& GetUnknownFields(const Message& message) const;\n  UnknownFieldSet* MutableUnknownFields(Message* message) const;\n\n  int SpaceUsed(const Message& message) const;\n\n  bool HasField(const Message& message, const FieldDescriptor* field) const;\n  int FieldSize(const Message& message, const FieldDescriptor* field) const;\n  void ClearField(Message* message, const FieldDescriptor* field) const;\n  void RemoveLast(Message* message, const FieldDescriptor* field) const;\n  void Swap(Message* message1, Message* message2) const;\n  void SwapElements(Message* message, const FieldDescriptor* field,\n            int index1, int index2) const;\n  void ListFields(const Message& message,\n                  vector<const FieldDescriptor*>* output) const;\n\n  int32  GetInt32 (const Message& message,\n                   const FieldDescriptor* field) const;\n  int64  GetInt64 (const Message& message,\n                   const FieldDescriptor* field) const;\n  uint32 GetUInt32(const Message& message,\n                   const FieldDescriptor* field) const;\n  uint64 GetUInt64(const Message& message,\n                   const FieldDescriptor* field) const;\n  float  GetFloat (const Message& message,\n                   const FieldDescriptor* field) const;\n  double GetDouble(const Message& message,\n                   const FieldDescriptor* field) const;\n  bool   GetBool  (const Message& message,\n                   const FieldDescriptor* field) const;\n  string GetString(const Message& message,\n                   const FieldDescriptor* field) const;\n  const string& GetStringReference(const Message& message,\n                                   const FieldDescriptor* field,\n                                   string* scratch) const;\n  const EnumValueDescriptor* GetEnum(const Message& message,\n                                     const FieldDescriptor* field) const;\n  const Message& GetMessage(const Message& message,\n                            const FieldDescriptor* field,\n                            MessageFactory* factory = NULL) const;\n\n  void SetInt32 (Message* message,\n                 const FieldDescriptor* field, int32  value) const;\n  void SetInt64 (Message* message,\n                 const FieldDescriptor* field, int64  value) const;\n  void SetUInt32(Message* message,\n                 const FieldDescriptor* field, uint32 value) const;\n  void SetUInt64(Message* message,\n                 const FieldDescriptor* field, uint64 value) const;\n  void SetFloat (Message* message,\n                 const FieldDescriptor* field, float  value) const;\n  void SetDouble(Message* message,\n                 const FieldDescriptor* field, double value) const;\n  void SetBool  (Message* message,\n                 const FieldDescriptor* field, bool   value) const;\n  void SetString(Message* message,\n                 const FieldDescriptor* field,\n                 const string& value) const;\n  void SetEnum  (Message* message, const FieldDescriptor* field,\n                 const EnumValueDescriptor* value) const;\n  Message* MutableMessage(Message* message, const FieldDescriptor* field,\n                          MessageFactory* factory = NULL) const;\n\n  int32  GetRepeatedInt32 (const Message& message,\n                           const FieldDescriptor* field, int index) const;\n  int64  GetRepeatedInt64 (const Message& message,\n                           const FieldDescriptor* field, int index) const;\n  uint32 GetRepeatedUInt32(const Message& message,\n                           const FieldDescriptor* field, int index) const;\n  uint64 GetRepeatedUInt64(const Message& message,\n                           const FieldDescriptor* field, int index) const;\n  float  GetRepeatedFloat (const Message& message,\n                           const FieldDescriptor* field, int index) const;\n  double GetRepeatedDouble(const Message& message,\n                           const FieldDescriptor* field, int index) const;\n  bool   GetRepeatedBool  (const Message& message,\n                           const FieldDescriptor* field, int index) const;\n  string GetRepeatedString(const Message& message,\n                           const FieldDescriptor* field, int index) const;\n  const string& GetRepeatedStringReference(const Message& message,\n                                           const FieldDescriptor* field,\n                                           int index, string* scratch) const;\n  const EnumValueDescriptor* GetRepeatedEnum(const Message& message,\n                                             const FieldDescriptor* field,\n                                             int index) const;\n  const Message& GetRepeatedMessage(const Message& message,\n                                    const FieldDescriptor* field,\n                                    int index) const;\n\n  // Set the value of a field.\n  void SetRepeatedInt32 (Message* message,\n                         const FieldDescriptor* field, int index, int32  value) const;\n  void SetRepeatedInt64 (Message* message,\n                         const FieldDescriptor* field, int index, int64  value) const;\n  void SetRepeatedUInt32(Message* message,\n                         const FieldDescriptor* field, int index, uint32 value) const;\n  void SetRepeatedUInt64(Message* message,\n                         const FieldDescriptor* field, int index, uint64 value) const;\n  void SetRepeatedFloat (Message* message,\n                         const FieldDescriptor* field, int index, float  value) const;\n  void SetRepeatedDouble(Message* message,\n                         const FieldDescriptor* field, int index, double value) const;\n  void SetRepeatedBool  (Message* message,\n                         const FieldDescriptor* field, int index, bool   value) const;\n  void SetRepeatedString(Message* message,\n                         const FieldDescriptor* field, int index,\n                         const string& value) const;\n  void SetRepeatedEnum(Message* message, const FieldDescriptor* field,\n                       int index, const EnumValueDescriptor* value) const;\n  // Get a mutable pointer to a field with a message type.\n  Message* MutableRepeatedMessage(Message* message,\n                                  const FieldDescriptor* field,\n                                  int index) const;\n\n  void AddInt32 (Message* message,\n                 const FieldDescriptor* field, int32  value) const;\n  void AddInt64 (Message* message,\n                 const FieldDescriptor* field, int64  value) const;\n  void AddUInt32(Message* message,\n                 const FieldDescriptor* field, uint32 value) const;\n  void AddUInt64(Message* message,\n                 const FieldDescriptor* field, uint64 value) const;\n  void AddFloat (Message* message,\n                 const FieldDescriptor* field, float  value) const;\n  void AddDouble(Message* message,\n                 const FieldDescriptor* field, double value) const;\n  void AddBool  (Message* message,\n                 const FieldDescriptor* field, bool   value) const;\n  void AddString(Message* message,\n                 const FieldDescriptor* field, const string& value) const;\n  void AddEnum(Message* message,\n               const FieldDescriptor* field,\n               const EnumValueDescriptor* value) const;\n  Message* AddMessage(Message* message, const FieldDescriptor* field,\n                      MessageFactory* factory = NULL) const;\n\n  const FieldDescriptor* FindKnownExtensionByName(const string& name) const;\n  const FieldDescriptor* FindKnownExtensionByNumber(int number) const;\n\n private:\n  friend class GeneratedMessage;\n\n  const Descriptor* descriptor_;\n  const Message* default_instance_;\n  const int* offsets_;\n\n  int has_bits_offset_;\n  int unknown_fields_offset_;\n  int extensions_offset_;\n  int object_size_;\n\n  const DescriptorPool* descriptor_pool_;\n  MessageFactory* message_factory_;\n\n  template <typename Type>\n  inline const Type& GetRaw(const Message& message,\n                            const FieldDescriptor* field) const;\n  template <typename Type>\n  inline Type* MutableRaw(Message* message,\n                          const FieldDescriptor* field) const;\n  template <typename Type>\n  inline const Type& DefaultRaw(const FieldDescriptor* field) const;\n  inline const Message* GetMessagePrototype(const FieldDescriptor* field) const;\n\n  inline const uint32* GetHasBits(const Message& message) const;\n  inline uint32* MutableHasBits(Message* message) const;\n  inline const ExtensionSet& GetExtensionSet(const Message& message) const;\n  inline ExtensionSet* MutableExtensionSet(Message* message) const;\n\n  inline bool HasBit(const Message& message,\n                     const FieldDescriptor* field) const;\n  inline void SetBit(Message* message,\n                     const FieldDescriptor* field) const;\n  inline void ClearBit(Message* message,\n                       const FieldDescriptor* field) const;\n\n  template <typename Type>\n  inline const Type& GetField(const Message& message,\n                              const FieldDescriptor* field) const;\n  template <typename Type>\n  inline void SetField(Message* message,\n                       const FieldDescriptor* field, const Type& value) const;\n  template <typename Type>\n  inline Type* MutableField(Message* message,\n                            const FieldDescriptor* field) const;\n  template <typename Type>\n  inline const Type& GetRepeatedField(const Message& message,\n                                      const FieldDescriptor* field,\n                                      int index) const;\n  template <typename Type>\n  inline const Type& GetRepeatedPtrField(const Message& message,\n                                         const FieldDescriptor* field,\n                                         int index) const;\n  template <typename Type>\n  inline void SetRepeatedField(Message* message,\n                               const FieldDescriptor* field, int index,\n                               Type value) const;\n  template <typename Type>\n  inline Type* MutableRepeatedField(Message* message,\n                                    const FieldDescriptor* field,\n                                    int index) const;\n  template <typename Type>\n  inline void AddField(Message* message,\n                       const FieldDescriptor* field, const Type& value) const;\n  template <typename Type>\n  inline Type* AddField(Message* message,\n                        const FieldDescriptor* field) const;\n\n  int GetExtensionNumberOrDie(const Descriptor* type) const;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratedMessageReflection);\n};\n\n// Returns the offset of the given field within the given aggregate type.\n// This is equivalent to the ANSI C offsetof() macro.  However, according\n// to the C++ standard, offsetof() only works on POD types, and GCC\n// enforces this requirement with a warning.  In practice, this rule is\n// unnecessarily strict; there is probably no compiler or platform on\n// which the offsets of the direct fields of a class are non-constant.\n// Fields inherited from superclasses *can* have non-constant offsets,\n// but that's not what this macro will be used for.\n//\n// Note that we calculate relative to the pointer value 16 here since if we\n// just use zero, GCC complains about dereferencing a NULL pointer.  We\n// choose 16 rather than some other number just in case the compiler would\n// be confused by an unaligned pointer.\n#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD)    \\\n  static_cast<int>(                                           \\\n    reinterpret_cast<const char*>(                            \\\n      &reinterpret_cast<const TYPE*>(16)->FIELD) -            \\\n    reinterpret_cast<const char*>(16))\n\n// There are some places in proto2 where dynamic_cast would be useful as an\n// optimization.  For example, take Message::MergeFrom(const Message& other).\n// For a given generated message FooMessage, we generate these two methods:\n//   void MergeFrom(const FooMessage& other);\n//   void MergeFrom(const Message& other);\n// The former method can be implemented directly in terms of FooMessage's\n// inline accessors, but the latter method must work with the reflection\n// interface.  However, if the parameter to the latter method is actually of\n// type FooMessage, then we'd like to be able to just call the other method\n// as an optimization.  So, we use dynamic_cast to check this.\n//\n// That said, dynamic_cast requires RTTI, which many people like to disable\n// for performance and code size reasons.  When RTTI is not available, we\n// still need to produce correct results.  So, in this case we have to fall\n// back to using reflection, which is what we would have done anyway if the\n// objects were not of the exact same class.\n//\n// dynamic_cast_if_available() implements this logic.  If RTTI is\n// enabled, it does a dynamic_cast.  If RTTI is disabled, it just returns\n// NULL.\n//\n// If you need to compile without RTTI, simply #define GOOGLE_PROTOBUF_NO_RTTI.\n// On MSVC, this should be detected automatically.\ntemplate<typename To, typename From>\ninline To dynamic_cast_if_available(From from) {\n#if defined(GOOGLE_PROTOBUF_NO_RTTI) || (defined(_MSC_VER)&&!defined(_CPPRTTI))\n  return NULL;\n#else\n  return dynamic_cast<To>(from);\n#endif\n}\n\n// Helper for EnumType_Parse functions: try to parse the string 'name' as an\n// enum name of the given type, returning true and filling in value on success,\n// or returning false and leaving value unchanged on failure.\nLIBPROTOBUF_EXPORT bool ParseNamedEnum(const EnumDescriptor* descriptor,\n                    const string& name,\n                    int* value);\n\ntemplate<typename EnumType>\nbool ParseNamedEnum(const EnumDescriptor* descriptor,\n                    const string& name,\n                    EnumType* value) {\n  int tmp;\n  if (!ParseNamedEnum(descriptor, name, &tmp)) return false;\n  *value = static_cast<EnumType>(tmp);\n  return true;\n}\n\n// Just a wrapper around printing the name of a value. The main point of this\n// function is not to be inlined, so that you can do this without including\n// descriptor.h.\nLIBPROTOBUF_EXPORT const string& NameOfEnum(const EnumDescriptor* descriptor, int value);\n\n}  // namespace internal\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// To test GeneratedMessageReflection, we actually let the protocol compiler\n// generate a full protocol message implementation and then test its\n// reflection interface.  This is much easier and more maintainable than\n// trying to create our own Message class for GeneratedMessageReflection\n// to wrap.\n//\n// The tests here closely mirror some of the tests in\n// compiler/cpp/unittest, except using the reflection interface\n// rather than generated accessors.\n\n#include <google/protobuf/generated_message_reflection.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/test_util.h>\n#include <google/protobuf/unittest.pb.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\n\nnamespace {\n\n// Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes.\nconst FieldDescriptor* F(const string& name) {\n  const FieldDescriptor* result =\n    unittest::TestAllTypes::descriptor()->FindFieldByName(name);\n  GOOGLE_CHECK(result != NULL);\n  return result;\n}\n\nTEST(GeneratedMessageReflectionTest, Defaults) {\n  // Check that all default values are set correctly in the initial message.\n  unittest::TestAllTypes message;\n  TestUtil::ReflectionTester reflection_tester(\n    unittest::TestAllTypes::descriptor());\n\n  reflection_tester.ExpectClearViaReflection(message);\n\n  const Reflection* reflection = message.GetReflection();\n\n  // Messages should return pointers to default instances until first use.\n  // (This is not checked by ExpectClear() since it is not actually true after\n  // the fields have been set and then cleared.)\n  EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(),\n            &reflection->GetMessage(message, F(\"optionalgroup\")));\n  EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(),\n            &reflection->GetMessage(message, F(\"optional_nested_message\")));\n  EXPECT_EQ(&unittest::ForeignMessage::default_instance(),\n            &reflection->GetMessage(message, F(\"optional_foreign_message\")));\n  EXPECT_EQ(&unittest_import::ImportMessage::default_instance(),\n            &reflection->GetMessage(message, F(\"optional_import_message\")));\n}\n\nTEST(GeneratedMessageReflectionTest, Accessors) {\n  // Set every field to a unique value then go back and check all those\n  // values.\n  unittest::TestAllTypes message;\n  TestUtil::ReflectionTester reflection_tester(\n    unittest::TestAllTypes::descriptor());\n\n  reflection_tester.SetAllFieldsViaReflection(&message);\n  TestUtil::ExpectAllFieldsSet(message);\n  reflection_tester.ExpectAllFieldsSetViaReflection(message);\n\n  reflection_tester.ModifyRepeatedFieldsViaReflection(&message);\n  TestUtil::ExpectRepeatedFieldsModified(message);\n}\n\nTEST(GeneratedMessageReflectionTest, GetStringReference) {\n  // Test that GetStringReference() returns the underlying string when it is\n  // a normal string field.\n  unittest::TestAllTypes message;\n  message.set_optional_string(\"foo\");\n  message.add_repeated_string(\"foo\");\n\n  const Reflection* reflection = message.GetReflection();\n  string scratch;\n\n  EXPECT_EQ(&message.optional_string(),\n      &reflection->GetStringReference(message, F(\"optional_string\"), &scratch))\n    << \"For simple string fields, GetStringReference() should return a \"\n       \"reference to the underlying string.\";\n  EXPECT_EQ(&message.repeated_string(0),\n      &reflection->GetRepeatedStringReference(message, F(\"repeated_string\"),\n                                              0, &scratch))\n    << \"For simple string fields, GetRepeatedStringReference() should return \"\n       \"a reference to the underlying string.\";\n}\n\n\nTEST(GeneratedMessageReflectionTest, DefaultsAfterClear) {\n  // Check that after setting all fields and then clearing, getting an\n  // embedded message does NOT return the default instance.\n  unittest::TestAllTypes message;\n  TestUtil::ReflectionTester reflection_tester(\n    unittest::TestAllTypes::descriptor());\n\n  TestUtil::SetAllFields(&message);\n  message.Clear();\n\n  const Reflection* reflection = message.GetReflection();\n\n  EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(),\n            &reflection->GetMessage(message, F(\"optionalgroup\")));\n  EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),\n            &reflection->GetMessage(message, F(\"optional_nested_message\")));\n  EXPECT_NE(&unittest::ForeignMessage::default_instance(),\n            &reflection->GetMessage(message, F(\"optional_foreign_message\")));\n  EXPECT_NE(&unittest_import::ImportMessage::default_instance(),\n            &reflection->GetMessage(message, F(\"optional_import_message\")));\n}\n\n\nTEST(GeneratedMessageReflectionTest, Swap) {\n  unittest::TestAllTypes message1;\n  unittest::TestAllTypes message2;\n\n  TestUtil::SetAllFields(&message1);\n\n  const Reflection* reflection = message1.GetReflection();\n  reflection->Swap(&message1, &message2);\n\n  TestUtil::ExpectClear(message1);\n  TestUtil::ExpectAllFieldsSet(message2);\n}\n\nTEST(GeneratedMessageReflectionTest, SwapWithBothSet) {\n  unittest::TestAllTypes message1;\n  unittest::TestAllTypes message2;\n\n  TestUtil::SetAllFields(&message1);\n  TestUtil::SetAllFields(&message2);\n  TestUtil::ModifyRepeatedFields(&message2);\n\n  const Reflection* reflection = message1.GetReflection();\n  reflection->Swap(&message1, &message2);\n\n  TestUtil::ExpectRepeatedFieldsModified(message1);\n  TestUtil::ExpectAllFieldsSet(message2);\n\n  message1.set_optional_int32(532819);\n\n  reflection->Swap(&message1, &message2);\n\n  EXPECT_EQ(532819, message2.optional_int32());\n}\n\nTEST(GeneratedMessageReflectionTest, SwapExtensions) {\n  unittest::TestAllExtensions message1;\n  unittest::TestAllExtensions message2;\n\n  TestUtil::SetAllExtensions(&message1);\n\n  const Reflection* reflection = message1.GetReflection();\n  reflection->Swap(&message1, &message2);\n\n  TestUtil::ExpectExtensionsClear(message1);\n  TestUtil::ExpectAllExtensionsSet(message2);\n}\n\nTEST(GeneratedMessageReflectionTest, SwapUnknown) {\n  unittest::TestEmptyMessage message1, message2;\n\n  message1.mutable_unknown_fields()->AddVarint(1234, 1);\n\n  EXPECT_EQ(1, message1.unknown_fields().field_count());\n  EXPECT_EQ(0, message2.unknown_fields().field_count());\n  const Reflection* reflection = message1.GetReflection();\n  reflection->Swap(&message1, &message2);\n  EXPECT_EQ(0, message1.unknown_fields().field_count());\n  EXPECT_EQ(1, message2.unknown_fields().field_count());\n}\n\nTEST(GeneratedMessageReflectionTest, RemoveLast) {\n  unittest::TestAllTypes message;\n  TestUtil::ReflectionTester reflection_tester(\n    unittest::TestAllTypes::descriptor());\n\n  TestUtil::SetAllFields(&message);\n\n  reflection_tester.RemoveLastRepeatedsViaReflection(&message);\n\n  TestUtil::ExpectLastRepeatedsRemoved(message);\n}\n\nTEST(GeneratedMessageReflectionTest, RemoveLastExtensions) {\n  unittest::TestAllExtensions message;\n  TestUtil::ReflectionTester reflection_tester(\n    unittest::TestAllExtensions::descriptor());\n\n  TestUtil::SetAllExtensions(&message);\n  reflection_tester.RemoveLastRepeatedsViaReflection(&message);\n\n  TestUtil::ExpectLastRepeatedExtensionsRemoved(message);\n}\n\nTEST(GeneratedMessageReflectionTest, SwapRepeatedElements) {\n  unittest::TestAllTypes message;\n  TestUtil::ReflectionTester reflection_tester(\n    unittest::TestAllTypes::descriptor());\n\n  TestUtil::SetAllFields(&message);\n\n  // Swap and test that fields are all swapped.\n  reflection_tester.SwapRepeatedsViaReflection(&message);\n  TestUtil::ExpectRepeatedsSwapped(message);\n\n  // Swap back and test that fields are all back to original values.\n  reflection_tester.SwapRepeatedsViaReflection(&message);\n  TestUtil::ExpectAllFieldsSet(message);\n}\n\nTEST(GeneratedMessageReflectionTest, SwapRepeatedElementsExtension) {\n  unittest::TestAllExtensions message;\n  TestUtil::ReflectionTester reflection_tester(\n    unittest::TestAllExtensions::descriptor());\n\n  TestUtil::SetAllExtensions(&message);\n\n  // Swap and test that fields are all swapped.\n  reflection_tester.SwapRepeatedsViaReflection(&message);\n  TestUtil::ExpectRepeatedExtensionsSwapped(message);\n\n  // Swap back and test that fields are all back to original values.\n  reflection_tester.SwapRepeatedsViaReflection(&message);\n  TestUtil::ExpectAllExtensionsSet(message);\n}\n\nTEST(GeneratedMessageReflectionTest, Extensions) {\n  // Set every extension to a unique value then go back and check all those\n  // values.\n  unittest::TestAllExtensions message;\n  TestUtil::ReflectionTester reflection_tester(\n    unittest::TestAllExtensions::descriptor());\n\n  reflection_tester.SetAllFieldsViaReflection(&message);\n  TestUtil::ExpectAllExtensionsSet(message);\n  reflection_tester.ExpectAllFieldsSetViaReflection(message);\n\n  reflection_tester.ModifyRepeatedFieldsViaReflection(&message);\n  TestUtil::ExpectRepeatedExtensionsModified(message);\n}\n\nTEST(GeneratedMessageReflectionTest, FindExtensionTypeByNumber) {\n  const Reflection* reflection =\n    unittest::TestAllExtensions::default_instance().GetReflection();\n\n  const FieldDescriptor* extension1 =\n    unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(\n      \"optional_int32_extension\");\n  const FieldDescriptor* extension2 =\n    unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(\n      \"repeated_string_extension\");\n\n  EXPECT_EQ(extension1,\n            reflection->FindKnownExtensionByNumber(extension1->number()));\n  EXPECT_EQ(extension2,\n            reflection->FindKnownExtensionByNumber(extension2->number()));\n\n  // Non-existent extension.\n  EXPECT_TRUE(reflection->FindKnownExtensionByNumber(62341) == NULL);\n\n  // Extensions of TestAllExtensions should not show up as extensions of\n  // other types.\n  EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()->\n              FindKnownExtensionByNumber(extension1->number()) == NULL);\n}\n\nTEST(GeneratedMessageReflectionTest, FindKnownExtensionByName) {\n  const Reflection* reflection =\n    unittest::TestAllExtensions::default_instance().GetReflection();\n\n  const FieldDescriptor* extension1 =\n    unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(\n      \"optional_int32_extension\");\n  const FieldDescriptor* extension2 =\n    unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(\n      \"repeated_string_extension\");\n\n  EXPECT_EQ(extension1,\n            reflection->FindKnownExtensionByName(extension1->full_name()));\n  EXPECT_EQ(extension2,\n            reflection->FindKnownExtensionByName(extension2->full_name()));\n\n  // Non-existent extension.\n  EXPECT_TRUE(reflection->FindKnownExtensionByName(\"no_such_ext\") == NULL);\n\n  // Extensions of TestAllExtensions should not show up as extensions of\n  // other types.\n  EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()->\n              FindKnownExtensionByName(extension1->full_name()) == NULL);\n}\n\n#ifdef GTEST_HAS_DEATH_TEST\n\nTEST(GeneratedMessageReflectionTest, UsageErrors) {\n  unittest::TestAllTypes message;\n  const Reflection* reflection = message.GetReflection();\n  const Descriptor* descriptor = message.GetDescriptor();\n\n#define f(NAME) descriptor->FindFieldByName(NAME)\n\n  // Testing every single failure mode would be too much work.  Let's just\n  // check a few.\n  EXPECT_DEATH(\n    reflection->GetInt32(\n      message, descriptor->FindFieldByName(\"optional_int64\")),\n    \"Protocol Buffer reflection usage error:\\n\"\n    \"  Method      : google::protobuf::Reflection::GetInt32\\n\"\n    \"  Message type: protobuf_unittest\\\\.TestAllTypes\\n\"\n    \"  Field       : protobuf_unittest\\\\.TestAllTypes\\\\.optional_int64\\n\"\n    \"  Problem     : Field is not the right type for this message:\\n\"\n    \"    Expected  : CPPTYPE_INT32\\n\"\n    \"    Field type: CPPTYPE_INT64\");\n  EXPECT_DEATH(\n    reflection->GetInt32(\n      message, descriptor->FindFieldByName(\"repeated_int32\")),\n    \"Protocol Buffer reflection usage error:\\n\"\n    \"  Method      : google::protobuf::Reflection::GetInt32\\n\"\n    \"  Message type: protobuf_unittest.TestAllTypes\\n\"\n    \"  Field       : protobuf_unittest.TestAllTypes.repeated_int32\\n\"\n    \"  Problem     : Field is repeated; the method requires a singular field.\");\n  EXPECT_DEATH(\n    reflection->GetInt32(\n      message, unittest::ForeignMessage::descriptor()->FindFieldByName(\"c\")),\n    \"Protocol Buffer reflection usage error:\\n\"\n    \"  Method      : google::protobuf::Reflection::GetInt32\\n\"\n    \"  Message type: protobuf_unittest.TestAllTypes\\n\"\n    \"  Field       : protobuf_unittest.ForeignMessage.c\\n\"\n    \"  Problem     : Field does not match message type.\");\n  EXPECT_DEATH(\n    reflection->HasField(\n      message, unittest::ForeignMessage::descriptor()->FindFieldByName(\"c\")),\n    \"Protocol Buffer reflection usage error:\\n\"\n    \"  Method      : google::protobuf::Reflection::HasField\\n\"\n    \"  Message type: protobuf_unittest.TestAllTypes\\n\"\n    \"  Field       : protobuf_unittest.ForeignMessage.c\\n\"\n    \"  Problem     : Field does not match message type.\");\n\n#undef f\n}\n\n#endif  // GTEST_HAS_DEATH_TEST\n\n\n}  // namespace\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/generated_message_util.h>\n\n#include <limits>\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\n\ndouble Infinity() {\n  return std::numeric_limits<double>::infinity();\n}\ndouble NaN() {\n  return std::numeric_limits<double>::quiet_NaN();\n}\n\nconst ::std::string kEmptyString;\n\n\n}  // namespace internal\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file contains miscellaneous helper code used by generated code --\n// including lite types -- but which should not be used directly by users.\n\n#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__\n#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__\n\n#include <string>\n\n#include <google/protobuf/stubs/common.h>\n\n\nnamespace google {\nnamespace protobuf {\n  namespace io {\n    class CodedInputStream;      // coded_stream.h\n  }\n}\n\nnamespace protobuf {\nnamespace internal {\n\n// Annotation for the compiler to emit a deprecation message if a field marked\n// with option 'deprecated=true' is used in the code, or for other things in\n// generated code which are deprecated.\n//\n// For internal use in the pb.cc files, deprecation warnings are suppressed\n// there.\n#undef DEPRECATED_PROTOBUF_FIELD\n#if !defined(INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION)\n#  define PROTOBUF_DEPRECATED GOOGLE_ATTRIBUTE_DEPRECATED\n#else\n#  define PROTOBUF_DEPRECATED\n#endif\n\n\n// Constants for special floating point values.\nLIBPROTOBUF_EXPORT double Infinity();\nLIBPROTOBUF_EXPORT double NaN();\n\n// Constant used for empty default strings.\nLIBPROTOBUF_EXPORT extern const ::std::string kEmptyString;\n\n\n}  // namespace internal\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This implementation is heavily optimized to make reads and writes\n// of small values (especially varints) as fast as possible.  In\n// particular, we optimize for the common case that a read or a write\n// will not cross the end of the buffer, since we can avoid a lot\n// of branching in this case.\n\n#include <google/protobuf/io/coded_stream_inl.h>\n#include <algorithm>\n#include <limits.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\n\nnamespace {\n\nstatic const int kMaxVarintBytes = 10;\nstatic const int kMaxVarint32Bytes = 5;\n\n\ninline bool NextNonEmpty(ZeroCopyInputStream* input,\n                         const void** data, int* size) {\n  bool success;\n  do {\n    success = input->Next(data, size);\n  } while (success && *size == 0);\n  return success;\n}\n\n}  // namespace\n\n// CodedInputStream ==================================================\n\n\nvoid CodedInputStream::BackUpInputToCurrentPosition() {\n  int backup_bytes = BufferSize() + buffer_size_after_limit_ + overflow_bytes_;\n  if (backup_bytes > 0) {\n    input_->BackUp(backup_bytes);\n\n    // total_bytes_read_ doesn't include overflow_bytes_.\n    total_bytes_read_ -= BufferSize() + buffer_size_after_limit_;\n    buffer_end_ = buffer_;\n    buffer_size_after_limit_ = 0;\n    overflow_bytes_ = 0;\n  }\n}\n\ninline void CodedInputStream::RecomputeBufferLimits() {\n  buffer_end_ += buffer_size_after_limit_;\n  int closest_limit = min(current_limit_, total_bytes_limit_);\n  if (closest_limit < total_bytes_read_) {\n    // The limit position is in the current buffer.  We must adjust\n    // the buffer size accordingly.\n    buffer_size_after_limit_ = total_bytes_read_ - closest_limit;\n    buffer_end_ -= buffer_size_after_limit_;\n  } else {\n    buffer_size_after_limit_ = 0;\n  }\n}\n\nCodedInputStream::Limit CodedInputStream::PushLimit(int byte_limit) {\n  // Current position relative to the beginning of the stream.\n  int current_position = total_bytes_read_ -\n      (BufferSize() + buffer_size_after_limit_);\n\n  Limit old_limit = current_limit_;\n\n  // security: byte_limit is possibly evil, so check for negative values\n  // and overflow.\n  if (byte_limit >= 0 &&\n      byte_limit <= INT_MAX - current_position) {\n    current_limit_ = current_position + byte_limit;\n  } else {\n    // Negative or overflow.\n    current_limit_ = INT_MAX;\n  }\n\n  // We need to enforce all limits, not just the new one, so if the previous\n  // limit was before the new requested limit, we continue to enforce the\n  // previous limit.\n  current_limit_ = min(current_limit_, old_limit);\n\n  RecomputeBufferLimits();\n  return old_limit;\n}\n\nvoid CodedInputStream::PopLimit(Limit limit) {\n  // The limit passed in is actually the *old* limit, which we returned from\n  // PushLimit().\n  current_limit_ = limit;\n  RecomputeBufferLimits();\n\n  // We may no longer be at a legitimate message end.  ReadTag() needs to be\n  // called again to find out.\n  legitimate_message_end_ = false;\n}\n\nint CodedInputStream::BytesUntilLimit() {\n  if (current_limit_ == INT_MAX) return -1;\n  int current_position = total_bytes_read_ -\n      (BufferSize() + buffer_size_after_limit_);\n\n  return current_limit_ - current_position;\n}\n\nvoid CodedInputStream::SetTotalBytesLimit(\n    int total_bytes_limit, int warning_threshold) {\n  // Make sure the limit isn't already past, since this could confuse other\n  // code.\n  int current_position = total_bytes_read_ -\n      (BufferSize() + buffer_size_after_limit_);\n  total_bytes_limit_ = max(current_position, total_bytes_limit);\n  total_bytes_warning_threshold_ = warning_threshold;\n  RecomputeBufferLimits();\n}\n\nvoid CodedInputStream::PrintTotalBytesLimitError() {\n  GOOGLE_LOG(ERROR) << \"A protocol message was rejected because it was too \"\n                \"big (more than \" << total_bytes_limit_\n             << \" bytes).  To increase the limit (or to disable these \"\n                \"warnings), see CodedInputStream::SetTotalBytesLimit() \"\n                \"in google/protobuf/io/coded_stream.h.\";\n}\n\nbool CodedInputStream::Skip(int count) {\n  if (count < 0) return false;  // security: count is often user-supplied\n\n  const int original_buffer_size = BufferSize();\n\n  if (count <= original_buffer_size) {\n    // Just skipping within the current buffer.  Easy.\n    Advance(count);\n    return true;\n  }\n\n  if (buffer_size_after_limit_ > 0) {\n    // We hit a limit inside this buffer.  Advance to the limit and fail.\n    Advance(original_buffer_size);\n    return false;\n  }\n\n  count -= original_buffer_size;\n  buffer_ = NULL;\n  buffer_end_ = buffer_;\n\n  // Make sure this skip doesn't try to skip past the current limit.\n  int closest_limit = min(current_limit_, total_bytes_limit_);\n  int bytes_until_limit = closest_limit - total_bytes_read_;\n  if (bytes_until_limit < count) {\n    // We hit the limit.  Skip up to it then fail.\n    if (bytes_until_limit > 0) {\n      total_bytes_read_ = closest_limit;\n      input_->Skip(bytes_until_limit);\n    }\n    return false;\n  }\n\n  total_bytes_read_ += count;\n  return input_->Skip(count);\n}\n\nbool CodedInputStream::GetDirectBufferPointer(const void** data, int* size) {\n  if (BufferSize() == 0 && !Refresh()) return false;\n\n  *data = buffer_;\n  *size = BufferSize();\n  return true;\n}\n\nbool CodedInputStream::ReadRaw(void* buffer, int size) {\n  int current_buffer_size;\n  while ((current_buffer_size = BufferSize()) < size) {\n    // Reading past end of buffer.  Copy what we have, then refresh.\n    memcpy(buffer, buffer_, current_buffer_size);\n    buffer = reinterpret_cast<uint8*>(buffer) + current_buffer_size;\n    size -= current_buffer_size;\n    Advance(current_buffer_size);\n    if (!Refresh()) return false;\n  }\n\n  memcpy(buffer, buffer_, size);\n  Advance(size);\n\n  return true;\n}\n\nbool CodedInputStream::ReadString(string* buffer, int size) {\n  if (size < 0) return false;  // security: size is often user-supplied\n  return InternalReadStringInline(buffer, size);\n}\n\nbool CodedInputStream::ReadStringFallback(string* buffer, int size) {\n  if (!buffer->empty()) {\n    buffer->clear();\n  }\n\n  int current_buffer_size;\n  while ((current_buffer_size = BufferSize()) < size) {\n    // Some STL implementations \"helpfully\" crash on buffer->append(NULL, 0).\n    if (current_buffer_size != 0) {\n      // Note:  string1.append(string2) is O(string2.size()) (as opposed to\n      //   O(string1.size() + string2.size()), which would be bad).\n      buffer->append(reinterpret_cast<const char*>(buffer_),\n                     current_buffer_size);\n    }\n    size -= current_buffer_size;\n    Advance(current_buffer_size);\n    if (!Refresh()) return false;\n  }\n\n  buffer->append(reinterpret_cast<const char*>(buffer_), size);\n  Advance(size);\n\n  return true;\n}\n\n\nbool CodedInputStream::ReadLittleEndian32Fallback(uint32* value) {\n  uint8 bytes[sizeof(*value)];\n\n  const uint8* ptr;\n  if (BufferSize() >= sizeof(*value)) {\n    // Fast path:  Enough bytes in the buffer to read directly.\n    ptr = buffer_;\n    Advance(sizeof(*value));\n  } else {\n    // Slow path:  Had to read past the end of the buffer.\n    if (!ReadRaw(bytes, sizeof(*value))) return false;\n    ptr = bytes;\n  }\n  ReadLittleEndian32FromArray(ptr, value);\n  return true;\n}\n\nbool CodedInputStream::ReadLittleEndian64Fallback(uint64* value) {\n  uint8 bytes[sizeof(*value)];\n\n  const uint8* ptr;\n  if (BufferSize() >= sizeof(*value)) {\n    // Fast path:  Enough bytes in the buffer to read directly.\n    ptr = buffer_;\n    Advance(sizeof(*value));\n  } else {\n    // Slow path:  Had to read past the end of the buffer.\n    if (!ReadRaw(bytes, sizeof(*value))) return false;\n    ptr = bytes;\n  }\n  ReadLittleEndian64FromArray(ptr, value);\n  return true;\n}\n\nnamespace {\n\ninline const uint8* ReadVarint32FromArray(\n    const uint8* buffer, uint32* value) GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\ninline const uint8* ReadVarint32FromArray(const uint8* buffer, uint32* value) {\n  // Fast path:  We have enough bytes left in the buffer to guarantee that\n  // this read won't cross the end, so we can skip the checks.\n  const uint8* ptr = buffer;\n  uint32 b;\n  uint32 result;\n\n  b = *(ptr++); result  = (b & 0x7F)      ; if (!(b & 0x80)) goto done;\n  b = *(ptr++); result |= (b & 0x7F) <<  7; if (!(b & 0x80)) goto done;\n  b = *(ptr++); result |= (b & 0x7F) << 14; if (!(b & 0x80)) goto done;\n  b = *(ptr++); result |= (b & 0x7F) << 21; if (!(b & 0x80)) goto done;\n  b = *(ptr++); result |=  b         << 28; if (!(b & 0x80)) goto done;\n\n  // If the input is larger than 32 bits, we still need to read it all\n  // and discard the high-order bits.\n  for (int i = 0; i < kMaxVarintBytes - kMaxVarint32Bytes; i++) {\n    b = *(ptr++); if (!(b & 0x80)) goto done;\n  }\n\n  // We have overrun the maximum size of a varint (10 bytes).  Assume\n  // the data is corrupt.\n  return NULL;\n\n done:\n  *value = result;\n  return ptr;\n}\n\n}  // namespace\n\nbool CodedInputStream::ReadVarint32Slow(uint32* value) {\n  uint64 result;\n  // Directly invoke ReadVarint64Fallback, since we already tried to optimize\n  // for one-byte varints.\n  if (!ReadVarint64Fallback(&result)) return false;\n  *value = (uint32)result;\n  return true;\n}\n\nbool CodedInputStream::ReadVarint32Fallback(uint32* value) {\n  if (BufferSize() >= kMaxVarintBytes ||\n      // Optimization:  If the varint ends at exactly the end of the buffer,\n      // we can detect that and still use the fast path.\n      (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) {\n    const uint8* end = ReadVarint32FromArray(buffer_, value);\n    if (end == NULL) return false;\n    buffer_ = end;\n    return true;\n  } else {\n    // Really slow case: we will incur the cost of an extra function call here,\n    // but moving this out of line reduces the size of this function, which\n    // improves the common case. In micro benchmarks, this is worth about 10-15%\n    return ReadVarint32Slow(value);\n  }\n}\n\nuint32 CodedInputStream::ReadTagSlow() {\n  if (buffer_ == buffer_end_) {\n    // Call refresh.\n    if (!Refresh()) {\n      // Refresh failed.  Make sure that it failed due to EOF, not because\n      // we hit total_bytes_limit_, which, unlike normal limits, is not a\n      // valid place to end a message.\n      int current_position = total_bytes_read_ - buffer_size_after_limit_;\n      if (current_position >= total_bytes_limit_) {\n        // Hit total_bytes_limit_.  But if we also hit the normal limit,\n        // we're still OK.\n        legitimate_message_end_ = current_limit_ == total_bytes_limit_;\n      } else {\n        legitimate_message_end_ = true;\n      }\n      return 0;\n    }\n  }\n\n  // For the slow path, just do a 64-bit read. Try to optimize for one-byte tags\n  // again, since we have now refreshed the buffer.\n  uint64 result;\n  if (!ReadVarint64(&result)) return 0;\n  return static_cast<uint32>(result);\n}\n\nuint32 CodedInputStream::ReadTagFallback() {\n  if (BufferSize() >= kMaxVarintBytes ||\n      // Optimization:  If the varint ends at exactly the end of the buffer,\n      // we can detect that and still use the fast path.\n      (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) {\n    uint32 tag;\n    const uint8* end = ReadVarint32FromArray(buffer_, &tag);\n    if (end == NULL) {\n      return 0;\n    }\n    buffer_ = end;\n    return tag;\n  } else {\n    // We are commonly at a limit when attempting to read tags. Try to quickly\n    // detect this case without making another function call.\n    if (buffer_ == buffer_end_ && buffer_size_after_limit_ > 0 &&\n        // Make sure that the limit we hit is not total_bytes_limit_, since\n        // in that case we still need to call Refresh() so that it prints an\n        // error.\n        total_bytes_read_ - buffer_size_after_limit_ < total_bytes_limit_) {\n      // We hit a byte limit.\n      legitimate_message_end_ = true;\n      return 0;\n    }\n    return ReadTagSlow();\n  }\n}\n\nbool CodedInputStream::ReadVarint64Slow(uint64* value) {\n  // Slow path:  This read might cross the end of the buffer, so we\n  // need to check and refresh the buffer if and when it does.\n\n  uint64 result = 0;\n  int count = 0;\n  uint32 b;\n\n  do {\n    if (count == kMaxVarintBytes) return false;\n    while (buffer_ == buffer_end_) {\n      if (!Refresh()) return false;\n    }\n    b = *buffer_;\n    result |= static_cast<uint64>(b & 0x7F) << (7 * count);\n    Advance(1);\n    ++count;\n  } while (b & 0x80);\n\n  *value = result;\n  return true;\n}\n\nbool CodedInputStream::ReadVarint64Fallback(uint64* value) {\n  if (BufferSize() >= kMaxVarintBytes ||\n      // Optimization:  If the varint ends at exactly the end of the buffer,\n      // we can detect that and still use the fast path.\n      (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) {\n    // Fast path:  We have enough bytes left in the buffer to guarantee that\n    // this read won't cross the end, so we can skip the checks.\n\n    const uint8* ptr = buffer_;\n    uint32 b;\n\n    // Splitting into 32-bit pieces gives better performance on 32-bit\n    // processors.\n    uint32 part0 = 0, part1 = 0, part2 = 0;\n\n    b = *(ptr++); part0  = (b & 0x7F)      ; if (!(b & 0x80)) goto done;\n    b = *(ptr++); part0 |= (b & 0x7F) <<  7; if (!(b & 0x80)) goto done;\n    b = *(ptr++); part0 |= (b & 0x7F) << 14; if (!(b & 0x80)) goto done;\n    b = *(ptr++); part0 |= (b & 0x7F) << 21; if (!(b & 0x80)) goto done;\n    b = *(ptr++); part1  = (b & 0x7F)      ; if (!(b & 0x80)) goto done;\n    b = *(ptr++); part1 |= (b & 0x7F) <<  7; if (!(b & 0x80)) goto done;\n    b = *(ptr++); part1 |= (b & 0x7F) << 14; if (!(b & 0x80)) goto done;\n    b = *(ptr++); part1 |= (b & 0x7F) << 21; if (!(b & 0x80)) goto done;\n    b = *(ptr++); part2  = (b & 0x7F)      ; if (!(b & 0x80)) goto done;\n    b = *(ptr++); part2 |= (b & 0x7F) <<  7; if (!(b & 0x80)) goto done;\n\n    // We have overrun the maximum size of a varint (10 bytes).  The data\n    // must be corrupt.\n    return NULL;\n\n   done:\n    Advance(ptr - buffer_);\n    *value = (static_cast<uint64>(part0)      ) |\n             (static_cast<uint64>(part1) << 28) |\n             (static_cast<uint64>(part2) << 56);\n    return true;\n  } else {\n    return ReadVarint64Slow(value);\n  }\n}\n\nbool CodedInputStream::Refresh() {\n  GOOGLE_DCHECK_EQ(0, BufferSize());\n\n  if (buffer_size_after_limit_ > 0 || overflow_bytes_ > 0 ||\n      total_bytes_read_ == current_limit_) {\n    // We've hit a limit.  Stop.\n    int current_position = total_bytes_read_ - buffer_size_after_limit_;\n\n    if (current_position >= total_bytes_limit_ &&\n        total_bytes_limit_ != current_limit_) {\n      // Hit total_bytes_limit_.\n      PrintTotalBytesLimitError();\n    }\n\n    return false;\n  }\n\n  if (total_bytes_warning_threshold_ >= 0 &&\n      total_bytes_read_ >= total_bytes_warning_threshold_) {\n      GOOGLE_LOG(WARNING) << \"Reading dangerously large protocol message.  If the \"\n                      \"message turns out to be larger than \"\n                   << total_bytes_limit_ << \" bytes, parsing will be halted \"\n                      \"for security reasons.  To increase the limit (or to \"\n                      \"disable these warnings), see \"\n                      \"CodedInputStream::SetTotalBytesLimit() in \"\n                      \"google/protobuf/io/coded_stream.h.\";\n\n    // Don't warn again for this stream.\n    total_bytes_warning_threshold_ = -1;\n  }\n\n  const void* void_buffer;\n  int buffer_size;\n  if (NextNonEmpty(input_, &void_buffer, &buffer_size)) {\n    buffer_ = reinterpret_cast<const uint8*>(void_buffer);\n    buffer_end_ = buffer_ + buffer_size;\n    GOOGLE_CHECK_GE(buffer_size, 0);\n\n    if (total_bytes_read_ <= INT_MAX - buffer_size) {\n      total_bytes_read_ += buffer_size;\n    } else {\n      // Overflow.  Reset buffer_end_ to not include the bytes beyond INT_MAX.\n      // We can't get that far anyway, because total_bytes_limit_ is guaranteed\n      // to be less than it.  We need to keep track of the number of bytes\n      // we discarded, though, so that we can call input_->BackUp() to back\n      // up over them on destruction.\n\n      // The following line is equivalent to:\n      //   overflow_bytes_ = total_bytes_read_ + buffer_size - INT_MAX;\n      // except that it avoids overflows.  Signed integer overflow has\n      // undefined results according to the C standard.\n      overflow_bytes_ = total_bytes_read_ - (INT_MAX - buffer_size);\n      buffer_end_ -= overflow_bytes_;\n      total_bytes_read_ = INT_MAX;\n    }\n\n    RecomputeBufferLimits();\n    return true;\n  } else {\n    buffer_ = NULL;\n    buffer_end_ = NULL;\n    return false;\n  }\n}\n\n// CodedOutputStream =================================================\n\nCodedOutputStream::CodedOutputStream(ZeroCopyOutputStream* output)\n  : output_(output),\n    buffer_(NULL),\n    buffer_size_(0),\n    total_bytes_(0),\n    had_error_(false) {\n  // Eagerly Refresh() so buffer space is immediately available.\n  Refresh();\n  // The Refresh() may have failed. If the client doesn't write any data,\n  // though, don't consider this an error. If the client does write data, then\n  // another Refresh() will be attempted and it will set the error once again.\n  had_error_ = false;\n}\n\nCodedOutputStream::~CodedOutputStream() {\n  if (buffer_size_ > 0) {\n    output_->BackUp(buffer_size_);\n  }\n}\n\nbool CodedOutputStream::Skip(int count) {\n  if (count < 0) return false;\n\n  while (count > buffer_size_) {\n    count -= buffer_size_;\n    if (!Refresh()) return false;\n  }\n\n  Advance(count);\n  return true;\n}\n\nbool CodedOutputStream::GetDirectBufferPointer(void** data, int* size) {\n  if (buffer_size_ == 0 && !Refresh()) return false;\n\n  *data = buffer_;\n  *size = buffer_size_;\n  return true;\n}\n\nvoid CodedOutputStream::WriteRaw(const void* data, int size) {\n  while (buffer_size_ < size) {\n    memcpy(buffer_, data, buffer_size_);\n    size -= buffer_size_;\n    data = reinterpret_cast<const uint8*>(data) + buffer_size_;\n    if (!Refresh()) return;\n  }\n\n  memcpy(buffer_, data, size);\n  Advance(size);\n}\n\nuint8* CodedOutputStream::WriteRawToArray(\n    const void* data, int size, uint8* target) {\n  memcpy(target, data, size);\n  return target + size;\n}\n\n\nvoid CodedOutputStream::WriteLittleEndian32(uint32 value) {\n  uint8 bytes[sizeof(value)];\n\n  bool use_fast = buffer_size_ >= sizeof(value);\n  uint8* ptr = use_fast ? buffer_ : bytes;\n\n  WriteLittleEndian32ToArray(value, ptr);\n\n  if (use_fast) {\n    Advance(sizeof(value));\n  } else {\n    WriteRaw(bytes, sizeof(value));\n  }\n}\n\nvoid CodedOutputStream::WriteLittleEndian64(uint64 value) {\n  uint8 bytes[sizeof(value)];\n\n  bool use_fast = buffer_size_ >= sizeof(value);\n  uint8* ptr = use_fast ? buffer_ : bytes;\n\n  WriteLittleEndian64ToArray(value, ptr);\n\n  if (use_fast) {\n    Advance(sizeof(value));\n  } else {\n    WriteRaw(bytes, sizeof(value));\n  }\n}\n\ninline uint8* CodedOutputStream::WriteVarint32FallbackToArrayInline(\n    uint32 value, uint8* target) {\n  target[0] = static_cast<uint8>(value | 0x80);\n  if (value >= (1 << 7)) {\n    target[1] = static_cast<uint8>((value >>  7) | 0x80);\n    if (value >= (1 << 14)) {\n      target[2] = static_cast<uint8>((value >> 14) | 0x80);\n      if (value >= (1 << 21)) {\n        target[3] = static_cast<uint8>((value >> 21) | 0x80);\n        if (value >= (1 << 28)) {\n          target[4] = static_cast<uint8>(value >> 28);\n          return target + 5;\n        } else {\n          target[3] &= 0x7F;\n          return target + 4;\n        }\n      } else {\n        target[2] &= 0x7F;\n        return target + 3;\n      }\n    } else {\n      target[1] &= 0x7F;\n      return target + 2;\n    }\n  } else {\n    target[0] &= 0x7F;\n    return target + 1;\n  }\n}\n\nvoid CodedOutputStream::WriteVarint32(uint32 value) {\n  if (buffer_size_ >= kMaxVarint32Bytes) {\n    // Fast path:  We have enough bytes left in the buffer to guarantee that\n    // this write won't cross the end, so we can skip the checks.\n    uint8* target = buffer_;\n    uint8* end = WriteVarint32FallbackToArrayInline(value, target);\n    int size = end - target;\n    Advance(size);\n  } else {\n    // Slow path:  This write might cross the end of the buffer, so we\n    // compose the bytes first then use WriteRaw().\n    uint8 bytes[kMaxVarint32Bytes];\n    int size = 0;\n    while (value > 0x7F) {\n      bytes[size++] = (static_cast<uint8>(value) & 0x7F) | 0x80;\n      value >>= 7;\n    }\n    bytes[size++] = static_cast<uint8>(value) & 0x7F;\n    WriteRaw(bytes, size);\n  }\n}\n\nuint8* CodedOutputStream::WriteVarint32FallbackToArray(\n    uint32 value, uint8* target) {\n  return WriteVarint32FallbackToArrayInline(value, target);\n}\n\ninline uint8* CodedOutputStream::WriteVarint64ToArrayInline(\n    uint64 value, uint8* target) {\n  // Splitting into 32-bit pieces gives better performance on 32-bit\n  // processors.\n  uint32 part0 = static_cast<uint32>(value      );\n  uint32 part1 = static_cast<uint32>(value >> 28);\n  uint32 part2 = static_cast<uint32>(value >> 56);\n\n  int size;\n\n  // Here we can't really optimize for small numbers, since the value is\n  // split into three parts.  Cheking for numbers < 128, for instance,\n  // would require three comparisons, since you'd have to make sure part1\n  // and part2 are zero.  However, if the caller is using 64-bit integers,\n  // it is likely that they expect the numbers to often be very large, so\n  // we probably don't want to optimize for small numbers anyway.  Thus,\n  // we end up with a hardcoded binary search tree...\n  if (part2 == 0) {\n    if (part1 == 0) {\n      if (part0 < (1 << 14)) {\n        if (part0 < (1 << 7)) {\n          size = 1; goto size1;\n        } else {\n          size = 2; goto size2;\n        }\n      } else {\n        if (part0 < (1 << 21)) {\n          size = 3; goto size3;\n        } else {\n          size = 4; goto size4;\n        }\n      }\n    } else {\n      if (part1 < (1 << 14)) {\n        if (part1 < (1 << 7)) {\n          size = 5; goto size5;\n        } else {\n          size = 6; goto size6;\n        }\n      } else {\n        if (part1 < (1 << 21)) {\n          size = 7; goto size7;\n        } else {\n          size = 8; goto size8;\n        }\n      }\n    }\n  } else {\n    if (part2 < (1 << 7)) {\n      size = 9; goto size9;\n    } else {\n      size = 10; goto size10;\n    }\n  }\n\n  GOOGLE_LOG(FATAL) << \"Can't get here.\";\n\n  size10: target[9] = static_cast<uint8>((part2 >>  7) | 0x80);\n  size9 : target[8] = static_cast<uint8>((part2      ) | 0x80);\n  size8 : target[7] = static_cast<uint8>((part1 >> 21) | 0x80);\n  size7 : target[6] = static_cast<uint8>((part1 >> 14) | 0x80);\n  size6 : target[5] = static_cast<uint8>((part1 >>  7) | 0x80);\n  size5 : target[4] = static_cast<uint8>((part1      ) | 0x80);\n  size4 : target[3] = static_cast<uint8>((part0 >> 21) | 0x80);\n  size3 : target[2] = static_cast<uint8>((part0 >> 14) | 0x80);\n  size2 : target[1] = static_cast<uint8>((part0 >>  7) | 0x80);\n  size1 : target[0] = static_cast<uint8>((part0      ) | 0x80);\n\n  target[size-1] &= 0x7F;\n  return target + size;\n}\n\nvoid CodedOutputStream::WriteVarint64(uint64 value) {\n  if (buffer_size_ >= kMaxVarintBytes) {\n    // Fast path:  We have enough bytes left in the buffer to guarantee that\n    // this write won't cross the end, so we can skip the checks.\n    uint8* target = buffer_;\n\n    uint8* end = WriteVarint64ToArrayInline(value, target);\n    int size = end - target;\n    Advance(size);\n  } else {\n    // Slow path:  This write might cross the end of the buffer, so we\n    // compose the bytes first then use WriteRaw().\n    uint8 bytes[kMaxVarintBytes];\n    int size = 0;\n    while (value > 0x7F) {\n      bytes[size++] = (static_cast<uint8>(value) & 0x7F) | 0x80;\n      value >>= 7;\n    }\n    bytes[size++] = static_cast<uint8>(value) & 0x7F;\n    WriteRaw(bytes, size);\n  }\n}\n\nuint8* CodedOutputStream::WriteVarint64ToArray(\n    uint64 value, uint8* target) {\n  return WriteVarint64ToArrayInline(value, target);\n}\n\nbool CodedOutputStream::Refresh() {\n  void* void_buffer;\n  if (output_->Next(&void_buffer, &buffer_size_)) {\n    buffer_ = reinterpret_cast<uint8*>(void_buffer);\n    total_bytes_ += buffer_size_;\n    return true;\n  } else {\n    buffer_ = NULL;\n    buffer_size_ = 0;\n    had_error_ = true;\n    return false;\n  }\n}\n\nint CodedOutputStream::VarintSize32Fallback(uint32 value) {\n  if (value < (1 << 7)) {\n    return 1;\n  } else if (value < (1 << 14)) {\n    return 2;\n  } else if (value < (1 << 21)) {\n    return 3;\n  } else if (value < (1 << 28)) {\n    return 4;\n  } else {\n    return 5;\n  }\n}\n\nint CodedOutputStream::VarintSize64(uint64 value) {\n  if (value < (1ull << 35)) {\n    if (value < (1ull << 7)) {\n      return 1;\n    } else if (value < (1ull << 14)) {\n      return 2;\n    } else if (value < (1ull << 21)) {\n      return 3;\n    } else if (value < (1ull << 28)) {\n      return 4;\n    } else {\n      return 5;\n    }\n  } else {\n    if (value < (1ull << 42)) {\n      return 6;\n    } else if (value < (1ull << 49)) {\n      return 7;\n    } else if (value < (1ull << 56)) {\n      return 8;\n    } else if (value < (1ull << 63)) {\n      return 9;\n    } else {\n      return 10;\n    }\n  }\n}\n\n}  // namespace io\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file contains the CodedInputStream and CodedOutputStream classes,\n// which wrap a ZeroCopyInputStream or ZeroCopyOutputStream, respectively,\n// and allow you to read or write individual pieces of data in various\n// formats.  In particular, these implement the varint encoding for\n// integers, a simple variable-length encoding in which smaller numbers\n// take fewer bytes.\n//\n// Typically these classes will only be used internally by the protocol\n// buffer library in order to encode and decode protocol buffers.  Clients\n// of the library only need to know about this class if they wish to write\n// custom message parsing or serialization procedures.\n//\n// CodedOutputStream example:\n//   // Write some data to \"myfile\".  First we write a 4-byte \"magic number\"\n//   // to identify the file type, then write a length-delimited string.  The\n//   // string is composed of a varint giving the length followed by the raw\n//   // bytes.\n//   int fd = open(\"myfile\", O_WRONLY);\n//   ZeroCopyOutputStream* raw_output = new FileOutputStream(fd);\n//   CodedOutputStream* coded_output = new CodedOutputStream(raw_output);\n//\n//   int magic_number = 1234;\n//   char text[] = \"Hello world!\";\n//   coded_output->WriteLittleEndian32(magic_number);\n//   coded_output->WriteVarint32(strlen(text));\n//   coded_output->WriteRaw(text, strlen(text));\n//\n//   delete coded_output;\n//   delete raw_output;\n//   close(fd);\n//\n// CodedInputStream example:\n//   // Read a file created by the above code.\n//   int fd = open(\"myfile\", O_RDONLY);\n//   ZeroCopyInputStream* raw_input = new FileInputStream(fd);\n//   CodedInputStream coded_input = new CodedInputStream(raw_input);\n//\n//   coded_input->ReadLittleEndian32(&magic_number);\n//   if (magic_number != 1234) {\n//     cerr << \"File not in expected format.\" << endl;\n//     return;\n//   }\n//\n//   uint32 size;\n//   coded_input->ReadVarint32(&size);\n//\n//   char* text = new char[size + 1];\n//   coded_input->ReadRaw(buffer, size);\n//   text[size] = '\\0';\n//\n//   delete coded_input;\n//   delete raw_input;\n//   close(fd);\n//\n//   cout << \"Text is: \" << text << endl;\n//   delete [] text;\n//\n// For those who are interested, varint encoding is defined as follows:\n//\n// The encoding operates on unsigned integers of up to 64 bits in length.\n// Each byte of the encoded value has the format:\n// * bits 0-6: Seven bits of the number being encoded.\n// * bit 7: Zero if this is the last byte in the encoding (in which\n//   case all remaining bits of the number are zero) or 1 if\n//   more bytes follow.\n// The first byte contains the least-significant 7 bits of the number, the\n// second byte (if present) contains the next-least-significant 7 bits,\n// and so on.  So, the binary number 1011000101011 would be encoded in two\n// bytes as \"10101011 00101100\".\n//\n// In theory, varint could be used to encode integers of any length.\n// However, for practicality we set a limit at 64 bits.  The maximum encoded\n// length of a number is thus 10 bytes.\n\n#ifndef GOOGLE_PROTOBUF_IO_CODED_STREAM_H__\n#define GOOGLE_PROTOBUF_IO_CODED_STREAM_H__\n\n#include <string>\n#ifdef _MSC_VER\n  #if defined(_M_IX86) && \\\n      !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST)\n    #define PROTOBUF_LITTLE_ENDIAN 1\n  #endif\n  #if _MSC_VER >= 1300\n    // If MSVC has \"/RTCc\" set, it will complain about truncating casts at\n    // runtime.  This file contains some intentional truncating casts.\n    #pragma runtime_checks(\"c\", off)\n  #endif\n#else\n  #include <sys/param.h>   // __BYTE_ORDER\n  #if defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN && \\\n      !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST)\n    #define PROTOBUF_LITTLE_ENDIAN 1\n  #endif\n#endif\n#include <google/protobuf/stubs/common.h>\n\n\nnamespace google {\nnamespace protobuf {\n\nclass DescriptorPool;\nclass MessageFactory;\n\nnamespace io {\n\n// Defined in this file.\nclass CodedInputStream;\nclass CodedOutputStream;\n\n// Defined in other files.\nclass ZeroCopyInputStream;           // zero_copy_stream.h\nclass ZeroCopyOutputStream;          // zero_copy_stream.h\n\n// Class which reads and decodes binary data which is composed of varint-\n// encoded integers and fixed-width pieces.  Wraps a ZeroCopyInputStream.\n// Most users will not need to deal with CodedInputStream.\n//\n// Most methods of CodedInputStream that return a bool return false if an\n// underlying I/O error occurs or if the data is malformed.  Once such a\n// failure occurs, the CodedInputStream is broken and is no longer useful.\nclass LIBPROTOBUF_EXPORT CodedInputStream {\n public:\n  // Create a CodedInputStream that reads from the given ZeroCopyInputStream.\n  explicit CodedInputStream(ZeroCopyInputStream* input);\n\n  // Create a CodedInputStream that reads from the given flat array.  This is\n  // faster than using an ArrayInputStream.  PushLimit(size) is implied by\n  // this constructor.\n  explicit CodedInputStream(const uint8* buffer, int size);\n\n  // Destroy the CodedInputStream and position the underlying\n  // ZeroCopyInputStream at the first unread byte.  If an error occurred while\n  // reading (causing a method to return false), then the exact position of\n  // the input stream may be anywhere between the last value that was read\n  // successfully and the stream's byte limit.\n  ~CodedInputStream();\n\n\n  // Skips a number of bytes.  Returns false if an underlying read error\n  // occurs.\n  bool Skip(int count);\n\n  // Sets *data to point directly at the unread part of the CodedInputStream's\n  // underlying buffer, and *size to the size of that buffer, but does not\n  // advance the stream's current position.  This will always either produce\n  // a non-empty buffer or return false.  If the caller consumes any of\n  // this data, it should then call Skip() to skip over the consumed bytes.\n  // This may be useful for implementing external fast parsing routines for\n  // types of data not covered by the CodedInputStream interface.\n  bool GetDirectBufferPointer(const void** data, int* size);\n\n  // Like GetDirectBufferPointer, but this method is inlined, and does not\n  // attempt to Refresh() if the buffer is currently empty.\n  inline void GetDirectBufferPointerInline(const void** data,\n                                           int* size) GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\n\n  // Read raw bytes, copying them into the given buffer.\n  bool ReadRaw(void* buffer, int size);\n\n  // Like ReadRaw, but reads into a string.\n  //\n  // Implementation Note:  ReadString() grows the string gradually as it\n  // reads in the data, rather than allocating the entire requested size\n  // upfront.  This prevents denial-of-service attacks in which a client\n  // could claim that a string is going to be MAX_INT bytes long in order to\n  // crash the server because it can't allocate this much space at once.\n  bool ReadString(string* buffer, int size);\n  // Like the above, with inlined optimizations. This should only be used\n  // by the protobuf implementation.\n  inline bool InternalReadStringInline(string* buffer,\n                                       int size) GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\n\n\n  // Read a 32-bit little-endian integer.\n  bool ReadLittleEndian32(uint32* value);\n  // Read a 64-bit little-endian integer.\n  bool ReadLittleEndian64(uint64* value);\n\n  // These methods read from an externally provided buffer. The caller is\n  // responsible for ensuring that the buffer has sufficient space.\n  // Read a 32-bit little-endian integer.\n  static const uint8* ReadLittleEndian32FromArray(const uint8* buffer,\n                                                   uint32* value);\n  // Read a 64-bit little-endian integer.\n  static const uint8* ReadLittleEndian64FromArray(const uint8* buffer,\n                                                   uint64* value);\n\n  // Read an unsigned integer with Varint encoding, truncating to 32 bits.\n  // Reading a 32-bit value is equivalent to reading a 64-bit one and casting\n  // it to uint32, but may be more efficient.\n  bool ReadVarint32(uint32* value);\n  // Read an unsigned integer with Varint encoding.\n  bool ReadVarint64(uint64* value);\n\n  // Read a tag.  This calls ReadVarint32() and returns the result, or returns\n  // zero (which is not a valid tag) if ReadVarint32() fails.  Also, it updates\n  // the last tag value, which can be checked with LastTagWas().\n  // Always inline because this is only called in once place per parse loop\n  // but it is called for every iteration of said loop, so it should be fast.\n  // GCC doesn't want to inline this by default.\n  uint32 ReadTag() GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\n\n  // Usually returns true if calling ReadVarint32() now would produce the given\n  // value.  Will always return false if ReadVarint32() would not return the\n  // given value.  If ExpectTag() returns true, it also advances past\n  // the varint.  For best performance, use a compile-time constant as the\n  // parameter.\n  // Always inline because this collapses to a small number of instructions\n  // when given a constant parameter, but GCC doesn't want to inline by default.\n  bool ExpectTag(uint32 expected) GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\n\n  // Like above, except this reads from the specified buffer. The caller is\n  // responsible for ensuring that the buffer is large enough to read a varint\n  // of the expected size. For best performance, use a compile-time constant as\n  // the expected tag parameter.\n  //\n  // Returns a pointer beyond the expected tag if it was found, or NULL if it\n  // was not.\n  static const uint8* ExpectTagFromArray(\n      const uint8* buffer,\n      uint32 expected) GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\n\n  // Usually returns true if no more bytes can be read.  Always returns false\n  // if more bytes can be read.  If ExpectAtEnd() returns true, a subsequent\n  // call to LastTagWas() will act as if ReadTag() had been called and returned\n  // zero, and ConsumedEntireMessage() will return true.\n  bool ExpectAtEnd();\n\n  // If the last call to ReadTag() returned the given value, returns true.\n  // Otherwise, returns false;\n  //\n  // This is needed because parsers for some types of embedded messages\n  // (with field type TYPE_GROUP) don't actually know that they've reached the\n  // end of a message until they see an ENDGROUP tag, which was actually part\n  // of the enclosing message.  The enclosing message would like to check that\n  // tag to make sure it had the right number, so it calls LastTagWas() on\n  // return from the embedded parser to check.\n  bool LastTagWas(uint32 expected);\n\n  // When parsing message (but NOT a group), this method must be called\n  // immediately after MergeFromCodedStream() returns (if it returns true)\n  // to further verify that the message ended in a legitimate way.  For\n  // example, this verifies that parsing did not end on an end-group tag.\n  // It also checks for some cases where, due to optimizations,\n  // MergeFromCodedStream() can incorrectly return true.\n  bool ConsumedEntireMessage();\n\n  // Limits ----------------------------------------------------------\n  // Limits are used when parsing length-delimited embedded messages.\n  // After the message's length is read, PushLimit() is used to prevent\n  // the CodedInputStream from reading beyond that length.  Once the\n  // embedded message has been parsed, PopLimit() is called to undo the\n  // limit.\n\n  // Opaque type used with PushLimit() and PopLimit().  Do not modify\n  // values of this type yourself.  The only reason that this isn't a\n  // struct with private internals is for efficiency.\n  typedef int Limit;\n\n  // Places a limit on the number of bytes that the stream may read,\n  // starting from the current position.  Once the stream hits this limit,\n  // it will act like the end of the input has been reached until PopLimit()\n  // is called.\n  //\n  // As the names imply, the stream conceptually has a stack of limits.  The\n  // shortest limit on the stack is always enforced, even if it is not the\n  // top limit.\n  //\n  // The value returned by PushLimit() is opaque to the caller, and must\n  // be passed unchanged to the corresponding call to PopLimit().\n  Limit PushLimit(int byte_limit);\n\n  // Pops the last limit pushed by PushLimit().  The input must be the value\n  // returned by that call to PushLimit().\n  void PopLimit(Limit limit);\n\n  // Returns the number of bytes left until the nearest limit on the\n  // stack is hit, or -1 if no limits are in place.\n  int BytesUntilLimit();\n\n  // Total Bytes Limit -----------------------------------------------\n  // To prevent malicious users from sending excessively large messages\n  // and causing integer overflows or memory exhaustion, CodedInputStream\n  // imposes a hard limit on the total number of bytes it will read.\n\n  // Sets the maximum number of bytes that this CodedInputStream will read\n  // before refusing to continue.  To prevent integer overflows in the\n  // protocol buffers implementation, as well as to prevent servers from\n  // allocating enormous amounts of memory to hold parsed messages, the\n  // maximum message length should be limited to the shortest length that\n  // will not harm usability.  The theoretical shortest message that could\n  // cause integer overflows is 512MB.  The default limit is 64MB.  Apps\n  // should set shorter limits if possible.  If warning_threshold is not -1,\n  // a warning will be printed to stderr after warning_threshold bytes are\n  // read.  An error will always be printed to stderr if the limit is\n  // reached.\n  //\n  // This is unrelated to PushLimit()/PopLimit().\n  //\n  // Hint:  If you are reading this because your program is printing a\n  //   warning about dangerously large protocol messages, you may be\n  //   confused about what to do next.  The best option is to change your\n  //   design such that excessively large messages are not necessary.\n  //   For example, try to design file formats to consist of many small\n  //   messages rather than a single large one.  If this is infeasible,\n  //   you will need to increase the limit.  Chances are, though, that\n  //   your code never constructs a CodedInputStream on which the limit\n  //   can be set.  You probably parse messages by calling things like\n  //   Message::ParseFromString().  In this case, you will need to change\n  //   your code to instead construct some sort of ZeroCopyInputStream\n  //   (e.g. an ArrayInputStream), construct a CodedInputStream around\n  //   that, then call Message::ParseFromCodedStream() instead.  Then\n  //   you can adjust the limit.  Yes, it's more work, but you're doing\n  //   something unusual.\n  void SetTotalBytesLimit(int total_bytes_limit, int warning_threshold);\n\n  // Recursion Limit -------------------------------------------------\n  // To prevent corrupt or malicious messages from causing stack overflows,\n  // we must keep track of the depth of recursion when parsing embedded\n  // messages and groups.  CodedInputStream keeps track of this because it\n  // is the only object that is passed down the stack during parsing.\n\n  // Sets the maximum recursion depth.  The default is 64.\n  void SetRecursionLimit(int limit);\n\n  // Increments the current recursion depth.  Returns true if the depth is\n  // under the limit, false if it has gone over.\n  bool IncrementRecursionDepth();\n\n  // Decrements the recursion depth.\n  void DecrementRecursionDepth();\n\n  // Extension Registry ----------------------------------------------\n  // ADVANCED USAGE:  99.9% of people can ignore this section.\n  //\n  // By default, when parsing extensions, the parser looks for extension\n  // definitions in the pool which owns the outer message's Descriptor.\n  // However, you may call SetExtensionRegistry() to provide an alternative\n  // pool instead.  This makes it possible, for example, to parse a message\n  // using a generated class, but represent some extensions using\n  // DynamicMessage.\n\n  // Set the pool used to look up extensions.  Most users do not need to call\n  // this as the correct pool will be chosen automatically.\n  //\n  // WARNING:  It is very easy to misuse this.  Carefully read the requirements\n  //   below.  Do not use this unless you are sure you need it.  Almost no one\n  //   does.\n  //\n  // Let's say you are parsing a message into message object m, and you want\n  // to take advantage of SetExtensionRegistry().  You must follow these\n  // requirements:\n  //\n  // The given DescriptorPool must contain m->GetDescriptor().  It is not\n  // sufficient for it to simply contain a descriptor that has the same name\n  // and content -- it must be the *exact object*.  In other words:\n  //   assert(pool->FindMessageTypeByName(m->GetDescriptor()->full_name()) ==\n  //          m->GetDescriptor());\n  // There are two ways to satisfy this requirement:\n  // 1) Use m->GetDescriptor()->pool() as the pool.  This is generally useless\n  //    because this is the pool that would be used anyway if you didn't call\n  //    SetExtensionRegistry() at all.\n  // 2) Use a DescriptorPool which has m->GetDescriptor()->pool() as an\n  //    \"underlay\".  Read the documentation for DescriptorPool for more\n  //    information about underlays.\n  //\n  // You must also provide a MessageFactory.  This factory will be used to\n  // construct Message objects representing extensions.  The factory's\n  // GetPrototype() MUST return non-NULL for any Descriptor which can be found\n  // through the provided pool.\n  //\n  // If the provided factory might return instances of protocol-compiler-\n  // generated (i.e. compiled-in) types, or if the outer message object m is\n  // a generated type, then the given factory MUST have this property:  If\n  // GetPrototype() is given a Descriptor which resides in\n  // DescriptorPool::generated_pool(), the factory MUST return the same\n  // prototype which MessageFactory::generated_factory() would return.  That\n  // is, given a descriptor for a generated type, the factory must return an\n  // instance of the generated class (NOT DynamicMessage).  However, when\n  // given a descriptor for a type that is NOT in generated_pool, the factory\n  // is free to return any implementation.\n  //\n  // The reason for this requirement is that generated sub-objects may be\n  // accessed via the standard (non-reflection) extension accessor methods,\n  // and these methods will down-cast the object to the generated class type.\n  // If the object is not actually of that type, the results would be undefined.\n  // On the other hand, if an extension is not compiled in, then there is no\n  // way the code could end up accessing it via the standard accessors -- the\n  // only way to access the extension is via reflection.  When using reflection,\n  // DynamicMessage and generated messages are indistinguishable, so it's fine\n  // if these objects are represented using DynamicMessage.\n  //\n  // Using DynamicMessageFactory on which you have called\n  // SetDelegateToGeneratedFactory(true) should be sufficient to satisfy the\n  // above requirement.\n  //\n  // If either pool or factory is NULL, both must be NULL.\n  //\n  // Note that this feature is ignored when parsing \"lite\" messages as they do\n  // not have descriptors.\n  void SetExtensionRegistry(DescriptorPool* pool, MessageFactory* factory);\n\n  // Get the DescriptorPool set via SetExtensionRegistry(), or NULL if no pool\n  // has been provided.\n  const DescriptorPool* GetExtensionPool();\n\n  // Get the MessageFactory set via SetExtensionRegistry(), or NULL if no\n  // factory has been provided.\n  MessageFactory* GetExtensionFactory();\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedInputStream);\n\n  ZeroCopyInputStream* input_;\n  const uint8* buffer_;\n  const uint8* buffer_end_;     // pointer to the end of the buffer.\n  int total_bytes_read_;  // total bytes read from input_, including\n                          // the current buffer\n\n  // If total_bytes_read_ surpasses INT_MAX, we record the extra bytes here\n  // so that we can BackUp() on destruction.\n  int overflow_bytes_;\n\n  // LastTagWas() stuff.\n  uint32 last_tag_;         // result of last ReadTag().\n\n  // This is set true by ReadTag{Fallback/Slow}() if it is called when exactly\n  // at EOF, or by ExpectAtEnd() when it returns true.  This happens when we\n  // reach the end of a message and attempt to read another tag.\n  bool legitimate_message_end_;\n\n  // See EnableAliasing().\n  bool aliasing_enabled_;\n\n  // Limits\n  Limit current_limit_;   // if position = -1, no limit is applied\n\n  // For simplicity, if the current buffer crosses a limit (either a normal\n  // limit created by PushLimit() or the total bytes limit), buffer_size_\n  // only tracks the number of bytes before that limit.  This field\n  // contains the number of bytes after it.  Note that this implies that if\n  // buffer_size_ == 0 and buffer_size_after_limit_ > 0, we know we've\n  // hit a limit.  However, if both are zero, it doesn't necessarily mean\n  // we aren't at a limit -- the buffer may have ended exactly at the limit.\n  int buffer_size_after_limit_;\n\n  // Maximum number of bytes to read, period.  This is unrelated to\n  // current_limit_.  Set using SetTotalBytesLimit().\n  int total_bytes_limit_;\n  int total_bytes_warning_threshold_;\n\n  // Current recursion depth, controlled by IncrementRecursionDepth() and\n  // DecrementRecursionDepth().\n  int recursion_depth_;\n  // Recursion depth limit, set by SetRecursionLimit().\n  int recursion_limit_;\n\n  // See SetExtensionRegistry().\n  const DescriptorPool* extension_pool_;\n  MessageFactory* extension_factory_;\n\n  // Private member functions.\n\n  // Advance the buffer by a given number of bytes.\n  void Advance(int amount);\n\n  // Back up input_ to the current buffer position.\n  void BackUpInputToCurrentPosition();\n\n  // Recomputes the value of buffer_size_after_limit_.  Must be called after\n  // current_limit_ or total_bytes_limit_ changes.\n  void RecomputeBufferLimits();\n\n  // Writes an error message saying that we hit total_bytes_limit_.\n  void PrintTotalBytesLimitError();\n\n  // Called when the buffer runs out to request more data.  Implies an\n  // Advance(BufferSize()).\n  bool Refresh();\n\n  // When parsing varints, we optimize for the common case of small values, and\n  // then optimize for the case when the varint fits within the current buffer\n  // piece. The Fallback method is used when we can't use the one-byte\n  // optimization. The Slow method is yet another fallback when the buffer is\n  // not large enough. Making the slow path out-of-line speeds up the common\n  // case by 10-15%. The slow path is fairly uncommon: it only triggers when a\n  // message crosses multiple buffers.\n  bool ReadVarint32Fallback(uint32* value);\n  bool ReadVarint64Fallback(uint64* value);\n  bool ReadVarint32Slow(uint32* value);\n  bool ReadVarint64Slow(uint64* value);\n  bool ReadLittleEndian32Fallback(uint32* value);\n  bool ReadLittleEndian64Fallback(uint64* value);\n  // Fallback/slow methods for reading tags. These do not update last_tag_,\n  // but will set legitimate_message_end_ if we are at the end of the input\n  // stream.\n  uint32 ReadTagFallback();\n  uint32 ReadTagSlow();\n  bool ReadStringFallback(string* buffer, int size);\n\n  // Return the size of the buffer.\n  int BufferSize() const;\n\n  static const int kDefaultTotalBytesLimit = 64 << 20;  // 64MB\n\n  static const int kDefaultTotalBytesWarningThreshold = 32 << 20;  // 32MB\n  static const int kDefaultRecursionLimit = 64;\n};\n\n// Class which encodes and writes binary data which is composed of varint-\n// encoded integers and fixed-width pieces.  Wraps a ZeroCopyOutputStream.\n// Most users will not need to deal with CodedOutputStream.\n//\n// Most methods of CodedOutputStream which return a bool return false if an\n// underlying I/O error occurs.  Once such a failure occurs, the\n// CodedOutputStream is broken and is no longer useful. The Write* methods do\n// not return the stream status, but will invalidate the stream if an error\n// occurs. The client can probe HadError() to determine the status.\n//\n// Note that every method of CodedOutputStream which writes some data has\n// a corresponding static \"ToArray\" version. These versions write directly\n// to the provided buffer, returning a pointer past the last written byte.\n// They require that the buffer has sufficient capacity for the encoded data.\n// This allows an optimization where we check if an output stream has enough\n// space for an entire message before we start writing and, if there is, we\n// call only the ToArray methods to avoid doing bound checks for each\n// individual value.\n// i.e., in the example above:\n//\n//   CodedOutputStream coded_output = new CodedOutputStream(raw_output);\n//   int magic_number = 1234;\n//   char text[] = \"Hello world!\";\n//\n//   int coded_size = sizeof(magic_number) +\n//                    CodedOutputStream::VarintSize32(strlen(text)) +\n//                    strlen(text);\n//\n//   uint8* buffer =\n//       coded_output->GetDirectBufferForNBytesAndAdvance(coded_size);\n//   if (buffer != NULL) {\n//     // The output stream has enough space in the buffer: write directly to\n//     // the array.\n//     buffer = CodedOutputStream::WriteLittleEndian32ToArray(magic_number,\n//                                                            buffer);\n//     buffer = CodedOutputStream::WriteVarint32ToArray(strlen(text), buffer);\n//     buffer = CodedOutputStream::WriteRawToArray(text, strlen(text), buffer);\n//   } else {\n//     // Make bound-checked writes, which will ask the underlying stream for\n//     // more space as needed.\n//     coded_output->WriteLittleEndian32(magic_number);\n//     coded_output->WriteVarint32(strlen(text));\n//     coded_output->WriteRaw(text, strlen(text));\n//   }\n//\n//   delete coded_output;\nclass LIBPROTOBUF_EXPORT CodedOutputStream {\n public:\n  // Create an CodedOutputStream that writes to the given ZeroCopyOutputStream.\n  explicit CodedOutputStream(ZeroCopyOutputStream* output);\n\n  // Destroy the CodedOutputStream and position the underlying\n  // ZeroCopyOutputStream immediately after the last byte written.\n  ~CodedOutputStream();\n\n  // Skips a number of bytes, leaving the bytes unmodified in the underlying\n  // buffer.  Returns false if an underlying write error occurs.  This is\n  // mainly useful with GetDirectBufferPointer().\n  bool Skip(int count);\n\n  // Sets *data to point directly at the unwritten part of the\n  // CodedOutputStream's underlying buffer, and *size to the size of that\n  // buffer, but does not advance the stream's current position.  This will\n  // always either produce a non-empty buffer or return false.  If the caller\n  // writes any data to this buffer, it should then call Skip() to skip over\n  // the consumed bytes.  This may be useful for implementing external fast\n  // serialization routines for types of data not covered by the\n  // CodedOutputStream interface.\n  bool GetDirectBufferPointer(void** data, int* size);\n\n  // If there are at least \"size\" bytes available in the current buffer,\n  // returns a pointer directly into the buffer and advances over these bytes.\n  // The caller may then write directly into this buffer (e.g. using the\n  // *ToArray static methods) rather than go through CodedOutputStream.  If\n  // there are not enough bytes available, returns NULL.  The return pointer is\n  // invalidated as soon as any other non-const method of CodedOutputStream\n  // is called.\n  inline uint8* GetDirectBufferForNBytesAndAdvance(int size);\n\n  // Write raw bytes, copying them from the given buffer.\n  void WriteRaw(const void* buffer, int size);\n  // Like WriteRaw()  but writing directly to the target array.\n  // This is _not_ inlined, as the compiler often optimizes memcpy into inline\n  // copy loops. Since this gets called by every field with string or bytes\n  // type, inlining may lead to a significant amount of code bloat, with only a\n  // minor performance gain.\n  static uint8* WriteRawToArray(const void* buffer, int size, uint8* target);\n\n  // Equivalent to WriteRaw(str.data(), str.size()).\n  void WriteString(const string& str);\n  // Like WriteString()  but writing directly to the target array.\n  static uint8* WriteStringToArray(const string& str, uint8* target);\n\n\n  // Write a 32-bit little-endian integer.\n  void WriteLittleEndian32(uint32 value);\n  // Like WriteLittleEndian32()  but writing directly to the target array.\n  static uint8* WriteLittleEndian32ToArray(uint32 value, uint8* target);\n  // Write a 64-bit little-endian integer.\n  void WriteLittleEndian64(uint64 value);\n  // Like WriteLittleEndian64()  but writing directly to the target array.\n  static uint8* WriteLittleEndian64ToArray(uint64 value, uint8* target);\n\n  // Write an unsigned integer with Varint encoding.  Writing a 32-bit value\n  // is equivalent to casting it to uint64 and writing it as a 64-bit value,\n  // but may be more efficient.\n  void WriteVarint32(uint32 value);\n  // Like WriteVarint32()  but writing directly to the target array.\n  static uint8* WriteVarint32ToArray(uint32 value, uint8* target);\n  // Write an unsigned integer with Varint encoding.\n  void WriteVarint64(uint64 value);\n  // Like WriteVarint64()  but writing directly to the target array.\n  static uint8* WriteVarint64ToArray(uint64 value, uint8* target);\n\n  // Equivalent to WriteVarint32() except when the value is negative,\n  // in which case it must be sign-extended to a full 10 bytes.\n  void WriteVarint32SignExtended(int32 value);\n  // Like WriteVarint32SignExtended()  but writing directly to the target array.\n  static uint8* WriteVarint32SignExtendedToArray(int32 value, uint8* target);\n\n  // This is identical to WriteVarint32(), but optimized for writing tags.\n  // In particular, if the input is a compile-time constant, this method\n  // compiles down to a couple instructions.\n  // Always inline because otherwise the aformentioned optimization can't work,\n  // but GCC by default doesn't want to inline this.\n  void WriteTag(uint32 value);\n  // Like WriteTag()  but writing directly to the target array.\n  static uint8* WriteTagToArray(\n      uint32 value, uint8* target) GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\n\n  // Returns the number of bytes needed to encode the given value as a varint.\n  static int VarintSize32(uint32 value);\n  // Returns the number of bytes needed to encode the given value as a varint.\n  static int VarintSize64(uint64 value);\n\n  // If negative, 10 bytes.  Otheriwse, same as VarintSize32().\n  static int VarintSize32SignExtended(int32 value);\n\n  // Returns the total number of bytes written since this object was created.\n  inline int ByteCount() const;\n\n  // Returns true if there was an underlying I/O error since this object was\n  // created.\n  bool HadError() const { return had_error_; }\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedOutputStream);\n\n  ZeroCopyOutputStream* output_;\n  uint8* buffer_;\n  int buffer_size_;\n  int total_bytes_;  // Sum of sizes of all buffers seen so far.\n  bool had_error_;   // Whether an error occurred during output.\n\n  // Advance the buffer by a given number of bytes.\n  void Advance(int amount);\n\n  // Called when the buffer runs out to request more data.  Implies an\n  // Advance(buffer_size_).\n  bool Refresh();\n\n  static uint8* WriteVarint32FallbackToArray(uint32 value, uint8* target);\n\n  // Always-inlined versions of WriteVarint* functions so that code can be\n  // reused, while still controlling size. For instance, WriteVarint32ToArray()\n  // should not directly call this: since it is inlined itself, doing so\n  // would greatly increase the size of generated code. Instead, it should call\n  // WriteVarint32FallbackToArray.  Meanwhile, WriteVarint32() is already\n  // out-of-line, so it should just invoke this directly to avoid any extra\n  // function call overhead.\n  static uint8* WriteVarint32FallbackToArrayInline(\n      uint32 value, uint8* target) GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\n  static uint8* WriteVarint64ToArrayInline(\n      uint64 value, uint8* target) GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\n\n  static int VarintSize32Fallback(uint32 value);\n};\n\n// inline methods ====================================================\n// The vast majority of varints are only one byte.  These inline\n// methods optimize for that case.\n\ninline bool CodedInputStream::ReadVarint32(uint32* value) {\n  if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && *buffer_ < 0x80) {\n    *value = *buffer_;\n    Advance(1);\n    return true;\n  } else {\n    return ReadVarint32Fallback(value);\n  }\n}\n\ninline bool CodedInputStream::ReadVarint64(uint64* value) {\n  if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && *buffer_ < 0x80) {\n    *value = *buffer_;\n    Advance(1);\n    return true;\n  } else {\n    return ReadVarint64Fallback(value);\n  }\n}\n\n// static\ninline const uint8* CodedInputStream::ReadLittleEndian32FromArray(\n    const uint8* buffer,\n    uint32* value) {\n#if defined(PROTOBUF_LITTLE_ENDIAN)\n  memcpy(value, buffer, sizeof(*value));\n  return buffer + sizeof(*value);\n#else\n  *value = (static_cast<uint32>(buffer[0])      ) |\n           (static_cast<uint32>(buffer[1]) <<  8) |\n           (static_cast<uint32>(buffer[2]) << 16) |\n           (static_cast<uint32>(buffer[3]) << 24);\n  return buffer + sizeof(*value);\n#endif\n}\n// static\ninline const uint8* CodedInputStream::ReadLittleEndian64FromArray(\n    const uint8* buffer,\n    uint64* value) {\n#if defined(PROTOBUF_LITTLE_ENDIAN)\n  memcpy(value, buffer, sizeof(*value));\n  return buffer + sizeof(*value);\n#else\n  uint32 part0 = (static_cast<uint32>(buffer[0])      ) |\n                 (static_cast<uint32>(buffer[1]) <<  8) |\n                 (static_cast<uint32>(buffer[2]) << 16) |\n                 (static_cast<uint32>(buffer[3]) << 24);\n  uint32 part1 = (static_cast<uint32>(buffer[4])      ) |\n                 (static_cast<uint32>(buffer[5]) <<  8) |\n                 (static_cast<uint32>(buffer[6]) << 16) |\n                 (static_cast<uint32>(buffer[7]) << 24);\n  *value = static_cast<uint64>(part0) |\n          (static_cast<uint64>(part1) << 32);\n  return buffer + sizeof(*value);\n#endif\n}\n\ninline bool CodedInputStream::ReadLittleEndian32(uint32* value) {\n#if defined(PROTOBUF_LITTLE_ENDIAN)\n  if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast<int>(sizeof(*value)))) {\n    memcpy(value, buffer_, sizeof(*value));\n    Advance(sizeof(*value));\n    return true;\n  } else {\n    return ReadLittleEndian32Fallback(value);\n  }\n#else\n  return ReadLittleEndian32Fallback(value);\n#endif\n}\n\ninline bool CodedInputStream::ReadLittleEndian64(uint64* value) {\n#if defined(PROTOBUF_LITTLE_ENDIAN)\n  if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast<int>(sizeof(*value)))) {\n    memcpy(value, buffer_, sizeof(*value));\n    Advance(sizeof(*value));\n    return true;\n  } else {\n    return ReadLittleEndian64Fallback(value);\n  }\n#else\n  return ReadLittleEndian64Fallback(value);\n#endif\n}\n\ninline uint32 CodedInputStream::ReadTag() {\n  if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && buffer_[0] < 0x80) {\n    last_tag_ = buffer_[0];\n    Advance(1);\n    return last_tag_;\n  } else {\n    last_tag_ = ReadTagFallback();\n    return last_tag_;\n  }\n}\n\ninline bool CodedInputStream::LastTagWas(uint32 expected) {\n  return last_tag_ == expected;\n}\n\ninline bool CodedInputStream::ConsumedEntireMessage() {\n  return legitimate_message_end_;\n}\n\ninline bool CodedInputStream::ExpectTag(uint32 expected) {\n  if (expected < (1 << 7)) {\n    if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && buffer_[0] == expected) {\n      Advance(1);\n      return true;\n    } else {\n      return false;\n    }\n  } else if (expected < (1 << 14)) {\n    if (GOOGLE_PREDICT_TRUE(BufferSize() >= 2) &&\n        buffer_[0] == static_cast<uint8>(expected | 0x80) &&\n        buffer_[1] == static_cast<uint8>(expected >> 7)) {\n      Advance(2);\n      return true;\n    } else {\n      return false;\n    }\n  } else {\n    // Don't bother optimizing for larger values.\n    return false;\n  }\n}\n\ninline const uint8* CodedInputStream::ExpectTagFromArray(\n    const uint8* buffer, uint32 expected) {\n  if (expected < (1 << 7)) {\n    if (buffer[0] == expected) {\n      return buffer + 1;\n    }\n  } else if (expected < (1 << 14)) {\n    if (buffer[0] == static_cast<uint8>(expected | 0x80) &&\n        buffer[1] == static_cast<uint8>(expected >> 7)) {\n      return buffer + 2;\n    }\n  }\n  return NULL;\n}\n\ninline void CodedInputStream::GetDirectBufferPointerInline(const void** data,\n                                                           int* size) {\n  *data = buffer_;\n  *size = buffer_end_ - buffer_;\n}\n\ninline bool CodedInputStream::ExpectAtEnd() {\n  // If we are at a limit we know no more bytes can be read.  Otherwise, it's\n  // hard to say without calling Refresh(), and we'd rather not do that.\n\n  if (buffer_ == buffer_end_ && buffer_size_after_limit_ != 0) {\n    last_tag_ = 0;                   // Pretend we called ReadTag()...\n    legitimate_message_end_ = true;  // ... and it hit EOF.\n    return true;\n  } else {\n    return false;\n  }\n}\n\ninline uint8* CodedOutputStream::GetDirectBufferForNBytesAndAdvance(int size) {\n  if (buffer_size_ < size) {\n    return NULL;\n  } else {\n    uint8* result = buffer_;\n    Advance(size);\n    return result;\n  }\n}\n\ninline uint8* CodedOutputStream::WriteVarint32ToArray(uint32 value,\n                                                        uint8* target) {\n  if (value < 0x80) {\n    *target = value;\n    return target + 1;\n  } else {\n    return WriteVarint32FallbackToArray(value, target);\n  }\n}\n\ninline void CodedOutputStream::WriteVarint32SignExtended(int32 value) {\n  if (value < 0) {\n    WriteVarint64(static_cast<uint64>(value));\n  } else {\n    WriteVarint32(static_cast<uint32>(value));\n  }\n}\n\ninline uint8* CodedOutputStream::WriteVarint32SignExtendedToArray(\n    int32 value, uint8* target) {\n  if (value < 0) {\n    return WriteVarint64ToArray(static_cast<uint64>(value), target);\n  } else {\n    return WriteVarint32ToArray(static_cast<uint32>(value), target);\n  }\n}\n\ninline uint8* CodedOutputStream::WriteLittleEndian32ToArray(uint32 value,\n                                                            uint8* target) {\n#if defined(PROTOBUF_LITTLE_ENDIAN)\n  memcpy(target, &value, sizeof(value));\n#else\n  target[0] = static_cast<uint8>(value);\n  target[1] = static_cast<uint8>(value >>  8);\n  target[2] = static_cast<uint8>(value >> 16);\n  target[3] = static_cast<uint8>(value >> 24);\n#endif\n  return target + sizeof(value);\n}\n\ninline uint8* CodedOutputStream::WriteLittleEndian64ToArray(uint64 value,\n                                                            uint8* target) {\n#if defined(PROTOBUF_LITTLE_ENDIAN)\n  memcpy(target, &value, sizeof(value));\n#else\n  uint32 part0 = static_cast<uint32>(value);\n  uint32 part1 = static_cast<uint32>(value >> 32);\n\n  target[0] = static_cast<uint8>(part0);\n  target[1] = static_cast<uint8>(part0 >>  8);\n  target[2] = static_cast<uint8>(part0 >> 16);\n  target[3] = static_cast<uint8>(part0 >> 24);\n  target[4] = static_cast<uint8>(part1);\n  target[5] = static_cast<uint8>(part1 >>  8);\n  target[6] = static_cast<uint8>(part1 >> 16);\n  target[7] = static_cast<uint8>(part1 >> 24);\n#endif\n  return target + sizeof(value);\n}\n\ninline void CodedOutputStream::WriteTag(uint32 value) {\n  WriteVarint32(value);\n}\n\ninline uint8* CodedOutputStream::WriteTagToArray(\n    uint32 value, uint8* target) {\n  if (value < (1 << 7)) {\n    target[0] = value;\n    return target + 1;\n  } else if (value < (1 << 14)) {\n    target[0] = static_cast<uint8>(value | 0x80);\n    target[1] = static_cast<uint8>(value >> 7);\n    return target + 2;\n  } else {\n    return WriteVarint32FallbackToArray(value, target);\n  }\n}\n\ninline int CodedOutputStream::VarintSize32(uint32 value) {\n  if (value < (1 << 7)) {\n    return 1;\n  } else  {\n    return VarintSize32Fallback(value);\n  }\n}\n\ninline int CodedOutputStream::VarintSize32SignExtended(int32 value) {\n  if (value < 0) {\n    return 10;     // TODO(kenton):  Make this a symbolic constant.\n  } else {\n    return VarintSize32(static_cast<uint32>(value));\n  }\n}\n\ninline void CodedOutputStream::WriteString(const string& str) {\n  WriteRaw(str.data(), static_cast<int>(str.size()));\n}\n\ninline uint8* CodedOutputStream::WriteStringToArray(\n    const string& str, uint8* target) {\n  return WriteRawToArray(str.data(), static_cast<int>(str.size()), target);\n}\n\ninline int CodedOutputStream::ByteCount() const {\n  return total_bytes_ - buffer_size_;\n}\n\ninline void CodedInputStream::Advance(int amount) {\n  buffer_ += amount;\n}\n\ninline void CodedOutputStream::Advance(int amount) {\n  buffer_ += amount;\n  buffer_size_ -= amount;\n}\n\ninline void CodedInputStream::SetRecursionLimit(int limit) {\n  recursion_limit_ = limit;\n}\n\ninline bool CodedInputStream::IncrementRecursionDepth() {\n  ++recursion_depth_;\n  return recursion_depth_ <= recursion_limit_;\n}\n\ninline void CodedInputStream::DecrementRecursionDepth() {\n  if (recursion_depth_ > 0) --recursion_depth_;\n}\n\ninline void CodedInputStream::SetExtensionRegistry(DescriptorPool* pool,\n                                                   MessageFactory* factory) {\n  extension_pool_ = pool;\n  extension_factory_ = factory;\n}\n\ninline const DescriptorPool* CodedInputStream::GetExtensionPool() {\n  return extension_pool_;\n}\n\ninline MessageFactory* CodedInputStream::GetExtensionFactory() {\n  return extension_factory_;\n}\n\ninline int CodedInputStream::BufferSize() const {\n  return buffer_end_ - buffer_;\n}\n\ninline CodedInputStream::CodedInputStream(ZeroCopyInputStream* input)\n  : input_(input),\n    buffer_(NULL),\n    buffer_end_(NULL),\n    total_bytes_read_(0),\n    overflow_bytes_(0),\n    last_tag_(0),\n    legitimate_message_end_(false),\n    aliasing_enabled_(false),\n    current_limit_(kint32max),\n    buffer_size_after_limit_(0),\n    total_bytes_limit_(kDefaultTotalBytesLimit),\n    total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold),\n    recursion_depth_(0),\n    recursion_limit_(kDefaultRecursionLimit),\n    extension_pool_(NULL),\n    extension_factory_(NULL) {\n  // Eagerly Refresh() so buffer space is immediately available.\n  Refresh();\n}\n\ninline CodedInputStream::CodedInputStream(const uint8* buffer, int size)\n  : input_(NULL),\n    buffer_(buffer),\n    buffer_end_(buffer + size),\n    total_bytes_read_(size),\n    overflow_bytes_(0),\n    last_tag_(0),\n    legitimate_message_end_(false),\n    aliasing_enabled_(false),\n    current_limit_(size),\n    buffer_size_after_limit_(0),\n    total_bytes_limit_(kDefaultTotalBytesLimit),\n    total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold),\n    recursion_depth_(0),\n    recursion_limit_(kDefaultRecursionLimit),\n    extension_pool_(NULL),\n    extension_factory_(NULL) {\n  // Note that setting current_limit_ == size is important to prevent some\n  // code paths from trying to access input_ and segfaulting.\n}\n\ninline CodedInputStream::~CodedInputStream() {\n  if (input_ != NULL) {\n    BackUpInputToCurrentPosition();\n  }\n}\n\n}  // namespace io\n}  // namespace protobuf\n\n\n#if defined(_MSC_VER) && _MSC_VER >= 1300\n  #pragma runtime_checks(\"c\", restore)\n#endif  // _MSC_VER\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_IO_CODED_STREAM_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_inl.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: jasonh@google.com (Jason Hsueh)\n//\n// Implements methods of coded_stream.h that need to be inlined for performance\n// reasons, but should not be defined in a public header.\n\n#ifndef GOOGLE_PROTOBUF_IO_CODED_STREAM_INL_H__\n#define GOOGLE_PROTOBUF_IO_CODED_STREAM_INL_H__\n\n#include <google/protobuf/io/coded_stream.h>\n#include <string>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\n\ninline bool CodedInputStream::InternalReadStringInline(string* buffer,\n                                                       int size) {\n  if (size < 0) return false;  // security: size is often user-supplied\n\n  if (BufferSize() >= size) {\n    STLStringResizeUninitialized(buffer, size);\n    memcpy(string_as_array(buffer), buffer_, size);\n    Advance(size);\n    return true;\n  }\n\n  return ReadStringFallback(buffer, size);\n}\n\n}  // namespace io\n}  // namespace protobuf\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_IO_CODED_STREAM_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file contains tests and benchmarks.\n\n#include <vector>\n\n#include <google/protobuf/io/coded_stream.h>\n\n#include <limits.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/stubs/strutil.h>\n\n\n// This declares an unsigned long long integer literal in a portable way.\n// (The original macro is way too big and ruins my formatting.)\n#undef ULL\n#define ULL(x) GOOGLE_ULONGLONG(x)\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\nnamespace {\n\n// ===================================================================\n// Data-Driven Test Infrastructure\n\n// TEST_1D and TEST_2D are macros I'd eventually like to see added to\n// gTest.  These macros can be used to declare tests which should be\n// run multiple times, once for each item in some input array.  TEST_1D\n// tests all cases in a single input array.  TEST_2D tests all\n// combinations of cases from two arrays.  The arrays must be statically\n// defined such that the GOOGLE_ARRAYSIZE() macro works on them.  Example:\n//\n// int kCases[] = {1, 2, 3, 4}\n// TEST_1D(MyFixture, MyTest, kCases) {\n//   EXPECT_GT(kCases_case, 0);\n// }\n//\n// This test iterates through the numbers 1, 2, 3, and 4 and tests that\n// they are all grater than zero.  In case of failure, the exact case\n// which failed will be printed.  The case type must be printable using\n// ostream::operator<<.\n\n// TODO(kenton):  gTest now supports \"parameterized tests\" which would be\n//   a better way to accomplish this.  Rewrite when time permits.\n\n#define TEST_1D(FIXTURE, NAME, CASES)                                      \\\n  class FIXTURE##_##NAME##_DD : public FIXTURE {                           \\\n   protected:                                                              \\\n    template <typename CaseType>                                           \\\n    void DoSingleCase(const CaseType& CASES##_case);                       \\\n  };                                                                       \\\n                                                                           \\\n  TEST_F(FIXTURE##_##NAME##_DD, NAME) {                                    \\\n    for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES); i++) {                           \\\n      SCOPED_TRACE(testing::Message()                                      \\\n        << #CASES \" case #\" << i << \": \" << CASES[i]);                     \\\n      DoSingleCase(CASES[i]);                                              \\\n    }                                                                      \\\n  }                                                                        \\\n                                                                           \\\n  template <typename CaseType>                                             \\\n  void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType& CASES##_case)\n\n#define TEST_2D(FIXTURE, NAME, CASES1, CASES2)                             \\\n  class FIXTURE##_##NAME##_DD : public FIXTURE {                           \\\n   protected:                                                              \\\n    template <typename CaseType1, typename CaseType2>                      \\\n    void DoSingleCase(const CaseType1& CASES1##_case,                      \\\n                      const CaseType2& CASES2##_case);                     \\\n  };                                                                       \\\n                                                                           \\\n  TEST_F(FIXTURE##_##NAME##_DD, NAME) {                                    \\\n    for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES1); i++) {                          \\\n      for (int j = 0; j < GOOGLE_ARRAYSIZE(CASES2); j++) {                        \\\n        SCOPED_TRACE(testing::Message()                                    \\\n          << #CASES1 \" case #\" << i << \": \" << CASES1[i] << \", \"           \\\n          << #CASES2 \" case #\" << j << \": \" << CASES2[j]);                 \\\n        DoSingleCase(CASES1[i], CASES2[j]);                                \\\n      }                                                                    \\\n    }                                                                      \\\n  }                                                                        \\\n                                                                           \\\n  template <typename CaseType1, typename CaseType2>                        \\\n  void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType1& CASES1##_case, \\\n                                           const CaseType2& CASES2##_case)\n\n// ===================================================================\n\nclass CodedStreamTest : public testing::Test {\n protected:\n  static const int kBufferSize = 1024 * 64;\n  static uint8 buffer_[kBufferSize];\n};\n\nuint8 CodedStreamTest::buffer_[CodedStreamTest::kBufferSize];\n\n// We test each operation over a variety of block sizes to insure that\n// we test cases where reads or writes cross buffer boundaries, cases\n// where they don't, and cases where there is so much buffer left that\n// we can use special optimized paths that don't worry about bounds\n// checks.\nconst int kBlockSizes[] = {1, 2, 3, 5, 7, 13, 32, 1024};\n\n// -------------------------------------------------------------------\n// Varint tests.\n\nstruct VarintCase {\n  uint8 bytes[10];          // Encoded bytes.\n  int size;                 // Encoded size, in bytes.\n  uint64 value;             // Parsed value.\n};\n\ninline std::ostream& operator<<(std::ostream& os, const VarintCase& c) {\n  return os << c.value;\n}\n\nVarintCase kVarintCases[] = {\n  // 32-bit values\n  {{0x00}      , 1, 0},\n  {{0x01}      , 1, 1},\n  {{0x7f}      , 1, 127},\n  {{0xa2, 0x74}, 2, (0x22 << 0) | (0x74 << 7)},          // 14882\n  {{0xbe, 0xf7, 0x92, 0x84, 0x0b}, 5,                    // 2961488830\n    (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |\n    (ULL(0x0b) << 28)},\n\n  // 64-bit\n  {{0xbe, 0xf7, 0x92, 0x84, 0x1b}, 5,                    // 7256456126\n    (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |\n    (ULL(0x1b) << 28)},\n  {{0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49}, 8,  // 41256202580718336\n    (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |\n    (ULL(0x43) << 28) | (ULL(0x49) << 35) | (ULL(0x24) << 42) |\n    (ULL(0x49) << 49)},\n  // 11964378330978735131\n  {{0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01}, 10,\n    (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |\n    (ULL(0x3b) << 28) | (ULL(0x56) << 35) | (ULL(0x00) << 42) |\n    (ULL(0x05) << 49) | (ULL(0x26) << 56) | (ULL(0x01) << 63)},\n};\n\nTEST_2D(CodedStreamTest, ReadVarint32, kVarintCases, kBlockSizes) {\n  memcpy(buffer_, kVarintCases_case.bytes, kVarintCases_case.size);\n  ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedInputStream coded_input(&input);\n\n    uint32 value;\n    EXPECT_TRUE(coded_input.ReadVarint32(&value));\n    EXPECT_EQ(static_cast<uint32>(kVarintCases_case.value), value);\n  }\n\n  EXPECT_EQ(kVarintCases_case.size, input.ByteCount());\n}\n\nTEST_2D(CodedStreamTest, ReadTag, kVarintCases, kBlockSizes) {\n  memcpy(buffer_, kVarintCases_case.bytes, kVarintCases_case.size);\n  ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedInputStream coded_input(&input);\n\n    uint32 expected_value = static_cast<uint32>(kVarintCases_case.value);\n    EXPECT_EQ(expected_value, coded_input.ReadTag());\n\n    EXPECT_TRUE(coded_input.LastTagWas(expected_value));\n    EXPECT_FALSE(coded_input.LastTagWas(expected_value + 1));\n  }\n\n  EXPECT_EQ(kVarintCases_case.size, input.ByteCount());\n}\n\n// This is the regression test that verifies that there is no issues\n// with the empty input buffers handling.\nTEST_F(CodedStreamTest, EmptyInputBeforeEos) {\n  class In : public ZeroCopyInputStream {\n   public:\n    In() : count_(0) {}\n   private:\n    virtual bool Next(const void** data, int* size) {\n      *data = NULL;\n      *size = 0;\n      return count_++ < 2;\n    }\n    virtual void BackUp(int count)  {\n      GOOGLE_LOG(FATAL) << \"Tests never call this.\";\n    }\n    virtual bool Skip(int count) {\n      GOOGLE_LOG(FATAL) << \"Tests never call this.\";\n      return false;\n    }\n    virtual int64 ByteCount() const { return 0; }\n    int count_;\n  } in;\n  CodedInputStream input(&in);\n  input.ReadTag();\n  EXPECT_TRUE(input.ConsumedEntireMessage());\n}\n\nTEST_1D(CodedStreamTest, ExpectTag, kVarintCases) {\n  // Leave one byte at the beginning of the buffer so we can read it\n  // to force the first buffer to be loaded.\n  buffer_[0] = '\\0';\n  memcpy(buffer_ + 1, kVarintCases_case.bytes, kVarintCases_case.size);\n  ArrayInputStream input(buffer_, sizeof(buffer_));\n\n  {\n    CodedInputStream coded_input(&input);\n\n    // Read one byte to force coded_input.Refill() to be called.  Otherwise,\n    // ExpectTag() will return a false negative.\n    uint8 dummy;\n    coded_input.ReadRaw(&dummy, 1);\n    EXPECT_EQ((uint)'\\0', (uint)dummy);\n\n    uint32 expected_value = static_cast<uint32>(kVarintCases_case.value);\n\n    // ExpectTag() produces false negatives for large values.\n    if (kVarintCases_case.size <= 2) {\n      EXPECT_FALSE(coded_input.ExpectTag(expected_value + 1));\n      EXPECT_TRUE(coded_input.ExpectTag(expected_value));\n    } else {\n      EXPECT_FALSE(coded_input.ExpectTag(expected_value));\n    }\n  }\n\n  if (kVarintCases_case.size <= 2) {\n    EXPECT_EQ(kVarintCases_case.size + 1, input.ByteCount());\n  } else {\n    EXPECT_EQ(1, input.ByteCount());\n  }\n}\n\nTEST_1D(CodedStreamTest, ExpectTagFromArray, kVarintCases) {\n  memcpy(buffer_, kVarintCases_case.bytes, kVarintCases_case.size);\n\n  const uint32 expected_value = static_cast<uint32>(kVarintCases_case.value);\n\n  // If the expectation succeeds, it should return a pointer past the tag.\n  if (kVarintCases_case.size <= 2) {\n    EXPECT_TRUE(NULL ==\n                CodedInputStream::ExpectTagFromArray(buffer_,\n                                                     expected_value + 1));\n    EXPECT_TRUE(buffer_ + kVarintCases_case.size ==\n                CodedInputStream::ExpectTagFromArray(buffer_, expected_value));\n  } else {\n    EXPECT_TRUE(NULL ==\n                CodedInputStream::ExpectTagFromArray(buffer_, expected_value));\n  }\n}\n\nTEST_2D(CodedStreamTest, ReadVarint64, kVarintCases, kBlockSizes) {\n  memcpy(buffer_, kVarintCases_case.bytes, kVarintCases_case.size);\n  ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedInputStream coded_input(&input);\n\n    uint64 value;\n    EXPECT_TRUE(coded_input.ReadVarint64(&value));\n    EXPECT_EQ(kVarintCases_case.value, value);\n  }\n\n  EXPECT_EQ(kVarintCases_case.size, input.ByteCount());\n}\n\nTEST_2D(CodedStreamTest, WriteVarint32, kVarintCases, kBlockSizes) {\n  if (kVarintCases_case.value > ULL(0x00000000FFFFFFFF)) {\n    // Skip this test for the 64-bit values.\n    return;\n  }\n\n  ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedOutputStream coded_output(&output);\n\n    coded_output.WriteVarint32(static_cast<uint32>(kVarintCases_case.value));\n    EXPECT_FALSE(coded_output.HadError());\n\n    EXPECT_EQ(kVarintCases_case.size, coded_output.ByteCount());\n  }\n\n  EXPECT_EQ(kVarintCases_case.size, output.ByteCount());\n  EXPECT_EQ(0,\n    memcmp(buffer_, kVarintCases_case.bytes, kVarintCases_case.size));\n}\n\nTEST_2D(CodedStreamTest, WriteVarint64, kVarintCases, kBlockSizes) {\n  ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedOutputStream coded_output(&output);\n\n    coded_output.WriteVarint64(kVarintCases_case.value);\n    EXPECT_FALSE(coded_output.HadError());\n\n    EXPECT_EQ(kVarintCases_case.size, coded_output.ByteCount());\n  }\n\n  EXPECT_EQ(kVarintCases_case.size, output.ByteCount());\n  EXPECT_EQ(0,\n    memcmp(buffer_, kVarintCases_case.bytes, kVarintCases_case.size));\n}\n\n// This test causes gcc 3.3.5 (and earlier?) to give the cryptic error:\n//   \"sorry, unimplemented: `method_call_expr' not supported by dump_expr\"\n#if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)\n\nint32 kSignExtendedVarintCases[] = {\n  0, 1, -1, 1237894, -37895138\n};\n\nTEST_2D(CodedStreamTest, WriteVarint32SignExtended,\n        kSignExtendedVarintCases, kBlockSizes) {\n  ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedOutputStream coded_output(&output);\n\n    coded_output.WriteVarint32SignExtended(kSignExtendedVarintCases_case);\n    EXPECT_FALSE(coded_output.HadError());\n\n    if (kSignExtendedVarintCases_case < 0) {\n      EXPECT_EQ(10, coded_output.ByteCount());\n    } else {\n      EXPECT_LE(coded_output.ByteCount(), 5);\n    }\n  }\n\n  if (kSignExtendedVarintCases_case < 0) {\n    EXPECT_EQ(10, output.ByteCount());\n  } else {\n    EXPECT_LE(output.ByteCount(), 5);\n  }\n\n  // Read value back in as a varint64 and insure it matches.\n  ArrayInputStream input(buffer_, sizeof(buffer_));\n\n  {\n    CodedInputStream coded_input(&input);\n\n    uint64 value;\n    EXPECT_TRUE(coded_input.ReadVarint64(&value));\n\n    EXPECT_EQ(kSignExtendedVarintCases_case, static_cast<int64>(value));\n  }\n\n  EXPECT_EQ(output.ByteCount(), input.ByteCount());\n}\n\n#endif\n\n\n// -------------------------------------------------------------------\n// Varint failure test.\n\nstruct VarintErrorCase {\n  uint8 bytes[12];\n  int size;\n  bool can_parse;\n};\n\ninline std::ostream& operator<<(std::ostream& os, const VarintErrorCase& c) {\n  return os << \"size \" << c.size;\n}\n\nconst VarintErrorCase kVarintErrorCases[] = {\n  // Control case.  (Insures that there isn't something else wrong that\n  // makes parsing always fail.)\n  {{0x00}, 1, true},\n\n  // No input data.\n  {{}, 0, false},\n\n  // Input ends unexpectedly.\n  {{0xf0, 0xab}, 2, false},\n\n  // Input ends unexpectedly after 32 bits.\n  {{0xf0, 0xab, 0xc9, 0x9a, 0xf8, 0xb2}, 6, false},\n\n  // Longer than 10 bytes.\n  {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01},\n   11, false},\n};\n\nTEST_2D(CodedStreamTest, ReadVarint32Error, kVarintErrorCases, kBlockSizes) {\n  memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size);\n  ArrayInputStream input(buffer_, kVarintErrorCases_case.size,\n                         kBlockSizes_case);\n  CodedInputStream coded_input(&input);\n\n  uint32 value;\n  EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint32(&value));\n}\n\nTEST_2D(CodedStreamTest, ReadVarint64Error, kVarintErrorCases, kBlockSizes) {\n  memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size);\n  ArrayInputStream input(buffer_, kVarintErrorCases_case.size,\n                         kBlockSizes_case);\n  CodedInputStream coded_input(&input);\n\n  uint64 value;\n  EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint64(&value));\n}\n\n// -------------------------------------------------------------------\n// VarintSize\n\nstruct VarintSizeCase {\n  uint64 value;\n  int size;\n};\n\ninline std::ostream& operator<<(std::ostream& os, const VarintSizeCase& c) {\n  return os << c.value;\n}\n\nVarintSizeCase kVarintSizeCases[] = {\n  {0u, 1},\n  {1u, 1},\n  {127u, 1},\n  {128u, 2},\n  {758923u, 3},\n  {4000000000u, 5},\n  {ULL(41256202580718336), 8},\n  {ULL(11964378330978735131), 10},\n};\n\nTEST_1D(CodedStreamTest, VarintSize32, kVarintSizeCases) {\n  if (kVarintSizeCases_case.value > 0xffffffffu) {\n    // Skip 64-bit values.\n    return;\n  }\n\n  EXPECT_EQ(kVarintSizeCases_case.size,\n    CodedOutputStream::VarintSize32(\n      static_cast<uint32>(kVarintSizeCases_case.value)));\n}\n\nTEST_1D(CodedStreamTest, VarintSize64, kVarintSizeCases) {\n  EXPECT_EQ(kVarintSizeCases_case.size,\n    CodedOutputStream::VarintSize64(kVarintSizeCases_case.value));\n}\n\n// -------------------------------------------------------------------\n// Fixed-size int tests\n\nstruct Fixed32Case {\n  uint8 bytes[sizeof(uint32)];          // Encoded bytes.\n  uint32 value;                         // Parsed value.\n};\n\nstruct Fixed64Case {\n  uint8 bytes[sizeof(uint64)];          // Encoded bytes.\n  uint64 value;                         // Parsed value.\n};\n\ninline std::ostream& operator<<(std::ostream& os, const Fixed32Case& c) {\n  return os << \"0x\" << hex << c.value << dec;\n}\n\ninline std::ostream& operator<<(std::ostream& os, const Fixed64Case& c) {\n  return os << \"0x\" << hex << c.value << dec;\n}\n\nFixed32Case kFixed32Cases[] = {\n  {{0xef, 0xcd, 0xab, 0x90}, 0x90abcdefu},\n  {{0x12, 0x34, 0x56, 0x78}, 0x78563412u},\n};\n\nFixed64Case kFixed64Cases[] = {\n  {{0xef, 0xcd, 0xab, 0x90, 0x12, 0x34, 0x56, 0x78}, ULL(0x7856341290abcdef)},\n  {{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}, ULL(0x8877665544332211)},\n};\n\nTEST_2D(CodedStreamTest, ReadLittleEndian32, kFixed32Cases, kBlockSizes) {\n  memcpy(buffer_, kFixed32Cases_case.bytes, sizeof(kFixed32Cases_case.bytes));\n  ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedInputStream coded_input(&input);\n\n    uint32 value;\n    EXPECT_TRUE(coded_input.ReadLittleEndian32(&value));\n    EXPECT_EQ(kFixed32Cases_case.value, value);\n  }\n\n  EXPECT_EQ(sizeof(uint32), input.ByteCount());\n}\n\nTEST_2D(CodedStreamTest, ReadLittleEndian64, kFixed64Cases, kBlockSizes) {\n  memcpy(buffer_, kFixed64Cases_case.bytes, sizeof(kFixed64Cases_case.bytes));\n  ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedInputStream coded_input(&input);\n\n    uint64 value;\n    EXPECT_TRUE(coded_input.ReadLittleEndian64(&value));\n    EXPECT_EQ(kFixed64Cases_case.value, value);\n  }\n\n  EXPECT_EQ(sizeof(uint64), input.ByteCount());\n}\n\nTEST_2D(CodedStreamTest, WriteLittleEndian32, kFixed32Cases, kBlockSizes) {\n  ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedOutputStream coded_output(&output);\n\n    coded_output.WriteLittleEndian32(kFixed32Cases_case.value);\n    EXPECT_FALSE(coded_output.HadError());\n\n    EXPECT_EQ(sizeof(uint32), coded_output.ByteCount());\n  }\n\n  EXPECT_EQ(sizeof(uint32), output.ByteCount());\n  EXPECT_EQ(0, memcmp(buffer_, kFixed32Cases_case.bytes, sizeof(uint32)));\n}\n\nTEST_2D(CodedStreamTest, WriteLittleEndian64, kFixed64Cases, kBlockSizes) {\n  ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedOutputStream coded_output(&output);\n\n    coded_output.WriteLittleEndian64(kFixed64Cases_case.value);\n    EXPECT_FALSE(coded_output.HadError());\n\n    EXPECT_EQ(sizeof(uint64), coded_output.ByteCount());\n  }\n\n  EXPECT_EQ(sizeof(uint64), output.ByteCount());\n  EXPECT_EQ(0, memcmp(buffer_, kFixed64Cases_case.bytes, sizeof(uint64)));\n}\n\n// Tests using the static methods to read fixed-size values from raw arrays.\n\nTEST_1D(CodedStreamTest, ReadLittleEndian32FromArray, kFixed32Cases) {\n  memcpy(buffer_, kFixed32Cases_case.bytes, sizeof(kFixed32Cases_case.bytes));\n\n  uint32 value;\n  const uint8* end = CodedInputStream::ReadLittleEndian32FromArray(\n      buffer_, &value);\n  EXPECT_EQ(kFixed32Cases_case.value, value);\n  EXPECT_TRUE(end == buffer_ + sizeof(value));\n}\n\nTEST_1D(CodedStreamTest, ReadLittleEndian64FromArray, kFixed64Cases) {\n  memcpy(buffer_, kFixed64Cases_case.bytes, sizeof(kFixed64Cases_case.bytes));\n\n  uint64 value;\n  const uint8* end = CodedInputStream::ReadLittleEndian64FromArray(\n      buffer_, &value);\n  EXPECT_EQ(kFixed64Cases_case.value, value);\n  EXPECT_TRUE(end == buffer_ + sizeof(value));\n}\n\n// -------------------------------------------------------------------\n// Raw reads and writes\n\nconst char kRawBytes[] = \"Some bytes which will be written and read raw.\";\n\nTEST_1D(CodedStreamTest, ReadRaw, kBlockSizes) {\n  memcpy(buffer_, kRawBytes, sizeof(kRawBytes));\n  ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case);\n  char read_buffer[sizeof(kRawBytes)];\n\n  {\n    CodedInputStream coded_input(&input);\n\n    EXPECT_TRUE(coded_input.ReadRaw(read_buffer, sizeof(kRawBytes)));\n    EXPECT_EQ(0, memcmp(kRawBytes, read_buffer, sizeof(kRawBytes)));\n  }\n\n  EXPECT_EQ(sizeof(kRawBytes), input.ByteCount());\n}\n\nTEST_1D(CodedStreamTest, WriteRaw, kBlockSizes) {\n  ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedOutputStream coded_output(&output);\n\n    coded_output.WriteRaw(kRawBytes, sizeof(kRawBytes));\n    EXPECT_FALSE(coded_output.HadError());\n\n    EXPECT_EQ(sizeof(kRawBytes), coded_output.ByteCount());\n  }\n\n  EXPECT_EQ(sizeof(kRawBytes), output.ByteCount());\n  EXPECT_EQ(0, memcmp(buffer_, kRawBytes, sizeof(kRawBytes)));\n}\n\nTEST_1D(CodedStreamTest, ReadString, kBlockSizes) {\n  memcpy(buffer_, kRawBytes, sizeof(kRawBytes));\n  ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedInputStream coded_input(&input);\n\n    string str;\n    EXPECT_TRUE(coded_input.ReadString(&str, strlen(kRawBytes)));\n    EXPECT_EQ(kRawBytes, str);\n  }\n\n  EXPECT_EQ(strlen(kRawBytes), input.ByteCount());\n}\n\n// Check to make sure ReadString doesn't crash on impossibly large strings.\nTEST_1D(CodedStreamTest, ReadStringImpossiblyLarge, kBlockSizes) {\n  ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedInputStream coded_input(&input);\n\n    string str;\n    // Try to read a gigabyte.\n    EXPECT_FALSE(coded_input.ReadString(&str, 1 << 30));\n  }\n}\n\nTEST_F(CodedStreamTest, ReadStringImpossiblyLargeFromStringOnStack) {\n  // Same test as above, except directly use a buffer. This used to cause\n  // crashes while the above did not.\n  uint8 buffer[8];\n  CodedInputStream coded_input(buffer, 8);\n  string str;\n  EXPECT_FALSE(coded_input.ReadString(&str, 1 << 30));\n}\n\nTEST_F(CodedStreamTest, ReadStringImpossiblyLargeFromStringOnHeap) {\n  scoped_array<uint8> buffer(new uint8[8]);\n  CodedInputStream coded_input(buffer.get(), 8);\n  string str;\n  EXPECT_FALSE(coded_input.ReadString(&str, 1 << 30));\n}\n\n\n// -------------------------------------------------------------------\n// Skip\n\nconst char kSkipTestBytes[] =\n  \"<Before skipping><To be skipped><After skipping>\";\nconst char kSkipOutputTestBytes[] =\n  \"-----------------<To be skipped>----------------\";\n\nTEST_1D(CodedStreamTest, SkipInput, kBlockSizes) {\n  memcpy(buffer_, kSkipTestBytes, sizeof(kSkipTestBytes));\n  ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedInputStream coded_input(&input);\n\n    string str;\n    EXPECT_TRUE(coded_input.ReadString(&str, strlen(\"<Before skipping>\")));\n    EXPECT_EQ(\"<Before skipping>\", str);\n    EXPECT_TRUE(coded_input.Skip(strlen(\"<To be skipped>\")));\n    EXPECT_TRUE(coded_input.ReadString(&str, strlen(\"<After skipping>\")));\n    EXPECT_EQ(\"<After skipping>\", str);\n  }\n\n  EXPECT_EQ(strlen(kSkipTestBytes), input.ByteCount());\n}\n\n// -------------------------------------------------------------------\n// GetDirectBufferPointer\n\nTEST_F(CodedStreamTest, GetDirectBufferPointerInput) {\n  ArrayInputStream input(buffer_, sizeof(buffer_), 8);\n  CodedInputStream coded_input(&input);\n\n  const void* ptr;\n  int size;\n\n  EXPECT_TRUE(coded_input.GetDirectBufferPointer(&ptr, &size));\n  EXPECT_EQ(buffer_, ptr);\n  EXPECT_EQ(8, size);\n\n  // Peeking again should return the same pointer.\n  EXPECT_TRUE(coded_input.GetDirectBufferPointer(&ptr, &size));\n  EXPECT_EQ(buffer_, ptr);\n  EXPECT_EQ(8, size);\n\n  // Skip forward in the same buffer then peek again.\n  EXPECT_TRUE(coded_input.Skip(3));\n  EXPECT_TRUE(coded_input.GetDirectBufferPointer(&ptr, &size));\n  EXPECT_EQ(buffer_ + 3, ptr);\n  EXPECT_EQ(5, size);\n\n  // Skip to end of buffer and peek -- should get next buffer.\n  EXPECT_TRUE(coded_input.Skip(5));\n  EXPECT_TRUE(coded_input.GetDirectBufferPointer(&ptr, &size));\n  EXPECT_EQ(buffer_ + 8, ptr);\n  EXPECT_EQ(8, size);\n}\n\nTEST_F(CodedStreamTest, GetDirectBufferPointerInlineInput) {\n  ArrayInputStream input(buffer_, sizeof(buffer_), 8);\n  CodedInputStream coded_input(&input);\n\n  const void* ptr;\n  int size;\n\n  coded_input.GetDirectBufferPointerInline(&ptr, &size);\n  EXPECT_EQ(buffer_, ptr);\n  EXPECT_EQ(8, size);\n\n  // Peeking again should return the same pointer.\n  coded_input.GetDirectBufferPointerInline(&ptr, &size);\n  EXPECT_EQ(buffer_, ptr);\n  EXPECT_EQ(8, size);\n\n  // Skip forward in the same buffer then peek again.\n  EXPECT_TRUE(coded_input.Skip(3));\n  coded_input.GetDirectBufferPointerInline(&ptr, &size);\n  EXPECT_EQ(buffer_ + 3, ptr);\n  EXPECT_EQ(5, size);\n\n  // Skip to end of buffer and peek -- should return false and provide an empty\n  // buffer. It does not try to Refresh().\n  EXPECT_TRUE(coded_input.Skip(5));\n  coded_input.GetDirectBufferPointerInline(&ptr, &size);\n  EXPECT_EQ(buffer_ + 8, ptr);\n  EXPECT_EQ(0, size);\n}\n\nTEST_F(CodedStreamTest, GetDirectBufferPointerOutput) {\n  ArrayOutputStream output(buffer_, sizeof(buffer_), 8);\n  CodedOutputStream coded_output(&output);\n\n  void* ptr;\n  int size;\n\n  EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size));\n  EXPECT_EQ(buffer_, ptr);\n  EXPECT_EQ(8, size);\n\n  // Peeking again should return the same pointer.\n  EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size));\n  EXPECT_EQ(buffer_, ptr);\n  EXPECT_EQ(8, size);\n\n  // Skip forward in the same buffer then peek again.\n  EXPECT_TRUE(coded_output.Skip(3));\n  EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size));\n  EXPECT_EQ(buffer_ + 3, ptr);\n  EXPECT_EQ(5, size);\n\n  // Skip to end of buffer and peek -- should get next buffer.\n  EXPECT_TRUE(coded_output.Skip(5));\n  EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size));\n  EXPECT_EQ(buffer_ + 8, ptr);\n  EXPECT_EQ(8, size);\n\n  // Skip over multiple buffers.\n  EXPECT_TRUE(coded_output.Skip(22));\n  EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size));\n  EXPECT_EQ(buffer_ + 30, ptr);\n  EXPECT_EQ(2, size);\n}\n\n// -------------------------------------------------------------------\n// Limits\n\nTEST_1D(CodedStreamTest, BasicLimit, kBlockSizes) {\n  ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedInputStream coded_input(&input);\n\n    EXPECT_EQ(-1, coded_input.BytesUntilLimit());\n    CodedInputStream::Limit limit = coded_input.PushLimit(8);\n\n    // Read until we hit the limit.\n    uint32 value;\n    EXPECT_EQ(8, coded_input.BytesUntilLimit());\n    EXPECT_TRUE(coded_input.ReadLittleEndian32(&value));\n    EXPECT_EQ(4, coded_input.BytesUntilLimit());\n    EXPECT_TRUE(coded_input.ReadLittleEndian32(&value));\n    EXPECT_EQ(0, coded_input.BytesUntilLimit());\n    EXPECT_FALSE(coded_input.ReadLittleEndian32(&value));\n    EXPECT_EQ(0, coded_input.BytesUntilLimit());\n\n    coded_input.PopLimit(limit);\n\n    EXPECT_EQ(-1, coded_input.BytesUntilLimit());\n    EXPECT_TRUE(coded_input.ReadLittleEndian32(&value));\n  }\n\n  EXPECT_EQ(12, input.ByteCount());\n}\n\n// Test what happens when we push two limits where the second (top) one is\n// shorter.\nTEST_1D(CodedStreamTest, SmallLimitOnTopOfBigLimit, kBlockSizes) {\n  ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedInputStream coded_input(&input);\n\n    EXPECT_EQ(-1, coded_input.BytesUntilLimit());\n    CodedInputStream::Limit limit1 = coded_input.PushLimit(8);\n    EXPECT_EQ(8, coded_input.BytesUntilLimit());\n    CodedInputStream::Limit limit2 = coded_input.PushLimit(4);\n\n    uint32 value;\n\n    // Read until we hit limit2, the top and shortest limit.\n    EXPECT_EQ(4, coded_input.BytesUntilLimit());\n    EXPECT_TRUE(coded_input.ReadLittleEndian32(&value));\n    EXPECT_EQ(0, coded_input.BytesUntilLimit());\n    EXPECT_FALSE(coded_input.ReadLittleEndian32(&value));\n    EXPECT_EQ(0, coded_input.BytesUntilLimit());\n\n    coded_input.PopLimit(limit2);\n\n    // Read until we hit limit1.\n    EXPECT_EQ(4, coded_input.BytesUntilLimit());\n    EXPECT_TRUE(coded_input.ReadLittleEndian32(&value));\n    EXPECT_EQ(0, coded_input.BytesUntilLimit());\n    EXPECT_FALSE(coded_input.ReadLittleEndian32(&value));\n    EXPECT_EQ(0, coded_input.BytesUntilLimit());\n\n    coded_input.PopLimit(limit1);\n\n    // No more limits.\n    EXPECT_EQ(-1, coded_input.BytesUntilLimit());\n    EXPECT_TRUE(coded_input.ReadLittleEndian32(&value));\n  }\n\n  EXPECT_EQ(12, input.ByteCount());\n}\n\n// Test what happens when we push two limits where the second (top) one is\n// longer.  In this case, the top limit is shortened to match the previous\n// limit.\nTEST_1D(CodedStreamTest, BigLimitOnTopOfSmallLimit, kBlockSizes) {\n  ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case);\n\n  {\n    CodedInputStream coded_input(&input);\n\n    EXPECT_EQ(-1, coded_input.BytesUntilLimit());\n    CodedInputStream::Limit limit1 = coded_input.PushLimit(4);\n    EXPECT_EQ(4, coded_input.BytesUntilLimit());\n    CodedInputStream::Limit limit2 = coded_input.PushLimit(8);\n\n    uint32 value;\n\n    // Read until we hit limit2.  Except, wait!  limit1 is shorter, so\n    // we end up hitting that first, despite having 4 bytes to go on\n    // limit2.\n    EXPECT_EQ(4, coded_input.BytesUntilLimit());\n    EXPECT_TRUE(coded_input.ReadLittleEndian32(&value));\n    EXPECT_EQ(0, coded_input.BytesUntilLimit());\n    EXPECT_FALSE(coded_input.ReadLittleEndian32(&value));\n    EXPECT_EQ(0, coded_input.BytesUntilLimit());\n\n    coded_input.PopLimit(limit2);\n\n    // OK, popped limit2, now limit1 is on top, which we've already hit.\n    EXPECT_EQ(0, coded_input.BytesUntilLimit());\n    EXPECT_FALSE(coded_input.ReadLittleEndian32(&value));\n    EXPECT_EQ(0, coded_input.BytesUntilLimit());\n\n    coded_input.PopLimit(limit1);\n\n    // No more limits.\n    EXPECT_EQ(-1, coded_input.BytesUntilLimit());\n    EXPECT_TRUE(coded_input.ReadLittleEndian32(&value));\n  }\n\n  EXPECT_EQ(8, input.ByteCount());\n}\n\nTEST_F(CodedStreamTest, ExpectAtEnd) {\n  // Test ExpectAtEnd(), which is based on limits.\n  ArrayInputStream input(buffer_, sizeof(buffer_));\n  CodedInputStream coded_input(&input);\n\n  EXPECT_FALSE(coded_input.ExpectAtEnd());\n\n  CodedInputStream::Limit limit = coded_input.PushLimit(4);\n\n  uint32 value;\n  EXPECT_TRUE(coded_input.ReadLittleEndian32(&value));\n  EXPECT_TRUE(coded_input.ExpectAtEnd());\n\n  coded_input.PopLimit(limit);\n  EXPECT_FALSE(coded_input.ExpectAtEnd());\n}\n\nTEST_F(CodedStreamTest, NegativeLimit) {\n  // Check what happens when we push a negative limit.\n  ArrayInputStream input(buffer_, sizeof(buffer_));\n  CodedInputStream coded_input(&input);\n\n  CodedInputStream::Limit limit = coded_input.PushLimit(-1234);\n  // BytesUntilLimit() returns -1 to mean \"no limit\", which actually means\n  // \"the limit is INT_MAX relative to the beginning of the stream\".\n  EXPECT_EQ(-1, coded_input.BytesUntilLimit());\n  coded_input.PopLimit(limit);\n}\n\nTEST_F(CodedStreamTest, NegativeLimitAfterReading) {\n  // Check what happens when we push a negative limit.\n  ArrayInputStream input(buffer_, sizeof(buffer_));\n  CodedInputStream coded_input(&input);\n  ASSERT_TRUE(coded_input.Skip(128));\n\n  CodedInputStream::Limit limit = coded_input.PushLimit(-64);\n  // BytesUntilLimit() returns -1 to mean \"no limit\", which actually means\n  // \"the limit is INT_MAX relative to the beginning of the stream\".\n  EXPECT_EQ(-1, coded_input.BytesUntilLimit());\n  coded_input.PopLimit(limit);\n}\n\nTEST_F(CodedStreamTest, OverflowLimit) {\n  // Check what happens when we push a limit large enough that its absolute\n  // position is more than 2GB into the stream.\n  ArrayInputStream input(buffer_, sizeof(buffer_));\n  CodedInputStream coded_input(&input);\n  ASSERT_TRUE(coded_input.Skip(128));\n\n  CodedInputStream::Limit limit = coded_input.PushLimit(INT_MAX);\n  // BytesUntilLimit() returns -1 to mean \"no limit\", which actually means\n  // \"the limit is INT_MAX relative to the beginning of the stream\".\n  EXPECT_EQ(-1, coded_input.BytesUntilLimit());\n  coded_input.PopLimit(limit);\n}\n\nTEST_F(CodedStreamTest, TotalBytesLimit) {\n  ArrayInputStream input(buffer_, sizeof(buffer_));\n  CodedInputStream coded_input(&input);\n  coded_input.SetTotalBytesLimit(16, -1);\n\n  string str;\n  EXPECT_TRUE(coded_input.ReadString(&str, 16));\n\n  vector<string> errors;\n\n  {\n    ScopedMemoryLog error_log;\n    EXPECT_FALSE(coded_input.ReadString(&str, 1));\n    errors = error_log.GetMessages(ERROR);\n  }\n\n  ASSERT_EQ(1, errors.size());\n  EXPECT_PRED_FORMAT2(testing::IsSubstring,\n    \"A protocol message was rejected because it was too big\", errors[0]);\n\n  coded_input.SetTotalBytesLimit(32, -1);\n  EXPECT_TRUE(coded_input.ReadString(&str, 16));\n}\n\nTEST_F(CodedStreamTest, TotalBytesLimitNotValidMessageEnd) {\n  // total_bytes_limit_ is not a valid place for a message to end.\n\n  ArrayInputStream input(buffer_, sizeof(buffer_));\n  CodedInputStream coded_input(&input);\n\n  // Set both total_bytes_limit and a regular limit at 16 bytes.\n  coded_input.SetTotalBytesLimit(16, -1);\n  CodedInputStream::Limit limit = coded_input.PushLimit(16);\n\n  // Read 16 bytes.\n  string str;\n  EXPECT_TRUE(coded_input.ReadString(&str, 16));\n\n  // Read a tag.  Should fail, but report being a valid endpoint since it's\n  // a regular limit.\n  EXPECT_EQ(0, coded_input.ReadTag());\n  EXPECT_TRUE(coded_input.ConsumedEntireMessage());\n\n  // Pop the limit.\n  coded_input.PopLimit(limit);\n\n  // Read a tag.  Should fail, and report *not* being a valid endpoint, since\n  // this time we're hitting the total bytes limit.\n  EXPECT_EQ(0, coded_input.ReadTag());\n  EXPECT_FALSE(coded_input.ConsumedEntireMessage());\n}\n\n\nTEST_F(CodedStreamTest, RecursionLimit) {\n  ArrayInputStream input(buffer_, sizeof(buffer_));\n  CodedInputStream coded_input(&input);\n  coded_input.SetRecursionLimit(4);\n\n  // This is way too much testing for a counter.\n  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 1\n  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 2\n  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 3\n  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 4\n  EXPECT_FALSE(coded_input.IncrementRecursionDepth());     // 5\n  EXPECT_FALSE(coded_input.IncrementRecursionDepth());     // 6\n  coded_input.DecrementRecursionDepth();                   // 5\n  EXPECT_FALSE(coded_input.IncrementRecursionDepth());     // 6\n  coded_input.DecrementRecursionDepth();                   // 5\n  coded_input.DecrementRecursionDepth();                   // 4\n  coded_input.DecrementRecursionDepth();                   // 3\n  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 4\n  EXPECT_FALSE(coded_input.IncrementRecursionDepth());     // 5\n  coded_input.DecrementRecursionDepth();                   // 4\n  coded_input.DecrementRecursionDepth();                   // 3\n  coded_input.DecrementRecursionDepth();                   // 2\n  coded_input.DecrementRecursionDepth();                   // 1\n  coded_input.DecrementRecursionDepth();                   // 0\n  coded_input.DecrementRecursionDepth();                   // 0\n  coded_input.DecrementRecursionDepth();                   // 0\n  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 1\n  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 2\n  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 3\n  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 4\n  EXPECT_FALSE(coded_input.IncrementRecursionDepth());     // 5\n\n  coded_input.SetRecursionLimit(6);\n  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 6\n  EXPECT_FALSE(coded_input.IncrementRecursionDepth());     // 7\n}\n\nclass ReallyBigInputStream : public ZeroCopyInputStream {\n public:\n  ReallyBigInputStream() : backup_amount_(0), buffer_count_(0) {}\n  ~ReallyBigInputStream() {}\n\n  // implements ZeroCopyInputStream ----------------------------------\n  bool Next(const void** data, int* size) {\n    // We only expect BackUp() to be called at the end.\n    EXPECT_EQ(0, backup_amount_);\n\n    switch (buffer_count_++) {\n      case 0:\n        *data = buffer_;\n        *size = sizeof(buffer_);\n        return true;\n      case 1:\n        // Return an enormously large buffer that, when combined with the 1k\n        // returned already, should overflow the total_bytes_read_ counter in\n        // CodedInputStream.  Note that we'll only read the first 1024 bytes\n        // of this buffer so it's OK that we have it point at buffer_.\n        *data = buffer_;\n        *size = INT_MAX;\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  void BackUp(int count) {\n    backup_amount_ = count;\n  }\n\n  bool Skip(int count)    { GOOGLE_LOG(FATAL) << \"Not implemented.\"; return false; }\n  int64 ByteCount() const { GOOGLE_LOG(FATAL) << \"Not implemented.\"; return 0; }\n\n  int backup_amount_;\n\n private:\n  char buffer_[1024];\n  int64 buffer_count_;\n};\n\nTEST_F(CodedStreamTest, InputOver2G) {\n  // CodedInputStream should gracefully handle input over 2G and call\n  // input.BackUp() with the correct number of bytes on destruction.\n  ReallyBigInputStream input;\n\n  vector<string> errors;\n\n  {\n    ScopedMemoryLog error_log;\n    CodedInputStream coded_input(&input);\n    string str;\n    EXPECT_TRUE(coded_input.ReadString(&str, 512));\n    EXPECT_TRUE(coded_input.ReadString(&str, 1024));\n    errors = error_log.GetMessages(ERROR);\n  }\n\n  EXPECT_EQ(INT_MAX - 512, input.backup_amount_);\n  EXPECT_EQ(0, errors.size());\n}\n\n// ===================================================================\n\n\n}  // namespace\n}  // namespace io\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: brianolson@google.com (Brian Olson)\n//\n// This file contains the implementation of classes GzipInputStream and\n// GzipOutputStream.\n\n#include \"config.h\"\n\n#if HAVE_ZLIB\n#include <google/protobuf/io/gzip_stream.h>\n\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\n\nstatic const int kDefaultBufferSize = 65536;\n\nGzipInputStream::GzipInputStream(\n    ZeroCopyInputStream* sub_stream, Format format, int buffer_size)\n    : format_(format), sub_stream_(sub_stream), zerror_(Z_OK) {\n  zcontext_.zalloc = Z_NULL;\n  zcontext_.zfree = Z_NULL;\n  zcontext_.opaque = Z_NULL;\n  zcontext_.total_out = 0;\n  zcontext_.next_in = NULL;\n  zcontext_.avail_in = 0;\n  zcontext_.total_in = 0;\n  zcontext_.msg = NULL;\n  if (buffer_size == -1) {\n    output_buffer_length_ = kDefaultBufferSize;\n  } else {\n    output_buffer_length_ = buffer_size;\n  }\n  output_buffer_ = operator new(output_buffer_length_);\n  GOOGLE_CHECK(output_buffer_ != NULL);\n  zcontext_.next_out = static_cast<Bytef*>(output_buffer_);\n  zcontext_.avail_out = output_buffer_length_;\n  output_position_ = output_buffer_;\n}\nGzipInputStream::~GzipInputStream() {\n  operator delete(output_buffer_);\n  zerror_ = inflateEnd(&zcontext_);\n}\n\nstatic inline int internalInflateInit2(\n    z_stream* zcontext, GzipInputStream::Format format) {\n  int windowBitsFormat = 0;\n  switch (format) {\n    case GzipInputStream::GZIP: windowBitsFormat = 16; break;\n    case GzipInputStream::AUTO: windowBitsFormat = 32; break;\n    case GzipInputStream::ZLIB: windowBitsFormat = 0; break;\n  }\n  return inflateInit2(zcontext, /* windowBits */15 | windowBitsFormat);\n}\n\nint GzipInputStream::Inflate(int flush) {\n  if ((zerror_ == Z_OK) && (zcontext_.avail_out == 0)) {\n    // previous inflate filled output buffer. don't change input params yet.\n  } else if (zcontext_.avail_in == 0) {\n    const void* in;\n    int in_size;\n    bool first = zcontext_.next_in == NULL;\n    bool ok = sub_stream_->Next(&in, &in_size);\n    if (!ok) {\n      zcontext_.next_out = NULL;\n      zcontext_.avail_out = 0;\n      return Z_STREAM_END;\n    }\n    zcontext_.next_in = static_cast<Bytef*>(const_cast<void*>(in));\n    zcontext_.avail_in = in_size;\n    if (first) {\n      int error = internalInflateInit2(&zcontext_, format_);\n      if (error != Z_OK) {\n        return error;\n      }\n    }\n  }\n  zcontext_.next_out = static_cast<Bytef*>(output_buffer_);\n  zcontext_.avail_out = output_buffer_length_;\n  output_position_ = output_buffer_;\n  int error = inflate(&zcontext_, flush);\n  return error;\n}\n\nvoid GzipInputStream::DoNextOutput(const void** data, int* size) {\n  *data = output_position_;\n  *size = ((uintptr_t)zcontext_.next_out) - ((uintptr_t)output_position_);\n  output_position_ = zcontext_.next_out;\n}\n\n// implements ZeroCopyInputStream ----------------------------------\nbool GzipInputStream::Next(const void** data, int* size) {\n  bool ok = (zerror_ == Z_OK) || (zerror_ == Z_STREAM_END)\n      || (zerror_ == Z_BUF_ERROR);\n  if ((!ok) || (zcontext_.next_out == NULL)) {\n    return false;\n  }\n  if (zcontext_.next_out != output_position_) {\n    DoNextOutput(data, size);\n    return true;\n  }\n  if (zerror_ == Z_STREAM_END) {\n    if (zcontext_.next_out != NULL) {\n      // sub_stream_ may have concatenated streams to follow\n      zerror_ = inflateEnd(&zcontext_);\n      if (zerror_ != Z_OK) {\n        return false;\n      }\n      zerror_ = internalInflateInit2(&zcontext_, format_);\n      if (zerror_ != Z_OK) {\n        return false;\n      }\n    } else {\n      *data = NULL;\n      *size = 0;\n      return false;\n    }\n  }\n  zerror_ = Inflate(Z_NO_FLUSH);\n  if ((zerror_ == Z_STREAM_END) && (zcontext_.next_out == NULL)) {\n    // The underlying stream's Next returned false inside Inflate.\n    return false;\n  }\n  ok = (zerror_ == Z_OK) || (zerror_ == Z_STREAM_END)\n      || (zerror_ == Z_BUF_ERROR);\n  if (!ok) {\n    return false;\n  }\n  DoNextOutput(data, size);\n  return true;\n}\nvoid GzipInputStream::BackUp(int count) {\n  output_position_ = reinterpret_cast<void*>(\n      reinterpret_cast<uintptr_t>(output_position_) - count);\n}\nbool GzipInputStream::Skip(int count) {\n  const void* data;\n  int size;\n  bool ok = Next(&data, &size);\n  while (ok && (size < count)) {\n    count -= size;\n    ok = Next(&data, &size);\n  }\n  if (size > count) {\n    BackUp(size - count);\n  }\n  return ok;\n}\nint64 GzipInputStream::ByteCount() const {\n  return zcontext_.total_out +\n    (((uintptr_t)zcontext_.next_out) - ((uintptr_t)output_position_));\n}\n\n// =========================================================================\n\nGzipOutputStream::Options::Options()\n    : format(GZIP),\n      buffer_size(kDefaultBufferSize),\n      compression_level(Z_DEFAULT_COMPRESSION),\n      compression_strategy(Z_DEFAULT_STRATEGY) {}\n\nGzipOutputStream::GzipOutputStream(ZeroCopyOutputStream* sub_stream) {\n  Init(sub_stream, Options());\n}\n\nGzipOutputStream::GzipOutputStream(ZeroCopyOutputStream* sub_stream,\n                                   const Options& options) {\n  Init(sub_stream, options);\n}\n\nGzipOutputStream::GzipOutputStream(\n    ZeroCopyOutputStream* sub_stream, Format format, int buffer_size) {\n  Options options;\n  options.format = format;\n  if (buffer_size != -1) {\n    options.buffer_size = buffer_size;\n  }\n  Init(sub_stream, options);\n}\n\nvoid GzipOutputStream::Init(ZeroCopyOutputStream* sub_stream,\n                            const Options& options) {\n  sub_stream_ = sub_stream;\n  sub_data_ = NULL;\n  sub_data_size_ = 0;\n\n  input_buffer_length_ = options.buffer_size;\n  input_buffer_ = operator new(input_buffer_length_);\n  GOOGLE_CHECK(input_buffer_ != NULL);\n\n  zcontext_.zalloc = Z_NULL;\n  zcontext_.zfree = Z_NULL;\n  zcontext_.opaque = Z_NULL;\n  zcontext_.next_out = NULL;\n  zcontext_.avail_out = 0;\n  zcontext_.total_out = 0;\n  zcontext_.next_in = NULL;\n  zcontext_.avail_in = 0;\n  zcontext_.total_in = 0;\n  zcontext_.msg = NULL;\n  // default to GZIP format\n  int windowBitsFormat = 16;\n  if (options.format == ZLIB) {\n    windowBitsFormat = 0;\n  }\n  zerror_ = deflateInit2(\n      &zcontext_,\n      options.compression_level,\n      Z_DEFLATED,\n      /* windowBits */15 | windowBitsFormat,\n      /* memLevel (default) */8,\n      options.compression_strategy);\n}\n\nGzipOutputStream::~GzipOutputStream() {\n  Close();\n  if (input_buffer_ != NULL) {\n    operator delete(input_buffer_);\n  }\n}\n\n// private\nint GzipOutputStream::Deflate(int flush) {\n  int error = Z_OK;\n  do {\n    if ((sub_data_ == NULL) || (zcontext_.avail_out == 0)) {\n      bool ok = sub_stream_->Next(&sub_data_, &sub_data_size_);\n      if (!ok) {\n        sub_data_ = NULL;\n        sub_data_size_ = 0;\n        return Z_BUF_ERROR;\n      }\n      GOOGLE_CHECK_GT(sub_data_size_, 0);\n      zcontext_.next_out = static_cast<Bytef*>(sub_data_);\n      zcontext_.avail_out = sub_data_size_;\n    }\n    error = deflate(&zcontext_, flush);\n  } while (error == Z_OK && zcontext_.avail_out == 0);\n  if ((flush == Z_FULL_FLUSH) || (flush == Z_FINISH)) {\n    // Notify lower layer of data.\n    sub_stream_->BackUp(zcontext_.avail_out);\n    // We don't own the buffer anymore.\n    sub_data_ = NULL;\n    sub_data_size_ = 0;\n  }\n  return error;\n}\n\n// implements ZeroCopyOutputStream ---------------------------------\nbool GzipOutputStream::Next(void** data, int* size) {\n  if ((zerror_ != Z_OK) && (zerror_ != Z_BUF_ERROR)) {\n    return false;\n  }\n  if (zcontext_.avail_in != 0) {\n    zerror_ = Deflate(Z_NO_FLUSH);\n    if (zerror_ != Z_OK) {\n      return false;\n    }\n  }\n  if (zcontext_.avail_in == 0) {\n    // all input was consumed. reset the buffer.\n    zcontext_.next_in = static_cast<Bytef*>(input_buffer_);\n    zcontext_.avail_in = input_buffer_length_;\n    *data = input_buffer_;\n    *size = input_buffer_length_;\n  } else {\n    // The loop in Deflate should consume all avail_in\n    GOOGLE_LOG(DFATAL) << \"Deflate left bytes unconsumed\";\n  }\n  return true;\n}\nvoid GzipOutputStream::BackUp(int count) {\n  GOOGLE_CHECK_GE(zcontext_.avail_in, count);\n  zcontext_.avail_in -= count;\n}\nint64 GzipOutputStream::ByteCount() const {\n  return zcontext_.total_in + zcontext_.avail_in;\n}\n\nbool GzipOutputStream::Flush() {\n  do {\n    zerror_ = Deflate(Z_FULL_FLUSH);\n  } while (zerror_ == Z_OK);\n  return zerror_ == Z_OK;\n}\n\nbool GzipOutputStream::Close() {\n  if ((zerror_ != Z_OK) && (zerror_ != Z_BUF_ERROR)) {\n    return false;\n  }\n  do {\n    zerror_ = Deflate(Z_FINISH);\n  } while (zerror_ == Z_OK);\n  zerror_ = deflateEnd(&zcontext_);\n  bool ok = zerror_ == Z_OK;\n  zerror_ = Z_STREAM_END;\n  return ok;\n}\n\n}  // namespace io\n}  // namespace protobuf\n}  // namespace google\n\n#endif  // HAVE_ZLIB\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: brianolson@google.com (Brian Olson)\n//\n// This file contains the definition for classes GzipInputStream and\n// GzipOutputStream.\n//\n// GzipInputStream decompresses data from an underlying\n// ZeroCopyInputStream and provides the decompressed data as a\n// ZeroCopyInputStream.\n//\n// GzipOutputStream is an ZeroCopyOutputStream that compresses data to\n// an underlying ZeroCopyOutputStream.\n\n#ifndef GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__\n#define GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__\n\n#include <zlib.h>\n\n#include <google/protobuf/io/zero_copy_stream.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\n\n// A ZeroCopyInputStream that reads compressed data through zlib\nclass LIBPROTOBUF_EXPORT GzipInputStream : public ZeroCopyInputStream {\n public:\n  // Format key for constructor\n  enum Format {\n    // zlib will autodetect gzip header or deflate stream\n    AUTO = 0,\n\n    // GZIP streams have some extra header data for file attributes.\n    GZIP = 1,\n\n    // Simpler zlib stream format.\n    ZLIB = 2,\n  };\n\n  // buffer_size and format may be -1 for default of 64kB and GZIP format\n  explicit GzipInputStream(\n      ZeroCopyInputStream* sub_stream,\n      Format format = AUTO,\n      int buffer_size = -1);\n  virtual ~GzipInputStream();\n\n  // Return last error message or NULL if no error.\n  inline const char* ZlibErrorMessage() const {\n    return zcontext_.msg;\n  }\n  inline int ZlibErrorCode() const {\n    return zerror_;\n  }\n\n  // implements ZeroCopyInputStream ----------------------------------\n  bool Next(const void** data, int* size);\n  void BackUp(int count);\n  bool Skip(int count);\n  int64 ByteCount() const;\n\n private:\n  Format format_;\n\n  ZeroCopyInputStream* sub_stream_;\n\n  z_stream zcontext_;\n  int zerror_;\n\n  void* output_buffer_;\n  void* output_position_;\n  size_t output_buffer_length_;\n\n  int Inflate(int flush);\n  void DoNextOutput(const void** data, int* size);\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GzipInputStream);\n};\n\n\nclass LIBPROTOBUF_EXPORT GzipOutputStream : public ZeroCopyOutputStream {\n public:\n  // Format key for constructor\n  enum Format {\n    // GZIP streams have some extra header data for file attributes.\n    GZIP = 1,\n\n    // Simpler zlib stream format.\n    ZLIB = 2,\n  };\n\n  struct Options {\n    // Defaults to GZIP.\n    Format format;\n\n    // What size buffer to use internally.  Defaults to 64kB.\n    int buffer_size;\n\n    // A number between 0 and 9, where 0 is no compression and 9 is best\n    // compression.  Defaults to Z_DEFAULT_COMPRESSION (see zlib.h).\n    int compression_level;\n\n    // Defaults to Z_DEFAULT_STRATEGY.  Can also be set to Z_FILTERED,\n    // Z_HUFFMAN_ONLY, or Z_RLE.  See the documentation for deflateInit2 in\n    // zlib.h for definitions of these constants.\n    int compression_strategy;\n\n    Options();  // Initializes with default values.\n  };\n\n  // Create a GzipOutputStream with default options.\n  explicit GzipOutputStream(ZeroCopyOutputStream* sub_stream);\n\n  // Create a GzipOutputStream with the given options.\n  GzipOutputStream(\n      ZeroCopyOutputStream* sub_stream,\n      const Options& options);\n\n  // DEPRECATED:  Use one of the above constructors instead.\n  GzipOutputStream(\n      ZeroCopyOutputStream* sub_stream,\n      Format format,\n      int buffer_size = -1) GOOGLE_ATTRIBUTE_DEPRECATED;\n\n  virtual ~GzipOutputStream();\n\n  // Return last error message or NULL if no error.\n  inline const char* ZlibErrorMessage() const {\n    return zcontext_.msg;\n  }\n  inline int ZlibErrorCode() const {\n    return zerror_;\n  }\n\n  // Flushes data written so far to zipped data in the underlying stream.\n  // It is the caller's responsibility to flush the underlying stream if\n  // necessary.\n  // Compression may be less efficient stopping and starting around flushes.\n  // Returns true if no error.\n  bool Flush();\n\n  // Writes out all data and closes the gzip stream.\n  // It is the caller's responsibility to close the underlying stream if\n  // necessary.\n  // Returns true if no error.\n  bool Close();\n\n  // implements ZeroCopyOutputStream ---------------------------------\n  bool Next(void** data, int* size);\n  void BackUp(int count);\n  int64 ByteCount() const;\n\n private:\n  ZeroCopyOutputStream* sub_stream_;\n  // Result from calling Next() on sub_stream_\n  void* sub_data_;\n  int sub_data_size_;\n\n  z_stream zcontext_;\n  int zerror_;\n  void* input_buffer_;\n  size_t input_buffer_length_;\n\n  // Shared constructor code.\n  void Init(ZeroCopyOutputStream* sub_stream, const Options& options);\n\n  // Do some compression.\n  // Takes zlib flush mode.\n  // Returns zlib error code.\n  int Deflate(int flush);\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GzipOutputStream);\n};\n\n}  // namespace io\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh",
    "content": "#!/bin/sh -x\n#\n# Protocol Buffers - Google's data interchange format\n# Copyright 2009 Google Inc.  All rights reserved.\n# http://code.google.com/p/protobuf/\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are\n# met:\n#\n#     * Redistributions of source code must retain the above copyright\n# notice, this list of conditions and the following disclaimer.\n#     * Redistributions in binary form must reproduce the above\n# copyright notice, this list of conditions and the following disclaimer\n# in the documentation and/or other materials provided with the\n# distribution.\n#     * Neither the name of Google Inc. nor the names of its\n# contributors may be used to endorse or promote products derived from\n# this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n# Author: brianolson@google.com (Brian Olson)\n#\n# Test compatibility between command line gzip/gunzip binaries and\n# ZeroCopyStream versions.\n\nTESTFILE=Makefile\n\n(./zcgzip < ${TESTFILE} | gunzip | cmp - ${TESTFILE}) && \\\n(gzip < ${TESTFILE} | ./zcgunzip | cmp - ${TESTFILE})\n\n# Result of \"(cmd) && (cmd)\" implicitly becomes result of this script\n# and thus the test.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/package_info.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file exists solely to document the google::protobuf::io namespace.\n// It is not compiled into anything, but it may be read by an automated\n// documentation generator.\n\nnamespace google {\n\nnamespace protobuf {\n\n// Auxiliary classes used for I/O.\n//\n// The Protocol Buffer library uses the classes in this package to deal with\n// I/O and encoding/decoding raw bytes.  Most users will not need to\n// deal with this package.  However, users who want to adapt the system to\n// work with their own I/O abstractions -- e.g., to allow Protocol Buffers\n// to be read from a different kind of input stream without the need for a\n// temporary buffer -- should take a closer look.\nnamespace io {}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\n\nPrinter::Printer(ZeroCopyOutputStream* output, char variable_delimiter)\n  : variable_delimiter_(variable_delimiter),\n    output_(output),\n    buffer_(NULL),\n    buffer_size_(0),\n    at_start_of_line_(true),\n    failed_(false) {\n}\n\nPrinter::~Printer() {\n  // Only BackUp() if we're sure we've successfully called Next() at least once.\n  if (buffer_size_ > 0) {\n    output_->BackUp(buffer_size_);\n  }\n}\n\nvoid Printer::Print(const map<string, string>& variables, const char* text) {\n  int size = strlen(text);\n  int pos = 0;  // The number of bytes we've written so far.\n\n  for (int i = 0; i < size; i++) {\n    if (text[i] == '\\n') {\n      // Saw newline.  If there is more text, we may need to insert an indent\n      // here.  So, write what we have so far, including the '\\n'.\n      WriteRaw(text + pos, i - pos + 1);\n      pos = i + 1;\n\n      // Setting this true will cause the next WriteRaw() to insert an indent\n      // first.\n      at_start_of_line_ = true;\n\n    } else if (text[i] == variable_delimiter_) {\n      // Saw the start of a variable name.\n\n      // Write what we have so far.\n      WriteRaw(text + pos, i - pos);\n      pos = i + 1;\n\n      // Find closing delimiter.\n      const char* end = strchr(text + pos, variable_delimiter_);\n      if (end == NULL) {\n        GOOGLE_LOG(DFATAL) << \" Unclosed variable name.\";\n        end = text + pos;\n      }\n      int endpos = end - text;\n\n      string varname(text + pos, endpos - pos);\n      if (varname.empty()) {\n        // Two delimiters in a row reduce to a literal delimiter character.\n        WriteRaw(&variable_delimiter_, 1);\n      } else {\n        // Replace with the variable's value.\n        map<string, string>::const_iterator iter = variables.find(varname);\n        if (iter == variables.end()) {\n          GOOGLE_LOG(DFATAL) << \" Undefined variable: \" << varname;\n        } else {\n          WriteRaw(iter->second.data(), iter->second.size());\n        }\n      }\n\n      // Advance past this variable.\n      i = endpos;\n      pos = endpos + 1;\n    }\n  }\n\n  // Write the rest.\n  WriteRaw(text + pos, size - pos);\n}\n\nvoid Printer::Print(const char* text) {\n  static map<string, string> empty;\n  Print(empty, text);\n}\n\nvoid Printer::Print(const char* text,\n                    const char* variable, const string& value) {\n  map<string, string> vars;\n  vars[variable] = value;\n  Print(vars, text);\n}\n\nvoid Printer::Print(const char* text,\n                    const char* variable1, const string& value1,\n                    const char* variable2, const string& value2) {\n  map<string, string> vars;\n  vars[variable1] = value1;\n  vars[variable2] = value2;\n  Print(vars, text);\n}\n\nvoid Printer::Print(const char* text,\n                    const char* variable1, const string& value1,\n                    const char* variable2, const string& value2,\n                    const char* variable3, const string& value3) {\n  map<string, string> vars;\n  vars[variable1] = value1;\n  vars[variable2] = value2;\n  vars[variable3] = value3;\n  Print(vars, text);\n}\n\nvoid Printer::Indent() {\n  indent_ += \"  \";\n}\n\nvoid Printer::Outdent() {\n  if (indent_.empty()) {\n    GOOGLE_LOG(DFATAL) << \" Outdent() without matching Indent().\";\n    return;\n  }\n\n  indent_.resize(indent_.size() - 2);\n}\n\nvoid Printer::PrintRaw(const string& data) {\n  WriteRaw(data.data(), data.size());\n}\n\nvoid Printer::PrintRaw(const char* data) {\n  if (failed_) return;\n  WriteRaw(data, strlen(data));\n}\n\nvoid Printer::WriteRaw(const char* data, int size) {\n  if (failed_) return;\n  if (size == 0) return;\n\n  if (at_start_of_line_) {\n    // Insert an indent.\n    at_start_of_line_ = false;\n    WriteRaw(indent_.data(), indent_.size());\n    if (failed_) return;\n  }\n\n  while (size > buffer_size_) {\n    // Data exceeds space in the buffer.  Copy what we can and request a\n    // new buffer.\n    memcpy(buffer_, data, buffer_size_);\n    data += buffer_size_;\n    size -= buffer_size_;\n    void* void_buffer;\n    failed_ = !output_->Next(&void_buffer, &buffer_size_);\n    if (failed_) return;\n    buffer_ = reinterpret_cast<char*>(void_buffer);\n  }\n\n  // Buffer is big enough to receive the data; copy it.\n  memcpy(buffer_, data, size);\n  buffer_ += size;\n  buffer_size_ -= size;\n}\n\n}  // namespace io\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Utility class for writing text to a ZeroCopyOutputStream.\n\n#ifndef GOOGLE_PROTOBUF_IO_PRINTER_H__\n#define GOOGLE_PROTOBUF_IO_PRINTER_H__\n\n#include <string>\n#include <map>\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\n\nclass ZeroCopyOutputStream;     // zero_copy_stream.h\n\n// This simple utility class assists in code generation.  It basically\n// allows the caller to define a set of variables and then output some\n// text with variable substitutions.  Example usage:\n//\n//   Printer printer(output, '$');\n//   map<string, string> vars;\n//   vars[\"name\"] = \"Bob\";\n//   printer.Print(vars, \"My name is $name$.\");\n//\n// The above writes \"My name is Bob.\" to the output stream.\n//\n// Printer aggressively enforces correct usage, crashing (with assert failures)\n// in the case of undefined variables in debug builds. This helps greatly in\n// debugging code which uses it.\nclass LIBPROTOBUF_EXPORT Printer {\n public:\n  // Create a printer that writes text to the given output stream.  Use the\n  // given character as the delimiter for variables.\n  Printer(ZeroCopyOutputStream* output, char variable_delimiter);\n  ~Printer();\n\n  // Print some text after applying variable substitutions.  If a particular\n  // variable in the text is not defined, this will crash.  Variables to be\n  // substituted are identified by their names surrounded by delimiter\n  // characters (as given to the constructor).  The variable bindings are\n  // defined by the given map.\n  void Print(const map<string, string>& variables, const char* text);\n\n  // Like the first Print(), except the substitutions are given as parameters.\n  void Print(const char* text);\n  // Like the first Print(), except the substitutions are given as parameters.\n  void Print(const char* text, const char* variable, const string& value);\n  // Like the first Print(), except the substitutions are given as parameters.\n  void Print(const char* text, const char* variable1, const string& value1,\n                               const char* variable2, const string& value2);\n  // Like the first Print(), except the substitutions are given as parameters.\n  void Print(const char* text, const char* variable1, const string& value1,\n                               const char* variable2, const string& value2,\n                               const char* variable3, const string& value3);\n  // TODO(kenton):  Overloaded versions with more variables?  Three seems\n  //   to be enough.\n\n  // Indent text by two spaces.  After calling Indent(), two spaces will be\n  // inserted at the beginning of each line of text.  Indent() may be called\n  // multiple times to produce deeper indents.\n  void Indent();\n\n  // Reduces the current indent level by two spaces, or crashes if the indent\n  // level is zero.\n  void Outdent();\n\n  // Write a string to the output buffer.\n  // This method does not look for newlines to add indentation.\n  void PrintRaw(const string& data);\n\n  // Write a zero-delimited string to output buffer.\n  // This method does not look for newlines to add indentation.\n  void PrintRaw(const char* data);\n\n  // Write some bytes to the output buffer.\n  // This method does not look for newlines to add indentation.\n  void WriteRaw(const char* data, int size);\n\n  // True if any write to the underlying stream failed.  (We don't just\n  // crash in this case because this is an I/O failure, not a programming\n  // error.)\n  bool failed() const { return failed_; }\n\n private:\n  const char variable_delimiter_;\n\n  ZeroCopyOutputStream* const output_;\n  char* buffer_;\n  int buffer_size_;\n\n  string indent_;\n  bool at_start_of_line_;\n  bool failed_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Printer);\n};\n\n}  // namespace io\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_IO_PRINTER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <vector>\n\n#include <google/protobuf/io/printer.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\nnamespace {\n\n// Each test repeats over several block sizes in order to test both cases\n// where particular writes cross a buffer boundary and cases where they do\n// not.\n\nTEST(Printer, EmptyPrinter) {\n  char buffer[8192];\n  const int block_size = 100;\n  ArrayOutputStream output(buffer, GOOGLE_ARRAYSIZE(buffer), block_size);\n  Printer printer(&output, '\\0');\n  EXPECT_TRUE(!printer.failed());\n}\n\nTEST(Printer, BasicPrinting) {\n  char buffer[8192];\n\n  for (int block_size = 1; block_size < 512; block_size *= 2) {\n    ArrayOutputStream output(buffer, sizeof(buffer), block_size);\n\n    {\n      Printer printer(&output, '\\0');\n\n      printer.Print(\"Hello World!\");\n      printer.Print(\"  This is the same line.\\n\");\n      printer.Print(\"But this is a new one.\\nAnd this is another one.\");\n\n      EXPECT_FALSE(printer.failed());\n    }\n\n    buffer[output.ByteCount()] = '\\0';\n\n    EXPECT_STREQ(\"Hello World!  This is the same line.\\n\"\n                 \"But this is a new one.\\n\"\n                 \"And this is another one.\",\n                 buffer);\n  }\n}\n\nTEST(Printer, WriteRaw) {\n  char buffer[8192];\n\n  for (int block_size = 1; block_size < 512; block_size *= 2) {\n    ArrayOutputStream output(buffer, sizeof(buffer), block_size);\n\n    {\n      string string_obj = \"From an object\\n\";\n      Printer printer(&output, '$');\n      printer.WriteRaw(\"Hello World!\", 12);\n      printer.PrintRaw(\"  This is the same line.\\n\");\n      printer.PrintRaw(\"But this is a new one.\\nAnd this is another one.\");\n      printer.WriteRaw(\"\\n\", 1);\n      printer.PrintRaw(string_obj);\n      EXPECT_FALSE(printer.failed());\n    }\n\n    buffer[output.ByteCount()] = '\\0';\n\n    EXPECT_STREQ(\"Hello World!  This is the same line.\\n\"\n                 \"But this is a new one.\\n\"\n                 \"And this is another one.\"\n                 \"\\n\"\n                 \"From an object\\n\",\n                 buffer);\n  }\n}\n\nTEST(Printer, VariableSubstitution) {\n  char buffer[8192];\n\n  for (int block_size = 1; block_size < 512; block_size *= 2) {\n    ArrayOutputStream output(buffer, sizeof(buffer), block_size);\n\n    {\n      Printer printer(&output, '$');\n      map<string, string> vars;\n\n      vars[\"foo\"] = \"World\";\n      vars[\"bar\"] = \"$foo$\";\n      vars[\"abcdefg\"] = \"1234\";\n\n      printer.Print(vars, \"Hello $foo$!\\nbar = $bar$\\n\");\n      printer.PrintRaw(\"RawBit\\n\");\n      printer.Print(vars, \"$abcdefg$\\nA literal dollar sign:  $$\");\n\n      vars[\"foo\"] = \"blah\";\n      printer.Print(vars, \"\\nNow foo = $foo$.\");\n\n      EXPECT_FALSE(printer.failed());\n    }\n\n    buffer[output.ByteCount()] = '\\0';\n\n    EXPECT_STREQ(\"Hello World!\\n\"\n                 \"bar = $foo$\\n\"\n                 \"RawBit\\n\"\n                 \"1234\\n\"\n                 \"A literal dollar sign:  $\\n\"\n                 \"Now foo = blah.\",\n                 buffer);\n  }\n}\n\nTEST(Printer, InlineVariableSubstitution) {\n  char buffer[8192];\n\n  ArrayOutputStream output(buffer, sizeof(buffer));\n\n  {\n    Printer printer(&output, '$');\n    printer.Print(\"Hello $foo$!\\n\", \"foo\", \"World\");\n    printer.PrintRaw(\"RawBit\\n\");\n    printer.Print(\"$foo$ $bar$\\n\", \"foo\", \"one\", \"bar\", \"two\");\n    EXPECT_FALSE(printer.failed());\n  }\n\n  buffer[output.ByteCount()] = '\\0';\n\n  EXPECT_STREQ(\"Hello World!\\n\"\n               \"RawBit\\n\"\n               \"one two\\n\",\n               buffer);\n}\n\nTEST(Printer, Indenting) {\n  char buffer[8192];\n\n  for (int block_size = 1; block_size < 512; block_size *= 2) {\n    ArrayOutputStream output(buffer, sizeof(buffer), block_size);\n\n    {\n      Printer printer(&output, '$');\n      map<string, string> vars;\n\n      vars[\"newline\"] = \"\\n\";\n\n      printer.Print(\"This is not indented.\\n\");\n      printer.Indent();\n      printer.Print(\"This is indented\\nAnd so is this\\n\");\n      printer.Outdent();\n      printer.Print(\"But this is not.\");\n      printer.Indent();\n      printer.Print(\"  And this is still the same line.\\n\"\n                    \"But this is indented.\\n\");\n      printer.PrintRaw(\"RawBit has indent at start\\n\");\n      printer.PrintRaw(\"but not after a raw newline\\n\");\n      printer.Print(vars, \"Note that a newline in a variable will break \"\n                    \"indenting, as we see$newline$here.\\n\");\n      printer.Indent();\n      printer.Print(\"And this\");\n      printer.Outdent();\n      printer.Outdent();\n      printer.Print(\" is double-indented\\nBack to normal.\");\n\n      EXPECT_FALSE(printer.failed());\n    }\n\n    buffer[output.ByteCount()] = '\\0';\n\n    EXPECT_STREQ(\n      \"This is not indented.\\n\"\n      \"  This is indented\\n\"\n      \"  And so is this\\n\"\n      \"But this is not.  And this is still the same line.\\n\"\n      \"  But this is indented.\\n\"\n      \"  RawBit has indent at start\\n\"\n      \"but not after a raw newline\\n\"\n      \"Note that a newline in a variable will break indenting, as we see\\n\"\n      \"here.\\n\"\n      \"    And this is double-indented\\n\"\n      \"Back to normal.\",\n      buffer);\n  }\n}\n\n// Death tests do not work on Windows as of yet.\n#ifdef GTEST_HAS_DEATH_TEST\nTEST(Printer, Death) {\n  char buffer[8192];\n\n  ArrayOutputStream output(buffer, sizeof(buffer));\n  Printer printer(&output, '$');\n\n  EXPECT_DEBUG_DEATH(printer.Print(\"$nosuchvar$\"), \"Undefined variable\");\n  EXPECT_DEBUG_DEATH(printer.Print(\"$unclosed\"), \"Unclosed variable name\");\n  EXPECT_DEBUG_DEATH(printer.Outdent(), \"without matching Indent\");\n}\n#endif  // GTEST_HAS_DEATH_TEST\n\nTEST(Printer, WriteFailure) {\n  char buffer[16];\n\n  ArrayOutputStream output(buffer, sizeof(buffer));\n  Printer printer(&output, '$');\n\n  // Print 16 bytes to fill the buffer exactly (should not fail).\n  printer.Print(\"0123456789abcdef\");\n  EXPECT_FALSE(printer.failed());\n\n  // Try to print one more byte (should fail).\n  printer.Print(\" \");\n  EXPECT_TRUE(printer.failed());\n\n  // Should not crash\n  printer.Print(\"blah\");\n  EXPECT_TRUE(printer.failed());\n\n  // Buffer should contain the first 16 bytes written.\n  EXPECT_EQ(\"0123456789abcdef\", string(buffer, sizeof(buffer)));\n}\n\n}  // namespace\n}  // namespace io\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Here we have a hand-written lexer.  At first you might ask yourself,\n// \"Hand-written text processing?  Is Kenton crazy?!\"  Well, first of all,\n// yes I am crazy, but that's beside the point.  There are actually reasons\n// why I ended up writing this this way.\n//\n// The traditional approach to lexing is to use lex to generate a lexer for\n// you.  Unfortunately, lex's output is ridiculously ugly and difficult to\n// integrate cleanly with C++ code, especially abstract code or code meant\n// as a library.  Better parser-generators exist but would add dependencies\n// which most users won't already have, which we'd like to avoid.  (GNU flex\n// has a C++ output option, but it's still ridiculously ugly, non-abstract,\n// and not library-friendly.)\n//\n// The next approach that any good software engineer should look at is to\n// use regular expressions.  And, indeed, I did.  I have code which\n// implements this same class using regular expressions.  It's about 200\n// lines shorter.  However:\n// - Rather than error messages telling you \"This string has an invalid\n//   escape sequence at line 5, column 45\", you get error messages like\n//   \"Parse error on line 5\".  Giving more precise errors requires adding\n//   a lot of code that ends up basically as complex as the hand-coded\n//   version anyway.\n// - The regular expression to match a string literal looks like this:\n//     kString  = new RE(\"(\\\"([^\\\"\\\\\\\\]|\"              // non-escaped\n//                       \"\\\\\\\\[abfnrtv?\\\"'\\\\\\\\0-7]|\"   // normal escape\n//                       \"\\\\\\\\x[0-9a-fA-F])*\\\"|\"       // hex escape\n//                       \"\\'([^\\'\\\\\\\\]|\"        // Also support single-quotes.\n//                       \"\\\\\\\\[abfnrtv?\\\"'\\\\\\\\0-7]|\"\n//                       \"\\\\\\\\x[0-9a-fA-F])*\\')\");\n//   Verifying the correctness of this line noise is actually harder than\n//   verifying the correctness of ConsumeString(), defined below.  I'm not\n//   even confident that the above is correct, after staring at it for some\n//   time.\n// - PCRE is fast, but there's still more overhead involved than the code\n//   below.\n// - Sadly, regular expressions are not part of the C standard library, so\n//   using them would require depending on some other library.  For the\n//   open source release, this could be really annoying.  Nobody likes\n//   downloading one piece of software just to find that they need to\n//   download something else to make it work, and in all likelihood\n//   people downloading Protocol Buffers will already be doing so just\n//   to make something else work.  We could include a copy of PCRE with\n//   our code, but that obligates us to keep it up-to-date and just seems\n//   like a big waste just to save 200 lines of code.\n//\n// On a similar but unrelated note, I'm even scared to use ctype.h.\n// Apparently functions like isalpha() are locale-dependent.  So, if we used\n// that, then if this code is being called from some program that doesn't\n// have its locale set to \"C\", it would behave strangely.  We can't just set\n// the locale to \"C\" ourselves since we might break the calling program that\n// way, particularly if it is multi-threaded.  WTF?  Someone please let me\n// (Kenton) know if I'm missing something here...\n//\n// I'd love to hear about other alternatives, though, as this code isn't\n// exactly pretty.\n\n#include <google/protobuf/io/tokenizer.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\nnamespace {\n\n// As mentioned above, I don't trust ctype.h due to the presence of \"locales\".\n// So, I have written replacement functions here.  Someone please smack me if\n// this is a bad idea or if there is some way around this.\n//\n// These \"character classes\" are designed to be used in template methods.\n// For instance, Tokenizer::ConsumeZeroOrMore<Whitespace>() will eat\n// whitespace.\n\n// Note:  No class is allowed to contain '\\0', since this is used to mark end-\n//   of-input and is handled specially.\n\n#define CHARACTER_CLASS(NAME, EXPRESSION)      \\\n  class NAME {                                 \\\n   public:                                     \\\n    static inline bool InClass(char c) {       \\\n      return EXPRESSION;                       \\\n    }                                          \\\n  }\n\nCHARACTER_CLASS(Whitespace, c == ' ' || c == '\\n' || c == '\\t' ||\n                            c == '\\r' || c == '\\v' || c == '\\f');\n\nCHARACTER_CLASS(Unprintable, c < ' ' && c > '\\0');\n\nCHARACTER_CLASS(Digit, '0' <= c && c <= '9');\nCHARACTER_CLASS(OctalDigit, '0' <= c && c <= '7');\nCHARACTER_CLASS(HexDigit, ('0' <= c && c <= '9') ||\n                          ('a' <= c && c <= 'f') ||\n                          ('A' <= c && c <= 'F'));\n\nCHARACTER_CLASS(Letter, ('a' <= c && c <= 'z') ||\n                        ('A' <= c && c <= 'Z') ||\n                        (c == '_'));\n\nCHARACTER_CLASS(Alphanumeric, ('a' <= c && c <= 'z') ||\n                              ('A' <= c && c <= 'Z') ||\n                              ('0' <= c && c <= '9') ||\n                              (c == '_'));\n\nCHARACTER_CLASS(Escape, c == 'a' || c == 'b' || c == 'f' || c == 'n' ||\n                        c == 'r' || c == 't' || c == 'v' || c == '\\\\' ||\n                        c == '?' || c == '\\'' || c == '\\\"');\n\n#undef CHARACTER_CLASS\n\n// Given a char, interpret it as a numeric digit and return its value.\n// This supports any number base up to 36.\ninline int DigitValue(char digit) {\n  if ('0' <= digit && digit <= '9') return digit - '0';\n  if ('a' <= digit && digit <= 'z') return digit - 'a' + 10;\n  if ('A' <= digit && digit <= 'Z') return digit - 'A' + 10;\n  return -1;\n}\n\n// Inline because it's only used in one place.\ninline char TranslateEscape(char c) {\n  switch (c) {\n    case 'a':  return '\\a';\n    case 'b':  return '\\b';\n    case 'f':  return '\\f';\n    case 'n':  return '\\n';\n    case 'r':  return '\\r';\n    case 't':  return '\\t';\n    case 'v':  return '\\v';\n    case '\\\\': return '\\\\';\n    case '?':  return '\\?';    // Trigraphs = :(\n    case '\\'': return '\\'';\n    case '\"':  return '\\\"';\n\n    // We expect escape sequences to have been validated separately.\n    default:   return '?';\n  }\n}\n\n}  // anonymous namespace\n\nErrorCollector::~ErrorCollector() {}\n\n// ===================================================================\n\nTokenizer::Tokenizer(ZeroCopyInputStream* input,\n                     ErrorCollector* error_collector)\n  : input_(input),\n    error_collector_(error_collector),\n    buffer_(NULL),\n    buffer_size_(0),\n    buffer_pos_(0),\n    read_error_(false),\n    line_(0),\n    column_(0),\n    token_start_(-1),\n    allow_f_after_float_(false),\n    comment_style_(CPP_COMMENT_STYLE) {\n\n  current_.line = 0;\n  current_.column = 0;\n  current_.end_column = 0;\n  current_.type = TYPE_START;\n\n  Refresh();\n}\n\nTokenizer::~Tokenizer() {\n  // If we had any buffer left unread, return it to the underlying stream\n  // so that someone else can read it.\n  if (buffer_size_ > buffer_pos_) {\n    input_->BackUp(buffer_size_ - buffer_pos_);\n  }\n}\n\n// -------------------------------------------------------------------\n// Internal helpers.\n\nvoid Tokenizer::NextChar() {\n  // Update our line and column counters based on the character being\n  // consumed.\n  if (current_char_ == '\\n') {\n    ++line_;\n    column_ = 0;\n  } else if (current_char_ == '\\t') {\n    column_ += kTabWidth - column_ % kTabWidth;\n  } else {\n    ++column_;\n  }\n\n  // Advance to the next character.\n  ++buffer_pos_;\n  if (buffer_pos_ < buffer_size_) {\n    current_char_ = buffer_[buffer_pos_];\n  } else {\n    Refresh();\n  }\n}\n\nvoid Tokenizer::Refresh() {\n  if (read_error_) {\n    current_char_ = '\\0';\n    return;\n  }\n\n  // If we're in a token, append the rest of the buffer to it.\n  if (token_start_ >= 0 && token_start_ < buffer_size_) {\n    current_.text.append(buffer_ + token_start_, buffer_size_ - token_start_);\n    token_start_ = 0;\n  }\n\n  const void* data = NULL;\n  buffer_ = NULL;\n  buffer_pos_ = 0;\n  do {\n    if (!input_->Next(&data, &buffer_size_)) {\n      // end of stream (or read error)\n      buffer_size_ = 0;\n      read_error_ = true;\n      current_char_ = '\\0';\n      return;\n    }\n  } while (buffer_size_ == 0);\n\n  buffer_ = static_cast<const char*>(data);\n\n  current_char_ = buffer_[0];\n}\n\ninline void Tokenizer::StartToken() {\n  token_start_ = buffer_pos_;\n  current_.type = TYPE_START;    // Just for the sake of initializing it.\n  current_.text.clear();\n  current_.line = line_;\n  current_.column = column_;\n}\n\ninline void Tokenizer::EndToken() {\n  // Note:  The if() is necessary because some STL implementations crash when\n  //   you call string::append(NULL, 0), presumably because they are trying to\n  //   be helpful by detecting the NULL pointer, even though there's nothing\n  //   wrong with reading zero bytes from NULL.\n  if (buffer_pos_ != token_start_) {\n    current_.text.append(buffer_ + token_start_, buffer_pos_ - token_start_);\n  }\n  token_start_ = -1;\n  current_.end_column = column_;\n}\n\n// -------------------------------------------------------------------\n// Helper methods that consume characters.\n\ntemplate<typename CharacterClass>\ninline bool Tokenizer::LookingAt() {\n  return CharacterClass::InClass(current_char_);\n}\n\ntemplate<typename CharacterClass>\ninline bool Tokenizer::TryConsumeOne() {\n  if (CharacterClass::InClass(current_char_)) {\n    NextChar();\n    return true;\n  } else {\n    return false;\n  }\n}\n\ninline bool Tokenizer::TryConsume(char c) {\n  if (current_char_ == c) {\n    NextChar();\n    return true;\n  } else {\n    return false;\n  }\n}\n\ntemplate<typename CharacterClass>\ninline void Tokenizer::ConsumeZeroOrMore() {\n  while (CharacterClass::InClass(current_char_)) {\n    NextChar();\n  }\n}\n\ntemplate<typename CharacterClass>\ninline void Tokenizer::ConsumeOneOrMore(const char* error) {\n  if (!CharacterClass::InClass(current_char_)) {\n    AddError(error);\n  } else {\n    do {\n      NextChar();\n    } while (CharacterClass::InClass(current_char_));\n  }\n}\n\n// -------------------------------------------------------------------\n// Methods that read whole patterns matching certain kinds of tokens\n// or comments.\n\nvoid Tokenizer::ConsumeString(char delimiter) {\n  while (true) {\n    switch (current_char_) {\n      case '\\0':\n      case '\\n': {\n        AddError(\"String literals cannot cross line boundaries.\");\n        return;\n      }\n\n      case '\\\\': {\n        // An escape sequence.\n        NextChar();\n        if (TryConsumeOne<Escape>()) {\n          // Valid escape sequence.\n        } else if (TryConsumeOne<OctalDigit>()) {\n          // Possibly followed by two more octal digits, but these will\n          // just be consumed by the main loop anyway so we don't need\n          // to do so explicitly here.\n        } else if (TryConsume('x') || TryConsume('X')) {\n          if (!TryConsumeOne<HexDigit>()) {\n            AddError(\"Expected hex digits for escape sequence.\");\n          }\n          // Possibly followed by another hex digit, but again we don't care.\n        } else {\n          AddError(\"Invalid escape sequence in string literal.\");\n        }\n        break;\n      }\n\n      default: {\n        if (current_char_ == delimiter) {\n          NextChar();\n          return;\n        }\n        NextChar();\n        break;\n      }\n    }\n  }\n}\n\nTokenizer::TokenType Tokenizer::ConsumeNumber(bool started_with_zero,\n                                              bool started_with_dot) {\n  bool is_float = false;\n\n  if (started_with_zero && (TryConsume('x') || TryConsume('X'))) {\n    // A hex number (started with \"0x\").\n    ConsumeOneOrMore<HexDigit>(\"\\\"0x\\\" must be followed by hex digits.\");\n\n  } else if (started_with_zero && LookingAt<Digit>()) {\n    // An octal number (had a leading zero).\n    ConsumeZeroOrMore<OctalDigit>();\n    if (LookingAt<Digit>()) {\n      AddError(\"Numbers starting with leading zero must be in octal.\");\n      ConsumeZeroOrMore<Digit>();\n    }\n\n  } else {\n    // A decimal number.\n    if (started_with_dot) {\n      is_float = true;\n      ConsumeZeroOrMore<Digit>();\n    } else {\n      ConsumeZeroOrMore<Digit>();\n\n      if (TryConsume('.')) {\n        is_float = true;\n        ConsumeZeroOrMore<Digit>();\n      }\n    }\n\n    if (TryConsume('e') || TryConsume('E')) {\n      is_float = true;\n      TryConsume('-') || TryConsume('+');\n      ConsumeOneOrMore<Digit>(\"\\\"e\\\" must be followed by exponent.\");\n    }\n\n    if (allow_f_after_float_ && (TryConsume('f') || TryConsume('F'))) {\n      is_float = true;\n    }\n  }\n\n  if (LookingAt<Letter>()) {\n    AddError(\"Need space between number and identifier.\");\n  } else if (current_char_ == '.') {\n    if (is_float) {\n      AddError(\n        \"Already saw decimal point or exponent; can't have another one.\");\n    } else {\n      AddError(\"Hex and octal numbers must be integers.\");\n    }\n  }\n\n  return is_float ? TYPE_FLOAT : TYPE_INTEGER;\n}\n\nvoid Tokenizer::ConsumeLineComment() {\n  while (current_char_ != '\\0' && current_char_ != '\\n') {\n    NextChar();\n  }\n  TryConsume('\\n');\n}\n\nvoid Tokenizer::ConsumeBlockComment() {\n  int start_line = line_;\n  int start_column = column_ - 2;\n\n  while (true) {\n    while (current_char_ != '\\0' &&\n           current_char_ != '*' &&\n           current_char_ != '/') {\n      NextChar();\n    }\n\n    if (TryConsume('*') && TryConsume('/')) {\n      // End of comment.\n      break;\n    } else if (TryConsume('/') && current_char_ == '*') {\n      // Note:  We didn't consume the '*' because if there is a '/' after it\n      //   we want to interpret that as the end of the comment.\n      AddError(\n        \"\\\"/*\\\" inside block comment.  Block comments cannot be nested.\");\n    } else if (current_char_ == '\\0') {\n      AddError(\"End-of-file inside block comment.\");\n      error_collector_->AddError(\n        start_line, start_column, \"  Comment started here.\");\n      break;\n    }\n  }\n}\n\n// -------------------------------------------------------------------\n\nbool Tokenizer::Next() {\n  previous_ = current_;\n\n  // Did we skip any characters after the last token?\n  bool skipped_stuff = false;\n\n  while (!read_error_) {\n    if (TryConsumeOne<Whitespace>()) {\n      ConsumeZeroOrMore<Whitespace>();\n\n    } else if (comment_style_ == CPP_COMMENT_STYLE && TryConsume('/')) {\n      // Starting a comment?\n      if (TryConsume('/')) {\n        ConsumeLineComment();\n      } else if (TryConsume('*')) {\n        ConsumeBlockComment();\n      } else {\n        // Oops, it was just a slash.  Return it.\n        current_.type = TYPE_SYMBOL;\n        current_.text = \"/\";\n        current_.line = line_;\n        current_.column = column_ - 1;\n        return true;\n      }\n\n    } else if (comment_style_ == SH_COMMENT_STYLE && TryConsume('#')) {\n      ConsumeLineComment();\n\n    } else if (LookingAt<Unprintable>() || current_char_ == '\\0') {\n      AddError(\"Invalid control characters encountered in text.\");\n      NextChar();\n      // Skip more unprintable characters, too.  But, remember that '\\0' is\n      // also what current_char_ is set to after EOF / read error.  We have\n      // to be careful not to go into an infinite loop of trying to consume\n      // it, so make sure to check read_error_ explicitly before consuming\n      // '\\0'.\n      while (TryConsumeOne<Unprintable>() ||\n             (!read_error_ && TryConsume('\\0'))) {\n        // Ignore.\n      }\n\n    } else {\n      // Reading some sort of token.\n      StartToken();\n\n      if (TryConsumeOne<Letter>()) {\n        ConsumeZeroOrMore<Alphanumeric>();\n        current_.type = TYPE_IDENTIFIER;\n      } else if (TryConsume('0')) {\n        current_.type = ConsumeNumber(true, false);\n      } else if (TryConsume('.')) {\n        // This could be the beginning of a floating-point number, or it could\n        // just be a '.' symbol.\n\n        if (TryConsumeOne<Digit>()) {\n          // It's a floating-point number.\n          if (previous_.type == TYPE_IDENTIFIER && !skipped_stuff) {\n            // We don't accept syntax like \"blah.123\".\n            error_collector_->AddError(line_, column_ - 2,\n              \"Need space between identifier and decimal point.\");\n          }\n          current_.type = ConsumeNumber(false, true);\n        } else {\n          current_.type = TYPE_SYMBOL;\n        }\n      } else if (TryConsumeOne<Digit>()) {\n        current_.type = ConsumeNumber(false, false);\n      } else if (TryConsume('\\\"')) {\n        ConsumeString('\\\"');\n        current_.type = TYPE_STRING;\n      } else if (TryConsume('\\'')) {\n        ConsumeString('\\'');\n        current_.type = TYPE_STRING;\n      } else {\n        NextChar();\n        current_.type = TYPE_SYMBOL;\n      }\n\n      EndToken();\n      return true;\n    }\n\n    skipped_stuff = true;\n  }\n\n  // EOF\n  current_.type = TYPE_END;\n  current_.text.clear();\n  current_.line = line_;\n  current_.column = column_;\n  current_.end_column = column_;\n  return false;\n}\n\n// -------------------------------------------------------------------\n// Token-parsing helpers.  Remember that these don't need to report\n// errors since any errors should already have been reported while\n// tokenizing.  Also, these can assume that whatever text they\n// are given is text that the tokenizer actually parsed as a token\n// of the given type.\n\nbool Tokenizer::ParseInteger(const string& text, uint64 max_value,\n                             uint64* output) {\n  // Sadly, we can't just use strtoul() since it is only 32-bit and strtoull()\n  // is non-standard.  I hate the C standard library.  :(\n\n//  return strtoull(text.c_str(), NULL, 0);\n\n  const char* ptr = text.c_str();\n  int base = 10;\n  if (ptr[0] == '0') {\n    if (ptr[1] == 'x' || ptr[1] == 'X') {\n      // This is hex.\n      base = 16;\n      ptr += 2;\n    } else {\n      // This is octal.\n      base = 8;\n    }\n  }\n\n  uint64 result = 0;\n  for (; *ptr != '\\0'; ptr++) {\n    int digit = DigitValue(*ptr);\n    GOOGLE_LOG_IF(DFATAL, digit < 0 || digit >= base)\n      << \" Tokenizer::ParseInteger() passed text that could not have been\"\n         \" tokenized as an integer: \" << CEscape(text);\n    if (digit > max_value || result > (max_value - digit) / base) {\n      // Overflow.\n      return false;\n    }\n    result = result * base + digit;\n  }\n\n  *output = result;\n  return true;\n}\n\ndouble Tokenizer::ParseFloat(const string& text) {\n  const char* start = text.c_str();\n  char* end;\n  double result = NoLocaleStrtod(start, &end);\n\n  // \"1e\" is not a valid float, but if the tokenizer reads it, it will\n  // report an error but still return it as a valid token.  We need to\n  // accept anything the tokenizer could possibly return, error or not.\n  if (*end == 'e' || *end == 'E') {\n    ++end;\n    if (*end == '-' || *end == '+') ++end;\n  }\n\n  // If the Tokenizer had allow_f_after_float_ enabled, the float may be\n  // suffixed with the letter 'f'.\n  if (*end == 'f' || *end == 'F') {\n    ++end;\n  }\n\n  GOOGLE_LOG_IF(DFATAL, end - start != text.size() || *start == '-')\n    << \" Tokenizer::ParseFloat() passed text that could not have been\"\n       \" tokenized as a float: \" << CEscape(text);\n  return result;\n}\n\nvoid Tokenizer::ParseStringAppend(const string& text, string* output) {\n  // Reminder:  text[0] is always the quote character.  (If text is\n  //   empty, it's invalid, so we'll just return.)\n  if (text.empty()) {\n    GOOGLE_LOG(DFATAL)\n      << \" Tokenizer::ParseStringAppend() passed text that could not\"\n         \" have been tokenized as a string: \" << CEscape(text);\n    return;\n  }\n\n  output->reserve(output->size() + text.size());\n\n  // Loop through the string copying characters to \"output\" and\n  // interpreting escape sequences.  Note that any invalid escape\n  // sequences or other errors were already reported while tokenizing.\n  // In this case we do not need to produce valid results.\n  for (const char* ptr = text.c_str() + 1; *ptr != '\\0'; ptr++) {\n    if (*ptr == '\\\\' && ptr[1] != '\\0') {\n      // An escape sequence.\n      ++ptr;\n\n      if (OctalDigit::InClass(*ptr)) {\n        // An octal escape.  May one, two, or three digits.\n        int code = DigitValue(*ptr);\n        if (OctalDigit::InClass(ptr[1])) {\n          ++ptr;\n          code = code * 8 + DigitValue(*ptr);\n        }\n        if (OctalDigit::InClass(ptr[1])) {\n          ++ptr;\n          code = code * 8 + DigitValue(*ptr);\n        }\n        output->push_back(static_cast<char>(code));\n\n      } else if (*ptr == 'x') {\n        // A hex escape.  May zero, one, or two digits.  (The zero case\n        // will have been caught as an error earlier.)\n        int code = 0;\n        if (HexDigit::InClass(ptr[1])) {\n          ++ptr;\n          code = DigitValue(*ptr);\n        }\n        if (HexDigit::InClass(ptr[1])) {\n          ++ptr;\n          code = code * 16 + DigitValue(*ptr);\n        }\n        output->push_back(static_cast<char>(code));\n\n      } else {\n        // Some other escape code.\n        output->push_back(TranslateEscape(*ptr));\n      }\n\n    } else if (*ptr == text[0]) {\n      // Ignore quote matching the starting quote.\n    } else {\n      output->push_back(*ptr);\n    }\n  }\n\n  return;\n}\n\n}  // namespace io\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Class for parsing tokenized text from a ZeroCopyInputStream.\n\n#ifndef GOOGLE_PROTOBUF_IO_TOKENIZER_H__\n#define GOOGLE_PROTOBUF_IO_TOKENIZER_H__\n\n#include <string>\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\n\nclass ZeroCopyInputStream;     // zero_copy_stream.h\n\n// Defined in this file.\nclass ErrorCollector;\nclass Tokenizer;\n\n// Abstract interface for an object which collects the errors that occur\n// during parsing.  A typical implementation might simply print the errors\n// to stdout.\nclass LIBPROTOBUF_EXPORT ErrorCollector {\n public:\n  inline ErrorCollector() {}\n  virtual ~ErrorCollector();\n\n  // Indicates that there was an error in the input at the given line and\n  // column numbers.  The numbers are zero-based, so you may want to add\n  // 1 to each before printing them.\n  virtual void AddError(int line, int column, const string& message) = 0;\n\n  // Indicates that there was a warning in the input at the given line and\n  // column numbers.  The numbers are zero-based, so you may want to add\n  // 1 to each before printing them.\n  virtual void AddWarning(int line, int column, const string& message) { }\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector);\n};\n\n// This class converts a stream of raw text into a stream of tokens for\n// the protocol definition parser to parse.  The tokens recognized are\n// similar to those that make up the C language; see the TokenType enum for\n// precise descriptions.  Whitespace and comments are skipped.  By default,\n// C- and C++-style comments are recognized, but other styles can be used by\n// calling set_comment_style().\nclass LIBPROTOBUF_EXPORT Tokenizer {\n public:\n  // Construct a Tokenizer that reads and tokenizes text from the given\n  // input stream and writes errors to the given error_collector.\n  // The caller keeps ownership of input and error_collector.\n  Tokenizer(ZeroCopyInputStream* input, ErrorCollector* error_collector);\n  ~Tokenizer();\n\n  enum TokenType {\n    TYPE_START,       // Next() has not yet been called.\n    TYPE_END,         // End of input reached.  \"text\" is empty.\n\n    TYPE_IDENTIFIER,  // A sequence of letters, digits, and underscores, not\n                      // starting with a digit.  It is an error for a number\n                      // to be followed by an identifier with no space in\n                      // between.\n    TYPE_INTEGER,     // A sequence of digits representing an integer.  Normally\n                      // the digits are decimal, but a prefix of \"0x\" indicates\n                      // a hex number and a leading zero indicates octal, just\n                      // like with C numeric literals.  A leading negative sign\n                      // is NOT included in the token; it's up to the parser to\n                      // interpret the unary minus operator on its own.\n    TYPE_FLOAT,       // A floating point literal, with a fractional part and/or\n                      // an exponent.  Always in decimal.  Again, never\n                      // negative.\n    TYPE_STRING,      // A quoted sequence of escaped characters.  Either single\n                      // or double quotes can be used, but they must match.\n                      // A string literal cannot cross a line break.\n    TYPE_SYMBOL,      // Any other printable character, like '!' or '+'.\n                      // Symbols are always a single character, so \"!+$%\" is\n                      // four tokens.\n  };\n\n  // Structure representing a token read from the token stream.\n  struct Token {\n    TokenType type;\n    string text;       // The exact text of the token as it appeared in\n                       // the input.  e.g. tokens of TYPE_STRING will still\n                       // be escaped and in quotes.\n\n    // \"line\" and \"column\" specify the position of the first character of\n    // the token within the input stream.  They are zero-based.\n    int line;\n    int column;\n    int end_column;\n  };\n\n  // Get the current token.  This is updated when Next() is called.  Before\n  // the first call to Next(), current() has type TYPE_START and no contents.\n  const Token& current();\n\n  // Return the previous token -- i.e. what current() returned before the\n  // previous call to Next().\n  const Token& previous();\n\n  // Advance to the next token.  Returns false if the end of the input is\n  // reached.\n  bool Next();\n\n  // Parse helpers ---------------------------------------------------\n\n  // Parses a TYPE_FLOAT token.  This never fails, so long as the text actually\n  // comes from a TYPE_FLOAT token parsed by Tokenizer.  If it doesn't, the\n  // result is undefined (possibly an assert failure).\n  static double ParseFloat(const string& text);\n\n  // Parses a TYPE_STRING token.  This never fails, so long as the text actually\n  // comes from a TYPE_STRING token parsed by Tokenizer.  If it doesn't, the\n  // result is undefined (possibly an assert failure).\n  static void ParseString(const string& text, string* output);\n\n  // Identical to ParseString, but appends to output.\n  static void ParseStringAppend(const string& text, string* output);\n\n  // Parses a TYPE_INTEGER token.  Returns false if the result would be\n  // greater than max_value.  Otherwise, returns true and sets *output to the\n  // result.  If the text is not from a Token of type TYPE_INTEGER originally\n  // parsed by a Tokenizer, the result is undefined (possibly an assert\n  // failure).\n  static bool ParseInteger(const string& text, uint64 max_value,\n                           uint64* output);\n\n  // Options ---------------------------------------------------------\n\n  // Set true to allow floats to be suffixed with the letter 'f'.  Tokens\n  // which would otherwise be integers but which have the 'f' suffix will be\n  // forced to be interpreted as floats.  For all other purposes, the 'f' is\n  // ignored.\n  void set_allow_f_after_float(bool value) { allow_f_after_float_ = value; }\n\n  // Valid values for set_comment_style().\n  enum CommentStyle {\n    // Line comments begin with \"//\", block comments are delimited by \"/*\" and\n    // \"*/\".\n    CPP_COMMENT_STYLE,\n    // Line comments begin with \"#\".  No way to write block comments.\n    SH_COMMENT_STYLE\n  };\n\n  // Sets the comment style.\n  void set_comment_style(CommentStyle style) { comment_style_ = style; }\n\n  // -----------------------------------------------------------------\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Tokenizer);\n\n  Token current_;           // Returned by current().\n  Token previous_;          // Returned by previous().\n\n  ZeroCopyInputStream* input_;\n  ErrorCollector* error_collector_;\n\n  char current_char_;       // == buffer_[buffer_pos_], updated by NextChar().\n  const char* buffer_;      // Current buffer returned from input_.\n  int buffer_size_;         // Size of buffer_.\n  int buffer_pos_;          // Current position within the buffer.\n  bool read_error_;         // Did we previously encounter a read error?\n\n  // Line and column number of current_char_ within the whole input stream.\n  int line_;\n  int column_;\n\n  // Position in buffer_ where StartToken() was called.  If the token\n  // started in the previous buffer, this is zero, and current_.text already\n  // contains the part of the token from the previous buffer.  If not\n  // currently parsing a token, this is -1.\n  int token_start_;\n\n  // Options.\n  bool allow_f_after_float_;\n  CommentStyle comment_style_;\n\n  // Since we count columns we need to interpret tabs somehow.  We'll take\n  // the standard 8-character definition for lack of any way to do better.\n  static const int kTabWidth = 8;\n\n  // -----------------------------------------------------------------\n  // Helper methods.\n\n  // Consume this character and advance to the next one.\n  void NextChar();\n\n  // Read a new buffer from the input.\n  void Refresh();\n\n  // Called when the current character is the first character of a new\n  // token (not including whitespace or comments).\n  inline void StartToken();\n  // Called when the current character is the first character after the\n  // end of the last token.  After this returns, current_.text will\n  // contain all text consumed since StartToken() was called.\n  inline void EndToken();\n\n  // Convenience method to add an error at the current line and column.\n  void AddError(const string& message) {\n    error_collector_->AddError(line_, column_, message);\n  }\n\n  // -----------------------------------------------------------------\n  // The following four methods are used to consume tokens of specific\n  // types.  They are actually used to consume all characters *after*\n  // the first, since the calling function consumes the first character\n  // in order to decide what kind of token is being read.\n\n  // Read and consume a string, ending when the given delimiter is\n  // consumed.\n  void ConsumeString(char delimiter);\n\n  // Read and consume a number, returning TYPE_FLOAT or TYPE_INTEGER\n  // depending on what was read.  This needs to know if the first\n  // character was a zero in order to correctly recognize hex and octal\n  // numbers.\n  // It also needs to know if the first characted was a . to parse floating\n  // point correctly.\n  TokenType ConsumeNumber(bool started_with_zero, bool started_with_dot);\n\n  // Consume the rest of a line.\n  void ConsumeLineComment();\n  // Consume until \"*/\".\n  void ConsumeBlockComment();\n\n  // -----------------------------------------------------------------\n  // These helper methods make the parsing code more readable.  The\n  // \"character classes\" refered to are defined at the top of the .cc file.\n  // Basically it is a C++ class with one method:\n  //   static bool InClass(char c);\n  // The method returns true if c is a member of this \"class\", like \"Letter\"\n  // or \"Digit\".\n\n  // Returns true if the current character is of the given character\n  // class, but does not consume anything.\n  template<typename CharacterClass>\n  inline bool LookingAt();\n\n  // If the current character is in the given class, consume it and return\n  // true.  Otherwise return false.\n  // e.g. TryConsumeOne<Letter>()\n  template<typename CharacterClass>\n  inline bool TryConsumeOne();\n\n  // Like above, but try to consume the specific character indicated.\n  inline bool TryConsume(char c);\n\n  // Consume zero or more of the given character class.\n  template<typename CharacterClass>\n  inline void ConsumeZeroOrMore();\n\n  // Consume one or more of the given character class or log the given\n  // error message.\n  // e.g. ConsumeOneOrMore<Digit>(\"Expected digits.\");\n  template<typename CharacterClass>\n  inline void ConsumeOneOrMore(const char* error);\n};\n\n// inline methods ====================================================\ninline const Tokenizer::Token& Tokenizer::current() {\n  return current_;\n}\n\ninline const Tokenizer::Token& Tokenizer::previous() {\n  return previous_;\n}\n\ninline void Tokenizer::ParseString(const string& text, string* output) {\n  output->clear();\n  ParseStringAppend(text, output);\n}\n\n}  // namespace io\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_IO_TOKENIZER_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <vector>\n#include <math.h>\n#include <limits.h>\n\n#include <google/protobuf/io/tokenizer.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\nnamespace {\n\n// ===================================================================\n// Data-Driven Test Infrastructure\n\n// TODO(kenton):  This is copied from coded_stream_unittest.  This is\n//   temporary until these fetaures are integrated into gTest itself.\n\n// TEST_1D and TEST_2D are macros I'd eventually like to see added to\n// gTest.  These macros can be used to declare tests which should be\n// run multiple times, once for each item in some input array.  TEST_1D\n// tests all cases in a single input array.  TEST_2D tests all\n// combinations of cases from two arrays.  The arrays must be statically\n// defined such that the GOOGLE_ARRAYSIZE() macro works on them.  Example:\n//\n// int kCases[] = {1, 2, 3, 4}\n// TEST_1D(MyFixture, MyTest, kCases) {\n//   EXPECT_GT(kCases_case, 0);\n// }\n//\n// This test iterates through the numbers 1, 2, 3, and 4 and tests that\n// they are all grater than zero.  In case of failure, the exact case\n// which failed will be printed.  The case type must be printable using\n// ostream::operator<<.\n\n#define TEST_1D(FIXTURE, NAME, CASES)                                      \\\n  class FIXTURE##_##NAME##_DD : public FIXTURE {                           \\\n   protected:                                                              \\\n    template <typename CaseType>                                           \\\n    void DoSingleCase(const CaseType& CASES##_case);                       \\\n  };                                                                       \\\n                                                                           \\\n  TEST_F(FIXTURE##_##NAME##_DD, NAME) {                                    \\\n    for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES); i++) {                           \\\n      SCOPED_TRACE(testing::Message()                                      \\\n        << #CASES \" case #\" << i << \": \" << CASES[i]);                     \\\n      DoSingleCase(CASES[i]);                                              \\\n    }                                                                      \\\n  }                                                                        \\\n                                                                           \\\n  template <typename CaseType>                                             \\\n  void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType& CASES##_case)\n\n#define TEST_2D(FIXTURE, NAME, CASES1, CASES2)                             \\\n  class FIXTURE##_##NAME##_DD : public FIXTURE {                           \\\n   protected:                                                              \\\n    template <typename CaseType1, typename CaseType2>                      \\\n    void DoSingleCase(const CaseType1& CASES1##_case,                      \\\n                      const CaseType2& CASES2##_case);                     \\\n  };                                                                       \\\n                                                                           \\\n  TEST_F(FIXTURE##_##NAME##_DD, NAME) {                                    \\\n    for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES1); i++) {                          \\\n      for (int j = 0; j < GOOGLE_ARRAYSIZE(CASES2); j++) {                        \\\n        SCOPED_TRACE(testing::Message()                                    \\\n          << #CASES1 \" case #\" << i << \": \" << CASES1[i] << \", \"           \\\n          << #CASES2 \" case #\" << j << \": \" << CASES2[j]);                 \\\n        DoSingleCase(CASES1[i], CASES2[j]);                                \\\n      }                                                                    \\\n    }                                                                      \\\n  }                                                                        \\\n                                                                           \\\n  template <typename CaseType1, typename CaseType2>                        \\\n  void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType1& CASES1##_case, \\\n                                           const CaseType2& CASES2##_case)\n\n// -------------------------------------------------------------------\n\n// An input stream that is basically like an ArrayInputStream but sometimes\n// returns empty buffers, just to throw us off.\nclass TestInputStream : public ZeroCopyInputStream {\n public:\n  TestInputStream(const void* data, int size, int block_size)\n    : array_stream_(data, size, block_size), counter_(0) {}\n  ~TestInputStream() {}\n\n  // implements ZeroCopyInputStream ----------------------------------\n  bool Next(const void** data, int* size) {\n    // We'll return empty buffers starting with the first buffer, and every\n    // 3 and 5 buffers after that.\n    if (counter_ % 3 == 0 || counter_ % 5 == 0) {\n      *data = NULL;\n      *size = 0;\n      ++counter_;\n      return true;\n    } else {\n      ++counter_;\n      return array_stream_.Next(data, size);\n    }\n  }\n\n  void BackUp(int count)  { return array_stream_.BackUp(count); }\n  bool Skip(int count)    { return array_stream_.Skip(count);   }\n  int64 ByteCount() const { return array_stream_.ByteCount();   }\n\n private:\n  ArrayInputStream array_stream_;\n  int counter_;\n};\n\n// -------------------------------------------------------------------\n\n// An error collector which simply concatenates all its errors into a big\n// block of text which can be checked.\nclass TestErrorCollector : public ErrorCollector {\n public:\n  TestErrorCollector() {}\n  ~TestErrorCollector() {}\n\n  string text_;\n\n  // implements ErrorCollector ---------------------------------------\n  void AddError(int line, int column, const string& message) {\n    strings::SubstituteAndAppend(&text_, \"$0:$1: $2\\n\",\n                                 line, column, message);\n  }\n};\n\n// -------------------------------------------------------------------\n\n// We test each operation over a variety of block sizes to insure that\n// we test cases where reads cross buffer boundaries as well as cases\n// where they don't.  This is sort of a brute-force approach to this,\n// but it's easy to write and easy to understand.\nconst int kBlockSizes[] = {1, 2, 3, 5, 7, 13, 32, 1024};\n\nclass TokenizerTest : public testing::Test {\n protected:\n  // For easy testing.\n  uint64 ParseInteger(const string& text) {\n    uint64 result;\n    EXPECT_TRUE(Tokenizer::ParseInteger(text, kuint64max, &result));\n    return result;\n  }\n};\n\n// ===================================================================\n\n// These tests causes gcc 3.3.5 (and earlier?) to give the cryptic error:\n//   \"sorry, unimplemented: `method_call_expr' not supported by dump_expr\"\n#if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)\n\n// In each test case, the entire input text should parse as a single token\n// of the given type.\nstruct SimpleTokenCase {\n  string input;\n  Tokenizer::TokenType type;\n};\n\ninline ostream& operator<<(ostream& out,\n                           const SimpleTokenCase& test_case) {\n  return out << CEscape(test_case.input);\n}\n\nSimpleTokenCase kSimpleTokenCases[] = {\n  // Test identifiers.\n  { \"hello\",       Tokenizer::TYPE_IDENTIFIER },\n\n  // Test integers.\n  { \"123\",         Tokenizer::TYPE_INTEGER },\n  { \"0xab6\",       Tokenizer::TYPE_INTEGER },\n  { \"0XAB6\",       Tokenizer::TYPE_INTEGER },\n  { \"0X1234567\",   Tokenizer::TYPE_INTEGER },\n  { \"0x89abcdef\",  Tokenizer::TYPE_INTEGER },\n  { \"0x89ABCDEF\",  Tokenizer::TYPE_INTEGER },\n  { \"01234567\",    Tokenizer::TYPE_INTEGER },\n\n  // Test floats.\n  { \"123.45\",      Tokenizer::TYPE_FLOAT },\n  { \"1.\",          Tokenizer::TYPE_FLOAT },\n  { \"1e3\",         Tokenizer::TYPE_FLOAT },\n  { \"1E3\",         Tokenizer::TYPE_FLOAT },\n  { \"1e-3\",        Tokenizer::TYPE_FLOAT },\n  { \"1e+3\",        Tokenizer::TYPE_FLOAT },\n  { \"1.e3\",        Tokenizer::TYPE_FLOAT },\n  { \"1.2e3\",       Tokenizer::TYPE_FLOAT },\n  { \".1\",          Tokenizer::TYPE_FLOAT },\n  { \".1e3\",        Tokenizer::TYPE_FLOAT },\n  { \".1e-3\",       Tokenizer::TYPE_FLOAT },\n  { \".1e+3\",       Tokenizer::TYPE_FLOAT },\n\n  // Test strings.\n  { \"'hello'\",     Tokenizer::TYPE_STRING },\n  { \"\\\"foo\\\"\",     Tokenizer::TYPE_STRING },\n  { \"'a\\\"b'\",      Tokenizer::TYPE_STRING },\n  { \"\\\"a'b\\\"\",     Tokenizer::TYPE_STRING },\n  { \"'a\\\\'b'\",     Tokenizer::TYPE_STRING },\n  { \"\\\"a\\\\\\\"b\\\"\",  Tokenizer::TYPE_STRING },\n  { \"'\\\\xf'\",      Tokenizer::TYPE_STRING },\n  { \"'\\\\0'\",       Tokenizer::TYPE_STRING },\n\n  // Test symbols.\n  { \"+\",           Tokenizer::TYPE_SYMBOL },\n  { \".\",           Tokenizer::TYPE_SYMBOL },\n};\n\nTEST_2D(TokenizerTest, SimpleTokens, kSimpleTokenCases, kBlockSizes) {\n  // Set up the tokenizer.\n  TestInputStream input(kSimpleTokenCases_case.input.data(),\n                        kSimpleTokenCases_case.input.size(),\n                        kBlockSizes_case);\n  TestErrorCollector error_collector;\n  Tokenizer tokenizer(&input, &error_collector);\n\n  // Before Next() is called, the initial token should always be TYPE_START.\n  EXPECT_EQ(Tokenizer::TYPE_START, tokenizer.current().type);\n  EXPECT_EQ(\"\", tokenizer.current().text);\n  EXPECT_EQ(0, tokenizer.current().line);\n  EXPECT_EQ(0, tokenizer.current().column);\n  EXPECT_EQ(0, tokenizer.current().end_column);\n\n  // Parse the token.\n  ASSERT_TRUE(tokenizer.Next());\n\n  // Check that it has the right type.\n  EXPECT_EQ(kSimpleTokenCases_case.type, tokenizer.current().type);\n  // Check that it contains the complete input text.\n  EXPECT_EQ(kSimpleTokenCases_case.input, tokenizer.current().text);\n  // Check that it is located at the beginning of the input\n  EXPECT_EQ(0, tokenizer.current().line);\n  EXPECT_EQ(0, tokenizer.current().column);\n  EXPECT_EQ(kSimpleTokenCases_case.input.size(),\n            tokenizer.current().end_column);\n\n  // There should be no more input.\n  EXPECT_FALSE(tokenizer.Next());\n\n  // After Next() returns false, the token should have type TYPE_END.\n  EXPECT_EQ(Tokenizer::TYPE_END, tokenizer.current().type);\n  EXPECT_EQ(\"\", tokenizer.current().text);\n  EXPECT_EQ(0, tokenizer.current().line);\n  EXPECT_EQ(kSimpleTokenCases_case.input.size(), tokenizer.current().column);\n  EXPECT_EQ(kSimpleTokenCases_case.input.size(),\n            tokenizer.current().end_column);\n\n  // There should be no errors.\n  EXPECT_TRUE(error_collector.text_.empty());\n}\n\nTEST_1D(TokenizerTest, FloatSuffix, kBlockSizes) {\n  // Test the \"allow_f_after_float\" option.\n\n  // Set up the tokenizer.\n  const char* text = \"1f 2.5f 6e3f 7F\";\n  TestInputStream input(text, strlen(text), kBlockSizes_case);\n  TestErrorCollector error_collector;\n  Tokenizer tokenizer(&input, &error_collector);\n  tokenizer.set_allow_f_after_float(true);\n\n  // Advance through tokens and check that they are parsed as expected.\n  ASSERT_TRUE(tokenizer.Next());\n  EXPECT_EQ(tokenizer.current().text, \"1f\");\n  EXPECT_EQ(tokenizer.current().type, Tokenizer::TYPE_FLOAT);\n  ASSERT_TRUE(tokenizer.Next());\n  EXPECT_EQ(tokenizer.current().text, \"2.5f\");\n  EXPECT_EQ(tokenizer.current().type, Tokenizer::TYPE_FLOAT);\n  ASSERT_TRUE(tokenizer.Next());\n  EXPECT_EQ(tokenizer.current().text, \"6e3f\");\n  EXPECT_EQ(tokenizer.current().type, Tokenizer::TYPE_FLOAT);\n  ASSERT_TRUE(tokenizer.Next());\n  EXPECT_EQ(tokenizer.current().text, \"7F\");\n  EXPECT_EQ(tokenizer.current().type, Tokenizer::TYPE_FLOAT);\n\n  // There should be no more input.\n  EXPECT_FALSE(tokenizer.Next());\n  // There should be no errors.\n  EXPECT_TRUE(error_collector.text_.empty());\n}\n\n#endif\n\n// -------------------------------------------------------------------\n\n// In each case, the input is parsed to produce a list of tokens.  The\n// last token in \"output\" must have type TYPE_END.\nstruct MultiTokenCase {\n  string input;\n  Tokenizer::Token output[10];  // The compiler wants a constant array\n                                // size for initialization to work.  There\n                                // is no reason this can't be increased if\n                                // needed.\n};\n\ninline ostream& operator<<(ostream& out,\n                           const MultiTokenCase& test_case) {\n  return out << CEscape(test_case.input);\n}\n\nMultiTokenCase kMultiTokenCases[] = {\n  // Test empty input.\n  { \"\", {\n    { Tokenizer::TYPE_END       , \"\"     , 0,  0 },\n  }},\n\n  // Test all token types at the same time.\n  { \"foo 1 1.2 + 'bar'\", {\n    { Tokenizer::TYPE_IDENTIFIER, \"foo\"  , 0,  0,  3 },\n    { Tokenizer::TYPE_INTEGER   , \"1\"    , 0,  4,  5 },\n    { Tokenizer::TYPE_FLOAT     , \"1.2\"  , 0,  6,  9 },\n    { Tokenizer::TYPE_SYMBOL    , \"+\"    , 0, 10, 11 },\n    { Tokenizer::TYPE_STRING    , \"'bar'\", 0, 12, 17 },\n    { Tokenizer::TYPE_END       , \"\"     , 0, 17, 17 },\n  }},\n\n  // Test that consecutive symbols are parsed as separate tokens.\n  { \"!@+%\", {\n    { Tokenizer::TYPE_SYMBOL    , \"!\"    , 0, 0, 1 },\n    { Tokenizer::TYPE_SYMBOL    , \"@\"    , 0, 1, 2 },\n    { Tokenizer::TYPE_SYMBOL    , \"+\"    , 0, 2, 3 },\n    { Tokenizer::TYPE_SYMBOL    , \"%\"    , 0, 3, 4 },\n    { Tokenizer::TYPE_END       , \"\"     , 0, 4, 4 },\n  }},\n\n  // Test that newlines affect line numbers correctly.\n  { \"foo bar\\nrab oof\", {\n    { Tokenizer::TYPE_IDENTIFIER, \"foo\", 0,  0, 3 },\n    { Tokenizer::TYPE_IDENTIFIER, \"bar\", 0,  4, 7 },\n    { Tokenizer::TYPE_IDENTIFIER, \"rab\", 1,  0, 3 },\n    { Tokenizer::TYPE_IDENTIFIER, \"oof\", 1,  4, 7 },\n    { Tokenizer::TYPE_END       , \"\"   , 1,  7, 7 },\n  }},\n\n  // Test that tabs affect column numbers correctly.\n  { \"foo\\tbar  \\tbaz\", {\n    { Tokenizer::TYPE_IDENTIFIER, \"foo\", 0,  0,  3 },\n    { Tokenizer::TYPE_IDENTIFIER, \"bar\", 0,  8, 11 },\n    { Tokenizer::TYPE_IDENTIFIER, \"baz\", 0, 16, 19 },\n    { Tokenizer::TYPE_END       , \"\"   , 0, 19, 19 },\n  }},\n\n  // Test that tabs in string literals affect column numbers correctly.\n  { \"\\\"foo\\tbar\\\" baz\", {\n    { Tokenizer::TYPE_STRING    , \"\\\"foo\\tbar\\\"\", 0,  0, 12 },\n    { Tokenizer::TYPE_IDENTIFIER, \"baz\"         , 0, 13, 16 },\n    { Tokenizer::TYPE_END       , \"\"            , 0, 16, 16 },\n  }},\n\n  // Test that line comments are ignored.\n  { \"foo // This is a comment\\n\"\n    \"bar // This is another comment\", {\n    { Tokenizer::TYPE_IDENTIFIER, \"foo\", 0,  0,  3 },\n    { Tokenizer::TYPE_IDENTIFIER, \"bar\", 1,  0,  3 },\n    { Tokenizer::TYPE_END       , \"\"   , 1, 30, 30 },\n  }},\n\n  // Test that block comments are ignored.\n  { \"foo /* This is a block comment */ bar\", {\n    { Tokenizer::TYPE_IDENTIFIER, \"foo\", 0,  0,  3 },\n    { Tokenizer::TYPE_IDENTIFIER, \"bar\", 0, 34, 37 },\n    { Tokenizer::TYPE_END       , \"\"   , 0, 37, 37 },\n  }},\n\n  // Test that sh-style comments are not ignored by default.\n  { \"foo # bar\\n\"\n    \"baz\", {\n    { Tokenizer::TYPE_IDENTIFIER, \"foo\", 0, 0, 3 },\n    { Tokenizer::TYPE_SYMBOL    , \"#\"  , 0, 4, 5 },\n    { Tokenizer::TYPE_IDENTIFIER, \"bar\", 0, 6, 9 },\n    { Tokenizer::TYPE_IDENTIFIER, \"baz\", 1, 0, 3 },\n    { Tokenizer::TYPE_END       , \"\"   , 1, 3, 3 },\n  }},\n\n  // Bytes with the high-order bit set should not be seen as control characters.\n  { \"\\300\", {\n    { Tokenizer::TYPE_SYMBOL, \"\\300\", 0, 0, 1 },\n    { Tokenizer::TYPE_END   , \"\"    , 0, 1, 1 },\n  }},\n\n  // Test all whitespace chars\n  { \"foo\\n\\t\\r\\v\\fbar\", {\n    { Tokenizer::TYPE_IDENTIFIER, \"foo\", 0,  0,  3 },\n    { Tokenizer::TYPE_IDENTIFIER, \"bar\", 1, 11, 14 },\n    { Tokenizer::TYPE_END       , \"\"   , 1, 14, 14 },\n  }},\n};\n\nTEST_2D(TokenizerTest, MultipleTokens, kMultiTokenCases, kBlockSizes) {\n  // Set up the tokenizer.\n  TestInputStream input(kMultiTokenCases_case.input.data(),\n                        kMultiTokenCases_case.input.size(),\n                        kBlockSizes_case);\n  TestErrorCollector error_collector;\n  Tokenizer tokenizer(&input, &error_collector);\n\n  // Before Next() is called, the initial token should always be TYPE_START.\n  EXPECT_EQ(Tokenizer::TYPE_START, tokenizer.current().type);\n  EXPECT_EQ(\"\", tokenizer.current().text);\n  EXPECT_EQ(0, tokenizer.current().line);\n  EXPECT_EQ(0, tokenizer.current().column);\n  EXPECT_EQ(0, tokenizer.current().end_column);\n\n  // Loop through all expected tokens.\n  int i = 0;\n  Tokenizer::Token token;\n  do {\n    token = kMultiTokenCases_case.output[i++];\n\n    SCOPED_TRACE(testing::Message() << \"Token #\" << i << \": \" << token.text);\n\n    Tokenizer::Token previous = tokenizer.current();\n\n    // Next() should only return false when it hits the end token.\n    if (token.type != Tokenizer::TYPE_END) {\n      ASSERT_TRUE(tokenizer.Next());\n    } else {\n      ASSERT_FALSE(tokenizer.Next());\n    }\n\n    // Check that the previous token is set correctly.\n    EXPECT_EQ(previous.type, tokenizer.previous().type);\n    EXPECT_EQ(previous.text, tokenizer.previous().text);\n    EXPECT_EQ(previous.line, tokenizer.previous().line);\n    EXPECT_EQ(previous.column, tokenizer.previous().column);\n    EXPECT_EQ(previous.end_column, tokenizer.previous().end_column);\n\n    // Check that the token matches the expected one.\n    EXPECT_EQ(token.type, tokenizer.current().type);\n    EXPECT_EQ(token.text, tokenizer.current().text);\n    EXPECT_EQ(token.line, tokenizer.current().line);\n    EXPECT_EQ(token.column, tokenizer.current().column);\n    EXPECT_EQ(token.end_column, tokenizer.current().end_column);\n\n  } while (token.type != Tokenizer::TYPE_END);\n\n  // There should be no errors.\n  EXPECT_TRUE(error_collector.text_.empty());\n}\n\n// This test causes gcc 3.3.5 (and earlier?) to give the cryptic error:\n//   \"sorry, unimplemented: `method_call_expr' not supported by dump_expr\"\n#if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)\n\nTEST_1D(TokenizerTest, ShCommentStyle, kBlockSizes) {\n  // Test the \"comment_style\" option.\n\n  const char* text = \"foo # bar\\n\"\n                     \"baz // qux\\n\"\n                     \"corge /* grault */\\n\"\n                     \"garply\";\n  const char* const kTokens[] = {\"foo\",  // \"# bar\" is ignored\n                                 \"baz\", \"/\", \"/\", \"qux\",\n                                 \"corge\", \"/\", \"*\", \"grault\", \"*\", \"/\",\n                                 \"garply\"};\n\n  // Set up the tokenizer.\n  TestInputStream input(text, strlen(text), kBlockSizes_case);\n  TestErrorCollector error_collector;\n  Tokenizer tokenizer(&input, &error_collector);\n  tokenizer.set_comment_style(Tokenizer::SH_COMMENT_STYLE);\n\n  // Advance through tokens and check that they are parsed as expected.\n  for (int i = 0; i < GOOGLE_ARRAYSIZE(kTokens); i++) {\n    EXPECT_TRUE(tokenizer.Next());\n    EXPECT_EQ(tokenizer.current().text, kTokens[i]);\n  }\n\n  // There should be no more input.\n  EXPECT_FALSE(tokenizer.Next());\n  // There should be no errors.\n  EXPECT_TRUE(error_collector.text_.empty());\n}\n\n#endif\n\n// -------------------------------------------------------------------\n\n// Test parse helpers.  It's not really worth setting up a full data-driven\n// test here.\nTEST_F(TokenizerTest, ParseInteger) {\n  EXPECT_EQ(0, ParseInteger(\"0\"));\n  EXPECT_EQ(123, ParseInteger(\"123\"));\n  EXPECT_EQ(0xabcdef12u, ParseInteger(\"0xabcdef12\"));\n  EXPECT_EQ(0xabcdef12u, ParseInteger(\"0xABCDEF12\"));\n  EXPECT_EQ(kuint64max, ParseInteger(\"0xFFFFFFFFFFFFFFFF\"));\n  EXPECT_EQ(01234567, ParseInteger(\"01234567\"));\n  EXPECT_EQ(0X123, ParseInteger(\"0X123\"));\n\n  // Test invalid integers that may still be tokenized as integers.\n  EXPECT_EQ(0, ParseInteger(\"0x\"));\n\n  uint64 i;\n#ifdef GTEST_HAS_DEATH_TEST  // death tests do not work on Windows yet\n  // Test invalid integers that will never be tokenized as integers.\n  EXPECT_DEBUG_DEATH(Tokenizer::ParseInteger(\"zxy\", kuint64max, &i),\n    \"passed text that could not have been tokenized as an integer\");\n  EXPECT_DEBUG_DEATH(Tokenizer::ParseInteger(\"1.2\", kuint64max, &i),\n    \"passed text that could not have been tokenized as an integer\");\n  EXPECT_DEBUG_DEATH(Tokenizer::ParseInteger(\"08\", kuint64max, &i),\n    \"passed text that could not have been tokenized as an integer\");\n  EXPECT_DEBUG_DEATH(Tokenizer::ParseInteger(\"0xg\", kuint64max, &i),\n    \"passed text that could not have been tokenized as an integer\");\n  EXPECT_DEBUG_DEATH(Tokenizer::ParseInteger(\"-1\", kuint64max, &i),\n    \"passed text that could not have been tokenized as an integer\");\n#endif  // GTEST_HAS_DEATH_TEST\n\n  // Test overflows.\n  EXPECT_TRUE (Tokenizer::ParseInteger(\"0\", 0, &i));\n  EXPECT_FALSE(Tokenizer::ParseInteger(\"1\", 0, &i));\n  EXPECT_TRUE (Tokenizer::ParseInteger(\"1\", 1, &i));\n  EXPECT_TRUE (Tokenizer::ParseInteger(\"12345\", 12345, &i));\n  EXPECT_FALSE(Tokenizer::ParseInteger(\"12346\", 12345, &i));\n  EXPECT_TRUE (Tokenizer::ParseInteger(\"0xFFFFFFFFFFFFFFFF\" , kuint64max, &i));\n  EXPECT_FALSE(Tokenizer::ParseInteger(\"0x10000000000000000\", kuint64max, &i));\n}\n\nTEST_F(TokenizerTest, ParseFloat) {\n  EXPECT_DOUBLE_EQ(1    , Tokenizer::ParseFloat(\"1.\"));\n  EXPECT_DOUBLE_EQ(1e3  , Tokenizer::ParseFloat(\"1e3\"));\n  EXPECT_DOUBLE_EQ(1e3  , Tokenizer::ParseFloat(\"1E3\"));\n  EXPECT_DOUBLE_EQ(1.5e3, Tokenizer::ParseFloat(\"1.5e3\"));\n  EXPECT_DOUBLE_EQ(.1   , Tokenizer::ParseFloat(\".1\"));\n  EXPECT_DOUBLE_EQ(.25  , Tokenizer::ParseFloat(\".25\"));\n  EXPECT_DOUBLE_EQ(.1e3 , Tokenizer::ParseFloat(\".1e3\"));\n  EXPECT_DOUBLE_EQ(.25e3, Tokenizer::ParseFloat(\".25e3\"));\n  EXPECT_DOUBLE_EQ(.1e+3, Tokenizer::ParseFloat(\".1e+3\"));\n  EXPECT_DOUBLE_EQ(.1e-3, Tokenizer::ParseFloat(\".1e-3\"));\n  EXPECT_DOUBLE_EQ(5    , Tokenizer::ParseFloat(\"5\"));\n  EXPECT_DOUBLE_EQ(6e-12, Tokenizer::ParseFloat(\"6e-12\"));\n  EXPECT_DOUBLE_EQ(1.2  , Tokenizer::ParseFloat(\"1.2\"));\n  EXPECT_DOUBLE_EQ(1.e2 , Tokenizer::ParseFloat(\"1.e2\"));\n\n  // Test invalid integers that may still be tokenized as integers.\n  EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat(\"1e\"));\n  EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat(\"1e-\"));\n  EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat(\"1.e\"));\n\n  // Test 'f' suffix.\n  EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat(\"1f\"));\n  EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat(\"1.0f\"));\n  EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat(\"1F\"));\n\n  // These should parse successfully even though they are out of range.\n  // Overflows become infinity and underflows become zero.\n  EXPECT_EQ(     0.0, Tokenizer::ParseFloat(\"1e-9999999999999999999999999999\"));\n  EXPECT_EQ(HUGE_VAL, Tokenizer::ParseFloat(\"1e+9999999999999999999999999999\"));\n\n#ifdef GTEST_HAS_DEATH_TEST  // death tests do not work on Windows yet\n  // Test invalid integers that will never be tokenized as integers.\n  EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat(\"zxy\"),\n    \"passed text that could not have been tokenized as a float\");\n  EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat(\"1-e0\"),\n    \"passed text that could not have been tokenized as a float\");\n  EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat(\"-1.0\"),\n    \"passed text that could not have been tokenized as a float\");\n#endif  // GTEST_HAS_DEATH_TEST\n}\n\nTEST_F(TokenizerTest, ParseString) {\n  string output;\n  Tokenizer::ParseString(\"'hello'\", &output);\n  EXPECT_EQ(\"hello\", output);\n  Tokenizer::ParseString(\"\\\"blah\\\\nblah2\\\"\", &output);\n  EXPECT_EQ(\"blah\\nblah2\", output);\n  Tokenizer::ParseString(\"'\\\\1x\\\\1\\\\123\\\\739\\\\52\\\\334n\\\\3'\", &output);\n  EXPECT_EQ(\"\\1x\\1\\123\\739\\52\\334n\\3\", output);\n  Tokenizer::ParseString(\"'\\\\x20\\\\x4'\", &output);\n  EXPECT_EQ(\"\\x20\\x4\", output);\n\n  // Test invalid strings that may still be tokenized as strings.\n  Tokenizer::ParseString(\"\\\"\\\\a\\\\l\\\\v\\\\t\", &output);  // \\l is invalid\n  EXPECT_EQ(\"\\a?\\v\\t\", output);\n  Tokenizer::ParseString(\"'\", &output);\n  EXPECT_EQ(\"\", output);\n  Tokenizer::ParseString(\"'\\\\\", &output);\n  EXPECT_EQ(\"\\\\\", output);\n\n  // Test invalid strings that will never be tokenized as strings.\n#ifdef GTEST_HAS_DEATH_TEST  // death tests do not work on Windows yet\n  EXPECT_DEBUG_DEATH(Tokenizer::ParseString(\"\", &output),\n    \"passed text that could not have been tokenized as a string\");\n#endif  // GTEST_HAS_DEATH_TEST\n}\n\nTEST_F(TokenizerTest, ParseStringAppend) {\n  // Check that ParseString and ParseStringAppend differ.\n  string output(\"stuff+\");\n  Tokenizer::ParseStringAppend(\"'hello'\", &output);\n  EXPECT_EQ(\"stuff+hello\", output);\n  Tokenizer::ParseString(\"'hello'\", &output);\n  EXPECT_EQ(\"hello\", output);\n}\n\n// -------------------------------------------------------------------\n\n// Each case parses some input text, ignoring the tokens produced, and\n// checks that the error output matches what is expected.\nstruct ErrorCase {\n  string input;\n  bool recoverable;  // True if the tokenizer should be able to recover and\n                     // parse more tokens after seeing this error.  Cases\n                     // for which this is true must end with \"foo\" as\n                     // the last token, which the test will check for.\n  const char* errors;\n};\n\ninline ostream& operator<<(ostream& out,\n                           const ErrorCase& test_case) {\n  return out << CEscape(test_case.input);\n}\n\nErrorCase kErrorCases[] = {\n  // String errors.\n  { \"'\\\\l' foo\", true,\n    \"0:2: Invalid escape sequence in string literal.\\n\" },\n  { \"'\\\\x' foo\", true,\n    \"0:3: Expected hex digits for escape sequence.\\n\" },\n  { \"'foo\", false,\n    \"0:4: String literals cannot cross line boundaries.\\n\" },\n  { \"'bar\\nfoo\", true,\n    \"0:4: String literals cannot cross line boundaries.\\n\" },\n\n  // Integer errors.\n  { \"123foo\", true,\n    \"0:3: Need space between number and identifier.\\n\" },\n\n  // Hex/octal errors.\n  { \"0x foo\", true,\n    \"0:2: \\\"0x\\\" must be followed by hex digits.\\n\" },\n  { \"0541823 foo\", true,\n    \"0:4: Numbers starting with leading zero must be in octal.\\n\" },\n  { \"0x123z foo\", true,\n    \"0:5: Need space between number and identifier.\\n\" },\n  { \"0x123.4 foo\", true,\n    \"0:5: Hex and octal numbers must be integers.\\n\" },\n  { \"0123.4 foo\", true,\n    \"0:4: Hex and octal numbers must be integers.\\n\" },\n\n  // Float errors.\n  { \"1e foo\", true,\n    \"0:2: \\\"e\\\" must be followed by exponent.\\n\" },\n  { \"1e- foo\", true,\n    \"0:3: \\\"e\\\" must be followed by exponent.\\n\" },\n  { \"1.2.3 foo\", true,\n    \"0:3: Already saw decimal point or exponent; can't have another one.\\n\" },\n  { \"1e2.3 foo\", true,\n    \"0:3: Already saw decimal point or exponent; can't have another one.\\n\" },\n  { \"a.1 foo\", true,\n    \"0:1: Need space between identifier and decimal point.\\n\" },\n  // allow_f_after_float not enabled, so this should be an error.\n  { \"1.0f foo\", true,\n    \"0:3: Need space between number and identifier.\\n\" },\n\n  // Block comment errors.\n  { \"/*\", false,\n    \"0:2: End-of-file inside block comment.\\n\"\n    \"0:0:   Comment started here.\\n\"},\n  { \"/*/*/ foo\", true,\n    \"0:3: \\\"/*\\\" inside block comment.  Block comments cannot be nested.\\n\"},\n\n  // Control characters.  Multiple consecutive control characters should only\n  // produce one error.\n  { \"\\b foo\", true,\n    \"0:0: Invalid control characters encountered in text.\\n\" },\n  { \"\\b\\b foo\", true,\n    \"0:0: Invalid control characters encountered in text.\\n\" },\n\n  // Check that control characters at end of input don't result in an\n  // infinite loop.\n  { \"\\b\", false,\n    \"0:0: Invalid control characters encountered in text.\\n\" },\n\n  // Check recovery from '\\0'.  We have to explicitly specify the length of\n  // these strings because otherwise the string constructor will just call\n  // strlen() which will see the first '\\0' and think that is the end of the\n  // string.\n  { string(\"\\0foo\", 4), true,\n    \"0:0: Invalid control characters encountered in text.\\n\" },\n  { string(\"\\0\\0foo\", 5), true,\n    \"0:0: Invalid control characters encountered in text.\\n\" },\n};\n\nTEST_2D(TokenizerTest, Errors, kErrorCases, kBlockSizes) {\n  // Set up the tokenizer.\n  TestInputStream input(kErrorCases_case.input.data(),\n                        kErrorCases_case.input.size(),\n                        kBlockSizes_case);\n  TestErrorCollector error_collector;\n  Tokenizer tokenizer(&input, &error_collector);\n\n  // Ignore all input, except remember if the last token was \"foo\".\n  bool last_was_foo = false;\n  while (tokenizer.Next()) {\n    last_was_foo = tokenizer.current().text == \"foo\";\n  }\n\n  // Check that the errors match what was expected.\n  EXPECT_EQ(error_collector.text_, kErrorCases_case.errors);\n\n  // If the error was recoverable, make sure we saw \"foo\" after it.\n  if (kErrorCases_case.recoverable) {\n    EXPECT_TRUE(last_was_foo);\n  }\n}\n\n// -------------------------------------------------------------------\n\nTEST_1D(TokenizerTest, BackUpOnDestruction, kBlockSizes) {\n  string text = \"foo bar\";\n  TestInputStream input(text.data(), text.size(), kBlockSizes_case);\n\n  // Create a tokenizer, read one token, then destroy it.\n  {\n    TestErrorCollector error_collector;\n    Tokenizer tokenizer(&input, &error_collector);\n\n    tokenizer.Next();\n  }\n\n  // Only \"foo\" should have been read.\n  EXPECT_EQ(strlen(\"foo\"), input.ByteCount());\n}\n\n}  // namespace\n}  // namespace io\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/io/zero_copy_stream.h>\n\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\n\nZeroCopyInputStream::~ZeroCopyInputStream() {}\nZeroCopyOutputStream::~ZeroCopyOutputStream() {}\n\n\n}  // namespace io\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file contains the ZeroCopyInputStream and ZeroCopyOutputStream\n// interfaces, which represent abstract I/O streams to and from which\n// protocol buffers can be read and written.  For a few simple\n// implementations of these interfaces, see zero_copy_stream_impl.h.\n//\n// These interfaces are different from classic I/O streams in that they\n// try to minimize the amount of data copying that needs to be done.\n// To accomplish this, responsibility for allocating buffers is moved to\n// the stream object, rather than being the responsibility of the caller.\n// So, the stream can return a buffer which actually points directly into\n// the final data structure where the bytes are to be stored, and the caller\n// can interact directly with that buffer, eliminating an intermediate copy\n// operation.\n//\n// As an example, consider the common case in which you are reading bytes\n// from an array that is already in memory (or perhaps an mmap()ed file).\n// With classic I/O streams, you would do something like:\n//   char buffer[BUFFER_SIZE];\n//   input->Read(buffer, BUFFER_SIZE);\n//   DoSomething(buffer, BUFFER_SIZE);\n// Then, the stream basically just calls memcpy() to copy the data from\n// the array into your buffer.  With a ZeroCopyInputStream, you would do\n// this instead:\n//   const void* buffer;\n//   int size;\n//   input->Next(&buffer, &size);\n//   DoSomething(buffer, size);\n// Here, no copy is performed.  The input stream returns a pointer directly\n// into the backing array, and the caller ends up reading directly from it.\n//\n// If you want to be able to read the old-fashion way, you can create\n// a CodedInputStream or CodedOutputStream wrapping these objects and use\n// their ReadRaw()/WriteRaw() methods.  These will, of course, add a copy\n// step, but Coded*Stream will handle buffering so at least it will be\n// reasonably efficient.\n//\n// ZeroCopyInputStream example:\n//   // Read in a file and print its contents to stdout.\n//   int fd = open(\"myfile\", O_RDONLY);\n//   ZeroCopyInputStream* input = new FileInputStream(fd);\n//\n//   const void* buffer;\n//   int size;\n//   while (input->Next(&buffer, &size)) {\n//     cout.write(buffer, size);\n//   }\n//\n//   delete input;\n//   close(fd);\n//\n// ZeroCopyOutputStream example:\n//   // Copy the contents of \"infile\" to \"outfile\", using plain read() for\n//   // \"infile\" but a ZeroCopyOutputStream for \"outfile\".\n//   int infd = open(\"infile\", O_RDONLY);\n//   int outfd = open(\"outfile\", O_WRONLY);\n//   ZeroCopyOutputStream* output = new FileOutputStream(outfd);\n//\n//   void* buffer;\n//   int size;\n//   while (output->Next(&buffer, &size)) {\n//     int bytes = read(infd, buffer, size);\n//     if (bytes < size) {\n//       // Reached EOF.\n//       output->BackUp(size - bytes);\n//       break;\n//     }\n//   }\n//\n//   delete output;\n//   close(infd);\n//   close(outfd);\n\n#ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__\n#define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__\n\n#include <string>\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\n\nnamespace protobuf {\nnamespace io {\n\n// Defined in this file.\nclass ZeroCopyInputStream;\nclass ZeroCopyOutputStream;\n\n// Abstract interface similar to an input stream but designed to minimize\n// copying.\nclass LIBPROTOBUF_EXPORT ZeroCopyInputStream {\n public:\n  inline ZeroCopyInputStream() {}\n  virtual ~ZeroCopyInputStream();\n\n  // Obtains a chunk of data from the stream.\n  //\n  // Preconditions:\n  // * \"size\" and \"data\" are not NULL.\n  //\n  // Postconditions:\n  // * If the returned value is false, there is no more data to return or\n  //   an error occurred.  All errors are permanent.\n  // * Otherwise, \"size\" points to the actual number of bytes read and \"data\"\n  //   points to a pointer to a buffer containing these bytes.\n  // * Ownership of this buffer remains with the stream, and the buffer\n  //   remains valid only until some other method of the stream is called\n  //   or the stream is destroyed.\n  // * It is legal for the returned buffer to have zero size, as long\n  //   as repeatedly calling Next() eventually yields a buffer with non-zero\n  //   size.\n  virtual bool Next(const void** data, int* size) = 0;\n\n  // Backs up a number of bytes, so that the next call to Next() returns\n  // data again that was already returned by the last call to Next().  This\n  // is useful when writing procedures that are only supposed to read up\n  // to a certain point in the input, then return.  If Next() returns a\n  // buffer that goes beyond what you wanted to read, you can use BackUp()\n  // to return to the point where you intended to finish.\n  //\n  // Preconditions:\n  // * The last method called must have been Next().\n  // * count must be less than or equal to the size of the last buffer\n  //   returned by Next().\n  //\n  // Postconditions:\n  // * The last \"count\" bytes of the last buffer returned by Next() will be\n  //   pushed back into the stream.  Subsequent calls to Next() will return\n  //   the same data again before producing new data.\n  virtual void BackUp(int count) = 0;\n\n  // Skips a number of bytes.  Returns false if the end of the stream is\n  // reached or some input error occurred.  In the end-of-stream case, the\n  // stream is advanced to the end of the stream (so ByteCount() will return\n  // the total size of the stream).\n  virtual bool Skip(int count) = 0;\n\n  // Returns the total number of bytes read since this object was created.\n  virtual int64 ByteCount() const = 0;\n\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ZeroCopyInputStream);\n};\n\n// Abstract interface similar to an output stream but designed to minimize\n// copying.\nclass LIBPROTOBUF_EXPORT ZeroCopyOutputStream {\n public:\n  inline ZeroCopyOutputStream() {}\n  virtual ~ZeroCopyOutputStream();\n\n  // Obtains a buffer into which data can be written.  Any data written\n  // into this buffer will eventually (maybe instantly, maybe later on)\n  // be written to the output.\n  //\n  // Preconditions:\n  // * \"size\" and \"data\" are not NULL.\n  //\n  // Postconditions:\n  // * If the returned value is false, an error occurred.  All errors are\n  //   permanent.\n  // * Otherwise, \"size\" points to the actual number of bytes in the buffer\n  //   and \"data\" points to the buffer.\n  // * Ownership of this buffer remains with the stream, and the buffer\n  //   remains valid only until some other method of the stream is called\n  //   or the stream is destroyed.\n  // * Any data which the caller stores in this buffer will eventually be\n  //   written to the output (unless BackUp() is called).\n  // * It is legal for the returned buffer to have zero size, as long\n  //   as repeatedly calling Next() eventually yields a buffer with non-zero\n  //   size.\n  virtual bool Next(void** data, int* size) = 0;\n\n  // Backs up a number of bytes, so that the end of the last buffer returned\n  // by Next() is not actually written.  This is needed when you finish\n  // writing all the data you want to write, but the last buffer was bigger\n  // than you needed.  You don't want to write a bunch of garbage after the\n  // end of your data, so you use BackUp() to back up.\n  //\n  // Preconditions:\n  // * The last method called must have been Next().\n  // * count must be less than or equal to the size of the last buffer\n  //   returned by Next().\n  // * The caller must not have written anything to the last \"count\" bytes\n  //   of that buffer.\n  //\n  // Postconditions:\n  // * The last \"count\" bytes of the last buffer returned by Next() will be\n  //   ignored.\n  virtual void BackUp(int count) = 0;\n\n  // Returns the total number of bytes written since this object was created.\n  virtual int64 ByteCount() const = 0;\n\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ZeroCopyOutputStream);\n};\n\n}  // namespace io\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifdef _MSC_VER\n#include <io.h>\n#else\n#include <unistd.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#endif\n#include <errno.h>\n#include <iostream>\n#include <algorithm>\n\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\n\n#ifdef _WIN32\n// Win32 lseek is broken:  If invoked on a non-seekable file descriptor, its\n// return value is undefined.  We re-define it to always produce an error.\n#define lseek(fd, offset, origin) ((off_t)-1)\n#endif\n\nnamespace {\n\n// EINTR sucks.\nint close_no_eintr(int fd) {\n  int result;\n  do {\n    result = close(fd);\n  } while (result < 0 && errno == EINTR);\n  return result;\n}\n\n}  // namespace\n\n\n// ===================================================================\n\nFileInputStream::FileInputStream(int file_descriptor, int block_size)\n  : copying_input_(file_descriptor),\n    impl_(&copying_input_, block_size) {\n}\n\nFileInputStream::~FileInputStream() {}\n\nbool FileInputStream::Close() {\n  return copying_input_.Close();\n}\n\nbool FileInputStream::Next(const void** data, int* size) {\n  return impl_.Next(data, size);\n}\n\nvoid FileInputStream::BackUp(int count) {\n  impl_.BackUp(count);\n}\n\nbool FileInputStream::Skip(int count) {\n  return impl_.Skip(count);\n}\n\nint64 FileInputStream::ByteCount() const {\n  return impl_.ByteCount();\n}\n\nFileInputStream::CopyingFileInputStream::CopyingFileInputStream(\n    int file_descriptor)\n  : file_(file_descriptor),\n    close_on_delete_(false),\n    is_closed_(false),\n    errno_(0),\n    previous_seek_failed_(false) {\n}\n\nFileInputStream::CopyingFileInputStream::~CopyingFileInputStream() {\n  if (close_on_delete_) {\n    if (!Close()) {\n      GOOGLE_LOG(ERROR) << \"close() failed: \" << strerror(errno_);\n    }\n  }\n}\n\nbool FileInputStream::CopyingFileInputStream::Close() {\n  GOOGLE_CHECK(!is_closed_);\n\n  is_closed_ = true;\n  if (close_no_eintr(file_) != 0) {\n    // The docs on close() do not specify whether a file descriptor is still\n    // open after close() fails with EIO.  However, the glibc source code\n    // seems to indicate that it is not.\n    errno_ = errno;\n    return false;\n  }\n\n  return true;\n}\n\nint FileInputStream::CopyingFileInputStream::Read(void* buffer, int size) {\n  GOOGLE_CHECK(!is_closed_);\n\n  int result;\n  do {\n    result = read(file_, buffer, size);\n  } while (result < 0 && errno == EINTR);\n\n  if (result < 0) {\n    // Read error (not EOF).\n    errno_ = errno;\n  }\n\n  return result;\n}\n\nint FileInputStream::CopyingFileInputStream::Skip(int count) {\n  GOOGLE_CHECK(!is_closed_);\n\n  if (!previous_seek_failed_ &&\n      lseek(file_, count, SEEK_CUR) != (off_t)-1) {\n    // Seek succeeded.\n    return count;\n  } else {\n    // Failed to seek.\n\n    // Note to self:  Don't seek again.  This file descriptor doesn't\n    // support it.\n    previous_seek_failed_ = true;\n\n    // Use the default implementation.\n    return CopyingInputStream::Skip(count);\n  }\n}\n\n// ===================================================================\n\nFileOutputStream::FileOutputStream(int file_descriptor, int block_size)\n  : copying_output_(file_descriptor),\n    impl_(&copying_output_, block_size) {\n}\n\nFileOutputStream::~FileOutputStream() {\n  impl_.Flush();\n}\n\nbool FileOutputStream::Close() {\n  bool flush_succeeded = impl_.Flush();\n  return copying_output_.Close() && flush_succeeded;\n}\n\nbool FileOutputStream::Flush() {\n  return impl_.Flush();\n}\n\nbool FileOutputStream::Next(void** data, int* size) {\n  return impl_.Next(data, size);\n}\n\nvoid FileOutputStream::BackUp(int count) {\n  impl_.BackUp(count);\n}\n\nint64 FileOutputStream::ByteCount() const {\n  return impl_.ByteCount();\n}\n\nFileOutputStream::CopyingFileOutputStream::CopyingFileOutputStream(\n    int file_descriptor)\n  : file_(file_descriptor),\n    close_on_delete_(false),\n    is_closed_(false),\n    errno_(0) {\n}\n\nFileOutputStream::CopyingFileOutputStream::~CopyingFileOutputStream() {\n  if (close_on_delete_) {\n    if (!Close()) {\n      GOOGLE_LOG(ERROR) << \"close() failed: \" << strerror(errno_);\n    }\n  }\n}\n\nbool FileOutputStream::CopyingFileOutputStream::Close() {\n  GOOGLE_CHECK(!is_closed_);\n\n  is_closed_ = true;\n  if (close_no_eintr(file_) != 0) {\n    // The docs on close() do not specify whether a file descriptor is still\n    // open after close() fails with EIO.  However, the glibc source code\n    // seems to indicate that it is not.\n    errno_ = errno;\n    return false;\n  }\n\n  return true;\n}\n\nbool FileOutputStream::CopyingFileOutputStream::Write(\n    const void* buffer, int size) {\n  GOOGLE_CHECK(!is_closed_);\n  int total_written = 0;\n\n  const uint8* buffer_base = reinterpret_cast<const uint8*>(buffer);\n\n  while (total_written < size) {\n    int bytes;\n    do {\n      bytes = write(file_, buffer_base + total_written, size - total_written);\n    } while (bytes < 0 && errno == EINTR);\n\n    if (bytes <= 0) {\n      // Write error.\n\n      // FIXME(kenton):  According to the man page, if write() returns zero,\n      //   there was no error; write() simply did not write anything.  It's\n      //   unclear under what circumstances this might happen, but presumably\n      //   errno won't be set in this case.  I am confused as to how such an\n      //   event should be handled.  For now I'm treating it as an error, since\n      //   retrying seems like it could lead to an infinite loop.  I suspect\n      //   this never actually happens anyway.\n\n      if (bytes < 0) {\n        errno_ = errno;\n      }\n      return false;\n    }\n    total_written += bytes;\n  }\n\n  return true;\n}\n\n// ===================================================================\n\nIstreamInputStream::IstreamInputStream(istream* input, int block_size)\n  : copying_input_(input),\n    impl_(&copying_input_, block_size) {\n}\n\nIstreamInputStream::~IstreamInputStream() {}\n\nbool IstreamInputStream::Next(const void** data, int* size) {\n  return impl_.Next(data, size);\n}\n\nvoid IstreamInputStream::BackUp(int count) {\n  impl_.BackUp(count);\n}\n\nbool IstreamInputStream::Skip(int count) {\n  return impl_.Skip(count);\n}\n\nint64 IstreamInputStream::ByteCount() const {\n  return impl_.ByteCount();\n}\n\nIstreamInputStream::CopyingIstreamInputStream::CopyingIstreamInputStream(\n    istream* input)\n  : input_(input) {\n}\n\nIstreamInputStream::CopyingIstreamInputStream::~CopyingIstreamInputStream() {}\n\nint IstreamInputStream::CopyingIstreamInputStream::Read(\n    void* buffer, int size) {\n  input_->read(reinterpret_cast<char*>(buffer), size);\n  int result = input_->gcount();\n  if (result == 0 && input_->fail() && !input_->eof()) {\n    return -1;\n  }\n  return result;\n}\n\n// ===================================================================\n\nOstreamOutputStream::OstreamOutputStream(ostream* output, int block_size)\n  : copying_output_(output),\n    impl_(&copying_output_, block_size) {\n}\n\nOstreamOutputStream::~OstreamOutputStream() {\n  impl_.Flush();\n}\n\nbool OstreamOutputStream::Next(void** data, int* size) {\n  return impl_.Next(data, size);\n}\n\nvoid OstreamOutputStream::BackUp(int count) {\n  impl_.BackUp(count);\n}\n\nint64 OstreamOutputStream::ByteCount() const {\n  return impl_.ByteCount();\n}\n\nOstreamOutputStream::CopyingOstreamOutputStream::CopyingOstreamOutputStream(\n    ostream* output)\n  : output_(output) {\n}\n\nOstreamOutputStream::CopyingOstreamOutputStream::~CopyingOstreamOutputStream() {\n}\n\nbool OstreamOutputStream::CopyingOstreamOutputStream::Write(\n    const void* buffer, int size) {\n  output_->write(reinterpret_cast<const char*>(buffer), size);\n  return output_->good();\n}\n\n// ===================================================================\n\nConcatenatingInputStream::ConcatenatingInputStream(\n    ZeroCopyInputStream* const streams[], int count)\n  : streams_(streams), stream_count_(count), bytes_retired_(0) {\n}\n\nConcatenatingInputStream::~ConcatenatingInputStream() {\n}\n\nbool ConcatenatingInputStream::Next(const void** data, int* size) {\n  while (stream_count_ > 0) {\n    if (streams_[0]->Next(data, size)) return true;\n\n    // That stream is done.  Advance to the next one.\n    bytes_retired_ += streams_[0]->ByteCount();\n    ++streams_;\n    --stream_count_;\n  }\n\n  // No more streams.\n  return false;\n}\n\nvoid ConcatenatingInputStream::BackUp(int count) {\n  if (stream_count_ > 0) {\n    streams_[0]->BackUp(count);\n  } else {\n    GOOGLE_LOG(DFATAL) << \"Can't BackUp() after failed Next().\";\n  }\n}\n\nbool ConcatenatingInputStream::Skip(int count) {\n  while (stream_count_ > 0) {\n    // Assume that ByteCount() can be used to find out how much we actually\n    // skipped when Skip() fails.\n    int64 target_byte_count = streams_[0]->ByteCount() + count;\n    if (streams_[0]->Skip(count)) return true;\n\n    // Hit the end of the stream.  Figure out how many more bytes we still have\n    // to skip.\n    int64 final_byte_count = streams_[0]->ByteCount();\n    GOOGLE_DCHECK_LT(final_byte_count, target_byte_count);\n    count = target_byte_count - final_byte_count;\n\n    // That stream is done.  Advance to the next one.\n    bytes_retired_ += final_byte_count;\n    ++streams_;\n    --stream_count_;\n  }\n\n  return false;\n}\n\nint64 ConcatenatingInputStream::ByteCount() const {\n  if (stream_count_ == 0) {\n    return bytes_retired_;\n  } else {\n    return bytes_retired_ + streams_[0]->ByteCount();\n  }\n}\n\n\n// ===================================================================\n\nLimitingInputStream::LimitingInputStream(ZeroCopyInputStream* input,\n                                         int64 limit)\n  : input_(input), limit_(limit) {}\n\nLimitingInputStream::~LimitingInputStream() {\n  // If we overshot the limit, back up.\n  if (limit_ < 0) input_->BackUp(-limit_);\n}\n\nbool LimitingInputStream::Next(const void** data, int* size) {\n  if (limit_ <= 0) return false;\n  if (!input_->Next(data, size)) return false;\n\n  limit_ -= *size;\n  if (limit_ < 0) {\n    // We overshot the limit.  Reduce *size to hide the rest of the buffer.\n    *size += limit_;\n  }\n  return true;\n}\n\nvoid LimitingInputStream::BackUp(int count) {\n  if (limit_ < 0) {\n    input_->BackUp(count - limit_);\n    limit_ = count;\n  } else {\n    input_->BackUp(count);\n    limit_ += count;\n  }\n}\n\nbool LimitingInputStream::Skip(int count) {\n  if (count > limit_) {\n    if (limit_ < 0) return false;\n    input_->Skip(limit_);\n    limit_ = 0;\n    return false;\n  } else {\n    if (!input_->Skip(count)) return false;\n    limit_ -= count;\n    return true;\n  }\n}\n\nint64 LimitingInputStream::ByteCount() const {\n  if (limit_ < 0) {\n    return input_->ByteCount() + limit_;\n  } else {\n    return input_->ByteCount();\n  }\n}\n\n\n// ===================================================================\n\n}  // namespace io\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file contains common implementations of the interfaces defined in\n// zero_copy_stream.h which are only included in the full (non-lite)\n// protobuf library.  These implementations include Unix file descriptors\n// and C++ iostreams.  See also:  zero_copy_stream_impl_lite.h\n\n#ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__\n#define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__\n\n#include <string>\n#include <iosfwd>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/io/zero_copy_stream_impl_lite.h>\n#include <google/protobuf/stubs/common.h>\n\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\n\n\n// ===================================================================\n\n// A ZeroCopyInputStream which reads from a file descriptor.\n//\n// FileInputStream is preferred over using an ifstream with IstreamInputStream.\n// The latter will introduce an extra layer of buffering, harming performance.\n// Also, it's conceivable that FileInputStream could someday be enhanced\n// to use zero-copy file descriptors on OSs which support them.\nclass LIBPROTOBUF_EXPORT FileInputStream : public ZeroCopyInputStream {\n public:\n  // Creates a stream that reads from the given Unix file descriptor.\n  // If a block_size is given, it specifies the number of bytes that\n  // should be read and returned with each call to Next().  Otherwise,\n  // a reasonable default is used.\n  explicit FileInputStream(int file_descriptor, int block_size = -1);\n  ~FileInputStream();\n\n  // Flushes any buffers and closes the underlying file.  Returns false if\n  // an error occurs during the process; use GetErrno() to examine the error.\n  // Even if an error occurs, the file descriptor is closed when this returns.\n  bool Close();\n\n  // By default, the file descriptor is not closed when the stream is\n  // destroyed.  Call SetCloseOnDelete(true) to change that.  WARNING:\n  // This leaves no way for the caller to detect if close() fails.  If\n  // detecting close() errors is important to you, you should arrange\n  // to close the descriptor yourself.\n  void SetCloseOnDelete(bool value) { copying_input_.SetCloseOnDelete(value); }\n\n  // If an I/O error has occurred on this file descriptor, this is the\n  // errno from that error.  Otherwise, this is zero.  Once an error\n  // occurs, the stream is broken and all subsequent operations will\n  // fail.\n  int GetErrno() { return copying_input_.GetErrno(); }\n\n  // implements ZeroCopyInputStream ----------------------------------\n  bool Next(const void** data, int* size);\n  void BackUp(int count);\n  bool Skip(int count);\n  int64 ByteCount() const;\n\n private:\n  class LIBPROTOBUF_EXPORT CopyingFileInputStream : public CopyingInputStream {\n   public:\n    CopyingFileInputStream(int file_descriptor);\n    ~CopyingFileInputStream();\n\n    bool Close();\n    void SetCloseOnDelete(bool value) { close_on_delete_ = value; }\n    int GetErrno() { return errno_; }\n\n    // implements CopyingInputStream ---------------------------------\n    int Read(void* buffer, int size);\n    int Skip(int count);\n\n   private:\n    // The file descriptor.\n    const int file_;\n    bool close_on_delete_;\n    bool is_closed_;\n\n    // The errno of the I/O error, if one has occurred.  Otherwise, zero.\n    int errno_;\n\n    // Did we try to seek once and fail?  If so, we assume this file descriptor\n    // doesn't support seeking and won't try again.\n    bool previous_seek_failed_;\n\n    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingFileInputStream);\n  };\n\n  CopyingFileInputStream copying_input_;\n  CopyingInputStreamAdaptor impl_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileInputStream);\n};\n\n// ===================================================================\n\n// A ZeroCopyOutputStream which writes to a file descriptor.\n//\n// FileOutputStream is preferred over using an ofstream with\n// OstreamOutputStream.  The latter will introduce an extra layer of buffering,\n// harming performance.  Also, it's conceivable that FileOutputStream could\n// someday be enhanced to use zero-copy file descriptors on OSs which\n// support them.\nclass LIBPROTOBUF_EXPORT FileOutputStream : public ZeroCopyOutputStream {\n public:\n  // Creates a stream that writes to the given Unix file descriptor.\n  // If a block_size is given, it specifies the size of the buffers\n  // that should be returned by Next().  Otherwise, a reasonable default\n  // is used.\n  explicit FileOutputStream(int file_descriptor, int block_size = -1);\n  ~FileOutputStream();\n\n  // Flushes any buffers and closes the underlying file.  Returns false if\n  // an error occurs during the process; use GetErrno() to examine the error.\n  // Even if an error occurs, the file descriptor is closed when this returns.\n  bool Close();\n\n  // Flushes FileOutputStream's buffers but does not close the\n  // underlying file. No special measures are taken to ensure that\n  // underlying operating system file object is synchronized to disk.\n  bool Flush();\n\n  // By default, the file descriptor is not closed when the stream is\n  // destroyed.  Call SetCloseOnDelete(true) to change that.  WARNING:\n  // This leaves no way for the caller to detect if close() fails.  If\n  // detecting close() errors is important to you, you should arrange\n  // to close the descriptor yourself.\n  void SetCloseOnDelete(bool value) { copying_output_.SetCloseOnDelete(value); }\n\n  // If an I/O error has occurred on this file descriptor, this is the\n  // errno from that error.  Otherwise, this is zero.  Once an error\n  // occurs, the stream is broken and all subsequent operations will\n  // fail.\n  int GetErrno() { return copying_output_.GetErrno(); }\n\n  // implements ZeroCopyOutputStream ---------------------------------\n  bool Next(void** data, int* size);\n  void BackUp(int count);\n  int64 ByteCount() const;\n\n private:\n  class LIBPROTOBUF_EXPORT CopyingFileOutputStream : public CopyingOutputStream {\n   public:\n    CopyingFileOutputStream(int file_descriptor);\n    ~CopyingFileOutputStream();\n\n    bool Close();\n    void SetCloseOnDelete(bool value) { close_on_delete_ = value; }\n    int GetErrno() { return errno_; }\n\n    // implements CopyingOutputStream --------------------------------\n    bool Write(const void* buffer, int size);\n\n   private:\n    // The file descriptor.\n    const int file_;\n    bool close_on_delete_;\n    bool is_closed_;\n\n    // The errno of the I/O error, if one has occurred.  Otherwise, zero.\n    int errno_;\n\n    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingFileOutputStream);\n  };\n\n  CopyingFileOutputStream copying_output_;\n  CopyingOutputStreamAdaptor impl_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileOutputStream);\n};\n\n// ===================================================================\n\n// A ZeroCopyInputStream which reads from a C++ istream.\n//\n// Note that for reading files (or anything represented by a file descriptor),\n// FileInputStream is more efficient.\nclass LIBPROTOBUF_EXPORT IstreamInputStream : public ZeroCopyInputStream {\n public:\n  // Creates a stream that reads from the given C++ istream.\n  // If a block_size is given, it specifies the number of bytes that\n  // should be read and returned with each call to Next().  Otherwise,\n  // a reasonable default is used.\n  explicit IstreamInputStream(istream* stream, int block_size = -1);\n  ~IstreamInputStream();\n\n  // implements ZeroCopyInputStream ----------------------------------\n  bool Next(const void** data, int* size);\n  void BackUp(int count);\n  bool Skip(int count);\n  int64 ByteCount() const;\n\n private:\n  class LIBPROTOBUF_EXPORT CopyingIstreamInputStream : public CopyingInputStream {\n   public:\n    CopyingIstreamInputStream(istream* input);\n    ~CopyingIstreamInputStream();\n\n    // implements CopyingInputStream ---------------------------------\n    int Read(void* buffer, int size);\n    // (We use the default implementation of Skip().)\n\n   private:\n    // The stream.\n    istream* input_;\n\n    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingIstreamInputStream);\n  };\n\n  CopyingIstreamInputStream copying_input_;\n  CopyingInputStreamAdaptor impl_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(IstreamInputStream);\n};\n\n// ===================================================================\n\n// A ZeroCopyOutputStream which writes to a C++ ostream.\n//\n// Note that for writing files (or anything represented by a file descriptor),\n// FileOutputStream is more efficient.\nclass LIBPROTOBUF_EXPORT OstreamOutputStream : public ZeroCopyOutputStream {\n public:\n  // Creates a stream that writes to the given C++ ostream.\n  // If a block_size is given, it specifies the size of the buffers\n  // that should be returned by Next().  Otherwise, a reasonable default\n  // is used.\n  explicit OstreamOutputStream(ostream* stream, int block_size = -1);\n  ~OstreamOutputStream();\n\n  // implements ZeroCopyOutputStream ---------------------------------\n  bool Next(void** data, int* size);\n  void BackUp(int count);\n  int64 ByteCount() const;\n\n private:\n  class LIBPROTOBUF_EXPORT CopyingOstreamOutputStream : public CopyingOutputStream {\n   public:\n    CopyingOstreamOutputStream(ostream* output);\n    ~CopyingOstreamOutputStream();\n\n    // implements CopyingOutputStream --------------------------------\n    bool Write(const void* buffer, int size);\n\n   private:\n    // The stream.\n    ostream* output_;\n\n    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingOstreamOutputStream);\n  };\n\n  CopyingOstreamOutputStream copying_output_;\n  CopyingOutputStreamAdaptor impl_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OstreamOutputStream);\n};\n\n// ===================================================================\n\n// A ZeroCopyInputStream which reads from several other streams in sequence.\n// ConcatenatingInputStream is unable to distinguish between end-of-stream\n// and read errors in the underlying streams, so it assumes any errors mean\n// end-of-stream.  So, if the underlying streams fail for any other reason,\n// ConcatenatingInputStream may do odd things.  It is suggested that you do\n// not use ConcatenatingInputStream on streams that might produce read errors\n// other than end-of-stream.\nclass LIBPROTOBUF_EXPORT ConcatenatingInputStream : public ZeroCopyInputStream {\n public:\n  // All streams passed in as well as the array itself must remain valid\n  // until the ConcatenatingInputStream is destroyed.\n  ConcatenatingInputStream(ZeroCopyInputStream* const streams[], int count);\n  ~ConcatenatingInputStream();\n\n  // implements ZeroCopyInputStream ----------------------------------\n  bool Next(const void** data, int* size);\n  void BackUp(int count);\n  bool Skip(int count);\n  int64 ByteCount() const;\n\n\n private:\n  // As streams are retired, streams_ is incremented and count_ is\n  // decremented.\n  ZeroCopyInputStream* const* streams_;\n  int stream_count_;\n  int64 bytes_retired_;  // Bytes read from previous streams.\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ConcatenatingInputStream);\n};\n\n// ===================================================================\n\n// A ZeroCopyInputStream which wraps some other stream and limits it to\n// a particular byte count.\nclass LIBPROTOBUF_EXPORT LimitingInputStream : public ZeroCopyInputStream {\n public:\n  LimitingInputStream(ZeroCopyInputStream* input, int64 limit);\n  ~LimitingInputStream();\n\n  // implements ZeroCopyInputStream ----------------------------------\n  bool Next(const void** data, int* size);\n  void BackUp(int count);\n  bool Skip(int count);\n  int64 ByteCount() const;\n\n\n private:\n  ZeroCopyInputStream* input_;\n  int64 limit_;  // Decreases as we go, becomes negative if we overshoot.\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LimitingInputStream);\n};\n\n// ===================================================================\n\n}  // namespace io\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\n\nnamespace {\n\n// Default block size for Copying{In,Out}putStreamAdaptor.\nstatic const int kDefaultBlockSize = 8192;\n\n}  // namespace\n\n// ===================================================================\n\nArrayInputStream::ArrayInputStream(const void* data, int size,\n                                   int block_size)\n  : data_(reinterpret_cast<const uint8*>(data)),\n    size_(size),\n    block_size_(block_size > 0 ? block_size : size),\n    position_(0),\n    last_returned_size_(0) {\n}\n\nArrayInputStream::~ArrayInputStream() {\n}\n\nbool ArrayInputStream::Next(const void** data, int* size) {\n  if (position_ < size_) {\n    last_returned_size_ = min(block_size_, size_ - position_);\n    *data = data_ + position_;\n    *size = last_returned_size_;\n    position_ += last_returned_size_;\n    return true;\n  } else {\n    // We're at the end of the array.\n    last_returned_size_ = 0;   // Don't let caller back up.\n    return false;\n  }\n}\n\nvoid ArrayInputStream::BackUp(int count) {\n  GOOGLE_CHECK_GT(last_returned_size_, 0)\n      << \"BackUp() can only be called after a successful Next().\";\n  GOOGLE_CHECK_LE(count, last_returned_size_);\n  GOOGLE_CHECK_GE(count, 0);\n  position_ -= count;\n  last_returned_size_ = 0;  // Don't let caller back up further.\n}\n\nbool ArrayInputStream::Skip(int count) {\n  GOOGLE_CHECK_GE(count, 0);\n  last_returned_size_ = 0;   // Don't let caller back up.\n  if (count > size_ - position_) {\n    position_ = size_;\n    return false;\n  } else {\n    position_ += count;\n    return true;\n  }\n}\n\nint64 ArrayInputStream::ByteCount() const {\n  return position_;\n}\n\n\n// ===================================================================\n\nArrayOutputStream::ArrayOutputStream(void* data, int size, int block_size)\n  : data_(reinterpret_cast<uint8*>(data)),\n    size_(size),\n    block_size_(block_size > 0 ? block_size : size),\n    position_(0),\n    last_returned_size_(0) {\n}\n\nArrayOutputStream::~ArrayOutputStream() {\n}\n\nbool ArrayOutputStream::Next(void** data, int* size) {\n  if (position_ < size_) {\n    last_returned_size_ = min(block_size_, size_ - position_);\n    *data = data_ + position_;\n    *size = last_returned_size_;\n    position_ += last_returned_size_;\n    return true;\n  } else {\n    // We're at the end of the array.\n    last_returned_size_ = 0;   // Don't let caller back up.\n    return false;\n  }\n}\n\nvoid ArrayOutputStream::BackUp(int count) {\n  GOOGLE_CHECK_GT(last_returned_size_, 0)\n      << \"BackUp() can only be called after a successful Next().\";\n  GOOGLE_CHECK_LE(count, last_returned_size_);\n  GOOGLE_CHECK_GE(count, 0);\n  position_ -= count;\n  last_returned_size_ = 0;  // Don't let caller back up further.\n}\n\nint64 ArrayOutputStream::ByteCount() const {\n  return position_;\n}\n\n// ===================================================================\n\nStringOutputStream::StringOutputStream(string* target)\n  : target_(target) {\n}\n\nStringOutputStream::~StringOutputStream() {\n}\n\nbool StringOutputStream::Next(void** data, int* size) {\n  int old_size = target_->size();\n\n  // Grow the string.\n  if (old_size < target_->capacity()) {\n    // Resize the string to match its capacity, since we can get away\n    // without a memory allocation this way.\n    STLStringResizeUninitialized(target_, target_->capacity());\n  } else {\n    // Size has reached capacity, so double the size.  Also make sure\n    // that the new size is at least kMinimumSize.\n    STLStringResizeUninitialized(\n      target_,\n      max(old_size * 2,\n          kMinimumSize + 0));  // \"+ 0\" works around GCC4 weirdness.\n  }\n\n  *data = string_as_array(target_) + old_size;\n  *size = target_->size() - old_size;\n  return true;\n}\n\nvoid StringOutputStream::BackUp(int count) {\n  GOOGLE_CHECK_GE(count, 0);\n  GOOGLE_CHECK_LE(count, target_->size());\n  target_->resize(target_->size() - count);\n}\n\nint64 StringOutputStream::ByteCount() const {\n  return target_->size();\n}\n\n// ===================================================================\n\nCopyingInputStream::~CopyingInputStream() {}\n\nint CopyingInputStream::Skip(int count) {\n  char junk[4096];\n  int skipped = 0;\n  while (skipped < count) {\n    int bytes = Read(junk, min(count - skipped,\n                               implicit_cast<int>(sizeof(junk))));\n    if (bytes <= 0) {\n      // EOF or read error.\n      return skipped;\n    }\n    skipped += bytes;\n  }\n  return skipped;\n}\n\nCopyingInputStreamAdaptor::CopyingInputStreamAdaptor(\n    CopyingInputStream* copying_stream, int block_size)\n  : copying_stream_(copying_stream),\n    owns_copying_stream_(false),\n    failed_(false),\n    position_(0),\n    buffer_size_(block_size > 0 ? block_size : kDefaultBlockSize),\n    buffer_used_(0),\n    backup_bytes_(0) {\n}\n\nCopyingInputStreamAdaptor::~CopyingInputStreamAdaptor() {\n  if (owns_copying_stream_) {\n    delete copying_stream_;\n  }\n}\n\nbool CopyingInputStreamAdaptor::Next(const void** data, int* size) {\n  if (failed_) {\n    // Already failed on a previous read.\n    return false;\n  }\n\n  AllocateBufferIfNeeded();\n\n  if (backup_bytes_ > 0) {\n    // We have data left over from a previous BackUp(), so just return that.\n    *data = buffer_.get() + buffer_used_ - backup_bytes_;\n    *size = backup_bytes_;\n    backup_bytes_ = 0;\n    return true;\n  }\n\n  // Read new data into the buffer.\n  buffer_used_ = copying_stream_->Read(buffer_.get(), buffer_size_);\n  if (buffer_used_ <= 0) {\n    // EOF or read error.  We don't need the buffer anymore.\n    if (buffer_used_ < 0) {\n      // Read error (not EOF).\n      failed_ = true;\n    }\n    FreeBuffer();\n    return false;\n  }\n  position_ += buffer_used_;\n\n  *size = buffer_used_;\n  *data = buffer_.get();\n  return true;\n}\n\nvoid CopyingInputStreamAdaptor::BackUp(int count) {\n  GOOGLE_CHECK(backup_bytes_ == 0 && buffer_.get() != NULL)\n    << \" BackUp() can only be called after Next().\";\n  GOOGLE_CHECK_LE(count, buffer_used_)\n    << \" Can't back up over more bytes than were returned by the last call\"\n       \" to Next().\";\n  GOOGLE_CHECK_GE(count, 0)\n    << \" Parameter to BackUp() can't be negative.\";\n\n  backup_bytes_ = count;\n}\n\nbool CopyingInputStreamAdaptor::Skip(int count) {\n  GOOGLE_CHECK_GE(count, 0);\n\n  if (failed_) {\n    // Already failed on a previous read.\n    return false;\n  }\n\n  // First skip any bytes left over from a previous BackUp().\n  if (backup_bytes_ >= count) {\n    // We have more data left over than we're trying to skip.  Just chop it.\n    backup_bytes_ -= count;\n    return true;\n  }\n\n  count -= backup_bytes_;\n  backup_bytes_ = 0;\n\n  int skipped = copying_stream_->Skip(count);\n  position_ += skipped;\n  return skipped == count;\n}\n\nint64 CopyingInputStreamAdaptor::ByteCount() const {\n  return position_ - backup_bytes_;\n}\n\nvoid CopyingInputStreamAdaptor::AllocateBufferIfNeeded() {\n  if (buffer_.get() == NULL) {\n    buffer_.reset(new uint8[buffer_size_]);\n  }\n}\n\nvoid CopyingInputStreamAdaptor::FreeBuffer() {\n  GOOGLE_CHECK_EQ(backup_bytes_, 0);\n  buffer_used_ = 0;\n  buffer_.reset();\n}\n\n// ===================================================================\n\nCopyingOutputStream::~CopyingOutputStream() {}\n\nCopyingOutputStreamAdaptor::CopyingOutputStreamAdaptor(\n    CopyingOutputStream* copying_stream, int block_size)\n  : copying_stream_(copying_stream),\n    owns_copying_stream_(false),\n    failed_(false),\n    position_(0),\n    buffer_size_(block_size > 0 ? block_size : kDefaultBlockSize),\n    buffer_used_(0) {\n}\n\nCopyingOutputStreamAdaptor::~CopyingOutputStreamAdaptor() {\n  WriteBuffer();\n  if (owns_copying_stream_) {\n    delete copying_stream_;\n  }\n}\n\nbool CopyingOutputStreamAdaptor::Flush() {\n  return WriteBuffer();\n}\n\nbool CopyingOutputStreamAdaptor::Next(void** data, int* size) {\n  if (buffer_used_ == buffer_size_) {\n    if (!WriteBuffer()) return false;\n  }\n\n  AllocateBufferIfNeeded();\n\n  *data = buffer_.get() + buffer_used_;\n  *size = buffer_size_ - buffer_used_;\n  buffer_used_ = buffer_size_;\n  return true;\n}\n\nvoid CopyingOutputStreamAdaptor::BackUp(int count) {\n  GOOGLE_CHECK_GE(count, 0);\n  GOOGLE_CHECK_EQ(buffer_used_, buffer_size_)\n    << \" BackUp() can only be called after Next().\";\n  GOOGLE_CHECK_LE(count, buffer_used_)\n    << \" Can't back up over more bytes than were returned by the last call\"\n       \" to Next().\";\n\n  buffer_used_ -= count;\n}\n\nint64 CopyingOutputStreamAdaptor::ByteCount() const {\n  return position_ + buffer_used_;\n}\n\nbool CopyingOutputStreamAdaptor::WriteBuffer() {\n  if (failed_) {\n    // Already failed on a previous write.\n    return false;\n  }\n\n  if (buffer_used_ == 0) return true;\n\n  if (copying_stream_->Write(buffer_.get(), buffer_used_)) {\n    position_ += buffer_used_;\n    buffer_used_ = 0;\n    return true;\n  } else {\n    failed_ = true;\n    FreeBuffer();\n    return false;\n  }\n}\n\nvoid CopyingOutputStreamAdaptor::AllocateBufferIfNeeded() {\n  if (buffer_ == NULL) {\n    buffer_.reset(new uint8[buffer_size_]);\n  }\n}\n\nvoid CopyingOutputStreamAdaptor::FreeBuffer() {\n  buffer_used_ = 0;\n  buffer_.reset();\n}\n\n// ===================================================================\n\n}  // namespace io\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file contains common implementations of the interfaces defined in\n// zero_copy_stream.h which are included in the \"lite\" protobuf library.\n// These implementations cover I/O on raw arrays and strings, as well as\n// adaptors which make it easy to implement streams based on traditional\n// streams.  Of course, many users will probably want to write their own\n// implementations of these interfaces specific to the particular I/O\n// abstractions they prefer to use, but these should cover the most common\n// cases.\n\n#ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__\n#define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__\n\n#include <string>\n#include <iosfwd>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/stubs/common.h>\n\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\n\n// ===================================================================\n\n// A ZeroCopyInputStream backed by an in-memory array of bytes.\nclass LIBPROTOBUF_EXPORT ArrayInputStream : public ZeroCopyInputStream {\n public:\n  // Create an InputStream that returns the bytes pointed to by \"data\".\n  // \"data\" remains the property of the caller but must remain valid until\n  // the stream is destroyed.  If a block_size is given, calls to Next()\n  // will return data blocks no larger than the given size.  Otherwise, the\n  // first call to Next() returns the entire array.  block_size is mainly\n  // useful for testing; in production you would probably never want to set\n  // it.\n  ArrayInputStream(const void* data, int size, int block_size = -1);\n  ~ArrayInputStream();\n\n  // implements ZeroCopyInputStream ----------------------------------\n  bool Next(const void** data, int* size);\n  void BackUp(int count);\n  bool Skip(int count);\n  int64 ByteCount() const;\n\n\n private:\n  const uint8* const data_;  // The byte array.\n  const int size_;           // Total size of the array.\n  const int block_size_;     // How many bytes to return at a time.\n\n  int position_;\n  int last_returned_size_;   // How many bytes we returned last time Next()\n                             // was called (used for error checking only).\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayInputStream);\n};\n\n// ===================================================================\n\n// A ZeroCopyOutputStream backed by an in-memory array of bytes.\nclass LIBPROTOBUF_EXPORT ArrayOutputStream : public ZeroCopyOutputStream {\n public:\n  // Create an OutputStream that writes to the bytes pointed to by \"data\".\n  // \"data\" remains the property of the caller but must remain valid until\n  // the stream is destroyed.  If a block_size is given, calls to Next()\n  // will return data blocks no larger than the given size.  Otherwise, the\n  // first call to Next() returns the entire array.  block_size is mainly\n  // useful for testing; in production you would probably never want to set\n  // it.\n  ArrayOutputStream(void* data, int size, int block_size = -1);\n  ~ArrayOutputStream();\n\n  // implements ZeroCopyOutputStream ---------------------------------\n  bool Next(void** data, int* size);\n  void BackUp(int count);\n  int64 ByteCount() const;\n\n private:\n  uint8* const data_;        // The byte array.\n  const int size_;           // Total size of the array.\n  const int block_size_;     // How many bytes to return at a time.\n\n  int position_;\n  int last_returned_size_;   // How many bytes we returned last time Next()\n                             // was called (used for error checking only).\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayOutputStream);\n};\n\n// ===================================================================\n\n// A ZeroCopyOutputStream which appends bytes to a string.\nclass LIBPROTOBUF_EXPORT StringOutputStream : public ZeroCopyOutputStream {\n public:\n  // Create a StringOutputStream which appends bytes to the given string.\n  // The string remains property of the caller, but it MUST NOT be accessed\n  // in any way until the stream is destroyed.\n  //\n  // Hint:  If you call target->reserve(n) before creating the stream,\n  //   the first call to Next() will return at least n bytes of buffer\n  //   space.\n  explicit StringOutputStream(string* target);\n  ~StringOutputStream();\n\n  // implements ZeroCopyOutputStream ---------------------------------\n  bool Next(void** data, int* size);\n  void BackUp(int count);\n  int64 ByteCount() const;\n\n private:\n  static const int kMinimumSize = 16;\n\n  string* target_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringOutputStream);\n};\n\n// Note:  There is no StringInputStream.  Instead, just create an\n// ArrayInputStream as follows:\n//   ArrayInputStream input(str.data(), str.size());\n\n// ===================================================================\n\n// A generic traditional input stream interface.\n//\n// Lots of traditional input streams (e.g. file descriptors, C stdio\n// streams, and C++ iostreams) expose an interface where every read\n// involves copying bytes into a buffer.  If you want to take such an\n// interface and make a ZeroCopyInputStream based on it, simply implement\n// CopyingInputStream and then use CopyingInputStreamAdaptor.\n//\n// CopyingInputStream implementations should avoid buffering if possible.\n// CopyingInputStreamAdaptor does its own buffering and will read data\n// in large blocks.\nclass LIBPROTOBUF_EXPORT CopyingInputStream {\n public:\n  virtual ~CopyingInputStream();\n\n  // Reads up to \"size\" bytes into the given buffer.  Returns the number of\n  // bytes read.  Read() waits until at least one byte is available, or\n  // returns zero if no bytes will ever become available (EOF), or -1 if a\n  // permanent read error occurred.\n  virtual int Read(void* buffer, int size) = 0;\n\n  // Skips the next \"count\" bytes of input.  Returns the number of bytes\n  // actually skipped.  This will always be exactly equal to \"count\" unless\n  // EOF was reached or a permanent read error occurred.\n  //\n  // The default implementation just repeatedly calls Read() into a scratch\n  // buffer.\n  virtual int Skip(int count);\n};\n\n// A ZeroCopyInputStream which reads from a CopyingInputStream.  This is\n// useful for implementing ZeroCopyInputStreams that read from traditional\n// streams.  Note that this class is not really zero-copy.\n//\n// If you want to read from file descriptors or C++ istreams, this is\n// already implemented for you:  use FileInputStream or IstreamInputStream\n// respectively.\nclass LIBPROTOBUF_EXPORT CopyingInputStreamAdaptor : public ZeroCopyInputStream {\n public:\n  // Creates a stream that reads from the given CopyingInputStream.\n  // If a block_size is given, it specifies the number of bytes that\n  // should be read and returned with each call to Next().  Otherwise,\n  // a reasonable default is used.  The caller retains ownership of\n  // copying_stream unless SetOwnsCopyingStream(true) is called.\n  explicit CopyingInputStreamAdaptor(CopyingInputStream* copying_stream,\n                                     int block_size = -1);\n  ~CopyingInputStreamAdaptor();\n\n  // Call SetOwnsCopyingStream(true) to tell the CopyingInputStreamAdaptor to\n  // delete the underlying CopyingInputStream when it is destroyed.\n  void SetOwnsCopyingStream(bool value) { owns_copying_stream_ = value; }\n\n  // implements ZeroCopyInputStream ----------------------------------\n  bool Next(const void** data, int* size);\n  void BackUp(int count);\n  bool Skip(int count);\n  int64 ByteCount() const;\n\n private:\n  // Insures that buffer_ is not NULL.\n  void AllocateBufferIfNeeded();\n  // Frees the buffer and resets buffer_used_.\n  void FreeBuffer();\n\n  // The underlying copying stream.\n  CopyingInputStream* copying_stream_;\n  bool owns_copying_stream_;\n\n  // True if we have seen a permenant error from the underlying stream.\n  bool failed_;\n\n  // The current position of copying_stream_, relative to the point where\n  // we started reading.\n  int64 position_;\n\n  // Data is read into this buffer.  It may be NULL if no buffer is currently\n  // in use.  Otherwise, it points to an array of size buffer_size_.\n  scoped_array<uint8> buffer_;\n  const int buffer_size_;\n\n  // Number of valid bytes currently in the buffer (i.e. the size last\n  // returned by Next()).  0 <= buffer_used_ <= buffer_size_.\n  int buffer_used_;\n\n  // Number of bytes in the buffer which were backed up over by a call to\n  // BackUp().  These need to be returned again.\n  // 0 <= backup_bytes_ <= buffer_used_\n  int backup_bytes_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingInputStreamAdaptor);\n};\n\n// ===================================================================\n\n// A generic traditional output stream interface.\n//\n// Lots of traditional output streams (e.g. file descriptors, C stdio\n// streams, and C++ iostreams) expose an interface where every write\n// involves copying bytes from a buffer.  If you want to take such an\n// interface and make a ZeroCopyOutputStream based on it, simply implement\n// CopyingOutputStream and then use CopyingOutputStreamAdaptor.\n//\n// CopyingOutputStream implementations should avoid buffering if possible.\n// CopyingOutputStreamAdaptor does its own buffering and will write data\n// in large blocks.\nclass LIBPROTOBUF_EXPORT CopyingOutputStream {\n public:\n  virtual ~CopyingOutputStream();\n\n  // Writes \"size\" bytes from the given buffer to the output.  Returns true\n  // if successful, false on a write error.\n  virtual bool Write(const void* buffer, int size) = 0;\n};\n\n// A ZeroCopyOutputStream which writes to a CopyingOutputStream.  This is\n// useful for implementing ZeroCopyOutputStreams that write to traditional\n// streams.  Note that this class is not really zero-copy.\n//\n// If you want to write to file descriptors or C++ ostreams, this is\n// already implemented for you:  use FileOutputStream or OstreamOutputStream\n// respectively.\nclass LIBPROTOBUF_EXPORT CopyingOutputStreamAdaptor : public ZeroCopyOutputStream {\n public:\n  // Creates a stream that writes to the given Unix file descriptor.\n  // If a block_size is given, it specifies the size of the buffers\n  // that should be returned by Next().  Otherwise, a reasonable default\n  // is used.\n  explicit CopyingOutputStreamAdaptor(CopyingOutputStream* copying_stream,\n                                      int block_size = -1);\n  ~CopyingOutputStreamAdaptor();\n\n  // Writes all pending data to the underlying stream.  Returns false if a\n  // write error occurred on the underlying stream.  (The underlying\n  // stream itself is not necessarily flushed.)\n  bool Flush();\n\n  // Call SetOwnsCopyingStream(true) to tell the CopyingOutputStreamAdaptor to\n  // delete the underlying CopyingOutputStream when it is destroyed.\n  void SetOwnsCopyingStream(bool value) { owns_copying_stream_ = value; }\n\n  // implements ZeroCopyOutputStream ---------------------------------\n  bool Next(void** data, int* size);\n  void BackUp(int count);\n  int64 ByteCount() const;\n\n private:\n  // Write the current buffer, if it is present.\n  bool WriteBuffer();\n  // Insures that buffer_ is not NULL.\n  void AllocateBufferIfNeeded();\n  // Frees the buffer.\n  void FreeBuffer();\n\n  // The underlying copying stream.\n  CopyingOutputStream* copying_stream_;\n  bool owns_copying_stream_;\n\n  // True if we have seen a permenant error from the underlying stream.\n  bool failed_;\n\n  // The current position of copying_stream_, relative to the point where\n  // we started writing.\n  int64 position_;\n\n  // Data is written from this buffer.  It may be NULL if no buffer is\n  // currently in use.  Otherwise, it points to an array of size buffer_size_.\n  scoped_array<uint8> buffer_;\n  const int buffer_size_;\n\n  // Number of valid bytes currently in the buffer (i.e. the size last\n  // returned by Next()).  When BackUp() is called, we just reduce this.\n  // 0 <= buffer_used_ <= buffer_size_.\n  int buffer_used_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingOutputStreamAdaptor);\n};\n\n// ===================================================================\n\n}  // namespace io\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Testing strategy:  For each type of I/O (array, string, file, etc.) we\n// create an output stream and write some data to it, then create a\n// corresponding input stream to read the same data back and expect it to\n// match.  When the data is written, it is written in several small chunks\n// of varying sizes, with a BackUp() after each chunk.  It is read back\n// similarly, but with chunks separated at different points.  The whole\n// process is run with a variety of block sizes for both the input and\n// the output.\n//\n// TODO(kenton):  Rewrite this test to bring it up to the standards of all\n//   the other proto2 tests.  May want to wait for gTest to implement\n//   \"parametized tests\" so that one set of tests can be used on all the\n//   implementations.\n\n#include \"config.h\"\n\n#ifdef _MSC_VER\n#include <io.h>\n#else\n#include <unistd.h>\n#endif\n#include <stdlib.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <sstream>\n\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/io/coded_stream.h>\n\n#if HAVE_ZLIB\n#include <google/protobuf/io/gzip_stream.h>\n#endif\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/testing/googletest.h>\n#include <google/protobuf/testing/file.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace io {\nnamespace {\n\n#ifdef _WIN32\n#define pipe(fds) _pipe(fds, 4096, O_BINARY)\n#endif\n\n#ifndef O_BINARY\n#ifdef _O_BINARY\n#define O_BINARY _O_BINARY\n#else\n#define O_BINARY 0     // If this isn't defined, the platform doesn't need it.\n#endif\n#endif\n\nclass IoTest : public testing::Test {\n protected:\n  // Test helpers.\n\n  // Helper to write an array of data to an output stream.\n  bool WriteToOutput(ZeroCopyOutputStream* output, const void* data, int size);\n  // Helper to read a fixed-length array of data from an input stream.\n  int ReadFromInput(ZeroCopyInputStream* input, void* data, int size);\n  // Write a string to the output stream.\n  void WriteString(ZeroCopyOutputStream* output, const string& str);\n  // Read a number of bytes equal to the size of the given string and checks\n  // that it matches the string.\n  void ReadString(ZeroCopyInputStream* input, const string& str);\n  // Writes some text to the output stream in a particular order.  Returns\n  // the number of bytes written, incase the caller needs that to set up an\n  // input stream.\n  int WriteStuff(ZeroCopyOutputStream* output);\n  // Reads text from an input stream and expects it to match what\n  // WriteStuff() writes.\n  void ReadStuff(ZeroCopyInputStream* input);\n\n  // Similar to WriteStuff, but performs more sophisticated testing.\n  int WriteStuffLarge(ZeroCopyOutputStream* output);\n  // Reads and tests a stream that should have been written to\n  // via WriteStuffLarge().\n  void ReadStuffLarge(ZeroCopyInputStream* input);\n\n#if HAVE_ZLIB\n  string Compress(const string& data, const GzipOutputStream::Options& options);\n  string Uncompress(const string& data);\n#endif\n\n  static const int kBlockSizes[];\n  static const int kBlockSizeCount;\n};\n\nconst int IoTest::kBlockSizes[] = {-1, 1, 2, 5, 7, 10, 23, 64};\nconst int IoTest::kBlockSizeCount = GOOGLE_ARRAYSIZE(IoTest::kBlockSizes);\n\nbool IoTest::WriteToOutput(ZeroCopyOutputStream* output,\n                           const void* data, int size) {\n  const uint8* in = reinterpret_cast<const uint8*>(data);\n  int in_size = size;\n\n  void* out;\n  int out_size;\n\n  while (true) {\n    if (!output->Next(&out, &out_size)) {\n      return false;\n    }\n    EXPECT_GT(out_size, 0);\n\n    if (in_size <= out_size) {\n      memcpy(out, in, in_size);\n      output->BackUp(out_size - in_size);\n      return true;\n    }\n\n    memcpy(out, in, out_size);\n    in += out_size;\n    in_size -= out_size;\n  }\n}\n\n#define MAX_REPEATED_ZEROS 100\n\nint IoTest::ReadFromInput(ZeroCopyInputStream* input, void* data, int size) {\n  uint8* out = reinterpret_cast<uint8*>(data);\n  int out_size = size;\n\n  const void* in;\n  int in_size = 0;\n\n  int repeated_zeros = 0;\n\n  while (true) {\n    if (!input->Next(&in, &in_size)) {\n      return size - out_size;\n    }\n    EXPECT_GT(in_size, -1);\n    if (in_size == 0) {\n      repeated_zeros++;\n    } else {\n      repeated_zeros = 0;\n    }\n    EXPECT_LT(repeated_zeros, MAX_REPEATED_ZEROS);\n\n    if (out_size <= in_size) {\n      memcpy(out, in, out_size);\n      if (in_size > out_size) {\n        input->BackUp(in_size - out_size);\n      }\n      return size;  // Copied all of it.\n    }\n\n    memcpy(out, in, in_size);\n    out += in_size;\n    out_size -= in_size;\n  }\n}\n\nvoid IoTest::WriteString(ZeroCopyOutputStream* output, const string& str) {\n  EXPECT_TRUE(WriteToOutput(output, str.c_str(), str.size()));\n}\n\nvoid IoTest::ReadString(ZeroCopyInputStream* input, const string& str) {\n  scoped_array<char> buffer(new char[str.size() + 1]);\n  buffer[str.size()] = '\\0';\n  EXPECT_EQ(ReadFromInput(input, buffer.get(), str.size()), str.size());\n  EXPECT_STREQ(str.c_str(), buffer.get());\n}\n\nint IoTest::WriteStuff(ZeroCopyOutputStream* output) {\n  WriteString(output, \"Hello world!\\n\");\n  WriteString(output, \"Some te\");\n  WriteString(output, \"xt.  Blah blah.\");\n  WriteString(output, \"abcdefg\");\n  WriteString(output, \"01234567890123456789\");\n  WriteString(output, \"foobar\");\n\n  EXPECT_EQ(output->ByteCount(), 68);\n\n  int result = output->ByteCount();\n  return result;\n}\n\n// Reads text from an input stream and expects it to match what WriteStuff()\n// writes.\nvoid IoTest::ReadStuff(ZeroCopyInputStream* input) {\n  ReadString(input, \"Hello world!\\n\");\n  ReadString(input, \"Some text.  \");\n  ReadString(input, \"Blah \");\n  ReadString(input, \"blah.\");\n  ReadString(input, \"abcdefg\");\n  EXPECT_TRUE(input->Skip(20));\n  ReadString(input, \"foo\");\n  ReadString(input, \"bar\");\n\n  EXPECT_EQ(input->ByteCount(), 68);\n\n  uint8 byte;\n  EXPECT_EQ(ReadFromInput(input, &byte, 1), 0);\n}\n\nint IoTest::WriteStuffLarge(ZeroCopyOutputStream* output) {\n  WriteString(output, \"Hello world!\\n\");\n  WriteString(output, \"Some te\");\n  WriteString(output, \"xt.  Blah blah.\");\n  WriteString(output, string(100000, 'x'));  // A very long string\n  WriteString(output, string(100000, 'y'));  // A very long string\n  WriteString(output, \"01234567890123456789\");\n\n  EXPECT_EQ(output->ByteCount(), 200055);\n\n  int result = output->ByteCount();\n  return result;\n}\n\n// Reads text from an input stream and expects it to match what WriteStuff()\n// writes.\nvoid IoTest::ReadStuffLarge(ZeroCopyInputStream* input) {\n  ReadString(input, \"Hello world!\\nSome text.  \");\n  EXPECT_TRUE(input->Skip(5));\n  ReadString(input, \"blah.\");\n  EXPECT_TRUE(input->Skip(100000 - 10));\n  ReadString(input, string(10, 'x') + string(100000 - 20000, 'y'));\n  EXPECT_TRUE(input->Skip(20000 - 10));\n  ReadString(input, \"yyyyyyyyyy01234567890123456789\");\n\n  EXPECT_EQ(input->ByteCount(), 200055);\n\n  uint8 byte;\n  EXPECT_EQ(ReadFromInput(input, &byte, 1), 0);\n}\n\n// ===================================================================\n\nTEST_F(IoTest, ArrayIo) {\n  const int kBufferSize = 256;\n  uint8 buffer[kBufferSize];\n\n  for (int i = 0; i < kBlockSizeCount; i++) {\n    for (int j = 0; j < kBlockSizeCount; j++) {\n      int size;\n      {\n        ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]);\n        size = WriteStuff(&output);\n      }\n      {\n        ArrayInputStream input(buffer, size, kBlockSizes[j]);\n        ReadStuff(&input);\n      }\n    }\n  }\n}\n\nTEST_F(IoTest, TwoSessionWrite) {\n  // Test that two concatenated write sessions read correctly\n\n  static const char* strA = \"0123456789\";\n  static const char* strB = \"WhirledPeas\";\n  const int kBufferSize = 2*1024;\n  uint8* buffer = new uint8[kBufferSize];\n  char* temp_buffer = new char[40];\n\n  for (int i = 0; i < kBlockSizeCount; i++) {\n    for (int j = 0; j < kBlockSizeCount; j++) {\n      ArrayOutputStream* output =\n          new ArrayOutputStream(buffer, kBufferSize, kBlockSizes[i]);\n      CodedOutputStream* coded_output = new CodedOutputStream(output);\n      coded_output->WriteVarint32(strlen(strA));\n      coded_output->WriteRaw(strA, strlen(strA));\n      delete coded_output;  // flush\n      int64 pos = output->ByteCount();\n      delete output;\n      output = new ArrayOutputStream(\n          buffer + pos, kBufferSize - pos, kBlockSizes[i]);\n      coded_output = new CodedOutputStream(output);\n      coded_output->WriteVarint32(strlen(strB));\n      coded_output->WriteRaw(strB, strlen(strB));\n      delete coded_output;  // flush\n      int64 size = pos + output->ByteCount();\n      delete output;\n\n      ArrayInputStream* input =\n          new ArrayInputStream(buffer, size, kBlockSizes[j]);\n      CodedInputStream* coded_input = new CodedInputStream(input);\n      uint32 insize;\n      EXPECT_TRUE(coded_input->ReadVarint32(&insize));\n      EXPECT_EQ(strlen(strA), insize);\n      EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize));\n      EXPECT_EQ(0, memcmp(temp_buffer, strA, insize));\n\n      EXPECT_TRUE(coded_input->ReadVarint32(&insize));\n      EXPECT_EQ(strlen(strB), insize);\n      EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize));\n      EXPECT_EQ(0, memcmp(temp_buffer, strB, insize));\n\n      delete coded_input;\n      delete input;\n    }\n  }\n\n  delete [] temp_buffer;\n  delete [] buffer;\n}\n\n#if HAVE_ZLIB\nTEST_F(IoTest, GzipIo) {\n  const int kBufferSize = 2*1024;\n  uint8* buffer = new uint8[kBufferSize];\n  for (int i = 0; i < kBlockSizeCount; i++) {\n    for (int j = 0; j < kBlockSizeCount; j++) {\n      for (int z = 0; z < kBlockSizeCount; z++) {\n        int gzip_buffer_size = kBlockSizes[z];\n        int size;\n        {\n          ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]);\n          GzipOutputStream::Options options;\n          options.format = GzipOutputStream::GZIP;\n          if (gzip_buffer_size != -1) {\n            options.buffer_size = gzip_buffer_size;\n          }\n          GzipOutputStream gzout(&output, options);\n          WriteStuff(&gzout);\n          gzout.Close();\n          size = output.ByteCount();\n        }\n        {\n          ArrayInputStream input(buffer, size, kBlockSizes[j]);\n          GzipInputStream gzin(\n              &input, GzipInputStream::GZIP, gzip_buffer_size);\n          ReadStuff(&gzin);\n        }\n      }\n    }\n  }\n  delete [] buffer;\n}\n\nTEST_F(IoTest, ZlibIo) {\n  const int kBufferSize = 2*1024;\n  uint8* buffer = new uint8[kBufferSize];\n  for (int i = 0; i < kBlockSizeCount; i++) {\n    for (int j = 0; j < kBlockSizeCount; j++) {\n      for (int z = 0; z < kBlockSizeCount; z++) {\n        int gzip_buffer_size = kBlockSizes[z];\n        int size;\n        {\n          ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]);\n          GzipOutputStream::Options options;\n          options.format = GzipOutputStream::ZLIB;\n          if (gzip_buffer_size != -1) {\n            options.buffer_size = gzip_buffer_size;\n          }\n          GzipOutputStream gzout(&output, options);\n          WriteStuff(&gzout);\n          gzout.Close();\n          size = output.ByteCount();\n        }\n        {\n          ArrayInputStream input(buffer, size, kBlockSizes[j]);\n          GzipInputStream gzin(\n              &input, GzipInputStream::ZLIB, gzip_buffer_size);\n          ReadStuff(&gzin);\n        }\n      }\n    }\n  }\n  delete [] buffer;\n}\n\nTEST_F(IoTest, ZlibIoInputAutodetect) {\n  const int kBufferSize = 2*1024;\n  uint8* buffer = new uint8[kBufferSize];\n  int size;\n  {\n    ArrayOutputStream output(buffer, kBufferSize);\n    GzipOutputStream::Options options;\n    options.format = GzipOutputStream::ZLIB;\n    GzipOutputStream gzout(&output, options);\n    WriteStuff(&gzout);\n    gzout.Close();\n    size = output.ByteCount();\n  }\n  {\n    ArrayInputStream input(buffer, size);\n    GzipInputStream gzin(&input, GzipInputStream::AUTO);\n    ReadStuff(&gzin);\n  }\n  {\n    ArrayOutputStream output(buffer, kBufferSize);\n    GzipOutputStream::Options options;\n    options.format = GzipOutputStream::GZIP;\n    GzipOutputStream gzout(&output, options);\n    WriteStuff(&gzout);\n    gzout.Close();\n    size = output.ByteCount();\n  }\n  {\n    ArrayInputStream input(buffer, size);\n    GzipInputStream gzin(&input, GzipInputStream::AUTO);\n    ReadStuff(&gzin);\n  }\n  delete [] buffer;\n}\n\nstring IoTest::Compress(const string& data,\n                        const GzipOutputStream::Options& options) {\n  string result;\n  {\n    StringOutputStream output(&result);\n    GzipOutputStream gzout(&output, options);\n    WriteToOutput(&gzout, data.data(), data.size());\n  }\n  return result;\n}\n\nstring IoTest::Uncompress(const string& data) {\n  string result;\n  {\n    ArrayInputStream input(data.data(), data.size());\n    GzipInputStream gzin(&input);\n    const void* buffer;\n    int size;\n    while (gzin.Next(&buffer, &size)) {\n      result.append(reinterpret_cast<const char*>(buffer), size);\n    }\n  }\n  return result;\n}\n\nTEST_F(IoTest, CompressionOptions) {\n  // Some ad-hoc testing of compression options.\n\n  string golden;\n  File::ReadFileToStringOrDie(\n    TestSourceDir() + \"/google/protobuf/testdata/golden_message\",\n    &golden);\n\n  GzipOutputStream::Options options;\n  string gzip_compressed = Compress(golden, options);\n\n  options.compression_level = 0;\n  string not_compressed = Compress(golden, options);\n\n  // Try zlib compression for fun.\n  options = GzipOutputStream::Options();\n  options.format = GzipOutputStream::ZLIB;\n  string zlib_compressed = Compress(golden, options);\n\n  // Uncompressed should be bigger than the original since it should have some\n  // sort of header.\n  EXPECT_GT(not_compressed.size(), golden.size());\n\n  // Higher compression levels should result in smaller sizes.\n  EXPECT_LT(zlib_compressed.size(), not_compressed.size());\n\n  // ZLIB format should differ from GZIP format.\n  EXPECT_TRUE(zlib_compressed != gzip_compressed);\n\n  // Everything should decompress correctly.\n  EXPECT_TRUE(Uncompress(not_compressed) == golden);\n  EXPECT_TRUE(Uncompress(gzip_compressed) == golden);\n  EXPECT_TRUE(Uncompress(zlib_compressed) == golden);\n}\n\nTEST_F(IoTest, TwoSessionWriteGzip) {\n  // Test that two concatenated gzip streams can be read correctly\n\n  static const char* strA = \"0123456789\";\n  static const char* strB = \"QuickBrownFox\";\n  const int kBufferSize = 2*1024;\n  uint8* buffer = new uint8[kBufferSize];\n  char* temp_buffer = new char[40];\n\n  for (int i = 0; i < kBlockSizeCount; i++) {\n    for (int j = 0; j < kBlockSizeCount; j++) {\n      ArrayOutputStream* output =\n          new ArrayOutputStream(buffer, kBufferSize, kBlockSizes[i]);\n      GzipOutputStream* gzout = new GzipOutputStream(output);\n      CodedOutputStream* coded_output = new CodedOutputStream(gzout);\n      int32 outlen = strlen(strA) + 1;\n      coded_output->WriteVarint32(outlen);\n      coded_output->WriteRaw(strA, outlen);\n      delete coded_output;  // flush\n      delete gzout;  // flush\n      int64 pos = output->ByteCount();\n      delete output;\n      output = new ArrayOutputStream(\n          buffer + pos, kBufferSize - pos, kBlockSizes[i]);\n      gzout = new GzipOutputStream(output);\n      coded_output = new CodedOutputStream(gzout);\n      outlen = strlen(strB) + 1;\n      coded_output->WriteVarint32(outlen);\n      coded_output->WriteRaw(strB, outlen);\n      delete coded_output;  // flush\n      delete gzout;  // flush\n      int64 size = pos + output->ByteCount();\n      delete output;\n\n      ArrayInputStream* input =\n          new ArrayInputStream(buffer, size, kBlockSizes[j]);\n      GzipInputStream* gzin = new GzipInputStream(input);\n      CodedInputStream* coded_input = new CodedInputStream(gzin);\n      uint32 insize;\n      EXPECT_TRUE(coded_input->ReadVarint32(&insize));\n      EXPECT_EQ(strlen(strA) + 1, insize);\n      EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize));\n      EXPECT_EQ(0, memcmp(temp_buffer, strA, insize))\n          << \"strA=\" << strA << \" in=\" << temp_buffer;\n\n      EXPECT_TRUE(coded_input->ReadVarint32(&insize));\n      EXPECT_EQ(strlen(strB) + 1, insize);\n      EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize));\n      EXPECT_EQ(0, memcmp(temp_buffer, strB, insize))\n          << \" out_block_size=\" << kBlockSizes[i]\n          << \" in_block_size=\" << kBlockSizes[j]\n          << \" pos=\" << pos\n          << \" size=\" << size\n          << \" strB=\" << strB << \" in=\" << temp_buffer;\n\n      delete coded_input;\n      delete gzin;\n      delete input;\n    }\n  }\n\n  delete [] temp_buffer;\n  delete [] buffer;\n}\n#endif\n\n// There is no string input, only string output.  Also, it doesn't support\n// explicit block sizes.  So, we'll only run one test and we'll use\n// ArrayInput to read back the results.\nTEST_F(IoTest, StringIo) {\n  string str;\n  {\n    StringOutputStream output(&str);\n    WriteStuff(&output);\n  }\n  {\n    ArrayInputStream input(str.data(), str.size());\n    ReadStuff(&input);\n  }\n}\n\n\n// To test files, we create a temporary file, write, read, truncate, repeat.\nTEST_F(IoTest, FileIo) {\n  string filename = TestTempDir() + \"/zero_copy_stream_test_file\";\n\n  for (int i = 0; i < kBlockSizeCount; i++) {\n    for (int j = 0; j < kBlockSizeCount; j++) {\n      // Make a temporary file.\n      int file =\n        open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0777);\n      ASSERT_GE(file, 0);\n\n      {\n        FileOutputStream output(file, kBlockSizes[i]);\n        WriteStuff(&output);\n        EXPECT_EQ(0, output.GetErrno());\n      }\n\n      // Rewind.\n      ASSERT_NE(lseek(file, 0, SEEK_SET), (off_t)-1);\n\n      {\n        FileInputStream input(file, kBlockSizes[j]);\n        ReadStuff(&input);\n        EXPECT_EQ(0, input.GetErrno());\n      }\n\n      close(file);\n    }\n  }\n}\n\n#if HAVE_ZLIB\nTEST_F(IoTest, GzipFileIo) {\n  string filename = TestTempDir() + \"/zero_copy_stream_test_file\";\n\n  for (int i = 0; i < kBlockSizeCount; i++) {\n    for (int j = 0; j < kBlockSizeCount; j++) {\n      // Make a temporary file.\n      int file =\n        open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0777);\n      ASSERT_GE(file, 0);\n      {\n        FileOutputStream output(file, kBlockSizes[i]);\n        GzipOutputStream gzout(&output);\n        WriteStuffLarge(&gzout);\n        gzout.Close();\n        output.Flush();\n        EXPECT_EQ(0, output.GetErrno());\n      }\n\n      // Rewind.\n      ASSERT_NE(lseek(file, 0, SEEK_SET), (off_t)-1);\n\n      {\n        FileInputStream input(file, kBlockSizes[j]);\n        GzipInputStream gzin(&input);\n        ReadStuffLarge(&gzin);\n        EXPECT_EQ(0, input.GetErrno());\n      }\n\n      close(file);\n    }\n  }\n}\n#endif\n\n// MSVC raises various debugging exceptions if we try to use a file\n// descriptor of -1, defeating our tests below.  This class will disable\n// these debug assertions while in scope.\nclass MsvcDebugDisabler {\n public:\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n  MsvcDebugDisabler() {\n    old_handler_ = _set_invalid_parameter_handler(MyHandler);\n    old_mode_ = _CrtSetReportMode(_CRT_ASSERT, 0);\n  }\n  ~MsvcDebugDisabler() {\n    old_handler_ = _set_invalid_parameter_handler(old_handler_);\n    old_mode_ = _CrtSetReportMode(_CRT_ASSERT, old_mode_);\n  }\n\n  static void MyHandler(const wchar_t *expr,\n                        const wchar_t *func,\n                        const wchar_t *file,\n                        unsigned int line,\n                        uintptr_t pReserved) {\n    // do nothing\n  }\n\n  _invalid_parameter_handler old_handler_;\n  int old_mode_;\n#else\n  // Dummy constructor and destructor to ensure that GCC doesn't complain\n  // that debug_disabler is an unused variable.\n  MsvcDebugDisabler() {}\n  ~MsvcDebugDisabler() {}\n#endif\n};\n\n// Test that FileInputStreams report errors correctly.\nTEST_F(IoTest, FileReadError) {\n  MsvcDebugDisabler debug_disabler;\n\n  // -1 = invalid file descriptor.\n  FileInputStream input(-1);\n\n  const void* buffer;\n  int size;\n  EXPECT_FALSE(input.Next(&buffer, &size));\n  EXPECT_EQ(EBADF, input.GetErrno());\n}\n\n// Test that FileOutputStreams report errors correctly.\nTEST_F(IoTest, FileWriteError) {\n  MsvcDebugDisabler debug_disabler;\n\n  // -1 = invalid file descriptor.\n  FileOutputStream input(-1);\n\n  void* buffer;\n  int size;\n\n  // The first call to Next() succeeds because it doesn't have anything to\n  // write yet.\n  EXPECT_TRUE(input.Next(&buffer, &size));\n\n  // Second call fails.\n  EXPECT_FALSE(input.Next(&buffer, &size));\n\n  EXPECT_EQ(EBADF, input.GetErrno());\n}\n\n// Pipes are not seekable, so File{Input,Output}Stream ends up doing some\n// different things to handle them.  We'll test by writing to a pipe and\n// reading back from it.\nTEST_F(IoTest, PipeIo) {\n  int files[2];\n\n  for (int i = 0; i < kBlockSizeCount; i++) {\n    for (int j = 0; j < kBlockSizeCount; j++) {\n      // Need to create a new pipe each time because ReadStuff() expects\n      // to see EOF at the end.\n      ASSERT_EQ(pipe(files), 0);\n\n      {\n        FileOutputStream output(files[1], kBlockSizes[i]);\n        WriteStuff(&output);\n        EXPECT_EQ(0, output.GetErrno());\n      }\n      close(files[1]);  // Send EOF.\n\n      {\n        FileInputStream input(files[0], kBlockSizes[j]);\n        ReadStuff(&input);\n        EXPECT_EQ(0, input.GetErrno());\n      }\n      close(files[0]);\n    }\n  }\n}\n\n// Test using C++ iostreams.\nTEST_F(IoTest, IostreamIo) {\n  for (int i = 0; i < kBlockSizeCount; i++) {\n    for (int j = 0; j < kBlockSizeCount; j++) {\n      {\n        stringstream stream;\n\n        {\n          OstreamOutputStream output(&stream, kBlockSizes[i]);\n          WriteStuff(&output);\n          EXPECT_FALSE(stream.fail());\n        }\n\n        {\n          IstreamInputStream input(&stream, kBlockSizes[j]);\n          ReadStuff(&input);\n          EXPECT_TRUE(stream.eof());\n        }\n      }\n\n      {\n        stringstream stream;\n\n        {\n          OstreamOutputStream output(&stream, kBlockSizes[i]);\n          WriteStuffLarge(&output);\n          EXPECT_FALSE(stream.fail());\n        }\n\n        {\n          IstreamInputStream input(&stream, kBlockSizes[j]);\n          ReadStuffLarge(&input);\n          EXPECT_TRUE(stream.eof());\n        }\n      }\n    }\n  }\n}\n\n// To test ConcatenatingInputStream, we create several ArrayInputStreams\n// covering a buffer and then concatenate them.\nTEST_F(IoTest, ConcatenatingInputStream) {\n  const int kBufferSize = 256;\n  uint8 buffer[kBufferSize];\n\n  // Fill the buffer.\n  ArrayOutputStream output(buffer, kBufferSize);\n  WriteStuff(&output);\n\n  // Now split it up into multiple streams of varying sizes.\n  ASSERT_EQ(68, output.ByteCount());  // Test depends on this.\n  ArrayInputStream input1(buffer     , 12);\n  ArrayInputStream input2(buffer + 12,  7);\n  ArrayInputStream input3(buffer + 19,  6);\n  ArrayInputStream input4(buffer + 25, 15);\n  ArrayInputStream input5(buffer + 40,  0);\n  // Note:  We want to make sure we have a stream boundary somewhere between\n  // bytes 42 and 62, which is the range that it Skip()ed by ReadStuff().  This\n  // tests that a bug that existed in the original code for Skip() is fixed.\n  ArrayInputStream input6(buffer + 40, 10);\n  ArrayInputStream input7(buffer + 50, 18);  // Total = 68 bytes.\n\n  ZeroCopyInputStream* streams[] =\n    {&input1, &input2, &input3, &input4, &input5, &input6, &input7};\n\n  // Create the concatenating stream and read.\n  ConcatenatingInputStream input(streams, GOOGLE_ARRAYSIZE(streams));\n  ReadStuff(&input);\n}\n\n// To test LimitingInputStream, we write our golden text to a buffer, then\n// create an ArrayInputStream that contains the whole buffer (not just the\n// bytes written), then use a LimitingInputStream to limit it just to the\n// bytes written.\nTEST_F(IoTest, LimitingInputStream) {\n  const int kBufferSize = 256;\n  uint8 buffer[kBufferSize];\n\n  // Fill the buffer.\n  ArrayOutputStream output(buffer, kBufferSize);\n  WriteStuff(&output);\n\n  // Set up input.\n  ArrayInputStream array_input(buffer, kBufferSize);\n  LimitingInputStream input(&array_input, output.ByteCount());\n\n  ReadStuff(&input);\n}\n\n// Check that a zero-size array doesn't confuse the code.\nTEST(ZeroSizeArray, Input) {\n  ArrayInputStream input(NULL, 0);\n  const void* data;\n  int size;\n  EXPECT_FALSE(input.Next(&data, &size));\n}\n\nTEST(ZeroSizeArray, Output) {\n  ArrayOutputStream output(NULL, 0);\n  void* data;\n  int size;\n  EXPECT_FALSE(output.Next(&data, &size));\n}\n\n}  // namespace\n}  // namespace io\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/lite_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\n#include <string>\n#include <iostream>\n\n#include <google/protobuf/test_util_lite.h>\n#include <google/protobuf/stubs/common.h>\n\nusing namespace std;\n\nint main(int argc, char* argv[]) {\n  string data, packed_data;\n\n  {\n    protobuf_unittest::TestAllTypesLite message, message2, message3;\n    google::protobuf::TestUtilLite::ExpectClear(message);\n    google::protobuf::TestUtilLite::SetAllFields(&message);\n    message2.CopyFrom(message);\n    data = message.SerializeAsString();\n    message3.ParseFromString(data);\n    google::protobuf::TestUtilLite::ExpectAllFieldsSet(message);\n    google::protobuf::TestUtilLite::ExpectAllFieldsSet(message2);\n    google::protobuf::TestUtilLite::ExpectAllFieldsSet(message3);\n    google::protobuf::TestUtilLite::ModifyRepeatedFields(&message);\n    google::protobuf::TestUtilLite::ExpectRepeatedFieldsModified(message);\n    message.Clear();\n    google::protobuf::TestUtilLite::ExpectClear(message);\n  }\n\n  {\n    protobuf_unittest::TestAllExtensionsLite message, message2, message3;\n    google::protobuf::TestUtilLite::ExpectExtensionsClear(message);\n    google::protobuf::TestUtilLite::SetAllExtensions(&message);\n    message2.CopyFrom(message);\n    string extensions_data = message.SerializeAsString();\n    GOOGLE_CHECK(extensions_data == data);\n    message3.ParseFromString(extensions_data);\n    google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message);\n    google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message2);\n    google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message3);\n    google::protobuf::TestUtilLite::ModifyRepeatedExtensions(&message);\n    google::protobuf::TestUtilLite::ExpectRepeatedExtensionsModified(message);\n    message.Clear();\n    google::protobuf::TestUtilLite::ExpectExtensionsClear(message);\n  }\n\n  {\n    protobuf_unittest::TestPackedTypesLite message, message2, message3;\n    google::protobuf::TestUtilLite::ExpectPackedClear(message);\n    google::protobuf::TestUtilLite::SetPackedFields(&message);\n    message2.CopyFrom(message);\n    packed_data = message.SerializeAsString();\n    message3.ParseFromString(packed_data);\n    google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message);\n    google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message2);\n    google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message3);\n    google::protobuf::TestUtilLite::ModifyPackedFields(&message);\n    google::protobuf::TestUtilLite::ExpectPackedFieldsModified(message);\n    message.Clear();\n    google::protobuf::TestUtilLite::ExpectPackedClear(message);\n  }\n\n  {\n    protobuf_unittest::TestPackedExtensionsLite message, message2, message3;\n    google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message);\n    google::protobuf::TestUtilLite::SetPackedExtensions(&message);\n    message2.CopyFrom(message);\n    string packed_extensions_data = message.SerializeAsString();\n    GOOGLE_CHECK(packed_extensions_data == packed_data);\n    message3.ParseFromString(packed_extensions_data);\n    google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message);\n    google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message2);\n    google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message3);\n    google::protobuf::TestUtilLite::ModifyPackedExtensions(&message);\n    google::protobuf::TestUtilLite::ExpectPackedExtensionsModified(message);\n    message.Clear();\n    google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message);\n  }\n\n  cout << \"PASS\" << endl;\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <stack>\n#include <google/protobuf/stubs/hash.h>\n\n#include <google/protobuf/message.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/once.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/reflection_ops.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/map-util.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\nnamespace google {\nnamespace protobuf {\n\nusing internal::WireFormat;\nusing internal::ReflectionOps;\n\nMessage::~Message() {}\n\nvoid Message::MergeFrom(const Message& from) {\n  const Descriptor* descriptor = GetDescriptor();\n  GOOGLE_CHECK_EQ(from.GetDescriptor(), descriptor)\n    << \": Tried to merge from a message with a different type.  \"\n       \"to: \" << descriptor->full_name() << \", \"\n       \"from:\" << from.GetDescriptor()->full_name();\n  ReflectionOps::Merge(from, this);\n}\n\nvoid Message::CheckTypeAndMergeFrom(const MessageLite& other) {\n  MergeFrom(*down_cast<const Message*>(&other));\n}\n\nvoid Message::CopyFrom(const Message& from) {\n  const Descriptor* descriptor = GetDescriptor();\n  GOOGLE_CHECK_EQ(from.GetDescriptor(), descriptor)\n    << \": Tried to copy from a message with a different type.\"\n       \"to: \" << descriptor->full_name() << \", \"\n       \"from:\" << from.GetDescriptor()->full_name();\n  ReflectionOps::Copy(from, this);\n}\n\nstring Message::GetTypeName() const {\n  return GetDescriptor()->full_name();\n}\n\nvoid Message::Clear() {\n  ReflectionOps::Clear(this);\n}\n\nbool Message::IsInitialized() const {\n  return ReflectionOps::IsInitialized(*this);\n}\n\nvoid Message::FindInitializationErrors(vector<string>* errors) const {\n  return ReflectionOps::FindInitializationErrors(*this, \"\", errors);\n}\n\nstring Message::InitializationErrorString() const {\n  vector<string> errors;\n  FindInitializationErrors(&errors);\n  return JoinStrings(errors, \", \");\n}\n\nvoid Message::CheckInitialized() const {\n  GOOGLE_CHECK(IsInitialized())\n    << \"Message of type \\\"\" << GetDescriptor()->full_name()\n    << \"\\\" is missing required fields: \" << InitializationErrorString();\n}\n\nvoid Message::DiscardUnknownFields() {\n  return ReflectionOps::DiscardUnknownFields(this);\n}\n\nbool Message::MergePartialFromCodedStream(io::CodedInputStream* input) {\n  return WireFormat::ParseAndMergePartial(input, this);\n}\n\nbool Message::ParseFromFileDescriptor(int file_descriptor) {\n  io::FileInputStream input(file_descriptor);\n  return ParseFromZeroCopyStream(&input) && input.GetErrno() == 0;\n}\n\nbool Message::ParsePartialFromFileDescriptor(int file_descriptor) {\n  io::FileInputStream input(file_descriptor);\n  return ParsePartialFromZeroCopyStream(&input) && input.GetErrno() == 0;\n}\n\nbool Message::ParseFromIstream(istream* input) {\n  io::IstreamInputStream zero_copy_input(input);\n  return ParseFromZeroCopyStream(&zero_copy_input) && input->eof();\n}\n\nbool Message::ParsePartialFromIstream(istream* input) {\n  io::IstreamInputStream zero_copy_input(input);\n  return ParsePartialFromZeroCopyStream(&zero_copy_input) && input->eof();\n}\n\n\nvoid Message::SerializeWithCachedSizes(\n    io::CodedOutputStream* output) const {\n  WireFormat::SerializeWithCachedSizes(*this, GetCachedSize(), output);\n}\n\nint Message::ByteSize() const {\n  int size = WireFormat::ByteSize(*this);\n  SetCachedSize(size);\n  return size;\n}\n\nvoid Message::SetCachedSize(int size) const {\n  GOOGLE_LOG(FATAL) << \"Message class \\\"\" << GetDescriptor()->full_name()\n             << \"\\\" implements neither SetCachedSize() nor ByteSize().  \"\n                \"Must implement one or the other.\";\n}\n\nint Message::SpaceUsed() const {\n  return GetReflection()->SpaceUsed(*this);\n}\n\nbool Message::SerializeToFileDescriptor(int file_descriptor) const {\n  io::FileOutputStream output(file_descriptor);\n  return SerializeToZeroCopyStream(&output);\n}\n\nbool Message::SerializePartialToFileDescriptor(int file_descriptor) const {\n  io::FileOutputStream output(file_descriptor);\n  return SerializePartialToZeroCopyStream(&output);\n}\n\nbool Message::SerializeToOstream(ostream* output) const {\n  {\n    io::OstreamOutputStream zero_copy_output(output);\n    if (!SerializeToZeroCopyStream(&zero_copy_output)) return false;\n  }\n  return output->good();\n}\n\nbool Message::SerializePartialToOstream(ostream* output) const {\n  io::OstreamOutputStream zero_copy_output(output);\n  return SerializePartialToZeroCopyStream(&zero_copy_output);\n}\n\n\nReflection::~Reflection() {}\n\n// ===================================================================\n// MessageFactory\n\nMessageFactory::~MessageFactory() {}\n\nnamespace {\n\nclass GeneratedMessageFactory : public MessageFactory {\n public:\n  GeneratedMessageFactory();\n  ~GeneratedMessageFactory();\n\n  static GeneratedMessageFactory* singleton();\n\n  typedef void RegistrationFunc(const string&);\n  void RegisterFile(const char* file, RegistrationFunc* registration_func);\n  void RegisterType(const Descriptor* descriptor, const Message* prototype);\n\n  // implements MessageFactory ---------------------------------------\n  const Message* GetPrototype(const Descriptor* type);\n\n private:\n  // Only written at static init time, so does not require locking.\n  hash_map<const char*, RegistrationFunc*,\n           hash<const char*>, streq> file_map_;\n\n  // Initialized lazily, so requires locking.\n  Mutex mutex_;\n  hash_map<const Descriptor*, const Message*> type_map_;\n};\n\nGeneratedMessageFactory* generated_message_factory_ = NULL;\nGOOGLE_PROTOBUF_DECLARE_ONCE(generated_message_factory_once_init_);\n\nvoid ShutdownGeneratedMessageFactory() {\n  delete generated_message_factory_;\n}\n\nvoid InitGeneratedMessageFactory() {\n  generated_message_factory_ = new GeneratedMessageFactory;\n  internal::OnShutdown(&ShutdownGeneratedMessageFactory);\n}\n\nGeneratedMessageFactory::GeneratedMessageFactory() {}\nGeneratedMessageFactory::~GeneratedMessageFactory() {}\n\nGeneratedMessageFactory* GeneratedMessageFactory::singleton() {\n  ::google::protobuf::GoogleOnceInit(&generated_message_factory_once_init_,\n                 &InitGeneratedMessageFactory);\n  return generated_message_factory_;\n}\n\nvoid GeneratedMessageFactory::RegisterFile(\n    const char* file, RegistrationFunc* registration_func) {\n  if (!InsertIfNotPresent(&file_map_, file, registration_func)) {\n    GOOGLE_LOG(FATAL) << \"File is already registered: \" << file;\n  }\n}\n\nvoid GeneratedMessageFactory::RegisterType(const Descriptor* descriptor,\n                                           const Message* prototype) {\n  GOOGLE_DCHECK_EQ(descriptor->file()->pool(), DescriptorPool::generated_pool())\n    << \"Tried to register a non-generated type with the generated \"\n       \"type registry.\";\n\n  // This should only be called as a result of calling a file registration\n  // function during GetPrototype(), in which case we already have locked\n  // the mutex.\n  mutex_.AssertHeld();\n  if (!InsertIfNotPresent(&type_map_, descriptor, prototype)) {\n    GOOGLE_LOG(DFATAL) << \"Type is already registered: \" << descriptor->full_name();\n  }\n}\n\nconst Message* GeneratedMessageFactory::GetPrototype(const Descriptor* type) {\n  {\n    ReaderMutexLock lock(&mutex_);\n    const Message* result = FindPtrOrNull(type_map_, type);\n    if (result != NULL) return result;\n  }\n\n  // If the type is not in the generated pool, then we can't possibly handle\n  // it.\n  if (type->file()->pool() != DescriptorPool::generated_pool()) return NULL;\n\n  // Apparently the file hasn't been registered yet.  Let's do that now.\n  RegistrationFunc* registration_func =\n      FindPtrOrNull(file_map_, type->file()->name().c_str());\n  if (registration_func == NULL) {\n    GOOGLE_LOG(DFATAL) << \"File appears to be in generated pool but wasn't \"\n                   \"registered: \" << type->file()->name();\n    return NULL;\n  }\n\n  WriterMutexLock lock(&mutex_);\n\n  // Check if another thread preempted us.\n  const Message* result = FindPtrOrNull(type_map_, type);\n  if (result == NULL) {\n    // Nope.  OK, register everything.\n    registration_func(type->file()->name());\n    // Should be here now.\n    result = FindPtrOrNull(type_map_, type);\n  }\n\n  if (result == NULL) {\n    GOOGLE_LOG(DFATAL) << \"Type appears to be in generated pool but wasn't \"\n                << \"registered: \" << type->full_name();\n  }\n\n  return result;\n}\n\n}  // namespace\n\nMessageFactory* MessageFactory::generated_factory() {\n  return GeneratedMessageFactory::singleton();\n}\n\nvoid MessageFactory::InternalRegisterGeneratedFile(\n    const char* filename, void (*register_messages)(const string&)) {\n  GeneratedMessageFactory::singleton()->RegisterFile(filename,\n                                                     register_messages);\n}\n\nvoid MessageFactory::InternalRegisterGeneratedMessage(\n    const Descriptor* descriptor, const Message* prototype) {\n  GeneratedMessageFactory::singleton()->RegisterType(descriptor, prototype);\n}\n\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Defines Message, the abstract interface implemented by non-lite\n// protocol message objects.  Although it's possible to implement this\n// interface manually, most users will use the protocol compiler to\n// generate implementations.\n//\n// Example usage:\n//\n// Say you have a message defined as:\n//\n//   message Foo {\n//     optional string text = 1;\n//     repeated int32 numbers = 2;\n//   }\n//\n// Then, if you used the protocol compiler to generate a class from the above\n// definition, you could use it like so:\n//\n//   string data;  // Will store a serialized version of the message.\n//\n//   {\n//     // Create a message and serialize it.\n//     Foo foo;\n//     foo.set_text(\"Hello World!\");\n//     foo.add_numbers(1);\n//     foo.add_numbers(5);\n//     foo.add_numbers(42);\n//\n//     foo.SerializeToString(&data);\n//   }\n//\n//   {\n//     // Parse the serialized message and check that it contains the\n//     // correct data.\n//     Foo foo;\n//     foo.ParseFromString(data);\n//\n//     assert(foo.text() == \"Hello World!\");\n//     assert(foo.numbers_size() == 3);\n//     assert(foo.numbers(0) == 1);\n//     assert(foo.numbers(1) == 5);\n//     assert(foo.numbers(2) == 42);\n//   }\n//\n//   {\n//     // Same as the last block, but do it dynamically via the Message\n//     // reflection interface.\n//     Message* foo = new Foo;\n//     Descriptor* descriptor = foo->GetDescriptor();\n//\n//     // Get the descriptors for the fields we're interested in and verify\n//     // their types.\n//     FieldDescriptor* text_field = descriptor->FindFieldByName(\"text\");\n//     assert(text_field != NULL);\n//     assert(text_field->type() == FieldDescriptor::TYPE_STRING);\n//     assert(text_field->label() == FieldDescriptor::TYPE_OPTIONAL);\n//     FieldDescriptor* numbers_field = descriptor->FindFieldByName(\"numbers\");\n//     assert(numbers_field != NULL);\n//     assert(numbers_field->type() == FieldDescriptor::TYPE_INT32);\n//     assert(numbers_field->label() == FieldDescriptor::TYPE_REPEATED);\n//\n//     // Parse the message.\n//     foo->ParseFromString(data);\n//\n//     // Use the reflection interface to examine the contents.\n//     const Reflection* reflection = foo->GetReflection();\n//     assert(reflection->GetString(foo, text_field) == \"Hello World!\");\n//     assert(reflection->FieldSize(foo, numbers_field) == 3);\n//     assert(reflection->GetRepeatedInt32(foo, numbers_field, 0) == 1);\n//     assert(reflection->GetRepeatedInt32(foo, numbers_field, 1) == 5);\n//     assert(reflection->GetRepeatedInt32(foo, numbers_field, 2) == 42);\n//\n//     delete foo;\n//   }\n\n#ifndef GOOGLE_PROTOBUF_MESSAGE_H__\n#define GOOGLE_PROTOBUF_MESSAGE_H__\n\n#include <vector>\n#include <string>\n\n#ifdef __DECCXX\n// HP C++'s iosfwd doesn't work.\n#include <iostream>\n#else\n#include <iosfwd>\n#endif\n\n#include <google/protobuf/message_lite.h>\n\n#include <google/protobuf/stubs/common.h>\n\n\nnamespace google {\nnamespace protobuf {\n\n// Defined in this file.\nclass Message;\nclass Reflection;\nclass MessageFactory;\n\n// Defined in other files.\nclass Descriptor;            // descriptor.h\nclass FieldDescriptor;       // descriptor.h\nclass EnumDescriptor;        // descriptor.h\nclass EnumValueDescriptor;   // descriptor.h\nnamespace io {\n  class ZeroCopyInputStream;   // zero_copy_stream.h\n  class ZeroCopyOutputStream;  // zero_copy_stream.h\n  class CodedInputStream;      // coded_stream.h\n  class CodedOutputStream;     // coded_stream.h\n}\nclass UnknownFieldSet;       // unknown_field_set.h\n\n// A container to hold message metadata.\nstruct Metadata {\n  const Descriptor* descriptor;\n  const Reflection* reflection;\n};\n\n// Returns the EnumDescriptor for enum type E, which must be a\n// proto-declared enum type.  Code generated by the protocol compiler\n// will include specializations of this template for each enum type declared.\ntemplate <typename E>\nconst EnumDescriptor* GetEnumDescriptor();\n\n// Abstract interface for protocol messages.\n//\n// See also MessageLite, which contains most every-day operations.  Message\n// adds descriptors and reflection on top of that.\n//\n// The methods of this class that are virtual but not pure-virtual have\n// default implementations based on reflection.  Message classes which are\n// optimized for speed will want to override these with faster implementations,\n// but classes optimized for code size may be happy with keeping them.  See\n// the optimize_for option in descriptor.proto.\nclass LIBPROTOBUF_EXPORT Message : public MessageLite {\n public:\n  inline Message() {}\n  virtual ~Message();\n\n  // Basic Operations ------------------------------------------------\n\n  // Construct a new instance of the same type.  Ownership is passed to the\n  // caller.  (This is also defined in MessageLite, but is defined again here\n  // for return-type covariance.)\n  virtual Message* New() const = 0;\n\n  // Make this message into a copy of the given message.  The given message\n  // must have the same descriptor, but need not necessarily be the same class.\n  // By default this is just implemented as \"Clear(); MergeFrom(from);\".\n  virtual void CopyFrom(const Message& from);\n\n  // Merge the fields from the given message into this message.  Singular\n  // fields will be overwritten, except for embedded messages which will\n  // be merged.  Repeated fields will be concatenated.  The given message\n  // must be of the same type as this message (i.e. the exact same class).\n  virtual void MergeFrom(const Message& from);\n\n  // Verifies that IsInitialized() returns true.  GOOGLE_CHECK-fails otherwise, with\n  // a nice error message.\n  void CheckInitialized() const;\n\n  // Slowly build a list of all required fields that are not set.\n  // This is much, much slower than IsInitialized() as it is implemented\n  // purely via reflection.  Generally, you should not call this unless you\n  // have already determined that an error exists by calling IsInitialized().\n  void FindInitializationErrors(vector<string>* errors) const;\n\n  // Like FindInitializationErrors, but joins all the strings, delimited by\n  // commas, and returns them.\n  string InitializationErrorString() const;\n\n  // Clears all unknown fields from this message and all embedded messages.\n  // Normally, if unknown tag numbers are encountered when parsing a message,\n  // the tag and value are stored in the message's UnknownFieldSet and\n  // then written back out when the message is serialized.  This allows servers\n  // which simply route messages to other servers to pass through messages\n  // that have new field definitions which they don't yet know about.  However,\n  // this behavior can have security implications.  To avoid it, call this\n  // method after parsing.\n  //\n  // See Reflection::GetUnknownFields() for more on unknown fields.\n  virtual void DiscardUnknownFields();\n\n  // Computes (an estimate of) the total number of bytes currently used for\n  // storing the message in memory.  The default implementation calls the\n  // Reflection object's SpaceUsed() method.\n  virtual int SpaceUsed() const;\n\n  // Debugging & Testing----------------------------------------------\n\n  // Generates a human readable form of this message, useful for debugging\n  // and other purposes.\n  string DebugString() const;\n  // Like DebugString(), but with less whitespace.\n  string ShortDebugString() const;\n  // Like DebugString(), but do not escape UTF-8 byte sequences.\n  string Utf8DebugString() const;\n  // Convenience function useful in GDB.  Prints DebugString() to stdout.\n  void PrintDebugString() const;\n\n  // Heavy I/O -------------------------------------------------------\n  // Additional parsing and serialization methods not implemented by\n  // MessageLite because they are not supported by the lite library.\n\n  // Parse a protocol buffer from a file descriptor.  If successful, the entire\n  // input will be consumed.\n  bool ParseFromFileDescriptor(int file_descriptor);\n  // Like ParseFromFileDescriptor(), but accepts messages that are missing\n  // required fields.\n  bool ParsePartialFromFileDescriptor(int file_descriptor);\n  // Parse a protocol buffer from a C++ istream.  If successful, the entire\n  // input will be consumed.\n  bool ParseFromIstream(istream* input);\n  // Like ParseFromIstream(), but accepts messages that are missing\n  // required fields.\n  bool ParsePartialFromIstream(istream* input);\n\n  // Serialize the message and write it to the given file descriptor.  All\n  // required fields must be set.\n  bool SerializeToFileDescriptor(int file_descriptor) const;\n  // Like SerializeToFileDescriptor(), but allows missing required fields.\n  bool SerializePartialToFileDescriptor(int file_descriptor) const;\n  // Serialize the message and write it to the given C++ ostream.  All\n  // required fields must be set.\n  bool SerializeToOstream(ostream* output) const;\n  // Like SerializeToOstream(), but allows missing required fields.\n  bool SerializePartialToOstream(ostream* output) const;\n\n\n  // Reflection-based methods ----------------------------------------\n  // These methods are pure-virtual in MessageLite, but Message provides\n  // reflection-based default implementations.\n\n  virtual string GetTypeName() const;\n  virtual void Clear();\n  virtual bool IsInitialized() const;\n  virtual void CheckTypeAndMergeFrom(const MessageLite& other);\n  virtual bool MergePartialFromCodedStream(io::CodedInputStream* input);\n  virtual int ByteSize() const;\n  virtual void SerializeWithCachedSizes(io::CodedOutputStream* output) const;\n\n private:\n  // This is called only by the default implementation of ByteSize(), to\n  // update the cached size.  If you override ByteSize(), you do not need\n  // to override this.  If you do not override ByteSize(), you MUST override\n  // this; the default implementation will crash.\n  //\n  // The method is private because subclasses should never call it; only\n  // override it.  Yes, C++ lets you do that.  Crazy, huh?\n  virtual void SetCachedSize(int size) const;\n\n public:\n\n  // Introspection ---------------------------------------------------\n\n  // Typedef for backwards-compatibility.\n  typedef google::protobuf::Reflection Reflection;\n\n  // Get a Descriptor for this message's type.  This describes what\n  // fields the message contains, the types of those fields, etc.\n  const Descriptor* GetDescriptor() const { return GetMetadata().descriptor; }\n\n  // Get the Reflection interface for this Message, which can be used to\n  // read and modify the fields of the Message dynamically (in other words,\n  // without knowing the message type at compile time).  This object remains\n  // property of the Message.\n  //\n  // This method remains virtual in case a subclass does not implement\n  // reflection and wants to override the default behavior.\n  virtual const Reflection* GetReflection() const {\n    return GetMetadata().reflection;\n  }\n\n protected:\n  // Get a struct containing the metadata for the Message. Most subclasses only\n  // need to implement this method, rather than the GetDescriptor() and\n  // GetReflection() wrappers.\n  virtual Metadata GetMetadata() const  = 0;\n\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Message);\n};\n\n// This interface contains methods that can be used to dynamically access\n// and modify the fields of a protocol message.  Their semantics are\n// similar to the accessors the protocol compiler generates.\n//\n// To get the Reflection for a given Message, call Message::GetReflection().\n//\n// This interface is separate from Message only for efficiency reasons;\n// the vast majority of implementations of Message will share the same\n// implementation of Reflection (GeneratedMessageReflection,\n// defined in generated_message.h), and all Messages of a particular class\n// should share the same Reflection object (though you should not rely on\n// the latter fact).\n//\n// There are several ways that these methods can be used incorrectly.  For\n// example, any of the following conditions will lead to undefined\n// results (probably assertion failures):\n// - The FieldDescriptor is not a field of this message type.\n// - The method called is not appropriate for the field's type.  For\n//   each field type in FieldDescriptor::TYPE_*, there is only one\n//   Get*() method, one Set*() method, and one Add*() method that is\n//   valid for that type.  It should be obvious which (except maybe\n//   for TYPE_BYTES, which are represented using strings in C++).\n// - A Get*() or Set*() method for singular fields is called on a repeated\n//   field.\n// - GetRepeated*(), SetRepeated*(), or Add*() is called on a non-repeated\n//   field.\n// - The Message object passed to any method is not of the right type for\n//   this Reflection object (i.e. message.GetReflection() != reflection).\n//\n// You might wonder why there is not any abstract representation for a field\n// of arbitrary type.  E.g., why isn't there just a \"GetField()\" method that\n// returns \"const Field&\", where \"Field\" is some class with accessors like\n// \"GetInt32Value()\".  The problem is that someone would have to deal with\n// allocating these Field objects.  For generated message classes, having to\n// allocate space for an additional object to wrap every field would at least\n// double the message's memory footprint, probably worse.  Allocating the\n// objects on-demand, on the other hand, would be expensive and prone to\n// memory leaks.  So, instead we ended up with this flat interface.\n//\n// TODO(kenton):  Create a utility class which callers can use to read and\n//   write fields from a Reflection without paying attention to the type.\nclass LIBPROTOBUF_EXPORT Reflection {\n public:\n  // TODO(kenton):  Remove parameter.\n  inline Reflection() {}\n  virtual ~Reflection();\n\n  // Get the UnknownFieldSet for the message.  This contains fields which\n  // were seen when the Message was parsed but were not recognized according\n  // to the Message's definition.\n  virtual const UnknownFieldSet& GetUnknownFields(\n      const Message& message) const = 0;\n  // Get a mutable pointer to the UnknownFieldSet for the message.  This\n  // contains fields which were seen when the Message was parsed but were not\n  // recognized according to the Message's definition.\n  virtual UnknownFieldSet* MutableUnknownFields(Message* message) const = 0;\n\n  // Estimate the amount of memory used by the message object.\n  virtual int SpaceUsed(const Message& message) const = 0;\n\n  // Check if the given non-repeated field is set.\n  virtual bool HasField(const Message& message,\n                        const FieldDescriptor* field) const = 0;\n\n  // Get the number of elements of a repeated field.\n  virtual int FieldSize(const Message& message,\n                        const FieldDescriptor* field) const = 0;\n\n  // Clear the value of a field, so that HasField() returns false or\n  // FieldSize() returns zero.\n  virtual void ClearField(Message* message,\n                          const FieldDescriptor* field) const = 0;\n\n  // Remove the last element of a repeated field.\n  // We don't provide a way to remove any element other than the last\n  // because it invites inefficient use, such as O(n^2) filtering loops\n  // that should have been O(n).  If you want to remove an element other\n  // than the last, the best way to do it is to re-arrange the elements\n  // (using Swap()) so that the one you want removed is at the end, then\n  // call RemoveLast().\n  virtual void RemoveLast(Message* message,\n                          const FieldDescriptor* field) const = 0;\n\n  // Swap the complete contents of two messages.\n  virtual void Swap(Message* message1, Message* message2) const = 0;\n\n  // Swap two elements of a repeated field.\n  virtual void SwapElements(Message* message,\n                    const FieldDescriptor* field,\n                    int index1,\n                    int index2) const = 0;\n\n  // List all fields of the message which are currently set.  This includes\n  // extensions.  Singular fields will only be listed if HasField(field) would\n  // return true and repeated fields will only be listed if FieldSize(field)\n  // would return non-zero.  Fields (both normal fields and extension fields)\n  // will be listed ordered by field number.\n  virtual void ListFields(const Message& message,\n                          vector<const FieldDescriptor*>* output) const = 0;\n\n  // Singular field getters ------------------------------------------\n  // These get the value of a non-repeated field.  They return the default\n  // value for fields that aren't set.\n\n  virtual int32  GetInt32 (const Message& message,\n                           const FieldDescriptor* field) const = 0;\n  virtual int64  GetInt64 (const Message& message,\n                           const FieldDescriptor* field) const = 0;\n  virtual uint32 GetUInt32(const Message& message,\n                           const FieldDescriptor* field) const = 0;\n  virtual uint64 GetUInt64(const Message& message,\n                           const FieldDescriptor* field) const = 0;\n  virtual float  GetFloat (const Message& message,\n                           const FieldDescriptor* field) const = 0;\n  virtual double GetDouble(const Message& message,\n                           const FieldDescriptor* field) const = 0;\n  virtual bool   GetBool  (const Message& message,\n                           const FieldDescriptor* field) const = 0;\n  virtual string GetString(const Message& message,\n                           const FieldDescriptor* field) const = 0;\n  virtual const EnumValueDescriptor* GetEnum(\n      const Message& message, const FieldDescriptor* field) const = 0;\n  // See MutableMessage() for the meaning of the \"factory\" parameter.\n  virtual const Message& GetMessage(const Message& message,\n                                    const FieldDescriptor* field,\n                                    MessageFactory* factory = NULL) const = 0;\n\n  // Get a string value without copying, if possible.\n  //\n  // GetString() necessarily returns a copy of the string.  This can be\n  // inefficient when the string is already stored in a string object in the\n  // underlying message.  GetStringReference() will return a reference to the\n  // underlying string in this case.  Otherwise, it will copy the string into\n  // *scratch and return that.\n  //\n  // Note:  It is perfectly reasonable and useful to write code like:\n  //     str = reflection->GetStringReference(field, &str);\n  //   This line would ensure that only one copy of the string is made\n  //   regardless of the field's underlying representation.  When initializing\n  //   a newly-constructed string, though, it's just as fast and more readable\n  //   to use code like:\n  //     string str = reflection->GetString(field);\n  virtual const string& GetStringReference(const Message& message,\n                                           const FieldDescriptor* field,\n                                           string* scratch) const = 0;\n\n\n  // Singular field mutators -----------------------------------------\n  // These mutate the value of a non-repeated field.\n\n  virtual void SetInt32 (Message* message,\n                         const FieldDescriptor* field, int32  value) const = 0;\n  virtual void SetInt64 (Message* message,\n                         const FieldDescriptor* field, int64  value) const = 0;\n  virtual void SetUInt32(Message* message,\n                         const FieldDescriptor* field, uint32 value) const = 0;\n  virtual void SetUInt64(Message* message,\n                         const FieldDescriptor* field, uint64 value) const = 0;\n  virtual void SetFloat (Message* message,\n                         const FieldDescriptor* field, float  value) const = 0;\n  virtual void SetDouble(Message* message,\n                         const FieldDescriptor* field, double value) const = 0;\n  virtual void SetBool  (Message* message,\n                         const FieldDescriptor* field, bool   value) const = 0;\n  virtual void SetString(Message* message,\n                         const FieldDescriptor* field,\n                         const string& value) const = 0;\n  virtual void SetEnum  (Message* message,\n                         const FieldDescriptor* field,\n                         const EnumValueDescriptor* value) const = 0;\n  // Get a mutable pointer to a field with a message type.  If a MessageFactory\n  // is provided, it will be used to construct instances of the sub-message;\n  // otherwise, the default factory is used.  If the field is an extension that\n  // does not live in the same pool as the containing message's descriptor (e.g.\n  // it lives in an overlay pool), then a MessageFactory must be provided.\n  // If you have no idea what that meant, then you probably don't need to worry\n  // about it (don't provide a MessageFactory).  WARNING:  If the\n  // FieldDescriptor is for a compiled-in extension, then\n  // factory->GetPrototype(field->message_type() MUST return an instance of the\n  // compiled-in class for this type, NOT DynamicMessage.\n  virtual Message* MutableMessage(Message* message,\n                                  const FieldDescriptor* field,\n                                  MessageFactory* factory = NULL) const = 0;\n\n\n  // Repeated field getters ------------------------------------------\n  // These get the value of one element of a repeated field.\n\n  virtual int32  GetRepeatedInt32 (const Message& message,\n                                   const FieldDescriptor* field,\n                                   int index) const = 0;\n  virtual int64  GetRepeatedInt64 (const Message& message,\n                                   const FieldDescriptor* field,\n                                   int index) const = 0;\n  virtual uint32 GetRepeatedUInt32(const Message& message,\n                                   const FieldDescriptor* field,\n                                   int index) const = 0;\n  virtual uint64 GetRepeatedUInt64(const Message& message,\n                                   const FieldDescriptor* field,\n                                   int index) const = 0;\n  virtual float  GetRepeatedFloat (const Message& message,\n                                   const FieldDescriptor* field,\n                                   int index) const = 0;\n  virtual double GetRepeatedDouble(const Message& message,\n                                   const FieldDescriptor* field,\n                                   int index) const = 0;\n  virtual bool   GetRepeatedBool  (const Message& message,\n                                   const FieldDescriptor* field,\n                                   int index) const = 0;\n  virtual string GetRepeatedString(const Message& message,\n                                   const FieldDescriptor* field,\n                                   int index) const = 0;\n  virtual const EnumValueDescriptor* GetRepeatedEnum(\n      const Message& message,\n      const FieldDescriptor* field, int index) const = 0;\n  virtual const Message& GetRepeatedMessage(\n      const Message& message,\n      const FieldDescriptor* field, int index) const = 0;\n\n  // See GetStringReference(), above.\n  virtual const string& GetRepeatedStringReference(\n      const Message& message, const FieldDescriptor* field,\n      int index, string* scratch) const = 0;\n\n\n  // Repeated field mutators -----------------------------------------\n  // These mutate the value of one element of a repeated field.\n\n  virtual void SetRepeatedInt32 (Message* message,\n                                 const FieldDescriptor* field,\n                                 int index, int32  value) const = 0;\n  virtual void SetRepeatedInt64 (Message* message,\n                                 const FieldDescriptor* field,\n                                 int index, int64  value) const = 0;\n  virtual void SetRepeatedUInt32(Message* message,\n                                 const FieldDescriptor* field,\n                                 int index, uint32 value) const = 0;\n  virtual void SetRepeatedUInt64(Message* message,\n                                 const FieldDescriptor* field,\n                                 int index, uint64 value) const = 0;\n  virtual void SetRepeatedFloat (Message* message,\n                                 const FieldDescriptor* field,\n                                 int index, float  value) const = 0;\n  virtual void SetRepeatedDouble(Message* message,\n                                 const FieldDescriptor* field,\n                                 int index, double value) const = 0;\n  virtual void SetRepeatedBool  (Message* message,\n                                 const FieldDescriptor* field,\n                                 int index, bool   value) const = 0;\n  virtual void SetRepeatedString(Message* message,\n                                 const FieldDescriptor* field,\n                                 int index, const string& value) const = 0;\n  virtual void SetRepeatedEnum(Message* message,\n                               const FieldDescriptor* field, int index,\n                               const EnumValueDescriptor* value) const = 0;\n  // Get a mutable pointer to an element of a repeated field with a message\n  // type.\n  virtual Message* MutableRepeatedMessage(\n      Message* message, const FieldDescriptor* field, int index) const = 0;\n\n\n  // Repeated field adders -------------------------------------------\n  // These add an element to a repeated field.\n\n  virtual void AddInt32 (Message* message,\n                         const FieldDescriptor* field, int32  value) const = 0;\n  virtual void AddInt64 (Message* message,\n                         const FieldDescriptor* field, int64  value) const = 0;\n  virtual void AddUInt32(Message* message,\n                         const FieldDescriptor* field, uint32 value) const = 0;\n  virtual void AddUInt64(Message* message,\n                         const FieldDescriptor* field, uint64 value) const = 0;\n  virtual void AddFloat (Message* message,\n                         const FieldDescriptor* field, float  value) const = 0;\n  virtual void AddDouble(Message* message,\n                         const FieldDescriptor* field, double value) const = 0;\n  virtual void AddBool  (Message* message,\n                         const FieldDescriptor* field, bool   value) const = 0;\n  virtual void AddString(Message* message,\n                         const FieldDescriptor* field,\n                         const string& value) const = 0;\n  virtual void AddEnum  (Message* message,\n                         const FieldDescriptor* field,\n                         const EnumValueDescriptor* value) const = 0;\n  // See MutableMessage() for comments on the \"factory\" parameter.\n  virtual Message* AddMessage(Message* message,\n                              const FieldDescriptor* field,\n                              MessageFactory* factory = NULL) const = 0;\n\n\n  // Extensions ------------------------------------------------------\n\n  // Try to find an extension of this message type by fully-qualified field\n  // name.  Returns NULL if no extension is known for this name or number.\n  virtual const FieldDescriptor* FindKnownExtensionByName(\n      const string& name) const = 0;\n\n  // Try to find an extension of this message type by field number.\n  // Returns NULL if no extension is known for this name or number.\n  virtual const FieldDescriptor* FindKnownExtensionByNumber(\n      int number) const = 0;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reflection);\n};\n\n// Abstract interface for a factory for message objects.\nclass LIBPROTOBUF_EXPORT MessageFactory {\n public:\n  inline MessageFactory() {}\n  virtual ~MessageFactory();\n\n  // Given a Descriptor, gets or constructs the default (prototype) Message\n  // of that type.  You can then call that message's New() method to construct\n  // a mutable message of that type.\n  //\n  // Calling this method twice with the same Descriptor returns the same\n  // object.  The returned object remains property of the factory.  Also, any\n  // objects created by calling the prototype's New() method share some data\n  // with the prototype, so these must be destoyed before the MessageFactory\n  // is destroyed.\n  //\n  // The given descriptor must outlive the returned message, and hence must\n  // outlive the MessageFactory.\n  //\n  // Some implementations do not support all types.  GetPrototype() will\n  // return NULL if the descriptor passed in is not supported.\n  //\n  // This method may or may not be thread-safe depending on the implementation.\n  // Each implementation should document its own degree thread-safety.\n  virtual const Message* GetPrototype(const Descriptor* type) = 0;\n\n  // Gets a MessageFactory which supports all generated, compiled-in messages.\n  // In other words, for any compiled-in type FooMessage, the following is true:\n  //   MessageFactory::generated_factory()->GetPrototype(\n  //     FooMessage::descriptor()) == FooMessage::default_instance()\n  // This factory supports all types which are found in\n  // DescriptorPool::generated_pool().  If given a descriptor from any other\n  // pool, GetPrototype() will return NULL.  (You can also check if a\n  // descriptor is for a generated message by checking if\n  // descriptor->file()->pool() == DescriptorPool::generated_pool().)\n  //\n  // This factory is 100% thread-safe; calling GetPrototype() does not modify\n  // any shared data.\n  //\n  // This factory is a singleton.  The caller must not delete the object.\n  static MessageFactory* generated_factory();\n\n  // For internal use only:  Registers a .proto file at static initialization\n  // time, to be placed in generated_factory.  The first time GetPrototype()\n  // is called with a descriptor from this file, |register_messages| will be\n  // called, with the file name as the parameter.  It must call\n  // InternalRegisterGeneratedMessage() (below) to register each message type\n  // in the file.  This strange mechanism is necessary because descriptors are\n  // built lazily, so we can't register types by their descriptor until we\n  // know that the descriptor exists.  |filename| must be a permanent string.\n  static void InternalRegisterGeneratedFile(\n      const char* filename, void (*register_messages)(const string&));\n\n  // For internal use only:  Registers a message type.  Called only by the\n  // functions which are registered with InternalRegisterGeneratedFile(),\n  // above.\n  static void InternalRegisterGeneratedMessage(const Descriptor* descriptor,\n                                               const Message* prototype);\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFactory);\n};\n\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_MESSAGE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Authors: wink@google.com (Wink Saville),\n//          kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/message_lite.h>\n#include <string>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\nnamespace google {\nnamespace protobuf {\n\nMessageLite::~MessageLite() {}\n\nstring MessageLite::InitializationErrorString() const {\n  return \"(cannot determine missing fields for lite message)\";\n}\n\nnamespace {\n\n// When serializing, we first compute the byte size, then serialize the message.\n// If serialization produces a different number of bytes than expected, we\n// call this function, which crashes.  The problem could be due to a bug in the\n// protobuf implementation but is more likely caused by concurrent modification\n// of the message.  This function attempts to distinguish between the two and\n// provide a useful error message.\nvoid ByteSizeConsistencyError(int byte_size_before_serialization,\n                              int byte_size_after_serialization,\n                              int bytes_produced_by_serialization) {\n  GOOGLE_CHECK_EQ(byte_size_before_serialization, byte_size_after_serialization)\n      << \"Protocol message was modified concurrently during serialization.\";\n  GOOGLE_CHECK_EQ(bytes_produced_by_serialization, byte_size_before_serialization)\n      << \"Byte size calculation and serialization were inconsistent.  This \"\n         \"may indicate a bug in protocol buffers or it may be caused by \"\n         \"concurrent modification of the message.\";\n  GOOGLE_LOG(FATAL) << \"This shouldn't be called if all the sizes are equal.\";\n}\n\nstring InitializationErrorMessage(const char* action,\n                                  const MessageLite& message) {\n  // Note:  We want to avoid depending on strutil in the lite library, otherwise\n  //   we'd use:\n  //\n  // return strings::Substitute(\n  //   \"Can't $0 message of type \\\"$1\\\" because it is missing required \"\n  //   \"fields: $2\",\n  //   action, message.GetTypeName(),\n  //   message.InitializationErrorString());\n\n  string result;\n  result += \"Can't \";\n  result += action;\n  result += \" message of type \\\"\";\n  result += message.GetTypeName();\n  result += \"\\\" because it is missing required fields: \";\n  result += message.InitializationErrorString();\n  return result;\n}\n\n// Several of the Parse methods below just do one thing and then call another\n// method.  In a naive implementation, we might have ParseFromString() call\n// ParseFromArray() which would call ParseFromZeroCopyStream() which would call\n// ParseFromCodedStream() which would call MergeFromCodedStream() which would\n// call MergePartialFromCodedStream().  However, when parsing very small\n// messages, every function call introduces significant overhead.  To avoid\n// this without reproducing code, we use these forced-inline helpers.\n//\n// Note:  GCC only allows GOOGLE_ATTRIBUTE_ALWAYS_INLINE on declarations, not\n//   definitions.\ninline bool InlineMergeFromCodedStream(io::CodedInputStream* input,\n                                       MessageLite* message)\n                                       GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\ninline bool InlineParseFromCodedStream(io::CodedInputStream* input,\n                                       MessageLite* message)\n                                       GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\ninline bool InlineParsePartialFromCodedStream(io::CodedInputStream* input,\n                                              MessageLite* message)\n                                              GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\ninline bool InlineParseFromArray(const void* data, int size,\n                                 MessageLite* message)\n                                 GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\ninline bool InlineParsePartialFromArray(const void* data, int size,\n                                        MessageLite* message)\n                                        GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\n\nbool InlineMergeFromCodedStream(io::CodedInputStream* input,\n                                MessageLite* message) {\n  if (!message->MergePartialFromCodedStream(input)) return false;\n  if (!message->IsInitialized()) {\n    GOOGLE_LOG(ERROR) << InitializationErrorMessage(\"parse\", *message);\n    return false;\n  }\n  return true;\n}\n\nbool InlineParseFromCodedStream(io::CodedInputStream* input,\n                                MessageLite* message) {\n  message->Clear();\n  return InlineMergeFromCodedStream(input, message);\n}\n\nbool InlineParsePartialFromCodedStream(io::CodedInputStream* input,\n                                       MessageLite* message) {\n  message->Clear();\n  return message->MergePartialFromCodedStream(input);\n}\n\nbool InlineParseFromArray(const void* data, int size, MessageLite* message) {\n  io::CodedInputStream input(reinterpret_cast<const uint8*>(data), size);\n  return InlineParseFromCodedStream(&input, message) &&\n         input.ConsumedEntireMessage();\n}\n\nbool InlineParsePartialFromArray(const void* data, int size,\n                                 MessageLite* message) {\n  io::CodedInputStream input(reinterpret_cast<const uint8*>(data), size);\n  return InlineParsePartialFromCodedStream(&input, message) &&\n         input.ConsumedEntireMessage();\n}\n\n}  // namespace\n\nbool MessageLite::MergeFromCodedStream(io::CodedInputStream* input) {\n  return InlineMergeFromCodedStream(input, this);\n}\n\nbool MessageLite::ParseFromCodedStream(io::CodedInputStream* input) {\n  return InlineParseFromCodedStream(input, this);\n}\n\nbool MessageLite::ParsePartialFromCodedStream(io::CodedInputStream* input) {\n  return InlineParsePartialFromCodedStream(input, this);\n}\n\nbool MessageLite::ParseFromZeroCopyStream(io::ZeroCopyInputStream* input) {\n  io::CodedInputStream decoder(input);\n  return ParseFromCodedStream(&decoder) && decoder.ConsumedEntireMessage();\n}\n\nbool MessageLite::ParsePartialFromZeroCopyStream(\n    io::ZeroCopyInputStream* input) {\n  io::CodedInputStream decoder(input);\n  return ParsePartialFromCodedStream(&decoder) &&\n         decoder.ConsumedEntireMessage();\n}\n\nbool MessageLite::ParseFromBoundedZeroCopyStream(\n    io::ZeroCopyInputStream* input, int size) {\n  io::CodedInputStream decoder(input);\n  decoder.PushLimit(size);\n  return ParseFromCodedStream(&decoder) &&\n         decoder.ConsumedEntireMessage() &&\n         decoder.BytesUntilLimit() == 0;\n}\n\nbool MessageLite::ParsePartialFromBoundedZeroCopyStream(\n    io::ZeroCopyInputStream* input, int size) {\n  io::CodedInputStream decoder(input);\n  decoder.PushLimit(size);\n  return ParsePartialFromCodedStream(&decoder) &&\n         decoder.ConsumedEntireMessage() &&\n         decoder.BytesUntilLimit() == 0;\n}\n\nbool MessageLite::ParseFromString(const string& data) {\n  return InlineParseFromArray(data.data(), data.size(), this);\n}\n\nbool MessageLite::ParsePartialFromString(const string& data) {\n  return InlineParsePartialFromArray(data.data(), data.size(), this);\n}\n\nbool MessageLite::ParseFromArray(const void* data, int size) {\n  return InlineParseFromArray(data, size, this);\n}\n\nbool MessageLite::ParsePartialFromArray(const void* data, int size) {\n  return InlineParsePartialFromArray(data, size, this);\n}\n\n\n// ===================================================================\n\nuint8* MessageLite::SerializeWithCachedSizesToArray(uint8* target) const {\n  // We only optimize this when using optimize_for = SPEED.  In other cases\n  // we just use the CodedOutputStream path.\n  int size = GetCachedSize();\n  io::ArrayOutputStream out(target, size);\n  io::CodedOutputStream coded_out(&out);\n  SerializeWithCachedSizes(&coded_out);\n  GOOGLE_CHECK(!coded_out.HadError());\n  return target + size;\n}\n\nbool MessageLite::SerializeToCodedStream(io::CodedOutputStream* output) const {\n  GOOGLE_DCHECK(IsInitialized()) << InitializationErrorMessage(\"serialize\", *this);\n  return SerializePartialToCodedStream(output);\n}\n\nbool MessageLite::SerializePartialToCodedStream(\n    io::CodedOutputStream* output) const {\n  const int size = ByteSize();  // Force size to be cached.\n  uint8* buffer = output->GetDirectBufferForNBytesAndAdvance(size);\n  if (buffer != NULL) {\n    uint8* end = SerializeWithCachedSizesToArray(buffer);\n    if (end - buffer != size) {\n      ByteSizeConsistencyError(size, ByteSize(), end - buffer);\n    }\n    return true;\n  } else {\n    int original_byte_count = output->ByteCount();\n    SerializeWithCachedSizes(output);\n    if (output->HadError()) {\n      return false;\n    }\n    int final_byte_count = output->ByteCount();\n\n    if (final_byte_count - original_byte_count != size) {\n      ByteSizeConsistencyError(size, ByteSize(),\n                               final_byte_count - original_byte_count);\n    }\n\n    return true;\n  }\n}\n\nbool MessageLite::SerializeToZeroCopyStream(\n    io::ZeroCopyOutputStream* output) const {\n  io::CodedOutputStream encoder(output);\n  return SerializeToCodedStream(&encoder);\n}\n\nbool MessageLite::SerializePartialToZeroCopyStream(\n    io::ZeroCopyOutputStream* output) const {\n  io::CodedOutputStream encoder(output);\n  return SerializePartialToCodedStream(&encoder);\n}\n\nbool MessageLite::AppendToString(string* output) const {\n  GOOGLE_DCHECK(IsInitialized()) << InitializationErrorMessage(\"serialize\", *this);\n  return AppendPartialToString(output);\n}\n\nbool MessageLite::AppendPartialToString(string* output) const {\n  int old_size = output->size();\n  int byte_size = ByteSize();\n  STLStringResizeUninitialized(output, old_size + byte_size);\n  uint8* start = reinterpret_cast<uint8*>(string_as_array(output) + old_size);\n  uint8* end = SerializeWithCachedSizesToArray(start);\n  if (end - start != byte_size) {\n    ByteSizeConsistencyError(byte_size, ByteSize(), end - start);\n  }\n  return true;\n}\n\nbool MessageLite::SerializeToString(string* output) const {\n  output->clear();\n  return AppendToString(output);\n}\n\nbool MessageLite::SerializePartialToString(string* output) const {\n  output->clear();\n  return AppendPartialToString(output);\n}\n\nbool MessageLite::SerializeToArray(void* data, int size) const {\n  GOOGLE_DCHECK(IsInitialized()) << InitializationErrorMessage(\"serialize\", *this);\n  return SerializePartialToArray(data, size);\n}\n\nbool MessageLite::SerializePartialToArray(void* data, int size) const {\n  int byte_size = ByteSize();\n  if (size < byte_size) return false;\n  uint8* start = reinterpret_cast<uint8*>(data);\n  uint8* end = SerializeWithCachedSizesToArray(start);\n  if (end - start != byte_size) {\n    ByteSizeConsistencyError(byte_size, ByteSize(), end - start);\n  }\n  return true;\n}\n\nstring MessageLite::SerializeAsString() const {\n  // If the compiler implements the (Named) Return Value Optimization,\n  // the local variable 'result' will not actually reside on the stack\n  // of this function, but will be overlaid with the object that the\n  // caller supplied for the return value to be constructed in.\n  string output;\n  if (!AppendToString(&output))\n    output.clear();\n  return output;\n}\n\nstring MessageLite::SerializePartialAsString() const {\n  string output;\n  if (!AppendPartialToString(&output))\n    output.clear();\n  return output;\n}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Authors: wink@google.com (Wink Saville),\n//          kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Defines MessageLite, the abstract interface implemented by all (lite\n// and non-lite) protocol message objects.\n\n#ifndef GOOGLE_PROTOBUF_MESSAGE_LITE_H__\n#define GOOGLE_PROTOBUF_MESSAGE_LITE_H__\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/io/coded_stream.h>\n\nnamespace google {\nnamespace protobuf {\n\n// Interface to light weight protocol messages.\n//\n// This interface is implemented by all protocol message objects.  Non-lite\n// messages additionally implement the Message interface, which is a\n// subclass of MessageLite.  Use MessageLite instead when you only need\n// the subset of features which it supports -- namely, nothing that uses\n// descriptors or reflection.  You can instruct the protocol compiler\n// to generate classes which implement only MessageLite, not the full\n// Message interface, by adding the following line to the .proto file:\n//\n//   option optimize_for = LITE_RUNTIME;\n//\n// This is particularly useful on resource-constrained systems where\n// the full protocol buffers runtime library is too big.\n//\n// Note that on non-constrained systems (e.g. servers) when you need\n// to link in lots of protocol definitions, a better way to reduce\n// total code footprint is to use optimize_for = CODE_SIZE.  This\n// will make the generated code smaller while still supporting all the\n// same features (at the expense of speed).  optimize_for = LITE_RUNTIME\n// is best when you only have a small number of message types linked\n// into your binary, in which case the size of the protocol buffers\n// runtime itself is the biggest problem.\nclass LIBPROTOBUF_EXPORT MessageLite {\n public:\n  inline MessageLite() {}\n  virtual ~MessageLite();\n\n  // Basic Operations ------------------------------------------------\n\n  // Get the name of this message type, e.g. \"foo.bar.BazProto\".\n  virtual string GetTypeName() const = 0;\n\n  // Construct a new instance of the same type.  Ownership is passed to the\n  // caller.\n  virtual MessageLite* New() const = 0;\n\n  // Clear all fields of the message and set them to their default values.\n  // Clear() avoids freeing memory, assuming that any memory allocated\n  // to hold parts of the message will be needed again to hold the next\n  // message.  If you actually want to free the memory used by a Message,\n  // you must delete it.\n  virtual void Clear() = 0;\n\n  // Quickly check if all required fields have values set.\n  virtual bool IsInitialized() const = 0;\n\n  // This is not implemented for Lite messages -- it just returns \"(cannot\n  // determine missing fields for lite message)\".  However, it is implemented\n  // for full messages.  See message.h.\n  virtual string InitializationErrorString() const;\n\n  // If |other| is the exact same class as this, calls MergeFrom().  Otherwise,\n  // results are undefined (probably crash).\n  virtual void CheckTypeAndMergeFrom(const MessageLite& other) = 0;\n\n  // Parsing ---------------------------------------------------------\n  // Methods for parsing in protocol buffer format.  Most of these are\n  // just simple wrappers around MergeFromCodedStream().\n\n  // Fill the message with a protocol buffer parsed from the given input\n  // stream.  Returns false on a read error or if the input is in the\n  // wrong format.\n  bool ParseFromCodedStream(io::CodedInputStream* input);\n  // Like ParseFromCodedStream(), but accepts messages that are missing\n  // required fields.\n  bool ParsePartialFromCodedStream(io::CodedInputStream* input);\n  // Read a protocol buffer from the given zero-copy input stream.  If\n  // successful, the entire input will be consumed.\n  bool ParseFromZeroCopyStream(io::ZeroCopyInputStream* input);\n  // Like ParseFromZeroCopyStream(), but accepts messages that are missing\n  // required fields.\n  bool ParsePartialFromZeroCopyStream(io::ZeroCopyInputStream* input);\n  // Read a protocol buffer from the given zero-copy input stream, expecting\n  // the message to be exactly \"size\" bytes long.  If successful, exactly\n  // this many bytes will have been consumed from the input.\n  bool ParseFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input, int size);\n  // Like ParseFromBoundedZeroCopyStream(), but accepts messages that are\n  // missing required fields.\n  bool ParsePartialFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input,\n                                             int size);\n  // Parse a protocol buffer contained in a string.\n  bool ParseFromString(const string& data);\n  // Like ParseFromString(), but accepts messages that are missing\n  // required fields.\n  bool ParsePartialFromString(const string& data);\n  // Parse a protocol buffer contained in an array of bytes.\n  bool ParseFromArray(const void* data, int size);\n  // Like ParseFromArray(), but accepts messages that are missing\n  // required fields.\n  bool ParsePartialFromArray(const void* data, int size);\n\n\n  // Reads a protocol buffer from the stream and merges it into this\n  // Message.  Singular fields read from the input overwrite what is\n  // already in the Message and repeated fields are appended to those\n  // already present.\n  //\n  // It is the responsibility of the caller to call input->LastTagWas()\n  // (for groups) or input->ConsumedEntireMessage() (for non-groups) after\n  // this returns to verify that the message's end was delimited correctly.\n  //\n  // ParsefromCodedStream() is implemented as Clear() followed by\n  // MergeFromCodedStream().\n  bool MergeFromCodedStream(io::CodedInputStream* input);\n\n  // Like MergeFromCodedStream(), but succeeds even if required fields are\n  // missing in the input.\n  //\n  // MergeFromCodedStream() is just implemented as MergePartialFromCodedStream()\n  // followed by IsInitialized().\n  virtual bool MergePartialFromCodedStream(io::CodedInputStream* input) = 0;\n\n  // Serialization ---------------------------------------------------\n  // Methods for serializing in protocol buffer format.  Most of these\n  // are just simple wrappers around ByteSize() and SerializeWithCachedSizes().\n\n  // Write a protocol buffer of this message to the given output.  Returns\n  // false on a write error.  If the message is missing required fields,\n  // this may GOOGLE_CHECK-fail.\n  bool SerializeToCodedStream(io::CodedOutputStream* output) const;\n  // Like SerializeToCodedStream(), but allows missing required fields.\n  bool SerializePartialToCodedStream(io::CodedOutputStream* output) const;\n  // Write the message to the given zero-copy output stream.  All required\n  // fields must be set.\n  bool SerializeToZeroCopyStream(io::ZeroCopyOutputStream* output) const;\n  // Like SerializeToZeroCopyStream(), but allows missing required fields.\n  bool SerializePartialToZeroCopyStream(io::ZeroCopyOutputStream* output) const;\n  // Serialize the message and store it in the given string.  All required\n  // fields must be set.\n  bool SerializeToString(string* output) const;\n  // Like SerializeToString(), but allows missing required fields.\n  bool SerializePartialToString(string* output) const;\n  // Serialize the message and store it in the given byte array.  All required\n  // fields must be set.\n  bool SerializeToArray(void* data, int size) const;\n  // Like SerializeToArray(), but allows missing required fields.\n  bool SerializePartialToArray(void* data, int size) const;\n\n  // Make a string encoding the message. Is equivalent to calling\n  // SerializeToString() on a string and using that.  Returns the empty\n  // string if SerializeToString() would have returned an error.\n  // Note: If you intend to generate many such strings, you may\n  // reduce heap fragmentation by instead re-using the same string\n  // object with calls to SerializeToString().\n  string SerializeAsString() const;\n  // Like SerializeAsString(), but allows missing required fields.\n  string SerializePartialAsString() const;\n\n  // Like SerializeToString(), but appends to the data to the string's existing\n  // contents.  All required fields must be set.\n  bool AppendToString(string* output) const;\n  // Like AppendToString(), but allows missing required fields.\n  bool AppendPartialToString(string* output) const;\n\n  // Computes the serialized size of the message.  This recursively calls\n  // ByteSize() on all embedded messages.  If a subclass does not override\n  // this, it MUST override SetCachedSize().\n  virtual int ByteSize() const = 0;\n\n  // Serializes the message without recomputing the size.  The message must\n  // not have changed since the last call to ByteSize(); if it has, the results\n  // are undefined.\n  virtual void SerializeWithCachedSizes(\n      io::CodedOutputStream* output) const = 0;\n\n  // Like SerializeWithCachedSizes, but writes directly to *target, returning\n  // a pointer to the byte immediately after the last byte written.  \"target\"\n  // must point at a byte array of at least ByteSize() bytes.\n  virtual uint8* SerializeWithCachedSizesToArray(uint8* target) const;\n\n  // Returns the result of the last call to ByteSize().  An embedded message's\n  // size is needed both to serialize it (because embedded messages are\n  // length-delimited) and to compute the outer message's size.  Caching\n  // the size avoids computing it multiple times.\n  //\n  // ByteSize() does not automatically use the cached size when available\n  // because this would require invalidating it every time the message was\n  // modified, which would be too hard and expensive.  (E.g. if a deeply-nested\n  // sub-message is changed, all of its parents' cached sizes would need to be\n  // invalidated, which is too much work for an otherwise inlined setter\n  // method.)\n  virtual int GetCachedSize() const = 0;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageLite);\n};\n\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_MESSAGE_LITE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/message.h>\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#ifdef _MSC_VER\n#include <io.h>\n#else\n#include <unistd.h>\n#endif\n#include <sstream>\n#include <fstream>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/unittest.pb.h>\n#include <google/protobuf/test_util.h>\n\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\n\n#ifndef O_BINARY\n#ifdef _O_BINARY\n#define O_BINARY _O_BINARY\n#else\n#define O_BINARY 0     // If this isn't defined, the platform doesn't need it.\n#endif\n#endif\n\nTEST(MessageTest, SerializeHelpers) {\n  // TODO(kenton):  Test more helpers?  They're all two-liners so it seems\n  //   like a waste of time.\n\n  protobuf_unittest::TestAllTypes message;\n  TestUtil::SetAllFields(&message);\n  stringstream stream;\n\n  string str1(\"foo\");\n  string str2(\"bar\");\n\n  EXPECT_TRUE(message.SerializeToString(&str1));\n  EXPECT_TRUE(message.AppendToString(&str2));\n  EXPECT_TRUE(message.SerializeToOstream(&stream));\n\n  EXPECT_EQ(str1.size() + 3, str2.size());\n  EXPECT_EQ(\"bar\", str2.substr(0, 3));\n  // Don't use EXPECT_EQ because we don't want to dump raw binary data to\n  // stdout.\n  EXPECT_TRUE(str2.substr(3) == str1);\n\n  // GCC gives some sort of error if we try to just do stream.str() == str1.\n  string temp = stream.str();\n  EXPECT_TRUE(temp == str1);\n\n  EXPECT_TRUE(message.SerializeAsString() == str1);\n\n}\n\nTEST(MessageTest, SerializeToBrokenOstream) {\n  ofstream out;\n  protobuf_unittest::TestAllTypes message;\n  message.set_optional_int32(123);\n\n  EXPECT_FALSE(message.SerializeToOstream(&out));\n}\n\nTEST(MessageTest, ParseFromFileDescriptor) {\n  string filename = TestSourceDir() +\n                    \"/google/protobuf/testdata/golden_message\";\n  int file = open(filename.c_str(), O_RDONLY | O_BINARY);\n\n  unittest::TestAllTypes message;\n  EXPECT_TRUE(message.ParseFromFileDescriptor(file));\n  TestUtil::ExpectAllFieldsSet(message);\n\n  EXPECT_GE(close(file), 0);\n}\n\nTEST(MessageTest, ParsePackedFromFileDescriptor) {\n  string filename =\n      TestSourceDir() +\n      \"/google/protobuf/testdata/golden_packed_fields_message\";\n  int file = open(filename.c_str(), O_RDONLY | O_BINARY);\n\n  unittest::TestPackedTypes message;\n  EXPECT_TRUE(message.ParseFromFileDescriptor(file));\n  TestUtil::ExpectPackedFieldsSet(message);\n\n  EXPECT_GE(close(file), 0);\n}\n\nTEST(MessageTest, ParseHelpers) {\n  // TODO(kenton):  Test more helpers?  They're all two-liners so it seems\n  //   like a waste of time.\n  string data;\n\n  {\n    // Set up.\n    protobuf_unittest::TestAllTypes message;\n    TestUtil::SetAllFields(&message);\n    message.SerializeToString(&data);\n  }\n\n  {\n    // Test ParseFromString.\n    protobuf_unittest::TestAllTypes message;\n    EXPECT_TRUE(message.ParseFromString(data));\n    TestUtil::ExpectAllFieldsSet(message);\n  }\n\n  {\n    // Test ParseFromIstream.\n    protobuf_unittest::TestAllTypes message;\n    stringstream stream(data);\n    EXPECT_TRUE(message.ParseFromIstream(&stream));\n    EXPECT_TRUE(stream.eof());\n    TestUtil::ExpectAllFieldsSet(message);\n  }\n\n  {\n    // Test ParseFromBoundedZeroCopyStream.\n    string data_with_junk(data);\n    data_with_junk.append(\"some junk on the end\");\n    io::ArrayInputStream stream(data_with_junk.data(), data_with_junk.size());\n    protobuf_unittest::TestAllTypes message;\n    EXPECT_TRUE(message.ParseFromBoundedZeroCopyStream(&stream, data.size()));\n    TestUtil::ExpectAllFieldsSet(message);\n  }\n\n  {\n    // Test that ParseFromBoundedZeroCopyStream fails (but doesn't crash) if\n    // EOF is reached before the expected number of bytes.\n    io::ArrayInputStream stream(data.data(), data.size());\n    protobuf_unittest::TestAllTypes message;\n    EXPECT_FALSE(\n      message.ParseFromBoundedZeroCopyStream(&stream, data.size() + 1));\n  }\n}\n\nTEST(MessageTest, ParseFailsIfNotInitialized) {\n  unittest::TestRequired message;\n  vector<string> errors;\n\n  {\n    ScopedMemoryLog log;\n    EXPECT_FALSE(message.ParseFromString(\"\"));\n    errors = log.GetMessages(ERROR);\n  }\n\n  ASSERT_EQ(1, errors.size());\n  EXPECT_EQ(\"Can't parse message of type \\\"protobuf_unittest.TestRequired\\\" \"\n            \"because it is missing required fields: a, b, c\",\n            errors[0]);\n}\n\nTEST(MessageTest, BypassInitializationCheckOnParse) {\n  unittest::TestRequired message;\n  io::ArrayInputStream raw_input(NULL, 0);\n  io::CodedInputStream input(&raw_input);\n  EXPECT_TRUE(message.MergePartialFromCodedStream(&input));\n}\n\nTEST(MessageTest, InitializationErrorString) {\n  unittest::TestRequired message;\n  EXPECT_EQ(\"a, b, c\", message.InitializationErrorString());\n}\n\n#ifdef GTEST_HAS_DEATH_TEST  // death tests do not work on Windows yet.\n\nTEST(MessageTest, SerializeFailsIfNotInitialized) {\n  unittest::TestRequired message;\n  string data;\n  EXPECT_DEBUG_DEATH(EXPECT_TRUE(message.SerializeToString(&data)),\n    \"Can't serialize message of type \\\"protobuf_unittest.TestRequired\\\" because \"\n    \"it is missing required fields: a, b, c\");\n}\n\nTEST(MessageTest, CheckInitialized) {\n  unittest::TestRequired message;\n  EXPECT_DEATH(message.CheckInitialized(),\n    \"Message of type \\\"protobuf_unittest.TestRequired\\\" is missing required \"\n    \"fields: a, b, c\");\n}\n\n#endif  // GTEST_HAS_DEATH_TEST\n\nTEST(MessageTest, BypassInitializationCheckOnSerialize) {\n  unittest::TestRequired message;\n  io::ArrayOutputStream raw_output(NULL, 0);\n  io::CodedOutputStream output(&raw_output);\n  EXPECT_TRUE(message.SerializePartialToCodedStream(&output));\n}\n\nTEST(MessageTest, FindInitializationErrors) {\n  unittest::TestRequired message;\n  vector<string> errors;\n  message.FindInitializationErrors(&errors);\n  ASSERT_EQ(3, errors.size());\n  EXPECT_EQ(\"a\", errors[0]);\n  EXPECT_EQ(\"b\", errors[1]);\n  EXPECT_EQ(\"c\", errors[2]);\n}\n\nTEST(MessageTest, ParseFailsOnInvalidMessageEnd) {\n  unittest::TestAllTypes message;\n\n  // Control case.\n  EXPECT_TRUE(message.ParseFromArray(\"\", 0));\n\n  // The byte is a valid varint, but not a valid tag (zero).\n  EXPECT_FALSE(message.ParseFromArray(\"\\0\", 1));\n\n  // The byte is a malformed varint.\n  EXPECT_FALSE(message.ParseFromArray(\"\\200\", 1));\n\n  // The byte is an endgroup tag, but we aren't parsing a group.\n  EXPECT_FALSE(message.ParseFromArray(\"\\014\", 1));\n}\n\nTEST(MessageFactoryTest, GeneratedFactoryLookup) {\n  EXPECT_EQ(\n    MessageFactory::generated_factory()->GetPrototype(\n      protobuf_unittest::TestAllTypes::descriptor()),\n    &protobuf_unittest::TestAllTypes::default_instance());\n}\n\nTEST(MessageFactoryTest, GeneratedFactoryUnknownType) {\n  // Construct a new descriptor.\n  DescriptorPool pool;\n  FileDescriptorProto file;\n  file.set_name(\"foo.proto\");\n  file.add_message_type()->set_name(\"Foo\");\n  const Descriptor* descriptor = pool.BuildFile(file)->message_type(0);\n\n  // Trying to construct it should return NULL.\n  EXPECT_TRUE(\n    MessageFactory::generated_factory()->GetPrototype(descriptor) == NULL);\n}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/package_info.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file exists solely to document the google::protobuf namespace.\n// It is not compiled into anything, but it may be read by an automated\n// documentation generator.\n\nnamespace google {\n\n// Core components of the Protocol Buffers runtime library.\n//\n// The files in this package represent the core of the Protocol Buffer\n// system.  All of them are part of the libprotobuf library.\n//\n// A note on thread-safety:\n//\n// Thread-safety in the Protocol Buffer library follows a simple rule:\n// unless explicitly noted otherwise, it is always safe to use an object\n// from multiple threads simultaneously as long as the object is declared\n// const in all threads (or, it is only used in ways that would be allowed\n// if it were declared const).  However, if an object is accessed in one\n// thread in a way that would not be allowed if it were const, then it is\n// not safe to access that object in any other thread simultaneously.\n//\n// Put simply, read-only access to an object can happen in multiple threads\n// simultaneously, but write access can only happen in a single thread at\n// a time.\n//\n// The implementation does contain some \"const\" methods which actually modify\n// the object behind the scenes -- e.g., to cache results -- but in these cases\n// mutex locking is used to make the access thread-safe.\nnamespace protobuf {}\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/reflection_ops.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/unknown_field_set.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\n\nvoid ReflectionOps::Copy(const Message& from, Message* to) {\n  if (&from == to) return;\n  Clear(to);\n  Merge(from, to);\n}\n\nvoid ReflectionOps::Merge(const Message& from, Message* to) {\n  GOOGLE_CHECK_NE(&from, to);\n\n  const Descriptor* descriptor = from.GetDescriptor();\n  GOOGLE_CHECK_EQ(to->GetDescriptor(), descriptor)\n    << \"Tried to merge messages of different types.\";\n\n  const Reflection* from_reflection = from.GetReflection();\n  const Reflection* to_reflection = to->GetReflection();\n\n  vector<const FieldDescriptor*> fields;\n  from_reflection->ListFields(from, &fields);\n  for (int i = 0; i < fields.size(); i++) {\n    const FieldDescriptor* field = fields[i];\n\n    if (field->is_repeated()) {\n      int count = from_reflection->FieldSize(from, field);\n      for (int j = 0; j < count; j++) {\n        switch (field->cpp_type()) {\n#define HANDLE_TYPE(CPPTYPE, METHOD)                                     \\\n          case FieldDescriptor::CPPTYPE_##CPPTYPE:                       \\\n            to_reflection->Add##METHOD(to, field,                        \\\n              from_reflection->GetRepeated##METHOD(from, field, j));     \\\n            break;\n\n          HANDLE_TYPE(INT32 , Int32 );\n          HANDLE_TYPE(INT64 , Int64 );\n          HANDLE_TYPE(UINT32, UInt32);\n          HANDLE_TYPE(UINT64, UInt64);\n          HANDLE_TYPE(FLOAT , Float );\n          HANDLE_TYPE(DOUBLE, Double);\n          HANDLE_TYPE(BOOL  , Bool  );\n          HANDLE_TYPE(STRING, String);\n          HANDLE_TYPE(ENUM  , Enum  );\n#undef HANDLE_TYPE\n\n          case FieldDescriptor::CPPTYPE_MESSAGE:\n            to_reflection->AddMessage(to, field)->MergeFrom(\n              from_reflection->GetRepeatedMessage(from, field, j));\n            break;\n        }\n      }\n    } else {\n      switch (field->cpp_type()) {\n#define HANDLE_TYPE(CPPTYPE, METHOD)                                        \\\n        case FieldDescriptor::CPPTYPE_##CPPTYPE:                            \\\n          to_reflection->Set##METHOD(to, field,                             \\\n            from_reflection->Get##METHOD(from, field));                     \\\n          break;\n\n        HANDLE_TYPE(INT32 , Int32 );\n        HANDLE_TYPE(INT64 , Int64 );\n        HANDLE_TYPE(UINT32, UInt32);\n        HANDLE_TYPE(UINT64, UInt64);\n        HANDLE_TYPE(FLOAT , Float );\n        HANDLE_TYPE(DOUBLE, Double);\n        HANDLE_TYPE(BOOL  , Bool  );\n        HANDLE_TYPE(STRING, String);\n        HANDLE_TYPE(ENUM  , Enum  );\n#undef HANDLE_TYPE\n\n        case FieldDescriptor::CPPTYPE_MESSAGE:\n          to_reflection->MutableMessage(to, field)->MergeFrom(\n            from_reflection->GetMessage(from, field));\n          break;\n      }\n    }\n  }\n\n  to_reflection->MutableUnknownFields(to)->MergeFrom(\n    from_reflection->GetUnknownFields(from));\n}\n\nvoid ReflectionOps::Clear(Message* message) {\n  const Reflection* reflection = message->GetReflection();\n\n  vector<const FieldDescriptor*> fields;\n  reflection->ListFields(*message, &fields);\n  for (int i = 0; i < fields.size(); i++) {\n    reflection->ClearField(message, fields[i]);\n  }\n\n  reflection->MutableUnknownFields(message)->Clear();\n}\n\nbool ReflectionOps::IsInitialized(const Message& message) {\n  const Descriptor* descriptor = message.GetDescriptor();\n  const Reflection* reflection = message.GetReflection();\n\n  // Check required fields of this message.\n  for (int i = 0; i < descriptor->field_count(); i++) {\n    if (descriptor->field(i)->is_required()) {\n      if (!reflection->HasField(message, descriptor->field(i))) {\n        return false;\n      }\n    }\n  }\n\n  // Check that sub-messages are initialized.\n  vector<const FieldDescriptor*> fields;\n  reflection->ListFields(message, &fields);\n  for (int i = 0; i < fields.size(); i++) {\n    const FieldDescriptor* field = fields[i];\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      if (field->is_repeated()) {\n        int size = reflection->FieldSize(message, field);\n\n        for (int i = 0; i < size; i++) {\n          if (!reflection->GetRepeatedMessage(message, field, i)\n                          .IsInitialized()) {\n            return false;\n          }\n        }\n      } else {\n        if (!reflection->GetMessage(message, field).IsInitialized()) {\n          return false;\n        }\n      }\n    }\n  }\n\n  return true;\n}\n\nvoid ReflectionOps::DiscardUnknownFields(Message* message) {\n  const Reflection* reflection = message->GetReflection();\n\n  reflection->MutableUnknownFields(message)->Clear();\n\n  vector<const FieldDescriptor*> fields;\n  reflection->ListFields(*message, &fields);\n  for (int i = 0; i < fields.size(); i++) {\n    const FieldDescriptor* field = fields[i];\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      if (field->is_repeated()) {\n        int size = reflection->FieldSize(*message, field);\n        for (int i = 0; i < size; i++) {\n          reflection->MutableRepeatedMessage(message, field, i)\n                    ->DiscardUnknownFields();\n        }\n      } else {\n        reflection->MutableMessage(message, field)->DiscardUnknownFields();\n      }\n    }\n  }\n}\n\nstatic string SubMessagePrefix(const string& prefix,\n                               const FieldDescriptor* field,\n                               int index) {\n  string result(prefix);\n  if (field->is_extension()) {\n    result.append(\"(\");\n    result.append(field->full_name());\n    result.append(\")\");\n  } else {\n    result.append(field->name());\n  }\n  if (index != -1) {\n    result.append(\"[\");\n    result.append(SimpleItoa(index));\n    result.append(\"]\");\n  }\n  result.append(\".\");\n  return result;\n}\n\nvoid ReflectionOps::FindInitializationErrors(\n    const Message& message,\n    const string& prefix,\n    vector<string>* errors) {\n  const Descriptor* descriptor = message.GetDescriptor();\n  const Reflection* reflection = message.GetReflection();\n\n  // Check required fields of this message.\n  for (int i = 0; i < descriptor->field_count(); i++) {\n    if (descriptor->field(i)->is_required()) {\n      if (!reflection->HasField(message, descriptor->field(i))) {\n        errors->push_back(prefix + descriptor->field(i)->name());\n      }\n    }\n  }\n\n  // Check sub-messages.\n  vector<const FieldDescriptor*> fields;\n  reflection->ListFields(message, &fields);\n  for (int i = 0; i < fields.size(); i++) {\n    const FieldDescriptor* field = fields[i];\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n\n      if (field->is_repeated()) {\n        int size = reflection->FieldSize(message, field);\n\n        for (int i = 0; i < size; i++) {\n          const Message& sub_message =\n            reflection->GetRepeatedMessage(message, field, i);\n          FindInitializationErrors(sub_message,\n                                   SubMessagePrefix(prefix, field, i),\n                                   errors);\n        }\n      } else {\n        const Message& sub_message = reflection->GetMessage(message, field);\n        FindInitializationErrors(sub_message,\n                                 SubMessagePrefix(prefix, field, -1),\n                                 errors);\n      }\n    }\n  }\n}\n\n}  // namespace internal\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This header is logically internal, but is made public because it is used\n// from protocol-compiler-generated code, which may reside in other components.\n\n#ifndef GOOGLE_PROTOBUF_REFLECTION_OPS_H__\n#define GOOGLE_PROTOBUF_REFLECTION_OPS_H__\n\n#include <google/protobuf/message.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\n\n// Basic operations that can be performed using reflection.\n// These can be used as a cheap way to implement the corresponding\n// methods of the Message interface, though they are likely to be\n// slower than implementations tailored for the specific message type.\n//\n// This class should stay limited to operations needed to implement\n// the Message interface.\n//\n// This class is really a namespace that contains only static methods.\nclass LIBPROTOBUF_EXPORT ReflectionOps {\n public:\n  static void Copy(const Message& from, Message* to);\n  static void Merge(const Message& from, Message* to);\n  static void Clear(Message* message);\n  static bool IsInitialized(const Message& message);\n  static void DiscardUnknownFields(Message* message);\n\n  // Finds all unset required fields in the message and adds their full\n  // paths (e.g. \"foo.bar[5].baz\") to *names.  \"prefix\" will be attached to\n  // the front of each name.\n  static void FindInitializationErrors(const Message& message,\n                                       const string& prefix,\n                                       vector<string>* errors);\n\n private:\n  // All methods are static.  No need to construct.\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ReflectionOps);\n};\n\n}  // namespace internal\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_REFLECTION_OPS_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/reflection_ops.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/unittest.pb.h>\n#include <google/protobuf/test_util.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\nnamespace {\n\nTEST(ReflectionOpsTest, SanityCheck) {\n  unittest::TestAllTypes message;\n\n  TestUtil::SetAllFields(&message);\n  TestUtil::ExpectAllFieldsSet(message);\n}\n\nTEST(ReflectionOpsTest, Copy) {\n  unittest::TestAllTypes message, message2;\n\n  TestUtil::SetAllFields(&message);\n\n  ReflectionOps::Copy(message, &message2);\n\n  TestUtil::ExpectAllFieldsSet(message2);\n\n  // Copying from self should be a no-op.\n  ReflectionOps::Copy(message2, &message2);\n  TestUtil::ExpectAllFieldsSet(message2);\n}\n\nTEST(ReflectionOpsTest, CopyExtensions) {\n  unittest::TestAllExtensions message, message2;\n\n  TestUtil::SetAllExtensions(&message);\n\n  ReflectionOps::Copy(message, &message2);\n\n  TestUtil::ExpectAllExtensionsSet(message2);\n}\n\nTEST(ReflectionOpsTest, Merge) {\n  // Note:  Copy is implemented in terms of Merge() so technically the Copy\n  //   test already tested most of this.\n\n  unittest::TestAllTypes message, message2;\n\n  TestUtil::SetAllFields(&message);\n\n  // This field will test merging into an empty spot.\n  message2.set_optional_int32(message.optional_int32());\n  message.clear_optional_int32();\n\n  // This tests overwriting.\n  message2.set_optional_string(message.optional_string());\n  message.set_optional_string(\"something else\");\n\n  // This tests concatenating.\n  message2.add_repeated_int32(message.repeated_int32(1));\n  int32 i = message.repeated_int32(0);\n  message.clear_repeated_int32();\n  message.add_repeated_int32(i);\n\n  ReflectionOps::Merge(message2, &message);\n\n  TestUtil::ExpectAllFieldsSet(message);\n}\n\nTEST(ReflectionOpsTest, MergeExtensions) {\n  // Note:  Copy is implemented in terms of Merge() so technically the Copy\n  //   test already tested most of this.\n\n  unittest::TestAllExtensions message, message2;\n\n  TestUtil::SetAllExtensions(&message);\n\n  // This field will test merging into an empty spot.\n  message2.SetExtension(unittest::optional_int32_extension,\n    message.GetExtension(unittest::optional_int32_extension));\n  message.ClearExtension(unittest::optional_int32_extension);\n\n  // This tests overwriting.\n  message2.SetExtension(unittest::optional_string_extension,\n    message.GetExtension(unittest::optional_string_extension));\n  message.SetExtension(unittest::optional_string_extension, \"something else\");\n\n  // This tests concatenating.\n  message2.AddExtension(unittest::repeated_int32_extension,\n    message.GetExtension(unittest::repeated_int32_extension, 1));\n  int32 i = message.GetExtension(unittest::repeated_int32_extension, 0);\n  message.ClearExtension(unittest::repeated_int32_extension);\n  message.AddExtension(unittest::repeated_int32_extension, i);\n\n  ReflectionOps::Merge(message2, &message);\n\n  TestUtil::ExpectAllExtensionsSet(message);\n}\n\nTEST(ReflectionOpsTest, MergeUnknown) {\n  // Test that the messages' UnknownFieldSets are correctly merged.\n  unittest::TestEmptyMessage message1, message2;\n  message1.mutable_unknown_fields()->AddVarint(1234, 1);\n  message2.mutable_unknown_fields()->AddVarint(1234, 2);\n\n  ReflectionOps::Merge(message2, &message1);\n\n  ASSERT_EQ(2, message1.unknown_fields().field_count());\n  ASSERT_EQ(UnknownField::TYPE_VARINT,\n            message1.unknown_fields().field(0).type());\n  EXPECT_EQ(1, message1.unknown_fields().field(0).varint());\n  ASSERT_EQ(UnknownField::TYPE_VARINT,\n            message1.unknown_fields().field(1).type());\n  EXPECT_EQ(2, message1.unknown_fields().field(1).varint());\n}\n\n#ifdef GTEST_HAS_DEATH_TEST\n\nTEST(ReflectionOpsTest, MergeFromSelf) {\n  // Note:  Copy is implemented in terms of Merge() so technically the Copy\n  //   test already tested most of this.\n\n  unittest::TestAllTypes message;\n\n  EXPECT_DEATH(\n    ReflectionOps::Merge(message, &message),\n    \"&from\");\n}\n\n#endif  // GTEST_HAS_DEATH_TEST\n\nTEST(ReflectionOpsTest, Clear) {\n  unittest::TestAllTypes message;\n\n  TestUtil::SetAllFields(&message);\n\n  ReflectionOps::Clear(&message);\n\n  TestUtil::ExpectClear(message);\n\n  // Check that getting embedded messages returns the objects created during\n  // SetAllFields() rather than default instances.\n  EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(),\n            &message.optionalgroup());\n  EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),\n            &message.optional_nested_message());\n  EXPECT_NE(&unittest::ForeignMessage::default_instance(),\n            &message.optional_foreign_message());\n  EXPECT_NE(&unittest_import::ImportMessage::default_instance(),\n            &message.optional_import_message());\n}\n\nTEST(ReflectionOpsTest, ClearExtensions) {\n  unittest::TestAllExtensions message;\n\n  TestUtil::SetAllExtensions(&message);\n\n  ReflectionOps::Clear(&message);\n\n  TestUtil::ExpectExtensionsClear(message);\n\n  // Check that getting embedded messages returns the objects created during\n  // SetAllExtensions() rather than default instances.\n  EXPECT_NE(&unittest::OptionalGroup_extension::default_instance(),\n            &message.GetExtension(unittest::optionalgroup_extension));\n  EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),\n            &message.GetExtension(unittest::optional_nested_message_extension));\n  EXPECT_NE(&unittest::ForeignMessage::default_instance(),\n            &message.GetExtension(\n              unittest::optional_foreign_message_extension));\n  EXPECT_NE(&unittest_import::ImportMessage::default_instance(),\n            &message.GetExtension(unittest::optional_import_message_extension));\n}\n\nTEST(ReflectionOpsTest, ClearUnknown) {\n  // Test that the message's UnknownFieldSet is correctly cleared.\n  unittest::TestEmptyMessage message;\n  message.mutable_unknown_fields()->AddVarint(1234, 1);\n\n  ReflectionOps::Clear(&message);\n\n  EXPECT_EQ(0, message.unknown_fields().field_count());\n}\n\nTEST(ReflectionOpsTest, DiscardUnknownFields) {\n  unittest::TestAllTypes message;\n  TestUtil::SetAllFields(&message);\n\n  // Set some unknown fields in message.\n  message.mutable_unknown_fields()\n        ->AddVarint(123456, 654321);\n  message.mutable_optional_nested_message()\n        ->mutable_unknown_fields()\n        ->AddVarint(123456, 654321);\n  message.mutable_repeated_nested_message(0)\n        ->mutable_unknown_fields()\n        ->AddVarint(123456, 654321);\n\n  EXPECT_EQ(1, message.unknown_fields().field_count());\n  EXPECT_EQ(1, message.optional_nested_message()\n                      .unknown_fields().field_count());\n  EXPECT_EQ(1, message.repeated_nested_message(0)\n                      .unknown_fields().field_count());\n\n  // Discard them.\n  ReflectionOps::DiscardUnknownFields(&message);\n  TestUtil::ExpectAllFieldsSet(message);\n\n  EXPECT_EQ(0, message.unknown_fields().field_count());\n  EXPECT_EQ(0, message.optional_nested_message()\n                      .unknown_fields().field_count());\n  EXPECT_EQ(0, message.repeated_nested_message(0)\n                      .unknown_fields().field_count());\n}\n\nTEST(ReflectionOpsTest, DiscardUnknownExtensions) {\n  unittest::TestAllExtensions message;\n  TestUtil::SetAllExtensions(&message);\n\n  // Set some unknown fields.\n  message.mutable_unknown_fields()\n        ->AddVarint(123456, 654321);\n  message.MutableExtension(unittest::optional_nested_message_extension)\n        ->mutable_unknown_fields()\n        ->AddVarint(123456, 654321);\n  message.MutableExtension(unittest::repeated_nested_message_extension, 0)\n        ->mutable_unknown_fields()\n        ->AddVarint(123456, 654321);\n\n  EXPECT_EQ(1, message.unknown_fields().field_count());\n  EXPECT_EQ(1,\n    message.GetExtension(unittest::optional_nested_message_extension)\n           .unknown_fields().field_count());\n  EXPECT_EQ(1,\n    message.GetExtension(unittest::repeated_nested_message_extension, 0)\n           .unknown_fields().field_count());\n\n  // Discard them.\n  ReflectionOps::DiscardUnknownFields(&message);\n  TestUtil::ExpectAllExtensionsSet(message);\n\n  EXPECT_EQ(0, message.unknown_fields().field_count());\n  EXPECT_EQ(0,\n    message.GetExtension(unittest::optional_nested_message_extension)\n           .unknown_fields().field_count());\n  EXPECT_EQ(0,\n    message.GetExtension(unittest::repeated_nested_message_extension, 0)\n           .unknown_fields().field_count());\n}\n\nTEST(ReflectionOpsTest, IsInitialized) {\n  unittest::TestRequired message;\n\n  EXPECT_FALSE(ReflectionOps::IsInitialized(message));\n  message.set_a(1);\n  EXPECT_FALSE(ReflectionOps::IsInitialized(message));\n  message.set_b(2);\n  EXPECT_FALSE(ReflectionOps::IsInitialized(message));\n  message.set_c(3);\n  EXPECT_TRUE(ReflectionOps::IsInitialized(message));\n}\n\nTEST(ReflectionOpsTest, ForeignIsInitialized) {\n  unittest::TestRequiredForeign message;\n\n  // Starts out initialized because the foreign message is itself an optional\n  // field.\n  EXPECT_TRUE(ReflectionOps::IsInitialized(message));\n\n  // Once we create that field, the message is no longer initialized.\n  message.mutable_optional_message();\n  EXPECT_FALSE(ReflectionOps::IsInitialized(message));\n\n  // Initialize it.  Now we're initialized.\n  message.mutable_optional_message()->set_a(1);\n  message.mutable_optional_message()->set_b(2);\n  message.mutable_optional_message()->set_c(3);\n  EXPECT_TRUE(ReflectionOps::IsInitialized(message));\n\n  // Add a repeated version of the message.  No longer initialized.\n  unittest::TestRequired* sub_message = message.add_repeated_message();\n  EXPECT_FALSE(ReflectionOps::IsInitialized(message));\n\n  // Initialize that repeated version.\n  sub_message->set_a(1);\n  sub_message->set_b(2);\n  sub_message->set_c(3);\n  EXPECT_TRUE(ReflectionOps::IsInitialized(message));\n}\n\nTEST(ReflectionOpsTest, ExtensionIsInitialized) {\n  unittest::TestAllExtensions message;\n\n  // Starts out initialized because the foreign message is itself an optional\n  // field.\n  EXPECT_TRUE(ReflectionOps::IsInitialized(message));\n\n  // Once we create that field, the message is no longer initialized.\n  message.MutableExtension(unittest::TestRequired::single);\n  EXPECT_FALSE(ReflectionOps::IsInitialized(message));\n\n  // Initialize it.  Now we're initialized.\n  message.MutableExtension(unittest::TestRequired::single)->set_a(1);\n  message.MutableExtension(unittest::TestRequired::single)->set_b(2);\n  message.MutableExtension(unittest::TestRequired::single)->set_c(3);\n  EXPECT_TRUE(ReflectionOps::IsInitialized(message));\n\n  // Add a repeated version of the message.  No longer initialized.\n  message.AddExtension(unittest::TestRequired::multi);\n  EXPECT_FALSE(ReflectionOps::IsInitialized(message));\n\n  // Initialize that repeated version.\n  message.MutableExtension(unittest::TestRequired::multi, 0)->set_a(1);\n  message.MutableExtension(unittest::TestRequired::multi, 0)->set_b(2);\n  message.MutableExtension(unittest::TestRequired::multi, 0)->set_c(3);\n  EXPECT_TRUE(ReflectionOps::IsInitialized(message));\n}\n\nstatic string FindInitializationErrors(const Message& message) {\n  vector<string> errors;\n  ReflectionOps::FindInitializationErrors(message, \"\", &errors);\n  return JoinStrings(errors, \",\");\n}\n\nTEST(ReflectionOpsTest, FindInitializationErrors) {\n  unittest::TestRequired message;\n  EXPECT_EQ(\"a,b,c\", FindInitializationErrors(message));\n}\n\nTEST(ReflectionOpsTest, FindForeignInitializationErrors) {\n  unittest::TestRequiredForeign message;\n  message.mutable_optional_message();\n  message.add_repeated_message();\n  message.add_repeated_message();\n  EXPECT_EQ(\"optional_message.a,\"\n            \"optional_message.b,\"\n            \"optional_message.c,\"\n            \"repeated_message[0].a,\"\n            \"repeated_message[0].b,\"\n            \"repeated_message[0].c,\"\n            \"repeated_message[1].a,\"\n            \"repeated_message[1].b,\"\n            \"repeated_message[1].c\",\n            FindInitializationErrors(message));\n}\n\nTEST(ReflectionOpsTest, FindExtensionInitializationErrors) {\n  unittest::TestAllExtensions message;\n  message.MutableExtension(unittest::TestRequired::single);\n  message.AddExtension(unittest::TestRequired::multi);\n  message.AddExtension(unittest::TestRequired::multi);\n  EXPECT_EQ(\"(protobuf_unittest.TestRequired.single).a,\"\n            \"(protobuf_unittest.TestRequired.single).b,\"\n            \"(protobuf_unittest.TestRequired.single).c,\"\n            \"(protobuf_unittest.TestRequired.multi)[0].a,\"\n            \"(protobuf_unittest.TestRequired.multi)[0].b,\"\n            \"(protobuf_unittest.TestRequired.multi)[0].c,\"\n            \"(protobuf_unittest.TestRequired.multi)[1].a,\"\n            \"(protobuf_unittest.TestRequired.multi)[1].b,\"\n            \"(protobuf_unittest.TestRequired.multi)[1].c\",\n            FindInitializationErrors(message));\n}\n\n}  // namespace\n}  // namespace internal\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <algorithm>\n\n#include <google/protobuf/repeated_field.h>\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\n\nnamespace internal {\n\nvoid RepeatedPtrFieldBase::Reserve(int new_size) {\n  if (total_size_ >= new_size) return;\n\n  void** old_elements = elements_;\n  total_size_ = max(total_size_ * 2, new_size);\n  elements_ = new void*[total_size_];\n  memcpy(elements_, old_elements, allocated_size_ * sizeof(elements_[0]));\n  if (old_elements != initial_space_) {\n    delete [] old_elements;\n  }\n}\n\nvoid RepeatedPtrFieldBase::Swap(RepeatedPtrFieldBase* other) {\n  void** swap_elements       = elements_;\n  int    swap_current_size   = current_size_;\n  int    swap_allocated_size = allocated_size_;\n  int    swap_total_size     = total_size_;\n  // We may not be using initial_space_ but it's not worth checking.  Just\n  // copy it anyway.\n  void* swap_initial_space[kInitialSize];\n  memcpy(swap_initial_space, initial_space_, sizeof(initial_space_));\n\n  elements_       = other->elements_;\n  current_size_   = other->current_size_;\n  allocated_size_ = other->allocated_size_;\n  total_size_     = other->total_size_;\n  memcpy(initial_space_, other->initial_space_, sizeof(initial_space_));\n\n  other->elements_       = swap_elements;\n  other->current_size_   = swap_current_size;\n  other->allocated_size_ = swap_allocated_size;\n  other->total_size_     = swap_total_size;\n  memcpy(other->initial_space_, swap_initial_space, sizeof(swap_initial_space));\n\n  if (elements_ == other->initial_space_) {\n    elements_ = initial_space_;\n  }\n  if (other->elements_ == initial_space_) {\n    other->elements_ = other->initial_space_;\n  }\n}\n\nstring* StringTypeHandlerBase::New() {\n  return new string;\n}\nvoid StringTypeHandlerBase::Delete(string* value) {\n  delete value;\n}\n\n}  // namespace internal\n\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// RepeatedField and RepeatedPtrField are used by generated protocol message\n// classes to manipulate repeated fields.  These classes are very similar to\n// STL's vector, but include a number of optimizations found to be useful\n// specifically in the case of Protocol Buffers.  RepeatedPtrField is\n// particularly different from STL vector as it manages ownership of the\n// pointers that it contains.\n//\n// Typically, clients should not need to access RepeatedField objects directly,\n// but should instead use the accessor functions generated automatically by the\n// protocol compiler.\n\n#ifndef GOOGLE_PROTOBUF_REPEATED_FIELD_H__\n#define GOOGLE_PROTOBUF_REPEATED_FIELD_H__\n\n#include <string>\n#include <iterator>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/message_lite.h>\n\nnamespace google {\n\nnamespace protobuf {\n\nclass Message;\n\nnamespace internal {\n\n// We need this (from generated_message_reflection.cc).\nLIBPROTOBUF_EXPORT int StringSpaceUsedExcludingSelf(const string& str);\n\n}  // namespace internal\n\n// RepeatedField is used to represent repeated fields of a primitive type (in\n// other words, everything except strings and nested Messages).  Most users will\n// not ever use a RepeatedField directly; they will use the get-by-index,\n// set-by-index, and add accessors that are generated for all repeated fields.\ntemplate <typename Element>\nclass RepeatedField {\n public:\n  RepeatedField();\n  RepeatedField(const RepeatedField& other);\n  ~RepeatedField();\n\n  RepeatedField& operator=(const RepeatedField& other);\n\n  int size() const;\n\n  const Element& Get(int index) const;\n  Element* Mutable(int index);\n  void Set(int index, const Element& value);\n  void Add(const Element& value);\n  Element* Add();\n  // Remove the last element in the array.\n  // We don't provide a way to remove any element other than the last\n  // because it invites inefficient use, such as O(n^2) filtering loops\n  // that should have been O(n).  If you want to remove an element other\n  // than the last, the best way to do it is to re-arrange the elements\n  // so that the one you want removed is at the end, then call RemoveLast().\n  void RemoveLast();\n  void Clear();\n  void MergeFrom(const RepeatedField& other);\n  void CopyFrom(const RepeatedField& other);\n\n  // Reserve space to expand the field to at least the given size.  If the\n  // array is grown, it will always be at least doubled in size.\n  void Reserve(int new_size);\n\n  // Resize the RepeatedField to a new, smaller size.  This is O(1).\n  void Truncate(int new_size);\n\n  void AddAlreadyReserved(const Element& value);\n  Element* AddAlreadyReserved();\n  int Capacity() const;\n\n  // Gets the underlying array.  This pointer is possibly invalidated by\n  // any add or remove operation.\n  Element* mutable_data();\n  const Element* data() const;\n\n  // Swap entire contents with \"other\".\n  void Swap(RepeatedField* other);\n\n  // Swap two elements.\n  void SwapElements(int index1, int index2);\n\n  // STL-like iterator support\n  typedef Element* iterator;\n  typedef const Element* const_iterator;\n  typedef Element value_type;\n\n  iterator begin();\n  const_iterator begin() const;\n  iterator end();\n  const_iterator end() const;\n\n  // Returns the number of bytes used by the repeated field, excluding\n  // sizeof(*this)\n  int SpaceUsedExcludingSelf() const;\n\n private:\n  static const int kInitialSize = 4;\n\n  Element* elements_;\n  int      current_size_;\n  int      total_size_;\n\n  Element  initial_space_[kInitialSize];\n\n  // Move the contents of |from| into |to|, possibly clobbering |from| in the\n  // process.  For primitive types this is just a memcpy(), but it could be\n  // specialized for non-primitive types to, say, swap each element instead.\n  void MoveArray(Element to[], Element from[], int size);\n\n  // Copy the elements of |from| into |to|.\n  void CopyArray(Element to[], const Element from[], int size);\n};\n\nnamespace internal {\ntemplate <typename It> class RepeatedPtrIterator;\ntemplate <typename It> class RepeatedPtrOverPtrsIterator;\n}  // namespace internal\n\nnamespace internal {\n\n// This is the common base class for RepeatedPtrFields.  It deals only in void*\n// pointers.  Users should not use this interface directly.\n//\n// The methods of this interface correspond to the methods of RepeatedPtrField,\n// but may have a template argument called TypeHandler.  Its signature is:\n//   class TypeHandler {\n//    public:\n//     typedef MyType Type;\n//     static Type* New();\n//     static void Delete(Type*);\n//     static void Clear(Type*);\n//     static void Merge(const Type& from, Type* to);\n//\n//     // Only needs to be implemented if SpaceUsedExcludingSelf() is called.\n//     static int SpaceUsed(const Type&);\n//   };\nclass LIBPROTOBUF_EXPORT RepeatedPtrFieldBase {\n protected:\n  // The reflection implementation needs to call protected methods directly,\n  // reinterpreting pointers as being to Message instead of a specific Message\n  // subclass.\n  friend class GeneratedMessageReflection;\n\n  // ExtensionSet stores repeated message extensions as\n  // RepeatedPtrField<MessageLite>, but non-lite ExtensionSets need to\n  // implement SpaceUsed(), and thus need to call SpaceUsedExcludingSelf()\n  // reinterpreting MessageLite as Message.  ExtensionSet also needs to make\n  // use of AddFromCleared(), which is not part of the public interface.\n  friend class ExtensionSet;\n\n  RepeatedPtrFieldBase();\n\n  // Must be called from destructor.\n  template <typename TypeHandler>\n  void Destroy();\n\n  int size() const;\n\n  template <typename TypeHandler>\n  const typename TypeHandler::Type& Get(int index) const;\n  template <typename TypeHandler>\n  typename TypeHandler::Type* Mutable(int index);\n  template <typename TypeHandler>\n  typename TypeHandler::Type* Add();\n  template <typename TypeHandler>\n  void RemoveLast();\n  template <typename TypeHandler>\n  void Clear();\n  template <typename TypeHandler>\n  void MergeFrom(const RepeatedPtrFieldBase& other);\n  template <typename TypeHandler>\n  void CopyFrom(const RepeatedPtrFieldBase& other);\n\n  void Reserve(int new_size);\n\n  int Capacity() const;\n\n  // Used for constructing iterators.\n  void* const* raw_data() const;\n  void** raw_mutable_data() const;\n\n  template <typename TypeHandler>\n  typename TypeHandler::Type** mutable_data();\n  template <typename TypeHandler>\n  const typename TypeHandler::Type* const* data() const;\n\n  void Swap(RepeatedPtrFieldBase* other);\n\n  void SwapElements(int index1, int index2);\n\n  template <typename TypeHandler>\n  int SpaceUsedExcludingSelf() const;\n\n\n  // Advanced memory management --------------------------------------\n\n  // Like Add(), but if there are no cleared objects to use, returns NULL.\n  template <typename TypeHandler>\n  typename TypeHandler::Type* AddFromCleared();\n\n  template <typename TypeHandler>\n  void AddAllocated(typename TypeHandler::Type* value);\n  template <typename TypeHandler>\n  typename TypeHandler::Type* ReleaseLast();\n\n  int ClearedCount() const;\n  template <typename TypeHandler>\n  void AddCleared(typename TypeHandler::Type* value);\n  template <typename TypeHandler>\n  typename TypeHandler::Type* ReleaseCleared();\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPtrFieldBase);\n\n  static const int kInitialSize = 4;\n\n  void** elements_;\n  int    current_size_;\n  int    allocated_size_;\n  int    total_size_;\n\n  void*  initial_space_[kInitialSize];\n\n  template <typename TypeHandler>\n  static inline typename TypeHandler::Type* cast(void* element) {\n    return reinterpret_cast<typename TypeHandler::Type*>(element);\n  }\n  template <typename TypeHandler>\n  static inline const typename TypeHandler::Type* cast(const void* element) {\n    return reinterpret_cast<const typename TypeHandler::Type*>(element);\n  }\n};\n\ntemplate <typename GenericType>\nclass GenericTypeHandler {\n public:\n  typedef GenericType Type;\n  static GenericType* New() { return new GenericType; }\n  static void Delete(GenericType* value) { delete value; }\n  static void Clear(GenericType* value) { value->Clear(); }\n  static void Merge(const GenericType& from, GenericType* to) {\n    to->MergeFrom(from);\n  }\n  static int SpaceUsed(const GenericType& value) { return value.SpaceUsed(); }\n};\n\ntemplate <>\ninline void GenericTypeHandler<MessageLite>::Merge(\n    const MessageLite& from, MessageLite* to) {\n  to->CheckTypeAndMergeFrom(from);\n}\n\n// HACK:  If a class is declared as DLL-exported in MSVC, it insists on\n//   generating copies of all its methods -- even inline ones -- to include\n//   in the DLL.  But SpaceUsed() calls StringSpaceUsedExcludingSelf() which\n//   isn't in the lite library, therefore the lite library cannot link if\n//   StringTypeHandler is exported.  So, we factor out StringTypeHandlerBase,\n//   export that, then make StringTypeHandler be a subclass which is NOT\n//   exported.\n// TODO(kenton):  There has to be a better way.\nclass LIBPROTOBUF_EXPORT StringTypeHandlerBase {\n public:\n  typedef string Type;\n  static string* New();\n  static void Delete(string* value);\n  static void Clear(string* value) { value->clear(); }\n  static void Merge(const string& from, string* to) { *to = from; }\n};\n\nclass StringTypeHandler : public StringTypeHandlerBase {\n public:\n  static int SpaceUsed(const string& value)  {\n    return sizeof(value) + StringSpaceUsedExcludingSelf(value);\n  }\n};\n\n\n}  // namespace internal\n\n// RepeatedPtrField is like RepeatedField, but used for repeated strings or\n// Messages.\ntemplate <typename Element>\nclass RepeatedPtrField : public internal::RepeatedPtrFieldBase {\n public:\n  RepeatedPtrField();\n  RepeatedPtrField(const RepeatedPtrField& other);\n  ~RepeatedPtrField();\n\n  RepeatedPtrField& operator=(const RepeatedPtrField& other);\n\n  int size() const;\n\n  const Element& Get(int index) const;\n  Element* Mutable(int index);\n  Element* Add();\n  void RemoveLast();  // Remove the last element in the array.\n  void Clear();\n  void MergeFrom(const RepeatedPtrField& other);\n  void CopyFrom(const RepeatedPtrField& other);\n\n  // Reserve space to expand the field to at least the given size.  This only\n  // resizes the pointer array; it doesn't allocate any objects.  If the\n  // array is grown, it will always be at least doubled in size.\n  void Reserve(int new_size);\n\n  int Capacity() const;\n\n  // Gets the underlying array.  This pointer is possibly invalidated by\n  // any add or remove operation.\n  Element** mutable_data();\n  const Element* const* data() const;\n\n  // Swap entire contents with \"other\".\n  void Swap(RepeatedPtrField* other);\n\n  // Swap two elements.\n  void SwapElements(int index1, int index2);\n\n  // STL-like iterator support\n  typedef internal::RepeatedPtrIterator<Element> iterator;\n  typedef internal::RepeatedPtrIterator<const Element> const_iterator;\n  typedef Element value_type;\n\n  iterator begin();\n  const_iterator begin() const;\n  iterator end();\n  const_iterator end() const;\n\n  // Custom STL-like iterator that iterates over and returns the underlying\n  // pointers to Element rather than Element itself.\n  typedef internal::RepeatedPtrOverPtrsIterator<Element> pointer_iterator;\n  pointer_iterator pointer_begin();\n  pointer_iterator pointer_end();\n\n  // Returns (an estimate of) the number of bytes used by the repeated field,\n  // excluding sizeof(*this).\n  int SpaceUsedExcludingSelf() const;\n\n  // Advanced memory management --------------------------------------\n  // When hardcore memory management becomes necessary -- as it often\n  // does here at Google -- the following methods may be useful.\n\n  // Add an already-allocated object, passing ownership to the\n  // RepeatedPtrField.\n  void AddAllocated(Element* value);\n  // Remove the last element and return it, passing ownership to the\n  // caller.\n  // Requires:  size() > 0\n  Element* ReleaseLast();\n\n  // When elements are removed by calls to RemoveLast() or Clear(), they\n  // are not actually freed.  Instead, they are cleared and kept so that\n  // they can be reused later.  This can save lots of CPU time when\n  // repeatedly reusing a protocol message for similar purposes.\n  //\n  // Really, extremely hardcore programs may actually want to manipulate\n  // these objects to better-optimize memory management.  These methods\n  // allow that.\n\n  // Get the number of cleared objects that are currently being kept\n  // around for reuse.\n  int ClearedCount() const;\n  // Add an element to the pool of cleared objects, passing ownership to\n  // the RepeatedPtrField.  The element must be cleared prior to calling\n  // this method.\n  void AddCleared(Element* value);\n  // Remove a single element from the cleared pool and return it, passing\n  // ownership to the caller.  The element is guaranteed to be cleared.\n  // Requires:  ClearedCount() > 0\n  Element* ReleaseCleared();\n\n protected:\n  // Note:  RepeatedPtrField SHOULD NOT be subclassed by users.  We only\n  //   subclass it in one place as a hack for compatibility with proto1.  The\n  //   subclass needs to know about TypeHandler in order to call protected\n  //   methods on RepeatedPtrFieldBase.\n  class TypeHandler;\n\n};\n\n// implementation ====================================================\n\ntemplate <typename Element>\ninline RepeatedField<Element>::RepeatedField()\n  : elements_(initial_space_),\n    current_size_(0),\n    total_size_(kInitialSize) {\n}\n\ntemplate <typename Element>\ninline RepeatedField<Element>::RepeatedField(const RepeatedField& other)\n  : elements_(initial_space_),\n    current_size_(0),\n    total_size_(kInitialSize) {\n  CopyFrom(other);\n}\n\ntemplate <typename Element>\nRepeatedField<Element>::~RepeatedField() {\n  if (elements_ != initial_space_) {\n    delete [] elements_;\n  }\n}\n\ntemplate <typename Element>\ninline RepeatedField<Element>&\nRepeatedField<Element>::operator=(const RepeatedField& other) {\n  CopyFrom(other);\n  return *this;\n}\n\ntemplate <typename Element>\ninline int RepeatedField<Element>::size() const {\n  return current_size_;\n}\n\ntemplate <typename Element>\ninline int RepeatedField<Element>::Capacity() const {\n  return total_size_;\n}\n\ntemplate<typename Element>\ninline void RepeatedField<Element>::AddAlreadyReserved(const Element& value) {\n  GOOGLE_DCHECK_LT(size(), Capacity());\n  elements_[current_size_++] = value;\n}\n\ntemplate<typename Element>\ninline Element* RepeatedField<Element>::AddAlreadyReserved() {\n  GOOGLE_DCHECK_LT(size(), Capacity());\n  return &elements_[current_size_++];\n}\n\ntemplate <typename Element>\ninline const Element& RepeatedField<Element>::Get(int index) const {\n  GOOGLE_DCHECK_LT(index, size());\n  return elements_[index];\n}\n\ntemplate <typename Element>\ninline Element* RepeatedField<Element>::Mutable(int index) {\n  GOOGLE_DCHECK_LT(index, size());\n  return elements_ + index;\n}\n\ntemplate <typename Element>\ninline void RepeatedField<Element>::Set(int index, const Element& value) {\n  GOOGLE_DCHECK_LT(index, size());\n  elements_[index] = value;\n}\n\ntemplate <typename Element>\ninline void RepeatedField<Element>::Add(const Element& value) {\n  if (current_size_ == total_size_) Reserve(total_size_ + 1);\n  elements_[current_size_++] = value;\n}\n\ntemplate <typename Element>\ninline Element* RepeatedField<Element>::Add() {\n  if (current_size_ == total_size_) Reserve(total_size_ + 1);\n  return &elements_[current_size_++];\n}\n\ntemplate <typename Element>\ninline void RepeatedField<Element>::RemoveLast() {\n  GOOGLE_DCHECK_GT(current_size_, 0);\n  --current_size_;\n}\n\ntemplate <typename Element>\ninline void RepeatedField<Element>::Clear() {\n  current_size_ = 0;\n}\n\ntemplate <typename Element>\ninline void RepeatedField<Element>::MergeFrom(const RepeatedField& other) {\n  Reserve(current_size_ + other.current_size_);\n  CopyArray(elements_ + current_size_, other.elements_, other.current_size_);\n  current_size_ += other.current_size_;\n}\n\ntemplate <typename Element>\ninline void RepeatedField<Element>::CopyFrom(const RepeatedField& other) {\n  Clear();\n  MergeFrom(other);\n}\n\ntemplate <typename Element>\ninline Element* RepeatedField<Element>::mutable_data() {\n  return elements_;\n}\n\ntemplate <typename Element>\ninline const Element* RepeatedField<Element>::data() const {\n  return elements_;\n}\n\n\ntemplate <typename Element>\nvoid RepeatedField<Element>::Swap(RepeatedField* other) {\n  Element* swap_elements     = elements_;\n  int      swap_current_size = current_size_;\n  int      swap_total_size   = total_size_;\n  // We may not be using initial_space_ but it's not worth checking.  Just\n  // copy it anyway.\n  Element swap_initial_space[kInitialSize];\n  MoveArray(swap_initial_space, initial_space_, kInitialSize);\n\n  elements_     = other->elements_;\n  current_size_ = other->current_size_;\n  total_size_   = other->total_size_;\n  MoveArray(initial_space_, other->initial_space_, kInitialSize);\n\n  other->elements_     = swap_elements;\n  other->current_size_ = swap_current_size;\n  other->total_size_   = swap_total_size;\n  MoveArray(other->initial_space_, swap_initial_space, kInitialSize);\n\n  if (elements_ == other->initial_space_) {\n    elements_ = initial_space_;\n  }\n  if (other->elements_ == initial_space_) {\n    other->elements_ = other->initial_space_;\n  }\n}\n\ntemplate <typename Element>\nvoid RepeatedField<Element>::SwapElements(int index1, int index2) {\n  std::swap(elements_[index1], elements_[index2]);\n}\n\ntemplate <typename Element>\ninline typename RepeatedField<Element>::iterator\nRepeatedField<Element>::begin() {\n  return elements_;\n}\ntemplate <typename Element>\ninline typename RepeatedField<Element>::const_iterator\nRepeatedField<Element>::begin() const {\n  return elements_;\n}\ntemplate <typename Element>\ninline typename RepeatedField<Element>::iterator\nRepeatedField<Element>::end() {\n  return elements_ + current_size_;\n}\ntemplate <typename Element>\ninline typename RepeatedField<Element>::const_iterator\nRepeatedField<Element>::end() const {\n  return elements_ + current_size_;\n}\n\ntemplate <typename Element>\ninline int RepeatedField<Element>::SpaceUsedExcludingSelf() const {\n  return (elements_ != initial_space_) ? total_size_ * sizeof(elements_[0]) : 0;\n}\n\n// Avoid inlining of Reserve(): new, memcpy, and delete[] lead to a significant\n// amount of code bloat.\ntemplate <typename Element>\nvoid RepeatedField<Element>::Reserve(int new_size) {\n  if (total_size_ >= new_size) return;\n\n  Element* old_elements = elements_;\n  total_size_ = max(total_size_ * 2, new_size);\n  elements_ = new Element[total_size_];\n  MoveArray(elements_, old_elements, current_size_);\n  if (old_elements != initial_space_) {\n    delete [] old_elements;\n  }\n}\n\ntemplate <typename Element>\ninline void RepeatedField<Element>::Truncate(int new_size) {\n  GOOGLE_DCHECK_LE(new_size, current_size_);\n  current_size_ = new_size;\n}\n\ntemplate <typename Element>\ninline void RepeatedField<Element>::MoveArray(\n    Element to[], Element from[], int array_size) {\n  memcpy(to, from, array_size * sizeof(Element));\n}\n\ntemplate <typename Element>\ninline void RepeatedField<Element>::CopyArray(\n    Element to[], const Element from[], int array_size) {\n  memcpy(to, from, array_size * sizeof(Element));\n}\n\n\n// -------------------------------------------------------------------\n\nnamespace internal {\n\ninline RepeatedPtrFieldBase::RepeatedPtrFieldBase()\n  : elements_(initial_space_),\n    current_size_(0),\n    allocated_size_(0),\n    total_size_(kInitialSize) {\n}\n\ntemplate <typename TypeHandler>\nvoid RepeatedPtrFieldBase::Destroy() {\n  for (int i = 0; i < allocated_size_; i++) {\n    TypeHandler::Delete(cast<TypeHandler>(elements_[i]));\n  }\n  if (elements_ != initial_space_) {\n    delete [] elements_;\n  }\n}\n\ninline int RepeatedPtrFieldBase::size() const {\n  return current_size_;\n}\n\n\ntemplate <typename TypeHandler>\ninline const typename TypeHandler::Type&\nRepeatedPtrFieldBase::Get(int index) const {\n  GOOGLE_DCHECK_LT(index, size());\n  return *cast<TypeHandler>(elements_[index]);\n}\n\ntemplate <typename TypeHandler>\ninline typename TypeHandler::Type*\nRepeatedPtrFieldBase::Mutable(int index) {\n  GOOGLE_DCHECK_LT(index, size());\n  return cast<TypeHandler>(elements_[index]);\n}\n\ntemplate <typename TypeHandler>\ninline typename TypeHandler::Type* RepeatedPtrFieldBase::Add() {\n  if (current_size_ < allocated_size_) {\n    return cast<TypeHandler>(elements_[current_size_++]);\n  }\n  if (allocated_size_ == total_size_) Reserve(total_size_ + 1);\n  ++allocated_size_;\n  typename TypeHandler::Type* result = TypeHandler::New();\n  elements_[current_size_++] = result;\n  return result;\n}\n\ntemplate <typename TypeHandler>\ninline void RepeatedPtrFieldBase::RemoveLast() {\n  GOOGLE_DCHECK_GT(current_size_, 0);\n  TypeHandler::Clear(cast<TypeHandler>(elements_[--current_size_]));\n}\n\ntemplate <typename TypeHandler>\nvoid RepeatedPtrFieldBase::Clear() {\n  for (int i = 0; i < current_size_; i++) {\n    TypeHandler::Clear(cast<TypeHandler>(elements_[i]));\n  }\n  current_size_ = 0;\n}\n\ntemplate <typename TypeHandler>\ninline void RepeatedPtrFieldBase::MergeFrom(const RepeatedPtrFieldBase& other) {\n  Reserve(current_size_ + other.current_size_);\n  for (int i = 0; i < other.current_size_; i++) {\n    TypeHandler::Merge(other.template Get<TypeHandler>(i), Add<TypeHandler>());\n  }\n}\n\ntemplate <typename TypeHandler>\ninline void RepeatedPtrFieldBase::CopyFrom(const RepeatedPtrFieldBase& other) {\n  RepeatedPtrFieldBase::Clear<TypeHandler>();\n  RepeatedPtrFieldBase::MergeFrom<TypeHandler>(other);\n}\n\ninline int RepeatedPtrFieldBase::Capacity() const {\n  return total_size_;\n}\n\ninline void* const* RepeatedPtrFieldBase::raw_data() const {\n  return elements_;\n}\n\ninline void** RepeatedPtrFieldBase::raw_mutable_data() const {\n  return elements_;\n}\n\ntemplate <typename TypeHandler>\ninline typename TypeHandler::Type** RepeatedPtrFieldBase::mutable_data() {\n  // TODO(kenton):  Breaks C++ aliasing rules.  We should probably remove this\n  //   method entirely.\n  return reinterpret_cast<typename TypeHandler::Type**>(elements_);\n}\n\ntemplate <typename TypeHandler>\ninline const typename TypeHandler::Type* const*\nRepeatedPtrFieldBase::data() const {\n  // TODO(kenton):  Breaks C++ aliasing rules.  We should probably remove this\n  //   method entirely.\n  return reinterpret_cast<const typename TypeHandler::Type* const*>(elements_);\n}\n\ninline void RepeatedPtrFieldBase::SwapElements(int index1, int index2) {\n  std::swap(elements_[index1], elements_[index2]);\n}\n\ntemplate <typename TypeHandler>\ninline int RepeatedPtrFieldBase::SpaceUsedExcludingSelf() const {\n  int allocated_bytes =\n      (elements_ != initial_space_) ? total_size_ * sizeof(elements_[0]) : 0;\n  for (int i = 0; i < allocated_size_; ++i) {\n    allocated_bytes += TypeHandler::SpaceUsed(*cast<TypeHandler>(elements_[i]));\n  }\n  return allocated_bytes;\n}\n\ntemplate <typename TypeHandler>\ninline typename TypeHandler::Type* RepeatedPtrFieldBase::AddFromCleared() {\n  if (current_size_ < allocated_size_) {\n    return cast<TypeHandler>(elements_[current_size_++]);\n  } else {\n    return NULL;\n  }\n}\n\ntemplate <typename TypeHandler>\nvoid RepeatedPtrFieldBase::AddAllocated(\n    typename TypeHandler::Type* value) {\n  // Make room for the new pointer.\n  if (current_size_ == total_size_) {\n    // The array is completely full with no cleared objects, so grow it.\n    Reserve(total_size_ + 1);\n    ++allocated_size_;\n  } else if (allocated_size_ == total_size_) {\n    // There is no more space in the pointer array because it contains some\n    // cleared objects awaiting reuse.  We don't want to grow the array in this\n    // case because otherwise a loop calling AddAllocated() followed by Clear()\n    // would leak memory.\n    TypeHandler::Delete(cast<TypeHandler>(elements_[current_size_]));\n  } else if (current_size_ < allocated_size_) {\n    // We have some cleared objects.  We don't care about their order, so we\n    // can just move the first one to the end to make space.\n    elements_[allocated_size_] = elements_[current_size_];\n    ++allocated_size_;\n  } else {\n    // There are no cleared objects.\n    ++allocated_size_;\n  }\n\n  elements_[current_size_++] = value;\n}\n\ntemplate <typename TypeHandler>\ninline typename TypeHandler::Type* RepeatedPtrFieldBase::ReleaseLast() {\n  GOOGLE_DCHECK_GT(current_size_, 0);\n  typename TypeHandler::Type* result =\n      cast<TypeHandler>(elements_[--current_size_]);\n  --allocated_size_;\n  if (current_size_ < allocated_size_) {\n    // There are cleared elements on the end; replace the removed element\n    // with the last allocated element.\n    elements_[current_size_] = elements_[allocated_size_];\n  }\n  return result;\n}\n\n\ninline int RepeatedPtrFieldBase::ClearedCount() const {\n  return allocated_size_ - current_size_;\n}\n\ntemplate <typename TypeHandler>\ninline void RepeatedPtrFieldBase::AddCleared(\n    typename TypeHandler::Type* value) {\n  if (allocated_size_ == total_size_) Reserve(total_size_ + 1);\n  elements_[allocated_size_++] = value;\n}\n\ntemplate <typename TypeHandler>\ninline typename TypeHandler::Type* RepeatedPtrFieldBase::ReleaseCleared() {\n  GOOGLE_DCHECK_GT(allocated_size_, current_size_);\n  return cast<TypeHandler>(elements_[--allocated_size_]);\n}\n\n}  // namespace internal\n\n// -------------------------------------------------------------------\n\ntemplate <typename Element>\nclass RepeatedPtrField<Element>::TypeHandler\n    : public internal::GenericTypeHandler<Element> {};\n\ntemplate <>\nclass RepeatedPtrField<string>::TypeHandler\n    : public internal::StringTypeHandler {};\n\n\ntemplate <typename Element>\ninline RepeatedPtrField<Element>::RepeatedPtrField() {}\n\ntemplate <typename Element>\ninline RepeatedPtrField<Element>::RepeatedPtrField(\n    const RepeatedPtrField& other) {\n  CopyFrom(other);\n}\n\ntemplate <typename Element>\nRepeatedPtrField<Element>::~RepeatedPtrField() {\n  Destroy<TypeHandler>();\n}\n\ntemplate <typename Element>\ninline RepeatedPtrField<Element>& RepeatedPtrField<Element>::operator=(\n    const RepeatedPtrField& other) {\n  CopyFrom(other);\n  return *this;\n}\n\ntemplate <typename Element>\ninline int RepeatedPtrField<Element>::size() const {\n  return RepeatedPtrFieldBase::size();\n}\n\ntemplate <typename Element>\ninline const Element& RepeatedPtrField<Element>::Get(int index) const {\n  return RepeatedPtrFieldBase::Get<TypeHandler>(index);\n}\n\ntemplate <typename Element>\ninline Element* RepeatedPtrField<Element>::Mutable(int index) {\n  return RepeatedPtrFieldBase::Mutable<TypeHandler>(index);\n}\n\ntemplate <typename Element>\ninline Element* RepeatedPtrField<Element>::Add() {\n  return RepeatedPtrFieldBase::Add<TypeHandler>();\n}\n\ntemplate <typename Element>\ninline void RepeatedPtrField<Element>::RemoveLast() {\n  RepeatedPtrFieldBase::RemoveLast<TypeHandler>();\n}\n\ntemplate <typename Element>\ninline void RepeatedPtrField<Element>::Clear() {\n  RepeatedPtrFieldBase::Clear<TypeHandler>();\n}\n\ntemplate <typename Element>\ninline void RepeatedPtrField<Element>::MergeFrom(\n    const RepeatedPtrField& other) {\n  RepeatedPtrFieldBase::MergeFrom<TypeHandler>(other);\n}\n\ntemplate <typename Element>\ninline void RepeatedPtrField<Element>::CopyFrom(\n    const RepeatedPtrField& other) {\n  RepeatedPtrFieldBase::CopyFrom<TypeHandler>(other);\n}\n\ntemplate <typename Element>\ninline Element** RepeatedPtrField<Element>::mutable_data() {\n  return RepeatedPtrFieldBase::mutable_data<TypeHandler>();\n}\n\ntemplate <typename Element>\ninline const Element* const* RepeatedPtrField<Element>::data() const {\n  return RepeatedPtrFieldBase::data<TypeHandler>();\n}\n\ntemplate <typename Element>\nvoid RepeatedPtrField<Element>::Swap(RepeatedPtrField* other) {\n  RepeatedPtrFieldBase::Swap(other);\n}\n\ntemplate <typename Element>\nvoid RepeatedPtrField<Element>::SwapElements(int index1, int index2) {\n  RepeatedPtrFieldBase::SwapElements(index1, index2);\n}\n\ntemplate <typename Element>\ninline int RepeatedPtrField<Element>::SpaceUsedExcludingSelf() const {\n  return RepeatedPtrFieldBase::SpaceUsedExcludingSelf<TypeHandler>();\n}\n\ntemplate <typename Element>\ninline void RepeatedPtrField<Element>::AddAllocated(Element* value) {\n  RepeatedPtrFieldBase::AddAllocated<TypeHandler>(value);\n}\n\ntemplate <typename Element>\ninline Element* RepeatedPtrField<Element>::ReleaseLast() {\n  return RepeatedPtrFieldBase::ReleaseLast<TypeHandler>();\n}\n\n\ntemplate <typename Element>\ninline int RepeatedPtrField<Element>::ClearedCount() const {\n  return RepeatedPtrFieldBase::ClearedCount();\n}\n\ntemplate <typename Element>\ninline void RepeatedPtrField<Element>::AddCleared(Element* value) {\n  return RepeatedPtrFieldBase::AddCleared<TypeHandler>(value);\n}\n\ntemplate <typename Element>\ninline Element* RepeatedPtrField<Element>::ReleaseCleared() {\n  return RepeatedPtrFieldBase::ReleaseCleared<TypeHandler>();\n}\n\ntemplate <typename Element>\ninline void RepeatedPtrField<Element>::Reserve(int new_size) {\n  return RepeatedPtrFieldBase::Reserve(new_size);\n}\n\ntemplate <typename Element>\ninline int RepeatedPtrField<Element>::Capacity() const {\n  return RepeatedPtrFieldBase::Capacity();\n}\n\n// -------------------------------------------------------------------\n\nnamespace internal {\n\n// STL-like iterator implementation for RepeatedPtrField.  You should not\n// refer to this class directly; use RepeatedPtrField<T>::iterator instead.\n//\n// The iterator for RepeatedPtrField<T>, RepeatedPtrIterator<T>, is\n// very similar to iterator_ptr<T**> in util/gtl/iterator_adaptors-inl.h,\n// but adds random-access operators and is modified to wrap a void** base\n// iterator (since RepeatedPtrField stores its array as a void* array and\n// casting void** to T** would violate C++ aliasing rules).\n//\n// This code based on net/proto/proto-array-internal.h by Jeffrey Yasskin\n// (jyasskin@google.com).\ntemplate<typename Element>\nclass RepeatedPtrIterator\n    : public std::iterator<\n          std::random_access_iterator_tag, Element> {\n public:\n  typedef RepeatedPtrIterator<Element> iterator;\n  typedef std::iterator<\n          std::random_access_iterator_tag, Element> superclass;\n\n  // Let the compiler know that these are type names, so we don't have to\n  // write \"typename\" in front of them everywhere.\n  typedef typename superclass::reference reference;\n  typedef typename superclass::pointer pointer;\n  typedef typename superclass::difference_type difference_type;\n\n  RepeatedPtrIterator() : it_(NULL) {}\n  explicit RepeatedPtrIterator(void* const* it) : it_(it) {}\n\n  // Allow \"upcasting\" from RepeatedPtrIterator<T**> to\n  // RepeatedPtrIterator<const T*const*>.\n  template<typename OtherElement>\n  RepeatedPtrIterator(const RepeatedPtrIterator<OtherElement>& other)\n      : it_(other.it_) {\n    // Force a compiler error if the other type is not convertible to ours.\n    if (false) {\n      implicit_cast<Element*, OtherElement*>(0);\n    }\n  }\n\n  // dereferenceable\n  reference operator*() const { return *reinterpret_cast<Element*>(*it_); }\n  pointer   operator->() const { return &(operator*()); }\n\n  // {inc,dec}rementable\n  iterator& operator++() { ++it_; return *this; }\n  iterator  operator++(int) { return iterator(it_++); }\n  iterator& operator--() { --it_; return *this; }\n  iterator  operator--(int) { return iterator(it_--); }\n\n  // equality_comparable\n  bool operator==(const iterator& x) const { return it_ == x.it_; }\n  bool operator!=(const iterator& x) const { return it_ != x.it_; }\n\n  // less_than_comparable\n  bool operator<(const iterator& x) const { return it_ < x.it_; }\n  bool operator<=(const iterator& x) const { return it_ <= x.it_; }\n  bool operator>(const iterator& x) const { return it_ > x.it_; }\n  bool operator>=(const iterator& x) const { return it_ >= x.it_; }\n\n  // addable, subtractable\n  iterator& operator+=(difference_type d) {\n    it_ += d;\n    return *this;\n  }\n  friend iterator operator+(iterator it, difference_type d) {\n    it += d;\n    return it;\n  }\n  friend iterator operator+(difference_type d, iterator it) {\n    it += d;\n    return it;\n  }\n  iterator& operator-=(difference_type d) {\n    it_ -= d;\n    return *this;\n  }\n  friend iterator operator-(iterator it, difference_type d) {\n    it -= d;\n    return it;\n  }\n\n  // indexable\n  reference operator[](difference_type d) const { return *(*this + d); }\n\n  // random access iterator\n  difference_type operator-(const iterator& x) const { return it_ - x.it_; }\n\n private:\n  template<typename OtherElement>\n  friend class RepeatedPtrIterator;\n\n  // The internal iterator.\n  void* const* it_;\n};\n\n// Provide an iterator that operates on pointers to the underlying objects\n// rather than the objects themselves as RepeatedPtrIterator does.\n// Consider using this when working with stl algorithms that change\n// the array.\ntemplate<typename Element>\nclass RepeatedPtrOverPtrsIterator\n    : public std::iterator<std::random_access_iterator_tag, Element*> {\n public:\n  typedef RepeatedPtrOverPtrsIterator<Element> iterator;\n  typedef std::iterator<\n          std::random_access_iterator_tag, Element*> superclass;\n\n  // Let the compiler know that these are type names, so we don't have to\n  // write \"typename\" in front of them everywhere.\n  typedef typename superclass::reference reference;\n  typedef typename superclass::pointer pointer;\n  typedef typename superclass::difference_type difference_type;\n\n  RepeatedPtrOverPtrsIterator() : it_(NULL) {}\n  explicit RepeatedPtrOverPtrsIterator(void** it) : it_(it) {}\n\n  // dereferenceable\n  reference operator*() const { return *reinterpret_cast<Element**>(it_); }\n  pointer   operator->() const { return &(operator*()); }\n\n  // {inc,dec}rementable\n  iterator& operator++() { ++it_; return *this; }\n  iterator  operator++(int) { return iterator(it_++); }\n  iterator& operator--() { --it_; return *this; }\n  iterator  operator--(int) { return iterator(it_--); }\n\n  // equality_comparable\n  bool operator==(const iterator& x) const { return it_ == x.it_; }\n  bool operator!=(const iterator& x) const { return it_ != x.it_; }\n\n  // less_than_comparable\n  bool operator<(const iterator& x) const { return it_ < x.it_; }\n  bool operator<=(const iterator& x) const { return it_ <= x.it_; }\n  bool operator>(const iterator& x) const { return it_ > x.it_; }\n  bool operator>=(const iterator& x) const { return it_ >= x.it_; }\n\n  // addable, subtractable\n  iterator& operator+=(difference_type d) {\n    it_ += d;\n    return *this;\n  }\n  friend iterator operator+(iterator it, difference_type d) {\n    it += d;\n    return it;\n  }\n  friend iterator operator+(difference_type d, iterator it) {\n    it += d;\n    return it;\n  }\n  iterator& operator-=(difference_type d) {\n    it_ -= d;\n    return *this;\n  }\n  friend iterator operator-(iterator it, difference_type d) {\n    it -= d;\n    return it;\n  }\n\n  // indexable\n  reference operator[](difference_type d) const { return *(*this + d); }\n\n  // random access iterator\n  difference_type operator-(const iterator& x) const { return it_ - x.it_; }\n\n private:\n  template<typename OtherElement>\n  friend class RepeatedPtrIterator;\n\n  // The internal iterator.\n  void** it_;\n};\n\n\n}  // namespace internal\n\ntemplate <typename Element>\ninline typename RepeatedPtrField<Element>::iterator\nRepeatedPtrField<Element>::begin() {\n  return iterator(raw_data());\n}\ntemplate <typename Element>\ninline typename RepeatedPtrField<Element>::const_iterator\nRepeatedPtrField<Element>::begin() const {\n  return iterator(raw_data());\n}\ntemplate <typename Element>\ninline typename RepeatedPtrField<Element>::iterator\nRepeatedPtrField<Element>::end() {\n  return iterator(raw_data() + size());\n}\ntemplate <typename Element>\ninline typename RepeatedPtrField<Element>::const_iterator\nRepeatedPtrField<Element>::end() const {\n  return iterator(raw_data() + size());\n}\n\ntemplate <typename Element>\ninline typename RepeatedPtrField<Element>::pointer_iterator\nRepeatedPtrField<Element>::pointer_begin() {\n  return pointer_iterator(raw_mutable_data());\n}\ntemplate <typename Element>\ninline typename RepeatedPtrField<Element>::pointer_iterator\nRepeatedPtrField<Element>::pointer_end() {\n  return pointer_iterator(raw_mutable_data() + size());\n}\n\n\n// Iterators and helper functions that follow the spirit of the STL\n// std::back_insert_iterator and std::back_inserter but are tailor-made\n// for RepeatedField and RepatedPtrField. Typical usage would be:\n//\n//   std::copy(some_sequence.begin(), some_sequence.end(),\n//             google::protobuf::RepeatedFieldBackInserter(proto.mutable_sequence()));\n//\n// Ported by johannes from util/gtl/proto-array-iterators-inl.h\n\nnamespace internal {\n// A back inserter for RepeatedField objects.\ntemplate<typename T> class RepeatedFieldBackInsertIterator\n    : public std::iterator<std::output_iterator_tag, T> {\n public:\n  explicit RepeatedFieldBackInsertIterator(\n      RepeatedField<T>* const mutable_field)\n      : field_(mutable_field) {\n  }\n  RepeatedFieldBackInsertIterator<T>& operator=(const T& value) {\n    field_->Add(value);\n    return *this;\n  }\n  RepeatedFieldBackInsertIterator<T>& operator*() {\n    return *this;\n  }\n  RepeatedFieldBackInsertIterator<T>& operator++() {\n    return *this;\n  }\n  RepeatedFieldBackInsertIterator<T>& operator++(int ignores_parameter) {\n    return *this;\n  }\n\n private:\n  RepeatedField<T>* field_;\n};\n\n// A back inserter for RepeatedPtrField objects.\ntemplate<typename T> class RepeatedPtrFieldBackInsertIterator\n    : public std::iterator<std::output_iterator_tag, T> {\n public:\n  RepeatedPtrFieldBackInsertIterator(\n      RepeatedPtrField<T>* const mutable_field)\n      : field_(mutable_field) {\n  }\n  RepeatedPtrFieldBackInsertIterator<T>& operator=(const T& value) {\n    *field_->Add() = value;\n    return *this;\n  }\n  RepeatedPtrFieldBackInsertIterator<T>& operator=(\n      const T* const ptr_to_value) {\n    *field_->Add() = *ptr_to_value;\n    return *this;\n  }\n  RepeatedPtrFieldBackInsertIterator<T>& operator*() {\n    return *this;\n  }\n  RepeatedPtrFieldBackInsertIterator<T>& operator++() {\n    return *this;\n  }\n  RepeatedPtrFieldBackInsertIterator<T>& operator++(int ignores_parameter) {\n    return *this;\n  }\n\n private:\n  RepeatedPtrField<T>* field_;\n};\n\n// A back inserter for RepeatedPtrFields that inserts by transfering ownership\n// of a pointer.\ntemplate<typename T> class AllocatedRepeatedPtrFieldBackInsertIterator\n    : public std::iterator<std::output_iterator_tag, T> {\n public:\n  explicit AllocatedRepeatedPtrFieldBackInsertIterator(\n      RepeatedPtrField<T>* const mutable_field)\n      : field_(mutable_field) {\n  }\n  AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator=(\n      T* const ptr_to_value) {\n    field_->AddAllocated(ptr_to_value);\n    return *this;\n  }\n  AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator*() {\n    return *this;\n  }\n  AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator++() {\n    return *this;\n  }\n  AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator++(\n      int ignores_parameter) {\n    return *this;\n  }\n\n private:\n  RepeatedPtrField<T>* field_;\n};\n}  // namespace internal\n\n// Provides a back insert iterator for RepeatedField instances,\n// similar to std::back_inserter(). Note the identically named\n// function for RepeatedPtrField instances.\ntemplate<typename T> internal::RepeatedFieldBackInsertIterator<T>\nRepeatedFieldBackInserter(RepeatedField<T>* const mutable_field) {\n  return internal::RepeatedFieldBackInsertIterator<T>(mutable_field);\n}\n\n// Provides a back insert iterator for RepeatedPtrField instances,\n// similar to std::back_inserter(). Note the identically named\n// function for RepeatedField instances.\ntemplate<typename T> internal::RepeatedPtrFieldBackInsertIterator<T>\nRepeatedFieldBackInserter(RepeatedPtrField<T>* const mutable_field) {\n  return internal::RepeatedPtrFieldBackInsertIterator<T>(mutable_field);\n}\n\n// Provides a back insert iterator for RepeatedPtrField instances\n// similar to std::back_inserter() which transfers the ownership while\n// copying elements.\ntemplate<typename T> internal::AllocatedRepeatedPtrFieldBackInsertIterator<T>\nAllocatedRepeatedPtrFieldBackInserter(\n    RepeatedPtrField<T>* const mutable_field) {\n  return internal::AllocatedRepeatedPtrFieldBackInsertIterator<T>(\n      mutable_field);\n}\n\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_REPEATED_FIELD_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// TODO(kenton):  Improve this unittest to bring it up to the standards of\n//   other proto2 unittests.\n\n#include <algorithm>\n#include <list>\n#include <vector>\n\n#include <google/protobuf/repeated_field.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/unittest.pb.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\nnamespace google {\nusing protobuf_unittest::TestAllTypes;\n\nnamespace protobuf {\nnamespace {\n\n// Test operations on a RepeatedField which is small enough that it does\n// not allocate a separate array for storage.\nTEST(RepeatedField, Small) {\n  RepeatedField<int> field;\n\n  EXPECT_EQ(field.size(), 0);\n\n  field.Add(5);\n\n  EXPECT_EQ(field.size(), 1);\n  EXPECT_EQ(field.Get(0), 5);\n\n  field.Add(42);\n\n  EXPECT_EQ(field.size(), 2);\n  EXPECT_EQ(field.Get(0), 5);\n  EXPECT_EQ(field.Get(1), 42);\n\n  field.Set(1, 23);\n\n  EXPECT_EQ(field.size(), 2);\n  EXPECT_EQ(field.Get(0), 5);\n  EXPECT_EQ(field.Get(1), 23);\n  EXPECT_EQ(field.SpaceUsedExcludingSelf(), 0);\n\n  field.RemoveLast();\n\n  EXPECT_EQ(field.size(), 1);\n  EXPECT_EQ(field.Get(0), 5);\n\n  field.Clear();\n\n  EXPECT_EQ(field.size(), 0);\n  EXPECT_EQ(field.SpaceUsedExcludingSelf(), 0);\n}\n\n// Test operations on a RepeatedField which is large enough to allocate a\n// separate array.\nTEST(RepeatedField, Large) {\n  RepeatedField<int> field;\n\n  for (int i = 0; i < 16; i++) {\n    field.Add(i * i);\n  }\n\n  EXPECT_EQ(field.size(), 16);\n\n  for (int i = 0; i < 16; i++) {\n    EXPECT_EQ(field.Get(i), i * i);\n  }\n\n  int expected_usage = 16 * sizeof(int);\n  EXPECT_GE(field.SpaceUsedExcludingSelf(), expected_usage);\n}\n\n// Test swapping between various types of RepeatedFields.\nTEST(RepeatedField, SwapSmallSmall) {\n  RepeatedField<int> field1;\n  RepeatedField<int> field2;\n\n  field1.Add(5);\n  field1.Add(42);\n\n  field1.Swap(&field2);\n\n  EXPECT_EQ(field1.size(), 0);\n  EXPECT_EQ(field2.size(), 2);\n  EXPECT_EQ(field2.Get(0), 5);\n  EXPECT_EQ(field2.Get(1), 42);\n}\n\nTEST(RepeatedField, SwapLargeSmall) {\n  RepeatedField<int> field1;\n  RepeatedField<int> field2;\n\n  for (int i = 0; i < 16; i++) {\n    field1.Add(i * i);\n  }\n  field2.Add(5);\n  field2.Add(42);\n  field1.Swap(&field2);\n\n  EXPECT_EQ(field1.size(), 2);\n  EXPECT_EQ(field1.Get(0), 5);\n  EXPECT_EQ(field1.Get(1), 42);\n  EXPECT_EQ(field2.size(), 16);\n  for (int i = 0; i < 16; i++) {\n    EXPECT_EQ(field2.Get(i), i * i);\n  }\n}\n\nTEST(RepeatedField, SwapLargeLarge) {\n  RepeatedField<int> field1;\n  RepeatedField<int> field2;\n\n  field1.Add(5);\n  field1.Add(42);\n  for (int i = 0; i < 16; i++) {\n    field1.Add(i);\n    field2.Add(i * i);\n  }\n  field2.Swap(&field1);\n\n  EXPECT_EQ(field1.size(), 16);\n  for (int i = 0; i < 16; i++) {\n    EXPECT_EQ(field1.Get(i), i * i);\n  }\n  EXPECT_EQ(field2.size(), 18);\n  EXPECT_EQ(field2.Get(0), 5);\n  EXPECT_EQ(field2.Get(1), 42);\n  for (int i = 2; i < 18; i++) {\n    EXPECT_EQ(field2.Get(i), i - 2);\n  }\n}\n\n// Determines how much space was reserved by the given field by adding elements\n// to it until it re-allocates its space.\nstatic int ReservedSpace(RepeatedField<int>* field) {\n  const int* ptr = field->data();\n  do {\n    field->Add(0);\n  } while (field->data() == ptr);\n\n  return field->size() - 1;\n}\n\nTEST(RepeatedField, ReserveMoreThanDouble) {\n  // Reserve more than double the previous space in the field and expect the\n  // field to reserve exactly the amount specified.\n  RepeatedField<int> field;\n  field.Reserve(20);\n\n  EXPECT_EQ(20, ReservedSpace(&field));\n}\n\nTEST(RepeatedField, ReserveLessThanDouble) {\n  // Reserve less than double the previous space in the field and expect the\n  // field to grow by double instead.\n  RepeatedField<int> field;\n  field.Reserve(20);\n  field.Reserve(30);\n\n  EXPECT_EQ(40, ReservedSpace(&field));\n}\n\nTEST(RepeatedField, ReserveLessThanExisting) {\n  // Reserve less than the previous space in the field and expect the\n  // field to not re-allocate at all.\n  RepeatedField<int> field;\n  field.Reserve(20);\n  const int* previous_ptr = field.data();\n  field.Reserve(10);\n\n  EXPECT_EQ(previous_ptr, field.data());\n  EXPECT_EQ(20, ReservedSpace(&field));\n}\n\nTEST(RepeatedField, MergeFrom) {\n  RepeatedField<int> source, destination;\n\n  source.Add(4);\n  source.Add(5);\n\n  destination.Add(1);\n  destination.Add(2);\n  destination.Add(3);\n\n  destination.MergeFrom(source);\n\n  ASSERT_EQ(5, destination.size());\n\n  EXPECT_EQ(1, destination.Get(0));\n  EXPECT_EQ(2, destination.Get(1));\n  EXPECT_EQ(3, destination.Get(2));\n  EXPECT_EQ(4, destination.Get(3));\n  EXPECT_EQ(5, destination.Get(4));\n}\n\nTEST(RepeatedField, CopyFrom) {\n  RepeatedField<int> source, destination;\n\n  source.Add(4);\n  source.Add(5);\n\n  destination.Add(1);\n  destination.Add(2);\n  destination.Add(3);\n\n  destination.CopyFrom(source);\n\n  ASSERT_EQ(2, destination.size());\n\n  EXPECT_EQ(4, destination.Get(0));\n  EXPECT_EQ(5, destination.Get(1));\n}\n\nTEST(RepeatedField, CopyConstruct) {\n  RepeatedField<int> source;\n  source.Add(1);\n  source.Add(2);\n\n  RepeatedField<int> destination(source);\n\n  ASSERT_EQ(2, destination.size());\n  EXPECT_EQ(1, destination.Get(0));\n  EXPECT_EQ(2, destination.Get(1));\n}\n\nTEST(RepeatedField, CopyAssign) {\n  RepeatedField<int> source, destination;\n\n  source.Add(4);\n  source.Add(5);\n\n  destination.Add(1);\n  destination.Add(2);\n  destination.Add(3);\n\n  destination = source;\n\n  ASSERT_EQ(2, destination.size());\n\n  EXPECT_EQ(4, destination.Get(0));\n  EXPECT_EQ(5, destination.Get(1));\n}\n\nTEST(RepeatedField, MutableDataIsMutable) {\n  RepeatedField<int> field;\n  field.Add(1);\n  EXPECT_EQ(1, field.Get(0));\n  // The fact that this line compiles would be enough, but we'll check the\n  // value anyway.\n  *field.mutable_data() = 2;\n  EXPECT_EQ(2, field.Get(0));\n}\n\nTEST(RepeatedField, Truncate) {\n  RepeatedField<int> field;\n\n  field.Add(12);\n  field.Add(34);\n  field.Add(56);\n  field.Add(78);\n  EXPECT_EQ(4, field.size());\n\n  field.Truncate(3);\n  EXPECT_EQ(3, field.size());\n\n  field.Add(90);\n  EXPECT_EQ(4, field.size());\n  EXPECT_EQ(90, field.Get(3));\n\n  // Truncations that don't change the size are allowed, but growing is not\n  // allowed.\n  field.Truncate(field.size());\n#ifdef GTEST_HAS_DEATH_TEST\n  EXPECT_DEBUG_DEATH(field.Truncate(field.size() + 1), \"new_size\");\n#endif\n}\n\n\n// ===================================================================\n// RepeatedPtrField tests.  These pretty much just mirror the RepeatedField\n// tests above.\n\nTEST(RepeatedPtrField, Small) {\n  RepeatedPtrField<string> field;\n\n  EXPECT_EQ(field.size(), 0);\n\n  field.Add()->assign(\"foo\");\n\n  EXPECT_EQ(field.size(), 1);\n  EXPECT_EQ(field.Get(0), \"foo\");\n\n  field.Add()->assign(\"bar\");\n\n  EXPECT_EQ(field.size(), 2);\n  EXPECT_EQ(field.Get(0), \"foo\");\n  EXPECT_EQ(field.Get(1), \"bar\");\n\n  field.Mutable(1)->assign(\"baz\");\n\n  EXPECT_EQ(field.size(), 2);\n  EXPECT_EQ(field.Get(0), \"foo\");\n  EXPECT_EQ(field.Get(1), \"baz\");\n\n  field.RemoveLast();\n\n  EXPECT_EQ(field.size(), 1);\n  EXPECT_EQ(field.Get(0), \"foo\");\n\n  field.Clear();\n\n  EXPECT_EQ(field.size(), 0);\n}\n\nTEST(RepeatedPtrField, Large) {\n  RepeatedPtrField<string> field;\n\n  for (int i = 0; i < 16; i++) {\n    *field.Add() += 'a' + i;\n  }\n\n  EXPECT_EQ(field.size(), 16);\n\n  for (int i = 0; i < 16; i++) {\n    EXPECT_EQ(field.Get(i).size(), 1);\n    EXPECT_EQ(field.Get(i)[0], 'a' + i);\n  }\n\n  int min_expected_usage = 16 * sizeof(string);\n  EXPECT_GE(field.SpaceUsedExcludingSelf(), min_expected_usage);\n}\n\nTEST(RepeatedPtrField, SwapSmallSmall) {\n  RepeatedPtrField<string> field1;\n  RepeatedPtrField<string> field2;\n\n  field1.Add()->assign(\"foo\");\n  field1.Add()->assign(\"bar\");\n  field1.Swap(&field2);\n\n  EXPECT_EQ(field1.size(), 0);\n  EXPECT_EQ(field2.size(), 2);\n  EXPECT_EQ(field2.Get(0), \"foo\");\n  EXPECT_EQ(field2.Get(1), \"bar\");\n}\n\nTEST(RepeatedPtrField, SwapLargeSmall) {\n  RepeatedPtrField<string> field1;\n  RepeatedPtrField<string> field2;\n\n  field2.Add()->assign(\"foo\");\n  field2.Add()->assign(\"bar\");\n  for (int i = 0; i < 16; i++) {\n    *field1.Add() += 'a' + i;\n  }\n  field1.Swap(&field2);\n\n  EXPECT_EQ(field1.size(), 2);\n  EXPECT_EQ(field1.Get(0), \"foo\");\n  EXPECT_EQ(field1.Get(1), \"bar\");\n  EXPECT_EQ(field2.size(), 16);\n  for (int i = 0; i < 16; i++) {\n    EXPECT_EQ(field2.Get(i).size(), 1);\n    EXPECT_EQ(field2.Get(i)[0], 'a' + i);\n  }\n}\n\nTEST(RepeatedPtrField, SwapLargeLarge) {\n  RepeatedPtrField<string> field1;\n  RepeatedPtrField<string> field2;\n\n  field1.Add()->assign(\"foo\");\n  field1.Add()->assign(\"bar\");\n  for (int i = 0; i < 16; i++) {\n    *field1.Add() += 'A' + i;\n    *field2.Add() += 'a' + i;\n  }\n  field2.Swap(&field1);\n\n  EXPECT_EQ(field1.size(), 16);\n  for (int i = 0; i < 16; i++) {\n    EXPECT_EQ(field1.Get(i).size(), 1);\n    EXPECT_EQ(field1.Get(i)[0], 'a' + i);\n  }\n  EXPECT_EQ(field2.size(), 18);\n  EXPECT_EQ(field2.Get(0), \"foo\");\n  EXPECT_EQ(field2.Get(1), \"bar\");\n  for (int i = 2; i < 18; i++) {\n    EXPECT_EQ(field2.Get(i).size(), 1);\n    EXPECT_EQ(field2.Get(i)[0], 'A' + i - 2);\n  }\n}\n\nstatic int ReservedSpace(RepeatedPtrField<string>* field) {\n  const string* const* ptr = field->data();\n  do {\n    field->Add();\n  } while (field->data() == ptr);\n\n  return field->size() - 1;\n}\n\nTEST(RepeatedPtrField, ReserveMoreThanDouble) {\n  RepeatedPtrField<string> field;\n  field.Reserve(20);\n\n  EXPECT_EQ(20, ReservedSpace(&field));\n}\n\nTEST(RepeatedPtrField, ReserveLessThanDouble) {\n  RepeatedPtrField<string> field;\n  field.Reserve(20);\n  field.Reserve(30);\n\n  EXPECT_EQ(40, ReservedSpace(&field));\n}\n\nTEST(RepeatedPtrField, ReserveLessThanExisting) {\n  RepeatedPtrField<string> field;\n  field.Reserve(20);\n  const string* const* previous_ptr = field.data();\n  field.Reserve(10);\n\n  EXPECT_EQ(previous_ptr, field.data());\n  EXPECT_EQ(20, ReservedSpace(&field));\n}\n\nTEST(RepeatedPtrField, ReserveDoesntLoseAllocated) {\n  // Check that a bug is fixed:  An earlier implementation of Reserve()\n  // failed to copy pointers to allocated-but-cleared objects, possibly\n  // leading to segfaults.\n  RepeatedPtrField<string> field;\n  string* first = field.Add();\n  field.RemoveLast();\n\n  field.Reserve(20);\n  EXPECT_EQ(first, field.Add());\n}\n\n// Clearing elements is tricky with RepeatedPtrFields since the memory for\n// the elements is retained and reused.\nTEST(RepeatedPtrField, ClearedElements) {\n  RepeatedPtrField<string> field;\n\n  string* original = field.Add();\n  *original = \"foo\";\n\n  EXPECT_EQ(field.ClearedCount(), 0);\n\n  field.RemoveLast();\n  EXPECT_TRUE(original->empty());\n  EXPECT_EQ(field.ClearedCount(), 1);\n\n  EXPECT_EQ(field.Add(), original);  // Should return same string for reuse.\n\n  EXPECT_EQ(field.ReleaseLast(), original);  // We take ownership.\n  EXPECT_EQ(field.ClearedCount(), 0);\n\n  EXPECT_NE(field.Add(), original);  // Should NOT return the same string.\n  EXPECT_EQ(field.ClearedCount(), 0);\n\n  field.AddAllocated(original);  // Give ownership back.\n  EXPECT_EQ(field.ClearedCount(), 0);\n  EXPECT_EQ(field.Mutable(1), original);\n\n  field.Clear();\n  EXPECT_EQ(field.ClearedCount(), 2);\n  EXPECT_EQ(field.ReleaseCleared(), original);  // Take ownership again.\n  EXPECT_EQ(field.ClearedCount(), 1);\n  EXPECT_NE(field.Add(), original);\n  EXPECT_EQ(field.ClearedCount(), 0);\n  EXPECT_NE(field.Add(), original);\n  EXPECT_EQ(field.ClearedCount(), 0);\n\n  field.AddCleared(original);  // Give ownership back, but as a cleared object.\n  EXPECT_EQ(field.ClearedCount(), 1);\n  EXPECT_EQ(field.Add(), original);\n  EXPECT_EQ(field.ClearedCount(), 0);\n}\n\n// Test all code paths in AddAllocated().\nTEST(RepeatedPtrField, AddAlocated) {\n  RepeatedPtrField<string> field;\n  while (field.size() < field.Capacity()) {\n    field.Add()->assign(\"filler\");\n  }\n\n  int index = field.size();\n\n  // First branch:  Field is at capacity with no cleared objects.\n  string* foo = new string(\"foo\");\n  field.AddAllocated(foo);\n  EXPECT_EQ(index + 1, field.size());\n  EXPECT_EQ(0, field.ClearedCount());\n  EXPECT_EQ(foo, &field.Get(index));\n\n  // Last branch:  Field is not at capacity and there are no cleared objects.\n  string* bar = new string(\"bar\");\n  field.AddAllocated(bar);\n  ++index;\n  EXPECT_EQ(index + 1, field.size());\n  EXPECT_EQ(0, field.ClearedCount());\n  EXPECT_EQ(bar, &field.Get(index));\n\n  // Third branch:  Field is not at capacity and there are no cleared objects.\n  field.RemoveLast();\n  string* baz = new string(\"baz\");\n  field.AddAllocated(baz);\n  EXPECT_EQ(index + 1, field.size());\n  EXPECT_EQ(1, field.ClearedCount());\n  EXPECT_EQ(baz, &field.Get(index));\n\n  // Second branch:  Field is at capacity but has some cleared objects.\n  while (field.size() < field.Capacity()) {\n    field.Add()->assign(\"filler2\");\n  }\n  field.RemoveLast();\n  index = field.size();\n  string* qux = new string(\"qux\");\n  field.AddAllocated(qux);\n  EXPECT_EQ(index + 1, field.size());\n  // We should have discarded the cleared object.\n  EXPECT_EQ(0, field.ClearedCount());\n  EXPECT_EQ(qux, &field.Get(index));\n}\n\nTEST(RepeatedPtrField, MergeFrom) {\n  RepeatedPtrField<string> source, destination;\n\n  source.Add()->assign(\"4\");\n  source.Add()->assign(\"5\");\n\n  destination.Add()->assign(\"1\");\n  destination.Add()->assign(\"2\");\n  destination.Add()->assign(\"3\");\n\n  destination.MergeFrom(source);\n\n  ASSERT_EQ(5, destination.size());\n\n  EXPECT_EQ(\"1\", destination.Get(0));\n  EXPECT_EQ(\"2\", destination.Get(1));\n  EXPECT_EQ(\"3\", destination.Get(2));\n  EXPECT_EQ(\"4\", destination.Get(3));\n  EXPECT_EQ(\"5\", destination.Get(4));\n}\n\nTEST(RepeatedPtrField, CopyFrom) {\n  RepeatedPtrField<string> source, destination;\n\n  source.Add()->assign(\"4\");\n  source.Add()->assign(\"5\");\n\n  destination.Add()->assign(\"1\");\n  destination.Add()->assign(\"2\");\n  destination.Add()->assign(\"3\");\n\n  destination.CopyFrom(source);\n\n  ASSERT_EQ(2, destination.size());\n\n  EXPECT_EQ(\"4\", destination.Get(0));\n  EXPECT_EQ(\"5\", destination.Get(1));\n}\n\nTEST(RepeatedPtrField, CopyConstruct) {\n  RepeatedPtrField<string> source;\n\n  source.Add()->assign(\"1\");\n  source.Add()->assign(\"2\");\n\n  RepeatedPtrField<string> destination(source);\n\n  ASSERT_EQ(2, destination.size());\n  EXPECT_EQ(\"1\", destination.Get(0));\n  EXPECT_EQ(\"2\", destination.Get(1));\n}\n\nTEST(RepeatedPtrField, CopyAssign) {\n  RepeatedPtrField<string> source, destination;\n\n  source.Add()->assign(\"4\");\n  source.Add()->assign(\"5\");\n\n  destination.Add()->assign(\"1\");\n  destination.Add()->assign(\"2\");\n  destination.Add()->assign(\"3\");\n\n  destination = source;\n\n  ASSERT_EQ(2, destination.size());\n\n  EXPECT_EQ(\"4\", destination.Get(0));\n  EXPECT_EQ(\"5\", destination.Get(1));\n}\n\nTEST(RepeatedPtrField, MutableDataIsMutable) {\n  RepeatedPtrField<string> field;\n  *field.Add() = \"1\";\n  EXPECT_EQ(\"1\", field.Get(0));\n  // The fact that this line compiles would be enough, but we'll check the\n  // value anyway.\n  string** data = field.mutable_data();\n  **data = \"2\";\n  EXPECT_EQ(\"2\", field.Get(0));\n}\n\n// ===================================================================\n\n// Iterator tests stolen from net/proto/proto-array_unittest.\nclass RepeatedFieldIteratorTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    for (int i = 0; i < 3; ++i) {\n      proto_array_.Add(i);\n    }\n  }\n\n  RepeatedField<int> proto_array_;\n};\n\nTEST_F(RepeatedFieldIteratorTest, Convertible) {\n  RepeatedField<int>::iterator iter = proto_array_.begin();\n  RepeatedField<int>::const_iterator c_iter = iter;\n  RepeatedField<int>::value_type value = *c_iter;\n  EXPECT_EQ(0, value);\n}\n\nTEST_F(RepeatedFieldIteratorTest, MutableIteration) {\n  RepeatedField<int>::iterator iter = proto_array_.begin();\n  EXPECT_EQ(0, *iter);\n  ++iter;\n  EXPECT_EQ(1, *iter++);\n  EXPECT_EQ(2, *iter);\n  ++iter;\n  EXPECT_TRUE(proto_array_.end() == iter);\n\n  EXPECT_EQ(2, *(proto_array_.end() - 1));\n}\n\nTEST_F(RepeatedFieldIteratorTest, ConstIteration) {\n  const RepeatedField<int>& const_proto_array = proto_array_;\n  RepeatedField<int>::const_iterator iter = const_proto_array.begin();\n  EXPECT_EQ(0, *iter);\n  ++iter;\n  EXPECT_EQ(1, *iter++);\n  EXPECT_EQ(2, *iter);\n  ++iter;\n  EXPECT_TRUE(proto_array_.end() == iter);\n  EXPECT_EQ(2, *(proto_array_.end() - 1));\n}\n\nTEST_F(RepeatedFieldIteratorTest, Mutation) {\n  RepeatedField<int>::iterator iter = proto_array_.begin();\n  *iter = 7;\n  EXPECT_EQ(7, proto_array_.Get(0));\n}\n\n// -------------------------------------------------------------------\n\nclass RepeatedPtrFieldIteratorTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    proto_array_.Add()->assign(\"foo\");\n    proto_array_.Add()->assign(\"bar\");\n    proto_array_.Add()->assign(\"baz\");\n  }\n\n  RepeatedPtrField<string> proto_array_;\n};\n\nTEST_F(RepeatedPtrFieldIteratorTest, Convertible) {\n  RepeatedPtrField<string>::iterator iter = proto_array_.begin();\n  RepeatedPtrField<string>::const_iterator c_iter = iter;\n  RepeatedPtrField<string>::value_type value = *c_iter;\n  EXPECT_EQ(\"foo\", value);\n}\n\nTEST_F(RepeatedPtrFieldIteratorTest, MutableIteration) {\n  RepeatedPtrField<string>::iterator iter = proto_array_.begin();\n  EXPECT_EQ(\"foo\", *iter);\n  ++iter;\n  EXPECT_EQ(\"bar\", *(iter++));\n  EXPECT_EQ(\"baz\", *iter);\n  ++iter;\n  EXPECT_TRUE(proto_array_.end() == iter);\n  EXPECT_EQ(\"baz\", *(--proto_array_.end()));\n}\n\nTEST_F(RepeatedPtrFieldIteratorTest, ConstIteration) {\n  const RepeatedPtrField<string>& const_proto_array = proto_array_;\n  RepeatedPtrField<string>::const_iterator iter = const_proto_array.begin();\n  EXPECT_EQ(\"foo\", *iter);\n  ++iter;\n  EXPECT_EQ(\"bar\", *(iter++));\n  EXPECT_EQ(\"baz\", *iter);\n  ++iter;\n  EXPECT_TRUE(const_proto_array.end() == iter);\n  EXPECT_EQ(\"baz\", *(--const_proto_array.end()));\n}\n\nTEST_F(RepeatedPtrFieldIteratorTest, RandomAccess) {\n  RepeatedPtrField<string>::iterator iter = proto_array_.begin();\n  RepeatedPtrField<string>::iterator iter2 = iter;\n  ++iter2;\n  ++iter2;\n  EXPECT_TRUE(iter + 2 == iter2);\n  EXPECT_TRUE(iter == iter2 - 2);\n  EXPECT_EQ(\"baz\", iter[2]);\n  EXPECT_EQ(\"baz\", *(iter + 2));\n  EXPECT_EQ(3, proto_array_.end() - proto_array_.begin());\n}\n\nTEST_F(RepeatedPtrFieldIteratorTest, Comparable) {\n  RepeatedPtrField<string>::const_iterator iter = proto_array_.begin();\n  RepeatedPtrField<string>::const_iterator iter2 = iter + 1;\n  EXPECT_TRUE(iter == iter);\n  EXPECT_TRUE(iter != iter2);\n  EXPECT_TRUE(iter < iter2);\n  EXPECT_TRUE(iter <= iter2);\n  EXPECT_TRUE(iter <= iter);\n  EXPECT_TRUE(iter2 > iter);\n  EXPECT_TRUE(iter2 >= iter);\n  EXPECT_TRUE(iter >= iter);\n}\n\n// Uninitialized iterator does not point to any of the RepeatedPtrField.\nTEST_F(RepeatedPtrFieldIteratorTest, UninitializedIterator) {\n  RepeatedPtrField<string>::iterator iter;\n  EXPECT_TRUE(iter != proto_array_.begin());\n  EXPECT_TRUE(iter != proto_array_.begin() + 1);\n  EXPECT_TRUE(iter != proto_array_.begin() + 2);\n  EXPECT_TRUE(iter != proto_array_.begin() + 3);\n  EXPECT_TRUE(iter != proto_array_.end());\n}\n\nTEST_F(RepeatedPtrFieldIteratorTest, STLAlgorithms_lower_bound) {\n  proto_array_.Clear();\n  proto_array_.Add()->assign(\"a\");\n  proto_array_.Add()->assign(\"c\");\n  proto_array_.Add()->assign(\"d\");\n  proto_array_.Add()->assign(\"n\");\n  proto_array_.Add()->assign(\"p\");\n  proto_array_.Add()->assign(\"x\");\n  proto_array_.Add()->assign(\"y\");\n\n  string v = \"f\";\n  RepeatedPtrField<string>::const_iterator it =\n      lower_bound(proto_array_.begin(), proto_array_.end(), v);\n\n  EXPECT_EQ(*it, \"n\");\n  EXPECT_TRUE(it == proto_array_.begin() + 3);\n}\n\nTEST_F(RepeatedPtrFieldIteratorTest, Mutation) {\n  RepeatedPtrField<string>::iterator iter = proto_array_.begin();\n  *iter = \"qux\";\n  EXPECT_EQ(\"qux\", proto_array_.Get(0));\n}\n\n// -------------------------------------------------------------------\n\nclass RepeatedPtrFieldPtrsIteratorTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    proto_array_.Add()->assign(\"foo\");\n    proto_array_.Add()->assign(\"bar\");\n    proto_array_.Add()->assign(\"baz\");\n  }\n\n  RepeatedPtrField<string> proto_array_;\n};\n\nTEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertiblePtr) {\n  RepeatedPtrField<string>::pointer_iterator iter =\n      proto_array_.pointer_begin();\n}\n\nTEST_F(RepeatedPtrFieldPtrsIteratorTest, MutablePtrIteration) {\n  RepeatedPtrField<string>::pointer_iterator iter =\n      proto_array_.pointer_begin();\n  EXPECT_EQ(\"foo\", **iter);\n  ++iter;\n  EXPECT_EQ(\"bar\", **(iter++));\n  EXPECT_EQ(\"baz\", **iter);\n  ++iter;\n  EXPECT_TRUE(proto_array_.pointer_end() == iter);\n  EXPECT_EQ(\"baz\", **(--proto_array_.pointer_end()));\n}\n\nTEST_F(RepeatedPtrFieldPtrsIteratorTest, RandomPtrAccess) {\n  RepeatedPtrField<string>::pointer_iterator iter =\n      proto_array_.pointer_begin();\n  RepeatedPtrField<string>::pointer_iterator iter2 = iter;\n  ++iter2;\n  ++iter2;\n  EXPECT_TRUE(iter + 2 == iter2);\n  EXPECT_TRUE(iter == iter2 - 2);\n  EXPECT_EQ(\"baz\", *iter[2]);\n  EXPECT_EQ(\"baz\", **(iter + 2));\n  EXPECT_EQ(3, proto_array_.end() - proto_array_.begin());\n}\n\nTEST_F(RepeatedPtrFieldPtrsIteratorTest, ComparablePtr) {\n  RepeatedPtrField<string>::pointer_iterator iter =\n      proto_array_.pointer_begin();\n  RepeatedPtrField<string>::pointer_iterator iter2 = iter + 1;\n  EXPECT_TRUE(iter == iter);\n  EXPECT_TRUE(iter != iter2);\n  EXPECT_TRUE(iter < iter2);\n  EXPECT_TRUE(iter <= iter2);\n  EXPECT_TRUE(iter <= iter);\n  EXPECT_TRUE(iter2 > iter);\n  EXPECT_TRUE(iter2 >= iter);\n  EXPECT_TRUE(iter >= iter);\n}\n\n// Uninitialized iterator does not point to any of the RepeatedPtrOverPtrs.\n// Dereferencing an uninitialized iterator crashes the process.\nTEST_F(RepeatedPtrFieldPtrsIteratorTest, UninitializedPtrIterator) {\n  RepeatedPtrField<string>::pointer_iterator iter;\n  EXPECT_TRUE(iter != proto_array_.pointer_begin());\n  EXPECT_TRUE(iter != proto_array_.pointer_begin() + 1);\n  EXPECT_TRUE(iter != proto_array_.pointer_begin() + 2);\n  EXPECT_TRUE(iter != proto_array_.pointer_begin() + 3);\n  EXPECT_TRUE(iter != proto_array_.pointer_end());\n}\n\n\n// This comparison functor is required by the tests for RepeatedPtrOverPtrs.\n// They operate on strings and need to compare strings as strings in\n// any stl algorithm, even though the iterator returns a pointer to a string\n// - i.e. *iter has type string*.\nstruct StringLessThan {\n  bool operator()(const string* z, const string& y) {\n    return *z < y;\n  }\n  bool operator()(const string* z, const string* y) {\n    return *z < *y;\n  }\n};\n\nTEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrSTLAlgorithms_lower_bound) {\n  proto_array_.Clear();\n  proto_array_.Add()->assign(\"a\");\n  proto_array_.Add()->assign(\"c\");\n  proto_array_.Add()->assign(\"d\");\n  proto_array_.Add()->assign(\"n\");\n  proto_array_.Add()->assign(\"p\");\n  proto_array_.Add()->assign(\"x\");\n  proto_array_.Add()->assign(\"y\");\n\n  RepeatedPtrField<string>::pointer_iterator iter =\n      proto_array_.pointer_begin();\n  string v = \"f\";\n  RepeatedPtrField<string>::pointer_iterator it =\n      lower_bound(proto_array_.pointer_begin(), proto_array_.pointer_end(),\n                  &v, StringLessThan());\n\n  GOOGLE_CHECK(*it != NULL);\n\n  EXPECT_EQ(**it, \"n\");\n  EXPECT_TRUE(it == proto_array_.pointer_begin() + 3);\n}\n\nTEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrMutation) {\n  RepeatedPtrField<string>::pointer_iterator iter =\n      proto_array_.pointer_begin();\n  **iter = \"qux\";\n  EXPECT_EQ(\"qux\", proto_array_.Get(0));\n\n  EXPECT_EQ(\"bar\", proto_array_.Get(1));\n  EXPECT_EQ(\"baz\", proto_array_.Get(2));\n  ++iter;\n  delete *iter;\n  *iter = new string(\"a\");\n  ++iter;\n  delete *iter;\n  *iter = new string(\"b\");\n  EXPECT_EQ(\"a\", proto_array_.Get(1));\n  EXPECT_EQ(\"b\", proto_array_.Get(2));\n}\n\nTEST_F(RepeatedPtrFieldPtrsIteratorTest, Sort) {\n  proto_array_.Add()->assign(\"c\");\n  proto_array_.Add()->assign(\"d\");\n  proto_array_.Add()->assign(\"n\");\n  proto_array_.Add()->assign(\"p\");\n  proto_array_.Add()->assign(\"a\");\n  proto_array_.Add()->assign(\"y\");\n  proto_array_.Add()->assign(\"x\");\n  EXPECT_EQ(\"foo\", proto_array_.Get(0));\n  EXPECT_EQ(\"n\", proto_array_.Get(5));\n  EXPECT_EQ(\"x\", proto_array_.Get(9));\n  sort(proto_array_.pointer_begin(),\n       proto_array_.pointer_end(),\n       StringLessThan());\n  EXPECT_EQ(\"a\", proto_array_.Get(0));\n  EXPECT_EQ(\"baz\", proto_array_.Get(2));\n  EXPECT_EQ(\"y\", proto_array_.Get(9));\n}\n\n\n// -----------------------------------------------------------------------------\n// Unit-tests for the insert iterators\n// google::protobuf::RepeatedFieldBackInserter,\n// google::protobuf::AllocatedRepeatedPtrFieldBackInserter\n// Ported from util/gtl/proto-array-iterators_unittest.\n\nclass RepeatedFieldInsertionIteratorsTest : public testing::Test {\n protected:\n  std::list<double> halves;\n  std::list<int> fibonacci;\n  std::vector<string> words;\n  typedef TestAllTypes::NestedMessage Nested;\n  Nested nesteds[2];\n  std::vector<Nested*> nested_ptrs;\n  TestAllTypes protobuffer;\n\n  virtual void SetUp() {\n    fibonacci.push_back(1);\n    fibonacci.push_back(1);\n    fibonacci.push_back(2);\n    fibonacci.push_back(3);\n    fibonacci.push_back(5);\n    fibonacci.push_back(8);\n    std::copy(fibonacci.begin(), fibonacci.end(),\n              RepeatedFieldBackInserter(protobuffer.mutable_repeated_int32()));\n\n    halves.push_back(1.0);\n    halves.push_back(0.5);\n    halves.push_back(0.25);\n    halves.push_back(0.125);\n    halves.push_back(0.0625);\n    std::copy(halves.begin(), halves.end(),\n              RepeatedFieldBackInserter(protobuffer.mutable_repeated_double()));\n\n    words.push_back(\"Able\");\n    words.push_back(\"was\");\n    words.push_back(\"I\");\n    words.push_back(\"ere\");\n    words.push_back(\"I\");\n    words.push_back(\"saw\");\n    words.push_back(\"Elba\");\n    std::copy(words.begin(), words.end(),\n              RepeatedFieldBackInserter(protobuffer.mutable_repeated_string()));\n\n    nesteds[0].set_bb(17);\n    nesteds[1].set_bb(4711);\n    std::copy(&nesteds[0], &nesteds[2],\n              RepeatedFieldBackInserter(\n                  protobuffer.mutable_repeated_nested_message()));\n\n    nested_ptrs.push_back(new Nested);\n    nested_ptrs.back()->set_bb(170);\n    nested_ptrs.push_back(new Nested);\n    nested_ptrs.back()->set_bb(47110);\n    std::copy(nested_ptrs.begin(), nested_ptrs.end(),\n              RepeatedFieldBackInserter(\n                  protobuffer.mutable_repeated_nested_message()));\n\n  }\n\n  virtual void TearDown() {\n    STLDeleteContainerPointers(nested_ptrs.begin(), nested_ptrs.end());\n  }\n};\n\nTEST_F(RepeatedFieldInsertionIteratorsTest, Fibonacci) {\n  EXPECT_TRUE(std::equal(fibonacci.begin(),\n                         fibonacci.end(),\n                         protobuffer.repeated_int32().begin()));\n  EXPECT_TRUE(std::equal(protobuffer.repeated_int32().begin(),\n                         protobuffer.repeated_int32().end(),\n                         fibonacci.begin()));\n}\n\nTEST_F(RepeatedFieldInsertionIteratorsTest, Halves) {\n  EXPECT_TRUE(std::equal(halves.begin(),\n                         halves.end(),\n                         protobuffer.repeated_double().begin()));\n  EXPECT_TRUE(std::equal(protobuffer.repeated_double().begin(),\n                         protobuffer.repeated_double().end(),\n                         halves.begin()));\n}\n\nTEST_F(RepeatedFieldInsertionIteratorsTest, Words) {\n  ASSERT_EQ(words.size(), protobuffer.repeated_string_size());\n  EXPECT_EQ(words.at(0), protobuffer.repeated_string(0));\n  EXPECT_EQ(words.at(1), protobuffer.repeated_string(1));\n  EXPECT_EQ(words.at(2), protobuffer.repeated_string(2));\n  EXPECT_EQ(words.at(3), protobuffer.repeated_string(3));\n  EXPECT_EQ(words.at(4), protobuffer.repeated_string(4));\n  EXPECT_EQ(words.at(5), protobuffer.repeated_string(5));\n  EXPECT_EQ(words.at(6), protobuffer.repeated_string(6));\n}\n\nTEST_F(RepeatedFieldInsertionIteratorsTest, Nesteds) {\n  ASSERT_EQ(protobuffer.repeated_nested_message_size(), 4);\n  EXPECT_EQ(protobuffer.repeated_nested_message(0).bb(), 17);\n  EXPECT_EQ(protobuffer.repeated_nested_message(1).bb(), 4711);\n  EXPECT_EQ(protobuffer.repeated_nested_message(2).bb(), 170);\n  EXPECT_EQ(protobuffer.repeated_nested_message(3).bb(), 47110);\n}\n\nTEST_F(RepeatedFieldInsertionIteratorsTest,\n       AllocatedRepeatedPtrFieldWithStringIntData) {\n  vector<Nested*> data;\n  TestAllTypes goldenproto;\n  for (int i = 0; i < 10; ++i) {\n    Nested* new_data = new Nested;\n    new_data->set_bb(i);\n    data.push_back(new_data);\n\n    new_data = goldenproto.add_repeated_nested_message();\n    new_data->set_bb(i);\n  }\n  TestAllTypes testproto;\n  copy(data.begin(), data.end(),\n       AllocatedRepeatedPtrFieldBackInserter(\n           testproto.mutable_repeated_nested_message()));\n  EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());\n}\n\nTEST_F(RepeatedFieldInsertionIteratorsTest,\n       AllocatedRepeatedPtrFieldWithString) {\n  vector<string*> data;\n  TestAllTypes goldenproto;\n  for (int i = 0; i < 10; ++i) {\n    string* new_data = new string;\n    *new_data = \"name-\" + SimpleItoa(i);\n    data.push_back(new_data);\n\n    new_data = goldenproto.add_repeated_string();\n    *new_data = \"name-\" + SimpleItoa(i);\n  }\n  TestAllTypes testproto;\n  copy(data.begin(), data.end(),\n       AllocatedRepeatedPtrFieldBackInserter(\n           testproto.mutable_repeated_string()));\n  EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());\n}\n\n}  // namespace\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/service.h>\n\nnamespace google {\nnamespace protobuf {\n\nService::~Service() {}\nRpcChannel::~RpcChannel() {}\nRpcController::~RpcController() {}\n\n}  // namespace protobuf\n\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// DEPRECATED:  This module declares the abstract interfaces underlying proto2\n// RPC services.  These are intented to be independent of any particular RPC\n// implementation, so that proto2 services can be used on top of a variety\n// of implementations.  Starting with version 2.3.0, RPC implementations should\n// not try to build on these, but should instead provide code generator plugins\n// which generate code specific to the particular RPC implementation.  This way\n// the generated code can be more appropriate for the implementation in use\n// and can avoid unnecessary layers of indirection.\n//\n//\n// When you use the protocol compiler to compile a service definition, it\n// generates two classes:  An abstract interface for the service (with\n// methods matching the service definition) and a \"stub\" implementation.\n// A stub is just a type-safe wrapper around an RpcChannel which emulates a\n// local implementation of the service.\n//\n// For example, the service definition:\n//   service MyService {\n//     rpc Foo(MyRequest) returns(MyResponse);\n//   }\n// will generate abstract interface \"MyService\" and class \"MyService::Stub\".\n// You could implement a MyService as follows:\n//   class MyServiceImpl : public MyService {\n//    public:\n//     MyServiceImpl() {}\n//     ~MyServiceImpl() {}\n//\n//     // implements MyService ---------------------------------------\n//\n//     void Foo(google::protobuf::RpcController* controller,\n//              const MyRequest* request,\n//              MyResponse* response,\n//              Closure* done) {\n//       // ... read request and fill in response ...\n//       done->Run();\n//     }\n//   };\n// You would then register an instance of MyServiceImpl with your RPC server\n// implementation.  (How to do that depends on the implementation.)\n//\n// To call a remote MyServiceImpl, first you need an RpcChannel connected to it.\n// How to construct a channel depends, again, on your RPC implementation.\n// Here we use a hypothentical \"MyRpcChannel\" as an example:\n//   MyRpcChannel channel(\"rpc:hostname:1234/myservice\");\n//   MyRpcController controller;\n//   MyServiceImpl::Stub stub(&channel);\n//   FooRequest request;\n//   FooRespnose response;\n//\n//   // ... fill in request ...\n//\n//   stub.Foo(&controller, request, &response, NewCallback(HandleResponse));\n//\n// On Thread-Safety:\n//\n// Different RPC implementations may make different guarantees about what\n// threads they may run callbacks on, and what threads the application is\n// allowed to use to call the RPC system.  Portable software should be ready\n// for callbacks to be called on any thread, but should not try to call the\n// RPC system from any thread except for the ones on which it received the\n// callbacks.  Realistically, though, simple software will probably want to\n// use a single-threaded RPC system while high-end software will want to\n// use multiple threads.  RPC implementations should provide multiple\n// choices.\n\n#ifndef GOOGLE_PROTOBUF_SERVICE_H__\n#define GOOGLE_PROTOBUF_SERVICE_H__\n\n#include <string>\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\n\n// Defined in this file.\nclass Service;\nclass RpcController;\nclass RpcChannel;\n\n// Defined in other files.\nclass Descriptor;            // descriptor.h\nclass ServiceDescriptor;     // descriptor.h\nclass MethodDescriptor;      // descriptor.h\nclass Message;               // message.h\n\n// Abstract base interface for protocol-buffer-based RPC services.  Services\n// themselves are abstract interfaces (implemented either by servers or as\n// stubs), but they subclass this base interface.  The methods of this\n// interface can be used to call the methods of the Service without knowing\n// its exact type at compile time (analogous to Reflection).\nclass LIBPROTOBUF_EXPORT Service {\n public:\n  inline Service() {}\n  virtual ~Service();\n\n  // When constructing a stub, you may pass STUB_OWNS_CHANNEL as the second\n  // parameter to the constructor to tell it to delete its RpcChannel when\n  // destroyed.\n  enum ChannelOwnership {\n    STUB_OWNS_CHANNEL,\n    STUB_DOESNT_OWN_CHANNEL\n  };\n\n  // Get the ServiceDescriptor describing this service and its methods.\n  virtual const ServiceDescriptor* GetDescriptor() = 0;\n\n  // Call a method of the service specified by MethodDescriptor.  This is\n  // normally implemented as a simple switch() that calls the standard\n  // definitions of the service's methods.\n  //\n  // Preconditions:\n  // * method->service() == GetDescriptor()\n  // * request and response are of the exact same classes as the objects\n  //   returned by GetRequestPrototype(method) and\n  //   GetResponsePrototype(method).\n  // * After the call has started, the request must not be modified and the\n  //   response must not be accessed at all until \"done\" is called.\n  // * \"controller\" is of the correct type for the RPC implementation being\n  //   used by this Service.  For stubs, the \"correct type\" depends on the\n  //   RpcChannel which the stub is using.  Server-side Service\n  //   implementations are expected to accept whatever type of RpcController\n  //   the server-side RPC implementation uses.\n  //\n  // Postconditions:\n  // * \"done\" will be called when the method is complete.  This may be\n  //   before CallMethod() returns or it may be at some point in the future.\n  // * If the RPC succeeded, \"response\" contains the response returned by\n  //   the server.\n  // * If the RPC failed, \"response\"'s contents are undefined.  The\n  //   RpcController can be queried to determine if an error occurred and\n  //   possibly to get more information about the error.\n  virtual void CallMethod(const MethodDescriptor* method,\n                          RpcController* controller,\n                          const Message* request,\n                          Message* response,\n                          Closure* done) = 0;\n\n  // CallMethod() requires that the request and response passed in are of a\n  // particular subclass of Message.  GetRequestPrototype() and\n  // GetResponsePrototype() get the default instances of these required types.\n  // You can then call Message::New() on these instances to construct mutable\n  // objects which you can then pass to CallMethod().\n  //\n  // Example:\n  //   const MethodDescriptor* method =\n  //     service->GetDescriptor()->FindMethodByName(\"Foo\");\n  //   Message* request  = stub->GetRequestPrototype (method)->New();\n  //   Message* response = stub->GetResponsePrototype(method)->New();\n  //   request->ParseFromString(input);\n  //   service->CallMethod(method, *request, response, callback);\n  virtual const Message& GetRequestPrototype(\n    const MethodDescriptor* method) const = 0;\n  virtual const Message& GetResponsePrototype(\n    const MethodDescriptor* method) const = 0;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Service);\n};\n\n// An RpcController mediates a single method call.  The primary purpose of\n// the controller is to provide a way to manipulate settings specific to the\n// RPC implementation and to find out about RPC-level errors.\n//\n// The methods provided by the RpcController interface are intended to be a\n// \"least common denominator\" set of features which we expect all\n// implementations to support.  Specific implementations may provide more\n// advanced features (e.g. deadline propagation).\nclass LIBPROTOBUF_EXPORT RpcController {\n public:\n  inline RpcController() {}\n  virtual ~RpcController();\n\n  // Client-side methods ---------------------------------------------\n  // These calls may be made from the client side only.  Their results\n  // are undefined on the server side (may crash).\n\n  // Resets the RpcController to its initial state so that it may be reused in\n  // a new call.  Must not be called while an RPC is in progress.\n  virtual void Reset() = 0;\n\n  // After a call has finished, returns true if the call failed.  The possible\n  // reasons for failure depend on the RPC implementation.  Failed() must not\n  // be called before a call has finished.  If Failed() returns true, the\n  // contents of the response message are undefined.\n  virtual bool Failed() const = 0;\n\n  // If Failed() is true, returns a human-readable description of the error.\n  virtual string ErrorText() const = 0;\n\n  // Advises the RPC system that the caller desires that the RPC call be\n  // canceled.  The RPC system may cancel it immediately, may wait awhile and\n  // then cancel it, or may not even cancel the call at all.  If the call is\n  // canceled, the \"done\" callback will still be called and the RpcController\n  // will indicate that the call failed at that time.\n  virtual void StartCancel() = 0;\n\n  // Server-side methods ---------------------------------------------\n  // These calls may be made from the server side only.  Their results\n  // are undefined on the client side (may crash).\n\n  // Causes Failed() to return true on the client side.  \"reason\" will be\n  // incorporated into the message returned by ErrorText().  If you find\n  // you need to return machine-readable information about failures, you\n  // should incorporate it into your response protocol buffer and should\n  // NOT call SetFailed().\n  virtual void SetFailed(const string& reason) = 0;\n\n  // If true, indicates that the client canceled the RPC, so the server may\n  // as well give up on replying to it.  The server should still call the\n  // final \"done\" callback.\n  virtual bool IsCanceled() const = 0;\n\n  // Asks that the given callback be called when the RPC is canceled.  The\n  // callback will always be called exactly once.  If the RPC completes without\n  // being canceled, the callback will be called after completion.  If the RPC\n  // has already been canceled when NotifyOnCancel() is called, the callback\n  // will be called immediately.\n  //\n  // NotifyOnCancel() must be called no more than once per request.\n  virtual void NotifyOnCancel(Closure* callback) = 0;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcController);\n};\n\n// Abstract interface for an RPC channel.  An RpcChannel represents a\n// communication line to a Service which can be used to call that Service's\n// methods.  The Service may be running on another machine.  Normally, you\n// should not call an RpcChannel directly, but instead construct a stub Service\n// wrapping it.  Example:\n//   RpcChannel* channel = new MyRpcChannel(\"remotehost.example.com:1234\");\n//   MyService* service = new MyService::Stub(channel);\n//   service->MyMethod(request, &response, callback);\nclass LIBPROTOBUF_EXPORT RpcChannel {\n public:\n  inline RpcChannel() {}\n  virtual ~RpcChannel();\n\n  // Call the given method of the remote service.  The signature of this\n  // procedure looks the same as Service::CallMethod(), but the requirements\n  // are less strict in one important way:  the request and response objects\n  // need not be of any specific class as long as their descriptors are\n  // method->input_type() and method->output_type().\n  virtual void CallMethod(const MethodDescriptor* method,\n                          RpcController* controller,\n                          const Message* request,\n                          Message* response,\n                          Closure* done) = 0;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcChannel);\n};\n\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_SERVICE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/once.h>\n#include <stdio.h>\n#include <errno.h>\n#include <vector>\n\n#include \"config.h\"\n\n#ifdef _WIN32\n#define WIN32_LEAN_AND_MEAN  // We only need minimal includes\n#include <windows.h>\n#define snprintf _snprintf    // see comment in strutil.cc\n#elif defined(HAVE_PTHREAD)\n#include <pthread.h>\n#else\n#error \"No suitable threading library available.\"\n#endif\n\nnamespace google {\nnamespace protobuf {\n\nnamespace internal {\n\nvoid VerifyVersion(int headerVersion,\n                   int minLibraryVersion,\n                   const char* filename) {\n  if (GOOGLE_PROTOBUF_VERSION < minLibraryVersion) {\n    // Library is too old for headers.\n    GOOGLE_LOG(FATAL)\n      << \"This program requires version \" << VersionString(minLibraryVersion)\n      << \" of the Protocol Buffer runtime library, but the installed version \"\n         \"is \" << VersionString(GOOGLE_PROTOBUF_VERSION) << \".  Please update \"\n         \"your library.  If you compiled the program yourself, make sure that \"\n         \"your headers are from the same version of Protocol Buffers as your \"\n         \"link-time library.  (Version verification failed in \\\"\"\n      << filename << \"\\\".)\";\n  }\n  if (headerVersion < kMinHeaderVersionForLibrary) {\n    // Headers are too old for library.\n    GOOGLE_LOG(FATAL)\n      << \"This program was compiled against version \"\n      << VersionString(headerVersion) << \" of the Protocol Buffer runtime \"\n         \"library, which is not compatible with the installed version (\"\n      << VersionString(GOOGLE_PROTOBUF_VERSION) <<  \").  Contact the program \"\n         \"author for an update.  If you compiled the program yourself, make \"\n         \"sure that your headers are from the same version of Protocol Buffers \"\n         \"as your link-time library.  (Version verification failed in \\\"\"\n      << filename << \"\\\".)\";\n  }\n}\n\nstring VersionString(int version) {\n  int major = version / 1000000;\n  int minor = (version / 1000) % 1000;\n  int micro = version % 1000;\n\n  // 128 bytes should always be enough, but we use snprintf() anyway to be\n  // safe.\n  char buffer[128];\n  snprintf(buffer, sizeof(buffer), \"%d.%d.%d\", major, minor, micro);\n\n  // Guard against broken MSVC snprintf().\n  buffer[sizeof(buffer)-1] = '\\0';\n\n  return buffer;\n}\n\n}  // namespace internal\n\n// ===================================================================\n// emulates google3/base/logging.cc\n\nnamespace internal {\n\nvoid DefaultLogHandler(LogLevel level, const char* filename, int line,\n                       const string& message) {\n  static const char* level_names[] = { \"INFO\", \"WARNING\", \"ERROR\", \"FATAL\" };\n\n  // We use fprintf() instead of cerr because we want this to work at static\n  // initialization time.\n  fprintf(stderr, \"libprotobuf %s %s:%d] %s\\n\",\n          level_names[level], filename, line, message.c_str());\n  fflush(stderr);  // Needed on MSVC.\n}\n\nvoid NullLogHandler(LogLevel level, const char* filename, int line,\n                    const string& message) {\n  // Nothing.\n}\n\nstatic LogHandler* log_handler_ = &DefaultLogHandler;\nstatic int log_silencer_count_ = 0;\n\nstatic Mutex* log_silencer_count_mutex_ = NULL;\nGOOGLE_PROTOBUF_DECLARE_ONCE(log_silencer_count_init_);\n\nvoid DeleteLogSilencerCount() {\n  delete log_silencer_count_mutex_;\n  log_silencer_count_mutex_ = NULL;\n}\nvoid InitLogSilencerCount() {\n  log_silencer_count_mutex_ = new Mutex;\n  OnShutdown(&DeleteLogSilencerCount);\n}\nvoid InitLogSilencerCountOnce() {\n  GoogleOnceInit(&log_silencer_count_init_, &InitLogSilencerCount);\n}\n\nLogMessage& LogMessage::operator<<(const string& value) {\n  message_ += value;\n  return *this;\n}\n\nLogMessage& LogMessage::operator<<(const char* value) {\n  message_ += value;\n  return *this;\n}\n\n// Since this is just for logging, we don't care if the current locale changes\n// the results -- in fact, we probably prefer that.  So we use snprintf()\n// instead of Simple*toa().\n#undef DECLARE_STREAM_OPERATOR\n#define DECLARE_STREAM_OPERATOR(TYPE, FORMAT)                       \\\n  LogMessage& LogMessage::operator<<(TYPE value) {                  \\\n    /* 128 bytes should be big enough for any of the primitive */   \\\n    /* values which we print with this, but well use snprintf() */  \\\n    /* anyway to be extra safe. */                                  \\\n    char buffer[128];                                               \\\n    snprintf(buffer, sizeof(buffer), FORMAT, value);                \\\n    /* Guard against broken MSVC snprintf(). */                     \\\n    buffer[sizeof(buffer)-1] = '\\0';                                \\\n    message_ += buffer;                                             \\\n    return *this;                                                   \\\n  }\n\nDECLARE_STREAM_OPERATOR(char         , \"%c\" )\nDECLARE_STREAM_OPERATOR(int          , \"%d\" )\nDECLARE_STREAM_OPERATOR(uint         , \"%u\" )\nDECLARE_STREAM_OPERATOR(long         , \"%ld\")\nDECLARE_STREAM_OPERATOR(unsigned long, \"%lu\")\nDECLARE_STREAM_OPERATOR(double       , \"%g\" )\n#undef DECLARE_STREAM_OPERATOR\n\nLogMessage::LogMessage(LogLevel level, const char* filename, int line)\n  : level_(level), filename_(filename), line_(line) {}\nLogMessage::~LogMessage() {}\n\nvoid LogMessage::Finish() {\n  bool suppress = false;\n\n  if (level_ != LOGLEVEL_FATAL) {\n    InitLogSilencerCountOnce();\n    MutexLock lock(log_silencer_count_mutex_);\n    suppress = internal::log_silencer_count_ > 0;\n  }\n\n  if (!suppress) {\n    internal::log_handler_(level_, filename_, line_, message_);\n  }\n\n  if (level_ == LOGLEVEL_FATAL) {\n#ifdef PROTOBUF_USE_EXCEPTIONS\n    throw FatalException(filename_, line_, message_);\n#else\n    abort();\n#endif\n  }\n}\n\nvoid LogFinisher::operator=(LogMessage& other) {\n  other.Finish();\n}\n\n}  // namespace internal\n\nLogHandler* SetLogHandler(LogHandler* new_func) {\n  LogHandler* old = internal::log_handler_;\n  if (old == &internal::NullLogHandler) {\n    old = NULL;\n  }\n  if (new_func == NULL) {\n    internal::log_handler_ = &internal::NullLogHandler;\n  } else {\n    internal::log_handler_ = new_func;\n  }\n  return old;\n}\n\nLogSilencer::LogSilencer() {\n  internal::InitLogSilencerCountOnce();\n  MutexLock lock(internal::log_silencer_count_mutex_);\n  ++internal::log_silencer_count_;\n};\n\nLogSilencer::~LogSilencer() {\n  internal::InitLogSilencerCountOnce();\n  MutexLock lock(internal::log_silencer_count_mutex_);\n  --internal::log_silencer_count_;\n};\n\n// ===================================================================\n// emulates google3/base/callback.cc\n\nClosure::~Closure() {}\n\nnamespace internal { FunctionClosure0::~FunctionClosure0() {} }\n\nvoid DoNothing() {}\n\n// ===================================================================\n// emulates google3/base/mutex.cc\n\n#ifdef _WIN32\n\nstruct Mutex::Internal {\n  CRITICAL_SECTION mutex;\n#ifndef NDEBUG\n  // Used only to implement AssertHeld().\n  DWORD thread_id;\n#endif\n};\n\nMutex::Mutex()\n  : mInternal(new Internal) {\n  InitializeCriticalSection(&mInternal->mutex);\n}\n\nMutex::~Mutex() {\n  DeleteCriticalSection(&mInternal->mutex);\n  delete mInternal;\n}\n\nvoid Mutex::Lock() {\n  EnterCriticalSection(&mInternal->mutex);\n#ifndef NDEBUG\n  mInternal->thread_id = GetCurrentThreadId();\n#endif\n}\n\nvoid Mutex::Unlock() {\n#ifndef NDEBUG\n  mInternal->thread_id = 0;\n#endif\n  LeaveCriticalSection(&mInternal->mutex);\n}\n\nvoid Mutex::AssertHeld() {\n#ifndef NDEBUG\n  GOOGLE_DCHECK_EQ(mInternal->thread_id, GetCurrentThreadId());\n#endif\n}\n\n#elif defined(HAVE_PTHREAD)\n\nstruct Mutex::Internal {\n  pthread_mutex_t mutex;\n};\n\nMutex::Mutex()\n  : mInternal(new Internal) {\n  pthread_mutex_init(&mInternal->mutex, NULL);\n}\n\nMutex::~Mutex() {\n  pthread_mutex_destroy(&mInternal->mutex);\n  delete mInternal;\n}\n\nvoid Mutex::Lock() {\n  int result = pthread_mutex_lock(&mInternal->mutex);\n  if (result != 0) {\n    GOOGLE_LOG(FATAL) << \"pthread_mutex_lock: \" << strerror(result);\n  }\n}\n\nvoid Mutex::Unlock() {\n  int result = pthread_mutex_unlock(&mInternal->mutex);\n  if (result != 0) {\n    GOOGLE_LOG(FATAL) << \"pthread_mutex_unlock: \" << strerror(result);\n  }\n}\n\nvoid Mutex::AssertHeld() {\n  // pthreads dosn't provide a way to check which thread holds the mutex.\n  // TODO(kenton):  Maybe keep track of locking thread ID like with WIN32?\n}\n\n#endif\n\n// ===================================================================\n// Shutdown support.\n\nnamespace internal {\n\ntypedef void OnShutdownFunc();\nvector<void (*)()>* shutdown_functions = NULL;\nMutex* shutdown_functions_mutex = NULL;\nGOOGLE_PROTOBUF_DECLARE_ONCE(shutdown_functions_init);\n\nvoid InitShutdownFunctions() {\n  shutdown_functions = new vector<void (*)()>;\n  shutdown_functions_mutex = new Mutex;\n}\n\ninline void InitShutdownFunctionsOnce() {\n  GoogleOnceInit(&shutdown_functions_init, &InitShutdownFunctions);\n}\n\nvoid OnShutdown(void (*func)()) {\n  InitShutdownFunctionsOnce();\n  MutexLock lock(shutdown_functions_mutex);\n  shutdown_functions->push_back(func);\n}\n\n}  // namespace internal\n\nvoid ShutdownProtobufLibrary() {\n  internal::InitShutdownFunctionsOnce();\n\n  // We don't need to lock shutdown_functions_mutex because it's up to the\n  // caller to make sure that no one is using the library before this is\n  // called.\n\n  // Make it safe to call this multiple times.\n  if (internal::shutdown_functions == NULL) return;\n\n  for (int i = 0; i < internal::shutdown_functions->size(); i++) {\n    internal::shutdown_functions->at(i)();\n  }\n  delete internal::shutdown_functions;\n  internal::shutdown_functions = NULL;\n  delete internal::shutdown_functions_mutex;\n  internal::shutdown_functions_mutex = NULL;\n}\n\n#ifdef PROTOBUF_USE_EXCEPTIONS\nFatalException::~FatalException() throw() {}\n\nconst char* FatalException::what() const throw() {\n  return message_.c_str();\n}\n#endif\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda) and others\n//\n// Contains basic types and utilities used by the rest of the library.\n\n#ifndef GOOGLE_PROTOBUF_COMMON_H__\n#define GOOGLE_PROTOBUF_COMMON_H__\n\n#include <assert.h>\n#include <stdlib.h>\n#include <cstddef>\n#include <string>\n#include <string.h>\n#if defined(__osf__)\n// Tru64 lacks stdint.h, but has inttypes.h which defines a superset of\n// what stdint.h would define.\n#include <inttypes.h>\n#elif !defined(_MSC_VER)\n#include <stdint.h>\n#endif\n\n#if defined(_MSC_VER) && defined(_CPPUNWIND)\n  #define PROTOBUF_USE_EXCEPTIONS\n#elif defined(__EXCEPTIONS)\n  #define PROTOBUF_USE_EXCEPTIONS\n#endif\n#ifdef PROTOBUF_USE_EXCEPTIONS\n#include <exception>\n#endif\n\n#if defined(_WIN32) && defined(GetMessage)\n// Allow GetMessage to be used as a valid method name in protobuf classes.\n// windows.h defines GetMessage() as a macro.  Let's re-define it as an inline\n// function.  The inline function should be equivalent for C++ users.\ninline BOOL GetMessage_Win32(\n    LPMSG lpMsg, HWND hWnd,\n    UINT wMsgFilterMin, UINT wMsgFilterMax) {\n  return GetMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);\n}\n#undef GetMessage\ninline BOOL GetMessage(\n    LPMSG lpMsg, HWND hWnd,\n    UINT wMsgFilterMin, UINT wMsgFilterMax) {\n  return GetMessage_Win32(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);\n}\n#endif\n\n\nnamespace std {}\n\nnamespace google {\nnamespace protobuf {\n\n#undef GOOGLE_DISALLOW_EVIL_CONSTRUCTORS\n#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName)    \\\n  TypeName(const TypeName&);                           \\\n  void operator=(const TypeName&)\n\n#if defined(_MSC_VER) && defined(PROTOBUF_USE_DLLS)\n  #ifdef LIBPROTOBUF_EXPORTS\n    #define LIBPROTOBUF_EXPORT __declspec(dllexport)\n  #else\n    #define LIBPROTOBUF_EXPORT __declspec(dllimport)\n  #endif\n  #ifdef LIBPROTOC_EXPORTS\n    #define LIBPROTOC_EXPORT   __declspec(dllexport)\n  #else\n    #define LIBPROTOC_EXPORT   __declspec(dllimport)\n  #endif\n#else\n  #define LIBPROTOBUF_EXPORT\n  #define LIBPROTOC_EXPORT\n#endif\n\nnamespace internal {\n\n// Some of these constants are macros rather than const ints so that they can\n// be used in #if directives.\n\n// The current version, represented as a single integer to make comparison\n// easier:  major * 10^6 + minor * 10^3 + micro\n#define GOOGLE_PROTOBUF_VERSION 2004002\n\n// The minimum library version which works with the current version of the\n// headers.\n#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION 2004000\n\n// The minimum header version which works with the current version of\n// the library.  This constant should only be used by protoc's C++ code\n// generator.\nstatic const int kMinHeaderVersionForLibrary = 2004000;\n\n// The minimum protoc version which works with the current version of the\n// headers.\n#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION 2004000\n\n// The minimum header version which works with the current version of\n// protoc.  This constant should only be used in VerifyVersion().\nstatic const int kMinHeaderVersionForProtoc = 2004000;\n\n// Verifies that the headers and libraries are compatible.  Use the macro\n// below to call this.\nvoid LIBPROTOBUF_EXPORT VerifyVersion(int headerVersion, int minLibraryVersion,\n                                      const char* filename);\n\n// Converts a numeric version number to a string.\nstd::string LIBPROTOBUF_EXPORT VersionString(int version);\n\n}  // namespace internal\n\n// Place this macro in your main() function (or somewhere before you attempt\n// to use the protobuf library) to verify that the version you link against\n// matches the headers you compiled against.  If a version mismatch is\n// detected, the process will abort.\n#define GOOGLE_PROTOBUF_VERIFY_VERSION                                    \\\n  ::google::protobuf::internal::VerifyVersion(                            \\\n    GOOGLE_PROTOBUF_VERSION, GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION,         \\\n    __FILE__)\n\n// ===================================================================\n// from google3/base/port.h\n\ntypedef unsigned int uint;\n\n#ifdef _MSC_VER\ntypedef __int8  int8;\ntypedef __int16 int16;\ntypedef __int32 int32;\ntypedef __int64 int64;\n\ntypedef unsigned __int8  uint8;\ntypedef unsigned __int16 uint16;\ntypedef unsigned __int32 uint32;\ntypedef unsigned __int64 uint64;\n#else\ntypedef int8_t  int8;\ntypedef int16_t int16;\ntypedef int32_t int32;\ntypedef int64_t int64;\n\ntypedef uint8_t  uint8;\ntypedef uint16_t uint16;\ntypedef uint32_t uint32;\ntypedef uint64_t uint64;\n#endif\n\n// long long macros to be used because gcc and vc++ use different suffixes,\n// and different size specifiers in format strings\n#undef GOOGLE_LONGLONG\n#undef GOOGLE_ULONGLONG\n#undef GOOGLE_LL_FORMAT\n\n#ifdef _MSC_VER\n#define GOOGLE_LONGLONG(x) x##I64\n#define GOOGLE_ULONGLONG(x) x##UI64\n#define GOOGLE_LL_FORMAT \"I64\"  // As in printf(\"%I64d\", ...)\n#else\n#define GOOGLE_LONGLONG(x) x##LL\n#define GOOGLE_ULONGLONG(x) x##ULL\n#define GOOGLE_LL_FORMAT \"ll\"  // As in \"%lld\". Note that \"q\" is poor form also.\n#endif\n\nstatic const int32 kint32max = 0x7FFFFFFF;\nstatic const int32 kint32min = -kint32max - 1;\nstatic const int64 kint64max = GOOGLE_LONGLONG(0x7FFFFFFFFFFFFFFF);\nstatic const int64 kint64min = -kint64max - 1;\nstatic const uint32 kuint32max = 0xFFFFFFFFu;\nstatic const uint64 kuint64max = GOOGLE_ULONGLONG(0xFFFFFFFFFFFFFFFF);\n\n// -------------------------------------------------------------------\n// Annotations:  Some parts of the code have been annotated in ways that might\n//   be useful to some compilers or tools, but are not supported universally.\n//   You can #define these annotations yourself if the default implementation\n//   is not right for you.\n\n#ifndef GOOGLE_ATTRIBUTE_ALWAYS_INLINE\n#if defined(__GNUC__) && (__GNUC__ > 3 ||(__GNUC__ == 3 && __GNUC_MINOR__ >= 1))\n// For functions we want to force inline.\n// Introduced in gcc 3.1.\n#define GOOGLE_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((always_inline))\n#else\n// Other compilers will have to figure it out for themselves.\n#define GOOGLE_ATTRIBUTE_ALWAYS_INLINE\n#endif\n#endif\n\n#ifndef GOOGLE_ATTRIBUTE_DEPRECATED\n#ifdef __GNUC__\n// If the method/variable/type is used anywhere, produce a warning.\n#define GOOGLE_ATTRIBUTE_DEPRECATED __attribute__((deprecated))\n#else\n#define GOOGLE_ATTRIBUTE_DEPRECATED\n#endif\n#endif\n\n#ifndef GOOGLE_PREDICT_TRUE\n#ifdef __GNUC__\n// Provided at least since GCC 3.0.\n#define GOOGLE_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))\n#else\n#define GOOGLE_PREDICT_TRUE\n#endif\n#endif\n\n// Delimits a block of code which may write to memory which is simultaneously\n// written by other threads, but which has been determined to be thread-safe\n// (e.g. because it is an idempotent write).\n#ifndef GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN\n#define GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN()\n#endif\n#ifndef GOOGLE_SAFE_CONCURRENT_WRITES_END\n#define GOOGLE_SAFE_CONCURRENT_WRITES_END()\n#endif\n\n// ===================================================================\n// from google3/base/basictypes.h\n\n// The GOOGLE_ARRAYSIZE(arr) macro returns the # of elements in an array arr.\n// The expression is a compile-time constant, and therefore can be\n// used in defining new arrays, for example.\n//\n// GOOGLE_ARRAYSIZE catches a few type errors.  If you see a compiler error\n//\n//   \"warning: division by zero in ...\"\n//\n// when using GOOGLE_ARRAYSIZE, you are (wrongfully) giving it a pointer.\n// You should only use GOOGLE_ARRAYSIZE on statically allocated arrays.\n//\n// The following comments are on the implementation details, and can\n// be ignored by the users.\n//\n// ARRAYSIZE(arr) works by inspecting sizeof(arr) (the # of bytes in\n// the array) and sizeof(*(arr)) (the # of bytes in one array\n// element).  If the former is divisible by the latter, perhaps arr is\n// indeed an array, in which case the division result is the # of\n// elements in the array.  Otherwise, arr cannot possibly be an array,\n// and we generate a compiler error to prevent the code from\n// compiling.\n//\n// Since the size of bool is implementation-defined, we need to cast\n// !(sizeof(a) & sizeof(*(a))) to size_t in order to ensure the final\n// result has type size_t.\n//\n// This macro is not perfect as it wrongfully accepts certain\n// pointers, namely where the pointer size is divisible by the pointee\n// size.  Since all our code has to go through a 32-bit compiler,\n// where a pointer is 4 bytes, this means all pointers to a type whose\n// size is 3 or greater than 4 will be (righteously) rejected.\n//\n// Kudos to Jorg Brown for this simple and elegant implementation.\n\n#undef GOOGLE_ARRAYSIZE\n#define GOOGLE_ARRAYSIZE(a) \\\n  ((sizeof(a) / sizeof(*(a))) / \\\n   static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))\n\nnamespace internal {\n\n// Use implicit_cast as a safe version of static_cast or const_cast\n// for upcasting in the type hierarchy (i.e. casting a pointer to Foo\n// to a pointer to SuperclassOfFoo or casting a pointer to Foo to\n// a const pointer to Foo).\n// When you use implicit_cast, the compiler checks that the cast is safe.\n// Such explicit implicit_casts are necessary in surprisingly many\n// situations where C++ demands an exact type match instead of an\n// argument type convertable to a target type.\n//\n// The From type can be inferred, so the preferred syntax for using\n// implicit_cast is the same as for static_cast etc.:\n//\n//   implicit_cast<ToType>(expr)\n//\n// implicit_cast would have been part of the C++ standard library,\n// but the proposal was submitted too late.  It will probably make\n// its way into the language in the future.\ntemplate<typename To, typename From>\ninline To implicit_cast(From const &f) {\n  return f;\n}\n\n// When you upcast (that is, cast a pointer from type Foo to type\n// SuperclassOfFoo), it's fine to use implicit_cast<>, since upcasts\n// always succeed.  When you downcast (that is, cast a pointer from\n// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because\n// how do you know the pointer is really of type SubclassOfFoo?  It\n// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,\n// when you downcast, you should use this macro.  In debug mode, we\n// use dynamic_cast<> to double-check the downcast is legal (we die\n// if it's not).  In normal mode, we do the efficient static_cast<>\n// instead.  Thus, it's important to test in debug mode to make sure\n// the cast is legal!\n//    This is the only place in the code we should use dynamic_cast<>.\n// In particular, you SHOULDN'T be using dynamic_cast<> in order to\n// do RTTI (eg code like this:\n//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);\n//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);\n// You should design the code some other way not to need this.\n\ntemplate<typename To, typename From>     // use like this: down_cast<T*>(foo);\ninline To down_cast(From* f) {                   // so we only accept pointers\n  // Ensures that To is a sub-type of From *.  This test is here only\n  // for compile-time type checking, and has no overhead in an\n  // optimized build at run-time, as it will be optimized away\n  // completely.\n  if (false) {\n    implicit_cast<From*, To>(0);\n  }\n\n#if !defined(NDEBUG) && !defined(GOOGLE_PROTOBUF_NO_RTTI)\n  assert(f == NULL || dynamic_cast<To>(f) != NULL);  // RTTI: debug mode only!\n#endif\n  return static_cast<To>(f);\n}\n\n}  // namespace internal\n\n// We made these internal so that they would show up as such in the docs,\n// but we don't want to stick \"internal::\" in front of them everywhere.\nusing internal::implicit_cast;\nusing internal::down_cast;\n\n// The COMPILE_ASSERT macro can be used to verify that a compile time\n// expression is true. For example, you could use it to verify the\n// size of a static array:\n//\n//   COMPILE_ASSERT(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,\n//                  content_type_names_incorrect_size);\n//\n// or to make sure a struct is smaller than a certain size:\n//\n//   COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large);\n//\n// The second argument to the macro is the name of the variable. If\n// the expression is false, most compilers will issue a warning/error\n// containing the name of the variable.\n\nnamespace internal {\n\ntemplate <bool>\nstruct CompileAssert {\n};\n\n}  // namespace internal\n\n#undef GOOGLE_COMPILE_ASSERT\n#define GOOGLE_COMPILE_ASSERT(expr, msg) \\\n  typedef ::google::protobuf::internal::CompileAssert<(bool(expr))> \\\n          msg[bool(expr) ? 1 : -1]\n\n\n// Implementation details of COMPILE_ASSERT:\n//\n// - COMPILE_ASSERT works by defining an array type that has -1\n//   elements (and thus is invalid) when the expression is false.\n//\n// - The simpler definition\n//\n//     #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1]\n//\n//   does not work, as gcc supports variable-length arrays whose sizes\n//   are determined at run-time (this is gcc's extension and not part\n//   of the C++ standard).  As a result, gcc fails to reject the\n//   following code with the simple definition:\n//\n//     int foo;\n//     COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is\n//                               // not a compile-time constant.\n//\n// - By using the type CompileAssert<(bool(expr))>, we ensures that\n//   expr is a compile-time constant.  (Template arguments must be\n//   determined at compile-time.)\n//\n// - The outter parentheses in CompileAssert<(bool(expr))> are necessary\n//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written\n//\n//     CompileAssert<bool(expr)>\n//\n//   instead, these compilers will refuse to compile\n//\n//     COMPILE_ASSERT(5 > 0, some_message);\n//\n//   (They seem to think the \">\" in \"5 > 0\" marks the end of the\n//   template argument list.)\n//\n// - The array size is (bool(expr) ? 1 : -1), instead of simply\n//\n//     ((expr) ? 1 : -1).\n//\n//   This is to avoid running into a bug in MS VC 7.1, which\n//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.\n\n// ===================================================================\n// from google3/base/scoped_ptr.h\n\nnamespace internal {\n\n//  This is an implementation designed to match the anticipated future TR2\n//  implementation of the scoped_ptr class, and its closely-related brethren,\n//  scoped_array, scoped_ptr_malloc, and make_scoped_ptr.\n\ntemplate <class C> class scoped_ptr;\ntemplate <class C> class scoped_array;\n\n// A scoped_ptr<T> is like a T*, except that the destructor of scoped_ptr<T>\n// automatically deletes the pointer it holds (if any).\n// That is, scoped_ptr<T> owns the T object that it points to.\n// Like a T*, a scoped_ptr<T> may hold either NULL or a pointer to a T object.\n//\n// The size of a scoped_ptr is small:\n// sizeof(scoped_ptr<C>) == sizeof(C*)\ntemplate <class C>\nclass scoped_ptr {\n public:\n\n  // The element type\n  typedef C element_type;\n\n  // Constructor.  Defaults to intializing with NULL.\n  // There is no way to create an uninitialized scoped_ptr.\n  // The input parameter must be allocated with new.\n  explicit scoped_ptr(C* p = NULL) : ptr_(p) { }\n\n  // Destructor.  If there is a C object, delete it.\n  // We don't need to test ptr_ == NULL because C++ does that for us.\n  ~scoped_ptr() {\n    enum { type_must_be_complete = sizeof(C) };\n    delete ptr_;\n  }\n\n  // Reset.  Deletes the current owned object, if any.\n  // Then takes ownership of a new object, if given.\n  // this->reset(this->get()) works.\n  void reset(C* p = NULL) {\n    if (p != ptr_) {\n      enum { type_must_be_complete = sizeof(C) };\n      delete ptr_;\n      ptr_ = p;\n    }\n  }\n\n  // Accessors to get the owned object.\n  // operator* and operator-> will assert() if there is no current object.\n  C& operator*() const {\n    assert(ptr_ != NULL);\n    return *ptr_;\n  }\n  C* operator->() const  {\n    assert(ptr_ != NULL);\n    return ptr_;\n  }\n  C* get() const { return ptr_; }\n\n  // Comparison operators.\n  // These return whether two scoped_ptr refer to the same object, not just to\n  // two different but equal objects.\n  bool operator==(C* p) const { return ptr_ == p; }\n  bool operator!=(C* p) const { return ptr_ != p; }\n\n  // Swap two scoped pointers.\n  void swap(scoped_ptr& p2) {\n    C* tmp = ptr_;\n    ptr_ = p2.ptr_;\n    p2.ptr_ = tmp;\n  }\n\n  // Release a pointer.\n  // The return value is the current pointer held by this object.\n  // If this object holds a NULL pointer, the return value is NULL.\n  // After this operation, this object will hold a NULL pointer,\n  // and will not own the object any more.\n  C* release() {\n    C* retVal = ptr_;\n    ptr_ = NULL;\n    return retVal;\n  }\n\n private:\n  C* ptr_;\n\n  // Forbid comparison of scoped_ptr types.  If C2 != C, it totally doesn't\n  // make sense, and if C2 == C, it still doesn't make sense because you should\n  // never have the same object owned by two different scoped_ptrs.\n  template <class C2> bool operator==(scoped_ptr<C2> const& p2) const;\n  template <class C2> bool operator!=(scoped_ptr<C2> const& p2) const;\n\n  // Disallow evil constructors\n  scoped_ptr(const scoped_ptr&);\n  void operator=(const scoped_ptr&);\n};\n\n// scoped_array<C> is like scoped_ptr<C>, except that the caller must allocate\n// with new [] and the destructor deletes objects with delete [].\n//\n// As with scoped_ptr<C>, a scoped_array<C> either points to an object\n// or is NULL.  A scoped_array<C> owns the object that it points to.\n//\n// Size: sizeof(scoped_array<C>) == sizeof(C*)\ntemplate <class C>\nclass scoped_array {\n public:\n\n  // The element type\n  typedef C element_type;\n\n  // Constructor.  Defaults to intializing with NULL.\n  // There is no way to create an uninitialized scoped_array.\n  // The input parameter must be allocated with new [].\n  explicit scoped_array(C* p = NULL) : array_(p) { }\n\n  // Destructor.  If there is a C object, delete it.\n  // We don't need to test ptr_ == NULL because C++ does that for us.\n  ~scoped_array() {\n    enum { type_must_be_complete = sizeof(C) };\n    delete[] array_;\n  }\n\n  // Reset.  Deletes the current owned object, if any.\n  // Then takes ownership of a new object, if given.\n  // this->reset(this->get()) works.\n  void reset(C* p = NULL) {\n    if (p != array_) {\n      enum { type_must_be_complete = sizeof(C) };\n      delete[] array_;\n      array_ = p;\n    }\n  }\n\n  // Get one element of the current object.\n  // Will assert() if there is no current object, or index i is negative.\n  C& operator[](std::ptrdiff_t i) const {\n    assert(i >= 0);\n    assert(array_ != NULL);\n    return array_[i];\n  }\n\n  // Get a pointer to the zeroth element of the current object.\n  // If there is no current object, return NULL.\n  C* get() const {\n    return array_;\n  }\n\n  // Comparison operators.\n  // These return whether two scoped_array refer to the same object, not just to\n  // two different but equal objects.\n  bool operator==(C* p) const { return array_ == p; }\n  bool operator!=(C* p) const { return array_ != p; }\n\n  // Swap two scoped arrays.\n  void swap(scoped_array& p2) {\n    C* tmp = array_;\n    array_ = p2.array_;\n    p2.array_ = tmp;\n  }\n\n  // Release an array.\n  // The return value is the current pointer held by this object.\n  // If this object holds a NULL pointer, the return value is NULL.\n  // After this operation, this object will hold a NULL pointer,\n  // and will not own the object any more.\n  C* release() {\n    C* retVal = array_;\n    array_ = NULL;\n    return retVal;\n  }\n\n private:\n  C* array_;\n\n  // Forbid comparison of different scoped_array types.\n  template <class C2> bool operator==(scoped_array<C2> const& p2) const;\n  template <class C2> bool operator!=(scoped_array<C2> const& p2) const;\n\n  // Disallow evil constructors\n  scoped_array(const scoped_array&);\n  void operator=(const scoped_array&);\n};\n\n}  // namespace internal\n\n// We made these internal so that they would show up as such in the docs,\n// but we don't want to stick \"internal::\" in front of them everywhere.\nusing internal::scoped_ptr;\nusing internal::scoped_array;\n\n// ===================================================================\n// emulates google3/base/logging.h\n\nenum LogLevel {\n  LOGLEVEL_INFO,     // Informational.  This is never actually used by\n                     // libprotobuf.\n  LOGLEVEL_WARNING,  // Warns about issues that, although not technically a\n                     // problem now, could cause problems in the future.  For\n                     // example, a // warning will be printed when parsing a\n                     // message that is near the message size limit.\n  LOGLEVEL_ERROR,    // An error occurred which should never happen during\n                     // normal use.\n  LOGLEVEL_FATAL,    // An error occurred from which the library cannot\n                     // recover.  This usually indicates a programming error\n                     // in the code which calls the library, especially when\n                     // compiled in debug mode.\n\n#ifdef NDEBUG\n  LOGLEVEL_DFATAL = LOGLEVEL_ERROR\n#else\n  LOGLEVEL_DFATAL = LOGLEVEL_FATAL\n#endif\n};\n\nnamespace internal {\n\nclass LogFinisher;\n\nclass LIBPROTOBUF_EXPORT LogMessage {\n public:\n  LogMessage(LogLevel level, const char* filename, int line);\n  ~LogMessage();\n\n  LogMessage& operator<<(const std::string& value);\n  LogMessage& operator<<(const char* value);\n  LogMessage& operator<<(char value);\n  LogMessage& operator<<(int value);\n  LogMessage& operator<<(uint value);\n  LogMessage& operator<<(long value);\n  LogMessage& operator<<(unsigned long value);\n  LogMessage& operator<<(double value);\n\n private:\n  friend class LogFinisher;\n  void Finish();\n\n  LogLevel level_;\n  const char* filename_;\n  int line_;\n  std::string message_;\n};\n\n// Used to make the entire \"LOG(BLAH) << etc.\" expression have a void return\n// type and print a newline after each message.\nclass LIBPROTOBUF_EXPORT LogFinisher {\n public:\n  void operator=(LogMessage& other);\n};\n\n}  // namespace internal\n\n// Undef everything in case we're being mixed with some other Google library\n// which already defined them itself.  Presumably all Google libraries will\n// support the same syntax for these so it should not be a big deal if they\n// end up using our definitions instead.\n#undef GOOGLE_LOG\n#undef GOOGLE_LOG_IF\n\n#undef GOOGLE_CHECK\n#undef GOOGLE_CHECK_EQ\n#undef GOOGLE_CHECK_NE\n#undef GOOGLE_CHECK_LT\n#undef GOOGLE_CHECK_LE\n#undef GOOGLE_CHECK_GT\n#undef GOOGLE_CHECK_GE\n\n#undef GOOGLE_DLOG\n#undef GOOGLE_DCHECK\n#undef GOOGLE_DCHECK_EQ\n#undef GOOGLE_DCHECK_NE\n#undef GOOGLE_DCHECK_LT\n#undef GOOGLE_DCHECK_LE\n#undef GOOGLE_DCHECK_GT\n#undef GOOGLE_DCHECK_GE\n\n#define GOOGLE_LOG(LEVEL)                                                 \\\n  ::google::protobuf::internal::LogFinisher() =                           \\\n    ::google::protobuf::internal::LogMessage(                             \\\n      ::google::protobuf::LOGLEVEL_##LEVEL, __FILE__, __LINE__)\n#define GOOGLE_LOG_IF(LEVEL, CONDITION) \\\n  !(CONDITION) ? (void)0 : GOOGLE_LOG(LEVEL)\n\n#define GOOGLE_CHECK(EXPRESSION) \\\n  GOOGLE_LOG_IF(FATAL, !(EXPRESSION)) << \"CHECK failed: \" #EXPRESSION \": \"\n#define GOOGLE_CHECK_EQ(A, B) GOOGLE_CHECK((A) == (B))\n#define GOOGLE_CHECK_NE(A, B) GOOGLE_CHECK((A) != (B))\n#define GOOGLE_CHECK_LT(A, B) GOOGLE_CHECK((A) <  (B))\n#define GOOGLE_CHECK_LE(A, B) GOOGLE_CHECK((A) <= (B))\n#define GOOGLE_CHECK_GT(A, B) GOOGLE_CHECK((A) >  (B))\n#define GOOGLE_CHECK_GE(A, B) GOOGLE_CHECK((A) >= (B))\n\n#ifdef NDEBUG\n\n#define GOOGLE_DLOG GOOGLE_LOG_IF(INFO, false)\n\n#define GOOGLE_DCHECK(EXPRESSION) while(false) GOOGLE_CHECK(EXPRESSION)\n#define GOOGLE_DCHECK_EQ(A, B) GOOGLE_DCHECK((A) == (B))\n#define GOOGLE_DCHECK_NE(A, B) GOOGLE_DCHECK((A) != (B))\n#define GOOGLE_DCHECK_LT(A, B) GOOGLE_DCHECK((A) <  (B))\n#define GOOGLE_DCHECK_LE(A, B) GOOGLE_DCHECK((A) <= (B))\n#define GOOGLE_DCHECK_GT(A, B) GOOGLE_DCHECK((A) >  (B))\n#define GOOGLE_DCHECK_GE(A, B) GOOGLE_DCHECK((A) >= (B))\n\n#else  // NDEBUG\n\n#define GOOGLE_DLOG GOOGLE_LOG\n\n#define GOOGLE_DCHECK    GOOGLE_CHECK\n#define GOOGLE_DCHECK_EQ GOOGLE_CHECK_EQ\n#define GOOGLE_DCHECK_NE GOOGLE_CHECK_NE\n#define GOOGLE_DCHECK_LT GOOGLE_CHECK_LT\n#define GOOGLE_DCHECK_LE GOOGLE_CHECK_LE\n#define GOOGLE_DCHECK_GT GOOGLE_CHECK_GT\n#define GOOGLE_DCHECK_GE GOOGLE_CHECK_GE\n\n#endif  // !NDEBUG\n\ntypedef void LogHandler(LogLevel level, const char* filename, int line,\n                        const std::string& message);\n\n// The protobuf library sometimes writes warning and error messages to\n// stderr.  These messages are primarily useful for developers, but may\n// also help end users figure out a problem.  If you would prefer that\n// these messages be sent somewhere other than stderr, call SetLogHandler()\n// to set your own handler.  This returns the old handler.  Set the handler\n// to NULL to ignore log messages (but see also LogSilencer, below).\n//\n// Obviously, SetLogHandler is not thread-safe.  You should only call it\n// at initialization time, and probably not from library code.  If you\n// simply want to suppress log messages temporarily (e.g. because you\n// have some code that tends to trigger them frequently and you know\n// the warnings are not important to you), use the LogSilencer class\n// below.\nLIBPROTOBUF_EXPORT LogHandler* SetLogHandler(LogHandler* new_func);\n\n// Create a LogSilencer if you want to temporarily suppress all log\n// messages.  As long as any LogSilencer objects exist, non-fatal\n// log messages will be discarded (the current LogHandler will *not*\n// be called).  Constructing a LogSilencer is thread-safe.  You may\n// accidentally suppress log messages occurring in another thread, but\n// since messages are generally for debugging purposes only, this isn't\n// a big deal.  If you want to intercept log messages, use SetLogHandler().\nclass LIBPROTOBUF_EXPORT LogSilencer {\n public:\n  LogSilencer();\n  ~LogSilencer();\n};\n\n// ===================================================================\n// emulates google3/base/callback.h\n\n// Abstract interface for a callback.  When calling an RPC, you must provide\n// a Closure to call when the procedure completes.  See the Service interface\n// in service.h.\n//\n// To automatically construct a Closure which calls a particular function or\n// method with a particular set of parameters, use the NewCallback() function.\n// Example:\n//   void FooDone(const FooResponse* response) {\n//     ...\n//   }\n//\n//   void CallFoo() {\n//     ...\n//     // When done, call FooDone() and pass it a pointer to the response.\n//     Closure* callback = NewCallback(&FooDone, response);\n//     // Make the call.\n//     service->Foo(controller, request, response, callback);\n//   }\n//\n// Example that calls a method:\n//   class Handler {\n//    public:\n//     ...\n//\n//     void FooDone(const FooResponse* response) {\n//       ...\n//     }\n//\n//     void CallFoo() {\n//       ...\n//       // When done, call FooDone() and pass it a pointer to the response.\n//       Closure* callback = NewCallback(this, &Handler::FooDone, response);\n//       // Make the call.\n//       service->Foo(controller, request, response, callback);\n//     }\n//   };\n//\n// Currently NewCallback() supports binding zero, one, or two arguments.\n//\n// Callbacks created with NewCallback() automatically delete themselves when\n// executed.  They should be used when a callback is to be called exactly\n// once (usually the case with RPC callbacks).  If a callback may be called\n// a different number of times (including zero), create it with\n// NewPermanentCallback() instead.  You are then responsible for deleting the\n// callback (using the \"delete\" keyword as normal).\n//\n// Note that NewCallback() is a bit touchy regarding argument types.  Generally,\n// the values you provide for the parameter bindings must exactly match the\n// types accepted by the callback function.  For example:\n//   void Foo(string s);\n//   NewCallback(&Foo, \"foo\");          // WON'T WORK:  const char* != string\n//   NewCallback(&Foo, string(\"foo\"));  // WORKS\n// Also note that the arguments cannot be references:\n//   void Foo(const string& s);\n//   string my_str;\n//   NewCallback(&Foo, my_str);  // WON'T WORK:  Can't use referecnes.\n// However, correctly-typed pointers will work just fine.\nclass LIBPROTOBUF_EXPORT Closure {\n public:\n  Closure() {}\n  virtual ~Closure();\n\n  virtual void Run() = 0;\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Closure);\n};\n\nnamespace internal {\n\nclass LIBPROTOBUF_EXPORT FunctionClosure0 : public Closure {\n public:\n  typedef void (*FunctionType)();\n\n  FunctionClosure0(FunctionType function, bool self_deleting)\n    : function_(function), self_deleting_(self_deleting) {}\n  ~FunctionClosure0();\n\n  void Run() {\n    bool needs_delete = self_deleting_;  // read in case callback deletes\n    function_();\n    if (needs_delete) delete this;\n  }\n\n private:\n  FunctionType function_;\n  bool self_deleting_;\n};\n\ntemplate <typename Class>\nclass MethodClosure0 : public Closure {\n public:\n  typedef void (Class::*MethodType)();\n\n  MethodClosure0(Class* object, MethodType method, bool self_deleting)\n    : object_(object), method_(method), self_deleting_(self_deleting) {}\n  ~MethodClosure0() {}\n\n  void Run() {\n    bool needs_delete = self_deleting_;  // read in case callback deletes\n    (object_->*method_)();\n    if (needs_delete) delete this;\n  }\n\n private:\n  Class* object_;\n  MethodType method_;\n  bool self_deleting_;\n};\n\ntemplate <typename Arg1>\nclass FunctionClosure1 : public Closure {\n public:\n  typedef void (*FunctionType)(Arg1 arg1);\n\n  FunctionClosure1(FunctionType function, bool self_deleting,\n                   Arg1 arg1)\n    : function_(function), self_deleting_(self_deleting),\n      arg1_(arg1) {}\n  ~FunctionClosure1() {}\n\n  void Run() {\n    bool needs_delete = self_deleting_;  // read in case callback deletes\n    function_(arg1_);\n    if (needs_delete) delete this;\n  }\n\n private:\n  FunctionType function_;\n  bool self_deleting_;\n  Arg1 arg1_;\n};\n\ntemplate <typename Class, typename Arg1>\nclass MethodClosure1 : public Closure {\n public:\n  typedef void (Class::*MethodType)(Arg1 arg1);\n\n  MethodClosure1(Class* object, MethodType method, bool self_deleting,\n                 Arg1 arg1)\n    : object_(object), method_(method), self_deleting_(self_deleting),\n      arg1_(arg1) {}\n  ~MethodClosure1() {}\n\n  void Run() {\n    bool needs_delete = self_deleting_;  // read in case callback deletes\n    (object_->*method_)(arg1_);\n    if (needs_delete) delete this;\n  }\n\n private:\n  Class* object_;\n  MethodType method_;\n  bool self_deleting_;\n  Arg1 arg1_;\n};\n\ntemplate <typename Arg1, typename Arg2>\nclass FunctionClosure2 : public Closure {\n public:\n  typedef void (*FunctionType)(Arg1 arg1, Arg2 arg2);\n\n  FunctionClosure2(FunctionType function, bool self_deleting,\n                   Arg1 arg1, Arg2 arg2)\n    : function_(function), self_deleting_(self_deleting),\n      arg1_(arg1), arg2_(arg2) {}\n  ~FunctionClosure2() {}\n\n  void Run() {\n    bool needs_delete = self_deleting_;  // read in case callback deletes\n    function_(arg1_, arg2_);\n    if (needs_delete) delete this;\n  }\n\n private:\n  FunctionType function_;\n  bool self_deleting_;\n  Arg1 arg1_;\n  Arg2 arg2_;\n};\n\ntemplate <typename Class, typename Arg1, typename Arg2>\nclass MethodClosure2 : public Closure {\n public:\n  typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2);\n\n  MethodClosure2(Class* object, MethodType method, bool self_deleting,\n                 Arg1 arg1, Arg2 arg2)\n    : object_(object), method_(method), self_deleting_(self_deleting),\n      arg1_(arg1), arg2_(arg2) {}\n  ~MethodClosure2() {}\n\n  void Run() {\n    bool needs_delete = self_deleting_;  // read in case callback deletes\n    (object_->*method_)(arg1_, arg2_);\n    if (needs_delete) delete this;\n  }\n\n private:\n  Class* object_;\n  MethodType method_;\n  bool self_deleting_;\n  Arg1 arg1_;\n  Arg2 arg2_;\n};\n\n}  // namespace internal\n\n// See Closure.\ninline Closure* NewCallback(void (*function)()) {\n  return new internal::FunctionClosure0(function, true);\n}\n\n// See Closure.\ninline Closure* NewPermanentCallback(void (*function)()) {\n  return new internal::FunctionClosure0(function, false);\n}\n\n// See Closure.\ntemplate <typename Class>\ninline Closure* NewCallback(Class* object, void (Class::*method)()) {\n  return new internal::MethodClosure0<Class>(object, method, true);\n}\n\n// See Closure.\ntemplate <typename Class>\ninline Closure* NewPermanentCallback(Class* object, void (Class::*method)()) {\n  return new internal::MethodClosure0<Class>(object, method, false);\n}\n\n// See Closure.\ntemplate <typename Arg1>\ninline Closure* NewCallback(void (*function)(Arg1),\n                            Arg1 arg1) {\n  return new internal::FunctionClosure1<Arg1>(function, true, arg1);\n}\n\n// See Closure.\ntemplate <typename Arg1>\ninline Closure* NewPermanentCallback(void (*function)(Arg1),\n                                     Arg1 arg1) {\n  return new internal::FunctionClosure1<Arg1>(function, false, arg1);\n}\n\n// See Closure.\ntemplate <typename Class, typename Arg1>\ninline Closure* NewCallback(Class* object, void (Class::*method)(Arg1),\n                            Arg1 arg1) {\n  return new internal::MethodClosure1<Class, Arg1>(object, method, true, arg1);\n}\n\n// See Closure.\ntemplate <typename Class, typename Arg1>\ninline Closure* NewPermanentCallback(Class* object, void (Class::*method)(Arg1),\n                                     Arg1 arg1) {\n  return new internal::MethodClosure1<Class, Arg1>(object, method, false, arg1);\n}\n\n// See Closure.\ntemplate <typename Arg1, typename Arg2>\ninline Closure* NewCallback(void (*function)(Arg1, Arg2),\n                            Arg1 arg1, Arg2 arg2) {\n  return new internal::FunctionClosure2<Arg1, Arg2>(\n    function, true, arg1, arg2);\n}\n\n// See Closure.\ntemplate <typename Arg1, typename Arg2>\ninline Closure* NewPermanentCallback(void (*function)(Arg1, Arg2),\n                                     Arg1 arg1, Arg2 arg2) {\n  return new internal::FunctionClosure2<Arg1, Arg2>(\n    function, false, arg1, arg2);\n}\n\n// See Closure.\ntemplate <typename Class, typename Arg1, typename Arg2>\ninline Closure* NewCallback(Class* object, void (Class::*method)(Arg1, Arg2),\n                            Arg1 arg1, Arg2 arg2) {\n  return new internal::MethodClosure2<Class, Arg1, Arg2>(\n    object, method, true, arg1, arg2);\n}\n\n// See Closure.\ntemplate <typename Class, typename Arg1, typename Arg2>\ninline Closure* NewPermanentCallback(\n    Class* object, void (Class::*method)(Arg1, Arg2),\n    Arg1 arg1, Arg2 arg2) {\n  return new internal::MethodClosure2<Class, Arg1, Arg2>(\n    object, method, false, arg1, arg2);\n}\n\n// A function which does nothing.  Useful for creating no-op callbacks, e.g.:\n//   Closure* nothing = NewCallback(&DoNothing);\nvoid LIBPROTOBUF_EXPORT DoNothing();\n\n// ===================================================================\n// emulates google3/base/mutex.h\n\nnamespace internal {\n\n// A Mutex is a non-reentrant (aka non-recursive) mutex.  At most one thread T\n// may hold a mutex at a given time.  If T attempts to Lock() the same Mutex\n// while holding it, T will deadlock.\nclass LIBPROTOBUF_EXPORT Mutex {\n public:\n  // Create a Mutex that is not held by anybody.\n  Mutex();\n\n  // Destructor\n  ~Mutex();\n\n  // Block if necessary until this Mutex is free, then acquire it exclusively.\n  void Lock();\n\n  // Release this Mutex.  Caller must hold it exclusively.\n  void Unlock();\n\n  // Crash if this Mutex is not held exclusively by this thread.\n  // May fail to crash when it should; will never crash when it should not.\n  void AssertHeld();\n\n private:\n  struct Internal;\n  Internal* mInternal;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Mutex);\n};\n\n// MutexLock(mu) acquires mu when constructed and releases it when destroyed.\nclass LIBPROTOBUF_EXPORT MutexLock {\n public:\n  explicit MutexLock(Mutex *mu) : mu_(mu) { this->mu_->Lock(); }\n  ~MutexLock() { this->mu_->Unlock(); }\n private:\n  Mutex *const mu_;\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MutexLock);\n};\n\n// TODO(kenton):  Implement these?  Hard to implement portably.\ntypedef MutexLock ReaderMutexLock;\ntypedef MutexLock WriterMutexLock;\n\n// MutexLockMaybe is like MutexLock, but is a no-op when mu is NULL.\nclass LIBPROTOBUF_EXPORT MutexLockMaybe {\n public:\n  explicit MutexLockMaybe(Mutex *mu) :\n    mu_(mu) { if (this->mu_ != NULL) { this->mu_->Lock(); } }\n  ~MutexLockMaybe() { if (this->mu_ != NULL) { this->mu_->Unlock(); } }\n private:\n  Mutex *const mu_;\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MutexLockMaybe);\n};\n\n}  // namespace internal\n\n// We made these internal so that they would show up as such in the docs,\n// but we don't want to stick \"internal::\" in front of them everywhere.\nusing internal::Mutex;\nusing internal::MutexLock;\nusing internal::ReaderMutexLock;\nusing internal::WriterMutexLock;\nusing internal::MutexLockMaybe;\n\n// ===================================================================\n// from google3/base/type_traits.h\n\nnamespace internal {\n\n// Specified by TR1 [4.7.4] Pointer modifications.\ntemplate<typename T> struct remove_pointer { typedef T type; };\ntemplate<typename T> struct remove_pointer<T*> { typedef T type; };\ntemplate<typename T> struct remove_pointer<T* const> { typedef T type; };\ntemplate<typename T> struct remove_pointer<T* volatile> { typedef T type; };\ntemplate<typename T> struct remove_pointer<T* const volatile> {\n  typedef T type; };\n\n// ===================================================================\n\n// Checks if the buffer contains structurally-valid UTF-8.  Implemented in\n// structurally_valid.cc.\nLIBPROTOBUF_EXPORT bool IsStructurallyValidUTF8(const char* buf, int len);\n\n}  // namespace internal\n\n// ===================================================================\n// Shutdown support.\n\n// Shut down the entire protocol buffers library, deleting all static-duration\n// objects allocated by the library or by generated .pb.cc files.\n//\n// There are two reasons you might want to call this:\n// * You use a draconian definition of \"memory leak\" in which you expect\n//   every single malloc() to have a corresponding free(), even for objects\n//   which live until program exit.\n// * You are writing a dynamically-loaded library which needs to clean up\n//   after itself when the library is unloaded.\n//\n// It is safe to call this multiple times.  However, it is not safe to use\n// any other part of the protocol buffers library after\n// ShutdownProtobufLibrary() has been called.\nLIBPROTOBUF_EXPORT void ShutdownProtobufLibrary();\n\nnamespace internal {\n\n// Register a function to be called when ShutdownProtocolBuffers() is called.\nLIBPROTOBUF_EXPORT void OnShutdown(void (*func)());\n\n}  // namespace internal\n\n#ifdef PROTOBUF_USE_EXCEPTIONS\nclass FatalException : public std::exception {\n public:\n  FatalException(const char* filename, int line, const std::string& message)\n      : filename_(filename), line_(line), message_(message) {}\n  virtual ~FatalException() throw();\n\n  virtual const char* what() const throw();\n\n  const char* filename() const { return filename_; }\n  int line() const { return line_; }\n  const std::string& message() const { return message_; }\n\n private:\n  const char* filename_;\n  const int line_;\n  const std::string message_;\n};\n#endif\n\n// This is at the end of the file instead of the beginning to work around a bug\n// in some versions of MSVC.\nusing namespace std;  // Don't do this at home, kids.\n\n}  // namespace protobuf\n}  // namespace google\n\n#endif  // GOOGLE_PROTOBUF_COMMON_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\n#include <vector>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\n#include \"config.h\"\n\nnamespace google {\nnamespace protobuf {\nnamespace {\n\n// TODO(kenton):  More tests.\n\n#ifdef PACKAGE_VERSION  // only defined when using automake, not MSVC\n\nTEST(VersionTest, VersionMatchesConfig) {\n  // Verify that the version string specified in config.h matches the one\n  // in common.h.  The config.h version is a string which may have a suffix\n  // like \"beta\" or \"rc1\", so we remove that.\n  string version = PACKAGE_VERSION;\n  int pos = 0;\n  while (pos < version.size() &&\n         (ascii_isdigit(version[pos]) || version[pos] == '.')) {\n    ++pos;\n  }\n  version.erase(pos);\n\n  EXPECT_EQ(version, internal::VersionString(GOOGLE_PROTOBUF_VERSION));\n}\n\n#endif  // PACKAGE_VERSION\n\nTEST(CommonTest, IntMinMaxConstants) {\n  // kint32min was declared incorrectly in the first release of protobufs.\n  // Ugh.\n  EXPECT_LT(kint32min, kint32max);\n  EXPECT_EQ(static_cast<uint32>(kint32min), static_cast<uint32>(kint32max) + 1);\n  EXPECT_LT(kint64min, kint64max);\n  EXPECT_EQ(static_cast<uint64>(kint64min), static_cast<uint64>(kint64max) + 1);\n  EXPECT_EQ(0, kuint32max + 1);\n  EXPECT_EQ(0, kuint64max + 1);\n}\n\nvector<string> captured_messages_;\n\nvoid CaptureLog(LogLevel level, const char* filename, int line,\n                const string& message) {\n  captured_messages_.push_back(\n    strings::Substitute(\"$0 $1:$2: $3\",\n      implicit_cast<int>(level), filename, line, message));\n}\n\nTEST(LoggingTest, DefaultLogging) {\n  CaptureTestStderr();\n  int line = __LINE__;\n  GOOGLE_LOG(INFO   ) << \"A message.\";\n  GOOGLE_LOG(WARNING) << \"A warning.\";\n  GOOGLE_LOG(ERROR  ) << \"An error.\";\n\n  string text = GetCapturedTestStderr();\n  EXPECT_EQ(\n    \"libprotobuf INFO \"__FILE__\":\" + SimpleItoa(line + 1) + \"] A message.\\n\"\n    \"libprotobuf WARNING \"__FILE__\":\" + SimpleItoa(line + 2) + \"] A warning.\\n\"\n    \"libprotobuf ERROR \"__FILE__\":\" + SimpleItoa(line + 3) + \"] An error.\\n\",\n    text);\n}\n\nTEST(LoggingTest, NullLogging) {\n  LogHandler* old_handler = SetLogHandler(NULL);\n\n  CaptureTestStderr();\n  GOOGLE_LOG(INFO   ) << \"A message.\";\n  GOOGLE_LOG(WARNING) << \"A warning.\";\n  GOOGLE_LOG(ERROR  ) << \"An error.\";\n\n  EXPECT_TRUE(SetLogHandler(old_handler) == NULL);\n\n  string text = GetCapturedTestStderr();\n  EXPECT_EQ(\"\", text);\n}\n\nTEST(LoggingTest, CaptureLogging) {\n  captured_messages_.clear();\n\n  LogHandler* old_handler = SetLogHandler(&CaptureLog);\n\n  int start_line = __LINE__;\n  GOOGLE_LOG(ERROR) << \"An error.\";\n  GOOGLE_LOG(WARNING) << \"A warning.\";\n\n  EXPECT_TRUE(SetLogHandler(old_handler) == &CaptureLog);\n\n  ASSERT_EQ(2, captured_messages_.size());\n  EXPECT_EQ(\n    \"2 \"__FILE__\":\" + SimpleItoa(start_line + 1) + \": An error.\",\n    captured_messages_[0]);\n  EXPECT_EQ(\n    \"1 \"__FILE__\":\" + SimpleItoa(start_line + 2) + \": A warning.\",\n    captured_messages_[1]);\n}\n\nTEST(LoggingTest, SilenceLogging) {\n  captured_messages_.clear();\n\n  LogHandler* old_handler = SetLogHandler(&CaptureLog);\n\n  int line1 = __LINE__; GOOGLE_LOG(INFO) << \"Visible1\";\n  LogSilencer* silencer1 = new LogSilencer;\n  GOOGLE_LOG(INFO) << \"Not visible.\";\n  LogSilencer* silencer2 = new LogSilencer;\n  GOOGLE_LOG(INFO) << \"Not visible.\";\n  delete silencer1;\n  GOOGLE_LOG(INFO) << \"Not visible.\";\n  delete silencer2;\n  int line2 = __LINE__; GOOGLE_LOG(INFO) << \"Visible2\";\n\n  EXPECT_TRUE(SetLogHandler(old_handler) == &CaptureLog);\n\n  ASSERT_EQ(2, captured_messages_.size());\n  EXPECT_EQ(\n    \"0 \"__FILE__\":\" + SimpleItoa(line1) + \": Visible1\",\n    captured_messages_[0]);\n  EXPECT_EQ(\n    \"0 \"__FILE__\":\" + SimpleItoa(line2) + \": Visible2\",\n    captured_messages_[1]);\n}\n\nclass ClosureTest : public testing::Test {\n public:\n  void SetA123Method()   { a_ = 123; }\n  static void SetA123Function() { current_instance_->a_ = 123; }\n\n  void SetAMethod(int a)         { a_ = a; }\n  void SetCMethod(string c)      { c_ = c; }\n\n  static void SetAFunction(int a)         { current_instance_->a_ = a; }\n  static void SetCFunction(string c)      { current_instance_->c_ = c; }\n\n  void SetABMethod(int a, const char* b)  { a_ = a; b_ = b; }\n  static void SetABFunction(int a, const char* b) {\n    current_instance_->a_ = a;\n    current_instance_->b_ = b;\n  }\n\n  virtual void SetUp() {\n    current_instance_ = this;\n    a_ = 0;\n    b_ = NULL;\n    c_.clear();\n    permanent_closure_ = NULL;\n  }\n\n  void DeleteClosureInCallback() {\n    delete permanent_closure_;\n  }\n\n  int a_;\n  const char* b_;\n  string c_;\n  Closure* permanent_closure_;\n\n  static ClosureTest* current_instance_;\n};\n\nClosureTest* ClosureTest::current_instance_ = NULL;\n\nTEST_F(ClosureTest, TestClosureFunction0) {\n  Closure* closure = NewCallback(&SetA123Function);\n  EXPECT_NE(123, a_);\n  closure->Run();\n  EXPECT_EQ(123, a_);\n}\n\nTEST_F(ClosureTest, TestClosureMethod0) {\n  Closure* closure = NewCallback(current_instance_,\n                                 &ClosureTest::SetA123Method);\n  EXPECT_NE(123, a_);\n  closure->Run();\n  EXPECT_EQ(123, a_);\n}\n\nTEST_F(ClosureTest, TestClosureFunction1) {\n  Closure* closure = NewCallback(&SetAFunction, 456);\n  EXPECT_NE(456, a_);\n  closure->Run();\n  EXPECT_EQ(456, a_);\n}\n\nTEST_F(ClosureTest, TestClosureMethod1) {\n  Closure* closure = NewCallback(current_instance_,\n                                 &ClosureTest::SetAMethod, 456);\n  EXPECT_NE(456, a_);\n  closure->Run();\n  EXPECT_EQ(456, a_);\n}\n\nTEST_F(ClosureTest, TestClosureFunction1String) {\n  Closure* closure = NewCallback(&SetCFunction, string(\"test\"));\n  EXPECT_NE(\"test\", c_);\n  closure->Run();\n  EXPECT_EQ(\"test\", c_);\n}\n\nTEST_F(ClosureTest, TestClosureMethod1String) {\n  Closure* closure = NewCallback(current_instance_,\n                                 &ClosureTest::SetCMethod, string(\"test\"));\n  EXPECT_NE(\"test\", c_);\n  closure->Run();\n  EXPECT_EQ(\"test\", c_);\n}\n\nTEST_F(ClosureTest, TestClosureFunction2) {\n  const char* cstr = \"hello\";\n  Closure* closure = NewCallback(&SetABFunction, 789, cstr);\n  EXPECT_NE(789, a_);\n  EXPECT_NE(cstr, b_);\n  closure->Run();\n  EXPECT_EQ(789, a_);\n  EXPECT_EQ(cstr, b_);\n}\n\nTEST_F(ClosureTest, TestClosureMethod2) {\n  const char* cstr = \"hello\";\n  Closure* closure = NewCallback(current_instance_,\n                                 &ClosureTest::SetABMethod, 789, cstr);\n  EXPECT_NE(789, a_);\n  EXPECT_NE(cstr, b_);\n  closure->Run();\n  EXPECT_EQ(789, a_);\n  EXPECT_EQ(cstr, b_);\n}\n\n// Repeat all of the above with NewPermanentCallback()\n\nTEST_F(ClosureTest, TestPermanentClosureFunction0) {\n  Closure* closure = NewPermanentCallback(&SetA123Function);\n  EXPECT_NE(123, a_);\n  closure->Run();\n  EXPECT_EQ(123, a_);\n  a_ = 0;\n  closure->Run();\n  EXPECT_EQ(123, a_);\n  delete closure;\n}\n\nTEST_F(ClosureTest, TestPermanentClosureMethod0) {\n  Closure* closure = NewPermanentCallback(current_instance_,\n                                          &ClosureTest::SetA123Method);\n  EXPECT_NE(123, a_);\n  closure->Run();\n  EXPECT_EQ(123, a_);\n  a_ = 0;\n  closure->Run();\n  EXPECT_EQ(123, a_);\n  delete closure;\n}\n\nTEST_F(ClosureTest, TestPermanentClosureFunction1) {\n  Closure* closure = NewPermanentCallback(&SetAFunction, 456);\n  EXPECT_NE(456, a_);\n  closure->Run();\n  EXPECT_EQ(456, a_);\n  a_ = 0;\n  closure->Run();\n  EXPECT_EQ(456, a_);\n  delete closure;\n}\n\nTEST_F(ClosureTest, TestPermanentClosureMethod1) {\n  Closure* closure = NewPermanentCallback(current_instance_,\n                                          &ClosureTest::SetAMethod, 456);\n  EXPECT_NE(456, a_);\n  closure->Run();\n  EXPECT_EQ(456, a_);\n  a_ = 0;\n  closure->Run();\n  EXPECT_EQ(456, a_);\n  delete closure;\n}\n\nTEST_F(ClosureTest, TestPermanentClosureFunction2) {\n  const char* cstr = \"hello\";\n  Closure* closure = NewPermanentCallback(&SetABFunction, 789, cstr);\n  EXPECT_NE(789, a_);\n  EXPECT_NE(cstr, b_);\n  closure->Run();\n  EXPECT_EQ(789, a_);\n  EXPECT_EQ(cstr, b_);\n  a_ = 0;\n  b_ = NULL;\n  closure->Run();\n  EXPECT_EQ(789, a_);\n  EXPECT_EQ(cstr, b_);\n  delete closure;\n}\n\nTEST_F(ClosureTest, TestPermanentClosureMethod2) {\n  const char* cstr = \"hello\";\n  Closure* closure = NewPermanentCallback(current_instance_,\n                                          &ClosureTest::SetABMethod, 789, cstr);\n  EXPECT_NE(789, a_);\n  EXPECT_NE(cstr, b_);\n  closure->Run();\n  EXPECT_EQ(789, a_);\n  EXPECT_EQ(cstr, b_);\n  a_ = 0;\n  b_ = NULL;\n  closure->Run();\n  EXPECT_EQ(789, a_);\n  EXPECT_EQ(cstr, b_);\n  delete closure;\n}\n\nTEST_F(ClosureTest, TestPermanentClosureDeleteInCallback) {\n  permanent_closure_ = NewPermanentCallback((ClosureTest*) this,\n      &ClosureTest::DeleteClosureInCallback);\n  permanent_closure_->Run();\n}\n\n}  // anonymous namespace\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/hash.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// Deals with the fact that hash_map is not defined everywhere.\n\n#ifndef GOOGLE_PROTOBUF_STUBS_HASH_H__\n#define GOOGLE_PROTOBUF_STUBS_HASH_H__\n\n#include <string.h>\n#include <google/protobuf/stubs/common.h>\n#include \"config.h\"\n\n#if defined(HAVE_HASH_MAP) && defined(HAVE_HASH_SET)\n#include HASH_MAP_H\n#include HASH_SET_H\n#else\n#define MISSING_HASH\n#include <map>\n#include <set>\n#endif\n\nnamespace google {\nnamespace protobuf {\n\n#ifdef MISSING_HASH\n\n// This system doesn't have hash_map or hash_set.  Emulate them using map and\n// set.\n\n// Make hash<T> be the same as less<T>.  Note that everywhere where custom\n// hash functions are defined in the protobuf code, they are also defined such\n// that they can be used as \"less\" functions, which is required by MSVC anyway.\ntemplate <typename Key>\nstruct hash {\n  // Dummy, just to make derivative hash functions compile.\n  int operator()(const Key& key) {\n    GOOGLE_LOG(FATAL) << \"Should never be called.\";\n    return 0;\n  }\n\n  inline bool operator()(const Key& a, const Key& b) const {\n    return a < b;\n  }\n};\n\n// Make sure char* is compared by value.\ntemplate <>\nstruct hash<const char*> {\n  // Dummy, just to make derivative hash functions compile.\n  int operator()(const char* key) {\n    GOOGLE_LOG(FATAL) << \"Should never be called.\";\n    return 0;\n  }\n\n  inline bool operator()(const char* a, const char* b) const {\n    return strcmp(a, b) < 0;\n  }\n};\n\ntemplate <typename Key, typename Data,\n          typename HashFcn = hash<Key>,\n          typename EqualKey = int >\nclass hash_map : public std::map<Key, Data, HashFcn> {\n};\n\ntemplate <typename Key,\n          typename HashFcn = hash<Key>,\n          typename EqualKey = int >\nclass hash_set : public std::set<Key, HashFcn> {\n};\n\n#elif defined(_MSC_VER) && !defined(_STLPORT_VERSION)\n\ntemplate <typename Key>\nstruct hash : public HASH_NAMESPACE::hash_compare<Key> {\n};\n\n// MSVC's hash_compare<const char*> hashes based on the string contents but\n// compares based on the string pointer.  WTF?\nclass CstringLess {\n public:\n  inline bool operator()(const char* a, const char* b) const {\n    return strcmp(a, b) < 0;\n  }\n};\n\ntemplate <>\nstruct hash<const char*>\n  : public HASH_NAMESPACE::hash_compare<const char*, CstringLess> {\n};\n\ntemplate <typename Key, typename Data,\n          typename HashFcn = hash<Key>,\n          typename EqualKey = int >\nclass hash_map : public HASH_NAMESPACE::hash_map<\n    Key, Data, HashFcn> {\n};\n\ntemplate <typename Key,\n          typename HashFcn = hash<Key>,\n          typename EqualKey = int >\nclass hash_set : public HASH_NAMESPACE::hash_set<\n    Key, HashFcn> {\n};\n\n#else\n\ntemplate <typename Key>\nstruct hash : public HASH_NAMESPACE::hash<Key> {\n};\n\ntemplate <typename Key>\nstruct hash<const Key*> {\n  inline size_t operator()(const Key* key) const {\n    return reinterpret_cast<size_t>(key);\n  }\n};\n\n// Unlike the old SGI version, the TR1 \"hash\" does not special-case char*.  So,\n// we go ahead and provide our own implementation.\ntemplate <>\nstruct hash<const char*> {\n  inline size_t operator()(const char* str) const {\n    size_t result = 0;\n    for (; *str != '\\0'; str++) {\n      result = 5 * result + *str;\n    }\n    return result;\n  }\n};\n\ntemplate <typename Key, typename Data,\n          typename HashFcn = hash<Key>,\n          typename EqualKey = std::equal_to<Key> >\nclass hash_map : public HASH_NAMESPACE::HASH_MAP_CLASS<\n    Key, Data, HashFcn, EqualKey> {\n};\n\ntemplate <typename Key,\n          typename HashFcn = hash<Key>,\n          typename EqualKey = std::equal_to<Key> >\nclass hash_set : public HASH_NAMESPACE::HASH_SET_CLASS<\n    Key, HashFcn, EqualKey> {\n};\n\n#endif\n\ntemplate <>\nstruct hash<string> {\n  inline size_t operator()(const string& key) const {\n    return hash<const char*>()(key.c_str());\n  }\n\n  static const size_t bucket_size = 4;\n  static const size_t min_buckets = 8;\n  inline size_t operator()(const string& a, const string& b) const {\n    return a < b;\n  }\n};\n\ntemplate <typename First, typename Second>\nstruct hash<pair<First, Second> > {\n  inline size_t operator()(const pair<First, Second>& key) const {\n    size_t first_hash = hash<First>()(key.first);\n    size_t second_hash = hash<Second>()(key.second);\n\n    // FIXME(kenton):  What is the best way to compute this hash?  I have\n    // no idea!  This seems a bit better than an XOR.\n    return first_hash * ((1 << 16) - 1) + second_hash;\n  }\n\n  static const size_t bucket_size = 4;\n  static const size_t min_buckets = 8;\n  inline size_t operator()(const pair<First, Second>& a,\n                           const pair<First, Second>& b) const {\n    return a < b;\n  }\n};\n\n// Used by GCC/SGI STL only.  (Why isn't this provided by the standard\n// library?  :( )\nstruct streq {\n  inline bool operator()(const char* a, const char* b) const {\n    return strcmp(a, b) == 0;\n  }\n};\n\n}  // namespace protobuf\n}  // namespace google\n\n#endif  // GOOGLE_PROTOBUF_STUBS_HASH_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/map-util.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// from google3/util/gtl/map-util.h\n// Author: Anton Carver\n\n#ifndef GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__\n#define GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__\n\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\n\n// Perform a lookup in a map or hash_map.\n// If the key is present in the map then the value associated with that\n// key is returned, otherwise the value passed as a default is returned.\ntemplate <class Collection>\nconst typename Collection::value_type::second_type&\nFindWithDefault(const Collection& collection,\n                const typename Collection::value_type::first_type& key,\n                const typename Collection::value_type::second_type& value) {\n  typename Collection::const_iterator it = collection.find(key);\n  if (it == collection.end()) {\n    return value;\n  }\n  return it->second;\n}\n\n// Perform a lookup in a map or hash_map.\n// If the key is present a const pointer to the associated value is returned,\n// otherwise a NULL pointer is returned.\ntemplate <class Collection>\nconst typename Collection::value_type::second_type*\nFindOrNull(const Collection& collection,\n           const typename Collection::value_type::first_type& key) {\n  typename Collection::const_iterator it = collection.find(key);\n  if (it == collection.end()) {\n    return 0;\n  }\n  return &it->second;\n}\n\n// Perform a lookup in a map or hash_map whose values are pointers.\n// If the key is present a const pointer to the associated value is returned,\n// otherwise a NULL pointer is returned.\n// This function does not distinguish between a missing key and a key mapped\n// to a NULL value.\ntemplate <class Collection>\nconst typename Collection::value_type::second_type\nFindPtrOrNull(const Collection& collection,\n              const typename Collection::value_type::first_type& key) {\n  typename Collection::const_iterator it = collection.find(key);\n  if (it == collection.end()) {\n    return 0;\n  }\n  return it->second;\n}\n\n// Change the value associated with a particular key in a map or hash_map.\n// If the key is not present in the map the key and value are inserted,\n// otherwise the value is updated to be a copy of the value provided.\n// True indicates that an insert took place, false indicates an update.\ntemplate <class Collection, class Key, class Value>\nbool InsertOrUpdate(Collection * const collection,\n                   const Key& key, const Value& value) {\n  pair<typename Collection::iterator, bool> ret =\n    collection->insert(typename Collection::value_type(key, value));\n  if (!ret.second) {\n    // update\n    ret.first->second = value;\n    return false;\n  }\n  return true;\n}\n\n// Insert a new key and value into a map or hash_map.\n// If the key is not present in the map the key and value are\n// inserted, otherwise nothing happens. True indicates that an insert\n// took place, false indicates the key was already present.\ntemplate <class Collection, class Key, class Value>\nbool InsertIfNotPresent(Collection * const collection,\n                        const Key& key, const Value& value) {\n  pair<typename Collection::iterator, bool> ret =\n    collection->insert(typename Collection::value_type(key, value));\n  return ret.second;\n}\n\n}  // namespace protobuf\n}  // namespace google\n\n#endif  // GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// emulates google3/base/once.h\n//\n// This header is intended to be included only by internal .cc files and\n// generated .pb.cc files.  Users should not use this directly.\n\n#ifdef _WIN32\n#include <windows.h>\n#endif\n\n#include <google/protobuf/stubs/once.h>\n\nnamespace google {\nnamespace protobuf {\n\n#ifdef _WIN32\n\nstruct ProtobufOnceInternal {\n  ProtobufOnceInternal() {\n    InitializeCriticalSection(&critical_section);\n  }\n  ~ProtobufOnceInternal() {\n    DeleteCriticalSection(&critical_section);\n  }\n  CRITICAL_SECTION critical_section;\n};\n\nProtobufOnceType::~ProtobufOnceType()\n{\n  delete internal_;\n  internal_ = NULL;\n}\n\nProtobufOnceType::ProtobufOnceType() {\n  // internal_ may be non-NULL if Init() was already called.\n  if (internal_ == NULL) internal_ = new ProtobufOnceInternal;\n}\n\nvoid ProtobufOnceType::Init(void (*init_func)()) {\n  // internal_ may be NULL if we're still in dynamic initialization and the\n  // constructor has not been called yet.  As mentioned in once.h, we assume\n  // that the program is still single-threaded at this time, and therefore it\n  // should be safe to initialize internal_ like so.\n  if (internal_ == NULL) internal_ = new ProtobufOnceInternal;\n\n  EnterCriticalSection(&internal_->critical_section);\n  if (!initialized_) {\n    init_func();\n    initialized_ = true;\n  }\n  LeaveCriticalSection(&internal_->critical_section);\n}\n\n#endif\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// emulates google3/base/once.h\n//\n// This header is intended to be included only by internal .cc files and\n// generated .pb.cc files.  Users should not use this directly.\n//\n// This is basically a portable version of pthread_once().\n//\n// This header declares three things:\n// * A type called ProtobufOnceType.\n// * A macro GOOGLE_PROTOBUF_DECLARE_ONCE() which declares a variable of type\n//   ProtobufOnceType.  This is the only legal way to declare such a variable.\n//   The macro may only be used at the global scope (you cannot create local\n//   or class member variables of this type).\n// * A function GogoleOnceInit(ProtobufOnceType* once, void (*init_func)()).\n//   This function, when invoked multiple times given the same ProtobufOnceType\n//   object, will invoke init_func on the first call only, and will make sure\n//   none of the calls return before that first call to init_func has finished.\n//\n// This implements a way to perform lazy initialization.  It's more efficient\n// than using mutexes as no lock is needed if initialization has already\n// happened.\n//\n// Example usage:\n//   void Init();\n//   GOOGLE_PROTOBUF_DECLARE_ONCE(once_init);\n//\n//   // Calls Init() exactly once.\n//   void InitOnce() {\n//     GoogleOnceInit(&once_init, &Init);\n//   }\n//\n// Note that if GoogleOnceInit() is called before main() has begun, it must\n// only be called by the thread that will eventually call main() -- that is,\n// the thread that performs dynamic initialization.  In general this is a safe\n// assumption since people don't usually construct threads before main() starts,\n// but it is technically not guaranteed.  Unfortunately, Win32 provides no way\n// whatsoever to statically-initialize its synchronization primitives, so our\n// only choice is to assume that dynamic initialization is single-threaded.\n\n#ifndef GOOGLE_PROTOBUF_STUBS_ONCE_H__\n#define GOOGLE_PROTOBUF_STUBS_ONCE_H__\n\n#include <google/protobuf/stubs/common.h>\n\n#ifndef _WIN32\n#include <pthread.h>\n#endif\n\nnamespace google {\nnamespace protobuf {\n\n#ifdef _WIN32\n\nstruct ProtobufOnceInternal;\n\nstruct LIBPROTOBUF_EXPORT ProtobufOnceType {\n  ProtobufOnceType();\n  ~ProtobufOnceType();\n  void Init(void (*init_func)());\n\n  volatile bool initialized_;\n  ProtobufOnceInternal* internal_;\n};\n\n#define GOOGLE_PROTOBUF_DECLARE_ONCE(NAME)                    \\\n  ::google::protobuf::ProtobufOnceType NAME\n\ninline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)()) {\n  // Note:  Double-checked locking is safe on x86.\n  if (!once->initialized_) {\n    once->Init(init_func);\n  }\n}\n\n#else\n\ntypedef pthread_once_t ProtobufOnceType;\n\n#define GOOGLE_PROTOBUF_DECLARE_ONCE(NAME)                    \\\n  pthread_once_t NAME = PTHREAD_ONCE_INIT\n\ninline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)()) {\n  pthread_once(once, init_func);\n}\n\n#endif\n\n}  // namespace protobuf\n}  // namespace google\n\n#endif  // GOOGLE_PROTOBUF_STUBS_ONCE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\n#ifdef _WIN32\n#include <windows.h>\n#else\n#include <unistd.h>\n#include <pthread.h>\n#endif\n\n#include <google/protobuf/stubs/once.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace {\n\nclass OnceInitTest : public testing::Test {\n protected:\n  void SetUp() {\n    state_ = INIT_NOT_STARTED;\n    current_test_ = this;\n  }\n\n  // Since ProtobufOnceType is only allowed to be allocated in static storage,\n  // each test must use a different pair of ProtobufOnceType objects which it\n  // must declare itself.\n  void SetOnces(ProtobufOnceType* once, ProtobufOnceType* recursive_once) {\n    once_ = once;\n    recursive_once_ = recursive_once;\n  }\n\n  void InitOnce() {\n    GoogleOnceInit(once_, &InitStatic);\n  }\n  void InitRecursiveOnce() {\n    GoogleOnceInit(recursive_once_, &InitRecursiveStatic);\n  }\n\n  void BlockInit() { init_blocker_.Lock(); }\n  void UnblockInit() { init_blocker_.Unlock(); }\n\n  class TestThread {\n   public:\n    TestThread(Closure* callback)\n        : done_(false), joined_(false), callback_(callback) {\n#ifdef _WIN32\n      thread_ = CreateThread(NULL, 0, &Start, this, 0, NULL);\n#else\n      pthread_create(&thread_, NULL, &Start, this);\n#endif\n    }\n    ~TestThread() {\n      if (!joined_) Join();\n    }\n\n    bool IsDone() {\n      MutexLock lock(&done_mutex_);\n      return done_;\n    }\n    void Join() {\n      joined_ = true;\n#ifdef _WIN32\n      WaitForSingleObject(thread_, INFINITE);\n      CloseHandle(thread_);\n#else\n      pthread_join(thread_, NULL);\n#endif\n    }\n\n   private:\n#ifdef _WIN32\n    HANDLE thread_;\n#else\n    pthread_t thread_;\n#endif\n\n    Mutex done_mutex_;\n    bool done_;\n    bool joined_;\n    Closure* callback_;\n\n#ifdef _WIN32\n    static DWORD WINAPI Start(LPVOID arg) {\n#else\n    static void* Start(void* arg) {\n#endif\n      reinterpret_cast<TestThread*>(arg)->Run();\n      return 0;\n    }\n\n    void Run() {\n      callback_->Run();\n      MutexLock lock(&done_mutex_);\n      done_ = true;\n    }\n  };\n\n  TestThread* RunInitOnceInNewThread() {\n    return new TestThread(NewCallback(this, &OnceInitTest::InitOnce));\n  }\n  TestThread* RunInitRecursiveOnceInNewThread() {\n    return new TestThread(NewCallback(this, &OnceInitTest::InitRecursiveOnce));\n  }\n\n  enum State {\n    INIT_NOT_STARTED,\n    INIT_STARTED,\n    INIT_DONE\n  };\n  State CurrentState() {\n    MutexLock lock(&mutex_);\n    return state_;\n  }\n\n  void WaitABit() {\n#ifdef _WIN32\n    Sleep(1000);\n#else\n    sleep(1);\n#endif\n  }\n\n private:\n  Mutex mutex_;\n  Mutex init_blocker_;\n  State state_;\n  ProtobufOnceType* once_;\n  ProtobufOnceType* recursive_once_;\n\n  void Init() {\n    MutexLock lock(&mutex_);\n    EXPECT_EQ(INIT_NOT_STARTED, state_);\n    state_ = INIT_STARTED;\n    mutex_.Unlock();\n    init_blocker_.Lock();\n    init_blocker_.Unlock();\n    mutex_.Lock();\n    state_ = INIT_DONE;\n  }\n\n  static OnceInitTest* current_test_;\n  static void InitStatic() { current_test_->Init(); }\n  static void InitRecursiveStatic() { current_test_->InitOnce(); }\n};\n\nOnceInitTest* OnceInitTest::current_test_ = NULL;\n\nGOOGLE_PROTOBUF_DECLARE_ONCE(simple_once);\n\nTEST_F(OnceInitTest, Simple) {\n  SetOnces(&simple_once, NULL);\n\n  EXPECT_EQ(INIT_NOT_STARTED, CurrentState());\n  InitOnce();\n  EXPECT_EQ(INIT_DONE, CurrentState());\n\n  // Calling again has no effect.\n  InitOnce();\n  EXPECT_EQ(INIT_DONE, CurrentState());\n}\n\nGOOGLE_PROTOBUF_DECLARE_ONCE(recursive_once1);\nGOOGLE_PROTOBUF_DECLARE_ONCE(recursive_once2);\n\nTEST_F(OnceInitTest, Recursive) {\n  SetOnces(&recursive_once1, &recursive_once2);\n\n  EXPECT_EQ(INIT_NOT_STARTED, CurrentState());\n  InitRecursiveOnce();\n  EXPECT_EQ(INIT_DONE, CurrentState());\n}\n\nGOOGLE_PROTOBUF_DECLARE_ONCE(multiple_threads_once);\n\nTEST_F(OnceInitTest, MultipleThreads) {\n  SetOnces(&multiple_threads_once, NULL);\n\n  scoped_ptr<TestThread> threads[4];\n  EXPECT_EQ(INIT_NOT_STARTED, CurrentState());\n  for (int i = 0; i < 4; i++) {\n    threads[i].reset(RunInitOnceInNewThread());\n  }\n  for (int i = 0; i < 4; i++) {\n    threads[i]->Join();\n  }\n  EXPECT_EQ(INIT_DONE, CurrentState());\n}\n\nGOOGLE_PROTOBUF_DECLARE_ONCE(multiple_threads_blocked_once1);\nGOOGLE_PROTOBUF_DECLARE_ONCE(multiple_threads_blocked_once2);\n\nTEST_F(OnceInitTest, MultipleThreadsBlocked) {\n  SetOnces(&multiple_threads_blocked_once1, &multiple_threads_blocked_once2);\n\n  scoped_ptr<TestThread> threads[8];\n  EXPECT_EQ(INIT_NOT_STARTED, CurrentState());\n\n  BlockInit();\n  for (int i = 0; i < 4; i++) {\n    threads[i].reset(RunInitOnceInNewThread());\n  }\n  for (int i = 4; i < 8; i++) {\n    threads[i].reset(RunInitRecursiveOnceInNewThread());\n  }\n\n  WaitABit();\n\n  // We should now have one thread blocked inside Init(), four blocked waiting\n  // for Init() to complete, and three blocked waiting for InitRecursive() to\n  // complete.\n  EXPECT_EQ(INIT_STARTED, CurrentState());\n  UnblockInit();\n\n  for (int i = 0; i < 8; i++) {\n    threads[i]->Join();\n  }\n  EXPECT_EQ(INIT_DONE, CurrentState());\n}\n\n}  // anonymous namespace\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/stl_util-inl.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// from google3/util/gtl/stl_util-inl.h\n\n#ifndef GOOGLE_PROTOBUF_STUBS_STL_UTIL_INL_H__\n#define GOOGLE_PROTOBUF_STUBS_STL_UTIL_INL_H__\n\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\n\n// STLDeleteContainerPointers()\n//  For a range within a container of pointers, calls delete\n//  (non-array version) on these pointers.\n// NOTE: for these three functions, we could just implement a DeleteObject\n// functor and then call for_each() on the range and functor, but this\n// requires us to pull in all of algorithm.h, which seems expensive.\n// For hash_[multi]set, it is important that this deletes behind the iterator\n// because the hash_set may call the hash function on the iterator when it is\n// advanced, which could result in the hash function trying to deference a\n// stale pointer.\ntemplate <class ForwardIterator>\nvoid STLDeleteContainerPointers(ForwardIterator begin,\n                                ForwardIterator end) {\n  while (begin != end) {\n    ForwardIterator temp = begin;\n    ++begin;\n    delete *temp;\n  }\n}\n\n// Inside Google, this function implements a horrible, disgusting hack in which\n// we reach into the string's private implementation and resize it without\n// initializing the new bytes.  In some cases doing this can significantly\n// improve performance.  However, since it's totally non-portable it has no\n// place in open source code.  Feel free to fill this function in with your\n// own disgusting hack if you want the perf boost.\ninline void STLStringResizeUninitialized(string* s, size_t new_size) {\n  s->resize(new_size);\n}\n\n// Return a mutable char* pointing to a string's internal buffer,\n// which may not be null-terminated. Writing through this pointer will\n// modify the string.\n//\n// string_as_array(&str)[i] is valid for 0 <= i < str.size() until the\n// next call to a string method that invalidates iterators.\n//\n// As of 2006-04, there is no standard-blessed way of getting a\n// mutable reference to a string's internal buffer. However, issue 530\n// (http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#530)\n// proposes this as the method. According to Matt Austern, this should\n// already work on all current implementations.\ninline char* string_as_array(string* str) {\n  // DO NOT USE const_cast<char*>(str->data())! See the unittest for why.\n  return str->empty() ? NULL : &*str->begin();\n}\n\n// STLDeleteElements() deletes all the elements in an STL container and clears\n// the container.  This function is suitable for use with a vector, set,\n// hash_set, or any other STL container which defines sensible begin(), end(),\n// and clear() methods.\n//\n// If container is NULL, this function is a no-op.\n//\n// As an alternative to calling STLDeleteElements() directly, consider\n// ElementDeleter (defined below), which ensures that your container's elements\n// are deleted when the ElementDeleter goes out of scope.\ntemplate <class T>\nvoid STLDeleteElements(T *container) {\n  if (!container) return;\n  STLDeleteContainerPointers(container->begin(), container->end());\n  container->clear();\n}\n\n// Given an STL container consisting of (key, value) pairs, STLDeleteValues\n// deletes all the \"value\" components and clears the container.  Does nothing\n// in the case it's given a NULL pointer.\n\ntemplate <class T>\nvoid STLDeleteValues(T *v) {\n  if (!v) return;\n  for (typename T::iterator i = v->begin(); i != v->end(); ++i) {\n    delete i->second;\n  }\n  v->clear();\n}\n\n}  // namespace protobuf\n}  // namespace google\n\n#endif  // GOOGLE_PROTOBUF_STUBS_STL_UTIL_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid.cc",
    "content": "// Copyright 2005-2008 Google Inc. All Rights Reserved.\n// Author: jrm@google.com (Jim Meehan)\n\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\n\n// These four-byte entries compactly encode how many bytes 0..255 to delete\n// in making a string replacement, how many bytes to add 0..255, and the offset\n// 0..64k-1 of the replacement string in remap_string.\nstruct RemapEntry {\n  uint8 delete_bytes;\n  uint8 add_bytes;\n  uint16 bytes_offset;\n};\n\n// Exit type codes for state tables. All but the first get stuffed into\n// signed one-byte entries. The first is only generated by executable code.\n// To distinguish from next-state entries, these must be contiguous and\n// all <= kExitNone\ntypedef enum {\n  kExitDstSpaceFull = 239,\n  kExitIllegalStructure,  // 240\n  kExitOK,                // 241\n  kExitReject,            // ...\n  kExitReplace1,\n  kExitReplace2,\n  kExitReplace3,\n  kExitReplace21,\n  kExitReplace31,\n  kExitReplace32,\n  kExitReplaceOffset1,\n  kExitReplaceOffset2,\n  kExitReplace1S0,\n  kExitSpecial,\n  kExitDoAgain,\n  kExitRejectAlt,\n  kExitNone               // 255\n} ExitReason;\n\n\n// This struct represents one entire state table. The three initialized byte\n// areas are state_table, remap_base, and remap_string. state0 and state0_size\n// give the byte offset and length within state_table of the initial state --\n// table lookups are expected to start and end in this state, but for\n// truncated UTF-8 strings, may end in a different state. These allow a quick\n// test for that condition. entry_shift is 8 for tables subscripted by a full\n// byte value and 6 for space-optimized tables subscripted by only six\n// significant bits in UTF-8 continuation bytes.\ntypedef struct {\n  const uint32 state0;\n  const uint32 state0_size;\n  const uint32 total_size;\n  const int max_expand;\n  const int entry_shift;\n  const int bytes_per_entry;\n  const uint32 losub;\n  const uint32 hiadd;\n  const uint8* state_table;\n  const RemapEntry* remap_base;\n  const uint8* remap_string;\n  const uint8* fast_state;\n} UTF8StateMachineObj;\n\ntypedef UTF8StateMachineObj UTF8ScanObj;\n\n#define X__ (kExitIllegalStructure)\n#define RJ_ (kExitReject)\n#define S1_ (kExitReplace1)\n#define S2_ (kExitReplace2)\n#define S3_ (kExitReplace3)\n#define S21 (kExitReplace21)\n#define S31 (kExitReplace31)\n#define S32 (kExitReplace32)\n#define T1_ (kExitReplaceOffset1)\n#define T2_ (kExitReplaceOffset2)\n#define S11 (kExitReplace1S0)\n#define SP_ (kExitSpecial)\n#define D__ (kExitDoAgain)\n#define RJA (kExitRejectAlt)\n\n//  Entire table has 9 state blocks of 256 entries each\nstatic const unsigned int utf8acceptnonsurrogates_STATE0 = 0;     // state[0]\nstatic const unsigned int utf8acceptnonsurrogates_STATE0_SIZE = 256;  // =[1]\nstatic const unsigned int utf8acceptnonsurrogates_TOTAL_SIZE = 2304;\nstatic const unsigned int utf8acceptnonsurrogates_MAX_EXPAND_X4 = 0;\nstatic const unsigned int utf8acceptnonsurrogates_SHIFT = 8;\nstatic const unsigned int utf8acceptnonsurrogates_BYTES = 1;\nstatic const unsigned int utf8acceptnonsurrogates_LOSUB = 0x20202020;\nstatic const unsigned int utf8acceptnonsurrogates_HIADD = 0x00000000;\n\nstatic const uint8 utf8acceptnonsurrogates[] = {\n// state[0] 0x000000 Byte 1\n  0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,\n  0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,\n  0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,\n  0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,\n\n  0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,\n  0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,\n  0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,\n  0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\nX__, X__,   1,   1,   1,   1,   1,   1,    1,   1,   1,   1,   1,   1,   1,   1,\n  1,   1,   1,   1,   1,   1,   1,   1,    1,   1,   1,   1,   1,   1,   1,   1,\n  2,   3,   3,   3,   3,   3,   3,   3,    3,   3,   3,   3,   3,   7,   3,   3,\n  4,   5,   5,   5,   6, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\n// state[1] 0x000080 Byte 2 of 2\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\n  0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,\n  0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,\n  0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,\n  0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\n// state[2] 0x000000 Byte 2 of 3\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n  1,   1,   1,   1,   1,   1,   1,   1,    1,   1,   1,   1,   1,   1,   1,   1,\n  1,   1,   1,   1,   1,   1,   1,   1,    1,   1,   1,   1,   1,   1,   1,   1,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\n// state[3] 0x001000 Byte 2 of 3\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\n  1,   1,   1,   1,   1,   1,   1,   1,    1,   1,   1,   1,   1,   1,   1,   1,\n  1,   1,   1,   1,   1,   1,   1,   1,    1,   1,   1,   1,   1,   1,   1,   1,\n  1,   1,   1,   1,   1,   1,   1,   1,    1,   1,   1,   1,   1,   1,   1,   1,\n  1,   1,   1,   1,   1,   1,   1,   1,    1,   1,   1,   1,   1,   1,   1,   1,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\n// state[4] 0x000000 Byte 2 of 4\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n  3,   3,   3,   3,   3,   3,   3,   3,    3,   3,   3,   3,   3,   3,   3,   3,\n  3,   3,   3,   3,   3,   3,   3,   3,    3,   3,   3,   3,   3,   3,   3,   3,\n  3,   3,   3,   3,   3,   3,   3,   3,    3,   3,   3,   3,   3,   3,   3,   3,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\n// state[5] 0x040000 Byte 2 of 4\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\n  3,   3,   3,   3,   3,   3,   3,   3,    3,   3,   3,   3,   3,   3,   3,   3,\n  3,   3,   3,   3,   3,   3,   3,   3,    3,   3,   3,   3,   3,   3,   3,   3,\n  3,   3,   3,   3,   3,   3,   3,   3,    3,   3,   3,   3,   3,   3,   3,   3,\n  3,   3,   3,   3,   3,   3,   3,   3,    3,   3,   3,   3,   3,   3,   3,   3,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\n// state[6] 0x100000 Byte 2 of 4\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\n  3,   3,   3,   3,   3,   3,   3,   3,    3,   3,   3,   3,   3,   3,   3,   3,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\n// state[7] 0x00d000 Byte 2 of 3\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\n  1,   1,   1,   1,   1,   1,   1,   1,    1,   1,   1,   1,   1,   1,   1,   1,\n  1,   1,   1,   1,   1,   1,   1,   1,    1,   1,   1,   1,   1,   1,   1,   1,\n  8,   8,   8,   8,   8,   8,   8,   8,    8,   8,   8,   8,   8,   8,   8,   8,\n  8,   8,   8,   8,   8,   8,   8,   8,    8,   8,   8,   8,   8,   8,   8,   8,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\n// state[8] 0x00d800 Byte 3 of 3\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n\nRJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_,  RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_,\nRJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_,  RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_,\nRJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_,  RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_,\nRJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_,  RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_,\n\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\nX__, X__, X__, X__, X__, X__, X__, X__,  X__, X__, X__, X__, X__, X__, X__, X__,\n};\n\n// Remap base[0] = (del, add, string_offset)\nstatic const RemapEntry utf8acceptnonsurrogates_remap_base[] = {\n{0, 0, 0} };\n\n// Remap string[0]\nstatic const unsigned char utf8acceptnonsurrogates_remap_string[] = {\n0 };\n\nstatic const unsigned char utf8acceptnonsurrogates_fast[256] = {\n0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,\n0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,\n0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,\n0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,\n\n0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,\n0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,\n0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,\n0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,\n\n1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1,\n1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1,\n1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1,\n1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1,\n\n1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1,\n1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1,\n1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1,\n1, 1, 1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1, 1, 1,\n};\n\nstatic const UTF8ScanObj utf8acceptnonsurrogates_obj = {\n  utf8acceptnonsurrogates_STATE0,\n  utf8acceptnonsurrogates_STATE0_SIZE,\n  utf8acceptnonsurrogates_TOTAL_SIZE,\n  utf8acceptnonsurrogates_MAX_EXPAND_X4,\n  utf8acceptnonsurrogates_SHIFT,\n  utf8acceptnonsurrogates_BYTES,\n  utf8acceptnonsurrogates_LOSUB,\n  utf8acceptnonsurrogates_HIADD,\n  utf8acceptnonsurrogates,\n  utf8acceptnonsurrogates_remap_base,\n  utf8acceptnonsurrogates_remap_string,\n  utf8acceptnonsurrogates_fast\n};\n\n\n#undef X__\n#undef RJ_\n#undef S1_\n#undef S2_\n#undef S3_\n#undef S21\n#undef S31\n#undef S32\n#undef T1_\n#undef T2_\n#undef S11\n#undef SP_\n#undef D__\n#undef RJA\n\n// Return true if current Tbl pointer is within state0 range\n// Note that unsigned compare checks both ends of range simultaneously\nstatic inline bool InStateZero(const UTF8ScanObj* st, const uint8* Tbl) {\n  const uint8* Tbl0 = &st->state_table[st->state0];\n  return (static_cast<uint32>(Tbl - Tbl0) < st->state0_size);\n}\n\n// Scan a UTF-8 string based on state table.\n// Always scan complete UTF-8 characters\n// Set number of bytes scanned. Return reason for exiting\nint UTF8GenericScan(const UTF8ScanObj* st,\n                    const char * str,\n                    int str_length,\n                    int* bytes_consumed) {\n  *bytes_consumed = 0;\n  if (str_length == 0) return kExitOK;\n\n  int eshift = st->entry_shift;\n  const uint8* isrc = reinterpret_cast<const uint8*>(str);\n  const uint8* src = isrc;\n  const uint8* srclimit = isrc + str_length;\n  const uint8* srclimit8 = srclimit - 7;\n  const uint8* Tbl_0 = &st->state_table[st->state0];\n\n DoAgain:\n  // Do state-table scan\n  int e = 0;\n  uint8 c;\n  const uint8* Tbl2 = &st->fast_state[0];\n  const uint32 losub = st->losub;\n  const uint32 hiadd = st->hiadd;\n  // Check initial few bytes one at a time until 8-byte aligned\n  //----------------------------\n  while ((((uintptr_t)src & 0x07) != 0) &&\n         (src < srclimit) &&\n         Tbl2[src[0]] == 0) {\n    src++;\n  }\n  if (((uintptr_t)src & 0x07) == 0) {\n    // Do fast for groups of 8 identity bytes.\n    // This covers a lot of 7-bit ASCII ~8x faster then the 1-byte loop,\n    // including slowing slightly on cr/lf/ht\n    //----------------------------\n    while (src < srclimit8) {\n      uint32 s0123 = (reinterpret_cast<const uint32 *>(src))[0];\n      uint32 s4567 = (reinterpret_cast<const uint32 *>(src))[1];\n      src += 8;\n      // This is a fast range check for all bytes in [lowsub..0x80-hiadd)\n      uint32 temp = (s0123 - losub) | (s0123 + hiadd) |\n                    (s4567 - losub) | (s4567 + hiadd);\n      if ((temp & 0x80808080) != 0) {\n        // We typically end up here on cr/lf/ht; src was incremented\n        int e0123 = (Tbl2[src[-8]] | Tbl2[src[-7]]) |\n                    (Tbl2[src[-6]] | Tbl2[src[-5]]);\n        if (e0123 != 0) {\n          src -= 8;\n          break;\n        }    // Exit on Non-interchange\n        e0123 = (Tbl2[src[-4]] | Tbl2[src[-3]]) |\n                (Tbl2[src[-2]] | Tbl2[src[-1]]);\n        if (e0123 != 0) {\n          src -= 4;\n          break;\n        }    // Exit on Non-interchange\n        // Else OK, go around again\n      }\n    }\n  }\n  //----------------------------\n\n  // Byte-at-a-time scan\n  //----------------------------\n  const uint8* Tbl = Tbl_0;\n  while (src < srclimit) {\n    c = *src;\n    e = Tbl[c];\n    src++;\n    if (e >= kExitIllegalStructure) {break;}\n    Tbl = &Tbl_0[e << eshift];\n  }\n  //----------------------------\n\n\n  // Exit posibilities:\n  //  Some exit code, !state0, back up over last char\n  //  Some exit code, state0, back up one byte exactly\n  //  source consumed, !state0, back up over partial char\n  //  source consumed, state0, exit OK\n  // For illegal byte in state0, avoid backup up over PREVIOUS char\n  // For truncated last char, back up to beginning of it\n\n  if (e >= kExitIllegalStructure) {\n    // Back up over exactly one byte of rejected/illegal UTF-8 character\n    src--;\n    // Back up more if needed\n    if (!InStateZero(st, Tbl)) {\n      do {\n        src--;\n      } while ((src > isrc) && ((src[0] & 0xc0) == 0x80));\n    }\n  } else if (!InStateZero(st, Tbl)) {\n    // Back up over truncated UTF-8 character\n    e = kExitIllegalStructure;\n    do {\n      src--;\n    } while ((src > isrc) && ((src[0] & 0xc0) == 0x80));\n  } else {\n    // Normal termination, source fully consumed\n    e = kExitOK;\n  }\n\n  if (e == kExitDoAgain) {\n    // Loop back up to the fast scan\n    goto DoAgain;\n  }\n\n  *bytes_consumed = src - isrc;\n  return e;\n}\n\nint UTF8GenericScanFastAscii(const UTF8ScanObj* st,\n                    const char * str,\n                    int str_length,\n                    int* bytes_consumed) {\n  *bytes_consumed = 0;\n  if (str_length == 0) return kExitOK;\n\n  const uint8* isrc =  reinterpret_cast<const uint8*>(str);\n  const uint8* src = isrc;\n  const uint8* srclimit = isrc + str_length;\n  const uint8* srclimit8 = srclimit - 7;\n  int n;\n  int rest_consumed;\n  int exit_reason;\n  do {\n    // Check initial few bytes one at a time until 8-byte aligned\n    while ((((uintptr_t)src & 0x07) != 0) &&\n           (src < srclimit) && (src[0] < 0x80)) {\n      src++;\n    }\n    if (((uintptr_t)src & 0x07) == 0) {\n      while ((src < srclimit8) &&\n             (((reinterpret_cast<const uint32*>(src)[0] |\n                reinterpret_cast<const uint32*>(src)[1]) & 0x80808080) == 0)) {\n        src += 8;\n      }\n    }\n    while ((src < srclimit) && (src[0] < 0x80)) {\n      src++;\n    }\n    // Run state table on the rest\n    n = src - isrc;\n    exit_reason = UTF8GenericScan(st, str + n, str_length - n, &rest_consumed);\n    src += rest_consumed;\n  } while ( exit_reason == kExitDoAgain );\n\n  *bytes_consumed = src - isrc;\n  return exit_reason;\n}\n\n// Hack:  On some compilers the static tables are initialized at startup.\n//   We can't use them until they are initialized.  However, some Protocol\n//   Buffer parsing happens at static init time and may try to validate\n//   UTF-8 strings.  Since UTF-8 validation is only used for debugging\n//   anyway, we simply always return success if initialization hasn't\n//   occurred yet.\nnamespace {\n\nbool module_initialized_ = false;\n\nstruct InitDetector {\n  InitDetector() {\n    module_initialized_ = true;\n  }\n};\nInitDetector init_detector;\n\n}  // namespace\n\nbool IsStructurallyValidUTF8(const char* buf, int len) {\n  if (!module_initialized_) return true;\n  \n  int bytes_consumed = 0;\n  UTF8GenericScanFastAscii(&utf8acceptnonsurrogates_obj,\n                           buf, len, &bytes_consumed);\n  return (bytes_consumed == len);\n}\n\n}  // namespace internal\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc",
    "content": "// Copyright 2008 Google Inc. All Rights Reserved.\n// Author: xpeng@google.com (Peter Peng)\n\n#include <google/protobuf/stubs/common.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\nnamespace {\n\nTEST(StructurallyValidTest, ValidUTF8String) {\n  // On GCC, this string can be written as:\n  //   \"abcd 1234 - \\u2014\\u2013\\u2212\"\n  // MSVC seems to interpret \\u differently.\n  string valid_str(\"abcd 1234 - \\342\\200\\224\\342\\200\\223\\342\\210\\222 - xyz789\");\n  EXPECT_TRUE(IsStructurallyValidUTF8(valid_str.data(),\n                                      valid_str.size()));\n  // Additional check for pointer alignment\n  for (int i = 1; i < 8; ++i) {\n    EXPECT_TRUE(IsStructurallyValidUTF8(valid_str.data() + i,\n                                        valid_str.size() - i));\n  }\n}\n\nTEST(StructurallyValidTest, InvalidUTF8String) {\n  const string invalid_str(\"abcd\\xA0\\xB0\\xA0\\xB0\\xA0\\xB0 - xyz789\");\n  EXPECT_FALSE(IsStructurallyValidUTF8(invalid_str.data(),\n                                       invalid_str.size()));\n  // Additional check for pointer alignment\n  for (int i = 1; i < 8; ++i) {\n    EXPECT_FALSE(IsStructurallyValidUTF8(invalid_str.data() + i,\n                                         invalid_str.size() - i));\n  }\n}\n\n}  // namespace\n}  // namespace internal\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// from google3/strings/strutil.cc\n\n#include <google/protobuf/stubs/strutil.h>\n#include <errno.h>\n#include <float.h>    // FLT_DIG and DBL_DIG\n#include <limits>\n#include <limits.h>\n#include <stdio.h>\n#include <iterator>\n\n#ifdef _WIN32\n// MSVC has only _snprintf, not snprintf.\n//\n// MinGW has both snprintf and _snprintf, but they appear to be different\n// functions.  The former is buggy.  When invoked like so:\n//   char buffer[32];\n//   snprintf(buffer, 32, \"%.*g\\n\", FLT_DIG, 1.23e10f);\n// it prints \"1.23000e+10\".  This is plainly wrong:  %g should never print\n// trailing zeros after the decimal point.  For some reason this bug only\n// occurs with some input values, not all.  In any case, _snprintf does the\n// right thing, so we use it.\n#define snprintf _snprintf\n#endif\n\nnamespace google {\nnamespace protobuf {\n\ninline bool IsNaN(double value) {\n  // NaN is never equal to anything, even itself.\n  return value != value;\n}\n\n// These are defined as macros on some platforms.  #undef them so that we can\n// redefine them.\n#undef isxdigit\n#undef isprint\n\n// The definitions of these in ctype.h change based on locale.  Since our\n// string manipulation is all in relation to the protocol buffer and C++\n// languages, we always want to use the C locale.  So, we re-define these\n// exactly as we want them.\ninline bool isxdigit(char c) {\n  return ('0' <= c && c <= '9') ||\n         ('a' <= c && c <= 'f') ||\n         ('A' <= c && c <= 'F');\n}\n\ninline bool isprint(char c) {\n  return c >= 0x20 && c <= 0x7E;\n}\n\n// ----------------------------------------------------------------------\n// StripString\n//    Replaces any occurrence of the character 'remove' (or the characters\n//    in 'remove') with the character 'replacewith'.\n// ----------------------------------------------------------------------\nvoid StripString(string* s, const char* remove, char replacewith) {\n  const char * str_start = s->c_str();\n  const char * str = str_start;\n  for (str = strpbrk(str, remove);\n       str != NULL;\n       str = strpbrk(str + 1, remove)) {\n    (*s)[str - str_start] = replacewith;\n  }\n}\n\n// ----------------------------------------------------------------------\n// StringReplace()\n//    Replace the \"old\" pattern with the \"new\" pattern in a string,\n//    and append the result to \"res\".  If replace_all is false,\n//    it only replaces the first instance of \"old.\"\n// ----------------------------------------------------------------------\n\nvoid StringReplace(const string& s, const string& oldsub,\n                   const string& newsub, bool replace_all,\n                   string* res) {\n  if (oldsub.empty()) {\n    res->append(s);  // if empty, append the given string.\n    return;\n  }\n\n  string::size_type start_pos = 0;\n  string::size_type pos;\n  do {\n    pos = s.find(oldsub, start_pos);\n    if (pos == string::npos) {\n      break;\n    }\n    res->append(s, start_pos, pos - start_pos);\n    res->append(newsub);\n    start_pos = pos + oldsub.size();  // start searching again after the \"old\"\n  } while (replace_all);\n  res->append(s, start_pos, s.length() - start_pos);\n}\n\n// ----------------------------------------------------------------------\n// StringReplace()\n//    Give me a string and two patterns \"old\" and \"new\", and I replace\n//    the first instance of \"old\" in the string with \"new\", if it\n//    exists.  If \"global\" is true; call this repeatedly until it\n//    fails.  RETURN a new string, regardless of whether the replacement\n//    happened or not.\n// ----------------------------------------------------------------------\n\nstring StringReplace(const string& s, const string& oldsub,\n                     const string& newsub, bool replace_all) {\n  string ret;\n  StringReplace(s, oldsub, newsub, replace_all, &ret);\n  return ret;\n}\n\n// ----------------------------------------------------------------------\n// SplitStringUsing()\n//    Split a string using a character delimiter. Append the components\n//    to 'result'.\n//\n// Note: For multi-character delimiters, this routine will split on *ANY* of\n// the characters in the string, not the entire string as a single delimiter.\n// ----------------------------------------------------------------------\ntemplate <typename ITR>\nstatic inline\nvoid SplitStringToIteratorUsing(const string& full,\n                                const char* delim,\n                                ITR& result) {\n  // Optimize the common case where delim is a single character.\n  if (delim[0] != '\\0' && delim[1] == '\\0') {\n    char c = delim[0];\n    const char* p = full.data();\n    const char* end = p + full.size();\n    while (p != end) {\n      if (*p == c) {\n        ++p;\n      } else {\n        const char* start = p;\n        while (++p != end && *p != c);\n        *result++ = string(start, p - start);\n      }\n    }\n    return;\n  }\n\n  string::size_type begin_index, end_index;\n  begin_index = full.find_first_not_of(delim);\n  while (begin_index != string::npos) {\n    end_index = full.find_first_of(delim, begin_index);\n    if (end_index == string::npos) {\n      *result++ = full.substr(begin_index);\n      return;\n    }\n    *result++ = full.substr(begin_index, (end_index - begin_index));\n    begin_index = full.find_first_not_of(delim, end_index);\n  }\n}\n\nvoid SplitStringUsing(const string& full,\n                      const char* delim,\n                      vector<string>* result) {\n  back_insert_iterator< vector<string> > it(*result);\n  SplitStringToIteratorUsing(full, delim, it);\n}\n\n// ----------------------------------------------------------------------\n// JoinStrings()\n//    This merges a vector of string components with delim inserted\n//    as separaters between components.\n//\n// ----------------------------------------------------------------------\ntemplate <class ITERATOR>\nstatic void JoinStringsIterator(const ITERATOR& start,\n                                const ITERATOR& end,\n                                const char* delim,\n                                string* result) {\n  GOOGLE_CHECK(result != NULL);\n  result->clear();\n  int delim_length = strlen(delim);\n\n  // Precompute resulting length so we can reserve() memory in one shot.\n  int length = 0;\n  for (ITERATOR iter = start; iter != end; ++iter) {\n    if (iter != start) {\n      length += delim_length;\n    }\n    length += iter->size();\n  }\n  result->reserve(length);\n\n  // Now combine everything.\n  for (ITERATOR iter = start; iter != end; ++iter) {\n    if (iter != start) {\n      result->append(delim, delim_length);\n    }\n    result->append(iter->data(), iter->size());\n  }\n}\n\nvoid JoinStrings(const vector<string>& components,\n                 const char* delim,\n                 string * result) {\n  JoinStringsIterator(components.begin(), components.end(), delim, result);\n}\n\n// ----------------------------------------------------------------------\n// UnescapeCEscapeSequences()\n//    This does all the unescaping that C does: \\ooo, \\r, \\n, etc\n//    Returns length of resulting string.\n//    The implementation of \\x parses any positive number of hex digits,\n//    but it is an error if the value requires more than 8 bits, and the\n//    result is truncated to 8 bits.\n//\n//    The second call stores its errors in a supplied string vector.\n//    If the string vector pointer is NULL, it reports the errors with LOG().\n// ----------------------------------------------------------------------\n\n#define IS_OCTAL_DIGIT(c) (((c) >= '0') && ((c) <= '7'))\n\ninline int hex_digit_to_int(char c) {\n  /* Assume ASCII. */\n  assert('0' == 0x30 && 'A' == 0x41 && 'a' == 0x61);\n  assert(isxdigit(c));\n  int x = static_cast<unsigned char>(c);\n  if (x > '9') {\n    x += 9;\n  }\n  return x & 0xf;\n}\n\n// Protocol buffers doesn't ever care about errors, but I don't want to remove\n// the code.\n#define LOG_STRING(LEVEL, VECTOR) GOOGLE_LOG_IF(LEVEL, false)\n\nint UnescapeCEscapeSequences(const char* source, char* dest) {\n  return UnescapeCEscapeSequences(source, dest, NULL);\n}\n\nint UnescapeCEscapeSequences(const char* source, char* dest,\n                             vector<string> *errors) {\n  GOOGLE_DCHECK(errors == NULL) << \"Error reporting not implemented.\";\n\n  char* d = dest;\n  const char* p = source;\n\n  // Small optimization for case where source = dest and there's no escaping\n  while ( p == d && *p != '\\0' && *p != '\\\\' )\n    p++, d++;\n\n  while (*p != '\\0') {\n    if (*p != '\\\\') {\n      *d++ = *p++;\n    } else {\n      switch ( *++p ) {                    // skip past the '\\\\'\n        case '\\0':\n          LOG_STRING(ERROR, errors) << \"String cannot end with \\\\\";\n          *d = '\\0';\n          return d - dest;   // we're done with p\n        case 'a':  *d++ = '\\a';  break;\n        case 'b':  *d++ = '\\b';  break;\n        case 'f':  *d++ = '\\f';  break;\n        case 'n':  *d++ = '\\n';  break;\n        case 'r':  *d++ = '\\r';  break;\n        case 't':  *d++ = '\\t';  break;\n        case 'v':  *d++ = '\\v';  break;\n        case '\\\\': *d++ = '\\\\';  break;\n        case '?':  *d++ = '\\?';  break;    // \\?  Who knew?\n        case '\\'': *d++ = '\\'';  break;\n        case '\"':  *d++ = '\\\"';  break;\n        case '0': case '1': case '2': case '3':  // octal digit: 1 to 3 digits\n        case '4': case '5': case '6': case '7': {\n          char ch = *p - '0';\n          if ( IS_OCTAL_DIGIT(p[1]) )\n            ch = ch * 8 + *++p - '0';\n          if ( IS_OCTAL_DIGIT(p[1]) )      // safe (and easy) to do this twice\n            ch = ch * 8 + *++p - '0';      // now points at last digit\n          *d++ = ch;\n          break;\n        }\n        case 'x': case 'X': {\n          if (!isxdigit(p[1])) {\n            if (p[1] == '\\0') {\n              LOG_STRING(ERROR, errors) << \"String cannot end with \\\\x\";\n            } else {\n              LOG_STRING(ERROR, errors) <<\n                \"\\\\x cannot be followed by non-hex digit: \\\\\" << *p << p[1];\n            }\n            break;\n          }\n          unsigned int ch = 0;\n          const char *hex_start = p;\n          while (isxdigit(p[1]))  // arbitrarily many hex digits\n            ch = (ch << 4) + hex_digit_to_int(*++p);\n          if (ch > 0xFF)\n            LOG_STRING(ERROR, errors) << \"Value of \" <<\n              \"\\\\\" << string(hex_start, p+1-hex_start) << \" exceeds 8 bits\";\n          *d++ = ch;\n          break;\n        }\n#if 0  // TODO(kenton):  Support \\u and \\U?  Requires runetochar().\n        case 'u': {\n          // \\uhhhh => convert 4 hex digits to UTF-8\n          char32 rune = 0;\n          const char *hex_start = p;\n          for (int i = 0; i < 4; ++i) {\n            if (isxdigit(p[1])) {  // Look one char ahead.\n              rune = (rune << 4) + hex_digit_to_int(*++p);  // Advance p.\n            } else {\n              LOG_STRING(ERROR, errors)\n                << \"\\\\u must be followed by 4 hex digits: \\\\\"\n                <<  string(hex_start, p+1-hex_start);\n              break;\n            }\n          }\n          d += runetochar(d, &rune);\n          break;\n        }\n        case 'U': {\n          // \\Uhhhhhhhh => convert 8 hex digits to UTF-8\n          char32 rune = 0;\n          const char *hex_start = p;\n          for (int i = 0; i < 8; ++i) {\n            if (isxdigit(p[1])) {  // Look one char ahead.\n              // Don't change rune until we're sure this\n              // is within the Unicode limit, but do advance p.\n              char32 newrune = (rune << 4) + hex_digit_to_int(*++p);\n              if (newrune > 0x10FFFF) {\n                LOG_STRING(ERROR, errors)\n                  << \"Value of \\\\\"\n                  << string(hex_start, p + 1 - hex_start)\n                  << \" exceeds Unicode limit (0x10FFFF)\";\n                break;\n              } else {\n                rune = newrune;\n              }\n            } else {\n              LOG_STRING(ERROR, errors)\n                << \"\\\\U must be followed by 8 hex digits: \\\\\"\n                <<  string(hex_start, p+1-hex_start);\n              break;\n            }\n          }\n          d += runetochar(d, &rune);\n          break;\n        }\n#endif\n        default:\n          LOG_STRING(ERROR, errors) << \"Unknown escape sequence: \\\\\" << *p;\n      }\n      p++;                                 // read past letter we escaped\n    }\n  }\n  *d = '\\0';\n  return d - dest;\n}\n\n// ----------------------------------------------------------------------\n// UnescapeCEscapeString()\n//    This does the same thing as UnescapeCEscapeSequences, but creates\n//    a new string. The caller does not need to worry about allocating\n//    a dest buffer. This should be used for non performance critical\n//    tasks such as printing debug messages. It is safe for src and dest\n//    to be the same.\n//\n//    The second call stores its errors in a supplied string vector.\n//    If the string vector pointer is NULL, it reports the errors with LOG().\n//\n//    In the first and second calls, the length of dest is returned. In the\n//    the third call, the new string is returned.\n// ----------------------------------------------------------------------\nint UnescapeCEscapeString(const string& src, string* dest) {\n  return UnescapeCEscapeString(src, dest, NULL);\n}\n\nint UnescapeCEscapeString(const string& src, string* dest,\n                          vector<string> *errors) {\n  scoped_array<char> unescaped(new char[src.size() + 1]);\n  int len = UnescapeCEscapeSequences(src.c_str(), unescaped.get(), errors);\n  GOOGLE_CHECK(dest);\n  dest->assign(unescaped.get(), len);\n  return len;\n}\n\nstring UnescapeCEscapeString(const string& src) {\n  scoped_array<char> unescaped(new char[src.size() + 1]);\n  int len = UnescapeCEscapeSequences(src.c_str(), unescaped.get(), NULL);\n  return string(unescaped.get(), len);\n}\n\n// ----------------------------------------------------------------------\n// CEscapeString()\n// CHexEscapeString()\n//    Copies 'src' to 'dest', escaping dangerous characters using\n//    C-style escape sequences. This is very useful for preparing query\n//    flags. 'src' and 'dest' should not overlap. The 'Hex' version uses\n//    hexadecimal rather than octal sequences.\n//    Returns the number of bytes written to 'dest' (not including the \\0)\n//    or -1 if there was insufficient space.\n//\n//    Currently only \\n, \\r, \\t, \", ', \\ and !isprint() chars are escaped.\n// ----------------------------------------------------------------------\nint CEscapeInternal(const char* src, int src_len, char* dest,\n                    int dest_len, bool use_hex, bool utf8_safe) {\n  const char* src_end = src + src_len;\n  int used = 0;\n  bool last_hex_escape = false; // true if last output char was \\xNN\n\n  for (; src < src_end; src++) {\n    if (dest_len - used < 2)   // Need space for two letter escape\n      return -1;\n\n    bool is_hex_escape = false;\n    switch (*src) {\n      case '\\n': dest[used++] = '\\\\'; dest[used++] = 'n';  break;\n      case '\\r': dest[used++] = '\\\\'; dest[used++] = 'r';  break;\n      case '\\t': dest[used++] = '\\\\'; dest[used++] = 't';  break;\n      case '\\\"': dest[used++] = '\\\\'; dest[used++] = '\\\"'; break;\n      case '\\'': dest[used++] = '\\\\'; dest[used++] = '\\''; break;\n      case '\\\\': dest[used++] = '\\\\'; dest[used++] = '\\\\'; break;\n      default:\n        // Note that if we emit \\xNN and the src character after that is a hex\n        // digit then that digit must be escaped too to prevent it being\n        // interpreted as part of the character code by C.\n        if ((!utf8_safe || static_cast<uint8>(*src) < 0x80) &&\n            (!isprint(*src) ||\n             (last_hex_escape && isxdigit(*src)))) {\n          if (dest_len - used < 4) // need space for 4 letter escape\n            return -1;\n          sprintf(dest + used, (use_hex ? \"\\\\x%02x\" : \"\\\\%03o\"),\n                  static_cast<uint8>(*src));\n          is_hex_escape = use_hex;\n          used += 4;\n        } else {\n          dest[used++] = *src; break;\n        }\n    }\n    last_hex_escape = is_hex_escape;\n  }\n\n  if (dest_len - used < 1)   // make sure that there is room for \\0\n    return -1;\n\n  dest[used] = '\\0';   // doesn't count towards return value though\n  return used;\n}\n\nint CEscapeString(const char* src, int src_len, char* dest, int dest_len) {\n  return CEscapeInternal(src, src_len, dest, dest_len, false, false);\n}\n\n// ----------------------------------------------------------------------\n// CEscape()\n// CHexEscape()\n//    Copies 'src' to result, escaping dangerous characters using\n//    C-style escape sequences. This is very useful for preparing query\n//    flags. 'src' and 'dest' should not overlap. The 'Hex' version\n//    hexadecimal rather than octal sequences.\n//\n//    Currently only \\n, \\r, \\t, \", ', \\ and !isprint() chars are escaped.\n// ----------------------------------------------------------------------\nstring CEscape(const string& src) {\n  const int dest_length = src.size() * 4 + 1; // Maximum possible expansion\n  scoped_array<char> dest(new char[dest_length]);\n  const int len = CEscapeInternal(src.data(), src.size(),\n                                  dest.get(), dest_length, false, false);\n  GOOGLE_DCHECK_GE(len, 0);\n  return string(dest.get(), len);\n}\n\nnamespace strings {\n\nstring Utf8SafeCEscape(const string& src) {\n  const int dest_length = src.size() * 4 + 1; // Maximum possible expansion\n  scoped_array<char> dest(new char[dest_length]);\n  const int len = CEscapeInternal(src.data(), src.size(),\n                                  dest.get(), dest_length, false, true);\n  GOOGLE_DCHECK_GE(len, 0);\n  return string(dest.get(), len);\n}\n\nstring CHexEscape(const string& src) {\n  const int dest_length = src.size() * 4 + 1; // Maximum possible expansion\n  scoped_array<char> dest(new char[dest_length]);\n  const int len = CEscapeInternal(src.data(), src.size(),\n                                  dest.get(), dest_length, true, false);\n  GOOGLE_DCHECK_GE(len, 0);\n  return string(dest.get(), len);\n}\n\n}  // namespace strings\n\n// ----------------------------------------------------------------------\n// strto32_adaptor()\n// strtou32_adaptor()\n//    Implementation of strto[u]l replacements that have identical\n//    overflow and underflow characteristics for both ILP-32 and LP-64\n//    platforms, including errno preservation in error-free calls.\n// ----------------------------------------------------------------------\n\nint32 strto32_adaptor(const char *nptr, char **endptr, int base) {\n  const int saved_errno = errno;\n  errno = 0;\n  const long result = strtol(nptr, endptr, base);\n  if (errno == ERANGE && result == LONG_MIN) {\n    return kint32min;\n  } else if (errno == ERANGE && result == LONG_MAX) {\n    return kint32max;\n  } else if (errno == 0 && result < kint32min) {\n    errno = ERANGE;\n    return kint32min;\n  } else if (errno == 0 && result > kint32max) {\n    errno = ERANGE;\n    return kint32max;\n  }\n  if (errno == 0)\n    errno = saved_errno;\n  return static_cast<int32>(result);\n}\n\nuint32 strtou32_adaptor(const char *nptr, char **endptr, int base) {\n  const int saved_errno = errno;\n  errno = 0;\n  const unsigned long result = strtoul(nptr, endptr, base);\n  if (errno == ERANGE && result == ULONG_MAX) {\n    return kuint32max;\n  } else if (errno == 0 && result > kuint32max) {\n    errno = ERANGE;\n    return kuint32max;\n  }\n  if (errno == 0)\n    errno = saved_errno;\n  return static_cast<uint32>(result);\n}\n\n// ----------------------------------------------------------------------\n// FastIntToBuffer()\n// FastInt64ToBuffer()\n// FastHexToBuffer()\n// FastHex64ToBuffer()\n// FastHex32ToBuffer()\n// ----------------------------------------------------------------------\n\n// Offset into buffer where FastInt64ToBuffer places the end of string\n// null character.  Also used by FastInt64ToBufferLeft.\nstatic const int kFastInt64ToBufferOffset = 21;\n\nchar *FastInt64ToBuffer(int64 i, char* buffer) {\n  // We could collapse the positive and negative sections, but that\n  // would be slightly slower for positive numbers...\n  // 22 bytes is enough to store -2**64, -18446744073709551616.\n  char* p = buffer + kFastInt64ToBufferOffset;\n  *p-- = '\\0';\n  if (i >= 0) {\n    do {\n      *p-- = '0' + i % 10;\n      i /= 10;\n    } while (i > 0);\n    return p + 1;\n  } else {\n    // On different platforms, % and / have different behaviors for\n    // negative numbers, so we need to jump through hoops to make sure\n    // we don't divide negative numbers.\n    if (i > -10) {\n      i = -i;\n      *p-- = '0' + i;\n      *p = '-';\n      return p;\n    } else {\n      // Make sure we aren't at MIN_INT, in which case we can't say i = -i\n      i = i + 10;\n      i = -i;\n      *p-- = '0' + i % 10;\n      // Undo what we did a moment ago\n      i = i / 10 + 1;\n      do {\n        *p-- = '0' + i % 10;\n        i /= 10;\n      } while (i > 0);\n      *p = '-';\n      return p;\n    }\n  }\n}\n\n// Offset into buffer where FastInt32ToBuffer places the end of string\n// null character.  Also used by FastInt32ToBufferLeft\nstatic const int kFastInt32ToBufferOffset = 11;\n\n// Yes, this is a duplicate of FastInt64ToBuffer.  But, we need this for the\n// compiler to generate 32 bit arithmetic instructions.  It's much faster, at\n// least with 32 bit binaries.\nchar *FastInt32ToBuffer(int32 i, char* buffer) {\n  // We could collapse the positive and negative sections, but that\n  // would be slightly slower for positive numbers...\n  // 12 bytes is enough to store -2**32, -4294967296.\n  char* p = buffer + kFastInt32ToBufferOffset;\n  *p-- = '\\0';\n  if (i >= 0) {\n    do {\n      *p-- = '0' + i % 10;\n      i /= 10;\n    } while (i > 0);\n    return p + 1;\n  } else {\n    // On different platforms, % and / have different behaviors for\n    // negative numbers, so we need to jump through hoops to make sure\n    // we don't divide negative numbers.\n    if (i > -10) {\n      i = -i;\n      *p-- = '0' + i;\n      *p = '-';\n      return p;\n    } else {\n      // Make sure we aren't at MIN_INT, in which case we can't say i = -i\n      i = i + 10;\n      i = -i;\n      *p-- = '0' + i % 10;\n      // Undo what we did a moment ago\n      i = i / 10 + 1;\n      do {\n        *p-- = '0' + i % 10;\n        i /= 10;\n      } while (i > 0);\n      *p = '-';\n      return p;\n    }\n  }\n}\n\nchar *FastHexToBuffer(int i, char* buffer) {\n  GOOGLE_CHECK(i >= 0) << \"FastHexToBuffer() wants non-negative integers, not \" << i;\n\n  static const char *hexdigits = \"0123456789abcdef\";\n  char *p = buffer + 21;\n  *p-- = '\\0';\n  do {\n    *p-- = hexdigits[i & 15];   // mod by 16\n    i >>= 4;                    // divide by 16\n  } while (i > 0);\n  return p + 1;\n}\n\nchar *InternalFastHexToBuffer(uint64 value, char* buffer, int num_byte) {\n  static const char *hexdigits = \"0123456789abcdef\";\n  buffer[num_byte] = '\\0';\n  for (int i = num_byte - 1; i >= 0; i--) {\n#ifdef _M_X64\n    // MSVC x64 platform has a bug optimizing the uint32(value) in the #else\n    // block. Given that the uint32 cast was to improve performance on 32-bit\n    // platforms, we use 64-bit '&' directly.\n    buffer[i] = hexdigits[value & 0xf];\n#else\n    buffer[i] = hexdigits[uint32(value) & 0xf];\n#endif\n    value >>= 4;\n  }\n  return buffer;\n}\n\nchar *FastHex64ToBuffer(uint64 value, char* buffer) {\n  return InternalFastHexToBuffer(value, buffer, 16);\n}\n\nchar *FastHex32ToBuffer(uint32 value, char* buffer) {\n  return InternalFastHexToBuffer(value, buffer, 8);\n}\n\nstatic inline char* PlaceNum(char* p, int num, char prev_sep) {\n   *p-- = '0' + num % 10;\n   *p-- = '0' + num / 10;\n   *p-- = prev_sep;\n   return p;\n}\n\n// ----------------------------------------------------------------------\n// FastInt32ToBufferLeft()\n// FastUInt32ToBufferLeft()\n// FastInt64ToBufferLeft()\n// FastUInt64ToBufferLeft()\n//\n// Like the Fast*ToBuffer() functions above, these are intended for speed.\n// Unlike the Fast*ToBuffer() functions, however, these functions write\n// their output to the beginning of the buffer (hence the name, as the\n// output is left-aligned).  The caller is responsible for ensuring that\n// the buffer has enough space to hold the output.\n//\n// Returns a pointer to the end of the string (i.e. the null character\n// terminating the string).\n// ----------------------------------------------------------------------\n\nstatic const char two_ASCII_digits[100][2] = {\n  {'0','0'}, {'0','1'}, {'0','2'}, {'0','3'}, {'0','4'},\n  {'0','5'}, {'0','6'}, {'0','7'}, {'0','8'}, {'0','9'},\n  {'1','0'}, {'1','1'}, {'1','2'}, {'1','3'}, {'1','4'},\n  {'1','5'}, {'1','6'}, {'1','7'}, {'1','8'}, {'1','9'},\n  {'2','0'}, {'2','1'}, {'2','2'}, {'2','3'}, {'2','4'},\n  {'2','5'}, {'2','6'}, {'2','7'}, {'2','8'}, {'2','9'},\n  {'3','0'}, {'3','1'}, {'3','2'}, {'3','3'}, {'3','4'},\n  {'3','5'}, {'3','6'}, {'3','7'}, {'3','8'}, {'3','9'},\n  {'4','0'}, {'4','1'}, {'4','2'}, {'4','3'}, {'4','4'},\n  {'4','5'}, {'4','6'}, {'4','7'}, {'4','8'}, {'4','9'},\n  {'5','0'}, {'5','1'}, {'5','2'}, {'5','3'}, {'5','4'},\n  {'5','5'}, {'5','6'}, {'5','7'}, {'5','8'}, {'5','9'},\n  {'6','0'}, {'6','1'}, {'6','2'}, {'6','3'}, {'6','4'},\n  {'6','5'}, {'6','6'}, {'6','7'}, {'6','8'}, {'6','9'},\n  {'7','0'}, {'7','1'}, {'7','2'}, {'7','3'}, {'7','4'},\n  {'7','5'}, {'7','6'}, {'7','7'}, {'7','8'}, {'7','9'},\n  {'8','0'}, {'8','1'}, {'8','2'}, {'8','3'}, {'8','4'},\n  {'8','5'}, {'8','6'}, {'8','7'}, {'8','8'}, {'8','9'},\n  {'9','0'}, {'9','1'}, {'9','2'}, {'9','3'}, {'9','4'},\n  {'9','5'}, {'9','6'}, {'9','7'}, {'9','8'}, {'9','9'}\n};\n\nchar* FastUInt32ToBufferLeft(uint32 u, char* buffer) {\n  int digits;\n  const char *ASCII_digits = NULL;\n  // The idea of this implementation is to trim the number of divides to as few\n  // as possible by using multiplication and subtraction rather than mod (%),\n  // and by outputting two digits at a time rather than one.\n  // The huge-number case is first, in the hopes that the compiler will output\n  // that case in one branch-free block of code, and only output conditional\n  // branches into it from below.\n  if (u >= 1000000000) {  // >= 1,000,000,000\n    digits = u / 100000000;  // 100,000,000\n    ASCII_digits = two_ASCII_digits[digits];\n    buffer[0] = ASCII_digits[0];\n    buffer[1] = ASCII_digits[1];\n    buffer += 2;\nsublt100_000_000:\n    u -= digits * 100000000;  // 100,000,000\nlt100_000_000:\n    digits = u / 1000000;  // 1,000,000\n    ASCII_digits = two_ASCII_digits[digits];\n    buffer[0] = ASCII_digits[0];\n    buffer[1] = ASCII_digits[1];\n    buffer += 2;\nsublt1_000_000:\n    u -= digits * 1000000;  // 1,000,000\nlt1_000_000:\n    digits = u / 10000;  // 10,000\n    ASCII_digits = two_ASCII_digits[digits];\n    buffer[0] = ASCII_digits[0];\n    buffer[1] = ASCII_digits[1];\n    buffer += 2;\nsublt10_000:\n    u -= digits * 10000;  // 10,000\nlt10_000:\n    digits = u / 100;\n    ASCII_digits = two_ASCII_digits[digits];\n    buffer[0] = ASCII_digits[0];\n    buffer[1] = ASCII_digits[1];\n    buffer += 2;\nsublt100:\n    u -= digits * 100;\nlt100:\n    digits = u;\n    ASCII_digits = two_ASCII_digits[digits];\n    buffer[0] = ASCII_digits[0];\n    buffer[1] = ASCII_digits[1];\n    buffer += 2;\ndone:\n    *buffer = 0;\n    return buffer;\n  }\n\n  if (u < 100) {\n    digits = u;\n    if (u >= 10) goto lt100;\n    *buffer++ = '0' + digits;\n    goto done;\n  }\n  if (u  <  10000) {   // 10,000\n    if (u >= 1000) goto lt10_000;\n    digits = u / 100;\n    *buffer++ = '0' + digits;\n    goto sublt100;\n  }\n  if (u  <  1000000) {   // 1,000,000\n    if (u >= 100000) goto lt1_000_000;\n    digits = u / 10000;  //    10,000\n    *buffer++ = '0' + digits;\n    goto sublt10_000;\n  }\n  if (u  <  100000000) {   // 100,000,000\n    if (u >= 10000000) goto lt100_000_000;\n    digits = u / 1000000;  //   1,000,000\n    *buffer++ = '0' + digits;\n    goto sublt1_000_000;\n  }\n  // we already know that u < 1,000,000,000\n  digits = u / 100000000;   // 100,000,000\n  *buffer++ = '0' + digits;\n  goto sublt100_000_000;\n}\n\nchar* FastInt32ToBufferLeft(int32 i, char* buffer) {\n  uint32 u = i;\n  if (i < 0) {\n    *buffer++ = '-';\n    u = -i;\n  }\n  return FastUInt32ToBufferLeft(u, buffer);\n}\n\nchar* FastUInt64ToBufferLeft(uint64 u64, char* buffer) {\n  int digits;\n  const char *ASCII_digits = NULL;\n\n  uint32 u = static_cast<uint32>(u64);\n  if (u == u64) return FastUInt32ToBufferLeft(u, buffer);\n\n  uint64 top_11_digits = u64 / 1000000000;\n  buffer = FastUInt64ToBufferLeft(top_11_digits, buffer);\n  u = u64 - (top_11_digits * 1000000000);\n\n  digits = u / 10000000;  // 10,000,000\n  GOOGLE_DCHECK_LT(digits, 100);\n  ASCII_digits = two_ASCII_digits[digits];\n  buffer[0] = ASCII_digits[0];\n  buffer[1] = ASCII_digits[1];\n  buffer += 2;\n  u -= digits * 10000000;  // 10,000,000\n  digits = u / 100000;  // 100,000\n  ASCII_digits = two_ASCII_digits[digits];\n  buffer[0] = ASCII_digits[0];\n  buffer[1] = ASCII_digits[1];\n  buffer += 2;\n  u -= digits * 100000;  // 100,000\n  digits = u / 1000;  // 1,000\n  ASCII_digits = two_ASCII_digits[digits];\n  buffer[0] = ASCII_digits[0];\n  buffer[1] = ASCII_digits[1];\n  buffer += 2;\n  u -= digits * 1000;  // 1,000\n  digits = u / 10;\n  ASCII_digits = two_ASCII_digits[digits];\n  buffer[0] = ASCII_digits[0];\n  buffer[1] = ASCII_digits[1];\n  buffer += 2;\n  u -= digits * 10;\n  digits = u;\n  *buffer++ = '0' + digits;\n  *buffer = 0;\n  return buffer;\n}\n\nchar* FastInt64ToBufferLeft(int64 i, char* buffer) {\n  uint64 u = i;\n  if (i < 0) {\n    *buffer++ = '-';\n    u = -i;\n  }\n  return FastUInt64ToBufferLeft(u, buffer);\n}\n\n// ----------------------------------------------------------------------\n// SimpleItoa()\n//    Description: converts an integer to a string.\n//\n//    Return value: string\n// ----------------------------------------------------------------------\n\nstring SimpleItoa(int i) {\n  char buffer[kFastToBufferSize];\n  return (sizeof(i) == 4) ?\n    FastInt32ToBuffer(i, buffer) :\n    FastInt64ToBuffer(i, buffer);\n}\n\nstring SimpleItoa(unsigned int i) {\n  char buffer[kFastToBufferSize];\n  return string(buffer, (sizeof(i) == 4) ?\n    FastUInt32ToBufferLeft(i, buffer) :\n    FastUInt64ToBufferLeft(i, buffer));\n}\n\nstring SimpleItoa(long i) {\n  char buffer[kFastToBufferSize];\n  return (sizeof(i) == 4) ?\n    FastInt32ToBuffer(i, buffer) :\n    FastInt64ToBuffer(i, buffer);\n}\n\nstring SimpleItoa(unsigned long i) {\n  char buffer[kFastToBufferSize];\n  return string(buffer, (sizeof(i) == 4) ?\n    FastUInt32ToBufferLeft(i, buffer) :\n    FastUInt64ToBufferLeft(i, buffer));\n}\n\nstring SimpleItoa(long long i) {\n  char buffer[kFastToBufferSize];\n  return (sizeof(i) == 4) ?\n    FastInt32ToBuffer(i, buffer) :\n    FastInt64ToBuffer(i, buffer);\n}\n\nstring SimpleItoa(unsigned long long i) {\n  char buffer[kFastToBufferSize];\n  return string(buffer, (sizeof(i) == 4) ?\n    FastUInt32ToBufferLeft(i, buffer) :\n    FastUInt64ToBufferLeft(i, buffer));\n}\n\n// ----------------------------------------------------------------------\n// SimpleDtoa()\n// SimpleFtoa()\n// DoubleToBuffer()\n// FloatToBuffer()\n//    We want to print the value without losing precision, but we also do\n//    not want to print more digits than necessary.  This turns out to be\n//    trickier than it sounds.  Numbers like 0.2 cannot be represented\n//    exactly in binary.  If we print 0.2 with a very large precision,\n//    e.g. \"%.50g\", we get \"0.2000000000000000111022302462515654042363167\".\n//    On the other hand, if we set the precision too low, we lose\n//    significant digits when printing numbers that actually need them.\n//    It turns out there is no precision value that does the right thing\n//    for all numbers.\n//\n//    Our strategy is to first try printing with a precision that is never\n//    over-precise, then parse the result with strtod() to see if it\n//    matches.  If not, we print again with a precision that will always\n//    give a precise result, but may use more digits than necessary.\n//\n//    An arguably better strategy would be to use the algorithm described\n//    in \"How to Print Floating-Point Numbers Accurately\" by Steele &\n//    White, e.g. as implemented by David M. Gay's dtoa().  It turns out,\n//    however, that the following implementation is about as fast as\n//    DMG's code.  Furthermore, DMG's code locks mutexes, which means it\n//    will not scale well on multi-core machines.  DMG's code is slightly\n//    more accurate (in that it will never use more digits than\n//    necessary), but this is probably irrelevant for most users.\n//\n//    Rob Pike and Ken Thompson also have an implementation of dtoa() in\n//    third_party/fmt/fltfmt.cc.  Their implementation is similar to this\n//    one in that it makes guesses and then uses strtod() to check them.\n//    Their implementation is faster because they use their own code to\n//    generate the digits in the first place rather than use snprintf(),\n//    thus avoiding format string parsing overhead.  However, this makes\n//    it considerably more complicated than the following implementation,\n//    and it is embedded in a larger library.  If speed turns out to be\n//    an issue, we could re-implement this in terms of their\n//    implementation.\n// ----------------------------------------------------------------------\n\nstring SimpleDtoa(double value) {\n  char buffer[kDoubleToBufferSize];\n  return DoubleToBuffer(value, buffer);\n}\n\nstring SimpleFtoa(float value) {\n  char buffer[kFloatToBufferSize];\n  return FloatToBuffer(value, buffer);\n}\n\nstatic inline bool IsValidFloatChar(char c) {\n  return ('0' <= c && c <= '9') ||\n         c == 'e' || c == 'E' ||\n         c == '+' || c == '-';\n}\n\nvoid DelocalizeRadix(char* buffer) {\n  // Fast check:  if the buffer has a normal decimal point, assume no\n  // translation is needed.\n  if (strchr(buffer, '.') != NULL) return;\n\n  // Find the first unknown character.\n  while (IsValidFloatChar(*buffer)) ++buffer;\n\n  if (*buffer == '\\0') {\n    // No radix character found.\n    return;\n  }\n\n  // We are now pointing at the locale-specific radix character.  Replace it\n  // with '.'.\n  *buffer = '.';\n  ++buffer;\n\n  if (!IsValidFloatChar(*buffer) && *buffer != '\\0') {\n    // It appears the radix was a multi-byte character.  We need to remove the\n    // extra bytes.\n    char* target = buffer;\n    do { ++buffer; } while (!IsValidFloatChar(*buffer) && *buffer != '\\0');\n    memmove(target, buffer, strlen(buffer) + 1);\n  }\n}\n\nchar* DoubleToBuffer(double value, char* buffer) {\n  // DBL_DIG is 15 for IEEE-754 doubles, which are used on almost all\n  // platforms these days.  Just in case some system exists where DBL_DIG\n  // is significantly larger -- and risks overflowing our buffer -- we have\n  // this assert.\n  GOOGLE_COMPILE_ASSERT(DBL_DIG < 20, DBL_DIG_is_too_big);\n\n  if (value == numeric_limits<double>::infinity()) {\n    strcpy(buffer, \"inf\");\n    return buffer;\n  } else if (value == -numeric_limits<double>::infinity()) {\n    strcpy(buffer, \"-inf\");\n    return buffer;\n  } else if (IsNaN(value)) {\n    strcpy(buffer, \"nan\");\n    return buffer;\n  }\n\n  int snprintf_result =\n    snprintf(buffer, kDoubleToBufferSize, \"%.*g\", DBL_DIG, value);\n\n  // The snprintf should never overflow because the buffer is significantly\n  // larger than the precision we asked for.\n  GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kDoubleToBufferSize);\n\n  // We need to make parsed_value volatile in order to force the compiler to\n  // write it out to the stack.  Otherwise, it may keep the value in a\n  // register, and if it does that, it may keep it as a long double instead\n  // of a double.  This long double may have extra bits that make it compare\n  // unequal to \"value\" even though it would be exactly equal if it were\n  // truncated to a double.\n  volatile double parsed_value = strtod(buffer, NULL);\n  if (parsed_value != value) {\n    int snprintf_result =\n      snprintf(buffer, kDoubleToBufferSize, \"%.*g\", DBL_DIG+2, value);\n\n    // Should never overflow; see above.\n    GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kDoubleToBufferSize);\n  }\n\n  DelocalizeRadix(buffer);\n  return buffer;\n}\n\nbool safe_strtof(const char* str, float* value) {\n  char* endptr;\n  errno = 0;  // errno only gets set on errors\n#if defined(_WIN32) || defined (__hpux)  // has no strtof()\n  *value = strtod(str, &endptr);\n#else\n  *value = strtof(str, &endptr);\n#endif\n  return *str != 0 && *endptr == 0 && errno == 0;\n}\n\nchar* FloatToBuffer(float value, char* buffer) {\n  // FLT_DIG is 6 for IEEE-754 floats, which are used on almost all\n  // platforms these days.  Just in case some system exists where FLT_DIG\n  // is significantly larger -- and risks overflowing our buffer -- we have\n  // this assert.\n  GOOGLE_COMPILE_ASSERT(FLT_DIG < 10, FLT_DIG_is_too_big);\n\n  if (value == numeric_limits<double>::infinity()) {\n    strcpy(buffer, \"inf\");\n    return buffer;\n  } else if (value == -numeric_limits<double>::infinity()) {\n    strcpy(buffer, \"-inf\");\n    return buffer;\n  } else if (IsNaN(value)) {\n    strcpy(buffer, \"nan\");\n    return buffer;\n  }\n\n  int snprintf_result =\n    snprintf(buffer, kFloatToBufferSize, \"%.*g\", FLT_DIG, value);\n\n  // The snprintf should never overflow because the buffer is significantly\n  // larger than the precision we asked for.\n  GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kFloatToBufferSize);\n\n  float parsed_value;\n  if (!safe_strtof(buffer, &parsed_value) || parsed_value != value) {\n    int snprintf_result =\n      snprintf(buffer, kFloatToBufferSize, \"%.*g\", FLT_DIG+2, value);\n\n    // Should never overflow; see above.\n    GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kFloatToBufferSize);\n  }\n\n  DelocalizeRadix(buffer);\n  return buffer;\n}\n\n// ----------------------------------------------------------------------\n// NoLocaleStrtod()\n//   This code will make you cry.\n// ----------------------------------------------------------------------\n\n// Returns a string identical to *input except that the character pointed to\n// by radix_pos (which should be '.') is replaced with the locale-specific\n// radix character.\nstring LocalizeRadix(const char* input, const char* radix_pos) {\n  // Determine the locale-specific radix character by calling sprintf() to\n  // print the number 1.5, then stripping off the digits.  As far as I can\n  // tell, this is the only portable, thread-safe way to get the C library\n  // to divuldge the locale's radix character.  No, localeconv() is NOT\n  // thread-safe.\n  char temp[16];\n  int size = sprintf(temp, \"%.1f\", 1.5);\n  GOOGLE_CHECK_EQ(temp[0], '1');\n  GOOGLE_CHECK_EQ(temp[size-1], '5');\n  GOOGLE_CHECK_LE(size, 6);\n\n  // Now replace the '.' in the input with it.\n  string result;\n  result.reserve(strlen(input) + size - 3);\n  result.append(input, radix_pos);\n  result.append(temp + 1, size - 2);\n  result.append(radix_pos + 1);\n  return result;\n}\n\ndouble NoLocaleStrtod(const char* text, char** original_endptr) {\n  // We cannot simply set the locale to \"C\" temporarily with setlocale()\n  // as this is not thread-safe.  Instead, we try to parse in the current\n  // locale first.  If parsing stops at a '.' character, then this is a\n  // pretty good hint that we're actually in some other locale in which\n  // '.' is not the radix character.\n\n  char* temp_endptr;\n  double result = strtod(text, &temp_endptr);\n  if (original_endptr != NULL) *original_endptr = temp_endptr;\n  if (*temp_endptr != '.') return result;\n\n  // Parsing halted on a '.'.  Perhaps we're in a different locale?  Let's\n  // try to replace the '.' with a locale-specific radix character and\n  // try again.\n  string localized = LocalizeRadix(text, temp_endptr);\n  const char* localized_cstr = localized.c_str();\n  char* localized_endptr;\n  result = strtod(localized_cstr, &localized_endptr);\n  if ((localized_endptr - localized_cstr) >\n      (temp_endptr - text)) {\n    // This attempt got further, so replacing the decimal must have helped.\n    // Update original_endptr to point at the right location.\n    if (original_endptr != NULL) {\n      // size_diff is non-zero if the localized radix has multiple bytes.\n      int size_diff = localized.size() - strlen(text);\n      // const_cast is necessary to match the strtod() interface.\n      *original_endptr = const_cast<char*>(\n        text + (localized_endptr - localized_cstr - size_diff));\n    }\n  }\n\n  return result;\n}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// from google3/strings/strutil.h\n\n#ifndef GOOGLE_PROTOBUF_STUBS_STRUTIL_H__\n#define GOOGLE_PROTOBUF_STUBS_STRUTIL_H__\n\n#include <stdlib.h>\n#include <vector>\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\n\n#ifdef _MSC_VER\n#define strtoll  _strtoi64\n#define strtoull _strtoui64\n#elif defined(__DECCXX) && defined(__osf__)\n// HP C++ on Tru64 does not have strtoll, but strtol is already 64-bit.\n#define strtoll strtol\n#define strtoull strtoul\n#endif\n\n// ----------------------------------------------------------------------\n// ascii_isalnum()\n//    Check if an ASCII character is alphanumeric.  We can't use ctype's\n//    isalnum() because it is affected by locale.  This function is applied\n//    to identifiers in the protocol buffer language, not to natural-language\n//    strings, so locale should not be taken into account.\n// ascii_isdigit()\n//    Like above, but only accepts digits.\n// ----------------------------------------------------------------------\n\ninline bool ascii_isalnum(char c) {\n  return ('a' <= c && c <= 'z') ||\n         ('A' <= c && c <= 'Z') ||\n         ('0' <= c && c <= '9');\n}\n\ninline bool ascii_isdigit(char c) {\n  return ('0' <= c && c <= '9');\n}\n\n// ----------------------------------------------------------------------\n// HasPrefixString()\n//    Check if a string begins with a given prefix.\n// StripPrefixString()\n//    Given a string and a putative prefix, returns the string minus the\n//    prefix string if the prefix matches, otherwise the original\n//    string.\n// ----------------------------------------------------------------------\ninline bool HasPrefixString(const string& str,\n                            const string& prefix) {\n  return str.size() >= prefix.size() &&\n         str.compare(0, prefix.size(), prefix) == 0;\n}\n\ninline string StripPrefixString(const string& str, const string& prefix) {\n  if (HasPrefixString(str, prefix)) {\n    return str.substr(prefix.size());\n  } else {\n    return str;\n  }\n}\n\n// ----------------------------------------------------------------------\n// HasSuffixString()\n//    Return true if str ends in suffix.\n// StripSuffixString()\n//    Given a string and a putative suffix, returns the string minus the\n//    suffix string if the suffix matches, otherwise the original\n//    string.\n// ----------------------------------------------------------------------\ninline bool HasSuffixString(const string& str,\n                            const string& suffix) {\n  return str.size() >= suffix.size() &&\n         str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0;\n}\n\ninline string StripSuffixString(const string& str, const string& suffix) {\n  if (HasSuffixString(str, suffix)) {\n    return str.substr(0, str.size() - suffix.size());\n  } else {\n    return str;\n  }\n}\n\n// ----------------------------------------------------------------------\n// StripString\n//    Replaces any occurrence of the character 'remove' (or the characters\n//    in 'remove') with the character 'replacewith'.\n//    Good for keeping html characters or protocol characters (\\t) out\n//    of places where they might cause a problem.\n// ----------------------------------------------------------------------\nLIBPROTOBUF_EXPORT void StripString(string* s, const char* remove,\n                                    char replacewith);\n\n// ----------------------------------------------------------------------\n// LowerString()\n// UpperString()\n//    Convert the characters in \"s\" to lowercase or uppercase.  ASCII-only:\n//    these functions intentionally ignore locale because they are applied to\n//    identifiers used in the Protocol Buffer language, not to natural-language\n//    strings.\n// ----------------------------------------------------------------------\n\ninline void LowerString(string * s) {\n  string::iterator end = s->end();\n  for (string::iterator i = s->begin(); i != end; ++i) {\n    // tolower() changes based on locale.  We don't want this!\n    if ('A' <= *i && *i <= 'Z') *i += 'a' - 'A';\n  }\n}\n\ninline void UpperString(string * s) {\n  string::iterator end = s->end();\n  for (string::iterator i = s->begin(); i != end; ++i) {\n    // toupper() changes based on locale.  We don't want this!\n    if ('a' <= *i && *i <= 'z') *i += 'A' - 'a';\n  }\n}\n\n// ----------------------------------------------------------------------\n// StringReplace()\n//    Give me a string and two patterns \"old\" and \"new\", and I replace\n//    the first instance of \"old\" in the string with \"new\", if it\n//    exists.  RETURN a new string, regardless of whether the replacement\n//    happened or not.\n// ----------------------------------------------------------------------\n\nLIBPROTOBUF_EXPORT string StringReplace(const string& s, const string& oldsub,\n                                        const string& newsub, bool replace_all);\n\n// ----------------------------------------------------------------------\n// SplitStringUsing()\n//    Split a string using a character delimiter. Append the components\n//    to 'result'.  If there are consecutive delimiters, this function skips\n//    over all of them.\n// ----------------------------------------------------------------------\nLIBPROTOBUF_EXPORT void SplitStringUsing(const string& full, const char* delim,\n                                         vector<string>* res);\n\n// ----------------------------------------------------------------------\n// JoinStrings()\n//    These methods concatenate a vector of strings into a C++ string, using\n//    the C-string \"delim\" as a separator between components. There are two\n//    flavors of the function, one flavor returns the concatenated string,\n//    another takes a pointer to the target string. In the latter case the\n//    target string is cleared and overwritten.\n// ----------------------------------------------------------------------\nLIBPROTOBUF_EXPORT void JoinStrings(const vector<string>& components,\n                                    const char* delim, string* result);\n\ninline string JoinStrings(const vector<string>& components,\n                          const char* delim) {\n  string result;\n  JoinStrings(components, delim, &result);\n  return result;\n}\n\n// ----------------------------------------------------------------------\n// UnescapeCEscapeSequences()\n//    Copies \"source\" to \"dest\", rewriting C-style escape sequences\n//    -- '\\n', '\\r', '\\\\', '\\ooo', etc -- to their ASCII\n//    equivalents.  \"dest\" must be sufficiently large to hold all\n//    the characters in the rewritten string (i.e. at least as large\n//    as strlen(source) + 1 should be safe, since the replacements\n//    are always shorter than the original escaped sequences).  It's\n//    safe for source and dest to be the same.  RETURNS the length\n//    of dest.\n//\n//    It allows hex sequences \\xhh, or generally \\xhhhhh with an\n//    arbitrary number of hex digits, but all of them together must\n//    specify a value of a single byte (e.g. \\x0045 is equivalent\n//    to \\x45, and \\x1234 is erroneous).\n//\n//    It also allows escape sequences of the form \\uhhhh (exactly four\n//    hex digits, upper or lower case) or \\Uhhhhhhhh (exactly eight\n//    hex digits, upper or lower case) to specify a Unicode code\n//    point. The dest array will contain the UTF8-encoded version of\n//    that code-point (e.g., if source contains \\u2019, then dest will\n//    contain the three bytes 0xE2, 0x80, and 0x99).\n//\n//    Errors: In the first form of the call, errors are reported with\n//    LOG(ERROR). The same is true for the second form of the call if\n//    the pointer to the string vector is NULL; otherwise, error\n//    messages are stored in the vector. In either case, the effect on\n//    the dest array is not defined, but rest of the source will be\n//    processed.\n//    ----------------------------------------------------------------------\n\nLIBPROTOBUF_EXPORT int UnescapeCEscapeSequences(const char* source, char* dest);\nLIBPROTOBUF_EXPORT int UnescapeCEscapeSequences(const char* source, char* dest,\n                                                vector<string> *errors);\n\n// ----------------------------------------------------------------------\n// UnescapeCEscapeString()\n//    This does the same thing as UnescapeCEscapeSequences, but creates\n//    a new string. The caller does not need to worry about allocating\n//    a dest buffer. This should be used for non performance critical\n//    tasks such as printing debug messages. It is safe for src and dest\n//    to be the same.\n//\n//    The second call stores its errors in a supplied string vector.\n//    If the string vector pointer is NULL, it reports the errors with LOG().\n//\n//    In the first and second calls, the length of dest is returned. In the\n//    the third call, the new string is returned.\n// ----------------------------------------------------------------------\n\nLIBPROTOBUF_EXPORT int UnescapeCEscapeString(const string& src, string* dest);\nLIBPROTOBUF_EXPORT int UnescapeCEscapeString(const string& src, string* dest,\n                                             vector<string> *errors);\nLIBPROTOBUF_EXPORT string UnescapeCEscapeString(const string& src);\n\n// ----------------------------------------------------------------------\n// CEscapeString()\n//    Copies 'src' to 'dest', escaping dangerous characters using\n//    C-style escape sequences. This is very useful for preparing query\n//    flags. 'src' and 'dest' should not overlap.\n//    Returns the number of bytes written to 'dest' (not including the \\0)\n//    or -1 if there was insufficient space.\n//\n//    Currently only \\n, \\r, \\t, \", ', \\ and !isprint() chars are escaped.\n// ----------------------------------------------------------------------\nLIBPROTOBUF_EXPORT int CEscapeString(const char* src, int src_len,\n                                     char* dest, int dest_len);\n\n// ----------------------------------------------------------------------\n// CEscape()\n//    More convenient form of CEscapeString: returns result as a \"string\".\n//    This version is slower than CEscapeString() because it does more\n//    allocation.  However, it is much more convenient to use in\n//    non-speed-critical code like logging messages etc.\n// ----------------------------------------------------------------------\nLIBPROTOBUF_EXPORT string CEscape(const string& src);\n\nnamespace strings {\n// Like CEscape() but does not escape bytes with the upper bit set.\nLIBPROTOBUF_EXPORT string Utf8SafeCEscape(const string& src);\n\n// Like CEscape() but uses hex (\\x) escapes instead of octals.\nLIBPROTOBUF_EXPORT string CHexEscape(const string& src);\n}  // namespace strings\n\n// ----------------------------------------------------------------------\n// strto32()\n// strtou32()\n// strto64()\n// strtou64()\n//    Architecture-neutral plug compatible replacements for strtol() and\n//    strtoul().  Long's have different lengths on ILP-32 and LP-64\n//    platforms, so using these is safer, from the point of view of\n//    overflow behavior, than using the standard libc functions.\n// ----------------------------------------------------------------------\nLIBPROTOBUF_EXPORT int32 strto32_adaptor(const char *nptr, char **endptr,\n                                         int base);\nLIBPROTOBUF_EXPORT uint32 strtou32_adaptor(const char *nptr, char **endptr,\n                                           int base);\n\ninline int32 strto32(const char *nptr, char **endptr, int base) {\n  if (sizeof(int32) == sizeof(long))\n    return strtol(nptr, endptr, base);\n  else\n    return strto32_adaptor(nptr, endptr, base);\n}\n\ninline uint32 strtou32(const char *nptr, char **endptr, int base) {\n  if (sizeof(uint32) == sizeof(unsigned long))\n    return strtoul(nptr, endptr, base);\n  else\n    return strtou32_adaptor(nptr, endptr, base);\n}\n\n// For now, long long is 64-bit on all the platforms we care about, so these\n// functions can simply pass the call to strto[u]ll.\ninline int64 strto64(const char *nptr, char **endptr, int base) {\n  GOOGLE_COMPILE_ASSERT(sizeof(int64) == sizeof(long long),\n                        sizeof_int64_is_not_sizeof_long_long);\n  return strtoll(nptr, endptr, base);\n}\n\ninline uint64 strtou64(const char *nptr, char **endptr, int base) {\n  GOOGLE_COMPILE_ASSERT(sizeof(uint64) == sizeof(unsigned long long),\n                        sizeof_uint64_is_not_sizeof_long_long);\n  return strtoull(nptr, endptr, base);\n}\n\n// ----------------------------------------------------------------------\n// FastIntToBuffer()\n// FastHexToBuffer()\n// FastHex64ToBuffer()\n// FastHex32ToBuffer()\n// FastTimeToBuffer()\n//    These are intended for speed.  FastIntToBuffer() assumes the\n//    integer is non-negative.  FastHexToBuffer() puts output in\n//    hex rather than decimal.  FastTimeToBuffer() puts the output\n//    into RFC822 format.\n//\n//    FastHex64ToBuffer() puts a 64-bit unsigned value in hex-format,\n//    padded to exactly 16 bytes (plus one byte for '\\0')\n//\n//    FastHex32ToBuffer() puts a 32-bit unsigned value in hex-format,\n//    padded to exactly 8 bytes (plus one byte for '\\0')\n//\n//       All functions take the output buffer as an arg.\n//    They all return a pointer to the beginning of the output,\n//    which may not be the beginning of the input buffer.\n// ----------------------------------------------------------------------\n\n// Suggested buffer size for FastToBuffer functions.  Also works with\n// DoubleToBuffer() and FloatToBuffer().\nstatic const int kFastToBufferSize = 32;\n\nLIBPROTOBUF_EXPORT char* FastInt32ToBuffer(int32 i, char* buffer);\nLIBPROTOBUF_EXPORT char* FastInt64ToBuffer(int64 i, char* buffer);\nchar* FastUInt32ToBuffer(uint32 i, char* buffer);  // inline below\nchar* FastUInt64ToBuffer(uint64 i, char* buffer);  // inline below\nLIBPROTOBUF_EXPORT char* FastHexToBuffer(int i, char* buffer);\nLIBPROTOBUF_EXPORT char* FastHex64ToBuffer(uint64 i, char* buffer);\nLIBPROTOBUF_EXPORT char* FastHex32ToBuffer(uint32 i, char* buffer);\n\n// at least 22 bytes long\ninline char* FastIntToBuffer(int i, char* buffer) {\n  return (sizeof(i) == 4 ?\n          FastInt32ToBuffer(i, buffer) : FastInt64ToBuffer(i, buffer));\n}\ninline char* FastUIntToBuffer(unsigned int i, char* buffer) {\n  return (sizeof(i) == 4 ?\n          FastUInt32ToBuffer(i, buffer) : FastUInt64ToBuffer(i, buffer));\n}\ninline char* FastLongToBuffer(long i, char* buffer) {\n  return (sizeof(i) == 4 ?\n          FastInt32ToBuffer(i, buffer) : FastInt64ToBuffer(i, buffer));\n}\ninline char* FastULongToBuffer(unsigned long i, char* buffer) {\n  return (sizeof(i) == 4 ?\n          FastUInt32ToBuffer(i, buffer) : FastUInt64ToBuffer(i, buffer));\n}\n\n// ----------------------------------------------------------------------\n// FastInt32ToBufferLeft()\n// FastUInt32ToBufferLeft()\n// FastInt64ToBufferLeft()\n// FastUInt64ToBufferLeft()\n//\n// Like the Fast*ToBuffer() functions above, these are intended for speed.\n// Unlike the Fast*ToBuffer() functions, however, these functions write\n// their output to the beginning of the buffer (hence the name, as the\n// output is left-aligned).  The caller is responsible for ensuring that\n// the buffer has enough space to hold the output.\n//\n// Returns a pointer to the end of the string (i.e. the null character\n// terminating the string).\n// ----------------------------------------------------------------------\n\nLIBPROTOBUF_EXPORT char* FastInt32ToBufferLeft(int32 i, char* buffer);\nLIBPROTOBUF_EXPORT char* FastUInt32ToBufferLeft(uint32 i, char* buffer);\nLIBPROTOBUF_EXPORT char* FastInt64ToBufferLeft(int64 i, char* buffer);\nLIBPROTOBUF_EXPORT char* FastUInt64ToBufferLeft(uint64 i, char* buffer);\n\n// Just define these in terms of the above.\ninline char* FastUInt32ToBuffer(uint32 i, char* buffer) {\n  FastUInt32ToBufferLeft(i, buffer);\n  return buffer;\n}\ninline char* FastUInt64ToBuffer(uint64 i, char* buffer) {\n  FastUInt64ToBufferLeft(i, buffer);\n  return buffer;\n}\n\n// ----------------------------------------------------------------------\n// SimpleItoa()\n//    Description: converts an integer to a string.\n//\n//    Return value: string\n// ----------------------------------------------------------------------\nLIBPROTOBUF_EXPORT string SimpleItoa(int i);\nLIBPROTOBUF_EXPORT string SimpleItoa(unsigned int i);\nLIBPROTOBUF_EXPORT string SimpleItoa(long i);\nLIBPROTOBUF_EXPORT string SimpleItoa(unsigned long i);\nLIBPROTOBUF_EXPORT string SimpleItoa(long long i);\nLIBPROTOBUF_EXPORT string SimpleItoa(unsigned long long i);\n\n// ----------------------------------------------------------------------\n// SimpleDtoa()\n// SimpleFtoa()\n// DoubleToBuffer()\n// FloatToBuffer()\n//    Description: converts a double or float to a string which, if\n//    passed to NoLocaleStrtod(), will produce the exact same original double\n//    (except in case of NaN; all NaNs are considered the same value).\n//    We try to keep the string short but it's not guaranteed to be as\n//    short as possible.\n//\n//    DoubleToBuffer() and FloatToBuffer() write the text to the given\n//    buffer and return it.  The buffer must be at least\n//    kDoubleToBufferSize bytes for doubles and kFloatToBufferSize\n//    bytes for floats.  kFastToBufferSize is also guaranteed to be large\n//    enough to hold either.\n//\n//    Return value: string\n// ----------------------------------------------------------------------\nLIBPROTOBUF_EXPORT string SimpleDtoa(double value);\nLIBPROTOBUF_EXPORT string SimpleFtoa(float value);\n\nLIBPROTOBUF_EXPORT char* DoubleToBuffer(double i, char* buffer);\nLIBPROTOBUF_EXPORT char* FloatToBuffer(float i, char* buffer);\n\n// In practice, doubles should never need more than 24 bytes and floats\n// should never need more than 14 (including null terminators), but we\n// overestimate to be safe.\nstatic const int kDoubleToBufferSize = 32;\nstatic const int kFloatToBufferSize = 24;\n\n// ----------------------------------------------------------------------\n// NoLocaleStrtod()\n//   Exactly like strtod(), except it always behaves as if in the \"C\"\n//   locale (i.e. decimal points must be '.'s).\n// ----------------------------------------------------------------------\n\nLIBPROTOBUF_EXPORT double NoLocaleStrtod(const char* text, char** endptr);\n\n}  // namespace protobuf\n}  // namespace google\n\n#endif  // GOOGLE_PROTOBUF_STUBS_STRUTIL_H__\n\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\n#include <google/protobuf/stubs/strutil.h>\n\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n#include <locale.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace {\n\n// TODO(kenton):  Copy strutil tests from google3?\n\nTEST(StringUtilityTest, ImmuneToLocales) {\n  // Remember the old locale.\n  char* old_locale_cstr = setlocale(LC_NUMERIC, NULL);\n  ASSERT_TRUE(old_locale_cstr != NULL);\n  string old_locale = old_locale_cstr;\n\n  // Set the locale to \"C\".\n  ASSERT_TRUE(setlocale(LC_NUMERIC, \"C\") != NULL);\n\n  EXPECT_EQ(1.5, NoLocaleStrtod(\"1.5\", NULL));\n  EXPECT_EQ(\"1.5\", SimpleDtoa(1.5));\n  EXPECT_EQ(\"1.5\", SimpleFtoa(1.5));\n\n  // Verify that the endptr is set correctly even if not all text was parsed.\n  const char* text = \"1.5f\";\n  char* endptr;\n  EXPECT_EQ(1.5, NoLocaleStrtod(text, &endptr));\n  EXPECT_EQ(3, endptr - text);\n\n  if (setlocale(LC_NUMERIC, \"es_ES\") == NULL &&\n      setlocale(LC_NUMERIC, \"es_ES.utf8\") == NULL) {\n    // Some systems may not have the desired locale available.\n    GOOGLE_LOG(WARNING)\n      << \"Couldn't set locale to es_ES.  Skipping this test.\";\n  } else {\n    EXPECT_EQ(1.5, NoLocaleStrtod(\"1.5\", NULL));\n    EXPECT_EQ(\"1.5\", SimpleDtoa(1.5));\n    EXPECT_EQ(\"1.5\", SimpleFtoa(1.5));\n    EXPECT_EQ(1.5, NoLocaleStrtod(text, &endptr));\n    EXPECT_EQ(3, endptr - text);\n  }\n\n  // Return to original locale.\n  setlocale(LC_NUMERIC, old_locale.c_str());\n}\n\n}  // anonymous namespace\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\n#include <google/protobuf/stubs/substitute.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace strings {\n\nusing internal::SubstituteArg;\n\n// Returns the number of args in arg_array which were passed explicitly\n// to Substitute().\nstatic int CountSubstituteArgs(const SubstituteArg* const* args_array) {\n  int count = 0;\n  while (args_array[count] != NULL && args_array[count]->size() != -1) {\n    ++count;\n  }\n  return count;\n}\n\nstring Substitute(\n    const char* format,\n    const SubstituteArg& arg0, const SubstituteArg& arg1,\n    const SubstituteArg& arg2, const SubstituteArg& arg3,\n    const SubstituteArg& arg4, const SubstituteArg& arg5,\n    const SubstituteArg& arg6, const SubstituteArg& arg7,\n    const SubstituteArg& arg8, const SubstituteArg& arg9) {\n  string result;\n  SubstituteAndAppend(&result, format, arg0, arg1, arg2, arg3, arg4,\n                                       arg5, arg6, arg7, arg8, arg9);\n  return result;\n}\n\nvoid SubstituteAndAppend(\n    string* output, const char* format,\n    const SubstituteArg& arg0, const SubstituteArg& arg1,\n    const SubstituteArg& arg2, const SubstituteArg& arg3,\n    const SubstituteArg& arg4, const SubstituteArg& arg5,\n    const SubstituteArg& arg6, const SubstituteArg& arg7,\n    const SubstituteArg& arg8, const SubstituteArg& arg9) {\n  const SubstituteArg* const args_array[] = {\n    &arg0, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7, &arg8, &arg9, NULL\n  };\n\n  // Determine total size needed.\n  int size = 0;\n  for (int i = 0; format[i] != '\\0'; i++) {\n    if (format[i] == '$') {\n      if (ascii_isdigit(format[i+1])) {\n        int index = format[i+1] - '0';\n        if (args_array[index]->size() == -1) {\n          GOOGLE_LOG(DFATAL)\n            << \"strings::Substitute format string invalid: asked for \\\"$\"\n            << index << \"\\\", but only \" << CountSubstituteArgs(args_array)\n            << \" args were given.  Full format string was: \\\"\"\n            << CEscape(format) << \"\\\".\";\n          return;\n        }\n        size += args_array[index]->size();\n        ++i;  // Skip next char.\n      } else if (format[i+1] == '$') {\n        ++size;\n        ++i;  // Skip next char.\n      } else {\n        GOOGLE_LOG(DFATAL)\n          << \"Invalid strings::Substitute() format string: \\\"\"\n          << CEscape(format) << \"\\\".\";\n        return;\n      }\n    } else {\n      ++size;\n    }\n  }\n\n  if (size == 0) return;\n\n  // Build the string.\n  int original_size = output->size();\n  STLStringResizeUninitialized(output, original_size + size);\n  char* target = string_as_array(output) + original_size;\n  for (int i = 0; format[i] != '\\0'; i++) {\n    if (format[i] == '$') {\n      if (ascii_isdigit(format[i+1])) {\n        const SubstituteArg* src = args_array[format[i+1] - '0'];\n        memcpy(target, src->data(), src->size());\n        target += src->size();\n        ++i;  // Skip next char.\n      } else if (format[i+1] == '$') {\n        *target++ = '$';\n        ++i;  // Skip next char.\n      }\n    } else {\n      *target++ = format[i];\n    }\n  }\n\n  GOOGLE_DCHECK_EQ(target - output->data(), output->size());\n}\n\n}  // namespace strings\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n// from google3/strings/substitute.h\n\n#include <string>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/strutil.h>\n\n#ifndef GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_\n#define GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_\n\nnamespace google {\nnamespace protobuf {\nnamespace strings {\n\n// ----------------------------------------------------------------------\n// strings::Substitute()\n// strings::SubstituteAndAppend()\n//   Kind of like StringPrintf, but different.\n//\n//   Example:\n//     string GetMessage(string first_name, string last_name, int age) {\n//       return strings::Substitute(\"My name is $0 $1 and I am $2 years old.\",\n//                                  first_name, last_name, age);\n//     }\n//\n//   Differences from StringPrintf:\n//   * The format string does not identify the types of arguments.\n//     Instead, the magic of C++ deals with this for us.  See below\n//     for a list of accepted types.\n//   * Substitutions in the format string are identified by a '$'\n//     followed by a digit.  So, you can use arguments out-of-order and\n//     use the same argument multiple times.\n//   * It's much faster than StringPrintf.\n//\n//   Supported types:\n//   * Strings (const char*, const string&)\n//     * Note that this means you do not have to add .c_str() to all of\n//       your strings.  In fact, you shouldn't; it will be slower.\n//   * int32, int64, uint32, uint64:  Formatted using SimpleItoa().\n//   * float, double:  Formatted using SimpleFtoa() and SimpleDtoa().\n//   * bool:  Printed as \"true\" or \"false\".\n//\n//   SubstituteAndAppend() is like Substitute() but appends the result to\n//   *output.  Example:\n//\n//     string str;\n//     strings::SubstituteAndAppend(&str,\n//                                  \"My name is $0 $1 and I am $2 years old.\",\n//                                  first_name, last_name, age);\n//\n//   Substitute() is significantly faster than StringPrintf().  For very\n//   large strings, it may be orders of magnitude faster.\n// ----------------------------------------------------------------------\n\nnamespace internal {  // Implementation details.\n\nclass SubstituteArg {\n public:\n  inline SubstituteArg(const char* value)\n    : text_(value), size_(strlen(text_)) {}\n  inline SubstituteArg(const string& value)\n    : text_(value.data()), size_(value.size()) {}\n\n  // Indicates that no argument was given.\n  inline explicit SubstituteArg()\n    : text_(NULL), size_(-1) {}\n\n  // Primitives\n  // We don't overload for signed and unsigned char because if people are\n  // explicitly declaring their chars as signed or unsigned then they are\n  // probably actually using them as 8-bit integers and would probably\n  // prefer an integer representation.  But, we don't really know.  So, we\n  // make the caller decide what to do.\n  inline SubstituteArg(char value)\n    : text_(scratch_), size_(1) { scratch_[0] = value; }\n  inline SubstituteArg(short value)\n    : text_(FastInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {}\n  inline SubstituteArg(unsigned short value)\n    : text_(FastUInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {}\n  inline SubstituteArg(int value)\n    : text_(FastInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {}\n  inline SubstituteArg(unsigned int value)\n    : text_(FastUInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {}\n  inline SubstituteArg(long value)\n    : text_(FastLongToBuffer(value, scratch_)), size_(strlen(text_)) {}\n  inline SubstituteArg(unsigned long value)\n    : text_(FastULongToBuffer(value, scratch_)), size_(strlen(text_)) {}\n  inline SubstituteArg(long long value)\n    : text_(FastInt64ToBuffer(value, scratch_)), size_(strlen(text_)) {}\n  inline SubstituteArg(unsigned long long value)\n    : text_(FastUInt64ToBuffer(value, scratch_)), size_(strlen(text_)) {}\n  inline SubstituteArg(float value)\n    : text_(FloatToBuffer(value, scratch_)), size_(strlen(text_)) {}\n  inline SubstituteArg(double value)\n    : text_(DoubleToBuffer(value, scratch_)), size_(strlen(text_)) {}\n  inline SubstituteArg(bool value)\n    : text_(value ? \"true\" : \"false\"), size_(strlen(text_)) {}\n\n  inline const char* data() const { return text_; }\n  inline int size() const { return size_; }\n\n private:\n  const char* text_;\n  int size_;\n  char scratch_[kFastToBufferSize];\n};\n\n}  // namespace internal\n\nLIBPROTOBUF_EXPORT string Substitute(\n  const char* format,\n  const internal::SubstituteArg& arg0 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg1 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg2 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg3 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg4 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg5 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg6 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg7 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg8 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg9 = internal::SubstituteArg());\n\nLIBPROTOBUF_EXPORT void SubstituteAndAppend(\n  string* output, const char* format,\n  const internal::SubstituteArg& arg0 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg1 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg2 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg3 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg4 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg5 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg6 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg7 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg8 = internal::SubstituteArg(),\n  const internal::SubstituteArg& arg9 = internal::SubstituteArg());\n\n}  // namespace strings\n}  // namespace protobuf\n}  // namespace google\n\n#endif // GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifdef _WIN32\n// Verify that #including windows.h does not break anything (e.g. because\n// windows.h #defines GetMessage() as a macro).\n#include <windows.h>\n#endif\n\n#include <google/protobuf/test_util.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/message.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n\nnamespace google {\nnamespace protobuf {\n\nvoid TestUtil::SetAllFields(unittest::TestAllTypes* message) {\n  message->set_optional_int32   (101);\n  message->set_optional_int64   (102);\n  message->set_optional_uint32  (103);\n  message->set_optional_uint64  (104);\n  message->set_optional_sint32  (105);\n  message->set_optional_sint64  (106);\n  message->set_optional_fixed32 (107);\n  message->set_optional_fixed64 (108);\n  message->set_optional_sfixed32(109);\n  message->set_optional_sfixed64(110);\n  message->set_optional_float   (111);\n  message->set_optional_double  (112);\n  message->set_optional_bool    (true);\n  message->set_optional_string  (\"115\");\n  message->set_optional_bytes   (\"116\");\n\n  message->mutable_optionalgroup           ()->set_a(117);\n  message->mutable_optional_nested_message ()->set_bb(118);\n  message->mutable_optional_foreign_message()->set_c(119);\n  message->mutable_optional_import_message ()->set_d(120);\n\n  message->set_optional_nested_enum (unittest::TestAllTypes::BAZ);\n  message->set_optional_foreign_enum(unittest::FOREIGN_BAZ      );\n  message->set_optional_import_enum (unittest_import::IMPORT_BAZ);\n\n  // StringPiece and Cord fields are only accessible via reflection in the\n  // open source release; see comments in compiler/cpp/string_field.cc.\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n  message->GetReflection()->SetString(\n    message,\n    message->GetDescriptor()->FindFieldByName(\"optional_string_piece\"),\n    \"124\");\n  message->GetReflection()->SetString(\n    message,\n    message->GetDescriptor()->FindFieldByName(\"optional_cord\"),\n    \"125\");\n#endif  // !PROTOBUF_TEST_NO_DESCRIPTORS\n\n  // -----------------------------------------------------------------\n\n  message->add_repeated_int32   (201);\n  message->add_repeated_int64   (202);\n  message->add_repeated_uint32  (203);\n  message->add_repeated_uint64  (204);\n  message->add_repeated_sint32  (205);\n  message->add_repeated_sint64  (206);\n  message->add_repeated_fixed32 (207);\n  message->add_repeated_fixed64 (208);\n  message->add_repeated_sfixed32(209);\n  message->add_repeated_sfixed64(210);\n  message->add_repeated_float   (211);\n  message->add_repeated_double  (212);\n  message->add_repeated_bool    (true);\n  message->add_repeated_string  (\"215\");\n  message->add_repeated_bytes   (\"216\");\n\n  message->add_repeatedgroup           ()->set_a(217);\n  message->add_repeated_nested_message ()->set_bb(218);\n  message->add_repeated_foreign_message()->set_c(219);\n  message->add_repeated_import_message ()->set_d(220);\n\n  message->add_repeated_nested_enum (unittest::TestAllTypes::BAR);\n  message->add_repeated_foreign_enum(unittest::FOREIGN_BAR      );\n  message->add_repeated_import_enum (unittest_import::IMPORT_BAR);\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n  message->GetReflection()->AddString(\n    message,\n    message->GetDescriptor()->FindFieldByName(\"repeated_string_piece\"),\n    \"224\");\n  message->GetReflection()->AddString(\n    message,\n    message->GetDescriptor()->FindFieldByName(\"repeated_cord\"),\n    \"225\");\n#endif  // !PROTOBUF_TEST_NO_DESCRIPTORS\n\n  // Add a second one of each field.\n  message->add_repeated_int32   (301);\n  message->add_repeated_int64   (302);\n  message->add_repeated_uint32  (303);\n  message->add_repeated_uint64  (304);\n  message->add_repeated_sint32  (305);\n  message->add_repeated_sint64  (306);\n  message->add_repeated_fixed32 (307);\n  message->add_repeated_fixed64 (308);\n  message->add_repeated_sfixed32(309);\n  message->add_repeated_sfixed64(310);\n  message->add_repeated_float   (311);\n  message->add_repeated_double  (312);\n  message->add_repeated_bool    (false);\n  message->add_repeated_string  (\"315\");\n  message->add_repeated_bytes   (\"316\");\n\n  message->add_repeatedgroup           ()->set_a(317);\n  message->add_repeated_nested_message ()->set_bb(318);\n  message->add_repeated_foreign_message()->set_c(319);\n  message->add_repeated_import_message ()->set_d(320);\n\n  message->add_repeated_nested_enum (unittest::TestAllTypes::BAZ);\n  message->add_repeated_foreign_enum(unittest::FOREIGN_BAZ      );\n  message->add_repeated_import_enum (unittest_import::IMPORT_BAZ);\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n  message->GetReflection()->AddString(\n    message,\n    message->GetDescriptor()->FindFieldByName(\"repeated_string_piece\"),\n    \"324\");\n  message->GetReflection()->AddString(\n    message,\n    message->GetDescriptor()->FindFieldByName(\"repeated_cord\"),\n    \"325\");\n#endif  // !PROTOBUF_TEST_NO_DESCRIPTORS\n\n  // -----------------------------------------------------------------\n\n  message->set_default_int32   (401);\n  message->set_default_int64   (402);\n  message->set_default_uint32  (403);\n  message->set_default_uint64  (404);\n  message->set_default_sint32  (405);\n  message->set_default_sint64  (406);\n  message->set_default_fixed32 (407);\n  message->set_default_fixed64 (408);\n  message->set_default_sfixed32(409);\n  message->set_default_sfixed64(410);\n  message->set_default_float   (411);\n  message->set_default_double  (412);\n  message->set_default_bool    (false);\n  message->set_default_string  (\"415\");\n  message->set_default_bytes   (\"416\");\n\n  message->set_default_nested_enum (unittest::TestAllTypes::FOO);\n  message->set_default_foreign_enum(unittest::FOREIGN_FOO      );\n  message->set_default_import_enum (unittest_import::IMPORT_FOO);\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n  message->GetReflection()->SetString(\n    message,\n    message->GetDescriptor()->FindFieldByName(\"default_string_piece\"),\n    \"424\");\n  message->GetReflection()->SetString(\n    message,\n    message->GetDescriptor()->FindFieldByName(\"default_cord\"),\n    \"425\");\n#endif  // !PROTOBUF_TEST_NO_DESCRIPTORS\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ModifyRepeatedFields(unittest::TestAllTypes* message) {\n  message->set_repeated_int32   (1, 501);\n  message->set_repeated_int64   (1, 502);\n  message->set_repeated_uint32  (1, 503);\n  message->set_repeated_uint64  (1, 504);\n  message->set_repeated_sint32  (1, 505);\n  message->set_repeated_sint64  (1, 506);\n  message->set_repeated_fixed32 (1, 507);\n  message->set_repeated_fixed64 (1, 508);\n  message->set_repeated_sfixed32(1, 509);\n  message->set_repeated_sfixed64(1, 510);\n  message->set_repeated_float   (1, 511);\n  message->set_repeated_double  (1, 512);\n  message->set_repeated_bool    (1, true);\n  message->set_repeated_string  (1, \"515\");\n  message->set_repeated_bytes   (1, \"516\");\n\n  message->mutable_repeatedgroup           (1)->set_a(517);\n  message->mutable_repeated_nested_message (1)->set_bb(518);\n  message->mutable_repeated_foreign_message(1)->set_c(519);\n  message->mutable_repeated_import_message (1)->set_d(520);\n\n  message->set_repeated_nested_enum (1, unittest::TestAllTypes::FOO);\n  message->set_repeated_foreign_enum(1, unittest::FOREIGN_FOO      );\n  message->set_repeated_import_enum (1, unittest_import::IMPORT_FOO);\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n  message->GetReflection()->SetRepeatedString(\n    message,\n    message->GetDescriptor()->FindFieldByName(\"repeated_string_piece\"),\n    1, \"524\");\n  message->GetReflection()->SetRepeatedString(\n    message,\n    message->GetDescriptor()->FindFieldByName(\"repeated_cord\"),\n    1, \"525\");\n#endif  // !PROTOBUF_TEST_NO_DESCRIPTORS\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ExpectAllFieldsSet(const unittest::TestAllTypes& message) {\n  EXPECT_TRUE(message.has_optional_int32   ());\n  EXPECT_TRUE(message.has_optional_int64   ());\n  EXPECT_TRUE(message.has_optional_uint32  ());\n  EXPECT_TRUE(message.has_optional_uint64  ());\n  EXPECT_TRUE(message.has_optional_sint32  ());\n  EXPECT_TRUE(message.has_optional_sint64  ());\n  EXPECT_TRUE(message.has_optional_fixed32 ());\n  EXPECT_TRUE(message.has_optional_fixed64 ());\n  EXPECT_TRUE(message.has_optional_sfixed32());\n  EXPECT_TRUE(message.has_optional_sfixed64());\n  EXPECT_TRUE(message.has_optional_float   ());\n  EXPECT_TRUE(message.has_optional_double  ());\n  EXPECT_TRUE(message.has_optional_bool    ());\n  EXPECT_TRUE(message.has_optional_string  ());\n  EXPECT_TRUE(message.has_optional_bytes   ());\n\n  EXPECT_TRUE(message.has_optionalgroup           ());\n  EXPECT_TRUE(message.has_optional_nested_message ());\n  EXPECT_TRUE(message.has_optional_foreign_message());\n  EXPECT_TRUE(message.has_optional_import_message ());\n\n  EXPECT_TRUE(message.optionalgroup           ().has_a());\n  EXPECT_TRUE(message.optional_nested_message ().has_bb());\n  EXPECT_TRUE(message.optional_foreign_message().has_c());\n  EXPECT_TRUE(message.optional_import_message ().has_d());\n\n  EXPECT_TRUE(message.has_optional_nested_enum ());\n  EXPECT_TRUE(message.has_optional_foreign_enum());\n  EXPECT_TRUE(message.has_optional_import_enum ());\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n  EXPECT_TRUE(message.has_optional_string_piece());\n  EXPECT_TRUE(message.has_optional_cord());\n#endif\n\n  EXPECT_EQ(101  , message.optional_int32   ());\n  EXPECT_EQ(102  , message.optional_int64   ());\n  EXPECT_EQ(103  , message.optional_uint32  ());\n  EXPECT_EQ(104  , message.optional_uint64  ());\n  EXPECT_EQ(105  , message.optional_sint32  ());\n  EXPECT_EQ(106  , message.optional_sint64  ());\n  EXPECT_EQ(107  , message.optional_fixed32 ());\n  EXPECT_EQ(108  , message.optional_fixed64 ());\n  EXPECT_EQ(109  , message.optional_sfixed32());\n  EXPECT_EQ(110  , message.optional_sfixed64());\n  EXPECT_EQ(111  , message.optional_float   ());\n  EXPECT_EQ(112  , message.optional_double  ());\n  EXPECT_EQ(true , message.optional_bool    ());\n  EXPECT_EQ(\"115\", message.optional_string  ());\n  EXPECT_EQ(\"116\", message.optional_bytes   ());\n\n  EXPECT_EQ(117, message.optionalgroup           ().a());\n  EXPECT_EQ(118, message.optional_nested_message ().bb());\n  EXPECT_EQ(119, message.optional_foreign_message().c());\n  EXPECT_EQ(120, message.optional_import_message ().d());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAZ, message.optional_nested_enum ());\n  EXPECT_EQ(unittest::FOREIGN_BAZ      , message.optional_foreign_enum());\n  EXPECT_EQ(unittest_import::IMPORT_BAZ, message.optional_import_enum ());\n\n\n  // -----------------------------------------------------------------\n\n  ASSERT_EQ(2, message.repeated_int32_size   ());\n  ASSERT_EQ(2, message.repeated_int64_size   ());\n  ASSERT_EQ(2, message.repeated_uint32_size  ());\n  ASSERT_EQ(2, message.repeated_uint64_size  ());\n  ASSERT_EQ(2, message.repeated_sint32_size  ());\n  ASSERT_EQ(2, message.repeated_sint64_size  ());\n  ASSERT_EQ(2, message.repeated_fixed32_size ());\n  ASSERT_EQ(2, message.repeated_fixed64_size ());\n  ASSERT_EQ(2, message.repeated_sfixed32_size());\n  ASSERT_EQ(2, message.repeated_sfixed64_size());\n  ASSERT_EQ(2, message.repeated_float_size   ());\n  ASSERT_EQ(2, message.repeated_double_size  ());\n  ASSERT_EQ(2, message.repeated_bool_size    ());\n  ASSERT_EQ(2, message.repeated_string_size  ());\n  ASSERT_EQ(2, message.repeated_bytes_size   ());\n\n  ASSERT_EQ(2, message.repeatedgroup_size           ());\n  ASSERT_EQ(2, message.repeated_nested_message_size ());\n  ASSERT_EQ(2, message.repeated_foreign_message_size());\n  ASSERT_EQ(2, message.repeated_import_message_size ());\n  ASSERT_EQ(2, message.repeated_nested_enum_size    ());\n  ASSERT_EQ(2, message.repeated_foreign_enum_size   ());\n  ASSERT_EQ(2, message.repeated_import_enum_size    ());\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n  ASSERT_EQ(2, message.repeated_string_piece_size());\n  ASSERT_EQ(2, message.repeated_cord_size());\n#endif\n\n  EXPECT_EQ(201  , message.repeated_int32   (0));\n  EXPECT_EQ(202  , message.repeated_int64   (0));\n  EXPECT_EQ(203  , message.repeated_uint32  (0));\n  EXPECT_EQ(204  , message.repeated_uint64  (0));\n  EXPECT_EQ(205  , message.repeated_sint32  (0));\n  EXPECT_EQ(206  , message.repeated_sint64  (0));\n  EXPECT_EQ(207  , message.repeated_fixed32 (0));\n  EXPECT_EQ(208  , message.repeated_fixed64 (0));\n  EXPECT_EQ(209  , message.repeated_sfixed32(0));\n  EXPECT_EQ(210  , message.repeated_sfixed64(0));\n  EXPECT_EQ(211  , message.repeated_float   (0));\n  EXPECT_EQ(212  , message.repeated_double  (0));\n  EXPECT_EQ(true , message.repeated_bool    (0));\n  EXPECT_EQ(\"215\", message.repeated_string  (0));\n  EXPECT_EQ(\"216\", message.repeated_bytes   (0));\n\n  EXPECT_EQ(217, message.repeatedgroup           (0).a());\n  EXPECT_EQ(218, message.repeated_nested_message (0).bb());\n  EXPECT_EQ(219, message.repeated_foreign_message(0).c());\n  EXPECT_EQ(220, message.repeated_import_message (0).d());\n\n\n  EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (0));\n  EXPECT_EQ(unittest::FOREIGN_BAR      , message.repeated_foreign_enum(0));\n  EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (0));\n\n  EXPECT_EQ(301  , message.repeated_int32   (1));\n  EXPECT_EQ(302  , message.repeated_int64   (1));\n  EXPECT_EQ(303  , message.repeated_uint32  (1));\n  EXPECT_EQ(304  , message.repeated_uint64  (1));\n  EXPECT_EQ(305  , message.repeated_sint32  (1));\n  EXPECT_EQ(306  , message.repeated_sint64  (1));\n  EXPECT_EQ(307  , message.repeated_fixed32 (1));\n  EXPECT_EQ(308  , message.repeated_fixed64 (1));\n  EXPECT_EQ(309  , message.repeated_sfixed32(1));\n  EXPECT_EQ(310  , message.repeated_sfixed64(1));\n  EXPECT_EQ(311  , message.repeated_float   (1));\n  EXPECT_EQ(312  , message.repeated_double  (1));\n  EXPECT_EQ(false, message.repeated_bool    (1));\n  EXPECT_EQ(\"315\", message.repeated_string  (1));\n  EXPECT_EQ(\"316\", message.repeated_bytes   (1));\n\n  EXPECT_EQ(317, message.repeatedgroup           (1).a());\n  EXPECT_EQ(318, message.repeated_nested_message (1).bb());\n  EXPECT_EQ(319, message.repeated_foreign_message(1).c());\n  EXPECT_EQ(320, message.repeated_import_message (1).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAZ, message.repeated_nested_enum (1));\n  EXPECT_EQ(unittest::FOREIGN_BAZ      , message.repeated_foreign_enum(1));\n  EXPECT_EQ(unittest_import::IMPORT_BAZ, message.repeated_import_enum (1));\n\n\n  // -----------------------------------------------------------------\n\n  EXPECT_TRUE(message.has_default_int32   ());\n  EXPECT_TRUE(message.has_default_int64   ());\n  EXPECT_TRUE(message.has_default_uint32  ());\n  EXPECT_TRUE(message.has_default_uint64  ());\n  EXPECT_TRUE(message.has_default_sint32  ());\n  EXPECT_TRUE(message.has_default_sint64  ());\n  EXPECT_TRUE(message.has_default_fixed32 ());\n  EXPECT_TRUE(message.has_default_fixed64 ());\n  EXPECT_TRUE(message.has_default_sfixed32());\n  EXPECT_TRUE(message.has_default_sfixed64());\n  EXPECT_TRUE(message.has_default_float   ());\n  EXPECT_TRUE(message.has_default_double  ());\n  EXPECT_TRUE(message.has_default_bool    ());\n  EXPECT_TRUE(message.has_default_string  ());\n  EXPECT_TRUE(message.has_default_bytes   ());\n\n  EXPECT_TRUE(message.has_default_nested_enum ());\n  EXPECT_TRUE(message.has_default_foreign_enum());\n  EXPECT_TRUE(message.has_default_import_enum ());\n\n\n  EXPECT_EQ(401  , message.default_int32   ());\n  EXPECT_EQ(402  , message.default_int64   ());\n  EXPECT_EQ(403  , message.default_uint32  ());\n  EXPECT_EQ(404  , message.default_uint64  ());\n  EXPECT_EQ(405  , message.default_sint32  ());\n  EXPECT_EQ(406  , message.default_sint64  ());\n  EXPECT_EQ(407  , message.default_fixed32 ());\n  EXPECT_EQ(408  , message.default_fixed64 ());\n  EXPECT_EQ(409  , message.default_sfixed32());\n  EXPECT_EQ(410  , message.default_sfixed64());\n  EXPECT_EQ(411  , message.default_float   ());\n  EXPECT_EQ(412  , message.default_double  ());\n  EXPECT_EQ(false, message.default_bool    ());\n  EXPECT_EQ(\"415\", message.default_string  ());\n  EXPECT_EQ(\"416\", message.default_bytes   ());\n\n  EXPECT_EQ(unittest::TestAllTypes::FOO, message.default_nested_enum ());\n  EXPECT_EQ(unittest::FOREIGN_FOO      , message.default_foreign_enum());\n  EXPECT_EQ(unittest_import::IMPORT_FOO, message.default_import_enum ());\n\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ExpectClear(const unittest::TestAllTypes& message) {\n  // has_blah() should initially be false for all optional fields.\n  EXPECT_FALSE(message.has_optional_int32   ());\n  EXPECT_FALSE(message.has_optional_int64   ());\n  EXPECT_FALSE(message.has_optional_uint32  ());\n  EXPECT_FALSE(message.has_optional_uint64  ());\n  EXPECT_FALSE(message.has_optional_sint32  ());\n  EXPECT_FALSE(message.has_optional_sint64  ());\n  EXPECT_FALSE(message.has_optional_fixed32 ());\n  EXPECT_FALSE(message.has_optional_fixed64 ());\n  EXPECT_FALSE(message.has_optional_sfixed32());\n  EXPECT_FALSE(message.has_optional_sfixed64());\n  EXPECT_FALSE(message.has_optional_float   ());\n  EXPECT_FALSE(message.has_optional_double  ());\n  EXPECT_FALSE(message.has_optional_bool    ());\n  EXPECT_FALSE(message.has_optional_string  ());\n  EXPECT_FALSE(message.has_optional_bytes   ());\n\n  EXPECT_FALSE(message.has_optionalgroup           ());\n  EXPECT_FALSE(message.has_optional_nested_message ());\n  EXPECT_FALSE(message.has_optional_foreign_message());\n  EXPECT_FALSE(message.has_optional_import_message ());\n\n  EXPECT_FALSE(message.has_optional_nested_enum ());\n  EXPECT_FALSE(message.has_optional_foreign_enum());\n  EXPECT_FALSE(message.has_optional_import_enum ());\n\n  EXPECT_FALSE(message.has_optional_string_piece());\n  EXPECT_FALSE(message.has_optional_cord());\n\n  // Optional fields without defaults are set to zero or something like it.\n  EXPECT_EQ(0    , message.optional_int32   ());\n  EXPECT_EQ(0    , message.optional_int64   ());\n  EXPECT_EQ(0    , message.optional_uint32  ());\n  EXPECT_EQ(0    , message.optional_uint64  ());\n  EXPECT_EQ(0    , message.optional_sint32  ());\n  EXPECT_EQ(0    , message.optional_sint64  ());\n  EXPECT_EQ(0    , message.optional_fixed32 ());\n  EXPECT_EQ(0    , message.optional_fixed64 ());\n  EXPECT_EQ(0    , message.optional_sfixed32());\n  EXPECT_EQ(0    , message.optional_sfixed64());\n  EXPECT_EQ(0    , message.optional_float   ());\n  EXPECT_EQ(0    , message.optional_double  ());\n  EXPECT_EQ(false, message.optional_bool    ());\n  EXPECT_EQ(\"\"   , message.optional_string  ());\n  EXPECT_EQ(\"\"   , message.optional_bytes   ());\n\n  // Embedded messages should also be clear.\n  EXPECT_FALSE(message.optionalgroup           ().has_a());\n  EXPECT_FALSE(message.optional_nested_message ().has_bb());\n  EXPECT_FALSE(message.optional_foreign_message().has_c());\n  EXPECT_FALSE(message.optional_import_message ().has_d());\n\n  EXPECT_EQ(0, message.optionalgroup           ().a());\n  EXPECT_EQ(0, message.optional_nested_message ().bb());\n  EXPECT_EQ(0, message.optional_foreign_message().c());\n  EXPECT_EQ(0, message.optional_import_message ().d());\n\n  // Enums without defaults are set to the first value in the enum.\n  EXPECT_EQ(unittest::TestAllTypes::FOO, message.optional_nested_enum ());\n  EXPECT_EQ(unittest::FOREIGN_FOO      , message.optional_foreign_enum());\n  EXPECT_EQ(unittest_import::IMPORT_FOO, message.optional_import_enum ());\n\n\n  // Repeated fields are empty.\n  EXPECT_EQ(0, message.repeated_int32_size   ());\n  EXPECT_EQ(0, message.repeated_int64_size   ());\n  EXPECT_EQ(0, message.repeated_uint32_size  ());\n  EXPECT_EQ(0, message.repeated_uint64_size  ());\n  EXPECT_EQ(0, message.repeated_sint32_size  ());\n  EXPECT_EQ(0, message.repeated_sint64_size  ());\n  EXPECT_EQ(0, message.repeated_fixed32_size ());\n  EXPECT_EQ(0, message.repeated_fixed64_size ());\n  EXPECT_EQ(0, message.repeated_sfixed32_size());\n  EXPECT_EQ(0, message.repeated_sfixed64_size());\n  EXPECT_EQ(0, message.repeated_float_size   ());\n  EXPECT_EQ(0, message.repeated_double_size  ());\n  EXPECT_EQ(0, message.repeated_bool_size    ());\n  EXPECT_EQ(0, message.repeated_string_size  ());\n  EXPECT_EQ(0, message.repeated_bytes_size   ());\n\n  EXPECT_EQ(0, message.repeatedgroup_size           ());\n  EXPECT_EQ(0, message.repeated_nested_message_size ());\n  EXPECT_EQ(0, message.repeated_foreign_message_size());\n  EXPECT_EQ(0, message.repeated_import_message_size ());\n  EXPECT_EQ(0, message.repeated_nested_enum_size    ());\n  EXPECT_EQ(0, message.repeated_foreign_enum_size   ());\n  EXPECT_EQ(0, message.repeated_import_enum_size    ());\n\n  EXPECT_EQ(0, message.repeated_string_piece_size());\n  EXPECT_EQ(0, message.repeated_cord_size());\n\n  // has_blah() should also be false for all default fields.\n  EXPECT_FALSE(message.has_default_int32   ());\n  EXPECT_FALSE(message.has_default_int64   ());\n  EXPECT_FALSE(message.has_default_uint32  ());\n  EXPECT_FALSE(message.has_default_uint64  ());\n  EXPECT_FALSE(message.has_default_sint32  ());\n  EXPECT_FALSE(message.has_default_sint64  ());\n  EXPECT_FALSE(message.has_default_fixed32 ());\n  EXPECT_FALSE(message.has_default_fixed64 ());\n  EXPECT_FALSE(message.has_default_sfixed32());\n  EXPECT_FALSE(message.has_default_sfixed64());\n  EXPECT_FALSE(message.has_default_float   ());\n  EXPECT_FALSE(message.has_default_double  ());\n  EXPECT_FALSE(message.has_default_bool    ());\n  EXPECT_FALSE(message.has_default_string  ());\n  EXPECT_FALSE(message.has_default_bytes   ());\n\n  EXPECT_FALSE(message.has_default_nested_enum ());\n  EXPECT_FALSE(message.has_default_foreign_enum());\n  EXPECT_FALSE(message.has_default_import_enum ());\n\n\n  // Fields with defaults have their default values (duh).\n  EXPECT_EQ( 41    , message.default_int32   ());\n  EXPECT_EQ( 42    , message.default_int64   ());\n  EXPECT_EQ( 43    , message.default_uint32  ());\n  EXPECT_EQ( 44    , message.default_uint64  ());\n  EXPECT_EQ(-45    , message.default_sint32  ());\n  EXPECT_EQ( 46    , message.default_sint64  ());\n  EXPECT_EQ( 47    , message.default_fixed32 ());\n  EXPECT_EQ( 48    , message.default_fixed64 ());\n  EXPECT_EQ( 49    , message.default_sfixed32());\n  EXPECT_EQ(-50    , message.default_sfixed64());\n  EXPECT_EQ( 51.5  , message.default_float   ());\n  EXPECT_EQ( 52e3  , message.default_double  ());\n  EXPECT_EQ(true   , message.default_bool    ());\n  EXPECT_EQ(\"hello\", message.default_string  ());\n  EXPECT_EQ(\"world\", message.default_bytes   ());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAR, message.default_nested_enum ());\n  EXPECT_EQ(unittest::FOREIGN_BAR      , message.default_foreign_enum());\n  EXPECT_EQ(unittest_import::IMPORT_BAR, message.default_import_enum ());\n\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ExpectRepeatedFieldsModified(\n    const unittest::TestAllTypes& message) {\n  // ModifyRepeatedFields only sets the second repeated element of each\n  // field.  In addition to verifying this, we also verify that the first\n  // element and size were *not* modified.\n  ASSERT_EQ(2, message.repeated_int32_size   ());\n  ASSERT_EQ(2, message.repeated_int64_size   ());\n  ASSERT_EQ(2, message.repeated_uint32_size  ());\n  ASSERT_EQ(2, message.repeated_uint64_size  ());\n  ASSERT_EQ(2, message.repeated_sint32_size  ());\n  ASSERT_EQ(2, message.repeated_sint64_size  ());\n  ASSERT_EQ(2, message.repeated_fixed32_size ());\n  ASSERT_EQ(2, message.repeated_fixed64_size ());\n  ASSERT_EQ(2, message.repeated_sfixed32_size());\n  ASSERT_EQ(2, message.repeated_sfixed64_size());\n  ASSERT_EQ(2, message.repeated_float_size   ());\n  ASSERT_EQ(2, message.repeated_double_size  ());\n  ASSERT_EQ(2, message.repeated_bool_size    ());\n  ASSERT_EQ(2, message.repeated_string_size  ());\n  ASSERT_EQ(2, message.repeated_bytes_size   ());\n\n  ASSERT_EQ(2, message.repeatedgroup_size           ());\n  ASSERT_EQ(2, message.repeated_nested_message_size ());\n  ASSERT_EQ(2, message.repeated_foreign_message_size());\n  ASSERT_EQ(2, message.repeated_import_message_size ());\n  ASSERT_EQ(2, message.repeated_nested_enum_size    ());\n  ASSERT_EQ(2, message.repeated_foreign_enum_size   ());\n  ASSERT_EQ(2, message.repeated_import_enum_size    ());\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n  ASSERT_EQ(2, message.repeated_string_piece_size());\n  ASSERT_EQ(2, message.repeated_cord_size());\n#endif\n\n  EXPECT_EQ(201  , message.repeated_int32   (0));\n  EXPECT_EQ(202  , message.repeated_int64   (0));\n  EXPECT_EQ(203  , message.repeated_uint32  (0));\n  EXPECT_EQ(204  , message.repeated_uint64  (0));\n  EXPECT_EQ(205  , message.repeated_sint32  (0));\n  EXPECT_EQ(206  , message.repeated_sint64  (0));\n  EXPECT_EQ(207  , message.repeated_fixed32 (0));\n  EXPECT_EQ(208  , message.repeated_fixed64 (0));\n  EXPECT_EQ(209  , message.repeated_sfixed32(0));\n  EXPECT_EQ(210  , message.repeated_sfixed64(0));\n  EXPECT_EQ(211  , message.repeated_float   (0));\n  EXPECT_EQ(212  , message.repeated_double  (0));\n  EXPECT_EQ(true , message.repeated_bool    (0));\n  EXPECT_EQ(\"215\", message.repeated_string  (0));\n  EXPECT_EQ(\"216\", message.repeated_bytes   (0));\n\n  EXPECT_EQ(217, message.repeatedgroup           (0).a());\n  EXPECT_EQ(218, message.repeated_nested_message (0).bb());\n  EXPECT_EQ(219, message.repeated_foreign_message(0).c());\n  EXPECT_EQ(220, message.repeated_import_message (0).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (0));\n  EXPECT_EQ(unittest::FOREIGN_BAR      , message.repeated_foreign_enum(0));\n  EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (0));\n\n\n  // Actually verify the second (modified) elements now.\n  EXPECT_EQ(501  , message.repeated_int32   (1));\n  EXPECT_EQ(502  , message.repeated_int64   (1));\n  EXPECT_EQ(503  , message.repeated_uint32  (1));\n  EXPECT_EQ(504  , message.repeated_uint64  (1));\n  EXPECT_EQ(505  , message.repeated_sint32  (1));\n  EXPECT_EQ(506  , message.repeated_sint64  (1));\n  EXPECT_EQ(507  , message.repeated_fixed32 (1));\n  EXPECT_EQ(508  , message.repeated_fixed64 (1));\n  EXPECT_EQ(509  , message.repeated_sfixed32(1));\n  EXPECT_EQ(510  , message.repeated_sfixed64(1));\n  EXPECT_EQ(511  , message.repeated_float   (1));\n  EXPECT_EQ(512  , message.repeated_double  (1));\n  EXPECT_EQ(true , message.repeated_bool    (1));\n  EXPECT_EQ(\"515\", message.repeated_string  (1));\n  EXPECT_EQ(\"516\", message.repeated_bytes   (1));\n\n  EXPECT_EQ(517, message.repeatedgroup           (1).a());\n  EXPECT_EQ(518, message.repeated_nested_message (1).bb());\n  EXPECT_EQ(519, message.repeated_foreign_message(1).c());\n  EXPECT_EQ(520, message.repeated_import_message (1).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::FOO, message.repeated_nested_enum (1));\n  EXPECT_EQ(unittest::FOREIGN_FOO      , message.repeated_foreign_enum(1));\n  EXPECT_EQ(unittest_import::IMPORT_FOO, message.repeated_import_enum (1));\n\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::SetPackedFields(unittest::TestPackedTypes* message) {\n  message->add_packed_int32   (601);\n  message->add_packed_int64   (602);\n  message->add_packed_uint32  (603);\n  message->add_packed_uint64  (604);\n  message->add_packed_sint32  (605);\n  message->add_packed_sint64  (606);\n  message->add_packed_fixed32 (607);\n  message->add_packed_fixed64 (608);\n  message->add_packed_sfixed32(609);\n  message->add_packed_sfixed64(610);\n  message->add_packed_float   (611);\n  message->add_packed_double  (612);\n  message->add_packed_bool    (true);\n  message->add_packed_enum    (unittest::FOREIGN_BAR);\n  // add a second one of each field\n  message->add_packed_int32   (701);\n  message->add_packed_int64   (702);\n  message->add_packed_uint32  (703);\n  message->add_packed_uint64  (704);\n  message->add_packed_sint32  (705);\n  message->add_packed_sint64  (706);\n  message->add_packed_fixed32 (707);\n  message->add_packed_fixed64 (708);\n  message->add_packed_sfixed32(709);\n  message->add_packed_sfixed64(710);\n  message->add_packed_float   (711);\n  message->add_packed_double  (712);\n  message->add_packed_bool    (false);\n  message->add_packed_enum    (unittest::FOREIGN_BAZ);\n}\n\nvoid TestUtil::SetUnpackedFields(unittest::TestUnpackedTypes* message) {\n  // The values applied here must match those of SetPackedFields.\n\n  message->add_unpacked_int32   (601);\n  message->add_unpacked_int64   (602);\n  message->add_unpacked_uint32  (603);\n  message->add_unpacked_uint64  (604);\n  message->add_unpacked_sint32  (605);\n  message->add_unpacked_sint64  (606);\n  message->add_unpacked_fixed32 (607);\n  message->add_unpacked_fixed64 (608);\n  message->add_unpacked_sfixed32(609);\n  message->add_unpacked_sfixed64(610);\n  message->add_unpacked_float   (611);\n  message->add_unpacked_double  (612);\n  message->add_unpacked_bool    (true);\n  message->add_unpacked_enum    (unittest::FOREIGN_BAR);\n  // add a second one of each field\n  message->add_unpacked_int32   (701);\n  message->add_unpacked_int64   (702);\n  message->add_unpacked_uint32  (703);\n  message->add_unpacked_uint64  (704);\n  message->add_unpacked_sint32  (705);\n  message->add_unpacked_sint64  (706);\n  message->add_unpacked_fixed32 (707);\n  message->add_unpacked_fixed64 (708);\n  message->add_unpacked_sfixed32(709);\n  message->add_unpacked_sfixed64(710);\n  message->add_unpacked_float   (711);\n  message->add_unpacked_double  (712);\n  message->add_unpacked_bool    (false);\n  message->add_unpacked_enum    (unittest::FOREIGN_BAZ);\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ModifyPackedFields(unittest::TestPackedTypes* message) {\n  message->set_packed_int32   (1, 801);\n  message->set_packed_int64   (1, 802);\n  message->set_packed_uint32  (1, 803);\n  message->set_packed_uint64  (1, 804);\n  message->set_packed_sint32  (1, 805);\n  message->set_packed_sint64  (1, 806);\n  message->set_packed_fixed32 (1, 807);\n  message->set_packed_fixed64 (1, 808);\n  message->set_packed_sfixed32(1, 809);\n  message->set_packed_sfixed64(1, 810);\n  message->set_packed_float   (1, 811);\n  message->set_packed_double  (1, 812);\n  message->set_packed_bool    (1, true);\n  message->set_packed_enum    (1, unittest::FOREIGN_FOO);\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ExpectPackedFieldsSet(const unittest::TestPackedTypes& message) {\n  ASSERT_EQ(2, message.packed_int32_size   ());\n  ASSERT_EQ(2, message.packed_int64_size   ());\n  ASSERT_EQ(2, message.packed_uint32_size  ());\n  ASSERT_EQ(2, message.packed_uint64_size  ());\n  ASSERT_EQ(2, message.packed_sint32_size  ());\n  ASSERT_EQ(2, message.packed_sint64_size  ());\n  ASSERT_EQ(2, message.packed_fixed32_size ());\n  ASSERT_EQ(2, message.packed_fixed64_size ());\n  ASSERT_EQ(2, message.packed_sfixed32_size());\n  ASSERT_EQ(2, message.packed_sfixed64_size());\n  ASSERT_EQ(2, message.packed_float_size   ());\n  ASSERT_EQ(2, message.packed_double_size  ());\n  ASSERT_EQ(2, message.packed_bool_size    ());\n  ASSERT_EQ(2, message.packed_enum_size    ());\n\n  EXPECT_EQ(601  , message.packed_int32   (0));\n  EXPECT_EQ(602  , message.packed_int64   (0));\n  EXPECT_EQ(603  , message.packed_uint32  (0));\n  EXPECT_EQ(604  , message.packed_uint64  (0));\n  EXPECT_EQ(605  , message.packed_sint32  (0));\n  EXPECT_EQ(606  , message.packed_sint64  (0));\n  EXPECT_EQ(607  , message.packed_fixed32 (0));\n  EXPECT_EQ(608  , message.packed_fixed64 (0));\n  EXPECT_EQ(609  , message.packed_sfixed32(0));\n  EXPECT_EQ(610  , message.packed_sfixed64(0));\n  EXPECT_EQ(611  , message.packed_float   (0));\n  EXPECT_EQ(612  , message.packed_double  (0));\n  EXPECT_EQ(true , message.packed_bool    (0));\n  EXPECT_EQ(unittest::FOREIGN_BAR, message.packed_enum(0));\n\n  EXPECT_EQ(701  , message.packed_int32   (1));\n  EXPECT_EQ(702  , message.packed_int64   (1));\n  EXPECT_EQ(703  , message.packed_uint32  (1));\n  EXPECT_EQ(704  , message.packed_uint64  (1));\n  EXPECT_EQ(705  , message.packed_sint32  (1));\n  EXPECT_EQ(706  , message.packed_sint64  (1));\n  EXPECT_EQ(707  , message.packed_fixed32 (1));\n  EXPECT_EQ(708  , message.packed_fixed64 (1));\n  EXPECT_EQ(709  , message.packed_sfixed32(1));\n  EXPECT_EQ(710  , message.packed_sfixed64(1));\n  EXPECT_EQ(711  , message.packed_float   (1));\n  EXPECT_EQ(712  , message.packed_double  (1));\n  EXPECT_EQ(false, message.packed_bool    (1));\n  EXPECT_EQ(unittest::FOREIGN_BAZ, message.packed_enum(1));\n}\n\nvoid TestUtil::ExpectUnpackedFieldsSet(\n    const unittest::TestUnpackedTypes& message) {\n  // The values expected here must match those of ExpectPackedFieldsSet.\n\n  ASSERT_EQ(2, message.unpacked_int32_size   ());\n  ASSERT_EQ(2, message.unpacked_int64_size   ());\n  ASSERT_EQ(2, message.unpacked_uint32_size  ());\n  ASSERT_EQ(2, message.unpacked_uint64_size  ());\n  ASSERT_EQ(2, message.unpacked_sint32_size  ());\n  ASSERT_EQ(2, message.unpacked_sint64_size  ());\n  ASSERT_EQ(2, message.unpacked_fixed32_size ());\n  ASSERT_EQ(2, message.unpacked_fixed64_size ());\n  ASSERT_EQ(2, message.unpacked_sfixed32_size());\n  ASSERT_EQ(2, message.unpacked_sfixed64_size());\n  ASSERT_EQ(2, message.unpacked_float_size   ());\n  ASSERT_EQ(2, message.unpacked_double_size  ());\n  ASSERT_EQ(2, message.unpacked_bool_size    ());\n  ASSERT_EQ(2, message.unpacked_enum_size    ());\n\n  EXPECT_EQ(601  , message.unpacked_int32   (0));\n  EXPECT_EQ(602  , message.unpacked_int64   (0));\n  EXPECT_EQ(603  , message.unpacked_uint32  (0));\n  EXPECT_EQ(604  , message.unpacked_uint64  (0));\n  EXPECT_EQ(605  , message.unpacked_sint32  (0));\n  EXPECT_EQ(606  , message.unpacked_sint64  (0));\n  EXPECT_EQ(607  , message.unpacked_fixed32 (0));\n  EXPECT_EQ(608  , message.unpacked_fixed64 (0));\n  EXPECT_EQ(609  , message.unpacked_sfixed32(0));\n  EXPECT_EQ(610  , message.unpacked_sfixed64(0));\n  EXPECT_EQ(611  , message.unpacked_float   (0));\n  EXPECT_EQ(612  , message.unpacked_double  (0));\n  EXPECT_EQ(true , message.unpacked_bool    (0));\n  EXPECT_EQ(unittest::FOREIGN_BAR, message.unpacked_enum(0));\n\n  EXPECT_EQ(701  , message.unpacked_int32   (1));\n  EXPECT_EQ(702  , message.unpacked_int64   (1));\n  EXPECT_EQ(703  , message.unpacked_uint32  (1));\n  EXPECT_EQ(704  , message.unpacked_uint64  (1));\n  EXPECT_EQ(705  , message.unpacked_sint32  (1));\n  EXPECT_EQ(706  , message.unpacked_sint64  (1));\n  EXPECT_EQ(707  , message.unpacked_fixed32 (1));\n  EXPECT_EQ(708  , message.unpacked_fixed64 (1));\n  EXPECT_EQ(709  , message.unpacked_sfixed32(1));\n  EXPECT_EQ(710  , message.unpacked_sfixed64(1));\n  EXPECT_EQ(711  , message.unpacked_float   (1));\n  EXPECT_EQ(712  , message.unpacked_double  (1));\n  EXPECT_EQ(false, message.unpacked_bool    (1));\n  EXPECT_EQ(unittest::FOREIGN_BAZ, message.unpacked_enum(1));\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ExpectPackedClear(\n    const unittest::TestPackedTypes& message) {\n  // Packed repeated fields are empty.\n  EXPECT_EQ(0, message.packed_int32_size   ());\n  EXPECT_EQ(0, message.packed_int64_size   ());\n  EXPECT_EQ(0, message.packed_uint32_size  ());\n  EXPECT_EQ(0, message.packed_uint64_size  ());\n  EXPECT_EQ(0, message.packed_sint32_size  ());\n  EXPECT_EQ(0, message.packed_sint64_size  ());\n  EXPECT_EQ(0, message.packed_fixed32_size ());\n  EXPECT_EQ(0, message.packed_fixed64_size ());\n  EXPECT_EQ(0, message.packed_sfixed32_size());\n  EXPECT_EQ(0, message.packed_sfixed64_size());\n  EXPECT_EQ(0, message.packed_float_size   ());\n  EXPECT_EQ(0, message.packed_double_size  ());\n  EXPECT_EQ(0, message.packed_bool_size    ());\n  EXPECT_EQ(0, message.packed_enum_size    ());\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ExpectPackedFieldsModified(\n    const unittest::TestPackedTypes& message) {\n  // Do the same for packed repeated fields.\n  ASSERT_EQ(2, message.packed_int32_size   ());\n  ASSERT_EQ(2, message.packed_int64_size   ());\n  ASSERT_EQ(2, message.packed_uint32_size  ());\n  ASSERT_EQ(2, message.packed_uint64_size  ());\n  ASSERT_EQ(2, message.packed_sint32_size  ());\n  ASSERT_EQ(2, message.packed_sint64_size  ());\n  ASSERT_EQ(2, message.packed_fixed32_size ());\n  ASSERT_EQ(2, message.packed_fixed64_size ());\n  ASSERT_EQ(2, message.packed_sfixed32_size());\n  ASSERT_EQ(2, message.packed_sfixed64_size());\n  ASSERT_EQ(2, message.packed_float_size   ());\n  ASSERT_EQ(2, message.packed_double_size  ());\n  ASSERT_EQ(2, message.packed_bool_size    ());\n  ASSERT_EQ(2, message.packed_enum_size    ());\n\n  EXPECT_EQ(601  , message.packed_int32   (0));\n  EXPECT_EQ(602  , message.packed_int64   (0));\n  EXPECT_EQ(603  , message.packed_uint32  (0));\n  EXPECT_EQ(604  , message.packed_uint64  (0));\n  EXPECT_EQ(605  , message.packed_sint32  (0));\n  EXPECT_EQ(606  , message.packed_sint64  (0));\n  EXPECT_EQ(607  , message.packed_fixed32 (0));\n  EXPECT_EQ(608  , message.packed_fixed64 (0));\n  EXPECT_EQ(609  , message.packed_sfixed32(0));\n  EXPECT_EQ(610  , message.packed_sfixed64(0));\n  EXPECT_EQ(611  , message.packed_float   (0));\n  EXPECT_EQ(612  , message.packed_double  (0));\n  EXPECT_EQ(true , message.packed_bool    (0));\n  EXPECT_EQ(unittest::FOREIGN_BAR, message.packed_enum(0));\n  // Actually verify the second (modified) elements now.\n  EXPECT_EQ(801  , message.packed_int32   (1));\n  EXPECT_EQ(802  , message.packed_int64   (1));\n  EXPECT_EQ(803  , message.packed_uint32  (1));\n  EXPECT_EQ(804  , message.packed_uint64  (1));\n  EXPECT_EQ(805  , message.packed_sint32  (1));\n  EXPECT_EQ(806  , message.packed_sint64  (1));\n  EXPECT_EQ(807  , message.packed_fixed32 (1));\n  EXPECT_EQ(808  , message.packed_fixed64 (1));\n  EXPECT_EQ(809  , message.packed_sfixed32(1));\n  EXPECT_EQ(810  , message.packed_sfixed64(1));\n  EXPECT_EQ(811  , message.packed_float   (1));\n  EXPECT_EQ(812  , message.packed_double  (1));\n  EXPECT_EQ(true , message.packed_bool    (1));\n  EXPECT_EQ(unittest::FOREIGN_FOO, message.packed_enum(1));\n}\n\n// ===================================================================\n// Extensions\n//\n// All this code is exactly equivalent to the above code except that it's\n// manipulating extension fields instead of normal ones.\n//\n// I gave up on the 80-char limit here.  Sorry.\n\nvoid TestUtil::SetAllExtensions(unittest::TestAllExtensions* message) {\n  message->SetExtension(unittest::optional_int32_extension   , 101);\n  message->SetExtension(unittest::optional_int64_extension   , 102);\n  message->SetExtension(unittest::optional_uint32_extension  , 103);\n  message->SetExtension(unittest::optional_uint64_extension  , 104);\n  message->SetExtension(unittest::optional_sint32_extension  , 105);\n  message->SetExtension(unittest::optional_sint64_extension  , 106);\n  message->SetExtension(unittest::optional_fixed32_extension , 107);\n  message->SetExtension(unittest::optional_fixed64_extension , 108);\n  message->SetExtension(unittest::optional_sfixed32_extension, 109);\n  message->SetExtension(unittest::optional_sfixed64_extension, 110);\n  message->SetExtension(unittest::optional_float_extension   , 111);\n  message->SetExtension(unittest::optional_double_extension  , 112);\n  message->SetExtension(unittest::optional_bool_extension    , true);\n  message->SetExtension(unittest::optional_string_extension  , \"115\");\n  message->SetExtension(unittest::optional_bytes_extension   , \"116\");\n\n  message->MutableExtension(unittest::optionalgroup_extension           )->set_a(117);\n  message->MutableExtension(unittest::optional_nested_message_extension )->set_bb(118);\n  message->MutableExtension(unittest::optional_foreign_message_extension)->set_c(119);\n  message->MutableExtension(unittest::optional_import_message_extension )->set_d(120);\n\n  message->SetExtension(unittest::optional_nested_enum_extension , unittest::TestAllTypes::BAZ);\n  message->SetExtension(unittest::optional_foreign_enum_extension, unittest::FOREIGN_BAZ      );\n  message->SetExtension(unittest::optional_import_enum_extension , unittest_import::IMPORT_BAZ);\n\n  message->SetExtension(unittest::optional_string_piece_extension, \"124\");\n  message->SetExtension(unittest::optional_cord_extension, \"125\");\n\n  // -----------------------------------------------------------------\n\n  message->AddExtension(unittest::repeated_int32_extension   , 201);\n  message->AddExtension(unittest::repeated_int64_extension   , 202);\n  message->AddExtension(unittest::repeated_uint32_extension  , 203);\n  message->AddExtension(unittest::repeated_uint64_extension  , 204);\n  message->AddExtension(unittest::repeated_sint32_extension  , 205);\n  message->AddExtension(unittest::repeated_sint64_extension  , 206);\n  message->AddExtension(unittest::repeated_fixed32_extension , 207);\n  message->AddExtension(unittest::repeated_fixed64_extension , 208);\n  message->AddExtension(unittest::repeated_sfixed32_extension, 209);\n  message->AddExtension(unittest::repeated_sfixed64_extension, 210);\n  message->AddExtension(unittest::repeated_float_extension   , 211);\n  message->AddExtension(unittest::repeated_double_extension  , 212);\n  message->AddExtension(unittest::repeated_bool_extension    , true);\n  message->AddExtension(unittest::repeated_string_extension  , \"215\");\n  message->AddExtension(unittest::repeated_bytes_extension   , \"216\");\n\n  message->AddExtension(unittest::repeatedgroup_extension           )->set_a(217);\n  message->AddExtension(unittest::repeated_nested_message_extension )->set_bb(218);\n  message->AddExtension(unittest::repeated_foreign_message_extension)->set_c(219);\n  message->AddExtension(unittest::repeated_import_message_extension )->set_d(220);\n\n  message->AddExtension(unittest::repeated_nested_enum_extension , unittest::TestAllTypes::BAR);\n  message->AddExtension(unittest::repeated_foreign_enum_extension, unittest::FOREIGN_BAR      );\n  message->AddExtension(unittest::repeated_import_enum_extension , unittest_import::IMPORT_BAR);\n\n  message->AddExtension(unittest::repeated_string_piece_extension, \"224\");\n  message->AddExtension(unittest::repeated_cord_extension, \"225\");\n\n  // Add a second one of each field.\n  message->AddExtension(unittest::repeated_int32_extension   , 301);\n  message->AddExtension(unittest::repeated_int64_extension   , 302);\n  message->AddExtension(unittest::repeated_uint32_extension  , 303);\n  message->AddExtension(unittest::repeated_uint64_extension  , 304);\n  message->AddExtension(unittest::repeated_sint32_extension  , 305);\n  message->AddExtension(unittest::repeated_sint64_extension  , 306);\n  message->AddExtension(unittest::repeated_fixed32_extension , 307);\n  message->AddExtension(unittest::repeated_fixed64_extension , 308);\n  message->AddExtension(unittest::repeated_sfixed32_extension, 309);\n  message->AddExtension(unittest::repeated_sfixed64_extension, 310);\n  message->AddExtension(unittest::repeated_float_extension   , 311);\n  message->AddExtension(unittest::repeated_double_extension  , 312);\n  message->AddExtension(unittest::repeated_bool_extension    , false);\n  message->AddExtension(unittest::repeated_string_extension  , \"315\");\n  message->AddExtension(unittest::repeated_bytes_extension   , \"316\");\n\n  message->AddExtension(unittest::repeatedgroup_extension           )->set_a(317);\n  message->AddExtension(unittest::repeated_nested_message_extension )->set_bb(318);\n  message->AddExtension(unittest::repeated_foreign_message_extension)->set_c(319);\n  message->AddExtension(unittest::repeated_import_message_extension )->set_d(320);\n\n  message->AddExtension(unittest::repeated_nested_enum_extension , unittest::TestAllTypes::BAZ);\n  message->AddExtension(unittest::repeated_foreign_enum_extension, unittest::FOREIGN_BAZ      );\n  message->AddExtension(unittest::repeated_import_enum_extension , unittest_import::IMPORT_BAZ);\n\n  message->AddExtension(unittest::repeated_string_piece_extension, \"324\");\n  message->AddExtension(unittest::repeated_cord_extension, \"325\");\n\n  // -----------------------------------------------------------------\n\n  message->SetExtension(unittest::default_int32_extension   , 401);\n  message->SetExtension(unittest::default_int64_extension   , 402);\n  message->SetExtension(unittest::default_uint32_extension  , 403);\n  message->SetExtension(unittest::default_uint64_extension  , 404);\n  message->SetExtension(unittest::default_sint32_extension  , 405);\n  message->SetExtension(unittest::default_sint64_extension  , 406);\n  message->SetExtension(unittest::default_fixed32_extension , 407);\n  message->SetExtension(unittest::default_fixed64_extension , 408);\n  message->SetExtension(unittest::default_sfixed32_extension, 409);\n  message->SetExtension(unittest::default_sfixed64_extension, 410);\n  message->SetExtension(unittest::default_float_extension   , 411);\n  message->SetExtension(unittest::default_double_extension  , 412);\n  message->SetExtension(unittest::default_bool_extension    , false);\n  message->SetExtension(unittest::default_string_extension  , \"415\");\n  message->SetExtension(unittest::default_bytes_extension   , \"416\");\n\n  message->SetExtension(unittest::default_nested_enum_extension , unittest::TestAllTypes::FOO);\n  message->SetExtension(unittest::default_foreign_enum_extension, unittest::FOREIGN_FOO      );\n  message->SetExtension(unittest::default_import_enum_extension , unittest_import::IMPORT_FOO);\n\n  message->SetExtension(unittest::default_string_piece_extension, \"424\");\n  message->SetExtension(unittest::default_cord_extension, \"425\");\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::SetAllFieldsAndExtensions(\n    unittest::TestFieldOrderings* message) {\n  GOOGLE_CHECK(message);\n  message->set_my_int(1);\n  message->set_my_string(\"foo\");\n  message->set_my_float(1.0);\n  message->SetExtension(unittest::my_extension_int, 23);\n  message->SetExtension(unittest::my_extension_string, \"bar\");\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ModifyRepeatedExtensions(unittest::TestAllExtensions* message) {\n  message->SetExtension(unittest::repeated_int32_extension   , 1, 501);\n  message->SetExtension(unittest::repeated_int64_extension   , 1, 502);\n  message->SetExtension(unittest::repeated_uint32_extension  , 1, 503);\n  message->SetExtension(unittest::repeated_uint64_extension  , 1, 504);\n  message->SetExtension(unittest::repeated_sint32_extension  , 1, 505);\n  message->SetExtension(unittest::repeated_sint64_extension  , 1, 506);\n  message->SetExtension(unittest::repeated_fixed32_extension , 1, 507);\n  message->SetExtension(unittest::repeated_fixed64_extension , 1, 508);\n  message->SetExtension(unittest::repeated_sfixed32_extension, 1, 509);\n  message->SetExtension(unittest::repeated_sfixed64_extension, 1, 510);\n  message->SetExtension(unittest::repeated_float_extension   , 1, 511);\n  message->SetExtension(unittest::repeated_double_extension  , 1, 512);\n  message->SetExtension(unittest::repeated_bool_extension    , 1, true);\n  message->SetExtension(unittest::repeated_string_extension  , 1, \"515\");\n  message->SetExtension(unittest::repeated_bytes_extension   , 1, \"516\");\n\n  message->MutableExtension(unittest::repeatedgroup_extension           , 1)->set_a(517);\n  message->MutableExtension(unittest::repeated_nested_message_extension , 1)->set_bb(518);\n  message->MutableExtension(unittest::repeated_foreign_message_extension, 1)->set_c(519);\n  message->MutableExtension(unittest::repeated_import_message_extension , 1)->set_d(520);\n\n  message->SetExtension(unittest::repeated_nested_enum_extension , 1, unittest::TestAllTypes::FOO);\n  message->SetExtension(unittest::repeated_foreign_enum_extension, 1, unittest::FOREIGN_FOO      );\n  message->SetExtension(unittest::repeated_import_enum_extension , 1, unittest_import::IMPORT_FOO);\n\n  message->SetExtension(unittest::repeated_string_piece_extension, 1, \"524\");\n  message->SetExtension(unittest::repeated_cord_extension, 1, \"525\");\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ExpectAllExtensionsSet(\n    const unittest::TestAllExtensions& message) {\n  EXPECT_TRUE(message.HasExtension(unittest::optional_int32_extension   ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_int64_extension   ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_uint32_extension  ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_uint64_extension  ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_sint32_extension  ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_sint64_extension  ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_fixed32_extension ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_fixed64_extension ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed32_extension));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed64_extension));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_float_extension   ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_double_extension  ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_bool_extension    ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_string_extension  ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_bytes_extension   ));\n\n  EXPECT_TRUE(message.HasExtension(unittest::optionalgroup_extension           ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_nested_message_extension ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_message_extension));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_import_message_extension ));\n\n  EXPECT_TRUE(message.GetExtension(unittest::optionalgroup_extension           ).has_a());\n  EXPECT_TRUE(message.GetExtension(unittest::optional_nested_message_extension ).has_bb());\n  EXPECT_TRUE(message.GetExtension(unittest::optional_foreign_message_extension).has_c());\n  EXPECT_TRUE(message.GetExtension(unittest::optional_import_message_extension ).has_d());\n\n  EXPECT_TRUE(message.HasExtension(unittest::optional_nested_enum_extension ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_enum_extension));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_import_enum_extension ));\n\n  EXPECT_TRUE(message.HasExtension(unittest::optional_string_piece_extension));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_cord_extension));\n\n  EXPECT_EQ(101  , message.GetExtension(unittest::optional_int32_extension   ));\n  EXPECT_EQ(102  , message.GetExtension(unittest::optional_int64_extension   ));\n  EXPECT_EQ(103  , message.GetExtension(unittest::optional_uint32_extension  ));\n  EXPECT_EQ(104  , message.GetExtension(unittest::optional_uint64_extension  ));\n  EXPECT_EQ(105  , message.GetExtension(unittest::optional_sint32_extension  ));\n  EXPECT_EQ(106  , message.GetExtension(unittest::optional_sint64_extension  ));\n  EXPECT_EQ(107  , message.GetExtension(unittest::optional_fixed32_extension ));\n  EXPECT_EQ(108  , message.GetExtension(unittest::optional_fixed64_extension ));\n  EXPECT_EQ(109  , message.GetExtension(unittest::optional_sfixed32_extension));\n  EXPECT_EQ(110  , message.GetExtension(unittest::optional_sfixed64_extension));\n  EXPECT_EQ(111  , message.GetExtension(unittest::optional_float_extension   ));\n  EXPECT_EQ(112  , message.GetExtension(unittest::optional_double_extension  ));\n  EXPECT_EQ(true , message.GetExtension(unittest::optional_bool_extension    ));\n  EXPECT_EQ(\"115\", message.GetExtension(unittest::optional_string_extension  ));\n  EXPECT_EQ(\"116\", message.GetExtension(unittest::optional_bytes_extension   ));\n\n  EXPECT_EQ(117, message.GetExtension(unittest::optionalgroup_extension           ).a());\n  EXPECT_EQ(118, message.GetExtension(unittest::optional_nested_message_extension ).bb());\n  EXPECT_EQ(119, message.GetExtension(unittest::optional_foreign_message_extension).c());\n  EXPECT_EQ(120, message.GetExtension(unittest::optional_import_message_extension ).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAZ, message.GetExtension(unittest::optional_nested_enum_extension ));\n  EXPECT_EQ(unittest::FOREIGN_BAZ      , message.GetExtension(unittest::optional_foreign_enum_extension));\n  EXPECT_EQ(unittest_import::IMPORT_BAZ, message.GetExtension(unittest::optional_import_enum_extension ));\n\n  EXPECT_EQ(\"124\", message.GetExtension(unittest::optional_string_piece_extension));\n  EXPECT_EQ(\"125\", message.GetExtension(unittest::optional_cord_extension));\n\n  // -----------------------------------------------------------------\n\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension   ));\n\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension           ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension    ));\n\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_piece_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_cord_extension));\n\n  EXPECT_EQ(201  , message.GetExtension(unittest::repeated_int32_extension   , 0));\n  EXPECT_EQ(202  , message.GetExtension(unittest::repeated_int64_extension   , 0));\n  EXPECT_EQ(203  , message.GetExtension(unittest::repeated_uint32_extension  , 0));\n  EXPECT_EQ(204  , message.GetExtension(unittest::repeated_uint64_extension  , 0));\n  EXPECT_EQ(205  , message.GetExtension(unittest::repeated_sint32_extension  , 0));\n  EXPECT_EQ(206  , message.GetExtension(unittest::repeated_sint64_extension  , 0));\n  EXPECT_EQ(207  , message.GetExtension(unittest::repeated_fixed32_extension , 0));\n  EXPECT_EQ(208  , message.GetExtension(unittest::repeated_fixed64_extension , 0));\n  EXPECT_EQ(209  , message.GetExtension(unittest::repeated_sfixed32_extension, 0));\n  EXPECT_EQ(210  , message.GetExtension(unittest::repeated_sfixed64_extension, 0));\n  EXPECT_EQ(211  , message.GetExtension(unittest::repeated_float_extension   , 0));\n  EXPECT_EQ(212  , message.GetExtension(unittest::repeated_double_extension  , 0));\n  EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension    , 0));\n  EXPECT_EQ(\"215\", message.GetExtension(unittest::repeated_string_extension  , 0));\n  EXPECT_EQ(\"216\", message.GetExtension(unittest::repeated_bytes_extension   , 0));\n\n  EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension           , 0).a());\n  EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb());\n  EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c());\n  EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 0));\n  EXPECT_EQ(unittest::FOREIGN_BAR      , message.GetExtension(unittest::repeated_foreign_enum_extension, 0));\n  EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 0));\n\n  EXPECT_EQ(\"224\", message.GetExtension(unittest::repeated_string_piece_extension, 0));\n  EXPECT_EQ(\"225\", message.GetExtension(unittest::repeated_cord_extension, 0));\n\n  EXPECT_EQ(301  , message.GetExtension(unittest::repeated_int32_extension   , 1));\n  EXPECT_EQ(302  , message.GetExtension(unittest::repeated_int64_extension   , 1));\n  EXPECT_EQ(303  , message.GetExtension(unittest::repeated_uint32_extension  , 1));\n  EXPECT_EQ(304  , message.GetExtension(unittest::repeated_uint64_extension  , 1));\n  EXPECT_EQ(305  , message.GetExtension(unittest::repeated_sint32_extension  , 1));\n  EXPECT_EQ(306  , message.GetExtension(unittest::repeated_sint64_extension  , 1));\n  EXPECT_EQ(307  , message.GetExtension(unittest::repeated_fixed32_extension , 1));\n  EXPECT_EQ(308  , message.GetExtension(unittest::repeated_fixed64_extension , 1));\n  EXPECT_EQ(309  , message.GetExtension(unittest::repeated_sfixed32_extension, 1));\n  EXPECT_EQ(310  , message.GetExtension(unittest::repeated_sfixed64_extension, 1));\n  EXPECT_EQ(311  , message.GetExtension(unittest::repeated_float_extension   , 1));\n  EXPECT_EQ(312  , message.GetExtension(unittest::repeated_double_extension  , 1));\n  EXPECT_EQ(false, message.GetExtension(unittest::repeated_bool_extension    , 1));\n  EXPECT_EQ(\"315\", message.GetExtension(unittest::repeated_string_extension  , 1));\n  EXPECT_EQ(\"316\", message.GetExtension(unittest::repeated_bytes_extension   , 1));\n\n  EXPECT_EQ(317, message.GetExtension(unittest::repeatedgroup_extension           , 1).a());\n  EXPECT_EQ(318, message.GetExtension(unittest::repeated_nested_message_extension , 1).bb());\n  EXPECT_EQ(319, message.GetExtension(unittest::repeated_foreign_message_extension, 1).c());\n  EXPECT_EQ(320, message.GetExtension(unittest::repeated_import_message_extension , 1).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAZ, message.GetExtension(unittest::repeated_nested_enum_extension , 1));\n  EXPECT_EQ(unittest::FOREIGN_BAZ      , message.GetExtension(unittest::repeated_foreign_enum_extension, 1));\n  EXPECT_EQ(unittest_import::IMPORT_BAZ, message.GetExtension(unittest::repeated_import_enum_extension , 1));\n\n  EXPECT_EQ(\"324\", message.GetExtension(unittest::repeated_string_piece_extension, 1));\n  EXPECT_EQ(\"325\", message.GetExtension(unittest::repeated_cord_extension, 1));\n\n  // -----------------------------------------------------------------\n\n  EXPECT_TRUE(message.HasExtension(unittest::default_int32_extension   ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_int64_extension   ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_uint32_extension  ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_uint64_extension  ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_sint32_extension  ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_sint64_extension  ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_fixed32_extension ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_fixed64_extension ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_sfixed32_extension));\n  EXPECT_TRUE(message.HasExtension(unittest::default_sfixed64_extension));\n  EXPECT_TRUE(message.HasExtension(unittest::default_float_extension   ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_double_extension  ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_bool_extension    ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_string_extension  ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_bytes_extension   ));\n\n  EXPECT_TRUE(message.HasExtension(unittest::default_nested_enum_extension ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_foreign_enum_extension));\n  EXPECT_TRUE(message.HasExtension(unittest::default_import_enum_extension ));\n\n  EXPECT_TRUE(message.HasExtension(unittest::default_string_piece_extension));\n  EXPECT_TRUE(message.HasExtension(unittest::default_cord_extension));\n\n  EXPECT_EQ(401  , message.GetExtension(unittest::default_int32_extension   ));\n  EXPECT_EQ(402  , message.GetExtension(unittest::default_int64_extension   ));\n  EXPECT_EQ(403  , message.GetExtension(unittest::default_uint32_extension  ));\n  EXPECT_EQ(404  , message.GetExtension(unittest::default_uint64_extension  ));\n  EXPECT_EQ(405  , message.GetExtension(unittest::default_sint32_extension  ));\n  EXPECT_EQ(406  , message.GetExtension(unittest::default_sint64_extension  ));\n  EXPECT_EQ(407  , message.GetExtension(unittest::default_fixed32_extension ));\n  EXPECT_EQ(408  , message.GetExtension(unittest::default_fixed64_extension ));\n  EXPECT_EQ(409  , message.GetExtension(unittest::default_sfixed32_extension));\n  EXPECT_EQ(410  , message.GetExtension(unittest::default_sfixed64_extension));\n  EXPECT_EQ(411  , message.GetExtension(unittest::default_float_extension   ));\n  EXPECT_EQ(412  , message.GetExtension(unittest::default_double_extension  ));\n  EXPECT_EQ(false, message.GetExtension(unittest::default_bool_extension    ));\n  EXPECT_EQ(\"415\", message.GetExtension(unittest::default_string_extension  ));\n  EXPECT_EQ(\"416\", message.GetExtension(unittest::default_bytes_extension   ));\n\n  EXPECT_EQ(unittest::TestAllTypes::FOO, message.GetExtension(unittest::default_nested_enum_extension ));\n  EXPECT_EQ(unittest::FOREIGN_FOO      , message.GetExtension(unittest::default_foreign_enum_extension));\n  EXPECT_EQ(unittest_import::IMPORT_FOO, message.GetExtension(unittest::default_import_enum_extension ));\n\n  EXPECT_EQ(\"424\", message.GetExtension(unittest::default_string_piece_extension));\n  EXPECT_EQ(\"425\", message.GetExtension(unittest::default_cord_extension));\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ExpectExtensionsClear(\n    const unittest::TestAllExtensions& message) {\n  string serialized;\n  ASSERT_TRUE(message.SerializeToString(&serialized));\n  EXPECT_EQ(\"\", serialized);\n  EXPECT_EQ(0, message.ByteSize());\n\n  // has_blah() should initially be false for all optional fields.\n  EXPECT_FALSE(message.HasExtension(unittest::optional_int32_extension   ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_int64_extension   ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_uint32_extension  ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_uint64_extension  ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_sint32_extension  ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_sint64_extension  ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_fixed32_extension ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_fixed64_extension ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed32_extension));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed64_extension));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_float_extension   ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_double_extension  ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_bool_extension    ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_string_extension  ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_bytes_extension   ));\n\n  EXPECT_FALSE(message.HasExtension(unittest::optionalgroup_extension           ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_nested_message_extension ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_message_extension));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_import_message_extension ));\n\n  EXPECT_FALSE(message.HasExtension(unittest::optional_nested_enum_extension ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_enum_extension));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_import_enum_extension ));\n\n  EXPECT_FALSE(message.HasExtension(unittest::optional_string_piece_extension));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_cord_extension));\n\n  // Optional fields without defaults are set to zero or something like it.\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_int32_extension   ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_int64_extension   ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_uint32_extension  ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_uint64_extension  ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_sint32_extension  ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_sint64_extension  ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_fixed32_extension ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_fixed64_extension ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_sfixed32_extension));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_sfixed64_extension));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_float_extension   ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_double_extension  ));\n  EXPECT_EQ(false, message.GetExtension(unittest::optional_bool_extension    ));\n  EXPECT_EQ(\"\"   , message.GetExtension(unittest::optional_string_extension  ));\n  EXPECT_EQ(\"\"   , message.GetExtension(unittest::optional_bytes_extension   ));\n\n  // Embedded messages should also be clear.\n  EXPECT_FALSE(message.GetExtension(unittest::optionalgroup_extension           ).has_a());\n  EXPECT_FALSE(message.GetExtension(unittest::optional_nested_message_extension ).has_bb());\n  EXPECT_FALSE(message.GetExtension(unittest::optional_foreign_message_extension).has_c());\n  EXPECT_FALSE(message.GetExtension(unittest::optional_import_message_extension ).has_d());\n\n  EXPECT_EQ(0, message.GetExtension(unittest::optionalgroup_extension           ).a());\n  EXPECT_EQ(0, message.GetExtension(unittest::optional_nested_message_extension ).bb());\n  EXPECT_EQ(0, message.GetExtension(unittest::optional_foreign_message_extension).c());\n  EXPECT_EQ(0, message.GetExtension(unittest::optional_import_message_extension ).d());\n\n  // Enums without defaults are set to the first value in the enum.\n  EXPECT_EQ(unittest::TestAllTypes::FOO, message.GetExtension(unittest::optional_nested_enum_extension ));\n  EXPECT_EQ(unittest::FOREIGN_FOO      , message.GetExtension(unittest::optional_foreign_enum_extension));\n  EXPECT_EQ(unittest_import::IMPORT_FOO, message.GetExtension(unittest::optional_import_enum_extension ));\n\n  EXPECT_EQ(\"\", message.GetExtension(unittest::optional_string_piece_extension));\n  EXPECT_EQ(\"\", message.GetExtension(unittest::optional_cord_extension));\n\n  // Repeated fields are empty.\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int32_extension   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int64_extension   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint32_extension  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint64_extension  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint32_extension  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint64_extension  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed32_extension ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed64_extension ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed32_extension));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed64_extension));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_float_extension   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_double_extension  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bool_extension    ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_string_extension  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bytes_extension   ));\n\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeatedgroup_extension           ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_message_extension ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_message_extension));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_message_extension ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_enum_extension    ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_enum_extension   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_enum_extension    ));\n\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_string_piece_extension));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_cord_extension));\n\n  // has_blah() should also be false for all default fields.\n  EXPECT_FALSE(message.HasExtension(unittest::default_int32_extension   ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_int64_extension   ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_uint32_extension  ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_uint64_extension  ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_sint32_extension  ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_sint64_extension  ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_fixed32_extension ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_fixed64_extension ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_sfixed32_extension));\n  EXPECT_FALSE(message.HasExtension(unittest::default_sfixed64_extension));\n  EXPECT_FALSE(message.HasExtension(unittest::default_float_extension   ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_double_extension  ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_bool_extension    ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_string_extension  ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_bytes_extension   ));\n\n  EXPECT_FALSE(message.HasExtension(unittest::default_nested_enum_extension ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_foreign_enum_extension));\n  EXPECT_FALSE(message.HasExtension(unittest::default_import_enum_extension ));\n\n  EXPECT_FALSE(message.HasExtension(unittest::default_string_piece_extension));\n  EXPECT_FALSE(message.HasExtension(unittest::default_cord_extension));\n\n  // Fields with defaults have their default values (duh).\n  EXPECT_EQ( 41    , message.GetExtension(unittest::default_int32_extension   ));\n  EXPECT_EQ( 42    , message.GetExtension(unittest::default_int64_extension   ));\n  EXPECT_EQ( 43    , message.GetExtension(unittest::default_uint32_extension  ));\n  EXPECT_EQ( 44    , message.GetExtension(unittest::default_uint64_extension  ));\n  EXPECT_EQ(-45    , message.GetExtension(unittest::default_sint32_extension  ));\n  EXPECT_EQ( 46    , message.GetExtension(unittest::default_sint64_extension  ));\n  EXPECT_EQ( 47    , message.GetExtension(unittest::default_fixed32_extension ));\n  EXPECT_EQ( 48    , message.GetExtension(unittest::default_fixed64_extension ));\n  EXPECT_EQ( 49    , message.GetExtension(unittest::default_sfixed32_extension));\n  EXPECT_EQ(-50    , message.GetExtension(unittest::default_sfixed64_extension));\n  EXPECT_EQ( 51.5  , message.GetExtension(unittest::default_float_extension   ));\n  EXPECT_EQ( 52e3  , message.GetExtension(unittest::default_double_extension  ));\n  EXPECT_EQ(true   , message.GetExtension(unittest::default_bool_extension    ));\n  EXPECT_EQ(\"hello\", message.GetExtension(unittest::default_string_extension  ));\n  EXPECT_EQ(\"world\", message.GetExtension(unittest::default_bytes_extension   ));\n\n  EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::default_nested_enum_extension ));\n  EXPECT_EQ(unittest::FOREIGN_BAR      , message.GetExtension(unittest::default_foreign_enum_extension));\n  EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::default_import_enum_extension ));\n\n  EXPECT_EQ(\"abc\", message.GetExtension(unittest::default_string_piece_extension));\n  EXPECT_EQ(\"123\", message.GetExtension(unittest::default_cord_extension));\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ExpectRepeatedExtensionsModified(\n    const unittest::TestAllExtensions& message) {\n  // ModifyRepeatedFields only sets the second repeated element of each\n  // field.  In addition to verifying this, we also verify that the first\n  // element and size were *not* modified.\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension   ));\n\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension           ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension    ));\n\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_piece_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_cord_extension));\n\n  EXPECT_EQ(201  , message.GetExtension(unittest::repeated_int32_extension   , 0));\n  EXPECT_EQ(202  , message.GetExtension(unittest::repeated_int64_extension   , 0));\n  EXPECT_EQ(203  , message.GetExtension(unittest::repeated_uint32_extension  , 0));\n  EXPECT_EQ(204  , message.GetExtension(unittest::repeated_uint64_extension  , 0));\n  EXPECT_EQ(205  , message.GetExtension(unittest::repeated_sint32_extension  , 0));\n  EXPECT_EQ(206  , message.GetExtension(unittest::repeated_sint64_extension  , 0));\n  EXPECT_EQ(207  , message.GetExtension(unittest::repeated_fixed32_extension , 0));\n  EXPECT_EQ(208  , message.GetExtension(unittest::repeated_fixed64_extension , 0));\n  EXPECT_EQ(209  , message.GetExtension(unittest::repeated_sfixed32_extension, 0));\n  EXPECT_EQ(210  , message.GetExtension(unittest::repeated_sfixed64_extension, 0));\n  EXPECT_EQ(211  , message.GetExtension(unittest::repeated_float_extension   , 0));\n  EXPECT_EQ(212  , message.GetExtension(unittest::repeated_double_extension  , 0));\n  EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension    , 0));\n  EXPECT_EQ(\"215\", message.GetExtension(unittest::repeated_string_extension  , 0));\n  EXPECT_EQ(\"216\", message.GetExtension(unittest::repeated_bytes_extension   , 0));\n\n  EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension           , 0).a());\n  EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb());\n  EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c());\n  EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 0));\n  EXPECT_EQ(unittest::FOREIGN_BAR      , message.GetExtension(unittest::repeated_foreign_enum_extension, 0));\n  EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 0));\n\n  EXPECT_EQ(\"224\", message.GetExtension(unittest::repeated_string_piece_extension, 0));\n  EXPECT_EQ(\"225\", message.GetExtension(unittest::repeated_cord_extension, 0));\n\n  // Actually verify the second (modified) elements now.\n  EXPECT_EQ(501  , message.GetExtension(unittest::repeated_int32_extension   , 1));\n  EXPECT_EQ(502  , message.GetExtension(unittest::repeated_int64_extension   , 1));\n  EXPECT_EQ(503  , message.GetExtension(unittest::repeated_uint32_extension  , 1));\n  EXPECT_EQ(504  , message.GetExtension(unittest::repeated_uint64_extension  , 1));\n  EXPECT_EQ(505  , message.GetExtension(unittest::repeated_sint32_extension  , 1));\n  EXPECT_EQ(506  , message.GetExtension(unittest::repeated_sint64_extension  , 1));\n  EXPECT_EQ(507  , message.GetExtension(unittest::repeated_fixed32_extension , 1));\n  EXPECT_EQ(508  , message.GetExtension(unittest::repeated_fixed64_extension , 1));\n  EXPECT_EQ(509  , message.GetExtension(unittest::repeated_sfixed32_extension, 1));\n  EXPECT_EQ(510  , message.GetExtension(unittest::repeated_sfixed64_extension, 1));\n  EXPECT_EQ(511  , message.GetExtension(unittest::repeated_float_extension   , 1));\n  EXPECT_EQ(512  , message.GetExtension(unittest::repeated_double_extension  , 1));\n  EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension    , 1));\n  EXPECT_EQ(\"515\", message.GetExtension(unittest::repeated_string_extension  , 1));\n  EXPECT_EQ(\"516\", message.GetExtension(unittest::repeated_bytes_extension   , 1));\n\n  EXPECT_EQ(517, message.GetExtension(unittest::repeatedgroup_extension           , 1).a());\n  EXPECT_EQ(518, message.GetExtension(unittest::repeated_nested_message_extension , 1).bb());\n  EXPECT_EQ(519, message.GetExtension(unittest::repeated_foreign_message_extension, 1).c());\n  EXPECT_EQ(520, message.GetExtension(unittest::repeated_import_message_extension , 1).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::FOO, message.GetExtension(unittest::repeated_nested_enum_extension , 1));\n  EXPECT_EQ(unittest::FOREIGN_FOO      , message.GetExtension(unittest::repeated_foreign_enum_extension, 1));\n  EXPECT_EQ(unittest_import::IMPORT_FOO, message.GetExtension(unittest::repeated_import_enum_extension , 1));\n\n  EXPECT_EQ(\"524\", message.GetExtension(unittest::repeated_string_piece_extension, 1));\n  EXPECT_EQ(\"525\", message.GetExtension(unittest::repeated_cord_extension, 1));\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::SetPackedExtensions(unittest::TestPackedExtensions* message) {\n  message->AddExtension(unittest::packed_int32_extension   , 601);\n  message->AddExtension(unittest::packed_int64_extension   , 602);\n  message->AddExtension(unittest::packed_uint32_extension  , 603);\n  message->AddExtension(unittest::packed_uint64_extension  , 604);\n  message->AddExtension(unittest::packed_sint32_extension  , 605);\n  message->AddExtension(unittest::packed_sint64_extension  , 606);\n  message->AddExtension(unittest::packed_fixed32_extension , 607);\n  message->AddExtension(unittest::packed_fixed64_extension , 608);\n  message->AddExtension(unittest::packed_sfixed32_extension, 609);\n  message->AddExtension(unittest::packed_sfixed64_extension, 610);\n  message->AddExtension(unittest::packed_float_extension   , 611);\n  message->AddExtension(unittest::packed_double_extension  , 612);\n  message->AddExtension(unittest::packed_bool_extension    , true);\n  message->AddExtension(unittest::packed_enum_extension, unittest::FOREIGN_BAR);\n  // add a second one of each field\n  message->AddExtension(unittest::packed_int32_extension   , 701);\n  message->AddExtension(unittest::packed_int64_extension   , 702);\n  message->AddExtension(unittest::packed_uint32_extension  , 703);\n  message->AddExtension(unittest::packed_uint64_extension  , 704);\n  message->AddExtension(unittest::packed_sint32_extension  , 705);\n  message->AddExtension(unittest::packed_sint64_extension  , 706);\n  message->AddExtension(unittest::packed_fixed32_extension , 707);\n  message->AddExtension(unittest::packed_fixed64_extension , 708);\n  message->AddExtension(unittest::packed_sfixed32_extension, 709);\n  message->AddExtension(unittest::packed_sfixed64_extension, 710);\n  message->AddExtension(unittest::packed_float_extension   , 711);\n  message->AddExtension(unittest::packed_double_extension  , 712);\n  message->AddExtension(unittest::packed_bool_extension    , false);\n  message->AddExtension(unittest::packed_enum_extension, unittest::FOREIGN_BAZ);\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ModifyPackedExtensions(unittest::TestPackedExtensions* message) {\n  message->SetExtension(unittest::packed_int32_extension   , 1, 801);\n  message->SetExtension(unittest::packed_int64_extension   , 1, 802);\n  message->SetExtension(unittest::packed_uint32_extension  , 1, 803);\n  message->SetExtension(unittest::packed_uint64_extension  , 1, 804);\n  message->SetExtension(unittest::packed_sint32_extension  , 1, 805);\n  message->SetExtension(unittest::packed_sint64_extension  , 1, 806);\n  message->SetExtension(unittest::packed_fixed32_extension , 1, 807);\n  message->SetExtension(unittest::packed_fixed64_extension , 1, 808);\n  message->SetExtension(unittest::packed_sfixed32_extension, 1, 809);\n  message->SetExtension(unittest::packed_sfixed64_extension, 1, 810);\n  message->SetExtension(unittest::packed_float_extension   , 1, 811);\n  message->SetExtension(unittest::packed_double_extension  , 1, 812);\n  message->SetExtension(unittest::packed_bool_extension    , 1, true);\n  message->SetExtension(unittest::packed_enum_extension    , 1,\n                        unittest::FOREIGN_FOO);\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ExpectPackedExtensionsSet(\n    const unittest::TestPackedExtensions& message) {\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension    ));\n\n  EXPECT_EQ(601  , message.GetExtension(unittest::packed_int32_extension   , 0));\n  EXPECT_EQ(602  , message.GetExtension(unittest::packed_int64_extension   , 0));\n  EXPECT_EQ(603  , message.GetExtension(unittest::packed_uint32_extension  , 0));\n  EXPECT_EQ(604  , message.GetExtension(unittest::packed_uint64_extension  , 0));\n  EXPECT_EQ(605  , message.GetExtension(unittest::packed_sint32_extension  , 0));\n  EXPECT_EQ(606  , message.GetExtension(unittest::packed_sint64_extension  , 0));\n  EXPECT_EQ(607  , message.GetExtension(unittest::packed_fixed32_extension , 0));\n  EXPECT_EQ(608  , message.GetExtension(unittest::packed_fixed64_extension , 0));\n  EXPECT_EQ(609  , message.GetExtension(unittest::packed_sfixed32_extension, 0));\n  EXPECT_EQ(610  , message.GetExtension(unittest::packed_sfixed64_extension, 0));\n  EXPECT_EQ(611  , message.GetExtension(unittest::packed_float_extension   , 0));\n  EXPECT_EQ(612  , message.GetExtension(unittest::packed_double_extension  , 0));\n  EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension    , 0));\n  EXPECT_EQ(unittest::FOREIGN_BAR,\n            message.GetExtension(unittest::packed_enum_extension, 0));\n  EXPECT_EQ(701  , message.GetExtension(unittest::packed_int32_extension   , 1));\n  EXPECT_EQ(702  , message.GetExtension(unittest::packed_int64_extension   , 1));\n  EXPECT_EQ(703  , message.GetExtension(unittest::packed_uint32_extension  , 1));\n  EXPECT_EQ(704  , message.GetExtension(unittest::packed_uint64_extension  , 1));\n  EXPECT_EQ(705  , message.GetExtension(unittest::packed_sint32_extension  , 1));\n  EXPECT_EQ(706  , message.GetExtension(unittest::packed_sint64_extension  , 1));\n  EXPECT_EQ(707  , message.GetExtension(unittest::packed_fixed32_extension , 1));\n  EXPECT_EQ(708  , message.GetExtension(unittest::packed_fixed64_extension , 1));\n  EXPECT_EQ(709  , message.GetExtension(unittest::packed_sfixed32_extension, 1));\n  EXPECT_EQ(710  , message.GetExtension(unittest::packed_sfixed64_extension, 1));\n  EXPECT_EQ(711  , message.GetExtension(unittest::packed_float_extension   , 1));\n  EXPECT_EQ(712  , message.GetExtension(unittest::packed_double_extension  , 1));\n  EXPECT_EQ(false, message.GetExtension(unittest::packed_bool_extension    , 1));\n  EXPECT_EQ(unittest::FOREIGN_BAZ,\n            message.GetExtension(unittest::packed_enum_extension, 1));\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ExpectPackedExtensionsClear(\n    const unittest::TestPackedExtensions& message) {\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int32_extension   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int64_extension   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint32_extension  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint64_extension  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint32_extension  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint64_extension  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed32_extension ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed64_extension ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed32_extension));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed64_extension));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_float_extension   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_double_extension  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_bool_extension    ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_enum_extension    ));\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ExpectPackedExtensionsModified(\n    const unittest::TestPackedExtensions& message) {\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension    ));\n  EXPECT_EQ(601  , message.GetExtension(unittest::packed_int32_extension   , 0));\n  EXPECT_EQ(602  , message.GetExtension(unittest::packed_int64_extension   , 0));\n  EXPECT_EQ(603  , message.GetExtension(unittest::packed_uint32_extension  , 0));\n  EXPECT_EQ(604  , message.GetExtension(unittest::packed_uint64_extension  , 0));\n  EXPECT_EQ(605  , message.GetExtension(unittest::packed_sint32_extension  , 0));\n  EXPECT_EQ(606  , message.GetExtension(unittest::packed_sint64_extension  , 0));\n  EXPECT_EQ(607  , message.GetExtension(unittest::packed_fixed32_extension , 0));\n  EXPECT_EQ(608  , message.GetExtension(unittest::packed_fixed64_extension , 0));\n  EXPECT_EQ(609  , message.GetExtension(unittest::packed_sfixed32_extension, 0));\n  EXPECT_EQ(610  , message.GetExtension(unittest::packed_sfixed64_extension, 0));\n  EXPECT_EQ(611  , message.GetExtension(unittest::packed_float_extension   , 0));\n  EXPECT_EQ(612  , message.GetExtension(unittest::packed_double_extension  , 0));\n  EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension    , 0));\n  EXPECT_EQ(unittest::FOREIGN_BAR,\n            message.GetExtension(unittest::packed_enum_extension, 0));\n\n  // Actually verify the second (modified) elements now.\n  EXPECT_EQ(801  , message.GetExtension(unittest::packed_int32_extension   , 1));\n  EXPECT_EQ(802  , message.GetExtension(unittest::packed_int64_extension   , 1));\n  EXPECT_EQ(803  , message.GetExtension(unittest::packed_uint32_extension  , 1));\n  EXPECT_EQ(804  , message.GetExtension(unittest::packed_uint64_extension  , 1));\n  EXPECT_EQ(805  , message.GetExtension(unittest::packed_sint32_extension  , 1));\n  EXPECT_EQ(806  , message.GetExtension(unittest::packed_sint64_extension  , 1));\n  EXPECT_EQ(807  , message.GetExtension(unittest::packed_fixed32_extension , 1));\n  EXPECT_EQ(808  , message.GetExtension(unittest::packed_fixed64_extension , 1));\n  EXPECT_EQ(809  , message.GetExtension(unittest::packed_sfixed32_extension, 1));\n  EXPECT_EQ(810  , message.GetExtension(unittest::packed_sfixed64_extension, 1));\n  EXPECT_EQ(811  , message.GetExtension(unittest::packed_float_extension   , 1));\n  EXPECT_EQ(812  , message.GetExtension(unittest::packed_double_extension  , 1));\n  EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension    , 1));\n  EXPECT_EQ(unittest::FOREIGN_FOO,\n            message.GetExtension(unittest::packed_enum_extension, 1));\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ExpectAllFieldsAndExtensionsInOrder(const string& serialized) {\n  // We set each field individually, serialize separately, and concatenate all\n  // the strings in canonical order to determine the expected serialization.\n  string expected;\n  unittest::TestFieldOrderings message;\n  message.set_my_int(1);  // Field 1.\n  message.AppendToString(&expected);\n  message.Clear();\n  message.SetExtension(unittest::my_extension_int, 23);  // Field 5.\n  message.AppendToString(&expected);\n  message.Clear();\n  message.set_my_string(\"foo\");  // Field 11.\n  message.AppendToString(&expected);\n  message.Clear();\n  message.SetExtension(unittest::my_extension_string, \"bar\");  // Field 50.\n  message.AppendToString(&expected);\n  message.Clear();\n  message.set_my_float(1.0);  // Field 101.\n  message.AppendToString(&expected);\n  message.Clear();\n\n  // We don't EXPECT_EQ() since we don't want to print raw bytes to stdout.\n  EXPECT_TRUE(serialized == expected);\n}\n\nvoid TestUtil::ExpectLastRepeatedsRemoved(\n    const unittest::TestAllTypes& message) {\n  ASSERT_EQ(1, message.repeated_int32_size   ());\n  ASSERT_EQ(1, message.repeated_int64_size   ());\n  ASSERT_EQ(1, message.repeated_uint32_size  ());\n  ASSERT_EQ(1, message.repeated_uint64_size  ());\n  ASSERT_EQ(1, message.repeated_sint32_size  ());\n  ASSERT_EQ(1, message.repeated_sint64_size  ());\n  ASSERT_EQ(1, message.repeated_fixed32_size ());\n  ASSERT_EQ(1, message.repeated_fixed64_size ());\n  ASSERT_EQ(1, message.repeated_sfixed32_size());\n  ASSERT_EQ(1, message.repeated_sfixed64_size());\n  ASSERT_EQ(1, message.repeated_float_size   ());\n  ASSERT_EQ(1, message.repeated_double_size  ());\n  ASSERT_EQ(1, message.repeated_bool_size    ());\n  ASSERT_EQ(1, message.repeated_string_size  ());\n  ASSERT_EQ(1, message.repeated_bytes_size   ());\n\n  ASSERT_EQ(1, message.repeatedgroup_size           ());\n  ASSERT_EQ(1, message.repeated_nested_message_size ());\n  ASSERT_EQ(1, message.repeated_foreign_message_size());\n  ASSERT_EQ(1, message.repeated_import_message_size ());\n  ASSERT_EQ(1, message.repeated_nested_enum_size    ());\n  ASSERT_EQ(1, message.repeated_foreign_enum_size   ());\n  ASSERT_EQ(1, message.repeated_import_enum_size    ());\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n  ASSERT_EQ(1, message.repeated_string_piece_size());\n  ASSERT_EQ(1, message.repeated_cord_size());\n#endif\n\n  // Test that the remaining element is the correct one.\n  EXPECT_EQ(201  , message.repeated_int32   (0));\n  EXPECT_EQ(202  , message.repeated_int64   (0));\n  EXPECT_EQ(203  , message.repeated_uint32  (0));\n  EXPECT_EQ(204  , message.repeated_uint64  (0));\n  EXPECT_EQ(205  , message.repeated_sint32  (0));\n  EXPECT_EQ(206  , message.repeated_sint64  (0));\n  EXPECT_EQ(207  , message.repeated_fixed32 (0));\n  EXPECT_EQ(208  , message.repeated_fixed64 (0));\n  EXPECT_EQ(209  , message.repeated_sfixed32(0));\n  EXPECT_EQ(210  , message.repeated_sfixed64(0));\n  EXPECT_EQ(211  , message.repeated_float   (0));\n  EXPECT_EQ(212  , message.repeated_double  (0));\n  EXPECT_EQ(true , message.repeated_bool    (0));\n  EXPECT_EQ(\"215\", message.repeated_string  (0));\n  EXPECT_EQ(\"216\", message.repeated_bytes   (0));\n\n  EXPECT_EQ(217, message.repeatedgroup           (0).a());\n  EXPECT_EQ(218, message.repeated_nested_message (0).bb());\n  EXPECT_EQ(219, message.repeated_foreign_message(0).c());\n  EXPECT_EQ(220, message.repeated_import_message (0).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (0));\n  EXPECT_EQ(unittest::FOREIGN_BAR      , message.repeated_foreign_enum(0));\n  EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (0));\n}\n\nvoid TestUtil::ExpectLastRepeatedExtensionsRemoved(\n    const unittest::TestAllExtensions& message) {\n\n  // Test that one element was removed.\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_int32_extension   ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_int64_extension   ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_uint32_extension  ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_uint64_extension  ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sint32_extension  ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sint64_extension  ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_fixed32_extension ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_fixed64_extension ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sfixed32_extension));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sfixed64_extension));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_float_extension   ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_double_extension  ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_bool_extension    ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_string_extension  ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_bytes_extension   ));\n\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeatedgroup_extension           ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_nested_message_extension ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_foreign_message_extension));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_import_message_extension ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_nested_enum_extension    ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_foreign_enum_extension   ));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_import_enum_extension    ));\n\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_string_piece_extension));\n  ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_cord_extension));\n\n  // Test that the remaining element is the correct one.\n  EXPECT_EQ(201  , message.GetExtension(unittest::repeated_int32_extension   , 0));\n  EXPECT_EQ(202  , message.GetExtension(unittest::repeated_int64_extension   , 0));\n  EXPECT_EQ(203  , message.GetExtension(unittest::repeated_uint32_extension  , 0));\n  EXPECT_EQ(204  , message.GetExtension(unittest::repeated_uint64_extension  , 0));\n  EXPECT_EQ(205  , message.GetExtension(unittest::repeated_sint32_extension  , 0));\n  EXPECT_EQ(206  , message.GetExtension(unittest::repeated_sint64_extension  , 0));\n  EXPECT_EQ(207  , message.GetExtension(unittest::repeated_fixed32_extension , 0));\n  EXPECT_EQ(208  , message.GetExtension(unittest::repeated_fixed64_extension , 0));\n  EXPECT_EQ(209  , message.GetExtension(unittest::repeated_sfixed32_extension, 0));\n  EXPECT_EQ(210  , message.GetExtension(unittest::repeated_sfixed64_extension, 0));\n  EXPECT_EQ(211  , message.GetExtension(unittest::repeated_float_extension   , 0));\n  EXPECT_EQ(212  , message.GetExtension(unittest::repeated_double_extension  , 0));\n  EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension    , 0));\n  EXPECT_EQ(\"215\", message.GetExtension(unittest::repeated_string_extension  , 0));\n  EXPECT_EQ(\"216\", message.GetExtension(unittest::repeated_bytes_extension   , 0));\n\n  EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension           , 0).a());\n  EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb());\n  EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c());\n  EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 0));\n  EXPECT_EQ(unittest::FOREIGN_BAR      , message.GetExtension(unittest::repeated_foreign_enum_extension, 0));\n  EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 0));\n\n  EXPECT_EQ(\"224\", message.GetExtension(unittest::repeated_string_piece_extension, 0));\n  EXPECT_EQ(\"225\", message.GetExtension(unittest::repeated_cord_extension, 0));\n}\n\nvoid TestUtil::ExpectRepeatedsSwapped(\n    const unittest::TestAllTypes& message) {\n  ASSERT_EQ(2, message.repeated_int32_size   ());\n  ASSERT_EQ(2, message.repeated_int64_size   ());\n  ASSERT_EQ(2, message.repeated_uint32_size  ());\n  ASSERT_EQ(2, message.repeated_uint64_size  ());\n  ASSERT_EQ(2, message.repeated_sint32_size  ());\n  ASSERT_EQ(2, message.repeated_sint64_size  ());\n  ASSERT_EQ(2, message.repeated_fixed32_size ());\n  ASSERT_EQ(2, message.repeated_fixed64_size ());\n  ASSERT_EQ(2, message.repeated_sfixed32_size());\n  ASSERT_EQ(2, message.repeated_sfixed64_size());\n  ASSERT_EQ(2, message.repeated_float_size   ());\n  ASSERT_EQ(2, message.repeated_double_size  ());\n  ASSERT_EQ(2, message.repeated_bool_size    ());\n  ASSERT_EQ(2, message.repeated_string_size  ());\n  ASSERT_EQ(2, message.repeated_bytes_size   ());\n\n  ASSERT_EQ(2, message.repeatedgroup_size           ());\n  ASSERT_EQ(2, message.repeated_nested_message_size ());\n  ASSERT_EQ(2, message.repeated_foreign_message_size());\n  ASSERT_EQ(2, message.repeated_import_message_size ());\n  ASSERT_EQ(2, message.repeated_nested_enum_size    ());\n  ASSERT_EQ(2, message.repeated_foreign_enum_size   ());\n  ASSERT_EQ(2, message.repeated_import_enum_size    ());\n\n#ifndef PROTOBUF_TEST_NO_DESCRIPTORS\n  ASSERT_EQ(2, message.repeated_string_piece_size());\n  ASSERT_EQ(2, message.repeated_cord_size());\n#endif\n\n  // Test that the first element and second element are flipped.\n  EXPECT_EQ(201  , message.repeated_int32   (1));\n  EXPECT_EQ(202  , message.repeated_int64   (1));\n  EXPECT_EQ(203  , message.repeated_uint32  (1));\n  EXPECT_EQ(204  , message.repeated_uint64  (1));\n  EXPECT_EQ(205  , message.repeated_sint32  (1));\n  EXPECT_EQ(206  , message.repeated_sint64  (1));\n  EXPECT_EQ(207  , message.repeated_fixed32 (1));\n  EXPECT_EQ(208  , message.repeated_fixed64 (1));\n  EXPECT_EQ(209  , message.repeated_sfixed32(1));\n  EXPECT_EQ(210  , message.repeated_sfixed64(1));\n  EXPECT_EQ(211  , message.repeated_float   (1));\n  EXPECT_EQ(212  , message.repeated_double  (1));\n  EXPECT_EQ(true , message.repeated_bool    (1));\n  EXPECT_EQ(\"215\", message.repeated_string  (1));\n  EXPECT_EQ(\"216\", message.repeated_bytes   (1));\n\n  EXPECT_EQ(217, message.repeatedgroup           (1).a());\n  EXPECT_EQ(218, message.repeated_nested_message (1).bb());\n  EXPECT_EQ(219, message.repeated_foreign_message(1).c());\n  EXPECT_EQ(220, message.repeated_import_message (1).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (1));\n  EXPECT_EQ(unittest::FOREIGN_BAR      , message.repeated_foreign_enum(1));\n  EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (1));\n\n  EXPECT_EQ(301  , message.repeated_int32   (0));\n  EXPECT_EQ(302  , message.repeated_int64   (0));\n  EXPECT_EQ(303  , message.repeated_uint32  (0));\n  EXPECT_EQ(304  , message.repeated_uint64  (0));\n  EXPECT_EQ(305  , message.repeated_sint32  (0));\n  EXPECT_EQ(306  , message.repeated_sint64  (0));\n  EXPECT_EQ(307  , message.repeated_fixed32 (0));\n  EXPECT_EQ(308  , message.repeated_fixed64 (0));\n  EXPECT_EQ(309  , message.repeated_sfixed32(0));\n  EXPECT_EQ(310  , message.repeated_sfixed64(0));\n  EXPECT_EQ(311  , message.repeated_float   (0));\n  EXPECT_EQ(312  , message.repeated_double  (0));\n  EXPECT_EQ(false, message.repeated_bool    (0));\n  EXPECT_EQ(\"315\", message.repeated_string  (0));\n  EXPECT_EQ(\"316\", message.repeated_bytes   (0));\n\n  EXPECT_EQ(317, message.repeatedgroup           (0).a());\n  EXPECT_EQ(318, message.repeated_nested_message (0).bb());\n  EXPECT_EQ(319, message.repeated_foreign_message(0).c());\n  EXPECT_EQ(320, message.repeated_import_message (0).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAZ, message.repeated_nested_enum (0));\n  EXPECT_EQ(unittest::FOREIGN_BAZ      , message.repeated_foreign_enum(0));\n  EXPECT_EQ(unittest_import::IMPORT_BAZ, message.repeated_import_enum (0));\n}\n\nvoid TestUtil::ExpectRepeatedExtensionsSwapped(\n    const unittest::TestAllExtensions& message) {\n\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension   ));\n\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension           ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension    ));\n\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_piece_extension));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_cord_extension));\n\n  EXPECT_EQ(201  , message.GetExtension(unittest::repeated_int32_extension   , 1));\n  EXPECT_EQ(202  , message.GetExtension(unittest::repeated_int64_extension   , 1));\n  EXPECT_EQ(203  , message.GetExtension(unittest::repeated_uint32_extension  , 1));\n  EXPECT_EQ(204  , message.GetExtension(unittest::repeated_uint64_extension  , 1));\n  EXPECT_EQ(205  , message.GetExtension(unittest::repeated_sint32_extension  , 1));\n  EXPECT_EQ(206  , message.GetExtension(unittest::repeated_sint64_extension  , 1));\n  EXPECT_EQ(207  , message.GetExtension(unittest::repeated_fixed32_extension , 1));\n  EXPECT_EQ(208  , message.GetExtension(unittest::repeated_fixed64_extension , 1));\n  EXPECT_EQ(209  , message.GetExtension(unittest::repeated_sfixed32_extension, 1));\n  EXPECT_EQ(210  , message.GetExtension(unittest::repeated_sfixed64_extension, 1));\n  EXPECT_EQ(211  , message.GetExtension(unittest::repeated_float_extension   , 1));\n  EXPECT_EQ(212  , message.GetExtension(unittest::repeated_double_extension  , 1));\n  EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension    , 1));\n  EXPECT_EQ(\"215\", message.GetExtension(unittest::repeated_string_extension  , 1));\n  EXPECT_EQ(\"216\", message.GetExtension(unittest::repeated_bytes_extension   , 1));\n\n  EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension           , 1).a());\n  EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 1).bb());\n  EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 1).c());\n  EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 1).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 1));\n  EXPECT_EQ(unittest::FOREIGN_BAR      , message.GetExtension(unittest::repeated_foreign_enum_extension, 1));\n  EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 1));\n\n  EXPECT_EQ(\"224\", message.GetExtension(unittest::repeated_string_piece_extension, 1));\n  EXPECT_EQ(\"225\", message.GetExtension(unittest::repeated_cord_extension, 1));\n\n  EXPECT_EQ(301  , message.GetExtension(unittest::repeated_int32_extension   , 0));\n  EXPECT_EQ(302  , message.GetExtension(unittest::repeated_int64_extension   , 0));\n  EXPECT_EQ(303  , message.GetExtension(unittest::repeated_uint32_extension  , 0));\n  EXPECT_EQ(304  , message.GetExtension(unittest::repeated_uint64_extension  , 0));\n  EXPECT_EQ(305  , message.GetExtension(unittest::repeated_sint32_extension  , 0));\n  EXPECT_EQ(306  , message.GetExtension(unittest::repeated_sint64_extension  , 0));\n  EXPECT_EQ(307  , message.GetExtension(unittest::repeated_fixed32_extension , 0));\n  EXPECT_EQ(308  , message.GetExtension(unittest::repeated_fixed64_extension , 0));\n  EXPECT_EQ(309  , message.GetExtension(unittest::repeated_sfixed32_extension, 0));\n  EXPECT_EQ(310  , message.GetExtension(unittest::repeated_sfixed64_extension, 0));\n  EXPECT_EQ(311  , message.GetExtension(unittest::repeated_float_extension   , 0));\n  EXPECT_EQ(312  , message.GetExtension(unittest::repeated_double_extension  , 0));\n  EXPECT_EQ(false, message.GetExtension(unittest::repeated_bool_extension    , 0));\n  EXPECT_EQ(\"315\", message.GetExtension(unittest::repeated_string_extension  , 0));\n  EXPECT_EQ(\"316\", message.GetExtension(unittest::repeated_bytes_extension   , 0));\n\n  EXPECT_EQ(317, message.GetExtension(unittest::repeatedgroup_extension           , 0).a());\n  EXPECT_EQ(318, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb());\n  EXPECT_EQ(319, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c());\n  EXPECT_EQ(320, message.GetExtension(unittest::repeated_import_message_extension , 0).d());\n\n  EXPECT_EQ(unittest::TestAllTypes::BAZ, message.GetExtension(unittest::repeated_nested_enum_extension , 0));\n  EXPECT_EQ(unittest::FOREIGN_BAZ      , message.GetExtension(unittest::repeated_foreign_enum_extension, 0));\n  EXPECT_EQ(unittest_import::IMPORT_BAZ, message.GetExtension(unittest::repeated_import_enum_extension , 0));\n\n  EXPECT_EQ(\"324\", message.GetExtension(unittest::repeated_string_piece_extension, 0));\n  EXPECT_EQ(\"325\", message.GetExtension(unittest::repeated_cord_extension, 0));\n}\n\n// ===================================================================\n\nTestUtil::ReflectionTester::ReflectionTester(\n    const Descriptor* base_descriptor)\n  : base_descriptor_(base_descriptor) {\n\n  const DescriptorPool* pool = base_descriptor->file()->pool();\n\n  nested_b_ =\n    pool->FindFieldByName(\"protobuf_unittest.TestAllTypes.NestedMessage.bb\");\n  foreign_c_ =\n    pool->FindFieldByName(\"protobuf_unittest.ForeignMessage.c\");\n  import_d_ =\n    pool->FindFieldByName(\"protobuf_unittest_import.ImportMessage.d\");\n  nested_foo_ =\n    pool->FindEnumValueByName(\"protobuf_unittest.TestAllTypes.FOO\");\n  nested_bar_ =\n    pool->FindEnumValueByName(\"protobuf_unittest.TestAllTypes.BAR\");\n  nested_baz_ =\n    pool->FindEnumValueByName(\"protobuf_unittest.TestAllTypes.BAZ\");\n  foreign_foo_ =\n    pool->FindEnumValueByName(\"protobuf_unittest.FOREIGN_FOO\");\n  foreign_bar_ =\n    pool->FindEnumValueByName(\"protobuf_unittest.FOREIGN_BAR\");\n  foreign_baz_ =\n    pool->FindEnumValueByName(\"protobuf_unittest.FOREIGN_BAZ\");\n  import_foo_ =\n    pool->FindEnumValueByName(\"protobuf_unittest_import.IMPORT_FOO\");\n  import_bar_ =\n    pool->FindEnumValueByName(\"protobuf_unittest_import.IMPORT_BAR\");\n  import_baz_ =\n    pool->FindEnumValueByName(\"protobuf_unittest_import.IMPORT_BAZ\");\n\n  if (base_descriptor_->name() == \"TestAllExtensions\") {\n    group_a_ =\n      pool->FindFieldByName(\"protobuf_unittest.OptionalGroup_extension.a\");\n    repeated_group_a_ =\n      pool->FindFieldByName(\"protobuf_unittest.RepeatedGroup_extension.a\");\n  } else {\n    group_a_ =\n      pool->FindFieldByName(\"protobuf_unittest.TestAllTypes.OptionalGroup.a\");\n    repeated_group_a_ =\n      pool->FindFieldByName(\"protobuf_unittest.TestAllTypes.RepeatedGroup.a\");\n  }\n\n  EXPECT_TRUE(group_a_          != NULL);\n  EXPECT_TRUE(repeated_group_a_ != NULL);\n  EXPECT_TRUE(nested_b_         != NULL);\n  EXPECT_TRUE(foreign_c_        != NULL);\n  EXPECT_TRUE(import_d_         != NULL);\n  EXPECT_TRUE(nested_foo_       != NULL);\n  EXPECT_TRUE(nested_bar_       != NULL);\n  EXPECT_TRUE(nested_baz_       != NULL);\n  EXPECT_TRUE(foreign_foo_      != NULL);\n  EXPECT_TRUE(foreign_bar_      != NULL);\n  EXPECT_TRUE(foreign_baz_      != NULL);\n  EXPECT_TRUE(import_foo_       != NULL);\n  EXPECT_TRUE(import_bar_       != NULL);\n  EXPECT_TRUE(import_baz_       != NULL);\n}\n\n// Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes.\nconst FieldDescriptor* TestUtil::ReflectionTester::F(const string& name) {\n  const FieldDescriptor* result = NULL;\n  if (base_descriptor_->name() == \"TestAllExtensions\" ||\n      base_descriptor_->name() == \"TestPackedExtensions\") {\n    result = base_descriptor_->file()->FindExtensionByName(name + \"_extension\");\n  } else {\n    result = base_descriptor_->FindFieldByName(name);\n  }\n  GOOGLE_CHECK(result != NULL);\n  return result;\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ReflectionTester::SetAllFieldsViaReflection(Message* message) {\n  const Reflection* reflection = message->GetReflection();\n  Message* sub_message;\n\n  reflection->SetInt32 (message, F(\"optional_int32\"   ), 101);\n  reflection->SetInt64 (message, F(\"optional_int64\"   ), 102);\n  reflection->SetUInt32(message, F(\"optional_uint32\"  ), 103);\n  reflection->SetUInt64(message, F(\"optional_uint64\"  ), 104);\n  reflection->SetInt32 (message, F(\"optional_sint32\"  ), 105);\n  reflection->SetInt64 (message, F(\"optional_sint64\"  ), 106);\n  reflection->SetUInt32(message, F(\"optional_fixed32\" ), 107);\n  reflection->SetUInt64(message, F(\"optional_fixed64\" ), 108);\n  reflection->SetInt32 (message, F(\"optional_sfixed32\"), 109);\n  reflection->SetInt64 (message, F(\"optional_sfixed64\"), 110);\n  reflection->SetFloat (message, F(\"optional_float\"   ), 111);\n  reflection->SetDouble(message, F(\"optional_double\"  ), 112);\n  reflection->SetBool  (message, F(\"optional_bool\"    ), true);\n  reflection->SetString(message, F(\"optional_string\"  ), \"115\");\n  reflection->SetString(message, F(\"optional_bytes\"   ), \"116\");\n\n  sub_message = reflection->MutableMessage(message, F(\"optionalgroup\"));\n  sub_message->GetReflection()->SetInt32(sub_message, group_a_, 117);\n  sub_message = reflection->MutableMessage(message, F(\"optional_nested_message\"));\n  sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 118);\n  sub_message = reflection->MutableMessage(message, F(\"optional_foreign_message\"));\n  sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 119);\n  sub_message = reflection->MutableMessage(message, F(\"optional_import_message\"));\n  sub_message->GetReflection()->SetInt32(sub_message, import_d_, 120);\n\n  reflection->SetEnum(message, F(\"optional_nested_enum\" ),  nested_baz_);\n  reflection->SetEnum(message, F(\"optional_foreign_enum\"), foreign_baz_);\n  reflection->SetEnum(message, F(\"optional_import_enum\" ),  import_baz_);\n\n  reflection->SetString(message, F(\"optional_string_piece\"), \"124\");\n  reflection->SetString(message, F(\"optional_cord\"), \"125\");\n\n  // -----------------------------------------------------------------\n\n  reflection->AddInt32 (message, F(\"repeated_int32\"   ), 201);\n  reflection->AddInt64 (message, F(\"repeated_int64\"   ), 202);\n  reflection->AddUInt32(message, F(\"repeated_uint32\"  ), 203);\n  reflection->AddUInt64(message, F(\"repeated_uint64\"  ), 204);\n  reflection->AddInt32 (message, F(\"repeated_sint32\"  ), 205);\n  reflection->AddInt64 (message, F(\"repeated_sint64\"  ), 206);\n  reflection->AddUInt32(message, F(\"repeated_fixed32\" ), 207);\n  reflection->AddUInt64(message, F(\"repeated_fixed64\" ), 208);\n  reflection->AddInt32 (message, F(\"repeated_sfixed32\"), 209);\n  reflection->AddInt64 (message, F(\"repeated_sfixed64\"), 210);\n  reflection->AddFloat (message, F(\"repeated_float\"   ), 211);\n  reflection->AddDouble(message, F(\"repeated_double\"  ), 212);\n  reflection->AddBool  (message, F(\"repeated_bool\"    ), true);\n  reflection->AddString(message, F(\"repeated_string\"  ), \"215\");\n  reflection->AddString(message, F(\"repeated_bytes\"   ), \"216\");\n\n  sub_message = reflection->AddMessage(message, F(\"repeatedgroup\"));\n  sub_message->GetReflection()->SetInt32(sub_message, repeated_group_a_, 217);\n  sub_message = reflection->AddMessage(message, F(\"repeated_nested_message\"));\n  sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 218);\n  sub_message = reflection->AddMessage(message, F(\"repeated_foreign_message\"));\n  sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 219);\n  sub_message = reflection->AddMessage(message, F(\"repeated_import_message\"));\n  sub_message->GetReflection()->SetInt32(sub_message, import_d_, 220);\n\n  reflection->AddEnum(message, F(\"repeated_nested_enum\" ),  nested_bar_);\n  reflection->AddEnum(message, F(\"repeated_foreign_enum\"), foreign_bar_);\n  reflection->AddEnum(message, F(\"repeated_import_enum\" ),  import_bar_);\n\n  reflection->AddString(message, F(\"repeated_string_piece\"), \"224\");\n  reflection->AddString(message, F(\"repeated_cord\"), \"225\");\n\n  // Add a second one of each field.\n  reflection->AddInt32 (message, F(\"repeated_int32\"   ), 301);\n  reflection->AddInt64 (message, F(\"repeated_int64\"   ), 302);\n  reflection->AddUInt32(message, F(\"repeated_uint32\"  ), 303);\n  reflection->AddUInt64(message, F(\"repeated_uint64\"  ), 304);\n  reflection->AddInt32 (message, F(\"repeated_sint32\"  ), 305);\n  reflection->AddInt64 (message, F(\"repeated_sint64\"  ), 306);\n  reflection->AddUInt32(message, F(\"repeated_fixed32\" ), 307);\n  reflection->AddUInt64(message, F(\"repeated_fixed64\" ), 308);\n  reflection->AddInt32 (message, F(\"repeated_sfixed32\"), 309);\n  reflection->AddInt64 (message, F(\"repeated_sfixed64\"), 310);\n  reflection->AddFloat (message, F(\"repeated_float\"   ), 311);\n  reflection->AddDouble(message, F(\"repeated_double\"  ), 312);\n  reflection->AddBool  (message, F(\"repeated_bool\"    ), false);\n  reflection->AddString(message, F(\"repeated_string\"  ), \"315\");\n  reflection->AddString(message, F(\"repeated_bytes\"   ), \"316\");\n\n  sub_message = reflection->AddMessage(message, F(\"repeatedgroup\"));\n  sub_message->GetReflection()->SetInt32(sub_message, repeated_group_a_, 317);\n  sub_message = reflection->AddMessage(message, F(\"repeated_nested_message\"));\n  sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 318);\n  sub_message = reflection->AddMessage(message, F(\"repeated_foreign_message\"));\n  sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 319);\n  sub_message = reflection->AddMessage(message, F(\"repeated_import_message\"));\n  sub_message->GetReflection()->SetInt32(sub_message, import_d_, 320);\n\n  reflection->AddEnum(message, F(\"repeated_nested_enum\" ),  nested_baz_);\n  reflection->AddEnum(message, F(\"repeated_foreign_enum\"), foreign_baz_);\n  reflection->AddEnum(message, F(\"repeated_import_enum\" ),  import_baz_);\n\n  reflection->AddString(message, F(\"repeated_string_piece\"), \"324\");\n  reflection->AddString(message, F(\"repeated_cord\"), \"325\");\n\n  // -----------------------------------------------------------------\n\n  reflection->SetInt32 (message, F(\"default_int32\"   ), 401);\n  reflection->SetInt64 (message, F(\"default_int64\"   ), 402);\n  reflection->SetUInt32(message, F(\"default_uint32\"  ), 403);\n  reflection->SetUInt64(message, F(\"default_uint64\"  ), 404);\n  reflection->SetInt32 (message, F(\"default_sint32\"  ), 405);\n  reflection->SetInt64 (message, F(\"default_sint64\"  ), 406);\n  reflection->SetUInt32(message, F(\"default_fixed32\" ), 407);\n  reflection->SetUInt64(message, F(\"default_fixed64\" ), 408);\n  reflection->SetInt32 (message, F(\"default_sfixed32\"), 409);\n  reflection->SetInt64 (message, F(\"default_sfixed64\"), 410);\n  reflection->SetFloat (message, F(\"default_float\"   ), 411);\n  reflection->SetDouble(message, F(\"default_double\"  ), 412);\n  reflection->SetBool  (message, F(\"default_bool\"    ), false);\n  reflection->SetString(message, F(\"default_string\"  ), \"415\");\n  reflection->SetString(message, F(\"default_bytes\"   ), \"416\");\n\n  reflection->SetEnum(message, F(\"default_nested_enum\" ),  nested_foo_);\n  reflection->SetEnum(message, F(\"default_foreign_enum\"), foreign_foo_);\n  reflection->SetEnum(message, F(\"default_import_enum\" ),  import_foo_);\n\n  reflection->SetString(message, F(\"default_string_piece\"), \"424\");\n  reflection->SetString(message, F(\"default_cord\"), \"425\");\n}\n\nvoid TestUtil::ReflectionTester::SetPackedFieldsViaReflection(\n    Message* message) {\n  const Reflection* reflection = message->GetReflection();\n  reflection->AddInt32 (message, F(\"packed_int32\"   ), 601);\n  reflection->AddInt64 (message, F(\"packed_int64\"   ), 602);\n  reflection->AddUInt32(message, F(\"packed_uint32\"  ), 603);\n  reflection->AddUInt64(message, F(\"packed_uint64\"  ), 604);\n  reflection->AddInt32 (message, F(\"packed_sint32\"  ), 605);\n  reflection->AddInt64 (message, F(\"packed_sint64\"  ), 606);\n  reflection->AddUInt32(message, F(\"packed_fixed32\" ), 607);\n  reflection->AddUInt64(message, F(\"packed_fixed64\" ), 608);\n  reflection->AddInt32 (message, F(\"packed_sfixed32\"), 609);\n  reflection->AddInt64 (message, F(\"packed_sfixed64\"), 610);\n  reflection->AddFloat (message, F(\"packed_float\"   ), 611);\n  reflection->AddDouble(message, F(\"packed_double\"  ), 612);\n  reflection->AddBool  (message, F(\"packed_bool\"    ), true);\n  reflection->AddEnum  (message, F(\"packed_enum\"    ), foreign_bar_);\n\n  reflection->AddInt32 (message, F(\"packed_int32\"   ), 701);\n  reflection->AddInt64 (message, F(\"packed_int64\"   ), 702);\n  reflection->AddUInt32(message, F(\"packed_uint32\"  ), 703);\n  reflection->AddUInt64(message, F(\"packed_uint64\"  ), 704);\n  reflection->AddInt32 (message, F(\"packed_sint32\"  ), 705);\n  reflection->AddInt64 (message, F(\"packed_sint64\"  ), 706);\n  reflection->AddUInt32(message, F(\"packed_fixed32\" ), 707);\n  reflection->AddUInt64(message, F(\"packed_fixed64\" ), 708);\n  reflection->AddInt32 (message, F(\"packed_sfixed32\"), 709);\n  reflection->AddInt64 (message, F(\"packed_sfixed64\"), 710);\n  reflection->AddFloat (message, F(\"packed_float\"   ), 711);\n  reflection->AddDouble(message, F(\"packed_double\"  ), 712);\n  reflection->AddBool  (message, F(\"packed_bool\"    ), false);\n  reflection->AddEnum  (message, F(\"packed_enum\"    ), foreign_baz_);\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection(\n    const Message& message) {\n  // We have to split this into three function otherwise it creates a stack\n  // frame so large that it triggers a warning.\n  ExpectAllFieldsSetViaReflection1(message);\n  ExpectAllFieldsSetViaReflection2(message);\n  ExpectAllFieldsSetViaReflection3(message);\n}\n\nvoid TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection1(\n    const Message& message) {\n  const Reflection* reflection = message.GetReflection();\n  string scratch;\n  const Message* sub_message;\n\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_int32\"   )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_int64\"   )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_uint32\"  )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_uint64\"  )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_sint32\"  )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_sint64\"  )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_fixed32\" )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_fixed64\" )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_sfixed32\")));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_sfixed64\")));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_float\"   )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_double\"  )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_bool\"    )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_string\"  )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_bytes\"   )));\n\n  EXPECT_TRUE(reflection->HasField(message, F(\"optionalgroup\"           )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_nested_message\" )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_foreign_message\")));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_import_message\" )));\n\n  sub_message = &reflection->GetMessage(message, F(\"optionalgroup\"));\n  EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, group_a_));\n  sub_message = &reflection->GetMessage(message, F(\"optional_nested_message\"));\n  EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, nested_b_));\n  sub_message = &reflection->GetMessage(message, F(\"optional_foreign_message\"));\n  EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, foreign_c_));\n  sub_message = &reflection->GetMessage(message, F(\"optional_import_message\"));\n  EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, import_d_));\n\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_nested_enum\" )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_foreign_enum\")));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_import_enum\" )));\n\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_string_piece\")));\n  EXPECT_TRUE(reflection->HasField(message, F(\"optional_cord\")));\n\n  EXPECT_EQ(101  , reflection->GetInt32 (message, F(\"optional_int32\"   )));\n  EXPECT_EQ(102  , reflection->GetInt64 (message, F(\"optional_int64\"   )));\n  EXPECT_EQ(103  , reflection->GetUInt32(message, F(\"optional_uint32\"  )));\n  EXPECT_EQ(104  , reflection->GetUInt64(message, F(\"optional_uint64\"  )));\n  EXPECT_EQ(105  , reflection->GetInt32 (message, F(\"optional_sint32\"  )));\n  EXPECT_EQ(106  , reflection->GetInt64 (message, F(\"optional_sint64\"  )));\n  EXPECT_EQ(107  , reflection->GetUInt32(message, F(\"optional_fixed32\" )));\n  EXPECT_EQ(108  , reflection->GetUInt64(message, F(\"optional_fixed64\" )));\n  EXPECT_EQ(109  , reflection->GetInt32 (message, F(\"optional_sfixed32\")));\n  EXPECT_EQ(110  , reflection->GetInt64 (message, F(\"optional_sfixed64\")));\n  EXPECT_EQ(111  , reflection->GetFloat (message, F(\"optional_float\"   )));\n  EXPECT_EQ(112  , reflection->GetDouble(message, F(\"optional_double\"  )));\n  EXPECT_EQ(true , reflection->GetBool  (message, F(\"optional_bool\"    )));\n  EXPECT_EQ(\"115\", reflection->GetString(message, F(\"optional_string\"  )));\n  EXPECT_EQ(\"116\", reflection->GetString(message, F(\"optional_bytes\"   )));\n\n  EXPECT_EQ(\"115\", reflection->GetStringReference(message, F(\"optional_string\"), &scratch));\n  EXPECT_EQ(\"116\", reflection->GetStringReference(message, F(\"optional_bytes\" ), &scratch));\n\n  sub_message = &reflection->GetMessage(message, F(\"optionalgroup\"));\n  EXPECT_EQ(117, sub_message->GetReflection()->GetInt32(*sub_message, group_a_));\n  sub_message = &reflection->GetMessage(message, F(\"optional_nested_message\"));\n  EXPECT_EQ(118, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_));\n  sub_message = &reflection->GetMessage(message, F(\"optional_foreign_message\"));\n  EXPECT_EQ(119, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_));\n  sub_message = &reflection->GetMessage(message, F(\"optional_import_message\"));\n  EXPECT_EQ(120, sub_message->GetReflection()->GetInt32(*sub_message, import_d_));\n\n  EXPECT_EQ( nested_baz_, reflection->GetEnum(message, F(\"optional_nested_enum\" )));\n  EXPECT_EQ(foreign_baz_, reflection->GetEnum(message, F(\"optional_foreign_enum\")));\n  EXPECT_EQ( import_baz_, reflection->GetEnum(message, F(\"optional_import_enum\" )));\n\n  EXPECT_EQ(\"124\", reflection->GetString(message, F(\"optional_string_piece\")));\n  EXPECT_EQ(\"124\", reflection->GetStringReference(message, F(\"optional_string_piece\"), &scratch));\n\n  EXPECT_EQ(\"125\", reflection->GetString(message, F(\"optional_cord\")));\n  EXPECT_EQ(\"125\", reflection->GetStringReference(message, F(\"optional_cord\"), &scratch));\n}\n\nvoid TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection2(\n    const Message& message) {\n  const Reflection* reflection = message.GetReflection();\n  string scratch;\n  const Message* sub_message;\n\n  // -----------------------------------------------------------------\n\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_int32\"   )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_int64\"   )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_uint32\"  )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_uint64\"  )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_sint32\"  )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_sint64\"  )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_fixed32\" )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_fixed64\" )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_sfixed32\")));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_sfixed64\")));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_float\"   )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_double\"  )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_bool\"    )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_string\"  )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_bytes\"   )));\n\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeatedgroup\"           )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_nested_message\" )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_foreign_message\")));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_import_message\" )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_nested_enum\"    )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_foreign_enum\"   )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_import_enum\"    )));\n\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_string_piece\")));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"repeated_cord\")));\n\n  EXPECT_EQ(201  , reflection->GetRepeatedInt32 (message, F(\"repeated_int32\"   ), 0));\n  EXPECT_EQ(202  , reflection->GetRepeatedInt64 (message, F(\"repeated_int64\"   ), 0));\n  EXPECT_EQ(203  , reflection->GetRepeatedUInt32(message, F(\"repeated_uint32\"  ), 0));\n  EXPECT_EQ(204  , reflection->GetRepeatedUInt64(message, F(\"repeated_uint64\"  ), 0));\n  EXPECT_EQ(205  , reflection->GetRepeatedInt32 (message, F(\"repeated_sint32\"  ), 0));\n  EXPECT_EQ(206  , reflection->GetRepeatedInt64 (message, F(\"repeated_sint64\"  ), 0));\n  EXPECT_EQ(207  , reflection->GetRepeatedUInt32(message, F(\"repeated_fixed32\" ), 0));\n  EXPECT_EQ(208  , reflection->GetRepeatedUInt64(message, F(\"repeated_fixed64\" ), 0));\n  EXPECT_EQ(209  , reflection->GetRepeatedInt32 (message, F(\"repeated_sfixed32\"), 0));\n  EXPECT_EQ(210  , reflection->GetRepeatedInt64 (message, F(\"repeated_sfixed64\"), 0));\n  EXPECT_EQ(211  , reflection->GetRepeatedFloat (message, F(\"repeated_float\"   ), 0));\n  EXPECT_EQ(212  , reflection->GetRepeatedDouble(message, F(\"repeated_double\"  ), 0));\n  EXPECT_EQ(true , reflection->GetRepeatedBool  (message, F(\"repeated_bool\"    ), 0));\n  EXPECT_EQ(\"215\", reflection->GetRepeatedString(message, F(\"repeated_string\"  ), 0));\n  EXPECT_EQ(\"216\", reflection->GetRepeatedString(message, F(\"repeated_bytes\"   ), 0));\n\n  EXPECT_EQ(\"215\", reflection->GetRepeatedStringReference(message, F(\"repeated_string\"), 0, &scratch));\n  EXPECT_EQ(\"216\", reflection->GetRepeatedStringReference(message, F(\"repeated_bytes\"), 0, &scratch));\n\n  sub_message = &reflection->GetRepeatedMessage(message, F(\"repeatedgroup\"), 0);\n  EXPECT_EQ(217, sub_message->GetReflection()->GetInt32(*sub_message, repeated_group_a_));\n  sub_message = &reflection->GetRepeatedMessage(message, F(\"repeated_nested_message\"), 0);\n  EXPECT_EQ(218, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_));\n  sub_message = &reflection->GetRepeatedMessage(message, F(\"repeated_foreign_message\"), 0);\n  EXPECT_EQ(219, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_));\n  sub_message = &reflection->GetRepeatedMessage(message, F(\"repeated_import_message\"), 0);\n  EXPECT_EQ(220, sub_message->GetReflection()->GetInt32(*sub_message, import_d_));\n\n  EXPECT_EQ( nested_bar_, reflection->GetRepeatedEnum(message, F(\"repeated_nested_enum\" ),0));\n  EXPECT_EQ(foreign_bar_, reflection->GetRepeatedEnum(message, F(\"repeated_foreign_enum\"),0));\n  EXPECT_EQ( import_bar_, reflection->GetRepeatedEnum(message, F(\"repeated_import_enum\" ),0));\n\n  EXPECT_EQ(\"224\", reflection->GetRepeatedString(message, F(\"repeated_string_piece\"), 0));\n  EXPECT_EQ(\"224\", reflection->GetRepeatedStringReference(\n                        message, F(\"repeated_string_piece\"), 0, &scratch));\n\n  EXPECT_EQ(\"225\", reflection->GetRepeatedString(message, F(\"repeated_cord\"), 0));\n  EXPECT_EQ(\"225\", reflection->GetRepeatedStringReference(\n                        message, F(\"repeated_cord\"), 0, &scratch));\n\n  EXPECT_EQ(301  , reflection->GetRepeatedInt32 (message, F(\"repeated_int32\"   ), 1));\n  EXPECT_EQ(302  , reflection->GetRepeatedInt64 (message, F(\"repeated_int64\"   ), 1));\n  EXPECT_EQ(303  , reflection->GetRepeatedUInt32(message, F(\"repeated_uint32\"  ), 1));\n  EXPECT_EQ(304  , reflection->GetRepeatedUInt64(message, F(\"repeated_uint64\"  ), 1));\n  EXPECT_EQ(305  , reflection->GetRepeatedInt32 (message, F(\"repeated_sint32\"  ), 1));\n  EXPECT_EQ(306  , reflection->GetRepeatedInt64 (message, F(\"repeated_sint64\"  ), 1));\n  EXPECT_EQ(307  , reflection->GetRepeatedUInt32(message, F(\"repeated_fixed32\" ), 1));\n  EXPECT_EQ(308  , reflection->GetRepeatedUInt64(message, F(\"repeated_fixed64\" ), 1));\n  EXPECT_EQ(309  , reflection->GetRepeatedInt32 (message, F(\"repeated_sfixed32\"), 1));\n  EXPECT_EQ(310  , reflection->GetRepeatedInt64 (message, F(\"repeated_sfixed64\"), 1));\n  EXPECT_EQ(311  , reflection->GetRepeatedFloat (message, F(\"repeated_float\"   ), 1));\n  EXPECT_EQ(312  , reflection->GetRepeatedDouble(message, F(\"repeated_double\"  ), 1));\n  EXPECT_EQ(false, reflection->GetRepeatedBool  (message, F(\"repeated_bool\"    ), 1));\n  EXPECT_EQ(\"315\", reflection->GetRepeatedString(message, F(\"repeated_string\"  ), 1));\n  EXPECT_EQ(\"316\", reflection->GetRepeatedString(message, F(\"repeated_bytes\"   ), 1));\n\n  EXPECT_EQ(\"315\", reflection->GetRepeatedStringReference(message, F(\"repeated_string\"),\n                                                          1, &scratch));\n  EXPECT_EQ(\"316\", reflection->GetRepeatedStringReference(message, F(\"repeated_bytes\"),\n                                                          1, &scratch));\n\n  sub_message = &reflection->GetRepeatedMessage(message, F(\"repeatedgroup\"), 1);\n  EXPECT_EQ(317, sub_message->GetReflection()->GetInt32(*sub_message, repeated_group_a_));\n  sub_message = &reflection->GetRepeatedMessage(message, F(\"repeated_nested_message\"), 1);\n  EXPECT_EQ(318, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_));\n  sub_message = &reflection->GetRepeatedMessage(message, F(\"repeated_foreign_message\"), 1);\n  EXPECT_EQ(319, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_));\n  sub_message = &reflection->GetRepeatedMessage(message, F(\"repeated_import_message\"), 1);\n  EXPECT_EQ(320, sub_message->GetReflection()->GetInt32(*sub_message, import_d_));\n\n  EXPECT_EQ( nested_baz_, reflection->GetRepeatedEnum(message, F(\"repeated_nested_enum\" ),1));\n  EXPECT_EQ(foreign_baz_, reflection->GetRepeatedEnum(message, F(\"repeated_foreign_enum\"),1));\n  EXPECT_EQ( import_baz_, reflection->GetRepeatedEnum(message, F(\"repeated_import_enum\" ),1));\n\n  EXPECT_EQ(\"324\", reflection->GetRepeatedString(message, F(\"repeated_string_piece\"), 1));\n  EXPECT_EQ(\"324\", reflection->GetRepeatedStringReference(\n                        message, F(\"repeated_string_piece\"), 1, &scratch));\n\n  EXPECT_EQ(\"325\", reflection->GetRepeatedString(message, F(\"repeated_cord\"), 1));\n  EXPECT_EQ(\"325\", reflection->GetRepeatedStringReference(\n                        message, F(\"repeated_cord\"), 1, &scratch));\n}\n\nvoid TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection3(\n    const Message& message) {\n  const Reflection* reflection = message.GetReflection();\n  string scratch;\n\n  // -----------------------------------------------------------------\n\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_int32\"   )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_int64\"   )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_uint32\"  )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_uint64\"  )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_sint32\"  )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_sint64\"  )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_fixed32\" )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_fixed64\" )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_sfixed32\")));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_sfixed64\")));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_float\"   )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_double\"  )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_bool\"    )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_string\"  )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_bytes\"   )));\n\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_nested_enum\" )));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_foreign_enum\")));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_import_enum\" )));\n\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_string_piece\")));\n  EXPECT_TRUE(reflection->HasField(message, F(\"default_cord\")));\n\n  EXPECT_EQ(401  , reflection->GetInt32 (message, F(\"default_int32\"   )));\n  EXPECT_EQ(402  , reflection->GetInt64 (message, F(\"default_int64\"   )));\n  EXPECT_EQ(403  , reflection->GetUInt32(message, F(\"default_uint32\"  )));\n  EXPECT_EQ(404  , reflection->GetUInt64(message, F(\"default_uint64\"  )));\n  EXPECT_EQ(405  , reflection->GetInt32 (message, F(\"default_sint32\"  )));\n  EXPECT_EQ(406  , reflection->GetInt64 (message, F(\"default_sint64\"  )));\n  EXPECT_EQ(407  , reflection->GetUInt32(message, F(\"default_fixed32\" )));\n  EXPECT_EQ(408  , reflection->GetUInt64(message, F(\"default_fixed64\" )));\n  EXPECT_EQ(409  , reflection->GetInt32 (message, F(\"default_sfixed32\")));\n  EXPECT_EQ(410  , reflection->GetInt64 (message, F(\"default_sfixed64\")));\n  EXPECT_EQ(411  , reflection->GetFloat (message, F(\"default_float\"   )));\n  EXPECT_EQ(412  , reflection->GetDouble(message, F(\"default_double\"  )));\n  EXPECT_EQ(false, reflection->GetBool  (message, F(\"default_bool\"    )));\n  EXPECT_EQ(\"415\", reflection->GetString(message, F(\"default_string\"  )));\n  EXPECT_EQ(\"416\", reflection->GetString(message, F(\"default_bytes\"   )));\n\n  EXPECT_EQ(\"415\", reflection->GetStringReference(message, F(\"default_string\"), &scratch));\n  EXPECT_EQ(\"416\", reflection->GetStringReference(message, F(\"default_bytes\" ), &scratch));\n\n  EXPECT_EQ( nested_foo_, reflection->GetEnum(message, F(\"default_nested_enum\" )));\n  EXPECT_EQ(foreign_foo_, reflection->GetEnum(message, F(\"default_foreign_enum\")));\n  EXPECT_EQ( import_foo_, reflection->GetEnum(message, F(\"default_import_enum\" )));\n\n  EXPECT_EQ(\"424\", reflection->GetString(message, F(\"default_string_piece\")));\n  EXPECT_EQ(\"424\", reflection->GetStringReference(message, F(\"default_string_piece\"),\n                                                  &scratch));\n\n  EXPECT_EQ(\"425\", reflection->GetString(message, F(\"default_cord\")));\n  EXPECT_EQ(\"425\", reflection->GetStringReference(message, F(\"default_cord\"), &scratch));\n}\n\nvoid TestUtil::ReflectionTester::ExpectPackedFieldsSetViaReflection(\n    const Message& message) {\n  const Reflection* reflection = message.GetReflection();\n\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_int32\"   )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_int64\"   )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_uint32\"  )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_uint64\"  )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_sint32\"  )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_sint64\"  )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_fixed32\" )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_fixed64\" )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_sfixed32\")));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_sfixed64\")));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_float\"   )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_double\"  )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_bool\"    )));\n  ASSERT_EQ(2, reflection->FieldSize(message, F(\"packed_enum\"    )));\n\n  EXPECT_EQ(601  , reflection->GetRepeatedInt32 (message, F(\"packed_int32\"   ), 0));\n  EXPECT_EQ(602  , reflection->GetRepeatedInt64 (message, F(\"packed_int64\"   ), 0));\n  EXPECT_EQ(603  , reflection->GetRepeatedUInt32(message, F(\"packed_uint32\"  ), 0));\n  EXPECT_EQ(604  , reflection->GetRepeatedUInt64(message, F(\"packed_uint64\"  ), 0));\n  EXPECT_EQ(605  , reflection->GetRepeatedInt32 (message, F(\"packed_sint32\"  ), 0));\n  EXPECT_EQ(606  , reflection->GetRepeatedInt64 (message, F(\"packed_sint64\"  ), 0));\n  EXPECT_EQ(607  , reflection->GetRepeatedUInt32(message, F(\"packed_fixed32\" ), 0));\n  EXPECT_EQ(608  , reflection->GetRepeatedUInt64(message, F(\"packed_fixed64\" ), 0));\n  EXPECT_EQ(609  , reflection->GetRepeatedInt32 (message, F(\"packed_sfixed32\"), 0));\n  EXPECT_EQ(610  , reflection->GetRepeatedInt64 (message, F(\"packed_sfixed64\"), 0));\n  EXPECT_EQ(611  , reflection->GetRepeatedFloat (message, F(\"packed_float\"   ), 0));\n  EXPECT_EQ(612  , reflection->GetRepeatedDouble(message, F(\"packed_double\"  ), 0));\n  EXPECT_EQ(true , reflection->GetRepeatedBool  (message, F(\"packed_bool\"    ), 0));\n  EXPECT_EQ(foreign_bar_,\n            reflection->GetRepeatedEnum(message, F(\"packed_enum\"), 0));\n\n  EXPECT_EQ(701  , reflection->GetRepeatedInt32 (message, F(\"packed_int32\"   ), 1));\n  EXPECT_EQ(702  , reflection->GetRepeatedInt64 (message, F(\"packed_int64\"   ), 1));\n  EXPECT_EQ(703  , reflection->GetRepeatedUInt32(message, F(\"packed_uint32\"  ), 1));\n  EXPECT_EQ(704  , reflection->GetRepeatedUInt64(message, F(\"packed_uint64\"  ), 1));\n  EXPECT_EQ(705  , reflection->GetRepeatedInt32 (message, F(\"packed_sint32\"  ), 1));\n  EXPECT_EQ(706  , reflection->GetRepeatedInt64 (message, F(\"packed_sint64\"  ), 1));\n  EXPECT_EQ(707  , reflection->GetRepeatedUInt32(message, F(\"packed_fixed32\" ), 1));\n  EXPECT_EQ(708  , reflection->GetRepeatedUInt64(message, F(\"packed_fixed64\" ), 1));\n  EXPECT_EQ(709  , reflection->GetRepeatedInt32 (message, F(\"packed_sfixed32\"), 1));\n  EXPECT_EQ(710  , reflection->GetRepeatedInt64 (message, F(\"packed_sfixed64\"), 1));\n  EXPECT_EQ(711  , reflection->GetRepeatedFloat (message, F(\"packed_float\"   ), 1));\n  EXPECT_EQ(712  , reflection->GetRepeatedDouble(message, F(\"packed_double\"  ), 1));\n  EXPECT_EQ(false, reflection->GetRepeatedBool  (message, F(\"packed_bool\"    ), 1));\n  EXPECT_EQ(foreign_baz_,\n            reflection->GetRepeatedEnum(message, F(\"packed_enum\"), 1));\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ReflectionTester::ExpectClearViaReflection(\n    const Message& message) {\n  const Reflection* reflection = message.GetReflection();\n  string scratch;\n  const Message* sub_message;\n\n  // has_blah() should initially be false for all optional fields.\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_int32\"   )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_int64\"   )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_uint32\"  )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_uint64\"  )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_sint32\"  )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_sint64\"  )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_fixed32\" )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_fixed64\" )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_sfixed32\")));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_sfixed64\")));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_float\"   )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_double\"  )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_bool\"    )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_string\"  )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_bytes\"   )));\n\n  EXPECT_FALSE(reflection->HasField(message, F(\"optionalgroup\"           )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_nested_message\" )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_foreign_message\")));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_import_message\" )));\n\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_nested_enum\" )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_foreign_enum\")));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_import_enum\" )));\n\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_string_piece\")));\n  EXPECT_FALSE(reflection->HasField(message, F(\"optional_cord\")));\n\n  // Optional fields without defaults are set to zero or something like it.\n  EXPECT_EQ(0    , reflection->GetInt32 (message, F(\"optional_int32\"   )));\n  EXPECT_EQ(0    , reflection->GetInt64 (message, F(\"optional_int64\"   )));\n  EXPECT_EQ(0    , reflection->GetUInt32(message, F(\"optional_uint32\"  )));\n  EXPECT_EQ(0    , reflection->GetUInt64(message, F(\"optional_uint64\"  )));\n  EXPECT_EQ(0    , reflection->GetInt32 (message, F(\"optional_sint32\"  )));\n  EXPECT_EQ(0    , reflection->GetInt64 (message, F(\"optional_sint64\"  )));\n  EXPECT_EQ(0    , reflection->GetUInt32(message, F(\"optional_fixed32\" )));\n  EXPECT_EQ(0    , reflection->GetUInt64(message, F(\"optional_fixed64\" )));\n  EXPECT_EQ(0    , reflection->GetInt32 (message, F(\"optional_sfixed32\")));\n  EXPECT_EQ(0    , reflection->GetInt64 (message, F(\"optional_sfixed64\")));\n  EXPECT_EQ(0    , reflection->GetFloat (message, F(\"optional_float\"   )));\n  EXPECT_EQ(0    , reflection->GetDouble(message, F(\"optional_double\"  )));\n  EXPECT_EQ(false, reflection->GetBool  (message, F(\"optional_bool\"    )));\n  EXPECT_EQ(\"\"   , reflection->GetString(message, F(\"optional_string\"  )));\n  EXPECT_EQ(\"\"   , reflection->GetString(message, F(\"optional_bytes\"   )));\n\n  EXPECT_EQ(\"\", reflection->GetStringReference(message, F(\"optional_string\"), &scratch));\n  EXPECT_EQ(\"\", reflection->GetStringReference(message, F(\"optional_bytes\" ), &scratch));\n\n  // Embedded messages should also be clear.\n  sub_message = &reflection->GetMessage(message, F(\"optionalgroup\"));\n  EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, group_a_));\n  EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, group_a_));\n  sub_message = &reflection->GetMessage(message, F(\"optional_nested_message\"));\n  EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, nested_b_));\n  EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_));\n  sub_message = &reflection->GetMessage(message, F(\"optional_foreign_message\"));\n  EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, foreign_c_));\n  EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_));\n  sub_message = &reflection->GetMessage(message, F(\"optional_import_message\"));\n  EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, import_d_));\n  EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, import_d_));\n\n  // Enums without defaults are set to the first value in the enum.\n  EXPECT_EQ( nested_foo_, reflection->GetEnum(message, F(\"optional_nested_enum\" )));\n  EXPECT_EQ(foreign_foo_, reflection->GetEnum(message, F(\"optional_foreign_enum\")));\n  EXPECT_EQ( import_foo_, reflection->GetEnum(message, F(\"optional_import_enum\" )));\n\n  EXPECT_EQ(\"\", reflection->GetString(message, F(\"optional_string_piece\")));\n  EXPECT_EQ(\"\", reflection->GetStringReference(message, F(\"optional_string_piece\"), &scratch));\n\n  EXPECT_EQ(\"\", reflection->GetString(message, F(\"optional_cord\")));\n  EXPECT_EQ(\"\", reflection->GetStringReference(message, F(\"optional_cord\"), &scratch));\n\n  // Repeated fields are empty.\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_int32\"   )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_int64\"   )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_uint32\"  )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_uint64\"  )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_sint32\"  )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_sint64\"  )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_fixed32\" )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_fixed64\" )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_sfixed32\")));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_sfixed64\")));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_float\"   )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_double\"  )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_bool\"    )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_string\"  )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_bytes\"   )));\n\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeatedgroup\"           )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_nested_message\" )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_foreign_message\")));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_import_message\" )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_nested_enum\"    )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_foreign_enum\"   )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_import_enum\"    )));\n\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_string_piece\")));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"repeated_cord\")));\n\n  // has_blah() should also be false for all default fields.\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_int32\"   )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_int64\"   )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_uint32\"  )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_uint64\"  )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_sint32\"  )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_sint64\"  )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_fixed32\" )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_fixed64\" )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_sfixed32\")));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_sfixed64\")));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_float\"   )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_double\"  )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_bool\"    )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_string\"  )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_bytes\"   )));\n\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_nested_enum\" )));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_foreign_enum\")));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_import_enum\" )));\n\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_string_piece\")));\n  EXPECT_FALSE(reflection->HasField(message, F(\"default_cord\")));\n\n  // Fields with defaults have their default values (duh).\n  EXPECT_EQ( 41    , reflection->GetInt32 (message, F(\"default_int32\"   )));\n  EXPECT_EQ( 42    , reflection->GetInt64 (message, F(\"default_int64\"   )));\n  EXPECT_EQ( 43    , reflection->GetUInt32(message, F(\"default_uint32\"  )));\n  EXPECT_EQ( 44    , reflection->GetUInt64(message, F(\"default_uint64\"  )));\n  EXPECT_EQ(-45    , reflection->GetInt32 (message, F(\"default_sint32\"  )));\n  EXPECT_EQ( 46    , reflection->GetInt64 (message, F(\"default_sint64\"  )));\n  EXPECT_EQ( 47    , reflection->GetUInt32(message, F(\"default_fixed32\" )));\n  EXPECT_EQ( 48    , reflection->GetUInt64(message, F(\"default_fixed64\" )));\n  EXPECT_EQ( 49    , reflection->GetInt32 (message, F(\"default_sfixed32\")));\n  EXPECT_EQ(-50    , reflection->GetInt64 (message, F(\"default_sfixed64\")));\n  EXPECT_EQ( 51.5  , reflection->GetFloat (message, F(\"default_float\"   )));\n  EXPECT_EQ( 52e3  , reflection->GetDouble(message, F(\"default_double\"  )));\n  EXPECT_EQ(true   , reflection->GetBool  (message, F(\"default_bool\"    )));\n  EXPECT_EQ(\"hello\", reflection->GetString(message, F(\"default_string\"  )));\n  EXPECT_EQ(\"world\", reflection->GetString(message, F(\"default_bytes\"   )));\n\n  EXPECT_EQ(\"hello\", reflection->GetStringReference(message, F(\"default_string\"), &scratch));\n  EXPECT_EQ(\"world\", reflection->GetStringReference(message, F(\"default_bytes\" ), &scratch));\n\n  EXPECT_EQ( nested_bar_, reflection->GetEnum(message, F(\"default_nested_enum\" )));\n  EXPECT_EQ(foreign_bar_, reflection->GetEnum(message, F(\"default_foreign_enum\")));\n  EXPECT_EQ( import_bar_, reflection->GetEnum(message, F(\"default_import_enum\" )));\n\n  EXPECT_EQ(\"abc\", reflection->GetString(message, F(\"default_string_piece\")));\n  EXPECT_EQ(\"abc\", reflection->GetStringReference(message, F(\"default_string_piece\"), &scratch));\n\n  EXPECT_EQ(\"123\", reflection->GetString(message, F(\"default_cord\")));\n  EXPECT_EQ(\"123\", reflection->GetStringReference(message, F(\"default_cord\"), &scratch));\n}\n\nvoid TestUtil::ReflectionTester::ExpectPackedClearViaReflection(\n    const Message& message) {\n  const Reflection* reflection = message.GetReflection();\n\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_int32\"   )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_int64\"   )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_uint32\"  )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_uint64\"  )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_sint32\"  )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_sint64\"  )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_fixed32\" )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_fixed64\" )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_sfixed32\")));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_sfixed64\")));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_float\"   )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_double\"  )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_bool\"    )));\n  EXPECT_EQ(0, reflection->FieldSize(message, F(\"packed_enum\"    )));\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtil::ReflectionTester::ModifyRepeatedFieldsViaReflection(\n    Message* message) {\n  const Reflection* reflection = message->GetReflection();\n  Message* sub_message;\n\n  reflection->SetRepeatedInt32 (message, F(\"repeated_int32\"   ), 1, 501);\n  reflection->SetRepeatedInt64 (message, F(\"repeated_int64\"   ), 1, 502);\n  reflection->SetRepeatedUInt32(message, F(\"repeated_uint32\"  ), 1, 503);\n  reflection->SetRepeatedUInt64(message, F(\"repeated_uint64\"  ), 1, 504);\n  reflection->SetRepeatedInt32 (message, F(\"repeated_sint32\"  ), 1, 505);\n  reflection->SetRepeatedInt64 (message, F(\"repeated_sint64\"  ), 1, 506);\n  reflection->SetRepeatedUInt32(message, F(\"repeated_fixed32\" ), 1, 507);\n  reflection->SetRepeatedUInt64(message, F(\"repeated_fixed64\" ), 1, 508);\n  reflection->SetRepeatedInt32 (message, F(\"repeated_sfixed32\"), 1, 509);\n  reflection->SetRepeatedInt64 (message, F(\"repeated_sfixed64\"), 1, 510);\n  reflection->SetRepeatedFloat (message, F(\"repeated_float\"   ), 1, 511);\n  reflection->SetRepeatedDouble(message, F(\"repeated_double\"  ), 1, 512);\n  reflection->SetRepeatedBool  (message, F(\"repeated_bool\"    ), 1, true);\n  reflection->SetRepeatedString(message, F(\"repeated_string\"  ), 1, \"515\");\n  reflection->SetRepeatedString(message, F(\"repeated_bytes\"   ), 1, \"516\");\n\n  sub_message = reflection->MutableRepeatedMessage(message, F(\"repeatedgroup\"), 1);\n  sub_message->GetReflection()->SetInt32(sub_message, repeated_group_a_, 517);\n  sub_message = reflection->MutableRepeatedMessage(message, F(\"repeated_nested_message\"), 1);\n  sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 518);\n  sub_message = reflection->MutableRepeatedMessage(message, F(\"repeated_foreign_message\"), 1);\n  sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 519);\n  sub_message = reflection->MutableRepeatedMessage(message, F(\"repeated_import_message\"), 1);\n  sub_message->GetReflection()->SetInt32(sub_message, import_d_, 520);\n\n  reflection->SetRepeatedEnum(message, F(\"repeated_nested_enum\" ), 1,  nested_foo_);\n  reflection->SetRepeatedEnum(message, F(\"repeated_foreign_enum\"), 1, foreign_foo_);\n  reflection->SetRepeatedEnum(message, F(\"repeated_import_enum\" ), 1,  import_foo_);\n\n  reflection->SetRepeatedString(message, F(\"repeated_string_piece\"), 1, \"524\");\n  reflection->SetRepeatedString(message, F(\"repeated_cord\"), 1, \"525\");\n}\n\nvoid TestUtil::ReflectionTester::ModifyPackedFieldsViaReflection(\n    Message* message) {\n  const Reflection* reflection = message->GetReflection();\n  reflection->SetRepeatedInt32 (message, F(\"packed_int32\"   ), 1, 801);\n  reflection->SetRepeatedInt64 (message, F(\"packed_int64\"   ), 1, 802);\n  reflection->SetRepeatedUInt32(message, F(\"packed_uint32\"  ), 1, 803);\n  reflection->SetRepeatedUInt64(message, F(\"packed_uint64\"  ), 1, 804);\n  reflection->SetRepeatedInt32 (message, F(\"packed_sint32\"  ), 1, 805);\n  reflection->SetRepeatedInt64 (message, F(\"packed_sint64\"  ), 1, 806);\n  reflection->SetRepeatedUInt32(message, F(\"packed_fixed32\" ), 1, 807);\n  reflection->SetRepeatedUInt64(message, F(\"packed_fixed64\" ), 1, 808);\n  reflection->SetRepeatedInt32 (message, F(\"packed_sfixed32\"), 1, 809);\n  reflection->SetRepeatedInt64 (message, F(\"packed_sfixed64\"), 1, 810);\n  reflection->SetRepeatedFloat (message, F(\"packed_float\"   ), 1, 811);\n  reflection->SetRepeatedDouble(message, F(\"packed_double\"  ), 1, 812);\n  reflection->SetRepeatedBool  (message, F(\"packed_bool\"    ), 1, true);\n  reflection->SetRepeatedEnum  (message, F(\"packed_enum\"    ), 1, foreign_foo_);\n}\n\nvoid TestUtil::ReflectionTester::RemoveLastRepeatedsViaReflection(Message* message) {\n  const Reflection* reflection = message->GetReflection();\n\n  vector<const FieldDescriptor*> output;\n  reflection->ListFields(*message, &output);\n  for (int i=0; i<output.size(); ++i) {\n    const FieldDescriptor* field = output[i];\n    if (!field->is_repeated()) continue;\n\n    reflection->RemoveLast(message, field);\n  }\n}\n\nvoid TestUtil::ReflectionTester::SwapRepeatedsViaReflection(Message* message) {\n  const Reflection* reflection = message->GetReflection();\n\n  vector<const FieldDescriptor*> output;\n  reflection->ListFields(*message, &output);\n  for (int i=0; i<output.size(); ++i) {\n    const FieldDescriptor* field = output[i];\n    if (!field->is_repeated()) continue;\n\n    reflection->SwapElements(message, field, 0, 1);\n  }\n}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_TEST_UTIL_H__\n#define GOOGLE_PROTOBUF_TEST_UTIL_H__\n\n#include <stack>\n#include <string>\n#include <google/protobuf/message.h>\n#include <google/protobuf/unittest.pb.h>\n\nnamespace google {\nnamespace protobuf {\n\nnamespace unittest = protobuf_unittest;\nnamespace unittest_import = protobuf_unittest_import;\n\nclass TestUtil {\n public:\n  // Set every field in the message to a unique value.\n  static void SetAllFields(unittest::TestAllTypes* message);\n  static void SetAllExtensions(unittest::TestAllExtensions* message);\n  static void SetAllFieldsAndExtensions(unittest::TestFieldOrderings* message);\n  static void SetPackedFields(unittest::TestPackedTypes* message);\n  static void SetPackedExtensions(unittest::TestPackedExtensions* message);\n  static void SetUnpackedFields(unittest::TestUnpackedTypes* message);\n\n  // Use the repeated versions of the set_*() accessors to modify all the\n  // repeated fields of the messsage (which should already have been\n  // initialized with Set*Fields()).  Set*Fields() itself only tests\n  // the add_*() accessors.\n  static void ModifyRepeatedFields(unittest::TestAllTypes* message);\n  static void ModifyRepeatedExtensions(unittest::TestAllExtensions* message);\n  static void ModifyPackedFields(unittest::TestPackedTypes* message);\n  static void ModifyPackedExtensions(unittest::TestPackedExtensions* message);\n\n  // Check that all fields have the values that they should have after\n  // Set*Fields() is called.\n  static void ExpectAllFieldsSet(const unittest::TestAllTypes& message);\n  static void ExpectAllExtensionsSet(\n      const unittest::TestAllExtensions& message);\n  static void ExpectPackedFieldsSet(const unittest::TestPackedTypes& message);\n  static void ExpectPackedExtensionsSet(\n      const unittest::TestPackedExtensions& message);\n  static void ExpectUnpackedFieldsSet(\n      const unittest::TestUnpackedTypes& message);\n\n  // Expect that the message is modified as would be expected from\n  // Modify*Fields().\n  static void ExpectRepeatedFieldsModified(\n      const unittest::TestAllTypes& message);\n  static void ExpectRepeatedExtensionsModified(\n      const unittest::TestAllExtensions& message);\n  static void ExpectPackedFieldsModified(\n      const unittest::TestPackedTypes& message);\n  static void ExpectPackedExtensionsModified(\n      const unittest::TestPackedExtensions& message);\n\n  // Check that all fields have their default values.\n  static void ExpectClear(const unittest::TestAllTypes& message);\n  static void ExpectExtensionsClear(const unittest::TestAllExtensions& message);\n  static void ExpectPackedClear(const unittest::TestPackedTypes& message);\n  static void ExpectPackedExtensionsClear(\n      const unittest::TestPackedExtensions& message);\n\n  // Check that the passed-in serialization is the canonical serialization we\n  // expect for a TestFieldOrderings message filled in by\n  // SetAllFieldsAndExtensions().\n  static void ExpectAllFieldsAndExtensionsInOrder(const string& serialized);\n\n  // Check that all repeated fields have had their last elements removed.\n  static void ExpectLastRepeatedsRemoved(\n      const unittest::TestAllTypes& message);\n  static void ExpectLastRepeatedExtensionsRemoved(\n      const unittest::TestAllExtensions& message);\n\n  // Check that all repeated fields have had their first and last elements\n  // swapped.\n  static void ExpectRepeatedsSwapped(const unittest::TestAllTypes& message);\n  static void ExpectRepeatedExtensionsSwapped(\n      const unittest::TestAllExtensions& message);\n\n  // Like above, but use the reflection interface.\n  class ReflectionTester {\n   public:\n    // base_descriptor must be a descriptor for TestAllTypes or\n    // TestAllExtensions.  In the former case, ReflectionTester fetches from\n    // it the FieldDescriptors needed to use the reflection interface.  In\n    // the latter case, ReflectionTester searches for extension fields in\n    // its file.\n    explicit ReflectionTester(const Descriptor* base_descriptor);\n\n    void SetAllFieldsViaReflection(Message* message);\n    void ModifyRepeatedFieldsViaReflection(Message* message);\n    void ExpectAllFieldsSetViaReflection(const Message& message);\n    void ExpectClearViaReflection(const Message& message);\n\n    void SetPackedFieldsViaReflection(Message* message);\n    void ModifyPackedFieldsViaReflection(Message* message);\n    void ExpectPackedFieldsSetViaReflection(const Message& message);\n    void ExpectPackedClearViaReflection(const Message& message);\n\n    void RemoveLastRepeatedsViaReflection(Message* message);\n    void SwapRepeatedsViaReflection(Message* message);\n\n   private:\n    const FieldDescriptor* F(const string& name);\n\n    const Descriptor* base_descriptor_;\n\n    const FieldDescriptor* group_a_;\n    const FieldDescriptor* repeated_group_a_;\n    const FieldDescriptor* nested_b_;\n    const FieldDescriptor* foreign_c_;\n    const FieldDescriptor* import_d_;\n\n    const EnumValueDescriptor* nested_foo_;\n    const EnumValueDescriptor* nested_bar_;\n    const EnumValueDescriptor* nested_baz_;\n    const EnumValueDescriptor* foreign_foo_;\n    const EnumValueDescriptor* foreign_bar_;\n    const EnumValueDescriptor* foreign_baz_;\n    const EnumValueDescriptor* import_foo_;\n    const EnumValueDescriptor* import_bar_;\n    const EnumValueDescriptor* import_baz_;\n\n    // We have to split this into three function otherwise it creates a stack\n    // frame so large that it triggers a warning.\n    void ExpectAllFieldsSetViaReflection1(const Message& message);\n    void ExpectAllFieldsSetViaReflection2(const Message& message);\n    void ExpectAllFieldsSetViaReflection3(const Message& message);\n\n    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ReflectionTester);\n  };\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TestUtil);\n};\n\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_TEST_UTIL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/test_util_lite.h>\n#include <google/protobuf/stubs/common.h>\n\n\n#define EXPECT_TRUE GOOGLE_CHECK\n#define ASSERT_TRUE GOOGLE_CHECK\n#define EXPECT_FALSE(COND) GOOGLE_CHECK(!(COND))\n#define EXPECT_EQ GOOGLE_CHECK_EQ\n#define ASSERT_EQ GOOGLE_CHECK_EQ\n\nnamespace google {\nnamespace protobuf {\n\nvoid TestUtilLite::SetAllFields(unittest::TestAllTypesLite* message) {\n  message->set_optional_int32   (101);\n  message->set_optional_int64   (102);\n  message->set_optional_uint32  (103);\n  message->set_optional_uint64  (104);\n  message->set_optional_sint32  (105);\n  message->set_optional_sint64  (106);\n  message->set_optional_fixed32 (107);\n  message->set_optional_fixed64 (108);\n  message->set_optional_sfixed32(109);\n  message->set_optional_sfixed64(110);\n  message->set_optional_float   (111);\n  message->set_optional_double  (112);\n  message->set_optional_bool    (true);\n  message->set_optional_string  (\"115\");\n  message->set_optional_bytes   (\"116\");\n\n  message->mutable_optionalgroup           ()->set_a(117);\n  message->mutable_optional_nested_message ()->set_bb(118);\n  message->mutable_optional_foreign_message()->set_c(119);\n  message->mutable_optional_import_message ()->set_d(120);\n\n  message->set_optional_nested_enum (unittest::TestAllTypesLite::BAZ );\n  message->set_optional_foreign_enum(unittest::FOREIGN_LITE_BAZ      );\n  message->set_optional_import_enum (unittest_import::IMPORT_LITE_BAZ);\n\n\n  // -----------------------------------------------------------------\n\n  message->add_repeated_int32   (201);\n  message->add_repeated_int64   (202);\n  message->add_repeated_uint32  (203);\n  message->add_repeated_uint64  (204);\n  message->add_repeated_sint32  (205);\n  message->add_repeated_sint64  (206);\n  message->add_repeated_fixed32 (207);\n  message->add_repeated_fixed64 (208);\n  message->add_repeated_sfixed32(209);\n  message->add_repeated_sfixed64(210);\n  message->add_repeated_float   (211);\n  message->add_repeated_double  (212);\n  message->add_repeated_bool    (true);\n  message->add_repeated_string  (\"215\");\n  message->add_repeated_bytes   (\"216\");\n\n  message->add_repeatedgroup           ()->set_a(217);\n  message->add_repeated_nested_message ()->set_bb(218);\n  message->add_repeated_foreign_message()->set_c(219);\n  message->add_repeated_import_message ()->set_d(220);\n\n  message->add_repeated_nested_enum (unittest::TestAllTypesLite::BAR );\n  message->add_repeated_foreign_enum(unittest::FOREIGN_LITE_BAR      );\n  message->add_repeated_import_enum (unittest_import::IMPORT_LITE_BAR);\n\n\n  // Add a second one of each field.\n  message->add_repeated_int32   (301);\n  message->add_repeated_int64   (302);\n  message->add_repeated_uint32  (303);\n  message->add_repeated_uint64  (304);\n  message->add_repeated_sint32  (305);\n  message->add_repeated_sint64  (306);\n  message->add_repeated_fixed32 (307);\n  message->add_repeated_fixed64 (308);\n  message->add_repeated_sfixed32(309);\n  message->add_repeated_sfixed64(310);\n  message->add_repeated_float   (311);\n  message->add_repeated_double  (312);\n  message->add_repeated_bool    (false);\n  message->add_repeated_string  (\"315\");\n  message->add_repeated_bytes   (\"316\");\n\n  message->add_repeatedgroup           ()->set_a(317);\n  message->add_repeated_nested_message ()->set_bb(318);\n  message->add_repeated_foreign_message()->set_c(319);\n  message->add_repeated_import_message ()->set_d(320);\n\n  message->add_repeated_nested_enum (unittest::TestAllTypesLite::BAZ );\n  message->add_repeated_foreign_enum(unittest::FOREIGN_LITE_BAZ      );\n  message->add_repeated_import_enum (unittest_import::IMPORT_LITE_BAZ);\n\n\n  // -----------------------------------------------------------------\n\n  message->set_default_int32   (401);\n  message->set_default_int64   (402);\n  message->set_default_uint32  (403);\n  message->set_default_uint64  (404);\n  message->set_default_sint32  (405);\n  message->set_default_sint64  (406);\n  message->set_default_fixed32 (407);\n  message->set_default_fixed64 (408);\n  message->set_default_sfixed32(409);\n  message->set_default_sfixed64(410);\n  message->set_default_float   (411);\n  message->set_default_double  (412);\n  message->set_default_bool    (false);\n  message->set_default_string  (\"415\");\n  message->set_default_bytes   (\"416\");\n\n  message->set_default_nested_enum (unittest::TestAllTypesLite::FOO );\n  message->set_default_foreign_enum(unittest::FOREIGN_LITE_FOO      );\n  message->set_default_import_enum (unittest_import::IMPORT_LITE_FOO);\n\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ModifyRepeatedFields(unittest::TestAllTypesLite* message) {\n  message->set_repeated_int32   (1, 501);\n  message->set_repeated_int64   (1, 502);\n  message->set_repeated_uint32  (1, 503);\n  message->set_repeated_uint64  (1, 504);\n  message->set_repeated_sint32  (1, 505);\n  message->set_repeated_sint64  (1, 506);\n  message->set_repeated_fixed32 (1, 507);\n  message->set_repeated_fixed64 (1, 508);\n  message->set_repeated_sfixed32(1, 509);\n  message->set_repeated_sfixed64(1, 510);\n  message->set_repeated_float   (1, 511);\n  message->set_repeated_double  (1, 512);\n  message->set_repeated_bool    (1, true);\n  message->set_repeated_string  (1, \"515\");\n  message->set_repeated_bytes   (1, \"516\");\n\n  message->mutable_repeatedgroup           (1)->set_a(517);\n  message->mutable_repeated_nested_message (1)->set_bb(518);\n  message->mutable_repeated_foreign_message(1)->set_c(519);\n  message->mutable_repeated_import_message (1)->set_d(520);\n\n  message->set_repeated_nested_enum (1, unittest::TestAllTypesLite::FOO );\n  message->set_repeated_foreign_enum(1, unittest::FOREIGN_LITE_FOO      );\n  message->set_repeated_import_enum (1, unittest_import::IMPORT_LITE_FOO);\n\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ExpectAllFieldsSet(\n    const unittest::TestAllTypesLite& message) {\n  EXPECT_TRUE(message.has_optional_int32   ());\n  EXPECT_TRUE(message.has_optional_int64   ());\n  EXPECT_TRUE(message.has_optional_uint32  ());\n  EXPECT_TRUE(message.has_optional_uint64  ());\n  EXPECT_TRUE(message.has_optional_sint32  ());\n  EXPECT_TRUE(message.has_optional_sint64  ());\n  EXPECT_TRUE(message.has_optional_fixed32 ());\n  EXPECT_TRUE(message.has_optional_fixed64 ());\n  EXPECT_TRUE(message.has_optional_sfixed32());\n  EXPECT_TRUE(message.has_optional_sfixed64());\n  EXPECT_TRUE(message.has_optional_float   ());\n  EXPECT_TRUE(message.has_optional_double  ());\n  EXPECT_TRUE(message.has_optional_bool    ());\n  EXPECT_TRUE(message.has_optional_string  ());\n  EXPECT_TRUE(message.has_optional_bytes   ());\n\n  EXPECT_TRUE(message.has_optionalgroup           ());\n  EXPECT_TRUE(message.has_optional_nested_message ());\n  EXPECT_TRUE(message.has_optional_foreign_message());\n  EXPECT_TRUE(message.has_optional_import_message ());\n\n  EXPECT_TRUE(message.optionalgroup           ().has_a());\n  EXPECT_TRUE(message.optional_nested_message ().has_bb());\n  EXPECT_TRUE(message.optional_foreign_message().has_c());\n  EXPECT_TRUE(message.optional_import_message ().has_d());\n\n  EXPECT_TRUE(message.has_optional_nested_enum ());\n  EXPECT_TRUE(message.has_optional_foreign_enum());\n  EXPECT_TRUE(message.has_optional_import_enum ());\n\n\n  EXPECT_EQ(101  , message.optional_int32   ());\n  EXPECT_EQ(102  , message.optional_int64   ());\n  EXPECT_EQ(103  , message.optional_uint32  ());\n  EXPECT_EQ(104  , message.optional_uint64  ());\n  EXPECT_EQ(105  , message.optional_sint32  ());\n  EXPECT_EQ(106  , message.optional_sint64  ());\n  EXPECT_EQ(107  , message.optional_fixed32 ());\n  EXPECT_EQ(108  , message.optional_fixed64 ());\n  EXPECT_EQ(109  , message.optional_sfixed32());\n  EXPECT_EQ(110  , message.optional_sfixed64());\n  EXPECT_EQ(111  , message.optional_float   ());\n  EXPECT_EQ(112  , message.optional_double  ());\n  EXPECT_EQ(true , message.optional_bool    ());\n  EXPECT_EQ(\"115\", message.optional_string  ());\n  EXPECT_EQ(\"116\", message.optional_bytes   ());\n\n  EXPECT_EQ(117, message.optionalgroup           ().a());\n  EXPECT_EQ(118, message.optional_nested_message ().bb());\n  EXPECT_EQ(119, message.optional_foreign_message().c());\n  EXPECT_EQ(120, message.optional_import_message ().d());\n\n  EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.optional_nested_enum ());\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAZ      , message.optional_foreign_enum());\n  EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.optional_import_enum ());\n\n\n  // -----------------------------------------------------------------\n\n  ASSERT_EQ(2, message.repeated_int32_size   ());\n  ASSERT_EQ(2, message.repeated_int64_size   ());\n  ASSERT_EQ(2, message.repeated_uint32_size  ());\n  ASSERT_EQ(2, message.repeated_uint64_size  ());\n  ASSERT_EQ(2, message.repeated_sint32_size  ());\n  ASSERT_EQ(2, message.repeated_sint64_size  ());\n  ASSERT_EQ(2, message.repeated_fixed32_size ());\n  ASSERT_EQ(2, message.repeated_fixed64_size ());\n  ASSERT_EQ(2, message.repeated_sfixed32_size());\n  ASSERT_EQ(2, message.repeated_sfixed64_size());\n  ASSERT_EQ(2, message.repeated_float_size   ());\n  ASSERT_EQ(2, message.repeated_double_size  ());\n  ASSERT_EQ(2, message.repeated_bool_size    ());\n  ASSERT_EQ(2, message.repeated_string_size  ());\n  ASSERT_EQ(2, message.repeated_bytes_size   ());\n\n  ASSERT_EQ(2, message.repeatedgroup_size           ());\n  ASSERT_EQ(2, message.repeated_nested_message_size ());\n  ASSERT_EQ(2, message.repeated_foreign_message_size());\n  ASSERT_EQ(2, message.repeated_import_message_size ());\n  ASSERT_EQ(2, message.repeated_nested_enum_size    ());\n  ASSERT_EQ(2, message.repeated_foreign_enum_size   ());\n  ASSERT_EQ(2, message.repeated_import_enum_size    ());\n\n\n  EXPECT_EQ(201  , message.repeated_int32   (0));\n  EXPECT_EQ(202  , message.repeated_int64   (0));\n  EXPECT_EQ(203  , message.repeated_uint32  (0));\n  EXPECT_EQ(204  , message.repeated_uint64  (0));\n  EXPECT_EQ(205  , message.repeated_sint32  (0));\n  EXPECT_EQ(206  , message.repeated_sint64  (0));\n  EXPECT_EQ(207  , message.repeated_fixed32 (0));\n  EXPECT_EQ(208  , message.repeated_fixed64 (0));\n  EXPECT_EQ(209  , message.repeated_sfixed32(0));\n  EXPECT_EQ(210  , message.repeated_sfixed64(0));\n  EXPECT_EQ(211  , message.repeated_float   (0));\n  EXPECT_EQ(212  , message.repeated_double  (0));\n  EXPECT_EQ(true , message.repeated_bool    (0));\n  EXPECT_EQ(\"215\", message.repeated_string  (0));\n  EXPECT_EQ(\"216\", message.repeated_bytes   (0));\n\n  EXPECT_EQ(217, message.repeatedgroup           (0).a());\n  EXPECT_EQ(218, message.repeated_nested_message (0).bb());\n  EXPECT_EQ(219, message.repeated_foreign_message(0).c());\n  EXPECT_EQ(220, message.repeated_import_message (0).d());\n\n\n  EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.repeated_nested_enum (0));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAR      , message.repeated_foreign_enum(0));\n  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.repeated_import_enum (0));\n\n  EXPECT_EQ(301  , message.repeated_int32   (1));\n  EXPECT_EQ(302  , message.repeated_int64   (1));\n  EXPECT_EQ(303  , message.repeated_uint32  (1));\n  EXPECT_EQ(304  , message.repeated_uint64  (1));\n  EXPECT_EQ(305  , message.repeated_sint32  (1));\n  EXPECT_EQ(306  , message.repeated_sint64  (1));\n  EXPECT_EQ(307  , message.repeated_fixed32 (1));\n  EXPECT_EQ(308  , message.repeated_fixed64 (1));\n  EXPECT_EQ(309  , message.repeated_sfixed32(1));\n  EXPECT_EQ(310  , message.repeated_sfixed64(1));\n  EXPECT_EQ(311  , message.repeated_float   (1));\n  EXPECT_EQ(312  , message.repeated_double  (1));\n  EXPECT_EQ(false, message.repeated_bool    (1));\n  EXPECT_EQ(\"315\", message.repeated_string  (1));\n  EXPECT_EQ(\"316\", message.repeated_bytes   (1));\n\n  EXPECT_EQ(317, message.repeatedgroup           (1).a());\n  EXPECT_EQ(318, message.repeated_nested_message (1).bb());\n  EXPECT_EQ(319, message.repeated_foreign_message(1).c());\n  EXPECT_EQ(320, message.repeated_import_message (1).d());\n\n  EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.repeated_nested_enum (1));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAZ      , message.repeated_foreign_enum(1));\n  EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.repeated_import_enum (1));\n\n\n  // -----------------------------------------------------------------\n\n  EXPECT_TRUE(message.has_default_int32   ());\n  EXPECT_TRUE(message.has_default_int64   ());\n  EXPECT_TRUE(message.has_default_uint32  ());\n  EXPECT_TRUE(message.has_default_uint64  ());\n  EXPECT_TRUE(message.has_default_sint32  ());\n  EXPECT_TRUE(message.has_default_sint64  ());\n  EXPECT_TRUE(message.has_default_fixed32 ());\n  EXPECT_TRUE(message.has_default_fixed64 ());\n  EXPECT_TRUE(message.has_default_sfixed32());\n  EXPECT_TRUE(message.has_default_sfixed64());\n  EXPECT_TRUE(message.has_default_float   ());\n  EXPECT_TRUE(message.has_default_double  ());\n  EXPECT_TRUE(message.has_default_bool    ());\n  EXPECT_TRUE(message.has_default_string  ());\n  EXPECT_TRUE(message.has_default_bytes   ());\n\n  EXPECT_TRUE(message.has_default_nested_enum ());\n  EXPECT_TRUE(message.has_default_foreign_enum());\n  EXPECT_TRUE(message.has_default_import_enum ());\n\n\n  EXPECT_EQ(401  , message.default_int32   ());\n  EXPECT_EQ(402  , message.default_int64   ());\n  EXPECT_EQ(403  , message.default_uint32  ());\n  EXPECT_EQ(404  , message.default_uint64  ());\n  EXPECT_EQ(405  , message.default_sint32  ());\n  EXPECT_EQ(406  , message.default_sint64  ());\n  EXPECT_EQ(407  , message.default_fixed32 ());\n  EXPECT_EQ(408  , message.default_fixed64 ());\n  EXPECT_EQ(409  , message.default_sfixed32());\n  EXPECT_EQ(410  , message.default_sfixed64());\n  EXPECT_EQ(411  , message.default_float   ());\n  EXPECT_EQ(412  , message.default_double  ());\n  EXPECT_EQ(false, message.default_bool    ());\n  EXPECT_EQ(\"415\", message.default_string  ());\n  EXPECT_EQ(\"416\", message.default_bytes   ());\n\n  EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.default_nested_enum ());\n  EXPECT_EQ(unittest::FOREIGN_LITE_FOO      , message.default_foreign_enum());\n  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.default_import_enum ());\n\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ExpectClear(const unittest::TestAllTypesLite& message) {\n  // has_blah() should initially be false for all optional fields.\n  EXPECT_FALSE(message.has_optional_int32   ());\n  EXPECT_FALSE(message.has_optional_int64   ());\n  EXPECT_FALSE(message.has_optional_uint32  ());\n  EXPECT_FALSE(message.has_optional_uint64  ());\n  EXPECT_FALSE(message.has_optional_sint32  ());\n  EXPECT_FALSE(message.has_optional_sint64  ());\n  EXPECT_FALSE(message.has_optional_fixed32 ());\n  EXPECT_FALSE(message.has_optional_fixed64 ());\n  EXPECT_FALSE(message.has_optional_sfixed32());\n  EXPECT_FALSE(message.has_optional_sfixed64());\n  EXPECT_FALSE(message.has_optional_float   ());\n  EXPECT_FALSE(message.has_optional_double  ());\n  EXPECT_FALSE(message.has_optional_bool    ());\n  EXPECT_FALSE(message.has_optional_string  ());\n  EXPECT_FALSE(message.has_optional_bytes   ());\n\n  EXPECT_FALSE(message.has_optionalgroup           ());\n  EXPECT_FALSE(message.has_optional_nested_message ());\n  EXPECT_FALSE(message.has_optional_foreign_message());\n  EXPECT_FALSE(message.has_optional_import_message ());\n\n  EXPECT_FALSE(message.has_optional_nested_enum ());\n  EXPECT_FALSE(message.has_optional_foreign_enum());\n  EXPECT_FALSE(message.has_optional_import_enum ());\n\n\n  // Optional fields without defaults are set to zero or something like it.\n  EXPECT_EQ(0    , message.optional_int32   ());\n  EXPECT_EQ(0    , message.optional_int64   ());\n  EXPECT_EQ(0    , message.optional_uint32  ());\n  EXPECT_EQ(0    , message.optional_uint64  ());\n  EXPECT_EQ(0    , message.optional_sint32  ());\n  EXPECT_EQ(0    , message.optional_sint64  ());\n  EXPECT_EQ(0    , message.optional_fixed32 ());\n  EXPECT_EQ(0    , message.optional_fixed64 ());\n  EXPECT_EQ(0    , message.optional_sfixed32());\n  EXPECT_EQ(0    , message.optional_sfixed64());\n  EXPECT_EQ(0    , message.optional_float   ());\n  EXPECT_EQ(0    , message.optional_double  ());\n  EXPECT_EQ(false, message.optional_bool    ());\n  EXPECT_EQ(\"\"   , message.optional_string  ());\n  EXPECT_EQ(\"\"   , message.optional_bytes   ());\n\n  // Embedded messages should also be clear.\n  EXPECT_FALSE(message.optionalgroup           ().has_a());\n  EXPECT_FALSE(message.optional_nested_message ().has_bb());\n  EXPECT_FALSE(message.optional_foreign_message().has_c());\n  EXPECT_FALSE(message.optional_import_message ().has_d());\n\n  EXPECT_EQ(0, message.optionalgroup           ().a());\n  EXPECT_EQ(0, message.optional_nested_message ().bb());\n  EXPECT_EQ(0, message.optional_foreign_message().c());\n  EXPECT_EQ(0, message.optional_import_message ().d());\n\n  // Enums without defaults are set to the first value in the enum.\n  EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.optional_nested_enum ());\n  EXPECT_EQ(unittest::FOREIGN_LITE_FOO      , message.optional_foreign_enum());\n  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.optional_import_enum ());\n\n\n  // Repeated fields are empty.\n  EXPECT_EQ(0, message.repeated_int32_size   ());\n  EXPECT_EQ(0, message.repeated_int64_size   ());\n  EXPECT_EQ(0, message.repeated_uint32_size  ());\n  EXPECT_EQ(0, message.repeated_uint64_size  ());\n  EXPECT_EQ(0, message.repeated_sint32_size  ());\n  EXPECT_EQ(0, message.repeated_sint64_size  ());\n  EXPECT_EQ(0, message.repeated_fixed32_size ());\n  EXPECT_EQ(0, message.repeated_fixed64_size ());\n  EXPECT_EQ(0, message.repeated_sfixed32_size());\n  EXPECT_EQ(0, message.repeated_sfixed64_size());\n  EXPECT_EQ(0, message.repeated_float_size   ());\n  EXPECT_EQ(0, message.repeated_double_size  ());\n  EXPECT_EQ(0, message.repeated_bool_size    ());\n  EXPECT_EQ(0, message.repeated_string_size  ());\n  EXPECT_EQ(0, message.repeated_bytes_size   ());\n\n  EXPECT_EQ(0, message.repeatedgroup_size           ());\n  EXPECT_EQ(0, message.repeated_nested_message_size ());\n  EXPECT_EQ(0, message.repeated_foreign_message_size());\n  EXPECT_EQ(0, message.repeated_import_message_size ());\n  EXPECT_EQ(0, message.repeated_nested_enum_size    ());\n  EXPECT_EQ(0, message.repeated_foreign_enum_size   ());\n  EXPECT_EQ(0, message.repeated_import_enum_size    ());\n\n\n  // has_blah() should also be false for all default fields.\n  EXPECT_FALSE(message.has_default_int32   ());\n  EXPECT_FALSE(message.has_default_int64   ());\n  EXPECT_FALSE(message.has_default_uint32  ());\n  EXPECT_FALSE(message.has_default_uint64  ());\n  EXPECT_FALSE(message.has_default_sint32  ());\n  EXPECT_FALSE(message.has_default_sint64  ());\n  EXPECT_FALSE(message.has_default_fixed32 ());\n  EXPECT_FALSE(message.has_default_fixed64 ());\n  EXPECT_FALSE(message.has_default_sfixed32());\n  EXPECT_FALSE(message.has_default_sfixed64());\n  EXPECT_FALSE(message.has_default_float   ());\n  EXPECT_FALSE(message.has_default_double  ());\n  EXPECT_FALSE(message.has_default_bool    ());\n  EXPECT_FALSE(message.has_default_string  ());\n  EXPECT_FALSE(message.has_default_bytes   ());\n\n  EXPECT_FALSE(message.has_default_nested_enum ());\n  EXPECT_FALSE(message.has_default_foreign_enum());\n  EXPECT_FALSE(message.has_default_import_enum ());\n\n\n  // Fields with defaults have their default values (duh).\n  EXPECT_EQ( 41    , message.default_int32   ());\n  EXPECT_EQ( 42    , message.default_int64   ());\n  EXPECT_EQ( 43    , message.default_uint32  ());\n  EXPECT_EQ( 44    , message.default_uint64  ());\n  EXPECT_EQ(-45    , message.default_sint32  ());\n  EXPECT_EQ( 46    , message.default_sint64  ());\n  EXPECT_EQ( 47    , message.default_fixed32 ());\n  EXPECT_EQ( 48    , message.default_fixed64 ());\n  EXPECT_EQ( 49    , message.default_sfixed32());\n  EXPECT_EQ(-50    , message.default_sfixed64());\n  EXPECT_EQ( 51.5  , message.default_float   ());\n  EXPECT_EQ( 52e3  , message.default_double  ());\n  EXPECT_EQ(true   , message.default_bool    ());\n  EXPECT_EQ(\"hello\", message.default_string  ());\n  EXPECT_EQ(\"world\", message.default_bytes   ());\n\n  EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.default_nested_enum ());\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAR      , message.default_foreign_enum());\n  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.default_import_enum ());\n\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ExpectRepeatedFieldsModified(\n    const unittest::TestAllTypesLite& message) {\n  // ModifyRepeatedFields only sets the second repeated element of each\n  // field.  In addition to verifying this, we also verify that the first\n  // element and size were *not* modified.\n  ASSERT_EQ(2, message.repeated_int32_size   ());\n  ASSERT_EQ(2, message.repeated_int64_size   ());\n  ASSERT_EQ(2, message.repeated_uint32_size  ());\n  ASSERT_EQ(2, message.repeated_uint64_size  ());\n  ASSERT_EQ(2, message.repeated_sint32_size  ());\n  ASSERT_EQ(2, message.repeated_sint64_size  ());\n  ASSERT_EQ(2, message.repeated_fixed32_size ());\n  ASSERT_EQ(2, message.repeated_fixed64_size ());\n  ASSERT_EQ(2, message.repeated_sfixed32_size());\n  ASSERT_EQ(2, message.repeated_sfixed64_size());\n  ASSERT_EQ(2, message.repeated_float_size   ());\n  ASSERT_EQ(2, message.repeated_double_size  ());\n  ASSERT_EQ(2, message.repeated_bool_size    ());\n  ASSERT_EQ(2, message.repeated_string_size  ());\n  ASSERT_EQ(2, message.repeated_bytes_size   ());\n\n  ASSERT_EQ(2, message.repeatedgroup_size           ());\n  ASSERT_EQ(2, message.repeated_nested_message_size ());\n  ASSERT_EQ(2, message.repeated_foreign_message_size());\n  ASSERT_EQ(2, message.repeated_import_message_size ());\n  ASSERT_EQ(2, message.repeated_nested_enum_size    ());\n  ASSERT_EQ(2, message.repeated_foreign_enum_size   ());\n  ASSERT_EQ(2, message.repeated_import_enum_size    ());\n\n\n  EXPECT_EQ(201  , message.repeated_int32   (0));\n  EXPECT_EQ(202  , message.repeated_int64   (0));\n  EXPECT_EQ(203  , message.repeated_uint32  (0));\n  EXPECT_EQ(204  , message.repeated_uint64  (0));\n  EXPECT_EQ(205  , message.repeated_sint32  (0));\n  EXPECT_EQ(206  , message.repeated_sint64  (0));\n  EXPECT_EQ(207  , message.repeated_fixed32 (0));\n  EXPECT_EQ(208  , message.repeated_fixed64 (0));\n  EXPECT_EQ(209  , message.repeated_sfixed32(0));\n  EXPECT_EQ(210  , message.repeated_sfixed64(0));\n  EXPECT_EQ(211  , message.repeated_float   (0));\n  EXPECT_EQ(212  , message.repeated_double  (0));\n  EXPECT_EQ(true , message.repeated_bool    (0));\n  EXPECT_EQ(\"215\", message.repeated_string  (0));\n  EXPECT_EQ(\"216\", message.repeated_bytes   (0));\n\n  EXPECT_EQ(217, message.repeatedgroup           (0).a());\n  EXPECT_EQ(218, message.repeated_nested_message (0).bb());\n  EXPECT_EQ(219, message.repeated_foreign_message(0).c());\n  EXPECT_EQ(220, message.repeated_import_message (0).d());\n\n  EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.repeated_nested_enum (0));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAR      , message.repeated_foreign_enum(0));\n  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.repeated_import_enum (0));\n\n\n  // Actually verify the second (modified) elements now.\n  EXPECT_EQ(501  , message.repeated_int32   (1));\n  EXPECT_EQ(502  , message.repeated_int64   (1));\n  EXPECT_EQ(503  , message.repeated_uint32  (1));\n  EXPECT_EQ(504  , message.repeated_uint64  (1));\n  EXPECT_EQ(505  , message.repeated_sint32  (1));\n  EXPECT_EQ(506  , message.repeated_sint64  (1));\n  EXPECT_EQ(507  , message.repeated_fixed32 (1));\n  EXPECT_EQ(508  , message.repeated_fixed64 (1));\n  EXPECT_EQ(509  , message.repeated_sfixed32(1));\n  EXPECT_EQ(510  , message.repeated_sfixed64(1));\n  EXPECT_EQ(511  , message.repeated_float   (1));\n  EXPECT_EQ(512  , message.repeated_double  (1));\n  EXPECT_EQ(true , message.repeated_bool    (1));\n  EXPECT_EQ(\"515\", message.repeated_string  (1));\n  EXPECT_EQ(\"516\", message.repeated_bytes   (1));\n\n  EXPECT_EQ(517, message.repeatedgroup           (1).a());\n  EXPECT_EQ(518, message.repeated_nested_message (1).bb());\n  EXPECT_EQ(519, message.repeated_foreign_message(1).c());\n  EXPECT_EQ(520, message.repeated_import_message (1).d());\n\n  EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.repeated_nested_enum (1));\n  EXPECT_EQ(unittest::FOREIGN_LITE_FOO      , message.repeated_foreign_enum(1));\n  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.repeated_import_enum (1));\n\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::SetPackedFields(unittest::TestPackedTypesLite* message) {\n  message->add_packed_int32   (601);\n  message->add_packed_int64   (602);\n  message->add_packed_uint32  (603);\n  message->add_packed_uint64  (604);\n  message->add_packed_sint32  (605);\n  message->add_packed_sint64  (606);\n  message->add_packed_fixed32 (607);\n  message->add_packed_fixed64 (608);\n  message->add_packed_sfixed32(609);\n  message->add_packed_sfixed64(610);\n  message->add_packed_float   (611);\n  message->add_packed_double  (612);\n  message->add_packed_bool    (true);\n  message->add_packed_enum    (unittest::FOREIGN_LITE_BAR);\n  // add a second one of each field\n  message->add_packed_int32   (701);\n  message->add_packed_int64   (702);\n  message->add_packed_uint32  (703);\n  message->add_packed_uint64  (704);\n  message->add_packed_sint32  (705);\n  message->add_packed_sint64  (706);\n  message->add_packed_fixed32 (707);\n  message->add_packed_fixed64 (708);\n  message->add_packed_sfixed32(709);\n  message->add_packed_sfixed64(710);\n  message->add_packed_float   (711);\n  message->add_packed_double  (712);\n  message->add_packed_bool    (false);\n  message->add_packed_enum    (unittest::FOREIGN_LITE_BAZ);\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ModifyPackedFields(unittest::TestPackedTypesLite* message) {\n  message->set_packed_int32   (1, 801);\n  message->set_packed_int64   (1, 802);\n  message->set_packed_uint32  (1, 803);\n  message->set_packed_uint64  (1, 804);\n  message->set_packed_sint32  (1, 805);\n  message->set_packed_sint64  (1, 806);\n  message->set_packed_fixed32 (1, 807);\n  message->set_packed_fixed64 (1, 808);\n  message->set_packed_sfixed32(1, 809);\n  message->set_packed_sfixed64(1, 810);\n  message->set_packed_float   (1, 811);\n  message->set_packed_double  (1, 812);\n  message->set_packed_bool    (1, true);\n  message->set_packed_enum    (1, unittest::FOREIGN_LITE_FOO);\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ExpectPackedFieldsSet(\n    const unittest::TestPackedTypesLite& message) {\n  ASSERT_EQ(2, message.packed_int32_size   ());\n  ASSERT_EQ(2, message.packed_int64_size   ());\n  ASSERT_EQ(2, message.packed_uint32_size  ());\n  ASSERT_EQ(2, message.packed_uint64_size  ());\n  ASSERT_EQ(2, message.packed_sint32_size  ());\n  ASSERT_EQ(2, message.packed_sint64_size  ());\n  ASSERT_EQ(2, message.packed_fixed32_size ());\n  ASSERT_EQ(2, message.packed_fixed64_size ());\n  ASSERT_EQ(2, message.packed_sfixed32_size());\n  ASSERT_EQ(2, message.packed_sfixed64_size());\n  ASSERT_EQ(2, message.packed_float_size   ());\n  ASSERT_EQ(2, message.packed_double_size  ());\n  ASSERT_EQ(2, message.packed_bool_size    ());\n  ASSERT_EQ(2, message.packed_enum_size    ());\n\n  EXPECT_EQ(601  , message.packed_int32   (0));\n  EXPECT_EQ(602  , message.packed_int64   (0));\n  EXPECT_EQ(603  , message.packed_uint32  (0));\n  EXPECT_EQ(604  , message.packed_uint64  (0));\n  EXPECT_EQ(605  , message.packed_sint32  (0));\n  EXPECT_EQ(606  , message.packed_sint64  (0));\n  EXPECT_EQ(607  , message.packed_fixed32 (0));\n  EXPECT_EQ(608  , message.packed_fixed64 (0));\n  EXPECT_EQ(609  , message.packed_sfixed32(0));\n  EXPECT_EQ(610  , message.packed_sfixed64(0));\n  EXPECT_EQ(611  , message.packed_float   (0));\n  EXPECT_EQ(612  , message.packed_double  (0));\n  EXPECT_EQ(true , message.packed_bool    (0));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAR, message.packed_enum(0));\n\n  EXPECT_EQ(701  , message.packed_int32   (1));\n  EXPECT_EQ(702  , message.packed_int64   (1));\n  EXPECT_EQ(703  , message.packed_uint32  (1));\n  EXPECT_EQ(704  , message.packed_uint64  (1));\n  EXPECT_EQ(705  , message.packed_sint32  (1));\n  EXPECT_EQ(706  , message.packed_sint64  (1));\n  EXPECT_EQ(707  , message.packed_fixed32 (1));\n  EXPECT_EQ(708  , message.packed_fixed64 (1));\n  EXPECT_EQ(709  , message.packed_sfixed32(1));\n  EXPECT_EQ(710  , message.packed_sfixed64(1));\n  EXPECT_EQ(711  , message.packed_float   (1));\n  EXPECT_EQ(712  , message.packed_double  (1));\n  EXPECT_EQ(false, message.packed_bool    (1));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAZ, message.packed_enum(1));\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ExpectPackedClear(\n    const unittest::TestPackedTypesLite& message) {\n  // Packed repeated fields are empty.\n  EXPECT_EQ(0, message.packed_int32_size   ());\n  EXPECT_EQ(0, message.packed_int64_size   ());\n  EXPECT_EQ(0, message.packed_uint32_size  ());\n  EXPECT_EQ(0, message.packed_uint64_size  ());\n  EXPECT_EQ(0, message.packed_sint32_size  ());\n  EXPECT_EQ(0, message.packed_sint64_size  ());\n  EXPECT_EQ(0, message.packed_fixed32_size ());\n  EXPECT_EQ(0, message.packed_fixed64_size ());\n  EXPECT_EQ(0, message.packed_sfixed32_size());\n  EXPECT_EQ(0, message.packed_sfixed64_size());\n  EXPECT_EQ(0, message.packed_float_size   ());\n  EXPECT_EQ(0, message.packed_double_size  ());\n  EXPECT_EQ(0, message.packed_bool_size    ());\n  EXPECT_EQ(0, message.packed_enum_size    ());\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ExpectPackedFieldsModified(\n    const unittest::TestPackedTypesLite& message) {\n  // Do the same for packed repeated fields.\n  ASSERT_EQ(2, message.packed_int32_size   ());\n  ASSERT_EQ(2, message.packed_int64_size   ());\n  ASSERT_EQ(2, message.packed_uint32_size  ());\n  ASSERT_EQ(2, message.packed_uint64_size  ());\n  ASSERT_EQ(2, message.packed_sint32_size  ());\n  ASSERT_EQ(2, message.packed_sint64_size  ());\n  ASSERT_EQ(2, message.packed_fixed32_size ());\n  ASSERT_EQ(2, message.packed_fixed64_size ());\n  ASSERT_EQ(2, message.packed_sfixed32_size());\n  ASSERT_EQ(2, message.packed_sfixed64_size());\n  ASSERT_EQ(2, message.packed_float_size   ());\n  ASSERT_EQ(2, message.packed_double_size  ());\n  ASSERT_EQ(2, message.packed_bool_size    ());\n  ASSERT_EQ(2, message.packed_enum_size    ());\n\n  EXPECT_EQ(601  , message.packed_int32   (0));\n  EXPECT_EQ(602  , message.packed_int64   (0));\n  EXPECT_EQ(603  , message.packed_uint32  (0));\n  EXPECT_EQ(604  , message.packed_uint64  (0));\n  EXPECT_EQ(605  , message.packed_sint32  (0));\n  EXPECT_EQ(606  , message.packed_sint64  (0));\n  EXPECT_EQ(607  , message.packed_fixed32 (0));\n  EXPECT_EQ(608  , message.packed_fixed64 (0));\n  EXPECT_EQ(609  , message.packed_sfixed32(0));\n  EXPECT_EQ(610  , message.packed_sfixed64(0));\n  EXPECT_EQ(611  , message.packed_float   (0));\n  EXPECT_EQ(612  , message.packed_double  (0));\n  EXPECT_EQ(true , message.packed_bool    (0));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAR, message.packed_enum(0));\n  // Actually verify the second (modified) elements now.\n  EXPECT_EQ(801  , message.packed_int32   (1));\n  EXPECT_EQ(802  , message.packed_int64   (1));\n  EXPECT_EQ(803  , message.packed_uint32  (1));\n  EXPECT_EQ(804  , message.packed_uint64  (1));\n  EXPECT_EQ(805  , message.packed_sint32  (1));\n  EXPECT_EQ(806  , message.packed_sint64  (1));\n  EXPECT_EQ(807  , message.packed_fixed32 (1));\n  EXPECT_EQ(808  , message.packed_fixed64 (1));\n  EXPECT_EQ(809  , message.packed_sfixed32(1));\n  EXPECT_EQ(810  , message.packed_sfixed64(1));\n  EXPECT_EQ(811  , message.packed_float   (1));\n  EXPECT_EQ(812  , message.packed_double  (1));\n  EXPECT_EQ(true , message.packed_bool    (1));\n  EXPECT_EQ(unittest::FOREIGN_LITE_FOO, message.packed_enum(1));\n}\n\n// ===================================================================\n// Extensions\n//\n// All this code is exactly equivalent to the above code except that it's\n// manipulating extension fields instead of normal ones.\n//\n// I gave up on the 80-char limit here.  Sorry.\n\nvoid TestUtilLite::SetAllExtensions(unittest::TestAllExtensionsLite* message) {\n  message->SetExtension(unittest::optional_int32_extension_lite   , 101);\n  message->SetExtension(unittest::optional_int64_extension_lite   , 102);\n  message->SetExtension(unittest::optional_uint32_extension_lite  , 103);\n  message->SetExtension(unittest::optional_uint64_extension_lite  , 104);\n  message->SetExtension(unittest::optional_sint32_extension_lite  , 105);\n  message->SetExtension(unittest::optional_sint64_extension_lite  , 106);\n  message->SetExtension(unittest::optional_fixed32_extension_lite , 107);\n  message->SetExtension(unittest::optional_fixed64_extension_lite , 108);\n  message->SetExtension(unittest::optional_sfixed32_extension_lite, 109);\n  message->SetExtension(unittest::optional_sfixed64_extension_lite, 110);\n  message->SetExtension(unittest::optional_float_extension_lite   , 111);\n  message->SetExtension(unittest::optional_double_extension_lite  , 112);\n  message->SetExtension(unittest::optional_bool_extension_lite    , true);\n  message->SetExtension(unittest::optional_string_extension_lite  , \"115\");\n  message->SetExtension(unittest::optional_bytes_extension_lite   , \"116\");\n\n  message->MutableExtension(unittest::optionalgroup_extension_lite           )->set_a(117);\n  message->MutableExtension(unittest::optional_nested_message_extension_lite )->set_bb(118);\n  message->MutableExtension(unittest::optional_foreign_message_extension_lite)->set_c(119);\n  message->MutableExtension(unittest::optional_import_message_extension_lite )->set_d(120);\n\n  message->SetExtension(unittest::optional_nested_enum_extension_lite , unittest::TestAllTypesLite::BAZ );\n  message->SetExtension(unittest::optional_foreign_enum_extension_lite, unittest::FOREIGN_LITE_BAZ      );\n  message->SetExtension(unittest::optional_import_enum_extension_lite , unittest_import::IMPORT_LITE_BAZ);\n\n\n  // -----------------------------------------------------------------\n\n  message->AddExtension(unittest::repeated_int32_extension_lite   , 201);\n  message->AddExtension(unittest::repeated_int64_extension_lite   , 202);\n  message->AddExtension(unittest::repeated_uint32_extension_lite  , 203);\n  message->AddExtension(unittest::repeated_uint64_extension_lite  , 204);\n  message->AddExtension(unittest::repeated_sint32_extension_lite  , 205);\n  message->AddExtension(unittest::repeated_sint64_extension_lite  , 206);\n  message->AddExtension(unittest::repeated_fixed32_extension_lite , 207);\n  message->AddExtension(unittest::repeated_fixed64_extension_lite , 208);\n  message->AddExtension(unittest::repeated_sfixed32_extension_lite, 209);\n  message->AddExtension(unittest::repeated_sfixed64_extension_lite, 210);\n  message->AddExtension(unittest::repeated_float_extension_lite   , 211);\n  message->AddExtension(unittest::repeated_double_extension_lite  , 212);\n  message->AddExtension(unittest::repeated_bool_extension_lite    , true);\n  message->AddExtension(unittest::repeated_string_extension_lite  , \"215\");\n  message->AddExtension(unittest::repeated_bytes_extension_lite   , \"216\");\n\n  message->AddExtension(unittest::repeatedgroup_extension_lite           )->set_a(217);\n  message->AddExtension(unittest::repeated_nested_message_extension_lite )->set_bb(218);\n  message->AddExtension(unittest::repeated_foreign_message_extension_lite)->set_c(219);\n  message->AddExtension(unittest::repeated_import_message_extension_lite )->set_d(220);\n\n  message->AddExtension(unittest::repeated_nested_enum_extension_lite , unittest::TestAllTypesLite::BAR );\n  message->AddExtension(unittest::repeated_foreign_enum_extension_lite, unittest::FOREIGN_LITE_BAR      );\n  message->AddExtension(unittest::repeated_import_enum_extension_lite , unittest_import::IMPORT_LITE_BAR);\n\n\n  // Add a second one of each field.\n  message->AddExtension(unittest::repeated_int32_extension_lite   , 301);\n  message->AddExtension(unittest::repeated_int64_extension_lite   , 302);\n  message->AddExtension(unittest::repeated_uint32_extension_lite  , 303);\n  message->AddExtension(unittest::repeated_uint64_extension_lite  , 304);\n  message->AddExtension(unittest::repeated_sint32_extension_lite  , 305);\n  message->AddExtension(unittest::repeated_sint64_extension_lite  , 306);\n  message->AddExtension(unittest::repeated_fixed32_extension_lite , 307);\n  message->AddExtension(unittest::repeated_fixed64_extension_lite , 308);\n  message->AddExtension(unittest::repeated_sfixed32_extension_lite, 309);\n  message->AddExtension(unittest::repeated_sfixed64_extension_lite, 310);\n  message->AddExtension(unittest::repeated_float_extension_lite   , 311);\n  message->AddExtension(unittest::repeated_double_extension_lite  , 312);\n  message->AddExtension(unittest::repeated_bool_extension_lite    , false);\n  message->AddExtension(unittest::repeated_string_extension_lite  , \"315\");\n  message->AddExtension(unittest::repeated_bytes_extension_lite   , \"316\");\n\n  message->AddExtension(unittest::repeatedgroup_extension_lite           )->set_a(317);\n  message->AddExtension(unittest::repeated_nested_message_extension_lite )->set_bb(318);\n  message->AddExtension(unittest::repeated_foreign_message_extension_lite)->set_c(319);\n  message->AddExtension(unittest::repeated_import_message_extension_lite )->set_d(320);\n\n  message->AddExtension(unittest::repeated_nested_enum_extension_lite , unittest::TestAllTypesLite::BAZ );\n  message->AddExtension(unittest::repeated_foreign_enum_extension_lite, unittest::FOREIGN_LITE_BAZ      );\n  message->AddExtension(unittest::repeated_import_enum_extension_lite , unittest_import::IMPORT_LITE_BAZ);\n\n\n  // -----------------------------------------------------------------\n\n  message->SetExtension(unittest::default_int32_extension_lite   , 401);\n  message->SetExtension(unittest::default_int64_extension_lite   , 402);\n  message->SetExtension(unittest::default_uint32_extension_lite  , 403);\n  message->SetExtension(unittest::default_uint64_extension_lite  , 404);\n  message->SetExtension(unittest::default_sint32_extension_lite  , 405);\n  message->SetExtension(unittest::default_sint64_extension_lite  , 406);\n  message->SetExtension(unittest::default_fixed32_extension_lite , 407);\n  message->SetExtension(unittest::default_fixed64_extension_lite , 408);\n  message->SetExtension(unittest::default_sfixed32_extension_lite, 409);\n  message->SetExtension(unittest::default_sfixed64_extension_lite, 410);\n  message->SetExtension(unittest::default_float_extension_lite   , 411);\n  message->SetExtension(unittest::default_double_extension_lite  , 412);\n  message->SetExtension(unittest::default_bool_extension_lite    , false);\n  message->SetExtension(unittest::default_string_extension_lite  , \"415\");\n  message->SetExtension(unittest::default_bytes_extension_lite   , \"416\");\n\n  message->SetExtension(unittest::default_nested_enum_extension_lite , unittest::TestAllTypesLite::FOO );\n  message->SetExtension(unittest::default_foreign_enum_extension_lite, unittest::FOREIGN_LITE_FOO      );\n  message->SetExtension(unittest::default_import_enum_extension_lite , unittest_import::IMPORT_LITE_FOO);\n\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ModifyRepeatedExtensions(\n    unittest::TestAllExtensionsLite* message) {\n  message->SetExtension(unittest::repeated_int32_extension_lite   , 1, 501);\n  message->SetExtension(unittest::repeated_int64_extension_lite   , 1, 502);\n  message->SetExtension(unittest::repeated_uint32_extension_lite  , 1, 503);\n  message->SetExtension(unittest::repeated_uint64_extension_lite  , 1, 504);\n  message->SetExtension(unittest::repeated_sint32_extension_lite  , 1, 505);\n  message->SetExtension(unittest::repeated_sint64_extension_lite  , 1, 506);\n  message->SetExtension(unittest::repeated_fixed32_extension_lite , 1, 507);\n  message->SetExtension(unittest::repeated_fixed64_extension_lite , 1, 508);\n  message->SetExtension(unittest::repeated_sfixed32_extension_lite, 1, 509);\n  message->SetExtension(unittest::repeated_sfixed64_extension_lite, 1, 510);\n  message->SetExtension(unittest::repeated_float_extension_lite   , 1, 511);\n  message->SetExtension(unittest::repeated_double_extension_lite  , 1, 512);\n  message->SetExtension(unittest::repeated_bool_extension_lite    , 1, true);\n  message->SetExtension(unittest::repeated_string_extension_lite  , 1, \"515\");\n  message->SetExtension(unittest::repeated_bytes_extension_lite   , 1, \"516\");\n\n  message->MutableExtension(unittest::repeatedgroup_extension_lite           , 1)->set_a(517);\n  message->MutableExtension(unittest::repeated_nested_message_extension_lite , 1)->set_bb(518);\n  message->MutableExtension(unittest::repeated_foreign_message_extension_lite, 1)->set_c(519);\n  message->MutableExtension(unittest::repeated_import_message_extension_lite , 1)->set_d(520);\n\n  message->SetExtension(unittest::repeated_nested_enum_extension_lite , 1, unittest::TestAllTypesLite::FOO );\n  message->SetExtension(unittest::repeated_foreign_enum_extension_lite, 1, unittest::FOREIGN_LITE_FOO      );\n  message->SetExtension(unittest::repeated_import_enum_extension_lite , 1, unittest_import::IMPORT_LITE_FOO);\n\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ExpectAllExtensionsSet(\n    const unittest::TestAllExtensionsLite& message) {\n  EXPECT_TRUE(message.HasExtension(unittest::optional_int32_extension_lite   ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_int64_extension_lite   ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_uint32_extension_lite  ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_uint64_extension_lite  ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_sint32_extension_lite  ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_sint64_extension_lite  ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_fixed32_extension_lite ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_fixed64_extension_lite ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed32_extension_lite));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed64_extension_lite));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_float_extension_lite   ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_double_extension_lite  ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_bool_extension_lite    ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_string_extension_lite  ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_bytes_extension_lite   ));\n\n  EXPECT_TRUE(message.HasExtension(unittest::optionalgroup_extension_lite           ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_nested_message_extension_lite ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_message_extension_lite));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_import_message_extension_lite ));\n\n  EXPECT_TRUE(message.GetExtension(unittest::optionalgroup_extension_lite           ).has_a());\n  EXPECT_TRUE(message.GetExtension(unittest::optional_nested_message_extension_lite ).has_bb());\n  EXPECT_TRUE(message.GetExtension(unittest::optional_foreign_message_extension_lite).has_c());\n  EXPECT_TRUE(message.GetExtension(unittest::optional_import_message_extension_lite ).has_d());\n\n  EXPECT_TRUE(message.HasExtension(unittest::optional_nested_enum_extension_lite ));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_enum_extension_lite));\n  EXPECT_TRUE(message.HasExtension(unittest::optional_import_enum_extension_lite ));\n\n\n  EXPECT_EQ(101  , message.GetExtension(unittest::optional_int32_extension_lite   ));\n  EXPECT_EQ(102  , message.GetExtension(unittest::optional_int64_extension_lite   ));\n  EXPECT_EQ(103  , message.GetExtension(unittest::optional_uint32_extension_lite  ));\n  EXPECT_EQ(104  , message.GetExtension(unittest::optional_uint64_extension_lite  ));\n  EXPECT_EQ(105  , message.GetExtension(unittest::optional_sint32_extension_lite  ));\n  EXPECT_EQ(106  , message.GetExtension(unittest::optional_sint64_extension_lite  ));\n  EXPECT_EQ(107  , message.GetExtension(unittest::optional_fixed32_extension_lite ));\n  EXPECT_EQ(108  , message.GetExtension(unittest::optional_fixed64_extension_lite ));\n  EXPECT_EQ(109  , message.GetExtension(unittest::optional_sfixed32_extension_lite));\n  EXPECT_EQ(110  , message.GetExtension(unittest::optional_sfixed64_extension_lite));\n  EXPECT_EQ(111  , message.GetExtension(unittest::optional_float_extension_lite   ));\n  EXPECT_EQ(112  , message.GetExtension(unittest::optional_double_extension_lite  ));\n  EXPECT_EQ(true , message.GetExtension(unittest::optional_bool_extension_lite    ));\n  EXPECT_EQ(\"115\", message.GetExtension(unittest::optional_string_extension_lite  ));\n  EXPECT_EQ(\"116\", message.GetExtension(unittest::optional_bytes_extension_lite   ));\n\n  EXPECT_EQ(117, message.GetExtension(unittest::optionalgroup_extension_lite           ).a());\n  EXPECT_EQ(118, message.GetExtension(unittest::optional_nested_message_extension_lite ).bb());\n  EXPECT_EQ(119, message.GetExtension(unittest::optional_foreign_message_extension_lite).c());\n  EXPECT_EQ(120, message.GetExtension(unittest::optional_import_message_extension_lite ).d());\n\n  EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.GetExtension(unittest::optional_nested_enum_extension_lite ));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAZ      , message.GetExtension(unittest::optional_foreign_enum_extension_lite));\n  EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.GetExtension(unittest::optional_import_enum_extension_lite ));\n\n\n  // -----------------------------------------------------------------\n\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension_lite ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension_lite ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension_lite));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension_lite));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension_lite    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension_lite   ));\n\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension_lite           ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension_lite ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension_lite));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension_lite ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension_lite    ));\n\n\n  EXPECT_EQ(201  , message.GetExtension(unittest::repeated_int32_extension_lite   , 0));\n  EXPECT_EQ(202  , message.GetExtension(unittest::repeated_int64_extension_lite   , 0));\n  EXPECT_EQ(203  , message.GetExtension(unittest::repeated_uint32_extension_lite  , 0));\n  EXPECT_EQ(204  , message.GetExtension(unittest::repeated_uint64_extension_lite  , 0));\n  EXPECT_EQ(205  , message.GetExtension(unittest::repeated_sint32_extension_lite  , 0));\n  EXPECT_EQ(206  , message.GetExtension(unittest::repeated_sint64_extension_lite  , 0));\n  EXPECT_EQ(207  , message.GetExtension(unittest::repeated_fixed32_extension_lite , 0));\n  EXPECT_EQ(208  , message.GetExtension(unittest::repeated_fixed64_extension_lite , 0));\n  EXPECT_EQ(209  , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 0));\n  EXPECT_EQ(210  , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 0));\n  EXPECT_EQ(211  , message.GetExtension(unittest::repeated_float_extension_lite   , 0));\n  EXPECT_EQ(212  , message.GetExtension(unittest::repeated_double_extension_lite  , 0));\n  EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension_lite    , 0));\n  EXPECT_EQ(\"215\", message.GetExtension(unittest::repeated_string_extension_lite  , 0));\n  EXPECT_EQ(\"216\", message.GetExtension(unittest::repeated_bytes_extension_lite   , 0));\n\n  EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension_lite           , 0).a());\n  EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension_lite , 0).bb());\n  EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 0).c());\n  EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension_lite , 0).d());\n\n  EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 0));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAR      , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 0));\n  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.GetExtension(unittest::repeated_import_enum_extension_lite , 0));\n\n\n  EXPECT_EQ(301  , message.GetExtension(unittest::repeated_int32_extension_lite   , 1));\n  EXPECT_EQ(302  , message.GetExtension(unittest::repeated_int64_extension_lite   , 1));\n  EXPECT_EQ(303  , message.GetExtension(unittest::repeated_uint32_extension_lite  , 1));\n  EXPECT_EQ(304  , message.GetExtension(unittest::repeated_uint64_extension_lite  , 1));\n  EXPECT_EQ(305  , message.GetExtension(unittest::repeated_sint32_extension_lite  , 1));\n  EXPECT_EQ(306  , message.GetExtension(unittest::repeated_sint64_extension_lite  , 1));\n  EXPECT_EQ(307  , message.GetExtension(unittest::repeated_fixed32_extension_lite , 1));\n  EXPECT_EQ(308  , message.GetExtension(unittest::repeated_fixed64_extension_lite , 1));\n  EXPECT_EQ(309  , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 1));\n  EXPECT_EQ(310  , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 1));\n  EXPECT_EQ(311  , message.GetExtension(unittest::repeated_float_extension_lite   , 1));\n  EXPECT_EQ(312  , message.GetExtension(unittest::repeated_double_extension_lite  , 1));\n  EXPECT_EQ(false, message.GetExtension(unittest::repeated_bool_extension_lite    , 1));\n  EXPECT_EQ(\"315\", message.GetExtension(unittest::repeated_string_extension_lite  , 1));\n  EXPECT_EQ(\"316\", message.GetExtension(unittest::repeated_bytes_extension_lite   , 1));\n\n  EXPECT_EQ(317, message.GetExtension(unittest::repeatedgroup_extension_lite           , 1).a());\n  EXPECT_EQ(318, message.GetExtension(unittest::repeated_nested_message_extension_lite , 1).bb());\n  EXPECT_EQ(319, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 1).c());\n  EXPECT_EQ(320, message.GetExtension(unittest::repeated_import_message_extension_lite , 1).d());\n\n  EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 1));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAZ      , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 1));\n  EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.GetExtension(unittest::repeated_import_enum_extension_lite , 1));\n\n\n  // -----------------------------------------------------------------\n\n  EXPECT_TRUE(message.HasExtension(unittest::default_int32_extension_lite   ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_int64_extension_lite   ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_uint32_extension_lite  ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_uint64_extension_lite  ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_sint32_extension_lite  ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_sint64_extension_lite  ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_fixed32_extension_lite ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_fixed64_extension_lite ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_sfixed32_extension_lite));\n  EXPECT_TRUE(message.HasExtension(unittest::default_sfixed64_extension_lite));\n  EXPECT_TRUE(message.HasExtension(unittest::default_float_extension_lite   ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_double_extension_lite  ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_bool_extension_lite    ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_string_extension_lite  ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_bytes_extension_lite   ));\n\n  EXPECT_TRUE(message.HasExtension(unittest::default_nested_enum_extension_lite ));\n  EXPECT_TRUE(message.HasExtension(unittest::default_foreign_enum_extension_lite));\n  EXPECT_TRUE(message.HasExtension(unittest::default_import_enum_extension_lite ));\n\n\n  EXPECT_EQ(401  , message.GetExtension(unittest::default_int32_extension_lite   ));\n  EXPECT_EQ(402  , message.GetExtension(unittest::default_int64_extension_lite   ));\n  EXPECT_EQ(403  , message.GetExtension(unittest::default_uint32_extension_lite  ));\n  EXPECT_EQ(404  , message.GetExtension(unittest::default_uint64_extension_lite  ));\n  EXPECT_EQ(405  , message.GetExtension(unittest::default_sint32_extension_lite  ));\n  EXPECT_EQ(406  , message.GetExtension(unittest::default_sint64_extension_lite  ));\n  EXPECT_EQ(407  , message.GetExtension(unittest::default_fixed32_extension_lite ));\n  EXPECT_EQ(408  , message.GetExtension(unittest::default_fixed64_extension_lite ));\n  EXPECT_EQ(409  , message.GetExtension(unittest::default_sfixed32_extension_lite));\n  EXPECT_EQ(410  , message.GetExtension(unittest::default_sfixed64_extension_lite));\n  EXPECT_EQ(411  , message.GetExtension(unittest::default_float_extension_lite   ));\n  EXPECT_EQ(412  , message.GetExtension(unittest::default_double_extension_lite  ));\n  EXPECT_EQ(false, message.GetExtension(unittest::default_bool_extension_lite    ));\n  EXPECT_EQ(\"415\", message.GetExtension(unittest::default_string_extension_lite  ));\n  EXPECT_EQ(\"416\", message.GetExtension(unittest::default_bytes_extension_lite   ));\n\n  EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.GetExtension(unittest::default_nested_enum_extension_lite ));\n  EXPECT_EQ(unittest::FOREIGN_LITE_FOO      , message.GetExtension(unittest::default_foreign_enum_extension_lite));\n  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.GetExtension(unittest::default_import_enum_extension_lite ));\n\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ExpectExtensionsClear(\n    const unittest::TestAllExtensionsLite& message) {\n  string serialized;\n  ASSERT_TRUE(message.SerializeToString(&serialized));\n  EXPECT_EQ(\"\", serialized);\n  EXPECT_EQ(0, message.ByteSize());\n\n  // has_blah() should initially be false for all optional fields.\n  EXPECT_FALSE(message.HasExtension(unittest::optional_int32_extension_lite   ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_int64_extension_lite   ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_uint32_extension_lite  ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_uint64_extension_lite  ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_sint32_extension_lite  ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_sint64_extension_lite  ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_fixed32_extension_lite ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_fixed64_extension_lite ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed32_extension_lite));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed64_extension_lite));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_float_extension_lite   ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_double_extension_lite  ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_bool_extension_lite    ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_string_extension_lite  ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_bytes_extension_lite   ));\n\n  EXPECT_FALSE(message.HasExtension(unittest::optionalgroup_extension_lite           ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_nested_message_extension_lite ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_message_extension_lite));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_import_message_extension_lite ));\n\n  EXPECT_FALSE(message.HasExtension(unittest::optional_nested_enum_extension_lite ));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_enum_extension_lite));\n  EXPECT_FALSE(message.HasExtension(unittest::optional_import_enum_extension_lite ));\n\n\n  // Optional fields without defaults are set to zero or something like it.\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_int32_extension_lite   ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_int64_extension_lite   ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_uint32_extension_lite  ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_uint64_extension_lite  ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_sint32_extension_lite  ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_sint64_extension_lite  ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_fixed32_extension_lite ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_fixed64_extension_lite ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_sfixed32_extension_lite));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_sfixed64_extension_lite));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_float_extension_lite   ));\n  EXPECT_EQ(0    , message.GetExtension(unittest::optional_double_extension_lite  ));\n  EXPECT_EQ(false, message.GetExtension(unittest::optional_bool_extension_lite    ));\n  EXPECT_EQ(\"\"   , message.GetExtension(unittest::optional_string_extension_lite  ));\n  EXPECT_EQ(\"\"   , message.GetExtension(unittest::optional_bytes_extension_lite   ));\n\n  // Embedded messages should also be clear.\n  EXPECT_FALSE(message.GetExtension(unittest::optionalgroup_extension_lite           ).has_a());\n  EXPECT_FALSE(message.GetExtension(unittest::optional_nested_message_extension_lite ).has_bb());\n  EXPECT_FALSE(message.GetExtension(unittest::optional_foreign_message_extension_lite).has_c());\n  EXPECT_FALSE(message.GetExtension(unittest::optional_import_message_extension_lite ).has_d());\n\n  EXPECT_EQ(0, message.GetExtension(unittest::optionalgroup_extension_lite           ).a());\n  EXPECT_EQ(0, message.GetExtension(unittest::optional_nested_message_extension_lite ).bb());\n  EXPECT_EQ(0, message.GetExtension(unittest::optional_foreign_message_extension_lite).c());\n  EXPECT_EQ(0, message.GetExtension(unittest::optional_import_message_extension_lite ).d());\n\n  // Enums without defaults are set to the first value in the enum.\n  EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.GetExtension(unittest::optional_nested_enum_extension_lite ));\n  EXPECT_EQ(unittest::FOREIGN_LITE_FOO      , message.GetExtension(unittest::optional_foreign_enum_extension_lite));\n  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.GetExtension(unittest::optional_import_enum_extension_lite ));\n\n\n  // Repeated fields are empty.\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int32_extension_lite   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int64_extension_lite   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint32_extension_lite  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint64_extension_lite  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint32_extension_lite  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint64_extension_lite  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed32_extension_lite ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed64_extension_lite ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed32_extension_lite));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed64_extension_lite));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_float_extension_lite   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_double_extension_lite  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bool_extension_lite    ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_string_extension_lite  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bytes_extension_lite   ));\n\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeatedgroup_extension_lite           ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_message_extension_lite ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_message_extension_lite));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_message_extension_lite ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite    ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_enum_extension_lite    ));\n\n\n  // has_blah() should also be false for all default fields.\n  EXPECT_FALSE(message.HasExtension(unittest::default_int32_extension_lite   ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_int64_extension_lite   ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_uint32_extension_lite  ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_uint64_extension_lite  ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_sint32_extension_lite  ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_sint64_extension_lite  ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_fixed32_extension_lite ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_fixed64_extension_lite ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_sfixed32_extension_lite));\n  EXPECT_FALSE(message.HasExtension(unittest::default_sfixed64_extension_lite));\n  EXPECT_FALSE(message.HasExtension(unittest::default_float_extension_lite   ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_double_extension_lite  ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_bool_extension_lite    ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_string_extension_lite  ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_bytes_extension_lite   ));\n\n  EXPECT_FALSE(message.HasExtension(unittest::default_nested_enum_extension_lite ));\n  EXPECT_FALSE(message.HasExtension(unittest::default_foreign_enum_extension_lite));\n  EXPECT_FALSE(message.HasExtension(unittest::default_import_enum_extension_lite ));\n\n\n  // Fields with defaults have their default values (duh).\n  EXPECT_EQ( 41    , message.GetExtension(unittest::default_int32_extension_lite   ));\n  EXPECT_EQ( 42    , message.GetExtension(unittest::default_int64_extension_lite   ));\n  EXPECT_EQ( 43    , message.GetExtension(unittest::default_uint32_extension_lite  ));\n  EXPECT_EQ( 44    , message.GetExtension(unittest::default_uint64_extension_lite  ));\n  EXPECT_EQ(-45    , message.GetExtension(unittest::default_sint32_extension_lite  ));\n  EXPECT_EQ( 46    , message.GetExtension(unittest::default_sint64_extension_lite  ));\n  EXPECT_EQ( 47    , message.GetExtension(unittest::default_fixed32_extension_lite ));\n  EXPECT_EQ( 48    , message.GetExtension(unittest::default_fixed64_extension_lite ));\n  EXPECT_EQ( 49    , message.GetExtension(unittest::default_sfixed32_extension_lite));\n  EXPECT_EQ(-50    , message.GetExtension(unittest::default_sfixed64_extension_lite));\n  EXPECT_EQ( 51.5  , message.GetExtension(unittest::default_float_extension_lite   ));\n  EXPECT_EQ( 52e3  , message.GetExtension(unittest::default_double_extension_lite  ));\n  EXPECT_EQ(true   , message.GetExtension(unittest::default_bool_extension_lite    ));\n  EXPECT_EQ(\"hello\", message.GetExtension(unittest::default_string_extension_lite  ));\n  EXPECT_EQ(\"world\", message.GetExtension(unittest::default_bytes_extension_lite   ));\n\n  EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.GetExtension(unittest::default_nested_enum_extension_lite ));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAR      , message.GetExtension(unittest::default_foreign_enum_extension_lite));\n  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.GetExtension(unittest::default_import_enum_extension_lite ));\n\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ExpectRepeatedExtensionsModified(\n    const unittest::TestAllExtensionsLite& message) {\n  // ModifyRepeatedFields only sets the second repeated element of each\n  // field.  In addition to verifying this, we also verify that the first\n  // element and size were *not* modified.\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension_lite ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension_lite ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension_lite));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension_lite));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension_lite    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension_lite   ));\n\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension_lite           ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension_lite ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension_lite));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension_lite ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension_lite    ));\n\n\n  EXPECT_EQ(201  , message.GetExtension(unittest::repeated_int32_extension_lite   , 0));\n  EXPECT_EQ(202  , message.GetExtension(unittest::repeated_int64_extension_lite   , 0));\n  EXPECT_EQ(203  , message.GetExtension(unittest::repeated_uint32_extension_lite  , 0));\n  EXPECT_EQ(204  , message.GetExtension(unittest::repeated_uint64_extension_lite  , 0));\n  EXPECT_EQ(205  , message.GetExtension(unittest::repeated_sint32_extension_lite  , 0));\n  EXPECT_EQ(206  , message.GetExtension(unittest::repeated_sint64_extension_lite  , 0));\n  EXPECT_EQ(207  , message.GetExtension(unittest::repeated_fixed32_extension_lite , 0));\n  EXPECT_EQ(208  , message.GetExtension(unittest::repeated_fixed64_extension_lite , 0));\n  EXPECT_EQ(209  , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 0));\n  EXPECT_EQ(210  , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 0));\n  EXPECT_EQ(211  , message.GetExtension(unittest::repeated_float_extension_lite   , 0));\n  EXPECT_EQ(212  , message.GetExtension(unittest::repeated_double_extension_lite  , 0));\n  EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension_lite    , 0));\n  EXPECT_EQ(\"215\", message.GetExtension(unittest::repeated_string_extension_lite  , 0));\n  EXPECT_EQ(\"216\", message.GetExtension(unittest::repeated_bytes_extension_lite   , 0));\n\n  EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension_lite           , 0).a());\n  EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension_lite , 0).bb());\n  EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 0).c());\n  EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension_lite , 0).d());\n\n  EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 0));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAR      , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 0));\n  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.GetExtension(unittest::repeated_import_enum_extension_lite , 0));\n\n\n  // Actually verify the second (modified) elements now.\n  EXPECT_EQ(501  , message.GetExtension(unittest::repeated_int32_extension_lite   , 1));\n  EXPECT_EQ(502  , message.GetExtension(unittest::repeated_int64_extension_lite   , 1));\n  EXPECT_EQ(503  , message.GetExtension(unittest::repeated_uint32_extension_lite  , 1));\n  EXPECT_EQ(504  , message.GetExtension(unittest::repeated_uint64_extension_lite  , 1));\n  EXPECT_EQ(505  , message.GetExtension(unittest::repeated_sint32_extension_lite  , 1));\n  EXPECT_EQ(506  , message.GetExtension(unittest::repeated_sint64_extension_lite  , 1));\n  EXPECT_EQ(507  , message.GetExtension(unittest::repeated_fixed32_extension_lite , 1));\n  EXPECT_EQ(508  , message.GetExtension(unittest::repeated_fixed64_extension_lite , 1));\n  EXPECT_EQ(509  , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 1));\n  EXPECT_EQ(510  , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 1));\n  EXPECT_EQ(511  , message.GetExtension(unittest::repeated_float_extension_lite   , 1));\n  EXPECT_EQ(512  , message.GetExtension(unittest::repeated_double_extension_lite  , 1));\n  EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension_lite    , 1));\n  EXPECT_EQ(\"515\", message.GetExtension(unittest::repeated_string_extension_lite  , 1));\n  EXPECT_EQ(\"516\", message.GetExtension(unittest::repeated_bytes_extension_lite   , 1));\n\n  EXPECT_EQ(517, message.GetExtension(unittest::repeatedgroup_extension_lite           , 1).a());\n  EXPECT_EQ(518, message.GetExtension(unittest::repeated_nested_message_extension_lite , 1).bb());\n  EXPECT_EQ(519, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 1).c());\n  EXPECT_EQ(520, message.GetExtension(unittest::repeated_import_message_extension_lite , 1).d());\n\n  EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 1));\n  EXPECT_EQ(unittest::FOREIGN_LITE_FOO      , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 1));\n  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.GetExtension(unittest::repeated_import_enum_extension_lite , 1));\n\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::SetPackedExtensions(\n    unittest::TestPackedExtensionsLite* message) {\n  message->AddExtension(unittest::packed_int32_extension_lite   , 601);\n  message->AddExtension(unittest::packed_int64_extension_lite   , 602);\n  message->AddExtension(unittest::packed_uint32_extension_lite  , 603);\n  message->AddExtension(unittest::packed_uint64_extension_lite  , 604);\n  message->AddExtension(unittest::packed_sint32_extension_lite  , 605);\n  message->AddExtension(unittest::packed_sint64_extension_lite  , 606);\n  message->AddExtension(unittest::packed_fixed32_extension_lite , 607);\n  message->AddExtension(unittest::packed_fixed64_extension_lite , 608);\n  message->AddExtension(unittest::packed_sfixed32_extension_lite, 609);\n  message->AddExtension(unittest::packed_sfixed64_extension_lite, 610);\n  message->AddExtension(unittest::packed_float_extension_lite   , 611);\n  message->AddExtension(unittest::packed_double_extension_lite  , 612);\n  message->AddExtension(unittest::packed_bool_extension_lite    , true);\n  message->AddExtension(unittest::packed_enum_extension_lite, unittest::FOREIGN_LITE_BAR);\n  // add a second one of each field\n  message->AddExtension(unittest::packed_int32_extension_lite   , 701);\n  message->AddExtension(unittest::packed_int64_extension_lite   , 702);\n  message->AddExtension(unittest::packed_uint32_extension_lite  , 703);\n  message->AddExtension(unittest::packed_uint64_extension_lite  , 704);\n  message->AddExtension(unittest::packed_sint32_extension_lite  , 705);\n  message->AddExtension(unittest::packed_sint64_extension_lite  , 706);\n  message->AddExtension(unittest::packed_fixed32_extension_lite , 707);\n  message->AddExtension(unittest::packed_fixed64_extension_lite , 708);\n  message->AddExtension(unittest::packed_sfixed32_extension_lite, 709);\n  message->AddExtension(unittest::packed_sfixed64_extension_lite, 710);\n  message->AddExtension(unittest::packed_float_extension_lite   , 711);\n  message->AddExtension(unittest::packed_double_extension_lite  , 712);\n  message->AddExtension(unittest::packed_bool_extension_lite    , false);\n  message->AddExtension(unittest::packed_enum_extension_lite, unittest::FOREIGN_LITE_BAZ);\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ModifyPackedExtensions(\n    unittest::TestPackedExtensionsLite* message) {\n  message->SetExtension(unittest::packed_int32_extension_lite   , 1, 801);\n  message->SetExtension(unittest::packed_int64_extension_lite   , 1, 802);\n  message->SetExtension(unittest::packed_uint32_extension_lite  , 1, 803);\n  message->SetExtension(unittest::packed_uint64_extension_lite  , 1, 804);\n  message->SetExtension(unittest::packed_sint32_extension_lite  , 1, 805);\n  message->SetExtension(unittest::packed_sint64_extension_lite  , 1, 806);\n  message->SetExtension(unittest::packed_fixed32_extension_lite , 1, 807);\n  message->SetExtension(unittest::packed_fixed64_extension_lite , 1, 808);\n  message->SetExtension(unittest::packed_sfixed32_extension_lite, 1, 809);\n  message->SetExtension(unittest::packed_sfixed64_extension_lite, 1, 810);\n  message->SetExtension(unittest::packed_float_extension_lite   , 1, 811);\n  message->SetExtension(unittest::packed_double_extension_lite  , 1, 812);\n  message->SetExtension(unittest::packed_bool_extension_lite    , 1, true);\n  message->SetExtension(unittest::packed_enum_extension_lite    , 1,\n                        unittest::FOREIGN_LITE_FOO);\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ExpectPackedExtensionsSet(\n    const unittest::TestPackedExtensionsLite& message) {\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension_lite ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension_lite ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension_lite));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension_lite));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension_lite    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension_lite    ));\n\n  EXPECT_EQ(601  , message.GetExtension(unittest::packed_int32_extension_lite   , 0));\n  EXPECT_EQ(602  , message.GetExtension(unittest::packed_int64_extension_lite   , 0));\n  EXPECT_EQ(603  , message.GetExtension(unittest::packed_uint32_extension_lite  , 0));\n  EXPECT_EQ(604  , message.GetExtension(unittest::packed_uint64_extension_lite  , 0));\n  EXPECT_EQ(605  , message.GetExtension(unittest::packed_sint32_extension_lite  , 0));\n  EXPECT_EQ(606  , message.GetExtension(unittest::packed_sint64_extension_lite  , 0));\n  EXPECT_EQ(607  , message.GetExtension(unittest::packed_fixed32_extension_lite , 0));\n  EXPECT_EQ(608  , message.GetExtension(unittest::packed_fixed64_extension_lite , 0));\n  EXPECT_EQ(609  , message.GetExtension(unittest::packed_sfixed32_extension_lite, 0));\n  EXPECT_EQ(610  , message.GetExtension(unittest::packed_sfixed64_extension_lite, 0));\n  EXPECT_EQ(611  , message.GetExtension(unittest::packed_float_extension_lite   , 0));\n  EXPECT_EQ(612  , message.GetExtension(unittest::packed_double_extension_lite  , 0));\n  EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension_lite    , 0));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAR,\n            message.GetExtension(unittest::packed_enum_extension_lite, 0));\n  EXPECT_EQ(701  , message.GetExtension(unittest::packed_int32_extension_lite   , 1));\n  EXPECT_EQ(702  , message.GetExtension(unittest::packed_int64_extension_lite   , 1));\n  EXPECT_EQ(703  , message.GetExtension(unittest::packed_uint32_extension_lite  , 1));\n  EXPECT_EQ(704  , message.GetExtension(unittest::packed_uint64_extension_lite  , 1));\n  EXPECT_EQ(705  , message.GetExtension(unittest::packed_sint32_extension_lite  , 1));\n  EXPECT_EQ(706  , message.GetExtension(unittest::packed_sint64_extension_lite  , 1));\n  EXPECT_EQ(707  , message.GetExtension(unittest::packed_fixed32_extension_lite , 1));\n  EXPECT_EQ(708  , message.GetExtension(unittest::packed_fixed64_extension_lite , 1));\n  EXPECT_EQ(709  , message.GetExtension(unittest::packed_sfixed32_extension_lite, 1));\n  EXPECT_EQ(710  , message.GetExtension(unittest::packed_sfixed64_extension_lite, 1));\n  EXPECT_EQ(711  , message.GetExtension(unittest::packed_float_extension_lite   , 1));\n  EXPECT_EQ(712  , message.GetExtension(unittest::packed_double_extension_lite  , 1));\n  EXPECT_EQ(false, message.GetExtension(unittest::packed_bool_extension_lite    , 1));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAZ,\n            message.GetExtension(unittest::packed_enum_extension_lite, 1));\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ExpectPackedExtensionsClear(\n    const unittest::TestPackedExtensionsLite& message) {\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int32_extension_lite   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int64_extension_lite   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint32_extension_lite  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint64_extension_lite  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint32_extension_lite  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint64_extension_lite  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed32_extension_lite ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed64_extension_lite ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed32_extension_lite));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed64_extension_lite));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_float_extension_lite   ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_double_extension_lite  ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_bool_extension_lite    ));\n  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_enum_extension_lite    ));\n}\n\n// -------------------------------------------------------------------\n\nvoid TestUtilLite::ExpectPackedExtensionsModified(\n    const unittest::TestPackedExtensionsLite& message) {\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension_lite ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension_lite ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension_lite));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension_lite));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension_lite   ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension_lite  ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension_lite    ));\n  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension_lite    ));\n  EXPECT_EQ(601  , message.GetExtension(unittest::packed_int32_extension_lite   , 0));\n  EXPECT_EQ(602  , message.GetExtension(unittest::packed_int64_extension_lite   , 0));\n  EXPECT_EQ(603  , message.GetExtension(unittest::packed_uint32_extension_lite  , 0));\n  EXPECT_EQ(604  , message.GetExtension(unittest::packed_uint64_extension_lite  , 0));\n  EXPECT_EQ(605  , message.GetExtension(unittest::packed_sint32_extension_lite  , 0));\n  EXPECT_EQ(606  , message.GetExtension(unittest::packed_sint64_extension_lite  , 0));\n  EXPECT_EQ(607  , message.GetExtension(unittest::packed_fixed32_extension_lite , 0));\n  EXPECT_EQ(608  , message.GetExtension(unittest::packed_fixed64_extension_lite , 0));\n  EXPECT_EQ(609  , message.GetExtension(unittest::packed_sfixed32_extension_lite, 0));\n  EXPECT_EQ(610  , message.GetExtension(unittest::packed_sfixed64_extension_lite, 0));\n  EXPECT_EQ(611  , message.GetExtension(unittest::packed_float_extension_lite   , 0));\n  EXPECT_EQ(612  , message.GetExtension(unittest::packed_double_extension_lite  , 0));\n  EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension_lite    , 0));\n  EXPECT_EQ(unittest::FOREIGN_LITE_BAR,\n            message.GetExtension(unittest::packed_enum_extension_lite, 0));\n\n  // Actually verify the second (modified) elements now.\n  EXPECT_EQ(801  , message.GetExtension(unittest::packed_int32_extension_lite   , 1));\n  EXPECT_EQ(802  , message.GetExtension(unittest::packed_int64_extension_lite   , 1));\n  EXPECT_EQ(803  , message.GetExtension(unittest::packed_uint32_extension_lite  , 1));\n  EXPECT_EQ(804  , message.GetExtension(unittest::packed_uint64_extension_lite  , 1));\n  EXPECT_EQ(805  , message.GetExtension(unittest::packed_sint32_extension_lite  , 1));\n  EXPECT_EQ(806  , message.GetExtension(unittest::packed_sint64_extension_lite  , 1));\n  EXPECT_EQ(807  , message.GetExtension(unittest::packed_fixed32_extension_lite , 1));\n  EXPECT_EQ(808  , message.GetExtension(unittest::packed_fixed64_extension_lite , 1));\n  EXPECT_EQ(809  , message.GetExtension(unittest::packed_sfixed32_extension_lite, 1));\n  EXPECT_EQ(810  , message.GetExtension(unittest::packed_sfixed64_extension_lite, 1));\n  EXPECT_EQ(811  , message.GetExtension(unittest::packed_float_extension_lite   , 1));\n  EXPECT_EQ(812  , message.GetExtension(unittest::packed_double_extension_lite  , 1));\n  EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension_lite    , 1));\n  EXPECT_EQ(unittest::FOREIGN_LITE_FOO,\n            message.GetExtension(unittest::packed_enum_extension_lite, 1));\n}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_TEST_UTIL_LITE_H__\n#define GOOGLE_PROTOBUF_TEST_UTIL_LITE_H__\n\n#include <google/protobuf/unittest_lite.pb.h>\n\nnamespace google {\nnamespace protobuf {\n\nnamespace unittest = protobuf_unittest;\nnamespace unittest_import = protobuf_unittest_import;\n\nclass TestUtilLite {\n public:\n  // Set every field in the message to a unique value.\n  static void SetAllFields(unittest::TestAllTypesLite* message);\n  static void SetAllExtensions(unittest::TestAllExtensionsLite* message);\n  static void SetPackedFields(unittest::TestPackedTypesLite* message);\n  static void SetPackedExtensions(unittest::TestPackedExtensionsLite* message);\n\n  // Use the repeated versions of the set_*() accessors to modify all the\n  // repeated fields of the messsage (which should already have been\n  // initialized with Set*Fields()).  Set*Fields() itself only tests\n  // the add_*() accessors.\n  static void ModifyRepeatedFields(unittest::TestAllTypesLite* message);\n  static void ModifyRepeatedExtensions(\n      unittest::TestAllExtensionsLite* message);\n  static void ModifyPackedFields(unittest::TestPackedTypesLite* message);\n  static void ModifyPackedExtensions(\n      unittest::TestPackedExtensionsLite* message);\n\n  // Check that all fields have the values that they should have after\n  // Set*Fields() is called.\n  static void ExpectAllFieldsSet(const unittest::TestAllTypesLite& message);\n  static void ExpectAllExtensionsSet(\n      const unittest::TestAllExtensionsLite& message);\n  static void ExpectPackedFieldsSet(\n      const unittest::TestPackedTypesLite& message);\n  static void ExpectPackedExtensionsSet(\n      const unittest::TestPackedExtensionsLite& message);\n\n  // Expect that the message is modified as would be expected from\n  // Modify*Fields().\n  static void ExpectRepeatedFieldsModified(\n      const unittest::TestAllTypesLite& message);\n  static void ExpectRepeatedExtensionsModified(\n      const unittest::TestAllExtensionsLite& message);\n  static void ExpectPackedFieldsModified(\n      const unittest::TestPackedTypesLite& message);\n  static void ExpectPackedExtensionsModified(\n      const unittest::TestPackedExtensionsLite& message);\n\n  // Check that all fields have their default values.\n  static void ExpectClear(const unittest::TestAllTypesLite& message);\n  static void ExpectExtensionsClear(\n      const unittest::TestAllExtensionsLite& message);\n  static void ExpectPackedClear(const unittest::TestPackedTypesLite& message);\n  static void ExpectPackedExtensionsClear(\n      const unittest::TestPackedExtensionsLite& message);\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TestUtilLite);\n};\n\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_TEST_UTIL_LITE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt",
    "content": "optional_int32: 101\noptional_int64: 102\noptional_uint32: 103\noptional_uint64: 104\noptional_sint32: 105\noptional_sint64: 106\noptional_fixed32: 107\noptional_fixed64: 108\noptional_sfixed32: 109\noptional_sfixed64: 110\noptional_float: 111\noptional_double: 112\noptional_bool: true\noptional_string: \"115\"\noptional_bytes: \"116\"\nOptionalGroup {\n  a: 117\n}\noptional_nested_message {\n  bb: 118\n}\noptional_foreign_message {\n  c: 119\n}\noptional_import_message {\n  d: 120\n}\noptional_nested_enum: BAZ\noptional_foreign_enum: FOREIGN_BAZ\noptional_import_enum: IMPORT_BAZ\noptional_string_piece: \"124\"\noptional_cord: \"125\"\nrepeated_int32: 201\nrepeated_int32: 301\nrepeated_int64: 202\nrepeated_int64: 302\nrepeated_uint32: 203\nrepeated_uint32: 303\nrepeated_uint64: 204\nrepeated_uint64: 304\nrepeated_sint32: 205\nrepeated_sint32: 305\nrepeated_sint64: 206\nrepeated_sint64: 306\nrepeated_fixed32: 207\nrepeated_fixed32: 307\nrepeated_fixed64: 208\nrepeated_fixed64: 308\nrepeated_sfixed32: 209\nrepeated_sfixed32: 309\nrepeated_sfixed64: 210\nrepeated_sfixed64: 310\nrepeated_float: 211\nrepeated_float: 311\nrepeated_double: 212\nrepeated_double: 312\nrepeated_bool: true\nrepeated_bool: false\nrepeated_string: \"215\"\nrepeated_string: \"315\"\nrepeated_bytes: \"216\"\nrepeated_bytes: \"316\"\nRepeatedGroup {\n  a: 217\n}\nRepeatedGroup {\n  a: 317\n}\nrepeated_nested_message {\n  bb: 218\n}\nrepeated_nested_message {\n  bb: 318\n}\nrepeated_foreign_message {\n  c: 219\n}\nrepeated_foreign_message {\n  c: 319\n}\nrepeated_import_message {\n  d: 220\n}\nrepeated_import_message {\n  d: 320\n}\nrepeated_nested_enum: BAR\nrepeated_nested_enum: BAZ\nrepeated_foreign_enum: FOREIGN_BAR\nrepeated_foreign_enum: FOREIGN_BAZ\nrepeated_import_enum: IMPORT_BAR\nrepeated_import_enum: IMPORT_BAZ\nrepeated_string_piece: \"224\"\nrepeated_string_piece: \"324\"\nrepeated_cord: \"225\"\nrepeated_cord: \"325\"\ndefault_int32: 401\ndefault_int64: 402\ndefault_uint32: 403\ndefault_uint64: 404\ndefault_sint32: 405\ndefault_sint64: 406\ndefault_fixed32: 407\ndefault_fixed64: 408\ndefault_sfixed32: 409\ndefault_sfixed64: 410\ndefault_float: 411\ndefault_double: 412\ndefault_bool: false\ndefault_string: \"415\"\ndefault_bytes: \"416\"\ndefault_nested_enum: FOO\ndefault_foreign_enum: FOREIGN_FOO\ndefault_import_enum: IMPORT_FOO\ndefault_string_piece: \"424\"\ndefault_cord: \"425\"\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt",
    "content": "[protobuf_unittest.optional_int32_extension]: 101\n[protobuf_unittest.optional_int64_extension]: 102\n[protobuf_unittest.optional_uint32_extension]: 103\n[protobuf_unittest.optional_uint64_extension]: 104\n[protobuf_unittest.optional_sint32_extension]: 105\n[protobuf_unittest.optional_sint64_extension]: 106\n[protobuf_unittest.optional_fixed32_extension]: 107\n[protobuf_unittest.optional_fixed64_extension]: 108\n[protobuf_unittest.optional_sfixed32_extension]: 109\n[protobuf_unittest.optional_sfixed64_extension]: 110\n[protobuf_unittest.optional_float_extension]: 111\n[protobuf_unittest.optional_double_extension]: 112\n[protobuf_unittest.optional_bool_extension]: true\n[protobuf_unittest.optional_string_extension]: \"115\"\n[protobuf_unittest.optional_bytes_extension]: \"116\"\n[protobuf_unittest.optionalgroup_extension] {\n  a: 117\n}\n[protobuf_unittest.optional_nested_message_extension] {\n  bb: 118\n}\n[protobuf_unittest.optional_foreign_message_extension] {\n  c: 119\n}\n[protobuf_unittest.optional_import_message_extension] {\n  d: 120\n}\n[protobuf_unittest.optional_nested_enum_extension]: BAZ\n[protobuf_unittest.optional_foreign_enum_extension]: FOREIGN_BAZ\n[protobuf_unittest.optional_import_enum_extension]: IMPORT_BAZ\n[protobuf_unittest.optional_string_piece_extension]: \"124\"\n[protobuf_unittest.optional_cord_extension]: \"125\"\n[protobuf_unittest.repeated_int32_extension]: 201\n[protobuf_unittest.repeated_int32_extension]: 301\n[protobuf_unittest.repeated_int64_extension]: 202\n[protobuf_unittest.repeated_int64_extension]: 302\n[protobuf_unittest.repeated_uint32_extension]: 203\n[protobuf_unittest.repeated_uint32_extension]: 303\n[protobuf_unittest.repeated_uint64_extension]: 204\n[protobuf_unittest.repeated_uint64_extension]: 304\n[protobuf_unittest.repeated_sint32_extension]: 205\n[protobuf_unittest.repeated_sint32_extension]: 305\n[protobuf_unittest.repeated_sint64_extension]: 206\n[protobuf_unittest.repeated_sint64_extension]: 306\n[protobuf_unittest.repeated_fixed32_extension]: 207\n[protobuf_unittest.repeated_fixed32_extension]: 307\n[protobuf_unittest.repeated_fixed64_extension]: 208\n[protobuf_unittest.repeated_fixed64_extension]: 308\n[protobuf_unittest.repeated_sfixed32_extension]: 209\n[protobuf_unittest.repeated_sfixed32_extension]: 309\n[protobuf_unittest.repeated_sfixed64_extension]: 210\n[protobuf_unittest.repeated_sfixed64_extension]: 310\n[protobuf_unittest.repeated_float_extension]: 211\n[protobuf_unittest.repeated_float_extension]: 311\n[protobuf_unittest.repeated_double_extension]: 212\n[protobuf_unittest.repeated_double_extension]: 312\n[protobuf_unittest.repeated_bool_extension]: true\n[protobuf_unittest.repeated_bool_extension]: false\n[protobuf_unittest.repeated_string_extension]: \"215\"\n[protobuf_unittest.repeated_string_extension]: \"315\"\n[protobuf_unittest.repeated_bytes_extension]: \"216\"\n[protobuf_unittest.repeated_bytes_extension]: \"316\"\n[protobuf_unittest.repeatedgroup_extension] {\n  a: 217\n}\n[protobuf_unittest.repeatedgroup_extension] {\n  a: 317\n}\n[protobuf_unittest.repeated_nested_message_extension] {\n  bb: 218\n}\n[protobuf_unittest.repeated_nested_message_extension] {\n  bb: 318\n}\n[protobuf_unittest.repeated_foreign_message_extension] {\n  c: 219\n}\n[protobuf_unittest.repeated_foreign_message_extension] {\n  c: 319\n}\n[protobuf_unittest.repeated_import_message_extension] {\n  d: 220\n}\n[protobuf_unittest.repeated_import_message_extension] {\n  d: 320\n}\n[protobuf_unittest.repeated_nested_enum_extension]: BAR\n[protobuf_unittest.repeated_nested_enum_extension]: BAZ\n[protobuf_unittest.repeated_foreign_enum_extension]: FOREIGN_BAR\n[protobuf_unittest.repeated_foreign_enum_extension]: FOREIGN_BAZ\n[protobuf_unittest.repeated_import_enum_extension]: IMPORT_BAR\n[protobuf_unittest.repeated_import_enum_extension]: IMPORT_BAZ\n[protobuf_unittest.repeated_string_piece_extension]: \"224\"\n[protobuf_unittest.repeated_string_piece_extension]: \"324\"\n[protobuf_unittest.repeated_cord_extension]: \"225\"\n[protobuf_unittest.repeated_cord_extension]: \"325\"\n[protobuf_unittest.default_int32_extension]: 401\n[protobuf_unittest.default_int64_extension]: 402\n[protobuf_unittest.default_uint32_extension]: 403\n[protobuf_unittest.default_uint64_extension]: 404\n[protobuf_unittest.default_sint32_extension]: 405\n[protobuf_unittest.default_sint64_extension]: 406\n[protobuf_unittest.default_fixed32_extension]: 407\n[protobuf_unittest.default_fixed64_extension]: 408\n[protobuf_unittest.default_sfixed32_extension]: 409\n[protobuf_unittest.default_sfixed64_extension]: 410\n[protobuf_unittest.default_float_extension]: 411\n[protobuf_unittest.default_double_extension]: 412\n[protobuf_unittest.default_bool_extension]: false\n[protobuf_unittest.default_string_extension]: \"415\"\n[protobuf_unittest.default_bytes_extension]: \"416\"\n[protobuf_unittest.default_nested_enum_extension]: FOO\n[protobuf_unittest.default_foreign_enum_extension]: FOREIGN_FOO\n[protobuf_unittest.default_import_enum_extension]: IMPORT_FOO\n[protobuf_unittest.default_string_piece_extension]: \"424\"\n[protobuf_unittest.default_cord_extension]: \"425\"\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n// emulates google3/file/base/file.cc\n\n#include <google/protobuf/testing/file.h>\n#include <stdio.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#ifdef _MSC_VER\n#define WIN32_LEAN_AND_MEAN  // yeah, right\n#include <windows.h>         // Find*File().  :(\n#include <io.h>\n#include <direct.h>\n#else\n#include <dirent.h>\n#include <unistd.h>\n#endif\n#include <errno.h>\n\nnamespace google {\nnamespace protobuf {\n\n#ifdef _WIN32\n#define mkdir(name, mode) mkdir(name)\n// Windows doesn't have symbolic links.\n#define lstat stat\n#ifndef F_OK\n#define F_OK 00  // not defined by MSVC for whatever reason\n#endif\n#endif\n\nbool File::Exists(const string& name) {\n  return access(name.c_str(), F_OK) == 0;\n}\n\nbool File::ReadFileToString(const string& name, string* output) {\n  char buffer[1024];\n  FILE* file = fopen(name.c_str(), \"rb\");\n  if (file == NULL) return false;\n\n  while (true) {\n    size_t n = fread(buffer, 1, sizeof(buffer), file);\n    if (n <= 0) break;\n    output->append(buffer, n);\n  }\n\n  int error = ferror(file);\n  if (fclose(file) != 0) return false;\n  return error == 0;\n}\n\nvoid File::ReadFileToStringOrDie(const string& name, string* output) {\n  GOOGLE_CHECK(ReadFileToString(name, output)) << \"Could not read: \" << name;\n}\n\nvoid File::WriteStringToFileOrDie(const string& contents, const string& name) {\n  FILE* file = fopen(name.c_str(), \"wb\");\n  GOOGLE_CHECK(file != NULL)\n      << \"fopen(\" << name << \", \\\"wb\\\"): \" << strerror(errno);\n  GOOGLE_CHECK_EQ(fwrite(contents.data(), 1, contents.size(), file),\n                  contents.size())\n      << \"fwrite(\" << name << \"): \" << strerror(errno);\n  GOOGLE_CHECK(fclose(file) == 0)\n      << \"fclose(\" << name << \"): \" << strerror(errno);\n}\n\nbool File::CreateDir(const string& name, int mode) {\n  return mkdir(name.c_str(), mode) == 0;\n}\n\nbool File::RecursivelyCreateDir(const string& path, int mode) {\n  if (CreateDir(path, mode)) return true;\n\n  if (Exists(path)) return false;\n\n  // Try creating the parent.\n  string::size_type slashpos = path.find_last_of('/');\n  if (slashpos == string::npos) {\n    // No parent given.\n    return false;\n  }\n\n  return RecursivelyCreateDir(path.substr(0, slashpos), mode) &&\n         CreateDir(path, mode);\n}\n\nvoid File::DeleteRecursively(const string& name,\n                             void* dummy1, void* dummy2) {\n  // We don't care too much about error checking here since this is only used\n  // in tests to delete temporary directories that are under /tmp anyway.\n\n#ifdef _MSC_VER\n  // This interface is so weird.\n  WIN32_FIND_DATA find_data;\n  HANDLE find_handle = FindFirstFile((name + \"/*\").c_str(), &find_data);\n  if (find_handle == INVALID_HANDLE_VALUE) {\n    // Just delete it, whatever it is.\n    DeleteFile(name.c_str());\n    RemoveDirectory(name.c_str());\n    return;\n  }\n\n  do {\n    string entry_name = find_data.cFileName;\n    if (entry_name != \".\" && entry_name != \"..\") {\n      string path = name + \"/\" + entry_name;\n      if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {\n        DeleteRecursively(path, NULL, NULL);\n        RemoveDirectory(path.c_str());\n      } else {\n        DeleteFile(path.c_str());\n      }\n    }\n  } while(FindNextFile(find_handle, &find_data));\n  FindClose(find_handle);\n\n  RemoveDirectory(name.c_str());\n#else\n  // Use opendir()!  Yay!\n  // lstat = Don't follow symbolic links.\n  struct stat stats;\n  if (lstat(name.c_str(), &stats) != 0) return;\n\n  if (S_ISDIR(stats.st_mode)) {\n    DIR* dir = opendir(name.c_str());\n    if (dir != NULL) {\n      while (true) {\n        struct dirent* entry = readdir(dir);\n        if (entry == NULL) break;\n        string entry_name = entry->d_name;\n        if (entry_name != \".\" && entry_name != \"..\") {\n          DeleteRecursively(name + \"/\" + entry_name, NULL, NULL);\n        }\n      }\n    }\n\n    closedir(dir);\n    rmdir(name.c_str());\n\n  } else if (S_ISREG(stats.st_mode)) {\n    remove(name.c_str());\n  }\n#endif\n}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n// emulates google3/file/base/file.h\n\n#ifndef GOOGLE_PROTOBUF_TESTING_FILE_H__\n#define GOOGLE_PROTOBUF_TESTING_FILE_H__\n\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\n\nconst int DEFAULT_FILE_MODE = 0777;\n\n// Protocol buffer code only uses a couple static methods of File, and only\n// in tests.\nclass File {\n public:\n  // Check if the file exists.\n  static bool Exists(const string& name);\n\n  // Read an entire file to a string.  Return true if successful, false\n  // otherwise.\n  static bool ReadFileToString(const string& name, string* output);\n\n  // Same as above, but crash on failure.\n  static void ReadFileToStringOrDie(const string& name, string* output);\n\n  // Create a file and write a string to it.\n  static void WriteStringToFileOrDie(const string& contents,\n                                     const string& name);\n\n  // Create a directory.\n  static bool CreateDir(const string& name, int mode);\n\n  // Create a directory and all parent directories if necessary.\n  static bool RecursivelyCreateDir(const string& path, int mode);\n\n  // If \"name\" is a file, we delete it.  If it is a directory, we\n  // call DeleteRecursively() for each file or directory (other than\n  // dot and double-dot) within it, and then delete the directory itself.\n  // The \"dummy\" parameters have a meaning in the original version of this\n  // method but they are not used anywhere in protocol buffers.\n  static void DeleteRecursively(const string& name,\n                                void* dummy1, void* dummy2);\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(File);\n};\n\n}  // namespace protobuf\n}  // namespace google\n\n#endif  // GOOGLE_PROTOBUF_TESTING_FILE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n// emulates google3/testing/base/public/googletest.cc\n\n#include <google/protobuf/testing/googletest.h>\n#include <google/protobuf/testing/file.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <errno.h>\n#include <stdlib.h>\n#ifdef _MSC_VER\n#include <io.h>\n#include <direct.h>\n#else\n#include <unistd.h>\n#endif\n#include <stdio.h>\n#include <fcntl.h>\n#include <iostream>\n#include <fstream>\n\nnamespace google {\nnamespace protobuf {\n\n#ifdef _WIN32\n#define mkdir(name, mode) mkdir(name)\n#endif\n\n#ifndef O_BINARY\n#ifdef _O_BINARY\n#define O_BINARY _O_BINARY\n#else\n#define O_BINARY 0     // If this isn't defined, the platform doesn't need it.\n#endif\n#endif\n\nstring TestSourceDir() {\n#ifdef _MSC_VER\n  // Look for the \"src\" directory.\n  string prefix = \".\";\n\n  while (!File::Exists(prefix + \"/src/google/protobuf\")) {\n    if (!File::Exists(prefix)) {\n      GOOGLE_LOG(FATAL)\n        << \"Could not find protobuf source code.  Please run tests from \"\n           \"somewhere within the protobuf source package.\";\n    }\n    prefix += \"/..\";\n  }\n  return prefix + \"/src\";\n#else\n  // automake sets the \"srcdir\" environment variable.\n  char* result = getenv(\"srcdir\");\n  if (result == NULL) {\n    // Otherwise, the test must be run from the source directory.\n    return \".\";\n  } else {\n    return result;\n  }\n#endif\n}\n\nnamespace {\n\nstring GetTemporaryDirectoryName() {\n  // tmpnam() is generally not considered safe but we're only using it for\n  // testing.  We cannot use tmpfile() or mkstemp() since we're creating a\n  // directory.\n  char b[L_tmpnam + 1];     // HPUX multithread return 0 if s is 0\n  string result = tmpnam(b);\n#ifdef _WIN32\n  // On Win32, tmpnam() returns a file prefixed with '\\', but which is supposed\n  // to be used in the current working directory.  WTF?\n  if (HasPrefixString(result, \"\\\\\")) {\n    result.erase(0, 1);\n  }\n#endif  // _WIN32\n  return result;\n}\n\n// Creates a temporary directory on demand and deletes it when the process\n// quits.\nclass TempDirDeleter {\n public:\n  TempDirDeleter() {}\n  ~TempDirDeleter() {\n    if (!name_.empty()) {\n      File::DeleteRecursively(name_, NULL, NULL);\n    }\n  }\n\n  string GetTempDir() {\n    if (name_.empty()) {\n      name_ = GetTemporaryDirectoryName();\n      GOOGLE_CHECK(mkdir(name_.c_str(), 0777) == 0) << strerror(errno);\n\n      // Stick a file in the directory that tells people what this is, in case\n      // we abort and don't get a chance to delete it.\n      File::WriteStringToFileOrDie(\"\", name_ + \"/TEMP_DIR_FOR_PROTOBUF_TESTS\");\n    }\n    return name_;\n  }\n\n private:\n  string name_;\n};\n\nTempDirDeleter temp_dir_deleter_;\n\n}  // namespace\n\nstring TestTempDir() {\n  return temp_dir_deleter_.GetTempDir();\n}\n\n// TODO(kenton):  Share duplicated code below.  Too busy/lazy for now.\n\nstatic string stdout_capture_filename_;\nstatic string stderr_capture_filename_;\nstatic int original_stdout_ = -1;\nstatic int original_stderr_ = -1;\n\nvoid CaptureTestStdout() {\n  GOOGLE_CHECK_EQ(original_stdout_, -1) << \"Already capturing.\";\n\n  stdout_capture_filename_ = TestTempDir() + \"/captured_stdout\";\n\n  int fd = open(stdout_capture_filename_.c_str(),\n                O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0777);\n  GOOGLE_CHECK(fd >= 0) << \"open: \" << strerror(errno);\n\n  original_stdout_ = dup(1);\n  close(1);\n  dup2(fd, 1);\n  close(fd);\n}\n\nvoid CaptureTestStderr() {\n  GOOGLE_CHECK_EQ(original_stderr_, -1) << \"Already capturing.\";\n\n  stderr_capture_filename_ = TestTempDir() + \"/captured_stderr\";\n\n  int fd = open(stderr_capture_filename_.c_str(),\n                O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0777);\n  GOOGLE_CHECK(fd >= 0) << \"open: \" << strerror(errno);\n\n  original_stderr_ = dup(2);\n  close(2);\n  dup2(fd, 2);\n  close(fd);\n}\n\nstring GetCapturedTestStdout() {\n  GOOGLE_CHECK_NE(original_stdout_, -1) << \"Not capturing.\";\n\n  close(1);\n  dup2(original_stdout_, 1);\n  original_stdout_ = -1;\n\n  string result;\n  File::ReadFileToStringOrDie(stdout_capture_filename_, &result);\n\n  remove(stdout_capture_filename_.c_str());\n\n  return result;\n}\n\nstring GetCapturedTestStderr() {\n  GOOGLE_CHECK_NE(original_stderr_, -1) << \"Not capturing.\";\n\n  close(2);\n  dup2(original_stderr_, 2);\n  original_stderr_ = -1;\n\n  string result;\n  File::ReadFileToStringOrDie(stderr_capture_filename_, &result);\n\n  remove(stderr_capture_filename_.c_str());\n\n  return result;\n}\n\nScopedMemoryLog* ScopedMemoryLog::active_log_ = NULL;\n\nScopedMemoryLog::ScopedMemoryLog() {\n  GOOGLE_CHECK(active_log_ == NULL);\n  active_log_ = this;\n  old_handler_ = SetLogHandler(&HandleLog);\n}\n\nScopedMemoryLog::~ScopedMemoryLog() {\n  SetLogHandler(old_handler_);\n  active_log_ = NULL;\n}\n\nconst vector<string>& ScopedMemoryLog::GetMessages(LogLevel dummy) const {\n  GOOGLE_CHECK_EQ(dummy, ERROR);\n  return messages_;\n}\n\nvoid ScopedMemoryLog::HandleLog(LogLevel level, const char* filename,\n                                int line, const string& message) {\n  GOOGLE_CHECK(active_log_ != NULL);\n  if (level == ERROR) {\n    active_log_->messages_.push_back(message);\n  }\n}\n\nnamespace {\n\n// Force shutdown at process exit so that we can test for memory leaks.  To\n// actually check for leaks, I suggest using the heap checker included with\n// google-perftools.  Set it to \"draconian\" mode to ensure that every last\n// call to malloc() has a corresponding free().\nstruct ForceShutdown {\n  ~ForceShutdown() {\n    ShutdownProtobufLibrary();\n  }\n} force_shutdown;\n\n}  // namespace\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n// emulates google3/testing/base/public/googletest.h\n\n#ifndef GOOGLE_PROTOBUF_GOOGLETEST_H__\n#define GOOGLE_PROTOBUF_GOOGLETEST_H__\n\n#include <vector>\n#include <google/protobuf/stubs/common.h>\n\nnamespace google {\nnamespace protobuf {\n\n// When running unittests, get the directory containing the source code.\nstring TestSourceDir();\n\n// When running unittests, get a directory where temporary files may be\n// placed.\nstring TestTempDir();\n\n// Capture all text written to stdout or stderr.\nvoid CaptureTestStdout();\nvoid CaptureTestStderr();\n\n// Stop capturing stdout or stderr and return the text captured.\nstring GetCapturedTestStdout();\nstring GetCapturedTestStderr();\n\n// For use with ScopedMemoryLog::GetMessages().  Inside Google the LogLevel\n// constants don't have the LOGLEVEL_ prefix, so the code that used\n// ScopedMemoryLog refers to LOGLEVEL_ERROR as just ERROR.\n#undef ERROR  // defend against promiscuous windows.h\nstatic const LogLevel ERROR = LOGLEVEL_ERROR;\n\n// Receives copies of all LOG(ERROR) messages while in scope.  Sample usage:\n//   {\n//     ScopedMemoryLog log;  // constructor registers object as a log sink\n//     SomeRoutineThatMayLogMessages();\n//     const vector<string>& warnings = log.GetMessages(ERROR);\n//   }  // destructor unregisters object as a log sink\n// This is a dummy implementation which covers only what is used by protocol\n// buffer unit tests.\nclass ScopedMemoryLog {\n public:\n  ScopedMemoryLog();\n  virtual ~ScopedMemoryLog();\n\n  // Fetches all messages logged.  The internal version of this class\n  // would only fetch messages at the given security level, but the protobuf\n  // open source version ignores the argument since we always pass ERROR\n  // anyway.\n  const vector<string>& GetMessages(LogLevel dummy) const;\n\n private:\n  vector<string> messages_;\n  LogHandler* old_handler_;\n\n  static void HandleLog(LogLevel level, const char* filename, int line,\n                        const string& message);\n\n  static ScopedMemoryLog* active_log_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ScopedMemoryLog);\n};\n\n}  // namespace protobuf\n}  // namespace google\n\n#endif  // GOOGLE_PROTOBUF_GOOGLETEST_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgunzip.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2009 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: brianolson@google.com (Brian Olson)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Test program to verify that GzipInputStream is compatible with command line\n// gunzip or java.util.zip.GzipInputStream\n//\n// Reads gzip stream on standard input and writes decompressed data to standard\n// output.\n\n#include \"config.h\"\n\n#include <assert.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <fcntl.h>\n\n#include <google/protobuf/io/gzip_stream.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n\nusing google::protobuf::io::FileInputStream;\nusing google::protobuf::io::GzipInputStream;\n\nint main(int argc, const char** argv) {\n  FileInputStream fin(STDIN_FILENO);\n  GzipInputStream in(&fin);\n\n  while (true) {\n    const void* inptr;\n    int inlen;\n    bool ok;\n    ok = in.Next(&inptr, &inlen);\n    if (!ok) {\n      break;\n    }\n    if (inlen > 0) {\n      int err = write(STDOUT_FILENO, inptr, inlen);\n      assert(err == inlen);\n    }\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgzip.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2009 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: brianolson@google.com (Brian Olson)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Test program to verify that GzipOutputStream is compatible with command line\n// gzip or java.util.zip.GzipOutputStream\n//\n// Reads data on standard input and writes compressed gzip stream to standard\n// output.\n\n#include \"config.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <fcntl.h>\n\n#include <google/protobuf/io/gzip_stream.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n\nusing google::protobuf::io::FileOutputStream;\nusing google::protobuf::io::GzipOutputStream;\n\nint main(int argc, const char** argv) {\n  FileOutputStream fout(STDOUT_FILENO);\n  GzipOutputStream out(&fout);\n  int readlen;\n\n  while (true) {\n    void* outptr;\n    int outlen;\n    bool ok;\n    do {\n      ok = out.Next(&outptr, &outlen);\n      if (!ok) {\n        break;\n      }\n    } while (outlen <= 0);\n    readlen = read(STDIN_FILENO, outptr, outlen);\n    if (readlen <= 0) {\n      out.BackUp(outlen);\n      break;\n    }\n    if (readlen < outlen) {\n      out.BackUp(outlen - readlen);\n    }\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: jschorr@google.com (Joseph Schorr)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <float.h>\n#include <math.h>\n#include <stdio.h>\n#include <stack>\n#include <limits>\n#include <vector>\n\n#include <google/protobuf/text_format.h>\n\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/unknown_field_set.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/io/tokenizer.h>\n#include <google/protobuf/stubs/strutil.h>\n\nnamespace google {\nnamespace protobuf {\n\nstring Message::DebugString() const {\n  string debug_string;\n\n  TextFormat::PrintToString(*this, &debug_string);\n\n  return debug_string;\n}\n\nstring Message::ShortDebugString() const {\n  string debug_string;\n\n  TextFormat::Printer printer;\n  printer.SetSingleLineMode(true);\n\n  printer.PrintToString(*this, &debug_string);\n  // Single line mode currently might have an extra space at the end.\n  if (debug_string.size() > 0 &&\n      debug_string[debug_string.size() - 1] == ' ') {\n    debug_string.resize(debug_string.size() - 1);\n  }\n\n  return debug_string;\n}\n\nstring Message::Utf8DebugString() const {\n  string debug_string;\n\n  TextFormat::Printer printer;\n  printer.SetUseUtf8StringEscaping(true);\n\n  printer.PrintToString(*this, &debug_string);\n\n  return debug_string;\n}\n\nvoid Message::PrintDebugString() const {\n  printf(\"%s\", DebugString().c_str());\n}\n\n\n// ===========================================================================\n// Internal class for parsing an ASCII representation of a Protocol Message.\n// This class makes use of the Protocol Message compiler's tokenizer found\n// in //google/protobuf/io/tokenizer.h. Note that class's Parse\n// method is *not* thread-safe and should only be used in a single thread at\n// a time.\n\n// Makes code slightly more readable.  The meaning of \"DO(foo)\" is\n// \"Execute foo and fail if it fails.\", where failure is indicated by\n// returning false. Borrowed from parser.cc (Thanks Kenton!).\n#define DO(STATEMENT) if (STATEMENT) {} else return false\n\nclass TextFormat::Parser::ParserImpl {\n public:\n\n  // Determines if repeated values for a non-repeated field are\n  // permitted, e.g., the string \"foo: 1 foo: 2\" for a\n  // required/optional field named \"foo\".\n  enum SingularOverwritePolicy {\n    ALLOW_SINGULAR_OVERWRITES = 0,   // the last value is retained\n    FORBID_SINGULAR_OVERWRITES = 1,  // an error is issued\n  };\n\n  ParserImpl(const Descriptor* root_message_type,\n             io::ZeroCopyInputStream* input_stream,\n             io::ErrorCollector* error_collector,\n             TextFormat::Finder* finder,\n             SingularOverwritePolicy singular_overwrite_policy)\n    : error_collector_(error_collector),\n      finder_(finder),\n      tokenizer_error_collector_(this),\n      tokenizer_(input_stream, &tokenizer_error_collector_),\n      root_message_type_(root_message_type),\n      singular_overwrite_policy_(singular_overwrite_policy),\n      had_errors_(false) {\n    // For backwards-compatibility with proto1, we need to allow the 'f' suffix\n    // for floats.\n    tokenizer_.set_allow_f_after_float(true);\n\n    // '#' starts a comment.\n    tokenizer_.set_comment_style(io::Tokenizer::SH_COMMENT_STYLE);\n\n    // Consume the starting token.\n    tokenizer_.Next();\n  }\n  ~ParserImpl() { }\n\n  // Parses the ASCII representation specified in input and saves the\n  // information into the output pointer (a Message). Returns\n  // false if an error occurs (an error will also be logged to\n  // GOOGLE_LOG(ERROR)).\n  bool Parse(Message* output) {\n    // Consume fields until we cannot do so anymore.\n    while(true) {\n      if (LookingAtType(io::Tokenizer::TYPE_END)) {\n        return !had_errors_;\n      }\n\n      DO(ConsumeField(output));\n    }\n  }\n\n  bool ParseField(const FieldDescriptor* field, Message* output) {\n    bool suc;\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      suc = ConsumeFieldMessage(output, output->GetReflection(), field);\n    } else {\n      suc = ConsumeFieldValue(output, output->GetReflection(), field);\n    }\n    return suc && LookingAtType(io::Tokenizer::TYPE_END);\n  }\n\n  void ReportError(int line, int col, const string& message) {\n    had_errors_ = true;\n    if (error_collector_ == NULL) {\n      if (line >= 0) {\n        GOOGLE_LOG(ERROR) << \"Error parsing text-format \"\n                   << root_message_type_->full_name()\n                   << \": \" << (line + 1) << \":\"\n                   << (col + 1) << \": \" << message;\n      } else {\n        GOOGLE_LOG(ERROR) << \"Error parsing text-format \"\n                   << root_message_type_->full_name()\n                   << \": \" << message;\n      }\n    } else {\n      error_collector_->AddError(line, col, message);\n    }\n  }\n\n  void ReportWarning(int line, int col, const string& message) {\n    if (error_collector_ == NULL) {\n      if (line >= 0) {\n        GOOGLE_LOG(WARNING) << \"Warning parsing text-format \"\n                     << root_message_type_->full_name()\n                     << \": \" << (line + 1) << \":\"\n                     << (col + 1) << \": \" << message;\n      } else {\n        GOOGLE_LOG(WARNING) << \"Warning parsing text-format \"\n                     << root_message_type_->full_name()\n                     << \": \" << message;\n      }\n    } else {\n      error_collector_->AddWarning(line, col, message);\n    }\n  }\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParserImpl);\n\n  // Reports an error with the given message with information indicating\n  // the position (as derived from the current token).\n  void ReportError(const string& message) {\n    ReportError(tokenizer_.current().line, tokenizer_.current().column,\n                message);\n  }\n\n  // Reports a warning with the given message with information indicating\n  // the position (as derived from the current token).\n  void ReportWarning(const string& message) {\n    ReportWarning(tokenizer_.current().line, tokenizer_.current().column,\n                  message);\n  }\n\n  // Consumes the specified message with the given starting delimeter.\n  // This method checks to see that the end delimeter at the conclusion of\n  // the consumption matches the starting delimeter passed in here.\n  bool ConsumeMessage(Message* message, const string delimeter) {\n    while (!LookingAt(\">\") &&  !LookingAt(\"}\")) {\n      DO(ConsumeField(message));\n    }\n\n    // Confirm that we have a valid ending delimeter.\n    DO(Consume(delimeter));\n\n    return true;\n  }\n\n  // Consumes the current field (as returned by the tokenizer) on the\n  // passed in message.\n  bool ConsumeField(Message* message) {\n    const Reflection* reflection = message->GetReflection();\n    const Descriptor* descriptor = message->GetDescriptor();\n\n    string field_name;\n\n    const FieldDescriptor* field = NULL;\n\n    if (TryConsume(\"[\")) {\n      // Extension.\n      DO(ConsumeIdentifier(&field_name));\n      while (TryConsume(\".\")) {\n        string part;\n        DO(ConsumeIdentifier(&part));\n        field_name += \".\";\n        field_name += part;\n      }\n      DO(Consume(\"]\"));\n\n      field = (finder_ != NULL\n               ? finder_->FindExtension(message, field_name)\n               : reflection->FindKnownExtensionByName(field_name));\n\n      if (field == NULL) {\n        ReportError(\"Extension \\\"\" + field_name + \"\\\" is not defined or \"\n                    \"is not an extension of \\\"\" +\n                    descriptor->full_name() + \"\\\".\");\n        return false;\n      }\n    } else {\n      DO(ConsumeIdentifier(&field_name));\n\n      field = descriptor->FindFieldByName(field_name);\n      // Group names are expected to be capitalized as they appear in the\n      // .proto file, which actually matches their type names, not their field\n      // names.\n      if (field == NULL) {\n        string lower_field_name = field_name;\n        LowerString(&lower_field_name);\n        field = descriptor->FindFieldByName(lower_field_name);\n        // If the case-insensitive match worked but the field is NOT a group,\n        if (field != NULL && field->type() != FieldDescriptor::TYPE_GROUP) {\n          field = NULL;\n        }\n      }\n      // Again, special-case group names as described above.\n      if (field != NULL && field->type() == FieldDescriptor::TYPE_GROUP\n          && field->message_type()->name() != field_name) {\n        field = NULL;\n      }\n\n      if (field == NULL) {\n        ReportError(\"Message type \\\"\" + descriptor->full_name() +\n                    \"\\\" has no field named \\\"\" + field_name + \"\\\".\");\n        return false;\n      }\n    }\n\n    // Fail if the field is not repeated and it has already been specified.\n    if ((singular_overwrite_policy_ == FORBID_SINGULAR_OVERWRITES) &&\n        !field->is_repeated() && reflection->HasField(*message, field)) {\n      ReportError(\"Non-repeated field \\\"\" + field_name +\n                  \"\\\" is specified multiple times.\");\n      return false;\n    }\n\n    // Perform special handling for embedded message types.\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      // ':' is optional here.\n      TryConsume(\":\");\n      DO(ConsumeFieldMessage(message, reflection, field));\n    } else {\n      DO(Consume(\":\"));\n      if (field->is_repeated() && TryConsume(\"[\")) {\n        // Short repeated format, e.g.  \"foo: [1, 2, 3]\"\n        while (true) {\n          DO(ConsumeFieldValue(message, reflection, field));\n          if (TryConsume(\"]\")) {\n            break;\n          }\n          DO(Consume(\",\"));\n        }\n      } else {\n        DO(ConsumeFieldValue(message, reflection, field));\n      }\n    }\n\n    // For historical reasons, fields may optionally be separated by commas or\n    // semicolons.\n    TryConsume(\";\") || TryConsume(\",\");\n\n    if (field->options().deprecated()) {\n      ReportWarning(\"text format contains deprecated field \\\"\"\n                    + field_name + \"\\\"\");\n    }\n\n    return true;\n  }\n\n  bool ConsumeFieldMessage(Message* message,\n                           const Reflection* reflection,\n                           const FieldDescriptor* field) {\n    string delimeter;\n    if (TryConsume(\"<\")) {\n      delimeter = \">\";\n    } else {\n      DO(Consume(\"{\"));\n      delimeter = \"}\";\n    }\n\n    if (field->is_repeated()) {\n      DO(ConsumeMessage(reflection->AddMessage(message, field), delimeter));\n    } else {\n      DO(ConsumeMessage(reflection->MutableMessage(message, field),\n                        delimeter));\n    }\n    return true;\n  }\n\n  bool ConsumeFieldValue(Message* message,\n                         const Reflection* reflection,\n                         const FieldDescriptor* field) {\n\n// Define an easy to use macro for setting fields. This macro checks\n// to see if the field is repeated (in which case we need to use the Add\n// methods or not (in which case we need to use the Set methods).\n#define SET_FIELD(CPPTYPE, VALUE)                                  \\\n        if (field->is_repeated()) {                                \\\n          reflection->Add##CPPTYPE(message, field, VALUE);         \\\n        } else {                                                   \\\n          reflection->Set##CPPTYPE(message, field, VALUE);         \\\n        }                                                          \\\n\n    switch(field->cpp_type()) {\n      case FieldDescriptor::CPPTYPE_INT32: {\n        int64 value;\n        DO(ConsumeSignedInteger(&value, kint32max));\n        SET_FIELD(Int32, static_cast<int32>(value));\n        break;\n      }\n\n      case FieldDescriptor::CPPTYPE_UINT32: {\n        uint64 value;\n        DO(ConsumeUnsignedInteger(&value, kuint32max));\n        SET_FIELD(UInt32, static_cast<uint32>(value));\n        break;\n      }\n\n      case FieldDescriptor::CPPTYPE_INT64: {\n        int64 value;\n        DO(ConsumeSignedInteger(&value, kint64max));\n        SET_FIELD(Int64, value);\n        break;\n      }\n\n      case FieldDescriptor::CPPTYPE_UINT64: {\n        uint64 value;\n        DO(ConsumeUnsignedInteger(&value, kuint64max));\n        SET_FIELD(UInt64, value);\n        break;\n      }\n\n      case FieldDescriptor::CPPTYPE_FLOAT: {\n        double value;\n        DO(ConsumeDouble(&value));\n        SET_FIELD(Float, static_cast<float>(value));\n        break;\n      }\n\n      case FieldDescriptor::CPPTYPE_DOUBLE: {\n        double value;\n        DO(ConsumeDouble(&value));\n        SET_FIELD(Double, value);\n        break;\n      }\n\n      case FieldDescriptor::CPPTYPE_STRING: {\n        string value;\n        DO(ConsumeString(&value));\n        SET_FIELD(String, value);\n        break;\n      }\n\n      case FieldDescriptor::CPPTYPE_BOOL: {\n        if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) {\n          uint64 value;\n          DO(ConsumeUnsignedInteger(&value, 1));\n          SET_FIELD(Bool, value);\n        } else {\n          string value;\n          DO(ConsumeIdentifier(&value));\n          if (value == \"true\" || value == \"t\") {\n            SET_FIELD(Bool, true);\n          } else if (value == \"false\" || value == \"f\") {\n            SET_FIELD(Bool, false);\n          } else {\n            ReportError(\"Invalid value for boolean field \\\"\" + field->name()\n                        + \"\\\". Value: \\\"\" + value  + \"\\\".\");\n            return false;\n          }\n        }\n        break;\n      }\n\n      case FieldDescriptor::CPPTYPE_ENUM: {\n        string value;\n        const EnumDescriptor* enum_type = field->enum_type();\n        const EnumValueDescriptor* enum_value = NULL;\n\n        if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) {\n          DO(ConsumeIdentifier(&value));\n          // Find the enumeration value.\n          enum_value = enum_type->FindValueByName(value);\n\n        } else if (LookingAt(\"-\") ||\n                   LookingAtType(io::Tokenizer::TYPE_INTEGER)) {\n          int64 int_value;\n          DO(ConsumeSignedInteger(&int_value, kint32max));\n          value = SimpleItoa(int_value);        // for error reporting\n          enum_value = enum_type->FindValueByNumber(int_value);\n        } else {\n          ReportError(\"Expected integer or identifier.\");\n          return false;\n        }\n\n        if (enum_value == NULL) {\n          ReportError(\"Unknown enumeration value of \\\"\" + value  + \"\\\" for \"\n                      \"field \\\"\" + field->name() + \"\\\".\");\n          return false;\n        }\n\n        SET_FIELD(Enum, enum_value);\n        break;\n      }\n\n      case FieldDescriptor::CPPTYPE_MESSAGE: {\n        // We should never get here. Put here instead of a default\n        // so that if new types are added, we get a nice compiler warning.\n        GOOGLE_LOG(FATAL) << \"Reached an unintended state: CPPTYPE_MESSAGE\";\n        break;\n      }\n    }\n#undef SET_FIELD\n    return true;\n  }\n\n  // Returns true if the current token's text is equal to that specified.\n  bool LookingAt(const string& text) {\n    return tokenizer_.current().text == text;\n  }\n\n  // Returns true if the current token's type is equal to that specified.\n  bool LookingAtType(io::Tokenizer::TokenType token_type) {\n    return tokenizer_.current().type == token_type;\n  }\n\n  // Consumes an identifier and saves its value in the identifier parameter.\n  // Returns false if the token is not of type IDENTFIER.\n  bool ConsumeIdentifier(string* identifier) {\n    if (!LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) {\n      ReportError(\"Expected identifier.\");\n      return false;\n    }\n\n    *identifier = tokenizer_.current().text;\n\n    tokenizer_.Next();\n    return true;\n  }\n\n  // Consumes a string and saves its value in the text parameter.\n  // Returns false if the token is not of type STRING.\n  bool ConsumeString(string* text) {\n    if (!LookingAtType(io::Tokenizer::TYPE_STRING)) {\n      ReportError(\"Expected string.\");\n      return false;\n    }\n\n    text->clear();\n    while (LookingAtType(io::Tokenizer::TYPE_STRING)) {\n      io::Tokenizer::ParseStringAppend(tokenizer_.current().text, text);\n\n      tokenizer_.Next();\n    }\n\n    return true;\n  }\n\n  // Consumes a uint64 and saves its value in the value parameter.\n  // Returns false if the token is not of type INTEGER.\n  bool ConsumeUnsignedInteger(uint64* value, uint64 max_value) {\n    if (!LookingAtType(io::Tokenizer::TYPE_INTEGER)) {\n      ReportError(\"Expected integer.\");\n      return false;\n    }\n\n    if (!io::Tokenizer::ParseInteger(tokenizer_.current().text,\n                                     max_value, value)) {\n      ReportError(\"Integer out of range.\");\n      return false;\n    }\n\n    tokenizer_.Next();\n    return true;\n  }\n\n  // Consumes an int64 and saves its value in the value parameter.\n  // Note that since the tokenizer does not support negative numbers,\n  // we actually may consume an additional token (for the minus sign) in this\n  // method. Returns false if the token is not an integer\n  // (signed or otherwise).\n  bool ConsumeSignedInteger(int64* value, uint64 max_value) {\n    bool negative = false;\n\n    if (TryConsume(\"-\")) {\n      negative = true;\n      // Two's complement always allows one more negative integer than\n      // positive.\n      ++max_value;\n    }\n\n    uint64 unsigned_value;\n\n    DO(ConsumeUnsignedInteger(&unsigned_value, max_value));\n\n    *value = static_cast<int64>(unsigned_value);\n\n    if (negative) {\n      *value = -*value;\n    }\n\n    return true;\n  }\n\n  // Consumes a double and saves its value in the value parameter.\n  // Note that since the tokenizer does not support negative numbers,\n  // we actually may consume an additional token (for the minus sign) in this\n  // method. Returns false if the token is not a double\n  // (signed or otherwise).\n  bool ConsumeDouble(double* value) {\n    bool negative = false;\n\n    if (TryConsume(\"-\")) {\n      negative = true;\n    }\n\n    // A double can actually be an integer, according to the tokenizer.\n    // Therefore, we must check both cases here.\n    if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) {\n      // We have found an integer value for the double.\n      uint64 integer_value;\n      DO(ConsumeUnsignedInteger(&integer_value, kuint64max));\n\n      *value = static_cast<double>(integer_value);\n    } else if (LookingAtType(io::Tokenizer::TYPE_FLOAT)) {\n      // We have found a float value for the double.\n      *value = io::Tokenizer::ParseFloat(tokenizer_.current().text);\n\n      // Mark the current token as consumed.\n      tokenizer_.Next();\n    } else if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) {\n      string text = tokenizer_.current().text;\n      LowerString(&text);\n      if (text == \"inf\" || text == \"infinity\") {\n        *value = std::numeric_limits<double>::infinity();\n        tokenizer_.Next();\n      } else if (text == \"nan\") {\n        *value = std::numeric_limits<double>::quiet_NaN();\n        tokenizer_.Next();\n      } else {\n        ReportError(\"Expected double.\");\n        return false;\n      }\n    } else {\n      ReportError(\"Expected double.\");\n      return false;\n    }\n\n    if (negative) {\n      *value = -*value;\n    }\n\n    return true;\n  }\n\n  // Consumes a token and confirms that it matches that specified in the\n  // value parameter. Returns false if the token found does not match that\n  // which was specified.\n  bool Consume(const string& value) {\n    const string& current_value = tokenizer_.current().text;\n\n    if (current_value != value) {\n      ReportError(\"Expected \\\"\" + value + \"\\\", found \\\"\" + current_value\n                  + \"\\\".\");\n      return false;\n    }\n\n    tokenizer_.Next();\n\n    return true;\n  }\n\n  // Attempts to consume the supplied value. Returns false if a the\n  // token found does not match the value specified.\n  bool TryConsume(const string& value) {\n    if (tokenizer_.current().text == value) {\n      tokenizer_.Next();\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  // An internal instance of the Tokenizer's error collector, used to\n  // collect any base-level parse errors and feed them to the ParserImpl.\n  class ParserErrorCollector : public io::ErrorCollector {\n   public:\n    explicit ParserErrorCollector(TextFormat::Parser::ParserImpl* parser) :\n        parser_(parser) { }\n\n    virtual ~ParserErrorCollector() { };\n\n    virtual void AddError(int line, int column, const string& message) {\n      parser_->ReportError(line, column, message);\n    }\n\n    virtual void AddWarning(int line, int column, const string& message) {\n      parser_->ReportWarning(line, column, message);\n    }\n\n   private:\n    GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParserErrorCollector);\n    TextFormat::Parser::ParserImpl* parser_;\n  };\n\n  io::ErrorCollector* error_collector_;\n  TextFormat::Finder* finder_;\n  ParserErrorCollector tokenizer_error_collector_;\n  io::Tokenizer tokenizer_;\n  const Descriptor* root_message_type_;\n  SingularOverwritePolicy singular_overwrite_policy_;\n  bool had_errors_;\n};\n\n#undef DO\n\n// ===========================================================================\n// Internal class for writing text to the io::ZeroCopyOutputStream. Adapted\n// from the Printer found in //google/protobuf/io/printer.h\nclass TextFormat::Printer::TextGenerator {\n public:\n  explicit TextGenerator(io::ZeroCopyOutputStream* output,\n                         int initial_indent_level)\n    : output_(output),\n      buffer_(NULL),\n      buffer_size_(0),\n      at_start_of_line_(true),\n      failed_(false),\n      indent_(\"\"),\n      initial_indent_level_(initial_indent_level) {\n    indent_.resize(initial_indent_level_ * 2, ' ');\n  }\n\n  ~TextGenerator() {\n    // Only BackUp() if we're sure we've successfully called Next() at least\n    // once.\n    if (buffer_size_ > 0) {\n      output_->BackUp(buffer_size_);\n    }\n  }\n\n  // Indent text by two spaces.  After calling Indent(), two spaces will be\n  // inserted at the beginning of each line of text.  Indent() may be called\n  // multiple times to produce deeper indents.\n  void Indent() {\n    indent_ += \"  \";\n  }\n\n  // Reduces the current indent level by two spaces, or crashes if the indent\n  // level is zero.\n  void Outdent() {\n    if (indent_.empty() ||\n        indent_.size() < initial_indent_level_ * 2) {\n      GOOGLE_LOG(DFATAL) << \" Outdent() without matching Indent().\";\n      return;\n    }\n\n    indent_.resize(indent_.size() - 2);\n  }\n\n  // Print text to the output stream.\n  void Print(const string& str) {\n    Print(str.data(), str.size());\n  }\n\n  // Print text to the output stream.\n  void Print(const char* text) {\n    Print(text, strlen(text));\n  }\n\n  // Print text to the output stream.\n  void Print(const char* text, int size) {\n    int pos = 0;  // The number of bytes we've written so far.\n\n    for (int i = 0; i < size; i++) {\n      if (text[i] == '\\n') {\n        // Saw newline.  If there is more text, we may need to insert an indent\n        // here.  So, write what we have so far, including the '\\n'.\n        Write(text + pos, i - pos + 1);\n        pos = i + 1;\n\n        // Setting this true will cause the next Write() to insert an indent\n        // first.\n        at_start_of_line_ = true;\n      }\n    }\n\n    // Write the rest.\n    Write(text + pos, size - pos);\n  }\n\n  // True if any write to the underlying stream failed.  (We don't just\n  // crash in this case because this is an I/O failure, not a programming\n  // error.)\n  bool failed() const { return failed_; }\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextGenerator);\n\n  void Write(const char* data, int size) {\n    if (failed_) return;\n    if (size == 0) return;\n\n    if (at_start_of_line_) {\n      // Insert an indent.\n      at_start_of_line_ = false;\n      Write(indent_.data(), indent_.size());\n      if (failed_) return;\n    }\n\n    while (size > buffer_size_) {\n      // Data exceeds space in the buffer.  Copy what we can and request a\n      // new buffer.\n      memcpy(buffer_, data, buffer_size_);\n      data += buffer_size_;\n      size -= buffer_size_;\n      void* void_buffer;\n      failed_ = !output_->Next(&void_buffer, &buffer_size_);\n      if (failed_) return;\n      buffer_ = reinterpret_cast<char*>(void_buffer);\n    }\n\n    // Buffer is big enough to receive the data; copy it.\n    memcpy(buffer_, data, size);\n    buffer_ += size;\n    buffer_size_ -= size;\n  }\n\n  io::ZeroCopyOutputStream* const output_;\n  char* buffer_;\n  int buffer_size_;\n  bool at_start_of_line_;\n  bool failed_;\n\n  string indent_;\n  int initial_indent_level_;\n};\n\n// ===========================================================================\n\nTextFormat::Finder::~Finder() {\n}\n\nTextFormat::Parser::Parser()\n  : error_collector_(NULL),\n    finder_(NULL),\n    allow_partial_(false) {\n}\n\nTextFormat::Parser::~Parser() {}\n\nbool TextFormat::Parser::Parse(io::ZeroCopyInputStream* input,\n                               Message* output) {\n  output->Clear();\n  ParserImpl parser(output->GetDescriptor(), input, error_collector_,\n                    finder_, ParserImpl::FORBID_SINGULAR_OVERWRITES);\n  return MergeUsingImpl(input, output, &parser);\n}\n\nbool TextFormat::Parser::ParseFromString(const string& input,\n                                         Message* output) {\n  io::ArrayInputStream input_stream(input.data(), input.size());\n  return Parse(&input_stream, output);\n}\n\nbool TextFormat::Parser::Merge(io::ZeroCopyInputStream* input,\n                               Message* output) {\n  ParserImpl parser(output->GetDescriptor(), input, error_collector_,\n                    finder_, ParserImpl::ALLOW_SINGULAR_OVERWRITES);\n  return MergeUsingImpl(input, output, &parser);\n}\n\nbool TextFormat::Parser::MergeFromString(const string& input,\n                                         Message* output) {\n  io::ArrayInputStream input_stream(input.data(), input.size());\n  return Merge(&input_stream, output);\n}\n\nbool TextFormat::Parser::MergeUsingImpl(io::ZeroCopyInputStream* input,\n                                        Message* output,\n                                        ParserImpl* parser_impl) {\n  if (!parser_impl->Parse(output)) return false;\n  if (!allow_partial_ && !output->IsInitialized()) {\n    vector<string> missing_fields;\n    output->FindInitializationErrors(&missing_fields);\n    parser_impl->ReportError(-1, 0, \"Message missing required fields: \" +\n                                    JoinStrings(missing_fields, \", \"));\n    return false;\n  }\n  return true;\n}\n\nbool TextFormat::Parser::ParseFieldValueFromString(\n    const string& input,\n    const FieldDescriptor* field,\n    Message* output) {\n  io::ArrayInputStream input_stream(input.data(), input.size());\n  ParserImpl parser(output->GetDescriptor(), &input_stream, error_collector_,\n                    finder_, ParserImpl::ALLOW_SINGULAR_OVERWRITES);\n  return parser.ParseField(field, output);\n}\n\n/* static */ bool TextFormat::Parse(io::ZeroCopyInputStream* input,\n                                    Message* output) {\n  return Parser().Parse(input, output);\n}\n\n/* static */ bool TextFormat::Merge(io::ZeroCopyInputStream* input,\n                                    Message* output) {\n  return Parser().Merge(input, output);\n}\n\n/* static */ bool TextFormat::ParseFromString(const string& input,\n                                              Message* output) {\n  return Parser().ParseFromString(input, output);\n}\n\n/* static */ bool TextFormat::MergeFromString(const string& input,\n                                              Message* output) {\n  return Parser().MergeFromString(input, output);\n}\n\n// ===========================================================================\n\nTextFormat::Printer::Printer()\n  : initial_indent_level_(0),\n    single_line_mode_(false),\n    use_short_repeated_primitives_(false),\n    utf8_string_escaping_(false) {}\n\nTextFormat::Printer::~Printer() {}\n\nbool TextFormat::Printer::PrintToString(const Message& message,\n                                        string* output) const {\n  GOOGLE_DCHECK(output) << \"output specified is NULL\";\n\n  output->clear();\n  io::StringOutputStream output_stream(output);\n\n  bool result = Print(message, &output_stream);\n\n  return result;\n}\n\nbool TextFormat::Printer::PrintUnknownFieldsToString(\n    const UnknownFieldSet& unknown_fields,\n    string* output) const {\n  GOOGLE_DCHECK(output) << \"output specified is NULL\";\n\n  output->clear();\n  io::StringOutputStream output_stream(output);\n  return PrintUnknownFields(unknown_fields, &output_stream);\n}\n\nbool TextFormat::Printer::Print(const Message& message,\n                                io::ZeroCopyOutputStream* output) const {\n  TextGenerator generator(output, initial_indent_level_);\n\n  Print(message, generator);\n\n  // Output false if the generator failed internally.\n  return !generator.failed();\n}\n\nbool TextFormat::Printer::PrintUnknownFields(\n    const UnknownFieldSet& unknown_fields,\n    io::ZeroCopyOutputStream* output) const {\n  TextGenerator generator(output, initial_indent_level_);\n\n  PrintUnknownFields(unknown_fields, generator);\n\n  // Output false if the generator failed internally.\n  return !generator.failed();\n}\n\nvoid TextFormat::Printer::Print(const Message& message,\n                                TextGenerator& generator) const {\n  const Reflection* reflection = message.GetReflection();\n  vector<const FieldDescriptor*> fields;\n  reflection->ListFields(message, &fields);\n  for (int i = 0; i < fields.size(); i++) {\n    PrintField(message, reflection, fields[i], generator);\n  }\n  PrintUnknownFields(reflection->GetUnknownFields(message), generator);\n}\n\nvoid TextFormat::Printer::PrintFieldValueToString(\n    const Message& message,\n    const FieldDescriptor* field,\n    int index,\n    string* output) const {\n\n  GOOGLE_DCHECK(output) << \"output specified is NULL\";\n\n  output->clear();\n  io::StringOutputStream output_stream(output);\n  TextGenerator generator(&output_stream, initial_indent_level_);\n\n  PrintFieldValue(message, message.GetReflection(), field, index, generator);\n}\n\nvoid TextFormat::Printer::PrintField(const Message& message,\n                                     const Reflection* reflection,\n                                     const FieldDescriptor* field,\n                                     TextGenerator& generator) const {\n  if (use_short_repeated_primitives_ &&\n      field->is_repeated() &&\n      field->cpp_type() != FieldDescriptor::CPPTYPE_STRING &&\n      field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {\n    PrintShortRepeatedField(message, reflection, field, generator);\n    return;\n  }\n\n  int count = 0;\n\n  if (field->is_repeated()) {\n    count = reflection->FieldSize(message, field);\n  } else if (reflection->HasField(message, field)) {\n    count = 1;\n  }\n\n  for (int j = 0; j < count; ++j) {\n    PrintFieldName(message, reflection, field, generator);\n\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      if (single_line_mode_) {\n        generator.Print(\" { \");\n      } else {\n        generator.Print(\" {\\n\");\n        generator.Indent();\n      }\n    } else {\n      generator.Print(\": \");\n    }\n\n    // Write the field value.\n    int field_index = j;\n    if (!field->is_repeated()) {\n      field_index = -1;\n    }\n\n    PrintFieldValue(message, reflection, field, field_index, generator);\n\n    if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {\n      if (single_line_mode_) {\n        generator.Print(\"} \");\n      } else {\n        generator.Outdent();\n        generator.Print(\"}\\n\");\n      }\n    } else {\n      if (single_line_mode_) {\n        generator.Print(\" \");\n      } else {\n        generator.Print(\"\\n\");\n      }\n    }\n  }\n}\n\nvoid TextFormat::Printer::PrintShortRepeatedField(\n    const Message& message,\n    const Reflection* reflection,\n    const FieldDescriptor* field,\n    TextGenerator& generator) const {\n  // Print primitive repeated field in short form.\n  PrintFieldName(message, reflection, field, generator);\n\n  int size = reflection->FieldSize(message, field);\n  generator.Print(\": [\");\n  for (int i = 0; i < size; i++) {\n    if (i > 0) generator.Print(\", \");\n    PrintFieldValue(message, reflection, field, i, generator);\n  }\n  if (single_line_mode_) {\n    generator.Print(\"] \");\n  } else {\n    generator.Print(\"]\\n\");\n  }\n}\n\nvoid TextFormat::Printer::PrintFieldName(const Message& message,\n                                         const Reflection* reflection,\n                                         const FieldDescriptor* field,\n                                         TextGenerator& generator) const {\n  if (field->is_extension()) {\n    generator.Print(\"[\");\n    // We special-case MessageSet elements for compatibility with proto1.\n    if (field->containing_type()->options().message_set_wire_format()\n        && field->type() == FieldDescriptor::TYPE_MESSAGE\n        && field->is_optional()\n        && field->extension_scope() == field->message_type()) {\n      generator.Print(field->message_type()->full_name());\n    } else {\n      generator.Print(field->full_name());\n    }\n    generator.Print(\"]\");\n  } else {\n    if (field->type() == FieldDescriptor::TYPE_GROUP) {\n      // Groups must be serialized with their original capitalization.\n      generator.Print(field->message_type()->name());\n    } else {\n      generator.Print(field->name());\n    }\n  }\n}\n\nvoid TextFormat::Printer::PrintFieldValue(\n    const Message& message,\n    const Reflection* reflection,\n    const FieldDescriptor* field,\n    int index,\n    TextGenerator& generator) const {\n  GOOGLE_DCHECK(field->is_repeated() || (index == -1))\n      << \"Index must be -1 for non-repeated fields\";\n\n  switch (field->cpp_type()) {\n#define OUTPUT_FIELD(CPPTYPE, METHOD, TO_STRING)                             \\\n      case FieldDescriptor::CPPTYPE_##CPPTYPE:                               \\\n        generator.Print(TO_STRING(field->is_repeated() ?                     \\\n          reflection->GetRepeated##METHOD(message, field, index) :           \\\n          reflection->Get##METHOD(message, field)));                         \\\n        break;                                                               \\\n\n      OUTPUT_FIELD( INT32,  Int32, SimpleItoa);\n      OUTPUT_FIELD( INT64,  Int64, SimpleItoa);\n      OUTPUT_FIELD(UINT32, UInt32, SimpleItoa);\n      OUTPUT_FIELD(UINT64, UInt64, SimpleItoa);\n      OUTPUT_FIELD( FLOAT,  Float, SimpleFtoa);\n      OUTPUT_FIELD(DOUBLE, Double, SimpleDtoa);\n#undef OUTPUT_FIELD\n\n      case FieldDescriptor::CPPTYPE_STRING: {\n        string scratch;\n        const string& value = field->is_repeated() ?\n            reflection->GetRepeatedStringReference(\n              message, field, index, &scratch) :\n            reflection->GetStringReference(message, field, &scratch);\n\n        generator.Print(\"\\\"\");\n        if (utf8_string_escaping_) {\n          generator.Print(strings::Utf8SafeCEscape(value));\n        } else {\n          generator.Print(CEscape(value));\n        }\n        generator.Print(\"\\\"\");\n\n        break;\n      }\n\n      case FieldDescriptor::CPPTYPE_BOOL:\n        if (field->is_repeated()) {\n          generator.Print(reflection->GetRepeatedBool(message, field, index)\n                          ? \"true\" : \"false\");\n        } else {\n          generator.Print(reflection->GetBool(message, field)\n                          ? \"true\" : \"false\");\n        }\n        break;\n\n      case FieldDescriptor::CPPTYPE_ENUM:\n        generator.Print(field->is_repeated() ?\n          reflection->GetRepeatedEnum(message, field, index)->name() :\n          reflection->GetEnum(message, field)->name());\n        break;\n\n      case FieldDescriptor::CPPTYPE_MESSAGE:\n        Print(field->is_repeated() ?\n                reflection->GetRepeatedMessage(message, field, index) :\n                reflection->GetMessage(message, field),\n              generator);\n        break;\n  }\n}\n\n/* static */ bool TextFormat::Print(const Message& message,\n                                    io::ZeroCopyOutputStream* output) {\n  return Printer().Print(message, output);\n}\n\n/* static */ bool TextFormat::PrintUnknownFields(\n    const UnknownFieldSet& unknown_fields,\n    io::ZeroCopyOutputStream* output) {\n  return Printer().PrintUnknownFields(unknown_fields, output);\n}\n\n/* static */ bool TextFormat::PrintToString(\n    const Message& message, string* output) {\n  return Printer().PrintToString(message, output);\n}\n\n/* static */ bool TextFormat::PrintUnknownFieldsToString(\n    const UnknownFieldSet& unknown_fields, string* output) {\n  return Printer().PrintUnknownFieldsToString(unknown_fields, output);\n}\n\n/* static */ void TextFormat::PrintFieldValueToString(\n    const Message& message,\n    const FieldDescriptor* field,\n    int index,\n    string* output) {\n  return Printer().PrintFieldValueToString(message, field, index, output);\n}\n\n/* static */ bool TextFormat::ParseFieldValueFromString(\n    const string& input,\n    const FieldDescriptor* field,\n    Message* message) {\n  return Parser().ParseFieldValueFromString(input, field, message);\n}\n\n// Prints an integer as hex with a fixed number of digits dependent on the\n// integer type.\ntemplate<typename IntType>\nstatic string PaddedHex(IntType value) {\n  string result;\n  result.reserve(sizeof(value) * 2);\n  for (int i = sizeof(value) * 2 - 1; i >= 0; i--) {\n    result.push_back(int_to_hex_digit(value >> (i*4) & 0x0F));\n  }\n  return result;\n}\n\nvoid TextFormat::Printer::PrintUnknownFields(\n    const UnknownFieldSet& unknown_fields, TextGenerator& generator) const {\n  for (int i = 0; i < unknown_fields.field_count(); i++) {\n    const UnknownField& field = unknown_fields.field(i);\n    string field_number = SimpleItoa(field.number());\n\n    switch (field.type()) {\n      case UnknownField::TYPE_VARINT:\n        generator.Print(field_number);\n        generator.Print(\": \");\n        generator.Print(SimpleItoa(field.varint()));\n        if (single_line_mode_) {\n          generator.Print(\" \");\n        } else {\n          generator.Print(\"\\n\");\n        }\n        break;\n      case UnknownField::TYPE_FIXED32: {\n        generator.Print(field_number);\n        generator.Print(\": 0x\");\n        char buffer[kFastToBufferSize];\n        generator.Print(FastHex32ToBuffer(field.fixed32(), buffer));\n        if (single_line_mode_) {\n          generator.Print(\" \");\n        } else {\n          generator.Print(\"\\n\");\n        }\n        break;\n      }\n      case UnknownField::TYPE_FIXED64: {\n        generator.Print(field_number);\n        generator.Print(\": 0x\");\n        char buffer[kFastToBufferSize];\n        generator.Print(FastHex64ToBuffer(field.fixed64(), buffer));\n        if (single_line_mode_) {\n          generator.Print(\" \");\n        } else {\n          generator.Print(\"\\n\");\n        }\n        break;\n      }\n      case UnknownField::TYPE_LENGTH_DELIMITED: {\n        generator.Print(field_number);\n        const string& value = field.length_delimited();\n        UnknownFieldSet embedded_unknown_fields;\n        if (!value.empty() && embedded_unknown_fields.ParseFromString(value)) {\n          // This field is parseable as a Message.\n          // So it is probably an embedded message.\n          if (single_line_mode_) {\n            generator.Print(\" { \");\n          } else {\n            generator.Print(\" {\\n\");\n            generator.Indent();\n          }\n          PrintUnknownFields(embedded_unknown_fields, generator);\n          if (single_line_mode_) {\n            generator.Print(\"} \");\n          } else {\n            generator.Outdent();\n            generator.Print(\"}\\n\");\n          }\n        } else {\n          // This field is not parseable as a Message.\n          // So it is probably just a plain string.\n          generator.Print(\": \\\"\");\n          generator.Print(CEscape(value));\n          generator.Print(\"\\\"\");\n          if (single_line_mode_) {\n            generator.Print(\" \");\n          } else {\n            generator.Print(\"\\n\");\n          }\n        }\n        break;\n      }\n      case UnknownField::TYPE_GROUP:\n        generator.Print(field_number);\n        if (single_line_mode_) {\n          generator.Print(\" { \");\n        } else {\n          generator.Print(\" {\\n\");\n          generator.Indent();\n        }\n        PrintUnknownFields(field.group(), generator);\n        if (single_line_mode_) {\n          generator.Print(\"} \");\n        } else {\n          generator.Outdent();\n          generator.Print(\"}\\n\");\n        }\n        break;\n    }\n  }\n}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: jschorr@google.com (Joseph Schorr)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Utilities for printing and parsing protocol messages in a human-readable,\n// text-based format.\n\n#ifndef GOOGLE_PROTOBUF_TEXT_FORMAT_H__\n#define GOOGLE_PROTOBUF_TEXT_FORMAT_H__\n\n#include <string>\n#include <google/protobuf/message.h>\n#include <google/protobuf/descriptor.h>\n\nnamespace google {\nnamespace protobuf {\n\nnamespace io {\n  class ErrorCollector;      // tokenizer.h\n}\n\n// This class implements protocol buffer text format.  Printing and parsing\n// protocol messages in text format is useful for debugging and human editing\n// of messages.\n//\n// This class is really a namespace that contains only static methods.\nclass LIBPROTOBUF_EXPORT TextFormat {\n public:\n  // Outputs a textual representation of the given message to the given\n  // output stream.\n  static bool Print(const Message& message, io::ZeroCopyOutputStream* output);\n\n  // Print the fields in an UnknownFieldSet.  They are printed by tag number\n  // only.  Embedded messages are heuristically identified by attempting to\n  // parse them.\n  static bool PrintUnknownFields(const UnknownFieldSet& unknown_fields,\n                                 io::ZeroCopyOutputStream* output);\n\n  // Like Print(), but outputs directly to a string.\n  static bool PrintToString(const Message& message, string* output);\n\n  // Like PrintUnknownFields(), but outputs directly to a string.\n  static bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields,\n                                         string* output);\n\n  // Outputs a textual representation of the value of the field supplied on\n  // the message supplied. For non-repeated fields, an index of -1 must\n  // be supplied. Note that this method will print the default value for a\n  // field if it is not set.\n  static void PrintFieldValueToString(const Message& message,\n                                      const FieldDescriptor* field,\n                                      int index,\n                                      string* output);\n\n  // Class for those users which require more fine-grained control over how\n  // a protobuffer message is printed out.\n  class LIBPROTOBUF_EXPORT Printer {\n   public:\n    Printer();\n    ~Printer();\n\n    // Like TextFormat::Print\n    bool Print(const Message& message, io::ZeroCopyOutputStream* output) const;\n    // Like TextFormat::PrintUnknownFields\n    bool PrintUnknownFields(const UnknownFieldSet& unknown_fields,\n                            io::ZeroCopyOutputStream* output) const;\n    // Like TextFormat::PrintToString\n    bool PrintToString(const Message& message, string* output) const;\n    // Like TextFormat::PrintUnknownFieldsToString\n    bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields,\n                                    string* output) const;\n    // Like TextFormat::PrintFieldValueToString\n    void PrintFieldValueToString(const Message& message,\n                                 const FieldDescriptor* field,\n                                 int index,\n                                 string* output) const;\n\n    // Adjust the initial indent level of all output.  Each indent level is\n    // equal to two spaces.\n    void SetInitialIndentLevel(int indent_level) {\n      initial_indent_level_ = indent_level;\n    }\n\n    // If printing in single line mode, then the entire message will be output\n    // on a single line with no line breaks.\n    void SetSingleLineMode(bool single_line_mode) {\n      single_line_mode_ = single_line_mode;\n    }\n\n    // Set true to print repeated primitives in a format like:\n    //   field_name: [1, 2, 3, 4]\n    // instead of printing each value on its own line.  Short format applies\n    // only to primitive values -- i.e. everything except strings and\n    // sub-messages/groups.\n    void SetUseShortRepeatedPrimitives(bool use_short_repeated_primitives) {\n      use_short_repeated_primitives_ = use_short_repeated_primitives;\n    }\n\n    // Set true to output UTF-8 instead of ASCII.  The only difference\n    // is that bytes >= 0x80 in string fields will not be escaped,\n    // because they are assumed to be part of UTF-8 multi-byte\n    // sequences.\n    void SetUseUtf8StringEscaping(bool as_utf8) {\n      utf8_string_escaping_ = as_utf8;\n    }\n\n   private:\n    // Forward declaration of an internal class used to print the text\n    // output to the OutputStream (see text_format.cc for implementation).\n    class TextGenerator;\n\n    // Internal Print method, used for writing to the OutputStream via\n    // the TextGenerator class.\n    void Print(const Message& message,\n               TextGenerator& generator) const;\n\n    // Print a single field.\n    void PrintField(const Message& message,\n                    const Reflection* reflection,\n                    const FieldDescriptor* field,\n                    TextGenerator& generator) const;\n\n    // Print a repeated primitive field in short form.\n    void PrintShortRepeatedField(const Message& message,\n                                 const Reflection* reflection,\n                                 const FieldDescriptor* field,\n                                 TextGenerator& generator) const;\n\n    // Print the name of a field -- i.e. everything that comes before the\n    // ':' for a single name/value pair.\n    void PrintFieldName(const Message& message,\n                        const Reflection* reflection,\n                        const FieldDescriptor* field,\n                        TextGenerator& generator) const;\n\n    // Outputs a textual representation of the value of the field supplied on\n    // the message supplied or the default value if not set.\n    void PrintFieldValue(const Message& message,\n                         const Reflection* reflection,\n                         const FieldDescriptor* field,\n                         int index,\n                         TextGenerator& generator) const;\n\n    // Print the fields in an UnknownFieldSet.  They are printed by tag number\n    // only.  Embedded messages are heuristically identified by attempting to\n    // parse them.\n    void PrintUnknownFields(const UnknownFieldSet& unknown_fields,\n                            TextGenerator& generator) const;\n\n    int initial_indent_level_;\n\n    bool single_line_mode_;\n\n    bool use_short_repeated_primitives_;\n\n    bool utf8_string_escaping_;\n  };\n\n  // Parses a text-format protocol message from the given input stream to\n  // the given message object.  This function parses the format written\n  // by Print().\n  static bool Parse(io::ZeroCopyInputStream* input, Message* output);\n  // Like Parse(), but reads directly from a string.\n  static bool ParseFromString(const string& input, Message* output);\n\n  // Like Parse(), but the data is merged into the given message, as if\n  // using Message::MergeFrom().\n  static bool Merge(io::ZeroCopyInputStream* input, Message* output);\n  // Like Merge(), but reads directly from a string.\n  static bool MergeFromString(const string& input, Message* output);\n\n  // Parse the given text as a single field value and store it into the\n  // given field of the given message. If the field is a repeated field,\n  // the new value will be added to the end\n  static bool ParseFieldValueFromString(const string& input,\n                                        const FieldDescriptor* field,\n                                        Message* message);\n\n  // Interface that TextFormat::Parser can use to find extensions.\n  // This class may be extended in the future to find more information\n  // like fields, etc.\n  class LIBPROTOBUF_EXPORT Finder {\n   public:\n    virtual ~Finder();\n\n    // Try to find an extension of *message by fully-qualified field\n    // name.  Returns NULL if no extension is known for this name or number.\n    virtual const FieldDescriptor* FindExtension(\n        Message* message,\n        const string& name) const = 0;\n  };\n\n  // For more control over parsing, use this class.\n  class LIBPROTOBUF_EXPORT Parser {\n   public:\n    Parser();\n    ~Parser();\n\n    // Like TextFormat::Parse().\n    bool Parse(io::ZeroCopyInputStream* input, Message* output);\n    // Like TextFormat::ParseFromString().\n    bool ParseFromString(const string& input, Message* output);\n    // Like TextFormat::Merge().\n    bool Merge(io::ZeroCopyInputStream* input, Message* output);\n    // Like TextFormat::MergeFromString().\n    bool MergeFromString(const string& input, Message* output);\n\n    // Set where to report parse errors.  If NULL (the default), errors will\n    // be printed to stderr.\n    void RecordErrorsTo(io::ErrorCollector* error_collector) {\n      error_collector_ = error_collector;\n    }\n\n    // Set how parser finds extensions.  If NULL (the default), the\n    // parser will use the standard Reflection object associated with\n    // the message being parsed.\n    void SetFinder(Finder* finder) {\n      finder_ = finder;\n    }\n\n    // Normally parsing fails if, after parsing, output->IsInitialized()\n    // returns false.  Call AllowPartialMessage(true) to skip this check.\n    void AllowPartialMessage(bool allow) {\n      allow_partial_ = allow;\n    }\n\n    // Like TextFormat::ParseFieldValueFromString\n    bool ParseFieldValueFromString(const string& input,\n                                   const FieldDescriptor* field,\n                                   Message* output);\n\n   private:\n    // Forward declaration of an internal class used to parse text\n    // representations (see text_format.cc for implementation).\n    class ParserImpl;\n\n    // Like TextFormat::Merge().  The provided implementation is used\n    // to do the parsing.\n    bool MergeUsingImpl(io::ZeroCopyInputStream* input,\n                        Message* output,\n                        ParserImpl* parser_impl);\n\n    io::ErrorCollector* error_collector_;\n    Finder* finder_;\n    bool allow_partial_;\n  };\n\n private:\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormat);\n};\n\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_TEXT_FORMAT_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: jschorr@google.com (Joseph Schorr)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <math.h>\n#include <stdlib.h>\n#include <limits>\n\n#include <google/protobuf/text_format.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/io/tokenizer.h>\n#include <google/protobuf/unittest.pb.h>\n#include <google/protobuf/unittest_mset.pb.h>\n#include <google/protobuf/test_util.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/testing/file.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n#include <google/protobuf/stubs/strutil.h>\n#include <google/protobuf/stubs/substitute.h>\n\nnamespace google {\nnamespace protobuf {\n\n// Can't use an anonymous namespace here due to brokenness of Tru64 compiler.\nnamespace text_format_unittest {\n\ninline bool IsNaN(double value) {\n  // NaN is never equal to anything, even itself.\n  return value != value;\n}\n\n// A basic string with different escapable characters for testing.\nconst string kEscapeTestString =\n  \"\\\"A string with ' characters \\n and \\r newlines and \\t tabs and \\001 \"\n  \"slashes \\\\ and  multiple   spaces\";\n\n// A representation of the above string with all the characters escaped.\nconst string kEscapeTestStringEscaped =\n  \"\\\"\\\\\\\"A string with \\\\' characters \\\\n and \\\\r newlines \"\n  \"and \\\\t tabs and \\\\001 slashes \\\\\\\\ and  multiple   spaces\\\"\";\n\nclass TextFormatTest : public testing::Test {\n public:\n  static void SetUpTestCase() {\n    File::ReadFileToStringOrDie(\n        TestSourceDir()\n        + \"/google/protobuf/testdata/text_format_unittest_data.txt\",\n        &static_proto_debug_string_);\n  }\n\n  TextFormatTest() : proto_debug_string_(static_proto_debug_string_) {}\n\n protected:\n  // Debug string read from text_format_unittest_data.txt.\n  const string proto_debug_string_;\n  unittest::TestAllTypes proto_;\n\n private:\n  static string static_proto_debug_string_;\n};\nstring TextFormatTest::static_proto_debug_string_;\n\nclass TextFormatExtensionsTest : public testing::Test {\n public:\n  static void SetUpTestCase() {\n    File::ReadFileToStringOrDie(\n        TestSourceDir()\n        + \"/google/protobuf/testdata/\"\n          \"text_format_unittest_extensions_data.txt\",\n        &static_proto_debug_string_);\n  }\n\n  TextFormatExtensionsTest()\n      : proto_debug_string_(static_proto_debug_string_) {}\n\n protected:\n  // Debug string read from text_format_unittest_data.txt.\n  const string proto_debug_string_;\n  unittest::TestAllExtensions proto_;\n\n private:\n  static string static_proto_debug_string_;\n};\nstring TextFormatExtensionsTest::static_proto_debug_string_;\n\n\nTEST_F(TextFormatTest, Basic) {\n  TestUtil::SetAllFields(&proto_);\n  EXPECT_EQ(proto_debug_string_, proto_.DebugString());\n}\n\nTEST_F(TextFormatExtensionsTest, Extensions) {\n  TestUtil::SetAllExtensions(&proto_);\n  EXPECT_EQ(proto_debug_string_, proto_.DebugString());\n}\n\nTEST_F(TextFormatTest, ShortDebugString) {\n  proto_.set_optional_int32(1);\n  proto_.set_optional_string(\"hello\");\n  proto_.mutable_optional_nested_message()->set_bb(2);\n  proto_.mutable_optional_foreign_message();\n\n  EXPECT_EQ(\"optional_int32: 1 optional_string: \\\"hello\\\" \"\n            \"optional_nested_message { bb: 2 } \"\n            \"optional_foreign_message { }\",\n            proto_.ShortDebugString());\n}\n\nTEST_F(TextFormatTest, ShortPrimitiveRepeateds) {\n  proto_.set_optional_int32(123);\n  proto_.add_repeated_int32(456);\n  proto_.add_repeated_int32(789);\n  proto_.add_repeated_string(\"foo\");\n  proto_.add_repeated_string(\"bar\");\n  proto_.add_repeated_nested_message()->set_bb(2);\n  proto_.add_repeated_nested_message()->set_bb(3);\n  proto_.add_repeated_nested_enum(unittest::TestAllTypes::FOO);\n  proto_.add_repeated_nested_enum(unittest::TestAllTypes::BAR);\n\n  TextFormat::Printer printer;\n  printer.SetUseShortRepeatedPrimitives(true);\n  string text;\n  printer.PrintToString(proto_, &text);\n\n  EXPECT_EQ(\"optional_int32: 123\\n\"\n            \"repeated_int32: [456, 789]\\n\"\n            \"repeated_string: \\\"foo\\\"\\n\"\n            \"repeated_string: \\\"bar\\\"\\n\"\n            \"repeated_nested_message {\\n  bb: 2\\n}\\n\"\n            \"repeated_nested_message {\\n  bb: 3\\n}\\n\"\n            \"repeated_nested_enum: [FOO, BAR]\\n\",\n            text);\n\n  // Try in single-line mode.\n  printer.SetSingleLineMode(true);\n  printer.PrintToString(proto_, &text);\n\n  EXPECT_EQ(\"optional_int32: 123 \"\n            \"repeated_int32: [456, 789] \"\n            \"repeated_string: \\\"foo\\\" \"\n            \"repeated_string: \\\"bar\\\" \"\n            \"repeated_nested_message { bb: 2 } \"\n            \"repeated_nested_message { bb: 3 } \"\n            \"repeated_nested_enum: [FOO, BAR] \",\n            text);\n}\n\n\nTEST_F(TextFormatTest, StringEscape) {\n  // Set the string value to test.\n  proto_.set_optional_string(kEscapeTestString);\n\n  // Get the DebugString from the proto.\n  string debug_string = proto_.DebugString();\n  string utf8_debug_string = proto_.Utf8DebugString();\n\n  // Hardcode a correct value to test against.\n  string correct_string = \"optional_string: \"\n      + kEscapeTestStringEscaped\n       + \"\\n\";\n\n  // Compare.\n  EXPECT_EQ(correct_string, debug_string);\n  // UTF-8 string is the same as non-UTF-8 because\n  // the protocol buffer contains no UTF-8 text.\n  EXPECT_EQ(correct_string, utf8_debug_string);\n\n  string expected_short_debug_string = \"optional_string: \"\n      + kEscapeTestStringEscaped;\n  EXPECT_EQ(expected_short_debug_string, proto_.ShortDebugString());\n}\n\nTEST_F(TextFormatTest, Utf8DebugString) {\n  // Set the string value to test.\n  proto_.set_optional_string(\"\\350\\260\\267\\346\\255\\214\");\n\n  // Get the DebugString from the proto.\n  string debug_string = proto_.DebugString();\n  string utf8_debug_string = proto_.Utf8DebugString();\n\n  // Hardcode a correct value to test against.\n  string correct_utf8_string = \"optional_string: \"\n      \"\\\"\\350\\260\\267\\346\\255\\214\\\"\"\n      \"\\n\";\n  string correct_string = \"optional_string: \"\n      \"\\\"\\\\350\\\\260\\\\267\\\\346\\\\255\\\\214\\\"\"\n      \"\\n\";\n\n  // Compare.\n  EXPECT_EQ(correct_utf8_string, utf8_debug_string);\n  EXPECT_EQ(correct_string, debug_string);\n}\n\nTEST_F(TextFormatTest, PrintUnknownFields) {\n  // Test printing of unknown fields in a message.\n\n  unittest::TestEmptyMessage message;\n  UnknownFieldSet* unknown_fields = message.mutable_unknown_fields();\n\n  unknown_fields->AddVarint(5, 1);\n  unknown_fields->AddFixed32(5, 2);\n  unknown_fields->AddFixed64(5, 3);\n  unknown_fields->AddLengthDelimited(5, \"4\");\n  unknown_fields->AddGroup(5)->AddVarint(10, 5);\n\n  unknown_fields->AddVarint(8, 1);\n  unknown_fields->AddVarint(8, 2);\n  unknown_fields->AddVarint(8, 3);\n\n  EXPECT_EQ(\n    \"5: 1\\n\"\n    \"5: 0x00000002\\n\"\n    \"5: 0x0000000000000003\\n\"\n    \"5: \\\"4\\\"\\n\"\n    \"5 {\\n\"\n    \"  10: 5\\n\"\n    \"}\\n\"\n    \"8: 1\\n\"\n    \"8: 2\\n\"\n    \"8: 3\\n\",\n    message.DebugString());\n}\n\nTEST_F(TextFormatTest, PrintUnknownMessage) {\n  // Test heuristic printing of messages in an UnknownFieldSet.\n\n  protobuf_unittest::TestAllTypes message;\n\n  // Cases which should not be interpreted as sub-messages.\n\n  // 'a' is a valid FIXED64 tag, so for the string to be parseable as a message\n  // it should be followed by 8 bytes.  Since this string only has two\n  // subsequent bytes, it should be treated as a string.\n  message.add_repeated_string(\"abc\");\n\n  // 'd' happens to be a valid ENDGROUP tag.  So,\n  // UnknownFieldSet::MergeFromCodedStream() will successfully parse \"def\", but\n  // the ConsumedEntireMessage() check should fail.\n  message.add_repeated_string(\"def\");\n\n  // A zero-length string should never be interpreted as a message even though\n  // it is technically valid as one.\n  message.add_repeated_string(\"\");\n\n  // Case which should be interpreted as a sub-message.\n\n  // An actual nested message with content should always be interpreted as a\n  // nested message.\n  message.add_repeated_nested_message()->set_bb(123);\n\n  string data;\n  message.SerializeToString(&data);\n\n  string text;\n  UnknownFieldSet unknown_fields;\n  EXPECT_TRUE(unknown_fields.ParseFromString(data));\n  EXPECT_TRUE(TextFormat::PrintUnknownFieldsToString(unknown_fields, &text));\n  EXPECT_EQ(\n    \"44: \\\"abc\\\"\\n\"\n    \"44: \\\"def\\\"\\n\"\n    \"44: \\\"\\\"\\n\"\n    \"48 {\\n\"\n    \"  1: 123\\n\"\n    \"}\\n\",\n    text);\n}\n\nTEST_F(TextFormatTest, PrintMessageWithIndent) {\n  // Test adding an initial indent to printing.\n\n  protobuf_unittest::TestAllTypes message;\n\n  message.add_repeated_string(\"abc\");\n  message.add_repeated_string(\"def\");\n  message.add_repeated_nested_message()->set_bb(123);\n\n  string text;\n  TextFormat::Printer printer;\n  printer.SetInitialIndentLevel(1);\n  EXPECT_TRUE(printer.PrintToString(message, &text));\n  EXPECT_EQ(\n    \"  repeated_string: \\\"abc\\\"\\n\"\n    \"  repeated_string: \\\"def\\\"\\n\"\n    \"  repeated_nested_message {\\n\"\n    \"    bb: 123\\n\"\n    \"  }\\n\",\n    text);\n}\n\nTEST_F(TextFormatTest, PrintMessageSingleLine) {\n  // Test printing a message on a single line.\n\n  protobuf_unittest::TestAllTypes message;\n\n  message.add_repeated_string(\"abc\");\n  message.add_repeated_string(\"def\");\n  message.add_repeated_nested_message()->set_bb(123);\n\n  string text;\n  TextFormat::Printer printer;\n  printer.SetInitialIndentLevel(1);\n  printer.SetSingleLineMode(true);\n  EXPECT_TRUE(printer.PrintToString(message, &text));\n  EXPECT_EQ(\n    \"  repeated_string: \\\"abc\\\" repeated_string: \\\"def\\\" \"\n    \"repeated_nested_message { bb: 123 } \",\n    text);\n}\n\nTEST_F(TextFormatTest, ParseBasic) {\n  io::ArrayInputStream input_stream(proto_debug_string_.data(),\n                                    proto_debug_string_.size());\n  TextFormat::Parse(&input_stream, &proto_);\n  TestUtil::ExpectAllFieldsSet(proto_);\n}\n\nTEST_F(TextFormatExtensionsTest, ParseExtensions) {\n  io::ArrayInputStream input_stream(proto_debug_string_.data(),\n                                    proto_debug_string_.size());\n  TextFormat::Parse(&input_stream, &proto_);\n  TestUtil::ExpectAllExtensionsSet(proto_);\n}\n\nTEST_F(TextFormatTest, ParseEnumFieldFromNumber) {\n  // Create a parse string with a numerical value for an enum field.\n  string parse_string = strings::Substitute(\"optional_nested_enum: $0\",\n                                            unittest::TestAllTypes::BAZ);\n  EXPECT_TRUE(TextFormat::ParseFromString(parse_string, &proto_));\n  EXPECT_TRUE(proto_.has_optional_nested_enum());\n  EXPECT_EQ(unittest::TestAllTypes::BAZ, proto_.optional_nested_enum());\n}\n\nTEST_F(TextFormatTest, ParseEnumFieldFromNegativeNumber) {\n  ASSERT_LT(unittest::SPARSE_E, 0);\n  string parse_string = strings::Substitute(\"sparse_enum: $0\",\n                                            unittest::SPARSE_E);\n  unittest::SparseEnumMessage proto;\n  EXPECT_TRUE(TextFormat::ParseFromString(parse_string, &proto));\n  EXPECT_TRUE(proto.has_sparse_enum());\n  EXPECT_EQ(unittest::SPARSE_E, proto.sparse_enum());\n}\n\nTEST_F(TextFormatTest, ParseStringEscape) {\n  // Create a parse string with escpaed characters in it.\n  string parse_string = \"optional_string: \"\n      + kEscapeTestStringEscaped\n      + \"\\n\";\n\n  io::ArrayInputStream input_stream(parse_string.data(),\n                                    parse_string.size());\n  TextFormat::Parse(&input_stream, &proto_);\n\n  // Compare.\n  EXPECT_EQ(kEscapeTestString, proto_.optional_string());\n}\n\nTEST_F(TextFormatTest, ParseConcatenatedString) {\n  // Create a parse string with multiple parts on one line.\n  string parse_string = \"optional_string: \\\"foo\\\" \\\"bar\\\"\\n\";\n\n  io::ArrayInputStream input_stream1(parse_string.data(),\n                                    parse_string.size());\n  TextFormat::Parse(&input_stream1, &proto_);\n\n  // Compare.\n  EXPECT_EQ(\"foobar\", proto_.optional_string());\n\n  // Create a parse string with multiple parts on seperate lines.\n  parse_string = \"optional_string: \\\"foo\\\"\\n\"\n                 \"\\\"bar\\\"\\n\";\n\n  io::ArrayInputStream input_stream2(parse_string.data(),\n                                    parse_string.size());\n  TextFormat::Parse(&input_stream2, &proto_);\n\n  // Compare.\n  EXPECT_EQ(\"foobar\", proto_.optional_string());\n}\n\nTEST_F(TextFormatTest, ParseFloatWithSuffix) {\n  // Test that we can parse a floating-point value with 'f' appended to the\n  // end.  This is needed for backwards-compatibility with proto1.\n\n  // Have it parse a float with the 'f' suffix.\n  string parse_string = \"optional_float: 1.0f\\n\";\n\n  io::ArrayInputStream input_stream(parse_string.data(),\n                                    parse_string.size());\n\n  TextFormat::Parse(&input_stream, &proto_);\n\n  // Compare.\n  EXPECT_EQ(1.0, proto_.optional_float());\n}\n\nTEST_F(TextFormatTest, ParseShortRepeatedForm) {\n  string parse_string =\n      // Mixed short-form and long-form are simply concatenated.\n      \"repeated_int32: 1\\n\"\n      \"repeated_int32: [456, 789]\\n\"\n      \"repeated_nested_enum: [  FOO ,BAR, # comment\\n\"\n      \"                         3]\\n\"\n      // Note that while the printer won't print repeated strings in short-form,\n      // the parser will accept them.\n      \"repeated_string: [ \\\"foo\\\", 'bar' ]\\n\";\n\n  ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &proto_));\n\n  ASSERT_EQ(3, proto_.repeated_int32_size());\n  EXPECT_EQ(1, proto_.repeated_int32(0));\n  EXPECT_EQ(456, proto_.repeated_int32(1));\n  EXPECT_EQ(789, proto_.repeated_int32(2));\n\n  ASSERT_EQ(3, proto_.repeated_nested_enum_size());\n  EXPECT_EQ(unittest::TestAllTypes::FOO, proto_.repeated_nested_enum(0));\n  EXPECT_EQ(unittest::TestAllTypes::BAR, proto_.repeated_nested_enum(1));\n  EXPECT_EQ(unittest::TestAllTypes::BAZ, proto_.repeated_nested_enum(2));\n\n  ASSERT_EQ(2, proto_.repeated_string_size());\n  EXPECT_EQ(\"foo\", proto_.repeated_string(0));\n  EXPECT_EQ(\"bar\", proto_.repeated_string(1));\n}\n\nTEST_F(TextFormatTest, Comments) {\n  // Test that comments are ignored.\n\n  string parse_string = \"optional_int32: 1  # a comment\\n\"\n                        \"optional_int64: 2  # another comment\";\n\n  io::ArrayInputStream input_stream(parse_string.data(),\n                                    parse_string.size());\n\n  TextFormat::Parse(&input_stream, &proto_);\n\n  // Compare.\n  EXPECT_EQ(1, proto_.optional_int32());\n  EXPECT_EQ(2, proto_.optional_int64());\n}\n\nTEST_F(TextFormatTest, OptionalColon) {\n  // Test that we can place a ':' after the field name of a nested message,\n  // even though we don't have to.\n\n  string parse_string = \"optional_nested_message: { bb: 1}\\n\";\n\n  io::ArrayInputStream input_stream(parse_string.data(),\n                                    parse_string.size());\n\n  TextFormat::Parse(&input_stream, &proto_);\n\n  // Compare.\n  EXPECT_TRUE(proto_.has_optional_nested_message());\n  EXPECT_EQ(1, proto_.optional_nested_message().bb());\n}\n\n// Some platforms (e.g. Windows) insist on padding the exponent to three\n// digits when one or two would be just fine.\nstatic string RemoveRedundantZeros(string text) {\n  text = StringReplace(text, \"e+0\", \"e+\", true);\n  text = StringReplace(text, \"e-0\", \"e-\", true);\n  return text;\n}\n\nTEST_F(TextFormatTest, PrintExotic) {\n  unittest::TestAllTypes message;\n\n  // Note:  In C, a negative integer literal is actually the unary negation\n  //   operator being applied to a positive integer literal, and\n  //   9223372036854775808 is outside the range of int64.  However, it is not\n  //   outside the range of uint64.  Confusingly, this means that everything\n  //   works if we make the literal unsigned, even though we are negating it.\n  message.add_repeated_int64(-GOOGLE_ULONGLONG(9223372036854775808));\n  message.add_repeated_uint64(GOOGLE_ULONGLONG(18446744073709551615));\n  message.add_repeated_double(123.456);\n  message.add_repeated_double(1.23e21);\n  message.add_repeated_double(1.23e-18);\n  message.add_repeated_double(std::numeric_limits<double>::infinity());\n  message.add_repeated_double(-std::numeric_limits<double>::infinity());\n  message.add_repeated_double(std::numeric_limits<double>::quiet_NaN());\n  message.add_repeated_string(string(\"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"\", 12));\n\n  // Fun story:  We used to use 1.23e22 instead of 1.23e21 above, but this\n  //   seemed to trigger an odd case on MinGW/GCC 3.4.5 where GCC's parsing of\n  //   the value differed from strtod()'s parsing.  That is to say, the\n  //   following assertion fails on MinGW:\n  //     assert(1.23e22 == strtod(\"1.23e22\", NULL));\n  //   As a result, SimpleDtoa() would print the value as\n  //   \"1.2300000000000001e+22\" to make sure strtod() produce the exact same\n  //   result.  Our goal is to test runtime parsing, not compile-time parsing,\n  //   so this wasn't our problem.  It was found that using 1.23e21 did not\n  //   have this problem, so we switched to that instead.\n\n  EXPECT_EQ(\n    \"repeated_int64: -9223372036854775808\\n\"\n    \"repeated_uint64: 18446744073709551615\\n\"\n    \"repeated_double: 123.456\\n\"\n    \"repeated_double: 1.23e+21\\n\"\n    \"repeated_double: 1.23e-18\\n\"\n    \"repeated_double: inf\\n\"\n    \"repeated_double: -inf\\n\"\n    \"repeated_double: nan\\n\"\n    \"repeated_string: \\\"\\\\000\\\\001\\\\007\\\\010\\\\014\\\\n\\\\r\\\\t\\\\013\\\\\\\\\\\\'\\\\\\\"\\\"\\n\",\n    RemoveRedundantZeros(message.DebugString()));\n}\n\nTEST_F(TextFormatTest, PrintFloatPrecision) {\n  unittest::TestAllTypes message;\n\n  message.add_repeated_float(1.2);\n  message.add_repeated_float(1.23);\n  message.add_repeated_float(1.234);\n  message.add_repeated_float(1.2345);\n  message.add_repeated_float(1.23456);\n  message.add_repeated_float(1.2e10);\n  message.add_repeated_float(1.23e10);\n  message.add_repeated_float(1.234e10);\n  message.add_repeated_float(1.2345e10);\n  message.add_repeated_float(1.23456e10);\n  message.add_repeated_double(1.2);\n  message.add_repeated_double(1.23);\n  message.add_repeated_double(1.234);\n  message.add_repeated_double(1.2345);\n  message.add_repeated_double(1.23456);\n  message.add_repeated_double(1.234567);\n  message.add_repeated_double(1.2345678);\n  message.add_repeated_double(1.23456789);\n  message.add_repeated_double(1.234567898);\n  message.add_repeated_double(1.2345678987);\n  message.add_repeated_double(1.23456789876);\n  message.add_repeated_double(1.234567898765);\n  message.add_repeated_double(1.2345678987654);\n  message.add_repeated_double(1.23456789876543);\n  message.add_repeated_double(1.2e100);\n  message.add_repeated_double(1.23e100);\n  message.add_repeated_double(1.234e100);\n  message.add_repeated_double(1.2345e100);\n  message.add_repeated_double(1.23456e100);\n  message.add_repeated_double(1.234567e100);\n  message.add_repeated_double(1.2345678e100);\n  message.add_repeated_double(1.23456789e100);\n  message.add_repeated_double(1.234567898e100);\n  message.add_repeated_double(1.2345678987e100);\n  message.add_repeated_double(1.23456789876e100);\n  message.add_repeated_double(1.234567898765e100);\n  message.add_repeated_double(1.2345678987654e100);\n  message.add_repeated_double(1.23456789876543e100);\n\n  EXPECT_EQ(\n    \"repeated_float: 1.2\\n\"\n    \"repeated_float: 1.23\\n\"\n    \"repeated_float: 1.234\\n\"\n    \"repeated_float: 1.2345\\n\"\n    \"repeated_float: 1.23456\\n\"\n    \"repeated_float: 1.2e+10\\n\"\n    \"repeated_float: 1.23e+10\\n\"\n    \"repeated_float: 1.234e+10\\n\"\n    \"repeated_float: 1.2345e+10\\n\"\n    \"repeated_float: 1.23456e+10\\n\"\n    \"repeated_double: 1.2\\n\"\n    \"repeated_double: 1.23\\n\"\n    \"repeated_double: 1.234\\n\"\n    \"repeated_double: 1.2345\\n\"\n    \"repeated_double: 1.23456\\n\"\n    \"repeated_double: 1.234567\\n\"\n    \"repeated_double: 1.2345678\\n\"\n    \"repeated_double: 1.23456789\\n\"\n    \"repeated_double: 1.234567898\\n\"\n    \"repeated_double: 1.2345678987\\n\"\n    \"repeated_double: 1.23456789876\\n\"\n    \"repeated_double: 1.234567898765\\n\"\n    \"repeated_double: 1.2345678987654\\n\"\n    \"repeated_double: 1.23456789876543\\n\"\n    \"repeated_double: 1.2e+100\\n\"\n    \"repeated_double: 1.23e+100\\n\"\n    \"repeated_double: 1.234e+100\\n\"\n    \"repeated_double: 1.2345e+100\\n\"\n    \"repeated_double: 1.23456e+100\\n\"\n    \"repeated_double: 1.234567e+100\\n\"\n    \"repeated_double: 1.2345678e+100\\n\"\n    \"repeated_double: 1.23456789e+100\\n\"\n    \"repeated_double: 1.234567898e+100\\n\"\n    \"repeated_double: 1.2345678987e+100\\n\"\n    \"repeated_double: 1.23456789876e+100\\n\"\n    \"repeated_double: 1.234567898765e+100\\n\"\n    \"repeated_double: 1.2345678987654e+100\\n\"\n    \"repeated_double: 1.23456789876543e+100\\n\",\n    RemoveRedundantZeros(message.DebugString()));\n}\n\n\nTEST_F(TextFormatTest, AllowPartial) {\n  unittest::TestRequired message;\n  TextFormat::Parser parser;\n  parser.AllowPartialMessage(true);\n  EXPECT_TRUE(parser.ParseFromString(\"a: 1\", &message));\n  EXPECT_EQ(1, message.a());\n  EXPECT_FALSE(message.has_b());\n  EXPECT_FALSE(message.has_c());\n}\n\nTEST_F(TextFormatTest, ParseExotic) {\n  unittest::TestAllTypes message;\n  ASSERT_TRUE(TextFormat::ParseFromString(\n    \"repeated_int32: -1\\n\"\n    \"repeated_int32: -2147483648\\n\"\n    \"repeated_int64: -1\\n\"\n    \"repeated_int64: -9223372036854775808\\n\"\n    \"repeated_uint32: 4294967295\\n\"\n    \"repeated_uint32: 2147483648\\n\"\n    \"repeated_uint64: 18446744073709551615\\n\"\n    \"repeated_uint64: 9223372036854775808\\n\"\n    \"repeated_double: 123.0\\n\"\n    \"repeated_double: 123.5\\n\"\n    \"repeated_double: 0.125\\n\"\n    \"repeated_double: 1.23E17\\n\"\n    \"repeated_double: 1.235E+22\\n\"\n    \"repeated_double: 1.235e-18\\n\"\n    \"repeated_double: 123.456789\\n\"\n    \"repeated_double: inf\\n\"\n    \"repeated_double: Infinity\\n\"\n    \"repeated_double: -inf\\n\"\n    \"repeated_double: -Infinity\\n\"\n    \"repeated_double: nan\\n\"\n    \"repeated_double: NaN\\n\"\n    \"repeated_string: \\\"\\\\000\\\\001\\\\a\\\\b\\\\f\\\\n\\\\r\\\\t\\\\v\\\\\\\\\\\\'\\\\\\\"\\\"\\n\",\n    &message));\n\n  ASSERT_EQ(2, message.repeated_int32_size());\n  EXPECT_EQ(-1, message.repeated_int32(0));\n  // Note:  In C, a negative integer literal is actually the unary negation\n  //   operator being applied to a positive integer literal, and 2147483648 is\n  //   outside the range of int32.  However, it is not outside the range of\n  //   uint32.  Confusingly, this means that everything works if we make the\n  //   literal unsigned, even though we are negating it.\n  EXPECT_EQ(-2147483648u, message.repeated_int32(1));\n\n  ASSERT_EQ(2, message.repeated_int64_size());\n  EXPECT_EQ(-1, message.repeated_int64(0));\n  // Note:  In C, a negative integer literal is actually the unary negation\n  //   operator being applied to a positive integer literal, and\n  //   9223372036854775808 is outside the range of int64.  However, it is not\n  //   outside the range of uint64.  Confusingly, this means that everything\n  //   works if we make the literal unsigned, even though we are negating it.\n  EXPECT_EQ(-GOOGLE_ULONGLONG(9223372036854775808), message.repeated_int64(1));\n\n  ASSERT_EQ(2, message.repeated_uint32_size());\n  EXPECT_EQ(4294967295u, message.repeated_uint32(0));\n  EXPECT_EQ(2147483648u, message.repeated_uint32(1));\n\n  ASSERT_EQ(2, message.repeated_uint64_size());\n  EXPECT_EQ(GOOGLE_ULONGLONG(18446744073709551615), message.repeated_uint64(0));\n  EXPECT_EQ(GOOGLE_ULONGLONG(9223372036854775808), message.repeated_uint64(1));\n\n  ASSERT_EQ(13, message.repeated_double_size());\n  EXPECT_EQ(123.0     , message.repeated_double(0));\n  EXPECT_EQ(123.5     , message.repeated_double(1));\n  EXPECT_EQ(0.125     , message.repeated_double(2));\n  EXPECT_EQ(1.23E17   , message.repeated_double(3));\n  EXPECT_EQ(1.235E22  , message.repeated_double(4));\n  EXPECT_EQ(1.235E-18 , message.repeated_double(5));\n  EXPECT_EQ(123.456789, message.repeated_double(6));\n  EXPECT_EQ(message.repeated_double(7), numeric_limits<double>::infinity());\n  EXPECT_EQ(message.repeated_double(8), numeric_limits<double>::infinity());\n  EXPECT_EQ(message.repeated_double(9), -numeric_limits<double>::infinity());\n  EXPECT_EQ(message.repeated_double(10), -numeric_limits<double>::infinity());\n  EXPECT_TRUE(IsNaN(message.repeated_double(11)));\n  EXPECT_TRUE(IsNaN(message.repeated_double(12)));\n\n  // Note:  Since these string literals have \\0's in them, we must explicitly\n  //   pass their sizes to string's constructor.\n  ASSERT_EQ(1, message.repeated_string_size());\n  EXPECT_EQ(string(\"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"\", 12),\n            message.repeated_string(0));\n}\n\nclass TextFormatParserTest : public testing::Test {\n protected:\n  void ExpectFailure(const string& input, const string& message, int line,\n                     int col) {\n    scoped_ptr<unittest::TestAllTypes> proto(new unittest::TestAllTypes);\n    ExpectFailure(input, message, line, col, proto.get());\n  }\n\n  void ExpectFailure(const string& input, const string& message, int line,\n                     int col, Message* proto) {\n    ExpectMessage(input, message, line, col, proto, false);\n  }\n\n  void ExpectMessage(const string& input, const string& message, int line,\n                     int col, Message* proto, bool expected_result) {\n    TextFormat::Parser parser;\n    MockErrorCollector error_collector;\n    parser.RecordErrorsTo(&error_collector);\n    EXPECT_EQ(parser.ParseFromString(input, proto), expected_result);\n    EXPECT_EQ(SimpleItoa(line) + \":\" + SimpleItoa(col) + \": \" + message + \"\\n\",\n              error_collector.text_);\n  }\n\n  // An error collector which simply concatenates all its errors into a big\n  // block of text which can be checked.\n  class MockErrorCollector : public io::ErrorCollector {\n   public:\n    MockErrorCollector() {}\n    ~MockErrorCollector() {}\n\n    string text_;\n\n    // implements ErrorCollector -------------------------------------\n    void AddError(int line, int column, const string& message) {\n      strings::SubstituteAndAppend(&text_, \"$0:$1: $2\\n\",\n                                   line + 1, column + 1, message);\n    }\n\n    void AddWarning(int line, int column, const string& message) {\n      AddError(line, column, \"WARNING:\" + message);\n    }\n  };\n};\n\nTEST_F(TextFormatParserTest, ParseFieldValueFromString) {\n  scoped_ptr<unittest::TestAllTypes> message(new unittest::TestAllTypes);\n  const Descriptor* d = message->GetDescriptor();\n\n#define EXPECT_FIELD(name, value, valuestring) \\\n  EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \\\n    valuestring, d->FindFieldByName(\"optional_\" #name), message.get())); \\\n  EXPECT_EQ(value, message->optional_##name()); \\\n  EXPECT_TRUE(message->has_optional_##name());\n\n#define EXPECT_FLOAT_FIELD(name, value, valuestring) \\\n  EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \\\n    valuestring, d->FindFieldByName(\"optional_\" #name), message.get())); \\\n  EXPECT_FLOAT_EQ(value, message->optional_##name()); \\\n  EXPECT_TRUE(message->has_optional_##name());\n\n#define EXPECT_DOUBLE_FIELD(name, value, valuestring) \\\n  EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \\\n    valuestring, d->FindFieldByName(\"optional_\" #name), message.get())); \\\n  EXPECT_DOUBLE_EQ(value, message->optional_##name()); \\\n  EXPECT_TRUE(message->has_optional_##name());\n\n#define EXPECT_INVALID(name, valuestring) \\\n  EXPECT_FALSE(TextFormat::ParseFieldValueFromString( \\\n    valuestring, d->FindFieldByName(\"optional_\" #name), message.get()));\n\n  // int32\n  EXPECT_FIELD(int32, 1, \"1\");\n  EXPECT_FIELD(int32, -1, \"-1\");\n  EXPECT_FIELD(int32, 0x1234, \"0x1234\");\n  EXPECT_INVALID(int32, \"a\");\n  EXPECT_INVALID(int32, \"999999999999999999999999999999999999\");\n  EXPECT_INVALID(int32, \"1,2\");\n\n  // int64\n  EXPECT_FIELD(int64, 1, \"1\");\n  EXPECT_FIELD(int64, -1, \"-1\");\n  EXPECT_FIELD(int64, 0x1234567812345678LL, \"0x1234567812345678\");\n  EXPECT_INVALID(int64, \"a\");\n  EXPECT_INVALID(int64, \"999999999999999999999999999999999999\");\n  EXPECT_INVALID(int64, \"1,2\");\n\n  // uint64\n  EXPECT_FIELD(uint64, 1, \"1\");\n  EXPECT_FIELD(uint64, 0xf234567812345678ULL, \"0xf234567812345678\");\n  EXPECT_INVALID(uint64, \"-1\");\n  EXPECT_INVALID(uint64, \"a\");\n  EXPECT_INVALID(uint64, \"999999999999999999999999999999999999\");\n  EXPECT_INVALID(uint64, \"1,2\");\n\n  // fixed32\n  EXPECT_FIELD(fixed32, 1, \"1\");\n  EXPECT_FIELD(fixed32, 0x12345678, \"0x12345678\");\n  EXPECT_INVALID(fixed32, \"-1\");\n  EXPECT_INVALID(fixed32, \"a\");\n  EXPECT_INVALID(fixed32, \"999999999999999999999999999999999999\");\n  EXPECT_INVALID(fixed32, \"1,2\");\n\n  // fixed64\n  EXPECT_FIELD(fixed64, 1, \"1\");\n  EXPECT_FIELD(fixed64, 0x1234567812345678ULL, \"0x1234567812345678\");\n  EXPECT_INVALID(fixed64, \"-1\");\n  EXPECT_INVALID(fixed64, \"a\");\n  EXPECT_INVALID(fixed64, \"999999999999999999999999999999999999\");\n  EXPECT_INVALID(fixed64, \"1,2\");\n\n  // bool\n  EXPECT_FIELD(bool, true, \"true\");\n  EXPECT_FIELD(bool, false, \"false\");\n  EXPECT_FIELD(bool, true, \"1\");\n  EXPECT_FIELD(bool, true, \"t\");\n  EXPECT_FIELD(bool, false, \"0\");\n  EXPECT_FIELD(bool, false, \"f\");\n  EXPECT_INVALID(bool, \"2\");\n  EXPECT_INVALID(bool, \"-0\");\n  EXPECT_INVALID(bool, \"on\");\n  EXPECT_INVALID(bool, \"a\");\n  EXPECT_INVALID(bool, \"True\");\n\n  // float\n  EXPECT_FIELD(float, 1, \"1\");\n  EXPECT_FLOAT_FIELD(float, 1.5, \"1.5\");\n  EXPECT_FLOAT_FIELD(float, 1.5e3, \"1.5e3\");\n  EXPECT_FLOAT_FIELD(float, -4.55, \"-4.55\");\n  EXPECT_INVALID(float, \"a\");\n  EXPECT_INVALID(float, \"1,2\");\n\n  // double\n  EXPECT_FIELD(double, 1, \"1\");\n  EXPECT_FIELD(double, -1, \"-1\");\n  EXPECT_DOUBLE_FIELD(double, 2.3, \"2.3\");\n  EXPECT_DOUBLE_FIELD(double, 3e5, \"3e5\");\n  EXPECT_INVALID(double, \"a\");\n  EXPECT_INVALID(double, \"1,2\");\n\n  // string\n  EXPECT_FIELD(string, \"hello\", \"\\\"hello\\\"\");\n  EXPECT_FIELD(string, \"-1.87\", \"'-1.87'\");\n  EXPECT_INVALID(string, \"hello\");  // without quote for value\n\n  // enum\n  EXPECT_FIELD(nested_enum, unittest::TestAllTypes::BAR, \"BAR\");\n  EXPECT_FIELD(nested_enum, unittest::TestAllTypes::BAZ,\n               SimpleItoa(unittest::TestAllTypes::BAZ));\n  EXPECT_INVALID(nested_enum, \"FOOBAR\");\n\n  // message\n  EXPECT_TRUE(TextFormat::ParseFieldValueFromString(\n    \"<bb:12>\", d->FindFieldByName(\"optional_nested_message\"), message.get()));\n  EXPECT_EQ(12, message->optional_nested_message().bb()); \\\n  EXPECT_TRUE(message->has_optional_nested_message());\n  EXPECT_INVALID(nested_message, \"any\");\n\n#undef EXPECT_FIELD\n#undef EXPECT_FLOAT_FIELD\n#undef EXPECT_DOUBLE_FIELD\n#undef EXPECT_INVALID\n}\n\n\nTEST_F(TextFormatParserTest, InvalidToken) {\n  ExpectFailure(\"optional_bool: true\\n-5\\n\", \"Expected identifier.\",\n                2, 1);\n\n  ExpectFailure(\"optional_bool: true!\\n\", \"Expected identifier.\", 1, 20);\n  ExpectFailure(\"\\\"some string\\\"\", \"Expected identifier.\", 1, 1);\n}\n\nTEST_F(TextFormatParserTest, InvalidFieldName) {\n  ExpectFailure(\n      \"invalid_field: somevalue\\n\",\n      \"Message type \\\"protobuf_unittest.TestAllTypes\\\" has no field named \"\n      \"\\\"invalid_field\\\".\",\n      1, 14);\n}\n\nTEST_F(TextFormatParserTest, InvalidCapitalization) {\n  // We require that group names be exactly as they appear in the .proto.\n  ExpectFailure(\n      \"optionalgroup {\\na: 15\\n}\\n\",\n      \"Message type \\\"protobuf_unittest.TestAllTypes\\\" has no field named \"\n      \"\\\"optionalgroup\\\".\",\n      1, 15);\n  ExpectFailure(\n      \"OPTIONALgroup {\\na: 15\\n}\\n\",\n      \"Message type \\\"protobuf_unittest.TestAllTypes\\\" has no field named \"\n      \"\\\"OPTIONALgroup\\\".\",\n      1, 15);\n  ExpectFailure(\n      \"Optional_Double: 10.0\\n\",\n      \"Message type \\\"protobuf_unittest.TestAllTypes\\\" has no field named \"\n      \"\\\"Optional_Double\\\".\",\n      1, 16);\n}\n\nTEST_F(TextFormatParserTest, InvalidFieldValues) {\n  // Invalid values for a double/float field.\n  ExpectFailure(\"optional_double: \\\"hello\\\"\\n\", \"Expected double.\", 1, 18);\n  ExpectFailure(\"optional_double: true\\n\", \"Expected double.\", 1, 18);\n  ExpectFailure(\"optional_double: !\\n\", \"Expected double.\", 1, 18);\n  ExpectFailure(\"optional_double {\\n  \\n}\\n\", \"Expected \\\":\\\", found \\\"{\\\".\",\n                1, 17);\n\n  // Invalid values for a signed integer field.\n  ExpectFailure(\"optional_int32: \\\"hello\\\"\\n\", \"Expected integer.\", 1, 17);\n  ExpectFailure(\"optional_int32: true\\n\", \"Expected integer.\", 1, 17);\n  ExpectFailure(\"optional_int32: 4.5\\n\", \"Expected integer.\", 1, 17);\n  ExpectFailure(\"optional_int32: !\\n\", \"Expected integer.\", 1, 17);\n  ExpectFailure(\"optional_int32 {\\n \\n}\\n\", \"Expected \\\":\\\", found \\\"{\\\".\",\n                1, 16);\n  ExpectFailure(\"optional_int32: 0x80000000\\n\",\n                \"Integer out of range.\", 1, 17);\n  ExpectFailure(\"optional_int32: -0x80000001\\n\",\n                \"Integer out of range.\", 1, 18);\n  ExpectFailure(\"optional_int64: 0x8000000000000000\\n\",\n                \"Integer out of range.\", 1, 17);\n  ExpectFailure(\"optional_int64: -0x8000000000000001\\n\",\n                \"Integer out of range.\", 1, 18);\n\n  // Invalid values for an unsigned integer field.\n  ExpectFailure(\"optional_uint64: \\\"hello\\\"\\n\", \"Expected integer.\", 1, 18);\n  ExpectFailure(\"optional_uint64: true\\n\", \"Expected integer.\", 1, 18);\n  ExpectFailure(\"optional_uint64: 4.5\\n\", \"Expected integer.\", 1, 18);\n  ExpectFailure(\"optional_uint64: -5\\n\", \"Expected integer.\", 1, 18);\n  ExpectFailure(\"optional_uint64: !\\n\", \"Expected integer.\", 1, 18);\n  ExpectFailure(\"optional_uint64 {\\n \\n}\\n\", \"Expected \\\":\\\", found \\\"{\\\".\",\n                1, 17);\n  ExpectFailure(\"optional_uint32: 0x100000000\\n\",\n                \"Integer out of range.\", 1, 18);\n  ExpectFailure(\"optional_uint64: 0x10000000000000000\\n\",\n                \"Integer out of range.\", 1, 18);\n\n  // Invalid values for a boolean field.\n  ExpectFailure(\"optional_bool: \\\"hello\\\"\\n\", \"Expected identifier.\", 1, 16);\n  ExpectFailure(\"optional_bool: 5\\n\", \"Integer out of range.\", 1, 16);\n  ExpectFailure(\"optional_bool: -7.5\\n\", \"Expected identifier.\", 1, 16);\n  ExpectFailure(\"optional_bool: !\\n\", \"Expected identifier.\", 1, 16);\n\n  ExpectFailure(\n      \"optional_bool: meh\\n\",\n      \"Invalid value for boolean field \\\"optional_bool\\\". Value: \\\"meh\\\".\",\n      2, 1);\n\n  ExpectFailure(\"optional_bool {\\n \\n}\\n\", \"Expected \\\":\\\", found \\\"{\\\".\",\n                1, 15);\n\n  // Invalid values for a string field.\n  ExpectFailure(\"optional_string: true\\n\", \"Expected string.\", 1, 18);\n  ExpectFailure(\"optional_string: 5\\n\", \"Expected string.\", 1, 18);\n  ExpectFailure(\"optional_string: -7.5\\n\", \"Expected string.\", 1, 18);\n  ExpectFailure(\"optional_string: !\\n\", \"Expected string.\", 1, 18);\n  ExpectFailure(\"optional_string {\\n \\n}\\n\", \"Expected \\\":\\\", found \\\"{\\\".\",\n                1, 17);\n\n  // Invalid values for an enumeration field.\n  ExpectFailure(\"optional_nested_enum: \\\"hello\\\"\\n\",\n                \"Expected integer or identifier.\", 1, 23);\n\n  // Valid token, but enum value is not defined.\n  ExpectFailure(\"optional_nested_enum: 5\\n\",\n                \"Unknown enumeration value of \\\"5\\\" for field \"\n                \"\\\"optional_nested_enum\\\".\", 2, 1);\n  // We consume the negative sign, so the error position starts one character\n  // later.\n  ExpectFailure(\"optional_nested_enum: -7.5\\n\", \"Expected integer.\", 1, 24);\n  ExpectFailure(\"optional_nested_enum: !\\n\",\n                \"Expected integer or identifier.\", 1, 23);\n\n  ExpectFailure(\n      \"optional_nested_enum: grah\\n\",\n      \"Unknown enumeration value of \\\"grah\\\" for field \"\n      \"\\\"optional_nested_enum\\\".\", 2, 1);\n\n  ExpectFailure(\n      \"optional_nested_enum {\\n \\n}\\n\",\n      \"Expected \\\":\\\", found \\\"{\\\".\", 1, 22);\n}\n\nTEST_F(TextFormatParserTest, MessageDelimeters) {\n  // Non-matching delimeters.\n  ExpectFailure(\"OptionalGroup <\\n \\n}\\n\", \"Expected \\\">\\\", found \\\"}\\\".\",\n                3, 1);\n\n  // Invalid delimeters.\n  ExpectFailure(\"OptionalGroup [\\n \\n]\\n\", \"Expected \\\"{\\\", found \\\"[\\\".\",\n                1, 15);\n\n  // Unending message.\n  ExpectFailure(\"optional_nested_message {\\n \\nbb: 118\\n\",\n                \"Expected identifier.\",\n                4, 1);\n}\n\nTEST_F(TextFormatParserTest, UnknownExtension) {\n  // Non-matching delimeters.\n  ExpectFailure(\"[blahblah]: 123\",\n                \"Extension \\\"blahblah\\\" is not defined or is not an \"\n                \"extension of \\\"protobuf_unittest.TestAllTypes\\\".\",\n                1, 11);\n}\n\nTEST_F(TextFormatParserTest, MissingRequired) {\n  unittest::TestRequired message;\n  ExpectFailure(\"a: 1\",\n                \"Message missing required fields: b, c\",\n                0, 1, &message);\n}\n\nTEST_F(TextFormatParserTest, ParseDuplicateRequired) {\n  unittest::TestRequired message;\n  ExpectFailure(\"a: 1 b: 2 c: 3 a: 1\",\n                \"Non-repeated field \\\"a\\\" is specified multiple times.\",\n                1, 17, &message);\n}\n\nTEST_F(TextFormatParserTest, ParseDuplicateOptional) {\n  unittest::ForeignMessage message;\n  ExpectFailure(\"c: 1 c: 2\",\n                \"Non-repeated field \\\"c\\\" is specified multiple times.\",\n                1, 7, &message);\n}\n\nTEST_F(TextFormatParserTest, MergeDuplicateRequired) {\n  unittest::TestRequired message;\n  TextFormat::Parser parser;\n  EXPECT_TRUE(parser.MergeFromString(\"a: 1 b: 2 c: 3 a: 4\", &message));\n  EXPECT_EQ(4, message.a());\n}\n\nTEST_F(TextFormatParserTest, MergeDuplicateOptional) {\n  unittest::ForeignMessage message;\n  TextFormat::Parser parser;\n  EXPECT_TRUE(parser.MergeFromString(\"c: 1 c: 2\", &message));\n  EXPECT_EQ(2, message.c());\n}\n\nTEST_F(TextFormatParserTest, ExplicitDelimiters) {\n  unittest::TestRequired message;\n  EXPECT_TRUE(TextFormat::ParseFromString(\"a:1,b:2;c:3\", &message));\n  EXPECT_EQ(1, message.a());\n  EXPECT_EQ(2, message.b());\n  EXPECT_EQ(3, message.c());\n}\n\nTEST_F(TextFormatParserTest, PrintErrorsToStderr) {\n  vector<string> errors;\n\n  {\n    ScopedMemoryLog log;\n    unittest::TestAllTypes proto;\n    EXPECT_FALSE(TextFormat::ParseFromString(\"no_such_field: 1\", &proto));\n    errors = log.GetMessages(ERROR);\n  }\n\n  ASSERT_EQ(1, errors.size());\n  EXPECT_EQ(\"Error parsing text-format protobuf_unittest.TestAllTypes: \"\n            \"1:14: Message type \\\"protobuf_unittest.TestAllTypes\\\" has no field \"\n            \"named \\\"no_such_field\\\".\",\n            errors[0]);\n}\n\nTEST_F(TextFormatParserTest, FailsOnTokenizationError) {\n  vector<string> errors;\n\n  {\n    ScopedMemoryLog log;\n    unittest::TestAllTypes proto;\n    EXPECT_FALSE(TextFormat::ParseFromString(\"\\020\", &proto));\n    errors = log.GetMessages(ERROR);\n  }\n\n  ASSERT_EQ(1, errors.size());\n  EXPECT_EQ(\"Error parsing text-format protobuf_unittest.TestAllTypes: \"\n            \"1:1: Invalid control characters encountered in text.\",\n            errors[0]);\n}\n\nTEST_F(TextFormatParserTest, ParseDeprecatedField) {\n  unittest::TestDeprecatedFields message;\n  ExpectMessage(\"deprecated_int32: 42\",\n                \"WARNING:text format contains deprecated field \"\n                \"\\\"deprecated_int32\\\"\", 1, 21, &message, true);\n}\n\nclass TextFormatMessageSetTest : public testing::Test {\n protected:\n  static const char proto_debug_string_[];\n};\nconst char TextFormatMessageSetTest::proto_debug_string_[] =\n\"message_set {\\n\"\n\"  [protobuf_unittest.TestMessageSetExtension1] {\\n\"\n\"    i: 23\\n\"\n\"  }\\n\"\n\"  [protobuf_unittest.TestMessageSetExtension2] {\\n\"\n\"    str: \\\"foo\\\"\\n\"\n\"  }\\n\"\n\"}\\n\";\n\n\nTEST_F(TextFormatMessageSetTest, Serialize) {\n  protobuf_unittest::TestMessageSetContainer proto;\n  protobuf_unittest::TestMessageSetExtension1* item_a =\n    proto.mutable_message_set()->MutableExtension(\n      protobuf_unittest::TestMessageSetExtension1::message_set_extension);\n  item_a->set_i(23);\n  protobuf_unittest::TestMessageSetExtension2* item_b =\n    proto.mutable_message_set()->MutableExtension(\n      protobuf_unittest::TestMessageSetExtension2::message_set_extension);\n  item_b->set_str(\"foo\");\n  EXPECT_EQ(proto_debug_string_, proto.DebugString());\n}\n\nTEST_F(TextFormatMessageSetTest, Deserialize) {\n  protobuf_unittest::TestMessageSetContainer proto;\n  ASSERT_TRUE(TextFormat::ParseFromString(proto_debug_string_, &proto));\n  EXPECT_EQ(23, proto.message_set().GetExtension(\n    protobuf_unittest::TestMessageSetExtension1::message_set_extension).i());\n  EXPECT_EQ(\"foo\", proto.message_set().GetExtension(\n    protobuf_unittest::TestMessageSetExtension2::message_set_extension).str());\n\n  // Ensure that these are the only entries present.\n  vector<const FieldDescriptor*> descriptors;\n  proto.message_set().GetReflection()->ListFields(\n    proto.message_set(), &descriptors);\n  EXPECT_EQ(2, descriptors.size());\n}\n\n}  // namespace text_format_unittest\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// A proto file we will use for unit testing.\n\n\n// Some generic_services option(s) added automatically.\n// See:  http://go/proto2-generic-services-default\noption cc_generic_services = true;     // auto-added\noption java_generic_services = true;   // auto-added\noption py_generic_services = true;     // auto-added\n\nimport \"google/protobuf/unittest_import.proto\";\n\n// We don't put this in a package within proto2 because we need to make sure\n// that the generated code doesn't depend on being in the proto2 namespace.\n// In test_util.h we do \"using namespace unittest = protobuf_unittest\".\npackage protobuf_unittest;\n\n// Protos optimized for SPEED use a strict superset of the generated code\n// of equivalent ones optimized for CODE_SIZE, so we should optimize all our\n// tests for speed unless explicitly testing code size optimization.\noption optimize_for = SPEED;\n\noption java_outer_classname = \"UnittestProto\";\n\n// This proto includes every type of field in both singular and repeated\n// forms.\nmessage TestAllTypes {\n  message NestedMessage {\n    // The field name \"b\" fails to compile in proto1 because it conflicts with\n    // a local variable named \"b\" in one of the generated methods.  Doh.\n    // This file needs to compile in proto1 to test backwards-compatibility.\n    optional int32 bb = 1;\n  }\n\n  enum NestedEnum {\n    FOO = 1;\n    BAR = 2;\n    BAZ = 3;\n  }\n\n  // Singular\n  optional    int32 optional_int32    =  1;\n  optional    int64 optional_int64    =  2;\n  optional   uint32 optional_uint32   =  3;\n  optional   uint64 optional_uint64   =  4;\n  optional   sint32 optional_sint32   =  5;\n  optional   sint64 optional_sint64   =  6;\n  optional  fixed32 optional_fixed32  =  7;\n  optional  fixed64 optional_fixed64  =  8;\n  optional sfixed32 optional_sfixed32 =  9;\n  optional sfixed64 optional_sfixed64 = 10;\n  optional    float optional_float    = 11;\n  optional   double optional_double   = 12;\n  optional     bool optional_bool     = 13;\n  optional   string optional_string   = 14;\n  optional    bytes optional_bytes    = 15;\n\n  optional group OptionalGroup = 16 {\n    optional int32 a = 17;\n  }\n\n  optional NestedMessage                        optional_nested_message  = 18;\n  optional ForeignMessage                       optional_foreign_message = 19;\n  optional protobuf_unittest_import.ImportMessage optional_import_message  = 20;\n\n  optional NestedEnum                           optional_nested_enum     = 21;\n  optional ForeignEnum                          optional_foreign_enum    = 22;\n  optional protobuf_unittest_import.ImportEnum    optional_import_enum     = 23;\n\n  optional string optional_string_piece = 24 [ctype=STRING_PIECE];\n  optional string optional_cord = 25 [ctype=CORD];\n\n  // Repeated\n  repeated    int32 repeated_int32    = 31;\n  repeated    int64 repeated_int64    = 32;\n  repeated   uint32 repeated_uint32   = 33;\n  repeated   uint64 repeated_uint64   = 34;\n  repeated   sint32 repeated_sint32   = 35;\n  repeated   sint64 repeated_sint64   = 36;\n  repeated  fixed32 repeated_fixed32  = 37;\n  repeated  fixed64 repeated_fixed64  = 38;\n  repeated sfixed32 repeated_sfixed32 = 39;\n  repeated sfixed64 repeated_sfixed64 = 40;\n  repeated    float repeated_float    = 41;\n  repeated   double repeated_double   = 42;\n  repeated     bool repeated_bool     = 43;\n  repeated   string repeated_string   = 44;\n  repeated    bytes repeated_bytes    = 45;\n\n  repeated group RepeatedGroup = 46 {\n    optional int32 a = 47;\n  }\n\n  repeated NestedMessage                        repeated_nested_message  = 48;\n  repeated ForeignMessage                       repeated_foreign_message = 49;\n  repeated protobuf_unittest_import.ImportMessage repeated_import_message  = 50;\n\n  repeated NestedEnum                           repeated_nested_enum     = 51;\n  repeated ForeignEnum                          repeated_foreign_enum    = 52;\n  repeated protobuf_unittest_import.ImportEnum    repeated_import_enum     = 53;\n\n  repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];\n  repeated string repeated_cord = 55 [ctype=CORD];\n\n  // Singular with defaults\n  optional    int32 default_int32    = 61 [default =  41    ];\n  optional    int64 default_int64    = 62 [default =  42    ];\n  optional   uint32 default_uint32   = 63 [default =  43    ];\n  optional   uint64 default_uint64   = 64 [default =  44    ];\n  optional   sint32 default_sint32   = 65 [default = -45    ];\n  optional   sint64 default_sint64   = 66 [default =  46    ];\n  optional  fixed32 default_fixed32  = 67 [default =  47    ];\n  optional  fixed64 default_fixed64  = 68 [default =  48    ];\n  optional sfixed32 default_sfixed32 = 69 [default =  49    ];\n  optional sfixed64 default_sfixed64 = 70 [default = -50    ];\n  optional    float default_float    = 71 [default =  51.5  ];\n  optional   double default_double   = 72 [default =  52e3  ];\n  optional     bool default_bool     = 73 [default = true   ];\n  optional   string default_string   = 74 [default = \"hello\"];\n  optional    bytes default_bytes    = 75 [default = \"world\"];\n\n  optional NestedEnum  default_nested_enum  = 81 [default = BAR        ];\n  optional ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR];\n  optional protobuf_unittest_import.ImportEnum\n      default_import_enum = 83 [default = IMPORT_BAR];\n\n  optional string default_string_piece = 84 [ctype=STRING_PIECE,default=\"abc\"];\n  optional string default_cord = 85 [ctype=CORD,default=\"123\"];\n}\n\nmessage TestDeprecatedFields {\n  optional int32 deprecated_int32 = 1 [deprecated=true];\n}\n\n// Define these after TestAllTypes to make sure the compiler can handle\n// that.\nmessage ForeignMessage {\n  optional int32 c = 1;\n}\n\nenum ForeignEnum {\n  FOREIGN_FOO = 4;\n  FOREIGN_BAR = 5;\n  FOREIGN_BAZ = 6;\n}\n\nmessage TestAllExtensions {\n  extensions 1 to max;\n}\n\nextend TestAllExtensions {\n  // Singular\n  optional    int32 optional_int32_extension    =  1;\n  optional    int64 optional_int64_extension    =  2;\n  optional   uint32 optional_uint32_extension   =  3;\n  optional   uint64 optional_uint64_extension   =  4;\n  optional   sint32 optional_sint32_extension   =  5;\n  optional   sint64 optional_sint64_extension   =  6;\n  optional  fixed32 optional_fixed32_extension  =  7;\n  optional  fixed64 optional_fixed64_extension  =  8;\n  optional sfixed32 optional_sfixed32_extension =  9;\n  optional sfixed64 optional_sfixed64_extension = 10;\n  optional    float optional_float_extension    = 11;\n  optional   double optional_double_extension   = 12;\n  optional     bool optional_bool_extension     = 13;\n  optional   string optional_string_extension   = 14;\n  optional    bytes optional_bytes_extension    = 15;\n\n  optional group OptionalGroup_extension = 16 {\n    optional int32 a = 17;\n  }\n\n  optional TestAllTypes.NestedMessage optional_nested_message_extension = 18;\n  optional ForeignMessage optional_foreign_message_extension = 19;\n  optional protobuf_unittest_import.ImportMessage\n    optional_import_message_extension = 20;\n\n  optional TestAllTypes.NestedEnum optional_nested_enum_extension = 21;\n  optional ForeignEnum optional_foreign_enum_extension = 22;\n  optional protobuf_unittest_import.ImportEnum\n    optional_import_enum_extension = 23;\n\n  optional string optional_string_piece_extension = 24 [ctype=STRING_PIECE];\n  optional string optional_cord_extension = 25 [ctype=CORD];\n\n  // Repeated\n  repeated    int32 repeated_int32_extension    = 31;\n  repeated    int64 repeated_int64_extension    = 32;\n  repeated   uint32 repeated_uint32_extension   = 33;\n  repeated   uint64 repeated_uint64_extension   = 34;\n  repeated   sint32 repeated_sint32_extension   = 35;\n  repeated   sint64 repeated_sint64_extension   = 36;\n  repeated  fixed32 repeated_fixed32_extension  = 37;\n  repeated  fixed64 repeated_fixed64_extension  = 38;\n  repeated sfixed32 repeated_sfixed32_extension = 39;\n  repeated sfixed64 repeated_sfixed64_extension = 40;\n  repeated    float repeated_float_extension    = 41;\n  repeated   double repeated_double_extension   = 42;\n  repeated     bool repeated_bool_extension     = 43;\n  repeated   string repeated_string_extension   = 44;\n  repeated    bytes repeated_bytes_extension    = 45;\n\n  repeated group RepeatedGroup_extension = 46 {\n    optional int32 a = 47;\n  }\n\n  repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 48;\n  repeated ForeignMessage repeated_foreign_message_extension = 49;\n  repeated protobuf_unittest_import.ImportMessage\n    repeated_import_message_extension = 50;\n\n  repeated TestAllTypes.NestedEnum repeated_nested_enum_extension = 51;\n  repeated ForeignEnum repeated_foreign_enum_extension = 52;\n  repeated protobuf_unittest_import.ImportEnum\n    repeated_import_enum_extension = 53;\n\n  repeated string repeated_string_piece_extension = 54 [ctype=STRING_PIECE];\n  repeated string repeated_cord_extension = 55 [ctype=CORD];\n\n  // Singular with defaults\n  optional    int32 default_int32_extension    = 61 [default =  41    ];\n  optional    int64 default_int64_extension    = 62 [default =  42    ];\n  optional   uint32 default_uint32_extension   = 63 [default =  43    ];\n  optional   uint64 default_uint64_extension   = 64 [default =  44    ];\n  optional   sint32 default_sint32_extension   = 65 [default = -45    ];\n  optional   sint64 default_sint64_extension   = 66 [default =  46    ];\n  optional  fixed32 default_fixed32_extension  = 67 [default =  47    ];\n  optional  fixed64 default_fixed64_extension  = 68 [default =  48    ];\n  optional sfixed32 default_sfixed32_extension = 69 [default =  49    ];\n  optional sfixed64 default_sfixed64_extension = 70 [default = -50    ];\n  optional    float default_float_extension    = 71 [default =  51.5  ];\n  optional   double default_double_extension   = 72 [default =  52e3  ];\n  optional     bool default_bool_extension     = 73 [default = true   ];\n  optional   string default_string_extension   = 74 [default = \"hello\"];\n  optional    bytes default_bytes_extension    = 75 [default = \"world\"];\n\n  optional TestAllTypes.NestedEnum\n    default_nested_enum_extension = 81 [default = BAR];\n  optional ForeignEnum\n    default_foreign_enum_extension = 82 [default = FOREIGN_BAR];\n  optional protobuf_unittest_import.ImportEnum\n    default_import_enum_extension = 83 [default = IMPORT_BAR];\n\n  optional string default_string_piece_extension = 84 [ctype=STRING_PIECE,\n                                                       default=\"abc\"];\n  optional string default_cord_extension = 85 [ctype=CORD, default=\"123\"];\n}\n\nmessage TestNestedExtension {\n  extend TestAllExtensions {\n    // Check for bug where string extensions declared in tested scope did not\n    // compile.\n    optional string test = 1002 [default=\"test\"];\n  }\n}\n\n// We have separate messages for testing required fields because it's\n// annoying to have to fill in required fields in TestProto in order to\n// do anything with it.  Note that we don't need to test every type of\n// required filed because the code output is basically identical to\n// optional fields for all types.\nmessage TestRequired {\n  required int32 a = 1;\n  optional int32 dummy2 = 2;\n  required int32 b = 3;\n\n  extend TestAllExtensions {\n    optional TestRequired single = 1000;\n    repeated TestRequired multi  = 1001;\n  }\n\n  // Pad the field count to 32 so that we can test that IsInitialized()\n  // properly checks multiple elements of has_bits_.\n  optional int32 dummy4  =  4;\n  optional int32 dummy5  =  5;\n  optional int32 dummy6  =  6;\n  optional int32 dummy7  =  7;\n  optional int32 dummy8  =  8;\n  optional int32 dummy9  =  9;\n  optional int32 dummy10 = 10;\n  optional int32 dummy11 = 11;\n  optional int32 dummy12 = 12;\n  optional int32 dummy13 = 13;\n  optional int32 dummy14 = 14;\n  optional int32 dummy15 = 15;\n  optional int32 dummy16 = 16;\n  optional int32 dummy17 = 17;\n  optional int32 dummy18 = 18;\n  optional int32 dummy19 = 19;\n  optional int32 dummy20 = 20;\n  optional int32 dummy21 = 21;\n  optional int32 dummy22 = 22;\n  optional int32 dummy23 = 23;\n  optional int32 dummy24 = 24;\n  optional int32 dummy25 = 25;\n  optional int32 dummy26 = 26;\n  optional int32 dummy27 = 27;\n  optional int32 dummy28 = 28;\n  optional int32 dummy29 = 29;\n  optional int32 dummy30 = 30;\n  optional int32 dummy31 = 31;\n  optional int32 dummy32 = 32;\n\n  required int32 c = 33;\n}\n\nmessage TestRequiredForeign {\n  optional TestRequired optional_message = 1;\n  repeated TestRequired repeated_message = 2;\n  optional int32 dummy = 3;\n}\n\n// Test that we can use NestedMessage from outside TestAllTypes.\nmessage TestForeignNested {\n  optional TestAllTypes.NestedMessage foreign_nested = 1;\n}\n\n// TestEmptyMessage is used to test unknown field support.\nmessage TestEmptyMessage {\n}\n\n// Like above, but declare all field numbers as potential extensions.  No\n// actual extensions should ever be defined for this type.\nmessage TestEmptyMessageWithExtensions {\n  extensions 1 to max;\n}\n\nmessage TestMultipleExtensionRanges {\n  extensions 42;\n  extensions 4143 to 4243;\n  extensions 65536 to max;\n}\n\n// Test that really large tag numbers don't break anything.\nmessage TestReallyLargeTagNumber {\n  // The largest possible tag number is 2^28 - 1, since the wire format uses\n  // three bits to communicate wire type.\n  optional int32 a = 1;\n  optional int32 bb = 268435455;\n}\n\nmessage TestRecursiveMessage {\n  optional TestRecursiveMessage a = 1;\n  optional int32 i = 2;\n}\n\n// Test that mutual recursion works.\nmessage TestMutualRecursionA {\n  optional TestMutualRecursionB bb = 1;\n}\n\nmessage TestMutualRecursionB {\n  optional TestMutualRecursionA a = 1;\n  optional int32 optional_int32 = 2;\n}\n\n// Test that groups have disjoint field numbers from their siblings and\n// parents.  This is NOT possible in proto1; only proto2.  When attempting\n// to compile with proto1, this will emit an error; so we only include it\n// in protobuf_unittest_proto.\nmessage TestDupFieldNumber {                        // NO_PROTO1\n  optional int32 a = 1;                             // NO_PROTO1\n  optional group Foo = 2 { optional int32 a = 1; }  // NO_PROTO1\n  optional group Bar = 3 { optional int32 a = 1; }  // NO_PROTO1\n}                                                   // NO_PROTO1\n\n\n// Needed for a Python test.\nmessage TestNestedMessageHasBits {\n  message NestedMessage {\n    repeated int32 nestedmessage_repeated_int32 = 1;\n    repeated ForeignMessage nestedmessage_repeated_foreignmessage = 2;\n  }\n  optional NestedMessage optional_nested_message = 1;\n}\n\n\n// Test an enum that has multiple values with the same number.\nenum TestEnumWithDupValue {\n  FOO1 = 1;\n  BAR1 = 2;\n  BAZ = 3;\n  FOO2 = 1;\n  BAR2 = 2;\n}\n\n// Test an enum with large, unordered values.\nenum TestSparseEnum {\n  SPARSE_A = 123;\n  SPARSE_B = 62374;\n  SPARSE_C = 12589234;\n  SPARSE_D = -15;\n  SPARSE_E = -53452;\n  SPARSE_F = 0;\n  SPARSE_G = 2;\n}\n\n// Test message with CamelCase field names.  This violates Protocol Buffer\n// standard style.\nmessage TestCamelCaseFieldNames {\n  optional int32 PrimitiveField = 1;\n  optional string StringField = 2;\n  optional ForeignEnum EnumField = 3;\n  optional ForeignMessage MessageField = 4;\n  optional string StringPieceField = 5 [ctype=STRING_PIECE];\n  optional string CordField = 6 [ctype=CORD];\n\n  repeated int32 RepeatedPrimitiveField = 7;\n  repeated string RepeatedStringField = 8;\n  repeated ForeignEnum RepeatedEnumField = 9;\n  repeated ForeignMessage RepeatedMessageField = 10;\n  repeated string RepeatedStringPieceField = 11 [ctype=STRING_PIECE];\n  repeated string RepeatedCordField = 12 [ctype=CORD];\n}\n\n\n// We list fields out of order, to ensure that we're using field number and not\n// field index to determine serialization order.\nmessage TestFieldOrderings {\n  optional string my_string = 11;\n  extensions 2 to 10;\n  optional int64 my_int = 1;\n  extensions 12 to 100;\n  optional float my_float = 101;\n}\n\n\nextend TestFieldOrderings {\n  optional string my_extension_string = 50;\n  optional int32 my_extension_int = 5;\n}\n\n\nmessage TestExtremeDefaultValues {\n  optional bytes escaped_bytes = 1 [default = \"\\0\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"\\xfe\"];\n  optional uint32 large_uint32 = 2 [default = 0xFFFFFFFF];\n  optional uint64 large_uint64 = 3 [default = 0xFFFFFFFFFFFFFFFF];\n  optional  int32 small_int32  = 4 [default = -0x7FFFFFFF];\n  optional  int64 small_int64  = 5 [default = -0x7FFFFFFFFFFFFFFF];\n\n  // The default value here is UTF-8 for \"\\u1234\".  (We could also just type\n  // the UTF-8 text directly into this text file rather than escape it, but\n  // lots of people use editors that would be confused by this.)\n  optional string utf8_string = 6 [default = \"\\341\\210\\264\"];\n\n  // Tests for single-precision floating-point values.\n  optional float zero_float = 7 [default = 0];\n  optional float one_float = 8 [default = 1];\n  optional float small_float = 9 [default = 1.5];\n  optional float negative_one_float = 10 [default = -1];\n  optional float negative_float = 11 [default = -1.5];\n  // Using exponents\n  optional float large_float = 12 [default = 2E8];\n  optional float small_negative_float = 13 [default = -8e-28];\n\n  // Text for nonfinite floating-point values.\n  optional double inf_double = 14 [default = inf];\n  optional double neg_inf_double = 15 [default = -inf];\n  optional double nan_double = 16 [default = nan];\n  optional float inf_float = 17 [default = inf];\n  optional float neg_inf_float = 18 [default = -inf];\n  optional float nan_float = 19 [default = nan];\n\n  // Tests for C++ trigraphs.\n  // Trigraphs should be escaped in C++ generated files, but they should not be\n  // escaped for other languages.\n  // Note that in .proto file, \"\\?\" is a valid way to escape ? in string\n  // literals.\n  optional string cpp_trigraph = 20 [default = \"? \\? ?? \\?? \\??? ??/ ?\\?-\"];\n}\n\nmessage SparseEnumMessage {\n  optional TestSparseEnum sparse_enum = 1;\n}\n\n// Test String and Bytes: string is for valid UTF-8 strings\nmessage OneString {\n  optional string data = 1;\n}\n\nmessage OneBytes {\n  optional bytes data = 1;\n}\n\n// Test messages for packed fields\n\nmessage TestPackedTypes {\n  repeated    int32 packed_int32    =  90 [packed = true];\n  repeated    int64 packed_int64    =  91 [packed = true];\n  repeated   uint32 packed_uint32   =  92 [packed = true];\n  repeated   uint64 packed_uint64   =  93 [packed = true];\n  repeated   sint32 packed_sint32   =  94 [packed = true];\n  repeated   sint64 packed_sint64   =  95 [packed = true];\n  repeated  fixed32 packed_fixed32  =  96 [packed = true];\n  repeated  fixed64 packed_fixed64  =  97 [packed = true];\n  repeated sfixed32 packed_sfixed32 =  98 [packed = true];\n  repeated sfixed64 packed_sfixed64 =  99 [packed = true];\n  repeated    float packed_float    = 100 [packed = true];\n  repeated   double packed_double   = 101 [packed = true];\n  repeated     bool packed_bool     = 102 [packed = true];\n  repeated ForeignEnum packed_enum  = 103 [packed = true];\n}\n\n// A message with the same fields as TestPackedTypes, but without packing. Used\n// to test packed <-> unpacked wire compatibility.\nmessage TestUnpackedTypes {\n  repeated    int32 unpacked_int32    =  90 [packed = false];\n  repeated    int64 unpacked_int64    =  91 [packed = false];\n  repeated   uint32 unpacked_uint32   =  92 [packed = false];\n  repeated   uint64 unpacked_uint64   =  93 [packed = false];\n  repeated   sint32 unpacked_sint32   =  94 [packed = false];\n  repeated   sint64 unpacked_sint64   =  95 [packed = false];\n  repeated  fixed32 unpacked_fixed32  =  96 [packed = false];\n  repeated  fixed64 unpacked_fixed64  =  97 [packed = false];\n  repeated sfixed32 unpacked_sfixed32 =  98 [packed = false];\n  repeated sfixed64 unpacked_sfixed64 =  99 [packed = false];\n  repeated    float unpacked_float    = 100 [packed = false];\n  repeated   double unpacked_double   = 101 [packed = false];\n  repeated     bool unpacked_bool     = 102 [packed = false];\n  repeated ForeignEnum unpacked_enum  = 103 [packed = false];\n}\n\nmessage TestPackedExtensions {\n  extensions 1 to max;\n}\n\nextend TestPackedExtensions {\n  repeated    int32 packed_int32_extension    =  90 [packed = true];\n  repeated    int64 packed_int64_extension    =  91 [packed = true];\n  repeated   uint32 packed_uint32_extension   =  92 [packed = true];\n  repeated   uint64 packed_uint64_extension   =  93 [packed = true];\n  repeated   sint32 packed_sint32_extension   =  94 [packed = true];\n  repeated   sint64 packed_sint64_extension   =  95 [packed = true];\n  repeated  fixed32 packed_fixed32_extension  =  96 [packed = true];\n  repeated  fixed64 packed_fixed64_extension  =  97 [packed = true];\n  repeated sfixed32 packed_sfixed32_extension =  98 [packed = true];\n  repeated sfixed64 packed_sfixed64_extension =  99 [packed = true];\n  repeated    float packed_float_extension    = 100 [packed = true];\n  repeated   double packed_double_extension   = 101 [packed = true];\n  repeated     bool packed_bool_extension     = 102 [packed = true];\n  repeated ForeignEnum packed_enum_extension  = 103 [packed = true];\n}\n\n// Used by ExtensionSetTest/DynamicExtensions.  The test actually builds\n// a set of extensions to TestAllExtensions dynamically, based on the fields\n// of this message type.\nmessage TestDynamicExtensions {\n  enum DynamicEnumType {\n    DYNAMIC_FOO = 2200;\n    DYNAMIC_BAR = 2201;\n    DYNAMIC_BAZ = 2202;\n  }\n  message DynamicMessageType {\n    optional int32 dynamic_field = 2100;\n  }\n\n  optional fixed32 scalar_extension = 2000;\n  optional ForeignEnum enum_extension = 2001;\n  optional DynamicEnumType dynamic_enum_extension = 2002;\n\n  optional ForeignMessage message_extension = 2003;\n  optional DynamicMessageType dynamic_message_extension = 2004;\n\n  repeated string repeated_extension = 2005;\n  repeated sint32 packed_extension = 2006 [packed = true];\n}\n\nmessage TestRepeatedScalarDifferentTagSizes {\n  // Parsing repeated fixed size values used to fail. This message needs to be\n  // used in order to get a tag of the right size; all of the repeated fields\n  // in TestAllTypes didn't trigger the check.\n  repeated fixed32 repeated_fixed32 = 12;\n  // Check for a varint type, just for good measure.\n  repeated int32   repeated_int32   = 13;\n\n  // These have two-byte tags.\n  repeated fixed64 repeated_fixed64 = 2046;\n  repeated int64   repeated_int64   = 2047;\n\n  // Three byte tags.\n  repeated float   repeated_float   = 262142;\n  repeated uint64  repeated_uint64  = 262143;\n}\n\n\n// Test that RPC services work.\nmessage FooRequest  {}\nmessage FooResponse {}\n\nservice TestService {\n  rpc Foo(FooRequest) returns (FooResponse);\n  rpc Bar(BarRequest) returns (BarResponse);\n}\n\n\nmessage BarRequest  {}\nmessage BarResponse {}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_custom_options.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: benjy@google.com (Benjy Weinberger)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// A proto file used to test the \"custom options\" feature of proto2.\n\n\n// Some generic_services option(s) added automatically.\n// See:  http://go/proto2-generic-services-default\noption cc_generic_services = true;     // auto-added\noption java_generic_services = true;   // auto-added\noption py_generic_services = true;\n\n// A custom file option (defined below).\noption (file_opt1) = 9876543210;\n\nimport \"google/protobuf/descriptor.proto\";\n\n// We don't put this in a package within proto2 because we need to make sure\n// that the generated code doesn't depend on being in the proto2 namespace.\npackage protobuf_unittest;\n\n\n// Some simple test custom options of various types.\n\nextend google.protobuf.FileOptions {\n  optional uint64 file_opt1 = 7736974;\n}\n\nextend google.protobuf.MessageOptions {\n  optional int32 message_opt1 = 7739036;\n}\n\nextend google.protobuf.FieldOptions {\n  optional fixed64 field_opt1 = 7740936;\n  // This is useful for testing that we correctly register default values for\n  // extension options.\n  optional int32 field_opt2 = 7753913 [default=42];\n}\n\nextend google.protobuf.EnumOptions {\n  optional sfixed32 enum_opt1 = 7753576;\n}\n\nextend google.protobuf.EnumValueOptions {\n  optional int32 enum_value_opt1 = 1560678;\n}\n\nextend google.protobuf.ServiceOptions {\n  optional sint64 service_opt1 = 7887650;\n}\n\nenum MethodOpt1 {\n  METHODOPT1_VAL1 = 1;\n  METHODOPT1_VAL2 = 2;\n}\n\nextend google.protobuf.MethodOptions {\n  optional MethodOpt1 method_opt1 = 7890860;\n}\n\n// A test message with custom options at all possible locations (and also some\n// regular options, to make sure they interact nicely).\nmessage TestMessageWithCustomOptions {\n  option message_set_wire_format = false;\n\n  option (message_opt1) = -56;\n\n  optional string field1 = 1 [ctype=CORD,\n                              (field_opt1)=8765432109];\n\n  enum AnEnum {\n    option (enum_opt1) = -789;\n\n    ANENUM_VAL1 = 1;\n    ANENUM_VAL2 = 2 [(enum_value_opt1) = 123];\n  }\n}\n\n\n// A test RPC service with custom options at all possible locations (and also\n// some regular options, to make sure they interact nicely).\nmessage CustomOptionFooRequest {\n}\n\nmessage CustomOptionFooResponse {\n}\n\nservice TestServiceWithCustomOptions {\n  option (service_opt1) = -9876543210;\n\n  rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) {\n    option (method_opt1) = METHODOPT1_VAL2;\n  }\n}\n\n\n\n// Options of every possible field type, so we can test them all exhaustively.\n\nmessage DummyMessageContainingEnum {\n  enum TestEnumType {\n    TEST_OPTION_ENUM_TYPE1 = 22;\n    TEST_OPTION_ENUM_TYPE2 = -23;\n  }\n}\n\nmessage DummyMessageInvalidAsOptionType {\n}\n\nextend google.protobuf.MessageOptions {\n  optional         bool     bool_opt = 7706090;\n  optional        int32    int32_opt = 7705709;\n  optional        int64    int64_opt = 7705542;\n  optional       uint32   uint32_opt = 7704880;\n  optional       uint64   uint64_opt = 7702367;\n  optional       sint32   sint32_opt = 7701568;\n  optional       sint64   sint64_opt = 7700863;\n  optional      fixed32  fixed32_opt = 7700307;\n  optional      fixed64  fixed64_opt = 7700194;\n  optional     sfixed32 sfixed32_opt = 7698645;\n  optional     sfixed64 sfixed64_opt = 7685475;\n  optional        float    float_opt = 7675390;\n  optional       double   double_opt = 7673293;\n  optional       string   string_opt = 7673285;\n  optional        bytes    bytes_opt = 7673238;\n  optional DummyMessageContainingEnum.TestEnumType enum_opt = 7673233;\n  optional DummyMessageInvalidAsOptionType message_type_opt = 7665967;\n}\n\nmessage CustomOptionMinIntegerValues {\n  option     (bool_opt) = false;\n  option    (int32_opt) = -0x80000000;\n  option    (int64_opt) = -0x8000000000000000;\n  option   (uint32_opt) = 0;\n  option   (uint64_opt) = 0;\n  option   (sint32_opt) = -0x80000000;\n  option   (sint64_opt) = -0x8000000000000000;\n  option  (fixed32_opt) = 0;\n  option  (fixed64_opt) = 0;\n  option (sfixed32_opt) = -0x80000000;\n  option (sfixed64_opt) = -0x8000000000000000;\n}\n\nmessage CustomOptionMaxIntegerValues {\n  option     (bool_opt) = true;\n  option    (int32_opt) = 0x7FFFFFFF;\n  option    (int64_opt) = 0x7FFFFFFFFFFFFFFF;\n  option   (uint32_opt) = 0xFFFFFFFF;\n  option   (uint64_opt) = 0xFFFFFFFFFFFFFFFF;\n  option   (sint32_opt) = 0x7FFFFFFF;\n  option   (sint64_opt) = 0x7FFFFFFFFFFFFFFF;\n  option  (fixed32_opt) = 0xFFFFFFFF;\n  option  (fixed64_opt) = 0xFFFFFFFFFFFFFFFF;\n  option (sfixed32_opt) = 0x7FFFFFFF;\n  option (sfixed64_opt) = 0x7FFFFFFFFFFFFFFF;\n}\n\nmessage CustomOptionOtherValues {\n  option  (int32_opt) = -100;  // To test sign-extension.\n  option  (float_opt) = 12.3456789;\n  option (double_opt) = 1.234567890123456789;\n  option (string_opt) = \"Hello, \\\"World\\\"\";\n  option  (bytes_opt) = \"Hello\\0World\";\n  option   (enum_opt) = TEST_OPTION_ENUM_TYPE2;\n}\n\nmessage SettingRealsFromPositiveInts {\n  option  (float_opt) = 12;\n  option (double_opt) = 154;\n}\n\nmessage SettingRealsFromNegativeInts {\n  option  (float_opt) = -12;\n  option  (double_opt) = -154;\n}\n\n// Options of complex message types, themselves combined and extended in\n// various ways.\n\nmessage ComplexOptionType1 {\n  optional int32 foo = 1;\n  optional int32 foo2 = 2;\n  optional int32 foo3 = 3;\n\n  extensions 100 to max;\n}\n\nmessage ComplexOptionType2 {\n  optional ComplexOptionType1 bar = 1;\n  optional int32 baz = 2;\n\n  message ComplexOptionType4 {\n    optional int32 waldo = 1;\n\n    extend google.protobuf.MessageOptions {\n      optional ComplexOptionType4 complex_opt4 = 7633546;\n    }\n  }\n\n  optional ComplexOptionType4 fred = 3;\n\n  extensions 100 to max;\n}\n\nmessage ComplexOptionType3 {\n  optional int32 qux = 1;\n\n  optional group ComplexOptionType5 = 2 {\n    optional int32 plugh = 3;\n  }\n}\n\nextend ComplexOptionType1 {\n  optional int32 quux = 7663707;\n  optional ComplexOptionType3 corge = 7663442;\n}\n\nextend ComplexOptionType2 {\n  optional int32 grault = 7650927;\n  optional ComplexOptionType1 garply = 7649992;\n}\n\nextend google.protobuf.MessageOptions {\n  optional protobuf_unittest.ComplexOptionType1 complex_opt1 = 7646756;\n  optional ComplexOptionType2 complex_opt2 = 7636949;\n  optional ComplexOptionType3 complex_opt3 = 7636463;\n  optional group ComplexOpt6 = 7595468 {\n    optional int32 xyzzy = 7593951;\n  }\n}\n\n// Note that we try various different ways of naming the same extension.\nmessage VariousComplexOptions {\n  option (.protobuf_unittest.complex_opt1).foo = 42;\n  option (protobuf_unittest.complex_opt1).(.protobuf_unittest.quux) = 324;\n  option (.protobuf_unittest.complex_opt1).(protobuf_unittest.corge).qux = 876;\n  option (complex_opt2).baz = 987;\n  option (complex_opt2).(grault) = 654;\n  option (complex_opt2).bar.foo = 743;\n  option (complex_opt2).bar.(quux) = 1999;\n  option (complex_opt2).bar.(protobuf_unittest.corge).qux = 2008;\n  option (complex_opt2).(garply).foo = 741;\n  option (complex_opt2).(garply).(.protobuf_unittest.quux) = 1998;\n  option (complex_opt2).(protobuf_unittest.garply).(corge).qux = 2121;\n  option (ComplexOptionType2.ComplexOptionType4.complex_opt4).waldo = 1971;\n  option (complex_opt2).fred.waldo = 321;\n  option (protobuf_unittest.complex_opt3).qux = 9;\n  option (complex_opt3).complexoptiontype5.plugh = 22;\n  option (complexopt6).xyzzy = 24;\n}\n\n// ------------------------------------------------------\n// Definitions for testing aggregate option parsing.\n// See descriptor_unittest.cc.\n\nmessage AggregateMessageSet {\n  option message_set_wire_format = true;\n  extensions 4 to max;\n}\n\nmessage AggregateMessageSetElement {\n  extend AggregateMessageSet {\n    optional AggregateMessageSetElement message_set_extension = 15447542;\n  }\n  optional string s = 1;\n}\n\n// A helper type used to test aggregate option parsing\nmessage Aggregate {\n  optional int32 i = 1;\n  optional string s = 2;\n\n  // A nested object\n  optional Aggregate sub = 3;\n\n  // To test the parsing of extensions inside aggregate values\n  optional google.protobuf.FileOptions file = 4;\n  extend google.protobuf.FileOptions {\n    optional Aggregate nested = 15476903;\n  }\n\n  // An embedded message set\n  optional AggregateMessageSet mset = 5;\n}\n\n// Allow Aggregate to be used as an option at all possible locations\n// in the .proto grammer.\nextend google.protobuf.FileOptions      { optional Aggregate fileopt    = 15478479; }\nextend google.protobuf.MessageOptions   { optional Aggregate msgopt     = 15480088; }\nextend google.protobuf.FieldOptions     { optional Aggregate fieldopt   = 15481374; }\nextend google.protobuf.EnumOptions      { optional Aggregate enumopt    = 15483218; }\nextend google.protobuf.EnumValueOptions { optional Aggregate enumvalopt = 15486921; }\nextend google.protobuf.ServiceOptions   { optional Aggregate serviceopt = 15497145; }\nextend google.protobuf.MethodOptions    { optional Aggregate methodopt  = 15512713; }\n\n// Try using AggregateOption at different points in the proto grammar\noption (fileopt) = {\n  s: 'FileAnnotation'\n  // Also test the handling of comments\n  /* of both types */ i: 100\n\n  sub { s: 'NestedFileAnnotation' }\n\n  // Include a google.protobuf.FileOptions and recursively extend it with\n  // another fileopt.\n  file {\n    [protobuf_unittest.fileopt] {\n      s:'FileExtensionAnnotation'\n    }\n  }\n\n  // A message set inside an option value\n  mset {\n    [protobuf_unittest.AggregateMessageSetElement.message_set_extension] {\n      s: 'EmbeddedMessageSetElement'\n    }\n  }\n};\n\nmessage AggregateMessage {\n  option (msgopt) = { i:101 s:'MessageAnnotation' };\n  optional int32 fieldname = 1 [(fieldopt) = { s:'FieldAnnotation' }];\n}\n\nservice AggregateService {\n  option (serviceopt) = { s:'ServiceAnnotation' };\n  rpc Method (AggregateMessage) returns (AggregateMessage) {\n    option (methodopt) = { s:'MethodAnnotation' };\n  }\n}\n\nenum AggregateEnum {\n  option (enumopt) = { s:'EnumAnnotation' };\n  VALUE = 1 [(enumvalopt) = { s:'EnumValueAnnotation' }];\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// A proto file which imports a proto file that uses optimize_for = CODE_SIZE.\n\nimport \"google/protobuf/unittest_optimize_for.proto\";\n\npackage protobuf_unittest;\n\n// We optimize for speed here, but we are importing a proto that is optimized\n// for code size.\noption optimize_for = SPEED;\n\nmessage TestEmbedOptimizedForSize {\n  // Test that embedding a message which has optimize_for = CODE_SIZE into\n  // one optimized for speed works.\n  optional TestOptimizedForSize optional_message = 1;\n  repeated TestOptimizedForSize repeated_message = 2;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_empty.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file intentionally left blank.  (At one point this wouldn't compile\n// correctly.)\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// A proto file that has an extremely large descriptor.  Used to test that\n// descriptors over 64k don't break the string literal length limit in Java.\n\n\npackage google.protobuf;\noption java_package = \"com.google.protobuf\";\n\n// Avoid generating insanely long methods.\noption optimize_for = CODE_SIZE;\n\nmessage TestEnormousDescriptor {\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1 = 1 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_2 = 2 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_3 = 3 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_4 = 4 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_5 = 5 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_6 = 6 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_7 = 7 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_8 = 8 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_9 = 9 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_10 = 10 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_11 = 11 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_12 = 12 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_13 = 13 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_14 = 14 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_15 = 15 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_16 = 16 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_17 = 17 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_18 = 18 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_19 = 19 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_20 = 20 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_21 = 21 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_22 = 22 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_23 = 23 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_24 = 24 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_25 = 25 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_26 = 26 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_27 = 27 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_28 = 28 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_29 = 29 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_30 = 30 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_31 = 31 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_32 = 32 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_33 = 33 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_34 = 34 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_35 = 35 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_36 = 36 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_37 = 37 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_38 = 38 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_39 = 39 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_40 = 40 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_41 = 41 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_42 = 42 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_43 = 43 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_44 = 44 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_45 = 45 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_46 = 46 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_47 = 47 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_48 = 48 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_49 = 49 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_50 = 50 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_51 = 51 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_52 = 52 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_53 = 53 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_54 = 54 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_55 = 55 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_56 = 56 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_57 = 57 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_58 = 58 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_59 = 59 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_60 = 60 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_61 = 61 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_62 = 62 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_63 = 63 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_64 = 64 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_65 = 65 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_66 = 66 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_67 = 67 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_68 = 68 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_69 = 69 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_70 = 70 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_71 = 71 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_72 = 72 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_73 = 73 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_74 = 74 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_75 = 75 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_76 = 76 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_77 = 77 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_78 = 78 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_79 = 79 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_80 = 80 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_81 = 81 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_82 = 82 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_83 = 83 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_84 = 84 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_85 = 85 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_86 = 86 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_87 = 87 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_88 = 88 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_89 = 89 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_90 = 90 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_91 = 91 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_92 = 92 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_93 = 93 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_94 = 94 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_95 = 95 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_96 = 96 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_97 = 97 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_98 = 98 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_99 = 99 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_100 = 100 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_101 = 101 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_102 = 102 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_103 = 103 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_104 = 104 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_105 = 105 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_106 = 106 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_107 = 107 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_108 = 108 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_109 = 109 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_110 = 110 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_111 = 111 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_112 = 112 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_113 = 113 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_114 = 114 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_115 = 115 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_116 = 116 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_117 = 117 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_118 = 118 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_119 = 119 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_120 = 120 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_121 = 121 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_122 = 122 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_123 = 123 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_124 = 124 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_125 = 125 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_126 = 126 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_127 = 127 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_128 = 128 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_129 = 129 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_130 = 130 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_131 = 131 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_132 = 132 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_133 = 133 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_134 = 134 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_135 = 135 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_136 = 136 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_137 = 137 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_138 = 138 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_139 = 139 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_140 = 140 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_141 = 141 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_142 = 142 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_143 = 143 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_144 = 144 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_145 = 145 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_146 = 146 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_147 = 147 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_148 = 148 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_149 = 149 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_150 = 150 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_151 = 151 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_152 = 152 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_153 = 153 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_154 = 154 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_155 = 155 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_156 = 156 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_157 = 157 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_158 = 158 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_159 = 159 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_160 = 160 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_161 = 161 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_162 = 162 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_163 = 163 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_164 = 164 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_165 = 165 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_166 = 166 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_167 = 167 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_168 = 168 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_169 = 169 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_170 = 170 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_171 = 171 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_172 = 172 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_173 = 173 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_174 = 174 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_175 = 175 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_176 = 176 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_177 = 177 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_178 = 178 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_179 = 179 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_180 = 180 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_181 = 181 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_182 = 182 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_183 = 183 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_184 = 184 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_185 = 185 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_186 = 186 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_187 = 187 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_188 = 188 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_189 = 189 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_190 = 190 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_191 = 191 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_192 = 192 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_193 = 193 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_194 = 194 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_195 = 195 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_196 = 196 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_197 = 197 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_198 = 198 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_199 = 199 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_200 = 200 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_201 = 201 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_202 = 202 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_203 = 203 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_204 = 204 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_205 = 205 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_206 = 206 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_207 = 207 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_208 = 208 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_209 = 209 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_210 = 210 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_211 = 211 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_212 = 212 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_213 = 213 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_214 = 214 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_215 = 215 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_216 = 216 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_217 = 217 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_218 = 218 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_219 = 219 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_220 = 220 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_221 = 221 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_222 = 222 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_223 = 223 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_224 = 224 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_225 = 225 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_226 = 226 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_227 = 227 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_228 = 228 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_229 = 229 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_230 = 230 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_231 = 231 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_232 = 232 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_233 = 233 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_234 = 234 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_235 = 235 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_236 = 236 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_237 = 237 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_238 = 238 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_239 = 239 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_240 = 240 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_241 = 241 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_242 = 242 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_243 = 243 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_244 = 244 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_245 = 245 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_246 = 246 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_247 = 247 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_248 = 248 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_249 = 249 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_250 = 250 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_251 = 251 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_252 = 252 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_253 = 253 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_254 = 254 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_255 = 255 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_256 = 256 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_257 = 257 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_258 = 258 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_259 = 259 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_260 = 260 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_261 = 261 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_262 = 262 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_263 = 263 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_264 = 264 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_265 = 265 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_266 = 266 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_267 = 267 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_268 = 268 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_269 = 269 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_270 = 270 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_271 = 271 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_272 = 272 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_273 = 273 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_274 = 274 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_275 = 275 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_276 = 276 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_277 = 277 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_278 = 278 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_279 = 279 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_280 = 280 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_281 = 281 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_282 = 282 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_283 = 283 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_284 = 284 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_285 = 285 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_286 = 286 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_287 = 287 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_288 = 288 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_289 = 289 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_290 = 290 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_291 = 291 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_292 = 292 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_293 = 293 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_294 = 294 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_295 = 295 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_296 = 296 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_297 = 297 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_298 = 298 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_299 = 299 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_300 = 300 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_301 = 301 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_302 = 302 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_303 = 303 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_304 = 304 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_305 = 305 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_306 = 306 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_307 = 307 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_308 = 308 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_309 = 309 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_310 = 310 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_311 = 311 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_312 = 312 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_313 = 313 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_314 = 314 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_315 = 315 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_316 = 316 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_317 = 317 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_318 = 318 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_319 = 319 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_320 = 320 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_321 = 321 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_322 = 322 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_323 = 323 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_324 = 324 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_325 = 325 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_326 = 326 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_327 = 327 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_328 = 328 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_329 = 329 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_330 = 330 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_331 = 331 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_332 = 332 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_333 = 333 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_334 = 334 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_335 = 335 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_336 = 336 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_337 = 337 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_338 = 338 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_339 = 339 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_340 = 340 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_341 = 341 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_342 = 342 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_343 = 343 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_344 = 344 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_345 = 345 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_346 = 346 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_347 = 347 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_348 = 348 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_349 = 349 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_350 = 350 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_351 = 351 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_352 = 352 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_353 = 353 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_354 = 354 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_355 = 355 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_356 = 356 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_357 = 357 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_358 = 358 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_359 = 359 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_360 = 360 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_361 = 361 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_362 = 362 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_363 = 363 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_364 = 364 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_365 = 365 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_366 = 366 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_367 = 367 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_368 = 368 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_369 = 369 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_370 = 370 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_371 = 371 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_372 = 372 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_373 = 373 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_374 = 374 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_375 = 375 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_376 = 376 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_377 = 377 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_378 = 378 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_379 = 379 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_380 = 380 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_381 = 381 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_382 = 382 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_383 = 383 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_384 = 384 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_385 = 385 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_386 = 386 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_387 = 387 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_388 = 388 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_389 = 389 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_390 = 390 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_391 = 391 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_392 = 392 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_393 = 393 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_394 = 394 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_395 = 395 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_396 = 396 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_397 = 397 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_398 = 398 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_399 = 399 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_400 = 400 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_401 = 401 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_402 = 402 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_403 = 403 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_404 = 404 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_405 = 405 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_406 = 406 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_407 = 407 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_408 = 408 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_409 = 409 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_410 = 410 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_411 = 411 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_412 = 412 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_413 = 413 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_414 = 414 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_415 = 415 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_416 = 416 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_417 = 417 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_418 = 418 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_419 = 419 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_420 = 420 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_421 = 421 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_422 = 422 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_423 = 423 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_424 = 424 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_425 = 425 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_426 = 426 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_427 = 427 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_428 = 428 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_429 = 429 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_430 = 430 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_431 = 431 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_432 = 432 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_433 = 433 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_434 = 434 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_435 = 435 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_436 = 436 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_437 = 437 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_438 = 438 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_439 = 439 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_440 = 440 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_441 = 441 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_442 = 442 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_443 = 443 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_444 = 444 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_445 = 445 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_446 = 446 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_447 = 447 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_448 = 448 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_449 = 449 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_450 = 450 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_451 = 451 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_452 = 452 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_453 = 453 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_454 = 454 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_455 = 455 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_456 = 456 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_457 = 457 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_458 = 458 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_459 = 459 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_460 = 460 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_461 = 461 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_462 = 462 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_463 = 463 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_464 = 464 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_465 = 465 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_466 = 466 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_467 = 467 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_468 = 468 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_469 = 469 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_470 = 470 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_471 = 471 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_472 = 472 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_473 = 473 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_474 = 474 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_475 = 475 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_476 = 476 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_477 = 477 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_478 = 478 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_479 = 479 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_480 = 480 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_481 = 481 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_482 = 482 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_483 = 483 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_484 = 484 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_485 = 485 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_486 = 486 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_487 = 487 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_488 = 488 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_489 = 489 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_490 = 490 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_491 = 491 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_492 = 492 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_493 = 493 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_494 = 494 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_495 = 495 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_496 = 496 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_497 = 497 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_498 = 498 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_499 = 499 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_500 = 500 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_501 = 501 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_502 = 502 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_503 = 503 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_504 = 504 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_505 = 505 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_506 = 506 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_507 = 507 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_508 = 508 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_509 = 509 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_510 = 510 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_511 = 511 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_512 = 512 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_513 = 513 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_514 = 514 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_515 = 515 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_516 = 516 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_517 = 517 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_518 = 518 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_519 = 519 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_520 = 520 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_521 = 521 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_522 = 522 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_523 = 523 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_524 = 524 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_525 = 525 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_526 = 526 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_527 = 527 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_528 = 528 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_529 = 529 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_530 = 530 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_531 = 531 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_532 = 532 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_533 = 533 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_534 = 534 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_535 = 535 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_536 = 536 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_537 = 537 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_538 = 538 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_539 = 539 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_540 = 540 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_541 = 541 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_542 = 542 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_543 = 543 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_544 = 544 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_545 = 545 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_546 = 546 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_547 = 547 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_548 = 548 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_549 = 549 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_550 = 550 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_551 = 551 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_552 = 552 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_553 = 553 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_554 = 554 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_555 = 555 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_556 = 556 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_557 = 557 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_558 = 558 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_559 = 559 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_560 = 560 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_561 = 561 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_562 = 562 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_563 = 563 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_564 = 564 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_565 = 565 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_566 = 566 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_567 = 567 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_568 = 568 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_569 = 569 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_570 = 570 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_571 = 571 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_572 = 572 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_573 = 573 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_574 = 574 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_575 = 575 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_576 = 576 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_577 = 577 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_578 = 578 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_579 = 579 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_580 = 580 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_581 = 581 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_582 = 582 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_583 = 583 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_584 = 584 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_585 = 585 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_586 = 586 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_587 = 587 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_588 = 588 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_589 = 589 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_590 = 590 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_591 = 591 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_592 = 592 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_593 = 593 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_594 = 594 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_595 = 595 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_596 = 596 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_597 = 597 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_598 = 598 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_599 = 599 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_600 = 600 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_601 = 601 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_602 = 602 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_603 = 603 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_604 = 604 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_605 = 605 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_606 = 606 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_607 = 607 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_608 = 608 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_609 = 609 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_610 = 610 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_611 = 611 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_612 = 612 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_613 = 613 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_614 = 614 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_615 = 615 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_616 = 616 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_617 = 617 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_618 = 618 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_619 = 619 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_620 = 620 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_621 = 621 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_622 = 622 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_623 = 623 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_624 = 624 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_625 = 625 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_626 = 626 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_627 = 627 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_628 = 628 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_629 = 629 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_630 = 630 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_631 = 631 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_632 = 632 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_633 = 633 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_634 = 634 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_635 = 635 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_636 = 636 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_637 = 637 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_638 = 638 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_639 = 639 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_640 = 640 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_641 = 641 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_642 = 642 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_643 = 643 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_644 = 644 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_645 = 645 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_646 = 646 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_647 = 647 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_648 = 648 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_649 = 649 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_650 = 650 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_651 = 651 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_652 = 652 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_653 = 653 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_654 = 654 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_655 = 655 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_656 = 656 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_657 = 657 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_658 = 658 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_659 = 659 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_660 = 660 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_661 = 661 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_662 = 662 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_663 = 663 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_664 = 664 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_665 = 665 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_666 = 666 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_667 = 667 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_668 = 668 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_669 = 669 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_670 = 670 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_671 = 671 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_672 = 672 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_673 = 673 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_674 = 674 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_675 = 675 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_676 = 676 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_677 = 677 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_678 = 678 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_679 = 679 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_680 = 680 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_681 = 681 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_682 = 682 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_683 = 683 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_684 = 684 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_685 = 685 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_686 = 686 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_687 = 687 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_688 = 688 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_689 = 689 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_690 = 690 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_691 = 691 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_692 = 692 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_693 = 693 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_694 = 694 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_695 = 695 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_696 = 696 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_697 = 697 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_698 = 698 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_699 = 699 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_700 = 700 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_701 = 701 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_702 = 702 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_703 = 703 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_704 = 704 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_705 = 705 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_706 = 706 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_707 = 707 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_708 = 708 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_709 = 709 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_710 = 710 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_711 = 711 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_712 = 712 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_713 = 713 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_714 = 714 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_715 = 715 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_716 = 716 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_717 = 717 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_718 = 718 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_719 = 719 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_720 = 720 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_721 = 721 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_722 = 722 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_723 = 723 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_724 = 724 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_725 = 725 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_726 = 726 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_727 = 727 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_728 = 728 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_729 = 729 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_730 = 730 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_731 = 731 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_732 = 732 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_733 = 733 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_734 = 734 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_735 = 735 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_736 = 736 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_737 = 737 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_738 = 738 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_739 = 739 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_740 = 740 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_741 = 741 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_742 = 742 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_743 = 743 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_744 = 744 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_745 = 745 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_746 = 746 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_747 = 747 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_748 = 748 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_749 = 749 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_750 = 750 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_751 = 751 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_752 = 752 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_753 = 753 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_754 = 754 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_755 = 755 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_756 = 756 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_757 = 757 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_758 = 758 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_759 = 759 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_760 = 760 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_761 = 761 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_762 = 762 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_763 = 763 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_764 = 764 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_765 = 765 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_766 = 766 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_767 = 767 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_768 = 768 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_769 = 769 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_770 = 770 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_771 = 771 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_772 = 772 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_773 = 773 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_774 = 774 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_775 = 775 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_776 = 776 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_777 = 777 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_778 = 778 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_779 = 779 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_780 = 780 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_781 = 781 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_782 = 782 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_783 = 783 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_784 = 784 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_785 = 785 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_786 = 786 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_787 = 787 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_788 = 788 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_789 = 789 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_790 = 790 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_791 = 791 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_792 = 792 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_793 = 793 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_794 = 794 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_795 = 795 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_796 = 796 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_797 = 797 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_798 = 798 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_799 = 799 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_800 = 800 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_801 = 801 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_802 = 802 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_803 = 803 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_804 = 804 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_805 = 805 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_806 = 806 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_807 = 807 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_808 = 808 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_809 = 809 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_810 = 810 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_811 = 811 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_812 = 812 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_813 = 813 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_814 = 814 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_815 = 815 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_816 = 816 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_817 = 817 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_818 = 818 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_819 = 819 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_820 = 820 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_821 = 821 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_822 = 822 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_823 = 823 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_824 = 824 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_825 = 825 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_826 = 826 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_827 = 827 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_828 = 828 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_829 = 829 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_830 = 830 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_831 = 831 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_832 = 832 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_833 = 833 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_834 = 834 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_835 = 835 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_836 = 836 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_837 = 837 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_838 = 838 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_839 = 839 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_840 = 840 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_841 = 841 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_842 = 842 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_843 = 843 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_844 = 844 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_845 = 845 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_846 = 846 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_847 = 847 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_848 = 848 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_849 = 849 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_850 = 850 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_851 = 851 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_852 = 852 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_853 = 853 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_854 = 854 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_855 = 855 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_856 = 856 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_857 = 857 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_858 = 858 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_859 = 859 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_860 = 860 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_861 = 861 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_862 = 862 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_863 = 863 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_864 = 864 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_865 = 865 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_866 = 866 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_867 = 867 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_868 = 868 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_869 = 869 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_870 = 870 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_871 = 871 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_872 = 872 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_873 = 873 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_874 = 874 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_875 = 875 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_876 = 876 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_877 = 877 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_878 = 878 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_879 = 879 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_880 = 880 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_881 = 881 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_882 = 882 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_883 = 883 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_884 = 884 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_885 = 885 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_886 = 886 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_887 = 887 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_888 = 888 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_889 = 889 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_890 = 890 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_891 = 891 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_892 = 892 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_893 = 893 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_894 = 894 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_895 = 895 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_896 = 896 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_897 = 897 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_898 = 898 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_899 = 899 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_900 = 900 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_901 = 901 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_902 = 902 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_903 = 903 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_904 = 904 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_905 = 905 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_906 = 906 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_907 = 907 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_908 = 908 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_909 = 909 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_910 = 910 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_911 = 911 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_912 = 912 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_913 = 913 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_914 = 914 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_915 = 915 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_916 = 916 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_917 = 917 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_918 = 918 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_919 = 919 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_920 = 920 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_921 = 921 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_922 = 922 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_923 = 923 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_924 = 924 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_925 = 925 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_926 = 926 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_927 = 927 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_928 = 928 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_929 = 929 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_930 = 930 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_931 = 931 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_932 = 932 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_933 = 933 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_934 = 934 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_935 = 935 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_936 = 936 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_937 = 937 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_938 = 938 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_939 = 939 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_940 = 940 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_941 = 941 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_942 = 942 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_943 = 943 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_944 = 944 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_945 = 945 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_946 = 946 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_947 = 947 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_948 = 948 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_949 = 949 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_950 = 950 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_951 = 951 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_952 = 952 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_953 = 953 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_954 = 954 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_955 = 955 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_956 = 956 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_957 = 957 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_958 = 958 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_959 = 959 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_960 = 960 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_961 = 961 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_962 = 962 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_963 = 963 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_964 = 964 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_965 = 965 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_966 = 966 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_967 = 967 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_968 = 968 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_969 = 969 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_970 = 970 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_971 = 971 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_972 = 972 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_973 = 973 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_974 = 974 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_975 = 975 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_976 = 976 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_977 = 977 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_978 = 978 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_979 = 979 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_980 = 980 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_981 = 981 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_982 = 982 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_983 = 983 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_984 = 984 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_985 = 985 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_986 = 986 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_987 = 987 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_988 = 988 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_989 = 989 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_990 = 990 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_991 = 991 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_992 = 992 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_993 = 993 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_994 = 994 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_995 = 995 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_996 = 996 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_997 = 997 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_998 = 998 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_999 = 999 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n  optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1000 = 1000 [default=\"long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\"];\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// A proto file which is imported by unittest.proto to test importing.\n\n\n// We don't put this in a package within proto2 because we need to make sure\n// that the generated code doesn't depend on being in the proto2 namespace.\n// In test_util.h we do\n// \"using namespace unittest_import = protobuf_unittest_import\".\npackage protobuf_unittest_import;\n\noption optimize_for = SPEED;\n\n// Excercise the java_package option.\noption java_package = \"com.google.protobuf.test\";\n\n// Do not set a java_outer_classname here to verify that Proto2 works without\n// one.\n\nmessage ImportMessage {\n  optional int32 d = 1;\n}\n\nenum ImportEnum {\n  IMPORT_FOO = 7;\n  IMPORT_BAR = 8;\n  IMPORT_BAZ = 9;\n}\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import_lite.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// This is like unittest_import.proto but with optimize_for = LITE_RUNTIME.\n\npackage protobuf_unittest_import;\n\noption optimize_for = LITE_RUNTIME;\n\noption java_package = \"com.google.protobuf\";\n\nmessage ImportMessageLite {\n  optional int32 d = 1;\n}\n\nenum ImportEnumLite {\n  IMPORT_LITE_FOO = 7;\n  IMPORT_LITE_BAR = 8;\n  IMPORT_LITE_BAZ = 9;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// This is like unittest.proto but with optimize_for = LITE_RUNTIME.\n\npackage protobuf_unittest;\n\nimport \"google/protobuf/unittest_import_lite.proto\";\n\noption optimize_for = LITE_RUNTIME;\n\noption java_package = \"com.google.protobuf\";\n\n// Same as TestAllTypes but with the lite runtime.\nmessage TestAllTypesLite {\n  message NestedMessage {\n    optional int32 bb = 1;\n  }\n\n  enum NestedEnum {\n    FOO = 1;\n    BAR = 2;\n    BAZ = 3;\n  }\n\n  // Singular\n  optional    int32 optional_int32    =  1;\n  optional    int64 optional_int64    =  2;\n  optional   uint32 optional_uint32   =  3;\n  optional   uint64 optional_uint64   =  4;\n  optional   sint32 optional_sint32   =  5;\n  optional   sint64 optional_sint64   =  6;\n  optional  fixed32 optional_fixed32  =  7;\n  optional  fixed64 optional_fixed64  =  8;\n  optional sfixed32 optional_sfixed32 =  9;\n  optional sfixed64 optional_sfixed64 = 10;\n  optional    float optional_float    = 11;\n  optional   double optional_double   = 12;\n  optional     bool optional_bool     = 13;\n  optional   string optional_string   = 14;\n  optional    bytes optional_bytes    = 15;\n\n  optional group OptionalGroup = 16 {\n    optional int32 a = 17;\n  }\n\n  optional NestedMessage      optional_nested_message  = 18;\n  optional ForeignMessageLite optional_foreign_message = 19;\n  optional protobuf_unittest_import.ImportMessageLite\n    optional_import_message = 20;\n\n  optional NestedEnum      optional_nested_enum     = 21;\n  optional ForeignEnumLite optional_foreign_enum    = 22;\n  optional protobuf_unittest_import.ImportEnumLite optional_import_enum = 23;\n\n  optional string optional_string_piece = 24 [ctype=STRING_PIECE];\n  optional string optional_cord = 25 [ctype=CORD];\n\n  // Repeated\n  repeated    int32 repeated_int32    = 31;\n  repeated    int64 repeated_int64    = 32;\n  repeated   uint32 repeated_uint32   = 33;\n  repeated   uint64 repeated_uint64   = 34;\n  repeated   sint32 repeated_sint32   = 35;\n  repeated   sint64 repeated_sint64   = 36;\n  repeated  fixed32 repeated_fixed32  = 37;\n  repeated  fixed64 repeated_fixed64  = 38;\n  repeated sfixed32 repeated_sfixed32 = 39;\n  repeated sfixed64 repeated_sfixed64 = 40;\n  repeated    float repeated_float    = 41;\n  repeated   double repeated_double   = 42;\n  repeated     bool repeated_bool     = 43;\n  repeated   string repeated_string   = 44;\n  repeated    bytes repeated_bytes    = 45;\n\n  repeated group RepeatedGroup = 46 {\n    optional int32 a = 47;\n  }\n\n  repeated NestedMessage      repeated_nested_message  = 48;\n  repeated ForeignMessageLite repeated_foreign_message = 49;\n  repeated protobuf_unittest_import.ImportMessageLite\n    repeated_import_message = 50;\n\n  repeated NestedEnum      repeated_nested_enum  = 51;\n  repeated ForeignEnumLite repeated_foreign_enum = 52;\n  repeated protobuf_unittest_import.ImportEnumLite repeated_import_enum = 53;\n\n  repeated string repeated_string_piece = 54 [ctype=STRING_PIECE];\n  repeated string repeated_cord = 55 [ctype=CORD];\n\n  // Singular with defaults\n  optional    int32 default_int32    = 61 [default =  41    ];\n  optional    int64 default_int64    = 62 [default =  42    ];\n  optional   uint32 default_uint32   = 63 [default =  43    ];\n  optional   uint64 default_uint64   = 64 [default =  44    ];\n  optional   sint32 default_sint32   = 65 [default = -45    ];\n  optional   sint64 default_sint64   = 66 [default =  46    ];\n  optional  fixed32 default_fixed32  = 67 [default =  47    ];\n  optional  fixed64 default_fixed64  = 68 [default =  48    ];\n  optional sfixed32 default_sfixed32 = 69 [default =  49    ];\n  optional sfixed64 default_sfixed64 = 70 [default = -50    ];\n  optional    float default_float    = 71 [default =  51.5  ];\n  optional   double default_double   = 72 [default =  52e3  ];\n  optional     bool default_bool     = 73 [default = true   ];\n  optional   string default_string   = 74 [default = \"hello\"];\n  optional    bytes default_bytes    = 75 [default = \"world\"];\n\n  optional NestedEnum default_nested_enum = 81 [default = BAR];\n  optional ForeignEnumLite default_foreign_enum = 82\n      [default = FOREIGN_LITE_BAR];\n  optional protobuf_unittest_import.ImportEnumLite\n      default_import_enum = 83 [default = IMPORT_LITE_BAR];\n\n  optional string default_string_piece = 84 [ctype=STRING_PIECE,default=\"abc\"];\n  optional string default_cord = 85 [ctype=CORD,default=\"123\"];\n}\n\nmessage ForeignMessageLite {\n  optional int32 c = 1;\n}\n\nenum ForeignEnumLite {\n  FOREIGN_LITE_FOO = 4;\n  FOREIGN_LITE_BAR = 5;\n  FOREIGN_LITE_BAZ = 6;\n}\n\nmessage TestPackedTypesLite {\n  repeated    int32 packed_int32    =  90 [packed = true];\n  repeated    int64 packed_int64    =  91 [packed = true];\n  repeated   uint32 packed_uint32   =  92 [packed = true];\n  repeated   uint64 packed_uint64   =  93 [packed = true];\n  repeated   sint32 packed_sint32   =  94 [packed = true];\n  repeated   sint64 packed_sint64   =  95 [packed = true];\n  repeated  fixed32 packed_fixed32  =  96 [packed = true];\n  repeated  fixed64 packed_fixed64  =  97 [packed = true];\n  repeated sfixed32 packed_sfixed32 =  98 [packed = true];\n  repeated sfixed64 packed_sfixed64 =  99 [packed = true];\n  repeated    float packed_float    = 100 [packed = true];\n  repeated   double packed_double   = 101 [packed = true];\n  repeated     bool packed_bool     = 102 [packed = true];\n  repeated ForeignEnumLite packed_enum  = 103 [packed = true];\n}\n\nmessage TestAllExtensionsLite {\n  extensions 1 to max;\n}\n\nextend TestAllExtensionsLite {\n  // Singular\n  optional    int32 optional_int32_extension_lite    =  1;\n  optional    int64 optional_int64_extension_lite    =  2;\n  optional   uint32 optional_uint32_extension_lite   =  3;\n  optional   uint64 optional_uint64_extension_lite   =  4;\n  optional   sint32 optional_sint32_extension_lite   =  5;\n  optional   sint64 optional_sint64_extension_lite   =  6;\n  optional  fixed32 optional_fixed32_extension_lite  =  7;\n  optional  fixed64 optional_fixed64_extension_lite  =  8;\n  optional sfixed32 optional_sfixed32_extension_lite =  9;\n  optional sfixed64 optional_sfixed64_extension_lite = 10;\n  optional    float optional_float_extension_lite    = 11;\n  optional   double optional_double_extension_lite   = 12;\n  optional     bool optional_bool_extension_lite     = 13;\n  optional   string optional_string_extension_lite   = 14;\n  optional    bytes optional_bytes_extension_lite    = 15;\n\n  optional group OptionalGroup_extension_lite = 16 {\n    optional int32 a = 17;\n  }\n\n  optional TestAllTypesLite.NestedMessage optional_nested_message_extension_lite\n      = 18;\n  optional ForeignMessageLite optional_foreign_message_extension_lite = 19;\n  optional protobuf_unittest_import.ImportMessageLite\n    optional_import_message_extension_lite = 20;\n\n  optional TestAllTypesLite.NestedEnum optional_nested_enum_extension_lite = 21;\n  optional ForeignEnumLite optional_foreign_enum_extension_lite = 22;\n  optional protobuf_unittest_import.ImportEnumLite\n    optional_import_enum_extension_lite = 23;\n\n  optional string optional_string_piece_extension_lite = 24\n      [ctype=STRING_PIECE];\n  optional string optional_cord_extension_lite = 25 [ctype=CORD];\n\n  // Repeated\n  repeated    int32 repeated_int32_extension_lite    = 31;\n  repeated    int64 repeated_int64_extension_lite    = 32;\n  repeated   uint32 repeated_uint32_extension_lite   = 33;\n  repeated   uint64 repeated_uint64_extension_lite   = 34;\n  repeated   sint32 repeated_sint32_extension_lite   = 35;\n  repeated   sint64 repeated_sint64_extension_lite   = 36;\n  repeated  fixed32 repeated_fixed32_extension_lite  = 37;\n  repeated  fixed64 repeated_fixed64_extension_lite  = 38;\n  repeated sfixed32 repeated_sfixed32_extension_lite = 39;\n  repeated sfixed64 repeated_sfixed64_extension_lite = 40;\n  repeated    float repeated_float_extension_lite    = 41;\n  repeated   double repeated_double_extension_lite   = 42;\n  repeated     bool repeated_bool_extension_lite     = 43;\n  repeated   string repeated_string_extension_lite   = 44;\n  repeated    bytes repeated_bytes_extension_lite    = 45;\n\n  repeated group RepeatedGroup_extension_lite = 46 {\n    optional int32 a = 47;\n  }\n\n  repeated TestAllTypesLite.NestedMessage repeated_nested_message_extension_lite\n      = 48;\n  repeated ForeignMessageLite repeated_foreign_message_extension_lite = 49;\n  repeated protobuf_unittest_import.ImportMessageLite\n    repeated_import_message_extension_lite = 50;\n\n  repeated TestAllTypesLite.NestedEnum repeated_nested_enum_extension_lite = 51;\n  repeated ForeignEnumLite repeated_foreign_enum_extension_lite = 52;\n  repeated protobuf_unittest_import.ImportEnumLite\n    repeated_import_enum_extension_lite = 53;\n\n  repeated string repeated_string_piece_extension_lite = 54\n      [ctype=STRING_PIECE];\n  repeated string repeated_cord_extension_lite = 55 [ctype=CORD];\n\n  // Singular with defaults\n  optional    int32 default_int32_extension_lite    = 61 [default =  41    ];\n  optional    int64 default_int64_extension_lite    = 62 [default =  42    ];\n  optional   uint32 default_uint32_extension_lite   = 63 [default =  43    ];\n  optional   uint64 default_uint64_extension_lite   = 64 [default =  44    ];\n  optional   sint32 default_sint32_extension_lite   = 65 [default = -45    ];\n  optional   sint64 default_sint64_extension_lite   = 66 [default =  46    ];\n  optional  fixed32 default_fixed32_extension_lite  = 67 [default =  47    ];\n  optional  fixed64 default_fixed64_extension_lite  = 68 [default =  48    ];\n  optional sfixed32 default_sfixed32_extension_lite = 69 [default =  49    ];\n  optional sfixed64 default_sfixed64_extension_lite = 70 [default = -50    ];\n  optional    float default_float_extension_lite    = 71 [default =  51.5  ];\n  optional   double default_double_extension_lite   = 72 [default =  52e3  ];\n  optional     bool default_bool_extension_lite     = 73 [default = true   ];\n  optional   string default_string_extension_lite   = 74 [default = \"hello\"];\n  optional    bytes default_bytes_extension_lite    = 75 [default = \"world\"];\n\n  optional TestAllTypesLite.NestedEnum\n    default_nested_enum_extension_lite = 81 [default = BAR];\n  optional ForeignEnumLite\n    default_foreign_enum_extension_lite = 82 [default = FOREIGN_LITE_BAR];\n  optional protobuf_unittest_import.ImportEnumLite\n    default_import_enum_extension_lite = 83 [default = IMPORT_LITE_BAR];\n\n  optional string default_string_piece_extension_lite = 84 [ctype=STRING_PIECE,\n                                                            default=\"abc\"];\n  optional string default_cord_extension_lite = 85 [ctype=CORD, default=\"123\"];\n}\n\nmessage TestPackedExtensionsLite {\n  extensions 1 to max;\n}\n\nextend TestPackedExtensionsLite {\n  repeated    int32 packed_int32_extension_lite    =  90 [packed = true];\n  repeated    int64 packed_int64_extension_lite    =  91 [packed = true];\n  repeated   uint32 packed_uint32_extension_lite   =  92 [packed = true];\n  repeated   uint64 packed_uint64_extension_lite   =  93 [packed = true];\n  repeated   sint32 packed_sint32_extension_lite   =  94 [packed = true];\n  repeated   sint64 packed_sint64_extension_lite   =  95 [packed = true];\n  repeated  fixed32 packed_fixed32_extension_lite  =  96 [packed = true];\n  repeated  fixed64 packed_fixed64_extension_lite  =  97 [packed = true];\n  repeated sfixed32 packed_sfixed32_extension_lite =  98 [packed = true];\n  repeated sfixed64 packed_sfixed64_extension_lite =  99 [packed = true];\n  repeated    float packed_float_extension_lite    = 100 [packed = true];\n  repeated   double packed_double_extension_lite   = 101 [packed = true];\n  repeated     bool packed_bool_extension_lite     = 102 [packed = true];\n  repeated ForeignEnumLite packed_enum_extension_lite = 103 [packed = true];\n}\n\nmessage TestNestedExtensionLite {\n  extend TestAllExtensionsLite {\n    optional int32 nested_extension = 12345;\n  }\n}\n\n// Test that deprecated fields work.  We only verify that they compile (at one\n// point this failed).\nmessage TestDeprecatedLite {\n  optional int32 deprecated_field = 1 [deprecated = true];\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//\n// Tests that a \"lite\" message can import a regular message.\n\npackage protobuf_unittest;\n\nimport \"google/protobuf/unittest.proto\";\n\noption optimize_for = LITE_RUNTIME;\n\nmessage TestLiteImportsNonlite {\n  optional TestAllTypes message = 1;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_mset.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This file contains messages for testing message_set_wire_format.\n\npackage protobuf_unittest;\n\noption optimize_for = SPEED;\n\n// A message with message_set_wire_format.\nmessage TestMessageSet {\n  option message_set_wire_format = true;\n  extensions 4 to max;\n}\n\nmessage TestMessageSetContainer {\n  optional TestMessageSet message_set = 1;\n}\n\nmessage TestMessageSetExtension1 {\n  extend TestMessageSet {\n    optional TestMessageSetExtension1 message_set_extension = 1545008;\n  }\n  optional int32 i = 15;\n}\n\nmessage TestMessageSetExtension2 {\n  extend TestMessageSet {\n    optional TestMessageSetExtension2 message_set_extension = 1547769;\n  }\n  optional string str = 25;\n}\n\n// MessageSet wire format is equivalent to this.\nmessage RawMessageSet {\n  repeated group Item = 1 {\n    required int32 type_id = 2;\n    required bytes message = 3;\n  }\n}\n\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_no_generic_services.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n\npackage google.protobuf.no_generic_services_test;\n\n// *_generic_services are false by default.\n\nmessage TestMessage {\n  optional int32 a = 1;\n  extensions 1000 to max;\n}\n\nenum TestEnum {\n  FOO = 1;\n}\n\nextend TestMessage {\n  optional int32 test_extension = 1000;\n}\n\nservice TestService {\n  rpc Foo(TestMessage) returns(TestMessage);\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_optimize_for.proto",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// A proto file which uses optimize_for = CODE_SIZE.\n\nimport \"google/protobuf/unittest.proto\";\n\npackage protobuf_unittest;\n\noption optimize_for = CODE_SIZE;\n\nmessage TestOptimizedForSize {\n  optional int32 i = 1;\n  optional ForeignMessage msg = 19;\n\n  extensions 1000 to max;\n\n  extend TestOptimizedForSize {\n    optional int32 test_extension = 1234;\n    optional TestRequiredOptimizedForSize test_extension2 = 1235;\n  }\n}\n\nmessage TestRequiredOptimizedForSize {\n  required int32 x = 1;\n}\n \nmessage TestOptionalOptimizedForSize {\n  optional TestRequiredOptimizedForSize o = 1;\n}\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/unknown_field_set.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/wire_format.h>\n\nnamespace google {\nnamespace protobuf {\n\nUnknownFieldSet::UnknownFieldSet()\n  : fields_(NULL) {}\n\nUnknownFieldSet::~UnknownFieldSet() {\n  Clear();\n  delete fields_;\n}\n\nvoid UnknownFieldSet::ClearFallback() {\n  GOOGLE_DCHECK(fields_ != NULL);\n  for (int i = 0; i < fields_->size(); i++) {\n    (*fields_)[i].Delete();\n  }\n  fields_->clear();\n}\n\nvoid UnknownFieldSet::MergeFrom(const UnknownFieldSet& other) {\n  for (int i = 0; i < other.field_count(); i++) {\n    AddField(other.field(i));\n  }\n}\n\nint UnknownFieldSet::SpaceUsedExcludingSelf() const {\n  if (fields_ == NULL) return 0;\n\n  int total_size = sizeof(*fields_) + sizeof(UnknownField) * fields_->size();\n  for (int i = 0; i < fields_->size(); i++) {\n    const UnknownField& field = (*fields_)[i];\n    switch (field.type()) {\n      case UnknownField::TYPE_LENGTH_DELIMITED:\n        total_size += sizeof(*field.length_delimited_) +\n          internal::StringSpaceUsedExcludingSelf(*field.length_delimited_);\n        break;\n      case UnknownField::TYPE_GROUP:\n        total_size += field.group_->SpaceUsed();\n        break;\n      default:\n        break;\n    }\n  }\n  return total_size;\n}\n\nint UnknownFieldSet::SpaceUsed() const {\n  return sizeof(*this) + SpaceUsedExcludingSelf();\n}\n\nvoid UnknownFieldSet::AddVarint(int number, uint64 value) {\n  if (fields_ == NULL) fields_ = new vector<UnknownField>;\n  UnknownField field;\n  field.number_ = number;\n  field.type_ = UnknownField::TYPE_VARINT;\n  field.varint_ = value;\n  fields_->push_back(field);\n}\n\nvoid UnknownFieldSet::AddFixed32(int number, uint32 value) {\n  if (fields_ == NULL) fields_ = new vector<UnknownField>;\n  UnknownField field;\n  field.number_ = number;\n  field.type_ = UnknownField::TYPE_FIXED32;\n  field.fixed32_ = value;\n  fields_->push_back(field);\n}\n\nvoid UnknownFieldSet::AddFixed64(int number, uint64 value) {\n  if (fields_ == NULL) fields_ = new vector<UnknownField>;\n  UnknownField field;\n  field.number_ = number;\n  field.type_ = UnknownField::TYPE_FIXED64;\n  field.fixed64_ = value;\n  fields_->push_back(field);\n}\n\nstring* UnknownFieldSet::AddLengthDelimited(int number) {\n  if (fields_ == NULL) fields_ = new vector<UnknownField>;\n  UnknownField field;\n  field.number_ = number;\n  field.type_ = UnknownField::TYPE_LENGTH_DELIMITED;\n  field.length_delimited_ = new string;\n  fields_->push_back(field);\n  return field.length_delimited_;\n}\n\nUnknownFieldSet* UnknownFieldSet::AddGroup(int number) {\n  if (fields_ == NULL) fields_ = new vector<UnknownField>;\n  UnknownField field;\n  field.number_ = number;\n  field.type_ = UnknownField::TYPE_GROUP;\n  field.group_ = new UnknownFieldSet;\n  fields_->push_back(field);\n  return field.group_;\n}\n\nvoid UnknownFieldSet::AddField(const UnknownField& field) {\n  if (fields_ == NULL) fields_ = new vector<UnknownField>;\n  fields_->push_back(field);\n  fields_->back().DeepCopy();\n}\n\nbool UnknownFieldSet::MergeFromCodedStream(io::CodedInputStream* input) {\n\n  UnknownFieldSet other;\n  if (internal::WireFormat::SkipMessage(input, &other) &&\n                                  input->ConsumedEntireMessage()) {\n    MergeFrom(other);\n    return true;\n  } else {\n    return false;\n  }\n}\n\nbool UnknownFieldSet::ParseFromCodedStream(io::CodedInputStream* input) {\n  Clear();\n  return MergeFromCodedStream(input);\n}\n\nbool UnknownFieldSet::ParseFromZeroCopyStream(io::ZeroCopyInputStream* input) {\n  io::CodedInputStream coded_input(input);\n  return ParseFromCodedStream(&coded_input) &&\n    coded_input.ConsumedEntireMessage();\n}\n\nbool UnknownFieldSet::ParseFromArray(const void* data, int size) {\n  io::ArrayInputStream input(data, size);\n  return ParseFromZeroCopyStream(&input);\n}\n\nvoid UnknownField::Delete() {\n  switch (type()) {\n    case UnknownField::TYPE_LENGTH_DELIMITED:\n      delete length_delimited_;\n      break;\n    case UnknownField::TYPE_GROUP:\n      delete group_;\n      break;\n    default:\n      break;\n  }\n}\n\nvoid UnknownField::DeepCopy() {\n  switch (type()) {\n    case UnknownField::TYPE_LENGTH_DELIMITED:\n      length_delimited_ = new string(*length_delimited_);\n      break;\n    case UnknownField::TYPE_GROUP: {\n      UnknownFieldSet* group = new UnknownFieldSet;\n      group->MergeFrom(*group_);\n      group_ = group;\n      break;\n    }\n    default:\n      break;\n  }\n}\n\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// Contains classes used to keep track of unrecognized fields seen while\n// parsing a protocol message.\n\n#ifndef GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__\n#define GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__\n\n#include <string>\n#include <vector>\n#include <google/protobuf/repeated_field.h>\n\nnamespace google {\nnamespace protobuf {\n\nclass Message;                      // message.h\nclass UnknownField;                 // below\n\n// An UnknownFieldSet contains fields that were encountered while parsing a\n// message but were not defined by its type.  Keeping track of these can be\n// useful, especially in that they may be written if the message is serialized\n// again without being cleared in between.  This means that software which\n// simply receives messages and forwards them to other servers does not need\n// to be updated every time a new field is added to the message definition.\n//\n// To get the UnknownFieldSet attached to any message, call\n// Reflection::GetUnknownFields().\n//\n// This class is necessarily tied to the protocol buffer wire format, unlike\n// the Reflection interface which is independent of any serialization scheme.\nclass LIBPROTOBUF_EXPORT UnknownFieldSet {\n public:\n  UnknownFieldSet();\n  ~UnknownFieldSet();\n\n  // Remove all fields.\n  inline void Clear();\n\n  // Is this set empty?\n  inline bool empty() const;\n\n  // Merge the contents of some other UnknownFieldSet with this one.\n  void MergeFrom(const UnknownFieldSet& other);\n\n  // Swaps the contents of some other UnknownFieldSet with this one.\n  inline void Swap(UnknownFieldSet* x);\n\n  // Computes (an estimate of) the total number of bytes currently used for\n  // storing the unknown fields in memory. Does NOT include\n  // sizeof(*this) in the calculation.\n  int SpaceUsedExcludingSelf() const;\n\n  // Version of SpaceUsed() including sizeof(*this).\n  int SpaceUsed() const;\n\n  // Returns the number of fields present in the UnknownFieldSet.\n  inline int field_count() const;\n  // Get a field in the set, where 0 <= index < field_count().  The fields\n  // appear in the order in which they were added.\n  inline const UnknownField& field(int index) const;\n  // Get a mutable pointer to a field in the set, where\n  // 0 <= index < field_count().  The fields appear in the order in which\n  // they were added.\n  inline UnknownField* mutable_field(int index);\n\n  // Adding fields ---------------------------------------------------\n\n  void AddVarint(int number, uint64 value);\n  void AddFixed32(int number, uint32 value);\n  void AddFixed64(int number, uint64 value);\n  void AddLengthDelimited(int number, const string& value);\n  string* AddLengthDelimited(int number);\n  UnknownFieldSet* AddGroup(int number);\n\n  // Adds an unknown field from another set.\n  void AddField(const UnknownField& field);\n\n  // Parsing helpers -------------------------------------------------\n  // These work exactly like the similarly-named methods of Message.\n\n  bool MergeFromCodedStream(io::CodedInputStream* input);\n  bool ParseFromCodedStream(io::CodedInputStream* input);\n  bool ParseFromZeroCopyStream(io::ZeroCopyInputStream* input);\n  bool ParseFromArray(const void* data, int size);\n  inline bool ParseFromString(const string& data) {\n    return ParseFromArray(data.data(), data.size());\n  }\n\n private:\n  void ClearFallback();\n\n  vector<UnknownField>* fields_;\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(UnknownFieldSet);\n};\n\n// Represents one field in an UnknownFieldSet.\nclass LIBPROTOBUF_EXPORT UnknownField {\n public:\n  enum Type {\n    TYPE_VARINT,\n    TYPE_FIXED32,\n    TYPE_FIXED64,\n    TYPE_LENGTH_DELIMITED,\n    TYPE_GROUP\n  };\n\n  // The field's tag number, as seen on the wire.\n  inline int number() const;\n\n  // The field type.\n  inline Type type() const;\n\n  // Accessors -------------------------------------------------------\n  // Each method works only for UnknownFields of the corresponding type.\n\n  inline uint64 varint() const;\n  inline uint32 fixed32() const;\n  inline uint64 fixed64() const;\n  inline const string& length_delimited() const;\n  inline const UnknownFieldSet& group() const;\n\n  inline void set_varint(uint64 value);\n  inline void set_fixed32(uint32 value);\n  inline void set_fixed64(uint64 value);\n  inline void set_length_delimited(const string& value);\n  inline string* mutable_length_delimited();\n  inline UnknownFieldSet* mutable_group();\n\n private:\n  friend class UnknownFieldSet;\n\n  // If this UnknownField contains a pointer, delete it.\n  void Delete();\n\n  // Make a deep copy of any pointers in this UnknownField.\n  void DeepCopy();\n\n  unsigned int number_ : 29;\n  unsigned int type_   : 3;\n  union {\n    uint64 varint_;\n    uint32 fixed32_;\n    uint64 fixed64_;\n    string* length_delimited_;\n    UnknownFieldSet* group_;\n  };\n};\n\n// ===================================================================\n// inline implementations\n\ninline void UnknownFieldSet::Clear() {\n  if (fields_ != NULL) {\n    ClearFallback();\n  }\n}\n\ninline bool UnknownFieldSet::empty() const {\n  return fields_ == NULL || fields_->empty();\n}\n\ninline void UnknownFieldSet::Swap(UnknownFieldSet* x) {\n  std::swap(fields_, x->fields_);\n}\n\ninline int UnknownFieldSet::field_count() const {\n  return (fields_ == NULL) ? 0 : fields_->size();\n}\ninline const UnknownField& UnknownFieldSet::field(int index) const {\n  return (*fields_)[index];\n}\ninline UnknownField* UnknownFieldSet::mutable_field(int index) {\n  return &(*fields_)[index];\n}\n\ninline void UnknownFieldSet::AddLengthDelimited(\n    int number, const string& value) {\n  AddLengthDelimited(number)->assign(value);\n}\n\ninline int UnknownField::number() const { return number_; }\ninline UnknownField::Type UnknownField::type() const {\n  return static_cast<Type>(type_);\n}\n\ninline uint64 UnknownField::varint () const {\n  GOOGLE_DCHECK_EQ(type_, TYPE_VARINT);\n  return varint_;\n}\ninline uint32 UnknownField::fixed32() const {\n  GOOGLE_DCHECK_EQ(type_, TYPE_FIXED32);\n  return fixed32_;\n}\ninline uint64 UnknownField::fixed64() const {\n  GOOGLE_DCHECK_EQ(type_, TYPE_FIXED64);\n  return fixed64_;\n}\ninline const string& UnknownField::length_delimited() const {\n  GOOGLE_DCHECK_EQ(type_, TYPE_LENGTH_DELIMITED);\n  return *length_delimited_;\n}\ninline const UnknownFieldSet& UnknownField::group() const {\n  GOOGLE_DCHECK_EQ(type_, TYPE_GROUP);\n  return *group_;\n}\n\ninline void UnknownField::set_varint(uint64 value) {\n  GOOGLE_DCHECK_EQ(type_, TYPE_VARINT);\n  varint_ = value;\n}\ninline void UnknownField::set_fixed32(uint32 value) {\n  GOOGLE_DCHECK_EQ(type_, TYPE_FIXED32);\n  fixed32_ = value;\n}\ninline void UnknownField::set_fixed64(uint64 value) {\n  GOOGLE_DCHECK_EQ(type_, TYPE_FIXED64);\n  fixed64_ = value;\n}\ninline void UnknownField::set_length_delimited(const string& value) {\n  GOOGLE_DCHECK_EQ(type_, TYPE_LENGTH_DELIMITED);\n  length_delimited_->assign(value);\n}\ninline string* UnknownField::mutable_length_delimited() {\n  GOOGLE_DCHECK_EQ(type_, TYPE_LENGTH_DELIMITED);\n  return length_delimited_;\n}\ninline UnknownFieldSet* UnknownField::mutable_group() {\n  GOOGLE_DCHECK_EQ(type_, TYPE_GROUP);\n  return group_;\n}\n\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This test is testing a lot more than just the UnknownFieldSet class.  It\n// tests handling of unknown fields throughout the system.\n\n#include <google/protobuf/unknown_field_set.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/unittest.pb.h>\n#include <google/protobuf/test_util.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\nnamespace google {\nnamespace protobuf {\n\nusing internal::WireFormat;\n\nnamespace {\n\nclass UnknownFieldSetTest : public testing::Test {\n protected:\n  virtual void SetUp() {\n    descriptor_ = unittest::TestAllTypes::descriptor();\n    TestUtil::SetAllFields(&all_fields_);\n    all_fields_.SerializeToString(&all_fields_data_);\n    ASSERT_TRUE(empty_message_.ParseFromString(all_fields_data_));\n    unknown_fields_ = empty_message_.mutable_unknown_fields();\n  }\n\n  const UnknownField* GetField(const string& name) {\n    const FieldDescriptor* field = descriptor_->FindFieldByName(name);\n    if (field == NULL) return NULL;\n    for (int i = 0; i < unknown_fields_->field_count(); i++) {\n      if (unknown_fields_->field(i).number() == field->number()) {\n        return &unknown_fields_->field(i);\n      }\n    }\n    return NULL;\n  }\n\n  // Constructs a protocol buffer which contains fields with all the same\n  // numbers as all_fields_data_ except that each field is some other wire\n  // type.\n  string GetBizarroData() {\n    unittest::TestEmptyMessage bizarro_message;\n    UnknownFieldSet* bizarro_unknown_fields =\n      bizarro_message.mutable_unknown_fields();\n    for (int i = 0; i < unknown_fields_->field_count(); i++) {\n      const UnknownField& unknown_field = unknown_fields_->field(i);\n      if (unknown_field.type() == UnknownField::TYPE_VARINT) {\n        bizarro_unknown_fields->AddFixed32(unknown_field.number(), 1);\n      } else {\n        bizarro_unknown_fields->AddVarint(unknown_field.number(), 1);\n      }\n    }\n\n    string data;\n    EXPECT_TRUE(bizarro_message.SerializeToString(&data));\n    return data;\n  }\n\n  const Descriptor* descriptor_;\n  unittest::TestAllTypes all_fields_;\n  string all_fields_data_;\n\n  // An empty message that has been parsed from all_fields_data_.  So, it has\n  // unknown fields of every type.\n  unittest::TestEmptyMessage empty_message_;\n  UnknownFieldSet* unknown_fields_;\n};\n\nTEST_F(UnknownFieldSetTest, AllFieldsPresent) {\n  // All fields of TestAllTypes should be present, in numeric order (because\n  // that's the order we parsed them in).  Fields that are not valid field\n  // numbers of TestAllTypes should NOT be present.\n\n  int pos = 0;\n\n  for (int i = 0; i < 1000; i++) {\n    const FieldDescriptor* field = descriptor_->FindFieldByNumber(i);\n    if (field != NULL) {\n      ASSERT_LT(pos, unknown_fields_->field_count());\n      EXPECT_EQ(i, unknown_fields_->field(pos++).number());\n      if (field->is_repeated()) {\n        // Should have a second instance.\n        ASSERT_LT(pos, unknown_fields_->field_count());\n        EXPECT_EQ(i, unknown_fields_->field(pos++).number());\n      }\n    }\n  }\n  EXPECT_EQ(unknown_fields_->field_count(), pos);\n}\n\nTEST_F(UnknownFieldSetTest, Varint) {\n  const UnknownField* field = GetField(\"optional_int32\");\n  ASSERT_TRUE(field != NULL);\n\n  ASSERT_EQ(UnknownField::TYPE_VARINT, field->type());\n  EXPECT_EQ(all_fields_.optional_int32(), field->varint());\n}\n\nTEST_F(UnknownFieldSetTest, Fixed32) {\n  const UnknownField* field = GetField(\"optional_fixed32\");\n  ASSERT_TRUE(field != NULL);\n\n  ASSERT_EQ(UnknownField::TYPE_FIXED32, field->type());\n  EXPECT_EQ(all_fields_.optional_fixed32(), field->fixed32());\n}\n\nTEST_F(UnknownFieldSetTest, Fixed64) {\n  const UnknownField* field = GetField(\"optional_fixed64\");\n  ASSERT_TRUE(field != NULL);\n\n  ASSERT_EQ(UnknownField::TYPE_FIXED64, field->type());\n  EXPECT_EQ(all_fields_.optional_fixed64(), field->fixed64());\n}\n\nTEST_F(UnknownFieldSetTest, LengthDelimited) {\n  const UnknownField* field = GetField(\"optional_string\");\n  ASSERT_TRUE(field != NULL);\n\n  ASSERT_EQ(UnknownField::TYPE_LENGTH_DELIMITED, field->type());\n  EXPECT_EQ(all_fields_.optional_string(), field->length_delimited());\n}\n\nTEST_F(UnknownFieldSetTest, Group) {\n  const UnknownField* field = GetField(\"optionalgroup\");\n  ASSERT_TRUE(field != NULL);\n\n  ASSERT_EQ(UnknownField::TYPE_GROUP, field->type());\n  ASSERT_EQ(1, field->group().field_count());\n\n  const UnknownField& nested_field = field->group().field(0);\n  const FieldDescriptor* nested_field_descriptor =\n    unittest::TestAllTypes::OptionalGroup::descriptor()->FindFieldByName(\"a\");\n  ASSERT_TRUE(nested_field_descriptor != NULL);\n\n  EXPECT_EQ(nested_field_descriptor->number(), nested_field.number());\n  ASSERT_EQ(UnknownField::TYPE_VARINT, nested_field.type());\n  EXPECT_EQ(all_fields_.optionalgroup().a(), nested_field.varint());\n}\n\nTEST_F(UnknownFieldSetTest, SerializeFastAndSlowAreEquivalent) {\n  int size = WireFormat::ComputeUnknownFieldsSize(\n      empty_message_.unknown_fields());\n  string slow_buffer;\n  string fast_buffer;\n  slow_buffer.resize(size);\n  fast_buffer.resize(size);\n\n  uint8* target = reinterpret_cast<uint8*>(string_as_array(&fast_buffer));\n  uint8* result = WireFormat::SerializeUnknownFieldsToArray(\n          empty_message_.unknown_fields(), target);\n  EXPECT_EQ(size, result - target);\n\n  {\n    io::ArrayOutputStream raw_stream(string_as_array(&slow_buffer), size, 1);\n    io::CodedOutputStream output_stream(&raw_stream);\n    WireFormat::SerializeUnknownFields(empty_message_.unknown_fields(),\n                                       &output_stream);\n    ASSERT_FALSE(output_stream.HadError());\n  }\n  EXPECT_TRUE(fast_buffer == slow_buffer);\n}\n\nTEST_F(UnknownFieldSetTest, Serialize) {\n  // Check that serializing the UnknownFieldSet produces the original data\n  // again.\n\n  string data;\n  empty_message_.SerializeToString(&data);\n\n  // Don't use EXPECT_EQ because we don't want to dump raw binary data to\n  // stdout.\n  EXPECT_TRUE(data == all_fields_data_);\n}\n\nTEST_F(UnknownFieldSetTest, ParseViaReflection) {\n  // Make sure fields are properly parsed to the UnknownFieldSet when parsing\n  // via reflection.\n\n  unittest::TestEmptyMessage message;\n  io::ArrayInputStream raw_input(all_fields_data_.data(),\n                                 all_fields_data_.size());\n  io::CodedInputStream input(&raw_input);\n  ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &message));\n\n  EXPECT_EQ(message.DebugString(), empty_message_.DebugString());\n}\n\nTEST_F(UnknownFieldSetTest, SerializeViaReflection) {\n  // Make sure fields are properly written from the UnknownFieldSet when\n  // serializing via reflection.\n\n  string data;\n\n  {\n    io::StringOutputStream raw_output(&data);\n    io::CodedOutputStream output(&raw_output);\n    int size = WireFormat::ByteSize(empty_message_);\n    WireFormat::SerializeWithCachedSizes(empty_message_, size, &output);\n    ASSERT_FALSE(output.HadError());\n  }\n\n  // Don't use EXPECT_EQ because we don't want to dump raw binary data to\n  // stdout.\n  EXPECT_TRUE(data == all_fields_data_);\n}\n\nTEST_F(UnknownFieldSetTest, CopyFrom) {\n  unittest::TestEmptyMessage message;\n\n  message.CopyFrom(empty_message_);\n\n  EXPECT_EQ(empty_message_.DebugString(), message.DebugString());\n}\n\nTEST_F(UnknownFieldSetTest, Swap) {\n  unittest::TestEmptyMessage other_message;\n  ASSERT_TRUE(other_message.ParseFromString(GetBizarroData()));\n\n  EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);\n  EXPECT_GT(other_message.unknown_fields().field_count(), 0);\n  const string debug_string = empty_message_.DebugString();\n  const string other_debug_string = other_message.DebugString();\n  EXPECT_NE(debug_string, other_debug_string);\n\n  empty_message_.Swap(&other_message);\n  EXPECT_EQ(debug_string, other_message.DebugString());\n  EXPECT_EQ(other_debug_string, empty_message_.DebugString());\n}\n\nTEST_F(UnknownFieldSetTest, SwapWithSelf) {\n  const string debug_string = empty_message_.DebugString();\n  EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);\n\n  empty_message_.Swap(&empty_message_);\n  EXPECT_GT(empty_message_.unknown_fields().field_count(), 0);\n  EXPECT_EQ(debug_string, empty_message_.DebugString());\n}\n\nTEST_F(UnknownFieldSetTest, MergeFrom) {\n  unittest::TestEmptyMessage source, destination;\n\n  destination.mutable_unknown_fields()->AddVarint(1, 1);\n  destination.mutable_unknown_fields()->AddVarint(3, 2);\n  source.mutable_unknown_fields()->AddVarint(2, 3);\n  source.mutable_unknown_fields()->AddVarint(3, 4);\n\n  destination.MergeFrom(source);\n\n  EXPECT_EQ(\n    // Note:  The ordering of fields here depends on the ordering of adds\n    //   and merging, above.\n    \"1: 1\\n\"\n    \"3: 2\\n\"\n    \"2: 3\\n\"\n    \"3: 4\\n\",\n    destination.DebugString());\n}\n\nTEST_F(UnknownFieldSetTest, Clear) {\n  // Clear the set.\n  empty_message_.Clear();\n  EXPECT_EQ(0, unknown_fields_->field_count());\n}\n\nTEST_F(UnknownFieldSetTest, ParseKnownAndUnknown) {\n  // Test mixing known and unknown fields when parsing.\n\n  unittest::TestEmptyMessage source;\n  source.mutable_unknown_fields()->AddVarint(123456, 654321);\n  string data;\n  ASSERT_TRUE(source.SerializeToString(&data));\n\n  unittest::TestAllTypes destination;\n  ASSERT_TRUE(destination.ParseFromString(all_fields_data_ + data));\n\n  TestUtil::ExpectAllFieldsSet(destination);\n  ASSERT_EQ(1, destination.unknown_fields().field_count());\n  ASSERT_EQ(UnknownField::TYPE_VARINT,\n            destination.unknown_fields().field(0).type());\n  EXPECT_EQ(654321, destination.unknown_fields().field(0).varint());\n}\n\nTEST_F(UnknownFieldSetTest, WrongTypeTreatedAsUnknown) {\n  // Test that fields of the wrong wire type are treated like unknown fields\n  // when parsing.\n\n  unittest::TestAllTypes all_types_message;\n  unittest::TestEmptyMessage empty_message;\n  string bizarro_data = GetBizarroData();\n  ASSERT_TRUE(all_types_message.ParseFromString(bizarro_data));\n  ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));\n\n  // All fields should have been interpreted as unknown, so the debug strings\n  // should be the same.\n  EXPECT_EQ(empty_message.DebugString(), all_types_message.DebugString());\n}\n\nTEST_F(UnknownFieldSetTest, WrongTypeTreatedAsUnknownViaReflection) {\n  // Same as WrongTypeTreatedAsUnknown but via the reflection interface.\n\n  unittest::TestAllTypes all_types_message;\n  unittest::TestEmptyMessage empty_message;\n  string bizarro_data = GetBizarroData();\n  io::ArrayInputStream raw_input(bizarro_data.data(), bizarro_data.size());\n  io::CodedInputStream input(&raw_input);\n  ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &all_types_message));\n  ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));\n\n  EXPECT_EQ(empty_message.DebugString(), all_types_message.DebugString());\n}\n\nTEST_F(UnknownFieldSetTest, UnknownExtensions) {\n  // Make sure fields are properly parsed to the UnknownFieldSet even when\n  // they are declared as extension numbers.\n\n  unittest::TestEmptyMessageWithExtensions message;\n  ASSERT_TRUE(message.ParseFromString(all_fields_data_));\n\n  EXPECT_EQ(message.DebugString(), empty_message_.DebugString());\n}\n\nTEST_F(UnknownFieldSetTest, UnknownExtensionsReflection) {\n  // Same as UnknownExtensions except parsing via reflection.\n\n  unittest::TestEmptyMessageWithExtensions message;\n  io::ArrayInputStream raw_input(all_fields_data_.data(),\n                                 all_fields_data_.size());\n  io::CodedInputStream input(&raw_input);\n  ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &message));\n\n  EXPECT_EQ(message.DebugString(), empty_message_.DebugString());\n}\n\nTEST_F(UnknownFieldSetTest, WrongExtensionTypeTreatedAsUnknown) {\n  // Test that fields of the wrong wire type are treated like unknown fields\n  // when parsing extensions.\n\n  unittest::TestAllExtensions all_extensions_message;\n  unittest::TestEmptyMessage empty_message;\n  string bizarro_data = GetBizarroData();\n  ASSERT_TRUE(all_extensions_message.ParseFromString(bizarro_data));\n  ASSERT_TRUE(empty_message.ParseFromString(bizarro_data));\n\n  // All fields should have been interpreted as unknown, so the debug strings\n  // should be the same.\n  EXPECT_EQ(empty_message.DebugString(), all_extensions_message.DebugString());\n}\n\nTEST_F(UnknownFieldSetTest, UnknownEnumValue) {\n  using unittest::TestAllTypes;\n  using unittest::TestAllExtensions;\n  using unittest::TestEmptyMessage;\n\n  const FieldDescriptor* singular_field =\n    TestAllTypes::descriptor()->FindFieldByName(\"optional_nested_enum\");\n  const FieldDescriptor* repeated_field =\n    TestAllTypes::descriptor()->FindFieldByName(\"repeated_nested_enum\");\n  ASSERT_TRUE(singular_field != NULL);\n  ASSERT_TRUE(repeated_field != NULL);\n\n  string data;\n\n  {\n    TestEmptyMessage empty_message;\n    UnknownFieldSet* unknown_fields = empty_message.mutable_unknown_fields();\n    unknown_fields->AddVarint(singular_field->number(), TestAllTypes::BAR);\n    unknown_fields->AddVarint(singular_field->number(), 5);  // not valid\n    unknown_fields->AddVarint(repeated_field->number(), TestAllTypes::FOO);\n    unknown_fields->AddVarint(repeated_field->number(), 4);  // not valid\n    unknown_fields->AddVarint(repeated_field->number(), TestAllTypes::BAZ);\n    unknown_fields->AddVarint(repeated_field->number(), 6);  // not valid\n    empty_message.SerializeToString(&data);\n  }\n\n  {\n    TestAllTypes message;\n    ASSERT_TRUE(message.ParseFromString(data));\n    EXPECT_EQ(TestAllTypes::BAR, message.optional_nested_enum());\n    ASSERT_EQ(2, message.repeated_nested_enum_size());\n    EXPECT_EQ(TestAllTypes::FOO, message.repeated_nested_enum(0));\n    EXPECT_EQ(TestAllTypes::BAZ, message.repeated_nested_enum(1));\n\n    const UnknownFieldSet& unknown_fields = message.unknown_fields();\n    ASSERT_EQ(3, unknown_fields.field_count());\n\n    EXPECT_EQ(singular_field->number(), unknown_fields.field(0).number());\n    ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(0).type());\n    EXPECT_EQ(5, unknown_fields.field(0).varint());\n\n    EXPECT_EQ(repeated_field->number(), unknown_fields.field(1).number());\n    ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(1).type());\n    EXPECT_EQ(4, unknown_fields.field(1).varint());\n\n    EXPECT_EQ(repeated_field->number(), unknown_fields.field(2).number());\n    ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(2).type());\n    EXPECT_EQ(6, unknown_fields.field(2).varint());\n  }\n\n  {\n    using unittest::optional_nested_enum_extension;\n    using unittest::repeated_nested_enum_extension;\n\n    TestAllExtensions message;\n    ASSERT_TRUE(message.ParseFromString(data));\n    EXPECT_EQ(TestAllTypes::BAR,\n              message.GetExtension(optional_nested_enum_extension));\n    ASSERT_EQ(2, message.ExtensionSize(repeated_nested_enum_extension));\n    EXPECT_EQ(TestAllTypes::FOO,\n              message.GetExtension(repeated_nested_enum_extension, 0));\n    EXPECT_EQ(TestAllTypes::BAZ,\n              message.GetExtension(repeated_nested_enum_extension, 1));\n\n    const UnknownFieldSet& unknown_fields = message.unknown_fields();\n    ASSERT_EQ(3, unknown_fields.field_count());\n\n    EXPECT_EQ(singular_field->number(), unknown_fields.field(0).number());\n    ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(0).type());\n    EXPECT_EQ(5, unknown_fields.field(0).varint());\n\n    EXPECT_EQ(repeated_field->number(), unknown_fields.field(1).number());\n    ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(1).type());\n    EXPECT_EQ(4, unknown_fields.field(1).varint());\n\n    EXPECT_EQ(repeated_field->number(), unknown_fields.field(2).number());\n    ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(2).type());\n    EXPECT_EQ(6, unknown_fields.field(2).varint());\n  }\n}\n\nTEST_F(UnknownFieldSetTest, SpaceUsed) {\n  unittest::TestEmptyMessage empty_message;\n\n  // Make sure an unknown field set has zero space used until a field is\n  // actually added.\n  int base_size = empty_message.SpaceUsed();\n  UnknownFieldSet* unknown_fields = empty_message.mutable_unknown_fields();\n  EXPECT_EQ(base_size, empty_message.SpaceUsed());\n\n  // Make sure each thing we add to the set increases the SpaceUsed().\n  unknown_fields->AddVarint(1, 0);\n  EXPECT_LT(base_size, empty_message.SpaceUsed());\n  base_size = empty_message.SpaceUsed();\n\n  string* str = unknown_fields->AddLengthDelimited(1);\n  EXPECT_LT(base_size, empty_message.SpaceUsed());\n  base_size = empty_message.SpaceUsed();\n\n  str->assign(sizeof(string) + 1, 'x');\n  EXPECT_LT(base_size, empty_message.SpaceUsed());\n  base_size = empty_message.SpaceUsed();\n\n  UnknownFieldSet* group = unknown_fields->AddGroup(1);\n  EXPECT_LT(base_size, empty_message.SpaceUsed());\n  base_size = empty_message.SpaceUsed();\n\n  group->AddVarint(1, 0);\n  EXPECT_LT(base_size, empty_message.SpaceUsed());\n}\n\nTEST_F(UnknownFieldSetTest, Empty) {\n  UnknownFieldSet unknown_fields;\n  EXPECT_TRUE(unknown_fields.empty());\n  unknown_fields.AddVarint(6, 123);\n  EXPECT_FALSE(unknown_fields.empty());\n  unknown_fields.Clear();\n  EXPECT_TRUE(unknown_fields.empty());\n}\n\n}  // namespace\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <stack>\n#include <string>\n#include <vector>\n\n#include <google/protobuf/wire_format.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/wire_format_lite_inl.h>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/unknown_field_set.h>\n\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\n\nusing internal::WireFormatLite;\n\nnamespace {\n\n// This function turns out to be convenient when using some macros later.\ninline int GetEnumNumber(const EnumValueDescriptor* descriptor) {\n  return descriptor->number();\n}\n\n}  // anonymous namespace\n\n// ===================================================================\n\nbool UnknownFieldSetFieldSkipper::SkipField(\n    io::CodedInputStream* input, uint32 tag) {\n  return WireFormat::SkipField(input, tag, unknown_fields_);\n}\n\nbool UnknownFieldSetFieldSkipper::SkipMessage(io::CodedInputStream* input) {\n  return WireFormat::SkipMessage(input, unknown_fields_);\n}\n\nvoid UnknownFieldSetFieldSkipper::SkipUnknownEnum(\n    int field_number, int value) {\n  unknown_fields_->AddVarint(field_number, value);\n}\n\nbool WireFormat::SkipField(io::CodedInputStream* input, uint32 tag,\n                           UnknownFieldSet* unknown_fields) {\n  int number = WireFormatLite::GetTagFieldNumber(tag);\n\n  switch (WireFormatLite::GetTagWireType(tag)) {\n    case WireFormatLite::WIRETYPE_VARINT: {\n      uint64 value;\n      if (!input->ReadVarint64(&value)) return false;\n      if (unknown_fields != NULL) unknown_fields->AddVarint(number, value);\n      return true;\n    }\n    case WireFormatLite::WIRETYPE_FIXED64: {\n      uint64 value;\n      if (!input->ReadLittleEndian64(&value)) return false;\n      if (unknown_fields != NULL) unknown_fields->AddFixed64(number, value);\n      return true;\n    }\n    case WireFormatLite::WIRETYPE_LENGTH_DELIMITED: {\n      uint32 length;\n      if (!input->ReadVarint32(&length)) return false;\n      if (unknown_fields == NULL) {\n        if (!input->Skip(length)) return false;\n      } else {\n        if (!input->ReadString(unknown_fields->AddLengthDelimited(number),\n                               length)) {\n          return false;\n        }\n      }\n      return true;\n    }\n    case WireFormatLite::WIRETYPE_START_GROUP: {\n      if (!input->IncrementRecursionDepth()) return false;\n      if (!SkipMessage(input, (unknown_fields == NULL) ?\n                              NULL : unknown_fields->AddGroup(number))) {\n        return false;\n      }\n      input->DecrementRecursionDepth();\n      // Check that the ending tag matched the starting tag.\n      if (!input->LastTagWas(WireFormatLite::MakeTag(\n          WireFormatLite::GetTagFieldNumber(tag),\n          WireFormatLite::WIRETYPE_END_GROUP))) {\n        return false;\n      }\n      return true;\n    }\n    case WireFormatLite::WIRETYPE_END_GROUP: {\n      return false;\n    }\n    case WireFormatLite::WIRETYPE_FIXED32: {\n      uint32 value;\n      if (!input->ReadLittleEndian32(&value)) return false;\n      if (unknown_fields != NULL) unknown_fields->AddFixed32(number, value);\n      return true;\n    }\n    default: {\n      return false;\n    }\n  }\n}\n\nbool WireFormat::SkipMessage(io::CodedInputStream* input,\n                             UnknownFieldSet* unknown_fields) {\n  while(true) {\n    uint32 tag = input->ReadTag();\n    if (tag == 0) {\n      // End of input.  This is a valid place to end, so return true.\n      return true;\n    }\n\n    WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag);\n\n    if (wire_type == WireFormatLite::WIRETYPE_END_GROUP) {\n      // Must be the end of the message.\n      return true;\n    }\n\n    if (!SkipField(input, tag, unknown_fields)) return false;\n  }\n}\n\nvoid WireFormat::SerializeUnknownFields(const UnknownFieldSet& unknown_fields,\n                                        io::CodedOutputStream* output) {\n  for (int i = 0; i < unknown_fields.field_count(); i++) {\n    const UnknownField& field = unknown_fields.field(i);\n    switch (field.type()) {\n      case UnknownField::TYPE_VARINT:\n        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),\n            WireFormatLite::WIRETYPE_VARINT));\n        output->WriteVarint64(field.varint());\n        break;\n      case UnknownField::TYPE_FIXED32:\n        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),\n            WireFormatLite::WIRETYPE_FIXED32));\n        output->WriteLittleEndian32(field.fixed32());\n        break;\n      case UnknownField::TYPE_FIXED64:\n        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),\n            WireFormatLite::WIRETYPE_FIXED64));\n        output->WriteLittleEndian64(field.fixed64());\n        break;\n      case UnknownField::TYPE_LENGTH_DELIMITED:\n        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),\n            WireFormatLite::WIRETYPE_LENGTH_DELIMITED));\n        output->WriteVarint32(field.length_delimited().size());\n        output->WriteString(field.length_delimited());\n        break;\n      case UnknownField::TYPE_GROUP:\n        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),\n            WireFormatLite::WIRETYPE_START_GROUP));\n        SerializeUnknownFields(field.group(), output);\n        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),\n            WireFormatLite::WIRETYPE_END_GROUP));\n        break;\n    }\n  }\n}\n\nuint8* WireFormat::SerializeUnknownFieldsToArray(\n    const UnknownFieldSet& unknown_fields,\n    uint8* target) {\n  for (int i = 0; i < unknown_fields.field_count(); i++) {\n    const UnknownField& field = unknown_fields.field(i);\n\n    switch (field.type()) {\n      case UnknownField::TYPE_VARINT:\n        target = WireFormatLite::WriteInt64ToArray(\n            field.number(), field.varint(), target);\n        break;\n      case UnknownField::TYPE_FIXED32:\n        target = WireFormatLite::WriteFixed32ToArray(\n            field.number(), field.fixed32(), target);\n        break;\n      case UnknownField::TYPE_FIXED64:\n        target = WireFormatLite::WriteFixed64ToArray(\n            field.number(), field.fixed64(), target);\n        break;\n      case UnknownField::TYPE_LENGTH_DELIMITED:\n        target = WireFormatLite::WriteBytesToArray(\n            field.number(), field.length_delimited(), target);\n        break;\n      case UnknownField::TYPE_GROUP:\n        target = WireFormatLite::WriteTagToArray(\n            field.number(), WireFormatLite::WIRETYPE_START_GROUP, target);\n        target = SerializeUnknownFieldsToArray(field.group(), target);\n        target = WireFormatLite::WriteTagToArray(\n            field.number(), WireFormatLite::WIRETYPE_END_GROUP, target);\n        break;\n    }\n  }\n  return target;\n}\n\nvoid WireFormat::SerializeUnknownMessageSetItems(\n    const UnknownFieldSet& unknown_fields,\n    io::CodedOutputStream* output) {\n  for (int i = 0; i < unknown_fields.field_count(); i++) {\n    const UnknownField& field = unknown_fields.field(i);\n    // The only unknown fields that are allowed to exist in a MessageSet are\n    // messages, which are length-delimited.\n    if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) {\n      const string& data = field.length_delimited();\n\n      // Start group.\n      output->WriteVarint32(WireFormatLite::kMessageSetItemStartTag);\n\n      // Write type ID.\n      output->WriteVarint32(WireFormatLite::kMessageSetTypeIdTag);\n      output->WriteVarint32(field.number());\n\n      // Write message.\n      output->WriteVarint32(WireFormatLite::kMessageSetMessageTag);\n      output->WriteVarint32(data.size());\n      output->WriteString(data);\n\n      // End group.\n      output->WriteVarint32(WireFormatLite::kMessageSetItemEndTag);\n    }\n  }\n}\n\nuint8* WireFormat::SerializeUnknownMessageSetItemsToArray(\n    const UnknownFieldSet& unknown_fields,\n    uint8* target) {\n  for (int i = 0; i < unknown_fields.field_count(); i++) {\n    const UnknownField& field = unknown_fields.field(i);\n\n    // The only unknown fields that are allowed to exist in a MessageSet are\n    // messages, which are length-delimited.\n    if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) {\n      const string& data = field.length_delimited();\n\n      // Start group.\n      target = io::CodedOutputStream::WriteTagToArray(\n          WireFormatLite::kMessageSetItemStartTag, target);\n\n      // Write type ID.\n      target = io::CodedOutputStream::WriteTagToArray(\n          WireFormatLite::kMessageSetTypeIdTag, target);\n      target = io::CodedOutputStream::WriteVarint32ToArray(\n          field.number(), target);\n\n      // Write message.\n      target = io::CodedOutputStream::WriteTagToArray(\n          WireFormatLite::kMessageSetMessageTag, target);\n      target = io::CodedOutputStream::WriteVarint32ToArray(data.size(), target);\n      target = io::CodedOutputStream::WriteStringToArray(data, target);\n\n      // End group.\n      target = io::CodedOutputStream::WriteTagToArray(\n          WireFormatLite::kMessageSetItemEndTag, target);\n    }\n  }\n\n  return target;\n}\n\nint WireFormat::ComputeUnknownFieldsSize(\n    const UnknownFieldSet& unknown_fields) {\n  int size = 0;\n  for (int i = 0; i < unknown_fields.field_count(); i++) {\n    const UnknownField& field = unknown_fields.field(i);\n\n    switch (field.type()) {\n      case UnknownField::TYPE_VARINT:\n        size += io::CodedOutputStream::VarintSize32(\n            WireFormatLite::MakeTag(field.number(),\n            WireFormatLite::WIRETYPE_VARINT));\n        size += io::CodedOutputStream::VarintSize64(field.varint());\n        break;\n      case UnknownField::TYPE_FIXED32:\n        size += io::CodedOutputStream::VarintSize32(\n            WireFormatLite::MakeTag(field.number(),\n            WireFormatLite::WIRETYPE_FIXED32));\n        size += sizeof(int32);\n        break;\n      case UnknownField::TYPE_FIXED64:\n        size += io::CodedOutputStream::VarintSize32(\n            WireFormatLite::MakeTag(field.number(),\n            WireFormatLite::WIRETYPE_FIXED64));\n        size += sizeof(int64);\n        break;\n      case UnknownField::TYPE_LENGTH_DELIMITED:\n        size += io::CodedOutputStream::VarintSize32(\n            WireFormatLite::MakeTag(field.number(),\n            WireFormatLite::WIRETYPE_LENGTH_DELIMITED));\n        size += io::CodedOutputStream::VarintSize32(\n            field.length_delimited().size());\n        size += field.length_delimited().size();\n        break;\n      case UnknownField::TYPE_GROUP:\n        size += io::CodedOutputStream::VarintSize32(\n            WireFormatLite::MakeTag(field.number(),\n            WireFormatLite::WIRETYPE_START_GROUP));\n        size += ComputeUnknownFieldsSize(field.group());\n        size += io::CodedOutputStream::VarintSize32(\n            WireFormatLite::MakeTag(field.number(),\n            WireFormatLite::WIRETYPE_END_GROUP));\n        break;\n    }\n  }\n\n  return size;\n}\n\nint WireFormat::ComputeUnknownMessageSetItemsSize(\n    const UnknownFieldSet& unknown_fields) {\n  int size = 0;\n  for (int i = 0; i < unknown_fields.field_count(); i++) {\n    const UnknownField& field = unknown_fields.field(i);\n\n    // The only unknown fields that are allowed to exist in a MessageSet are\n    // messages, which are length-delimited.\n    if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) {\n      size += WireFormatLite::kMessageSetItemTagsSize;\n      size += io::CodedOutputStream::VarintSize32(field.number());\n      size += io::CodedOutputStream::VarintSize32(\n        field.length_delimited().size());\n      size += field.length_delimited().size();\n    }\n  }\n\n  return size;\n}\n\n// ===================================================================\n\nbool WireFormat::ParseAndMergePartial(io::CodedInputStream* input,\n                                      Message* message) {\n  const Descriptor* descriptor = message->GetDescriptor();\n  const Reflection* message_reflection = message->GetReflection();\n\n  while(true) {\n    uint32 tag = input->ReadTag();\n    if (tag == 0) {\n      // End of input.  This is a valid place to end, so return true.\n      return true;\n    }\n\n    if (WireFormatLite::GetTagWireType(tag) ==\n        WireFormatLite::WIRETYPE_END_GROUP) {\n      // Must be the end of the message.\n      return true;\n    }\n\n    const FieldDescriptor* field = NULL;\n\n    if (descriptor != NULL) {\n      int field_number = WireFormatLite::GetTagFieldNumber(tag);\n      field = descriptor->FindFieldByNumber(field_number);\n\n      // If that failed, check if the field is an extension.\n      if (field == NULL && descriptor->IsExtensionNumber(field_number)) {\n        if (input->GetExtensionPool() == NULL) {\n          field = message_reflection->FindKnownExtensionByNumber(field_number);\n        } else {\n          field = input->GetExtensionPool()\n                       ->FindExtensionByNumber(descriptor, field_number);\n        }\n      }\n\n      // If that failed, but we're a MessageSet, and this is the tag for a\n      // MessageSet item, then parse that.\n      if (field == NULL &&\n          descriptor->options().message_set_wire_format() &&\n          tag == WireFormatLite::kMessageSetItemStartTag) {\n        if (!ParseAndMergeMessageSetItem(input, message)) {\n          return false;\n        }\n        continue;  // Skip ParseAndMergeField(); already taken care of.\n      }\n    }\n\n    if (!ParseAndMergeField(tag, field, message, input)) {\n      return false;\n    }\n  }\n}\n\nbool WireFormat::ParseAndMergeField(\n    uint32 tag,\n    const FieldDescriptor* field,        // May be NULL for unknown\n    Message* message,\n    io::CodedInputStream* input) {\n  const Reflection* message_reflection = message->GetReflection();\n\n  enum { UNKNOWN, NORMAL_FORMAT, PACKED_FORMAT } value_format;\n\n  if (field == NULL) {\n    value_format = UNKNOWN;\n  } else if (WireFormatLite::GetTagWireType(tag) ==\n             WireTypeForFieldType(field->type())) {\n    value_format = NORMAL_FORMAT;\n  } else if (field->is_packable() &&\n             WireFormatLite::GetTagWireType(tag) ==\n             WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n    value_format = PACKED_FORMAT;\n  } else {\n    // We don't recognize this field. Either the field number is unknown\n    // or the wire type doesn't match. Put it in our unknown field set.\n    value_format = UNKNOWN;\n  }\n\n  if (value_format == UNKNOWN) {\n    return SkipField(input, tag,\n                     message_reflection->MutableUnknownFields(message));\n  } else if (value_format == PACKED_FORMAT) {\n    uint32 length;\n    if (!input->ReadVarint32(&length)) return false;\n    io::CodedInputStream::Limit limit = input->PushLimit(length);\n\n    switch (field->type()) {\n#define HANDLE_PACKED_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD)                      \\\n      case FieldDescriptor::TYPE_##TYPE: {                                     \\\n        while (input->BytesUntilLimit() > 0) {                                 \\\n          CPPTYPE value;                                                       \\\n          if (!WireFormatLite::ReadPrimitive<                                  \\\n                CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value))          \\\n            return false;                                                      \\\n          message_reflection->Add##CPPTYPE_METHOD(message, field, value);      \\\n        }                                                                      \\\n        break;                                                                 \\\n      }\n\n      HANDLE_PACKED_TYPE( INT32,  int32,  Int32)\n      HANDLE_PACKED_TYPE( INT64,  int64,  Int64)\n      HANDLE_PACKED_TYPE(SINT32,  int32,  Int32)\n      HANDLE_PACKED_TYPE(SINT64,  int64,  Int64)\n      HANDLE_PACKED_TYPE(UINT32, uint32, UInt32)\n      HANDLE_PACKED_TYPE(UINT64, uint64, UInt64)\n\n      HANDLE_PACKED_TYPE( FIXED32, uint32, UInt32)\n      HANDLE_PACKED_TYPE( FIXED64, uint64, UInt64)\n      HANDLE_PACKED_TYPE(SFIXED32,  int32,  Int32)\n      HANDLE_PACKED_TYPE(SFIXED64,  int64,  Int64)\n\n      HANDLE_PACKED_TYPE(FLOAT , float , Float )\n      HANDLE_PACKED_TYPE(DOUBLE, double, Double)\n\n      HANDLE_PACKED_TYPE(BOOL, bool, Bool)\n#undef HANDLE_PACKED_TYPE\n\n      case FieldDescriptor::TYPE_ENUM: {\n        while (input->BytesUntilLimit() > 0) {\n          int value;\n          if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(\n                  input, &value)) return false;\n          const EnumValueDescriptor* enum_value =\n              field->enum_type()->FindValueByNumber(value);\n          if (enum_value != NULL) {\n            message_reflection->AddEnum(message, field, enum_value);\n          }\n        }\n\n        break;\n      }\n\n      case FieldDescriptor::TYPE_STRING:\n      case FieldDescriptor::TYPE_GROUP:\n      case FieldDescriptor::TYPE_MESSAGE:\n      case FieldDescriptor::TYPE_BYTES:\n        // Can't have packed fields of these types: these should be caught by\n        // the protocol compiler.\n        return false;\n        break;\n    }\n\n    input->PopLimit(limit);\n  } else {\n    // Non-packed value (value_format == NORMAL_FORMAT)\n    switch (field->type()) {\n#define HANDLE_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD)                            \\\n      case FieldDescriptor::TYPE_##TYPE: {                                    \\\n        CPPTYPE value;                                                        \\\n        if (!WireFormatLite::ReadPrimitive<                                   \\\n                CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value))         \\\n          return false;                                                       \\\n        if (field->is_repeated()) {                                           \\\n          message_reflection->Add##CPPTYPE_METHOD(message, field, value);     \\\n        } else {                                                              \\\n          message_reflection->Set##CPPTYPE_METHOD(message, field, value);     \\\n        }                                                                     \\\n        break;                                                                \\\n      }\n\n      HANDLE_TYPE( INT32,  int32,  Int32)\n      HANDLE_TYPE( INT64,  int64,  Int64)\n      HANDLE_TYPE(SINT32,  int32,  Int32)\n      HANDLE_TYPE(SINT64,  int64,  Int64)\n      HANDLE_TYPE(UINT32, uint32, UInt32)\n      HANDLE_TYPE(UINT64, uint64, UInt64)\n\n      HANDLE_TYPE( FIXED32, uint32, UInt32)\n      HANDLE_TYPE( FIXED64, uint64, UInt64)\n      HANDLE_TYPE(SFIXED32,  int32,  Int32)\n      HANDLE_TYPE(SFIXED64,  int64,  Int64)\n\n      HANDLE_TYPE(FLOAT , float , Float )\n      HANDLE_TYPE(DOUBLE, double, Double)\n\n      HANDLE_TYPE(BOOL, bool, Bool)\n#undef HANDLE_TYPE\n\n      case FieldDescriptor::TYPE_ENUM: {\n        int value;\n        if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(\n                input, &value)) return false;\n        const EnumValueDescriptor* enum_value =\n          field->enum_type()->FindValueByNumber(value);\n        if (enum_value != NULL) {\n          if (field->is_repeated()) {\n            message_reflection->AddEnum(message, field, enum_value);\n          } else {\n            message_reflection->SetEnum(message, field, enum_value);\n          }\n        } else {\n          // The enum value is not one of the known values.  Add it to the\n          // UnknownFieldSet.\n          int64 sign_extended_value = static_cast<int64>(value);\n          message_reflection->MutableUnknownFields(message)\n                            ->AddVarint(WireFormatLite::GetTagFieldNumber(tag),\n                                        sign_extended_value);\n        }\n        break;\n      }\n\n      // Handle strings separately so that we can optimize the ctype=CORD case.\n      case FieldDescriptor::TYPE_STRING: {\n        string value;\n        if (!WireFormatLite::ReadString(input, &value)) return false;\n        VerifyUTF8String(value.data(), value.length(), PARSE);\n        if (field->is_repeated()) {\n          message_reflection->AddString(message, field, value);\n        } else {\n          message_reflection->SetString(message, field, value);\n        }\n        break;\n      }\n\n      case FieldDescriptor::TYPE_BYTES: {\n        string value;\n        if (!WireFormatLite::ReadBytes(input, &value)) return false;\n        if (field->is_repeated()) {\n          message_reflection->AddString(message, field, value);\n        } else {\n          message_reflection->SetString(message, field, value);\n        }\n        break;\n      }\n\n      case FieldDescriptor::TYPE_GROUP: {\n        Message* sub_message;\n        if (field->is_repeated()) {\n          sub_message = message_reflection->AddMessage(\n              message, field, input->GetExtensionFactory());\n        } else {\n          sub_message = message_reflection->MutableMessage(\n              message, field, input->GetExtensionFactory());\n        }\n\n        if (!WireFormatLite::ReadGroup(WireFormatLite::GetTagFieldNumber(tag),\n                                       input, sub_message))\n          return false;\n        break;\n      }\n\n      case FieldDescriptor::TYPE_MESSAGE: {\n        Message* sub_message;\n        if (field->is_repeated()) {\n          sub_message = message_reflection->AddMessage(\n              message, field, input->GetExtensionFactory());\n        } else {\n          sub_message = message_reflection->MutableMessage(\n              message, field, input->GetExtensionFactory());\n        }\n\n        if (!WireFormatLite::ReadMessage(input, sub_message)) return false;\n        break;\n      }\n    }\n  }\n\n  return true;\n}\n\nbool WireFormat::ParseAndMergeMessageSetItem(\n    io::CodedInputStream* input,\n    Message* message) {\n  const Reflection* message_reflection = message->GetReflection();\n\n  // This method parses a group which should contain two fields:\n  //   required int32 type_id = 2;\n  //   required data message = 3;\n\n  // Once we see a type_id, we'll construct a fake tag for this extension\n  // which is the tag it would have had under the proto2 extensions wire\n  // format.\n  uint32 fake_tag = 0;\n\n  // Once we see a type_id, we'll look up the FieldDescriptor for the\n  // extension.\n  const FieldDescriptor* field = NULL;\n\n  // If we see message data before the type_id, we'll append it to this so\n  // we can parse it later.  This will probably never happen in practice,\n  // as no MessageSet encoder I know of writes the message before the type ID.\n  // But, it's technically valid so we should allow it.\n  // TODO(kenton):  Use a Cord instead?  Do I care?\n  string message_data;\n\n  while (true) {\n    uint32 tag = input->ReadTag();\n    if (tag == 0) return false;\n\n    switch (tag) {\n      case WireFormatLite::kMessageSetTypeIdTag: {\n        uint32 type_id;\n        if (!input->ReadVarint32(&type_id)) return false;\n        fake_tag = WireFormatLite::MakeTag(\n            type_id, WireFormatLite::WIRETYPE_LENGTH_DELIMITED);\n        field = message_reflection->FindKnownExtensionByNumber(type_id);\n\n        if (!message_data.empty()) {\n          // We saw some message data before the type_id.  Have to parse it\n          // now.\n          io::ArrayInputStream raw_input(message_data.data(),\n                                         message_data.size());\n          io::CodedInputStream sub_input(&raw_input);\n          if (!ParseAndMergeField(fake_tag, field, message,\n                                  &sub_input)) {\n            return false;\n          }\n          message_data.clear();\n        }\n\n        break;\n      }\n\n      case WireFormatLite::kMessageSetMessageTag: {\n        if (fake_tag == 0) {\n          // We haven't seen a type_id yet.  Append this data to message_data.\n          string temp;\n          uint32 length;\n          if (!input->ReadVarint32(&length)) return false;\n          if (!input->ReadString(&temp, length)) return false;\n          message_data.append(temp);\n        } else {\n          // Already saw type_id, so we can parse this directly.\n          if (!ParseAndMergeField(fake_tag, field, message, input)) {\n            return false;\n          }\n        }\n\n        break;\n      }\n\n      case WireFormatLite::kMessageSetItemEndTag: {\n        return true;\n      }\n\n      default: {\n        if (!SkipField(input, tag, NULL)) return false;\n      }\n    }\n  }\n}\n\n// ===================================================================\n\nvoid WireFormat::SerializeWithCachedSizes(\n    const Message& message,\n    int size, io::CodedOutputStream* output) {\n  const Descriptor* descriptor = message.GetDescriptor();\n  const Reflection* message_reflection = message.GetReflection();\n  int expected_endpoint = output->ByteCount() + size;\n\n  vector<const FieldDescriptor*> fields;\n  message_reflection->ListFields(message, &fields);\n  for (int i = 0; i < fields.size(); i++) {\n    SerializeFieldWithCachedSizes(fields[i], message, output);\n  }\n\n  if (descriptor->options().message_set_wire_format()) {\n    SerializeUnknownMessageSetItems(\n        message_reflection->GetUnknownFields(message), output);\n  } else {\n    SerializeUnknownFields(\n        message_reflection->GetUnknownFields(message), output);\n  }\n\n  GOOGLE_CHECK_EQ(output->ByteCount(), expected_endpoint)\n    << \": Protocol message serialized to a size different from what was \"\n       \"originally expected.  Perhaps it was modified by another thread \"\n       \"during serialization?\";\n}\n\nvoid WireFormat::SerializeFieldWithCachedSizes(\n    const FieldDescriptor* field,\n    const Message& message,\n    io::CodedOutputStream* output) {\n  const Reflection* message_reflection = message.GetReflection();\n\n  if (field->is_extension() &&\n      field->containing_type()->options().message_set_wire_format() &&\n      field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&\n      !field->is_repeated()) {\n    SerializeMessageSetItemWithCachedSizes(field, message, output);\n    return;\n  }\n\n  int count = 0;\n\n  if (field->is_repeated()) {\n    count = message_reflection->FieldSize(message, field);\n  } else if (message_reflection->HasField(message, field)) {\n    count = 1;\n  }\n\n  const bool is_packed = field->options().packed();\n  if (is_packed && count > 0) {\n    WireFormatLite::WriteTag(field->number(),\n        WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);\n    const int data_size = FieldDataOnlyByteSize(field, message);\n    output->WriteVarint32(data_size);\n  }\n\n  for (int j = 0; j < count; j++) {\n    switch (field->type()) {\n#define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD)      \\\n      case FieldDescriptor::TYPE_##TYPE: {                                     \\\n        const CPPTYPE value = field->is_repeated() ?                           \\\n                              message_reflection->GetRepeated##CPPTYPE_METHOD( \\\n                                message, field, j) :                           \\\n                              message_reflection->Get##CPPTYPE_METHOD(         \\\n                                message, field);                               \\\n        if (is_packed) {                                                       \\\n          WireFormatLite::Write##TYPE_METHOD##NoTag(value, output);            \\\n        } else {                                                               \\\n          WireFormatLite::Write##TYPE_METHOD(field->number(), value, output);  \\\n        }                                                                      \\\n        break;                                                                 \\\n      }\n\n      HANDLE_PRIMITIVE_TYPE( INT32,  int32,  Int32,  Int32)\n      HANDLE_PRIMITIVE_TYPE( INT64,  int64,  Int64,  Int64)\n      HANDLE_PRIMITIVE_TYPE(SINT32,  int32, SInt32,  Int32)\n      HANDLE_PRIMITIVE_TYPE(SINT64,  int64, SInt64,  Int64)\n      HANDLE_PRIMITIVE_TYPE(UINT32, uint32, UInt32, UInt32)\n      HANDLE_PRIMITIVE_TYPE(UINT64, uint64, UInt64, UInt64)\n\n      HANDLE_PRIMITIVE_TYPE( FIXED32, uint32,  Fixed32, UInt32)\n      HANDLE_PRIMITIVE_TYPE( FIXED64, uint64,  Fixed64, UInt64)\n      HANDLE_PRIMITIVE_TYPE(SFIXED32,  int32, SFixed32,  Int32)\n      HANDLE_PRIMITIVE_TYPE(SFIXED64,  int64, SFixed64,  Int64)\n\n      HANDLE_PRIMITIVE_TYPE(FLOAT , float , Float , Float )\n      HANDLE_PRIMITIVE_TYPE(DOUBLE, double, Double, Double)\n\n      HANDLE_PRIMITIVE_TYPE(BOOL, bool, Bool, Bool)\n#undef HANDLE_PRIMITIVE_TYPE\n\n#define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD)                       \\\n      case FieldDescriptor::TYPE_##TYPE:                                     \\\n        WireFormatLite::Write##TYPE_METHOD(                                  \\\n              field->number(),                                               \\\n              field->is_repeated() ?                                         \\\n                message_reflection->GetRepeated##CPPTYPE_METHOD(             \\\n                  message, field, j) :                                       \\\n                message_reflection->Get##CPPTYPE_METHOD(message, field),     \\\n              output);                                                       \\\n        break;\n\n      HANDLE_TYPE(GROUP  , Group  , Message)\n      HANDLE_TYPE(MESSAGE, Message, Message)\n#undef HANDLE_TYPE\n\n      case FieldDescriptor::TYPE_ENUM: {\n        const EnumValueDescriptor* value = field->is_repeated() ?\n          message_reflection->GetRepeatedEnum(message, field, j) :\n          message_reflection->GetEnum(message, field);\n        if (is_packed) {\n          WireFormatLite::WriteEnumNoTag(value->number(), output);\n        } else {\n          WireFormatLite::WriteEnum(field->number(), value->number(), output);\n        }\n        break;\n      }\n\n      // Handle strings separately so that we can get string references\n      // instead of copying.\n      case FieldDescriptor::TYPE_STRING: {\n        string scratch;\n        const string& value = field->is_repeated() ?\n          message_reflection->GetRepeatedStringReference(\n            message, field, j, &scratch) :\n          message_reflection->GetStringReference(message, field, &scratch);\n        VerifyUTF8String(value.data(), value.length(), SERIALIZE);\n        WireFormatLite::WriteString(field->number(), value, output);\n        break;\n      }\n\n      case FieldDescriptor::TYPE_BYTES: {\n        string scratch;\n        const string& value = field->is_repeated() ?\n          message_reflection->GetRepeatedStringReference(\n            message, field, j, &scratch) :\n          message_reflection->GetStringReference(message, field, &scratch);\n        WireFormatLite::WriteBytes(field->number(), value, output);\n        break;\n      }\n    }\n  }\n}\n\nvoid WireFormat::SerializeMessageSetItemWithCachedSizes(\n    const FieldDescriptor* field,\n    const Message& message,\n    io::CodedOutputStream* output) {\n  const Reflection* message_reflection = message.GetReflection();\n\n  // Start group.\n  output->WriteVarint32(WireFormatLite::kMessageSetItemStartTag);\n\n  // Write type ID.\n  output->WriteVarint32(WireFormatLite::kMessageSetTypeIdTag);\n  output->WriteVarint32(field->number());\n\n  // Write message.\n  output->WriteVarint32(WireFormatLite::kMessageSetMessageTag);\n\n  const Message& sub_message = message_reflection->GetMessage(message, field);\n  output->WriteVarint32(sub_message.GetCachedSize());\n  sub_message.SerializeWithCachedSizes(output);\n\n  // End group.\n  output->WriteVarint32(WireFormatLite::kMessageSetItemEndTag);\n}\n\n// ===================================================================\n\nint WireFormat::ByteSize(const Message& message) {\n  const Descriptor* descriptor = message.GetDescriptor();\n  const Reflection* message_reflection = message.GetReflection();\n\n  int our_size = 0;\n\n  vector<const FieldDescriptor*> fields;\n  message_reflection->ListFields(message, &fields);\n  for (int i = 0; i < fields.size(); i++) {\n    our_size += FieldByteSize(fields[i], message);\n  }\n\n  if (descriptor->options().message_set_wire_format()) {\n    our_size += ComputeUnknownMessageSetItemsSize(\n      message_reflection->GetUnknownFields(message));\n  } else {\n    our_size += ComputeUnknownFieldsSize(\n      message_reflection->GetUnknownFields(message));\n  }\n\n  return our_size;\n}\n\nint WireFormat::FieldByteSize(\n    const FieldDescriptor* field,\n    const Message& message) {\n  const Reflection* message_reflection = message.GetReflection();\n\n  if (field->is_extension() &&\n      field->containing_type()->options().message_set_wire_format() &&\n      field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&\n      !field->is_repeated()) {\n    return MessageSetItemByteSize(field, message);\n  }\n\n  int count = 0;\n  if (field->is_repeated()) {\n    count = message_reflection->FieldSize(message, field);\n  } else if (message_reflection->HasField(message, field)) {\n    count = 1;\n  }\n\n  const int data_size = FieldDataOnlyByteSize(field, message);\n  int our_size = data_size;\n  if (field->options().packed()) {\n    if (data_size > 0) {\n      // Packed fields get serialized like a string, not their native type.\n      // Technically this doesn't really matter; the size only changes if it's\n      // a GROUP\n      our_size += TagSize(field->number(), FieldDescriptor::TYPE_STRING);\n      our_size += io::CodedOutputStream::VarintSize32(data_size);\n    }\n  } else {\n    our_size += count * TagSize(field->number(), field->type());\n  }\n  return our_size;\n}\n\nint WireFormat::FieldDataOnlyByteSize(\n    const FieldDescriptor* field,\n    const Message& message) {\n  const Reflection* message_reflection = message.GetReflection();\n\n  int count = 0;\n  if (field->is_repeated()) {\n    count = message_reflection->FieldSize(message, field);\n  } else if (message_reflection->HasField(message, field)) {\n    count = 1;\n  }\n\n  int data_size = 0;\n  switch (field->type()) {\n#define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD)                     \\\n    case FieldDescriptor::TYPE_##TYPE:                                     \\\n      if (field->is_repeated()) {                                          \\\n        for (int j = 0; j < count; j++) {                                  \\\n          data_size += WireFormatLite::TYPE_METHOD##Size(                  \\\n            message_reflection->GetRepeated##CPPTYPE_METHOD(               \\\n              message, field, j));                                         \\\n        }                                                                  \\\n      } else {                                                             \\\n        data_size += WireFormatLite::TYPE_METHOD##Size(                    \\\n          message_reflection->Get##CPPTYPE_METHOD(message, field));        \\\n      }                                                                    \\\n      break;\n\n#define HANDLE_FIXED_TYPE(TYPE, TYPE_METHOD)                               \\\n    case FieldDescriptor::TYPE_##TYPE:                                     \\\n      data_size += count * WireFormatLite::k##TYPE_METHOD##Size;           \\\n      break;\n\n    HANDLE_TYPE( INT32,  Int32,  Int32)\n    HANDLE_TYPE( INT64,  Int64,  Int64)\n    HANDLE_TYPE(SINT32, SInt32,  Int32)\n    HANDLE_TYPE(SINT64, SInt64,  Int64)\n    HANDLE_TYPE(UINT32, UInt32, UInt32)\n    HANDLE_TYPE(UINT64, UInt64, UInt64)\n\n    HANDLE_FIXED_TYPE( FIXED32,  Fixed32)\n    HANDLE_FIXED_TYPE( FIXED64,  Fixed64)\n    HANDLE_FIXED_TYPE(SFIXED32, SFixed32)\n    HANDLE_FIXED_TYPE(SFIXED64, SFixed64)\n\n    HANDLE_FIXED_TYPE(FLOAT , Float )\n    HANDLE_FIXED_TYPE(DOUBLE, Double)\n\n    HANDLE_FIXED_TYPE(BOOL, Bool)\n\n    HANDLE_TYPE(GROUP  , Group  , Message)\n    HANDLE_TYPE(MESSAGE, Message, Message)\n#undef HANDLE_TYPE\n#undef HANDLE_FIXED_TYPE\n\n    case FieldDescriptor::TYPE_ENUM: {\n      if (field->is_repeated()) {\n        for (int j = 0; j < count; j++) {\n          data_size += WireFormatLite::EnumSize(\n            message_reflection->GetRepeatedEnum(message, field, j)->number());\n        }\n      } else {\n        data_size += WireFormatLite::EnumSize(\n          message_reflection->GetEnum(message, field)->number());\n      }\n      break;\n    }\n\n    // Handle strings separately so that we can get string references\n    // instead of copying.\n    case FieldDescriptor::TYPE_STRING:\n    case FieldDescriptor::TYPE_BYTES: {\n      for (int j = 0; j < count; j++) {\n        string scratch;\n        const string& value = field->is_repeated() ?\n          message_reflection->GetRepeatedStringReference(\n            message, field, j, &scratch) :\n          message_reflection->GetStringReference(message, field, &scratch);\n        data_size += WireFormatLite::StringSize(value);\n      }\n      break;\n    }\n  }\n  return data_size;\n}\n\nint WireFormat::MessageSetItemByteSize(\n    const FieldDescriptor* field,\n    const Message& message) {\n  const Reflection* message_reflection = message.GetReflection();\n\n  int our_size = WireFormatLite::kMessageSetItemTagsSize;\n\n  // type_id\n  our_size += io::CodedOutputStream::VarintSize32(field->number());\n\n  // message\n  const Message& sub_message = message_reflection->GetMessage(message, field);\n  int message_size = sub_message.ByteSize();\n\n  our_size += io::CodedOutputStream::VarintSize32(message_size);\n  our_size += message_size;\n\n  return our_size;\n}\n\nvoid WireFormat::VerifyUTF8StringFallback(const char* data,\n                                          int size,\n                                          Operation op) {\n  if (!IsStructurallyValidUTF8(data, size)) {\n    const char* operation_str = NULL;\n    switch (op) {\n      case PARSE:\n        operation_str = \"parsing\";\n        break;\n      case SERIALIZE:\n        operation_str = \"serializing\";\n        break;\n      // no default case: have the compiler warn if a case is not covered.\n    }\n    GOOGLE_LOG(ERROR) << \"Encountered string containing invalid UTF-8 data while \"\n               << operation_str\n               << \" protocol buffer. Strings must contain only UTF-8; \"\n                  \"use the 'bytes' type for raw bytes.\";\n  }\n}\n\n\n}  // namespace internal\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//         atenasio@google.com (Chris Atenasio) (ZigZag transform)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This header is logically internal, but is made public because it is used\n// from protocol-compiler-generated code, which may reside in other components.\n\n#ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_H__\n#define GOOGLE_PROTOBUF_WIRE_FORMAT_H__\n\n#include <string>\n#include <google/protobuf/descriptor.pb.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/message.h>\n#include <google/protobuf/wire_format_lite.h>\n\n// Do UTF-8 validation on string type in Debug build only\n#ifndef NDEBUG\n#define GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED\n#endif\n\nnamespace google {\nnamespace protobuf {\n  namespace io {\n    class CodedInputStream;      // coded_stream.h\n    class CodedOutputStream;     // coded_stream.h\n  }\n  class UnknownFieldSet;         // unknown_field_set.h\n}\n\nnamespace protobuf {\nnamespace internal {\n\n// This class is for internal use by the protocol buffer library and by\n// protocol-complier-generated message classes.  It must not be called\n// directly by clients.\n//\n// This class contains code for implementing the binary protocol buffer\n// wire format via reflection.  The WireFormatLite class implements the\n// non-reflection based routines.\n//\n// This class is really a namespace that contains only static methods\nclass LIBPROTOBUF_EXPORT WireFormat {\n public:\n\n  // Given a field return its WireType\n  static inline WireFormatLite::WireType WireTypeForField(\n      const FieldDescriptor* field);\n\n  // Given a FieldSescriptor::Type return its WireType\n  static inline WireFormatLite::WireType WireTypeForFieldType(\n      FieldDescriptor::Type type);\n\n  // Compute the byte size of a tag.  For groups, this includes both the start\n  // and end tags.\n  static inline int TagSize(int field_number, FieldDescriptor::Type type);\n\n  // These procedures can be used to implement the methods of Message which\n  // handle parsing and serialization of the protocol buffer wire format\n  // using only the Reflection interface.  When you ask the protocol\n  // compiler to optimize for code size rather than speed, it will implement\n  // those methods in terms of these procedures.  Of course, these are much\n  // slower than the specialized implementations which the protocol compiler\n  // generates when told to optimize for speed.\n\n  // Read a message in protocol buffer wire format.\n  //\n  // This procedure reads either to the end of the input stream or through\n  // a WIRETYPE_END_GROUP tag ending the message, whichever comes first.\n  // It returns false if the input is invalid.\n  //\n  // Required fields are NOT checked by this method.  You must call\n  // IsInitialized() on the resulting message yourself.\n  static bool ParseAndMergePartial(io::CodedInputStream* input,\n                                   Message* message);\n\n  // Serialize a message in protocol buffer wire format.\n  //\n  // Any embedded messages within the message must have their correct sizes\n  // cached.  However, the top-level message need not; its size is passed as\n  // a parameter to this procedure.\n  //\n  // These return false iff the underlying stream returns a write error.\n  static void SerializeWithCachedSizes(\n      const Message& message,\n      int size, io::CodedOutputStream* output);\n\n  // Implements Message::ByteSize() via reflection.  WARNING:  The result\n  // of this method is *not* cached anywhere.  However, all embedded messages\n  // will have their ByteSize() methods called, so their sizes will be cached.\n  // Therefore, calling this method is sufficient to allow you to call\n  // WireFormat::SerializeWithCachedSizes() on the same object.\n  static int ByteSize(const Message& message);\n\n  // -----------------------------------------------------------------\n  // Helpers for dealing with unknown fields\n\n  // Skips a field value of the given WireType.  The input should start\n  // positioned immediately after the tag.  If unknown_fields is non-NULL,\n  // the contents of the field will be added to it.\n  static bool SkipField(io::CodedInputStream* input, uint32 tag,\n                        UnknownFieldSet* unknown_fields);\n\n  // Reads and ignores a message from the input.  If unknown_fields is non-NULL,\n  // the contents will be added to it.\n  static bool SkipMessage(io::CodedInputStream* input,\n                          UnknownFieldSet* unknown_fields);\n\n  // Write the contents of an UnknownFieldSet to the output.\n  static void SerializeUnknownFields(const UnknownFieldSet& unknown_fields,\n                                     io::CodedOutputStream* output);\n  // Same as above, except writing directly to the provided buffer.\n  // Requires that the buffer have sufficient capacity for\n  // ComputeUnknownFieldsSize(unknown_fields).\n  //\n  // Returns a pointer past the last written byte.\n  static uint8* SerializeUnknownFieldsToArray(\n      const UnknownFieldSet& unknown_fields,\n      uint8* target);\n\n  // Same thing except for messages that have the message_set_wire_format\n  // option.\n  static void SerializeUnknownMessageSetItems(\n      const UnknownFieldSet& unknown_fields,\n      io::CodedOutputStream* output);\n  // Same as above, except writing directly to the provided buffer.\n  // Requires that the buffer have sufficient capacity for\n  // ComputeUnknownMessageSetItemsSize(unknown_fields).\n  //\n  // Returns a pointer past the last written byte.\n  static uint8* SerializeUnknownMessageSetItemsToArray(\n      const UnknownFieldSet& unknown_fields,\n      uint8* target);\n\n  // Compute the size of the UnknownFieldSet on the wire.\n  static int ComputeUnknownFieldsSize(const UnknownFieldSet& unknown_fields);\n\n  // Same thing except for messages that have the message_set_wire_format\n  // option.\n  static int ComputeUnknownMessageSetItemsSize(\n      const UnknownFieldSet& unknown_fields);\n\n\n  // Helper functions for encoding and decoding tags.  (Inlined below and in\n  // _inl.h)\n  //\n  // This is different from MakeTag(field->number(), field->type()) in the case\n  // of packed repeated fields.\n  static uint32 MakeTag(const FieldDescriptor* field);\n\n  // Parse a single field.  The input should start out positioned immidately\n  // after the tag.\n  static bool ParseAndMergeField(\n      uint32 tag,\n      const FieldDescriptor* field,        // May be NULL for unknown\n      Message* message,\n      io::CodedInputStream* input);\n\n  // Serialize a single field.\n  static void SerializeFieldWithCachedSizes(\n      const FieldDescriptor* field,        // Cannot be NULL\n      const Message& message,\n      io::CodedOutputStream* output);\n\n  // Compute size of a single field.  If the field is a message type, this\n  // will call ByteSize() for the embedded message, insuring that it caches\n  // its size.\n  static int FieldByteSize(\n      const FieldDescriptor* field,        // Cannot be NULL\n      const Message& message);\n\n  // Parse/serialize a MessageSet::Item group.  Used with messages that use\n  // opion message_set_wire_format = true.\n  static bool ParseAndMergeMessageSetItem(\n      io::CodedInputStream* input,\n      Message* message);\n  static void SerializeMessageSetItemWithCachedSizes(\n      const FieldDescriptor* field,\n      const Message& message,\n      io::CodedOutputStream* output);\n  static int MessageSetItemByteSize(\n      const FieldDescriptor* field,\n      const Message& message);\n\n  // Computes the byte size of a field, excluding tags. For packed fields, it\n  // only includes the size of the raw data, and not the size of the total\n  // length, but for other length-delimited types, the size of the length is\n  // included.\n  static int FieldDataOnlyByteSize(\n      const FieldDescriptor* field,        // Cannot be NULL\n      const Message& message);\n\n  enum Operation {\n    PARSE,\n    SERIALIZE,\n  };\n\n  // Verifies that a string field is valid UTF8, logging an error if not.\n  static void VerifyUTF8String(const char* data, int size, Operation op);\n\n private:\n  // Verifies that a string field is valid UTF8, logging an error if not.\n  static void VerifyUTF8StringFallback(\n      const char* data,\n      int size,\n      Operation op);\n\n\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(WireFormat);\n};\n\n// Subclass of FieldSkipper which saves skipped fields to an UnknownFieldSet.\nclass LIBPROTOBUF_EXPORT UnknownFieldSetFieldSkipper : public FieldSkipper {\n public:\n  UnknownFieldSetFieldSkipper(UnknownFieldSet* unknown_fields)\n      : unknown_fields_(unknown_fields) {}\n  virtual ~UnknownFieldSetFieldSkipper() {}\n\n  // implements FieldSkipper -----------------------------------------\n  virtual bool SkipField(io::CodedInputStream* input, uint32 tag);\n  virtual bool SkipMessage(io::CodedInputStream* input);\n  virtual void SkipUnknownEnum(int field_number, int value);\n\n private:\n  UnknownFieldSet* unknown_fields_;\n};\n\n// inline methods ====================================================\n\ninline WireFormatLite::WireType WireFormat::WireTypeForField(\n    const FieldDescriptor* field) {\n  if (field->options().packed()) {\n    return WireFormatLite::WIRETYPE_LENGTH_DELIMITED;\n  } else {\n    return WireTypeForFieldType(field->type());\n  }\n}\n\ninline WireFormatLite::WireType WireFormat::WireTypeForFieldType(\n    FieldDescriptor::Type type) {\n  // Some compilers don't like enum -> enum casts, so we implicit_cast to\n  // int first.\n  return WireFormatLite::WireTypeForFieldType(\n      static_cast<WireFormatLite::FieldType>(\n        implicit_cast<int>(type)));\n}\n\ninline uint32 WireFormat::MakeTag(const FieldDescriptor* field) {\n  return WireFormatLite::MakeTag(field->number(), WireTypeForField(field));\n}\n\ninline int WireFormat::TagSize(int field_number, FieldDescriptor::Type type) {\n  // Some compilers don't like enum -> enum casts, so we implicit_cast to\n  // int first.\n  return WireFormatLite::TagSize(field_number,\n      static_cast<WireFormatLite::FieldType>(\n        implicit_cast<int>(type)));\n}\n\ninline void WireFormat::VerifyUTF8String(const char* data, int size,\n    WireFormat::Operation op) {\n#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED\n  WireFormat::VerifyUTF8StringFallback(data, size, op);\n#endif\n}\n\n\n}  // namespace internal\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_WIRE_FORMAT_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/wire_format_lite_inl.h>\n\n#include <stack>\n#include <string>\n#include <vector>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/io/coded_stream_inl.h>\n#include <google/protobuf/io/zero_copy_stream.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\n\n#ifndef _MSC_VER    // MSVC doesn't like definitions of inline constants, GCC\n                    // requires them.\nconst int WireFormatLite::kMessageSetItemStartTag;\nconst int WireFormatLite::kMessageSetItemEndTag;\nconst int WireFormatLite::kMessageSetTypeIdTag;\nconst int WireFormatLite::kMessageSetMessageTag;\n\n#endif\n\nconst int WireFormatLite::kMessageSetItemTagsSize =\n  io::CodedOutputStream::VarintSize32(kMessageSetItemStartTag) +\n  io::CodedOutputStream::VarintSize32(kMessageSetItemEndTag) +\n  io::CodedOutputStream::VarintSize32(kMessageSetTypeIdTag) +\n  io::CodedOutputStream::VarintSize32(kMessageSetMessageTag);\n\nconst WireFormatLite::CppType\nWireFormatLite::kFieldTypeToCppTypeMap[MAX_FIELD_TYPE + 1] = {\n  static_cast<CppType>(0),  // 0 is reserved for errors\n\n  CPPTYPE_DOUBLE,   // TYPE_DOUBLE\n  CPPTYPE_FLOAT,    // TYPE_FLOAT\n  CPPTYPE_INT64,    // TYPE_INT64\n  CPPTYPE_UINT64,   // TYPE_UINT64\n  CPPTYPE_INT32,    // TYPE_INT32\n  CPPTYPE_UINT64,   // TYPE_FIXED64\n  CPPTYPE_UINT32,   // TYPE_FIXED32\n  CPPTYPE_BOOL,     // TYPE_BOOL\n  CPPTYPE_STRING,   // TYPE_STRING\n  CPPTYPE_MESSAGE,  // TYPE_GROUP\n  CPPTYPE_MESSAGE,  // TYPE_MESSAGE\n  CPPTYPE_STRING,   // TYPE_BYTES\n  CPPTYPE_UINT32,   // TYPE_UINT32\n  CPPTYPE_ENUM,     // TYPE_ENUM\n  CPPTYPE_INT32,    // TYPE_SFIXED32\n  CPPTYPE_INT64,    // TYPE_SFIXED64\n  CPPTYPE_INT32,    // TYPE_SINT32\n  CPPTYPE_INT64,    // TYPE_SINT64\n};\n\nconst WireFormatLite::WireType\nWireFormatLite::kWireTypeForFieldType[MAX_FIELD_TYPE + 1] = {\n  static_cast<WireFormatLite::WireType>(-1),  // invalid\n  WireFormatLite::WIRETYPE_FIXED64,           // TYPE_DOUBLE\n  WireFormatLite::WIRETYPE_FIXED32,           // TYPE_FLOAT\n  WireFormatLite::WIRETYPE_VARINT,            // TYPE_INT64\n  WireFormatLite::WIRETYPE_VARINT,            // TYPE_UINT64\n  WireFormatLite::WIRETYPE_VARINT,            // TYPE_INT32\n  WireFormatLite::WIRETYPE_FIXED64,           // TYPE_FIXED64\n  WireFormatLite::WIRETYPE_FIXED32,           // TYPE_FIXED32\n  WireFormatLite::WIRETYPE_VARINT,            // TYPE_BOOL\n  WireFormatLite::WIRETYPE_LENGTH_DELIMITED,  // TYPE_STRING\n  WireFormatLite::WIRETYPE_START_GROUP,       // TYPE_GROUP\n  WireFormatLite::WIRETYPE_LENGTH_DELIMITED,  // TYPE_MESSAGE\n  WireFormatLite::WIRETYPE_LENGTH_DELIMITED,  // TYPE_BYTES\n  WireFormatLite::WIRETYPE_VARINT,            // TYPE_UINT32\n  WireFormatLite::WIRETYPE_VARINT,            // TYPE_ENUM\n  WireFormatLite::WIRETYPE_FIXED32,           // TYPE_SFIXED32\n  WireFormatLite::WIRETYPE_FIXED64,           // TYPE_SFIXED64\n  WireFormatLite::WIRETYPE_VARINT,            // TYPE_SINT32\n  WireFormatLite::WIRETYPE_VARINT,            // TYPE_SINT64\n};\n\nbool WireFormatLite::SkipField(\n    io::CodedInputStream* input, uint32 tag) {\n  switch (WireFormatLite::GetTagWireType(tag)) {\n    case WireFormatLite::WIRETYPE_VARINT: {\n      uint64 value;\n      if (!input->ReadVarint64(&value)) return false;\n      return true;\n    }\n    case WireFormatLite::WIRETYPE_FIXED64: {\n      uint64 value;\n      if (!input->ReadLittleEndian64(&value)) return false;\n      return true;\n    }\n    case WireFormatLite::WIRETYPE_LENGTH_DELIMITED: {\n      uint32 length;\n      if (!input->ReadVarint32(&length)) return false;\n      if (!input->Skip(length)) return false;\n      return true;\n    }\n    case WireFormatLite::WIRETYPE_START_GROUP: {\n      if (!input->IncrementRecursionDepth()) return false;\n      if (!SkipMessage(input)) return false;\n      input->DecrementRecursionDepth();\n      // Check that the ending tag matched the starting tag.\n      if (!input->LastTagWas(WireFormatLite::MakeTag(\n          WireFormatLite::GetTagFieldNumber(tag),\n          WireFormatLite::WIRETYPE_END_GROUP))) {\n        return false;\n      }\n      return true;\n    }\n    case WireFormatLite::WIRETYPE_END_GROUP: {\n      return false;\n    }\n    case WireFormatLite::WIRETYPE_FIXED32: {\n      uint32 value;\n      if (!input->ReadLittleEndian32(&value)) return false;\n      return true;\n    }\n    default: {\n      return false;\n    }\n  }\n}\n\nbool WireFormatLite::SkipMessage(io::CodedInputStream* input) {\n  while(true) {\n    uint32 tag = input->ReadTag();\n    if (tag == 0) {\n      // End of input.  This is a valid place to end, so return true.\n      return true;\n    }\n\n    WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag);\n\n    if (wire_type == WireFormatLite::WIRETYPE_END_GROUP) {\n      // Must be the end of the message.\n      return true;\n    }\n\n    if (!SkipField(input, tag)) return false;\n  }\n}\n\nbool FieldSkipper::SkipField(\n    io::CodedInputStream* input, uint32 tag) {\n  return WireFormatLite::SkipField(input, tag);\n}\n\nbool FieldSkipper::SkipMessage(io::CodedInputStream* input) {\n  return WireFormatLite::SkipMessage(input);\n}\n\nvoid FieldSkipper::SkipUnknownEnum(\n    int field_number, int value) {\n  // Nothing.\n}\n\nbool WireFormatLite::ReadPackedEnumNoInline(io::CodedInputStream* input,\n                                            bool (*is_valid)(int),\n                                            RepeatedField<int>* values) {\n  uint32 length;\n  if (!input->ReadVarint32(&length)) return false;\n  io::CodedInputStream::Limit limit = input->PushLimit(length);\n  while (input->BytesUntilLimit() > 0) {\n    int value;\n    if (!google::protobuf::internal::WireFormatLite::ReadPrimitive<\n        int, WireFormatLite::TYPE_ENUM>(input, &value)) {\n      return false;\n    }\n    if (is_valid(value)) {\n      values->Add(value);\n    }\n  }\n  input->PopLimit(limit);\n  return true;\n}\n\nvoid WireFormatLite::WriteInt32(int field_number, int32 value,\n                                io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_VARINT, output);\n  WriteInt32NoTag(value, output);\n}\nvoid WireFormatLite::WriteInt64(int field_number, int64 value,\n                                io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_VARINT, output);\n  WriteInt64NoTag(value, output);\n}\nvoid WireFormatLite::WriteUInt32(int field_number, uint32 value,\n                                 io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_VARINT, output);\n  WriteUInt32NoTag(value, output);\n}\nvoid WireFormatLite::WriteUInt64(int field_number, uint64 value,\n                                 io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_VARINT, output);\n  WriteUInt64NoTag(value, output);\n}\nvoid WireFormatLite::WriteSInt32(int field_number, int32 value,\n                                 io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_VARINT, output);\n  WriteSInt32NoTag(value, output);\n}\nvoid WireFormatLite::WriteSInt64(int field_number, int64 value,\n                                 io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_VARINT, output);\n  WriteSInt64NoTag(value, output);\n}\nvoid WireFormatLite::WriteFixed32(int field_number, uint32 value,\n                                  io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_FIXED32, output);\n  WriteFixed32NoTag(value, output);\n}\nvoid WireFormatLite::WriteFixed64(int field_number, uint64 value,\n                                  io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_FIXED64, output);\n  WriteFixed64NoTag(value, output);\n}\nvoid WireFormatLite::WriteSFixed32(int field_number, int32 value,\n                                   io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_FIXED32, output);\n  WriteSFixed32NoTag(value, output);\n}\nvoid WireFormatLite::WriteSFixed64(int field_number, int64 value,\n                                   io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_FIXED64, output);\n  WriteSFixed64NoTag(value, output);\n}\nvoid WireFormatLite::WriteFloat(int field_number, float value,\n                                io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_FIXED32, output);\n  WriteFloatNoTag(value, output);\n}\nvoid WireFormatLite::WriteDouble(int field_number, double value,\n                                 io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_FIXED64, output);\n  WriteDoubleNoTag(value, output);\n}\nvoid WireFormatLite::WriteBool(int field_number, bool value,\n                               io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_VARINT, output);\n  WriteBoolNoTag(value, output);\n}\nvoid WireFormatLite::WriteEnum(int field_number, int value,\n                               io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_VARINT, output);\n  WriteEnumNoTag(value, output);\n}\n\nvoid WireFormatLite::WriteString(int field_number, const string& value,\n                                 io::CodedOutputStream* output) {\n  // String is for UTF-8 text only\n  WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output);\n  output->WriteVarint32(value.size());\n  output->WriteString(value);\n}\nvoid WireFormatLite::WriteBytes(int field_number, const string& value,\n                                io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output);\n  output->WriteVarint32(value.size());\n  output->WriteString(value);\n}\n\n\nvoid WireFormatLite::WriteGroup(int field_number,\n                                const MessageLite& value,\n                                io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_START_GROUP, output);\n  value.SerializeWithCachedSizes(output);\n  WriteTag(field_number, WIRETYPE_END_GROUP, output);\n}\n\nvoid WireFormatLite::WriteMessage(int field_number,\n                                  const MessageLite& value,\n                                  io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output);\n  const int size = value.GetCachedSize();\n  output->WriteVarint32(size);\n  value.SerializeWithCachedSizes(output);\n}\n\nvoid WireFormatLite::WriteGroupMaybeToArray(int field_number,\n                                            const MessageLite& value,\n                                            io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_START_GROUP, output);\n  const int size = value.GetCachedSize();\n  uint8* target = output->GetDirectBufferForNBytesAndAdvance(size);\n  if (target != NULL) {\n    uint8* end = value.SerializeWithCachedSizesToArray(target);\n    GOOGLE_DCHECK_EQ(end - target, size);\n  } else {\n    value.SerializeWithCachedSizes(output);\n  }\n  WriteTag(field_number, WIRETYPE_END_GROUP, output);\n}\n\nvoid WireFormatLite::WriteMessageMaybeToArray(int field_number,\n                                              const MessageLite& value,\n                                              io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output);\n  const int size = value.GetCachedSize();\n  output->WriteVarint32(size);\n  uint8* target = output->GetDirectBufferForNBytesAndAdvance(size);\n  if (target != NULL) {\n    uint8* end = value.SerializeWithCachedSizesToArray(target);\n    GOOGLE_DCHECK_EQ(end - target, size);\n  } else {\n    value.SerializeWithCachedSizes(output);\n  }\n}\n\nbool WireFormatLite::ReadString(io::CodedInputStream* input,\n                                string* value) {\n  // String is for UTF-8 text only\n  uint32 length;\n  if (!input->ReadVarint32(&length)) return false;\n  if (!input->InternalReadStringInline(value, length)) return false;\n  return true;\n}\nbool WireFormatLite::ReadBytes(io::CodedInputStream* input,\n                               string* value) {\n  uint32 length;\n  if (!input->ReadVarint32(&length)) return false;\n  return input->InternalReadStringInline(value, length);\n}\n\n}  // namespace internal\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//         atenasio@google.com (Chris Atenasio) (ZigZag transform)\n//         wink@google.com (Wink Saville) (refactored from wire_format.h)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n//\n// This header is logically internal, but is made public because it is used\n// from protocol-compiler-generated code, which may reside in other components.\n\n#ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__\n#define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__\n\n#include <string>\n#include <google/protobuf/message_lite.h>\n\nnamespace google {\n\nnamespace protobuf {\n  template <typename T> class RepeatedField;  // repeated_field.h\n  namespace io {\n    class CodedInputStream;             // coded_stream.h\n    class CodedOutputStream;            // coded_stream.h\n  }\n}\n\nnamespace protobuf {\nnamespace internal {\n\nclass StringPieceField;\n\n// This class is for internal use by the protocol buffer library and by\n// protocol-complier-generated message classes.  It must not be called\n// directly by clients.\n//\n// This class contains helpers for implementing the binary protocol buffer\n// wire format without the need for reflection. Use WireFormat when using\n// reflection.\n//\n// This class is really a namespace that contains only static methods.\nclass LIBPROTOBUF_EXPORT WireFormatLite {\n public:\n\n  // -----------------------------------------------------------------\n  // Helper constants and functions related to the format.  These are\n  // mostly meant for internal and generated code to use.\n\n  // The wire format is composed of a sequence of tag/value pairs, each\n  // of which contains the value of one field (or one element of a repeated\n  // field).  Each tag is encoded as a varint.  The lower bits of the tag\n  // identify its wire type, which specifies the format of the data to follow.\n  // The rest of the bits contain the field number.  Each type of field (as\n  // declared by FieldDescriptor::Type, in descriptor.h) maps to one of\n  // these wire types.  Immediately following each tag is the field's value,\n  // encoded in the format specified by the wire type.  Because the tag\n  // identifies the encoding of this data, it is possible to skip\n  // unrecognized fields for forwards compatibility.\n\n  enum WireType {\n    WIRETYPE_VARINT           = 0,\n    WIRETYPE_FIXED64          = 1,\n    WIRETYPE_LENGTH_DELIMITED = 2,\n    WIRETYPE_START_GROUP      = 3,\n    WIRETYPE_END_GROUP        = 4,\n    WIRETYPE_FIXED32          = 5,\n  };\n\n  // Lite alternative to FieldDescriptor::Type.  Must be kept in sync.\n  enum FieldType {\n    TYPE_DOUBLE         = 1,\n    TYPE_FLOAT          = 2,\n    TYPE_INT64          = 3,\n    TYPE_UINT64         = 4,\n    TYPE_INT32          = 5,\n    TYPE_FIXED64        = 6,\n    TYPE_FIXED32        = 7,\n    TYPE_BOOL           = 8,\n    TYPE_STRING         = 9,\n    TYPE_GROUP          = 10,\n    TYPE_MESSAGE        = 11,\n    TYPE_BYTES          = 12,\n    TYPE_UINT32         = 13,\n    TYPE_ENUM           = 14,\n    TYPE_SFIXED32       = 15,\n    TYPE_SFIXED64       = 16,\n    TYPE_SINT32         = 17,\n    TYPE_SINT64         = 18,\n    MAX_FIELD_TYPE      = 18,\n  };\n\n  // Lite alternative to FieldDescriptor::CppType.  Must be kept in sync.\n  enum CppType {\n    CPPTYPE_INT32       = 1,\n    CPPTYPE_INT64       = 2,\n    CPPTYPE_UINT32      = 3,\n    CPPTYPE_UINT64      = 4,\n    CPPTYPE_DOUBLE      = 5,\n    CPPTYPE_FLOAT       = 6,\n    CPPTYPE_BOOL        = 7,\n    CPPTYPE_ENUM        = 8,\n    CPPTYPE_STRING      = 9,\n    CPPTYPE_MESSAGE     = 10,\n    MAX_CPPTYPE         = 10,\n  };\n\n  // Helper method to get the CppType for a particular Type.\n  static CppType FieldTypeToCppType(FieldType type);\n\n  // Given a FieldSescriptor::Type return its WireType\n  static inline WireFormatLite::WireType WireTypeForFieldType(\n      WireFormatLite::FieldType type) {\n    return kWireTypeForFieldType[type];\n  }\n\n  // Number of bits in a tag which identify the wire type.\n  static const int kTagTypeBits = 3;\n  // Mask for those bits.\n  static const uint32 kTagTypeMask = (1 << kTagTypeBits) - 1;\n\n  // Helper functions for encoding and decoding tags.  (Inlined below and in\n  // _inl.h)\n  //\n  // This is different from MakeTag(field->number(), field->type()) in the case\n  // of packed repeated fields.\n  static uint32 MakeTag(int field_number, WireType type);\n  static WireType GetTagWireType(uint32 tag);\n  static int GetTagFieldNumber(uint32 tag);\n\n  // Compute the byte size of a tag.  For groups, this includes both the start\n  // and end tags.\n  static inline int TagSize(int field_number, WireFormatLite::FieldType type);\n\n  // Skips a field value with the given tag.  The input should start\n  // positioned immediately after the tag.  Skipped values are simply discarded,\n  // not recorded anywhere.  See WireFormat::SkipField() for a version that\n  // records to an UnknownFieldSet.\n  static bool SkipField(io::CodedInputStream* input, uint32 tag);\n\n  // Reads and ignores a message from the input.  Skipped values are simply\n  // discarded, not recorded anywhere.  See WireFormat::SkipMessage() for a\n  // version that records to an UnknownFieldSet.\n  static bool SkipMessage(io::CodedInputStream* input);\n\n// This macro does the same thing as WireFormatLite::MakeTag(), but the\n// result is usable as a compile-time constant, which makes it usable\n// as a switch case or a template input.  WireFormatLite::MakeTag() is more\n// type-safe, though, so prefer it if possible.\n#define GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(FIELD_NUMBER, TYPE)                  \\\n  static_cast<uint32>(                                                   \\\n    ((FIELD_NUMBER) << ::google::protobuf::internal::WireFormatLite::kTagTypeBits) \\\n      | (TYPE))\n\n  // These are the tags for the old MessageSet format, which was defined as:\n  //   message MessageSet {\n  //     repeated group Item = 1 {\n  //       required int32 type_id = 2;\n  //       required string message = 3;\n  //     }\n  //   }\n  static const int kMessageSetItemNumber = 1;\n  static const int kMessageSetTypeIdNumber = 2;\n  static const int kMessageSetMessageNumber = 3;\n  static const int kMessageSetItemStartTag =\n    GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetItemNumber,\n                                WireFormatLite::WIRETYPE_START_GROUP);\n  static const int kMessageSetItemEndTag =\n    GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetItemNumber,\n                                WireFormatLite::WIRETYPE_END_GROUP);\n  static const int kMessageSetTypeIdTag =\n    GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetTypeIdNumber,\n                                WireFormatLite::WIRETYPE_VARINT);\n  static const int kMessageSetMessageTag =\n    GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetMessageNumber,\n                                WireFormatLite::WIRETYPE_LENGTH_DELIMITED);\n\n  // Byte size of all tags of a MessageSet::Item combined.\n  static const int kMessageSetItemTagsSize;\n\n  // Helper functions for converting between floats/doubles and IEEE-754\n  // uint32s/uint64s so that they can be written.  (Assumes your platform\n  // uses IEEE-754 floats.)\n  static uint32 EncodeFloat(float value);\n  static float DecodeFloat(uint32 value);\n  static uint64 EncodeDouble(double value);\n  static double DecodeDouble(uint64 value);\n\n  // Helper functions for mapping signed integers to unsigned integers in\n  // such a way that numbers with small magnitudes will encode to smaller\n  // varints.  If you simply static_cast a negative number to an unsigned\n  // number and varint-encode it, it will always take 10 bytes, defeating\n  // the purpose of varint.  So, for the \"sint32\" and \"sint64\" field types,\n  // we ZigZag-encode the values.\n  static uint32 ZigZagEncode32(int32 n);\n  static int32  ZigZagDecode32(uint32 n);\n  static uint64 ZigZagEncode64(int64 n);\n  static int64  ZigZagDecode64(uint64 n);\n\n  // =================================================================\n  // Methods for reading/writing individual field.  The implementations\n  // of these methods are defined in wire_format_lite_inl.h; you must #include\n  // that file to use these.\n\n// Avoid ugly line wrapping\n#define input  io::CodedInputStream*  input\n#define output io::CodedOutputStream* output\n#define field_number int field_number\n#define INL GOOGLE_ATTRIBUTE_ALWAYS_INLINE\n\n  // Read fields, not including tags.  The assumption is that you already\n  // read the tag to determine what field to read.\n\n  // For primitive fields, we just use a templatized routine parameterized by\n  // the represented type and the FieldType. These are specialized with the\n  // appropriate definition for each declared type.\n  template <typename CType, enum FieldType DeclaredType>\n  static inline bool ReadPrimitive(input, CType* value) INL;\n\n  // Reads repeated primitive values, with optimizations for repeats.\n  // tag_size and tag should both be compile-time constants provided by the\n  // protocol compiler.\n  template <typename CType, enum FieldType DeclaredType>\n  static inline bool ReadRepeatedPrimitive(int tag_size,\n                                           uint32 tag,\n                                           input,\n                                           RepeatedField<CType>* value) INL;\n\n  // Identical to ReadRepeatedPrimitive, except will not inline the\n  // implementation.\n  template <typename CType, enum FieldType DeclaredType>\n  static bool ReadRepeatedPrimitiveNoInline(int tag_size,\n                                            uint32 tag,\n                                            input,\n                                            RepeatedField<CType>* value);\n\n  // Reads a primitive value directly from the provided buffer. It returns a\n  // pointer past the segment of data that was read.\n  //\n  // This is only implemented for the types with fixed wire size, e.g.\n  // float, double, and the (s)fixed* types.\n  template <typename CType, enum FieldType DeclaredType>\n  static inline const uint8* ReadPrimitiveFromArray(const uint8* buffer,\n                                                    CType* value) INL;\n\n  // Reads a primitive packed field.\n  //\n  // This is only implemented for packable types.\n  template <typename CType, enum FieldType DeclaredType>\n  static inline bool ReadPackedPrimitive(input,\n                                         RepeatedField<CType>* value) INL;\n\n  // Identical to ReadPackedPrimitive, except will not inline the\n  // implementation.\n  template <typename CType, enum FieldType DeclaredType>\n  static bool ReadPackedPrimitiveNoInline(input, RepeatedField<CType>* value);\n\n  // Read a packed enum field. Values for which is_valid() returns false are\n  // dropped.\n  static bool ReadPackedEnumNoInline(input,\n                                     bool (*is_valid)(int),\n                                     RepeatedField<int>* value);\n\n  static bool ReadString(input, string* value);\n  static bool ReadBytes (input, string* value);\n\n  static inline bool ReadGroup  (field_number, input, MessageLite* value);\n  static inline bool ReadMessage(input, MessageLite* value);\n\n  // Like above, but de-virtualize the call to MergePartialFromCodedStream().\n  // The pointer must point at an instance of MessageType, *not* a subclass (or\n  // the subclass must not override MergePartialFromCodedStream()).\n  template<typename MessageType>\n  static inline bool ReadGroupNoVirtual(field_number, input,\n                                        MessageType* value);\n  template<typename MessageType>\n  static inline bool ReadMessageNoVirtual(input, MessageType* value);\n\n  // Write a tag.  The Write*() functions typically include the tag, so\n  // normally there's no need to call this unless using the Write*NoTag()\n  // variants.\n  static inline void WriteTag(field_number, WireType type, output) INL;\n\n  // Write fields, without tags.\n  static inline void WriteInt32NoTag   (int32 value, output) INL;\n  static inline void WriteInt64NoTag   (int64 value, output) INL;\n  static inline void WriteUInt32NoTag  (uint32 value, output) INL;\n  static inline void WriteUInt64NoTag  (uint64 value, output) INL;\n  static inline void WriteSInt32NoTag  (int32 value, output) INL;\n  static inline void WriteSInt64NoTag  (int64 value, output) INL;\n  static inline void WriteFixed32NoTag (uint32 value, output) INL;\n  static inline void WriteFixed64NoTag (uint64 value, output) INL;\n  static inline void WriteSFixed32NoTag(int32 value, output) INL;\n  static inline void WriteSFixed64NoTag(int64 value, output) INL;\n  static inline void WriteFloatNoTag   (float value, output) INL;\n  static inline void WriteDoubleNoTag  (double value, output) INL;\n  static inline void WriteBoolNoTag    (bool value, output) INL;\n  static inline void WriteEnumNoTag    (int value, output) INL;\n\n  // Write fields, including tags.\n  static void WriteInt32   (field_number,  int32 value, output);\n  static void WriteInt64   (field_number,  int64 value, output);\n  static void WriteUInt32  (field_number, uint32 value, output);\n  static void WriteUInt64  (field_number, uint64 value, output);\n  static void WriteSInt32  (field_number,  int32 value, output);\n  static void WriteSInt64  (field_number,  int64 value, output);\n  static void WriteFixed32 (field_number, uint32 value, output);\n  static void WriteFixed64 (field_number, uint64 value, output);\n  static void WriteSFixed32(field_number,  int32 value, output);\n  static void WriteSFixed64(field_number,  int64 value, output);\n  static void WriteFloat   (field_number,  float value, output);\n  static void WriteDouble  (field_number, double value, output);\n  static void WriteBool    (field_number,   bool value, output);\n  static void WriteEnum    (field_number,    int value, output);\n\n  static void WriteString(field_number, const string& value, output);\n  static void WriteBytes (field_number, const string& value, output);\n\n  static void WriteGroup(\n    field_number, const MessageLite& value, output);\n  static void WriteMessage(\n    field_number, const MessageLite& value, output);\n  // Like above, but these will check if the output stream has enough\n  // space to write directly to a flat array.\n  static void WriteGroupMaybeToArray(\n    field_number, const MessageLite& value, output);\n  static void WriteMessageMaybeToArray(\n    field_number, const MessageLite& value, output);\n\n  // Like above, but de-virtualize the call to SerializeWithCachedSizes().  The\n  // pointer must point at an instance of MessageType, *not* a subclass (or\n  // the subclass must not override SerializeWithCachedSizes()).\n  template<typename MessageType>\n  static inline void WriteGroupNoVirtual(\n    field_number, const MessageType& value, output);\n  template<typename MessageType>\n  static inline void WriteMessageNoVirtual(\n    field_number, const MessageType& value, output);\n\n#undef output\n#define output uint8* target\n\n  // Like above, but use only *ToArray methods of CodedOutputStream.\n  static inline uint8* WriteTagToArray(field_number, WireType type, output) INL;\n\n  // Write fields, without tags.\n  static inline uint8* WriteInt32NoTagToArray   (int32 value, output) INL;\n  static inline uint8* WriteInt64NoTagToArray   (int64 value, output) INL;\n  static inline uint8* WriteUInt32NoTagToArray  (uint32 value, output) INL;\n  static inline uint8* WriteUInt64NoTagToArray  (uint64 value, output) INL;\n  static inline uint8* WriteSInt32NoTagToArray  (int32 value, output) INL;\n  static inline uint8* WriteSInt64NoTagToArray  (int64 value, output) INL;\n  static inline uint8* WriteFixed32NoTagToArray (uint32 value, output) INL;\n  static inline uint8* WriteFixed64NoTagToArray (uint64 value, output) INL;\n  static inline uint8* WriteSFixed32NoTagToArray(int32 value, output) INL;\n  static inline uint8* WriteSFixed64NoTagToArray(int64 value, output) INL;\n  static inline uint8* WriteFloatNoTagToArray   (float value, output) INL;\n  static inline uint8* WriteDoubleNoTagToArray  (double value, output) INL;\n  static inline uint8* WriteBoolNoTagToArray    (bool value, output) INL;\n  static inline uint8* WriteEnumNoTagToArray    (int value, output) INL;\n\n  // Write fields, including tags.\n  static inline uint8* WriteInt32ToArray(\n    field_number, int32 value, output) INL;\n  static inline uint8* WriteInt64ToArray(\n    field_number, int64 value, output) INL;\n  static inline uint8* WriteUInt32ToArray(\n    field_number, uint32 value, output) INL;\n  static inline uint8* WriteUInt64ToArray(\n    field_number, uint64 value, output) INL;\n  static inline uint8* WriteSInt32ToArray(\n    field_number, int32 value, output) INL;\n  static inline uint8* WriteSInt64ToArray(\n    field_number, int64 value, output) INL;\n  static inline uint8* WriteFixed32ToArray(\n    field_number, uint32 value, output) INL;\n  static inline uint8* WriteFixed64ToArray(\n    field_number, uint64 value, output) INL;\n  static inline uint8* WriteSFixed32ToArray(\n    field_number, int32 value, output) INL;\n  static inline uint8* WriteSFixed64ToArray(\n    field_number, int64 value, output) INL;\n  static inline uint8* WriteFloatToArray(\n    field_number, float value, output) INL;\n  static inline uint8* WriteDoubleToArray(\n    field_number, double value, output) INL;\n  static inline uint8* WriteBoolToArray(\n    field_number, bool value, output) INL;\n  static inline uint8* WriteEnumToArray(\n    field_number, int value, output) INL;\n\n  static inline uint8* WriteStringToArray(\n    field_number, const string& value, output) INL;\n  static inline uint8* WriteBytesToArray(\n    field_number, const string& value, output) INL;\n\n  static inline uint8* WriteGroupToArray(\n      field_number, const MessageLite& value, output) INL;\n  static inline uint8* WriteMessageToArray(\n      field_number, const MessageLite& value, output) INL;\n\n  // Like above, but de-virtualize the call to SerializeWithCachedSizes().  The\n  // pointer must point at an instance of MessageType, *not* a subclass (or\n  // the subclass must not override SerializeWithCachedSizes()).\n  template<typename MessageType>\n  static inline uint8* WriteGroupNoVirtualToArray(\n    field_number, const MessageType& value, output) INL;\n  template<typename MessageType>\n  static inline uint8* WriteMessageNoVirtualToArray(\n    field_number, const MessageType& value, output) INL;\n\n#undef output\n#undef input\n#undef INL\n\n#undef field_number\n\n  // Compute the byte size of a field.  The XxSize() functions do NOT include\n  // the tag, so you must also call TagSize().  (This is because, for repeated\n  // fields, you should only call TagSize() once and multiply it by the element\n  // count, but you may have to call XxSize() for each individual element.)\n  static inline int Int32Size   ( int32 value);\n  static inline int Int64Size   ( int64 value);\n  static inline int UInt32Size  (uint32 value);\n  static inline int UInt64Size  (uint64 value);\n  static inline int SInt32Size  ( int32 value);\n  static inline int SInt64Size  ( int64 value);\n  static inline int EnumSize    (   int value);\n\n  // These types always have the same size.\n  static const int kFixed32Size  = 4;\n  static const int kFixed64Size  = 8;\n  static const int kSFixed32Size = 4;\n  static const int kSFixed64Size = 8;\n  static const int kFloatSize    = 4;\n  static const int kDoubleSize   = 8;\n  static const int kBoolSize     = 1;\n\n  static inline int StringSize(const string& value);\n  static inline int BytesSize (const string& value);\n\n  static inline int GroupSize  (const MessageLite& value);\n  static inline int MessageSize(const MessageLite& value);\n\n  // Like above, but de-virtualize the call to ByteSize().  The\n  // pointer must point at an instance of MessageType, *not* a subclass (or\n  // the subclass must not override ByteSize()).\n  template<typename MessageType>\n  static inline int GroupSizeNoVirtual  (const MessageType& value);\n  template<typename MessageType>\n  static inline int MessageSizeNoVirtual(const MessageType& value);\n\n private:\n  // A helper method for the repeated primitive reader. This method has\n  // optimizations for primitive types that have fixed size on the wire, and\n  // can be read using potentially faster paths.\n  template <typename CType, enum FieldType DeclaredType>\n  static inline bool ReadRepeatedFixedSizePrimitive(\n      int tag_size,\n      uint32 tag,\n      google::protobuf::io::CodedInputStream* input,\n      RepeatedField<CType>* value) GOOGLE_ATTRIBUTE_ALWAYS_INLINE;\n\n  static const CppType kFieldTypeToCppTypeMap[];\n  static const WireFormatLite::WireType kWireTypeForFieldType[];\n\n  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(WireFormatLite);\n};\n\n// A class which deals with unknown values.  The default implementation just\n// discards them.  WireFormat defines a subclass which writes to an\n// UnknownFieldSet.  This class is used by ExtensionSet::ParseField(), since\n// ExtensionSet is part of the lite library but UnknownFieldSet is not.\nclass LIBPROTOBUF_EXPORT FieldSkipper {\n public:\n  FieldSkipper() {}\n  virtual ~FieldSkipper() {}\n\n  // Skip a field whose tag has already been consumed.\n  virtual bool SkipField(io::CodedInputStream* input, uint32 tag);\n\n  // Skip an entire message or group, up to an end-group tag (which is consumed)\n  // or end-of-stream.\n  virtual bool SkipMessage(io::CodedInputStream* input);\n\n  // Deal with an already-parsed unrecognized enum value.  The default\n  // implementation does nothing, but the UnknownFieldSet-based implementation\n  // saves it as an unknown varint.\n  virtual void SkipUnknownEnum(int field_number, int value);\n};\n\n// inline methods ====================================================\n\ninline WireFormatLite::CppType\nWireFormatLite::FieldTypeToCppType(FieldType type) {\n  return kFieldTypeToCppTypeMap[type];\n}\n\ninline uint32 WireFormatLite::MakeTag(int field_number, WireType type) {\n  return GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(field_number, type);\n}\n\ninline WireFormatLite::WireType WireFormatLite::GetTagWireType(uint32 tag) {\n  return static_cast<WireType>(tag & kTagTypeMask);\n}\n\ninline int WireFormatLite::GetTagFieldNumber(uint32 tag) {\n  return static_cast<int>(tag >> kTagTypeBits);\n}\n\ninline int WireFormatLite::TagSize(int field_number,\n                                   WireFormatLite::FieldType type) {\n  int result = io::CodedOutputStream::VarintSize32(\n    field_number << kTagTypeBits);\n  if (type == TYPE_GROUP) {\n    // Groups have both a start and an end tag.\n    return result * 2;\n  } else {\n    return result;\n  }\n}\n\ninline uint32 WireFormatLite::EncodeFloat(float value) {\n  union {float f; uint32 i;};\n  f = value;\n  return i;\n}\n\ninline float WireFormatLite::DecodeFloat(uint32 value) {\n  union {float f; uint32 i;};\n  i = value;\n  return f;\n}\n\ninline uint64 WireFormatLite::EncodeDouble(double value) {\n  union {double f; uint64 i;};\n  f = value;\n  return i;\n}\n\ninline double WireFormatLite::DecodeDouble(uint64 value) {\n  union {double f; uint64 i;};\n  i = value;\n  return f;\n}\n\n// ZigZag Transform:  Encodes signed integers so that they can be\n// effectively used with varint encoding.\n//\n// varint operates on unsigned integers, encoding smaller numbers into\n// fewer bytes.  If you try to use it on a signed integer, it will treat\n// this number as a very large unsigned integer, which means that even\n// small signed numbers like -1 will take the maximum number of bytes\n// (10) to encode.  ZigZagEncode() maps signed integers to unsigned\n// in such a way that those with a small absolute value will have smaller\n// encoded values, making them appropriate for encoding using varint.\n//\n//       int32 ->     uint32\n// -------------------------\n//           0 ->          0\n//          -1 ->          1\n//           1 ->          2\n//          -2 ->          3\n//         ... ->        ...\n//  2147483647 -> 4294967294\n// -2147483648 -> 4294967295\n//\n//        >> encode >>\n//        << decode <<\n\ninline uint32 WireFormatLite::ZigZagEncode32(int32 n) {\n  // Note:  the right-shift must be arithmetic\n  return (n << 1) ^ (n >> 31);\n}\n\ninline int32 WireFormatLite::ZigZagDecode32(uint32 n) {\n  return (n >> 1) ^ -static_cast<int32>(n & 1);\n}\n\ninline uint64 WireFormatLite::ZigZagEncode64(int64 n) {\n  // Note:  the right-shift must be arithmetic\n  return (n << 1) ^ (n >> 63);\n}\n\ninline int64 WireFormatLite::ZigZagDecode64(uint64 n) {\n  return (n >> 1) ^ -static_cast<int64>(n & 1);\n}\n\n}  // namespace internal\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite_inl.h",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//         wink@google.com (Wink Saville) (refactored from wire_format.h)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__\n#define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__\n\n#include <string>\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/message_lite.h>\n#include <google/protobuf/repeated_field.h>\n#include <google/protobuf/wire_format_lite.h>\n#include <google/protobuf/generated_message_util.h>\n#include <google/protobuf/io/coded_stream.h>\n\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\n\n// Implementation details of ReadPrimitive.\n\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_INT32>(\n    io::CodedInputStream* input,\n    int32* value) {\n  uint32 temp;\n  if (!input->ReadVarint32(&temp)) return false;\n  *value = static_cast<int32>(temp);\n  return true;\n}\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_INT64>(\n    io::CodedInputStream* input,\n    int64* value) {\n  uint64 temp;\n  if (!input->ReadVarint64(&temp)) return false;\n  *value = static_cast<int64>(temp);\n  return true;\n}\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<uint32, WireFormatLite::TYPE_UINT32>(\n    io::CodedInputStream* input,\n    uint32* value) {\n  return input->ReadVarint32(value);\n}\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<uint64, WireFormatLite::TYPE_UINT64>(\n    io::CodedInputStream* input,\n    uint64* value) {\n  return input->ReadVarint64(value);\n}\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_SINT32>(\n    io::CodedInputStream* input,\n    int32* value) {\n  uint32 temp;\n  if (!input->ReadVarint32(&temp)) return false;\n  *value = ZigZagDecode32(temp);\n  return true;\n}\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_SINT64>(\n    io::CodedInputStream* input,\n    int64* value) {\n  uint64 temp;\n  if (!input->ReadVarint64(&temp)) return false;\n  *value = ZigZagDecode64(temp);\n  return true;\n}\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<uint32, WireFormatLite::TYPE_FIXED32>(\n    io::CodedInputStream* input,\n    uint32* value) {\n  return input->ReadLittleEndian32(value);\n}\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<uint64, WireFormatLite::TYPE_FIXED64>(\n    io::CodedInputStream* input,\n    uint64* value) {\n  return input->ReadLittleEndian64(value);\n}\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_SFIXED32>(\n    io::CodedInputStream* input,\n    int32* value) {\n  uint32 temp;\n  if (!input->ReadLittleEndian32(&temp)) return false;\n  *value = static_cast<int32>(temp);\n  return true;\n}\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_SFIXED64>(\n    io::CodedInputStream* input,\n    int64* value) {\n  uint64 temp;\n  if (!input->ReadLittleEndian64(&temp)) return false;\n  *value = static_cast<int64>(temp);\n  return true;\n}\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<float, WireFormatLite::TYPE_FLOAT>(\n    io::CodedInputStream* input,\n    float* value) {\n  uint32 temp;\n  if (!input->ReadLittleEndian32(&temp)) return false;\n  *value = DecodeFloat(temp);\n  return true;\n}\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<double, WireFormatLite::TYPE_DOUBLE>(\n    io::CodedInputStream* input,\n    double* value) {\n  uint64 temp;\n  if (!input->ReadLittleEndian64(&temp)) return false;\n  *value = DecodeDouble(temp);\n  return true;\n}\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<bool, WireFormatLite::TYPE_BOOL>(\n    io::CodedInputStream* input,\n    bool* value) {\n  uint32 temp;\n  if (!input->ReadVarint32(&temp)) return false;\n  *value = temp != 0;\n  return true;\n}\ntemplate <>\ninline bool WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(\n    io::CodedInputStream* input,\n    int* value) {\n  uint32 temp;\n  if (!input->ReadVarint32(&temp)) return false;\n  *value = static_cast<int>(temp);\n  return true;\n}\n\ntemplate <>\ninline const uint8* WireFormatLite::ReadPrimitiveFromArray<\n  uint32, WireFormatLite::TYPE_FIXED32>(\n    const uint8* buffer,\n    uint32* value) {\n  return io::CodedInputStream::ReadLittleEndian32FromArray(buffer, value);\n}\ntemplate <>\ninline const uint8* WireFormatLite::ReadPrimitiveFromArray<\n  uint64, WireFormatLite::TYPE_FIXED64>(\n    const uint8* buffer,\n    uint64* value) {\n  return io::CodedInputStream::ReadLittleEndian64FromArray(buffer, value);\n}\ntemplate <>\ninline const uint8* WireFormatLite::ReadPrimitiveFromArray<\n  int32, WireFormatLite::TYPE_SFIXED32>(\n    const uint8* buffer,\n    int32* value) {\n  uint32 temp;\n  buffer = io::CodedInputStream::ReadLittleEndian32FromArray(buffer, &temp);\n  *value = static_cast<int32>(temp);\n  return buffer;\n}\ntemplate <>\ninline const uint8* WireFormatLite::ReadPrimitiveFromArray<\n  int64, WireFormatLite::TYPE_SFIXED64>(\n    const uint8* buffer,\n    int64* value) {\n  uint64 temp;\n  buffer = io::CodedInputStream::ReadLittleEndian64FromArray(buffer, &temp);\n  *value = static_cast<int64>(temp);\n  return buffer;\n}\ntemplate <>\ninline const uint8* WireFormatLite::ReadPrimitiveFromArray<\n  float, WireFormatLite::TYPE_FLOAT>(\n    const uint8* buffer,\n    float* value) {\n  uint32 temp;\n  buffer = io::CodedInputStream::ReadLittleEndian32FromArray(buffer, &temp);\n  *value = DecodeFloat(temp);\n  return buffer;\n}\ntemplate <>\ninline const uint8* WireFormatLite::ReadPrimitiveFromArray<\n  double, WireFormatLite::TYPE_DOUBLE>(\n    const uint8* buffer,\n    double* value) {\n  uint64 temp;\n  buffer = io::CodedInputStream::ReadLittleEndian64FromArray(buffer, &temp);\n  *value = DecodeDouble(temp);\n  return buffer;\n}\n\ntemplate <typename CType, enum WireFormatLite::FieldType DeclaredType>\ninline bool WireFormatLite::ReadRepeatedPrimitive(int, // tag_size, unused.\n                                               uint32 tag,\n                                               io::CodedInputStream* input,\n                                               RepeatedField<CType>* values) {\n  CType value;\n  if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;\n  values->Add(value);\n  int elements_already_reserved = values->Capacity() - values->size();\n  while (elements_already_reserved > 0 && input->ExpectTag(tag)) {\n    if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;\n    values->AddAlreadyReserved(value);\n    elements_already_reserved--;\n  }\n  return true;\n}\n\ntemplate <typename CType, enum WireFormatLite::FieldType DeclaredType>\ninline bool WireFormatLite::ReadRepeatedFixedSizePrimitive(\n    int tag_size,\n    uint32 tag,\n    io::CodedInputStream* input,\n    RepeatedField<CType>* values) {\n  GOOGLE_DCHECK_EQ(UInt32Size(tag), tag_size);\n  CType value;\n  if (!ReadPrimitive<CType, DeclaredType>(input, &value))\n    return false;\n  values->Add(value);\n\n  // For fixed size values, repeated values can be read more quickly by\n  // reading directly from a raw array.\n  //\n  // We can get a tight loop by only reading as many elements as can be\n  // added to the RepeatedField without having to do any resizing. Additionally,\n  // we only try to read as many elements as are available from the current\n  // buffer space. Doing so avoids having to perform boundary checks when\n  // reading the value: the maximum number of elements that can be read is\n  // known outside of the loop.\n  const void* void_pointer;\n  int size;\n  input->GetDirectBufferPointerInline(&void_pointer, &size);\n  if (size > 0) {\n    const uint8* buffer = reinterpret_cast<const uint8*>(void_pointer);\n    // The number of bytes each type occupies on the wire.\n    const int per_value_size = tag_size + sizeof(value);\n\n    int elements_available = min(values->Capacity() - values->size(),\n                                 size / per_value_size);\n    int num_read = 0;\n    while (num_read < elements_available &&\n           (buffer = io::CodedInputStream::ExpectTagFromArray(\n               buffer, tag)) != NULL) {\n      buffer = ReadPrimitiveFromArray<CType, DeclaredType>(buffer, &value);\n      values->AddAlreadyReserved(value);\n      ++num_read;\n    }\n    const int read_bytes = num_read * per_value_size;\n    if (read_bytes > 0) {\n      input->Skip(read_bytes);\n    }\n  }\n  return true;\n}\n\n// Specializations of ReadRepeatedPrimitive for the fixed size types, which use \n// the optimized code path.\n#define READ_REPEATED_FIXED_SIZE_PRIMITIVE(CPPTYPE, DECLARED_TYPE)             \\\ntemplate <>                                                                    \\\ninline bool WireFormatLite::ReadRepeatedPrimitive<                             \\\n  CPPTYPE, WireFormatLite::DECLARED_TYPE>(                                     \\\n    int tag_size,                                                              \\\n    uint32 tag,                                                                \\\n    io::CodedInputStream* input,                                               \\\n    RepeatedField<CPPTYPE>* values) {                                          \\\n  return ReadRepeatedFixedSizePrimitive<                                       \\\n    CPPTYPE, WireFormatLite::DECLARED_TYPE>(                                   \\\n      tag_size, tag, input, values);                                           \\\n}\n\nREAD_REPEATED_FIXED_SIZE_PRIMITIVE(uint32, TYPE_FIXED32);\nREAD_REPEATED_FIXED_SIZE_PRIMITIVE(uint64, TYPE_FIXED64);\nREAD_REPEATED_FIXED_SIZE_PRIMITIVE(int32, TYPE_SFIXED32);\nREAD_REPEATED_FIXED_SIZE_PRIMITIVE(int64, TYPE_SFIXED64);\nREAD_REPEATED_FIXED_SIZE_PRIMITIVE(float, TYPE_FLOAT);\nREAD_REPEATED_FIXED_SIZE_PRIMITIVE(double, TYPE_DOUBLE);\n\n#undef READ_REPEATED_FIXED_SIZE_PRIMITIVE\n\ntemplate <typename CType, enum WireFormatLite::FieldType DeclaredType>\nbool WireFormatLite::ReadRepeatedPrimitiveNoInline(\n    int tag_size,\n    uint32 tag,\n    io::CodedInputStream* input,\n    RepeatedField<CType>* value) {\n  return ReadRepeatedPrimitive<CType, DeclaredType>(\n      tag_size, tag, input, value);\n}\n\ntemplate <typename CType, enum WireFormatLite::FieldType DeclaredType>\ninline bool WireFormatLite::ReadPackedPrimitive(io::CodedInputStream* input,\n                                                RepeatedField<CType>* values) {\n  uint32 length;\n  if (!input->ReadVarint32(&length)) return false;\n  io::CodedInputStream::Limit limit = input->PushLimit(length);\n  while (input->BytesUntilLimit() > 0) {\n    CType value;\n    if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;\n    values->Add(value);\n  }\n  input->PopLimit(limit);\n  return true;\n}\n\ntemplate <typename CType, enum WireFormatLite::FieldType DeclaredType>\nbool WireFormatLite::ReadPackedPrimitiveNoInline(io::CodedInputStream* input,\n                                                 RepeatedField<CType>* values) {\n  return ReadPackedPrimitive<CType, DeclaredType>(input, values);\n}\n\n\ninline bool WireFormatLite::ReadGroup(int field_number,\n                                      io::CodedInputStream* input,\n                                      MessageLite* value) {\n  if (!input->IncrementRecursionDepth()) return false;\n  if (!value->MergePartialFromCodedStream(input)) return false;\n  input->DecrementRecursionDepth();\n  // Make sure the last thing read was an end tag for this group.\n  if (!input->LastTagWas(MakeTag(field_number, WIRETYPE_END_GROUP))) {\n    return false;\n  }\n  return true;\n}\ninline bool WireFormatLite::ReadMessage(io::CodedInputStream* input,\n                                        MessageLite* value) {\n  uint32 length;\n  if (!input->ReadVarint32(&length)) return false;\n  if (!input->IncrementRecursionDepth()) return false;\n  io::CodedInputStream::Limit limit = input->PushLimit(length);\n  if (!value->MergePartialFromCodedStream(input)) return false;\n  // Make sure that parsing stopped when the limit was hit, not at an endgroup\n  // tag.\n  if (!input->ConsumedEntireMessage()) return false;\n  input->PopLimit(limit);\n  input->DecrementRecursionDepth();\n  return true;\n}\n\n// We name the template parameter something long and extremely unlikely to occur\n// elsewhere because a *qualified* member access expression designed to avoid\n// virtual dispatch, C++03 [basic.lookup.classref] 3.4.5/4 requires that the\n// name of the qualifying class to be looked up both in the context of the full\n// expression (finding the template parameter) and in the context of the object\n// whose member we are accessing. This could potentially find a nested type\n// within that object. The standard goes on to require these names to refer to\n// the same entity, which this collision would violate. The lack of a safe way\n// to avoid this collision appears to be a defect in the standard, but until it\n// is corrected, we choose the name to avoid accidental collisions.\ntemplate<typename MessageType_WorkAroundCppLookupDefect>\ninline bool WireFormatLite::ReadGroupNoVirtual(\n    int field_number, io::CodedInputStream* input,\n    MessageType_WorkAroundCppLookupDefect* value) {\n  if (!input->IncrementRecursionDepth()) return false;\n  if (!value->\n      MessageType_WorkAroundCppLookupDefect::MergePartialFromCodedStream(input))\n    return false;\n  input->DecrementRecursionDepth();\n  // Make sure the last thing read was an end tag for this group.\n  if (!input->LastTagWas(MakeTag(field_number, WIRETYPE_END_GROUP))) {\n    return false;\n  }\n  return true;\n}\ntemplate<typename MessageType_WorkAroundCppLookupDefect>\ninline bool WireFormatLite::ReadMessageNoVirtual(\n    io::CodedInputStream* input, MessageType_WorkAroundCppLookupDefect* value) {\n  uint32 length;\n  if (!input->ReadVarint32(&length)) return false;\n  if (!input->IncrementRecursionDepth()) return false;\n  io::CodedInputStream::Limit limit = input->PushLimit(length);\n  if (!value->\n      MessageType_WorkAroundCppLookupDefect::MergePartialFromCodedStream(input))\n    return false;\n  // Make sure that parsing stopped when the limit was hit, not at an endgroup\n  // tag.\n  if (!input->ConsumedEntireMessage()) return false;\n  input->PopLimit(limit);\n  input->DecrementRecursionDepth();\n  return true;\n}\n\n// ===================================================================\n\ninline void WireFormatLite::WriteTag(int field_number, WireType type,\n                                     io::CodedOutputStream* output) {\n  output->WriteTag(MakeTag(field_number, type));\n}\n\ninline void WireFormatLite::WriteInt32NoTag(int32 value,\n                                            io::CodedOutputStream* output) {\n  output->WriteVarint32SignExtended(value);\n}\ninline void WireFormatLite::WriteInt64NoTag(int64 value,\n                                            io::CodedOutputStream* output) {\n  output->WriteVarint64(static_cast<uint64>(value));\n}\ninline void WireFormatLite::WriteUInt32NoTag(uint32 value,\n                                             io::CodedOutputStream* output) {\n  output->WriteVarint32(value);\n}\ninline void WireFormatLite::WriteUInt64NoTag(uint64 value,\n                                             io::CodedOutputStream* output) {\n  output->WriteVarint64(value);\n}\ninline void WireFormatLite::WriteSInt32NoTag(int32 value,\n                                             io::CodedOutputStream* output) {\n  output->WriteVarint32(ZigZagEncode32(value));\n}\ninline void WireFormatLite::WriteSInt64NoTag(int64 value,\n                                             io::CodedOutputStream* output) {\n  output->WriteVarint64(ZigZagEncode64(value));\n}\ninline void WireFormatLite::WriteFixed32NoTag(uint32 value,\n                                              io::CodedOutputStream* output) {\n  output->WriteLittleEndian32(value);\n}\ninline void WireFormatLite::WriteFixed64NoTag(uint64 value,\n                                              io::CodedOutputStream* output) {\n  output->WriteLittleEndian64(value);\n}\ninline void WireFormatLite::WriteSFixed32NoTag(int32 value,\n                                               io::CodedOutputStream* output) {\n  output->WriteLittleEndian32(static_cast<uint32>(value));\n}\ninline void WireFormatLite::WriteSFixed64NoTag(int64 value,\n                                               io::CodedOutputStream* output) {\n  output->WriteLittleEndian64(static_cast<uint64>(value));\n}\ninline void WireFormatLite::WriteFloatNoTag(float value,\n                                            io::CodedOutputStream* output) {\n  output->WriteLittleEndian32(EncodeFloat(value));\n}\ninline void WireFormatLite::WriteDoubleNoTag(double value,\n                                             io::CodedOutputStream* output) {\n  output->WriteLittleEndian64(EncodeDouble(value));\n}\ninline void WireFormatLite::WriteBoolNoTag(bool value,\n                                           io::CodedOutputStream* output) {\n  output->WriteVarint32(value ? 1 : 0);\n}\ninline void WireFormatLite::WriteEnumNoTag(int value,\n                                           io::CodedOutputStream* output) {\n  output->WriteVarint32SignExtended(value);\n}\n\n// See comment on ReadGroupNoVirtual to understand the need for this template\n// parameter name.\ntemplate<typename MessageType_WorkAroundCppLookupDefect>\ninline void WireFormatLite::WriteGroupNoVirtual(\n    int field_number, const MessageType_WorkAroundCppLookupDefect& value,\n    io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_START_GROUP, output);\n  value.MessageType_WorkAroundCppLookupDefect::SerializeWithCachedSizes(output);\n  WriteTag(field_number, WIRETYPE_END_GROUP, output);\n}\ntemplate<typename MessageType_WorkAroundCppLookupDefect>\ninline void WireFormatLite::WriteMessageNoVirtual(\n    int field_number, const MessageType_WorkAroundCppLookupDefect& value,\n    io::CodedOutputStream* output) {\n  WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output);\n  output->WriteVarint32(\n      value.MessageType_WorkAroundCppLookupDefect::GetCachedSize());\n  value.MessageType_WorkAroundCppLookupDefect::SerializeWithCachedSizes(output);\n}\n\n// ===================================================================\n\ninline uint8* WireFormatLite::WriteTagToArray(int field_number,\n                                              WireType type,\n                                              uint8* target) {\n  return io::CodedOutputStream::WriteTagToArray(MakeTag(field_number, type),\n                                                target);\n}\n\ninline uint8* WireFormatLite::WriteInt32NoTagToArray(int32 value,\n                                                     uint8* target) {\n  return io::CodedOutputStream::WriteVarint32SignExtendedToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteInt64NoTagToArray(int64 value,\n                                                     uint8* target) {\n  return io::CodedOutputStream::WriteVarint64ToArray(\n      static_cast<uint64>(value), target);\n}\ninline uint8* WireFormatLite::WriteUInt32NoTagToArray(uint32 value,\n                                                      uint8* target) {\n  return io::CodedOutputStream::WriteVarint32ToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteUInt64NoTagToArray(uint64 value,\n                                                      uint8* target) {\n  return io::CodedOutputStream::WriteVarint64ToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteSInt32NoTagToArray(int32 value,\n                                                      uint8* target) {\n  return io::CodedOutputStream::WriteVarint32ToArray(ZigZagEncode32(value),\n                                                     target);\n}\ninline uint8* WireFormatLite::WriteSInt64NoTagToArray(int64 value,\n                                                      uint8* target) {\n  return io::CodedOutputStream::WriteVarint64ToArray(ZigZagEncode64(value),\n                                                     target);\n}\ninline uint8* WireFormatLite::WriteFixed32NoTagToArray(uint32 value,\n                                                       uint8* target) {\n  return io::CodedOutputStream::WriteLittleEndian32ToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteFixed64NoTagToArray(uint64 value,\n                                                       uint8* target) {\n  return io::CodedOutputStream::WriteLittleEndian64ToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteSFixed32NoTagToArray(int32 value,\n                                                        uint8* target) {\n  return io::CodedOutputStream::WriteLittleEndian32ToArray(\n      static_cast<uint32>(value), target);\n}\ninline uint8* WireFormatLite::WriteSFixed64NoTagToArray(int64 value,\n                                                        uint8* target) {\n  return io::CodedOutputStream::WriteLittleEndian64ToArray(\n      static_cast<uint64>(value), target);\n}\ninline uint8* WireFormatLite::WriteFloatNoTagToArray(float value,\n                                                     uint8* target) {\n  return io::CodedOutputStream::WriteLittleEndian32ToArray(EncodeFloat(value),\n                                                           target);\n}\ninline uint8* WireFormatLite::WriteDoubleNoTagToArray(double value,\n                                                      uint8* target) {\n  return io::CodedOutputStream::WriteLittleEndian64ToArray(EncodeDouble(value),\n                                                           target);\n}\ninline uint8* WireFormatLite::WriteBoolNoTagToArray(bool value,\n                                                    uint8* target) {\n  return io::CodedOutputStream::WriteVarint32ToArray(value ? 1 : 0, target);\n}\ninline uint8* WireFormatLite::WriteEnumNoTagToArray(int value,\n                                                    uint8* target) {\n  return io::CodedOutputStream::WriteVarint32SignExtendedToArray(value, target);\n}\n\ninline uint8* WireFormatLite::WriteInt32ToArray(int field_number,\n                                                int32 value,\n                                                uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);\n  return WriteInt32NoTagToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteInt64ToArray(int field_number,\n                                                int64 value,\n                                                uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);\n  return WriteInt64NoTagToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteUInt32ToArray(int field_number,\n                                                 uint32 value,\n                                                 uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);\n  return WriteUInt32NoTagToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteUInt64ToArray(int field_number,\n                                                 uint64 value,\n                                                 uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);\n  return WriteUInt64NoTagToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteSInt32ToArray(int field_number,\n                                                 int32 value,\n                                                 uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);\n  return WriteSInt32NoTagToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteSInt64ToArray(int field_number,\n                                                 int64 value,\n                                                 uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);\n  return WriteSInt64NoTagToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteFixed32ToArray(int field_number,\n                                                  uint32 value,\n                                                  uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);\n  return WriteFixed32NoTagToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteFixed64ToArray(int field_number,\n                                                  uint64 value,\n                                                  uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);\n  return WriteFixed64NoTagToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteSFixed32ToArray(int field_number,\n                                                   int32 value,\n                                                   uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);\n  return WriteSFixed32NoTagToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteSFixed64ToArray(int field_number,\n                                                   int64 value,\n                                                   uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);\n  return WriteSFixed64NoTagToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteFloatToArray(int field_number,\n                                                float value,\n                                                uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);\n  return WriteFloatNoTagToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteDoubleToArray(int field_number,\n                                                 double value,\n                                                 uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);\n  return WriteDoubleNoTagToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteBoolToArray(int field_number,\n                                               bool value,\n                                               uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);\n  return WriteBoolNoTagToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteEnumToArray(int field_number,\n                                               int value,\n                                               uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);\n  return WriteEnumNoTagToArray(value, target);\n}\n\ninline uint8* WireFormatLite::WriteStringToArray(int field_number,\n                                                 const string& value,\n                                                 uint8* target) {\n  // String is for UTF-8 text only\n  // WARNING:  In wire_format.cc, both strings and bytes are handled by\n  //   WriteString() to avoid code duplication.  If the implementations become\n  //   different, you will need to update that usage.\n  target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);\n  target = io::CodedOutputStream::WriteVarint32ToArray(value.size(), target);\n  return io::CodedOutputStream::WriteStringToArray(value, target);\n}\ninline uint8* WireFormatLite::WriteBytesToArray(int field_number,\n                                                const string& value,\n                                                uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);\n  target = io::CodedOutputStream::WriteVarint32ToArray(value.size(), target);\n  return io::CodedOutputStream::WriteStringToArray(value, target);\n}\n\n\ninline uint8* WireFormatLite::WriteGroupToArray(int field_number,\n                                                const MessageLite& value,\n                                                uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target);\n  target = value.SerializeWithCachedSizesToArray(target);\n  return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target);\n}\ninline uint8* WireFormatLite::WriteMessageToArray(int field_number,\n                                                  const MessageLite& value,\n                                                  uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);\n  target = io::CodedOutputStream::WriteVarint32ToArray(\n    value.GetCachedSize(), target);\n  return value.SerializeWithCachedSizesToArray(target);\n}\n\n// See comment on ReadGroupNoVirtual to understand the need for this template\n// parameter name.\ntemplate<typename MessageType_WorkAroundCppLookupDefect>\ninline uint8* WireFormatLite::WriteGroupNoVirtualToArray(\n    int field_number, const MessageType_WorkAroundCppLookupDefect& value,\n    uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target);\n  target = value.MessageType_WorkAroundCppLookupDefect\n      ::SerializeWithCachedSizesToArray(target);\n  return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target);\n}\ntemplate<typename MessageType_WorkAroundCppLookupDefect>\ninline uint8* WireFormatLite::WriteMessageNoVirtualToArray(\n    int field_number, const MessageType_WorkAroundCppLookupDefect& value,\n    uint8* target) {\n  target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);\n  target = io::CodedOutputStream::WriteVarint32ToArray(\n    value.MessageType_WorkAroundCppLookupDefect::GetCachedSize(), target);\n  return value.MessageType_WorkAroundCppLookupDefect\n      ::SerializeWithCachedSizesToArray(target);\n}\n\n// ===================================================================\n\ninline int WireFormatLite::Int32Size(int32 value) {\n  return io::CodedOutputStream::VarintSize32SignExtended(value);\n}\ninline int WireFormatLite::Int64Size(int64 value) {\n  return io::CodedOutputStream::VarintSize64(static_cast<uint64>(value));\n}\ninline int WireFormatLite::UInt32Size(uint32 value) {\n  return io::CodedOutputStream::VarintSize32(value);\n}\ninline int WireFormatLite::UInt64Size(uint64 value) {\n  return io::CodedOutputStream::VarintSize64(value);\n}\ninline int WireFormatLite::SInt32Size(int32 value) {\n  return io::CodedOutputStream::VarintSize32(ZigZagEncode32(value));\n}\ninline int WireFormatLite::SInt64Size(int64 value) {\n  return io::CodedOutputStream::VarintSize64(ZigZagEncode64(value));\n}\ninline int WireFormatLite::EnumSize(int value) {\n  return io::CodedOutputStream::VarintSize32SignExtended(value);\n}\n\ninline int WireFormatLite::StringSize(const string& value) {\n  return io::CodedOutputStream::VarintSize32(value.size()) +\n         value.size();\n}\ninline int WireFormatLite::BytesSize(const string& value) {\n  return io::CodedOutputStream::VarintSize32(value.size()) +\n         value.size();\n}\n\n\ninline int WireFormatLite::GroupSize(const MessageLite& value) {\n  return value.ByteSize();\n}\ninline int WireFormatLite::MessageSize(const MessageLite& value) {\n  int size = value.ByteSize();\n  return io::CodedOutputStream::VarintSize32(size) + size;\n}\n\n// See comment on ReadGroupNoVirtual to understand the need for this template\n// parameter name.\ntemplate<typename MessageType_WorkAroundCppLookupDefect>\ninline int WireFormatLite::GroupSizeNoVirtual(\n    const MessageType_WorkAroundCppLookupDefect& value) {\n  return value.MessageType_WorkAroundCppLookupDefect::ByteSize();\n}\ntemplate<typename MessageType_WorkAroundCppLookupDefect>\ninline int WireFormatLite::MessageSizeNoVirtual(\n    const MessageType_WorkAroundCppLookupDefect& value) {\n  int size = value.MessageType_WorkAroundCppLookupDefect::ByteSize();\n  return io::CodedOutputStream::VarintSize32(size) + size;\n}\n\n}  // namespace internal\n}  // namespace protobuf\n\n}  // namespace google\n#endif  // GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_unittest.cc",
    "content": "// Protocol Buffers - Google's data interchange format\n// Copyright 2008 Google Inc.  All rights reserved.\n// http://code.google.com/p/protobuf/\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n//     * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Author: kenton@google.com (Kenton Varda)\n//  Based on original Protocol Buffers design by\n//  Sanjay Ghemawat, Jeff Dean, and others.\n\n#include <google/protobuf/wire_format.h>\n#include <google/protobuf/wire_format_lite_inl.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/io/zero_copy_stream_impl.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/unittest.pb.h>\n#include <google/protobuf/unittest_mset.pb.h>\n#include <google/protobuf/test_util.h>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/testing/googletest.h>\n#include <gtest/gtest.h>\n#include <google/protobuf/stubs/stl_util-inl.h>\n\nnamespace google {\nnamespace protobuf {\nnamespace internal {\nnamespace {\n\nTEST(WireFormatTest, EnumsInSync) {\n  // Verify that WireFormatLite::FieldType and WireFormatLite::CppType match\n  // FieldDescriptor::Type and FieldDescriptor::CppType.\n\n  EXPECT_EQ(implicit_cast<int>(FieldDescriptor::MAX_TYPE),\n            implicit_cast<int>(WireFormatLite::MAX_FIELD_TYPE));\n  EXPECT_EQ(implicit_cast<int>(FieldDescriptor::MAX_CPPTYPE),\n            implicit_cast<int>(WireFormatLite::MAX_CPPTYPE));\n\n  for (int i = 1; i <= WireFormatLite::MAX_FIELD_TYPE; i++) {\n    EXPECT_EQ(\n      implicit_cast<int>(FieldDescriptor::TypeToCppType(\n        static_cast<FieldDescriptor::Type>(i))),\n      implicit_cast<int>(WireFormatLite::FieldTypeToCppType(\n        static_cast<WireFormatLite::FieldType>(i))));\n  }\n}\n\nTEST(WireFormatTest, MaxFieldNumber) {\n  // Make sure the max field number constant is accurate.\n  EXPECT_EQ((1 << (32 - WireFormatLite::kTagTypeBits)) - 1,\n            FieldDescriptor::kMaxNumber);\n}\n\nTEST(WireFormatTest, Parse) {\n  unittest::TestAllTypes source, dest;\n  string data;\n\n  // Serialize using the generated code.\n  TestUtil::SetAllFields(&source);\n  source.SerializeToString(&data);\n\n  // Parse using WireFormat.\n  io::ArrayInputStream raw_input(data.data(), data.size());\n  io::CodedInputStream input(&raw_input);\n  WireFormat::ParseAndMergePartial(&input, &dest);\n\n  // Check.\n  TestUtil::ExpectAllFieldsSet(dest);\n}\n\nTEST(WireFormatTest, ParseExtensions) {\n  unittest::TestAllExtensions source, dest;\n  string data;\n\n  // Serialize using the generated code.\n  TestUtil::SetAllExtensions(&source);\n  source.SerializeToString(&data);\n\n  // Parse using WireFormat.\n  io::ArrayInputStream raw_input(data.data(), data.size());\n  io::CodedInputStream input(&raw_input);\n  WireFormat::ParseAndMergePartial(&input, &dest);\n\n  // Check.\n  TestUtil::ExpectAllExtensionsSet(dest);\n}\n\nTEST(WireFormatTest, ParsePacked) {\n  unittest::TestPackedTypes source, dest;\n  string data;\n\n  // Serialize using the generated code.\n  TestUtil::SetPackedFields(&source);\n  source.SerializeToString(&data);\n\n  // Parse using WireFormat.\n  io::ArrayInputStream raw_input(data.data(), data.size());\n  io::CodedInputStream input(&raw_input);\n  WireFormat::ParseAndMergePartial(&input, &dest);\n\n  // Check.\n  TestUtil::ExpectPackedFieldsSet(dest);\n}\n\nTEST(WireFormatTest, ParsePackedFromUnpacked) {\n  // Serialize using the generated code.\n  unittest::TestUnpackedTypes source;\n  TestUtil::SetUnpackedFields(&source);\n  string data = source.SerializeAsString();\n\n  // Parse using WireFormat.\n  unittest::TestPackedTypes dest;\n  io::ArrayInputStream raw_input(data.data(), data.size());\n  io::CodedInputStream input(&raw_input);\n  WireFormat::ParseAndMergePartial(&input, &dest);\n\n  // Check.\n  TestUtil::ExpectPackedFieldsSet(dest);\n}\n\nTEST(WireFormatTest, ParseUnpackedFromPacked) {\n  // Serialize using the generated code.\n  unittest::TestPackedTypes source;\n  TestUtil::SetPackedFields(&source);\n  string data = source.SerializeAsString();\n\n  // Parse using WireFormat.\n  unittest::TestUnpackedTypes dest;\n  io::ArrayInputStream raw_input(data.data(), data.size());\n  io::CodedInputStream input(&raw_input);\n  WireFormat::ParseAndMergePartial(&input, &dest);\n\n  // Check.\n  TestUtil::ExpectUnpackedFieldsSet(dest);\n}\n\nTEST(WireFormatTest, ParsePackedExtensions) {\n  unittest::TestPackedExtensions source, dest;\n  string data;\n\n  // Serialize using the generated code.\n  TestUtil::SetPackedExtensions(&source);\n  source.SerializeToString(&data);\n\n  // Parse using WireFormat.\n  io::ArrayInputStream raw_input(data.data(), data.size());\n  io::CodedInputStream input(&raw_input);\n  WireFormat::ParseAndMergePartial(&input, &dest);\n\n  // Check.\n  TestUtil::ExpectPackedExtensionsSet(dest);\n}\n\nTEST(WireFormatTest, ByteSize) {\n  unittest::TestAllTypes message;\n  TestUtil::SetAllFields(&message);\n\n  EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message));\n  message.Clear();\n  EXPECT_EQ(0, message.ByteSize());\n  EXPECT_EQ(0, WireFormat::ByteSize(message));\n}\n\nTEST(WireFormatTest, ByteSizeExtensions) {\n  unittest::TestAllExtensions message;\n  TestUtil::SetAllExtensions(&message);\n\n  EXPECT_EQ(message.ByteSize(),\n            WireFormat::ByteSize(message));\n  message.Clear();\n  EXPECT_EQ(0, message.ByteSize());\n  EXPECT_EQ(0, WireFormat::ByteSize(message));\n}\n\nTEST(WireFormatTest, ByteSizePacked) {\n  unittest::TestPackedTypes message;\n  TestUtil::SetPackedFields(&message);\n\n  EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message));\n  message.Clear();\n  EXPECT_EQ(0, message.ByteSize());\n  EXPECT_EQ(0, WireFormat::ByteSize(message));\n}\n\nTEST(WireFormatTest, ByteSizePackedExtensions) {\n  unittest::TestPackedExtensions message;\n  TestUtil::SetPackedExtensions(&message);\n\n  EXPECT_EQ(message.ByteSize(),\n            WireFormat::ByteSize(message));\n  message.Clear();\n  EXPECT_EQ(0, message.ByteSize());\n  EXPECT_EQ(0, WireFormat::ByteSize(message));\n}\n\nTEST(WireFormatTest, Serialize) {\n  unittest::TestAllTypes message;\n  string generated_data;\n  string dynamic_data;\n\n  TestUtil::SetAllFields(&message);\n  int size = message.ByteSize();\n\n  // Serialize using the generated code.\n  {\n    io::StringOutputStream raw_output(&generated_data);\n    io::CodedOutputStream output(&raw_output);\n    message.SerializeWithCachedSizes(&output);\n    ASSERT_FALSE(output.HadError());\n  }\n\n  // Serialize using WireFormat.\n  {\n    io::StringOutputStream raw_output(&dynamic_data);\n    io::CodedOutputStream output(&raw_output);\n    WireFormat::SerializeWithCachedSizes(message, size, &output);\n    ASSERT_FALSE(output.HadError());\n  }\n\n  // Should be the same.\n  // Don't use EXPECT_EQ here because we're comparing raw binary data and\n  // we really don't want it dumped to stdout on failure.\n  EXPECT_TRUE(dynamic_data == generated_data);\n}\n\nTEST(WireFormatTest, SerializeExtensions) {\n  unittest::TestAllExtensions message;\n  string generated_data;\n  string dynamic_data;\n\n  TestUtil::SetAllExtensions(&message);\n  int size = message.ByteSize();\n\n  // Serialize using the generated code.\n  {\n    io::StringOutputStream raw_output(&generated_data);\n    io::CodedOutputStream output(&raw_output);\n    message.SerializeWithCachedSizes(&output);\n    ASSERT_FALSE(output.HadError());\n  }\n\n  // Serialize using WireFormat.\n  {\n    io::StringOutputStream raw_output(&dynamic_data);\n    io::CodedOutputStream output(&raw_output);\n    WireFormat::SerializeWithCachedSizes(message, size, &output);\n    ASSERT_FALSE(output.HadError());\n  }\n\n  // Should be the same.\n  // Don't use EXPECT_EQ here because we're comparing raw binary data and\n  // we really don't want it dumped to stdout on failure.\n  EXPECT_TRUE(dynamic_data == generated_data);\n}\n\nTEST(WireFormatTest, SerializeFieldsAndExtensions) {\n  unittest::TestFieldOrderings message;\n  string generated_data;\n  string dynamic_data;\n\n  TestUtil::SetAllFieldsAndExtensions(&message);\n  int size = message.ByteSize();\n\n  // Serialize using the generated code.\n  {\n    io::StringOutputStream raw_output(&generated_data);\n    io::CodedOutputStream output(&raw_output);\n    message.SerializeWithCachedSizes(&output);\n    ASSERT_FALSE(output.HadError());\n  }\n\n  // Serialize using WireFormat.\n  {\n    io::StringOutputStream raw_output(&dynamic_data);\n    io::CodedOutputStream output(&raw_output);\n    WireFormat::SerializeWithCachedSizes(message, size, &output);\n    ASSERT_FALSE(output.HadError());\n  }\n\n  // Should be the same.\n  // Don't use EXPECT_EQ here because we're comparing raw binary data and\n  // we really don't want it dumped to stdout on failure.\n  EXPECT_TRUE(dynamic_data == generated_data);\n\n  // Should output in canonical order.\n  TestUtil::ExpectAllFieldsAndExtensionsInOrder(dynamic_data);\n  TestUtil::ExpectAllFieldsAndExtensionsInOrder(generated_data);\n}\n\nTEST(WireFormatTest, ParseMultipleExtensionRanges) {\n  // Make sure we can parse a message that contains multiple extensions ranges.\n  unittest::TestFieldOrderings source;\n  string data;\n\n  TestUtil::SetAllFieldsAndExtensions(&source);\n  source.SerializeToString(&data);\n\n  {\n    unittest::TestFieldOrderings dest;\n    EXPECT_TRUE(dest.ParseFromString(data));\n    EXPECT_EQ(source.DebugString(), dest.DebugString());\n  }\n\n  // Also test using reflection-based parsing.\n  {\n    unittest::TestFieldOrderings dest;\n    io::ArrayInputStream raw_input(data.data(), data.size());\n    io::CodedInputStream coded_input(&raw_input);\n    EXPECT_TRUE(WireFormat::ParseAndMergePartial(&coded_input, &dest));\n    EXPECT_EQ(source.DebugString(), dest.DebugString());\n  }\n}\n\nconst int kUnknownTypeId = 1550055;\n\nTEST(WireFormatTest, SerializeMessageSet) {\n  // Set up a TestMessageSet with two known messages and an unknown one.\n  unittest::TestMessageSet message_set;\n  message_set.MutableExtension(\n    unittest::TestMessageSetExtension1::message_set_extension)->set_i(123);\n  message_set.MutableExtension(\n    unittest::TestMessageSetExtension2::message_set_extension)->set_str(\"foo\");\n  message_set.mutable_unknown_fields()->AddLengthDelimited(\n    kUnknownTypeId, \"bar\");\n\n  string data;\n  ASSERT_TRUE(message_set.SerializeToString(&data));\n\n  // Parse back using RawMessageSet and check the contents.\n  unittest::RawMessageSet raw;\n  ASSERT_TRUE(raw.ParseFromString(data));\n\n  EXPECT_EQ(0, raw.unknown_fields().field_count());\n\n  ASSERT_EQ(3, raw.item_size());\n  EXPECT_EQ(\n    unittest::TestMessageSetExtension1::descriptor()->extension(0)->number(),\n    raw.item(0).type_id());\n  EXPECT_EQ(\n    unittest::TestMessageSetExtension2::descriptor()->extension(0)->number(),\n    raw.item(1).type_id());\n  EXPECT_EQ(kUnknownTypeId, raw.item(2).type_id());\n\n  unittest::TestMessageSetExtension1 message1;\n  EXPECT_TRUE(message1.ParseFromString(raw.item(0).message()));\n  EXPECT_EQ(123, message1.i());\n\n  unittest::TestMessageSetExtension2 message2;\n  EXPECT_TRUE(message2.ParseFromString(raw.item(1).message()));\n  EXPECT_EQ(\"foo\", message2.str());\n\n  EXPECT_EQ(\"bar\", raw.item(2).message());\n}\n\nTEST(WireFormatTest, SerializeMessageSetVariousWaysAreEqual) {\n  // Serialize a MessageSet to a stream and to a flat array using generated\n  // code, and also using WireFormat, and check that the results are equal.\n  // Set up a TestMessageSet with two known messages and an unknown one, as\n  // above.\n\n  unittest::TestMessageSet message_set;\n  message_set.MutableExtension(\n    unittest::TestMessageSetExtension1::message_set_extension)->set_i(123);\n  message_set.MutableExtension(\n    unittest::TestMessageSetExtension2::message_set_extension)->set_str(\"foo\");\n  message_set.mutable_unknown_fields()->AddLengthDelimited(\n    kUnknownTypeId, \"bar\");\n\n  int size = message_set.ByteSize();\n  EXPECT_EQ(size, message_set.GetCachedSize());\n  ASSERT_EQ(size, WireFormat::ByteSize(message_set));\n\n  string flat_data;\n  string stream_data;\n  string dynamic_data;\n  flat_data.resize(size);\n  stream_data.resize(size);\n\n  // Serialize to flat array\n  {\n    uint8* target = reinterpret_cast<uint8*>(string_as_array(&flat_data));\n    uint8* end = message_set.SerializeWithCachedSizesToArray(target);\n    EXPECT_EQ(size, end - target);\n  }\n\n  // Serialize to buffer\n  {\n    io::ArrayOutputStream array_stream(string_as_array(&stream_data), size, 1);\n    io::CodedOutputStream output_stream(&array_stream);\n    message_set.SerializeWithCachedSizes(&output_stream);\n    ASSERT_FALSE(output_stream.HadError());\n  }\n\n  // Serialize to buffer with WireFormat.\n  {\n    io::StringOutputStream string_stream(&dynamic_data);\n    io::CodedOutputStream output_stream(&string_stream);\n    WireFormat::SerializeWithCachedSizes(message_set, size, &output_stream);\n    ASSERT_FALSE(output_stream.HadError());\n  }\n\n  EXPECT_TRUE(flat_data == stream_data);\n  EXPECT_TRUE(flat_data == dynamic_data);\n}\n\nTEST(WireFormatTest, ParseMessageSet) {\n  // Set up a RawMessageSet with two known messages and an unknown one.\n  unittest::RawMessageSet raw;\n\n  {\n    unittest::RawMessageSet::Item* item = raw.add_item();\n    item->set_type_id(\n      unittest::TestMessageSetExtension1::descriptor()->extension(0)->number());\n    unittest::TestMessageSetExtension1 message;\n    message.set_i(123);\n    message.SerializeToString(item->mutable_message());\n  }\n\n  {\n    unittest::RawMessageSet::Item* item = raw.add_item();\n    item->set_type_id(\n      unittest::TestMessageSetExtension2::descriptor()->extension(0)->number());\n    unittest::TestMessageSetExtension2 message;\n    message.set_str(\"foo\");\n    message.SerializeToString(item->mutable_message());\n  }\n\n  {\n    unittest::RawMessageSet::Item* item = raw.add_item();\n    item->set_type_id(kUnknownTypeId);\n    item->set_message(\"bar\");\n  }\n\n  string data;\n  ASSERT_TRUE(raw.SerializeToString(&data));\n\n  // Parse as a TestMessageSet and check the contents.\n  unittest::TestMessageSet message_set;\n  ASSERT_TRUE(message_set.ParseFromString(data));\n\n  EXPECT_EQ(123, message_set.GetExtension(\n    unittest::TestMessageSetExtension1::message_set_extension).i());\n  EXPECT_EQ(\"foo\", message_set.GetExtension(\n    unittest::TestMessageSetExtension2::message_set_extension).str());\n\n  ASSERT_EQ(1, message_set.unknown_fields().field_count());\n  ASSERT_EQ(UnknownField::TYPE_LENGTH_DELIMITED,\n            message_set.unknown_fields().field(0).type());\n  EXPECT_EQ(\"bar\", message_set.unknown_fields().field(0).length_delimited());\n\n  // Also parse using WireFormat.\n  unittest::TestMessageSet dynamic_message_set;\n  io::CodedInputStream input(reinterpret_cast<const uint8*>(data.data()),\n                             data.size());\n  ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &dynamic_message_set));\n  EXPECT_EQ(message_set.DebugString(), dynamic_message_set.DebugString());\n}\n\nTEST(WireFormatTest, RecursionLimit) {\n  unittest::TestRecursiveMessage message;\n  message.mutable_a()->mutable_a()->mutable_a()->mutable_a()->set_i(1);\n  string data;\n  message.SerializeToString(&data);\n\n  {\n    io::ArrayInputStream raw_input(data.data(), data.size());\n    io::CodedInputStream input(&raw_input);\n    input.SetRecursionLimit(4);\n    unittest::TestRecursiveMessage message2;\n    EXPECT_TRUE(message2.ParseFromCodedStream(&input));\n  }\n\n  {\n    io::ArrayInputStream raw_input(data.data(), data.size());\n    io::CodedInputStream input(&raw_input);\n    input.SetRecursionLimit(3);\n    unittest::TestRecursiveMessage message2;\n    EXPECT_FALSE(message2.ParseFromCodedStream(&input));\n  }\n}\n\nTEST(WireFormatTest, UnknownFieldRecursionLimit) {\n  unittest::TestEmptyMessage message;\n  message.mutable_unknown_fields()\n        ->AddGroup(1234)\n        ->AddGroup(1234)\n        ->AddGroup(1234)\n        ->AddGroup(1234)\n        ->AddVarint(1234, 123);\n  string data;\n  message.SerializeToString(&data);\n\n  {\n    io::ArrayInputStream raw_input(data.data(), data.size());\n    io::CodedInputStream input(&raw_input);\n    input.SetRecursionLimit(4);\n    unittest::TestEmptyMessage message2;\n    EXPECT_TRUE(message2.ParseFromCodedStream(&input));\n  }\n\n  {\n    io::ArrayInputStream raw_input(data.data(), data.size());\n    io::CodedInputStream input(&raw_input);\n    input.SetRecursionLimit(3);\n    unittest::TestEmptyMessage message2;\n    EXPECT_FALSE(message2.ParseFromCodedStream(&input));\n  }\n}\n\nTEST(WireFormatTest, ZigZag) {\n// avoid line-wrapping\n#define LL(x) GOOGLE_LONGLONG(x)\n#define ULL(x) GOOGLE_ULONGLONG(x)\n#define ZigZagEncode32(x) WireFormatLite::ZigZagEncode32(x)\n#define ZigZagDecode32(x) WireFormatLite::ZigZagDecode32(x)\n#define ZigZagEncode64(x) WireFormatLite::ZigZagEncode64(x)\n#define ZigZagDecode64(x) WireFormatLite::ZigZagDecode64(x)\n\n  EXPECT_EQ(0u, ZigZagEncode32( 0));\n  EXPECT_EQ(1u, ZigZagEncode32(-1));\n  EXPECT_EQ(2u, ZigZagEncode32( 1));\n  EXPECT_EQ(3u, ZigZagEncode32(-2));\n  EXPECT_EQ(0x7FFFFFFEu, ZigZagEncode32(0x3FFFFFFF));\n  EXPECT_EQ(0x7FFFFFFFu, ZigZagEncode32(0xC0000000));\n  EXPECT_EQ(0xFFFFFFFEu, ZigZagEncode32(0x7FFFFFFF));\n  EXPECT_EQ(0xFFFFFFFFu, ZigZagEncode32(0x80000000));\n\n  EXPECT_EQ( 0, ZigZagDecode32(0u));\n  EXPECT_EQ(-1, ZigZagDecode32(1u));\n  EXPECT_EQ( 1, ZigZagDecode32(2u));\n  EXPECT_EQ(-2, ZigZagDecode32(3u));\n  EXPECT_EQ(0x3FFFFFFF, ZigZagDecode32(0x7FFFFFFEu));\n  EXPECT_EQ(0xC0000000, ZigZagDecode32(0x7FFFFFFFu));\n  EXPECT_EQ(0x7FFFFFFF, ZigZagDecode32(0xFFFFFFFEu));\n  EXPECT_EQ(0x80000000, ZigZagDecode32(0xFFFFFFFFu));\n\n  EXPECT_EQ(0u, ZigZagEncode64( 0));\n  EXPECT_EQ(1u, ZigZagEncode64(-1));\n  EXPECT_EQ(2u, ZigZagEncode64( 1));\n  EXPECT_EQ(3u, ZigZagEncode64(-2));\n  EXPECT_EQ(ULL(0x000000007FFFFFFE), ZigZagEncode64(LL(0x000000003FFFFFFF)));\n  EXPECT_EQ(ULL(0x000000007FFFFFFF), ZigZagEncode64(LL(0xFFFFFFFFC0000000)));\n  EXPECT_EQ(ULL(0x00000000FFFFFFFE), ZigZagEncode64(LL(0x000000007FFFFFFF)));\n  EXPECT_EQ(ULL(0x00000000FFFFFFFF), ZigZagEncode64(LL(0xFFFFFFFF80000000)));\n  EXPECT_EQ(ULL(0xFFFFFFFFFFFFFFFE), ZigZagEncode64(LL(0x7FFFFFFFFFFFFFFF)));\n  EXPECT_EQ(ULL(0xFFFFFFFFFFFFFFFF), ZigZagEncode64(LL(0x8000000000000000)));\n\n  EXPECT_EQ( 0, ZigZagDecode64(0u));\n  EXPECT_EQ(-1, ZigZagDecode64(1u));\n  EXPECT_EQ( 1, ZigZagDecode64(2u));\n  EXPECT_EQ(-2, ZigZagDecode64(3u));\n  EXPECT_EQ(LL(0x000000003FFFFFFF), ZigZagDecode64(ULL(0x000000007FFFFFFE)));\n  EXPECT_EQ(LL(0xFFFFFFFFC0000000), ZigZagDecode64(ULL(0x000000007FFFFFFF)));\n  EXPECT_EQ(LL(0x000000007FFFFFFF), ZigZagDecode64(ULL(0x00000000FFFFFFFE)));\n  EXPECT_EQ(LL(0xFFFFFFFF80000000), ZigZagDecode64(ULL(0x00000000FFFFFFFF)));\n  EXPECT_EQ(LL(0x7FFFFFFFFFFFFFFF), ZigZagDecode64(ULL(0xFFFFFFFFFFFFFFFE)));\n  EXPECT_EQ(LL(0x8000000000000000), ZigZagDecode64(ULL(0xFFFFFFFFFFFFFFFF)));\n\n  // Some easier-to-verify round-trip tests.  The inputs (other than 0, 1, -1)\n  // were chosen semi-randomly via keyboard bashing.\n  EXPECT_EQ(    0, ZigZagDecode32(ZigZagEncode32(    0)));\n  EXPECT_EQ(    1, ZigZagDecode32(ZigZagEncode32(    1)));\n  EXPECT_EQ(   -1, ZigZagDecode32(ZigZagEncode32(   -1)));\n  EXPECT_EQ(14927, ZigZagDecode32(ZigZagEncode32(14927)));\n  EXPECT_EQ(-3612, ZigZagDecode32(ZigZagEncode32(-3612)));\n\n  EXPECT_EQ(    0, ZigZagDecode64(ZigZagEncode64(    0)));\n  EXPECT_EQ(    1, ZigZagDecode64(ZigZagEncode64(    1)));\n  EXPECT_EQ(   -1, ZigZagDecode64(ZigZagEncode64(   -1)));\n  EXPECT_EQ(14927, ZigZagDecode64(ZigZagEncode64(14927)));\n  EXPECT_EQ(-3612, ZigZagDecode64(ZigZagEncode64(-3612)));\n\n  EXPECT_EQ(LL(856912304801416), ZigZagDecode64(ZigZagEncode64(\n            LL(856912304801416))));\n  EXPECT_EQ(LL(-75123905439571256), ZigZagDecode64(ZigZagEncode64(\n            LL(-75123905439571256))));\n}\n\nTEST(WireFormatTest, RepeatedScalarsDifferentTagSizes) {\n  // At one point checks would trigger when parsing repeated fixed scalar\n  // fields.\n  protobuf_unittest::TestRepeatedScalarDifferentTagSizes msg1, msg2;\n  for (int i = 0; i < 100; ++i) {\n    msg1.add_repeated_fixed32(i);\n    msg1.add_repeated_int32(i);\n    msg1.add_repeated_fixed64(i);\n    msg1.add_repeated_int64(i);\n    msg1.add_repeated_float(i);\n    msg1.add_repeated_uint64(i);\n  }\n\n  // Make sure that we have a variety of tag sizes.\n  const google::protobuf::Descriptor* desc = msg1.GetDescriptor();\n  const google::protobuf::FieldDescriptor* field;\n  field = desc->FindFieldByName(\"repeated_fixed32\");\n  ASSERT_TRUE(field != NULL);\n  ASSERT_EQ(1, WireFormat::TagSize(field->number(), field->type()));\n  field = desc->FindFieldByName(\"repeated_int32\");\n  ASSERT_TRUE(field != NULL);\n  ASSERT_EQ(1, WireFormat::TagSize(field->number(), field->type()));\n  field = desc->FindFieldByName(\"repeated_fixed64\");\n  ASSERT_TRUE(field != NULL);\n  ASSERT_EQ(2, WireFormat::TagSize(field->number(), field->type()));\n  field = desc->FindFieldByName(\"repeated_int64\");\n  ASSERT_TRUE(field != NULL);\n  ASSERT_EQ(2, WireFormat::TagSize(field->number(), field->type()));\n  field = desc->FindFieldByName(\"repeated_float\");\n  ASSERT_TRUE(field != NULL);\n  ASSERT_EQ(3, WireFormat::TagSize(field->number(), field->type()));\n  field = desc->FindFieldByName(\"repeated_uint64\");\n  ASSERT_TRUE(field != NULL);\n  ASSERT_EQ(3, WireFormat::TagSize(field->number(), field->type()));\n\n  EXPECT_TRUE(msg2.ParseFromString(msg1.SerializeAsString()));\n  EXPECT_EQ(msg1.DebugString(), msg2.DebugString());\n}\n\nclass WireFormatInvalidInputTest : public testing::Test {\n protected:\n  // Make a serialized TestAllTypes in which the field optional_nested_message\n  // contains exactly the given bytes, which may be invalid.\n  string MakeInvalidEmbeddedMessage(const char* bytes, int size) {\n    const FieldDescriptor* field =\n      unittest::TestAllTypes::descriptor()->FindFieldByName(\n        \"optional_nested_message\");\n    GOOGLE_CHECK(field != NULL);\n\n    string result;\n\n    {\n      io::StringOutputStream raw_output(&result);\n      io::CodedOutputStream output(&raw_output);\n\n      WireFormatLite::WriteBytes(field->number(), string(bytes, size), &output);\n    }\n\n    return result;\n  }\n\n  // Make a serialized TestAllTypes in which the field optionalgroup\n  // contains exactly the given bytes -- which may be invalid -- and\n  // possibly no end tag.\n  string MakeInvalidGroup(const char* bytes, int size, bool include_end_tag) {\n    const FieldDescriptor* field =\n      unittest::TestAllTypes::descriptor()->FindFieldByName(\n        \"optionalgroup\");\n    GOOGLE_CHECK(field != NULL);\n\n    string result;\n\n    {\n      io::StringOutputStream raw_output(&result);\n      io::CodedOutputStream output(&raw_output);\n\n      output.WriteVarint32(WireFormat::MakeTag(field));\n      output.WriteString(string(bytes, size));\n      if (include_end_tag) {\n        output.WriteVarint32(WireFormatLite::MakeTag(\n          field->number(), WireFormatLite::WIRETYPE_END_GROUP));\n      }\n    }\n\n    return result;\n  }\n};\n\nTEST_F(WireFormatInvalidInputTest, InvalidSubMessage) {\n  unittest::TestAllTypes message;\n\n  // Control case.\n  EXPECT_TRUE(message.ParseFromString(MakeInvalidEmbeddedMessage(\"\", 0)));\n\n  // The byte is a valid varint, but not a valid tag (zero).\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage(\"\\0\", 1)));\n\n  // The byte is a malformed varint.\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage(\"\\200\", 1)));\n\n  // The byte is an endgroup tag, but we aren't parsing a group.\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage(\"\\014\", 1)));\n\n  // The byte is a valid varint but not a valid tag (bad wire type).\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage(\"\\017\", 1)));\n}\n\nTEST_F(WireFormatInvalidInputTest, InvalidGroup) {\n  unittest::TestAllTypes message;\n\n  // Control case.\n  EXPECT_TRUE(message.ParseFromString(MakeInvalidGroup(\"\", 0, true)));\n\n  // Missing end tag.  Groups cannot end at EOF.\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup(\"\", 0, false)));\n\n  // The byte is a valid varint, but not a valid tag (zero).\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup(\"\\0\", 1, false)));\n\n  // The byte is a malformed varint.\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup(\"\\200\", 1, false)));\n\n  // The byte is an endgroup tag, but not the right one for this group.\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup(\"\\014\", 1, false)));\n\n  // The byte is a valid varint but not a valid tag (bad wire type).\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup(\"\\017\", 1, true)));\n}\n\nTEST_F(WireFormatInvalidInputTest, InvalidUnknownGroup) {\n  // Use TestEmptyMessage so that the group made by MakeInvalidGroup will not\n  // be a known tag number.\n  unittest::TestEmptyMessage message;\n\n  // Control case.\n  EXPECT_TRUE(message.ParseFromString(MakeInvalidGroup(\"\", 0, true)));\n\n  // Missing end tag.  Groups cannot end at EOF.\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup(\"\", 0, false)));\n\n  // The byte is a valid varint, but not a valid tag (zero).\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup(\"\\0\", 1, false)));\n\n  // The byte is a malformed varint.\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup(\"\\200\", 1, false)));\n\n  // The byte is an endgroup tag, but not the right one for this group.\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup(\"\\014\", 1, false)));\n\n  // The byte is a valid varint but not a valid tag (bad wire type).\n  EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup(\"\\017\", 1, true)));\n}\n\nTEST_F(WireFormatInvalidInputTest, InvalidStringInUnknownGroup) {\n  // Test a bug fix:  SkipMessage should fail if the message contains a string\n  // whose length would extend beyond the message end.\n\n  unittest::TestAllTypes message;\n  message.set_optional_string(\"foo foo foo foo\");\n  string data;\n  message.SerializeToString(&data);\n\n  // Chop some bytes off the end.\n  data.resize(data.size() - 4);\n\n  // Try to skip it.  Note that the bug was only present when parsing to an\n  // UnknownFieldSet.\n  io::ArrayInputStream raw_input(data.data(), data.size());\n  io::CodedInputStream coded_input(&raw_input);\n  UnknownFieldSet unknown_fields;\n  EXPECT_FALSE(WireFormat::SkipMessage(&coded_input, &unknown_fields));\n}\n\n// Test differences between string and bytes.\n// Value of a string type must be valid UTF-8 string.  When UTF-8\n// validation is enabled (GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED):\n// WriteInvalidUTF8String:  see error message.\n// ReadInvalidUTF8String:  see error message.\n// WriteValidUTF8String: fine.\n// ReadValidUTF8String:  fine.\n// WriteAnyBytes: fine.\n// ReadAnyBytes: fine.\nconst char * kInvalidUTF8String = \"Invalid UTF-8: \\xA0\\xB0\\xC0\\xD0\";\n// This used to be \"Valid UTF-8: \\x01\\x02\\u8C37\\u6B4C\", but MSVC seems to\n// interpret \\u differently from GCC.\nconst char * kValidUTF8String = \"Valid UTF-8: \\x01\\x02\\350\\260\\267\\346\\255\\214\";\n\ntemplate<typename T>\nbool WriteMessage(const char *value, T *message, string *wire_buffer) {\n  message->set_data(value);\n  wire_buffer->clear();\n  message->AppendToString(wire_buffer);\n  return (wire_buffer->size() > 0);\n}\n\ntemplate<typename T>\nbool ReadMessage(const string &wire_buffer, T *message) {\n  return message->ParseFromArray(wire_buffer.data(), wire_buffer.size());\n}\n\nTEST(Utf8ValidationTest, WriteInvalidUTF8String) {\n  string wire_buffer;\n  protobuf_unittest::OneString input;\n  vector<string> errors;\n  {\n    ScopedMemoryLog log;\n    WriteMessage(kInvalidUTF8String, &input, &wire_buffer);\n    errors = log.GetMessages(ERROR);\n  }\n#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED\n  ASSERT_EQ(1, errors.size());\n  EXPECT_EQ(\"Encountered string containing invalid UTF-8 data while \"\n            \"serializing protocol buffer. Strings must contain only UTF-8; \"\n            \"use the 'bytes' type for raw bytes.\",\n            errors[0]);\n\n#else\n  ASSERT_EQ(0, errors.size());\n#endif  // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED\n}\n\nTEST(Utf8ValidationTest, ReadInvalidUTF8String) {\n  string wire_buffer;\n  protobuf_unittest::OneString input;\n  WriteMessage(kInvalidUTF8String, &input, &wire_buffer);\n  protobuf_unittest::OneString output;\n  vector<string> errors;\n  {\n    ScopedMemoryLog log;\n    ReadMessage(wire_buffer, &output);\n    errors = log.GetMessages(ERROR);\n  }\n#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED\n  ASSERT_EQ(1, errors.size());\n  EXPECT_EQ(\"Encountered string containing invalid UTF-8 data while \"\n            \"parsing protocol buffer. Strings must contain only UTF-8; \"\n            \"use the 'bytes' type for raw bytes.\",\n            errors[0]);\n\n#else\n  ASSERT_EQ(0, errors.size());\n#endif  // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED\n}\n\nTEST(Utf8ValidationTest, WriteValidUTF8String) {\n  string wire_buffer;\n  protobuf_unittest::OneString input;\n  vector<string> errors;\n  {\n    ScopedMemoryLog log;\n    WriteMessage(kValidUTF8String, &input, &wire_buffer);\n    errors = log.GetMessages(ERROR);\n  }\n  ASSERT_EQ(0, errors.size());\n}\n\nTEST(Utf8ValidationTest, ReadValidUTF8String) {\n  string wire_buffer;\n  protobuf_unittest::OneString input;\n  WriteMessage(kValidUTF8String, &input, &wire_buffer);\n  protobuf_unittest::OneString output;\n  vector<string> errors;\n  {\n    ScopedMemoryLog log;\n    ReadMessage(wire_buffer, &output);\n    errors = log.GetMessages(ERROR);\n  }\n  ASSERT_EQ(0, errors.size());\n  EXPECT_EQ(input.data(), output.data());\n}\n\n// Bytes: anything can pass as bytes, use invalid UTF-8 string to test\nTEST(Utf8ValidationTest, WriteArbitraryBytes) {\n  string wire_buffer;\n  protobuf_unittest::OneBytes input;\n  vector<string> errors;\n  {\n    ScopedMemoryLog log;\n    WriteMessage(kInvalidUTF8String, &input, &wire_buffer);\n    errors = log.GetMessages(ERROR);\n  }\n  ASSERT_EQ(0, errors.size());\n}\n\nTEST(Utf8ValidationTest, ReadArbitraryBytes) {\n  string wire_buffer;\n  protobuf_unittest::OneBytes input;\n  WriteMessage(kInvalidUTF8String, &input, &wire_buffer);\n  protobuf_unittest::OneBytes output;\n  vector<string> errors;\n  {\n    ScopedMemoryLog log;\n    ReadMessage(wire_buffer, &output);\n    errors = log.GetMessages(ERROR);\n  }\n  ASSERT_EQ(0, errors.size());\n  EXPECT_EQ(input.data(), output.data());\n}\n\n}  // namespace\n}  // namespace internal\n}  // namespace protobuf\n}  // namespace google\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/src/solaris/libstdc++.la",
    "content": "# libstdc++.la - a libtool library file\n# Generated by ltmain.sh - GNU libtool 1.4a-GCC3.0 (1.641.2.256 2001/05/28 20:09:07 with GCC-local changes)\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# ---\n# NOTE: This file lives in /usr/sfw/lib on Solaris 10.  Unfortunately,\n# due to an apparent bug in the Solaris 10 6/06 release,\n# /usr/sfw/lib/libstdc++.la is empty.  Below is the correct content,\n# according to\n#    http://forum.java.sun.com/thread.jspa?threadID=5073150\n# By passing LDFLAGS='-Lsrc/solaris' to configure, make will pick up\n# this copy of the file rather than the empty copy in /usr/sfw/lib.\n#\n# Also see\n#   http://www.technicalarticles.org/index.php/Compiling_MySQL_5.0_on_Solaris_10\n#\n# Note: this is for 32-bit systems.  If you have a 64-bit system,\n# uncomment the appropriate dependency_libs line below.\n# ----\n\n# The name that we can dlopen(3).\ndlname='libstdc++.so.6'\n\n# Names of this library.\nlibrary_names='libstdc++.so.6.0.3 libstdc++.so.6 libstdc++.so'\n\n# The name of the static archive.\nold_library='libstdc++.a'\n\n# Libraries that this one depends upon.\n# 32-bit version:\ndependency_libs='-lc -lm -L/usr/sfw/lib -lgcc_s'\n# 64-bit version:\n#dependency_libs='-L/lib/64 -lc -lm -L/usr/sfw/lib/64 -lgcc_s'\n\n# Version information for libstdc++.\ncurrent=6\nage=0\nrevision=3\n\n# Is this an already installed library?\ninstalled=yes\n\n# Files to dlopen/dlpreopen\ndlopen=''\ndlpreopen=''\n\n# Directory that this library needs to be installed in:\nlibdir='/usr/sfw/lib'\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/config.h",
    "content": "/* protobuf config.h for MSVC.  On other platforms, this is generated\n * automatically by autoheader / autoconf / configure. */\n\n/* the location of <hash_map> */\n#define HASH_MAP_H <hash_map>\n\n/* the namespace of hash_map/hash_set */\n// Apparently Microsoft decided to move hash_map *back* to the std namespace\n// in MSVC 2010:\n//   http://blogs.msdn.com/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx\n// TODO(kenton):  Use unordered_map instead, which is available in MSVC 2010.\n#if _MSC_VER < 1310 || _MSC_VER >= 1600\n#define HASH_NAMESPACE std\n#else\n#define HASH_NAMESPACE stdext\n#endif\n\n/* the location of <hash_set> */\n#define HASH_SET_H <hash_set>\n\n/* define if the compiler has hash_map */\n#define HAVE_HASH_MAP 1\n\n/* define if the compiler has hash_set */\n#define HAVE_HASH_SET 1\n\n/* define if you want to use zlib.  See readme.txt for additional\n * requirements. */\n// #define HAVE_ZLIB 1\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/convert2008to2005.sh",
    "content": "#! /bin/sh -e\n\n# This script downgrades MSVC 2008 projects to MSVC 2005 projects, allowing\n# people with MSVC 2005 to open them.  Otherwise, MSVC 2005 simply refuses to\n# open projects created with 2008.  We run this as part of our release process.\n# If you obtained the code direct from version control and you want to use\n# MSVC 2005, you may have to run this manually.  (Hint:  Use Cygwin or MSYS.)\n\nfor file in *.sln; do\n  echo \"downgrading $file...\"\n  sed -i -re 's/Format Version 10.00/Format Version 9.00/g;\n              s/Visual Studio 2008/Visual Studio 2005/g;' $file\ndone\n\nfor file in *.vcproj; do\n  echo \"downgrading $file...\"\n  sed -i -re 's/Version=\"9.00\"/Version=\"8.00\"/g;' $file\ndone\n\n# Yes, really, that's it.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/extract_includes.bat",
    "content": "md include\nmd include\\google\nmd include\\google\\protobuf\nmd include\\google\\protobuf\\stubs\nmd include\\google\\protobuf\\io\nmd include\\google\\protobuf\\compiler\nmd include\\google\\protobuf\\compiler\\cpp\nmd include\\google\\protobuf\\compiler\\java\nmd include\\google\\protobuf\\compiler\\python\ncopy ..\\src\\google\\protobuf\\stubs\\common.h include\\google\\protobuf\\stubs\\common.h\ncopy ..\\src\\google\\protobuf\\stubs\\once.h include\\google\\protobuf\\stubs\\once.h\ncopy ..\\src\\google\\protobuf\\descriptor.h include\\google\\protobuf\\descriptor.h\ncopy ..\\src\\google\\protobuf\\descriptor.pb.h include\\google\\protobuf\\descriptor.pb.h\ncopy ..\\src\\google\\protobuf\\descriptor_database.h include\\google\\protobuf\\descriptor_database.h\ncopy ..\\src\\google\\protobuf\\dynamic_message.h include\\google\\protobuf\\dynamic_message.h\ncopy ..\\src\\google\\protobuf\\extension_set.h include\\google\\protobuf\\extension_set.h\ncopy ..\\src\\google\\protobuf\\generated_message_util.h include\\google\\protobuf\\generated_message_util.h\ncopy ..\\src\\google\\protobuf\\generated_message_reflection.h include\\google\\protobuf\\generated_message_reflection.h\ncopy ..\\src\\google\\protobuf\\message.h include\\google\\protobuf\\message.h\ncopy ..\\src\\google\\protobuf\\message_lite.h include\\google\\protobuf\\message_lite.h\ncopy ..\\src\\google\\protobuf\\reflection_ops.h include\\google\\protobuf\\reflection_ops.h\ncopy ..\\src\\google\\protobuf\\repeated_field.h include\\google\\protobuf\\repeated_field.h\ncopy ..\\src\\google\\protobuf\\service.h include\\google\\protobuf\\service.h\ncopy ..\\src\\google\\protobuf\\text_format.h include\\google\\protobuf\\text_format.h\ncopy ..\\src\\google\\protobuf\\unknown_field_set.h include\\google\\protobuf\\unknown_field_set.h\ncopy ..\\src\\google\\protobuf\\wire_format.h include\\google\\protobuf\\wire_format.h\ncopy ..\\src\\google\\protobuf\\wire_format_lite.h include\\google\\protobuf\\wire_format_lite.h\ncopy ..\\src\\google\\protobuf\\wire_format_lite_inl.h include\\google\\protobuf\\wire_format_lite_inl.h\ncopy ..\\src\\google\\protobuf\\io\\coded_stream.h include\\google\\protobuf\\io\\coded_stream.h\ncopy ..\\src\\google\\protobuf\\io\\gzip_stream.h include\\google\\protobuf\\io\\gzip_stream.h\ncopy ..\\src\\google\\protobuf\\io\\printer.h include\\google\\protobuf\\io\\printer.h\ncopy ..\\src\\google\\protobuf\\io\\tokenizer.h include\\google\\protobuf\\io\\tokenizer.h\ncopy ..\\src\\google\\protobuf\\io\\zero_copy_stream.h include\\google\\protobuf\\io\\zero_copy_stream.h\ncopy ..\\src\\google\\protobuf\\io\\zero_copy_stream_impl.h include\\google\\protobuf\\io\\zero_copy_stream_impl.h\ncopy ..\\src\\google\\protobuf\\io\\zero_copy_stream_impl_lite.h include\\google\\protobuf\\io\\zero_copy_stream_impl_lite.h\ncopy ..\\src\\google\\protobuf\\compiler\\code_generator.h include\\google\\protobuf\\compiler\\code_generator.h\ncopy ..\\src\\google\\protobuf\\compiler\\command_line_interface.h include\\google\\protobuf\\compiler\\command_line_interface.h\ncopy ..\\src\\google\\protobuf\\compiler\\importer.h include\\google\\protobuf\\compiler\\importer.h\ncopy ..\\src\\google\\protobuf\\compiler\\parser.h include\\google\\protobuf\\compiler\\parser.h\ncopy ..\\src\\google\\protobuf\\compiler\\cpp\\cpp_generator.h include\\google\\protobuf\\compiler\\cpp\\cpp_generator.h\ncopy ..\\src\\google\\protobuf\\compiler\\java\\java_generator.h include\\google\\protobuf\\compiler\\java\\java_generator.h\ncopy ..\\src\\google\\protobuf\\compiler\\python\\python_generator.h include\\google\\protobuf\\compiler\\python\\python_generator.h\ncopy ..\\src\\google\\protobuf\\compiler\\plugin.h include\\google\\protobuf\\compiler\\plugin.h\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf-lite.vcproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<VisualStudioProject\n\tProjectType=\"Visual C++\"\n\tVersion=\"9.00\"\n\tName=\"libprotobuf-lite\"\n\tProjectGUID=\"{49EA010D-706F-4BE2-A397-77854B72A040}\"\n\tKeyword=\"Win32Proj\"\n\tTargetFrameworkVersion=\"0\"\n\t>\n\t<Platforms>\n\t\t<Platform\n\t\t\tName=\"Win32\"\n\t\t/>\n\t</Platforms>\n\t<ToolFiles>\n\t</ToolFiles>\n\t<Configurations>\n\t\t<Configuration\n\t\t\tName=\"Debug|Win32\"\n\t\t\tOutputDirectory=\"Debug\"\n\t\t\tIntermediateDirectory=\"Debug\"\n\t\t\tConfigurationType=\"4\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tOptimization=\"0\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBPROTOBUF_EXPORTS;\"\n\t\t\t\tMinimalRebuild=\"true\"\n\t\t\t\tBasicRuntimeChecks=\"3\"\n\t\t\t\tRuntimeLibrary=\"3\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"4\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLibrarianTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t\t<Configuration\n\t\t\tName=\"Release|Win32\"\n\t\t\tOutputDirectory=\"Release\"\n\t\t\tIntermediateDirectory=\"Release\"\n\t\t\tConfigurationType=\"4\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBPROTOBUF_EXPORTS;\"\n\t\t\t\tRuntimeLibrary=\"2\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"3\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLibrarianTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t</Configurations>\n\t<References>\n\t</References>\n\t<Files>\n\t\t<Filter\n\t\t\tName=\"Header Files\"\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\coded_stream.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\coded_stream_inl.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\common.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\config.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\extension_set.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\generated_message_util.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\hash.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\map-util.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\message_lite.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\once.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\repeated_field.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\stl_util-inl.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\wire_format_lite.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\wire_format_lite_inl.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\zero_copy_stream.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\zero_copy_stream_impl_lite.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Resource Files\"\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx\"\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\n\t\t\t>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Source Files\"\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\coded_stream.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\common.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\extension_set.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\generated_message_util.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\message_lite.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\once.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\repeated_field.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\wire_format_lite.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\zero_copy_stream.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\zero_copy_stream_impl_lite.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t</Files>\n\t<Globals>\n\t</Globals>\n</VisualStudioProject>\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf.vcproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<VisualStudioProject\n\tProjectType=\"Visual C++\"\n\tVersion=\"9.00\"\n\tName=\"libprotobuf\"\n\tProjectGUID=\"{3E283F37-A4ED-41B7-A3E6-A2D89D131A30}\"\n\tKeyword=\"Win32Proj\"\n\tTargetFrameworkVersion=\"0\"\n\t>\n\t<Platforms>\n\t\t<Platform\n\t\t\tName=\"Win32\"\n\t\t/>\n\t</Platforms>\n\t<ToolFiles>\n\t</ToolFiles>\n\t<Configurations>\n\t\t<Configuration\n\t\t\tName=\"Debug|Win32\"\n\t\t\tOutputDirectory=\"Debug\"\n\t\t\tIntermediateDirectory=\"Debug\"\n\t\t\tConfigurationType=\"4\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tOptimization=\"0\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBPROTOBUF_EXPORTS;\"\n\t\t\t\tMinimalRebuild=\"true\"\n\t\t\t\tBasicRuntimeChecks=\"3\"\n\t\t\t\tRuntimeLibrary=\"3\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"4\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLibrarianTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t\t<Configuration\n\t\t\tName=\"Release|Win32\"\n\t\t\tOutputDirectory=\"Release\"\n\t\t\tIntermediateDirectory=\"Release\"\n\t\t\tConfigurationType=\"4\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBPROTOBUF_EXPORTS;\"\n\t\t\t\tRuntimeLibrary=\"2\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"3\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLibrarianTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t</Configurations>\n\t<References>\n\t</References>\n\t<Files>\n\t\t<Filter\n\t\t\tName=\"Header Files\"\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\coded_stream.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\coded_stream_inl.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\common.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\config.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\descriptor.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\descriptor.pb.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\descriptor_database.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\dynamic_message.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\extension_set.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\generated_message_reflection.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\generated_message_util.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\gzip_stream.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\hash.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\importer.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\map-util.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\message.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\message_lite.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\once.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\parser.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\printer.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\reflection_ops.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\repeated_field.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\service.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\stl_util-inl.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\strutil.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\substitute.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\text_format.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\tokenizer.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\unknown_field_set.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\wire_format.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\wire_format_lite.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\wire_format_lite_inl.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\zero_copy_stream.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\zero_copy_stream_impl.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\zero_copy_stream_impl_lite.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Resource Files\"\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx\"\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\n\t\t\t>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Source Files\"\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\coded_stream.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\common.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\descriptor.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\descriptor.pb.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\descriptor_database.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\dynamic_message.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\extension_set.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\extension_set_heavy.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\generated_message_reflection.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\generated_message_util.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\gzip_stream.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\importer.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\message.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\message_lite.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\once.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\parser.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\printer.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\reflection_ops.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\repeated_field.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\service.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\structurally_valid.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\strutil.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\substitute.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\text_format.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\tokenizer.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\unknown_field_set.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\wire_format.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\wire_format_lite.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\zero_copy_stream.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\zero_copy_stream_impl.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\zero_copy_stream_impl_lite.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t</Files>\n\t<Globals>\n\t</Globals>\n</VisualStudioProject>\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotoc.vcproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<VisualStudioProject\n\tProjectType=\"Visual C++\"\n\tVersion=\"9.00\"\n\tName=\"libprotoc\"\n\tProjectGUID=\"{B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}\"\n\tKeyword=\"Win32Proj\"\n\tTargetFrameworkVersion=\"0\"\n\t>\n\t<Platforms>\n\t\t<Platform\n\t\t\tName=\"Win32\"\n\t\t/>\n\t</Platforms>\n\t<ToolFiles>\n\t</ToolFiles>\n\t<Configurations>\n\t\t<Configuration\n\t\t\tName=\"Debug|Win32\"\n\t\t\tOutputDirectory=\"Debug\"\n\t\t\tIntermediateDirectory=\"Debug\"\n\t\t\tConfigurationType=\"4\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tOptimization=\"0\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBPROTOC_EXPORTS;\"\n\t\t\t\tMinimalRebuild=\"true\"\n\t\t\t\tBasicRuntimeChecks=\"3\"\n\t\t\t\tRuntimeLibrary=\"3\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"4\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLibrarianTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t\t<Configuration\n\t\t\tName=\"Release|Win32\"\n\t\t\tOutputDirectory=\"Release\"\n\t\t\tIntermediateDirectory=\"Release\"\n\t\t\tConfigurationType=\"4\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBPROTOC_EXPORTS;\"\n\t\t\t\tRuntimeLibrary=\"2\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"3\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLibrarianTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t</Configurations>\n\t<References>\n\t</References>\n\t<Files>\n\t\t<Filter\n\t\t\tName=\"Header Files\"\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\code_generator.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\command_line_interface.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\subprocess.h\"\n\t\t\t\t>\n\t\t\t</File>\n      <File\n        RelativePath=\"..\\src\\google\\protobuf\\compiler\\zip_writer.h\"\n        >\n      </File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\plugin.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\plugin.pb.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_enum.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_enum_field.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_extension.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_field.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_file.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_generator.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_helpers.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_message.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_message_field.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_primitive_field.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_service.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_string_field.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_enum.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_enum_field.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_extension.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_field.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_file.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_generator.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_helpers.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_message.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_message_field.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_primitive_field.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_service.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_string_field.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\python\\python_generator.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Resource Files\"\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx\"\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\n\t\t\t>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Source Files\"\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\code_generator.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\command_line_interface.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\subprocess.cc\"\n\t\t\t\t>\n\t\t\t</File>\n      <File\n        RelativePath=\"..\\src\\google\\protobuf\\compiler\\zip_writer.cc\"\n        >\n      </File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\plugin.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\plugin.pb.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_enum.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_enum_field.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_extension.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_field.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_file.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_generator.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_helpers.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_message.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_message_field.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_primitive_field.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_service.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_string_field.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_enum.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_enum_field.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_extension.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_field.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_file.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_generator.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_helpers.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_message.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_message_field.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_primitive_field.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_service.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_string_field.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\python\\python_generator.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t</Files>\n\t<Globals>\n\t</Globals>\n</VisualStudioProject>\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/lite-test.vcproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<VisualStudioProject\n\tProjectType=\"Visual C++\"\n\tVersion=\"9.00\"\n\tName=\"lite-test\"\n\tProjectGUID=\"{12015ACE-42BE-4952-A5A0-44A9A46908E2}\"\n\tRootNamespace=\"tests\"\n\tKeyword=\"Win32Proj\"\n\tTargetFrameworkVersion=\"0\"\n\t>\n\t<Platforms>\n\t\t<Platform\n\t\t\tName=\"Win32\"\n\t\t/>\n\t</Platforms>\n\t<ToolFiles>\n\t</ToolFiles>\n\t<Configurations>\n\t\t<Configuration\n\t\t\tName=\"Debug|Win32\"\n\t\t\tOutputDirectory=\"Debug\"\n\t\t\tIntermediateDirectory=\"Debug\"\n\t\t\tConfigurationType=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\tDescription=\"\"\n\t\t\t\tCommandLine=\"\"\n\t\t\t\tAdditionalDependencies=\"\"\n\t\t\t\tOutputs=\"\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tOptimization=\"0\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.;../gtest/include\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE;\"\n\t\t\t\tMinimalRebuild=\"true\"\n\t\t\t\tBasicRuntimeChecks=\"3\"\n\t\t\t\tRuntimeLibrary=\"3\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"4\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLinkerTool\"\n\t\t\t\tLinkIncremental=\"2\"\n\t\t\t\tGenerateDebugInformation=\"true\"\n\t\t\t\tSubSystem=\"1\"\n\t\t\t\tTargetMachine=\"1\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManifestTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCAppVerifierTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t\t<Configuration\n\t\t\tName=\"Release|Win32\"\n\t\t\tOutputDirectory=\"Release\"\n\t\t\tIntermediateDirectory=\"Release\"\n\t\t\tConfigurationType=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\tDescription=\"\"\n\t\t\t\tCommandLine=\"\"\n\t\t\t\tAdditionalDependencies=\"\"\n\t\t\t\tOutputs=\"\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.;../gtest/include\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE;\"\n\t\t\t\tRuntimeLibrary=\"2\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"3\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLinkerTool\"\n\t\t\t\tLinkIncremental=\"2\"\n\t\t\t\tGenerateDebugInformation=\"true\"\n\t\t\t\tSubSystem=\"1\"\n\t\t\t\tOptimizeReferences=\"2\"\n\t\t\t\tEnableCOMDATFolding=\"2\"\n\t\t\t\tTargetMachine=\"1\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManifestTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCAppVerifierTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t</Configurations>\n\t<References>\n\t</References>\n\t<Files>\n\t\t<Filter\n\t\t\tName=\"Header Files\"\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\test_util_lite.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_lite.pb.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_import_lite.pb.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Resource Files\"\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx\"\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\n\t\t\t>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Source Files\"\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\lite_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\test_util_lite.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_lite.pb.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_import_lite.pb.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t\t<File\n\t\t\tRelativePath=\"..\\src\\google\\protobuf\\unittest_lite.proto\"\n\t\t\t>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_lite.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Debug\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_lite.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_lite.pb.h;google\\protobuf\\unittest_lite.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_lite.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Release\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_lite.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_lite.pb.h;google\\protobuf\\unittest_lite.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t</File>\n\t\t<File\n\t\t\tRelativePath=\"..\\src\\google\\protobuf\\unittest_import_lite.proto\"\n\t\t\t>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_import_lite.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Debug\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_import_lite.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_import_lite.pb.h;google\\protobuf\\unittest_import_lite.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_import_lite.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Release\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_import_lite.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_import_lite.pb.h;google\\protobuf\\unittest_import_lite.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t</File>\n\t</Files>\n\t<Globals>\n\t</Globals>\n</VisualStudioProject>\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protobuf.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 10.00\n# Visual Studio 2008\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libprotobuf\", \"libprotobuf.vcproj\", \"{3E283F37-A4ED-41B7-A3E6-A2D89D131A30}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libprotoc\", \"libprotoc.vcproj\", \"{B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{3E283F37-A4ED-41B7-A3E6-A2D89D131A30} = {3E283F37-A4ED-41B7-A3E6-A2D89D131A30}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"protoc\", \"protoc.vcproj\", \"{1738D5F6-ED1E-47E0-B2F0-456864B93C1E}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE} = {B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}\n\t\t{3E283F37-A4ED-41B7-A3E6-A2D89D131A30} = {3E283F37-A4ED-41B7-A3E6-A2D89D131A30}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"tests\", \"tests.vcproj\", \"{4DF72760-C055-40A5-A77E-30A17E2AC2DB}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE} = {B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}\n\t\t{3E283F37-A4ED-41B7-A3E6-A2D89D131A30} = {3E283F37-A4ED-41B7-A3E6-A2D89D131A30}\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7} = {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032} = {3AF54C8A-10BF-4332-9147-F68ED9862032}\n\t\t{CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32} = {CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32}\n\t\t{1738D5F6-ED1E-47E0-B2F0-456864B93C1E} = {1738D5F6-ED1E-47E0-B2F0-456864B93C1E}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest\", \"..\\gtest\\msvc\\gtest.vcproj\", \"{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"gtest_main\", \"..\\gtest\\msvc\\gtest_main.vcproj\", \"{3AF54C8A-10BF-4332-9147-F68ED9862032}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libprotobuf-lite\", \"libprotobuf-lite.vcproj\", \"{49EA010D-706F-4BE2-A397-77854B72A040}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"lite-test\", \"lite-test.vcproj\", \"{12015ACE-42BE-4952-A5A0-44A9A46908E2}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{49EA010D-706F-4BE2-A397-77854B72A040} = {49EA010D-706F-4BE2-A397-77854B72A040}\n\t\t{1738D5F6-ED1E-47E0-B2F0-456864B93C1E} = {1738D5F6-ED1E-47E0-B2F0-456864B93C1E}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"test_plugin\", \"test_plugin.vcproj\", \"{CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE} = {B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}\n\t\t{3E283F37-A4ED-41B7-A3E6-A2D89D131A30} = {3E283F37-A4ED-41B7-A3E6-A2D89D131A30}\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7} = {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}\n\tEndProjectSection\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Win32 = Debug|Win32\n\t\tRelease|Win32 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{3E283F37-A4ED-41B7-A3E6-A2D89D131A30}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{3E283F37-A4ED-41B7-A3E6-A2D89D131A30}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{3E283F37-A4ED-41B7-A3E6-A2D89D131A30}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{3E283F37-A4ED-41B7-A3E6-A2D89D131A30}.Release|Win32.Build.0 = Release|Win32\n\t\t{B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}.Release|Win32.Build.0 = Release|Win32\n\t\t{1738D5F6-ED1E-47E0-B2F0-456864B93C1E}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{1738D5F6-ED1E-47E0-B2F0-456864B93C1E}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{1738D5F6-ED1E-47E0-B2F0-456864B93C1E}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{1738D5F6-ED1E-47E0-B2F0-456864B93C1E}.Release|Win32.Build.0 = Release|Win32\n\t\t{4DF72760-C055-40A5-A77E-30A17E2AC2DB}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{4DF72760-C055-40A5-A77E-30A17E2AC2DB}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{4DF72760-C055-40A5-A77E-30A17E2AC2DB}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{4DF72760-C055-40A5-A77E-30A17E2AC2DB}.Release|Win32.Build.0 = Release|Win32\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Win32.Build.0 = Release|Win32\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release|Win32.Build.0 = Release|Win32\n\t\t{49EA010D-706F-4BE2-A397-77854B72A040}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{49EA010D-706F-4BE2-A397-77854B72A040}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{49EA010D-706F-4BE2-A397-77854B72A040}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{49EA010D-706F-4BE2-A397-77854B72A040}.Release|Win32.Build.0 = Release|Win32\n\t\t{12015ACE-42BE-4952-A5A0-44A9A46908E2}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{12015ACE-42BE-4952-A5A0-44A9A46908E2}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{12015ACE-42BE-4952-A5A0-44A9A46908E2}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{12015ACE-42BE-4952-A5A0-44A9A46908E2}.Release|Win32.Build.0 = Release|Win32\n\t\t{CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32}.Release|Win32.Build.0 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protoc.vcproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<VisualStudioProject\n\tProjectType=\"Visual C++\"\n\tVersion=\"9.00\"\n\tName=\"protoc\"\n\tProjectGUID=\"{1738D5F6-ED1E-47E0-B2F0-456864B93C1E}\"\n\tKeyword=\"Win32Proj\"\n\tTargetFrameworkVersion=\"0\"\n\t>\n\t<Platforms>\n\t\t<Platform\n\t\t\tName=\"Win32\"\n\t\t/>\n\t</Platforms>\n\t<ToolFiles>\n\t</ToolFiles>\n\t<Configurations>\n\t\t<Configuration\n\t\t\tName=\"Debug|Win32\"\n\t\t\tOutputDirectory=\"Debug\"\n\t\t\tIntermediateDirectory=\"Debug\"\n\t\t\tConfigurationType=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tOptimization=\"0\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE;\"\n\t\t\t\tMinimalRebuild=\"true\"\n\t\t\t\tBasicRuntimeChecks=\"3\"\n\t\t\t\tRuntimeLibrary=\"3\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"4\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLinkerTool\"\n\t\t\t\tLinkIncremental=\"2\"\n\t\t\t\tGenerateDebugInformation=\"true\"\n\t\t\t\tSubSystem=\"1\"\n\t\t\t\tTargetMachine=\"1\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManifestTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCAppVerifierTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t\t<Configuration\n\t\t\tName=\"Release|Win32\"\n\t\t\tOutputDirectory=\"Release\"\n\t\t\tIntermediateDirectory=\"Release\"\n\t\t\tConfigurationType=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE;\"\n\t\t\t\tRuntimeLibrary=\"2\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"3\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLinkerTool\"\n\t\t\t\tLinkIncremental=\"2\"\n\t\t\t\tGenerateDebugInformation=\"true\"\n\t\t\t\tSubSystem=\"1\"\n\t\t\t\tOptimizeReferences=\"2\"\n\t\t\t\tEnableCOMDATFolding=\"2\"\n\t\t\t\tTargetMachine=\"1\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManifestTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCAppVerifierTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t</Configurations>\n\t<References>\n\t</References>\n\t<Files>\n\t\t<Filter\n\t\t\tName=\"Header Files\"\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\n\t\t\t>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Resource Files\"\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx\"\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\n\t\t\t>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Source Files\"\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\main.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t</Files>\n\t<Globals>\n\t</Globals>\n</VisualStudioProject>\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/readme.txt",
    "content": "This directory contains project files for compiling Protocol Buffers using\nMSVC.  This is not the recommended way to do Protocol Buffer development --\nwe prefer to develop under a Unix-like environment -- but it may be more\naccessible to those who primarily work with MSVC.\n\nCompiling and Installing\n========================\n\n1) Open protobuf.sln in Microsoft Visual Studio.\n2) Choose \"Debug\" or \"Release\" configuration as desired.*\n3) From the Build menu, choose \"Build Solution\".  Wait for compiling to finish.\n4) From a command shell, run tests.exe and lite-test.exe and check that all\n   tests pass.\n5) Run extract_includes.bat to copy all the public headers into a separate\n   \"include\" directory (under the top-level package directory).\n6) Copy the contents of the include directory to wherever you want to put\n   headers.\n7) Copy protoc.exe wherever you put build tools (probably somewhere in your\n   PATH).\n8) Copy libprotobuf.lib, libprotobuf-lite.lib, and libprotoc.lib wherever you\n   put libraries.\n\n* To avoid conflicts between the MSVC debug and release runtime libraries, when\n  compiling a debug build of your application, you may need to link against a\n  debug build of libprotobuf.lib.  Similarly, release builds should link against\n  release libs.\n\nDLLs vs. static linking\n=======================\n\nStatic linking is now the default for the Protocol Buffer libraries.  Due to\nissues with Win32's use of a separate heap for each DLL, as well as binary\ncompatibility issues between different versions of MSVC's STL library, it is\nrecommended that you use static linkage only.  However, it is possible to\nbuild libprotobuf and libprotoc as DLLs if you really want.  To do this,\ndo the following:\n\n  1) Open protobuf.sln in MSVC.\n  2) For each of the projects libprotobuf, libprotobuf-lite, and libprotoc, do\n     the following:\n    2a) Right-click the project and choose \"properties\".\n    2b) From the side bar, choose \"General\", under \"Configuration Properties\".\n    2c) Change the \"Configuration Type\" to \"Dynamic Library (.dll)\".\n    2d) From the side bar, choose \"Preprocessor\", under \"C/C++\".\n    2e) Add PROTOBUF_USE_DLLS to the list of preprocessor defines.\n  3) When compiling your project, make sure to #define PROTOBUF_USE_DLLS.\n\nWhen distributing your software to end users, we strongly recommend that you\ndo NOT install libprotobuf.dll or libprotoc.dll to any shared location.\nInstead, keep these libraries next to your binaries, in your application's\nown install directory.  C++ makes it very difficult to maintain binary\ncompatibility between releases, so it is likely that future versions of these\nlibraries will *not* be usable as drop-in replacements.\n\nIf your project is itself a DLL intended for use by third-party software, we\nrecommend that you do NOT expose protocol buffer objects in your library's\npublic interface, and that you statically link protocol buffers into your\nlibrary.\n\nZLib support\n============\n\nIf you want to include GzipInputStream and GzipOutputStream\n(google/protobuf/io/gzip_stream.h) in libprotoc, you will need to do a few\nadditional steps:\n\n1) Obtain a copy of the zlib library.  The pre-compiled DLL at zlib.net works.\n2) Make sure zlib's two headers are in your include path and that the .lib file\n   is in your library path.  You could place all three files directly into the\n   vsproject directory to compile libprotobuf, but they need to be visible to\n   your own project as well, so you should probably just put them into the\n   VC shared icnlude and library directories.\n3) Right-click on the \"tests\" project and choose \"properties\".  Navigate the\n   sidebar to \"Configuration Properties\" -> \"Linker\" -> \"Input\".\n4) Under \"Additional Dependencies\", add the name of the zlib .lib file (e.g.\n   zdll.lib).  Make sure to update both the Debug and Release configurations.\n5) If you are compiling libprotobuf and libprotoc as DLLs (see previous\n   section), repeat steps 2 and 3 for the libprotobuf and libprotoc projects.\n   If you are compiling them as static libraries, then you will need to link\n   against the zlib library directly from your own app.\n6) Edit config.h (in the vsprojects directory) and un-comment the line that\n   #defines HAVE_ZLIB.  (Or, alternatively, define this macro via the project\n   settings.)\n\nNotes on Compiler Warnings\n==========================\n\nThe following warnings have been disabled while building the protobuf libraries\nand compiler.  You may have to disable some of them in your own project as\nwell, or live with them.\n\nC4018 - 'expression' : signed/unsigned mismatch\nC4146 - unary minus operator applied to unsigned type, result still unsigned\nC4244 - Conversion from 'type1' to 'type2', possible loss of data.\nC4251 - 'identifier' : class 'type' needs to have dll-interface to be used by\n        clients of class 'type2'\nC4267 - Conversion from 'size_t' to 'type', possible loss of data.\nC4305 - 'identifier' : truncation from 'type1' to 'type2'\nC4355 - 'this' : used in base member initializer list\nC4800 - 'type' : forcing value to bool 'true' or 'false' (performance warning)\nC4996 - 'function': was declared deprecated\n\nC4251 is of particular note, if you are compiling the Protocol Buffer library\nas a DLL (see previous section).  The protocol buffer library uses templates in\nits public interfaces.  MSVC does not provide any reasonable way to export\ntemplate classes from a DLL.  However, in practice, it appears that exporting\ntemplates is not necessary anyway.  Since the complete definition of any\ntemplate is available in the header files, anyone importing the DLL will just\nend up compiling instances of the templates into their own binary.  The\nProtocol Buffer implementation does not rely on static template members being\nunique, so there should be no problem with this, but MSVC prints warning\nnevertheless.  So, we disable it.  Unfortunately, this warning will also be\nproduced when compiling code which merely uses protocol buffers, meaning you\nmay have to disable it in your code too.\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/test_plugin.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\n<VisualStudioProject\n\tProjectType=\"Visual C++\"\n\tVersion=\"9.00\"\n\tName=\"test_plugin\"\n\tProjectGUID=\"{CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32}\"\n\tRootNamespace=\"test_plugin\"\n\tKeyword=\"Win32Proj\"\n\tTargetFrameworkVersion=\"196613\"\n\t>\n\t<Platforms>\n\t\t<Platform\n\t\t\tName=\"Win32\"\n\t\t/>\n\t</Platforms>\n\t<ToolFiles>\n\t</ToolFiles>\n\t<Configurations>\n\t\t<Configuration\n\t\t\tName=\"Debug|Win32\"\n\t\t\tOutputDirectory=\"Debug\"\n\t\t\tIntermediateDirectory=\"Debug\"\n\t\t\tConfigurationType=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\tDescription=\"\"\n\t\t\t\tCommandLine=\"\"\n\t\t\t\tAdditionalDependencies=\"\"\n\t\t\t\tOutputs=\"\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tOptimization=\"0\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.;../gtest/include\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE;\"\n\t\t\t\tMinimalRebuild=\"true\"\n\t\t\t\tBasicRuntimeChecks=\"3\"\n\t\t\t\tRuntimeLibrary=\"3\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"4\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLinkerTool\"\n\t\t\t\tLinkIncremental=\"2\"\n\t\t\t\tGenerateDebugInformation=\"true\"\n\t\t\t\tSubSystem=\"1\"\n\t\t\t\tTargetMachine=\"1\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManifestTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCAppVerifierTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t\t<Configuration\n\t\t\tName=\"Release|Win32\"\n\t\t\tOutputDirectory=\"Release\"\n\t\t\tIntermediateDirectory=\"Release\"\n\t\t\tConfigurationType=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\tDescription=\"\"\n\t\t\t\tCommandLine=\"\"\n\t\t\t\tAdditionalDependencies=\"\"\n\t\t\t\tOutputs=\"\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.;../gtest/include\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE;\"\n\t\t\t\tRuntimeLibrary=\"2\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"3\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLinkerTool\"\n\t\t\t\tLinkIncremental=\"2\"\n\t\t\t\tGenerateDebugInformation=\"true\"\n\t\t\t\tSubSystem=\"1\"\n\t\t\t\tOptimizeReferences=\"2\"\n\t\t\t\tEnableCOMDATFolding=\"2\"\n\t\t\t\tTargetMachine=\"1\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManifestTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCAppVerifierTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t</Configurations>\n\t<References>\n\t</References>\n\t<Files>\n\t\t<Filter\n\t\t\tName=\"Header Files\"\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\mock_code_generator.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\testing\\file.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Source Files\"\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\test_plugin.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\mock_code_generator.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\testing\\file.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t</Files>\n\t<Globals>\n\t</Globals>\n</VisualStudioProject>\n"
  },
  {
    "path": "archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/tests.vcproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<VisualStudioProject\n\tProjectType=\"Visual C++\"\n\tVersion=\"9.00\"\n\tName=\"tests\"\n\tProjectGUID=\"{4DF72760-C055-40A5-A77E-30A17E2AC2DB}\"\n\tRootNamespace=\"tests\"\n\tKeyword=\"Win32Proj\"\n\tTargetFrameworkVersion=\"0\"\n\t>\n\t<Platforms>\n\t\t<Platform\n\t\t\tName=\"Win32\"\n\t\t/>\n\t</Platforms>\n\t<ToolFiles>\n\t</ToolFiles>\n\t<Configurations>\n\t\t<Configuration\n\t\t\tName=\"Debug|Win32\"\n\t\t\tOutputDirectory=\"Debug\"\n\t\t\tIntermediateDirectory=\"Debug\"\n\t\t\tConfigurationType=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\tDescription=\"\"\n\t\t\t\tCommandLine=\"\"\n\t\t\t\tAdditionalDependencies=\"\"\n\t\t\t\tOutputs=\"\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tOptimization=\"0\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.;../gtest/include\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE;\"\n\t\t\t\tMinimalRebuild=\"true\"\n\t\t\t\tBasicRuntimeChecks=\"3\"\n\t\t\t\tRuntimeLibrary=\"3\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"4\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLinkerTool\"\n\t\t\t\tLinkIncremental=\"2\"\n\t\t\t\tGenerateDebugInformation=\"true\"\n\t\t\t\tSubSystem=\"1\"\n\t\t\t\tTargetMachine=\"1\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManifestTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCAppVerifierTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t\t<Configuration\n\t\t\tName=\"Release|Win32\"\n\t\t\tOutputDirectory=\"Release\"\n\t\t\tIntermediateDirectory=\"Release\"\n\t\t\tConfigurationType=\"1\"\n\t\t\t>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreBuildEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\tDescription=\"\"\n\t\t\t\tCommandLine=\"\"\n\t\t\t\tAdditionalDependencies=\"\"\n\t\t\t\tOutputs=\"\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCMIDLTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCCLCompilerTool\"\n\t\t\t\tAdditionalOptions=\"/wd4244 /wd4267 /wd4018 /wd4355 /wd4800 /wd4251 /wd4996 /wd4146 /wd4305\"\n\t\t\t\tAdditionalIncludeDirectories=\"../src;.;../gtest/include\"\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE;\"\n\t\t\t\tRuntimeLibrary=\"2\"\n\t\t\t\tUsePrecompiledHeader=\"0\"\n\t\t\t\tWarningLevel=\"3\"\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\n\t\t\t\tDebugInformationFormat=\"3\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCResourceCompilerTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPreLinkEventTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCLinkerTool\"\n\t\t\t\tLinkIncremental=\"2\"\n\t\t\t\tGenerateDebugInformation=\"true\"\n\t\t\t\tSubSystem=\"1\"\n\t\t\t\tOptimizeReferences=\"2\"\n\t\t\t\tEnableCOMDATFolding=\"2\"\n\t\t\t\tTargetMachine=\"1\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCALinkTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCManifestTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCXDCMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCBscMakeTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCFxCopTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCAppVerifierTool\"\n\t\t\t/>\n\t\t\t<Tool\n\t\t\t\tName=\"VCPostBuildEventTool\"\n\t\t\t/>\n\t\t</Configuration>\n\t</Configurations>\n\t<References>\n\t</References>\n\t<Files>\n\t\t<Filter\n\t\t\tName=\"Header Files\"\n\t\t\tFilter=\"h;hpp;hxx;hm;inl;inc;xsd\"\n\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\compiler\\cpp\\cpp_test_bad_identifiers.pb.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\testing\\file.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\testing\\googletest.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\test_util.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\mock_code_generator.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest.pb.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_custom_options.pb.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_embed_optimize_for.pb.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_import.pb.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_lite_imports_nonline.pb.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_mset.pb.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_optimize_for.pb.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_no_generic_services.pb.h\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Resource Files\"\n\t\t\tFilter=\"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx\"\n\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\"\n\t\t\t>\n\t\t</Filter>\n\t\t<Filter\n\t\t\tName=\"Source Files\"\n\t\t\tFilter=\"cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx\"\n\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\"\n\t\t\t>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\coded_stream_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\command_line_interface_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\mock_code_generator.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\common_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_bootstrap_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\compiler\\cpp\\cpp_test_bad_identifiers.pb.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_plugin_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\java\\java_plugin_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\python\\python_plugin_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\descriptor_database_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\descriptor_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\dynamic_message_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\extension_set_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\testing\\file.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\generated_message_reflection_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\testing\\googletest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\importer_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\message_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\once_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\parser_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\printer_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\reflection_ops_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\repeated_field_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\structurally_valid_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\stubs\\strutil_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\test_util.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\text_format_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\tokenizer_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest.pb.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_custom_options.pb.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_embed_optimize_for.pb.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_import.pb.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_lite_imports_nonlite.pb.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_mset.pb.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_optimize_for.pb.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\".\\google\\protobuf\\unittest_no_generic_services.pb.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\unknown_field_set_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\wire_format_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t\t<File\n\t\t\t\tRelativePath=\"..\\src\\google\\protobuf\\io\\zero_copy_stream_unittest.cc\"\n\t\t\t\t>\n\t\t\t</File>\n\t\t</Filter>\n\t\t<File\n\t\t\tRelativePath=\"..\\src\\google\\protobuf\\compiler\\cpp\\cpp_test_bad_identifiers.proto\"\n\t\t\t>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating cpp_test_bad_identifiers.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Debug\\protoc -I../src --cpp_out=. ../src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\compiler\\cpp\\cpp_test_bad_identifiers.pb.h;google\\protobuf\\compiler\\cpp\\cpp_test_bad_identifiers.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating cpp_test_bad_identifiers.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Release\\protoc -I../src --cpp_out=. ../src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\compiler\\cpp\\cpp_test_bad_identifiers.pb.h;google\\protobuf\\compiler\\cpp\\cpp_test_bad_identifiers.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t</File>\n\t\t<File\n\t\t\tRelativePath=\"..\\src\\google\\protobuf\\unittest.proto\"\n\t\t\t>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Debug\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest.pb.h;google\\protobuf\\unittest.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Release\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest.pb.h;google\\protobuf\\unittest.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t</File>\n\t\t<File\n\t\t\tRelativePath=\"..\\src\\google\\protobuf\\unittest_custom_options.proto\"\n\t\t\t>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_custom_options.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Debug\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_custom_options.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_custom_options.pb.h;google\\protobuf\\unittest_custom_options.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_custom_options.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Release\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_custom_options.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_custom_options.pb.h;google\\protobuf\\unittest_custom_options.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t</File>\n\t\t<File\n\t\t\tRelativePath=\"..\\src\\google\\protobuf\\unittest_embed_optimize_for.proto\"\n\t\t\t>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_embed_optimize_for.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Debug\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_embed_optimize_for.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_embed_optimize_for.pb.h;google\\protobuf\\unittest_embed_optimize_for.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_embed_optimize_for.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Release\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_embed_optimize_for.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_embed_optimize_for.pb.h;google\\protobuf\\unittest_embed_optimize_for.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t</File>\n\t\t<File\n\t\t\tRelativePath=\"..\\src\\google\\protobuf\\unittest_import.proto\"\n\t\t\t>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_import.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Debug\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_import.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_import.pb.h;google\\protobuf\\unittest_import.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_import.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Release\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_import.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_import.pb.h;google\\protobuf\\unittest_import.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t</File>\n\t\t<File\n\t\t\tRelativePath=\"..\\src\\google\\protobuf\\unittest_lite_imports_nonlite.proto\"\n\t\t\t>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_lite_imports_nonlite.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Debug\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_lite_imports_nonlite.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_lite_imports_nonlite.pb.h;google\\protobuf\\unittest_lite_imports_nonlite.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_lite_imports_nonlite.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Release\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_lite_imports_nonlite.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_lite_imports_nonlite.pb.h;google\\protobuf\\unittest_lite_imports_nonlite.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t</File>\n\t\t<File\n\t\t\tRelativePath=\"..\\src\\google\\protobuf\\unittest_mset.proto\"\n\t\t\t>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_mset.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Debug\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_mset.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_mset.pb.h;google\\protobuf\\unittest_mset.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_mset.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Release\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_mset.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_mset.pb.h;google\\protobuf\\unittest_mset.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t</File>\n\t\t<File\n\t\t\tRelativePath=\"..\\src\\google\\protobuf\\unittest_optimize_for.proto\"\n\t\t\t>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_optimize_for.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Debug\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_optimize_for.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_optimize_for.pb.h;google\\protobuf\\unittest_optimize_for.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_optimize_for.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Release\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_optimize_for.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_optimize_for.pb.h;google\\protobuf\\unittest_optimize_for.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t</File>\n\t\t<File\n\t\t\tRelativePath=\"..\\src\\google\\protobuf\\unittest_no_generic_services.proto\"\n\t\t\t>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Debug|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_no_generic_services.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Debug\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_no_generic_services.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_no_generic_services.pb.h;google\\protobuf\\unittest_no_generic_services.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t\t<FileConfiguration\n\t\t\t\tName=\"Release|Win32\"\n\t\t\t\t>\n\t\t\t\t<Tool\n\t\t\t\t\tName=\"VCCustomBuildTool\"\n\t\t\t\t\tDescription=\"Generating unittest_no_generic_services.pb.{h,cc}...\"\n\t\t\t\t\tCommandLine=\"Release\\protoc -I../src --cpp_out=. ../src/google/protobuf/unittest_no_generic_services.proto&#x0D;&#x0A;\"\n\t\t\t\t\tOutputs=\"google\\protobuf\\unittest_no_generic_services.pb.h;google\\protobuf\\unittest_no_generic_services.pb.cc\"\n\t\t\t\t/>\n\t\t\t</FileConfiguration>\n\t\t</File>\n\t</Files>\n\t<Globals>\n\t</Globals>\n</VisualStudioProject>\n"
  },
  {
    "path": "archive/spotify/callbacks.h",
    "content": "/**  This file is part of QT SpotifyWebApi - <hugolm84@gmail.com> ===\n *\n *   Copyright 2011-2012, Hugo Lindström <hugolm84@gmail.com>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n#ifndef CALLBACKS_H\n#define CALLBACKS_H\n#include <libspotify/api.h>\n#include \"spotifysession.h\"\n#include \"spotifyplayback.h\"\n#include \"spotifyplaylists.h\"\n#include <csignal>\n\nusing namespace std;\n\nnamespace SpotifyCallbacks{\n\nstatic sp_session_callbacks callbacks = {\n\n    &SpotifySession::loggedIn,\n    &SpotifySession::loggedOut,\n    NULL, //&SpotifySession::metadataUpdated,\n    &SpotifySession::connectionError,\n    NULL, //&SpotifySession::messageToUser,\n    &SpotifySession::notifyMainThread,\n    &SpotifyPlayback::musicDelivery,\n    &SpotifyPlayback::playTokenLost,\n    &SpotifySession::logMessage,\n    &SpotifyPlayback::endOfTrack,\n    &SpotifyPlayback::streamingError,\n    NULL, //&SpotifySession::userinfoUpdated,\n    &SpotifyPlayback::startPlayback,\n    &SpotifyPlayback::stopPlayback,\n    &SpotifyPlayback::getAudioBufferStats,\n    NULL, //offline_status_updated\n    NULL, // offline_error\n    #if SPOTIFY_API_VERSION >= 12\n    &SpotifySession::credentialsBlobUpdated,\n    NULL, // &SpotifySession::connectionstateUpdated,\n    NULL, //scrobble_error\n    NULL, //private_session_mode_changed\n    #else\n    NULL,\n    #endif\n\n\n};\n\nstatic sp_playlistcontainer_callbacks containerCallbacks = {\n\n    &SpotifyPlaylists::playlistAddedCallback,\n    &SpotifyPlaylists::playlistRemovedCallback,\n    &SpotifyPlaylists::playlistMovedCallback,\n    &SpotifyPlaylists::playlistContainerLoadedCallback,\n\n\n};\n\nstatic sp_playlist_callbacks playlistCallbacks = {\n\n        NULL, //&SpotifyPlaylists::tracks_added,\n        NULL, //&SpotifyPlaylists::tracks_removed,\n        NULL, //&SpotifyPlaylists::tracks_moved,\n        &SpotifyPlaylists::playlistRenamed,\n        &SpotifyPlaylists::stateChanged,\n        &SpotifyPlaylists::playlistUpdateInProgress,\n        &SpotifyPlaylists::playlistMetadataUpdated,\n        NULL,\n        NULL,\n        NULL,\n        NULL,\n        NULL,\n        NULL,\n};\n\nstatic sp_playlist_callbacks syncPlaylistCallbacks = {\n\n        &SpotifyPlaylists::tracksAdded,\n        &SpotifyPlaylists::tracksRemoved,\n        &SpotifyPlaylists::tracksMoved,\n        &SpotifyPlaylists::playlistRenamed,\n        &SpotifyPlaylists::syncStateChanged,\n        &SpotifyPlaylists::playlistUpdateInProgress,\n        &SpotifyPlaylists::playlistMetadataUpdated,\n        NULL, //trackCreatedChanged\n        NULL, //trackSeenChanged\n        NULL, //descriptionChanged\n        NULL, //imageChanged\n        NULL, //trackMessageChanged\n        &SpotifyPlaylists::subscribersChanged, //subscribersChanged\n};\n\n\n}\n\n\n#endif // CALLBACKS_H\n"
  },
  {
    "path": "archive/spotify/cmake/FindQJSON.cmake",
    "content": "# Find QJSON - JSON handling library for Qt\n#\n# This module defines\n#  QJSON_FOUND - whether the qsjon library was found\n#  QJSON_LIBRARIES - the qjson library\n#  QJSON_INCLUDE_DIR - the include path of the qjson library\n#\n\nif (QJSON_INCLUDE_DIR AND QJSON_LIBRARIES)\n\n  # Already in cache\n  set (QJSON_FOUND TRUE)\n\nelse (QJSON_INCLUDE_DIR AND QJSON_LIBRARIES)\n\n  if (NOT WIN32)\n    # use pkg-config to get the values of QJSON_INCLUDE_DIRS\n    # and QJSON_LIBRARY_DIRS to add as hints to the find commands.\n    include (FindPkgConfig)\n    pkg_check_modules (QJSON REQUIRED QJson>=0.5)\n  endif (NOT WIN32)\n\n  find_library (QJSON_LIBRARIES\n    NAMES\n    qjson\n    PATHS\n    ${QJSON_LIBRARY_DIRS}\n    ${LIB_INSTALL_DIR}\n    ${KDE4_LIB_DIR}\n  )\n\n  find_path (QJSON_INCLUDE_DIR\n    NAMES\n    parser.h\n    PATH_SUFFIXES\n    qjson\n    PATHS\n    ${QJSON_INCLUDE_DIRS}\n    ${INCLUDE_INSTALL_DIR}\n    ${KDE4_INCLUDE_DIR}\n  )\n\n  include(FindPackageHandleStandardArgs)\n  find_package_handle_standard_args(QJSON DEFAULT_MSG QJSON_LIBRARIES QJSON_INCLUDE_DIR)\n\n  if ( WIN32 OR ( UNIX AND NOT APPLE ) )\n    set ( QJSON_LIBRARIES \"${QJSON_LIBRARIES} ${QJSON_LDFLAGS}\" CACHE INTERNAL \"\" )\n  endif ()\n\nendif (QJSON_INCLUDE_DIR AND QJSON_LIBRARIES)\n"
  },
  {
    "path": "archive/spotify/cmake/Findlibspotify.cmake",
    "content": "# - find Find the official Spotify library\n# LIBSPOTIFY_INCLUDE_DIR - Where to find Find the official Spotify library header files (directory)\n# LIBSPOTIFY_LIBRARIES - Find the official Spotify library libraries\n# LIBSPOTIFY_LIBRARY_RELEASE - Where the release library is\n# LIBSPOTIFY_LIBRARY_DEBUG - Where the debug library is\n# LIBSPOTIFY_FOUND - Set to TRUE if we found everything (library, includes and executable)\n \n# Copyright (c) 2010 Pau Garcia i Quiles, <pgquiles@elpauer.org>\n#\n# Redistribution and use is allowed according to the terms of the BSD license.\n# For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n#\n# Generated by CModuler, a CMake Module Generator - http://gitorious.org/cmoduler\n \nfind_library( LIBSPOTIFY_LIBRARIES libspotify)\nfind_path( LIBSPOTIFY_INCLUDE_DIR api.h )\nif( LIBSPOTIFY_LIBRARIES AND LIBSPOTIFY_INCLUDE_DIR  )\n message( \"found libspotify! ${LIBSPOTIFY} ${LIBSPOTIFY_HEADERS}\" )\n set( LIBSPOTIFY_FOUND TRUE )\nelse()\n\nIF( LIBSPOTIFY_INCLUDE_DIR AND LIBSPOTIFY_LIBRARY_RELEASE AND LIBSPOTIFY_LIBRARY_DEBUG )\n    SET(LIBSPOTIFY_FIND_QUIETLY TRUE)\nENDIF( LIBSPOTIFY_INCLUDE_DIR AND LIBSPOTIFY_LIBRARY_RELEASE AND LIBSPOTIFY_LIBRARY_DEBUG )\n \nFIND_PATH( LIBSPOTIFY_INCLUDE_DIR NAMES libspotify/api.h PATHS  ${LIBSPOTIFY_INCLUDE_HELPER}  )\n \nFIND_LIBRARY(LIBSPOTIFY_LIBRARY_RELEASE NAMES spotify openspotify HINTS ${LIBSPOTIFY_LIBRARY_HELPER} )\n \nFIND_LIBRARY(LIBSPOTIFY_LIBRARY_DEBUG NAMES spotify HINTS ${LIBSPOTIFY_LIBRARY_HELPER} )\n\nMESSAGE( \"GOT....${LIBSPOTIFY_INCLUDE_DIR}|${LIBSPOTIFY_LIBRARY_RELEASE}|${LIBSPOTIFY_LIBRARY_DEBUG}\" )\nIF( LIBSPOTIFY_LIBRARY_RELEASE OR LIBSPOTIFY_LIBRARY_DEBUG AND LIBSPOTIFY_INCLUDE_DIR )\n        SET( LIBSPOTIFY_FOUND TRUE )\nENDIF( LIBSPOTIFY_LIBRARY_RELEASE OR LIBSPOTIFY_LIBRARY_DEBUG AND LIBSPOTIFY_INCLUDE_DIR )\n \nIF( LIBSPOTIFY_LIBRARY_DEBUG AND LIBSPOTIFY_LIBRARY_RELEASE )\n        # if the generator supports configuration types then set\n        # optimized and debug libraries, or if the CMAKE_BUILD_TYPE has a value\n        IF( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE )\n                SET( LIBSPOTIFY_LIBRARIES optimized ${LIBSPOTIFY_LIBRARY_RELEASE} debug \n${LIBSPOTIFY_LIBRARY_DEBUG} )\n        ELSE( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE )\n    # if there are no configuration types and CMAKE_BUILD_TYPE has no value\n    # then just use the release libraries\n                SET( LIBSPOTIFY_LIBRARIES ${LIBSPOTIFY_LIBRARY_RELEASE} )\n        ENDIF( CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE )\nELSEIF( LIBSPOTIFY_LIBRARY_RELEASE )\n        SET( LIBSPOTIFY_LIBRARIES ${LIBSPOTIFY_LIBRARY_RELEASE} )\nELSE( LIBSPOTIFY_LIBRARY_DEBUG AND LIBSPOTIFY_LIBRARY_RELEASE )\n        SET( LIBSPOTIFY_LIBRARIES ${LIBSPOTIFY_LIBRARY_DEBUG} )\nENDIF( LIBSPOTIFY_LIBRARY_DEBUG AND LIBSPOTIFY_LIBRARY_RELEASE )\n \nIF( LIBSPOTIFY_FOUND )\n        IF( NOT LIBSPOTIFY_FIND_QUIETLY )\n                MESSAGE( STATUS \"Found LibSpotify header file in ${LIBSPOTIFY_INCLUDE_DIR}\")\n                MESSAGE( STATUS \"Found LibSpotify libraries: ${LIBSPOTIFY_LIBRARIES}\")\n        ENDIF( NOT LIBSPOTIFY_FIND_QUIETLY )\nELSE(LIBSPOTIFY_FOUND)\n        IF( LIBSPOTIFY_FIND_REQUIRED)\n                MESSAGE( FATAL_ERROR \"Could not find LibSpotify\" )\n        ELSE( LIBSPOTIFY_FIND_REQUIRED)\n                MESSAGE( STATUS \"Optional package LibSpotify was not found\" )\n        ENDIF( LIBSPOTIFY_FIND_REQUIRED)\nENDIF(LIBSPOTIFY_FOUND)\nendif()\n"
  },
  {
    "path": "archive/spotify/consolewatcher.cpp",
    "content": "/*\n    Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n\n#include \"consolewatcher.h\"\n#include <qjson/parser.h>\n\n#include <QTimer>\n#include <QTextStream>\n#include <QDebug>\n#include <qvariant.h>\n#include <qfile.h>\n#include <qendian.h>\n\nConsoleWatcher::ConsoleWatcher( QObject* parent)\n    : QObject( parent )\n    , m_stdin( 0 )\n    , m_timer( new QTimer( this ) )\n    , m_msgsize( 0 )\n{\n    m_stdin = new QFile( this );\n    if( !m_stdin->open( stdin, QIODevice::ReadOnly | QIODevice::Unbuffered ) )\n        qWarning() << \"FAILED TO OPEN STDIN!\";\n\n    m_timer->setInterval( 100 );\n    connect( m_timer, SIGNAL( timeout() ), this, SLOT( checkStdin() ) );\n    m_timer->start();\n}\n\nConsoleWatcher::~ConsoleWatcher()\n{\n\n}\n\nvoid ConsoleWatcher::checkStdin()\n{\n//     qDebug() << \"checking stdin:\" << m_stdin->bytesAvailable() << m_msgsize << m_curmsg;\n    if( m_msgsize == 0 )\n    {\n\n        quint32 len_nbo;\n        const qint64 nread = m_stdin->read( (char*) &len_nbo, 4 );\n        if ( nread == 4 )\n            m_msgsize = qFromBigEndian( len_nbo );\n        else if ( nread != 0 )\n            qWarning() << \"Read\" << nread << \"bytes when expecting message size (4 bytes)\";\n    }\n\n    if( m_msgsize > 0 )\n    {\n        m_curmsg.append( m_stdin->read( m_msgsize - m_curmsg.length() ) );\n    }\n\n    if( m_msgsize == (quint32) m_curmsg.length() ) // got the full message\n    {\n        parseMsg( m_curmsg );\n        m_msgsize = 0;\n        m_curmsg.clear();\n    }\n\n    if( m_msgsize < (quint32) m_curmsg.length() )\n    {\n\t// split m_curmsg at m_msgsize and process\n\t// read the first 4 bytes\n\t// dump the rest in m_curmsg\n    }\n}\n\nvoid ConsoleWatcher::parseMsg(const QByteArray& msg)\n{\n    QJson::Parser p;\n//     qDebug() << \"GOT UNPARSED STDIN:\" << msg;\n    QVariant json = p.parse( msg );\n\n     if( json.isValid() )\n         emit lineRead( json );\n}\n"
  },
  {
    "path": "archive/spotify/consolewatcher.h",
    "content": "/*\n    Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n\n#ifndef CONSOLEWATCHER_H\n#define CONSOLEWATCHER_H\n\n#include <QObject>\n#include <QString>\n#include <qvariant.h>\n\nclass QFile;\nclass QTimer;\n\nclass ConsoleWatcher : public QObject\n{\n    Q_OBJECT\npublic:\n    ConsoleWatcher( QObject* parent = 0 );\n    virtual ~ConsoleWatcher();\n\npublic slots:\n    void checkStdin();\n\nsignals:\n    void lineRead( const QVariant& line );\n\nprivate slots:\n    void parseMsg( const QByteArray& msg );\n\nprivate:\n    QFile* m_stdin;\n    QTimer* m_timer;\n    quint32 m_msgsize;\n    QByteArray m_curmsg;\n};\n\n#endif // CONSOLEWATCHER_H\n"
  },
  {
    "path": "archive/spotify/kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp",
    "content": "#include \"kdlockedsharedmemorypointer.h\"\n\n#if QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN )\n#ifndef QT_NO_SHAREDMEMORY\n\nnamespace kdtools\n{\n}\nusing namespace kdtools;\n\nKDLockedSharedMemoryPointerBase::KDLockedSharedMemoryPointerBase( QSharedMemory * m )\n    : locker( m ),\n      mem( m )\n{\n\n}\n\nKDLockedSharedMemoryPointerBase::KDLockedSharedMemoryPointerBase( QSharedMemory & m )\n    : locker( &m ),\n      mem( &m )\n{\n\n}\n\nKDLockedSharedMemoryPointerBase::~KDLockedSharedMemoryPointerBase() {}\n\nvoid * KDLockedSharedMemoryPointerBase::get() {\n    return mem ? mem->data() : 0 ;\n}\n\nconst void * KDLockedSharedMemoryPointerBase::get() const {\n    return mem ? mem->data() : 0 ;\n}\n\nsize_t KDLockedSharedMemoryPointerBase::byteSize() const {\n    return mem ? mem->size() : 0;\n}\n\n/*!\n  \\class KDLockedSharedMemoryPointer\n  \\ingroup core raii smartptr\n  \\brief Locking pointer for Qt shared memory segments\n  \\since_c 2.1\n\n  (The exception safety of this class has not been evaluated yet.)\n\n  KDLockedSharedMemoryPointer is a smart immutable pointer, which gives convenient and safe access to a QSharedMemory data segment.\n  The content of a KDLockedSharedMemoryPointer cannot be changed during it's lifetime.\n\n  You can use this class like a normal pointer to the shared memory segment and be sure it's locked while accessing it.\n  \\note You can only put simple types/structs/classes into it. structs and classes shall not contain any other pointers. See the\n  documentation of QSharedMemory for details.\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryPointer::KDLockedSharedMemoryPointer( QSharedMemory * mem )\n\n  Constructor. Constructs a KDLockedSharedMemory pointer which points to the data segment of \\a mem.\n  The constructor locks \\a mem. If the memory segment is already locked by another process, this constructor\n  blocks until the lock is released.\n\n  \\post data() == mem->data() and the memory segment has been locked\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryPointer::KDLockedSharedMemoryPointer( QSharedMemory & mem )\n\n  \\overload\n\n  \\post data() == mem.data() and the memory segment has been locked\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryPointer::~KDLockedSharedMemoryPointer()\n\n  Destructor. Unlocks the shared memory segment.\n\n  \\post The shared memory segment has been unlocked\n*/\n\n/*!\n  \\fn T * KDLockedSharedMemoryPointer::get()\n\n  \\returns a pointer to the contained object.\n*/\n\n/*!\n  \\fn const T * KDLockedSharedMemoryPointer::get() const\n\n  \\returns a const pointer to the contained object\n  \\overload\n*/\n\n/*!\n  \\fn T * KDLockedSharedMemoryPointer::data()\n\n  Equivalent to get(), provided for consistency with Qt naming conventions.\n*/\n\n/*!\n  \\fn const T * KDLockedSharedMemoryPointer::data() const\n\n  \\overload\n*/\n\n/*!\n  \\fn T & KDLockedSharedMemoryPointer::operator*()\n\n  Dereference operator. Returns \\link get() *get()\\endlink.\n*/\n\n/*!\n  \\fn const T & KDLockedSharedMemoryPointer::operator*() const\n\n  Dereference operator. Returns \\link get() *get()\\endlink.\n  \\overload\n*/\n\n/*!\n  \\fn T * KDLockedSharedMemoryPointer::operator->()\n\n  Member-by-pointer operator. Returns get().\n*/\n\n/*!\n  \\fn const T * KDLockedSharedMemoryPointer::operator->() const\n\n  Member-by-pointer operator. Returns get().\n  \\overload\n*/\n\n/*!\n  \\class KDLockedSharedMemoryArray\n  \\ingroup core raii smartptr\n  \\brief Locking array pointer to Qt shared memory segments\n  \\since_c 2.1\n\n  (The exception safety of this class has not been evaluated yet.)\n\n  KDLockedSharedMemoryArray is a smart immutable pointer, which gives convenient and safe access to array data stored in a QSharedMemory\n  data segment.\n  The content of a KDLockedSharedMemoryArray cannot be changed during it's lifetime.\n\n  You can use this class like a normal pointer to the shared memory segment and be sure it's locked while accessing it.\n  \\note You can only put arrays of simple types/structs/classes into it. structs and classes shall not contain any other pointers. See the\n  documentation of QSharedMemory for details.\n\n  \\sa KDLockedSharedMemoryPointer\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryArray::KDLockedSharedMemoryArray( QSharedMemory* mem )\n  Constructor. Constructs a KDLockedSharedMemoryArray which points to the data segment of \\a mem. The constructor locks \\a mem. If the memory\n  segment is already locked by another process, this constructor blocks until the lock is release.\n\n  \\post get() == mem->data() and the memory segment has been locked\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryArray::KDLockedSharedMemoryArray( QSharedMemory& mem )\n  \\overload\n\n  \\post get() == mem->data() and the memory segment has been locked\n*/\n\n\n/*!\n  \\typedef KDLockedSharedMemoryArray::size_type\n  Typedef for std::size_t. Provided for STL compatibility.\n*/\n\n/*!\n  \\typedef KDLockedSharedMemoryArray::difference_type\n  Typedef for std::ptrdiff_t. Provided for STL compatibility.\n*/\n\n/*!\n  \\typedef KDLockedSharedMemoryArray::iterator\n  Typedef for T*. Provided for STL compatibility.\n  \\since_t 2.2\n*/\n\n/*!\n  \\typedef KDLockedSharedMemoryArray::const_iterator\n  Typedef for const T*. Provided for STL compatibility.\n  \\since_t 2.2\n*/\n\n/*!\n  \\typedef KDLockedSharedMemoryArray::reverse_iterator\n  Typedef for std::reverse_iterator< \\link KDLockedSharedMemoryArray::iterator iterator\\endlink >. Provided for STL compatibility.\n  \\since_t 2.2\n*/\n\n/*!\n  \\typedef KDLockedSharedMemoryArray::const_reverse_iterator\n  Typedef for std::reverse_iterator< \\link KDLockedSharedMemoryArray::const_iterator const_iterator\\endlink >. Provided for STL compatibility.\n  \\since_t 2.2\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryArray::iterator KDLockedSharedMemoryArray::begin()\n  Returns an \\link KDLockedSharedMemoryArray::iterator iterator\\endlink pointing to the first item of the array.\n  \\since_f 2.2\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryArray::const_iterator KDLockedSharedMemoryArray::begin() const\n  \\overload\n  \\since_f 2.2\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryArray::iterator KDLockedSharedMemoryArray::end()\n  Returns an \\link KDLockedSharedMemoryArray::iterator iterator\\endlink pointing to the item after the last item of the array.\n  \\since_f 2.2\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryArray::const_iterator KDLockedSharedMemoryArray::end() const\n  \\overload\n  \\since_f 2.2\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryArray::reverse_iterator KDLockedSharedMemoryArray::rbegin()\n  Returns an \\link KDLockedSharedMemoryArray::reverse_iterator reverse_iterator\\endlink pointing to the item after the last item of the array.\n  \\since_f 2.2\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryArray::const_reverse_iterator KDLockedSharedMemoryArray::rbegin() const\n  \\overload\n  \\since_f 2.2\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryArray::reverse_iterator KDLockedSharedMemoryArray::rend()\n  Returns an \\link KDLockedSharedMemoryArray::reverse_iterator reverse_iterator\\endlink pointing to the first item of the array.\n  \\since_f 2.2\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryArray::const_reverse_iterator KDLockedSharedMemoryArray::rend() const\n  \\overload\n  \\since_f 2.2\n*/\n\n/*!\n  \\fn KDLockedSharedMemoryArray::size_type KDLockedSharedMemoryArray::size() const\n  Returns the size of this array. The size is calculated from the storage size of T and\n  the size of the shared memory segment.\n  \\since_f 2.2\n*/\n\n/*!\n  \\fn T& KDLockedSharedMemoryArray::operator[]( difference_type n )\n  Array access operator. Returns a reference to the item at index position \\a n.\n*/\n\n/*!\n  \\fn const T& KDLockedSharedMemoryArray::operator[]( difference_type n ) const\n  \\overload\n*/\n\n/*!\n \\fn T& KDLockedSharedMemoryArray::front()\n Returns a reference to the first item in the array. This is the same as operator[](0).\n*/\n\n/*!\n \\fn const T& KDLockedSharedMemoryArray::front() const\n \\overload\n*/\n\n/*!\n \\fn T& KDLockedSharedMemoryArray::back()\n Returns a reference to the last item in the array. This is the same as operator[](size()-1).\n \\since_f 2.2\n*/\n\n/*!\n \\fn const T& KDLockedSharedMemoryArray::back() const\n \\overload\n \\since_f 2.2\n*/\n\n\n#ifdef eKDTOOLSCORE_UNITTESTS\n\n#include <KDUnitTest/Test>\n\n#include <QThread>\n#include <QUuid>\n\nnamespace\n{\n    struct TestStruct\n    {\n        TestStruct( uint nn = 0 )\n            : n( nn ),\n              f( 0.0 ),\n              c( '\\0' ),\n              b( false )\n        {\n        }\n        uint n;\n        double f;\n        char c;\n        bool b;\n    };\n\n    bool operator==( const TestStruct& lhs, const TestStruct& rhs )\n    {\n        return lhs.n == rhs.n && lhs.f == rhs.f && lhs.c == rhs.c && lhs.b == rhs.b;\n    }\n\n    class TestThread : public QThread\n    {\n    public:\n        TestThread( const QString& key )\n            : mem( key )\n        {\n            mem.attach();\n        }\n\n        void run()\n        {\n            while( true )\n            {\n                msleep( 100 );\n                kdtools::KDLockedSharedMemoryPointer< TestStruct > p( &mem );\n                if( !p->b )\n                    continue;\n\n                p->n = 5;\n                p->f = 3.14;\n                p->c = 'A';\n                p->b = false;\n                return;\n            }\n        }\n\n        QSharedMemory mem;\n    };\n\n    bool isConst( TestStruct* )\n    {\n        return false;\n    }\n\n    bool isConst( const TestStruct* )\n    {\n        return true;\n    }\n}\n\n\nKDAB_UNITTEST_SIMPLE( KDLockedSharedMemoryPointer, \"kdcoretools\" ) {\n\n    const QString key = QUuid::createUuid();\n    QSharedMemory mem( key );\n    const bool created = mem.create( sizeof( TestStruct ) );\n    assertTrue( created );\n    if ( !created )\n        return; // don't execute tests if shm coulnd't be created\n\n    // On Windows, shared mem is only available in increments of page\n    // size (4k), so don't fail if the segment is larger:\n    const unsigned long mem_size = mem.size();\n    assertGreaterOrEqual( mem_size, sizeof( TestStruct ) );\n\n    {\n        kdtools::KDLockedSharedMemoryPointer< TestStruct > p( &mem );\n        assertTrue( p );\n        *p = TestStruct();\n        assertEqual( p->n, 0u );\n        assertEqual( p->f, 0.0 );\n        assertEqual( p->c, '\\0' );\n        assertFalse( p->b );\n    }\n\n    {\n        TestThread thread( key );\n        assertEqual( thread.mem.key().toStdString(), key.toStdString() );\n        assertEqual( static_cast< unsigned long >( thread.mem.size() ), mem_size );\n        thread.start();\n\n        assertTrue( thread.isRunning() );\n        thread.wait( 2000 );\n        assertTrue( thread.isRunning() );\n\n        {\n            kdtools::KDLockedSharedMemoryPointer< TestStruct > p( &mem );\n            p->b = true;\n        }\n\n        thread.wait( 2000 );\n        assertFalse( thread.isRunning() );\n    }\n\n    {\n        kdtools::KDLockedSharedMemoryPointer< TestStruct > p( &mem );\n        assertEqual( p->n, 5u );\n        assertEqual( p->f, 3.14 );\n        assertEqual( p->c, 'A' );\n        assertFalse( p->b );\n    }\n\n    {\n        kdtools::KDLockedSharedMemoryPointer< TestStruct > p( mem );\n        assertEqual( mem.data(), p.get() );\n        assertEqual( p.get(), p.operator->() );\n        assertEqual( p.get(), &(*p) );\n        assertEqual( p.get(), p.data() );\n        assertFalse( isConst( p.get() ) );\n    }\n\n    {\n        const kdtools::KDLockedSharedMemoryPointer< TestStruct > p( &mem );\n        assertEqual( mem.data(), p.get() );\n        assertEqual( p.get(), p.operator->() );\n        assertEqual( p.get(), &(*p) );\n        assertEqual( p.get(), p.data() );\n        assertTrue( isConst( p.get() ) );\n    }\n\n    {\n        QSharedMemory mem2( key + key );\n        const bool created2 = mem2.create( 16 * sizeof( TestStruct ) );\n        assertTrue( created2 );\n        if ( !created2 )\n            return; // don't execute tests if shm coulnd't be created\n\n        kdtools::KDLockedSharedMemoryArray<TestStruct> a( mem2 );\n        assertTrue( a );\n        assertEqual( a.get(), mem2.data() );\n        assertEqual( &a[0], a.get() );\n\n        a[1] = a[0];\n        assertTrue( a[0] == a[1] );\n\n        TestStruct ts;\n        ts.n = 5;\n        ts.f = 3.14;\n        a[0] = ts;\n        assertFalse( a[0] == a[1] );\n        assertEqual( a.front().n, ts.n );\n        assertEqual( a[0].f, ts.f );\n        a[0].n = 10;\n        assertEqual( a.front().n, 10u );\n        ts = a[0];\n        assertEqual( ts.n, 10u );\n\n        std::vector< TestStruct > v;\n        for( uint i = 0; i < a.size(); ++i )\n            v.push_back( TestStruct( i ) );\n\n        std::copy( v.begin(), v.end(), a.begin() );\n        for( uint i = 0; i < a.size(); ++i )\n            assertEqual( a[ i ].n, i );\n        assertEqual( a.front().n, 0u );\n        assertEqual( a.back().n, a.size() - 1 );\n\n        std::copy( v.begin(), v.end(), a.rbegin() );\n        for( uint i = 0; i < a.size(); ++i )\n            assertEqual( a[ i ].n, a.size() - 1 - i );\n        assertEqual( a.front().n, a.size() - 1 );\n        assertEqual( a.back().n, 0u );\n     }\n\n}\n#endif // KDTOOLSCORE_UNITTESTS\n#endif // QT_NO_SHAREDMEMORY\n#endif // QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN )\n"
  },
  {
    "path": "archive/spotify/kdsingleapplicationguard/kdlockedsharedmemorypointer.h",
    "content": "#ifndef __KDTOOLS__CORE__KDLOCKEDSHAREDMEMORYPOINTER_H__\n#define __KDTOOLS__CORE__KDLOCKEDSHAREDMEMORYPOINTER_H__\n\n#include <QtCore/QtGlobal>\n\n#if QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN )\n#ifndef QT_NO_SHAREDMEMORY\n\n#include \"kdsharedmemorylocker.h\"\n#include <QtCore/QSharedMemory>\n\n#include <cassert>\n\n#ifndef DOXYGEN_RUN\nnamespace kdtools {\n#endif\n\nclass KDLockedSharedMemoryPointerBase {\nprotected:\n    explicit KDLockedSharedMemoryPointerBase( QSharedMemory * mem );\n    explicit KDLockedSharedMemoryPointerBase( QSharedMemory & mem );\n    ~KDLockedSharedMemoryPointerBase();\n\n    // PENDING(marc) do we really want const propagation here? I\n    // usually declare all my RAII objects const...\n    void * get();\n    const void * get() const;\n\n    KDAB_IMPLEMENT_SAFE_BOOL_OPERATOR( get() )\n\n    size_t byteSize() const;\n\nprivate:\n    KDSharedMemoryLocker locker;\n    QSharedMemory * const mem;\n};\n\ntemplate< typename T>\nclass MAKEINCLUDES_EXPORT KDLockedSharedMemoryPointer : KDLockedSharedMemoryPointerBase {\n    KDAB_DISABLE_COPY( KDLockedSharedMemoryPointer );\npublic:\n    explicit KDLockedSharedMemoryPointer( QSharedMemory * m )\n        : KDLockedSharedMemoryPointerBase( m ) {}\n    explicit KDLockedSharedMemoryPointer( QSharedMemory & m )\n        : KDLockedSharedMemoryPointerBase( m ) {}\n\n    T * get() { return static_cast<T*>( KDLockedSharedMemoryPointerBase::get() ); }\n    const T * get() const { return static_cast<const T*>( KDLockedSharedMemoryPointerBase::get() ); }\n\n    T * data() { return static_cast<T*>( get() ); }\n    const T * data() const { return static_cast<const T*>( get() ); }\n\n    T & operator*() { assert( get() ); return *get(); }\n    const T & operator*() const { assert( get() ); return *get(); }\n\n    T * operator->() { return get(); }\n    const T * operator->() const { return get(); }\n\n    KDAB_USING_SAFE_BOOL_OPERATOR( KDLockedSharedMemoryPointerBase )\n};\n\ntemplate <typename T>\nclass MAKEINCLUDES_EXPORT KDLockedSharedMemoryArray : KDLockedSharedMemoryPointerBase {\n    KDAB_DISABLE_COPY( KDLockedSharedMemoryArray );\npublic:\n    explicit KDLockedSharedMemoryArray( QSharedMemory * m )\n        : KDLockedSharedMemoryPointerBase( m ) {}\n    explicit KDLockedSharedMemoryArray( QSharedMemory & m )\n        : KDLockedSharedMemoryPointerBase( m ) {}\n\n    typedef std::size_t size_type;\n    typedef std::ptrdiff_t difference_type;\n    typedef T* iterator;\n    typedef const T* const_iterator;\n    typedef std::reverse_iterator< const_iterator > const_reverse_iterator;\n    typedef std::reverse_iterator< iterator > reverse_iterator;\n    \n    iterator begin() { return get(); }\n    const_iterator begin() const { return get(); }\n\n    iterator end() { return begin() + size(); }\n    const_iterator end() const { return begin() + size(); }\n\n    reverse_iterator rbegin() { return reverse_iterator( end() ); }\n    const_reverse_iterator rbegin() const { return reverse_iterator( end() ); }\n\n    reverse_iterator rend() { return reverse_iterator( begin() ); }\n    const_reverse_iterator rend() const { return const_reverse_iterator( begin() ); }\n\n    size_type size() const { return byteSize() / sizeof( T ); }\n\n    T * get() { return static_cast<T*>( KDLockedSharedMemoryPointerBase::get() ); }\n    const T * get() const { return static_cast<const T*>( KDLockedSharedMemoryPointerBase::get() ); }\n\n    T & operator[]( difference_type n ) { assert( get() ); return *(get()+n); }\n    const T & operator[]( difference_type n ) const { assert( get() ); return *(get()+n); }\n\n    T & front() { assert( get() ); return *get(); }\n    const T & front() const { assert( get() ); return *get(); }\n\n    T & back() { assert( get() ); return *( get() + size() - 1 ); }\n    const T & back() const { assert( get() ); return *( get() + size() - 1 ); }\n\n    KDAB_USING_SAFE_BOOL_OPERATOR( KDLockedSharedMemoryPointerBase )\n};\n\n#ifndef DOXYGEN_RUN\n}\n#endif\n\n#endif /* QT_NO_SHAREDMEMORY */\n\n#endif /* QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN ) */\n\n#endif /* __KDTOOLS__CORE__KDLOCKEDSHAREDMEMORYPOINTER_H__ */\n"
  },
  {
    "path": "archive/spotify/kdsingleapplicationguard/kdsharedmemorylocker.cpp",
    "content": "#include \"kdsharedmemorylocker.h\"\n\n#if QT_VERSION >= 0x040400 || defined( DOXYGEN_RUN )\n\n#include <QSharedMemory>\n\nusing namespace kdtools;\n\n/*!\n  \\class KDSharedMemoryLocker\n  \\ingroup raii core\n  \\brief Exception-safe and convenient wrapper around QSharedMemory::lock()\n*/\n\n/**\n * Constructor. Locks the shared memory segment \\a mem.\n * If another process has locking the segment, this constructor blocks\n * until the lock is released. The memory segments needs to be properly created or attached.\n */\nKDSharedMemoryLocker::KDSharedMemoryLocker( QSharedMemory* mem )\n    : mem( mem )\n{\n    mem->lock();\n}\n\n/**\n * Destructor. Unlocks the shared memory segment associated with this\n * KDSharedMemoryLocker.\n */\nKDSharedMemoryLocker::~KDSharedMemoryLocker()\n{\n    mem->unlock();\n}\n\n#ifdef KDAB_EVAL\n#include KDAB_EVAL\nstatic const EvalDialogChecker evalChecker( \"KD Tools\", false );\n#endif\n\n#endif\n"
  },
  {
    "path": "archive/spotify/kdsingleapplicationguard/kdsharedmemorylocker.h",
    "content": "#ifndef __KDTOOLS__CORE__KDSHAREDMEMORYLOCKER_H\n#define __KDTOOLS__CORE__KDSHAREDMEMORYLOCKER_H\n\n#include \"kdtoolsglobal.h\"\n\n#if QT_VERSION < 0x040400 && !defined( DOXYGEN_RUN )\n#ifdef Q_CC_GNU\n#warning \"Can't use KDTools KDSharedMemoryLocker with Qt versions prior to 4.4\"\n#endif\n#else\n\nclass QSharedMemory;\n\n#ifndef DOXYGEN_RUN\nnamespace kdtools\n{\n#endif\n\nclass KDTOOLSCORE_EXPORT KDSharedMemoryLocker\n{\n    Q_DISABLE_COPY( KDSharedMemoryLocker )\npublic:\n    KDSharedMemoryLocker( QSharedMemory* mem );\n    ~KDSharedMemoryLocker();\n\nprivate:\n    QSharedMemory* const mem;\n};\n\n#ifndef DOXYGEN_RUN\n}\n#endif\n\n#endif\n\n#endif\n"
  },
  {
    "path": "archive/spotify/kdsingleapplicationguard/kdsingleapplicationguard.cpp",
    "content": "#include \"kdsingleapplicationguard.h\"\n\n#if QT_VERSION >= 0x040400 || defined(DOXYGEN_RUN)\n#ifndef QT_NO_SHAREDMEMORY\n\n#include \"kdsharedmemorylocker.h\"\n#include \"kdlockedsharedmemorypointer.h\"\n\n#include <QVector>\n#include <QCoreApplication>\n#include <QSharedMemory>\n#include <QSharedData>\n#include <QBasicTimer>\n#include <QTime>\n\n#include <algorithm>\n#include <limits>\n#include <cstdlib>\n#include <cstring>\n#include <cassert>\n\n#ifndef Q_WS_WIN\n#include <csignal>\n#include <unistd.h>\n#endif\n\n#ifdef Q_WS_WIN\n#define NOMINMAX\n#include <windows.h>\ntypedef signed int ssize_t;\n#endif\n\nusing namespace kdtools;\n\n#ifndef KDSINGLEAPPLICATIONGUARD_TIMEOUT_SECONDS\n#define KDSINGLEAPPLICATIONGUARD_TIMEOUT_SECONDS 10\n#endif\n\n#ifndef KDSINGLEAPPLICATIONGUARD_NUMBER_OF_PROCESSES\n#define KDSINGLEAPPLICATIONGUARD_NUMBER_OF_PROCESSES 10\n#endif\n\n#ifndef KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE\n#define KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE 32768\n#endif\n\nstatic unsigned int KDSINGLEAPPLICATIONGUARD_SHM_VERSION = 0;\n\nQ_GLOBAL_STATIC_WITH_ARGS( int, registerInstanceType,\n                           (qRegisterMetaType<KDSingleApplicationGuard::Instance>()) )\n\n/*!\n  \\class KDSingleApplicationGuard::Instance\n  \\relates KDSingleApplicationGuard\n  \\ingroup core\n  \\brief Information about instances a KDSingleApplicationGuard knows about\n\n  Instance represents instances of applications under\n  KDSingleApplicationGuard protection, and allows access to their\n  pid() and the arguments() they were started with.\n*/\n\nclass KDSingleApplicationGuard::Instance::Private : public QSharedData {\n    friend class ::KDSingleApplicationGuard::Instance;\npublic:\n    Private( const QStringList & args, bool truncated, qint64 pid )\n        : pid( pid ), arguments( args ), truncated( truncated ) {}\n\nprivate:\n    qint64 pid;\n    QStringList arguments;\n    bool truncated;\n};\n\nstruct ProcessInfo;\n\n/*!\n \\internal\n */\nclass KDSingleApplicationGuard::Private\n{\n    friend class ::KDSingleApplicationGuard;\n    friend class ::KDSingleApplicationGuard::Instance;\n    friend struct ::ProcessInfo;\n    KDSingleApplicationGuard * const q;\npublic:\n    Private( Policy policy, KDSingleApplicationGuard* qq );\n    ~Private();\n\n    void create( const QStringList& arguments );\n\n    bool checkOperational( const char * function, const char * act ) const;\n    bool checkOperationalPrimary( const char * function, const char * act ) const;\n\n    struct segmentheader\n    {\n        size_t size : 16;\n    };\n\n    static void sharedmem_free( char* );\n    static char* sharedmem_malloc( size_t size );\n\nprivate:\n    void shutdownInstance();\n    void poll();\n\nprivate:\n    static KDSingleApplicationGuard* primaryInstance;\n\nprivate:\n    QBasicTimer timer;\n    QSharedMemory mem;\n    int id;\n    Policy policy;\n    bool operational;\n    bool exitRequested;\n};\n\n/*!\n  \\internal\n*/\nKDSingleApplicationGuard::Instance::Instance( const QStringList & args, bool truncated, qint64 p )\n    : d( new Private( args, truncated, p ) )\n{\n    d->ref.ref();\n    (void)registerInstanceType();\n}\n\n/*!\n  Default constructor. Constructs in Instance that is \\link isNull()\n  null\\endlink.\n\n  \\sa isNull()\n*/\nKDSingleApplicationGuard::Instance::Instance() : d( 0 ) {}\n\n/*!\n  Copy constructor.\n*/\nKDSingleApplicationGuard::Instance::Instance( const Instance & other )\n    : d( other.d )\n{\n    if ( d )\n        d->ref.ref();\n}\n\n/*!\n  Destructor.\n*/\nKDSingleApplicationGuard::Instance::~Instance()\n{\n    if ( d && !d->ref.deref() )\n        delete d;\n}\n\n/*!\n  \\fn KDSingleApplicationGuard::Instance::swap( Instance & other )\n\n  Swaps the contents of this and \\a other.\n\n  This function never throws exceptions.\n*/\n\n/*!\n  \\fn KDSingleApplicationGuard::Instance::operator=( Instance other )\n\n  Assigns the contents of \\a other to this.\n\n  This function is strongly exception-safe.\n*/\n\n/*!\n  \\fn std::swap( KDSingleApplicationGuard::Instance & lhs, KDSingleApplicationGuard::Instance & rhs )\n  \\relates KDSingleApplicationGuard::Instance\n\n  Specialisation of std::swap() for\n  KDSingleApplicationGuard::Instance. Calls swap().\n*/\n\n/*!\n  \\fn qSwap( KDSingleApplicationGuard::Instance & lhs, KDSingleApplicationGuard::Instance & rhs )\n  \\relates KDSingleApplicationGuard::Instance\n\n  Specialisation of qSwap() for\n  KDSingleApplicationGuard::Instance. Calls swap().\n*/\n\n/*!\n  \\fn KDSingleApplicationGuard::Instance::isNull() const\n\n  Returns whether this instance is null.\n*/\n\n/*!\n  Returns whether this instance is valid. A valid instance is neither\n  null, nor does it have a negative PID.\n*/\nbool KDSingleApplicationGuard::Instance::isValid() const\n{\n    return d && d->pid >= 0 ;\n}\n\n/*!\n  Returns whether the #arguments are complete (\\c false) or not (\\c\n  true), e.g. because they have been truncated due to limited storage\n  space.\n\n  \\sa arguments()\n*/\nbool KDSingleApplicationGuard::Instance::areArgumentsTruncated() const\n{\n    return d && d->truncated;\n}\n\n/*!\n  Returns the arguments that this instance was started with.\n\n  \\sa areArgumentsTruncated()\n*/\nconst QStringList & KDSingleApplicationGuard::Instance::arguments() const\n{\n    if ( d )\n        return d->arguments;\n    static const QStringList empty;\n    return empty;\n}\n\n/*!\n  Returns the process-id (PID) of this instance.\n*/\nqint64 KDSingleApplicationGuard::Instance::pid() const\n{\n    if ( d )\n        return d->pid;\n    else\n        return -1;\n}\n\n/*!\n  \\class KDSingleApplicationGuard KDSingleApplicationGuard\n  \\ingroup core\n  \\brief A guard to protect an application from having several instances.\n\n  KDSingleApplicationGuard can be used to make sure only one instance of an\n  application is running at the same time.\n\n  \\note As KDSingleApplicationGuard currently uses QSharedMemory, Qt\n  4.4 or later is required.\n */\n\n/*!\n  \\fn void KDSingleApplicationGuard::instanceStarted(const KDSingleApplicationGuard::Instance & instance)\n\n  This signal is emitted by the primary instance whenever another\n  instance \\a instance started.\n */\n\n/*!\n  \\fn void KDSingleApplicationGuard::instanceExited(const KDSingleApplicationGuard::Instance & instance)\n\n  This signal is emitted by the primary instance whenever another\n  instance \\a instance exited.\n */\n\n/*!\n  \\fn void KDSingleApplicationGuard::raiseRequested()\n\n  This signal is emitted when the current running application is requested\n  to raise its main window.\n*/\n\n/*!\n  \\fn void KDSingleApplicationGuard::exitRequested()\n\n  This signal is emitted when the current running application has been asked to exit\n  by calling kill on the instance.\n*/\n\n/*!\n  \\fn void KDSingleApplicationGuard::becamePrimaryInstance()\n\n  This signal is emitted when the current running application becomes\n  the new primary application. The old primary application has quit.\n */\n\n/*!\n  \\fn void KDSingleApplicationGuard::becameSecondaryInstance()\n\n  This signal is emmited when the primary instance became secondary instance.\n  This happens when the instance doesn't update its status for some (default 10) seconds. Another instance\n  got primary instance in that case.\n  */\n\n/*!\n  \\fn void KDSingleApplicationGuard::policyChanged( KDSingleApplicationGuard::Policy policy )\n\n  This signal is emitted when the #policy of the system changes.\n*/\n\nenum Command\n{\n    NoCommand = 0x00,\n    ExitedInstance = 0x01,\n    NewInstance = 0x02,\n    FreeInstance = 0x04,\n    ShutDownCommand = 0x08,\n    KillCommand = 0x10,\n    BecomePrimaryCommand = 0x20,\n    RaiseCommand = 0x40\n};\n\nstatic const quint16 PrematureEndOfOptions = -1;\nstatic const quint16 RegularEndOfOptions   = -2;\n\nstruct ProcessInfo\n{\n    static const size_t MarkerSize = sizeof(quint16);\n\n    explicit ProcessInfo( Command c = FreeInstance, const QStringList& arguments = QStringList(), qint64 p = -1 )\n        : pid( p ),\n          command( c ),\n          timestamp( 0 ),\n          commandline( 0 )\n    {\n        setArguments( arguments );\n    }\n\n    void setArguments( const QStringList & arguments );\n    QStringList arguments( bool * prematureEnd  ) const;\n\n    qint64 pid;\n    quint32 command;\n    quint32 timestamp;\n    char* commandline;\n};\n\nstatic inline bool operator==( const ProcessInfo & lhs, const ProcessInfo & rhs )\n{\n    return lhs.command == rhs.command &&\n           ( lhs.commandline == rhs.commandline || ( lhs.commandline != 0 && rhs.commandline != 0 && ::strcmp( lhs.commandline, rhs.commandline ) == 0 ) );\n}\n\nstatic inline bool operator!=( const ProcessInfo & lhs, const ProcessInfo & rhs )\n{\n    return !operator==( lhs, rhs );\n}\n\n/*!\n  This struct contains information about the managed process system.\n  \\internal\n */\nstruct InstanceRegister\n{\n    explicit InstanceRegister( KDSingleApplicationGuard::Policy policy = KDSingleApplicationGuard::NoPolicy )\n        : policy( policy ),\n          maxInstances( KDSINGLEAPPLICATIONGUARD_NUMBER_OF_PROCESSES ),\n          version( 0 )\n    {\n        std::fill_n( commandLines, KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE, 0 );\n        ::memcpy( magicCookie, \"kdsingleapp\", 12 );\n    }\n\n    /*!\n      Returns whether this register was properly initialized by the first instance.\n      */\n    bool isValid() const\n    {\n        return ::strcmp( magicCookie, \"kdsingleapp\" ) == 0;\n    }\n\n    char magicCookie[ 12 ];\n    unsigned int policy  :  8;\n    quint32 maxInstances : 20;\n    unsigned int version :  4;\n    ProcessInfo info[ KDSINGLEAPPLICATIONGUARD_NUMBER_OF_PROCESSES ];\n\n    char commandLines[ KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE ];\n\n    Q_DISABLE_COPY( InstanceRegister )\n};\n\nvoid ProcessInfo::setArguments( const QStringList & arguments )\n{\n    if( commandline != 0 )\n        KDSingleApplicationGuard::Private::sharedmem_free( commandline );\n\n    commandline = 0;\n    if( arguments.isEmpty() )\n        return;\n\n    size_t totalsize = MarkerSize;\n    Q_FOREACH( const QString& arg, arguments )\n    {\n        const QByteArray utf8 = arg.toUtf8();\n        totalsize += utf8.size() + MarkerSize;\n    }\n    InstanceRegister* const reg = reinterpret_cast<InstanceRegister*>( KDSingleApplicationGuard::Private::primaryInstance->d->mem.data() );\n    this->commandline = KDSingleApplicationGuard::Private::sharedmem_malloc( totalsize );\n    if( this->commandline == 0 )\n    {\n        qWarning(\"KDSingleApplicationguard: out of memory when trying to save arguments.\\n\");\n        return;\n    }\n\n    char* const commandline = this->commandline + reinterpret_cast<long>(reg->commandLines);\n\n    int argpos = 0;\n    Q_FOREACH( const QString & arg, arguments )\n    {\n        const QByteArray utf8 = arg.toUtf8();\n        const int required = MarkerSize + utf8.size() + MarkerSize ;\n        const int available = KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE - argpos ;\n        if ( required > available || utf8.size() > std::numeric_limits<quint16>::max() ) {\n            // write a premature-eoo marker, and quit\n            memcpy( commandline + argpos, &PrematureEndOfOptions, MarkerSize );\n            argpos += MarkerSize;\n            qWarning( \"KDSingleApplicationGuard: argument list is too long (bytes required: %d, used: %d, available: %d\",\n                      required, argpos - 2, available );\n            return;\n        } else {\n            const quint16 len16 = utf8.size();\n            // write the size of the data...\n            memcpy( commandline + argpos, &len16, MarkerSize );\n            argpos += MarkerSize;\n            // then the data\n            memcpy( commandline + argpos, utf8.data(), len16 );\n            argpos += len16;\n        }\n    }\n    const ssize_t available = KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE - argpos;\n    assert( available >= static_cast<ssize_t>( MarkerSize ) );\n    memcpy( commandline + argpos, &RegularEndOfOptions, MarkerSize );\n    argpos += MarkerSize;\n}\n\nQStringList ProcessInfo::arguments( bool * prematureEnd  ) const\n{\n    QStringList result;\n    if( commandline == 0 )\n    {\n        if( prematureEnd )\n            *prematureEnd = true;\n        return result;\n    }\n\n    InstanceRegister* const reg = reinterpret_cast<InstanceRegister*>( KDSingleApplicationGuard::Private::primaryInstance->d->mem.data() );\n    const char* const commandline = this->commandline + reinterpret_cast<long>(reg->commandLines);\n\n    int argpos = 0;\n    while ( true ) {\n        const int available = KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE - argpos ;\n        assert( available >= 2 );\n\n        quint16 marker;\n        memcpy( &marker, commandline + argpos, MarkerSize );\n        argpos += MarkerSize;\n\n        if ( marker == PrematureEndOfOptions ) {\n            if ( prematureEnd ) *prematureEnd = true;\n            break;\n        }\n        if ( marker == RegularEndOfOptions ) {\n            if ( prematureEnd ) *prematureEnd = false;\n            break;\n        }\n\n        const int requested = MarkerSize + marker + MarkerSize ;\n        if ( requested > available ) {\n            const long long int p = pid;\n            qWarning( \"KDSingleApplicationGuard: inconsistency detected when parsing command-line argument for process %lld\", p );\n            if ( prematureEnd ) *prematureEnd = true;\n            break;\n        }\n\n        result.push_back( QString::fromUtf8( commandline + argpos, marker ) );\n        argpos += marker;\n    }\n\n    return result;\n}\n\nKDSingleApplicationGuard::Private::~Private()\n{\n    if( primaryInstance == q )\n        primaryInstance = 0;\n}\n\nbool KDSingleApplicationGuard::Private::checkOperational( const char * function, const char * act ) const\n{\n    assert( function );\n    assert( act );\n    if ( !operational )\n        qWarning( \"KDSingleApplicationGuard::%s: need to be operational to %s\", function, act );\n    return operational;\n}\n\nbool KDSingleApplicationGuard::Private::checkOperationalPrimary( const char * function, const char * act ) const\n{\n    if ( !checkOperational( function, act ) )\n        return false;\n    if ( id != 0 )\n        qWarning( \"KDSingleApplicationGuard::%s: need to be primary to %s\", function, act );\n    return id == 0;\n}\n\nstruct segmentheader\n{\n    size_t size : 16;\n};\n\nvoid KDSingleApplicationGuard::Private::sharedmem_free( char* pointer )\n{\n    InstanceRegister* const reg = reinterpret_cast<InstanceRegister*>( KDSingleApplicationGuard::Private::primaryInstance->d->mem.data() );\n    char* const heap = reg->commandLines;\n    char* const heap_ptr = heap + reinterpret_cast<long>(pointer) - sizeof( segmentheader );\n    const segmentheader* const header = reinterpret_cast< const segmentheader* >( heap_ptr );\n    const size_t size = header->size;\n\n    char* end = heap + KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE;\n\n    std::copy( heap_ptr + size, end, heap_ptr );\n    std::fill( end - size, end, 0 );\n\n    for( uint i = 0; i < reg->maxInstances; ++i )\n    {\n        if( reg->info[ i ].commandline > pointer )\n            reg->info[ i ].commandline -= size + sizeof( segmentheader );\n    }\n}\n\nchar* KDSingleApplicationGuard::Private::sharedmem_malloc( size_t size )\n{\n    InstanceRegister* const reg = reinterpret_cast<InstanceRegister*>( KDSingleApplicationGuard::Private::primaryInstance->d->mem.data() );\n    char* heap = reg->commandLines;\n\n    while( heap + sizeof( segmentheader ) + size < reg->commandLines + KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE )\n    {\n        segmentheader* const header = reinterpret_cast< segmentheader* >( heap );\n        if( header->size == 0 )\n        {\n            header->size = size;\n            return heap + sizeof( segmentheader ) - reinterpret_cast<long>(reg->commandLines);\n        }\n        heap += sizeof( header ) + header->size;\n    }\n    return 0;\n}\n\nvoid KDSingleApplicationGuard::Private::shutdownInstance()\n{\n    KDLockedSharedMemoryPointer< InstanceRegister > instances( &q->d->mem );\n    instances->info[ q->d->id ].command |= ExitedInstance;\n\n    if( q->isPrimaryInstance() )\n    {\n        // ohh... we need a new primary instance...\n        for ( int i = 1, end = instances->maxInstances ; i  < end ; ++i )\n        {\n            if( ( instances->info[ i ].command & ( FreeInstance | ExitedInstance | ShutDownCommand | KillCommand ) ) == 0 )\n            {\n                instances->info[ i ].command |= BecomePrimaryCommand;\n                return;\n            }\n        }\n        // none found? then my species is dead :-(\n    }\n}\n\nKDSingleApplicationGuard* KDSingleApplicationGuard::Private::primaryInstance = 0;\n\n/*!\n  Requests that the instance kills itself (by emitting exitRequested).\n\n  If the instance has since exited, does nothing.\n\n  \\sa shutdown(), raise()\n*/\nvoid KDSingleApplicationGuard::Instance::kill()\n{\n    KDLockedSharedMemoryPointer< InstanceRegister > instances( &KDSingleApplicationGuard::Private::primaryInstance->d->mem );\n    for ( int i = 0, end = instances->maxInstances ; i < end ; ++i )\n    {\n        if( instances->info[ i ].pid != d->pid )\n           continue;\n        if( ( instances->info[ i ].command & ( FreeInstance | ExitedInstance ) ) == 0 )\n            instances->info[ i ].command = KillCommand;\n    }\n}\n\n/*!\n  Requests that the instance shuts itself down (by calling QCoreApplication::quit()).\n\n  If the instance has since exited, does nothing.\n\n  \\sa kill(), raise()\n*/\nvoid KDSingleApplicationGuard::Instance::shutdown()\n{\n    KDLockedSharedMemoryPointer< InstanceRegister > instances( &KDSingleApplicationGuard::Private::primaryInstance->d->mem );\n    for ( int i = 0, end = instances->maxInstances ; i < end ; ++i )\n    {\n        if( instances->info[ i ].pid != d->pid )\n           continue;\n        if( ( instances->info[ i ].command & ( FreeInstance | ExitedInstance ) ) == 0 )\n            instances->info[ i ].command = ShutDownCommand;\n    }\n}\n\n/*!\n\n  Requests that the instance raises its main window.\n\n  The effects are implementation-defined: the KDSingleApplicationGuard\n  corresponding to the instance will emit its \\link\n  KDSingleApplicationGuard::raiseRequested() raiseRequested()\\endlink\n  signal.\n\n  If the instance has since exited, does nothing.\n\n  \\sa kill(), shutdown()\n*/\nvoid KDSingleApplicationGuard::Instance::raise()\n{\n    KDLockedSharedMemoryPointer< InstanceRegister > instances( &KDSingleApplicationGuard::Private::primaryInstance->d->mem );\n    for ( int i = 0, end = instances->maxInstances ; i < end ; ++i )\n    {\n        if( instances->info[ i ].pid != d->pid )\n           continue;\n        if( ( instances->info[ i ].command & ( FreeInstance | ExitedInstance ) ) == 0 )\n            instances->info[ i ].command = RaiseCommand;\n    }\n}\n\n\n#ifndef Q_WS_WIN\n// static\nvoid KDSingleApplicationGuard::SIGINT_handler( int sig )\n{\n    if( sig == SIGINT && Private::primaryInstance != 0 )\n        Private::primaryInstance->d->shutdownInstance();\n    ::exit( 1 );\n}\n#endif\n\n/*!\n  \\enum KDSingleApplicationGuard::Policy\n\n  Defines the policy that a KDSingleApplicationGuard can enforce:\n*/\n\n/*!\n  \\var KDSingleApplicationGuard::NoPolicy\n\n  instanceStarted() is emitted, and the new instance allowed to continue.\n*/\n\n/*!\n  \\var KDSingleApplicationGuard::AutoKillOtherInstances\n\n  instanceStarted() is emitted, and the new instance is killed (Instance::kill()).\n*/\n\n/*!\n  Creates a new KDSingleApplicationGuard with arguments\n  QCoreApplication::arguments() and policy AutoKillOtherInstances,\n  passing \\a parent to the base class constructor, as usual.\n*/\nKDSingleApplicationGuard::KDSingleApplicationGuard( QObject * parent )\n    : QObject( parent ), d( new Private( AutoKillOtherInstances, this ) )\n{\n    d->create( QCoreApplication::arguments() );\n}\n\n/*!\n  Creates a new KDSingleApplicationGuard with arguments\n  QCoreApplication::arguments() and policy \\a policy, passing \\a\n  parent to the base class constructor, as usual.\n*/\nKDSingleApplicationGuard::KDSingleApplicationGuard( Policy policy, QObject * parent )\n    : QObject( parent ), d( new Private( policy, this ) )\n{\n    d->create( QCoreApplication::arguments() );\n}\n\n/*!\n  Creates a new KDSingleApplicationGuard with arguments \\a arguments\n  and policy AutoKillOtherInstances, passing \\a parent to the base\n  class constructor, as usual.\n*/\nKDSingleApplicationGuard::KDSingleApplicationGuard( const QStringList & arguments, QObject * parent )\n    : QObject( parent ), d( new Private( AutoKillOtherInstances, this ) )\n{\n    d->create( arguments );\n}\n\n/*!\n  Creates a new KDSingleApplicationGuard with arguments \\a arguments\n  and policy \\a policy, passing \\a parent to the base class\n  constructor, as usual.\n*/\nKDSingleApplicationGuard::KDSingleApplicationGuard( const QStringList & arguments, Policy policy, QObject * parent )\n    : QObject( parent ), d( new Private( policy, this ) )\n{\n    d->create( arguments );\n}\n\nKDSingleApplicationGuard::Private::Private( Policy policy_, KDSingleApplicationGuard * qq )\n    : q( qq ),\n      id( -1 ),\n      policy( policy_ ),\n      operational( false ),\n      exitRequested( false )\n{\n}\n\nvoid KDSingleApplicationGuard::Private::create( const QStringList & arguments )\n{\n    if ( !QCoreApplication::instance() ) {\n        qWarning( \"KDSingleApplicationGuard: you need to construct a Q(Core)Application before you can construct a KDSingleApplicationGuard\" );\n        return;\n    }\n\n    const QString name = QCoreApplication::applicationName();\n    if ( name.isEmpty() ) {\n        qWarning( \"KDSingleApplicationGuard: QCoreApplication::applicationName must not be emty\" );\n        return;\n    }\n\n    (void)registerInstanceType();\n    if ( primaryInstance == 0 )\n        primaryInstance = q;\n\n    mem.setKey( name );\n\n    // if another instance crashed, the shared memory segment is still there on Unix\n    // the following lines trigger deletion in that case\n#ifndef Q_WS_WIN\n    mem.attach();\n    mem.detach();\n#endif\n\n    const bool created = mem.create( sizeof( InstanceRegister ) );\n    if( !created )\n    {\n        QString errorMsg;\n        if( mem.error() != QSharedMemory::NoError && mem.error() != QSharedMemory::AlreadyExists )\n            errorMsg += QString::fromLatin1( \"QSharedMemomry::create() failed: %1\" ).arg( mem.errorString() );\n\n        if( !mem.attach() )\n        {\n            if( mem.error() != QSharedMemory::NoError )\n                errorMsg += QString::fromLatin1( \"QSharedMemomry::attach() failed: %1\" ).arg( mem.errorString() );\n\n            qWarning( \"KDSingleApplicationGuard: Could neither create nor attach to shared memory segment.\" );\n            qWarning( \"%s\\n\",  errorMsg.toLocal8Bit().constData() );\n            return;\n        }\n\n        const int maxWaitMSecs = 1000 * 60; // stop waiting after 60 seconds\n        QTime waitTimer;\n        waitTimer.start();\n\n        // lets wait till the other instance initialized the register\n        bool initialized = false;\n        while( !initialized && waitTimer.elapsed() < maxWaitMSecs )\n        {\n            const KDLockedSharedMemoryPointer< InstanceRegister > instances( &mem );\n            initialized = instances->isValid();\n#ifdef Q_WS_WIN\n            ::Sleep(20);\n#else\n            usleep(20000);\n#endif\n        }\n\n        const KDLockedSharedMemoryPointer< InstanceRegister > instances( &mem );\n        if ( instances->version != 0 ) {\n            qWarning( \"KDSingleApplicationGuard: Detected version mismatch. \"\n                      \"Highest supported version: %ud, actual version: %ud\",\n                      KDSINGLEAPPLICATIONGUARD_SHM_VERSION, instances->version );\n            return;\n        }\n\n    }\n\n\n    KDLockedSharedMemoryPointer< InstanceRegister > instances( &mem );\n\n    if( !created )\n    {\n        assert( instances->isValid() );\n\n        // we're _not_ the first instance\n        // but the\n        bool killOurSelf = false;\n\n        // find a new slot...\n        id = std::find( instances->info, instances->info + instances->maxInstances, ProcessInfo() ) - instances->info;\n        ProcessInfo& info = instances->info[ id ];\n        info = ProcessInfo( NewInstance, arguments, QCoreApplication::applicationPid() );\n        killOurSelf = instances->policy == AutoKillOtherInstances;\n        policy = static_cast<Policy>( instances->policy );\n\n        // but the signal that we tried to start was sent to the primary application\n        if( killOurSelf )\n            exitRequested = true;\n    }\n    else\n    {\n        // ok.... we are the first instance\n        new ( instances.get() ) InstanceRegister( policy ); // create a new list (in shared memory)\n        id = 0;                                             // our id = 0\n        // and we've no command\n        instances->info[ 0 ] = ProcessInfo( NoCommand, arguments, QCoreApplication::applicationPid() );\n    }\n\n#ifndef Q_WS_WIN\n    ::signal( SIGINT, SIGINT_handler );\n#endif\n\n    // now listen for commands\n    timer.start( 750, q );\n\n    operational = true;\n}\n\n/*!\n  Destroys this SingleApplicationGuard.\n  If this instance has been the primary instance and no other instance is existing anymore,\n  the application is shut down completely. Otherwise the destructor selects another instance to\n  be the primary instances.\n */\nKDSingleApplicationGuard::~KDSingleApplicationGuard()\n{\n    if( d->id == -1 )\n        return;\n\n    d->shutdownInstance();\n}\n\n/*!\n  \\property KDSingleApplicationGuard::operational\n\n  Contains whether this KDSingleApplicationGuard is operational.\n\n  A non-operational KDSingleApplicationGuard cannot be used in any meaningful way.\n\n  Reasons for a KDSingleApplicationGuard being non-operational include:\n  \\li it was constructed before QApplication (or at least QCoreApplication) was constructed\n  \\li it failed to create or attach to the shared memory segment that is used for communication\n\n  Get this property's value using %isOperational().\n*/\nbool KDSingleApplicationGuard::isOperational() const\n{\n    return d->operational;\n}\n\n/*!\n  \\property KDSingleApplicationGuard::exitRequested\n\n  Contains wheter this istance has been requested to exit. This will happen when this instance\n  was just started, but the policy is AutoKillOtherInstances or by explicitely calling kill on\n  this instance().\n\n  Get this property's value using %isExitRequested().\n*/\nbool KDSingleApplicationGuard::isExitRequested() const\n{\n    return d->exitRequested;\n};\n\n/*!\n  \\property KDSingleApplicationGuard::primaryInstance\n\n   Contains whether this instance is the primary instance.\n\n   The primary instance is the first instance which was started or else the instance which\n   got selected by KDSingleApplicationGuard's destructor, when the primary instance was\n   shut down.\n\n   Get this property's value using %isPrimaryInstance(), and monitor changes to it\n   using becamePrimaryInstance().\n */\nbool KDSingleApplicationGuard::isPrimaryInstance() const\n{\n    return d->id == 0;\n}\n\n/*!\n \\property KDSingleApplicationGuard::policy\n Specifies the policy KDSingleApplicationGuard is using when new instances are started.\n This can only be set in the primary instance.\n\n Get this property's value using %policy(), set it using %setPolicy(), and monitor changes\n to it using policyChanged().\n */\nKDSingleApplicationGuard::Policy KDSingleApplicationGuard::policy() const\n{\n    return d->policy;\n}\n\nvoid KDSingleApplicationGuard::setPolicy( Policy policy )\n{\n    if ( !d->checkOperationalPrimary( \"setPolicy\", \"change the policy\" ) )\n        return;\n\n    if( d->policy == policy )\n        return;\n\n    d->policy = policy;\n    emit policyChanged( policy );\n    KDLockedSharedMemoryPointer< InstanceRegister > instances( &d->mem );\n    instances->policy = policy;\n}\n\n/*!\n Returns a list of all currently running instances.\n */\nQVector<KDSingleApplicationGuard::Instance>\nKDSingleApplicationGuard::instances() const\n{\n    if ( !d->checkOperational( \"instances\", \"report on other instances\" ) )\n        return QVector<Instance>();\n\n    if ( Private::primaryInstance == 0 ) {\n        Private::primaryInstance = const_cast<KDSingleApplicationGuard*>( this );\n    }\n\n    QVector<Instance> result;\n    const KDLockedSharedMemoryPointer< InstanceRegister > instances( const_cast< QSharedMemory* >( &d->mem ) );\n    for ( int i = 0, end = instances->maxInstances ; i < end ; ++i )\n    {\n        const ProcessInfo& info = instances->info[ i ];\n        if( ( info.command & ( FreeInstance | ExitedInstance ) ) == 0 )\n        {\n            bool truncated;\n            const QStringList arguments = info.arguments( &truncated );\n            result.push_back( Instance( arguments, truncated, info.pid ) );\n        }\n    }\n    return result;\n}\n\n/*!\n  Shuts down all other instances. This can only be called from the\n  the primary instance.\n  Shut down is done gracefully via QCoreApplication::quit().\n */\nvoid KDSingleApplicationGuard::shutdownOtherInstances()\n{\n    if ( !d->checkOperationalPrimary( \"shutdownOtherInstances\", \"shut other instances down\" ) )\n        return;\n\n    KDLockedSharedMemoryPointer< InstanceRegister > instances( &d->mem );\n    for ( int i = 1, end = instances->maxInstances ; i < end ; ++i )\n    {\n        if( ( instances->info[ i ].command & ( FreeInstance | ExitedInstance ) ) == 0 )\n            instances->info[ i ].command = ShutDownCommand;\n    }\n}\n\n/*!\n  Kills all other instances. This can only be called from the\n  the primary instance.\n  Killing is done via emitting exitRequested. It's up to the receiving\n  instance to react properly.\n */\nvoid KDSingleApplicationGuard::killOtherInstances()\n{\n    if ( !d->checkOperationalPrimary( \"killOtherInstances\", \"kill other instances\" ) )\n        return;\n\n    KDLockedSharedMemoryPointer< InstanceRegister > instances( &d->mem );\n    for ( int i = 1, end = instances->maxInstances ; i < end ; ++i )\n    {\n        if( ( instances->info[ i ].command & ( FreeInstance | ExitedInstance ) ) == 0 )\n            instances->info[ i ].command = KillCommand;\n    }\n}\n\nbool KDSingleApplicationGuard::event( QEvent * event )\n{\n    if ( event->type() == QEvent::Timer ) {\n        const QTimerEvent * const te = static_cast<QTimerEvent*>( event );\n        if ( te->timerId() == d->timer.timerId() ) {\n            d->poll();\n            return true;\n        }\n    }\n    return QObject::event( event );\n}\n\nvoid KDSingleApplicationGuard::Private::poll() {\n\n    const quint32 now = QDateTime::currentDateTime().toTime_t();\n\n    if ( primaryInstance == 0 ) {\n        primaryInstance = q;\n    }\n\n    if ( q->isPrimaryInstance() )\n    {\n        // only the primary instance will get notified about new instances\n        QVector< Instance > exitedInstances;\n        QVector< Instance > startedInstances;\n\n        {\n            KDLockedSharedMemoryPointer< InstanceRegister > instances( &mem );\n\n            if( instances->info[ id ].pid != QCoreApplication::applicationPid() )\n            {\n                for ( int i = 1, end = instances->maxInstances ; i < end && id == 0 ; ++i )\n                {\n                    if( instances->info[ i ].pid == QCoreApplication::applicationPid() )\n                        id = i;\n                }\n                emit q->becameSecondaryInstance();\n                return;\n            }\n\n            instances->info[ id ].timestamp = now;\n\n            for ( int i = 1, end = instances->maxInstances ; i < end ; ++i )\n            {\n                ProcessInfo& info = instances->info[ i ];\n                if( info.command & NewInstance )\n                {\n                    bool truncated;\n                    const QStringList arguments = info.arguments( &truncated );\n                    startedInstances.push_back( Instance( arguments, truncated, info.pid ) );\n                    info.command &= ~NewInstance;  // clear NewInstance flag\n                }\n                if( info.command & ExitedInstance )\n                {\n                    bool truncated;\n                    const QStringList arguments = info.arguments( &truncated );\n                    exitedInstances.push_back( Instance( arguments, truncated, info.pid ) );\n                    info.command = FreeInstance;   // set FreeInstance flag\n                }\n            }\n        }\n\n        // one signal for every new instance - _after_ the memory segment was unlocked again\n        for( QVector< Instance >::const_iterator it = startedInstances.constBegin(); it != startedInstances.constEnd(); ++it )\n            emit q->instanceStarted( *it );\n        for( QVector< Instance >::const_iterator it = exitedInstances.constBegin(); it != exitedInstances.constEnd(); ++it )\n            emit q->instanceExited( *it );\n    }\n    else\n    {\n        // do we have a command?\n        bool killOurSelf = false;\n        bool shutDownOurSelf = false;\n        bool policyDidChange = false;\n\n        {\n            KDLockedSharedMemoryPointer< InstanceRegister > instances( &mem );\n\n            const Policy oldPolicy = policy;\n            policy = static_cast<Policy>( instances->policy );\n            policyDidChange = policy != oldPolicy;\n\n            // check for the primary instance health status\n            if( now - instances->info[ 0 ].timestamp > KDSINGLEAPPLICATIONGUARD_TIMEOUT_SECONDS )\n            {\n                std::swap( instances->info[ 0 ], instances->info[ id ] );\n                id = 0;\n                instances->info[ id ].timestamp = now;\n                emit q->becamePrimaryInstance();\n                instances->info[ id ].command &= ~BecomePrimaryCommand;  // afterwards, reset the flag\n            }\n\n            if( instances->info[ id ].command & BecomePrimaryCommand )\n            {\n                // we became primary!\n                instances->info[ 0 ] = instances->info[ id ];\n                instances->info[ id ] = ProcessInfo();  // change our id to 0 and declare the old slot as free\n                id = 0;\n                instances->info[ id ].timestamp = now;\n                emit q->becamePrimaryInstance();\n            }\n\n            if( instances->info[ id ].command & RaiseCommand )\n            {\n               // raise ourself!\n               emit q->raiseRequested();\n               instances->info[ id ].command &= ~RaiseCommand;  // afterwards, reset the flag\n            }\n\n\n            killOurSelf = instances->info[ id ].command & KillCommand;            // check for kill command\n            shutDownOurSelf = instances->info[ id ].command & ShutDownCommand;    // check for shut down command\n            instances->info[ id ].command &= ~( KillCommand | ShutDownCommand | BecomePrimaryCommand );  // reset both flags\n            if( killOurSelf )\n            {\n                instances->info[ id ].command |= ExitedInstance;  // upon kill, we have to set the ExitedInstance flag\n                id = -1;                                          // becauso our d'tor won't be called anymore\n            }\n        }\n\n        if( killOurSelf )  // kill our self takes precedence\n        {\n            exitRequested = true;\n            emit q->exitRequested();\n        }\n        else if( shutDownOurSelf )\n            qApp->quit();\n        else if( policyDidChange )\n            emit q->policyChanged( policy );\n    }\n}\n\n#include \"moc_kdsingleapplicationguard.cpp\"\n\n#ifdef KDTOOLSCORE_UNITTESTS\n\n#include <kdunittest/test.h>\n\n#include \"kdautopointer.h\"\n\n#include <iostream>\n\n#include <QtCore/QTime>\n#include <QtCore/QUuid>\n#include <QtTest/QSignalSpy>\n\nstatic void wait( int msec, QSignalSpy * spy=0, int expectedCount=INT_MAX )\n{\n    QTime t;\n    t.start();\n    while ( ( !spy || spy->count() < expectedCount ) && t.elapsed() < msec )\n    {\n        qApp->processEvents( QEventLoop::WaitForMoreEvents, qMax( 10, msec - t.elapsed() ) );\n    }\n}\n\nstatic std::ostream& operator<<( std::ostream& stream, const QStringList& list )\n{\n    stream << \"QStringList(\";\n    for( QStringList::const_iterator it = list.begin(); it != list.end(); ++it )\n    {\n        stream << \" \" << it->toLocal8Bit().data();\n        if( it + 1 != list.end() )\n            stream << \",\";\n    }\n    stream << \" )\";\n    return stream;\n}\n\nnamespace {\n    class ApplicationNameSaver {\n        Q_DISABLE_COPY( ApplicationNameSaver )\n        const QString oldname;\n    public:\n        explicit ApplicationNameSaver( const QString & name )\n            : oldname( QCoreApplication::applicationName() )\n        {\n            QCoreApplication::setApplicationName( name );\n        }\n        ~ApplicationNameSaver() {\n            QCoreApplication::setApplicationName( oldname );\n        }\n    };\n}\n\nKDAB_UNITTEST_SIMPLE( KDSingleApplicationGuard, \"kdcoretools\" ) {\n\n    // set it to an unique name\n    const ApplicationNameSaver saver( QUuid::createUuid().toString() );\n\n    KDAutoPointer<KDSingleApplicationGuard> guard3;\n    KDAutoPointer<QSignalSpy> spy3;\n    KDAutoPointer<QSignalSpy> spy4;\n\n    {\n        KDSingleApplicationGuard guard1;\n        assertEqual( guard1.policy(), KDSingleApplicationGuard::AutoKillOtherInstances );\n        assertEqual( guard1.instances().count(), 1 );\n        assertTrue( guard1.isPrimaryInstance() );\n\n        guard1.setPolicy( KDSingleApplicationGuard::NoPolicy );\n        assertEqual( guard1.policy(), KDSingleApplicationGuard::NoPolicy );\n\n        QSignalSpy spy1( &guard1, SIGNAL(instanceStarted(KDSingleApplicationGuard::Instance)) );\n\n        KDSingleApplicationGuard guard2;\n        assertEqual( guard1.instances().count(), 2 );\n        assertEqual( guard2.instances().count(), 2 );\n        assertEqual( guard2.policy(), KDSingleApplicationGuard::NoPolicy );\n        assertFalse( guard2.isPrimaryInstance() );\n\n        wait( 1000, &spy1, 1 );\n\n        assertEqual( spy1.count(), 1 );\n        guard3.reset( new KDSingleApplicationGuard );\n        spy3.reset( new QSignalSpy( guard3.get(), SIGNAL(becamePrimaryInstance()) ) );\n        spy4.reset( new QSignalSpy( guard3.get(), SIGNAL(instanceExited(KDSingleApplicationGuard::Instance) ) ) );\n        assertFalse( guard3->isPrimaryInstance() );\n    }\n\n    wait( 1000, spy3.get(), 1 );\n    wait( 1000, spy4.get(), 1 );\n    assertEqual( spy3->count(), 1 );\n    assertEqual( guard3->instances().count(), 1 );\n    assertTrue( guard3->isPrimaryInstance() );\n    guard3.reset( new KDSingleApplicationGuard );\n\n    assertEqual( guard3->instances().first().arguments(), qApp->arguments() );\n\n    QSignalSpy spyStarted( guard3.get(), SIGNAL(instanceStarted(KDSingleApplicationGuard::Instance)) );\n    QSignalSpy spyExited(  guard3.get(), SIGNAL(instanceExited(KDSingleApplicationGuard::Instance)) );\n\n    {\n        KDSingleApplicationGuard guard1;\n        KDSingleApplicationGuard guard2;\n\n        wait( 1000, &spyStarted, 2 );\n\n        assertEqual( spyStarted.count(), 2 );\n    }\n\n    wait( 1000, &spyExited, 2 );\n    assertEqual( spyExited.count(), 2 );\n\n    spyStarted.clear();\n    spyExited.clear();\n\n    {\n        // check arguments-too-long handling:\n        QStringList args;\n        for ( unsigned int i = 0, end = KDSINGLEAPPLICATIONGUARD_MAX_COMMAND_LINE/16 ; i != end ; ++i )\n            args.push_back( QLatin1String( \"0123456789ABCDEF\" ) );\n        KDSingleApplicationGuard guard3( args );\n\n        wait( 1000, &spyStarted, 1 );\n\n        const QVector<KDSingleApplicationGuard::Instance> instances = guard3.instances();\n        assertEqual( instances.size(), 2 );\n\n        assertTrue( instances[1].areArgumentsTruncated() );\n    }\n}\n\n#endif // KDTOOLSCORE_UNITTESTS\n\n#endif // QT_NO_SHAREDMEMORY\n#endif // QT_VERSION >= 0x040400 || defined(DOXYGEN_RUN)\n"
  },
  {
    "path": "archive/spotify/kdsingleapplicationguard/kdsingleapplicationguard.h",
    "content": "#ifndef __KDTOOLSCORE_KDSINGLEAPPLICATIONGUARD_H__\n#define __KDTOOLSCORE_KDSINGLEAPPLICATIONGUARD_H__\n\n#include <QtCore/QObject>\n\n#if QT_VERSION >= 0x040400 || defined(DOXYGEN_RUN)\n#ifndef QT_NO_SHAREDMEMORY\n\n#include <QtCore/QStringList>\n#include <QtCore/QMetaType>\n\n#include \"pimpl_ptr.h\"\n\n#include <algorithm>\n\ntemplate <typename T> class QVector;\nclass QCoreApplication;\n\nclass KDTOOLSCORE_EXPORT KDSingleApplicationGuard : public QObject\n{\n    Q_OBJECT\n    Q_ENUMS( Policy )\n    Q_PROPERTY( bool operational READ isOperational )\n    Q_PROPERTY( bool exitRequested READ isExitRequested )\n    Q_PROPERTY( bool primaryInstance READ isPrimaryInstance NOTIFY becamePrimaryInstance )\n    Q_PROPERTY( Policy policy READ policy WRITE setPolicy NOTIFY policyChanged )\npublic:\n    enum Policy\n    {\n        NoPolicy = 0,\n        AutoKillOtherInstances = 1\n    };\n\n    explicit KDSingleApplicationGuard( QObject * parent=0 );\n    explicit KDSingleApplicationGuard( Policy policy, QObject * parent=0 );\n    explicit KDSingleApplicationGuard( const QStringList & arguments, QObject * parent=0 );\n    explicit KDSingleApplicationGuard( const QStringList & arguments, Policy policy, QObject * parent=0 );\n    ~KDSingleApplicationGuard();\n\n    bool isOperational() const;\n\n    bool isExitRequested() const;\n\n    bool isPrimaryInstance() const;\n\n    Policy policy() const;\n    void setPolicy( Policy policy );\n\n    class Instance;\n\n    QVector<Instance> instances() const;\n\nQ_SIGNALS:\n    void instanceStarted( const KDSingleApplicationGuard::Instance & instance );\n    void instanceExited( const KDSingleApplicationGuard::Instance & instance );\n    void exitRequested();\n    void raiseRequested();\n    void becamePrimaryInstance();\n    void becameSecondaryInstance();\n    void policyChanged( KDSingleApplicationGuard::Policy policy );\n\npublic Q_SLOTS:\n    void shutdownOtherInstances();\n    void killOtherInstances();\n\nprotected:\n    /*! \\reimp */ bool event( QEvent * event );\n\nprivate:\n#ifndef Q_WS_WIN\n    static void SIGINT_handler( int );\n#endif\n\nprivate:\n    friend struct ProcessInfo;\n\n    class Private;\n    kdtools::pimpl_ptr< Private > d;\n};\n\nclass KDTOOLSCORE_EXPORT KDSingleApplicationGuard::Instance {\n    friend class ::KDSingleApplicationGuard;\n    friend class ::KDSingleApplicationGuard::Private;\n    Instance( const QStringList &, bool, qint64 );\npublic:\n    Instance();\n    Instance( const Instance & other );\n    ~Instance();\n\n    void swap( Instance & other ) {\n        std::swap( d, other.d );\n    }\n\n    Instance & operator=( Instance other ) {\n        swap( other );\n        return *this;\n    }\n\n    bool isNull() const { return !d; }\n    bool isValid() const;\n\n    bool areArgumentsTruncated() const;\n\n    const QStringList & arguments() const;\n    qint64 pid() const;\n\n    void shutdown();\n    void kill();\n    void raise();\n\nprivate:\n    class Private;\n    Private * d;\n};\n\nnamespace std {\n    template <>\n    inline void swap( KDSingleApplicationGuard::Instance & lhs,\n                      KDSingleApplicationGuard::Instance & rhs )\n    {\n        lhs.swap( rhs );\n    }\n} // namespace std\n\nQT_BEGIN_NAMESPACE\n\ntemplate <>\ninline void qSwap( KDSingleApplicationGuard::Instance & lhs,\n                   KDSingleApplicationGuard::Instance & rhs )\n{\n    lhs.swap( rhs );\n}\nQ_DECLARE_METATYPE( KDSingleApplicationGuard::Instance )\nQ_DECLARE_TYPEINFO( KDSingleApplicationGuard::Instance, Q_MOVABLE_TYPE );\n\nQT_END_NAMESPACE\n\n\n#endif // QT_NO_SHAREDMEMORY\n#endif // QT_VERSION >= 0x040400 || defined(DOXYGEN_RUN)\n\n#endif /* __KDTOOLSCORE_KDSINGLEAPPLICATIONGUARD_H__ */\n"
  },
  {
    "path": "archive/spotify/kdsingleapplicationguard/kdtoolsglobal.cpp",
    "content": "#include \"kdtoolsglobal.h\"\n\n#include <QByteArray>\n\n#include <algorithm>\n\nnamespace {\n    struct Version {\n\tunsigned char v[3];\n    };\n\n    static inline bool operator<( const Version & lhs, const Version & rhs ) {\n\treturn std::lexicographical_compare( lhs.v, lhs.v + 3, rhs.v, rhs.v + 3 );\n    }\n    static inline bool operator==( const Version & lhs, const Version & rhs ) {\n\treturn std::equal( lhs.v, lhs.v + 3, rhs.v );\n    }\n    KDTOOLS_MAKE_RELATION_OPERATORS( Version, static inline )\n}\n\nstatic Version kdParseQtVersion( const char * const version ) {\n    if ( !version || qstrlen( version ) < 5 || version[1] != '.' || version[3] != '.' || ( version[5] != 0 && version[5] != '.' && version[5] != '-' ) )\n\treturn Version(); // parse error\n    const Version result = { { version[0] - '0', version[2] - '0', version[4] - '0' } };\n    return result;\n}\n\nbool _kdCheckQtVersion_impl( int major, int minor, int patchlevel ) {\n    static const Version actual = kdParseQtVersion( qVersion() ); // do this only once each run...\n    const Version requested = { { major, minor, patchlevel } };\n    return actual >= requested;\n}\n"
  },
  {
    "path": "archive/spotify/kdsingleapplicationguard/kdtoolsglobal.h",
    "content": "#ifndef __KDTOOLS_KDTOOLSGLOBAL_H__\n#define __KDTOOLS_KDTOOLSGLOBAL_H__\n\n#include <QtCore/QtGlobal>\n\n#define KDAB_DISABLE_COPY( x ) private: x( const x & ); x & operator=( const x & )\n\n#ifdef KDTOOLS_SHARED\n#  ifdef BUILD_SHARED_KDTOOLSCORE\n#    define KDTOOLSCORE_EXPORT Q_DECL_EXPORT\n#  else\n#    define KDTOOLSCORE_EXPORT Q_DECL_IMPORT\n#  endif\n#  ifdef BUILD_SHARED_KDTOOLSGUI\n#    define KDTOOLSGUI_EXPORT Q_DECL_EXPORT\n#  else\n#    define KDTOOLSGUI_EXPORT Q_DECL_IMPORT\n#  endif\n#  ifdef BUILD_SHARED_KDTOOLSXML\n#    define KDTOOLSXML_EXPORT Q_DECL_EXPORT\n#  else\n#    define KDTOOLSXML_EXPORT Q_DECL_IMPORT\n#  endif\n#  ifdef BUILD_SHARED_KDUPDATER\n#    define KDTOOLS_UPDATER_EXPORT    Q_DECL_EXPORT\n#  else\n#    define KDTOOLS_UPDATER_EXPORT    Q_DECL_IMPORT\n#  endif\n#else // KDTOOLS_SHARED\n#  define KDTOOLSCORE_EXPORT\n#  define KDTOOLSGUI_EXPORT\n#  define KDTOOLSXML_EXPORT\n#  define KDTOOLS_UPDATER_EXPORT\n#endif // KDTOOLS_SHARED\n\n#define MAKEINCLUDES_EXPORT\n\n#define DOXYGEN_PROPERTY( x )\n#ifdef DOXYGEN_RUN\n# define KDAB_IMPLEMENT_SAFE_BOOL_OPERATOR( func ) operator unspecified_bool_type() const { return func; }\n# define KDAB_USING_SAFE_BOOL_OPERATOR( Class ) operator unspecified_bool_type() const;\n#else\n# define KDAB_IMPLEMENT_SAFE_BOOL_OPERATOR( func )                      \\\n    private:                                                            \\\n        struct __safe_bool_dummy__ { void nonnull() {} };               \\\n    public:                                                             \\\n        typedef void ( __safe_bool_dummy__::*unspecified_bool_type )(); \\\n        operator unspecified_bool_type() const {                        \\\n            return ( func ) ? &__safe_bool_dummy__::nonnull : 0 ;       \\\n        }\n#define KDAB_USING_SAFE_BOOL_OPERATOR( Class ) \\\n    using Class::operator Class::unspecified_bool_type;\n#endif\n\n#define KDTOOLS_MAKE_RELATION_OPERATORS( Class, linkage )             \\\n    linkage bool operator>( const Class & lhs, const Class & rhs ) {  \\\n        return operator<( rhs, lhs );                                 \\\n    }                                                                 \\\n    linkage bool operator!=( const Class & lhs, const Class & rhs ) { \\\n        return !operator==( lhs, rhs );                               \\\n    }                                                                 \\\n    linkage bool operator<=( const Class & lhs, const Class & rhs ) { \\\n        return !operator>( lhs, rhs );                                \\\n    }                                                                 \\\n    linkage bool operator>=( const Class & lhs, const Class & rhs ) { \\\n        return !operator<( lhs, rhs );                                \\\n    }\n\ntemplate <typename T>\ninline T & __kdtools__dereference_for_methodcall( T & o ) {\n    return o;\n}\n\ntemplate <typename T>\ninline T & __kdtools__dereference_for_methodcall( T * o ) {\n    return *o;\n}\n\n#define KDAB_SET_OBJECT_NAME( x ) __kdtools__dereference_for_methodcall( x ).setObjectName( QLatin1String( #x ) )\n\nKDTOOLSCORE_EXPORT bool _kdCheckQtVersion_impl( int major, int minor=0, int patchlevel=0 );\nstatic inline bool kdCheckQtVersion( unsigned int major, unsigned int minor=0, unsigned int patchlevel=0 ) {\n    return (major<<16|minor<<8|patchlevel) <= static_cast<unsigned int>(QT_VERSION)\n\t|| _kdCheckQtVersion_impl( major, minor, patchlevel );\n}\n\n#define KDTOOLS_DECLARE_PRIVATE_BASE( Class )                        \\\nprotected:                                                           \\\n    class Private;                                                   \\\n    Private * d_func() { return _d; }                                \\\n    const Private * d_func() const { return _d; }                    \\\n    Class( Private * _d_, bool b ) : _d( _d_ ) { init(b); }          \\\nprivate:                                                             \\\n    void init(bool);                                                 \\\nprivate:                                                             \\\n    Private * _d\n\n#define KDTOOLS_DECLARE_PRIVATE_DERIVED( Class, Base )                  \\\nprotected:                                                              \\\n    class Private;                                                      \\\n    Private * d_func() {                                                \\\n        return reinterpret_cast<Private*>( Base::d_func() );            \\\n    }                                                                   \\\n    const Private * d_func() const {                                    \\\n        return reinterpret_cast<const Private*>( Base::d_func() );      \\\n    }                                                                   \\\n    Class( Private * _d_, bool b )                                      \\\n        : Base( reinterpret_cast<Base::Private*>(_d_), b ) { init(b); } \\\nprivate:                                                                \\\n    void init(bool)\n\n\n#endif /* __KDTOOLS_KDTOOLSGLOBAL_H__ */\n\n"
  },
  {
    "path": "archive/spotify/kdsingleapplicationguard/license-gpl",
    "content": "\n The KD Tools Library is Copyright (C) 2001-2003 Klarlvdalens Datakonsult AB.\n\n You may use, distribute and copy the KD Tools Library under the terms of\n GNU General Public License version 2, which is displayed below.\n\n-------------------------------------------------------------------------\n\n\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n                          675 Mass Ave, Cambridge, MA 02139, USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Library General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\f\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\f\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\f\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\f\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\f\n\tAppendix: How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) 19yy  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program; if not, write to the Free Software\n    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) 19yy name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Library General\nPublic License instead of this License.\n\n-------------------------------------------------------------------------\n"
  },
  {
    "path": "archive/spotify/kdsingleapplicationguard/pimpl_ptr.cpp",
    "content": "#include \"pimpl_ptr.h\"\n\n/*!\n  \\class pimpl_ptr:\n  \\ingroup core smartptr\n  \\brief Owning pointer for private implementations\n  \\since_c 2.1\n\n  (The exception safety of this class has not been evaluated yet.)\n\n  pimpl_ptr is a smart immutable pointer, which owns the contained object. Unlike other smart pointers,\n  it creates a standard constructed object when instanciated via the \n  \\link pimpl_ptr() standard constructor\\endlink.\n  Additionally, pimpl_ptr respects constness of the pointer object and returns \\c const \\c T* for\n  a const pimpl_ptr object.\n\n  The content of a pimpl_ptr cannot be changed during it's lifetime.\n\n  \\section general-use General Use\n\n  The general use case of pimpl_ptr is the \"Pimpl Idiom\", i.e. hiding the private implementation of a class\n  from the user's compiler which see \\c MyClass as\n\n  \\code\n  class MyClass\n  {\n  public:\n      MyClass();\n      ~MyClass();\n\n      // public class API\n      int value() const;\n\n  private:\n      class Private; // defined later\n      kdtools::pimpl_ptr< Private > d;\n  };\n  \\endcode\n\n  but not the private parts of it. These can only be seen (and accessed) by the code knowing \\c MyClass::Private:\n\n  \\code\n  class MyClass::Private\n  {\n  public:\n      int value;\n  };\n\n  MyClass::MyClass()\n  {\n      // d was automatically filled with new Private\n      d->value = 42;\n  }\n\n  MyClass::~MyClass()\n  {\n      // the content of d gets deleted automatically\n  }\n\n  int MyClass::value() const\n  {\n      // access the private part:\n      // since MyClass::value() is const, the returned pointee is const, too\n      return d->value;\n  }\n  \\endcode\n\n*/\n\n/*!\n  \\fn pimpl_ptr::pimpl_ptr()\n\n  Default constructor. Constructs a pimpl_tr that contains (owns) a standard constructed\n  instance of \\c T.\n\n  \\post \\c *this owns a new object.\n*/\n\n/*!\n  \\fn pimpl_ptr::pimpl_ptr( T * t )\n\n  Constructor. Constructs a pimpl_ptr that contains (owns) \\a t.\n\n  \\post get() == obj\n*/\n\n/*!\n  \\fn pimpl_ptr::~pimpl_ptr()\n\n  Destructor.\n\n  \\post The object previously owned by \\c *this has been deleted.\n*/\n\n/*!\n  \\fn const T * pimpl_ptr::get() const\n\n  \\returns a const pointer to the contained (owned) object.\n  \\overload\n*/\n\n/*!\n  \\fn T * pimpl_ptr::get()\n\n  \\returns a pointer to the contained (owned) object.\n*/\n\n/*!\n  \\fn const T & pimpl_ptr::operator*() const\n\n  Dereference operator. Returns \\link get() *get()\\endlink.\n  \\overload\n*/\n\n/*!\n  \\fn T & pimpl_ptr::operator*()\n\n  Dereference operator. Returns \\link get() *get()\\endlink.\n*/\n\n/*!\n  \\fn const T * pimpl_ptr::operator->() const\n\n  Member-by-pointer operator. Returns get().\n  \\overload\n*/\n\n/*!\n  \\fn T * pimpl_ptr::operator->() \n\n  Member-by-pointer operator. Returns get().\n*/\n\n#ifdef KDTOOLSCORE_UNITTESTS\n\n#include <kdunittest/test.h>\n\n#include <QObject>\n#include <QPointer>\n\nnamespace\n{\n    struct ConstTester\n    {\n        bool isConst()\n        {\n            return false;\n        }\n\n        bool isConst() const\n        {\n            return true;\n        }\n    };\n}\n\nKDAB_UNITTEST_SIMPLE( pimpl_ptr, \"kdcoretools\" ) {\n\n    {\n        kdtools::pimpl_ptr< QObject > p;\n        assertNotNull( p.get() );\n        assertNull( p->parent() );\n    }\n\n\n    {   \n        QPointer< QObject > o;\n        {\n            kdtools::pimpl_ptr< QObject > qobject( new QObject );\n            o = qobject.get();\n            assertEqual( o, qobject.operator->() );\n            assertEqual( o, &(qobject.operator*()) );\n        }\n        assertNull( o );\n    }\n\n    {   \n        const kdtools::pimpl_ptr< QObject > qobject( new QObject );\n        const QObject* o = qobject.get();\n        assertEqual( o, qobject.operator->() );\n        assertEqual( o, &(qobject.operator*()) );\n    }\n\n    {\n        kdtools::pimpl_ptr< QObject > o1;\n        assertTrue( o1 );\n        kdtools::pimpl_ptr< QObject > o2( 0 );\n        assertFalse( o2 );\n    }\n\n    {\n        const kdtools::pimpl_ptr< ConstTester > o1;\n        kdtools::pimpl_ptr< ConstTester > o2;\n        assertTrue( o1->isConst() );\n        assertFalse( o2->isConst() );\n        assertTrue( (*o1).isConst() );\n        assertFalse( (*o2).isConst() );\n        assertTrue( o1.get()->isConst() );\n        assertFalse( o2.get()->isConst() );\n    }\n}\n\n#endif // KDTOOLSCORE_UNITTESTS\n"
  },
  {
    "path": "archive/spotify/kdsingleapplicationguard/pimpl_ptr.h",
    "content": "#ifndef __KDTOOLSCORE__PIMPL_PTR_H__\n#define __KDTOOLSCORE__PIMPL_PTR_H__\n\n#include \"kdtoolsglobal.h\"\n\n#ifndef DOXYGEN_RUN\nnamespace kdtools {\n#endif\n\n    template <typename T>\n    class pimpl_ptr {\n        KDAB_DISABLE_COPY( pimpl_ptr );\n        T * d;\n    public:\n        pimpl_ptr() : d( new T ) {}\n        explicit pimpl_ptr( T * t ) : d( t ) {}\n        ~pimpl_ptr() { delete d; d = 0; }\n\n        T * get() { return d; }\n        const T * get() const { return d; }\n\n        T * operator->() { return get(); }\n        const T * operator->() const { return get(); }\n\n        T & operator*() { return *get(); }\n        const T & operator*() const { return *get(); }\n\n        KDAB_IMPLEMENT_SAFE_BOOL_OPERATOR( get() )\n    };\n\n    // these are not implemented, so's we can catch their use at\n    // link-time. Leaving them undeclared would open up a comparison\n    // via operator unspecified-bool-type().\n    template <typename T, typename S>\n    void operator==( const pimpl_ptr<T> &, const pimpl_ptr<S> & );\n    template <typename T, typename S>\n    void operator!=( const pimpl_ptr<T> &, const pimpl_ptr<S> & );\n\n#ifndef DOXYGEN_RUN\n} // namespace kdtools\n#endif\n\n#endif /* __KDTOOLSCORE__PIMPL_PTR_H__ */\n\n"
  },
  {
    "path": "archive/spotify/logger.cpp",
    "content": "/*\n    Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n\n#include \"logger.h\"\n\nLogger::Logger(QObject* parent)\n{\n\n}\n\nLogger::~QObject()\n{\n\n}\n\n"
  },
  {
    "path": "archive/spotify/logger.h",
    "content": "/*\n    Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n\n#ifndef LOGGER_H\n#define LOGGER_H\n\n#include <QObject>\n\n\nclass Logger : public QObject\n{\n\npublic:\n    explicit Logger(QObject* parent = 0);\n    virtual ~Logger();\n};\n\n#endif // LOGGER_H\n"
  },
  {
    "path": "archive/spotify/main.cpp",
    "content": "/*\n    Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n#include <QtCore/QCoreApplication>\n#include <QtCore/QDir>\n\n#include \"spotifysession.h\"\n#include \"main.h\"\n#include \"spotifyresolver.h\"\n#ifdef WITH_BREAKPAD\n    #include \"BreakPad.h\"\n#endif\n//#include \"appkey.h\"\n\nint main(int argc, char *argv[])\n{\n\n    /** Example **/\n    /*\n      See main.h\n    */\n\n    SpotifyResolver app( argc, argv );\n#ifdef WITH_BREAKPAD    \n    new BreakPad( QDir::tempPath(), true );\n#endif\n\n    KDSingleApplicationGuard guard( KDSingleApplicationGuard::NoPolicy );\n    QObject::connect( &guard, SIGNAL( instanceStarted( KDSingleApplicationGuard::Instance ) ), &app, SLOT( instanceStarted( KDSingleApplicationGuard::Instance )  ) );\n\n#ifdef Q_OS_WIN\n\tQTimer::singleShot( 500, &app, SLOT( setup() ) );\n#else\n    app.setup();\n#endif\n\n    return app.exec();\n\n}\n"
  },
  {
    "path": "archive/spotify/main.h",
    "content": "/**  This file is part of QT SpotifyWebApi - <hugolm84@gmail.com> ===\n *\n *   Copyright 2011-2012,Hugo Lindström <hugolm84@gmail.com>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n\n#ifndef MAIN_H\n#define MAIN_H\n\n#include <libspotify/api.h>\n#include \"appkey.h\"\n\n/** EXAMPLE **/\n/*\n    QCoreApplication a(argc, argv);\n\n    //  Sometimes location causes errors, so if your not able\n    //  to login, change the location or rm the dirs + trace\n\n    sessionConfig config;\n    config.cache_location = \"/tmp\";\n    config.settings_location = \"/tmp\";\n    config.g_app_key = g_appkey;\n    config.application_key_size = g_appkey_size;\n    config.user_agent = \"spotifyApi\";\n    config.tracefile = \"/tmp/trace.dat\";\n    config.device_id = \"spotifyApi\";\n\n\n    SpotifySession *Spotify = new SpotifySession(config);\n    Spotify->login( \"\", \"\", \"\");\n\n   return a.exec();*/\n\n/** END EXAMPLE **/\n\n#endif // MAIN_H\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/CMakeLists.txt",
    "content": "PROJECT(libqxtweb-standalone)\nCMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)\nSET(CMAKE_VERBOSE_MAKEFILE ON)\nSET(CMAKE_INSTALL_PREFIX \".\")\n\nIF( ${CMAKE_VERSION} VERSION_GREATER 2.8.3 )\n  CMAKE_POLICY(SET CMP0017 NEW)\nENDIF( ${CMAKE_VERSION} VERSION_GREATER 2.8.3 )\n\nFIND_PACKAGE( Qt4 4.6.0 COMPONENTS QtCore QtNetwork REQUIRED )\nset(QT_USE_QTNETWORK TRUE)\ninclude( ${QT_USE_FILE} )\n\nSET(qxtweb \"qxtweb\")\n\nADD_DEFINITIONS(-Wall -O2 -DNDEBUG)\nIF(NOT WIN32)\n\tADD_DEFINITIONS(-fPIC)\nENDIF()\nADD_DEFINITIONS( -DBUILD_QXT_CORE -DBUILD_QXT_WEB )\n\n\nINCLUDE_DIRECTORIES( ${qxtweb} )\n\n\nSET( sources\n        # QxtWeb:\n        ${qxtweb}/qxtabstracthttpconnector.cpp\n        ${qxtweb}/qxtabstractwebservice.cpp\n        ${qxtweb}/qxtabstractwebsessionmanager.cpp\n        ${qxtweb}/qxthtmltemplate.cpp\n        ${qxtweb}/qxthttpserverconnector.cpp\n        ${qxtweb}/qxthttpsessionmanager.cpp\n        ${qxtweb}/qxtscgiserverconnector.cpp\n        ${qxtweb}/qxtwebcontent.cpp\n        ${qxtweb}/qxtwebevent.cpp\n        ${qxtweb}/qxtwebservicedirectory.cpp\n        ${qxtweb}/qxtwebslotservice.cpp\n        ${qxtweb}/qxtwebcgiservice.cpp\n\n        # Ripped bits of QxtCore:\n        ${qxtweb}/qxtmetaobject.cpp\n        ${qxtweb}/qxtnull.cpp\n)\n\nSET( headers\n        # QxtWeb:\n        ${qxtweb}/qxtabstracthttpconnector.h\n        ${qxtweb}/qxtabstractwebservice.h\n        ${qxtweb}/qxtabstractwebsessionmanager.h\n        ${qxtweb}/qxtabstractwebsessionmanager_p.h\n#        ${qxtweb}/qxthtmltemplate.h\n        ${qxtweb}/qxthttpsessionmanager.h\n#        ${qxtweb}/qxtweb.h\n        ${qxtweb}/qxtwebcontent.h\n#        ${qxtweb}/qxtwebevent.h\n        ${qxtweb}/qxtwebservicedirectory.h\n        ${qxtweb}/qxtwebservicedirectory_p.h\n        ${qxtweb}/qxtwebslotservice.h\n        ${qxtweb}/qxtwebcgiservice.h\n        ${qxtweb}/qxtwebcgiservice_p.h\n\n        # Ripped bits of QxtCore:\n#        ${qxtweb}/qxtmetaobject.h\n#        ${qxtweb}/qxtnullable.h\n#        ${qxtweb}/qxtnull.h\n        ${qxtweb}/qxtboundfunction.h\n#        ${qxtweb}/qxtboundfunctionbase.h\n#        ${qxtweb}/qxtboundcfunction.h\n#        ${qxtweb}/qxtmetatype.h\n)\n\nqt4_wrap_cpp( mocstuff ${headers} )\n\n# DLL on windows due to linker issues, otherwise static\nIF(WIN32)\n\tADD_LIBRARY(qxtweb-standalone SHARED\n\t\t\t${mocstuff}\n\t\t\t${headers}\n\t\t\t${sources}\n\t)\nELSE()\n\tADD_LIBRARY(qxtweb-standalone STATIC\n\t\t\t${mocstuff}\n\t\t\t${headers}\n\t\t\t${sources}\n\t)\nENDIF()\n\n\ntarget_link_libraries( qxtweb-standalone\n\t    ${QT_LIBRARIES}\n)\n\n# Also build small example app from qxt demos:\n\n#qt4_wrap_cpp( mocex \"example/myservice.h\" )\n\n#ADD_EXECUTABLE( example-webserver\n#    ${mocex}\n#    example/main.cpp\n#    example/myservice.h\n#    )\n\n#TARGET_LINK_LIBRARIES( example-webserver\n#    ${QT_LIBRARIES}\n#    \"${CMAKE_CURRENT_SOURCE_DIR}/libqxtweb-standalone.a\"\n#    )\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/README.txt",
    "content": "QxtWeb from libqxt.org project, standalone and cmakeified. For embeddable webserver\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtAbstractHttpConnector",
    "content": "#include \"qxtabstracthttpconnector.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtAbstractWebService",
    "content": "#include \"qxtabstractwebservice.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtAbstractWebSessionManager",
    "content": "#include \"qxtabstractwebsessionmanager.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtHtmlTemplate",
    "content": "#include \"qxthtmltemplate.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtHttpServerConnector",
    "content": "#include \"qxtabstracthttpconnector.h\"\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtHttpSessionManager",
    "content": "#include \"qxthttpsessionmanager.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtMail",
    "content": "#include \"qxtmail.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtScgiServerConnector",
    "content": "#include \"qxtabstracthttpconnector.h\"\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtSendmail",
    "content": "#include \"qxtsendmail.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtWeb",
    "content": "#include \"qxtweb.h\"\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtWebCgiService",
    "content": "#include \"qxtwebcgiservice.h\"\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtWebContent",
    "content": "#include \"qxtwebcontent.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtWebErrorEvent",
    "content": "#include \"qxtwebevent.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtWebEvent",
    "content": "#include \"qxtwebevent.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtWebFileUploadEvent",
    "content": "#include \"qxtwebevent.h\"\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtWebPageEvent",
    "content": "#include \"qxtwebevent.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtWebRedirectEvent",
    "content": "#include \"qxtwebevent.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtWebRemoveCookieEvent",
    "content": "#include \"qxtwebevent.h\"\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtWebRequestEvent",
    "content": "#include \"qxtwebevent.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtWebServiceDirectory",
    "content": "#include \"qxtwebservicedirectory.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtWebSlotService",
    "content": "#include \"qxtwebslotservice.h\"\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/QxtWebStoreCookieEvent",
    "content": "#include \"qxtwebevent.h\"\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtabstracthttpconnector.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n/*!\n\\class QxtAbstractHttpConnector\n\n\\inmodule QxtWeb\n\n\\brief The QxtAbstractHttpConnector class is a base class for defining\nHTTP-based protocols for use with QxtHttpSessionManager\n\nQxtHttpSessionManager does the work of managing sessions and state for the\notherwise stateless HTTP protocol, but it relies on QxtAbstractHttpConnector\nsubclasses to implement the protocol used to communicate with the web server.\n\nSubclasses are responsible for accepting new connections (by implementing\nlisten(const QHostAddress&, quint16) and invoking addConnection(QIODevice*)),\nfor informing the session manager when request headers are available (by\nimplementing canParseRequest(const QByteArray&)), for parsing the request\nheaders (by implementing parseRequest(QByteArray&)), and for writing response\nheaders (by implementing writeHeaders(QIODevice*, const QHttpResponseHeader&)).\n\n\\sa QxtHttpSessionManager\n*/\n\n#include \"qxthttpsessionmanager.h\"\n#include \"qxtwebcontent.h\"\n#include <QReadWriteLock>\n#include <QHash>\n#include <QIODevice>\n#include <QByteArray>\n\n#ifndef QXT_DOXYGEN_RUN\nclass QxtAbstractHttpConnectorPrivate : public QxtPrivate<QxtAbstractHttpConnector>\n{\npublic:\n    QxtHttpSessionManager* manager;\n    QReadWriteLock bufferLock, requestLock;\n    QHash<QIODevice*, QByteArray> buffers;  // connection->buffer\n    QHash<quint32, QIODevice*> requests;    // requestID->connection\n    QHash<quint32, QSharedPointer<QIODevice> > dataSources; // iodevices providing result data\n    quint32 nextRequestID;\n\n    inline quint32 getNextRequestID(QIODevice* connection)\n    {\n        QWriteLocker locker(&requestLock);\n        do\n        {\n            nextRequestID++;\n            if (nextRequestID == 0xFFFFFFFF) nextRequestID = 1;\n        }\n        while (requests.contains(nextRequestID)); // yeah, right\n        requests[nextRequestID] = connection;\n        return nextRequestID;\n    }\n\n    inline void doneWithRequest(quint32 requestID)\n    {\n        QWriteLocker locker(&requestLock);\n        requests.remove(requestID);\n\n        if( dataSources.contains( requestID ) ) {\n            QSharedPointer<QIODevice> p = dataSources[ requestID ];\n            if( !p.isNull() )\n\t\t\t\tQMetaObject::invokeMethod( p.data(), \"disconnected\", Qt::DirectConnection );\n        }\n        dataSources.remove(requestID);\n    }\n\n    inline QIODevice* getRequestConnection(quint32 requestID)\n    {\n        QReadLocker locker(&requestLock);\n        return requests[requestID];\n    }\n\n    inline void setRequestDataSource( quint32 requestID, QSharedPointer<QIODevice>& dataSource )\n    {\n        QWriteLocker locker(&requestLock);\n        dataSources.insert( requestID, dataSource );\n    }\n\n    inline QSharedPointer<QIODevice>& getRequestDataSource(quint32 requestID)\n    {\n        QReadLocker locker(&requestLock);\n        return dataSources[requestID];\n    }\n};\n#endif\n\n/*!\n * Creates a QxtAbstractHttpConnector with the specified \\a parent.\n *\n * Note that this is an abstract class and cannot be instantiated directly.\n */\nQxtAbstractHttpConnector::QxtAbstractHttpConnector(QObject* parent) : QObject(parent)\n{\n    QXT_INIT_PRIVATE(QxtAbstractHttpConnector);\n    qxt_d().nextRequestID = 0;\n}\n\n/*!\n * \\internal\n */\nvoid QxtAbstractHttpConnector::setSessionManager(QxtHttpSessionManager* manager)\n{\n    qxt_d().manager = manager;\n}\n\n/*!\n * Returns the session manager into which the connector is installed.\n *\n * \\sa QxtHttpSessionManager::setConnector\n */\nQxtHttpSessionManager* QxtAbstractHttpConnector::sessionManager() const\n{\n    return qxt_d().manager;\n}\n\n/*!\n * \\internal\n * Returns the QIODevice associated with a \\a requestID.\n *\n * The request ID is generated internally and used by the session manager.\n */\nQIODevice* QxtAbstractHttpConnector::getRequestConnection(quint32 requestID)\n{\n    return qxt_d().getRequestConnection(requestID);\n}\n\nvoid QxtAbstractHttpConnector::setRequestDataSource( quint32 requestID, QSharedPointer<QIODevice>& dataSource )\n{\n    qxt_d().setRequestDataSource( requestID, dataSource );\n}\n\nQSharedPointer<QIODevice>& QxtAbstractHttpConnector::getRequestDataSource(quint32 requestID)\n{\n    return qxt_d().getRequestDataSource( requestID );\n}\n\nvoid QxtAbstractHttpConnector::doneWithRequest(quint32 requestID)\n{\n    qxt_d().doneWithRequest( requestID );\n}\n\n/*!\n * Starts managing a new connection from \\a device.\n *\n * This function should be invoked by a subclass to attach incoming connections\n * to the session manager.\n */\nvoid QxtAbstractHttpConnector::addConnection(QIODevice* device)\n{\n    QWriteLocker locker(&qxt_d().bufferLock);\n    qxt_d().buffers[device] = QByteArray();\n    QObject::connect(device, SIGNAL(readyRead()), this, SLOT(incomingData()));\n    QObject::connect(device, SIGNAL(aboutToClose()), this, SLOT(disconnected()));\n    QObject::connect(device, SIGNAL(disconnected()), this, SLOT(disconnected()));\n    QObject::connect(device, SIGNAL(destroyed()), this, SLOT(disconnected()));\n}\n\n/*!\n * \\internal\n */\nvoid QxtAbstractHttpConnector::incomingData(QIODevice* device)\n{\n    if (!device)\n    {\n        device = qobject_cast<QIODevice*>(sender());\n        if (!device) return;\n    }\n    QReadLocker locker(&qxt_d().bufferLock);\n    QByteArray& buffer = qxt_d().buffers[device];\n    buffer.append(device->readAll());\n    if (!canParseRequest(buffer)) return;\n    QHttpRequestHeader header = parseRequest(buffer);\n    QxtWebContent* content = 0;\n    QByteArray start;\n    if (header.contentLength() > 0)\n    {\n        start = buffer.left(header.value(\"content-length\").toInt());\n        buffer = buffer.mid(header.value(\"content-length\").toInt());\n        content = new QxtWebContent(header.contentLength(), start, device);\n    }\n    else if (header.hasKey(\"connection\") && header.value(\"connection\").toLower() == \"close\")\n    {\n        start = buffer;\n        buffer.clear();\n        content = new QxtWebContent(header.contentLength(), start, device);\n    } // else no content\n    quint32 requestID = qxt_d().getNextRequestID(device);\n    sessionManager()->incomingRequest(requestID, header, content);\n}\n\n/*!\n * \\internal\n */\nvoid QxtAbstractHttpConnector::disconnected()\n{\n    QIODevice* device = qobject_cast<QIODevice*>(sender());\n    if (!device) return;\n    QWriteLocker locker(&qxt_d().bufferLock);\n    qxt_d().buffers.remove(device);\n    sessionManager()->disconnected(device);\n}\n\n/*!\n * \\fn virtual bool QxtAbstractHttpConnector::listen(const QHostAddress& interface, quint16 port)\n * Invoked by the session manager to indicate that the connector should listen\n * for incoming connections on the specified \\a interface and \\a port.\n *\n * If the interface is QHostAddress::Any, the server will listen on all network interfaces.\n *\n * Returns true on success, or false if the server could not begin listening.\n *\n * \\sa addConnection(QIODevice*)\n */\n\n/*!\n * \\fn virtual bool QxtAbstractHttpConnector::canParseRequest(const QByteArray& buffer)\n * Returns true if a complete set of request headers can be extracted from the provided \\a buffer.\n */\n\n/*!\n * \\fn virtual QHttpRequestHeader QxtAbstractHttpConnector::parseRequest(QByteArray& buffer)\n * Extracts a set of request headers from the provided \\a buffer.\n *\n * Subclasses implementing this function must be sure to remove the parsed data from the buffer.\n */\n\n/*!\n * \\fn virtual void QxtAbstractHttpConnector::writeHeaders(QIODevice* device, const QHttpResponseHeader& header)\n * Writes a the response \\a header to the specified \\a device.\n */\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtabstracthttpconnector.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTABSTRACTHTTPCONNECTOR_H\n#define QXTABSTRACTHTTPCONNECTOR_H\n\n#include \"qxtglobal.h\"\n#include <QObject>\n#include <QHostAddress>\n#include <QHttpHeader>\n#include <QSharedPointer>\n\nQT_FORWARD_DECLARE_CLASS(QIODevice)\nclass QxtHttpSessionManager;\n\nclass QxtAbstractHttpConnectorPrivate;\nclass QXT_WEB_EXPORT QxtAbstractHttpConnector : public QObject\n{\n    friend class QxtHttpSessionManager;\n    Q_OBJECT\npublic:\n    QxtAbstractHttpConnector(QObject* parent = 0);\n    virtual bool listen(const QHostAddress& iface, quint16 port) = 0;\n\nprotected:\n    QxtHttpSessionManager* sessionManager() const;\n\n    void addConnection(QIODevice* device);\n    QIODevice* getRequestConnection(quint32 requestID);\n    void setRequestDataSource( quint32 requestID, QSharedPointer<QIODevice>& dataSource );\n    QSharedPointer<QIODevice>& getRequestDataSource(quint32 requestID);\n    void doneWithRequest(quint32 requestID);\n    virtual bool canParseRequest(const QByteArray& buffer) = 0;\n    virtual QHttpRequestHeader parseRequest(QByteArray& buffer) = 0;\n    virtual void writeHeaders(QIODevice* device, const QHttpResponseHeader& header) = 0;\n\nprivate Q_SLOTS:\n    void incomingData(QIODevice* device = 0);\n    void disconnected();\n\nprivate:\n    void setSessionManager(QxtHttpSessionManager* manager);\n    QXT_DECLARE_PRIVATE(QxtAbstractHttpConnector)\n};\n\nclass QxtHttpServerConnectorPrivate;\nclass QXT_WEB_EXPORT QxtHttpServerConnector : public QxtAbstractHttpConnector\n{\n    Q_OBJECT\npublic:\n    QxtHttpServerConnector(QObject* parent = 0);\n    virtual bool listen(const QHostAddress& iface, quint16 port);\n\nprotected:\n    virtual bool canParseRequest(const QByteArray& buffer);\n    virtual QHttpRequestHeader parseRequest(QByteArray& buffer);\n    virtual void writeHeaders(QIODevice* device, const QHttpResponseHeader& header);\n\nprivate Q_SLOTS:\n    void acceptConnection();\n\nprivate:\n    QXT_DECLARE_PRIVATE(QxtHttpServerConnector)\n};\n\nclass QxtScgiServerConnectorPrivate;\nclass QXT_WEB_EXPORT QxtScgiServerConnector : public QxtAbstractHttpConnector\n{\n    Q_OBJECT\npublic:\n    QxtScgiServerConnector(QObject* parent = 0);\n    virtual bool listen(const QHostAddress& iface, quint16 port);\n\nprotected:\n    virtual bool canParseRequest(const QByteArray& buffer);\n    virtual QHttpRequestHeader parseRequest(QByteArray& buffer);\n    virtual void writeHeaders(QIODevice* device, const QHttpResponseHeader& header);\n\nprivate Q_SLOTS:\n    void acceptConnection();\n\nprivate:\n    QXT_DECLARE_PRIVATE(QxtScgiServerConnector)\n};\n/* Commented out pending implementation\n\nclass QxtFcgiConnectorPrivate;\nclass QXT_WEB_EXPORT QxtFcgiConnector : public QxtAbstractHttpConnector {\nQ_OBJECT\npublic:\n    QxtFcgiConnector(QObject* parent = 0);\n    virtual bool listen(const QHostAddress& iface, quint16 port);\n\nprivate:\n    QXT_DECLARE_PRIVATE(QxtFcgiConnector)\n};\n*/\n\n#endif // QXTABSTRACTHTTPCONNECTOR_H\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebservice.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n/*!\n\\class QxtAbstractWebService\n\n\\inmodule QxtWeb\n\n\\brief The QxtAbstractWebService class is a base interface for web services\n\nQxtAbstractWebService provides a common interface for all web service classes.\nIt uses an event-driven design instead of the more traditional request-response\ndesign used by many web scripting languages. When the user requests a web\npage, the service receives a pageRequestedEvent; after the service assembles\nthe response, it must post a QxtWebPageEvent (or a subclass, such as\nQxtWebRedirectEvent or QxtWebErrorEvent).\n\nUsually, an application providing web services will instantiate one\nQxtAbstractWebService object for each session, but this is not a requirement.\nFor services that do not require session management, such as those that serve\nonly static content, the session factory may return the same pointer for\nevery invocation, or it may use some more exotic scheme.\n\nWhen using one service object per session, each service's data members are\nindependent and may be used to track state across requests. A service object\nshared among multiple sessions will retain state across requests as well but\nit must implement its own mechanism for separating non-shared data.\n\nThe QxtWeb architecture is not multithreaded; that is, QxtAbstractWebService\ndoes not automatically spawn a process for every session. However,\nQxtAbstractWebSessionManager performs thread-safe event dispatching, so\nsubclasses of QxtAbstractWebService are free to create threads themselves.\n\nA web service object may delete itself (see QObject::deleteLater()) to end\nthe associated session.\n\n\\sa QxtAbstractWebSessionManager::ServiceFactory\n*/\n\n/*\n * TODO:\n * The current architecture only allows for two behaviors: creating a new session\n * for every connection without a session cookie, or not using sessions at all.\n * This needs to be fixed by adding a function to the session manager to explicitly\n * create a new session.\n */\n\n#include \"qxtabstractwebservice.h\"\n\n#ifndef QXT_DOXYGEN_RUN\nclass QxtAbstractWebServicePrivate : public QxtPrivate<QxtAbstractWebService>\n{\npublic:\n    QXT_DECLARE_PUBLIC(QxtAbstractWebService)\n    QxtAbstractWebServicePrivate() {}\n\n    QxtAbstractWebSessionManager* manager;\n};\n#endif\n\n/*!\n * Creates a QxtAbstractWebService with the specified \\a parent and session \\a manager.\n *\n * Often, the session manager will also be the parent, but this is not a requirement.\n *\n * Note that this is an abstract class and cannot be instantiated directly.\n */\nQxtAbstractWebService::QxtAbstractWebService(QxtAbstractWebSessionManager* manager, QObject* parent) : QObject(parent)\n{\n    QXT_INIT_PRIVATE(QxtAbstractWebService);\n    qxt_d().manager = manager;\n}\n\n/*!\n * Returns the session manager associated with the web service.\n */\nQxtAbstractWebSessionManager* QxtAbstractWebService::sessionManager() const\n{\n    return qxt_d().manager;\n}\n\n/*!\n * \\fn void QxtAbstractWebService::postEvent(QxtWebEvent* event)\n * Posts an \\a event to a web browser that has made a request to the service.\n */\n\n/*!\n * \\fn virtual void QxtAbstractWebService::pageRequestedEvent(QxtWebRequestEvent* event)\n * This \\a event handler must be reimplemented in subclasses to receive page\n * request events.\n *\n * Every page request event received MUST be responded to with a QxtWebPageEvent\n * or a QxtWebPageEvent subclass. This response does not have to be posted\n * during the execution of this function, to support asynchronous design, but\n * failure to post an event will cause the web browser making the request to\n * wait until it times out.\n *\n * \\sa QxtWebRequestEvent\n */\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebservice.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTABSTRACTWEBSERVICE_H\n#define QXTABSTRACTWEBSERVICE_H\n\n#include <QObject>\n#include \"qxtabstractwebsessionmanager.h\"\nclass QxtWebEvent;\nclass QxtWebRequestEvent;\n\nclass QxtAbstractWebServicePrivate;\nclass QXT_WEB_EXPORT QxtAbstractWebService : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit QxtAbstractWebService(QxtAbstractWebSessionManager* manager, QObject* parent = 0);\n\n    QxtAbstractWebSessionManager* sessionManager() const;\n    inline void postEvent(QxtWebEvent* event)\n    {\n        sessionManager()->postEvent(event);\n    }\n    virtual void pageRequestedEvent(QxtWebRequestEvent* event) = 0;\n    // virtual void functionInvokedEvent(QxtWebRequestEvent* event) = 0; // todo: implement\n\nprivate:\n    QXT_DECLARE_PRIVATE(QxtAbstractWebService)\n};\n\n#endif // QXTABSTRACTWEBSERVICE_H\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n/*!\n\\class QxtAbstractWebSessionManager\n\n\\inmodule QxtWeb\n\n\\brief The QxtAbstractWebSessionManager class is a base class for QxtWeb session managers\n\nQxtAbstractWebSessionManager is the base class for all QxtWeb session managers.\n\nSession managers are responsible for managing connections between web browsers\nand web services, for creating sessions and their corresponding service objects,\nand for managing and dispatching events between browsers and services.\n\nNote that the session manager is not responsible for destroying service objects.\nA service object that wishes to end its corresponding session may destroy itself\n(see QObject::deleteLater()) and QxtAbstractWebSessionManager will automatically\nclean up its internal session tracking data.\n\n\\sa QxtAbstractWebService\n*/\n\n/*!\n * \\typedef QxtAbstractWebSessionManager::ServiceFactory\n * \\brief Pointer to a function that generates QxtAbstractWebService objects\n *\n * \\bold TYPEDEF: The ServiceFactory type represents a pointer to a function that takes two\n * parameters -- a QxtAbstractWebSessionManager* pointer and an int session ID.\n * The function must return a QxtAbstractWebService* pointer.\n *\n * Usually, an application providing web services will instantiate one\n * QxtAbstractWebService object for each session. For services that do not\n * require session management, such as those that serve only static pages, a\n * single service object may be shared for all requests, or it may use some\n * more exotic scheme. See QxtAbstractWebService for more details.\n */\n\n#include \"qxtabstractwebsessionmanager.h\"\n#include \"qxtabstractwebsessionmanager_p.h\"\n#include \"qxtabstractwebservice.h\"\n#include \"qxtmetaobject.h\"\n#include <QtDebug>\n\n#ifndef QXT_DOXYGEN_RUN\nQxtAbstractWebSessionManagerPrivate::QxtAbstractWebSessionManagerPrivate() : factory(0), maxID(1)\n{\n    // initializers only\n}\n\nvoid QxtAbstractWebSessionManagerPrivate::sessionDestroyed(int sessionID)\n{\n    if (sessions.contains(sessionID))\n    {\n        freeList.enqueue(sessionID);\n        sessions.remove(sessionID);\n    }\n}\n\nint QxtAbstractWebSessionManagerPrivate::getNextID()\n{\n    if (freeList.empty())\n    {\n        int next = maxID;\n        maxID++;\n        return next;\n    }\n    return freeList.dequeue();\n}\n#endif\n\n/*!\n * Creates a QxtAbstractWebSessionManager with the specified \\a parent.\n *\n * Note that this is an abstract class and cannot be instantiated directly.\n */\nQxtAbstractWebSessionManager::QxtAbstractWebSessionManager(QObject* parent) : QObject(parent)\n{\n    QXT_INIT_PRIVATE(QxtAbstractWebSessionManager);\n}\n\n/*!\n * Sets the service \\a factory for the session manager.\n *\n * The service factory is invoked every time the session manager creates a new\n * session. Usually, an application providing web services will instantiate one\n * QxtAbstractWebService object for each session. For services that do not\n * require separate sessions, such as those that serve only static pages, the\n * factory may return a pointer to the same object for multiple requests.\n *\n * \\sa QxtAbstractWebSessionManager::ServiceFactory\n */\nvoid QxtAbstractWebSessionManager::setServiceFactory(ServiceFactory* factory)\n{\n    qxt_d().factory = factory;\n}\n\n/*!\n * Returns the service factory in use by the session manager.\n *\n * \\sa setServiceFactory(ServiceFactory*)\n */\nQxtAbstractWebSessionManager::ServiceFactory* QxtAbstractWebSessionManager::serviceFactory() const\n{\n    return qxt_d().factory;\n}\n\n/*!\n * Returns the service object corresponding to the provided \\a sessionID.\n */\nQxtAbstractWebService* QxtAbstractWebSessionManager::session(int sessionID) const\n{\n    if (qxt_d().sessions.contains(sessionID))\n        return qxt_d().sessions[sessionID];\n    return 0;\n}\n\n/*!\n * Creates a new session and returns its session ID.\n *\n * This function uses the serviceFactory() to request an instance of the web service.\n * \\sa serviceFactory()\n */\nint QxtAbstractWebSessionManager::createService()\n{\n    int sessionID = qxt_d().getNextID();\n    if (!qxt_d().factory) return sessionID;\n\n    QxtAbstractWebService* service = serviceFactory()(this, sessionID);\n    qxt_d().sessions[sessionID] = service;\n    // Using QxtBoundFunction to bind the sessionID to the slot invocation\n    QxtMetaObject::connect(service, SIGNAL(destroyed()), QxtMetaObject::bind(&qxt_d(), SLOT(sessionDestroyed(int)), Q_ARG(int, sessionID)), Qt::QueuedConnection);\n    return sessionID; // you can always get the service with this\n}\n\n/*!\n * \\fn virtual bool QxtAbstractWebSessionManager::start()\n * Starts the session manager.\n *\n * Session managers should not create sessions before start() is invoked.\n * Subclasses are encouraged to refrain from accepting connections until the\n * session manager is started.\n */\n\n/*!\n * \\fn virtual void QxtAbstractWebSessionManager::postEvent(QxtWebEvent* event)\n * Adds the event to the event queue for its associated session.\n *\n * Since different protocols may require different event processing behavior,\n * there is no default implementation in QxtAbstractWebSessionManager. Subclasses\n * are responsible for maintaining event queues and deciding when and where to\n * dispatch events.\n *\n * Depending on the subclass's implementation posted events may not be dispatched\n * for some time, and is is possible that an event may never be dispatched if\n * the session is terminated before the event is handled.\n *\n * \\sa QxtWebEvent\n */\n\n/*!\n * \\fn virtual void QxtAbstractWebSessionManager::processEvents()\n * Processes pending events for all sessions.\n *\n * Since different protocols may require different event processing behavior,\n * there is no default implementation in QxtAbstractWebSessionManager. Subclasses\n * are responsible for maintaining event queues and deciding when and where to\n * dispatch events.\n *\n * processEvents() is not required to dispatch all events immediately. In\n * particular, some events may require certain conditions to be met before\n * they may be fully processed. (For example, because HTTP cookies are sent\n * as response headers, QxtHttpServerConnector may not dispatch a\n * QxtWebStoreCookieEvent until a QxtWebPageEvent for the same session is\n * available.) Unprocessed events may remain in the event queue.\n *\n * \\sa QxtWebEvent\n */\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTABSTRACTWEBSESSIONMANAGER_H\n#define QXTABSTRACTWEBSESSIONMANAGER_H\n\n#include <QObject>\n#include <qxtglobal.h>\nclass QxtAbstractWebService;\nclass QxtWebEvent;\n\nclass QxtAbstractWebSessionManagerPrivate;\nclass QXT_WEB_EXPORT QxtAbstractWebSessionManager : public QObject\n{\n    Q_OBJECT\npublic:\n    typedef QxtAbstractWebService* ServiceFactory(QxtAbstractWebSessionManager*, int);\n\n    QxtAbstractWebSessionManager(QObject* parent = 0);\n\n    virtual bool start() = 0;\n    virtual void postEvent(QxtWebEvent* event) = 0;\n    void setServiceFactory(ServiceFactory* factory);\n    ServiceFactory* serviceFactory() const;\n\n    QxtAbstractWebService* session(int sessionID) const;\n\nprotected:\n    int createService();\n\nprotected Q_SLOTS:\n    virtual void processEvents() = 0;\n\nprivate:\n    QXT_DECLARE_PRIVATE(QxtAbstractWebSessionManager)\n};\n\n#endif // QXTABSTRACTWEBSESSIONMANAGER_H\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager_p.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTABSTRACTWEBSESSIONMANAGER_P_H\n#define QXTABSTRACTWEBSESSIONMANAGER_P_H\n\n#include <QObject>\n#include <QPointer>\n#include <QHash>\n#include <QQueue>\n#include \"qxtabstractwebsessionmanager.h\"\n\n#ifndef QXT_DOXYGEN_RUN\nclass QxtAbstractWebSessionManagerPrivate : public QObject, public QxtPrivate<QxtAbstractWebSessionManager>\n{\n    Q_OBJECT\npublic:\n    QxtAbstractWebSessionManagerPrivate();\n    QXT_DECLARE_PUBLIC(QxtAbstractWebSessionManager)\n\n    QxtAbstractWebSessionManager::ServiceFactory* factory;\n    QHash<int, QxtAbstractWebService*> sessions;\n    QQueue<int> freeList;\n    int maxID;\n\n    int getNextID();\n\npublic Q_SLOTS:\n    void sessionDestroyed(int sessionID);\n};\n#endif // QXT_DOXYGEN_RUN\n\n#endif // QXTABSTRACTWEBSESSIONMANAGER_P_H\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtboundcfunction.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtCore module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTBOUNDCFUNCTION_H\n#define QXTBOUNDCFUNCTION_H\n\n#include <qxtboundfunctionbase.h>\n#include <qxtmetatype.h>\n#include <qxtglobal.h>\n#include <QtDebug>\n\n#ifndef QXT_DOXYGEN_RUN\n\n#define QXT_RETURN(fp) *reinterpret_cast<RETURN*>(returnValue.data()) = (*reinterpret_cast<FUNCTION>(fp))\n#define QXT_INVOKE(fp) (*reinterpret_cast<FUNCTION>(fp))\n#define QXT_PARAM(i) *reinterpret_cast<T ## i *>(p ## i .data())\n\ntemplate < typename RETURN, typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void,\ntypename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void, typename T10 = void >\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction_return : public QxtGenericFunctionPointer\n{\npublic:\n    typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);\n    bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7), QXT_PARAM(8), QXT_PARAM(9), QXT_PARAM(10));\n        return true;\n    }\nprivate:\n    qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename RETURN>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, void, void, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef RETURN(*FUNCTION)();\n    bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_RETURN(funcPtr)();\n        return true;\n    }\nprivate:\n    qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename RETURN, typename T1>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, void, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef RETURN(*FUNCTION)(T1);\n    bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_RETURN(funcPtr)(QXT_PARAM(1));\n        return true;\n    }\nprivate:\n    qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename RETURN, typename T1, typename T2>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef RETURN(*FUNCTION)(T1, T2);\n    bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2));\n        return true;\n    }\nprivate:\n    qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename RETURN, typename T1, typename T2, typename T3>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef RETURN(*FUNCTION)(T1, T2, T3);\n    bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3));\n        return true;\n    }\nprivate:\n    qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename RETURN, typename T1, typename T2, typename T3, typename T4>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, T4, void, void, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef RETURN(*FUNCTION)(T1, T2, T3, T4);\n    bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4));\n        return true;\n    }\nprivate:\n    qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, void, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5);\n    bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5));\n        return true;\n    }\nprivate:\n    qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6);\n    bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6));\n        return true;\n    }\nprivate:\n    qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7);\n    bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7));\n        return true;\n    }\n};\n\ntemplate <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8);\n    bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7), QXT_PARAM(8));\n        return true;\n    }\nprivate:\n    qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef RETURN(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9);\n    bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_RETURN(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7), QXT_PARAM(8), QXT_PARAM(9));\n        return true;\n    }\nprivate:\n    qxt_cfunction_return(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate < typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void,\ntypename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void, typename T10 = void >\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction : public QxtGenericFunctionPointer\n{\npublic:\n    typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);\n    bool invoke(QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7), QXT_PARAM(8), QXT_PARAM(9), QXT_PARAM(10));\n        return true;\n    }\nprivate:\n    qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction<void, void, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef void(*FUNCTION)();\n    bool invoke(QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_INVOKE(funcPtr)();\n        return true;\n    }\nprivate:\n    qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename T1>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, void, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef void(*FUNCTION)(T1);\n    bool invoke(QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_INVOKE(funcPtr)(QXT_PARAM(1));\n        return true;\n    }\nprivate:\n    qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename T1, typename T2>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, void, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef void(*FUNCTION)(T1, T2);\n    bool invoke(QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2));\n        return true;\n    }\nprivate:\n    qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename T1, typename T2, typename T3>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, void, void, void, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef void(*FUNCTION)(T1, T2, T3);\n    bool invoke(QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3));\n        return true;\n    }\nprivate:\n    qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, T4, void, void, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef void(*FUNCTION)(T1, T2, T3, T4);\n    bool invoke(QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4));\n        return true;\n    }\nprivate:\n    qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, T4, T5, void, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef void(*FUNCTION)(T1, T2, T3, T4, T5);\n    bool invoke(QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5));\n        return true;\n    }\nprivate:\n    qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, T4, T5, T6, void, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6);\n    bool invoke(QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6));\n        return true;\n    }\nprivate:\n    qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, T4, T5, T6, T7, void, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7);\n    bool invoke(QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7));\n        return true;\n    }\nprivate:\n    qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, T4, T5, T6, T7, T8, void, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8);\n    bool invoke(QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7), QXT_PARAM(8));\n        return true;\n    }\nprivate:\n    qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>\nclass /*QXT_CORE_EXPORT*/ qxt_cfunction<T1, T2, T3, T4, T5, T6, T7, T8, T9, void> : public QxtGenericFunctionPointer\n{\npublic:\n    typedef void(*FUNCTION)(T1, T2, T3, T4, T5, T6, T7, T8, T9);\n    bool invoke(QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        QXT_10_UNUSED;\n        QXT_INVOKE(funcPtr)(QXT_PARAM(1), QXT_PARAM(2), QXT_PARAM(3), QXT_PARAM(4), QXT_PARAM(5), QXT_PARAM(6), QXT_PARAM(7), QXT_PARAM(8), QXT_PARAM(9));\n        return true;\n    }\nprivate:\n    qxt_cfunction(voidFunc* ptr, const QByteArray& typeIdName) : QxtGenericFunctionPointer(ptr, typeIdName) {}\n};\n\ntemplate < typename RETURN = void, typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void,\ntypename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void, typename T10 = void >\nclass /*QXT_CORE_EXPORT*/ QxtBoundCFunction : public QxtBoundFunctionBase\n{\npublic:\n    QxtGenericFunctionPointer funcPtr;\n\n    QxtBoundCFunction(QObject* parent, QxtGenericFunctionPointer funcPointer, QGenericArgument* params[10], QByteArray types[10]) : QxtBoundFunctionBase(parent, params, types), funcPtr(funcPointer)\n    {\n        // initializers only, thanks to template magic\n    }\n\n    virtual bool invokeImpl(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_IMPL_10ARGS(QGenericArgument))\n    {\n        if (type != Qt::AutoConnection && type != Qt::DirectConnection)\n        {\n            qWarning() << \"QxtBoundCFunction::invoke: Cannot invoke non-Qt functions using a queued connection\";\n            return false;\n        }\n        return reinterpret_cast<qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>*>(&funcPtr)->invoke(returnValue, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);\n    }\n};\n\ntemplate <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>\nclass /*QXT_CORE_EXPORT*/ QxtBoundCFunction<void, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : public QxtBoundFunctionBase\n{\npublic:\n    QxtGenericFunctionPointer funcPtr;\n\n    QxtBoundCFunction(QObject* parent, QxtGenericFunctionPointer funcPointer, QGenericArgument* params[10], QByteArray types[10]) : QxtBoundFunctionBase(parent, params, types), funcPtr(funcPointer)\n    {\n        // initializers only, thanks to template magic\n    }\n\n    virtual bool invokeImpl(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_IMPL_10ARGS(QGenericArgument))\n    {\n        Q_UNUSED(returnValue);\n        if (type != Qt::AutoConnection && type != Qt::DirectConnection)\n        {\n            qWarning() << \"QxtBoundCFunction::invoke: Cannot invoke non-Qt functions using a queued connection\";\n            return false;\n        }\n        return reinterpret_cast<qxt_cfunction<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>*>(&funcPtr)->invoke(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);\n    }\n};\n\n#undef QXT_RETURN\n#undef QXT_INVOKE\n#undef QXT_PARAM\n#endif\n\nnamespace QxtMetaObject\n{\n    /*!\n     * \\relates QxtMetaObject\n     * \\sa QxtMetaObject::connect\n     * \\sa qxtFuncPtr\n     * \\sa QxtBoundFunction\n     * \\sa QXT_BIND\n     *\n     * Creates a binding to the provided C/C++ function using the provided parameter list.\n     * Use the qxtFuncPtr function to wrap a bare function pointer for use in this function.\n     * Use the Q_ARG macro to specify constant parameters, or use the QXT_BIND macro to\n     * relay a parameter from a connected signal or passed via the QxtBoundFunction::invoke()\n     * method.\n     *\n     * The first template parameter must match the return type of the function, or\n     * void if the function does not return a value. The remaining template parameters must\n     * match the types of the function's parameters. If any type does not match, this\n     * function returns NULL.\n     *\n     * The returned QxtBoundFunction will not have a parent. Assigning a parent using\n     * QObject::setParent() is strongly recommended to avoid memory leaks.\n     */\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>\n    QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QXT_IMPL_10ARGS(QGenericArgument))\n    {\n        // Make sure the template parameters make a function pointer equivalent to the one passed in\n        if (funcPointer.typeName != typeid(typename qxt_cfunction_return<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::FUNCTION).name())\n        {\n            qWarning() << \"QxtMetaObject::bind: parameter list mismatch, check template arguments\";\n            return 0;\n        }\n\n        QGenericArgument* args[10] = { &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10 };\n        for (int i = 0; i < 10; i++)\n        {\n            if (args[i]->name() == 0) break;        // done\n            if (QByteArray(args[i]->name()) == \"QxtBoundArgument\")\n            {\n                Q_ASSERT_X((quintptr)(args[i]->data()) > 0 && (quintptr)(args[i]->data()) <= 10, \"QXT_BIND\", \"invalid argument number\");\n            }\n        }\n\n        QByteArray types[10];\n        types[0] = QxtMetaType<T1>::name();\n        types[1] = QxtMetaType<T2>::name();\n        types[2] = QxtMetaType<T3>::name();\n        types[3] = QxtMetaType<T4>::name();\n        types[4] = QxtMetaType<T5>::name();\n        types[5] = QxtMetaType<T6>::name();\n        types[6] = QxtMetaType<T7>::name();\n        types[7] = QxtMetaType<T8>::name();\n        types[8] = QxtMetaType<T9>::name();\n        types[9] = QxtMetaType<T10>::name();\n\n        return new QxtBoundCFunction<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(0, funcPointer, args, types);\n    }\n\n    /*!\n     * \\relates QxtMetaObject\n     * \\sa QxtMetaObject::connect\n     * \\sa qxtFuncPtr\n     * \\sa QxtBoundFunction\n     *\n     * Creates a binding to the provided C/C++ function using the provided parameter list.\n     * Use the qxtFuncPtr function to wrap a bare function pointer for use in this function.\n     * The type of each argument is deduced from the type of the QVariant. This function\n     * cannot bind positional arguments; see the overload using QGenericArgument.\n     *\n     * The first template parameter must match the return type of the function, or\n     * void if the function does not return a value. The remaining template parameters must\n     * match the types of the function's parameters. If any type does not match, this\n     * function returns NULL.\n     *\n     * The returned QxtBoundFunction will not have a parent. Assigning a parent using\n     * QObject::setParent() is strongly recommended to avoid memory leaks.\n     */\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>\n    QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QXT_IMPL_10ARGS(QVariant))\n    {\n        QVariant* args[10] = { &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10 };\n        return QxtMetaObject::bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(funcPointer, QXT_VAR_ARG(1), QXT_VAR_ARG(2), QXT_VAR_ARG(3), QXT_VAR_ARG(4),\n                QXT_VAR_ARG(5), QXT_VAR_ARG(6), QXT_VAR_ARG(7), QXT_VAR_ARG(8), QXT_VAR_ARG(9), QXT_VAR_ARG(10));\n    }\n\n// The following overloads exist because C++ doesn't support default parameters in function templates\n#ifndef QXT_DOXYGEN_RUN\n    template <typename RETURN>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer)\n    {\n        return bind<RETURN, void, void, void, void, void, void, void, void, void, void>(funcPointer,\n                QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());\n    }\n\n    template <typename RETURN, typename T1>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1)\n    {\n        return bind<RETURN, T1, void, void, void, void, void, void, void, void, void>(funcPointer,\n                p1, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());\n    }\n\n    template <typename RETURN, typename T1, typename T2>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2)\n    {\n        return bind<RETURN, T1, T2, void, void, void, void, void, void, void, void>(funcPointer,\n                p1, p2, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3)\n    {\n        return bind<RETURN, T1, T2, T3, void, void, void, void, void, void, void>(funcPointer,\n                p1, p2, p3, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4)\n    {\n        return bind<RETURN, T1, T2, T3, T4, void, void, void, void, void, void>(funcPointer,\n                p1, p2, p3, p4, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5)\n    {\n        return bind<RETURN, T1, T2, T3, T4, T5, void, void, void, void, void>(funcPointer,\n                p1, p2, p3, p4, p5, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5, QGenericArgument p6)\n    {\n        return bind<RETURN, T1, T2, T3, T4, T5, T6, void, void, void, void>(funcPointer,\n                p1, p2, p3, p4, p5, p6, QGenericArgument(), QGenericArgument(), QGenericArgument(), QGenericArgument());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5, QGenericArgument p6, QGenericArgument p7)\n    {\n        return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, void, void, void>(funcPointer,\n                p1, p2, p3, p4, p5, p6, p7, QGenericArgument(), QGenericArgument(), QGenericArgument());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5,\n                                  QGenericArgument p6, QGenericArgument p7, QGenericArgument p8)\n    {\n        return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, void, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, QGenericArgument(), QGenericArgument());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QGenericArgument p1, QGenericArgument p2, QGenericArgument p3, QGenericArgument p4, QGenericArgument p5,\n                                  QGenericArgument p6, QGenericArgument p7, QGenericArgument p8, QGenericArgument p9)\n    {\n        return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, p9, QGenericArgument());\n    }\n\n    template <typename RETURN, typename T1>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1)\n    {\n        return bind<RETURN, T1, void, void, void, void, void, void, void, void, void>(funcPointer, p1, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant());\n    }\n\n    template <typename RETURN, typename T1, typename T2>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2)\n    {\n        return bind<RETURN, T1, T2, void, void, void, void, void, void, void, void>(funcPointer, p1, p2, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3)\n    {\n        return bind<RETURN, T1, T2, T3, void, void, void, void, void, void, void>(funcPointer, p1, p2, p3, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4)\n    {\n        return bind<RETURN, T1, T2, T3, T4, void, void, void, void, void, void>(funcPointer, p1, p2, p3, p4, QVariant(), QVariant(), QVariant(), QVariant(), QVariant(), QVariant());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5)\n    {\n        return bind<RETURN, T1, T2, T3, T4, T5, void, void, void, void, void>(funcPointer, p1, p2, p3, p4, p5, QVariant(), QVariant(), QVariant(), QVariant(), QVariant());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6)\n    {\n        return bind<RETURN, T1, T2, T3, T4, T5, T6, void, void, void, void>(funcPointer, p1, p2, p3, p4, p5, p6, QVariant(), QVariant(), QVariant(), QVariant());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7)\n    {\n        return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, void, void, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, QVariant(), QVariant(), QVariant());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7, QVariant p8)\n    {\n        return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, void, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, QVariant(), QVariant());\n    }\n\n    template <typename RETURN, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>\n    inline QxtBoundFunction* bind(QxtGenericFunctionPointer funcPointer, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7, QVariant p8, QVariant p9)\n    {\n        return bind<RETURN, T1, T2, T3, T4, T5, T6, T7, T8, T9, void>(funcPointer, p1, p2, p3, p4, p5, p6, p7, p8, p9, QVariant());\n    }\n#endif\n}\n#endif\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtboundfunction.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtCore module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTBOUNDFUNCTION_H\n#define QXTBOUNDFUNCTION_H\n\n#include <QObject>\n#include <QMetaObject>\n#include <QGenericArgument>\n#include <qxtmetaobject.h>\n#include <qxtnull.h>\n#include <QThread>\n#include <QtDebug>\n\n/*!\n\\class QxtBoundFunction\n\n\\inmodule QxtCore\n\n\\brief Binds parameters to a function call\n\n * A bound function is very similar to what the C++ FAQ Lite refers to as \"functionoids.\"\n * (http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.10)\n * It is similar in use to a function pointer, but allows any or all parameters to be\n * pre-filled with constant values. The remaining parameters are specified when the\n * function is invoked, for instance, by a Qt signal connection.\n *\n * By far, the most common expected use is to provide a parameter to a slot when the\n * signal doesn't have offer one. Many developers new to Qt try to write code like this:\n * \\code\n *     connect(button, SIGNAL(clicked()), lineEdit, SLOT(setText(\"Hello, world\")));\n * \\endcode\n * Experienced Qt developers will immediately spot the flaw here. The typical solution\n * is to create a short, one-line wrapper slot that invokes the desired function. Some\n * clever developers may even use QSignalMapper to handle slots that only need one\n * int or QString parameter.\n *\n * QxtBoundFunction enables the previous connect statement to be written like this:\n * \\code\n *     connect(button, SIGNAL(clicked()), QxtMetaObject::bind(lineEdit, SLOT(setText(QString)), Q_ARG(QString, \"Hello, world!\")));\n * \\code\n * This accomplishes the same result without having to create a new slot, or worse,\n * an entire object, just to pass a constant value.\n *\n * Additionally, through the use of the QXT_BIND macro, parameters from the signal\n * can be rearranged, skipped, or passed alongside constant arguments provided\n * with the Q_ARG macro. This can be used to provide stateful callbacks to a\n * generic function, for example.\n *\n * Many kinds of functions can be bound. The most common binding applies to\n * Qt signals and slots, but standard C/C++ functions can be bound as well.\n * Future development may add the ability to bind to C++ member functions,\n * and developers can make custom QxtBoundFunction subclasses for even more\n * flexibility if necessary.\n *\n *\n */\nclass QXT_CORE_EXPORT QxtBoundFunction : public QObject\n{\n    Q_OBJECT\npublic:\n    /*!\n     * Invokes the bound function and returns a value.\n     *\n     * The template parameter should be the return type of the invoked function. This overload accepts\n     * QVariant parameters and will guess the data type of each parameter based on the type of the QVariant.\n     */\n    template <class T>\n    inline QxtNullable<T> invoke(QXT_PROTO_10ARGS(QVariant))\n    {\n        if (!parent() || QThread::currentThread() == parent()->thread())\n            return invoke<T>(Qt::DirectConnection, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);\n#if QT_VERSION >= 0x040300\n        return invoke<T>(Qt::BlockingQueuedConnection, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);\n#else\n        qWarning() << \"QxtBoundFunction::invoke: Cannot return a value using a queued connection\";\n        return QxtNull();\n#endif\n    }\n\n    /*!\n     * Invokes the bound function and returns a value.\n     *\n     * The template parameter should be the return type of the invoked function. This overload accepts\n     * QGenericArgument parameters, expressed using the Q_ARG() macro.\n     */\n    template <class T>\n    QxtNullable<T> invoke(Qt::ConnectionType type, QVariant p1, QXT_PROTO_9ARGS(QVariant))\n    {\n        if (type == Qt::QueuedConnection)\n        {\n            qWarning() << \"QxtBoundFunction::invoke: Cannot return a value using a queued connection\";\n            return QxtNull();\n        }\n        T retval;\n        // I know this is a totally ugly function call\n        if (invoke(type, QGenericReturnArgument(qVariantFromValue<T>(*reinterpret_cast<T*>(0)).typeName(), reinterpret_cast<void*>(&retval)),\n                   p1, p2, p3, p4, p5, p6, p7, p8, p9, p10))\n        {\n            return retval;\n        }\n        else\n        {\n            return QxtNull();\n        }\n    }\n\n    /*!\n     * Invokes the bound function, discarding the return value.\n     *\n     * This overload accepts QVariant parameters and will guess the data type of each\n     * parameter based on the type of the QVariant.\n     *\n     * This function returns true if the invocation was successful, otherwise it\n     * returns false.\n     */\n    inline bool invoke(QVariant p1, QXT_PROTO_9ARGS(QVariant))\n    {\n        return invoke(Qt::AutoConnection, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);\n    }\n    /*!\n     * Invokes the bound function, discarding the return value.\n     *\n     * This overload accepts QVariant parameters and will guess the data type of each\n     * parameter based on the type of the QVariant. It also allows you to specify the\n     * connection type, allowing the bound function to be invoked across threads using\n     * the Qt event loop.\n     *\n     * This function returns true if the invocation was successful, otherwise it\n     * returns false.\n     */\n    bool invoke(Qt::ConnectionType, QVariant p1, QXT_PROTO_9ARGS(QVariant));\n\n    /*!\n     * Invokes the bound function, discarding the return value.\n     *\n     * This overload accepts QGenericArgument parameters, expressed using the Q_ARG()\n     * macro.\n     *\n     * This function returns true if the invocation was successful, otherwise it\n     * returns false.\n     */\n    inline bool invoke(QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        return invoke(Qt::AutoConnection, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);\n    }\n    /*!\n     * Invokes the bound function, discarding the return value.\n     *\n     * This overload accepts QGenericArgument parameters, expressed using the Q_ARG()\n     * macro. It also allows you to specify the connection type, allowing the bound\n     * function to be invoked across threads using the Qt event loop.\n     *\n     * This function returns true if the invocation was successful, otherwise it\n     * returns false.\n     */\n    inline bool invoke(Qt::ConnectionType type, QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        return invoke(type, QGenericReturnArgument(), p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);\n    }\n\n    /*!\n     * Invokes the bound function and assigns the return value to a parameter passed by reference.\n     *\n     * Use the Q_RETURN_ARG() macro to pass a reference to an assignable object of the function's\n     * return type. When the function completes, its return value will be stored in that object.\n     *\n     * This overload accepts QVariant parameters and will guess the data type of each\n     * parameter based on the type of the QVariant.\n     *\n     * This function returns true if the invocation was successful, otherwise it\n     * returns false.\n     */\n    inline bool invoke(QGenericReturnArgument returnValue, QVariant p1, QXT_PROTO_9ARGS(QVariant))\n    {\n        return invoke(Qt::AutoConnection, returnValue, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);\n    }\n    /*!\n     * Invokes the bound function and assigns the return value to a parameter passed by reference.\n     *\n     * Use the Q_RETURN_ARG() macro to pass a reference to an assignable object of the function's\n     * return type. When the function completes, its return value will be stored in that object.\n     *\n     * This overload accepts QVariant parameters and will guess the data type of each\n     * parameter based on the type of the QVariant. It also allows you to specify the\n     * connection type, allowing the bound function to be invoked across threads using\n     * the Qt event loop.\n     *\n     * This function returns true if the invocation was successful, otherwise it\n     * returns false.\n     */\n    bool invoke(Qt::ConnectionType type, QGenericReturnArgument returnValue, QVariant p1, QXT_PROTO_9ARGS(QVariant));\n\n    /*!\n     * Invokes the bound function and assigns the return value to a parameter passed by reference.\n     *\n     * Use the Q_RETURN_ARG() macro to pass a reference to an assignable object of the function's\n     * return type. When the function completes, its return value will be stored in that object.\n     *\n     * This overload accepts QGenericArgument parameters, expressed using the Q_ARG()\n     * macro.\n     *\n     * This function returns true if the invocation was successful, otherwise it\n     * returns false.\n     */\n    inline bool invoke(QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument))\n    {\n        return invoke(Qt::AutoConnection, returnValue, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);\n    }\n    /*!\n     * Invokes the bound function and assigns the return value to a parameter passed by reference.\n     *\n     * Use the Q_RETURN_ARG() macro to pass a reference to an assignable object of the function's\n     * return type. When the function completes, its return value will be stored in that object.\n     *\n     * This overload accepts QGenericArgument parameters, expressed using the Q_ARG()\n     * macro. It also allows you to specify the connection type, allowing the bound\n     * function to be invoked across threads using the Qt event loop.\n     *\n     * This function returns true if the invocation was successful, otherwise it\n     * returns false.\n     */\n    bool invoke(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument));\n\nprotected:\n#ifndef QXT_DOXYGEN_RUN\n    QxtBoundFunction(QObject* parent = 0);\n#endif\n\n    /*!\n     * Performs the work of invoking the bound function.\n     *\n     * This function is pure virtual. The various QxtMetaObject::bind() functions return opaque subclasses\n     * of QxtBoundFunction. If you wish to create a new kind of bound function, reimplement this function to\n     * perform the invocation and assign the function's return value, if any, to the returnValue parameter.\n     *\n     * This function should return true if the invocation is successful and false if an error occurs.\n     */\n    virtual bool invokeImpl(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument)) = 0;\n};\n\n#endif\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtboundfunctionbase.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtCore module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n// This file exists for the convenience of QxtBoundCFunction.\n// It is not part of the public API and is subject to change.\n//\n// We mean it.\n\n#ifndef QXTBOUNDFUNCTIONBASE_H\n#define QXTBOUNDFUNCTIONBASE_H\n\n#include <QObject>\n#include <QMetaObject>\n#include <QGenericArgument>\n#include <qxtmetaobject.h>\n#include <qxtboundfunction.h>\n\n#ifndef QXT_DOXYGEN_RUN\n\n#define QXT_10_UNUSED Q_UNUSED(p1) Q_UNUSED(p2) Q_UNUSED(p3) Q_UNUSED(p4) Q_UNUSED(p5) Q_UNUSED(p6) Q_UNUSED(p7) Q_UNUSED(p8) Q_UNUSED(p9) Q_UNUSED(p10)\n\nclass QXT_CORE_EXPORT QxtBoundFunctionBase : public QxtBoundFunction\n{\npublic:\n    QByteArray bindTypes[10];\n    QGenericArgument arg[10], p[10];\n    void* data[10];\n\n    QxtBoundFunctionBase(QObject* parent, QGenericArgument* params[10], QByteArray types[10]);\n    virtual ~QxtBoundFunctionBase();\n\n    int qt_metacall(QMetaObject::Call _c, int _id, void **_a);\n    bool invokeBase(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_PROTO_10ARGS(QGenericArgument));\n};\n\n#define QXT_ARG(i) ((argCount>i)?QGenericArgument(p ## i .typeName(), p ## i .constData()):QGenericArgument())\n#define QXT_VAR_ARG(i) (p ## i .isValid())?QGenericArgument(p ## i .typeName(), p ## i .constData()):QGenericArgument()\n#endif\n#endif\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtglobal.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtCore module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#include \"qxtglobal.h\"\n\n/*!\n    \\headerfile <QxtGlobal>\n    \\title Global Qxt Declarations\n    \\inmodule QxtCore\n\n    \\brief The <QxtGlobal> header provides basic declarations and\n    is included by all other Qxt headers.\n */\n\n/*!\n    \\macro QXT_VERSION\n    \\relates <QxtGlobal>\n\n    This macro expands a numeric value of the form 0xMMNNPP (MM =\n    major, NN = minor, PP = patch) that specifies Qxt's version\n    number. For example, if you compile your application against Qxt\n    0.4.0, the QXT_VERSION macro will expand to 0x000400.\n\n    You can use QXT_VERSION to use the latest Qt features where\n    available. For example:\n    \\code\n    #if QXT_VERSION >= 0x000400\n        qxtTabWidget->setTabMovementMode(QxtTabWidget::InPlaceMovement);\n    #endif\n    \\endcode\n\n    \\sa QXT_VERSION_STR, qxtVersion()\n */\n\n/*!\n    \\macro QXT_VERSION_STR\n    \\relates <QxtGlobal>\n\n    This macro expands to a string that specifies Qxt's version number\n    (for example, \"0.4.0\"). This is the version against which the\n    application is compiled.\n\n    \\sa qxtVersion(), QXT_VERSION\n */\n\n/*!\n    \\relates <QxtGlobal>\n\n    Returns the version number of Qxt at run-time as a string (for\n    example, \"0.4.0\"). This may be a different version than the\n    version the application was compiled against.\n\n    \\sa QXT_VERSION_STR\n */\nconst char* qxtVersion()\n{\n    return QXT_VERSION_STR;\n}\n\n/*!\n\\headerfile <QxtPimpl>\n\\title The Qxt private implementation\n\\inmodule QxtCore\n\n\\brief The <QxtPimpl> header provides tools for hiding\ndetails of a class.\n\nApplication code generally doesn't have to be concerned about hiding its\nimplementation details, but when writing library code it is important to\nmaintain a constant interface, both source and binary. Maintaining a constant\nsource interface is easy enough, but keeping the binary interface constant\nmeans moving implementation details into a private class. The PIMPL, or\nd-pointer, idiom is a common method of implementing this separation. QxtPimpl\noffers a convenient way to connect the public and private sides of your class.\n\n\\section1 Getting Started\nBefore you declare the public class, you need to make a forward declaration\nof the private class. The private class must have the same name as the public\nclass, followed by the word Private. For example, a class named MyTest would\ndeclare the private class with:\n\\code\nclass MyTestPrivate;\n\\endcode\n\n\\section1 The Public Class\nGenerally, you shouldn't keep any data members in the public class without a\ngood reason. Functions that are part of the public interface should be declared\nin the public class, and functions that need to be available to subclasses (for\ncalling or overriding) should be in the protected section of the public class.\nTo connect the private class to the public class, include the\nQXT_DECLARE_PRIVATE macro in the private section of the public class. In the\nexample above, the private class is connected as follows:\n\\code\nprivate:\n    QXT_DECLARE_PRIVATE(MyTest)\n\\endcode\n\nAdditionally, you must include the QXT_INIT_PRIVATE macro in the public class's\nconstructor. Continuing with the MyTest example, your constructor might look\nlike this:\n\\code\nMyTest::MyTest() {\n    // initialization\n    QXT_INIT_PRIVATE(MyTest);\n}\n\\endcode\n\n\\section1 The Private Class\nAs mentioned above, data members should usually be kept in the private class.\nThis allows the memory layout of the private class to change without breaking\nbinary compatibility for the public class. Functions that exist only as\nimplementation details, or functions that need access to private data members,\nshould be implemented here.\n\nTo define the private class, inherit from the template QxtPrivate class, and\ninclude the QXT_DECLARE_PUBLIC macro in its public section. The template\nparameter should be the name of the public class. For example:\n\\code\nclass MyTestPrivate : public QxtPrivate<MyTest> {\npublic:\n    MyTestPrivate();\n    QXT_DECLARE_PUBLIC(MyTest)\n};\n\\endcode\n\n\\section1 Accessing Private Members\nUse the qxt_d() function (actually a function-like object) from functions in\nthe public class to access the private class. Similarly, functions in the\nprivate class can invoke functions in the public class by using the qxt_p()\nfunction (this one's actually a function).\n\nFor example, assume that MyTest has methods named getFoobar and doBaz(),\nand MyTestPrivate has a member named foobar and a method named doQuux().\nThe code might resemble this example:\n\\code\nint MyTest::getFoobar() {\n    return qxt_d().foobar;\n}\n\nvoid MyTestPrivate::doQuux() {\n    qxt_p().doBaz(foobar);\n}\n\\endcode\n*/\n\n/*! \n * \\macro QXT_DECLARE_PRIVATE(PUB)\n * \\relates <QxtPimpl>\n * Declares that a public class has a related private class.\n *\n * This shuold be put in the private section of the public class. The parameter is the name of the public class.\n */\n\n/*!\n * \\macro QXT_DECLARE_PUBLIC(PUB)\n * \\relates <QxtPimpl>\n * Declares that a private class has a related public class.\n *\n * This may be put anywhere in the declaration of the private class. The parameter is the name of the public class.\n */\n\n/*!\n * \\macro QXT_INIT_PRIVATE(PUB)\n * \\relates <QxtPimpl>\n * Initializes resources owned by the private class.\n *\n * This should be called from the public class's constructor,\n * before qxt_d() is used for the first time. The parameter is the name of the public class.\n */\n\n/*!\n * \\macro QXT_D(PUB)\n * \\relates <QxtPimpl>\n * Returns a reference in the current scope named \"d\" to the private class.\n *\n * This function is only available in a class using \\a QXT_DECLARE_PRIVATE.\n */\n\n/*!\n * \\macro QXT_P(PUB)\n * \\relates <QxtPimpl>\n * Creates a reference in the current scope named \"q\" to the public class.\n *\n * This macro only works in a class using \\a QXT_DECLARE_PUBLIC.\n */\n\n/*!\n * \\fn QxtPrivate<PUB>& PUB::qxt_d()\n * \\relates <QxtPimpl>\n * Returns a reference to the private class.\n *\n * This function is only available in a class using \\a QXT_DECLARE_PRIVATE.\n */\n\n/*!\n * \\fn const QxtPrivate<PUB>& PUB::qxt_d() const\n * \\relates <QxtPimpl>\n * Returns a const reference to the private class.\n *\n * This function is only available in a class using \\a QXT_DECLARE_PRIVATE.\n * This overload will be automatically used in const functions.\n */\n\n/*!\n * \\fn PUB& QxtPrivate::qxt_p()\n * \\relates <QxtPimpl>\n * Returns a reference to the public class.\n *\n * This function is only available in a class using \\a QXT_DECLARE_PUBLIC.\n */\n\n/*!\n * \\fn const PUB& QxtPrivate::qxt_p() const\n * \\relates <QxtPimpl>\n * Returns a const reference to the public class.\n *\n * This function is only available in a class using \\a QXT_DECLARE_PUBLIC.\n * This overload will be automatically used in const functions.\n */\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtglobal.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtCore module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTGLOBAL_H\n#define QXTGLOBAL_H\n\n//#ifdef WIN32\n//#define WINVER 0x0501\n//#endif\n\n#include <QtGlobal>\n\n#define QXT_VERSION 0x000600\n#define QXT_VERSION_STR \"0.6.0\"\n\n//--------------------------global macros------------------------------\n\n#ifndef QXT_NO_MACROS\n\n#endif // QXT_NO_MACROS\n\n//--------------------------export macros------------------------------\n\n#define QXT_DLLEXPORT DO_NOT_USE_THIS_ANYMORE\n\n#if !defined(QXT_STATIC)\n#    if defined(BUILD_QXT_CORE)\n#        define QXT_CORE_EXPORT Q_DECL_EXPORT\n#    else\n#        define QXT_CORE_EXPORT Q_DECL_IMPORT\n#    endif\n#else\n#    define QXT_CORE_EXPORT\n#endif // BUILD_QXT_CORE\n \n#if !defined(QXT_STATIC)\n#    if defined(BUILD_QXT_GUI)\n#        define QXT_GUI_EXPORT Q_DECL_EXPORT\n#    else\n#        define QXT_GUI_EXPORT Q_DECL_IMPORT\n#    endif\n#else\n#    define QXT_GUI_EXPORT\n#endif // BUILD_QXT_GUI\n \n#if !defined(QXT_STATIC)\n#    if defined(BUILD_QXT_NETWORK)\n#        define QXT_NETWORK_EXPORT Q_DECL_EXPORT\n#    else\n#        define QXT_NETWORK_EXPORT Q_DECL_IMPORT\n#    endif\n#else\n#    define QXT_NETWORK_EXPORT\n#endif // BUILD_QXT_NETWORK\n \n#if !defined(QXT_STATIC)\n#    if defined(BUILD_QXT_SQL)\n#        define QXT_SQL_EXPORT Q_DECL_EXPORT\n#    else\n#        define QXT_SQL_EXPORT Q_DECL_IMPORT\n#    endif\n#else\n#    define QXT_SQL_EXPORT\n#endif // BUILD_QXT_SQL\n \n#if !defined(QXT_STATIC)\n#    if defined(BUILD_QXT_WEB)\n#        define QXT_WEB_EXPORT Q_DECL_EXPORT\n#    else\n#        define QXT_WEB_EXPORT Q_DECL_IMPORT\n#    endif\n#else\n#    define QXT_WEB_EXPORT\n#endif // BUILD_QXT_WEB\n \n#if !defined(QXT_STATIC)\n#    if defined(BUILD_QXT_BERKELEY)\n#        define QXT_BERKELEY_EXPORT Q_DECL_EXPORT\n#    else\n#        define QXT_BERKELEY_EXPORT Q_DECL_IMPORT\n#    endif\n#else\n#    define QXT_BERKELEY_EXPORT\n#endif // BUILD_QXT_BERKELEY\n\n#if !defined(QXT_STATIC)\n#    if defined(BUILD_QXT_ZEROCONF)\n#        define QXT_ZEROCONF_EXPORT Q_DECL_EXPORT\n#    else\n#        define QXT_ZEROCONF_EXPORT Q_DECL_IMPORT\n#    endif\n#else\n#    define QXT_ZEROCONF_EXPORT\n#endif // QXT_ZEROCONF_EXPORT\n\n#if defined BUILD_QXT_CORE || defined BUILD_QXT_GUI || defined  BUILD_QXT_SQL || defined BUILD_QXT_NETWORK || defined BUILD_QXT_WEB || defined BUILD_QXT_BERKELEY || defined BUILD_QXT_ZEROCONF\n#   define BUILD_QXT\n#endif\n\nQXT_CORE_EXPORT const char* qxtVersion();\n\n#ifndef QT_BEGIN_NAMESPACE\n#define QT_BEGIN_NAMESPACE\n#endif\n\n#ifndef QT_END_NAMESPACE\n#define QT_END_NAMESPACE\n#endif\n\n#ifndef QT_FORWARD_DECLARE_CLASS\n#define QT_FORWARD_DECLARE_CLASS(Class) class Class;\n#endif\n\n/****************************************************************************\n** This file is derived from code bearing the following notice:\n** The sole author of this file, Adam Higerd, has explicitly disclaimed all\n** copyright interest and protection for the content within. This file has\n** been placed in the public domain according to United States copyright\n** statute and case law. In jurisdictions where this public domain dedication\n** is not legally recognized, anyone who receives a copy of this file is\n** permitted to use, modify, duplicate, and redistribute this file, in whole\n** or in part, with no restrictions or conditions. In these jurisdictions,\n** this file shall be copyright (C) 2006-2008 by Adam Higerd.\n****************************************************************************/\n\n#define QXT_DECLARE_PRIVATE(PUB) friend class PUB##Private; QxtPrivateInterface<PUB, PUB##Private> qxt_d;\n#define QXT_DECLARE_PUBLIC(PUB) friend class PUB;\n#define QXT_INIT_PRIVATE(PUB) qxt_d.setPublic(this);\n#define QXT_D(PUB) PUB##Private& d = qxt_d()\n#define QXT_P(PUB) PUB& p = qxt_p()\n\ntemplate <typename PUB>\nclass QxtPrivate\n{\npublic:\n    virtual ~QxtPrivate()\n    {}\n    inline void QXT_setPublic(PUB* pub)\n    {\n        qxt_p_ptr = pub;\n    }\n\nprotected:\n    inline PUB& qxt_p()\n    {\n        return *qxt_p_ptr;\n    }\n    inline const PUB& qxt_p() const\n    {\n        return *qxt_p_ptr;\n    }\n\nprivate:\n    PUB* qxt_p_ptr;\n};\n\ntemplate <typename PUB, typename PVT>\nclass QxtPrivateInterface\n{\n    friend class QxtPrivate<PUB>;\npublic:\n    QxtPrivateInterface()\n    {\n        pvt = new PVT;\n    }\n    ~QxtPrivateInterface()\n    {\n        delete pvt;\n    }\n\n    inline void setPublic(PUB* pub)\n    {\n        pvt->QXT_setPublic(pub);\n    }\n    inline PVT& operator()()\n    {\n        return *static_cast<PVT*>(pvt);\n    }\n    inline const PVT& operator()() const\n    {\n        return *static_cast<PVT*>(pvt);\n    }\nprivate:\n    QxtPrivateInterface(const QxtPrivateInterface&) { }\n    QxtPrivateInterface& operator=(const QxtPrivateInterface&) { }\n    QxtPrivate<PUB>* pvt;\n};\n\n#endif // QXT_GLOBAL\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxthtmltemplate.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n/*!\n        \\class QxtHtmlTemplate\n        \\inmodule QxtWeb\n        \\brief The QxtHtmlTemplate class provides a basic HTML template engine\n\n        open a file containing html code and php style variables.\n        use the square bracket operators to assign content for a variable\n\n        \\code\n        QxtHtmlTemplate index;\n        if(!index.open)\n                return 404;\n        index[\"content\"]=\"hello world\";\n        echo()<<index.render();\n        \\endcode\n        the realatet html code would look like:\n        \\code\n        <html>\n        <head>\n                <title>Test Page</title>\n        </head>\n                <?=content?>\n        </html>\n        \\endcode\n\n        funny storry: whe are using this class to make our documentation (eat your own dogfood, you know ;).\n        but when we where parsing exactly this file you read right now the first time, QxtHtmlTemplate got stuck in an infinite loop. guess why. becouse of that example above :D\n        So be warned: when you assign content to a variable that contains the variable name itself, render() will never return.\n\n\n*/\n\n/*!\n        \\fn QxtHtmlTemplate::open(const QString& filename)\n        Opens \\a filename. Returns \\c true on success and \\c false on failure.\n        Note that it will also return false for an empty html file.\n */\n\n/*!\n        \\fn QString QxtHtmlTemplate::render() const\n        Uses the variables you set and renders the opened file.\n        returns an empty string on failure.\n        Does NOT take care of not assigned variables, they will remain in the returned string\n */\n\n#include \"qxthtmltemplate.h\"\n#include <QFile>\n#include <QStringList>\n\n/*!\n    Constructs a new QxtHtmlTemplate.\n */\nQxtHtmlTemplate::QxtHtmlTemplate() : QMap<QString, QString>()\n{}\n\n/*!\n    Loads data \\a d.\n */\nvoid QxtHtmlTemplate::load(const QString& d)\n{\n    data = d;\n}\n\nbool QxtHtmlTemplate::open(const QString& filename)\n{\n    QFile f(filename);\n    f.open(QIODevice::ReadOnly);\n    data = QString::fromLocal8Bit(f.readAll());\n    f.close();\n    if (data.isEmpty())\n    {\n        qWarning(\"QxtHtmlTemplate::open(\\\"%s\\\") empty or nonexistent\", qPrintable(filename));\n        return false;\n    }\n    return true;\n}\n\nQString QxtHtmlTemplate::render() const\n{\n    ///try to preserve indention by parsing char by char and saving the last non-space character\n\n\n    QString output = data;\n    int lastnewline = 0;\n\n\n    for (int i = 0;i < output.count();i++)\n    {\n        if (output.at(i) == '\\n')\n        {\n            lastnewline = i;\n        }\n\n        if (output.at(i) == '<' && output.at(i + 1) == '?'  && output.at(i + 2) == '=')\n        {\n            int j = i + 3;\n            QString var;\n\n            for (int jj = j;jj < output.count();jj++)\n            {\n                if (output.at(jj) == '?' && output.at(jj + 1) == '>')\n                {\n                    j = jj;\n                    break;\n                }\n                var += output.at(jj);\n            }\n\n\n            if (j == i)\n            {\n                qWarning(\"QxtHtmlTemplate::render()  unterminated <?= \");\n                continue;\n            }\n\n\n            if (!contains(var))\n            {\n                qWarning(\"QxtHtmlTemplate::render()  unused variable \\\"%s\\\"\", qPrintable(var));\n                continue;\n            }\n            output.replace(i, j - i + 2, QString(value(var)).replace('\\n', '\\n' + QString(i - lastnewline - 1, QChar(' '))));\n\n        }\n\n\n    }\n\n    return output;\n}\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxthtmltemplate.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTHTMLTEMPLATE_H\n#define QXTHTMLTEMPLATE_H\n\n#include <QMap>\n#include <QString>\n#include <QHash>\n#include <qxtglobal.h>\n\nclass QXT_WEB_EXPORT QxtHtmlTemplate : public QMap<QString, QString>\n{\npublic:\n    QxtHtmlTemplate();\n    bool open(const QString& filename);\n    void load(const QString& data);\n\n    QString render() const;\n\nprivate:\n    QString data;\n};\n\n#endif // QXTHTMLTEMPLATE_H\n\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxthttpserverconnector.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n/*!\n\\class QxtHttpServerConnector\n\n\\inmodule QxtWeb\n\n\\brief The QxtHttpServerConnector class provides a built-in HTTP server for QxtHttpSessionManager\n\nQxtHttpSessionManager does the work of managing sessions and state for the\notherwise stateless HTTP protocol, but it relies on QxtAbstractHttpConnector\nsubclasses to implement the protocol used to communicate with the web server.\n\nQxtHttpServerConnector implements a complete HTTP server internally and does\nnot require an external web server to function. However, it provides very\nlittle control over the behavior of the web server and may not suitable for\nhigh traffic scenarios or virtual hosting configurations.\n\n\\sa QxtHttpSessionManager\n*/\n#include \"qxthttpsessionmanager.h\"\n#include \"qxtwebevent.h\"\n#include <QTcpServer>\n#include <QHash>\n#include <QTcpSocket>\n#include <QString>\n\n#ifndef QXT_DOXYGEN_RUN\nclass QxtHttpServerConnectorPrivate : public QxtPrivate<QxtHttpServerConnector>\n{\npublic:\n    QTcpServer* server;\n};\n#endif\n\n/*!\n * Creates a QxtHttpServerConnector with the given \\a parent.\n */\nQxtHttpServerConnector::QxtHttpServerConnector(QObject* parent) : QxtAbstractHttpConnector(parent)\n{\n    QXT_INIT_PRIVATE(QxtHttpServerConnector);\n    qxt_d().server = new QTcpServer(this);\n    QObject::connect(qxt_d().server, SIGNAL(newConnection()), this, SLOT(acceptConnection()));\n}\n\n/*!\n * \\reimp\n */\nbool QxtHttpServerConnector::listen(const QHostAddress& iface, quint16 port)\n{\n    return qxt_d().server->listen(iface, port);\n}\n\n/*!\n * \\internal\n */\nvoid QxtHttpServerConnector::acceptConnection()\n{\n    QTcpSocket* socket = qxt_d().server->nextPendingConnection();\n    addConnection(socket);\n}\n\n/*!\n * \\reimp\n */\nbool QxtHttpServerConnector::canParseRequest(const QByteArray& buffer)\n{\n    if (buffer.indexOf(\"\\r\\n\\r\\n\") >= 0) return true; // 1.0+\n    if (buffer.indexOf(\"\\r\\n\") >= 0 && buffer.indexOf(\"HTTP/\") == -1) return true; // 0.9\n    return false;\n}\n\n/*!\n * \\reimp\n */\nQHttpRequestHeader QxtHttpServerConnector::parseRequest(QByteArray& buffer)\n{\n    int pos = buffer.indexOf(\"\\r\\n\\r\\n\"), endpos = pos + 3;\n    if (pos == -1)\n    {\n        pos = buffer.indexOf(\"\\r\\n\"); // 0.9\n        endpos = pos + 1;\n    }\n\n    QHttpRequestHeader header(QString::fromUtf8(buffer.left(endpos)));\n    QByteArray firstLine = buffer.left(buffer.indexOf('\\r'));\n    if (firstLine.indexOf(\"HTTP/\") == -1)\n    {\n        header.setRequest(header.method(), header.path(), 0, 9);\n    }\n    buffer.remove(0, endpos + 1);\n    return header;\n}\n\n/*!\n * \\reimp\n */\nvoid QxtHttpServerConnector::writeHeaders(QIODevice* device, const QHttpResponseHeader& header)\n{\n    if (header.majorVersion() == 0) return; // 0.9 doesn't have headers\n    device->write(header.toString().toUtf8());\n}\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxthttpsessionmanager.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n/*!\n\\class QxtHttpSessionManager\n\n\\inmodule QxtWeb\n\n\\brief The QxtHttpSessionManager class provides a session manager for HTTP-based protocols\n\nQxtHttpSessionManager is a QxtWeb session manager that adds session management\nsupport to the normally stateless HTTP model.\n\nIn addition to session management, QxtHttpSessionManager also supports a\nstatic service, which can serve content that does not require session management,\nsuch as static web pages. The static service is also used to respond to HTTP/0.9\nclients that do not support cookies and HTTP/1.0 and HTTP/1.1 clients that are\nrejecting cookies. If no static service is provided, these clients will only\nsee an \"Internal Configuration Error\", so it is recommended to supply a static\nservice, even one that only returns a more useful error message.\n\nQxtHttpSessionManager attempts to be thread-safe in accepting connections and\nposting events. It is reentrant for all other functionality.\n\n\\sa QxtAbstractWebService\n*/\n\n#include \"qxthttpsessionmanager.h\"\n#include \"qxtwebevent.h\"\n#include \"qxtwebcontent.h\"\n#include \"qxtabstractwebservice.h\"\n#include <qxtboundfunction.h>\n#include <QMutex>\n#include <QList>\n#include <QUuid>\n#include <QIODevice>\n#include <QByteArray>\n#include <QPair>\n#include <QMetaObject>\n#include <QThread>\n#include <qxtmetaobject.h>\n#include <QTcpSocket>\n\n#ifndef QXT_DOXYGEN_RUN\nclass QxtHttpSessionManagerPrivate : public QxtPrivate<QxtHttpSessionManager>\n{\npublic:\n    struct ConnectionState\n    {\n        QxtBoundFunction* onBytesWritten;\n        bool readyRead;\n        bool finishedTransfer;\n        bool keepAlive;\n        bool streaming;\n        int httpMajorVersion;\n        int httpMinorVersion;\n        int sessionID;\n    };\n\n    QxtHttpSessionManagerPrivate() : iface(QHostAddress::Any), port(80), sessionCookieName(\"sessionID\"), connector(0), staticService(0), autoCreateSession(true),\n                eventLock(QMutex::Recursive), sessionLock(QMutex::Recursive) {}\n    QXT_DECLARE_PUBLIC(QxtHttpSessionManager)\n\n    QHostAddress iface;\n    quint16 port;\n    QByteArray sessionCookieName;\n    QxtAbstractHttpConnector* connector;\n    QxtAbstractWebService* staticService;\n    bool autoCreateSession;\n\n    QMutex eventLock;\n    QList<QxtWebEvent*> eventQueue;\n\n    QMutex sessionLock;\n    QHash<QUuid, int> sessionKeys;                      // sessionKey->sessionID\n    QHash<QIODevice*, ConnectionState> connectionState; // connection->state\n\n    Qt::HANDLE mainThread;\n};\n#endif\n\n/*!\n * Constructs a new QxtHttpSessionManager with the specified \\a parent.\n */\nQxtHttpSessionManager::QxtHttpSessionManager(QObject* parent) : QxtAbstractWebSessionManager(parent)\n{\n    QXT_INIT_PRIVATE(QxtHttpSessionManager);\n    qxt_d().mainThread = QThread::currentThreadId();\n}\n\n/*!\n * Returns the interface on which the session manager will listen for incoming connections.\n * \\sa setInterface\n */\nQHostAddress QxtHttpSessionManager::listenInterface() const\n    {\n        return qxt_d().iface;\n    }\n\n/*!\n * Sets the interface \\a iface on which the session manager will listen for incoming\n * connections.\n *\n * The default value is QHostAddress::Any, which will cause the session manager\n * to listen on all network interfaces.\n *\n * \\sa QxtAbstractHttpConnector::listen\n */\nvoid QxtHttpSessionManager::setListenInterface(const QHostAddress& iface)\n{\n    qxt_d().iface = iface;\n}\n\n/*!\n * Returns the port on which the session manager will listen for incoming connections.\n * \\sa setInterface\n */\nquint16 QxtHttpSessionManager::port() const\n{\n    return qxt_d().port;\n}\n\n/*!\n * Sets the \\a port on which the session manager will listen for incoming connections.\n *\n * The default value is to listen on port 80. This is an acceptable value when\n * using QxtHttpServerConnector, but it is not likely to be desirable for other\n * connectors.\n *\n * \\sa port\n */\nvoid QxtHttpSessionManager::setPort(quint16 port)\n{\n    qxt_d().port = port;\n}\n\n/*!\n * \\reimp\n */\nbool QxtHttpSessionManager::start()\n{\n    Q_ASSERT(qxt_d().connector);\n    return connector()->listen(listenInterface(), port());\n}\n\n/*!\n * Returns the name of the HTTP cookie used to track sessions in the web browser.\n * \\sa setSessionCookieName\n */\nQByteArray QxtHttpSessionManager::sessionCookieName() const\n{\n    return qxt_d().sessionCookieName;\n}\n\n/*!\n * Sets the \\a name of the HTTP cookie used to track sessions in the web browser.\n *\n * The default value is \"sessionID\".\n *\n * \\sa sessionCookieName\n */\nvoid QxtHttpSessionManager::setSessionCookieName(const QByteArray& name)\n{\n    qxt_d().sessionCookieName = name;\n}\n\n/*!\n * Sets the \\a connector used to manage connections to web browsers.\n *\n * \\sa connector\n */\nvoid QxtHttpSessionManager::setConnector(QxtAbstractHttpConnector* connector)\n{\n    connector->setSessionManager(this);\n    qxt_d().connector = connector;\n}\n\n/*!\n * Sets the \\a connector used to manage connections to web browsers.\n *\n * This overload is provided for convenience and can construct the predefined\n * connectors provided with Qxt.\n *\n * \\sa connector\n */\nvoid QxtHttpSessionManager::setConnector(Connector connector)\n{\n    if (connector == HttpServer)\n        setConnector(new QxtHttpServerConnector(this));\n    else if (connector == Scgi)\n        setConnector(new QxtScgiServerConnector(this));\n    /* commented out pending implementation\n\n    else if(connector == Fcgi)\n        setConnector(new QxtFcgiConnector(this));\n    */\n}\n\n/*!\n * Returns the connector used to manage connections to web browsers.\n * \\sa setConnector\n */\nQxtAbstractHttpConnector* QxtHttpSessionManager::connector() const\n{\n    return qxt_d().connector;\n}\n\n/*!\n * Returns \\c true if sessions are automatically created for every connection\n * that does not already have a session cookie associated with it; otherwise\n * returns \\c false.\n * \\sa setAutoCreateSession\n */\nbool QxtHttpSessionManager::autoCreateSession() const\n{\n    return qxt_d().autoCreateSession;\n}\n\n/*!\n * Sets \\a enabled whether sessions are automatically created for every connection\n * that does not already have a session cookie associated with it.\n *\n * Sessions are only created for clients that support HTTP cookies. HTTP/0.9\n * clients will never generate a session.\n *\n * \\sa autoCreateSession\n */\nvoid QxtHttpSessionManager::setAutoCreateSession(bool enable)\n{\n    qxt_d().autoCreateSession = enable;\n}\n\n/*!\n * Returns the QxtAbstractWebService that is used to respond to requests from\n * connections that are not associated with a session.\n *\n * \\sa setStaticContentService\n */\nQxtAbstractWebService* QxtHttpSessionManager::staticContentService() const\n{\n    return qxt_d().staticService;\n}\n\n/*!\n * Sets the \\a service that is used to respond to requests from\n * connections that are not associated with a session.\n *\n * If no static content service is set, connections that are not associated\n * with a session will receive an \"Internal Configuration Error\".\n *\n * \\sa staticContentService\n */\nvoid QxtHttpSessionManager::setStaticContentService(QxtAbstractWebService* service)\n{\n    qxt_d().staticService = service;\n}\n\n/*!\n * \\reimp\n */\nvoid QxtHttpSessionManager::postEvent(QxtWebEvent* h)\n{\n    qxt_d().eventLock.lock();\n    qxt_d().eventQueue.append(h);\n    qxt_d().eventLock.unlock();\n    // if(h->type() == QxtWebEvent::Page)\n    QMetaObject::invokeMethod(this, \"processEvents\", Qt::QueuedConnection);\n}\n\n/*!\n * Creates a new session and sends the session key to the web browser.\n *\n * Subclasses may override this function to perform custom session initialization,\n * but they must call the base class implementation in order to update the internal\n * session database and fetch a new session ID.\n */\nint QxtHttpSessionManager::newSession()\n{\n    QMutexLocker locker(&qxt_d().sessionLock);\n    int sessionID = createService();\n    QUuid key;\n    do\n    {\n        key = QUuid::createUuid();\n    }\n    while (qxt_d().sessionKeys.contains(key));\n    qxt_d().sessionKeys[key] = sessionID;\n    postEvent(new QxtWebStoreCookieEvent(sessionID, qxt_d().sessionCookieName, key));\n    return sessionID;\n}\n\n/*!\n * Handles incoming HTTP requests and dispatches them to the appropriate service.\n *\n * The \\a requestID is an opaque value generated by the connector.\n *\n * Subclasses may override this function to perform preprocessing on each\n * request, but they must call the base class implementation in order to\n * generate and dispatch the appropriate events.\n */\nvoid QxtHttpSessionManager::incomingRequest(quint32 requestID, const QHttpRequestHeader& header, QxtWebContent* content)\n{\n    QMultiHash<QString, QString> cookies;\n    foreach(const QString& cookie, header.allValues(\"cookie\"))   // QHttpHeader is case-insensitive, thankfully\n    {\n        foreach(const QString& kv, cookie.split(\"; \"))\n        {\n            int pos = kv.indexOf('=');\n            if (pos == -1) continue;\n            cookies.insert(kv.left(pos), kv.mid(pos + 1));\n        }\n    }\n\n    int sessionID;\n    QString sessionCookie = cookies.value(qxt_d().sessionCookieName);\n\n    qxt_d().sessionLock.lock();\n    if (qxt_d().sessionKeys.contains(sessionCookie))\n    {\n        sessionID = qxt_d().sessionKeys[sessionCookie];\n    }\n    else if (header.majorVersion() > 0 && qxt_d().autoCreateSession)\n    {\n        sessionID = newSession();\n    }\n    else\n    {\n        sessionID = 0;\n    }\n\n    QIODevice* device = connector()->getRequestConnection(requestID);\n    QxtHttpSessionManagerPrivate::ConnectionState& state = qxt_d().connectionState[device];\n    state.sessionID = sessionID;\n    state.httpMajorVersion = header.majorVersion();\n    state.httpMinorVersion = header.minorVersion();\n    if (state.httpMajorVersion == 0 || (state.httpMajorVersion == 1 && state.httpMinorVersion == 0) || header.value(\"connection\").toLower() == \"close\")\n        state.keepAlive = false;\n    else\n        state.keepAlive = true;\n    qxt_d().sessionLock.unlock();\n\n    QxtWebRequestEvent* event = new QxtWebRequestEvent(sessionID, requestID, QUrl(header.path()));\n    QTcpSocket* socket = qobject_cast<QTcpSocket*>(device);\n    if (socket)\n    {\n        event->remoteAddress = socket->peerAddress().toString();\n    }\n    event->method = header.method();\n    event->cookies = cookies;\n    event->url.setScheme(\"http\");\n    if (event->url.host().isEmpty())\n        event->url.setHost(header.value(\"host\"));\n    if (event->url.port() == -1)\n        event->url.setPort(port());\n    event->contentType = header.contentType();\n    event->content = content;\n    typedef QPair<QString, QString> StringPair;\n    foreach(const StringPair& line, header.values())\n    {\n        if (line.first.toLower() == \"cookie\") continue;\n        event->headers.insert(line.first, line.second);\n    }\n    event->headers.insert(\"X-Request-Protocol\", \"HTTP/\" + QString::number(state.httpMajorVersion) + '.' + QString::number(state.httpMinorVersion));\n    if (sessionID && session(sessionID))\n    {\n        session(sessionID)->pageRequestedEvent(event);\n    }\n    else if (qxt_d().staticService)\n    {\n        qxt_d().staticService->pageRequestedEvent(event);\n    }\n    else\n    {\n        postEvent(new QxtWebErrorEvent(0, requestID, 500, \"Internal Configuration Error\"));\n    }\n}\n\n/*!\n * \\internal\n */\nvoid QxtHttpSessionManager::disconnected(QIODevice* device)\n{\n    QMutexLocker locker(&qxt_d().sessionLock);\n    if (qxt_d().connectionState.contains(device))\n        delete qxt_d().connectionState[device].onBytesWritten;\n    qxt_d().connectionState.remove(device);\n}\n\n/*!\n * \\reimp\n */\nvoid QxtHttpSessionManager::processEvents()\n{\n    if (QThread::currentThreadId() != qxt_d().mainThread)\n    {\n        QMetaObject::invokeMethod(this, \"processEvents\", Qt::QueuedConnection);\n        return;\n    }\n    QxtHttpSessionManagerPrivate& d = qxt_d();\n    QMutexLocker locker(&d.eventLock);\n    if (!d.eventQueue.count()) return;\n\n    int ct = d.eventQueue.count(), sessionID = 0, requestID = 0, pagePos = -1;\n    QxtWebRedirectEvent* re = 0;\n    QxtWebPageEvent* pe = 0;\n    for (int i = 0; i < ct; i++)\n    {\n        if (d.eventQueue[i]->type() != QxtWebEvent::Page && d.eventQueue[i]->type() != QxtWebEvent::Redirect) continue;\n        pagePos = i;\n        sessionID = d.eventQueue[i]->sessionID;\n        if (d.eventQueue[pagePos]->type() == QxtWebEvent::Redirect)\n        {\n            re = static_cast<QxtWebRedirectEvent*>(d.eventQueue[pagePos]);\n        }\n        pe = static_cast<QxtWebPageEvent*>(d.eventQueue[pagePos]);\n        requestID = pe->requestID;\n        break;\n    }\n    if (pagePos == -1) return; // no pages to send yet\n\n    QHttpResponseHeader header;\n    QList<int> removeIDs;\n    QxtWebEvent* e = 0;\n    for (int i = 0; i < pagePos; i++)\n    {\n        if (d.eventQueue[i]->sessionID != sessionID) continue;\n        e = d.eventQueue[i];\n        if (e->type() == QxtWebEvent::StoreCookie)\n        {\n            QxtWebStoreCookieEvent* ce = static_cast<QxtWebStoreCookieEvent*>(e);\n            QString cookie = ce->name + '=' + ce->data;\n            if (ce->expiration.isValid())\n            {\n                cookie += \"; max-age=\" + QString::number(QDateTime::currentDateTime().secsTo(ce->expiration))\n                          + \"; expires=\" + ce->expiration.toUTC().toString(\"ddd, dd-MMM-YYYY hh:mm:ss GMT\");\n            }\n            header.addValue(\"set-cookie\", cookie);\n            removeIDs.push_front(i);\n        }\n        else if (e->type() == QxtWebEvent::RemoveCookie)\n        {\n            QxtWebRemoveCookieEvent* ce = static_cast<QxtWebRemoveCookieEvent*>(e);\n            header.addValue(\"set-cookie\", ce->name + \"=; max-age=0; expires=\" + QDateTime(QDate(1970, 1, 1)).toString(\"ddd, dd-MMM-YYYY hh:mm:ss GMT\"));\n            removeIDs.push_front(i);\n        }\n    }\n    removeIDs.push_front(pagePos);\n\n    QIODevice* device = connector()->getRequestConnection(requestID);\n    QxtWebContent* content = qobject_cast<QxtWebContent*>(device);\n    // TODO: This should only be invoked when pipelining occurs\n    // In theory it shouldn't cause any problems as POST is specced to not be pipelined\n    if (content) content->ignoreRemainingContent();\n\n    QxtHttpSessionManagerPrivate::ConnectionState& state = qxt_d().connectionState[connector()->getRequestConnection(requestID)];\n\n    header.setStatusLine(pe->status, pe->statusMessage, state.httpMajorVersion, state.httpMinorVersion);\n\n    if (re)\n    {\n        header.setValue(\"location\", re->destination);\n    }\n\n    // Set custom header values\n    for (QMultiHash<QString, QString>::iterator it = pe->headers.begin(); it != pe->headers.end(); ++it)\n    {\n        header.setValue(it.key(), it.value());\n    }\n\n    header.setContentType(pe->contentType);\n    if (state.httpMajorVersion == 0 || (state.httpMajorVersion == 1 && state.httpMinorVersion == 0))\n        pe->chunked = false;\n\n    connector()->setRequestDataSource( pe->requestID, pe->dataSource );\n    QSharedPointer<QIODevice> source( pe->dataSource );\n    state.finishedTransfer = false;\n    bool emptyContent = !source->bytesAvailable() && !pe->streaming;\n    state.readyRead = source->bytesAvailable();\n    state.streaming = pe->streaming;\n\n    if (emptyContent)\n    {\n        header.setValue(\"connection\", \"close\");\n        connector()->writeHeaders(device, header);\n        closeConnection(requestID);\n    }\n    else\n    {\n        if (state.onBytesWritten) delete state.onBytesWritten;  // disconnect old handler\n        if (!pe->chunked)\n        {\n            state.keepAlive = false;\n            state.onBytesWritten = QxtMetaObject::bind(this, SLOT(sendNextBlock(int)),\n                                                             Q_ARG(int, requestID));\n\n            QxtMetaObject::connect(source.data(), SIGNAL(readyRead()),\n                                   QxtMetaObject::bind(this, SLOT(blockReadyRead(int)),\n                                                             Q_ARG(int, requestID)),\n                                   Qt::QueuedConnection);\n\n            QxtMetaObject::connect(source.data(), SIGNAL(aboutToClose()),\n                                   QxtMetaObject::bind(this, SLOT(closeConnection(int)),\n                                                             Q_ARG(int, requestID)),\n                                   Qt::QueuedConnection);\n        }\n        else\n        {\n            header.setValue(\"transfer-encoding\", \"chunked\");\n            state.onBytesWritten = QxtMetaObject::bind(this, SLOT(sendNextChunk(int)),\n                                                             Q_ARG(int, requestID));\n\n            QxtMetaObject::connect(source.data(), SIGNAL(readyRead()),\n                                   QxtMetaObject::bind(this, SLOT(chunkReadyRead(int)),\n                                                             Q_ARG(int, requestID)),\n                                   Qt::QueuedConnection);\n\n            QxtMetaObject::connect(source.data(), SIGNAL(aboutToClose()),\n                                   QxtMetaObject::bind(this, SLOT(sendEmptyChunk(int)),\n                                                             Q_ARG(int, requestID)),\n                                   Qt::QueuedConnection);\n        }\n        QxtMetaObject::connect(device, SIGNAL(bytesWritten(qint64)), state.onBytesWritten, Qt::QueuedConnection);\n\n        if (state.keepAlive)\n        {\n            header.setValue(\"connection\", \"keep-alive\");\n        }\n        else\n        {\n            header.setValue(\"connection\", \"close\");\n        }\n        connector()->writeHeaders(device, header);\n        if (state.readyRead)\n        {\n            if (pe->chunked)\n                sendNextChunk(requestID);\n            else\n                sendNextBlock(requestID);\n        }\n    }\n\n    foreach(int id, removeIDs)\n    {\n        delete d.eventQueue.takeAt(id);\n    }\n\n    if (d.eventQueue.count())\n        QMetaObject::invokeMethod(this, \"processEvents\", Qt::QueuedConnection);\n}\n\n/*!\n * \\internal\n */\nvoid QxtHttpSessionManager::chunkReadyRead(int requestID)\n{\n    const QSharedPointer<QIODevice>& dataSource = connector()->getRequestDataSource( requestID );\n    if (dataSource.isNull()) return;\n    if (!dataSource->bytesAvailable()) return;\n    QIODevice* device = connector()->getRequestConnection(requestID);\n    if (!qxt_d().connectionState.contains(device)) return;\n    if (!device->bytesToWrite() || qxt_d().connectionState[device].readyRead == false)\n    {\n        qxt_d().connectionState[device].readyRead = true;\n        sendNextChunk(requestID);\n    }\n}\n\n/*!\n * \\internal\n */\nvoid QxtHttpSessionManager::sendNextChunk(int requestID)\n{\n    const QSharedPointer<QIODevice>& dataSource = connector()->getRequestDataSource( requestID );\n    QIODevice* device = connector()->getRequestConnection(requestID);\n    if (dataSource.isNull() || !qxt_d().connectionState.contains(device)) return;\n    QxtHttpSessionManagerPrivate::ConnectionState& state = qxt_d().connectionState[device];\n    if (state.finishedTransfer)\n    {\n        // This is just the last block written; we're done with it\n        return;\n    }\n    if (!dataSource->bytesAvailable())\n    {\n        state.readyRead = false;\n        return;\n    }\n    QByteArray chunk = dataSource->read(32768); // this is a good chunk size\n    if (chunk.size())\n    {\n        QByteArray data = QString::number(chunk.size(), 16).toUtf8() + \"\\r\\n\" + chunk + \"\\r\\n\";\n        device->write(data);\n    }\n    state.readyRead = false;\n    if (!state.streaming && !dataSource->bytesAvailable())\n        QMetaObject::invokeMethod(this, \"sendEmptyChunk\", Q_ARG(int, requestID));\n}\n\n/*!\n * \\internal\n */\nvoid QxtHttpSessionManager::sendEmptyChunk(int requestID)\n{\n    QIODevice* device = connector()->getRequestConnection(requestID);\n    if (!qxt_d().connectionState.contains(device)) return;  // in case a disconnect signal and a bytesWritten signal get fired in the wrong order\n    QxtHttpSessionManagerPrivate::ConnectionState& state = qxt_d().connectionState[device];\n    if (state.finishedTransfer) return;\n    state.finishedTransfer = true;\n    device->write(\"0\\r\\n\\r\\n\");\n\n    if (state.keepAlive)\n    {\n        delete state.onBytesWritten;\n        state.onBytesWritten = 0;\n        QSharedPointer<QIODevice>& dataSource = connector()->getRequestDataSource( requestID );\n        dataSource.clear();\n        connector()->incomingData(device);\n    }\n    else\n    {\n        closeConnection(requestID);\n    }\n}\n\n/*!\n * \\internal\n */\nvoid QxtHttpSessionManager::closeConnection(int requestID)\n{\n    QIODevice* device = connector()->getRequestConnection(requestID);\n    if( !device ) return; // already closing/closed\n    QxtHttpSessionManagerPrivate::ConnectionState& state = qxt_d().connectionState[device];\n    state.finishedTransfer = true;\n    state.onBytesWritten = NULL;\n    QTcpSocket* socket = qobject_cast<QTcpSocket*>(device);\n    if (socket)\n        socket->disconnectFromHost();\n    else\n        device->close();\n\n    connector()->doneWithRequest( requestID );\n}\n\n/*!\n * \\internal\n */\nvoid QxtHttpSessionManager::blockReadyRead(int requestID)\n{\n    const QSharedPointer<QIODevice>& dataSource = connector()->getRequestDataSource( requestID );\n    if (!dataSource->bytesAvailable()) return;\n\n    QIODevice* device = connector()->getRequestConnection(requestID);\n    if (!device->bytesToWrite() || qxt_d().connectionState[device].readyRead == false)\n    {\n        qxt_d().connectionState[device].readyRead = true;\n        sendNextBlock(requestID);\n    }\n}\n\n/*!\n * \\internal\n */\nvoid QxtHttpSessionManager::sendNextBlock(int requestID)\n{\n    QSharedPointer<QIODevice>& dataSource = connector()->getRequestDataSource( requestID );\n    QIODevice* device = connector()->getRequestConnection(requestID);\n    if (!qxt_d().connectionState.contains(device)) return;  // in case a disconnect signal and a bytesWritten signal get fired in the wrong order\n    QxtHttpSessionManagerPrivate::ConnectionState& state = qxt_d().connectionState[device];\n    if (state.finishedTransfer) return;\n    if (!dataSource->bytesAvailable())\n    {\n        state.readyRead = false;\n        return;\n    }\n    QByteArray chunk = dataSource->read(32768); // this is a good chunk size\n    device->write(chunk);\n    state.readyRead = false;\n    if (!state.streaming && !dataSource->bytesAvailable())\n    {\n        closeConnection(requestID);\n    }\n}\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxthttpsessionmanager.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTHTTPSESSIONMANAGER_H\n#define QXTHTTPSESSIONMANAGER_H\n\n#include \"qxtabstractwebsessionmanager.h\"\n#include \"qxtabstracthttpconnector.h\"\n#include <QHostAddress>\n#include <QHttpHeader>\n#include <QSharedPointer>\n\nclass QxtWebEvent;\nclass QxtWebContent;\n\nclass QxtHttpSessionManagerPrivate;\nclass QXT_WEB_EXPORT QxtHttpSessionManager : public QxtAbstractWebSessionManager\n{\n    friend class QxtAbstractHttpConnector;\n    Q_OBJECT\npublic:\n    enum Connector { HttpServer, Scgi, Fcgi };\n\n    QxtHttpSessionManager(QObject* parent = 0);\n\n    virtual void postEvent(QxtWebEvent*);\n\n    QHostAddress listenInterface() const;\n    void setListenInterface(const QHostAddress& iface);\n\n    quint16 port() const;\n    void setPort(quint16 port);\n\n    QByteArray sessionCookieName() const;\n    void setSessionCookieName(const QByteArray& name);\n\n    bool autoCreateSession() const;\n    void setAutoCreateSession(bool enable);\n\n    QxtAbstractWebService* staticContentService() const;\n    void setStaticContentService(QxtAbstractWebService* service);\n\n    void setConnector(QxtAbstractHttpConnector* connector);\n    void setConnector(Connector connector);\n    QxtAbstractHttpConnector* connector() const;\n\n    virtual bool start();\n\nprotected:\n    virtual int newSession();\n    virtual void incomingRequest(quint32 requestID, const QHttpRequestHeader& header, QxtWebContent* device);\n\nprotected Q_SLOTS:\n    virtual void processEvents();\n\nprivate Q_SLOTS:\n    void closeConnection(int requestID);\n    void chunkReadyRead(int requestID);\n    void sendNextChunk(int requestID);\n    void sendEmptyChunk(int requestID);\n    void blockReadyRead(int requestID);\n    void sendNextBlock(int requestID);\n\nprivate:\n    void disconnected(QIODevice* device);\n    QXT_DECLARE_PRIVATE(QxtHttpSessionManager)\n};\n\n#endif\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtmetaobject.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtCore module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n/*!\n\\namespace QxtMetaObject\n\n\\inmodule QxtCore\n\n\\brief The QxtMetaObject namespace provides extensions to QMetaObject\n\nincluding QxtMetaObject::bind\n\n*/\n\n#include \"qxtmetaobject.h\"\n#include \"qxtboundfunction.h\"\n#include \"qxtboundcfunction.h\"\n#include \"qxtmetatype.h\"\n\n#include <QByteArray>\n#include <QMetaObject>\n#include <QMetaMethod>\n#include <QtDebug>\n\n#ifndef QXT_DOXYGEN_RUN\nclass QxtBoundArgument\n{\n    // This class intentionally left blank\n};\nQ_DECLARE_METATYPE(QxtBoundArgument)\n\nclass QxtBoundFunctionBase;\n\nQxtBoundFunction::QxtBoundFunction(QObject* parent) : QObject(parent)\n{\n    // initializer only\n}\n#endif\n\nbool QxtBoundFunction::invoke(Qt::ConnectionType type, QXT_IMPL_10ARGS(QVariant))\n{\n    return invoke(type, QXT_VAR_ARG(1), QXT_VAR_ARG(2), QXT_VAR_ARG(3), QXT_VAR_ARG(4), QXT_VAR_ARG(5), QXT_VAR_ARG(6), QXT_VAR_ARG(7), QXT_VAR_ARG(8), QXT_VAR_ARG(9), QXT_VAR_ARG(10));\n}\n\nbool QxtBoundFunction::invoke(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_IMPL_10ARGS(QVariant))\n{\n    return invoke(type, returnValue, QXT_VAR_ARG(1), QXT_VAR_ARG(2), QXT_VAR_ARG(3), QXT_VAR_ARG(4), QXT_VAR_ARG(5), QXT_VAR_ARG(6), QXT_VAR_ARG(7), QXT_VAR_ARG(8), QXT_VAR_ARG(9), QXT_VAR_ARG(10));\n}\n\nQxtBoundFunctionBase::QxtBoundFunctionBase(QObject* parent, QGenericArgument* params[10], QByteArray types[10]) : QxtBoundFunction(parent)\n{\n    for (int i = 0; i < 10; i++)\n    {\n        if (!params[i]) break;\n        if (QByteArray(params[i]->name()) == \"QxtBoundArgument\")\n        {\n            arg[i] = QGenericArgument(\"QxtBoundArgument\", params[i]->data());\n        }\n        else\n        {\n            data[i] = qxtConstructFromGenericArgument(*params[i]);\n            arg[i] = p[i] = QGenericArgument(params[i]->name(), data[i]);\n        }\n        bindTypes[i] = types[i];\n    }\n}\n\nQxtBoundFunctionBase::~QxtBoundFunctionBase()\n{\n    for (int i = 0; i < 10; i++)\n    {\n        if (arg[i].name() == 0) return;\n        if (QByteArray(arg[i].name()) != \"QxtBoundArgument\") qxtDestroyFromGenericArgument(arg[i]);\n    }\n}\n\nint QxtBoundFunctionBase::qt_metacall(QMetaObject::Call _c, int _id, void **_a)\n{\n    _id = QObject::qt_metacall(_c, _id, _a);\n    if (_id < 0)\n        return _id;\n    if (_c == QMetaObject::InvokeMetaMethod)\n    {\n        if (_id == 0)\n        {\n            for (int i = 0; i < 10; i++)\n            {\n                if (QByteArray(arg[i].name()) == \"QxtBoundArgument\")\n                {\n                    p[i] = QGenericArgument(bindTypes[i].constData(), _a[(quintptr)(arg[i].data())]);\n                }\n            }\n            invokeImpl(Qt::DirectConnection, QGenericReturnArgument(), p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9]);\n        }\n        _id = -1;\n    }\n    return _id;\n}\n\nbool QxtBoundFunctionBase::invokeBase(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_IMPL_10ARGS(QGenericArgument))\n{\n    QGenericArgument* args[10] = { &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10 };\n    for (int i = 0; i < 10; i++)\n    {\n        if (QByteArray(arg[i].name()) == \"QxtBoundArgument\")\n        {\n            p[i] = *args[(quintptr)(arg[i].data()) - 1];\n        }\n    }\n    return invokeImpl(type, returnValue, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9]);\n}\n\nbool QxtBoundFunction::invoke(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_IMPL_10ARGS(QGenericArgument))\n{\n    return reinterpret_cast<QxtBoundFunctionBase*>(this)->invokeBase(type, returnValue, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);\n}\n\n#ifndef QXT_DOXYGEN_RUN\nclass QxtBoundSlot : public QxtBoundFunctionBase\n{\npublic:\n    QByteArray sig;\n\n    QxtBoundSlot(QObject* receiver, const char* invokable, QGenericArgument* params[10], QByteArray types[10]) : QxtBoundFunctionBase(receiver, params, types), sig(invokable)\n    {\n        // initializers only\n    }\n\n    virtual bool invokeImpl(Qt::ConnectionType type, QGenericReturnArgument returnValue, QXT_IMPL_10ARGS(QGenericArgument))\n    {\n        if (!QMetaObject::invokeMethod(parent(), QxtMetaObject::methodName(sig.constData()), type, returnValue, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10))\n        {\n            qWarning() << \"QxtBoundFunction: call to\" << sig << \"failed\";\n            return false;\n        }\n        return true;\n    }\n};\n#endif\n\nnamespace QxtMetaObject\n{\n\n    /*!\n        Returns the name of the given method.\n\n        Example usage:\n        \\code\n        QByteArray method = QxtMetaObject::methodName(\" int foo ( int bar, double baz )\");\n        // method is now \"foo\"\n        \\endcode\n     */\n    QByteArray methodName(const char* method)\n    {\n        QByteArray name = methodSignature(method);\n        const int idx = name.indexOf(\"(\");\n        if (idx != -1)\n            name.truncate(idx);\n        return name;\n    }\n\n    /*!\n        Returns the signature of the given method.\n     */\n    QByteArray methodSignature(const char* method)\n    {\n        QByteArray name = QMetaObject::normalizedSignature(method);\n        if(name[0] >= '0' && name[0] <= '9')\n            return name.mid(1);\n        return name;\n    }\n\n    /*!\n        Checks if \\a method contains parentheses and begins with 1 or 2.\n     */\n    bool isSignalOrSlot(const char* method)\n    {\n        QByteArray m(method);\n        return (m.count() && (m[0] >= '0' && m[0] <= '9') && m.contains('(') && m.contains(')'));\n    }\n\n    /*!\n     * Creates a binding to the provided signal, slot, or Q_INVOKABLE method using the\n     * provided parameter list. The type of each argument is deduced from the type of\n     * the QVariant. This function cannot bind positional arguments; see the\n     * overload using QGenericArgument.\n     *\n     * If the provided QObject does not implement the requested method, or if the\n     * argument list is incompatible with the method's function signature, this\n     * function returns NULL.\n     *\n     * The returned QxtBoundFunction is created as a child of the receiver.\n     * Changing the parent will result in undefined behavior.\n     *\n     * \\sa QxtMetaObject::connect, QxtBoundFunction\n     */\n    QxtBoundFunction* bind(QObject* recv, const char* invokable, QXT_IMPL_10ARGS(QVariant))\n    {\n        if (!recv)\n        {\n            qWarning() << \"QxtMetaObject::bind: cannot connect to null QObject\";\n            return 0;\n        }\n\n        QVariant* args[10] = { &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10 };\n        QByteArray connSlot(\"2\"), recvSlot(QMetaObject::normalizedSignature(invokable));\n        const QMetaObject* meta = recv->metaObject();\n        int methodID = meta->indexOfMethod(QxtMetaObject::methodSignature(recvSlot.constData()));\n        if (methodID == -1)\n        {\n            qWarning() << \"QxtMetaObject::bind: no such method \" << recvSlot;\n            return 0;\n        }\n        QMetaMethod method = meta->method(methodID);\n        int argCount = method.parameterTypes().count();\n        const QList<QByteArray> paramTypes = method.parameterTypes();\n\n        for (int i = 0; i < argCount; i++)\n        {\n            if (paramTypes[i] == \"QxtBoundArgument\") continue;\n            int type = QMetaType::type(paramTypes[i].constData());\n            if (!args[i]->canConvert((QVariant::Type)type))\n            {\n                qWarning() << \"QxtMetaObject::bind: incompatible parameter list for \" << recvSlot;\n                return 0;\n            }\n        }\n\n        return QxtMetaObject::bind(recv, invokable, QXT_ARG(1), QXT_ARG(2), QXT_ARG(3), QXT_ARG(4), QXT_ARG(5), QXT_ARG(6), QXT_ARG(7), QXT_ARG(8), QXT_ARG(9), QXT_ARG(10));\n    }\n\n    /*!\n     * Creates a binding to the provided signal, slot, or Q_INVOKABLE method using the\n     * provided parameter list. Use the Q_ARG macro to specify constant parameters, or\n     * use the QXT_BIND macro to relay a parameter from a connected signal or passed\n     * via the QxtBoundFunction::invoke() method.\n     *\n     * If the provided QObject does not implement the requested method, or if the\n     * argument list is incompatible with the method's function signature, this\n     * function returns NULL.\n     *\n     * The returned QxtBoundFunction is created as a child of the receiver.\n     * Changing the parent will result in undefined behavior.\n     *\n     * \\sa QxtMetaObject::connect, QxtBoundFunction, QXT_BIND\n     */\n    QxtBoundFunction* bind(QObject* recv, const char* invokable, QXT_IMPL_10ARGS(QGenericArgument))\n    {\n        if (!recv)\n        {\n            qWarning() << \"QxtMetaObject::bind: cannot connect to null QObject\";\n            return 0;\n        }\n\n        QGenericArgument* args[10] = { &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10 };\n        QByteArray connSlot(\"2\"), recvSlot(QMetaObject::normalizedSignature(invokable)), bindTypes[10];\n        const QMetaObject* meta = recv->metaObject();\n        int methodID = meta->indexOfMethod(QxtMetaObject::methodSignature(recvSlot.constData()).constData());\n        if (methodID == -1)\n        {\n            qWarning() << \"QxtMetaObject::bind: no such method \" << recvSlot;\n            return 0;\n        }\n        QMetaMethod method = meta->method(methodID);\n        int argCount = method.parameterTypes().count();\n\n        connSlot += QxtMetaObject::methodName(invokable) + '(';\n        for (int i = 0; i < 10; i++)\n        {\n            if (args[i]->name() == 0) break;        // done\n            if (i >= argCount)\n            {\n                qWarning() << \"QxtMetaObject::bind: too many arguments passed to \" << invokable;\n                return 0;\n            }\n            if (i > 0) connSlot += ',';             // argument separator\n            if (QByteArray(args[i]->name()) == \"QxtBoundArgument\")\n            {\n                Q_ASSERT_X((quintptr)(args[i]->data()) > 0 && (quintptr)(args[i]->data()) <= 10, \"QXT_BIND\", \"invalid argument number\");\n                connSlot += method.parameterTypes()[i];\n                bindTypes[i] = method.parameterTypes()[i];\n            }\n            else\n            {\n                connSlot += args[i]->name();        // type name\n            }\n        }\n        connSlot = QMetaObject::normalizedSignature(connSlot += ')');\n\n        if (!QMetaObject::checkConnectArgs(recvSlot.constData(), connSlot.constData()))\n        {\n            qWarning() << \"QxtMetaObject::bind: provided parameters \" << connSlot.mid(connSlot.indexOf('(')) << \" is incompatible with \" << invokable;\n            return 0;\n        }\n\n        return new QxtBoundSlot(recv, invokable, args, bindTypes);\n    }\n\n    /*!\n        Connects a signal to a QxtBoundFunction.\n     */\n    bool connect(QObject* sender, const char* signal, QxtBoundFunction* slot, Qt::ConnectionType type)\n    {\n        if (!sender)\n        {\n            qWarning() << \"Got connect() with a null sender!\";\n            return false;\n        }\n\n        const QMetaObject* meta = sender->metaObject();\n        int methodID = meta->indexOfMethod(meta->normalizedSignature(signal).mid(1).constData());\n        if (methodID < 0)\n        {\n            qWarning() << \"QxtMetaObject::connect: no such signal: \" << QByteArray(signal).mid(1);\n            return false;\n        }\n\n        return QMetaObject::connect(sender, methodID, slot, QObject::staticMetaObject.methodCount(), (int)(type));\n    }\n\n    /*!\n        \\relates QxtMetaObject\n        This overload always invokes the member using the connection type Qt::AutoConnection.\n\n        \\sa QMetaObject::invokeMethod()\n     */\n    bool invokeMethod(QObject* object, const char* member, const QVariant& arg0,\n                      const QVariant& arg1, const QVariant& arg2, const QVariant& arg3,\n                      const QVariant& arg4, const QVariant& arg5, const QVariant& arg6,\n                      const QVariant& arg7, const QVariant& arg8, const QVariant& arg9)\n    {\n        return invokeMethod(object, member, Qt::AutoConnection,\n                            arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);\n    }\n\n    /*!\n        \\relates QxtMetaObject\n\n        Invokes the \\a member (a signal or a slot name) on the \\a object.\n        Returns \\c true if the member could be invoked. Returns \\c false\n        if there is no such member or the parameters did not match.\n\n        \\sa QMetaObject::invokeMethod()\n     */\n    bool invokeMethod(QObject* object, const char* member, Qt::ConnectionType type,\n                      const QVariant& arg0, const QVariant& arg1, const QVariant& arg2,\n                      const QVariant& arg3, const QVariant& arg4, const QVariant& arg5,\n                      const QVariant& arg6, const QVariant& arg7, const QVariant& arg8, const QVariant& arg9)\n    {\n        #define QXT_MO_ARG(i) QGenericArgument(arg ## i.typeName(), arg ## i.constData())\n        return QMetaObject::invokeMethod(object, methodName(member), type,\n                                         QXT_MO_ARG(0), QXT_MO_ARG(1), QXT_MO_ARG(2), QXT_MO_ARG(3), QXT_MO_ARG(4),\n                                         QXT_MO_ARG(5), QXT_MO_ARG(6), QXT_MO_ARG(7), QXT_MO_ARG(8), QXT_MO_ARG(9));\n    }\n}\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtmetaobject.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtCore module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n#ifndef QXTMETAOBJECT_H\n#define QXTMETAOBJECT_H\n\n#include <QMetaObject>\n#include <QVariant>\n#include <QGenericArgument>\n#include <typeinfo>\n#include \"qxtnullable.h\"\n#include \"qxtglobal.h\"\nQT_FORWARD_DECLARE_CLASS(QByteArray)\nclass QxtBoundArgument;\nclass QxtBoundFunction;\n\n#define QXT_PROTO_10ARGS(T) T p1 = T(), T p2 = T(), T p3 = T(), T p4 = T(), T p5 = T(), T p6 = T(), T p7 = T(), T p8 = T(), T p9 = T(), T p10 = T()\n#define QXT_PROTO_9ARGS(T) T p2 = T(), T p3 = T(), T p4 = T(), T p5 = T(), T p6 = T(), T p7 = T(), T p8 = T(), T p9 = T(), T p10 = T()\n#define QXT_IMPL_10ARGS(T) T p1, T p2, T p3, T p4, T p5, T p6, T p7, T p8, T p9, T p10\n\nclass QXT_CORE_EXPORT QxtGenericFunctionPointer\n{\n    template<typename FUNCTION>\n    friend QxtGenericFunctionPointer qxtFuncPtr(FUNCTION funcPtr);\npublic:\n    QxtGenericFunctionPointer(const QxtGenericFunctionPointer& other)\n    {\n        funcPtr = other.funcPtr;\n        typeName = other.typeName;\n    }\n\n    typedef void(voidFunc)();\n    voidFunc* funcPtr;\n    QByteArray typeName;\n\nprotected:\n    QxtGenericFunctionPointer(voidFunc* ptr, const QByteArray& typeIdName)\n    {\n        funcPtr = ptr;\n        typeName = typeIdName;\n    }\n};\n\ntemplate<typename FUNCTION>\nQxtGenericFunctionPointer qxtFuncPtr(FUNCTION funcPtr)\n{\n    return QxtGenericFunctionPointer(reinterpret_cast<QxtGenericFunctionPointer::voidFunc*>(funcPtr), typeid(funcPtr).name());\n}\n\nnamespace QxtMetaObject\n{\n    QXT_CORE_EXPORT QByteArray methodName(const char* method);\n    QXT_CORE_EXPORT QByteArray methodSignature(const char* method);\n\n    QXT_CORE_EXPORT bool isSignalOrSlot(const char* method);\n\n    QXT_CORE_EXPORT QxtBoundFunction* bind(QObject* recv, const char* invokable, QXT_PROTO_10ARGS(QGenericArgument));\n    QXT_CORE_EXPORT QxtBoundFunction* bind(QObject* recv, const char* invokable, QVariant p1, QXT_PROTO_9ARGS(QVariant));\n    QXT_CORE_EXPORT bool connect(QObject* sender, const char* signal, QxtBoundFunction* slot,\n                                 Qt::ConnectionType type = Qt::AutoConnection);\n\n    QXT_CORE_EXPORT bool invokeMethod(QObject* object, const char* member,\n                           const QVariant& arg0 = QVariant(), const QVariant& arg1 = QVariant(),\n                           const QVariant& arg2 = QVariant(), const QVariant& arg3 = QVariant(),\n                           const QVariant& arg4 = QVariant(), const QVariant& arg5 = QVariant(),\n                           const QVariant& arg6 = QVariant(), const QVariant& arg7 = QVariant(),\n                           const QVariant& arg8 = QVariant(), const QVariant& arg9 = QVariant());\n\n    QXT_CORE_EXPORT bool invokeMethod(QObject* object, const char* member, Qt::ConnectionType type,\n                           const QVariant& arg0 = QVariant(), const QVariant& arg1 = QVariant(),\n                           const QVariant& arg2 = QVariant(), const QVariant& arg3 = QVariant(),\n                           const QVariant& arg4 = QVariant(), const QVariant& arg5 = QVariant(),\n                           const QVariant& arg6 = QVariant(), const QVariant& arg7 = QVariant(),\n                           const QVariant& arg8 = QVariant(), const QVariant& arg9 = QVariant());\n}\n\n/*!\n * \\relates QxtMetaObject\n * Refers to the n'th parameter of QxtBoundFunction::invoke() or of a signal connected to\n * a QxtBoundFunction.\n * \\sa QxtMetaObject::bind\n */\n#define QXT_BIND(n) QGenericArgument(\"QxtBoundArgument\", reinterpret_cast<void*>(n))\n\n#endif // QXTMETAOBJECT_H\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtmetatype.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtCore module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTMETATYPE_H\n#define QXTMETATYPE_H\n\n#include <QMetaType>\n#include <QDataStream>\n#include <QGenericArgument>\n#include <QtDebug>\n#include <qxtglobal.h>\n\ntemplate <typename T>\nclass /*QXT_CORE_EXPORT*/ QxtMetaType\n{\npublic:\n    static inline T* construct(const T* copy = 0)\n    {\n        return QMetaType::construct(qMetaTypeId<T>(), reinterpret_cast<const void*>(copy));\n    }\n\n    static inline void destroy(T* data)\n    {\n        QMetaType::destroy(qMetaTypeId<T>(), data);\n    }\n\n    // no need to reimplement isRegistered since this class will fail at compile time if it isn't\n\n    static inline bool load(QDataStream& stream, T* data)\n    {\n        return QMetaType::load(stream, qMetaTypeId<T>(), reinterpret_cast<void*>(data));\n    }\n\n    static inline bool save(QDataStream& stream, const T* data)\n    {\n        return QMetaType::save(stream, qMetaTypeId<T>(), reinterpret_cast<const void*>(data));\n    }\n\n    static inline int type()\n    {\n        return qMetaTypeId<T>();\n    }\n\n    static inline const char* name()\n    {\n        return QMetaType::typeName(qMetaTypeId<T>());\n    }\n};\n\ntemplate <>\nclass /*QXT_CORE_EXPORT*/ QxtMetaType<void>\n{\npublic:\n    static inline void* construct(const void* copy = 0)\n    {\n        Q_UNUSED(copy);\n        return 0;\n    }\n\n    static inline void destroy(void* data)\n    {\n        Q_UNUSED(data);\n    }\n\n    static inline bool load(QDataStream& stream, void* data)\n    {\n        Q_UNUSED(stream);\n        Q_UNUSED(data);\n        return false;\n    }\n\n    static inline bool save(QDataStream& stream, const void* data)\n    {\n        Q_UNUSED(stream);\n        Q_UNUSED(data);\n        return false;\n    }\n\n    static inline int type()\n    {\n        return 0;\n    }\n\n    static inline const char* name()\n    {\n        return 0;\n    }\n};\n\ninline void* qxtConstructByName(const char* typeName, const void* copy = 0)\n{\n    return QMetaType::construct(QMetaType::type(typeName), copy);\n}\n\ninline void qxtDestroyByName(const char* typeName, void* data)\n{\n    QMetaType::destroy(QMetaType::type(typeName), data);\n}\n\ninline void* qxtConstructFromGenericArgument(QGenericArgument arg)\n{\n    return qxtConstructByName(arg.name(), arg.data());\n}\n\ninline void qxtDestroyFromGenericArgument(QGenericArgument arg)\n{\n    qxtDestroyByName(arg.name(), arg.data());\n}\n\n#endif\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtnull.cpp",
    "content": "/****************************************************************************\r\n **\r\n ** Copyright (C) Qxt Foundation. Some rights reserved.\r\n **\r\n ** This file is part of the QxtCore module of the Qxt library.\r\n **\r\n ** This library is free software; you can redistribute it and/or modify it\r\n ** under the terms of the Common Public License, version 1.0, as published\r\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\r\n ** version 2.1, as published by the Free Software Foundation.\r\n **\r\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\r\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\r\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\r\n ** FITNESS FOR A PARTICULAR PURPOSE.\r\n **\r\n ** You should have received a copy of the CPL and the LGPL along with this\r\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\r\n ** included with the source distribution for more information.\r\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\r\n **\r\n ** <http://libqxt.org>  <foundation@libqxt.org>\r\n **\r\n ****************************************************************************/\r\n#include \"qxtnull.h\"\r\n\r\n// nothing here\r\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtnull.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtCore module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTNULL_H\n#define QXTNULL_H\n\n#include <qxtglobal.h>\n\n/*!\n\\class QxtNull QxtNull\n\n\\inmodule QxtCore\n\n\\brief An object representing the \"null\" value for QxtNullable.\n\n\\sa QxtNullable\n*/\n\nstruct QXT_CORE_EXPORT QxtNull\n{\n    /*! integer cast operator\n     * In expressions, QxtNull behaves as an integer zero for compatibility with generic functions.\n     */\n    operator int() const\n    {\n        return 0;\n    }\n    enum { isNull = true };\n};\n\n#ifndef QXT_NO_MACROS\n\n/*! \\relates QxtNull\n * A convenience alias for QxtNull().\n */\n#define QXT_NULL QxtNull()\n\n#endif // QXT_NO_MACROS\n\n#endif // QXTNULL_H\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtnullable.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtCore module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n/*!\n\\class QxtNullable QxtNullable\n\\inmodule QxtCore\n\\brief distinct null value compatible with any data type.\n\nin general it's a templated abstraction to allow any data type to be\nexpressed with a null value distinct from any real value. An example\nof such a use is for optional arguments.\n\\n\nprepare a function for argument skipping:\n\n\\code\nvoid  somefunction( qxtNull(int,a) , qxtNull(int,b) )\n{\n\nif (!a.isNull())\n {\n int i = a.value();\n //do something with i\n }\n if (!b.isNull())\n {\n int x = b.value();\n //do something with x\n }\n}\n\\endcode\n\nusage:\n\\code\n\nsomefunction(SKIP,1,2);\nsomefunction(3,4);\nsomefunction(3,SKIP,6);\nsomefunction(1);\n\\endcode\n\n*/\n\n#ifndef QXTNULLABLE_H\n#define QXTNULLABLE_H\n#include <qxtglobal.h>\n\n/*! \\relates QxtNullable\n * defines a skipable argument with type \\a t and variable name \\a n\n */\n#define qxtNull(t,n)   QxtNullable<t> n = QxtNullable<t>()\n\n#include <qxtnull.h>\n\ntemplate<typename T>\nclass /*QXT_CORE_EXPORT*/ QxtNullable\n{\npublic:\n    QxtNullable(QxtNull);\n    QxtNullable(const T& p);\n    QxtNullable();\n\n    ///determinates if the Value is set to something meaningfull\n    bool isNull() const;\n\n    ///delete Value\n    void nullify();\n\n    T& value() const;\n    operator T() const;\n    void operator=(const T& p);\n\nprivate:\n    T* val;\n};\n\ntemplate<typename T>\nQxtNullable<T>::QxtNullable(QxtNull)\n{\n    val = 0;\n}\n\ntemplate<typename T>\nQxtNullable<T>::QxtNullable(const T& p)\n{\n    val = const_cast<T*>(&p);\n}\n\ntemplate<typename T>\nQxtNullable<T>::QxtNullable()\n{\n    val = 0;\n}\n\ntemplate<typename T>\nQxtNullable<T>::operator T() const\n{\n    return *val;\n}\n\ntemplate<typename T>\nT& QxtNullable<T>::value() const\n{\n    return *val;\n}\n\ntemplate<typename T>\nbool QxtNullable<T>::isNull() const\n{\n    return (val == 0);\n}\n\ntemplate<typename T>\nvoid QxtNullable<T>::nullify()\n{\n    val = 0;\n}\n\ntemplate<typename T>\nvoid QxtNullable<T>::operator=(const T & p)\n{\n    val = const_cast<T*>(&p);\n}\n\n#endif\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtscgiserverconnector.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n/*!\n\\class QxtScgiServerConnector\n\n\\inmodule QxtWeb\n\n\\brief The QxtScgiServerConnector class provides an SCGI connector for QxtHttpSessionManager\n\n\nQxtScgiServerConnector implements the SCGI protocoll supported by almost all modern web servers.\n\n\n\n\\sa QxtHttpSessionManager\n*/\n#include \"qxthttpsessionmanager.h\"\n#include \"qxtwebevent.h\"\n#include <QTcpServer>\n#include <QHash>\n#include <QTcpSocket>\n#include <QString>\n\n#ifndef QXT_DOXYGEN_RUN\nclass QxtScgiServerConnectorPrivate : public QxtPrivate<QxtScgiServerConnector>\n{\npublic:\n    QTcpServer* server;\n};\n#endif\n\n/*!\n * Creates a QxtHttpServerConnector with the given \\a parent.\n */\nQxtScgiServerConnector::QxtScgiServerConnector(QObject* parent) : QxtAbstractHttpConnector(parent)\n{\n    QXT_INIT_PRIVATE(QxtScgiServerConnector);\n    qxt_d().server = new QTcpServer(this);\n    QObject::connect(qxt_d().server, SIGNAL(newConnection()), this, SLOT(acceptConnection()));\n}\n\n/*!\n * \\reimp\n */\nbool QxtScgiServerConnector::listen(const QHostAddress& iface, quint16 port)\n{\n    return qxt_d().server->listen(iface, port);\n}\n\n/*!\n * \\internal\n */\nvoid QxtScgiServerConnector::acceptConnection()\n{\n    QTcpSocket* socket = qxt_d().server->nextPendingConnection();\n    addConnection(socket);\n}\n\n/*!\n * \\reimp\n */\nbool QxtScgiServerConnector::canParseRequest(const QByteArray& buffer)\n{\n    if (buffer.size() < 10)\n        return false;\n    QString expectedsize;\n    for (int i = 0;i < 10;i++)\n    {\n        if (buffer.at(i) == ':')\n        {\n            break;\n        }\n        else\n        {\n            expectedsize += buffer.at(i);\n        }\n    }\n\n    if (expectedsize.isEmpty())\n    {\n        //protocoll error\n        return false;\n    }\n\n    return (buffer.size() > expectedsize.toInt());\n}\n\n/*!\n * \\reimp\n */\nQHttpRequestHeader QxtScgiServerConnector::parseRequest(QByteArray& buffer)\n{\n    QString expectedsize_s;\n    for (int i = 0;i < 20;i++)\n    {\n        if (buffer.at(i) == ':')\n        {\n            break;\n        }\n        else\n        {\n            expectedsize_s += buffer.at(i);\n        }\n    }\n\n    if (expectedsize_s.isEmpty())\n    {\n        //protocoll error\n        return QHttpRequestHeader();\n    }\n\n\n    buffer = buffer.right(buffer.size() - (expectedsize_s.count() + 1));\n\n\n    QHttpRequestHeader request_m;\n\n    QByteArray name;\n    int i = 0;\n    while ((i = buffer.indexOf('\\0')) > -1)\n    {\n        if (name.isEmpty())\n        {\n            name = buffer.left(i);\n        }\n        else\n        {\n            request_m.setValue(QString::fromAscii(name).toLower(), QString::fromAscii(buffer.left(i)));\n            name = \"\";\n        }\n        buffer = buffer.mid(i + 1);\n    }\n\n\n    request_m.setRequest(request_m.value(\"request_method\"), request_m.value(\"request_uri\"), 1, 0);\n\n\n    foreach(const QString& key, request_m.keys())\n    {\n        if (key.startsWith(QString(\"http_\")))\n        {\n            request_m.setValue(key.right(key.size() - 5), request_m.value(key));\n        }\n    }\n\n    request_m.setValue(\"Connection\", \"close\");\n\n\n    buffer.chop(1);\n\n\n    return request_m;\n}\n\n/*!\n * \\reimp\n */\nvoid QxtScgiServerConnector::writeHeaders(QIODevice* device, const QHttpResponseHeader& response_m)\n{\n\n    device->write((\"Status:\" + QString::number(response_m.statusCode()) + ' ' + response_m.reasonPhrase() + \"\\r\\n\").toAscii());\n\n    foreach(const QString& key, response_m.keys())\n    {\n        device->write((key + ':' + response_m.value(key) + \"\\r\\n\").toAscii());\n    }\n    device->write(\"\\r\\n\");\n}\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtweb.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n#ifndef QXTWEB_H_INCLUDED\n#define QXTWEB_H_INCLUDED\n\n#include \"qxtabstracthttpconnector.h\"\n#include \"qxtabstractwebservice.h\"\n#include \"qxtabstractwebsessionmanager.h\"\n#include \"qxtwebcgiservice.h\"\n#include \"qxthtmltemplate.h\"\n#include \"qxthttpsessionmanager.h\"\n#include \"qxtwebcontent.h\"\n#include \"qxtwebevent.h\"\n#include \"qxtwebservicedirectory.h\"\n#include \"qxtwebslotservice.h\"\n\n#endif // QXTWEB_H_INCLUDED\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n/*!\n\\class QxtWebCgiService\n\n\\inmodule QxtWeb\n\n\\brief The QxtWebCgiService class provides a CGI/1.1 gateway for QxtWeb\n\nTODO: write docs\nTODO: implement timeout\n*/\n\n#include \"qxtwebcgiservice.h\"\n#include \"qxtwebcgiservice_p.h\"\n#include \"qxtwebevent.h\"\n#include \"qxtwebcontent.h\"\n#include <QMap>\n#include <QFile>\n#include <QProcess>\n#include <QtDebug>\n\nQxtCgiRequestInfo::QxtCgiRequestInfo() : sessionID(0), requestID(0), eventSent(false), terminateSent(false) {}\nQxtCgiRequestInfo::QxtCgiRequestInfo(QxtWebRequestEvent* req) : sessionID(req->sessionID), requestID(req->requestID), eventSent(false), terminateSent(false) {}\n\n/*!\n * Constructs a QxtWebCgiService object with the specified session \\a manager and \\a parent.\n * This service will invoke the specified \\a binary to handle incoming requests.\n *\n * Often, the session manager will also be the parent, but this is not a requirement.\n */\nQxtWebCgiService::QxtWebCgiService(const QString& binary, QxtAbstractWebSessionManager* manager, QObject* parent) : QxtAbstractWebService(manager, parent)\n{\n    QXT_INIT_PRIVATE(QxtWebCgiService);\n    qxt_d().binary = binary;\n    QObject::connect(&qxt_d().timeoutMapper, SIGNAL(mapped(QObject*)), &qxt_d(), SLOT(terminateProcess(QObject*)));\n}\n\n/*!\n * Returns the path to the CGI script that will be executed to handle requests.\n *\n * \\sa setBinary()\n */\nQString QxtWebCgiService::binary() const\n{\n    return qxt_d().binary;\n}\n\n/*!\n * Sets the path to the CGI script \\a bin that will be executed to handle requests.\n *\n * \\sa binary()\n */\nvoid QxtWebCgiService::setBinary(const QString& bin)\n{\n    if (!QFile::exists(bin) || !(QFile::permissions(bin) & (QFile::ExeUser | QFile::ExeGroup | QFile::ExeOther)))\n    {\n        qWarning() << \"QxtWebCgiService::setBinary: \" + bin + \" does not appear to be executable.\";\n    }\n    qxt_d().binary = bin;\n}\n\n/*!\n * Returns the maximum time a CGI script may execute, in milliseconds.\n *\n * The default value is 0, which indicates that CGI scripts will not be terminated\n * due to long running times.\n *\n * \\sa setTimeout()\n */\nint QxtWebCgiService::timeout() const\n{\n    return qxt_d().timeout;\n}\n\n/*!\n * Sets the maximum \\a time a CGI script may execute, in milliseconds.\n *\n * The timer is started when the script is launched. After the timeout elapses once,\n * the script will be asked to stop, as QProcess::terminate(). (That is, the script\n * will receive WM_CLOSE on Windows or SIGTERM on UNIX.) If the process has still\n * failed to terminate after another timeout, it will be forcibly terminated, as\n * QProcess::kill(). (That is, the script will receive TerminateProcess on Windows\n * or SIGKILL on UNIX.)\n *\n * Set the timeout to 0 to disable this behavior; scripts will not be terminated\n * due to excessive run time. This is the default behavior.\n *\n * CAUTION: Keep in mind that the timeout applies to the real running time of the\n * script, not processor time used. A script that initiates a lengthy download \n * may be interrupted while transferring data to the web browser. To avoid this\n * behavior, see the timeoutOverride property to allow the script to request\n * an extended timeout, or use a different QxtAbstractWebService object for\n * serving streaming content or large files.\n *\n *\n * \\sa timeout(), timeoutOverride(), setTimeoutOverride(), QProcess::terminate(), QProcess::kill()\n */\nvoid QxtWebCgiService::setTimeout(int time)\n{\n    qxt_d().timeout = time;\n}\n\n/*!\n * Returns whether or not to allow scripts to override the timeout.\n *\n * \\sa setTimeoutOverride(), setTimeout()\n */\nbool QxtWebCgiService::timeoutOverride() const\n{\n    return qxt_d().timeoutOverride;\n}\n\n/*!\n * Sets whether or not to allow scripts to override the timeout.\n * Scripts are allowed to override if \\a enable is \\c true.\n *\n * As an extension to the CGI/1.1 gateway specification, a CGI script may\n * output a \"X-QxtWeb-Timeout\" header to change the termination timeout\n * on a per-script basis. Only enable this option if you trust the scripts\n * being executed.\n *\n * \\sa timeoutOverride(), setTimeout()\n */\nvoid QxtWebCgiService::setTimeoutOverride(bool enable)\n{\n    qxt_d().timeoutOverride = enable;\n}\n\n/*!\n * \\reimp\n */\nvoid QxtWebCgiService::pageRequestedEvent(QxtWebRequestEvent* event)\n{\n    // Create the process object and initialize connections\n    QProcess* process = new QProcess(this);\n    qxt_d().requests[process] = QxtCgiRequestInfo(event);\n    qxt_d().processes[event->content] = process;\n    QxtCgiRequestInfo& requestInfo = qxt_d().requests[process];\n    QObject::connect(process, SIGNAL(readyRead()), &qxt_d(), SLOT(processReadyRead()));\n    QObject::connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), &qxt_d(), SLOT(processFinished()));\n    QObject::connect(process, SIGNAL(error(QProcess::ProcessError)), &qxt_d(), SLOT(processFinished()));\n    requestInfo.timeout = new QTimer(process);\n    qxt_d().timeoutMapper.setMapping(requestInfo.timeout, process);\n    QObject::connect(requestInfo.timeout, SIGNAL(timeout()), &qxt_d().timeoutMapper, SLOT(map()));\n\n    // Initialize the system environment\n    QStringList s_env = process->systemEnvironment();\n    QMap<QString, QString> env;\n    foreach(const QString& entry, s_env)\n    {\n        int pos = entry.indexOf('=');\n        env[entry.left(pos)] = entry.mid(pos + 1);\n    }\n\n    // Populate CGI/1.1 environment variables\n    env[\"SERVER_SOFTWARE\"] = QString(\"QxtWeb/\" QXT_VERSION_STR);\n    env[\"SERVER_NAME\"] = event->url.host();\n    env[\"GATEWAY_INTERFACE\"] = \"CGI/1.1\";\n    if (event->headers.contains(\"X-Request-Protocol\"))\n        env[\"SERVER_PROTOCOL\"] = event->headers.value(\"X-Request-Protocol\");\n    else\n        env.remove(\"SERVER_PROTOCOL\");\n    if (event->url.port() != -1)\n        env[\"SERVER_PORT\"] = QString::number(event->url.port());\n    else\n        env.remove(\"SERVER_PORT\");\n    env[\"REQUEST_METHOD\"] = event->method;\n    env[\"PATH_INFO\"] = event->url.path();\n    env[\"PATH_TRANSLATED\"] = event->url.path(); // CGI/1.1 says we should resolve this, but we have no logical interpretation\n    env[\"SCRIPT_NAME\"] = event->originalUrl.path().remove(QRegExp(QRegExp::escape(event->url.path()) + '$'));\n    env[\"SCRIPT_FILENAME\"] = qxt_d().binary;    // CGI/1.1 doesn't define this but PHP demands it\n    env.remove(\"REMOTE_HOST\");\n    env[\"REMOTE_ADDR\"] = event->remoteAddress;\n    // TODO: If we ever support HTTP authentication, we should use these\n    env.remove(\"AUTH_TYPE\");\n    env.remove(\"REMOTE_USER\");\n    env.remove(\"REMOTE_IDENT\");\n    if (event->contentType.isEmpty())\n    {\n        env.remove(\"CONTENT_TYPE\");\n        env.remove(\"CONTENT_LENGTH\");\n    }\n    else\n    {\n        env[\"CONTENT_TYPE\"] = event->contentType;\n        env[\"CONTENT_LENGTH\"] = QString::number(event->content->unreadBytes());\n    }\n    env[\"QUERY_STRING\"] = event->url.encodedQuery();\n\n    // Populate HTTP header environment variables\n    QMultiHash<QString, QString>::const_iterator iter = event->headers.begin();\n    while (iter != event->headers.end())\n    {\n        QString key = \"HTTP_\" + iter.key().toUpper().replace('-', '_');\n        if (key != \"HTTP_CONTENT_TYPE\" && key != \"HTTP_CONTENT_LENGTH\")\n            env[key] = iter.value();\n        iter++;\n    }\n\n    // Populate HTTP_COOKIE parameter\n    iter = event->cookies.begin();\n    QString cookies;\n    while (iter != event->cookies.end())\n    {\n        if (!cookies.isEmpty())\n            cookies += \"; \";\n        cookies += iter.key() + '=' + iter.value();\n        iter++;\n    }\n    if (!cookies.isEmpty())\n        env[\"HTTP_COOKIE\"] = cookies;\n\n    // Load environment into process space\n    QStringList p_env;\n    QMap<QString, QString>::iterator env_iter = env.begin();\n    while (env_iter != env.end())\n    {\n        p_env << env_iter.key() + '=' + env_iter.value();\n        env_iter++;\n    }\n    process->setEnvironment(p_env);\n\n    // Launch process\n    if (event->url.hasQuery() && event->url.encodedQuery().contains('='))\n    {\n        // CGI/1.1 spec says to pass the query on the command line if there's no embedded = sign\n        process->start(qxt_d().binary + ' ' + QUrl::fromPercentEncoding(event->url.encodedQuery()), QIODevice::ReadWrite);\n    }\n    else\n    {\n        process->start(qxt_d().binary, QIODevice::ReadWrite);\n    }\n\n    // Start the timeout\n    if(qxt_d().timeout > 0)\n    {\n        requestInfo.timeout->start(qxt_d().timeout);\n    }\n\n    // Transmit POST data\n    if (event->content)\n    {\n        QObject::connect(event->content, SIGNAL(readyRead()), &qxt_d(), SLOT(browserReadyRead()));\n        qxt_d().browserReadyRead(event->content);\n    }\n}\n\n/*!\n * \\internal\n */\nvoid QxtWebCgiServicePrivate::browserReadyRead(QObject* o_content)\n{\n    if (!o_content) o_content = sender();\n    QxtWebContent* content = static_cast<QxtWebContent*>(o_content); // this is a private class, no worries about type safety\n\n    // Read POST data and copy it to the process\n    QByteArray data = content->readAll();\n    if (!data.isEmpty())\n        processes[content]->write(data);\n\n    // If no POST data remains unsent, clean up\n    if (!content->unreadBytes() && processes.contains(content))\n    {\n        processes[content]->closeWriteChannel();\n        processes.remove(content);\n    }\n}\n\n/*!\n * \\internal\n */\nvoid QxtWebCgiServicePrivate::processReadyRead()\n{\n    QProcess* process = static_cast<QProcess*>(sender());\n    QxtCgiRequestInfo& request = requests[process];\n\n    QByteArray line;\n    while (process->canReadLine())\n    {\n        // Read in a CGI/1.1 header line\n        line = process->readLine().replace(QByteArray(\"\\r\"), \"\"); //krazy:exclude=doublequote_chars\n        if (line == \"\\n\")\n        {\n            // An otherwise-empty line indicates the end of CGI/1.1 headers and the start of content\n            QObject::disconnect(process, SIGNAL(readyRead()), this, 0);\n            QxtWebPageEvent* event = 0;\n            int code = 200;\n            if (request.headers.contains(\"status\"))\n            {\n                // CGI/1.1 defines a \"Status:\" header that dictates the HTTP response code\n                code = request.headers[\"status\"].left(3).toInt();\n                if (code >= 300 && code < 400)  // redirect\n                {\n                    event = new QxtWebRedirectEvent(request.sessionID, request.requestID, request.headers[\"location\"], code);\n                }\n            }\n            // If a previous header (currently just status) hasn't created an event, create a normal page event here\n            if (!event)\n            {\n                event = new QxtWebPageEvent(request.sessionID, request.requestID, QSharedPointer<QIODevice>(process) );\n                event->status = code;\n            }\n            // Add other response headers passed from CGI (currently only Content-Type is supported)\n            if (request.headers.contains(\"content-type\"))\n                event->contentType = request.headers[\"content-type\"].toUtf8();\n            // TODO: QxtWeb doesn't support transmitting arbitrary HTTP headers right now, but it may be desirable\n            // for applications that know what kind of server frontend they're using to allow scripts to send\n            // protocol-specific headers.\n            \n            // Post the event\n            qxt_p().postEvent(event);\n            request.eventSent = true;\n            return;\n        }\n        else\n        {\n            // Since we haven't reached the end of headers yet, parse a header\n            int pos = line.indexOf(\": \");\n            QByteArray hdrName = line.left(pos).toLower();\n            QByteArray hdrValue = line.mid(pos + 2).replace(QByteArray(\"\\n\"), \"\"); //krazy:exclude=doublequote_chars\n            if (hdrName == \"set-cookie\")\n            {\n                // Parse a new cookie and post an event to send it to the client\n                QList<QByteArray> cookies = hdrValue.split(',');\n                foreach(const QByteArray& cookie, cookies)\n                {\n                    int equals = cookie.indexOf(\"=\");\n                    int semi = cookie.indexOf(\";\");\n                    QByteArray cookieName = cookie.left(equals);\n                    int age = cookie.toLower().indexOf(\"max-age=\", semi);\n                    int secs = -1;\n                    if (age >= 0)\n                        secs = cookie.mid(age + 8, cookie.indexOf(\";\", age) - age - 8).toInt();\n                    if (secs == 0)\n                    {\n                        qxt_p().postEvent(new QxtWebRemoveCookieEvent(request.sessionID, cookieName));\n                    }\n                    else\n                    {\n                        QByteArray cookieValue = cookie.mid(equals + 1, semi - equals - 1);\n                        QDateTime cookieExpires;\n                        if (secs != -1)\n                            cookieExpires = QDateTime::currentDateTime().addSecs(secs);\n                        qxt_p().postEvent(new QxtWebStoreCookieEvent(request.sessionID, cookieName, cookieValue, cookieExpires));\n                    }\n                }\n            }\n            else if(hdrName == \"x-qxtweb-timeout\")\n            {\n                if(timeoutOverride)\n                    request.timeout->setInterval(hdrValue.toInt());\n            }\n            else\n            {\n                // Store other headers for later inspection\n                request.headers[hdrName] = hdrValue;\n            }\n        }\n    }\n}\n\n/*!\n * \\internal\n */\nvoid QxtWebCgiServicePrivate::processFinished()\n{\n    QProcess* process = static_cast<QProcess*>(sender());\n    QxtCgiRequestInfo& request = requests[process];\n\n    if (!request.eventSent)\n    {\n        // If no event was posted, issue an internal error\n        qxt_p().postEvent(new QxtWebErrorEvent(request.sessionID, request.requestID, 500, \"Internal Server Error\"));\n    }\n\n    // Clean up data structures\n    process->close();\n    QxtWebContent* key = processes.key(process);\n    if (key) processes.remove(key);\n    timeoutMapper.removeMappings(request.timeout);\n    requests.remove(process);\n}\n\n/*!\n * \\internal\n */\nvoid QxtWebCgiServicePrivate::terminateProcess(QObject* o_process)\n{\n    QProcess* process = static_cast<QProcess*>(o_process);\n    QxtCgiRequestInfo& request = requests[process];\n\n    if(request.terminateSent)\n    {\n        // kill with fire\n        process->kill();\n    }\n    else\n    {\n        // kill nicely\n        process->terminate();\n        request.terminateSent = true;\n    }\n}\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTWEBCGISERVICE_H\n#define QXTWEBCGISERVICE_H\n\n#include <QObject>\n#include <qxtglobal.h>\n#include \"qxtabstractwebsessionmanager.h\"\n#include \"qxtabstractwebservice.h\"\nclass QxtWebEvent;\nclass QxtWebRequestEvent;\n\nclass QxtWebCgiServicePrivate;\nclass QXT_WEB_EXPORT QxtWebCgiService : public QxtAbstractWebService\n{\n    Q_OBJECT\npublic:\n    QxtWebCgiService(const QString& binary, QxtAbstractWebSessionManager* manager, QObject* parent = 0);\n\n    QString binary() const;\n    void setBinary(const QString& bin);\n\n    int timeout() const;\n    void setTimeout(int time);\n\n    bool timeoutOverride() const;\n    void setTimeoutOverride(bool enable);\n\n    virtual void pageRequestedEvent(QxtWebRequestEvent* event);\n\nprivate:\n    QXT_DECLARE_PRIVATE(QxtWebCgiService)\n};\n\n#endif // QXTWEBCGISERVICE_H\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice_p.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTWEBCGISERVICE_P_H\n#define QXTWEBCGISERVICE_P_H\n\n#include \"qxtwebcgiservice.h\"\n#include <QString>\n#include <QHash>\n#include <QPair>\n#include <QTimer>\n#include <QSignalMapper>\n\n#ifndef QXT_DOXYGEN_RUN\nQT_FORWARD_DECLARE_CLASS(QProcess)\nclass QxtWebContent;\n\nstruct QxtCgiRequestInfo\n{\n    QxtCgiRequestInfo();\n    QxtCgiRequestInfo(QxtWebRequestEvent* req);\n    int sessionID, requestID;\n    QHash<QString, QString> headers;\n    bool eventSent, terminateSent;\n    QTimer* timeout;\n};\n\nclass QxtWebCgiServicePrivate : public QObject, public QxtPrivate<QxtWebCgiService>\n{\n    Q_OBJECT\npublic:\n    QXT_DECLARE_PUBLIC(QxtWebCgiService)\n\n    QHash<QProcess*, QxtCgiRequestInfo> requests;\n    QHash<QxtWebContent*, QProcess*> processes;\n    QString binary;\n    int timeout;\n    bool timeoutOverride;\n    QSignalMapper timeoutMapper;\n\npublic Q_SLOTS:\n    void browserReadyRead(QObject* o_content = 0);\n    void processReadyRead();\n    void processFinished();\n    void terminateProcess(QObject* o_process);\n};\n#endif // QXT_DOXYGEN_RUN\n\n#endif // QXTWEBSERVICEDIRECTORY_P_H\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtwebcontent.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n/*!\n\\class QxtWebContent\n\n\\inmodule QxtWeb\n\n\\brief The QxtWebContent class provides and I/O device for data sent by the web browser\n\nQxtWebContent is a read-only QIODevice subclass that encapsulates data sent\nfrom the web browser, for instance in a POST or PUT request.\n\nIn order to avoid delays while reading content sent from the client, and to\ninsulate multiple pipelined requests on the same connection from each other,\nQxtWeb uses QxtWebContent as an abstraction for streaming data.\n\n\\sa QxtAbstractWebService\n*/\n\n#include \"qxtwebcontent.h\"\n#include <string.h>\n#include <QUrl>\n\n#ifndef QXT_DOXYGEN_RUN\nclass QxtWebContentPrivate : public QxtPrivate<QxtWebContent>\n{\npublic:\n    QxtWebContentPrivate() : ignoreRemaining(false) {}\n    QXT_DECLARE_PUBLIC(QxtWebContent)\n\n    void init(int contentLength, const QByteArray& start, QIODevice* device)\n    {\n        this->start = start;\n        this->device = device;\n        if (contentLength <= 0)\n            bytesRemaining = -1;\n        else\n            bytesRemaining = contentLength - start.length();\n        if (device)\n        {\n            QObject::connect(device, SIGNAL(readyRead()), &qxt_p(), SIGNAL(readyRead()));\n            // QObject::connect(device, SIGNAL(aboutToClose()), this, SIGNAL(aboutToClose()));\n            // QObject::connect(device, SIGNAL(destroyed()), this, SIGNAL(aboutToClose()));\n            // ask the object if it has an error signal\n            if (device->metaObject()->indexOfSignal(QMetaObject::normalizedSignature(SIGNAL(error(QAbstractSocket::SocketError)))) >= 0)\n            {\n                QObject::connect(device, SIGNAL(error(QAbstractSocket::SocketError)), &qxt_p(), SLOT(errorReceived(QAbstractSocket::SocketError)));\n            }\n        }\n        qxt_p().setOpenMode(QIODevice::ReadOnly);\n    }\n\n    qint64 bytesRemaining;\n    QByteArray start;\n    QIODevice* device;\n    bool ignoreRemaining;\n};\n#endif\n\n/*!\n * Constructs a QxtWebContent object.\n *\n * The content provided by this constructor is the first \\a contentLength bytes\n * read from the provided \\a device.\n *\n * The QxtWebContent object is parented to the \\a device.\n */\nQxtWebContent::QxtWebContent(int contentLength, QIODevice* device) : QIODevice(device)\n{\n    QXT_INIT_PRIVATE(QxtWebContent);\n    qxt_d().init(contentLength, QByteArray(), device);\n}\n\n/*!\n * Constructs a QxtWebContent object.\n *\n * The content provided by this constructor is the data contained in \\a start,\n * followed by enough data read from the provided \\a device to fill the desired\n * \\a contentLength.\n *\n * The QxtWebContent object is parented to the \\a device.\n */\nQxtWebContent::QxtWebContent(int contentLength, const QByteArray& start, QIODevice* device) : QIODevice(device)\n{\n    QXT_INIT_PRIVATE(QxtWebContent);\n    qxt_d().init(contentLength, start, device);\n}\n\n/*!\n * Constructs a QxtWebContent object with the specified \\a parent.\n *\n * The content provided by this constructor is exactly the data contained in\n * \\a content.\n */\nQxtWebContent::QxtWebContent(const QByteArray& content, QObject* parent) : QIODevice(parent)\n{\n    QXT_INIT_PRIVATE(QxtWebContent);\n    qxt_d().init(content.size(), content, 0);\n}\n\n/*!\n * \\reimp\n */\nqint64 QxtWebContent::bytesAvailable() const\n{\n    qint64 available = QIODevice::bytesAvailable() + (qxt_d().device ? qxt_d().device->bytesAvailable() : 0) + qxt_d().start.count();\n    if (available > qxt_d().bytesRemaining)\n        return qxt_d().bytesRemaining;\n    return available;\n}\n\n/*!\n * \\reimp\n */\nqint64 QxtWebContent::readData(char* data, qint64 maxSize)\n{\n    char* writePtr = data;\n    // read more than 32k; TCP ideally handles 48k blocks but we need wiggle room\n    if (maxSize > 32768) maxSize = 32768;\n\n    // don't read more than the content-length\n    int sz = qxt_d().start.count();\n    if (sz > 0 && maxSize > sz)\n    {\n        memcpy(writePtr, qxt_d().start.constData(), sz);\n        writePtr += sz;\n        maxSize -= sz;\n        qxt_d().start.clear();\n    }\n    else if (sz > 0 && sz > maxSize)\n    {\n        memcpy(writePtr, qxt_d().start.constData(), maxSize);\n        qxt_d().start = qxt_d().start.mid(maxSize);\n        return maxSize;\n    }\n\n    if (qxt_d().device == 0)\n    {\n        return sz;\n    }\n    else if (qxt_d().bytesRemaining >= 0)\n    {\n        qint64 readBytes = qxt_d().device->read(writePtr, (maxSize > qxt_d().bytesRemaining) ? qxt_d().bytesRemaining : maxSize);\n        qxt_d().bytesRemaining -= readBytes;\n        if (qxt_d().bytesRemaining == 0) QMetaObject::invokeMethod(this, \"aboutToClose\", Qt::QueuedConnection);\n        return sz + readBytes;\n    }\n    else\n    {\n        return sz + qxt_d().device->read(writePtr, maxSize);\n    }\n}\n\n/*!\n * Returns the number of bytes of content that have not yet been read.\n *\n * Note that not all of the remaining content may be immediately available for\n * reading. This function returns the content length, minus the number of\n * bytes that have already been read.\n */\nqint64 QxtWebContent::unreadBytes() const\n{\n    return qxt_d().start.size() + qxt_d().bytesRemaining;\n}\n\n/*!\n * \\reimp\n */\nqint64 QxtWebContent::writeData(const char*, qint64)\n{\n    // always an error to write\n    return -1;\n}\n\n/*!\n * \\internal\n */\nvoid QxtWebContent::errorReceived(QAbstractSocket::SocketError)\n{\n    setErrorString(qxt_d().device->errorString());\n}\n\n/*!\n * Blocks until all of the streaming data has been read from the browser.\n *\n * Note that this function will block events for the thread on which it is called.\n * If the main thread is blocked, QxtWeb will be unable to process additional\n * requests until the content has been received.\n */\nvoid QxtWebContent::waitForAllContent()\n{\n    if (!qxt_d().device) return;\n    QByteArray buffer;\n    while (qxt_d().device && qxt_d().bytesRemaining > 0)\n    {\n        buffer = qxt_d().device->readAll();\n        qxt_d().start += buffer;\n        qxt_d().bytesRemaining -= buffer.size();\n        if (qxt_d().bytesRemaining > 0) qxt_d().device->waitForReadyRead(-1);\n    }\n}\n\n/*!\n * Discards any data not yet read.\n *\n * After invoking this function, any further data received from the browser\n * is silently discarded.\n */\nvoid QxtWebContent::ignoreRemainingContent()\n{\n    if (qxt_d().bytesRemaining <= 0 || !qxt_d().device) return;\n    if (!qxt_d().ignoreRemaining)\n    {\n        qxt_d().ignoreRemaining = true;\n        QObject::connect(qxt_d().device, SIGNAL(readyRead()), this, SLOT(ignoreRemainingContent()));\n    }\n}\n\n#ifndef QXT_DOXYGEN_RUN\ntypedef QPair<QString, QString> QxtQueryItem;\n#endif\n\n/*!\n * Extracts the key/value pairs from application/x-www-form-urlencoded \\a data,\n * such as the query string from the URL or the form data from a POST request.\n */\nQHash<QString, QString> QxtWebContent::parseUrlEncodedQuery(const QString& data)\n{\n    QUrl post(\"/?\" + data);\n    QHash<QString, QString> rv;\n    foreach(const QxtQueryItem& item, post.queryItems())\n    {\n        rv.insertMulti(item.first, item.second);\n    }\n    return rv;\n}\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtwebcontent.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTWEBCONTENT_H\n#define QXTWEBCONTENT_H\n\n#include <QAbstractSocket>\n#include <QByteArray>\n#include <QHash>\n#include <qxtglobal.h>\n\nclass QxtWebContentPrivate;\nclass QXT_WEB_EXPORT QxtWebContent : public QIODevice\n{\n    Q_OBJECT\npublic:\n    QxtWebContent(int contentLength, const QByteArray& start, QIODevice* device);\n    QxtWebContent(int contentLength, QIODevice* device);\n    explicit QxtWebContent(const QByteArray& content, QObject* parent = 0);\n    static QHash<QString, QString> parseUrlEncodedQuery(const QString& data);\n\n    virtual qint64 bytesAvailable() const;\n    qint64 unreadBytes() const;\n\n    void waitForAllContent();\n\npublic Q_SLOTS:\n    void ignoreRemainingContent();\n\nprotected:\n    virtual qint64 readData(char* data, qint64 maxSize);\n    virtual qint64 writeData(const char* data, qint64 maxSize);\n\nprivate Q_SLOTS:\n    void errorReceived(QAbstractSocket::SocketError);\n\nprivate:\n    QXT_DECLARE_PRIVATE(QxtWebContent)\n};\n\n#endif // QXTWEBCONTENT_H\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtwebevent.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#include \"qxtwebevent.h\"\n#include \"qxtwebcontent.h\"\n#include <QBuffer>\n\n/*!\n\\class QxtWebEvent\n\n\\inmodule QxtWeb\n\n\\brief The QxtWebEvent class is a base class of all QxtWeb event types\n\nQxtWebEvent is the base class for all QxtWeb event classes. Event objects\ncontain event parameters.\n\nThe base QxtWebEvent class contains the type of the event and a session ID for\nthe session it relates to. Subclasses of QxtWebEvent contain additional\nparameters describing the particular event.\n*/\n\n/*!\n    \\enum QxtWebEvent::EventType\n\n    \\value None Not an event.\n    \\value Request A request event.\n    \\value FileUpload A file upload event.\n    \\value Page A page event.\n    \\value StoreCookie A store cookie event.\n    \\value RemoveCookie A remove cookie event.\n    \\value Redirect A redirect event.\n*/\n\n/*!\n * Constructs a QxtWebEvent of the specified \\a type for the specified \\a sessionID.\n */\nQxtWebEvent::QxtWebEvent(EventType type, int sessionID)\n        : sessionID(sessionID), m_type(type) {}\n\n/*!\n * Destroys the event.\n */\nQxtWebEvent::~QxtWebEvent() {}\n\n/*!\n * \\fn EventType QxtWebEvent::type() const\n * Returns the event type.\n */\n\n/*!\n * \\variable QxtWebEvent::sessionID\n * Contains the ID of the session the event is related to.\n */\n\n/*!\n\\class QxtWebRequestEvent\n\n\\inmodule QxtWeb\n\n\\brief The QxtWebRequestEvent class describes a request from a web browser\n\nThe QxtWebRequestEvent class contains information about a request from a web\nbrowser.\n*/\n\n/*!\n * Constructs a QxtWebRequestEvent for the specified \\a sessionID, \\a requestID and \\a url.\n */\nQxtWebRequestEvent::QxtWebRequestEvent(int sessionID, int requestID, const QUrl& url)\n        : QxtWebEvent(QxtWebEvent::Request, sessionID), requestID(requestID), url(url), originalUrl(url) {}\n\n/*!\n * Destroys the event and any content that may still be associated with it.\n */\nQxtWebRequestEvent::~QxtWebRequestEvent()\n{\n    if (content) delete content;\n}\n\n/*!\n * \\variable QxtWebRequestEvent::requestID\n * Contains an opaque value generated by the session manager. This request ID\n * must be included in the QxtWebPageEvent or QxtWebPageEvent subclass that\n * is the response to the request.\n */\n\n/*!\n * \\variable QxtWebRequestEvent::url\n * Contains the request URL, possibly after rewriting by intermediate services\n * such as QxtWebServiceDirectory.\n */\n\n/*!\n * \\variable QxtWebRequestEvent::originalUrl\n * Contains the request URL exactly as it was sent from the web browser.\n */\n\n/*!\n * \\variable QxtWebRequestEvent::contentType\n * Contains the MIME type of the request body, if present.\n */\n\n/*!\n * \\variable QxtWebRequestEvent::content\n * Contains the content of the request body, if present.\n */\n\n/*!\n * \\variable QxtWebRequestEvent::cookies\n * Contains all of the cookies sent by the web browser.\n */\n\n/*!\n * \\variable QxtWebRequestEvent::headers\n * Contains all of the headers sent by the web browser.\n *\n * Note that use of these values may not be portable across session maangers.\n */\n\n/*\nQxtWebFileUploadEvent::QxtWebFileUploadEvent(int sessionID)\n: QxtWebEvent(QxtWebEvent::FileUpload, sessionID) {}\n*/\n\n/*!\n\\class QxtWebErrorEvent\n\n\\inmodule QxtWeb\n\n\\brief The QxtWebErrorEvent class describes an error condition to be sent to a web browser\n\nThe QxtWebErrorEvent class contains information about an error that will be\nsent to a web browser.\n\nQxtWebErrorEvent is a QxtWebPageEvent, so the \\a dataSource may be replaced\nwith a custom error page. If you choose to do this, be sure to delete the\noriginal data source automatically generated by the constructor first.\n*/\n\n/*!\n * Constructs a QxtWebErrorEvent for the specified \\a sessionID and \\a requestID,\n * with the provided \\a statusCode and \\a statusMessage.\n *\n * The requestID is an opaque value generated by the session manager; services\n * will receive this value via QxtWebRequestEvent and must use it in every\n * event that responds to that request.\n */\nQxtWebErrorEvent::QxtWebErrorEvent(int sessionID, int requestID, int statusCode, QByteArray statusMessage)\n        : QxtWebPageEvent(sessionID, requestID, \"<html><body><h1>\" + statusMessage + \"</h1></body></html>\\r\\n\")\n{\n    status = statusCode;\n    QxtWebPageEvent::statusMessage = statusMessage;\n}\n\n/*!\n\\class QxtWebPageEvent\n\n\\inmodule QxtWeb\n\n\\brief The QxtWebPageEvent class describes a web page or other content to be sent to a web browser\n\nThe QxtWebPageEvent class contains information about a web page or other similar\ncontent that will be sent to a web browser.\n*/\n\n/*!\n * Constructs a QxtWebPageEvent for the specified \\a sessionID and \\a requestID that will\n * use the data from \\a source as the content to be sent to the web browser.\n *\n * The requestID is an opaque value generated by the session manager; services\n * will receive this value via QxtWebRequestEvent and must use it in every\n * event that responds to that request.\n *\n * QxtWeb takes ownership of the source and will delete it when the response\n * is completed.\n */\nQxtWebPageEvent::QxtWebPageEvent(int sessionID, int requestID, QSharedPointer<QIODevice> source)\n        : QxtWebEvent(QxtWebEvent::Page, sessionID), dataSource(source), chunked(true), streaming(true), requestID(requestID),\n        status(200), statusMessage(\"OK\"), contentType(\"text/html\") {}\n\n/*!\n * Constructs a QxtWebPageEvent for the specified \\a sessionID and \\a requestID that will\n * use \\a source as the content to be sent to the web browser.\n *\n * The requestID is an opaque value generated by the session manager; services\n * will receive this value via QxtWebRequestEvent and must use it in every\n * event that responds to that request.\n */\nQxtWebPageEvent::QxtWebPageEvent(int sessionID, int requestID, QByteArray source)\n        : QxtWebEvent(QxtWebEvent::Page, sessionID), chunked(false), streaming(false), requestID(requestID),\n        status(200), statusMessage(\"OK\"), contentType(\"text/html\")\n{\n    QBuffer* buffer = new QBuffer;\n    buffer->setData(source);\n    buffer->open(QIODevice::ReadOnly);\n    dataSource = QSharedPointer<QIODevice>( buffer );\n}\n\n/*!\n * \\internal\n */\nQxtWebPageEvent::QxtWebPageEvent(QxtWebEvent::EventType typeOverride, int sessionID, int requestID, QByteArray source)\n        : QxtWebEvent(typeOverride, sessionID), chunked(false), streaming(false), requestID(requestID),\n        status(200), statusMessage(\"OK\"), contentType(\"text/html\")\n{\n    QBuffer* buffer = new QBuffer;\n    buffer->setData(source);\n    buffer->open(QIODevice::ReadOnly);\n    dataSource = QSharedPointer<QIODevice>( buffer );\n}\n\n/*!\n * Destroys the event\n */\nQxtWebPageEvent::~QxtWebPageEvent()\n{\n\n}\n\n/*!\n * \\variable QxtWebPageEvent::dataSource\n * Data will be read from this device and relayed to the web browser.\n */\n\n/*!\n * \\variable QxtWebPageEvent::chunked\n * If true, and if the web browser supports \"chunked\" encoding, the content\n * will be sent using \"chunked\" encoding. If false, or if the browser does not\n * support this encoding (for instance, HTTP/0.9 and HTTP/1.0 user agents),\n * HTTP keep-alive will be disabled.\n *\n * The default value is true when using the QIODevice* constructor and false\n * when using the QByteArray constructor.\n */\n\n/*!\n * \\variable QxtWebPageEvent::streaming\n * If true, the data source is considered to be a source of streaming data.\n * The QIODevice must emit the readyRead() signal when data is available and\n * must emit aboutToClose() after all data has been transferred. (This can\n * be accomplished by invoking QIODevice::close() on it after all data is\n * determined to have been transferred.)\n *\n * The default value is true when using the QIODevice* constructor and false\n * when using the QByteArray constructor. If using a QIODevice that does not\n * produce streaming data, such as QFile, this \\a must be set to false to\n * ensure correct behavior.\n */\n\n/*!\n * \\variable QxtWebPageEvent::requestID\n * Contains the opaque requestID provided by QxtWebRequestEvent.\n */\n\n/*!\n * \\variable QxtWebPageEvent::status\n * Contains the HTTP status code that will be sent with the response.\n *\n * The default value is 200 (\"OK\").\n */\n\n/*!\n * \\variable QxtWebPageEvent::statusMessage\n * Contains the human-readable message associated with the HTTP status code\n * that will be sent with the response.\n *\n * The default value is \"OK\".\n */\n\n/*!\n * \\variable QxtWebPageEvent::contentType\n * Contains the MIME type of the content being sent to the web browser.\n *\n * The default value is \"text/html\".\n */\n\n/*!\n * \\variable QxtWebPageEvent::headers\n * Contains custom headers to be sent to the web browser.\n *\n * It is empty by default.\n */\n\n/*!\n\\class QxtWebStoreCookieEvent\n\n\\inmodule QxtWeb\n\n\\brief The QxtWebStoreCookieEvent class describes a cookie to be sent to a web browser\n\nThe QxtWebStoreCookieEvent class instructs the session manager to store\na cookie on the web browser.\n*/\n\n/*!\n * Constructs a QxtWebStoreCookieEvent for the specified \\a sessionID that will\n * store a cookie with the specified \\a name and \\a data on the web browser.\n *\n * If an \\a expiration date is supplied, it will be passed to the browser along\n * with the cookie. The browser will delete the cookie automatically after\n * the specified date. If an expiration date is not supplied, the cookie will\n * expire when the browser is closed.\n */\nQxtWebStoreCookieEvent::QxtWebStoreCookieEvent(int sessionID, QString name, QString data, QDateTime expiration)\n        : QxtWebEvent(QxtWebEvent::StoreCookie, sessionID), name(name), data(data), expiration(expiration) {}\n\n/*!\n * \\variable QxtWebStoreCookieEvent::name\n * Contains the name of the cookie to be stored.\n */\n\n/*!\n * \\variable QxtWebStoreCookieEvent::data\n * Contains the content of the cookie to be stored.\n */\n\n/*!\n * \\variable QxtWebStoreCookieEvent::expiration\n * Contains the expiration date of the cookie to be stored. If null, the\n * cookie will expire when the web browser is closed.\n */\n\n/*!\n\\class QxtWebRemoveCookieEvent\n\n\\inmodule QxtWeb\n\n\\brief The QxtWebRemoveCookieEvent class describes a cookie to be deleted from a web browser\n\nThe QxtWebStoreCookieEvent class instructs the session manager to remove\na cookie stored on the web browser.\n*/\n\n/*!\n * Constructs a QxtWebRemoveCookieEvent for the specified \\a sessionID that\n * removed the cookie with \\a name from the web browser.\n */\nQxtWebRemoveCookieEvent::QxtWebRemoveCookieEvent(int sessionID, QString name)\n        : QxtWebEvent(QxtWebEvent::RemoveCookie, sessionID), name(name) {}\n\n/*!\n * \\variable QxtWebRemoveCookieEvent::name\n * Contains the name of the cookie to be removed.\n */\n\n/*!\n\\class QxtWebRedirectEvent\n\n\\inmodule QxtWeb\n\n\\brief The QxtWebRedirectEvent class describes a redirect event to be sent to a web browser\n\nThe QxtWebRedirectEvent class instructs the web browser to load a page found at\nanother location.\n\nThe default status code, 302, indicates that the requested page was found at\na different location. Other useful status codes are 301, which indicates\nthat the web browser should always use the new URL in place of the old one,\nand (in HTTP/1.1) 307, which indicates that the web browser should reissue\nthe same request (including POST data) to the new URL.\n*/\n\n/*!\n * Constructs a QxtWebRedirectEvent for the specified \\a sessionID and \\a requestID that\n * instructs the browser to move to the specified \\a destination URL with \\a statusCode.\n */\nQxtWebRedirectEvent::QxtWebRedirectEvent(int sessionID, int requestID, const QString& destination, int statusCode)\n        : QxtWebPageEvent(QxtWebEvent::Redirect, sessionID, requestID, QString(\"Redirect: <a href='%1'>%1</a>\").arg(destination).toUtf8()), destination(destination)\n{\n    QxtWebPageEvent::status = statusCode;\n    QxtWebPageEvent::statusMessage = (\"Redirect to \" + destination).toUtf8();\n}\n\n/*!\n * \\variable QxtWebRedirectEvent::destination\n * Contains the new location (absolute or relative) to which the browser\n * should redirect.\n */\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtwebevent.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTWEBEVENT_H\n#define QXTWEBEVENT_H\n\n#include <qxtglobal.h>\n#include <QString>\n#include <QByteArray>\n#include <QStringList>\n#include <QPointer>\n#include <QUrl>\n#include <QMultiHash>\n#include <QDateTime>\nQT_FORWARD_DECLARE_CLASS(QIODevice)\nclass QxtWebContent;\n\nclass QXT_WEB_EXPORT QxtWebEvent\n{\npublic:\n    enum EventType\n    {\n        None = 0,\n        Request,\n        FileUpload,\n        Page,\n        StoreCookie,\n        RemoveCookie,\n        Redirect\n    };\n\n    QxtWebEvent(EventType type, int sessionID);\n    virtual ~QxtWebEvent();\n\n    inline EventType type() const\n    {\n        return m_type;\n    }\n    const int sessionID;\n\nprivate:\n    EventType m_type;\n};\n\nclass QXT_WEB_EXPORT QxtWebRequestEvent : public QxtWebEvent\n{\npublic:\n    QxtWebRequestEvent(int sessionID, int requestID, const QUrl& url);\n    ~QxtWebRequestEvent();\n\n    const int requestID;\n\n    QUrl url;\n    const QUrl originalUrl;\n    QString contentType;\n    QPointer<QxtWebContent> content;\n    QString method;\n    QString remoteAddress;\n\n    QMultiHash<QString, QString> cookies;\n    QMultiHash<QString, QString> headers;\n};\n\n/* TODO: refactor and implement\nclass QXT_WEB_EXPORT QxtWebFileUploadEvent : public QxtWebEvent {\npublic:\n    QxtWebFileUploadEvent(int sessionID);\n\n    QString filename;\n    int contentLength;\n    QIODevice* content;\n};\n*/\n\nclass QxtWebRedirectEvent;\nclass QXT_WEB_EXPORT QxtWebPageEvent : public QxtWebEvent\n{\npublic:\n    QxtWebPageEvent(int sessionID, int requestID, QSharedPointer<QIODevice> source);\n    QxtWebPageEvent(int sessionID, int requestID, QByteArray source);    // creates a QBuffer\n    virtual ~QxtWebPageEvent();\n\n    QSharedPointer<QIODevice> dataSource;          // data is read from this device and written to the client\n    bool chunked;\n    bool streaming;\n\n    const int requestID;\n    int status;\n    QByteArray statusMessage;\n    QByteArray contentType;\n\n    QMultiHash<QString, QString> headers;\n\nprivate:\n    friend class QxtWebRedirectEvent;\n    QxtWebPageEvent(QxtWebEvent::EventType typeOverride, int sessionID, int requestID, QByteArray source);\n};\n\nclass QXT_WEB_EXPORT QxtWebErrorEvent : public QxtWebPageEvent\n{\npublic:\n    QxtWebErrorEvent(int sessionID, int requestID, int status, QByteArray statusMessage);\n};\n\nclass QXT_WEB_EXPORT QxtWebStoreCookieEvent : public QxtWebEvent\n{\npublic:\n    QxtWebStoreCookieEvent(int sessionID, QString name, QString data, QDateTime expiration = QDateTime());\n\n    QString name;\n    QString data;\n    QDateTime expiration;\n};\n\nclass QXT_WEB_EXPORT QxtWebRemoveCookieEvent : public QxtWebEvent\n{\npublic:\n    QxtWebRemoveCookieEvent(int sessionID, QString name);\n\n    QString name;\n};\n\nclass QXT_WEB_EXPORT QxtWebRedirectEvent : public QxtWebPageEvent\n{\npublic:\n    QxtWebRedirectEvent(int sessionID, int requestID, const QString& destination, int statusCode = 302);\n\n    QString destination;\n};\n\n#endif // QXTWEBEVENT_H\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n/*!\n\\class QxtWebServiceDirectory\n\n\\inmodule QxtWeb\n\n\\brief The QxtWebServiceDirectory class provides Path-based web service dispatcher\n\nQxtWebServiceDirectory allows multiple services to be associated with a single\nsession. Selection between services is determined by the first path component\nin the URL. For example, the URL \"/site/request?param=true\" would relay the\nURL \"/request?param=true\" to the service named \"site\".\n\nThis class can be used recursively to declare a hierarchy of services. For\nexample:\n\\code\nQxtWebServiceDirectory* top = new QxtWebServiceDirectory(sm, sm);\nQxtWebServiceDirectory* service1 = new QxtWebServiceDirectory(sm, top);\nQxtWebServiceDirectory* service2 = new QxtWebServiceDirectory(sm, top);\nQxtWebServiceDirectory* service1a = new QxtWebServiceDirectory(sm, service1);\nQxtWebServiceDirectory* service1b = new QxtWebServiceDirectory(sm, service1);\ntop->addService(\"1\", service1);\ntop->addService(\"2\", service2);\nservice1->addService(\"a\", service1a);\nservice1->addService(\"b\", service1b);\n\\endcode\nThis accepts the URLs \"/1/a/\", \"/1/b/\", and \"/2/\".\n*/\n\n#include \"qxtwebservicedirectory.h\"\n#include \"qxtwebservicedirectory_p.h\"\n#include \"qxtwebevent.h\"\n#include <QUrl>\n#include <QtDebug>\n\n#ifndef QXT_DOXYGEN_RUN\nQxtWebServiceDirectoryPrivate::QxtWebServiceDirectoryPrivate() : QObject(0)\n{\n    // initializers only\n}\n\nvoid QxtWebServiceDirectoryPrivate::serviceDestroyed()\n{\n    QxtAbstractWebService* service = qobject_cast<QxtAbstractWebService*>(sender());\n    if (!service) return; // this shouldn't happen\n    QString path;\n    while (!(path = services.key(service)).isNull())\n    {\n        services.remove(path);\n    }\n}\n#endif\n\n/*!\n * Constructs a QxtWebServiceDirectory object with the specified session manager \\a sm and \\a parent.\n *\n * Often, the session manager will also be the parent, but this is not a requirement.\n */\nQxtWebServiceDirectory::QxtWebServiceDirectory(QxtAbstractWebSessionManager* sm, QObject* parent) : QxtAbstractWebService(sm, parent)\n{\n    QXT_INIT_PRIVATE(QxtWebServiceDirectory);\n}\n\n/*!\n * Adds a \\a service to the directory at the given \\a path.\n * \\sa removeService(), service()\n */\nvoid QxtWebServiceDirectory::addService(const QString& path, QxtAbstractWebService* service)\n{\n    if (qxt_d().services.contains(path))\n    {\n        qWarning() << \"QxtWebServiceDirectory::addService:\" << path << \"already registered\";\n    }\n\n    qxt_d().services[path] = service;\n    if (qxt_d().defaultRedirect.isEmpty())\n        setDefaultRedirect(path);\n    connect(service, SIGNAL(destroyed()), &qxt_d(), SLOT(serviceDestroyed()));\n}\n\n/*!\n * Removes the service at the given \\a path.\n *\n * Note that the service object is not destroyed.\n */\nvoid QxtWebServiceDirectory::removeService(const QString& path)\n{\n    if (!qxt_d().services.contains(path))\n    {\n        qWarning() << \"QxtWebServiceDirectory::removeService:\" << path << \"not registered\";\n    }\n    else\n    {\n        qxt_d().services.remove(path);\n    }\n}\n\n/*!\n * Returns the service at the given \\a path.\n */\nQxtAbstractWebService* QxtWebServiceDirectory::service(const QString& path) const\n{\n    if (!qxt_d().services.contains(path))\n        return 0;\n    return qxt_d().services[path];\n}\n\n/*!\n * \\internal\n * Returns the first path segment from the URL in the \\a event object.\n * (i.e. \"a\" from \"/a/b/c\") This also removes the path segment from the\n * event object. (in the previous example, the event's URL is now \"/b/c\")\n */\nstatic QString extractPathLevel(QxtWebRequestEvent* event)\n{\n    QString path = event->url.path();\n    int pos = path.indexOf(\"/\", 1); // the path always starts with /\n    if (pos == -1)\n        event->url.setPath(\"\"); // cue to redirect to /service/\n    else\n        event->url.setPath(path.mid(pos));\n    return path.mid(1, pos - 1);\n}\n\n/*!\n * \\reimp\n */\nvoid QxtWebServiceDirectory::pageRequestedEvent(QxtWebRequestEvent* event)\n{\n    QString path = extractPathLevel(event);\n    if (path.isEmpty())\n    {\n        indexRequested(event);\n    }\n    else if (!qxt_d().services.contains(path))\n    {\n        unknownServiceRequested(event, path);\n    }\n    else if (event->url.path().isEmpty())\n    {\n        postEvent(new QxtWebRedirectEvent(event->sessionID, event->requestID, path + '/', 307));\n    }\n    else\n    {\n        qxt_d().services[path]->pageRequestedEvent(event);\n    }\n}\n\n/*\n * \\reimp unimplemented\n */\n/*\nvoid QxtWebServiceDirectory::functionInvokedEvent(QxtWebRequestEvent* event) {\n    QString path = extractPathLevel(event);\n    if(path == \"\") {\n        indexRequested(event);\n    } else if(!qxt_d().services.contains(path)) {\n        unknownServiceRequested(event, path);\n    } else {\n        qxt_d().services[path]->functionInvokedEvent(event);\n    }\n}\n*/\n\n/*!\n * This \\a event handler is called whenever the URL requests a service with \\a name that has\n * not been added to the directory.\n *\n * The default implementation returns a 404 \"Service not known\" error.\n * Subclasses may reimplement this event handler to customize this behavior.\n */\nvoid QxtWebServiceDirectory::unknownServiceRequested(QxtWebRequestEvent* event, const QString& name)\n{\n    postEvent(new QxtWebErrorEvent(event->sessionID, event->requestID, 404, (\"Service &quot;\" + QString(name).replace('<', \"&lt\") + \"&quot; not known\").toUtf8()));\n}\n\n/*!\n * This \\a event handler is called whenever the URL does not contain a path, that\n * is, the URL is \"/\" or empty.\n *\n * The default implementation redirects to the service specified by\n * setDefaultRedirect(), or invokes unknownServiceRequested() if no default\n * redirect has been set.\n */\nvoid QxtWebServiceDirectory::indexRequested(QxtWebRequestEvent* event)\n{\n    if (defaultRedirect().isEmpty())\n    {\n        unknownServiceRequested(event, \"/\");\n    }\n    else\n    {\n        postEvent(new QxtWebRedirectEvent(event->sessionID, event->requestID, defaultRedirect() + '/', 307));\n    }\n}\n\n/*!\n * Returns the path that will be used by default by the indexRequested event.\n * \\sa indexRequested(), setDefaultRedirect()\n */\nQString QxtWebServiceDirectory::defaultRedirect() const\n{\n    return qxt_d().defaultRedirect;\n}\n\n/*!\n * Sets the \\a path that will be used by default by the indexRequested event.\n * \\sa indexRequested(), defaultRedirect()\n */\nvoid QxtWebServiceDirectory::setDefaultRedirect(const QString& path)\n{\n    if (!qxt_d().services.contains(path))\n        qWarning() << \"QxtWebServiceDirectory::setDefaultRedirect:\" << path << \"not registered\";\n    qxt_d().defaultRedirect = path;\n}\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTWEBSERVICEDIRECTORY_H\n#define QXTWEBSERVICEDIRECTORY_H\n\n#include <qxtabstractwebservice.h>\n#include <QString>\nclass QxtAbstractWebSessionManager;\nclass QxtWebEvent;\n\nclass QxtWebServiceDirectoryPrivate;\nclass QXT_WEB_EXPORT QxtWebServiceDirectory : public QxtAbstractWebService\n{\n    Q_OBJECT\npublic:\n    explicit QxtWebServiceDirectory(QxtAbstractWebSessionManager* sm, QObject* parent = 0);\n\n    void addService(const QString& path, QxtAbstractWebService* service);\n    void removeService(const QString& path);\n    QxtAbstractWebService* service(const QString& path) const;\n\n    virtual void pageRequestedEvent(QxtWebRequestEvent* event);\n//     virtual void functionInvokedEvent(QxtWebRequestEvent* event);\n\n    QString defaultRedirect() const;\n    void setDefaultRedirect(const QString& path);\n\nprotected:\n    virtual void unknownServiceRequested(QxtWebRequestEvent* event, const QString& name);\n    virtual void indexRequested(QxtWebRequestEvent* event);\n\nprivate:\n    QXT_DECLARE_PRIVATE(QxtWebServiceDirectory)\n};\n\n#endif // QXTWEBSERVICEDIRECTORY_H\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory_p.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTWEBSERVICEDIRECTORY_P_H\n#define QXTWEBSERVICEDIRECTORY_P_H\n\n#include \"qxtwebservicedirectory.h\"\n#include <QString>\n#include <QHash>\n\n#ifndef QXT_DOXYGEN_RUN\nclass QxtWebServiceDirectoryPrivate : public QObject, public QxtPrivate<QxtWebServiceDirectory>\n{\n    Q_OBJECT\npublic:\n    QXT_DECLARE_PUBLIC(QxtWebServiceDirectory)\n    QxtWebServiceDirectoryPrivate();\n\n    QHash<QString, QxtAbstractWebService*> services;\n    QString defaultRedirect;\n\npublic Q_SLOTS:\n    void serviceDestroyed();\n};\n#endif // QXT_DOXYGEN_RUN\n\n#endif // QXTWEBSERVICEDIRECTORY_P_H\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtwebslotservice.cpp",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n\n/*!\n\\class QxtWebSlotService\n\n\\inmodule QxtWeb\n\n\\brief The QxtWebSlotService class provides a Slot based webservice\n\nA WebService that resolves the first part of the path to a slot name and passes the rest as arguments.\n\n\\code\nclass MyService : public QxtWebSlotService\n{\nQ_OBJECT\npublic slots:\n    void hello(QxtWebRequestEvent* event, QString a)\n    {\n        postEvent(new QxtWebPageEvent(event->sessionID, event->requestID, \"&lth1&gt\"+a.toUtf8()+\"&lt/h1&gt));\n    }\n}\n\\endcode\n\n\n/hello/foo<br>\nwill output<br>\n&lth1&gtFoo&lt/h1&gt<br>\n\n\n\\sa QxtAbstractWebService\n*/\n\n#include \"qxtwebslotservice.h\"\n#include \"qxtwebevent.h\"\n\n/*!\n    Constructs a new QxtWebSlotService with \\a sm and \\a parent.\n */\nQxtWebSlotService::QxtWebSlotService(QxtAbstractWebSessionManager* sm, QObject* parent): QxtAbstractWebService(sm, parent)\n{\n}\n\n/*!\n    Returns the current absolute url of this service depending on the request \\a event.\n */\nQUrl QxtWebSlotService::self(QxtWebRequestEvent* event)\n\n{\n    QStringList  u = event->url.path().split('/');\n    QStringList  o = event->originalUrl.path().split('/');\n    u.removeFirst();\n    o.removeFirst();\n    for (int i = 0;i < u.count();i++)\n        o.removeLast();\n\n\n    QString r = \"/\";\n    foreach(const QString& d, o)\n    {\n        r += d + '/';\n    }\n    return r;\n}\n\n/*!\n    \\reimp\n */\nvoid QxtWebSlotService::pageRequestedEvent(QxtWebRequestEvent* event)\n{\n    QList<QString> args = event->url.path().split('/');\n    args.removeFirst();\n    if (args.at(args.count() - 1).isEmpty())\n        args.removeLast();\n\n\n    ///--------------find action ------------------\n    QByteArray action = \"index\";\n    if (args.count())\n    {\n        action = args.at(0).toUtf8();\n        if (action.trimmed().isEmpty())\n            action = \"index\";\n        args.removeFirst();\n    }\n\n\n\n    bool ok = false;\n    if (args.count() > 7)\n    {\n        ok = QMetaObject::invokeMethod(this, action,\n                                       Q_ARG(QxtWebRequestEvent*, event),\n                                       Q_ARG(QString, args.at(0)),\n                                       Q_ARG(QString, args.at(1)),\n                                       Q_ARG(QString, args.at(2)),\n                                       Q_ARG(QString, args.at(3)),\n                                       Q_ARG(QString, args.at(4)),\n                                       Q_ARG(QString, args.at(5)),\n                                       Q_ARG(QString, args.at(6)),\n                                       Q_ARG(QString, args.at(7))\n                                      );\n    }\n    else if (args.count() > 6)\n    {\n        ok = QMetaObject::invokeMethod(this, action,\n                                       Q_ARG(QxtWebRequestEvent*, event),\n                                       Q_ARG(QString, args.at(0)),\n                                       Q_ARG(QString, args.at(1)),\n                                       Q_ARG(QString, args.at(2)),\n                                       Q_ARG(QString, args.at(3)),\n                                       Q_ARG(QString, args.at(4)),\n                                       Q_ARG(QString, args.at(5)),\n                                       Q_ARG(QString, args.at(6))\n                                      );\n    }\n    else if (args.count() > 5)\n    {\n        ok = QMetaObject::invokeMethod(this, action,\n                                       Q_ARG(QxtWebRequestEvent*, event),\n                                       Q_ARG(QString, args.at(0)),\n                                       Q_ARG(QString, args.at(1)),\n                                       Q_ARG(QString, args.at(2)),\n                                       Q_ARG(QString, args.at(3)),\n                                       Q_ARG(QString, args.at(4)),\n                                       Q_ARG(QString, args.at(5))\n                                      );\n    }\n    else if (args.count() > 4)\n    {\n        ok = QMetaObject::invokeMethod(this, action,\n                                       Q_ARG(QxtWebRequestEvent*, event),\n                                       Q_ARG(QString, args.at(0)),\n                                       Q_ARG(QString, args.at(1)),\n                                       Q_ARG(QString, args.at(2)),\n                                       Q_ARG(QString, args.at(3)),\n                                       Q_ARG(QString, args.at(4))\n                                      );\n    }\n    else if (args.count() > 3)\n    {\n        ok = QMetaObject::invokeMethod(this, action,\n                                       Q_ARG(QxtWebRequestEvent*, event),\n                                       Q_ARG(QString, args.at(0)),\n                                       Q_ARG(QString, args.at(1)),\n                                       Q_ARG(QString, args.at(2)),\n                                       Q_ARG(QString, args.at(3))\n                                      );\n    }\n    else if (args.count() > 2)\n    {\n        ok = QMetaObject::invokeMethod(this, action,\n                                       Q_ARG(QxtWebRequestEvent*, event),\n                                       Q_ARG(QString, args.at(0)),\n                                       Q_ARG(QString, args.at(1)),\n                                       Q_ARG(QString, args.at(2))\n                                      );\n    }\n    else if (args.count() > 1)\n    {\n        ok = QMetaObject::invokeMethod(this, action,\n                                       Q_ARG(QxtWebRequestEvent*, event),\n                                       Q_ARG(QString, args.at(0)),\n                                       Q_ARG(QString, args.at(1))\n                                      );\n    }\n    else if (args.count() > 0)\n    {\n        ok = QMetaObject::invokeMethod(this, action,\n                                       Q_ARG(QxtWebRequestEvent*, event),\n                                       Q_ARG(QString, args.at(0))\n                                      );\n    }\n    else\n    {\n        ok = QMetaObject::invokeMethod(this, action,\n                                       Q_ARG(QxtWebRequestEvent*, event)\n                                      );\n    }\n\n\n    if (!ok)\n    {\n        QByteArray err = \"<h1>Can not find slot</h1> <pre>Class \" + QByteArray(metaObject()->className()) + \"\\r{\\npublic slots:\\r    void \" + action.replace('<', \"&lt\") + \" ( QxtWebRequestEvent* event, \";\n        for (int i = 0;i < args.count();i++)\n            err += \"QString arg\" + QByteArray::number(i) + \", \";\n        err.chop(2);\n\n        err += \" ); \\r};\\r</pre> \";\n\n        postEvent(new QxtWebErrorEvent(event->sessionID, event->requestID, 404, err));\n    }\n\n\n}\n\n/*!\n    \\reimp\n */\nvoid QxtWebSlotService::functionInvokedEvent(QxtWebRequestEvent* event)\n{\n    postEvent(new QxtWebErrorEvent(event->sessionID, event->requestID, 500, \"<h1>Not supported</h1>\"));\n}\n"
  },
  {
    "path": "archive/spotify/qxtweb-standalone/qxtweb/qxtwebslotservice.h",
    "content": "/****************************************************************************\n **\n ** Copyright (C) Qxt Foundation. Some rights reserved.\n **\n ** This file is part of the QxtWeb module of the Qxt library.\n **\n ** This library is free software; you can redistribute it and/or modify it\n ** under the terms of the Common Public License, version 1.0, as published\n ** by IBM, and/or under the terms of the GNU Lesser General Public License,\n ** version 2.1, as published by the Free Software Foundation.\n **\n ** This file is provided \"AS IS\", without WARRANTIES OR CONDITIONS OF ANY\n ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY\n ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR\n ** FITNESS FOR A PARTICULAR PURPOSE.\n **\n ** You should have received a copy of the CPL and the LGPL along with this\n ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files\n ** included with the source distribution for more information.\n ** If you did not receive a copy of the licenses, contact the Qxt Foundation.\n **\n ** <http://libqxt.org>  <foundation@libqxt.org>\n **\n ****************************************************************************/\n\n#ifndef QXTWEBSLOTSERVICE_H\n#define QXTWEBSLOTSERVICE_H\n\n#include \"qxtabstractwebservice.h\"\n#include <QUrl>\n\nclass QXT_WEB_EXPORT QxtWebSlotService : public QxtAbstractWebService\n{\n    Q_OBJECT\npublic:\n    explicit QxtWebSlotService(QxtAbstractWebSessionManager* sm, QObject* parent = 0);\n\nprotected:\n    QUrl self(QxtWebRequestEvent* event);\n\n    virtual void pageRequestedEvent(QxtWebRequestEvent* event);\n    virtual void functionInvokedEvent(QxtWebRequestEvent* event);\n};\n\n#endif // QXTWEBSLOTSERVICE_H\n"
  },
  {
    "path": "archive/spotify/spotify.desktop",
    "content": "[Desktop Entry]\nName=Spotify\nComment=Stream music from Spotify. Requires a Premium account.\n\nType=Service\nX-KDE-ServiceTypes=Tomahawk/BinaryResolver\nX-Synchrotron-Signature=_SIGNATURE_\nX-Synchrotron-ContentUrl=_ZIPFILE_\nX-Synchrotron-Type=_TYPE_\nX-Synchrotron-MainScript=_BINARY_\nX-Synchrotron-Requires-Tomahawk-Version=0.6.0\n\nX-KDE-PluginInfo-Name=spotify-_PLATFORM_\nX-KDE-PluginInfo-Category=BinaryResolver\nX-KDE-PluginInfo-Author=Hugo and Leo\nX-KDE-PluginInfo-Email=lfranchi@kde.org\nX-KDE-PluginInfo-Version=_VERSION_\nX-KDE-PluginInfo-Website=http://gettomahawk.com\n"
  },
  {
    "path": "archive/spotify/spotify_key.h",
    "content": "// The Spotify terms of service require that application keys are not\n// accessible to third parties.  Therefore this application key is heavily\n// encrypted here in the source to prevent third parties from viewing it.\n// It is most definitely not base64 encoded.\n\nstatic const char* spotifyApiKey =\n\"AS393ZH/DGWshTgctiPZXI6BnFyHpSbSJViBqfgVVbJ5dHcMYgeCqMUKBIfBa2sxFkARz2EL8jBi\"\n\"pr78IJ6OGDqQLP/sjRdgQ5gq2vBxVWAgxf31ZYV3hk/6NCzuOYQRReb2hZE04M1ayhY6tgoLiDB3\"\n\"WOQ9D5vJpcgvPcB9pjIQjWhoJQpeUXAPV3TcJigP7EzaoPsjscXzs+b2a+11jHU6WMYAxZZewoJl\"\n\"/siCHHVKXa1Nyv+UOXmSH9kIJlEmDs2pegNcBXNvx8RplP4lS5MWn2sOsavQba2BHJR7tXLDYZ5g\"\n\"l2XZ/rko77EjedPgI5OItDUNWUh1UUnjwFtLz8YwtiGZRVm7Wb9nN74wgYut0E+ZnZ7jNsJ2FDky\"\n\"BzKJ1bs+nvtyKfxMBnE5uPUUx/WyDRr1hIZRLDFT4ta2ssve\";\n"
  },
  {
    "path": "archive/spotify/spotifyiodevice.cpp",
    "content": "/*\n *    Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n *\n *    Permission is hereby granted, free of charge, to any person\n *    obtaining a copy of this software and associated documentation\n *    files (the \"Software\"), to deal in the Software without\n *    restriction, including without limitation the rights to use,\n *    copy, modify, merge, publish, distribute, sublicense, and/or sell\n *    copies of the Software, and to permit persons to whom the\n *    Software is furnished to do so, subject to the following\n *    conditions:\n *\n *    The above copyright notice and this permission notice shall be\n *    included in all copies or substantial portions of the Software.\n *\n *    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n *    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n *    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n *    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n *    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n *    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n *    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n *    OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#include \"spotifyiodevice.h\"\n#include \"callbacks.h\"\n\nSpotifyIODevice::SpotifyIODevice( QObject* parent )\n    : QIODevice( parent )\n    , m_done( false )\n{\n}\n\n\nSpotifyIODevice::~SpotifyIODevice()\n{\n//    qDebug() << Q_FUNC_INFO << \"Destroying SpotifyIODevice:\" << this;\n    if ( isOpen() )\n        close();\n}\n\n\nvoid\nSpotifyIODevice::setDurationMSec( quint32 msec )\n{\n    quint32 numSamples = ( (quint64)msec * Q_UINT64_C(44100) ) / (quint64)1000;\n    quint32 dataChunkSize = numSamples * 2 * 2;\n//    qDebug() << \"Writing number of samples and data chunk size:\" << numSamples << dataChunkSize << \"and msec:\" << msec;\n    // got samples, we can make the header now\n    m_header += (const char* )\"RIFF\";\n    quint32 data = 36 + dataChunkSize;\n    m_header.append((char*)&data, 4); // The file size LESS the size of the \"RIFF\" description (4 bytes) and the size of file description (4 bytes). This is usually file size - 8, or 36 + subchunk2 size\n    m_header += (const char* )\"WAVE\"; //The ascii text string \"RIFF\". mmsystem.h provides the macro FOURCC_RIFF for this purpose.\n    /// fmt subchunk\n    m_header += (const char* )\"fmt \"; //\n    data = 16;\n    m_header.append((char*)&data, 4); // The size of the WAVE type format (2 bytes) + mono/stereo flag (2 bytes) + sample rate (4 bytes) + bytes/sec (4 bytes) + block alignment (2 bytes) + bits/sample (2 bytes). This is usually 16 (or 0x10).\n    data = 1;\n    m_header.append((char*)&data, 2); // Type of WAVE format. This is a PCM header, or a value of 0x01.\n    data = 2;\n    m_header.append((char*)&data, 2); // mono (0x01) or stereo (0x02)\n    data = 44100;\n    m_header.append((char*)&data, 4); // Sample rate.\n    data = 44100 * 2 * 16/8;\n    m_header.append((char*)&data, 4); // Bytes/Second == SampleRate * NumChannels * BitsPerSample/8\n    data = 2 * 16/8;\n    m_header.append((char*)&data , 2); // Data block size (bytes) == NumChannels * BitsPerSample/8\n    data = 16;\n    m_header.append((char*)&data, 2); // bits per sample\n    /// data subchunk\n    m_header += \"data\" ;\n    m_header.append((char*)&dataChunkSize, 4); // NumSamples * NumChannels * BitsPerSample/8\n}\n\n\nvoid\nSpotifyIODevice::clear()\n{\n    QMutexLocker l( &m_mutex );\n\n    m_audioData.clear();\n}\n\n\nqint64\nSpotifyIODevice::readData( char* data, qint64 maxlen )\n{\n    QMutexLocker l( &m_mutex );\n\n    qint64 written = 0;\n\n    if ( !m_header.isEmpty() && m_header.size() < maxlen ) {\n        qMemCopy( data, m_header.constData(), m_header.size() );\n        qDebug() << \"wrote header:\" << m_header.toHex();\n        written += m_header.size();\n\n        m_header.clear();\n    }\n\n    if ( !m_audioData.isEmpty() )\n    {\n        const int toWrite = maxlen - written;\n        const int canWrite = qMin( toWrite, m_audioData.size() );\n        memcpy( data, m_audioData.data(), canWrite );\n        written += canWrite;\n\n        m_audioData = m_audioData.mid( canWrite );\n        m_audioData.squeeze();\n    }\n\n    Q_ASSERT( m_audioData.size() == 0 || written == maxlen );\n\n    return written;\n}\n\n\nqint64\nSpotifyIODevice::writeData( const char* data, qint64 len )\n{\n    if ( m_done )\n    {\n        // do nothing\n        return -1;\n    }\n\n    QMutexLocker l( &m_mutex );\n\n    m_audioData.append( data, len );\n    emit readyRead();\n\n    return len;\n}\n\n\nqint64\nSpotifyIODevice::bytesAvailable() const\n{\n    QMutexLocker l( &m_mutex );\n\n    return m_header.size() + m_audioData.size();\n}\n\n\nvoid\nSpotifyIODevice::disconnected()\n{\n    QMutexLocker l( &m_mutex );\n\n    m_done = true;\n    qDebug() << \"spotifyiodevice disconnected\";\n    m_audioData.clear();\n}\n\n"
  },
  {
    "path": "archive/spotify/spotifyiodevice.h",
    "content": "/*\n *    Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n *\n *    Permission is hereby granted, free of charge, to any person\n *    obtaining a copy of this software and associated documentation\n *    files (the \"Software\"), to deal in the Software without\n *    restriction, including without limitation the rights to use,\n *    copy, modify, merge, publish, distribute, sublicense, and/or sell\n *    copies of the Software, and to permit persons to whom the\n *    Software is furnished to do so, subject to the following\n *    conditions:\n *\n *    The above copyright notice and this permission notice shall be\n *    included in all copies or substantial portions of the Software.\n *\n *    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n *    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n *    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n *    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n *    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n *    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n *    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n *    OTHER DEALINGS IN THE SOFTWARE.\n */\n#ifndef SPOTIFY_IODEVICE_H\n#define SPOTIFY_IODEVICE_H\n\n#include <QIODevice>\n#include <QQueue>\n#include <QPair>\n#include <QMutex>\n#include <QFile>\n\nclass SpotifyIODevice : public QIODevice\n{\n    Q_OBJECT\npublic:\n    SpotifyIODevice( QObject* parent = 0 );\n    virtual ~SpotifyIODevice();\n\n    virtual qint64 readData(char* data, qint64 maxlen);\n    virtual qint64 writeData(const char* data, qint64 len);\n    virtual qint64 bytesAvailable() const;\n    virtual bool isSequential() const  { return true; }\n\n    void clear();\n\n    void setDurationMSec( uint msec );\n\npublic slots:\n    void disconnected();\nprivate:\n    QByteArray m_audioData;\n    QByteArray m_header;\n    mutable QMutex m_mutex;\n\n    bool m_done;\n};\n\n#endif\n"
  },
  {
    "path": "archive/spotify/spotifyloghandler.cpp",
    "content": "/*\n    Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n#include \"spotifyloghandler.h\"\n\nstd::ofstream spLogfile;\n\nvoid LogHandler( QtMsgType type, const char *msg )\n{\n    static QMutex s_mutex;\n\n    QMutexLocker locker( &s_mutex );\n    switch( type )\n    {\n        case QtDebugMsg:\n            spLogfile << QTime::currentTime().toString().toAscii().data() << \" Debug: \" << msg << \"\\n\";\n            break;\n\n        case QtCriticalMsg:\n            spLogfile << QTime::currentTime().toString().toAscii().data() << \" Critical: \" << msg << \"\\n\";\n            break;\n\n        case QtWarningMsg:\n            spLogfile << QTime::currentTime().toString().toAscii().data() << \" Warning: \" << msg << \"\\n\";\n            break;\n\n        case QtFatalMsg:\n            spLogfile << QTime::currentTime().toString().toAscii().data() << \" Fatal: \" << msg << \"\\n\";\n            spLogfile.flush();\n/*\n            cout << msg << \"\\n\";\n            cout.flush();*/\n            abort();\n            break;\n    }\n\n//     std::cout << msg << \"\\n\";\n//     cout.flush();\n    spLogfile.flush();\n}\n\nvoid setupLogfile()\n{\n    if ( QFileInfo( SPOTIFY_LOGFILE ).size() > SPOTIFY_LOGFILE_SIZE )\n    {\n        QByteArray lc;\n        {\n            QFile f( SPOTIFY_LOGFILE );\n            f.open( QIODevice::ReadOnly | QIODevice::Text );\n            lc = f.readAll();\n            f.close();\n        }\n\n        QFile::remove( SPOTIFY_LOGFILE );\n\n        {\n            QFile f( SPOTIFY_LOGFILE );\n            f.open( QIODevice::WriteOnly | QIODevice::Text );\n            f.write( lc.right( SPOTIFY_LOGFILE_SIZE - (SPOTIFY_LOGFILE_SIZE / 4) ) );\n            f.close();\n        }\n    }\n    spLogfile.open( SPOTIFY_LOGFILE, std::ios::app );\n    qInstallMsgHandler( LogHandler );\n}\n\n"
  },
  {
    "path": "archive/spotify/spotifyloghandler.h",
    "content": "/*\n    Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n*/\n#ifndef SPOTIFYLOGHANDLER_H\n#define SPOTIFYLOGHANDLER_H\n\n\n#ifdef WIN32\n#include <shlobj.h>\n#endif\n#include <QTimer>\n#include <QTextStream>\n#include <QSettings>\n#include <QSocketNotifier>\n#include <QDir>\n#include <QDateTime>\n#include <QUuid>\n#include <QtCore/QTimer>\n#include <QtCore/QFile>\n#include <QMutex>\n#include <QDebug>\n#include <QtGlobal>\n\n#include <iostream>\n#include <stdio.h>\n#include <fstream>\n#include <qendian.h>\n\n#include \"spotifyresolver.h\"\n\n#ifdef Q_WS_MAC\n#define SPOTIFY_LOGFILE QDir::home().filePath( \"Library/Logs/SpotifyResolver.log\" ).toLocal8Bit()\n#else\n#define SPOTIFY_LOGFILE QDir( SpotifyResolver::dataDir() ).filePath( \"SpotifyResolver.log\" ).toLocal8Bit()\n#endif\n\n#ifdef Q_WS_MAC\n#define SPOTIFY_CACHEDIR QString( QDir::home().absolutePath() + QDir::separator() + \"Library/Caches/SpotifyResolver/\" ).toLocal8Bit()\n#else\n#define SPOTIFY_CACHEDIR QString( SpotifyResolver::dataDir() + QDir::separator() + \"cache\" + QDir::separator() ).toLocal8Bit()\n#endif\n\n#define SPOTIFY_LOGFILE_SIZE 1024 * 512\n\nvoid LogHandler( QtMsgType type, const char *msg );\nvoid setupLogfile();\n\n#endif // SPOTIFYLOGHANDLER_H\n"
  },
  {
    "path": "archive/spotify/spotifyplayback.cpp",
    "content": "/**  This file is part of QT SpotifyWebApi - <hugolm84@gmail.com> ===\n *   Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n *   Copyright 2011-2012,Hugo Lindström <hugolm84@gmail.com>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n\n\n#include \"spotifyplayback.h\"\n#include \"spotifysession.h\"\n\n#include <QString>\n#include <QDebug>\n#include <QPair>\n#include <QMutex>\n#include <QThread>\n\nSpotifyPlayback::SpotifyPlayback(QObject *parent) :\n    QObject(parent),\n    m_trackEnded( false )\n{\n}\n\n\nQMutex&\nSpotifyPlayback::dataMutex()\n{\n    return m_dataMutex;\n}\n\n\nvoid\nSpotifyPlayback::clearData()\n{\n    if( m_iodev.isNull() )\n    {\n        qWarning() << \"Help! Asked to clear dat but iodevice is null...\";\n        return;\n    }\n\n    m_iodev->clear();\n}\n\n\nvoid\nSpotifyPlayback::queueData( const QByteArray& data )\n{\n    if( m_iodev.isNull() )\n    {\n        qWarning() << \"Help! Got data to queue but no iodevice to queue it in...\";\n        return;\n    }\n\n     m_iodev->write( data );\n\n}\n\n\nvoid\nSpotifyPlayback::startPlaying()\n{\n    m_trackEnded = false;\n}\n\nspotifyiodev_ptr\nSpotifyPlayback::getIODeviceForNewTrack( uint durMsec )\n{\n    if( m_iodev.isNull() )\n    {\n        m_iodev = spotifyiodev_ptr( new SpotifyIODevice(), &QObject::deleteLater );\n        m_iodev->setDurationMSec( durMsec );\n        m_iodev->open( QIODevice::ReadWrite );\n\n        qDebug() << QThread::currentThreadId() << \"Creating SpotifyIODevice for track..:\" << m_iodev.data() << m_iodev->thread()->currentThreadId();\n    }\n\n    return m_iodev;\n}\n\n\nvoid\nSpotifyPlayback::endTrack()\n{\n    qDebug() << QThread::currentThreadId() << \"And stopping track\";\n    if( !m_iodev.isNull() ) {\n\n        qDebug() << \"Stopping track and closign iodev! from thread with other:\" << QThread::currentThreadId() << \"and iodev:\" << m_iodev->thread()->currentThreadId();\n        m_iodev->close();\n        m_iodev.clear();\n        sp_session_player_unload(SpotifySession::getInstance()->Session());\n    }\n    m_trackEnded = true;\n}\n\nbool\nSpotifyPlayback::trackIsOver()\n{\n    return m_trackEnded;\n}\n\nvoid\nSpotifyPlayback::endOfTrack(sp_session *session)\n{\n    SpotifySession* _session = reinterpret_cast<SpotifySession*>( sp_session_userdata( session ) );\n//     qDebug() << \"Got spotify end of track callback!\";\n    if ( !_session->Playback()->trackIsOver() )\n        _session->Playback()->endTrack();\n\n}\n\nint\nSpotifyPlayback::musicDelivery(sp_session *session, const sp_audioformat *format, const void *frames, int numFrames_)\n{\n    SpotifySession* _session = reinterpret_cast<SpotifySession*>(sp_session_userdata(session));\n    Q_ASSERT (_session);\n\n    QMutex &m = _session->Playback()->dataMutex();\n\n    _session->Playback()->m_currChannels = format->channels;\n    _session->Playback()->m_currFrames = numFrames_;\n    _session->Playback()->m_currSamples = format->sample_rate;\n\n    if (numFrames_ == 0) // flush caches\n    {\n        QMutexLocker l(&m);\n        _session->Playback()->clearData();\n        return 0;\n    }\n\n    m.lock();\n    // libspotify v11 bug, seems to retry to push the last batch of audio no matter what. short-circuit to ignore\n    if ( _session->Playback()->trackIsOver() ) {\n        m.unlock();\n        return numFrames_;\n    }\n\n    const QByteArray data( (const char*)frames, numFrames_ * 4 ); // 4 == channels * ( bits per sample / 8 ) == 2 * ( 16 / 8 ) == 2 * 2\n    _session->Playback()->queueData( data );\n    m.unlock();\n\n    return numFrames_; // num frames read, not bytes read. we always read all the frames\n}\n"
  },
  {
    "path": "archive/spotify/spotifyplayback.h",
    "content": "/**  This file is part of QT SpotifyWebApi - <hugolm84@gmail.com> ===\n *   Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n *   Copyright 2011-2012,Hugo Lindström <hugolm84@gmail.com>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n\n#ifndef SPOTIFYPLAYBACK_H\n#define SPOTIFYPLAYBACK_H\n#include <libspotify/api.h>\n#include <QMutex>\n#include <QDebug>\n#include <QSharedPointer>\n#include <QObject>\n#include \"spotifyiodevice.h\"\n//#include \"spotifysession.h\"\n\ntypedef QSharedPointer< SpotifyIODevice > spotifyiodev_ptr;\n\nclass SpotifyPlayback : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit SpotifyPlayback(QObject *parent = 0);\n\n    // Internal libspotify methods and data\n    QMutex& dataMutex();\n    void clearData();\n    void queueData( const QByteArray& data );\n    void startPlaying();\n    void endTrack();\n    bool trackIsOver();\n    void startPlayingTrack( sp_track *);\n\n    spotifyiodev_ptr getIODeviceForNewTrack( uint durMsec );\n    static int SP_CALLCONV musicDelivery(sp_session *session, const sp_audioformat *format, const void *frames, int numFrames_);\n    static void SP_CALLCONV playTokenLost(sp_session *session)\n    {\n        Q_UNUSED(session);\n        qDebug() << \"Playtoken lost!\";\n\n    }\n\n    static void SP_CALLCONV endOfTrack(sp_session *session);\n\n    static void SP_CALLCONV streamingError(sp_session *session, sp_error error)\n    {\n        Q_UNUSED(session);\n        Q_UNUSED(error);\n        qDebug() << \"Streaming error!\";\n    }\n\n\n    #if SPOTIFY_API_VERSION > 4\n    static void SP_CALLCONV startPlayback(sp_session *session)\n    {\n        Q_UNUSED(session);\n        qDebug() << \"Starting playback\";\n\n    }\n\n    static void SP_CALLCONV stopPlayback(sp_session *session)\n    {\n        Q_UNUSED(session);\n        qDebug() << \"Stopping playback\";\n    }\n\n    static void SP_CALLCONV getAudioBufferStats(sp_session *session, sp_audio_buffer_stats *stats)\n    {\n        Q_UNUSED(session);\n        Q_UNUSED(stats);\n\n    }\n    #endif\n\n    uint m_currSamples;\n    int m_currFrames;\n    int m_currChannels;\nprivate:\n     QMutex m_dataMutex;\n     spotifyiodev_ptr m_iodev;\n\n     bool m_trackEnded;\n};\n\n#endif // SPOTIFYPLAYBACK_H\n"
  },
  {
    "path": "archive/spotify/spotifyplaylists.cpp",
    "content": "    /**  This file is part of QT SpotifyWebApi - <hugolm84@gmail.com> ===\n *\n *   Copyright 2011-2012,Hugo Lindström <hugolm84@gmail.com>\n *   Copyright      2012,Leo Franchi    <lfranchi@kde.org>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n\n#include \"callbacks.h\"\n#include \"PlaylistClosure.h\"\n#include \"spotifyresolver.h\"\n#include <QCryptographicHash>\n#include <QApplication>\n#include <QDir>\n#include <QFile>\n#include <QFileInfo>\n#include <QFileInfoList>\n\nSpotifyPlaylists::SpotifyPlaylists( QObject *parent )\n   : QObject( parent )\n   , m_loadTimer( new QTimer( this ) )\n   , m_checkPlaylistsTimer( new QTimer( this ) )\n   , m_periodicTimer( new QTimer( this ) )\n   , m_allLoaded( false )\n   , m_isLoading( false )\n{\n    /**\n      Metatypes for invokeMethod\n      **/\n    qRegisterMetaType< sp_playlist* >(\"sp_playlist*\");\n    qRegisterMetaType< int* >(\"int*\");\n    qRegisterMetaType< QVariantMap >(\"QVariantMap\");\n    qRegisterMetaType< sp_playlistcontainer* >(\"sp_playlistcontainer*\");\n    qRegisterMetaType< SpotifyPlaylists::LoadedPlaylist >(\"SpotifyPlaylists::LoadedPlaylist\");\n    qRegisterMetaType< QList<sp_track* > >(\"QList<sp_track*>\");\n    qRegisterMetaType< QList<int> >(\"QList<int>\");\n\n    m_checkPlaylistsTimer->setInterval( 2000 );\n    m_checkPlaylistsTimer->setSingleShot( true );\n    connect( m_checkPlaylistsTimer, SIGNAL( timeout() ), this, SLOT( ensurePlaylistsLoadedTimerFired() ) );\n\n    m_periodicTimer->setInterval( 500 );\n    connect( m_periodicTimer, SIGNAL( timeout() ), this, SLOT( checkWaitingForLoads() ) );\n    m_periodicTimer->start();\n\n    readSettings();\n}\n\n\n\n/**\n    Read the QSettings to set the sync states from previous settings\n**/\n\nvoid\nSpotifyPlaylists::readSettings()\n{\n    QString user = m_settings.value( \"username\" ).toString();\n    int size = m_settings.beginReadArray( \"syncPlaylists\" );\n\n    for ( int i = 0; i < size; ++i )\n    {\n         m_settings.setArrayIndex( i );\n         Sync sync;\n         if( !m_settings.value( \"user\" ).toString().isEmpty() && m_settings.value( \"user\" ).toString() == user )\n         {\n             sync.id_ = m_settings.value( \"id\" ).toString();\n             qDebug() << Q_FUNC_INFO << \"Loading playlist to sync:\" << sync.id_ << \"from user \" << m_settings.value( \"user\" ).toString();\n             sync.sync_ = m_settings.value( \"sync\" ).toBool();\n             m_syncPlaylists.append( sync );\n         }\n\n    }\n\n    m_settings.endArray();\n}\n\n\nvoid\nSpotifyPlaylists::writeSettings()\n{\n    // Rewrite settings\n    QString user = m_settings.value( \"username\" ).toString();\n    m_settings.remove( \"syncPlaylists\" );\n    m_settings.beginWriteArray(\"syncPlaylists\");;\n    for ( int i = 0; i < m_syncPlaylists.size(); ++i )\n    {\n        m_settings.setArrayIndex( i );\n        m_settings.setValue( \"user\" , user);\n        m_settings.setValue( \"id\" , m_syncPlaylists.at( i ).id_ );\n        m_settings.setValue( \"sync\" , m_syncPlaylists.at( i ).sync_ );\n    }\n    m_settings.endArray();\n}\n\n\nvoid SpotifyPlaylists::clear()\n{\n    qDebug() << \"Destroying playlists\";\n    writeSettings();\n    m_settings.sync();\n    for ( int i = 0; i < m_playlists.size(); i++ )\n    {\n        foreach ( sp_track* track, m_playlists[ i ].tracks_ )\n            sp_track_release( track );\n\n        Sync s;\n        s.id_ = m_playlists[ i ].id_;\n        const bool sync = m_syncPlaylists.contains( s );\n\n        if ( sync )\n            sp_playlist_remove_callbacks( m_playlists[ i ].playlist_, &SpotifyCallbacks::syncPlaylistCallbacks, this);\n        else\n            sp_playlist_remove_callbacks( m_playlists[ i ].playlist_, &SpotifyCallbacks::playlistCallbacks, this);\n\n        sp_playlist_release( m_playlists[ i ].playlist_ );\n    }\n    m_playlists.clear();\n    m_syncPlaylists.clear();\n    m_stateChangedCallbacks.clear();\n}\n\n/**\n  Destructor\n    This destructor is important.\n    It removes callbacks and frees playlists and its tracks\n**/\n\nSpotifyPlaylists::~SpotifyPlaylists()\n{\n    clear();\n}\n\n\n/**\n  Callback\n    State changed\n    Called from libspotify when state changed on playlist\n    Will keep trying to add a playlist if its not in the list\n    If the playlist isn't loaded yet we have to wait\n**/\nvoid\nSpotifyPlaylists::stateChanged( sp_playlist* pl, void* userdata )\n{\n    SpotifyPlaylists* _playlists = reinterpret_cast<SpotifyPlaylists*>( userdata );\n    if ( !sp_playlist_is_loaded( pl ) )\n    {\n//       qDebug() << \"Playlist isn't loaded yet, waiting\";\n      return;\n    }\n    else\n    {\n        // if it was just loaded and we don't have it yet, add it\n        LoadedPlaylist playlist;\n        playlist.playlist_ = pl;\n        sp_playlist_update_subscribers( SpotifySession::getInstance()->Session(), pl );\n        const int index = _playlists->m_playlists.indexOf( playlist );\n        if ( index == -1 )\n        {\n//            qDebug() << Q_FUNC_INFO << \"Invoking addPlaylist from stateChanged callback as playlist is not in our list!\";\n            if ( QThread::currentThread() != QCoreApplication::instance()->thread() )\n                QMetaObject::invokeMethod( _playlists, \"addPlaylist\", Qt::QueuedConnection, Q_ARG(sp_playlist*, pl) );\n            else\n                _playlists->addPlaylist( pl );\n        }\n    }\n}\n\n\n/**\n  Callback\n    State changed\n    Called from libspotify when state changed on playlist\n**/\n\nvoid\nSpotifyPlaylists::syncStateChanged( sp_playlist* pl, void* userdata )\n{\n    qDebug() << \"Playlist state changed for synced playlist:\" << pl << sp_playlist_name(pl) << \"is loaded?\" << sp_playlist_is_loaded(pl);\n    if ( !sp_playlist_is_loaded( pl ) )\n    {\n//       qDebug() << \"Playlist isn't loaded yet, waiting\";\n      return;\n    }\n\n    SpotifyPlaylists* _playlists = reinterpret_cast<SpotifyPlaylists*>( userdata );\n    LoadedPlaylist playlist;\n    playlist.playlist_ = pl;\n    const int index = _playlists->m_playlists.indexOf( playlist );\n    if ( index == -1 )\n    {\n        qWarning() << \"Got stateChanged for syncplaylist, but isnt in our list!\";\n        return;\n    }\n\n    sp_playlist_update_subscribers( SpotifySession::getInstance()->Session(), pl );\n\n    bool collab = sp_playlist_is_collaborative( pl );\n\n    if( collab != _playlists->m_playlists[ index ].isCollaborative )\n    {\n        qDebug() << \"Collaborative changed, sending\";\n        _playlists->m_playlists[ index ].isCollaborative = collab;\n        emit _playlists->notifyCollaborativeChanged( _playlists->m_playlists[ index ] );\n    }\n\n}\n\nvoid\nSpotifyPlaylists::subscribersChanged( sp_playlist *pl, void *userdata )\n{\n    SpotifyPlaylists* _playlists = reinterpret_cast<SpotifyPlaylists*>( userdata );\n    LoadedPlaylist playlist;\n    playlist.playlist_ = pl;\n    const int index = _playlists->m_playlists.indexOf( playlist );\n    if ( index == -1 )\n    {\n        qWarning() << \"Got subscribersChanged for syncplaylist, but isnt in our list!\";\n        return;\n    }\n\n    int subCount = sp_playlist_num_subscribers( pl );\n    if( subCount != _playlists->m_playlists[ index ].numSubscribers )\n    {\n        qDebug() << \"Number of subscribers changed, sending!\";\n        _playlists->m_playlists[ index ].numSubscribers = sp_playlist_num_subscribers( pl );\n        emit _playlists->notifySubscriberCountChanged( _playlists->m_playlists[ index ] );\n    }\n}\n\nvoid\nSpotifyPlaylists::playlistRenamed(sp_playlist *pl, void *userdata)\n{\n    qDebug() << \"Playlist renamned to \" << sp_playlist_name( pl );\n    SpotifyPlaylists* _playlists = reinterpret_cast<SpotifyPlaylists*>( userdata );\n    _playlists->playlistNameChange( pl );\n}\n\nvoid\nSpotifyPlaylists::playlistMetadataUpdated( sp_playlist *pl, void *userdata )\n{\n    SpotifyPlaylists* _playlists = reinterpret_cast<SpotifyPlaylists*>( userdata );\n    sp_playlist_update_subscribers( SpotifySession::getInstance()->Session(), pl );\n    _playlists->checkForPlaylistCallbacks( pl, userdata );\n}\n\nvoid\nSpotifyPlaylists::checkForPlaylistCallbacks( sp_playlist *, void * )\n{\n    // If we care about this state changed b/c we have a callback registered, fire it\n    foreach ( PlaylistClosure* callback, m_stateChangedCallbacks )\n    {\n        if ( callback->conditionSatisfied() )\n        {\n//            qDebug() << \"Callback condition satisfied, all systems go!\";\n            // Callback is ready to fire, cap'n!\n            callback->invoke();\n            m_stateChangedCallbacks.removeAll( callback );\n            delete callback;\n        }\n    }\n}\n\n/**\n  checkWaitingForLoads\n  Periodic check for tracks waiting to load\n  **/\nvoid\nSpotifyPlaylists::checkWaitingForLoads()\n{\n    if ( m_stateChangedCallbacks.isEmpty() )\n        return;\n\n//    qDebug() << \"Periodic check for tracks waiting to load....\";\n    foreach ( const LoadedPlaylist& pl, m_playlists )\n    {\n        checkForPlaylistCallbacks( pl.playlist_, this );\n    }\n}\n\n\n/**\n  getPlaylistFromUri\n  returns a playlist from qstring\n  **/\nsp_playlist * SpotifyPlaylists::getPlaylistFromUri(const QString &uri)\n{\n\n    sp_link *plink = sp_link_create_from_string( uri.toLocal8Bit() );\n    if ( !plink )\n    {\n        qDebug() << \"Playlist link is not a spotify link\";\n        return NULL;\n    }\n\n    if ( sp_link_type( plink ) != SP_LINKTYPE_PLAYLIST )\n    {\n        qDebug() << \"Playlist link is not a valid spotify link\";\n        sp_link_release( plink );\n        return NULL;\n    }\n    sp_playlist *playlist = sp_playlist_create(SpotifySession::getInstance()->Session(), plink);\n    sp_link_release( plink );\n    return playlist;\n\n}\n\n/**\n  setSubscribedPlaylist\n  Takes QString uri, to add a subscribed playlist to container.\n  it will be added to synclist + subscribedlist\n  **/\nvoid SpotifyPlaylists::setSubscribedPlaylist(const QString &playlistUri, bool subscribe )\n{\n    sp_playlist *playlist = getPlaylistFromUri( playlistUri );\n    if( !sp_playlist_is_loaded( playlist ) )\n    {\n        addStateChangedCallback( NewPlaylistClosure( boost::bind(checkPlaylistIsLoaded, playlist), this, SLOT( setSubscribedPlaylist(const QString&, bool) ), playlistUri, subscribe) );\n        return;\n    }\n\n    LoadedPlaylist lpl;\n    lpl.playlist_ = playlist;\n    lpl.id_ = playlistUri;\n\n    if( m_playlists.contains( lpl ) )\n    {\n        int index = m_playlists.indexOf( lpl );\n        if( index != -1 )\n        {\n            if( m_playlists[ index ].isSubscribed && !subscribe )\n            {\n                qDebug() << \"Removing subscription!\";\n                removeSubscribedPlaylist( m_playlists[ index ].playlist_ );\n            }\n            else\n            {\n                qDebug() << \"Playlist isnt subscribed but in our list?!\"\n                         << subscribe <<  m_playlists[ index ].id_ <<  m_playlists[ index ].isCollaborative\n                         <<  m_playlists[ index ].isLoaded <<  m_playlists[ index ].isSubscribed\n                         <<  m_playlists[ index ].name_;\n            }\n        }\n        return;\n    }\n\n    if( subscribe )\n    {\n        // Hard to set isSubscribed through playlist_added callback, as it doesnt accept userdata from here\n        addPlaylist( playlist, true, true );\n        /// @note we can subscribe on a non collaborative pl as well\n        sp_playlistcontainer_add_playlist( SpotifySession::getInstance()->PlaylistContainer(), sp_link_create_from_string( playlistUri.toUtf8() ) );\n        sp_playlist_update_subscribers( SpotifySession::getInstance()->Session(), playlist );\n    }\n    else\n    {\n        qWarning() << \"Asked to unsubscribe a playlist we don't know about!\" << playlistUri;\n    }\n}\n\n\n/**\n  removeSubscribedPlaylist\n  **/\nvoid SpotifyPlaylists::removeSubscribedPlaylist( sp_playlist* playlist )\n{\n    qDebug() << Q_FUNC_INFO;\n    LoadedPlaylist lpl;\n    lpl.playlist_ = playlist;\n\n    if( !m_playlists.contains( lpl ) )\n        return;\n\n    int index;\n    index = m_playlists.indexOf( lpl );\n    if( index != -1 )\n    {\n\n        if( m_playlists[ index ].isSubscribed )\n        {\n            qDebug() << \"Removing subscription\";\n            doRemovePlaylist( playlist );\n        }\n\n    }\n\n}\n\n/**\n  setCollaborative\n    sets collaborative state for playlist\n  **/\nvoid SpotifyPlaylists::setCollaborative(const QString &playlistUri, bool collab )\n{\n    qDebug() << Q_FUNC_INFO;\n    LoadedPlaylist lpl;\n    lpl.id_ = playlistUri;\n\n    if( !m_playlists.contains( lpl ) ){\n        qDebug() << \"Failed to set collbab for \" << playlistUri << \" not in playlistMap!\";\n        return;\n    }\n    int index;\n    index = m_playlists.indexOf( lpl );\n    if( index != -1 )\n    {\n        lpl = m_playlists[ index ];\n        // set_collaborative is void function, so check if the user can set the state on this uri\n        QString username = QString::fromLatin1(sp_user_canonical_name( sp_session_user( SpotifySession::getInstance()->Session() ) ) );\n        if( lpl.isLoaded )\n        {\n            if( username == lpl.owner_ )\n            {\n                qDebug() << \"Setting collab!\" << collab;\n                sp_playlist_set_collaborative(lpl.playlist_, collab );\n\n            }else\n                qDebug() << \"ERROR: This user doesnt have access to modify this playlist\";\n        }else\n            qDebug() << \"Error, playlist isnt loaded! hmhmhm\";\n    }\n\n}\n\n/**\n getLoadedPLaylist( sp_playlist )\n   Gets a specific playlist from the list with id (uri)\n**/\n\nSpotifyPlaylists::LoadedPlaylist\nSpotifyPlaylists::getLoadedPlaylist( sp_playlist *&playlist )\n{\n    LoadedPlaylist pl;\n    pl.playlist_ = playlist;\n    int index = m_playlists.indexOf( pl );\n    if( index != -1)\n        return m_playlists.at( index );\n    return pl;\n}\n\n\n/**\n  signal doSend\n  will send a LoadedPlaylist\n  **/\nvoid SpotifyPlaylists::doSend( const SpotifyPlaylists::LoadedPlaylist& playlist )\n{\n    if( !sp_playlist_is_loaded( playlist.playlist_) )\n        return;\n\n    qDebug() << \"Sending \" << sp_playlist_name( playlist.playlist_ ) << \"playlist to client with:\" << sp_playlist_num_tracks( playlist.playlist_ );\n    emit( sendLoadedPlaylist( playlist ) );\n}\n\n\n/**\n  Callback\n    State changed\n    Called from libspotify when a sp_playlistcontainer is loaded\n**/\n\nvoid\nSpotifyPlaylists::playlistContainerLoadedCallback( sp_playlistcontainer* pc, void* userdata)\n{\n    SpotifySession* _session = reinterpret_cast<SpotifySession*>( userdata );\n    if ( QThread::currentThread() != QCoreApplication::instance()->thread() )\n        QMetaObject::invokeMethod( _session->Playlists(), \"loadContainerSlot\", Qt::QueuedConnection, Q_ARG(sp_playlistcontainer*, pc) );\n    else\n        _session->Playlists()->loadContainerSlot( pc );\n\n}\n\n/**\n  loadedContainerSlot\n  this is invoked from callback when container is loaded\n  should be once per session/user\n  **/\nvoid\nSpotifyPlaylists::loadContainerSlot(sp_playlistcontainer *pc){\n\n    qDebug() << Q_FUNC_INFO;\n    if( !m_allLoaded && !m_isLoading )\n    {\n        qDebug() << \"Container load from thread id\" << thread()->currentThreadId();\n        int numPls = sp_playlistcontainer_num_playlists( pc );\n\n        if(numPls == -1)\n        {\n            qDebug() << \"Container is empty!\";\n            return;\n        }\n\n        qDebug() << \"Trying to load \" << numPls << \"playlists from this container!\";\n\n        m_isLoading = true;\n        m_waitingToLoad.clear();\n\n        for ( int i = 0 ; i < numPls; ++i )\n        {\n\n            sp_playlist_type type = sp_playlistcontainer_playlist_type(pc, i);\n            /**\n              There are 4 types of playlist\n                Placeholder ( Can be anything, artist, track, playlist whatever (resides in inbox)\n                Folder Start\n                Folder End\n                Playlist\n              Folder is just a name for a parent\n              Placeholder we dont care about atm\n              Playlist is what we want. Thus, sp_playlistcontainer_num_playlist is not\n              really a great nominee for playlistcount.\n              **/\n            if( type == SP_PLAYLIST_TYPE_PLAYLIST )\n            {\n                sp_playlist* pl = sp_playlistcontainer_playlist( pc, i );\n\n                //qDebug() << \"Adding playlist:\" << pl << sp_playlist_is_loaded( pl ) << sp_playlist_name( pl ) << sp_playlist_num_tracks( pl );\n                if ( sp_playlist_is_loaded( pl ) )\n                    addPlaylist( pl );\n                else\n                    m_waitingToLoad << pl;\n            }\n        }\n\n        /// Add starredTracks, should be an option\n        /// @note we need to wait for the starred list as well\n        addStarredTracksToContainer();\n        checkForPlaylistsLoaded();\n\n    }\n\n    m_checkPlaylistsTimer->start();\n}\n\n/**\n  playlistNameChange\n  called from callback\n  **/\nvoid\nSpotifyPlaylists::playlistNameChange(sp_playlist *pl )\n{\n\n    LoadedPlaylist playlist;\n    playlist.playlist_ = pl;\n    const int index = m_playlists.indexOf( playlist );\n\n    if( index == -1 )\n    {\n        qWarning() << \"Renamed a playlist we don't know about? WTF!\" << ( QString::fromUtf8(sp_playlist_name( pl )).isEmpty() ? \"empty name \" : sp_playlist_name( pl ) );\n        return;\n    }\n\n    qDebug() << \"Renamning \" << m_playlists[index].name_ << \" to \" << sp_playlist_name( pl );\n    m_playlists[index].name_ = QString::fromUtf8( sp_playlist_name( pl ) );\n\n    // container update, send signal, notify name change\n    emit notifyContainerLoadedSignal();\n    const SpotifyPlaylists::LoadedPlaylist send = m_playlists[index];\n    emit notifyNameChange( send );\n\n}\n\n/**\n  addStarredTracksContainer()\n  This creates the starred tracks playlist, and will automatically add it to the synclist\n  The starredTracks container is not a playlist and has no name. But it has a special uri\n  and that uri is changed in v11\n**/\nvoid\nSpotifyPlaylists::addStarredTracksToContainer()\n{\n\n    sp_playlist* starredTracks = sp_session_starred_create( SpotifySession::getInstance()->Session() );\n    qDebug() << \"Created starred playlist:\" << starredTracks;\n\n    if ( sp_playlist_is_loaded( starredTracks ) )\n    {\n        qDebug() << \"Starred tracks loaded!\";\n        addPlaylist( starredTracks );\n\n    }\n    else\n    {\n        qDebug() << \"Starred not loaded, adding to wait\";\n        m_waitingToLoad << starredTracks;\n    }\n\n\n}\n\n/**\n  waitForLoad ( sp_playlist * )\n  convenient way to wait for a playlist\n  **/\nvoid\nSpotifyPlaylists::waitForLoad( sp_playlist *playlist )\n{\n    if ( sp_playlist_is_loaded( playlist ) )\n    {\n        qDebug() << \"WaitForLoaded is loaded\" << sp_playlist_name( playlist );\n        addPlaylist( playlist );\n\n    }\n    else\n    {\n        qDebug() << \"WaitForLoaded not loaded, adding to wait\";\n        m_waitingToLoad << playlist;\n    }\n    checkForPlaylistsLoaded();\n}\n\n/**\n  Callback\n    PlaylistAdded\n    Called from libspotify when a new playlist is added\n    @note, the new playlist doesnt have ANY callbacks at this state\n**/\n\nvoid\nSpotifyPlaylists::playlistAddedCallback( sp_playlistcontainer* pc, sp_playlist* playlist, int position, void* userdata )\n{\n    QString pl;\n    if ( playlist )\n        pl = QString::fromUtf8( sp_playlist_name( playlist ) );\n//        qDebug() << Q_FUNC_INFO << \"================ IN PLAYLISTADDED CALLBACK for playlist:\" << playlist << pl;\n\n    SpotifySession* _session = reinterpret_cast<SpotifySession*>( userdata );\n\n    const QString name = QString::fromUtf8( sp_playlist_name( playlist ) );\n    if ( _session->Playlists()->m_playlistNameCreationToIgnore.contains( name ) )\n    {\n        _session->Playlists()->m_playlistNameCreationToIgnore.remove( name );\n        return;\n    }\n\n    _session->Playlists()->waitForLoad( playlist );\n\n}\n\n/**\n  Callback\n    playlistMoveCallback\n    Called from libspotify when posistion changed on playlist\n**/\n\nvoid\nSpotifyPlaylists::playlistMovedCallback( sp_playlistcontainer* pc, sp_playlist* playlist, int position, int new_position, void* userdata ) {\n\n    qDebug() << \"Playlist Moved\";\n    SpotifySession* _session = reinterpret_cast<SpotifySession*>( userdata );\n    if ( QThread::currentThread() != QCoreApplication::instance()->thread() )\n        QMetaObject::invokeMethod( _session->Playlists(), \"setPosition\", Qt::QueuedConnection, Q_ARG(sp_playlist*, playlist), Q_ARG(int, position), Q_ARG(int, new_position) );\n    else\n        _session->Playlists()->setPosition( playlist, position, new_position );\n}\n\n/**\n  Callback\n    playlistRemovedCallback\n    Called from callback when playlist got removed\n**/\n\nvoid\nSpotifyPlaylists::playlistRemovedCallback( sp_playlistcontainer* pc, sp_playlist* playlist, int position, void* userdata ) {\n\n    Q_UNUSED( position );\n    QString name;\n    if ( playlist )\n        name = QString::fromUtf8( sp_playlist_name( playlist ) );\n\n    qDebug() << \"Playlist removed\" << playlist << name;\n\n    SpotifySession* _session = reinterpret_cast<SpotifySession*>( userdata );\n    if ( QThread::currentThread() != QCoreApplication::instance()->thread() )\n        QMetaObject::invokeMethod( _session->Playlists(), \"removePlaylistNotification\", Qt::QueuedConnection, Q_ARG(sp_playlist*, playlist) );\n    else\n        _session->Playlists()->removePlaylistNotification( playlist );\n}\n\n/**\n  Callback\n    tracksAdded\n    Called from libspotify when tracks where added\n**/\n\nvoid\nSpotifyPlaylists::tracksAdded(sp_playlist *pl, sp_track * const *tracks, int num_tracks, int position, void *userdata)\n{\n    qDebug() << \"Tracks Added\";\n    SpotifyPlaylists* _playlists = reinterpret_cast<SpotifyPlaylists*>( userdata );\n\n    // We want to make sure it lives on to the queued slot\n    QList<sp_track*> trackList;\n    for( int i = 0; i < num_tracks; i++ )\n    {\n        sp_track* track = tracks[i];\n        sp_track_add_ref( track );\n        trackList << track;\n    }\n\n    if ( QThread::currentThread() != QCoreApplication::instance()->thread() )\n        QMetaObject::invokeMethod( _playlists, \"addTracksFromSpotify\", Qt::QueuedConnection, Q_ARG(sp_playlist*, pl), Q_ARG(QList<sp_track*>, trackList), Q_ARG(int, position) );\n    else\n        _playlists->addTracksFromSpotify( pl, trackList, position );\n}\n\n\n/**\n  PlaylistClosure\n  adds callbacks\n  **/\n\nvoid\nSpotifyPlaylists::addStateChangedCallback( PlaylistClosure *closure )\n{\n//    qDebug() << \"Adding state changed callback! Oh yeah....\";\n    m_stateChangedCallbacks << closure;\n}\n\n/**\n   addTracksFromSpotify\n   called from callback to add tracks from spotify\n**/\nvoid\nSpotifyPlaylists::addTracksFromSpotify(sp_playlist* pl, QList<sp_track*> tracks, int pos)\n{\n    qDebug() << \"Adding tracks to\" << sp_playlist_name(pl) << \"from spotify notification\";\n    LoadedPlaylist playlist;\n    playlist.playlist_ = pl;\n    const int index = m_playlists.indexOf( playlist );\n\n    if( index == -1 )\n    {\n\n        qWarning() << \"Got added tracks for a playlist we don't know about? WTF!\"\n                   << ( QString::fromUtf8(sp_playlist_name( pl )).isEmpty() ? \"empty name \" : sp_playlist_name( pl ) );\n        return;\n    }\n\n    // find the spotify track of the song before the newly inserted one\n    const int beforePos = (pos == 0 ? 0 : pos - 1);\n    char trackStr[256];\n    sp_track* t = sp_playlist_track( pl, beforePos );\n\n    if ( !t || !sp_track_is_loaded( t ) )\n    {\n        qWarning() << \"NOTE! Got tracks inserted after a track that is not loaded or null! \"\n                   << beforePos << t << (t ? sp_track_is_loaded( t ) : false);\n        if ( !t )\n        {\n            qWarning() << \"TODO can't handle null tracks in playlist... how did this happen?\";\n            return;\n        }\n        else\n        {\n//            qDebug() << \"Adding state changed callback for addPlaylist, track not loaded yet\";\n            QList<sp_track*> waitingFor;\n            waitingFor << t;\n            addStateChangedCallback( NewPlaylistClosure( boost::bind(checkTracksAreLoaded, waitingFor), this, SLOT( addTracksFromSpotify(sp_playlist*, QList<sp_track*>, int ) ), pl,  tracks, pos) );\n        }\n\n        return;\n    }\n\n    // check all tracks are loaded, if not, wait for them\n    QList<sp_track*> waitingFor;\n    foreach ( sp_track* t, tracks )\n    {\n        if ( !t )\n        {\n            qDebug() << \"got NULL track in addTracksFromSpotify, can't handle. ignoring this track!\";\n            continue;\n        }\n        else if ( !sp_track_is_loaded(t) )\n        {\n            qDebug() << Q_FUNC_INFO << \"Got not loaded sp_track, waiting!\";\n            waitingFor << t;\n        }\n    }\n\n    if ( !waitingFor.isEmpty() )\n    {\n        // Wait!\n        addStateChangedCallback( NewPlaylistClosure( boost::bind(checkTracksAreLoaded, waitingFor), this, SLOT( addTracksFromSpotify(sp_playlist*, QList<sp_track*>, int ) ), pl,  tracks, pos) );\n        return;\n    }\n\n    sp_link* link = sp_link_create_from_track( t, 0 );\n    sp_link_as_string( link, trackStr, sizeof( trackStr ) );\n    const QString trackPosition = QString::fromUtf8( trackStr );\n    sp_link_release( link );\n\n    int runningPos = pos; // We start one before, since spotify reports the end index, not index of item to insert after\n    foreach( sp_track* track, tracks )\n    {\n        qDebug() << \"Adding track \" << sp_track_name( track ) << \"at pos:\" << runningPos;\n        sp_track_add_ref( track );\n        m_playlists[index].tracks_.insert(runningPos, track );\n        runningPos++;\n\n        // This undoes the sp_track_add_ref in the addTracks callback\n        sp_track_release( track );\n    }\n\n    runningPos++; // We found the track to insert after, so increase for new index\n//    qDebug() << \"Playlist changed, updateing revision\";\n    updateRevision( m_playlists[index] );\n\n    if ( sApp->ignoreNextUpdate() )\n    {\n        qDebug() << \"Ignoring spotify track added notification since it came from our own track insertion!\";\n        sApp->setIgnoreNextUpdate( false );\n        return;\n    }\n\n    if( m_playlists[index].starContainer_ )\n    {\n        qDebug() << \"Tracks where added to starContainer!\";\n        emit sendStarredChanged(pl, tracks, true);\n        //sApp->setIgnoreNextUpdate( true );\n    }\n\n    emit sendTracksAdded(pl, tracks, trackPosition);\n}\n\n\n/**\n  getPlaylistByRevision\n  Get the playlist by last known revision,\n  return empty LoadedPlaylist if non found.\n**/\nSpotifyPlaylists::LoadedPlaylist\nSpotifyPlaylists::getPlaylistByRevision( QString revision )\n{\n    RevisionChanges rev;\n    rev.revId = revision;\n\n    LoadedPlaylist playlist;\n    foreach( LoadedPlaylist pl, m_playlists)\n    {\n        if( pl.revisions.contains( rev ) )\n        {\n            return pl;\n        }\n    }\n    return playlist;\n\n}\n\n\n/**\n * Sends the latest version of a playlist, and starts syncing if necessary\n */\nvoid\nSpotifyPlaylists::sendPlaylist( const QString& playlistId, bool startSyncing )\n{\n    LoadedPlaylist pl;\n    pl.id_ = playlistId;\n    if ( !m_playlists.contains( pl ) )\n    {\n        qWarning() << \"Asked to fetch and sync a playlist that we dont' know about!!\" << playlistId;\n        return;\n    }\n\n    pl = m_playlists.at( m_playlists.indexOf( pl ) );\n\n    if ( !pl.isLoaded )\n    {\n        qWarning() << \"SpotiyPlaylists asked to send playlist that is not loaded yet!\" << playlistId << startSyncing;\n        return;\n    }\n\n    // NOTE HACK since m_playlists stores by value, setSyncPlaylist modifies m_playlists, but that\n    // won't change our local copy pl.\n    if ( !pl.sync_ && startSyncing )\n        setSyncPlaylist( playlistId, true );\n\n    doSend( m_playlists.at( m_playlists.indexOf( pl ) ) );\n}\n\n\n/**\n  sendPlaylistByRevision\n  Will send a playlist that contains revision\n  **/\n/*void\nSpotifyPlaylists::sendPlaylistByRevision( int revision )\n{\n    RevisionChanges rev;\n    rev.revId = revision;\n\n    foreach( LoadedPlaylist pl, m_playlists)\n    {\n        if( pl.revisions.contains( rev ) ){\n            qDebug() << \"Sending revision\";\n            doSend( pl );\n            break;\n        }\n    }\n\n\n}*/\n\n/**\n  removeTracks(sp_playlist*, const int*tracks, int num_tracks)\n  This is called from callback, removes tracks from this playlist when\n  changed in Spotify\n**/\nvoid\nSpotifyPlaylists::removeTracksFromSpotify(sp_playlist* pl, QList<int> tracks)\n{\n//    qDebug() << \"Removing tracks in thread id\" << thread()->currentThreadId();\n    LoadedPlaylist playlist;\n    playlist.playlist_ = pl;\n\n    const int index = m_playlists.indexOf( playlist );\n\n    if( index == -1 ) {\n\n        qWarning() << \"Got added tracks for a playlist we don't know about? WTF!\" << sp_playlist_name( pl );\n        return;\n    }\n\n    QStringList trackIds;\n    QList< sp_track* > toRemove;\n    foreach( int pos, tracks )\n    {\n        int realIdx = pos;\n        if ( pos == m_playlists[index].tracks_.size() )\n            realIdx--;\n\n        if ( realIdx < 0 || realIdx >= m_playlists[index].tracks_.size() )\n        {\n            qWarning() << \"Tried to remove tracks at index:\" << realIdx << \"(originally\" << pos\n                       << \") from tracks list that is out of bounds!! We have size:\" << m_playlists[index].tracks_.size();\n            continue;\n        }\n\n        qDebug() << \"Removing track at\" << realIdx;\n        sp_track* track = m_playlists[index].tracks_.at( realIdx );\n        trackIds << trackId( track );\n        toRemove << track;\n    }\n\n    foreach ( sp_track* remove, toRemove )\n    {\n        const int got = m_playlists[ index ].tracks_.removeAll( remove );\n        qDebug() << \"removing:\" << sp_track_name(remove) << sp_artist_name(sp_track_artist(remove, 0))\n                 << \"and actually removed:\" << got;\n        sp_track_release( remove );\n    }\n\n    // We need to update the revision with current timestamp\n    int timestamp =  QDateTime::currentMSecsSinceEpoch() / 1000;\n    updateRevision( m_playlists[index], timestamp, trackIds );\n\n    if ( sApp->ignoreNextUpdate() )\n    {\n        qDebug() << \"Ignoring spotify track removed notification since it came from our own track removal!\";\n        sApp->setIgnoreNextUpdate( false );\n        return;\n    }\n\n    if( m_playlists[index].starContainer_ )\n    {\n        qDebug() << \"Tracks where removed to starContainer!\";\n        emit sendStarredChanged(pl, toRemove, false);\n        //sApp->setIgnoreNextUpdate( true );\n    }\n\n    emit sendTracksRemoved(pl, trackIds);\n}\n\n/**\n    moveTracks(sp_playlist* pl, const int *tracks, int num_tracks, int new_position)\n    called from callback\n**/\n\nvoid\nSpotifyPlaylists::moveTracks(sp_playlist* pl, QList<int> tracks, int new_position)\n{\n    LoadedPlaylist playlist;\n    playlist.playlist_ = pl;\n\n    const int index = m_playlists.indexOf( playlist );\n    if( index == -1 )\n    {\n        qWarning() << \"Got moved tracks for a playlist we don't know about? WTF!\" << sp_playlist_name( pl );\n        return;\n    }\n\n    sp_track* beforeinsert = 0;\n    if ( new_position > 0 )\n    {\n        if ( new_position <= m_playlists[index].tracks_.size() )\n        {\n            beforeinsert = m_playlists[index].tracks_.at( new_position-1 );\n        }\n        else\n        {\n            qWarning() << \"Bad insert position??\" << \"pos: \" << new_position << \" size: \" <<  m_playlists[index].tracks_.size();\n            return;\n        }\n    }\n    qDebug() << \"Moving tracks in a synced spotify playlist, from indexes:\" << tracks << \"to new position:\" << new_position;\n\n    // find the spotify track of the song before the newly inserted one\n    const QString trackPosition = trackId( beforeinsert );\n\n    QList<sp_track*> toInsert;\n    QStringList moveIds;\n    foreach( int fromPos, tracks )\n    {\n        int realIdx = fromPos;\n        if ( fromPos == m_playlists[index].tracks_.size() )\n            realIdx--;\n\n        if ( realIdx < 0 || realIdx >= m_playlists[index].tracks_.size() )\n        {\n            qWarning() << \"Tried to move tracks at index:\" << realIdx << \"(originally\" << fromPos\n                       << \") from tracks list that is out of bounds!! We have size:\" << m_playlists[index].tracks_.size();\n            continue;\n        }\n\n        toInsert << m_playlists[index].tracks_[realIdx];\n        moveIds << trackId( m_playlists[index].tracks_[realIdx] );\n\n    }\n\n    foreach( sp_track* removing, toInsert )\n        m_playlists[index].tracks_.removeAll( removing );\n\n\n    int insertingPos = m_playlists[index].tracks_.indexOf( beforeinsert ) + 1;\n    insertingPos = qBound<>( 0, insertingPos, m_playlists[ index ].tracks_.size() );\n\n    for( int i = toInsert.size() - 1; i >= 0; i-- )\n    {\n//         qDebug() << \"Moving track at pos \" << fromPos << \" to pos\" << new_position;\n        m_playlists[index].tracks_.insert(insertingPos, toInsert[i]);\n    }\n\n    qDebug() << \"Tracks moved\";\n    // We need to update the revision with current timestamp\n    int timestamp =  QDateTime::currentMSecsSinceEpoch() / 1000;\n    qDebug() << \"Updateing revision with move track timestamp \" << timestamp;\n\n    updateRevision( m_playlists[index], timestamp );\n\n\n    if ( sApp->ignoreNextUpdate() )\n    {\n        qDebug() << \"Ignoring spotify track moved notification since it came from our own track moving!\";\n        sApp->setIgnoreNextUpdate( false );\n        return;\n    }\n\n    emit sendTracksMoved(pl, moveIds, trackPosition);\n}\n\n/**\n  trackId\n  returns qstring\n  **/\nQString\nSpotifyPlaylists::trackId( sp_track* track )\n{\n    if ( !track )\n        return QString();\n\n    QString trackIdStr;\n\n    char trackId[256];\n    sp_link* link = sp_link_create_from_track( track, 0 );\n    sp_link_as_string( link, trackId, sizeof( trackId ) );\n    trackIdStr = QString::fromUtf8( trackId );\n    sp_link_release( link );\n\n    return trackIdStr;\n}\n\n\n\n/**\n getPLaylist( const QString )\n Gets a specific playlist from the list with id (uri)\n **/\n\nSpotifyPlaylists::LoadedPlaylist\nSpotifyPlaylists::getPlaylist( const QString id )\n{\n    LoadedPlaylist pl;\n    pl.playlist_ = 0;\n    pl.id_ = id;\n    int index = m_playlists.indexOf( pl );\n    if( index != -1)\n        return m_playlists.at( index );\n    return pl;\n}\n\n/**\n  setSyncPlaylist( const QString )\n    sets syncflags on a playlist\n    Saves state to QSettings\n **/\n\nvoid\nSpotifyPlaylists::setSyncPlaylist( const QString id, bool sync )\n{\n    LoadedPlaylist pl;\n    pl.id_ = id;\n//   qDebug() << \"Setting sync for \" << id << \"to:\" << sync;\n    int index = m_playlists.indexOf( pl );\n    if( index != -1 )\n    {\n        // Set QSettings to be able to remember state on startup\n        Sync syncThis;\n        syncThis.id_ = id;\n        syncThis.sync_ = sync;\n        int syncIndex = m_syncPlaylists.indexOf( syncThis );\n\n        // The playlist isnt in syncmode yet, set it\n        if( sync )\n        {\n\n            // We might be setting an (already synced previously) playlist to sync\n            // during the initial load. in that case loadSettings() loaded it in m_syncPlaylists\n            // but we just now loaded the real playlist from spotify, so sync it up\n            if ( !m_syncPlaylists.contains( syncThis ) )\n                m_syncPlaylists.append( syncThis );\n\n\n            m_playlists[ index ].sync_ = true;\n            // Playlist contents may have changed since we originally loaded it, so we refresh it now\n            m_playlists[ index ].tracks_.clear();\n            for( int i = 0; i < sp_playlist_num_tracks( m_playlists[ index ].playlist_ ); i++ )\n                m_playlists[ index ].tracks_ << sp_playlist_track( m_playlists[ index ].playlist_, i );\n\n            // We dont need to listen for regular changes\n            sp_playlist_remove_callbacks( m_playlists[ index ].playlist_, &SpotifyCallbacks::playlistCallbacks, this);\n            qDebug() << \"ADDING SYNC CALLBACKS FOR PLAYLIST:\" << sp_playlist_name( m_playlists[ index ].playlist_ );\n            if ( m_playlists[ index ].sync_ )\n            {\n                qDebug() << \"ASKING TO SYNC A ALREADY SYNCED PLAYLIST\";\n                sp_playlist_remove_callbacks( m_playlists[ index ].playlist_, &SpotifyCallbacks::syncPlaylistCallbacks, this);\n            }\n            sp_playlist_add_callbacks( m_playlists[ index ].playlist_, &SpotifyCallbacks::syncPlaylistCallbacks, this);\n        }\n        // The playlist is in syncmode, but user wants to remove it\n        else if( syncIndex != -1 && !sync )\n        {\n            m_syncPlaylists.removeAt( syncIndex );\n            m_playlists[ index ].sync_ = false;\n            sp_playlist_remove_callbacks( m_playlists[ index ].playlist_, &SpotifyCallbacks::syncPlaylistCallbacks, this);\n            sp_playlist_add_callbacks( m_playlists[ index ].playlist_, &SpotifyCallbacks::playlistCallbacks, this);\n        }\n\n        writeSettings();\n    }\n    else\n    {\n        qWarning() << \"Tried to set sync to \" << sync << \"for a playlist that doesn't exist!\";\n    }\n}\n\n\n/**\n  tracksRemoved\n  Callback from libspotify\n  **/\n\nvoid SpotifyPlaylists::tracksRemoved(sp_playlist *playlist, const int *tracks, int num_tracks, void *userdata)\n{\n    SpotifyPlaylists* _playlists = reinterpret_cast<SpotifyPlaylists*>( userdata );\n\n    QList<int> removedTrackIndices;\n    for (int i = 0; i < num_tracks; i++)\n        removedTrackIndices << tracks[i];\n\n    qDebug() << \"Tracks removed callback for playlist:\" << sp_playlist_name( playlist ) << \"and indices removed:\" << removedTrackIndices << \", now calling member func\";\n    if ( QThread::currentThread() != QCoreApplication::instance()->thread() )\n        QMetaObject::invokeMethod( _playlists, \"removeTracksFromSpotify\", Qt::QueuedConnection, Q_ARG(sp_playlist*, playlist), Q_ARG(QList<int>, removedTrackIndices));\n    else\n        _playlists->removeTracksFromSpotify( playlist, removedTrackIndices );\n}\n\n/**\n  tracksMoved\n  Callback from libspotify\n  **/\n\nvoid\nSpotifyPlaylists::tracksMoved(sp_playlist *playlist, const int *tracks, int num_tracks, int new_position, void *userdata)\n{\n\n    qDebug() << \"Tracks moved\";\n    SpotifyPlaylists* _playlists = reinterpret_cast<SpotifyPlaylists*>( userdata );\n\n    QList<int> movedTrackIndices;\n    for (int i = 0; i < num_tracks; i++)\n        movedTrackIndices << tracks[i];\n\n    if ( QThread::currentThread() != QCoreApplication::instance()->thread() )\n        QMetaObject::invokeMethod( _playlists, \"moveTracks\", Qt::QueuedConnection, Q_ARG(sp_playlist*, playlist), Q_ARG(QList<int>, movedTrackIndices), Q_ARG(int, new_position) );\n    else\n        _playlists->moveTracks( playlist, movedTrackIndices, new_position );\n\n}\n\n\n/**\n\n setPosition( sp_playlist *, int, int )\n   Updates the position of the playlist, if moved\n**/\nvoid SpotifyPlaylists::setPosition( sp_playlist *playlist, int oPos, int nPost )\n{\n    LoadedPlaylist pl;\n    pl.playlist_ = playlist;\n\n    int index = m_playlists.indexOf( pl );\n\n    if( index != -1)\n        if( m_playlists.count() > nPost )\n            m_playlists.move( oPos, nPost ); //( index );\n\n}\n\n/**\n  removePlaylistNotification\n  got a notification to delete a spotify playlist\n  **/\nvoid\nSpotifyPlaylists::removePlaylistNotification( sp_playlist* playlist )\n{\n    if ( m_waitingToLoad.contains( playlist ) )\n    {\n        // short circuit---if we're waiting for it to load, just abort the wait\n        m_waitingToLoad.removeAll( playlist );\n        return;\n    }\n\n    LoadedPlaylist pl;\n    pl.playlist_ = playlist;\n\n    int index = m_playlists.indexOf( pl );\n\n    qDebug() << Q_FUNC_INFO << \"Got playlist deleted:\" << playlist;\n    if( index != -1)\n    {\n        const QString plid = m_playlists[ index ].id_;\n        Sync s;\n        s.id_ = m_playlists[ index ].id_;\n\n        if ( m_syncPlaylists.contains( s ) )\n        {\n //           qDebug() << Q_FUNC_INFO << \"And deleted playlist is synced, so sending to clients:\" << plid;\n            m_syncPlaylists.removeAll( s );\n        }\n\n        if ( !sApp->ignoreNextUpdate() )\n            emit sendPlaylistDeleted( plid );\n\n        m_playlists.removeAt( index );\n\n    }\n\n    writeSettings();\n    emit notifyContainerLoadedSignal();\n}\n\n/**\n  doRemovePlaylist\n  Slot to remove a playlist from the container, PERMANENT\n\n  **/\nvoid\nSpotifyPlaylists::doRemovePlaylist( sp_playlist *playlist )\n{\n    LoadedPlaylist pl;\n    pl.playlist_ = playlist;\n\n    int index = m_playlists.indexOf( pl );\n    int pcIndex = index;\n\n    if ( sp_playlistcontainer_playlist( SpotifySession::getInstance()->PlaylistContainer(), index ) != playlist )\n    {\n        qWarning() << \"Was asked to delete a playlist that we have in a different index from the playlist container! Trying to find the real one\";\n        for( int i = 0; i < sp_playlistcontainer_num_playlists( SpotifySession::getInstance()->PlaylistContainer() ); i++ )\n        {\n            if ( sp_playlistcontainer_playlist( SpotifySession::getInstance()->PlaylistContainer(), i ) == playlist )\n            {\n                pcIndex = i;\n                break;\n            }\n        }\n    }\n\n    if ( pcIndex > -1 )\n    {\n        sApp->setIgnoreNextUpdate( true );\n        sp_playlistcontainer_remove_playlist( SpotifySession::getInstance()->PlaylistContainer(), pcIndex );\n    } else\n        qWarning() << \"Failed to find playlist to delete in the playlistcontainer....\";\n}\n\n/**\n setPlaylistInProgress( sp_playlist *, bool)\n   This function is called from callback\n   Sets a bool on the playlist if its loading or not\n**/\nvoid\nSpotifyPlaylists::setPlaylistInProgress( sp_playlist *pl, bool done )\n{\n//    qDebug()<< Q_FUNC_INFO << \"got PLAYLIST_IN_PROGRESS with playlist and done?: \" << sp_playlist_name(pl) << done << \"playlist is loaded?\" << sp_playlist_is_loaded(pl);\n//     qDebug() << \"In Progress in thread id\" << thread()->currentThreadId();\n//     LoadedPlaylist playlist;\n//     playlist.playlist_ = pl;\n//\n//     const int index = m_playlists.indexOf( playlist );\n//\n//     if( index != -1 ){\n//         qDebug() << \"Playlist progress is\" << (done ? \"done\" : \"still loading...\" ) << index << \"(\" << sp_playlist_name(pl) << \")\";\n//         m_playlists[ index ].isLoaded = done;\n//         if( done && m_playlists[index].sync_)\n//         {\n//             // Sometimes, the api will send the playlist twice, dont do this\n//             // if its allready been sent.\n//\n//             if( m_playlists[ index ].sentRev != m_playlists[ index ].newRev ){\n//                 m_playlists[ index ].sentRev = m_playlists[ index ].newRev;\n// //                foreach( RevisionChanges changes, m_playlists[index].revisions)\n// //                    qDebug() << \"Revision id \" << changes.revId;\n//                 doSend( m_playlists[ index ] );\n//             }\n//         }\n//     }\n\n\n}\n\n/**\n  playlistUpdateInProgress\n  Callback, fired whenever a change is processed\n  **/\nvoid\nSpotifyPlaylists::playlistUpdateInProgress(sp_playlist *pl, bool done, void *userdata)\n{\n//     qDebug() << \"Update in progress\";\n    SpotifyPlaylists* _playlists = reinterpret_cast<SpotifyPlaylists*>( userdata );\n//     qDebug() << \"Invoking setPlaylistInProgress from thread id\" << _playlists->thread()->currentThreadId();\n    if ( QThread::currentThread() != QCoreApplication::instance()->thread() )\n        QMetaObject::invokeMethod( _playlists, \"setPlaylistInProgress\", Qt::QueuedConnection, Q_ARG(sp_playlist*, pl), Q_ARG(bool, done) );\n    else\n        _playlists->setPlaylistInProgress( pl, done );\n\n}\n\n/**\n  addNewPlaylist\n  this will create a new playlist from QVariantMap\n  The map must contain\n    Title\n    Sync\n    QVariantList of tracks\n        With string keys\n            track\n            artist\n            album\n    qid\n  **/\nvoid\nSpotifyPlaylists::addNewPlaylist( const QVariantMap& data )\n{\n    const QString title = data.value( \"title\" ).toString();\n    const bool sync = data.value( \"sync\" ).toBool();\n    const QString qid = data.value( \"qid\" ).toString();\n\n    qDebug() << \"Creating playlist with name \" << title;\n\n    if ( title.trimmed().isEmpty() )\n    {\n        qDebug() << \"Got empty or whitespace title... not allowed as a playlist name! ignoring.\";\n        return;\n    }\n\n    m_playlistNameCreationToIgnore.insert( title );\n    sp_playlist* playlist = sp_playlistcontainer_add_new_playlist( SpotifySession::getInstance()->PlaylistContainer(), title.toUtf8() );\n\n    qDebug() << \"Created playlist! Adding tracks to it if needed...\";\n    const QVariantList tracks = data.value( \"tracks\" ).toList();\n\n    doAddNewPlaylist( playlist, tracks, sync, qid );\n}\n\n/**\n  doAddNewPlaylist\n  slot to add new playlist\n  **/\nvoid\nSpotifyPlaylists::doAddNewPlaylist( sp_playlist* playlist, const QVariantList& tracks, bool sync, const QString& qid )\n{\n\n    if ( !sp_playlist_is_loaded( playlist ) )\n    {\n        qDebug() << \"Waiting for playlist to be loaded that we just create...\";\n        addStateChangedCallback( NewPlaylistClosure( boost::bind(checkPlaylistIsLoaded, playlist), this, SLOT( doAddNewPlaylist(sp_playlist*, const QVariantList&, const QString& ) ), playlist, tracks, qid) );\n\n        return;\n    }\n\n    addPlaylist( playlist, sync );\n    LoadedPlaylist pl = m_playlists.last();\n    if ( pl.playlist_ != playlist )\n    {\n        qWarning() << \"Failed to add playlist to internal representation! Aborting...\";\n        return;\n    }\n\n    sApp->registerQidForPlaylist( qid, pl.id_ );\n    if ( tracks.isEmpty() )\n    {\n        // No work to do :)\n        sApp->sendAddTracksResult( pl.id_, QList<int>(), QList< QString >(), true );\n    }\n    else\n    {\n        doAddTracksToSpotifyPlaylist( tracks, playlist, pl.id_, 0 );\n    }\n\n    // resend list of playlists\n    emit notifyContainerLoadedSignal();\n}\n\n/**\n  moveTracksInSpotifyPlaylist\n  called from client when move\n  **/\nsp_error\nSpotifyPlaylists::moveTracksInSpotifyPlaylist( const QString& playlistId, const QVariantList& tracks, const QString& newStartPositionId )\n{\n//    qDebug() << \"MOVING tracks in playlist with id \" << playlistId;\n//    qDebug() << \"Tracks to move:\" << tracks;\n\n    LoadedPlaylist loader;\n    loader.id_ = playlistId;\n    const int index = m_playlists.indexOf( loader );\n\n    if ( index == -1 )\n    {\n        qWarning() << \"Asked to move tracks in a spotify playlist that doesn't exist!\" << playlistId;\n        return SP_ERROR_INVALID_INDATA;\n    }\n\n    sp_playlist* pl = m_playlists[index].playlist_;\n\n    if ( !pl || !sp_playlist_is_loaded( pl ) )\n    {\n        qWarning() << \"Asked to move tracks in a spotify playlist that is null or is not loaded!\" << pl << ( (pl != 0 ) ? (sp_playlist_is_loaded( pl ) ? \"Loaded\" : \"Unloaded\") : QString()) ;\n        return SP_ERROR_INVALID_INDATA;\n    }\n\n    QList< QString> trackIdsToMove;\n    foreach( const QVariant& track, tracks )\n    {\n        const QVariantMap trackMap = track.toMap();\n        if ( trackMap.contains( \"id\" ) )\n            trackIdsToMove << trackMap[ \"id\" ].toString();\n    }\n\n    QVector<int> moveIndexes;\n    int newStartPosition = -1;\n    for( int i = 0; i < m_playlists[ index ].tracks_.size(); i++ )\n    {\n        const QString trackid = trackId( m_playlists[ index ].tracks_[ i ] );\n        if ( trackIdsToMove.contains( trackid ) )\n            moveIndexes.append( i );\n        else if ( trackid == newStartPositionId )\n            newStartPosition = i;\n    }\n    newStartPosition++; // New target position, not position before;\n    newStartPosition = qBound( 0, newStartPosition, m_playlists[index].tracks_.size() ); // safety\n\n    sApp->setIgnoreNextUpdate( true );\n    sp_error ret = sp_playlist_reorder_tracks( m_playlists[ index ].playlist_, moveIndexes.constBegin(), moveIndexes.size(), newStartPosition );\n    return ret;\n}\n\n/**\n  renamePlaylist\n  will rename a playlist that contains\n    data[playlistid] = spotifyUri\n    data[newtitle] = QString\n  **/\n\nvoid\nSpotifyPlaylists::renamePlaylist( const QVariantMap& data )\n{\n    LoadedPlaylist playlist = getPlaylist( data.value( \"playlistid\" ).toString() );\n    if( !playlist.id_.isEmpty() && playlist.isLoaded )\n    {\n        const QString newTitle = data.value( \"newTitle\").toString();\n        qDebug() << \"Renameing playlist with name \" << playlist.name_ << \" to \" << newTitle;\n        sp_playlist_rename( playlist.playlist_, newTitle.toUtf8() );\n\n    }\n\n}\n\nvoid\nSpotifyPlaylists::addSearchedTrack( sp_search* result, void* userdata )\n{\n    SpotifySearch::addSearchedTrack( result, userdata );\n}\n\n\n/**\n  addTracksToSpotify\n\n  **/\nvoid\nSpotifyPlaylists::addTracksToSpotifyPlaylist( const QVariantMap& data )\n{\n    qDebug() << \"Adding tracks to playlist with id \" << data.value( \"playlistid\");\n\n    const QString playlistId = data.value( \"playlistid\").toString();\n    LoadedPlaylist loader;\n    loader.id_ = playlistId;\n    const int index = m_playlists.indexOf( loader );\n\n    if ( index == -1 )\n    {\n        qWarning() << \"Asked to add tracks to a spotify playlist that doesn't exist!\" << playlistId;\n        return;\n    }\n\n    sp_playlist* pl = m_playlists[index].playlist_;\n\n    if ( !pl || !sp_playlist_is_loaded( pl ) )\n    {\n        qWarning() << \"Asked to add tracks to a spotify playlist that is null or is not loaded!\" << pl << ( (pl != 0 ) ? (sp_playlist_is_loaded( pl ) ? \"Loaded\" : \"Unloaded\") : QString()) ;\n        return;\n    }\n\n    const QVariantList tracks = data.value( \"tracks\").toList();\n    const QString trackId = data.value( \"startPosition\" ).toString();\n\n    int position = findTrackPosition( m_playlists[ index ].tracks_, trackId );\n    position++; // Spotify wants the position to be the newly inserted pos, not the 0-based index of the track *to* insert\n    if ( position == 0 )\n    {\n        // We didn't find the position in the playlist, or there was none, so append\n        position = m_playlists[ index ].tracks_.size();\n    }\n\n    doAddTracksToSpotifyPlaylist( tracks, pl, playlistId, position );\n}\n\n/**\n  doAddTracksToSpotify\n  slot that take a list of tracks, and performs a search\n  to retrevie sp_tracks*'s\n\n  **/\nvoid\nSpotifyPlaylists::doAddTracksToSpotifyPlaylist( const QVariantList& tracks, sp_playlist* pl, const QString& playlistId, int startPosition )\n{\n\n//   qDebug() << \"Adding tracks to playlist \" << sp_playlist_name( pl );\n    qDebug() << \"Adding tracks to spotify playlist at position:\" << startPosition;\n\n    AddTracksData* addData = new AddTracksData;\n    addData->plid = playlistId;\n    addData->playlist = pl;\n    addData->pos = startPosition;\n    addData->waitingFor = 0;\n\n    addData->finaltracks.resize( tracks.size() );\n    addData->searchOrder.resize( tracks.size() );\n\n    for ( int i = 0; i < tracks.size(); i++ )\n    {\n        const QVariant& track = tracks[ i ];\n\n        const QString artist = track.toMap().value( \"artist\" ).toString();\n        const QString title = track.toMap().value( \"track\" ).toString();\n        const QString album = track.toMap().value( \"album\" ).toString();\n\n        QString query = QString(artist + \" \" + title + \" \" + album);\n#if SPOTIFY_API_VERSION >= 11\n        sp_search* s = sp_search_create( SpotifySession::getInstance()->Session(), query.toUtf8().data(), 0, 1, 0, 0, 0, 0, 0, 0, SP_SEARCH_STANDARD, &SpotifySearch::addSearchedTrack, addData );\n#else\n        sp_search* s = sp_search_create( SpotifySession::getInstance()->Session(), query.toUtf8().data(), 0, 1, 0, 0, 0, 0, &SpotifySearch::addSearchedTrack, addData );\n#endif\n        qDebug() << \"Got sp_search object for track:\" << s << query;\n        addData->waitingFor++;\n\n        // to help us choose the right order since we can get the results in any order\n        addData->searchOrder[ i ] = s;\n    }\n}\n\n/**\n  findTracksPosition\n  Finds the position of trackId in list\n  **/\nint\nSpotifyPlaylists::findTrackPosition( const QList< sp_track* > tracks, const QString& trackId )\n{\n    int position = -1;\n\n    if ( !trackId.isEmpty() )\n    {\n        sp_link* link = sp_link_create_from_string( trackId.toUtf8().constData() );\n        if ( sp_link_type( link ) == SP_LINKTYPE_TRACK )\n        {\n            sp_track* targetTrack = sp_link_as_track( link );\n            for ( int i = 0; i < tracks.size(); i++ )\n            {\n                const sp_track* track = tracks[ i ];\n                if ( track == targetTrack )\n                {\n//                    qDebug() << \"Found track in playlist with associated id to use as insertion point:\" << trackId << sp_track_name( targetTrack ) << sp_track_artist( targetTrack, 0 ) << \"at:\" << i << \"out of:\" << tracks.size() << \"tracks\";\n                    position = i;\n                    break;\n                }\n            }\n        }\n        sp_link_release( link );\n    }\n\n    return position;\n}\n\n\n/**\n  Remove tracks from spotify playlist with data\n  **/\n\nbool\nSpotifyPlaylists::removeFromSpotifyPlaylist( const QVariantMap& data ){\n\n    qDebug() << \"Removing tracks from playlist with id \" << data.value( \"playlistid\");\n\n    QString playlistId = data.value( \"playlistid\").toString();\n    LoadedPlaylist loader;\n    loader.id_ = data.value(\"playlistid\").toString();\n    int index = m_playlists.indexOf( loader );\n\n    if ( index == -1 )\n    {\n        qWarning() << \"Asked to remove tracks from a spotify playlist that doesn't exist!\" << playlistId;\n        return false;\n    }\n\n    sp_playlist* pl = m_playlists[index].playlist_;\n\n    if ( !pl || !sp_playlist_is_loaded( pl ) )\n    {\n        qWarning() << \"Asked to remove tracks from a spotify playlist that is null or is not loaded!\" << pl << ( (pl != 0 ) ? (sp_playlist_is_loaded( pl ) ? \"Loaded\" : \"Unloaded\") : QString()) ;\n        return false;\n    }\n\n\n    const QVariantList tracks = data.value( \"tracks\").toList();\n\n    QVector<int> positions;\n    positions.reserve( tracks.size() );\n\n    foreach( QVariant track, tracks )\n    {\n        const QString id = track.toMap().value( \"id\" ).toString();\n        const QString artist = track.toMap().value( \"artist\" ).toString();\n        const QString title = track.toMap().value( \"track\" ).toString();\n        //album = track.toMap().value( \"album\" ).toString();\n\n        qDebug() << \"trying to remove \" << artist  << title << id;\n        // case sensitive atm\n        // if we have an ID, do a safe lookup and check for that. otherwrise, match metadata\n        if ( !id.isEmpty() )\n        {\n            for(int i = 0; i < m_playlists[index].tracks_.size(); i++)\n            {\n                // If we have duplicates of the track to remove, don't try to remove the same thing twice.\n                if ( positions.contains( i ) )\n                    continue;\n\n                char trackId[356];\n                sp_track *track = m_playlists[index].tracks_[ i ];\n                sp_link* l = sp_link_create_from_track( track, 0 );\n                sp_link_as_string(l, trackId, sizeof(trackId));\n\n                if( id == QString::fromUtf8(trackId) )\n                {\n                    qDebug() << \"Found track at pos\" << i << \" removing\";\n                    positions.append( i );\n\n                    sp_link_release( l );\n                    break;\n                }\n\n                sp_link_release( l );\n\n            }\n        }\n        else\n        {\n            // No id in track, so do fuzzy matching.\n            for(int i = 0; i < sp_playlist_num_tracks(pl); i++)\n            {\n                // If we have duplicates of the track to remove, don't try to remove the same thing twice.\n                if ( positions.contains( i ) )\n                    continue;\n\n                sp_track *track = sp_playlist_track( m_playlists[index].playlist_, i);\n\n                qDebug() << \"Comparing track for removal:\";\n                qDebug() << title.toLower() << QString::fromUtf8( sp_track_name( track ) ).toLower();\n                qDebug() << artist.toLower() << QString::fromUtf8( sp_artist_name( sp_track_artist( track, 0 ) ) ).toLower();\n\n                if( title.toLower() == QString::fromUtf8( sp_track_name( track ) ).toLower() &&\n                    artist.toLower() == QString::fromUtf8( sp_artist_name( sp_track_artist( track, 0 ) ) ).toLower() )\n                {\n                    qDebug() << \"Found track match at pos\" << i << \" removing\";\n                    positions.append( i );\n\n                    break;\n                }\n\n            }\n        }\n    }\n\n    const QSet<int> uniq = positions.toList().toSet();\n    if ( uniq.size() != positions.size() )\n    {\n        qWarning() << \"ERROR! Found a list of positions to remove with duplicates!! This is illegal, a bug in our search algorithm! Making unique and passing along to spotify...\";\n        positions.clear();\n        foreach( int pos, uniq )\n            positions.append( pos );\n    }\n\n //   qDebug() << \"Was asked to remove\" << tracks.size() << \"tracks, found\" << positions.size() << \"matching\";\n    if ( !positions.isEmpty() )\n    {\n//        qDebug() << \"Removing found:\" << positions.size() << \"tracks from playlist!\";\n\n        sApp->setIgnoreNextUpdate( true );\n        sp_error ret = sp_playlist_remove_tracks( pl, positions.constData(), positions.size());\n\n        return ret == SP_ERROR_OK && tracks.size() == positions.size();\n\n    }\n\n    return tracks.size() == positions.size();\n\n}\n\n/**\n  updateRevision\n  Will update the revision with a timestamp\n**/\n\nvoid\nSpotifyPlaylists::updateRevision( LoadedPlaylist &pl )\n{\n    qDebug() << Q_FUNC_INFO << \"count\" << pl.tracks_.count();\n    int timestamp(0);\n    for( int i = 0; i < pl.tracks_.count(); i++)\n    {\n        int tmpTimestamp = sp_playlist_track_create_time( pl.playlist_, i );\n\n        if( timestamp < tmpTimestamp )\n            timestamp = tmpTimestamp;\n    }\n\n    if( timestamp == 0 )\n    {\n//        qDebug() << \"Revision playlist was cleared from contents!\";\n        updateRevision( pl, QDateTime::currentMSecsSinceEpoch() / 1000);\n    }\n    else if( timestamp > pl.newTimestamp )\n    {\n        // Hash later with appropriate hash algorithm.\n        updateRevision( pl, timestamp );\n    }\n}\n\n/**\n  updateRevision with qualifier\n  Will update the revision with a hashed qualifier\n**/\nvoid\nSpotifyPlaylists::updateRevision( LoadedPlaylist &pl, int qualifier, QStringList removedTracks )\n{\n    int plIndex = m_playlists.indexOf( pl );\n    if( plIndex == -1 )\n    {\n        qDebug() << \"Trying to update revision for playlist we dont know about, WTF!\";\n        return;\n    }\n\n    /// @note: New revision wont handle removed tracks. Only new tracks.\n    /// So, if the tracks isnt in oldRev, its appended to newRev.\n    /// LoadedPlaylist.tracks_ will contain all current tracks.\n    if( qualifier > pl.newTimestamp )\n    {\n\n        RevisionChanges oldRevision;\n        RevisionChanges newRevision;\n\n        if( !pl.revisions.isEmpty() )\n        {\n\n            oldRevision = pl.revisions.last();\n//            qDebug() << \"Setting new revision \" << qualifier <<  \"Old rev: \" << oldRevision.revId;\n            QString trackid;\n            foreach( sp_track *newRevTrack, pl.tracks_ )\n            {\n               trackid = trackId( newRevTrack );\n\n               if( !oldRevision.revTrackIDs.contains( trackid ) )\n               {\n                   newRevision.revTrackIDs.append( trackid );\n               }\n\n            }\n            if( !removedTracks.isEmpty() )\n            {\n                foreach( QString trackId, removedTracks )\n                {\n                    if( !oldRevision.revRemovedTrackIDs.contains( trackId ) )\n                        newRevision.revRemovedTrackIDs.append( trackId );\n                }\n            }\n\n        }else\n        {\n//            qDebug() << \"============ No old rev! Appending all\";\n            foreach( sp_track *newRevTrack, pl.tracks_ )\n               newRevision.revTrackIDs.append( trackId( newRevTrack ) );\n        }\n\n        /// @TODO/note: we try and keep all the revision, these should be cached\n\n        pl.oldTimestamp = pl.newTimestamp;\n        pl.newTimestamp = qualifier;\n        // MD5 hash for revisionId\n        newRevision.revId = QString(QCryptographicHash::hash( QString( pl.name_ + QString::number( qualifier ) ).toUtf8(),QCryptographicHash::Md5).toHex() );\n        pl.revisions.append( newRevision );\n        m_playlists[ plIndex ] = pl;\n\n//        qDebug() << \"===== DONE Setting new revision \" << pl.revisions.last().revId <<  \"Old rev: \" << oldRevision.revId << \"revCount\" << pl.revisions.last().revTrackIDs.count() << \"removedCount: \" << pl.revisions.last().revRemovedTrackIDs.count();\n    }\n\n}\n\n/**\n  Closure callback\n  Adds a waitFor playlist to LoadedPlaylists\n  **/\n\nvoid\nSpotifyPlaylists::playlistLoadedSlot(sp_playlist* pl)\n{\n    qDebug() << Q_FUNC_INFO << \"Got playlist loaded that we were waiting for, now we have:\" << m_waitingToLoad << \"left\";\n    addPlaylist(pl);\n    checkForPlaylistsLoaded();\n}\n\n/**\n  checkForPlaylistLoaded\n  **/\nvoid\nSpotifyPlaylists::checkForPlaylistsLoaded()\n{\n    if(m_waitingToLoad.isEmpty())\n    {\n        qDebug() << \"========== GOT ALL PLAYLISTS LOADED, EMITTING SIGNAL!\";\n        m_isLoading = false;\n        m_allLoaded = true;\n        m_loadTimer->stop();\n        emit notifyContainerLoadedSignal();\n\n    }\n}\n\n\n\n/**\n addPlaylist( sp_playlist *)\n   This function is called from callback\n   This will also fire if and of the playlist callbacks is called,\n   thus updateing the list-eg. if any track is moved, it will rearange the order.\n**/\nvoid\nSpotifyPlaylists::addPlaylist( sp_playlist *pl, bool forceSync, bool isSubscribed )\n{\n\n//     qDebug() << \"addPlaylist from thread id\" << thread()->currentThreadId();\n    if( !pl )\n    {\n//        qDebug() << Q_FUNC_INFO << \"Pl was null\";\n        return;\n    }\n\n    if( !sp_playlist_is_loaded( pl ) )\n    {\n//        qDebug() << Q_FUNC_INFO << \"Pl isnt loaded\";\n        return;\n    }\n\n//    qDebug() << \"Playlist has \" << sp_playlist_num_tracks( pl ) << \" number of tracks\";\n\n    m_waitingToLoad.removeAll( pl );\n\n    LoadedPlaylist playlist;\n\n    // Get the spotify id for the playlist\n    char linkStr[256];\n    sp_link *pl_link = sp_link_create_from_playlist( pl );\n    if( pl_link )\n    {\n        sp_link_as_string( pl_link, linkStr, sizeof( linkStr )) ;\n        sp_link_release( pl_link );\n        playlist.id_ = linkStr;\n    }\n    else\n    {\n\n        ///    Due to reasons in the playlist backend design and the Spotify URI scheme you need to\n        ///    wait for the playlist to be loaded before you can successfully construct an URI.\n        ///    If sp_link_create_from_playlist() returns NULL, try again after teh playlist_state_changed callback has fired\n        ///    @author Spotify dev\n        ///    Will be added at next state change\n\n        qDebug() << \"Failed to get URI for playlist when trying to add! Aborting...\";\n        return;\n    }\n\n    // Ensure we dont get multiple callbacks registered, gets readded further down\n    sp_playlist_remove_callbacks( pl, &SpotifyCallbacks::playlistCallbacks, this );\n    sp_playlist_remove_callbacks( pl, &SpotifyCallbacks::syncPlaylistCallbacks, this );\n\n    // if it's already loaded, ignore it!\n    if ( m_playlists.indexOf( playlist ) >= 0 && m_playlists[ m_playlists.indexOf( playlist ) ].isLoaded )\n        return;\n\n    playlist.playlist_ = pl;\n    playlist.name_ = QString::fromUtf8( sp_playlist_name( pl ) );\n    playlist.owner_ = sp_user_canonical_name( sp_playlist_owner( pl ) );\n    playlist.isCollaborative = sp_playlist_is_collaborative( pl );\n\n    QString username = sp_user_canonical_name( sp_session_user( SpotifySession::getInstance()->Session() ) );\n    if( username != playlist.owner_ )\n        isSubscribed = true;\n\n    playlist.isSubscribed = isSubscribed;\n    playlist.starContainer_ = false;\n    playlist.sync_ = false;\n    playlist.isLoaded = false;\n\n    int tmpRev = 0;\n    sp_playlist_add_ref( pl );\n\n    // Precaution, to prevent mixing up the starred tracks container and user playlistnameings.\n#if SPOTIFY_API_VERSION >= 11\n    if( playlist.id_.contains( username + \":starred\" ) )\n#else\n    if( playlist.id_.contains( \"spotify:user:\" + username + \":playlist:0000000000000000000000\" ) )\n#endif\n    {\n//        qDebug() << \"Marking starred track playlist\" << pl;\n        playlist.name_ =  \"Starred Tracks\";\n        playlist.starContainer_ = true;\n    }\n\n//    qDebug() << \"Adding \" << sp_playlist_num_tracks( playlist.playlist_ ) << \"tracks to our LoadedPlaylist object for\" << playlist.name_;\n    for ( int i=0 ; i< sp_playlist_num_tracks( playlist.playlist_ ); ++i )\n    {\n\n        sp_track* track = sp_playlist_track( pl, i );\n        sp_track_add_ref( track );\n        // Set revision on initation\n        int timestamp = sp_playlist_track_create_time( pl, i);\n//             qDebug() << \"Timestamp \" << timestamp;\n        if( tmpRev < timestamp)\n            tmpRev = timestamp;\n\n        playlist.tracks_.push_back( track );\n    }\n\n    // Playlist is loaded and ready\n    playlist.isLoaded = true;\n\n    if(m_playlists.contains( playlist ) )\n    {\n        int index = m_playlists.indexOf( playlist );\n        if( index != -1 )\n            m_playlists.replace(index, playlist);\n    }\n    else\n        m_playlists.append( playlist );\n\n\n        /// Initially, when reading QSettings for syncPlaylists\n        /// we cant set the callbacks directly, as they are not loaded yet.\n        /// This will add sync callbacks for the loaded playlists,\n\n    Sync syncThis;\n    syncThis.id_ = playlist.id_;\n    if( m_syncPlaylists.contains( syncThis ) || forceSync )\n    {\n        qDebug() << \"Adding syncing for playlist \" << playlist.id_;\n        playlist.sync_ = true;\n        setSyncPlaylist( playlist.id_, true );\n    }\n\n    // We need to add the callbacks for normal playlist, to keep listening on changes.\n    sp_playlist_add_callbacks( playlist.playlist_, &SpotifyCallbacks::playlistCallbacks, this);\n    sp_playlist_update_subscribers( SpotifySession::getInstance()->Session(), pl );\n    // emit starred playlist is loaded\n    if( playlist.starContainer_ )\n        emit notifyStarredTracksLoadedSignal();\n\n    /// Finaly, update revisions\n    // Revision, initially -1\n    playlist.oldTimestamp = -1;\n    playlist.newTimestamp = -1;\n\n    updateRevision( playlist, tmpRev );\n\n}\n\n/**\n  ensurePlaylistLoadedTimerFired\n  **/\nvoid SpotifyPlaylists::ensurePlaylistsLoadedTimerFired()\n{\n    if ( m_waitingToLoad.isEmpty() )\n        return;\n\n    bool workToDo = false;\n    QList< sp_playlist* > toCheck = m_waitingToLoad; // addPlaylist will modify m_waitingToLoad\n    for ( int i = 0; i < toCheck.size(); i++ )\n    {\n        if ( sp_playlist_is_loaded( toCheck[ i ] ) )\n        {\n//            qDebug() << \"Delayed find of playlist that is actually loaded... adding\";\n            addPlaylist( toCheck[ i ] );\n        } else {\n            workToDo = true;\n        }\n    }\n\n    if ( workToDo )\n    {\n        qDebug() << \"Checked for all playlists loaded, but not all are yet! Refiring timer\";\n        m_checkPlaylistsTimer->start();\n    }\n\n    checkForPlaylistsLoaded();\n}\n\n/**\n  printPlaylistTracks\n  function to use with gdb\n  **/\n\nvoid printPlaylistTracks( const QList<sp_track* > tracks )\n{\n    for ( int i = 0; i < tracks.size(); i++ )\n    {\n        char id[256];\n        sp_link* l = sp_link_create_from_track( tracks[i], 0 );\n        if ( l )\n            sp_link_as_string( l, id, sizeof( id ) );\n        qDebug() << i << \":\" << id << sp_track_name( tracks[i] ) << sp_artist_name( sp_track_artist( tracks[i], 0 ) ) << sp_album_name( sp_track_album( tracks[i] ) );\n    }\n\n}\n\n/**\n  checkTracksAreLoaded\n  used with boost to add closures\n  **/\nbool checkTracksAreLoaded(QList< sp_track* > waitingForLoaded)\n{\n    bool found = !waitingForLoaded.isEmpty();\n    foreach ( sp_track* t, waitingForLoaded )\n    {\n        if ( t && sp_track_is_loaded( t ) )\n            qDebug() << \"Found now-loaded track we were waiting for:\" << sp_track_name(t) << sp_artist_name(sp_track_artist(t,0));\n        else\n            found = false;\n    }\n    return found;\n}\n\n/**\n  checkPlaylistIsLoaded\n  used with boost in closure\n  **/\nbool checkPlaylistIsLoaded(sp_playlist* pl )\n{\n    return pl && sp_playlist_is_loaded( pl );\n}\n\n/**\n  operator==\n**/\nbool operator==(SpotifyPlaylists::LoadedPlaylist one, SpotifyPlaylists::LoadedPlaylist two)\n{\n    if(one.id_ == two.id_)\n        return true;\n    if( one.playlist_ == two.playlist_)\n        return true;\n    return false;\n}\nbool operator==(SpotifyPlaylists::Sync one, SpotifyPlaylists::Sync two)\n{\n    if(one.id_ == two.id_)\n        return true;\n    return false;\n}\nbool operator==(SpotifyPlaylists::RevisionChanges one, SpotifyPlaylists::RevisionChanges two)\n{\n    if(one.revId == two.revId)\n        return true;\n    return false;\n}\n"
  },
  {
    "path": "archive/spotify/spotifyplaylists.h",
    "content": "/**  This file is part of QT SpotifyWebApi - <hugolm84@gmail.com> ===\n *\n *   Copyright 2011-2012,Hugo Lindström <hugolm84@gmail.com>\n *   Copyright      2012,Leo Franchi    <lfranchi@kde.org>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n\n#ifndef SPOTIFYPLAYLISTS_H\n#define SPOTIFYPLAYLISTS_H\n\n#include <libspotify/api.h>\n\n#include <QList>\n#include <QString>\n#include <QDebug>\n#include <QSettings>\n#include <QObject>\n#include <QStringList>\n#include <QDateTime>\n#include <QTimer>\n#include <boost/bind.hpp>\n#include \"spotifysearch.h\"\n\nclass QTimer;\nclass PlaylistClosure;\n\nclass SpotifyPlaylists : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit SpotifyPlaylists( QObject *parent = 0);\n    virtual ~SpotifyPlaylists();\n\n    void setPosition( sp_playlist *pl, int oPos, int nPos );\n    void setSyncPlaylist( const QString id, bool sync );\n    // This will unload all playlists, usefull when userswitch\n    void unsetAllLoaded(){ m_allLoaded = false; m_waitingToLoad.clear(); clear(); }\n\n    struct RevisionChanges{\n        // Md5 hash of pl_name and timestamp\n        QString revId;\n        QList<QString> revTrackIDs;\n        QList<QString> revRemovedTrackIDs;\n    };\n\n    struct LoadedPlaylist{\n      bool starContainer_;\n      bool isSubscribed;\n      bool isCollaborative;\n      bool sync_;\n      bool isLoaded;\n      // Revision timestamp\n      int newTimestamp;\n      int oldTimestamp;\n      int numSubscribers;\n      QString owner_;\n      QString name_;\n      QString id_;\n      sp_playlist* playlist_;\n      QList<sp_track*> tracks_;\n      QList<RevisionChanges> revisions;\n\n      LoadedPlaylist() : starContainer_( false ), isSubscribed( false ), isCollaborative( false ), sync_( false ), isLoaded( false )\n                       , newTimestamp( -1 ), oldTimestamp( -1 ), numSubscribers( 0 ), playlist_( 0 ) {}\n\n    };\n    struct Sync {\n         QString id_;\n         bool sync_;\n    };\n\n    struct AddTracksData{\n\n        QString plid;\n        sp_playlist* playlist;\n        QVector< sp_track* > finaltracks;\n        QVector< sp_search* > searchOrder;\n\n        int waitingFor;\n        int pos;\n\n    };\n\n    void doSend( const LoadedPlaylist& playlist);\n\n    LoadedPlaylist getPlaylist( const QString id );\n    LoadedPlaylist getLoadedPlaylist( sp_playlist *&playlist );\n    QList<LoadedPlaylist> getPlaylists() const { return m_playlists; }\n    QList<Sync> getSyncPlaylists() const { return m_syncPlaylists; }\n\n    // Send the desired playlist to the client, and turn on syncing\n    void sendPlaylist( const QString& playlistId, bool startSyncing );\n    void sendPlaylistByRevision( int rev );\n    LoadedPlaylist getPlaylistByRevision( QString rev );\n\n    // Takes a msg from JSON that conforms to the API\n    void addTracksToSpotifyPlaylist( const QVariantMap& data );\n    bool removeFromSpotifyPlaylist( const QVariantMap& data );\n    void renamePlaylist( const QVariantMap& data );\n    void addNewPlaylist( const QVariantMap& data );\n    sp_error moveTracksInSpotifyPlaylist( const QString& playlistId, const QVariantList& tracks, const QString& newStartPositionId );\n\n    void setCollaborative(const QString &playlistUri, bool collab );\n    \n    // Mixed\n    sp_playlist *getPlaylistFromUri( const QString &uri );\n\n    // Spotify playlist container callbacks.\n    static void SP_CALLCONV playlistAddedCallback( sp_playlistcontainer* pc, sp_playlist* playlist,  int position, void* userdata );\n    static void SP_CALLCONV playlistRemovedCallback( sp_playlistcontainer* pc, sp_playlist* playlist, int position, void* userdata );\n    static void SP_CALLCONV playlistMovedCallback( sp_playlistcontainer* pc, sp_playlist* playlist, int position, int new_position, void* userdata );\n    static void SP_CALLCONV playlistContainerLoadedCallback( sp_playlistcontainer* pc, void* userdata);\n\n    // initially load playlist\n    static void SP_CALLCONV syncStateChanged(sp_playlist* pl, void* userdata);\n\n    // Spotify playlist callbacks - when loading a playlist\n    static void SP_CALLCONV stateChanged(sp_playlist* pl, void* userdata);\n    static void SP_CALLCONV tracksAdded(sp_playlist *pl, sp_track * const *tracks, int num_tracks, int position, void *userdata);\n    static void SP_CALLCONV playlistMetadataUpdated(sp_playlist *pl, void *userdata);\n    static void SP_CALLCONV subscribersChanged( sp_playlist *pl, void *userdata);\n    static void SP_CALLCONV playlistUpdateInProgress(sp_playlist *pl, bool done, void *userdata);\n    static void SP_CALLCONV playlistRenamed(sp_playlist *pl, void *userdata);\n    static void SP_CALLCONV tracksMoved(sp_playlist *pl, const int *tracks, int num_tracks, int new_position, void *userdata);\n    static void SP_CALLCONV tracksRemoved(sp_playlist *pl, const int *tracks, int num_tracks, void *userdata);\n\n    void waitForLoad( sp_playlist *playlist );\n\n    /**\n     * If you need to re-call some function when a certain track in a playlist has become loaded, pass it to the PlaylistClosure and add it to the list.\n     * Each closure will get tested (condition() in the closure, see header) for each playlist that has state changes.\n     */\n    void addStateChangedCallback( PlaylistClosure* closure );\n\n    void clear();\npublic slots:\n\n   // void tracksMovedSlot(sp_playlist *pl, const int *tracks, int num_tracks, int new_position, void *userdata);\n    void moveTracks(sp_playlist* pl, QList<int> tracks, int new_position);\n    void removeTracksFromSpotify(sp_playlist* pl, QList<int> tracks);\n    void loadContainerSlot(sp_playlistcontainer* pc);\n    void setPlaylistInProgress( sp_playlist *pl, bool done );\n    void addStarredTracksToContainer();\n    void addTracksFromSpotify(sp_playlist* pl, QList<sp_track*> tracks, int pos);\n    void removePlaylistNotification( sp_playlist *playlist );\n    void playlistLoadedSlot(sp_playlist* pl);\n    void addPlaylist( sp_playlist *, bool forceSync = false, bool isSubscribed = false );\n    void doRemovePlaylist( sp_playlist* playlist );\n    // slot that calls our SpotifySearch::addSearchedTrack callback\n    void addSearchedTrack( sp_search*, void * );\n    \n    void setSubscribedPlaylist( const QString &uri, bool doSubscribe );\nsignals:\n    void sendLoadedPlaylist( const SpotifyPlaylists::LoadedPlaylist& );\n    void notifyContainerLoadedSignal();\n    void notifyStarredTracksLoadedSignal();\n    void notifyNameChange( const SpotifyPlaylists::LoadedPlaylist &playlist );\n    void sendTracksAdded( sp_playlist* pl, const QList< sp_track* >& tracks, const QString& trackPosition );\n    void sendTracksRemoved( sp_playlist* pl, const QStringList& trackIds );\n    void sendTracksMoved( sp_playlist* pl, const QStringList& trackids, const QString& trackPosition );\n    void sendPlaylistDeleted( const QString& playlistId );\n    void sendStarredChanged( sp_playlist* pl, const QList< sp_track* >& tracks, const bool starred );\n\n    void notifyCollaborativeChanged( const SpotifyPlaylists::LoadedPlaylist& );\n    void notifySubscriberCountChanged( const SpotifyPlaylists::LoadedPlaylist& );\n\nprivate slots:\n    void ensurePlaylistsLoadedTimerFired();\n    void checkWaitingForLoads();\n    void doAddNewPlaylist( sp_playlist* pl, const QVariantList& tracks, bool sync, const QString& qid );\n    void doAddTracksToSpotifyPlaylist( const QVariantList& tracks, sp_playlist* playlist, const QString& playlistId, const int startPosition );\n\nprivate:\n    void readSettings();\n    void writeSettings();\n\n    void updateRevision( LoadedPlaylist &pl );\n    void updateRevision( LoadedPlaylist &pl, int qualifier, QStringList removedTracks = QStringList() );\n    void playlistNameChange( sp_playlist * pl );\n    void checkForPlaylistsLoaded();\n    void checkForPlaylistCallbacks( sp_playlist *pl, void *userdata );\n    void removeSubscribedPlaylist(sp_playlist *playlist );\n\n    int findTrackPosition( const QList< sp_track* > tracks, const QString& trackId );\n\n    QString trackId( sp_track* track );\n\n    QList<LoadedPlaylist> m_playlists;\n    QList<Sync> m_syncPlaylists;\n    QSettings m_settings;\n\n    QTimer* m_checkPlaylistsTimer;\n    QTimer* m_periodicTimer;\n    QTimer* m_loadTimer;\n    QList< sp_playlist* > m_waitingToLoad;\n    QList< PlaylistClosure* > m_stateChangedCallbacks;\n\n    QSet<QString> m_playlistNameCreationToIgnore;\n\n    bool m_allLoaded;\n    bool m_isLoading;\n};\n\n\n// Use this with boost::bind and bind the first arg\nbool checkTracksAreLoaded(QList<sp_track*> waitingForLoaded);\nbool checkPlaylistIsLoaded(sp_playlist* pl );\nbool checkTracksAreLoaded(QList< sp_track* > waitingForLoaded);\n\nQ_DECLARE_METATYPE( sp_playlistcontainer* )\nQ_DECLARE_METATYPE( sp_playlist* )\nQ_DECLARE_METATYPE( const int* )\nQ_DECLARE_METATYPE( QList< sp_track* > )\nQ_DECLARE_METATYPE( QList< int > )\n\n#endif // SPOTIFYPLAYLISTS_H\n"
  },
  {
    "path": "archive/spotify/spotifyresolver.cpp",
    "content": "/*\n    Copyright (c) 2011-2012 Leo Franchi <lfranchi@kde.org>\n    Copyright (c) 2012 Hugo Lindström <hugolm84@gmail.com>\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n\n#include \"spotifyresolver.h\"\n\n#include \"spotify_key.h\"\n#include \"consolewatcher.h\"\n#include \"qxthttpsessionmanager.h\"\n#include \"spotifysearch.h\"\n#include <libspotify/api.h>\n#include \"qjson/parser.h\"\n#include \"qjson/serializer.h\"\n#include \"spotifyloghandler.h\"\n#include \"spotifysession.h\"\n#include \"PlaylistClosure.h\"\n\n#include <QTimer>\n#include <QTextStream>\n#include <QSettings>\n#include <QSocketNotifier>\n#include <QDir>\n#include <QDateTime>\n#include <QUuid>\n#include <QtCore/QTimer>\n#include <QtCore/QFile>\n#include <qendian.h>\n\n#include <iostream>\n#include <stdio.h>\n#include <fstream>\n#include \"audiohttpserver.h\"\n#include \"callbacks.h\"\n#ifdef WIN32\n#include <shlobj.h>\n#endif\n\n#define PLAYLIST_DEBUG 0\n\nQDataStream& operator<<(QDataStream& out, const CacheEntry& cache)\n{\n    out << (quint32)cache.count();\n    foreach( const QString& key, cache.keys() )\n    {\n        out << key << cache[ key ];\n    }\n    return out;\n}\n\n\nQDataStream& operator>>(QDataStream& in, CacheEntry& cache)\n{\n    quint32 count = 0;\n    in >> count;\n    for ( uint i = 0; i < count; i++ )\n    {\n        QString key, val;\n        in >> key;\n        in >> val;\n        cache[ key ] = val;\n    }\n    return in;\n}\n\n\nSpotifyResolver::SpotifyResolver( int& argc, char** argv )\n    : QCoreApplication( argc, argv )\n    , m_session( 0 )\n    , m_stdinWatcher( 0 )\n    , m_handler( 0 )\n    , m_loggedIn( false )\n    , m_apiKey( QByteArray::fromBase64( spotifyApiKey ) )\n    , m_highQuality( true )\n    , m_ignoreNextUpdate( false )\n    , m_statusTimer( new QTimer( this ) )\n    , m_foundTomahawkInstance( false )\n    , m_haveSentStatus( false )\n    , m_privateSession( false )\n{\n    setOrganizationName( QLatin1String( \"TomahawkSpotify\" ) );\n    setOrganizationDomain( QLatin1String( \"tomahawk-player.org\" ) );\n    setApplicationName( QLatin1String( \"SpotifyResolver\" ) );\n    setApplicationVersion( QLatin1String( \"2.0\" ) );\n\n}\n\n\nSpotifyResolver::~SpotifyResolver()\n{\n    qDebug() << \"exiting...\";\n    clearTrackLinkMap();\n\n    delete m_session;\n    delete m_stdinWatcher;\n    m_stdinThread.exit();\n}\n\n\nvoid\nSpotifyResolver::setup()\n{\n    setupLogfile();\n\n    qDebug() << \"Initializing Spotify\";\n    const QByteArray storagePath = dataDir().toUtf8();\n    const QByteArray configPath = dataDir( true ).toUtf8();\n    const QString tracePath = dataDir() + \"/\" + \"trace.dat\";\n\n    loadSettings();\n\n    // sessionConfig\n    sessionConfig config;\n    config.cache_location = storagePath;\n    config.settings_location = configPath;\n    config.application_key = m_apiKey;\n    config.application_key_size = m_apiKey.size();\n    config.user_agent = \"Tomahawk Player\";\n    config.tracefile = tracePath.toUtf8();\n    config.device_id = \"tomahawkspotify\";\n    config.proxyString = \"\";\n    config.proxy_pass = \"\";\n    config.proxy_user = \"\";\n\n    // When signal is emitted, you are logged in\n    m_session = new SpotifySession( config );\n    connect( m_session, SIGNAL( loginResponse( bool, QString ) ), this, SLOT( loginResponse( bool, QString ) ) );\n    connect( m_session, SIGNAL( userChanged() ), this, SLOT( userChangedReceived() ) );\n    connect( m_session, SIGNAL( sendErrorMsg( sp_error ) ), this, SLOT( errorMsgReceived( sp_error ) ) );\n    connect( m_session, SIGNAL( blobUpdated(const QByteArray,const QByteArray) ), this, SLOT( updateBlob( const QByteArray, const QByteArray ) ) );\n    connect( m_session, SIGNAL( sendErrorMsg( QString, bool ) ), this, SLOT( errorMsgReceived( QString, bool ) ) );\n    connect( m_session, SIGNAL( notifyAllreadyLoggedin() ), this, SLOT( resendAllPlaylists() ) );\n\n    // Signals\n    connect( m_session, SIGNAL(notifySyncUpdateSignal( SpotifyPlaylists::LoadedPlaylist ) ), this, SLOT( sendPlaylist( SpotifyPlaylists::LoadedPlaylist ) ) );\n\n    connect( m_session->Playlists(), SIGNAL( sendTracksAdded( sp_playlist*, QList<sp_track*>,QString ) ), this, SLOT( sendTracksAdded( sp_playlist*, QList<sp_track*>, QString ) ) );\n    connect( m_session->Playlists(), SIGNAL( sendStarredChanged( sp_playlist*, QList<sp_track*>, bool ) ), this, SLOT( sendStarredChanged( sp_playlist*,QList<sp_track*>, bool ) ) );\n    connect( m_session->Playlists(), SIGNAL( sendTracksMoved( sp_playlist*, QStringList,QString ) ), this, SLOT( sendTracksMoved( sp_playlist*, QStringList, QString ) ) );\n    connect( m_session->Playlists(), SIGNAL( sendTracksRemoved( sp_playlist*, QStringList ) ), this, SLOT( sendTracksRemoved( sp_playlist*, QStringList ) ) );\n    connect( m_session->Playlists(), SIGNAL( sendPlaylistDeleted( QString ) ), this, SLOT( sendPlaylistDeleted( QString ) ) );\n    connect( m_session->Playlists(), SIGNAL( notifyNameChange( SpotifyPlaylists::LoadedPlaylist ) ), this, SLOT( sendPlaylistMetadataChanged( SpotifyPlaylists::LoadedPlaylist ) ) );\n    connect( m_session->Playlists(), SIGNAL( notifyCollaborativeChanged( SpotifyPlaylists::LoadedPlaylist ) ), this, SLOT( sendPlaylistMetadataChanged( SpotifyPlaylists::LoadedPlaylist ) ) );\n    connect( m_session->Playlists(), SIGNAL( notifySubscriberCountChanged( SpotifyPlaylists::LoadedPlaylist ) ), this, SLOT( sendPlaylistMetadataChanged( SpotifyPlaylists::LoadedPlaylist ) ) );\n    connect( m_session->Playlists(), SIGNAL( notifyContainerLoadedSignal() ), this, SLOT( notifyAllPlaylistsLoaded() ) );\n\n    // read stdin\n    m_stdinWatcher = new ConsoleWatcher( 0 );\n    connect( m_stdinWatcher, SIGNAL( lineRead( QVariant ) ), this, SLOT( playdarMessage( QVariant ) ) );\n    m_stdinWatcher->moveToThread( &m_stdinThread );\n    m_stdinThread.start( QThread::LowPriority );\n\n    m_statusTimer->setInterval( 30000 );\n    m_statusTimer->setSingleShot( true );\n    connect( m_statusTimer, SIGNAL( timeout() ), this, SLOT( getStatus() ) );\n    m_statusTimer->start();\n}\n\n\nvoid\nSpotifyResolver::getStatus()\n{\n    if ( m_haveSentStatus && !m_foundTomahawkInstance )\n    {\n        qDebug() << \"TOMAHAWK NOT RUNNING? Exiting...\";\n        quit();\n        return;\n    }\n\n    QVariantMap resp;\n    resp[ \"_msgtype\" ] = \"status\";\n    resp[ \"loggedIn\" ] = m_loggedIn;\n    resp[ \"username\" ] = m_username;\n    sendMessage( resp );\n\n    m_statusTimer->start();\n    m_foundTomahawkInstance = false;\n    m_haveSentStatus = true;\n}\n\n\nvoid\nSpotifyResolver::gotStatus()\n{\n    m_foundTomahawkInstance = true;\n}\n\n\nvoid\nSpotifyResolver::errorMsgReceived( sp_error error )\n{\n    QString errMsg;\n    bool debugMsg( false );\n    switch (error) {\n        case SP_ERROR_BAD_API_VERSION:\n        case SP_ERROR_API_INITIALIZATION_FAILED:\n        case SP_ERROR_BAD_APPLICATION_KEY:\n        case SP_ERROR_CLIENT_TOO_OLD:\n        case SP_ERROR_BAD_USER_AGENT:\n        case SP_ERROR_MISSING_CALLBACK:\n        case SP_ERROR_INVALID_INDATA:\n        case SP_ERROR_INDEX_OUT_OF_RANGE:\n        case SP_ERROR_OTHER_TRANSIENT:\n        case SP_ERROR_IS_LOADING:\n            debugMsg = true;\n            errMsg = QString(\"An internal error happened with error code (%1).\\n\\nPlease, report this bug.\" ).arg(error);\n            break;\n        case SP_ERROR_BAD_USERNAME_OR_PASSWORD:\n            errMsg =  \"Invalid username or password\";\n            break;\n        case SP_ERROR_USER_BANNED:\n            errMsg =  \"This user has been banned\";\n            break;\n        case SP_ERROR_UNABLE_TO_CONTACT_SERVER:\n            errMsg =  \"Cannot connect to server\";\n            break;\n        case SP_ERROR_OTHER_PERMANENT:\n            debugMsg = true;\n            errMsg =  \"A permanent error occured\";\n            break;\n        case SP_ERROR_USER_NEEDS_PREMIUM:\n            errMsg = \"You need to be a Premium User in order to login\";\n            break;\n        default:\n            debugMsg = true;\n            errMsg =  QString::fromUtf8( sp_error_message( error ) );\n            break;\n    }\n    errorMsgReceived( errMsg, debugMsg );\n}\n\n\nvoid\nSpotifyResolver::updateBlob( const QByteArray& username, const QByteArray& blob )\n{\n    if( m_username.toUtf8() == username.constData() )\n    {\n        QSettings s;\n        s.setValue( \"blob\", QString(blob) );\n    }\n    else\n        qDebug() << \"===== FAILED TO SAVE BLOB\";\n}\n\n\nvoid\nSpotifyResolver::errorMsgReceived( const QString &errMsg, bool isDebug )\n{\n    QVariantMap resp;\n    resp[ \"_msgtype\" ] = \"spotifyError\";\n    resp[ \"msg\" ] = errMsg;\n    resp[ \"isDebugMsg\" ] = isDebug;\n    QJson::Serializer s;\n    QByteArray msg = s.serialize( resp );\n    qDebug() << \"SENDING ERROR JSON:\" << msg;\n    sendMessage( resp );\n}\n\n\nvoid\nSpotifyResolver::userChangedReceived()\n{\n\n    QVariantMap resp;\n    resp[ \"_msgtype\" ] = \"userChanged\";\n    resp[ \"msg\" ] = \"Username changed! Removing synced playlists...\";\n    sendMessage( resp );\n\n}\n\n\nvoid\nSpotifyResolver::sendPlaylist( const SpotifyPlaylists::LoadedPlaylist& pl )\n{\n    qDebug() << \"Sending playlist to client:\" << pl.name_ << \"with number of tracks:\" << pl.tracks_.size();\n    if ( !pl.playlist_ || !sp_playlist_is_loaded( pl.playlist_ ) )\n    {\n        qDebug() << \"NULL or not loaded playlist in callbacK!\";\n        return;\n    }\n\n    QVariantMap resp;\n\n    if ( m_playlistToQid.contains( pl.id_ ) )\n        resp[ \"qid\" ] = m_playlistToQid.take( pl.id_ );\n\n    resp[ \"id\" ] = pl.id_;\n    resp[ \"name\" ] = pl.name_;\n    resp[ \"revid\" ] = pl.revisions.last().revId;\n    resp[ \"sync\" ] = pl.sync_;\n    resp[ \"owner\" ] = ( m_username == pl.owner_ );\n    resp[ \"collaborative\" ] = pl.isCollaborative;\n    resp[ \"_msgtype\" ] = \"playlist\";\n\n    QVariantList tracks;\n    QList< sp_track*> waitingFor;\n    foreach( sp_track *tr, pl.tracks_ )\n    {\n        if ( !tr || !sp_track_is_loaded( tr ) )\n        {\n            qDebug() << \"PlaylistTrack isnt loaded yet... waiting\";\n            waitingFor << tr;\n        }\n        else\n            tracks << spTrackToVariant( tr );\n    }\n\n    if( !waitingFor.isEmpty() )\n    {\n        qDebug() << \"PlaylistTracks isnt loaded yet... waiting\";\n        m_session->Playlists()->addStateChangedCallback( NewPlaylistClosure( boost::bind(checkTracksAreLoaded, waitingFor), this, SLOT( sendPlaylist( SpotifyPlaylists::LoadedPlaylist ) ), pl ) );\n        return;\n    }\n\n    resp[ \"tracks\" ] = tracks;\n\n#if PLAYLIST_DEBUG\n     QJson::Serializer s;\n     QByteArray msg = s.serialize( resp );\n     qDebug() << \"SENDING PLAYLIST JSON:\" << msg;\n#endif\n\n    sendMessage( resp );\n}\n\n\nvoid\nSpotifyResolver::sendPlaylistMetadataChanged( const SpotifyPlaylists::LoadedPlaylist& pl )\n{\n    qDebug() << \"Sending playlist metadata to client:\" << pl.name_;\n\n    if ( !pl.playlist_ || !sp_playlist_is_loaded( pl.playlist_ ) )\n    {\n        qDebug() << \"NULL or not loaded playlist in callbacK!\";\n        return;\n    }\n\n    QVariantMap resp;\n\n    if ( m_playlistToQid.contains( pl.id_ ) )\n        resp[ \"qid\" ] = m_playlistToQid.take( pl.id_ );\n\n    resp[ \"id\" ] = pl.id_;\n    resp[ \"name\" ] = pl.name_;\n    resp[ \"revid\" ] = pl.revisions.last().revId;\n    resp[ \"sync\" ] = pl.sync_;\n    resp[ \"collaborative\" ] = pl.isCollaborative;\n    resp[ \"subscribers\" ] = pl.numSubscribers;\n    resp[ \"_msgtype\" ] = \"playlistMetadataChanged\";\n\n#if PLAYLIST_DEBUG\n    QJson::Serializer s;\n    QByteArray msg = s.serialize( resp );\n    qDebug() << \"SENDING PLAYLIST JSON:\" << msg;\n#endif\n\n    sendMessage( resp );\n}\n\nvoid\nSpotifyResolver::sendStarredChanged(sp_playlist* pl, const QList<sp_track *> &tracks, const bool starred)\n{\n    qDebug() << Q_FUNC_INFO;\n\n    SpotifyPlaylists::LoadedPlaylist lpl = m_session->Playlists()->getLoadedPlaylist( pl );\n    QVariantMap msg;\n    msg[ \"_msgtype\" ] = \"starredChanged\";\n    msg[ \"starred\" ] = starred;\n    msg[ \"playlistid\" ] = lpl.id_;\n    msg[ \"startPosition\" ] = lpl.tracks_.count();\n\n    QString oldrev(\"\");\n    if ( lpl.revisions.size() >= 2 )\n        oldrev = lpl.revisions.at( lpl.revisions.size() - 2 ).revId;\n\n    msg[ \"oldrev\" ] = oldrev;\n    msg[ \"revid\" ] = lpl.revisions.last().revId;\n\n    QVariantList outgoingTracks;\n    QList< sp_track*> waitingFor;\n    foreach( sp_track* track, tracks )\n    {\n        if ( !track || !sp_track_is_loaded( track ) )\n        {\n            waitingFor << track;\n        }\n        else\n            outgoingTracks << spTrackToVariant( track );\n    }\n\n    if( !waitingFor.isEmpty() )\n    {\n        qDebug() << \"StarredTracks isnt loaded yet... waiting\";\n        m_session->Playlists()->addStateChangedCallback( NewPlaylistClosure( boost::bind(checkTracksAreLoaded, waitingFor), this, SLOT( sendStarredChanged(QList<sp_track*>, bool) ), tracks, starred ) );\n        return;\n    }\n    msg[ \"tracks\" ] = outgoingTracks;\n\n    QJson::Serializer s;\n    QByteArray m = s.serialize( msg );\n    qDebug() << \"SENDING STARRED CHANGED TRACKS JSON:\" << m;\n\n    sendMessage( msg );\n}\n\n\nvoid\nSpotifyResolver::sendTracksAdded( sp_playlist* pl, const QList< sp_track* >& tracks, const QString& positionId )\n{\n    QVariantMap msg;\n    msg[ \"_msgtype\" ] = \"tracksAdded\";\n\n    SpotifyPlaylists::LoadedPlaylist lpl = m_session->Playlists()->getLoadedPlaylist( pl );\n\n    QString oldrev;\n    if ( lpl.revisions.size() >= 2 )\n        oldrev = lpl.revisions.at( lpl.revisions.size() - 2 ).revId;\n\n    msg[ \"playlistid\" ] = lpl.id_;\n    msg[ \"oldrev\" ] = oldrev;\n    msg[ \"revid\" ] = lpl.revisions.last().revId;\n    msg[ \"startPosition\" ] = positionId;\n\n    QVariantList outgoingTracks;\n    QList< sp_track*> waitingFor;\n    foreach( sp_track* track, tracks )\n    {\n        if ( !track || !sp_track_is_loaded( track ) )\n        {\n            waitingFor << track;\n        }\n        else\n            outgoingTracks << spTrackToVariant( track );\n    }\n\n    if( !waitingFor.isEmpty() )\n    {\n        qDebug() << \"PlaylistTracks isnt loaded yet... waiting\";\n        m_session->Playlists()->addStateChangedCallback( NewPlaylistClosure( boost::bind(checkTracksAreLoaded, waitingFor), this, SLOT( sendTracksAdded(sp_playlist*,QList<sp_track*>,QString) ), pl, tracks, positionId ) );\n        return;\n    }\n    msg[ \"tracks\" ] = outgoingTracks;\n\n\n#if PLAYLIST_DEBUG\n    QJson::Serializer s;\n    QByteArray m = s.serialize( msg );\n    qDebug() << \"SENDING ADDED TRACKS JSON:\" << m;\n#endif\n\n    sendMessage( msg );\n}\n\n\nvoid\nSpotifyResolver::sendTracksMoved( sp_playlist* pl, const QStringList& tracks, const QString& positionId )\n{\n    // TODO\n    QVariantMap msg;\n    msg[ \"_msgtype\" ] = \"tracksMoved\";\n\n    SpotifyPlaylists::LoadedPlaylist lpl = m_session->Playlists()->getLoadedPlaylist( pl );\n\n    QString oldrev;\n    if ( lpl.revisions.size() >= 2 )\n        oldrev = lpl.revisions.at( lpl.revisions.size() - 2 ).revId;\n\n    msg[ \"playlistid\" ] = lpl.id_;\n    msg[ \"oldrev\" ] = oldrev;\n    msg[ \"revid\" ] = lpl.revisions.last().revId;\n    msg[ \"newStartPosition\" ] = positionId;\n\n    QVariantList v; // ARGGG i hate qjson. QStringList encodes [ \"a\" ]  as \"a\" instead of [ \"a\" ].\n    foreach( const QString& str, tracks )\n        v << str;\n\n    msg[ \"tracks\" ] = v;\n\n#if PLAYLIST_DEBUG\n    QJson::Serializer s;\n    QByteArray m = s.serialize( msg );\n    qDebug() << \"SENDING MOVED TRACKS JSON:\" << m;\n#endif\n\n    sendMessage( msg );\n}\n\n\nvoid\nSpotifyResolver::sendTracksRemoved( sp_playlist* pl, const QStringList& tracks )\n{\n    QVariantMap msg;\n    msg[ \"_msgtype\" ] = \"tracksRemoved\";\n\n    SpotifyPlaylists::LoadedPlaylist lpl = m_session->Playlists()->getLoadedPlaylist( pl );\n\n    QString oldrev(\"\");\n    if ( lpl.revisions.size() >= 2 )\n        oldrev = lpl.revisions.at( lpl.revisions.size() - 2 ).revId;\n\n    msg[ \"playlistid\" ] = lpl.id_;\n    msg[ \"oldrev\" ] = oldrev;\n    msg[ \"revid\" ] = lpl.revisions.last().revId;\n\n    QVariantList v; // ARGGG i hate qjson. QStringList encodes [ \"a\" ]  as \"a\" instead of [ \"a\" ].\n    foreach( const QString& str, tracks )\n        v << str;\n\n    msg[ \"trackPositions\" ] = v;\n\n#if PLAYLIST_DEBUG\n    QJson::Serializer s;\n    QByteArray m = s.serialize( msg );\n    qDebug() << \"SENDING TRACKS REMOVED JSON:\" << m;\n#endif\n\n    sendMessage( msg );\n}\n\n\nvoid\nSpotifyResolver::sendPlaylistDeleted( const QString& playlist )\n{\n    QVariantMap msg;\n    msg[ \"_msgtype\" ] = \"playlistDeleted\";\n    msg[ \"playlistid\" ] = playlist;\n\n#if PLAYLIST_DEBUG\n    QJson::Serializer s;\n    QByteArray m = s.serialize( msg );\n    qDebug() << \"SENDING PLAYLIST REMOVED JSON:\" << m;\n#endif\n\n    sendMessage( msg );\n}\n\n\nvoid\nSpotifyResolver::sendPlaylistListing( sp_playlist* pl, const QString& plid )\n{\n    Q_ASSERT( sp_playlist_is_loaded( pl ) );\n\n    if ( !sp_playlist_is_loaded( pl ) )\n    {\n        qWarning() << Q_FUNC_INFO << \"Got NON_LOADED playlist in playlist loaded callback, wtf?\" << sp_playlist_name( pl );\n        return;\n    }\n\n    qDebug() << \"Sending playlist listing to client:\" << plid << sp_playlist_name( pl ) << \"with number of tracks:\" << sp_playlist_num_tracks( pl );\n\n\n    QVariantMap resp;\n\n    if ( m_playlistToQid.contains( plid ) )\n        resp[ \"qid\" ] = m_playlistToQid.take( plid );\n\n    resp[ \"id\" ] = plid;\n    resp[ \"name\" ] = QString::fromUtf8( sp_playlist_name( pl ) );\n    if ( sp_playlist_owner( pl ) )\n        resp[ \"creator\" ] = QString::fromUtf8( sp_user_display_name( sp_playlist_owner( pl ) ) );\n    resp[ \"collaborative\" ] = sp_playlist_is_collaborative( pl );\n    resp[ \"subscribers\" ] = sp_playlist_num_subscribers( pl );\n    resp[ \"_msgtype\" ] = \"playlistListing\";\n\n    QVariantList tracks;\n    QList< sp_track *> waitingFor;\n    for ( int i = 0; i < sp_playlist_num_tracks( pl ); i++ )\n    {\n        sp_track* tr = sp_playlist_track( pl, i );\n\n        if ( !tr || !sp_track_is_loaded( tr ) )\n        {\n            waitingFor << tr;\n        }\n        else\n            tracks << spTrackToVariant( tr );\n    }\n\n\n    if( !waitingFor.isEmpty() )\n    {\n        qDebug() << \"PlaylistTracks isnt loaded yet... waiting\";\n        m_playlistToQid[ plid ] = resp[ \"qid\" ].toString(); // restore qid so we can get it when we are called again\n        m_session->Playlists()->addStateChangedCallback( NewPlaylistClosure( boost::bind(checkTracksAreLoaded, waitingFor), this, SLOT( sendPlaylistListing( sp_playlist*, QString ) ), pl, plid ) );\n        return;\n    }\n\n    qDebug() << \"Sending playlistListning\";\n    resp[ \"tracks\" ] = tracks;\n\n#if PLAYLIST_DEBUG\n    QJson::Serializer s;\n    QByteArray msg = s.serialize( resp );\n    qDebug() << \"SENDING PLAYLISTLISTING JSON:\" << msg;\n#endif\n\n    sendMessage( resp );\n    sp_playlist_release( pl );\n}\n\n\nvoid\nSpotifyResolver::sendAddTracksResult( const QString& spotifyId, QList<int> tracksInserted, QList<QString> insertedIds, bool result )\n{\n    QVariantMap resp;\n    SpotifyPlaylists::LoadedPlaylist pl = m_session->Playlists()->getPlaylist( spotifyId );\n\n    if ( m_playlistToQid.contains( pl.id_ ) )\n        resp[ \"qid\" ] = m_playlistToQid.take( pl.id_ );\n\n    resp[ \"_msgtype\" ] = QString();\n    resp[ \"success\" ] = result;\n\n    resp[ \"latestrev\" ] = pl.revisions.last().revId;\n    resp[ \"playlistid\" ] = spotifyId;\n    resp[ \"playlistname\" ] = pl.name_;\n\n    QVariantList ins;\n    foreach ( int i, tracksInserted )\n        ins << i;\n    resp[ \"trackPosInserted\" ] = ins;\n\n    QVariantList ids;\n    foreach ( QString id, insertedIds )\n        ids << id;\n\n    resp[ \"trackIdInserted\" ] = ids;\n\n    QJson::Serializer s;\n    sendMessage( resp );\n}\n\n\nvoid\nSpotifyResolver::sendAlbumSearchResult(const QString& qid, const QString& albumName, const QString& artistName, const QList<sp_track*> tracks)\n{\n    QVariantMap resp;\n    resp[ \"_msgtype\" ] = \"albumListing\";\n    resp[ \"qid\" ] = qid;\n    resp[ \"album\" ] = albumName;\n    resp[ \"artist\" ] = artistName;\n\n    QVariantList trackListing;\n    foreach(sp_track* track, tracks) {\n        trackListing << spTrackToVariant(track);\n        sp_track_release(track);\n    }\n    resp[ \"tracks\" ] = trackListing;\n\n\n    QJson::Serializer s;\n    QByteArray m = s.serialize( resp );\n    qDebug() << \"Sending results of album search\" << m;\n\n    sendMessage( resp );}\n\n\nvoid\nSpotifyResolver::notifyAllPlaylistsLoaded()\n{\n    qDebug() << Q_FUNC_INFO << \"Sending all spotify playlists, found:\" << m_session->Playlists()->getPlaylists().size();\n    // Send a list of all the users's playlists and sync states\n    QVariantMap msg;\n    msg[ \"_msgtype\" ] = \"allPlaylists\";\n    QVariantList playlists;\n    foreach ( const SpotifyPlaylists::LoadedPlaylist& pl, m_session->Playlists()->getPlaylists() )\n    {\n        QVariantMap plObj;\n        plObj[ \"name\" ] = pl.name_;\n        plObj[ \"id\" ] = pl.id_;\n        if( pl.revisions.isEmpty() )\n        {\n            qDebug() << \"Revisions was empty\";\n            continue;\n        }\n        plObj[ \"revid\" ] = pl.revisions.last().revId;\n        plObj[ \"sync\" ] = pl.sync_;\n        plObj[ \"collaborative\" ] = pl.isCollaborative;\n        plObj[ \"subscribed\" ] = pl.isSubscribed;\n        plObj[ \"owner\" ] = ( m_username == pl.owner_ );\n        plObj[ \"starContainer\" ] = pl.starContainer_;\n        playlists << plObj;\n    }\n\n    msg[ \"playlists\" ] = playlists;\n//     qDebug() << \"ALL\" << playlists;\n\n    QJson::Serializer s;\n    QByteArray m = s.serialize( msg );\n    qDebug() << \"SENDING ALL PLAYLISTS JSON:\"; // << m;\n\n    sendMessage( msg );\n}\n\n\nvoid\nSpotifyResolver::resendAllPlaylists()\n{\n    qDebug() << Q_FUNC_INFO << \"ReSending all spotify playlists, found:\" << m_session->Playlists()->getPlaylists().size();\n    QVariantMap msg;\n    msg[ \"_msgtype\" ] = \"allPlaylists\";\n    QVariantList playlists;\n\n    foreach ( const SpotifyPlaylists::LoadedPlaylist& pl, m_session->Playlists()->getPlaylists() )\n    {\n        QVariantMap plObj;\n        plObj[ \"name\" ] = pl.name_;\n        plObj[ \"id\" ] = pl.id_;\n        plObj[ \"revid\" ] = pl.revisions.last().revId;\n        plObj[ \"sync\" ] = pl.sync_;\n        plObj[ \"collaborative\" ] = pl.isCollaborative;\n        plObj[ \"subscribed\" ] = pl.isSubscribed;\n        plObj[ \"owner\" ] = ( m_username == pl.owner_ );\n        plObj[ \"starContainer\" ] = pl.starContainer_;\n        playlists << plObj;\n    }\n    msg[ \"playlists\" ] = playlists;\n    QJson::Serializer s;\n    QByteArray m = s.serialize( msg );\n    qDebug() << \"reSENDING ALL PLAYLISTS JSON\";\n    sendMessage( msg );\n}\n\n\nvoid\nSpotifyResolver::initSpotify()\n{\n    // Create the session here, as we now have the settings from tomahawk\n    if( m_session->isLoggedIn() )\n    {\n        qDebug() << \"ALREADY LOGGEDIN, CANT RECREATE SESSION, REQUIRES RESTART!\";\n        return;\n    }\n\n    if( m_session->createSession() )\n    {\n        m_port = 55050;\n        m_httpS.setPort( m_port ); //TODO config\n        m_httpS.setListenInterface( QHostAddress::LocalHost );\n        m_httpS.setConnector( &m_connector );\n\n\n        m_handler = new AudioHTTPServer( &m_httpS, m_httpS.port() );\n        m_httpS.setStaticContentService( m_handler );\n\n        qDebug() << \"Starting HTTPd on\" << m_httpS.listenInterface().toString() << m_httpS.port();\n        m_httpS.start();\n\n        login();\n    }\n    else\n    {\n        qDebug() << \"====== FAILED TO CREATE SESSION!!! =======\";\n    }\n        // testing\n//     search( \"123\", \"coldplay\", \"the scientist\" );\n}\n\n\nvoid\nSpotifyResolver::loginResponse( bool success , const QString& msg )\n{\n    qDebug() << Q_FUNC_INFO << \"Notified of login response, sending to client:\" << success << msg;\n    m_loggedIn = true;\n\n    QVariantMap resp;\n    resp[ \"_msgtype\" ] = \"loginResponse\";\n    resp[ \"success\" ] = success;\n    resp[ \"message\" ] = msg;\n    resp[ \"username\" ] = m_username;\n    resp[ \"password\" ] = m_pw;\n    resp[ \"highQuality\" ] = m_highQuality;\n    sendMessage( resp );\n\n    sendSettingsMessage();\n    sp_session_preferred_bitrate( m_session->Session(), m_highQuality ? SP_BITRATE_320k : SP_BITRATE_160k );\n    updatePrivacy();\n}\n\n\nvoid\nSpotifyResolver::sendSettingsMessage()\n{\n    QVariantMap m;\n    m[ \"_msgtype\" ] = \"settings\";\n    m[ \"name\" ] = \"Spotify\";\n    m[ \"weight\" ] = \"90\";\n    m[ \"timeout\" ] = \"10\";\n    m[ \"icon\" ] = \"spotify-sourceicon.png\";\n\n    sendMessage( m );\n}\n\n\n/**\n * @brief SpotifyResolver::updatePrivacy\n * @wierd doc: This disables sharing what the user is listening to to services such as Spotify Social,\n *             Facebook and LastFM. The private session will last for a time, and then libspotify will\n *             revert to the normal state. The private session is prolonged by user activity.\n */\nvoid\nSpotifyResolver::updatePrivacy()\n{\n    qDebug() << \"Updating privacy!\";\n    sp_error err = sp_session_set_private_session( m_session->Session(), m_privateSession );\n    qDebug() << \"Updated privacy mode. Private?\" << sp_session_is_private_session( m_session->Session()) << m_privateSession << sp_error_message(err);\n}\n\n\nvoid\nSpotifyResolver::playdarMessage( const QVariant& msg )\n{\n    //qDebug() << \"Got playdar message!\" << msg;\n\n    if( !msg.canConvert< QVariantMap >() ) {\n        qWarning() << \"Got non-map in json!\";\n        return;\n    }\n\n    QVariantMap m = msg.toMap();\n\n    if ( m.value( \"_msgtype\" ) == \"login\" )\n    {\n        m_username = m[ \"username\" ].toString();\n        m_pw = m[ \"password\" ].toString();\n        QSettings s;\n        m_blob = s.value( \"blob\", QByteArray() ).toByteArray();\n        m_highQuality = m[ \"highQuality\" ].toBool();\n        m_privateSession = m[ \"privateSession\" ].toBool();\n        login();\n        saveSettings();\n\n    }\n    else if ( m.value( \"_msgtype\" ) == \"logout\" )\n    {\n        m_username.clear();\n        m_pw.clear();\n        m_blob.clear();\n        saveSettings();\n        m_loggedIn = false;\n        sp_session_forget_me( m_session->Session() );\n        m_session->logout( true );\n\n    }\n    else if ( m.value( \"_msgtype\" ) == \"status\" )\n    {\n        gotStatus();\n    }\n    else if ( m.value( \"_msgtype\" ) == \"setPrivacyMode\" )\n    {\n        m_privateSession = m[ \"private\" ].toBool();\n        updatePrivacy();\n    }\n    else if ( m.value( \"_msgtype\" ) == \"quit\" )\n    {\n        quit();\n    }\n    else if ( m.value( \"_msgtype\" ) == \"getCredentials\" )\n    {\n        // For migrating to tomahawk accounts\n        qDebug() << \"Tomahawk asked for credentials, sending! Logged in?\" << m_loggedIn;\n        QVariantMap msg;\n\n        msg[ \"_msgtype\" ] = \"credentials\";\n        msg[ \"username\" ] = m_username;\n        msg[ \"password\" ] = m_pw; // Set to empty pass, we dont want too fool anyone\n        msg[ \"loggedIn\" ] = m_loggedIn;\n        msg[ \"highQuality\" ] = m_highQuality;\n\n        sendMessage( msg );\n    }\n    else if( m.value( \"_msgtype\" ) == \"rq\" )\n    {\n        if( !m_loggedIn )\n            return;\n\n        const QString qid = m.value( \"qid\" ).toString();\n        // Spotify is sensitive, - equals minus next string, not so good in\n        // examples like Queen Breakthru - 2011 remastered == Queen Breaktru ( Does not exist )\n        // Also, for some reason, spotify cant find Camelcases at times.\n        const QString artist = m.value( \"artist\" ).toString();\n        const QString track = m.value( \"track\" ).toString();\n        const QString fullText = m.value( \"fulltext\" ).toString();\n        const QString resultHint = m.value( \"resultHint\" ).toString();\n        qDebug() << \"Resolving:\" << qid << artist << track << \"fulltext?\" << fullText << resultHint;\n\n        search( qid, artist, track, fullText, resultHint );\n    }\n    else if( m.value( \"_msgtype\" ) == \"config\" )\n    {\n        const QByteArray configPath = dataDir( true ).toUtf8();\n        QString settingsFilename( QString( configPath ) + \"/settings\" );\n\n        qDebug() << \"Looking for spotify settings file at \" << settingsFilename;\n\n        QFile settingsFile( settingsFilename );\n        QVariantMap spotifySettings;\n        bool ok = true;\n\n        if ( settingsFile.exists() && settingsFile.size() > 0 )\n        {\n            qDebug() << \"Found spotify settings file, parsing...\";\n            QJson::Parser parser;\n            settingsFile.open( QIODevice::ReadOnly | QIODevice::Text );\n            QString settingsString = settingsFile.readAll();\n            settingsFile.close();\n            spotifySettings = parser.parse( settingsString.toLocal8Bit(), &ok ).toMap();\n        }\n\n        if ( !ok )\n        {\n            qDebug() << \"Previous spotify settings file found but could not be read successfully\";\n            QTimer::singleShot( 0, this, SLOT( initSpotify() ) );\n            return;\n        }\n\n        if( !m.value( \"proxyhost\" ).toString().isEmpty() && m.value( \"proxytype\" ).toString() == \"socks5\" )\n        {\n            qDebug() << \" ===== Using PROXY! =====\";\n            QString proxyString = QString( \"%1://%2:%3\" ).arg( m.value( \"proxytype\" ).toString() ).arg( m.value( \"proxyhost\" ).toString() ).arg( m.value( \"proxyport\" ).toString() );\n            spotifySettings[\"proxy\"] = proxyString;\n            spotifySettings[\"proxy_pass\"] =  m.value( \"proxypassword\" ).toString();\n            spotifySettings[\"proxy_username\"] = m.value( \"proxyusername\" ).toString();\n            // Set proxySettings\n            m_session->setProxySettings( spotifySettings );\n        }\n        else\n        {\n            spotifySettings.remove( \"proxy\" );\n            spotifySettings.remove( \"proxy_pass\" );\n            spotifySettings.remove( \"proxy_mode\" );\n            spotifySettings.remove( \"proxy_username\" );\n        }\n\n        settingsFile.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate );\n        QJson::Serializer serializer;\n        QByteArray json = serializer.serialize( spotifySettings );\n        settingsFile.write( json );\n        settingsFile.close();\n        QTimer::singleShot( 0, this, SLOT( initSpotify() ) );\n    }\n    else if( m.value( \"_msgtype\" ) == \"getPlaylist\" )\n    {\n        // Asking for playlist and potentially to sync with it. Load it if we have to, and send it over\n        const QString plid = m.value( \"playlistid\" ).toString();\n        const bool sync = m.value( \"sync\" ).toBool();\n\n        const QString qid = m.value( \"qid\" ).toString();\n        registerQidForPlaylist( qid, plid );\n\n        qDebug() << Q_FUNC_INFO << \"Got request for playlist with sync:\" << plid << sync;\n\n        m_session->Playlists()->sendPlaylist( plid, sync );\n        //SpotifyPlaylists::LoadedPlaylist playlist = m_session->Playlists()->getPlaylist( plid );\n    }\n    else if ( m.value( \"_msgtype\" ) == \"removeFromSyncList\" )\n    {\n        const QString plid = m.value( \"playlistid\" ).toString();\n        m_session->Playlists()->setSyncPlaylist( plid, false );\n    }\n    else if ( m.value( \"_msgtype\" ) == \"setSync\" )\n    {\n        const QString plid = m.value( \"playlistid\" ).toString();\n        const bool sync = m.value( \"sync\" ).toBool();\n        m_session->Playlists()->setSyncPlaylist( plid, sync );\n    }\n    else if ( m.value( \"_msgtype\" ) == \"setStarred\" )\n    {\n        const QString artist = m.value( \"artist\" ).toString();\n        const QString track = m.value( \"title\" ).toString();\n        const bool starred = m.value( \"starred\" ).toBool();\n        searchAndStarrTrack(artist, track, starred);\n    }\n    else if ( m.value( \"_msgtype\" ) == \"setCollaborative\" )\n    {\n        const QString plid = m.value( \"playlistid\" ).toString();\n        const bool collab = m.value( \"collaborative\" ).toBool();\n        m_session->Playlists()->setCollaborative( plid, collab );\n    }\n    else if ( m.value( \"_msgtype\" ) == \"setSubscription\" )\n    {\n        qDebug() << \"GOT SUBSCRIPTION REQ!\";\n        const QString plid = m.value( \"playlistid\" ).toString();\n        const bool subscribe = m.value( \"subscribe\" ).toBool();\n        m_session->Playlists()->setSubscribedPlaylist( plid, subscribe );\n    }\n    else if ( m.value( \"_msgtype\" ) == \"removeTracksFromPlaylist\" )\n    {\n        const QString plid = m.value( \"playlistid\" ).toString();\n        const uint oldRev = m.value( \"oldrev\" ).toUInt();\n\n        const QString qid = m.value( \"qid\" ).toString();\n\n        if ( plid.isEmpty() )\n        {\n            qWarning() << \"no playlist to remove tracks from! Asked to remove from:\" << plid;\n            return;\n        }\n\n        bool success = m_session->Playlists()->removeFromSpotifyPlaylist( m );\n        const QString newRev = m_session->Playlists()->getPlaylist( plid ).revisions.last().revId;\n\n\n        QVariantMap msg;\n        msg[ \"_msgtype\" ] = \"\";\n        msg[ \"qid\" ] = qid; // ESSENTIAL\n        msg[ \"success\" ] = success;\n        msg[ \"newrev\" ] = newRev;\n        sendMessage( msg );\n    }\n    else if ( m.value( \"_msgtype\" ) == \"addTracksToPlaylist\" )\n    {\n        const QString plid = m.value( \"playlistid\" ).toString();\n\n        const QString qid = m.value( \"qid\" ).toString();\n        registerQidForPlaylist( qid, plid );\n\n        if ( plid.isEmpty() )\n        {\n            qWarning() << \"no playlist to add tracks to! Asked to add to:\" << plid;\n            return;\n        }\n\n        m_session->Playlists()->addTracksToSpotifyPlaylist( m );\n\n        // callback is async\n    }\n    else if ( m.value( \"_msgtype\" ) == \"moveTracksInPlaylist\" )\n    {\n        const QString plid = m.value( \"playlistid\" ).toString();\n        const uint oldRev = m.value( \"oldrev\" ).toUInt();\n        const QString startPos = m.value( \"startPosition\" ).toString();\n\n        const QString qid = m.value( \"qid\" ).toString();\n\n        if ( plid.isEmpty() )\n        {\n            qWarning() << \"no playlist to move tracks in! Asked to move in:\" << plid;\n            return;\n        }\n        const QVariantList tracks = m.value( \"tracks\" ).toList();\n\n        sp_error ret = m_session->Playlists()->moveTracksInSpotifyPlaylist( plid, tracks, startPos );\n\n        const QString newRev = m_session->Playlists()->getPlaylist( plid ).revisions.last().revId;\n        const bool success = (ret == SP_ERROR_OK);\n\n        QVariantMap resp;\n        resp[ \"_msgtype\" ] = \"\";\n        resp[ \"qid\" ] = qid;\n        resp[ \"success\" ] = success;\n        resp[ \"playlistid\" ] = plid;\n        resp[ \"newrev\" ] = newRev;\n\n\n        QJson::Serializer s;\n        QByteArray mm = s.serialize( resp );\n        qDebug() << \"SENDING MOVED TRACKS RESPONSE JSON:\" << mm;\n\n        sendMessage( resp );\n    }\n    else if( m.value( \"_msgtype\" ) == \"playlistRenamed\")\n    {\n        // Important oldrev\n        if( !m.value( \"oldrev\" ).isValid() )\n        {\n            qWarning() << \"No revision id for namechange!\";\n            return;\n        }\n        const QString plid = m.value( \"playlistid\" ).toString();\n        const QString newTitle = m.value( \"newTitle\" ).toString();\n        const QString oldTitle = m.value( \"oldTitle\" ).toString();\n\n        if ( plid.isEmpty() )\n        {\n            qWarning() << \"no playlist to add tracks to! Asked to add to:\" << plid;\n            return;\n        }\n\n        if( newTitle.isEmpty() || oldTitle.isEmpty() )\n        {\n            qWarning() << \"Cant rename playlist with empty name!\";\n            return;\n        }\n\n        m_session->Playlists()->renamePlaylist( m );\n    }\n    else if ( m.value( \"_msgtype\" ) == \"createPlaylist\" )\n    {\n        m_session->Playlists()->addNewPlaylist( m );\n    }\n    else if ( m.value( \"_msgtype\" ) == \"deletePlaylist\" )\n    {\n        const QString plid = m.value( \"playlistid\" ).toString();\n        sp_playlist* pl = m_session->Playlists()->getPlaylist( plid ).playlist_;\n        if ( pl )\n            m_session->Playlists()->doRemovePlaylist( pl );\n    }\n    else if ( m.value( \"_msgtype\" ) == \"albumListing\" )\n    {\n        const QString albumName = m.value( \"album\" ).toString();\n        const QString artistName = m.value( \"artist\" ).toString();\n        const QString qid = m.value( \"qid\" ).toString();\n\n        albumSearch( albumName, artistName, qid );\n    }\n    else if ( m.value( \"_msgtype\" ) == \"playlistListing\" )\n    {\n        const QString id = m.value( \"id\" ).toString();\n        const QString qid = m.value( \"qid\" ).toString();\n\n        m_playlistToQid[ id ] = qid;\n\n        if ( id.isEmpty() )\n        {\n            qDebug() << \"Asked for playlistlisting with empty ID. Oops.\";\n\n            QVariantMap resp;\n            resp[ \"_msgtype\" ] = \"\";\n            resp[ \"qid\" ] = qid;\n            resp[ \"success\" ] = false;\n            resp[ \"playlistid\" ] = id;\n            resp[ \"tracks\" ] = QVariantList();\n            sendMessage( resp );\n            return;\n        }\n        qDebug() << \"Asked to get playlist listing from playlist id:\" << id;\n\n        sp_playlist *playlist = m_session->Playlists()->getPlaylistFromUri( id );\n\n        if( !sp_playlist_is_loaded( playlist ) )\n        {\n            qDebug() << \"Got playlist but waiting for it to be loaded\";\n            m_session->Playlists()->addStateChangedCallback( NewPlaylistClosure( boost::bind(checkPlaylistIsLoaded, playlist), this, SLOT( sendPlaylistListing( sp_playlist*, QString) ), playlist, id) );\n            return;\n        }\n        else\n        {\n            qDebug() << \"Got playlist and sending it back!\";\n            sendPlaylistListing( playlist, id );\n        }\n    }\n}\n\nvoid\nSpotifyResolver::searchAndStarrTrack(const QString &artist, const QString &track, const bool starred)\n{\n    const QString query = QString( \"artist:%1 track:%2\" ).arg( artist ).arg( track );\n    StarData* userdata = new StarData( artist, track, starred );\n#if SPOTIFY_API_VERSION >= 11\nsp_search_create( m_session->Session(), query.toUtf8().data(), 0, 5 , 0, 0, 0, 0, 0, 0, SP_SEARCH_STANDARD, &SpotifySearch::searchStarredComplete, userdata );\n#else\nsp_search_create( m_session->Session(), query.toUtf8().data(), 0, 5, 0, 0, 0, 0, &SpotifySearch::searchStarredComplete, userdata );\n#endif\n}\n\nvoid\nSpotifyResolver::registerQidForPlaylist( const QString& qid, const QString& playlist )\n{\n    if ( !qid.isEmpty() )\n        m_playlistToQid[ playlist ] = qid;\n}\n\n\nvoid\nSpotifyResolver::sendMessage(const QVariant& v)\n{\n    QJson::Serializer s;\n    QByteArray msg = s.serialize( v );\n    quint32 len;\n    qToBigEndian( msg.length(), (uchar*) &len );\n\n//     QByteArray outB;\n//     QDataStream out( &outB, QIODevice::WriteOnly );\n    QFile out;\n    out.open( stdout, QIODevice::WriteOnly );\n    out.write( (const char*) &len, 4 );\n    out.write( msg );\n    out.close();\n\n}\n\n/**\n * @brief SpotifyResolver::resultHint\n * @param resultHint\n * We have a spotify id in our request\n * utilize that and load the track instantly\n * to make us skip doing a search, and always give correct\n * track back.\n */\nbool\nSpotifyResolver::useResultHint( const QString& qid, sp_link* resultHintLink )\n{\n    if( resultHintLink )\n    {\n        if( sp_link_type( resultHintLink ) == SP_LINKTYPE_TRACK )\n        {\n\n            QVariantMap resp;\n            resp[ \"qid\" ] = qid;\n            resp[ \"_msgtype\" ] = \"results\";\n\n            QVariantList results;\n            sp_track *spTrack = sp_track_get_playable( m_session->Session(), sp_link_as_track( resultHintLink ) );\n            sp_track_add_ref( spTrack );\n\n            if( !sp_track_is_loaded( spTrack ) )\n            {\n                qDebug() << \"rq Track isnt loaded yet...\";\n                m_session->Playlists()->addStateChangedCallback( NewPlaylistClosure( boost::bind(checkTrackIsLoaded, spTrack), this, SLOT( useResultHint( QString, sp_link*) ), qid, resultHintLink) );\n                return true;\n            }\n            else\n            {\n                if( sp_track_get_availability( m_session->Session() , spTrack ) == SP_TRACK_AVAILABILITY_AVAILABLE )\n                {\n                    qDebug() << \"Sending resultHint\";\n                    addToTrackLinkMap( resultHintLink );\n                    results << spTrackToVariant( spTrack );\n                    resp[ \"results\" ] = results;\n                    sp_link_release( resultHintLink );\n\n                }\n                sendMessage( resp );\n            }\n        }\n    }\n    return false;\n}\n\nvoid\nSpotifyResolver::search( const QString& qid, const QString& artist, const QString& track, const QString& fullText, const QString& resultHint )\n{\n\n    // We gots resulthint, use that instead of search\n    if( !resultHint.isEmpty() )\n    {\n        if( resultHint.contains( \"spotify:track\" ) )\n        {\n            // Do some cleanups if it somehow got the http to it\n            QString cleanResult = resultHint;\n            cleanResult.remove( \"http://localhost:55050/sid/\" ).remove( \".wav\" );\n\n            sp_link *link = sp_link_create_from_string( cleanResult.toAscii() );\n            if( sp_link_type( link ) == SP_LINKTYPE_TRACK )\n            {\n                useResultHint( qid, link );\n                return;\n            }\n            else\n                qDebug() << \"Got resultHint but isnt spotifytrack type, doing search instead\" << cleanResult;\n        }\n    }\n\n    // search spotify..\n    // do some cleanups.. remove ft/feat\n    QString query;\n    UserData* data = new UserData( qid, this );\n\n    if ( fullText.isEmpty() )\n    {\n        // Not a search, just a track resolve.\n        QString cleanedTrack = track;\n        /*if( cleanedTrack.indexOf( \"feat\" ) > -1 )\n            cleanedTrack = cleanedTrack.mid( cleanedTrack.indexOf( \"feat\" ) );\n        if( cleanedTrack.indexOf( \"ft.\" ) > -1 )\n            cleanedTrack = cleanedTrack.mid( cleanedTrack.indexOf( \"ft.\" ) );*/\n\n        cleanedTrack.replace(\":\", \"\");\n        query = QString( \"artist:%1 track:%2\" ).arg( artist ).arg( cleanedTrack );\n\n    }\n    else\n    {\n        // fulltext search\n        query = fullText;\n        data->fulltext = true;\n    }\n\n\n#if SPOTIFY_API_VERSION >= 11\n    sp_search_create( m_session->Session(), query.toUtf8().data(), 0, data->fulltext ? 50 : 3, 0, 0, 0, 0, 0, 0, SP_SEARCH_STANDARD, &SpotifySearch::searchComplete, data );\n#else\n    sp_search_create( m_session->Session(), query.toUtf8().data(), 0, data->fulltext ? 50 : 3, 0, 0, 0, 0, &SpotifySearch::searchComplete, data );\n#endif\n\n}\n\n\nvoid\nSpotifyResolver::albumSearch( const QString& album, const QString& artist, const QString& qid )\n{\n    UserData* data = new UserData(qid, this);\n    const QString query = QString( \"album:\\\"%1\\\" artist:\\\"%2\\\"\" ).arg( album ).arg( artist );\n#if SPOTIFY_API_VERSION >= 11\n    sp_search_create( m_session->Session(), query.toUtf8().data(), 0, 0, 0, 1, 0, 0, 0, 0, SP_SEARCH_STANDARD, &SpotifySearch::albumSearchComplete, data );\n#else\n    sp_search_create( m_session->Session(), query.toUtf8().data(), 0, 0, 0, 1, 0, 0, &SpotifySearch::albumSearchComplete, data );\n#endif\n}\n\n\nQString\nSpotifyResolver::addToTrackLinkMap( sp_link* link )\n{\n    char url[1024];\n    sp_link_as_string( link, url, sizeof( url ) );\n\n    QString uid = url;\n\n    if ( !m_trackLinkMap.contains( uid ) )\n    {\n        sp_link_add_ref( link );\n        m_trackLinkMap.insert( uid, link );\n    }\n\n    return uid;\n}\n\n\nsp_link*\nSpotifyResolver::linkFromTrack( const QString& uid )\n{\n    if ( sp_link* l = m_trackLinkMap.value( uid, 0 ) )\n        return l;\n\n    if ( uid.startsWith( \"spotify:track\" ) )\n    {\n        sp_link* l = sp_link_create_from_string( uid.toAscii() );\n        m_trackLinkMap[ uid ] = l;\n        return l;\n    }\n    return 0;\n}\n\n\nvoid\nSpotifyResolver::clearTrackLinkMap()\n{\n    QHash<QString, sp_link*>::iterator i = m_trackLinkMap.begin();\n    while ( i != m_trackLinkMap.end() )\n    {\n        sp_link_release( i.value() );\n        i = m_trackLinkMap.erase( i );\n    }\n}\n\n\nvoid\nSpotifyResolver::removeFromTrackLinkMap( const QString& linkStr )\n{\n    sp_link_release( m_trackLinkMap.take( linkStr ) );\n}\n\n\nbool\nSpotifyResolver::hasLinkFromTrack( const QString& linkStr )\n{\n    if( m_trackLinkMap.contains( linkStr ) )\n        return true;\n\n    sp_link *test_link = sp_link_create_from_string( linkStr.toAscii() );\n    if( test_link == NULL ){\n        return false;\n    }\n    if( sp_link_type( test_link ) == SP_LINKTYPE_TRACK ){\n        sp_link_release( test_link );\n        return true;\n    }\n    sp_link_release( test_link );\n    return false;\n}\n\n\nQVariantMap\nSpotifyResolver::spTrackToVariant( sp_track* tr )\n{\n    if( !sp_track_is_loaded( tr ) )\n        return QVariantMap();\n\n     QVariantMap track;\n\n     sp_artist* artist = sp_track_artist( tr, 0 );\n     sp_album* album = sp_track_album( tr );\n\n     if( sp_artist_is_loaded( artist ) )\n         track[ \"artist\" ] = QString::fromUtf8( sp_artist_name( sp_track_artist( tr, 0 ) ) );\n     if( sp_album_is_loaded( album ) )\n         track[ \"album\" ] = QString::fromUtf8( sp_album_name( sp_track_album( tr ) ) );\n\n     int duration = sp_track_duration( tr ) / 1000;\n     track[ \"track\" ] = QString::fromUtf8( sp_track_name( tr ) );\n\n     track[ \"albumpos\" ] = sp_track_index( tr );\n     track[ \"discnumber\"] = sp_track_disc( tr );\n     track[ \"year\" ] = sp_album_year( sp_track_album( tr ) );\n     track[ \"mimetype\" ] = \"audio/basic\";\n     track[ \"source\" ] = \"Spotify\";\n     track[ \"duration\" ] = duration;\n     track[ \"score\" ] = .95; // TODO\n     track[ \"bitrate\" ] = highQuality() ? 320 : 160; // TODO\n     // Persistant url, never expire\n     track[ \"expires\" ] = 0;\n\n     // 8 is \"magic\" number. we don't know how much spotify compresses or in which format (mp3 or ogg) from their server, but 1/8th is approximately how ogg -q6 behaves, so use that for better displaying\n     quint32 bytes = ( duration * 44100 * 2 * 2 ) / 8;\n     track[ \"size\" ] = bytes;\n\n     sp_link* l = sp_link_create_from_track( tr, 0 );\n     QString uid = addToTrackLinkMap( l );\n     sp_link_release( l );\n\n     track[ \"id\" ] = uid;\n     track[ \"url\" ] = QString( \"http://localhost:%1/sid/%2.wav\" ).arg( port() ).arg( uid );\n\n\n     return track;\n}\n\n/// misc stuff\n\nvoid\nSpotifyResolver::loadSettings()\n{\n    QSettings s;\n    m_username = s.value( \"username\", QString() ).toString();\n    m_blob = s.value( \"blob\", QByteArray() ).toByteArray();\n    //WIP - Remembered user\n    //m_pw = s.value( \"password\", QString() ).toString();\n    m_highQuality = s.value( \"highQualityStreaming\", true ).toBool();\n}\n\n\nvoid\nSpotifyResolver::saveSettings() const\n{\n    QSettings s;\n    s.setValue( \"username\", m_username );\n    s.setValue( \"blob\", m_blob.constData() );\n    //WIP - Remembered user\n    //s.setValue( \"password\", m_pw );\n    s.setValue( \"highQualityStreaming\", m_highQuality );\n}\n\n\nvoid\nSpotifyResolver::login()\n{\n    if( !m_username.isEmpty() ) { // log in\n        qDebug() << \"Logging in with username:\" << m_username;\n        m_session->login( m_username, m_pw, m_blob );\n    }\n}\n\n\nQString\nSpotifyResolver::dataDir( bool configDir )\n{\n    QString path;\n\n#ifdef WIN32\n    if ( ( QSysInfo::WindowsVersion & QSysInfo::WV_DOS_based ) == 0 )\n    {\n        // Use this for non-DOS-based Windowses\n        char acPath[MAX_PATH];\n        HRESULT h = SHGetFolderPathA( NULL, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE,\n                                        NULL, 0, acPath );\n        if ( h == S_OK )\n        {\n            path = QString::fromLocal8Bit( acPath );\n        }\n    }\n#elif defined(Q_WS_MAC)\n        path = QDir::home().filePath( \"Library/Application Support\" );\n#elif defined(Q_WS_X11)\n        path = QDir::home().filePath( configDir ? \".config\" : \".local/share\" );\n#else\n        path = QCoreApplication::applicationDirPath();\n#endif\n\n    path += QDir::separator() + QCoreApplication::applicationName();\n    QDir d( path );\n    d.mkpath( path );\n\n    //qDebug() << \"Using SpotifyResolver data dir:\" << path;\n    return path;\n}\n\n\nvoid\nSpotifyResolver::instanceStarted( KDSingleApplicationGuard::Instance )\n{\n    // well goodbye!\n    qApp->quit();\n}\n\n/**\n * @brief checkTracktIsLoaded\n * @param track\n * @return bool\n * For use with closure\n */\nbool checkTrackIsLoaded( sp_track* track )\n{\n    qDebug() << \"Checking track\" << sp_track_name( track ) << sp_track_is_loaded( track );\n    return track && sp_track_is_loaded( track );\n}\n"
  },
  {
    "path": "archive/spotify/spotifyresolver.h",
    "content": "/*\n    Copyright (c) 2011-2012 Leo Franchi <lfranchi@kde.org>\n    Copyright (c) 2012 Hugo Lindström <hugolm84@gmail.com>\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n#ifndef tomahawkspotify_H\n#define tomahawkspotify_H\n\n#include \"QxtHttpServerConnector\"\n#include \"qxthttpsessionmanager.h\"\n#include \"kdsingleapplicationguard/kdsingleapplicationguard.h\"\n\n#include <libspotify/api.h>\n#include \"spotifyplaylists.h\"\n#include <QCoreApplication>\n#include <QTimer>\n#include <QThread>\n#include <QVariant>\n#include <QMutex>\n#include <QWaitCondition>\n#include <QQueue>\n#include \"spotifysession.h\"\n#include \"audiohttpserver.h\"\n#define sApp static_cast< SpotifyResolver* >( QCoreApplication::instance() )\n\nclass QxtHttpSessionManager;\nclass ConsoleWatcher;\nclass SpotifyResolver;\n\ntypedef QHash<QString, QString > CacheEntry;\n\nstruct UserData\n{\n    QString qid;\n    bool fulltext;\n    SpotifyResolver* resolver;\n    int searchCount;\n\n    UserData( const QString& qidd, SpotifyResolver* resolverr )\n        : qid( qidd ), fulltext( false ), resolver( resolverr ), searchCount( 0 )\n    {}\n};\n\nstruct StarData\n{\n    QString artist, track;\n    bool starred;\n\n    StarData( const QString& _artist, const QString& _track, bool _starred )\n        : artist(_artist), track(_track), starred(_starred) {}\n};\n\nclass SpotifyResolver : public QCoreApplication\n{\n    Q_OBJECT\npublic:\n\n    explicit SpotifyResolver( int& argc, char** argv );\n    virtual ~SpotifyResolver();\n\n    void search( const QString& qid, const QString& artist, const QString& track, const QString& fullText, const QString& resultHint = QString() );\n    void albumSearch( const QString& album, const QString& artist, const QString& qid );\n\n    // adds a track to the link map, returns a unique ID for identifying it\n    QString addToTrackLinkMap( sp_link* link );\n    void removeFromTrackLinkMap( const QString& linkStr );\n    sp_link* linkFromTrack( const QString& linkStr );\n    bool hasLinkFromTrack( const QString& linkStr );\n\n    AudioHTTPServer* handler() const { return m_handler; }\n    static QString dataDir( bool configDir = false );\n    void sendMessage( const QVariant& v );\n\n    int port() const { return m_port; }\n    SpotifySession* session() const { return m_session; }\n    bool highQuality() const { return m_highQuality; }\n\n    void sendAddTracksResult( const QString& spotifyId, QList<int> tracksInserted, QList<QString> insertedIds, bool result );\n    QVariantMap spTrackToVariant(sp_track* track );\n    void sendAlbumSearchResult( const QString& qid, const QString& albumName, const QString& artistName, const QList<sp_track*> tracks);\n    bool ignoreNextUpdate() const { return m_ignoreNextUpdate; }\n    void setIgnoreNextUpdate( bool ignore ) { m_ignoreNextUpdate = ignore; }\n\n    void registerQidForPlaylist( const QString& qid, const QString& playlist );\n\npublic slots:\n    void setup();\n    void instanceStarted( KDSingleApplicationGuard::Instance );\n\nprivate slots:\n    void playdarMessage( const QVariant& );\n    void initSpotify();\n    void loginResponse( bool success, const QString& msg );\n    void notifyAllPlaylistsLoaded();\n    void resendAllPlaylists();\n    void errorMsgReceived( sp_error );\n    void errorMsgReceived( const QString &msg, bool isDebug );\n    void sendPlaylist( const SpotifyPlaylists::LoadedPlaylist& );\n    void sendPlaylistMetadataChanged( const SpotifyPlaylists::LoadedPlaylist& );\n    void sendTracksAdded( sp_playlist* pl, const QList< sp_track* >& tracks, const QString& positionId );\n    void sendStarredChanged( sp_playlist* pl, const QList< sp_track* >& tracks, const bool starred );\n    void sendTracksRemoved( sp_playlist* pl, const QStringList& tracks );\n    void sendTracksMoved( sp_playlist* pl, const QStringList& tracks, const QString& positionId );\n    void sendPlaylistDeleted( const QString& playlist );\n    void sendPlaylistListing( sp_playlist* pl, const QString& plid  );\n    bool useResultHint(const QString& qid, sp_link *resultHintLink );\n    void userChangedReceived();\n    void updateBlob( const QByteArray& username, const QByteArray& blob );\n    void getStatus();\n\nprivate:\n    void sendSettingsMessage();\n    void loadSettings();\n    void saveSettings() const;\n    void login();\n    void clearTrackLinkMap();\n    void searchAndStarrTrack(const QString& artist, const QString& track, const bool starred);\n    void gotStatus();\n    void updatePrivacy();\n\n    // Session\n    SpotifySession *m_session;\n    int m_port;\n\n    // STDin\n    QThread m_stdinThread;\n    ConsoleWatcher* m_stdinWatcher;\n\n    // Cache\n    QHash< QString, sp_link* > m_trackLinkMap;\n\n    // Http\n    QxtHttpServerConnector m_connector;\n    QxtHttpSessionManager m_httpS;\n    AudioHTTPServer* m_handler;\n\n    // Spotify\n    QByteArray m_apiKey;\n    QByteArray m_configWidget;\n    QList< QVariantMap > m_savedTracks;\n    // Callback QIDs\n    QHash< QString, QString > m_playlistToQid;\n\n    QString m_username;\n    QString m_pw;\n    QByteArray m_blob;\n\n    bool m_highQuality;\n    bool m_loggedIn;\n    bool m_ignoreNextUpdate;\n\n    QTimer* m_statusTimer;\n    bool m_foundTomahawkInstance;\n    bool m_haveSentStatus;\n    bool m_privateSession;\n};\n\nbool checkTrackIsLoaded( sp_track* track );\nQ_DECLARE_METATYPE( CacheEntry )\nQ_DECLARE_METATYPE( sp_search* )\nQ_DECLARE_METATYPE( sp_track* )\nQ_DECLARE_METATYPE( void* )\nQ_DECLARE_METATYPE( SpotifyPlaylists::LoadedPlaylist )\nQ_DECLARE_METATYPE( sp_link* )\n#endif // tomahawkspotify_H\n\n"
  },
  {
    "path": "archive/spotify/spotifysearch.cpp",
    "content": "/*\n    Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n    Copyright (c) 2011 Hugo Lindström <hugolm84@gmail.com>\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n#include \"spotifysearch.h\"\n#include \"spotifysession.h\"\n#include \"spotifyresolver.h\"\n#include \"spotifyplaylists.h\"\n#include \"PlaylistClosure.h\"\n\n#include <QDebug>\n#include <boost/bind.hpp>\nclass SpotifyPlaylists;\n/**\n  addSearchedTrack\n  callback from sp_search_create\n  will try and add track to spotify playlist passed in\n  serachData ( userdata )\n  **/\nvoid\nSpotifySearch::addSearchedTrack( sp_search *result, void *userdata)\n{\n    SpotifyPlaylists::AddTracksData *data = reinterpret_cast<SpotifyPlaylists::AddTracksData*>(userdata);\n\n    if( sp_search_num_tracks( result ) < 1 )\n    {\n        const int pos = data->searchOrder.indexOf( result );\n        qWarning() << \"Got no search result for track we tried to add! Ignoring it... index is:\" << pos;\n        data->finaltracks[ pos ] = 0;\n        data->waitingFor--;\n\n        // Send error\n        SpotifySession::getInstance()->doSendErrorMsg( QString(\"Can not add %1 to Spotify, not found in catalog.\").arg( QString::fromUtf8(sp_search_query( result ) ) ), false );\n    }\n    else\n    {\n        int cur = 0;\n        int max = sp_search_num_tracks( result );\n        while( cur < max )\n        {\n            // Find a loaded track to add to the list\n            sp_track *const tr = sp_search_track( result, cur );\n\n//             qDebug() << \"Got search result:\" << result << sp_track_name( tr ) << sp_artist_name( sp_track_artist( tr, 0 ) );\n            if( !tr ) {\n                qDebug() << \"Got an invalid search result, skipping\";\n\n                cur++;\n                continue;\n            }\n            else if ( !sp_track_is_loaded( tr ) )\n            {\n                qDebug() << \"Track in search results was not loaded!! Enqueueing to state changed callback!\";\n                QList< sp_track * > waitingForLoad = QList< sp_track* >() << tr;\n                sApp->session()->Playlists()->addStateChangedCallback( NewPlaylistClosure( boost::bind( checkTracksAreLoaded, waitingForLoad ), sApp->session()->Playlists(), SLOT( addSearchedTrack( sp_search*, void* ) ), result, userdata ) );\n                return;\n            }\n\n            const int pos = data->searchOrder.indexOf( result );\n            qDebug() << \"Adding track to playlist\" << sp_track_name( tr ) << \"at index:\" << pos;\n            data->finaltracks[ pos ] = tr;\n            data->waitingFor--;\n            break;\n        }\n    }\n\n    if ( data->waitingFor == 0 )\n    {\n        // Got all the real tracks, now add\n        qDebug() << \"All added tracks were searched for, now inserting in playlist!\";\n        QList<int> tracksInserted;\n        QList<QString> insertedIds;\n        for ( int i = 0; i < data->finaltracks.size(); i++ )\n        {\n            if ( data->finaltracks[ i ] )\n            {\n                tracksInserted << i;\n\n                sp_link* l = sp_link_create_from_track( data->finaltracks[i], 0 );\n                char urlStr[256];\n                sp_link_as_string( l, urlStr, sizeof( urlStr ) );\n                insertedIds << QString::fromUtf8( urlStr );\n                sp_link_release( l );\n            }\n        }\n\n        // Our vector may have \"holes\" in it, for any tracks that we couldn't find\n        int count = 0;\n        for ( QVector< sp_track* >::iterator iter = data->finaltracks.begin(); iter != data->finaltracks.end(); )\n        {\n            if ( !*iter )\n            {\n                qDebug() << \"Removing not-found track from results, position:\" << count;\n                iter = data->finaltracks.erase( iter );\n            } else\n                ++iter;\n            count++;\n        }\n\n        sApp->setIgnoreNextUpdate( true );\n        sp_error err = sp_playlist_add_tracks( data->playlist, data->finaltracks.constBegin(), data->finaltracks.count(), data->pos, sApp->session()->Session() );\n\n        switch( err )\n        {\n            case SP_ERROR_OK:\n                qDebug() << \"Added tracks to pos\" << data->pos;\n                break;\n            case SP_ERROR_INVALID_INDATA:\n                qDebug() << \"Invalid position\";\n                break;\n\n            case SP_ERROR_PERMISSION_DENIED:\n                qDebug() << \"Access denied\";\n                break;\n            default:\n                qDebug() << \"Other error (should not happen)\";\n                break;\n        }\n\n        sApp->sendAddTracksResult( data->plid, tracksInserted, insertedIds, err == SP_ERROR_OK );\n\n        // Only free once\n        delete data;\n    }\n}\n\n\nvoid\nSpotifySearch::searchStarredComplete(sp_search *result, void *userdata)\n{\n    StarData* data = reinterpret_cast<StarData*>( userdata );\n    if( sp_search_num_tracks( result ) > 0 )\n    {\n        QVector<sp_track*> tracks;\n        for( int i = 0; i < sp_search_num_tracks( result ); i++ )\n        {\n            sp_track* track = sp_search_track(result, i);\n            if ( !sp_track_is_loaded( track ) )\n            {\n                qDebug() << \"Track not loaded yet!\";\n            }\n            QString tArtist = QString::fromUtf8( sp_artist_name( sp_track_artist( track, 0 ) ) );\n            QString tTrack = QString::fromUtf8( sp_track_name( track ) );\n            if( tArtist == data->artist && tTrack == data->track )\n            {\n                tracks << track;\n                break;\n            }\n\n        }\n        sp_track_set_starred(SpotifySession::getInstance()->Session(), const_cast<sp_track* const*>(tracks.data()), tracks.count(), data->starred);\n    }\n}\n\n/**\n  searchComplete\n  callback from sp_search\n  @note: spotify api will never return a track that isnt available,\n         though, it can return a track thats autolinked.\n  **/\nvoid\nSpotifySearch::searchComplete( sp_search *result, void *userdata )\n{\n    UserData* data = reinterpret_cast<UserData*>( userdata );\n    //qDebug() << \"Got search result for qid:\" << data->qid;\n\n    // we return the top 50 results for searches, just top 1 for resolve\n    QVariantMap resp;\n    resp[ \"qid\" ] = data->qid;\n    resp[ \"_msgtype\" ] = \"results\";\n    QVariantList results;\n\n    // TODO search by popularity!\n    qDebug() << \"Got num results:\" << sp_search_num_tracks( result ) << \" for query \" << sp_search_query( result );\n\n    if( sp_search_num_tracks( result ) > 0 )\n    {\n        // we have a result\n        int num = qMin( sp_search_num_tracks( result ), data->fulltext ? 50 : 3 );\n        for( int i = 0; i < num; i++ )\n        {\n            // get playable track\n            // note: if track is local, its added within the lib, and is playable\n            sp_track *const tr = sp_track_get_playable( SpotifySession::getInstance()->Session(), sp_search_track( result, i ) );\n\n            if( !tr || !sp_track_is_loaded( tr ) )\n            {\n                qDebug() << \"Got still loading track, skipping\";\n                continue;\n            }\n\n            if( sp_track_get_availability( SpotifySession::getInstance()->Session(), tr) != SP_TRACK_AVAILABILITY_AVAILABLE )\n            {\n                qDebug() << \"Track isnt available for this user/region\";\n                continue;\n            }\n\n            results << data->resolver->spTrackToVariant( tr );\n            data->searchCount = 0;\n//            qDebug() << \"Found Track:\" << sp_track_name( tr ) << \"\\n\\tReporting:\" << track[\"url\"];\n        }\n\n    }else\n    {\n        QString didYouMean = QString::fromUtf8(sp_search_did_you_mean(\tresult ) );\n        QString queryString = QString::fromUtf8(sp_search_query( result ) );\n\n        if( data->searchCount < 1 )\n        {\n            if( didYouMean.isEmpty() )\n            {\n                //qDebug() << \"Tried DidYouMean, but no suggestions available for \" << queryString;\n            }\n            else\n            {\n                 qDebug() << \"Try nr.\" << data->searchCount << \" Searched for\" << queryString << \"Did you mean?\"<< didYouMean;\n#if SPOTIFY_API_VERSION >= 11\n                sp_search_create( SpotifySession::getInstance()->Session(), sp_search_did_you_mean(result), 0, data->fulltext ? 50 : 3, 0, 0, 0, 0, 0, 0, SP_SEARCH_STANDARD, &SpotifySearch::searchComplete, data );\n#else\n                sp_search_create( SpotifySession::getInstance()->Session(), sp_search_did_you_mean(result), 0, data->fulltext ? 50 : 3, 0, 0, 0, 0, &SpotifySearch::searchComplete, data );\n#endif\n            }\n            data->searchCount++;\n            return;\n        }\n        else\n            qDebug() << \"Tried to find suggestion to many times\";\n    }\n\n    resp[ \"results\" ] = results;\n    sp_search_release( result );\n    data->resolver->sendMessage( resp );\n    delete data;\n}\n\nvoid\nSpotifySearch::albumSearchComplete( sp_search *result, void *userdata )\n{\n    UserData* data = static_cast<UserData*>( userdata );\n    if ( sp_search_num_albums( result ) < 1 )\n    {\n        qDebug() << \"No album results for search:\" << QString::fromUtf8( sp_search_query( result ) );\n\n        sp_search_release( result );\n        delete data;\n        return;\n    }\n\n    sp_album* album = sp_search_album(result, 0);\n    sp_albumbrowse_create( data->resolver->session()->Session(), album, &SpotifySearch::albumBrowseLoaded, data );\n\n    sp_search_release( result );\n}\n\nvoid\nSpotifySearch::albumBrowseLoaded( sp_albumbrowse *album, void *userdata )\n{\n    UserData* data = static_cast<UserData*>( userdata );\n    Q_ASSERT( data->resolver );\n\n    if ( !sp_albumbrowse_is_loaded( album ) || sp_albumbrowse_error( album ) != SP_ERROR_OK ) {\n        qDebug() << \"Got failed to load album in albumBrowseLoaded or otherwise non-OK error state:\" << sp_albumbrowse_error( album ) << sp_album_name( sp_albumbrowse_album( album ) );\n        sp_albumbrowse_release( album );\n        delete data;\n\n        return;\n    }\n\n    const QString albumName = sp_album_name( sp_albumbrowse_album( album) );\n\n    QString artistName;\n    if (sp_artist* artist = sp_albumbrowse_artist( album ) )\n        artistName = sp_artist_name( artist );\n\n    qDebug() << \"Got successfully album  browse request for:\" << albumName << artistName;\n    bool needToWait = false;\n    QList<sp_track*> tracks;\n\n    for ( int i = 0; i < sp_albumbrowse_num_tracks( album ); i++ )\n    {\n        sp_track* track = sp_albumbrowse_track( album, i );\n        sp_track_add_ref( track );\n\n        tracks << track;\n\n        if ( !sp_track_is_loaded( track ) )\n            needToWait = true;\n    }\n\n    if ( needToWait ) {\n\n    }\n    else\n    {\n        data->resolver->sendAlbumSearchResult( data->qid, albumName, artistName, tracks );\n    }\n\n    delete data;\n    sp_albumbrowse_release( album );\n}\n"
  },
  {
    "path": "archive/spotify/spotifysearch.h",
    "content": "/*\n    Copyright (c) 2011 Leo Franchi <leo@kdab.com>\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n#ifndef SPOTIFYSEARCH_H\n#define SPOTIFYSEARCH_H\n\n#include <QObject>\n#include <libspotify/api.h>\n\nclass SpotifySearch : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit SpotifySearch(QString query, QObject *parent = 0);\n    static void SP_CALLCONV searchComplete( sp_search *result, void *userdata );\n    static void SP_CALLCONV addSearchedTrack( sp_search *result, void *userdata );\n    static void SP_CALLCONV albumSearchComplete( sp_search *result, void *userdata );\n    static void SP_CALLCONV searchStarredComplete( sp_search *result, void *userdata);\n    static void SP_CALLCONV albumBrowseLoaded( sp_albumbrowse* album, void *userdata );\nsignals:\n    \npublic slots:\n    \n};\n\n#endif // SPOTIFYSEARCH_H\n"
  },
  {
    "path": "archive/spotify/spotifysession.cpp",
    "content": "/**  This file is part of QT SpotifyWebApi - <hugolm84@gmail.com> ===\n *\n *   Copyright 2011-2012,Hugo Lindström <hugolm84@gmail.com>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n\n#include \"spotifysession.h\"\n#include \"callbacks.h\"\n\nSpotifySession* SpotifySession::s_instance = 0;\n\nSpotifySession::SpotifySession( sessionConfig config, QObject *parent )\n   : QObject( parent )\n   , m_pcLoaded( false )\n   , m_sessionConfig( config )\n   , m_loggedIn( false )\n   , m_relogin( false )\n{\n\n    // Instance\n    s_instance = this;\n    // Friends\n    m_SpotifyPlaylists = new SpotifyPlaylists( this );\n    connect( m_SpotifyPlaylists, SIGNAL( sendLoadedPlaylist( SpotifyPlaylists::LoadedPlaylist ) ), this, SLOT(playlistReceived(SpotifyPlaylists::LoadedPlaylist) ) );\n\n    m_SpotifyPlayback = new SpotifyPlayback( this );\n\n    // Connect to signals\n    connect( this, SIGNAL( notifyMainThreadSignal() ), this, SLOT( notifyMainThread() ), Qt::QueuedConnection );\n    qDebug() << \" === Using LibVersion \" << SPOTIFY_API_VERSION << \" ===\";\n    // User needs to create session himself, that way, config\n    //createSession();\n}\n/**\n  getInstance\n  used when we need to get sp_session and\n  other vital data around the app\n  **/\nSpotifySession*\nSpotifySession::getInstance()\n{\n    return s_instance;\n}\n\n/**\n  dtor\n  loggout\n  **/\nSpotifySession::~SpotifySession(){\n\n    qDebug() << \"Destroy session\";\n    logout( false ); // Make sure to not clear playlists here. ~SpotifyPlaylists() will also call clear() which will save config\n\n}\n\n/**\n * @brief SpotifySession::setProxySettings\n * @param settings\n * Url to the proxy server that should be used.\n * The format is protocol://<host>:port (where protocal is http/https/socks4/socks5)\n */\nvoid SpotifySession::setProxySettings( QVariantMap& settings )\n{\n\n    m_sessionConfig.proxyString = settings[ \"proxy\" ].toString().toUtf8();\n    m_sessionConfig.proxy_user = settings[ \"proxy_user\" ].toString().toUtf8();\n    m_sessionConfig.proxy_pass = settings[ \"proxy_pass\" ].toString().toUtf8();\n}\n\n/**\n  createSession\n  spotifyWebApi uses custom sessionConfig to\n  not mess with callbacks that are defined.\n  Initilize them as sp_config and create session\n  **/\nbool SpotifySession::createSession()\n{\n\n    m_config = sp_session_config();\n\n    if(!m_sessionConfig.application_key.isEmpty() || m_sessionConfig.g_app_key != NULL) {\n\n        m_config.api_version = SPOTIFY_API_VERSION;\n        m_config.cache_location = m_sessionConfig.cache_location;\n        m_config.settings_location = m_sessionConfig.settings_location;\n        m_config.application_key = ( m_sessionConfig.application_key.isEmpty() ? m_sessionConfig.g_app_key : m_sessionConfig.application_key);\n        m_config.application_key_size = m_sessionConfig.application_key_size;\n        m_config.user_agent = m_sessionConfig.user_agent;\n        m_config.callbacks = &SpotifyCallbacks::callbacks;\n        // Tracefiles can grow big and we dont actually use them\n        m_config.tracefile = NULL; //m_sessionConfig.tracefile;\n        m_config.device_id = m_sessionConfig.device_id;\n        m_config.compress_playlists = false;\n        m_config.dont_save_metadata_for_playlists = false;\n        m_config.initially_unload_playlists = false;\n\n        if( !m_sessionConfig.proxyString.isEmpty() )\n            m_config.proxy = m_sessionConfig.proxyString;\n        if( !m_sessionConfig.proxy_user.isEmpty() )\n            m_config.proxy_username = m_sessionConfig.proxy_user;\n        if( !m_sessionConfig.proxy_pass.isEmpty() )\n            m_config.proxy_password = m_sessionConfig.proxy_pass;\n\n\n    }\n    m_config.userdata = this;\n    sp_error err = sp_session_create( &m_config, &m_session );\n\n    if ( SP_ERROR_OK != err )\n    {\n        qDebug() << \"Failed to create spotify session: \" << sp_error_message( err );\n        return false;\n    }\n    return true;\n}\n\n/**\n  loggedin\n  callback from spotify\n  also initilizes the playlistcontainer and callbacks\n  **/\nvoid SpotifySession::loggedIn(sp_session *session, sp_error error)\n{\n   SpotifySession* _session = reinterpret_cast<SpotifySession*>(sp_session_userdata(session));\n    if (error == SP_ERROR_OK) {\n\n        qDebug() << \"Logged in successfully!!\";\n\n        _session->setSession(session);\n        _session->setLoggedIn(true);\n        _session->setPlaylistContainer( sp_session_playlistcontainer(session) );\n\n        sp_playlistcontainer_add_ref( _session->PlaylistContainer() );\n        sp_playlistcontainer_add_callbacks(_session->PlaylistContainer(), &SpotifyCallbacks::containerCallbacks, _session);\n    }\n\n    qDebug() << Q_FUNC_INFO << \"==== \" << sp_error_message( error ) << \" ====\";\n    const QString msg = QString::fromUtf8( sp_error_message( error ) );\n    emit _session->loginResponse( error == SP_ERROR_OK, msg );\n}\n\n/**\n  logout\n  if clearPlaylists, also unset all loaded playlists\n  otherwise, just remove callbacks and release\n  **/\nvoid SpotifySession::logout(bool clearPlaylists )\n{\n    if ( m_loggedIn ) {\n        if ( clearPlaylists )\n            m_SpotifyPlaylists->unsetAllLoaded();\n\n        sp_playlistcontainer_remove_callbacks( m_container, &SpotifyCallbacks::containerCallbacks, this);\n        sp_playlistcontainer_release( m_container );\n        sp_session_logout( m_session );\n    }\n\n}\n\n/**\n  relogin\n  used when forced to remove cache\n  **/\nvoid SpotifySession::relogin()\n{\n    qDebug() << Q_FUNC_INFO;\n    if( sp_session_connectionstate(m_session) != SP_CONNECTION_STATE_LOGGED_OUT || m_loggedIn)\n    {\n        qDebug() << Q_FUNC_INFO << \"SpotifySession asked to relog in! Logging out\";\n        delete m_SpotifyPlaylists;\n        m_SpotifyPlaylists = new SpotifyPlaylists( this );\n        m_relogin = true;\n        logout( true );\n        return;\n    }\n}\n\n/**\n  credentialsBlobUpdated\n  callback from login when we get the blob, used instead of plain password\n  will send blob to application to storage\n  @note its up the the application to store it\n  @note2: it will be fired more than once, always store latest blob\n  @note3: if user have no cache, it will fire once, if cache it will (maybe) update current blob\n  **/\nvoid SpotifySession::credentialsBlobUpdated(sp_session *session, const char *blob)\n{\n\n    SpotifySession* _session = reinterpret_cast<SpotifySession*>(sp_session_userdata(session));\n#if SPOTIFY_API_VERSION >= 12\n    const char* username = sp_session_user_name( session );\n#else\n    const char* username = sp_user_canonical_name( sp_session_user( session ) );\n#endif\n    _session->m_blob = QByteArray(blob);\n    qDebug() << \" ==== Got blob update for \" << QString::fromUtf8(username, strlen(username) ) << \" ==== \";\n    emit _session->blobUpdated( username, QByteArray(blob).constData() );\n}\n\n/**\n  login\n  takes username, password\n  tries to login with previous remembered user, thus, password can be empty\n  will  also try and utilize blob\n  **/\nvoid SpotifySession::login( const QString& username, const QString& password, const QByteArray& blob )\n{\n\n    if ( m_loggedIn && m_username == username && m_password == password )\n    {\n        /// Always relogin when ever credentials change\n        qDebug() << \"Asked to log in with same username and pw that we are already logged in with, ignoring login\";\n        /// Send response, and notifyAllreadyLoggedin, this will make config gui to stop \"loading\", and refetch all playlists\n        emit loginResponse( true, \"Logged in\" );\n        emit notifyAllreadyLoggedin();\n        return;\n    }\n\n\n    if( m_username != username && m_loggedIn )\n    {\n//        qDebug() << \"We were previously logged in with a different user, so notify client of difference!\";\n        emit userChanged();\n    }\n\n    m_username = username;\n    m_password = password;\n    char reloginname[256];\n    sp_error error;\n    int ok = sp_session_remembered_user( m_session, reloginname, sizeof(reloginname) );\n\n    if( ok != -1 && QString::fromUtf8( reloginname, strlen(reloginname) ) == m_username.toUtf8() )\n    {\n        if ( sp_session_relogin(m_session) == SP_ERROR_NO_CREDENTIALS)\n        {\n            qDebug() << \"No stored credentials tryin blob\";\n        }\n        else\n        {\n            qDebug() << \"Logging in as remembered user\";\n            return;\n        }\n    }\n    else\n    {\n        // Forget last user\n        if( ok == -1 )\n            qDebug() << \" Relogin username was truncated or an error occured... Logging in with credentials\";\n        else\n            qDebug() << \"Forgetting last user!\" << QString::fromUtf8( reloginname, strlen( reloginname ) ) << m_username;\n\n        sp_session_forget_me(m_session);\n    }\n\n    if( !m_username.isEmpty() && ( !m_password.isEmpty() || !blob.isEmpty() )  )\n    {\n        /// @note:  If current state is not logged out, logout this session\n        ///         and relogin in callback\n        /// @note2: We can be logged out, but the session is still connected to accesspoint\n        ///         Wait for that to.\n        if( sp_session_connectionstate(m_session) != SP_CONNECTION_STATE_LOGGED_OUT || m_loggedIn)\n        {\n            qDebug() << Q_FUNC_INFO << \"SpotifySession asked to relog in! Logging out\";\n            m_relogin = true;\n            m_blob = blob;\n            logout( true );\n            return;\n        }\n\n        qDebug() << Q_FUNC_INFO << \"Logging in with username:\" << m_username << \" and is \" << ( blob.isEmpty() ? \"not\" : \"\" ) << \"using blob\";\n#if SPOTIFY_API_VERSION >= 12\n        error = sp_session_login(m_session, m_username.toUtf8(), m_password.toUtf8(), 1, blob.isEmpty() ? NULL : blob.constData()  );\n        if( error != SP_ERROR_OK )\n            emit loginResponse( false, sp_error_message( error ) );\n#elif SPOTIFY_API_VERSION >= 11\n        sp_session_login(m_session, m_username.toUtf8(), m_password.toUtf8(), 1, blob.isEmpty() ? NULL : blob.constData() );\n#else\n        sp_session_login(m_session, m_username.toUtf8(), m_password.toUtf8(), 1);\n#endif\n\n\n    }\n    else\n    {\n        qDebug() << \"No username, password or blob provided!\";\n        /// TODO: need a way to prompt for password if fail to login as remebered on startup\n        /// If auth widget is not visual, we should promt user for re-entering creds\n        emit loginResponse( false, \"Failed to authenticate credentials.\" );\n    }\n\n\n}\n\n/**\n  slot\n  playlistRecieved\n  will recieve playlists froms signal,\n  will emit only if playlist has syncflag as true\n  **/\nvoid\nSpotifySession::playlistReceived( const SpotifyPlaylists::LoadedPlaylist& playlist)\n{\n    if( playlist.isLoaded && playlist.sync_ )\n    {\n//        qDebug() << \"Received sync: \" << playlist.id_ << sp_playlist_name( playlist.playlist_);\n        emit notifySyncUpdateSignal( playlist );\n    }\n}\n\n/**\n  loggedout\n  callback\n  will relogin if true\n  **/\nvoid SpotifySession::loggedOut(sp_session *session)\n{\n    SpotifySession* _session = reinterpret_cast<SpotifySession*>(sp_session_userdata(session));\n    _session->setLoggedIn( false );\n    qDebug() << \"Logging out\";\n\n    /// @note: This will login the user after previous user\n    ///        was properly logged out.\n    if(_session->m_relogin)\n    {\n        _session->m_relogin = false;\n        _session->login( _session->m_username, _session->m_password, _session->m_blob.constData() );\n    }\n\n\n}\n/**\n  connectionError\n  callback when we cant connect\n  **/\nvoid SpotifySession::connectionError(sp_session *session, sp_error error)\n{\n    Q_UNUSED(session);\n    qDebug() << \"Connection error: \" << QString::fromUtf8(sp_error_message(error));\n\n}\n/**\n  notifyMainThread\n  callback from the lib\n  **/\nvoid SpotifySession::notifyMainThread(sp_session *session)\n{\n    SpotifySession* _session = reinterpret_cast<SpotifySession*>(sp_session_userdata(session));\n    _session->sendNotifyThreadSignal();\n}\n/**\n  logMessage\n  callback, if logging is enabled\n  **/\nvoid SpotifySession::logMessage(sp_session *session, const char *data)\n{\n    Q_UNUSED(session);\n    qDebug() << \"SpotifyLog: \" << QString::fromUtf8(data);\n}\n\n/**\n  sendNotifyThreadSignal\n  **/\nvoid SpotifySession::sendNotifyThreadSignal()\n{\n    emit notifyMainThreadSignal();\n}\n\n/**\n  notifyMainThread\n  this will be called when spotify needs to process events\n  **/\nvoid SpotifySession::notifyMainThread()\n{\n    int timeout = 0;\n    do {\n        sp_session_process_events( m_session, &timeout );\n    } while( !timeout );\n\n    QTimer::singleShot( timeout, this, SLOT( notifyMainThread() ) );\n}\n\n"
  },
  {
    "path": "archive/spotify/spotifysession.h",
    "content": "/**  This file is part of QT SpotifyWebApi - <hugolm84@gmail.com> ===\n *\n *   Copyright 2011-2012,Hugo Lindström <hugolm84@gmail.com>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n\n#ifndef SPOTIFYSESSION_H\n#define SPOTIFYSESSION_H\n\n#include <QObject>\n#include <QCoreApplication>\n#include <QDebug>\n#include <QThread>\n#include <QTimer>\n#include <QString>\n#include <QThread>\n#include <QVariantMap>\n#include <libspotify/api.h>\n#include \"spotifyplayback.h\"\n#include \"spotifyplaylists.h\"\n\n/**\n    sessionConfig\n        This is used to be passed to SpotifySession, as a substitute to sp_session_config\n        It will set the config for the session\n        If you first set sp_session_config and pass it to this\n        it will not work as intended with callbacks.\n**/\ntypedef struct\n{\n    QByteArray cache_location;\n    QByteArray settings_location;\n    QByteArray user_agent;\n    QByteArray tracefile;\n    QByteArray device_id;\n    QByteArray application_key;\n    QByteArray proxyString;\n    QByteArray proxy_pass;\n    QByteArray proxy_user;\n    // Use if your appkey isnt encrypted\n    const void *g_app_key;\n    size_t application_key_size;\n\n\n} sessionConfig;\n\nclass SpotifySession : public QObject\n{\n    Q_OBJECT\npublic:\n\n    explicit SpotifySession( sessionConfig config, QObject *parent = 0 );\n    virtual ~SpotifySession();\n    static SpotifySession* getInstance();\n\n    // Mainthread\n    void sendNotifyThreadSignal();\n\n    // Session functions\n    void setSession(sp_session* session){ m_session = session; }\n    sp_session* Session() const { return m_session; }\n    sp_session_config getSessionConfig() { return m_config; }\n    bool createSession();\n    void setProxySettings( QVariantMap& settings );\n    //  Login\n    void setLoggedIn( bool loggedIn ){ m_loggedIn = loggedIn; }\n    bool isLoggedIn(){ return m_loggedIn;}\n    void login( const QString& username, const QString& password, const QByteArray &blob = NULL );\n    void logout( bool clearPlaylists );\n\n    // Playlists\n    void setPlaylistContainer( sp_playlistcontainer *pc){ m_container = pc; }\n    void setPlaylistContainerLoaded( bool loaded ){ m_pcLoaded = loaded; }\n    bool isPlaylistContainerLoaded() const { return m_pcLoaded; }\n    sp_playlistcontainer* PlaylistContainer() const { return m_container; }\n    SpotifyPlaylists* Playlists() { return m_SpotifyPlaylists; }\n\n    // Playback\n    SpotifyPlayback* Playback() { return m_SpotifyPlayback; }\n\n    // Spotify session callbacks.\n    static void SP_CALLCONV loggedIn(sp_session *session, sp_error error);\n    static void SP_CALLCONV loggedOut(sp_session *session);\n    static void SP_CALLCONV connectionError(sp_session *session, sp_error error);\n    static void SP_CALLCONV notifyMainThread(sp_session *session);\n    static void SP_CALLCONV logMessage(sp_session *session, const char *data);\n    static void SP_CALLCONV credentialsBlobUpdated(sp_session *session, const char *blob);\n\n    // Error\n    void doSendErrorMsg( const QString &msg, bool isDebug){ emit sendErrorMsg( msg, isDebug); }\n    bool m_relogin;\nsignals:\n    void notifyMainThreadSignal();\n    void loginResponse( bool success, const QString& response );\n    void notifySyncUpdateSignal( const SpotifyPlaylists::LoadedPlaylist& playlist );\n    void sendErrorMsg( sp_error );\n    void sendErrorMsg( const QString &msg, bool isDebug );\n    void userChanged();\n    void blobUpdated( const QByteArray& username, const QByteArray& blob);\n    void notifyAllreadyLoggedin();\n\npublic slots:\n    void playlistReceived( const SpotifyPlaylists::LoadedPlaylist& playlist);\n\nprivate slots:\n    void notifyMainThread();\n    void relogin();\nprivate:\n\n    // When username changed, clear old users data\n    void clearOldUserdata();\n\n    // Mixed\n    static SpotifySession* s_instance;\n    SpotifyPlaylists *m_SpotifyPlaylists;\n    SpotifyPlayback *m_SpotifyPlayback;\n    sp_playlistcontainer *m_container;\n    bool m_pcLoaded;\n    sessionConfig m_sessionConfig;\n\n    // Session\n    sp_session_config m_config;\n    sp_session *m_session;\n    bool m_loggedIn;\n\n    // Login\n    QString m_username;\n    QString m_password;\n    QByteArray m_blob;\n    QString qid;\n\n\n\n};\n\n#endif // SPOTIFYSESSION_H\n"
  },
  {
    "path": "archive/spotify/tomahawkspotify.kdev4",
    "content": "[Project]\nName=tomahawkspotify\nManager=KDevCMakeManager\nVersionControl=\n"
  },
  {
    "path": "authproxy/app.yaml",
    "content": "application: tomahawk-beatslogin\nversion: 1\nruntime: go\napi_version: go1\n\nhandlers:\n- url: /\n  static_files: index.html\n  upload: index\\.html\n\n- url: /json\n  script: _go_app\n\n- url: /spotify\n  script: _go_app\n"
  },
  {
    "path": "authproxy/authproxy.go",
    "content": "package authproxy\n\nimport (\n    \"net/http\"\n)\n\nfunc init() {\n    http.HandleFunc(\"/json\", jsonHandler)\n    http.HandleFunc(\"/spotify\", spotifyHandler)\n}\n\n\nfunc jsonHandler(w http.ResponseWriter, r *http.Request) {\n    w.Header().Set(\"Content-Type\", \"application/json\")\n    w.Header().Set(\"Access-Control-Allow-Origin\", \"*\")\n    w.Write([]byte(\"{ \\\"access_token\\\": \\\"\" + r.FormValue(\"access_token\") + \"\\\" }\"))\n}\n\nfunc spotifyHandler(w http.ResponseWriter, r *http.Request) {\n    w.Header().Set(\"Content-Type\", \"application/json\")\n    w.Header().Set(\"Access-Control-Allow-Origin\", \"*\")\n    w.Write([]byte(\"{ \\\"code\\\": \\\"\" + r.FormValue(\"code\") + \"\\\" }\"))\n}\n"
  },
  {
    "path": "authproxy/index.html",
    "content": ""
  },
  {
    "path": "bandcamp/README.md",
    "content": "bandcamp-resolver\n===================\n\nTomahawk resolver for Bandcamp\n"
  },
  {
    "path": "bandcamp/content/contents/code/bandcamp.js",
    "content": "/*\n * Copyright (C) 2012-2015 Thierry Göckel <thierry@strayrayday.lu>\n * Copyright (C) 2012 Leo Franchi <lfranchi@kde.org>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n * NOTICE: This resolver and its intent, is for demonstrational purposes only\n **/\nvar BandcampResolver = Tomahawk.extend(TomahawkResolver, {\n    wand: \"inganwbxhyy\",\n\n    settings: {\n        name: 'Bandcamp',\n        weight: 90,\n        icon: 'bandcamp-icon.png',\n        timeout: 10\n    },\n\n    spell: function(a){\"use strict\";var magic=function(b){return(b=(b)?b:this).split(\"\").map(function(d){if(!d.match(/[A-Za-z]/)){return d;}var c=d.charCodeAt(0)>=96;var k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64));}).join(\"\");};return magic(a);},                                       \n\n    init: function (callback) {\n        \"use strict\";\n\n        this.secret = this.spell(this.wand);\n\n\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n        if (callback) {\n            callback(null);\n        }\n    },\n\n    resolve: function (qid, artist, album, title) {\n        \"use strict\";\n\n        var findArtistUrl = \"http://api.bandcamp.com/api/band/3/search?key=\" + this.secret + \"&name=\" + encodeURIComponent(artist);\n        var empty = {\n            qid: qid,\n            results: []\n        };\n        var that = this;\n        Tomahawk.asyncRequest(findArtistUrl, function (xhr) {\n            var response = JSON.parse(xhr.responseText);\n            if (response.hasOwnProperty(\"results\") && response.results.length !== 0) {\n                var bandcampArtistId = response.results[0].band_id;\n                var artistDiscographyUrl = \"http://api.bandcamp.com/api/band/3/discography?key=\" + that.secret + \"&band_id=\" + bandcampArtistId;\n                Tomahawk.asyncRequest(artistDiscographyUrl, function (xhr1) {\n                    var response1 = JSON.parse(xhr1.responseText);\n                    var results = [];\n                    if (response1.hasOwnProperty(\"discography\") && response1.discography.length !== 0) {\n                        var result = {};\n                        for (var i = 0; i < response1.discography.length; i++) {\n                            if (response1.discography[i].track_id && response1.discography[i].title.toLowerCase() === title.toLowerCase() && response1.discography[i].streaming_url) {\n                                result.url = response1.discography[i].streaming_url;\n                                result.artist = artist;\n                                result.album = response1.title;\n                                result.track = response1.discography[i].title;\n                                result.bitrate = 128;\n                                result.duration = response1.discography[i].duration;\n                                result.score = 1;\n                                result.mimetype = \"audio/mpeg\";\n                                result.source = that.settings.name;\n                                result.checked = true;\n                                result.year = new Date(response1.release_date * 1000).getFullYear();\n                                if (response1.discography[i].hasOwnProperty(\"url\")){\n                                    result.linkUrl = response1.discography[i].url;\n                                }\n                                results.push(result);\n                            }\n                        }\n                        if (results.length !== 0) {\n                            var toReturn = {\n                                qid: qid,\n                                results: results\n                            };\n                            Tomahawk.addTrackResults(toReturn);\n                        } else {\n                            var pendingJobs = response1.discography.length;\n                            // We want to send only 1 addTrackResults call, at the end. But we have to fetch\n                            // each album list individually and check if our track is in there.\n                            var decrementAndSend = function () {\n                                pendingJobs = pendingJobs - 1;\n                                if (pendingJobs >= 0 && results.length > 0) {\n                                    Tomahawk.addTrackResults({\n                                        qid: qid,\n                                        results: [results[0]]\n                                    });\n                                    pendingJobs = -1; // Don't send again\n                                } else if (pendingJobs === 0) {\n                                    Tomahawk.addTrackResults(empty);\n                                }\n                            };\n                            for (var j = 0; j < response1.discography.length; j++) {\n                                if (!response1.discography[j].album_id) {\n                                    decrementAndSend();\n                                    continue;\n                                } else {\n                                    var bandcampAlbumId = response1.discography[j].album_id;\n                                    var albumInfoUrl = \"http://api.bandcamp.com/api/album/2/info?key=\" + that.secret + \"&album_id=\" + bandcampAlbumId;\n                                    Tomahawk.asyncRequest(albumInfoUrl, function (xhr2) {\n                                        var response2 = JSON.parse(xhr2.responseText);\n                                        var albumUrl = response2.url;\n                                        var albumBaseUrl = that.getArtistPageBase(albumUrl);\n                                        if (response2.tracks.length !== 0) {\n                                            var normalisedTrackName = title.toLowerCase().replace(/[\\.,-\\/#!$%\\^&\\*;:{}=\\-_`~()]/g,\"\").replace(/\\s{2,}/g,\" \");\n                                            for (var k = 0; k < response2.tracks.length; k++) {\n                                                var normalisedReturnedTrackName = response2.tracks[k].title.toLowerCase().replace(/[\\.,-\\/#!$%\\^&\\*;:{}=\\-_`~()]/g,\"\").replace(/\\s{2,}/g,\" \");\n                                                if ((response2.tracks[k].title.toLowerCase() === title.toLowerCase() || (normalisedReturnedTrackName === normalisedTrackName && album === response2.title)) &&\n                                                    response2.tracks[k].streaming_url) {\n                                                    result.url = response2.tracks[k].streaming_url;\n                                                    result.artist = artist;\n                                                    result.album = response2.title;\n                                                    result.track = response2.tracks[k].title;\n                                                    result.bitrate = 128;\n                                                    result.duration = response2.tracks[k].duration;\n                                                    result.score = 1;\n                                                    result.mimetype = \"audio/mpeg\";\n                                                    result.source = that.settings.name;\n                                                    result.checked = true;\n                                                    result.year = new Date(response2.release_date * 1000).getFullYear();\n                                                    if (response2.tracks[k].url){\n                                                        result.linkUrl = albumBaseUrl + response2.tracks[k].url;\n                                                    }\n                                                    else {\n                                                        result.linkUrl = albumUrl;\n                                                    }\n                                                    results.push(result);\n                                                }\n                                            }\n                                        }\n                                        decrementAndSend();\n                                    });\n                                }\n                            }\n                        }\n                    } else {\n                        Tomahawk.addTrackResults(empty);\n                    }\n                });\n            } else {\n                Tomahawk.addTrackResults(empty);\n            }\n        });\n    },\n\n    canParseUrl: function (url, type) {\n        \"use strict\";\n\t// This excludes bandcamp pages with a custom (non .bandcamp.com) URL\n        if (!(/https?:\\/\\/(?!-)[A-Za-z0-9-]{1,62}[A-Za-z0-9]\\.bandcamp.com\\//).test(url)){\n\t    return false;\n        }\n\n        switch (type) {\n            case TomahawkUrlType.Album: //Don't rely on Tomahawk's InfoPlugins for Bandcamp's mostly rather unknown bands & albums\n                return false; // Albums are opened as playlists instead\n            case TomahawkUrlType.Artist:\n                return true;\n            case TomahawkUrlType.Playlist:\n                return true;\n            case TomahawkUrlType.Track:\n                return true;\n            default:\n                return true;\n        }\n    },\n\n    track2Result: function (track) {\n        \"use strict\";\n        var result = {\n            type: \"track\",\n            title: track.title\n        };\n        if (track.hasOwnProperty(\"streaming_url\")){\n            result.hint = track.streaming_url;\n        }\n        return result;\n    },\n\n    lookupUrl: function (url) {\n        \"use strict\";\n        var query = \"http://api.bandcamp.com/api/url/1/info?key=\" + this.secret + \"&url=\" + url;\n        var result = {};\n        var that = this;\n        Tomahawk.asyncRequest(query, function (xhr) {\n            var response = JSON.parse(xhr.responseText);\n            if (response.hasOwnProperty(\"band_id\")){\n                if (response.hasOwnProperty(\"track_id\")){\n                    result.type = \"track\";\n                    query = \"http://api.bandcamp.com/api/track/3/info?key=\" + that.secret + \"&track_id=\" + response.track_id;\n                }\n                else if (response.hasOwnProperty(\"album_id\")){\n                    result.type = \"playlist\";\n                    result.guid = \"bandcamp-album-playlist-\" + response.album_id;\n                    query = \"http://api.bandcamp.com/api/album/2/info?key=\" + that.secret + \"&album_id=\" + response.album_id;\n                }\n                else {\n                    result.type = \"artist\";\n                    query = \"http://api.bandcamp.com/api/band/3/discography?key=\" + that.secret + \"&band_id=\" + response.band_id;\n                }\n                Tomahawk.asyncRequest(query, function (xhr2) {\n                    var response2 = JSON.parse(xhr2.responseText);\n                    if (result.type === \"track\" && response2.hasOwnProperty(\"title\")){\n                        result = that.track2Result(response2);\n                        if (response2.hasOwnProperty(\"artist\")){\n                            result.artist = response2.artist;\n                        }\n                    } else if (result.type === \"playlist\" && response2.hasOwnProperty(\"tracks\")){\n                        if (response2.hasOwnProperty(\"artist\")){\n                            result.title = \"\\\"\" + response2.title + \"\\\" by \\\"\" + response2.artist + \"\\\"\";\n                            result.artist = response2.artist;\n                        } else {\n                            result.title = response2.title;\n                        }\n                        if (response2.hasOwnProperty(\"about\")){\n                            result.description = response2.about;\n                        }\n                        result.tracks = [];\n                        response2.tracks.forEach(function (track){\n                            track = that.track2Result(track);\n                            if (response2.hasOwnProperty(\"artist\")){\n                                track.artist = response2.artist;\n                            }\n                            result.tracks.push(track);\n                        });\n                    } else if (result.type !== \"artist\"){\n                        Tomahawk.addUrlResult(url, {});\n                        return;\n                    }\n                    if (!result.hasOwnProperty(\"artist\")){\n                        query = \"http://api.bandcamp.com/api/band/3/info?key=\" + that.secret + \"&band_id=\" + response.band_id;\n                        Tomahawk.asyncRequest(query, function (xhr3) {\n                            var response3 = JSON.parse(xhr3.responseText);\n                            if (response3.hasOwnProperty(\"name\")){\n                                if (result.type === \"playlist\"){\n                                    result.artist = response3.name;\n                                    result.title = \"\\\"\" + result.title + \"\\\" by \\\"\" + result.artist + \"\\\"\";\n                                    if (result.hasOwnProperty(\"tracks\")){\n                                        for (var i = 0; i < result.tracks.length; i++){\n                                            result.tracks[i].artist = result.artist;\n                                        }\n                                    }\n                                } else if (result.type === \"artist\"){\n                                    result.name = response3.name;\n                                } else {\n                                    result.artist = response3.name;\n                                }\n                                Tomahawk.addUrlResult(url, result);\n                            } else {\n                                Tomahawk.addUrlResult(url, {});\n                            }\n                        });\n                    } else {\n                        Tomahawk.addUrlResult(url, result);\n                    }\n                });\n            } else {\n                Tomahawk.addUrlResult(url, {});\n            }   \n        });\n    },\n\n    search: function (qid, searchString) {\n        \"use strict\";\n\n        var empty = {\n            qid: qid,\n            results: []\n        };\n        Tomahawk.addTrackResults(empty);\n    },\n\n    getArtistPageBase: function (fullUrl) {\n        \"use strict\";\n\n        var baseUrl = \"\";\n        if (fullUrl.indexOf(\".bandcamp.com\") === -1 && fullUrl.indexOf(\"/album/\") !== -1){\n            baseUrl = fullUrl.substring(0, fullUrl.indexOf(\"/album/\"));\n        }\n        else {\n            baseUrl = fullUrl.slice(0, fullUrl.indexOf(\".bandcamp.com\") + 13);\n        }\n        return baseUrl;\n    }\n});\n\nTomahawk.resolver.instance = BandcampResolver;\n"
  },
  {
    "path": "bandcamp/content/metadata.json",
    "content": "{\n    \"name\": \"Bandcamp\",\n    \"pluginName\": \"bandcamp\",\n    \"author\": \"Thierry Göckel\",\n    \"email\": \"thierry@strayrayday.lu\",\n    \"version\": \"0.2.2\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Stream music from Bandcamp.\",\n    \"platform\": \"any\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/bandcamp.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"resources\": [\n            \"contents/code/bandcamp-icon.png\"\n        ]\n    }\n}\n"
  },
  {
    "path": "bandcampmobile/content/contents/code/bandcampm.js",
    "content": "/* http://bandcamp.com resolver for Tomahawk.\n * This one use API used by Bandcamp's Android App\n * Written in 2015 by Anton Romanov\n * Licensed under the Eiffel Forum License 2.\n */\n\nvar BandcampResolver = Tomahawk.extend( Tomahawk.Resolver, {\n    apiVersion: 0.9,\n\n    settings: {\n        cacheTime: 300,\n        name: 'bandcampm',\n        weight: 90,\n        icon: '../images/icon.png',\n        timeout: 15\n    },\n\n    _convertTrack: function (entry) {\n        if (entry.track_id) {\n            entry.id = entry.track_id;\n        }\n        if (entry.title) {\n            entry.name = entry.title;\n        }\n        var track =  {\n            artist:     entry.band_name,\n            album:      entry.album_name,\n            track:      entry.name,\n            title:      entry.name,\n            hint:        'bandcampm://track/' + entry.band_id + '/' + entry.id,\n            bitrate:    128,\n            checked:    true,\n            type:       \"track\"\n        };\n        if (entry.streaming_url && entry.streaming_url['mp3-128']) {\n            track.url = entry.streaming_url['mp3-128'];\n        }\n        if (entry.duration) {\n            track.duration = parseInt(entry.duration);//Its actually a float but we don't need fractions of seconds\n        }\n        return track;\n    },\n\n    _getEditDistance : function(a, b){\n        if(a.length == 0) return b.length;\n        if(b.length == 0) return a.length;\n\n        var matrix = [];\n\n        // increment along the first column of each row\n        var i;\n        for(i = 0; i <= b.length; i++){\n            matrix[i] = [i];\n        }\n\n        // increment each column in the first row\n        var j;\n        for(j = 0; j <= a.length; j++){\n            matrix[0][j] = j;\n        }\n\n        // Fill in the rest of the matrix\n        for(i = 1; i <= b.length; i++){\n            for(j = 1; j <= a.length; j++){\n                if(b.charAt(i-1) == a.charAt(j-1)){\n                    matrix[i][j] = matrix[i-1][j-1];\n                } else {\n                    matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution\n                            Math.min(matrix[i][j-1] + 1, // insertion\n                                matrix[i-1][j] + 1)); // deletion\n                }\n            }\n        }\n\n        return matrix[b.length][a.length];\n    },\n\n    getStreamUrl: function(params) {\n        if (params.url.indexOf('http') == 0)\n        {\n            return {url:params.url};\n        }\n        var that = this;\n        var parsed = params.url.match(/^bandcampm:\\/\\/([a-z]+)\\/(\\d+)\\/(\\d+)$/);\n        var band_id = parsed[2];\n        var id      = parsed[3];\n        var queryParams = {\n            tralbum_type : 't',\n            band_id : band_id,\n            tralbum_id : id\n        };\n        return Tomahawk.get('https://bandcamp.com/api/mobile/15/tralbum_details',\n                {data: queryParams}).then(function(result){\n            var url = result.tracks[0].streaming_url['mp3-128'];\n            return {url:url};\n        });\n    },\n\n    search: function (params) {\n        var that = this;\n\n        if (!params.album) {\n            return Tomahawk.get('https://bandcamp.com/api/nusearch/2/autocomplete?q=' + params.query).then(function(result){\n                var trackPromises = result.results.filter(function(e) {\n                    return e.type == 't'; //t stands for track, b - band, a - album\n                }).map(that._convertTrack, that).sort(function(b,a) {\n                    if (!params.artist)\n                        return 0;\n                    return that._getEditDistance(params.artist, b.artist) - that._getEditDistance(params.artist, a.artist);\n                }).splice(0,3).map(function(track){\n                    //We don't know if track streamable during search, we limit to\n                    //3 top results as otherwise we'll start getting 503s\n                    var parsed = track.hint.match(/^bandcampm:\\/\\/([a-z]+)\\/(\\d+)\\/(\\d+)$/);\n                    var band_id = parsed[2];\n                    var id      = parsed[3];\n                    return Tomahawk.get('https://bandcamp.com/api/mobile/15/tralbum_details?tralbum_type=t&band_id='+band_id+'&tralbum_id='+id).then(function(result){\n                        if(result.tracks.length > 0) {\n                            track.url = result.tracks[0].streaming_url['mp3-128'];\n                            track.duration = parseInt(result.tracks[0].duration);//Its actually a float but we don't need fractions of seconds\n                        }\n                        return track;\n                    });\n                });\n                return RSVP.Promise.all(trackPromises);\n            });\n        } else {\n            // More reliable to search by album\n            var album = params.album.replace(/,/g, '%2c');\n            return Tomahawk.get('https://bandcamp.com/api/nusearch/2/autocomplete?q=' + album).then(function(result){\n                var trackPromises = result.results.filter(function(e) {\n                    return e.type == 'a'; //t stands for track, b - band, a - album\n                }).splice(0,1).map(function(album){\n                    //We don't know if album streamable during search, we limit to\n                    //1 top result as otherwise we'll start getting 503s\n                    var band_id = album.band_id;\n                    var id      = album.id;\n                    return Tomahawk.get('https://bandcamp.com/api/mobile/15/tralbum_details?tralbum_type=a&band_id='+band_id+'&tralbum_id='+id).then(function(result){\n                        return result.tracks.map(function (track) {\n                            track.album_name = result.title;\n                            return track;\n                        }).map(that._convertTrack, that);\n                    });\n                });\n                return RSVP.Promise.all(trackPromises).then(function(results) {\n                    return [].concat.apply([],results);\n                });\n            });\n        }\n    },\n\n    resolve: function (params) {\n        var query = params.track;//search we're using searches matches in a single field\n        return this.search({query:query, album: params.album, artist: params.artist});\n    }\n});\n\nTomahawk.resolver.instance = BandcampResolver;\n"
  },
  {
    "path": "bandcampmobile/content/metadata.json",
    "content": "{\n    \"name\": \"Bandcamp (Mobile API)\",\n    \"pluginName\": \"bandcampmobile\",\n    \"author\": \"Anton Romanov\",\n    \"email\": \"theli.ua@gmail.com\",\n    \"version\": \"0.0.4\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Resolves to free to preview 128k streams from Bandcamp.(using mobile api)\",\n    \"platform\": \"any\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/bandcampm.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"resources\": []\n    }\n}\n"
  },
  {
    "path": "beatsmusic/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Uwe L. Korn\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "beatsmusic/content/contents/code/async.js",
    "content": "/*global setImmediate: false, setTimeout: false, console: false */\n(function () {\n\n    var async = {};\n\n    // global on the server, window in the browser\n    var root, previous_async;\n\n    root = this;\n    if (root != null) {\n      previous_async = root.async;\n    }\n\n    async.noConflict = function () {\n        root.async = previous_async;\n        return async;\n    };\n\n    function only_once(fn) {\n        var called = false;\n        return function() {\n            if (called) throw new Error(\"Callback was already called.\");\n            called = true;\n            fn.apply(root, arguments);\n        }\n    }\n\n    //// cross-browser compatiblity functions ////\n\n    var _each = function (arr, iterator) {\n        if (arr.forEach) {\n            return arr.forEach(iterator);\n        }\n        for (var i = 0; i < arr.length; i += 1) {\n            iterator(arr[i], i, arr);\n        }\n    };\n\n    var _map = function (arr, iterator) {\n        if (arr.map) {\n            return arr.map(iterator);\n        }\n        var results = [];\n        _each(arr, function (x, i, a) {\n            results.push(iterator(x, i, a));\n        });\n        return results;\n    };\n\n    var _reduce = function (arr, iterator, memo) {\n        if (arr.reduce) {\n            return arr.reduce(iterator, memo);\n        }\n        _each(arr, function (x, i, a) {\n            memo = iterator(memo, x, i, a);\n        });\n        return memo;\n    };\n\n    var _keys = function (obj) {\n        if (Object.keys) {\n            return Object.keys(obj);\n        }\n        var keys = [];\n        for (var k in obj) {\n            if (obj.hasOwnProperty(k)) {\n                keys.push(k);\n            }\n        }\n        return keys;\n    };\n\n    //// exported async module functions ////\n\n    //// nextTick implementation with browser-compatible fallback ////\n    if (typeof process === 'undefined' || !(process.nextTick)) {\n        if (typeof setImmediate === 'function') {\n            async.nextTick = function (fn) {\n                // not a direct alias for IE10 compatibility\n                setImmediate(fn);\n            };\n            async.setImmediate = async.nextTick;\n        }\n        else {\n            async.nextTick = function (fn) {\n                setTimeout(fn, 0);\n            };\n            async.setImmediate = async.nextTick;\n        }\n    }\n    else {\n        async.nextTick = process.nextTick;\n        if (typeof setImmediate !== 'undefined') {\n            async.setImmediate = function (fn) {\n              // not a direct alias for IE10 compatibility\n              setImmediate(fn);\n            };\n        }\n        else {\n            async.setImmediate = async.nextTick;\n        }\n    }\n\n    async.each = function (arr, iterator, callback) {\n        callback = callback || function () {};\n        if (!arr.length) {\n            return callback();\n        }\n        var completed = 0;\n        _each(arr, function (x) {\n            iterator(x, only_once(function (err) {\n                if (err) {\n                    callback(err);\n                    callback = function () {};\n                }\n                else {\n                    completed += 1;\n                    if (completed >= arr.length) {\n                        callback(null);\n                    }\n                }\n            }));\n        });\n    };\n    async.forEach = async.each;\n\n    async.eachSeries = function (arr, iterator, callback) {\n        callback = callback || function () {};\n        if (!arr.length) {\n            return callback();\n        }\n        var completed = 0;\n        var iterate = function () {\n            iterator(arr[completed], function (err) {\n                if (err) {\n                    callback(err);\n                    callback = function () {};\n                }\n                else {\n                    completed += 1;\n                    if (completed >= arr.length) {\n                        callback(null);\n                    }\n                    else {\n                        iterate();\n                    }\n                }\n            });\n        };\n        iterate();\n    };\n    async.forEachSeries = async.eachSeries;\n\n    async.eachLimit = function (arr, limit, iterator, callback) {\n        var fn = _eachLimit(limit);\n        fn.apply(null, [arr, iterator, callback]);\n    };\n    async.forEachLimit = async.eachLimit;\n\n    var _eachLimit = function (limit) {\n\n        return function (arr, iterator, callback) {\n            callback = callback || function () {};\n            if (!arr.length || limit <= 0) {\n                return callback();\n            }\n            var completed = 0;\n            var started = 0;\n            var running = 0;\n\n            (function replenish () {\n                if (completed >= arr.length) {\n                    return callback();\n                }\n\n                while (running < limit && started < arr.length) {\n                    started += 1;\n                    running += 1;\n                    iterator(arr[started - 1], function (err) {\n                        if (err) {\n                            callback(err);\n                            callback = function () {};\n                        }\n                        else {\n                            completed += 1;\n                            running -= 1;\n                            if (completed >= arr.length) {\n                                callback();\n                            }\n                            else {\n                                replenish();\n                            }\n                        }\n                    });\n                }\n            })();\n        };\n    };\n\n\n    var doParallel = function (fn) {\n        return function () {\n            var args = Array.prototype.slice.call(arguments);\n            return fn.apply(null, [async.each].concat(args));\n        };\n    };\n    var doParallelLimit = function(limit, fn) {\n        return function () {\n            var args = Array.prototype.slice.call(arguments);\n            return fn.apply(null, [_eachLimit(limit)].concat(args));\n        };\n    };\n    var doSeries = function (fn) {\n        return function () {\n            var args = Array.prototype.slice.call(arguments);\n            return fn.apply(null, [async.eachSeries].concat(args));\n        };\n    };\n\n\n    var _asyncMap = function (eachfn, arr, iterator, callback) {\n        var results = [];\n        arr = _map(arr, function (x, i) {\n            return {index: i, value: x};\n        });\n        eachfn(arr, function (x, callback) {\n            iterator(x.value, function (err, v) {\n                results[x.index] = v;\n                callback(err);\n            });\n        }, function (err) {\n            callback(err, results);\n        });\n    };\n    async.map = doParallel(_asyncMap);\n    async.mapSeries = doSeries(_asyncMap);\n    async.mapLimit = function (arr, limit, iterator, callback) {\n        return _mapLimit(limit)(arr, iterator, callback);\n    };\n\n    var _mapLimit = function(limit) {\n        return doParallelLimit(limit, _asyncMap);\n    };\n\n    // reduce only has a series version, as doing reduce in parallel won't\n    // work in many situations.\n    async.reduce = function (arr, memo, iterator, callback) {\n        async.eachSeries(arr, function (x, callback) {\n            iterator(memo, x, function (err, v) {\n                memo = v;\n                callback(err);\n            });\n        }, function (err) {\n            callback(err, memo);\n        });\n    };\n    // inject alias\n    async.inject = async.reduce;\n    // foldl alias\n    async.foldl = async.reduce;\n\n    async.reduceRight = function (arr, memo, iterator, callback) {\n        var reversed = _map(arr, function (x) {\n            return x;\n        }).reverse();\n        async.reduce(reversed, memo, iterator, callback);\n    };\n    // foldr alias\n    async.foldr = async.reduceRight;\n\n    var _filter = function (eachfn, arr, iterator, callback) {\n        var results = [];\n        arr = _map(arr, function (x, i) {\n            return {index: i, value: x};\n        });\n        eachfn(arr, function (x, callback) {\n            iterator(x.value, function (v) {\n                if (v) {\n                    results.push(x);\n                }\n                callback();\n            });\n        }, function (err) {\n            callback(_map(results.sort(function (a, b) {\n                return a.index - b.index;\n            }), function (x) {\n                return x.value;\n            }));\n        });\n    };\n    async.filter = doParallel(_filter);\n    async.filterSeries = doSeries(_filter);\n    // select alias\n    async.select = async.filter;\n    async.selectSeries = async.filterSeries;\n\n    var _reject = function (eachfn, arr, iterator, callback) {\n        var results = [];\n        arr = _map(arr, function (x, i) {\n            return {index: i, value: x};\n        });\n        eachfn(arr, function (x, callback) {\n            iterator(x.value, function (v) {\n                if (!v) {\n                    results.push(x);\n                }\n                callback();\n            });\n        }, function (err) {\n            callback(_map(results.sort(function (a, b) {\n                return a.index - b.index;\n            }), function (x) {\n                return x.value;\n            }));\n        });\n    };\n    async.reject = doParallel(_reject);\n    async.rejectSeries = doSeries(_reject);\n\n    var _detect = function (eachfn, arr, iterator, main_callback) {\n        eachfn(arr, function (x, callback) {\n            iterator(x, function (result) {\n                if (result) {\n                    main_callback(x);\n                    main_callback = function () {};\n                }\n                else {\n                    callback();\n                }\n            });\n        }, function (err) {\n            main_callback();\n        });\n    };\n    async.detect = doParallel(_detect);\n    async.detectSeries = doSeries(_detect);\n\n    async.some = function (arr, iterator, main_callback) {\n        async.each(arr, function (x, callback) {\n            iterator(x, function (v) {\n                if (v) {\n                    main_callback(true);\n                    main_callback = function () {};\n                }\n                callback();\n            });\n        }, function (err) {\n            main_callback(false);\n        });\n    };\n    // any alias\n    async.any = async.some;\n\n    async.every = function (arr, iterator, main_callback) {\n        async.each(arr, function (x, callback) {\n            iterator(x, function (v) {\n                if (!v) {\n                    main_callback(false);\n                    main_callback = function () {};\n                }\n                callback();\n            });\n        }, function (err) {\n            main_callback(true);\n        });\n    };\n    // all alias\n    async.all = async.every;\n\n    async.sortBy = function (arr, iterator, callback) {\n        async.map(arr, function (x, callback) {\n            iterator(x, function (err, criteria) {\n                if (err) {\n                    callback(err);\n                }\n                else {\n                    callback(null, {value: x, criteria: criteria});\n                }\n            });\n        }, function (err, results) {\n            if (err) {\n                return callback(err);\n            }\n            else {\n                var fn = function (left, right) {\n                    var a = left.criteria, b = right.criteria;\n                    return a < b ? -1 : a > b ? 1 : 0;\n                };\n                callback(null, _map(results.sort(fn), function (x) {\n                    return x.value;\n                }));\n            }\n        });\n    };\n\n    async.auto = function (tasks, callback) {\n        callback = callback || function () {};\n        var keys = _keys(tasks);\n        if (!keys.length) {\n            return callback(null);\n        }\n\n        var results = {};\n\n        var listeners = [];\n        var addListener = function (fn) {\n            listeners.unshift(fn);\n        };\n        var removeListener = function (fn) {\n            for (var i = 0; i < listeners.length; i += 1) {\n                if (listeners[i] === fn) {\n                    listeners.splice(i, 1);\n                    return;\n                }\n            }\n        };\n        var taskComplete = function () {\n            _each(listeners.slice(0), function (fn) {\n                fn();\n            });\n        };\n\n        addListener(function () {\n            if (_keys(results).length === keys.length) {\n                callback(null, results);\n                callback = function () {};\n            }\n        });\n\n        _each(keys, function (k) {\n            var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k];\n            var taskCallback = function (err) {\n                var args = Array.prototype.slice.call(arguments, 1);\n                if (args.length <= 1) {\n                    args = args[0];\n                }\n                if (err) {\n                    var safeResults = {};\n                    _each(_keys(results), function(rkey) {\n                        safeResults[rkey] = results[rkey];\n                    });\n                    safeResults[k] = args;\n                    callback(err, safeResults);\n                    // stop subsequent errors hitting callback multiple times\n                    callback = function () {};\n                }\n                else {\n                    results[k] = args;\n                    async.setImmediate(taskComplete);\n                }\n            };\n            var requires = task.slice(0, Math.abs(task.length - 1)) || [];\n            var ready = function () {\n                return _reduce(requires, function (a, x) {\n                    return (a && results.hasOwnProperty(x));\n                }, true) && !results.hasOwnProperty(k);\n            };\n            if (ready()) {\n                task[task.length - 1](taskCallback, results);\n            }\n            else {\n                var listener = function () {\n                    if (ready()) {\n                        removeListener(listener);\n                        task[task.length - 1](taskCallback, results);\n                    }\n                };\n                addListener(listener);\n            }\n        });\n    };\n\n    async.waterfall = function (tasks, callback) {\n        callback = callback || function () {};\n        if (tasks.constructor !== Array) {\n          var err = new Error('First argument to waterfall must be an array of functions');\n          return callback(err);\n        }\n        if (!tasks.length) {\n            return callback();\n        }\n        var wrapIterator = function (iterator) {\n            return function (err) {\n                if (err) {\n                    callback.apply(null, arguments);\n                    callback = function () {};\n                }\n                else {\n                    var args = Array.prototype.slice.call(arguments, 1);\n                    var next = iterator.next();\n                    if (next) {\n                        args.push(wrapIterator(next));\n                    }\n                    else {\n                        args.push(callback);\n                    }\n                    async.setImmediate(function () {\n                        iterator.apply(null, args);\n                    });\n                }\n            };\n        };\n        wrapIterator(async.iterator(tasks))();\n    };\n\n    var _parallel = function(eachfn, tasks, callback) {\n        callback = callback || function () {};\n        if (tasks.constructor === Array) {\n            eachfn.map(tasks, function (fn, callback) {\n                if (fn) {\n                    fn(function (err) {\n                        var args = Array.prototype.slice.call(arguments, 1);\n                        if (args.length <= 1) {\n                            args = args[0];\n                        }\n                        callback.call(null, err, args);\n                    });\n                }\n            }, callback);\n        }\n        else {\n            var results = {};\n            eachfn.each(_keys(tasks), function (k, callback) {\n                tasks[k](function (err) {\n                    var args = Array.prototype.slice.call(arguments, 1);\n                    if (args.length <= 1) {\n                        args = args[0];\n                    }\n                    results[k] = args;\n                    callback(err);\n                });\n            }, function (err) {\n                callback(err, results);\n            });\n        }\n    };\n\n    async.parallel = function (tasks, callback) {\n        _parallel({ map: async.map, each: async.each }, tasks, callback);\n    };\n\n    async.parallelLimit = function(tasks, limit, callback) {\n        _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback);\n    };\n\n    async.series = function (tasks, callback) {\n        callback = callback || function () {};\n        if (tasks.constructor === Array) {\n            async.mapSeries(tasks, function (fn, callback) {\n                if (fn) {\n                    fn(function (err) {\n                        var args = Array.prototype.slice.call(arguments, 1);\n                        if (args.length <= 1) {\n                            args = args[0];\n                        }\n                        callback.call(null, err, args);\n                    });\n                }\n            }, callback);\n        }\n        else {\n            var results = {};\n            async.eachSeries(_keys(tasks), function (k, callback) {\n                tasks[k](function (err) {\n                    var args = Array.prototype.slice.call(arguments, 1);\n                    if (args.length <= 1) {\n                        args = args[0];\n                    }\n                    results[k] = args;\n                    callback(err);\n                });\n            }, function (err) {\n                callback(err, results);\n            });\n        }\n    };\n\n    async.iterator = function (tasks) {\n        var makeCallback = function (index) {\n            var fn = function () {\n                if (tasks.length) {\n                    tasks[index].apply(null, arguments);\n                }\n                return fn.next();\n            };\n            fn.next = function () {\n                return (index < tasks.length - 1) ? makeCallback(index + 1): null;\n            };\n            return fn;\n        };\n        return makeCallback(0);\n    };\n\n    async.apply = function (fn) {\n        var args = Array.prototype.slice.call(arguments, 1);\n        return function () {\n            return fn.apply(\n                null, args.concat(Array.prototype.slice.call(arguments))\n            );\n        };\n    };\n\n    var _concat = function (eachfn, arr, fn, callback) {\n        var r = [];\n        eachfn(arr, function (x, cb) {\n            fn(x, function (err, y) {\n                r = r.concat(y || []);\n                cb(err);\n            });\n        }, function (err) {\n            callback(err, r);\n        });\n    };\n    async.concat = doParallel(_concat);\n    async.concatSeries = doSeries(_concat);\n\n    async.whilst = function (test, iterator, callback) {\n        if (test()) {\n            iterator(function (err) {\n                if (err) {\n                    return callback(err);\n                }\n                async.whilst(test, iterator, callback);\n            });\n        }\n        else {\n            callback();\n        }\n    };\n\n    async.doWhilst = function (iterator, test, callback) {\n        iterator(function (err) {\n            if (err) {\n                return callback(err);\n            }\n            if (test()) {\n                async.doWhilst(iterator, test, callback);\n            }\n            else {\n                callback();\n            }\n        });\n    };\n\n    async.until = function (test, iterator, callback) {\n        if (!test()) {\n            iterator(function (err) {\n                if (err) {\n                    return callback(err);\n                }\n                async.until(test, iterator, callback);\n            });\n        }\n        else {\n            callback();\n        }\n    };\n\n    async.doUntil = function (iterator, test, callback) {\n        iterator(function (err) {\n            if (err) {\n                return callback(err);\n            }\n            if (!test()) {\n                async.doUntil(iterator, test, callback);\n            }\n            else {\n                callback();\n            }\n        });\n    };\n\n    async.queue = function (worker, concurrency) {\n        if (concurrency === undefined) {\n            concurrency = 1;\n        }\n        function _insert(q, data, pos, callback) {\n          if(data.constructor !== Array) {\n              data = [data];\n          }\n          _each(data, function(task) {\n              var item = {\n                  data: task,\n                  callback: typeof callback === 'function' ? callback : null\n              };\n\n              if (pos) {\n                q.tasks.unshift(item);\n              } else {\n                q.tasks.push(item);\n              }\n\n              if (q.saturated && q.tasks.length === concurrency) {\n                  q.saturated();\n              }\n              async.setImmediate(q.process);\n          });\n        }\n\n        var workers = 0;\n        var q = {\n            tasks: [],\n            concurrency: concurrency,\n            saturated: null,\n            empty: null,\n            drain: null,\n            push: function (data, callback) {\n              _insert(q, data, false, callback);\n            },\n            unshift: function (data, callback) {\n              _insert(q, data, true, callback);\n            },\n            process: function () {\n                if (workers < q.concurrency && q.tasks.length) {\n                    var task = q.tasks.shift();\n                    if (q.empty && q.tasks.length === 0) {\n                        q.empty();\n                    }\n                    workers += 1;\n                    var next = function () {\n                        workers -= 1;\n                        if (task.callback) {\n                            task.callback.apply(task, arguments);\n                        }\n                        if (q.drain && q.tasks.length + workers === 0) {\n                            q.drain();\n                        }\n                        q.process();\n                    };\n                    var cb = only_once(next);\n                    worker(task.data, cb);\n                }\n            },\n            length: function () {\n                return q.tasks.length;\n            },\n            running: function () {\n                return workers;\n            }\n        };\n        return q;\n    };\n\n    async.cargo = function (worker, payload) {\n        var working     = false,\n            tasks       = [];\n\n        var cargo = {\n            tasks: tasks,\n            payload: payload,\n            saturated: null,\n            empty: null,\n            drain: null,\n            push: function (data, callback) {\n                if(data.constructor !== Array) {\n                    data = [data];\n                }\n                _each(data, function(task) {\n                    tasks.push({\n                        data: task,\n                        callback: typeof callback === 'function' ? callback : null\n                    });\n                    if (cargo.saturated && tasks.length === payload) {\n                        cargo.saturated();\n                    }\n                });\n                async.setImmediate(cargo.process);\n            },\n            process: function process() {\n                if (working) return;\n                if (tasks.length === 0) {\n                    if(cargo.drain) cargo.drain();\n                    return;\n                }\n\n                var ts = typeof payload === 'number'\n                            ? tasks.splice(0, payload)\n                            : tasks.splice(0);\n\n                var ds = _map(ts, function (task) {\n                    return task.data;\n                });\n\n                if(cargo.empty) cargo.empty();\n                working = true;\n                worker(ds, function () {\n                    working = false;\n\n                    var args = arguments;\n                    _each(ts, function (data) {\n                        if (data.callback) {\n                            data.callback.apply(null, args);\n                        }\n                    });\n\n                    process();\n                });\n            },\n            length: function () {\n                return tasks.length;\n            },\n            running: function () {\n                return working;\n            }\n        };\n        return cargo;\n    };\n\n    var _console_fn = function (name) {\n        return function (fn) {\n            var args = Array.prototype.slice.call(arguments, 1);\n            fn.apply(null, args.concat([function (err) {\n                var args = Array.prototype.slice.call(arguments, 1);\n                if (typeof console !== 'undefined') {\n                    if (err) {\n                        if (console.error) {\n                            console.error(err);\n                        }\n                    }\n                    else if (console[name]) {\n                        _each(args, function (x) {\n                            console[name](x);\n                        });\n                    }\n                }\n            }]));\n        };\n    };\n    async.log = _console_fn('log');\n    async.dir = _console_fn('dir');\n    /*async.info = _console_fn('info');\n    async.warn = _console_fn('warn');\n    async.error = _console_fn('error');*/\n\n    async.memoize = function (fn, hasher) {\n        var memo = {};\n        var queues = {};\n        hasher = hasher || function (x) {\n            return x;\n        };\n        var memoized = function () {\n            var args = Array.prototype.slice.call(arguments);\n            var callback = args.pop();\n            var key = hasher.apply(null, args);\n            if (key in memo) {\n                callback.apply(null, memo[key]);\n            }\n            else if (key in queues) {\n                queues[key].push(callback);\n            }\n            else {\n                queues[key] = [callback];\n                fn.apply(null, args.concat([function () {\n                    memo[key] = arguments;\n                    var q = queues[key];\n                    delete queues[key];\n                    for (var i = 0, l = q.length; i < l; i++) {\n                      q[i].apply(null, arguments);\n                    }\n                }]));\n            }\n        };\n        memoized.memo = memo;\n        memoized.unmemoized = fn;\n        return memoized;\n    };\n\n    async.unmemoize = function (fn) {\n      return function () {\n        return (fn.unmemoized || fn).apply(null, arguments);\n      };\n    };\n\n    async.times = function (count, iterator, callback) {\n        var counter = [];\n        for (var i = 0; i < count; i++) {\n            counter.push(i);\n        }\n        return async.map(counter, iterator, callback);\n    };\n\n    async.timesSeries = function (count, iterator, callback) {\n        var counter = [];\n        for (var i = 0; i < count; i++) {\n            counter.push(i);\n        }\n        return async.mapSeries(counter, iterator, callback);\n    };\n\n    async.compose = function (/* functions... */) {\n        var fns = Array.prototype.reverse.call(arguments);\n        return function () {\n            var that = this;\n            var args = Array.prototype.slice.call(arguments);\n            var callback = args.pop();\n            async.reduce(fns, args, function (newargs, fn, cb) {\n                fn.apply(that, newargs.concat([function () {\n                    var err = arguments[0];\n                    var nextargs = Array.prototype.slice.call(arguments, 1);\n                    cb(err, nextargs);\n                }]))\n            },\n            function (err, results) {\n                callback.apply(that, [err].concat(results));\n            });\n        };\n    };\n\n    var _applyEach = function (eachfn, fns /*args...*/) {\n        var go = function () {\n            var that = this;\n            var args = Array.prototype.slice.call(arguments);\n            var callback = args.pop();\n            return eachfn(fns, function (fn, cb) {\n                fn.apply(that, args.concat([cb]));\n            },\n            callback);\n        };\n        if (arguments.length > 2) {\n            var args = Array.prototype.slice.call(arguments, 2);\n            return go.apply(this, args);\n        }\n        else {\n            return go;\n        }\n    };\n    async.applyEach = doParallel(_applyEach);\n    async.applyEachSeries = doSeries(_applyEach);\n\n    async.forever = function (fn, callback) {\n        function next(err) {\n            if (err) {\n                if (callback) {\n                    return callback(err);\n                }\n                throw err;\n            }\n            fn(next);\n        }\n        next();\n    };\n\n    // AMD / RequireJS\n    if (typeof define !== 'undefined' && define.amd) {\n        define([], function () {\n            return async;\n        });\n    }\n    // Node.js\n    else if (typeof module !== 'undefined' && module.exports) {\n        module.exports = async;\n    }\n    // included directly via <script> tag\n    else {\n        root.async = async;\n    }\n\n}());\n"
  },
  {
    "path": "beatsmusic/content/contents/code/beatsmusic.js",
    "content": "/*\n *   Copyright 2014, Uwe L. Korn <uwelk@xhochy.com>\n *\n *   The MIT License (MIT)\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n *\n *   THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n *   FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n *   COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n *   IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n *   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n/* globals Tomahawk, TomahawkResolver, async, TomahawkConfigTestResultType, TomahawkUrlType */\n\n\nvar BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, {\n    settings: {\n        name: 'Beats Music',\n        icon: 'beatsmusic.png',\n        weight: 95,\n        timeout: 15\n    },\n\n    // Production\n    endpoint: \"https://partner.api.beatsmusic.com/v1\",\n    redirect_uri: \"https://tomahawk-beatslogin.appspot.com/json\",\n\n    getConfigUi: function () {\n        var uiData = Tomahawk.readBase64(\"config.ui\");\n        return {\n            \"widget\": uiData,\n            fields: [{\n                name: \"user\",\n                widget: \"user_edit\",\n                property: \"text\"\n            }, {\n                name: \"password\",\n                widget: \"password_edit\",\n                property: \"text\"\n            }],\n            images: [{\n                \"beatsmusic-wide.png\" : Tomahawk.readBase64(\"beatsmusic-wide.png\")\n            }]\n        };\n    },\n\n    newConfigSaved: function () {\n        var userConfig = this.getUserConfig();\n\n        if (this.user !== userConfig.user || this.password !== userConfig.password) {\n            this.init();\n        }\n    },\n\n\n    login: function(callback, doConfigTest) {\n        var userConfig = this.getUserConfig();\n        if (!userConfig.user || !userConfig.password) {\n            Tomahawk.log(\"Beats Music Resolver not properly configured!\");\n            this.loggedIn = false;\n            if (callback) {\n                callback(\"Beats Music Resolver not properly configured!\");\n            }\n            if (doConfigTest) {\n                Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidCredentials);\n            }\n            return;\n        }\n\n        this.user = userConfig.user;\n        this.password = userConfig.password;\n\n        var referer = \"https://partner.api.beatsmusic.com/oauth2/authorize?response_type=token\";\n        referer += \"&redirect_uri=\" + encodeURIComponent(this.redirect_uri);\n        referer += \"&client_id=\" + encodeURIComponent(this.app_token);\n\n        var headers = {\n            \"Content-Type\": \"application/x-www-form-urlencoded\",\n            \"Referer\": referer\n        };\n\n        // Keep empty arguments!\n        var data = \"login=\" + encodeURIComponent(this.user);\n        data += \"&password=\" + encodeURIComponent(this.password);\n        data += \"&redirect_uri=\" + encodeURIComponent(this.redirect_uri);\n        data += \"&response_type=token&scope=&state=&user_id=\";\n        data += \"&client_id=\" + encodeURIComponent(this.app_token);\n\n        var that = this;\n        Tomahawk.asyncRequest(\"https://partner.api.beatsmusic.com/api/o/oauth2/approval\", function (xhr) {\n            try {\n                var res = JSON.parse(xhr.responseText);\n                that.accessToken = res.access_token;\n                that.loggedIn = true;\n                if (callback) {\n                    callback();\n                }\n                if (doConfigTest) {\n                    Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Success);\n                }\n            } catch (e) {\n                if (doConfigTest) {\n                    Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidCredentials);\n                }\n            }\n        }, headers, {\n            method: \"POST\",\n            data: data,\n            errorHandler: function (xhr) {\n                if (doConfigTest) {\n                    if (xhr.status === 404) {\n                        Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.CommunicationError);\n                    } else {\n                        Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Other,\n                            xhr.statusText.trim());\n                    }\n                }\n            }\n        });\n    },\n\n    configTest: function () {\n        this.login(null, true);\n    },\n\n    spell: function(a){var magic=function(b){return(b=(b)?b:this).split(\"\").map(function(d){if(!d.match(/[A-Za-z]/)){return d;}var c=d.charCodeAt(0)>=96;var k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64));}).join(\"\");};return magic(a);},\n\n    init: function(cb) {\n        this.app_token = this.spell(\"s4fw8if4jfwxakawi7xud55c\");\n\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n\n        Tomahawk.addCustomUrlHandler(\"beatsmusic\", \"getStreamUrl\", true);\n\n        // re-login every 50 minutes\n        setInterval((function(self) { return function() { self.login(); }; })(this), 1000*60*50);\n\n        this.login(cb);\n    },\n\n    apiRequest: function (path, queryArgs, cb) {\n        var queryArray = [\"client_id=\" + this.app_token];\n        for (var key in queryArgs) {\n            queryArray.push(key + \"=\" + queryArgs[key]);\n        }\n        var url = this.endpoint + \"/api\" + path;\n        url += \"?\" + queryArray.join(\"&\");\n        Tomahawk.asyncRequest(url, function (xhr) {\n            var res = JSON.parse(xhr.responseText);\n            if (res.code === \"OK\") {\n                cb(res, xhr);\n            }\n        });\n    },\n\n    resolve: function (qid, artist, album, title) {\n        if (!this.loggedIn) {\n            Tomahawk.addTrackResults({qid: qid, results: []});\n            return;\n        }\n\n        // TODO: Add album to search\n        var that = this;\n        this.apiRequest(\"/search\", {\n            \"type\": \"track\",\n            \"filters\": \"streamable:true\",\n            \"limit\": \"1\",\n            \"q\": encodeURIComponent(artist + \" \" + title)\n        }, function (res) {\n            if (res.info.count > 0) {\n                // For the moment we just use the first result\n                that.apiRequest(\"/tracks/\" + res.data[0].id, {}, function (res2) {\n                    Tomahawk.addTrackResults({\n                        qid: qid,\n                        results: [{\n                            artist: res2.data.artist_display_name,\n                            duration: res2.data.duration,\n                            source: that.settings.name,\n                            track: res2.data.title,\n                            url: \"beatsmusic://track/\" + res.data[0].id\n                        }]\n                    });\n                });\n            } else {\n                Tomahawk.addTrackResults({ results: [], qid: qid });\n            }\n        });\n    },\n\n    getStreamUrl: function (qid, url) {\n        var trackId = url.replace(\"beatsmusic://track/\", \"\");\n        Tomahawk.asyncRequest(this.endpoint + \"/api/tracks/\" + trackId + \"/audio?acquire=1&bitrate=highest&access_token=\" + this.accessToken, function (xhr) {\n            var res = JSON.parse(xhr.responseText);\n            Tomahawk.reportStreamUrl(qid, res.data.location + \"/?slist=\" + res.data.resource);\n        });\n    },\n\n    search: function (qid, searchString) {\n        var that = this;\n        // TODO: Search for albums and artists, too.\n        Tomahawk.asyncRequest(this.endpoint +\n            \"/api/search?type=track&filters=streamable:true&limit=100&q=\" +\n            encodeURIComponent(searchString) + \"&client_id=\" + this.app_token, function (xhr) {\n            var res = JSON.parse(xhr.responseText);\n            if (res.code === \"OK\" && res.data.length > 0) {\n                async.map(res.data, function (item, cb) {\n                    var query = that.endpoint + \"/api/tracks/\" + item.id;\n                    query += \"?fields=artist_display_name&fields=duration\";\n                    query += \"&fields=title&fields=id&client_id=\";\n                    query += that.app_token;\n                    Tomahawk.asyncRequest(query, function (xhr2) {\n                        var res2 = JSON.parse(xhr2.responseText);\n                        Tomahawk.log(xhr2.responseText);\n                        if (res2.code === \"OK\") {\n                            var result = {\n                                artist: res2.data.artist_display_name,\n                                bitrate: 320,\n                                duration: res2.data.duration,\n                                source: that.settings.name,\n                                track: res2.data.title,\n                                url: \"beatsmusic://track/\" + res2.data.id\n                            };\n                            if (res2.data.refs.hasOwnProperty(\"album\")) {\n                                result.album = res2.data.refs.album.display;\n                            }\n                            cb(null, result);\n                        } else {\n                            Tomahawk.log(\"Failed to get track metadata: \" +\n                                JSON.stringify(res2));\n                            // Just skip this item instead of raising an error,\n                            // so that at least the successful results get\n                            // through.\n                            cb(null, null);\n                        }\n                    });\n                    // cb(null, item);\n                }, function (err, results) {\n                    Tomahawk.addTrackResults({\n                        results: results.filter(function (item) {\n                            return item !== null;\n                        }),\n                        qid: qid\n                    });\n                });\n            } else {\n                Tomahawk.addTrackResults({\n                    results: [],\n                    qid: qid\n                });\n            }\n        });\n    },\n\n    canParseUrl: function (url, type) {\n        // We accept all beats.mu shortened urls as we need a HTTP request to get more information.\n        if (/https?:\\/\\/beats.mu\\//.test(url)) return true;\n\n        switch (type) {\n            case TomahawkUrlType.Album:\n                return /https?:\\/\\/((on|listen)\\.)?beatsmusic.com\\/albums\\/([^\\/]*)\\/?$/.test(url);\n            case TomahawkUrlType.Artist:\n                return /https?:\\/\\/((on|listen)\\.)?beatsmusic.com\\/artists\\/([^\\/]*)\\/?$/.test(url);\n            case TomahawkUrlType.Playlist:\n                return this.loggedIn && /https?:\\/\\/((on|listen)\\.)?beatsmusic.com\\/playlists\\/([^\\/]*)\\/?$/.test(url);\n            case TomahawkUrlType.Track:\n                return /https?:\\/\\/((on|listen)\\.)?beatsmusic.com\\/albums\\/([^\\/]*)\\/tracks\\//.test(url);\n            // case TomahawkUrlType.Any:\n            default:\n                return /https?:\\/\\/((on|listen)\\.)?beatsmusic.com\\/([^\\/]*\\/|)/.test(url);\n        }\n    },\n\n    lookupUrl: function (url) {\n        // Todo: unshorten beats.mu\n        var match;\n        var query;\n        var that = this;\n        if (/https?:\\/\\/((on|listen)\\.)?beatsmusic.com\\/albums\\/([^\\/]*)\\/?$/.test(url)) {\n            // Found an album URL\n            match = url.match(/https?:\\/\\/((on|listen)\\.)?beatsmusic.com\\/albums\\/([^\\/]*)\\/?$/);\n            query = this.endpoint + \"/api/albums/\" + encodeURIComponent(match[3]) + \"?client_id=\" + this.app_token;\n            Tomahawk.asyncRequest(query, function (xhr) {\n                var res = JSON.parse(xhr.responseText);\n                if (res.code === \"OK\") {\n                    Tomahawk.addUrlResult(url, {\n                        type: \"album\",\n                        name: res.data.title,\n                        artist: res.data.artist_display_name\n                    });\n                }\n            });\n        } else if (/https?:\\/\\/((on|listen)\\.)?beatsmusic.com\\/artists\\/([^\\/]*)\\/?$/.test(url)) {\n            match = url.match(/https?:\\/\\/((on|listen)\\.)?beatsmusic.com\\/artists\\/([^\\/]*)\\/?$/);\n            query = this.endpoint + \"/api/artists/\" + encodeURIComponent(match[3]) + \"?client_id=\" + this.app_token;\n            Tomahawk.asyncRequest(query, function (xhr) {\n                var res = JSON.parse(xhr.responseText);\n                if (res.code === \"OK\") {\n                    Tomahawk.addUrlResult(url, {\n                        type: \"artist\",\n                        name: res.data.name\n                    });\n                }\n            });\n        } else if (/https?:\\/\\/((on|listen)\\.)?beatsmusic.com\\/albums\\/([^\\/]*)\\/tracks\\//.test(url)) {\n            match = url.match(/https?:\\/\\/((on|listen)\\.)?beatsmusic.com\\/albums\\/([^\\/]*)\\/tracks\\/([^\\/]*)/);\n            query = this.endpoint + \"/api/tracks/\" + encodeURIComponent(match[4]) + \"?client_id=\" + this.app_token;\n            Tomahawk.asyncRequest(query, function (xhr) {\n                var res = JSON.parse(xhr.responseText);\n                if (res.code === \"OK\") {\n                    Tomahawk.addUrlResult(url, {\n                        type: \"track\",\n                        title: res.data.title,\n                        artist: res.data.artist_display_name\n                    });\n                }\n            });\n        } else if (/https?:\\/\\/((on|listen)\\.)?beatsmusic.com\\/playlists\\/([^\\/]*)\\/?$/.test(url)) {\n            match = url.match(/https?:\\/\\/((on|listen)\\.)?beatsmusic.com\\/playlists\\/([^\\/]*)\\/?$/);\n            query = this.endpoint + \"/api/playlists/\" + encodeURIComponent(match[3]) + \"?access_token=\" + this.accessToken;\n            Tomahawk.asyncRequest(query, function (xhr) {\n                var res = JSON.parse(xhr.responseText);\n                if (res.code === \"OK\") {\n                    var result = {\n                        type: \"playlist\",\n                        title: res.data.name,\n                        guid: \"beatsmusic-playlist-\" + encodeURIComponent(match[3]),\n                        info: res.data.description + \" (A playlist by \" + res.data.refs.author.display + \" on Beats Music)\",\n                        creator: res.data.refs.author.display,\n                        url: url,\n                        tracks: []\n                    };\n                    async.map(res.data.refs.tracks, function (item, cb) {\n                        var query2 = that.endpoint + \"/api/tracks/\" + encodeURIComponent(item.id)  + \"?client_id=\" + that.app_token;\n                        Tomahawk.asyncRequest(query2, function (xhr2) {\n                            var res2 = JSON.parse(xhr2.responseText);\n                            if (res2.code === \"OK\") {\n                                cb(null, {\n                                    type: \"track\",\n                                    title: res2.data.title,\n                                    artist: res2.data.artist_display_name\n                                });\n                            } else {\n                                cb(res2.code, null);\n                            }\n                        });\n                    }, function (err, mapresult) {\n                        result.tracks = mapresult;\n                        Tomahawk.addUrlResult(url, result);\n                    });\n                }\n            });\n        }\n    }\n});\n\nTomahawk.resolver.instance = BeatsMusicResolver;\n"
  },
  {
    "path": "beatsmusic/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>536</width>\n    <height>174</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <widget class=\"QLabel\" name=\"beatsmusic_label\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"pixmap\">\n      <pixmap>beatsmusic-wide.png</pixmap>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::ExpandingFieldsGrow</enum>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Username:</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"user_edit\"/>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Password:</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"password_edit\">\n       <property name=\"echoMode\">\n        <enum>QLineEdit::Password</enum>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "beatsmusic/content/contents/code/test.js",
    "content": "/*\n *   Copyright 2014, Uwe L. Korn <uwelk@xhochy.com>\n *\n *   The MIT License (MIT)\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n *\n *   THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n *   FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n *   COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n *   IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n *   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\nvar buster = require(\"buster\");\nvar nock = require(\"nock\");\nvar utils = require(\"../../../../test/utils.js\");\n\nbuster.testCase(\"beatsmusic\", {\n    setUp: function (done) {\n        nock(\"https://partner.api.beatsmusic.com\")\n            .post(\"/api/o/oauth2/approval\")\n            .times(2)\n            .reply(200, JSON.stringify({\n                \"access_token\": \"testToken\"\n            }));\n        utils.loadResolver('beatsmusic', this, done, {\n            user: \"TestUser\",\n            password: \"TestPassword\"\n        });\n    },\n\n    \"test capabilities\": function () {\n        buster.assert(this.context.hasCapability('urllookup'));\n        buster.refute(this.context.hasCapability('playlistsync'));\n        buster.refute(this.context.hasCapability('browsable'));\n    }\n});\n\n"
  },
  {
    "path": "beatsmusic/content/metadata.json",
    "content": "{\n    \"name\": \"Beats Music\",\n    \"pluginName\": \"beatsmusic\",\n    \"author\": \"Uwe L. Korn\",\n    \"email\": \"uwelk@xhochy.com\",\n    \"version\": \"0.1.3\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"(0.8+) Stream music from Beats Music.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/beatsmusic.js\",\n        \"scripts\": [\n            \"contents/code/async.js\"\n        ],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"indicator\": \"contents/images/icon-16x16.png\",\n        \"resources\": [\n            \"contents/code/config.ui\",\n            \"contents/code/beatsmusic.png\",\n            \"contents/code/beatsmusic-wide.png\"\n        ]\n    },\n    \"staticCapabilities\": [\n        \"configTestable\"\n    ]\n}\n"
  },
  {
    "path": "beatsmusic/helpers/resolve.js",
    "content": "/*\n *   Copyright 2014, Uwe L. Korn <uwelk@xhochy.com>\n *\n *   The MIT License (MIT)\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n *\n *   THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n *   FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n *   COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n *   IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n *   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\nvar utils = require(\"../../test/utils.js\");\n\nvar username = process.argv[2];\nvar password = process.argv[3];\nvar artist = process.argv[4];\nvar track = process.argv[5];\n\nvar owner = {};\n\n// We have the relevant credentials, so get a resolver instance.\nutils.loadResolver('beatsmusic', owner, function (err) {\n    if (err) {\n        console.log(\"Error on creating a resolver instance:\");\n        console.log(err);\n        process.exit(1);\n    }\n\n    owner.context.once('track-result', function (qid, result) {\n        owner.context.getStreamUrl(2, result.url);\n    });\n    owner.context.once('stream-url', function (qid, url) {\n        console.log(url);\n    });\n    owner.instance.resolve(1, artist, \"\", track);\n}, {\n    user: username,\n    password: password\n});\n"
  },
  {
    "path": "beets/content/contents/code/beets.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2012, Adrian Sampson <adrian@radbox.org>\n *   Copyright 2013, Uwe L. Korn <uwelk@xhochy.com>\n *   Copyright 2014, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU Lesser General Public License as\n *   published by the Free Software Foundation, version 3.\n *\n *   Tomahawk is distributed in the hope that it will be useful, but\n *   WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n *   Lesser General Public License for more details.\n *\n *   You should have received a copy of the GNU Lesser General Public License\n *   along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar BeetsResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'beets',\n        icon: 'beets-icon.png',\n        weight: 95,\n        timeout: 5\n    },\n\n    // Configuration.\n    getConfigUi: function () {\n        var uiData = Tomahawk.readBase64(\"config.ui\");\n        return {\n            \"widget\": uiData,\n            \"fields\": [{\n                name: \"server\",\n                widget: \"serverField\",\n                property: \"text\"\n            }, {\n                name: \"username\",\n                widget: \"usernameField\",\n                property: \"text\"\n            }, {\n                name: \"password\",\n                widget: \"passwordField\",\n                property: \"text\"\n            }]\n        };\n    },\n\n    /**\n     * Defines this Resolver's config dialog UI.\n     */\n    configUi: [\n        {\n            id: \"server\",\n            type: \"textfield\",\n            label: \"Server URL\",\n            defaultValue: \"http://localhost:8337/\"\n        },\n        {\n            id: \"username\",\n            type: \"textfield\",\n            label: \"Username\"\n        },\n        {\n            id: \"password\",\n            type: \"textfield\",\n            label: \"Password\",\n            isPassword: true\n        }\n    ],\n\n    newConfigSaved: function (newConfig) {\n        Tomahawk.log(\"Invalidating cache\");\n        var that = this;\n        beetsCollection.wipe({id: beetsCollection.settings.id}).then(function () {\n            window.localStorage.removeItem(\"beets_trackCount\");\n            window.localStorage.removeItem(\"beets_albumCount\");\n            that.init();\n        });\n    },\n\n    _sanitizeConfig: function (config) {\n        if (!config.server) {\n            config.server = \"http://localhost:8337/\";\n        } else {\n            if (config.server.search(\"^.*:\\/\\/\") < 0) {\n                // couldn't find a proper protocol, so we default to \"http://\"\n                config.server = \"http://\" + config.server;\n            }\n\n            // qtwebkit doesn't support toString() or href on URLs\n            if(URL.prototype.hasOwnProperty('toString')) {\n                var url = new URL(config.server);\n                if (!url.port) {\n                    url.port = 8337;\n                }\n                config.server = url.toString();\n            }\n        }\n\n        return config;\n    },\n\n    init: function () {\n        var config = this._sanitizeConfig(this.getUserConfig());\n        this._server = config.server;\n        this._username = config.username;\n        this._password = config.password;\n\n        this._ensureCollection();\n    },\n\n    _ensureCollection: function () {\n        var that = this;\n\n        return beetsCollection.revision({\n            id: beetsCollection.settings.id\n        }).then(function (result) {\n            var lastCollectionUpdate = window.localStorage[\"beets_last_collection_update\"];\n            if (lastCollectionUpdate && lastCollectionUpdate == result) {\n                Tomahawk.log(\"Collection database has not been changed since last time.\");\n                return that._fetchAndStoreCollection();\n            } else {\n                Tomahawk.log(\"Collection database has been changed. Wiping and re-fetching...\");\n                window.localStorage.removeItem(\"beets_trackCount\");\n                window.localStorage.removeItem(\"beets_albumCount\");\n                return beetsCollection.wipe({\n                    id: beetsCollection.settings.id\n                }).then(function () {\n                    return that._fetchAndStoreCollection();\n                });\n            }\n        });\n    },\n\n    _fetchAndStoreCollection: function () {\n        var that = this;\n\n        var settings;\n        if (this._username && this._password) {\n            settings = {\n                username: this._username,\n                password: this._password\n            };\n        }\n\n        Tomahawk.get(this._server + 'stats', settings).then(function (response) {\n            var trackCount = parseInt(response.items);\n            var albumCount = parseInt(response.albums);\n            Tomahawk.PluginManager.registerPlugin(\"collection\", beetsCollection);\n            if (window.localStorage[\"beets_trackCount\"] != trackCount\n                || window.localStorage[\"beets_albumCount\"] != albumCount) {\n                var msg = \"\";\n                if (window.localStorage[\"beets_trackCount\"] != trackCount) {\n                    msg += \"Track count has changed from \" + window.localStorage[\"beets_trackCount\"]\n                        + \" to \" + trackCount + \". \";\n                }\n                if (window.localStorage[\"beets_albumCount\"] != albumCount) {\n                    msg += \"Album count has changed from \" + window.localStorage[\"beets_albumCount\"]\n                        + \" to \" + albumCount + \". \";\n                }\n                Tomahawk.log(msg + \"Updating collection ...\");\n                return Tomahawk.get(that._server + \"item\", settings).then(function (response) {\n                    var searchResults = [];\n                    response.items.forEach(function (item) {\n                        searchResults.push({\n                            artist: item.artist,\n                            artistDisambiguation: \"\",\n                            albumArtist: item.artist,\n                            albumArtistDisambiguation: \"\",\n                            album: item.album,\n                            track: item.title,\n                            albumpos: item.track,\n                            url: that._server + 'item/' + item.id + '/file',\n                            duration: Math.floor(item.length)\n                        });\n                    });\n                    beetsCollection.wipe({id: beetsCollection.settings.id}).then(function () {\n                        beetsCollection.addTracks({\n                            id: beetsCollection.settings.id,\n                            tracks: searchResults\n                        }).then(function (newRevision) {\n                            window.localStorage[\"beets_trackCount\"] = trackCount;\n                            window.localStorage[\"beets_albumCount\"] = albumCount;\n                            window.localStorage[\"beets_last_collection_update\"] = newRevision;\n                        });\n                    });\n                });\n            } else {\n                Tomahawk.log(\"Track count is still \" + trackCount\n                    + \". Album count is still \" + albumCount\n                    + \". No collection update necessary.\");\n                beetsCollection.addTracks({\n                    id: beetsCollection.settings.id,\n                    tracks: []\n                });\n            }\n        });\n\n    },\n\n    testConfig: function (config) {\n        config = this._sanitizeConfig(config);\n\n        var settings;\n        if (config.username && config.password) {\n            settings = {\n                username: config.username,\n                password: config.password\n            };\n        }\n\n        return Tomahawk.get(config.server + \"stats\", settings).then(function () {\n            return Tomahawk.ConfigTestResultType.Success;\n        }, function (xhr) {\n            if (xhr.status == 403) {\n                return Tomahawk.ConfigTestResultType.InvalidCredentials;\n            } else if (xhr.status == 404 || xhr.status == 0) {\n                return Tomahawk.ConfigTestResultType.CommunicationError;\n            } else {\n                return xhr.responseText.trim();\n            }\n        });\n    }\n});\n\nTomahawk.resolver.instance = BeetsResolver;\n\nvar beetsCollection = Tomahawk.extend(Tomahawk.Collection, {\n    settings: {\n        id: \"beets\",\n        prettyname: \"Beets\",\n        description: BeetsResolver.server,\n        iconfile: \"contents/images/icon.png\",\n        trackcount: BeetsResolver.trackCount\n    }\n});"
  },
  {
    "path": "beets/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>290</width>\n    <height>150</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>290</width>\n    <height>150</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <widget class=\"QWidget\" name=\"layoutWidget\">\n   <property name=\"geometry\">\n    <rect>\n     <x>10</x>\n     <y>20</y>\n     <width>271</width>\n     <height>111</height>\n    </rect>\n   </property>\n   <layout class=\"QFormLayout\" name=\"formLayout\">\n    <property name=\"sizeConstraint\">\n     <enum>QLayout::SetDefaultConstraint</enum>\n    </property>\n    <property name=\"fieldGrowthPolicy\">\n     <enum>QFormLayout::FieldsStayAtSizeHint</enum>\n    </property>\n    <item row=\"0\" column=\"0\">\n     <widget class=\"QLabel\" name=\"label\">\n      <property name=\"text\">\n       <string>Server</string>\n      </property>\n     </widget>\n    </item>\n    <item row=\"0\" column=\"1\">\n     <widget class=\"QLineEdit\" name=\"serverField\">\n      <property name=\"sizePolicy\">\n       <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Preferred\">\n        <horstretch>0</horstretch>\n        <verstretch>0</verstretch>\n       </sizepolicy>\n      </property>\n      <property name=\"minimumSize\">\n       <size>\n        <width>200</width>\n        <height>0</height>\n       </size>\n      </property>\n      <property name=\"text\">\n       <string/>\n      </property>\n      <property name=\"placeholderText\">\n       <string>http://localhost:8337</string>\n      </property>\n     </widget>\n    </item>\n    <item row=\"1\" column=\"0\">\n     <widget class=\"QLabel\" name=\"label_3\">\n      <property name=\"text\">\n       <string>Username</string>\n      </property>\n     </widget>\n    </item>\n    <item row=\"1\" column=\"1\">\n     <widget class=\"QLineEdit\" name=\"usernameField\">\n      <property name=\"enabled\">\n       <bool>false</bool>\n      </property>\n      <property name=\"minimumSize\">\n       <size>\n        <width>200</width>\n        <height>0</height>\n       </size>\n      </property>\n      <property name=\"text\">\n       <string/>\n      </property>\n      <property name=\"placeholderText\">\n       <string>username</string>\n      </property>\n     </widget>\n    </item>\n    <item row=\"2\" column=\"0\">\n     <widget class=\"QLabel\" name=\"label_4\">\n      <property name=\"text\">\n       <string>Password</string>\n      </property>\n     </widget>\n    </item>\n    <item row=\"2\" column=\"1\">\n     <widget class=\"QLineEdit\" name=\"passwordField\">\n      <property name=\"enabled\">\n       <bool>false</bool>\n      </property>\n      <property name=\"minimumSize\">\n       <size>\n        <width>200</width>\n        <height>0</height>\n       </size>\n      </property>\n      <property name=\"inputMask\">\n       <string/>\n      </property>\n      <property name=\"text\">\n       <string/>\n      </property>\n      <property name=\"echoMode\">\n       <enum>QLineEdit::Password</enum>\n      </property>\n      <property name=\"placeholderText\">\n       <string>password</string>\n      </property>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>useAuthCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>passwordField</receiver>\n   <slot>setEnabled(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>133</x>\n     <y>92</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>155</x>\n     <y>152</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>useAuthCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>usernameField</receiver>\n   <slot>setEnabled(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>133</x>\n     <y>92</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>155</x>\n     <y>121</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "beets/content/metadata.json",
    "content": "{\n    \"name\": \"Beets\",\n    \"pluginName\": \"beets\",\n    \"author\": \"Adrian, Uwe, Enno and Dominik\",\n    \"email\": \"uwelk@xhochy.com\",\n    \"version\": \"0.6.3\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Connects to a beets server and resolves tracks.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/beets.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/config.ui\",\n            \"contents/code/beets-icon.png\"\n        ]\n    },\n    \"staticCapabilities\": [\n        \"configTestable\"\n    ]\n}\n"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"tomahawk-resolvers\",\n  \"version\": \"0.0.0\",\n  \"authors\": [\n    \"Team Tomahawk <welisten@tomahawk-player.org>\"\n  ],\n  \"description\": \"Resolvers for the Tomahawk Music Player\",\n  \"license\": \"GPL-3\",\n  \"homepage\": \"http://tomahawk-player.org\",\n  \"private\": true,\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"bower_components\",\n    \"test\",\n    \"tests\"\n  ]\n}\n"
  },
  {
    "path": "deezer/content/contents/code/deezer.js",
    "content": "/*\n *   Copyright 2013,      Uwe L. Korn <uwelk@xhochy.com>\n *   Copyright 2014,      Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n\nvar DeezerResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'Deezer',\n        icon: 'deezer.png',\n        weight: 95,\n        timeout: 15\n    },\n\n    appId: \"138751\",\n\n    // Deezer requires the redirectUri to be in the domain that has been defined when\n    // Tomahawk-Android has been registered on the Deezer Developer website\n    redirectUri: \"tomahawkdeezerresolver://hatchet.is\",\n\n    storageKeyAccessToken: \"deezer_access_token\",\n\n    storageKeyAccessTokenExpires: \"deezer_access_token_expires\",\n\n    getAccessToken: function () {\n        var that = this;\n\n        var accessToken = Tomahawk.localStorage.getItem(that.storageKeyAccessToken);\n        var accessTokenExpires =\n            Tomahawk.localStorage.getItem(that.storageKeyAccessTokenExpires);\n        if (accessToken !== null && accessToken.length > 0 && accessTokenExpires !== null) {\n            return {\n                accessToken: accessToken,\n                accessTokenExpires: accessTokenExpires\n            };\n        } else {\n            throw  new Error(\"There's no accessToken set.\");\n        }\n    },\n\n    login: function () {\n        Tomahawk.log(\"Starting login\");\n\n        var authUrl = \"https://connect.deezer.com/oauth/auth.php\";\n        authUrl += \"?app_id=\" + this.appId;\n        authUrl += \"&redirect_uri=\" + encodeURIComponent(this.redirectUri);\n        authUrl += \"&perms=offline_access\";\n        authUrl += \"&response_type=token\";\n\n        var that = this;\n\n        var params = {\n            url: authUrl\n        };\n        return Tomahawk.NativeScriptJobManager.invoke(\"showWebView\", params).then(\n            function (result) {\n                var error = that._getParameterByName(result.url, \"error_reason\");\n                if (error) {\n                    Tomahawk.log(\"Authorization failed: \" + error);\n                    return error;\n                } else {\n                    Tomahawk.log(\"Authorization successful, received new access token ...\");\n                    that.accessToken = that._getParameterByName(result.url, \"access_token\");\n                    that.accessTokenExpires = that._getParameterByName(result.url, \"expires\");\n                    Tomahawk.localStorage.setItem(that.storageKeyAccessToken, that.accessToken);\n                    Tomahawk.localStorage.setItem(that.storageKeyAccessTokenExpires,\n                        that.accessTokenExpires);\n                    return TomahawkConfigTestResultType.Success;\n                }\n            });\n    },\n\n    logout: function () {\n        Tomahawk.localStorage.removeItem(this.storageKeyAccessToken);\n        return TomahawkConfigTestResultType.Logout;\n    },\n\n    isLoggedIn: function () {\n        var accessToken = Tomahawk.localStorage.getItem(this.storageKeyAccessToken);\n        return accessToken !== null && accessToken.length > 0;\n    },\n\n    /**\n     * Returns the value of the query parameter with the given name from the given URL.\n     */\n    _getParameterByName: function (url, name) {\n        name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n        var regex = new RegExp(\"[\\\\?&#]\" + name + \"=([^&#]*)\"), results = regex.exec(url);\n        return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n    },\n\n    init: function () {\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n\n        this.accessToken = Tomahawk.localStorage.getItem(this.storageKeyAccessToken);\n        this.accessTokenExpires = Tomahawk.localStorage.getItem(this.storageKeyAccessTokenExpires);\n    },\n\n    resolve: function (params) {\n        var artist = params.artist;\n        var album = params.album;\n        var track = params.track;\n\n        var that = this;\n\n        var queryPart;\n        if (artist) {\n            queryPart = artist + \" \" + track;\n        } else {\n            queryPart = track;\n        }\n        var query = \"http://api.deezer.com/search?q=\" + encodeURIComponent(queryPart)\n            + \"&limit=100\";\n        return Tomahawk.get(query).then(function (response) {\n            var results = [];\n            for (var i = 0; i < response.data.length; i++) {\n                var item = response.data[i];\n                if (item.type == 'track' && item.readable) {\n                    results.push({\n                        source: that.settings.name,\n                        artist: item.artist.name,\n                        track: item.title,\n                        duration: item.duration,\n                        url: \"deezer://track/\" + item.id,\n                        album: item.album.title,\n                        linkUrl: item.link\n                    });\n                }\n            }\n            return results;\n        });\n    },\n\n    search: function (params) {\n        var query = params.query;\n\n        return this.resolve({\n            track: query\n        });\n    },\n\n    canParseUrl: function (params) {\n        var url = params.url;\n        var type = params.type;\n\n        if (!url) {\n            throw new Error(\"Provided url was empty or null!\");\n        }\n        switch (type) {\n            case TomahawkUrlType.Album:\n                return /https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)album\\//.test(url);\n            case TomahawkUrlType.Artist:\n                return /https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)artist\\//.test(url);\n            case TomahawkUrlType.Playlist:\n                return /https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)playlist\\//.test(url);\n            case TomahawkUrlType.Track:\n                return /https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)track\\//.test(url);\n            // case TomahawkUrlType.Any:\n            default:\n                return /https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)/.test(url);\n        }\n    },\n\n    lookupUrl: function (params) {\n        var url = params.url;\n        Tomahawk.log(\"lookupUrl: \" + url);\n\n        var urlParts = url.split('/').filter(function (item) {\n            return item.length != 0;\n        }).map(decodeURIComponent);\n\n        if (/https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)artist\\//.test(url)) {\n            // We have to deal with an artist\n            var query = 'https://api.deezer.com/2.0/artist/' + urlParts[urlParts.length - 1];\n            return Tomahawk.get(query).then(function (response) {\n                return {\n                    type: Tomahawk.UrlType.Artist,\n                    artist: response.name\n                };\n            });\n        } else if (/https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)playlist\\//.test(url)) {\n            // We have to deal with a playlist.\n            var query = 'https://api.deezer.com/2.0/playlist/' + urlParts[urlParts.length - 1];\n            return Tomahawk.get(query).then(function (res) {\n                var query2 = 'https://api.deezer.com/2.0/playlist/' + res.creator.id;\n                return Tomahawk.get(query2).then(function (res2) {\n                    return {\n                        type: Tomahawk.UrlType.Playlist,\n                        title: res.title,\n                        guid: \"deezer-playlist-\" + res.id.toString(),\n                        info: \"A playlist by \" + res2.name + \" on Deezer.\",\n                        creator: res2.name,\n                        linkUrl: res.link,\n                        tracks: res.tracks.data.map(function (item) {\n                            return {\n                                type: Tomahawk.UrlType.Track,\n                                track: item.title,\n                                artist: item.artist.name\n                            };\n                        })\n                    };\n                });\n            });\n        } else if (/https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)track\\//.test(url)) {\n            // We have to deal with a track.\n            var query = 'https://api.deezer.com/2.0/track/' + urlParts[urlParts.length - 1];\n            return Tomahawk.get(query).then(function (res) {\n                return {\n                    type: Tomahawk.UrlType.Track,\n                    track: res.title,\n                    artist: res.artist.name\n                };\n            });\n        } else if (/https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)album\\//.test(url)) {\n            // We have to deal with an album.\n            var query = 'https://api.deezer.com/2.0/album/' + urlParts[urlParts.length - 1];\n            return Tomahawk.get(query).then(function (res) {\n                return {\n                    type: Tomahawk.UrlType.Album,\n                    album: res.title,\n                    artist: res.artist.name\n                };\n            });\n        }\n    }\n});\n\nTomahawk.resolver.instance = DeezerResolver;\n\nTomahawk.PluginManager.registerPlugin('infoPlugin', {\n\n    _convertArtist: function (artist) {\n        var result = {\n            id: \"\",\n            artist: \"\",\n            bio: \"\",\n            images: [],\n            tracks: [],\n            albums: [],\n            similar: []\n        };\n        if (artist) {\n            if (typeof artist == 'string' || artist instanceof String) {\n                result.artist = artist;\n            } else {\n                result.id = artist.id;\n                result.artist = artist.name;\n                if (artist.picture_medium) {\n                    result.images.push({url: artist.picture_medium});\n                }\n                if (artist.picture_xl) {\n                    result.images.push({url: artist.picture_xl});\n                } else if (artist.picture_big) {\n                    result.images.push({url: artist.picture_big});\n                }\n            }\n        }\n        return result;\n    },\n\n    _convertArtists: function (artists) {\n        var that = this;\n\n        var result = [];\n        if (artists) {\n            artists.forEach(function (artist) {\n                result.push(that._convertArtist(artist));\n            });\n        }\n        return result;\n    },\n\n    _convertAlbum: function (album, artistName) {\n        var result = {\n            id: \"\",\n            album: \"\",\n            artist: this._convertArtist(),\n            composer: \"\",\n            date: 0,     // in Unix time\n            genre: \"\",\n            images: []  // list of album image urls (low res first)\n        };\n        if (album) {\n            result.id = album.id;\n            result.album = album.title;\n            result.artist = artistName ?\n                this._convertArtist(artistName) : this._convertArtist(album.artist);\n            if (album.cover_medium) {\n                result.images.push({url: album.cover_medium});\n            }\n            if (album.cover_xl) {\n                result.images.push({url: album.cover_xl});\n            } else if (album.cover_big) {\n                result.images.push({url: album.cover_big});\n            }\n        }\n        return result;\n    },\n\n    _convertAlbums: function (albums, artistName) {\n        var that = this;\n\n        var result = [];\n        if (albums) {\n            albums.forEach(function (album) {\n                result.push(that._convertAlbum(album, artistName));\n            });\n        }\n        return result;\n    },\n\n    _convertTracks: function (tracks) {\n        var that = this;\n\n        var result = [];\n        if (tracks) {\n            tracks.forEach(function (track) {\n                result.push({\n                    id: track.id,\n                    track: track.title,\n                    artist: that._convertArtist(track.artist),\n                    album: that._convertAlbum(track.album),\n                    composer: \"\",\n                    date: 0,        // in Unix time\n                    genre: \"\",\n                    number: 0,\n                    discnumber: 0,\n                    bitrate: 0,     // in kbps\n                    duration: track.duration,    // in ms\n                    samplerate: 0,  // in hz\n                    filesize: 0,    // in kb\n                    bpm: 0,\n                    lyrics: \"\",\n                    similar: []     // list of similar track's ids\n                });\n            });\n        }\n        return result;\n    },\n\n    search: function (params) {\n        var that = this;\n\n        var query = params.query;\n        var suggestions = params.suggestions;\n\n        var artistUrl = 'http://api.deezer.com/search/artist';\n        var artistSettings = {\n            data: {\n                q: query\n            }\n        };\n        if (suggestions) {\n            artistSettings.limit = 3;\n        }\n        var albumUrl = 'http://api.deezer.com/search/album';\n        var albumSettings = {\n            data: {\n                q: query\n            }\n        };\n        if (suggestions) {\n            albumSettings.limit = 1;\n        }\n        var promises = [\n            Tomahawk.get(artistUrl, artistSettings),\n            Tomahawk.get(albumUrl, albumSettings)\n        ];\n        return RSVP.all(promises).then(function (results) {\n            return {\n                artists: that._convertArtists(results[0].data),\n                albums: that._convertAlbums(results[1].data)\n            };\n        });\n    },\n\n    artist: function (params) {\n        var that = this;\n\n        var id = params.id;\n        var artistName = params.artist;\n\n        var artistPromise;\n        if (id) {\n            artistPromise = that._artistById(id);\n        } else {\n            var artistUrl = 'http://api.deezer.com/search/artist';\n            var artistSettings = {\n                data: {\n                    q: artistName,\n                    limit: 20\n                }\n            };\n            artistPromise = Tomahawk.get(artistUrl, artistSettings).then(function (response) {\n                var artist = null;\n                if (response.data) {\n                    for (var i = 0; i < response.data.length; i++) {\n                        var rawArtist = response.data[i];\n                        if (rawArtist.name == artistName) {\n                            artist = that._convertArtist(rawArtist);\n                            break;\n                        }\n                    }\n                }\n                if (artist == null) {\n                    artist = that._convertArtist();\n                }\n                return artist;\n            })\n        }\n        return artistPromise.then(function (result) {\n            if (params.short || !result.id) {\n                return result;\n            } else {\n                var promises = [];\n\n                var topTracksUrl = 'http://api.deezer.com/artist/' + result.id + \"/top\";\n                var topTracksSettings = {\n                    data: {\n                        limit: 50\n                    }\n                };\n                promises.push(Tomahawk.get(topTracksUrl, topTracksSettings)\n                    .then(function (response) {\n                        return that._convertTracks(response.data);\n                    }));\n\n                var albumsUrl = 'http://api.deezer.com/artist/' + result.id + \"/albums\";\n                var albumsSettings = {\n                    data: {\n                        limit: 50\n                    }\n                };\n                promises.push(Tomahawk.get(albumsUrl, albumsSettings)\n                    .then(function (response) {\n                        return that._convertAlbums(response.data, result.artist);\n                    }));\n\n                return RSVP.all(promises).then(function (results) {\n                    result.tracks = results[0];\n                    result.albums = results[1];\n                    return result;\n                });\n            }\n        });\n    },\n\n    _artistById: function (id) {\n        var that = this;\n\n        var artistUrl = 'http://api.deezer.com/artist/' + id;\n        return Tomahawk.get(artistUrl).then(function (response) {\n            return that._convertArtist(response);\n        });\n    },\n\n    album: function (params) {\n        var that = this;\n\n        var id = params.id;\n        var artistName = params.artist;\n        var albumName = params.album;\n\n        if (id) {\n            return that._albumById(id);\n        }\n\n        var albumUrl = 'http://api.deezer.com/search/album';\n        var albumSettings = {\n            data: {\n                q: artistName + \" \" + albumName,\n                limit: 20\n            }\n        };\n        return Tomahawk.get(albumUrl, albumSettings).then(function (response) {\n            var album = null;\n            if (response.data) {\n                for (var i = 0; i < response.data.length; i++) {\n                    var rawAlbum = response.data[i];\n                    if (rawAlbum.title == albumName && rawAlbum.artist.name == artistName) {\n                        album = that._convertAlbum(rawAlbum);\n                        break;\n                    }\n                }\n            }\n            if (album == null) {\n                album = that._convertAlbum();\n            }\n            return album;\n        }).then(function (result) {\n            if (params.short || !result.id) {\n                return result;\n            } else {\n                var tracksUrl = 'http://api.deezer.com/album/' + result.id + \"/tracks\";\n                return Tomahawk.get(tracksUrl).then(function (response) {\n                    Tomahawk.log(\"album not short request: \" + response.data.length);\n                    result.tracks = that._convertTracks(response.data);\n                    if (response.data.length > 0) {\n                        Tomahawk.log(\n                            \"album not short request2: \" + JSON.stringify(response.data[0]));\n                        Tomahawk.log(\n                            \"album not short request3: \" + JSON.stringify(result.tracks[0]));\n                    }\n                    return result;\n                })\n            }\n        });\n    },\n\n    _albumById: function (id) {\n        var that = this;\n\n        var albumUrl = 'http://api.deezer.com/album/' + id;\n        return Tomahawk.get(albumUrl).then(function (response) {\n            var album = that._convertAlbum(response);\n            if (response.tracks) {\n                album.tracks = that._convertTracks(response.tracks.data);\n            }\n            return album;\n        });\n    }\n\n});\n"
  },
  {
    "path": "deezer/content/metadata.json",
    "content": "{\n    \"name\": \"Deezer\",\n    \"pluginName\": \"deezer\",\n    \"author\": \"Uwe and Enno\",\n    \"email\": \"uwelk@xhochy.com\",\n    \"version\": \"0.2.2\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Stream music with Deezer. Premium Deezer account required.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/deezer.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/deezer.png\"\n        ]\n    }\n}\n"
  },
  {
    "path": "deezer-metadata/content/contents/code/deezer-metadata.js",
    "content": "/*\n *   Copyright 2013,      Uwe L. Korn <uwelk@xhochy.com>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n\nvar DeezerMetadataResolver = Tomahawk.extend(TomahawkResolver, {\n    settings: {\n        name: 'Deezer Metadata',\n        icon: 'deezer-metadata.png',\n        weight: 0, // We cannot resolve, so use minimum weight\n        timeout: 15\n    },\n\n\tinit: function() {\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n\t},\n\n\n    resolve: function (qid, artist, album, title) {\n        Tomahawk.addTrackResults({ results: [], qid: qid });\n    },\n\n\tsearch: function (qid, searchString) {\n        Tomahawk.addTrackResults({ results: [], qid: qid });\n\t},\n\n    canParseUrl: function (url, type) {\n        switch (type) {\n        case TomahawkUrlType.Album:\n            return /https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)album\\//.test(url);\n        case TomahawkUrlType.Artist:\n            return /https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)artist\\//.test(url);\n        case TomahawkUrlType.Playlist:\n            return /https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)playlist\\//.test(url);\n        case TomahawkUrlType.Track:\n            return /https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)track\\//.test(url);\n        // case TomahawkUrlType.Any:\n        default:\n            return /https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)/.test(url);\n        }\n    },\n\n    lookupUrl: function (url) {\n\t\tvar that = this;\n        var urlParts = url.split('/').filter(function (item) { return item.length != 0; }).map(decodeURIComponent);\n        if (/https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)artist\\//.test(url)) {\n            // We have to deal with an artist\n            var query = 'https://api.deezer.com/2.0/artist/' + urlParts[urlParts.length - 1];\n            Tomahawk.asyncRequest(query, function (xhr) {\n                var res = JSON.parse(xhr.responseText);\n                Tomahawk.addUrlResult(url, {\n                    type: \"artist\",\n                    name: res.name\n                });\n            });\n        } else if (/https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)playlist\\//.test(url)) {\n            // We have to deal with an album.\n            var query = 'https://api.deezer.com/2.0/playlist/' + urlParts[urlParts.length - 1];\n            Tomahawk.log(query);\n            Tomahawk.asyncRequest(query, function (xhr) {\n                var res = JSON.parse(xhr.responseText);\n                var query2 = 'https://api.deezer.com/2.0/playlist/' + res.creator.id;\n                Tomahawk.log(query2);\n                Tomahawk.asyncRequest(query2, function (xhr2) {\n                    var res2 = JSON.parse(xhr2.responseText);\n                    var result = {\n                        type: \"playlist\",\n                        title: res.title,\n                        guid: \"deezer-playlist-\" + res.id.toString(),\n                        info: \"A playlist by \" + res2.name + \" on Deezer.\",\n                        creator: res2.name,\n                        url: res.link,\n                        tracks: []\n                    };\n                    result.tracks = res.tracks.data.map(function (item) { return { type: \"track\", title: item.title, artist: item.artist.name }; });\n                    Tomahawk.addUrlResult(url, result);\n                });\n            });\n        } else if (/https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)track\\//.test(url)) {\n            // We have to deal with an album.\n            var query = 'https://api.deezer.com/2.0/track/' + urlParts[urlParts.length - 1];\n            Tomahawk.asyncRequest(query, function (xhr) {\n                var res = JSON.parse(xhr.responseText);\n                Tomahawk.addUrlResult(url, {\n                    type: \"track\",\n                    title: res.title,\n                    artist: res.artist.name,\n                });\n            });\n        } else if (/https?:\\/\\/(www\\.)?deezer.com\\/([^\\/]*\\/|)album\\//.test(url)) {\n            // We have to deal with an album.\n            var query = 'https://api.deezer.com/2.0/album/' + urlParts[urlParts.length - 1];\n            Tomahawk.asyncRequest(query, function (xhr) {\n                var res = JSON.parse(xhr.responseText);\n                Tomahawk.addUrlResult(url, {\n                    type: \"album\",\n                    name: res.title,\n                    artist: res.artist.name,\n                });\n            });\n        }\n    }\n});\n\nTomahawk.resolver.instance = DeezerMetadataResolver;\n\n"
  },
  {
    "path": "deezer-metadata/content/metadata.json",
    "content": "{\n    \"name\": \"Deezer Metadata\",\n    \"pluginName\": \"deezer-metadata\",\n    \"author\": \"Uwe L. Korn\",\n    \"email\": \"uwelk@xhochy.com\",\n    \"version\": \"0.1.3\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"(0.8+) Supports loading and drag and drop of Deezer URLs.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/deezer-metadata.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/deezer-metadata.png\"\n        ]\n    }\n}\n"
  },
  {
    "path": "docs/.gitignore",
    "content": "/site/\n"
  },
  {
    "path": "docs/docs/basic.md",
    "content": "# Basic structure of a resolver\n\nA resolver is made up of three parts: metadata, code and styling.\nThe styling of a resolver is mostly limited to an icon and the description of the UI for a possible login/settings screen.\nMetadata like the name and version of the resolver is stored in a file called `metadata.json`.\nThe remaing (major) component is its code which will be used to connect a music service to Tomahawk's API.\n\nThese components are organized in the following directory structure:\n\n```\n<resolver>\n ↳ content\n  ↳ metadata.json\n  ↳ contents\n    ↳ code\n      ↳ resolver.js\n      ↳ … .js\n    ↳ images\n      ↳ icon.png\n```\n\n## Metadata\n\nIn the metadata we describe the basic information of the resolver which needs to be accessible without invoking the resolver's code.\nThis includes the name and the icon shown to the user in the list of available plug-ins but also the information on which files need to be loaded to execute the code.\n\n```javascript\n{\n\t\"name\": \"MusicService\",\n\t\"pluginName\": \"musicservice\",\n\t\"author\": \"Some Guy\",\n\t\"email\": \"author@example.com\",\n\t\"version\": \"9.9.9\",\n\t\"website\": \"http://gettomahawk.com\",\n\t\"description\": \"Returns example tracks for demonstation.\",\n\t\"type\": \"resolver/javascript\",\n\t\"manifest\": {\n\t\t\"main\": \"contents/code/resolver.js\",\n\t\t\"scripts\": [],\n\t\t\"icon\": \"contents/images/icon.png\",\n\t\t\"resources\": [\n\t\t\t\"contents/images/another-icon.png\"\n\t\t]\n\t}\n}\n```\n\n## Code\n"
  },
  {
    "path": "docs/docs/index.md",
    "content": "# Tomahawk Resolvers API\n\nThis documentation describes the [Tomahawk](https://www.tomahawk-player.org/) Resolver API, an API for uniform access to different music sources.\nAlthough the main and initial purpose of the API was to provide source-independent streaming of music content for the desktop app, it evolved to general abstraction for music services that is used as part of *Tomahawk Desktop*, *Tomahawk Android* and are available in your [node.js/io.js environment](https://github.com/xhochy/node-tomahawkjs).\n\n## The Idea\n\nYou can think of a *resolver* as being an adapter that at one site implements the service-indenpendent Tomahawk API and translates the requests coming from there to the native API calls of a music service.\nCommonly the API functions in Tomahawk are a bit higher-level than those provided by the music service, thus a single call on the Tomahawk site may result in a small number of API calls to the music service (in most cases you'll end up doing only 1-2 calls).\n\nAs the Resolver API is the same across different music services, you can use the API to build music-related apps that are agnostic of the underlying service.\nThis enables you to build an app that can support different services or move from one underlying service to another without any major code changes.\n\n## Getting Started\n\n**TODO**\n\n## API Documentation\n\n**TODO**\n\n"
  },
  {
    "path": "docs/docs/searchresolve.md",
    "content": "# Implementing Searching and Resolving\n"
  },
  {
    "path": "docs/docs/urllookup.md",
    "content": "# Looking up URLs\n"
  },
  {
    "path": "docs/mkdocs.yml",
    "content": "site_name: Tomahawk Resolvers API\nsite_favicon: favicon.png\nrepo_url: https://github.com/tomahawk-player/tomahawk-resolvers\npages:\n    - [index.md, Index]\n    - [basic.md, Basic Structure]\n    - [searchresolve.md, Search and Resolve]\n    - [urllookup.md, URL Lookup]\ntheme: readthedocs\n"
  },
  {
    "path": "examples/javascript/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>250</width>\n    <height>153</height>\n   </rect>\n  </property>\n  <property name=\"sizePolicy\">\n   <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Minimum\">\n    <horstretch>0</horstretch>\n    <verstretch>0</verstretch>\n   </sizepolicy>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>250</width>\n    <height>153</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <widget class=\"QLabel\" name=\"example_textview\">\n     <property name=\"text\">\n      <string>Some very important text...</string>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\n     <property name=\"openExternalLinks\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLineEdit\" name=\"example_textfield\">\n     <property name=\"placeholderText\">\n      <string>Username</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLineEdit\" name=\"example_textfield_password\">\n     <property name=\"echoMode\">\n      <enum>QLineEdit::Password</enum>\n     </property>\n     <property name=\"placeholderText\">\n      <string>Password</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QCheckBox\" name=\"example_checkbox\">\n     <property name=\"text\">\n      <string>Maybe the best checkbox</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n     <item>\n      <widget class=\"QLabel\" name=\"label_3\">\n       <property name=\"text\">\n        <string>Doge dropdown</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"example_dropdown\">\n       <item>\n        <property name=\"text\">\n         <string>Such dropdown</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>Many amaze</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>Wow</string>\n        </property>\n       </item>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "examples/javascript/content/contents/code/example.js",
    "content": "var ExampleResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9, // Tell Tomahawk that this is a promise-based Resolver implementation\n\n    /**\n     * Static Resolver settings\n     */\n    settings: {\n        name: 'Example Resolver', // The pretty name of this Resolver\n\n        weight: 75,               // The weight describes how good results of this Resolver are in\n                                  // comparison to other Resolvers (0-100). A subscription Resolver\n                                  // like Spotify might set this to 95, while Soundcloud only has a\n                                  // weight of 85.\n\n        timeout: 5                // The timeout-value (in seconds) determines how long Tomahawk\n                                  // waits for a result from this Resolver after having called\n                                  // resolve or search.\n    },\n\n    /**\n     * Defines this Resolver's config dialog UI.\n     */\n    configUi: [\n        {\n            id: \"example_textview\",\n            type: \"textview\",\n            text: \"Some very important text...\"\n        },\n        {\n            id: \"example_textfield\",\n            type: \"textfield\",\n            label: \"Username\",\n            defaultValue: \"admin\"\n        },\n        {\n            id: \"example_textfield_password\",\n            type: \"textfield\",\n            label: \"Password\",\n            defaultValue: \"superSafeAdminPassword!!!!0000\",\n            isPassword: true\n        },\n        {\n            id: \"example_checkbox\",\n            type: \"checkbox\",\n            label: \"Maybe the best checkbox\",\n            defaultValue: true\n        },\n        {\n            id: \"example_dropdown\",\n            type: \"dropdown\",\n            label: \"Doge dropdown\",\n            items: [\"Such dropdown\", \"Many amaze\", \"Wow\"],\n            defaultValue: 1\n        }\n    ],\n\n    /**\n     * LEGACY! This is the old way of defining the Resolver's config dialog UI. In the future there\n     * will only be the \"configUi\"-property that provides a proper cross-compatible way of defining\n     * a UI.\n     * Currently both the \"configUi\"-property and this \"getConfigUi\"-function should be implemented.\n     *\n     *\n     * @returns * Map containing information to define this Resolver's config dialog UI.\n     *          Example:\n     *          { widget: Tomahawk.readBase64(\"config.ui\"),     //the file \"config.ui\" defines a Qt UI\n     *            fields: [\n     *                {\n     *                    name: \"example_textfield\",             //name/id of this UI property\n     *                    widget: \"example_textfield\",           //the corresponding UI-widget in config.ui\n     *                    property: \"text\"                      //the type of this UI property\n     *                                                          //can be [text, checked, currentIndex]\n     *                }, {\n     *                    name: \"example_textfield_password\",\n     *                    widget: \"example_textfield_password\",\n     *                    property: \"text\"\n     *                }, {\n     *                    name: \"example_checkbox\",\n     *                    widget: \"example_checkbox\",\n     *                    property: \"checked\"\n     *                }, {\n     *                    name: \"example_dropdown\",\n     *                    widget: \"example_dropdown\",\n     *                    property: \"currentIndex\"\n     *                }\n     *            ] }\n     */\n    getConfigUi: function () {\n        Tomahawk.log(\"getConfigUi called\");\n        return {\n            widget: Tomahawk.readBase64(\"config.ui\"),\n            fields: [{\n                name: \"example_textfield\",\n                widget: \"example_textfield\",\n                property: \"text\"\n            }, {\n                name: \"example_textfield_password\",\n                widget: \"example_textfield_password\",\n                property: \"text\"\n            }, {\n                name: \"example_checkbox\",\n                widget: \"example_checkbox\",\n                property: \"checked\"\n            }, {\n                name: \"example_dropdown\",\n                widget: \"example_dropdown\",\n                property: \"currentIndex\"\n            }]\n        };\n    },\n\n    /**\n     * Always called when this resolver is being loaded in Tomahawk.\n     */\n    init: function () {\n        Tomahawk.log(\"init called\");\n        // initialize some stuff\n        Tomahawk.PluginManager.registerPlugin(\"collection\", exampleCollection);\n        exampleCollection.addTracks({\n            id: exampleCollection.settings.id,\n            tracks: [\n                {\n                    artist: \"Queen\",                            //the artist's name\n                    artistDisambiguation: \"\",                   //allows multiple artists with the same name\n                    albumArtist: \"DJ Queenlover\",               //title of the album\n                    albumArtistDisambiguation: \"\",              //allows multiple albumArtists with the same name\n                    album: \"Compilation of Queen Remixes\",      //title of the album\n                    track: \"We will rock you(remix)\",           //title of the track\n                    url: \"http://x.y/wewillrockyourmx.mp3\",     //URL to stream the track from\n                    duration: \"180\",                            //duration in seconds\n                    linkUrl: \"http://x.y/wewillrockyourmx.html\" //corresponding website link\n                }, {\n                    artist: \"Queen\",\n                    artistDisambiguation: \"\",\n                    albumArtist: \"DJ Queenlover\",\n                    albumArtistDisambiguation: \"\",\n                    album: \"Compilation of Queen Remixes\",\n                    track: \"Bohemian Rhapsody(remix)\",\n                    url: \"http://x.y/bohemianrhapsodyrmx.mp3\",\n                    duration: \"240\",\n                    linkUrl: \"http://x.y/bohemianrhapsodyrmx.html\"\n                }, {\n                    artist: \"DJ Queenlover\",\n                    artistDisambiguation: \"\",\n                    albumArtist: \"DJ Queenlover\",\n                    albumArtistDisambiguation: \"\",\n                    album: \"Compilation of Queen Remixes\",\n                    track: \"My own great song\",\n                    url: \"http://x.y/myowngreatsong.mp3\",\n                    duration: \"360\",\n                    linkUrl: \"http://x.y/myowngreatsong.html\"\n                }, {\n                    artist: \"Queen\",\n                    artistDisambiguation: \"\",\n                    albumArtist: \"Queen\",\n                    albumArtistDisambiguation: \"\",\n                    album: \"A Kind of Magic\",\n                    track: \"Who Wants to Live Forever\",\n                    url: \"http://x.y/whowantstoliveforever.mp3\",\n                    duration: \"180\",\n                    linkUrl: \"http://x.y/whowantstoliveforever.html\"\n                }, {\n                    artist: \"The Rolling Stones\",\n                    artistDisambiguation: \"\",\n                    albumArtist: \"The Rolling Stones\",\n                    albumArtistDisambiguation: \"\",\n                    album: \"Dirty Work\",\n                    track: \"One Hit (To the Body)\",\n                    url: \"http://x.y/onehittothebody.mp3\",\n                    duration: \"240\",\n                    linkUrl: \"http://x.y/onehittothebody.html\"\n                }, {\n                    artist: \"The Rolling Stones\",\n                    artistDisambiguation: \"\",\n                    albumArtist: \"The Rolling Stones\",\n                    albumArtistDisambiguation: \"\",\n                    album: \"Steel Wheels\",\n                    track: \"Sad Sad Sad\",\n                    url: \"http://x.y/sadsadsad.mp3\",\n                    duration: \"360\",\n                    linkUrl: \"http://x.y/sadsadsad.html\"\n                }\n            ]\n        });\n    },\n\n    /**\n     * Whenever a new config has been saved this function is being called.\n     * This happens normally when the user clicks \"OK\" in the Resolver config dialog.\n     *\n     *\n     * @param newConfig A map containing the newly saved config values. The structure depends on\n     *                  this Resolver's UI definition. The ids of the different UI elements are\n     *                  being used to reference the values.\n     */\n    newConfigSaved: function (newConfig) {\n        Tomahawk.log(\"newConfigSaved called - params: \" + JSON.stringify(newConfig));\n        var username = newConfig.example_textfield;\n        var password = newConfig.example_textfield_password;\n        var checkboxChecked = newConfig.example_checkbox;\n        var dropdownItemSelected = newConfig.example_dropdown;\n\n        Tomahawk.log(\"newConfigSaved - username: \" + username);\n        Tomahawk.log(\"newConfigSaved - password: \" + password);\n        Tomahawk.log(\"newConfigSaved - checkboxChecked: \" + checkboxChecked);\n        Tomahawk.log(\"newConfigSaved - dropdownItemSelected: \" + dropdownItemSelected);\n    },\n\n    /**\n     * Check whether or not the service accepts the given config. For Resolvers that require logging\n     * into a service this normally means that the credentials are being send to the server in order\n     * to test if they're valid. For media-server Resolvers like Ampache this function should test\n     * whether or not the given server-URL is reachable. Other Resolvers might simply want to verify\n     * if the given config is valid (e.g. check that values aren't out of range or don't contain\n     * invalid characters)\n     *\n     *\n     * @param config Map containing the current config values to test. The structure depends on this\n     *               Resolver's UI definition. The ids of the different UI elements are being used\n     *               to reference the values.\n     *\n     *\n     * @returns Type (See Tomahawk.ConfigTestResultType) containing the result of the test or a\n     *          custom error message.\n     *          Before you use a custom error message though, please have a look at the other types\n     *          and use the standard types whenever you can. Standard error messages are translated\n     *          into many different languages and provide a consistent wording when notifying the\n     *          user.\n     */\n    testConfig: function (config) {\n        Tomahawk.log(\"testConfig called - params: \" + JSON.stringify(config));\n        var username = config.example_textfield;\n\n        var data = {\n            data: {\n                q: encodeURIComponent(username)\n            }\n        };\n        return Tomahawk.get(\"http://www.google.de\", data).then(function (result) {\n            Tomahawk.log(\"testConfig - returned Tomahawk.ConfigTestResultType.Success\");\n            return Tomahawk.ConfigTestResultType.Success;\n        }, function (xhr) {\n            if (xhr.status == 401) {\n                Tomahawk.log(\"testConfig - returned Tomahawk.ConfigTestResultType.InvalidCredentials\");\n                return Tomahawk.ConfigTestResultType.InvalidCredentials;\n            } else {\n                Tomahawk.log(\"testConfig - returned custom error message\");\n                return \"Some special error has happened that is not covered by any type in \"\n                    + \"Tomahawk.ConfigTestResultType! Here's what happened and how you can resolve\"\n                    + \"this issue :)\";\n            }\n        });\n    },\n\n    /**\n     * Resolve the track described by the given params-map.\n     * Searches for the best results and parses them into the standard result format.\n     *\n     *\n     * @param params A map containing all of the necessary parameters describing the track to find a\n     *               playable result for.\n     *\n     *               Example:\n     *               { artist: \"Queen\",                         //the artist's name\n     *                 album: \"Greatest Hits\",                  //title of the album\n     *                 track: \"We will rock you\" }              //title of the track\n     *\n     *\n     * @returns An array of results containing all information so that Tomahawk is able to display\n     *          and play the tracks.\n     *\n     *          An example of a single standardized result in the results-array:\n     *          { artist: \"Queen\",                              //the artist's name\n     *            album: \"The Greatest Hits\",                   //title of the album\n     *            track: \"We will rock you\",                    //title of the track\n     *            url: \"http://x.y/wewillrockyou.mp3\",          //URL to stream the track from\n     *            duration: \"180\",                              //duration in seconds\n     *            linkUrl: \"http://x.y/wewillrockyou.html\" }    //corresponding website link\n     */\n    resolve: function (params) {\n        Tomahawk.log(\"resolve called - params: \" + JSON.stringify(params));\n        var artist = params.artist;\n        var album = params.album;\n        var track = params.track;\n\n        var data = {\n            data: {\n                q: encodeURIComponent(artist + \" \" + track)\n            }\n        };\n        return Tomahawk.get(\"http://www.google.de\", data).then(function (results) {\n            return [{\n                artist: \"Queen\",                                //the artist's name\n                album: \"The Greatest Hits\",                     //title of the album\n                track: \"We will rock you\",                      //title of the track\n                url: \"http://x.y/wewillrockyou.mp3\",            //URL to stream the track from\n                duration: \"180\",                                //duration in seconds\n                linkUrl: \"http://x.y/wewillrockyou.html\"        //corresponding website link\n            }];\n        }, function (xhr) {\n            Tomahawk.log(\"resolve - Error(\\\"Sry, couldn't get results\\\")\");\n            throw new Error(\"Sry, couldn't get results\");\n        });\n    },\n\n    /**\n     * Searches for tracks with the given query-string and parses the results into the standard\n     * result format.\n     *\n     *\n     * @param params Map containing the query-string with which to search for tracks.\n     *\n     *               Example:\n     *               { query: \"Queen we will rock you\" }        //query-string to search with\n     *\n     *\n     * @returns An array of results containing all information so that Tomahawk is able to display\n     *          and play the tracks.\n     *\n     *          An example of a single standardized result in the results-array:\n     *          { artist: \"Queen\",                              //the artist's name\n     *            album: \"The Greatest Hits\",                   //title of the album\n     *            track: \"We will rock you\",                    //title of the track\n     *            url: \"http://x.y/wewillrockyou.mp3\",          //URL to stream the track from\n     *            duration: \"180\",                              //duration in seconds\n     *            linkUrl: \"http://x.y/wewillrockyou.html\" }    //corresponding website link\n     */\n    search: function (params) {\n        Tomahawk.log(\"search called - params: \" + JSON.stringify(params));\n        var query = params.query;\n\n        var data = {\n            data: {\n                q: encodeURIComponent(query)\n            }\n        };\n        return Tomahawk.get(\"http://www.google.de\", data).then(function (results) {\n            return [{\n                artist: \"Queen\",                                //the artist's name\n                album: \"The Greatest Hits\",                     //title of the album\n                track: \"We will rock you\",                      //title of the track\n                url: \"http://x.y/wewillrockyou.mp3\",            //URL to stream the track from\n                duration: \"180\",                                //duration in seconds\n                linkUrl: \"http://x.y/wewillrockyou.html\"        //corresponding website link\n            }];\n        }, function (xhr) {\n            Tomahawk.log(\"resolve - Error(\\\"Sry, couldn't get results\\\")\");\n            throw new Error(\"Sry, couldn't get results\");\n        });\n    },\n\n    /***********************************************************************************************\n     *                                                                                             *\n     *                              Optional URL-translation function                              *\n     *                                                                                             *\n     **********************************************************************************************/\n\n    /**\n     * Translate the given URL-string into a playable URL-String.\n     * Some services (especially those that require a subscription) don't directly provide a link to\n     * let's say an mp3-file. Instead they'll give out some sort of id that identifies a particular\n     * track on their service. If we now want to play this track, we have to ask the service to\n     * hand out some sort of link that we can stream the audio data from. That's what this function\n     * does.\n     *\n     *\n     * @param params Map containing the URL-String that identifies the track we want to play back\n     *\n     *        Example:\n     *        { url: \"exampleresolver://752078502200\" }    //URL-String that identifies the track\n     *\n     *\n     * @returns String which contains the translated and playable URL.\n     *\n     */\n    getStreamUrl: function (params) {\n        Tomahawk.log(\"getStreamUrl called - params: \" + JSON.stringify(params));\n        var url = params.url;\n\n        var data = {\n            data: {\n                q: encodeURIComponent(url)\n            }\n        };\n        return Tomahawk.get(\"http://www.google.de\", data).then(function (result) {\n            Tomahawk.log(\"getStreamUrl - returned \\\"http://x.y/wewillrockyou.mp3\\\"\");\n            return {\n                url: \"http://x.y/wewillrockyou.mp3\"       //URL from which we can stream the track\n            };\n        });\n    },\n\n    /***********************************************************************************************\n     *                                                                                             *\n     *                               Optional URL-parsing functions                                *\n     *                                                                                             *\n     **********************************************************************************************/\n\n    /**\n     * Determines whether or not this Resolver can parse the given URL-string.\n     *\n     *\n     * @param params Map containing the URL-String and a type that defines into what kind of\n     *               result the URL-string should be parsable.\n     *\n     *               Example:\n     *               { url: \"https://hatchet.is/music/Queen/_/We%20Will%20Rock%20You\", //the URL-String\n     *                 type: Tomahawk.UrlType.Track }                                  //the type (see Tomahawk.UrlType)\n     *\n     *\n     * @returns Boolean indicating if the given URL-String is parsable.\n     */\n    canParseUrl: function (params) {\n        Tomahawk.log(\"canParseUrl called - params: \" + JSON.stringify(params));\n        var url = params.url;\n        var type = params.type;\n\n        if (!url) {\n            Tomahawk.log(\"canParseUrl - Error(\\\"The given URL-String is null or empty!\\\"\");\n            throw new Error(\"The given URL-String is null or empty!\");\n        }\n        var result;\n        switch (type) {\n            case TomahawkUrlType.Album:\n                result = /^https?:\\/\\/(www\\.)?hatchet\\.is\\/music\\/[^\\/\\n]+\\/[^\\/\\n]+$/.test(url);\n                break;\n            case TomahawkUrlType.Artist:\n                result = /^https?:\\/\\/(www\\.)?hatchet\\.is\\/music\\/[^\\/\\n][^\\/\\n_]+$/.test(url);\n                break;\n            case TomahawkUrlType.Track:\n                result = /^https?:\\/\\/(www\\.)?hatchet\\.is\\/music\\/[^\\/\\n]+\\/_\\/[^\\/\\n]+$/.test(url);\n                break;\n            case TomahawkUrlType.Playlist:\n                result\n                    = /^https?:\\/\\/(www\\.)?hatchet\\.is\\/people\\/[^\\/\\n]+\\/playlists\\/[^\\/\\n]+$/.test(url);\n                break;\n            default:\n                Tomahawk.log(\"canParseUrl - Error(\\\"Invalid type!\\\"\");\n                throw new Error(\"Invalid type!\");\n        }\n        Tomahawk.log(\"canParseUrl - returned \" + result);\n    },\n\n    /**\n     * Looks up the given URL-String on some service and fetches the track's metadata. Then that\n     * metadata is being parsed into the standardized format so that Tomahawk can use the\n     * information to display the track and search for sources through every available Resolver.\n     *\n     *\n     * @param params Map containing the URL-String\n     *\n     *               Examples:\n     *               { url: \"https://hatchet.is/music/Queen/_/We%20Will%20Rock%20You\" } //the URL-String\n     *               { url: \"https://hatchet.is/people/mrmaffen/playlists/509e81298651fd9ee3e81a7b_53f136f32484f2119f0077d4\" }    //the URL-String\n     *\n     *\n     * @returns * Map containing a type (see Tomahawk.UrlType) and the parsed metadata.\n     *\n     *          Example 1 (track result):\n     *          { type: Tomahawk.UrlType.Track,                              // the result's type\n     *            track: \"We will rock you\",                                 // the track's title\n     *            artist: \"Queen\",                                           // the artist's name\n     *            album: \"Greatest Hits\" }                                   // the album's title\n     *\n     *          Example 2 (playlist result):\n     *          { type: Tomahawk.UrlType.Playlist,                           // the result's type\n     *            title: \"Boys Noize\",                                       // the playlist's title\n     *            guid: \"509e81298651fd9ee3e81a7b_53f136f32484f2119f0077d4\", // a unique id that identifies this playlist\n     *            info: \"A playlist on Hatchet.\",                            // a description of this playlist\n     *            creator: \"mrmaffen\",                                       // the creator of this playlist\n     *            linkUrl: \"https://hatchet.is/people/mrmaffen/playlists\",   // the URL to a website showing this playlist\n     *            tracks: [...] }                                            // array of this playlist's tracks (see Example 1)\n     *\n     *          Example 3 (xspf-playlist result):\n     *          { type: Tomahawk.UrlType.XspfPlaylist,                       // the result's type\n     *            url: \"http://x.y/bestofqueen.xspf\" }                       // the link to the .xspf-file\n     */\n    lookupUrl: function (params) {\n        Tomahawk.log(\"lookupUrl called - params: \" + JSON.stringify(params));\n        var url = params.url;\n\n        var urlParts =\n            url.split('/').filter(function (item) {\n                return item.length != 0;\n            }).map(function (s) {\n                return decodeURIComponent(s.replace(/\\+/g, '%20'));\n            });\n        if (/^https?:\\/\\/(www\\.)?hatchet\\.is\\/music\\/[^\\/\\n]+\\/[^\\/\\n]+$/.test(url)) {\n            Tomahawk.log(\"Found an album\");\n            // We have to deal with an Album\n            return {\n                type: Tomahawk.UrlType.Album,\n                artist: urlParts[urlParts.length - 2],\n                album: urlParts[urlParts.length - 1]\n            };\n        } else if (/^https?:\\/\\/(www\\.)?hatchet\\.is\\/music\\/[^\\/\\n][^\\/\\n_]+$/.test(url)) {\n            Tomahawk.log(\"Found an artist\");\n            // We have to deal with an Artist\n            return {\n                type: Tomahawk.UrlType.Artist,\n                artist: urlParts[urlParts.length - 1]\n            };\n        } else if (/^https?:\\/\\/(www\\.)?hatchet\\.is\\/music\\/[^\\/\\n]+\\/_\\/[^\\/\\n]+$/.test(url)) {\n            Tomahawk.log(\"Found a track\");\n            // We have to deal with a Track\n            return {\n                type: Tomahawk.UrlType.Track,\n                artist: urlParts[urlParts.length - 3],\n                track: urlParts[urlParts.length - 1]\n            };\n        } else if (/^https?:\\/\\/(www\\.)?hatchet\\.is\\/people\\/[^\\/\\n]+\\/playlists\\/[^\\/\\n]+$/.test(url)) {\n            Tomahawk.log(\"Found a playlist\");\n            // We have to deal with a Playlist\n            var match = url.match(/^https?:\\/\\/(?:www\\.)?hatchet\\.is\\/people\\/[^\\/\\n]+\\/playlists\\/([^\\/\\n]+)$/);\n            var query = 'https://api.hatchet.is/v1/playlists/' + match[1];\n            Tomahawk.log(\"Found playlist, calling url: '\" + query + \"'\");\n            return Tomahawk.get(query).then(function (res) {\n                var playlistEntries = {};\n                res.playlistEntries.forEach(function (item) {\n                    playlistEntries[item.id] = item;\n                });\n                var artists = {};\n                res.artists.forEach(function (item) {\n                    artists[item.id] = item;\n                });\n                var tracksMap = {};\n                res.tracks.forEach(function (item) {\n                    tracksMap[item.id] = item;\n                });\n                var tracks = res.playlists[0].playlistEntries.map(function (item) {\n                    var track = tracksMap[playlistEntries[item].track];\n                    return {\n                        type: \"track\",\n                        track: track.name,\n                        artist: artists[track.artist].name\n                    };\n                });\n                Tomahawk.log(\"Reported found playlist '\" + result.title + \"' containing \"\n                    + tracks.length + \" tracks\");\n                return {\n                    type: Tomahawk.UrlType.Playlist,\n                    title: res.playlists[0].title,\n                    guid: res.playlists[0].id,\n                    info: \"A playlist on Hatchet.\",\n                    creator: res.playlists[0].user,\n                    linkUrl: url,\n                    tracks: tracks\n                };\n            });\n        }\n    }\n});\n\nTomahawk.resolver.instance = ExampleResolver;\n\nvar exampleCollection = Tomahawk.extend(Tomahawk.Collection, {\n    settings: {\n        id: \"example\",\n        prettyname: \"Example\",\n        description: \"An Example Collection\",\n        iconfile: \"contents/images/icon.png\",\n        trackcount: 6\n    }\n});\n"
  },
  {
    "path": "examples/javascript/content/metadata.json",
    "content": "{\n    \"name\": \"Example Resolver\",\n    \"pluginName\": \"example\",\n    \"author\": \"Enno Gottschalk\",\n    \"email\": \"mrmaffen@gmail.com\",\n    \"version\": \"0.1.2\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Just an example Resolver.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/example.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/config.ui\"\n        ]\n    }\n}\n"
  },
  {
    "path": "examples/php/php-resolver.php",
    "content": "#!/usr/bin/php\n<?php\n\n/**\n * @author David Singleton (http://dsingleton.co.uk)\n * @author Christian Muehlhaeuser (http://tomahawk-player.org)\n * A base tomahawk resolver written in PHP.\n * Handles basic request/response, encoding.\n */\n\nabstract class TomahawkResolver\n{\n    protected $name; \n    protected $timeout; // After which period of time (in seconds) we do not expect results to arrive anymore\n    protected $weight; // 1-100. higher means preferable.\n    \n    \n    public function __construct()\n    {\n//        set_error_handler( array( $this, 'errorHandler' ), E_ALL );\n    }\n    \n    /**\n     * \n     */\n    public function handleRequest( $fh )\n    {\n        while ( !feof( $fh ) )\n        {\n\n            // Makes the handler compatable with command line testing and playdar resolver pipeline usage\n            if ( !$content = fread( $fh, 4 ) )\n                break;\n            \n            // get the length of the payload from the first 4 bytes:\n            $len = current( unpack( 'N', $content ) );\n            \n            // bail on empty request.\n            if( $len == 0 )\n                continue;\n            \n            // read $len bytes for the actual payload and assume it's a JSON object.\n            $request = json_decode( fread( $fh, $len ) );\n            \n            // Malformed request\n            if ( !isset( $request->artist, $request->track ) )\n                continue;\n            \n            // Let's resolve this bitch\n            $results = $this->resolve( $request );\n            \n            // Build response and send\n            $response = (Object) array(\n                '_msgtype' => 'results',\n                'qid' => $request->qid,\n                'results' => $results,\n            );\n            $this->sendResponse( $response );\n        }\n    }\n    \n    /**\n     * Find shit. Returns an array of result object\n     */\n    abstract function resolve( $request );\n    \n    /**\n     * Output reply\n     * Puts a 4-byte big-endian int first, denoting length of message\n     */\n    public function sendResponse( $response )\n    {\n        // i think json_spirit rejects \\/ even tho it's valid json. doh.\n        $str = str_replace( '\\/','/', json_encode( $response ) );\n        print pack( 'N', strlen( $str ) );\n        print $str;\n    }\n    \n    /**\n     * Settings object for this resolver, reported when we start\n     */\n    public function getSettings()\n    {\n        $settings = (Object) array(\n            '_msgtype' => 'settings',\n            'name' => $this->name,\n            'timeout' => $this->timeout,\n            'weight' => $this->weight,\n            'localonly' => isset( $this->localonly ) ? $this->localonly : TRUE,\n        );\n        return $settings;\n    }\n    \n    public function log( $message )\n    {\n        $fh = fopen( \"php://STDERR\", 'w' );\n        fwrite( $fh, $message . \"\\n\" );\n        fclose( $fh );\n    }\n    \n    public function errorHandler( $errno, $errstr, $errfile, $errline )\n    {\n        $exit = false;\n        \n        switch ( $errno )\n        {\n            case E_USER_ERROR:\n                $type = \"Fatal\";\n                $exit = true;\n\n            case E_WARNING:\n            case E_USER_WARNING:\n                $type = \"Warning\";\n                break;\n\n            case E_NOTICE:\n            case E_USER_NOTICE:\n                $type = \"Notice\";\n                break;\n\n            default:\n                $type = \"Unknown\";\n                break;\n        }\n        \n        $format = 'PHP ' . $type . ' Error: \"%s\" (line %s in %s)';\n        $error = sprintf( $format, $errstr, $errline, $errfile );\n        \n        $this->log( $error );\n        \n        if ( $exit )\n        {\n            exit( 1 );\n        }\n        else\n        {\n            /* Don't execute PHP internal error handler */\n            return true;\n        }\n    }\n}\n\n\n/**\n * Example implementation of base TomahawkResolver\n */\nclass ExamplePHPResolver extends TomahawkResolver\n{\n    protected $name = 'PHP Example Resolver';\n    protected $timeout = 5; // fast atm, it's all hardcoded.\n    protected $weight = 50; // 1-100. higher means preferable.\n\n    public function resolve( $request )\n    {\n        $result = (Object) array(\n            'artist' => 'Mokele',\n            'album' => 'You Yourself are Me Myself and I am in Love',\n            'track' => 'Hiding In Your Insides (php)',\n            'source' => 'Mokele.co.uk',\n            'mimetype' => 'audio/mpeg',\n            'extension' => 'mp3',\n            'url' => 'http://play.mokele.co.uk/music/Hiding%20In%20Your%20Insides.mp3',\n            'bitrate' => 160,\n            'duration' => 248,\n            'size' => 4971780,\n            'score' => (float)1.0\n        );\n\n        return array( $result );\n    }\n}\n"
  },
  {
    "path": "examples/streamtest/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>390</width>\n    <height>120</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>250</width>\n    <height>120</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::ExpandingFieldsGrow</enum>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>URL</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"url_edit\"/>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "examples/streamtest/content/contents/code/streamtest.js",
    "content": "var StreamTestResolver = Tomahawk.extend( Tomahawk.Resolver.Promise, {\n    apiVersion: 0.9,\n\n    settings: {\n        cacheTime: 300,\n        name: 'Stream Test',\n        icon: '../icon.png',\n        weight: 10,\n        timeout: 8\n    },\n\n    getConfigUi: function() {\n        return {\n            \"widget\": Tomahawk.readBase64( \"config.ui\" ),\n            fields: [{\n                name: \"stream_url\",\n                widget: \"url_edit\",\n                property: \"text\"\n            }]\n        };\n    },\n\n    init: function() {\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n        Tomahawk.addCustomUrlHandler( 'streamtest', 'getStreamUrl', true );\n    },\n\n    resolve: function (artist, album, title) {\n        return [{\n            artist:     artist,\n            album:      album,\n            track:      title,\n            title:      title,\n\n            url:        'streamtest://track/' + encodeURIComponent(title),\n            hint:       'streamtest://track/' + encodeURIComponent(title),\n            checked:    true,\n            bitrate:    64,\n            type:       \"track\",\n        }];\n    },\n\n    getStreamUrl: function(qid, url) {\n        var config = this.getUserConfig();\n        Tomahawk.reportStreamUrl(qid, config.stream_url);\n    },\n\n});\n\nTomahawk.resolver.instance = StreamTestResolver;\n"
  },
  {
    "path": "examples/streamtest/content/metadata.json",
    "content": "{\n    \"name\": \"Streaming Test Plugin\",\n    \"pluginName\": \"streamtest\",\n    \"author\": \"Anton Romanov\",\n    \"email\": \"\",\n    \"version\": \"0.0.1\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Streams music from stream specified in settings\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/streamtest.js\",\n        \"icon\": \"contents/icon.png\",\n        \"scripts\": [],\n        \"resources\": [\n            \"contents/code/config.ui\"\n        ]\n    },\n    \"staticCapabilities\": [\n    ]\n}\n"
  },
  {
    "path": "gmusic/.gitignore",
    "content": "\n/makeaxe.rb\n/gmusic-*\n"
  },
  {
    "path": "gmusic/COPYING.txt",
    "content": "Creative Commons Legal Code\n\nCC0 1.0 Universal\n\n    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE\n    LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN\n    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS\n    INFORMATION ON AN \"AS-IS\" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES\n    REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS\n    PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM\n    THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED\n    HEREUNDER.\n\nStatement of Purpose\n\nThe laws of most jurisdictions throughout the world automatically confer\nexclusive Copyright and Related Rights (defined below) upon the creator\nand subsequent owner(s) (each and all, an \"owner\") of an original work of\nauthorship and/or a database (each, a \"Work\").\n\nCertain owners wish to permanently relinquish those rights to a Work for\nthe purpose of contributing to a commons of creative, cultural and\nscientific works (\"Commons\") that the public can reliably and without fear\nof later claims of infringement build upon, modify, incorporate in other\nworks, reuse and redistribute as freely as possible in any form whatsoever\nand for any purposes, including without limitation commercial purposes.\nThese owners may contribute to the Commons to promote the ideal of a free\nculture and the further production of creative, cultural and scientific\nworks, or to gain reputation or greater distribution for their Work in\npart through the use and efforts of others.\n\nFor these and/or other purposes and motivations, and without any\nexpectation of additional consideration or compensation, the person\nassociating CC0 with a Work (the \"Affirmer\"), to the extent that he or she\nis an owner of Copyright and Related Rights in the Work, voluntarily\nelects to apply CC0 to the Work and publicly distribute the Work under its\nterms, with knowledge of his or her Copyright and Related Rights in the\nWork and the meaning and intended legal effect of CC0 on those rights.\n\n1. Copyright and Related Rights. A Work made available under CC0 may be\nprotected by copyright and related or neighboring rights (\"Copyright and\nRelated Rights\"). Copyright and Related Rights include, but are not\nlimited to, the following:\n\n  i. the right to reproduce, adapt, distribute, perform, display,\n     communicate, and translate a Work;\n ii. moral rights retained by the original author(s) and/or performer(s);\niii. publicity and privacy rights pertaining to a person's image or\n     likeness depicted in a Work;\n iv. rights protecting against unfair competition in regards to a Work,\n     subject to the limitations in paragraph 4(a), below;\n  v. rights protecting the extraction, dissemination, use and reuse of data\n     in a Work;\n vi. database rights (such as those arising under Directive 96/9/EC of the\n     European Parliament and of the Council of 11 March 1996 on the legal\n     protection of databases, and under any national implementation\n     thereof, including any amended or successor version of such\n     directive); and\nvii. other similar, equivalent or corresponding rights throughout the\n     world based on applicable law or treaty, and any national\n     implementations thereof.\n\n2. Waiver. To the greatest extent permitted by, but not in contravention\nof, applicable law, Affirmer hereby overtly, fully, permanently,\nirrevocably and unconditionally waives, abandons, and surrenders all of\nAffirmer's Copyright and Related Rights and associated claims and causes\nof action, whether now known or unknown (including existing as well as\nfuture claims and causes of action), in the Work (i) in all territories\nworldwide, (ii) for the maximum duration provided by applicable law or\ntreaty (including future time extensions), (iii) in any current or future\nmedium and for any number of copies, and (iv) for any purpose whatsoever,\nincluding without limitation commercial, advertising or promotional\npurposes (the \"Waiver\"). Affirmer makes the Waiver for the benefit of each\nmember of the public at large and to the detriment of Affirmer's heirs and\nsuccessors, fully intending that such Waiver shall not be subject to\nrevocation, rescission, cancellation, termination, or any other legal or\nequitable action to disrupt the quiet enjoyment of the Work by the public\nas contemplated by Affirmer's express Statement of Purpose.\n\n3. Public License Fallback. Should any part of the Waiver for any reason\nbe judged legally invalid or ineffective under applicable law, then the\nWaiver shall be preserved to the maximum extent permitted taking into\naccount Affirmer's express Statement of Purpose. In addition, to the\nextent the Waiver is so judged Affirmer hereby grants to each affected\nperson a royalty-free, non transferable, non sublicensable, non exclusive,\nirrevocable and unconditional license to exercise Affirmer's Copyright and\nRelated Rights in the Work (i) in all territories worldwide, (ii) for the\nmaximum duration provided by applicable law or treaty (including future\ntime extensions), (iii) in any current or future medium and for any number\nof copies, and (iv) for any purpose whatsoever, including without\nlimitation commercial, advertising or promotional purposes (the\n\"License\"). The License shall be deemed effective as of the date CC0 was\napplied by Affirmer to the Work. Should any part of the License for any\nreason be judged legally invalid or ineffective under applicable law, such\npartial invalidity or ineffectiveness shall not invalidate the remainder\nof the License, and in such case Affirmer hereby affirms that he or she\nwill not (i) exercise any of his or her remaining Copyright and Related\nRights in the Work or (ii) assert any associated claims and causes of\naction with respect to the Work, in either case contrary to Affirmer's\nexpress Statement of Purpose.\n\n4. Limitations and Disclaimers.\n\n a. No trademark or patent rights held by Affirmer are waived, abandoned,\n    surrendered, licensed or otherwise affected by this document.\n b. Affirmer offers the Work as-is and makes no representations or\n    warranties of any kind concerning the Work, express, implied,\n    statutory or otherwise, including without limitation warranties of\n    title, merchantability, fitness for a particular purpose, non\n    infringement, or the absence of latent or other defects, accuracy, or\n    the present or absence of errors, whether or not discoverable, all to\n    the greatest extent permissible under applicable law.\n c. Affirmer disclaims responsibility for clearing rights of other persons\n    that may apply to the Work or any use thereof, including without\n    limitation any person's Copyright and Related Rights in the Work.\n    Further, Affirmer disclaims responsibility for obtaining any necessary\n    consents, permissions or other rights required for any use of the\n    Work.\n d. Affirmer understands and acknowledges that Creative Commons is not a\n    party to this document and has no duty or obligation with respect to\n    this CC0 or use of the Work.\n"
  },
  {
    "path": "gmusic/README.md",
    "content": "Copying\n=======\n\nWritten in 2013 by Sam Hanes <sam@maltera.com>\nHeavily modified in 2014 by Lalit Maganti <lalitmaganti@gmail.com>\n\nTo the extent possible under law, the author(s) have dedicated all\ncopyright and related and neighboring rights to this software to\nthe public domain worldwide. This software is distributed without\nany warranty.\n\nYou should have received a copy of the CC0 Public Domain Dedication\nalong with this software. If not, see:\nhttp://creativecommons.org/publicdomain/zero/1.0/\n\n"
  },
  {
    "path": "gmusic/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>585</width>\n    <height>251</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>250</width>\n    <height>120</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <widget class=\"QLabel\" name=\"gmusic_label\">\n     <property name=\"pixmap\">\n      <pixmap>play-logo.png</pixmap>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"label_3\">\n     <property name=\"text\">\n      <string>For this plug-in to work you must first login using the official Google Music iOS or Android app and play a song.  After you've done that Tomahawk should then be able to authenticate with your account.</string>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"label_4\">\n     <property name=\"text\">\n      <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Note: If you use 2-Step Verification, then you must create an &lt;a href=&quot;https://support.google.com/accounts/answer/185833?hl=en&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;app-specific password&lt;/span&gt;&lt;/a&gt; to use in Tomahawk.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\n     <property name=\"openExternalLinks\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"label_5\">\n     <property name=\"text\">\n         <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Otherwise, make sure that you enable &quot;less secure apps&quot; in your &lt;a href=&quot;https://www.google.com/settings/security/lesssecureapps&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Google account settings&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\n     <property name=\"openExternalLinks\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>40</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::ExpandingFieldsGrow</enum>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Email</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"email_edit\"/>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Password</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"password_edit\">\n       <property name=\"echoMode\">\n        <enum>QLineEdit::Password</enum>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "gmusic/content/contents/code/gmusic.js",
    "content": "/* Google Play Music resolver for Tomahawk.\n *\n * Written in 2013 by Sam Hanes <sam@maltera.com>\n * Extensive modifications in 2014 by Lalit Maganti\n * Further modifications in 2014 by Enno Gottschalk <mrmaffen@googlemail.com>\n *\n * To the extent possible under law, the author(s) have dedicated all\n * copyright and related and neighboring rights to this software to\n * the public domain worldwide. This software is distributed without\n * any warranty.\n *\n * You should have received a copy of the CC0 Public Domain Dedication\n * along with this software. If not, see:\n * http://creativecommons.org/publicdomain/zero/1.0/\n */\n\n// We unfortunately need this because Tomahawk-Desktop doesn't properly update metadata.json through\n// synchrotron. This should normally be provided in a separate asmcrypto.js file.\n// !!!Explicitely endorsed by Domme!!!\n!function(a,b){\"use strict\";function c(){var a=Error.apply(this,arguments);this.message=a.message,this.stack=a.stack}function d(){var a=Error.apply(this,arguments);this.message=a.message,this.stack=a.stack}function e(){var a=Error.apply(this,arguments);this.message=a.message,this.stack=a.stack}function f(a){for(var b=a.length,c=new Uint8Array(b),d=0;b>d;d++){var e=a.charCodeAt(d);if(e>>>8)throw new Error(\"Wide characters are not allowed\");c[d]=e}return c}function g(a){var b,c=[],d=a.length;for(1&d&&(a=\"0\"+a,d++),b=0;d>b;b+=2)c.push(parseInt(a.substr(b,2),16));return new Uint8Array(c)}function h(a){return f(atob(a))}function i(a){for(var b=\"\",c=0;c<a.length;c++)b+=String.fromCharCode(a[c]);return b}function j(a){for(var b=\"\",c=0;c<a.length;c++){var d=(255&a[c]).toString(16);d.length<2&&(b+=\"0\"),b+=d}return b}function k(a){return btoa(i(a))}function l(a){return a-=1,a|=a>>>1,a|=a>>>2,a|=a>>>4,a|=a>>>8,a|=a>>>16,a+=1}function m(a){return\"number\"==typeof a}function n(a){return\"string\"==typeof a}function o(a){return a instanceof ArrayBuffer}function p(a){return a instanceof Uint8Array}function q(a){return a instanceof Int8Array||a instanceof Uint8Array||a instanceof Int16Array||a instanceof Uint16Array||a instanceof Int32Array||a instanceof Uint32Array||a instanceof Float32Array||a instanceof Float64Array}function r(a,b){var c=b.heap,d=c?c.byteLength:b.heapSize||65536;if(4095&d||0>=d)throw new Error(\"heap size must be a positive integer and a multiple of 4096\");return c=c||new a(new ArrayBuffer(d))}function s(a,b,c,d,e){var f=a.length-b,g=e>f?f:e;return a.set(c.subarray(d,d+g),b),g}function t(a){a=a||{},this.heap=r(Uint8Array,a).subarray(Vb.HEAP_DATA),this.asm=a.asm||Vb(b,null,this.heap.buffer),this.mode=null,this.key=null,this.reset(a)}function u(a){if(void 0!==a){if(o(a)||p(a))a=new Uint8Array(a);else{if(!n(a))throw new TypeError(\"unexpected key type\");a=f(a)}var b=a.length;if(16!==b&&24!==b&&32!==b)throw new d(\"illegal key size\");var c=new DataView(a.buffer,a.byteOffset,a.byteLength);this.asm.set_key(b>>2,c.getUint32(0),c.getUint32(4),c.getUint32(8),c.getUint32(12),b>16?c.getUint32(16):0,b>16?c.getUint32(20):0,b>24?c.getUint32(24):0,b>24?c.getUint32(28):0),this.key=a}else if(!this.key)throw new Error(\"key is required\")}function v(a){if(void 0!==a){if(o(a)||p(a))a=new Uint8Array(a);else{if(!n(a))throw new TypeError(\"unexpected iv type\");a=f(a)}if(16!==a.length)throw new d(\"illegal iv size\");var b=new DataView(a.buffer,a.byteOffset,a.byteLength);this.iv=a,this.asm.set_iv(b.getUint32(0),b.getUint32(4),b.getUint32(8),b.getUint32(12))}else this.iv=null,this.asm.set_iv(0,0,0,0)}function w(a){this.padding=void 0!==a?!!a:!0}function x(a){return a=a||{},this.result=null,this.pos=0,this.len=0,u.call(this,a.key),this.hasOwnProperty(\"iv\")&&v.call(this,a.iv),this.hasOwnProperty(\"padding\")&&w.call(this,a.padding),this}function y(a){if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),!p(a))throw new TypeError(\"data isn't of expected type\");for(var b=this.asm,c=this.heap,d=Vb.ENC[this.mode],e=Vb.HEAP_DATA,g=this.pos,h=this.len,i=0,j=a.length||0,k=0,l=h+j&-16,m=0,q=new Uint8Array(l);j>0;)m=s(c,g+h,a,i,j),h+=m,i+=m,j-=m,m=b.cipher(d,e+g,h),m&&q.set(c.subarray(g,g+m),k),k+=m,h>m?(g+=m,h-=m):(g=0,h=0);return this.result=q,this.pos=g,this.len=h,this}function z(a){var b=null,c=0;void 0!==a&&(b=y.call(this,a).result,c=b.length);var e=this.asm,f=this.heap,g=Vb.ENC[this.mode],h=Vb.HEAP_DATA,i=this.pos,j=this.len,k=16-j%16,l=j;if(this.hasOwnProperty(\"padding\")){if(this.padding){for(var m=0;k>m;++m)f[i+j+m]=k;j+=k,l=j}else if(j%16)throw new d(\"data length must be a multiple of the block size\")}else j+=k;var n=new Uint8Array(c+l);return c&&n.set(b),j&&e.cipher(g,h+i,j),l&&n.set(f.subarray(i,i+l),c),this.result=n,this.pos=0,this.len=0,this}function A(a){if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),!p(a))throw new TypeError(\"data isn't of expected type\");var b=this.asm,c=this.heap,d=Vb.DEC[this.mode],e=Vb.HEAP_DATA,g=this.pos,h=this.len,i=0,j=a.length||0,k=0,l=h+j&-16,m=0,q=0;this.hasOwnProperty(\"padding\")&&this.padding&&(m=h+j-l||16,l-=m);for(var r=new Uint8Array(l);j>0;)q=s(c,g+h,a,i,j),h+=q,i+=q,j-=q,q=b.cipher(d,e+g,h-(j?0:m)),q&&r.set(c.subarray(g,g+q),k),k+=q,h>q?(g+=q,h-=q):(g=0,h=0);return this.result=r,this.pos=g,this.len=h,this}function B(a){var b=null,c=0;void 0!==a&&(b=A.call(this,a).result,c=b.length);var f=this.asm,g=this.heap,h=Vb.DEC[this.mode],i=Vb.HEAP_DATA,j=this.pos,k=this.len,l=k;if(k>0){if(k%16){if(this.hasOwnProperty(\"padding\"))throw new d(\"data length must be a multiple of the block size\");k+=16-k%16}if(f.cipher(h,i+j,k),this.hasOwnProperty(\"padding\")&&this.padding){var m=g[j+l-1];if(1>m||m>16||m>l)throw new e(\"bad padding\");for(var n=0,o=m;o>1;o--)n|=m^g[j+l-o];if(n)throw new e(\"bad padding\");l-=m}}var p=new Uint8Array(c+l);return c>0&&p.set(b),l>0&&p.set(g.subarray(j,j+l),c),this.result=p,this.pos=0,this.len=0,this}function C(a){this.padding=!0,this.iv=null,t.call(this,a),this.mode=\"CBC\"}function D(a){C.call(this,a)}function E(a){C.call(this,a)}function F(a){this.nonce=null,this.counter=0,this.counterSize=0,t.call(this,a),this.mode=\"CTR\"}function G(a){F.call(this,a)}function H(a,b,c){if(void 0!==c){if(8>c||c>48)throw new d(\"illegal counter size\");this.counterSize=c;var e=Math.pow(2,c)-1;this.asm.set_mask(0,0,e/4294967296|0,0|e)}else this.counterSize=c=48,this.asm.set_mask(0,0,65535,4294967295);if(void 0===a)throw new Error(\"nonce is required\");if(o(a)||p(a))a=new Uint8Array(a);else{if(!n(a))throw new TypeError(\"unexpected nonce type\");a=f(a)}var g=a.length;if(!g||g>16)throw new d(\"illegal nonce size\");this.nonce=a;var h=new DataView(new ArrayBuffer(16));if(new Uint8Array(h.buffer).set(a),this.asm.set_nonce(h.getUint32(0),h.getUint32(4),h.getUint32(8),h.getUint32(12)),void 0!==b){if(!m(b))throw new TypeError(\"unexpected counter type\");if(0>b||b>=Math.pow(2,c))throw new d(\"illegal counter value\");this.counter=b,this.asm.set_counter(0,0,b/4294967296|0,0|b)}else this.counter=b=0}function I(a){return a=a||{},x.call(this,a),H.call(this,a.nonce,a.counter,a.counterSize),this}function J(a){for(var b=this.heap,c=this.asm,d=0,e=a.length||0,f=0;e>0;){for(f=s(b,0,a,d,e),d+=f,e-=f;15&f;)b[f++]=0;c.mac(Vb.MAC.GCM,Vb.HEAP_DATA,f)}}function K(a){this.nonce=null,this.adata=null,this.iv=null,this.counter=1,this.tagSize=16,t.call(this,a),this.mode=\"GCM\"}function L(a){K.call(this,a)}function M(a){K.call(this,a)}function N(a){a=a||{},x.call(this,a);var b=this.asm,c=this.heap;b.gcm_init();var e=a.tagSize;if(void 0!==e){if(!m(e))throw new TypeError(\"tagSize must be a number\");if(4>e||e>16)throw new d(\"illegal tagSize value\");this.tagSize=e}else this.tagSize=16;var g=a.nonce;if(void 0===g)throw new Error(\"nonce is required\");if(p(g)||o(g))g=new Uint8Array(g);else{if(!n(g))throw new TypeError(\"unexpected nonce type\");g=f(g)}this.nonce=g;var h=g.length||0,i=new Uint8Array(16);12!==h?(J.call(this,g),c[0]=c[1]=c[2]=c[3]=c[4]=c[5]=c[6]=c[7]=c[8]=c[9]=c[10]=0,c[11]=h>>>29,c[12]=h>>>21&255,c[13]=h>>>13&255,c[14]=h>>>5&255,c[15]=h<<3&255,b.mac(Vb.MAC.GCM,Vb.HEAP_DATA,16),b.get_iv(Vb.HEAP_DATA),b.set_iv(),i.set(c.subarray(0,16))):(i.set(g),i[15]=1);var j=new DataView(i.buffer);this.gamma0=j.getUint32(12),b.set_nonce(j.getUint32(0),j.getUint32(4),j.getUint32(8),0),b.set_mask(0,0,0,4294967295);var k=a.adata;if(void 0!==k&&null!==k){if(p(k)||o(k))k=new Uint8Array(k);else{if(!n(k))throw new TypeError(\"unexpected adata type\");k=f(k)}if(k.length>_b)throw new d(\"illegal adata length\");k.length?(this.adata=k,J.call(this,k)):this.adata=null}else this.adata=null;var l=a.counter;if(void 0!==l){if(!m(l))throw new TypeError(\"counter must be a number\");if(1>l||l>4294967295)throw new RangeError(\"counter must be a positive 32-bit integer\");this.counter=l,b.set_counter(0,0,0,this.gamma0+l|0)}else this.counter=1,b.set_counter(0,0,0,this.gamma0+1|0);var q=a.iv;if(void 0!==q){if(!m(l))throw new TypeError(\"counter must be a number\");this.iv=q,v.call(this,q)}return this}function O(a){if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),!p(a))throw new TypeError(\"data isn't of expected type\");var b=0,c=a.length||0,d=this.asm,e=this.heap,g=this.counter,h=this.pos,i=this.len,j=0,k=i+c&-16,l=0;if((g-1<<4)+i+c>_b)throw new RangeError(\"counter overflow\");for(var m=new Uint8Array(k);c>0;)l=s(e,h+i,a,b,c),i+=l,b+=l,c-=l,l=d.cipher(Vb.ENC.CTR,Vb.HEAP_DATA+h,i),l=d.mac(Vb.MAC.GCM,Vb.HEAP_DATA+h,l),l&&m.set(e.subarray(h,h+l),j),g+=l>>>4,j+=l,i>l?(h+=l,i-=l):(h=0,i=0);return this.result=m,this.counter=g,this.pos=h,this.len=i,this}function P(){var a=this.asm,b=this.heap,c=this.counter,d=this.tagSize,e=this.adata,f=this.pos,g=this.len,h=new Uint8Array(g+d);a.cipher(Vb.ENC.CTR,Vb.HEAP_DATA+f,g+15&-16),g&&h.set(b.subarray(f,f+g));for(var i=g;15&i;i++)b[f+i]=0;a.mac(Vb.MAC.GCM,Vb.HEAP_DATA+f,i);var j=null!==e?e.length:0,k=(c-1<<4)+g;return b[0]=b[1]=b[2]=0,b[3]=j>>>29,b[4]=j>>>21,b[5]=j>>>13&255,b[6]=j>>>5&255,b[7]=j<<3&255,b[8]=b[9]=b[10]=0,b[11]=k>>>29,b[12]=k>>>21&255,b[13]=k>>>13&255,b[14]=k>>>5&255,b[15]=k<<3&255,a.mac(Vb.MAC.GCM,Vb.HEAP_DATA,16),a.get_iv(Vb.HEAP_DATA),a.set_counter(0,0,0,this.gamma0),a.cipher(Vb.ENC.CTR,Vb.HEAP_DATA,16),h.set(b.subarray(0,d),g),this.result=h,this.counter=1,this.pos=0,this.len=0,this}function Q(a){var b=O.call(this,a).result,c=P.call(this).result,d=new Uint8Array(b.length+c.length);return b.length&&d.set(b),c.length&&d.set(c,b.length),this.result=d,this}function R(a){if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),!p(a))throw new TypeError(\"data isn't of expected type\");var b=0,c=a.length||0,d=this.asm,e=this.heap,g=this.counter,h=this.tagSize,i=this.pos,j=this.len,k=0,l=j+c>h?j+c-h&-16:0,m=j+c-l,q=0;if((g-1<<4)+j+c>_b)throw new RangeError(\"counter overflow\");for(var r=new Uint8Array(l);c>m;)q=s(e,i+j,a,b,c-m),j+=q,b+=q,c-=q,q=d.mac(Vb.MAC.GCM,Vb.HEAP_DATA+i,q),q=d.cipher(Vb.DEC.CTR,Vb.HEAP_DATA+i,q),q&&r.set(e.subarray(i,i+q),k),g+=q>>>4,k+=q,i=0,j=0;return c>0&&(j+=s(e,0,a,b,c)),this.result=r,this.counter=g,this.pos=i,this.len=j,this}function S(){var a=this.asm,b=this.heap,d=this.tagSize,f=this.adata,g=this.counter,h=this.pos,i=this.len,j=i-d,k=0;if(d>i)throw new c(\"authentication tag not found\");for(var l=new Uint8Array(j),m=new Uint8Array(b.subarray(h+j,h+i)),n=j;15&n;n++)b[h+n]=0;k=a.mac(Vb.MAC.GCM,Vb.HEAP_DATA+h,n),k=a.cipher(Vb.DEC.CTR,Vb.HEAP_DATA+h,n),j&&l.set(b.subarray(h,h+j));var o=null!==f?f.length:0,p=(g-1<<4)+i-d;b[0]=b[1]=b[2]=0,b[3]=o>>>29,b[4]=o>>>21,b[5]=o>>>13&255,b[6]=o>>>5&255,b[7]=o<<3&255,b[8]=b[9]=b[10]=0,b[11]=p>>>29,b[12]=p>>>21&255,b[13]=p>>>13&255,b[14]=p>>>5&255,b[15]=p<<3&255,a.mac(Vb.MAC.GCM,Vb.HEAP_DATA,16),a.get_iv(Vb.HEAP_DATA),a.set_counter(0,0,0,this.gamma0),a.cipher(Vb.ENC.CTR,Vb.HEAP_DATA,16);for(var q=0,n=0;d>n;++n)q|=m[n]^b[n];if(q)throw new e(\"data integrity check failed\");return this.result=l,this.counter=1,this.pos=0,this.len=0,this}function T(a){var b=R.call(this,a).result,c=S.call(this).result,d=new Uint8Array(b.length+c.length);return b.length&&d.set(b),c.length&&d.set(c,b.length),this.result=d,this}function U(a,b,c,d){if(void 0===a)throw new SyntaxError(\"data required\");if(void 0===b)throw new SyntaxError(\"key required\");return new C({heap:dc,asm:ec,key:b,padding:c,iv:d}).encrypt(a).result}function V(a,b,c,d){if(void 0===a)throw new SyntaxError(\"data required\");if(void 0===b)throw new SyntaxError(\"key required\");return new C({heap:dc,asm:ec,key:b,padding:c,iv:d}).decrypt(a).result}function W(a,b,c,d,e){if(void 0===a)throw new SyntaxError(\"data required\");if(void 0===b)throw new SyntaxError(\"key required\");if(void 0===c)throw new SyntaxError(\"nonce required\");return new K({heap:dc,asm:ec,key:b,nonce:c,adata:d,tagSize:e}).encrypt(a).result}function X(a,b,c,d,e){if(void 0===a)throw new SyntaxError(\"data required\");if(void 0===b)throw new SyntaxError(\"key required\");if(void 0===c)throw new SyntaxError(\"nonce required\");return new K({heap:dc,asm:ec,key:b,nonce:c,adata:d,tagSize:e}).decrypt(a).result}function Y(){return this.result=null,this.pos=0,this.len=0,this.asm.reset(),this}function Z(a){if(null!==this.result)throw new c(\"state must be reset before processing new data\");if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),!p(a))throw new TypeError(\"data isn't of expected type\");for(var b=this.asm,d=this.heap,e=this.pos,g=this.len,h=0,i=a.length,j=0;i>0;)j=s(d,e+g,a,h,i),g+=j,h+=j,i-=j,j=b.process(e,g),e+=j,g-=j,g||(e=0);return this.pos=e,this.len=g,this}function $(){if(null!==this.result)throw new c(\"state must be reset before processing new data\");return this.asm.finish(this.pos,this.len,0),this.result=new Uint8Array(this.HASH_SIZE),this.result.set(this.heap.subarray(0,this.HASH_SIZE)),this.pos=0,this.len=0,this}function _(a,b,c){\"use asm\";var d=0,e=0,f=0,g=0,h=0,i=0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;var t=new a.Uint8Array(c);function u(G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V){G=G|0;H=H|0;I=I|0;J=J|0;K=K|0;L=L|0;M=M|0;N=N|0;O=O|0;P=P|0;Q=Q|0;R=R|0;S=S|0;T=T|0;U=U|0;V=V|0;var W=0,X=0,Y=0,Z=0,$=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,$a=0,_a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0;W=d;X=e;Y=f;Z=g;$=h;aa=G+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=H+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=I+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=J+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=K+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=L+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=M+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=N+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=O+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=P+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=Q+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=R+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=S+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=T+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=U+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;aa=V+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=T^O^I^G;ba=_<<1|_>>>31;aa=ba+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=U^P^J^H;ca=_<<1|_>>>31;aa=ca+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=V^Q^K^I;da=_<<1|_>>>31;aa=da+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ba^R^L^J;ea=_<<1|_>>>31;aa=ea+(W<<5|W>>>27)+$+(X&Y|~X&Z)+1518500249|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ca^S^M^K;fa=_<<1|_>>>31;aa=fa+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=da^T^N^L;ga=_<<1|_>>>31;aa=ga+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ea^U^O^M;ha=_<<1|_>>>31;aa=ha+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=fa^V^P^N;ia=_<<1|_>>>31;aa=ia+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ga^ba^Q^O;ja=_<<1|_>>>31;aa=ja+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ha^ca^R^P;ka=_<<1|_>>>31;aa=ka+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ia^da^S^Q;la=_<<1|_>>>31;aa=la+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ja^ea^T^R;ma=_<<1|_>>>31;aa=ma+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ka^fa^U^S;na=_<<1|_>>>31;aa=na+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=la^ga^V^T;oa=_<<1|_>>>31;aa=oa+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ma^ha^ba^U;pa=_<<1|_>>>31;aa=pa+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=na^ia^ca^V;qa=_<<1|_>>>31;aa=qa+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=oa^ja^da^ba;ra=_<<1|_>>>31;aa=ra+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=pa^ka^ea^ca;sa=_<<1|_>>>31;aa=sa+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=qa^la^fa^da;ta=_<<1|_>>>31;aa=ta+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ra^ma^ga^ea;ua=_<<1|_>>>31;aa=ua+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=sa^na^ha^fa;va=_<<1|_>>>31;aa=va+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ta^oa^ia^ga;wa=_<<1|_>>>31;aa=wa+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ua^pa^ja^ha;xa=_<<1|_>>>31;aa=xa+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=va^qa^ka^ia;ya=_<<1|_>>>31;aa=ya+(W<<5|W>>>27)+$+(X^Y^Z)+1859775393|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=wa^ra^la^ja;za=_<<1|_>>>31;aa=za+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=xa^sa^ma^ka;Aa=_<<1|_>>>31;aa=Aa+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ya^ta^na^la;Ba=_<<1|_>>>31;aa=Ba+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=za^ua^oa^ma;Ca=_<<1|_>>>31;aa=Ca+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Aa^va^pa^na;Da=_<<1|_>>>31;aa=Da+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Ba^wa^qa^oa;Ea=_<<1|_>>>31;aa=Ea+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Ca^xa^ra^pa;Fa=_<<1|_>>>31;aa=Fa+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Da^ya^sa^qa;Ga=_<<1|_>>>31;aa=Ga+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Ea^za^ta^ra;Ha=_<<1|_>>>31;aa=Ha+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Fa^Aa^ua^sa;Ia=_<<1|_>>>31;aa=Ia+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Ga^Ba^va^ta;Ja=_<<1|_>>>31;aa=Ja+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Ha^Ca^wa^ua;Ka=_<<1|_>>>31;aa=Ka+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Ia^Da^xa^va;La=_<<1|_>>>31;aa=La+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Ja^Ea^ya^wa;Ma=_<<1|_>>>31;aa=Ma+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Ka^Fa^za^xa;Na=_<<1|_>>>31;aa=Na+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=La^Ga^Aa^ya;Oa=_<<1|_>>>31;aa=Oa+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Ma^Ha^Ba^za;Pa=_<<1|_>>>31;aa=Pa+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Na^Ia^Ca^Aa;Qa=_<<1|_>>>31;aa=Qa+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Oa^Ja^Da^Ba;Ra=_<<1|_>>>31;aa=Ra+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Pa^Ka^Ea^Ca;Sa=_<<1|_>>>31;aa=Sa+(W<<5|W>>>27)+$+(X&Y|X&Z|Y&Z)-1894007588|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Qa^La^Fa^Da;Ta=_<<1|_>>>31;aa=Ta+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Ra^Ma^Ga^Ea;Ua=_<<1|_>>>31;aa=Ua+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Sa^Na^Ha^Fa;Va=_<<1|_>>>31;aa=Va+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Ta^Oa^Ia^Ga;Wa=_<<1|_>>>31;aa=Wa+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Ua^Pa^Ja^Ha;Xa=_<<1|_>>>31;aa=Xa+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Va^Qa^Ka^Ia;Ya=_<<1|_>>>31;aa=Ya+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Wa^Ra^La^Ja;Za=_<<1|_>>>31;aa=Za+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Xa^Sa^Ma^Ka;$a=_<<1|_>>>31;aa=$a+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Ya^Ta^Na^La;_a=_<<1|_>>>31;aa=_a+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=Za^Ua^Oa^Ma;ab=_<<1|_>>>31;aa=ab+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=$a^Va^Pa^Na;bb=_<<1|_>>>31;aa=bb+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=_a^Wa^Qa^Oa;cb=_<<1|_>>>31;aa=cb+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=ab^Xa^Ra^Pa;db=_<<1|_>>>31;aa=db+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=bb^Ya^Sa^Qa;eb=_<<1|_>>>31;aa=eb+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=cb^Za^Ta^Ra;fb=_<<1|_>>>31;aa=fb+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=db^$a^Ua^Sa;gb=_<<1|_>>>31;aa=gb+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=eb^_a^Va^Ta;hb=_<<1|_>>>31;aa=hb+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=fb^ab^Wa^Ua;ib=_<<1|_>>>31;aa=ib+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=gb^bb^Xa^Va;jb=_<<1|_>>>31;aa=jb+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;_=hb^cb^Ya^Wa;kb=_<<1|_>>>31;aa=kb+(W<<5|W>>>27)+$+(X^Y^Z)-899497514|0;$=Z;Z=Y;Y=X<<30|X>>>2;X=W;W=aa;d=d+W|0;e=e+X|0;f=f+Y|0;g=g+Z|0;h=h+$|0}function v(G){G=G|0;u(t[G|0]<<24|t[G|1]<<16|t[G|2]<<8|t[G|3],t[G|4]<<24|t[G|5]<<16|t[G|6]<<8|t[G|7],t[G|8]<<24|t[G|9]<<16|t[G|10]<<8|t[G|11],t[G|12]<<24|t[G|13]<<16|t[G|14]<<8|t[G|15],t[G|16]<<24|t[G|17]<<16|t[G|18]<<8|t[G|19],t[G|20]<<24|t[G|21]<<16|t[G|22]<<8|t[G|23],t[G|24]<<24|t[G|25]<<16|t[G|26]<<8|t[G|27],t[G|28]<<24|t[G|29]<<16|t[G|30]<<8|t[G|31],t[G|32]<<24|t[G|33]<<16|t[G|34]<<8|t[G|35],t[G|36]<<24|t[G|37]<<16|t[G|38]<<8|t[G|39],t[G|40]<<24|t[G|41]<<16|t[G|42]<<8|t[G|43],t[G|44]<<24|t[G|45]<<16|t[G|46]<<8|t[G|47],t[G|48]<<24|t[G|49]<<16|t[G|50]<<8|t[G|51],t[G|52]<<24|t[G|53]<<16|t[G|54]<<8|t[G|55],t[G|56]<<24|t[G|57]<<16|t[G|58]<<8|t[G|59],t[G|60]<<24|t[G|61]<<16|t[G|62]<<8|t[G|63])}function w(G){G=G|0;t[G|0]=d>>>24;t[G|1]=d>>>16&255;t[G|2]=d>>>8&255;t[G|3]=d&255;t[G|4]=e>>>24;t[G|5]=e>>>16&255;t[G|6]=e>>>8&255;t[G|7]=e&255;t[G|8]=f>>>24;t[G|9]=f>>>16&255;t[G|10]=f>>>8&255;t[G|11]=f&255;t[G|12]=g>>>24;t[G|13]=g>>>16&255;t[G|14]=g>>>8&255;t[G|15]=g&255;t[G|16]=h>>>24;t[G|17]=h>>>16&255;t[G|18]=h>>>8&255;t[G|19]=h&255}function x(){d=1732584193;e=4023233417;f=2562383102;g=271733878;h=3285377520;i=0}function y(G,H,I,J,K,L){G=G|0;H=H|0;I=I|0;J=J|0;K=K|0;L=L|0;d=G;e=H;f=I;g=J;h=K;i=L}function z(G,H){G=G|0;H=H|0;var I=0;if(G&63)return-1;while((H|0)>=64){v(G);G=G+64|0;H=H-64|0;I=I+64|0}i=i+I|0;return I|0}function A(G,H,I){G=G|0;H=H|0;I=I|0;var J=0,K=0;if(G&63)return-1;if(~I)if(I&31)return-1;if((H|0)>=64){J=z(G,H)|0;if((J|0)==-1)return-1;G=G+J|0;H=H-J|0}J=J+H|0;i=i+H|0;t[G|H]=128;if((H|0)>=56){for(K=H+1|0;(K|0)<64;K=K+1|0)t[G|K]=0;v(G);H=0;t[G|0]=0}for(K=H+1|0;(K|0)<59;K=K+1|0)t[G|K]=0;t[G|59]=i>>>29;t[G|60]=i>>>21&255;t[G|61]=i>>>13&255;t[G|62]=i>>>5&255;t[G|63]=i<<3&255;v(G);if(~I)w(I);return J|0}function B(){d=j;e=k;f=l;g=m;h=n;i=64}function C(){d=o;e=p;f=q;g=r;h=s;i=64}function D(G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V){G=G|0;H=H|0;I=I|0;J=J|0;K=K|0;L=L|0;M=M|0;N=N|0;O=O|0;P=P|0;Q=Q|0;R=R|0;S=S|0;T=T|0;U=U|0;V=V|0;x();u(G^1549556828,H^1549556828,I^1549556828,J^1549556828,K^1549556828,L^1549556828,M^1549556828,N^1549556828,O^1549556828,P^1549556828,Q^1549556828,R^1549556828,S^1549556828,T^1549556828,U^1549556828,V^1549556828);o=d;p=e;q=f;r=g;s=h;x();u(G^909522486,H^909522486,I^909522486,J^909522486,K^909522486,L^909522486,M^909522486,N^909522486,O^909522486,P^909522486,Q^909522486,R^909522486,S^909522486,T^909522486,U^909522486,V^909522486);j=d;k=e;l=f;m=g;n=h;i=64}function E(G,H,I){G=G|0;H=H|0;I=I|0;var J=0,K=0,L=0,M=0,N=0,O=0;if(G&63)return-1;if(~I)if(I&31)return-1;O=A(G,H,-1)|0;J=d,K=e,L=f,M=g,N=h;C();u(J,K,L,M,N,2147483648,0,0,0,0,0,0,0,0,0,672);if(~I)w(I);return O|0}function F(G,H,I,J,K){G=G|0;H=H|0;I=I|0;J=J|0;K=K|0;var L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;if(G&63)return-1;if(~K)if(K&31)return-1;t[G+H|0]=I>>>24;t[G+H+1|0]=I>>>16&255;t[G+H+2|0]=I>>>8&255;t[G+H+3|0]=I&255;E(G,H+4|0,-1)|0;L=Q=d,M=R=e,N=S=f,O=T=g,P=U=h;J=J-1|0;while((J|0)>0){B();u(Q,R,S,T,U,2147483648,0,0,0,0,0,0,0,0,0,672);Q=d,R=e,S=f,T=g,U=h;C();u(Q,R,S,T,U,2147483648,0,0,0,0,0,0,0,0,0,672);Q=d,R=e,S=f,T=g,U=h;L=L^d;M=M^e;N=N^f;O=O^g;P=P^h;J=J-1|0}d=L;e=M;f=N;g=O;h=P;if(~K)w(K);return 0}return{reset:x,init:y,process:z,finish:A,hmac_reset:B,hmac_init:D,hmac_finish:E,pbkdf2_generate_block:F}}function aa(a){a=a||{},this.heap=r(Uint8Array,a),this.asm=a.asm||_(b,null,this.heap.buffer),this.BLOCK_SIZE=fc,this.HASH_SIZE=gc,this.reset()}function ba(){return null===ic&&(ic=new aa({heapSize:1048576})),ic}function ca(a){if(void 0===a)throw new SyntaxError(\"data required\");return ba().reset().process(a).finish().result}function da(a){var b=ca(a);return j(b)}function ea(a){var b=ca(a);return k(b)}function fa(a,b,c){\"use asm\";var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;var C=new a.Uint8Array(c);function D(P,Q,R,S,T,U,V,W,X,Y,Z,$,_,aa,ba,ca){P=P|0;Q=Q|0;R=R|0;S=S|0;T=T|0;U=U|0;V=V|0;W=W|0;X=X|0;Y=Y|0;Z=Z|0;$=$|0;_=_|0;aa=aa|0;ba=ba|0;ca=ca|0;var da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0;da=d;ea=e;fa=f;ga=g;ha=h;ia=i;ja=j;ka=k;la=P+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1116352408|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=Q+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1899447441|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=R+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3049323471|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=S+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3921009573|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=T+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+961987163|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=U+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1508970993|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=V+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2453635748|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=W+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2870763221|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=X+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3624381080|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=Y+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+310598401|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=Z+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+607225278|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=$+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1426881987|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=_+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1925078388|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=aa+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2162078206|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=ba+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2614888103|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;la=ca+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3248222580|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;P=la=(Q>>>7^Q>>>18^Q>>>3^Q<<25^Q<<14)+(ba>>>17^ba>>>19^ba>>>10^ba<<15^ba<<13)+P+Y|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3835390401|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;Q=la=(R>>>7^R>>>18^R>>>3^R<<25^R<<14)+(ca>>>17^ca>>>19^ca>>>10^ca<<15^ca<<13)+Q+Z|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+4022224774|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;R=la=(S>>>7^S>>>18^S>>>3^S<<25^S<<14)+(P>>>17^P>>>19^P>>>10^P<<15^P<<13)+R+$|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+264347078|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;S=la=(T>>>7^T>>>18^T>>>3^T<<25^T<<14)+(Q>>>17^Q>>>19^Q>>>10^Q<<15^Q<<13)+S+_|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+604807628|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;T=la=(U>>>7^U>>>18^U>>>3^U<<25^U<<14)+(R>>>17^R>>>19^R>>>10^R<<15^R<<13)+T+aa|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+770255983|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;U=la=(V>>>7^V>>>18^V>>>3^V<<25^V<<14)+(S>>>17^S>>>19^S>>>10^S<<15^S<<13)+U+ba|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1249150122|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;V=la=(W>>>7^W>>>18^W>>>3^W<<25^W<<14)+(T>>>17^T>>>19^T>>>10^T<<15^T<<13)+V+ca|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1555081692|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;W=la=(X>>>7^X>>>18^X>>>3^X<<25^X<<14)+(U>>>17^U>>>19^U>>>10^U<<15^U<<13)+W+P|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1996064986|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;X=la=(Y>>>7^Y>>>18^Y>>>3^Y<<25^Y<<14)+(V>>>17^V>>>19^V>>>10^V<<15^V<<13)+X+Q|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2554220882|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;Y=la=(Z>>>7^Z>>>18^Z>>>3^Z<<25^Z<<14)+(W>>>17^W>>>19^W>>>10^W<<15^W<<13)+Y+R|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2821834349|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;Z=la=($>>>7^$>>>18^$>>>3^$<<25^$<<14)+(X>>>17^X>>>19^X>>>10^X<<15^X<<13)+Z+S|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2952996808|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;$=la=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(Y>>>17^Y>>>19^Y>>>10^Y<<15^Y<<13)+$+T|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3210313671|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;_=la=(aa>>>7^aa>>>18^aa>>>3^aa<<25^aa<<14)+(Z>>>17^Z>>>19^Z>>>10^Z<<15^Z<<13)+_+U|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3336571891|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;aa=la=(ba>>>7^ba>>>18^ba>>>3^ba<<25^ba<<14)+($>>>17^$>>>19^$>>>10^$<<15^$<<13)+aa+V|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3584528711|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;ba=la=(ca>>>7^ca>>>18^ca>>>3^ca<<25^ca<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+ba+W|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+113926993|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;ca=la=(P>>>7^P>>>18^P>>>3^P<<25^P<<14)+(aa>>>17^aa>>>19^aa>>>10^aa<<15^aa<<13)+ca+X|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+338241895|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;P=la=(Q>>>7^Q>>>18^Q>>>3^Q<<25^Q<<14)+(ba>>>17^ba>>>19^ba>>>10^ba<<15^ba<<13)+P+Y|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+666307205|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;Q=la=(R>>>7^R>>>18^R>>>3^R<<25^R<<14)+(ca>>>17^ca>>>19^ca>>>10^ca<<15^ca<<13)+Q+Z|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+773529912|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;R=la=(S>>>7^S>>>18^S>>>3^S<<25^S<<14)+(P>>>17^P>>>19^P>>>10^P<<15^P<<13)+R+$|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1294757372|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;S=la=(T>>>7^T>>>18^T>>>3^T<<25^T<<14)+(Q>>>17^Q>>>19^Q>>>10^Q<<15^Q<<13)+S+_|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1396182291|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;T=la=(U>>>7^U>>>18^U>>>3^U<<25^U<<14)+(R>>>17^R>>>19^R>>>10^R<<15^R<<13)+T+aa|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1695183700|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;U=la=(V>>>7^V>>>18^V>>>3^V<<25^V<<14)+(S>>>17^S>>>19^S>>>10^S<<15^S<<13)+U+ba|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1986661051|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;V=la=(W>>>7^W>>>18^W>>>3^W<<25^W<<14)+(T>>>17^T>>>19^T>>>10^T<<15^T<<13)+V+ca|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2177026350|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;W=la=(X>>>7^X>>>18^X>>>3^X<<25^X<<14)+(U>>>17^U>>>19^U>>>10^U<<15^U<<13)+W+P|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2456956037|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;X=la=(Y>>>7^Y>>>18^Y>>>3^Y<<25^Y<<14)+(V>>>17^V>>>19^V>>>10^V<<15^V<<13)+X+Q|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2730485921|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;Y=la=(Z>>>7^Z>>>18^Z>>>3^Z<<25^Z<<14)+(W>>>17^W>>>19^W>>>10^W<<15^W<<13)+Y+R|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2820302411|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;Z=la=($>>>7^$>>>18^$>>>3^$<<25^$<<14)+(X>>>17^X>>>19^X>>>10^X<<15^X<<13)+Z+S|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3259730800|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;$=la=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(Y>>>17^Y>>>19^Y>>>10^Y<<15^Y<<13)+$+T|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3345764771|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;_=la=(aa>>>7^aa>>>18^aa>>>3^aa<<25^aa<<14)+(Z>>>17^Z>>>19^Z>>>10^Z<<15^Z<<13)+_+U|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3516065817|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;aa=la=(ba>>>7^ba>>>18^ba>>>3^ba<<25^ba<<14)+($>>>17^$>>>19^$>>>10^$<<15^$<<13)+aa+V|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3600352804|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;ba=la=(ca>>>7^ca>>>18^ca>>>3^ca<<25^ca<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+ba+W|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+4094571909|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;ca=la=(P>>>7^P>>>18^P>>>3^P<<25^P<<14)+(aa>>>17^aa>>>19^aa>>>10^aa<<15^aa<<13)+ca+X|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+275423344|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;P=la=(Q>>>7^Q>>>18^Q>>>3^Q<<25^Q<<14)+(ba>>>17^ba>>>19^ba>>>10^ba<<15^ba<<13)+P+Y|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+430227734|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;Q=la=(R>>>7^R>>>18^R>>>3^R<<25^R<<14)+(ca>>>17^ca>>>19^ca>>>10^ca<<15^ca<<13)+Q+Z|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+506948616|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;R=la=(S>>>7^S>>>18^S>>>3^S<<25^S<<14)+(P>>>17^P>>>19^P>>>10^P<<15^P<<13)+R+$|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+659060556|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;S=la=(T>>>7^T>>>18^T>>>3^T<<25^T<<14)+(Q>>>17^Q>>>19^Q>>>10^Q<<15^Q<<13)+S+_|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+883997877|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;T=la=(U>>>7^U>>>18^U>>>3^U<<25^U<<14)+(R>>>17^R>>>19^R>>>10^R<<15^R<<13)+T+aa|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+958139571|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;U=la=(V>>>7^V>>>18^V>>>3^V<<25^V<<14)+(S>>>17^S>>>19^S>>>10^S<<15^S<<13)+U+ba|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1322822218|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;V=la=(W>>>7^W>>>18^W>>>3^W<<25^W<<14)+(T>>>17^T>>>19^T>>>10^T<<15^T<<13)+V+ca|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1537002063|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;W=la=(X>>>7^X>>>18^X>>>3^X<<25^X<<14)+(U>>>17^U>>>19^U>>>10^U<<15^U<<13)+W+P|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1747873779|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;X=la=(Y>>>7^Y>>>18^Y>>>3^Y<<25^Y<<14)+(V>>>17^V>>>19^V>>>10^V<<15^V<<13)+X+Q|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+1955562222|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;Y=la=(Z>>>7^Z>>>18^Z>>>3^Z<<25^Z<<14)+(W>>>17^W>>>19^W>>>10^W<<15^W<<13)+Y+R|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2024104815|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;Z=la=($>>>7^$>>>18^$>>>3^$<<25^$<<14)+(X>>>17^X>>>19^X>>>10^X<<15^X<<13)+Z+S|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2227730452|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;$=la=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(Y>>>17^Y>>>19^Y>>>10^Y<<15^Y<<13)+$+T|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2361852424|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;_=la=(aa>>>7^aa>>>18^aa>>>3^aa<<25^aa<<14)+(Z>>>17^Z>>>19^Z>>>10^Z<<15^Z<<13)+_+U|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2428436474|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;aa=la=(ba>>>7^ba>>>18^ba>>>3^ba<<25^ba<<14)+($>>>17^$>>>19^$>>>10^$<<15^$<<13)+aa+V|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+2756734187|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;ba=la=(ca>>>7^ca>>>18^ca>>>3^ca<<25^ca<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+ba+W|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3204031479|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;ca=la=(P>>>7^P>>>18^P>>>3^P<<25^P<<14)+(aa>>>17^aa>>>19^aa>>>10^aa<<15^aa<<13)+ca+X|0;la=la+ka+(ha>>>6^ha>>>11^ha>>>25^ha<<26^ha<<21^ha<<7)+(ja^ha&(ia^ja))+3329325298|0;ka=ja;ja=ia;ia=ha;ha=ga+la|0;ga=fa;fa=ea;ea=da;da=la+(ea&fa^ga&(ea^fa))+(ea>>>2^ea>>>13^ea>>>22^ea<<30^ea<<19^ea<<10)|0;d=d+da|0;e=e+ea|0;f=f+fa|0;g=g+ga|0;h=h+ha|0;i=i+ia|0;j=j+ja|0;k=k+ka|0}function E(P){P=P|0;D(C[P|0]<<24|C[P|1]<<16|C[P|2]<<8|C[P|3],C[P|4]<<24|C[P|5]<<16|C[P|6]<<8|C[P|7],C[P|8]<<24|C[P|9]<<16|C[P|10]<<8|C[P|11],C[P|12]<<24|C[P|13]<<16|C[P|14]<<8|C[P|15],C[P|16]<<24|C[P|17]<<16|C[P|18]<<8|C[P|19],C[P|20]<<24|C[P|21]<<16|C[P|22]<<8|C[P|23],C[P|24]<<24|C[P|25]<<16|C[P|26]<<8|C[P|27],C[P|28]<<24|C[P|29]<<16|C[P|30]<<8|C[P|31],C[P|32]<<24|C[P|33]<<16|C[P|34]<<8|C[P|35],C[P|36]<<24|C[P|37]<<16|C[P|38]<<8|C[P|39],C[P|40]<<24|C[P|41]<<16|C[P|42]<<8|C[P|43],C[P|44]<<24|C[P|45]<<16|C[P|46]<<8|C[P|47],C[P|48]<<24|C[P|49]<<16|C[P|50]<<8|C[P|51],C[P|52]<<24|C[P|53]<<16|C[P|54]<<8|C[P|55],C[P|56]<<24|C[P|57]<<16|C[P|58]<<8|C[P|59],C[P|60]<<24|C[P|61]<<16|C[P|62]<<8|C[P|63])}function F(P){P=P|0;C[P|0]=d>>>24;C[P|1]=d>>>16&255;C[P|2]=d>>>8&255;C[P|3]=d&255;C[P|4]=e>>>24;C[P|5]=e>>>16&255;C[P|6]=e>>>8&255;C[P|7]=e&255;C[P|8]=f>>>24;C[P|9]=f>>>16&255;C[P|10]=f>>>8&255;C[P|11]=f&255;C[P|12]=g>>>24;C[P|13]=g>>>16&255;C[P|14]=g>>>8&255;C[P|15]=g&255;C[P|16]=h>>>24;C[P|17]=h>>>16&255;C[P|18]=h>>>8&255;C[P|19]=h&255;C[P|20]=i>>>24;C[P|21]=i>>>16&255;C[P|22]=i>>>8&255;C[P|23]=i&255;C[P|24]=j>>>24;C[P|25]=j>>>16&255;C[P|26]=j>>>8&255;C[P|27]=j&255;C[P|28]=k>>>24;C[P|29]=k>>>16&255;C[P|30]=k>>>8&255;C[P|31]=k&255}function G(){d=1779033703;e=3144134277;f=1013904242;g=2773480762;h=1359893119;i=2600822924;j=528734635;k=1541459225;l=0}function H(P,Q,R,S,T,U,V,W,X){P=P|0;Q=Q|0;R=R|0;S=S|0;T=T|0;U=U|0;V=V|0;W=W|0;X=X|0;d=P;e=Q;f=R;g=S;h=T;i=U;j=V;k=W;l=X}function I(P,Q){P=P|0;Q=Q|0;var R=0;if(P&63)return-1;while((Q|0)>=64){E(P);P=P+64|0;Q=Q-64|0;R=R+64|0}l=l+R|0;return R|0}function J(P,Q,R){P=P|0;Q=Q|0;R=R|0;var S=0,T=0;if(P&63)return-1;if(~R)if(R&31)return-1;if((Q|0)>=64){S=I(P,Q)|0;if((S|0)==-1)return-1;P=P+S|0;Q=Q-S|0}S=S+Q|0;l=l+Q|0;C[P|Q]=128;if((Q|0)>=56){for(T=Q+1|0;(T|0)<64;T=T+1|0)C[P|T]=0;E(P);Q=0;C[P|0]=0}for(T=Q+1|0;(T|0)<59;T=T+1|0)C[P|T]=0;C[P|59]=l>>>29;C[P|60]=l>>>21&255;C[P|61]=l>>>13&255;C[P|62]=l>>>5&255;C[P|63]=l<<3&255;E(P);if(~R)F(R);return S|0}function K(){d=m;e=n;f=o;g=p;h=q;i=r;j=s;k=t;l=64}function L(){d=u;e=v;f=w;g=x;h=y;i=z;j=A;k=B;l=64}function M(P,Q,R,S,T,U,V,W,X,Y,Z,$,_,aa,ba,ca){P=P|0;Q=Q|0;R=R|0;S=S|0;T=T|0;U=U|0;V=V|0;W=W|0;X=X|0;Y=Y|0;Z=Z|0;$=$|0;_=_|0;aa=aa|0;ba=ba|0;ca=ca|0;G();D(P^1549556828,Q^1549556828,R^1549556828,S^1549556828,T^1549556828,U^1549556828,V^1549556828,W^1549556828,X^1549556828,Y^1549556828,Z^1549556828,$^1549556828,_^1549556828,aa^1549556828,ba^1549556828,ca^1549556828);u=d;v=e;w=f;x=g;y=h;z=i;A=j;B=k;G();D(P^909522486,Q^909522486,R^909522486,S^909522486,T^909522486,U^909522486,V^909522486,W^909522486,X^909522486,Y^909522486,Z^909522486,$^909522486,_^909522486,aa^909522486,ba^909522486,ca^909522486);m=d;n=e;o=f;p=g;q=h;r=i;s=j;t=k;l=64}function N(P,Q,R){P=P|0;Q=Q|0;R=R|0;var S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0;if(P&63)return-1;if(~R)if(R&31)return-1;$=J(P,Q,-1)|0;S=d,T=e,U=f,V=g,W=h,X=i,Y=j,Z=k;L();D(S,T,U,V,W,X,Y,Z,2147483648,0,0,0,0,0,0,768);if(~R)F(R);return $|0}function O(P,Q,R,S,T){P=P|0;Q=Q|0;R=R|0;S=S|0;T=T|0;var U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;if(P&63)return-1;if(~T)if(T&31)return-1;C[P+Q|0]=R>>>24;C[P+Q+1|0]=R>>>16&255;C[P+Q+2|0]=R>>>8&255;C[P+Q+3|0]=R&255;N(P,Q+4|0,-1)|0;U=aa=d,V=ba=e,W=ca=f,X=da=g,Y=ea=h,Z=fa=i,$=ga=j,_=ha=k;S=S-1|0;while((S|0)>0){K();D(aa,ba,ca,da,ea,fa,ga,ha,2147483648,0,0,0,0,0,0,768);aa=d,ba=e,ca=f,da=g,ea=h,fa=i,ga=j,ha=k;L();D(aa,ba,ca,da,ea,fa,ga,ha,2147483648,0,0,0,0,0,0,768);aa=d,ba=e,ca=f,da=g,ea=h,fa=i,ga=j,ha=k;U=U^d;V=V^e;W=W^f;X=X^g;Y=Y^h;Z=Z^i;$=$^j;_=_^k;S=S-1|0}d=U;e=V;f=W;g=X;h=Y;i=Z;j=$;k=_;if(~T)F(T);return 0}return{reset:G,init:H,process:I,finish:J,hmac_reset:K,hmac_init:M,hmac_finish:N,pbkdf2_generate_block:O}}function ga(a){a=a||{},this.heap=r(Uint8Array,a),this.asm=a.asm||fa(b,null,this.heap.buffer),this.BLOCK_SIZE=jc,this.HASH_SIZE=kc,this.reset()}function ha(){return null===mc&&(mc=new ga({heapSize:1048576})),mc}function ia(a){if(void 0===a)throw new SyntaxError(\"data required\");return ha().reset().process(a).finish().result}function ja(a){var b=ia(a);return j(b)}function ka(a){var b=ia(a);return k(b)}function la(a){if(a=a||{},!a.hash)throw new SyntaxError(\"option 'hash' is required\");if(!a.hash.HASH_SIZE)throw new SyntaxError(\"option 'hash' supplied doesn't seem to be a valid hash function\");return this.hash=a.hash,this.BLOCK_SIZE=this.hash.BLOCK_SIZE,this.HMAC_SIZE=this.hash.HASH_SIZE,this.key=null,this.verify=null,this.result=null,(void 0!==a.password||void 0!==a.verify)&&this.reset(a),this}function ma(a,b){if(o(b)&&(b=new Uint8Array(b)),n(b)&&(b=f(b)),!p(b))throw new TypeError(\"password isn't of expected type\");var c=new Uint8Array(a.BLOCK_SIZE);return c.set(b.length>a.BLOCK_SIZE?a.reset().process(b).finish().result:b),c}function na(a){if(o(a)||p(a))a=new Uint8Array(a);else{if(!n(a))throw new TypeError(\"verify tag isn't of expected type\");a=f(a)}if(a.length!==this.HMAC_SIZE)throw new d(\"illegal verification tag size\");this.verify=a}function oa(a){a=a||{};var b=a.password;if(null===this.key&&!n(b)&&!b)throw new c(\"no key is associated with the instance\");this.result=null,this.hash.reset(),(b||n(b))&&(this.key=ma(this.hash,b));for(var d=new Uint8Array(this.key),e=0;e<d.length;++e)d[e]^=54;this.hash.process(d);var f=a.verify;return void 0!==f?na.call(this,f):this.verify=null,this}function pa(a){if(null===this.key)throw new c(\"no key is associated with the instance\");if(null!==this.result)throw new c(\"state must be reset before processing new data\");return this.hash.process(a),this}function qa(){if(null===this.key)throw new c(\"no key is associated with the instance\");if(null!==this.result)throw new c(\"state must be reset before processing new data\");for(var a=this.hash.finish().result,b=new Uint8Array(this.key),d=0;d<b.length;++d)b[d]^=92;var e=this.verify,f=this.hash.reset().process(b).process(a).finish().result;if(e)if(e.length===f.length){for(var g=0,d=0;d<e.length;d++)g|=e[d]^f[d];this.result=!g}else this.result=!1;else this.result=f;return this}function ra(a){return a=a||{},a.hash instanceof aa||(a.hash=ba()),la.call(this,a),this}function sa(a){a=a||{},this.result=null,this.hash.reset();var b=a.password;if(void 0!==b){n(b)&&(b=f(b));var c=this.key=ma(this.hash,b);this.hash.reset().asm.hmac_init(c[0]<<24|c[1]<<16|c[2]<<8|c[3],c[4]<<24|c[5]<<16|c[6]<<8|c[7],c[8]<<24|c[9]<<16|c[10]<<8|c[11],c[12]<<24|c[13]<<16|c[14]<<8|c[15],c[16]<<24|c[17]<<16|c[18]<<8|c[19],c[20]<<24|c[21]<<16|c[22]<<8|c[23],c[24]<<24|c[25]<<16|c[26]<<8|c[27],c[28]<<24|c[29]<<16|c[30]<<8|c[31],c[32]<<24|c[33]<<16|c[34]<<8|c[35],c[36]<<24|c[37]<<16|c[38]<<8|c[39],c[40]<<24|c[41]<<16|c[42]<<8|c[43],c[44]<<24|c[45]<<16|c[46]<<8|c[47],c[48]<<24|c[49]<<16|c[50]<<8|c[51],c[52]<<24|c[53]<<16|c[54]<<8|c[55],c[56]<<24|c[57]<<16|c[58]<<8|c[59],c[60]<<24|c[61]<<16|c[62]<<8|c[63])}else this.hash.asm.hmac_reset();var d=a.verify;return void 0!==d?na.call(this,d):this.verify=null,this}function ta(){if(null===this.key)throw new c(\"no key is associated with the instance\");if(null!==this.result)throw new c(\"state must be reset before processing new data\");var a=this.hash,b=this.hash.asm,d=this.hash.heap;b.hmac_finish(a.pos,a.len,0);var e=this.verify,f=new Uint8Array(gc);if(f.set(d.subarray(0,gc)),e)if(e.length===f.length){for(var g=0,h=0;h<e.length;h++)g|=e[h]^f[h];this.result=!g}else this.result=!1;else this.result=f;return this}function ua(){return null===pc&&(pc=new ra),pc}function va(a){return a=a||{},a.hash instanceof ga||(a.hash=ha()),la.call(this,a),this}function wa(a){a=a||{},this.result=null,this.hash.reset();var b=a.password;if(void 0!==b){n(b)&&(b=f(b));var c=this.key=ma(this.hash,b);this.hash.reset().asm.hmac_init(c[0]<<24|c[1]<<16|c[2]<<8|c[3],c[4]<<24|c[5]<<16|c[6]<<8|c[7],c[8]<<24|c[9]<<16|c[10]<<8|c[11],c[12]<<24|c[13]<<16|c[14]<<8|c[15],c[16]<<24|c[17]<<16|c[18]<<8|c[19],c[20]<<24|c[21]<<16|c[22]<<8|c[23],c[24]<<24|c[25]<<16|c[26]<<8|c[27],c[28]<<24|c[29]<<16|c[30]<<8|c[31],c[32]<<24|c[33]<<16|c[34]<<8|c[35],c[36]<<24|c[37]<<16|c[38]<<8|c[39],c[40]<<24|c[41]<<16|c[42]<<8|c[43],c[44]<<24|c[45]<<16|c[46]<<8|c[47],c[48]<<24|c[49]<<16|c[50]<<8|c[51],c[52]<<24|c[53]<<16|c[54]<<8|c[55],c[56]<<24|c[57]<<16|c[58]<<8|c[59],c[60]<<24|c[61]<<16|c[62]<<8|c[63])}else this.hash.asm.hmac_reset();var d=a.verify;return void 0!==d?na.call(this,d):this.verify=null,this}function xa(){if(null===this.key)throw new c(\"no key is associated with the instance\");if(null!==this.result)throw new c(\"state must be reset before processing new data\");var a=this.hash,b=this.hash.asm,d=this.hash.heap;b.hmac_finish(a.pos,a.len,0);var e=this.verify,f=new Uint8Array(kc);if(f.set(d.subarray(0,kc)),e)if(e.length===f.length){for(var g=0,h=0;h<e.length;h++)g|=e[h]^f[h];this.result=!g}else this.result=!1;else this.result=f;return this}function ya(){return null===rc&&(rc=new va),rc}function za(a,b){if(void 0===a)throw new SyntaxError(\"data required\");if(void 0===b)throw new SyntaxError(\"password required\");return ua().reset({password:b}).process(a).finish().result}function Aa(a,b){var c=za(a,b);return j(c)}function Ba(a,b){var c=za(a,b);return k(c)}function Ca(a,b){if(void 0===a)throw new SyntaxError(\"data required\");if(void 0===b)throw new SyntaxError(\"password required\");return ya().reset({password:b}).process(a).finish().result}function Da(a,b){var c=Ca(a,b);return j(c)}function Ea(a,b){var c=Ca(a,b);return k(c)}function Fa(a){if(a=a||{},!a.hmac)throw new SyntaxError(\"option 'hmac' is required\");if(!a.hmac.HMAC_SIZE)throw new SyntaxError(\"option 'hmac' supplied doesn't seem to be a valid HMAC function\");this.hmac=a.hmac,this.count=a.count||4096,this.length=a.length||this.hmac.HMAC_SIZE,this.result=null;var b=a.password;return(b||n(b))&&this.reset(a),this}function Ga(a){return this.result=null,this.hmac.reset(a),this}function Ha(a,b,e){if(null!==this.result)throw new c(\"state must be reset before processing new data\");if(!a&&!n(a))throw new d(\"bad 'salt' value\");b=b||this.count,e=e||this.length,this.result=new Uint8Array(e);for(var f=Math.ceil(e/this.hmac.HMAC_SIZE),g=1;f>=g;++g){var h=(g-1)*this.hmac.HMAC_SIZE,i=(f>g?0:e%this.hmac.HMAC_SIZE)||this.hmac.HMAC_SIZE,j=new Uint8Array(this.hmac.reset().process(a).process(new Uint8Array([g>>>24&255,g>>>16&255,g>>>8&255,255&g])).finish().result);this.result.set(j.subarray(0,i),h);for(var k=1;b>k;++k){j=new Uint8Array(this.hmac.reset().process(j).finish().result);for(var l=0;i>l;++l)this.result[h+l]^=j[l]}}return this}function Ia(a){return a=a||{},a.hmac instanceof ra||(a.hmac=ua()),Fa.call(this,a),this}function Ja(a,b,e){if(null!==this.result)throw new c(\"state must be reset before processing new data\");if(!a&&!n(a))throw new d(\"bad 'salt' value\");b=b||this.count,e=e||this.length,this.result=new Uint8Array(e);for(var f=Math.ceil(e/this.hmac.HMAC_SIZE),g=1;f>=g;++g){var h=(g-1)*this.hmac.HMAC_SIZE,i=(f>g?0:e%this.hmac.HMAC_SIZE)||this.hmac.HMAC_SIZE;this.hmac.reset().process(a),this.hmac.hash.asm.pbkdf2_generate_block(this.hmac.hash.pos,this.hmac.hash.len,g,b,0),this.result.set(this.hmac.hash.heap.subarray(0,i),h)}return this}function Ka(){return null===uc&&(uc=new Ia),uc}function La(a){return a=a||{},a.hmac instanceof va||(a.hmac=ya()),Fa.call(this,a),this}function Ma(a,b,e){if(null!==this.result)throw new c(\"state must be reset before processing new data\");if(!a&&!n(a))throw new d(\"bad 'salt' value\");b=b||this.count,e=e||this.length,this.result=new Uint8Array(e);for(var f=Math.ceil(e/this.hmac.HMAC_SIZE),g=1;f>=g;++g){var h=(g-1)*this.hmac.HMAC_SIZE,i=(f>g?0:e%this.hmac.HMAC_SIZE)||this.hmac.HMAC_SIZE;this.hmac.reset().process(a),this.hmac.hash.asm.pbkdf2_generate_block(this.hmac.hash.pos,this.hmac.hash.len,g,b,0),this.result.set(this.hmac.hash.heap.subarray(0,i),h)}return this}function Na(){return null===wc&&(wc=new La),wc}function Oa(a,b,c,d){if(void 0===a)throw new SyntaxError(\"password required\");if(void 0===b)throw new SyntaxError(\"salt required\");return Ka().reset({password:a}).generate(b,c,d).result}function Pa(a,b,c,d){var e=Oa(a,b,c,d);return j(e)}function Qa(a,b,c,d){var e=Oa(a,b,c,d);return k(e)}function Ra(a,b,c,d){if(void 0===a)throw new SyntaxError(\"password required\");if(void 0===b)throw new SyntaxError(\"salt required\");return Na().reset({password:a}).generate(b,c,d).result}function Sa(a,b,c,d){var e=Ra(a,b,c,d);return j(e)}function Ta(a,b,c,d){var e=Ra(a,b,c,d);return k(e)}function Ua(){if(void 0!==Dc)d=new Uint8Array(32),xc.call(Dc,d),Gc(d);else{var a,c,d=new Ub(3);d[0]=Bc(),d[1]=Ac(),d[2]=Ec(),d=new Uint8Array(d.buffer);var e=Na();for(a=0;100>a;a++)d=e.reset({password:d}).generate(b.location.href,1e3,32).result,c=Ec(),d[0]^=c>>>24,d[1]^=c>>>16,d[2]^=c>>>8,d[3]^=c;Gc(d)}Hc=0,Ic=!0}function Va(a){if(!o(a)&&!q(a))throw new TypeError(\"bad seed type\");var b=a.byteOffest||0,c=a.byteLength||a.length,d=new Uint8Array(a.buffer||a,b,c);Gc(d),Hc=0;for(var e=0,f=0;f<d.length;f++)e|=d[f],d[f]=0;return 0!==e&&(Kc+=4*c),Jc=Kc>=Lc}function Wa(a){if(Ic||Ua(),!Jc&&void 0===Dc){if(!Mc)throw new e(\"No strong PRNGs available. Use asmCrypto.random.seed().\");void 0!==zc&&zc.error(\"No strong PRNGs available; your security is greatly lowered. Use asmCrypto.random.seed().\")}if(!Nc&&!Jc&&void 0!==Dc&&void 0!==zc){var b=(new Error).stack;Oc[b]|=0,Oc[b]++||zc.warn(\"asmCrypto PRNG not seeded; your security relies on your system PRNG. If this is not acceptable, use asmCrypto.random.seed().\")}if(!o(a)&&!q(a))throw new TypeError(\"unexpected buffer type\");var c,d,f=a.byteOffset||0,g=a.byteLength||a.length,h=new Uint8Array(a.buffer||a,f,g);for(void 0!==Dc&&xc.call(Dc,h),c=0;g>c;c++)0===(3&c)&&(Hc>=1099511627776&&Ua(),d=Fc(),Hc++),h[c]^=d,d>>>=8;return a}function Xa(){(!Ic||Hc>=1099511627776)&&Ua();var a=(1048576*Fc()+(Fc()>>>12))/4503599627370496;return Hc+=2,a}function Ya(a,b){return a*b|0}function Za(a,b,c){\"use asm\";var d=0;var e=new a.Uint32Array(c);var f=a.Math.imul;function g(u){u=u|0;d=u=u+31&-32;return u|0}function h(u){u=u|0;var v=0;v=d;d=v+(u+31&-32)|0;return v|0}function i(u){u=u|0;d=d-(u+31&-32)|0}function j(u,v,w){u=u|0;v=v|0;w=w|0;var x=0;if((v|0)>(w|0)){for(;(x|0)<(u|0);x=x+4|0){e[w+x>>2]=e[v+x>>2]}}else{for(x=u-4|0;(x|0)>=0;x=x-4|0){e[w+x>>2]=e[v+x>>2]}}}function k(u,v,w){u=u|0;v=v|0;w=w|0;var x=0;for(;(x|0)<(u|0);x=x+4|0){e[w+x>>2]=v}}function l(u,v,w,x){u=u|0;v=v|0;w=w|0;x=x|0;var y=0,z=0,A=0,B=0,C=0;if((x|0)<=0)x=v;if((x|0)<(v|0))v=x;z=1;for(;(C|0)<(v|0);C=C+4|0){y=~e[u+C>>2];A=(y&65535)+z|0;B=(y>>>16)+(A>>>16)|0;e[w+C>>2]=B<<16|A&65535;z=B>>>16}for(;(C|0)<(x|0);C=C+4|0){e[w+C>>2]=z-1|0}return z|0}function m(u,v,w,x){u=u|0;v=v|0;w=w|0;x=x|0;var y=0,z=0,A=0;if((v|0)>(x|0)){for(A=v-4|0;(A|0)>=(x|0);A=A-4|0){if(e[u+A>>2]|0)return 1}}else{for(A=x-4|0;(A|0)>=(v|0);A=A-4|0){if(e[w+A>>2]|0)return-1}}for(;(A|0)>=0;A=A-4|0){y=e[u+A>>2]|0,z=e[w+A>>2]|0;if(y>>>0<z>>>0)return-1;if(y>>>0>z>>>0)return 1}return 0}function n(u,v){u=u|0;v=v|0;var w=0;for(w=v-4|0;(w|0)>=0;w=w-4|0){if(e[u+w>>2]|0)return w+4|0}return 0}function o(u,v,w,x,y,z){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0;if((v|0)<(x|0)){D=u,u=w,w=D;D=v,v=x,x=D}if((z|0)<=0)z=v+4|0;if((z|0)<(x|0))v=x=z;for(;(F|0)<(x|0);F=F+4|0){A=e[u+F>>2]|0;B=e[w+F>>2]|0;D=((A&65535)+(B&65535)|0)+C|0;E=((A>>>16)+(B>>>16)|0)+(D>>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>>16}for(;(F|0)<(v|0);F=F+4|0){A=e[u+F>>2]|0;D=(A&65535)+C|0;E=(A>>>16)+(D>>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>>16}for(;(F|0)<(z|0);F=F+4|0){e[y+F>>2]=C|0;C=0}return C|0}function p(u,v,w,x,y,z){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0;if((z|0)<=0)z=(v|0)>(x|0)?v+4|0:x+4|0;if((z|0)<(v|0))v=z;if((z|0)<(x|0))x=z;if((v|0)<(x|0)){for(;(F|0)<(v|0);F=F+4|0){A=e[u+F>>2]|0;B=e[w+F>>2]|0;D=((A&65535)-(B&65535)|0)+C|0;E=((A>>>16)-(B>>>16)|0)+(D>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>16}for(;(F|0)<(x|0);F=F+4|0){B=e[w+F>>2]|0;D=C-(B&65535)|0;E=(D>>16)-(B>>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>16}}else{for(;(F|0)<(x|0);F=F+4|0){A=e[u+F>>2]|0;B=e[w+F>>2]|0;D=((A&65535)-(B&65535)|0)+C|0;E=((A>>>16)-(B>>>16)|0)+(D>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>16}for(;(F|0)<(v|0);F=F+4|0){A=e[u+F>>2]|0;D=(A&65535)+C|0;E=(A>>>16)+(D>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>16}}for(;(F|0)<(z|0);F=F+4|0){e[y+F>>2]=C|0}return C|0}function q(u,v,w,x,y,z){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0;if((v|0)>(x|0)){ua=u,va=v;u=w,v=x;w=ua,x=va}xa=v+x|0;if((z|0)>(xa|0)|(z|0)<=0)z=xa;if((z|0)<(v|0))v=z;if((z|0)<(x|0))x=z;for(;(ya|0)<(v|0);ya=ya+32|0){za=u+ya|0;I=e[(za|0)>>2]|0,J=e[(za|4)>>2]|0,K=e[(za|8)>>2]|0,L=e[(za|12)>>2]|0,M=e[(za|16)>>2]|0,N=e[(za|20)>>2]|0,O=e[(za|24)>>2]|0,P=e[(za|28)>>2]|0,A=I&65535,B=J&65535,C=K&65535,D=L&65535,E=M&65535,F=N&65535,G=O&65535,H=P&65535,I=I>>>16,J=J>>>16,K=K>>>16,L=L>>>16,M=M>>>16,N=N>>>16,O=O>>>16,P=P>>>16;ma=na=oa=pa=qa=ra=sa=ta=0;for(Aa=0;(Aa|0)<(x|0);Aa=Aa+32|0){Ba=w+Aa|0;Ca=y+(ya+Aa|0)|0;Y=e[(Ba|0)>>2]|0,Z=e[(Ba|4)>>2]|0,$=e[(Ba|8)>>2]|0,_=e[(Ba|12)>>2]|0,aa=e[(Ba|16)>>2]|0,ba=e[(Ba|20)>>2]|0,ca=e[(Ba|24)>>2]|0,da=e[(Ba|28)>>2]|0,Q=Y&65535,R=Z&65535,S=$&65535,T=_&65535,U=aa&65535,V=ba&65535,W=ca&65535,X=da&65535,Y=Y>>>16,Z=Z>>>16,$=$>>>16,_=_>>>16,aa=aa>>>16,ba=ba>>>16,ca=ca>>>16,da=da>>>16;ea=e[(Ca|0)>>2]|0,fa=e[(Ca|4)>>2]|0,ga=e[(Ca|8)>>2]|0,ha=e[(Ca|12)>>2]|0,ia=e[(Ca|16)>>2]|0,ja=e[(Ca|20)>>2]|0,ka=e[(Ca|24)>>2]|0,la=e[(Ca|28)>>2]|0;ua=((f(A,Q)|0)+(ma&65535)|0)+(ea&65535)|0;va=((f(I,Q)|0)+(ma>>>16)|0)+(ea>>>16)|0;wa=((f(A,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ea=wa<<16|ua&65535;ua=((f(A,R)|0)+(xa&65535)|0)+(fa&65535)|0;va=((f(I,R)|0)+(xa>>>16)|0)+(fa>>>16)|0;wa=((f(A,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;fa=wa<<16|ua&65535;ua=((f(A,S)|0)+(xa&65535)|0)+(ga&65535)|0;va=((f(I,S)|0)+(xa>>>16)|0)+(ga>>>16)|0;wa=((f(A,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ga=wa<<16|ua&65535;ua=((f(A,T)|0)+(xa&65535)|0)+(ha&65535)|0;va=((f(I,T)|0)+(xa>>>16)|0)+(ha>>>16)|0;wa=((f(A,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ha=wa<<16|ua&65535;ua=((f(A,U)|0)+(xa&65535)|0)+(ia&65535)|0;va=((f(I,U)|0)+(xa>>>16)|0)+(ia>>>16)|0;wa=((f(A,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(A,V)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(I,V)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(A,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(A,W)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(I,W)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(A,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(A,X)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(I,X)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(A,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,da)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ma=xa;ua=((f(B,Q)|0)+(na&65535)|0)+(fa&65535)|0;va=((f(J,Q)|0)+(na>>>16)|0)+(fa>>>16)|0;wa=((f(B,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;fa=wa<<16|ua&65535;ua=((f(B,R)|0)+(xa&65535)|0)+(ga&65535)|0;va=((f(J,R)|0)+(xa>>>16)|0)+(ga>>>16)|0;wa=((f(B,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ga=wa<<16|ua&65535;ua=((f(B,S)|0)+(xa&65535)|0)+(ha&65535)|0;va=((f(J,S)|0)+(xa>>>16)|0)+(ha>>>16)|0;wa=((f(B,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ha=wa<<16|ua&65535;ua=((f(B,T)|0)+(xa&65535)|0)+(ia&65535)|0;va=((f(J,T)|0)+(xa>>>16)|0)+(ia>>>16)|0;wa=((f(B,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(B,U)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(J,U)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(B,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(B,V)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(J,V)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(B,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(B,W)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(J,W)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(B,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(B,X)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(J,X)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(B,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,da)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;na=xa;ua=((f(C,Q)|0)+(oa&65535)|0)+(ga&65535)|0;va=((f(K,Q)|0)+(oa>>>16)|0)+(ga>>>16)|0;wa=((f(C,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ga=wa<<16|ua&65535;ua=((f(C,R)|0)+(xa&65535)|0)+(ha&65535)|0;va=((f(K,R)|0)+(xa>>>16)|0)+(ha>>>16)|0;wa=((f(C,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ha=wa<<16|ua&65535;ua=((f(C,S)|0)+(xa&65535)|0)+(ia&65535)|0;va=((f(K,S)|0)+(xa>>>16)|0)+(ia>>>16)|0;wa=((f(C,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(C,T)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(K,T)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(C,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(C,U)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(K,U)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(C,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(C,V)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(K,V)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(C,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(C,W)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(K,W)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(C,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(C,X)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(K,X)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(C,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,da)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;oa=xa;ua=((f(D,Q)|0)+(pa&65535)|0)+(ha&65535)|0;va=((f(L,Q)|0)+(pa>>>16)|0)+(ha>>>16)|0;wa=((f(D,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ha=wa<<16|ua&65535;ua=((f(D,R)|0)+(xa&65535)|0)+(ia&65535)|0;va=((f(L,R)|0)+(xa>>>16)|0)+(ia>>>16)|0;wa=((f(D,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(D,S)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(L,S)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(D,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(D,T)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(L,T)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(D,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(D,U)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(L,U)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(D,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(D,V)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(L,V)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(D,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(D,W)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(L,W)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(D,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(D,X)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(L,X)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(D,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,da)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;pa=xa;ua=((f(E,Q)|0)+(qa&65535)|0)+(ia&65535)|0;va=((f(M,Q)|0)+(qa>>>16)|0)+(ia>>>16)|0;wa=((f(E,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(E,R)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(M,R)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(E,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(E,S)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(M,S)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(E,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(E,T)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(M,T)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(E,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,_)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(E,U)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(M,U)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(E,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(E,V)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(M,V)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(E,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(E,W)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(M,W)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(E,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;ua=((f(E,X)|0)+(xa&65535)|0)+(pa&65535)|0;va=((f(M,X)|0)+(xa>>>16)|0)+(pa>>>16)|0;wa=((f(E,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,da)|0)+(va>>>16)|0)+(wa>>>16)|0;pa=wa<<16|ua&65535;qa=xa;ua=((f(F,Q)|0)+(ra&65535)|0)+(ja&65535)|0;va=((f(N,Q)|0)+(ra>>>16)|0)+(ja>>>16)|0;wa=((f(F,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(F,R)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(N,R)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(F,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(F,S)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(N,S)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(F,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,$)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(F,T)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(N,T)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(F,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(F,U)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(N,U)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(F,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(F,V)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(N,V)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(F,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;ua=((f(F,W)|0)+(xa&65535)|0)+(pa&65535)|0;va=((f(N,W)|0)+(xa>>>16)|0)+(pa>>>16)|0;wa=((f(F,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;pa=wa<<16|ua&65535;ua=((f(F,X)|0)+(xa&65535)|0)+(qa&65535)|0;va=((f(N,X)|0)+(xa>>>16)|0)+(qa>>>16)|0;wa=((f(F,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,da)|0)+(va>>>16)|0)+(wa>>>16)|0;qa=wa<<16|ua&65535;ra=xa;ua=((f(G,Q)|0)+(sa&65535)|0)+(ka&65535)|0;va=((f(O,Q)|0)+(sa>>>16)|0)+(ka>>>16)|0;wa=((f(G,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(G,R)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(O,R)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(G,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(G,S)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(O,S)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(G,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(G,T)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(O,T)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(G,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,_)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(G,U)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(O,U)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(G,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;ua=((f(G,V)|0)+(xa&65535)|0)+(pa&65535)|0;va=((f(O,V)|0)+(xa>>>16)|0)+(pa>>>16)|0;wa=((f(G,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;pa=wa<<16|ua&65535;ua=((f(G,W)|0)+(xa&65535)|0)+(qa&65535)|0;va=((f(O,W)|0)+(xa>>>16)|0)+(qa>>>16)|0;wa=((f(G,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;qa=wa<<16|ua&65535;ua=((f(G,X)|0)+(xa&65535)|0)+(ra&65535)|0;va=((f(O,X)|0)+(xa>>>16)|0)+(ra>>>16)|0;wa=((f(G,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,da)|0)+(va>>>16)|0)+(wa>>>16)|0;ra=wa<<16|ua&65535;sa=xa;ua=((f(H,Q)|0)+(ta&65535)|0)+(la&65535)|0;va=((f(P,Q)|0)+(ta>>>16)|0)+(la>>>16)|0;wa=((f(H,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(H,R)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(P,R)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(H,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(H,S)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(P,S)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(H,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,$)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(H,T)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(P,T)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(H,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,_)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;ua=((f(H,U)|0)+(xa&65535)|0)+(pa&65535)|0;va=((f(P,U)|0)+(xa>>>16)|0)+(pa>>>16)|0;wa=((f(H,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;pa=wa<<16|ua&65535;ua=((f(H,V)|0)+(xa&65535)|0)+(qa&65535)|0;va=((f(P,V)|0)+(xa>>>16)|0)+(qa>>>16)|0;wa=((f(H,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;qa=wa<<16|ua&65535;ua=((f(H,W)|0)+(xa&65535)|0)+(ra&65535)|0;va=((f(P,W)|0)+(xa>>>16)|0)+(ra>>>16)|0;wa=((f(H,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;ra=wa<<16|ua&65535;ua=((f(H,X)|0)+(xa&65535)|0)+(sa&65535)|0;va=((f(P,X)|0)+(xa>>>16)|0)+(sa>>>16)|0;wa=((f(H,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,da)|0)+(va>>>16)|0)+(wa>>>16)|0;sa=wa<<16|ua&65535;ta=xa;e[(Ca|0)>>2]=ea,e[(Ca|4)>>2]=fa,e[(Ca|8)>>2]=ga,e[(Ca|12)>>2]=ha,e[(Ca|16)>>2]=ia,e[(Ca|20)>>2]=ja,e[(Ca|24)>>2]=ka,e[(Ca|28)>>2]=la}Ca=y+(ya+Aa|0)|0;e[(Ca|0)>>2]=ma,e[(Ca|4)>>2]=na,e[(Ca|8)>>2]=oa,e[(Ca|12)>>2]=pa,e[(Ca|16)>>2]=qa,e[(Ca|20)>>2]=ra,e[(Ca|24)>>2]=sa,e[(Ca|28)>>2]=ta}}function r(u,v,w){u=u|0;v=v|0;w=w|0;var x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0;for(;(Ba|0)<(v|0);Ba=Ba+4|0){Ga=w+(Ba<<1)|0;F=e[u+Ba>>2]|0,x=F&65535,F=F>>>16;ra=f(x,x)|0;sa=(f(x,F)|0)+(ra>>>17)|0;ta=(f(F,F)|0)+(sa>>>15)|0;e[Ga>>2]=sa<<17|ra&131071;e[(Ga|4)>>2]=ta}for(Aa=0;(Aa|0)<(v|0);Aa=Aa+8|0){Ea=u+Aa|0,Ga=w+(Aa<<1)|0;F=e[Ea>>2]|0,x=F&65535,F=F>>>16;V=e[(Ea|4)>>2]|0,N=V&65535,V=V>>>16;ra=f(x,N)|0;sa=(f(x,V)|0)+(ra>>>16)|0;ta=(f(F,N)|0)+(sa&65535)|0;wa=((f(F,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;xa=e[(Ga|4)>>2]|0;ra=(xa&65535)+((ra&65535)<<1)|0;ta=((xa>>>16)+((ta&65535)<<1)|0)+(ra>>>16)|0;e[(Ga|4)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|8)>>2]|0;ra=((xa&65535)+((wa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(wa>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|8)>>2]=ta<<16|ra&65535;ua=ta>>>16;if(ua){xa=e[(Ga|12)>>2]|0;ra=(xa&65535)+ua|0;ta=(xa>>>16)+(ra>>>16)|0;e[(Ga|12)>>2]=ta<<16|ra&65535}}for(Aa=0;(Aa|0)<(v|0);Aa=Aa+16|0){Ea=u+Aa|0,Ga=w+(Aa<<1)|0;F=e[Ea>>2]|0,x=F&65535,F=F>>>16,G=e[(Ea|4)>>2]|0,y=G&65535,G=G>>>16;V=e[(Ea|8)>>2]|0,N=V&65535,V=V>>>16,W=e[(Ea|12)>>2]|0,O=W&65535,W=W>>>16;ra=f(x,N)|0;sa=f(F,N)|0;ta=((f(x,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ba=ta<<16|ra&65535;ra=(f(x,O)|0)+(wa&65535)|0;sa=(f(F,O)|0)+(wa>>>16)|0;ta=((f(x,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;da=wa;ra=(f(y,N)|0)+(ca&65535)|0;sa=(f(G,N)|0)+(ca>>>16)|0;ta=((f(y,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=((f(y,O)|0)+(da&65535)|0)+(wa&65535)|0;sa=((f(G,O)|0)+(da>>>16)|0)+(wa>>>16)|0;ta=((f(y,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ea=wa;xa=e[(Ga|8)>>2]|0;ra=(xa&65535)+((ba&65535)<<1)|0;ta=((xa>>>16)+(ba>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|8)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|12)>>2]|0;ra=((xa&65535)+((ca&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ca>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|12)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|16)>>2]|0;ra=((xa&65535)+((da&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(da>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|16)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|20)>>2]|0;ra=((xa&65535)+((ea&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ea>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|20)>>2]=ta<<16|ra&65535;ua=ta>>>16;for(Da=24;!!ua&(Da|0)<32;Da=Da+4|0){xa=e[(Ga|Da)>>2]|0;ra=(xa&65535)+ua|0;ta=(xa>>>16)+(ra>>>16)|0;e[(Ga|Da)>>2]=ta<<16|ra&65535;ua=ta>>>16}}for(Aa=0;(Aa|0)<(v|0);Aa=Aa+32|0){Ea=u+Aa|0,Ga=w+(Aa<<1)|0;F=e[Ea>>2]|0,x=F&65535,F=F>>>16,G=e[(Ea|4)>>2]|0,y=G&65535,G=G>>>16,H=e[(Ea|8)>>2]|0,z=H&65535,H=H>>>16,I=e[(Ea|12)>>2]|0,A=I&65535,I=I>>>16;V=e[(Ea|16)>>2]|0,N=V&65535,V=V>>>16,W=e[(Ea|20)>>2]|0,O=W&65535,W=W>>>16,X=e[(Ea|24)>>2]|0,P=X&65535,X=X>>>16,Y=e[(Ea|28)>>2]|0,Q=Y&65535,Y=Y>>>16;ra=f(x,N)|0;sa=f(F,N)|0;ta=((f(x,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ba=ta<<16|ra&65535;ra=(f(x,O)|0)+(wa&65535)|0;sa=(f(F,O)|0)+(wa>>>16)|0;ta=((f(x,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=(f(x,P)|0)+(wa&65535)|0;sa=(f(F,P)|0)+(wa>>>16)|0;ta=((f(x,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=(f(x,Q)|0)+(wa&65535)|0;sa=(f(F,Q)|0)+(wa>>>16)|0;ta=((f(x,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;fa=wa;ra=(f(y,N)|0)+(ca&65535)|0;sa=(f(G,N)|0)+(ca>>>16)|0;ta=((f(y,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=((f(y,O)|0)+(da&65535)|0)+(wa&65535)|0;sa=((f(G,O)|0)+(da>>>16)|0)+(wa>>>16)|0;ta=((f(y,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(y,P)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(G,P)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(y,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(y,Q)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(G,Q)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(y,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ga=wa;ra=(f(z,N)|0)+(da&65535)|0;sa=(f(H,N)|0)+(da>>>16)|0;ta=((f(z,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(z,O)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(H,O)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(z,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(z,P)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(H,P)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(z,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(z,Q)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(H,Q)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(z,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ha=wa;ra=(f(A,N)|0)+(ea&65535)|0;sa=(f(I,N)|0)+(ea>>>16)|0;ta=((f(A,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(A,O)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(I,O)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(A,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(A,P)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(I,P)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(A,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(A,Q)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(I,Q)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(A,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ia=wa;xa=e[(Ga|16)>>2]|0;ra=(xa&65535)+((ba&65535)<<1)|0;ta=((xa>>>16)+(ba>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|16)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|20)>>2]|0;ra=((xa&65535)+((ca&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ca>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|20)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|24)>>2]|0;ra=((xa&65535)+((da&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(da>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|24)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|28)>>2]|0;ra=((xa&65535)+((ea&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ea>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|28)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[Ga+32>>2]|0;ra=((xa&65535)+((fa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(fa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+32>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[Ga+36>>2]|0;ra=((xa&65535)+((ga&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ga>>>16<<1)|0)+(ra>>>16)|0;e[Ga+36>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[Ga+40>>2]|0;ra=((xa&65535)+((ha&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ha>>>16<<1)|0)+(ra>>>16)|0;e[Ga+40>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[Ga+44>>2]|0;ra=((xa&65535)+((ia&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ia>>>16<<1)|0)+(ra>>>16)|0;e[Ga+44>>2]=ta<<16|ra&65535;ua=ta>>>16;for(Da=48;!!ua&(Da|0)<64;Da=Da+4|0){xa=e[Ga+Da>>2]|0;ra=(xa&65535)+ua|0;ta=(xa>>>16)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16}}for(ya=32;(ya|0)<(v|0);ya=ya<<1){za=ya<<1;for(Aa=0;(Aa|0)<(v|0);Aa=Aa+za|0){Ga=w+(Aa<<1)|0;va=0;for(Ba=0;(Ba|0)<(ya|0);Ba=Ba+32|0){Ea=(u+Aa|0)+Ba|0;F=e[Ea>>2]|0,x=F&65535,F=F>>>16,G=e[(Ea|4)>>2]|0,y=G&65535,G=G>>>16,H=e[(Ea|8)>>2]|0,z=H&65535,H=H>>>16,I=e[(Ea|12)>>2]|0,A=I&65535,I=I>>>16,J=e[(Ea|16)>>2]|0,B=J&65535,J=J>>>16,K=e[(Ea|20)>>2]|0,C=K&65535,K=K>>>16,L=e[(Ea|24)>>2]|0,D=L&65535,L=L>>>16,M=e[(Ea|28)>>2]|0,E=M&65535,M=M>>>16;ja=ka=la=ma=na=oa=pa=qa=ua=0;for(Ca=0;(Ca|0)<(ya|0);Ca=Ca+32|0){Fa=((u+Aa|0)+ya|0)+Ca|0;V=e[Fa>>2]|0,N=V&65535,V=V>>>16,W=e[(Fa|4)>>2]|0,O=W&65535,W=W>>>16,X=e[(Fa|8)>>2]|0,P=X&65535,X=X>>>16,Y=e[(Fa|12)>>2]|0,Q=Y&65535,Y=Y>>>16,Z=e[(Fa|16)>>2]|0,R=Z&65535,Z=Z>>>16,$=e[(Fa|20)>>2]|0,S=$&65535,$=$>>>16,_=e[(Fa|24)>>2]|0,T=_&65535,_=_>>>16,aa=e[(Fa|28)>>2]|0,U=aa&65535,aa=aa>>>16;ba=ca=da=ea=fa=ga=ha=ia=0;ra=((f(x,N)|0)+(ba&65535)|0)+(ja&65535)|0;sa=((f(F,N)|0)+(ba>>>16)|0)+(ja>>>16)|0;ta=((f(x,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ba=ta<<16|ra&65535;ra=((f(x,O)|0)+(ca&65535)|0)+(wa&65535)|0;sa=((f(F,O)|0)+(ca>>>16)|0)+(wa>>>16)|0;ta=((f(x,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=((f(x,P)|0)+(da&65535)|0)+(wa&65535)|0;sa=((f(F,P)|0)+(da>>>16)|0)+(wa>>>16)|0;ta=((f(x,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(x,Q)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(F,Q)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(x,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(x,R)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(F,R)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(x,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(x,S)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(F,S)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(x,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(x,T)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(F,T)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(x,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(x,U)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(F,U)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(x,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ja=wa;ra=((f(y,N)|0)+(ca&65535)|0)+(ka&65535)|0;sa=((f(G,N)|0)+(ca>>>16)|0)+(ka>>>16)|0;ta=((f(y,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=((f(y,O)|0)+(da&65535)|0)+(wa&65535)|0;sa=((f(G,O)|0)+(da>>>16)|0)+(wa>>>16)|0;ta=((f(y,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(y,P)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(G,P)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(y,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(y,Q)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(G,Q)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(y,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(y,R)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(G,R)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(y,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(y,S)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(G,S)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(y,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(y,T)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(G,T)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(y,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(y,U)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(G,U)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(y,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ka=wa;ra=((f(z,N)|0)+(da&65535)|0)+(la&65535)|0;sa=((f(H,N)|0)+(da>>>16)|0)+(la>>>16)|0;ta=((f(z,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(z,O)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(H,O)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(z,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(z,P)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(H,P)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(z,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(z,Q)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(H,Q)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(z,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(z,R)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(H,R)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(z,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(z,S)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(H,S)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(z,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(z,T)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(H,T)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(z,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(z,U)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(H,U)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(z,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;la=wa;ra=((f(A,N)|0)+(ea&65535)|0)+(ma&65535)|0;sa=((f(I,N)|0)+(ea>>>16)|0)+(ma>>>16)|0;ta=((f(A,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(A,O)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(I,O)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(A,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(A,P)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(I,P)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(A,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(A,Q)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(I,Q)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(A,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(A,R)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(I,R)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(A,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(A,S)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(I,S)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(A,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(A,T)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(I,T)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(A,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(A,U)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(I,U)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(A,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ma=wa;ra=((f(B,N)|0)+(fa&65535)|0)+(na&65535)|0;sa=((f(J,N)|0)+(fa>>>16)|0)+(na>>>16)|0;ta=((f(B,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(B,O)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(J,O)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(B,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(B,P)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(J,P)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(B,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(B,Q)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(J,Q)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(B,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(B,R)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(J,R)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(B,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(B,S)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(J,S)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(B,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(B,T)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(J,T)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(B,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ra=((f(B,U)|0)+(ma&65535)|0)+(wa&65535)|0;sa=((f(J,U)|0)+(ma>>>16)|0)+(wa>>>16)|0;ta=((f(B,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;ma=ta<<16|ra&65535;na=wa;ra=((f(C,N)|0)+(ga&65535)|0)+(oa&65535)|0;sa=((f(K,N)|0)+(ga>>>16)|0)+(oa>>>16)|0;ta=((f(C,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(C,O)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(K,O)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(C,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(C,P)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(K,P)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(C,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(C,Q)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(K,Q)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(C,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(C,R)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(K,R)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(C,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(C,S)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(K,S)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(C,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ra=((f(C,T)|0)+(ma&65535)|0)+(wa&65535)|0;sa=((f(K,T)|0)+(ma>>>16)|0)+(wa>>>16)|0;ta=((f(C,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ma=ta<<16|ra&65535;ra=((f(C,U)|0)+(na&65535)|0)+(wa&65535)|0;sa=((f(K,U)|0)+(na>>>16)|0)+(wa>>>16)|0;ta=((f(C,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;na=ta<<16|ra&65535;oa=wa;ra=((f(D,N)|0)+(ha&65535)|0)+(pa&65535)|0;sa=((f(L,N)|0)+(ha>>>16)|0)+(pa>>>16)|0;ta=((f(D,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(D,O)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(L,O)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(D,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(D,P)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(L,P)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(D,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(D,Q)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(L,Q)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(D,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(D,R)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(L,R)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(D,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ra=((f(D,S)|0)+(ma&65535)|0)+(wa&65535)|0;sa=((f(L,S)|0)+(ma>>>16)|0)+(wa>>>16)|0;ta=((f(D,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ma=ta<<16|ra&65535;ra=((f(D,T)|0)+(na&65535)|0)+(wa&65535)|0;sa=((f(L,T)|0)+(na>>>16)|0)+(wa>>>16)|0;ta=((f(D,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;na=ta<<16|ra&65535;ra=((f(D,U)|0)+(oa&65535)|0)+(wa&65535)|0;sa=((f(L,U)|0)+(oa>>>16)|0)+(wa>>>16)|0;ta=((f(D,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;oa=ta<<16|ra&65535;pa=wa;ra=((f(E,N)|0)+(ia&65535)|0)+(qa&65535)|0;sa=((f(M,N)|0)+(ia>>>16)|0)+(qa>>>16)|0;ta=((f(E,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(E,O)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(M,O)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(E,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(E,P)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(M,P)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(E,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(E,Q)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(M,Q)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(E,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ra=((f(E,R)|0)+(ma&65535)|0)+(wa&65535)|0;sa=((f(M,R)|0)+(ma>>>16)|0)+(wa>>>16)|0;ta=((f(E,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ma=ta<<16|ra&65535;ra=((f(E,S)|0)+(na&65535)|0)+(wa&65535)|0;sa=((f(M,S)|0)+(na>>>16)|0)+(wa>>>16)|0;ta=((f(E,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;na=ta<<16|ra&65535;ra=((f(E,T)|0)+(oa&65535)|0)+(wa&65535)|0;sa=((f(M,T)|0)+(oa>>>16)|0)+(wa>>>16)|0;ta=((f(E,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;oa=ta<<16|ra&65535;ra=((f(E,U)|0)+(pa&65535)|0)+(wa&65535)|0;sa=((f(M,U)|0)+(pa>>>16)|0)+(wa>>>16)|0;ta=((f(E,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;pa=ta<<16|ra&65535;qa=wa;Da=ya+(Ba+Ca|0)|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ba&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ba>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ca&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ca>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((da&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(da>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ea&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ea>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((fa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(fa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ga&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ga>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ha&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ha>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ia&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ia>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16}Da=ya+(Ba+Ca|0)|0;xa=e[Ga+Da>>2]|0;ra=(((xa&65535)+((ja&65535)<<1)|0)+ua|0)+va|0;ta=((xa>>>16)+(ja>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ka&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ka>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((la&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(la>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ma&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ma>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((na&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(na>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((oa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(oa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((pa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(pa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((qa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(qa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;va=ta>>>16}for(Da=Da+4|0;!!va&(Da|0)<za<<1;Da=Da+4|0){xa=e[Ga+Da>>2]|0;ra=(xa&65535)+va|0;ta=(xa>>>16)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;va=ta>>>16}}}}function s(u,v,w,x,y,z){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;j(v,u,y);for(Q=v-1&-4;(Q|0)>=0;Q=Q-4|0){A=e[u+Q>>2]|0;if(A){v=Q;break}}for(Q=x-1&-4;(Q|0)>=0;Q=Q-4|0){B=e[w+Q>>2]|0;if(B){x=Q;break}}while((B&2147483648)==0){B=B<<1;C=C+1|0}E=e[u+v>>2]|0;if(C)D=E>>>(32-C|0);for(Q=v-4|0;(Q|0)>=0;Q=Q-4|0){A=e[u+Q>>2]|0;e[y+Q+4>>2]=E<<C|(C?A>>>(32-C|0):0);E=A}e[y>>2]=E<<C;if(C){F=e[w+x>>2]|0;for(Q=x-4|0;(Q|0)>=0;Q=Q-4|0){B=e[w+Q>>2]|0;e[w+Q+4>>2]=F<<C|B>>>(32-C|0);F=B}e[w>>2]=F<<C}F=e[w+x>>2]|0;G=F>>>16,H=F&65535;for(Q=v;(Q|0)>=(x|0);Q=Q-4|0){R=Q-x|0;E=e[y+Q>>2]|0;I=(D>>>0)/(G>>>0)|0,K=(D>>>0)%(G>>>0)|0,M=f(I,H)|0;while((I|0)==65536|M>>>0>(K<<16|E>>>16)>>>0){I=I-1|0,K=K+G|0,M=M-H|0;if((K|0)>=65536)break}O=0,P=0;for(S=0;(S|0)<=(x|0);S=S+4|0){B=e[w+S>>2]|0;M=(f(I,B&65535)|0)+(O>>>16)|0;N=(f(I,B>>>16)|0)+(M>>>16)|0;B=O&65535|M<<16;O=N;A=e[y+R+S>>2]|0;M=((A&65535)-(B&65535)|0)+P|0;N=((A>>>16)-(B>>>16)|0)+(M>>16)|0;e[y+R+S>>2]=N<<16|M&65535;P=N>>16}M=((D&65535)-(O&65535)|0)+P|0;N=((D>>>16)-(O>>>16)|0)+(M>>16)|0;e[y+R+S>>2]=D=N<<16|M&65535;P=N>>16;if(P){I=I-1|0,K=K-G|0;P=0;for(S=0;(S|0)<=(x|0);S=S+4|0){B=e[w+S>>2]|0;A=e[y+R+S>>2]|0;M=((A&65535)+(B&65535)|0)+P|0;N=((A>>>16)+(B>>>16)|0)+(M>>>16)|0;e[y+R+S>>2]=N<<16|M&65535;P=N>>>16}e[y+R+S>>2]=D=D+P|0}E=e[y+Q>>2]|0;A=D<<16|E>>>16;J=(A>>>0)/(G>>>0)|0,L=(A>>>0)%(G>>>0)|0,M=f(J,H)|0;while((J|0)==65536|M>>>0>(L<<16|E&65535)>>>0){J=J-1|0,L=L+G|0,M=M-H|0;if((L|0)>=65536)break}O=0,P=0;for(S=0;(S|0)<=(x|0);S=S+4|0){B=e[w+S>>2]|0;M=(f(J,B&65535)|0)+(O&65535)|0;N=((f(J,B>>>16)|0)+(M>>>16)|0)+(O>>>16)|0;B=M&65535|N<<16;O=N>>>16;A=e[y+R+S>>2]|0;M=((A&65535)-(B&65535)|0)+P|0;N=((A>>>16)-(B>>>16)|0)+(M>>16)|0;P=N>>16;e[y+R+S>>2]=N<<16|M&65535}M=((D&65535)-(O&65535)|0)+P|0;N=((D>>>16)-(O>>>16)|0)+(M>>16)|0;e[y+R+S>>2]=D=N<<16|M&65535;P=N>>16;if(P){J=J-1|0,L=L+G|0;P=0;for(S=0;(S|0)<=(x|0);S=S+4|0){B=e[w+S>>2]|0;A=e[y+R+S>>2]|0;M=((A&65535)+(B&65535)|0)+P|0;N=((A>>>16)+(B>>>16)|0)+(M>>>16)|0;P=N>>>16;e[y+R+S>>2]=M&65535|N<<16}e[y+R+S>>2]=D+P|0}e[z+R>>2]=I<<16|J;D=e[y+Q>>2]|0}if(C){E=e[y>>2]|0;for(Q=4;(Q|0)<=(x|0);Q=Q+4|0){A=e[y+Q>>2]|0;e[y+Q-4>>2]=A<<(32-C|0)|E>>>C;E=A}e[y+x>>2]=E>>>C}}function t(u,v,w,x,y,z){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;A=h(x<<1)|0;k(x<<1,0,A);j(v,u,A);for(L=0;(L|0)<(x|0);L=L+4|0){C=e[A+L>>2]|0,D=C&65535,C=C>>>16;F=y>>>16,E=y&65535;G=f(D,E)|0,H=((f(D,F)|0)+(f(C,E)|0)|0)+(G>>>16)|0;D=G&65535,C=H&65535;K=0;for(M=0;(M|0)<(x|0);M=M+4|0){N=L+M|0;F=e[w+M>>2]|0,E=F&65535,F=F>>>16;J=e[A+N>>2]|0;G=((f(D,E)|0)+(K&65535)|0)+(J&65535)|0;H=((f(D,F)|0)+(K>>>16)|0)+(J>>>16)|0;I=((f(C,E)|0)+(H&65535)|0)+(G>>>16)|0;K=((f(C,F)|0)+(I>>>16)|0)+(H>>>16)|0;J=I<<16|G&65535;e[A+N>>2]=J}N=L+M|0;J=e[A+N>>2]|0;G=((J&65535)+(K&65535)|0)+B|0;H=((J>>>16)+(K>>>16)|0)+(G>>>16)|0;e[A+N>>2]=H<<16|G&65535;B=H>>>16}j(x,A+x|0,z);i(x<<1);if(B|(m(w,x,z,x)|0)<=0){p(z,x,w,x,z,x)|0}}return{sreset:g,salloc:h,sfree:i,z:k,tst:n,neg:l,cmp:m,add:o,sub:p,mul:q,sqr:r,div:s,mredc:t}}function $a(a){return a instanceof _a}function _a(a){var b=Sc,c=0,d=0;if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),void 0===a);else if(m(a)){var e=Math.abs(a);e>4294967295?(b=new Uint32Array(2),b[0]=0|e,b[1]=e/4294967296|0,c=52):e>0?(b=new Uint32Array(1),b[0]=e,c=32):(b=Sc,c=0),d=0>a?-1:1}else if(p(a)){if(c=8*a.length,!c)return Uc;b=new Uint32Array(c+31>>5);for(var g=a.length-4;g>=0;g-=4)b[a.length-4-g>>2]=a[g]<<24|a[g+1]<<16|a[g+2]<<8|a[g+3];-3===g?b[b.length-1]=a[0]:-2===g?b[b.length-1]=a[0]<<8|a[1]:-1===g&&(b[b.length-1]=a[0]<<16|a[1]<<8|a[2]),d=1}else{if(\"object\"!=typeof a||null===a)throw new TypeError(\"number is of unexpected type\");b=new Uint32Array(a.limbs),c=a.bitLength,d=a.sign}this.limbs=b,this.bitLength=c,this.sign=d}function ab(a){a=a||16;var b=this.limbs,c=this.bitLength,e=\"\";if(16!==a)throw new d(\"bad radix\");for(var f=(c+31>>5)-1;f>=0;f--){var g=b[f].toString(16);e+=\"00000000\".substr(g.length),e+=g}return e=e.replace(/^0+/,\"\"),e.length||(e=\"0\"),this.sign<0&&(e=\"-\"+e),e}function bb(){var a=this.bitLength,b=this.limbs;if(0===a)return new Uint8Array(0);for(var c=a+7>>3,d=new Uint8Array(c),e=0;c>e;e++){var f=c-e-1;d[e]=b[f>>2]>>((3&f)<<3)}return d}function cb(){var a=this.limbs,b=this.bitLength,c=this.sign;if(!c)return 0;if(32>=b)return c*(a[0]>>>0);if(52>=b)return c*(4294967296*(a[1]>>>0)+(a[0]>>>0));var d,e,f=0;for(d=a.length-1;d>=0;d--)if(0!==(e=a[d])){for(;0===(e<<f&2147483648);)f++;break}return 0===d?c*(a[0]>>>0):c*(1048576*((a[d]<<f|(f?a[d-1]>>>32-f:0))>>>0)+((a[d-1]<<f|(f&&d>1?a[d-2]>>>32-f:0))>>>12))*Math.pow(2,32*d-f-52)}function db(a){var b=this.limbs,c=this.bitLength;if(a>=c)return this;var d=new _a,e=a+31>>5,f=a%32;return d.limbs=new Uint32Array(b.subarray(0,e)),d.bitLength=a,d.sign=this.sign,f&&(d.limbs[e-1]&=-1>>>32-f),d}function eb(a,b){if(!m(a))throw new TypeError(\"TODO\");if(void 0!==b&&!m(b))throw new TypeError(\"TODO\");var c=this.limbs,d=this.bitLength;if(0>a)throw new RangeError(\"TODO\");if(a>=d)return Uc;(void 0===b||b>d-a)&&(b=d-a);var e,f=new _a,g=a>>5,h=a+b+31>>5,i=b+31>>5,j=a%32,k=b%32;if(e=new Uint32Array(i),j){for(var l=0;h-g-1>l;l++)e[l]=c[g+l]>>>j|c[g+l+1]<<32-j;e[l]=c[g+l]>>>j}else e.set(c.subarray(g,h));return k&&(e[i-1]&=-1>>>32-k),f.limbs=e,f.bitLength=b,f.sign=this.sign,f}function fb(){var a=new _a;return a.limbs=this.limbs,a.bitLength=this.bitLength,a.sign=-1*this.sign,a}function gb(a){$a(a)||(a=new _a(a));var b=this.limbs,c=b.length,d=a.limbs,e=d.length,f=0;return this.sign<a.sign?-1:this.sign>a.sign?1:(Rc.set(b,0),Rc.set(d,c),f=Za.cmp(0,c<<2,c<<2,e<<2),f*this.sign)}function hb(a){if($a(a)||(a=new _a(a)),!this.sign)return a;if(!a.sign)return this;var b,c,d,e,f=this.bitLength,g=this.limbs,h=g.length,i=this.sign,j=a.bitLength,k=a.limbs,l=k.length,m=a.sign,n=new _a;b=(f>j?f:j)+(i*m>0?1:0),c=b+31>>5,Za.sreset();var o=Za.salloc(h<<2),p=Za.salloc(l<<2),q=Za.salloc(c<<2);return Za.z(q-o+(c<<2),0,o),Rc.set(g,o>>2),Rc.set(k,p>>2),i*m>0?(Za.add(o,h<<2,p,l<<2,q,c<<2),d=i):i>m?(e=Za.sub(o,h<<2,p,l<<2,q,c<<2),d=e?m:i):(e=Za.sub(p,l<<2,o,h<<2,q,c<<2),d=e?i:m),e&&Za.neg(q,c<<2,q,c<<2),0===Za.tst(q,c<<2)?Uc:(n.limbs=new Uint32Array(Rc.subarray(q>>2,(q>>2)+c)),n.bitLength=b,n.sign=d,n)}function ib(a){return $a(a)||(a=new _a(a)),this.add(a.negate())}function jb(a){if($a(a)||(a=new _a(a)),!this.sign||!a.sign)return Uc;var b,c,d=this.bitLength,e=this.limbs,f=e.length,g=a.bitLength,h=a.limbs,i=h.length,j=new _a;b=d+g,c=b+31>>5,Za.sreset();var k=Za.salloc(f<<2),l=Za.salloc(i<<2),m=Za.salloc(c<<2);return Za.z(m-k+(c<<2),0,k),Rc.set(e,k>>2),Rc.set(h,l>>2),Za.mul(k,f<<2,l,i<<2,m,c<<2),j.limbs=new Uint32Array(Rc.subarray(m>>2,(m>>2)+c)),j.sign=this.sign*a.sign,j.bitLength=b,j}function kb(){if(!this.sign)return Uc;var a,b,c=this.bitLength,d=this.limbs,e=d.length,f=new _a;a=c<<1,b=a+31>>5,Za.sreset();var g=Za.salloc(e<<2),h=Za.salloc(b<<2);return Za.z(h-g+(b<<2),0,g),Rc.set(d,g>>2),Za.sqr(g,e<<2,h),f.limbs=new Uint32Array(Rc.subarray(h>>2,(h>>2)+b)),f.bitLength=a,f.sign=1,f}function lb(a){$a(a)||(a=new _a(a));var b,c,d=this.bitLength,e=this.limbs,f=e.length,g=a.bitLength,h=a.limbs,i=h.length,j=Uc,k=Uc;Za.sreset();var l=Za.salloc(f<<2),m=Za.salloc(i<<2),n=Za.salloc(i<<2),o=Za.salloc(f<<2);return Za.z(o-l+(f<<2),0,l),Rc.set(e,l>>2),Rc.set(h,m>>2),Za.div(l,f<<2,m,i<<2,n,o),b=Za.tst(o,f<<2)>>2,b&&(j=new _a,j.limbs=new Uint32Array(Rc.subarray(o>>2,(o>>2)+b)),j.bitLength=b<<5>d?d:b<<5,j.sign=this.sign*a.sign),c=Za.tst(n,i<<2)>>2,c&&(k=new _a,k.limbs=new Uint32Array(Rc.subarray(n>>2,(n>>2)+c)),k.bitLength=c<<5>g?g:c<<5,k.sign=this.sign),{quotient:j,remainder:k}}function mb(a,b){var c,d,e,f,g=0>a?-1:1,h=0>b?-1:1,i=1,j=0,k=0,l=1;for(a*=g,b*=h,f=b>a,f&&(e=a,a=b,b=e,e=g,g=h,h=e),d=Math.floor(a/b),c=a-d*b;c;)e=i-d*j,i=j,j=e,e=k-d*l,k=l,l=e,a=b,b=c,d=Math.floor(a/b),c=a-d*b;return j*=g,l*=h,f&&(e=j,j=l,l=e),{gcd:b,x:j,y:l}}function nb(a,b){$a(a)||(a=new _a(a)),$a(b)||(b=new _a(b));var c=a.sign,d=b.sign;0>c&&(a=a.negate()),0>d&&(b=b.negate());var e=a.compare(b);if(0>e){var f=a;a=b,b=f,f=c,c=d,d=f}var g,h,i,j=Vc,k=Uc,l=b.bitLength,m=Uc,n=Vc,o=a.bitLength;for(g=a.divide(b);(h=g.remainder)!==Uc;)i=g.quotient,g=j.subtract(i.multiply(k).clamp(l)).clamp(l),j=k,k=g,g=m.subtract(i.multiply(n).clamp(o)).clamp(o),m=n,n=g,a=b,b=h,g=a.divide(b);if(0>c&&(k=k.negate()),0>d&&(n=n.negate()),0>e){var f=k;k=n,n=f}return{gcd:b,x:k,y:n}}function ob(){if(_a.apply(this,arguments),this.valueOf()<1)throw new RangeError;if(!(this.bitLength<=32)){var a;if(1&this.limbs[0]){var b=(this.bitLength+31&-32)+1,c=new Uint32Array(b+31>>5);c[c.length-1]=1,a=new _a,a.sign=1,a.bitLength=b,a.limbs=c;var d=mb(4294967296,this.limbs[0]).y;this.coefficient=0>d?-d:4294967296-d,this.comodulus=a,this.comodulusRemainder=a.divide(this).remainder,this.comodulusRemainderSquare=a.square().divide(this).remainder}}}function pb(a){return $a(a)||(a=new _a(a)),a.bitLength<=32&&this.bitLength<=32?new _a(a.valueOf()%this.valueOf()):a.compare(this)<0?a:a.divide(this).remainder}function qb(a){a=this.reduce(a);var b=nb(this,a);return 1!==b.gcd.valueOf()?null:(b=b.y,b.sign<0&&(b=b.add(this).clamp(this.bitLength)),b)}function rb(a,b){$a(a)||(a=new _a(a)),$a(b)||(b=new _a(b));for(var c=0,d=0;d<b.limbs.length;d++)for(var e=b.limbs[d];e;)1&e&&c++,e>>>=1;var f=8;b.bitLength<=4536&&(f=7),b.bitLength<=1736&&(f=6),b.bitLength<=630&&(f=5),b.bitLength<=210&&(f=4),b.bitLength<=60&&(f=3),b.bitLength<=12&&(f=2),1<<f-1>=c&&(f=1),a=sb(this.reduce(a).multiply(this.comodulusRemainderSquare),this);var g=sb(a.square(),this),h=new Array(1<<f-1);h[0]=a,h[1]=sb(a.multiply(g),this);for(var d=2;1<<f-1>d;d++)h[d]=sb(h[d-1].multiply(g),this);for(var i=this.comodulusRemainder,j=i,d=b.limbs.length-1;d>=0;d--)for(var e=b.limbs[d],k=32;k>0;)if(2147483648&e){for(var l=e>>>32-f,m=f;0===(1&l);)l>>>=1,m--;for(var n=h[l>>>1];l;)l>>>=1,j!==i&&(j=sb(j.square(),this));j=j!==i?sb(j.multiply(n),this):n,e<<=m,k-=m}else j!==i&&(j=sb(j.square(),this)),e<<=1,k--;return j=sb(j,this)}function sb(a,b){var c=a.limbs,d=c.length,e=b.limbs,f=e.length,g=b.coefficient;Za.sreset();var h=Za.salloc(d<<2),i=Za.salloc(f<<2),j=Za.salloc(f<<2);Za.z(j-h+(f<<2),0,h),Rc.set(c,h>>2),Rc.set(e,i>>2),Za.mredc(h,d<<2,i,f<<2,g,j);var k=new _a;return k.limbs=new Uint32Array(Rc.subarray(j>>2,(j>>2)+f)),k.bitLength=b.bitLength,k.sign=1,k}function tb(a){var b=new _a(this),c=0;for(b.limbs[0]-=1;0===b.limbs[c>>5];)c+=32;for(;0===(b.limbs[c>>5]>>(31&c)&1);)c++;b=b.slice(c);for(var d=new ob(this),e=this.subtract(Vc),f=new _a(this),g=this.limbs.length-1;0===f.limbs[g];)g--;for(;--a>=0;){for(Wa(f.limbs),f.limbs[0]<2&&(f.limbs[0]+=2);f.compare(e)>=0;)f.limbs[g]>>>=1;var h=d.power(f,b);if(0!==h.compare(Vc)&&0!==h.compare(e)){for(var i=c;--i>0;){if(h=h.square().divide(d).remainder,0===h.compare(Vc))return!1;if(0===h.compare(e))break}if(0===i)return!1}}return!0}function ub(a){a=a||80;var b=this.limbs,c=0;if(0===(1&b[0]))return!1;if(1>=a)return!0;var d=0,e=0,f=0;for(c=0;c<b.length;c++){for(var g=b[c];g;)d+=3&g,g>>>=2;for(var h=b[c];h;)e+=3&h,h>>>=2,e-=3&h,h>>>=2;for(var i=b[c];i;)f+=15&i,i>>>=4,f-=15&i,i>>>=4}return d%3&&e%5&&f%17?2>=a?!0:tb.call(this,a>>>1):!1}function vb(a){if(Xc.length>=a)return Xc.slice(0,a);for(var b=Xc[Xc.length-1]+2;Xc.length<a;b+=2){for(var c=0,d=Xc[c];b>=d*d&&b%d!=0;d=Xc[++c]);d*d>b&&Xc.push(b)}return Xc}function wb(a,c){var d=a+31>>5,e=new _a({sign:1,bitLength:a,limbs:d}),f=e.limbs,g=1e4;512>=a&&(g=2200),256>=a&&(g=600);var h=vb(g),i=new Uint32Array(g),j=a*b.Math.LN2|0,k=27;for(a>=250&&(k=12),a>=450&&(k=6),a>=850&&(k=3),a>=1300&&(k=2);;){Wa(f),f[0]|=1,f[d-1]|=1<<(a-1&31),31&a&&(f[d-1]&=l(a+1&31)-1),i[0]=1;for(var m=1;g>m;m++)i[m]=e.divide(h[m]).remainder.valueOf();a:for(var n=0;j>n;n+=2,f[0]+=2){for(var m=1;g>m;m++)if((i[m]+n)%h[m]===0)continue a;if((\"function\"!=typeof c||c(e))&&tb.call(e,k))return e}}}function xb(a){a=a||{},this.key=null,this.result=null,this.reset(a)}function yb(a){a=a||{},this.result=null;var b=a.key;if(void 0!==b){if(!(b instanceof Array))throw new TypeError(\"unexpected key type\");var c=b.length;if(2!==c&&3!==c&&8!==c)throw new SyntaxError(\"unexpected key type\");var d=[];d[0]=new ob(b[0]),d[1]=new _a(b[1]),c>2&&(d[2]=new _a(b[2])),c>3&&(d[3]=new ob(b[3]),d[4]=new ob(b[4]),d[5]=new _a(b[5]),d[6]=new _a(b[6]),d[7]=new _a(b[7])),this.key=d}return this}function zb(a){if(!this.key)throw new c(\"no key is associated with the instance\");n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a));var b;if(p(a))b=new _a(a);else{if(!$a(a))throw new TypeError(\"unexpected data type\");b=a}if(this.key[0].compare(b)<=0)throw new RangeError(\"data too large\");var d=this.key[0],e=this.key[1],g=d.power(b,e).toBytes(),h=d.bitLength+7>>3;if(g.length<h){var i=new Uint8Array(h);i.set(g,h-g.length),g=i}return this.result=g,this}function Ab(a){if(!this.key)throw new c(\"no key is associated with the instance\");if(this.key.length<3)throw new c(\"key isn't suitable for decription\");n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a));var b;if(p(a))b=new _a(a);else{if(!$a(a))throw new TypeError(\"unexpected data type\");b=a}if(this.key[0].compare(b)<=0)throw new RangeError(\"data too large\");var d;if(this.key.length>3){for(var e=this.key[0],g=this.key[3],h=this.key[4],i=this.key[5],j=this.key[6],k=this.key[7],l=g.power(b,i),m=h.power(b,j),q=l.subtract(m);q.sign<0;)q=q.add(g);var r=g.reduce(k.multiply(q));d=r.multiply(h).add(m).clamp(e.bitLength).toBytes()}else{var e=this.key[0],s=this.key[2];d=e.power(b,s).toBytes()}var t=e.bitLength+7>>3;if(d.length<t){var u=new Uint8Array(t);u.set(d,t-d.length),d=u}return this.result=d,this}function Bb(a,b){if(a=a||2048,b=b||65537,512>a)throw new d(\"bit length is too small\");if(n(b)&&(b=f(b)),o(b)&&(b=new Uint8Array(b)),!(p(b)||m(b)||$a(b)))throw new TypeError(\"unexpected exponent type\");if(b=new _a(b),0===(1&b.limbs[0]))throw new d(\"exponent must be an odd number\");var c,b,e,g,h,i,j,k,l,q;g=wb(a>>1,function(a){return i=new _a(a),i.limbs[0]-=1,1==nb(i,b).gcd.valueOf()}),h=wb(a-(a>>1),function(d){return c=new ob(g.multiply(d)),c.limbs[(a+31>>5)-1]>>>(a-1&31)?(j=new _a(d),j.limbs[0]-=1,1==nb(j,b).gcd.valueOf()):!1}),e=new ob(i.multiply(j)).inverse(b),k=e.divide(i).remainder,l=e.divide(j).remainder,g=new ob(g),h=new ob(h);var q=g.inverse(h);return[c,b,e,g,h,k,l,q]}function Cb(a){if(a=a||{},!a.hash)throw new SyntaxError(\"option 'hash' is required\");if(!a.hash.HASH_SIZE)throw new SyntaxError(\"option 'hash' supplied doesn't seem to be a valid hash function\");this.hash=a.hash,this.label=null,this.reset(a)}function Db(a){a=a||{};var b=a.label;if(void 0!==b){if(o(b)||p(b))b=new Uint8Array(b);else{if(!n(b))throw new TypeError(\"unexpected label type\");b=f(b)}this.label=b.length>0?b:null}else this.label=null;yb.call(this,a)}function Eb(a){if(!this.key)throw new c(\"no key is associated with the instance\");var b=Math.ceil(this.key[0].bitLength/8),e=this.hash.HASH_SIZE,g=a.byteLength||a.length||0,h=b-g-2*e-2;if(g>b-2*this.hash.HASH_SIZE-2)throw new d(\"data too large\");var i=new Uint8Array(b),j=i.subarray(1,e+1),k=i.subarray(e+1);if(p(a))k.set(a,e+h+1);else if(o(a))k.set(new Uint8Array(a),e+h+1);else{if(!n(a))throw new TypeError(\"unexpected data type\");k.set(f(a),e+h+1)}k.set(this.hash.reset().process(this.label||\"\").finish().result,0),k[e+h]=1,Wa(j);for(var l=Gb.call(this,j,k.length),m=0;m<k.length;m++)k[m]^=l[m];for(var q=Gb.call(this,k,j.length),m=0;m<j.length;m++)j[m]^=q[m];return zb.call(this,i),this}function Fb(a){if(!this.key)throw new c(\"no key is associated with the instance\");var b=Math.ceil(this.key[0].bitLength/8),f=this.hash.HASH_SIZE,g=a.byteLength||a.length||0;if(g!==b)throw new d(\"bad data\");Ab.call(this,a);var h=this.result[0],i=this.result.subarray(1,f+1),j=this.result.subarray(f+1);if(0!==h)throw new e(\"decryption failed\");for(var k=Gb.call(this,j,i.length),l=0;l<i.length;l++)i[l]^=k[l];for(var m=Gb.call(this,i,j.length),l=0;l<j.length;l++)j[l]^=m[l];for(var n=this.hash.reset().process(this.label||\"\").finish().result,l=0;f>l;l++)if(n[l]!==j[l])throw new e(\"decryption failed\");for(var o=f;o<j.length;o++){var p=j[o];if(1===p)break;if(0!==p)throw new e(\"decryption failed\")}if(o===j.length)throw new e(\"decryption failed\");return this.result=j.subarray(o+1),this}function Gb(a,b){a=a||\"\",b=b||0;for(var c=this.hash.HASH_SIZE,d=new Uint8Array(b),e=new Uint8Array(4),f=Math.ceil(b/c),g=0;f>g;g++){e[0]=g>>>24,e[1]=g>>>16&255,e[2]=g>>>8&255,e[3]=255&g;var h=d.subarray(g*c),i=this.hash.reset().process(a).process(e).finish().result;i.length>h.length&&(i=i.subarray(0,h.length)),h.set(i)}return d}function Hb(a){if(a=a||{},!a.hash)throw new SyntaxError(\"option 'hash' is required\");if(!a.hash.HASH_SIZE)throw new SyntaxError(\"option 'hash' supplied doesn't seem to be a valid hash function\");this.hash=a.hash,this.saltLength=4,this.reset(a)}function Ib(a){a=a||{},yb.call(this,a);var b=a.saltLength;if(void 0!==b){if(!m(b)||0>b)throw new TypeError(\"saltLength should be a non-negative number\");if(null!==this.key&&Math.ceil((this.key[0].bitLength-1)/8)<this.hash.HASH_SIZE+b+2)throw new SyntaxError(\"saltLength is too large\");this.saltLength=b}else this.saltLength=4}function Jb(a){if(!this.key)throw new c(\"no key is associated with the instance\");var b=this.key[0].bitLength,d=this.hash.HASH_SIZE,e=Math.ceil((b-1)/8),f=this.saltLength,g=e-f-d-2,h=new Uint8Array(e),i=h.subarray(e-d-1,e-1),j=h.subarray(0,e-d-1),k=j.subarray(g+1),l=new Uint8Array(8+d+f),m=l.subarray(8,8+d),n=l.subarray(8+d);m.set(this.hash.reset().process(a).finish().result),f>0&&Wa(n),j[g]=1,k.set(n),i.set(this.hash.reset().process(l).finish().result);for(var o=Gb.call(this,i,j.length),p=0;p<j.length;p++)j[p]^=o[p];h[e-1]=188;var q=8*e-b+1;return q%8&&(h[0]&=255>>>q),Ab.call(this,h),this}function Kb(a,b){if(!this.key)throw new c(\"no key is associated with the instance\");var d=this.key[0].bitLength,f=this.hash.HASH_SIZE,g=Math.ceil((d-1)/8),h=this.saltLength,i=g-h-f-2;zb.call(this,a);var j=this.result;if(188!==j[g-1])throw new e(\"bad signature\");var k=j.subarray(g-f-1,g-1),l=j.subarray(0,g-f-1),m=l.subarray(i+1),n=8*g-d+1;if(n%8&&j[0]>>>8-n)throw new e(\"bad signature\");for(var o=Gb.call(this,k,l.length),p=0;p<l.length;p++)l[p]^=o[p];n%8&&(j[0]&=255>>>n);for(var p=0;i>p;p++)if(0!==l[p])throw new e(\"bad signature\");if(1!==l[i])throw new e(\"bad signature\");var q=new Uint8Array(8+f+h),r=q.subarray(8,8+f),s=q.subarray(8+f);r.set(this.hash.reset().process(b).finish().result),s.set(m);for(var t=this.hash.reset().process(q).finish().result,p=0;f>p;p++)if(k[p]!==t[p])throw new e(\"bad signature\");return this}function Lb(a,b){if(void 0===a)throw new SyntaxError(\"bitlen required\");if(void 0===b)throw new SyntaxError(\"e required\");for(var c=Bb(a,b),d=0;d<c.length;d++)$a(c[d])&&(c[d]=c[d].toBytes());return c}function Mb(a,b,c){if(void 0===a)throw new SyntaxError(\"data required\");if(void 0===b)throw new SyntaxError(\"key required\");return new Cb({hash:ba(),key:b,label:c}).encrypt(a).result}function Nb(a,b,c){if(void 0===a)throw new SyntaxError(\"data required\");if(void 0===b)throw new SyntaxError(\"key required\");return new Cb({hash:ba(),key:b,label:c}).decrypt(a).result}function Ob(a,b,c){if(void 0===a)throw new SyntaxError(\"data required\");if(void 0===b)throw new SyntaxError(\"key required\");return new Cb({hash:ha(),key:b,label:c}).encrypt(a).result}function Pb(a,b,c){if(void 0===a)throw new SyntaxError(\"data required\");if(void 0===b)throw new SyntaxError(\"key required\");return new Cb({hash:ha(),key:b,label:c}).decrypt(a).result}function Qb(a,b,c){if(void 0===a)throw new SyntaxError(\"data required\");if(void 0===b)throw new SyntaxError(\"key required\");return new Hb({hash:ba(),key:b,saltLength:c}).sign(a).result}function Rb(a,b,c,d){if(void 0===a)throw new SyntaxError(\"signature required\");if(void 0===b)throw new SyntaxError(\"data required\");if(void 0===c)throw new SyntaxError(\"key required\");try{return new Hb({hash:ba(),key:c,saltLength:d}).verify(a,b),!0}catch(f){if(!(f instanceof e))throw f}return!1}function Sb(a,b,c){if(void 0===a)throw new SyntaxError(\"data required\");if(void 0===b)throw new SyntaxError(\"key required\");return new Hb({hash:ha(),key:b,saltLength:c}).sign(a).result}function Tb(a,b,c,d){if(void 0===a)throw new SyntaxError(\"signature required\");if(void 0===b)throw new SyntaxError(\"data required\");if(void 0===c)throw new SyntaxError(\"key required\");try{return new Hb({hash:ha(),key:c,saltLength:d}).verify(a,b),!0}catch(f){if(!(f instanceof e))throw f}return!1}b.asmCrypto=a,c.prototype=Object.create(Error.prototype,{name:{value:\"IllegalStateError\"}}),d.prototype=Object.create(Error.prototype,{name:{value:\"IllegalArgumentError\"}}),e.prototype=Object.create(Error.prototype,{name:{value:\"SecurityError\"}});var Ub=b.Float64Array||b.Float32Array;a.string_to_bytes=f,a.hex_to_bytes=g,a.base64_to_bytes=h,a.bytes_to_string=i,a.bytes_to_hex=j,a.bytes_to_base64=k,b.IllegalStateError=c,b.IllegalArgumentError=d,b.SecurityError=e;var Vb=function(){\"use strict\";function a(){e=[],f=[];var a,b,c=1;for(a=0;255>a;a++)e[a]=c,b=128&c,c<<=1,c&=255,128===b&&(c^=27),c^=e[a],f[e[a]]=a;e[255]=e[0],f[0]=0,k=!0}function b(a,b){var c=e[(f[a]+f[b])%255];return(0===a||0===b)&&(c=0),c}function c(a){var b=e[255-f[a]];return 0===a&&(b=0),b}function d(){function d(a){var b,d,e;for(d=e=c(a),b=0;4>b;b++)d=255&(d<<1|d>>>7),e^=d;return e^=99}k||a(),g=[],h=[],i=[[],[],[],[]],j=[[],[],[],[]];for(var e=0;256>e;e++){var f=d(e);g[e]=f,h[f]=e,i[0][e]=b(2,f)<<24|f<<16|f<<8|b(3,f),j[0][f]=b(14,e)<<24|b(9,e)<<16|b(13,e)<<8|b(11,e);for(var l=1;4>l;l++)i[l][e]=i[l-1][e]>>>8|i[l-1][e]<<24,j[l][f]=j[l-1][f]>>>8|j[l-1][f]<<24}}var e,f,g,h,i,j,k=!1,l=!1,m=function(a,b,c){function e(a,b,c,d,e,h,i,k,l){var n=f.subarray(0,60),o=f.subarray(256,316);n.set([b,c,d,e,h,i,k,l]);for(var p=a,q=1;4*a+28>p;p++){var r=n[p-1];(p%a===0||8===a&&p%a===4)&&(r=g[r>>>24]<<24^g[r>>>16&255]<<16^g[r>>>8&255]<<8^g[255&r]),p%a===0&&(r=r<<8^r>>>24^q<<24,q=q<<1^(128&q?27:0)),n[p]=n[p-a]^r}for(var s=0;p>s;s+=4)for(var t=0;4>t;t++){var r=n[p-(4+s)+(4-t)%4];o[s+t]=4>s||s>=p-4?r:j[0][g[r>>>24]]^j[1][g[r>>>16&255]]^j[2][g[r>>>8&255]]^j[3][g[255&r]]}m.set_rounds(a+5)}l||d();var f=new Uint32Array(c);f.set(g,512),f.set(h,768);for(var k=0;4>k;k++)f.set(i[k],4096+1024*k>>2),f.set(j[k],8192+1024*k>>2);var m=function(a,b,c){\"use asm\";var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;var y=new a.Uint32Array(c),z=new a.Uint8Array(c);function A(X,Y,Z,$,_,aa,ba,ca){X=X|0;Y=Y|0;Z=Z|0;$=$|0;_=_|0;aa=aa|0;ba=ba|0;ca=ca|0;var da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0;da=Z|1024,ea=Z|2048,fa=Z|3072;_=_^y[(X|0)>>2],aa=aa^y[(X|4)>>2],ba=ba^y[(X|8)>>2],ca=ca^y[(X|12)>>2];for(ka=16;(ka|0)<=$<<4;ka=ka+16|0){ga=y[(Z|_>>22&1020)>>2]^y[(da|aa>>14&1020)>>2]^y[(ea|ba>>6&1020)>>2]^y[(fa|ca<<2&1020)>>2]^y[(X|ka|0)>>2],ha=y[(Z|aa>>22&1020)>>2]^y[(da|ba>>14&1020)>>2]^y[(ea|ca>>6&1020)>>2]^y[(fa|_<<2&1020)>>2]^y[(X|ka|4)>>2],ia=y[(Z|ba>>22&1020)>>2]^y[(da|ca>>14&1020)>>2]^y[(ea|_>>6&1020)>>2]^y[(fa|aa<<2&1020)>>2]^y[(X|ka|8)>>2],ja=y[(Z|ca>>22&1020)>>2]^y[(da|_>>14&1020)>>2]^y[(ea|aa>>6&1020)>>2]^y[(fa|ba<<2&1020)>>2]^y[(X|ka|12)>>2];_=ga,aa=ha,ba=ia,ca=ja}d=y[(Y|_>>22&1020)>>2]<<24^y[(Y|aa>>14&1020)>>2]<<16^y[(Y|ba>>6&1020)>>2]<<8^y[(Y|ca<<2&1020)>>2]^y[(X|ka|0)>>2],e=y[(Y|aa>>22&1020)>>2]<<24^y[(Y|ba>>14&1020)>>2]<<16^y[(Y|ca>>6&1020)>>2]<<8^y[(Y|_<<2&1020)>>2]^y[(X|ka|4)>>2],f=y[(Y|ba>>22&1020)>>2]<<24^y[(Y|ca>>14&1020)>>2]<<16^y[(Y|_>>6&1020)>>2]<<8^y[(Y|aa<<2&1020)>>2]^y[(X|ka|8)>>2],g=y[(Y|ca>>22&1020)>>2]<<24^y[(Y|_>>14&1020)>>2]<<16^y[(Y|aa>>6&1020)>>2]<<8^y[(Y|ba<<2&1020)>>2]^y[(X|ka|12)>>2]}function B(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,X,Y,Z,$)}function C(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;var _=0;A(1024,3072,8192,x,X,$,Z,Y);_=e,e=g,g=_}function D(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,h^X,i^Y,j^Z,k^$);h=d,i=e,j=f,k=g}function E(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;var _=0;A(1024,3072,8192,x,X,$,Z,Y);_=e,e=g,g=_;d=d^h,e=e^i,f=f^j,g=g^k;h=X,i=Y,j=Z,k=$}function F(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,h,i,j,k);h=d=d^X,i=e=e^Y,j=f=f^Z,k=g=g^$}function G(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,h,i,j,k);d=d^X,e=e^Y,f=f^Z,g=g^$;h=X,i=Y,j=Z,k=$}function H(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,h,i,j,k);h=d,i=e,j=f,k=g;d=d^X,e=e^Y,f=f^Z,g=g^$}function I(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,l,m,n,o);o=~s&o|s&o+1,n=~r&n|r&n+((o|0)==0),m=~q&m|q&m+((n|0)==0),l=~p&l|p&l+((m|0)==0);d=d^X,e=e^Y,f=f^Z,g=g^$}function J(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;var _=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;X=X^h,Y=Y^i,Z=Z^j,$=$^k;_=t|0,aa=u|0,ba=v|0,ca=w|0;for(;(ha|0)<128;ha=ha+1|0){if(_>>>31){da=da^X,ea=ea^Y,fa=fa^Z,ga=ga^$}_=_<<1|aa>>>31,aa=aa<<1|ba>>>31,ba=ba<<1|ca>>>31,ca=ca<<1;ia=$&1;$=$>>>1|Z<<31,Z=Z>>>1|Y<<31,Y=Y>>>1|X<<31,X=X>>>1;if(ia)X=X^3774873600}h=da,i=ea,j=fa,k=ga}function K(X){X=X|0;x=X}function L(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;d=X,e=Y,f=Z,g=$}function M(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;h=X,i=Y,j=Z,k=$}function N(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;l=X,m=Y,n=Z,o=$}function O(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;p=X,q=Y,r=Z,s=$}function P(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;o=~s&o|s&$,n=~r&n|r&Z,m=~q&m|q&Y,l=~p&l|p&X}function Q(X){X=X|0;if(X&15)return-1;z[X|0]=d>>>24,z[X|1]=d>>>16&255,z[X|2]=d>>>8&255,z[X|3]=d&255,z[X|4]=e>>>24,z[X|5]=e>>>16&255,z[X|6]=e>>>8&255,z[X|7]=e&255,z[X|8]=f>>>24,z[X|9]=f>>>16&255,z[X|10]=f>>>8&255,z[X|11]=f&255,z[X|12]=g>>>24,z[X|13]=g>>>16&255,z[X|14]=g>>>8&255,z[X|15]=g&255;return 16}function R(X){X=X|0;if(X&15)return-1;z[X|0]=h>>>24,z[X|1]=h>>>16&255,z[X|2]=h>>>8&255,z[X|3]=h&255,z[X|4]=i>>>24,z[X|5]=i>>>16&255,z[X|6]=i>>>8&255,z[X|7]=i&255,z[X|8]=j>>>24,z[X|9]=j>>>16&255,z[X|10]=j>>>8&255,z[X|11]=j&255,z[X|12]=k>>>24,z[X|13]=k>>>16&255,z[X|14]=k>>>8&255,z[X|15]=k&255;return 16}function S(){B(0,0,0,0);t=d,u=e,v=f,w=g}function T(X,Y,Z){X=X|0;Y=Y|0;Z=Z|0;var $=0;if(Y&15)return-1;while((Z|0)>=16){V[X&7](z[Y|0]<<24|z[Y|1]<<16|z[Y|2]<<8|z[Y|3],z[Y|4]<<24|z[Y|5]<<16|z[Y|6]<<8|z[Y|7],z[Y|8]<<24|z[Y|9]<<16|z[Y|10]<<8|z[Y|11],z[Y|12]<<24|z[Y|13]<<16|z[Y|14]<<8|z[Y|15]);z[Y|0]=d>>>24,z[Y|1]=d>>>16&255,z[Y|2]=d>>>8&255,z[Y|3]=d&255,z[Y|4]=e>>>24,z[Y|5]=e>>>16&255,z[Y|6]=e>>>8&255,z[Y|7]=e&255,z[Y|8]=f>>>24,z[Y|9]=f>>>16&255,z[Y|10]=f>>>8&255,z[Y|11]=f&255,z[Y|12]=g>>>24,z[Y|13]=g>>>16&255,z[Y|14]=g>>>8&255,z[Y|15]=g&255;$=$+16|0,Y=Y+16|0,Z=Z-16|0}return $|0}function U(X,Y,Z){X=X|0;Y=Y|0;Z=Z|0;var $=0;if(Y&15)return-1;while((Z|0)>=16){W[X&1](z[Y|0]<<24|z[Y|1]<<16|z[Y|2]<<8|z[Y|3],z[Y|4]<<24|z[Y|5]<<16|z[Y|6]<<8|z[Y|7],z[Y|8]<<24|z[Y|9]<<16|z[Y|10]<<8|z[Y|11],z[Y|12]<<24|z[Y|13]<<16|z[Y|14]<<8|z[Y|15]);$=$+16|0,Y=Y+16|0,Z=Z-16|0}return $|0}var V=[B,C,D,E,F,G,H,I];var W=[D,J];return{set_rounds:K,set_state:L,set_iv:M,set_nonce:N,set_mask:O,set_counter:P,get_state:Q,get_iv:R,gcm_init:S,cipher:T,mac:U}}(a,b,c);return m.set_key=e,m};return m.ENC={ECB:0,CBC:2,CFB:4,OFB:6,CTR:7},m.DEC={ECB:1,CBC:3,CFB:5,OFB:6,CTR:7},m.MAC={CBC:0,GCM:1},m.HEAP_DATA=16384,Object.freeze(m),m}(),Wb=C.prototype;Wb.BLOCK_SIZE=16,Wb.reset=x,Wb.encrypt=z,Wb.decrypt=B;var Xb=D.prototype;Xb.BLOCK_SIZE=16,Xb.reset=x,Xb.process=y,Xb.finish=z;var Yb=E.prototype;Yb.BLOCK_SIZE=16,Yb.reset=x,Yb.process=A,Yb.finish=B;var Zb=F.prototype;Zb.BLOCK_SIZE=16,Zb.reset=I,Zb.encrypt=z,Zb.decrypt=z;var $b=G.prototype;$b.BLOCK_SIZE=16,$b.reset=I,$b.process=y,$b.finish=z;var _b=68719476704,ac=K.prototype;ac.BLOCK_SIZE=16,ac.reset=N,ac.encrypt=Q,ac.decrypt=T;var bc=L.prototype;bc.BLOCK_SIZE=16,bc.reset=N,bc.process=O,bc.finish=P;var cc=M.prototype;cc.BLOCK_SIZE=16,cc.reset=N,cc.process=R,cc.finish=S;var dc=new Uint8Array(1048576),ec=Vb(b,null,dc.buffer);a.AES_CBC=C,a.AES_CBC.encrypt=U,a.AES_CBC.decrypt=V,a.AES_CBC.Encrypt=D,a.AES_CBC.Decrypt=E,a.AES_GCM=K,a.AES_GCM.encrypt=W,a.AES_GCM.decrypt=X,a.AES_GCM.Encrypt=L,a.AES_GCM.Decrypt=M;var fc=64,gc=20;aa.BLOCK_SIZE=fc,aa.HASH_SIZE=gc;var hc=aa.prototype;hc.reset=Y,hc.process=Z,hc.finish=$;var ic=null;aa.bytes=ca,aa.hex=da,aa.base64=ea,a.SHA1=aa;var jc=64,kc=32;ga.BLOCK_SIZE=jc,ga.HASH_SIZE=kc;var lc=ga.prototype;lc.reset=Y,lc.process=Z,lc.finish=$;var mc=null;ga.bytes=ia,ga.hex=ja,ga.base64=ka,a.SHA256=ga;var nc=la.prototype;nc.reset=oa,nc.process=pa,nc.finish=qa,ra.BLOCK_SIZE=aa.BLOCK_SIZE,ra.HMAC_SIZE=aa.HASH_SIZE;var oc=ra.prototype;oc.reset=sa,oc.process=pa,oc.finish=ta;var pc=null;va.BLOCK_SIZE=ga.BLOCK_SIZE,va.HMAC_SIZE=ga.HASH_SIZE;var qc=va.prototype;qc.reset=wa,qc.process=pa,qc.finish=xa;var rc=null;a.HMAC=la,ra.bytes=za,ra.hex=Aa,ra.base64=Ba,a.HMAC_SHA1=ra,va.bytes=Ca,va.hex=Da,va.base64=Ea,a.HMAC_SHA256=va;var sc=Fa.prototype;sc.reset=Ga,sc.generate=Ha;var tc=Ia.prototype;tc.reset=Ga,tc.generate=Ja;var uc=null,vc=La.prototype;vc.reset=Ga,vc.generate=Ma;var wc=null;a.PBKDF2=a.PBKDF2_HMAC_SHA1={bytes:Oa,hex:Pa,base64:Qa},a.PBKDF2_HMAC_SHA256={bytes:Ra,hex:Sa,base64:Ta};var xc,yc=function(){function a(){function a(){b^=d<<11,l=l+b|0,d=d+f|0,d^=f>>>2,m=m+d|0,f=f+l|0,f^=l<<8,n=n+f|0,l=l+m|0,l^=m>>>16,o=o+l|0,m=m+n|0,m^=n<<10,p=p+m|0,n=n+o|0,n^=o>>>4,b=b+n|0,o=o+p|0,o^=p<<8,d=d+o|0,p=p+b|0,p^=b>>>9,f=f+p|0,b=b+d|0}var b,d,f,l,m,n,o,p;h=i=j=0,b=d=f=l=m=n=o=p=2654435769;for(var q=0;4>q;q++)a();for(var q=0;256>q;q+=8)b=b+g[0|q]|0,d=d+g[1|q]|0,f=f+g[2|q]|0,l=l+g[3|q]|0,m=m+g[4|q]|0,n=n+g[5|q]|0,o=o+g[6|q]|0,p=p+g[7|q]|0,a(),e.set([b,d,f,l,m,n,o,p],q);for(var q=0;256>q;q+=8)b=b+e[0|q]|0,d=d+e[1|q]|0,f=f+e[2|q]|0,l=l+e[3|q]|0,m=m+e[4|q]|0,n=n+e[5|q]|0,o=o+e[6|q]|0,p=p+e[7|q]|0,a(),e.set([b,d,f,l,m,n,o,p],q);c(1),k=256}function b(b){var c,d,e,h,i;if(q(b))b=new Uint8Array(b.buffer);else if(m(b))h=new Ub(1),h[0]=b,b=new Uint8Array(h.buffer);else if(n(b))b=f(b);else{if(!o(b))throw new TypeError(\"bad seed type\");b=new Uint8Array(b)}for(i=b.length,d=0;i>d;d+=1024){for(e=d,c=0;1024>c&&i>e;e=d|++c)g[c>>2]^=b[e]<<((3&c)<<3);a()}}function c(a){a=a||1;for(var b,c,d;a--;)for(j=j+1|0,i=i+j|0,b=0;256>b;b+=4)h^=h<<13,h=e[b+128&255]+h|0,c=e[0|b],e[0|b]=d=e[c>>>2&255]+(h+i|0)|0,g[0|b]=i=e[d>>>10&255]+c|0,h^=h>>>6,h=e[b+129&255]+h|0,c=e[1|b],e[1|b]=d=e[c>>>2&255]+(h+i|0)|0,g[1|b]=i=e[d>>>10&255]+c|0,h^=h<<2,h=e[b+130&255]+h|0,c=e[2|b],e[2|b]=d=e[c>>>2&255]+(h+i|0)|0,g[2|b]=i=e[d>>>10&255]+c|0,h^=h>>>16,h=e[b+131&255]+h|0,c=e[3|b],e[3|b]=d=e[c>>>2&255]+(h+i|0)|0,g[3|b]=i=e[d>>>10&255]+c|0}function d(){return k--||(c(1),k=255),g[k]}var e=new Uint32Array(256),g=new Uint32Array(256),h=0,i=0,j=0,k=0;return{seed:b,prng:c,rand:d}}(),zc=b.console,Ac=b.Date.now,Bc=b.Math.random,Cc=b.performance,Dc=b.crypto||b.msCrypto;void 0!==Dc&&(xc=Dc.getRandomValues);var Ec,Fc=yc.rand,Gc=yc.seed,Hc=0,Ic=!1,Jc=!1,Kc=0,Lc=256,Mc=!1,Nc=!1,Oc={};if(void 0!==Cc)Ec=function(){return 1e3*Cc.now()|0};else{var Pc=1e3*Ac()|0;Ec=function(){return 1e3*Ac()-Pc|0}}a.random=Xa,a.random.seed=Va,Object.defineProperty(Xa,\"allowWeak\",{get:function(){return Mc},set:function(a){Mc=a}}),Object.defineProperty(Xa,\"skipSystemRNGWarning\",{get:function(){return Nc},set:function(a){Nc=a}}),a.getRandomValues=Wa,a.getRandomValues.seed=Va,Object.defineProperty(Wa,\"allowWeak\",{get:function(){return Mc},set:function(a){Mc=a}}),Object.defineProperty(Wa,\"skipSystemRNGWarning\",{get:function(){return Nc},set:function(a){Nc=a}}),b.Math.random=Xa,void 0===b.crypto&&(b.crypto={}),b.crypto.getRandomValues=Wa;var Qc;Qc=void 0===b.Math.imul?function(a,c,d){b.Math.imul=Ya;var e=Za(a,c,d);return delete b.Math.imul,e}:Za;var Rc=new Uint32Array(1048576),Za=Qc(b,null,Rc.buffer),Sc=new Uint32Array(0),Tc=_a.prototype=new Number;Tc.toString=ab,Tc.toBytes=bb,Tc.valueOf=cb,Tc.clamp=db,Tc.slice=eb,Tc.negate=fb,Tc.compare=gb,Tc.add=hb,Tc.subtract=ib,Tc.multiply=jb,Tc.square=kb,Tc.divide=lb;var Uc=new _a(0),Vc=new _a(1);Object.freeze(Uc),Object.freeze(Vc);var Wc=ob.prototype=new _a;Wc.reduce=pb,Wc.inverse=qb,Wc.power=rb;var Xc=[2,3];Tc.isProbablePrime=ub,_a.randomProbablePrime=wb,_a.ZERO=Uc,_a.ONE=Vc,_a.extGCD=nb,a.BigNumber=_a,a.Modulus=ob;var Yc=xb.prototype;Yc.reset=yb,Yc.encrypt=zb,Yc.decrypt=Ab,xb.generateKey=Bb;var Zc=Cb.prototype;Zc.reset=Db,Zc.encrypt=Eb,Zc.decrypt=Fb;var $c=Hb.prototype;$c.reset=Ib,$c.sign=Jb,$c.verify=Kb,a.RSA={generateKey:Lb},a.RSA_OAEP=Cb,a.RSA_OAEP_SHA1={encrypt:Mb,decrypt:Nb},a.RSA_OAEP=Cb,a.RSA_OAEP_SHA256={encrypt:Ob,decrypt:Pb},a.RSA_PSS=Hb,a.RSA_PSS_SHA1={sign:Qb,verify:Rb},a.RSA_PSS=Hb,a.RSA_PSS_SHA256={sign:Sb,verify:Tb}}({},function(){return this}());\n//# sourceMappingURL=asmcrypto.js.map\n\nvar GMusicResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'Google Play Music',\n        icon: '../images/icon.png',\n        weight: 90,\n        timeout: 8\n    },\n\n    _authUrl: 'https://android.clients.google.com/auth',\n    _userAgent: 'tomahawk-gmusic-0.6.0',\n    _baseURL: 'https://mclients.googleapis.com/sj/v2.5/',\n    _webURL: 'https://play.google.com/music/',\n    // Google Play Services key version 7.3.29:\n    _googlePlayKey: \"AAAAgMom/1a/v0lblO2Ubrt60J2gcuXSljGFQXgcyZWveWLEwo6prwgi3iJIZdodyhKZQrNWp5nKJ3\"\n    + \"srRXcUW+F1BD3baEVGcmEgqaLZUNBjm057pKRI16kB0YppeGx5qIQ5QjKzsR8ETQbKLNWgRY0QRNVz34kMJR3P/LgHax\"\n    + \"/6rmf5AAAAAwEAAQ==\",\n\n    getConfigUi: function () {\n        return {\n            \"widget\": Tomahawk.readBase64(\"config.ui\"),\n            fields: [{\n                name: \"email\",\n                widget: \"email_edit\",\n                property: \"text\"\n            }, {\n                name: \"password\",\n                widget: \"password_edit\",\n                property: \"text\"\n            }],\n            images: [{\n                \"play-logo.png\": Tomahawk.readBase64(\"play-logo.png\")\n            }]\n        };\n    },\n\n    /**\n     * Defines this Resolver's config dialog UI.\n     */\n    configUi: [\n        {\n            type: \"textview\",\n            text: \"<html>IMPORTANT:<br/>\"\n            + \"- Make sure you have previously logged into the official Google Music iOS or \"\n            + \"Android app and played a song.<br/>\"\n            + \"- For security reasons we highly recommend using an \"\n            + \"<a href=\\\"https://support.google.com/accounts/answer/185833?hl=en\\\">app-specific \"\n            + \"password</a>. This is mandatory when you are using two-factor authentication.<br/>\"\n            + \"If you don't you can also enable \"\n            + \"<a href=\\\"https://www.google.com/settings/security/lesssecureapps\\\">\"\n            + \"\\\"less secure apps\\\"</a> and login with your normal password.</html>\"\n        },\n        {\n            id: \"email\",\n            type: \"textfield\",\n            label: \"E-Mail\"\n        },\n        {\n            id: \"password\",\n            type: \"textfield\",\n            label: \"Password\",\n            isPassword: true\n        }\n    ],\n\n    newConfigSaved: function (newConfig) {\n        if (this._email !== newConfig.email\n            || this._password !== newConfig.password\n            || this._token !== newConfig.token) {\n            Tomahawk.log(\"Invalidating cache\");\n            var that = this;\n            gmusicCollection.wipe({id: gmusicCollection.settings.id}).then(function () {\n                window.localStorage.removeItem(\"gmusic_last_cache_update\");\n                that.init();\n            });\n        }\n    },\n\n    init: function () {\n        var name = this.settings.name;\n        var config = this.getUserConfig();\n        if (!config.email || (!config.token && !config.password)) {\n            Tomahawk.PluginManager.unregisterPlugin(\"collection\", gmusicCollection);\n            Tomahawk.log(name + \" resolver not configured.\");\n            return;\n        }\n\n        this._email = config.email;\n        this._password = config.password;\n        this._token = config.token;\n\n        // load signing key\n        var s1 = CryptoJS.enc.Base64.parse(\n            'VzeC4H4h+T2f0VI180nVX8x+Mb5HiTtGnKgH52Otj8ZCGDz9jRW'\n            + 'yHb6QXK0JskSiOgzQfwTY5xgLLSdUSreaLVMsVVWfxfa8Rw==');\n        var s2 = CryptoJS.enc.Base64.parse(\n            'ZAPnhUkYwQ6y5DdQxWThbvhJHN8msQ1rqJw0ggKdufQjelrKuiG'\n            + 'GJI30aswkgCWTDyHkTGK9ynlqTkJ5L4CiGGUabGeo8M6JTQ==');\n        for (var idx = 0; idx < s1.words.length; idx++) {\n            s1.words[idx] ^= s2.words[idx];\n        }\n        this._key = s1;\n\n        var that = this;\n\n        var promise;\n        if (config.token) {\n            // The token has already been provided in the config. We don't need to login first.\n            promise = that._loadWebToken(config.token).then(function (webToken) {\n                return that._loadSettings(webToken, config.token);\n            });\n        } else {\n            // No token provided in the config. We need to login with the given creds and fetch it\n            // first.\n            promise = that._login(config.email, config.password).then(function (token) {\n                that._token = token;\n                return that._loadWebToken(token).then(function (webToken) {\n                    return that._loadSettings(webToken, token);\n                });\n            });\n        }\n        promise.then(function () {\n            return that._ensureCollection();\n        }).then(function () {\n            that._ready = true;\n        });\n    },\n\n    _convertTrack: function (entry) {\n        var realId;\n        if (entry.id) {\n            realId = entry.id;\n        } else {\n            realId = entry.storeId;\n        }\n\n        return {\n            artist: entry.artist,\n            album: entry.album,\n            track: entry.title,\n            year: entry.year,\n\n            albumpos: entry.trackNumber,\n            discnumber: entry.discNumber,\n\n            size: entry.estimatedSize,\n            duration: entry.durationMillis / 1000,\n\n            source: \"Google Music\",\n            url: 'gmusic://track/' + realId,\n            checked: true\n        };\n    },\n\n    _convertAlbum: function (entry) {\n        return {\n            artist: entry.artist,\n            album: entry.album,\n            year: entry.year\n        };\n    },\n\n    _ensureCollection: function () {\n        var that = this;\n\n        return gmusicCollection.revision({\n            id: gmusicCollection.settings.id\n        }).then(function (result) {\n            var lastCollectionUpdate = window.localStorage[\"gmusic_last_collection_update\"];\n            if (lastCollectionUpdate && lastCollectionUpdate == result) {\n                Tomahawk.log(\"Collection database has not been changed since last time.\");\n                return that._fetchAndStoreCollection();\n            } else {\n                Tomahawk.log(\"Collection database has been changed. Wiping and re-fetching...\");\n                return gmusicCollection.wipe({\n                    id: gmusicCollection.settings.id\n                }).then(function () {\n                    return that._fetchAndStoreCollection();\n                });\n            }\n        });\n    },\n\n    _fetchAndStoreCollection: function () {\n        var that = this;\n        var time = Date.now();\n        if (!that._requestPromise) {\n            Tomahawk.log(\"Checking if collection needs to be updated\");\n            Tomahawk.PluginManager.registerPlugin(\"collection\", gmusicCollection);\n            var url = that._baseURL + 'trackfeed?ct=1&hl=en_US&dv=0&alt=json&include-tracks=true';\n            url += \"&tier=\" + (that._allAccess ? 'aa' : 'fr');\n            if (window.localStorage[\"gmusic_last_cache_update\"]) {\n                url += '&updated-min=' + window.localStorage[\"gmusic_last_cache_update\"] * 1000;\n            }\n            that._requestPromise = that._paginatedRequest(url).then(function (results) {\n                if (results && results.length > 0) {\n                    Tomahawk.log(\"Collection needs to be updated\");\n\n                    var tracks = results.map(function (item) {\n                        return that._convertTrack(item);\n                    });\n                    gmusicCollection.addTracks({\n                        id: gmusicCollection.settings.id,\n                        tracks: tracks\n                    }).then(function (newRevision) {\n                        Tomahawk.log(\"Updated cache in \" + (Date.now() - time) + \"ms\");\n                        window.localStorage[\"gmusic_last_cache_update\"] = Date.now();\n                        window.localStorage[\"gmusic_last_collection_update\"] = newRevision;\n                    });\n                } else {\n                    Tomahawk.log(\"Collection doesn't need to be updated\");\n                    gmusicCollection.addTracks({\n                        id: gmusicCollection.settings.id,\n                        tracks: []\n                    });\n                }\n            }, function (xhr) {\n                Tomahawk.log(\"paginatedRequest failed: \" + xhr.status + \" - \"\n                    + xhr.statusText + \" - \" + xhr.responseText);\n                Tomahawk.PluginManager.unregisterPlugin(\"collection\", gmusicCollection);\n            }).finally(function () {\n                that._requestPromise = undefined;\n            });\n        }\n        return that._requestPromise;\n    },\n\n    _paginatedRequest: function (url, results, nextPageToken) {\n        var that = this;\n        var settings = {\n            headers: {\n                'Authorization': 'GoogleLogin auth=' + this._token\n            },\n            dataFormat: 'json',\n            data: {}\n        };\n        if (nextPageToken) {\n            settings.data['start-token'] = nextPageToken;\n        }\n        results = results || [];\n        return Tomahawk.post(url, settings).then(function (response) {\n            if (response.data) {\n                results = results.concat(response.data.items);\n                Tomahawk.log(\"Received chunk of tracks, tracks total: \" + results.length);\n            }\n            if (response.nextPageToken) {\n                return that._paginatedRequest(url, results, response.nextPageToken);\n            } else {\n                return results;\n            }\n        });\n    },\n\n    _execSearchAllAccess: function (query, max_results) {\n        var that = this;\n        var url = this._baseURL + \"query\";\n        var settings = {\n            data: {\n                q: query,\n                ct: '1',\n                hl: 'en_US',\n                dv: 0,\n                tier: that._allAccess ? 'aa' : 'fr'\n            },\n            headers: {\n                Authorization: 'GoogleLogin auth=' + this._token\n            }\n        };\n        if (max_results) {\n            settings.data[\"max-results\"] = max_results;\n        }\n\n        var time = Date.now();\n        return Tomahawk.get(url, settings).then(function (response) {\n            var results = {tracks: [], albums: [], artists: []};\n            // entries member is missing when there are no results\n            if (!response.entries) {\n                return results;\n            }\n\n            var artistMap = {}, albumMap = {};\n            for (var idx = 0; idx < response.entries.length; idx++) {\n                var entry = response.entries[idx];\n                switch (entry.type) {\n                    case '1':\n                        results.tracks.push(that._convertTrack(entry.track));\n                        break;\n                    case '2':\n                        artistMap[entry.artist] = true;\n                        break;\n                    case '3':\n                        albumMap[entry.artist + \"♣\" + entry.album + \"♣\" + entry.year]\n                            = that._convertAlbum(entry);\n                        break;\n                }\n            }\n            results.artists = Object.keys(artistMap);\n            var keys = Object.keys(albumMap);\n            results.albums = keys.map(function (key) {\n                return albumMap[key];\n            });\n            Tomahawk.log(\"All Access: Searched with query '\" + query + \"' for \"\n                + (Date.now() - time) + \"ms and found \" + results.tracks.length + \" track results\");\n            return results;\n        }, function (xhr) {\n            Tomahawk.log(\"Google Music search '\" + query + \"' failed:\\n\"\n                + xhr.status + \" \" + xhr.statusText.trim() + \"\\n\"\n                + xhr.responseText.trim()\n            );\n        })\n    },\n\n    search: function (params) {\n        var query = params.query;\n\n        if (!this._ready) {\n            return;\n        }\n\n        if (this._allAccess) {\n            return this._execSearchAllAccess(query, 20);\n        } else {\n            return [];\n        }\n    },\n\n    resolve: function (params) {\n        var artist = params.artist;\n        var album = params.album;\n        var track = params.track;\n\n        if (!this._ready) {\n            return;\n        }\n\n        if (this._allAccess) {\n            var time = Date.now();\n            // Format the search as track-artists-album for now\n            var query = artist;\n            if (album) {\n                query += ' - ' + album;\n            }\n            query += ' - ' + track;\n            return this._execSearchAllAccess(query, 1).then(function (results) {\n                Tomahawk.log(\"All Access: Resolved track '\" + artist + \" - \" + track + \" - \"\n                + album + \"' for \" + (Date.now() - time) + \"ms and found \"\n                + results.tracks.length + \" track results\");\n                return results.tracks;\n            });\n        } else {\n            return [];\n        }\n    },\n\n    _parseUrn: function (urn) {\n        var match = urn.match(/^gmusic:\\/\\/([a-z]+)\\/(.+)$/);\n        if (!match) {\n            return null;\n        }\n\n        return {\n            type: match[1],\n            id: match[2]\n        };\n    },\n\n    _generateSalt: function (len) {\n        var salt = \"\";\n        var charset = 'abcdefghijklmnopqrstuvwxyz0123456789';\n        for (var i = 0; i < len; i++) {\n            salt += charset.charAt(Math.floor(Math.random() * charset.length));\n        }\n        return salt;\n    },\n\n    getStreamUrl: function (params) {\n        var url = params.url;\n\n        if (!this._ready) {\n            Tomahawk.log(\"Failed to get stream for '\" + url + \"', resolver wasn't ready\");\n            return;\n        }\n        var urn = this._parseUrn(url);\n        if (!urn || 'track' != urn.type) {\n            Tomahawk.log(\"Failed to get stream. Couldn't parse '\" + urn + \"'\");\n            return;\n        }\n        Tomahawk.log(\"Getting stream for '\" + url + \"', track ID is '\" + urn.id + \"'\");\n\n        var salt = this._generateSalt(13);\n        var sig = CryptoJS.HmacSHA1(urn.id + salt, this._key).toString(CryptoJS.enc.Base64)\n            .replace(/=+$/, '')   // no padding\n            .replace(/\\+/g, '-')  // URL-safe alphabet\n            .replace(/\\//g, '_'); // URL-safe alphabet\n\n        return {\n            url: 'https://mclients.googleapis.com/music/mplay'\n            + '?net=wifi&pt=e&hl=en_US&dv=0'\n            + '&tier=' + (this._allAccess ? 'aa' : 'fr')\n            + '&' + ('T' == urn.id[0] ? 'mjck' : 'songid')\n            + '=' + urn.id + '&slt=' + salt + '&sig=' + sig,\n            headers: {\n                'Authorization': 'GoogleLogin auth=' + this._token,\n                'X-Device-ID': this._deviceId\n            }\n        }\n    },\n\n    _loadSettings: function (webToken, token) {\n        var that = this;\n\n        var url = that._webURL + 'services/fetchsettings';\n        var settings = {\n            data: {\n                u: 0,\n                xt: webToken\n            },\n            dataType: 'json',\n            headers: {\n                'Authorization': 'GoogleLogin auth=' + token\n            }\n        };\n        return Tomahawk.post(url, settings).then(function (response) {\n            if (!response.settings) {\n                Tomahawk.log(\"Wasn't able to get resolver settings\");\n                throw new Error(\"Wasn't able to get resolver settings\");\n            }\n\n            that._allAccess = response.settings.entitlementInfo.isSubscription\n                || response.settings.entitlementInfo.isTrial;\n            Tomahawk.log(\"Google Play Music All Access is \"\n                + (that._allAccess ? \"enabled\" : \"disabled\" )\n            );\n\n            for (var i = 0; i < response.settings.uploadDevice.length; i++) {\n                var device = response.settings.uploadDevice[i];\n                if (2 == device.deviceType) {\n                    // We have an Android device id\n                    that._deviceId = device.id.slice(2); //remove prepended \"0x\"\n                    Tomahawk.log(that.settings.name + \" using Android device ID '\"\n                        + that._deviceId + \"' from \" + device.carrier + \" \"\n                        + device.manufacturer + \" \" + device.model);\n                    return;\n                } else if (3 == device.deviceType) {\n                    // We have an iOS device id\n                    that._deviceId = device.id;\n                    Tomahawk.log(that.settings.name + \" using iOS device ID '\"\n                        + that._deviceId + \"' from \" + device.name);\n                    return;\n                }\n            }\n\n            Tomahawk.log(\"There aren't any Android/iOS devices associated with your Google \"\n                + \"account. This resolver needs an Android/iOS device ID to function. Please \"\n                + \"open the Google Music application on an Android/iOS device and log in to \"\n                + \"your account.\");\n            throw new Error(\"No Android/iOS devices associated with Google account.\"\n                + \" Please open the 'Play Music' App, log in and play a song\");\n        });\n    },\n\n    _loadWebToken: function (token) {\n        var that = this;\n\n        var url = that._webURL + 'listen';\n        var settings = {\n            type: 'HEAD',\n            needCookieHeader: true,\n            rawResponse: true,\n            headers: {\n                'Authorization': 'GoogleLogin auth=' + token\n            }\n        };\n        return Tomahawk.ajax(url, settings).then(function (request) {\n            var match = request.getResponseHeader('Set-Cookie').match(/^xt=([^;]+)(?:;|$)/m);\n            if (match) {\n                return match[1];\n            } else {\n                Tomahawk.log(\"xt cookie missing\");\n                throw new Error(\"Wasn't able to get web token\");\n            }\n        });\n    },\n\n    /** Asynchronously authenticates with the SkyJam service.\n     * Only one login attempt will run at a time. If a login request is\n     * already pending the callback (if one is provided) will be queued\n     * to run when it is complete.\n     */\n    _login: function (email, password) {\n        var that = this;\n\n        var url = this._authUrl;\n        var settings = {\n            data: {\n                \"accountType\": \"HOSTED_OR_GOOGLE\",\n                \"Email\": email.trim(),\n                \"has_permission\": 1,\n                \"add_account\": 1,\n                \"EncryptedPasswd\": that._buildSignature(email.trim(), password.trim()),\n                \"service\": \"ac2dm\",\n                \"source\": \"android\",\n                \"device_country\": \"us\",\n                \"operatorCountry\": \"us\",\n                \"lang\": \"en\",\n                \"sdk_version\": \"17\"\n            },\n            headers: {\n                'User-Agent': that._userAgent\n            }\n        };\n\n        if (!this._loginPromise) {\n            this._loginPromise = Tomahawk.post(url, settings).then(function (response) {\n                var parsedRes = that._parseAuthResponse(response);\n                if (!parsedRes['Token']) {\n                    throw new Error(\"There's no 'Token' in the response\");\n                }\n\n                var settings = {\n                    data: {\n                        \"accountType\": \"HOSTED_OR_GOOGLE\",\n                        \"Email\": email.trim(),\n                        \"has_permission\": 1,\n                        \"EncryptedPasswd\": parsedRes['Token'],\n                        \"service\": \"sj\",\n                        \"source\": \"android\",\n                        \"app\": \"com.google.android.music\",\n                        \"client_sig\": \"38918a453d07199354f8b19af05ec6562ced5788\",\n                        \"device_country\": \"us\",\n                        \"operatorCountry\": \"us\",\n                        \"lang\": \"en\",\n                        \"sdk_version\": \"17\"\n                    },\n                    headers: {\n                        'User-Agent': that._userAgent\n                    }\n                };\n                return Tomahawk.post(url, settings).then(function (response) {\n                    var parsedRes = that._parseAuthResponse(response);\n                    if (!parsedRes['Auth']) {\n                        throw new Error(\"There's no 'Auth' in the response\");\n                    }\n                    Tomahawk.log(\"Google Play Music logged in successfully\");\n                    return parsedRes['Auth'];\n                });\n            }).finally(function () {\n                that._loginPromise = undefined;\n            });\n        }\n        return this._loginPromise;\n    },\n\n    testConfig: function (config) {\n        var that = this;\n\n        var promise;\n        if (config.token) {\n            // The token has already been provided in the config. We don't need to login first.\n            promise = that._loadWebToken(config.token).then(function (webToken) {\n                return that._loadSettings(webToken, config.token);\n            });\n        } else {\n            // No token provided in the config. We need to login with the given creds and fetch it\n            // first.\n            promise = that._login(config.email, config.password).then(function (token) {\n                return that._loadWebToken(token).then(function (webToken) {\n                    return that._loadSettings(webToken, token);\n                });\n            });\n        }\n        return promise.then(function () {\n            return Tomahawk.ConfigTestResultType.Success;\n        }, function (error) {\n            if (error instanceof Error) {\n                return error.message;\n            } else if (error && error.status == 403) {\n                return Tomahawk.ConfigTestResultType.InvalidCredentials;\n            } else {\n                return Tomahawk.ConfigTestResultType.CommunicationError;\n            }\n        });\n    },\n\n    _parseAuthResponse: function (res) {\n        parsedRes = {};\n        var lines = res.split(\"\\n\");\n        for (var i = 0; i < lines.length; i++) {\n            if (!lines[i]) {\n                continue;\n            }\n            var parts = lines[i].split(\"=\");\n            parsedRes[parts[0]] = parts[1];\n        }\n        return parsedRes;\n    },\n\n    /**\n     * Author: jonleighton - https://gist.github.com/jonleighton/958841\n     */\n    _arrayBufferToBase64: function (arrayBuffer) {\n        var base64 = '';\n        var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n\n        var bytes = new Uint8Array(arrayBuffer);\n        var byteLength = bytes.byteLength;\n        var byteRemainder = byteLength % 3;\n        var mainLength = byteLength - byteRemainder;\n\n        var a, b, c, d;\n        var chunk;\n\n        // Main loop deals with bytes in chunks of 3\n        for (var i = 0; i < mainLength; i = i + 3) {\n            // Combine the three bytes into a single integer\n            chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];\n\n            // Use bitmasks to extract 6-bit segments from the triplet\n            a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18\n            b = (chunk & 258048) >> 12; // 258048   = (2^6 - 1) << 12\n            c = (chunk & 4032) >> 6; // 4032     = (2^6 - 1) << 6\n            d = chunk & 63;              // 63       = 2^6 - 1\n\n            // Convert the raw binary segments to the appropriate ASCII encoding\n            base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]\n        }\n\n        // Deal with the remaining bytes and padding\n        if (byteRemainder == 1) {\n            chunk = bytes[mainLength];\n\n            a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2\n\n            // Set the 4 least significant bits to zero\n            b = (chunk & 3) << 4;// 3   = 2^2 - 1\n\n            base64 += encodings[a] + encodings[b] + '=='\n        } else if (byteRemainder == 2) {\n            chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1];\n\n            a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10\n            b = (chunk & 1008) >> 4; // 1008  = (2^6 - 1) << 4\n\n            // Set the 2 least significant bits to zero\n            c = (chunk & 15) << 2;// 15    = 2^4 - 1\n\n            base64 += encodings[a] + encodings[b] + encodings[c] + '='\n        }\n\n        return base64\n    },\n\n    _buildSignature: function (email, password) {\n        var buffer = new ArrayBuffer(133);\n        var signature = new Uint8Array(buffer);\n\n        var keyBytes = asmCrypto.base64_to_bytes(this._googlePlayKey);\n\n        var hashBytes = asmCrypto.SHA1.bytes(keyBytes);\n        // 0 is always the first element\n        signature[0] = 0;\n        // the elements' next 4 bytes are set to the first 4 bytes of the sha-1 hash\n        signature.set(hashBytes.subarray(0, 4), 1);\n\n        // Now parse the modulus\n        var modLength = this._bytesToInt(keyBytes, 0);\n        var modulus = keyBytes.subarray(4, 4 + modLength);\n\n        // Now parse the exponent\n        var expLength = this._bytesToInt(keyBytes, 4 + modLength);\n        var exponent = keyBytes.subarray(8 + modLength, 8 + modLength + expLength);\n\n        // Ready to encrypt!\n        var pubkey = [modulus, exponent];\n        var clearBytes = asmCrypto.string_to_bytes(email + '\\0' + password);\n        if (Tomahawk.generateSeed) {\n            asmCrypto.random.seed(Tomahawk.generateSeed());\n        } else {\n            asmCrypto.random.skipSystemRNGWarning = true;\n        }\n        var encryptedBytes = asmCrypto.RSA_OAEP_SHA1.encrypt(clearBytes, pubkey);\n        signature.set(encryptedBytes, 5);\n\n        // Final url-safe encode in base64 and we're done\n        return this._arrayBufferToBase64(buffer);\n    },\n\n    _bytesToInt: function (byteArray, start) {\n        return (0xFF & byteArray[start]) << 24 | (0xFF & byteArray[(start + 1)]) << 16\n            | (0xFF & byteArray[(start + 2)]) << 8 | 0xFF & byteArray[(start + 3)]\n    }\n});\n\nTomahawk.resolver.instance = GMusicResolver;\n\nvar gmusicCollection = Tomahawk.extend(Tomahawk.Collection, {\n    resolver: GMusicResolver,\n    settings: {\n        id: \"gmusic\",\n        prettyname: \"Google Music\",\n        description: GMusicResolver._email,\n        iconfile: \"contents/images/icon.png\",\n        trackcount: GMusicResolver.trackCount\n    }\n});\n"
  },
  {
    "path": "gmusic/content/metadata.json",
    "content": "{\n    \"name\": \"Google Play Music\",\n    \"pluginName\": \"gmusic\",\n    \"author\": \"Sam Hanes, Lalit Maganti, Enno Gottschalk\",\n    \"email\": \"sam@maltera.com, lalitmaganti@gmail.com, mrmaffen@gmail.com\",\n    \"version\": \"0.6.8\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Streams music from your Google Play Music locker and the entire Google Music catalog for subscribers.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/gmusic.js\",\n        \"scripts\": [],\n        \"libs\": [\n            \"cryptojs:3.1.2\"\n        ],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/config.ui\",\n            \"contents/code/play-logo.png\"\n        ]\n    },\n    \"staticCapabilities\": [\n        \"configTestable\"\n    ]\n}\n"
  },
  {
    "path": "hatchet-metadata/content/contents/code/hatchet-metadata.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2014, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU Lesser General Public License as\n *   published by the Free Software Foundation, version 3.\n *\n *   Tomahawk is distributed in the hope that it will be useful, but\n *   WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n *   Lesser General Public License for more details.\n *\n *   You should have received a copy of the GNU Lesser General Public License\n *   along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar HatchetMetadataResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'Hatchet Metadata',\n        icon: 'hatchet-metadata.png',\n        weight: 0, // We cannot resolve, so use minimum weight\n        timeout: 15\n    },\n\n    canParseUrl: function (params) {\n        var url = params.url;\n        var type = params.type;\n\n        switch (type) {\n            case Tomahawk.UrlType.Album:\n                return /^https?:\\/\\/(www\\.)?hatchet\\.is\\/music\\/[^\\/\\n]+\\/[^\\/\\n]+$/.test(url);\n            case Tomahawk.UrlType.Artist:\n                return /^https?:\\/\\/(www\\.)?hatchet\\.is\\/music\\/[^\\/\\n][^\\/\\n_]+$/.test(url);\n            case Tomahawk.UrlType.Track:\n                return /^https?:\\/\\/(www\\.)?hatchet\\.is\\/music\\/[^\\/\\n]+\\/_\\/[^\\/\\n]+$/.test(url);\n            case Tomahawk.UrlType.Playlist:\n                return /^https?:\\/\\/(www\\.)?hatchet\\.is\\/people\\/[^\\/\\n]+\\/playlists\\/[^\\/\\n]+$/.test(url);\n            default:\n                return false;\n        }\n    },\n\n    lookupUrl: function (params) {\n        var url = params.url;\n\n        Tomahawk.log(\"lookupUrl: \" + url);\n        var urlParts =\n            url.split('/').filter(function (item) {\n                return item.length != 0;\n            }).map(function (s) {\n                return decodeURIComponent(s.replace(/\\+/g, '%20'));\n            });\n        if (/^https?:\\/\\/(www\\.)?hatchet\\.is\\/music\\/[^\\/\\n]+\\/[^\\/\\n]+$/.test(url)) {\n            Tomahawk.log(\"Found an album\");\n            // We have to deal with an Album\n            return {\n                type: Tomahawk.UrlType.Album,\n                artist: urlParts[urlParts.length - 2],\n                album: urlParts[urlParts.length - 1]\n            };\n        } else if (/^https?:\\/\\/(www\\.)?hatchet\\.is\\/music\\/[^\\/\\n][^\\/\\n_]+$/.test(url)) {\n            Tomahawk.log(\"Found an artist\");\n            // We have to deal with an Artist\n            return {\n                type: Tomahawk.UrlType.Artist,\n                artist: urlParts[urlParts.length - 1]\n            };\n        } else if (/^https?:\\/\\/(www\\.)?hatchet\\.is\\/music\\/[^\\/\\n]+\\/[^\\/\\n]+\\/[^\\/\\n]+$/.test(url)) {\n            Tomahawk.log(\"Found a track\");\n            // We have to deal with a Track\n            return {\n                type: Tomahawk.UrlType.Track,\n                artist: urlParts[urlParts.length - 3],\n                track: urlParts[urlParts.length - 1]\n            };\n        } else if (/^https?:\\/\\/(www\\.)?hatchet\\.is\\/people\\/[^\\/\\n]+\\/playlists\\/[^\\/\\n]+$/.test(url)) {\n            Tomahawk.log(\"Found a playlist\");\n            // We have to deal with a Playlist\n            var match = url.match(/^https?:\\/\\/(?:www\\.)?hatchet\\.is\\/people\\/[^\\/\\n]+\\/playlists\\/([^\\/\\n]+)$/);\n            var query = \"https://api.hatchet.is/v2/playlists\";\n            var settings = {\n                data: {\n                    \"ids[]\": match[1]\n                }\n            };\n            return Tomahawk.get(query, settings).then(function (res) {\n                var query = \"https://api.hatchet.is\" + res.playlists[0].links.playlistEntries;\n                return Tomahawk.get(query).then(function (res) {\n                    var entriesMap = {};\n                    res.playlistEntries.forEach(function (item) {\n                        entriesMap[item.id] = item;\n                    });\n                    var artistsMap = {};\n                    res.artists.forEach(function (item) {\n                        artistsMap[item.id] = item;\n                    });\n                    var tracksMap = {};\n                    res.tracks.forEach(function (item) {\n                        tracksMap[item.id] = item;\n                    });\n                    var tracks = res.playlists[0].playlistEntries.map(function (item) {\n                        var track = tracksMap[entriesMap[item].track];\n                        return {\n                            type: Tomahawk.UrlType.Track,\n                            track: track.name,\n                            artist: artistsMap[track.artist].name\n                        };\n                    });\n                    Tomahawk.log(\"Reported found playlist '\" + res.playlists[0].title\n                        + \"' containing \" + tracks.length + \" tracks\");\n                    return {\n                        type: Tomahawk.UrlType.Playlist,\n                        title: res.playlists[0].title,\n                        guid: res.playlists[0].id,\n                        info: \"A playlist on Hatchet.\",\n                        creator: res.playlists[0].user,\n                        linkUrl: url,\n                        tracks: tracks\n                    };\n                });\n            });\n        }\n    }\n});\n\nTomahawk.resolver.instance = HatchetMetadataResolver;\n\nTomahawk.PluginManager.registerPlugin('chartsProvider', {\n\n    _baseUrl: \"https://api.hatchet.is/v2/charts\",\n\n    countryCodes: {\n        defaultCode: \"global\",\n        codes: [\n            {\"Global\": \"global\"}\n        ]\n    },\n\n    types: [\n        {\"Songs\": \"track\"},\n        {\"Artists\": \"artist\"},\n        {\"Albums\": \"album\"}\n    ],\n\n    /**\n     * Get the charts from the server specified by the given params map and parse them into the\n     * correct result format.\n     *\n     * @param params A map containing all of the necessary parameters describing the charts which to\n     *               get from the server.\n     *\n     *               Example:\n     *               { countryCode: \"us\",                //country code from the countryCodes map\n     *                 type: \"regional\" }                //type from the types map\n     *\n     * @returns A map consisting of the contentType and parsed results.\n     *\n     *          Example:\n     *          { contentType: Tomahawk.UrlType.Track,\n     *            results: [\n     *              { track: \"We will rock you\",\n     *                artist: \"Queen\",\n     *                album: \"Greatest Hits\" },\n     *              { track: \"Bohemian rhapsody\",\n     *                artist: \"Queen\",\n     *                album: \"Greatest Hits\" }\n     *            ]\n     *          }\n     *\n     */\n    charts: function (params) {\n        var url = this._baseUrl;\n        var options = {\n            data: {\n                type: params.type\n            }\n        };\n        return Tomahawk.get(url, options).then(function (response) {\n            var chartItemsMaps = {};\n            response.chartItems.forEach(function (item) {\n                chartItemsMaps[item.id] = item;\n            });\n            var tracksMaps = {};\n            if (response.tracks) {\n                response.tracks.forEach(function (item) {\n                    tracksMaps[item.id] = item;\n                });\n            }\n            var artistsMaps = {};\n            response.artists.forEach(function (item) {\n                artistsMaps[item.id] = item;\n            });\n            var albumsMaps = {};\n            if (response.albums) {\n                response.albums.forEach(function (item) {\n                    albumsMaps[item.id] = item;\n                });\n            }\n            var parsedResults = [];\n            for (var i = 0; i < response.chart[0].chartItems.length; i++) {\n                var chartItemId = response.chart[0].chartItems[i];\n                var chartItem = chartItemsMaps[chartItemId];\n                if (params.type == \"track\") {\n                    var track = tracksMaps[chartItem.track];\n                    parsedResults.push({\n                        track: track.name,\n                        artist: artistsMaps[track.artist].name,\n                        album: \"\"\n                    });\n                } else if (params.type == \"artist\") {\n                    parsedResults.push({\n                        artist: artistsMaps[chartItem.artist].name\n                    });\n                } else if (params.type == \"album\") {\n                    var album = albumsMaps[chartItem.album];\n                    parsedResults.push({\n                        artist: artistsMaps[album.artist].name,\n                        album: album.name\n                    });\n                }\n            }\n            var contentType;\n            if (params.type == \"track\") {\n                contentType = Tomahawk.UrlType.Track;\n            } else if (params.type == \"artist\") {\n                contentType = Tomahawk.UrlType.Artist;\n            } else if (params.type == \"album\") {\n                contentType = Tomahawk.UrlType.Album;\n            }\n            return {\n                contentType: contentType,\n                results: parsedResults\n            };\n        });\n    }\n\n});\n"
  },
  {
    "path": "hatchet-metadata/content/metadata.json",
    "content": "{\n\t\"name\": \"Hatchet\",\n\t\"pluginName\": \"hatchet-metadata\",\n\t\"author\": \"Enno Gottschalk\",\n\t\"email\": \"mrmaffen@googlemail.com\",\n\t\"version\": \"0.2.2\",\n\t\"website\": \"http://gettomahawk.com\",\n\t\"description\": \"Supports loading/drag'n'drop of hatchet.is URLs.\",\n\t\"type\": \"resolver/javascript\",\n\t\"manifest\": {\n\t\t\"main\": \"contents/code/hatchet-metadata.js\",\n\t\t\"scripts\": [],\n\t\t\"icon\": \"contents/images/icon.png\",\n\t\t\"iconWhite\": \"contents/images/iconWhite.png\",\n\t\t\"iconBackground\": \"contents/images/iconBackground.png\"\n\t}\n}\n"
  },
  {
    "path": "itunes/content/contents/code/itunes.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2016, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU Lesser General Public License as\n *   published by the Free Software Foundation, version 3.\n *\n *   Tomahawk is distributed in the hope that it will be useful, but\n *   WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n *   Lesser General Public License for more details.\n *\n *   You should have received a copy of the GNU Lesser General Public License\n *   along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nTomahawk.PluginManager.registerPlugin('chartsProvider', {\n\n    _baseUrl: \"https://itunes.apple.com/\",\n\n    countryCodes: {\n        defaultCode: \"us\",\n        codes: [\n            {\"United States\": \"us\"},\n            {\"United Kingdom\": \"gb\"},\n            {\"Andorra\": \"ad\"},\n            {\"Antigua and Barbuda\": \"ag\"},\n            {\"Argentina\": \"ar\"},\n            {\"Armenia\": \"am\"},\n            {\"Australia\": \"au\"},\n            {\"Austria\": \"at\"},\n            {\"Azerbaijan\": \"az\"},\n            {\"Bahamas\": \"bs\"},\n            {\"Bahrain\": \"bh\"},\n            {\"Bangladesh\": \"bd\"},\n            {\"Barbados\": \"bb\"},\n            {\"Belarus\": \"by\"},\n            {\"Belgium\": \"be\"},\n            {\"Belize\": \"bz\"},\n            {\"Bermuda\": \"bm\"},\n            {\"Bolivia\": \"bo\"},\n            {\"Bosnia and Herzegovina\": \"ba\"},\n            {\"Botswana\": \"bw\"},\n            {\"Brazil\": \"br\"},\n            {\"Brunei Darussalam\": \"bn\"},\n            {\"Bulgaria\": \"bg\"},\n            {\"Burkina Faso\": \"bf\"},\n            {\"Burundi\": \"bi\"},\n            {\"Cambodia\": \"kh\"},\n            {\"Cameroon\": \"cm\"},\n            {\"Canada\": \"ca\"},\n            {\"Cape Verde\": \"cv\"},\n            {\"Cayman Islands\": \"ky\"},\n            {\"Central African Republic\": \"cf\"},\n            {\"Chile\": \"cl\"},\n            {\"Colombia\": \"co\"},\n            {\"Comoros\": \"km\"},\n            {\"Costa Rica\": \"cr\"},\n            {\"Cuba\": \"cu\"},\n            {\"Cyprus\": \"cy\"},\n            {\"Czech\": \"cz\"},\n            {\"Côte d’Ivoire\": \"ci\"},\n            {\"Democratic Republic of the Congo\": \"cd\"},\n            {\"Denmark\": \"dk\"},\n            {\"Djibouti\": \"dj\"},\n            {\"Dominica\": \"dm\"},\n            {\"Dominican Republic\": \"do\"},\n            {\"Ecuador\": \"ec\"},\n            {\"Egypt\": \"eg\"},\n            {\"El Salvador\": \"sv\"},\n            {\"Equatorial Guinea\": \"gq\"},\n            {\"Eritrea\": \"er\"},\n            {\"Estonia\": \"ee\"},\n            {\"Ethiopia\": \"et\"},\n            {\"Falkland Islands\": \"fk\"},\n            {\"Faroe Islands\": \"fo\"},\n            {\"Fiji\": \"fj\"},\n            {\"Finland\": \"fi\"},\n            {\"France\": \"fr\"},\n            {\"French Polynesia\": \"pf\"},\n            {\"Gabon\": \"ga\"},\n            {\"Gambia\": \"gm\"},\n            {\"Georgia\": \"ge\"},\n            {\"Germany\": \"de\"},\n            {\"Greece\": \"gr\"},\n            {\"Greenland\": \"gl\"},\n            {\"Grenada\": \"gd\"},\n            {\"Guatemala\": \"gt\"},\n            {\"Guinea\": \"gn\"},\n            {\"Guinea-Bissau\": \"gw\"},\n            {\"Haiti\": \"ht\"},\n            {\"Honduras\": \"hn\"},\n            {\"Hong Kong\": \"hk\"},\n            {\"Hungary\": \"hu\"},\n            {\"India\": \"in\"},\n            {\"Indonesia\": \"id\"},\n            {\"Iran\": \"ir\"},\n            {\"Iraq\": \"iq\"},\n            {\"Ireland\": \"ie\"},\n            {\"Isle of Man\": \"im\"},\n            {\"Israel\": \"il\"},\n            {\"Italy\": \"it\"},\n            {\"Japan\": \"jp\"},\n            {\"Jordan\": \"jo\"},\n            {\"Kazakhstan\": \"kz\"},\n            {\"Kenya\": \"ke\"},\n            {\"Kiribati\": \"ki\"},\n            {\"Kyrgyzstan\": \"kg\"},\n            {\"Lao People’s Democratic Republic\": \"la\"},\n            {\"Latvia\": \"lv\"},\n            {\"Lebanon\": \"lb\"},\n            {\"Lesotho\": \"ls\"},\n            {\"Libyan Jamahiriya\": \"ly\"},\n            {\"Liechtenstein\": \"li\"},\n            {\"Lithuania\": \"lt\"},\n            {\"Luxembourg\": \"lu\"},\n            {\"Macao\": \"mo\"},\n            {\"Malaysia\": \"my\"},\n            {\"Maldives\": \"mv\"},\n            {\"Malta\": \"mt\"},\n            {\"Mauritius\": \"mu\"},\n            {\"Mexico\": \"mx\"},\n            {\"Moldova\": \"md\"},\n            {\"Monaco\": \"mc\"},\n            {\"Mongolia\": \"mn\"},\n            {\"Montenegro\": \"me\"},\n            {\"Morocco\": \"ma\"},\n            {\"Mozambique\": \"mz\"},\n            {\"Myanmar\": \"mm\"},\n            {\"Namibia\": \"na\"},\n            {\"Nauru\": \"nr\"},\n            {\"Nepal\": \"np\"},\n            {\"Netherlands\": \"nl\"},\n            {\"New Caledonia\": \"nc\"},\n            {\"New Zealand\": \"nz\"},\n            {\"Nicaragua\": \"ni\"},\n            {\"Niger\": \"ne\"},\n            {\"Nigeria\": \"ng\"},\n            {\"North Korea\": \"kp\"},\n            {\"Norway\": \"no\"},\n            {\"Oman\": \"om\"},\n            {\"Panama\": \"pa\"},\n            {\"Papua New Guinea\": \"pg\"},\n            {\"Paraguay\": \"py\"},\n            {\"Peru\": \"pe\"},\n            {\"Philippines\": \"ph\"},\n            {\"Poland\": \"pl\"},\n            {\"Portugal\": \"pt\"},\n            {\"Qatar\": \"qa\"},\n            {\"Romania\": \"ro\"},\n            {\"Russian Federation\": \"ru\"},\n            {\"Rwanda\": \"rw\"},\n            {\"Saint Helena\": \"sh\"},\n            {\"Samoa\": \"ws\"},\n            {\"Saudi Arabia\": \"sa\"},\n            {\"Serbia and Montenegro\": \"yu\"},\n            {\"Serbia\": \"rs\"},\n            {\"Singapore\": \"sg\"},\n            {\"Slovakia\": \"sk\"},\n            {\"Slovenia\": \"si\"},\n            {\"Somalia\": \"so\"},\n            {\"South Africa\": \"za\"},\n            {\"South Georgia and South Sandwich Islands\": \"gs\"},\n            {\"Spain\": \"es\"},\n            {\"Sri Lanka\": \"lk\"},\n            {\"Sudan\": \"sd\"},\n            {\"Swaziland\": \"sz\"},\n            {\"Sweden\": \"se\"},\n            {\"Switzerland\": \"ch\"},\n            {\"Syrian Arab Republic\": \"sy\"},\n            {\"Taiwan\": \"tw\"},\n            {\"Tajikistan\": \"tj\"},\n            {\"Thailand\": \"th\"},\n            {\"Timor-Leste\": \"tl\"},\n            {\"Togo\": \"tg\"},\n            {\"Tonga\": \"to\"},\n            {\"Trinidad and Tobago\": \"tt\"},\n            {\"Turkey\": \"tr\"},\n            {\"Turkmenistan\": \"tm\"},\n            {\"Tuvalu\": \"tv\"},\n            {\"Uganda\": \"ug\"},\n            {\"Ukraine\": \"ua\"},\n            {\"United Arab Emirates\": \"ae\"},\n            {\"Uzbekistan\": \"uz\"},\n            {\"Vanuatu\": \"vu\"},\n            {\"Vatican\": \"va\"},\n            {\"Venezuela\": \"ve\"},\n            {\"Viet Nam\": \"vn\"},\n            {\"Zambia\": \"zm\"},\n            {\"Zimbabwe\": \"zw\"}\n        ]\n    },\n\n    types: [\n        {\"Songs\": \"topsongs\"},\n        {\"Albums\": \"topalbums\"}\n    ],\n\n    /**\n     * Get the charts from the server specified by the given params map and parse them into the\n     * correct result format.\n     *\n     * @param params A map containing all of the necessary parameters describing the charts which to\n     *               get from the server.\n     *\n     *               Example:\n     *               { countryCode: \"us\",                //country code from the countryCodes map\n     *                 type: \"topsongs\" }                //type from the types map\n     *\n     * @returns A map consisting of the contentType and parsed results.\n     *\n     *          Example:\n     *          { contentType: Tomahawk.UrlType.Track,\n     *            results: [\n     *              { track: \"We will rock you\",\n     *                artist: \"Queen\",\n     *                album: \"Greatest Hits\" },\n     *              { track: \"Bohemian rhapsody\",\n     *                artist: \"Queen\",\n     *                album: \"Greatest Hits\" }\n     *            ]\n     *          }\n     *\n     */\n    charts: function (params) {\n        var url = this._baseUrl + params.countryCode + \"/rss/\" + params.type\n            + \"/limit=100/explicit=true/json\";\n        return Tomahawk.get(url).then(function (response) {\n            var results = JSON.parse(response);\n            var firstITunesContentType =\n                results.feed.entry[0][\"im:contentType\"][\"im:contentType\"].attributes.term;\n            var contentType;\n            if (firstITunesContentType == \"Track\") {\n                contentType = Tomahawk.UrlType.Track;\n            } else if (firstITunesContentType == \"Album\") {\n                contentType = Tomahawk.UrlType.Album;\n            } else {\n                throw new Error(\"Unsupported contentType!\");\n            }\n            var parsedResults = [];\n            for (var i = 0; i < results.feed.entry.length; i++) {\n                var entry = results.feed.entry[i];\n                var iTunesContentType = entry[\"im:contentType\"][\"im:contentType\"].attributes.term;\n                if (iTunesContentType != firstITunesContentType) {\n                    throw new Error(\"Two different contentTypes in one chart!\");\n                }\n                if (contentType == Tomahawk.UrlType.Track) {\n                    parsedResults.push({\n                        track: entry[\"im:name\"].label,\n                        artist: entry[\"im:artist\"].label,\n                        album: entry[\"im:collection\"][\"im:name\"].label\n                    });\n                } else if (contentType == Tomahawk.UrlType.Album) {\n                    parsedResults.push({\n                        album: entry[\"im:name\"].label,\n                        artist: entry[\"im:artist\"].label\n                    });\n                }\n            }\n            return {\n                contentType: contentType,\n                results: parsedResults\n            };\n        });\n    }\n\n});"
  },
  {
    "path": "itunes/content/metadata.json",
    "content": "{\n    \"name\": \"iTunes\",\n    \"pluginName\": \"itunes\",\n    \"author\": \"Enno\",\n    \"email\": \"mrmaffen@googlemail.com\",\n    \"version\": \"0.0.1\",\n    \"website\": \"https://itunes.apple.com\",\n    \"description\": \"Gets the latest and greatest iTunes Charts.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/itunes.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\"\n    }\n}\n"
  },
  {
    "path": "jamendo/content/contents/code/jamendo.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2011, lasconic <lasconic@gmail.com>\n *   Copyright 2015, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU Lesser General Public License as\n *   published by the Free Software Foundation, version 3.\n *\n *   Tomahawk is distributed in the hope that it will be useful, but\n *   WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n *   Lesser General Public License for more details.\n *\n *   You should have received a copy of the GNU Lesser General Public License\n *   along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar JamendoResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'Jamendo',\n        icon: 'jamendo-icon.png',\n        weight: 75,\n        timeout: 5\n    },\n\n    _baseUrl: \"https://api.jamendo.com/v3.0/tracks/\",\n\n    _clientId: \"f52d7f12\",\n\n    _convertTracks: function (results) {\n        var tracks = [];\n        for (var i = 0; i < results.length; i++) {\n            var result = results[i];\n            tracks.push({\n                artist: result.artist_name,\n                album: result.album_name,\n                track: result.name,\n                source: this.settings.name,\n                url: decodeURI(result.audio),\n                duration: result.duration\n            });\n        }\n        return tracks;\n    },\n\n    _searchRequest: function (query, limit) {\n        var that = this;\n\n        var settings = {\n            data: {\n                client_id: this._clientId,\n                format: \"json\",\n                limit: limit,\n                search: query\n            }\n        };\n        return Tomahawk.get(this._baseUrl, settings).then(function (response) {\n            return that._convertTracks(response.results);\n        });\n    },\n\n    resolve: function (params) {\n        var artist = params.artist;\n        var album = params.album;\n        var track = params.track;\n\n        return this._searchRequest(artist + \" \" + track, 5);\n    },\n\n    search: function (params) {\n        var query = params.query;\n\n        return this._searchRequest(query, 20);\n    }\n});\n\nTomahawk.resolver.instance = JamendoResolver;\n"
  },
  {
    "path": "jamendo/content/metadata.json",
    "content": "{\n    \"name\": \"Jamendo\",\n    \"pluginName\": \"jamendo\",\n    \"author\": \"lasconic and Enno\",\n    \"email\": \"lasconic@gmail.com\",\n    \"version\": \"0.2.1\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Searches Jamendo's free music database.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/jamendo.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/jamendo-icon.png\"\n        ]\n    }\n}\n"
  },
  {
    "path": "jazz-on-line/jazz-on-line-resolver.py",
    "content": "#!/usr/bin/python2.7\n# -*- coding: utf-8 -*-\n#\n# Copyright 2012 David Laban <alsuren@gmail.com>\n# Based on daap-resolver\n# Created by Christophe \"Tito\" De Wolf <tito@webtito.be> twitter.com/tito1337\n# Licensed under GPLv3 (http://www.gnu.org/licenses/gpl)\n######################################################################\n\n\nfrom jol_search import (get_structured_listing, get_name_artist_map, transpose,\n        normalize_name_tag, parse_artist_tag)\n\nimport os\nimport sys\nfrom struct import unpack, pack\nimport json\n\nimport logging\n\nlogger = logging.getLogger('jazz-on-line-resolver')\n\ndef print_json(o):\n    s = json.dumps(o)\n    logger.debug(\"responding %s\", s)\n    if LINE_BASED_PROCESSING:\n        sys.stdout.write(s + '\\n')\n    else:\n        sys.stdout.write(pack('!L', len(s)))\n        sys.stdout.write(s)\n    sys.stdout.flush()\n\n\ndef return_exact_results(request, results, callback):\n    formatted_results = []\n    for song in results:\n    \tresult = {\n                \"artist\": song[\"artist\"],\n                \"track\": song[\"name\"],\n                \"score\": 1,\n                \"url\": song[\"link\"],\n                \"mimetime\": \"audio/mpeg\",\n                \"source\": \"jazz-on-line.com\",\n            }\n        if 1800 < song.get(\"year\", 0) < 2100:\n            result[\"year\"] = song[\"year\"]\n        formatted_results.append(result)\n\n    response = {\n            'qid': request['qid'],\n            'results': formatted_results,\n            '_msgtype': 'results'\n        }\n    callback(response)\n\ndef search_for_track(request, callback):\n    song_name = normalize_name_tag(request['track'])\n    songs_by_artist = songs_by_name_artist.get(song_name, {})\n    exact_results = []\n    for artist in parse_artist_tag(request[\"artist\"]):\n        if artist in songs_by_artist:\n            songs = songs_by_artist[artist]\n            for song in songs:\n                exact_results.append(song)\n\n    if exact_results:\n        return_exact_results(request, exact_results, callback)\n    else:\n        logger.debug(\"%s produced no results\", request)\n\t\n\nif __name__ == \"__main__\":\n    try:\n\tif \"--line-based\" in sys.argv:\n\t\tsys.argv.remove(\"--line-based\")\n\t\tLINE_BASED_PROCESSING = True\n                logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)\n\telse:\n\t\tLINE_BASED_PROCESSING = False\n\n        THIS_DIR = os.path.dirname(__file__)\n        if THIS_DIR:\n            THIS_DIR = os.path.abspath(THIS_DIR)\n        else:\n            THIS_DIR = os.path.abspath('.')\n\n\tlogger.info(\"Started in %s\", THIS_DIR)\n\n\tstructured_listing = get_structured_listing(THIS_DIR + \"/listing.txt\")\n\tsongs_by_artist_name = get_name_artist_map(structured_listing)\n\tsongs_by_name_artist = transpose(songs_by_artist_name)\n\n\tlogger.info(\"Advertising settings.\")\n\tsettings = {\n                \"_msgtype\": \"settings\",\n                \"name\": \"jazz-on-line resolver\",\n\t\t\"targettime\": 100, # ms\n\t\t\"weight\": 80\n\t\t}\n\tprint_json(settings)\n\n\twhile True:\n            if LINE_BASED_PROCESSING:\n                msg = sys.stdin.readline()\n                if not msg.strip():\n                    exit(0)\n                request = json.loads(msg)\n            else:\n                logger.debug(\"waiting for message length\")\n                big_endian_length = sys.stdin.read(4)\n\n                if len(big_endian_length) < 4:\n                    logger.debug(\"No length given (%r==EOF?). Exiting.\", \n                            big_endian_length)\n                    exit(0)\n                length = unpack(\"!L\", big_endian_length)[0]\n                if not length or not 4096 > length > 0:\n                    logger.warn(\"invalid length: %s\", length)\n                    break\n                logger.debug(\"waiting for %s more chars\", length)\n                msg = sys.stdin.read(length)\n                request = json.loads(msg)\n        \n            if '_msgtype' not in request:\n                logger.warn(\"malformed request (no _msgtype): %s\",\n                    request)\n            elif request['_msgtype'] == 'rq': # Search\n                if 'fulltext' in request:\n                    logger.debug(\"not handling searches for now\")\n                    continue\n                else:\n                    logger.debug(\"searching for for %s\", request)\n                    search_for_track(request, print_json)\n                    continue\n            elif request['_msgtype'] == 'config':\n                logger.debug(\"ignoring config message: %s\", request)\n            elif request['_msgtype'] == 'quit':\n                logger.info(\"Asked to Quit. Exiting.\")\n                exit(0)\n            else:\n                logger.warn(\"Don't understand %s\", request)\n\n    except Exception:\n        logger.exception(\"something went wrong\")\n        raise\n"
  },
  {
    "path": "jazz-on-line/jol_search.py",
    "content": "import os\nimport json\nimport re\n\nimport logging\n\nlogger = logging.getLogger('jol-search')\n\nLISTING_FORMAT = [\"link\", \"artist\", \"name\",\n        \"label\", \"number\", \"matrix\", \"year\", \"artists\"]\n\nbracketmatcher = re.compile(r\" *\\(.*\\)\")\ndef delete_brackets(string):\n    newstring = bracketmatcher.sub(\"\", string)\n    return newstring\n\nquotesmatcher = re.compile(r\"\"\" *['\"].*['\"]\"\"\")\ndef delete_quotes(string):\n    return quotesmatcher.sub(\"\", string)\n\ndef normalize(string_):\n    string = delete_brackets(string_)\n    string = string.lower().strip()\n    return string\n        \n\ndef normalize_name_tag(string):\n    name_tag = normalize(string).replace(':', '')\n    for sep in [\" - \", \" feat. \"]:\n        name, sep, rest = name_tag.partition(sep)\n        if rest:\n            name_tag = name\n            break\n    return name_tag.replace('-', ' ').replace('ing', 'in').replace(\"'\", \"\")\n\ndef parse_artist_tag(string):\n    artists = []\n    artist_tag = normalize(string)\n    for sep in [\" w \", \" et \", \" and \", \" & \", \"'s \", \" orch\",\n                \" sextet\", \" quintet\", \" quartet\", \" trio\"]:\n        artist, sep, rest = artist_tag.partition(sep)\n        if sep:\n            artists.append(artist)\n            break\n    else:\n        artists.append(artist_tag)\n\n    for sep in [\" feat. \", \" and \", \" w \"]:\n        artist, sep, feature = artist_tag.partition(sep)\n        if feature and not feature.startswith(\"his \") \\\n                and not feature.startswith(\"her \"):\n            artists.append(feature)\n\n    mistakes = {\"rgythm\": \"rhythm\", \"the \": \"\"}\n    for mistake, replacement in mistakes.items():\n        if mistake in artist_tag:\n            artists.extend(parse_artist_tag(artist_tag.replace(mistake, replacement)))\n\n    return artists\n\ndef get_structured_listing(listings_filename):\n        listings = open(listings_filename)\n        listings.next()\n        structured_listing = []\n        previous_line = \"\"\n        for lineno, line in enumerate(listings):\n            splitline = line.split(\"\\t\")\n            if len(splitline) < len(LISTING_FORMAT):\n                logger.error(\"problem on line %s\", lineno)\n                logger.error(\"%s\", repr(previous_line))\n                logger.error(\"%s\", repr(line))\n                continue\n            song = dict(zip(LISTING_FORMAT, splitline))\n            structured_listing.append(song)\n            previous_line = line\n\n        structured_listing.sort(key=lambda x: x[\"link\"].rpartition('/')[-1])\n        return structured_listing\n\ndef get_artist_list(song):\n    artists = parse_artist_tag(song[\"artist\"])\n    artists_tag = normalize(song[\"artists\"])\n    artists_tag = artists_tag.replace(\" and \", \", \")\n    artists_tag = artists_tag.replace(\" or \", \", \")\n    artists_tag = re.sub(\"[^,]* by \", \"\", artists_tag)\n    split_artists_tag = artists_tag.split(\", \")\n    split_artists_tag = [delete_quotes(name)\n            for name in split_artists_tag if \" \" in name]\n    if len(split_artists_tag) > 1:\n            artists = artists + split_artists_tag\n\n    return artists\n\n\ndef get_name_artist_map(structured_listing):\n    songs_by_artist_name = {} # {artist: {name: [songdetails]}}\n    for song in structured_listing:\n        song_name = normalize_name_tag(song[\"name\"])\n        artists = get_artist_list(song)\n\n        for artist in set(artists):\n            songs_by_name = songs_by_artist_name.setdefault(artist, {})\n            songs = songs_by_name.setdefault(song_name, [])\n            songs.append(song)\n    return songs_by_artist_name\n\ndef transpose(songs_by_artist_name):\n    songs_by_name_artist = {} # {name: {artist: [songdetails]}}\n    for artist, songs_by_name in songs_by_artist_name.iteritems():\n        for song_name, songs in songs_by_name.iteritems():\n            by_artist = songs_by_name_artist.setdefault(song_name, {})\n            songs = by_artist.setdefault(artist, songs)\n    return songs_by_name_artist\n\nif __name__ == \"__main__\":\n    logging.basicConfig\n    logger.setLevel(logging.DEBUG)\n\n    structured_listing = get_structured_listing(\"listing.txt\")\n    songs_by_artist_name = get_name_artist_map(structured_listing)\n    songs_by_name_artist = transpose(songs_by_artist_name)\n\n"
  },
  {
    "path": "jazz-on-line/listing.txt",
    "content": "Artist\tTitle\tLabel\tNumber\tMatrix\tYear\tlink_MP3\n http://www.jazz-on-line.com/a/mp3h/Vic75261-1.mp3\tGlen Gray And His Orchestra\t Dardanella, Black-eyed Susan Brown, Casa Loma Stomp\tVictor\tL-16023\t75261-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCC-2302.mp3\tSammy Stewart's Orchestra\t' Cause I Feel Low Down\tVOCALION\t15724\tC-2302\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_012.mp3\tPerry Como And Fontane Sisters\t''a'' - You're Adorable\tRCA Victor\t78-3381\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Col145764-3.mp3\tFletcher Henderson And His Orchestra\t''d'' Natural Blues\tColumbia\t1543-D\t145764-3  \t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65249-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\t''i Wanna' Go Where You Go - Do What You Do Then I'll Be Happy\tDecca\t2723\t65249-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc13278.mp3\tFletcher Henderson And His Club Alabama Orchestra\t''those Broken Busted'' (can't Be Trusted Bleus)\tVocalion\t14838\t13278\t1924\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol1467-D.mp3\tLeo Reisman & His Orchestra\t'cause I Feel Low-down\tColumbia\t1467-D\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_225.mp3\tGuy Mitchell And Mindy Carson Feat. Mitch Miller's Orchestra\t'cause I Love You, That's A-why\tCOLUMBIA\t39879\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh783A.mp3\tEd Smalle And His Piano\t'deed I Do\t\t\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe403842-A.mp3\tArthur Schutt And His Orchestra\t'leven-thirty Saturday Night\tOKeh\t41400\t403842-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC62683-2.mp3\tHenny Hendrickson's Louisville Serenaders\t'leven-thirty Saturday Night\tVICTOR\t\t62683-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic81088-1.mp3\tCab Calloway And His Cotton Club Orchestra\t'long About Midnight\tVictor\t24592\t81088-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480744.mp3\tBen Webster Quintet\t'nuff Said\tCircle\tCLP42\tN1635-1\t1944\tHot Lips Page (tp), Ben Webster (ts), Clyde Hart (p), Charlie Drayton (sb), Denzil Best (dm)\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18436r.mp3\tAmerican Quartet\t'round Her Neck She Wears A Yellow Ribbon\tVictor\t18436\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480483.mp3\tArt Pepper Plus Eleven\t'round Midnight\tContinental\tM3568\t\t1959\tPete Candoli, Jack Sheldon (tp), Dick Nash (tb), Bob Ebevoldsen (ts, vtb), Vince DeRosa (fhr), Art Pepper, Herb Geller (as), Bill Perkins (ts), Med Flory (bar), Russ Freeman (p), Joe Mondragon (sb), Mel Lewis (dm), Marty Paich (arr, cond)\nhttp://www.jazz-on-line.com/a/mp3t/TS480570.mp3\tArt Tatum And Benny Carter\t's Wonderful\tClef\tEP-319\t1800-2\t1954\tArt Tatum (p), Benny Carter (as), Louie Bellson (dm)\nhttp://www.jazz-on-line.com/a/mp3b/Vic42567-1.mp3\tLouisiana Sugar Babes\t'sippi\tVictor\t21348\t42567-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC39551-A.mp3\tJimmie Lunceford And His Orchestra\t'sleepy Time Gal\tDECCA\t908B\t39551-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61250-A.mp3\tJimmie Lunceford And His Orchestra\t'tain't Good (like A Nickle Made Of Wood)\tDecca\t960\t61250-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61250-A.mp3\tJimmie Lunceford And His Orchestra\t'tain't Good (like A Nickle Made Of Wood).mp3\tDecca\t960\t61250-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Oke71068-C.mp3\tSara Martin\t'tain't Nobody's Bus'ness If I Do\tOkeh\t8043\t71068-C\t1922\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65040-A.mp3\tChick Webb And His Orchestra\t'tain't What You Do\tDecca\t2310\t65040-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke23905-1.mp3\tJimmie Lunceford And His Orchestra\t'tain't What You Do (it's The Way That You Do It)\tOkeh\t4582\t23905-1\t1938\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3e/V-D219A.mp3\tJimmy Lunceford And His Orchestra\t'taint What You Do\tV-DISC\t219A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-24193-1.mp3\tHarry James And His Orchestra\t'taint What You Do (it's The Way That Cha Do It)\tBrunswick\t8337\tB-24193-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Col031655-1.mp3\tBenny Goodman And His Orchestra\t'tis Autumn\tColumbia\tGL-523\tCO-031655-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_290.mp3\tErskine Hawkins And His 'bama State Collegians\t'way Down Upon The Swanee River\tVOCALION\t3567\t21002-1\t1937\tErskine Hawkins, Wilbur Bascomb, Marcellus Green, Sam Lowe (tp), Edward Sims, Robert Range (tb), William Johnson, Jimmy Mitchelle (as, vo), Paul Bascomb (ts), Heywood Henry (cl, bar), Avery Parrish (p), William McLemore (g), Leemie Stanfield (sb), James Morrison (dm)\nhttp://www.jazz-on-line.com/a/mp3d/Dec73397.mp3\tLucky Millinder And His Orchestra\t(ah-yes) There's Good Blues Tonight\tDecca\t18835\t73397\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_097.mp3\tCheers\t(bazoom) I Need Your Lovin'\tCapitol\t2921\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_117.mp3\tPerry Como\t(did You Ever Get) That Feeling In The Moonlight\tVICTOR\t1709\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_172.mp3\tEddy Duchin And His Orchestra Feat. V/stanley Worth\t(don't Wait Till) The Night Before Christmas\tBRUNSWICK\t8264\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec68319-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\t(ev'rything Happened) When I Saw You\tDecca\t3491\t68319-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480666.mp3\tNat King Cole\t(get Your Kicks On) Route 66\tCapitol\tEAP3/EBF2/W-782\t\t1956\tNat King Cole, P & Vocal, Harry ''Sweets'' Edison, T, John Collins, G, Charlie Harris, B, Lee Young, D\nhttp://www.jazz-on-line.com/a/mp3w/1917_064.mp3\tNora Bayes\t(goodbye, And Luck Be With You) Laddie Boy\tVictor\t45130\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_081.mp3\tKay Kyser And His Orchestra\t(gotta Get Some) Shut-eye\tBRUNSWDECCAICK\t8312\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_156.mp3\tMal Hallet And His Orchestra\t(have You Forgotten) The You And Me That Used To Be\tDECCA\t1281\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1057-A.mp3\tCab Calloway And His Orchestra\t(hep-hep!) The Jumpin' Jive\tVocalion\t5005\tWM-1057-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_024.mp3\tCab Calloway And His Orchestra\t(hep-hep) The Jumpin' Jive\tVOCALION\t5005\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_197.mp3\tBing Crosby And Connee Boswell Feat. John Scott Trotter's Orchestra\t(ho-dle-ay) Start The Day Right\tDECCA\t2626\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-22085-1.mp3\tHarry James And His Orchestra\t(i Can Dream) Can't I?\tBrunswick\t8038\tB-22085-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64785-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\t(i Don't Believe It But) Say It Again\tDecca\t2774\t64785-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_125.mp3\tTed Fio Rito And His Orchestra Feat. Muzzy Marcellino\t(i Don't Stand) A Ghost Of A Chance With You\tBRUNSWICK\t6505\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65189-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\t(i Guess) I'll Never Learn\tDecca\t2510\t65189-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_008.mp3\tKing Cole Trio\t(i Love You) For Sentimental Reasons\tCapitol\t304\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_091.mp3\tElla Fitzgerald Feat. Delta Rhythm Boys\t(i Love You) For Sentimental Reasons\tDECCA\t23670\t73669\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Par1468-1.mp3\tAnna Jones\t(i Wish I Could Shimmy Like My) Sister Kate\tParamount\t12052\t1468-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/Col152199-1.mp3\tClaude Hopkins And His Orchestra\t(i Would Do) Anything For You\tColumbia\t2665-D\t152199-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/JazB-11894-A.mp3\tClaude Hopkins And His Orchestra\t(i Would Do) Anything For You\tJazz Archives\t4\tB-11894-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_269.mp3\tFrankie Carle And His Orchestra\t(i'm A-comin', I'm A-courtin')corabelle\tCOLUMBIA\t37972\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_069.mp3\tLarry Clinton And His Orchestra Feat. Bea Wain\t(i'm Afraid) The Masquerade Is Over\tVICTOR\t26151\t031812\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_156.mp3\tEddie Fisher\t(i'm Always Hearing) Wedding Bells\tRCA Victor\t6015\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_055.mp3\tArt Mooney And His Orchestra With Barry Gordon\t(i'm Getting) Nuttin' For Christmas\tMGM\t12092\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_159.mp3\tRicky Zahnd And The Blue Jeaners\t(i'm Getting) Nuttin' For Christmas\tColumbia\t40576\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3h/GenX-190-A.mp3\tDuke Ellington & His Washingtonians\t(i'm Just Wild About) Animal Crackers\tGennett\t3342\tX-190-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480612.mp3\tThe Art Tatum Trio\t(i'm Left With The) Blues In My Heart\tClef\tEP-318\t1792-1\t1954\tBenny Carter (as), Art Tatum (p), Louie Bellson (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1938_222.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\t(i've Been) Savin' Myself For You\tVictor\t25867\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-2232-1.mp3\tFletcher Henderson And His Orchestra\t(i've Been) Saving Myself For You\tVocallon\t4154\tC-2232-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27934.mp3\tGlenn Miller & His Orchestra\t(i've Got A Gal In) Kalamazoo\tVictor\t27934\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC072283.mp3\tGlenn Miller And His Orch Vocal By Tex Beneke And The Modernaires\t(i've Got A Gal In) Kalamazoo\tVICTOR\t27934\t072283\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_225.mp3\tFred Astaire Feat. Johnny Green And His Orchestra\t(i've Got) Beginner's Luck\tBRUNSWICK\t7855\tLA1274-D\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR303-Hx.mp3\tAstorites\t(i've Grown So Lonesome) Th\tHarmony\t303-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18613-1.mp3\tTeddy Wilson And His Orchestra\t(if I Had) Rhythm In My Nursery Rhyme\tBRUNSWICK\t7612\t18613-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_138.mp3\tTommy Dorsey And His Orchestra\t(if I Had) Rhythm In My Nursery Rhymes\tVictor\t25201\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_297.mp3\tElla Fitzgerald Feat. O/chick Webb\t(if You Can't Sing It) You'll Have To Swing It\tDecca\t1032\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_039.mp3\tSavannah Churchill\t(it's No) Sin\tRCA VICTOR\t4280\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_106.mp3\tFour Knights\t(it's No) Sin\tCapitol\t1806\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_049.mp3\tKay Kyser And His Orchestra\t(lights Out) Til Reveille\tCOLUMBIA\t36137\tHCO264\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-16289-A.mp3\tLouis Prima And His New Orleans Gang\t(looks Like I'm) Breakin' The Ice\tBrunswick\t7320\tB-16289-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_054.mp3\tFrank Sinatra\t(love Is) The Tender Trap\tCapitol\t3290\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_246.mp3\tRuth Brown Feat. Taft Jordan (trumpet)\t(mama) He Treats Your Daughter Mean\tAtlantic\t986\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_045.mp3\tDejohn Sisters\t(my Baby Don't Love Me) No More\tEpic\t9085\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic88787-1.mp3\t\"fats\" Waller And His Rhythm\t(oh Susannah) Dust Off That Old Pianna\tVictor\t24888\t88787-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec67304-A.mp3\tElla Fitzgerald And Her Savoy Eight\t(oh, Oh) What Do You Know About Love\tDecca\t1967\t67304-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1697.mp3\tDuke Ellington And His Famous Orchestra\t(otto Make That) Riff Staccato\tRCA Victor\t20-1697-A\tD5VB234-1\t1945\tVocal refrain by Ray Nance\nhttp://www.jazz-on-line.com/a/mp3w/1950_141.mp3\tAmes Brothers, The Feat. Roy Ross Orchestra\t(put Another Nickel In) Music! Music! Music!\tCORAL\t60153\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_115.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra Feat. V/stanley Hickman\t(she Walks Like You, She Talks Like You) She Reminds Me Of You\tCOLUMBIA\t2922\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBan0675.mp3\tChick Bullock\t(the One I Love) Just Can't Be Bothered With Me\tBanner\t0675\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_281.mp3\tBuddy Clark Feat. O/ray Noble\t(the Treasure Of) Sierra Madre\tCOLUMBIA\t38026\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_104.mp3\tRichard Maltby And His Orchestra\t(themes From) The Man With The Golden Arm\tVik\t0196\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC60430-A.mp3\tIsham Jones And His Orchestra\t(there Is) No Greater Love - Vocal Woody Herman\tDecca\t\t60430-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_009.mp3\tGuy Lombardo And His Royal Canadians\t(there Ought To Be A) Moonlight Saving Time\tColumbia\t2457\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_092.mp3\tJimmy Dorsey And His Orchestra\t(there'll Be Bluebirds Over) The White Cliffs Of Dover\tDECCA\t4103A\t69993\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61345-A.mp3\tJimmie Lunceford And His Orchestra\t(this Is) My Last Affair\tDecca\t1035\t61345-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_114.mp3\tJimmie Lunceford And His Orchestra\t(this Is) My Last Affair\tDecca\t1035\t61345-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20701-1.mp3\tTeddy Wilson And His Orchestra\t(this Is) My Last Affair\tBrunswick\t7840  \tB-20701-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61345-A.mp3\tJimmie Lunceford And His Orchestra\t(this Is) My Last Affair.mp3\tDecca\t1035\t61345-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec60158-D.mp3\tLouis Armstrong And His Orchestra\t(was I To Blame For) Falling In Love With You\tDecca\t622\t60158-D\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_003.mp3\tBill Haley And His Comets\t(we're Gonna) Rock Around The Clock\tDecca\t29124 A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_041.mp3\tRuth Etting\t(what Do We Do) On A Dew-dew-dewy Day\tCOLUMBIA\t979 D\tW143548-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_204.mp3\tChick Bullock And His Orchestra\t(when It's) Darkness On The Delta\tMelotone\t12584\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_126.mp3\tTed Fio Rito And His Orchestra Feat. Muzzy Marcellino\t(when It's) Darkness On The Delta\tBRUNSWICK\t6478\tSF28\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_068.mp3\tLouis Armstrong Feat. Sy Oliver's Orchestra\t(when We Are Dancing) I Get Ideas\tDecca\t27720A\t81308-A\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_282.mp3\tBob Crosby And His Orchestra Feat. V/bob Crosby\t(why Couldn't It Last) Last Night\tDecca\t2812\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_214.mp3\tBoswell Sisters Feat. New Yorkers, The\t(with You On My Mind I Find) I Can't Write The Words\tBRUNSWICK\t6170\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481512.mp3\tCharles Mingus\t(woody?n You) Wouldn't You?\tBethlehem\tBCP6026\t\t1957\tJimmy Knepper (tb), Shafi Hadi (as, ts), Horace Parlan (p), Charles Mingus (sb, arr), Dannie Richmond (dm)\nhttp://www.jazz-on-line.com/a/mp3h/GenX-57-A.mp3\tDuke Ellington & His Orch.\t(you've Got Those) ''wanna Go Back Again'' Blues\tGennett\t3291-A\tX-57-A\t1926\tHarry Cooper, Leroy Rutledge (tp) Charlie Irvis (tb) Don Redman (cl,as) Prince Robinson (cl,ts) Otto Hardwick (as,bar) Duke Ellington (p) Fred Guy (bj) Bass Edwards (tu) Vocal by Sonny Greer\nhttp://www.jazz-on-line.com/a/mp3w/1956_031.mp3\tPlatters\t(you've Got) The Magic Touch\tMercury\t70819\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU11414.mp3\tCarson Robison Trio\t- We're Gonna Have To Slap The Dirty Little Jap\tBLUEBIRD\t11414\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D255.mp3\tRed Norvo & His Orchestra\t1-2-3-4 Jump\tV-DISC\t085\t255\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/MOD120S.mp3\tHoward Mcghee\t11:45 Swing\tMODERN\t120\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_171.mp3\tAl Hibbler\t11th Hour Melody\tDecca\t29789\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_221.mp3\tLou Busch And His Orchestra\t11th Hour Melody\tCapitol\t3349\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC99.mp3\tPete Johnson's Allstars\t1280 Stomp\tNATIONAL\t\tNSC99\t1946\t\nhttp://www.78-tours.net/mp3/JSMM1360.mp3\tKid Ory And His Creole Jazz Band Kid Ory (tb), Teddy Buckner (tp), Joe Darensbourg, Albert Nicholas\t12th Street Rag\tJAZZ SELECTION DIXIE\tJ.S. 594\tM. M. 1360\t\t\nhttp://www.jazz-on-line.com/a/mp3o/HISB-D-262x.mp3\tFats Waller And His Rhythm\t12th Street Rag\tHis Master's Voice\tB-D-262\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic037632-1.mp3\tLionel Hampton And His Orchestra\t12th Street Rag\tVictor\t26362\t037632-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_087.mp3\tEarl Fuller's Novelty Orchestra\t12th Street Rag\tCOLUMBIA\t2298\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_320.mp3\tCount Basie And His Orchestra\t16 Men Swinging\tClef\t89147\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiM33184.mp3\tThe Dutch Swing College Band\t1919 Rag\tDecca\tM33184\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO11y.mp3\tTurk Murphy's Jazz Band\t1919 Rag\tGood Time Jazz\t11\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_248.mp3\tCarson Robison\t1942 Turkey In The Straw\tBLUEBIRD\t11460\t071720\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D145A2.mp3\tCarson Robison\t1944 Nursery Rhymes\tV-DISC\t145A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70654.mp3\tJimmie Davis\t1982 Blues\tVICTOR\t23688\t70654\t1932\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67818.mp3\tLouis Armstrong And His Orch.\t2.19 Blues\tDECCA\t25099\t67818\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_213.mp3\tGeorgia Gibbs\t24 Hours A Day (365 A Year)\tMercury\t70743\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/SUNSRC100.mp3\tJoe Sullivan (piano)\t24 Hours At Booth's\tSUNSET\t100-53\tSRC100\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Pat70425.mp3\tHenderson's ''club Alabam'' Orchestra\t31st Street Blues\tPath? Actuelle\t036042\t70425\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053207.mp3\tHarlan Leonard & His Rockets\t400 Swing\tBLUEBIRD\t10823\t053207\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh037.mp3\tJack Hylton And His Orchestra\t42nd Street-medley Part 1 And 2 (v Pat Omalley)\tDecca\tF-3619\tGB-6031-2  GB-6032-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69520-B.mp3\tAndy Kirk & Clouds Of Joy\t47th Street Jive\tDECCA\t4042A\t69520-B\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69520-B.mp3\tAndy Kirk And His Twelve Clouds Of Joy\t47th Street Jive\tDecca\t4042\t69520-B\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_281.mp3\tAmes Brothers\t49 Shades Of Green\tRCA\t6608\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481518.mp3\tCharles Mingus\t51st Street Blues\tBethlehem\tBCP6019\tTk 4\t1957\tClarence ?Gene? Shaw (tp), Jimmy Knepper (tb), Shafi Hadi (ts), Bill Evans (p), Charles Mingus (sb), Dannie Richmond (dm)\nhttp://www.jazz-on-line.com/a/mp3c/BLU1568h.mp3\tBud Powell's Modernists\t52nd Street Theme\tBLUENOTE\t1568\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COL402220A.mp3\t Earl Hines\t57 Varieties\tCOLUMBIA\t2800 D\t402220A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68332-A.mp3\tPete Johnson & His Band\t627 Stomp\tDECCA\t18121A\t68332-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480674.mp3\tTeddy Wilson & His Orch.\t71\tColumbia\t35737\t26438-A\t1940\tKarl George, Harold Baker, Doc Cheatham (tp), Jack Wiley (tb), Pete Clark (cl, as, bar), Rudy Powell (cl, as), Ben Webster, George Irish (ts), Teddy Wilson (p), Al Casey (g), Al Hall (sb), J.C. Heard (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DEC66634-A.mp3\tJan Savitt & His Top Hatters\t720 In The Books\tDECCA\t2771B\t66634-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047016.mp3\tCharlie Barnet & His Orchestra\t720 In The Books\tBLUEBIRD\t10618\t047016\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeC-3678-1.mp3\tCount Basie And His Orchestra\t9.20 Special\tOkeh\t6244\tC-3678-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEWC3678.mp3\tCount Basie And His Orchestra\t9:20 Special\tOKEH\t6244\tWC3678\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_396.mp3\tElla Fitzgerald\tA Beautiful Friendship\tVerve\t2012\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC90523-A.mp3\tJan Garber And His Orchestra, Vocal By Lew Palmer\tA Beautiful Lady In Blue\tDECCA\t651A\tC90523-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_017.mp3\tJan Garber And His Orchestra\tA Beautiful Lady In Blue\tDECCA\t651A\tC90523-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047640.mp3\tByron Parker Mountaineers\tA Beautiful Life\tBLUEBIRD\t8476\t047640\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26462.mp3\tMildred Bailey\tA Bee Gezindt\tCOLUMBIA\t35409\t26462\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1113-A.mp3\tCab Calloway And His Orchestra\tA Bee Gezindt\tVocalion\t5267\tWM-1113-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW149840-4.mp3\tPaul Whiteman Rytm Boy's (vocal Bing Crosby)\tA Bench In The Park\tColumbia\tE DB282\tW149840-4\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW149825-2.mp3\tPaul Whiteman And His Orchestra (vocal Bing Crosby)\tA Bench In The Park\tColumbia\tE CB86\tW149825-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW149825-1.mp3\tPaul Whiteman And His Orchestra (vocal Bing Crosby)\tA Bench In The Park\tColumbia\ttest\tW149825-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBS045943.mp3\tDeep River Boys\tA Bird In The Hand\tBLUEBIRD\t10847\tBS045943\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_020.mp3\tNat ''king'' Cole\tA Blossom Fell\tCapitol\t3095\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU85512-1.mp3\tFrank Blackwell\tA Blues\tBLUEBIRD\t5914\t85512-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM880-1.mp3\tDuke Ellington's Famous Orchestra\tA Blues Serenade\tBRUNSWICK\t8221\tM880-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17379.mp3\tGlenn Miller & His Orchestra\tA Blues Serenade (vsb)\tARC\tCO3051D\t17379\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_312.mp3\tKing Cole Trio\tA Boy From Texas\tCAPITOL\t15085\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc22370-1.mp3\tMaxine Sullivan (orchestra Under Direction Claude Thornhill)\tA Brown Bird Singing\tVocalion\t4068\t22370-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9174.mp3\tOriginal Memphis Five\tA Bunch Of Blues - Drag Foxtrot (kelly & Wyer)\tEDISON\t\t9174\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1899_019.mp3\tVess Ossman\tA Bunch Of Rags\tMONARCH\tV-0153\tB6508-1\t1899\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW149158.mp3\tPaul Whiteman & His Orchestra\tA Bundle Of Old Love Letters\tCOLUMBIA\t2047 D\tW149158\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW194379-3.mp3\tPaul Whiteman And His Orchestra (bing Crosby Solo)\tA Bundle Of Old Love Letters\tColumbia\tE 5724\tW194379-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_166.mp3\tDoris Day\tA Bushel And A Peck\tCOLUMBIA\t39008\tHCO4259\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3930x.mp3\tPerry Como And Betty Hutton, Orchestra Of Mitchell Ayres\tA Bushel And A Peck\tRCA\t20-3930\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4259.mp3\tDoris Day\tA Bushel And A Peck\tCOLUMBIA\t39008\tHCO4259\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_208.mp3\tAndrews Sisters\tA Bushel And A Peck\tDECCA\t27252\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_029.mp3\tPerry Como And Betty Hutton Feat. Mitchell Ayres' Orchestra\tA Bushel And A Peck\tRCA Victor\t3930\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_321.mp3\tJohnny Desmond Feat. Tony Mottola's Orchestra And Ray Charles Singers\tA Bushel And A Peck\tMGM\t10800\t50S266\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053133.mp3\tGlenn Miller & His Orchestra\tA Cabana In Havana\tBLUEBIRD\t10776\t053133\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO54389.mp3\tFrankie Laine\tA Capitol Ship\tCOLUMBIA\t40669\tCO54389\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_194.mp3\tSix Teens\tA Casual Look\tFlip\t315\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_398.mp3\tSanford Clark\tA Cheat\tDot\t15516\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/OKE28863.mp3\tCab Calloway And His Orch\tA Chicken Ain't Nothin' But A Bird\tOKEH\t5847\t28863\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68169.mp3\tLouis Jordan & His Tympani 5\tA Chicken Ain't Nothin' But A Bird\tDECCA\t8501\t68169\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_234.mp3\tLeroy Anderson And His \"pops\" Concert Orchestra\tA Christmas Festival\tDECCA\t16041\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS22841-2.mp3\tRed Norvo & His Orchestra\tA Cigarette And A Silhouette (v M. Bailey)\tCBS\tBR8171\t22841-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO45115.mp3\tSarah Vaughan\tA City Called Heaven\tCOLUMBIA\t39207\tCO45115\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150079-4.mp3\tGuy Lombardo Royal Canadians\tA Cottage For Sale\tCOLUMBIA\t2156 D\tW150079-4\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/NATNSC54.mp3\tBilly Eckstine And His Orchestra\tA Cottage For Sale\tNATIONAL\t\tNSC54\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVB4412.mp3\tErroll Garner\tA Cottage For Sale\tSAVOY\t725\tB4412\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/COL41283AC.mp3\tFrankie Laine\tA Cottage For Sale\tCOLUMBIA\t41283\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_108.mp3\tBilly Eckstine\tA Cottage For Sale\tNational\t9014\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_279.mp3\tBilly Williams Quartet\tA Crazy Little Place (that's My Home)\tCoral\t61576\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE17740.mp3\tNick Lucas\tA Cup Of Coffee, A Sandwich And You\tBRUNSWICK\t3052\tE17740\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_050.mp3\tGertrude Lawrence And Jack Buchanan\tA Cup Of Coffee, A Sandwich, And You\tCOLUMBIA\t512 D\tW141271\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2502x.mp3\tJean Shepard\tA Dear John Letter\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu042550-1.mp3\tArtie Shaw And His Orchestra\tA Deserted Farm\tBluebird\tAXM2-5556\t042550-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic87321.mp3\tEnrico Caruso\tA Dream\tVictrola\t87321\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_149.mp3\tEnrico Caruso\tA Dream\tVICTOR\t87321\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68547.mp3\tAndy Kirk & Clouds Of Joy\tA Dream Dropped In\tDECCA\t3619B\t68547\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec68547-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tA Dream Dropped In\tDecca\t3619\t68547-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO3891.mp3\tBuddy Clark Orchestra Of Ted Dale, With The Girl Friends\tA Dreamer's Holiday\tCOLUMBIA\t38599\tHCO3891\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP61911.mp3\tRay Anthony\tA Dreamer's Holiday\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_119.mp3\tRay Anthony\tA Dreamer's Holiday\tCapitol\t761\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_109.mp3\tBuddy Clark And Girl Friends Feat. Ted Dale's Orchestra\tA Dreamer's Holiday\tCOLUMBIA\t38599\tHCO3891\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_032.mp3\tPerry Como And Fontane Sisters\tA Dreamer's Holiday\tRCA Victor\t78-3543\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC70617.mp3\tPaul Whiteman & His Orchestra\tA Faded Summer Love\tVICTOR\t22827\t70617\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE37282.mp3\tBing Crosby\tA Faded Summer Love\tBRUNSWICK\t6200\tE37282\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_103.mp3\tBing Crosby\tA Faded Summer Love\tBRUNSWICK\t6200\tE37282\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_303.mp3\tGeorgie Shaw\tA Faded Summer Love\tDecca\t30078\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_295.mp3\tFrank Sinatra\tA Fellow Needs A Girl\tCOLUMBIA\t37883\tHCO2539\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_300.mp3\tPerry Como Feat. O/runs Case\tA Fellow Needs A Girl\tRCA Victor\t2402\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_111.mp3\tPhil Hanna\tA Fellow On A Furlough\tDecca\t4445\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_130.mp3\tAl Sack And His Orchestra\tA Fellow On A Furlough\tPremier\t101\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19971.mp3\tBillie Holiday\tA Fine Romance\tARC\tVO3333\t19971\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100914.mp3\tGuy Lombardo Royal Canadians\tA Fine Romance\tVICTOR\t25372\t100914\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_135.mp3\tBillie Holiday\tA Fine Romance\tARC\tVO3333\t19971\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_006.mp3\tFred Astaire\tA Fine Romance\tBRUNSWICK\t7716\tLA1133-D\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_189.mp3\tHenry King And His Orchestra (voc Joe Sudy)\tA Fine Romance\tDecca\t890\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA588-A.mp3\tVictor Young And His Orchestra With Dixie Lee Crosby And Bing Crosby, Vocal\tA Fine Romance\tDECCA\t23681A\tDLA588-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1133-D.mp3\tFred Astaire Orchestra Of Johnny Green\tA Fine Romance (a Sarcastic Love Song)\tBRUNSWICK\t7716\tLA1133-D\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW24759.mp3\tJames P Johnson\tA Flat Dream\tCOLUMBIA\t37333\tW24759\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_087.mp3\tHarry Macdonough And John Bieling\tA Flower From Home, Sweet Home\tVictor\t4877\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3c/SUNSR1009.mp3\tJohnny Hodges & His Orchestra\tA Flower Is A Lonesome Thing\tSUNSET\t2005\tSR1009\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1465-A.mp3\tFred Astaire With Ray Noble And His Orchestra\tA Foggy Day\tBRUNSWICK\t7982\tLA1465-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1059.mp3\tArtie Shaw And His Orchestra\tA Foggy Day\tRCA\t20-1933\tD5VB1059\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8946AFD.mp3\tLester Young & His Orchestra\tA Foggy Day\tMERCURY\t8946\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1016-A.mp3\tBob Crosby & His Orchestra\tA Foggy Day\tDECCA\t1539\tDLA1016-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_048.mp3\tFred Astaire Feat. Ray Noble's Orchestra\tA Foggy Day\tBRUNSWICK\t7982\tLA1465-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_302.mp3\tBob Crosby And His Orchestra Feat. V/kay Weber\tA Foggy Day\tDECCA\t1539\tDLA1016-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480496.mp3\tArt Tatum/buddy Defranco Quartet\tA Foggy Day\tColumbia\tLB 10039\t2682-4\t1956\tBuddy De Franco (cl), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480803.mp3\tThe Art Tatum Trio\tA Foggy Day\tPablo\t2310-732\t1791-2\t1954\tBenny Carter (as), Art Tatum (p), Louie Bellson (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS481505.mp3\tCharles Mingus Quintet\tA Foggy Day\tFantasy\t6009\t\t1955\tEddie Bert (tb), George Barrow (ts), Mal Waldron (p), Charles Mingus (sb), Willie Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1953_134.mp3\tNat ''king'' Cole\tA Fool Was I\tCAPITOL\t2540\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3463.mp3\tBing Crosby - J.s.trotter Or.\tA Friend Of Yours\tDECCA\t18658B\tL3463\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_126.mp3\tTommy Dorsey And His Orchestra\tA Friend Of Yours\tVictor\t1657\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10337.mp3\tDoris Day\tA Full Time Job\tCOLUMBIA\t39898\tHCO10337\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_177.mp3\tDoris Day And Johnnie Ray Feat. Paul Weston's Orchestra\tA Full Time Job\tCOLUMBIA\t39898\tHCO10337\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP316.mp3\tJohnny Mercer, With The Pied Pipers, Orchestra Of Paul Weston\tA Gal In Calico\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1991x.mp3\tTex Beneke And The Glenn Miller Orchestra, Vocal By Tex Beneke And The Crew Chiefs\tA Gal In Calico\tRCA\t20-1991\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4169.mp3\tBing Crosby & Calico Kids\tA Gal In Calico\tDECCA\t23739\tL4169\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_057.mp3\tJohnny Mercer\tA Gal In Calico\tCapitol\t316\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_070.mp3\tTex Beneke And The Glenn Miller Orchestra Feat. The Crew Chiefs\tA Gal In Calico\tRCA Victor\t1991\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480667.mp3\tAhmad Jamal\tA Gal In Calico\tArgo\tLP2638\t\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3w/1947_073.mp3\tBenny Goodman And His Orchestra (vocal Eve Young)\tA Gal In Calico\tCOLUMBIA\t37187\tHCO2111-1\t1946\tJohn Best, Nate Kazebier, Dick Mains, Dale Pierce (tp), Cutty Cutshall, Leon Cox (tb), Addison Collins (fhr), Benny Goodman (cl), Larry Molinelli (as), Cliff Strickland, Zoot Sims (ts), John Rotella (bar), Joe Bushkin (p), Barney Kessel (g), Harry Babasin (sb), Louie Bellson (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1938_265.mp3\tHenry King And His Orchestra\tA Gardan In Granada\tDecca\t1767\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_106.mp3\tFour Aces\tA Garden In The Rain\tDECCA\t27860\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_173.mp3\tGene Austin Feat. O/nat Shilkret\tA Garden In The Rain\tVICTOR\t21915\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_272.mp3\tPerry Como Feat. O/russ Morgan\tA Garden In The Rain\tRCA Victor\t1916\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC38335.mp3\tFrank Crumit\tA Gay Caballero\tDECCA\t114B\t38335\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_021.mp3\tFrank Crumit Feat. Leonard Joy And His Orchestra\tA Gay Caballero\tDECCA\t114B\t38335\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COLZSP7463.mp3\tBing Crosby\tA Ghost Of A Chance\tCOLUMBIA\t39524\tZSP7463\t\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S3164.mp3\tSlim Gaillard Trio\tA Ghost Of A Chance (i Don't Stand).\tMGM\t10309B\t47S3164\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_037.mp3\tEddie Fisher\tA Girl A Girl (zoom-ba Di Alli Nella)\tRCA Victor\t5675\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAVI20-5675.mp3\tEddie Fisher, Orchestra And Chorus Of Hugo Winterhalter\tA Girl, A Girl\tRCA\t20-5675\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/RegW-1258-W.mp3\tTimmie Rogers And His All Star Orchestra\tA Good Deal\tRegis\t7001\tW-1258-W\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe81571-B.mp3\tFrankie Trumbauer & His Orchestra\tA Good Man Is Hard To Find\tOKeh\t40966\t81571-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144797-3.mp3\tBessie Smith\tA Good Man Is Hard To Find\tCOLUMBIA\t14250 D\tW144797-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC22593-3.mp3\tMarion Harris\tA Good Man Is Hard To Find\tVICTOR\t18535A\t22593-3\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65952.mp3\tLouis Prima's New Orleans Gang\tA Good Man Is Hard To Find\tDECCA\t2660A\t65952\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031530.mp3\tFats Waller And His Rhythm\tA Good Man Is Hard To Find\tBLUEBIRD\t10143\t031530\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4909.mp3\tCass Daley And Sonny Burke Orch.\tA Good Man Is Hard To Find\tDECCA\t24600\tL4909\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_154.mp3\tBessie Smith\tA Good Man Is Hard To Find\tCOLUMBIA\t14250 D\tW144797-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_016.mp3\tMarion Harris\tA Good Man Is Hard To Find\tVICTOR\t18535A\t22593-3\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_087.mp3\tTed Lewis And His Band\tA Good Man Is Hard To Find\tCOLUMBIA\t1428 D\tW145798-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_125alt.mp3\tErnest Hare\tA Good Man Is Hard To Find\tEmerson\t9112\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10119.mp3\tDoris Day - Paul Weston Orchestra\tA Guy Is A Guy\tCOLUMBIA\t39673\tHCO10119\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82319.mp3\tElla Fitzgerald\tA Guy Is A Guy\tDECCA\t28049\t82319\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_016.mp3\tDoris Day Feat. Paul Weston's Orchestra\tA Guy Is A Guy\tCOLUMBIA\t39673\tHCO10119\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_310.mp3\tArt Kassel And His \"kassels-in-the-air\" (voc Art Kassel)\tA Guy Needs A Gal\tBluebird\t10656\t044818\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM845-1.mp3\tDuke Ellington's Famous Orchestra\tA Gypsy Without A Song\tBRUNSWICK\t8186\tM845-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC80696.mp3\tBuddy Johnson\tA Handful Of Stars\tDECCA\t29058\t80696\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055096-1.mp3\tArtie Shaw And His Orchestra\tA Handful Of Stars\tVictor\t26790\t055096-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC055096.mp3\tArtie Shaw And His Orchestra\tA Handful Of Stars (vab)\tVICTOR\t26790\t055096-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU055517.mp3\tGlenn Miller & His Orchestra\tA Handful Of Stars (vre)\tBLUEBIRD\t10893\t055517\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_171.mp3\tEddy Arnold\tA Heart Full Of Love (for A Handful Of Kisses)\tRCA Victor\t3174\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_425.mp3\tGale Storm\tA Heart Without A Sweetheart\tDot\t15492\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0420.mp3\tTempo King's Kings Of Tempo\tA High Hat, A Picolo And A Cane\tBLUEBIRD\t6575\t0420\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC02166.mp3\tTommy Dorsey & His Orchestra\tA High Hat, A Picolo And A Cane\tVICTOR\t25447\t02166\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_424.mp3\tGeorgia Gibbs\tA Home Lovin' Man\tMERCURY\t70238\tYB9770\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014647.mp3\tFats Waller And His Rhythm\tA Hopeless Love Affair\tVICTOR\t25689\t014647\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70904.mp3\tGene Kardos & His Orchestra\tA Hot Dog, A Blanket And You (v D R)\tVICTOR\t22840\t70904\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC80503.mp3\tMiff Mole's Little Molers\tA Hot Time In The Old Town Tonight\tVOCALION\t3041\t80503\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_119.mp3\tFour Lads\tA House With Love In It\tColumbia\t40736\tCO56505\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4676.mp3\tBing Crosby & Andrews Sisters\tA Hundred And Sixty Acres\tDECCA\t24481\tL4676\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152567-1.mp3\tEthel Waters And Her Ebony 4\tA Hundred Years From Today\tCOLUMBIA\t2853 D\tW152567-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2416.mp3\tJack Teagarden & His Orchestra\tA Hundred Years From Today\tDECCA\t4317B\tDLA2416\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S520.mp3\tSarah Vaughan\tA Hundred Years From Today\tMGM\t30342\t48S520\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_077.mp3\tEthel Waters\tA Hundred Years From Today\tCOLUMBIA\t2853\tW152567-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/Mus5458.mp3\tGeorgie Auld And His Orchestra\tA Hundred Years From Today\tMusicraft\t458\t5458\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14854.mp3\tGlen Gray & Casa Loma Orch.\tA Hundred Years From Today (vlee Wiley)\tBRUNSWICK\t6775\t14854\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/CBS8099-1.mp3\tJoe Candullo And His Orchestra\tA Jazz Holiday\tCBS\tBA7169\t8099-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/VOCC1652.mp3\tBennie Goodman's Boys\tA Jazz Holiday\tVOCALION\t15656\tC1652\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_220.mp3\tJudy Garland\tA Journey To A Star\tDECCA\t18584B\tL3265\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO38944.mp3\tCharioteers\tA Kiss And A Rose\tCOLUMBIA\t38438\tCO38944\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_182.mp3\tCharioteers\tA Kiss And A Rose\tCOLUMBIA\t38438\tCO38944\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/COL41163AKC.mp3\tFrankie Laine\tA Kiss Can Change The World\tCOLUMBIA\t41163\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC81307-A.mp3\tLouis Armstrong - Sy Oliver\tA Kiss To Build A Dream On\tDECCA\t27720B\t81307-A\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_125.mp3\tLouis Armstrong Feat. Sy Oliver's Orchestra\tA Kiss To Build A Dream On\tDECCA\t27720B\t81307-A\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-191.mp3\tLionel Hampton And His Orchestra\tA Kiss Was Just A Kiss\tMGM\t11371\t51-S-191\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S189.mp3\tLionel Hampton & His Orchestra\tA Kiss Was Just A Kiss (until You Came Along)\tMGM\t11371\t51S189\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37738-2.mp3\tJean Goldkette & His Orchestra\tA Lane In Spain\tVICTOR\t20491B\t37738-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_163.mp3\tJean Goldkette And His Orchestra\tA Lane In Spain\tVICTOR\t20491B\t37738-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/COLHCO1481.mp3\tVictor Borge\tA Lesson In Composition  (to Be Followed By ''the Blue Serenade'')\tCOLUMBIA\t36912\tHCO 1481\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/CenEG-183-A.mp3\tErroll Garner\tA Lick And A Promise\tCentury\t1503\tEG-183-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24514x.mp3\tEvelyn Knight, With The Stardusters\tA Little Bird Told Me\tDECCA\t24514\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_058.mp3\tPaula Watson\tA Little Bird Told Me\tSUPERTONE\t1139\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_042.mp3\tBlue Lu Barker\tA Little Bird Told Me\tCAPITOL\t15308\t3528\t1949\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD8VB3426.mp3\tRose Murphy (the Chee-chee Girl)\tA Little Bird Told Me\tVictor\t20-3320-A\tD8VB3426\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP3528.mp3\tBlue Lu Barker\tA Little Bird Told Me So\tCAPITOL\t15308\t3528\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC98175-1.mp3\tFats Waller And His Rhythm\tA Little Bit Independent\tVICTOR\t25196\t98175-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC60169.mp3\tBob Crosby & His Orchestra\tA Little Bit Independent\tDECCA\t629B\t60169\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_113.mp3\tBob Crosby And His Orchestra\tA Little Bit Independent\tDECCA\t629B\t60169\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19014-1.mp3\tBunny Berigan And His Boys\tA Little Bit Later On\tVOCALION\t3224\t19014-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3/Joh099.mp3\tJack Harris Orchestra\tA Little Bit Later On\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh099.mp3\tJack Harris And His Orchestra\tA Little Bit Later On (v Marjorie Stedeford)\tDecca\tF-6160\tTB-2562-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC768-B.mp3\tJohn Mccormack\tA Little Bit Of Heaven\tVICTROLA\t\t768-B\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_089.mp3\tJohn Barnes Wells\tA Little Bit Of Heaven (shure, They Call It Ireland)\tColumbia\t1662\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_018.mp3\tCharles Harrison\tA Little Bit Of Heaven (shure, They Call It Ireland)\tVICTOR\t17780\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC33883-2.mp3\tRoger Wolfe Kahn & His Orchestra\tA Little Bungalow\tVICTOR\t19860A\t33883-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D705pp.mp3\tBuddy Rich Orchestra\tA Little Handicap\tV-DISC\t705\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh033.mp3\tThe Organ, The Dance Band And Me (billy Thorburn\tA Little King Without A Crown\tParlophone\tF-1746\tCE-10497-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_132.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tA Little Kiss At Twilight\tVICTOR\t25878\t023517-2\t1938\tHarry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Dave Matthews, Noni Bernardi (as), Bud Freeman, Arthur Rollini (ts), Jess Stacy (p), Ben Heller (g), Harry Goodman (sb), Dave Tough (dm)\nhttp://www.jazz-on-line.com/a/mp3a/VIC57124-5.mp3\tRudy Vallee Connecticut Yankee\tA Little Kiss Each Morning\tVICTOR\t22193\t57124-5\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_1205_02.mp3\tLee Morse And Her Bluegrass Boys\tA Little Kiss Each Morning\tColumbia\t2063DB\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_034.mp3\tRudy Vallee And His Connecticut Yankees\tA Little Kiss Each Morning (a Little Kiss Each Night)\tVICTOR\t22193\t57124-5\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0300_04.mp3\tLee Morse\tA Little Love\tPerfect\t11618B\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_376.mp3\tBob Carroll\tA Little Love\tDERBY\t821\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_215.mp3\tDream Weavers Featuring Wade Buff\tA Little Love Can Go A Long, Long Way\tDecca\t29905\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3d/HMVOLA-1716-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tA Little Love, A Little Kiss\tHMV\tB-8598\tOLA-1716-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe80941-D.mp3\tEddie Lang\tA Little Love, A Little Kiss\tOKeh\t40989\t80941-D\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_035.mp3\tJohn Mccormack\tA Little Love, A Little Kiss\tVictor\t64343\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI4135-C.mp3\tHelen Clark - Joseph A. Phillips - O\tA Little Love, A Little Kiss (lao Silsu - Adrian Ross)\tEDISON\tBA 2841\t4135-C\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18642x.mp3\tGuy Lombardo\tA Little On The Lonely Side\tDECCA\t18642\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_243.mp3\tPhil Moore Four\tA Little On The Lonely Side\tRCA\t20-1641\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_037.mp3\tFrankie Carle And His Orchestra Feat. Paul Allen\tA Little On The Lonely Side\tCOLUMBIA\t36760\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/HITT478.mp3\tLouis Prima & His Orchestra\tA Little On The Lonely Side (v L P)\tHIT OF THE WEEK\t7118b\tT478\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_181.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tA Little Rendezvous In Honolulu\tVictor\t25246\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU07270.mp3\tTune Wranglers\tA Little While Ago\tBLUEBIRD\t7030\t07270\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC017465.mp3\tTommy Dorsey & His Orchestra\tA Little White Lighthouse\tVICTOR\t25733\t017465\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_354.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tA Little White Lighthouse\tVICTOR\t25733\t017465\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5983.mp3\tWynonie Harris & His Allstars\tA Love Untrue\tKING\t4445\tK5983\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/PER15092-B.mp3\tFrank Keyes And His Orchestra\tA Love-tale Of Alsace Lorra\tPerfect\t15092-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_162.mp3\tInk Spots\tA Lovely Way To Spend An Evening\tDECCA\t18583B\t71609\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_136.mp3\tFrank Sinatra\tA Lovely Way To Spend An Evening\tCOLUMBIA\t36687\tCO33373\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC042739.mp3\tTommy Dorsey & His Orchestra\tA Lover Is Blue\tVICTOR\t26390\t042739\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1184-1.mp3\tJimmy Mundy Swing Club 7\tA Lover Is Blue (v Madeline Greene)\tVARSITY\t8136\tUS1184-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042177.mp3\tCharlie Barnet & His Orchestra\tA Lover Is Blue (vje)\tBLUEBIRD\t10511 B\t042177\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67239.mp3\tGlen Gray & Casa Loma Orch.\tA Lover's Lullaby\tDECCA\t3053B\t67239\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053623.mp3\tBarney Bigard & His Orchestra\tA Lull At Dawn\tBLUEBIRD\t10981\t053623\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/AtlRK2.mp3\tFantasy For Clarinet And Strings With Barney Bigard\tA Lull At Dawn\tAtlantic\tEP 528\tRK2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1772.mp3\tBing Crosby - J.s.trotter Orchestra\tA Man And His Dream\tDECCA\t11023\tDLA1772\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65966.mp3\tJimmy Dorsey & His Orch.\tA Man And His Dream\tDECCA\t2650A\t65966\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_124.mp3\tEddie Fisher\tA Man Chases A Girl (until She Catches Him)\tRCA Victor\t6015\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S450.mp3\tBuddy Rich & His Orchestra\tA Man Could Be A Wonderful Thing\tMGM\t10174A\t47S450\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/VICHMVEA2537.mp3\tAlec Templeton\tA Man With A New Radio\tVICTOR\tHMV EA2537\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC75290.mp3\tElla Fitzgerald\tA Man Wrote A Song\tDECCA\t24773\t75290\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62446-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tA Mellow Bit Of Rhythm\tDecca\t1579\t62446-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_239.mp3\tBunny Berigan And His Orchestra Feat. Chick Bullock\tA Melody From The Sky\tVOCALION\t3224\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_088.mp3\tEddy Duchin And His Orchestra Feat. V/pete Woolery\tA Melody From The Sky\tVICTOR\t25254\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_011.mp3\tJan Garber And His Orchestra\tA Melody From The Sky\tDECCA\t761\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68056.mp3\tWoody Herman & His Orchestra\tA Million Dreams Ago\tDECCA\t3396B\t68056\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053131.mp3\tGlenn Miller And His Orchestra\tA Million Dreams Ago (vray Eberle)\tBLUEBIRD\t10768\t053131\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47071.mp3\tSarah Vaughan\tA Miracle Happened\tCOLUMBIA\t39634\tCO47071\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe400962-B.mp3\tLouis Armstrong's Hot Five\tA Monday Date\tOKeh\t8609\t400962-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE402211-A.mp3\tEarl Hines (piano)\tA Monday Date\tOKeh\t8832\t402211-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_211.mp3\tLouis Armstrong With Earl Hines Feat. Louts And His Hot Five, Including Hines (piano). Fred Robinson\tA Monday Date\tOKeh\t8609\t400962-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/COLCO35253.mp3\tVictor Borge\tA Mozart Opera By Borge\tCOLUMBIA\t36914\tCO 35253\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC13629.mp3\tFletcher Henderson & His Orchestra\tA New Kind Of Man\tVOCALION\t14880A\t13629\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc13629.mp3\tFletcher Henderson And His Orchestra\tA New Kind Of Man (with A New Kind Of Love For Me)\tVocalion\t14880\t13629\t1924\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81772-1.mp3\tThe Georgians\tA New Kind Of Man With A New Kind Of Love For Me\tColumbia\t136-D\t81772-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/CONM1009-1.mp3\tCab Calloway & His Orchestra\tA New Moon And An Old Serenade\tCONQUEROR\t9199\tM1009-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU033905.mp3\tCharlie Barnet & His Orchestra\tA New Moon And An Old Serenade\tBLUEBIRD\t10153\t033905\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC033730.mp3\tTommy Dorsey & His Orchestra\tA New Moon And An Old Serenade\tVICTOR\t26181\t033730\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_068.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tA New Moon And An Old Serenade\tVICTOR\t26181\t033730\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1009-1.mp3\tCab Calloway And His Orchestra\tA New Moon And An Old Serenade\tVocalion\t4767\tWM-1009-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_123.mp3\tJohnny Green And His Orchestra\tA New Moon Is Over My Shoulder\tColumbia\t2940-D\tCO-15620-A\t1934\tBernice Park (vo), Angie Rettiner (tp), unknown (tb), Jimmy Lytell (cl, as), Charles Dale (cl, as, bar), Ernest White, Murray Cohan (cl, ts), Leo Kruczck, Lou Kosloff, Joe Baum (vn), Johnny Green (p), David Terry (p), Perry Botkin (g), Kaspar Markowitz (sb), Al Lapin (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480367.mp3\tArt Farmer Quintet\tA Night At Tony's\tPrestige\tLP7085\t574\t1954\tArt Farmer (tp) Gigi Gryce (as) Horace Silver (p) Percy Heath (b) Kenny Clarke (d)\nhttp://www.jazz-on-line.com/a/mp3e/V-D275B.mp3\tBoyd Raeburn And His Orchestra\tA Night In Tunisia\tV-DISC\t275B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480497.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tA Night In Tunisia\tRCA\t430045\t\t1959\tArt Blakey, Kenny Clarke, D, Benny Golson, Ts, Lee Morgan, T,: Jymie Merritt, B, Bobby Timmons, P\nhttp://www.jazz-on-line.com/a/mp3a/BRU31897.mp3\tJack Denny And His Orchestra\tA Night Of Happiness\tBRUNSWICK\t4698\t31897\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1900_023.mp3\tAmerican Quartet (earliest)\tA Night Trip To Buffalo\tGram-o-Phone\t43\t\t1900\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2287.mp3\tBing Crosby\tA Nightingale Sang In Berkeley Square\tDECCA\t3584A\tDLA2287\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS28526-1.mp3\tGene Krupa & His Orchestra\tA Nightingale Sang In Berkeley Square\tCBS\toK5802\t28526-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_116.mp3\tRay Noble And His Orchestra\tA Nightingale Sang In Berkeley Square\tCOLUMBIA\t35733\tWC3293\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481769.mp3\tAnita O'day\tA Nightingale Sang In Berkeley Square\tVerve\tMGV2000\t2561-4\t1955\tacc. by Paul Smith (p), Barney Kessel (g), Joe Mondragon (sb), Alvin Stoller (dm), Corky Hale (harp), strings. Buddy Bregman (arr, dir)\nhttp://www.jazz-on-line.com/a/mp3e/Vic51158-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tA Nite At The Cotton Club Part 1 (intro. Cotton Club Stomp/misty Mornin')\tVictor\t741029\t51158-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic57759-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tA Nite At The Cotton Club Part 2 (intro. Cotton Club Stomp/misty Mornin')\tVictor\t741029\t57759-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-4019x.mp3\tTony Martin\tA Penny A Kiss\tRCA\t20-4019\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_140.mp3\tAndrews Sisters\tA Penny A Kiss - A Penny A Hug\tDECCA\t27414\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC75342-1.mp3\tRoy Bargy & Ramona\tA Penny For Your Thoughts\tVICTOR\t24260\t75342-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP1209.mp3\tNat King Cole Qt\tA Pile Of Cole\tV-DISC\t437\tVP1209\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO30308.mp3\tFletcher Henderson\tA Pixie From Dixie\tCOLUMBIA\t36289\tCO30308\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/ColCO-30308-1.mp3\tFletcher Henderson And His Orchestra\tA Pixie From Dixie\tColumbia\t36289\tCO-30308-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC39520.mp3\tBob Howard & His Orchestra\tA Porter's Love Song\tDECCA\t460B\t39520\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-858-A.mp3\tJimmie Noone And His Orchestra\tA Porter's Love Song\tVocalion \t2888\tC-858-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic82526-1.mp3\tFats Waller And His Rhythm\tA Porter's Love Song To A Chambermaid\tVictor\t24648\t82526-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/AtlRK1.mp3\tFantasy For Clarinet And Strings With Barney Bigard\tA Portrait Of Louise\tAtlantic.\tEP 528\tRK1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21832-B.mp3\tGeorge Olsen And His Music\tA Precious Little Thing Cal\tVictor\t21832-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR814-Hy.mp3\tLou Gold And His Orch\tA Precious Little Thing Cal\tHarmony\t814-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCNO-132.mp3\tEllis Stratakos And His Hotel Jung Orchestra\tA Precious Little Thing Called Love\tVOCALION\t15792\tNO-132\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC47801-1.mp3\tGeorge Olsen And His Music\tA Precious Little Thing Called Love (ves)\tVICTOR\t21832B\t47801-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP6408.mp3\tEddie Heywood\tA Pretty Girl Is Like A Melody\tCOLUMBIA\t39316\tZSP6408\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26908.mp3\tEddie South & His Orchestra\tA Pretty Girl Is Like A Melody\tCOLUMBIA\t35633\t26908\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19435-2.mp3\tArtie Shaw And His Orchestra\tA Pretty Girl Is Like A Melody\tVOCALION\t4465\tB-19435-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-116-1.mp3\tAndr Ekyan (with Django Reinhardt)\tA Pretty Girl Is Like A Melody\tSWING\t194\tOSW-116-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480815.mp3\tAndre Kostelanetz And His Orchestra\tA Pretty Girl Is Like A Melody\tCOLUMBIA\t4267-M\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_309.mp3\tDoris Day O/paul Weston\tA Purple Cow\tCOLUMBIA\t40020\tRHCO10502\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc16524-1.mp3\tChuck Richards With Mills Blue\tA Rainbow Filled With Music\tVocalion\t2877\t16524-1  \t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_260.mp3\tMindy Carson Feat. Andrew Acker's Orchestra\tA Rainy Day Refrain\tRCA VICTOR\t3921\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_081.mp3\tSam Donahue And His Orchestra\tA Rainy Night In Rio\tCAPITOL\t\t1228\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO34269-1.mp3\tLes Brown & His Orchestra\tA Red Kiss On A Blue Letter (vdoris Day)\tCOLUMBIA\t36896\tCO34269-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_098.mp3\tJan Garber And His Orchestra\tA Rendezvous With A Dream\tDecca\t867\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC01809.mp3\tFats Waller And His Rhythm\tA Rhyme For Love (vfw)\tVICTOR\t25491\t01809\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-10075-B.mp3\tArtie Shaw And His Orchestra\tA Room With A View\tBLUEBIRD\tB-10075-B\t030731-1\t1938\tVocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3c/DEC64759.mp3\tJimmy Dorsey & His Orch.\tA Room With A View\tDECCA\t2213A\t64759\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44360.mp3\tBobby Hackett\tA Room With A View\tCOLUMBIA\t39019\tCO44360\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic21801a.mp3\tRoger Wolfe Kahn & His Orchestra\tA Room With A View\tVictor\t21801\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_202.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tA Room With A View\tVICTOR\t26097\t028180\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh082.mp3\tJack Hylton And His Orchestra\tA Room With A View (concert Arr.)\tHMV\tC-1577\tCc-14393-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_046.mp3\tGeorge Hamilton Iv\tA Rose And A Baby Ruth\tABC-Par\t9765\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COL21250.mp3\tBillie Holiday\tA Sailboat In The Moonlight\tCOLUMBIA\t37495\t21250\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC010361.mp3\tGuy Lombardo Royal Canadians\tA Sailboat In The Moonlight\tVICTOR\t25594\t010361\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25594.mp3\tGuy Lombardo & His Royal Candians\tA Sailboat In The Moonlight\tVictor\t25594\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_174.mp3\tBillie Holiday\tA Sailboat In The Moonlight\tCOLUMBIA\t37495\t21250\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC87751.mp3\tRed & Betty Foley\tA Satisfied Mind\tDECCA\t29526\t87751\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D349A.mp3\tLes Brown And His Orchestra (doris Day Voc.)\tA Sentimental Journey\tV-DISC\t349A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC40229-1.mp3\tPaul Whiteman & His Orchestra\tA Shady Tree (w)\tVICTOR\t20972B\t40229-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL67.mp3\tColeman Hawkins Qt\tA Shanty In Old Shanty Town\tKEYNOTE\t622\tHL67\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152319-2.mp3\tRoger Wolfe Kahn And His Orchestra\tA Shine On Your Shoes\tCOLUMBIA\t2722 D\tW152319-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/ARCTO-1210.mp3\tMonette Moore\tA Shine On Your Shoes,lousiana Hayride\tARC\t\tTO-1210\t1932\tFats Waller\nhttp://www.jazz-on-line.com/a/mp3w/1952_282.mp3\tJune Valli\tA Shoulder To Weep On\tRCA VICTOR\t5017\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_175.mp3\tJohnnie Ray\tA Sinner Am I\tCOLUMBIA\t39788\tCO47692\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC067915.mp3\tTommy Dorsey And His Orchestra\tA Sinner Kissed An Angel\tVICTOR\t27611\t067915\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_188.mp3\tTommy Dorsey Orch V Frank Sinatra\tA Sinner Kissed An Angel\tVICTOR\t27611\t067915\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3994-1.mp3\tDick Jurgens And His Orchestra\tA Sinner Kissed An Angel (vh.cool)\tOKEH\t6439\tC3994-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_126.mp3\tDuke Ellington And His Famous Orchestra Feat. Ray Nance\tA Slip Of The Lip\tVictor\t1528\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3h/ARC16787-1.mp3\tVic Berton And His Orchestra\tA Smile Will Go A Long, Long Way\tARC\tVO2964\t16787-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3l/COL81480.mp3\tLeo Reisman & His Orchestra\tA Smile Will Go A Long, Long Way\tCOLUMBIA\t71D\t81480\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE31645.mp3\tCab Calloway And His Orchestra\tA Smo-o-o-oth One\tOKEH\t6720\t31645\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol36607.mp3\tTommy Tucker Time\tA Soldier's Dream\tColombia\t36607\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102409.mp3\tCharlie Barnet & His Orchestra\tA Star Fell Out Of Heaven\tBLUEBIRD\t6488A\t102409\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA430.mp3\tBen Bernie And His Orchestra\tA Star Fell Out Of Heaven\tDECCA\t878A\tDLA430\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_144.mp3\tSunny Gale Feat. O/ralph Burns\tA Stolen Waltz\tRCA Victor\t5103\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057661.mp3\tGlenn Miller & His Orchestra\tA Stone's Throw From Heaven (vre)\tBLUEBIRD\t11063\t057661\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_122.mp3\tCrew-cuts\tA Story Untold\tMercury\t70634\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014655.mp3\tBunny Berigan & His Orchestra\tA Strange Loneliness\tVICTOR\t25690B\t014655\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_337.mp3\tBunny Berigan And His Orchestra Feat. V/gail Reese\tA Strange Loneliness\tVICTOR\t25690B\t014655\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25237.mp3\tXavier Cugat\tA Street In Old Seville\tVictor\t25237\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiUnka.mp3\tGlenn Miller & His Orchestra\tA String Of Pearls\tUnknown\t\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC85566.mp3\tGlenn Miller ''the Glenn Miller Story''\tA String Of Pearls\tDECCA\t29015\t85566\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_123.mp3\tBenny Goodman And His Orchestra\tA String Of Pearls\tOkeh\t6590\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU027961.mp3\tErskine Hawkins & His Orchestra\tA Study In Blue\tBLUEBIRD\t10029\t027961\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu10029.mp3\tErskine Hawkins & His Orchestra\tA Study In Blue\tBluebird\t10029\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/PerA-1665.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tA Study In Blue\tPerception\tPLP35-2\tA-1665\t1949\t\nhttp://www.78-tours.net/mp3/VIC25653-B.mp3\tBunny Berigan And His Orchestra Featuring B. Berigan, S. Lipkins, I. Goodman, Trumptes-a. George, S.\tA Study In Brown\tVICTOR\t25653\t25653-B\t\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI10234.mp3\tSam Lanin And His Orchestra\tA Sun-kist Cottage In California - Foxtrot (gress & Olsen)\tEDISON\t\t10234\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480655.mp3\tTeddy Wilson & His Orch.\tA Sunbonnet Blue And A Little Straw Hat\tBrunswick\t7498\t17769-1\t1935\tBillie Holiday (vo), Roy Eldridge (tp), Ben Webster (ts), Teddy Wilson (p), John Trueheart (g), John Kirby (sb), Cozy Cole (dm)\nhttp://www.jazz-on-line.com/a/mp3a/COLCO37075.mp3\tClaude Thornhill And His Orchestra\tA Sunday Kind Of Love\tCOLUMBIA\t37219\tCO37075\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MER694-1.mp3\tFrankie Laine W Manny Klein\tA Sunday Kind Of Love\tMERCURY\t5018\t694-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73818.mp3\tElla Fitzgerald W Bob Haggart\tA Sunday Kind Of Love\tDECCA\t23866\t73818\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_175.mp3\tJo Stafford\tA Sunday Kind Of Love\tCapitol\t388\t1676\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_050.mp3\tTeresa Brewer\tA Sweet Old Fashioned Girl\tCoral\t61590\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu042756-1.mp3\tArtie Shaw And His Orchestra\tA Table In A Corner - V H F\tBluebird\tB-10468\t042756-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL26109.mp3\tJack Teagarden & His Orchestra\tA Table In The Corner\tCOLUMBIA\t35252\t26109\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_037.mp3\tTeresa Brewer\tA Tear Fell\tCoral\t61590\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_366.mp3\tKitty White\tA Teen Age Prayer\tDecca\t30028\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_226.mp3\tBilly Vaughn And His Orchestra\tA Theme From (the Three Penny Opera) 'moritat'\tDot\t15444\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_160.mp3\tLouis Armstrong And His All-stars\tA Theme From Threepenny Opera (mack The Knife)\tColumbia\t40587\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480816.mp3\tHurtado Brothers' Royal Marimba Band Of Guatemala\tA Thousand And One Nights\tVICTOR\t35565-A\t17482\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC01808.mp3\tFats Waller And His Rhythm\tA Thousand Dreams Of You\tVICTOR\t25490\t01808\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC1733-2.mp3\tRed Norvo & His Orchestra\tA Thousand Dreams Of You\tBRUNSWICK\t7815\tC1733-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC01807.mp3\tFats Waller And His Rhythm\tA Thousand Dreams Of You (vfw)\tVICTOR\t25483A\t01807\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC14953-1.mp3\tSleepy Hall Vocal Paul Small And His Orchestra\tA Thousand Good Nights\tARC\tBA33012\t14953-1\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VOC14995-1.mp3\tAdrian Rollini And His Orchestra\tA Thousand Good Nights\tVOCALION\t2672\t14995-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_064.mp3\tFreddy Martin And His Orchestra\tA Touch Of Texas\tRCA\t20-1504\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15122x.mp3\tMargaret Whiting\tA Tree In The Meadow\tCAPITOL\t15122\t15122x\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_008.mp3\tMargaret Whiting\tA Tree In The Meadow\tCAPITOL\t15122\t15122x\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_140.mp3\tJohn Laurenz\tA Tree In The Meadow\tMERCURY\t5148\t1754\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_178.mp3\tSam Browne Feat. Bert Thompson And His Orchestra\tA Tree In The Meadow\tLONDON\t123\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_158.mp3\tPaul Fennelly And His Orchestra Feat. Reggie Goff\tA Tree In The Meadow\tMGM\t10211\tSM6\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh095.mp3\tIvy Benson And Her All Girls Band\tA Tree In The Meadow (v Rita Williams)\tRegal Zonophone\tMR-3802\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478314.mp3\tAlec Templeton\tA Trip Through A Music Conservatory\tLIBERTY MUSIC SHOPS\t\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC76810.mp3\t''pops'' Concert Orchest\tA Trumpeter's Lullaby\tDECCA\t28300\t76810\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_419.mp3\tVic Damone Feat. O/richard Hayman\tA Village In Peru\tMERCURY\t70269\tYB10074\t1953\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480817.mp3\tCarmen Miranda And The Bando Da Lua\tA Week-end In Havana\tDECCA\t23239-A\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_143.mp3\tFrankie Laine\tA Woman In Love\tColumbia\t40583\tCO53842\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO53842.mp3\tFrankie Laine W P.faith Orchestra\tA Woman In Love\tCOLUMBIA\t40583\tCO53842\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_103.mp3\tFour Aces Featuring Al Alberts\tA Woman In Love\tDecca\t29725\t88779\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4984.mp3\tEvelyn Knight - Victor Young\tA Wonderful Guy\tDECCA\t24640\tL4984\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_224.mp3\tDinah Shore\tA Wonderful Guy\tCOLUMBIA\t38460\tHCO3646\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D128A2.mp3\tBing Crosby\tA Yank In A Tank\tV-DISC\t128A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC56737-6.mp3\tLeo Reisman & His Orchestra\tA Year From Today\tVICTOR\t22194\t56737-6\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/COL79339-1.mp3\tArt Hickman's Orchestra\tA Young Mans Fancy\tCOLUMBIA\tA-2970\t79339-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO623.mp3\tKay Kyser And His Orchestra\tA Zoot Suit\tCOLUMBIA\t36517\tHCO623\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/Cap3923.mp3\tJo Stafford And Gordon Macrae\tA'' You're Adorable\tCapitol\t15393\t3923\t\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAE2VB-8064.mp3\tRalph Flanagan And His Orchestra With Singing Winds\tA-l-b-u-q-u-e-r-q-u-e\tRCA VICTOR \t20-5237\tE2VB-8064\t1953\tvocal Ralph Flanagan\nhttp://www.jazz-on-line.com/a/mp3o/RCAE2VB-8064.mp3\tRalph Flanagan, Vocal, & His Orch  Singing Winds\tA-l-b-u-q-u-e-r-q-u-e\tRCA VICTOR\t20-5237\tE2VB-8064\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_148.mp3\tRalph Flanagan And His Orchestra Feat. The Singing Winds\tA-l-b-u-q-u-e-r-q-u-e\tRCA VICTOR\t20-5237\tE2VB-8064\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10046.mp3\tJo Stafford\tA-round The Corner\tCOLUMBIA\t39653\tHCO10046\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_072.mp3\tJo Stafford\tA-round The Corner\tCOLUMBIA\t39653\tHCO10046\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63693-A.mp3\tChick Webb And His Orchestra\tA-tisket, A Tasket\tDECCA\t1840A\t63693-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_225.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tA-tisket, A-tasket\tVICTOR\t25899\t019420\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_001.mp3\tElla Fitzgerald Feat. Chick Webb Orchestra\tA-tisket, A-tasket\tDECCA\t1840\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23308-1.mp3\tTeddy Wilson And His Orchestra\tA-tisket, A-tasket\tBrunswick\t8199\tB-23308-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM50S3116.mp3\tDebbie Reynolds-c.carpenter\tAba Daba Honeymoon\tMGM\t30282\t50S3116\t\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI3320.mp3\tCollins And Harlan\tAba Daba Honeymoon\tEDISON\t50192\t330\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_024.mp3\tDebbie Reynolds And Carlton Carpenter Feat. George Stoll And The Mgm Orchestra\tAba Daba Honeymoon\tMGM\t30282\t50S3116\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_322.mp3\tLarry Clinton And His Orchestra\tAbba Dabba (one Of The Arabian Knights)\tVICTOR\t25707A\t015840-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-333-1.mp3\tDjango Reinhardt Et Son Orchestre Fud Candrix Et Son Orchestre\tAbc\tSWING\t180\tOSW-333-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041531.mp3\tFats Waller And His Rhythm\tAbdullah\tBLUEBIRD\t10419\t041531\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D249A.mp3\tPat Flowers\tAbdullah\tV-DISC\t249\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2503-1.mp3\tGene Ammons & His Sextet\tAbdullah's Fiesta\tMERCURY\t8125\t2503-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057086.mp3\tFats Waller And His Rhythm\tAbercrombie Had A Zombie\tBLUEBIRD\t10967\t057086\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEWC2990.mp3\tBukka White\tAberdeen Mississippi Blues\tOKEH\t5743\tWC2990\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/FED5015-A.mp3\tHenry Burr\tAbide With Me\tFederal\t5015-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_102.mp3\tAlma Gluck And Louise Homer\tAbide With Me\tVictor\t87132\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU17317-1.mp3\tOzzie Nelson And His Orchestra\tAbout A Quarter To Nine\tBRUNSWICK\t7425\t17317-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU7425.mp3\tOzzie Nelson And His Orch\tAbout A Quarter To Nine\tBRUNSWICK\t7425\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17257-2.mp3\tWingy Manone & His Orchestra\tAbout A Quarter To Nine\tARC\tVO2934\t17257-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_067.mp3\tJohnny Green And His Orchestra\tAbout A Quarter To Nine\tARC\tCO3029D\t17208-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh043.mp3\tAmbrose And His Orchestra\tAbout A Quarter To Nine (v Jack Cooper)\tDecca\tF-5652\tTB-1864-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Blu045947-1.mp3\tDon Redman And His Orchestra\tAbout Rip Van Winkle\tBluebird\tB-10615\t045947-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D87B2.mp3\tCarol Bruce With Red Norvo\tAbraham\tv-disk\t87B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_007.mp3\tHarry Macdonough\tAbsence Makes The Heart Grow Fonder\tVICTOR\t16140\tB2245-5\t1901\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_075.mp3\tBernie Cummins And His Orchestra Feat. Paul Small\tAbsence Makes The Heart Grow Fonder (for Somebody Else)\tVICTOR\t22425A\t62148-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC62148-1.mp3\tBernie Cummins New Yorker Orch\tAbsence Makes The Heart Grow Fonder (vocal P S)\tVICTOR\t22425A\t62148-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiM33183-.mp3\tThe Dutch Swing College Band\tAbsent Minded Blues\tDecca\tM33183\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC071703.mp3\tArtie Shaw And His Orchestra\tAbsent Minded Moon\tVICTOR\t27779\t071703-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63219-A.mp3\tJabbo Smith And His Orchestra\tAbsolutely\tDecca\t1712\t63219-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/CBS26355.mp3\tBenny Goodman Sextet\tAc Dc Current\tCBS\t(Reject)\t26355\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-116-1.mp3\tBenny Carter And His Orchestra\tAccent On Swing\tVocalion\tS-14\tS-116-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17976.mp3\tDuke Ellington's Famous Orchestra\tAccent On Youth\tBRUNSWICK\t7514\t17976\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_088.mp3\tDuke Ellington And His Famous Orchestra\tAccent On Youth\tBRUNSWICK\t7514\t17976\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD4VB1052.mp3\tArtie Shaw And His Orchestra\tAccentuate The Positive\tRCA\t20-1612\tD4VB1052\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN16921.mp3\tAlice Faye\tAccording To The Moonlight\tBANNER\t33379\t16921\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE32613.mp3\tDuke Ellington & His Orchestra\tAccordion Joe\tBRUNSWICK\t6846\tE32613\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE19630.mp3\tAbe Lyman's California Orchestra\tAce In The Hole\tBRUNSWICK\t3241\tE19630\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/SIG377.mp3\tAnita O'day W Alvy West Band\tAce In The Hole\tSIGNATURE\t15127A\t377\t\t\nhttp://www.jazz-on-line.com/a/mp3w/HAR142197-2-3.mp3\tUniversity Six\tAce In The Hole\tHARMONY\t209-H\t142197-2-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3027-B.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tAce Of Rhythm\tBrunswick\t7071\tC-3027-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62595.mp3\tWillie Smith & His Cubs\tAchin'-hearted Blues\tDECCA\t1503\t62595\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC73811.mp3\tMills Brothers\tAcross The Alley From The Alamo\tDECCA\t23863\t73811\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_028.mp3\tMills Brothers\tAcross The Alley From The Alamo\tDECCA\t23863\t73811\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC053579.mp3\tDuke Ellington & His Orchestra\tAcross The Track Blues\tVICTOR\t27235B\t053579\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC27235B.mp3\tDuke Ellington & His Famous Orchestra\tAcross The Track Blues\tVICTOR\t27235B\t053579\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-973-1.mp3\tCab Calloway And His Orchestra\tAd-de-dey\tVocalion\t4700\tM-973-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480400.mp3\tArt Farmer\tAd-dis-un\tNewJazz\tLP8203\t1022\t1953\tArt Farmer, T, FLH, Hank Mobley, Ts, Kenny Drew, P, Addison Farmer, B, Elvin Jones, D\nhttp://www.jazz-on-line.com/a/mp3t/TS480796.mp3\tArt Farmer\tAd-dis-un\tNew Jazz\tLP 8203\t1022\t1953\tArt Farmer, T, FLH, Hank Mobley, Ts, Kenny Drew, P, Addison Farmer, B, Elvin Jones,\nhttp://www.jazz-on-line.com/a/mp3c/DECL4290.mp3\tLionel Hampton & His Orchestra\tAdam Blew His Hat\tDECCA\t24015\tL4290\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-4290-A.mp3\tLionel Hampton And His Orchestra\tAdam Blew His Hat\tDecca\t24015\tL-4290-A\t1946\tLionel Hampton vib dir. Joe Wilder Richard ''Duke'' Garrette Leo Sheppard  Joe Morris Wendell Culley Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb Johnny Griffin ts, Charlie fowlkes bar\nhttp://www.jazz-on-line.com/a/mp3c/PARP2603-1.mp3\tJimmy Blythe's Ragamuffins\tAdam's Apple\tPARAMOUNT\t12376\tP2603-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400183-B.mp3\tEddy Lang\tAdd A Little Wiggle\tOKeh\t41134\t400183-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66120.mp3\tInk Spots\tAddress Unknown\tDECCA\t2707A\t66120\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_021.mp3\tInk Spots\tAddress Unknown\tDECCA\t2707A\t66120\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA3025.mp3\tBing Crosby - J.s.trotter Orchestra\tAdeste Fidelis\tDECCA\t18510B\tDLA3025\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/WhiB2078-A.mp3\tBing Crosby\tAdeste Fidelis - Lift Up Your Hearts - Stabat Mater\tWhite Label\t\tB2078-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU064474.mp3\tGlenn Miller & His Orchestra\tAdios\tBLUEBIRD\t11219\t064474\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2752.mp3\tStan Kenton & His Orchestra\tAdios\tDECCA\t4038A\tDLA2752\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_203.mp3\tGlenn Miller And His Orchestra\tAdios\tBluebird\t11219B\t64474\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_115.mp3\tGisele Mackenzie\tAdios\tCapitol\t2156\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_150.mp3\tArtie Shaw And His Orchestra\tAdios Marquita Linda\tVICTOR\t26542A\t042547\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D158B.mp3\tArtie Shaw And His Orchestra\tAdios, Mariquita Linda\tV-DISC\t158B\t042547-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D148B.mp3\tArtie Shaw And His Orchestra\tAdios, Mariquita Linda\tV-DISC\t148B\t042547-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic042547-1.mp3\tArtie Shaw And His Orchestra\tAdios, Mariquita Linda\tVictor\t26542\t042547-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE32449.mp3\tJungle Band\tAdmiration\tBRUNSWICK\t4776\tE32449\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17409.mp3\tDuke Ellington's Orchestra\tAdmiration\tBRUNSWICK\t7440\t17409\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_208.mp3\tFontane Sisters\tAdorable\tDot\t15428\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC30366-8.mp3\tPaul Whiteman & His Orchestra\tAdoring You\tVICTOR\t19429A\t30366-8\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_219.mp3\tEmil Dewan Quartones\tAeluna Mezzumare (butcher Boy)\tMERCURY\t5537\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-971-1.mp3\tCab Calloway And His Orchestra\tAfraid Of Love\tVocalion\t4905\tM-971-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS21423.mp3\tArtie Shaw And His New Music\tAfraid To Dream\tCBS\tBR7934\tB-21423-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09578-2.mp3\tBenny Goodman And His Orchestra\tAfraid To Dream\tVICTOR\t25627A\t09578-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCLA1377.mp3\tLouis Prima New Orleans Gang\tAfraid To Dream\tVOCALION\t3628\tLA1377\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25627.mp3\tBenny Goodman & His Orchestra\tAfraid To Dream\tVictor\t25627\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_095.mp3\tBenny Goodman And His Orchestra Feat. Betty Van\tAfraid To Dream\tVICTOR\t25627\t09578-2\t1937\tHarry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Murray McEachern (tb), Benny Goodman (cl), Hymie Schertzer, George Koenig (as), Arthur Rollini, Vido Musso (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1941_261.mp3\tCharlie Barnet And His Orchestra Feat. Bob Carroll\tAfraid To Say ''hello''\tBluebird\t11051\t60363\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30601-1.mp3\tGene Krupa & His Orchestra\tAfraid To Say Hello\tOKEH\t6255\t30601-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu60363.mp3\tCharlie Barnet & His Orchestra\tAfraid To Say Hello\tBluebird\t11051\t60363\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC40821-2.mp3\tRichard M Jones Jazz Wizards\tAfrican Hunch\tVICTOR\t21345\t40821-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-16721-1.mp3\tMills Blue Rhythm Band\tAfrican Lullaby\tColumbia\t3038-D\tCO-16721-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic86208-2.mp3\t\"fats Waller\tAfrican Ripples\tVictor\t24830\t86208-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC055287.mp3\tDuke Ellington & His Orchestra\tAfter All\tVICTOR\t27434\t055287\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC040981.mp3\tTommy Dorsey & His Orchestra\tAfter All\tVICTOR\t26418\t040981\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_254.mp3\tTommy Dorsey And His Orchestra Feat. V/jack Leonard\tAfter All\tVICTOR\t26418\t040981\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU040478.mp3\tEarl Hines & His Orchestra\tAfter All I've Been To You\tBLUEBIRD\t10467\t040478\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26463.mp3\tMildred Bailey\tAfter All I've Been To You\tCOLUMBIA\t35409\t26463\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic64609-2.mp3\tMckinney's Cotton Pickers\tAfter All, You're All I'm After\tVictor\t23024\t64609-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4841.mp3\tBig Three Trio\tAfter Awhile\tCOLUMBIA\t37983\tCCO4841\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/COL27690-1.mp3\tBud Freeman And His Famous Chicagoans\tAfter Awhile\tCOLUMBIA\t35856\t27690-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS22769-2.mp3\tRed Norvo & His Orchestra\tAfter Dinner Speech (v M. Bailey)\tCBS\tBR8171\t22769-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MANS1284.mp3\tLuis Russell & His Orchestra\tAfter Hour Creep\tMANOR\t1022\tS1284\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU051264-1.mp3\tErskine Hawkins And His Orchestra\tAfter Hours\tBLUEBIRD\t10879\t051264-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4502.mp3\tSarah Vaughan\tAfter Hours\tCOLUMBIA\t39494\tHCO4502\t\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP1997.mp3\tBenny Goodman Trio\tAfter Hours\tCAPITOL\t\t1997\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480401.mp3\tBenny Goodman Trio\tAfter Hours\tCapitol\t15886\t1997-4\t1947\tBenny Goodman, cl, Teddy Wilson, p, Jimmy Crawford, d\nhttp://www.jazz-on-line.com/a/mp3c/DECC91837.mp3\tElla Fitzgerald & Her Orchestra\tAfter I Say I'm Sorry\tDECCA\t2826B\tC91837\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17821-2-3.mp3\tAbe Lyman's California Orchestra\tAfter I Say I'm Sorry\tBRUNSWICK\t3069\t17821-2-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC34368-2.mp3\tJean Goldkette & His Orchestra\tAfter I Say I'm Sorry\tVICTOR\t19947B\t34368-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC2358-2.mp3\tGene Krupa And His Orchestra\tAfter Looking At You\tBRUNSWICK\t8249\tC2358-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL601.mp3\tJoe Turner\tAfter My Laughter Came Tears\tATLANTIC\t939\t601\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_126.mp3\tCliff Edwards\tAfter My Laughter Came Tears\tCOLUMBIA\t1254 D\tW145458-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_480.mp3\tTommy Charles\tAfter School\tDecca\t29946\t89795\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67319.mp3\tLouis Jordan & His Tympani 5\tAfter School Swing Session\tDECCA\t7729\t67319\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC14344-1-2.mp3\tRichard Himber's Orch (vjn)\tAfter Sundown\tARC\tVO2588\t14344-1-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU2924B.mp3\tVernon Dalhart\tAfter The Ball\tBRUNSWICK\t2924-B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_066.mp3\tAl Hibbler\tAfter The Lights Go Down Low\tDecca\t29982\t89484\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69400.mp3\tPat Flowers\tAfter The Sun Goes Down\tDECCA\t8587\t69400\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEDAL1032.mp3\tChuck Wagon Gang\tAfter The Sunrise\tOKEH\t5682\tDAL1032\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI80748-R.mp3\tBetsy Lane Shepherd\tAfter Toiling Cometh Rest\tEdison\t80748-R\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU12324-1.mp3\tCasa Loma Orchestra\tAfter Tonight\tBRUNSWICK\t6397\t12324-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0125_03.mp3\tLee Morse And Her Bluegrass Boys\tAfter We Kiss\tColumbia\t1328DA\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011352.mp3\tTommy Dorsey & His Clambake 7\tAfter You\tVICTOR\t25647\t011352\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP1280.mp3\tStan Kenton & His Orch.\tAfter You\tCAPITOL\t\t1280\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_014.mp3\tVan And Schenck\tAfter You Get What You Want, You Don't Want It\tCOLUMBIA\tA-2966\t79129-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/ARCB12693A-A.mp3\tEddy Duchin And His Orchestra\tAfter You Who\tARC\tBR6445\tB12693A-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP4009Y.mp3\tArt Van Damme Quintet\tAfter You've Gone\tCAPITOL\t\t4009Y\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143567-2.mp3\tBessie Smith\tAfter You've Gone\tCOLUMBIA\t14197 D\tW143567-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO33817-3.mp3\tBenny Goodman Sextet\tAfter You've Gone\tCOLUMBIA\t36781\tCO33817-3\t1945\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25467.mp3\tTommy Dorsey & His Orchestra\tAfter You've Gone\tVictor\t25467\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE80716-B.mp3\tSophie Tucker W Miff Mole\tAfter You've Gone\tOKEH\t40837\t80716-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe403454-B.mp3\tLouis Armstrong And His Orchestra\tAfter You've Gone\tOKeh\t41350\t403454-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22160-4.mp3\tMarion Harris\tAfter You've Gone\tVICTOR\t18509\t22160-4\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC92704-2.mp3\tBenny Goodman Trio\tAfter You've Gone\tVICTOR\t25115-B\t92704-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09684.mp3\tLionel Hampton And His Orchestra\tAfter You've Gone\tVICTOR\t25674\t09684-1\t1937\t Ziggy Elman (tp), Vido Musso (cl, ts), Arthur Rollini (ts), Jess Stacy (p), Allen Reuss (g), Johnny Miller (sb), Lionel Hampton (vo, dm)\nhttp://www.jazz-on-line.com/a/mp3c/VICOLA1060.mp3\tQuintet Of Hot Club Of France\tAfter You've Gone\tVICTOR\t25511\tOLA1060\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72298.mp3\tRoy Eldridge & His Orchestra\tAfter You've Gone\tDECCA\t24417\t72298\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DECAM149.mp3\tColeman Hawkins & Ramblers\tAfter You've Gone\tDECCA\t500F\tAM149\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1239.mp3\tJohnny Dodds Black Bottom St.\tAfter You've Gone\tVOCALION\t1148\tC1239\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D83.mp3\tNew Orleans Feetwarmers\tAfter You've Gone\tV-DISC\t270B\t83\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/COL77800.mp3\tAl Campbell & Henry Burr\tAfter You've Gone\tCOLUMBIA\tA-2582\t77800\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP6846.mp3\tTeddy Wilson\tAfter You've Gone\tCOLUMBIA\t39432\tZSP6846\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1924.mp3\tWillie Lewis & Negro Band\tAfter You've Gone\tVARSITY\tEL4080s\t1924\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31924.mp3\tRed Nichols & His 5 Pennies\tAfter You've Gone\tBRUNSWICK\t6833\tE31924\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D050AYG.mp3\tSidney Bechet\tAfter You've Gone\tV-DISC\t050\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC02163-1.mp3\tTommy Dorsey & His Orchestra\tAfter You've Gone\tVICTOR\t25467\t02163-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30605.mp3\tGene Krupa & His Orchestra\tAfter You've Gone\tOKEH\t6278\t30605\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/Har150470-3.mp3\tJulie Wintz And His Orchestra\tAfter You've Gone\tHarmony\t1169-H\t150470-3\t\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1060-1.mp3\tDjango Reinhardt\tAfter You've Gone\tGramophone\tK-7707\tOLA-1060-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC57234-3.mp3\tCoon-sanders Orchestra\tAfter You've Gone\tVICTOR\t22342\t57234-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC73279.mp3\tBing Crosby / Eddy Condon\tAfter You've Gone\tDECCA\t24114\t73279\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW149159-3.mp3\tPaul Whiteman And His Orchestra (vocal Bing Crosby)\tAfter You've Gone\tColumbia\tE 5702\tW149159-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_007.mp3\tMarion Harris\tAfter You've Gone\tVICTOR\t18509\t22160-4\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_279.mp3\tBenny Goodman Trio\tAfter You've Gone\tVICTOR\t25115-B\t92704-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_082.mp3\tBessie Smith\tAfter You've Gone\tCOLUMBIA\t14197 D\tW143567-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_179.mp3\tLouis Armstrong\tAfter You've Gone\tCOLUMBIA\t2727 D\t403454\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic59721-1.mp3\tThomas Waller - Bennie Paine\tAfter You've Gone\tVictor\t22371\t59721-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_017.mp3\tHenry Burr And Albert Campbell\tAfter You've Gone\tColumbia\t2582\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic09684-1.mp3\tLionel Hampton And His Orchestra\tAfter You've Gone\tVictor\t25674\t09684-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Cro1230-2.mp3\tFletcher Henderson And His Orchestra\tAfter You've Gone\tCrown\t3093\t1230-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480753.mp3\tJames P. Johnson's Blue Note Jazz Men\tAfter You've Gone\tBlue Note\t33\tBN953-2\t1944\tSidney De Paris (tp), Vic Dickenson (tb), Ben Webster (ts), James P. Johnson (p), Jimmy Shirley (g), John Simmons (sb), Sid Catlett (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1937_106.mp3\tLionel Hampton And His Orchestra\tAfter You've Gone\tVICTOR\t25674\t09684\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh145.mp3\tJack Hylton And His Orchestra\tAfter You, Who (v Pat Omalley)\tDecca\tF-3698\tGB-6202-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/JAZBN953.mp3\tJames P. Johnson And His Blue Note Jazzmen\tAfter Youv'e Gone\tJAZZ SELECTION\tJ.S. 547\tBN953\t\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC62682-2.mp3\tHenny Hendrickson's Louisville Serenaders\tAfter Yoy've Gone\tVICTOR\t\t62682-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102377.mp3\tWingy Manone & His Orchestra\tAfterglow\tBLUEBIRD\t6483\t102377\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM644.mp3\tBuster Bailey Rhythm Busters\tAfternoon In Africa\tVOCALION\t3846\tM644\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35421.mp3\tCab Calloway & His Orchestra\tAfternoon Moon\tCOLUMBIA\t36993\tCO35421\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MERHL3.mp3\tLester Young Qt\tAfternoon Of A Basie-ite\tMERCURY\t1093\tHL3\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC064661.mp3\tJan Savitt's Tophatters\tAfternoon Of A Faun\tVICTOR\t27594\t064661\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC064662.mp3\tJan Savitt's Tophatters\tAfternoon Of A Faun\tVICTOR\t27594\t064662\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15428x.mp3\tMel Torme\tAgain\tCAPITOL\t15428\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO3667.mp3\tDoris Day\tAgain\tCOLUMBIA\t38467\tHCO3667\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4904.mp3\tGordon Jenkins\tAgain\tDECCA\t24602\tL4904\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM49S114.mp3\tArt Mooney And His Orchestra\tAgain\tMGM\t10398\t49S114\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_034.mp3\tMel Torme\tAgain\tCapitol\t15428\t3412\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_067.mp3\tArt Mooney And His Orchestra\tAgain\tMGM\t10398\t49S114\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_232.mp3\tVera Lynn\tAgain\tLONDON\t310\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_059.mp3\tVic Damone Feat. Glenn Osser's Orchestra\tAgain\tMERCURY\t5261\t2513-7\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_021.mp3\tDoris Day Feat. John Rarig's Orchestra\tAgain\tCOLUMBIA\t38467\tHCO3667\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_061.mp3\tTommy Dorsey And His Orchestra\tAgain\tVICTOR\t3427\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/MER2513-7.mp3\tVic Damone; Glenn Osser's Orchestra\tAgain. (from Road House)\tMERCURY\t5261\t2513-7\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU034812.mp3\tBill 'jazz' Gillum\tAgainst My Will\tBLUEBIRD\t8189\t034812\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80949-3.mp3\tBessie Smith\tAggravatin' Papa\tCOLUMBIA\tA-3877\t80949-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3l/Col80808-1.mp3\tThe Georgians\tAggravatin' Papa\tColumbia\tA-3825\t80808-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/OKeS71353-B.mp3\tSophie Tucker\tAggravatin' Papa\tOKeh\t4817\tS71353-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_122.mp3\tSophie Tucker\tAggravatin' Papa\tOKeh\t4817\tS71353-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_142.mp3\tBessie Smith\tAggravatin' Papa\tCOLUMBIA\tA-3877\t80949-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_026.mp3\tMarion Harris\tAggravatin' Papa\tBRUNSWICK\t2345\t9009\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62007.mp3\tCaresser And Gerald Clark\tAh Gertie\tDECCA\t17328B\t62007\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVB901-2.mp3\tCharlie Parker's Allstars\tAh Leu Cha\tSAVOY\t939\tB901-2\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC90074.mp3\tJeanette Mcdonald\tAh Sweet Mystery Of Life\tVICTOR\t24896\t90074\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC2984Ax.mp3\tAmbrose\tAh Sweet Mystery Of Life\tDECCA\t2984A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC77503-1.mp3\tPaul Whiteman Presents Ramona\tAh The Moon Is Here\tVICTOR\t24408\t77503-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC8760.mp3\tHal Kemp And His Orchestra\tAh! But I've Learned !\tBRUNSWICK\t6416\tC8760\t1932\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW145982-3.mp3\tLeo Reisman & His Orchestra\tAh! Sweet Mystery Of Life\tCOLUMBIA\t1377 D\tW145982-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_078.mp3\tNelson Eddy W. Nathaniel Shilkret Orchestra And Male Chorus\tAh! Sweet Mystery Of Life\tVictor Red\t4281\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480368.mp3\tAhmad Jamal Trio\tAhmad's Blues\tArgo\t5328\t9023\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3d/Vic037616-1.mp3\tLionel Hampton And His Orchestra\tAin't Cha Comin' Home\tVictor\t26362\t037616-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037616.mp3\tLionel Hampton & His Orchestra\tAin't Cha Comin' Home?\tVICTOR\t26362\t037616\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon037676.mp3\tGlenn Miller & His Orchestra\tAin't Cha Comin' Out?\tMontgomeryWard\t8367\t037676\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_077.mp3\tBenny Goodman And His Orchestra Feat. Jack Teagarden\tAin't Cha Glad?\tCOLUMBIA\t2835\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/MUSGM509K.mp3\tLeadbelly\tAin't Goin' Down To The Well No Mo-go Down Old Han\tMUSICRAFT\t224\tGM509K\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap172-A.mp3\tCapitol Jazzmen With Barney Bigard\tAin't Goin' No Place\tCapitol\t\t172-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP172-A.mp3\tCapitol Jazzmen\tAin't Goin' No Place (v P. Lee)\tCAPITOL\t\t172-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COMP23991.mp3\tJess Stacy\tAin't Goin' Nowhere\tCOMMODORE\t517\tP23991\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/WES120y.mp3\tLu Watters Yerba Buena Jazz Ban\tAin't Gonna Give\tWest Coast\t120\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA3031.mp3\tBing Crosby - J.s.trotter Orchestra\tAin't Got A Dime To My Name\tDECCA\t18514B\tDLA3031\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP990.mp3\tCootie Williams & His Orchestra\tAin't Got No Blues Today\tCAPITOL\t\t990\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BANE37265-A.mp3\tCab Calloway & His Orchestra\tAin't Got No Gal In This Town\tBANNER\t32673\tE37265-A\t\t\nhttp://www.jazz-on-line.com/a/mp3b/GenX-99-B.mp3\tCaroline Johnson\tAin't Got Nobody To Grind My Coffee\tGennett\t3307\tX-99-B\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic036965-2.mp3\tDon Redman And His Orchestra\tAin't I Good To You?\tVictor\t26266\t036965-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/GENX-278-A.mp3\tJohnny Clesi's Orchestra\tAin't I Got Rosie?\tGENNETT\t6061\tX-278-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-12445-A.mp3\tDon Redman And His Orchestra\tAin't I The Lucky One?\tBrunswick\t6401\tB-12445-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC17867-1.mp3\tBlind Boy Fuller\tAin't It A Crying Shame\tARC\tVO2964z\t17867-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10969.mp3\tFrankie Laine\tAin't It A Pity And A Shame\tCOLUMBIA\t40600\tRHCO10969\t\t\nhttp://www.jazz-on-line.com/a/mp3c/IMP0853AIS.mp3\tFats Domino\tAin't It A Shame\tIMPERIAL\t0853\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC39335-A.mp3\tCasa Loma Orchestra\tAin't It Just Too Bad?\tDECCA\t375A\t39335-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO893.mp3\tCount Basie & His Orchestra\tAin't It The Truth\tCOLUMBIA\t36845\tHCO893\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE30094.mp3\tAbe Lyman And His Californians\tAin't Misbehavin'\tBRUNSWICK\t4443\tE30094\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22047-B.mp3\tLeo Reisman And His Orchestra\tAin't Misbehavin'\tVICTOR\t22047\t53498-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49492-3.mp3\tFats Waller (piano)\tAin't Misbehavin'\tVICTOR\t22108\t49492-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC053433-1.mp3\tSidney Bechet New Orleans F.w.\tAin't Misbehavin'\tVICTOR\t26746\t053433-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43825.mp3\tSarah Vaughan\tAin't Misbehavin'\tCOLUMBIA\t38896\tCO43825\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148905.mp3\tRuth Etting\tAin't Misbehavin'\tCOLUMBIA\t1958\tW148905\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28960.mp3\tHorace Henderson's Orchestra\tAin't Misbehavin'\tOKEH\t5900\t28960\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402534-B.mp3\tLouis Armstrong & His Orchestra\tAin't Misbehavin'\tOKeh\t41276\t402534-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1408-C.mp3\tTeddy Wilson's Qt\tAin't Misbehavin'\tBRUNSWICK\t7964\tLA1408-C\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUOEA6384.mp3\tFats Waller And His Rhythm\tAin't Misbehavin'\tBLUEBIRD\t10288\tOEA6384\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE30526.mp3\tBill Robinson & Mills Gang\tAin't Misbehavin'\tBRUNSWICK\t4535\tE30526\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19115-2.mp3\tFrankie Trumbauer's Orchestra\tAin't Misbehavin'\tBRUNSWICK\t7665\t19115-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC3898.mp3\tJimmie Noone Apex Club Orchestra\tAin't Misbehavin'\tVOCALION\t15819\tC3898\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP5429.mp3\tHerman Chittison Trio\tAin't Misbehavin'\tCOLUMBIA\t39397\tZSP5429\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT394.mp3\tPat Flowers Trio\tAin't Misbehavin'\tMAJESTIC\t1010B\tT394\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB3808.mp3\tGene Krupa & His Orchestra\tAin't Misbehavin'\tRCA\t20-3734\tE0VB3808\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72314.mp3\tJames Pete Johnson\tAin't Misbehavin'\tDECCA\t23595\t72314\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC53968-3.mp3\tGene Austin & Victor Orch.\tAin't Misbehavin'\tVICTOR\t22068\t53968-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/DECGB6040.mp3\tDuke Ellington & His Orch.\tAin't Misbehavin'\tDECCA\t3516B\tGB6040\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE30424.mp3\tCootie Williams Rug Cutters\tAin't Misbehavin'\tOKEH\t6224\t30424\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_198.mp3\tRuth Etting\tAin't Misbehavin'\tCOLUMBIA\t1958\tW148905\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_206alt.mp3\tFats Waller\tAin't Misbehavin'\tV-DISC\t 32A\tVP154\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_072.mp3\tLouis Armstrong Feat. Robinson, Strong, And Singleton\tAin't Misbehavin'\tOKeh\t8714\t402534-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_105.mp3\tGene Austin Feat. O/leonard Joy\tAin't Misbehavin'\tVICTOR\t22068\t53968-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic49492-3.mp3\tThomas Waller\tAin't Misbehavin'\tVictor\t22092\t49492-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/OKE28960-1.mp3\tHorace Henderson And His Orchestra\tAin't Misbehavin'\tOKEH\t5900\t28960-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/JazB-13134-A.mp3\tClaude Hopkins And His Orchestra\tAin't Misbehavin'\tJazz Archives\t4\tB-13134-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/Col152667-2.mp3\tClaude Hopkins And His Orchestra\tAin't Misbehavin'\tColumbia\t2880-D\t152667-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480613.mp3\tArt Tatum\tAin't Misbehavin'\tClef\tEP-C-360\t1478-1\t1953\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3c/COLW152667.mp3\tClaude Hopkins & His Orchestra\tAin't Misbehavin' (v O. Roberson)\tCOLUMBIA\t2880 D\tW152667\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/HMWOLA-1708-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tAin't Misbehaving\tHMW\tB-8690\tOLA-1708-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/BLU14296.mp3\tBoots And His Buddies\tAin't Misbehaving\tBLUEBIRD\t7241\t14296\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC81147.mp3\tSy Oliver & His Orch.\tAin't No Chicken Gonna Fool Me\tDECCA\t27672\t81147\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-37265-A.mp3\tCab Calloway And His Orchestra\tAin't No Gal In This Town\tBrunswick\t6214\tE-37265-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe401471-A.mp3\tMississippi John Hurt\tAin't No Tellin'\tOKeh\t8759\t401471-A\t1928\t\nhttp://www.jazz-on-line.com/mp3/449484348.mp3\tLouis Jordan Tympany Five\tAin't Nobody\tDECCA\t23741\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_237.mp3\tKay Starr And Tennessee Ernie Ford\tAin't Nobody's Business But My Own\tCapitol\t1124\t6169\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75147.mp3\tBillie Holiday\tAin't Nobody's Business If I Do\tDECCA\t24726\t75147\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU38171-3.mp3\tGene Austin And His Orchestra\tAin't She Sweet\tBLUEBIRD\t7751\t38171-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBel491-B.mp3\tHoney Duke & His Uke\tAin't She Sweet\tBell\t491-B\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24352.mp3\tJimmie Lunceford & His Orchestra\tAin't She Sweet\tCBS\tCO38097\t24352\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4534.mp3\tErroll Garner Trio\tAin't She Sweet\tCOLUMBIA\t39681\tHCO4534\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC043927.mp3\tBunny Berigan & His Orchestra\tAin't She Sweet\tVICTOR\t26753A\t043927\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24352-A.mp3\tJimmie Lunceford And His Orchestra\tAin't She Sweet\tOkeh\t4875\t24352-A\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3b/HARCO40906.mp3\tPearl Bailey & Hot Lips Page\tAin't She Sweet?\tHARMONY\tHa1054\tCO40906\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_0317_03.mp3\tLee Morse And Her Bluegrass Boys\tAin't She Sweet?\tColumbia\t939DA\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_007.mp3\tBen Bernie And His Orchestra Feat. Scrappy Lambent And Billy Hillpot\tAin't She Sweet?\tBRUNSWICK\t3444\t21355-6\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_045.mp3\tGene Austin Feat. Nat Shilkret And His Orchestra\tAin't She Sweet?\tVICTOR\t7751\t38171-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU21355-6.mp3\tBen Bernie & His Orchestra\tAin't She Sweet? (vsl-bh)\tBRUNSWICK\t3444\t21355-6\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW144333-2.mp3\tPaul Ash And His Orchestra\tAin't That A Grand And Glorious Feeling?\tCOLUMBIA\t1066 D\tW144333-2\t1927\tDanny Polo, clarinet, alto & baritone saxes, Hank Winston, v Paul Small. Chicago, June 15th 1927\nhttp://www.jazz-on-line.com/a/mp3l/HAR144265-2.mp3\tUniversity Six\tAin't That A Grand And Glorious Feeling?\tHARMONY\t444-H\t144265-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73338.mp3\tRoy Eldridge & His Orchestra\tAin't That A Shame\tDECCA\t23532\t73338\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_075.mp3\tFats Domino\tAin't That A Shame\tImperial\t5348 A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_014.mp3\tPat Boone\tAin't That A Shame\tDot\t15377\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/MER482-2.mp3\tFrankie Laine\tAin't That Just Like A Woman\tMERCURY\t5003A\t482-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23669AT.mp3\tLouis Jordan\tAin't That Just Like A Woman\tDECCA\t23669\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD6VB2481.mp3\tPat Flowers & His Rhythm\tAin't That Just Like A Woman\tRCA\t20-1980\tD6VB2481\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCSA2880.mp3\tNite Owls\tAin't That Too Bad\tVOCALION\t4118\tSA2880\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0800_03.mp3\tLee Morse\tAin't That Too Bad\tPathe\t25205A\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh044.mp3\tCarroll Gibbons Savoy Orpheans\tAin't That Too Bad ?\tHMV\tB-5342\tBb-11136-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89047.mp3\tAnita O'day\tAin't This A Wonderful Day\tMERCURY\t89047\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79806-3.mp3\tVan And Schenck\tAin't We Got Fun\tCOLUMBIA\tA-3412\t79806-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-3412.mp3\tVan And Schenck\tAin't We Got Fun\tCOLUMBIA\tA-3412\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC25150-4.mp3\tBenson Orchestra Of Chicago\tAin't We Got Fun\tVICTOR\t18757\t25150-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_143.mp3\tBilly Jones\tAin't We Got Fun?\tOKeh\t4325\tS7867-B\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_106.mp3\tBenson Orchestra Of Chicago\tAin't We Got Fun?\tVICTOR\t18757\t25150-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_012.mp3\tVan And Schenck\tAin't We Got Fun?\tCOLUMBIA\tA-3412\t79806-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3e/COL265165-2.mp3\tBenny Goodman & His Orchestra\tAin't-cha! Glad?\tCOLUMBIA\t2835 D\t265165-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC57126-4.mp3\tHelen Kane\tAin'tcha\tVICTOR\t22192\t57126-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC614-1.mp3\tHal Kemp And His Orch (vse)\tAin'tcha Glad ? (vse)\tBRUNSWICK\t6656\tC614-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban13617-1.mp3\tHerny ''red'' Allen And His New York Orchestra\tAin'tcha Got Music\tBanner\t32840\t13617-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42747.mp3\tTed Daffan's Texans\tAint Got No Name Rag\tCOLUMBIA\t20707\tCO42747\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12445-A.mp3\tDon Redman & His Orchestra\tAint I The Lucky One\tBRUNSWICK\t6401\t12445-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS25373.mp3\tMildred Bailey - Alec Wilder 8\tAint That Good News\tCBS\t(Reject)\t25373\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO29943.mp3\tBenny Goodman Sextet\tAir Mail Special\tCOLUMBIA\t36720\tCO29943\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82075.mp3\tElla Fitzgerald\tAir Mail Special\tDECCA\t28126\t82075\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D701AMS.mp3\tJimmy Mundy & His Orchestra\tAir Mail Special\tV-DISC\t701\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_295.mp3\tBenny Goodman And His Orchestra\tAir Mail Special\tCOLUMBIA\t36254\tCO30421-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18880A.mp3\tLionel Hampton\tAir Mail Special Part 1\tDECCA\t18880A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC18880B.mp3\tLionel Hampton\tAir Mail Special Part 2\tDECCA\t18880B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73333-A.mp3\tLionel Hampton And His Orchestra\tAir Mail Special: Concluded\tDecca\t18880\t73333-A\t1946\tLionel Hampton vib dir. Joe Morris  Dave Page Wendell CulleyLamar Wright Jr.  Jimmy Nottingham t, Jimmy Wormick Michael ''Booty'' Wood  Andrew Penn  Al Haysetb, Bobby Plater Ben Kynard as, Arnett Cobb Johnny Griffin ts, Charlie Fowlkes bar, Milt Buckne\nhttp://www.jazz-on-line.com/a/mp3d/Dec73333-A.mp3\tLionel Hampton And His Orchestra\tAir Mail Special: Part 1\tDecca\t18880\t73333-A\t1946\tLionel Hampton vib dir. Joe Morris  Dave Page Wendell CulleyLamar Wright Jr.  Jimmy Nottingham t, Jimmy Wormick Michael ''Booty'' Wood  Andrew Penn  Al Haysetb, Bobby Plater Ben Kynard as, Arnett Cobb Johnny Griffin ts, Charlie Fowlkes bar, Milt Buckne\nhttp://www.jazz-on-line.com/a/mp3h/RCA20-2061-A.mp3\tJohn B. Sebastian, Sr.\tAir On The G-string\tRCA VICTOR\t20-2061-A\t\t1948\tharmonica; Russ Case And His Orchestra\nhttp://www.jazz-on-line.com/a/mp3t/TS480614.mp3\tArt Pepper Plus Eleven\tAiregin\tContemporary\tM3568\t\t1959\tPete Candoli, Jack Sheldon (tp), Dick Nash (tb), Bob Ebevoldsen (ts, vtb), Vince DeRosa (fhr), Art Pepper, Herb Geller (as), Bill Perkins (ts), Med Flory (bar), Russ Freeman (p), Joe Mondragon (sb), Mel Lewis (dm), Marty Paich (arr, cond)\nhttp://www.jazz-on-line.com/a/mp3d/Lio51-S-160.mp3\tLionel Hampton And His Orchestra\tAirmail Special\tLion\tL70064\t51-S-160\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62482.mp3\tSleepy John Estes\tAirplane Blues\tDECCA\t7354\t62482\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DISD421.mp3\tHelen Humes\tAirplane Blues\tDISC\t535\tD421\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-25-1.mp3\tAlix Combelle's Hot Four\tAl's Idea\tSwing\t24\tOSW-25-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB6571-2.mp3\tArthur Collins-byron Harlan\tAlabam (from 'broken Idols')\tVICTOR\t16515\tB6571-2\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_037.mp3\tArthur Collins And Byron Harlan\tAlabam'\tColumbia\t605\t3955\t1909\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol14012-D.mp3\tGulf Coast Quartet\tAlabama Blues\tColumbia\t14012-D\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COL140373-2.mp3\tBlossom Seeley\tAlabama Bound\tCOLUMBIA\t304D\t140373-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73265.mp3\tAndy Kirk\tAlabama Bound\tDECCA\t48073\t73265\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73265.mp3\tAndy Kirk And His Orchestra\tAlabama Bound\tDecca\t48073\t73265\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COL45563-2.mp3\tA.collins And B.harlan\tAlabama Jubilee\tCOLUMBIA\tA-1721\t45563-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL558.mp3\tLee O'daniel Hillbilly Boys\tAlabama Jubilee\tVOCALION\t4311\tDAL558\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_109.mp3\tFerko String Band\tAlabama Jubilee\tMedia\t1010\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_017.mp3\tArthur Collins And Byron Harlan\tAlabama Jubilee\tCOLUMBIA\tA-1721\t45563-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_287.mp3\tRed Foley Feat. The Nashville Dixielanders.including Francis Craig On Bones\tAlabama Jubilee\tDecca\t27810\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/MER5528AJ.mp3\tMuggsy Spanier's Dixielanders\tAlabammy Jubilee\tMERCURY\t5528\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148538-4.mp3\tMason-dixon Orch (trumbauer)\tAlabammy Snow\tCOLUMBIA\t1861 D\tW148538-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5835-2-3-4.mp3\tFletcher Henderson & His Orchestra\tAlabamy Bound\tBANNER\t1488\t5835-2-3-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/MONV-2645.mp3\tArthur Pryor's Band\tAlagazam March\tMONARCH\tV-2645\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU051507.mp3\tLeadbelly\tAlberta\tBLUEBIRD\t8559\t051507\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC49445-1.mp3\tDoc Daugherty And His Orchestra\tAlcoholic Blues\tVICTOR\tV-40111\t49445-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO239.mp3\tKay Kyser And His Orchestra\tAlexander The Swoose\tCOLUMBIA\t36040\tHCO239\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC11585-3.mp3\tBilly Murray\tAlexander's Bagpipe Band\tVICTOR\t17054\t11585-3\t1912\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143568-1.mp3\tBessie Smith\tAlexander's Ragtime Band\tCOLUMBIA\t14219 D\tW143568-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4748.mp3\tAndrews Sisters\tAlexander's Ragtime Band\tDECCA\t24424\tL4748\t1947\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic16908.mp3\tArthur Collins & Byron Harlan\tAlexander's Ragtime Band\tVictor\t16908\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC10374-1.mp3\tArthur Collins-byron Harlan\tAlexander's Ragtime Band\tVICTOR\t16908\t10374-1\t1911\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA1152-A.mp3\tBing Crosby And Connie Boswell\tAlexander's Ragtime Band\tDECCA\t1887A\tDLA1152-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC15254-A.mp3\tBoswell Sisters\tAlexander's Ragtime Band\tARC\tBR7412\t15254-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62336.mp3\tLouis Armstrong & His Orch.\tAlexander's Ragtime Band\tDECCA\t1408\t62336\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1152-A.mp3\tBing Crosby & Connie Boswell\tAlexander's Ragtime Band\tDECCA\t25495\tDLA1152-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKeW80338-A.mp3\tMiff Mole's Little Molers\tAlexander's Ragtime Band\tOKeh\t40758\tW80338-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17389H-.mp3\tThe Dutch Swing College Band\tAlexander's Ragtime Band\tPhilips\tP17389H\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4386.mp3\tBing Crosby And Al Jolson\tAlexander's Ragtime Band\tDECCA\t40038\tL4386\t1947\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25996.mp3\tBenny Goodman & His Orchestra\tAlexander's Ragtime Band\tVictor\t25996\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec62336-A.mp3\tLouis Armstrong And His Orchestra\tAlexander's Ragtime Band\tDecca\t1408\t62336-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_076.mp3\tBoswell Sisters\tAlexander's Ragtime Band\tARC\tBR7412\t15254-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_224.mp3\tBessie Smith\tAlexander's Ragtime Band\tCOLUMBIA\t14219 D\tW143568-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_107.mp3\tRay Noble And His Orchestra\tAlexander's Ragtime Band\tBRUNSWICK\t8180\tLA1601\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_208.mp3\tLouis Armstrong\tAlexander's Ragtime Band\tDECCA\t1408\t62336-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_126.mp3\tBoswell Sisters Feat. Tommy And Jimmy Dorsey\tAlexander's Ragtime Band\tBRUNSWICK\t7412\t15254\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_039.mp3\tVictor Military Band\tAlexander's Ragtime Band\tVICTOR\t17006\t11108-3\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_020.mp3\tBing Crosby And Connee Boswell Feat. John Scott Trotter's Orchestra\tAlexander's Ragtime Band\tDECCA\t1887A\tDLA1152-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOLA-1956-1.mp3\tAlix Combelle Et Son Orchestre\tAlexander's Ragtime Band\tSwing\t11\tOLA-1956-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-20297-1.mp3\tMills Blue Rhythm Band\tAlgiers Stomp\tColumbia\t3158-D\tCO-20297-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3/Joh105A.mp3\tJack Payne And His Bbc Dance Orchestra\tAli Babas Camel\tColumbia\tCB-383\tCA-12133-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07806.mp3\tTommy Dorsey & Clambake 7\tAlibi Baby\tVICTOR\t25577\t07806\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_066.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright; Tommy Dorsey And His Clambake Seven\tAlibi Baby\tVICTOR\t25577\t07806\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45176x.mp3\tEdith Day\tAlice Blue Gown\tVICTOR\t45176\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1105.mp3\tLouis Prima's New Orleans Gang\tAlice Blue Gown\tBRUNSWICK\t7657\tLA1105\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE29294.mp3\tRed Nichols & His 5 Pennies\tAlice Blue Gown\tBRUNSWICK\t6826\tE29294\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23328.mp3\tTeddy Wilson & His Orchestra\tAlice Blue Gown\tCBS\t(Reject)\t23328\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D352B2.mp3\tGlenn Miller And His Orchestra\tAlice Blue Gown\tV-DISC\t352B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_011.mp3\tEdith Day Feat. Rosario Bourdon Orchestra\tAlice Blue Gown\tVICTOR\t45176\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_237.mp3\tOzzie Nelson And His Orchestra\tAlice Blue Gown\tBLUEBIRD\t10659\t049021\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_262.mp3\tGlenn Miller And His Orchestra\tAlice Blue Gown\tBLUEBIRD\t10701\t048485\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_050.mp3\tFrankie Masters And His Orchestra\tAlice Blue Gown\tVOCALION\t5455\t26629\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/TedP-23328-1.mp3\tTeddy Wilson And His Orchestra\tAlice Blue Gown\tTeddy Wilson School \t\tP-23328-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66340.mp3\tBuddy Jones\tAlice From Dallas\tDECCA\t5744\t66340\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU76867-1.mp3\tJimmie Davis\tAlimony Blues\tBLUEBIRD\t5425\t76867-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1183-1.mp3\tJimmy Mundy Swing Club 7\tAll Aboard\tVARSITY\t8148\tUS1183-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL19226.mp3\tAda Jones (soprano)\tAll Aboard For Blanket Bay\tCOLUMBIA\tA-0989\t19226\t1911\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW152364.mp3\tTed Lewis & His Band\tAll Aboard For Dreamland, Baby\tCOLUMBIA\t2758 D\tW152364\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_117.mp3\tTed Lewis And His Band\tAll Aboard For Dreamland, Baby\tCOLUMBIA\t2758 D\tW152364\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13865-6-7.mp3\tAl Jolson W Ray Miller's Orchestra\tAll Alone\tBRUNSWICK\t2743\t13865-6-7\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS21134-2.mp3\tArtie Shaw And His New Music\tAll Alone\tCBS\tBR7899\tB-21134-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13765.mp3\tAbe Lyman & His Orchestra\tAll Alone\tBRUNSWICK\t2742\t13765\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC10171-1.mp3\tAda Jones & Billy Murray\tAll Alone\tVICTOR\t16884\t10171-1\t1911\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC30817-3.mp3\tPaul Whiteman & His Orchestra\tAll Alone\tVICTOR\t19487\t30817-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU2743a.mp3\tAl Jolson W Ray Miller's Orchestra\tAll Alone\tBRUNSWICK\t2743\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19487a.mp3\tPaul Whiteman & His Orchestra\tAll Alone\tVictor\t19487\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/ManW-1261-W.mp3\tBenny Carter And His Orchestra\tAll Alone\tManor\t1004\tW-1261-W\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_018.mp3\tAda Jones And Billy Murray\tAll Alone\tVICTOR\t16884\t10171-1\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_139.mp3\tLewis James\tAll Alone\tVICTOR\t19495A\t30962\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_070.mp3\tCliff Edwards\tAll Alone\tPath\t032090\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_244.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tAll Alone And Lonely\tDECCA\t3775B\t69094\t1941\t\nhttp://www.jazz-on-line.com/a/mp3/Joh403.mp3\tPeatie Wheatstraw\tAll Alone Blues\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh206.mp3\tPeatie Wheatstraw\tAll Alone Blues\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20417-A.mp3\tRevelers\tAll Alone Monday\tVICTOR\t20417\t37179-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_020.mp3\tNat Shilkret And The Victor Orchestra\tAll Alone Monday\tVICTOR\t20259A\t36802-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64490-B.mp3\tDick Robertson And His Orchestra\tAll American Girl\tDECCA\t2023A\t64490-B\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC73357.mp3\tGeorge Olsen & His Music\tAll American Girl (v Fran Frey')\tVICTOR\t24125A\t73357\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO34578.mp3\tCab Calloway & His Orchestra\tAll At Once\tCOLUMBIA\t36816\tCO34578\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC3908.mp3\tBig Bill\tAll By Myself\tCOLUMBIA\t37242\tC3908\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79884-4.mp3\tTed Lewis And His Band\tAll By Myself\tCOLUMBIA\tA-3434\t79884-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79807.mp3\tFrank Crumit\tAll By Myself\tCOLUMBIA\tA-3415\t79807\t1921\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67174.mp3\tBob Crosby's Bobcats\tAll By Myself\tDECCA\t3248A\t67174\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC25174-9.mp3\tAileen Stanley\tAll By Myself\tVICTOR\t18774\t25174-9\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOde20059.mp3\tBilly Jones\tAll By Myself\tOdeon\t20059\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_065.mp3\tAileen Stanley\tAll By Myself\tVICTOR\t18774\t25174-9\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_008.mp3\tTed Lewis And His Band\tAll By Myself\tCOLUMBIA\tA-3434\t79884-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_053.mp3\tFrank Crumit\tAll By Myself\tCOLUMBIA\tA-3415\t79807\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol1692-D.mp3\tThe Happiness Boys\tAll By Yourself In The Moonlight\tColumbia\t1692-D\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_218.mp3\tIrving Aaronson's Commanders\tAll By Yourself In The Moonlight\tVICTOR\t21867B\t48578\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh135.mp3\tNew Mayfair Dance Orchestra (vocal Eddie Grossbart)\tAll By Yourself In The Moonlight\tHMV\tB-5562\tBb-14720-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC06593.mp3\tBunny Berigan & His Orchestra\tAll Dark People Are Light On Their Feet\tVICTOR\t25557A\t06593\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_257.mp3\tPeggy Lee\tAll Dressed Up With A Broken Heart\tCapitol\t15022\t2622\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73716.mp3\tLouis Jordan\tAll For The Love Of Lil\tDECCA\t24448\t73716\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_093.mp3\tKing Cole Trio\tAll For You\tCapitol\t139\tRR8114\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC010597.mp3\tBunny Berigan And His Orchestra\tAll God's Children Got Rhythm\tVICTOR\t25609A\t010597\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_237.mp3\tDuke Ellington And His Famous Orchestra\tAll God's Chillun Get Rhythm\tMASTER\t137\tM521-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2408-3.mp3\tBud Powell (piano)\tAll God's Chillun Got Rhythm\tMERCURY\t11046\t2408-3\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-1957-2.mp3\tFletcher Henderson And His Orchestra\tAll God's Chillun Got Rhythm\tVocalion\t3641\tC-1957-2  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOEA6386-3.mp3\tFats Waller (organ)\tAll God's Chillun Got Wings\tVICTOR\t27460\tOEA6386-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/MON0994.mp3\tBert Williams\tAll Going Out And Nothing Coming In\tMONARCH\tV-0994\t0994\t1901\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC70295-1.mp3\tEddie Deas And His Boston Brownies\tAll I Care Bout Is You\tVICTOR\t22844\t70295-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC80505-2.mp3\tJan Garber And His Orchestra\tAll I Do Is Dream Of You\tVICTOR\t24629A\t80505-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU15141.mp3\tFreddy Martin & His Orchestra\tAll I Do Is Dream Of You\tBRUNSWICK\t6888\t15141\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_371.mp3\tJohnnie Ray\tAll I Do Is Dream Of You\tCOLUMBIA\t40046\tRHCO10323\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_014.mp3\tJan Garber And His Orchestra\tAll I Do Is Dream Of You\tVICTOR\t24629A\t80505-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480432.mp3\tBenny Goodman Trio\tAll I Do Is Dream Of You\tCapitol\tT795\t1998-3\t1947\tBenny Goodman (cl), Teddy Wilson (p), Jimmy Crawford (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480598.mp3\tBenny Goodman Trio\tAll I Do Is Dream Of You\tCapitol\t15886\t2519-2\t1947\tBenny Goodman (cl), Teddy Wilson (p), Jimmy Crawford (dm)\nhttp://www.jazz-on-line.com/a/mp3a/ARC14557.mp3\tErnest Stoneman\tAll I Got's Gone\tARC\tVO2901z\t14557\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70652.mp3\tElla Fitzgerald & Four Keys\tAll I Need Is You\tDECCA\t18347A\t70652\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO32794.mp3\tBenny Goodman Sextet\tAll I Need Is You (vp.lee)\tCOLUMBIA\t36617\tCO32794\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037139.mp3\tTommy Dorsey & His Orchestra\tAll I Remember Is You\tVICTOR\t26281\t037139\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_167.mp3\tTommy Dorsey And His Orchestra Feat. V/jack Leonard\tAll I Remember Is You\tVICTOR\t26281\t037139\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC71.mp3\tBilly Eckstine & His Orchestra\tAll I Sing Is The Blues\tNATIONAL\t\tNSC71\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3177x.mp3\tSpike Jones\tAll I Want For Christmas\tRCA\t20-3177\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC54730-3.mp3\tGus Arnheim Coconut Grove Orchestra\tAll I Want Is Just One Girl\tVICTOR\t22384\t54730-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU011910.mp3\tUncle Dave Macon\tAll In Down And Out Blues\tBLUEBIRD\t7350\t011910\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC042602.mp3\tTommy Dorsey & His Orchestra\tAll In Favor Of Swing Say Ay\tVICTOR\t26356\t042602\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu43317.mp3\tArtie Shaw And His Orchestra\tAll In Fun\tBluebird\t10492\t043317-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC040979.mp3\tTommy Dorsey & His Orch\tAll In Fun\tVICTOR\t26406\t040979\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu043317-1.mp3\tArtie Shaw And His Orchestra\tAll In Fun -v1-if\tBluebird\tB-10492\t043317-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC101189-1.mp3\tFats Waller And His Rhythm, Vocal By Fats Waller\tAll My Life\tVICTOR\t25296\t101189-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU99973.mp3\tWillie Bryant & His Orchestra\tAll My Life\tBLUEBIRD\t6361\t99973\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25296.mp3\tFats Waller And His Rhythm\tAll My Life\tVictor\t25296\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_192.mp3\tTeddy Wilson And His Orchestra\tAll My Life\tBRUNSWICK\t8116\t18832-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_219.mp3\tTed Fio Rito And His Orchestra Feat. V/stanley Hickman\tAll My Life\tDECCA\t784A\t61047\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh046.mp3\tCarroll Gibbons Savoy Hotel Orpheans\tAll My Life (v Jack Plant)\tColumbia\tCB-403\tCA-12342-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5243-1.mp3\tHerman Chittison Trio\tAll My Life (v Thelma Carpenter)\tMUSICRAFT\t320\t5243-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18832-1.mp3\tTeddy Wilson & His Orchestra\tAll My Life (ve.fitzgerald)\tBRUNSWICK\t7640\t18832-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC100397-1.mp3\tBenny Goodman Trio\tAll My Life (vh.ward)\tVICTOR\t25324-B\t100397-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_076.mp3\tPercy Faith And His Orchestra\tAll My Love\tCOLUMBIA\t38918\tCO44111\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_228.mp3\tDennis Day Feat. O/charles Dant\tAll My Love\tRCA Victor\t3870\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/MER3286.mp3\tPatti Page\tAll My Love - Bolero\tMERCURY\t5455\t3286\t\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK5405-2.mp3\tBull Moose Jackson\tAll My Love Belongs To You\tKING\t4189A\tK5405-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_499.mp3\tJo Stafford\tAll Night Long\tColumbia\t40640\tRHCO33516\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC12771-2.mp3\tAda Jones And Billy Murray\tAll Night Long\tVICTOR\t17278\t12771-2\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_077.mp3\tAda Jones And Billy Murray\tAll Night Long\tVICTOR\t17278\t12771-2\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_251.mp3\tRusty Bryant And The Carolyn Club Band\tAll Night Long\tDot\t15134\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/PARL0398-1.mp3\tLouise Johnson\tAll Night Long Blues\tPARAMOUNT\t12992A\tL0398-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/ARCB-11807-A.mp3\tCasa Loma Orchestra\tAll Of A Sudden\tARC\tBR6318\tB-11807-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiARCBR6318.mp3\tCasa Loma Orchestra\tAll Of A Sudden\tARC\tBR6318\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152092.mp3\tLouis Armstrong And His Orchestra\tAll Of Me\tCOLUMBIA\t2606\tW152092\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MER755-1.mp3\tFrankie Laine W Carl Fischer's\tAll Of Me\tMERCURY\t5048\t755-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29990.mp3\tBillie Holiday\tAll Of Me\tOKEH\t6214\t29990\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057656.mp3\tBenny Carter & His Orchestra\tAll Of Me\tBLUEBIRD\t10962\t057656\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8941AO.mp3\tIllinois Jacquet Sextet\tAll Of Me\tMERCURY\t8941\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT1130.mp3\tMildred Bailey\tAll Of Me\tMAJESTIC\t1140\tT1130\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC257.mp3\tBilly Eckstine & His Octet\tAll Of Me\tNATIONAL\t\tNSC257\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO31644.mp3\tCount Basie & His Orchestra\tAll Of Me\tCOLUMBIA\t36675\tCO31644\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVB4419.mp3\tErroll Garner\tAll Of Me\tSAVOY\t724\tB4419\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-157-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tAll Of Me\tSWING\t218\tOSW-157-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol2606-D.mp3\tLouis Armstrong And His Orchestra\tAll Of Me\tColumbia\t2606-D\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOKE6214.mp3\tBillie Holiday\tAll Of Me\tOKEH\t6214\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu057656-1.mp3\tBenny Carter And His Orchestra\tAll Of Me\tBluebird\tB-10962\t057656-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_092.mp3\tJohnnie Ray\tAll Of Me\tCOLUMBIA\t39788\tHCO10136\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_238.mp3\tFrank Sinatra\tAll Of Me\tCOLUMBIA\t38163\tCO38271\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_008.mp3\tLouis Armstrong\tAll Of Me\tCOLUMBIA\t2606 D\t152092\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_079.mp3\tCount Basie And His Orchestra Feat. Lynne Sherman\tAll Of Me\tCOLUMBIA\t36675\tCO31644\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC70636-1.mp3\tPaul Whiteman And His Orchestra\tAll Of Me (vm.bailey)\tVICTOR\t22879B\t70636-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3726.mp3\tBing Crosby\tAll Of My Life\tDECCA\t18658A\tL3726\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/COL41106AO.mp3\tFrankie Laine\tAll Of These And More\tCOLUMBIA\t41106\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL25288.mp3\tFrank Sinatra W Harry James Or\tAll Or Nothing At All\tCOLUMBIA\t35587\t25288\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65743.mp3\tJimmy Dorsey & His Orch.\tAll Or Nothing At All\tDECCA\t2580B\t65743\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu10928.mp3\tFreddy Martin & His Orchestra\tAll Or Nothing At All\tBluebird\t10928\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL35587.mp3\tFrank Sinatra\tAll Or Nothing At All\tCOLUMBIA\t35587\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29006-1.mp3\tCount Basie And His Orchestra\tAll Or Nothing At All\tOkey\t5884\t29006-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/Col25288-1.mp3\tHarry James And His Orchestra\tAll Or Nothing At All\tColumbia\t35587\t25288-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_306.mp3\tJoe Foley Feat. O/frank Hunter; Bv/ray Charles Singers\tAll Or Nothing At All\tJubilee\t5146\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC62213.mp3\tElla Fitzgerald And Her Savoy 8\tAll Over Nothin' At All\tDECCA\t1339\t62213\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec01339.mp3\tElla Fitzgerald\tAll Over Nothing At All\tDecca\t01339\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26818.mp3\tAileen Stanley-billy Murray\tAll Over Nothing At All\tVICTOR\t18943\t26818\t1922\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18943.mp3\tAileen Stanley-billy Murray\tAll Over Nothing At All\tVICTOR-\t18943\t26818\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_365.mp3\tElla Fitzgerald Feat. Chick Webb Orchestra And Louis Jordan (alto Sax)\tAll Over Nothing At All\tDECCA\t1339\t62213\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK5718.mp3\tWynonie Harris\tAll She Wants To Do Is Rock\tKING\t4304AA\tK5718\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_055.mp3\tVan And Schenck\tAll She'd Say Was ''umh-hum''\tCOLUMBIA\tA-3319\t79421-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT671-5.mp3\tMildred Bailey W E.sauter\tAll That Glitters Is Not Gold\tMAJESTIC\t1034\tT671-5\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU062765.mp3\tFats Waller And His Rhythm\tAll That Meat And No Potatoes\tBLUEBIRD\t11102\t062765\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D308A2.mp3\tFats Waller\tAll That Meat And No Potatoes\tV-DISC\t308A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC69560.mp3\tBon Bon And His Buddies\tAll That Meat And No Potatoes\tDECCA\t8567B\t69560\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_066.mp3\tVan And Schenck\tAll The Boys Love Mary\tCOLUMBIA\tA-2942\t79128-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_102.mp3\tEddie Cantor\tAll The Boys Love Mary\tEMERSON\t10119\t04779-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1685.mp3\tBenny Goodman And His Orchestra\tAll The Cats Join In\tCOLUMBIA\t36967\tHCO1685\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73336.mp3\tRoy Eldridge & His Orchestra\tAll The Cats Join In\tDECCA\t23532\t73336\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60862-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tAll The Jive Is Gone\tDecca\t744\t60862-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D391.mp3\tTommy Dorsey Orchestra\tAll The Things You Ain't\tV-DISC\t391\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU043318.mp3\tArtie Shaw And His Orchestra\tAll The Things You Are\tBLUEBIRD\t10492\t043318-1\t1939\tVocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3a/MUSG556.mp3\tDizzy Gillespie Sextet\tAll The Things You Are\tMUSICRAFT\t488\tG556\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA43318.mp3\tArtie Shaw And His Orchestra\tAll The Things You Are\tRCA\t20-1561\t043318-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT735.mp3\tJohnny Guarnieri Trio\tAll The Things You Are\tMAJESTIC\t1054\tT735\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC25712.mp3\tMildred Bailey W Alec Wilder\tAll The Things You Are\tVOCALION\t5277\t25712\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS298.mp3\tBilly Kyle Trio\tAll The Things You Are\tDISC\t5003\t298\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SAV4406-2.mp3\tErroll Garner Trio\tAll The Things You Are\tSAVOY\t739\t4406-2\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP6409.mp3\tEddie Heywood\tAll The Things You Are\tCOLUMBIA\t39317\tZSP6409\t\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC170.mp3\tBilly Eckstine & His Orchestra\tAll The Things You Are\tNATIONAL\t\tNSC170\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_164.mp3\tArtie Shaw And His Orchestra\tAll The Things You Are\tRCA\t20-1559\t43318\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_023.mp3\tTommy Dorsey And His Orchestra\tAll The Things You Are\tVICTOR\t26401\t040983\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/AtlRK-9.mp3\tErroll Garner Trio\tAll The Things You Are\tAtlantic\tARL 128\tRK-9\t1944\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480402.mp3\tArt Tatum/ Ben Webster Quartet\tAll The Things You Are\tBarclay\t74058\t2990-1\t1956\tBen Webster (ts), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3h/DH480818.mp3\tAndre Kostelanetz And His Orchestra\tAll The Things You Are\tCOLUMBIA\t4268-M\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC040983.mp3\tTommy Dorsey And His Orchestra\tAll The Things You Are ('very Warm For May')\tVICTOR\t26401\t040983\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu043318-1.mp3\tArtie Shaw And His Orchestra\tAll The Things You Are -v H F\tBluebird\tB-10492\t043318-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh058.mp3\tHatchetts Swingtette\tAll The Things You Are V Dorothy Carless)\tDecca\tF-7692\tDR-5118-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18779B.mp3\tLucky Millinder & His Orchestra\tAll The Time\tDECCA\t18779B\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72952.mp3\tLucky Millinder And His Orchestra\tAll The Time\tDecca\t18779\t72952\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_348.mp3\tMills Brothers\tAll The Way 'round The World\tDecca\t29781\t88573\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_049.mp3\tHenry Burr\tAll The World Will Be Jealous Of Me\tCOLUMBIA\t2275\t77041\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_018.mp3\tCharles Harrison\tAll The World Will Be Jealous Of Me\tVICTOR\t18302\t19690-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77041.mp3\tHenry Burr (tenor)\tAll The World Will Be Jealous Of You\tCOLUMBIA\tA-2275\t77041\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC19690-2.mp3\tCharles Harrison\tAll The World Will Be Jealous Of You\tVICTOR\t18302\t19690-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO8x.mp3\tTurk Murphy's Jazz Band\tAll The Wrongs You've Done\tGood Time Jazz\t8\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC050852.mp3\tTommy Dorsey And His Orchestra\tAll This And Heaven Too\tVICTOR\t26653\t050852\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26875.mp3\tGene Krupa & His Orchestra\tAll This And Heaven Too\tCOLUMBIA\t35520\t26875\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu50589.mp3\tCharlie Barnet & His Orch\tAll This And Heaven Too\tBluebird\t10751\t50589\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_105.mp3\tCharlie Barnet And His Orchestra\tAll This And Heaven Too\tBluebird\t10751\t50589\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_146.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tAll This And Heaven Too\tDECCA\t3259A\t67856\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_097.mp3\tTommy Dorsey Orch V Frank Sinatra\tAll This And Heaven Too\tVICTOR\t26653\t050852\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLC4211-1.mp3\tGene Krupa & His Orchestra\tAll Those Wonderful Years\tCOLUMBIA\t36621\tC4211-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_214.mp3\tRuss Morgan And His Orchestra\tAll Those Wonderful Years\tDecca\t4300\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1814x.mp3\tPerry Como\tAll Through The Day\tRCA\t20-1814\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP60813.mp3\tMargaret Whiting\tAll Through The Day\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_087.mp3\tFrank Sinatra\tAll Through The Day\tCOLUMBIA\t36962\tHCO1674\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_145.mp3\tMargaret Whiting\tAll Through The Day\tCapitol\t240\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_097.mp3\tPerry Como Feat. Andre Kostelanetz Orchestra\tAll Through The Day\tRCA VICTOR\t1814\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC023212.mp3\tTommy Dorsey & His Orchestra\tAll Through The Night\tVICTOR\t25866\t023212\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE32064.mp3\tGene Krupa & His Orchestra\tAll Through The Night\tOKEH\t6563\t32064\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_056alt.mp3\tHenry Burr\tAll Through The Night\tZONOPHONE\t710\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC054608-1.mp3\tDuke Ellington & His Orchestra\tAll Too Soon\tVICTOR\t27247\t054608-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69363-A.mp3\tMildred Bailey & Delta Rhythm\tAll Too Soon\tDECCA\t3888B\t69363-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/GotSI-120.mp3\tTony Scott And His Down Beat Club Septet\tAll Too Soon\tGotham\t105\tSI-120\t1946\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480712.mp3\tDuke Ellington And His Famous Orchestra\tAll Too Soon (slow Tune)\tVictor\t27247\t054608-1\t1940\tWardell Jones, Cootie Williams (tp), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Barney Bigard (cl), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (cl, as, bsx), Ben Webster (ts), Duke Ellington (p), Fred Guy (g), Jimmy Blanton (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3c/VOCM570.mp3\tBilly Kyle Swing Band\tAll You Want To Do Is Dance\tVOCALION\t3778\tM570\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA830-A.mp3\tJohn Scott Trotter And His Orchestra With Bing Crosby\tAll You Want To Do Is Dance \tDECCA\t\tDLA830-A \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC042615.mp3\tTommy Dorsey & His Clambake 7\tAlla En El Rancho Grande\tVICTOR\t26370\t042615\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1752.mp3\tBing Crosby & Music Maids\tAlla En El Rancho Grande\tDECCA\t2494A\tDLA1752\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE29295.mp3\tRed Nichols & His 5 Pennies\tAllah's Holiday\tBRUNSWICK\t6824\tE29295\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011096.mp3\tTommy Dorsey & His Orchestra\tAllegheny Al\tVICTOR\t25623\t011096\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70878x.mp3\tPatti Page\tAllegheny Moon\tMERCURY\t70878\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_023.mp3\tPatti Page\tAllegheny Moon\tMercury\t70878 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4463.mp3\tJo Stafford\tAllentown Jail\tCOLUMBIA\t39389\tHCO4463\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP11443.mp3\tKay Starr - Harold Mooney\tAllez Vous-en\tCAPITOL\t\t11443\t\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe81880-B.mp3\tHelen Humes\tAlligator Blues\tOKeh\t8529\t81880-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU86210-1.mp3\tFats Waller (piano)\tAlligator Crawl\tBLUEBIRD\t10098\t86210-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP5038.mp3\tLouis Armstrong And His Hot Seven\tAlligator Crawl\tCOLUMBIA\t39242\tZSP5038\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic86210-1.mp3\t\"fats\" Waller\tAlligator Crawl\tVictor\t24830\t86210-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/Gen11633-B.mp3\tKing Oliver's Creole Jazz Band\tAlligator Hop\tGennett\t5274\t11633-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_069.mp3\tJoni James\tAlmost Always\tMGM\t11470\t53S6001\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT1131.mp3\tMildred Bailey\tAlmost Like Being In Love\tMAJESTIC\t1140\tT1131\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_206.mp3\tFrank Sinatra\tAlmost Like Being In Love\tCOLUMBIA\t37382\tHCO2281\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_242.mp3\tMildred Bailey Feat. D/julian Work\tAlmost Like Being In Love\tMAJESTIC\t1140\tT1131\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480819.mp3\tCarmen Miranda And The Bando Da Lua\tAlo Alo\tDECCA\t23209-B\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2015-A.mp3\tBing Crosby & Dick Mcintyre\tAloha Kuu Ipo Aloha\tDECCA\t19020\tDLA2015-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D340A1.mp3\tHarry Owens And His Royal Hawaiians\tAloha No Wau I Ko Maka\tV-DISC\t340A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA453-A.mp3\tBing Crosby & Dick Mcintyre\tAloha Oe\tDECCA\t25009\tDLA453-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC98102.mp3\tTommy Dorsey And His Orchestra\tAlone\tVICTOR\t25191\t98102\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18212-1.mp3\tHal Kemp & His Orchestra\tAlone\tBRUNSWICK\t7552\t18212-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S192.mp3\tLionel Hampton & His Orchestra\tAlone\tMGM\t11448\t51S192\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_004.mp3\tTommy Dorsey And His Orchestra\tAlone\tVICTOR\t25191\t98102\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-192.mp3\tLionel Hampton And His Orchestra\tAlone\tMGM\t11448\t51-S-192\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_154.mp3\tAl Donahue And His Orchestra Feat. Barry Mckinley\tAlone\tDECCA\t626A\t60166-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_029.mp3\tCarl Fenton And His Orchestra\tAlone At Last\tBrunswick\t2925\t16096-7\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC32769-5.mp3\tCoon-sanders Nighthawk Orchestra\tAlone At Last\tVICTOR\t19728\t32769-5\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC33330-4.mp3\tHenry Burr\tAlone At Last\tVICTOR\t19780\t33330-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0625_01.mp3\tLee Morse\tAlone At Last\tPathe\t025151A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_058.mp3\tHenry Burr\tAlone At Last\tVICTOR\t19780\t33330-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU16096-7.mp3\tCarl Fenton And His Orch\tAlone At Last (v I K)\tBRUNSWICK\t2925\t16096-7\t1925\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC57233-2.mp3\tCoon Sanders Nighthawk Orchestra\tAlone In The Rain\tVICTOR\t22262\t57233-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480599.mp3\tArt Farmer Quartet\tAlone Together\tPrestige\tLP193\t636\t1954\tArt Farmer, T, Flh, Wynton Kelley, P, Addison Farmer, B, Herbert Lovelle, D\nhttp://www.jazz-on-line.com/a/mp3t/TS480811.mp3\tBen Webster And Harry Sweets Edison & Woody Herman\tAlone Together\tVerve\tEPV5046\t20569-12\t1957\tBen Webster, Ts, Harry Sweets Edison, T, Jimmy Rowles, P, Barney Kessel, G, Joe Mandragon, B, Larry Bunker, D, Woody Herman, Vocal\nhttp://www.jazz-on-line.com/a/mp3a/BRU12313-1.mp3\tVictor Young And His Orchestra\tAlone Together (vfm)\tBRUNSWICK\t6382\t12313-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_252.mp3\tNat King Cole Feat. O/nelson Riddle\tAlone Too Long\tCAPITOL\t2754\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4885-1.mp3\tBill Monroe Bluegrass Boys\tAlong About Daybreak\tCOLUMBIA\t20595\tCCO4885-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480464.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tAlong Came Betty\tBlue Note\t45-1736\t8-54899-2\t1958\tArt Blakey, D, Benny Golson, Ts, Lee MOrgan, T, Bobbie Timmons, P, Jymie Merritt, B\nhttp://www.jazz-on-line.com/a/mp3t/TS480433.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tAlong Came Manon\tRCA\t430045\t\t1959\tArt Blakey, D, Benny Golson, Ts, Lee Morgan, T,: Jymie Merritt, B, Bobby Timmons, P\nhttp://www.jazz-on-line.com/a/mp3w/1915_097.mp3\tArthur Fields\tAlong Came Ruth\tCOLUMBIA\tA-1612\t39569\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3876.mp3\tBing Crosby And Andrew Sisters\tAlong The Navajo Trail\tDECCA\t23437\tL3876\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO34971.mp3\tGene Krupa & His Orchestra\tAlong The Navajo Trail\tCOLUMBIA\t36846\tCO34971\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_089.mp3\tDinah Shore\tAlong The Navajo Trail\tV-DISC\t498A1\tVP 1369\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI8793.mp3\tStevens Trio\tAlong The Rainbow Trail\tEDISON\t51276L\t8793\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_032.mp3\tAmerican Quartet\tAlong The Rocky Road To Dublin\tVictor\t17900\t16739-2\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_104.mp3\tSammy Kaye And His Orchestra\tAlong The Santa Fe Trail\tVictor\t27220\t057389-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2251.mp3\tBing Crosby\tAlong The Santa Fe Trail\tDECCA\t3565A\tDLA2251\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_155.mp3\tBing Crosby\tAlong The Santa Fe Trail\tDECCA\t3565A\tDLA2251\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU10970-A.mp3\tGlenn Miller & His Orchestra\tAlong The Sante Fe Trail\tBLUEBIRD\t10970-A\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU057612.mp3\tGlenn Miller And His Orchestra\tAlong The Sante Fe Trail (vre)\tBLUEBIRD\t10970-A\t057612\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5474.mp3\tArtie Shaw And His Orchestra\tAlong With Me\tMUSICRAFT\t365\t5474\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_194.mp3\tMargaret Whiting\tAlong With Me\tCapitol\t269\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3h/DECF10182y.mp3\tTed Heath And His Music\tAlouette\tDECCA-LONDON\tF10182y\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB620.mp3\tPat Flowers & His Rhythm\tAloysius, Do The Dishes\tRCA\t20-2215\tD7VB620\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/DecB-13359-A.mp3\tSpike Hughes And His Negro Orchestra With Benny Carter\tAlr In D Flat \tDecca \tF-5101\tB-13359-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29921-1.mp3\tGene Krupa & His Orchestra\tAlreet\tOKEH\t6118\t29921-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC055230.mp3\tLionel Hampton & His Orchestra\tAltitude\tVICTOR\t27316\t055230\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic055230-1.mp3\tLionel Hampton And His Sextet\tAltitude\tVictor\t27316\t055230-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18634x.mp3\tGuy Lombardo\tAlways\tDECCA\t18634\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC34601-11.mp3\tGeorge Olsen And His Music\tAlways\tVICTOR\t19955A\t34601-11\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102411.mp3\tCharlie Barnet & His Orchestra\tAlways\tBLUEBIRD\t6487\t102411\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe74008.mp3\tVincent Lopez & His Orchestra\tAlways\tOKeh\t40567\t74008\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC34552-9.mp3\tHenry Burr\tAlways\tVICTOR\t19959\t34552-9\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE17978.mp3\tNick Lucas\tAlways\tBRUNSWICK\t3088\tE17978\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D328A1.mp3\tJoan Edwards With Raymond Scott And His Orchestra\tAlways\tV-DISC\t328A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_032.mp3\tHenry Burr\tAlways\tVICTOR\t19959\t34552-9\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_045.mp3\tNick Lucas\tAlways\tBRUNSWICK\t3088\tE17978\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_137.mp3\tSammy Kaye And His Orchestra\tAlways\tRCA\t20-1610\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC021130.mp3\tBenny Goodman And His Orchestra\tAlways And Always\tVICTOR\t25808\t021130\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_157.mp3\tLarry Clinton And His Orchestra Feat. V/bea Wain\tAlways And Always\tVICTOR\t25768\t018105-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC018105-1.mp3\tLarry Clinton & His Orchestra\tAlways And Always (vbw)\tVICTOR\t25768\t018105-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS22322-1.mp3\tRed Norvo And His Orchestra\tAlways And Always (vm.bailey)\tCBS\tBR8069\t22322-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068791.mp3\tGlenn Miller And His Orchestra\tAlways In My Heart\tBLUEBIRD\t11438-B\t068791\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_120.mp3\tKenny Baker Feat. Harry Sosnik Orchestra\tAlways In My Heart\tDECCA\t18262A\t70373\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_138.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tAlways In My Heart\tDECCA\t4277A\t70438\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_017.mp3\tByron G. Harlan\tAlways In The Way\tEdison\t8501\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO46264-1.mp3\tLefty Frizzell W String Band\tAlways Late\tCOLUMBIA\t20837\tCO46264-1\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB4683-2.mp3\tBilly Murray\tAlways Leave Em Laughing\tVICTOR\t16186\tB4683-2\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_279.mp3\tNat ''king'' Cole (les Baxter And His Orchestra)\tAlways You\tCapitol\t1401\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_193.mp3\tKay Starr\tAm I A Toy Or A Treasure?\tCapitol\t2887\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/COL30459.mp3\tBillie Holiday\tAm I Blue\tCOLUMBIA\t38792\t30459\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148532-2.mp3\tEthel Waters And Her Ebony 4\tAm I Blue\tCOLUMBIA\t1837\tW148532-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/CONW3531.mp3\tEthel Waters W J.c.heard Orchestra\tAm I Blue\tCONTIN\t10008\tW3531\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D373A1.mp3\tPaul Baron And His Orchestra\tAm I Blue\tV-DISC\t373A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47294.mp3\tErroll Garner Trio\tAm I Blue\tCOLUMBIA\t39918\tCO47294\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC53433-1.mp3\tNat Shilkret & His Orchestra\tAm I Blue (vdh)\tVICTOR\t22004\t53433-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1762-1.mp3\tBuster Bailey Sextet\tAm I Blue?\tVARSITY\t8333\tUS1762-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_141.mp3\tNat Shilkret And The Victor Orchestra\tAm I Blue?\tVICTOR\t22004\t53433-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_211.mp3\tTom Gerun And His Orchestra\tAm I Blue?\tBRUNSWICK\t4429\tLAE533\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_134.mp3\tAnnette Hanshaw\tAm I Blue?\tHARMONY\t940-H\t148647-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011092.mp3\tTommy Dorsey & His Clambake 7\tAm I Dreaming?\tVICTOR\t25620\t011092\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09887.mp3\tFats Waller And His Rhythm\tAm I In Another World?\tVICTOR\t25753\t09887\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21458-1.mp3\tArtie Shaw And His New Music\tAm I In Love (vpeg La Centra)\tBRUNSWICK\t7942\tB-21458-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30069-1.mp3\tBenny Goodman And His Orchestra\tAmapola\tCOLUMBIA\t36050\tCO30069-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68652.mp3\tJimmy Dorsey And His Orch. (vh.o'connell And Bob Eberle)\tAmapola\tDECCA\t3629A\t68652\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_001.mp3\tJimmy Dorsey Orch V Bob Eberle And Helen O'connell\tAmapola\tDECCA\t3629A\t68652\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/APO194y.mp3\tMahalia Jackson\tAmazing Grace\tAPOLLO\t194\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82232.mp3\tColeman Hawkins & His Orchestra\tAmber\tDECCA\t27999\t82232\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_037.mp3\tWoody Herman And His Orchestra\tAmen\tDECCA\t18346A\t70619\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_075.mp3\tGeorge Alexander\tAmerica\tCOLUMBIA\tA-0336\t3099\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_017.mp3\tColumbia Mixed Double Quartet\tAmerica (my Country 'tis Of Thee)\tCOLUMBIA\tA-2012\t46730\t1916\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic4452.mp3\tSousa's Band\tAmerica (my Country Tears Of Thee)\tVictor\t4452\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3b/VICB2623-6.mp3\tSousa's Band\tAmerica - My Country 'tis Of Thee\tVICTOR\t16137\tB2623-6\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38797-3.mp3\tNat Shilkret & Victor Orchestra\tAmerica Did It Again (vqt)\tVICTOR\t20681\t38797-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC19304-1.mp3\tPeerless Qt\tAmerica, Here's My Boy\tVICTOR\t18256\t19304-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_047.mp3\tSam Ash\tAmerica, I Love You\tCOLUMBIA\t1842\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_065.mp3\tAmerican Quartet\tAmerica, I Love You!\tVictor\t17902\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_282.mp3\tFrank Sinatra\tAmerican Beauty Rose\tCOLUMBIA\t40522\tCO42967\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D343B1.mp3\tUnited States Army Air Forces Band (glenn Darwin V\tAmerican Doughboy\tV-DISC\t343B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC55093-A.mp3\tVictor Herbert's Orchestra\tAmerican Fantasie - Part 1\tVictor\t55093-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC55093-B.mp3\tVictor Herbert's Orchestra\tAmerican Fantasie - Part 2\tVictor\t55093-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC072230.mp3\tGlenn Miller And His Orchestra\tAmerican Patrol\tVICTOR\t27873\t072230\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC85537.mp3\tGlenn Miller The Glenn Miller Story''\tAmerican Patrol\tDECCA\t29017\t85537\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70802.mp3\tMuggsy Spanier & His Orch.\tAmerican Patrol\tDECCA\t4328A\t70802\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_037.mp3\tSousa's Band\tAmerican Patrol\tVICTOR\t16523\tB0251-12\t1901\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_134.mp3\tGlenn Miller And His Orchestra\tAmerican Patrol\tRCA\t20-1564\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic16048a.mp3\tJohn J. Kimmel\tAmerican Polka\tVictor\t16048\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D330A1.mp3\tBenny Carter And His Orchestra\tAmong My Souvenirs\tV-DISC\t330A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21100-A.mp3\tRevelers\tAmong My Souvenirs\tVICTOR\t21100A\t41106-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35877.mp3\tPaul Whiteman\tAmong My Souvenirs\tVICTOR\t35877\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2975.mp3\tLouis Armstrong & His Orchestra\tAmong My Souvenirs\tDECCA\t4327A\tDLA2975\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC41104-3.mp3\tRoger Wolfe Kahn & His Orchestra\tAmong My Souvenirs\tVICTOR\t21084\t41104-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_107.mp3\tRevelers\tAmong My Souvenirs\tVICTOR\t21100A\t41106-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeM-1126-1.mp3\tBenny Carter\tAmong My Souvenirs\tOkeh\t5399\tM-1126-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_320.mp3\tJohnny Messner And His Orchestra (voc Jeanne D'arcy)\tAmong Those Sailing\tBluebird\t10058\t030315\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2460.mp3\tTed Daffan's Texans\tAmong Your Souvenirs\tCOLUMBIA\t20530\tHCO2460\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3317.mp3\tBing Crosby\tAmor\tDECCA\t18608\tL3317\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D241A1.mp3\tBing Crosby\tAmor\tV-DISC\t241A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_046.mp3\tAndy Russell\tAmor\tCapitol\t15214\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_081.mp3\tXavier Cugat And His Waldorf-astoria Orchestra Feat. Carmen Castillo\tAmor\tCOLUMBIA\t36718\tCC04187\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_161.mp3\tFour Aces Feat. O/jack Pleis\tAmor\tDECCA\t29036\t85379\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC3965-1.mp3\tGene Krupa & His Orchestra\tAmour\tOKEH\t6400\tC3965-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_183.mp3\tLes Paul And Mary Ford\tAmukiriki (the Lord Willing)\tCapitol\t3248\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM50S3130.mp3\tDavid Rose And His Orchestra\tAn American In Paris\tMGM\t30291\t50S3130\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_069.mp3\tVictor Symphony Orchestra Feat. George Gershwin\tAn American In Paris\tVictor\t35963\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038172.mp3\tGlenn Miller & His Orchestra\tAn Angel In A Furnished Room (vre)\tBLUEBIRD\t10383\t038172\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_159.mp3\tBuddy Clark\tAn Apple Blossom Wedding\tCOLUMBIA\t37488\tCO37702\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1782.mp3\tBing Crosby And Connie Boswell\tAn Apple For The Teacher\tDECCA\t2640A\tDLA1782\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_027.mp3\tBing Crosby And Connee Boswell Feat. John Scott Trotter's Orchestra\tAn Apple For The Teacher\tDECCA\t2640A\tDLA1782\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037688.mp3\tCharlie Barnet & His Orchestra\tAn Apple For The Teacher (vlt)\tBLUEBIRD\t10349\t037688\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BANLA205-A.mp3\tEddie Cantor\tAn Earful Of Music\tBANNER\t33216\tLA205-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC85590.mp3\tElla Fitzgerald\tAn Empty Ballroom\tDECCA\t29259\t85590\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE37355.mp3\tBoswell Sisters\tAn Ev'ning In Caroline\tBRUNSWICK\t6218\tE37355\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_140.mp3\tBoswell Sisters Feat. Dorsey Brothers Orchestra\tAn Evening In Caroline\tBRUNSWICK\t6218\tE37355\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_157.mp3\tJimmy Dorsey And His Orchestra\tAn Hour Never Passes\tDECCA\t18616\tL3415\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA1024.mp3\tAndy Iona's Novelty Four\tAn Island Melody\tCOLUMBIA\t3054 D\tLA1024\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_230.mp3\tJeri Southern\tAn Occasional Man\tCapitol\t3245\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_325.mp3\tShep Fields And His Rippling Rhythm Orchestra\tAn Old Curiosity Shop\tBluebird\t10056\t026255\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030780.mp3\tTommy Dorsey & His Orchestra\tAn Old Curiosity Shop\tVICTOR\t26140\t030780\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULA1763-A.mp3\tGene Krupa & His Orchestra\tAn Old Curiosity Shop\tBRUNSWICK\t8292\tLA1763-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0500_04.mp3\tLee Morse\tAn Old Fashioned Romance\tPerfect\t11580B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011710.mp3\tTommy Dorsey & His Orchestra\tAn Old Flame Never Dies\tVICTOR\t25649\t011710\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_361.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tAn Old Flame Never Dies\tVICTOR\t25649\t011710\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021175-2.mp3\tBunny Berigan & His Orchestra\tAn Old Straw Hat\tVICTOR\t25816A\t021175-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CONB1.mp3\tRoy Acuff Smoky Mountain Boys\tAn Old Three Room Shack\tCONQUEROR\t9255\tB1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478318.mp3\tAlec Templeton\tAn Old-fashioned Italian Opera\tLIBERTY MUSIC SHOPS\t\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC28728-4.mp3\tPaul Whiteman & His Orchestra\tAn Orange Grove In California\tVICTOR\t19169A\t28728-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3r/RiPat036002.mp3\tGolden Gate Orchestra\tAn Orange Grove In California\tPath\t036002\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_098.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tAn Orchid To You\tVICTOR\t24326\t76169-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/MER11082p.mp3\tCharlie Parker's Orchestra\tAn Oscar For Treadwell\tMERCURY\t11082\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU45023-2.mp3\tCarter Family\tAnchored In Love\tBLUEBIRD\t5406\t45023-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh034.mp3\tThe Royal Air Force Dance Orchestra\tAnchors Away (arr. George Chisholm)\tDecca\tF-8262\tDR-7153-2\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/COL3649.mp3\tArthur Collins And Byron Harlan\tAnd A Little Bit More\tCOLUMBIA\tA-0487\t3649\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_044.mp3\tArthur Collins And Byron Harlan\tAnd A Little Bit More\tCOLUMBIA\tA-0487\t03649\t1907\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC55492-3.mp3\tCoon-sanders Orchestra\tAnd Especially You\tVICTOR\t22077A\t55492-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78536.mp3\tBilly Murray (tenor)\tAnd He Said Oh Lala Weedee\tCOLUMBIA\tA-2765\t78536\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP166.mp3\tStan Kenton And His Orchestra\tAnd Her Tears Flowed Like Wine\tCAPITOL\t\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72483.mp3\tElla Fitzgerald & Song Spinner\tAnd Her Tears Flowed Like Wine\tDECCA\t18633\t72483\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D309A.mp3\tStan Kenton And His Orchestra (anita O'day V.)\tAnd Her Tears Flowed Like Wine\tV-DISC\t309A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_133.mp3\tElla Fitzgerald Feat. Johnny Long's Orchestra And The Song Spinners\tAnd Her Tears Flowed Like Wine\tDECCA\t18633\t72483\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2467.mp3\tFrankie Carle\tAnd Mimi\tCOLUMBIA\t37819\tHCO2467\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM47S3141.mp3\tJohnny Thompson W Art Lund Or.\tAnd Mimi\tMGM\t10082B\t47S3141\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_290.mp3\tFrankie Carle And His Orchestra Feat. Gregg Lawrence\tAnd Mimi\tCOLUMBIA\t37819\tHCO2467\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE26952-A.mp3\tGene Krupa & His Orchestra\tAnd So Do I\tOKEH\t5701\t26952-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_314.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tAnd So Do I\tVICTOR\t26660\t051580-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1866-2.mp3\tJack Teagarden & Ho\tAnd So Do I (v D A)\tVARSITY\t8388\tUS1866-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1910-1.mp3\tCharlie Palloy & His Orchestra\tAnd So I Married The Girl (vcp)\tCROWN\t3410B\tC1910-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D206B1.mp3\tMorton Downey With Tommy Dorsey\tAnd So Little Time\tV-DISC\t206B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5650.mp3\tArtie Shaw And His Orchestra\tAnd So To Bed\tMUSICRAFT\t441\t5650\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4611.mp3\tPaul Weston\tAnd So To Sleep\tCOLUMBIA\t39569\tHCO4611\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC81484.mp3\tColeman Hawkins & His Orchestra\tAnd So To Sleep\tDECCA\t27853\t81484\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/MER5706.mp3\tPatti Page\tAnd So To Sleep Again\tMERCURY\t5706\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_275.mp3\tDick Haymes\tAnd So To Sleep Again\tDECCA\t27731\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC83604-1.mp3\tIna Ray Hutton And Melodears\tAnd Still I Do\tVICTOR\t24692\t83604-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUW152625.mp3\tAnson Weeks And His Music\tAnd Still I Do (v P F)\tBRUNSWICK\t6946\tW152625\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1758.mp3\tBing Crosby - J.s.trotter Orchestra\tAnd The Angels Sing\tDECCA\t91617\tDLA1758\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24430-A.mp3\tMildred Bailey\tAnd The Angels Sing\tCBS\tVO4815\t24430-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu10103.mp3\tZiggy Elman & His Orchestra\tAnd The Angels Sing\tBluebird\t10103\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_283.mp3\tCount Basie And His Orchestra Feat. Helen Humes\tAnd The Angels Sing\tVOCALION\t4784\t24337-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_376.mp3\tThree Chuckles\tAnd The Angels Sing\tVik\t0194\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24337-A.mp3\tCount Basie And His Orchestra\tAnd The Angels Sing\tVocalion\t4784\t24337-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24346-A.mp3\tHarry James And His Orchestra\tAnd The Angels Sing\tBrunswick\t8355\tB-24346-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_231.mp3\tBenny Goodman And His Orchestra\tAnd The Angels Sing\tVICTOR\t26170A\t031875-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478319.mp3\tAlec Templeton\tAnd The Angels Sing (italian Opera Style)\tVICTOR\t\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC031875-1.mp3\tBenny Goodman And His Orchestra\tAnd The Angels Sing (vmt)\tVICTOR\t26170A\t031875-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035700.mp3\tGlenn Miller & His Orchestra\tAnd The Angels Sing (vre)\tBLUEBIRD\t10201\t035700\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3322.mp3\tStan Getz Qt\tAnd The Angels Swing\tSAVOY\t909\tS3322\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D348A1.mp3\tSpike Jones And His City Slickers\tAnd The Great Big Saw Came Nearer And Nearer\tV-DISC\t348A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_099.mp3\tCal Stewart\tAnd Then I Laughed\tCOLUMBIA\tA-0296\t105\t1907\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17675.mp3\tOzzie Nelson And His Orchestra\tAnd Then Some\tBRUNSWICK\t7464\t17675\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D262A2.mp3\tFrank Sinatra\tAnd Then You Kissed Me\tV-DISC\t262A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe404551-B.mp3\tYale Collegians\tAnd Then Your Lips Met Mine\tOKeh\t41474\t404551-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26997-A.mp3\tJohn Kirby & His Orchestra\tAndiology\tCBS\toK5805\t26997-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COMR4053.mp3\tJoe Sullivan (piano)\tAndy's Blues\tCOMMODORE\t540\tR4053\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4115.mp3\tCharlie Barnet And His Orchestra\tAndy's Boogie\tDECCA\t18888A\tL4115\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_094.mp3\tEddie Fisher\tAnema E Core (with All My Heart And Soul)\tRCA Victor\t5675\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_265.mp3\tTommy Dorsey And His Orchestra Feat. Alan Dewitt\tAngel\tVICTOR\t26465\t044528\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80140.mp3\tAl Jolson\tAngel Child\tCOLUMBIA\tA-3568\t80140\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_079.mp3\tBen Selvin And His Orchestra\tAngel Child\tBrunswick\t2249\t7214\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_006.mp3\tAl Jolson\tAngel Child\tCOLUMBIA\tA-3568\t80140\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053135.mp3\tGlenn Miller & His Orchestra\tAngel Child (vre)\tBLUEBIRD\t10796\t053135\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83008.mp3\tElla Fitzgerald\tAngel Eyes\tDECCA\t28707\t83008\t\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW143275-2.mp3\tLeo Reisman & His Orchestra\tAngel Eyes\tCOLUMBIA\t855 D\tW143275-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/RCAE4VH-0792-b.mp3\tDick Collins And The Runaway Herd\tAngel Eyes\tRCA VICTOR\t547-0459\tE4VH-0792-b\t1955\tformerly of Woody Herman Orchestra\nhttp://www.jazz-on-line.com/a/mp3c/BLU068834.mp3\tGlenn Miller & His Orchestra\tAngel Of Mercy\tBLUEBIRD\t11429\t068834\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_436.mp3\tPeggy King\tAngel Pie (postillion)\tColumbia\t40638\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_215.mp3\tDon, Dick And Jimmy\tAngela Mia\tCrown\t104\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_288.mp3\tRalph Flanagan And His Orchestra; Vocal Refrain By Buddy Victor And The Singing Winds\tAngela Mia\tRCA VICTOR\t5676\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D373B1.mp3\tLouis Prima And His Orchestra\tAngelina\tV-DISC\t373B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_227.mp3\tLouis Prima And His Orchestra\tAngelina\tV-DISC\t373B1\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/HITT440-2.mp3\tLouis Prima And His Orch\tAngelina (v L P)\tHIT OF THE WEEK\t7106\tT440-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_118.mp3\tArt Kassel And His \"kassels-in-the-air\"\tAngeline\tBluebird\t11356\t070322\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu70322.mp3\tArt Kassel & His Kassels\tAngeline\tBluebird\t11356\t70322\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11913-A.mp3\tCab Calloway And His Orchestra\tAngeline\tBanner\t32910\t11913-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_076.mp3\tCrew-cuts\tAngels In The Sky\tMercury\t70741\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_065.mp3\tCab Calloway And His Orchestra\tAngels With Dirty Faces\tVOCALION\t4498\tM911\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-911-1.mp3\tCab Calloway And His Orchestra\tAngels With Dirty Faces\tVocalion\t4498\tM-911-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030326.mp3\tTommy Dorsey & His Orchestra\tAngels With Dirty Faces (v E W)\tVICTOR\t26115\t030326\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEWC3115.mp3\tChampion Jack Dupree\tAngola Blues\tOKEH\t5823\tWC3115\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16708.mp3\tLeadbelly (h.ledbetter)\tAngola Blues\tARC\t(Reject)\t16708\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/PER14480.mp3\tSeven Missing Links\tAngry\tPerfect\t14480\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/GENG11539-A.mp3\tNew Orlean Rhythm Kings\tAngry\tGENNETT\t5219\tG11539-A\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW140727.mp3\tArt Gillham (whispering Piano)\tAngry\tCOLUMBIA\t411D\tW140727\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66831.mp3\tBob Crosby & His Orchestra\tAngry\tDECCA\t2839B\t66831\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_208.mp3\tTiny Hill And His Orchestra\tAngry\tMERCURY\t1053\t141\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_170alt.mp3\tTed Lewis And His Band\tAngry\tCOLUMBIA\t416D\tW140711-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_260.mp3\tKay Starr\tAngry\tCapitol\t1677\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_074.mp3\tArt Gillham\tAngry\tCOLUMBIA\t411D\tW140727\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0629_01.mp3\tLee Morse\tAnimal Crackers\tPerfect\t11624A\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038211.mp3\tFats Waller And His Rhythm\tAnita\tBLUEBIRD\t10369B\t038211\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS24677-A.mp3\tJohn Kirby And His Orchestra\tAnitra's Dance\tCBS\tVO4890\t24677-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu051523-1.mp3\tEarl Hines And His Orchestra\tAnn\tBluebird\tB-10870\t051523-1\t1940\tWalter Fuller (tp,vcl) Shirley Clay, Ed Sims (tp) George Dixon (tp,as) Ed Burke, John Ewing, Joe McLewis (tb) Omer Simeon (cl,bar) Leroy Harris (as,vcl) Jimmy Mundy (ts,arr) Robert Crowder (ts) Earl Hines (p) Claude Roberts (g) Quinn Wilson (b) Alvin Burroughs (d) Billy Eckstine, Leroy Harris (vcl) Buster Harding, Edgar Battle (arr)\nhttp://www.jazz-on-line.com/a/mp3b/COL41106AL.mp3\tFrankie Laine\tAnnabell Lee\tCOLUMBIA\t41106\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC78319-1.mp3\tPaul Whiteman Presents Ramona\tAnnie Doesn't Live Here Any More\tVICTOR\t24445\t78319-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/CON14223-1.mp3\tArt Kahn's Orch (bullock)\tAnnie Doesn't Live Here Any More (vcb)\tCONQUEROR\t8279\t14223-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC616-1.mp3\tGuy Lombardo Royal Canadians\tAnnie Doesn't Live Here Anymore (v3)\tBRUNSWICK\t6662\tC616-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA1013-A.mp3\tJimmie Lunceford And His Orchestra\tAnnie Laurie\tDECCA\t1569\tDLA1013-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC019617.mp3\tTommy Dorsey & His Orchestra\tAnnie Laurie\tVICTOR\t25774\t019617\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_099.mp3\tJohn Mccormack\tAnnie Laurie\tVICTOR\t64138\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21474-1.mp3\tMaxine Sullivan And Her Orchestra\tAnnie Laurie\tVocalion\t3679\t21474-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA-I013-A.mp3\tJimmie Lunceford And His Orchestra\tAnnie Laurie\tDecca\t1569\tDLA-I013-A\t1937\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3a/WES105y.mp3\tLu Watters's Yerba Buena Jazz B\tAnnie Street Rock\tWest Coast\t105\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2172.mp3\tDinah Shore\tAnniversary Song\tCOLUMBIA\t37234\tHCO2172\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5649-2.mp3\tArtie Shaw And His New Music (vocal Mel Torme)\tAnniversary Song\tMUSICRAFT\t428\t5649-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2126x.mp3\tTex Beneke And His Orch.\tAnniversary Song\tRCA\t20-2126\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/BluST-2091-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tAnniversary Song\tBlue Star\t33\tST-2091-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP1594.mp3\tAndy Russell And Paul Weston\tAnniversary Song\tCAPITOL\t\t1594\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_013.mp3\tDinah Shore\tAnniversary Song\tCOLUMBIA\t37234\tHCO2172\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_039.mp3\tTex Beneke And The Glenn Miller Orchestra Feat. Garry Stevens And The Mello Larks\tAnniversary Song\tRCA Victor\t2126\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18602-2.mp3\tFrankie Trumbauer And His Orchestra\tAnnouncers' Blues\tBRUNSWICK\t7629\t18602-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVD830.mp3\tCharlie Parker Quintette\tAnother Hair-do\tSAVOY\t961A\tD830\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_182.mp3\tTommy Dorsey And His Orchestra\tAnother One Of Them Things\tVICTOR\t1553\t055567-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC02171.mp3\tTommy Dorsey & His Orchestra\tAnother Perfect Night Is Ending\tVICTOR\t25446\t02171\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10520.mp3\tFrankie Laine\tAnswer Me Lord Above\tCOLUMBIA\t40079\tRHCO10520\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_031.mp3\tNat ''king'' Cole Feat. Nelson Riddle's Orchestra\tAnswer Me, My Love\tCAPITOL\t2687\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL737.mp3\tHi-flyers\tAnswer To It Makes No Difference\tVOCALION\t4703\tDAL737\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38092.mp3\tClaude Thornhill\tAnthropology\tCOLUMBIA\t38224\tCO38092\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480600.mp3\tArt Pepper\tAnthropology\tContemporary\tM3568\t\t1959\tMarty Paich, Ar, Art Pepper, Cl, As, Jack Sheldon, Tp, Bob Envoldsen, Ts, VTb, Russ Freeman, P, Bill Perkins, Ts, Bud Shank, As, Al Porcino, T, Joe Mondragon, B, Vince DeRosa, Fh, Med Flory, Bar, Dick Nash, Tb, Mel Lewis, D\nhttp://www.jazz-on-line.com/a/mp3a/CAP40258.mp3\tTenn Ernie Ford\tAnticipated Blues\tCAPITOL\t40258\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCM500.mp3\tLecuona Cuban Boys\tAntillana\tCOLUMBIA\t36129\tCM500\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU058172.mp3\tGlenn Miller And His Orchestra\tAnvil Chorus\tBLUEBIRD\t10982\t058172\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU058173.mp3\tGlenn Miller And His Orchestra\tAnvil Chorus Pt.2\tBLUEBIRD\t10982\t058173\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69831.mp3\tAndrews Sisters\tAny Bonds Today?\tDECCA\t4044A\t69831\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70614-1.mp3\tTed Weems & His Orchestra\tAny Corner Is A Cozy Little Corner\tVICTOR\t22829\t70614-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/VIC20083.mp3\tWaring's Pennsylvanians\tAny Ice Today, Lady\tVICTOR\t20083\t35522-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_050alt.mp3\tAmerican Quartet Feat. Billy Murray\tAny Little Girl That's A Nice Girl Is The Right Little Girl For Me\tVICTOR\t16560B\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_050.mp3\tAmerican Quartet (ft. Billy Murray)\tAny Little Girl That's A Nice Girl Is The Right Little Girl For Me\tVICTOR\t16560B\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB9143-1.mp3\tBilly Murray And American Qt\tAny Little Girls That's A Nice Little Girl\tVICTOR\t16560B\tB9143-1\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_004.mp3\tWill Denny\tAny Old Place I Hang My Hat Is ''home, Sweet Home'' To Me\tGram-o-Phone\t956\t\t1901\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0625_02.mp3\tLee Morse\tAny Old Place Is Lovers Lane\tPathe\t025151B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77677.mp3\tPeerless Qt\tAny Old Place The Gang Goes\tCOLUMBIA\tA-2514\t77677\t1918\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D399A1.mp3\tArtie Shaw And His Orchestra\tAny Old Time\tV-DISC\t399A1\t024083-1\t1938\tvocal Billie Holiday\nhttp://www.jazz-on-line.com/a/mp3a/V-D179x.mp3\tBillie Holiday W Artie Shaw\tAny Old Time\tV-DISC\t179\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP1213.mp3\tNat King Cole Qt\tAny Old Time\tV-DISC\t455\tVP1213\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC11385-2.mp3\tBilly Murray\tAny Place The Old Flag Flies\tVICTOR\t17031\t11385-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_141.mp3\tArthur Fields And Peerless Quartet\tAny Place The Old Gang Goes (i'll Be There)\tColumbia\t2514\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64348.mp3\tBob Howard & His Orchestra\tAny Rags\tDECCA\t2112A\t64348\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_005.mp3\tArthur Collins\tAny Rags?\tVICTOR\t16215\tB0592-5\t1903\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAVI204359.mp3\tEddie Fisher\tAny Time\tRCA\t20-4359\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_019.mp3\tEddie Fisher\tAny Time\tRCA\t20-4359\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC024067.mp3\tLionel Hampton & His Orchestra\tAny Time At All\tVICTOR\t26039\t024067\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic024067-1.mp3\tLionel Hampton And His Orchestra\tAny Time At All\tVictor\t26039\t024067-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN13041-1.mp3\tChick Bullock's Levee Loungers\tAny Time, Any Day, Anywhere\tBANNER\t32696\t13041-1\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-12775-A.mp3\tDuke Ellington And His Famous Orchestra\tAny Time, Any Day, Anywhere\tBrunswick\t6467\tB-12775-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81283-3.mp3\tBessie Smith\tAny Woman's Blues\tCOLUMBIA\t13001 D\t81283-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_287.mp3\tDoris Day\tAnyone Can Fall In Love\tCOLUMBIA\t40300\tRHCO10893\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU066881-1.mp3\tUna Mae Carlisle\tAnything\tBLUEBIRD\t11257\t066881-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38388-A.mp3\tArt Tatum Swingsters\tAnything For You\tDECCA\t1373\t38388-A;C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC84774.mp3\tPaul Whiteman And His Orchestra\tAnything Goes\tVICTOR\t24770\t84774\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC86065-2.mp3\tCole Porter\tAnything Goes\tVICTOR\t24825\t86065-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/PatCPT-2145-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tAnything Goes\tPath\tPA-669\tCPT-2145-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC24770.mp3\tPaul Whiteman & His Orchestra\tAnything Goes\tVICTOR\t24770\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC24825.mp3\tCole Porter\tAnything Goes\tVICTOR\t24825\t86065-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh084.mp3\tLew Stone And His Band\tAnything Goes (v  The Radio Three)\tRegal Zonophone\tMR-1737\tCAR-3467-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_105.mp3\tAmerican Quartet\tAnything Is Nice If It Comes From Dixie\tVictor\t18589\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC92091.mp3\tVillage Boys\tAnything Thats Part Of You\tDECCA\t5834\tC92091\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM50S3003.mp3\tBetty Hutton & Howard Keel\tAnything You Can Do\tMGM\t30231\t50S3003\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4377.mp3\tBing Crosby & Andrew Sisters\tAnything You Can Do, I Can Do Better\tDECCA\t40039\tL4377\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/EDI18675-A.mp3\tOreste And His Queensland Orchestra\tAnything You Say\tEDISON\t52383\t18675-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_135.mp3\tCliff Edwards\tAnything You Say\tCOLUMBIA\t1427 D\tW146396-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC3683.mp3\tJimmie Noone Apex Club Orchestra\tAnything You Want (forevermore)\tVOCALION\t15823\tC3683\t1929\t\nhttp://www.jazz-on-line.com/mp3/376125454.mp3\tEddy Arnold\tAnytime\tRCA\t20-2700\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU94524.mp3\tBoots And His Buddies\tAnytime\tBLUEBIRD\t6132B\t94524\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_134.mp3\tEddy Arnold\tAnytime\tRCA\t20-2700\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL914.mp3\tJoe Morris\tAnytime Any Place\tATLANTIC\t914\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe403744-B.mp3\tCasa Loma Orchestra\tAnytime's The Time To Fall In Love\tOKeh\t41373\t403744-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/COL490039-A.mp3\tCasa Loma Orchestra\tAnytime's The Time To Fall In Love\tCOLUMBIA\tOD36044\t490039-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62061.mp3\tGlenn Miller's Orchestra\tAnytime, Anyday, Anywhere\tDECCA\t1284\t62061\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_165.mp3\tElvis Presley\tAnyway You Want Me (that's How I Will Be)\tRCA\t6643\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_309.mp3\tMel Torme\tAnywhere I Wander\tCapitol\t2263\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/Gre3933-A.mp3\tCliff Jackson And His Krazy Kats\tApart From You\tGrey Gull\t1868\t3933-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_187.mp3\tNervous Norvus\tApe Call\tDot\t15485\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP2749.mp3\tJimmie Blythe\tApe Man\tPARAMOUNT\t12428\tP2749\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BRS-1008x.mp3\tJimmy Noone And His Orchestra\tApex Blues\tBritish Rhythm Socie\tBRS-1008\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17180H.mp3\tThe Dutch Swing College Band\tApex Blues\tPhilips\tP17180H\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM1475-C.mp3\tThe Dutch Swing College Band\tApex Blues\tDecca\tM32385\tAM1475-C\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC69708.mp3\tLucky Millinder And His Orchestra\tApollo Jump\tDECCA\t18529B\t69708\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69708-A.mp3\tLucky Millinder And His Orchestra\tApollo Jump\tDecca\t18529\t69708-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC4213hpp.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tAppel Direct\tDECCA\tF-6875\t4213hpp\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COL30239x.mp3\tBig Three Trio\tAppetite Blues\tCOLUMBIA\t30239\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403079-B.mp3\tJoe Venuti's Blue Five\tApple Blossoms\tOKeh\t41361\t403079-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO34289-1.mp3\tWoody Herman And His Orchestra\tApple Honey\tCOLUMBIA\t36803\tCO34289-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/CONM906-2.mp3\tCab Calloway & His Orchestra\tApril In My Heart\tCONQUEROR\t9089\tM906-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU23688-2.mp3\tTeddy Wilson & His Orchestra\tApril In My Heart\tBRUNSWICK\t8265\t23688-2\t\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-906-1.mp3\tCab Calloway And His Orchestra\tApril In My Heart\tVocalion\t4477\tM-906-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23688-1.mp3\tTeddy Wilson And His Orchestra\tApril In My Heart\tBrunswick\t8265\tB-23688-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14406.mp3\tFreddy Martin And His Orchestra\tApril In Paris\tBRUNSWICK\t6717\t14406\t1933\t\nhttp://www.jazz-on-line.com/mp3/96751213.mp3\tCharlie Parker String Ensemble\tApril In Paris\tMERCURY\t11037\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D134.mp3\tTommy Dorsey & His Orchestra\tApril In Paris\tV-DISC\t134\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1761-1.mp3\tBuster Bailey Sextet\tApril In Paris\tVARSITY\t8337\tUS1761-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP573.mp3\tColeman Hawkins & His Orchestra\tApril In Paris\tCAPITOL\t\t573\t\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC066875.mp3\tLeo Reisman & His Orchestra\tApril In Paris\tVICTOR\t27627\t066875\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC049690.mp3\tArtie Shaw And His Orchestra\tApril In Paris\tVICTOR\t26654\t049690-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB2659.mp3\tColeman Hawkins Allstars\tApril In Paris\tRCA\t20-3057\tD7VB2659\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic049690-1.mp3\tArtie Shaw And His Orchestra\tApril In Paris\tVictor\t26654\t049690-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_199.mp3\tCount Basie\tApril In Paris\tClef\t89162\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_497.mp3\tModernaires\tApril In Paris\tCoral\t61599\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480403.mp3\tBenny Golson\tApril In Paris\tNewJazz\tNJLP8248\t1968\t1959\tBenny Golson (ts), Tommy Flanagan (p), Doug Watkins (sb), Art Taylor (dm)\nhttp://www.jazz-on-line.com/a/mp3a/CAP2374X.mp3\tLes Baxter\tApril In Portugal\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC84356.mp3\tLouis Armstrong\tApril In Portugal\tDECCA\t28704\t84356\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_013.mp3\tLes Baxter And His Orchestra\tApril In Portugal\tCapitol\t2374\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_076.mp3\tVic Damone Feat. David Carroll's Orchestra\tApril In Portugal\tMERCURY\t70128\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC048758.mp3\tTommy Dorsey And His Orchestra\tApril Played The Fiddle\tVICTOR\t26606\t048758\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1982.mp3\tBing Crosby\tApril Played The Fiddle\tDECCA\t3161B\tDLA1982\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_078.mp3\tBing Crosby\tApril Played The Fiddle\tDECCA\t3161B\tDLA1982\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048488.mp3\tGlenn Miller & His Orchestra\tApril Played The Fiddle (vre)\tBLUEBIRD\t10694 A\t048488\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80041.mp3\tAl Jolson\tApril Showers\tCOLUMBIA\tA-3500\t80041\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3913.mp3\tAl Jolson - Carmen Dragon\tApril Showers\tDECCA\t23470\tL3913\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D306B1.mp3\tAl Jolson\tApril Showers\tV-DISC\t306B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BruLA-1764-A.mp3\tGene Krupa And His Orchestra\tApurksody\tBrunswick\t8296\tLA-1764-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU056462.mp3\tLarry Clinton And His Orchestra\tArab Dance\tBLUEBIRD\t10927\t056462\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic16803a.mp3\tHarry Macdonough\tArab Love Song\tVictor\t16803\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3d/DecB-13352-A.mp3\tSpike Hughes And His Negro Orchestra With Benny Carter\tArabesque \tDecca \tF-3639\tB-13352-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S3030.mp3\tSlim Gaillard Trio\tArabian Boogie\tMGM\t10017\t47S3030\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC51973-2.mp3\tDuke Ellington And His Orchestra\tArabian Lover\tVICTOR\t38079\t51973-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic51973-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tArabian Lover\tVictor\tV-38079\t51973-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5731-1-2.mp3\tFletcher Henderson & His Orchestra\tAraby\tBANNER\t1470\t5731-1-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban5731-1.mp3\tFletcher Henderson And His Orchestra\tAraby\tBanner\t\t5731-1  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480820.mp3\tCarmen Miranda And The Bando Da Lua\tArca De Noe\tDECCA\t23210-B\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81368-1.mp3\tAl Jolson\tArcady\tCOLUMBIA\t43D\t81368-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_070.mp3\tAl Jolson\tArcady\tCOLUMBIA\t43D\t81368-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011094.mp3\tTommy Dorsey & His Orchestra\tAre All My Favorite Bands Playing\tVICTOR\t25632\t011094\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35243.mp3\tGene Krupa & His Orchestra\tAre These Really Mine\tCOLUMBIA\t36890\tCO35243\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_180.mp3\tVaughn Monroe And His Orchestra\tAre These Really Mine?\tVictor\t20-1736\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC3521.mp3\tCab Calloway & His Orchestra\tAre You All Reet\tOKEH\t6035\tC3521\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69851.mp3\tKing Cole Trio\tAre You Fer It?\tDECCA\t60109\t69851\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35539-B.mp3\tVictor Military Band\tAre You From Dixie\tVictor\t35539-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC16901-2.mp3\tBilly Murray-irving Kaufman\tAre You From Dixie ?\tVICTOR\t17942\t16901-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/COL77674.mp3\tHenry Burr (tenor)\tAre You From Heaven\tCOLUMBIA\tA-2513\t77674\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_032.mp3\tHenry Burr\tAre You From Heaven?\tVICTOR\t18435\t21290-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC038188.mp3\tTommy Dorsey & His Orchestra\tAre You Having Any Fun?\tVICTOR\t26335\t038188\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_078.mp3\tTommy Dorsey And His Orchestra\tAre You Having Any Fun?\tVICTOR\t26335\t038188\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28515.mp3\tCab Calloway & His Orchestra\tAre You Hep To Jive\tOKEH\t5804\t28515\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19307.mp3\tCab Calloway & His Orchestra\tAre You In Love With Me\tBRUNSWICK\t7685\t19307\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1061-1.mp3\tDjango Reinhardt\tAre You In The Mood\tGramophone\tK-7707\tOLA-1061-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-411-1.mp3\tDjango Reinhardt And His American Swing Band\tAre You In The Mood?\tSWING\t208\tOSW-411-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_108.mp3\tHenry Burr\tAre You Lonesome To-night?\tVICTOR\t20873\t39941\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S6062.mp3\tBlue Barron And His Orchestra\tAre You Lonesome Tonight\tMGM\t10628\t49S6062\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC61130-A.mp3\tCarter Family\tAre You Lonesome Tonight\tDECCA\t5240\t61130-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec5240.mp3\tCarter Family\tAre You Lonesome Tonight\tDecca\t5240\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC39941.mp3\tHenry Burr\tAre You Lonesome Tonight ?\tVICTOR\t20873\t39941\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/EDI11734-B.mp3\tVaughn De Leath - Pf\tAre You Lonesome Tonight?\tEDISON\t\t11734-B\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_040.mp3\tVaughn Deleath\tAre You Lonesome Tonight?\tEDISON\t52044\t11734\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/CON14023-1.mp3\tChick Bullock Levee Loungers\tAre You Makin' Any Money?\tCONQUEROR\t8217\t14023-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC24365.mp3\tPaul Whiteman & His Orchestra\tAre You Making Any Money\tVICTOR\t24365\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC76673-1.mp3\tPaul Whiteman & His Orchestra\tAre You Making Any Money (v Ramona)\tVICTOR\t24365\t76673-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71243.mp3\tLucky Millinder & His Orchestra\tAre You Ready?\tDECCA\t18529A\t71243\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71243-A.mp3\tLucky Millinder And His Orchestra\tAre You Ready?\tDecca\t18529\t71243-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480434.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tAre You Real\tBlue Note\tTOCJ-5857\tTk 1\t1958\tArt Blakey, D, Benny Golson, Ts, Lee MOrgan, T, Bobbie Timmons, P, Jymie Merritt, B\nhttp://www.jazz-on-line.com/a/mp3t/TS480465.mp3\tBenny Golson Quintet\tAre You Real?\tRiverside\tRLP12-290\t\t1958\tCurtis Fuller (tb), Benny Golson (ts), Barry Harris (p), Jymie Merritt (sb), Philly Joe Jones\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1813.mp3\tTed Daffan's Texans\tAre You Satisfied Now?\tCOLUMBIA\t20181\tHCO1813\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_417.mp3\tToni Arden\tAre You Satisfied?\tRCA Victor\t6346\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_240.mp3\tSheb Wooley\tAre You Satisfied?\tMGM\t12114\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_088.mp3\tByron G. Harlan\tAre You Sincere?\tEDISON\t9973\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0600_02.mp3\tLee Morse\tAre You Sorry\tPerfect\t11581A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_110.mp3\tBen Bernie And His Orchestra\tAre You Sorry?\tVOCALION\t15036A\tNN792\t1925\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW140702.mp3\tPaul Specht's Georgians\tAre You Sorry?\tCOLUMBIA\t408D\tW140702\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D061284-1.mp3\tDuke Ellington Orchestra\tAre You Sticking?\tV-DISC\t067\t061284-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC90217.mp3\tJimmie Davis & Buddy Jones\tAre You Tired Of Me Darlin\tDECCA\t5155A\tC90217\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1535.mp3\tLes Brown & Doris Day\tAren't You Glad You're You\tCOLUMBIA\t36875\tHCO1535\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3961.mp3\tBing Crosby - J.s.trotter\tAren't You Glad You're You?\tDECCA\t18720A\tL3961\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_144.mp3\tLes Brown And His Orchestra Feat. Doris Day\tAren't You Glad You're You?\tCOLUMBIA\t36875\tHCO1535\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_204.mp3\tTommy Dorsey And His Orchestra\tAren't You Glad You're You?\tVictor\t1728\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36906.mp3\tGene Krupa & His Orchestra\tAren't You Kinda Glad We Did It\tCOLUMBIA\t37158\tCO36906\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC56746-1.mp3\tPaul Tremaine And His Aristocats\tAristocratic Stomp\tVICTOR\t40176\t56746-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC56746-1HP1-6.mp3\tPaul Tremaine And His Aristocrats\tAristocratic Stomp\tVICTOR\t40176\t56746-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/CONW24230-1.mp3\tMildred Bailey & Her Orchestra\tArkansas Blues\tCONQUEROR\t9217\tW24230-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN027AB.mp3\tJames P Johnson\tArkansas Blues\tBLUENOTE\tBN027\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/KIR2521-A.mp3\tUniversity Six\tArkansas Blues\tKIRKEBY\tLI2674\t2521-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS10195-1.mp3\tMckenzie's Mound City Blue Blowers\tArkansas Blues\tCBS\tD-77\t10195-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_172.mp3\tFiddlin' John Carson Feat. The Virginia Reelers\tArkansas Traveler\tOKeh\t40108\t8613\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/ManA-1691.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tArleen\tManor\t1138\tA-1691\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_267.mp3\tJoe Reisman And His Orchestra\tArmen's Theme\tRCA\t6740\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic82528-1.mp3\tFats Waller And His Rhythm\tArmful O'sweetness\tVictor\t24641\t82528-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC82528-1.mp3\tFats Waller And His Rhythm\tArmful Of Sweetness\tVICTOR\t24641B\t82528-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D264AAA.mp3\tGlenn Miller Army Air Force Band\tArmy Air Corps Song\tV-Disc\t264A\t\t1944-\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1281.mp3\tArnett Cobb & His Orchestra\tArnett Blows For 1300\tAPOLLO\t781\tR1281\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW150569.mp3\tBen Selvin And His Orchestra\tAround The Corner\tCOLUMBIA\t2221 D\tW150569\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_127.mp3\tTom Gerun And His Orchestra\tAround The Corner\tBRUNSWICK\t4829\tC5764\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_095.mp3\tPeerless Quartet\tArrah Go On, I'm Going Back To Oregon\tVictor\t18046\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC17427-5.mp3\tPeerless Qt\tArrah Go On, I'm Gonna Go Back To Oregon\tVICTOR\t18046\t17427-5\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO32565.mp3\tRed Norvo\tArthur Murray Taught Me Dancing In A Hurry\tCOLUMBIA\t36557\tCO32565\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/VSMOSW-401-1.mp3\tDjango' Music\tArtillerie Lourde\tLa Voix De Son Matr\t\tOSW-401-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP159x.mp3\tStan Kenton\tArtistry In Rhythm\tCAPITOL\t159\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_247.mp3\tStan Kenton And His Orchestra\tArtistry In Rhythm\tCapitol\t15190\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP778.mp3\tStan Kenton's Orchestra\tArtistry Jumps\tCAPITOL\t\t778\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_185.mp3\tStan Kenton And His Orchestra\tArtistry Jumps\tCapitol\t15190\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC102-8.mp3\tBenny Goodman And His Sextet\tAs Long As I Live\tCOLUMBIA\t36723\tC 102-8  (CO 29029)\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MELM-12949y.mp3\tWill Osborne And His Orchestra\tAs Long As I Live\tMelotone\tM-12949\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_296.mp3\tBenny Goodman Sextet Feat. P/count Basie\tAs Long As I Live\tCOLUMBIA\t35901\t29029\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481773.mp3\tAnita O'day\tAs Long As I Live\tVerve\tMGV2000\t2556-6\t1955\tacc. by Paul Smith (p), Barney Kessel (g), Joe Mondragon (sb), Alvin Stoller (dm), Buddy Bregman (arr, dir)\nhttp://www.jazz-on-line.com/a/mp3c/VIC62926-2.mp3\tBennie Moten's Kansas Orchestra\tAs Long As I Love You\tVICTOR\t22660\t62926-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_227.mp3\tTex Beneke And The Glenn Miller Orchestra Feat. V/garry Steven\tAs Long As I'm Dreaming\tRCA Victor\t2260\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14952A.mp3\tLeo Reisman And His Orch (vss)\tAs Long As You Live\tBRUNSWICK\t6789\t14952A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC019427-2.mp3\tTommy Dorsey & His Clambake 7\tAs Long As You Live\tVICTOR\t25899\t019427-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23180-1.mp3\tMildred Bailey\tAs Long As You Live\tCBS\tVO4253\t23180-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63777-A.mp3\tLouis Armstrong And His Orchestra\tAs Long As You Live, You'll Be Dead If You Die\tDecca\t2230\t63777-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT575.mp3\tLouis Prima & His Orchestra\tAs Mr Mason Said To Mr Dixon\tMAJESTIC\t7159\tT575\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_148.mp3\tJacques Renard And His Orch.\tAs Time Goes By\tBrunswick\t6205\tE37251-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_080.mp3\tRay Anthony\tAs Time Goes By\tCapitol\t2104\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D125A1.mp3\tSpike Jones And His City Slickers\tAs Time Goes By\tV-DISC\t125A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC70128-1.mp3\tRudy Vallee & His Ct.yankees\tAs Time Goes By\tVICTOR\t22773\t70128-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL3218.mp3\tDooley Wilson (sam)\tAs Time Goes By\tDECCA\t40006\tL3218\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC40006.mp3\tDooley Wilson\tAs Time Goes By\tDECCA\t40006\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC20-1526.mp3\tRudy Vallee\tAs Time Goes By\tVICTOR\t20-1526\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_020.mp3\tRudy Vallee And His Connecticut Yankees\tAs Time Goes By\tVICTOR\t22773\t70128-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO40376.mp3\tSarah Vaughan\tAs You Desire Me\tCOLUMBIA\t38462\tCO40376\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_199.mp3\tDonald Novis\tAs You Desire Me\tVICTOR\t24071\t73115-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW143955-1.mp3\tCelestin's Tuxedo Orchestra\tAs You Like It\tCOLUMBIA\t14259 D\tW143955-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59031.mp3\tWashboard Rhythm Kings\tAsh Man Crawl\tVICTOR\t23367\t59031\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU96237.mp3\tWalter Davis\tAshes In My Whiskey\tBLUEBIRD\t6201\t96237\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051262-1.mp3\tErskine Hawkins & His Orchestra\tAshes In The Trash\tBLUEBIRD\t10790\t051262-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_198.mp3\tInk Spots\tAsk Anyone Who Knows\tDECCA\t23900\t73806\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_217.mp3\tMargaret Whiting\tAsk Anyone Who Knows\tCapitol\t410\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_141.mp3\tNat ''king'' Cole\tAsk Me\tCapitol\t3328\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64224-A.mp3\tMills Brothers\tAsleep In The Deep\tDECCA\t2804B\t64224-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035396.mp3\tTommy Dorsey & His Orchestra\tAsleep Of Awake\tVICTOR\t26210\t035396\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035560.mp3\tCharlie Barnet & His Orchestra\tAsleep Or Awake (vje)\tBLUEBIRD\t10206\t035560\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC56534-1.mp3\tJones And Collins Astoria Hot 8\tAstoria Strut\tVICTOR\t38576A\t56534-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC054607.mp3\tDuke Ellington & His Orchestra\tAt A Dixie Roadside Diner\tVICTOR\t26719\t054607\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_343.mp3\tDuke Ellington And His Famous Orchestra\tAt A Dixie Roadside Diner\tVICTOR\t26719\t054607\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4111.mp3\tKid Ory Creole Dixieland Band\tAt A Georgia Camp Meeting\tCOLUMBIA\t38957\tHCO4111\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_273.mp3\tTommy Dorsey And His Orchestra Feat. Cliff Weston\tAt A Little Church Affair\tVictor\t25183\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECC91689.mp3\tBob Crosby & His Orchestra\tAt A Little Hot Dog Stand\tDECCA\t2401B\tC91689\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_228.mp3\tBob Crosby And His Orchestra Feat. V/bob Crosby And Marian Mann\tAt A Little Hot Dog Stand\tDECCA\t2401B\tC91689\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_165.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly\tAt A Perfume Counter\tDECCA\t1724A\t63432\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW140908.mp3\tLeo Reisman & His Orchestra\tAt Dawning\tCOLUMBIA\t464D\tW140908\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_150.mp3\tJesse Crawford (organ)\tAt Dawning\tVICTOR\t20110\t34572-6\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80263.mp3\tBabara Maurel With Orchestra Accompaniement\tAt Eventime\tCOLUMBIA\tA3607\t80263\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1912x.mp3\tRay Anthony\tAt Last\tCAPITOL\t1912\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_021.mp3\tRay Anthony Feat. Tommy Mercer\tAt Last\tCAPITOL\t1912\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC072285.mp3\tGlenn Miller And His Orchestra\tAt Last (vre)\tVICTOR\t27934\t072285\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_139.mp3\tTed Lewis And His Band\tAt Last I'm Happy\tCOLUMBIA\t2408\tW151197-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_232.mp3\tConnee Boswell Feat. O/john Scott Trotter\tAt Least You Could Say ''hello''\tDECCA\t2613B\tDLA1785\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL26108.mp3\tJack Teagarden & His Orchestra\tAt Least You Could Say Hello\tCOLUMBIA\t35245\t26108\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU027000-1.mp3\tOzzie Nelson And His Orchestra\tAt Long Last Love\tBLUEBIRD\t7825\t027000-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_198.mp3\tLarry Clinton And His Orchestra Feat. V/bea Wain\tAt Long Last Love\tVICTOR\t26014\t024427\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_126.mp3\tEl Dorados\tAt My Front Door\tVee-Jay\t147\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_056.mp3\tPat Boone\tAt My Front Door (crazy Little Mama)\tDot\t15422 A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_063.mp3\tIsham Jones And His Orchestra\tAt Peace With The World\tBrunswick\t3199\t19205-6-8\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18983.mp3\tAl Jolson\tAt Peace With The World\tBRUNSWICK\t3196\t18983\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_033.mp3\tAl Jolson\tAt Peace With The World\tBRUNSWICK\t3196\t18983\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20476A.mp3\tGeorge Olsen And His Music\tAt Sundown\tVICTOR\t20476\tA\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043896-1.mp3\tMuggsy Spanier Ragtime Band\tAt Sundown\tBLUEBIRD\t10719A\t043896-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT978.mp3\tMildred Bailey W Ellis Larkin\tAt Sundown\tMAJESTIC\t1101\tT978\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COM1523q.mp3\tBobby Hackett\tAt Sundown\tCOMMODORE\t1523\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COMP22720.mp3\tBud Freeman Trio\tAt Sundown\tCOMMODORE\t503\tP22720\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DotA-1664.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tAt Sundown\tDot\tDLP3487\tA-1664\t1949\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480557.mp3\tBenny Goodman Trio\tAt Sundown\tCapitol\t15888\t2517-6\t1947\tBenny Goodman (cl) Teddy Wilson (p) Jimmy Crawford (d)\nhttp://www.jazz-on-line.com/a/mp3c/VIC37741.mp3\tGeorge Olsen & His Music\tAt Sundown (v3)\tVICTOR\t20476A\t37741\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_139.mp3\tArden-ohman Orchestra\tAt Sundown (when Love Is Calling Me Home)\tBRUNSWICK\t3481\t21724-5\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_236.mp3\tFranklyn Baur\tAt Sundown (when Love Is Calling Me Home)\tVICTOR\t20504\t38128\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP5115-4.mp3\tBlue Lu Barker\tAt The Animal Fair\tCAPITOL\t\t5115-4\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA2072.mp3\tOrrin Tucker And His Orchestra\tAt The Balalaika\tCOLUMBIA\t35332\tLA2072\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh147.mp3\tMaurice Winnick And His Orchestra\tAt The Cafe Continental (v Sam Costa)\tParlophone\tF-507\tCE-7705-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_294.mp3\tDinah Shore\tAt The Candlelight Cafe\tCOLUMBIA\t37984\tHCO2702\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW141283-1.mp3\tBessie Smith\tAt The Christmas Ball\tCOLUMBIA\t35842\tW141283-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEM791.mp3\tCab Calloway & His Orchestra\tAt The Clambake Carnival\tOKEH\t6896\tM791\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-791-1.mp3\tCab Calloway And His Orchestra\tAt The Clambake Carnival\tVocalion\t4437\tM-791-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101453.mp3\tTommy Dorsey & His Clambake 7\tAt The Codfish Ball\tVICTOR\t25314\t101453\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_192.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tAt The Cross-roads\tDECCA\t18467B\t71056\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1102.mp3\tLouis Prima's New Orleans Gang\tAt The Darktown Strutter's Ball\tBRUNSWICK\t7657\tLA1102\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN15571-1.mp3\tLuis Russell & His Orchestra\tAt The Darktown Strutter's Ball (vsonny Woods)\tBANNER\t33179\t15571-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe81518-B.mp3\tBix Beiderbecke And His Gang\tAt The Jazz Band Ball\tOKeh\t40923\t81518-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/PARR-2711y.mp3\tBix Beiderbecke And His Gang\tAt The Jazz Band Ball\tParlophone\tR-2711\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043375-2.mp3\tMuggsy Spanier Ragtime Band\tAt The Jazz Band Ball\tBLUEBIRD\t10518\t043375-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC21583-1.mp3\tOriginal Dixieland Jazz Band\tAt The Jazz Band Ball\tVICTOR\t18457\t21583-1\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24987ATJ.mp3\tEddie Condon & His Orchestra\tAt The Jazz Band Ball\tDECCA\t24987\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB4056.mp3\tGene Krupa's Chicago Jazz Band\tAt The Jazz Band Ball\tRCA\t20-3816\tE0VB4056\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM1711-A.mp3\tThe Dutch Swing College Band\tAt The Jazz Band Ball\tDecca\tM32610\tAM1711-A\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP565-4-A.mp3\tNappy Lamare's Louisiana Levee Loungers\tAt The Jazz Band Ball\tCAPITOL\t10025\t565-4-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC63388.mp3\tBob Crosby & His Orchestra\tAt The Jazz Band Ball\tDECCA\t1747A\t63388\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Col27689-1.mp3\tBud Freeman And His Famous Chicagoans\tAt The Jazz Band Ball\tCBS\tCo35853\t27689-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_112.mp3\tOriginal Dixieland Jazz Band\tAt The Jazz Band Ball\tVICTOR\t18457\t21583-1\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_171.mp3\tBix Beiderbecke Feat. Adrian Rollini (baritone Sax)\tAt The Jazz Band Ball\tOKeh\t40923\t81518-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-121-1.mp3\tDjango's Music\tAt The Jimmy's Bar\tSWING\t79\tOSW-121-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_057.mp3\tAmerican Quartet\tAt The Mississippi Cabaret\tVictor\t17650\t15213-1\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068833.mp3\tGlenn Miller And His Orchestra\tAt The President's Ball (vmh)\tBLUEBIRD\t11429\t068833\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65309-A.mp3\tLouis Jordan & His Tympani 5\tAt The Swing Cat's Ball\tDECCA\t7609\t65309-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_160.mp3\tWoody Herman And His Orchestra\tAt The Woodchopper's Ball\tDECCA\t2440A\t65379-B\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148985.mp3\tPaul Whiteman & His Orchestra\tAt Twilight\tCOLUMBIA\t1993\tW148985\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044598.mp3\tFats Waller And His Rhythm\tAt Twilight\tBLUEBIRD\t10803\t044598\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CON22567-1.mp3\tMildred Bailey & Her Orchestra\tAt Your Beck And Call\tCONQUEROR\t9047\t22567-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_187.mp3\tJimmy Dorsey And His Orchestra\tAt Your Beck And Call\tDecca\t1784\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BRULA1051.mp3\tBing Crosby\tAt Your Command\tBRUNSWICK\t6145\tLA1051\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_007.mp3\tBing Crosby\tAt Your Command\tBRUNSWICK\t6145\tLA1051\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70113.mp3\tAl Cooper & His Savoy Sultans\tAt's In There\tDECCA\t8615\t70113\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73648.mp3\tEddie Condon & His Orchestra\tAtlanta Blues\tDECCA\t23720\t73648\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402313-B.mp3\tNeil Montgomery\tAtlanta Lowdown\tOKeh\t8682\t402313-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC101.mp3\tPete Johnson's Allstars\tAtomic Boogie\tNATIONAL\t\tNSC101\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC21418-3.mp3\tPeerless Qt\tAu Revoir But Not Goodbye\tVICTOR\t18438\t21418-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC6185.mp3\tBen Bernie & His Orchestra\tAu Revoir Pleasant Dreams\tBRUNSWICK\t4943\tC6185\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_157.mp3\tBen Bernie And His Orchestra\tAu Revoir, Pleasant Dreams\tBRUNSWICK\t4943\tC6185\t1930\t\nhttp://www.78-tours.net/mp3/COLCL8248.mp3\tJacques Hlian Et Son Orchestre Chant : \" Jo \" Charrier Et Francine Claudel\tAu Temps De La Polka\tCOLUMBIA\tDF 3140\tCL 8248\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402314-C.mp3\tNeil Montgomery\tAuburn Avenue Stomp\tOKeh\t8682\t402314-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/CAM3705-B.mp3\tBob Finley And His Orchestra\tAudition Blues\tCAMEO\t9103\t3705-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_197.mp3\tMorton Downey\tAuf Weiderseh'n, My Dear\tMelotone\t12319\t11284-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_098.mp3\tAmes Brothers Feat. O/ray Bloch; The Sweetland Singers\tAuf Wiederseh'n Sweetheart\tCORAL\t60773\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_164.mp3\tLes Baxter And His Orchestra\tAuf Wiederseh'n Sweetheart\tCapitol\t2143\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_032.mp3\tJack Denny And His Orchestra\tAuf Wiedersehen, My Dear\tBRUNSWICK\t6114\tE36404\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/MAJTJV-9503.mp3\tNickelodeon\tAuf Wiedersehen, My Dear\tMAJOR RECORDS\t4117-B\tTJV-9503\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VICC7355.mp3\tJack Denny And His Orchestra\tAuf Wiedersehn My Dear\tVICTOR\t22917\tC7355\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/MER5871x.mp3\tEddy Howard And His Orchestra\tAuf Wiedersehn, Sweetheart\tMERCURY\t5871\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE5275x.mp3\tTiny Hill And His Orchestra\tAuld Lang Syne\tOkeh\t5275\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20-1611-A.mp3\tDinah Shore\tAuld Lang Syne\tVictor\t20-1611-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC65215.mp3\tGuy Lombardo's Royal Canadians\tAuld Lang Syne\tDECCA\t2478B\t65215\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_025.mp3\tFrank Stanley\tAuld Lang Syne\tCOLUMBIA\tA-0436\t03731-1\t1907\t\nhttp://www.jazz-on-line.com/a/mp3c/SUPC3101.mp3\tKing Oliver Dixie Syncopators\tAunt Hagar's Blues\tSUPERTONE\t2235s\tC3101\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80970-3.mp3\tTed Lewis & His Jazz Band\tAunt Hagar's Blues\tCOLUMBIA\tA-3879\t80970-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_070.mp3\tTed Lewis And His Band\tAunt Hagar's Blues\tCOLUMBIA\t2113 D\tW149784-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI7779.mp3\tPremier Quartette (incl. Billy Murray) - O\tAunt Jemima's Jubilee\tEDISON\t\t7779\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_090.mp3\tArthur Collins And Byron Harlan\tAuntie Skinner's Chicken Dinner\tVICTOR\t17755\t15747-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68827.mp3\tAndrews Sisters\tAurora\tDECCA\t3732A\t68827\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_208.mp3\tAndrews Sisters\tAurora\tDECCA\t3732A\t68827\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_314.mp3\tFrank Sinatra\tAutumn In New York\tCOLUMBIA\t38316\tCO38483\t1949\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480644.mp3\tAhmad Jamal\tAutumn In New York\tArgo\tLP-636\t9035\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3w/1955_191.mp3\tVictor Young And His Singing Strings\tAutumn Leaves\tDecca\t29653\tL8634\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_008.mp3\tRoger Williams\tAutumn Leaves\tKapp\t116\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_197.mp3\tRay Charles Singers\tAutumn Leaves\tMGM\t12068\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_186.mp3\tMitch Miller And His Orchestra\tAutumn Leaves\tColumbia\t50033\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_181.mp3\tSteve Allen With George Cates And His Orchestra And Chorus\tAutumn Leaves\tCoral\t61485\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_188.mp3\tJackie Gleason And His Orchestra\tAutumn Leaves\tCapitol\t3223\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480466.mp3\tAhmad Jamal\tAutumn Leaves\tArgo\tLP 2638\t9026\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3t/TS480435.mp3\tArt Farmer Quartet\tAutumn Nocturne\tPrestige\tLP193\t638\t1954\tArt Farmer (tp), Wynton Kelly (p), Addison Farmer (sb), Herbie Lovelle (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1945_213.mp3\tHarry James And His Orchestra\tAutumn Serenade\tCAPITOL\t\t14732\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_216.mp3\tPerry Como\tAva Maria\tRCA Victor\t78-0436\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D263B.mp3\tCoast Guard Training Station Band\tAvailable Jones\tV-DISC\t263B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP5562.mp3\tBenny Goodman Qt\tAvalon\tCOLUMBIA\t39278\tZSP5562\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79371.mp3\tAl Jolson\tAvalon\tCOLUMBIA\tA-2995\t79371\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-2995.mp3\tAl Jolson\tAvalon\tCOLUMBIA\tA-2995\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09627-2.mp3\tBenny Goodman Qt\tAvalon\tVICTOR\t25644\t09627-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUCP1106.mp3\tCab Calloway & His Orchestra\tAvalon\tBRUNSWICK\t7411\tCP1106\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65184.mp3\tTony Martin - Abe Lyman\tAvalon\tDECCA\t2434B\t65184\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VAREL4083sA.mp3\tWillie Lewis & Negro Band\tAvalon\tVARSITY\tEL4083s\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8942av.mp3\tCharlie Ventura & His Orchestra\tAvalon\tMERCURY\t8942\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE26693.mp3\tRed Nichols & His 5 Pennies\tAvalon\tBRUNSWICK\t6681\tE26693\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77434.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tAvalon\tUltraphone\tAP-1512\tP-77434\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU87765.mp3\tKxyz Novelty Band\tAvalon\tBLUEBIRD\t5831\t87765\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC60014.mp3\tJimmie Lunceford And His Orch\tAvalon\tDECCA\t668B\t60014\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUB-15655-A.mp3\tCasa Loma Orchestra\tAvalon\tBRUNSWICK\t7532\tB-15655-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/COL79441-3.mp3\tArt Hickman's Orchestra\tAvalon\tCOLUMBIA\tA-3322\t79441-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D224B2.mp3\tSammy Kay And His Orchestra\tAvalon\tV-DISC\t224B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/BruCP-1106-A.mp3\tCab Calloway And His Orchestra\tAvalon\tBrunswick\t7411\tCP-1106-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOLA-1959-1.mp3\tAlix Combelle Et Son Orchestre\tAvalon\tSwing\t24\tOLA-1959-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-25060-1.mp3\tHarry James And His Orchestra\tAvalon\tBrunswick\t\tB-25060-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480656.mp3\tBenny Goodman Quartet\tAvalon\tColumbia\tSL 160\t\t1938\tCarnegie Hall Concert?:<br>Benny Goodman (cl), Teddy Wilson (p), Gene Krupa (dm), Lionel Hampton (vib)\nhttp://www.jazz-on-line.com/a/mp3w/1929_061.mp3\tGus Arnheim And His Orchestra\tAvalon Town\tOKeh\t41174\t402228\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_151.mp3\tClicquot Club Eskimos Feat. Tom Stacks\tAvalon Town\tCOLUMBIA\t1592\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA28-0436x.mp3\tPerry Como\tAve Maria\tRCA\t28-0436\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2458.mp3\tGracie Fields\tAve Maria\tDECCA\t23896\tDLA2458\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO45114.mp3\tSarah Vaughan\tAve Maria\tCOLUMBIA\t39207\tCO45114\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3816.mp3\tBing Crosby - V.young Orch.\tAve Maria\tDECCA\t18705A\tL3816\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/BruJC-8527-A.mp3\tCab Calloway And His Orchestra\tAw You Dawg\tBrunswick\t6292.\tJC-8527-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUJC8527.mp3\tCab Calloway & His Orchestra\tAw, You Dawg!\tBRUNSWICK\t6292\tJC8527\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_414.mp3\tAl Hibbler\tAway All Boats\tDecca\t29950\t89917\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC89917.mp3\tAl Hibbler\tAway All Boats\tDECCA\t29950\t89917\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_145.mp3\tVincent Lopez And His Orchestra\tAway Down East In Maine\tOkeh\t4736\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64825.mp3\tRodney Sturgis & Jordon's Band\tAway From You\tDECCA\t7579\t64825\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VicD9VB-1752.mp3\tLucky Millinder And His Orchestra\tAwful Natural\tVictor\t20-3526\tD9VB-1752\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE28441.mp3\tDuke Ellington & His Orchestra\tAwful Sad\tBRUNSWICK\t4110\tE28441\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC043928.mp3\tBunny Berigan & His Orchestra\tAy Ay Ay\tVICTOR\t26753B\t043928\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE32276.mp3\tCount Basie & His Orchestra\tAy Now\tOKEH\t6626\t32276\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022486.mp3\tBunny Berigan & His Orchestra\tAzure\tVICTOR\t25848B\t022486\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM787.mp3\tCab Calloway & His Orchestra\tAzure\tVOCALION\t4100\tM787\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_218.mp3\tDuke Ellington And His Famous Orchestra\tAzure\tMASTER\t131\tM471\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D744BFB.mp3\tCount Basie & His Orchestra\tB Flat Blues\tV-DISC\t744\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480579.mp3\tBenny Golson\tB. G.'s Holiday\tContemporary\tC3552\t\t1957\tArt Farmer (tp), Benny Golson (ts), Wynton Kelly (p), Paul Chambers (sb), Charlie Persip (dm)\nhttp://www.jazz-on-line.com/a/mp3b/Blu060353-1.mp3\tBenny Carter And His Orchestra\tBabalu\tBluebird\tB-11090\t060353-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_206.mp3\tXavier Cugat And His Waldorf-astoria Orchestra Feat. Miguelito Valdes\tBabalu\tCOLUMBIA\t36068\tCO29946\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/DECFO-1785-R.mp3\tDjango Reinhardt Et Son Quintette Du Hot Club De France\tBabik (bi-bop)\tDECCA\t9242\tFO-1785-R\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC93596.mp3\tKing Cole Trio\tBabs\tDECCA\t60109\tC93596\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC39996-A.mp3\tJimmie Lunceford And His Orchestra\tBabs\tDECCA\t576A\t39996-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC86080.mp3\tElla Fitzgerald W G.jenkins\tBaby\tDECCA\t29108\t86080\t\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe08902-A.mp3\tNew Orleans Rhythm Kings\tBaby\tOKeh\t40422\t08902-A\t1923\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol1721-D.mp3\tGuy Lombardo & His Royal Canadians\tBaby\tColumbia\t1721-D\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_092.mp3\tTeresa Brewer Feat. Jack Pleis Orchestra\tBaby Baby Baby\tCoral\t61067\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC87083-3.mp3\tFats Waller And His Rhythm\tBaby Brown\tVICTOR\t24867\t87083-3\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87083-1.mp3\tFats Waller And His Rhythm\tBaby Brown\tBLUEBIRD\t10109\t87083-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic87083-1.mp3\t\"fats\" Waller And His Rhythm\tBaby Brown\tVictor\t24846\t87083-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic87083-3.mp3\tFats Waller And His Rhythm\tBaby Brown\tVictor\t24867\t87083-3\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68365-A.mp3\tMary Lou Williams\tBaby Dear\tDECCA\t18122B\t68365-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38670-3.mp3\tBennie Moten's Kansas Orchestra\tBaby Dear\tVICTOR\t20946\t38670-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142147-2.mp3\tBessie Smith\tBaby Doll\tCOLUMBIA\t14147 D\tW142147-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142147-2.mp3\tBessie Smith\tBaby Doll\tCOLUMBIA\t35674\tW142147-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_212.mp3\tAndy Williams\tBaby Doll\tCadence\t1303\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71537.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tBaby Don't You Tell Me No Lie\tDecca\t4449\t71537\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM47S683.mp3\tArt Mooney And His Orchestra\tBaby Face\tMGM\t12009\t47S683\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20105-B.mp3\tJan Garber And His Orchestra\tBaby Face\tVictor\t20105-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36343-3.mp3\tJack Smith W Piano Acc\tBaby Face\tVICTOR\t20229\t36343-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU19712.mp3\tBen Selvin & His Orchestra\tBaby Face\tBRUNSWICK\t3253\t19712\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiHar214-H.mp3\tLou Gold & His Orchestra\tBaby Face\tHarmony\t214-H\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_025.mp3\tArt Mooney And His Orchestra\tBaby Face\tMGM\t12009\t47S683\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_003.mp3\tJan Garber And His Orchestra\tBaby Face\tVICTOR\t20105B\t35558-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75148.mp3\tBillie Holiday\tBaby Get Lost\tDECCA\t24726\t75148\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/BlaP-139-2.mp3\tHenderson's  Dance Orchestra\tBaby Girl\tBlack Swan\t2100\tP-139-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93814.mp3\tJay Mcshann Quartet\tBaby Heart Blues\tDECCA\t8623\tC93814\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU8918BI.mp3\tVillage Boys\tBaby I Ain't Satisfied\tBLUEBIRD\t8918\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKI-24-1.mp3\tMezzrow - Bechet Quntet\tBaby I'm Cuttin' Out\tStoryville\tSEP 394\tKI-24-1  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP567x.mp3\tJohnny Mercer And Margaret Whiting\tBaby It's Cold Outside\tCAPITOL\t567\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82487.mp3\tLouis Armstrong & His Allstars\tBaby It's Cold Outside Part.2\tDECCA\t28172\t82487\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82486.mp3\tLouis Armstrong & His Allstars\tBaby It's Cold Outside Pt.1\tDECCA\t28172\t82486\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_196.mp3\tRichard Bowers Feat. D/george Siravo\tBaby Let Me Kindle Your Flame\tCOLUMBIA\t40016\tCO49332-1\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038142.mp3\tGlenn Miller And His Orchestra\tBaby Me (v Kay Starr)\tBLUEBIRD\t10372\t038142\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068069.mp3\tGlenn Miller & His Orchestra\tBaby Mine\tBLUEBIRD\t11365\t068069\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/56068-2.mp3\tThomas Waller\tBaby Oh ! Where Can You Be\t\t\t56068-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/55376-2.mp3\tThomas Waller\tBaby Oh ! Where Can You Be\t\t\t55376-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC53468-4.mp3\tRudy Vallee & His Ct.yankees\tBaby Oh Where Can You Be\tVICTOR\t22034A\t53468-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_199.mp3\tRudy Vallee And His Connecticut Yankees\tBaby Oh Where Can You Be\tVICTOR\t22034A\t53468-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU96244.mp3\tJoe Williams Washboard Blues\tBaby Please Don't Go\tBLUEBIRD\t6200\t96244\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu6200.mp3\tJoe Williams Washboard Blues\tBaby Please Don't Go\tBluebird\t6200\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_065.mp3\tAmerican Quartet\tBaby Shoes\tVictor\t16859\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC91838.mp3\tElla Fitzgerald & Her Orchestra\tBaby What Else Can I Do\tDECCA\t2826A\tC91838\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU11224-A.mp3\tDuke Ellington And His Orchestra\tBaby When You Ain't There\tBRUNSWICK\t6317\t11224-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80952-3.mp3\tBessie Smith\tBaby Won't You Please Come Home\tCOLUMBIA\tA-3888\t80952-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67195.mp3\tElla Fitzgerald & Her Orchestra\tBaby Won't You Please Come Home\tDECCA\t3186A\t67195\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64003-3.mp3\tMckinney's Cotton Pickers\tBaby Won't You Please Come Home\tVICTOR\t22511\t64003-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL554.mp3\tLee O'daniel Hillbilly Boys\tBaby Won't You Please Come Home\tVOCALION\t4353\tDAL554\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE4394.mp3\tFletcher Henderson & His Orchestra\tBaby Won't You Please Come Home\tVOCALION\t1079\tE4394\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24051-2.mp3\tJimmie Lunceford And His Orchestra\tBaby Won't You Please Come Home\tOkeh\t4667\t24051-2\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3d/Vic09682-2.mp3\tLionel Hampton And His Orchestra\tBaby Won't You Please Come Home\tVictor\t25674\t09682-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe81472-A.mp3\tClarence Williams Blue 7\tBaby Won't You Please Come Home?\tOKeh\t8510\t81472-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3911.mp3\tBing Crosby - Eddie Heywood\tBaby Won't You Please Come Home?\tDECCA\t23636\tL3911\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR502-Hx.mp3\tLou Gold And His Orch\tBaby Your Mother (like She\tHarmony\t502-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_228.mp3\tVaughn Deleath\tBaby Your Mother (like She Babied You)\tVICTOR\t20873\t39968-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-12774-C.mp3\tAdelaide Hall With Duke Ellington And His Famous Orchestra\tBaby!\tBrunswick\t6518\tB-12774-C\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/ColB-12774-B.mp3\tAdelaide Hall With Duke Ellington And His Famous Orchestra\tBaby!\tColumbia\tOL-6770\tB-12774-B\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150880-3.mp3\tGuy Lombardo Royal Canadians\tBaby's Birthday Party\tCOLUMBIA\t2319 D\tW150880-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_167.mp3\tNat Shilkret And The Victor Orchestra\tBaby's Blue\tVICTOR\t20882\t39989-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC39989-2.mp3\tNat Shilkret & Victor Orchestra\tBaby's Blue (v J M)\tVICTOR\t20882\t39989-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74837.mp3\tLouis Jordan\tBaby's Gonna Go Bye Bye\tDECCA\t24981\t74837\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_023.mp3\tHenry Burr\tBaby's Prayer Will Soon Be Answered\tColumbia\t2691\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1888.mp3\tWillie Lewis & Negro Band\tBaby, Ain't You Satisfied\tVARSITY\tEL4068s\t1888\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC16411.mp3\tRex Stewart & His Orchestra\tBaby, Ain't You Satisfied?\tVOCALION\t2880\t16411\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-3906.mp3\tJimmie Lunceford And His Orchestra And Delta Rhythm Boys\tBaby, Are You Kiddin'?\tDecca\t23451\tL-3906\t1945\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD8VB3427.mp3\tRose Murphy (the Chee-chee Girl)\tBaby, Baby\tVictor\t20-3320-B\tD8VB3427\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/MER362-2.mp3\tBuddy Rich & His Orchestra\tBaby, Baby All The Time\tMERCURY\t5224\t362-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_325.mp3\tTommy Edwards Feat. O/leroy Holmes\tBaby, Baby, Baby\tMGM\t11541\t52S299\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB2172.mp3\tCount Basie & His Orchestra\tBaby, Don't Be Mad At Me\tRCA\t20-2948\tD7VB2172\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24240-1.mp3\tCount Basie & His Orchestra\tBaby, Don't Tell On Me\tVOCALION\t4747\t24240-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24240-1.mp3\tCount Basie And His Orchestra\tBaby, Don't Tell On Me\tVocalion\t4747\t24240-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC4449A.mp3\tAndy Kirk & His Orchestra\tBaby, Don't You Tell Me No Lie\tDECCA\t4449A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23957.mp3\tBillie Holiday & Billy Kyle\tBaby, I Don't Cry Over You\tDECCA\t23957\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63253.mp3\tBob Howard & His Orchestra\tBaby, It Must Be Love\tDECCA\t1721B\t63253\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP58948.mp3\tM.whiting & J.mercer\tBaby, It's Cold Outside\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24644BI.mp3\tElla Fitzgerald\tBaby, It's Cold Outside\tDECCA\t24644\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/HARCO40903.mp3\tPearl Bailey & Hot Lips Page\tBaby, It's Cold Outside\tHARMONY\tHa1049\tCO40903\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_031.mp3\tDinah Shore And Buddy Clark Feat. Ted Dale's Orchestra\tBaby, It's Cold Outside\tCOLUMBIA\t38463\tHCO3652\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_075.mp3\tElla Fitzgerald And Louis Jordan\tBaby, It's Cold Outside\tDECCA\t24644\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/MER2848.mp3\tFrankie Laine\tBaby, Just For Me\tMERCURY\t5358\t2848\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/APO361BL.mp3\tWynonie Harris\tBaby, Look At You\tAPOLLO\t361\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5795-X-IC.mp3\tWynonie Harris\tBaby, Shame On You\tKING\t4330A\tK5795-X-IC\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC15020.mp3\tCharlie Barnet & His Orchestra\tBaby, Take A Bow\tARC\tBA33029\t15020\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC042737.mp3\tTommy Dorsey & His Orchestra\tBaby, What Else Can I Do?\tVICTOR\t26386\t042737\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC058778-1.mp3\tSidney Bechet No Feetwarmers\tBaby, Won't You Please Come Home\tVICTOR\t27386B\t058778-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24051-2.mp3\tJimmie Lunceford & His Orchestra\tBaby, Won't You Please Come Home\tCBS\tCo38340\t24051-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE37392-A.mp3\tMills Bros\tBaby, Won't You Please Come Home\tBRUNSWICK\t6225\tE37392-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC1057.mp3\tCab Calloway & His Orchestra\tBaby, Won't You Please Come Home\tBRUNSWICK\t7530\tC1057\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63782.mp3\tSpencer Trio\tBaby, Won't You Please Come Home\tDECCA\t1941A\t63782\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09682-2.mp3\tLionel Hampton & His Orchestra\tBaby, Won't You Please Come Home\tVICTOR\t25674\t09682-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC65824.mp3\tLouis Armstrong And His Orch.\tBaby, Won't You Please Come Home?\tDECCA\t2729A\t65824\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic036964-1.mp3\tDon Redman And His Orchestra\tBaby, Won't You Please Come Home?\tVictor\t26266\t036964-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC75801.mp3\tElla Fitzgerald / Sy Oliver\tBaby, Won't You Say You Love Me?\tDECCA\t24917\t75801\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1812.mp3\tTed Daffan's Texans\tBaby, You Can't Get Me Down\tCOLUMBIA\t20103\tHCO1812\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru74898.mp3\tLionel Hampton And His Orchestra\tBaby, You're Great\tBrunswick\t82619\t74898\t1949\tEd Mullen-Wendell Culley-Leo Shepherd-Walter Wiliams-t, Lester Bass-Al Grey-Chippie Outcalt-Jimmy Wormick-tb, Johnny Board-Bobby Plater-as, Gene Morris-Johnny Sparrow-Billy Williams-ts, Ben Kynard-bar, Frances Gaddison-p, Lionel Hampton-vib-p-v, Wes \nhttp://www.jazz-on-line.com/a/mp3a/VIC22034-A.mp3\tRudy Vale And His Connecticut Ya\tBaby-oh Where Can You Be\tVictor\t22034-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010565-2.mp3\tTommy Dorsey & His Orchestra\tBacarolle\tVICTOR\t25887\t010565-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC030702-2.mp3\tBenny Goodman And His Orchestra\tBach Goes To Town\tVICTOR\t26130\t030702-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/GUIT396-2.mp3\tPat Flowers\tBach Prelude And Fugue\tGUILDE\t1012\tT396-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC102017.mp3\tFats Waller And His Rhythm\tBach Up To Me\tVICTOR\t25536\t102017\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic102017-1.mp3\t\"fats\" Waller And His Rhythm\tBach Up To Me\tVictor\t25536\t102017-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-11341-B.mp3\tBenny Carter And His Orchestra\tBack Bay Boogie\tBLUEBIRD\t11341\t066794\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D678-.mp3\tBenny Carter & His Orchestra\tBack Bay Boogie\tV-DISC\t678\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu066794-1.mp3\tBenny Carter And His Orchestra\tBack Bay Boogie\tBluebird\tB-11341\t066794-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU024082.mp3\tArtie Shaw And His Orchestra\tBack Bay Shuffle\tBLUEBIRD\tB-7759\t024082-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC024082-1.mp3\tArtie Shaw And His Orchestra\tBack Bay Shuffle\tVICTOR\t27547\t024082-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu24082.mp3\tArtie Shaw And His Orchestra\tBack Bay Shuffle\tBluebird\tB-7759\t024082-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_138.mp3\tArtie Shaw And His Orchestra\tBack Bay Shuffle\tBLUEBIRD\tB-7759\t024082-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP7038.mp3\tHarry James\tBack Beat Boogie\tCOLUMBIA\t39484\tZSP7038\t\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-16700-1.mp3\tMills Blue Rhythm Band\tBack Beats\tColumbia\t3020-D\tCO-16700-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71756.mp3\tJimmie Lunceford And His Orchestra\tBack Door Stuff - Part 1\tDecca\t18594\t71756\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71757.mp3\tJimmie Lunceford And His Orchestra\tBack Door Stuff - Part 2\tDecca\t18594\t71757\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5840.mp3\tErroll Garner Trio\tBack Home Again In Indiana\tSAVOY\t577B\tS5840\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA1865.mp3\tGene Autry\tBack In The Saddle Again\tCOLUMBIA\t20036\tLA1865\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_302.mp3\tArt Kassel And His \"kassels-in-the-air\"\tBack In The Saddle Again\tBluebird\t10772\t053015\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL20036.mp3\tGene Autry\tBack In The Saddle Again\tCOLUMBIA\t20036\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145465.mp3\tRuth Etting\tBack In Your Own Back Yard\tCOLUMBIA\t1288 D\tW145465\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41471-4.mp3\tPaul Whiteman & His Orchestra\tBack In Your Own Back Yard\tVICTOR\t27689\t41471-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP2373.mp3\tBenny Goodman And His Orchestra\tBack In Your Own Back Yard\tCAPITOL\t\t2373\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22283-1.mp3\tBillie Holiday\tBack In Your Own Back Yard\tVOCALION\t4029\t22283-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL1288-D.mp3\tRuth Etting\tBack In Your Own Back Yard\tCOLUMBIA\t1288-D\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Col145533-1.mp3\tJohnny Thompson (andy Razaf)\tBack In Your Own Back Yard\tColumbia\t14285-D\t145533-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_042.mp3\tRuth Etting\tBack In Your Own Back Yard\tCOLUMBIA\t1288 D\tW145465\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4440.mp3\tAl Jolson - Morris Stoloff\tBack In Your Own Backyard\tDECCA\t24108\tL4440\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS20858-1.mp3\tFletcher Henderson & H.o.\tBack In Your Own Backyard\tCBS\tVO3511\t20858-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/COM4699.mp3\tEddie Condon & His Band\tBack In Your Own Backyard\tCOMMODORE\t551\t4699\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/VocB-20858-1.mp3\tFletcher Henderson And His Orchestra\tBack In Your Own Backyard\tVocalion\t3511\tB-20858-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145654-5.mp3\tJan Garber & His Orchestra\tBack In Your Own Backyard (v I K)\tCOLUMBIA\t1334 D\tW145654-5\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/V-DVP1025.mp3\tDuke Ellington\tBack O' Town Blues\tV-DISC\t858\tVP1025\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC102.mp3\tPete Johnson's Allstars\tBack Room Blues\tNATIONAL\t\tNSC102\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC83195.mp3\tWebb Pierce\tBack Street Affair\tDECCA\t28369\t83195\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65836.mp3\tJimmy Dorsey & His Orch.\tBack To Back\tDECCA\t2554A\t65836\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037181.mp3\tGlenn Miller & His Orchestra\tBack To Back (vmh)\tBLUEBIRD\t10299B\t037181\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_107.mp3\tJack Norworth\tBack To My Old Home Town\tVICTOR\t60020\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3b/Mon07269.mp3\tTune Wranglers\tBack To Nevada\tMontgomeryWard\t7197\t07269\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/COL39567-1.mp3\tAl Jolson\tBack To The Carolina You Love\tCOLUMBIA\tA-1621\t39567-1\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_014.mp3\tAl Jolson\tBack To The Carolina You Love\tCOLUMBIA\tA-1621\t39567-1\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143491-1.mp3\tBessie Smith\tBack Water Blues\tCOLUMBIA\t14195 D\tW143491-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10990.mp3\tJo Stafford & Frankie Laine\tBack Where I Belong\tCOLUMBIA\t40401\tRHCO10990\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB889.mp3\tCount Basie & His Orchestra\tBackstage At Stuff's\tRCA\t20-2693\tD7VB889\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1895.mp3\tWillie Lewis & Negro Band\tBacon's Blues\tVARSITY\tEL4071s\t1895\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKJ-19-1.mp3\tMezzrow - Bechet Septet\tBad Bad Baby Blues\tStoryville\tSLP 141\tKJ-19-1  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/PARP4443.mp3\tBlind Blake\tBad Feeling Blues\tPARAMOUNT\t12497\tP4443\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3556-1.mp3\tChampion Jack Dupree\tBad Health Blues\tOKEH\t6197\tC3556-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU76823-1.mp3\tDorothea Trowbridge\tBad Luck Blues\tBLUEBIRD\t5431\t76823-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/PARP3090.mp3\tBlind Lemon Jefferson\tBad Luck Blues\tPARAMOUNT\t12443\tP3090\t1926\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC63753.mp3\tKokomo Arnold\tBad Luck Blues\tDECCA\t7540\t63753\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLRR1579-6.mp3\tAmos Milburn\tBad, Bad Whiskey\tALLADDIN\t3068\tRR1579-6\t1950\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru2681.mp3\tRay Miller & His Orchestra\tBagdad\tBrunswick\t2681\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1454BJ.mp3\tLouis Jordan Tympany 5\tBahama Joe\tV-DISC\t273B\t1454\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3736.mp3\tBing Crosby - Xavier Cugat\tBaia\tDECCA\t23413\tL3736\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_078.mp3\tBing Crosby Feat. Xavier Cugat's Orchestra\tBaia\tDECCA\t23413\tL3736\t1945\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-11862.mp3\tTed Heath And His Music\tBaia\tDECCA-LONDON\tEFF.49-1 (BEP 6025) \tDR-11862\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_045.mp3\tCollins And Harlan\tBake Dat Chicken Pie\tCOLUMBIA\tBUB-A77\t00077\t1907\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2290b.mp3\tArthur Collins & Byron Harlan\tBake Dat Chicken Pie 'complete Version\tColumbia\tA2290\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC061283.mp3\tDuke Ellington\tBakiff\tVICTOR\t27502\t061283\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_053.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tBali Ha'i\tRCA Victor\t78-3402\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4921.mp3\tBing Crosby - J.s.trotter\tBali Hai\tDECCA\t24609\tL4921\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE32065-1.mp3\tGene Krupa & His Orchestra\tBall Of Fire\tOKEH\t6563\t32065-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2035.mp3\tBing Crosby & Ken Darby Sing.\tBallad For Americans\tDECCA\t3554A\tDLA2035\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2036.mp3\tBing Crosby & Ken Darby Sing.\tBallad For Americans (pt.2)\tDECCA\t3554B\tDLA2036\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2037.mp3\tBing Crosby & Ken Darby Sing.\tBallad For Americans (pt.3)\tDECCA\t3298A\tDLA2037\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2038-A.mp3\tBing Crosby & Ken Darby Sing.\tBallad For Americans (pt.4)\tDECCA\t3298B\tDLA2038-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92521-1.mp3\tBenny Goodman And His Orchestra\tBallad In Blue\tVICTOR\t25081\t92521-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_130.mp3\tBenny Goodman And His Orchestra\tBallad In Blue\tVICTOR\t25081\t92521-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO53011.mp3\tFess Parker\tBallad Of Davy Crockett\tCOLUMBIA\t40449\tCO53011\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_037.mp3\tFess Parker\tBallad Of Davy Crockett\tColumbia\t40449\tCO53011\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_033.mp3\tTennessee Ernie Ford\tBallad Of Davy Crockett\tCapitol\t3058\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38381.mp3\tBuddy Clark W Dick Jones Orchestra\tBallerina\tCOLUMBIA\t38040\tCO38381\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4603.mp3\tBing Crosby & Rhythmaires\tBallerina\tDECCA\t24278\tL4603\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_037.mp3\tBuddy Clark Feat. Dick Jones' Orchestra\tBallerina\tCOLUMBIA\t38040\tCO38381\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_084.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Carroll\tBallerina\tMGM\t10035A\t47S129\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN9741.mp3\tSalty Dog Four\tBallin' The Jack\tBANNER\t32394\t9741\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COL37014.mp3\tPrince's Band\tBallin' The Jack\tCOLUMBIA\tA-5595\t37014\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE29689.mp3\tLouisiana Rhythm Kings\tBallin' The Jack\tVOCALION\t15828\tE29689\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COMP25709-1.mp3\tEddie Condon & His Band\tBallin' The Jack\tCOMMODORE\t531\tP25709-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-29689.mp3\tLouisiana Rhythm Kings\tBallin' The Jack\tVocalion\t15828\tE-29689\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe82000-B.mp3\tChicago Footwarmers\tBallin' The Jack (cootie Stomp)\tOKeh\t8533\t82000-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-20073-1.mp3\tMills Blue Rhythm Band\tBalloonacy\tColumbia\t3156-D\tCO-20073-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe81490-B.mp3\tFrankie Trumbauer & His Orchestra\tBaltimore\tOKeh\t40926\t81490-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE23234.mp3\tClarence Williams' Blue Five O\tBaltimore (v Katherine Henderson)\tBRUNSWICK\t3664\tE23234\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU045785.mp3\tErskine Hawkins & His Orchestra\tBaltimore Bounce\tBLUEBIRD\t10565\t045785\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148472.mp3\tCharlie Poole N.c.ramblers\tBaltimore Fire\tCOLUMBIA\t15509 D\tW148472\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/ARA1030-2A.mp3\tHoagy Carmichael & His Orchestra\tBaltimore Oriole (vhoagy Carmichael)\tARA\t142A\tARA1030-2A\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU16682-3-4.mp3\tPaul Ash And His Orchestra\tBam Bam Bamy Shore\tBRUNSWICK\t2964\t16682-3-4\t1925\tPaul Ash violin, Directing 2 trumpets, trombone, 2 alto saxes, tenor sax, banjo, piano, brass bass, drums v Paul Small. New York, October 13th 1925\nhttp://www.jazz-on-line.com/a/mp3a/VIC27610-2.mp3\tPaul Whiteman And His Orchestra\tBambalina\tVICTOR\t19035\t27610-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_135.mp3\tJan Garber And His Orchestra\tBambina\tBrunswick\t8206\tLA1699\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_301.mp3\tHenry Busse And His Orchestra (v-don Huston)\tBambina\tDecca\t1976\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO40431.mp3\tGene Krupa\tBambina Mia\tCOLUMBIA\t38496\tCO40431\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-3627.mp3\tVaughn Monroe\tBamboo\tRCA\t20-3627\t\t\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU8250.mp3\tGene Rodemich And His Orchestra\tBamboo Bay\tBRUNSWICK\t2290\t8250\t1922\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3d/Bla10075j.mp3\tHenderson's  Dance Orchestra\tBamboo Isle\tBlack Swan\t10075\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBel385.mp3\tJack Stillman's Orchestra\tBamboola\tBell\t385\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480821.mp3\tCarmen Miranda And The Bando Da Lua\tBambu-bambu\tDECCA\t23132-B\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW404923-B.mp3\tBo Carter (chatmon)\tBanana In Your Fruit Basket\tCOLUMBIA\t14661 D\tW404923-B\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140502.mp3\tVaughn Deleath\tBanana Oil\tCOLUMBIA\t361D\t140502\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU57303-1.mp3\tBennie Moten & His Orchestra\tBand Box Shuffle\tBLUEBIRD\t6710\t57303-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-4100-.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tBand Box Stomp\tBrunswick\t7111\tC-4100-\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_486.mp3\tHi-fi Four\tBand Of Gold\tKing\t4856\tK8622-C1\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_080.mp3\tKit Carson\tBand Of Gold\tCapitol\t3283\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_032.mp3\tDon Cherry O/ray Conniff\tBand Of Gold\tColumbia\t40597 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM398-1.mp3\tNoble Sissle & His Orchestra\tBandana Days\tVARIETY\tI552\tM398-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE28057.mp3\tLew Leslie's Blackbirds Orchestra\tBandanna Babies\tBRUNSWICK\t4030\tE28057\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUE28057HR2-2.mp3\tLew Leslie's Blackbirds Orchestra\tBandanna Babies\tBRUNSWICK\t4030\tE-28057\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/Vic48166-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tBandanna Babies\tVictor\tV-38007\t48166-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/CONC2243.mp3\tCoon Creek Girls (idy Harper)\tBanjo Pickin' Girl\tCONQUEROR\t9125\tC2243\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CROC1782-2.mp3\tRuss Carlson And His Orchestra\tBanking On The Weather\tCROWN\t3353\tC1782-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBacBannana.mp3\tSlim Gaillard\tBannana Skins Are Falling\tBackwoods\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/PARG15217.mp3\tCharley Patton\tBanty Rooster Blues\tPARAMOUNT\t12792B\tG15217\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVB900-4.mp3\tCharlie Parker\tBarbados\tSAVOY\t308\tB900-4\t1948\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR494-Hy.mp3\tBroadway Bell-hops\tBarbara\tHarmony\t494-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC39453-3.mp3\tTed Weems & His Orchestra\tBarbara\tVICTOR\t20846\t39453-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS29419-1.mp3\tLes Brown & His Orchestra\tBarbara Allen\tCBS\toK6049\t29419-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/COL27769.mp3\tMaxine Sullivan\tBarbara Allen\tCOLUMBIA\t35710\t27769\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63160.mp3\tEdgar Hayes & His Orchestra\tBarbary Coast Blues\tDECCA\t1940A\t63160\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480822.mp3\tSigmund Romberg And His Orchestra\tBarcarolle (from ''tales Of Hoffmann'')\tRCA VICTOR\t11-9222-B\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU19934-6.mp3\tBen Selvin & His Orchestra\tBarcelona\tBRUNSWICK\t3284\t19934-6\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26936-A.mp3\tJimmie Lunceford And His Orchestra\tBarefoot Blues\tColumbia\t35860\t26936-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64827-A.mp3\tLouis Jordan & His Tympani 5\tBarnacle Bill The Sailor\tDECCA\t7556\t64827-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80967-2.mp3\tBilly Jones And Ernest Hare\tBarney Google\tCOLUMBIA\tA-3876\t80967-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3l/Col80993-5.mp3\tThe Georgians\tBarney Google\tColumbia\tA-3902\t80993-5\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-3467bg.mp3\tCharlie Ventura\tBarney Google\tRCA\t20-3467\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_139.mp3\tGeorgie Price\tBarney Google\tVICTOR\t19066\t27775-6\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_018alt.mp3\tErnest Hare And Billy Jones\tBarney Google\tCOLUMBIA\tA-3876\t80967-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP264-1B.mp3\tZutty Singleton's Trio\tBarney's Bounce\tCAPITOL\t10022\t264-1B\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap264-1B.mp3\tZutty's Trio With Barney Bigard\tBarney's Bounce\tCapitol\t10022\t264-1B\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC24300y.mp3\tLouis Jordan\tBarnyard Boogie\tDECCA\t24300\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70652.mp3\tJimmie Davis\tBarnyard Stomp\tVICTOR\t23659\t70652\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC063863.mp3\tPete Johnson & Albert Ammons\tBarrel House Boogie\tVICTOR\t27504B\t063863\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24229.mp3\tMildred Bailey & Her Orchestra\tBarrel House Music\tVOCALION\t4802\t24229\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CON15628-2.mp3\tLeroy Carr\tBarrel House Woman\tCONQUEROR\t8865\t15628-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-20074-1.mp3\tMills Blue Rhythm Band\tBarrelhouse\tColumbia\t3156-D\tCO-20074-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DECLA2837.mp3\tBob Crosby & His Orchestra\tBarrelhouse Bessie From Basin Street\tDECCA\t4169B\tLA2837\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_252.mp3\tBob Crosby And His Orchestra Feat. V/eddie Miller\tBarrelhouse Bessie From Basin Street\tDECCA\t4169B\tLA2837\t1942\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481099.mp3\tGene Krupa Orch. Feat. Anita O'day\tBarrelhouse Bessie From Basin Street\tColumbia\tRejected\tCCO-4210-1\t1942\tRoy Eldridge (tp, vo), Al Beck, Mickey Mangano, Norman Murphy (tp), Babe Wagner, Joe Conigliaro, John Grassi (tb), Ben Feman, Rex Kittig, Jimmy Migliore (as), Sam Musiker (cl, ts), Don Brassfield (ts), Joe Springer (p), Ray Biondi (g), Ed Mihelich (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3a/PARP1598.mp3\tMa Gertrude Rainey\tBarrelhouse Blues\tPARAMOUNT\t12082\tP1598\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU659-7.mp3\tPete Johnson Blues Trio\tBarrelhouse Breakdown\tBLUENOTE\tBN010\t659-7\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3484.mp3\tFats Navarro\tBarry's Bop\tSAVOY\t959\tS3484\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D125A2.mp3\tSpike Jones And His City Slickers\tBarstool Cowboy From Old Barstow\tV-DISC\t125A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69157-C.mp3\tPete Johnson\tBasement Boogie\tDECCA\t3830A\t69157-C\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC53949-3.mp3\tBen Pollack & His Orchestra\tBashful Baby\tVICTOR\t22074\t53949-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLC4225.mp3\tCount Basie & His Orch.\tBasie Blues\tCOLUMBIA\t36601\tC4225\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE30832.mp3\tCount Basie And His Orchestra\tBasie Boogie\tOKEH\t6330\t30832\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D813.mp3\tCount Basie Orchestra\tBasie Strides Again\tV-DISC\t813\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB888.mp3\tCount Basie & His Orchestra\tBasie's Basement\tRCA\t20-2695\tD7VB888\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU75103-1.mp3\tLouis Armstrong And His Orchestra\tBasin Street Blues\tBLUEBIRD\t5408\t75103-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC1484.mp3\tBob Wills Texas Playboys\tBasin Street Blues\tCOLUMBIA\t20217\tC1484\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_364.mp3\tLouis Armstrong With Earl Hines Feat. Earl Hines And Mancy Cara\tBasin Street Blues\tVOCALION\t3008\t402154-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/CroC-1778-1.mp3\tJoel Shaw And His Orchestra\tBasin Street Blues\tCrown\t3352\tC-1778-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe402154-A.mp3\tLouis Armstrong's Hot Five\tBasin Street Blues\tOKeh\t8690\t402154-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC96503.mp3\tBenny Goodman And His Orchestra\tBasin Street Blues\tVICTOR\t25258\t96503\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC057617.mp3\tHenry Levine's Dixieland Phil.\tBasin Street Blues\tVICTOR\t27304\t057617\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP5040.mp3\tLouis Armstrong & Earl Hines\tBasin Street Blues\tCOLUMBIA\t39233\tZSP5040\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17096.mp3\tCharleston Chasers\tBasin Street Blues\tARC\tCO2914\t17096\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA971-A.mp3\tBing Crosby\tBasin Street Blues\tDECCA\t25430\tDLA971-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE30030.mp3\tLouisiana Rhythm Kings\tBasin Street Blues\tVOCALION\t15815\tE30030\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75282.mp3\tElla Fitzgerald / Sy Oliver\tBasin Street Blues\tDECCA\t24868\t75282\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU101573.mp3\tWingy Manone & His Orchestra\tBasin Street Blues\tBLUEBIRD\t6411A\t101573\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12341-A.mp3\tThree Keys\tBasin Street Blues\tBRUNSWICK\t6423\t12341-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010654-1.mp3\tFats Waller (piano)\tBasin Street Blues\tVICTOR\t27767\t010654-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU87766.mp3\tKxyz Novelty Band\tBasin Street Blues\tBLUEBIRD\t5832\t87766\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/HOTHC-89y.mp3\tGoodman And Teagarden\tBasin Street Blues\tHot Jazz Club of Ame\tHC-89\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4689.mp3\tEddie Condon & His Band\tBasin Street Blues\tCOMMODORE\t1513\t4689\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP6535-3.mp3\tPete Daily\tBasin Street Blues\tCAPITOL\t1238\t6535-3\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_159.mp3\tCharleston Chasers\tBasin Street Blues\tCOLUMBIA\t2415\tW151292\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-17615-1.mp3\tLouis Prima And His New Orleans Gang\tBasin Street Blues\tBrunswick\t7456\tB-17615-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_205.mp3\tBing Crosby And Connee Boswell Feat. John Scott Trotter's Orchestra\tBasin Street Blues\tDECCA\t1483\tDLA971-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban10728-2.mp3\tCab Calloway And His Orchestra\tBasin Street Blues\tBanner\t32237\t10728-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/BruDLA971-A.mp3\tJohn Scott Trotter And His Orchestra\tBasin Street Blues\tBrunswick\tE-02534\tDLA971-A  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-30030.mp3\tLouisiana Rhythm Kings\tBasin Street Blues\tVocalion\t15815\tE-30030\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_207.mp3\tBenny Goodman And His Orchestra\tBasin Street Blues\tCOLUMBIA\t2914 D\tW151292-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10728-2.mp3\tCab Calloway & His Orchestra\tBasin Street Blues (vcc)\tBANNER\t32237\t10728-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152283.mp3\tFrankie Trumbauer & His Orchestra\tBass Drum Dan\tCOLUMBIA\t2897 D\tW152283\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU1014.mp3\tAlbert Ammons\tBass Goin' Crazy\tBLUENOTE\t021\t1014\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/SAV5704.mp3\tDon Byas Swing Group\tBass-c-jam\tSAVOY\t524\t5704\t1944\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke6295.mp3\tSlim Gaillard\tBassology\tOkeh\t6295\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29916.mp3\tGaillard,slim\tBassology\tOKEH\t6295\t29916\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/CON9008.mp3\tLeonard Feather Allstars\tBathroom Boogie\tCONTIN\tT6007\t9008\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68608-A.mp3\tArt Tatum\tBattery Bounce\tDECCA\t8526\t68608-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68877.mp3\tJimmie Lunceford & His Orchestra\tBattle Axe\tDECCA\t3807B\t68877\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec68877-A.mp3\tJimmie Lunceford And His Orchestra\tBattle Axe\tDecca\t3807\t68877-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL4077-3.mp3\tWynonie Harris & Joe Turner\tBattle Of The Blues Part 1\tALLADDIN\t3036\t4077-3\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL4078-1.mp3\tWynonie Harris & Joe Turner\tBattle Of The Blues Part 2\tALLADDIN\t3036\t4078-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYHL31.mp3\tColeman Hawkins Sax Ensemble\tBattle Of The Saxes\tKEYNOTE\t1316\tHL31\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB6439-2.mp3\tArthur Pryor's Band\tBattleship Connecticut March\tVICTOR\t16113\tB6439-2\t1908\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480369.mp3\tBenny Golson\tBaubles, Bangles, And Beads\tNew Jazz\tNJLP8248\t1971\t1959\tCurtis Fuller (tb) Benny Golson (ts) Tommy Flanagan (p) Doug Watkins (b) Art Taylor (d)\nhttp://www.jazz-on-line.com/a/mp3a/MER5815x.mp3\tEddy Howard And His Orchestra\tBe Anything\tMERCURY\t5815\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_229.mp3\tChamp Butler Feat. Percy Faith And His Orchestra\tBe Anything (but Be Mine)\tCOLUMBIA\t39690\tCO47348\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLA2126.mp3\tHelen Humes W Bill Doggett\tBe Baba Leba\tALLADDIN\t106\tA2126\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403994-A.mp3\tJack Purvis & His Orchestra\tBe Bo Bo\tOKeh\t8808\t403994-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/DIA1006BB.mp3\tHoward Mcghee Allstars\tBe Bop\tDIAL\t1006\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3485.mp3\tFats Navarro\tBe Bop Romp\tSAVOY\t959\tS3485\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC80288.mp3\tBuddy Johnson And His Orch.\tBe Careful\tDECCA\t27814\t80288\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA3015.mp3\tBing Crosby - J.s.trotter Orchestra\tBe Careful, It's My Heart\tDECCA\t18424B\tDLA3015\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_082.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra\tBe Careful, It's My Heart\tVICTOR\t27923\t075265\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLWOR1681.mp3\tBillie Holiday\tBe Fair To Me\tALLADDIN\t4 3094\tWOR1681-\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053134.mp3\tGlenn Miller & His Orchestra\tBe Happy (vmh)\tBLUEBIRD\t10796\t053134\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2401.mp3\tBing Crosby\tBe Honest With Me\tDECCA\t18767A\tDLA2401\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_259.mp3\tGene Autry\tBe Honest With Me\tOKEH\t5980\tLA2313-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_184.mp3\tBing Crosby\tBe Honest With Me\tDECCA\t18767A\tDLA2401\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5914.mp3\tWynonie Harris\tBe Mine, My Love\tKING\t4389\tK5914\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC41865-3.mp3\tBlue Steele And His Orchestra\tBe My Baby\tVICTOR\t21355\t41865-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47255.mp3\tRosemary Clooney\tBe My Life's Companion\tCOLUMBIA\t39631\tCO47255\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC81865.mp3\tMills Brothers\tBe My Life's Companion\tDECCA\t27889\t81865\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_053.mp3\tMills Brothers\tBe My Life's Companion\tDECCA\t27889\t81865\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_145.mp3\tRosemary Clooney\tBe My Life's Companion\tCOLUMBIA\t39631\tCO47255\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC12165-1.mp3\tAda Jones And Billy Murray\tBe My Little Bumble Bee\tVICTOR\t17152B\t12165-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAVI101561.mp3\tMario Lanza\tBe My Love\tRCA\t101561\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_009.mp3\tMario Lanza\tBe My Love\tRCA\t101561\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_095.mp3\tRay Anthony Feat. Tommy Mercer\tBe My Love\tCapitol\t1352\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_254.mp3\tBilly Eckstine Feat. O/russ Case\tBe My Love\tMGM\t10799A\t50S264\t1951\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM50S264.mp3\tBilly Eckstine W Russ Case\tBe My Love (from Toast Of New Orleans)\tMGM\t10799A\t50S264\t\t\nhttp://www.jazz-on-line.com/a/mp3a/NATNSC402.mp3\tRavens\tBe On Your Merry Way\tNATIONAL\t\tNSC402\t1948\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC38924.mp3\tAl Bowlly\tBe Still My Heart\tDECCA\t293B\t38924\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/COLWC2972.mp3\tBenny Goodman & His Orchestra\tBe Sure\tCOLUMBIA\t35426\tWC2972\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0625_02.mp3\tLee Morse And Her Bluegrass Boys\tBe Sweet Tome\tColumbia\t1466DB\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe9110-A.mp3\tJimmy Joy's St. Anthony's Hotel Orchestra\tBe Yourself\tOKeh\t40420\t9110-A\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_048.mp3\tGene Vincent And His Blue Caps\tBe-bop-a-lula\tCapitol\t3450 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU38661-1.mp3\tJelly Roll Morton Hot Peppers\tBeale Street Blues\tBLUEBIRD\t10252\t38661-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010345-2.mp3\tTommy Dorsey & His Orchestra\tBeale Street Blues\tVICTOR\t25767\t010345-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D1600.mp3\tJack Teagarden Vdisc Allstars\tBeale Street Blues\tV-DISC\t587\t1600\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79748-4.mp3\tMarion Harris\tBeale Street Blues\tCOLUMBIA\tA-3474\t79748-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3o/HOTHC-89x.mp3\tGoodman And Teagarden\tBeale Street Blues\tHot Jazz Club of Ame\tHC-89\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_054.mp3\tMarion Harris\tBeale Street Blues\tCOLUMBIA\tA-3474\t79748-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_200.mp3\tAlberta Hunter\tBeale Street Blues\tVICTOR\t20771\t38046-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/HAR143222-3.mp3\tUniversity Six\tBeale Street Blues\tHARMONY\t414-H\t143222-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic38661-1.mp3\tJelly-roll Morton's Red Hot Peppers\tBeale Street Blues\tVictor\t20948\t38661-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_104.mp3\tEarl Fuller's Novelty Orchestra Feat. Earl Fuller's Jazz Band\tBeale Street Blues\tVictor\t18369\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/Oke28877-1.mp3\tBenny Carter And His All Star Orchestra\tBeale Street Blues (& Joe Turner)\tOkeh\t6001\t28877-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/PUR1392.mp3\tFletcher Henderson & His Orchestra\tBeale Street Mama\tPURITAN\tPU11247\t1392\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64346.mp3\tBob Howard & His Orchestra\tBeale Street Mama\tDECCA\t2056A\t64346\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80950-2.mp3\tBessie Smith\tBeale Street Mama\tCOLUMBIA\tA-3877\t80950-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban12588-A.mp3\tCab Calloway And His Orchestra\tBeale Street Mama\tBanner\t32624\t12588-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Par1392-2.mp3\tFletcher Henderson And His Orchestra\tBeale Street Mamma\tParamount\t20226\t1392-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/SONSR1858.mp3\tColeman Hawkins Allstars\tBean And The Boys\tSONORA\t3024\tSR1858\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYKHL12.mp3\tColeman Hawkins Qt\tBean At The Met\tKEYNOTE\t610\tKHL12\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP594.mp3\tColeman Hawkins & His Orchestra\tBean Soup\tCAPITOL\t\t594\t\t\nhttp://www.jazz-on-line.com/a/mp3a/SUN181x.mp3\tRufus Thomas\tBear Cat\tSUNSET\t181\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23893-1.mp3\tMeade Lux Lewis\tBear Cat Crawl\tVOCALION\t4608\t23893-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp37/COL23893-1.mp3\tMeade Lux Lewis\tBear Cat Crawl\tCOLUMBIA\t35961\t23893-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL257-1.mp3\tLee O'daniel Hillbilly Boys\tBear Cat Mama\tVOCALION\t3950\tDAL257-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CONC3365.mp3\tCarter Family\tBear Creek Blues\tCONQUEROR\t9574\tC3365\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62875-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tBear Down\tDecca\t1606\t62875-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60866-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tBearcat Shuffle\tDecca\t1046\t60866-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013345-1.mp3\tFats Waller And His Rhythm\tBeat It Out\tVICTOR\t25672\t013345-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62633.mp3\tBob Howard & His Orchestra\tBeat It Out\tDECCA\t1489\t62633\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68020.mp3\tAndrews Sisters\tBeat Me Daddy Eight To The Bar\tDECCA\t3375B\t68020\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COL27329.mp3\tWill Bradley And His Orchestra\tBeat Me Daddy Eight To The Bar, Part 1\tCOLUMBIA\t35530\tCO27329-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO27329-1.mp3\tWill Bradley And His Orchestra\tBeat Me Daddy Eight To The Bar, Part 1\tCOLUMBIA\t36956\tCO27329-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL36956.mp3\tWill Bradley & His Orchestra\tBeat Me Daddy Eight To The Bar, Part 1\tCOLUMBIA\t36956\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO27330-1.mp3\tWill Bradley And His Orchestra\tBeat Me Daddy Eight To The Bar, Part 2\tCOLUMBIA\t35530\tCO27330-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68227.mp3\tWoody Herman & His Orchestra\tBeat Me Daddy, Eight To The Bar\tDECCA\t3454B\t68227\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU056107.mp3\tGlenn Miller & His Orchestra\tBeat Me Daddy, Eight To The Bar (vjl)\tBLUEBIRD\t10876\t056107\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_136.mp3\tAndrews Sisters\tBeat Me, Daddy, Eight To The Bar\tDECCA\t3375B\t68020\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_021.mp3\tWill Bradley And His Orchestra\tBeat Me, Daddy, Eight To The Bar\tCOLUMBIA\t35530\tCO27330-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22307-1.mp3\tEddy Condon & His Band\tBeat To The Socks\tCBS\tCM502\t22307-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/COMP22307.mp3\tEddie Condon Windy City 7\tBeat To The Socks\tCOMMODORE\t502\tP22307\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS25469.mp3\tSlim & Slam\tBeatin The Board\tCBS\tVO5483\t25469\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE81119-C.mp3\tJoe Venuti's Blue Four\tBeatin' The Dog\tOKEH\t40853\t81119-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC16793-2.mp3\tAda Jones\tBeatrice Fairfax, Tell Me What To Do\tVICTOR\t17926\t16793-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29535-1.mp3\tCount Basie And His Orchestra\tBeau Brummel\tOkeh\t6122\t29535-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW402169.mp3\tLouis Armstrong Savoy Ball 5\tBeau Koo Jack\tCOLUMBIA\t35879\tW402169\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29741.mp3\tLes Brown & His Orchestra\tBeau Night In Hotkiss Corners\tOKEH\t6098\t29741\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/OKeS71740.mp3\tThomas Morris\tBeaucoup De Jazz\tOKeh\t4940\tS71740\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL561.mp3\tLee O'daniel Hillbilly Boys\tBeautfiul Texas\tVOCALION\t4185\tDAL561\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_020.mp3\tHarry Macdonough And Joe Belmont\tBeautiful Bird, Sing On\tVictor\t2332\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1393x.mp3\tJimmy Wakely\tBeautiful Brown Eyes\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45084.mp3\tRosemary Clooney\tBeautiful Brown Eyes\tCOLUMBIA\t39212\tCO45084\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_075.mp3\tRosemary Clooney Feat. Mitch Miller Orchestra\tBeautiful Brown Eyes\tCOLUMBIA\t39212\tCO45084\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_081.mp3\tAmerican Quartet\tBeautiful Doll Good-bye\tVictor\t17244\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1967.mp3\tBing Crosby\tBeautiful Dreamer\tDECCA\t18802A\tDLA1967\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC18802A.mp3\tBing Crosby\tBeautiful Dreamer\tDECCA\t18802A\tDLA1967\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU062748-1.mp3\tUna Mae Carlisle\tBeautiful Eyes\tBLUEBIRD\t11096\t062748-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/COL4178.mp3\tAda Jones (soprano)\tBeautiful Eyes\tCOLUMBIA\tA-0742\t4178\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_019alt.mp3\tAda Jones\tBeautiful Eyes\tVICTOR\t16339\tB7092-2\t1909\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14062-1.mp3\tFreddy Martin And His Orchestra\tBeautiful Girl\tBRUNSWICK\t6659\t14062-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/CONLA19-A.mp3\tBing Crosby\tBeautiful Girl\tCONQUEROR\t8368\tLA19-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3o/FED5015-B.mp3\tCharles Hart And Elliot Shaw\tBeautiful Isle Of Somewhere\tFederal\t5015-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_030.mp3\tHarold Jarvis\tBeautiful Isle Of Somewhere\tVICTOR\t16008\tB6131-2\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_096.mp3\tHarry Anthony And James F. Harrison\tBeautiful Isle Of Somewhere (copy 1) (take 1)\tEDISON\t9959\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_096alt.mp3\tHarry Anthony And James F. Harrison\tBeautiful Isle Of Somewhere (copy 2) (take 2)\tEDISON\t9959\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3473-AA.mp3\tBing Crosby & Victor Young Or.\tBeautiful Love\tDECCA\t18735 B\tL3473-AA\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC38431-C.mp3\tArt Tatum\tBeautiful Love\tDECCA\t306B\t38431-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481778.mp3\tAnita O'day\tBeautiful Love\tVerve\tMGV2000\t2555-6\t1955\tacc. by Paul Smith (p), Barney Kessel (g), Joe Mondragon (sb), Alvin Stoller (dm), Buddy Bregman (arr, dir)\nhttp://www.jazz-on-line.com/a/mp3c/DECC9507.mp3\tJimmie Davis\tBeautiful Mary\tDECCA\t5031B\tC9507\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC5031B.mp3\tJimmie Davis\tBeautiful Mary\tDECCA\t5031B\tC9507\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78183.mp3\tHenry Burr (tenor)\tBeautiful Ohio\tCOLUMBIA\tA-2701\t78183\t1918\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D207A2.mp3\tAndre Kostelanetz And His Orchestra\tBeautiful Ohio\tV-DISC\t207A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046433.mp3\tGlenn Miller And His Orchestra\tBeautiful Ohio\tBLUEBIRD\t10587\t046433\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_087.mp3\tFritz Kreisler\tBeautiful Ohio\tVICTOR\t64817\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_002.mp3\tHenry Burr\tBeautiful Ohio\tCOLUMBIA\t2701\t78183\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_055.mp3\tOlive Kline And Marguerite Dunlap\tBeautiful Ohio\tVICTOR\t45161\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU76873-1.mp3\tJimmie Davis\tBeautiful Texas\tBLUEBIRD\t5394\t76873-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D712.mp3\tCount Basie & His Orchestra\tBeaver Junction\tV-DISC\t258A\t712\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143942-1.mp3\tPeg Leg Howell\tBeaver Slide Rag\tCOLUMBIA\t14210 D\tW143942-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU10886.mp3\tGene Rodemich And His Orchestra\tBebe\tBRUNSWICK\t2454B\t10886\t1923\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3a/RCA10-3207x.mp3\tMario Lanza\tBecause\tRCA\t10-3207\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAVI202653.mp3\tPerry Como\tBecause\tRCA\t20-2653\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1162.mp3\tTed Daffan's Texans\tBecause\tOKEH\t6172\tDAL1162\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_123.mp3\tMario Lanza\tBecause\tRCA\t10-3207\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1899_020.mp3\tAlbert Campbell\tBecause\tEdison\t5710\t\t1899\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_032.mp3\tEnrico Caruso\tBecause\tVICTOR\t87122\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_034.mp3\tPerry Como Feat. Russell Case's Orchestra\tBecause\tRCA Victor\t2653\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75590.mp3\tBuddy Johnson And His Orch.\tBecause (part. 1)\tDECCA\t24842\t75590\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75591.mp3\tBuddy Johnson And His Orch.\tBecause (part. 2)\tDECCA\t24842\t75591\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70261.mp3\tSkeets Tolbert Gentlemen Swing\tBecause I Love My Daddy So\tDECCA\t8617\t70261\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec70261-A.mp3\tNora Lee King With Skeets Tolbert And His Orchestra\tBecause I Love My Daddy So\tDecca\t8617\t70261-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU21137-2.mp3\tArtie Shaw And His New Music\tBecause I Love You\tBRUNSWICK\t7899\tB-21137-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/Gre3932-A.mp3\tCliff Jackson And His Krazy Kats\tBecause I'm Lonesome\tGrey Gull\t1851\t3932-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB4377-2.mp3\tBilly Murray\tBecause I'm Married Now\tVICTOR\t16657\tB4377-2\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_047.mp3\tBilly Murray\tBecause I'm Married Now\tVICTOR\t16657\tB4377-2\t1907\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146346-3.mp3\tRuth Etting\tBecause My Baby Don't Mean \"maybe\" Now!\tCOLUMBIA\t1420 D\tW146346-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146549-2.mp3\tPaul Whiteman & His Orchestra\tBecause My Baby Don't Mean \"maybe\" Now!\tCOLUMBIA\t1441 D\tW146549-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_116.mp3\tRuth Etting\tBecause My Baby Don't Mean Maybe Now\tCOLUMBIA\t1420 D\tW146346-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC45182-3.mp3\tGeorge Olsen & His Music\tBecause My Baby Don't Mean Maybe Now (vff)\tVICTOR\t21452B\t45182-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC87085-1.mp3\tFats Waller And His Rhythm\tBecause Of Once Upon A Time\tVICTOR\t24846\t87085-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic87085-1.mp3\t\"fats Waller And His Rhythm\tBecause Of Once Upon A Time\tVictor\t24846\t87085-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC80747.mp3\tElla Fitzgerald\tBecause Of Rain\tDECCA\t27602\t80747\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_134.mp3\tNat ''king'' Cole Feat. Les Baxter And His Orchestra\tBecause Of Rain\tCAPITOL\t1501\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1760x.mp3\tLes Baxter\tBecause Of You\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45194.mp3\tTony Bennett W Percy Faith\tBecause Of You\tCOLUMBIA\t39362\tCO45194\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU027963.mp3\tErskine Hawkins & His Orchestra\tBecause Of You\tBLUEBIRD\t10019\t027963\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC81635.mp3\tLouis Armstrong And His Orchestra\tBecause Of You\tDECCA\t27816\t81635\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_229.mp3\tRay Barber\tBecause Of You\tMERCURY\t5643\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_033.mp3\tLes Baxter And His Orchestra\tBecause Of You\tCapitol\t1760\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_002.mp3\tTony Bennett\tBecause Of You\tCOLUMBIA\t39362\tCO45194\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_264.mp3\tLarry Clinton And His Orchestra Feat. V/peggy Mann\tBecause Of You\tBLUEBIRD\t11094\t053733\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_139.mp3\tJohnny Desmond Feat. O/tony Mottola; Bv/ray Charles Singers\tBecause Of You\tMGM\t10947\t51S47\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_080.mp3\tGloria Dehaven Feat. Guy Lombardo Orchestra\tBecause Of You\tDECCA\t27666\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3l/COL140103.mp3\tLeo Reisman & His Orch\tBecause They All Love You\tCOLUMBIA\t242D\t140103\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA10-3914x.mp3\tMario Lanza\tBecause You're Mine\tRCA\t10-3914\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_048.mp3\tMario Lanza\tBecause You're Mine\tRCA\t10-3914\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_131.mp3\tNat ''king'' Cole Feat. Nelson Riddle And His Orchestra\tBecause You're Mine\tCAPITOL\t2212\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC38967-B.mp3\tJimmie Lunceford And His Orchestra\tBecause You're You\tDECCA\t415B\t38967-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16687-1.mp3\tLeadbelly (h.ledbetter)\tBecky Deem Was A Gambling Girl\tARC\tME60455\t16687-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60837.mp3\tJimmie Davis\tBed Bug Blues\tDECCA\t5206\t60837\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe405021-2.mp3\tMississipi Sheiks\tBed Spring Poker\tOKeh\t8927\t405021-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_003.mp3\tHaydn Quartet\tBedelia\tVictor\t2559\t\t1904\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB31.mp3\tArtie Shaw And His Orchestra\tBedford Drive\tRCA\t20-1696\tD5VB31\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/CON9005.mp3\tLeonard Feather Allstars\tBedroom Blues\tCONTIN\tT6006\t9005\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3409.mp3\tRhythm Willie (w.right)\tBedroom Stomp\tOKEH\t5856\tC3409\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS36133.mp3\tJ.j.johnson's Orchestra\tBee Jay - Goof Square\tSAVOY\t949B\tS36133\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12071-2.mp3\tJimmy Dorsey\tBeebe\tBRUNSWICK\t6352\t12071-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW143444-3.mp3\tPaul Ash And His Orchestra\tBeedle Um Bo\tCOLUMBIA\t944 D\tW143444-3\t1927\tJohn Valentine, John Linn, tp, R. Lantz, trombone, Phil Wing & Herbert \"Putty\" Nettle,clarinet,al sax, Howard Grantham, cl, tn sax, Harry Barris, p, Paul Ash, vio, Julian Davidson,bj, Pierre Olker,br bass, Arthur Layfield, v J. Marvin & Ed Smalle\nhttp://www.jazz-on-line.com/a/mp3a/VIC51204-1.mp3\tMckinney's Cotton Pickers\tBeedle Um Bum\tVICTOR\t38052A\t51204-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC65531.mp3\tAndrews Sisters\tBeer Barrel Polka\tDECCA\t23609\t65531\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_204.mp3\tEddie Delange Feat. Elisse Cooper\tBeer Barrel Polka\tBLUEBIRD\t10199\t035371\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_007.mp3\tWill Glahe Musette Orchestra\tBeer Barrel Polka\tVictor\tV-710\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_058.mp3\tAndrews Sisters\tBeer Barrel Polka ( Roll Out The Barrel)\tDECCA\t23609\t65531\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL20760BB.mp3\t101 Ranch Boys\tBeer Bottle Mama\tCOLUMBIA\t20760\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU053590-2.mp3\tMemphis Slim (chatmon)\tBeer Drinking Woman\tBLUEBIRD\t8584\t053590-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC93572.mp3\tJimmie Gordon\tBeer Drinking Woman\tDECCA\t7865\t93572\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COL13835-1-2.mp3\tClarence Williams & His Orchestra\tBeer Garden Blues\tCOLUMBIA\t30057\t13835-1-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCam312.mp3\tDixie Daisies\tBees Knees\tCameo\t312\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80567-4.mp3\tTed Lewis & His Jazz Band\tBees Knees\tCOLUMBIA\tA-3730\t80567-4\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS29509-1.mp3\tJohn Kirby & His Orchestra\tBeethoven Riffs\tCBS\t(Reject)\t29509-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_354.mp3\tSunny Gale With Orchestra Conducted By Hugo Winterhalter\tBefore It's Too Late\tRCA\t20-5424\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4857.mp3\tFrankie Carle\tBeg Your Pardon\tCOLUMBIA\t38036\tCCO4857\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_036.mp3\tFrankie Carle And His Orchestra Feat. Marjorie Hughes\tBeg Your Pardon\tCOLUMBIA\t38036\tCCO4857\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_099.mp3\tDinning Sisters Feat. Jack Fascinato's Orchestra\tBeg Your Pardon\tCapitol\t490\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_021.mp3\tFrancis Craig And His Orchestra\tBeg Your Pardon\tBullet\t1012\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_062.mp3\tLarry Green And His Orchestra Feat. Bob Lamm\tBeg Your Pardon\tRCA Victor\t2647\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69401.mp3\tPat Flowers\tBeg, Borrow And Steal\tDECCA\t8587\t69401\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Col148641-3.mp3\tSonny Greer And The Memphis Men\tBeggars Blues\tColumbia\t1858-D\t148641-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73864.mp3\tLucky Millinder & His Orch.\tBegging For Love\tDECCA\t24182\t73864\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73864.mp3\tLucky Millinder And His Orchestra\tBegging For Love\tDecca\t24182\t73864\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BLA3505-A.mp3\tGaylord Carter\tBegin The Beguine\tBlack & White\t3505-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/Blu024079.mp3\tArtie Shaw And His Orchestra\tBegin The Beguine\tBLUEBIRD\tB-7746-B\t024079-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-7746-B.mp3\tArtie Shaw And His Orchestra\tBegin The Beguine\tBluebird\tB-7746-B\t024079-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3660.mp3\tLes Paul Trio\tBegin The Beguine\tDECCA\t2152?\tL3660\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23398x.mp3\tEddie Heywood\tBegin The Beguine\tDECCA\t23398\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D324B.mp3\tEddie Haywood And His Orchestra\tBegin The Beguine\tV-DISC\t324B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5545.mp3\tArtie Shaw And His Orchestra\tBegin The Beguine\tMUSICRAFT\t391\t5545\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20-1551-A.mp3\tArtie Shaw And His Orchestra\tBegin The Beguine\tVictor\t20-1551-A\t024079-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47279.mp3\tXavier Cugat\tBegin The Beguine\tCOLUMBIA\t36850\tCO47279\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23987.mp3\tMildred Bailey & Her Orchestra\tBegin The Beguine\tVOCALION\t4619\t23987\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DIS6004BB.mp3\tJoe Sullivan Qt\tBegin The Beguine\tDISC\t6004\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2069-A.mp3\tArt Tatum\tBegin The Beguine\tDECCA\t8502\tDLA2069-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-169-1.mp3\tPierre Allier Et Son Orchestre (with Django Reinhardt)\tBegin The Beguine\tSWING\t89\tOSW-169-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC72635.mp3\tEddie Heywood And His Orch\tBegin The Beguine\tDECCA\t28549\t72635\t\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-129-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tBegin The Beguine\tSWING\t\tOSW-129-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBluB-7746.mp3\tArtie Shaw And His Orchestra\tBegin The Beguine\tBluebird\tB-7746\t024079-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_278.mp3\tFrank Sinatra\tBegin The Beguine\tCOLUMBIA\t37064\tHCO1735\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_190.mp3\tXavier Cugat And His Waldorf-astoria Orchestra Feat. V/don Reid\tBegin The Beguine\tVictor\t25133\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480823.mp3\tAndre Kostelanetz And His Orchestra\tBegin The Beguine\tCOLUMBIA\t4265-M\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh140.mp3\tJoe Loss And His Band\tBegin The Beguine (v Chick Henderson)\tRegal Zonophone\tMR-3098\tCAR-5469-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06620-2.mp3\tTommy Dorsey & His Orchestra\tBeginner's Luck\tVICTOR\t25544\t06620-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP2832.mp3\tBenny Goodman Sextet\tBehave Yourself\tCAPITOL\t\t2832\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S412.mp3\tMaxine Sullivan\tBehavin' Myself For You\tMGM\t10343\t48S412\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/COS4901.mp3\tTrummy Young\tBehind The 8 Bar\tCOSMO\t901\t4901\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CON17477.mp3\tCarter Family\tBehind Those Stone Walls\tCONQUEROR\t8633\t17477\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061519.mp3\tSpike Jones & His Cityslickers\tBehind Those Swinging Doors\tBLUEBIRD\t11282A\t061519\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2758.mp3\tHappy Six\tBehind Your Silken Viel\tColumbia\tA2758\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16197.mp3\tDjango Reinhardt Et Son Grand Orchestre Fud Candrix Et Son Orchestre\tBei Dir War Es Immer So Schon\tRythme\tD5018\t16197\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62896.mp3\tElla Fitzgerald And Her Savoy 8\tBei Mir Bist Du Schoen\tDECCA\t1596\t62896\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_290.mp3\tKate Smith\tBei Mir Bist Du Schoen\tVICTOR\t25752\t017779\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480722.mp3\tBenny Goodman And His Orchestra\tBei Mir Bist Du Schoen\tColumbia\tSL 160\t\t1938\tCarnegie Hall Concert?:<br>Harry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Hymie Schertzer, George Koenig (as), Arthur Rollini, Babe Russin (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm), Martha Tilton (vo)\nhttp://www.jazz-on-line.com/a/mp3a/LONDR8278-1.mp3\tRoy Marsh And His Swingtet\tBei Mir Bist Du Schoen (means That You're Grand)\tLONDON\tW.7322\tDR. 8278-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62811.mp3\tAndrews Sisters\tBei Mir Bist Du Schon\tDECCA\t23605A\t62811\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP5568.mp3\tBenny Goodman\tBei Mir Bist Du Schon\tCOLUMBIA\t39287\tZSP5568\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_007.mp3\tAndrews Sisters\tBei Mir Bist Du Schon\tDECCA\t1562\t62811-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COL77764.mp3\tAl Campbell & Henry Burr\tBelgian Rose\tCOLUMBIA\tA-2559\t77764\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_022.mp3\tHenry Burr And Albert Campbell\tBelgian Rose\tCOLUMBIA\t2559\t77764\t1918\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke26066-A.mp3\tJimmie Lunceford And His Orchestra\tBelgium Stomp\tOkeh\t5207\t26066-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_184.mp3\tDon Cornell With Orchestra Directed By Norman Leyden\tBelieve In Me\tCoral\t61171\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC84922.mp3\tFats Waller And His Rhythm\tBelieve It Beloved\tVICTOR\t24808\t84922\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/MERC781-3.mp3\tJohnny Hodges & Al Hibbler\tBelieve It Beloved\tMERCURY\t89011\tC781-3\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT985.mp3\tJohnny Guarnieri Trio\tBelieve It Beloved\tMAJESTIC\t1095\tT985\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77441.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tBelieve It, Beloved\tUltraphone\tAP-1511\tP-77441\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84922-1.mp3\t\"fats Waller And His Rhythm\tBelieve It, Beloved\tVictor\t24808\t84922-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_129.mp3\tJohn Mccormack\tBelieve Me If All Those Endearing Young Charms\tVICTOR\t26569\tV64180\t1911\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67399.mp3\tBob Crosby & His Orchestra\tBelieving\tDECCA\t3103B\t67399\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_197.mp3\tBob Crosby And His Orchestra Feat. V/marion Mann\tBelieving\tDECCA\t3055A\t67242\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_119.mp3\tTeresa Brewer Feat. Jack Pleis Orchestra\tBell Bottom Blues\tCoral\t61066\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1333.mp3\tKay Kyser And His Orchestra\tBell Bottom Trousers\tCOLUMBIA\t36801\tHCO1333\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18683A.mp3\tGuy Lombardo And His Orchestra\tBell Bottom Trousers\tDECCA\t18683A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_033.mp3\tKay Kyser And His Orchestra\tBell Bottom Trousers\tCOLUMBIA\t36801\tHCO1333\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_084.mp3\tJerry Colonna\tBell Bottom Trousers\tCapitol\t204\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_160.mp3\tJesters\tBell Bottom Trousers\tDECCA\t4452A\tL3441\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT511.mp3\tLouis Prima & His Orchestra\tBell Bottom Trousers (v L P)\tMAJESTIC\t7134\tT511\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/CONW3335.mp3\tSlam Stewart Qt\tBell For Norvo\tCONTIN\t10002\tW3335\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4747.mp3\tAndrews Sisters\tBella Bella Marie\tDECCA\t24499\tL4747\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_170.mp3\tAndrews Sisters\tBella Bella Marie\tDECCA\t24499\tL4747\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_159.mp3\tLarry Green And His Orchestra\tBella Bella Marie\tRCA Victor\t3072\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45845.mp3\tGuy Mitchell\tBelle Belle My Liberty Bell\tCOLUMBIA\t39512\tCO45845\t1951\t\nhttp://www.78-tours.net/mp3/ODEKI2569.mp3\tL'orchestre \"odon Military\"\tBelle Elisa\tODON\t165.721\tKI 2569\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_228.mp3\tBobby Wayne\tBelle, Belle, My Liberty Belle\tMERCURY\t5690\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_251.mp3\tDon Cherry Feat. O/sonny Burke\tBelle, Belle, My Liberty Belle\tDECCA\t27717\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-265-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tBelleville\tSWING\t162\tOSW-265-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDR-10027-2.mp3\tThe Quintet Of The Hot Club Of France (with Django Reinhardt)\tBelleville\tDECCA\tF8876\tDR-10027-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-330-1.mp3\tDjango Reinhardt Et Son Orchestre<br>fud Candrix Et Son Orchestre\tBelleville\tSWING\t215\tOSW-330-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/SAV5481.mp3\tPete Brown Quintette\tBellevue For You\tSAVOY\t522B\t5481\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_170.mp3\tDon Bestor And His Orchestra\tBeloved\tVICTOR\t24391\t77558-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_103.mp3\tRuth Etting\tBeloved\tCOLUMBIA\t1420 D\tW146347-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/HITT447.mp3\tLouis Prima & His Orchestra\tBeloved (f T) (v L C)\tHIT OF THE WEEK\t7107b\tT447\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/MERC663-4.mp3\tJohnny Hodges & His Orchestra\tBelow The Azores\tMERCURY\t8977\tC663-4\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU40751.mp3\tJimmie Rodgers\tBen Dewberry's Final Run\tBLUEBIRD\t5482\t40751\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC110.mp3\tPete Johnson's Allstars\tBen Rides Out\tNATIONAL\t\tNSC110\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO36767.mp3\tBenny Goodman & His Orchestra\tBenjie's Bubble\tCOLUMBIA\t37187\tCO36767\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/CBSCO29065-1.mp3\tBenny Goodman And His Orchestra\tBenny Rides Again\tCBS\tCO55001\tCO29065-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-DJ640.mp3\tBenny Goodman Sextet\tBenny's Bop\tV-DISC\t880\tJ640\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74729.mp3\tLionel Hampton Sextet\tBenson Boogie\tDECCA\t24574\t74729\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec74729.mp3\tLionel Hampton And His Orchestra\tBenson's Boogie\tDecca\t24574\t74729\t1949\tBenny Bailey-Duke Garrette-t, Johnny Board-as, Gene Morrists, Albert Ammons-p, Lionel Flampton-vib-p-a-v, Wes Montgomery-g, Roy Johnson-p, Earl Walker-d, Sonny Parker-Betty Carter-v\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47263.mp3\tDuke Ellington And His Orchestra\tBensonality\tCOLUMBIA\t39712\tCO47263-1\t1951\tWillie Cook, Harold \"Shorty\" Baker, Francis Williams, Clark Terry, Dick Vance (tp) Quentin Jackson, Britt Woodman, Juan Tizol (tb) Jimmy Hamilton (cl,ts) Russell Procope (as,cl) Willie Smith (as) Paul Gonsalves (ts) Harry Carney (bar,cl,b-cl) Duke Ellington (p) Wendell Marshall (b) Louie Bellson (d) \nhttp://www.jazz-on-line.com/a/mp3e/V-D153A.mp3\tBoston Symphony Orch. (serge Koussevitsky)\tBerlioz Rakoczy March\tV-DISC\t153A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_209.mp3\tRay Anthony Feat. Tommy Mercer And Marcie Miller\tBermuda\tCapitol\t1956\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_047.mp3\tBell Sisters Feat. Henri Rene's Orchestra\tBermuda\tRCA Victor\t4422\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480558.mp3\tArt Pepper\tBernie's Tune\tContemporary\tM3568\t\t1959\tJackSheldon, Al Porcino (tp), Dick Nash (tb), Bob Ebevoldsen (ts), Vince DeRosa (fhr), Art Pepper, Charlie Kennedy (as), Richie Kamuca (ts), Med Flory (bar), Russ Freeman (p), Joe Mondragon (sb), Mel Lewis (dm), Marty Paich (arr, cond)\nhttp://www.jazz-on-line.com/a/mp3b/Dec74100.mp3\tLucky Millinder And His Orchestra\tBersark Boogie\tDecca\t24495\t74100\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPxxx.mp3\tAndy Russell\tBesame Mucho\tCAPITOL\t\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3214.mp3\tJimmy Dorsey's Orchestra\tBesame Mucho\tDECCA\t18574B\tL3214\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/BEL1023.mp3\tArtie Shaw And Gramercy Five.\tBesame Mucho\tBELL\tBELL1023\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_082.mp3\tAndy Russell\tBesame Mucho\tCapitol\t149\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_004.mp3\tJimmy Dorsey And His Orchestra\tBesame Mucho\tDECCA\t18574B\tL3214\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU27112-3.mp3\tFrank Black & His Orchestra\tBeside A Lazy Stream\tBRUNSWICK\t3892\t27112-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/CON9279-2.mp3\tDorsey Brothers Orch Vocal Scrappy Lambert\tBeside An Open Fireplace (vsl)\tCONQUEROR\t7476\t9279-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70541.mp3\tMaxine Sullivan\tBeside The River Clyde\tDECCA\t4307B\t70541\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP6844.mp3\tTeddy Wilson\tBess You Is My Woman\tCOLUMBIA\t39431\tZSP6844\t\t\nhttp://www.jazz-on-line.com/a/mp3h/M-G59-XY-15.mp3\tHarry James And His Orchestra\tBess, You Is My Woman\tM-G-M\tK12842\t59-XY-15\t1959\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC63655-1.mp3\tHoagy Carmichael & His Orchestra\tBessie Couldn't Help It\tVICTOR\t22864\t63655-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403714-B.mp3\tLouis Armstrong & His Orchestra\tBessie Couldn't Help It\tOKeh\t8774\t403714-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUMP34-B.mp3\tSlatz Randall And His Orchestra\tBessie Couldn't Help It (vjr)\tBRUNSWICK\t4331\tMP34-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0820_01.mp3\tLee Morse\tBest Of All\tPerfect\t11589B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/SPE414.mp3\tRoy Milton\tBest Wishes\tSPECIALTY\t414\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-11852-B.mp3\tDuke Ellington And His Famous Orchestra\tBest Wishes\tBrunswick\t6374\tB-11852-B\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65903.mp3\tElla Fitzgerald & Her Orchestra\tBetcha Nickel\tDECCA\t2904A\t65903\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65903-A.mp3\tElla Fitzgerald And Her Famous Orchestra\tBetcha Nickel\tDecca\t2904\t65903-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61448.mp3\tWoody Herman & His Orchestra\tBetter Get Off Your High Horse\tDECCA\t1079\t61448\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC47092.mp3\tWill Shade\tBetter Leave That Stuff Alone\tVICTOR\t21725\t47092\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_332.mp3\tJo Stafford\tBetter Luck Next Time\tCapitol\t15084\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62448-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tBetter Luck Next Time\tDecca\t1422\t62448-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1924_1200_02.mp3\tLee Morse\tBetter Shoot Straight With Your Mamma\tPathe\t032101B\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18761-2.mp3\tBen Selvin & His Orchestra\tBetty\tBRUNSWICK\t3172\t18761-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2934.mp3\tJesse Ashlock's String Band\tBetty Ann\tCOLUMBIA\t38144\tHCO2934\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC62283-2.mp3\tRudy Vallee Connecticut Yanks\tBetty Co-ed\tVICTOR\t22473A\t62283-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_045.mp3\tRudy Vallee And His Connecticut Yankees\tBetty Co-ed\tVICTOR\t22473A\t62283-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_041.mp3\tBob Haring And His Orchestra\tBetty Co-ed\tBRUNSWICK\t4852\tE33301\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1097-G.mp3\tPhil Spitalny's Music\tBetty Coed (vsl)\tHIT OF THE WEEK\t1097\t1097-G\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_188.mp3\tBing Crosby And Connee Boswell\tBetween 18th & 19th On Chestnut Street\tDECCA\t2948A\tDLA1910\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043992.mp3\tCharlie Barnet & His Orchestra\tBetween 18th And 19th On Chestnut St\tBLUEBIRD\t10543\t043992\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1910.mp3\tBing Crosby And Connie Boswell\tBetween 18th And 19th On Chestnut Street\tDECCA\t2948A\tDLA1910\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_238.mp3\tCharlie Barnet And His Orchestra Feat. V/mary Ann Mccall\tBetween 18th And 19th On Chestnut Street\tBluebird\t10543\t43992\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_267.mp3\tBob Crosby And His Orchestra Feat. Nappy Lamare And Eddie Miller\tBetween 18th And 19th On Chestnut Street\tDecca\t2935\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_210.mp3\tArtie Shaw And His Orchestra\tBetween A Kiss And A Sigh\tBluebird\t10055\t028973-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030327.mp3\tTommy Dorsey & His Orchestra\tBetween A Kiss And A Sigh\tVICTOR\t26115\t030327\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1689.mp3\tBing Crosby & Trotter's Orchestra\tBetween A Kiss And A Sigh\tDECCA\t2289B\tDLA1689\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU028973-1.mp3\tArtie Shaw And His Orchestra\tBetween A Kiss And A Sigh (v H F)\tBLUEBIRD\t10055\t028973-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29416-1.mp3\tLes Brown & His Orchestra\tBetween Friends\tOKEH\t6011\t29416-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65629-A.mp3\tBilly Kyle (piano)\tBetween Sets\tDECCA\t2740B\t65629-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW351154-3.mp3\tFrank Auburn & H.o. (selvin)\tBetween The Devil & The Deep Blue Sea\tCOLUMBIA\tHA1412\tW351154-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26280.mp3\tCount Basie And His Orchestra\tBetween The Devil And The Deep Blue Sea\tCOLUMBIA\t35357\t26280\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLB22026.mp3\tTeddy Wilson And His Orchestra\tBetween The Devil And The Deep Blue Sea\tCOLUMBIA\t36274\tB22026\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe405130-A.mp3\tLouis Armstrong & His Orchestra\tBetween The Devil And The Deep Blue Sea\tOKeh\t41550\t405130-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152285.mp3\tFrankie Trumbauer & His Orchestra\tBetween The Devil And The Deep Blue Sea\tCOLUMBIA\t2729 D\tW152285\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOLA1885.mp3\tDickie Wells & His Orchestra\tBetween The Devil And The Deep Blue Sea\tVICTOR\t26220\tOLA1885\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE37266.mp3\tCab Calloway & His Orchestra\tBetween The Devil And The Deep Blue Sea\tBRUNSWICK\t6209\tE37266\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA1607.mp3\tEddy Duchin & His Orchestra\tBetween The Devil And The Deep Blue Sea\tCOLUMBIA\t36278\tLA1607\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU11544-A.mp3\tBoswell Sisters\tBetween The Devil And The Deep Blue Sea\tBRUNSWICK\t6291\t11544-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC61592.mp3\tBob Crosby & His Orchestra\tBetween The Devil And The Deep Blue Sea\tDECCA\t3335B\t61592\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_144.mp3\tLouis Armstrong\tBetween The Devil And The Deep Blue Sea\tCOLUMBIA\t2600 D\t152086\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh204.mp3\tLee Wiley Acc. By Eddie Condons Sextet\tBetween The Devil And The Deep Blue Sea\tSchirmer\t2009\t2112\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_170.mp3\tCab Calloway And His Orchestra\tBetween The Devil And The Deep Blue Sea\tBRUNSWICK\t6209\tE37266\t1931\t\nhttp://www.jazz-on-line.com/a/mp3/Joh401.mp3\tLee Wiley\tBetween The Devil And The Deep Blue Sea\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_150.mp3\tBoswell Sisters Feat. Dorsey Brothers Orchestra\tBetween The Devil And The Deep Blue Sea\tBRUNSWICK\t6291\t11544-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-37266-A.mp3\tCab Calloway And His Orchestra\tBetween The Devil And The Deep Blue Sea\tBrunswick\t6209\tE-37266-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26280-A.mp3\tCount Basie And His Orchestra\tBetween The Devil And The Deep Blue Sea\tColumbia\t35357\t26280-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA227.mp3\tAndy Iona & His Islanders\tBeulah\tCOLUMBIA\t2967 D\tLA227\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA227.mp3\tAndy Iona & His Islanders\tBeulah\tCOLUMBIA\t3137 D\tLA227\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72876-A.mp3\tLionel Hampton And His Orchestra\tBeulah's Boogie\tDecca\t18719\t72876-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec74732.mp3\tLionel Hampton And His Orchestra\tBeulah's Sister's Boogie\tDecca\t24699\t74732\t1949\tBenny Bailey-Duke Garrette-Wendell Culley-Leo Shepherd-Walter Wiliams-t, Lester Bass-Al Grey-Benny Powell-Jimmy Wormick-tb, Johnny Board-Bobby Plater-as, Gene MorrisJohnny Sparrow-Billy Williams-ts, Ben Kynard-bar, Albert Ammons-p, Lionel Hampton-vib\nhttp://www.jazz-on-line.com/a/mp3a/DEC18818A.mp3\tLouis Jordan And Tympani 5\tBeware\tDECCA\t18818A\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_261.mp3\tMargaret Whiting\tBeware My Heart\tCapitol\t350\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLXXX3.mp3\tAmos Milburn\tBewildered\tALLADDIN\t3018\tXXX3\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC019620.mp3\tTommy Dorsey & His Orchestra\tBewildered\tVICTOR\t25795\t019620\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22564-1.mp3\tMildred Bailey\tBewildered\tCBS\tVO4036\t22564-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM49S3.mp3\tBilly Eckstine\tBewildered\tMGM\t10340B\t49S3\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_155.mp3\tTommy Dorsey And His Orchestra\tBewildered\tVICTOR\t25795\t019620\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_278.mp3\tBilly Eckstine Feat. Hugo Winterhalter's Orchestra\tBewildered\tMGM\t10340B\t49S3\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO3765.mp3\tDoris Day\tBewitched\tCOLUMBIA\t38698\tHCO3765\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24983x.mp3\tGordon Jenkins\tBewitched\tDECCA\t24983\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COL29579.mp3\tBenny Goodman & His Orchestra\tBewitched\tCOLUMBIA\t35944\t29579\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_081.mp3\tMel Torme\tBewitched\tCapitol\t1000\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_083.mp3\tHarmonicats Feat. Jan August Orchestra\tBewitched\tMERCURY\t5399\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_092.mp3\tDoris Day Feat. John Rarig's Orchestra\tBewitched\tCOLUMBIA\t38698\tHCO3765\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_083.mp3\tHarmonicats Feat. Jan August Orchestra\tBewitched\tMERCURY\t5399\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_137.mp3\tLarry Green And His Orchestra\tBewitched\tRCA Victor\t3726\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLH1223.mp3\tTed Daffan's Texans\tBeyond A Shadow Of A Doubt\tCOLUMBIA\t20015\tH1223\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA552.mp3\tBing Crosby & Victor Young\tBeyond Compare\tDECCA\t912B\tDLA552\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA552-A.mp3\tVictor Young And His Orchestra With Bing Crosby\tBeyond Compare\tDECCA\t912B\tDLA552-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC067748-2.mp3\tArtie Shaw And His Orchestra\tBeyond The Blue Horizon\tVICTOR\t27641B\t067748-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_096v2.mp3\tJeanette Macdonald\tBeyond The Blue Horizon\tVICTOR\t22514\t61008-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC61019-4.mp3\tGeorge Olsen And His Music\tBeyond The Blue Horizon (vbb) ('monte Carlo')\tVICTOR\t22530A\t61019-4\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT987.mp3\tJohnny Guarnieri Trio\tBeyond The Moon\tMAJESTIC\t1094\tT987\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26289.mp3\tBenny Goodman & His Orchestra\tBeyond The Moon\tCOLUMBIA\t35410\t26289\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYHL159.mp3\tBernie Leighton Qt\tBeyond The Moon\tKEYNOTE\t643\tHL159\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL5816.mp3\tBing Crosby / Lyn Murray\tBeyond The Reef\tDECCA\t27219\tL5816\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO40375.mp3\tSarah Vaughan\tBianca\tCOLUMBIA\t38461\tCO40375\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_151.mp3\tPerry Como And Fontane Sisters\tBibbidi-bobbidi-boo\tRCA Victor\t78-3113\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_106.mp3\tFoursome\tBidin' My Time\tDECCA\t2880A\tDLA1813\t1931\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480645.mp3\tBen Webster And Harry Edison\tBidin? My Time\tVerve\tEPV5046\t20571-1\t1957\tBen Webster, Ts, Harry Sweets Edison, T, Jimmy Rowles, P, Barney Kessel, G, Joe Mandragon, B, Larry Bunker, D, Woody Herman, Vocal\nhttp://www.jazz-on-line.com/a/mp3d/Vic55134-2.mp3\tHerny ''red'' Allen And His New York Orchestra\tBiffly Blues\tVictor\tV-38073\t55134-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17427.mp3\tSkillet Lickers\tBig Ball In Town\tARC\t\t17427\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPrayMac.mp3\tRay Mckinley\tBig Boy\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81654-1.mp3\tThe Georgians\tBig Boy\tColumbia\t117-D\t81654-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN9116.mp3\tWolverine Orchestra\tBig Boy\tGENNETT\t5565\t9116\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67394-A.mp3\tBud Freeman And His Summa Cum Laude Orchestra\tBig Boy\tDECCA\t18064\t67394-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61529.mp3\tElla Fitzgerald & Mills Bros\tBig Boy Blue\tDECCA\t1148\t61529\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS20600.mp3\tSharkey Bonano Sharks\tBig Boy Blue\tCBS\tVO3450\t20600\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_366.mp3\tElla Fitzgerald And Mills Brothers\tBig Boy Blue\tDECCA\t1148\t61529\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU20695-1.mp3\tBunny Berigan & His Boys\tBig Boy Blue (v J. Hauser)\tBRUNSWICK\t7847\t20695-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM280-2.mp3\tBilly Kyle Swing Club Band\tBig Boy Blues\tVARIETY\tI531\tM280-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/VICOLA1981.mp3\tBill Coleman And His Orch\tBig Boy Blues\tVICTOR\t26223\tOLA1981\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic56782-3.mp3\tEd Green - Billy Higgins And Company\tBig Business - Part 1\tVictor\tV-38552\t56782-3\t1929\tFats Waller, piano\nhttp://www.jazz-on-line.com/a/mp3b/Vic56783-3.mp3\tEd Green - Billy Higgins And Company\tBig Business - Part 2\tVictor\tV-38552\t56783-3\t1929\tFats Waller, piano\nhttp://www.jazz-on-line.com/a/mp3c/BLU040260-1.mp3\tMuggsy Spanier Ragtime Band\tBig Butter And Egg Man\tBLUEBIRD\t10417\t040260-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe09892-A.mp3\tLouis Armstrong's Hot Five\tBig Butter And Egg Man\tOKeh\t8423\t09892-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_154.mp3\tLouis Armstrong\tBig Butter And Egg Man\tOKeh\t8423\t09892-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101864.mp3\tRay Noble & His Orchestra\tBig Chief De Sota\tVICTOR\t25346\t101864\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101672.mp3\tFats Waller And His Rhythm\tBig Chief De Sota\tVICTOR\t25342\t101672\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic101672-1.mp3\t\"fats\" Waller And His Rhythm\tBig Chief De Sota\tVictor\t25342\t101672-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeC-1332-1.mp3\tFletcher Henderson And His Orchestra\tBig Chief De Sota\tOkeh\t3213\tC-1332-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1332.mp3\tFletcher Henderson & His Orchestra\tBig Chief De Sota (grand Terrace Swing)\tVOCALION\t3213\tC1332\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148182-2.mp3\tAnnette Hanshaw\tBig City Blues\tCOLUMBIA\t1812 D\tW148182-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL4027-1.mp3\tWynonie Harris & His Allstars\tBig City Blues\tALLADDIN\t196\t4027-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036BCB.mp3\tEdmond Hall\tBig City Blues\tBLUENOTE\tBN036\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR148178-2.mp3\tBert Lown & His Loungers\tBig City Blues\tHARMONY\t920-H\t148178-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_119.mp3\tAnnette Hanshaw\tBig City Blues\tCOLUMBIA\t1812 D\tW148182-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR95-3.mp3\tIllinois Jacquet & His Orchestra\tBig Dog\tALLADDIN\t180\tRR95-3\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480728.mp3\tJack Teagarden's Big Eight\tBig Eight Blues\tHRS\t2007\tR3416\t1940\tRex Stewart (co), Jack Teagarden (tb), Barney Bigard (cl), Ben Webster (ts), Billy Kyle (p), Brick Fleagle (g), Billy Taylor Sr. (sb), Dave Tough (dm)\nhttp://www.jazz-on-line.com/a/mp3b/DEC69235.mp3\tSkeets Tolbert Gentlemen Swing\tBig Fat Butterfly\tDECCA\t8579B\t69235\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec69235-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tBig Fat Butterfly\tDecca\t8579\t69235-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/PARP1434.mp3\tJelly Roll Morton\tBig Fat Ham\tPARAMOUNT\t12050\tP1434\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe09777-A.mp3\tLouis Armstrong's Hot Five\tBig Fat Ma And Skinny Pa\tOKeh\t8379\t09777-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69706.mp3\tLucky Millinder & His Orchestra\tBig Fat Mama\tDECCA\t4041A\t69706\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69706-A.mp3\tLucky Millinder And His Orchestra\tBig Fat Mama\tDecca\t4041\t69706-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK2632.mp3\tHank Penny\tBig Fat Papa\tKING\t727B\tK2632\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63426.mp3\tBob Crosby's Bobcats\tBig Foot Jump\tDECCA\t2108A\t63426\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec66880-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tBig Jim Blues\tDecca\t2915\t66880-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC023508.mp3\tBenny Goodman And His Orchestra\tBig John Special\tVICTOR\t25871\t023508\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC19824.mp3\tErskine Hawkins Bama St.coll.\tBig John's Special\tARC\tVO3318\t19824\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-20294-1.mp3\tMills Blue Rhythm Band\tBig John's Special\tColumbia\t3162-D\tCO-20294-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec38600-A.mp3\tFletcher Henderson And His Orchestra\tBig John's Special\tDecca\t214\t38600-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480732.mp3\tBenny Goodman And His Orchestra\tBig John's Special\tColumbia\tSL 160\t\t1938\tCarnegie Hall Concert?:<br>Harry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Hymie Schertzer, George Koenig (as), Arthur Rollini, Babe Russin (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1936_261.mp3\tErskine Hawkins And His Orchestra\tBig John's Special\tVOCALION\t3318\t19824\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1284.mp3\tArnett Cobb & His Orchestra\tBig League Blues\tAPOLLO\t394\tR1284\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COMR2585.mp3\tJelly Roll Morton's Seven\tBig Lip Blues\tCOMMODORE\t632\tR2585\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC84216.mp3\tDolores Gray\tBig Mamou\tDECCA\t28676\t84216\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_200.mp3\tDolores Gray\tBig Mamou\tDECCA\t28676\t84216\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_154.mp3\tPete Hanley With Norman Leyden Orchestra\tBig Mamou\tOKEH\t6956\tCO48883-1\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65981.mp3\tWoody Herman & His Orchestra\tBig Morning\tDECCA\t2664A\t65981\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DECC91518.mp3\tBob Haggart And Ray Bauduc\tBig Noise From Winnetka\tDECCA\t2208B\tC91518\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECLA2292.mp3\tBob Crosby & His Orchestra\tBig Noise From Winnetka\tDECCA\t3611 A\tLA2292\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COM592BT.mp3\tJack Teagarden's Swing Gates\tBig T Blues\tCOMMODORE\t592\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL30125y.mp3\tBig Three Trio\tBig Three Boogie\tCOLUMBIA\t30125\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69519.mp3\tAndy Kirk & Clouds Of Joy\tBig Time Crip\tDECCA\t4042B\t69519\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69519-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tBig Time Crip\tDecca\t4042\t69519-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC4067-1.mp3\tChampion Jack Dupree\tBig Time Mama\tOKEH\t6597\tC4067-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65380.mp3\tWoody Herman & His Orchestra\tBig Wig In The Wig Wam\tDECCA\t2440B\t65380\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037617.mp3\tLionel Hampton & His Orchestra\tBig Wig In The Wigwam\tVICTOR\t26296\t037617\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036943.mp3\tErskine Hawkins & His Orchestra\tBig Wig In The Wigwam\tBLUEBIRD\t10287\t036943\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic037617-1.mp3\tLionel Hampton And His Orchestra\tBig Wig In The Wigwam\tVictor\t26296\t037617-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU064869.mp3\tJohnny Temple\tBig Woman Blues\tBLUEBIRD\t8968\t064869\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55662-2.mp3\tNat Shilkret & His Orchestra\tBigger & Better Than Ever (vdh)\tVICTOR\t22109\t55662-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru4516.mp3\tBen Bernie & His Hotel Roosenvelt Orchestra\tBigger And Better Than Ever\tBrunswick\t4516\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-14-1.mp3\tNol Chiboust Et Son Orchestre (with Django Reinhardt)\tBijou\tSWING\t119\tOSW-14-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DiaD-1087-A.mp3\tDexter Gordon Quartet\tBikini\tDial\t1022\tD-1087-A\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC42443-2.mp3\tHelen Morgan\tBill\tVICTOR\t21238\t42443-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_034.mp3\tHelen Morgan\tBill\tVICTOR\t21238\t42443-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031825.mp3\tArtie Shaw And His Orchestra\tBill (vh.forrest)\tBLUEBIRD\t10124\t031825-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17432H.mp3\tThe Dutch Swing College Band\tBill Bailey Won't You Please Come Home\tPhilips\tP17432H\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1902_002.mp3\tArthur Collins\tBill Bailey, Won't You Please Come Home\tColumbia\t872\t\t1902\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOLA1983.mp3\tBill Coleman And Django\tBill Coleman Blues\tVICTOR\t27318B\tOLA1983\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148469-2.mp3\tCharlie Poole N.c.ramblers\tBill Mason\tCOLUMBIA\t15407 D\tW148469-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB402.mp3\tCount Basie & His Orchestra\tBill's Mill\tRCA\t20-2148\tD7VB402\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC42091-2hpp.mp3\tDjango Reinhardt & The Hot Club De France Quintet W_stphane Grapelli, Violin\tBillets Doux\tDECCA\tF-7568\t42091-2hpp\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/HARLA1487.mp3\tSons Of The Pioneers\tBillie The Kid\tHARMONY\tHa1033\tLA1487\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COL19538-2.mp3\tBillie Holiday\tBillie's Blues\tCOLUMBIA\t37496\t19538-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS5850-5.mp3\tCharlie Parker Bee Boppers\tBillie's Bounce\tSAVOY\t573A\tS5850-5\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481513.mp3\tCharles Mingus\tBillie?s Bounce\tBethlehem\tBCP6026\t\t1957\tJimmy Knepper (tb), Shafi Hadi (as, ts), Horace Parlan (p), Charles Mingus (sb, arr), Dannie Richmond (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DEC66135.mp3\tElla Fitzgerald & Her Orchestra\tBilly\tDECCA\t2769B\t66135\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24577-B.mp3\tOrrin Tucker & His Orchestra\tBilly (vb.baker)\tCBS\tVO4914\t24577-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC38628-1.mp3\tJelly Roll Morton Hot Peppers\tBilly Goat Stomp\tVICTOR\t20772\t38628-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic38628-1.mp3\tJelly-roll Morton's Red Hot Peppers\tBilly Goat Stomp\tVictor\t20772\t38628-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_163.mp3\tFrank Sinatra\tBim Bam Baby\tCOLUMBIA\t39819\tHCO10190\t1952\t\nhttp://www.jazz-on-line.com/mp3/156302213.mp3\tJim Reeves\tBimbo\tABBOTT\t148\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_278.mp3\tJim Reeves\tBimbo\tABBOTT\t148\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC25700-4.mp3\tBenson Orchestra Of Chicago\tBimini Bay\tVICTOR\t18824B\t25700-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_044.mp3\tBenson Orchestra Of Chicago\tBimini Bay\tVICTOR\t18824B\t25700-4\t1922\t\nhttp://www.78-tours.net/mp3/PATCPT9210.mp3\tJacques Hlian Et Son Orchestre Chant : Lou Darley Enregistr Au Thatre Des Champs-lyses\tBing Bang Blues (the Blacksmith Blues)\tPATH\tPG 664\tCPT 9.210\t\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVD833-3.mp3\tCharlie Parker\tBird Gets The Worm\tSAVOY\t309\tD833-3\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39552.mp3\tJimmie Lunceford & His Orchestra\tBird Of Paradise\tDECCA\t639B\t39552\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA1053.mp3\tCharlie Parker\tBird's Nest\tDIAL\t1014\t1053\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2289.mp3\tBing Crosby\tBirds Of A Feather\tDECCA\t3637B\tDLA2289\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18834.mp3\tArthur Fields & All Star Trio\tBirds Of A Feather\tVictor\t18834\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480601.mp3\tArt Pepper\tBirks Works\tContemporary\tC3532\t\t1957\tArt Pepper (as), Red Garland, P, Philly Jo Jones, D, Paul Chambers, B\nhttp://www.jazz-on-line.com/a/mp3a/VIC55516-2.mp3\tJean Goldkette Orch (mckinney)\tBirmingham Bertha\tVICTOR\t22077B\t55516-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUC-3942-B.mp3\tWalter Barnes Royal Creolians\tBirmingham Bertha\tBRUNSWICK\t4480\tC-3942-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_245.mp3\tEthel Waters\tBirmingham Bertha\tBLUEBIRD\t11027\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Oke70949-D.mp3\tThomas Waller (fats Waller)\tBirmingham Blues\tOkeh\t4757\t70949-D\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76205.mp3\tLionel Hampton's Orchestra\tBirmingham Bounce\tDECCA\t27041\t76205\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec76205.mp3\tLionel Hampton And His Orchestra\tBirmingham Bounce\tDecca\t27041\t76205\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Cor76168.mp3\tLionel Hampton And His Orchestra\tBirmingham Bounce\tCoral\t622422\t76168\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_154.mp3\tRed Foley\tBirmingham Bounce\tDecca\t46234\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3h/VocE-4114.mp3\tDuke Ellington And His Kentucky Club Orchestra\tBirmingham Breakdown\tVocalion\t1064\tE-4114\t1926\t\nhttp://www.jazz-on-line.com/a/mp3h/BruE-21641.mp3\tDuke Ellington And His Kentucky Club Orchestra\tBirmingham Breakdown\tBrunswick\t3840\tE-21641\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26378-B.mp3\tGene Krupa & His Orchestra\tBirth Of Passion\tCBS\t(Reject)\t26378-B\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC35770-4.mp3\tRevelers\tBirth Of The Blues\tVICTOR\t20111\t35770-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_144.mp3\tRevelers\tBirth Of The Blues\tVICTOR\t20111\t35770-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC87325.mp3\tBill Haley And His Comets\tBirth Of The Boogie\tDECCA\t29418\t87325\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_132.mp3\tBill Haley And His Comets\tBirth Of The Boogie\tDecca\t29418\t87325\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2675.mp3\tWoody Herman & His Orchestra\tBishop's Blues\tDECCA\t3972A\tDLA2675\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5330.mp3\tWynonie Harris & Orchestra\tBit Again, Bite Again\tKING\t4252A\tK5330\t1947\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19184.mp3\tCharles Dornberger & His Orchestra\tBit By Bit You're Breaking My Heart\tVictor\t19184\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_409.mp3\tBilly Eckstine\tBitter With The Sweet\tRCA\t6436\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36098y.mp3\tJack Hylton Orchestra\tBittersweet Selections (vn.coward)\tVICTOR\t36098\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D213B.mp3\tLes Brown And His Orchestra\tBizet Has His Day\tV-DISC\t213B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC7281x.mp3\tBlack Ace\tBlack Ace Blues\tDECCA\t7281\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU045747-1.mp3\tMuggsy Spanier Ragtime Band\tBlack And Blue\tBLUEBIRD\t10682\t045747-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP5056.mp3\tLouis Armstrong And His Orch.\tBlack And Blue\tCOLUMBIA\t39232\tZSP5056\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150160-3.mp3\tEthel Waters & Her Ebony 4\tBlack And Blue\tCOLUMBIA\t2184 D\tW150160-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/MERYW605-2.mp3\tFrankie Laine W Carl Fischer\tBlack And Blue\tMERCURY\t1026B\tYW605-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB3887.mp3\tGene Krupa & His Orchestra\tBlack And Blue\tRCA\t20-3735\tE0VB3887\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVS5271.mp3\tSidney Bechet-h.littleton\tBlack And Blue\tSAVOY\t744\tS5271\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17390H.mp3\tThe Dutch Swing College Band\tBlack And Blue\tPhilips\tP17390H\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/BruE-30585-A.mp3\tThe Jungle Band\tBlack And Blue\tBrunswick\t4492\tE-30585-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DECTB1076.mp3\tJack Hylton & His Orchestra\tBlack And Blue Rhythm\tDECCA\t1324\tTB1076\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE22299.mp3\tDuke Ellington And Famous Orch.\tBlack And Tan Fantasy\tBRUNSWICK\t6682\tE22299\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe81776.mp3\tDuke Ellington And His Orchestra\tBlack And Tan Fantasy\tOKEH\t40955\t81776\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38534.mp3\tJimmie Lunceford & His Orchestra\tBlack And Tan Fantasy\tDECCA\t453A\t38534\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/Cha18910.mp3\tPaul Davis And His Orchestra\tBlack And Tan Fantasy\tChampion\t16524\t18910\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban10601-1.mp3\tBlue Ribbon Boys\tBlack And Tan Fantasy\tBanner\t32199\t10601-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/BruE-4874.mp3\tThe Washingtonians\tBlack And Tan Fantasy\tBrunswick\t3526\tE-4874\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_170.mp3\tDuke Ellington And His Famous Orchestra\tBlack And Tan Fantasy\tVICTOR\t21137B\t40155-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDTB-3529-1.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tBlack And White\tDECCA\tF-6675\tDTB-3529-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE401172-AB.mp3\tDuke Ellington And His Orchestra\tBlack Beauty\tOKeh\t8636\t401172-AB\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE27094.mp3\tDuke Ellington & His Orchestra\tBlack Beauty (firewater)\tBRUNSWICK\t6803\tE27094\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA017766.mp3\tBunny Berigan And His Orchestra\tBlack Bottom\tRCA\t20-1502\t017766\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35724-5.mp3\tJohnny Hamp's Kentucky Seren.\tBlack Bottom\tVICTOR\t20101B\t35724-5\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC017766-1.mp3\tBunny Berigan & His Orchestra\tBlack Bottom\tVICTOR\t26138B\t017766-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiTheb.mp3\tFirman, Fred & His Dance Orchestra\tBlack Bottom\tThe Roaring Twenties\t\t\t2000\t\nhttp://www.jazz-on-line.com/a/mp3r/RiEme3060.mp3\tPennsyvania Sycopators\tBlack Bottom\tEmerson\t3060\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM-368-1.mp3\tBenny Carter And The Ramblers\tBlack Bottom\tDECCA\tF-42151\tAM-368-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_023.mp3\tJohnny Hamp's Kentucky Serenaders\tBlack Bottom\tVICTOR\t20101\t35724-5\t1926\tLester Brewer, Clayton Tewkesbury (tp), William Benedict (tb), Ray Stillson, Charles Dale (cl, as), Howard Bartlett (cl, ss, ts), Hal White (vn), Charles Buckwalter (p), Frank Masterson (bj), Elwood Groff (bb), John Strouse (dm), Johnny Hamp (dir)\nhttp://www.jazz-on-line.com/a/mp3b/DECAM2144-B.mp3\tThe Dutch Swing College Band\tBlack Bottom Blues\tDecca\tM32959\tAM2144-B\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU36239-2.mp3\tJelly Roll Morton's Jazzmen\tBlack Bottom Stomp\tBLUEBIRD\t10253\t36239-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36239-2.mp3\tJelly Roll Morton's Jazzmen\tBlack Bottom Stomp\tVICTOR\t20221A\t36239-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULO376.mp3\tDuke Ellington (piano Solo)\tBlack Butterfly\tBRUNSWICK\t8044\tLO376\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruLO-376-1.mp3\tDuke Ellington And His Orchestra\tBlack Butterfly\tBrunswick\t8044\tLO-376-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC17639-1.mp3\tWingy Manone And His Orchestra\tBlack Coffee\tARC\tVO2963\t17639-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO40386.mp3\tSarah Vaughan\tBlack Coffee\tCOLUMBIA\t38462\tCO40386\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC17639-1.mp3\tWingy Manone & His Orchestra\tBlack Coffee\tVOCALION\t2963\t17639-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24646BC.mp3\tElla Fitzgerald\tBlack Coffee\tDECCA\t24646\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVoc2963.mp3\tWingy Manone & His Orchestra\tBlack Coffee\tVocalion\t2963\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_124.mp3\tSarah Vaughan\tBlack Coffee\tCOLUMBIA\t38462\tCO40386\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh168.mp3\tNat Gonella And His Georgians\tBlack Coffee (v Nat Gonella)\tParlophone\tF-210\tCE-7086-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_054.mp3\tCheers, Orchestra And Chorus Of Les Baxter\tBlack Denim Trousers\tCapitol\t3219\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_184.mp3\tVaughn Monroe\tBlack Denim Trousers And Motorcycle Boots\tRCA Victor\t6260\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3h/COLW152368.mp3\tMark Fisher And His Edgewater Beach Hotel Orchestra\tBlack Eyed Susan Brown\tCOLUMBIA\t2749 D\tW152368\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146003-2.mp3\tGid Tanner's Skillet Lickers\tBlack Eyed Susie\tCOLUMBIA\t15283 D\tW146003-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC39325.mp3\tBirmingham Serenaders\tBlack Gal Blues\tDECCA\t7052\t39325\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/QRS2311.mp3\tGeorge Posnak And His Orchestra\tBlack Horse Stomp\tQRS\tQ-1051\t2311\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Har141528-2.mp3\tThe Dixie Stompers\tBlack Horse Stomp\tHarmony\t153-H\t141528-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3361.mp3\tCarter Family\tBlack Jack David\tOKEH\t6313\tC3361\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE37471A.mp3\tCasa Loma Orchestra\tBlack Jazz\tBRUNSWICK\t6242\tE37471A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC38509.mp3\tIsham Jones And His Orchestra\tBlack Magic\tDecca\t493\t38509\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044601.mp3\tFats Waller And His Rhythm\tBlack Maria\tBLUEBIRD\t10624\t044601\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/SUN7561.mp3\tHerbie Haymer Qt\tBlack Market Stuff\tSUNSET\t7561\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053742-1.mp3\tTommy Mcclennan\tBlack Minnie\tBLUEBIRD\t8704\t053742-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/TesLA4-A.mp3\tBing Crosby\tBlack Moonlight\tTest\t\tLA4-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/TesLA4-B.mp3\tBing Crosby\tBlack Moonlight\tTest\t\tLA4-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLRR1619.mp3\tCharles Brown And His Band\tBlack Night\tALLADDIN\t3076\tRR1619\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe08908-A.mp3\tOriginal Tuxedo Jazz Orchestra\tBlack Rag\tOKeh\t8198B\t08908-A\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC102016-1.mp3\tFats Waller And His Rhythm\tBlack Raspberry Jam\tVICTOR\t25359\t102016-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic102016-1.mp3\t\"fats\" Waller And His Rhythm\tBlack Raspberry Jam\tVictor\t25359\t102016-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BANE36803-A.mp3\tCab Calloway & His Orchestra\tBlack Rhythm (vcc)\tBANNER\t32766\tE36803-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU100682.mp3\tRichard M Jones\tBlack Rider\tBLUEBIRD\t6569\t100682\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/COL18077.mp3\tJoe Venuti & His Orchestra\tBlack Satin\tCOLUMBIA\t3105 D\t18077\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66312.mp3\tTexas Wanderers (c.bruner)\tBlack Sea Blues\tDECCA\t5740\t66312\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BruE-5170.mp3\tKing Oliver And His Dixie Syncopators\tBlack Snake Blues\tBrunswick\t80079\tE-5170\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe80728-B.mp3\tClarence Williams Blue 5\tBlack Snake Blues\tOKeh\t8465\t80728-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/PARP4577.mp3\tBlind Lemon Jefferson\tBlack Snake Dream\tPARAMOUNT\t12510\tP4577\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe80523-B.mp3\tBlind Lemon Jefferson\tBlack Snake Moan\tOKeh\t8455\t80523-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/DECLA2907.mp3\tBob Crosby & His Orchestra\tBlack Zephyr\tDECCA\t4415B\tLA2907\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_172.mp3\tMark Fisher And His Orchestra\tBlack-eyed Susan Brown\tCOLUMBIA\t2749 D\tW152368\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/BLU87680.mp3\tArthur Smith Trio\tBlackberry Blossom\tBLUEBIRD\t5896\t87680\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe405074.mp3\tThree Stripped Gears\tBlackberry Rag\tOKeh\t45571\t405074\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13079AB.mp3\tDuke Ellington & His Orchestra\tBlackbird Medley Part 1\tBRUNSWICK\t6516\t13079AB\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13080B.mp3\tDuke Ellington & His Orchestra\tBlackbird Medley Part 2\tBRUNSWICK\t6516\t13080B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3357.mp3\tCarter Family\tBlackie's Gunman\tOKEH\t6313\tC3357\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU065728-1.mp3\tErskine Hawkins & His Orchestra\tBlackout\tBLUEBIRD\t11192\t065728-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1922x.mp3\tElla Mae Morse\tBlacksmith Blues\tCAPITOL\t1922\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC63264.mp3\tNoble Sissle Swingsters\tBlackstick\tDECCA\t3865B\t63264\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_296.mp3\tDanny Kaye And Jimmy Durante And Groucho Marx And Jane Wyman\tBlackstrap Molasses\tDECCA\t27748\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23811-2.mp3\tMildred Bailey\tBlame It On My Last Affair\tCBS\tVO4632\t23811-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_217.mp3\tMildred Bailey Feat. Red Norvo (bandleader)\tBlame It On My Last Affair\tVOCALION\t4632\t23811-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64981-A.mp3\tCount Basie And His Orchestra\tBlame It On My Last Affair\tDecca\t2284\t64981-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-24516-1.mp3\tHarry James And His Orchestra\tBlame It On My Last Affair\tBrunswick\t8326\tB-24516-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC64981.mp3\tCount Basie & His Orchestra\tBlame It On My Last Affair (v Helen Humes)\tDECCA\t2284A\t64981\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_236.mp3\tJan Garber And His Orchestra\tBlame It On My Youth\tVICTOR\t24809B\t85012-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480615.mp3\tNat King Cole\tBlame It On My Youth\tCapitol\tEAP4/EBF2/W-782\t15922-1\t1956\tNat King Cole, P & Vocal, Juan Tizol, V-Tb, John Collins, G, Charlie Harris, B, Lee Young, D\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO3703.mp3\tDoris Day\tBlame My Absent Minded Heart\tCOLUMBIA\t38507\tHCO3703\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030325.mp3\tTommy Dorsey & His Orchestra\tBlame The Weather\tVICTOR\t26135\t030325\t1938\t\nhttp://www.78-tours.net/mp3/ODEKI2568.mp3\tL'orchestre \"odon Military\"\tBlanche De Castille\tODON\t165.721\tKI 2568\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL3757.mp3\tKid Ory's Dixieland Band\tBlanche Touquatoux\tDECCA\t25134\tL3757\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/PATCPT-1701-2.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tBlank Panther Stomp\tPath\tPA-467\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_096.mp3\tNew York Military Band\tBlaze Of Glory\tEdison\t10455\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC46004-3.mp3\tCoon Sanders Orchestra\tBlazin'\tVICTOR\t21680B\t46004-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19873.mp3\tFletcher Henderson & His Orchestra\tBlazin'\tVOCALION\t3323\t19873\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Col148540-2.mp3\tFletcher Henderson And His Orchestra\tBlazin'\tColumbia\t1913-D\t148540-2  \t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81075-3.mp3\tBessie Smith\tBleeding Hearted Blues\tCOLUMBIA\tA-3936\t81075-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D232B.mp3\tXavier Cugat And His Orchestra\tBlen Blen Blen\tV-DISC\t232B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/HAR144264-1.mp3\tUniversity Six\tBless Her Little Heart\tHARMONY\t444-H\t144264-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66753.mp3\tInk Spots\tBless You\tDECCA\t2841A\t66753\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041529.mp3\tFats Waller And His Rhythm\tBless You\tBLUEBIRD\t10393\t041529\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/Ches1425BY.mp3\tGene Ammons & His Sextet\tBless You\tCHESS\tChes1425\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_270.mp3\tInk Spots\tBless You\tDECCA\t2841A\t66753\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042923.mp3\tGlenn Miller And His Orchestra\tBless You (vre)\tBLUEBIRD\t10455\t042923\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64613-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tBless You My Dear\tDecca\t2204\t64613-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC48726-2.mp3\tCoon Sanders Nighthawk Orchestra\tBless You Sister\tVICTOR\t21895\t48726-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64613.mp3\tAndy Kirk & His Clouds Of Joy\tBless You, My Dear\tDECCA\t2204A\t64613\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401485-B.mp3\tMississippi John Hurt\tBlessed Be Thy Name\tOKeh\t8666\t401485-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC061686.mp3\tDuke Ellington Orchestra\tBli Blip\tVICTOR\t27639\t061686\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR21460-2.mp3\tBlind Arthur\tBlind Arthur Breakdown\tPARAMOUNT\t12892B\t21460-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_174.mp3\tMargaret Whiting And Bob Hope\tBlind Date\tCapitol\t1042\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU062747-1.mp3\tUna Mae Carlisle\tBlitzkrieg Baby\tBLUEBIRD\t11120\t062747-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG13683.mp3\tJimmy Blythe & J.burton\tBlock And Tackle Blues\tGENNETT\t6502\tG13683\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe402537-C.mp3\tSmith Ballew And His Orchestra\tBlondy\tOKeh\t41282\t402537-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-16-1.mp3\tMezzrow - Bechet Septet\tBlood On The Moon\tKing Jazz\t143\tKJ-16-1  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK9031.mp3\tWynonie Harris\tBlood Shot Eyes\tKING\t4461AA\tK9031\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/MER11058r.mp3\tCharlie Parker's Orchestra\tBloomdido\tMERCURY\t11058\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068135.mp3\tTony Pastor & His Orchestra\tBlossoms\tBLUEBIRD\t11376\t068135\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11376.mp3\tTony Pastor & His Orchestra\tBlossoms\tBluebird\t11376\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM638.mp3\tDolly Dawn & Her Dawn Patrol\tBlossoms On Broadway\tVARIETY\tI652\tM638\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_069.mp3\tDolly Dawn And Her Dawn Patrol\tBlossoms On Broadway\tVARIETY\tI652\tM638\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D310B2.mp3\tBea Wain\tBlow Gabriel Blow\tV-DISC\t310B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR137A.mp3\tIllinois Jacquet & His Orchestra\tBlow Illinois, Blow\tALLADDIN\t3001\tRR137A\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA40-4134-B.mp3\tEsquire All-american Award Winners Featuring Charlie Shavers, Trumpet; Teddy Wilson, Piano; Harry Ca\tBlow Me Down\tRCA VICTOR\t40-4134-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26870-B.mp3\tCount Basie And His Orchestra\tBlow Top\tColumbia\tC-44\t26870-B\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72873.mp3\tLionel Hampton Septet\tBlow Top Blues\tDECCA\t28059\t72873\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/BlaBW53.mp3\tEtta Jones Acc By Barney Bigard And His Orchestra\tBlow Top Blues\tBlack & White\t\tBW53\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72873-A.mp3\tLionel Hampton And His Septet\tBlow Top Blues\tDecca\t23792\t72873-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_247.mp3\tLionel Hampton And His Orchestra\tBlow Top Blues\tDecca\t23792\t72873-A\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5325.mp3\tWynonie Harris & Orchestra\tBlow Your Brains Out\tKING\t4226B\tK5325\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU87664-1.mp3\tDelmore Brothers\tBlow Your Whistle, Freight Train\tBLUEBIRD\t5925\t87664-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC91713.mp3\tBob Crosby's Bobcats\tBlow, Blow Thou Winter Winds\tDECCA\t2663A\tC91713\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69558.mp3\tBon Bon & His Buddies\tBlow, Gabriel, Blow\tDECCA\t8567\t69558\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Sav5841.mp3\tDexter Gordon Tenor Sax Solo\tBlow, Mr. Dexter\tSavoy\t576\t5841\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR303.mp3\tGene Ammons Quintet\tBlowin' Red's Top\tALLADDIN\t3012\tRR303\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5326.mp3\tWynonie Harris\tBlowin' To California\tKING\t4252B\tK5326\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/ComR-4178-2.mp3\tChu Berry And His Jazz Ensemble\tBlowin' Up A Breeze\tCommodore\t541\tR-4178-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS20365.mp3\tSharkey Bonano Sharks\tBlowing Off Steam\tCBS\tVO3410\t20365\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1390.mp3\tGene Ammons Sextet\tBlowing The Family Jewels\tMERCURY\t8905\t1390\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO49711.mp3\tFrankie Laine\tBlowing Wild\tCOLUMBIA\t40079\tCO49711\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE27640-B.mp3\tBenny Goodman And His Boys\tBlue\tBRUNSWICK\t3975\tE27640-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC114.mp3\tBilly Eckstine & His Orchestra\tBlue\tNATIONAL\t\tNSC114\t1946\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC17177-1.mp3\tVic Berton And His Orchestra\tBlue\tVOCALION\t2974\t17177-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB15002-A.mp3\tEarl Hines And His Orchestra\tBlue\tBRUNSWICK\t6872\tB-15002-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic049934-1.mp3\tLionel Hampton And His Orchestra\tBlue\tVictor\t26724\t049934-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Bla10075i.mp3\tHenderson's  Dance Orchestra\tBlue\tBlack Swan\t10075\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/COL29295.mp3\tJimmie Lunceford & His Orchestra\tBlue Afterglow\tCOLUMBIA\t35919\t29295\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Col29295-1.mp3\tJimmie Lunceford And His Orchestra\tBlue Afterglow\tColumbia\t35919\t29295-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC64379-1.mp3\tDuke Ellington & His Orchestra\tBlue Again\tVICTOR\t22603B\t64379-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE35738.mp3\tRed Nichols & His Orchestra\tBlue Again\tBRUNSWICK\t6014\tE35738\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe404553-A.mp3\tYale Collegians\tBlue Again\tOKeh\t41474\t404553-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVoc3115.mp3\tLouis Armstrong\tBlue Again\tVocalion\t3115\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1931_0116_02.mp3\tLee Morse And Her Bluegrass Boys\tBlue Again\tColumbia\t2388DB\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_146.mp3\tDuke Ellington\tBlue Again\tVICTOR\t22603B\t64379-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480370.mp3\tBenny Goodman Trio\tBlue And Broken Hearted\tCapitol\t15888\t1996-1\t1947\tBenny Goodman (cl), Teddy Wilson (p), Jimmy Crawford (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480793.mp3\tBenny Goodman Trio\tBlue And Broken Hearted\tCapitol\t15888\t1996-1\t1947\tBenny Goodman (cl), Teddy Wilson (p), Jimmy Crawford (dm)\nhttp://www.jazz-on-line.com/a/mp3o/DEC63919.mp3\tCount Basie And His Orch\tBlue And Sentimental\tDECCA\t3882A\t63919\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL242.mp3\tErroll Garner Trio\tBlue And Sentimental\tATLANTIC\t667\t242\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB1091.mp3\tCount Basie & His Orchestra\tBlue And Sentimental\tRCA\t20-2602\tD7VB1091\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/JUB7011.mp3\tDon Byas Qt\tBlue And Sentimental\tJUBILEE\tJAM905\t7011\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/MER860.mp3\tHelen Humes\tBlue And Sentimental\tMERCURY\t8047\t860\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_240.mp3\tCount Basie And His Orchestra Feat. Bob Bailey\tBlue And Sentimental\tRCA\t2602\tD7VB1091\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/OKECCO5265.mp3\tBig Three Trio\tBlue Because Of You\tOKEH\t6863\tCCO5265\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC049934-1.mp3\tHampton's Rhythm Boys\tBlue Because Of You\tVICTOR\t26724\t049934-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU88993.mp3\tFats Waller And His Rhythm\tBlue Because Of You\tBLUEBIRD\t10322\t88993\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu051525-1.mp3\tEarl Hines And His Orchestra\tBlue Because Of You\tBluebird\tB-10835\t051525-1\t1940\tWalter Fuller (tp,vcl) Shirley Clay, Ed Sims (tp) George Dixon (tp,as) Ed Burke, John Ewing, Joe McLewis (tb) Omer Simeon (cl,bar) Leroy Harris (as,vcl) Jimmy Mundy (ts,arr) Robert Crowder (ts) Earl Hines (p) Claude Roberts (g) Quinn Wilson (b) Alvin Burroughs (d) Billy Eckstine, Leroy Harris (vcl) Buster Harding, Edgar Battle (arr)\nhttp://www.jazz-on-line.com/a/mp3w/1904_006.mp3\tFrank Stanley And Byron G. Harlan\tBlue Bell\tEDISON\t8655\t\t1904\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_010.mp3\tHaydn Quartet\tBlue Bell\tVICTOR\t2750\tB1163\t1904\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU07650.mp3\tSonny Boy Williamson\tBlue Bird Blues\tBLUEBIRD\t7098\t07650\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24086-1.mp3\tJimmie Lunceford And His Orchestra\tBlue Blazes\tOkeh\t4667\t24086-1\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3w/1942_180.mp3\tTommy Dorsey And His Orchestra Feat. Ziggy Elman\tBlue Blazes\tVICTOR\t27962\t075406\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU62341-1.mp3\tJelly Roll Morton Hot Peppers\tBlue Blood Blues\tBLUEBIRD\t8201\t62341-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL359.mp3\tHi-flyers\tBlue Bonnet\tVOCALION\t3619\tDAL359\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061374.mp3\tFreddie Martin & His Orchestra\tBlue Champagne\tBLUEBIRD\t11256\t061374\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D144B2.mp3\tCapt. Glenn Miller And The Aaftc Orch.\tBlue Champagne\tV-DISC\t144B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D144-B2.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tBlue Champagne\tV-Disc\t144-B2\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_009.mp3\tJimmy Dorsey And His Orchestra\tBlue Champagne\tDECCA\t3775A\t69091\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO41816.mp3\tHugo Winterhalter\tBlue Christmas\tCOLUMBIA\t38635\tCO41816\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC46186x.mp3\tErnest Tubb\tBlue Christmas\tDECCA\t46186\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_263.mp3\tErnest Tubb\tBlue Christmas\tDECCA\t46186\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC46055-2.mp3\tJohnny Dodds Trio\tBlue Clarinet Stomp\tVICTOR\t21554B\t46055-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/BruKC-592-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tBlue Clarinet Stomp\tBrunswick\t4694\tKC-592-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe400258-B.mp3\tBluecoat Tom Nelson\tBlue Coat Blues\tOKeh\t8838\t400258-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480404.mp3\tArt Farmer And Gigi Gryce\tBlue Concept\tPrestige\tLP7085\t575\t1954\tArt Farmer, T, FLh, Gigi Gryce, As, With, 2 rhythm sections, = Horace Silver or Freddie Redd, P, Addison Farmer or Percy Heath, B, Art Taylor or Kenny Clarke, D\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2776.mp3\tLes Brown's Band Of Reknown\tBlue Danube\tCOLUMBIA\t38250\tHCO2776\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VICB21006.mp3\tRay Noble And His Orchestra\tBlue Danube\tVICTOR\t24806\tB21006\t\t\nhttp://www.jazz-on-line.com/a/mp3c/GUIT395-1.mp3\tPat Flowers\tBlue Danube\tGUILDE\t1013\tT395-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06622.mp3\tTommy Dorsey & His Orchestra\tBlue Danube\tVICTOR\t25556\t06622\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC71269.mp3\tGene Kardos & His Orchestra\tBlue Danube Blues\tVICTOR\t22921\t71269\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC502.mp3\tWayne King & His Orchestra\tBlue Danube Waltz\tBRUNSWICK\t6475\tC502\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_044.mp3\tSousa's Band\tBlue Danube Waltz\tMONARCH\tV-0343\tB1148\t1905\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66674.mp3\tWoody Herman & His Orchestra\tBlue Dawn (v W H)\tDECCA\t2772B\t66674\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66893.mp3\tBlue Lu Barker & Fly Cats\tBlue Deep Sea Blues\tDECCA\t7709\t66893\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MonP77351.mp3\tQunitet Of Hot Club Of France\tBlue Drag\tMontgomeryWard\t10102\tP77351\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCHS26.mp3\tOriginal Yellow Jackets\tBlue Drag\tVOCALION\t03591\tHS26\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/Ult77285.mp3\tFreddy Taylor And His Swing Men From Harlem\tBlue Drag\tUltraphone\tAP-1489\t77285\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77351.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tBlue Drag\tUltraphone\tAP-1479\tP-77351\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB-12075-A.mp3\tEarl Hines And His Orch\tBlue Drag\tBRUNSWICK\t6345\tB-12075-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64835.mp3\tWoody Herman & His Orchestra\tBlue Evening\tDECCA\t2250A\t64835\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24343-1.mp3\tRed Norvo & His Orchestra\tBlue Evening\tVOCALION\t4833\t24343-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_128.mp3\tWoody Herman And His Orchestra\tBlue Evening\tDECCA\t2250A\t64835\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037152.mp3\tGlenn Miller & His Orchestra\tBlue Evening (vre)\tBLUEBIRD\t10290\t037152\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/REG9763-A.mp3\tHall And Ryan\tBlue Eyed Sally\tRegal\t9763-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC31279-6.mp3\tTed Weems & His Orch.\tBlue Eyed Sally\tVICTOR\t19547\t31279-6\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057087.mp3\tFats Waller And His Rhythm\tBlue Eyes\tBLUEBIRD\t10943\t057087\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC80150-1.mp3\tDuke Ellington & His Orchestra\tBlue Feeling\tVICTOR\t24521B\t80150-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24521.mp3\tDuke Ellington & His Orchestra\tBlue Feeling\tVictor\t24521\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68697.mp3\tWoody Herman And His Orchestra\tBlue Flame\tDECCA\t3643A\t68697\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_041.mp3\tWoody Herman And His Orchestra\tBlue Flame\tDECCA\t3643A\t68697\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/BruE-36667-A.mp3\tBlue Rhythm Boys\tBlue Flame\tBrunswick\t6143\tE-36667-A\t1931\t\nhttp://www.78-tours.net/mp3/VIC26677-B.mp3\tDuke Ellington And His F. Orchestra, O. Hardwick, H. Carney, J. Hodges, B. Bigard, B. Webster, Saxos\tBlue Goose\tVICTOR\t26677\t26677-B\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC053023-1.mp3\tDuke Ellington & His Orchestra\tBlue Goose\tVICTOR\t26677\t053023-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE27851.mp3\tVincent Lopez & His Orchestra\tBlue Grass\tBRUNSWICK\t4002\tE27851\t1928\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU11864.mp3\tGene Rodemich And His Orchestra\tBlue Grass Blues\tBRUNSWICK\t2527B\t11864\t1923\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3c/BRU11839-A.mp3\tDuke Ellington & His Orchestra\tBlue Harlem\tBRUNSWICK\t6374\t11839-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-11839-A.mp3\tDuke Ellington And His Famous Orchestra\tBlue Harlem\tBrunswick\t6374\tB-11839-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA723.mp3\tBing Crosby And Lani Mcintyre\tBlue Hawaii\tDECCA\t1175\tDLA723\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148085-4.mp3\tPaul Whiteman & His Orchestra\tBlue Hawaii\tCOLUMBIA\t1771 D\tW148085-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA723-A.mp3\tLani Mcintyre And His Hawaiians With Bing Crosby\tBlue Hawaii\tDECCA\t11012\tDLA723-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA723-B.mp3\tLani Mcintyre And His Hawaiians With Bing Crosby\tBlue Hawaii\tDECCA\t11012\tDLA723-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL517.mp3\tNite Owls\tBlue Hawaiian Moonlight\tVOCALION\t4159\tDAL517\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiGre1180.mp3\tYerkes Musical Bell Hops\tBlue Hoosier Blues\tGrey Gull\t1180\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUBN043x.mp3\tSidney Bechet Bluenote Jazzmen\tBlue Horizon\tBLUENOTE\tBN043\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60973-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tBlue Illusion\tDecca\t772\t60973-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_092.mp3\tGray Gordon And His Orchestra\tBlue In The Black Of Night\tBluebird\t7838\t026863-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67163.mp3\tWoody Herman & His Orchestra\tBlue Ink\tDECCA\t3081A\t67163\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC024473-2.mp3\tBenny Goodman And His Orchestra\tBlue Interlude\tVICTOR\t26021\t024473-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/GRAOPG-1574-1.mp3\tMichel Warlop Et Son Orchestre (with Django Reinhardt)\tBlue Interlude\tGramophone\tK-7314\tOPG-1574-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc16523-1.mp3\tChuck Richards With Mills Blue\tBlue Interlude\tVocalion\t2877\t16523-1  \t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-907-1.mp3\tCab Calloway And His Orchestra\tBlue Interlude\tVocalion\t4538\tM-907-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/HMVOCS-435-2.mp3\tBenny Carter With Kai Ewans' Orchestra\tBlue Interlude\tHMV\t4699\tOCS-435-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031BI.mp3\tEdmond Hall Allstar Qunitet\tBlue Interval\tBLUENOTE\tBN031\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DECGB6278.mp3\tLew Stone & His Band\tBlue Jazz\tDECCA\t487B\tGB6278\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12112.mp3\tCasa Loma Orchestra\tBlue Jazz\tBRUNSWICK\t6611\t12112\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_186.mp3\tGlen Gray And Casa Loma Orchestra\tBlue Jazz\tBRUNSWICK\t6358\t12112\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU058767-1.mp3\tCharlie Barnet And His Orchestra\tBlue Juice\tBLUEBIRD\t11111\t058767-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC83180-1.mp3\tIsham Jones And His Orchestra\tBlue Lament (cry For Me)\tVictor\t24695\t83180-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS5454-1.mp3\tLester Young\tBlue Lester\tSAVOY\t667\tS5454-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/VICOSW6.mp3\tBenny Carter And His Orchestra\tBlue Light Blues\tVICTOR\t26221\tOSW6\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76542.mp3\tLouis Jordan & His Trio\tBlue Light Boogie Part 1\tDECCA\t27714\t76542\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76543.mp3\tLouis Jordan & His Trio\tBlue Light Boogie Part 2\tDECCA\t27714\t76543\t1950\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480559.mp3\tArt Farmer Quintet\tBlue Lights\tPrestige\tPRLP209\t741\t1954\tArt Farmer, T, FLh, Gigi Gryce, As, With, 2 rhythm sections, = Horace Silver or Freddie Redd, P, Addison Farmer or Percy Heath, B, Art Taylor or Kenny Clark, D\nhttp://www.jazz-on-line.com/a/mp3a/COLW265163.mp3\tBenny Carter's Orchestra\tBlue Lou\tCOLUMBIA\t-R\tW265163\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D177B1.mp3\tHarry James And His Orchestra\tBlue Lou\tV-DISC\t177B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC031445-2.mp3\tAll Star Jam Band\tBlue Lou\tVICTOR\t26144\t031445-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP4206.mp3\tBenny Goodman Sextet\tBlue Lou\tCAPITOL\t\t4206\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20563-1.mp3\tBunny Berigan's Boys\tBlue Lou\tBRUNSWICK\t7832\t20563-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4724.mp3\tEddie Heywood\tBlue Lou\tCOMMODORE\t570\t4724\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83952.mp3\tElla Fitzgerald\tBlue Lou\tDECCA\t28671\t83952\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC39142.mp3\tChick Webb & His Orchestra\tBlue Lou\tDECCA\t1065\t39142\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-452-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tBlue Lou\tSWING\t253\tOSW-452-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1333-A.mp3\tFletcher Henderson & His Orchestra\tBlue Lou\tVOCALION\t3211\tC1333-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeC-1333-1.mp3\tFletcher Henderson And His Orchestra\tBlue Lou\tOkeh\t3211\tC-1333-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480498.mp3\tThe Art Tatum Trio\tBlue Lou\tPablo\t2310-735\t2667-2\t1956\tArt Tatum (p), Red Callender (sb), Jo Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1940_218.mp3\tMitchell Ayres And His Fashions In Music\tBlue Lovebird\tBluebird\t10738\t050524-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC69790-1.mp3\tBlanche Calloway & Her Orchestra\tBlue Memories\tVICTOR\t22896\t69790-1\t1931\t\nhttp://www.jazz-on-line.com./a/mp3o/MERYB11316.mp3\tRalph Marterie & His Orchestra\tBlue Mirage (''don't Go'')\tMERCURY\t70535\tYB11316\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN032BM.mp3\tJames P Johnson Jazz Men\tBlue Mizz\tBLUENOTE\tBN032\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/MelB-11446-B.mp3\tConnie's Inn Orchestra\tBlue Moments\tMelotone\tM-12368\tB-11446-B  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAD7VB1024.mp3\tLittle Eddie Boyd Boogie Band\tBlue Monday Blues\tRCA\t20-2703\tD7VB1024\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480436.mp3\tArt Blakey And Thelonious Monk\tBlue Monk\tAtlantic\tLP1278\t2560\t1957\tArt Blakey, D, Thelonious Monk, P, Bill Hardman, T, Johnny Griffin, Ts, Spanky DeBrest, B\nhttp://www.jazz-on-line.com/a/mp3t/TS480799.mp3\tArt Blakey And Thelonious Monk\tBlue Monk\tAtlantic\tLP1278\t2560\t1957\tArt Blakey, D, Thelonious Monk, P, Bill Hardman, T, Johnny Griffin, Ts, Spanky DeBrest, B\nhttp://www.jazz-on-line.com/a/mp3b/SAVS5872-1.mp3\tIllinois Jacquet\tBlue Mood\tSAVOY\t593B\tS5872-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/JazCO-18419-2.mp3\tMills Blue Rhythm Band\tBlue Mood\tJazz Panorama\t3\tCO-18419-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/ColB-12332-A.mp3\tDuke Ellington And His Famous Orchestra\tBlue Mood\tColumbia\t37298\tB-12332-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic62341-1.mp3\tJelly-roll Morton And His Red Hot Peppers\tBlue Mood Blues\tVictor\t22681\t62341-1\t1930\t\nhttp://www.78-tours.net/mp3/EXC1011.mp3\tJoe Liggins And His \"honeydrippers\" \"little\" Willie Jackson, Alto And Baritone, James Jackson, Tenor\tBlue Moods\tEXCLUSIVE\t1014\tEXC-1011\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL16639.mp3\tBenny Goodman And His Orchestra\tBlue Moon\tCOLUMBIA\t3003 D\t16639\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10133.mp3\tJo Stafford - Paul Weston Orchestra\tBlue Moon\tCOLUMBIA\t39723\tHCO10133\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC033732.mp3\tTommy Dorsey & His Orchestra\tBlue Moon\tVICTOR\t26185\t033732\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHKL.mp3\tCozy Cole Allstars\tBlue Moon\tKEYNOTE\t1300\tHKL\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC86219.mp3\tFrankie Trumbauer & His Orchestra\tBlue Moon\tVICTOR\t24812\t86219\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39132.mp3\tCasa Loma Orchestra\tBlue Moon\tDECCA\t312B\t39132\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC312B.mp3\tCasa Loma Orchestra\tBlue Moon\tDECCA\t312B\t39132\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_190.mp3\tMel Torme\tBlue Moon\tCapitol\t15428\t3411\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_077.mp3\tAl Bowlly Feat. Ray Noble Orchestra\tBlue Moon\tVICTOR\t24849\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_304.mp3\tElvis Presley\tBlue Moon\tRCA\t6640\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_204.mp3\tBilly Eckstine Feat. Hugo Winterhalter's Orchestra\tBlue Moon\tMGM\t10311A\t47S310\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_036.mp3\tBenny Goodman And His Orchestra Feat. O/helen Ward\tBlue Moon\tCOLUMBIA\t3003 D\t16639\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_013.mp3\tGlen Gray And Casa Loma Orchestra\tBlue Moon\tDECCA\t312B\t39132\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC87358.mp3\tRay Noble & His Orchestra\tBlue Moon (val Bowlly)\tVICTOR\t24849\t87358\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4607-1.mp3\tBill Monroe And Bluegrass Boys\tBlue Moon Of Kentucky\tCOLUMBIA\t37888\tCCO4607-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041588.mp3\tGlenn Miller And His Orchestra\tBlue Moonlight\tBLUEBIRD\t10404\t041588\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/GUIG555-B.mp3\tDizzy Gillespie Sextet\tBlue N' Boogie\tGUILDE\t1001\tG555-B\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038139.mp3\tGlenn Miller And His Orchestra\tBlue Orchids\tBLUEBIRD\t10372\t038139\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037651-3.mp3\tTommy Dorsey & His Orchestra\tBlue Orchids\tVICTOR\t26339\t037651-3\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66221.mp3\tBob Crosby & His Orchestra\tBlue Orchids\tDECCA\t2734A\t66221\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26339.mp3\tTommy Dorsey & His Orchestra\tBlue Orchids\tVictor\t26339\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_121.mp3\tBob Crosby And His Orchestra Feat. Teddy Grace\tBlue Orchids\tDECCA\t2734A\t66221\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_097.mp3\tBenny Goodman And His Orchestra Feat. Louise Tobin\tBlue Orchids\tCOLUMBIA\t35211\tLA1963\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA412-A.mp3\tSons Of The Pioneers\tBlue Prairie\tDECCA\t5248\tDLA412-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13000.mp3\tCasa Loma Orchestra\tBlue Prelude\tBRUNSWICK\t6513\t13000\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67155.mp3\tWoody Herman & His Orchestra\tBlue Prelude\tDECCA\t3017B\t67155\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/CONB791-A.mp3\tBing Crosby\tBlue Prelude\tCONQUEROR\t9553\tB791-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68874.mp3\tJimmie Lunceford & His Orchestra\tBlue Prelude\tDECCA\t3892B\t68874\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec68874-A.mp3\tJimmie Lunceford And His Orchestra\tBlue Prelude\tDecca\t3892\t68874-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/TesB791-A.mp3\tBing Crosby\tBlue Prelude\tTest\t\tB791-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/TesB791-8.mp3\tBing Crosby\tBlue Prelude\tTest\t\tB791-8\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu10486.mp3\tGlenn Miller & His Orchestra\tBlue Rain\tBluebird\t10486\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26258-A.mp3\tMildred Bailey\tBlue Rain\tCBS\tVO5277\t26258-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC040982.mp3\tTommy Dorsey & His Orchestra\tBlue Rain (v J L)\tVICTOR\t26418\t040982\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_184.mp3\tDuke Ellington And His Famous Orchestra\tBlue Ramble\tBRUNSWICK\t6336\tB11866-A-B\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-11866-A.mp3\tDuke Ellington And His Famous Orchestra\tBlue Ramble\tBrunswick\t6336\tB-11866-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9661-B.mp3\tRichard M Jones Jazz Wizards\tBlue Reefer Blues (tin Roof Blues)\tDECCA\t7051\tC9661-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480638.mp3\tBenny Goodman & Company\tBlue Reverie\tColumbia\tSL160\t\t1938\tCarnegie Hall Concert?:<br>Cootie Williams (tp), Benny Goodman (cl), Johnny Hodges (ss), Harry Carney (bar), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3h/COL151640-3.mp3\tKing Carter And His Royal Orchestra\tBlue Rhythm\tCOLUMBIA\t2504-D\t151640-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Col151640-3.mp3\tKing Carter And His Royal Orchestra\tBlue Rhythm ? A N L\tColumbia\t2504-D\t151640-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BruE-36666-A.mp3\tBlue Rhythm Boys\tBlue Rhythm ? A N L\tBrunswick\t6143\tE-36666-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VarM-1-2.mp3\tMills Blue Rhythm Band\tBlue Rhythm Fantasy\tVariety\t503\tM-1-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CON30918.mp3\tHank Penny's Radio Cowboys\tBlue Ridge Blues\tCONQUEROR\t9846\t30918\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20920-B.mp3\tRevelers\tBlue River\tVICTOR\t20920\t39171\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20981-B.mp3\tJean Goldkette And His Orchestra\tBlue River\tVICTOR\t20981\t40211-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU25188.mp3\tAl Jolson W W.wirges Orchestra\tBlue River\tBRUNSWICK\t3719\t25188\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE81301-B.mp3\tSophie Tucker W Miff Mole\tBlue River\tOKEH\t40895\t81301-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2413.mp3\tJack Teagarden & His Orchestra\tBlue River\tDECCA\t4071B\tDLA2413\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU14295-A.mp3\tJack Teagarden & His Orchestra\tBlue River\tBRUNSWICK\t6741\t14295-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh175.mp3\tRay Starita And His Ambassadors Band\tBlue River\tColumbia\t4853\tWA-7217-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL7302.mp3\tTommy Dorsey And His Orch\tBlue Room\tDECCA\t29057\tL7302\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/COLZSP5567.mp3\tBenny Goodman\tBlue Room\tCOLUMBIA\t39312\tZSP5567\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_165.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tBlue Room\tRCA Victor\t3329\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/RexRK-10.mp3\tErroll Garner Trio\tBlue Room\tRex\tJ502\tRK-10\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC055286.mp3\tDuke Ellington & His Orchestra\tBlue Serge\tVICTOR\t27356\t055286\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480733.mp3\tDuke Ellington And His Famous Orchestra\tBlue Serge\tVictor\t27356\t055286-1\t1941\tWardell Jones, Ray Nance (tp), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Barney Bigard (cl), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (cl, as, bsx), Ben Webster (ts), Duke Ellington, Billy Strayhorn (p), Fred Guy (g), Jimmy Blanton (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1929_163.mp3\tJohnny Hamp's Kentucky Serenaders Feat. Frank Munn\tBlue Shadows\tVICTOR\t21632\t46680-1\t1928\tLester Brewer, Walter Pontius or Roy Cropper (tp), William Benedict (tb), Joe Cassidy, Cliff Gamet (cl, as), Howard Bartlett (cl, ss, ts), Charles Buckwalter (p), Frank Masterson (bj, g), Elwood Groff (bb), John Strouse (dm)\nhttp://www.jazz-on-line.com/a/mp3a/COLW146803-2.mp3\tLeo Reisman And His Orchestra\tBlue Shadows (vlc)\tCOLUMBIA\t1521 D\tW146803-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE32275.mp3\tCount Basie & His Orchestra\tBlue Shadows And A White Gardenia\tOKEH\t6626\t32275\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2847.mp3\tBing Crosby\tBlue Shadows And White Gardenias\tDECCA\t4193B\tDLA2847\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_283.mp3\tBing Crosby\tBlue Shadows On The Trail\tDecca\t24433\tL4645\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2780x.mp3\tRoy Rogers\tBlue Shadows On The Trail\tRCA\t20-2780\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4645.mp3\tBing Crosby & Ken Darby Choir\tBlue Shadows On The Trail\tDECCA\t24433\tL4645\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1563.mp3\tCount Basie And His Orchestra\tBlue Skies\tCOLUMBIA\t37070\tHCO1563\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC837x.mp3\tCount Basie And His Orchestra\tBlue Skies\tColumbia\tC837\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CONW24996-A.mp3\tJohn Kirby And His Orchestra\tBlue Skies\tCONQUEROR\t9505\tW24996-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23622B.mp3\tJohnny Long\tBlue Skies\tDECCA\t23622\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC92522-2.mp3\tBenny Goodman And His Orchestra\tBlue Skies\tVICTOR\t25136\t92522-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC066923.mp3\tTommy Dorsey And His Orchestra\tBlue Skies\tVICTOR\t27566\t066923\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5815-.mp3\tDuke Ellington's Orchestra\tBlue Skies\tMUSICRAFT\t484\t5815\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5438.mp3\tBen Webster Band (guarnieri)\tBlue Skies\tSAVOY\t553B\tS5438\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/EDI11499.mp3\tVaughn Deleath\tBlue Skies\tEDISON\t51948\t11499\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/ASCMA711.mp3\tMary Lou Williams Trio\tBlue Skies\tASCH\t351-1\tMA711\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1928.mp3\tWillie Lewis & Negro Band\tBlue Skies\tVARSITY\tEL4081s\t1928\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62574.mp3\tEdgar Hayes Quintet\tBlue Skies\tDECCA\t1684A\t62574\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1670.mp3\tRed Norvo's Sky Painters\tBlue Skies\tV-DISC\t597\t1670\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR337-Hy.mp3\tAstorites\tBlue Skies\tHarmony\t337-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_166.mp3\tHarry Richman\tBlue Skies\tVOCALION\t15511A\tE4449\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_094.mp3\tCount Basie And His Orchestra Feat. Jimmy Rushing\tBlue Skies\tCOLUMBIA\t37070\tHCO1563\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21475-2.mp3\tMaxine Sullivan And Her Orchestra\tBlue Skies\tVocalion\t3679\t21475-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_186.mp3\tVaughn Deleath\tBlue Skies\tOkeh\t40757\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/MER451-1.mp3\tErroll Garner Trio\tBlue Skies\tMERCURY\t1032\t451-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480714.mp3\tBenny Goodman And His Orchestra\tBlue Skies\tColumbia\tSL 160\t\t1938\tCarnegie Hall Concert?:<br>Harry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Hymie Schertzer, George Koenig (as), Arthur Rollini, Babe Russin (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480764.mp3\tBen Webster Quartet\tBlue Skies\tSavoy\t505\tS5438-2\t1944\tBen Webster (ts), Johnny Guarneri (p), Oscar Pettiford (sb), David ?Chick? Booth (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1946_120.mp3\tBenny Goodman And His Orchestra Feat. Art Lund\tBlue Skies\tCOLUMBIA\t37053\tCO36288\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37549-2.mp3\tGeorge Olsen & His Music\tBlue Skies (vb.borger-f.frey-b.rice)\tVICTOR\t20455A\t37549-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143312-2.mp3\tThe Knickerbockers (selvin)\tBlue Skies (vck)\tCOLUMBIA\t860 D\tW143312-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-14617.mp3\tTed Heath And His Music\tBlue Skies March\tDECCA-LONDON\tEFF.53-1 (BEP 6027) \tDR-14617\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN15818-1.mp3\tTodd Rollins And His Orchestra (vcb)\tBlue Sky Avenue\tBANNER\t33189\t15818-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC80784.mp3\tJan Garber & His Orchestra\tBlue Sky Avenue\tVICTOR\t24730\t80784\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_277.mp3\tJan Garber And His Orchestra\tBlue Sky Avenue\tVICTOR\t24730\t80784\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_175.mp3\tFelicia Sanders\tBlue Star (the Medic Theme)\tColumbia\t40508\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1065.mp3\tTed Daffan's Texans\tBlue Steel Blues\tOKEH\t5668\tDAL1065\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480437.mp3\tBenny Golson\tBlue Streak\tNew Jazz\tNJLP8248\t1970\t1959\tCurtis Fuller (tb), Benny Golson (ts), Tommy Flanagan (p), Doug Watkins (sb), Art Taylor (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1956_019.mp3\tCarl Perkins\tBlue Suede Shoes\tSun\t234\tU176\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/SUNU176.mp3\tCarl Perkins\tBlue Suede Shoes\tSUNSET\t234\tU176\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_162.mp3\tElvis Presley\tBlue Suede Shoes\tRCA\tEPA-747\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_345.mp3\tBoyd Bennett And His Rockets\tBlue Suede Shoes\tKing\t4903\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec833.mp3\tClyde Mccoy & His Orchestra\tBlue Sugar\tDecca\t833\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DECLA2908.mp3\tBob Crosby & His Orchestra\tBlue Surreal\tDECCA\t4415A\tLA2908\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_091.mp3\tBob Crosby And His Orchestra\tBlue Surreal\tDECCA\t4415A\tLA2908\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4512.mp3\tAndrews Sisters & Burl Ives\tBlue Tail Fly\tDECCA\t24463\tL4512\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_316.mp3\tBurl Ives And Andrews Sisters\tBlue Tail Fly\tDECCA\t24463\tL4512\t1948\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC82266.mp3\tGuy Lombardo Royal Canadians\tBlue Tango\tDECCA\t28031\t82266\t1952\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC27875x.mp3\tLeroy Anderson\tBlue Tango\tDECCA\t27875\t27875x\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_007.mp3\tLeroy Anderson And His \"pops\" Concert Orchestra\tBlue Tango\tDECCA\t27875\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_075.mp3\tLes Baxter And His Orchestra\tBlue Tango\tCapitol\t1966\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU11223-A.mp3\tDuke Ellington & His Orchestra\tBlue Tune\tBRUNSWICK\t6288\t11223-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MOD368.mp3\tFrankie Laine\tBlue Turning Grey Over You\tMODERN\tMERC1027\t368\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101651-1.mp3\tFats Waller And His Rhythm\tBlue Turning Grey Over You\tVICTOR\t25779\t101651-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB3889.mp3\tGene Krupa & His Orchestra\tBlue Turning Grey Over You\tRCA\t20-3736\tE0VB3889\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72311-B.mp3\tJames Pete Johnson\tBlue Turning Grey Over You\tDECCA\t23596\t72311-B\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_0116_02.mp3\tLee Morse And Her Bluegrass Boys\tBlue Turning Grey Over You\tColumbia\t2101DB\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45853.mp3\tTony Bennett\tBlue Velvet\tCOLUMBIA\t39555\tCO45853\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_125.mp3\tTony Bennett\tBlue Velvet\tCOLUMBIA\t39555\tCO45853\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0500_02.mp3\tLee Morse\tBlue Waltz\tPerfect\t11579B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC46066-1.mp3\tJohnny Dodds Washboard Band\tBlue Washboard Stomp\tVICTOR\t21552B\t46066-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480824.mp3\tHurtado Brothers' Royal Marimba Band Of Guatemala\tBlue Waves - Waltz\tVICTOR\t35565-B\t17516\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC40753-1.mp3\tJimmie Rodgers\tBlue Yodel - T For Texas\tVICTOR\t21142\t40753-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4612-1.mp3\tBill Monroe's Bluegrass Boys\tBlue Yodel No. 4\tCOLUMBIA\t37565\tCCO4612-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon70650.mp3\tJimmie Rodgers\tBlue Yodel No.10\tMontgomeryWard\t4725\t70650\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon41743.mp3\tJimmie Rodgers\tBlue Yodel No.3\tMontgomeryWard\t4213\t41743\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC47216-4.mp3\tJimmie Rodgers\tBlue Yodel No.4 - California Blues\tVICTOR\t40014-V\t47216-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC56453.mp3\tJimmie Rodgers\tBlue Yodel No.6\tVICTOR\t22271\t56453\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/Mon54867.mp3\tJimmie Rodgers\tBlue Yodel No.9\tMontgomeryWard\t4724\t54867\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/MANS1278.mp3\tSlam Stewart Trio\tBlue, Brown And Beige\tMANOR\t1028\tS1278\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/OKe403715-B.mp3\tLouis Armstrong And His Orchestra\tBlue, Turning Grey Over You\tOKeh\t41375\t403715-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43262.mp3\tCount Basie & His Orchestra\tBluebeard's Blues\tCOLUMBIA\t38888\tCO43262\t1950\t\n\tLouis Armstrong - G.jenkins\tBlueberry Hill\tDECCA\t24752\t75228\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC051050.mp3\tSwing And Sway With Sammy Kaye\tBlueberry Hill\tVICTOR\t26643\t051050\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/IMP5407BH.mp3\tFats Domino\tBlueberry Hill\tIMPERIAL\t5407\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68000.mp3\tConnie Boswell\tBlueberry Hill\tDECCA\t3366A\t68000\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC26643.mp3\tSwing & Sway With Sammy Kaye\tBlueberry Hill\tVICTOR\t26643\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_114.mp3\tRuss Morgan And His Orchestra\tBlueberry Hill\tDECCA\t3290A\t67911\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_201.mp3\tLouis Armstrong And Gordon Jenkins\tBlueberry Hill\tDecca\t30091\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053132.mp3\tGlenn Miller & His Orchestra\tBlueberry Hill (vocal R. Eberle)\tBLUEBIRD\t10768\t053132\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/SIGT1914.mp3\tJames P. Johnson\tBlueberry Rhyme\tSIGNATURE\t28105A\tT1914\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVD831-3.mp3\tCharlie Parker\tBluebird\tSAVOY\t307\tD831-3\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-11082-B.mp3\tTeddy Powell And His Orchestra\tBluebird Boogie Woogie\tBluebird\tB-11082-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA11-9007.mp3\tJan Peerce\tBluebird Of Happiness\tRCA\t11-9007\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_127.mp3\tJo Stafford And Gordon Macrae\tBluebird Of Happiness\tCapitol\t15207\t3432-4\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_175.mp3\tJan Peerce\tBluebird Of Happiness\tRCA\t11-9007\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_179.mp3\tDoris Day Feat. O/george Siravo\tBluebird On Your Windowsill\tCOLUMBIA\t38611\tHCO3902\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26204-A.mp3\tBenny Goodman & His Orchestra\tBluebirds In The Moonlight\tCOLUMBIA\t35289\t26204-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_227.mp3\tBenny Goodman And His Orchestra Feat. Mildred Bailey\tBluebirds In The Moonlight\tCOLUMBIA\t35289\t26204-A\t1939\tZiggy Elman, Jimmy Maxwell, Johnny Martell (tp), Red Ballard, Vernon Brown, Ted Vesley (tb), Benny Goodman (cl), Toots Mondello, Buff Estes (as), Jerry Jerome, Bus Bassey (ts), Fletcher Henderson (p), Arnold Covey (g), Artie Bernstein (sb), Nick Fatool (dm)\nhttp://www.jazz-on-line.com/a/mp3a/CONWC2792-A.mp3\tDick Jurgens And His Orchestra\tBluebirds In The Moonlight (ve.howard)\tCONQUEROR\t9339\tWC2792-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042924.mp3\tGlenn Miller And His Orchestra\tBluebirds In The Moonlight (vmarion Hutton)\tBLUEBIRD\t10465\t042924\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLH10270.mp3\tColwell Bros\tBluebonnet Lane\tCOLUMBIA\t21023\tH10270\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4879.mp3\tBill Monroe Bluegrass Boys\tBluegrass Breakdown\tCOLUMBIA\t20552\tCCO4879\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO41837.mp3\tBill Monroe Bluegrass Boys\tBluegrass Stomp\tCOLUMBIA\t20648\tCO41837\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61947-A.mp3\tLil Armstrong And Her Swing Band\tBluer Than Blue\tDecca\t1299\t61947-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1636.mp3\tTeddy Wilson Qt\tBlues\tV-DISC\t595\t1636\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWM1120.mp3\tDuke Ellington+jimmy Blanton\tBlues\tCOLUMBIA\t35322\tWM1120\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60232.mp3\tBunny Berigan & His Blue Boys\tBlues\tDECCA\t18116\t60232\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-2222-1.mp3\tPhilippe Brun (with Django Reinhardt)\tBlues\tSWING\t54\tOLA-2222-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-453-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tBlues\tSWING\t266\tOSW-453-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-130-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tBlues\tSWING\t83\tOSW-130-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC410.mp3\tBilly Eckstine\tBlues\tNATIONAL\t\tNSC410\t1948\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2798.mp3\tTed Lewis' Jazz Band\tBlues\tColumbia\tA2798\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_121.mp3\tRalph Flanagan And His Orchestra Feat. The Singing Winds\tBlues\tRCA VICTOR\t4247\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26661-A.mp3\tCount Basie And His Orchestra\tBlues (i Still Think Of Her)\tColumbia\tC-141\t26661-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78624-2.mp3\tTed Lewis & His Band\tBlues - My Naughty Sweetie Gives To Me\tCOLUMBIA\tA-2798\t78624-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055191-3.mp3\tArtie Shaw And His Orchestra\tBlues - Part 1\tVictor\t27411\t055191-3\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055192-3.mp3\tArtie Shaw And His Orchestra\tBlues - Part 2\tVictor\t27411\t055192-3\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL50.mp3\tRed Norvo Sextet\tBlues A La Red\tKEYNOTE\t1319\tHL50\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CONT6032.mp3\tMary Lou Williams\tBlues At Mary Lou's\tCONTIN\tT6032\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47267.mp3\tDuke Ellington And His Orchestra\tBlues At Sundown\tCOLUMBIA\t39712\tCO47267-1\t1951\tHarold \"Shorty\" Baker, Clark Terry, Willie Cook (tp) Ray Nance (tp,vln,vcl) Quentin Jackson, Britt Woodman, Juan Tizol (tb) Jimmy Hamilton (cl,ts) Russell Procope (as,ss,cl) Willie Smith (as) Paul Gonsalves (ts) Harry Carney (bar,cl,b-cl) Duke Ellington (p,narrator) Wendell Marshall (b) Louie Bellson (d) Lloyd Oldham (vcl) \nhttp://www.jazz-on-line.com/a/mp3a/CONSL12-1.mp3\tLeroy Carr\tBlues Before Sunrise\tCONQUEROR\t8741\tSL12-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-328-1.mp3\tDjango Reinhardt\tBlues Clair\tSWING\t254\tOSW-328-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5447.mp3\tSlam Stewart Quartet\tBlues Collins\tMUSICRAFT\t396\t5447\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-358-1.mp3\tDjango Reinhardt Et Son Orchestre\tBlues D'autrefois\tSWING\t215\tOSW-358-1\t1943\t\nhttp://www.78-tours.net/mp3/VOG55V5044.mp3\tSidney Bechet Andr Rwliotty Et Son Orchestre\tBlues Dans Le Blues Du Film \" Srie Noire \"\tVOGUE\tV. 5194\t55 V. 5044\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65382.mp3\tWoody Herman & His Orchestra\tBlues Downstairs\tDECCA\t2508B\t65382\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16191.mp3\tDjango Reinhardt\tBlues En Mineur\tRythme\tD5017\t16191\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/APOS1180.mp3\tDinah Washington\tBlues For A Day\tAPOLLO\t388\tS1180\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/BluST-20088-2.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tBlues For Barclay\tBlue Star\t30\tST-20088-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480527.mp3\tBen Webster And Harry Sweets Edison\tBlues For Bill Basie\tVerve\tMGV8211\t20729-4\t1957\tBen Webster, Ts, Harry Sweets Edison, T, Oscar Peterson, P, Barney Kessel, G, Ray Brown, B, Alvin Stoller, D\nhttp://www.jazz-on-line.com/a/mp3e/BluBN-269-4.mp3\tJimmy Hamilton And The Duke's Men\tBlues For Clarinets\tBlue Note\t\tBN-269-4\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM47S3238.mp3\tBob Wills\tBlues For Dixie\tMGM\t10213\t47S3238\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4126.mp3\tKid Ory Creole Dixieland Band\tBlues For Jimmy\tCOLUMBIA\t38957\tHCO4126\t1950\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480405.mp3\tBen Webster And Harry Sweets Edison\tBlues For Piney Brown\tVerve\tMGV8211\t20725-2\t1957\tBen Webster, Ts, Harry Sweets Edison, T, Oscar Peterson, P, Herb Ellis, G, Ray Brown, B, Alvin Stoller, D\nhttp://www.jazz-on-line.com/a/mp3c/COM619BF.mp3\tGeorge Wettling Rhythm Kings\tBlues For Stu\tCOMMODORE\t619\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480371.mp3\tBen Webster And Harry Sweets Edison\tBlues For The Blues\tVerve\tMGV8211\t20727-4\t1957\tBen Webster, Ts, Harry Sweets Edison, T, Oscar Peterson, P, Herb Ellis, G, Ray Brown, B, Alvin Stoller, D\nhttp://www.jazz-on-line.com/a/mp3t/TS480580.mp3\tBen Webster And Harry Sweets Edison\tBlues For The Blues\tVerve\tunissued\t20727-2\t1957\tBen Webster, Ts, Harry Sweets Edison, T, Oscar Peterson, P, Herb Ellis, G, Ray Brown, B, Alvin Stoller, D\nhttp://www.jazz-on-line.com/a/mp3c/VIC36925-2.mp3\tThomas Morris Hot Babies\tBlues For The Everglades\tVICTOR\t20330\t36925-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC053432-1.mp3\tSidney Bechet New Orleans Fw\tBlues For You, Johnny\tVICTOR\t26746\t053432-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC63192.mp3\tJohnny Dodds Chicago Boys\tBlues Galore\tDECCA\t7413\t63192\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/ATLRK12.mp3\tErroll Garner Trio\tBlues I Can't Forget\tATLANTIC\t677\tRK12\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/RexRK-12.mp3\tErroll Garner Trio\tBlues I Can't Forget\tRex\tJ501\tRK-12\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU39371-1.mp3\tDuke Ellington And His Orchestra\tBlues I Love To Sing\tBLUEBIRD\t6531\t39371-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC39371-1.mp3\tDuke Ellington And His Orchestra\tBlues I Love To Sing Vocal Adelaide Hall\tVICTOR\t21490\t39371-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70412.mp3\tHazel Scott (piano)\tBlues In B Flat\tDECCA\t18340B\t70412\t1942\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480467.mp3\tArt Tatum And Benny Carter\tBlues In B Flat\tClef\tEP319\t1789-2\t1954\tBenny Carter (as), Art Tatum (p), Louie Bellson (dm)\nhttp://www.jazz-on-line.com/a/mp3a/V-D044B.mp3\tJosh White\tBlues In Berlin\tV-DISC\t044B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480372.mp3\tThe Art Tatum/benny Carter/louis Bellson Trio\tBlues In C\tPablo\t2310-732\t1790-1\t1954\tBenny Carter (as) Art Tatum (p) Louie Bellson (d)\nhttp://www.jazz-on-line.com/a/mp3c/COLC1379.mp3\tTeddy Wilson & His Orchestra\tBlues In C Sharp Minor\tCOLUMBIA\t36314\tC1379\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic010569-1.mp3\tMezz Mezzrow And His Orchestra\tBlues In Disguise\tVictor\t25636\t010569-1   \t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/COL16711-1.mp3\tRed Norvo's Swing Octet\tBlues In E Flat\tCOLUMBIA\t3079 D\t16711-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN4307BI.mp3\tRussell Jacquet\tBlues In F\tKING\t4307\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE30425.mp3\tCootie Williams Rug Cutters\tBlues In My Condition\tOKEH\t6224\t30425\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10604-2-3.mp3\tCab Calloway & His Orchestra\tBlues In My Heart\tBANNER\t32221\t10604-2-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70237-1.mp3\tBert Lown Biltmore Hotel Orchestra\tBlues In My Heart\tVICTOR\t22810\t70237-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE36433-A.mp3\tChick Webb & His Orchestra\tBlues In My Heart\tBRUNSWICK\t6156\tE36433-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE37158.mp3\tMildred Bailey\tBlues In My Heart\tBRUNSWICK\t6190\tE37158\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/CRO1476-3.mp3\tEubie Blake And His Orchestra\tBlues In My Heart\tCROWN\t3197\t1476-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU70529-1.mp3\tWashboard Rhythm Kings\tBlues In My Heart\tBLUEBIRD\t6150\t70529-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/Col151455-1.mp3\tKing Carter And His Royal Orchestra\tBlues In My Heart\tColumbia\t2439-D\t151455-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM-396-1.mp3\tBenny Carter And His Orchestra\tBlues In My Heart\tDECCA\tF-42128\tAM-396-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Col151455-1.mp3\tKing Carter And His Royal Orchestra\tBlues In My Heart ? V D R\tColumbia\t2439-D\t151455-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/DIS6055x.mp3\tLonnie Johnson And John Davis\tBlues In My Soul\tDISC\t6055\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA066786.mp3\tSidney Bechet\tBlues In The Air\tRCA\t20-1520\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63123-A.mp3\tCount Basie And His Orchestra\tBlues In The Dark\tDECCA\t1682\t63123-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke26398-A.mp3\tJimmie Lunceford And His Orchestra\tBlues In The Groove\tOkeh\t5395\t26398-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068853.mp3\tDinah Shore\tBlues In The Night\tBLUEBIRD\t11436\t068853\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2857.mp3\tBing Crosby - J.s.trotter Orchestra\tBlues In The Night\tDECCA\t4183A\tDLA2857\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC067736-2.mp3\tArtie Shaw And His Orchestra\tBlues In The Night\tVICTOR\t27609\t067736-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE31300.mp3\tCab Calloway & His Orchestra\tBlues In The Night\tOKEH\t6422\t31300\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2746.mp3\tWoody Herman And His Orch\tBlues In The Night\tDECCA\t4030B\tDLA2746\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_008.mp3\tWoody Herman And His Orchestra\tBlues In The Night\tCOLUMBIA\t37858\tHCO2316\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_084.mp3\tArtie Shaw And His Orchestra\tBlues In The Night\tVICTOR\t27609\t067736-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_028.mp3\tDinah Shore\tBlues In The Night\tBLUEBIRD\t11436\t068853\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_057.mp3\tCab Calloway And His Orchestra\tBlues In The Night\tOKEH\t6422\t31300\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_136.mp3\tRosemary Clooney Feat. Percy Faith's Orchestra\tBlues In The Night\tCOLUMBIA\t39813\tCO47416\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_124.mp3\tBenny Goodman Sextet Feat. Peggy Lee, V\tBlues In The Night\tOKEH\t6553\t32051-1\t1941\tCutty Cutshall (tb), Benny Goodman (cl), Mel Powell (p), Tom Morgan (g), Sid Weiss (sb), Ralph Collier (dm)\nhttp://www.jazz-on-line.com/a/mp3h/DH480825.mp3\tAndre Kostelanetz And His Orchestra\tBlues In The Night\tCOLUMBIA\t7428-M\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC70093.mp3\tJimmie Lunceford And His Orch\tBlues In The Night - Part 1\tDECCA\t4125A\t70093-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70093-A.mp3\tJimmie Lunceford And His Orchestra\tBlues In The Night - Part 1\tDecca\t4125\t70093-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC70094.mp3\tJimmie Lunceford And His Orch\tBlues In The Night - Part 2\tDECCA\t4125B\t70094-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70094-A.mp3\tJimmie Lunceford And His Orchestra\tBlues In The Night - Part 2\tDecca\t4125\t70094-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC053431-2.mp3\tSidney Bechet And His Rhythm\tBlues In Thirds\tVICTOR\t27204\t053431-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27609.mp3\tArtie Shaw And His Orchestra\tBlues Inthe Night\tVictor\t27609\t067736-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480499.mp3\tBenny Golson\tBlues It\tContemporary\tC3552\t\t1957\tArt Farmer (tp), Benny Golson (ts), Wynton Kelly (p), Paul Chambers (sb), Charlie Persip (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480528.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tBlues March\tBlue Note\t45-1736\tTk19\t1958\tArt Blakey, D, Benny Golson, Ts, Lee MOrgan, T, Bobbie Timmons, P, Jymie Merritt, B\nhttp://www.jazz-on-line.com/a/mp3t/TS480373.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tBlues March For Europe, Nr. 1\tRCA\t430044\t\t1959\tArt Blakey, D, Benny Golson, Ts, Lee Morgan, T,: Jymie Merritt, B, Bobby Timmons, P\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB5554.mp3\tGene Krupa's Chicago Jazz Band\tBlues My Naughty Sweetie Gave To Me\tRCA\t20-4026\tE0VB5554\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU014292.mp3\tBoots And His Buddies\tBlues Of Avalon\tBLUEBIRD\t7187\t014292\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC063786-1.mp3\tSidney Bechet One Man Band\tBlues Of Bechet\tVICTOR\t27485\t063786-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0500_06.mp3\tLee Morse\tBlues Oldier Blues\tPerfect\t11586B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2739.mp3\tJoe Turner & Freddie Slack\tBlues On Central Avenue\tDECCA\t7889\tDLA2739\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480529.mp3\tBenny Golson Sextet\tBlues On Down\tRiverside\tRLP 12-256\t\t1957\tKenny Dorham (tp), J.J. Johnson (tb), Benny Golson (ts), Wynton Kelly (p), Paul Chambers (sb), Charlie Persip or Max Roach (dm)\nhttp://www.jazz-on-line.com/a/mp3d/APOR-1006.mp3\tEarl Hines\tBlues On My Weary Mind\tAPOLLO\t358\tR-1006\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/ApoR-1006.mp3\tEarl Hines Sextet\tBlues On My Weary Mind\tApollo\t358\tR-1006\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66960.mp3\tWoody Herman & His Orchestra\tBlues On Parade\tDECCA\t2933A\t66960\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_250.mp3\tWoody Herman And His Orchestra\tBlues On Parade\tDECCA\t2933A\t66960\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480761.mp3\tWalter Thomas & His Jump Cats\tBlues On The Delta\tJoe Davis/Celebrity\t8125\t8125B\t1944\tEmmett Berry (tp), Walter Thomas (as, ts), Ben Webster (ts), Budd Johnson (ts, bar), Clyde Hart (p), Oscar Pettiford (sb), Cozy Cole (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DEC68004.mp3\tPete Johnson\tBlues On The Down Beat\tDECCA\t3384A\t68004\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC055192-3.mp3\tArtie Shaw And His Orchestra\tBlues Part.2\tVICTOR\t27411B\t055192-3\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_102.mp3\tOwen Bradley And His Quintet Feat. Jack Shook And Dottie Dillard\tBlues Stay Away From Me\tCoral\t60107\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68639-A.mp3\tJack Teagarden & His Orchestra\tBlues To The Lonely\tDECCA\t3642B\t68639-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5299.mp3\tTeddy Wilson Sextet\tBlues Too\tMUSICRAFT\t336B\t5299\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65383.mp3\tWoody Herman & His Orchestra\tBlues Upstairs\tDECCA\t2508A\t65383\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN1203.mp3\tMeade Lux Lewis\tBlues Whistle\tBLUENOTE\t39\tBN1203\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S610.mp3\tSy Oliver & His Orchestra\tBlues, Just Blues\tMGM\t11092\t47S610\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480774.mp3\tBen Webster & His Orch.\tBlues, Mister Brim\tHaven\t803\th-1938\t1946\tLeonhard Graham (tp), Tony Scott (cl), Ben Webster (ts), Sadik Hakim (p), Bill De Arango (g), John Simmons (sb), Sid Catlett (dm)\nhttp://www.jazz-on-line.com/a/mp3c/BLU043897-1.mp3\tMuggsy Spanier Ragtime Band\tBluin' The Blues\tBLUEBIRD\t10719B\t043897-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC38734.mp3\tNew Orleans Rhythm Kings\tBluin' The Blues\tDECCA\t464B\t38734\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_223.mp3\tFats Domino\tBo Weevil\tImperial\t5375\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_124.mp3\tTeresa Brewer\tBo Weevil\tCoral\t61590\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78924-3.mp3\tTed Lewis Jazz Band\tBo-la-bo\tCOLUMBIA\tA-2895\t78924-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2895.mp3\tTed Lewis' Jazz Band\tBo-la-bo\tColumbia\tA2895\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU020161-1.mp3\tBill \"jazz\" Gillum\tBoar Hog Blues\tBLUEBIRD\t7563\t020161-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC40822-2.mp3\tRichard M Jones Jazz Wizards\tBoar Hog Blues\tVICTOR\t21203\t40822-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26367.mp3\tBenny Goodman & His Orchestra\tBoard Meeting\tCOLUMBIA\t35396\t26367\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70111.mp3\tAl Cooper & His Savoy Sultans\tBoats\tDECCA\t8598\t70111\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480500.mp3\tBenny Golson\tBob Hurd's Blues\tNew Jazz\tNJLP8248\t1972\t1959\tCurtis Fuller (tb), Benny Golson (ts), Tommy Flanagan (p), Doug Watkins (sb), Art Taylor (dm)\nhttp://www.jazz-on-line.com/a/mp3c/VIC40314-2.mp3\tMemphis Jug Band\tBob Lee Junior Blues\tVICTOR\t21412\t40314-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA972.mp3\tBing Crosby And Connie Boswell\tBob White\tDECCA\t1483\tDLA972\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09688-2.mp3\tBenny Goodman And His Orchestra\tBob White\tVICTOR\t25683\t09688-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCLA1444.mp3\tMildred Bailey & Her Orchestra\tBob White\tVOCALION\t3712\tLA1444\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25683.mp3\tBenny Goodman & His Orchestra\tBob White\tVictor\t25683\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruDLA972-A.mp3\tJohn Scott Trotter And His Orchestra\tBob White\tBrunswick\tE-02492  \tDLA972-A  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_257.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tBob White\tVICTOR\t25683\t09688-2\t1937\tHarry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Murray McEachern (tb), Benny Goodman (cl), Hymie Schertzer, George Koenig (as), Arthur Rollini, Vido Musso (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1937_235.mp3\tMildred Bailey Feat. Red Norvo (director/xylophone)\tBob White (whatcha Gonna Swing Tonight)\tVOCALION\t3712\tLA1444\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_026.mp3\tBing Crosby And Connee Boswell Feat. John Scott Trotter's Orchestra\tBob White (whatcha Gonna Swing Tonight?)\tDECCA\t1483\tDLA972\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S3115.mp3\tBob Wills Texas Playboys\tBob Wills Square Dance No.1\tMGM\t10469\t49S3115\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT1424.mp3\tJohnny Guarnieri\tBobo The Bowery Barber\tMAJESTIC\t1189\tT1424\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/GRAEP-2020-B-2.mp3\tJoe Venuti, V; Buddy Weed, P; George Barnes, G; Al Caiola, G; Jack Lesberg, B; Don Lamond, D.\tBody And Sou\tGRAND AWARD\tEP-2020-B-2\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU34706.mp3\tLibby Holman And Orchestra\tBody And Soul\tBRUNSWICK\t4910\t34706\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU042936-1.mp3\tColeman Hawkins\tBody And Soul\tBLUEBIRD\t10523A\t042936-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150788.mp3\tPaul Whiteman And His Orchestra\tBody And Soul\tCOLUMBIA\t2297 D\tW150788\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO3694.mp3\tTeddy Wilson\tBody And Soul\tCOLUMBIA\t36634\tCCO3694\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW26573.mp3\tBillie Holiday\tBody And Soul\tCOLUMBIA\t37836\tW26573\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP5561.mp3\tBenny Goodman Trio\tBody And Soul\tCOLUMBIA\t39279\tZSP5561\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM48S524.mp3\tSarah Vaughan\tBody And Soul\tMGM\t30340\t48S524\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe404411-D.mp3\tLouis Armstrong And His Orchestra\tBody And Soul\tOKeh\t41468\t404411-D\t1930\t\nhttp://www.jazz-on-line.com/mp3/404422998.mp3\tJack Hylton And His Orchestra\tBody And Soul\tVICTOR\t36027\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150844-4.mp3\tRuth Etting\tBody And Soul\tCOLUMBIA\t2300\tW150844-4\t1930\t\nhttp://www.jazz-on-line.com/mp3/412766814.mp3\tJohnny Dankworth\tBody And Soul\tABBOTT\t116\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM49S3074.mp3\tBilly Eckstein\tBody And Soul\tMGM\t10501\t49S3074\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO34266.mp3\tBenny Goodman Trio\tBody And Soul\tCOLUMBIA\t36781\tCO34266\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC067761.mp3\tDinah Shore With Henry Levine's  Dixieland Octet\tBody And Soul\tVICTOR\t27623\t067761\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA724-A.mp3\tArt Tatum Swingsters\tBody And Soul\tDECCA\t1197\tDLA724-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1293.mp3\tGene Krupa Jazz Trio\tBody And Soul\tCOLUMBIA\t38214\tHCO1293\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047700.mp3\tEarl Hines (piano)\tBody And Soul\tBLUEBIRD\t10642\t047700\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92705-1.mp3\tBenny Goodman Trio\tBody And Soul\tVICTOR\t25115-A\t92705-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC053505-3.mp3\tDuke Ellington (piano)\tBody And Soul\tVICTOR\t27406\t053505-3\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/SAV5413.mp3\tCozy Cole Allstars\tBody And Soul\tSAVOY\t501A\t5413\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1925.mp3\tWillie Lewis & Negro Band\tBody And Soul\tVARSITY\tEL4080s\t1925\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP107.mp3\tSidney Catlett W Hazel Scott\tBody And Soul\tV-DISC\t068\tVP107\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72299.mp3\tRoy Eldridge & His Orchestra\tBody And Soul\tDECCA\t24119\t72299\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/HMWOLA-1710-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tBody And Soul\tHMW\tB-8598\tOLA-1710-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/COLCL-6716-1.mp3\tLarry Adler (with Django Reinhardt)\tBody And Soul\tCOLUMBIA\tCL-6716-1\tCL-6716-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT640.mp3\tJohnny Guarnieri Trio\tBody And Soul\tMAJESTIC\t1032\tT640\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/COL150863-5.mp3\tAnnette Hanshaw\tBody And Soul\tCOLUMBIA\tCL5093\t150863-5\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_129.mp3\tAnnette Hanshaw\tBody And Soul\tCOLUMBIA\tCL5093\t150863-5\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_166.mp3\tHelen Morgan\tBody And Soul\tVICTOR\t22532A\t63625-5\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_106.mp3\tRuth Etting\tBody And Soul\tCOLUMBIA\t2300\tW150844-4\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_351.mp3\tArt Tatum\tBody And Soul\tV-DISC\t620\tJDB1711\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_233.mp3\tHenry Allen And His Orchestra\tBody And Soul\tVOCALION\t2965\t17396-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_073.mp3\tLouis Armstrong Feat. Lionel Hampton Plays\tBody And Soul\tCOLUMBIA\t2707 D\t404411\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu047700-1.mp3\tEarl Hines And His Orchestra\tBody And Soul\tBluebird\tB-10642\t047700-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_279.mp3\tBilly Eckstine Feat. Buddy Baker's Orchestra\tBody And Soul\tMGM\t10501\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_302.mp3\tZiggy Elman And His Orchestra\tBody And Soul\tMGM\t10071A\t47S3135\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_073.mp3\tBenny Goodman Trio\tBody And Soul\tVICTOR\t25115-A\t92705-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480560.mp3\tArt Tatum And Buddy Rich & Lionel Hampton\tBody And Soul\tPablo\t2310-775\t2378-2\t1955\tArt Tatum (p), Lionel Hampton (vib), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480602.mp3\tArt Tatum\tBody And Soul\tClef\tMGC613\t1417-1\t1953\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3t/TS480653.mp3\tBenny Goodman Trio\tBody And Soul\tColumbia\tSL 160\t\t1938\tCarnegie Hall Concert?:<br>Benny Goodman (cl), Teddy Wilson (p), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480756.mp3\tCozy Cole All Stars\tBody And Soul\tSavoy\t501\t5413\t1944\tBen Webster (ts), Johnny Guarnieri (p), Teddy Walters (g), Billy Taylor (sb), Cozy Cole (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1940_199.mp3\tColeman Hawkins And His Orchestra\tBody And Soul\tBluebird\t10523A\t042936-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC80367.mp3\tLouis Armstrong And His Orchestra\tBody And Soul Pt.1\tDECCA\t28103\t80367\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC80368.mp3\tLouis Armstrong And His Orchestra\tBody And Soul Pt.2\tDECCA\t28104\t80368\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80382.mp3\tLouis Armstrong & His Orchestra\tBoff Boff\tDECCA\t28102\t80382\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145001-2.mp3\tSam Morgan's Jazz Band\tBogalusa Strut\tCOLUMBIA\t14351 D\tW145001-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC055234.mp3\tLionel Hampton & His Orchestra\tBogo Jo\tVICTOR\t27341\t055234\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic055234-1.mp3\tLionel Hampton And His Sextet\tBogo Jo\tVictor\t27341\t055234-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S3028.mp3\tSlim Gaillard; His Trio\tBoip! Boip!\tMGM\t10111A\t47S3028\t1947\t\nhttp://www.78-tours.net/mp3/CRIC4946.mp3\tC. Engel\tBois Dansant (stepping Out)\tCRISTAL\t5713\tC4946\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_127.mp3\tDuke Ellington And His Famous Orchestra Feat. V/ben Webster\tBojangles (a Portrait Of Bill Robinson)\tVICTOR\t26644\t053021\t1943\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480677.mp3\tDuke Ellington And His Famous Orchestra\tBojangles (a Portrait Of Bill Robinson)\tVictor\t26644\t053021-1\t1940\tWardell Jones, Cootie Williams (tp), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Barney Bigard (cl), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (as, bsx), Ben Webster (ts), Duke Ellington (p, ldr), Fred Guy (g), Jimmy Blanton (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3c/COLLA1137.mp3\tFred Astaire\tBojangles Of Harlem\tCOLUMBIA\t3146 D\tLA1137\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0229-1.mp3\tTempo King's Kings Of Tempo\tBojangles Of Harlem\tBLUEBIRD\t6533\t0229-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61255.mp3\tBob Howard & His Orchestra\tBojangles Of Harlem\tDECCA\t917B\t61255\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_240.mp3\tFred Astaire\tBojangles Of Harlem\tCOLUMBIA\t3146 D\tLA1137\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC63369.mp3\tNat Shilkret & Victor Orchestra\tBolero\tVICTOR\t22571\t63369\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/GraX2LA-1996-1.mp3\tQuintette Du Hot Club De France (with Django Reinhardt)\tBolero\tGramophone\tL-1046\tX2LA-1996-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BruLA-1758-A.mp3\tGene Krupa And His Orchestra\tBolero At The Savoy\tBrunswick\t8284\tLA-1758-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/TaxWC-2595-C.mp3\tCount Basie And His Orchestra\tBolero At The Savoy\tTax\t8000\tWC-2595-C  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481100.mp3\tGene Krupa Orch. Feat. Anita O'day\tBolero At The Savoy\tOkeh\t6721\t31801-2\t1941\tRoy Eldridge, Graham Young, Al Beck, Norman Murphy (tp), Babe Wagner, Jay Kelliher, John Grassi (tb), Mascagni Ruffo, Sam Listengart, Jimmy Migliore (as), Sam Musiker, Walter Bates (ts), Milton Raskin (p), Ray Biondi (g), Ed Mihelich (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3o/VIC20146.mp3\tWaring's Pennsylvanians\tBolshevik\tVICTOR\t20146\t35528-13\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_131.mp3\tJimmie Grier And His Cocoanut Grove Orchestra\tBon Voyage To My Ship Of Dreams\tVICTOR\t22970\t68349-1\t1932\tWalter Holzhaus, Bernard Cohen (tp), Homer Menge (tb), James Briggs, Frank Schumacher (cl, as), Art Grier (cl, ts), Dick Webster, Weiner Callies, Dwight Muma (vn), Hal Chanslor (p), Richard Ebrecke (g), Paul King (sb), William Madeas (dm), Donald Novis (vo)\nhttp://www.jazz-on-line.com/a/mp3a/CAP936x.mp3\tKay Starr Orchestra Of Lou Busch\tBonaparte's Retreat\tCAPITOL\t\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB4136.mp3\tGene Krupa's Chicago Jazz Band\tBonaparte's Retreat\tRCA\t20-3766\tE0VB4136\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041533.mp3\tFats Waller And His Rhythm\tBond Street\tBLUEBIRD\t10437\t041533\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149280.mp3\tGid Tanner's Skillet Lickers\tBoneparte's Retreat\tCOLUMBIA\t15485 D\tW149280\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21597-8-9.mp3\tRed Nichols & His 5 Pennies\tBoneyard Shuffle\tBRUNSWICK\t3477\t21597-8-9\t1926\t\nhttp://www.jazz-on-line.com/a/mp3o/DIA1024x.mp3\tCharlie Parker\tBongo Bop\tDIAL\t1024\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM49S390.mp3\tSlim Gaillard\tBongo Cito\tMGM\t10938\t49S390\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62079-A.mp3\tCount Basie And His Orchestra\tBoo Hoo\tDECCA\t1228\t62079-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07747-1.mp3\tFats Waller And His Rhythm\tBoo Hoo\tVICTOR\t25563\t07747-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS24060-2.mp3\tHarry James W Pete Johnson\tBoo Woo\tCBS\tBR8318\t24060-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_422.mp3\tDuke Ellington And His Famous Orchestra\tBoo-dah\tCapitol\t2598\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE27803.mp3\tCab Calloway & His Orchestra\tBoo-wah Boo-wah\tOKEH\t5774\t27803\t1940\t\nhttp://www.jazz-on-line.com/a/mp37/COLB24060A.mp3\tHarry James And The Boogie Woogie Trio\tBoo-woo\tCOLUMBIA\t35958\tB2460\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BAN6551-4-7.mp3\tDixie Washboard Band\tBoodle-am (vc.williams)\tBANNER\t1781\t6551-4-7\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/CONWC2986.mp3\tCab Calloway & His Orchestra\tBoog It\tCONQUEROR\t9466\tWC2986\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67520.mp3\tLouis Armstrong & Mills Bros\tBoog It\tDECCA\t3180A\t67520\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048482.mp3\tGlenn Miller And His Orchestra\tBoog It (vmarion Hutton)\tBLUEBIRD\t10689\t048482\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU45622-2.mp3\tJelly Roll Morton\tBoogaboo\tBLUEBIRD\t7725\t45622-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic45622-2.mp3\tJelly-roll Morton's Red Hot Peppers\tBoogaboo\tVictor\tV-38010\t45622-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO35113.mp3\tGene Krupa And His Orchestra\tBoogie Blues\tCOLUMBIA\t36986\tCO35113\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481101.mp3\tGene Krupa Orch. Feat. Anita O'day\tBoogie Blues\tColumbia\t36986\tCO35113-1\t1945\tDon Fagerquist, Joe Triscari, Vince Hughes, Tony Russo (tp), Leon Cox, Pullman ''Tommy'' Pederson, Bill Culley (tb), Johnny Bothwell, Adrian Tei (as), Charlie Ventura, Charlie Kennedy (ts), Stuart Olson (bar), Teddy Napoleon (p), Ed Yance (g), Gene Krupa, Joe Dale (dm),  Ray Biondi (arr)\nhttp://www.jazz-on-line.com/a/mp3c/MANW1244.mp3\tLuis Russell & His Orchestra\tBoogie In The Basement\tMANOR\t1006\tW1244\t1945\t\nhttp://www.78-tours.net/mp3/GRAOA026898.mp3\tTommy Dorsey And His Orchestra Tommy Dorsey, L. Jenkins, M. Zudekoff (trombones) F. Stulce, S. Herfu\tBoogie Woogie\tGRAMOPHONE\tK. 8250\tOA. 026898\t1943\t\nhttp://www.jazz-on-line.com/a/mp37/COLC1659C.mp3\tCount Basie's Blue Five\tBoogie Woogie\tCOLUMBIA\t35959\tC1659\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC026898-1.mp3\tTommy Dorsey And His Orchestra\tBoogie Woogie\tVICTOR\t26054A\t026898-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWC2801.mp3\tPete Johnson\tBoogie Woogie\tCOLUMBIA\t37334\tWC2801\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/Blu59748-2.mp3\tKing Oliver And His Orchestra\tBoogie Woogie\tBluebird\tB-6778\t59748-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/Cha17967.mp3\tTed Smith's Rhythm Aces\tBoogie Woogie\tChampion\t16332\t17967\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec02355.mp3\tCount Basie\tBoogie Woogie\tDecca\t02355\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64735-A.mp3\tCount Basie And His Orchestra (piano)\tBoogie Woogie\tDECCA\t2355A\t64735-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_056.mp3\tTommy Dorsey And His Orchestra Feat. Featuring Pianist Howard Smith\tBoogie Woogie\tVICTOR\t26054A\t026898-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480603.mp3\tBen Webster Quintet\tBoogie Woogie\tVerve\t833551-2\t21747-1\t1957\tBen Webster (p), Herb Ellis (g), Ray Brown (sb), Stan Levey (dm)\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S215.mp3\tJoe Turner\tBoogie Woogie Baby\tMGM\t10492\t48S215\t1948\t\nhttp://www.jazz-on-line.com/a/mp3d/RexRK-13.mp3\tErroll Garner Trio\tBoogie Woogie Boogie\tRex\tJ501\tRK-13\t1944\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec03598.mp3\tAndrews Sisters\tBoogie Woogie Buggle Boy\tDecca\t03598\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68610.mp3\tWoody Herman & His Orchestra\tBoogie Woogie Bugle Boy\tDECCA\t3617A\t68610\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2326.mp3\tAndrews Sisters\tBoogie Woogie Bugle Boy\tDECCA\t3598A\tDLA2326\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_109.mp3\tAndrews Sisters\tBoogie Woogie Bugle Boy\tDECCA\t3598A\tDLA2326\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CONC3529-2.mp3\tGene Krupa & His Orchestra\tBoogie Woogie Bugle Boy (v Irene Day)\tCONQUEROR\t9615\tC3529-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68909.mp3\tLouis Jordan & His Tympani 5\tBoogie Woogie Came To Town\tDECCA\t8581B\t68909\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71051.mp3\tAndy Kirk's 12 Clouds Of Joy\tBoogie Woogie Cocktail\tDECCA\t4381B\t71051\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71051-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tBoogie Woogie Cocktail\tDecca\t4381\t71051-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU8734BW.mp3\tVillage Boys\tBoogie Woogie In The Village\tBLUEBIRD\t8734\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC063861.mp3\tAlbert Ammons And Pete Johnson\tBoogie Woogie Man\tVICTOR\t27505\t063861\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66220.mp3\tBob Crosby & His Orchestra\tBoogie Woogie Maxixe\tDECCA\t2848A\t66220\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69368.mp3\tSam Price's Texas Blusicians\tBoogie Woogie Moan\tDECCA\t8575B\t69368\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM48S91.mp3\tFive Red Caps\tBoogie Woogie On A Saturday Night\tMGM\t10285\t48S91\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU047055-1.mp3\tEarl Hines And His Orchestra\tBoogie Woogie On St. Louis Blues\tBLUEBIRD\tB-10674\t047055-1\t1940\tWalter Fuller (tp,vcl) Milton Fletcher, Edward Sims (tp) George Dixon (tp,as) Edward Burke, John Ewing, Joe McLewis (tb) Omer Simeon (cl,bar) Leroy Harris (as,vcl) Jimmy Mundy, Robert Crowder (ts,arr) Earl Hines (p,dir,arr) Claude Robertson (g) Quinn Wilson (b,arr) Alvin Burroughs (d) Billy Eckstine (vcl) George Dixon (speech-1)\nhttp://www.jazz-on-line.com/a/mp3d/V-DVP-1163.mp3\tEarl Hines\tBoogie Woogie On St. Louis Blues\tV-Disc\t424-A\tVP-1163\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/V-DVP-1163.mp3\tEarl Hines, Piano With Paul Baron And His Orchestra\tBoogie Woogie On St. Louis Blues\tV-Disc\t424-A\tVP-1163\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU047055-1.mp3\tEarl Hines And His Orchestra\tBoogie Woogie On The St Louis Blues\tBLUEBIRD\t10674\t047055-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS29740-1.mp3\tLes Brown & His Orchestra\tBoogie Woogie Piggy\tCBS\toK6085\t29740-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU061244.mp3\tGlenn Miller And His Orchestra\tBoogie Woogie Piggy (vtb)\tBLUEBIRD\t11163-B\t061244\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COL23890-1.mp3\tMeade Lux Lewis-pete Johnson-albert Ammons\tBoogie Woogie Prayer (part 1)\tCOLUMBIA\t35960\t23890-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp37/COL23890-2.mp3\tMeade Lux Lewis-pete Johnson-albert Ammons\tBoogie Woogie Prayer (part 2)\tCOLUMBIA\t35960\t23890-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPjoef.mp3\tJoe Finger Carr Carhops\tBoogie Woogie Rag\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECLA5895.mp3\tLionel Hampton & His Orchestra\tBoogie Woogie Santa Claus\tDECCA\t27325\tLA5895\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5895.mp3\tLionel Hampton And His Orchestra\tBoogie Woogie Santa Claus\tDecca\t27325\tLA-5895\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC90568.mp3\tAlbert Ammons Rhythm Kings\tBoogie Woogie Stomp\tDECCA\t3386B\tC90568\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC1001BW.mp3\tJames P Johnson\tBoogie Woogie Stride\tASCH\t1001\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec68286-A.mp3\tBenny Carter And His Orchestra\tBoogie Woogie Sugar Blues\tDecca\t6588\t68286-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68969.mp3\tBuddy Johnson & His Band\tBoogie Woogie's Mother-in-law\tDECCA\t8546\t68969\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiM33184-.mp3\tThe Dutch Swing College Band\tBoogietrap\tDecca\tM33184\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWB24825.mp3\tTeddy Wilson & His Orchestra\tBooly-ja-ja\tCOLUMBIA\t35220\tWB24825\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/ColB-24825-A.mp3\tTeddy Wilson And His Orchestra\tBooly-ja-ja\tColumbia\t35220\tB-24825-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_129.mp3\tDecastro Sisters\tBoom Boom Boomerang\tAbbott\t3003\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S3112.mp3\tBob Wills And His Texas Playboys\tBoot Heel Drag\tMGM\t30393\t49S3112\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57312-3.mp3\tBennie Moten's Kansas City Or.\tBoot It (milenberg Joys)\tVICTOR\t38144\t57312-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE80763.mp3\tJesse Stone's Serenaders\tBoot To Boot\tOKEH\t8471\t80763\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU028744.mp3\tBoots And His Buddies\tBoots Stomp\tBLUEBIRD\t10106\t028744\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU558B.mp3\tMcghee Boptet\tBoperation\tBLUENOTE\tBN558\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_375.mp3\tCarl Perkins\tBoppin' The Blues\tSun\t243\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66368.mp3\tJimmie Davis\tBorn To Be Blue\tDECCA\t5726\t66368\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152768.mp3\tBen Selvin & His Orchestra\tBorn To Be Kissed\tCOLUMBIA\t2936 D\tW152768\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU15359.mp3\tFreddy Martin & His Orchestra\tBorn To Be Kissed\tBRUNSWICK\t6930\t15359\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_038.mp3\tChordettes\tBorn To Be With You\tCadence\t1291\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH0655.mp3\tTed Daffan's Texans\tBorn To Lose\tOKEH\t6706\tH0655\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLH655.mp3\tTed Daffan's Texans\tBorn To Lose\tCOLUMBIA\t21400\tH655\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_119.mp3\tTed Daffan And His Texans Feat. Leon Seago\tBorn To Lose\tOKEH\t6706\tH0655\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/VOC4224x.mp3\tMildred Bailey And Her Orchestra\tBorn To Swing\tVocalion\t4224\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23181-1.mp3\tMildred Bailey\tBorn To Swing\tCBS\tVO4224\t23181-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61945-A.mp3\tLil Armstrong And Her Swing Band\tBorn To Swing\tDecca\t1299\t61945-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-4023-.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tBoston Skuffle\tBrunswick\t7101\tC-4023-\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47399.mp3\tRosemary Clooney\tBotch-a-me\tCOLUMBIA\t39767\tCO47399\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_018.mp3\tRosemary Clooney\tBotch-a-me\tColumbia\t39767\tCO47399\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU044241.mp3\tTommy Mcclennan\tBottle It Up And Go\tBLUEBIRD\t8373\t044241\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/PARP2838.mp3\tClarence Williams Orchestra\tBottomland\tPARAMOUNT\t12517\tP2838\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55661-2.mp3\tNat Shilkret & His Orchestra\tBottoms Up (vfl)\tVICTOR\t22109\t55661-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh198.mp3\tAmbrose And His Orchestra\tBoulevard Of Broken Dreams (v Sam Browne)\tBrunswick\t01721\tGB-6591-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC77355-1.mp3\tJan Garber And His Orchestra\tBoulevard Of Broken Dreams (vlee Bennett)\tVICTOR\t24498\t77355-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68616.mp3\tWoody Herman & His Orchestra\tBounce Me Brother, With A Solid Four\tDECCA\t3617B\t68616\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COL29508.mp3\tJohn Kirby & His Orchestra\tBounce Of The Sugar Plum Fairy\tCOLUMBIA\t35998\t29508-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67311.mp3\tLouis Jordan & His Tympani 5\tBounce The Ball\tDECCA\t3253A\t67311\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC3253A.mp3\tLouis Jordan & His Tympani 5\tBounce The Ball\tDECCA\t3253A\t67311\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62929-2.mp3\tBennie Moten Kansas City Orchestra\tBouncin Around\tVICTOR\t23030\t62929-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-7-1.mp3\tPhilippe Brun And His Swing Band (with Django Reinhardt)\tBouncin' Around\tSWING\t54\tOSW-7-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MER166-2.mp3\tErroll Garner\tBouncin' With Me\tMERCURY\t2040\t166-2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-1953-1.mp3\tDjango Reinhardt\tBouncing Around\tSWING\t7\tOLA-1953-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC055237.mp3\tLionel Hampton & His Orchestra\tBouncing At The Beacon\tVICTOR\t27364\t055237\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic055237-1.mp3\tLionel Hampton And His Sextet\tBouncing At The Beacon\tVictor\t27364\t055237-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU1567p.mp3\tBud Powell Modernists\tBouncing With Bud\tBLUENOTE\t1567\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046159-1.mp3\tColeman Hawkins Octet\tBouncing With The Bean\tBLUEBIRD\t10693\t046159-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_101.mp3\tEddy Arnold\tBouquet Of Roses\tRCA\t20-2806\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP5116.mp3\tBlue Lu Barker\tBow Legged Daddy\tCAPITOL\t\t5116\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC25836-3.mp3\tOriginal Dixieland Jazz Band\tBow Wow Blues\tVICTOR\t18850\t25836-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81671-3.mp3\tBessie Smith\tBoweavil Blues\tCOLUMBIA\t14018 D\t81671-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-26-2.mp3\tMezzrow - Bechet Quntet\tBowin' The Blues\tKing Jazz\t141\tKJ-26-2  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVS5718.mp3\tJohnny Guarnieri Trio\tBowing, Singing Sam\tSAVOY\t530A\tS5718\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COLM960.mp3\tDuke Ellington And His Orchestra\tBoy Meets Horn\tCOLUMBIA\t36123\tM960\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA1952-A.mp3\tBenny Goodman And His Orchestra\tBoy Meets Horn\tCOLUMBIA\t35301\tLA1952-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP494.mp3\tDuke Ellington's Orchestra\tBoy Meets Horn\tV-DISC\t176A\tVP494\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/MER236.mp3\tRex Stewart & His Rextet\tBoy Meets Horn\tMERCURY\t8001\t236\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCWC2751.mp3\tSweet Violet Boys\tBoy Take Your Time\tVOCALION\t5162\tWC2751\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC53092.mp3\tHigh Hatters\tBoy! Oh Boy! I've Got It Bad\tVICTOR\t22703\t53092\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO31432.mp3\tJane Froman W Al Goodman\tBoy! What Love Has Done To Me\tCOLUMBIA\t36414\tCO31432\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D215B.mp3\tTony Pastor\tBraggin'\tV-DISC\t215B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLM773.mp3\tDuke Ellington & His Orchestra\tBraggin' In Brass\tCOLUMBIA\t36276\tM773\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2399.mp3\tBing Crosby\tBrahm's Lullaby (cradle Song)\tDECCA\t3840A\tDLA2399\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2010.mp3\tBob Wills And His Texas Playboys\tBrain Cloudy Blues\tCOLUMBIA\t37313\tHCO2010\t1946\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC37216-2.mp3\tCoon Sanders Nighthawk Orchestra\tBrainstorm\tVICTOR\t20390B\t37216-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC41738-2.mp3\tJimmie Rodgers\tBrakeman's Blues (blue Yodel No.2)\tVICTOR\t21291\t41738-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD9VB600.mp3\tCount Basie & His Orchestra\tBran' New Dolly\tRCA\t20-3449\tD9VB600\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB405.mp3\tCount Basie & His Orchestra\tBrand New Wagon\tRCA\t20-2529\tD7VB405\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO5y.mp3\tFirehouse Five Plus Two\tBrass Bell\tGood Time Jazz\t5\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO32077.mp3\tRomay W Xavier Cugat's Orchestra\tBrazil\tCOLUMBIA\t36651\tCO32077\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP62453.mp3\tLes Paul\tBrazil\tCAPITOL\t\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71055.mp3\tJimmy Dorsey & His Orch.\tBrazil\tDECCA\t18460B\t71055\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC18460B.mp3\tJimmy Dorsey & His Orchestra\tBrazil\tDECCA\t18460B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec18460.mp3\tJimmy Dorsey & His Orchestra\tBrazil\tDecca\t18460\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27702.mp3\tEnric Madriguera & His Orchestra\tBrazil\tVictor\t27702\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_267.mp3\tLes Paul\tBrazil\tCapitol\t15037\t3208\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_012.mp3\tXavier Cugat And His Waldorf-astoria Orchestra\tBrazil\tCOLUMBIA\t36651\tCO32077\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_073.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly And Helen O'connell\tBrazil\tDECCA\t18460B\t71055\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S259.mp3\tSy Oliver & His Orchestra\tBread And Butter Woman\tMGM\t10103B\t47S259\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC67435.mp3\tSlim Smith (bernard Smith)\tBread Line Blues\tVICTOR\t23526\t67435\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14586-A.mp3\tFrankie Trumbauer & His Orchestra\tBreak It Down\tBRUNSWICK\t6763\t14586-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic78093-1.mp3\tMills Blue Rhythm Band\tBreak It Down\tVictor\t24482\t78093-1  \t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1898_002.mp3\tGeorge J. Gaskin\tBreak The News To Mother\tCOLUMBIA\t4156\t\t1898\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152739.mp3\tBenny Goodman And His Orchestra\tBreakfast Ball\tCOLUMBIA\t2927 D\tW152739-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU57542-1.mp3\tDuke Ellington & His Orchestra\tBreakfast Dance\tBLUEBIRD\t10243\t57542-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18601-1.mp3\tFrankie Trumbauer's Orchestra\tBreakin' In A New Pair Of Shoes\tBRUNSWICK\t7613\t18601-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18518-1.mp3\tTeddy Wilson's Orchestra\tBreakin' In A New Pair Of Shoes\tBRUNSWICK\t7599\t18518-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1150.mp3\tTed Daffan's Texans\tBreakin' My Heart Over You\tOKEH\t6452\tDAL1150\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39393.mp3\tBob Howard & His Orchestra\tBreakin' The Ice\tDECCA\t407B\t39393\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84926-1.mp3\t\"fats Waller And His Rhythm\tBreakin' The Ice\tVictor\t24826\t84926-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/CLOSAH5.mp3\tRichard Hitter's Cabineers\tBreakin' The Leg\tCLOVER\tEBS1063\tSAH5\t1925\t\nhttp://www.jazz-on-line.com/a/mp3h/GRE3700-A.mp3\tNick Nichols Ramblers\tBreaking A Leg\tGREYGULL\t1820\t3700-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/CBS20255.mp3\tCarroll Gibbons And His Orch.\tBreaking In A New Pair Of Shoes\tCBS\tCO3161D\t20255\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC96570.mp3\tBenny Goodman And His Orchestra\tBreaking In A Pair Of Shoes\tVICTOR\t25247\t96570\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_265.mp3\tMerry Macs\tBreathless\tDECCA\t4265A\tDLA2906\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_107.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. Ken Curtis\tBreathless\tBluebird\t11497\t73416\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-33-1.mp3\tMezzrow - Bechet Quintet\tBreathless Blues\tKing Jazz\t147\tKJ-33-1  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC64695.mp3\tAndy Kirk & Clouds Of Joy\tBreeze\tDECCA\t2261A\t64695\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_118.mp3\tAmerican Quartet\tBreeze (blow My Baby Back To Me)\tVictor\t18605\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64695-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tBreeze (blow My Baby Back To Me)\tDecca\t2261\t64695-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1110-1.mp3\tJess Stacy & His Stars\tBreeze (f.t.)\tVARSITY\t8121\tUS1110-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL13838.mp3\tClarence Williams & His Orchestra\tBreeze Blow My Baby Back To Me\tCOLUMBIA\t37680\t13838\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1111-1.mp3\tJess Stacy & His Stars\tBreeze Blues\tVARSITY\t8121\tUS1111-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CONC1760-2.mp3\tHoosier Hot Shots\tBreezin' Along With The Breeze\tCONQUEROR\t8886\tC1760-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19628.mp3\tAbe Lyman & His Orchestra\tBreezin' Along With The Breeze\tBRUNSWICK\t3240\t19628\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36046-1.mp3\tRevelers\tBreezin' Along With The Breeze\tVICTOR\t20140\t36046-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_220.mp3\tRevelers\tBreezin' Along With The Breeze\tVICTOR\t20140\t36046-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_227.mp3\tHoosier Hot Shots\tBreezin' Along With The Breeze\tCONQUEROR\t8886\tC1760-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/CAPEAP3-1020-1a.mp3\tJackie Gleason And His Orchestra\tBriarcliff Beat\tCAPITOL\tEAP 3-1020-1a\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-504-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tBricktop\tSWING\t283\tOSW-504-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_179.mp3\tBilly Murray And Aileen Stanley\tBridget O' Flynn (where've Ya Been?)\tVICTOR\t20240\t36063-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36063-1.mp3\tBilly Murray & A.stanley\tBridget O'flynn\tVICTOR\t20240\t36063-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3l/COL79635.mp3\tLeo Reisman & His Orchestra\tBright Eyes\tCOLUMBIA\tA-3366\t79635\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_041.mp3\tLeo Reisman And His Orchestra\tBright Eyes\tCOLUMBIA\tA-3366\t79635\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_013.mp3\tPaul Whiteman And His Orchestra\tBright Eyes\tVICTOR\t18735A\t24823-10\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-16543-A.mp3\tLouis Prima And His New Orleans Gang\tBright Eyes\tBrunswick\t7376\tB-16543-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC24823-10.mp3\tPaul Whiteman & His Orchestra\tBright Eyes - Medley F.vt.\tVICTOR\t18735A\t24823-10\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_058.mp3\tHomer Rodeheaver\tBrighten The Corner Where You Are\tVictor\t17763\t15855-1\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP991.mp3\tCootie Williams & His Orchestra\tBring 'em Down Front\tCAPITOL\t\t991\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP336.mp3\tKing Cole Trio\tBring Another Drink\tCAPITOL\t192\t336\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_123.mp3\tAlma Gluck\tBring Back My Bonnie To Me\tVictor\t64793\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_105.mp3\tEddie Fisher\tBring Back The Thrill\tRCA VICTOR\t4016\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VEL1295-Vx.mp3\tJack Kaufman And Al Campbell\tBring Back Those Minstrel D\tVelvet Tone\t1295-V\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1924_1007_01.mp3\tLee Morse\tBring Back Those Rock A Bye Baby Days\tPerfect\t12165A\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COL27668.mp3\tBert Williams\tBring Back Those Wonderful Days\tCOLUMBIA\t35591\t27668\t1919\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC22606-5.mp3\tArthur Fields\tBring Back Those Wonderful Days\tVICTOR\t18555A\t22606-5\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_045.mp3\tBert Williams\tBring Back Those Wonderful Days\tCOLUMBIA\t35591\t27668\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_041.mp3\tArthur Fields\tBring Back Those Wonderful Days\tVICTOR\t18555A\t22606-5\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9660-B.mp3\tRichard M Jones Jazz Wizards\tBring It On Home To Grandma\tDECCA\t7051\tC9660-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-5951-A.mp3\tJimmie Noone's Apex Club Orchestra\tBring It On Home To Grandma ? V E P\tVocalion \t1584\tC-5951-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64708.mp3\tCannon's Jug Stompers\tBring It With You When You Come\tVICTOR\t23262\t64708\t1930\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81771-2.mp3\tThe Georgians\tBringin' Home The Bacon\tColumbia\t136-D\t81771-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE29090-1.mp3\tCount Basie And His Orchestra\tBroadway\tOKEH\t6095\t29090-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20874-A.mp3\tPaul Whiteman And His Orchestra\tBroadway\tVICTOR\t20874\t39570-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29090-1.mp3\tCount Basie And His Orchestra\tBroadway\tOkeh\t6095\t29090-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79389-2.mp3\tNora Bayes\tBroadway Blues\tCOLUMBIA\tA-3311\t79389-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_123.mp3\tNora Bayes Feat. O/charles Prince\tBroadway Blues\tCOLUMBIA\t3311\t79389-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_076.mp3\tPietro Deiro\tBroadway Medley\tVICTOR\t17486A\t14025-1\t1914\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR845-Hx.mp3\tJack Hart\tBroadway Melody\tHarmony\t845-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_113.mp3\tCharles King\tBroadway Melody\tVICTOR\t21964\t50578-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_161.mp3\tNat Shilkret And The Victor Orchestra\tBroadway Melody\tVICTOR\t21886\t49958-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC49958-2.mp3\tNat Shilkret & Victor Orchestra\tBroadway Melody (v F R)\tVICTOR\t21886\t49958-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW147964-2.mp3\tBen Selvin And His Orchestra\tBroadway Melody (vjp)\tCOLUMBIA\t1738 D\tW147964-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39916-A.mp3\tGuy Lombardo's Royal Canadians\tBroadway Rhythm\tDECCA\t549B\t39916-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC24809-2.mp3\tOriginal Dixieland Jazz Band\tBroadway Rose\tVICTOR\t18722A\t24809-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18722-A.mp3\tOriginal Dixieland Jazz Band\tBroadway Rose\tVictor\t18722-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC24705.mp3\tPeerless Qt & Henry Burr\tBroadway Rose (v H B)\tVICTOR\t18710\t24705\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62803.mp3\tWoody Herman & His Orchestra\tBroadway's Gone Hawaiian\tDECCA\t1583\t62803\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC81989-2.mp3\tRamona's Park Avenue Boys\tBroadways Gone Hillbilly\tVICTOR\t24598\t81989-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/PARP3076.mp3\tBlind Lemon Jefferson\tBroke And Hungry Blues\tPARAMOUNT\t12443\tP3076\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14037.mp3\tBlind Willie (mctell)\tBroke Down Engine #2\tARC\t\t14037\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78637.mp3\tCharles Harrison\tBroken Blossoms\tCOLUMBIA\tA-2793\t78637\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_067.mp3\tCharles Harrison\tBroken Blossoms\tCOLUMBIA\tA-2793\t78637\t1920\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI10407.mp3\tNoble Sissle And Eubie Blake\tBroken Busted Blues\tEDISON\t51572\t10407\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP800x.mp3\tMargaret Whiting - J.wakely\tBroken Down Merry-go-rounf\tCAPITOL\t800\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK2815-ANM.mp3\tMoon Mullican\tBroken Dreams\tKING\t839\tK2815-ANM\t\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-18471-1.mp3\tMills Blue Rhythm Band\tBroken Dreams Of You\tColumbia\t3111-D\tCO-18471-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142833.mp3\tArt Gillam\tBroken Hearted\tCOLUMBIA\t972 D\tW142833\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38778-7.mp3\tPaul Whiteman & His Orchestra\tBroken Hearted\tVICTOR\t20757B\t38778-7\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC39637-4.mp3\tAileen Stanley\tBroken Hearted\tVICTOR\t20825A\t39637-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_215.mp3\tAileen Stanley\tBroken Hearted\tVICTOR\t20825A\t39637-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_172.mp3\tArden-ohman Orchestra\tBroken Hearted\tBRUNSWICK\t3592\tE23691\t1927\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU8251.mp3\tGene Rodemich And His Orchestra\tBroken Hearted Blues\tBRUNSWICK\t2290\t8251\t1922\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3c/BRU9144.mp3\tIsham Jones & His Orchestra\tBroken Hearted Melody\tBRUNSWICK\t2343\t9144\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35865-2.mp3\tBrox Sisters\tBroken Hearted Sue\tVICTOR\t20325\t35865-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1807.mp3\tTed Daffan's Texans\tBroken Vows\tCOLUMBIA\t20077\tHCO1807\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT521.mp3\tLouis Prima & His Orchestra\tBrooklyn Bridge\tMAJESTIC\t7141\tT521\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29417-1.mp3\tLes Brown & His Orchestra\tBroomstreet\tOKEH\t6049\t29417-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC12502A.mp3\tBing Crosby\tBrother Can You Spare Dime\tARC\tBR6414\t12502A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2504-1.mp3\tGene Ammons & His Sextet\tBrother Jug's Sermon\tMERCURY\t8125\t2504-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COL27661.mp3\tBert Williams\tBrother Low Down\tCOLUMBIA\t35592\t27661\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152312.mp3\tRudy Vallee & His Orchestra\tBrother, Can You Spare A Dime?\tCOLUMBIA\t2725 D\tW152312\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_015.mp3\tRudy Vallee And His Connecticut Yankees\tBrother, Can You Spare A Dime?\tCOLUMBIA\t2725\tW152312\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1878-3.mp3\tCharlie Palloy & His Orchestra\tBrother, Can You Spare A Dime? (v C P)\tCROWN\t3392A\tC1878-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU12502-A.mp3\tBing Crosby\tBrother, Can You Spare Dime ?\tBRUNSWICK\t6414\t12502-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COL140564.mp3\tEthel Waters And Her Ebony 4\tBrother, You've Got Me Wrong\tCOLUMBIA\t433D\t140564\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC8560x.mp3\tLouis Jordan & His Tympani 5\tBrotherly Love\tDECCA\t8560\t-\t\t\nhttp://www.jazz-on-line.com/a/mp3h/GENGEX-411.mp3\tJohnny Clesi's Aeolians\tBrotherly Love\tGENNETT\t6033\tGEX-411\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400988.mp3\tChicago Footwarmers\tBrown Bottom Bess\tOKeh\t8613\t400988\t1928\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW140910-2.mp3\tLeo Reisman & His Orchestra\tBrown Eyes - Why Are You Blue?\tCOLUMBIA\t456D\tW140910-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE16456.mp3\tNick Lucas\tBrown Eyes, Why Are You Blue?\tBRUNSWICK\t2961-B\tE16456\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_015.mp3\tNick Lucas\tBrown Eyes, Why Are You Blue?\tBRUNSWICK\t2961-B\tE16456\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_138.mp3\tFranklyn Baur\tBrown Eyes, Why Are You Blue?\tVICTOR\t19806\t33456\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_047.mp3\tCarl Fenton And His Orchestra Feat. V/frank Munn\tBrown Eyes, Why Are You Blue?\tBRUNSWICK\t2950\t16309-10\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU16309-10.mp3\tCarl Fenton And His Orch\tBrown Eyes, Why Are You Blue? (v F M)\tBRUNSWICK\t2950\t16309-10\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec90969-A.mp3\tLil Armstrong And Her Swing Band\tBrown Gal\tDecca\t1092\t90969-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S3127.mp3\tBob Wills And His Texas Playboys\tBrown Skin Gal\tMGM\t11119\t51S3127\t1951\t\nhttp://www.jazz-on-line.com/a/mp3h/EDI11235-A.mp3\tJoe Candullo And His Everglades Orchestra\tBrown Sugar\tEDISON\t51852R\t11235-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-16702-1.mp3\tMills Blue Rhythm Band\tBrown Sugar Mine\tColumbia\t3044-D\tCO-16702-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU77224-1.mp3\tDelmore Brothers\tBrown's Ferry Blues\tBLUEBIRD\t5403A\t77224-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu5403.mp3\tThe Delmore Brothers\tBrown's Ferry Blues\tBluebird\t5403\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/CON17291-1.mp3\tCallahan Brothers\tBrown's Ferry Blues #2\tCONQUEROR\t8627\t17291-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS23014.mp3\tBrownie Mcghee\tBrownie's New Worried Life Blues\tSAVOY\t747\tS23014\t1948\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC7473x.mp3\tSleepy John Estes\tBrownsville Blues\tDECCA\t7473\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400978-A.mp3\tChicago Footwarmers\tBrush Stomp\tOKeh\t8599\t400978-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_129.mp3\tBarry Green\tBrush Those Tears From Your Eyes\tRainbow\t10090\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/SUNSRC104.mp3\tJoe Sullivan Qt\tBrushin' Off The Boogie\tSUNSET\t100-52\tSRC104\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1001.mp3\tColeman Hawkins & His Orchestra\tBu Dee Daht\tAPOLLO\t752\tR1001\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO33295.mp3\tFrankie Laine\tBubbles\tCOLUMBIA\t40433\tRHCO33295\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM47S3206.mp3\tBob Wills And His Texas Playboys\tBubbles In My Beer\tMGM\t10116\t47S3206\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC-645-1.mp3\tEarl Hines And His Orchestra\tBubbling Over\tBRUNSWICK\t6710\tC-645-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/CAPEAP3-1020-2b.mp3\tJackie Gleason And His Orchestra\tBuchanan Bustout\tCAPITOL\tEAP 3-1020-2b\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23686.mp3\tSlim And Slam\tBuck Dance Rhythm\tCBS\tVO4521\t23686\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_196.mp3\tSlim And Slam\tBuck Dance Rhythm\tVOCALION\t4521\t23686-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU067947.mp3\tFats Waller And His Rhythm\tBuck Jumpin'\tBLUEBIRD\t11324\t067947\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2106.mp3\tKid Ory & His Band\tBucket Got A Hole In It\tCOLUMBIA\t37274\tHCO2106\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145053.mp3\tGid Tanner's Skillet Lickers\tBuckin' Mule\tCOLUMBIA\t15237 D\tW145053\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053796.mp3\tFats Waller And His Rhythm\tBuckin' The Dice\tBLUEBIRD\t11102\t053796\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14124-1.mp3\tCharlie Barnet & His Orchestra\tBuckin' The Wind (vhh)\tBANNER\t32876\t14124-1\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO31427-5.mp3\tBenny Goodman And His Orchestra\tBuckle Down Winsocki\tEPIC\tEE-22025\tCO31427-5\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D91-Ba.mp3\t418th Aaftc Band Under The Direction Of Captain Glenn Miller\tBuckle Down Winsocki\tV-Disc\t91-B\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG11913.mp3\tJelly Roll Morton\tBucktown Blues\tGENNETT\t5515\tG11913\t1924\t\nhttp://www.jazz-on-line.com/a/mp3h/CLOSAH7.mp3\tRichard Hitter's Cabineers\tBucktown Blues\tCLOVER\tEBS1062\tSAH7\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/MER455.mp3\tJay Mcshann & His Sextet\tBucktown Boogie\tMERCURY\t8020\t455\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC46063-2.mp3\tJohnny Dodds And His Band\tBucktown Stomp\tVICTOR\t38004B\t46063-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/BLU46063-2.mp3\tJohnny Dodds Washboard Band\tBucktown Stomp\tBLUEBIRD\t8549\t46063-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142646-1.mp3\tCharlie Poole's N.c.ramblers\tBudded Rose\tCOLUMBIA\t15138 D\tW142646-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/CONC3351.mp3\tCarter Family\tBuddies In The Saddle\tCONQUEROR\t9570\tC3351\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Pol24271-2hpp.mp3\tDjango Reinhardt\tBudding Dancers\tPolydor\tF-512738\t24271-2hpp\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17063H-.mp3\tThe Dutch Swing College Band\tBuddy Bolden Blues\tPhilips\tP17063H\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/COMR2570.mp3\tJelly Roll Morton (piano)\tBuddy Bolden's Blues\tCOMMODORE\t589\tR2570\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP2542.mp3\tJimmie Blythe\tBuddy Burton's Jazz\tPARAMOUNT\t12368\tP2542\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21594-5-6.mp3\tRed Nichols & His 5 Pennies\tBuddy's Habits\tBRUNSWICK\t3477\t21594-5-6\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17063H.mp3\tThe Dutch Swing College Band\tBuddy's Habits\tPhilips\tP17063H\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/Col265076-2.mp3\tMills Blue Rhythm Band\tBuddy's Wednesday Outing\tColumbia\tCB-734\t265076-2  \t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC2127.mp3\tUncle Dave Macon\tBuddy, Won't You Roll Down The Line?\tBRUNSWICK\t292\tC2127\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D775B.mp3\tElla Fitzgerald-buddy Rich\tBudella\tV-DISC\t775\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26714.mp3\tBenny Goodman & His Orchestra\tBuds Won't Bud\tCOLUMBIA\t35472\t26714-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic16049.mp3\tBilly Murray & Haydn Quartet\tBudweiser's A Friend Of Mine\tVictor\t16049\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_225.mp3\tRoberta Quinlan\tBuffalo Billy\tMERCURY\t5420\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Col145761-I.mp3\tJohnny Dunn And His Band\tBuffalo Blues\tColumbia\t14306-D\t145761-I\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUC3009.mp3\tWalter Barnes And His Royal Creolians\tBuffalo Rhythm\tBRUNSWICK\t7072\tC3009\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC68243-1.mp3\tHenny Hendrickson's Louisville Serenaders\tBuffalo Rhythm\tVICTOR\t22749\t68243-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/GenGEX-660.mp3\tJohnny Ringers Rosmont Orchestra\tBuffalo Rhythm\tGennett\t6183\tGEX-660\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUM886.mp3\tDuke Ellington's Famous Orchestra\tBuffet Flat\tBRUNSWICK\t8231\tM886\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCMEM89.mp3\tSwift Jewel Cowboys\tBug Shuffle\tVOCALION\t5499\tMEM89\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL16710-1.mp3\tRed Norvo's Swing Octet\tBughouse\tCOLUMBIA\t3079 D\t16710-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CONM695.mp3\tCab Calloway & His Orchestra\tBugle Blues\tCONQUEROR\t9090\tM695\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO875.mp3\tCount Basie & His Band\tBugle Blues\tCOLUMBIA\t36709\tHCO875\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68516.mp3\tSkeets Tolbert Gentlemen Swing\tBugle Blues\tDECCA\t8516B\t68516\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec68516-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tBugle Blues\tDecca\t8516\t68516-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU048964.mp3\tGlenn Miller And His Orchestra\tBugle Call Rag\tBLUEBIRD\t10740\t048964\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC02460-1.mp3\tBenny Goodman And His Orchestra\tBugle Call Rag\tVICTOR\t25467\t02460-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BANE37220-A.mp3\tCab Calloway & His Orchestra\tBugle Call Rag\tBANNER\t32866\tE37220-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC15644-1.mp3\tBenny Goodman And His Orchestra\tBugle Call Rag\tARC\tCO2958D\t15644-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21718.mp3\tRed Nichols & His 5 Pennies\tBugle Call Rag\tBRUNSWICK\t3490\t21718\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BANC8651-1.mp3\tMills Brothers\tBugle Call Rag\tBANNER\t33215\tC8651-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN11716-1.mp3\tBilly Banks & His Rhythmakers\tBugle Call Rag\tBANNER\t32459\t11716-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5238.mp3\tTeddy Wilson Quintet\tBugle Call Rag\tMUSICRAFT\t318\t5238\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/OKeW401958-C.mp3\tEddie Lang's Orchestra\tBugle Call Rag\tOKeh\t41410\tW401958-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67060-A.mp3\tGeorge Wettling Rhythm Kings\tBugle Call Rag\tDECCA\t18044A\t67060-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8949bcr.mp3\tCharlie Ventura & His Orchestra\tBugle Call Rag\tMERCURY\t8949\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VICOLA1884.mp3\tDickie Wells & His Orchestra\tBugle Call Rag\tVICTOR\t26220\tOLA1884\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC71839-1.mp3\tDuke Ellington & His Orchestra\tBugle Call Rag\tVICTOR\t22938\t71839-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU88935-1!.mp3\tKxyz Novelty Band\tBugle Call Rag\tBLUEBIRD\t5852\t88935-1!\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/OKE80546-A.mp3\tJack Linx Birmingham Serenaders\tBugle Call Rag\tOKEH\t\t80546-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/Cha16533-a.mp3\tHal Denman And His Orchestra\tBugle Call Rag\tChampion\t16533\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_026.mp3\tMills Brothers\tBugle Call Rag\tBANNER\t33215\tC8651-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Cal404598-B.mp3\tChocolate Dandies With Benny Carter\tBugle Call Rag\tCalumbia \t2543-D \t404598-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-37220-A.mp3\tCab Calloway And His Orchestra\tBugle Call Rag\tBrunswick\t6196\tE-37220-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/DecB-13260-A.mp3\tSpike Hughes And His Negro Orchestra With Benny Carter\tBugle Call Rag\tDecca \tF-3606\tB-13260-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/HMVOCS-436-2.mp3\tBenny Carter With Kai Ewans' Orchestra\tBugle Call Rag\tHMV\t4698\tOCS-436-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_182.mp3\tBenny Goodman And His Orchestra\tBugle Call Rag\tCOLUMBIA\t2958 D\t15644\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76347.mp3\tLouis Armstrong & His Allstars\tBugle Call Rag (pt.3)\tDECCA\t27191\t76347\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DECCE6073.mp3\tHarry Roy & His Orchestra\tBugle Call Rag (tiger Rag)\tDECCA\t1037A\tCE6073\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC86361.mp3\tLeroy Anderson Pops Concert Or\tBugler's Holiday\tDECCA\t29206\t86361\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26397-A.mp3\tJimmie Lunceford And His Orchestra\tBugs Parade\tColumbia\t35547\t26397-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh176.mp3\tRoy Fox And His Band\tBuild A Little Home (v Denny Dennis & The Cubs)\tDecca\tF-3936\tTB-1134-4\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14253-1.mp3\tJoe Venuti & His Orchestra\tBuild A Little Home (v H. Philips)\tBANNER\t32896\t14253-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44662.mp3\tDuke Ellington & His Orchestra\tBuild That Railroad\tCOLUMBIA\t39110\tCO44662\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_237.mp3\tIpana Troubadors  (s. Lanin)\tBuilding A Nest For Mary\tCOLUMBIA\t1815 D\tW148439\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/ARCB-13395-A.mp3\tCasa Loma Orchestra\tBuji\tARC\tBR6588\tB-13395-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEWC2991.mp3\tBukka White\tBukkas Jitterbug Swing\tOKEH\t5625\tWC2991\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/AJA31024-1.mp3\tFletcher Henderson Sawin' Six\tBull Blues\tAJAX\tAJX17016\t31024-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe71583.mp3\tThomas Morris Past-jazz Master\tBull Blues\tOKeh\t8075\t71583\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC11610-2.mp3\tBig Bill (broonzy)\tBull Cow Blues\tARC\tBA32653\t11610-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC46065-1.mp3\tJohnny Dodds Washboard Band\tBull Fiddle Blues\tVICTOR\t21552A\t46065-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68854.mp3\tJoe Marsala & His Orchestra\tBull's Eye\tDECCA\t3715A\t68854\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG14318.mp3\tWilliam Harris\tBullfrog Blues\tGENNETT\t6661\tG14318\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142035-1.mp3\tGid Tanner's Skillet Lickers\tBully Of The Town\tCOLUMBIA\t15074 D\tW142035-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BANMEM773.mp3\tMemphis Minnie\tBumble Bee\tBANNER\t32525\tMEM773\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148712-2.mp3\tKansas Joe & Memphis Minnie\tBumble Bee\tCOLUMBIA\t14542 D\tW148712-2\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_178.mp3\tBenny Goodman And His Orchestra\tBumble Bee Stomp\tVICTOR\t26087\t025799\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1829x.mp3\tFreddy Martin And His Orchestra\tBumble Boogie\tRCA\t20-1829\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/CAParbb.mp3\tAlvino Rey\tBumble Boogie\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_081.mp3\tFreddy Martin And His Orchestra\tBumble Boogie\tRCA\t20-1829\t\t1946\t\nhttp://www.jazz-on-line.com./a/mp3o/MERYB10173.mp3\tRalph Marterie & His Orchestra\tBumble Boogie\tMERCURY\t70406\tYB10173\t1954\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC83843.mp3\tT. Texas Tyler\tBumming Around\tDECCA\t28579\t83843\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUB13337-A-B.mp3\tDuke Ellington & His Orchestra\tBundle Of Blues\tBRUNSWICK\t6607\tB13337-A-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62040.mp3\tBob Howard & His Orchestra\tBundle Of Love\tDECCA\t2356A\t62040\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_102.mp3\tRay Anthony\tBunny Hop\tCapitol\t2251\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol12013-F.mp3\tThe Four Sicilians\tBuona Fortuna (good Fortune)\tColumbia\t12013-F\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO99999b.mp3\tGeorge Lewis\tBurgundy Street Blues\tGood Time Jazz\t99999b\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC88693.mp3\tBill Haley And His Comets\tBurn That Candle\tDECCA\t29713\t88693\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_071.mp3\tBill Haley And His Comets\tBurn That Candle\tDecca\t29713\t88693\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_229.mp3\tCues\tBurn That Candle\tRCA Victor\t6286\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49452-2.mp3\tJelly Roll Morton's Peppers\tBurnin' The Iceberg (weary Blues)\tVICTOR\t38075\t49452-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic49452-2.mp3\tJelly Roll Morton And His Orchestra\tBurnin' The Iceburg\tVictor\tV-38075\t49452-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_060.mp3\tGeorge Burns And Gracie Allen\tBurns And Allen Dialog, Parts 1 & 2\tCOLUMBIA\t2780 D\tW152411\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC69353.mp3\tJimmie Davis\tBury Me In Old Kentucky\tVICTOR\t23749\t69353\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN9174.mp3\tVernon Dalhart\tBury Me Not On The Lone Prairie\tBANNER\t531\t9174\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC39750-2.mp3\tCarter Family\tBury Me Under The Weeping Willow\tVICTOR\t21074\t39750-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_101.mp3\tCarter Family\tBury Me Under The Weeping Willow\tVICTOR\t21074\t39750-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEWC3139-A.mp3\tBlind Boy Fuller\tBus Rider Blues\tOKEH\t5933\tWC3139-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCHS27.mp3\tOriginal Yellow Jackets\tBusiness After Midnight\tVOCALION\t03504\tHS27\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC70991.mp3\tGene Kardos And His Orchestra\tBusiness In F\tVICTOR\t22899\t70991\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151851-1.mp3\tFletcher Henderson & His Orchestra\tBusiness In F\tCOLUMBIA\t2615 D\tW151851-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152282.mp3\tFrankie Trumbauer & His Orchestra\tBusiness In Q\tCOLUMBIA\t2710 D\tW152282\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99394.mp3\tTune Wranglers\tBuster's Crawdad Song\tBLUEBIRD\t6554\t99394\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26366-A.mp3\tBenny Goodman And His Orchestra\tBusy As A Bee\tCBS\tCO35356\t26366-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047017.mp3\tCharlie Barnet & His Orchestra\tBusy As A Bee\tBLUEBIRD\t10610\t047017\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD8VB3454.mp3\tRose Murphy (the Chee-chee Girl)\tBusy Line\tVictor\t20-3341-B\tD8VB3454\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2538.mp3\tFrank Sinatra\tBut Beautiful\tCOLUMBIA\t38053\tHCO2538\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1280.mp3\tFrankie Laine W Carl Fischer\tBut Beautiful\tMERCURY\t5096\t1280\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4556.mp3\tBing Crosby\tBut Beautiful\tDECCA\t24283\tL4556\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_224.mp3\tBing Crosby\tBut Beautiful\tDECCA\t24283\tL4556\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_120.mp3\tFrank Sinatra\tBut Beautiful\tCOLUMBIA\t38053\tHCO2538\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU101646.mp3\tCharlie Barnet & His Orchestra\tBut Definately\tBLUEBIRD\t6433\t101646\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19417-2.mp3\tBunny Berigan & His Boys\tBut Definitely (v C B)\tVOCALION\t3253\t19417-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_223.mp3\tDinah Shore\tBut I Did\tRCA\t20-1732\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66874.mp3\tLouis Jordan & His Tympani 5\tBut I'll Be Back\tDECCA\t7675\t66874\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO3874-1.mp3\tStuart Hamblen W String Band\tBut I'll Go Chasin' Women\tCOLUMBIA\t20625\tHCO3874-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035765.mp3\tGlenn Miller & His Orchestra\tBut It Didn't Mean A Thing\tBLUEBIRD\t10269\t035765\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64784.mp3\tAndy Kirk & Clouds Of Joy\tBut It Didn't Mean A Thing\tDECCA\t2277A\t64784\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64784-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tBut It Didn't Mean A Thing\tDecca\t2277\t64784-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480827.mp3\tAndre Previn\tBut Not Foandre Previn, P; Al Viola, G; Lloyd Pratt, B; Jackie Mills, Drumsr Me\tRCA VICTOR\t\t\t1948\tAndre Previn, p; Al Viola, g; Lloyd Pratt, b; Jackie Mills, drums\nhttp://www.jazz-on-line.com/a/mp3c/MAJT393.mp3\tPat Flowers Trio\tBut Not For Me\tMAJESTIC\t1011B\tT393\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO29235-1.mp3\tTeddy Wilson & His Orchestra\tBut Not For Me\tCOLUMBIA\t36084\tCO29235-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC76834.mp3\tElla Fitzgerald\tBut Not For Me\tDECCA\t27369\t76834\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D380A1.mp3\tHarry James And His Orchestra (helen Forrest Voc)\tBut Not For Me\tV-DISC\t380A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480702.mp3\tBenny Goodman Trio\tBut Not For Me\tBlue Disc\tT1016\t20335-2\t1954\tBenny Goodman (cl), Mel Powell (p), Eddie Grady (dm)\nhttp://www.jazz-on-line.com/a/mp3h/DH480826.mp3\tAndre Previn\tBut Not For Me\tRCA VICTOR\t20-3040\tD7VB1801\t1947\tAndre Previn, p; Al Viola, g; Lloyd Pratt, b; Jackie Mills, drums\nhttp://www.jazz-on-line.com/a/mp3c/DEC76398.mp3\tSy Oliver & His Orchestra\tBut She's My Buddy's Chick\tDECCA\t27718\t76398\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18501-1.mp3\tOzzie Nelson & His Orchestra\tBut Where Are You (vharriet Hillard)\tBRUNSWICK\t7607\t18501-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14985-2-3.mp3\tCharlie Barnet & His Orchestra\tButterfingers (vhelen Heath)\tBANNER\t33015\t14985-2-3\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/MERYB9756.mp3\tPatti Page W Jack Rael Orchestra\tButterflies\tMERCURY\t70183\tYB9756\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB6414.mp3\tRay Noble & His Orchestra\tButterflies In The Rain\tVICTOR\t24296\tOB6414\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/AJAAPX76121.mp3\tAndy Williams\tButterfly\tAJAX\tAPX76121\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400847-C.mp3\tFred Hall & His Sugar Babies\tButternut\tOKeh\t41112\t400847-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_485.mp3\tJimmy Heap And The Melody Makers With Perk Williams\tButternut\tCapitol\t3333\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_194.mp3\tEddie Delange Feat. Elisse Cooper\tButton Button (who's Got The Button?)\tBluebird\t7837\t27214\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148029.mp3\tRuth Etting\tButton Up Your Overcoat\tCOLUMBIA\t1762 D\tW148029\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49698-3.mp3\tHelen Kane\tButton Up Your Overcoat\tVICTOR\t21863\t49698-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC27268y.mp3\tRose Murphy\tButton Up Your Overcoat\tDecca\t27268\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiHar878-H.mp3\tAnnette Hanshaw\tButton Up Your Overcoat\tHarmony\t878-H\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_033.mp3\tHelen Kane\tButton Up Your Overcoat\tVICTOR\t21863\t49698-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh127.mp3\tJack Hylton And His Orchestra (vocal Sam Browne)\tButton Up Your Overcoat\tHMV\tB-5703\tBb-16739-5\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_175.mp3\tRuth Etting\tButton Up Your Overcoat\tCOLUMBIA\t1762\tW148029-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480828.mp3\tTed Heath And His Music\tButton Up Your Overcoat\tDECCA\tF9460\tDR-15039\t1950\tBobby Pratt, Stan Roderick, Stan Reynolds, Ronnie Hughes (tp) Jackie Armstrong, Maurice Pratt, Jack Bentley, Jimmy Coombes (tb) Les Gilbert, Reg Owen (as) Tommy Whittle, Henry Mackenzie (ts) Dave Shand (bar), Frank Horrox (p) Sammy Stokes (b) Jack Parnell (d,vcl) Ted Heath (dir) \nhttp://www.jazz-on-line.com/a/mp3c/OKe401716-C.mp3\tDorsey Brothers Orchestra Vocal Smith Ballew\tButton Up Your Overcoat (vsb)\tOKeh\t41210\t401716-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC027914.mp3\tBunny Berigan & His Orchestra\tButton, Button\tVICTOR\t26077B\t027914\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2853.mp3\tDinah Shore Happy Valley Boys\tButtons And Bows\tCOLUMBIA\t38284\tHCO2853\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3060.mp3\tGene Autry\tButtons And Bows\tCOLUMBIA\t20469\tHCO3060\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_132.mp3\tGene Autry\tButtons And Bows\tCOLUMBIA\t20469\tHCO3060\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_063.mp3\tBetty Garrett Feat. Art Mooney Orchestra\tButtons And Bows\tMGM\t10244B\t47S3401\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152362-2.mp3\tTed Lewis And His Band\tBuy American!\tCOLUMBIA\t2748 D\tW152362-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR814-Hx.mp3\tLou Gold And His Orch\tBuy, Buy For Baby\tHarmony\t814-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18734B.mp3\tLouis Jordan\tBuzz Me\tDECCA\t18734B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_217.mp3\tElla Mae Morse\tBuzz Me\tCapitol\t226\t756-2A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Cor72749.mp3\tJimmie Lunceford And His Orchestra\tBuzz-buzz-buzz\tCoral\t60041\t72749\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC07792-1.mp3\tLionel Hampton And His Orchestra\tBuzzin' Around With The Bee\tVICTOR\t25575\t07792-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic07792-1.mp3\tLionel Hampton And His Orchestra\tBuzzin' Around With The Bee\tVictor\t25575\t07792-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS3423-5.mp3\tCharlie Parker Quintet\tBuzzy\tSAVOY\t652A\tS3423-5\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS3423-3.mp3\tCharlie Parker\tBuzzy\tSAVOY\t928\tS3423-3\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_122.mp3\tJohnny Hamp And His Orchestra\tBy A Rippling Stream\tVICTOR\t22999\t72515-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA14.mp3\tDick Powell\tBy A Waterfall\tBRUNSWICK\t6667\tLA14\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU77617-1.mp3\tRudy Vallee & His Orchestra\tBy A Waterfall\tBLUEBIRD\t5171\t77617-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_167.mp3\tRudy Vallee And His Connecticut Yankees\tBy A Waterfall\tBLUEBIRD\t5171\t77617-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB13865-A.mp3\tGuy Lombardo Royal Canadians\tBy A Waterfall (v Carmen Lombardo)\tBRUNSWICK\t6653\tB13865-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC77611-1.mp3\tLeo Reisman And His Orchestra\tBy A Waterfall (varthur Wright)\tVICTOR\t24399\t77611-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13449-B.mp3\tDorsey Brothers Orchestra\tBy Heck\tBRUNSWICK\t6624\t13449-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_061.mp3\tByron G. Harlan And Will Robbins\tBy Heck\tCOLUMBIA\tA-1722\t39960\t1915\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1931_0327_01.mp3\tLee Morse And Her Bluegrass Boys\tBy My Side\tColumbia\t2436DA\tW151471-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480501.mp3\tArt Farmer\tBy Myself\tNew Jazz\tLP8203\t1020\t1956\tArt Farmer, T, FLH, Kenny Drew, P, Addison Farmer, B, Elvin Jones, D\nhttp://www.jazz-on-line.com/a/mp3t/TS480804.mp3\tArt Farmer\tBy Myself\tNew Jazz\tLP 8203\t1020\t1956\tArt Farmer, T, FLH, Kenny Drew, P, Addison Farmer, B, Elvin Jones, D\nhttp://www.jazz-on-line.com/a/mp3b/Joh055.mp3\tSavoy Hotel Orpheans Dir. By Carroll Gibbons\tBy Special Permission Of The Copyright Owners (i Love You)\tColumbia\tCB-469\tCA-12808-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COL39437.mp3\tAda Jones And Billy Watkins\tBy The Beautiful Sea\tCOLUMBIA\tA-1563\t39437\t1914\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA1563.mp3\tAda Jones & Billy Watkins\tBy The Beautiful Sea\tCOLUMBIA\tA1563\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol1563.mp3\tAda Jones & Billy Watkins\tBy The Beautiful Sea\tColumbia\t1563\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-1563.mp3\tAda Jones & Billy Watkins\tBy The Beautiful Sea\tCOLUMBIA\tA-1563\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_011.mp3\tAda Jones And Billy Watkins\tBy The Beautiful Sea\tCOLUMBIA\tA-1563\t39437\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_005.mp3\tHeidelberg Quintet\tBy The Beautiful Sea\tVICTOR\t17560\t14911-2\t1914\t\nhttp://www.jazz-on-line.com/a/mp3e/VICOB2892.mp3\tRay Noble And His Orchestra\tBy The Fireside\tVICTOR\t25141\tOB2892\t1932\twith Al Bowlly\nhttp://www.jazz-on-line.com/a/mp3c/VIC71915.mp3\tGeorge Olsen & His Music\tBy The Fireside (v B B)\tVICTOR\t22947B\t71915\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU075423.mp3\tFats Waller And His Rhythm\tBy The Light Of The Silv'ry Moon\tBLUEBIRD\t11569\t075423\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D166A2.mp3\tBing Crosby\tBy The Light Of The Silv'ry Moon\tV-DISC\t166A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VICB8501-1.mp3\tBilly Murray And Haydn Qt\tBy The Light Of The Silvery Moon\tVICTOR\t16460\tB8501-1\t1909\t\nhttp://www.jazz-on-line.com/a/mp3r/RiEdi10362.mp3\tAda Jones\tBy The Light Of The Silvery Moon\tEdison (cylinder)\t10362\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_019alt.mp3\tAda Jones\tBy The Light Of The Silvery Moon\tEdison (cylinder)\t10362\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC32719-1.mp3\tJan Garber And His Orchestra\tBy The Light Of The Stars\tVICTOR\t19689\t32719-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/MER867-1.mp3\tFrankie Laine\tBy The Light Of The Stars\tMERCURY\t5059B\t867-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/PARL0420.mp3\tLouise Johnson\tBy The Moon And Stars\tPARAMOUNT\t13008B\tL0420\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D157B.mp3\tWoody Herman And His Orchestra\tBy The River Of The Roses\tV-DISC\t157B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18578B.mp3\tWoody Herman & His Orchestra\tBy The River Of The Roses\tDECCA\t18578B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151304-1.mp3\tGuy Lombardo Royal Canadians\tBy The River Sainte Marie\tCOLUMBIA\t2401 D\tW151304-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC034402.mp3\tTommy Dorsey & His Orchestra\tBy The River Sainte Marie\tVICTOR\t26346\t034402\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63588-A.mp3\tJimmie Lunceford And His Orchestra\tBy The River Sainte Marie\tDecca\t1808\t63588-A\t1938\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3c/DEC76395.mp3\tSy Oliver & His Orch.\tBy The River St Marie\tDECCA\t27315\t76395\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_006.mp3\tGuy Lombardo And His Royal Canadians\tBy The River St. Marie\tColumbia\t2401\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_085.mp3\tMarguerite Farrell\tBy The Sad Luana Shore\tVICTOR\t18105\t17931-4\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE34112-A.mp3\tRed Nichols & His Orchestra\tBy The Shalimar\tBRUNSWICK\t4944\tE34112-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC70643.mp3\tPaul Whiteman & His Orchestra\tBy The Sycamore Tree\tVICTOR\t22879A\t70643\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/CON17481-2.mp3\tCarter Family\tBy The Touch Of Her Hand\tCONQUEROR\t8644\t17481-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC68284-A.mp3\tMills Bros And Benny Carter\tBy The Watermelon Vine, Lindy Lou\tDECCA\t3545A\t68284-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU027411.mp3\tGlenn Miller & His Orchestra\tBy The Waters Of Minnetonka\tBLUEBIRD\t7870 A\t027411\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64712-A.mp3\tJohn Kirby And His Onyx Club Boys\tBy The Waters Of Minnetonka\tDecca\tF-7806\t64712-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC84390.mp3\tColeman Hawkins W Paul Nielson\tBye 'n Bye\tDECCA\t28764\t84390\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66987.mp3\tLouis Armstrong & His Orch.\tBye And Bye\tDECCA\t3946A\t66987\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1902_038.mp3\tHarry Macdonough And S. H. Dudley\tBye And Bye You Will Forget Me\tVictor\t1329\t\t1902\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3143-A.mp3\tBlind Boy Fuller-sonny Terry\tBye Bye Baby\tOKEH\t5712\tWC3143-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102408.mp3\tCharlie Barnet & His Orchestra\tBye Bye Baby\tBLUEBIRD\t6504\t102408\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC102405-1.mp3\tFats Waller And His Rhythm\tBye Bye Baby\tVICTOR\t25388\t102405-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19732.mp3\tStuff Smith & Onyx Club Boys\tBye Bye Baby\tVOCALION\t3300\t19732\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_227.mp3\tCharlie Barnet And His Orchestra Feat. Barnet Modernaires\tBye Bye Baby\tBluebird\t6504\t102408\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35354-1.mp3\tGene Austin\tBye Bye Blackbird\tVICTOR\t20044\t35354-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW142177-2.mp3\tLeo Reisman & His Orchestra\tBye Bye Blackbird\tCOLUMBIA\t653 D\tW142177-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE18878.mp3\tNick Lucas\tBye Bye Blackbird\tBRUNSWICK\t3184\tE18878\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404433-B.mp3\tFrankie Trumbauer Andhis Orchestra\tBye Bye Blues\tOKeh\t41450\t404433-B\t1930\tvocal Smith Ballew\nhttp://www.jazz-on-line.com/a/mp3c/KIN4349.mp3\tMary Lou Williams\tBye Bye Blues\tKING\t4349\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3164.mp3\tCab Calloway & His Orchestra\tBye Bye Blues\tOKEH\t6084\tWC3164\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC2357-2.mp3\tGene Krupa & His Orchestra\tBye Bye Blues\tBRUNSWICK\t8249\tC2357-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC62685-2.mp3\tHenny Hendrickson's Louisville Serenaders\tBye Bye Blues\tVICTOR\t\t62685-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1090-E157.mp3\tBert Lown And His Biltmore Music\tBye Bye Blues\tHIT OF THE WEEK\t1090\t1090-E157\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/KEY648x.mp3\tArnold Ross Qt\tBye Bye Blues\tKEYNOTE\t648\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D246ABBB.mp3\tGlenn Miller Army Air Force Band\tBye Bye Blues\tV-Disc\t246A\t\t1944-\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_290.mp3\tCab Calloway And His Orchestra\tBye Bye Blues\tOKEH\t6084\tWC3164\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic40080-2.mp3\tBert Howell\tBye Bye Florence\tVictor\t21062\t40080-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480502.mp3\tBenny Goodman Trio\tBye Bye Pretty Baby\tCapitol\t15887\t2500-1\t1947\tBenny Goodman (cl), Tedyy Wilson (p), Jimmy Crawford (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1926_007.mp3\tGene Austin\tBye Bye, Blackbird\tVICTOR\t20044\t35354-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB2189.mp3\tCount Basie & His Orchestra\tBye, Bye, Baby\tRCA\t20-3051\tD7VB2189\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic102405-1.mp3\t\"fats\" Waller And His Rhythm\tBye-bye, Baby\tVictor\t25388\t102405-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480438.mp3\tBen Webster And Oscar Peterson\tBye-bye, Blackbird\tVerve\tMGV8349\t22994-1\t1959\tBen Webster (ts), Oscar Peterson, P Ed Thigpen, D, Ray Brown, B\nhttp://www.jazz-on-line.com/a/mp3h/EDI11853.mp3\tJoe Herlihy And His Orchestra\tBye-bye, Pretty Baby\tEDISON\t52098\t11853\t1927\t\nhttp://www.jazz-on-line.com/a/mp3l/VOC8652.mp3\tLeo Reisman Orchestra\tBygones\tVOCALION\t14314A\t8652\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU061690.mp3\tBarney Bigard And His Orchestra\tC Jam Blues\tBLUEBIRD\t11581\t061690\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC070683-1.mp3\tDuke Ellington Orchestra\tC Jam Blues\tVICTOR\t27856\t070683-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP110.mp3\tSidney Catlett W Hazel Scott\tC Jam Blues\tV-DISC\t068\tVP110\t1943\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480737.mp3\tDuke Ellington And His Famous Orch.\tC Jam Blues\tVictor\t27856\t070683-1\t1942\tWardell Jones (tp), Ray Nance (tp, vn), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Barney Bigard (cl), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (as, bsx), Ben Webster (ts), Duke Ellington (p), Fred Guy (bj), Junior Raglin (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1955_081.mp3\tSarah Vaughan\tC'est La Vie\tMercury\t70727\tYBM11751\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_228.mp3\tSunny Gale\tC'est La Vie\tAbbott\t3012\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_243.mp3\tDejohn Sisters\tC'est La Vie\tEpic\t9131\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76529.mp3\tLouis Armstrong - Sy Oliver\tC'est Si Bon\tDECCA\t27113\t76529\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_085.mp3\tStan Freberg\tC'est Si Bon\tCapitol\t2677\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_268.mp3\tJohnny Desmond Feat. Tony Mottola's Orchestra\tC'est Si Bon (it's So Good)\tMGM\t10377\t49S47\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146291-2.mp3\tPaul Whiteman And His Orchestra\tC-o-n-s-t-a-n-t-i-n-o-p-l-e\tCOLUMBIA\t1402 D\tW146291-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC71197.mp3\tSkeets Tolbert Gentlemen Swing\tC.o.d\tDECCA\t8641B\t71197\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec71197-A.mp3\tSkeets Tolbert And His Orchestra\tC.o.d.\tDecca\t8641\t71197-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480831.mp3\tCarmen Miranda With The M-g-m Studio Orchestra And Chorus\tCa-room-pa-pa\tM-G-M\t30224\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEWC3113.mp3\tChampion Jack Dupree\tCabbage Greens No.1\tOKEH\t5713\tWC3113\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_297.mp3\tCharlie Applewhite With Chorus And Orchestra Conducted By Jack Pleis\tCabbages And Kings\tDECCA\t29001\t85578\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUJC8635.mp3\tBing Crosby W Lennie Hayton\tCabin In The Cotton\tBRUNSWICK\t6329\tJC8635\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC8480.mp3\tCab Calloway & His Orchestra\tCabin In The Cotton\tBRUNSWICK\t6272\tC8480\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban11751-1.mp3\tMills Blue Rhythm Band\tCabin In The Cotton\tBanner\t32445  \t11751-1  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_205.mp3\tCab Calloway And His Orchestra Feat. Bennie Payne\tCabin In The Cotton\tBRUNSWICK\t6272\tC8480\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/BruJC-8480-A.mp3\tCab Calloway And His Orchestra\tCabin In The Cotton\tBrunswick\t6272\tJC-8480-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS29033.mp3\tEthel Waters\tCabin In The Sky\tCBS\tLMS311\t29033\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057718-1.mp3\tVaughn Monroe & His Orchestra\tCabin In The Sky\tBLUEBIRD\t10966A\t057718-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68330.mp3\tElla Fitzgerald & Her Orchestra\tCabin In The Sky\tDECCA\t3490A\t68330\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_130.mp3\tBenny Goodman And His Orchestra Feat. Helen Forrest\tCabin In The Sky\tCOLUMBIA\t35869\t29178\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC13730-1.mp3\tWill Batts (jack Kelly)\tCadillac Baby\tARC\tVO2542z\t13730-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480829.mp3\tCarmen Miranda And The Bando Da Lua\tCae-cae\tDECCA\t23211-A\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67651.mp3\tLouis Armstrong & His Orch.\tCain And Abel\tDECCA\t3204B\t67651\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU07221-1.mp3\tHackberry Ramblers\tCajun Crawl\tBLUEBIRD\t2013\t07221-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW140585-2.mp3\tBessie Smith\tCake Walkin' Babies\tCOLUMBIA\t35673\tW140585-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17130H-.mp3\tThe Dutch Swing College Band\tCake Walkin' Babies Back Home\tPhilips\tP17130H\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3o/JAZ5y.mp3\tLu Watters's Yerba Buena Jazz B\tCake Walking Babies\tJazz Man\t5\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO36.mp3\tBurt Bales And The Gin Bottle 3\tCakewalkin' Babies\tGood Time Jazz\t36\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE73083.mp3\tClarence Williams Blue Five\tCakewalking Babies\tOKeh\t40321\t73083\t1925\t\nhttp://www.78-tours.net/mp3/VIC7138.mp3\tRay Ventura Et Son Orchestre\tCaldona\tVICTORY\t9050\t7138\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO34357.mp3\tWoody Herman And His Herd\tCaldonia\tCOLUMBIA\t36789\tCO34357\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC8670x.mp3\tLouis Jordan Tympani 5\tCaldonia\tDECCA\t8670\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_170.mp3\tErskine Hawkins And His Orchestra\tCaldonia\tVictor\t1659\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT512.mp3\tLouis Prima & His Orchestra\tCaldonia (v L P)\tMAJESTIC\t7134\tT512\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BRO11116-A.mp3\tCalifornia Ramblers\tCalifornia\tBroadway\t11116-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18890.mp3\tClub Royal Orchestra\tCalifornia\tVictor\t18890\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_043.mp3\tIrving Kaufman\tCalifornia And You\tVICTOR\t17613\t14721-1\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11101.mp3\tAbe Lyman & His Orchestra\tCalifornia Blues\tBRUNSWICK\t2530\t11101\t1923\t\nhttp://www.jazz-on-line.com/mp3/959256172.mp3\tCliff Edwards\tCalifornia Here I Come\tSILVERTONE\t1240\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152354.mp3\tClaude Hopkins & His Orchestra\tCalifornia Here I Come\tCOLUMBIA\t2741\tW152354\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COM23707.mp3\tEddie Condon & His Band\tCalifornia Here I Come\tCOMMODORE\t515\t23707\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/COL81491-2.mp3\tCalifornia Ramblers\tCalifornia Here I Come\tCOLUMBIA\t67D\t81491-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC46936-2.mp3\tNat Shilkret And His Orchestra\tCalifornia Here I Come (v3)\tVICTOR\t21673\t46936-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC54586-2.mp3\tPaul Howard Quality Serenaders\tCalifornia Swing\tVICTOR\t23354\t54586-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC27.mp3\tAl Jolson Acc Isham Jones Orchestra\tCalifornia, Here I Come\tBRUNSWICK\t2569\tC27\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_118.mp3\tCalifornia Ramblers\tCalifornia, Here I Come\tCOLUMBIA\t67D\t81491-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic20-3258-B.mp3\tSpade Cooley\tCall Me Darlin' Do\tVictor\t20-3258-B\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051522.mp3\tEarl Hines & His Orchestra\tCall Me Happy\tBLUEBIRD\t10835\t051522\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu051522-1.mp3\tEarl Hines And His Orchestra\tCall Me Happy\tBluebird\tB-10835\t051522-1\t1940\tWalter Fuller (tp,vcl) Shirley Clay, Ed Sims (tp) George Dixon (tp,as) Ed Burke, John Ewing, Joe McLewis (tb) Omer Simeon (cl,bar) Leroy Harris (as,vcl) Jimmy Mundy (ts,arr) Robert Crowder (ts) Earl Hines (p) Claude Roberts (g) Quinn Wilson (b) Alvin Burroughs (d) Billy Eckstine, Leroy Harris (vcl) Buster Harding, Edgar Battle (arr)\nhttp://www.jazz-on-line.com/a/mp3w/1910_007.mp3\tAda Jones And American Quartet\tCall Me Up Some Rainy Afternoon\tVictor\t16508\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3a/COL4523.mp3\tAda Jones (soprano)\tCall Me Up Some Rainy Sunday Afternoon\tCOLUMBIA\tA-0855\t4523\t1910\t\nhttp://www.jazz-on-line.com/a/mp3a/VICB8912-3.mp3\tAmerican Qt And Victor Orch.\tCall Me Up Some Sunny Sunday Afternoon\tVICTOR\t16508B\tB8912-3\t1910\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC051874.mp3\tTommy Dorsey And His Orchestra\tCall Of The Canyon\tVICTOR\t26678\t051874\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB16445.mp3\tBuster Bailey+7 Chocolates\tCall Of The Delta\tCOLUMBIA\t35677\tB16445\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/Blu48333-2.mp3\tKing Oliver And His Orchestra\tCall Of The Freaks\tBluebird\tB-6546\t48333-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69850.mp3\tKing Cole Trio\tCall The Police\tDECCA\t60151\t69850\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/MajT-1102.mp3\tJimmie Lunceford And His Orchestra\tCall The Police\tMajestic\t1122\tT-1102\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_103.mp3\tVic Damone Feat. George Bassman's Orchestra\tCalla Calla\tMERCURY\t5698\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC39738.mp3\tAlfred Karnes\tCalled To A Foreign Field\tVICTOR\t40327\t39738\t\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-20296-1.mp3\tMills Blue Rhythm Band\tCallin' Your Stuff\tColumbia\t3162-D\tCO-20296-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE21982.mp3\tHarry Reser\tCalling\tBRUNSWICK\t3485\tE21982\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE27295.mp3\tCab Calloway & His Orchestra\tCalling All Bars\tOKEH\t5731\t27295\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_048.mp3\tJohn Mccormack\tCalling Me Home To You\tVictor\t64803\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM48S23.mp3\tHank Williams\tCalling You\tMGM\t11628\t48S23\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63604.mp3\tWoody Herman & His Orchestra\tCalliope Blues\tDECCA\t1879B\t63604\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_007.mp3\tArthur Collins And Byron Harlan\tCamp Meetin' Time\tCOLUMBIA\tA-0272\t03513\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_099.mp3\tArthur Collins And Byron Harlan\tCamp Meeting Band\tVictor\t17537\t14360-1\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81303-2.mp3\tKing Oliver's Creole Jazz Band\tCamp Meeting Blues\tCOLUMBIA\t14003 D\t81303-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/Col81303-2.mp3\tKing Oliver's Jazz Band\tCamp Meeting Blues\tColumbia\t14003-D\t81303-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/VarM-548-1.mp3\tLucky Millinder With Mills Blue Rhythm Band\tCamp Meeting Jambroree\tVariety\t624\tM-548-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/COL3513.mp3\tArthur Collins And Byron Harlan\tCamp Meeting Time\tCOLUMBIA\tA-0272\t3513\t1906\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4166.mp3\tDinah Shore\tCan Anyone Explain\tCOLUMBIA\t38927\tHCO4166\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_049.mp3\tRay Anthony Feat. Ronnie Deauville And The Skyliners\tCan Anyone Explain\tCapitol\t1131\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76751.mp3\tLouis Armstrong-e.fitzgerald\tCan Anyone Explain?\tDECCA\t27209\t76751\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_275.mp3\tVic Damone Feat. Ralph Martiere's Orchestra\tCan Anyone Explain? (no! No! No!)\tMERCURY\t5474\t3649-3\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_308.mp3\tLarry Green And His Orchestra\tCan Anyone Explain? (no! No! No!)\tRCA Victor\t3902\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_047.mp3\tAmes Brothers, The Feat. Roy Ross Orchestra\tCan Anyone Explain? (no, No, No!)\tCORAL\t60253\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_326.mp3\tElla Fitzgerald And Louis Armstrong Feat. Bob Haggart's Orchestra\tCan Anyone Explain? (no, No, No)\tDECCA\t27209\t76751\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_326.mp3\tElla Fitzgerald And Louis Armstrong Feat. Bob Haggart's Orchestra\tCan Anyone Explain? (no, No, No)\tDECCA\t27209\t76751\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA939-A.mp3\tBing Crosby - John S Trotter\tCan I Forget You\tDECCA\t1462\tDLA939-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM569.mp3\tBilly Kyle Swing Band\tCan I Forget You\tVARIETY\tI617\tM569\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_221.mp3\tHenry Allen And His Orchestra\tCan I Forget You\tVOCALION\t3690\t21633-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA939-A.mp3\tJohn Scott Trotter And His Orchestra\tCan I Forget You?\tDecca\t\tDLA939-A  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/DECEFF707-1C-2.mp3\tTed Heath And His Music\tCan I Forget You?\tDECCA-LONDON\tEFF.707-1C-2 (BEP 62\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480830.mp3\tTed Heath And His Music\tCan I Forget You?\tDECCA-LONDON\tEFF.707-1C-2\t\t1954\tBobby Pratt, Duncan Campbell,Eddie Blair, Bert Ezard (tp) Don Lusher, Jimmy Coombes, Ric Kennedy, Maurice Pratt (tb) Les Gilbert, Roy Willox (as) Henry Mackenzie (ts,cl) Danny Moss (ts) George Hunter (bar) Frank Horrox (p) Johnny Hawksworth (b) Ronnie Verrell (d) Ted Heath (dir)\nhttp://www.jazz-on-line.com/a/mp3w/1939_109.mp3\tBob Crosby And His Orchestra Feat. V/bob Crosby\tCan I Help It?\tDECCA\t2776B\t66539\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042781.mp3\tGlenn Miller & His Orchestra\tCan I Help It? (vre)\tBLUEBIRD\t10448\t042781\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC50523-2.mp3\tKing Oliver & His Orchestra\tCan I Tell You?\tVICTOR\t38049\t50523-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COL17472-2.mp3\tCarter Family\tCan The Circle Be Unbroken\tCOLUMBIA\t20268\t17472-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_241.mp3\tCarter Family\tCan The Circle Be Unbroken (bye And Bye)\tBANNER\t33465\t17472-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66532.mp3\tWoody Herman & His Orchestra\tCan This Be Love?\tDECCA\t3081B\t66532\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_117.mp3\tArden-ohman Orchestra Feat. V/frank Luther\tCan This Be Love?\tVICTOR\t22552\t64305-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_115.mp3\tTony Bennett\tCan You Find It In Your Heart\tColumbia\t40667\tCO54245\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1275.mp3\tKing Cole Trio\tCan You Look Me In The Eyes\tCAPITOL\t\t1275\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc138330-1.mp3\tFletcher Henderson And His Orchestra\tCan You Take It \tVocalion\t2583\t138330-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22443-2.mp3\tBilly Murray\tCan You Tame Wild Women\tVICTOR\t18515\t22443-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151740-1.mp3\tHenderson,rosa\tCan't Be Bothered With No Sheik\tCOLUMBIA\t14627 D\tW151740-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2045.mp3\tBing Crosby\tCan't Get Indiana Off My Mind\tDECCA\t3321A\tDLA2045\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_166.mp3\tBing Crosby\tCan't Get Indiana Off My Mind\tDECCA\t3321A\tDLA2045\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43827.mp3\tSarah Vaughan\tCan't Get Out Of This Mood\tCOLUMBIA\t38898\tCO43827\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_085.mp3\tKay Kyser And His Orchestra\tCan't Get Out Of This Mood\tCOLUMBIA\t36657\tHCO897\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_184.mp3\tJohnny Long And His Orchestra\tCan't Get Out Of This Mood\tDecca\t4369\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh126.mp3\tCarroll Gibbons And The Savoy Hotel Orpheans\tCan't Get Out Of This Mood (v Edna Kaye)\tColumbia\tFB-2908\tCA-19184-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC42442-1.mp3\tHelen Morgan, Orchestra Of Victor Baravalli\tCan't Help Lovin' Dat Man\tVICTOR\t21238\t42442-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145641-2.mp3\tAunt Jemima\tCan't Help Lovin' Dat Man\tCOLUMBIA\t1304 D\tW145641-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB29.mp3\tArtie Shaw And His Orchestra\tCan't Help Lovin' Dat Man\tRCA\t20-1931\tD5VB29\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2612.mp3\tElla Fitzgerald & Her Orchestra\tCan't Help Lovin' Dat Man\tDECCA\t18421B\tDLA2612\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU066879-1.mp3\tUna Mae Carlisle\tCan't Help Lovin' Dat Man\tBLUEBIRD\t11257\t066879-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC017769.mp3\tBunny Berigan & His Orchestra\tCan't Help Lovin' Dat Man\tVICTOR\t26152B\t017769\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/OKe402152-B.mp3\tBud Freeman And His Orch\tCan't Help Lovin' Dat Man\tOKeh\t41168\t402152-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_078.mp3\tHelen Morgan\tCan't Help Lovin' Dat Man\tVICTOR\t25248\t42442-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_212.mp3\tBen Bernie And His Orchestra V Vaughn Deleath\tCan't Help Lovin' Dat Man\tBRUNSWICK\t3808\tE26281\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE26281.mp3\tBen Bernie & His Orchestra\tCan't Help Lovin' Dat Man (v V Del)\tBRUNSWICK\t3808\tE26281\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_264.mp3\tAmes Brothers Feat. O/ray Bloch\tCan't I?\tCORAL\t60926\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_121.mp3\tNat ''king'' Cole Feat. Billy May's Orchestra\tCan't I?\tCAPITOL\t2389\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh207.mp3\tPeatie Wheatstraw \tCan't See Blues\tJohnW\t207\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC015536.mp3\tBenny Goodman And His Orchestra\tCan't Teach My Heart New Tricks\tVICTOR\t25711\t015536\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_238.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tCan't Teach My Old Heart New Tricks\tVICTOR\t25711\t015536\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26998.mp3\tJohn Kirby & His Orchestra\tCan't We Be Friends\tCOLUMBIA\t35920\t26998\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1065-A.mp3\tBob Crosby & His Bobcats\tCan't We Be Friends?\tDECCA\t1680\tDLA1065-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE30533-B.mp3\tRed Nichols & His Orchestra\tCan't We Be Friends?\tBRUNSWICK\t4510\tE30533-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT1420.mp3\tMildred Bailey\tCan't We Be Friends?\tMAJESTIC\t1209\tT1420\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/Pol28126kp.mp3\tSam Wooding's Chocolate Kiddies\tCan't We Be Friends?\tPolydor\t22994\t28126kp\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1358-1.mp3\tJack Teagarden & His Orchestra\tCan't We Talk It Over\tVARSITY\t8218\tUS1358-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC27115x.mp3\tAndrews Sisters\tCan't We Talk It Over\tDECCA\t27115\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUE37474.mp3\tBing Crosby\tCan't We Talk It Over?\tBRUNSWICK\t6240\tE37474\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_240.mp3\tAndrews Sisters Feat. Gordon Jenkins And His Orchestra\tCan't We Talk It Over?\tDECCA\t27115\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO41835.mp3\tBill Monroe Bluegrass Boys\tCan't You Hear Me Calling\tCOLUMBIA\t20676\tCO41835\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_044.mp3\tGeorge Macfarlane\tCan't You Hear Me Calling, Caroline?\tVICTOR\t60123\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_111.mp3\tJimmy Dorsey And His Orchestra Feat. V/jean Cromwell\tCan't You Read Between The Lines?\tDECCA\t18676A\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70612-1.mp3\tPaul Whiteman & His Orchestra\tCan't You See (vmb)\tVICTOR\t22828B\t70612-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUE37163.mp3\tCasa Loma Orchestra\tCan't You See?\tBRUNSWICK\t6187\tE37163\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26418.mp3\tBenny Goodman & His Orchestra\tCan't You Tell?\tCOLUMBIA\t35543\t26418-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3821.mp3\tDoris Day\tCanadian Capers\tCOLUMBIA\t38595\tHCO3821\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152353.mp3\tClaude Hopkins & His Orchestra\tCanadian Capers\tCOLUMBIA\t2747 D\tW152353\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC3529A.mp3\tHarry Roy & His Orchestra\tCanadian Capers\tDECCA\t3529A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011361-2.mp3\tTommy Dorsey & His Orchestra\tCanadian Capers\tVICTOR\t25887\t011361-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC25634-3.mp3\tPaul Whiteman & His Orchestra\tCanadian Capers\tVICTOR\t18824A\t25634-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3e/Col152353-1.mp3\tClaude Hopkins And His Orchestra\tCanadian Capers\tColumbia\t2747-D\t152353-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_140.mp3\tDoris Day Feat. John Rarig's Orchestra\tCanadian Capers (cuttin' Capers)\tCOLUMBIA\t38595\tHCO3821\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_022.mp3\tHugo Winterhalter And His Orchestra With Eddie Heywood\tCanadian Sunset\tRCA Victor\t6537 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_049.mp3\tAndy Williams\tCanadian Sunset\tCadence\t1297\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17181H.mp3\tThe Dutch Swing College Band\tCanal Street Blues\tPhilips\tP17181H\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3o/GENG11384-B.mp3\tKing Oliver's Creole Jazz Band\tCanal Street Blues\tGENNETT\t5133B\t11384-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/Gen11384-B.mp3\tKing Oliver's Creole Jazz Band\tCanal Street Blues\tGennett\t5133\t11384-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC030171.mp3\tBunny Berigan And His Orchestra\tCandlelights\tVICTOR\t26122B\t030171\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COMP23989.mp3\tJess Stacy\tCandlelights\tCOMMODORE\t517\tP23989\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/Cap509.mp3\tJohnny Mercer, Jo Stafford And P\tCandy\tCapitol\t183\t509\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CAPjmc.mp3\tJohnny Mercer\tCandy\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_096.mp3\tJohnny Long And His Orchestra\tCandy\tDecca\t18661\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480703.mp3\tNat King Cole\tCandy\tCapitol\tEMS-1103\t15789-8\t1956\tNat King Cole, P & Vocal, Harry ''Sweets'' Edison, T, John Collins, G, Charlie Harris, B, Lee Young, D\nhttp://www.jazz-on-line.com/a/mp3e/COLCO42791.mp3\tArthur Godfrey\tCandy And Cake\tCOLUMBIA\t38763\tCO42791\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_173.mp3\tArthur Godfrey\tCandy And Cake\tCOLUMBIA\t38721\tCO42791\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_130.mp3\tMindy Carson\tCandy And Cake\tRCA VICTOR\t3204\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO40379.mp3\tGeorge Morgan\tCandy Kisses\tCOLUMBIA\t20547\tCO40379\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_196.mp3\tEddy Howard And His Orchestra\tCandy Kisses\tMERCURY\t5272\t2571-3\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe80363-B.mp3\tClarence Williams Washboard 4\tCandy Lips\tOKeh\t8440\t80363-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_140.mp3\tDoris Day And Johnnie Ray Feat. Paul Weston's Orchestra\tCandy Lips\tCOLUMBIA\t40001\tRHCO10366\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401483-B.mp3\tMississippi John Hurt\tCandy Man Blues\tOKeh\t8654\t401483-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_260.mp3\tToni Harper And East Beale Sextet\tCandy Store Blues\tCOLUMBIA\t38229\tHCO3050\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45462-2.mp3\tTommy Johnson\tCanned Heat Blues\tVICTOR\t38535\t45462-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU37258-1.mp3\tMorton's Red Hot Peppers\tCannon Ball Blues\tBLUEBIRD\t10254A\t37258-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic37258-2.mp3\tJelly-roll Morton's Red Hot Peppers\tCannon Ball Blues\tVictor\t20431\t37258-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76207.mp3\tLionel Hampton's Orchestra\tCannonball Express\tDECCA\t27041\t76207\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec76207.mp3\tLionel Hampton And His Orchestra\tCannonball Express\tDecca\t27041\t76207\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOEA1481.mp3\tPaul Robeson (bass)\tCanoe Song (\"sanders Of The River\")\tVICTOR\t25107A\tOEA1481\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT392.mp3\tPat Flowers Trio\tCanteen Honky Tonk Boogie\tMAJESTIC\t1012\tT392\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D43A.mp3\tHarry James & His Orchestra\tCaprice Viennois\tv-disk\t43A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D304A.mp3\tFritz Kreisler, Violinist\tCaprice Viennois (kreisler)\tV-DISC\t304A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO31390.mp3\tBenny Goodman And His Orchestra\tCaprice Xxiv Paganini\tCOLUMBIA\t36411\tCO31390-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D388B1.mp3\tNew Friends Of Rhythm\tCapriciousness #24\tV-DISC\t388B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP58785.mp3\tElla Mae Morse\tCaptain Kidd\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_232.mp3\tElla Mae Morse\tCaptain Kidd\tCapitol\t193\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149312.mp3\tTom Darby & Jimmie Tarlton\tCaptain Won't You Let Me Go Home\tCOLUMBIA\t15528 D\tW149312\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1148.mp3\tTed Daffan's Texans\tCar Hop's Blues\tOKEH\t6452\tDAL1148\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLM470.mp3\tDuke Ellington And His Orchestra\tCaravan\tCOLUMBIA\t36120\tM470\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S2.mp3\tBilly Eckstine\tCaravan\tMGM\t10368\t49S2\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/SONSEC4876.mp3\tValaida\tCaravan\tSONORA\t3557\tSEC4876\t1939\t\nhttp://www.78-tours.net/mp3/VIC25653-A.mp3\tBunny Berigan And His Orchestra Featuring B. Berigan, S. Lipkins, I. Goodman, Trumptes-a. George, S.\tCaravan\tVICTOR\t25653\t25653-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63830.mp3\tMills Brothers\tCaravan\tDECCA\t1876B\t63830\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4793.mp3\tEdmond Hall & His Qt\tCaravan\tCOMMODORE\t557\t4793\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74916.mp3\tSy Oliver & His Orchestra\tCaravan\tDECCA\t24653\t74916\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62217.mp3\tEdgar Hayes & His Orchestra\tCaravan\tDECCA\t1338\t62217\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/VARLO373-1-2.mp3\tBarney Bigard Jazzopators\tCaravan\tVARIETY\tI515\tLO373-1-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Son4876-SEC.mp3\tValaida Acc. By Lulle Ellbojs Orkester\tCaravan \tSonora\t3557\t4876-SEC\t1939\tValaida Snow t v acc. by Sven Arefeldt dir. Bengt Artander Gunnar Green t, Sture Green tb, Gunnar Wallberg Rune ''Lulle'' Ellboj as, Rudolf Eriksson ts, Willard Ringstrand p, Karl L?rh g, Roland Bengtsson b, Olle Sahlin d\nhttp://www.jazz-on-line.com/a/mp3d/VarLO-373-1.mp3\tBarney Bigard And His Jazzopaters\tCaravan\tVariety\t515\tLO-373-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_060.mp3\tDuke Ellington And His Famous Orchestra\tCaravan\tMASTER\t131\tM470\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_280.mp3\tBilly Eckstine Feat. Hugo Winterhalter's Orchestra\tCaravan\tMGM\t10368\t49S2\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_360.mp3\tEsquire Boys\tCaravan\tRainbow\t188\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480468.mp3\tNat King Cole\tCaravan\tCapitol\tEAP3\t15920-5\t1957\tNat King Cole, P & Vocal, acc. by Juan Tizol (vtb), John Collins (g), Charlie Harris (sb), Lee Young (dm), Jack Costanzo (bgo, cga)\nhttp://www.jazz-on-line.com/a/mp3a/MER2542.mp3\tCharlie Parker And His Orchestra\tCardboard\tMERCURY\t11022\t2542\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU043391.mp3\tGlenn Miller And His Orchestra\tCareless\tBLUEBIRD\t10520\t043391\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67028.mp3\tWoody Herman & His Orchestra\tCareless\tDECCA\t2955A\t67028\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83951.mp3\tElla Fitzgerald\tCareless\tDECCA\t28671\t83951\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15379x.mp3\tMel Torme\tCareless Hands\tCAPITOL\t15379\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4940.mp3\tBing Crosby & Ken Darby Choir\tCareless Hands\tDECCA\t24616\tL4940\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_015.mp3\tMel Torme\tCareless Hands\tCAPITOL\t15379\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA3595y.mp3\tSammy Kaye\tCareless Kisses\tRCA\t20-3595\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU018755.mp3\tDelmore Brothers\tCareless Love\tBLUEBIRD\t7436\t018755\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW140626-1.mp3\tBessie Smith\tCareless Love\tCOLUMBIA\t14083 D\tW140626-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS21822-1.mp3\tSmith,bessie\tCareless Love\tCBS\tCO3172\t21822-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68395.mp3\tBig Joe Turner\tCareless Love\tDECCA\t7827\t68395\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/OKe08907-A.mp3\tOrig.tuxedo Orch (celestin)\tCareless Love\tOKeh\t8198A\t08907-A\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1938_0302_03.mp3\tLee Morse\tCareless Love\tDecca\t1737A\t63364\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW140626-1.mp3\tBessie Smith\tCareless Love Blues\tCOLUMBIA\t3172 D\tW140626-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17216H-.mp3\tThe Dutch Swing College Band\tCareless Love Blues\tPhilips\tP17216H\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_064.mp3\tBessie Smith\tCareless Love Blues\tCOLUMBIA\t3172 D\tW140626-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20911-3.mp3\tTeddy Wilson And His Orchestra\tCarelessly\tBrunswick\t7867\tB-20911-3\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC35704C.mp3\tPaul Whiteman\tCaresses\tVICTOR\t35704\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_241.mp3\tJohnny Marvin And Ed Smalle\tCaressing You\tVictor\t21892\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152698.mp3\tEnrique Madriguera And His Orchestra\tCarioca\tCOLUMBIA\t2885 D\tW152698\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031827.mp3\tArtie Shaw And His Orchestra\tCarioca\tBLUEBIRD\t10124\t031827-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82234.mp3\tColeman Hawkins & His Orchestra\tCarioca\tDECCA\t28216\t82234\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D203B2.mp3\tCurtis Bay Coast Guard Philharmonicas\tCarioca\tV-DISC\t203B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_024.mp3\tHarry Sosnik And His Edgewater Beach Hotel Orchestra\tCarioca\tVictor\t24488\t77169-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_109.mp3\tLes Paul\tCarioca\tCapitol\t2080\t9948\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO33959.mp3\tFrankie Carle & His Orchestra\tCarle Boogie\tCOLUMBIA\t37269\tCO33959\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB4927.mp3\tAlan Turner\tCarmen Toreador Song\tVICTOR\t16521\tB4927\t1907\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC16521.mp3\tAlan Turner\tCarmen Toreador Song\tVICTOR\t16521\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP1538-.mp3\tDuke Ellington & His Orchestra\tCarnegie Blues\tV-DISC\t558\tVP1538\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYCC2.mp3\tBilly Taylor's Big 8\tCarney-val In Rhythm\tKEYNOTE\t615\tCC2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC071709.mp3\tArtie Shaw And His Orchestra\tCarnival\tVICTOR\t27860\t071709-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM774-2.mp3\tDuke Ellington's Famous Orchestra\tCarnival In Caroline\tBRUNSWICK\t8099\tM774-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23957-1.mp3\tHorace Heidt's Musical Knights\tCarnival Of Venice\tCBS\tBR8305\t23957-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D138B2.mp3\tHarry James And His Orchestra\tCarnival Of Venice\tV-DISC\t138B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/CON14763-1.mp3\tAlbert Taylor And His Orchestra\tCarolina\tCONQUEROR\t8350\t14763-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN025CB.mp3\tJames P Johnson\tCarolina Balmoral\tBLUENOTE\tBN025\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE20882-3.mp3\tThe Five Harmaniacs\tCarolina Bound\tBRUNSWICK\t3664\tE20882-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80552-3.mp3\tVan And Schenck\tCarolina In The Morning\tCOLUMBIA\tA-3712\t80552-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4444.mp3\tAl Jolson - Morris Stoloff\tCarolina In The Morning\tDECCA\t24109\tL4444\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU8747.mp3\tMarion Harris\tCarolina In The Morning\tBRUNSWICK\t2329\t8747\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63606.mp3\tWoody Herman & His Orchestra\tCarolina In The Morning\tDECCA\t1839B\t63606\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26789-3.mp3\tPaul Whiteman & His Orchestra\tCarolina In The Morning\tVICTOR\t18962\t26789-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE34109.mp3\tRed Nichols & His 5 Pennies\tCarolina In The Morning\tBRUNSWICK\t6839\tE34109\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-3712.mp3\tVan And Schenck\tCarolina In The Morning\tCOLUMBIA\tA-3712\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_303.mp3\tDanny Winchell\tCarolina In The Morning\tMGM\t11335\t52S250\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_037.mp3\tMarion Harris\tCarolina In The Morning\tBRUNSWICK\t2329\t8747\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_007.mp3\tVan And Schenck\tCarolina In The Morning\tCOLUMBIA\tA-3712\t80552-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_086.mp3\tAmerican Quartet\tCarolina In The Morning\tVictor\t19006\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/VEL1826-Vy.mp3\tFrank Ferera's Hawaiian Trio\tCarolina Moon\tVelvet Tone\t1826-V\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC48447-2.mp3\tGene Austin\tCarolina Moon\tVICTOR\t21833\t48447-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1706.mp3\tVaughn Monroe\tCarolina Moon\tRCA\t20-1706\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147908-3.mp3\tBen Selvin & His Orchestra\tCarolina Moon\tCOLUMBIA\t1719 D\tW147908-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC026897.mp3\tTommy Dorsey & His Orchestra\tCarolina Moon\tVICTOR\t26072\t026897\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26072.mp3\tTommy Dorsey & His Orchestra\tCarolina Moon\tVictor\t26072\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_181.mp3\tNat Shilkret And The Victor Orchestra\tCarolina Moon\tVICTOR\t21847B\t49629-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_003.mp3\tGene Austin Feat. Nat Shilkret And His Orchestra\tCarolina Moon\tVICTOR\t21833\t48447-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/OKeS70260-C.mp3\tJames P Johnson\tCarolina Shout\tOKeh\t4495\tS70260-C\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC063889-2.mp3\tFats Waller (piano Solo)\tCarolina Shout\tVICTOR\t27563\t063889-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOKe4495.mp3\tJames P Johnson\tCarolina Shout\tOKeh\t4495\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_072.mp3\tSterling Trio (henry Burr, Albert Campbell And John Meyer)\tCarolina Sunshine\tColumbia\t2770\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/VICB8328-1.mp3\tBilly Murray\tCarrie\tVICTOR\t16770\tB8328-1\t1909\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC70709-A.mp3\tRaymond Scott And His Orchestra\tCarrier Pigeon\tDECCA\t18422B\t70709-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCA17982.mp3\tCarroll Gibbons\tCarroll Call The Tunes (no. 3) Part 1. Introducing : Oh, Johnny , When You Wish Upon A Star, Walkinn\tCOLUMBIA\tFB 2437\tCA 17982\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCA17983.mp3\tCarroll Gibbons\tCarroll Call The Tunes (no. 3) Part 2. Introducing : Over The Ranbow , My Capri Serenade , A Little\tCOLUMBIA\tFB 2437\tCA 17983\t\t\nhttp://www.jazz-on-line.com/a/mp3a/SINE4KB-6722.mp3\tBack To The Bible Quartet\tCarry Me Back\tSINGSPIRATION\tS-3160\tE4KB-6722\t\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-19688-1.mp3\tMills Blue Rhythm Band\tCarry Me Back To Green Pastures\tColumbia\t3148-D\tCO-19688-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_111.mp3\tHenry Burr And Albert Campbell\tCarry Me Back To My Carolina Home\tVICTOR\t18975\t27049\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC74420x.mp3\tAlma Gluck\tCarry Me Back To Old Virginny\tVICTOR\t74420\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS20388.mp3\tBenny Carter & His Orchestra\tCarry Me Back To Old Virginny\tCBS\t(Reject)\t20388\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec62116-A.mp3\tLouis Armstrong With The Mills Brothers\tCarry Me Back To Old Virginny\tDecca\t1245\t62116-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_005.mp3\tAlma Gluck\tCarry Me Back To Old Virginny\tVICTOR\t74420\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-133-1.mp3\tBenny Carter And His Swing Quintet\tCarry Me Back To Old Virginny\tVocalion\tS-39\tS-133-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4725.mp3\tEddie Heywood\tCarry Me Back To Ole Virginny\tCOMMODORE\t570\t4725\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA1073.mp3\tCharlie Parker\tCarvin' The Bird\tDIAL\t1013\t1073\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA835-A.mp3\tGlen Gray And Casa Loma Orchestra\tCasa Loma Stomp\tDECCA\t1412\tDLA835-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE404569-B.mp3\tCasa Loma Orchestra\tCasa Loma Stomp\tOKeh\t41492\t404569-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/ARCB-11856-A.mp3\tCasa Loma Orchestra\tCasa Loma Stomp\tARC\t\tB-11856-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_176.mp3\tGlen Gray And Casa Loma Orchestra\tCasa Loma Stomp\tOKeh\t41492\t404569-B\t1930\tJoe Hostetter, Dub Shoffner, Bobby Jones (tp), Pee Wee Hunt, Billy Rauch (tb), Glen Gray (as, ldr), Ray Eberle (as), Pat Davis (ts), Mel Jenssen (vn), Joe Hall (p), Gene Gifford (bj, g), Stanley Dennis (bb, sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3c/CAP105-A.mp3\tCapitol Jazzmen\tCasanova's Lament (v J T)\tCAPITOL\t\t105-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK8265-1.mp3\tHot Lips Page\tCasavova Cricket\tKING\t15198\tK8265-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65636.mp3\tWoody Herman & His Orchestra\tCasbah Blues\tDECCA\t2582A\t65636\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-162-1.mp3\tTrio De Saxophones Alix Combelle\tCascades\tSwing\t117\tOSW-162-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VICB8686-4.mp3\tAmerican Qt-billy Murray\tCasey Jones\tVICTOR\t16483\tB8686-4\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143785.mp3\tGid Tanner's Skillet Lickers\tCasey Jones\tCOLUMBIA\t15237 D\tW143785\t1927\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic16483.mp3\tAmerican Quartet\tCasey Jones\tVictor\t16483\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_032.mp3\tBilly Murray Feat. American Quartet\tCasey Jones\tVictor\t16483\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_001.mp3\tAmerican Quartet Feat. Billy Murray\tCasey Jones\tVictor\t16483\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_062.mp3\tCollins And Harlan\tCasey Jones (1910)\tCOLUMBIA\tA-0907\t04827\t1910\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic64068-1.mp3\tBlanche Calloway And Her Joy Boys With Andy Kirk\tCasey Jones Blues\tVictor\t22640\t64068-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/BruKC-596.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tCasey Jones Special\tBrunswick\t4653\tKC-596\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA1908.mp3\tMichael Casey\tCasey Taking The Census\tColumbia\tA1908\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068811.mp3\tFats Waller And His Rhythm\tCash For Your Trash\tBLUEBIRD\t11425\t068811\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC72841.mp3\tRoane's Pennsylvanians\tCast Your Sins Away\tVICTOR\t24353\t72841\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24353.mp3\tRoane's Pennsylvanians\tCast Your Sins Away\tVictor\t24353\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047712.mp3\tCharlie Barnet & His Orchestra\tCastle Of Dreams\tBLUEBIRD\t10644\t047712\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/MERC515-3.mp3\tJohnny Hodges & His Orchestra\tCastle Rock\tMERCURY\t89184\tC515-3\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_288.mp3\tJohnny Hodges And His Orchestra\tCastle Rock\tMERCURY\t89184\tC515-3\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_267.mp3\tFontane Sisters Feat. O/norman Leyden\tCastle Rock\tRCA Victor\t4213\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3h/CHA8413-2.mp3\tWillie Creager And His Orchestra\tCat's Kittens\tCHALLENGE\t951\t8413-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/BANCP1098-AHK1-2.mp3\tBlanche Calloway And Her Joy Boys\tCatch On\tBANNER\t33304\tCP-1098-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU022474-1.mp3\tShep Fields Rippling Rhythm\tCathedral In The Pines\tBLUEBIRD\t7553\t022474-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_014.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. Jerry Stewart\tCathedral In The Pines\tBLUEBIRD\t7553\t022474-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYHL16.mp3\tColeman Hawkins Qt\tCattin' At Keynote\tKEYNOTE\t612\tHL16\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400614-A.mp3\tSophie Tucker W Miff Mole\tCause I Feel Low Down\tOKeh\t41058\t400614-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW146608.mp3\tLeo Reisman & His Orchestra\tCause I Feel Low-down\tCOLUMBIA\t1467 D\tW146608\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC06591.mp3\tBunny Berigan & His Orchestra\tCause My Baby Says It's So\tVICTOR\t25562B\t06591\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5528.mp3\tMuggsy Spanier's Dixielanders\tCaution Blues\tMERCURY\t5528\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/Oke402210-C.mp3\tEarl Hines\tCaution Blues\tOkeh\t8832\t402210-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-325-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tCavalerie\tSWING\t183\tOSW-325-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic64544.mp3\tGiovanni Marinelli\tCavalleria Rusticana-siciliana\tVictrola\t64544\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13063-A.mp3\tEarl Hines And His Orchestra\tCavernism\tBrunswick\t6541\t13063-A\t1933\tCharlie Allen, George Dixon, Walter Fuller (tp), Louis Taylor, William Franklin (tb), Darnell Howard (cl, as, vn), Omer Simeon (cl, as, bar), Cecil Irwin (cl, ts), Jimmy Mundy (ts), Earl Hines (p, ldr), Lawrence Dixon (g), Quinn Wilson (bb, sb), Wallace Bishop (dm)\nhttp://www.jazz-on-line.com/a/mp3a/VIC33383-4.mp3\tJack Smith\tCecelia\tVICTOR\t19787\t33383-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_166.mp3\tJohnny Hamp And His Orchestra\tCecelia\tVICTOR\t19756\t33306-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWC2880.mp3\tDick Jurgens And His Orchestra\tCecilia\tCOLUMBIA\t37342\tWC2880\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67338-A.mp3\tBob Crosby & His Orchestra\tCecilia\tDECCA\t3090A\t67338-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0500_05.mp3\tLee Morse\tCecilia\tPerfect\t11586A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478324.mp3\tLes Brown And His Band Of Renown\tCecilia\tCAPITOL\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480832.mp3\tLes Brown And His Band Of Renown\tCecilia\tCAPITOL\tT812\t16353\t1957\tWes Hensel, Don Smith, Mickey McMahan, Bob Styles (tp), Roy Main, Jim Hill, Ray Sims (tb), Stumpy Brown (b-tb), Les Brown (cl,as), Matt Utal, Ralph La Polla (as), Billy Usselton (ts), Abe Aaron (ts,bar), Butch Stone (bar), Norman Pockrandt (p), Vernon Polk (g), Mel Pollan (sb), Lloyd Morales (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1914_033.mp3\tArthur Collins And Byron Harlan\tCelebratin' Day In Tennessee\tEdison\t2314\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3a/COL25688.mp3\tWill Bradley Trio\tCelery Stalks At Midnight\tCOLUMBIA\t35707\t25688\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCON9634.mp3\tLes Brown's Band Of Reknown\tCelery Stalks At Midnight\tCONQUEROR\t9634\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CON29648-1.mp3\tLes Brown's Band Of Reknown\tCelery Stalks At Midnight (vd.day)\tCONQUEROR\t9634\t29648-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC90562.mp3\tMeade Lux Lewis\tCeleste Blues\tDECCA\t3831B\tC90562\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUR3462-A2.mp3\tEdmond Hall Celestial Qt\tCelestial Express\tBLUENOTE\tBN017\tR3462-A2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2175-3.mp3\tBud Powell (piano)\tCelia\tMERCURY\t11046\t2175-3\t1949\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481519.mp3\tCharles Mingus\tCelia\tBethlehem\tBCP6019\tTk 5\t1957\tClarence ?Gene? Shaw (tp), Jimmy Knepper (tb), Shafi Hadi (as), Bill Evans (p), Charles Mingus (sb), Dannie Richmond (dm)\nhttp://www.jazz-on-line.com/a/mp3a/CAP1009-3L.mp3\tAlvino Rey\tCement Mixer\tCAPITOL\t248\t1009-3L\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4113.mp3\tCharlie Barnet And His Orchestra\tCement Mixer\tDECCA\t18862A\tL4113\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/MajT-716.mp3\tJimmie Lunceford And His Orchestra\tCement Mixer\tMajestic\t1045\tT-716\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_186.mp3\tCharlie Barnet And His Orchestra Feat. Art Robey\tCement Mixer (put-ti, Put-ti)\tDECCA\t18862A\tL4113\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_248.mp3\tSlim Gaillard Trio\tCement Mixer (put-ti, Put-ti)\tCadet\t201\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COL81241-3.mp3\tBessie Smith\tCemetery Blues\tCOLUMBIA\t13001 D\t81241-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL122CAB.mp3\tHelen Humes & Her Allstars\tCentral Avenue Boogie\tALLADDIN\t122\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC049676-1.mp3\tLionel Hampton And His Orchestra\tCentral Avenue Breakdown\tVICTOR\t26652B\t049676-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic049676-1.mp3\tLionel Hampton And His Orchestra\tCentral Avenue Breakdown\tVictor\t26652\t049676-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061932.mp3\tOzzie Nelson & His Orchestra\tCentral Avenue Shuffle\tBLUEBIRD\t11543\t061932\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/DECLA2909.mp3\tBob Crosby And His Orchestra\tChain Gang\tDECCA\t15064A\tLA2909\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_420.mp3\tLen Dresslar\tChain Gang\tMercury\t70774\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_094.mp3\tBobby Scott\tChain Gang\tABC\t9658\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27414.mp3\tJoshua White & Carolinians\tChain Gang Boun'\tCOLUMBIA\t35559\t27414\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL35559c.mp3\tJoshua White & Carolinians\tChain Gang Boun'\tCOLUMBIA\t35559\t27414\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL603.mp3\tJoe Turner\tChains Of Love\tATLANTIC\t939\t603\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_318.mp3\tJoe Turner\tChains Of Love\tATLANTIC\t939\t603\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_068.mp3\tPat Boone\tChains Of Love\tDot\t15490\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUWC2576-A.mp3\tGene Krupa & His Orchestra\tChallenger Chop\tBRUNSWICK\t8412\tWC2576-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/PARL1475.mp3\tBlind Blake\tChampagne Charlie\tPARAMOUNT\t13137A\tL1475\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_094.mp3\tGlen Gray And Casa Loma Orchestra\tChampagne Waltz\tBRUNSWICK\t6858\t15010\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4712.mp3\tDeparis Brothers Orchestra\tChange O' Key Boogie\tCOMMODORE\t567\t4712\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64365.mp3\tJimmy Dorsey And His Orch.\tChange Partners\tDECCA\t2002A\t64365\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_023.mp3\tFred Astaire Feat. Ray Noble's Orchestra\tChange Partners\tBRUNSWICK\t8189\tLA1608\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_018.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly\tChange Partners\tDECCA\t2002A\t64365\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09579-3.mp3\tBenny Goodman And His Orchestra\tChanges\tVICTOR\t25634\t09579-3\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC40937-3.mp3\tPaul Whiteman & His Orchestra\tChanges (vbc Tpbix)\tVICTOR\t21103B\t40937-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5635.mp3\tArtie Shaw And His Orchestra\tChanging My Tune\tMUSICRAFT\t412\t5635\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_022.mp3\tPatti Page\tChanging Partners\tMERCURY\t70260\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_045.mp3\tKay Starr\tChanging Partners\tCapitol\t2657\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_117.mp3\tEnrico Caruso\tChanson De Juin (song Of June)\tVictor\t88579\t\t1917\t\nhttp://www.78-tours.net/mp3/COLL2031.mp3\tJean Sorbier\tChanson Paenne Motif Du Film Sonore \"chanson Paenne\"\tCOLUMBIA\tDF 22\tL 2031\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC28540-8.mp3\tPaul Whiteman & His Orchestra\tChansonette\tVICTOR\t19145\t28540-8\t1923\t\nhttp://www.78-tours.net/mp3/TEL13693.mp3\tYma Sumac With Orchestra\tChant Of The Choosen Maidens\tTELEFUNKEN CAPITOL\t15649-412\tPart. 13.693\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061334.mp3\tFats Waller And His Rhythm\tChant Of The Groove\tBLUEBIRD\t11262\t061334\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU31131.mp3\tRoy Ingraham And His Orchestra\tChant Of The Jungle\tBRUNSWICK\t4586\t31131\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC39472-A.mp3\tCasa Loma Orchestra\tChant Of The Jungle\tDECCA\t463B\t39472-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVan71791.mp3\tVincent Lopez & His Orchestra\tChant Of The Jungle\tVan Dyke\t71791\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_036.mp3\tNat Shilkret And The Victor Orchestra\tChant Of The Jungle\tVICTOR\t22203A\t57514-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403071-C.mp3\tJoe Venuti & His Orch.\tChant Of The Jungle (v S B)\tOKeh\t41320\t403071-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57514-1.mp3\tNat Shilkret & His Orchestra\tChant Of The Jungle (vfm)\tVICTOR\t22203A\t57514-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152217-2.mp3\tHarlan Lattimore & His Orch Don Redman Connie Inn\tChant Of The Weed\tCOLUMBIA\t2675 D\tW152217-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_178.mp3\tDon Redman And His Orchestra\tChant Of The Weed\tBrunswick\t80036 A\tE37225A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Col152217-2.mp3\tHarlan Lattimore And His Connie's Inn Orchestra\tChant Of The Weed\tColumbia\t2675-D\t152217-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Blu045949-1.mp3\tDon Redman And His Orchestra\tChant Of The Weed\tBluebird\tB-10765\t045949-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-37225-A.mp3\tDon Redman And His Orchestra\tChant Of The Weed\tBrunswick\t6211\tE-37225-A  \t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC055070.mp3\tArtie Shaw And His Orchestra\tChantez La Bas\tVICTOR\t27354\t055070-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055070-1.mp3\tArtie Shaw And His Orchestra\tChantez-les Bas\tVictor\t27354\t055070-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU058807.mp3\tGlenn Miller And His Orchestra\tChapel In The Valley\tBLUEBIRD\t11029\t058807\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2312.mp3\tBing Crosby & Victor Young\tChapel In The Valley\tDECCA\t3614A\tDLA2312\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYCB322.mp3\tBill Harris Septet\tCharacteristically B.h.\tKEYNOTE\t626\tCB322\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/CAM741y.mp3\tVarsity Eight\tCharleston\tCameo\t741\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19671.mp3\tPaul Whiteman & His Orchestra\tCharleston\tVictor\t19671\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC28729-2.mp3\tArthur Gibbs And His Gang\tCharleston\tVICTOR\t19165B\t28729-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC32576-8.mp3\tPaul Whiteman & His Orchestra\tCharleston\tVICTOR\t19671A\t32576-8\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-17303-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tCharleston\tSWING\t2\tOLA-17303-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiEdi51542-R.mp3\tThe Golden Gate Orchestra\tCharleston\tEdison Diamond Disc\t51542-R\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_012.mp3\tArthur Gibbs And His Gang\tCharleston\tVICTOR\t19165B\t28729-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu58772.mp3\tCharlie Barnet & His Orchestra\tCharleston Alley\tBluebird\t11037B\t58772\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D266A1.mp3\tCharlie Barnet And His Orchestra\tCharleston Alley\tV-DISC\t266A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE17700.mp3\tSix Jumping Jacks\tCharleston Ball\tBRUNSWICK\t3064\tE17700\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Aja31010-1.mp3\tSeven Brown Babies\tCharleston Crazy\tAjax\t17011\t31010-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR142307.mp3\tBluegrass Footwarmers\tCharleston Hound\tHARMONY\t248-H\t142307\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC41640-1.mp3\tCharlie Johnson's Paradise Ten\tCharleston Is The Best Dance After All\tVICTOR\t21491\t41640-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC35764-2.mp3\tThomas Morris 7 Hot Babies\tCharleston Stampede\tVICTOR\t20180\t35764-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_162.mp3\tAndrews Sisters Feat. Russ Morgan Orchestra\tCharley My Boy\tDECCA\t24812\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81878.mp3\tEddie Cantor\tCharley, My Boy\tCOLUMBIA\t182D\t81878\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5570-1-2.mp3\tFletcher Henderson Dance Orchestra\tCharley, My Boy\tBANNER\t1383\t5570-1-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_022.mp3\tEddie Cantor\tCharley, My Boy\tCOLUMBIA\t182D\t81878\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D380B2.mp3\tCharlie Spivak And His Orchestra\tCharlie Horse\tV-DISC\t380B2\t\t\t\nhttp://www.78-tours.net/mp3/DECDR8258.mp3\tCharlie Kunz (piano Solo With Rhytm Accomp)\tCharlie Kunz Piano Medley N. D 72 Intro : \"paper Doll\" \"i Wonder Why \" \"goin' To The Coutry Fair\"\tDECCA\tMG8414\tDR 8258\t\t\nhttp://www.78-tours.net/mp3/DECDR8259.mp3\tCharlie Kunz (piano Solo With Rhytm Accomp)\tCharlie Kunz Piano Medley N. D 72 Intro : \"say A Prayer For The Boys Over Ther\" \"kiss Me\" \"happy Da\tDECCA\tMG8414\tDR 8259\t\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC72840-1.mp3\tWilliam's Cotton Club Orchestra (roane's Pennsylvanians))\tCharlie Two Step\tVICTOR\t24039\t72840-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC055535.mp3\tLionel Hampton & His Orchestra\tCharlie Was A Sailor\tVICTOR\t26739\t055535\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic055535-1.mp3\tLionel Hampton And His Orchestra\tCharlie Was A Sailor\tVictor\t26739\t055535-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC60015-A.mp3\tJimmie Lunceford And His Orchestra\tCharmaine\tDECCA\t628A\t60015-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/LON1020x.mp3\tMantovani\tCharmaine\tLONDON\t1020\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D177B2.mp3\tHarry James And His Orchestra\tCharmaine\tV-DISC\t177B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_130.mp3\tLewis James\tCharmaine\tVICTOR\t20590A\t37724\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_192alt.mp3\tFrankie Carle And His Orchestra\tCharmaine\tCOLUMBIA\t36690\tHCO796\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_367.mp3\tFour Freshmen\tCharmaine\tCapitol\t3292\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_202.mp3\tHarmonicats\tCharmaine\tMERCURY\t5747\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW144324-3.mp3\tGuy Lombardo Royal Canadians\tCharmaine! (w)\tCOLUMBIA\t1048 D\tW144324-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76737.mp3\tLouis Jordan & His Trio\tCharteuse\tDECCA\t27324\t76737\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC064057.mp3\tLionel Hampton & His Orchestra\tChasin' With Chase\tVICTOR\t27529\t064057\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic064057-1.mp3\tLionel Hampton And His Sextet\tChasin' With Chase\tVictor\t27529\t064057-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC38669.mp3\tClaude Hopkins & His Orchestra\tChasing All The Blues Away\tDECCA\t441A\t38669\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39543.mp3\tDorsey Brothers Orch.\tChasing Shadows\tDECCA\t476A\t39543\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39676.mp3\tGeorgia Washboard Stompers\tChasing Shadows\tDECCA\t7097\t39676\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17614-1.mp3\tLouis Prima New Orleans Gang\tChasing Shadows\tBRUNSWICK\t7448\t17614-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77537.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tChasing Shadows\tUltraphone\tAP-1547\tP-77537\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-17614-1.mp3\tLouis Prima And His New Orleans Gang\tChasing Shadows\tBrunswick\t7448\tB-17614-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_011.mp3\tDorsey Brothers Orchestra Feat. Hob Eberle\tChasing Shadows\tDECCA\t476A\t39543\t1935\t\nhttp://www.jazz-on-line.com/mp3/844869971.mp3\tCharlie Parker\tChasing The Bird\tSAVOY\t977\tS3421-3\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC90931-A.mp3\tOriginal St. Louis Crackerjacks\tChasing The Blues Away\tDECCA\t7265\t90931-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/EME42586-3.mp3\tFletcher Henderson & His Orchestra\tChatanooga\tEMERSON\t10744\t42586-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24863x.mp3\tBing Crosby\tChattanooga\tDECCA\t24863\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Eme42586-3.mp3\tFletcher Henderson And His Orchestra\tChattanooga (down In Tennessee)\tEmerson\t10744\t42586-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/AJA31022-1.mp3\tFletcher Henderson Sawin' Six\tChattanooga - Down In Tennessee\tAJAX\tAJX17017\t31022-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145112-1.mp3\tAustin And Lee Allen\tChattanooga Blues\tCOLUMBIA\t14266 D\tW145112-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CON30836-1.mp3\tCab Calloway & His Orchestra\tChattanooga Choo Choo\tCONQUEROR\t9914\t30836-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBluB-11230.mp3\tGlenn Miller & His Orchestra\tChattanooga Choo Choo\tBluebird\tB-11230\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU061245.mp3\tGlenn Miller And His Orchestra\tChattanooga Choo Choo (vtb)\tBLUEBIRD\t11230-B\t061245\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480833.mp3\tCarmen Miranda And The Bando Da Lua\tChattanooga Choo-choo\tDECCA\t23265-A\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC69320.mp3\tAllen Bros\tChattanooga Mama\tVICTOR\t23567\t69320\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC23567.mp3\tAllen Bros\tChattanooga Mama\tVICTOR\t23567\t69320\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/Col81300-3.mp3\tKing Oliver's Jazz Band\tChattanooga Stomp\tColumbia\t13003-D\t81300-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_185.mp3\tBradford And Romano\tChattanoogie Shoe Shine Boy\tRCA Victor\t3208\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_194.mp3\tBill Darnel Feat. Roy Ross' Orchestra\tChattanoogie Shoe Shine Boy\tCoral\t60147\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_007.mp3\tRed Foley\tChattanoogie Shoe Shine Boy\tDECCA\t46205\t75543\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_087.mp3\tPhil Harris\tChattanoogie Shoe Shine Boy\tRCA Victor\t78-3692\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146151-2.mp3\tAllen Bros\tCheat 'em\tCOLUMBIA\t15270 D\tW146151-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol15270-D.mp3\tAllen Brothers\tCheat 'em\tColumbia\t15270-D\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_088.mp3\tBen Bernie And His Orchestra\tCheatin' On Me\tVOCALION\t15027B\tNN648\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044600.mp3\tFats Waller And His Rhythm\tCheatin' On Me\tBLUEBIRD\t10658\t044600\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76396.mp3\tSy Oliver & His Orchestra\tCheatin' On Me\tDECCA\t27315\t76396\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/VOCNN648.mp3\tBen Bernie And His Orchestra\tCheatin' On Me\tVOCALION\t15027B\tNN648\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke23906-1.mp3\tJimmie Lunceford And His Orchestra\tCheatin' On Me\tOkeh\t4582\t23906-1\t1938\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3w/1942_212.mp3\tMerry Macs\tCheatin' On The Sandman\tDECCA\t18361B\tDLA2912\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLSC126.mp3\tHank Penny's Radio Cowboys\tCheatin' On Your Baby\tCOLUMBIA\t37733\tSC126\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78834-2.mp3\tBert Williams\tCheckers\tCOLUMBIA\tA-2877\t78834-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_087.mp3\tPerry Como And Jaye P. Morgan\tChee Chee-oo Chee (sang The Little Bird)\tRCA Victor\t6137\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU17732.mp3\tLeo Reisman And His Orchestra\tCheek To Cheek\tBRUNSWICK\t7486\t17732\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC92564-1.mp3\tEddy Duchin And His Orchestra\tCheek To Cheek\tVICTOR\t25093\t92564-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60030.mp3\tBoswell Sisters\tCheek To Cheek\tDECCA\t574A\t60030\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD9VB601.mp3\tCount Basie & His Orchestra\tCheek To Cheek\tRCA\t20-3449\tD9VB601\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S475.mp3\tEddie Heywood\tCheek To Cheek\tMGM\t30633\t51S475\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39914.mp3\tGuy Lombardo's Royal Canadians\tCheek To Cheek\tDECCA\t549A\t39914\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_147.mp3\tBoswell Sisters\tCheek To Cheek\tDECCA\t574A\t60030\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_001.mp3\tFred Astaire Feat. Leo Reisman Orchestra\tCheek To Cheek\tBRUNSWICK\t7486\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_039.mp3\tEddy Duchin And His Orchestra Feat. Lew Sherwood\tCheek To Cheek\tVICTOR\t25093\t92564-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480531.mp3\tAhmad Jamal\tCheek To Cheek\tArgo\tunissued\t\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3c/ARC17732-1.mp3\tLeo Reisman & His Orchestra\tCheek To Cheek (astaire)\tARC\tBR7486\t17732-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC63178.mp3\tThe High Hatters (dir. Leonard Joy)\tCheerful Little Earful\tVICTOR\t22566\t63178\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151118-2.mp3\tBen Selvin & His Orchestra\tCheerful Little Earful\tCOLUMBIA\t2356 D\tW151118-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh134.mp3\tStan Atkins And His Band\tCheerful Little Earful/rhythm Of The Rain\tDecca\tMW-310\tDR-8702-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3r/RiLin2699.mp3\tSociety Night Club Orchestra\tCheerie-cheerie-be\tLincoln\t2699\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA1072.mp3\tCharlie Parker\tCheers\tDIAL\t1013\t1072\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC061687-2.mp3\tDuke Ellington & His Orchestra\tChelsea Bridge\tVICTOR\t27740\t061687-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC25049-4.mp3\tPaul Whiteman & His Orchestra\tCherie\tVICTOR\t18758\t25049-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE18758.mp3\tBen Bernie & His Orchestra\tCherie I Love You\tBRUNSWICK\t3170\tE18758\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1129.mp3\tFrankie Laine\tCherie, I Love You\tMERCURY\t1178\t1129\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_039.mp3\tBen Bernie And His Orchestra Feat. Paul Hagan And Jack Pettis\tCherie, I Love You\tBRUNSWICK\t3170\tE18758\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_121.mp3\tRoss Gorman And His Orchestra\tCherie, I Love You\tCOLUMBIA\t631 D\tW142101-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038276.mp3\tCharlie Barnet And His Orchestra\tCherokee\tBLUEBIRD\tB-10373-A\t038276\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64979-A.mp3\tCount Basie And His Orchestra\tCherokee\tDECCA\t2406A\t64979-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4560.mp3\tLionel Hampton Sextet\tCherokee\tDECCA\t24430\tL4560\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS59051.mp3\tTeddy Reig W Don Byas Qt\tCherokee\tSAVOY\t609B\tS59051\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2199-1.mp3\tBud Powell Trio\tCherokee\tMERCURY\t2199\t2199-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66914.mp3\tJimmy Dorsey And His Orch.\tCherokee\tDECCA\t2961A\t66914\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D307A1.mp3\tCharlie Barnet And His Orchestra\tCherokee\tV-DISC\t307A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_252.mp3\tCharlie Barnet And His Orchestra\tCherokee\tBLUEBIRD\tB-10373-A\t038276\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480678.mp3\tArt Tatum\tCherokee\tClef\tMG-C-712\t1597-1\t1955\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3b/DEC64780-A.mp3\tCount Basie And His Orchestra\tCherokee Part 2\tDECCA\t2406B\t64780-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64979-A.mp3\tCount Basie And His Orchestra\tCherokee-part I\tDecca\t2406\t64979-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64980-A.mp3\tCount Basie And His Orchestra\tCherokee-part Ii\tDecca\t2406\t64980-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038420.mp3\tErskine Hawkins And His Orchestra\tCherry\tBLUEBIRD\t10540\t038420\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO862.mp3\tHarry James And His Orchestra\tCherry\tCOLUMBIA\t36683\tHCO862\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67530.mp3\tLouis Armstrong And Mills Bros\tCherry\tDECCA\t3180B\t67530\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/BluBN-222-0.mp3\tSammy Benskin Trio\tCherry\tBlue Note\t522\tBN-250-2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_037.mp3\tHarry James And His Orchestra\tCherry\tCAPITOL\t\t14228\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_161.mp3\tErskine Hawkins And His Orchestra\tCherry\tBluebird\t819\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe404765-B.mp3\tMississippi Bracy\tCherry Ball\tOKeh\t8867\t404765-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_107.mp3\tAlan Dale\tCherry Pink (and Apple Blossom White)\tCoral\t61373\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA5965x.mp3\tPerez Prado\tCherry Pink And Apple Blossom White\tRCA\t20-5965\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_001.mp3\tPerez Prado And His Orchestra\tCherry Pink And Apple Blossom White\tRCA Victor\t5965 A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE25023-1.mp3\tJoe Turner\tCherry Red\tOKEH\t6829\t25023-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC25023.mp3\tPete Johnson Boogie Boys\tCherry Red\tVOCALION\t4997\t25023\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MER173-1.mp3\tEddie Cleanhead Vinson Orchestra\tCherry Red Blues\tMERCURY\t8003\t173-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/HITCR355.mp3\tCootie Williams & His Orchestr\tCherry Red Blues (v Eddie Vinson)\tHIT OF THE WEEK\t7084\tCR355\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS3422.mp3\tCharlie Parker All Stars; T Re\tCheryl\tSAVOY\t952B\tS3422\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN950CT.mp3\tZeb Turner\tChew Tobacco Rag\tKING\t950\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_243.mp3\tElla Fitzgerald Feat. Chick Webb Orchestra\tChew, Chew, Chew (your Bubble Gum)\tDECCA\t2389\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65097-A.mp3\tChick Webb And His Orchestra\tChew-chew-chew (your Bubble Gum)\tDecca\t2389\t65097-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic036962-1.mp3\tDon Redman And His Orchestra\tChew-chew-chew (your Bubble Gum)\tVictor\t26258\t036962-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69527.mp3\tBig Joe Turner\tChewed Up Grass\tDECCA\t7868\t69527\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/APOS1173.mp3\tDinah Washington\tChewin' Woman Blues\tAPOLLO\t396\tS1173\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45028-2.mp3\tCarter Family\tChewing Gum\tVICTOR\t21517\t45028-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03389-4.mp3\tBilly Murray (tenor-orch)\tCheyenne\tCOLUMBIA\tA-0319\t03389-4\t1906\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16225.mp3\tDjango Reinhardt - Stan Brenders Et Son Grand Orchestre De Danse\tChez Moi  Six Heures\tRythme\tD5026\t16225\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP59400.mp3\tPeggy Lee - Dave Barbour\tChi-baba Chi-baba\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO37625.mp3\tCharioteers\tChi-baba Chi-baba\tCOLUMBIA\t37384\tCO37625\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_009.mp3\tPerry Como Feat. Lloyd Shaffer's Orchestra And Satisfiers\tChi-baba Chi-baba (my Bambino Go To Sleep)\tRCA\t20-2259\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_176.mp3\tCharioteers\tChi-baba, Chi-baba (my Bambina Go To Sleep)\tCOLUMBIA\t37384\tCO37625\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_125.mp3\tPeggy Lee\tChi-baba, Chi-baba (my Bambino Go To Sleep)\tCapitol\t419\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_330.mp3\tXavier Cugat And His Waldorf-astoria Orchestra Feat. V/lena Romay\tChica, Chica, Boom, Chic\tCOLUMBIA\t35995\t29562\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480834.mp3\tCarmen Miranda And The Bando Da Lua\tChica-chica-boom-chic\tDECCA\t23210-A\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECAM177-2.mp3\tColeman Hawkins & His Orch.\tChicago\tDECCA\t661A\tAM177-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70126.mp3\tMuggsy Spanier & His Orch.\tChicago\tDECCA\t4168A\t70126\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/DECGB6041.mp3\tDuke Ellington & His Orch.\tChicago\tDECCA\t4203B\tGB6041\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-1713-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tChicago\tSWING\t2\tOLA-1713-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_051.mp3\tBen Selvin And His Orchestra\tChicago\tBanner\t1104\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3l/Col80696-3.mp3\tThe Georgians\tChicago (that Toddlin' Town)\tColumbia\tA-3775\t80696-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/SILE12932.mp3\tFletcher Henderson Orchestra\tChicago Blues\tSILVERTONE\t3023\tE12932\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81391-3.mp3\tBessie Smith\tChicago Bound Blues\tCOLUMBIA\t14000 D\t81391-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW80851-C.mp3\tLouis Armstrong's Hot 7\tChicago Breakdown\tCOLUMBIA\t36376\tW80851-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/RoyKJ-46-1.mp3\tMezzrow - Bechet Quintet\tChicago Function (revolutionar\tRoyal Jazz\t707\tKJ-46-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/RoyKJ-45-1.mp3\tMezzrow - Bechet Quintet\tChicago Function (revolutionar\tRoyal Jazz\t707\tKJ-45-1 \t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUGM535.mp3\tAlbert Ammons\tChicago In Mind\tBLUENOTE\t004\tGM535\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/PARP2621.mp3\tLovie Austin Blue Serenaders\tChicago Mess Around\tPARAMOUNT\t12380A\tP2621\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL6820.mp3\tBing Crosby & Bob Hope\tChicago Style\tDECCA\t28513\tL6820\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1280.mp3\tArnett Cobb & His Orchestra\tChick She Ain't Nowhere\tAPOLLO\t784\tR1280\t1947\t\nhttp://www.jazz-on-line.com/a/mp3r/RiMer.mp3\tDick 'two-ton' Baker\tChick-a-biddy-boogie\tMercury\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60230.mp3\tBunny Berigan & His Blue Boys\tChicken And Waffles\tDECCA\t18117\t60230\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN983CB.mp3\tYork Brothers\tChicken Blues\tKING\t983\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC10542-2.mp3\tArthur Collins\tChicken Reel\tVICTOR\t16897A\t10542-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_073.mp3\tArthur Collins\tChicken Reel\tVICTOR\t16897A\t10542-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478325.mp3\tLes Paul\tChicken Reel\tCAPITOL\t\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT829.mp3\tSlim Gaillard Orchestra\tChicken Rhythm\tMAJESTIC\t9005\tT829\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74727.mp3\tLionel Hampton Sextet\tChicken Shack Boogie\tDECCA\t24574\t74727\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec74727.mp3\tLionel Hampton And His Orchestra\tChicken Shack Boogie\tDecca\t24574\t74727\t1949\tBenny Bailey-Duke Garrette-t, Johnny Board-as, Gene Morrists, Albert Ammons-p, Lionel Flampton-vib-p-a-v, Wes Montgomery-g, Roy Johnson-p, Earl Walker-d, Sonny Parker-Betty Carter-v\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35239.mp3\tGene Krupa & His Orchestra\tChickery Chick\tCOLUMBIA\t36877\tCO35239\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_180.mp3\tGeorge Olsen And His Orchestra\tChickery Chick\tMAJESTIC\t7155\tT563\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_131.mp3\tEvelyn Knight\tChickery Chick\tDECCA\t18725A\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_008.mp3\tSammy Kaye And His Orchestra\tChickery Chick\tRCA Victor\t20-1726\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5365.mp3\tGeorgie Auld & His Orchestra\tChickin' Lickin'\tMUSICRAFT\t(MUS-R)\t5365\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68638-A.mp3\tJack Teagarden & His Orchestra\tChicks Is Wonderful\tDECCA\t3701B\t68638-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4574.mp3\tLouis Jordan's Tympani 5\tChicky-mo, Craney-cro\tDECCA\t24673\tL4574\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66592-A.mp3\tAndrews Sisters\tChico's Love Song\tDECCA\t2756B\t66592-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_168.mp3\tAndrews Sisters\tChico's Love Song\tDECCA\t2756B\t66592-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047701-2.mp3\tEarl Hines (piano)\tChild Of A Disordered Brain\tBLUEBIRD\t10642\t047701-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu047701-2.mp3\tEarl Hines And His Orchestra\tChild Of A Disordered Brain\tBluebird\tB-10642\t047701-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79217-1.mp3\tFrank Crumit\tChili Bean\tCOLUMBIA\tA-2952\t79217-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_036.mp3\tFrank Crumit With Paul Biese Trio\tChili Bean\tCOLUMBIA\tA-2952\t79217-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC1321.mp3\tRodney Rogers' Red Peppers\tChili Blues\tBRUNSWICK\t3744\tC1321\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1101-A.mp3\tCab Calloway And His Orchestra\tChili Con Conga\tVocalion\t5315\tWM-1101-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3090.mp3\tElton Britt\tChime Bells\tRCA\t20-3090\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Bla2116j.mp3\tF. H. Henderson\tChime Blues\tBlack Swan\t2116\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO41844.mp3\tJimmy Dorsey Dorseyland Jazz\tChimes Blues\tCOLUMBIA\t38655\tCO41844\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71001.mp3\tJoe Marsala & His Chosen 7\tChimes Blues\tDECCA\t27074\t71001\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/Cen11387-A.mp3\tKing Oliver's Creole Jazz Band\tChimes Blues\tCennett\t5135\t11387-A\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_087.mp3\tPrince's Orchestra\tChin-chin\tColumbia\t5634\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100395-1.mp3\tBenny Goodman Trio\tChina Boy\tVICTOR\t25333-A\t100395-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14848-A.mp3\tFrankie Trumbauer & His Orchestra\tChina Boy\tBRUNSWICK\t6912\t14848-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE82031.mp3\tMckenzie & Condon Chicagoans\tChina Boy\tOKEH\t41011\t82031\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1648.mp3\tMugsy Spanier Vdisc Jazz Band\tChina Boy\tV-DISC\t611\t1648\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO3688.mp3\tTeddy Wilson & His Orchestra\tChina Boy\tCOLUMBIA\t36634\tCCO3688\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE33306A.mp3\tRed Nichols And His Five Pennies\tChina Boy\tBRUNSWICK\t4877\tE33306A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC38503-A.mp3\tIsham Jones And His Orchestra\tChina Boy\tDecca\t443\t38503-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_134.mp3\tBenny Goodman Trio\tChina Boy\tVICTOR\t25333-A\t100395-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_162.mp3\tPaul Whiteman And His Orchestra\tChina Boy\tCOLUMBIA\t1945 D\tW148409-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_186.mp3\tIsham Jones And His Orchestra\tChina Boy\tDecca\t443\t38503-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_188.mp3\tRed Nichols And His Five Pennies\tChina Boy\tBrunswick\t4877\tE33306A\t1930\tRed Nichols, Ruby Weinstein, Charlie Teagarten, trumpets; Jack Teagarten, Glenn Miller, trombones; Benny Goodman, Sid Stoneburn, Babe Russin, reeds; Joe Sullivan, piano; Teg Brown, guitar; Artie Miller, bass; Gene Krupa, drums\nhttp://www.jazz-on-line.com/a/mp3e/TedP-24025-1.mp3\tTeddy Wilson And His Orchestra\tChina Boy\tTeddy Wilson School\t\tP-24025-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480724.mp3\tBenny Goodman Trio\tChina Boy\tColumbia\tSL 160\t\t1938\tCarnegie Hall Concert?:<br>Benny Goodman (cl), Teddy Wilson (p), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3c/VIC70190.mp3\tGene Kardos & His Orchestra\tChina Boy (v D R)\tVICTOR\t22790\t70190\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07866-1.mp3\tLionel Hampton & His Orchestra\tChina Stomp\tVICTOR\t25586A\t07866-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_280.mp3\tLionel Hampton And His Orchestra\tChina Stomp\tVICTOR\t25586A\t25586A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic07866-1.mp3\tLionel Hampton And His Orchestra\tChina Stomp\tVictor\t25586\t07866-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1897.mp3\tWillie Lewis & Negro Band\tChinatown\tVARSITY\tEL4072s\t1897\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN11708-A.mp3\tMills Brothers\tChinatown My Chinatown\tBANNER\t33215\t11708-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COL151886.mp3\tLouis Armstrong And His Orchestra\tChinatown My Chinatown\tCOLUMBIA\t2574\t151886\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC15305-2.mp3\tAmerican Qt\tChinatown My Chinatown\tVICTOR\t17684\t15305-2\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22319-5.mp3\tSlim And Slam\tChinatown My Chinatown\tCBS\tVO4021\t22319-5\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9701.mp3\tMilton Brown & His Brownies\tChinatown My Chinatown\tDECCA\t5166B\tC9701\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE29222.mp3\tRed Nichols & His Orchestra\tChinatown My Chinatown\tBRUNSWICK\t4363\tE29222\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU71287-1.mp3\tRoane's Pennsylvanians\tChinatown My Chinatown\tBLUEBIRD\t5645\t71287-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU94511.mp3\tJoe Kennedy & His Orchestra\tChinatown My Chinatown\tBLUEBIRD\t6233\t94511\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru17613-1.mp3\tLouis Prima And His New Orleans Gang\tChinatown My Chinatown\tBrunswick\t7456\t17613-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145505.mp3\tArt Gillam\tChinatown, My Chinatown\tCOLUMBIA\t1619 D\tW145505\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC019428-1.mp3\tTommy Dorsey & His Clambake 7\tChinatown, My Chinatown\tVICTOR\t26023\t019428-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88966-4.mp3\tRay Noble & His Orchestra\tChinatown, My Chinatown\tVICTOR\t25070\t88966-4\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150857-1.mp3\tFletcher Henderson & His Orchestra\tChinatown, My Chinatown\tCOLUMBIA\t2329 D\tW150857-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/COM592CMC.mp3\tJack Teagarden's Swing Gates\tChinatown, My Chinatown\tCOMMODORE\t592\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_050.mp3\tLouis Armstrong And His Orchestra\tChinatown, My Chinatown\tOkeh\t41534\t405059-D\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_211.mp3\tBobby Maxwell And His Swinging Harps\tChinatown, My Chinatown\tMERCURY\t5773\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_009.mp3\tAmerican Quartet\tChinatown, My Chinatown\tVictor\t17384\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_207.mp3\tRay Noble And His Orchestra\tChinatown, My Chinatown\tVictor\t25070\t88966-4\t1935\tfrom the broadway musical \"Up and Down Broadway\"\nhttp://www.jazz-on-line.com/a/mp3w/1932_104.mp3\tMills Brothers\tChinatown, My Chinatown\tBrunswick\t6305\t11708-A\t1932\tfrom the Broadway musical \"Up and Down Broadway\"\nhttp://www.jazz-on-line.com/a/mp3d/Col150857-1.mp3\tFletcher Henderson And His Orchestra\tChinatown, My Chinatown\tColumbia\t2329-D\t150857-1  \t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_325.mp3\tPerry Como\tChincherinchee\tRCA\t6670\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3d/Har141423-3.mp3\tThe Dixie Stompers\tChinese Blues\tHarmony\t92-H\t141423-3  \t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63739-A.mp3\tDick Robertson And His Orchestra\tChinese Laundry Blues\tDECCA\t1847B\t63739-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147750.mp3\tPaul Whiteman & His Orchestra\tChinese Lullaby\tCOLUMBIA\t2656 D\tW147750\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_178.mp3\tPaul Whiteman And His Orchestra\tChinese Lullaby\tCOLUMBIA\t2656 D\tW147750\t1929\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW142178-3.mp3\tLeo Reisman & His Orchestra\tChinese Moon\tCOLUMBIA\t673 D\tW142178-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_146.mp3\tSpike Jones And His City Slickers\tChinese Mule Train\tRCA\t20-3741\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUCP1104.mp3\tCab Calloway & His Orchestra\tChinese Rhythm\tBRUNSWICK\t6992\tCP1104\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_090.mp3\tCab Calloway And His Orchestra\tChinese Rhythm\tBRUNSWICK\t6992\tCP1104\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/BruCP-1104-A.mp3\tCab Calloway And His Orchestra\tChinese Rhythm\tBrunswick\t6992\tCP-1104-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_461.mp3\tBuddy Hackett\tChinese Rock And Egg Roll\tCoral\t61594\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE781.mp3\tJesse Stafford And His Orchestra\tChinnin' And Chattin' With May\tBRUNSWICK\t4822\tLAE781\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COL150198-2.mp3\tFrank Auburn's Orch (albin)\tChinnin' And Chattin' With May\tCOLUMBIA\tHA1161\t150198-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068460.mp3\tGlenn Miller And His Orchestra\tChip Off The Old Block\tBLUEBIRD\t11450-B\t068460\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146335-6.mp3\tPaul Whiteman & His Orchestra\tChiquita\tCOLUMBIA\t1448 D\tW146335-6\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_036.mp3\tPaul Whiteman And His Orchestra\tChiquita\tCOLUMBIA\t1448 D\tW146335-6\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36236.mp3\tGene Krupa & His Orchestra\tChiquita Banana\tCOLUMBIA\t37049\tCO36236\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLBF-106x.mp3\tXavier Cugat And His Waldorf Asto\tChiquita Banana (the Banana\tColumbia\tBF-106\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC2413.mp3\tSweet Violet Boys\tChiselin' Daddy\tVOCALION\t4714\tC2413\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26152.mp3\tSlim & Slam\tChittlin Switch Blues\tCBS\tVO5341\t26152\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73399.mp3\tLucky Millinder And His Orchestra\tChittlin' Switch\tDecca\t18835\t73399\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152465-2.mp3\tClarence Williams Jug Band\tChizzlin' Sam\tCOLUMBIA\t2829 D\tW152465-2\t1933\t\nhttp://www.78-tours.net/mp3/RCA25-5083-B.mp3\tMikey Katz And His Kosher-jammers Mickey Katz, Clarinet, Barrel Gill, Violin, Mendel Klein, Trumpet,\tChlo-e\tRCA VICTOR\t25-5083\t25-5083-B\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83441.mp3\tLouis Armstrong.gordon Jenkins\tChlo-e\tDECCA\t28524\t83441\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_330.mp3\tLouis Armstrong Feat. O/gordon Jenkins\tChlo-e\tDECCA\t28524\t83441\t1953\t\nhttp://www.78-tours.net/mp3/RCA25-5083-A.mp3\tMikey Katz And His Kosher-jammers Mickey Katz, Clarinet, Barrel Gill, Violin, Mendel Klein, Trumpet,\tChlo-e (false)\tRCA VICTOR\t25-5083\t25-5083-A\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC04237.mp3\tBenny Goodman And His Orchestra\tChloe\tVICTOR\t25531\t04237\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC053580.mp3\tDuke Ellington And His Orchestra\tChloe\tVICTOR\t27235A\t053580\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL78743.mp3\tAl Jolson\tChloe\tCOLUMBIA\tA-2861\t78743\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62824-A.mp3\tArt Tatum\tChloe\tDECCA\t2052B\t62824-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC35129C.mp3\tPaul Whiteman\tChloe\tVICTOR\t35129\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S477.mp3\tEddie Heywood\tChloe\tMGM\t30632\t51S477\t\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE26857-A.mp3\tJohn Kirby & His Orchestra\tChloe\tOKEH\t5632\t26857-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_045.mp3\tAl Jolson\tChloe\tCOLUMBIA\tA-2861\t78743\t1920\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-8487-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tChloe \tParlophone\tF-I048\tCE-8487-1\t1937\tValaida Snow t v acc. by Johnny Claes t, Derek Neville as bar, Reggie Dare ts, Gun Finlay p, Norman Brown g, Louis Barreiro b, Ken Stewart d\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-3050-A.mp3\tHorace Henderson And His Orchestra\tChloe\tOKEH\t5632\tWC-3050-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic42529-2.mp3\tShilkret's Rhythm - Melodists\tChloe (song Of The Swamp)\tVictor\t21298\t42529-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480716.mp3\tDuke Ellington And His Famous Orchestra\tChloe (song Of The Swamp)\tVictor\t27235\t053580-1\t1940\tWardell Jones, Cootie Williams (tp), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Barney Bigard (cl), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (cl, as, bsx), Ben Webster (ts), Duke Ellington (p), Fred Guy (g), Jimmy Blanton (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3b/DEC69036.mp3\tJimmie Lunceford & His Orchestra\tChocolate\tDECCA\t3807A\t69036\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69636-A.mp3\tJimmie Lunceford And His Orchestra\tChocolate\tDecca\t3807\t69636-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COL30220CCB.mp3\tHot Lips Page\tChocolate Candy Blues\tCOLUMBIA\t30220\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC061318.mp3\tDuke Ellington & His Orchestra\tChocolate Shake\tVICTOR\t27531\t061318\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_019.mp3\tColumbia Saxophone Sextette\tChong\tCOLUMBIA\tA-2730\t78368-3\t1919\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW150791.mp3\tPaul Whiteman & His Orchestra\tChoo - Choo\tCOLUMBIA\t2491 D\tW150791\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404434-B.mp3\tFrankie Trumbauer & His Orchestra\tChoo Choo\tOKeh\t41450\t404434-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh012.mp3\tJack Payne And His Bbc Dance Orchestra\tChoo Choo\tColumbia\tCB-228\tWA-11190-1, CA-11190\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/BluT-2005-2.mp3\tDuke Ellington's Washingtonians\tChoo Choo\tBlu Disc\tT-1002\tT-2005-2\t1924\tBubber Miley, Trpt, Otto Hardwick, Alto Sax, Charlie Irvis, Trb, Duke Ellington, Pno, Freddy Guy, Bjo, Sonny Greer, Drs\nhttp://www.jazz-on-line.com/a/mp3l/BRU14350.mp3\tGene Rodemich And His Orchestra\tChoo Choo (gotta Hurry Home)\tBRUNSWICK\t2775\t14350\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3w/1953_166.mp3\tDoris Day Feat. Paul Weston's Orchestra\tChoo Choo Train Ch-ch-foo)\tCOLUMBIA\t40063\tRHCO10591\t1953\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24998y.mp3\tAndrews Sisters\tChoo'n Gum\tDecca\t24998\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_181.mp3\tTeresa Brewer Feat. Dixieland All Stars And Jimmy Lytell\tChoo'n Gum\tLONDON\t30100\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/COL41187CB.mp3\tFrankie Laine\tChoombala Bay\tCOLUMBIA\t41187\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23610CCB.mp3\tLouis Jordan\tChooo Chooo Ch Boogie\tDECCA\t23610\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC23610.mp3\tLouis Jordan\tChooo Chooo Ch Boogie\tDECCA-\t23610\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_106b.mp3\tCrew-cuts\tChop Chop Boom\tMercury\t70597\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71826-A.mp3\tLionel Hampton And His Orchestra\tChop, Chop\tDecca\t18613\t71826-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26537-A.mp3\tGene Krupa & His Orchestra\tChop, Chop, Charlie Chan\tCOLUMBIA\t35490\t26537-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-2984-A.mp3\tCab Calloway And His Orchestra\tChop, Chop, Charlie Chan (from China)\tVocalion\t5444\tWM-2984-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/GUIT389-1.mp3\tPat Flowers\tChopin E Minor Waltz\tGUILDE\t1011\tT389-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP9511.mp3\tErroll Garner (piano)\tChopin Impressions\tCOLUMBIA\t39748\tZSP9511\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3766.mp3\tCarmen Cavallaro\tChopin's Polonaise\tDECCA\t18677A\tL3766\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_026.mp3\tCarmen Cavallaro And His Orchestra\tChopin's Polonaise\tDECCA\t18677A\tL3766\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/ColWC-3068-A.mp3\tJimmie Lunceford And His Orchestra\tChopin's Prelude No 7\tColumbia\t35547\tWC-3068-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU022156.mp3\tTune Wranglers\tChopo - Waltz\tBLUEBIRD\t7612\t022156\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_322.mp3\tKay Kyser And His Orchestra\tChopsticks\tCBS\tBR8308\t23999\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D297A.mp3\tXavier Cugat And His Orchestra\tChopsticks Polka\tV-DISC\t297A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73330.mp3\tLionel Hampton Qt\tChord-a-re-bop\tDECCA\t18830B\t73330\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73330-A.mp3\tLionel Hampton And His Quartet\tChord-a-re-bop\tDecca\t18830\t73330-A\t1946\tLionel Hampton vib, Milt Buckner Dan Burley p, Billy Mackel g, Charles Harris b, George Jenkins d\nhttp://www.jazz-on-line.com/a/mp3w/1953_317.mp3\tJo Stafford And Frankie Laine\tChow Willy\tCOLUMBIA\t39893\tHCO10259\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/ColRHCO10259.mp3\tJo Stafford & Frankie Laine W.\tChow, Willy\tColumbia\t39893\tRHCO10259\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-1958-1.mp3\tFletcher Henderson And His Orchestra\tChris And His Gang\tVocalion\t3641\tC-1958-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM442.mp3\tCharlie Barnet & His Orchestra\tChris And His Song\tVARIETY\tI603\tM442\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_274.mp3\tEddie Fisher\tChristmas Day\tRCA Victor\t5038\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_097.mp3\tStan Freberg Feat. Daws Butler\tChristmas Dragnet\tCapitol\t2671\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2420.mp3\tFrank Sinatra\tChristmas Dreaming\tCOLUMBIA\t37809\tHCO2420\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_313.mp3\tFrank Sinatra\tChristmas Dreaming\tCOLUMBIA\t37809\tHCO2420\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/PAR20818-2.mp3\tBlind Lemon Jefferson\tChristmas Eve Blues\tPARAMOUNT\t12692\t20818-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_306.mp3\tPercy Faith And His Orchestra Feat. Shillelagh Singers\tChristmas In Killarney\tCOLUMBIA\t39048\tCO44439\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_193.mp3\tAndrews Sisters Feat. Guy Lombardo Orchestra\tChristmas Island\tDECCA\t23722\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_202.mp3\tLiberace\tChristmas Medley\tCOLUMBIA\t40382\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC82320-1.mp3\tPaul Whiteman & His Orchestra\tChristmas Night In Harlem (vj.mercer)\tVICTOR\t24615\t82320-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-2217-1.mp3\tMichel Warlop Et Son Orchestre (with Django Reinhardt)\tChristmas Swing\tSWING\t13\tOLA-2217-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COL78485.mp3\tAda Jones & Qt\tChristmas Time At Pumkin Center\tCOLUMBIA\tA-2789\t78485\t1919\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03288.mp3\tMr And Mrs Cal Stewart\tChristmas Time At Pumkin Center\tCOLUMBIA\tA-0387\t03288\t1905\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC100058.mp3\tBenny Goodman And His Orchestra\tChristopher Columbus\tVICTOR\t25279\t100058\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60874-A.mp3\tAndy Kirk & Clouds Of Joy\tChristopher Columbus\tDECCA\t729A\t60874-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101190-1.mp3\tFats Waller And His Rhythm\tChristopher Columbus\tVICTOR\t25295B\t101190-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18829-1.mp3\tTeddy Wilson & His Orchestra\tChristopher Columbus\tARC\tBR7640\t18829-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1922.mp3\tWillie Lewis & Negro Band\tChristopher Columbus\tVARSITY\tEL4079s\t1922\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC60911-A.mp3\tBob Crosby & His Orchestra\tChristopher Columbus\tDECCA\t753B\t60911-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25279.mp3\tBenny Goodman & His Orchestra\tChristopher Columbus\tVictor\t25279\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_264.mp3\tGuy Mitchell\tChristopher Columbus\tCOLUMBIA\t39190\tCO45034-1\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_167.mp3\tTeddy Wilson And His Orchestra\tChristopher Columbus\tARC\tBR7640\t18829-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60874-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tChristopher Columbus\tDecca\t729\t60874-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeC-1331-1.mp3\tFletcher Henderson And His Orchestra\tChristopher Columbus\tOkeh\t3211\tC-1331-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_131.mp3\tBenny Goodman And His Orchestra\tChristopher Columbus\tVICTOR\t25279\t100058\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DiaD-1085-B.mp3\tDexter Gordon\tChromatic Aberration\tDial\t204\tD-1085-B\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCMEM-82.mp3\tSwift Jewel Cowboys\tChuck Wagon Swing\tVOCALION\t5133\tMEM-82\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62142.mp3\tClaude Hopkins & His Orchestra\tChurch Street Sobbin' Blues\tDECCA\t1286\t62142\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLDAL514.mp3\tNite Owls\tCielito Lindo\tCOLUMBIA\t20234\tDAL514\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D279B1.mp3\tLarry Clinton And His Orchestra\tCielito Lindo\tV-DISC\t279B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPrin7.mp3\tRed Ingle And Natural 7\tCigareets, Whiskey And Wild Women\tCAPITOL\t\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPri.mp3\tRed Ingle\tCigareets, Whiskey And Wild, Wild Women\tCAPITOL\t\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC24382x.mp3\tDesmond Flo\tCigarettes Cigars\tVICTOR\t24382\tU.K.\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2199.mp3\tSons Of The Pioneers\tCigarettes, Whiskey And Wild Women\tRCA\t20-2199\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP60111.mp3\tRed Ingle & Natural 7\tCigarettes, Whiskey And Wild Women\tCAPITOL\t\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB5186.mp3\tGene Krupa & His Orchestra\tCincinatti Dancing Pig\tRCA\t20-3906\tE0VB5186\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_069.mp3\tRed Foley\tCincinatti Dancing Pig\tDecca\t46261\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1033-2D.mp3\tMerle Travis\tCincinnati Lou\tCAPITOL\t258\t1033-2D\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150009-2.mp3\tThe Charleston Chasers\tCinderella Brown\tCOLUMBIA\t2133 D\tW150009-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152280.mp3\tFrankie Trumbauer & His Orchestra\tCinderella's Wedding Day\tCOLUMBIA\t2897 D\tW152280\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh078.mp3\tBilly Cotton And His Band\tCinderella, Stay In My Arms (v Alan Breeze)\tRex\t9421\tR-3060-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88786.mp3\tFats Waller And His Rhythm\tCinders\tVICTOR\t24898\t88786\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_061.mp3\tVince Martin-tarriers\tCindy Oh Cindy\tGlory\t247\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_063.mp3\tEddie Fisher\tCindy Oh Cindy\tRCA Victor\t6677\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_022.mp3\tArthur Collins\tCindy, I Dreams About You\tGram-o-Phone\t409\t\t1901\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_057.mp3\tTony Bennett\tCinnamon Sinner\tCOLUMBIA\t40272\tCO51438\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D731.mp3\tCount Basie & His Orchestra\tCircus In Rhythm\tV-DISC\t289\t731\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWB24514.mp3\tHarry James And His Orchestra\tCiribiribin\tCOLUMBIA\t37141\tWB24514\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC025900.mp3\tBenny Goodman And His Orchestra\tCiribiribin\tVICTOR\t26087\t025900\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU24514-1.mp3\tHarry James And His Orchestra\tCiribiribin\tBRUNSWICK\t8327\t24514-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66632.mp3\tAndrews Sisters\tCiribiribin\tDECCA\t2800A\t66632\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D138B1.mp3\tHarry James And His Orchestra\tCiribiribin\tV-DISC\t138B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_177alt.mp3\tHarry James And His Orchestra\tCiribiribin\tV-DISC\t138B1\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-24514-1.mp3\tHarry James And His Orchestra\tCiribiribin\tBrunswick\t8327\tB-24514-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_032.mp3\tPrince's Orchestra\tCiribiribin Waltz\tCOLUMBIA\tA-5235\t30547\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC349-1-.mp3\tTom Glazer\tCitizen C.i.o.\tASCH\t349-1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_294.mp3\tShep Fields And His Rippling Rhythm Orchestra\tCity Called Heaven\tBluebird\t11255\t066822\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU066882-1.mp3\tUna Mae Carlisle\tCity Called Heaven\tBLUEBIRD\t11271\t066882-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_151.mp3\tHighlights\tCity Of Angels\tBally\t1016\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18187.mp3\tVictor Concert Orchestra\tCity Of Beautiful Nonesense\tVictor\t18187\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4508.mp3\tDanny Kaye And Andrews Sisters\tCivilization\tDECCA\t23940\tL4508\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_027.mp3\tAndrews Sisters And Danny Kaye\tCivilization (bongo, Bongo, Bongo)\tDECCA\t23940\tL4508\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S265.mp3\tSy Oliver & His Orchestra\tCivilization. (bongo, Bongo, Bongo]\tMGM\t10083A\t47S265\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/VogST-1985.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tClair De Lune\tVogue\tLD668-30\tST-1985\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/DECF10077x.mp3\tTed Heath And His Music\tClair De Lune\tDECCA-LONDON\tF10077x\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480835.mp3\tTed Heath And His Music\tClair De Lune\tDECCA-LONDON\tF10077\t\t1952\tBobby Pratt, Duncan Campbell, Stan Reynolds, Ronnie Hughes (tp), Don Lusher, Jack Bentley, Wally Smith, Jackie Armstrong (tb), Roy Willox, Les Gilbert (as), Danny Moss, Tommy Whittle (ts), George Hunter (bar), Frank Horrox (p), Johnny Hawksworth (sb) , Ronnie Verrell (dm), Ted Heath (ldr)\nhttp://www.jazz-on-line.com/a/mp3c/CAP104-A.mp3\tCapitol Jazzmen\tClambake In B Flat\tCAPITOL\t\t104-A\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20299.mp3\tSteve Porter\tClancey's Wooden Wedding\tVictor\t20299\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_239.mp3\tDennis Day Feat. Charles Dant's Orchestra\tClancy Lowered The Boom\tRCA Victor\t2810\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Har141302-3.mp3\tThe Dixie Stompers\tClap Hands! Here Comes Charley!\tHarmony\t70-H\t141302-3  \t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62068-A.mp3\tChick Webb And His Orchestra\tClap Hands! Here Comes Charlie\tDECCA\t1220 B\t62068A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1442.mp3\tRed Norvo And His Orchestra\tClap Hands, Here Comes Charlie\tBRUNSWICK\t7975\tLA1442\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42653.mp3\tJimmy Dorsey & Orchestra\tClap Hands, Here Comes Charlie\tCOLUMBIA\t38731\tCO42653\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COL24981.mp3\tCount Basie & His Orchestra\tClap Hands, Here Comes Charlie\tCOLUMBIA\t30231\t24981\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043994.mp3\tCharlie Barnet & His Orchestraestraestra\tClap Hands, Here Comes Charlie\tBLUEBIRD\t10602\t043994\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24981-A.mp3\tCount Basie And His Orchestra\tClap Hands, Here Comes Charlie\tVocalion\t5085\t24981-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36992-3.mp3\tJack Smith And His Orchestra\tClap Yo Hands\tVICTOR\t20372\t36992-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36902-2.mp3\tRoger Wolfe Kahn & His Orchestra\tClap Yo' Hands\tVICTOR\t20327B\t36902-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/KinK-5910.mp3\tLucky Millinder And His Orchestra\tClap Your Hands\tKing\t4398\tK-5910\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE31393-2.mp3\tBenny Goodman And His Orchestra\tClarinet A La King\tOKEH\t6544\t31393-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/OKE31393-3.mp3\tBenny Goodman And His Orchestra\tClarinet A La King\tOKEH\t6544\t31393-3\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/SIG1114.mp3\tJess Stacy & His Orchestra\tClarinet Blues\tSIGNATURE\t902\t1114\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU18736.mp3\tDuke Ellington And His Orchestra\tClarinet Lament\tBRUNSWICK\t7650\t18736\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_169.mp3\tDuke Ellington And His Famous Orchestra\tClarinet Lament\tBRUNSWICK\t7650\t18736\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9884-A.mp3\tZutty & His Band\tClarinet Marmalade\tDECCA\t432B\tC9884-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE4182-3.mp3\tFletcher Henderson & His Orchestra\tClarinet Marmalade\tVOCALION\t15497A\tE4182-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/GENG11540-A.mp3\tNew Orleans Rhythm Kings\tClarinet Marmalade\tGENNETT\t5220\tG11540-A\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5422.mp3\tJoe Marsala All Timers\tClarinet Marmalade\tSAVOY\t10001B\tS5422\t1944\t\nhttp://www.jazz-on-line.com/a/mp3h/BANE-37473-A.mp3\tGene's Merrymakers (casa Loma Orchestra)\tClarinet Marmalade\tBANNER\t32551\tE-37473-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Col151441-2.mp3\tFletcher Henderson And His Orchestra\tClarinet Marmalade\tColumbia\t2513-D\t151441-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB23955-A.mp3\tHorace Heidt's Musical Knights\tClarinet Polka\tCOLUMBIA\t36080\tB23955-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU22711.mp3\tJohnny Dodds Trio\tClarinet Wobble\tBRUNSWICK\t3574\t22711\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BIL1021y.mp3\tBenny Goodman\tClarinetitis\tBiltmore\t1021\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035053.mp3\tCharlie Barnet & His Orchestra\tClass Will Tell (v J E)\tBLUEBIRD\t10182\t035053\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP4902-5.mp3\tCharlie Barnet And His Orchestra\tClaude Reigns\tCAPITOL\t\t4902-5\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_381.mp3\tBetty Johnson\tClay Idol\tBally\t1013\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60895-A.mp3\tMary Lou Williams\tClean Pickin'\tDECCA\t1155\t60895-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC7516x.mp3\tSleepy John Estes\tClean Up At Home\tDECCA\t7516\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D337A1.mp3\t Bing Crosby\tClementine\tV-DISC\t337A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC40212-2.mp3\tJean Goldkette And His Orchestra\tClementine\tVICTOR\t20994B\t40212-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC061338.mp3\tDuke Ellington And His Orchestra\tClementine\tVICTOR\t27700\t061338\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2437A.mp3\tBing Crosby With The Music Maids And Hal And John Scott Trotter And His Orchestra\tClementine\tDECCA\t4033 B\tDLA2437A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_185.mp3\tBing Crosby\tClementine\tDECCA\t25020\tDLA2437\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU1205CBB.mp3\tCliff Jackson's Village Cats\tCliff's Boogie Blues\tBLUENOTE\tBN1205\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/WES116y.mp3\tLu Watters's Yerba Buena Jazz B\tClimax Rag\tWest Coast\t116\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041360-2.mp3\tJelly Roll Morton Jazzmen\tClimax Rag\tBLUEBIRD\t10442\t041360-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN101.mp3\tGeorge Lewis New Orleans Stomp\tClimax Rag\tBLUENOTE\tBN101\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu041360-2.mp3\tJelly-roll Morton's New Orleans Jazzmen\tClimax Rag\tBluebird\tB-10442\t041360-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_082.mp3\tRichard Himber And His Orchestra\tCling To Me\tVictor\t25235\t98831\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_210.mp3\tOzzie Nelson And His Orchestra\tCling To Me\tBrunswick\t7597\t18502\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_261.mp3\tSpike Jones And His City Slickers\tClink, Clink, Another Drink\tBLUEBIRD\t11466\t072021\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3748.mp3\tBing Crosby - J.s.trotter\tClose As Pages In A Book\tDECCA\t23754\tL3748\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_158.mp3\tBenny Goodman And His Orchestra Feat. Jane Harvey\tClose As Pages In A Book\tCOLUMBIA\t36787\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe81473-A.mp3\tClarence Williams Blue 7\tClose Fit Blues\tOKeh\t8510\t81473-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC066895-1.mp3\tJohn Kirby And His Orchestra\tClose Shave\tVICTOR\t27568\t066895-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65190-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tClose To Five\tDecca\t2407\t65190-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC02168.mp3\tTommy Dorsey & His Orchestra\tClose To Me\tVICTOR\t25447\t02168\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_155.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tClose To Me\tVICTOR\t25447\t02168\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_010.mp3\tHenry Burr And Albert Campbell\tClose To My Heart\tColumbia\t1790\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO33249.mp3\tFrank Sinatra\tClose To You\tCOLUMBIA\t36678\tCO33249\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D154A2.mp3\tFrank Sinatra\tClose To You\tV-DISC\t154A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_049.mp3\tFrank Sinatra\tClose To You\tCOLUMBIA\t36678\tCO33249\t1943\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW140912.mp3\tLeo Reisman & His Orchestra\tClose Your Eyes (w)\tCOLUMBIA\t456D\tW140912\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic86209-1.mp3\tFats Waller\tClothes Line Ballet\tVictor\t25015\t86209-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Pol2422hpp.mp3\tDjango Reinhardt\tCloud Castles\tPolydor\tF-512736\t2422hpp\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16888.mp3\tBenny Goodman And His Orchestra\tClouds\tARC\tCO3015\t16888\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77440.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tClouds\tUltraphone\tAP-1511\tP-77440\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64779-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tClouds\tDecca\t2570\t64779-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC87497-1.mp3\tRay Noble & His Orchestra\tClouds (vab)\tVICTOR\t24865\t87497-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/VarLO-371-2.mp3\tBarney Bigard And His Jazzopaters\tClouds In My Heart\tVariety\t525\tLO-371-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/ColB-11867-B.mp3\tDuke Ellington And His Famous Orchestra\tClouds In My Heart\tColumbia\t37299\tB-11867-B\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS5025C.mp3\tMary Lou Williams\tCloudy\tDISC\t5025\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC60974.mp3\tAndy Kirk's 12 Clouds Of Joy\tCloudy\tDECCA\t1208A\t60974\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUKC593.mp3\tAndy Kirk's 12 Clouds Of Joy\tCloudy\tBRUNSWICK\t4653\tKC593\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/BruKC-593.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tCloudy\tBrunswick\t4653\tKC-593\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60974-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tCloudy\tDecca\t1208\t60974-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Col404596-B.mp3\tChocolate Dandies With Benny Carter\tCloudy Skies\tColumbia \t35679 \t404596-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/GUIG559-B.mp3\tGeorgie Auld & His Orchestra\tCo-pilot\tGUILDE\t128\tG559-B\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26706-7.mp3\tPaul Whiteman & His Orchestra\tCoal Black Mammy\tVICTOR\t18939\t26706-7\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80761.mp3\tAl Jolson\tCoal Black Mammy\tCOLUMBIA\tA-3854\t80761\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_039.mp3\tAl Jolson\tCoal Black Mammy\tCOLUMBIA\tA-3854\t80761\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC058776-1.mp3\tSidney Bechet No Feetwarmers\tCoal Black Shine\tVICTOR\t27386A\t058776-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67820-A.mp3\tLouis Armstrong & His Orch.\tCoal Cart Blues\tDECCA\t18091A\t67820-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe73694-B.mp3\tClarence Williams Blue Five\tCoal Cart Blues (v E T)\tOKeh\t8245B\t73694-B\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_009.mp3\tArthur Collins And Byron Harlan\tCoax Me\tCOLUMBIA\tBS3052\t03052-1!\t1905\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1255.mp3\tArnett Cobb & His Orchestra\tCobb's Boogie\tAPOLLO\t781\tR1255\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1256.mp3\tArnett Cobb & His Orchestra\tCobb's Corner\tAPOLLO\t796\tR1256\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1233.mp3\tArnett Cobb & His Orchestra\tCobb's Idea\tAPOLLO\t772\tR1233\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/CorL-4288-.mp3\tLionel Hampton And His Orchestra\tCobb's Idea\tCoral\t6.22116\tL-4288-\t1946\tLionel Hampton vib dir. Joe Wilder Richard ''Duke'' Garrette Leo Sheppard  Joe Morris Wendell Culley Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb Johnny Griffin ts, Charlie fowlkes bar\nhttp://www.jazz-on-line.com/a/mp3d/Cor73332-.mp3\tLionel Hampton And His Orchestra\tCobb's Idea\tCoral\t6.22116\t73332-\t1946\tLionel Hampton vib dir. Joe Morris  Dave Page Wendell CulleyLamar Wright Jr.  Jimmy Nottingham t, Jimmy Wormick Michael ''Booty'' Wood  Andrew Penn  Al Haysetb, Bobby Plater Ben Kynard as, Arnett Cobb Johnny Griffin ts, Charlie Fowlkes bar, Milt Buckne\nhttp://www.jazz-on-line.com/a/mp3c/VIC40091-1.mp3\tTed Weems & His Orchestra\tCobblestones\tVICTOR\t21105\t40091-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC3516.mp3\tDick Justice\tCocaine\tBRUNSWICK\t395\tC3516\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU057658-1.mp3\tBenny Carter And His Orchestra\tCocktails For Two\tBLUEBIRD\t10998\t057658-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/ColHCO40181.mp3\tJo Stafford As Darlene Edward\tCocktails For Two\tColumbia\tCL 1024\tHCO40181\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC24617.mp3\tDuke Ellington & His Orch\tCocktails For Two\tVICTOR\t24617\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1628.mp3\tSpike Jones City Slickers\tCocktails For Two\tRCA\t20-1628\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC79156-2.mp3\tDuke Ellington And His Orchestra\tCocktails For Two\tVICTOR\t24617\t79156-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2092.mp3\tSpike Jones & City Slickers\tCocktails For Two\tRCA\t20-2092\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47359.mp3\tErroll Garner (piano)\tCocktails For Two\tCOLUMBIA\t39746\tCO47359\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC028177.mp3\tTommy Dorsey & His Orchestra\tCocktails For Two\tVICTOR\t26145\t028177\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/SONSR1860.mp3\tColeman Hawkins & His Orchestra\tCocktails For Two\tSONORA\t3024\tSR1860\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D348A2.mp3\tSpike Jones And His City Slickers\tCocktails For Two\tV-DISC\t348A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_043.mp3\tSpike Jones And His City Slickers\tCocktails For Two\tV-DISC\t348A2\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_004.mp3\tDuke Ellington And His Famous Orchestra\tCocktails For Two\tVICTOR\t24617\t79156-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_199.mp3\tJohnny Green And His Orchestra\tCocktails For Two\tBRUNSWICK\t6797\t14974\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D1234.mp3\tArt Tatum\tCocktails For Two - Liza\tV-DISC\t456\t1234\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA1166.mp3\tHarry Owens Royal Hawaiian Or\tCocoanut Grove\tDECCA\t1798B\tDLA1166\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MER6362.mp3\tJerry Byrd\tCocoanut Grove\tMERCURY\t6362\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COL26437-A.mp3\tTeddy Wilson & His Orchestra\tCocoanut Grove\tCOLUMBIA\t35737\t26437-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26717.mp3\tBenny Goodman & His Orchestra\tCoconut Grove\tCOLUMBIA\t35527\t26717\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067964.mp3\tUna Mae Carlisle\tCoffee And Cakes\tBLUEBIRD\t11362\t067964\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC3461.mp3\tLucille Bogan (bessie Jackson)\tCoffee Grindin' Blues\tBRUNSWICK\t7083\tC3461\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/ARCB14320-B.mp3\tBoswell Sisters\tCoffee In The Morning\tARC\tBR6733\tB14320-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14320-B.mp3\tBoswell Sisters\tCoffee In The Morning (and Kisses In The Night)\tBRUNSWICK\t6733\t14320-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_187.mp3\tBoswell Sisters Feat. Victor Young's Orchestra And Tommy And Jimmy Dorsey\tCoffee In The Morning (kisses In The Night)\tBRUNSWICK\t6733\t14320-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_156.mp3\tJoe Hayman\tCohen Telephones About His Auto\tColumbia\t3772\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16365-1.mp3\tBenny Goodman And His Orchestra\tCokey\tARC\tCO3011D\t16365-1\t1934\t\nhttp://www.78-tours.net/mp3/COLCA14587.mp3\tSavoy Htel Orpheans - Au Piano : Carrol Gibbons\tCoktails For Two\tCOLUMBIA\tDF1598\tCA14587\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45833.mp3\tTony Bennett\tCold Cold Heart\tCOLUMBIA\t39449\tCO45833\t\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC12926-1.mp3\tBuddy Moss\tCold County (lousy Dime Blues)\tARC\tBA32686\t12926-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COL140250-2.mp3\tBessie Smith\tCold In Hand Blues\tCOLUMBIA\t14064 D\t140250-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW140250-2.mp3\tBessie Smith\tCold In Hand Blues\tCOLUMBIA\t35672\tW140250-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc13759.mp3\tFletcher Henderson And His Orchestra\tCold Mamas (burn Me Up)\tVocalion\t\t13759  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC13759-61.mp3\tFletcher Henderson & His Orchestra\tCold Mamas Burn Me Up\tVOCALION\t14892B\t13759-61\t1924\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC91072.mp3\tKokomo Arnold\tCold Winter Blues\tDECCA\t7267\t91072\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC81634.mp3\tLouis Armstrong And His Orchestra\tCold, Cold Heart\tDECCA\t27816\t81634\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_007.mp3\tTony Bennett\tCold, Cold Heart\tCOLUMBIA\t39449\tCO45833\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_133.mp3\tFontane Sisters Feat. Mitchell Ayres' Orchestra\tCold, Cold Heart\tRCA Victor\t4274\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_280.mp3\tTony Fontane Feat. O/lew Douglas\tCold, Cold Heart\tMercury\t5693\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP1673-3L.mp3\tStan Kenton & His Orchestra\tCollaboration\tCAPITOL\t\t1673-3L\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_023.mp3\tBilly Murray\tCollege Life\tVICTOR\t16250\tB3097-3\t1906\t\nhttp://www.jazz-on-line.com/a/mp3o/HITK3.mp3\t\tCollege Medley\tHIT OF THE WEEK\tK3\tK3\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh005.mp3\tAmbrose And His Orchestra (vocal The Rhythm Sisters)\tCollege Rhythm\tDecca\tF-5332\tGB-6773-1-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-2308-1.mp3\tPhilippe Brun Et Son Swing Band (with Django Reinhardt)\tCollege Stomp\tSWING\t15\tOLA-2308-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_360.mp3\tHudson-delange Orchestra\tCollege Widow\tBRUNSWICK\t8040\tM211\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC33273-8.mp3\tRevelers\tCollegiate\tVICTOR\t19778\t33273-8\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/RCA42-0030C.mp3\tFred Waring's Pennsylvanians\tCollegiate\tRCA\t42-0030\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19648.mp3\tWaring's Pennsylvanians\tCollegiate\tVictor\t19648\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUE15953.mp3\tCarl Fenton And His Orch\tCollegiate\tBRUNSWICK\t2913\tE15953\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_168.mp3\tCarl Fenton And His Orchestra Feat. Billy Jones, Ernest Hare, And Irving Kaufman\tCollegiate\tBRUNSWICK\t2913\tE15953\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC32129-4.mp3\tWaring's Pennsylvanians\tCollegiate - Shimmy\tVICTOR\t19648A\t32129-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU57484-3.mp3\tKay Kyser & His Orchestra\tCollegiate Fanny\tBLUEBIRD\t5951\t57484-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC57484-3.mp3\tKay Kayser And His Orchestra\tCollegiate Fanny\tVICTOR\tV-40258\t57484-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-15391.mp3\tTed Heath And His Music\tColonel Bogey\tDECCA-LONDON\tEFF.53-1 (BEP 6027) \tDR-15391\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN684x.mp3\tMoon Mullican\tColumbus Stockade Blues\tKING\t684\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046058.mp3\tCharlie Barnet & His Orchestra\tComanche War Dance\tBLUEBIRD\t10584\t046058\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67512.mp3\tLes Brown And His Band Reknown\tComanche War Dance\tDECCA\t3155A\t67512\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic64058-2.mp3\tMckinney's Cotton Pickers\tCome A Little Closer\tVictor\t23035\t64058-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_065.mp3\tArthur Collins And Byron Harlan\tCome Along, Little Girl, Come Along\tEDISON\t9028\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_024.mp3\tNora Bayes And Jack Norworth\tCome Along, My Mandy\tVictor\t70016\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061335.mp3\tFats Waller And His Rhythm\tCome And Get It\tBLUEBIRD\t11262\t061335\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe09503-A.mp3\tLouis Armstrong's Hot Five\tCome Back Sweet Papa\tOKeh\t8318\t09503-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/MER410-2.mp3\tT-bone Walker\tCome Back To Me, Baby\tMERCURY\t8016\t410-2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D149B1.mp3\tPhil Brito\tCome Back To Sorrento\tV-DISC\t149B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLA77-1.mp3\tWynonie Harris & His Allstars\tCome Back, Baby\tALLADDIN\t172\tA77-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC61163.mp3\tBob Crosby & His Orchestra\tCome Back, Sweet Papa\tDECCA\t3336A\t61163\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC3964-1.mp3\tGene Krupa & His Orchestra\tCome Be My Love\tOKEH\t6438\tC3964-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053798.mp3\tFats Waller And His Rhythm\tCome Down To Earth, My Angel\tBLUEBIRD\t11010\t053798\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/COL01405.mp3\tHenry Burr (tenor)\tCome Down, Ma Ev'ning Star\tCOLUMBIA\tRING-7\"\t01405\t1903\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_008.mp3\tHenry Burr\tCome Down, Ma Ev'ning Star\tCOLUMBIA\t1405\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_236.mp3\tBubber Johnson\tCome Home\tKing\t4822\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1270.mp3\tKing Cole Trio\tCome In Out Of The Rain\tCAPITOL\t\t1270\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VICB9669-2.mp3\tAda Jones And Qt\tCome Josephine In My Flying Machine\tVICTOR\t16844\tB9669-2\t1910\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic16844.mp3\tAda Jones & Billy Murray\tCome Josephine In My Flying Machine\tVictor\t16844\tB9669-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11560.mp3\tSpike Jones\tCome Josephine, In My Flying Machine\tBluebird\t11560\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1710x.mp3\tKay Starr - Dave Cavanaugh\tCome On A My House\tCAPITOL\t1710\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO46305.mp3\tRosemary Clooney\tCome On A My House\tCOLUMBIA\t39467\tCO46305\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_056.mp3\tArthur Collins And Byron Harlan\tCome On And Kiss Yo' Baby\tVICTOR\t16224-A\tB4854\t1908\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC1237-8.mp3\tJohnny Dodds Black Bottom St.\tCome On And Stomp, Stomp, Stomp\tBRUNSWICK\t3568\tC1237-8\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKECO47483.mp3\tDuke Ellington Famous Orchestra\tCome On Home\tOKEH\t6911\tCO47483\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC13777-5.mp3\tHelen Clark And Billy Murray\tCome On Over Here\tVICTOR\t17441A\t13777-5\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_107.mp3\tBilly Murray And Helen Clark\tCome On Over Here\tVICTOR\t17441\t13777-5\t1913\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA381-A.mp3\tJimmie Davis\tCome On Over To My House\tDECCA\t5249\tDLA381-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP346.mp3\tJulia Lee W Jay Mcshann\tCome On Over To My House\tCAPITOL\t\t346\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3162.mp3\tCab Calloway & His Orchestra\tCome On With The 'come On'\tOKEH\t5687\tWC3162\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147421-3.mp3\tFletcher Henderson & His Orchestra\tCome On, Baby!\tCOLUMBIA\t14392 D\tW147421-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Col147421-2.mp3\tFletcher Henderson And His Orchestra\tCome On, Baby!\tColumbia\t14392-D\t147421-2  \t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW147033-3.mp3\tCliquot Club Eskimos (reser)\tCome On, Baby! (vts)\tCOLUMBIA\t1592 D\tW147033-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC81216.mp3\tElla Fitzgerald\tCome On-a My House\tDECCA\t27680\t81216\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_006.mp3\tRosemary Clooney\tCome On-a My House\tCOLUMBIA\t39467\tCO46305\t1951\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D241B2.mp3\tFrank Sinatra\tCome Out Wherever You Are\tV-DISC\t241B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO43830.mp3\tSarah Vaughan\tCome Rain Or Come Shine\tCOLUMBIA\t38898\tCO43830\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_235.mp3\tMargaret Whiting\tCome Rain Or Come Shine\tCAPITOL\t\t912\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_275.mp3\tHelen Forrest And Dick Haymes Feat. Orchestra Directed By Earle Hagen\tCome Rain Or Come Shine\tDecca\t23548\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480562.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tCome Rain Or Come Shine\tBlue Note\t8-35282-2\tTk21\t1958\tArt Blakey, D, Benny Golson, Ts, Lee MOrgan, T, Bobbie Timmons, P, Jymie Merritt, B\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1533.mp3\tLes Brown & Doris Day\tCome To Baby Do\tCOLUMBIA\t36884\tHCO1533\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5316.mp3\tGeorgie Auld & His Orchestra\tCome To Baby Do (vlynne Stevens)\tMUSICRAFT\t15044\t5316\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP766.mp3\tKing Cole Trio\tCome To Baby, Do\tCAPITOL\t\t766\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_192.mp3\tDuke Ellington And His Famous Orchestra\tCome To Baby, Do\tVictor\t20-1748-A\tD5VB663-1\t1945\tVocal refrain by Joya Sherrill\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1748-.mp3\tDuke Ellington And His Famous Orchestra\tCome To Baby, Do!\tVictor\t20-1748-A\tD5VB663-1\t1945\tVocal refrain by Joya Sherrill \nhttp://www.jazz-on-line.com/a/mp3w/1946_146.mp3\tLes Brown And His Orchestra Feat. Doris Day\tCome To Baby, Do!\tCOLUMBIA\t36884\tHCO1533\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_052.mp3\tHenry Burr\tCome To The Ball\tVICTOR\t17030\t11335-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC11335-1.mp3\tHenry Burr\tCome To The Ball\tVICTOR\t17030\t11335-1\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_227.mp3\tElla Logan\tCome To The Fair\tCOLUMBIA\t36313\tLA1687\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14956-C.mp3\tEthel Waters W Orchestra\tCome Up And See Me Some Time\tBRUNSWICK\t6885\t14956-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC77499-1.mp3\tPaul Whiteman Presents Ramona\tCome Up And See Me Sometime\tVICTOR\t24389\t77499-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/MER5772x.mp3\tPatti Page\tCome What May\tMERCURY\t5772\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_069.mp3\tPatti Page\tCome What May\tMERCURY\t5772\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_007.mp3\tAda Jones And Billy Murry And American Quartet\tCome, Josephine, In My Flying Machine\tVictor\t16844\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2213x.mp3\tKay Starr\tComes Along A Love\tCAPITOL\t2213\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037600.mp3\tLarry Clinton & His Orchestra\tComes Love\tVICTOR\t26277\t037600\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_102.mp3\tLarry Clinton And His Orchestra Feat. Ford Leary\tComes Love\tVICTOR\t26277\t6\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_227.mp3\tEddy Duchin And His Orchestra Feat. V/durelle Alexander\tComes Love\tBRUNSWICK\t8434\t25034\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24689-A.mp3\tHarry James And His Orchestra\tComes Love\tBrunswick\t8395\tB-24689-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/CONS3284.mp3\tCozy Cole & His Orchestra\tComes The Don\tCONTIN\tT6004\tS3284\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Col151444-1.mp3\tFletcher Henderson And His Orchestra\tComin' And Going\tColumbia\t2449-D\t151444-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21807-B.mp3\tRevelers\tComin' Home\tVictor\t21807-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU055179.mp3\tEarl Hines & His Orchestra\tComin' In Home\tBLUEBIRD\t11199\t055179\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu055179-1.mp3\tEarl Hines And His Orchestra\tComin' In Home\tBluebird\tB-11199\t055179-1\t1940\tHarry \"Pee Wee\" Jackson, Rostelle Reese, Leroy White (tp) Joe McLewis, John Ewing, Edward Fant (tb) Leroy Harris, Scoops Carey (as) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck Parham (b) Alvin Burroughs (d) Billy Eckstine, Madeline Greene (vcl) The Three Varieties (vcl trio\nhttp://www.jazz-on-line.com/a/mp3a/BLUD3AB78.mp3\tFour Vagabonds\tComin' In On A Wing And A Prayer\tBLUEBIRD\tBLU30-0815\tD3AB78\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOKE6713.mp3\tGolden Gate Jubilee Quartet\tComin' In On A Wing And A Prayer\tOKEH\t6713\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE33216.mp3\tGolden Gate Jubilee Qt\tComin' In On A Wing And A Prayer\tOKEH\t6713\t33216\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_007.mp3\tSong Spinners\tComin' In On A Wing And A Prayer\tDECCA\t18553A\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_098.mp3\tFour Vagabonds\tComin' In On A Wing And A Prayer\tBLUEBIRD\tBLU30-0815\tD3AB78\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU028989-1.mp3\tMilton \"mezz\" Mezzrow And Orchestra\tComin' On With The Come On Part 1\tBLUEBIRD\tB-10085-A\t028989-1\t1938\tM. Mezzrow, Clarinet - Tommy Ladnier, S. DeParis, Trumpets - Elmer James, Bass - Zutty Singleton, Drums - T. Bunn, Guitar - James Johnson, Piano\nhttp://www.jazz-on-line.com/a/mp3b/Blu028989-1.mp3\tMezz Mezzrow And His Orchestra\tComin' On With The Come On Part 1\tBluebird\tB-10085-A\t028989-1  \t1938\tM. Mezzrow, Clarinet - Tommy Ladnier, S. DeParis, Trumpets - Elmer James, Bass - Zutty Singleton, Drums - T. Bunn, Guitar - James Johnson, Piano\nhttp://www.jazz-on-line.com/a/mp3a/BLU028990-1.mp3\tMezz Mezzrow And His Orchestra\tComin' On With The Come On Part 2\tBLUEBIRD\tB-10085-B\t028990-1\t1938\tM. Mezzrow, Clarinet - Tommy Ladnier, S. DeParis, Trumpets - Elmer James, Bass - Zutty Singleton, Drums - T. Bunn, Guitar - James Johnson, Piano\nhttp://www.jazz-on-line.com/a/mp3b/Blu028990-1.mp3\tMezz Mezzrow And His Orchestra\tComin' On With The Come On Part 2\tBluebird\tB-10085\t028990-1  \t1938\tM. Mezzrow, Clarinet - Tommy Ladnier, S. DeParis, Trumpets - Elmer James, Bass - Zutty Singleton, Drums - T. Bunn, Guitar - James Johnson, Piano\nhttp://www.jazz-on-line.com/a/mp3c/VIC021143.mp3\tTommy Dorsey & His Orchestra\tComin' Thro' The Rye\tVICTOR\t25813\t021143\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_116.mp3\tNellie Melba\tComin' Thro' The Rye\tVICTOR\t88449\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE31769.mp3\tCount Basie & His Orchestra\tComing Out Party\tOKEH\t6564\t31769\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17350B.mp3\tAtilla The Hun\tCommission's Report\tDECCA\t17350B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S3372.mp3\tSlim Gaillard Trio\tCommunications\tMGM\t10442\t47S3372\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21236.mp3\tGlenn Miller & His Orchestra\tCommunity Swing\tBRUNSWICK\t7923\t21236\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COMP23990.mp3\tJess Stacy\tComplainin'\tCOMMODORE\t506\tP23990\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66832.mp3\tBob Crosby & His Orchestra\tComplainin'\tDECCA\t3233A\t66832\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC69788.mp3\tBlanche Calloway & Her Orchestra\tConcentratin On You\tVICTOR\t22862\t69788\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COMB533-2.mp3\tWillie Smith (piano)\tConcentrating\tCOMMODORE\t524\tB533-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR301.mp3\tGene Ammons Quintet\tConcentration\tALLADDIN\t3012\tRR301\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1021.mp3\tGeorgie Auld & His Orchestra\tConcert For Tenor\tAPOLLO\t359\tR1021\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_157.mp3\tKay Kyser And His Orchestra\tConcert In The Park\tCBS\tBR8385\t24614\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_088.mp3\tJan Garber And His Orchestra\tConcert In The Park\tVOCALION\t4889\t24700\t1939\t\nhttp://www.jazz-on-line.com/mp3/544264912.mp3\tArtie Shaw And His Orchestra\tConcerto For Clarinet - Part 1\tVICTOR\t36383\t055226-1\t1940\t\nhttp://www.jazz-on-line.com/mp3/988292217.mp3\tArtie Shaw And His Orchestra\tConcerto For Clarinet - Part 2\tVICTOR\t36383\t055227-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC049016-1.mp3\tDuke Ellington & His Orchestra\tConcerto For Cootie (do Nothin' Til You Hear)\tVICTOR\t26598\t049016-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/SAV5412.mp3\tCozy Cole Allstars\tConcerto For Cozy\tSAVOY\t575\t5412\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC4254B.mp3\tStan Kenton & His Orchestra\tConcerto For The Doghouse\tDECCA\t4254B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA2051.mp3\tHarry James And His Orchestra\tConcerto For Trumpet\tCOLUMBIA\t35340\tLA2051\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65429.mp3\tPaul Whiteman Concert Orch.\tConcerto In F Part 1\tDECCA\tDE29056F\t65429\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65430.mp3\tPaul Whiteman Concert Orch.\tConcerto In F Part 2\tDECCA\tDE29056F\t65430\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65431.mp3\tPaul Whiteman Concert Orch.\tConcerto In F Part 3\tDECCA\tDE29057F\t65431\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30941.mp3\tCab Calloway & His Orchestra\tConchita\tOKEH\t6354\t30941\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA3029.mp3\tBing Crosby - J.s.trotter Orch\tConchita, Marquita, Chiquita Lopez\tDECCA\t4343A\tDLA3029\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36327-2.mp3\tFive Harmaniacs\tConey Island Washboard\tVICTOR\t20293\t36327-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BANC8665-1.mp3\tMills Brothers\tConey Island Washboard\tBANNER\t33211\tC8665-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCMEM90.mp3\tSwift Jewel Cowboys\tConey Island Washboard\tVOCALION\t5499\tMEM90\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480503.mp3\tArt Farmer New Jazz Stars\tConfab In Tempo\tPrestige\tLP177\t554\t1954\tArt Farmer (tp), Sonny Rollins (ts), Horace Silver (p), Percy Heath (sb), Kenny Clarke (dm)\nhttp://www.jazz-on-line.com/a/mp3a/MER1361.mp3\tPatti Page\tConfess\tMERCURY\t5129\t1361\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_097.mp3\tPatti Page\tConfess\tMERCURY\t5129\t1361\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_126.mp3\tDoris Day And Buddy Clark Feat. George Siravo's Orchestra\tConfess\tCOLUMBIA\t38174\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_126.mp3\tDoris Day And Buddy Clark Feat. George Siravo's Orchestra\tConfess\tCOLUMBIA\t38174\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77242.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tConfessin'\tUltraphone\tAP-1443\tP-77242\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC65460-A.mp3\tLouis Armstrong And His Orch.\tConfessin'\tDECCA\t60774\t65460-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU94519.mp3\tJoe Kennedy & His Orchestra\tConfessin'\tBLUEBIRD\t6245\t94519\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_183.mp3\tPerry Como\tConfessin'\tVICTOR\t1629\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic09644-1.mp3\tLionel Hampton And His Orchestra\tConfessin'\tVictor\t25658\t09644-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_052.mp3\tRudy Vallee And His Connecticut Yankees\tConfessin' (that I Love You)\tVICTOR\t22506A\t63114-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_239.mp3\tLionel Hampton And His Orchestra\tConfessin' (that I Love You)\tVictor\t25658\t09644-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1086.mp3\tPhil Spitalny's Music\tConfessin' That I Love You\tHit-Of-The-Week\t1086\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D215A1.mp3\tTony Pastor\tConfessin' That I Love You\tV-DISC\t215A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93734-A.mp3\tJay Mcshann & His Orchestra\tConfessin' The Blues\tDECCA\t8559A\tC93734-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5986.mp3\tWynonie Harris\tConfessin' The Blues\tKING\t4461A\tK5986\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_307.mp3\tJay Mcshann And His Orchestra\tConfessin' The Blues\tDECCA\t8559A\tC93734-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC63114-3.mp3\tRudy Vallee & His Ct.yankees\tConfessing\tVICTOR\t22506A\t63114-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_384.mp3\tStylers\tConfession Of A Sinner\tJubilee\t5253\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_121.mp3\tSonny Knight\tConfidential\tDot\t15507\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM157-1.mp3\tCab Calloway & His Orchestra\tCongo\tVARIETY\tI593\tM157-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_297.mp3\tCab Calloway And His Orchestra Feat. Ben Webster (tenor Sax)\tCongo\tVARIETY\t593\tM157-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA1035CB.mp3\tRed Norvo's Allstars\tCongo Blues\tDIAL\t1035\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-17796-1.mp3\tMills Blue Rhythm Band\tCongo Caravan\tColumbia\t3087-D\tCO-17796-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL245.mp3\tLee O'daniel Hillbilly Boys\tCongratulate Me\tVOCALION\t4542\tDAL245\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_121.mp3\tJo Stafford\tCongratulations\tCapitol\t15319\t2812-2\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_136.mp3\tJack Denny And His Orchestra\tCongratulations\tBRUNSWICK\t4604\t31332\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_375.mp3\tGordon Macrae\tCongratulations To Someone\tCapitol\t2352\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_163.mp3\tTony Bennett\tCongratulations To Someone\tCOLUMBIA\t39910\tCO48152\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5651.mp3\tArtie Shaw And His Orchestra\tConnecticut Vralph Blane\tMUSICRAFT\t445\t5651\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_148.mp3\tPatti Page\tConquest\tMERCURY\t70025\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR426-Hx.mp3\tWesterners\tConsolation\tHarmony\t426-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL04684-1.mp3\tBert Williams\tConstantly\tCOLUMBIA\tA-0915\t04684-1\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA3035.mp3\tBing Crosby - J.s.trotter Orchestra\tConstantly\tDECCA\t18513B\tDLA3035\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_018.mp3\tBert Williams\tConstantly\tCOLUMBIA\tA-0915\t04684-1\t1910\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh133.mp3\tRaf Dance Orchestra. (sgt. Jimmy Miller Vo, Dir)\tConstantly\tDecca\tF-7743\tDR-5361-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVB902-4.mp3\tCharlie Parker\tConstellation\tSAVOY\t313\tB902-4\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_112.mp3\tGeraldine Farrar And Antonio Scotti\tContes D' Hoffman - Barcolle Belle Nuit (oh, Night Of Love)\tVictor\t87502\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/CONT6018CB.mp3\tEdmond Hall\tContinental Blues\tCONTIN\tT6018\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D117A2.mp3\tJimmy Dorsey And His Orchestra\tContrast\tV-DISC\t117A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67642.mp3\tJimmy Dorsey And His Orch.\tContrasts\tDECCA\t3198A\t67642\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D314A1.mp3\tJimmy Dorsey And His Orchestra\tContrasts (theme Song)\tV-DISC\t314A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481515.mp3\tCharles Mingus\tConversation\tBethlehem\tBCP6019\tTk 16\t1957\tClarence ?Gene? Shaw (tp), Jimmy Knepper (tb), Shafi Hadi (ts), Bill Evans (p), Charles Mingus (sb), Dannie Richmond (dm)\nhttp://www.jazz-on-line.com/a/mp3e/BluBN-219-0.mp3\tBenny Morton's All Stars\tConversing In Blue\tBlue Note\t46\tBN-220-0\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480768.mp3\tBenny Morton All Stars\tConversing In Blue\tBlue Note\t46\tBN220-0\t1945\tBenny Morton (tb), Barney Bigard (cl), Ben Webster (ts), Sam Benskin (p), Israel Crosby (sb), Eddie Dougherty (dm)\nhttp://www.jazz-on-line.com/a/mp3c/V-D610.mp3\tSam Donahue & Navy Band\tConvoy\tV-DISC\t610\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80317.mp3\tAl Jolson\tCoo Coo\tCOLUMBIA\tA-3626\t80317\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_086.mp3\tAl Jolson\tCoo Coo\tCOLUMBIA\tA-3626\t80317\t1922\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65447-A.mp3\tChick Webb And His Orchestra\tCoochi-coochi-coo\tDecca\t2803\t65447-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU4699.mp3\tRoger Wolfe Kahn And His Orchestra\tCooking Breakfast For The One I Love\tBRUNSWICK\t4699\t31961\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/OKe403692-A.mp3\tAnnette Hanshaw\tCooking Breakfast For The One I Love\tOKeh\t41370\t403692-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_0327_01.mp3\tLee Morse And Her Bluegrass Boys\tCooking Breakfast For The One I Love\tColumbia\t2165DA\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/DIA1054.mp3\tCharlie Parker\tCool Blues\tDIAL\t1015\t1054\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC124.mp3\tBilly Eckstine & His Orchestra\tCool Breeze\tNATIONAL\t\tNSC124\t1946\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480581.mp3\tArt Farmer Quintet\tCool Breeze\tUnited Artists\tUAL4007\t\t1958\tArt Farmer, T, Flh, Benny Golson, Ts, Addison Farmer, B, Bill Evans, P, Dave Bailey, D, Gigi Gryce, Ar\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S158.mp3\tLionel Hampton & His Orchestra\tCool Train\tMGM\t10979B\t51S158\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-158.mp3\tLionel Hampton And His Orchestra\tCool Train\tMGM\t10979\t51-S-158\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO33321.mp3\tFrankie Laine - Paul Weston\tCool Water\tCOLUMBIA\t40457\tRHCO33321\t1954\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL6871.mp3\tBing Crosby And Andrews Sisters\tCool Water\tDECCA\t28419\tL6871\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC93632.mp3\tSons Of The Pioneers\tCool Water\tDECCA\t29814\tC93632\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec46027.mp3\tSons Of The Pioneers\tCool Water\tDecca\t46027\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_326.mp3\tSons Of The Pioneers\tCool Water\tDECCA\t5939\tC93632\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC85420.mp3\tLouis Armstrong & Commanders\tCool Yule\tDECCA\t28943\t85420\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144512-1.mp3\tCharlie Poole N.c.ramblers\tCoon From Tennessee\tCOLUMBIA\t15215 D\tW144512-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67480-A.mp3\tBud Freeman Summ Cum Laude Or\tCopenhagen\tDECCA\t18064A\t67480-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN11853.mp3\tWolverine Orchestra\tCopenhagen\tGENNETT\t5453\t11853\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC019443-2.mp3\tTommy Dorsey & His Orchestra\tCopenhagen\tVICTOR\t26016B\t019443-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC30781-3.mp3\tBenson Orchestra Of Chicago\tCopenhagen\tVICTOR\t19470A\t30781-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_050.mp3\tBenson Orchestra Of Chicago\tCopenhagen\tVICTOR\t19470A\t30781-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh071.mp3\tAmbrose And His Orchestra\tCopenhagen\tDecca\tF-5696\tTB-1839-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc13928.mp3\tFletcher Henderson And His Orchestra\tCopenhagen\tVocalion\t\t13928\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC0340-1.mp3\tFats Waller And His Rhythm\tCopper Colored Gal\tVICTOR\t25409A\t0340-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19875-1.mp3\tCab Calloway & His Orchestra\tCopper Colored Gal\tBRUNSWICK\t7748\t19875-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61311.mp3\tBob Howard & His Orchestra\tCopper Colored Gal\tDECCA\t990A\t61311\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru7748.mp3\tCab Calloway & His Orchestra\tCopper Colored Gal\tBrunswick\t7748\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_186.mp3\tCab Calloway And His Orchestra\tCopper Colored Gal\tBrunswick\t7748\t19875-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5446.mp3\tSlam Stewart Quartet\tCoppin' Out\tMUSICRAFT\t396\t5446\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3310.mp3\tJ.j.johnson Beboppers\tCoppin' The Bop (vteddy Reig)\tSAVOY\t615A\tS3310\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEH0547.mp3\tGene Krupa & His Orchestra\tCopping A Plea\tOKEH\t6498\tH0547\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62259.mp3\tJimmie Lunceford And His Orchestra\tCoquette\tDECCA\t1340\t62259\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM52S3136.mp3\tBilly Eckstine\tCoquette\tMGM\t11439\t52S3136\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24024-2.mp3\tTeddy Wilson School For Piano\tCoquette\tCBS\tARC-P\t24024-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COMA4706.mp3\tEdmond Hall Sextet\tCoquette\tCOMMODORE\t550\tA4706\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU99361.mp3\tBoots And His Buddies\tCoquette\tBLUEBIRD\t6307\t99361\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL246.mp3\tLee O'daniel Hillbilly Boys\tCoquette\tVOCALION\t3674\tDAL246\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4007.mp3\tEddie Heywood\tCoquette\tDECCA\t24606\tL4007\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MERHL84.mp3\tJohnny Guarnieri Quintet\tCoquette\tMERCURY\t1118\tHL84\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC49929-2.mp3\tRudy Vallee Connecticut Yankee\tCoquette\tVICTOR\t21880B\t49929-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/CONDAL341.mp3\tNite Owls\tCoquette\tCONQUEROR\t8947\tDAL341\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19823.mp3\tErskine Hawkins Bama St.coll.\tCoquette\tVOCALION\t3318\t19823\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE26779.mp3\tJoe Sullivan (piano)\tCoquette\tOKEH\t5647\t26779\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe400144.mp3\tDorsey Brothers Orchestra\tCoquette\tOKeh\t41007\t400144\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D740y.mp3\tBud Freeman\tCoquette\tV-DISC\t740\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1062-A.mp3\tBob Crosby & His Bobcats\tCoquette\tDECCA\t1756B\tDLA1062-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOEF-25-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tCoquette\tSWING\t242\tOEF-25-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_237.mp3\tDorsey Brothers Orchestra\tCoquette\tOKeh\t41007\t400144\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_124.mp3\tRudy Vallee And His Connecticut Yankees\tCoquette\tVICTOR\t21880B\t49929-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-3274-A.mp3\tHorace Henderson And His Orchestra\tCoquette\tOKEH\t5841\tWC-3274-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_336.mp3\tBilly Eckstine Feat. O/nelson Riddle\tCoquette\tMGM\t11439\t52S3136\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/TedP-24024-1.mp3\tTeddy Wilson And His Orchestra\tCoquette\tTeddy Wilson School\t\tP-24024-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL142.mp3\tSam Furman\tCoquette (vfrankie Laine)\tATLANTIC\t142\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62259-A.mp3\tJimmie Lunceford And His Orchestra\tCoquette.mp3\tDecca\t1340\t62259-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO4856.mp3\tFrankie Carle\tCorabelle\tCOLUMBIA\t37972\tCCO4856\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI2618-C.mp3\tReed Orchestra\tCord And Tassel Dance\tEDISON\tBA 4543\t2618-C\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69358-A.mp3\tJoe Turner & Art Tatum\tCorinne Corinna\tDECCA\t29924\t69358-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39518.mp3\tBob Howard & His Orchestra\tCorinne Corinna\tDECCA\t484A\t39518\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11017-3.mp3\tCab Calloway And His Orchestra\tCorinne Corinna\tBanner\t32340\t11017-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN11017-3.mp3\tCab Calloway & His Orchestra\tCorinne Corinna (vcc)\tBANNER\t32340\t11017-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC60876-A.mp3\tAndy Kirk 12 Clouds Of Joy\tCorky\tDECCA\t772B\t60876-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60876-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tCorky\tDecca\t772\t60876-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruKC-618.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tCorky Stomp\tBrunswick\t4893\tKC-618\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC036055-2.mp3\tMaxine Sullivan\tCorn Pickin'\tVICTOR\t26237\t036055-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE9535-A.mp3\tLouis Armstrong And His Hot Five\tCornet Chop Suey\tOKeh\t8320A\t09535-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3o/COL21296.mp3\tLouis Armstrong And His Hot Five Cornet -louis Armstrong ; Trombone-kid Ory ; Clarinet-johnny Dodds\tCornet Chop Suey\tCOLUMBIA\t36154\t21296\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23666.mp3\tRed Nichols & His 5 Pennies\tCornfed\tBRUNSWICK\t3597\t23666\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70992.mp3\tGene Kardos & His Orchestra\tCornfed Gal\tVICTOR\t22899\t70992\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1899_034.mp3\tHaydn Quartet\tCornfield Medley\tBERLINER\t0416N\t\t1899\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_242.mp3\tAndrews Sisters\tCorns For My Country\tDECCA\t18628\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89057CH.mp3\tGene Krupa Sextet\tCoronation Hop\tMERCURY\t89057\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEDAL974.mp3\tBob Wills And His Texas Playboys\tCorrine Corrina\tOKEH\t6530\tDAL974\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_243.mp3\tJoe Turner\tCorrine Corrina\tAtlantic\t1088\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17974.mp3\tDuke Ellington's Orchestra\tCotton\tBRUNSWICK\t7526\t17974\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-17924-1.mp3\tMills Blue Rhythm Band\tCotton\tColumbia\t3078-D\tCO-17924-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_063.mp3\tDuke Ellington And His Famous Orchestra Feat. V/ivie Anderson\tCotton\tBRUNSWICK\t7526\t17974\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148210-2.mp3\tGid Tanner's Skillet Lickers\tCotton Baggin'\tCOLUMBIA\t15404 D\tW148210-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE32614.mp3\tDuke Ellington & His Orchestra\tCotton Club Stomp\tBRUNSWICK\t6813\tE32614\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic51971-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tCotton Club Stomp\tVictor\tV-38079\t51971-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE32614-B.mp3\tJungle Band (ellington)\tCotton Club Stomp - Keep Your Temper\tBRUNSWICK\t4887\tE32614-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2004.mp3\tBob Wills And His Texas Playboys\tCotton Eyed Joe\tCOLUMBIA\t37212\tHCO2004\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146002-2.mp3\tGid Tanner's Skillet Lickers\tCotton Eyed Joe\tCOLUMBIA\t15283 D\tW146002-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/COL149795.mp3\tGeorgia Cotton Pickers\tCotton Picker Shuffle\tCOLUMBIA\tHA1090\t149795\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DECTB3138.mp3\tAmbrose & His Orchestra\tCotton Picker's Congregation\tDECCA\t1526B\tTB3138\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64008-2.mp3\tMckinney's Cotton Pickers\tCotton Pickers Scat\tVICTOR\t23012\t64008-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC049655-1.mp3\tDuke Ellington And His Orchestra\tCotton Tail\tVICTOR\t26610B\t049655-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26610c.mp3\tDuke Ellington & His Famous Orchestra\tCotton Tail\tVictor\t26610\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480676.mp3\tDuke Ellington And His Famous Orchestra\tCotton Tail (shuckin And Stiffin)\tVictor\t26610\t049655-1\t1940\tWardell Jones, Cootie Williams (tp), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Barney Bigard (cl), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (as, bsx), Ben Webster (ts), Duke Ellington (p, ldr), Fred Guy (g), Jimmy Blanton (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-131-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tCoucou\tSWING\t\tOSW-131-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_042.mp3\tJohnny Messner And His Orchestra\tCould Be\tBluebird\t10107\t031243\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_366.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tCould You Pass In Love?\tVICTOR\t26000\t024021-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0420_01.mp3\tLee Morse\tCould'll Certainly Could\tPerfect\t11616A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPra.mp3\tRay Anthony\tCount Every Star\tCAPITOL\t\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_041.mp3\tRay Anthony Feat. Dick Noel\tCount Every Star\tCapitol\t979\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61532-A.mp3\tJimmie Lunceford And His Orchestra\tCount Me Out\tDecca\t1229\t61532-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61532-A.mp3\tJimmie Lunceford And His Orchestra\tCount Me Out.mp3\tDecca\t1229\t61532-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35206-A.mp3\tVictor Military Band\tCount Of Luxembourg Waltzes\tVictor\t35206-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-5871x.mp3\tEddie Fisher\tCount Your Blessings\tRCA\t20-5871\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_156.mp3\tEddie Fisher\tCount Your Blessings\tRCA\t20-5871\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_284.mp3\tRosemary Clooney Feat. The Mellomen, Buddy Cole And His Orchestra\tCount Your Blessings Instead Of Sheep\tCOLUMBIA\t40370\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL7650.mp3\tBing Crosby\tCount Your Blessings Of Sheep\tDECCA\t29251\tL7650\t\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI8881.mp3\tBilly Jones\tCounterfeit Bill\tEDISON\t51139\t8881\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_318.mp3\tErnest Tubb\tCounterfeit Kisses\tDECCA\t28869\t84019\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1346.mp3\tFrankie Carle\tCounting The Days\tCOLUMBIA\t36805\tHCO1346\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COMP23422.mp3\tKansas City Six\tCountless Blues\tCOMMODORE\t509\tP23422\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO40685.mp3\tJimmie Dickens String Band\tCountry Boy\tCOLUMBIA\t20585\tCO40685\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWM1108.mp3\tDuke Ellington Famous Orchestra\tCountry Gal\tCOLUMBIA\t35776\tWM1108\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68481.mp3\tHazel Scott (piano)\tCountry Gardens\tDECCA\t18128A\t68481\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC13718-1.mp3\tWill Batts (jack Kelly)\tCountry Woman\tARC\tVO2531z\t13718-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49453-2.mp3\tJelly Roll Morton Peppers\tCourthouse Bump\tVICTOR\t38093\t49453-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic49453-2.mp3\tJelly Roll Morton And His Orchestra\tCourthouse Bump\tVictor\tV-38093\t49453-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67156.mp3\tWoody Herman & His Orchestra\tCousin To Chris\tDECCA\t3140A\t67156\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36830-2.mp3\tJean Goldkette & His Orchestra\tCover Me Up With Sunshine\tVICTOR\t20588\t36830-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC29589-5.mp3\tBrox Sisters\tCover Me Up With The Sunshine Of Virginia\tVICTOR\t19298\t29589-5\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_055.mp3\tVincent Lopez And His Orchestra\tCovered Wagon Days\tOkeh\t4946\t71898-C\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC29014-3.mp3\tTed Weems & His Orch.\tCovered Wagon Days\tVICTOR\t19212A\t29014-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/SUPM197.mp3\tJed Davenport\tCow Cow Blues\tSUPERTONE\t2229s\tM197\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECLA2108.mp3\tBob Crosby & His Orchestra\tCow Cow Blues\tDECCA\t3488 A\tLA2108\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67305.mp3\tSam Price's Texas Blusicians\tCow Cow Blues\tDECCA\t7732\t67305\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_269.mp3\tBob Crosby And His Orchestra\tCow Cow Blues\tDECCA\t3488 A\tLA2108\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC71482.mp3\tElla Fitzgerald And Ink Spots\tCow Cow Boogie\tDECCA\t25047\t71482\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D325B2.mp3\tElla Mae Morse With Freddie Slack\tCow Cow Boogie\tV-DISC\t325B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_085.mp3\tElla Fitzgerald And Ink Spots\tCow-cow Boogie\tDECCA\t25047\t71482\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63658.mp3\tJimmy Dorsey & His Orch.\tCowboy From Brooklyn\tDECCA\t1799B\t63658\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CONSC122.mp3\tHank Penny's Radio Cowboys\tCowboy's Swing\tCONQUEROR\t9392\tSC122\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC90925-A.mp3\tOriginal St. Louis Crackerjacks\tCrackerjack Stomp\tDECCA\t7236\t90925-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061254.mp3\tGlenn Miller & His Orchestra\tCradle Song (vre)\tBLUEBIRD\t11203\t061254\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/TEM532y.mp3\tBennie Moten's Kansas City Orchestra\tCrawdad Blues\tTemple\t532\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP263-3A-1.mp3\tZutty Singleton's Creole Band\tCrawfish Blues\tCAPITOL\t10023\t263-3A-1\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap263-3A1.mp3\tZutty's Creole Band With Barney Bigard\tCrawfish Blues\tCapitol\t10023\t263-3A1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL989x.mp3\tClovers\tCrawlin'\tATLANTIC\t989\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/OKe402151.mp3\tBud Freeman's Windy City Five\tCraze-ology\tOKeh\t41168\t402151\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOKe4169.mp3\tMamie Smith & Her Jazz Hounds\tCrazy Blues\tOKeh\t4169\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/OKeS7529-C.mp3\tMamie Smith And Her Jazz Hounds\tCrazy Blues\tOKeh\t4169\tS7529-C\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_022.mp3\tMamie Smith And Her Jazz Hounds\tCrazy Blues\tOKeh\t4169\tS7529-C\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC62184-2.mp3\tJelly Roll Morton Hot Peppers\tCrazy Chords\tVICTOR\t23307\t62184-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN1001CH.mp3\tZeb Turner\tCrazy Heart\tKING\t1001\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC7878.mp3\tFrankie Trumbauer & His Orchestra\tCrazy Quilt\tBRUNSWICK\t6146\tC7878\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC43560-3.mp3\tRoger Wolfe Kahn And His Orchestra\tCrazy Rhythm\tVICTOR\t21368\t43560-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOLA1743.mp3\tColeman Hawkins\tCrazy Rhythm\tVICTOR\t26219\tOLA1743\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400895-B.mp3\tMiff Mole's Little Molers\tCrazy Rhythm\tOKeh\t41098\t400895-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/V-DT1923.mp3\tColeman Hawkins Swing 4\tCrazy Rhythm\tV-DISC\t446\tT1923\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/Ult77522.mp3\tAlix Combelle Et Son Orchestre\tCrazy Rhythm\tUltraphon\tAP-1544\t77522\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480563.mp3\tArt Tatum\tCrazy Rhythm\tPablo\t2310-730\t1605-1\t1955\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3a/COLW146272-3.mp3\tHarry Reser's Syncopators\tCrazy Rhythm (vts)\tCOLUMBIA\t1378 D\tW146272-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Pol2425hpp.mp3\tDjango Reinhardt\tCrazy Strings\tPolydor\tF-512737\t2425hpp\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_298.mp3\tGuy Mitchell\tCrazy With Love\tColumbia\t40769\tCO56637\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_387.mp3\tTeresa Brewer\tCrazy With Love\tCoral\t61737\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC37532-2.mp3\tFrank Crumit\tCrazy Words Crazy Tune\tVICTOR\t20462\t37532-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU21270.mp3\tSix Jumping Jacks\tCrazy Words Crazy Tune (vbl)\tBRUNSWICK\t3434\t21270\t1927\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBel491-A.mp3\tHoney Duke & His Uke\tCrazy Words, Crazy Tune\tBell\t491-A\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_101.mp3\tFrank Crumit\tCrazy Words-crazy Tune\tVICTOR\t20462\t37532-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_088.mp3\tBill Haley And His Comets\tCrazy, Man, Crazy\tEssex\t321\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/CON20450-4.mp3\tArtie Shaw And His Orchestra\tCream Puff\tCONQUEROR\t9193\tB-20450-4\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/JazMLB-146.mp3\tJelly-roll Morton\tCreepy Feeling\tJazz Man\t12\tMLB-146\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2109.mp3\tKid Ory & His Band\tCreole Bo Bo\tCOLUMBIA\t37276\tHCO2109\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC39370-1.mp3\tDuke Ellington And His Orchestra\tCreole Love Call\tVICTOR\t21137A\t39370-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10602-1-3.mp3\tCab Calloway & His Orchestra\tCreole Love Call\tBANNER\t32185\t10602-1-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_218.mp3\tDuke Ellington And His Famous Orchestra Feat. V/adelaide Hall\tCreole Love Call\tVICTOR\t21137A\t39370-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_221.mp3\tDuke Ellington And His Famous Orchestra\tCreole Rhapsody\tVICTOR\t36049\t68231\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_198a.mp3\tDuke Ellington\tCreole Rhapsody (part 1)\tBRUNSWICK\t6093a\tE3594x\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_198b.mp3\tDuke Ellington\tCreole Rhapsody (part 2, Take A)\tBRUNSWICK\t6093b\tE3594y\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC68231.mp3\tDuke Ellingtonn & His Orchestra\tCreole Rhapsody Part 1\tVICTOR\t36049\t68231\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC68233.mp3\tDuke Ellingtonn & His Orchestra\tCreole Rhapsody Part 2\tVICTOR\t36049\t68233\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4128.mp3\tKid Ory Creole Dixieland Band\tCreole Song\tCOLUMBIA\t38955\tHCO4128\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-228-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tCrpuscule\tSWING\t123\tOSW-228-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D534.mp3\tDuke Ellington's Orchestra\tCrescendo In Blue\tV-DISC\t534\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1056-A.mp3\tCab Calloway And His Orchestra\tCrescendo In Drums\tVocalion\t5062\tWM-1056-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBan1141.mp3\tRoy Collins' Orchestra\tCrinoline Days\tBanner\t1141\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149283.mp3\tGid Tanner's Skillet Lickers\tCripple Creek\tCOLUMBIA\t15485 D\tW149283\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_196.mp3\tJoan Regan\tCroce Di Oro\tLondon\t1605\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_121.mp3\tPatti Page\tCroce Di Oro (cross Of Gold)\tMercury\t70713\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3576-.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tCroonin' The Blues\tBrunswick\t7087\tC-3576-\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC25152-1.mp3\tBenson Orchestra Of Chicago\tCrooning\tVICTOR\t18765\t25152-1\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_082.mp3\tBenson Orchestra Of Chicago\tCrooning\tVICTOR\t18765\t25152-1\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC17860-1.mp3\tBlind Gary\tCross And Evil Woman Blues\tARC\tME51016\t17860-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN4307CB.mp3\tRussell Jacquet\tCross Bones\tKING\t4307\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYCB321.mp3\tBill Harris Septet\tCross Country\tKEYNOTE\t618\tCB321\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU064885.mp3\tTommy Mcclennan\tCross Cut Saw Blues\tBLUEBIRD\t8897\t064885\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe81872-A.mp3\tHelen Humes\tCross Eyed Blues\tOKeh\t8825\t81872-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70302.mp3\tPatti Page\tCross Over The Bridge\tMERCURY\t70302\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_012.mp3\tPatti Page\tCross Over The Bridge\tMERCURY\t70302\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1112.mp3\tLouis Prima's New Orleans Gang\tCross Patch\tBRUNSWICK\t7680\tLA1112\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101191.mp3\tFats Waller And His Rhythm\tCross Patch\tVICTOR\t25315\t101191\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102005-1.mp3\tWillie Bryant & His Orchestra\tCross Patch\tBLUEBIRD\t6435\t102005-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19243-1.mp3\tCharlie Barnet & His Orchestra\tCross Patch (v C. Barnet)\tARC\tME60713\t19243-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW147388-2.mp3\tCliquot Club Eskimos\tCross Roads\tCOLUMBIA\t1625 D\tW147388-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9989.mp3\tBilly Jones\tCross Words Between My Sweetie And Me\tEDISON\t51500\t9989\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA26763-B.mp3\tArtie Shaw And His Gramercy Five\tCross Your Heart\tRCA VICTOR\t26763-B\t055064-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D248.mp3\tArtie Shaw And His Gramercy Five\tCross Your Heart\tV-DISC\t248\t055064-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20071c.mp3\tHenry Burr With Roger Wolfe Kahn\tCross Your Heart\tVictor\t20071\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055064-1.mp3\tArtie Shaw And His Gramercy Five\tCross Your Heart\tVictor\t26763\t055064-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC35398-7.mp3\tRoger Wolfe Kahn & His Orchestra\tCross Your Heart (v H. Burr)\tVICTOR\t20071\t35398-7\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC69447.mp3\tBird's Kentucky Corncrackers\tCrossed Old Jordan Stream\tVICTOR\t23608B\t69447\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL249.mp3\tLee O'daniel Hillbilly Boys\tCrosspatch\tVOCALION\t3986\tDAL249\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU055503.mp3\tGlenn Miller & His Orchestra\tCrosstown (vjack Lathrop)\tBLUEBIRD\t10832\t055503\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPcjb.mp3\tSonny Terry\tCrow Jane Blues\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER20236.mp3\tJay Mcshann & His Orchestra\tCrown Prince Boogie\tMERCURY\t8014\t20236\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4870.mp3\tRuss Morgan And His Orchestra\tCruisin' Down The River\tDECCA\t24568\tL4870\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15394x.mp3\tJack Smith\tCruising Down The River\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S6.mp3\tBlue Barron And His Orchestra\tCruising Down The River\tMGM\t10346A\t49S6\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO40373.mp3\tFrankie Carle\tCruising Down The River\tCOLUMBIA\t38411\tCO40373\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_028.mp3\tJack Smith\tCruising Down The River\tCapitol\t15372\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_292.mp3\tAmes Brothers, The Feat. Roy Ross Orchestra\tCruising Down The River\tCORAL\t60035\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_073.mp3\tFrankie Carle And His Orchestra Feat. Marjorie Hughes And Sunrise Serenaders\tCruising Down The River\tCOLUMBIA\t38411\tCO40373\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76099.mp3\tArtie Shaw And His Gramercy Five\tCrumbum\tDECCA\t27196\t76099\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/OKECO46970-1.mp3\tJohnnie Ray\tCry\tOKEH\t6840\tCO46970-1\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_185.mp3\tFour Knights\tCry\tCapitol\t1875\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_235.mp3\tGeorgia Gibbs\tCry\tMERCURY\t5749\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_076.mp3\tEileen Barton\tCry\tCoral\t60592\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480504.mp3\tBenny Golson Quintet\tCry A Blue Tear\tRiverside\tRLP12-290\t\t1958\tCurtis Fuller (tb), Benny Golson (ts), Barry Harris (p), Jymie Merritt (sb), Philly Joe Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1233-1.mp3\tGene Krupa & His Orchestra\tCry And You Cry Alone\tCOLUMBIA\t36784\tHCO1233-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_143.mp3\tBonnie Sisters\tCry Baby\tRainbow\t328\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2866.mp3\tJoe Turner & Freddie Slack 3\tCry Baby Blues\tDECCA\t8606\tDLA2866\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_070.mp3\tJulie London\tCry Me A River\tLiberty\t55006\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/MER3132-3.mp3\tFrankie Laine\tCry Of The Wild Goose\tMERCURY\t5363\t3132-3\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC021673-1.mp3\tLarry Clinton And His Orchestra\tCry, Baby, Cry\tVICTOR\t25819\t021673-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_008.mp3\tLarry Clinton And His Orchestra Feat. Bea Wain\tCry, Baby, Cry\tVICTOR\t25819\t021673-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S3155.mp3\tLionel Hampton & His Orchestra\tCryin'\tMGM\t11285\t51S3155\t1951\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN8331-2.mp3\tWillie Creager And His Orchestra\tCryin' Blues\tBANNER\t6226\t8331-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_154.mp3\tRuth Etting\tCryin' For The Carolines\tCOLUMBIA\t2073 D\tW149706-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS9231-2.mp3\tCliquot Club Eskimoes\tCryin' For The Carolines (vsl)\tCBS\tPE15265\t9231-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053436.mp3\tJimmy Yancey\tCryin' In My Sleep\tBLUEBIRD\t8630\t053436\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62069-A.mp3\tChick Webb & His Orchestra\tCryin' Mood\tDECCA\t1273\t62069-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06413.mp3\tFats Waller And His Rhythm\tCryin' Mood\tVICTOR\t25551\t06413\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27419.mp3\tJoshua White & Carolinians\tCryin' Who? Cryin' You\tCOLUMBIA\t35561\t27419\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL35561.mp3\tJoshua White & Carolinians\tCryin' Who? Cryin' You\tCOLUMBIA\t35561\t27419\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93815.mp3\tJay Mcshann Quartet\tCryin' Won't Make Me Stay\tDECCA\t8623\tC93815\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-3155.mp3\tLionel Hampton And His Orchestra\tCrying\tMGM\t11285\t51-S-3155\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141826.mp3\tArt Gillam\tCrying Again\tCOLUMBIA\t771 D\tW141826\t1926\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC91230.mp3\tKokomo Arnold\tCrying Blues\tDECCA\t7431\t91230\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_038.mp3\tWaring's Pennsylvanians\tCrying For The Carolines\tVICTOR\t22272\t58169-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_134.mp3\tBen Bernie And His Orchestra\tCrying For The Carolines\tBRUNSWICK\t4665\t31679\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU31679.mp3\tBen Bernie & His Orchestra\tCrying For The Carolines (v D R)\tBRUNSWICK\t4665\t31679\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36144-3.mp3\tGus Edwards & His Orchestra\tCrying For The Moon\tVICTOR\t20167B\t36144-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-5368x.mp3\tJune Valli\tCrying In The Chapel\tRCA\t20-5368\t20-5368x\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC84695.mp3\tElla Fitzgerald\tCrying In The Chapel\tDECCA\t28762\t84695\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC84672.mp3\tRex Allen\tCrying In The Chapel\tDECCA\t28758\t84672\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_080.mp3\tOrioles\tCrying In The Chapel\tJUBILEE\t5122\tJB1214\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_058.mp3\tRex Allen\tCrying In The Chapel\tDECCA\t28758\t84672\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_030.mp3\tJune Valli\tCrying In The Chapel\tRCA\t20-5368\t20-5368x\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_113.mp3\tElla Fitzgerald Feat. Bill Doggett's Orchestra\tCrying In The Chapel\tDECCA\t28762\t84695\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_044.mp3\tDarrell Glenn\tCrying In The Chapel\tValley\t105\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26435-A.mp3\tTeddy Wilson\tCrying My Soul Out For You\tCOLUMBIA\t35372\t26435-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10275-2.mp3\tSam Lanin & His Orchestra\tCrying Myself To Sleep (vik)\tBANNER\t32048\t10275-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480751.mp3\tWoody Herman & His Orch.\tCrying Sands\tWorld\t7089/7098\t\t1944\tCappy Lewis, Bobby Guyer, Ray Wetzel, Ben Stabler, Nick Travis (tp), Eddie Bert, Al Mastren, Ed Kiefer (tb), Woody Herman (cl, as), Johnny Bothwell, Chuck DiMaggio (as), Allen Eager, Pete Mondello, Ben Webster (ts), Skippy DeSair (bar), Ralph Burns (p), Hy White (g), Chubby Jackson (sb), Cliff Leeman (dm)\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1059.mp3\tTed Daffan's Texans\tCrying The Blues Again\tOKEH\t5741\tDAL1059\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh091.mp3\tJoe Loss And His Orchestra\tCryin My Heart Out For You (v Anne Lenner)\tHMV\tBD-5109\tOEA-3852-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_095.mp3\tAndrews Sisters And Carmen Miranda\tCuanto La Gusta\tDECCA\t24479\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480836.mp3\tCarmen Miranda, The Andrews Sisters And Vic Schoen's Orchestra\tCuanto La Gusta\tDECCA\t24479-A\tL-4588\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4588.mp3\tCarmen Miranda And Andrew Sister\tCuanto La Gusto\tDECCA\t24479\tL4588\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_277.mp3\tXavier Cugat And His Waldorf-astoria Orchestra\tCuanto Le Gusta\tCOLUMBIA\t38239\tHCO3095\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU042175.mp3\tCharlie Barnet And His Orchestra\tCuban Boogie Woogie\tBLUEBIRD\t10479\t042175\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68546.mp3\tAndy Kirk & Clouds Of Joy\tCuban Boogie Woogie\tDECCA\t3663A\t68546\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec68546-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tCuban Boogie Woogie\tDecca\t3663\t68546-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC70616.mp3\tPaul Whiteman & His Orchestra\tCuban Love Song\tVICTOR\t22834\t70616\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_116.mp3\tRuth Etting\tCuban Love Song\tCOLUMBIA\t2580\tW152038-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/COL79353-2.mp3\tArt Hickman's Orchestra\tCuban Moon\tCOLUMBIA\tA-2982\t79353-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU4072.mp3\tCarl Fenton And His Orch\tCuban Moon\tBRUNSWICK\t2048\t4072\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_026.mp3\tCarl Fenton And His Orchestra\tCuban Moon\tBRUNSWICK\t2048\t4072\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec62337-A.mp3\tLouis Armstrong And His Orchestra\tCuban Pete\tDecca\t1353\t62337-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_093.mp3\tFreddie Slack And His Orchestra\tCuban Sugar Mill\tCapitol\t15239\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCL5707.mp3\tLecuona Cuban Boys\tCubanakan\tCOLUMBIA\t36249\tCL5707\t\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI8776.mp3\tYoung And Griselle (piano Duet)\tCubist Foxtrot\tEDISON\t\t8776\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_073.mp3\tKay Kyser And His Orchestra\tCuckoo In The Clock\tCBS\tBR8312\t24021\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CON24093-2.mp3\tRed Norvo & His Orchestra\tCuckoo In The Clock (v M. Bailey)\tCONQUEROR\t9186\t24093-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU033609.mp3\tGlenn Miller & His Orchestra\tCuckoo In The Clock (vmh)\tBLUEBIRD\t10145\t033609\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_144.mp3\tKen Griffin\tCuckoo Waltz\tCOLUMBIA\t40469\tCCO5569\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70285.mp3\tRonnie Gaylord\tCuddle Me\tMERCURY\t70285\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_081.mp3\tRonnie Gaylord\tCuddle Me\tMERCURY\t70285\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_120.mp3\tKay Armen Feat. The Balladiers\tCuddle Up A Little Closer, Lovey Mine\tDECCA\t18568B\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu060351-1.mp3\tBenny Carter And His Orchestra\tCuddle Up, Huddle Up\tBluebird\tB-11197\t060351-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D232A.mp3\tXavier Cugat And His Orchestra\tCui Cui\tV-DISC\t232A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE80751.mp3\tWilliamson Bros & Curry\tCumberland Gap\tOKEH\t45108\t80751\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402507.mp3\tFrank Hutchinson\tCumberland Gap\tOKeh\t45570\t402507\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146001-1.mp3\tGid Tanner's Skillet Lickers\tCumberland Gap\tCOLUMBIA\t15303 D\tW146001-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVSLA5116.mp3\tJohnny Otis Orch And Beltones\tCupid's Boogie (vlittle Esther-mel Walker)\tSAVOY\t750B\tSLA5116\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28513.mp3\tCab Calloway & His Orchestra\tCupid's Nightmare\tOKEH\t6035\t28513\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/KeyHL-26-2.mp3\tCharlie Shavers Quintet\tCurry In A Hurry\tKeynote\t1305\tHL-26-2\t1944\tCharlie Shavers t, Tab Smith as, Earl Hines p,Al Lucas b, Jo Jones d\nhttp://www.jazz-on-line.com/a/mp3c/BRU21786-7.mp3\tClarence Williams Washboard Bd\tCushion Foot Stomp\tBRUNSWICK\t7000\t21786-7\t1927\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic1192.mp3\tSousa's Band\tCuster's Last Charge\tVictor\t1192\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67650.mp3\tLouis Armstrong & His Orch.\tCut Off My Legs And Call Me Shorty\tDECCA\t3235B\t67650\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81111-4.mp3\tTed Lewis & His Jazz Band\tCut Yourself A Piece Of Cake\tCOLUMBIA\tA-3944\t81111-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1795.mp3\tBing Crosby - J.s.trotter\tCynthia\tDECCA\t3257B\tDLA1795\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3332-A.mp3\tDon Byas Quartet\tCynthia's In Love\tSAVOY\t625B\tS3332-A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_211.mp3\tTex Beneke And The Glenn Miller Orchestra Feat. Artie Malvin, Lillian Lane And The Crew Chiefs\tCynthia's In Love\tRCA Victor\t1858\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D203B1.mp3\tCurtis Bay Coast Guard Philharmonicas\tCzardas\tV-DISC\t203B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU85499-2.mp3\tFrank Blackwell\tD Blues\tBLUEBIRD\t5914\t85499-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/VicD9VB-20.mp3\tLucky Millinder And His Orchestra\tD Natural Blues\tVictor\t20-3351\tD9VB-20\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145764-3.mp3\tFletcher Henderson's Orchestra\tD' Natural Blues\tCOLUMBIA\t1543 D\tW145764-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL123DBB.mp3\tLester Young\tD.b Blues\tALLADDIN\t123\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47037.mp3\tSammy Kaye\tDaddy\tCOLUMBIA\t39583\tCO47037\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE30573.mp3\tCharioteers\tDaddy\tOKEH\t6247\t30573\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC063320.mp3\tSwing And Sway With Sammy Kaye\tDaddy\tVICTOR\t27391A\t063320\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2395.mp3\tAndrew Sisters\tDaddy\tDECCA\t3821A\tDLA2395\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_139.mp3\tJoan Merrill\tDaddy\tBluebird\t11171\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/RegW-1256-W.mp3\tTimmie Rogers And His All Star Orchestra\tDaddy - O\tRegis\t7001\tW-1256-W\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU45095.mp3\tJimmie Rodgers\tDaddy And Home\tBLUEBIRD\t5991\t45095\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/ManW-1262-W.mp3\tBenny Carter And His Orchestra\tDaddy Daddy\tManor\t1004\tW-1262-W\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR20878.mp3\tMa Rainey\tDaddy Goodbye Blues\tPARAMOUNT\t12963B\t20878\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16109.mp3\tAustin Allen\tDaddy Park Your Car\tARC\tVO2853z\t16109\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2501-2.mp3\tGene Ammons & His Sextet\tDaddy Sauce's Airlines\tMERCURY\t8145\t2501-2\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_1005_02.mp3\tLee Morse\tDaddy Your Mama Is Lonesome For You\tPerfect\t11596B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0600_02.mp3\tLee Morse\tDaddy's Girl\tPerfect\t11623B\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL5307.mp3\tThe Mills Brothers\tDaddy's Little Girl\tDECCA\t29564\tL5307\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_051.mp3\tMills Brothers\tDaddy's Little Girl\tDECCA\t24872\tL5307\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_015.mp3\tByron G. Harlan\tDaddy's Little Girl\tVICTOR\t4604\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3a/ATLA870.mp3\tRuth Brown\tDaddy, Daddy\tATLANTIC\t973\t870\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC90716.mp3\tGeorgia White\tDaddy, Let Me Lay It On You\tDECCA\t7323B\tC90716\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_096.mp3\tHenry Burr\tDaddy, You've Been A Mother To Me\tVictor\t18656\t23556\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC23556.mp3\tHenry Burr\tDaddy, You've Been A Mother To Me\tVICTOR\t18656\t23556\t1919\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC70022.mp3\tDick Robertson And His Orch\tDaddy, You've Been A Mother To Me\tDECCA\t4167B\t70022\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4634.mp3\tLouis Jordan\tDaddy-o\tDECCA\t24502\tL4634\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_112.mp3\tBonnie Lou\tDaddy-o\tKing\t4835\tK4020-C2\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_077.mp3\tFontane Sisters\tDaddy-o\tDot\t15428\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5383.mp3\tGeorgie Auld & His Orchestra\tDaily Double\tMUSICRAFT\t15059\t5383\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP6534-3.mp3\tPete Daily\tDaily Double\tCAPITOL\t1238\t6534-3\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_197.mp3\tEddy Howard And His Orchestra\tDainty Brenda Lee\tMERCURY\t5208\t2011\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65381.mp3\tWoody Herman & His Orchestra\tDallas Blues\tDECCA\t2629A\t65381\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC403494-C.mp3\tLouis Armstrong & His Orchestra\tDallas Blues\tVOCALION\t3025\t403494-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU101199-1.mp3\tWingy Manone & His Orchestra\tDallas Blues\tBLUEBIRD\t6375\t101199-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC82516-1.mp3\tIsham Jones And His Orchestra\tDallas Blues\tVictor\t24649\t82516-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0619_01.mp3\tLee Morse\tDallas Blues\tPerfect\t11582A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Col151397-3.mp3\tTed Lewis And His Band\tDallas Blues\tColumbia\t2527-D\t151397-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/BruC-6430-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tDallas Blues\tBrunswick\t6129\tC-6430-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403494-C.mp3\tLouis Armstrong & His Orchestra\tDallas Blues (vla)\tOKeh\t8774\t403494-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC77026-2.mp3\tDuke Ellington & His Orchestra\tDallas Doings\tVICTOR\t24431\t77026-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_165.mp3\tEddy Duchin And His Orchestra\tDames\tVictor\t24666\t80620-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC80620-1.mp3\tEddy Duchin & His Orchestra\tDames\tVICTOR\t24666\t80620-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh048.mp3\tAmbrose And His Orchestra\tDames (v Sam Browne)\tDecca\tF-5302\tTB-1706-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU56536-2.mp3\tJones & Collins Astoria 8\tDamp Weather Blues\tBLUEBIRD\t10952\t56536-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COL100595.mp3\tJackson Pavey & Corn Shuckers\tDance All Night With A Bottle In Your Hand\tCOLUMBIA\tVE2516\t100595\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic21801d.mp3\tRoger Wolfe Kahn & His Orchestra\tDance Little Lady\tVictor\t21801\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC48408-3.mp3\tRoger Wolfe Kahn & His Orchestra\tDance Little Lady (v F B)\tVICTOR\t21801\t48408-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47308.mp3\tArthur Godfrey\tDance Me Loose\tCOLUMBIA\t39632\tCO47308\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_044.mp3\tArthur Godfrey\tDance Me Loose\tCOLUMBIA\t39632\tCO47308\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_311.mp3\tFabian Andre And His Orchestra\tDance Of An Ear Of Corn\tCOLUMBIA\t35476\tWC2967\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23223-1.mp3\tHorace Heidt & Musical Knights\tDance Of The Blue Danube\tCBS\tBR8203\t23223-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62045.mp3\tLes Brown & His Band Reknown\tDance Of The Blue Devils\tDECCA\t1231\t62045\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478326.mp3\tJerry Murad And The Harmonicats\tDance Of The Comedians\tUniversal Records\t\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic16048d.mp3\tDarius Lyons\tDance Of The Fairies\tVictor\t16048\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU056401.mp3\tLarry Clinton And His Orchestra\tDance Of The Flowers\tBLUEBIRD\t10911\t056401\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D87.mp3\tCount Basie & His Orchestra\tDance Of The Gremlins\tV-DISC\t034\t87\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3516x.mp3\tSpike Jones\tDance Of The Hours\tRCA\t20-3516\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU1568a.mp3\tBud Powell's Modernists\tDance Of The Infidels\tBLUENOTE\t1568\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/ARCB12755-A.mp3\tCasa Loma Orchestra\tDance Of The Lame Duck\tARC\tBR6513\tB12755-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14362A.mp3\tRed Norvo & His Orchestra\tDance Of The Octopus\tBRUNSWICK\t6906\t14362A\t1933\t\nhttp://www.78-tours.net/mp3/TEL13692.mp3\tYma Sumac With Orchestra\tDance Of The Winds\tTELEFUNKEN CAPITOL\t15649-412\tPart. 13.692\t\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480837.mp3\tCarmen Miranda And The Bando Da Lua\tDance Rumba\tODEON\t\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOri1729.mp3\tLarry Holton & Boston Society Orchestra\tDance The Night Away\tOriole\t1729\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3535-A.mp3\tRuss Morgan And His Orchestra\tDance With A Dolly\tDECCA\t18625\tL3535-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D331A.mp3\tClyde Lucas And His Orchestra\tDance With A Dolly\tV-DISC\t331A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu10582.mp3\tTony Pastor & His Orchestra\tDance With A Dolly (buffalo Girl)\tBluebird\t10582\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh157.mp3\tGeraldo And His Orchestra\tDance With A Dolly (v Johnny Green & Three Boys And A Girl)\tParlophone\tF-2048\tCE-11285-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_010.mp3\tGeorgia Gibbs\tDance With Me Henry (wallflower)\tMercury\t70572\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/MERYB11240-7.mp3\tGeorgia Gibbs\tDance With Me, Henry\tMERCURY\t70572\tYB11240-7\t\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81445-2.mp3\tThe Georgians\tDancin' Dan\tColumbia\t62-D\t81445-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_131.mp3\tTeresa Brewer Feat. Jack Pleis Orchestra\tDancin' With Someone (longin' For You)\tCoral\t60953\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic58584-2.mp3\tHerny ''red'' Allen And His New York Orchestra\tDancing Dave\tVictor\tV-38121\t58584-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COL16273.mp3\tMills' Blue Rhythm Band\tDancing Dogs\tCOLUMBIA\t3044 D\t16273\t\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-16273-1.mp3\tMills Blue Rhythm Band\tDancing Dogs\tColumbia\t3044-D\tCO-16273-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_095.mp3\tClub Royal Orchestra\tDancing Fool\tVictor\t18923\t26652-4\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/COM29056.mp3\tEddie Condon & His Band\tDancing Fool\tCOMMODORE\t536\t29056\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151578-2.mp3\tBen Selvin And His Orchestra\tDancing In The Dark\tCOLUMBIA\t2473 D\tW151578-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/MERC442-5.mp3\tCharlie Parker String Ensemble\tDancing In The Dark\tMERCURY\t11068\tC442-5\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC69624-1.mp3\tWaring's Pennsylvanians\tDancing In The Dark\tVICTOR\t22708\t69624-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC055256.mp3\tArtie Shaw And His Orchestra\tDancing In The Dark\tVICTOR\t27335\t055256-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47365.mp3\tErroll Garner (piano)\tDancing In The Dark\tCOLUMBIA\t39746\tCO47365\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUE37086.mp3\tBing Crosby\tDancing In The Dark\tBRUNSWICK\t6169\tE37086\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1897_014.mp3\tSousa's Band\tDancing In The Dark\tBERLINER\t0114\t114\t1897\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_213.mp3\tArtie Shaw And His Orchestra\tDancing In The Dark\tVICTOR\t27335\t055256\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_037.mp3\tBing Crosby\tDancing In The Dark\tBRUNSWICK\t6169\tE37086\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA8.mp3\tRuth Etting\tDancing In The Moonlight\tBRUNSWICK\t6719\tLA8\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC81346-2.mp3\tRudy Vallee & His Ct.yankees\tDancing In The Moonlight\tVICTOR\t24558\t81346-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_170.mp3\tRudy Vallee And His Connecticut Yankees\tDancing In The Moonlight\tVICTOR\t24558\t81346-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA2355.mp3\tOrrin Tucker And His Orchestra\tDancing On A Dime\tCOLUMBIA\t35744\tLA2355\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC22912.mp3\tJack Hylton & His Orchestra\tDancing On The Ceiling\tVICTOR\t22912\tU.K.\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1090.mp3\tArtie Shaw And His Orchestra\tDancing On The Ceiling\tRCA\t20-1745\tD5VB1090\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/CON11140-2.mp3\tSmith Ballew And His Orchestra\tDancing On The Ceiling (vsb)\tCONQUEROR\t7928\t11140-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC43664-1.mp3\tPaul Whiteman & His Orchestra\tDancing Shadows\tVICTOR\t21431\t43664-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC40230-3.mp3\tPaul Whiteman & His Orchestra\tDancing Tambourine\tVICTOR\t20972A\t40230-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA906.mp3\tBing Crosby\tDancing Under The Stars\tDECCA\t25012\tDLA906\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruDLA906-A.mp3\tLani Mcintyre And His Hawaiians\tDancing Under The Stars\tBrunswick\tE-02485  \tDLA906-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_122.mp3\tHenry King And His Orchestra\tDancing With My Shadow\tARC\tCO2992D\t16477\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150561.mp3\tRuth Etting\tDancing With Tears In My Eyes\tCOLUMBIA\t2216 D\tW150561\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COL195106.mp3\tBen Selvin & His Orchestra\tDancing With Tears In My Eyes\tCOLUMBIA\t4191X\t195106\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_002.mp3\tNat Shilkret And The Victor Orchestra\tDancing With Tears In My Eyes\tVICTOR\t22425B\t62218-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_102.mp3\tRuth Etting\tDancing With Tears In My Eyes\tCOLUMBIA\t2216 D\tW150561\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC62218-2.mp3\tNat Shilkret And His Orchestra\tDancing With Tears In My Eyes (vlj)\tVICTOR\t22425B\t62218-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe404033-C.mp3\tJoe Venuti's New Yorkers\tDancing With Tears In My Eyes (vsb)\tOKeh\t41427\t404033-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU15148-49.mp3\tIsham Jones & His Orchestra\tDanger\tBRUNSWICK\t2894\t15148-49\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037687.mp3\tCharlie Barnet & His Orchestra\tDanger In The Dark (v L T)\tBLUEBIRD\t10336\t037687\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_086.mp3\tJaye P. Morgan\tDanger! Heartbreak Ahead\tRCA Victor\t6016\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCLA1376.mp3\tLouis Prima New Orleans Gang\tDanger, Love At Work\tVOCALION\t3628\tLA1376\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC59695-3.mp3\tHelen Kane\tDangerous Nan Mcgrew\tVICTOR\t22407\t59695-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046787.mp3\tGlenn Miller & His Orchestra\tDanny Boy\tBLUEBIRD\t10612\t046787\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2504.mp3\tBing Crosby\tDanny Boy\tDECCA\t18570B\tDLA2504\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/ASCT6.mp3\tArt Tatum\tDanny Boy\tASCH\t356-3\tT6\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36703.mp3\tCount Basie\tDanny Boy\tCOLUMBIA\t39075\tCO36703\t\t\nhttp://www.jazz-on-line.com/a/mp3d/BluST-2087-2.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tDanse Norvgienne\tBlue Star\t38\tST-2087-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC055099.mp3\tArtie Shaw And His Orchestra\tDanza Lucumi\tVICTOR\t27354\t055099-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055099-1.mp3\tArtie Shaw And His Orchestra\tDanza Lucumi\tVictor\t27354\t055099-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDTB3528.mp3\tQuintet Of Hot Club Of France\tDaphne\tDECCA\t23152\tDTB3528\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDTB-3528-1.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tDaphn\tDECCA\tF-6769\tDTB-3528-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-120-1.mp3\tDjango's Musict\tDaphn\tSWING\t82\tOSW-120-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64232.mp3\tBob Howard & His Orchestra\tDapper Dan\tDECCA\t1958A\t64232\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_055.mp3\tFrank Crumit\tDapper Dan\tCOLUMBIA\tA-3477\t79944\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79944.mp3\tFrank Crumit\tDapper Dan (von Tilzer)\tCOLUMBIA\tA-3477\t79944\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78839-2.mp3\tPrince's Dance Orchestra\tDardanella\tCOLUMBIA\tA2851\t78839-2\t1919\t\nhttp://www.78-tours.net/mp3/LONDR9014.mp3\tAmbose And His Orchestra\tDardanella\tLONDON\t120\tDR.9014 B\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC23344-3.mp3\tSelvin's Orchestra\tDardanella\tVICTOR\t18633\t23344-3\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41683-2.mp3\tPaul Whiteman & His Orchestra\tDardanella\tVICTOR\t25238A\t41683-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC75256.mp3\tGlen Gray's Casa Loma Orch.\tDardanella\tVICTOR\t24256A\t75256\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/PUR606.mp3\tBen Selvin's Novelty Orch.\tDardanella\tPURITAN\t20001\t606\t1919\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC16786-3.mp3\tVic Berton And His Orchestra\tDardanella\tVOCALION\t2915\t16786-3\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC24344.mp3\tBilly Murray-edward Smalle\tDardanella Blues\tVICTOR\t18688\t24344\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_315.mp3\tHamish Menzies\tDare I?\tDECCA\t28811\t84896\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38682-1.mp3\tRichard M Jones Jazz Wizards\tDark Alley\tVICTOR\t20812A\t38682-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048909.mp3\tCharlie Barnet & His Orchestra\tDark Avenue\tBLUEBIRD\t10774\t048909\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480773.mp3\tBen Webster & His Orch.\tDark Corners\tHaven\t803\th-1937\t1946\tLeonhard Graham (tp), Tony Scott (cl), Ben Webster (ts), Sadik Hakim (p), Bill De Arango (g), John Simmons (sb), Sid Catlett (dm)\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1292-1.mp3\tGene Krupa And His Orchestra\tDark Eyes\tCOLUMBIA\t38147\tHCO1292-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22369-1.mp3\tMaxine Sullivan & Her Orchestra\tDark Eyes\tVOCALION\t4015\t22369-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70414.mp3\tHazel Scott (piano)\tDark Eyes\tDECCA\t18342A\t70414\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06623.mp3\tTommy Dorsey & His Orchestra\tDark Eyes\tVICTOR\t25556\t06623\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68636-A.mp3\tJack Teagarden & His Orchestra\tDark Eyes\tDECCA\t3701A\t68636-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142852-3.mp3\tDixie Washboard Band (cw)\tDark Eyes\tCOLUMBIA\t14188 D\tW142852-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic021057-2.mp3\tMaxine Sullivan With Claude Thornhill And Orchestra\tDark Eyes\tVictor\t25810\t021057-2  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_194.mp3\tTommy Dorsey And His Orchestra Feat. Bud Freeman (tenor Sax)\tDark Eyes\tVICTOR\t25556\t06623\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-17847.mp3\tTed Heath And His Music; Don Lusher, Trombone (his 89th London Palladium Sunday Concert, April 12, 1\tDark Eyes\tDECCA-LONDON\tEFF.289-1 (BEP 6121)\tDR-17847\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D203A2.mp3\tCurtis Bay Coast Guard Philharmonicas\tDark Eyes And El Choclo\tV-DISC\t203A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SAV5781.mp3\tSlam Stewart Quartet\tDark Eyesky\tSAVOY\t537B\t5781\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64746-A.mp3\tCount Basie And His Orchestra\tDark Rapture (vocal Helen Humes)\tDECCA\t2212B\t64746-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DIA1052.mp3\tCharlie Parker\tDark Shadows\tDIAL\t1014\t1052\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_015.mp3\tArthur Collins And Byron Harlan\tDark Town Strutters' Ball\tCOLUMBIA\tA-2478\t77595\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145320-1.mp3\tBlind Willie Johnson\tDark Was The Night\tCOLUMBIA\t14303 D\tW145320-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/AJA31510.mp3\tFletcher Henderson's Orchestra\tDarktown Has A Gay White Way\tAJAX\tAJX17023\t31510\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC33196-7.mp3\tSeattle Harmony Kings\tDarktown Shuffle\tVICTOR\t19772B\t33196-7\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COL20743.mp3\tRed Mckenzie Mound City Bb\tDarktown Strutter's Ball\tCOLUMBIA\t36281\t20743\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67062-B.mp3\tGeorge Wettling Rhythm Kings\tDarktown Strutter's Ball\tDECCA\t18045A\t67062-B\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COL77595.mp3\tA.collins And B.harlan\tDarktown Strutters Ball\tCOLUMBIA\tA-2478\t77595\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77086-3.mp3\tOriginal Dixieland Jazz Band\tDarktown Strutters Ball\tCOLUMBIA\tA-2297\t77086-3\t1917\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-2297.mp3\tOriginal Dixieland Jazz Band\tDarktown Strutters Ball\tCOLUMBIA\tA-2297\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_135.mp3\t(six) Brown Brothers\tDarktown Strutters' Ball\tVICTOR\t18376\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh087.mp3\tThe Royal Air Force Dance Orchestra (dir. Sgt. Jimmy Miller)\tDarktown Strutters Ball\tDecca\tF-7968\tDR-6087-3\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18779A.mp3\tLucky Millinder & His Orchestra\tDarlin'\tDECCA\t18779A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72178.mp3\tLucky Millinder And His Orchestra\tDarlin'\tDecca\t18779\t72178\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/COL79470-2.mp3\tArt Hickman's Orchestra\tDarling\tCOLUMBIA\tA-3334\t79470-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC60126-A.mp3\tIsham Jones And His Orchestra\tDarling - Vocal Woody Herman\tDecca\t610\t60126-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP3027x.mp3\tNat King Cole\tDarling Je Vous Aime Beaucoup\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D109A.mp3\tBing Crosby\tDarling Je Vous Aime Beaucoup\tV-DISC\t109A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_060.mp3\tNat ''king'' Cole\tDarling Je Vous Aime Beaucoup\tCapitol\t3027\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU046125.mp3\tGolden Gate Jubilee Qt\tDarling Nellie Gray\tBLUEBIRD\t8565\t046125\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67355.mp3\tMills Brothers\tDarling Nellie Gray\tDECCA\t3705A\t67355\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC3705A.mp3\tMills Brothers\tDarling Nellie Gray\tDECCA\t3705A\t67355\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21938-1.mp3\tMaxine Sullivan (orchestra Under Direction Claude Thornhill)\tDarling Nellie Gray\tVocalion\t3885\t21938-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62117-AB.mp3\tMills Bros & Louis Armstrong\tDarling Nellie Grey\tDECCA\t1245\t62117-A;B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec62117-A.mp3\tLouis Armstrong With The Mills Brothers\tDarling Nelly Gray\tDecca\t1245\t62117-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_334.mp3\tLouis Armstrong And Mills Brothers\tDarling Nelly Gray\tDecca\t1245\t62117-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19896.mp3\tArtie Shaw And His Orchestra\tDarling Not Without You\tBRUNSWICK\t7741\tB-19896-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_333.mp3\tWayne King And His Orchestra\tDarling, How You Lied\tVictor\t27575\t064658\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/PATCPT-1844-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tDarling, Je Vous Aime Beaucoup\tPath\tPA-538\tCPT-1844-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D166A1.mp3\tBing Crosby\tDarling, Je Vous Aime Beaucoup\tV-DISC\t166A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_162.mp3\tHildegarde\tDarling, Je Vous Aime Beaucoup\tDECCA\t23218\t68987\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26287.mp3\tBenny Goodman And His Orchestra\tDarn That Dream\tCOLUMBIA\t35331\t26287-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4079.mp3\tDoris Day\tDarn That Dream\tCOLUMBIA\t38887\tHCO4079\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD140.mp3\tGeorgie Auld & His Orchestra\tDarn That Dream\tDISC\t109\tD140\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_239.mp3\tTommy Dorsey And His Orchestra Feat. Anna Boyer\tDarn That Dream\tVICTOR\t26433\t044254\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480439.mp3\tArt Farmer And Benny Golson\tDarn That Dream\tUnited Artists\tUAL4007\t\t1958\tArt Farmer, T, Flh, Benny Golson, Ts, Addison Farmer, B, Bill Evans, P, Dave Bailey, D, Gigi Gryce, Ar\nhttp://www.jazz-on-line.com/a/mp3w/1940_060.mp3\tBenny Goodman And His Orchestra Feat. Mildred Bailey, V\tDarn That Dream\tCOLUMBIA\t35331\t26287-A\t1939\tZiggy Elman, Jimmy Maxwell, Johnny Martell (tp), Red Ballard, Vernon Brown, Ted Vesley (tb), Benny Goodman (cl), Toots Mondello, Buff Estes (as), Jerry Jerome, Bus Bassey (ts), Fletcher Henderson (p), Charlie Christian (elg), Artie Bernstein (sb), Nick Fatool (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DIA1025.mp3\tDodo Marmosa Trio\tDary Departs\tDIAL\t1025\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/GUIG603.mp3\tCozy Cole & His Quintette\tDat's Love (the Habanera) (vjune Hawkins)\tGUILDE\t118\tG603\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER213-1.mp3\tBuddy Rich & His Orchestra\tDateless Brown\tMERCURY\t2068\t213-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143534-2.mp3\tCharleston Chasers (nichols)\tDavenport Blues\tCOLUMBIA\t909 D\tW143534-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/OKeW80501-B.mp3\tMiff Mole And His Little Molers\tDavenport Blues\tOKeh\t40848\tW80501-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030170.mp3\tBunny Berigan & His Orchestra\tDavenport Blues\tVICTOR\t26121B\t030170\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030328.mp3\tTommy Dorsey & His Orchestra\tDavenport Blues\tVICTOR\t26135\t030328\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN12141.mp3\tBix And His Rhythm Jugglers\tDavenport Blues\tGENNETT\t5654\t12141\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC38876.mp3\tAdrian Rollini And His Orchestra\tDavenport Blues\tDECCA\t359A\t38876\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70659-1.mp3\tJimmie Davis\tDavis' Salty Dog\tVICTOR\t23674\t70659-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS24018-2.mp3\tHorace Heidt And Musical Knights\tDawn Of A New Day\tCBS\tBR8313\t24018-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC5587.mp3\tMary Johnson\tDawn Of Day Blues\tBRUNSWICK\t7153\tC5587\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC036839.mp3\tTommy Dorsey & His Orchestra\tDawn On The Desert\tVICTOR\t26246\t036839\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc23938-1.mp3\tJohn Kirby And His Orchestra\tDawn On The Desert\tVocalion\t4653\t23938-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_219.mp3\tTommy Dorsey And His Orchestra\tDawn On The Desert\tVICTOR\t26246\t036839\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO34579.mp3\tCab Calloway & His Orchestra\tDawn Time\tCOLUMBIA\t36816\tCO34579\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20923-A.mp3\tJohnny Hamp's Kentucky Serenade\tDawning\tVictor\t20923-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_0827_01.mp3\tLee Morse And Her Bluegrass Boys\tDawning\tColumbia\t1149DA\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-10046-A.mp3\tArtie Shaw And His Orchestra\tDay After Day\tBLUEBIRD\tB-10046-A\t028976-1\t1938\tVocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1520.mp3\tFrank Sinatra\tDay By Day\tCOLUMBIA\t36905\tHCO1520\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35636.mp3\tLes Brown & Doris Day\tDay By Day\tCOLUMBIA\t36945\tCO35636\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3965.mp3\tBing Crosby & Meltones\tDay By Day\tDECCA\t18746\tL3965\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_053.mp3\tFrank Sinatra\tDay By Day\tCOLUMBIA\t36905\tHCO1520\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_101.mp3\tJo Stafford\tDay By Day\tCapitol\t227\t798\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_209.mp3\tFour Freshmen\tDay By Day\tCapitol\t3154\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_212.mp3\tLes Brown And His Orchestra Feat. Doris Day\tDay By Day\tCOLUMBIA\t36945\tCO35636\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2539A.mp3\tBing Crosby\tDay Dreaming\tDECCA\t4033 A\tDLA2539A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068071.mp3\tGlenn Miller & His Orchestra\tDay Dreaming\tBLUEBIRD\t11382-A\t068071\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU22840-2.mp3\tRed Norvo & His Orchestra\tDay Dreaming (v M. Bailey)\tBRUNSWICK\t8145\t22840-2\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEWC2665.mp3\tDick Jurgens And His Orchestra\tDay Dreams Come True At Night\tOKEH\t6632\tWC2665\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC038190.mp3\tTommy Dorsey & His Orchestra\tDay In, Day Out\tVICTOR\t26339\t038190\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66000.mp3\tBob Crosby And His Orch\tDay In, Day Out\tDECCA\t2703A\t66000\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_016.mp3\tBob Crosby And His Orchestra Feat. Helen Ward\tDay In, Day Out\tDECCA\t2703A\t66000\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC075402.mp3\tTommy Dorsey And His Orchestra\tDaybreak\tVICTOR\t27974\t075402\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_069.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra\tDaybreak\tVICTOR\t27974\t075402\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_131.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tDaybreak\tDECCA\t18460A\t71059\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COL30120.mp3\tMemphis Minnie\tDaybreak Blues\tCOLUMBIA\t30120\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC77201-1.mp3\tDuke Ellington & His Orchestra\tDaybreak Express\tVICTOR\t24501A\t77201-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_294.mp3\tDuke Ellington And His Famous Orchestra\tDaybreak Express\tBRUNSWICK\t6646\t13803-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DD5VB451.mp3\tJess Stacy & His Orchestra\tDaybreak Serenade\tV-DISC\t539\tD5VB451\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_391.mp3\tArt Mooney\tDaydreams\tMGM\t12277\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2259.mp3\tBing Crosby & King's Men\tDe Camptown Races\tDECCA\t18803B\tDLA2259\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44701.mp3\tSarah Vaughan\tDe Gas Pipe, She's Leaking, Joe\tCOLUMBIA\t39124\tCO44701\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-31-1.mp3\tMezzrow - Bechet Quntet\tDe Luxe Stomp\tKing Jazz\t140\tKJ-31-1  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-226-1.mp3\tAndr Ekyan (with Django Reinhardt)\tDe Nulle Part\tSWING\t127\tOSW-226-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3206.mp3\tLouis Jordan Tympani 5\tDeacon Jones\tDECCA\t8654 B\tL3206\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36284-1.mp3\tJelly Roll Morton Red Peppers\tDead Man Blues\tVICTOR\t20252\t36284-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_214.mp3\tEddy Howard And His Orchestra\tDeadly Weapon\tMERCURY\t5663\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW143953-1.mp3\tCelestin's Tuxedo Orch\tDear Almanzoer\tCOLUMBIA\t14220 D\tW143953-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067743.mp3\tGlenn Miller & His Orchestra\tDear Arabella\tBLUEBIRD\t11326\t067743\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_463.mp3\tAudrey\tDear Elvis (page 1)\tPlus\t104\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_463b.mp3\tAudrey\tDear Elvis (page 2)\tPlus\t104\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3474.mp3\tBing Crosby & Victor Young Or.\tDear Friend\tDECCA\t40830\tL3474\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO3894.mp3\tDinah Shore\tDear Hearts And Gentle People\tCOLUMBIA\t38605\tHCO3894\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24798.mp3\tBing Crosby\tDear Hearts And Gentle People\tDECCA\t24798\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_027.mp3\tDinah Shore\tDear Hearts And Gentle People\tCOLUMBIA\t38605\tHCO3894\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_153.mp3\tDennis Day Feat. Charles Dant's Orchestra; With The Rhythmaires\tDear Hearts And Gentle People\tRCA Victor\t3102\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_258.mp3\tRalph Flanagan And His Orchestra Feat. Harry Prime\tDear Hearts And Gentle People\tBluebird\t0016\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_220A.mp3\tStan Freberg\tDear John And Marsha Letter\tCapitol\t2677\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2502.mp3\tBing Crosby\tDear Little Boy Of Mine\tDECCA\t4152B\tDLA2502\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77935.mp3\tCharles Harrison (tenor)\tDear Little Boy Of Mine\tCOLUMBIA\tA-2613\t77935\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_081.mp3\tCharles Harrison\tDear Little Boy Of Mine\tCOLUMBIA\tA-2613\t77935\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068835.mp3\tGlenn Miller & His Orchestra\tDear Mom\tBLUEBIRD\t11443-A\t068835\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA554.mp3\tBing Crosby & Ivan Ditmars\tDear Old Girl\tDECCA\t1044B\tDLA554\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA554-A.mp3\tBing Crosby Accompanied By Ivan Ditmars (piano) And The Three Cheers (vocal Trio)\tDear Old Girl\tDECCA\t1044B\tDLA554-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_016.mp3\tHaydn Quartet\tDear Old Girl\tVICTOR\t2643\t\t1904\t\nhttp://www.jazz-on-line.com/a/mp3l/COL81350.mp3\tPaul Specht And His Orchestra\tDear Old Lady\tCOLUMBIA\t27D\t81350\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO32478.mp3\tBuddy Clark\tDear Old Pal Of Mine\tCOLUMBIA\t36701\tCO32478\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW403895.mp3\tLouis Armstrong And His Orchestra\tDear Old Southland\tCOLUMBIA\t36282\tW403895\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18856.mp3\tPaul Whiteman & His Orch\tDear Old Southland\tVICTOR-\t18856\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC21003.mp3\tErskine Hawkins Bama St.coll.\tDear Old Southland\tVOCALION\t3567\t21003\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26001-5.mp3\tPaul Whiteman & His Orchestra\tDear Old Southland\tVICTOR\t18856\t26001-5\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN7622-3.mp3\tFletcher Henderson's Collegian\tDear On A Night Like This\tBANNER\t6128\t7622-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban7622-3.mp3\tFletcher Henderson's Collegians\tDear On A Night Like This\tBanner\t6128\t7622-3  \t1927\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU14072.mp3\tGene Rodemich And His Orchestra\tDear One\tBRUNSWICK\t2756A\t14072\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3b/VIC27449-6.mp3\tPaul Whiteman & His Orchestra\tDearest\tVICTOR\t19030\t27449-6\t1923\t\nhttp://www.jazz-on-line.com/a/mp3l/COL80812.mp3\tPaul Specht And His Orchestra\tDearest - You're The Nearest To My Heart\tCOLUMBIA\tA-3830\t80812\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24899y.mp3\tGuy Lombardo And His Orchestra\tDearie\tDECCA\t24899\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24873x.mp3\tRay Bolger And Ethel Merman\tDearie\tDECCA\t24873\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_103.mp3\tJo Stafford And Gordon Macrae\tDearie\tCapitol\t858\t5407\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_095poo.mp3\tGeorge Alexander\tDearie\tCOLUMBIA\tA-0469\t03378-3\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_128.mp3\tEthel Merman And Ray Bolger Feat. Sy Oliver And His Orchestra\tDearie\tDECCA\t24873\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_008.mp3\tCorrine Morgan And Haydn Quartet\tDearie\tVictor\t4393\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU075453.mp3\tAlvino Rey And His Orchestra\tDearly Beloved\tBLUEBIRD\t11579\t075453\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_081.mp3\tJohnnie Johnston\tDearly Beloved\tCapitol\t120\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC072559.mp3\tDinah Shore W Paul Weston\tDearly Beloved\tVICTOR\t27970\t072559\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3412.mp3\tBing Crosby\tDearly Beloved\tDECCA\t23679\tL3412\t1944\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11579.mp3\tAlvino Rey & His Orchestra\tDearly Beloved\tBluebird\t11579\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3h/DECEFF708-1C-1.mp3\tTed Heath And His Music\tDearly Beloved\tDECCA-LONDON\tEFF.708-1C-1 (BEP 62\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480838.mp3\tTed Heath And His Music\tDearly Beloved\tDECCA-LONDON\tEFF.708-1C-1\t\t1954\tBobby Pratt, Duncan Campbell, Bert Ezard, Eddie Blair (tp), Don Lusher, Jimmy Coombes, Ric Kennedy, Maurice Pratt (tb), Les Gilbert, Roy Willox (as), Henry Mackenzie (ts,cl), Danny Moss (ts), George Hunter (bar), Frank Horrox (p), Johnny Hawksworth (sb) , Ronnie Verrell (dm), Ted Heath (dir)\nhttp://www.jazz-on-line.com/a/mp3a/VIC074736.mp3\tGlenn Miller And His Orchestra\tDearly Beloved (vsn)\tVICTOR\t27953\t074736\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400355-B.mp3\tTom Dickson\tDeath Bell Blues\tOKeh\t8590\t400355-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14049-1.mp3\tBlind Willie (mctell)\tDeath Cell Blues\tARC\tVO2577z\t14049-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiARCVO2577z.mp3\tBlind Willie\tDeath Cell Blues\tARC\tVO2577z\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU02898-1.mp3\tFrank Tanner's Rhythm Kings\tDeath In B Flat\tBLUEBIRD\tB-6719\t02898-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS25510-1.mp3\tIda Cox And Her Allstar Band\tDeath Letter Blues\tCBS\tVO5336z\t25510-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3784-1.mp3\tBrownie Mcghee\tDeath Of Blind Boy Fuller\tOKEH\t6265\tC3784-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14048.mp3\tBlind Willie (mctell)\tDeath Room Blues\tARC\t(Reject)\t14048\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8917D.mp3\tOscar Peterson\tDebut\tMERCURY\t8917\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3233-A.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tDecatur Street Tutti\tBrunswick\t7078\tC-3233-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC60315.mp3\tRed Norvo & His Orchestra\tDecca Stomp\tDECCA\t691B\t60315\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_226.mp3\tPhil Harris\tDeck Of Cards\tRCA\t20-2821\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_250.mp3\tT. Texas Tyler\tDeck Of Cards\tStar\t1228\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU020111.mp3\tSonny Boy Williamson\tDecoration Blues\tBLUEBIRD\t7665\t020111\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04535.mp3\tTommy Dorsey & His Orchestra\tDedicated To You\tVICTOR\t25516\t04535\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61466-B.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tDedicated To You\tDecca\t1146\t61466-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_342.mp3\tElla Fitzgerald And Mills Brothers\tDedicated To You\tDECCA\t1148\t61576\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Col404599-B.mp3\tChocolate Dandies With Benny Carter\tDee Blues\tColumbia \t2543-D\t404599-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143375-2.mp3\tThe Radiolites (selvin)\tDeed I Do\tCOLUMBIA\t885 D\tW143375-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1503-A.mp3\tBunny Berigan And His Orchestra\tDeed I Do\tRCA\t20-1503-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4736.mp3\tEddie Heywood\tDeed I Do\tCOMMODORE\t578\t4736\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021041.mp3\tTommy Dorsey & His Orchestra\tDeed I Do\tVICTOR\t25815\t021041\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44118.mp3\tEarl Hines\tDeed I Do\tCOLUMBIA\t39260\tCO44118\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_336.mp3\tLena Horne\tDeed I Do\tMGM\t30395\t47S331\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_046.mp3\tJohnny Marvin\tDeed I Do\tVICTOR\t20397\t37150-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_019.mp3\tRuth Etting\tDeed I Do\tCOLUMBIA\t865 D\tW142974\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047987.mp3\tCharlie Barnet & His Orchestra\tDeed I Do (v Mary Ann Mccall)\tBLUEBIRD\t10669 B\t047987\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67699.mp3\tElla Fitzgerald & Her Orchestra\tDeedle De Dum\tDECCA\t3324B\t67699\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW145823.mp3\tPaul Ash And His Orchestra\tDeep Blue\tCOLUMBIA\t1616 D\tW145823\t1928\tD Lindley,J Valentine,J Linn tr,R Lantz,M Durso tb, P Wing,H Nettles cl,al sax,V Hayes,H Grantham,cl, tn sax,H Winston,p, P Ash,vio,H Hoffman,K Sirinsky,H Struble, vio, M Feiler,vio cello,J Davidson,bj, P Olker,br bass, A Layfield, dr Chicago, Mar 21\nhttp://www.jazz-on-line.com/a/mp3a/BLU94424.mp3\tHarry Carter\tDeep Blue Ocean Blues\tBLUEBIRD\t6210\t94424\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC48435-3.mp3\tJelly Roll Morton Peppers\tDeep Creek - Blues\tVICTOR\t38055\t48435-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70224-B.mp3\tBuddy Johnson & His Band\tDeep Down In The Miz\tDECCA\t8616\t70224-B\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC63630-2.mp3\tBix Beiderbecke And His Orch\tDeep Down South\tVICTOR\t25370\t63630-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19727d.mp3\tBusse's Buzzards\tDeep Elm\tVictor\t19727\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB11993.mp3\tEarl Hines & His Orchestra\tDeep Forest\tCOLUMBIA\t35878\tB11993\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu047056-1.mp3\tEarl Hines And His Orchestra\tDeep Forest\tBluebird\tB-10727\t047056-1\t1940\tWalter Fuller (tp,vcl) Milton Fletcher, Edward Sims (tp) George Dixon (tp,as) Edward Burke, John Ewing, Joe McLewis (tb) Omer Simeon (cl,bar) Leroy Harris (as,vcl) Jimmy Mundy, Robert Crowder (ts,arr) Earl Hines (p,dir,arr) Claude Robertson (g) Quinn Wilson (b,arr) Alvin Burroughs (d) Billy Eckstine (vcl) George Dixon (speech-1)\nhttp://www.jazz-on-line.com/a/mp3e/ColB-11993-A.mp3\tEarl Hines And His Orchestra\tDeep Forest\tColumbia\t35878\tB-11993-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480839.mp3\tTed Heath And His Music\tDeep Forest\tDECCA\tF8956\tDR-12217\t1948\tKenny Baker, Stanley Roderick, Cliff Haines, Dave Wilkins (tp), Harry Roche, Jackie Armstrong, Jack Bentley, Jimmy Coombes (tb), Les Gilbert, Reg Owen (as), Johnny Gray, Tommy Whittle (ts), Dave Shand (bar), Norman Stenfalt (p), Peter Chilver (g), Charlie Short (sb), Jack Parnell (dm), Ted Heath (dir)\nhttp://www.jazz-on-line.com/a/mp3c/BRUE32949-A.mp3\tMill's Hotsy Totsy Gang\tDeep Harlem\tBRUNSWICK\t4983\tE32949-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404010-B.mp3\tFrankie Trumbauer & His Orch Vocal Frankie Trumbauer\tDeep Harlem\tOKeh\t41431\t404010-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC35034-2.mp3\tCoon-sanders Nighthawk Orchestra\tDeep Henderson\tVICTOR\t20081A\t35034-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN8096.mp3\tJoe Candullo And His Orchestra\tDeep Hollow\tBANNER\t7192\t8096\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-10046-B.mp3\tArtie Shaw And His Orchestra\tDeep In A Dream\tBLUEBIRD\tB-10046-B\t028975-1\t1938\tVocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3c/CONM909-1.mp3\tCab Calloway & His Orchestra\tDeep In A Dream\tCONQUEROR\t9127\tM909-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECC91549.mp3\tBob Crosby & His Orchestra\tDeep In A Dream\tDECCA\t2151A\tC91549\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_044.mp3\tArtie Shaw And His Orchestra\tDeep In A Dream\tBluebird\t10046B\t028975-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-909-1.mp3\tCab Calloway And His Orchestra\tDeep In A Dream\tVocalion\t4511\tM-909-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_183.mp3\tBob Crosby And His Orchestra Feat. V/marion Mann\tDeep In A Dream\tDECCA\t2151A\tC91549\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29582-1.mp3\tCount Basie And His Orchestra\tDeep In The Blues\tOkeh\t\t29582-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU061916.mp3\tAlvino Rey And His Orchestra\tDeep In The Heart Of Texas\tBLUEBIRD\t11391\t061916\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO644.mp3\tHorace Heidt's Musical Knights\tDeep In The Heart Of Texas\tCOLUMBIA\t36525\tHCO644\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2828.mp3\tBing Crosby And Woody Herman\tDeep In The Heart Of Texas\tDECCA\t4162A\tDLA2828\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11391.mp3\tAlvino Rey & His Orchestra\tDeep In The Heart Of Texas\tBluebird\t11391\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_080.mp3\tMerry Macs\tDeep In The Heart Of Texas\tDECCA\t4136A\tDLA2817\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49925-2.mp3\tRudy Vallee's Ct.yankees\tDeep Night\tVICTOR\t21868B\t49925-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE29242.mp3\tBob Haring & His Orchestra\tDeep Night\tBRUNSWICK\t4246\tE29242\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148193-2.mp3\tRuth Etting\tDeep Night\tCOLUMBIA\t1801\tW148193-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67521.mp3\tWoody Herman & His Orchestra\tDeep Night\tDECCA\t3332A\t67521\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47018.mp3\tDuke Ellington And His Orchestra\tDeep Night\tCOLUMBIA\t39545\tCO47018-1\t1951\tJuan Tizol, Quentin ''Butler'' Jackson and Burt Wooman, trombones<br>Cat Anderson, Nelson Williams, Harold \"Shorty\" Baker (tp) Ray Nance (tp,vln,vcl) Quentin Jackson, Britt Woodman, Juan Tizol (tb) Jimmy Hamilton (cl,ts) Russell Procope (as,cl) Willie Smith (as) Paul Gonsalves (ts) Harry Carney (bar,cl,b-cl) Duke Ellington (p) Billy Strayhorn (p-1) Wendell Marshall (b) Louie Bellson (d) Al Hibbler (vcl) \nhttp://www.jazz-on-line.com/a/mp3w/1929_203.mp3\tRuth Etting\tDeep Night\tCOLUMBIA\t1801\tW148193-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_018.mp3\tRudy Vallee And His Connecticut Yankees\tDeep Night\tVICTOR\t21868B\t49925-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480374.mp3\tArt Tatum/buddy De Franco Quartet\tDeep Night\tVerve\tMGV-8229\t2677-3\t1956\tBuddy DeFranco (cl) Art Tatum (p) Red Callender (b) Bill Douglass (d)\nhttp://www.jazz-on-line.com/a/mp3t/TS480604.mp3\tArt Tatum/buddy Defranco Quartet\tDeep Night\tVerve\tMGV-8229\t2677-3\t1956\tBuddy De Franco (cl), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3a/COS6133-2.mp3\tLarry Clinton And His Orchestra\tDeep Purple\tCOSMO\t706\t6133-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC030475-1.mp3\tLarry Clinton And His Orchestra\tDeep Purple\tVICTOR\t26141\t030475-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU032964.mp3\tArtie Shaw And His Orchestra\tDeep Purple\tBLUEBIRD\t10178\t032964-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36131.mp3\tPaul Whiteman\tDeep Purple\tVICTOR\t36131\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64766.mp3\tGuy Lombardo's Royal Canadians\tDeep Purple\tDECCA\t2215B\t64766\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO45191.mp3\tSarah Vaughan\tDeep Purple\tCOLUMBIA\t39370\tCO45191\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1760-A.mp3\tArt Tatum\tDeep Purple\tDECCA\t2456A\tDLA1760-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D302B2.mp3\tMaj. Glenn Miller And The Aaftc Orchestra\tDeep Purple\tV-DISC\t302B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1733.mp3\tBing Crosby\tDeep Purple\tDECCA\t2374A\tDLA1733\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_309.mp3\tArtie Shaw And His Orchestra\tDeep Purple\tMontgomeryWard\t7957\t032964\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_192.mp3\tPaul Weston And His Orchestra\tDeep Purple\tCapitol\t15294\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_001.mp3\tLarry Clinton And His Orchestra Feat. Bea Wain\tDeep Purple\tVICTOR\t26141\t030475-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_031.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly\tDeep Purple\tDECCA\t2295A\t65004\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480505.mp3\tLionel Hampton And His Giants\tDeep Purple\tNorgran\tEPN144\t2491-5\t1955\tHarry \"Sweets\" Edison (tp), Lionel Hampton (vib), Art Tatum (p), Barney Kessel (g), John Simmons (sb), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3a/VIC29072.mp3\tMarion Anderson\tDeep River\tVICTOR\t19227\t29072\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38418-5.mp3\tPaul Robeson\tDeep River\tVICTOR\t20793A\t38418-5\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75738.mp3\tSy Oliver & His Orch.\tDeep River\tDECCA\t24936\t75738\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_240.mp3\tPaul Robeson\tDeep River\tVICTOR\t20793A\t38418-5\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOEA6388-3.mp3\tFats Waller (organ)\tDeep River (v A. Hall)\tVICTOR\t27459\tOEA6388-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/APO4110.mp3\tLuis Russell & His Orchestra\tDeep Six Blues\tAPOLLO\t1072\t4110\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73792.mp3\tBillie Holiday / Bob Haggart\tDeep Song\tDECCA\t24138\t73792\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/KEY516K-.mp3\tJosh White\tDefense Factory Blues\tKEYNOTE\t516K\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COMR4054.mp3\tJoe Sullivan (piano)\tDel Mar Rag\tCOMMODORE\t538\tR4054\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47366.mp3\tPercy Faith And His Orchestra\tDelicado\tCOLUMBIA\t39708\tCO47366\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_227.mp3\tRalph Flanagan And His Orchestra\tDelicado\tRCA VICTOR\t4706\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_015.mp3\tPercy Faith And His Orchestra\tDelicado\tCOLUMBIA\t39732\tZSP7911\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031869.mp3\tArtie Shaw And His Orchestra\tDelightful Delirium\tBLUEBIRD\t10134\t031869-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067628.mp3\tGlenn Miller & His Orchestra\tDelilah\tBLUEBIRD\t11274-B\t067628\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_227.mp3\tMcguire Sisters\tDelilah Jones\tCoral\t61627\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_097.mp3\tNat Shilkret And The Victor Orchestra\tDelishious\tVICTOR\t22902\t70995-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC70995-2.mp3\tNat Shilkret & His Orchestra\tDelishious (v P S)\tVICTOR\t22902\t70995-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLC4212-1.mp3\tGene Krupa & His Orchestra\tDeliver Me To Tennessee\tCOLUMBIA\t36591\tC4212-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/DECFO-1786-R.mp3\tDjango Reinhardt Et Son Quintette Du Hot Club De France\tDelsalle\tDECCA\t9243\tFO-1786-R\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-688-1.mp3\tJimmie Noone And His Orchestra\tDelta Bound\tVocalion \t2620\tC-688-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/ColB-12776-A.mp3\tDuke Ellington And His Famous Orchestra\tDelta Bound\tColumbia\t37298\tB-12776-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec70258-A.mp3\tSkeets Tolbert And His Orchestra\tDelta Land Blues\tDecca\t8608\t70258-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC80144-2.mp3\tDuke Ellington & His Orchestra\tDelta Serenade\tVICTOR\t24755B\t80144-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480469.mp3\tArt Farmer And Gigi Gryce\tDeltitnu\tPrestige\tLP7085\t576\t1954\tArt Farmer, T, FLh, Gigi Gryce, As, With, 2 rhythm sections, = Horace Silver or Freddie Redd, P, Addison Farmer or Percy Heath, B, Art Taylor or Kenny Clark, D\nhttp://www.jazz-on-line.com/a/mp3c/VIC035705.mp3\tLionel Hampton & His Orchestra\tDenison Swing\tVICTOR\t26233\t035705\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic035705-1.mp3\tLionel Hampton And His Orchestra\tDenison Swing\tVictor\t26233\t035705-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_307.mp3\tRosemary Clooney And Jimmy Boyd Feat. Norman Luboff\tDennis The Menace\tCOLUMBIA\t39988\tHCO10385\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145330-1.mp3\tWashington Phillips\tDenomination Blues\tCOLUMBIA\t14333 D\tW145330-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145331-2.mp3\tWashington Phillips\tDenomination Blues #2\tCOLUMBIA\t14333 D\tW145331-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/CONAUG145.mp3\tCrowder Brothers\tDepot Blues\tCONQUEROR\t8718\tAUG145\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU072525-2.mp3\tSpike Jones And City Slickers\tDer Fuehrer's Face\tBLUEBIRD\t11586A\t072525-2\t1942\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR140961-3.mp3\tUniversity Six\tDesdemona\tHARMONY\t37-H\t140961-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC48384-3.mp3\tJimmie Rodgers\tDesert Blues\tVICTOR\t40096\t48384-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/Gre3931-A.mp3\tCliff Jackson And His Krazy Kats\tDesert Blues\tGrey Gull\t1854\t3931-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/APOR-1009.mp3\tEarl Hines Sextet\tDesign For Jivin'\tAPOLLO\t357\tR-1009\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/ApoR-1009.mp3\tEarl Hines Sextet\tDesign For Jivin'\tApollo\t357\tR-1009\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/MER215-1.mp3\tBuddy Rich W Dorothy Reid\tDesperate Desmond\tMERCURY\t2060B\t215-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MERHL24.mp3\tCount Basie Kansas City 7\tDestination K.c\tMERCURY\t1106\tHL24\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1638.mp3\tSpade Cooley And His Orchestra\tDetour\tCOLUMBIA\t36935\tHCO1638\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/MER4400-5.mp3\tPatti Page W Jack Rael Orchestra\tDetour\tMERCURY\t5682\t4400-5\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS22621.mp3\tMontana Taylor\tDetroit Rocks\tCBS\tUHCA\t22621\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC068197.mp3\tArtie Shaw And His Orchestra\tDeuces Wild\tVICTOR\t27838\t068197-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-134-1.mp3\tAlix Combelle And His Swing Band\tDeux Pieds Gauches\tSwing\t85\tOSW-134-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/PARL0746.mp3\tSkip James\tDevil Got My Woman\tPARAMOUNT\t13088A\tL0746\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru16525-1.mp3\tChuck Richards With Mills Blue\tDevil In The Moon\tBrunswick\t01990\t16525-1  \t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC048481.mp3\tTommy Dorsey And His Orchestra\tDevil May Care\tVICTOR\t26593\t048481\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1951.mp3\tBing Crosby\tDevil May Care\tDECCA\t3064B\tDLA1951\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26715-A.mp3\tBenny Goodman & His Orchestra\tDevil May Care (vocal Helen Forrest)\tCOLUMBIA\t35461\t26715-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048487.mp3\tGlenn Miller & His Orchestra\tDevil May Care (vre)\tBLUEBIRD\t10717 A\t048487\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL1083x.mp3\tClovers\tDevil Or Angel\tATLANTIC\t1083\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146888-2.mp3\tBessie Smith\tDevil's Gonna Git You\tCOLUMBIA\t14354 D\tW146888-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COL265160.mp3\tBenny Carter & His Orchestra\tDevil's Holiday\tCOLUMBIA\t2898 D\t265160\t193\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu5342.mp3\tRoosevelt Sykes\tDevil's Island Gin Blues\tBluebird\t5342\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/COL17678.mp3\tVic Berton And His Orchestra\tDevil's Kitchen\tCOLUMBIA\t3074 D\t17678\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL258.mp3\tLee O'daniel Hillbilly Boys\tDevlish Mary\tVOCALION\t4102\tDAL258\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA1015.mp3\tCharlie Parker\tDewey Square\tDIAL\t1015\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93732-A.mp3\tJay Mcshann & His Orchestra\tDexter Blues\tDECCA\t8583B\tC93732-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Sav5881.mp3\tDexter Gordon Quintette\tDexter Digs In\tSavoy\t595\t5881\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/Sav5879.mp3\tDexter Gordon Quintette\tDexter Rides Again\tSavoy\t623\t5879\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/Sav5843.mp3\tDexter Gordon Tenor Sax Solo\tDexter's Cuttin Out\tSavoy\t612\t5843\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/Sav5842.mp3\tDexter Gordon Tenor Sax Solo\tDexter's Deck\tSavoy\t576\t5842\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/Sav5844.mp3\tDexter Gordon Tenor Sax Solo\tDexter's Minor Mad\tSavoy\t612\t5844\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DIAD1101-B.mp3\tCharlie Parker Quintet\tDexterity\tDIAL\t1032\tD1101-B\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM53S3034.mp3\tMarilyn Monroe\tDiamonds Are A Girl's Best Friend\tMGM\t30784\t53S3034\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_336.mp3\tJo Stafford\tDiamonds Are A Girl's Best Friend\tCapitol\t824\t5339\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44121.mp3\tEarl Hines\tDiane\tCOLUMBIA\t39263\tCO44121\t1950\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478327.mp3\tJerry Murad And The Harmonicats\tDiane\tUniversal Records\t\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_014.mp3\tNat Shilkret And The Victor Orchestra\tDiane (i'm In Heaven When I See You Smile)\tVICTOR\t\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOLA1899.mp3\tDickie Wells & His Orchestra\tDickie Wells Blues\tVICTOR\t27318A\tOLA1899\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc25296-1.mp3\tCount Basie And His Orchestra\tDickie's Dream\tVocalion\t5118\t25296-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC11817-9.mp3\tFletcher Henderson & His Orchestra\tDicty Blues\tVOCALION\t14654B\t11817-9\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04951.mp3\tFats Waller And His Rhythm\tDid Anyone Ever Tell You?\tVICTOR\t25537\t04951\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU102338.mp3\tShep Fields Rippling Rhythm\tDid I Remember\tBLUEBIRD\t6476A\t102338\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19535-1.mp3\tBillie Holiday\tDid I Remember\tARC\tVO3276\t19535-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC25341-B.mp3\tTommy Dorsey And His Orchestra Vocal Refrain By Edythe Wright\tDid I Remember (from The M-g-m Film \"suzy\")\tVICTOR\t25341\t25341-B\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_104.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tDid I Remember?\tVICTOR\t25341\t25341-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_008.mp3\tShep Fields And His Rippling Rhythm Orchestra\tDid I Remember?\tBLUEBIRD\t6476A\t102338\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP7461.mp3\tBing Crosby\tDid You Ever See A Dream Walking\tCOLUMBIA\t39523\tZSP7461\t1946\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24477.mp3\tEddy Duchin & His Orchestra\tDid You Ever See A Dream Walking\tVictor\t24477\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh008.mp3\tBertini And His Orchestra\tDid You Ever See A Dream Walking (v Sam Brown)\tEclipse\t608\tJW-1648-1-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA89.mp3\tBing Crosby\tDid You Ever See A Dream Walking?\tBRUNSWICK\t6724\tLA89\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC78826-2.mp3\tEddy Duchin And His Orchestra\tDid You Ever See A Dream Walking?\tVICTOR\t24477\t78826-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_302.mp3\tPickens Sisters\tDid You Ever See A Dream Walking?\tVICTOR\t24468\t68604-3\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_047.mp3\tBing Crosby\tDid You Ever See A Dream Walking?\tBRUNSWICK\t6724\tLA89\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_009.mp3\tEddy Duchin And His Orchestra Feat. Lew Sherwood\tDid You Ever See A Dream Walking?\tVICTOR\t24477\t78826-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14382-A.mp3\tGuy Lombardo Royal Canadians\tDid You Ever See A Dream Walking? (v C L)\tBRUNSWICK\t6713\t14382-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/CON14300-1.mp3\tGene Kardos And His Orchestra\tDid You Ever See A Dream Walking? (vdr)\tCONQUEROR\t8277\t14300-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74966.mp3\tBuddy Johnson And His Orch\tDid You Ever See Jackie Robinson Hit The Ball\tDECCA\t24675\t74966\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0543.mp3\tCharlie Barnet & His Orchestra\tDid You Mean It\tBLUEBIRD\t6605\t0543\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU6605.mp3\tCharlie Barnet & His Orchestra\tDid You Mean It\tBLUEBIRD\t6605\t0543\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC1512-1.mp3\tKay Kyser & His Orchestra\tDid You Mean It (vbill Stoker)\tBRUNSWICK\t7759\tC1512-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41345-1.mp3\tMarion Harris\tDid You Mean It?\tVICTOR\t21116A\t41345-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_1010_01.mp3\tLee Morse And Her Bluegrass Boys\tDid You Mean It?\tColumbia\t1199DA\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_164.mp3\tMarion Harris\tDid You Mean It?\tVICTOR\t21116A\t41345-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_049.mp3\tNat Shilkret And The Victor Orchestra\tDid You Mean It?\tVICTOR\t21105\t41105-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_141.mp3\tCharlie Barnet And His Orchestra\tDid You Mean It?\tBLUEBIRD\t6605\t0543\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2260.mp3\tBing Crosby & King's Men\tDid Your Mother Come From Ireland?\tDECCA\t91165\tDLA2260\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/CorL-4302-.mp3\tLionel Hampton And His Orchestra\tDig Those Vibes\tCoral\t6.22180\tL-4302-\t1946\tLionel Hampton p  vib v dir. Joe Wilder Duke Garrette Leo Shepherd Joe Morris  Wendell Culley  Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn   Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb johnny Griffin ts, Charlie Fowlkes bar, Mi\nhttp://www.jazz-on-line.com/a/mp3w/1946_032.mp3\tPerry Como Feat. Russell Case's Orchestra\tDig You Later (a Hubba-hubba-hubba)\tVICTOR\t1750\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DECC91538.mp3\tBob Crosby & His Orchestra\tDiga Diga Do\tDECCA\t2275\tC91538\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE27902.mp3\tMill's Hotsy Totsy Gang\tDiga Diga Doo\tBRUNSWICK\t4014\tE27902\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400859-AB.mp3\tDuke Ellington And His Orchestra\tDiga Diga Doo\tOKeh\t8602\t400859-AB\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19443-1.mp3\tFrankie Trumbauer's Orchestra\tDiga Diga Doo\tBRUNSWICK\t7687\t19443-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DeLD-168.mp3\tBenny Carter And His All Star Orchestra\tDiga Diga Doo\tDe Luxe\t1028\tD-168\t1946\t\nhttp://www.jazz-on-line.com/a/mp3h/Vic48167-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tDiga Diga Doo\tVictor\tV-38008\t48167-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_196.mp3\tDuke Ellington And His Famous Orchestra Feat. V/irving Mills\tDiga Diga Doo\tOKeh\t8602\t400859-AB\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-12781-A.mp3\tThe Mills Brothers With Duke Ellington And His Famous Orchestra\tDiga Diga Doo\tBrunswick\t6519\tB-12781-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE30834.mp3\tCount Basie And His Orchestra\tDiggin' For Dex\tOKEH\t6365\t30834\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCMEM096.mp3\tSwift Jewel Cowboys\tDill Pickle Rag\tVOCALION\t5309\tMEM096\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75989.mp3\tEddie Condon & His Orchestra\tDill Pickles\tDECCA\t27987\t75989\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC29317.mp3\tBill Haley And The Comets\tDim Dim The Lights\tDECCA\t29317\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_078.mp3\tBill Haley And His Comets\tDim, Dim The Lights (i Want Some Atmosphere)\tDecca\t29317 A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_181.mp3\tMargaret Whiting\tDime A Dozen\tCapitol\t709\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCL5864.mp3\tLecuona Cuban Boys\tDime Adios\tCOLUMBIA\t36249\tCL5864\t\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-486-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tDiminishing\tSWING\t274\tOSW-486-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLM648.mp3\tDuke Ellington Orchestra\tDiminuendo In Blue\tCOLUMBIA\t36125\tM648\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE37467.mp3\tBing Crosby And Mills Bros\tDinah\tBRUNSWICK\t6485\tE37467\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA294.mp3\tBoswell Sisters\tDinah\tBRUNSWICK\t7412\tLA294\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151260-1.mp3\tRed Devils\tDinah\tCOLUMBIA\t14586 D\tW151260-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141164-2.mp3\tEthel Waters' Plantation Orchestra\tDinah\tCOLUMBIA\t487D\tW141164-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/LONDR8279-1.mp3\tRoy Marsh And His Swingtet\tDinah\tLONDON\tW.7322\tDR. 8279-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe400178-A.mp3\tJoe Venuti And His Blue Four\tDinah\tOKeh\t41025\t400178-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VARC2091.mp3\tScorpion Washboard Band\tDinah\tVARSITY\t6003\tC2091\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VARP77161.mp3\tQuintet Of Hot Club Of France\tDinah\tVARSITY\t8377\tP77161\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/V-D522B.mp3\tSam Donahue And Navy Band\tDinah\tV-DISC\t522B\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC046024-1.mp3\tLionel Hampton & His Orchestra\tDinah\tVICTOR\t26557\t046024-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC34369-1.mp3\tJean Goldkette & His Orchestra\tDinah\tVICTOR\t19947A\t34369-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN11910-2.mp3\tCab Calloway & His Orchestra\tDinah\tBANNER\t32483\t11910-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88989-1.mp3\tFats Waller And His Rhythm\tDinah\tVICTOR\t25471\t88989-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe73894-B.mp3\tClarence Williams Stompers\tDinah\tOKeh\t40541\t73894-B\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D309.mp3\tMildred Bailey\tDinah\tV-DISC\t656\t309\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1103.mp3\tLouis Prima's New Orleans Gang\tDinah\tBRUNSWICK\t7666\tLA1103\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC71838-1.mp3\tDuke Ellington & His Orchestra\tDinah\tVICTOR\t22938\t71838-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe17149.mp3\tTed Lewis & His Band\tDinah\tOKeh\t41585\t17149\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC33252-5.mp3\tRevelers\tDinah\tVICTOR\t19796\t33252-5\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/ULTP-77161.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tDinah\tUltraphone\tAP-1422\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC67752-2.mp3\tWilliams Purple Knights\tDinah\tVICTOR\t22625\t67752-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI10835.mp3\tFred Van Eps\tDinah\tEDISON\t51702\t10835\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC97772-1.mp3\tBenny Goodman Qt\tDinah\tVICTOR\t25398-B\t97772-1\t1936\t\n\tLouis Armstrong\tDinah\tVocalion\t3009\t\t\t\nhttp://www.jazz-on-line.com/a/mp37/Bru29709A.mp3\tRed Nichols And His Five Pennies\tDinah\tBRUNSWICK\t80006 B\tE 29709A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_017.mp3\tEthel Waters\tDinah\tDECCA\t234A\t38350-C\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_038.mp3\tRevelers\tDinah\tVICTOR\t19796\t33252-5\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic88989-1.mp3\tFats Waller And His Rhythm\tDinah\tVictor\t25471\t88989-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_054.mp3\tBoswell Sisters\tDinah\tBRUNSWICK\t7412\tLA294\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh073.mp3\tJack Hylton Band\tDinah\tDecca\tF-3764\tGB-6355-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_084.mp3\tTed Lewis And His Band\tDinah\tOKeh\t41585\t17149\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic046024-1.mp3\tLionel Hampton And His Orchestra\tDinah\tVictor\t26557\t046024-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_108.mp3\tSam Donahue And His Orchestra\tDinah\tCapitol\t260\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11910-2.mp3\tCab Calloway And His Orchestra\tDinah\tBanner\t32483\t11910-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-2049.mp3\tFletcher Henderson And His Orchestra\tDinah\tVocalion\t15204\tE-2049  \t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_060.mp3\tCliff Edwards\tDinah\tPath\t025164\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE37467-A.mp3\tBing Crosby And Mills Brothers\tDinah (vbc)\tBRUNSWICK\t6240\tE37467-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/CONW3526.mp3\tJ.c.heard Orchestra\tDinah (vew)\tCONTIN\t10007\tW3526\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COL17923.mp3\tMills Blue Rhythm Band\tDinah Lou\tCOLUMBIA\t3083 D\t17923\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-17923-1.mp3\tMills Blue Rhythm Band\tDinah Lou\tColumbia\t3083-D\tCO-17923-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_240.mp3\tMills Blue Rhythm Band\tDinah Lou\tCOLUMBIA\t3083 D\t17923\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/ColLA-2164-C.mp3\tJimmie Lunceford And His Orchestra\tDinah Part 1\tColumbia\t36054\tLA-2164-C\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/ColLA-2165-C.mp3\tJimmie Lunceford And His Orchestra\tDinah Part 2\tColumbia\t36054\tLA-2165-C\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM811-2-1.mp3\tDuke Ellington's Famous Orchestra\tDinah's In A Jam\tBRUNSWICK\t8169\tM811-2-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-227-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tDinette\tSWING\t146\tOSW-227-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38673-2.mp3\tBennie Moten Kansas City Orchestra\tDing Dong Blues\tVICTOR\t21199\t38673-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83009.mp3\tElla Fitzgerald\tDing Dong Boogie\tDECCA\t28321\t83009\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038261.mp3\tGlenn Miller & His Orchestra\tDing Dong! The Witch Is Dead\tBLUEBIRD\t10366\t038261\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152489.mp3\tBen Selvin And His Orchestra\tDinner At Eight\tCOLUMBIA\t2813 D\tW152489\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18385-1.mp3\tHal Kemp & His Orchestra\tDinner For One Please, James\tBRUNSWICK\t7587\t18385-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98066.mp3\tRay Noble & His Orchestra\tDinner For One, Please James (vab)\tVICTOR\t25187B\t98066\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/OKES8402-A.mp3\tKing Oliver Jazz Band\tDipper Mouth Blues\tOKeh\t4918\tS8402-A\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/VOC5131y.mp3\tGlenn Miller And His Orchestra\tDipper Mouth Blues\tVocalion\t5131\t5131\t\t\nhttp://www.jazz-on-line.com/a/mp3o/GENG11389-B.mp3\tKing Oliver Creole Jazz Band\tDipper Mouth Blues\tGENNETT\t5132A\t11389-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA-541-A.mp3\tLouis Armstrong With Jimmy Dorsey And His Orchestra\tDipper Mouth Blues\tDecca\t949\tDLA-541-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/Oke8402-4.mp3\tKing Oliver's Jazz Band\tDipper Mouth Blues\tOkeh\t4918\t8402-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/Gen11389-B.mp3\tKing Oliver's Creole Jazz Band\tDipper Mouth Blues\tGennett\t5132\t11389-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043377-1.mp3\tMuggsy Spanier Ragtime Band\tDippermouth Blues\tBLUEBIRD\t10506\t043377-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17390H-.mp3\tThe Dutch Swing College Band\tDippermouth Blues\tPhilips\tP17390H\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO21x.mp3\tBenny Strickler And The Yerba Bue\tDippermouth Blues\tGood Time Jazz\t21\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN12626-B.mp3\tMills Brothers\tDirt Dishin' Daisy\tBANNER\t33255\t12626-B\t1932\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480746.mp3\tBen Webster Quintet\tDirty Deal\tCircle\tCLP42\tN1637-2\t1944\tHot Lips Page (tp), Ben Webster (ts), Clyde Hart (p), Charlie Drayton (sb), Denzil Best (dm)\nhttp://www.jazz-on-line.com/a/mp3c/BRUC1833.mp3\tAl Jolson - Abe Lyman Orchestra\tDirty Hands! Dirty Face!\tBRUNSWICK\t3912\tC1833\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_066.mp3\tMarion Harris\tDirty Hands! Dirty Face!\tBRUNSWICK\t2458\t10835\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL263-1.mp3\tLee O'daniel Hillbilly Boys\tDirty Hangover Blues\tVOCALION\t4440\tDAL263-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPY4341.mp3\tSonny Terry\tDirty Mistreater, Don't You Know\tCAPITOL\t\tY4341\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC9641.mp3\tMemphis Minnie\tDirty Mother For You\tDECCA\t7048\tC9641\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39356.mp3\tEarl Hines & His Orchestra\tDisappointed In Love\tDECCA\t389A\t39356\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC389A.mp3\tEarl Hines & His Orchestra\tDisappointed In Love\tDECCA\t389A\t39356\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO37309.mp3\tGene Krupa & His Orchestra\tDisc Jockey Song\tCOLUMBIA\t37589\tCO37309\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1003.mp3\tColeman Hawkins & His Orchestra\tDisorder At The Border\tAPOLLO\t753\tR1003\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16190.mp3\tDjango Reinhardt\tDistraction\tRythme\tD5016\t16190\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC2988.mp3\tBukka White\tDistrict Attorney Blues\tOKEH\t5683\tWC2988\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16218.mp3\tDjango Reinhardt - Stan Brenders Et Son Grand Orchestre De Danse\tDivine Beguine\tRythme\tD5026\t16218\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU55596-2.mp3\tSleepy John Estes\tDiving Duck Blues\tBLUEBIRD\t7677\t55596-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP290x.mp3\tMerle Travis\tDivorce Me C.o.d\tCAPITOL\t290\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_285.mp3\tMerle Travis\tDivorce Me C.o.d.\tCapitol\t15263\t1190\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143795.mp3\tGid Tanner's Skillet Lickers\tDixie\tCOLUMBIA\t15158 D\tW143795\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480840.mp3\tRay Anthony And His Orchestra\tDixie\tCAPITOL\tF794\t5270-2D-2\t1949\tRay Anthony, Marty White, Fern Caron, Chuck Mederios (tp) Keith Butterfield (tp,tb) Bob Quatsoe, Tom Oblak (tb) Ken Trimble (tb,vcl) Earl Bergman, George Meisner (as) Bill Usselton, Louis Sadar (ts) Leo Anthony (bar,as) Eddie Ryan (p) Danny Gregus (g) Al Simi (b) Kenny John (d) Deane Kincaide (arr) \nhttp://www.jazz-on-line.com/a/mp3a/OKe08605-B.mp3\tFiddlin' John Carson\tDixie Boll Weevil\tOKeh\t40095\t08605-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2022-A.mp3\tGene Autry\tDixie Cannonball\tCOLUMBIA\t37963\tHCO2022-A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_038.mp3\tArthur Collins\tDixie Dan\tVICTOR\t16512\tB4852-2\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_079.mp3\tBilly Murray\tDixie Dan\tZONOPHONE\t983\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_180.mp3\tLaurie Sisters\tDixie Danny\tMercury\t70548\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe400699-C.mp3\tDorsey Brothers Orchestra\tDixie Dawn\tOKeh\t41050\t400699-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_217.mp3\tDorsey Brothers Orchestra Feat. Bill Dutton\tDixie Dawn\tOKeh\t41050\t400699-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban12550-A.mp3\tCab Calloway And His Orchestra\tDixie Doorway\tBanner\t32812\t12550-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN8261-2.mp3\tMendello's Dance Orchestra (mendello And His Five Gee-gees)\tDixie Drag\tBANNER\t6214\t8261-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5424.mp3\tMuggsy Spanier's Dixielanders\tDixie Flyer\tMERCURY\t5424\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW140607-1.mp3\tBessie Smith\tDixie Flyer Blues\tCOLUMBIA\t14079 D\tW140607-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14470A.mp3\tCasa Loma Orchestra\tDixie Lee\tBRUNSWICK\t6726\t14470A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/ARCB14470AHT1-7.mp3\tCasa Loma Orchestra\tDixie Lee\tARC\tBR6726\tB-14470-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-7839-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tDixie Lee\tParlophone\tF-605\tCE-7839-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_278.mp3\tGlen Gray And Casa Loma Orchestra\tDixie Lee\tBRUNSWICK\t6726\t14470A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-686-1.mp3\tJimmie Noone And His Orchestra\tDixie Lee - V E P\tVocalion \t2620\tC-686-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Edi9481.mp3\tFletcher Henderson's Orchestra\tDixie Moon\tEdison\t\t9481\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/EDI9481.mp3\tFletcher Henderson And His Orchestra\tDixie Moon - Foxtrot\tEDISON\t\t9481\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP5120-2.mp3\tArmand Hug\tDixie Rag\tCAPITOL\t\t5120-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10428-3.mp3\tCab Calloway & His Orchestra\tDixie Vagabond\tBANNER\t32116\t10428-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO5188.mp3\tJimmy Dorsey\tDixieland Band From Santa Claus Land\tCOLUMBIA\t39035\tCCO5188\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC19332-3.mp3\tOriginal Dixieland Jazz Band\tDixieland Jass Band - One Step\tVICTOR\t18255\t19332-3\t1917\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18255d.mp3\tOriginal Dixieland Jazz Band\tDixieland Jass Band - One Step\tVICTOR\t18255\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC61037.mp3\tBob Crosby & His Orchestra\tDixieland Shuffle\tDECCA\t825A\t61037\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU20696-1.mp3\tBunny Berigan And His Boys\tDixieland Shuffle\tBRUNSWICK\t7858\t20696-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB8134-4.mp3\tBilly Murray\tDixieland, I Love You\tVICTOR\t16366\tB8134-4\t1909\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480841.mp3\tCarmen Miranda And The Bando Da Lua\tDiz Que Tem\tDECCA\t23239-B\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MUSG557.mp3\tDizzy Gillespie Sextet\tDizzy Atmosphere\tMUSICRAFT\t488\tG557\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT821.mp3\tSlim Gaillard & His Orchestra\tDizzy Boogie\tMAJESTIC\t9002\tT821\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM645-1.mp3\tBuster Bailey Rhythm Busters\tDizzy Debutante\tVARIETY\tI668\tM645-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_226.mp3\tZez Confrey And His Orchestra\tDizzy Fingers\tVICTOR\t20777\t39215-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC89797-1.mp3\tGene Gifford & His Orchestra\tDizzy Glide (vwm)\tVICTOR\t25065\t89797-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC021629.mp3\tBenny Goodman Qt\tDizzy Spells\tVICTOR\t25822\t021629\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480729.mp3\tBenny Goodman Quartet\tDizzy Spells\tColumbia\tSL 160\t\t1938\tCarnegie Hall Concert: <br>Benny Goodman (cl), Teddy Wilson (p), Gene Krupa (dm), Lionel Hampton (vib)\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP5571.mp3\tBenny Goodman Qt Part 1\tDizzy Spells (continuation)\tCOLUMBIA\t39287\tZSP5571\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16222.mp3\tDjango Reinhardt - Stan Brenders Et Son Grand Orchestre De Danse\tDjango Rag\tRythme\tD5025\t16222\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1717-1.mp3\tDjango Reinhardt\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tGramophone\tK-8396\tOLA-1717-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOEF-26-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tDjango's Tiger\tSWING\t242\tOEF-26-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/DECP77540.mp3\tQuintet Of Hot Club Of France\tDjangology\tDECCA\t23003\tP77540\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VARP77540.mp3\tQuintet Hot Club Of France\tDjangology\tVARSITY\tROY-\tP77540\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-408-1.mp3\tDjango Reinhardt And His American Swing Band\tDjangology\tSWING\t221\tSW-408-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77540.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grappelly\tDjangology\tUltraphone\tAP-1548\tP-77540\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16220.mp3\tDjango Reinhardt - Stan Brenders Et Son Grand Orchestre De Danse\tDjangology\tRythme\tD5000\t16220\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36910-5.mp3\tGeorge Olsen & His Music\tDo Do Do (v F F-b B-b R) (from 'oh Kay')\tVICTOR\t20327A\t36910-5\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/SILE11820.mp3\tFletcher Henderson Orchestra\tDo Doodle Oom\tSILVERTONE\t3022\tE11820\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc11821-2.mp3\tFletcher Henderson's Orchestra\tDo Doodle Oom\tVocalion\t14654\t11821-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Aja31011-1.mp3\tSeven Brown Babies\tDo Doodle Oom\tAjax\t17009\t31011-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Col81212-3.mp3\tFletcher Henderson's Orchestra\tDo Doodle Oom\tColumbia\tA-3995\t81212-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79825.mp3\tBabara Maurel With Orchestra Accompaniement\tDo Dreams Come True ?\tCOLUMBIA\tA3607\t79825\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS27296.mp3\tCab Calloway & His Orchestra\tDo I Care, No, No\tCBS\tVO5591\t27296\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC43669-2.mp3\tPaul Whiteman & His Orchestra\tDo I Hear You Saying\tVICTOR\t21398\t43669-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67065.mp3\tWoody Herman & His Orchestra\tDo I Love You?\tDECCA\t2971A\t67065\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu43369.mp3\tArtie Shaw And His Orchestra\tDo I Love You?\tBluebird\t10509\t043369-1\t1939\tVocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu10509.mp3\tArtie Shaw And His Orchestra\tDo I Love You?\tBluebird\t10509\t043369-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu043369-1.mp3\tArtie Shaw And His Orchestra\tDo I Love You? - V H F\tBluebird\tB-10509\t043369-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67970AA.mp3\tInk Spots\tDo I Worry ?\tDECCA\t3432A\t67970AA\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC060626.mp3\tTommy Dorsey And His Orchestra\tDo I Worry?\tVICTOR\t27338\t060626\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67970.mp3\tInk Spots\tDo I Worry?\tDECCA\t23633\t67970\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_100.mp3\tInk Spots\tDo I Worry?\tDECCA\t23633\t67970\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_197.mp3\tBea Wain\tDo I Worry?\tVICTOR\t27353\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_031.mp3\tTommy Dorsey Orch V Frank Sinatra\tDo I Worry?\tVICTOR\t27338\t060626\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC26247-5.mp3\tPaul Whiteman And His Orchestra\tDo It Again\tVICTOR\t18882\t26247-5\t1922\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1116-A.mp3\tCab Calloway And His Orchestra\tDo It Again\tVocalion\t5364\tWM-1116-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC82529-1.mp3\tFats Waller And His Rhythm\tDo Me A Favor\tVICTOR\t24648\t82529-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic82529-1.mp3\tFats Waller And His Rhythm\tDo Me A Favor\tVictor\t24648\t82529-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18578A.mp3\tWoody Herman And His Orchestra\tDo Nothin Til You Hear From Me\tDECCA\t18578A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP145x.mp3\tStan Kenton Orchestra\tDo Nothin' Till You Hear From Me\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_058.mp3\tDuke Ellington And His Famous Orchestra\tDo Nothin' Till You Hear From Me\tVictor\t1547\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO38705.mp3\tDuke Ellington's Orchestra\tDo Nothing Till You Hear From Me\tCOLUMBIA\t38363\tCO38705\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/HITCR348.mp3\tCootie Williams & His Orchestra\tDo Some War Work, Baby (v C W)\tHIT OF THE WEEK\t8090B\tCR348\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21917-A.mp3\tHelen Kane\tDo Something\tVICTOR\t21917-A\t50945-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUDET-301.mp3\tDel Delbridge And His Capitol Theater Orchestra\tDo Something\tBRUNSWICK\t4393\tDET-301\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_139.mp3\tHelen Kane\tDo Something\tVICTOR\t21917-A\t50945-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUE-36910-A.mp3\tCasa Loma Orchestra\tDo The New York\tBRUNSWICK\t6150\tE-36910-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_194.mp3\tGlen Gray And Casa Loma Orchestra\tDo The New York\tBRUNSWICK\t6150\tE-36910-A\t1931\tJoe Hostetter, Frank Martinez, Bobby Jones (tp), Pee Wee Hunt, Billy Rauch (tb), Glen Gray (as, ldr), Clarence Hutchinrider (cl, as), Pat Davis (ts), Kenny Sargent (ts, vo), Mel Jenssen (vn), Joe Hall (p), Gene Gifford (bj, g), Stanley Dennis (bb, sb), Tony Briglia (dm), Henry Biagini (dir)\nhttp://www.jazz-on-line.com/a/mp3c/HUN195056.mp3\tBen Selvin & His Orchestra\tDo Ya' Love Me?\tHUNDRED\tCo-R\t195056\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic68300-2.mp3\tMckinney's Cotton Pickers\tDo You Believe In Love At Sight?\tVictor\t22811\t68300-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC50886-3.mp3\tBilly Hays And His Orchestra\tDo You Believe?\tVICTOR\t40113\t50886-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68171.mp3\tLouis Jordan & His Tympani 5\tDo You Call That A Buddy?\tDECCA\t8500\t68171\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_167.mp3\tSam Donahue And His Orchestra\tDo You Care?\tBluebird\t11198\t065631\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69864-A.mp3\tBing Crosby\tDo You Care?\tDECCA\t4064A\t69864-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_224.mp3\tDinah Shore\tDo You Care?\tBLUEBIRD\t11191\t063875\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_157.mp3\tBob Crosby And His Orchestra\tDo You Care?\tDECCA\t3860 A\t69270A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69365.mp3\tSam Price's Texas Blusicians\tDo You Dig My Jive?\tDECCA\t8575A\t69365\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU21377-2.mp3\tRed Norvo And His Orchestra\tDo You Ever Think Of Me\tBRUNSWICK\t7932\t21377-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61812.mp3\tJimmie Davis\tDo You Ever Think Of Me\tDECCA\t5400\t61812\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCSA2876.mp3\tNite Owls\tDo You Ever Think Of Me\tVOCALION\t3879\tSA2876\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC24821-8.mp3\tPaul Whiteman & His Orchestra\tDo You Ever Think Of Me\tVICTOR\t18734B\t24821-8\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA3372.mp3\tThe Happy Six\tDo You Ever Think Of Me\tColumbia\tA3372\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2066-A.mp3\tBing Crosby & Merry Macs\tDo You Ever Think Of Me?\tDECCA\t3423A\tDLA2066-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC38987.mp3\tClaude Hopkins And His Orchestra\tDo You Ever Think Of Me?\tDECCA\t353B\t38987\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_073.mp3\tHappy Six\tDo You Ever Think Of Me?\tCOLUMBIA\tA-3372\t79649-1\t1921\tEarl Oliver (tp), Tom Brown (tb), Rudy Wiedoeft, F. Wheeler Wadsworth, Bob Johnson (saxes), Ed Violinsky (vn), Phil Ohman or Ted Fiorito (p), George Hamilton Green (dm, xyl).\nhttp://www.jazz-on-line.com/a/mp3c/BLU062761.mp3\tFats Waller And His Rhythm\tDo You Have To Go?\tBLUEBIRD\t11222\t062761\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057613.mp3\tGlenn Miller And His Orchestra\tDo You Know Why (vre)\tBLUEBIRD\t10936 A\t057613\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S6100.mp3\tThe Louvin Brothers\tDo You Live What You Preach\tMGM\t11392\t51S6100\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic100558-1.mp3\tFletcher Henderson And His Orchestra\tDo You Or Don't You Love Me \tVictor\t25334\t100558-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100558-1.mp3\tFletcher Henderson & His Orchestra\tDo You Or Don't You Love Me?\tVICTOR\t25334\t100558-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC81076.mp3\tElla Fitzgerald\tDo You Really Love Me\tDECCA\t27634\t81076\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030336.mp3\tTommy Dorsey & His Clambake 7\tDo You Remember Last Night?\tVICTOR\t26119\t030336\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_015.mp3\tAmerican Quartet\tDo You Take This Woman For You Lawful Wife? - ''i Do, I Do''\tVictor\t17554\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_093.mp3\tWilliam J. Halley\tDo You Take This Woman For Your Lawful Wife?\tColumbia\t1497\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU027959.mp3\tErskine Hawkins & His Orchestra\tDo You Wanna Jump Children\tBLUEBIRD\t10019\t027959\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CONM904.mp3\tCab Calloway & His Orchestra\tDo You Wanna Jump, Children?\tCONQUEROR\t9089\tM904\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64749-A.mp3\tCount Basie And His Orch\tDo You Wanna Jump, Children?\tDECCA\t2224A\t64749-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-904-1.mp3\tCab Calloway And His Orchestra\tDo You Wanna Jump, Children?\tVocalion\t4477\tM-904-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_294.mp3\tErskine Hawkins And His Orchestra\tDo You Wanna Jump, Cuillun?\tBluebird\t10019B\t27959\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152577-2.mp3\tBessie Smith\tDo Your Duty\tCOLUMBIA\t37575\tW152577-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75241.mp3\tBillie Holiday\tDo Your Duty\tDECCA\t48259\t75241\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_087.mp3\tGertrude Lawrence\tDo-do-do\tDECCA\t28267\t80266\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-3188-B.mp3\tHorace Henderson And His Orchestra\tDo-re-mi\tOKEH\t5978\tWC-3188-B\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403524-C.mp3\tLuis Russell & His Orchestra\tDoctor Blues\tOKeh\t8766\t403524-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5445.mp3\tSlam Stewart Quartet\tDoctor Foo\tMUSICRAFT\t367\t5445\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU37257-3.mp3\tMorton's Red Hot Peppers\tDoctor Jazz\tBLUEBIRD\t10255\t37257-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VocE-51724.mp3\tKing Oliver And His Dixie Syncopators\tDoctor Jazz\tVocalion\t1113\tE-51724\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62151.mp3\tWoody Herman & His Orchestra\tDoctor Jazz\tDECCA\t1307\t62151\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17216H.mp3\tThe Dutch Swing College Band\tDoctor Jazz\tPhilips\tP17216H\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic37257-3.mp3\tJelly-roll Morton's Red Hot Peppers\tDoctor Jazz\tVictor\t20415\t37257-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37257-3.mp3\tJelly Roll Morton Hot Peppers\tDoctor Jazz - Stomp\tVICTOR\t20415A\t37257-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480777.mp3\tBen Webster Quintet\tDoctor Keets\tHaven\t804\th-1941\t1946\tBen Webster (ts), Al Haig (p), Bill De Arango (g), John Simmons (sb), Sid Catlett (dm)\nhttp://www.jazz-on-line.com/a/mp3a/CAP220x.mp3\tBetty Hutton\tDoctor, Lawyer, Indian Chief\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_015.mp3\tBetty Hutton\tDoctor, Lawyer, Indian Chief\tCapitol\t220\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_237.mp3\tHoagy Carmichael\tDoctor, Lawyer, Indian Chief\tHIT OF THE WEEK\tARA128\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_068.mp3\tLes Brown Orch V Butch Stone\tDoctor, Lawyer, Indian Chief\tCOLUMBIA\t36945\tCO35637\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_248.mp3\tReginald Foresythe And His Orchestra\tDodgin' A Divorcee\tColumbia\t3012\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_107.mp3\tErnest Hare And Billy Jones\tDoes The Spearment Lose Its Flavor On The Bedpost Overnight?\tCameo\t504\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1192-1.mp3\tRoy Eldridge & His Orchestra\tDoes Your Heart Beat For Me (v L W)\tVARSITY\t8144\tUS1192-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC64848.mp3\tRuss Morgan And His Orchestra\tDoes Your Heart Beat For Me?\tDECCA\t2479B\t64848\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_082b.mp3\tMcguire Sisters\tDoesn't Anybody Love Me?\tCoral\t61369\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK2725.mp3\tHawkshaw Hawkins\tDog House Boogie\tKING\t720B\tK2725\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_177.mp3\tRuss Morgan\tDogface Soldier\tDecca\t29703\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC63920-A.mp3\tCount Basie And His Orch\tDoggin' Around\tDECCA\t28926\t63920-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_349.mp3\tCount Basie And His Orchestra\tDoggin' Around\tDECCA\t1965B\t63920-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73267.mp3\tAndy Kirk And His Orchestra\tDoggin' Man Blues\tDecca\t48073\t73267\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR20517-3.mp3\tBlind Blake\tDoggin' Me Mama Blues\tPARAMOUNT\t12673\t20517-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68394.mp3\tBig Joe Turner\tDoggin' The Dog\tDECCA\t7824\t68394\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1091-A.mp3\tBob Crosby & His Bobcats\tDogtown Blues\tDECCA\t15038B\tDLA1091-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/CAM3706-B.mp3\tBob Finley And His Orchestra\tDoin' The Campus Crawl\tCAMEO\t9105\t3706-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VOC5131x.mp3\tGlenn Miller And His Orchestra\tDoin' The Jive\tVocalion\t5131\t5131\t\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-11-1.mp3\tPhilippe Brun ''jam'' Band (with Django Reinhardt)\tDoin' The New Low Down\tSWING\t44\tOSW-11-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe400860.mp3\tDuke Ellington & His Orchestra\tDoin' The New Low Down\tOKeh\t41096\t400860\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke8602.mp3\tDuke Ellington & His Famous Orchestra\tDoin' The New Low Down\tOkeh\t8602\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_238.mp3\tDuke Ellington And His Famous Orchestra Feat. V/irving Mills\tDoin' The New Low Down\tOkeh\t41096\t400860\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-12811-A.mp3\tDon Redman And His Orchestra\tDoin' The New Low-down\tBrunswick\t6517\tB-12811-A\t1932\tCab Calloway\nhttp://www.jazz-on-line.com/a/mp3d/BruB-12811-A.mp3\tDon Redman And His Orchestra\tDoin' The New Low-down\tBrunswick\t6517\tB-12811-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-12810-A.mp3\tDon Redman And His Orchestra\tDoin' The New Low-down\tBrunswick\t6520\tB-12810-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12810-1.mp3\tDon Redman & His Orchestra\tDoin' The New Lowdown (bill Robinson)\tBRUNSWICK\t6520\t12810-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21701-A.mp3\tGeorge Olsen And His Music\tDoin' The Raccoon\tVictor\t21701-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_053.mp3\tGeorge Olsen And His Orchestra\tDoin' The Raccoon\tVICTOR\t21701A\t47511-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BANE36213-A.mp3\tCab Calloway & His Orchestra\tDoin' The Rumba (vcc)\tBANNER\t32910\tE36213-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63784.mp3\tLouis Prima's New Orleans Gang\tDoin' The Serpentine\tDECCA\t1953A\t63784\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban11364-1.mp3\tBaron Lee And The Blue Rhythm Band (mills Blue Rhythm Band)\tDoin' The Shake\tBanner \t32493  \t11364-1 \t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec90970-A.mp3\tLil Armstrong And Her Swing Band\tDoin' The Suzie-q\tDecca\t1059\t90970-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14140-A.mp3\tAbe Lyman And His Orch (vella Logan)\tDoin' The Uptown Lowdown\tBRUNSWICK\t6674\t14140-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18167B.mp3\tJoe Venuti Blue 6\tDoin' The Uptown Lowdown\tDECCA\t18167-B\t\t193\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6674.mp3\tAbe Lyman & His Orchestra\tDoin' The Uptown Lowdown\tBrunswick\t6674\tB-14140-A-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/BruE-28939-A.mp3\tDuke Ellington And His Cotton Club Orchestra\tDoin' The Voom Voom\tBrunswick\t4345\tE-28939-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/Vic49655-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tDoin' The Voom Voom\tVictor\tV-38035\t49655-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_026.mp3\tFreddy Martin And His Orchestra\tDoin' What Comes Natur'lly\tRCA VICTOR\t1878\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_093.mp3\tJimmy Dorsey And His Orchestra Feat. Dee Parker\tDoin' What Comes Natur'lly\tDECCA\t18872B\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_029.mp3\tDinah Shore\tDoin' What Comes Natur'lly\tCOLUMBIA\t36976\tHCO1777\t1946\taccompanied by Spade Cooley's Orchestra<br>from the Broadway musical \"Annie Get Your Gun\"<br>Hit 029 of 1946\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1777.mp3\tDinah Shore W Spade Cooley Or\tDoin' What Comes Naturally\tCOLUMBIA\t36976\tHCO1777\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12446-A.mp3\tDon Redman & His Orchestra\tDoin' What I Please\tBRUNSWICK\t6429\t12446-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-12446-A.mp3\tDon Redman And His Orchestra\tDoin' What I Please\tBrunswick\t6429\tB-12446-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49780-2.mp3\tBoyd Senter & His Senterpedes\tDoin' You Good (i Can't Give You Anything...)\tVICTOR\t21912B\t49780-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW265147-2.mp3\tJoe Venuti's Blue Five\tDoing The Uptown Lowdown\tCOLUMBIA\t2834\tW265147-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_082.mp3\tErskine Hawkins And His Orchestra\tDolemite\tBluebird\t10812A\t047277-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047277-2.mp3\tErskine Hawkins & His Orchestra\tDolimite\tBLUEBIRD\t10812\t047277-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D165B.mp3\tMeade Lux Lewis\tDoll House Boogie\tV-DISC\t165B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe9906.mp3\tLuis Russell's Hot Six\tDolly Mine\tOKeh\t8454\t9906\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COL55599.mp3\tGuido Deiro\tDolores\tCOLUMBIA\tA1152\t55599\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC060347.mp3\tTommy Dorsey And His Orchestra\tDolores\tVICTOR\t27317\t060347\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2290.mp3\tBing Crosby And Merry Macs\tDolores\tDECCA\t3644A\tDLA2290\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW145838-3.mp3\tPaul Ash And His Orchestra\tDolores\tCOLUMBIA\t1349 D\tW145838-3\t1928\tD Lindley,J Valentine,J Linn tr,R Lantz,M Durso tb, P Wing,H Nettles cl,al sax,V Hayes,H Grantham,cl, tn sax,H Winston,p, P Ash,vio, vocH Hoffman,K Sirinsky,H Struble, vio, M Feiler,vio cel,J Davidson,bj, P Olker,br bass, A Layfield, v P. Small & Gan\nhttp://www.jazz-on-line.com/a/mp3w/1941_061.mp3\tTommy Dorsey Orch V Frank Sinatra\tDolores\tVICTOR\t27317\t060347\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_093.mp3\tJulius Larosa\tDomani (tomorrow)\tCadence\t1265\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_195.mp3\tDoris Day Feat. Paul Weston's Orchestra\tDomino\tCOLUMBIA\t39596\tHCO10009\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5493.mp3\tDon Byas Qt (c.shavers)\tDon's Idea\tSAVOY\t551B\tS5493\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/SAVS5493-2.mp3\tSavoy Jam Party Don Byas Orchestra\tDon's Idea\tSAVOY\t551B\tS5493-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9812-B.mp3\tRosa Henderson\tDon't Advertise Your Man\tEDISON\t51478R\t9812-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_244.mp3\tEileen Barton With Orchestra Directed By Jack Pleis\tDon't Ask Me Why\tCORAL\t61109\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18753A.mp3\tMills Brothers\tDon't Be A Baby, Baby\tDECCA\t18753 A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_163.mp3\tMills Brothers\tDon't Be A Baby, Baby\tDECCA\t18753 A\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_152.mp3\tBenny Goodman Sextet Feat. Art Lund\tDon't Be A Baby, Baby\tCOLUMBIA\t36967\tCO35952-3\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43210.mp3\tSarah Vaughan\tDon't Be Afraid\tCOLUMBIA\t38860\tCO43210\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA89-A.mp3\tMills Brothers\tDon't Be Afraid To Tell Your Mother\tDECCA\t402B\tDLA89-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_168.mp3\tJimmie Grier And His Orchestra\tDon't Be Afraid To Tell Your Mother\tBRUNSWICK\t7355\tLA280\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87646-1.mp3\tCharlie Barnet & His Orchestra\tDon't Be Afraid To Tell Your Mother (v M. Nichols)\tBLUEBIRD\t5814\t87646-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70597x.mp3\tThe Crew Cuts\tDon't Be Angry\tMERCURY\t70597\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_168.mp3\tNappy Brown\tDon't Be Angry\tSavoy\t1155\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_106.mp3\tCrew-cuts\tDon't Be Angry\tMercury\t70597\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36429-2.mp3\tJean Goldkette & His Orchestra\tDon't Be Angry With Me\tVICTOR\t20256\t36429-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_199.mp3\tJean Goldkette And His Orchestra\tDon't Be Angry With Me\tVICTOR\t20256\t36429-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_001.mp3\tElvis Presley\tDon't Be Cruel\tRCA Victor\t6604\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC48501-2.mp3\tHelen Kane\tDon't Be Like That\tVICTOR\t21830A\t48501-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1549.mp3\tBenny Goodman And His Orchestra.\tDon't Be Like That\tRCA\t20-1549\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC48618-2.mp3\tJean Goldkette & His Orchestra\tDon't Be Like That\tVICTOR\t21805\t48618-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_1023_02.mp3\tLee Morse\tDon't Be Like That\tColumbia\t1621DB\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_193.mp3\tHelen Kane\tDon't Be Like That\tVICTOR\t21830A\t48501-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUWC2586.mp3\tGene Krupa & His Orchestra\tDon't Be Surprised\tBRUNSWICK\t8412\tWC2586\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP5552.mp3\tBenny Goodman And His Orchestra\tDon't Be That Way\tCOLUMBIA\t39277\tZSP5552\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC019831.mp3\tBenny Goodman And His Orchestra\tDon't Be That Way\tVICTOR\t25792\t019831\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC018338.mp3\tLionel Hampton And His Orchestra\tDon't Be That Way\tVICTOR\t26173\t018338\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4598.mp3\tHarry James\tDon't Be That Way\tCOLUMBIA\t39582\tHCO4598\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CON22566-3.mp3\tMildred Bailey & Her Orchestra\tDon't Be That Way\tCONQUEROR\t9022\t22566-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39140.mp3\tChick Webb And His Orchestra\tDon't Be That Way\tDECCA\t483A\t39140\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1277.mp3\tBing Crosby - J.s.trotter\tDon't Be That Way\tDECCA\t1794A\tDLA1277\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D144B1.mp3\tCapt. Glenn Miller And The Aaftc Orch.\tDon't Be That Way\tV-DISC\t144B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D144-B.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tDon't Be That Way\tV-Disc\t144-B\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_156.mp3\tMildred Bailey Feat. Red Norvo (bandleader)\tDon't Be That Way\tVOCALION\t4016\t22566-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic018338-1.mp3\tLionel Hampton And His Orchestra\tDon't Be That Way\tVictor\t26173\t018338-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480626.mp3\tBenny Goodman And His Orchestra\tDon't Be That Way\tColumbia\tSL160\t\t1938\tCarnegie Hall'' Concert:<br>Harry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Hymie Schertzer, George Koenig (as), Arthur Rollini, Babe Russin (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1938_006.mp3\tBenny Goodman And His Orchestra\tDon't Be That Way\tVICTOR\t25792\t019831\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D178A1.mp3\tKay Kyser And His Orchestra\tDon't Believe Everything You Dream\tV-DISC\t178A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_122.mp3\tInk Spots\tDon't Believe Everything You Dream\tDECCA\t18583A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13565-A.mp3\tEthel Waters W Orchestra\tDon't Blame Me\tBRUNSWICK\t6617\t13565-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/SAV36131.mp3\tJ.j. Johnson's Orchestra\tDon't Blame Me\tSAVOY\t949A\t36131\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22025-1.mp3\tTeddy Wilson & His Orchestra\tDon't Blame Me\tCBS\tBR8025\t22025-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVS5870.mp3\tIllinois Jacquet All Stars\tDon't Blame Me\tSAVOY\t620A\tS5870\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/DIAD1116.mp3\tCharlie Parker\tDon't Blame Me\tDIAL\t1021\tD1116\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS233.mp3\tErroll Garner\tDon't Blame Me\tDISC\t5003\t233\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_252.mp3\tKing Cole Trio\tDon't Blame Me\tCapitol\t1032\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3d/MER452-1.mp3\tErroll Garner Trio\tDon't Blame Me  \tMERCURY\t1032\t452-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-22025-1.mp3\tTeddy Wilson And His Orchestra\tDon't Blame Me\tBrunswick\t8025\tB-22025-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480747.mp3\tBen Webster Quintet\tDon't Blame Me\tCircle\tCLP42\tN1638-2\t1944\tHot Lips Page (tp), Ben Webster (ts), Clyde Hart (p), Charlie Drayton (sb), Denzil Best (dm)\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S680.mp3\tSarah Vaughan\tDon't Blame Me (from The Strip)\tMGM\t11068B\t48S680\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BANC589-1.mp3\tGuy Lombardo & Royal Canadians\tDon't Blame Me (v C. Lombardo)\tBANNER\t33157\tC589-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC32228-2.mp3\tBilly Murray\tDon't Bring Lulu\tVICTOR\t19628\t32228-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC32568-1.mp3\tJan Garber And His Orchestra\tDon't Bring Lulu\tVICTOR\t19661\t32568-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe73288-B.mp3\tBilly Jones & Ernest Hare\tDon't Bring Lulu\tOKeh\t40354\t73288-B\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_057.mp3\tBilly Murray\tDon't Bring Lulu\tVICTOR\t19628\t32228-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_053.mp3\tErnest Hare And Billy Jones\tDon't Bring Lulu\tOKeh\t40354\t73288-B\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4632.mp3\tLouis Jordan\tDon't Burn The Candle At Both Ends\tDECCA\t24483\tL4632\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DECLA2136.mp3\tBob Crosby's Bobcats\tDon't Call Me A Boy\tDECCA\t3431A\tLA2136\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_353.mp3\tHelene Dixon; Orch., Chorus Under The Dir. Of Phil Moore And George Siravo\tDon't Call My Name\tOKEH\t6964\tCO49106\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67636.mp3\tLouis Jordan & His Tympani 5\tDon't Come Cryin' On My Shoulder\tDECCA\t3253B\t67636\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_449.mp3\tFrankie Laine With Paul Weston And His Music From Hollywood And The Mellowmen\tDon't Cry\tColumbia\t40693\tHCO33790\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA30-0813x.mp3\tErskine Hawkins And His Orch.\tDon't Cry Baby\tRCA\t30-0813\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D314B.mp3\tErskine Hawkins And His Orchestra\tDon't Cry Baby\tV-DISC\t314B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061253.mp3\tGlenn Miller & His Orchestra\tDon't Cry Cherie\tBLUEBIRD\t11183\t061253\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe1130DC.mp3\tHenry Burr\tDon't Cry Little Girl, Don't Cry\tOKeh\t1130\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18569A.mp3\tLucky Millinder's Orch.\tDon't Cry, Baby\tDECCA\t18569A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_056.mp3\tErskine Hawkins And His Orchestra\tDon't Cry, Baby\tBLUEBIRD\t0813\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_078.mp3\tRalph Flanagan And His Orchestra Feat. Harry Prime\tDon't Cry, Joe (let Her Go, Let Her Go, Let Her Go)\tBluebird\t0007\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_099.mp3\tHenry Burr\tDon't Cry, Little Gril, Don't Cry\tVICTOR\t18516B\t22438-5\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_215.mp3\tRuss Morgan And His Orchestra\tDon't Cry, Sweetheart\tDecca\t18348\t70594\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS25372-1.mp3\tMildred Bailey - Alec Wilder 8\tDon't Dally With The Devil\tCBS\tVO5209\t25372-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_152.mp3\tEddy Duchin And His Orchestra\tDon't Do Anything I Wouldn't Do\tVICTOR\t24327\t76167\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC76167.mp3\tEddy Duchin & His Orchestra\tDon't Do Anything I Wouldn't Do (v L S)\tVICTOR\t24327\t76167\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_177.mp3\tGlen Gray And Casa Loma Orchestra\tDon't Do It, Darling\tDecca\t18479\t71280\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1950_0619_02.mp3\tLee Morse\tDon't Even Change A Picture On The Wall\tDecca\t27163B\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010561.mp3\tTommy Dorsey & His Clambake 7\tDon't Ever Change\tVICTOR\t25607\t010561\t1937\t\n\tMoon Mullican\tDon't Ever Take My Picture Down\tKING\t839\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23565x.mp3\tBillie Holiday\tDon't Explain\tDECCA\t23565\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic042551-1.mp3\tArtie Shaw And His Orchestra\tDon't Fall Asleep\tVictor\t26563\t042551-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/MER1813.mp3\tHelen Humes W Buck Clayton Or\tDon't Fall In Love With Me\tMERCURY\t8092\t1813\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3475.mp3\tBing Crosby And Andrews Sisters\tDon't Fence Me In\tDECCA\t23364\tL3475\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23484x.mp3\tBing Crosby - Vic Schoen Orch Vocal Andrews Sisters\tDon't Fence Me In\tDECCA\t23484\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH1143.mp3\tGene Autry\tDon't Fence Me In\tOKEH\t6728\tH1143\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1610.mp3\tSammy Kaye And His Orchestra\tDon't Fence Me In\tRCA\t20-1610\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_105.mp3\tKate Smith\tDon't Fence Me In\tCOLUMBIA\t36759\tCO33812-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_038.mp3\tSammy Kaye And His Orchestra\tDon't Fence Me In\tRCA\t20-1610\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU102746.mp3\tMonroe Brothers\tDon't Forget Me\tBLUEBIRD\t6552\t102746\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK1976.mp3\tDelmore Brothers\tDon't Forget Me\tKING\t548B\tK1976\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL17479-1.mp3\tCarter Family\tDon't Forget Me Little Darling\tCOLUMBIA\t20235\t17479-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38769.mp3\tMolly O'day Cumberland Mtn Flk\tDon't Forget The Family Prayer\tCOLUMBIA\t20441\tCO38769\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_300.mp3\tJune Valli\tDon't Forget To Write\tRCA\t20-5488\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/Pat105606.mp3\tFletcher Henderson And His Orchestra\tDon't Forget You'll Regret Day By Day\tPath? Actuelle\t\t105606  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC71237.mp3\tInk Spots\tDon't Get Around Much Any More\tDECCA\t18503B\t71237\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM53S3147.mp3\tBilly Eckstine\tDon't Get Around Much Anymore\tMGM\t11694\t53S3147\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71208-A.mp3\tGlen Gray & The Casa Loma Orchestra\tDon't Get Around Much Anymore\tDECCA\t18479\t71208-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO38938.mp3\tDuke Ellington's Orchestra\tDon't Get Around Much Anymore\tCOLUMBIA\t38464\tCO38938\t1947\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26610d.mp3\tDuke Ellington & His Famous Orchestra\tDon't Get Around Much Anymore\tVictor\t26610\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_039.mp3\tGlen Gray And Casa Loma Orchestra\tDon't Get Around Much Anymore\tDECCA\t18479B\t71208-A\t1943\t\nhttp://www.78-tours.net/mp3/SWIOSW26.mp3\tAlix Combelle Accompagn Par Ray Stokes (piano) Et Pierre Fouad (batterie)\tDon't Get Tired\tSWING\tSW. 52 B\tOSW. 26\t\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-26-1.mp3\tAlix Combelle's Hot Four\tDon't Get Tired\tSwing\t52\tOSW-26-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_234.mp3\tVaughn Monroe\tDon't Go To Strangers\tRCA Victor\tG204456358\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec74098.mp3\tLucky Millinder And His Orchestra\tDon't Hesitate Too Long\tDecca\t24384\t74098  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW400966-C.mp3\tLouis Armstrong's Hot Five\tDon't Jive Me\tCOLUMBIA\t36376\tW400966-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0625_01.mp3\tLee Morse\tDon't Keep Me In The Dark, Bright Eyes\tColumbia\t1466DA\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC72972A.mp3\tDelta Rhythm Boys\tDon't Knock It\tDECCA\t18739B\t72972A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM145-1.mp3\tCab Calloway & His Orchestra\tDon't Know If I'm Comin' Or Goin'\tVARIETY\tI535\tM145-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-848-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tDon't Know If I'm Comin' Or Goin' \tParlophone\tF-868\tCE-848-1\t1937\tValaida Snow t v acc. by Johnny Claes t, Derek Neville as bar, Reggie Dare ts, Gun Finlay p, Norman Brown g, Louis Barreiro b, Ken Stewart d\nhttp://www.jazz-on-line.com/a/mp3c/VIC18604-1.mp3\tMarion Harris\tDon't Leave Me Daddy\tVICTOR\t18185\t18604-1\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4305-3.mp3\tEddie Condon & His Band\tDon't Leave Me Daddy\tCOMMODORE\t542\t4305-3\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_116.mp3\tCowboy Copas Feat. Elliot Lawrence And R. Patton\tDon't Leave My Poor Heart Breaking\tKING\t15137\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC15760-1.mp3\tCarl Shaw And Ho (reichman)\tDon't Let It Bother You\tARC\tVO2786\t15760-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC84107-1.mp3\tFats Waller And His Rhythm\tDon't Let It Bother You\tVICTOR\t24714\t84107-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84107-1.mp3\tFats Waller And His Rhythm\tDon't Let It Bother You\tVictor\t24714\t84107-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC38719-A.mp3\tDorsey Brothers Orchestra\tDon't Let It Bother You (v3)\tDECCA\t207A\t38719-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5286.mp3\tJoe Marsala Septet\tDon't Let It End\tMUSICRAFT\t329\t5286\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480582.mp3\tNat King Cole\tDon't Let It Go To Your Head\tCapitol\tEAP4/EBF2/W-782\t15895-10\t1957\tNat King Cole, P & Vocal, Willie Smith, As, John Collins, G, Charlie Harris, B, Lee Young, D\nhttp://www.jazz-on-line.com/a/mp3l/DEC38521-A.mp3\tIsham Jones And His Orchestra\tDon't Let It Happen Again - Vocal Joe Martin\tDecca\t171\t38521-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC4363.mp3\tTexas Ruby And Curly Fox\tDon't Let That Man Get You Down\tCOLUMBIA\t36901\tC4363\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1313-A.mp3\tBing Crosby & Trotter's Orchestra\tDon't Let That Moon Get Away\tDECCA\t1934A\tDLA1313-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4300.mp3\tLionel Hampton & His Orchestra\tDon't Let The Landlord Gyp You\tDECCA\t23834\tL4300\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-4300-A.mp3\tLionel Hampton And His Orchestra\tDon't Let The Landlord Gyp You\tDecca\t23834\tL-4300-A\t1946\tLionel Hampton p  vib v dir. Joe Wilder Duke Garrette Leo Shepherd Joe Morris  Wendell Culley  Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn   Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb johnny Griffin ts, Charlie Fowlkes bar, Mi\nhttp://www.jazz-on-line.com/a/mp3b/VocC-2231-1.mp3\tFletcher Henderson And His Orchestra\tDon't Let The Rhythm Go To Your Head\tVocalion\t4180\tC-2231-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2216x.mp3\tSkeets Mcdonald\tDon't Let The Stars Get In Your Eyes\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAE2VB7690.mp3\tPerry Como\tDon't Let The Stars Get In Your Eyes\tRCA\t20-5064\tE2VB7690\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_085.mp3\tGisele Mackenzie\tDon't Let The Stars Get In Your Eyes\tCapitol\t2256\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_289.mp3\tEileen Barton\tDon't Let The Stars Get In Your Eyes\tCORAL\t60882\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_008.mp3\tPerry Como Feat. Hugo Winterhalter's Orchestra And The Ramblers\tDon't Let The Stars Get In Your Eyes\tRCA Victor\t5064\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_287.mp3\tRed Foley\tDon't Let The Stars Get In Your Eyes\tDECCA\t28460\ts83529\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18818B.mp3\tLouis Jordan And Tympani 5\tDon't Let The Sun Catch You Cryin'\tDECCA\t18818B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144521-2.mp3\tCharlie Poole's N.c.ramblers\tDon't Let Your Deal Go Down\tCOLUMBIA\t15184 D\tW144521-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_253.mp3\tNat King Cole Feat. O/nelson Riddle\tDon't Let Your Eyes Go Shopping (for Your Heart)\tCAPITOL\t2346\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC15202-1.mp3\tGene Kardos And His Orch.\tDon't Let Your Love Go Wrong\tARC\tVO2717\t15202-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15162.mp3\tClaude Hopkins And His Orchestra\tDon't Let Your Love Go Wrong\tBRUNSWICK\t6891\t15162\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU15357-A.mp3\tBoswell Sisters\tDon't Let Your Love Go Wrong\tBRUNSWICK\t6929\t15357-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC60124-A.mp3\tIsham Jones And His Orchestra\tDon't Mention Love To Me - Vocal Eddy Stone\tDECCA\t610\t60124-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81652-1.mp3\tThe Georgians\tDon't Mind The Rain\tColumbia\t114-D\t81652-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_234.mp3\tEddy Arnold\tDon't Rob Another Man's Castle\tRCA Victor\t0002\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-21573-1.mp3\tClaude Thornhill And His Orchestra With Maxine Sullivan\tDon't Save Your Love (for A Rainy Day)\tBrunswick\t7957\tB-21573-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVOC4671.mp3\tHi-flyers\tDon't Say Goodbye\tVOCALION\t4671\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL742.mp3\tHi-flyers\tDon't Say Goodbye\tVOCALION\t4671\tDAL742\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_398.mp3\tBuddy Greco\tDon't Say Goodbye\tCoral\t61038\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60832.mp3\tJimmie Davis\tDon't Say Goodbye If You Love Me\tDECCA\t5270\t60832\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/SILP2219-1.mp3\tLovie Austin Blue Serenaders\tDon't Shake It No More\tSILVERTONE\t3552\tP2219-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU071861.mp3\tGlenn Miller And His Orchestra\tDon't Sit Under The Apple Tree\tBLUEBIRD\t11474-B\t071861\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA2973.mp3\tAndrew Sisters\tDon't Sit Under The Apple Tree\tDECCA\t18312A\tDLA2973\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec18312.mp3\tAndrews Sisters\tDon't Sit Under The Apple Tree\tDecca\t18312\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/DECLA2930.mp3\tBob Crosby & His Orchestra\tDon't Sit Under The Apple Tree\tDECCA\t4290A\tLA2930\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_157.mp3\tAndrews Sisters\tDon't Sit Under The Apple Tree\tDecca\t18312\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_080b.mp3\tEddie Fisher\tDon't Stay Away Too Long\tRCA Victor\t6196\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD9VB1860.mp3\tRose Murphy (the Chee-chee Girl)\tDon't Stop\tVictor\t\tD9VB1860\t1949\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD9VB1859.mp3\tRose Murphy (the Chee-chee Girl)\tDon't Stop\tVictor\t\tD9VB1859\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS2020.mp3\tBunny Banks Trio\tDon't Stop Now (vbonnie Davis)\tSAVOY\t102A\tS2020\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC4434B.mp3\tLawrence Welk & His Orch.\tDon't Sweetheart Me\tDECCA\t4434B\t?\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh035.mp3\tGeraldo And His Orchestra\tDon't Sweetheart Me (v Sally Douglas)\tParlophone\tF-2040\tCE-11273-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_044.mp3\tEddie Morton\tDon't Take Me Home\tCOLUMBIA\tA-0742\t04177-1\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_104.mp3\tHelen Clark And Joseph Phillips\tDon't Take My Darling Boy Away\tEDISON\t50247\t3700\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL155-.mp3\tAl Hibbler W Harry Carney Band\tDon't Take Your Love From Me\tALLADDIN\t155\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26464-A.mp3\tMildred Bailey\tDon't Take Your Love From Me\tCOLUMBIA\t35921\t26464-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC125.mp3\tBilly Eckstine & His Orchestra\tDon't Take Your Love From Me\tNATIONAL\t\tNSC125\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1045.mp3\tLuis Russell & His Orchestra\tDon't Take Your Love From Me\tAPOLLO\t1020\tR1045\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC066149.mp3\tArtie Shaw And His Orchestra\tDon't Take Your Love From Me\tVICTOR\t27509\t066149-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_208.mp3\tGlen Gray And Casa Loma Orchestra\tDon't Take Your Love From Me\tDECCA\t18615\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CONC1768-1.mp3\tChicago Black Swans\tDon't Tear My Clothes #2 (vbig Bill)\tCONQUEROR\t8780\tC1768-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071908.mp3\tUna Mae Carlisle\tDon't Tech It\tBLUEBIRD\t11491\t071908\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D276B1.mp3\tIna Ray Hutton And Her Orchestra\tDon't Tech It\tV-DISC\t276B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_198.mp3\tWoody Herman And His Orchestra\tDon't Tell A Lie About Me, Dear\tDECCA\t18357A\t70691\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COL30159DT.mp3\tHot Lips Page Orchestra\tDon't Tell A Man About His Woman\tCOLUMBIA\t30159\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC6124.mp3\tIsham Jones And His Orchestra\tDon't Tell Her What Happened To Me\tBRUNSWICK\t4907\tC6124\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150740.mp3\tRuth Etting\tDon't Tell Her What's Happened To Me\tCOLUMBIA\t2280 D\tW150740\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_450.mp3\tJoni James\tDon't Tell Me Not To Love You\tMGM\t12175\t55S970\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/PUR1393.mp3\tFletcher Henderson & His Orchestra\tDon't Think You'll Be Missed\tPURITAN\tTR11247\t1393\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021155.mp3\tFats Waller And His Rhythm\tDon't Try To Cry Your Way Back To Me\tVICTOR\t25817\t021155\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUOEA6383.mp3\tFats Waller And His Rhythm\tDon't Try Your Jive On Me\tBLUEBIRD\t10100\tOEA6383\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh139.mp3\tDanny Polo And His Swing Stars\tDon't Try Your Jive On Me\tDecca\tF-6604\tDTB-3484-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141393-2.mp3\tTed Lewis And His Orchestra\tDon't Wake Me Up (let Me Dream)\tCOLUMBIA\t531 D\tW141393-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC33434-5.mp3\tHoward Lanin's Franklin Orchestra\tDon't Wake Me Up, Let Me Dream\tVICTOR\t19797\t33434-5\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22972.mp3\tGlenn Miller & His Orchestra\tDon't Wake Up My Heart\tCBS\tBR8152\t22972\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63932.mp3\tWoody Herman & His Orchestra\tDon't Wake Up My Heart\tDECCA\t1900A\t63932\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC035007.mp3\tHal Kemp And His Orchestra\tDon't Worry 'bout Me\tVICTOR\t26188\t035007\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S644.mp3\tSarah Vaughan\tDon't Worry 'bout Me\tMGM\t30733\t48S644\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76669.mp3\tArtie Shaw And His Orchestra\tDon't Worry 'bout Me\tDECCA\t27213\t76669\t1950\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu10161.mp3\tLes Brown's Band Of Reknown\tDon't Worry 'bout Me\tBluebird\t10161\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_113.mp3\tFrank Sinatra\tDon't Worry 'bout Me\tCapitol\t2787\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24243-1.mp3\tCount Basie & His Orchestra\tDon't Worry 'bout Me (v Helen Hume)\tCBS\tVO4734\t24243-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5653-1.mp3\tTeddy Wilson Octet\tDon't Worry 'bout Me (v Sarah Vaughn)\tMUSICRAFT\t421\t5653-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SAV3324.mp3\tStan Getz Quintette\tDon't Worry About Me\tSAVOY\t932B\t3324\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65441.mp3\tElla Fitzgerald & Her Savoy 8\tDon't Worry About Me\tDECCA\t2451A\t65441\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65441-A.mp3\tElla Fitzgerald And Her Savoy Eight\tDon't Worry About Me\tDecca\t2451\t65441-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24243-1.mp3\tCount Basie And His Orchestra\tDon't Worry About Me\tVocalion\t4734\t24243-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18734A.mp3\tLouis Jordan\tDon't Worry About That Mule\tDECCA\t18734-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5701.mp3\tArtie Shaw And His Orchestra\tDon't You Believe It Dear\tMUSICRAFT\t445\t5701\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142039-1.mp3\tGid Tanner's Skillet Lickers\tDon't You Hear Jerusalem Moan\tCOLUMBIA\t15104 D\tW142039-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/GOTS1183.mp3\tDon Byas Qt\tDon't You Know I Care\tGOTHAM\t132\tS1183\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010648.mp3\tFats Waller And His Rhythm\tDon't You Know Or Don't You Care?\tVICTOR\t25604\t010648\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62517.mp3\tWoody Herman & His Orchestra\tDon't You Know Or Don't You Care?\tDECCA\t1397\t62517\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL934x.mp3\tClovers\tDon't You Know That I Love You\tATLANTIC\t934\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041361.mp3\tJelly Roll Morton Jazzmen\tDon't You Leave Me Here\tBLUEBIRD\t10450\t041361\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU044978-3.mp3\tTampa Red\tDon't You Lie To Me\tBLUEBIRD\t8654\t044978-3\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_270.mp3\tBuddy Clark Feat. O/mitchell Ayres\tDon't You Love Me Anymore\tCOLUMBIA\t37920\tCO38071\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74075.mp3\tBob Eberly / Eddie Heywood Or.\tDon't You Love Me Anymore?\tDECCA\t24195\t74075\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC64435.mp3\tBlue Lu Barker & Fly Cats\tDon't You Make Me High\tDECCA\t7506\t64435\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_283.mp3\tBlue Lu Barker Feat. Danny Barker's Fly Cats\tDon't You Make Me High\tDECCA\t7506\t64435\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62684.mp3\tCount Basie & His Orchestra\tDon't You Miss Your Baby (vjr)\tDECCA\t1770A\t62684\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D341B1.mp3\tAndy Russell\tDon't You Notice Anything New\tV-DISC\t341B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14034-1.mp3\tBlind Willie (mctell)\tDon't You See How This World Made A Change\tARC\tVO2623z\t14034-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/Vic62237-1.mp3\tKing Oliver And His Orchestra\tDon't You Think I Love You?\tVictor\t23001\t62237-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74013.mp3\tElla Fitzgerald W Bob Haggart\tDon't You Think I Oughta Know\tDECCA\t24157\t74013\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB1090.mp3\tCount Basie & His Orchestra\tDon't You Want A Man Like Me\tRCA\t20-2602\tD7VB1090\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC75802.mp3\tElla Fitzgerald / Sy Oliver\tDon'tcha Go 'way Mad!\tDECCA\t24917\t75802\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/DecB-13360-A.mp3\tSpike Hughes And His Negro Orchestra With Benny Carter\tDonegal Cradle Song \tDecca \tF-3717\tB-13360-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D100A.mp3\tAllan Jones\tDonkey Serenade\tV-DISC\t100A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/SAVS3420-A.mp3\tCharlie Parker\tDonna Lee\tSAVOY\t928\tS3420-A\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480693.mp3\tArt Pepper\tDonna Lee (alternate Take)\tContemporary\tM3568\t\t1959\tJack Sheldon, Al Porcino (tp), Dick Nash (tb), Bob Enevoldsen (vtb), Vice DeRosa (fhr), Art Pepper, Bud Shank (as), Bill Perkins (ts), Med Flory (bar), Russ Freeman (p), Joe Mondragon (sb), Mel Lewis (dm), Marty Paich (arr, con\nhttp://www.jazz-on-line.com/a/mp3t/TS480686.mp3\tArt Pepper\tDonna Lee (original Take)\tContemporary\tM3568\t\t1959\tJack Sheldon, Al Porcino (tp), Dick Nash (tb), Bob Enevoldsen (vtb), Vice DeRosa (fhr), Art Pepper, Bud Shank (as), Bill Perkins (ts), Med Flory (bar), Russ Freeman (p), Joe Mondragon (sb), Mel Lewis (dm), Marty Paich (arr, cond)\nhttp://www.jazz-on-line.com/a/mp3a/OKE9729-A.mp3\tLouis Armstrong's Hot Five\tDont Forget To Mess Around\tOKeh\t8343\t09729-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Par1393-2.mp3\tFletcher Henderson And His Orchestra\tDont Think You'll Be Missed\tParamount\t20226\t1393-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec1297.mp3\tClyde Mccoy & His Orchestra\tDoo Wacka Doo\tDecca\t1297\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81784-2.mp3\tThe Georgians\tDoodle Doo Doo\tColumbia\t142-D\t81784-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140037.mp3\tEddie Cantor\tDoodle Doo Doo\tCOLUMBIA\t213D\t140037\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_060.mp3\tEddie Cantor\tDoodle-doo-doo\tCOLUMBIA\t213D\t140037\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe81585-A.mp3\tVictoria Spivey W L.johnson\tDope Head Blues\tOKeh\t8531\t81585-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23683.mp3\tSlim And Slam\tDopey Joe\tCBS\tPAR2634\t23683\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA520-A.mp3\tJimmy Dorsey's Orchestra\tDorsey Dervish\tDECCA\t1040B\tDLA520-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59692-2.mp3\tDuke Ellington & His Orchestra\tDouble Check Stomp\tVICTOR\t38129\t59692-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVSLA4456-2.mp3\tJohnny Otis Quintet And Robins\tDouble Crossin' Blues (vlittle Esther)\tSAVOY\t731A\tSLA4456-2\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64973-A.mp3\tRosetta Crawford With Mezz Mezzrow\tDouble Crossin' Papa\tDecca\t7584\t64973-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62518.mp3\tWoody Herman & His Orchestra\tDouble Or Nothing\tDECCA\t1397\t62518\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COL29510-1.mp3\tJohn Kirby & His Orchestra\tDouble Talk\tCOLUMBIA\t35998\t29510-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/CorL-4305-.mp3\tLionel Hampton And His Octet\tDouble Talk\tCoral\t6.22180\tL-4305-\t1946\tLionel Hampton p  vib v dir. Joe Wilder Duke Garrette Leo Shepherd Joe Morris  Wendell Culley  Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn   Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb johnny Griffin ts, Charlie Fowlkes bar, Mi\nhttp://www.jazz-on-line.com/a/mp3c/VIC92748-2.mp3\tRay Noble & His Orchestra\tDouble Trouble (v4) ('big Broadcast 1935')\tVICTOR\t25105\t92748-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru72871-A.mp3\tLionel Hampton And His Septet\tDoublin' With Dublin\tBrunswick\t04005\t72871-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-322-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tDouce Ambiance\tSWING\t183\tOSW-322-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65308-A.mp3\tLouis Jordan & His Tympani 5\tDoug The Jitterbug\tDECCA\t7590\t65308-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic049932-1.mp3\tLionel Hampton And His Orchestra\tDough-ra-me\tVictor\t26696\t049932-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8946DA.mp3\tLester Young Qt\tDown 'n Adam\tMERCURY\t8946\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW265052.mp3\tDuke Ellington Orchestra\tDown A Carolina Lane\tCOLUMBIA\tE\tW265052\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC15924-1.mp3\tLyric Qt\tDown Among The Sheltering Palms\tVICTOR\t17778\t15924-1\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74031.mp3\tEddie Condon & His Orchestra\tDown Among The Sheltering Palms\tDECCA\t24219A\t74031\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/COLB-12080-A.mp3\tEarl Hines\tDown Among The Sheltering Palms\tCOLUMBIA\t35877\tB-12080-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB6672-2.mp3\tArthur Collins-byron Harlan\tDown Among The Sugar Cane\tVICTOR\t16680\tB6672-2\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_013.mp3\tArthur Collins And Byron Harlan\tDown Among The Sugar Cane\tColumbia\t5098\t30197\t1909\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC056168.mp3\tLeo Reisman & His Orchestra\tDown Argentina Way\tVICTOR\t26765\t056168\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_090.mp3\tEddy Duchin And His Orchestra\tDown Argentina Way\tCOLUMBIA\t35774\t28750\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_124.mp3\tShep Fields And His Rippling Rhythm Orchestra\tDown Argentina Way\tBluebird\t10886\t56305\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE28642-1.mp3\tGene Krupa & His Orchestra\tDown Argentina Way (v Irene Daye)\tOKEH\t5826\t28642-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DECLA2109.mp3\tBob Crosby And His Orch\tDown Argentine Way\tDECCA\t3404B\tLA2109\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_021.mp3\tBob Crosby And His Orchestra\tDown Argentine Way\tDECCA\t3404B\tLA2109\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_068.mp3\tArthur Collins And Byron Harlan\tDown At The Huskin' Bee\tVICTOR\t16365\tB8116-3\t1909\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB8116-3.mp3\tArthur Collins-byron Harlan\tDown At The Husking Bee\tVICTOR\t16365\tB8116-3\t1909\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC69358-2.mp3\tJimmie Davis\tDown At The Old Country Church\tVICTOR\t23628\t69358-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1902.mp3\tAl Dexter And His Troopers\tDown At The Roadside Inn\tCOLUMBIA\t37303\tHCO1902\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC86221.mp3\tFrankie Trumbauer & His Orch\tDown At Uncle Bills\tVICTOR\t24812\t86221\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_284.mp3\tAndrews Sisters\tDown By The O-hi-o\tDECCA\t3065B\t67226\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67226.mp3\tAndrews Sisters\tDown By The Ohio\tDECCA\t3065B\t67226\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC17000.mp3\tHarry Macdonough\tDown By The Old Mill Stream\tVICTOR\t17000\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC11074-2.mp3\tHarry Macdonough\tDown By The Old Mill Stream\tVICTOR\t17000\t11074-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1121-2.mp3\tSweet Violet Boys\tDown By The Old Mill Stream\tVOCALION\t3256\tC1121-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64819.mp3\tThree Peppers\tDown By The Old Mill Stream\tDECCA\t2239B\t64819\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/OKEWC2588.mp3\tGene Krupa & His Orch\tDown By The Old Mill Stream\tOKEH\t6070\tWC2588\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_002.mp3\tHarry Macdonough\tDown By The Old Mill Stream\tVICTOR\t17000\t11074-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_011.mp3\tArthur Clough\tDown By The Old Mill Stream\tCOLUMBIA\t1057\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63585-A.mp3\tJimmie Lunceford And His Orchestra\tDown By The Old Mill Stream\tDecca\t1927\t63585-A\t1938\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA94.mp3\tBing Crosby & George Stoll\tDown By The River\tDECCA\t392A\tDLA94\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA100.mp3\tGuy Lombardo Royal Canadians\tDown By The River\tDECCA\t393A\tDLA100\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/PUR600.mp3\tFletcher Henderson & His Orch\tDown By The River\tPURITAN\tPU11256\t600\t\t\nhttp://www.jazz-on-line.com/a/mp3o/JAZ8x.mp3\tBunk Johnson's Original Superio\tDown By The River\tJazz Man\t8\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru2436d.mp3\tErnest Hare & The Cotton Pickers\tDown By The River\tBrunswick\t2436\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/BruDLA94-B.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tDown By The River\tBrunswick\tE01994\tDLA94-B \t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC87498-1.mp3\tRay Noble And His Orchestra\tDown By The River (v Al Bowly)\tVICTOR\t24879\t87498-1\t1935\twith Al Bowlly\nhttp://www.jazz-on-line.com/a/mp3e/DECL7454.mp3\tBing & Gary Crosby\tDown By The Riverside\tDECCA\t28955\tL7454\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_302.mp3\tBing And Gary Crosby\tDown By The Riverside\tDECCA\t28955\tL7454\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_137.mp3\tFour Lads Feat. Norman Leyden's Orchestra\tDown By The Riverside\tCOLUMBIA\t40005\tCO48845\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S3371.mp3\tSlim Gaillard Trio\tDown By The Station\tMGM\t10309A\t47S3371\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_184.mp3\tGuy Lombardo And His Royal Canadians\tDown By The Station\tDecca\t24555\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_100.mp3\tTommy Dorsey And His Orchestra Feat. Denny Dennis, Lucy Ann Polk, And Sentimentalists\tDown By The Station\tVICTOR\t3317\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE31766.mp3\tCount Basie And His Orch\tDown For Double\tOKEH\t6584\t31766\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403893-B.mp3\tJack Purvis & His Orch\tDown Georgia Way\tOKeh\t8782\t403893-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80863-5.mp3\tBessie Smith\tDown Hearted Blues\tCOLUMBIA\tA-3844\t80863-5\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN11015-1.mp3\tCab Calloway & His Orch\tDown Hearted Blues\tBANNER\t32340\t11015-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/GRE1406-PM.mp3\tFletcher Henderson's Orch\tDown Hearted Blues\tGREYGULL\t7012\t1406-PM\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_005.mp3\tBessie Smith\tDown Hearted Blues\tCOLUMBIA\tA-3844\t80863-5\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Par1406-2.mp3\tFletcher Henderson's Orchestra\tDown Hearted Blues\tParamount\t20235\t1406-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc11664-5.mp3\tFletcher Henderson's Orchestra\tDown Hearted Blues\tVocalion\t14636\t11664-5\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_056.mp3\tEthel Waters\tDown Home Blues\tCOLUMBIA\t14093 D\tW140792-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC025866.mp3\tLionel Hampton And His Orch\tDown Home Jump\tVICTOR\t26114\t025866\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/WES105x.mp3\tLu Watters's Yerba Buena Jazz B\tDown Home Rag\tWest Coast\t105\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECCE8806.mp3\tHarry Roy & His Orchestra\tDown Home Rag\tDECCA\t2619B\tCE8806\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16641-1.mp3\tBenny Goodman And His Orchestra\tDown Home Rag\tARC\tCO3033D\t16641-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC028179.mp3\tTommy Dorsey & His Orch\tDown Home Rag\tVICTOR\t26097\t028179\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_040.mp3\tArthur Collins And Byron Harlan\tDown In Chattanooga\tVICTOR\t17527\t14097-1\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143902-2.mp3\tDarby & Tarlton\tDown In Florida On A Hog\tCOLUMBIA\t15197 D\tW143902-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_040.mp3\tArthur Collins And Byron Harlan\tDown In Jungle Town\tVICTOR\t16805\tB6175-2\t1908\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143707-2.mp3\tEllington Duke Washingtonians\tDown In Our Alley Blues\tCOLUMBIA\t1076 D\tW143707-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/Col143707-2.mp3\tDuke Ellington And His Washingtonians\tDown In Our Alley Blues\tColumbia\t1076-D\t143707-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_099.mp3\tHenry Burr And Albert Campbell\tDown In Sunshine Valley\tVICTOR\t17018\t10815-5\t1912\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66248.mp3\tBlue Lu Barker & Fly Cats\tDown In The Dumps\tDECCA\t7713\t66248\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3221.mp3\tAndrew Sisters And Vic Schoen\tDown In The Valley\tDECCA\t18572-B\tL3221\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4122.mp3\tBurl Ives\tDown In The Valley\tDECCA\t23591\tL4122\t1946\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC18572B.mp3\tAndrews Sisters & Vic Schoen\tDown In The Valley\tDECCA\t18572B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU011823.mp3\tWade Mainer And Zeke Morris\tDown In The Willow\tBLUEBIRD\t7298\t011823\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49457-1.mp3\tJelly Roll Morton Peppers\tDown My Way\tVICTOR\t38113B\t49457-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic49457-1.mp3\tJelly Roll Morton And His Orchestra\tDown My Way\tVictor\tV-38113\t49457-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D379B2.mp3\tHarry Owens And His Royal Hawaiians\tDown On Ami Ami Oni Oni Isle\tV-DISC\t379B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149254-2.mp3\tBentley Boys\tDown On Penny's Farm\tCOLUMBIA\t15565 D\tW149254-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1442.mp3\tSweet Violet Boys\tDown On The Farm\tVOCALION\t3327\tC1442\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70952.mp3\tGene Kardos & His Orch\tDown On The Farm (v D R)\tVICTOR\t22863\t70952\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL354.mp3\tHi-flyers\tDown On The Trail\tVOCALION\t4011\tDAL354\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC12089.mp3\tFletcher Henderson & His Orch\tDown South Blues\tVOCALION\t14691B\t12089\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC90094.mp3\tSleepy John Estes\tDown South Blues\tDECCA\t7325\t90094\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC7325.mp3\tSleepy John Estes\tDown South Blues\tDECCA\t7325\t90094\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc12089.mp3\tFletcher Henderson's Orchestra\tDown South Blues\tVocalion\t14691\t12089\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec38603-A.mp3\tFletcher Henderson And His Orchestra\tDown South Camp Meetin'\tDecca\t213\t38603-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC97713.mp3\tBenny Goodman And His Orchestra\tDown South Camp Meeting\tVICTOR\t25387\t97713\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38603.mp3\tFletcher Henderson & His Orch\tDown South Camp Meeting\tDECCA\t213B\t38603\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/VARM439-1.mp3\tCalifornia Ramblers (barnet)\tDown South Camp Meeting\tVARIETY\tI577\tM439-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021168.mp3\tBunny Berigan & His Orch\tDown Stream\tVICTOR\t25811B\t021168\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC12329-2.mp3\tArthur Pryor's Band\tDown The Field March\tVICTOR\t17289\t12329-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3e/BANB805-A.mp3\tBing Crosby\tDown The Old Ox Road\tBANNER\t33168\tB805-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic023751-1.mp3\tMaxine Sullivan With Claude Thornhill And Orchestra\tDown The Old Ox Road\tVictor\t25894\t023751-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70649-1.mp3\tJimmie Rodgers\tDown The Old Road To Home\tVICTOR\t23711\t70649-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17359x.mp3\tThe Tiger\tDown The Road\tDECCA\t17359\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL27872-1.mp3\tWill Bradley Trio\tDown The Road A Piece\tCOLUMBIA\t35707\t27872-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_081.mp3\tWill Bradley And His Orchestra Feat. V/ray Mckinley And Will Bradley\tDown The Road A Piece\tCOLUMBIA\t35707\t27872-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3125.mp3\tWoody Herman & His Orch\tDown Under\tDECCA\t18544A\tL3125\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_074.mp3\tCollins And Harlan\tDown Where The Big Bananas Grow\tVICTOR\t16446\tB8320-2\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_076.mp3\tHarry Anthony\tDown Where The Silv'ry Mohawk Flows\tEDISON\t9075\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_042.mp3\tHaydn Quartet\tDown Where The Silv'ry Mohawk Flows\tVictor\t4378\tB2650\t1905\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9450.mp3\tBilly Jones - Ernest Hare - O\tDown Where The South Begins\tEDISON\tBA 4892\t9450\t\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC46020-1.mp3\tCoon Sanders Nighthawk Orch\tDown Where The Sun Goes Down\tVICTOR\t21546\t46020-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_178.mp3\tCoon-sanders Orchestra\tDown Where The Sun Goes Down\tVICTOR\t21546\t46020-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_002.mp3\tArthur Collins And Byron Harlan\tDown Where The Wurzburger Flows\tVICTOR\t1635\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014682.mp3\tTommy Dorsey & His Orch\tDown With Love\tVICTOR\t25692\t014682\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1777x.mp3\tJoe Fingers Carr\tDown Yonder\tCAPITOL\t1777\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4577.mp3\tChamp Butler\tDown Yonder\tCOLUMBIA\t39533\tHCO4577\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74968.mp3\tBuddy Johnson And His Orch\tDown Yonder\tDECCA\t24675\t74968\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC24356.mp3\tPeerless Qt\tDown Yonder\tVICTOR\t18775\t24356\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_259.mp3\tFrank Petty Trio\tDown Yonder\tMGM\t11057\t51S6119\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_135.mp3\tChamp Butler\tDown Yonder\tCOLUMBIA\t39533\tHCO4577\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_104.mp3\tJoe ''fingers'' Carr\tDown Yonder\tCAPITOL\t1777\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_212.mp3\tLawrence (piano Roll) Cook\tDown Yonder\tABBEY\t15053\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11015-1.mp3\tCab Calloway And His Orchestra\tDown-hearted Blues\tBanner\t32340\t11015-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_042.mp3\tEddie Fisher\tDownhearted\tRCA Victor\t5137\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic025866-1.mp3\tLionel Hampton And His Orchestra\tDownhome Jump\tVictor\t26114\t025866-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61950-B.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tDownstream\tDecca\t1531\t61950-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41822-1.mp3\tFrank Stokes\tDowntown Blues\tVICTOR\t21272\t41822-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOM1512.mp3\tEdmond Hall Sextet\tDowntown Cafe Boogie\tCOMMODORE\t1512\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COMA4704.mp3\tEdmond Hall Sextet\tDowntown Cafe Boogie\tCOMMODORE\t1512\tA4704\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/CON626U.mp3\tSlam Stewart Qt\tDozin'\tCONTIN\t10004\t626U\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38663.mp3\tSpirits Of Rhythm\tDr Watson And Mr Holmes\tDECCA\t160B\t38663\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/MEM4x.mp3\tSouthern Jazz Group\tDr. Jazz\tMemphis\t4\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC055195.mp3\tArtie Shaw And His Gramercy Five\tDr. Livingston, I Presume\tVICTOR\t27289\t055195-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29009-1.mp3\tCount Basie And His Orchestra\tDraftin' Blues\tOkey\t5897\t29009-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC5725.mp3\tMary Lou Williams\tDrag Em\tBRUNSWICK\t7178\tC5725\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Col151418-2.mp3\tThomas \"fats\" Waller And His Hot Piano\tDraggin' My Heart Around\tColumbia\t14593-D\t151418-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP4170-2.mp3\tJulia Lee And Her Boyfriends\tDragging My Heart Around\tCAPITOL\t\t4170-2\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2562x.mp3\tRay Anthony\tDragnet\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_019.mp3\tRay Anthony\tDragnet\tCapitol\t2562\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPxyz.mp3\tPied Pipers\tDream\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC86479.mp3\tThe Four Aces\tDream\tDECCA\t29217\t86479\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1967-.mp3\tVaughn Monroe\tDream\tRCA\t20-1967\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_190.mp3\tJimmy Dorsey And His Orchestra Feat. Teddy Waiters\tDream\tDECCA\t18670A\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_115.mp3\tFour Aces Feat. Jack Pleis And His Orchestra\tDream\tDECCA\t29217\t86479\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC67508-2.mp3\tWayne King And His Orch\tDream A Little Dream Of Me\tVICTOR\t22643\t67508-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38434.mp3\tFrankie Carle\tDream A Little Dream Of Me\tCOLUMBIA\t38783\tCO38434\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/MER5458DL.mp3\tFrankie Laine\tDream A Little Dream Of Me\tMERCURY\t5458\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_190.mp3\tFrankie Laine\tDream A Little Dream Of Me\tMERCURY\t5458\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76750.mp3\tLouis Armstrong - Sy Oliver\tDream A Little Dream On Me\tDECCA\t27209\t76750\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75288.mp3\tElla Fitzgerald\tDream A Little Longer\tDECCA\t24900\t75288\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_213.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tDream Awhile\tVICTOR\t25361\t97625-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_305.mp3\tFrank Devol And His Orchestra Feat. Emery Deutsch Choir\tDream Awhile\tCapitol\t1143\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3h/COL170422-1.mp3\tYale Collegians\tDream Child\tCOLUMBIA\t139P\t170422-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU11945.mp3\tCarl Fenton And His Orch\tDream Daddy\tBRUNSWICK\t2525\t11945\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK9236.mp3\tJesse Belvin\tDream Girl\tKING\t4607\tK9236\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2443.mp3\tBing Crosby\tDream Girl Of P.i.k.a\tDECCA\t4000B\tDLA2443\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_167.mp3\tNat Shilkret And The Victor Orchestra\tDream House\tVICTOR\t31392\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/MER20240.mp3\tJulia Lee W Tommy Doglas Orch\tDream Lucky Blues\tMERCURY\t8013\t20240\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480636.mp3\tBenny Carter & His Orch.\tDream Lullaby\tVocalion\t2898\t16413-1\t1934\tRussell Smith, Otis Johnson, Irving Randolph (tp), Benny Morton, Keg Johnson (tb), Benny Carter (cl, as), Ben Smith, Russell Procope (as), Ben Webster (ts), Teddy Wilson (p), Clarence Holiday (g), Elmer James (sb), Walter Johnson (dm)\nhttp://www.jazz-on-line.com/a/mp3c/VIC84923-1.mp3\tFats Waller And His Rhythm\tDream Man\tVICTOR\t24801A\t84923-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84923-1.mp3\t\"fats\" Waller And His Rhythm\tDream Man (make Me Dream Some More)\tVictor\t24801\t84923-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC50937-3.mp3\tGene Austin\tDream Mother\tVICTOR\t21915\t50937-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_146.mp3\tGene Austin Feat. O/nat Shilkret\tDream Mother\tVICTOR\t21915\t50937-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW142174-3.mp3\tLeo Reisman & His Orch\tDream Of Love And You\tCOLUMBIA\t673 D\tW142174-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3l/COL80414-2.mp3\tSpecht's Hotel Astor Orchestra\tDream Of Romany\tCOLUMBIA\tA-3738\t80414-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38915.mp3\tJimmie Lunceford & His Orch\tDream Of You\tDECCA\t765B\t38915\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/DECP-852.mp3\tDjango Reinhardt Et Son Quintette\tDream Of You\tDECCA\tMF21413\tP-852\t1951\t\nhttp://www.jazz-on-line.com/a/mp3h/ARCB-11437-A.mp3\tArt Kahn's  Orchestra\tDream Sweetheart\tARC\tME12339\tB-11437-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC2603.mp3\tAbe Lyman & His Californians\tDream Train\tBRUNSWICK\t4137\tC2603\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC057314.mp3\tSwing And Sway With Sammy Kaye\tDream Valley\tVICTOR\t26795\t057314\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68228.mp3\tWoody Herman & His Orchestra\tDream Valley\tDECCA\t3461A\t68228\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_253.mp3\tPercy Faith\tDream, Dream, Dream\tCOLUMBIA\t40185\tCO50619-1\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_457.mp3\tFour Aces Featuring Al Alberts\tDreamer\tDecca\t29989\tL9271\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03701.mp3\tAlbert Campbell\tDreaming\tCOLUMBIA\tA-0477\t03701\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_060.mp3\tHarry Macdonough\tDreaming\tVICTOR\t16658\tB4583-2\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_043.mp3\tAlbert Campbell\tDreaming\tCOLUMBIA\tA-0477\t03701\t1907\t\nhttp://www.jazz-on-line.com/a/mp3e/VICOE818.mp3\tRay Noble And His Orchestra\tDreaming A Dream\tVICTOR\t24850\tOE818\t1934\twith Al Bowlly\nhttp://www.jazz-on-line.com/a/mp3b/Joh024.mp3\tRay Noble New Mayfair Orchestra\tDreaming A Dream (v Al Bowlly)\tHMV\tB-6520\tOEA-818-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78154.mp3\tSterling Trio\tDreaming Of Home Sweet Home\tCOLUMBIA\tA-2668\t78154\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_035.mp3\tCharles Harrison\tDreaming Of Home, Sweet Home\tVICTOR\t18508\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW140909.mp3\tLeo Reisman & His Orch\tDreaming Of To-morrow\tCOLUMBIA\t464D\tW140909\t1925\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC33202-4.mp3\tCoon-sanders Nighthawk Orch\tDreaming Of Tomorrow\tVICTOR\t19804\t33202-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC049687.mp3\tArtie Shaw And His Orchestra\tDreaming Out Loud\tVICTOR\t26642\t049687-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_301.mp3\tBenny Goodman And His Orchestra Feat. V/helen Forrest\tDreaming Out Loud (v H.forrest)\tCOLUMBIA\t35574\t26981-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26981-A.mp3\tBenny Goodman & His Orch\tDreaming Out Loud (vh.forrest)\tCOLUMBIA\t35574\t26981-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic49687.mp3\tArtie Shaw And His Orchestra\tDreaming Out Loud ? V M T\tVictor\t26642\t49687\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402696-B.mp3\tTroy Floyd Shadowland Orch\tDreamland Blues\tOKeh\t8719\t402696-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402697-B.mp3\tTroy Floyd Shadowland Orch\tDreamland Blues Pt.2\tOKeh\t8719\t402697-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/ZON748.mp3\tZon-o-phone Concert Band\tDreams Of Childhood Waltz\tZon-O-Phone\t748\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC28125-2.mp3\tBenson Orchestra Of Chicago\tDreams Of India\tVICTOR\t19106\t28125-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_102.mp3\tBenson Orchestra Of Chicago\tDreams Of India\tVICTOR\t19106\t28125-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_059.mp3\tEnrico Caruso\tDreams Of Long Ago\tVICTOR\t88376\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071190.mp3\tGlenn Miller & His Orch\tDreamsville, Ohio\tBLUEBIRD\t11342 A\t071190\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol2152-D.mp3\tMoana Orchestra\tDreamy Hula Town\tColumbia\t2152-D\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC19150-A.mp3\tSterling Trio\tDreamy Melody\tVICTOR\t19150\t19150-A\t\t\nhttp://www.jazz-on-line.com/a/mp3e/GEN08210-A.mp3\tArt Landry's Call North Orch\tDreamy Melody\tGENNETT\t5255\t08210-A\t1923\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU14049.mp3\tGene Rodemich And His Orchestra\tDreary Weather\tBRUNSWICK\t2756B\t14049\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3h/MAJTJV-9501.mp3\tNickelodeon\tDrifting 'neath The Moon\tMAJOR RECORDS\t4116-B\tTJV-9501\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA2073.mp3\tOrrin Tucker And His Orch\tDrifting And Dreaming\tCOLUMBIA\t36227\tLA2073\t\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR141635-3.mp3\tHarmonians\tDrifting And Dreaming\tHARMONY\t127-H\t141635-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC34624-4.mp3\tGeorge Olsen & His Music\tDrifting And Dreaming\tVICTOR\t19969A\t34624-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol35332.mp3\tOrrin Tucker & His Orchestra\tDrifting And Dreaming\tColumbia\t35332\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_028.mp3\tGeorge Olsen And His Orchestra\tDrifting And Dreaming (sweet Paradise)\tVICTOR\t19969A\t34624-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC34391-4.mp3\tJean Goldkette & His Orch\tDrifting Apart\tVICTOR\t19975\t34391-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3l/COL81758-2.mp3\tLeo Reisman & His Orch\tDriftwood\tCOLUMBIA\t134D\t81758-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC35744D.mp3\tPaul Whiteman\tDriftwood - Where Is That Old Girl Of Mine\tVICTOR\t35744\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_059.mp3\tPaul Whiteman And His Orchestra\tDriftwood - Where Is That Old Girl Of Mine\tVICTOR\t35744\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1891_004.mp3\tGeorge J. Gaskin\tDrill, Ye Terriers, Drill\tBERLINER\t0064\t064\t1891\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143800.mp3\tGid Tanner's Skillet Lickers\tDrink Er Down\tCOLUMBIA\t15188 D\tW143800\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24679-A.mp3\tJohn Kirby & His Orch\tDrink To Me Only With Thine Eyes\tCBS\tVO4890\t24679-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC036504-5.mp3\tMaxine Sullivan\tDrink To Me Only With Thine Eyes\tVICTOR\t26260\t036504-5\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_172.mp3\tMario Lanza\tDrink, Drink, Drink\tRCA Victor\t4220\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/ATLA189.mp3\tSticks Mcghee And His Buddies\tDrinkin' Wine Spo-dee-o-dee\tATLANTIC\t873\t189\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK5717-1.mp3\tWynone Harris\tDrinkin' Wine, Spo-dee-o-dee\tKING\t4292A\tK5717-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4909-1.mp3\tPaul Howard's Cotton Pickers\tDrinking All My Troubles Away\tCOLUMBIA\t20428\tCCO4909-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/COLLA425.mp3\tAndy Iona's Novelty Four\tDrinking Song Of Hawaii\tCOLUMBIA\t3089 D\tLA425\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74854.mp3\tLionel Hampton & His Orch\tDrinking Wine Spo-dee-o-dee\tDECCA\t24642\t74854\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec74854.mp3\tLionel Hampton And His Orchestra\tDrinking Wine Spo-dee-o-dee, Drinking Wine\tDecca\t24642\t74854\t1949\tBenny Bailey-Duke Garrette-Wendell Culley-Leo Shepherd-Walter Wiliams-t, Lester Bass-Al Grey-Benny Powell-Jimmy Wormick-tb, Johnny Board-Bobby Plater-as, Gene MorrisJohnny Sparrow-Billy Williams-ts, Ben Kynard-bar, Doug Duke-p, Lionel Harnpton-vib-p,\nhttp://www.jazz-on-line.com/a/mp3w/1949_269.mp3\tStick Mcghee And His Buddies\tDrinking Wine, Spo-dee-o-dee, Drinking Wine\tATLANTIC\t873\t189\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc74922.mp3\tAndy Kirk And His Clouds Of Joy\tDrinking Wine, Spo-dee-o-dee, Drinking Wine\tVocalion\t55010\t74922\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM48S132.mp3\tJerry Irby\tDrivin' Nails In My Coffin\tMGM\t10284\t48S132\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99400.mp3\tTune Wranglers\tDrivin' The Doggies Along\tBLUEBIRD\t6403\t99400\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC93009-A.mp3\tSleepy John Estes\tDrop Down Blues\tDECCA\t7766\t93009-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC90176-A.mp3\tSleepy John Estes\tDrop Down Mama\tDECCA\t7289\t90176-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-125-1.mp3\tElisabeth Welch\tDrop In Next Time You're Passing\tVocalion\t515\tS-125-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13081AB.mp3\tDuke Ellington & His Orch\tDrop Me Off At Harlem\tBRUNSWICK\t6527\t13081AB\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_180.mp3\tDuke Ellington And His Famous Orchestra\tDrop Me Off At Harlem\tBRUNSWICK\t6527\t13081AB\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic78827-1.mp3\tMills Blue Rhythm Band\tDrop Me Off In Harlem\tVictor\t\t78827-1  \t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe09731-A.mp3\tLouis Armstrong's Hot Five\tDropping Shucks\tOKeh\t8357\t09731-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D279A2.mp3\tGene Krupa And His Orchestra\tDrum Boogie\tV-DISC\t279A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_334.mp3\tGene Krupa And His Orchestra\tDrum Boogie\tV-DISC\t279A2\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480406.mp3\tBenny Golson\tDrum Boogie\tPrestige\tNJLP8220\t1837\t1959\tCurtis Fuller (tb), Benny Golson (ts), Ray Bryant (p), Paul Chambers (sb), Art Blakey (dm)\nhttp://www.jazz-on-line.com/a/mp3a/VIC09645-1.mp3\tLionel Hampton And His Orch\tDrum Stomp (crazy Rhythm)\tVICTOR\t25658\t09645-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic09645-1.mp3\tLionel Hampton And His Orchestra\tDrum Stomp (crazy Rythm)\tVictor\t25658\t09645-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3209.mp3\tGene Krupa & His Orch\tDrummer Boy\tOKEH\t5747\tWC3209\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECLA2107.mp3\tBob Crosby & His Orch\tDrummer Boy\tDECCA\t3451A\tLA2107\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D279A1.mp3\tGene Krupa And His Orchestra\tDrummer's Band\tV-DISC\t279A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481506.mp3\tCharles Mingus Quintet\tDrums\tFantasy\t6009\t\t1955\tEddie Bert (tb), George Barrow (ts), Mal Waldron (p), Charles Mingus (sb), Max Roach (dm)\nhttp://www.jazz-on-line.com/a/mp3a/PARP4462.mp3\tBlind Blake\tDry Bone Shuffle\tPARAMOUNT\t12479\tP4462\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUAL139.mp3\tBascom Lunsford\tDry Bones\tBRUNSWICK\t314\tAL139\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051868.mp3\tFats Waller And His Rhythm\tDry Bones\tBLUEBIRD\t10892\t051868\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECLA2125.mp3\tBob Crosby & His Orch\tDry Bones\tDECCA\t3488 B\tLA2125\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45429-1.mp3\tFurry Lewis\tDry Land Blues\tVICTOR\t23345\t45429-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCE-7394.mp3\tJack Pettis And His Pets\tDry Martini\tVOCALION\t15703\tE-7394\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/PARL0429.mp3\tCharlie Patton\tDry Well Blues\tPARAMOUNT\t13070B\tL0429\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-12333-A.mp3\tDuke Ellington And His Famous Orchestra\tDucky Wucky\tBrunswick\t6432\tB-12333-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1392-2.mp3\tGene Ammons Sextet\tDues In Blues\tMERCURY\t8080\t1392-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU56535-1.mp3\tJones & Collins Astoria Hot 8\tDuet Stomp\tBLUEBIRD\t8168\t56535-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/DECFO-1783-R.mp3\tDjango Reinhardt Et Son Quintette Du Hot Club De France\tDuke And Dukie\tDECCA\t9244\tFO-1783-R\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/BluBLP5015y.mp3\tErroll Garner\tDuke For Dinner\tBlue Note\tBLP5015\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/MERC672.mp3\tJohnny Hodges & His Orchestra\tDuke's Blues\tMERCURY\t89018\tC672\t1952\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481514.mp3\tCharles Mingus\tDuke's Choice\tBethlehem\tBCP6026\t\t1957\tClarence ?Gene? Shaw (tp), Jimmy Knepper (tb), Shafi Hadi (ts), Horace Parlan (p), Charles Mingus (sb), Dannie Richmond (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1953_414.mp3\tLouis Armstrong - Jack Pleis\tDummy Song\tDECCA\t28803\t84880\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_053.mp3\tEddie Fisher\tDungaree Doll\tRCA Victor\t6337\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64781.mp3\tAndy Kirk & Clouds Of Joy\tDunkin' A Doughnut\tDECCA\t2723B\t64781\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64781-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tDunkin' A Doughnut\tDecca\t2723\t64781-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62150-A.mp3\tWoody Herman & His Orchestra\tDupree Blues\tDECCA\t3500B\t62150-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64956-B.mp3\tCount Basie\tDupree Blues\tDecca\t3071\t64956-B  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC3589-1.mp3\tChampion Jack Dupree\tDupree Shake Dance\tCOLUMBIA\t37335\tC3589-1\t1941\t\nhttp://www.78-tours.net/mp3/VIC26677-A.mp3\tDuke Ellington And His Famous Orchestra\tDusk\tVICTOR\t26677-A\t053020-1\t1940\tO. HARDWICK, H. CARNEY, J. HODGES, B. BIGARD, B. WEBSTER, Saxos\nhttp://www.jazz-on-line.com/a/mp3b/BRUM651-2.mp3\tDuke Ellington & His Orch\tDusk In The Desert\tBRUNSWICK\t8029\tM651-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63692.mp3\tJimmy Dorsey & His Orch.\tDusk In Upper Sandusky\tDECCA\t1939A\t63692\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400990-B.mp3\tFrankie Trumbauer & His Orch\tDusky Stevedore\tOKeh\t41100\t400990-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/DuoE-28369.mp3\tMills' Merry Maker\tDusky Stevedore\tDuo\tD-4046\tE-28369\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN8155-3.mp3\tJoe Candullo And His Orchestra\tDusky Stevedore\tBANNER\t7220\t8155-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3l/VOCC2216.mp3\tLouisiana Rhythm Kings\tDusky Stevedore\tVOCALION\t15716\tC2216\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_122.mp3\tNat Shilkret And The Victor Orchestra\tDusky Stevedore\tVICTOR\t21515\t45647-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC45647-2.mp3\tNat Shilkret & Victor Orch\tDusky Stevedore (ves+wm)\tVICTOR\t21515\t45647-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/ODE403963-B.mp3\tCasa Loma Orchestra\tDust\tODEON\tONY-36076\t403963-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC80622-1.mp3\tEddy Duchin & His Orch\tDust On The Moon\tVICTOR\t24664\t80622-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_055.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tDust On The Moon\tVICTOR\t24664\t80622-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR141340-3.mp3\tUniversity Six\tDustin' The Donkey\tHARMONY\t134-H\t141340-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3o/JAZ14x.mp3\tBunk Johnson's Jazz Band\tDusty Rag\tJazz Information\t14\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1277.mp3\tArnett Cobb & His Orchestra\tDutch Kitchen Bounce\tAPOLLO\t778\tR1277\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiM33199-.mp3\tThe Dutch Swing College Band\tDutch Swing College\tDecca\tM33199\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW144918-1.mp3\tBessie Smith\tDyin' By The Hour\tCOLUMBIA\t14273 D\tW144918-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140176-2.mp3\tBessie Smith\tDying Gambler's Blues\tCOLUMBIA\t14051 D\t140176-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16223.mp3\tDjango Reinhardt - Stan Brenders Et Son Grand Orchestre De Danse\tDynamisme\tRythme\tD5025\t16223\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Har141958-1.mp3\tThe Dixie Stompers\tDynamite\tHarmony\t209-H\t141958-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/DISD336.mp3\tHelen Humes\tE Baba Le Ba\tDISC\t530\tD336\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe71306.mp3\tThomas Morris Pastjazz Masters\tE Flat Blues #2\tOKeh\t8055B\t71306\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/JazCO-18420-2.mp3\tMills Blue Rhythm Band\tE Flat Stride\tJazz Archives\t10\tCO-18420-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1335.mp3\tGene Ammons Sextet\tE.a.a.k Blues\tMERCURY\t8096\t1335\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_088.mp3\tEthel Merman\tEadie Was A Lady\tARC\tBR6456\tB12735-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC74650-2.mp3\tPaul Whiteman & His Orch\tEadie Was A Lady (v Ramona)\tVICTOR\t24202\t74650-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12735.mp3\tEthel Merman\tEadie Was A Lady - Part I\tBRUNSWICK\t6456\t12735\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban12694-A.mp3\tCab Calloway And His Orchestra\tEadle Was A Lady\tBanner\t32647\t12694-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP159y.mp3\tStan Kenton And His Orch\tEager Beaver\tCAPITOL\t159\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO3500.mp3\tRaymond Scott And His New Orch\tEagle Beak\tCOLUMBIA\t35911\tCCO3500\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_100.mp3\tArthur Collins And Byron Harlan\tEagle Rock\tVICTOR\t17610\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3749.mp3\tBing Crosby - J.s.trotter\tEarly American\tDECCA\t23754\tL3749\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP616x.mp3\tWoody Herman\tEarly Autumn\tCAPITOL\t616\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83012.mp3\tElla Fitzgerald\tEarly Autumn\tDECCA\t29810\t83012\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_223.mp3\tJo Stafford\tEarly Autumn\tCOLUMBIA\t39838\tHCO10202\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_298.mp3\tWoody Herman And His Orchestra\tEarly Autumn\tCAPITOL\t\t3831\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26151.mp3\tSlim Gaillard Flatfoot Floogie\tEarly In The Morning\tCBS\tVO5220\t26151\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24155EI.mp3\tLouis Jordan\tEarly In The Morning\tDECCA\t24155\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC90573.mp3\tAlbert Ammons Rhythm Kings\tEarly Morning Blues\tDECCA\t975A\tC90573\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC93599.mp3\tKing Cole Trio\tEarly Morning Blues\tDECCA\t60152\tC93599\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC975A.mp3\tAlbert Ammons Rhythm Kings\tEarly Morning Blues\tDECCA\t975A\tC90573\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC041409-1.mp3\tLionel Hampton And His Orch\tEarly Session Hop\tVICTOR\t26393\t041409-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWB24933.mp3\tTeddy Wilson & His Orch\tEarly Session Hop\tCOLUMBIA\t35207\tWB24933\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic041409-1.mp3\tLionel Hampton And His Orchestra\tEarly Session Hop\tVictor\t26393\t041409-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/ColB-24933-A.mp3\tTeddy Wilson And His Orchestra\tEarly Session Hop\tColumbia\t35207\tB-24933-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480665.mp3\tLionel Hampton & His Orch.\tEarly Session Hop\tVictor\t26393\t041409-1\t1939\tDizzy Gillespie (tp), Benny Carter (as), Coleman Hawkins, Ben Webster, Chu Berry (ts), Clyde Hart (p), Charlie Christian (g), Milt Hinton (sb), Cozy Cole (dm), Lionel Hampton (vib)\nhttp://www.jazz-on-line.com/mp3/399238109.mp3\tThe Crewcuts\tEarth Angel\tMERCURY\t70529\t\t\t\nhttp://www.jazz-on-line.com/mp3/266215443.mp3\tCrewcuts\tEarth Angel\tMERCURY\t70529\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_030.mp3\tCrew-cuts\tEarth Angel\tMercury\t70529\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_062.mp3\tPenguins\tEarth Angel (will You Be Mine)\tDooTone\t348\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_139.mp3\tGloria Mann\tEarth Angel (will You Be Mine)\tSound\t109\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_265.mp3\tSammy Davis Jr.\tEarthbound\tDecca\t30035\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_300.mp3\tMario Lanza\tEarthbound\tRCA\t6644\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC7516.mp3\tSleepy John Estes\tEasin' Back To Tennessee\tDECCA\t7516\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BLU028741.mp3\tBoots And His Buddies\tEast Commerce Stomp\tBLUEBIRD\t10036\t028741\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/COL41036EIE.mp3\tFrankie Laine\tEast Is East\tCOLUMBIA\t41036\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUNOR762.mp3\tBo Chatman\tEast Jackson Blues\tBRUNSWICK\t7048\tNOR762\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC71151.mp3\tAndrews Sisters\tEast Of The Rockies\tDECCA\t18533A\t71151\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_108.mp3\tAndrews Sisters\tEast Of The Rockies\tDECCA\t18533A\t71151\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43832.mp3\tSarah Vaughan\tEast Of The Sun\tCOLUMBIA\t38896\tCO43832\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88979-2.mp3\tTom Coakley & His Orch\tEast Of The Sun\tVICTOR\t25069\t88979-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL25-1021.mp3\tLester Young Quintet\tEast Of The Sun\tALLADDIN\t3000\t25-1021\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89005k.mp3\tBillie Holiday\tEast Of The Sun\tMERCURY\t89005\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/Con3008.mp3\tSarah Vaughan With Dizzy Gillespie And His Orchestra\tEast Of The Sun\tContinental\t6031\t3008\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_014.mp3\tTom Coakley Orch V Carl Ravazza\tEast Of The Sun (and West Of The Moon)\tVICTOR\t25069\t88979-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU41245-2.mp3\tDuke Ellington And His Orchestra\tEast Saint Louis Toodle-oo\tBLUEBIRD\tB-6430-A\t41245-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU41245-2.mp3\tDuke Ellington And His Orchestra\tEast Saint Louis Toodle-oo\tBLUEBIRD\tB-6430-A\t41245-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65978.mp3\tWoody Herman & His Orchestra\tEast Side Kick\tDECCA\t2993B\t65978\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1718.mp3\tBing Crosby - J.s.trotter\tEast Side Of Heaven\tDECCA\t2359A\tDLA1718\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/APOAP3130.mp3\tCharlie Barnet And His Orchestra\tEast Side, West Side\tAPOLLO\t1084\tAP3130\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_304.mp3\tJohnny Desmond, Alan Dale And Buddy Greco\tEast Side, West Side\tCoral\t61176\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143705-3.mp3\tDuke Ellington Washingtonians\tEast St Louis Toodle-o\tCOLUMBIA\t953 D\tW143705-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/BruE-21872.mp3\tDuke Ellington And His Kentucky Club Orchestra\tEast St. Louis Toodle-oo\tBrunswick\t3840\tE-21872\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/Col143705-3.mp3\tDuke Ellington And His Washingtonians\tEast St. Louis Toodle-oo\tColumbia\t953-D\t143705-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_109.mp3\tDuke Ellington And His Washingtonians\tEast St. Louis Toodle-oo\tColumbia\t953-D\t143705-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/VocE-4110.mp3\tDuke Ellington And His Kentucky Club Orchestra\tEast St. Louis Toodle-oo (el Tudel-o De East Saint Louis)\tVocalion\t1064\tE-4110\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/CON17482-2.mp3\tCarter Family\tEast Virginia Blues #2\tCONQUEROR\t8535\t17482-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD453.mp3\tRoy Eldridge Sextet\tEaster Parade\tDISC\t153\tD453\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14486-1.mp3\tGene Austin & His Orch\tEaster Parade\tBANNER\t32935\t14486-1\t\t\nhttp://www.jazz-on-line.com/a/mp3d/PatCPT-2146-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tEaster Parade\tPath\tPA-667\tCPT-2146-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA3013.mp3\tBing Crosby - J.s.trotter Orch\tEaster Parade\tDECCA\t18425\tDLA3013\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D138A.mp3\tHarry James And His Orchestra\tEaster Parade\tV-DISC\t138A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol36545.mp3\tHarry James & His Orchestra\tEaster Parade\tColumbia\t36545\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_279.mp3\tHarry James And His Orchestra\tEaster Parade\tV-DISC\t138A\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_267.mp3\tBing Crosby\tEaster Parade\tDECCA\t10061\tDLA3013\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Col24351-A.mp3\tJimmie Lunceford And His Orchestra\tEaster Parade\tColumbia\t35484\t24351-A\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3a/VIC78071-2.mp3\tLeo Reisman And His Orch\tEaster Parade (vclifton Webb)\tVICTOR\t24418\t78071-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14216-1.mp3\tJoe Venuti & His Orch\tEaster Parade (vdr)\tBANNER\t32879\t14216-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29651-1.mp3\tLes Brown & His Orch\tEasy As Pie\tOKEH\t6062\t29651-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC82315.mp3\tEddy Duchin & His Orch\tEasy Come Easy Go\tVICTOR\t24611\t82315\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81470-4.mp3\tBessie Smith\tEasy Come Easy Go Blues\tCOLUMBIA\t14005 D\t81470-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_058.mp3\tEddy Duchin And His Orchestra Feat. V/demarco Sisters\tEasy Come, Easy Go\tVICTOR\t24611\t82315\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN15129-1.mp3\tEddie Elkins And His Orchestra\tEasy Come, Easy Go (vcb)\tBANNER\t33053\t15129-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU10640x.mp3\tThe Smoothies\tEasy Does It\tBLUEBIRD\t10640\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR121-1.mp3\tLester Young & His Sextet\tEasy Does It\tALLADDIN\t212\tRR121-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_348.mp3\tCount Basie And His Orchestra\tEasy Does It\tCOLUMBIA\t35448\t26659\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_338.mp3\tBobby Byrne And His Orchestra Feat. V/dorothy Claire\tEasy Does It\tDECCA\t3020A\t67193\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26659-A.mp3\tCount Basie And His Orchestra\tEasy Does It\tColumbia\t35448\t26659-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru4004.mp3\tWendell Hall\tEasy Goin'\tBrunswick\t4004\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-2223-1.mp3\tPhilippe Brun Et Son Swing Band (with Django Reinhardt)\tEasy Going\tSWING\t26\tOLA-2223-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP213.mp3\tKing Cole Trio\tEasy Listening Blues\tCAPITOL\t\t213\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU21218-2.mp3\tTeddy Wilson And His Orch\tEasy Living\tBRUNSWICK\t7911\t21218-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62348.mp3\tBob Howard And His Orch\tEasy Living\tDECCA\t1357\t62348\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC73794.mp3\tBillie Holiday / Bob Haggart\tEasy Living\tDECCA\t24138\t73794\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Col147422-3.mp3\tFletcher Henderson And His Orchestra\tEasy Money\tColumbia\t14392-D\t147422-3  \t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147422-2.mp3\tFletcher Henderson & His Orch\tEasy Money Blues\tCOLUMBIA\t14392 D\tW147422-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480646.mp3\tRed Norvo Sextet\tEasy On The Eyes\tRCA\tLPM1449\tH2JB250\t1957\tHarry ''Sweets'' Edison, Tp, Ben Webster, Ts, Red Norvo (vib), Jimmy Rowles (p), Bob Carter (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3c/BLU055175.mp3\tEarl Hines & His Orch\tEasy Rhythm\tBLUEBIRD\t10985\t055175\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu055175-1.mp3\tEarl Hines And His Orchestra\tEasy Rhythm\tBluebird\tB-10985\t055175-1\t1940\tHarry \"Pee Wee\" Jackson, Rostelle Reese, Leroy White (tp) Joe McLewis, John Ewing, Edward Fant (tb) Leroy Harris, Scoops Carey (as) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck Parham (b) Alvin Burroughs (d) Billy Eckstine, Madeline Greene (vcl) The Three Varieties (vcl trio\nhttp://www.jazz-on-line.com/a/mp3c/BLU027962-1.mp3\tErskine Hawkins & His Orch\tEasy Rider\tBLUEBIRD\t10029\t027962-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/PARP4423.mp3\tBlind Lemon Jefferson\tEasy Rider Blues\tPARAMOUNT\t12474\tP4423\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU76878.mp3\tJimmie Davis\tEasy Rider Blues\tBLUEBIRD\t5570\t76878\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64561.mp3\tBuddy Jones\tEasy Rolling Sue\tDECCA\t5654\t64561\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-3097-B.mp3\tJimmie Lunceford And His Orchestra\tEasy Street\tDecca\t18534\tL-3097-B\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC0744.mp3\tRay Noble And His Orch\tEasy To Love\tVICTOR\t25422\t0744\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA508-A.mp3\tFrances Langford & Jimmy Dorse\tEasy To Love\tDECCA\t940A\tDLA508-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1056.mp3\tArtie Shaw And His Orchestra\tEasy To Love\tRCA\t20-1934\tD5VB1056\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89003l.mp3\tBillie Holiday\tEasy To Love\tMERCURY\t89003\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26415-A.mp3\tMildred Bailey\tEasy To Love\tCBS\tCo35921\t26415-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21936-1.mp3\tMaxine Sullivan (orchestra Under Direction Claude Thornhill)\tEasy To Love\tVocalion\t3848\t21936-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20105-1.mp3\tTeddy Wilson And His Orchestra\tEasy To Love\tBrunswick\t7762  \tB-20105-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5839.mp3\tLionel Hampton And His Sextet\tEasy To Love\tDecca\t27374\tLA-5839\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dia902y.mp3\tErroll Garner\tEasy To Love\tDial\t902\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_187.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. V/dick Robertson\tEasy To Love\tBluebird\t6592A\t90\t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480662.mp3\tTeddy Wilson & His Orch.\tEasy To Love\tBrunswick\t7762\t20105-1\t1936\tBillie Holiday (vo), Vido Musso (cl), Ben Webster (ts), Teddy Wilson (p), Allen Reuss (g), Milton Hinton (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3c/MER2951.mp3\tErroll Garner Trio\tEasy To Remember\tMERCURY\t8152\t2951\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO28y.mp3\tWally Rose\tEasy Winners\tGood Time Jazz\t28\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81469-2.mp3\tBessie Smith\tEavesdropper Blues\tCOLUMBIA\t14010 D\t81469-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013331.mp3\tBunny Berigan & His Orch\tEbb Tide\tVICTOR\t25664A\t013331\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_086.mp3\tBunny Berigan And His Orchestra Feat. Gail Reese\tEbb Tide\tVICTOR\t25664A\t013331\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_012.mp3\tFrank Chacksfield And His Orchestra\tEbb Tide\tLONDON\t1358\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_074.mp3\tVic Damone Feat. Richard Hayman's Orchestra\tEbb Tide\tMERCURY\t70216\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/VocM-625-1.mp3\tChu Berry And His Stompy Stevedores\tEbb Tide\tVocalion\t3793\tM-625-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_354.mp3\tRoy Hamilton\tEbb Tide\tEpic\t9068\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037691.mp3\tCharlie Barnet & His Orch\tEbony Rhapsody\tBLUEBIRD\t10341\t037691\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_177.mp3\tRosetta Howard\tEbony Rhapsody\tCOLUMBIA\t30053\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC79155-2.mp3\tDuke Ellington & His Orch\tEbony Rhapsody (v Ivie Anderson)\tVICTOR\t24622\t79155-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC3522-1.mp3\tCab Calloway & His Orchestra\tEbony Silhouette\tOKEH\t6192\tC3522-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COMR2129.mp3\tJess Stacy\tEc-stacy\tCOMMODORE\t1503\tR2129\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE24228.mp3\tRed Nichols & His 5 Pennies\tEccentric\tBRUNSWICK\t6820\tE24228\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU040262-1.mp3\tMuggsy Spanier Ragtime Band\tEccentric\tBLUEBIRD\t10417\t040262-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/CLOSAH6.mp3\tRichard Hitter's Cabineers\tEccentric\tCLOVER\tEBS1062\tSAH6\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1844-1.mp3\tBuster Bailey & Ho\tEccentric Rag\tVARSITY\t8365\tUS1844-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39535.mp3\tWillie Smith & His Cubs\tEcho Of Spring\tDECCA\t7090\t39535\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_191.mp3\tJo Stafford And Gordon Macrae\tEchoes\tCapitol\t57-782\t4311\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_265.mp3\tInk Spots\tEchoes\tDECCA\t24741\t75029\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA244.mp3\tSons Of The Pioneers\tEchoes From The Hills\tDECCA\t5168A\tDLA244\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOEF-28-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tEchoes Of France (la Marseillaise)\tSWING\t229\tOEF-28-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLB18737-1.mp3\tDuke Ellington Orch\tEchoes Of Harlem\tCOLUMBIA\t36283\tB18737-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035563.mp3\tCharlie Barnet & His Orch\tEchoes Of Harlem\tBLUEBIRD\t10210\t035563\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJCR351-1.mp3\tCootie Williams & His Orch\tEchoes Of Harlem\tMAJESTIC\t1171\tCR351-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_274.mp3\tDuke Ellington And His Famous Orchestra\tEchoes Of Harlem\tBRUNSWICK\t7650\tB18737\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE29252.mp3\tH.m.barnes Blueridge Ramblers\tEchoes Of Shenadoah Valley\tBRUNSWICK\t397\tE29252\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC68238-1.mp3\tDuke Ellington & His Orch\tEchoes Of The Jungle\tVICTOR\t22743\t68238-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16221.mp3\tDjango Reinhardt - Stan Brenders Et Son Grand Orchestre De Danse\tclats De Cuivres\tRythme\tD5024\t16221\t1942\t\nhttp://www.jazz-on-line.com./a/mp3o/CAPKW.mp3\tKai Winding, Trombone  Vido Musso, Tenor Sax  Stan Kenton & Orch.\tEcuador\tCAPITOL\t57631\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_106.mp3\tTeen Queens\tEddie My Love\tRPM\t453\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_103.mp3\tChordettes\tEddie My Love\tCadence\t1284\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81076.mp3\tEddie Cantor\tEddie Steady\tCOLUMBIA\tA-3934\t81076\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOLA2145.mp3\tEddie South & His Orch\tEddie's Blues\tVICTOR\t26222\tOLA2145\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe80692-A.mp3\tEddie Lang\tEddie's Twister\tOKeh\t40807\t80692-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62218.mp3\tEdgar Hayes & His Orchestra\tEdgar Steps Out\tDECCA\t1338\t62218\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC96502-1.mp3\tBenny Goodman And His Orchestra\tEeny Meeny Miney Mo\tVICTOR\t25195\t96502-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC96502-1.mp3\tBenny Goodman And His Orchestra\tEeny Meeny Miney Mo\tVICTOR\t25195\t96502-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC25195.mp3\tBenny Goodman & His Orch\tEeny Meeny Miney Mo\tVICTOR\t25195\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh060.mp3\tHarry Roy And His Orchestra Feat. Dinah Miller (vo, Tap-dancing)\tEeny Meeny Miney Mo\tParlophone\tF-409\tCE-7468-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_095.mp3\tBenny Goodman And His Orchestra Feat. Helen Ward\tEeny Meeny Miney Mo\tVICTOR\t25195\t96502-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048782.mp3\tFats Waller And His Rhythm\tEep, Ipe, Wanna Piece Of Pie\tBLUEBIRD\t10744\t048782\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12855-A.mp3\tDuke Ellington & His Orch\tEerie Moan\tBRUNSWICK\t6467\t12855-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc23936-1.mp3\tJohn Kirby And His Orchestra\tEffervescent Blues\tVocalion\t4624\t23936-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1985.mp3\tDorothy Shay\tEfficiency\tCOLUMBIA\t37190\tHCO1985\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP4288.mp3\tBenny Goodman And His Orchestra\tEgg Head\tCAPITOL\t\t4288\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/Col151395-2.mp3\tTed Lewis And His Band\tEgyptian Ella\tColumbia\t2428-D\t151395-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC058777-1.mp3\tNew Orleans Feetwarmers\tEgyptian Fantasy\tVICTOR\t27337\t058777-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151395-2.mp3\tTed Lewis & His Band\tEgyptian-ella\tCOLUMBIA\t2428 D\tW151395-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_122.mp3\tEarl Fuller's Novelty Orchestra\tEgyptland\tCOLUMBIA\tA-2722\t78280-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT391.mp3\tPat Flowers Trio\tEight Mile Boogie\tMAJESTIC\t1013\tT391\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D52B2.mp3\tBoston Pops Orchestra (arthur Fiedler, Cond.)\tEl Capitan\tv-disk\t52B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D91-Bb.mp3\tGlenn Miller Army Air Force Band\tEl Capitan\tV-Disc\t91-B\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1895_003.mp3\tSousa's Band\tEl Capitan March\tVICTOR\t17302\tB2017-8\t1895\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC4319B.mp3\tStan Kenton & His Orchestra\tEl Choclo\tDECCA\t4319B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COL41430ED.mp3\tFrankie Laine\tEl Diablo\tCOLUMBIA\t41430\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30885.mp3\tXavier Cugat And His Orch\tEl Mondonguero\tCOLUMBIA\t36387\tCO30885\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COL49643-2.mp3\tBert Williams\tElder Eatmore's Sermon On Generosity\tCOLUMBIA\tA-6141\t49643-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_058.mp3\tBert Williams\tElder Eatmore's Sermon On Generosity\tCOLUMBIA\tA-6141\t49643-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/COL49644.mp3\tBert Williams\tElder Eatmore's Sermon On Throwing Stones\tCOLUMBIA\tA-6141\t49644\t1919\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1936.mp3\tArt Tatum\tElegie\tDECCA\t25199\tDLA1936\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_046.mp3\tAlma Gluck\tElegie (song Of Mourning)\tVICTOR\t87101\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC87101.mp3\tAlma Gluck-efrem Zimbalist\tElegie - Massenet\tVICTOR\t87101\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/CAPstefa.mp3\tStan Kenton\tElegy For Alto\tCAPITOL\t\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/TEM532x.mp3\tBennie Moten's Kansas City Orch\tElephant's Wobble\tTemple\t532\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC54820-2.mp3\tJack Smith\tEleven Thirty Saturday Night\tVICTOR\t22452\t54820-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D213A1.mp3\tHarry James And His Orchestra\tEli Eli\tV-DISC\t213A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-211.mp3\tLionel Hampton And His Orchestra\tEli, Eli - Part 1\tMGM\t11339\t51-S-211\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-212.mp3\tLionel Hampton And His Orchestra\tEli, Eli - Part 2\tMGM\t11339\t51-S-212\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S211.mp3\tLionel Hampton & His Orchestra\tEli, Eli Part.1\tMGM\t11339\t51S211\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM52S212.mp3\tLionel Hampton & His Orchestra\tEli, Eli Part.2\tMGM\t11339\t52S212\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_212.mp3\tFred Waring's Pennsylvanians\tElizabeth\tVICTOR\t22655B\t68806-1\t1931\tfrom the Broadway musical \"The Wonder Bar\"\nhttp://www.jazz-on-line.com/a/mp3b/Dec63937-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tElla\tDecca\t2148\t63937-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83248.mp3\tElla Fitzgerald\tElla's Contribution To The Blues\tDECCA\t29810\t83248\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC26610B.mp3\tDuke Ellington And His Orch\tEllington Cotton Tail\tVICTOR\t26610B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU067630.mp3\tGlenn Miller And His Orch\tElmer's Tune\tBLUEBIRD\t11274-A\t067630\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO3950-2.mp3\tBenny Goodman And His Orchestra\tElmer's Tune\tCOLUMBIA\t36359\tCCO3950-2\t1941\tvocal Peggy Lee\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3671.mp3\tDick Jurgens And His Orch\tElmer's Tune\tOKEH\t6209\tC3671\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_236.mp3\tKay Thompson\tEloise\tCadence\t1286\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-17857.mp3\tTed Heath And His Music; Leslie Gilbert, Alto Sax (his 89th London Palladium Sunday Concert, April 1\tEloquence\tDECCA-LONDON\tEFF.290-2 (BEP 6121)\tDR-17857\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053743.mp3\tTommy Mcclennan\tElsie Blues\tBLUEBIRD\t8725\t053743\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC81095-1.mp3\tCab Calloway & His Orchestra\tEmaline\tVICTOR\t24659\t81095-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152704.mp3\tBenny Goodman And His Orchestra\tEmaline\tCOLUMBIA\t2907 D\tW152704\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24659.mp3\tCab Calloway & His Orchestra\tEmaline\tVictor\t24659\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic81095-1.mp3\tCab Calloway And His Cotton Club Orchestra\tEmaline\tVictor\t24659\t81095-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh167.mp3\tLew Stone And His Band\tEmaline (v Nat Gonella)\tDecca\tF-3952\tTB-1161-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14988-1.mp3\tCharlie Barnet & His Orch\tEmaline (vcb)\tBANNER\t33033\t14988-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14849-A.mp3\tFrankie Trumbauer & His Orch\tEmaline (vjt)\tBRUNSWICK\t6788\t14849-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI4139-C.mp3\tCollins And Harlan\tEmancipation Handicap\tEDISON\t50306R\t4139-C\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_247.mp3\tAmbrose And His Orchestra\tEmbassy Stomp\tDECCA\t551B\tGB6846\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D87A2.mp3\tCarol Bruce With Red Norvo\tEmbraceable Yo\tv-disk\t87A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE34958.mp3\tRed Nichols And His 5 Pennies\tEmbraceable You\tBRUNSWICK\t6842\tE34958\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1183.mp3\tFrank Sinatra\tEmbraceable You\tCOLUMBIA\t37259\tHCO1183\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/V-D140.mp3\tNat King Cole Qt\tEmbraceable You\tV-DISC\t365\t140\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP140.mp3\tKing Cole Trio\tEmbraceable You\tCAPITOL\t20009\t140\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL29234.mp3\tTeddy Wilson & His Orch\tEmbraceable You\tCOLUMBIA\t35905\t29234\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22830-1.mp3\tEddy Condon & His Band\tEmbraceable You\tCBS\tCM1501\t22830-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72757.mp3\tRoy Eldridge & His Orchestra\tEmbraceable You\tDECCA\t23471\t72757\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER158.mp3\tErroll Garner\tEmbraceable You\tMERCURY\t1001\t158\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70410.mp3\tHazel Scott (piano)\tEmbraceable You\tDECCA\t18341A\t70410\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1869.mp3\tJudy Garland - Victor Young\tEmbraceable You\tDECCA\t2881A\tDLA1869\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOEF-27-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tEmbraceable You\tSWING\t229\tOEF-27-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67473.mp3\tBob Crosby & His Orch\tEmbraceable You\tDECCA\t3271B\t67473\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/VOCWM1020.mp3\tBobby Hackett And His Orchestra\tEmbraceable You\tVOCALION\t4877\tWM1020\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D183-Ab.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tEmbraceable You\tV-Disc\t183-A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_170.mp3\tTommy Dorsey And Jo Stafford Feat. Pied Pipers\tEmbraceable You\tDECCA\t3928A\t69214\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE34958.mp3\tRed Nichols And His Orch\tEmbraceable You (vdr)\tBRUNSWICK\t4957\tE34958\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/WES107y.mp3\tLu Watters's Yerba Buena Jazz B\tEmperor Norton's Hunch\tWest Coast\t107\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/ALL277-2.mp3\tAmos Milburn\tEmpty Arms Blues\tALLADDIN\t3032\t277-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_242v2.mp3\tBessie Smith\tEmpty Bed Blues\tCOLUMBIA\t35675\tW145785-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/MANW1220.mp3\tOscar Pettiford Allstars\tEmpty Bed Blues (vr.williams)\tMANOR\t1002\tW1220\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145785-3.mp3\tBessie Smith\tEmpty Bed Blues Part 1\tCOLUMBIA\t14312 D\tW145785-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145786-1.mp3\tBessie Smith\tEmpty Bed Blues Part 2\tCOLUMBIA\t14312 D\tW145786-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/CorL-4298-.mp3\tLionel Hampton And His Orchestra\tEmpty Glass (normania)\tCoral\t6.22116\tL-4298-\t1946\tLionel Hampton p  vib v dir. Joe Wilder Duke Garrette Leo Shepherd Joe Morris  Wendell Culley  Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn   Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb johnny Griffin ts, Charlie Fowlkes bar, Mi\nhttp://www.jazz-on-line.com/a/mp3a/BLU053592-1.mp3\tMemphis Slim (chatmon)\tEmpty Room Blues\tBLUEBIRD\t8584\t053592-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA436-A.mp3\tBing Crosby\tEmpty Saddles\tDECCA\t870A\tDLA436-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU101650.mp3\tCharlie Barnet & His Orchestra\tEmpty Saddles\tBLUEBIRD\t6448\t101650\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_120.mp3\tBing Crosby\tEmpty Saddles\tDECCA\t870A\tDLA436-A\t1936\t\nhttp://www.78-tours.net/mp3/ODEBE7709-2.mp3\tPaul Mania Sur Orgue De Salon\tEn Traneau\tODON\t165.647\tBE7709-2\t\t\nhttp://www.jazz-on-line.com/a/mp3a/SON3003-A.mp3\tRaymond Scott\tEnchanted Forest\tSONORA\t3003-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480532.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tEnding With The Theme\tRCA\t430045\t\t1959\tArt Blakey, Kenny Clarke, D, Benny Golson, Ts, Lee Morgan, T,: Jymie Merritt, B, Bobby Timmons, P\nhttp://www.jazz-on-line.com/a/mp3w/1956_292.mp3\tMcguire Sisters\tEndless\tCoral\t61703\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_173.mp3\tSylvia Syms\tEnglish Muffins And Irish Stew\tDecca\t29969\t89971\t1956\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24825x.mp3\tGuy Lombardo's Orchestra\tEnjoy Yourself\tDECCA\t24825\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_254.mp3\tDoris Day Feat. George Wyle's Orchestra\tEnjoy Yourself (it's Later Than You Think)\tCOLUMBIA\t38709\tHCO4006\t1950\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478329.mp3\tCarmen Cavallaro And His Orchestra\tEnlloro (voodoo Moon)\tDECCA\t\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh183.mp3\tJack Payne And His Bbc Dance Orchestra\tEntrance Of The Little Fauns\tColumbia\tDX-273\tCAX-6142-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD6VB2792.mp3\tKenny Clarke 52nd St Boys\tEpistrophy\tRCA\t(VIC-LP)\tD6VB2792\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/MER454.mp3\tJay Mcshann & His Sextet\tErnestine\tMERCURY\t8018\t454\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB0515.mp3\tErroll Garner\tErroll's Blues\tRCA\t20-3087\tD7VB0515\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/RCAD7VB-0515.mp3\tErroll Garner\tErroll's Blues   \tRCA\t20-3087\tD7VB-0515\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB0514.mp3\tErroll Garner\tErroll's Bounce\tRCA\t20-3087\tD7VB0514\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/RCAD7VB-0514.mp3\tErroll Garner\tErroll's Bounce   \tRCA\t20-3087\tD7VB-0514\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/BluBLP5015x.mp3\tErroll Garner\tErroll's Reverie\tBlue Note\tBLP5015\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89059E.mp3\tStan Getz Quintet\tErudition\tMERCURY\t89059\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/CON9003.mp3\tLeonard Feather Allstars\tEsquire Jump\tCONTIN\tT6009\t9003\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DJDB25.mp3\tDuke Ellington Orch\tEsquire Swank\tV-DISC\t617\tJDB25\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC033710.mp3\tBenny Goodman And His Orchestra\tEstrelita\tVICTOR\t26187\t033710\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO32619-1.mp3\tHarry James & His Orch  H. Forrest\tEstrellita\tCOLUMBIA\t36729\tCO32619-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_089.mp3\tVic Damone Feat. Richard Hayman's Orchestra; Composed By Charlie Chaplin\tEternally\tMERCURY\t70186\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-17839.mp3\tTed Heath And His Music; Frank Horrox, Piano (his 89th London Palladium Sunday Concert, April 12, 19\tEtrospect\tDECCA-LONDON\tEFF.288-1 (BEP 6120)\tDR-17839\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC551ES.mp3\tJames P Johnson\tEuphonic Sounds\tASCH\t551\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC61107.mp3\tLouis Armstrong And His Orchestra\tEv'ntide\tDECCA\t835B\t61107\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39519.mp3\tBob Howard & His Orchestra\tEv'ry Day\tDECCA\t460A\t39519\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_225.mp3\tMcguire Sisters\tEv'ry Day Of My Life\tCoral\t61703\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu060352-1.mp3\tBenny Carter And His Orchestra\tEv'ry Goodbye Ain't Gone\tBluebird\t\t060352-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC70917.mp3\tInk Spots\tEv'ry Night About This Time\tDECCA\t18461A\t70917\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_161.mp3\tInk Spots\tEv'ry Night About This Time\tDECCA\t18461A\t70917\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_139.mp3\tJimmy Dorsey And His Orchestra\tEv'ry Night About This Time\tDECCA\t18462B\t71062\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26741-A.mp3\tBenny Goodman & His Orch\tEv'ry Sunday Afternoon (vocal Helen Forrest)\tCOLUMBIA\t35461\t26741-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC60431-A.mp3\tIsham Jones And His Orchestra\tEv'ry Time I Look At You - Vocal Woody Herman\tDecca\t695 B\t60431-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_172.mp3\tBenny Goodman And His Orchestra Feat. Peggy Mann\tEv'ry Time We Say Goodbye\tCOLUMBIA\t36767\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480698.mp3\tBenny Goodman Trio\tEv'rything I've Got (belongs To You)\tBlue Disc\tT1016\t20334-6\t1954\tBenny Goodman (cl), Mel Powell (p), Eddie Grady (dm)\nhttp://www.jazz-on-line.com/a/mp3h/EDI11214-F.mp3\tOreste And His Queensland Orch\tEv'rything's Peaches (for Peaches)\tEDISON\t51857\t11214-F\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79515-1.mp3\tBert Williams\tEve Cost Adam Just 1 Bone\tCOLUMBIA\tA-3339\t79515-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-3339.mp3\tBert Williams\tEve Cost Adam Just 1 Bone\tCOLUMBIA\tA-3339\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO33862-1.mp3\tFrankie Carle & His Orch\tEvelina\tCOLUMBIA\t36764\tCO33862-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC18635-.mp3\tBing Crosby\tEvelina\tDECCA\t18635\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_240.mp3\tFrankie Carle And His Orchestra Feat. Paul Allen\tEvelina\tCOLUMBIA\t36764\tCO33862-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-485-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tEveline\tSWING\t274\tOSW-485-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC81075.mp3\tElla Fitzgerald\tEven As You And I\tDECCA\t27634\t81075\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_054.mp3\tEddie Fisher\tEven Now\tRCA Victor\t5106\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC77684-1.mp3\tCab Calloway & His Orch\tEvenin\tVICTOR\t24414\t77684-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21807-A.mp3\tRevelers\tEvenin'\tVictor\t21807-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic77684-1.mp3\tCab Calloway And His Cotton Club Orchestra\tEvenin'\tVictor\t24414\t77684-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeWC-3254-A.mp3\tCount Basie And His Orchestra\tEvenin'\tOkey\t5732\tWC-3254-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87033-1.mp3\tCarter Family\tEvening Bells Are Ringing\tBLUEBIRD\t5856\t87033-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480407.mp3\tArt Farmer And Gigi Gryce\tEvening In Casablanca\tPrestige\tLP7017\t806\t1955\tArt Farmer, FLH, Gigi Gryce, As, Duke Jordan, P, Addison Farmer, B,, Art's Twin Brother, Philly Joe Jones, D, [Featuring Gigi Gryce]\nhttp://www.jazz-on-line.com/a/mp3c/CAP5487-1D.mp3\tStan Kenton & His Orch\tEvening In Pakistan\tCAPITOL\t\t5487-1D\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_094.mp3\tJohn Mccormack\tEvening Song\tVICTOR\t64496\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D379A2.mp3\tWayne King And His Orchestra\tEvening Star\tV-DISC\t379A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_195.mp3\tIrving Aaronson's Commanders\tEvening Star\tVICTOR\t21451A\t43765-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA68803.mp3\tArtie Shaw And His Orchestra\tEvensong\tVICTOR\t28-0405\t068803-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC80287.mp3\tBuddy Johnson And His Orch.\tEver Since The One I Love's Been Gone\tDECCA\t27814\t80287\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/COL45907-1.mp3\tBert Williams\tEverbody\tCOLUMBIA\tA-1909\t45907-1\t1915\t\nhttp://www.jazz-on-line.com/mp3/412967801.mp3\tTito Burns & His Sextet\tEverloving Blues\tABBOTT\t3001\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57305-2.mp3\tBennie Moten's Kansas City Or.\tEvery Day Blues - Yo Yo Blues\tVICTOR\t38144\t57305-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI6576-C.mp3\tEdward Meeker - O\tEvery Day Will Be Sunday (when The Town Goes Dry)\tEDISON\tBA 3727\t6576-C\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU017459-1.mp3\tAl Bowlly & His Orchestra\tEvery Day's A Holiday\tBLUEBIRD\t7319\t017459-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09884-1.mp3\tFats Waller And His Rhythm\tEvery Day's A Holiday\tVICTOR\t25749\t09884-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM690-3.mp3\tCab Calloway & His Orchestra\tEvery Day's A Holiday\tVOCALION\t3896\tM690-3\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_331.mp3\tCab Calloway And His Orchestra\tEvery Day's A Holiday\tVOCALION\t3896\tM690-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI6558-A.mp3\tArthur Collins - Byron G. Harlan - O\tEvery Day's A Holiday In Dixie\tEDISON\t\t6558-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SUPE7357.mp3\tJimmie Noone Apex Club Orch\tEvery Evening\tSUPERTONE\t2228s\tE7357\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17638.mp3\tWingy Manone & His Orch\tEvery Little Moment\tARC\tVO2963\t17638\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17632-1.mp3\tBoswell Sisters\tEvery Little Moment\tARC\tBR7454\t17632-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_138.mp3\tDorsey Brothers Orchestra Feat. V/kay Weber\tEvery Little Moment\tDECCA\t480B\t39540-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/MON5784x.mp3\tInez Barbour And Reinald Werrenrath\tEvery Little Movement\tMONARCH\tV-5784\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_073.mp3\tHenry Burr And Elise Stevenson\tEvery Little Movement\tCOLUMBIA\t894\t04608\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/COL47192.mp3\tAl Jolson\tEvery Little While\tCOLUMBIA\tA-2181\t47192\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99041.mp3\tTommy Dorsey & His Clambake 7\tEvery Minute Of Every Hour\tVICTOR\t25256\t99041\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_290.mp3\tGeorge Hall And His Orchestra\tEvery Minute Of The Hour\tBluebird\t6282\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18133-1.mp3\tWingy Manone & His Orch\tEvery Now And Then\tARC\tVO3071\t18133-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC95024-1.mp3\tRamona & Her Gang\tEvery Now And Then\tVICTOR\t25138\t95024-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18129-1.mp3\tTeddy Wilson And His Orchestra\tEvery Now And Then\tBRUNSWICK\t7543\tB-18129-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU101577.mp3\tWingy Manone & His Orch\tEvery Once In A While\tBLUEBIRD\t6393\t101577\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39544.mp3\tDorsey Brothers Orch.\tEvery Single Little Tingle Of My Heart\tDECCA\t476B\t39544\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu47709.mp3\tCharlie Barnet & His Orch\tEvery Sunday Afternoon\tBluebird\t10637\t47709\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-DCO34295.mp3\tBenny Goodman & His Orch\tEvery Time\tV-DISC\t485\tCO34295\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_464.mp3\tPatti Page\tEvery Time (i Feel His Spirit)\tMercury\t70971\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5235.mp3\tTeddy Wilson Quintet\tEvery Time We Say Goodbye (v M. Sullivan)\tMUSICRAFT\t317\t5235\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63287-A.mp3\tCount Basie And His Orch\tEvery Tub\tDECCA\t1728A\t63287-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BruE-26315.mp3\tKing Oliver And His Dixie Syncopators\tEvery Tub\tBrunswick\t3998\tE-26315\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78578-3.mp3\tNora Bayes\tEverybody Calls Me Honey\tCOLUMBIA\tA-2816\t78578-3\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_073.mp3\tNora Bayes Feat. O/charles Prince\tEverybody Calls Me Honey\tCOLUMBIA\t2816\t78578-3\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55307.mp3\tJimmie Rodgers\tEverybody Does It In Hawaii\tVICTOR\t22143\t55307\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC58338-1.mp3\tKing Oliver & His Orch\tEverybody Does It In Hawaii\tVICTOR\t38109\t58338-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe81871.mp3\tHelen Humes\tEverybody Does It Now\tOKeh\t8529\t81871\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030451.mp3\tMezz Mezzrow-t.ladnier Qt\tEverybody Loves My Baby\tBLUEBIRD\t10090\t030451\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAPBS09683.mp3\tLionel Hampton\tEverybody Loves My Baby\tRCA\t(Victor)\tPBS09683\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11354-A.mp3\tBoswell Sisters\tEverybody Loves My Baby\tBRUNSWICK\t6271\t11354-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057083.mp3\tFats Waller And His Rhythm\tEverybody Loves My Baby\tBLUEBIRD\t10989\t057083\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC69344-1.mp3\tTaylor's Dixie Orchestra\tEverybody Loves My Baby\tVICTOR\t23277\t69344-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN981.mp3\tSidney Bechet Bluenote Jazzmen\tEverybody Loves My Baby\tBLUENOTE\t40\tBN981\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36362.mp3\tGene Krupa & His Orch\tEverybody Loves My Baby\tCOLUMBIA\t37078\tCO36362\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO5x.mp3\tFirehouse Five Plus Two\tEverybody Loves My Baby\tGood Time Jazz\t5\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC30815-6.mp3\tAileen Stanley\tEverybody Loves My Baby\tVICTOR\t19486\t30815-6\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1924_1200_01.mp3\tLee Morse\tEverybody Loves My Baby\tPathe\t032101A\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_065.mp3\tAileen Stanley\tEverybody Loves My Baby\tVICTOR\t19486\t30815-6\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu030451-1.mp3\tMezz Mezzrow - Ladnier Quintet\tEverybody Loves My Baby\tBluebird\tB-10090\t030451-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic09683-2.mp3\tLionel Hampton And His Orchestra\tEverybody Loves My Baby\tVictor\t25682\t09683-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D223ELMB.mp3\tGlenn Miller Army Air Force Band\tEverybody Loves My Baby (but My Baby Don't Love Nobody But Me)\tV-Disc\t223\t\t1944-\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban5748-3.mp3\tFletcher Henderson And His Orchestra\tEverybody Loves My Baby (instr.)\tBanner\t\t5748-3  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Dom5748-1.mp3\tFletcher Henderson And His Orchestra\tEverybody Loves My Baby (vocal Louis Armstrong)\tDomino\t\t5748-1  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21104-B.mp3\t4 Aristocrats\tEverybody Loves My Girl\tVictor\t21104-B\t41049\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_330.mp3\tFrank Sinatra\tEverybody Loves Somebody\tCOLUMBIA\t38225\tCO38484\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_084.mp3\tGeorge O'connor\tEverybody Rag With Me\tCOLUMBIA\tA-1706\t39842-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic58583-2.mp3\tHerny ''red'' Allen And His New York Orchestra\tEverybody Shout\tVictor\tV-38121\t58583-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15161.mp3\tClaude Hopkins And His Orch\tEverybody Shuffle\tBRUNSWICK\t6916\t15161\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU78188-1.mp3\tJoe Venuti & His Orch\tEverybody Shuffle\tBLUEBIRD\t5520\t78188-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480639.mp3\tBenny Carter & His Orch.\tEverybody Shuffle\tVocalion\t2870\t16414-1\t1934\tRussell Smith, Otis Johnson, Irving Randolph (tp), Benny Morton, Keg Johnson (tb), Benny Carter (cl, as), Ben Smith, Russell Procope (as), Ben Webster (ts), Teddy Wilson (p), Clarence Holiday (g), Elmer James (sb), Walter Johnson (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DEC63936.mp3\tChick Webb & His Orchestra\tEverybody Step\tDECCA\t1894A\t63936\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC25664-4.mp3\tPaul Whiteman & His Orch\tEverybody Step\tVICTOR\t18826\t25664-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80039-1.mp3\tTed Lewis & His Jazz Band\tEverybody Step\tCOLUMBIA\tA-3499\t80039-1\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63936-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tEverybody Step\tDecca\t1894\t63936-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16689-90-1.mp3\tAbe Lyman & His Orch\tEverybody Stomp\tBRUNSWICK\t2980\t16689-90-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_012.mp3\tAmerican Quartet\tEverybody Two-step\tVictor\t17171\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3a/COL27665.mp3\tBert Williams\tEverybody Wants A Key To My Cellar\tCOLUMBIA\t35591\t27665\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_018.mp3\tBert Williams\tEverybody Wants A Key To My Cellar\tCOLUMBIA\t35591\t27665\t1919\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN631x.mp3\tBrown's Ferry Four\tEverybody Will Be Happy\tKING\t631\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_039.mp3\tLew Dockstader\tEverybody Works But Father\tCOLUMBIA\tA-0306\t03251-1!\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_007.mp3\tBilly Murray\tEverybody Works But Father\tVICTOR\t16824\tB2743-5\t1906\t\nhttp://www.jazz-on-line.com/a/mp3c/APO378EB.mp3\tWynonie Harris\tEverybody's Boogie\tAPOLLO\t378\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_028.mp3\tMarion Harris\tEverybody's Crazy 'bout The Doggone Blues (but I'm Happy)\tVICTOR\t18443\t21243-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI6011-C.mp3\tArthur Collins - Byron G. Harlan - O\tEverybody's Crazy 'bout The Doggone Blues (but I'm Happy) (turner Layton - H. Creamer)\tEDISON\tBA 3478\t6011-C\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC21243-2.mp3\tMarion Harris\tEverybody's Crazy Over The Blues\tVICTOR\t18443\t21243-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021145.mp3\tTommy Dorsey & His Clambake 7\tEverybody's Doing It\tVICTOR\t25821\t021145\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC11292-2.mp3\tArthur Collins-byron Harlan\tEverybody's Doing It Now\tVICTOR\t17020\t11292-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_013.mp3\tArthur Collins And Byron Harlan\tEverybody's Doing It Now\tVICTOR\t17020\t11292-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_247.mp3\tRoy Hamilton\tEverybody's Got A Home\tEpic\t9132\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_153.mp3\tEddie Fisher\tEverybody's Got A Home But Me\tRCA Victor\t6337\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23642-1.mp3\tTeddy Wilson & His Orch\tEverybody's Laughing\tBRUNSWICK\t8259\t23642-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23642-1.mp3\tTeddy Wilson And His Orchestra\tEverybody's Laughing\tBrunswick\t8259\tB-23642-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75743.mp3\tLionel Hampton & His Orch\tEverybody's Somebody's Fool\tDECCA\t30412\t75743\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec75743.mp3\tLionel Hampton And His Orchestra\tEverybody's Somebody's Fool\tDecca\t27176\t75743\t1950\tWalter Williams-Benny Bailey-Ed Mullens-Duke Garrette-Leo Shepherd-t, AI Grey-Benny Powell-Jimmy Wormick-Paul Lee Higaki-tb, Bobby Plater-Jerome Richardson-as, Curtis Lowe-Johnny Board-Billy ''Smallwood'' Williams-ts, Lonnie Shaw-bar, Lionel Hampton-vi\nhttp://www.jazz-on-line.com/a/mp3c/BLU6911.mp3\tModern Mountaineers\tEverybody's Truckin'\tBLUEBIRD\t6911\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1030.mp3\tKing Cole Trio\tEveryone Is Sayin' Hello Again\tCAPITOL\t\t1030\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC58994-2.mp3\tIsham Jones & His Orch\tEveryone Says I Love You\tVICTOR\t24118\t58994-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/ARC12260-1.mp3\tArt Kahn's  Orchestra\tEveryone Says I Love You\tARC\tBA32570\t12260-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1819-2.mp3\tRuss Carlson & His Orch\tEveryone Says I Love You (v E F)\tCROWN\t3373A\tC1819-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL248.mp3\tLee O'daniel Hillbilly Boys\tEveryone's Out-so Let's Stay In Tonight\tVOCALION\t3633\tDAL248\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU21374.mp3\tRed Norvo & His Orch\tEveryone's Wrong But Me (v M.bailey)\tBRUNSWICK\t7928\t21374\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP681-1A.mp3\tCootie Williams & His Orch\tEverything But You\tCAPITOL\t\t681-1A\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu055178-1.mp3\tEarl Hines And His Orchestra\tEverything Depends On You\tBluebird\tB-11036\t055178-1\t1940\tHarry \"Pee Wee\" Jackson, Rostelle Reese, Leroy White (tp) Joe McLewis, John Ewing, Edward Fant (tb) Leroy Harris, Scoops Carey (as) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck Parham (b) Alvin Burroughs (d) Billy Eckstine, Madeline Greene (vcl) The Three Varieties (vcl trio\nhttp://www.jazz-on-line.com/a/mp3c/CBS24247.mp3\tBillie Holiday\tEverything Happens For The Best\tCBS\tVO4786\t24247\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC060628.mp3\tTommy Dorsey And His Orch\tEverything Happens To Me\tVICTOR\t27359\t060628\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYHL157.mp3\tBill Harris And His New Music\tEverything Happens To Me\tKEYNOTE\t634\tHL157\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_071.mp3\tTommy Dorsey Orch V Frank Sinatra\tEverything Happens To Me\tVICTOR\t27359\t060628\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/RexRK-7.mp3\tErroll Garner Trio\tEverything Happens To Me\tRex\tJ503\tRK-7\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM47S3101.mp3\tBilly Eckstine\tEverything I Have Is Yours\tMGM\t10259B\t47S3101\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC78519-1.mp3\tRudy Vallee & His Ct.yankees\tEverything I Have Is Yours\tVICTOR\t24458\t78519-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_279.mp3\tEddie Fisher\tEverything I Have Is Yours\tRCA\t20-4841\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_045.mp3\tRudy Vallee And His Connecticut Yankees\tEverything I Have Is Yours\tVICTOR\t24458\t78519-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_357.mp3\tBilly Eckstine Feat. Sonny Burke And His Orchestra\tEverything I Have Is Yours\tMGM\t10259B\t47S3101\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14256-1.mp3\tJoe Venuti & His Orchestra\tEverything I Have Is Yours (v Howard Philips)\tBANNER\t32895\t14256-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068067.mp3\tGlenn Miller And His Orch\tEverything I Love\tBLUEBIRD\t11365\t068067\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31812-2.mp3\tBenny Goodman And His Orchestra\tEverything I Love\tOKEH\t6516\t31812-2\t1941\tvocal Peggy Lee\nhttp://www.jazz-on-line.com/a/mp3a/VIC32470-1.mp3\tGene Austin\tEverything Is Hotsy Totsy Now\tVICTOR\t19656\t32470-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC33201-7.mp3\tCoon-sanders Nighthawk Orch\tEverything Is Hotsy Totsy Now\tVICTOR\t19750\t33201-7\t1925\t\nhttp://www.jazz-on-line.com/a/mp3o/KIR140602-1.mp3\tCalif.ramblers\tEverything Is Hotsy Totsy Now\tKIRKEBY\tCO0380D\t140602-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_108.mp3\tGene Austin\tEverything Is Hotsy Totsy Now\tVICTOR\t19656\t32470-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_058.mp3\tAmerican Quartet\tEverything Is Peaches Down In Georgia\tVictor\t18497\t22176-5\t1918\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-19297-1.mp3\tMills Blue Rhythm Band\tEverything Is Still Okay\tColumbia\t3134-D\tCO-19297-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401137-C.mp3\tFred Hall & His Sugar Babies\tEverything We Like We Like Alike\tOKeh\t41123\t401137-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_315.mp3\tWingy Manone And His Orchestra\tEverything You Said Came True\tBluebird\t7197\t13882\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA113-B.mp3\tGuy Lombardo\tEverything's Been Done Before\tDECCA\t424A\tDLA113-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68796.mp3\tLouis Armstrong & His Orch.\tEverything's Been Done Before\tDECCA\t3825A\t68796\t1941\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC35031-1.mp3\tCoon-sanders Nighthawk Orch\tEverything's Gonna Be Alright\tVICTOR\t20003\t35031-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL552.mp3\tLee O'daniel Hillbilly Boys\tEverything's Lovely Down In Dixie Land\tVOCALION\t4388\tDAL552\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20478e.mp3\tGene Austin\tEverything's Made For Love\tVictor\t20478\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM2145-A.mp3\tThe Dutch Swing College Band\tEverything's Wrong, Ain't Nothing Right\tDecca\tM32959\tAM2145-A\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/BruE-36994-A.mp3\tMills Blue Rhythm Band\tEverytime I Look At You\tBrunswick\t6199  \tE-36994-A  \t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW145436.mp3\tPaul Ash And His Orchestra\tEverywhere You Go\tCOLUMBIA\t1243 D\tW145436\t1927\tDanny Polo, clarinet, alto & baritone saxes, replaces Wing or Nettles; Hank Winston, piano replaces Barris. Danny polo omitted; possibly Joe Tarto, brass bass,  v Segar Ellis; New York, December 20th 1927\nhttp://www.jazz-on-line.com/a/mp3w/1949_225.mp3\tDoris Day Feat. John Rarig's Orchestra\tEverywhere You Go\tCOLUMBIA\t38467\tHCO3666\t1949\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480375.mp3\tArt Blakey And Thelonious Monk\tEvidence\tAtlantic\tSD1278\t2564\t1957\tArt Blakey, D, Thelonious Monk, P, Bill Hardman, T, Johnny Griffin, Ts, Spanky DeBrest, B\nhttp://www.jazz-on-line.com/a/mp3t/TS480794.mp3\tArt Blakey And Thelonious Monk\tEvidence\tAtlantic\tLP1278\t2564\t1957\tArt Blakey, D, Thelonious Monk, P, Bill Hardman, T, Johnny Griffin, Ts, Spanky DeBrest, B\nhttp://www.jazz-on-line.com/a/mp3t/TS480533.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tEvidence (we Named It Justice)\tRCA\t430044\t\t1959\tArt Blakey, D, Benny Golson, Ts, Lee Morgan, T,: Jymie Merritt, B, Bobby Timmons, P\nhttp://www.jazz-on-line.com/a/mp3d/Dec64984-A.mp3\tCount Basie And His Orchestra\tEvil Blues\tDecca\t2922\t64984-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC64984.mp3\tCount Basie And His Orch\tEvil Blues (vjimmy Rushing)\tDECCA\t2922A\t64984\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-36-1.mp3\tMezzrow - Bechet Quintet\tEvil Gal Blues\tKing Jazz\t147\tKJ-36-1  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/BlaBW52.mp3\tEtta Jones Acc By Barney Bigard And His Orchestra\tEvil Gal Blues\tBlack & White\t\tBW52\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/CHAE90166.mp3\tLil Johnson\tEvil Man Blues\tCHAMPION\t50052\tE90166\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh015.mp3\tCarroll Gibbons And The Savoy Hotel Orpheans\tEvry Woman Thinks She Wants To Wander\tColumbia\tCB-547\tCA-13298-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150513.mp3\tRuth Etting\tExactly Like You\tCOLUMBIA\t2199 D\tW150513\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62078-A.mp3\tCount Basie And His Orch\tExactly Like You\tDECCA\t1252\t62078-A\t1937\t\nhttp://www.78-tours.net/mp3/SWIOLA1955.mp3\tAlix Combelle (saxophone Tnor) - Bill Coleman (trompette) David Martin (piano) - Roger Chaput (guit\tExactly Like You\tSWING\tSW. 52 B\tOLA. 1955\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2850.mp3\tFrankie Laine\tExactly Like You\tMERCURY\t1179\t2850\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC97773-1.mp3\tBenny Goodman Trio\tExactly Like You\tVICTOR\t25406-B\t97773-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404000-B.mp3\tLouis Armstrong & His Orch\tExactly Like You\tOKeh\t41423\t404000-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM506-1.mp3\tDon Redman & His Orch\tExactly Like You\tVARIETY\tI580\tM506-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWB24827.mp3\tTeddy Wilson & His Orch\tExactly Like You\tCOLUMBIA\t35220\tWB24827\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1638.mp3\tLouis Prima New Orleans Gang\tExactly Like You\tDECCA\t2279A\tDLA1638\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/HMVOLA-1702-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tExactly Like You\tHMV\tB-8629\tOLA-1702-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE32425.mp3\tHarry Richman\tExactly Like You\tBRUNSWICK\t4747\tE32425\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/COM75960.mp3\tBud Freeman Trio\tExactly Like You\tCOMMODORE\t513\t75960\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_128.mp3\tHarry Richman\tExactly Like You\tBRUNSWICK\t4747\tE32425\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_174.mp3\tBenny Goodman Trio\tExactly Like You\tVICTOR\t25406-B\t97773-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_120.mp3\tRuth Etting\tExactly Like You\tCOLUMBIA\t2199 D\tW150513\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOLA-1955-1.mp3\tAlix Combelle Et Son Orchestre\tExactly Like You\tSwing\t52\tOLA-1955-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/ColB-24827-A.mp3\tTeddy Wilson And His Orchestra\tExactly Like You\tColumbia\t35220\tB-24827-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_106.mp3\tHarry Anthony And James F. Harrison\tExcelsior\tEDISON\t8935\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS5447.mp3\tJohnny Guanieri Swing Men\tExercise In Swing\tSAVOY\t509B\tS5447\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_145.mp3\tJimmy Dorsey And His Orchestra\tExpecially For You\tDecca\t2554\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_114.mp3\tSarah Vaughan\tExperience Unnecessary\tMercury\t70646\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB4674.mp3\tRay Noble & His Orch\tExperiment\tVICTOR\t25006\tOB4674\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_334.mp3\tJohnny Dankworth And His Orchestra\tExperiments With Mice\tCapitol\t3499\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP2137-1.mp3\tMa Rainey & Georgia Jazz Band\tExplaining The Blues\tPARAMOUNT\t12284\tP2137-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU19627.mp3\tDuke Ellington's Famous Orch\tExposition Swing\tBRUNSWICK\t8213\t19627\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-19027-1.mp3\tDuke Ellington And His Orchestra\tExposition Swing\tBrunswick\t8213\tB-19027-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64933.mp3\tBob Crosby & His Orch\tEye Opener\tDECCA\t2282B\t64933\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D353A2.mp3\tWings Over Jordan\tEzekiel Saw The Wheel\tV-DISC\t353A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULAE850.mp3\tBen Bernie & His Orch\tF'r Instance\tBRUNSWICK\t4869\tLAE850\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_184.mp3\tBen Bernie And His Orchestra\tF'r Instance\tBRUNSWICK\t4869\tLAE850\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64573-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tF.d.r Jones\tDecca\t2105\t64573-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_263.mp3\tCab Calloway And His Orchestra\tF.d.r. Jones\tVOCALION\t4498\tM908\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-908-1.mp3\tCab Calloway And His Orchestra\tF.d.r. Jones\tVocalion\t4498\tM-908-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_113.mp3\tElla Fitzgerald Feat. Chick Webb Orchestra\tF.d.r. Jones\tDECCA\t2105\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA644.mp3\tAugie Goupil's Royal Tahitians\tFaa Navenava\tDECCA\t1133\tDLA644\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26493.mp3\tBenny Goodman & His Orch\tFable Of The Rose\tCOLUMBIA\t35391\t26493\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_147.mp3\tSarah Vaughan\tFabulous Character\tMercury\t70885\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/CONT6018F.mp3\tEdmond Hall\tFace\tCONTIN\tT6018\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_357.mp3\tGordon Macrae\tFace To Face\tCapitol\t2760\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87038-1.mp3\tCarter Family\tFaded Coat Of Blue\tBLUEBIRD\t5974\t87038-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM50S3077.mp3\tBob Wills And His Texas Playboys\tFaded Love\tMGM\t10786\t50S3077\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC27095.mp3\tHenry Burr\tFaded Love Letters\tVICTOR\t19015\t27095\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_029.mp3\tHenry Burr\tFaded Love Letters\tVICTOR\t19015\t27095\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/COMB539.mp3\tWillie Smith (piano)\tFading Star\tCOMMODORE\t521\tB539\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC023764-1.mp3\tFats Waller And His Rhythm\tFair And Square\tVICTOR\t25891\t023764-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_284.mp3\tTed Fiorito And His Orchestra With Dick Powell\tFair And Warmer\tBrunswick\t6859\tSF99\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh041.mp3\tRay Noble And His Orchestra\tFair And Warmer (v. Al Bowlly)\tHMV\tB-6503\tOB-7429-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79361-1.mp3\tTed Lewis Jazz Band\tFair One\tCOLUMBIA\tA-2998\t79361-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_115.mp3\tTed Lewis And His Band\tFair One\tCOLUMBIA\tA-2998\t79361-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480408.mp3\tArt Farmer Quintet\tFair Weather\tUnited Artists\tUAL4007\t\t1958\tArt Farmer, T, Flh, Benny Golson, Ts, Addison Farmer, B, Bill Evans, P, Dave Bailey, D, Gigi Gryce, Ar\nhttp://www.jazz-on-line.com/a/mp3w/1909_090.mp3\tSousa's Band\tFairest Of The Fair March\tVICTOR\t5621\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_332.mp3\tPaul Weston And His Orchestra\tFairy Tales\tCapitol\t826\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_207.mp3\tNat King Cole Feat. O/nelson Riddle\tFaith Can Move Mountains\tCapitol\t2230\t10489\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA3027.mp3\tBing Crosby\tFaith Of Our Fathers\tDECCA\t10089\tDLA3027\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_042.mp3\tGlenn Miller And His Orchestra (v Ray Eberle)\tFaithful Forever\tBLUEBIRD\t10465\t042925\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26201-A.mp3\tBenny Goodman And His Orchestra\tFaithful Forever (vmb)\tCBS\tCO35289\t26201-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480842.mp3\tSigmund Romberg And His Orchestra\tFaithfully Yours\tRCA VICTOR\t11-9222-A\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR141304-2.mp3\tUniversity Six\tFallin' Down\tHARMONY\t106-H\t141304-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU9450.mp3\tGene Rodemich And His Orchestra\tFalling\tBRUNSWICK\t2389A\t9450\t1922\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3b/OKE26575.mp3\tBillie Holiday\tFalling In Love Again\tOKEH\t5609\t26575\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480843.mp3\tAndre Kostelanetz And His Orchestra\tFalling In Love With Love\tCOLUMBIA\t4266-M\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO37125.mp3\tFrankie Carle\tFalling Leaves\tCOLUMBIA\t38858\tCO37125\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU055580.mp3\tGlenn Miller & His Orch\tFalling Leaves\tBLUEBIRD\t10876\t055580\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU07089.mp3\tDelmore Brothers\tFalse Hearted Girl\tBLUEBIRD\t6949\t07089\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_283.mp3\tFour Aces\tFalse Love\tDECCA\t28691\t84282\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC1493-A.mp3\tBob Wills And Texas Playboys\tFan It\tCOLUMBIA\t37619\tC1493-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC60964-A.mp3\tIsham Jones's Juniors\tFan It\tDecca\t834 B\t60964-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68700.mp3\tWoody Herman & His Woodchopper\tFan It\tDECCA\t3761B\t68700\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCMEM95.mp3\tSwift Jewel Cowboys\tFan It\tVOCALION\t5243\tMEM95\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE36878-A.mp3\tRed Nichols & His Orch\tFan It (vrm)\tBRUNSWICK\t6160\tE36878-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62205.mp3\tBob Howard & His Orch\tFan My Brow\tDECCA\t1293\t62205\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BlaP-154-1.mp3\tHenderson's  Dance Orchestra\tFancies\tBlack Swan\t2022\tP-154-1\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO45814.mp3\tDuke Ellington & His Orchestra\tFancy Dan\tCOLUMBIA\t39428\tCO45814-1\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30833.mp3\tCount Basie & His Orch\tFancy Meeting You\tOKEH\t6319\t30833\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_301.mp3\tFloyd Cramer\tFancy Pants\tFabor\t146\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3d/DecB-13353-A.mp3\tSpike Hughes And His Negro Orchestra With Benny Carter\tFanfare \tDecca \tF-3639\tB-13353-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24692-A.mp3\tHarry James And His Orchestra\tFannie-may\tBrunswick\t8406\tB-24692-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_327.mp3\tEddie Fisher\tFanny\tRCA\t20-5871\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-503-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tFantaisie\tSWING\t280\tOSW-503-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/HMVOSW-148-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tFantaisie Sur Une Danse Norvegienne\tHMV\tFELP 236\tOSW-148-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DIAD1097-A.mp3\tErroll Garner\tFantasy On Frankie And Johnny\tDIAL\t1026B\tD1097-A\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/SUNSR1012.mp3\tJohnny Hodges & His Orchestra\tFar Away Blues\tSUNSET\t2006\tSR1012\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15278x.mp3\tMargaret Whiting\tFar Away Places\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO40123.mp3\tDinah Shore\tFar Away Places\tCOLUMBIA\t38356\tCO40123\t1948\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4844.mp3\tBing Crosby And Ken Darby Choir\tFar Away Places\tDECCA\t24532\tL4844\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_130.mp3\tDinah Shore\tFar Away Places\tCOLUMBIA\t38356\tCO40123\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_040.mp3\tPerry Como Feat. Henri Rene Orchestra\tFar Away Places\tRCA Victor\t3316\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE21851.mp3\tDykes Magic City Trio\tFar Beyond The Blue Sky\tBRUNSWICK\t130\tE21851\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74119.mp3\tBuddy Johnson And His Orch.\tFar Cry\tDECCA\t48076\t74119\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30883.mp3\tXavier Cugat And His Orch\tFarandole\tCOLUMBIA\t36385\tCO30883\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_108.mp3\tMamie Smith And Her Jazz Hounds\tFare Thee Honey Blues\tOKeh\t4194\tS7589-C\t1921\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71536.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tFare Thee Honey Fare Thee Well\tDecca\t4449\t71536\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64955.mp3\tCount Basie (piano)\tFare Thee Honey, Fare Thee Well\tDECCA\t2780B\t64955\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC4449B.mp3\tAndy Kirk & His Orchestra\tFare Thee Honey, Fare Thee Well\tDECCA\t4449B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64955-B.mp3\tCount Basie\tFare Thee Honey, Fare Thee Well\tDecca\t2780\t64955-B  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon037733-1.mp3\tWingy Manone & His Orch\tFare Thee My Baby, Fare The Well\tMontgomeryWard\t8350\t037733-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87645.mp3\tCharlie Barnet & His Orchestra\tFare Thee Well Annabelle (v M. Nichols)\tBLUEBIRD\t5815\t87645\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM778.mp3\tJoe Calicott\tFare Thee Well Blues\tBRUNSWICK\t7166\tM778\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152718.mp3\tBenny Morton & His Orch\tFare Thee Well To Harlem\tCOLUMBIA\t2902 D\tW152718\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_032.mp3\tGlen Gray And Casa Loma Orchestra\tFare Thee Well, Annabelle\tDECCA\t352A\t39233\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_342.mp3\tGene Krupa And His Orchestra\tFare Thee Well, Annie Laurie\tCBS\tBR8139\t22866-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73561.mp3\tLucky Millinder\tFare Thee Well, Deacon Jones\tDECCA\t24495\t73561\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_202.mp3\tConnee Boswell Feat. O/hen Pollack\tFare Thee, Honey, Fare Thee Well\tDECCA\t1862B\tDLA1202\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_017.mp3\tFiddlin' John Carson\tFare You Well, Old Joe Clark\tOKeh\t40038\t72016-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73561.mp3\tLucky Millinder And His Orchestra\tFare-thee-well Deacon Jones\tDecca\t24495\t73561\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/BROL90-2.mp3\tSara Carter (bessie Smith)\tFarewell Baby Blues\tBROADWAY\t5062A\tL90-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038175.mp3\tGlenn Miller And His Orchestra\tFarewell Blues\tBLUEBIRD\t10495B\t038175\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030308.mp3\tBenny Goodman And His Orchestra\tFarewell Blues\tBLUEBIRD\t10973A\t030308\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148930-3.mp3\tTed Lewis And His Orch\tFarewell Blues\tCOLUMBIA\t2029 D\tW148930-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO877.mp3\tCount Basie And His Rhythm\tFarewell Blues\tCOLUMBIA\t36712\tHCO877\t1942\t\nhttp://www.jazz-on-line.com/a/mp3l/Col80887-4.mp3\tThe Georgians\tFarewell Blues\tColumbia\tA-3864\t80887-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE25352.mp3\tKing Oliver's Dixie Syncopatos\tFarewell Blues\tBRUNSWICK\t3741\tE25352\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11765-A.mp3\tAbe Lyman & His Orch\tFarewell Blues\tBRUNSWICK\t6314\t11765-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73480.mp3\tEddie Condon & His Orchestra\tFarewell Blues\tDECCA\t23719\t73480\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65637-A.mp3\tWoody Herman & His Orch\tFarewell Blues\tDECCA\t2582B\t65637-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Mon037732-1.mp3\tWingy Manone & His Orch\tFarewell Blues\tMontgomeryWard\t8351\t037732-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU9768.mp3\tIsham Jones & His Orch\tFarewell Blues\tBRUNSWICK\t2406\t9768\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA1667.mp3\tSol Hoopii\tFarewell Blues\tDECCA\t2241A\tDLA1667\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D334A2.mp3\tMaj. Glenn Miller And The Aaftco\tFarewell Blues\tV-DISC\t334A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/SwiOSW-5-1.mp3\tBenny Carter And His Orchestra\tFarewell Blues\tSwing\t36\tOSW-5-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_026.mp3\tTed Lewis And His Band\tFarewell Blues\tOKeh\t41580\t17121\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Oly574-2.mp3\tHenderson's  Dance Players\tFarewell Blues\tOlympic\t1435\t574-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10483-1.mp3\tCab Calloway & His Orchestra\tFarewell Blues (vcc)\tBANNER\t32152\t10483-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC75031.mp3\tPaul Whiteman & His Orch\tFarewell To Arms\tVICTOR\t24236\t75031\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh170.mp3\tJack Hylton And His Orchestra\tFarewell To Arms (v Pat Omalley)\tDecca\tF-3515\tGB-5674-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU02656-1.mp3\tLittle Brother Montgomery\tFarish Street Jive\tBLUEBIRD\t6894\t02656-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_074.mp3\tVernon Dalhart\tFarm Relief Song\tColumbia\t15449\tW148913\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC56749.mp3\tVernon Dalhart\tFarm Relief Song\tVICTOR\t40149\t56749\t1929\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480440.mp3\tArt Farmer\tFarmer's Market\tNew Jazz\tLP8203\t1023\t1953\tArt Farmer, T, FLH, Hank Mobley, Ts, Kenny Drew, P, Addison Farmer, B, Elvin Jones, D\nhttp://www.jazz-on-line.com/a/mp3t/TS480800.mp3\tArt Farmer\tFarmer's Market\tNew Jazz\tLP 8203\t1023\t1953\tArt Farmer, T, FLH, Hank Mobley, Ts, Kenny Drew, P, Addison Farmer, B, Elvin Jones, D\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA1666.mp3\tSol Hoopii\tFascinatin' Rhythm\tDECCA\t2280B\tDLA1666\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_068.mp3\tCliff Edwards\tFascinating Rhythm\tPath\t025126\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS36129.mp3\tStan Getz Nnew Sound Stars\tFast\tSAVOY\t947\tS36129\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-11851-A.mp3\tDuke Ellington And His Famous Orchestra\tFast And Furlous\tBrunswick\t6355\tB-11851-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS267.mp3\tMeade Lux Lewis\tFast Boogie\tDISC\t6020\t267\t\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLRR223-1.mp3\tLightnin' Hopkins\tFast Mail Rambler\tALLADDIN\t204\tRR223-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-107-1.mp3\tAlix Combelle And His Swing Band\tFast, Slow, Medium Tempo\tSwing\t81\tOSW-107-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL156-.mp3\tAl Hibbler W Harry Carney Band\tFat And Forty\tALLADDIN\t156\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048776.mp3\tFats Waller And His Rhythm\tFat And Greasy\tBLUEBIRD\t10803\t048776\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3383.mp3\tFats Navarro's Thin Men\tFat Girl\tSAVOY\t906B\tS3383\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKJ-37-1.mp3\tMezzrow - Bechet Quintet\tFat Mama Blues\tStoryville \tSLP141\tKJ-37-1  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57335-2.mp3\tTiny Parham & His Musicians\tFat Man Blues\tVICTOR\t38126\t57335-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89060.mp3\tIllinois Jacquet & His Orch\tFat Man's Boogie\tMERCURY\t89060\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC164.mp3\tJelly Roll Morton (piano)\tFat Meat And Greens\tVOCALION\t1019A\tC164\t1926\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU9399.mp3\tGene Rodemich And His Orchestra\tFate\tBRUNSWICK\t2379B\t9399\t1922\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3c/VIC71271-3.mp3\tGene Kardos & His Orch\tFate Introduced Me To You (v D R)\tVICTOR\t22918\t71271-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14877-A.mp3\tPaul Whiteman And His Orchestra<br>jack Teagarden Vocalist And Trombone\tFate Thee Well To Harlem\tVictor\t24571\t81715-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHKL1301.mp3\tCozy Cole Allstars\tFather Cooperates\tKEYNOTE\t1301\tHKL\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon038259.mp3\tEarl Hines & His Orch\tFather Steps In\tMontgomeryWard\t8345\t038259\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU78506-1.mp3\tCab Calloway & His Orchestra\tFather's Got His Glasses On\tBLUEBIRD\t6819\t78506-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU6819.mp3\tCab Calloway & His Orchestra\tFather's Got His Glasses On\tBLUEBIRD\t6819\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic78506-1.mp3\tCab Calloway And His Cotton Club Orchestra\tFather's Got His Glasses On\tVictor\t24451\t78506-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC026875.mp3\tBunny Berigan & His Orch\tFather, Dear Father\tVICTOR\t26061A\t026875\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_207.mp3\tPatti Page\tFather, Father\tMERCURY\t70222\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/DotA-1662.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tFatigue\tDot\tDLP3487\tA-1662\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1574-1.mp3\tJack Teagarden & Orch\tFatima's Drummer Boy\tVARSITY\t8273\tUS1574-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38050-3.mp3\tFats Waller And Morris Hot Babys\tFats Waller Stomp\tVICTOR\t20890\t38050-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65438-A.mp3\tLeonard Feather Allstars\tFeather Bed Blues\tDECCA\t18111B\t65438-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5460.mp3\tMuggsy Spanier's Dixielanders\tFeather Brain\tMERCURY\t5460\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO31765.mp3\tCount Basie And His Orch\tFeather Merchant\tCOLUMBIA\t36845\tCO31765\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC24634.mp3\tAron Campbell-henry Burr\tFeather Your Nest\tVICTOR\t18708A\t24634\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102666.mp3\tWashboard Wonders\tFeather Your Nest\tBLUEBIRD\t6495\t102666\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/OKeS7565-B.mp3\tHenry Burr And Albert Campbell\tFeather Your Nest\tOKeh\t4185A\tS7565-B\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_020.mp3\tHenry Burr And Albert Campbell\tFeather Your Nest\tOKeh\t4185A\tS7565-B\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-3635f.mp3\tCharlie Ventura's Orchestra\tFeather's Den\tRCA\t20-3635\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/SesF-162.mp3\tMezz Mezzrow Trio\tFeather's Lament\tSession\t10007\tF-162  \t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21459-1.mp3\tArtie Shaw And His New Music\tFee Fi Fo Fum\tBRUNSWICK\t7952\tB-21459-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEWC3680-1.mp3\tCount Basie And His Orch\tFeedin' The Bean\tOKEH\t6180\tWC3680-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeC-3680-1.mp3\tCount Basie And His Orchestra\tFeedin' The Bean\tOkeh\t6180\tC-3680-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE26768-A.mp3\tGene Krupa & His Orch\tFeelin' Fancy\tOKEH\t5921\t26768-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Mel13931-1.mp3\tMills Blue Rhythm Band\tFeelin' Gay\tMelotone\tM-12793\t13931-1  \t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Har145976-1.mp3\tThe Dixie Stompers\tFeelin' Good\tHarmony\t636-H\t145976-1  \t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU022924.mp3\tOran Hot Lips Page & His Band\tFeelin' High And Happy\tBLUEBIRD\t7569\t022924\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_199.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tFeelin' High And Happy\tVICTOR\t25840\t022418-4\t1938\tHarry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Dave Matthews, Noni Bernardi (as), Bud Freeman, Arthur Rollini (ts), Jess Stacy (p), Ben Heller (g), Harry Goodman (sb), Dave Tough (dm)\nhttp://www.jazz-on-line.com/a/mp3c/VIC40169-2.mp3\tRed & Miff's Stompers\tFeelin' No Pain\tVICTOR\t21183\t40169-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE24235.mp3\tRed Nichols Five Pennies\tFeelin' No Pain\tVOCALION\t4654\tE24235\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/OKeW81297-B.mp3\tMiff Mole's Little Molers\tFeelin' No Pain\tOKeh\t40890\tW81297-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S214.mp3\tJoe Turner\tFeelin' So Sad\tMGM\t10719\t48S214\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC12935.mp3\tFletcher Henderson & His Orch\tFeelin' The Way I Do\tVOCALION\t14788A\t12935\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE27298.mp3\tCab Calloway & His Orch\tFeelin' Tip Top\tOKEH\t5874\t27298\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC53929-2.mp3\tHenry Allen & His Orch\tFeeling Drowsy\tVICTOR\t38080A\t53929-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic53929-3.mp3\tHerny ''red'' Allen And His New York Orchestra\tFeeling Drowsy\tVictor\tV-38080\t53929-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC4626.mp3\tIsham Jones And His Orch\tFeeling That Way\tBRUNSWICK\t4595\tC4626\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402939-C.mp3\tLuis Russell & His Orch\tFeeling The Spirit\tOKeh\t8766\t402939-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/SILE12935.mp3\tFletcher Henderson Orch\tFeeling The Way I Do\tSILVERTONE\t3023\tE12935\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIX2SW-263-1.mp3\tDjango's Music\tFerie\tSWING\tX186\tX2SW-263-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D43B.mp3\tHarry James & His Orchestra\tFeet Draggin' Blues\tv-disk\t43B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/Col25287-1.mp3\tHarry James And His Orchestra\tFeet Draggin' Blues\tColumbia\t35227\t25287-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47486.mp3\tGuy Mitchell\tFeet Up\tCOLUMBIA\t39822\tCO47486\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT544.mp3\tLouis Prima & His Orchestra\tFelicia No Capicia (v L P)\tMAJESTIC\t1203\tT544\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D242A1.mp3\tCapt. Glenn Miller And The Aaftc Orchestra\tFellow On A Furlough\tV-DISC\t242A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63740.mp3\tDick Robertson And His Orch\tFerdinand The Bull\tDECCA\t1847A\t63740\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22850-2.mp3\tSlim And Slam\tFerdinand The Bull\tCBS\tVO4110\t22850-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA2282.mp3\tKay Kyser And His Orchestra\tFerry Boat Serenade\tCOLUMBIA\t35627\tLA2282\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_048.mp3\tKay Kyser And His Orchestra\tFerry Boat Serenade\tCOLUMBIA\t35627\tLA2282\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_064.mp3\tAndrews Sisters\tFerry Boat Serenade\tDECCA\t3328A\tDLA2055\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_133.mp3\tGray Gordon And His Tic-toc Rhythm\tFerry Boat Serenade\tBLUEBIRD\tB-10819\t054622-2\t1940\tMeredith Blake (vo), Philip Raskind, Chet Bruce, Frank Linali (tp), Bobby Blair (tb), Cliff Grass, Babe Fresk, Alex Goldstein (as), Johnny Johnson (ts), Roy Mace (p), Carl Caselli (tb, pac), Bill North (g), Jack Fay (sb), Harry Levinson (dm)\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2055.mp3\tAndrew Sisters\tFerryboat Serenade\tDECCA\t3328A\tDLA2055\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67422y.mp3\tDick Robertson And His Orch\tFerryboat Serenade\tDECCA\t3305A\t67921\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC3328A.mp3\tAndrews Sisters\tFerryboat Serenade\tDECCA\t3328A\tDLA2055\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-502-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tFestival 48\tSWING\t280\tOSW-502-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIX2SW-173-1.mp3\tFestval Swing 1941 (with Django Reinhardt)\tFestival Swing\tSWING\tX-91\tX2SW-173-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIX2SW-235-1.mp3\tFestival Swing 1942 (with Django Reinhardt)\tFestival Swing 1942 Part 2\tSWING\tW129\tX2SW-235-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102770-C.mp3\tHartman's Heartbreakers\tFetch It Down To My House\tBLUEBIRD\t6494A\t102770-C\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67304-A.mp3\tSam Price's Texas Blusicians\tFetch It To Me\tDECCA\t7781A\t67304-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/Cap2076.mp3\tJo Stafford W. Starlighters\tFeudin' And Fightin'\tCapitol\t443\t2076\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1974.mp3\tDorothy Shay\tFeudin' And Fightin'\tCOLUMBIA\t37189\tHCO1974\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC73909-A.mp3\tBing Crosby & Jesters\tFeudin' And Fightin'\tDECCA\t23975A\t73909-A\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_051.mp3\tDorothy Shay\tFeudin' And Fightin'\tCOLUMBIA\t37189\tHCO1974\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_185.mp3\tLittle Willie John\tFever\tKing\t4935\tK9742-2\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64314-1.mp3\tJelly Roll Morton Hot Peppers\tFickle Fay Creep\tVICTOR\t23019\t64314-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic64314-1.mp3\tJelly-roll Morton And His Red Hot Peppers\tFickle Fay Creep\tVictor\t23019\t64314-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic20-3137-A.mp3\tSpade Cooley\tFickle Woman\tVictor\t20-3137-A\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC055231.mp3\tLionel Hampton & His Orch\tFiddle Dee Dee\tVICTOR\t27364\t055231\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic025868-1.mp3\tLionel Hampton And His Orchestra\tFiddle Diddle\tVictor\t26173\t025868-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA10-1397x.mp3\tBoston Pops\tFiddle Faddle\tRCA\t10-1397\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC81238.mp3\tLeroy Anderson And His\tFiddle Faddle\tDECCA\t28300\t81238\t1952\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic055231-1.mp3\tLionel Hampton And His Sextet\tFiddle-dee-dee\tVictor\t27364\t055231-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN12986-A.mp3\tMills Brothers\tFiddlin' Joe\tBANNER\t33255\t12986-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU22025-6.mp3\tFletcher Henderson And His Orch\tFidgety Feet\tBRUNSWICK\t3521\t22025-6\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4306-4.mp3\tEddie Condon & His Band\tFidgety Feet\tCOMMODORE\t542\t4306-4\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN11751-A.mp3\tWolverine Orchestra\tFidgety Feet\tGENNETT\t5408\t11751-A\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/DIS127.mp3\tJoe Sullivan\tFidgety Feet\tDISC\t6003\t127\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44357.mp3\tBobby Hackett\tFidgety Feet\tCOLUMBIA\t39020\tCO44357\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM1888-A.mp3\tThe Dutch Swing College Band\tFidgety Feet\tDecca\tM32754\tAM1888-A\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1060-A.mp3\tBob Crosby & His Bobcats\tFidgety Feet\tDECCA\t1593\tDLA1060-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC14780-2.mp3\tBilly Murray\tFido Is A Hot Dog Now\tVICTOR\t17620\t14780-2\t1914\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE31354-1.mp3\tCount Basie And His Orch\tFiesta In Blue\tOKEH\t6440\t31354-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL7.mp3\tLittle Jazz Trumpet Ensemble\tFiesta In Brass\tKEYNOTE\t608\tHL7\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D691FIB.mp3\tJimmy Mundy Orch\tFiesta In Brass\tV-DISC\t691\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3160-A.mp3\tCab Calloway & His Orch\tFifteen Minute Intermission\tOKEH\t5644\tWC3160-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_289.mp3\tCab Calloway And His Orchestra\tFifteen Minute Intermission\tOKEH\t5644\tWC3160-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67895-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tFifteen Minutes Intermission\tDecca\t3282\t67895-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU055515.mp3\tGlenn Miller & His Orch\tFifth Avenue (vmh)\tBLUEBIRD\t10860\t055515\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2530.mp3\tLouis Armstrong\tFifty Fifty Blues\tRCA\t20-2530\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE80738-A.mp3\tSophie Tucker W Miff Mole\tFifty Million Frenchmen Can't Be Wrong\tOKEH\t40813\t80738-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCLA1308.mp3\tLouis Prima New Orleans Gang\tFifty Second Street\tVOCALION\t3509\tLA1308\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE402220-A.mp3\tEarl Hines\tFifty Seven Varieties\tOKeh\t8653\t402220-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61463-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tFifty-second Street\tDecca\t1146\t61463-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE32495.mp3\tGene Krupa & His Orch\tFightin' Doug Mac Arthur\tOKEH\t6635\t32495\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70344.mp3\tLucky Millinder & His Orch\tFightin' Doug Macarthur\tDECCA\t4261B\t70344\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70344-A.mp3\tLucky Millinder And His Orchestra\tFightin' Doug Macarthur\tDecca\t4261\t70344-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70259.mp3\tSkeets Tolbert Gentlemen Swing\tFill Up\tDECCA\t8617\t70259\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec70259-A.mp3\tSkeets Tolbert And His Orchestra\tFill-up\tDecca\t8617\t70259-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU31691.mp3\tColonial Club Orch\tFind Me A Primitive Man\tBRUNSWICK\t4666\t31691\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_228.mp3\tLibby Holman Feat. Colonial Club Orchestra\tFind Me A Primitive Man\tBRUNSWICK\t4666\t31691\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5900.mp3\tMel Torme With Orchestra\tFine And Dandy\tMUSICRAFT\t530\t5900\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ASCT1-1.mp3\tArt Tatum\tFine And Dandy\tASCH\t356-1\tT1-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1699.mp3\tBenny Goodman Qt\tFine And Dandy\tCAPITOL\t\t1699\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76353.mp3\tLouis Armstrong & His Allstars\tFine And Dandy\tDECCA\t27189\t76353\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20914-1.mp3\tTeddy Wilson And His Orch\tFine And Dandy\tBRUNSWICK\t7877\t20914-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66530.mp3\tWoody Herman & His Orchestra\tFine And Dandy\tDECCA\t3140B\t66530\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_111.mp3\tArden-ohman Orchestra Feat. V/frank Luther\tFine And Dandy\tVICTOR\t22552\t64304-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_185.mp3\tDorsey Brothers Orchestra Feat. Scrappy Lambert\tFine And Dandy\tOKeh\t41181\t401561-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/GRAEP-2020-A-1.mp3\tJoe Venuti, V; Buddy Weed, P; George Barnes, G; Al Caiola, G; Jack Lesberg, B; Don Lamond, D.\tFine And Dandy\tGRAND AWARD\tEP-2020-A-1\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481772.mp3\tAnita O'day\tFine And Dandy\tVerve\tMGV2000\t2558-4\t1955\tacc. by Paul Smith (p), Barney Kessel (g), Joe Mondragon (sb), Alvin Stoller (dm), Buddy Bregman (arr, dir)\nhttp://www.jazz-on-line.com/a/mp3c/OKe404544-A.mp3\tThe Travelers (dorsey Orch)\tFine And Dandy (vsl)\tOKeh\t41471\t404544-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU045786.mp3\tErskine Hawkins And His Orch\tFine And Mellow\tBLUEBIRD\t10709\t045786\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COM24405-A.mp3\tBillie Holiday And Her Orch\tFine And Mellow\tCOMMODORE\t526\t24405-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67893-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tFine And Mellow\tDecca\t3282\t67893-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15032x.mp3\tNellie Lutcher\tFine Brown Frame\tCAPITOL\t15032\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC48019-.mp3\tBuddy Johnson\tFine Brown Frame\tDECCA\t48019\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042934-2.mp3\tColeman Hawkins\tFine Dinner\tBLUEBIRD\t10523B\t042934-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MERC731-3.mp3\tGene Krupa's Jazz Trio\tFine's Idea\tMERCURY\t8990\tC731-3\t1952\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-65-1.mp3\tRex Stewart And His Feetwarmers (with Django Reinhardt)\tFinesse\tSWING\t70\tOSW-65-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COMB543-2.mp3\tWillie Smith (piano)\tFinger Buster\tCOMMODORE\t522\tB543-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/JazMLB-145.mp3\tJelly-roll Morton\tFinger Buster\tJazz Man\t12\tMLB-145\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_159.mp3\tEydie Gorme\tFini\tCoral\t61093\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65628.mp3\tBilly Kyle Trio\tFinishin' Up A Date\tDECCA\t2740A\t65628\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5740.mp3\tJohnny Guarnieri Trio\tFire Bird\tSAVOY\t555A\tS5740\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC7571.mp3\tSleepy John Estes\tFire Department Blues\tDECCA\t7571\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/QRS2378-2.mp3\tNew Yorkers\tFireworks\tQRS\t1053\t2378-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/OKe400960-B.mp3\tLouis Armstrong's Hot Five\tFireworks\tOKeh\t8597\t400960-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_266.mp3\tTennessee Ernie Ford\tFirst Born\tCapitol\t3553\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC28633-3.mp3\tJan Garber And His Orch\tFirst Last And Always\tVICTOR\t19164\t28633-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1902_042.mp3\tFrank Stanley And Byron G. Harlan\tFirst Rehearsal For The Huskin' Bee\tEDISON\t8096\t\t1902\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70112.mp3\tAl Cooper & His Savoy Sultans\tFish For Your Supper\tDECCA\t8598\t70112\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VOCWM-1128-1.mp3\tBenny Carter And His Orchestra\tFish Fry\tVOCALION\t5458\tWM-1128-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72430.mp3\tRoy Eldridge & His Orchestra\tFish Market\tDECCA\t23383\t72430\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D342FM.mp3\tGene Krupa's New Orch\tFish Market\tV-DISC\t342\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D342B.mp3\tGene Krupa And His New Orchestra\tFish Market\tV-DISC\t342B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/Mon07153.mp3\tDixon Brothers\tFisherman's Luck\tMontgomeryWard\t7855\t07153\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CON12671-1.mp3\tAnnette Hanshaw\tFit As A Fiddle\tCONQUEROR\t8125\t12671-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC73864-1.mp3\tWaring's Pennsylvanians\tFit As A Fiddle\tVICTOR\t24168\t73864-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12425-A.mp3\tThree Keys\tFit As A Fiddle\tBRUNSWICK\t6411\t12425-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_176.mp3\tThree Keys\tFit As A Fiddle\tBRUNSWICK\t6411\t12425-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_379.mp3\tSammy Davis Jr.\tFive\tDecca\t29976\t89929\t1956\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO52y.mp3\tFirehouse Five Plus Two\tFive Foot Two\tGood Time Jazz\t52\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19899.mp3\tGene Austin\tFive Foot Two\tVictor\t19899\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC34103-3.mp3\tGene Austin\tFive Foot Two Eyes Of Blue\tVICTOR\t19899\t34103-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC33617-2.mp3\tArt Landry And His Orch\tFive Foot Two, Eyes Of Blue\tVICTOR\t19850A\t33617-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_014.mp3\tGene Austin Feat. Nat Shilkret And His Orchestra\tFive Foot Two, Eyes Of Blue\tVICTOR\t19899\t34103-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC71132.mp3\tLouis Jordan And His Tympani 5\tFive Guys Named Moe\tDECCA\t8653B\t71132\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_390.mp3\tFrank Sinatra\tFive Hundred Guys\tCapitol\t3423\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1853.mp3\tFrank Sinatra\tFive Minutes More\tCOLUMBIA\t37048\tHCO1853\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_010.mp3\tFrank Sinatra\tFive Minutes More\tCOLUMBIA\t37048\tHCO1853\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_084.mp3\tThree Suns\tFive Minutes More\tMAJESTIC\t7197\tT782\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC061684.mp3\tDuke Ellington And His Orch\tFive O'clock Drag\tVICTOR\t27700\t061684\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480735.mp3\tDuke Ellington And His Famous Orchestra\tFive O'clock Drag\tVictor\t27700\t061684-1\t1941\tWardell Jones, Ray Nance (tp), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Barney Bigard (cl), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (as, bsx), Ben Webster (ts), Duke Ellington (p), Fred Guy (g), Jimmy Blanton (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3a/BLU056106.mp3\tGlenn Miller And His Orchestra Vocal Marion Hutton\tFive O'clock Whistle\tBLUEBIRD\t10900\t056106\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS28914-1.mp3\tWill Bradley & His Orch\tFive O'clock Whistle\tCBS\tCo35793\t28914-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68160.mp3\tWoody Herman & His Orchestra\tFive O'clock Whistle\tDECCA\t3436A\t68160\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051263.mp3\tErskine Hawkins & His Orch\tFive O'clock Whistle\tBLUEBIRD\t10854\t051263\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68146.mp3\tElla Fitzgerald And Her Orch\tFive O'clock Whistle\tDECCA\t3420B\t68146\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU10854.mp3\tErskine Hawkins & His Orchestra\tFive O'clock Whistle\tBLUEBIRD\t10854\t051263\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29087-1.mp3\tCount Basie And His Orchestra\tFive O'clock Whistle\tOkeh\t5922\t29087-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_073.mp3\tElla Fitzgerald\tFive O'clock Whistle\tDECCA\t3420B\t68146\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_107.mp3\tErskine Hawkins And His Orchestra\tFive O'clock Whistle\tBluebird\tB-10854\t051263\t1940\tErskine Hawkins, Sam Lowe, James Harris, Marcellus Green (tp), Edward Sims, Robert Range (tb), William Johnson, Jimmy Mitchelle (as), Julian Dash, Paul Bascomb (ts), Heywwod Henry (cl, bar), Avery Parrish (p), William McLemore (g), Leemie Stanfield (sb), James Morrison (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DEC63428.mp3\tBob Crosby's Bobcats\tFive Point Blues\tDECCA\t25298\t63428\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_156.mp3\tTony Pastor And His Orchestra\tFive Salted Peanuts\tVictor\t20-1661\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC39569-3.mp3\tPaul Whiteman And His Orchestra\tFive, Step\tVICTOR\t20883B\t39569-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36747-1.mp3\tCount Basie & His Orchestra\tFla Ga La Pa\tCOLUMBIA\t37093\tCO36747-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3457.mp3\tTed Daffan's Texans\tFlame Of Love\tCOLUMBIA\t20567\tHCO3457\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL13.mp3\tColeman Hawkins W T.wilson\tFlame Thrower\tKEYNOTE\t611\tHL13\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4456.mp3\tFrankie Laine\tFlamenco\tCOLUMBIA\t39585\tHCO4456\t\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC34062-3.mp3\tCoon-sanders Nighthawk Orch\tFlamin' Mamie\tVICTOR\t19922B\t34062-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_179.mp3\tCoon-sanders Orchestra\tFlamin' Mamie\tVICTOR\t19922B\t34062-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3h/Vic49652-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tFlaming Youth\tVictor\tV-38035\t49652-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC053781.mp3\tDuke Ellington And His Orch\tFlamingo\tVICTOR\t27326\t053781\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL244.mp3\tErroll Garner Trio\tFlamingo\tATLANTIC\t662\t244\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/SIGBOB1.mp3\tEddie Heywood Trio\tFlamingo\tSIGNATURE\t40003A\tBOB1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2449.mp3\tJimmie Lunceford & His Orch\tFlamingo\tDECCA\t3931A\tDLA2449\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN9007-1MA.mp3\tEarl Bostic And His Orch\tFlamingo\tKING\t4475AA\t9007-1MA\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D212B.mp3\tHerb Jeffries With Duke Ellington\tFlamingo\tV-DISC\t212B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA-2449-A.mp3\tJimmie Lunceford And His Orchestra\tFlamingo\tDecca\t3931\tDLA-2449-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_092.mp3\tDuke Ellington And His Famous Orchestra\tFlamingo\tVICTOR\t27326\t053781\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30444-1.mp3\tGene Krupa & His Orch\tFlamingo (v H. Dulany)\tOKEH\t6210\t30444-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_108.mp3\tSteve Porter\tFlanagan And His Motor Car\tEDISON\t50153\t2066-C\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_068.mp3\tLen Spencer And Steve Porter\tFlanagan's Night Off\tZONOPHONE\t515\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU4991.mp3\tHarry Reser\tFlapperette\tBRUNSWICK\t4991\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC37522-1.mp3\tNat Shilkret & Victor Orch\tFlapperette\tVICTOR\t20503B\t37522-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_069.mp3\tNat Shilkret And The Victor Orchestra\tFlapperette\tVICTOR\t20429un\t37522-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA2044.mp3\tHarry James And His Orch\tFlash\tCOLUMBIA\t35587\tLA2044\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Col25214-2.mp3\tHarry James And His Orchestra\tFlash\tColumbia\t\t25214-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030169.mp3\tBunny Berigan & His Orch\tFlashes\tVICTOR\t26121A\t030169\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65304.mp3\tLouis Jordan & His Tympani 5\tFlat Face\tDECCA\t7590\t65304\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CON22318-4.mp3\tSlim And Slam\tFlat Foot Floogie\tCONQUEROR\t9056\t22318-4\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT822.mp3\tSlim Gaillard & His Orch\tFlat Foot Floogie\tMAJESTIC\t9002\tT822\t1945\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCON9056.mp3\tSlim And Slam\tFlat Foot Floogie\tCONQUEROR\t9056\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25871.mp3\tBenny Goodman & His Orchestra\tFlat Foot Floogie\tVictor\t25871\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1976.mp3\tDorothy Shay\tFlat River, Missouri\tCOLUMBIA\t37191\tHCO1976\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5453.mp3\tCozy Cole Allstars\tFlat Rock\tSAVOY\t583B\tS5453\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148203.mp3\tGid Tanner's Skillet Lickers\tFlatwoods\tCOLUMBIA\t15472 D\tW148203\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-327-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tFleur D'ennui\tSWING\t176\tOSW-327-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18600-1.mp3\tFrankie Trumbauer And His Orch\tFlight Of A Hay-bag (rhythmic Thesaurus)\tBRUNSWICK\t7629\t18600-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO29726.mp3\tHarry James And His Orch\tFlight Of The Bumble Bee\tCOLUMBIA\t36004\tCO29726\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D311A1.mp3\tHarry James And His Orchestra\tFlight Of The Bumblebee\tV-DISC\t311A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Col29294-1.mp3\tJimmie Lunceford And His Orchestra\tFlight Of The Jitterbug\tColumbia\t35967\t29294-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-3213-A.mp3\tHorace Henderson And His Orchestra\tFlining A Whing-ding\tOKEH\t5748\tWC-3213-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5818.mp3\tDuke Ellington & His Orch\tFlippant Flurry\tMUSICRAFT\t465\t5818\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/MER1643-2.mp3\tHelen Humes\tFlippity Flop Flop\tMERCURY\t8074\t1643-2\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38951.mp3\tVictor Young & His Orch\tFlirtation Walk\tDECCA\t279B\t38951\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec279B.mp3\tVictor Young & His Orchestra\tFlirtation Walk\tDecca\t279B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_147.mp3\tVictor Young And His Orchestra\tFlirtation Walk\tDECCA\t279B\t38951\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10448.mp3\tFrankie Laine & Jo Stafford\tFloatin' Down To Cotton Town\tCOLUMBIA\t40116\tRHCO10448\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC0342-1.mp3\tFats Waller And His Rhythm\tFloatin' Down To Cotton Town\tVICTOR\t25415\t0342-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic0342-1.mp3\t\"fats\" Waller And His Rhythm\tFloatin' Down To Cotton Town\tVictor\t25415\t0342-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62465.mp3\tSleepy John Estes\tFloating Bridge - Blues\tDECCA\t7442\t62465\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_071.mp3\tSam Ash\tFloating Down The Old Green River\tCOLUMBIA\t1825\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU04175.mp3\tTempo King's Kings Of Tempo\tFloating On A Bubble\tBLUEBIRD\t6780\t04175\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN9119-A.mp3\tSioux City Six\tFlock O' Blues\tGENNETT\t5569\t9119-A\t1924\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC91341.mp3\tLonnie Johnson\tFlood Water Blues\tDECCA\t7397\t91341\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/HITCR346.mp3\tCootie Williams & His Orch\tFloogie Boo\tHIT OF THE WEEK\t8089B\tCR346\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1012-1.mp3\tCab Calloway And His Orchestra\tFloogie Walk\tVocalion\t4807\tWM-1012-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic40011-3.mp3\tJuanita Stinette Chapelle\tFlorence\tVictor\t21062\t40011-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW141277-3.mp3\tBessie Smith\tFlorida Bound Blues\tCOLUMBIA\t14109 D\tW141277-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021153.mp3\tFats Waller And His Rhythm\tFlorida Flo (vfw)\tVICTOR\t25806\t021153\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_114.mp3\tFred Van Eps\tFlorida Rag\tVICTOR\t17308\t12238-2\t1913\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC39827-2.mp3\tRoss Deluxe Syncopators\tFlorida Rhythm\tVICTOR\t20961\t39827-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1794-1.mp3\tRoy Eldridge & His Orch\tFlorida Stomp\tVOCALION\t3479\tC1794-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Har141305-5.mp3\tThe Dixie Stompers\tFlorida Stomp\tHarmony\t88-H\t141305-5  \t1925\t\nhttp://www.78-tours.net/mp3/SWIOSW206.mp3\tAim Barelli, Christian Bellest, Raoul Coucoulle (tromp.) Maurice Gladieu (trombone) Alix Combelle (\tFlots Bleus\tSWING\tSW. 111A\tOSW. 206\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D353B.mp3\tSzath-myrl And His Orchestra\tFlow Gently, Sweet Afton\tV-DISC\t353B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1283.mp3\tArnett Cobb & His Orchestra\tFlower Garden Blues\tAPOLLO\t394\tR1283\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_172.mp3\tFrank Sinatra\tFlowers Mean Forgiveness\tCapitol\t3350\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65191.mp3\tAndy Kirk And Clouds Of Joy\tFloyd's Guitar Blues\tDECCA\t2483A\t65191\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65191-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tFloyd's Guitar Blues\tDecca\t2483\t65191-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke4003.mp3\tVan Eps Quartette\tFlutter On By My Broadway Butterfly\tOkeh\t4003\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147264.mp3\tGid Tanner's Skillet Lickers\tFly Around My Pretty Little Miss\tCOLUMBIA\t15709 D\tW147264\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D320B2.mp3\tWoody Herman And His Orchestra\tFlyin' Home\tV-DISC\t320B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCA14212.mp3\tFred Astaire\tFlying Down To Rio\tCOLUMBIA\t2912 D\tCA14212\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC78520-1.mp3\tRudy Vallee And His Ct.yankees\tFlying Down To Rio\tVICTOR\t24459\t78520-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_089.mp3\tFred Astaire\tFlying Down To Rio\tCOLUMBIA\t2912 D\tCA14212\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_081.mp3\tRudy Vallee And His Connecticut Yankees\tFlying Down To Rio\tVICTOR\t24459\t78520-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC70773.mp3\tLionel Hampton And His Orch.\tFlying Home\tDECCA\t18394A\t70773\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC73066.mp3\tElla Fiztgerald W Vic Schoen\tFlying Home\tDECCA\t23956\t73066\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWCO26132-A.mp3\tBenny Goodman Sextet\tFlying Home\tCOLUMBIA\t36721\tWCO26132-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU050620.mp3\tCharlie Barnet & His Orch\tFlying Home\tBLUEBIRD\t10794\t050620\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT984.mp3\tJohnny Guarnieri Trio\tFlying Home\tMAJESTIC\t1095\tT984\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D258.mp3\tRed Norvo & His Orch\tFlying Home\tV-DISC\t490\t258\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26596.mp3\tLionel Hampton & His Orchestra\tFlying Home\tVictor\t26596\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU10794.mp3\tCharlie Barnet & His Orchestra\tFlying Home\tBLUEBIRD\t10794\t050620\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70773-A.mp3\tLionel Hampton And His Orchestra\tFlying Home\tDecca\t18394\t70773-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic044726-1.mp3\tLionel Hampton And His Orchestra\tFlying Home\tVictor\t26595\t044726-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_318.mp3\tLionel Hampton And His Orchestra\tFlying Home\tVictor\t26595\t044726-1\t1940\tZiggy Elman (tp), Toots Mondello, Buff Estes (as), Jerry Jerome, Budd Johnson (ts), Spencer Odun (p), Ernest Ashley (g), Artie Bernstein (sb), Nick Fatool (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1942_255.mp3\tLionel Hampton And His Orchestra\tFlying Home\tDecca\t18394\t70773-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71827-A.mp3\tLionel Hampton And His Orchestra\tFlying Home N?2\tDecca\t23639\t71827-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142627-1.mp3\tPoole's N.carolina Ramblers\tFlying' Clouds\tCOLUMBIA\t15106 D\tW142627-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D47B.mp3\tRichard Dyer-bennett\tFoggy Foggy Dew\tv-disk\t47B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MER2665.mp3\tLester Flatt And Earl Scruggs\tFoggy Mountain Breakdown\tMERCURY\t6247\t2665\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76080.mp3\tArtie Shaw And His Orchestra\tFoggy, Foggy Dew\tDECCA\t27009\t76080\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/BluST-2089-3.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tFolie  Amphion\tBlue Star\t33\tST-2089-3\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140161-5.mp3\tBessie Smith\tFollow The Deal On Down\tCOLUMBIA\t14052 D\t140161-5\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13687-8.mp3\tAl Jolson\tFollow The Swallow\tBRUNSWICK\t2671\t13687-8\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_024.mp3\tAl Jolson\tFollow The Swallow\tBRUNSWICK\t2671\t13687-8\t1924\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI10741.mp3\tErnie Golden Mcalpin Do\tFond Of You (ft)\tEDISON\t51673\t10741\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D338A2.mp3\tCab Calloway And His Orchestra\tFoo A Little Ballyhoo\tV-DISC\t338A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU24548-1.mp3\tGene Krupa And His Orch\tFoo For Two\tBRUNSWICK\t8361\t24548-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC61047-3.mp3\tGus Arnheim Coconut Grove Orch\tFool Me Some More\tVICTOR\t22561\t61047-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2470FT.mp3\tErskine Hawkins & His Orch.\tFool That I Am\tRCA\t20-2470\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29924-1.mp3\tJack Leonard & Gene Krupa Orch\tFool That I Am (v J L)\tOKEH\t6154\t29924-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO41760.mp3\tSarah Vaughan\tFool's Paradise\tCOLUMBIA\t38617\tCO41760\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068458.mp3\tGlenn Miller And His Orch\tFooled\tBLUEBIRD\t11416-A\t068458\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_155.mp3\tPerry Como\tFooled\tRCA Victor\t6192\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62134-B.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tFoolin' Myself\tDecca\t1261\t62134-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS21217-1.mp3\tTeddy Wilson & His Orch\tFoolin' Myself (vbh)\tCBS\tBR7911\t21217-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW145983.mp3\tLeo Reisman & His Orch\tFoolin' Time\tCOLUMBIA\t1416 D\tW145983\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/CONM748.mp3\tCab Calloway & His Orch\tFoolin' With You\tCONQUEROR\t9090\tM748\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI10276.mp3\tBrigode Ace\tFooling\tEDISON\t51533\t10276\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144919-3.mp3\tBessie Smith\tFoolish Man Blues\tCOLUMBIA\t14273 D\tW144919-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC75289.mp3\tElla Fitzgerald\tFoolish Tears\tDECCA\t24773\t75289\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COLRHCO33388.mp3\tDoris Day\tFoolishly Yours\tCOLUMBIA\t40483\tRHCO33388\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048792.mp3\tCharlie Barnet & His Orch\tFools Fall In Love\tBLUEBIRD\t10691\t048792\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU048489.mp3\tGlenn Miller And His Orch\tFools Rush In\tBLUEBIRD\t10728\t048489\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM47S252.mp3\tBilly Eckstine-h.winterhalter\tFools Rush In\tMGM\t10311B\t47S252\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26696.mp3\tMildred Bailey\tFools Rush In\tCOLUMBIA\t35463\t26696\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67335.mp3\tBob Crosby & His Orch\tFools Rush In\tDECCA\t3154A\t67335\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC048480.mp3\tTommy Dorsey And His Orch\tFools Rush In (vfs)\tVICTOR\t26593\t048480\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_115.mp3\tTommy Dorsey Orch V Frank Sinatra\tFools Rush In (where Angels Fear To Tread)\tVICTOR\t26593\t048480\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC066116.mp3\tAlbert Ammons & Pete Johnson\tFoot Pedal Boogie\tVICTOR\t27507A\t066116\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_143.mp3\tRichard Himber And His Orchestra\tFootloose And Fancy Free\tVictor\t25037\t89739\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC4359.mp3\tBill Monroe Bluegrass Boys\tFootprints In The Snow\tCOLUMBIA\t37151\tC4359\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO4324-1.mp3\tCab Calloway & His Orch\tFor A Little Bally-hoo\tCOLUMBIA\t36786\tCCO4324-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15439.mp3\tHal Kemp And His Orch\tFor All We Know\tBRUNSWICK\t6947\t15439\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D347A1.mp3\tTommy Dorsey And His Orchestra (bob Allen Voc.)\tFor All We Know\tV-DISC\t347A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC38518.mp3\tIsham Jones & His Orchestra\tFor All We Know\tDECCA\t170A\t38518\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_241.mp3\tIsham Jones And His Orchestra\tFor All We Know\tDECCA\t170A\t38518\t1934\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC83179-1.mp3\tIsham Jones And His Orchestra\tFor All We Know - Vocal Joe Martin\tVictor\t\t83179-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76397.mp3\tSy Oliver & His Orch\tFor Dancers Only\tDECCA\t27065\t76397\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66793.mp3\tBob Crosby & His Orch\tFor Dancers Only\tDECCA\t3138A\t66793\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC62263.mp3\tJimmie Lunceford And His Orch\tFor Dancers Only\tDECCA\t25334\t62263\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D355B1.mp3\tJimmie Lunceford And His Orchestra\tFor Dancers Only\tV-DISC\t355B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_123.mp3\tJimmie Lunceford And His Orchestra\tFor Dancers Only\tV-DISC\t355B1\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/V-DVP-1598a.mp3\tJimmie Lunceford And His Orchestra\tFor Dancers Only\tV-Disc\t586-A\tVP-1598a\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62263-A.mp3\tJimmie Lunceford And His Orchestra\tFor Dancers Only\tDecca\t1340\t62263-A\t1937\tJimmie Lunceford dir. Eddie Tompkins-Paul Webster/Sy Oliver-t-v-a/Elmer Crumbley- Russell Bowles-tb/Eddie Durharn tb-g-a/Willie Smith-cI-as-bar-v-a/Ed Brown as/Dan  Grissom-cl-as-v/Earl Carruthers-cl-as-bar/Joe Thomas-cl-ts/Edwin Wilc ox -p-cel-a/Al \nhttp://www.jazz-on-line.com/a/mp3w/1916_052.mp3\tNora Bayes Feat. O/rosario Bourdon\tFor Dixie And Uncle Sam\tVICTOR\t45100\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR94-4.mp3\tIllinois Jacquet & His Orch\tFor Europeans Only\tALLADDIN\t180\tRR94-4\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_321.mp3\tBenny Goodman And His Orchestra Feat. V/peggy Lee\tFor Every Man There's A Woman\tCAPITOL\t15030\t2723\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP2723.mp3\tBenny Goodman And His Orchestra\tFor Every Man There's A Woman (vp.lee)\tCAPITOL\t\t2723\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COMM775.mp3\tLeonard Feather Swynge Band\tFor He's A Jolly Good Fellow\tCOMMODORE\t528\tM775\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC22590-1.mp3\tMarion Harris\tFor Johnny And Me\tVICTOR\t18535B\t22590-1\t1919\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA550-A.mp3\tBing Crosby & Victor Young\tFor Love Alone (i Have So Little To Give)\tDECCA\t1184\tDLA550-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3140.mp3\tJudy Garland And Gene Kelly\tFor Me And My Gal\tDECCA\t18480A\tL3140\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC19329-2.mp3\tVan And Schenck\tFor Me And My Gal\tVICTOR\t18258\t19329-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18258.mp3\tVan & Schenck\tFor Me And My Gal\tVICTOR\t18258\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11549.mp3\tAbe Lyman & His Californians\tFor Me And My Gal\tBluebird\t11549\t75209\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_008.mp3\tVan And Schenck\tFor Me And My Gal\tVICTOR\t18258\t19329-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_025.mp3\tJudy Garland And Gene Kelly\tFor Me And My Gal\tDECCA\t18480A\tL3140\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/EDI5486-A.mp3\tBilly Murray - Chorus - O\tFor Me And My Gal - Foxtrot (george W. Meyer - Edgar Leslie & E. Ray Goetz)\tEDISON\tBA 3222\t5486-A\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_265.mp3\tGeorgia Gibbs\tFor Me, For Me\tMERCURY\t70172\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_268.mp3\tLarry Clinton And His Orchestra\tFor Men Only\tVictor\t26118\t030377\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/V-DVP1595.mp3\tBud Freeman & His Orch\tFor Musicians Only\tV-DISC\t564\tVP1595\t\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW142388-4.mp3\tLeo Reisman & His Orch\tFor My Sweetheart\tCOLUMBIA\t754 D\tW142388-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW81085.mp3\tTram Bix And Lang\tFor No Reason At All In C\tCOLUMBIA\t35667\tW81085\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_119.mp3\tAnnette Hanshaw\tFor Old Times' Sake\tHARMONY\t666\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP304x.mp3\tKing Cole Trio\tFor Sentimental Reasons\tCAPITOL\t304\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP983.mp3\tKing Cole Trio\tFor Sentimental Reasons\tCAPITOL\t\t983\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2071-1.mp3\tDinah Shore With Uncredited Studio Orchestra\tFor Sentimental Reasons\tCOLUMBIA\t37188\tHCO2071-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/MAJT815.mp3\tEddy Howard And His Orchestra\tFor Sentimental Reasons\tMAJESTIC\t1071\tT815\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1981x.mp3\tCharlie Spivak And His Orchestra Vocal By Jimmy Saunders\tFor Sentimental Reasons\tRCA\t20-1981\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS20217-1.mp3\tMildred Bailey\tFor Sentimental Reasons\tCBS\tVO3367\t20217-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC02164.mp3\tTommy Dorsey & His Orch\tFor Sentimental Reasons\tVICTOR\t25446\t02164\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73669.mp3\tElla Fitzgerald & Delta Rhythm\tFor Sentimental Reasons\tDECCA\t23670\t73669\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/BluST-2086-2.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tFor Sentimental Reasons\tBlue Star\t30\tST-2086-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_254.mp3\tMildred Bailey\tFor Sentimental Reasons\tCBS\tVO3367\t20217-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D94A2.mp3\tVaughn Monroe\tFor The First Time\tv-disk\t94A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO894.mp3\tCount Basie And His Orch\tFor The Good Of The Country\tCOLUMBIA\t36685\tHCO894\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_147.mp3\tCount Basie And His Orchestra Feat. V/jimmy Rushing\tFor The Good Of Your Country\tCOLUMBIA\t36685\tHCO894\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1065-A.mp3\tCab Calloway And His Orchestra\tFor The Last Time I Cried Over You\tVocalion\t5126\tWM-1065-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66529.mp3\tWoody Herman & His Orchestra\tFor Tonight\tDECCA\t2762A\t66529\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_253.mp3\tCharlie Barnet And His Orchestra Feat. V/larry Taylor\tFor Tonight\tBluebird\t10361\t38277\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038277.mp3\tCharlie Barnet & His Orch\tFor Tonight (vlt)\tBLUEBIRD\t10361\t038277\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13393.mp3\tCasa Loma Orchestra\tFor You\tBRUNSWICK\t6606\t13393\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_092.mp3\tJohn Boles Feat. O/leroy Shield\tFor You\tVICTOR\t22373\t54712-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/MER335-1.mp3\tErroll Garner Trio\tFor You\tMERCURY\t1034\t335-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA189.mp3\tAndy Iona's Novelty Four\tFor You A Lei\tCOLUMBIA\t2953 D\tLA189\t\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR30058-B.mp3\tParamount Military Band\tFor You A Rose\tParamount\t30058-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC80228L.mp3\tEnrico Caruso\tFor You Alone\tVICTOR\t87070\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_040.mp3\tEnrico Caruso\tFor You Alone\tVICTOR\t87070\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP5366-3.mp3\tNellie Luther & Rhythm\tFor You My Love\tCAPITOL\t\t5366-3\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC75637.mp3\tLionel Hampton & His Orch\tFor You My Love\tDECCA\t24855\t75637\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec75637.mp3\tLionel Hampton And His Orchestra\tFor You My Love\tDecca\t24855\t75637\t1949\tWalter Williams-Benny Bailey-Ed Mullens-Duke Garrette-Leo Shepherd-t, AI Grey-Benny Powell-Jimmy Wormick-Paul Lee Higaki-tb, Bobby Plater-Jerome Richardson-as, Curtis Lowe-Johnny Board-Billy ''Smallwood'' Williams-ts, Lonnie Shaw-bar, Lionel Hampton-vi\nhttp://www.jazz-on-line.com/a/mp3a/MUS5629.mp3\tArtie Shaw And His Orchestra\tFor You, For Me, Forevermore\tMUSICRAFT\t412\t5629\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_201.mp3\tJudy Garland And Dick Haymes\tFor You, For Me, Forevermore\tDECCA\t23687\tL4295\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC22178.mp3\tPeerless Qt\tFor Your Boy And My Boy\tVICTOR\t18494\t22178\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/COL77053.mp3\tPeerless Qt\tFor Your Country And My Country\tCOLUMBIA\tA-2273\t77053\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66873.mp3\tLouis Jordan & His Tympani 5\tFore Day Blues\tDECCA\t7693\t66873\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93810.mp3\tJay Mcshann Quartet\tFore Day Rider\tDECCA\t8635\tC93810\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480376.mp3\tArt Farmer And Gigi Gryce\tForecast\tPrestige\tLP7017\t804\t1955\tArt Farmer, FLH, Gigi Gryce, As, Duke Jordan, P, Addison Farmer, B,, Art's Twin Brother, Philly Joe Jones, D, [Featuring Gigi Gryce]\nhttp://www.jazz-on-line.com/a/mp3o/DECL4871.mp3\tRuss Morgan And His Orchestra\tForever And Ever\tDECCA\t24569\tL4871\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_009.mp3\tRuss Morgan And His Orchestra\tForever And Ever\tDECCA\t24569\tL4871\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_108.mp3\tDinah Shore\tForever And Ever\tCOLUMBIA\t38410\tHCO3535\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_231.mp3\tGracie Fields (feat. O-bob Faron V-wardour Singers)\tForever And Ever\tLondon\t362\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_022.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tForever And Ever\tRCA Victor\t78-3347\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap838.mp3\tBenny Carter And His Orchestra\tForever Blue\tCapitol\t11057\t838\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_220.mp3\tAmes Brothers\tForever Darling\tRCA\t6400\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_215.mp3\tErnest Tubb\tForever Is Ending Today\tDECCA\t46134\t74349\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/RCA20-6400.mp3\tAmes Brothers\tForever, Darling\tRCA\t20-6400\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COMR4060.mp3\tJoe Sullivan (piano)\tForevermore\tCOMMODORE\t538\tR4060\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS22924-2.mp3\tBillie Holiday & Her Orch\tForget If You Can\tCBS\tVO4151\t22924-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCBSVO4151.mp3\tBillie Holiday & Her Orch\tForget If You Can\tCBS\tVO4151\t22924-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81763-3.mp3\tPaul Specht And His Hotel Alamac Orchestra\tForget Me Not\tColumbia\t135-D\t81763-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC43665-2.mp3\tPaul Whiteman & His Orch\tForget Me Not\tVICTOR\t27686\t43665-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D269B.mp3\tPerry Como\tForget-me-nots In Your Eyes\tV-DISC\t269B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL81316-1.mp3\tFrank Westphal And His Orch\tForgetful Blues\tCOLUMBIA\t32D\t81316-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400741-A.mp3\tDorsey Brothers Orchestra\tForgetting You\tOKeh\t41065\t400741-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_123.mp3\tRichard Hayes\tForgetting You\tMercury\t5910\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE27853.mp3\tColeman Hawkins\tForgive A Fool\tOKEH\t6347\t27853\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-4574x.mp3\tEddie Fisher\tForgive Me\tRCA\t20-4574\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC38172-2.mp3\tGene Austin\tForgive Me\tVICTOR\t20561\t38172-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_050.mp3\tEddie Fisher\tForgive Me\tRCA\t20-4574\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_014.mp3\tGene Austin Feat. Nat Shilkret And His Orchestra\tForgive Me\tVIVICTORCTOR\t20561\t38172-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38155.mp3\tNat Shilkret & Victor Orch\tForgive Me (v L J)\tVICTOR\t20514\t38155\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_095.mp3\tNat ''king'' Cole\tForgive My Heart\tCapitol\t3234 B\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142632-1.mp3\tCharlie Poole N.c.ramblers\tForks Of Sandy\tCOLUMBIA\t15106 D\tW142632-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62206.mp3\tBob Howard & His Orch\tFormal Night In Harlem\tDECCA\t1306\t62206\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc13756.mp3\tFletcher Henderson And His Orchestra\tForsaken Blues\tVocalion\t\t13756  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S264.mp3\tSy Oliver & His Orch\tForsaking All Others (vtommy Roberts)\tMGM\t10103A\t47S264\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45440-1.mp3\tBessie Tucker\tFort Worth & Denver Blues\tVICTOR\t21708\t45440-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_121.mp3\tKay Starr\tFortune In Dreams\tCapitol\t2887\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/VOCC3936-A.mp3\tBeale Street Washboard Band\tForty And Tight\tVOCALION\t1403\tC3936-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC2028-1.mp3\tCharlie Palloy & His Orch\tForty Second Street\tCROWN\t3473\tC2028-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC75323-1.mp3\tDon Bestor And His Orch\tForty Second Street (vdm)\tVICTOR\t24253\t75323-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/CON12893-1.mp3\tArt Kahn's Orch\tForty Second Street (vdr)\tCONQUEROR\t8115\t12893-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_006.mp3\tDon Bestor And His Orchestra Feat. Dudley Mecum\tForty-second Street\tVICTOR\t24253\t75323-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC48428-2.mp3\tTal Henry & His Orch\tFound My Gal\tVICTOR\t40035\t48428-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26928.mp3\tRaymond Scott And His New Orch\tFour Beat Shuffle\tCOLUMBIA\t35565\t26928\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO3061.mp3\tWoody Herman And His Orchestra\tFour Brothers\tCOLUMBIA\t38304\tHCO3061\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480506.mp3\tArt Pepper\tFour Brothers\tContemporary\tM3568\t\t1959\tJackSheldon, Al Porcino (tp), Dick Nash (tb), Bob Ebevoldsen (ts), Vince DeRosa (fhr), Art Pepper, Charlie Kennedy (as), Richie Kamuca (ts), Med Flory (bar), Russ Freeman (p), Joe Mondragon (sb), Mel Lewis (dm), Marty Paich (arr, cond)\nhttp://www.jazz-on-line.com/a/mp3b/Vic20-3258-A.mp3\tSpade Cooley\tFour Fiddle Polka\tVictor\t20-3258-A\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC56753-1.mp3\tPaul Tremaine And His Aristocrats\tFour Four Rhythm\tVICTOR\t40176\t56753-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2806.mp3\tGeorge Hamilton Green\tFour Little Blackberries\tColumbia\tA2806\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68517.mp3\tSkeets Tolbert Gentlemen Swing\tFour O'clock Blues\tDECCA\t8534\t68517\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec68517-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tFour O'clock Blues\tDecca\t8534\t68517-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE401221-A.mp3\tChocolate Dandies\tFour Or Five Times\tOKeh\t8627\t401221-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3123.mp3\tWoody Herman & His Orch\tFour Or Five Times\tDECCA\t18526A\tL3123\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39556.mp3\tJimmie Lunceford & His Orch\tFour Or Five Times\tDECCA\t3515A\t39556\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/SUPE7477.mp3\tJimmie Noone Apex Club Orch\tFour Or Five Times\tSUPERTONE\t2227s\tE7477\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76291.mp3\tSy Oliver & His Orch.\tFour Or Five Times\tDECCA\t27065\t76291\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC043249-1.mp3\tLionel Hampton & His Orch\tFour Or Five Times\tVICTOR\t26447A\t043249-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/MajT-881.mp3\tJimmie Lunceford And His Orchestra\tFour Or Five Times\tMajestic\t1103\tT-881\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic043249-1.mp3\tLionel Hampton And His Orchestra\tFour Or Five Times\tVictor\t26447\t043249-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D899m.mp3\tBuddy Rich & His Orch\tFour Rich Brothers\tV-DISC\t899\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE81823-C.mp3\tJoe Venuti & His Blue Four\tFour String Joe\tOKEH\t40947\t81823-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S258.mp3\tSy Oliver & His Orch\tFour To Go\tMGM\t10335\t47S258\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU07112.mp3\tWalter Couch & Wilks Ramblers\tFourteen Days In Georgia\tBLUEBIRD\t7252\t07112\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/EDI1205-A.mp3\tCal Stewart\tFourth Of July At Pumpkin Center (cal Stewart)\tEDISON\t\t1205-A\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC102018-1.mp3\tFats Waller And His Rhythm\tFractious Fingering\tVICTOR\t25652B\t102018-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic102018-1.mp3\t\"fats\" Waller And His Rhythm\tFractious Fingering\tVictor\t25652\t102018-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_277.mp3\tBill Haley And His Comets\tFractured\tEssex\t327\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49450-2.mp3\tJelly Roll Morton (piano)\tFrances\tVICTOR\t38627\t49450-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic49450-2.mp3\tJelly Roll Morton And His Orchestra\tFrances\tVictor\tV-38627\t49450-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP7824-D1.mp3\tStan Kenton & His Orch\tFrancesca\tCAPITOL\t\t7824-D1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE21804.mp3\tDykes Magic City Trio\tFrankie\tBRUNSWICK\t127\tE21804\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400221-B.mp3\tMississippi John Hurt\tFrankie\tOKeh\t8560\t400221-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP1752.mp3\tDuke Ellington Orch\tFrankie And Johnnie\tV-DISC\t626\tVP1752\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55333.mp3\tJimmie Rodgers\tFrankie And Johnnie\tVICTOR\t22143\t55333\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA011121.mp3\tBunny Berigan And His Orch\tFrankie And Johnny\tRCA\t20-1500-B\t011121\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38742.mp3\tFrank Crumit\tFrankie And Johnny\tVICTOR\t20715\t38742\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe17123.mp3\tTed Lewis & His Band\tFrankie And Johnny\tOKeh\t41582\t17123\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_094.mp3\tTed Lewis And His Band\tFrankie And Johnny\tOKeh\t41582\t17123\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_227.mp3\tFrank Crumit\tFrankie And Johnny\tVICTOR\t20715\t38742\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81675-2.mp3\tBessie Smith\tFrankie Blues\tCOLUMBIA\t14023 D\t81675-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150252.mp3\tTom Darby And Jimmie Tarlton\tFrankie Dean\tCOLUMBIA\t15701 D\tW150252\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP1315.mp3\tDuke Ellington Orch\tFrantic Fantasy\tV-DISC\t575\tVP1315\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER333.mp3\tErroll Garner Trio\tFrantonality\tMERCURY\t5008\t333\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/MER333-1-2.mp3\tErroll Garner Trio\tFrantonality   \tMERCURY\t5008\t333-1-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49451-1.mp3\tJelly Roll Morton (piano)\tFreakish\tVICTOR\t27565\t49451-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic49451-2.mp3\tJelly Roll Morton And His Orchestra\tFreakish\tVictor\tV-38527\t49451-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70198-1.mp3\tLuis Russell & His Orch\tFreakish Blues\tVICTOR\t22815\t70198-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/Vic49649-4.mp3\tKing Oliver And His Orchestra\tFreakish Light Blues\tVictor\tV-38521\t49649-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70950.mp3\tGene Kardos & His Orch\tFreddy The Freshman (v D R)\tVICTOR\t22865\t70950\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/MER2143.mp3\tHelen Humes\tFree\tMERCURY\t8119\t2143\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_184.mp3\tTommy Leonetti\tFree\tCapitol\t3442\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh109.mp3\tJack Payne And His Band\tFree\tRex\t8857\tF-1961-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5491.mp3\tDon Byas's Swing Shifters\tFree And Easy\tSAVOY\t524B\tS5491\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/SAVS5491-2.mp3\tSavoy Jam Party Don Byas Orchestra\tFree And Easy\tSAVOY\t524B\tS5491-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB404.mp3\tCount Basie & His Orchestra\tFree Eats\tRCA\t20-2148\tD7VB404\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_083.mp3\tCount Basie And His Orchestra\tFree Eats\tRCA\t20-2148\tD7VB404\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC065916-2.mp3\tTommy Dorsey And His Orch\tFree For All\tVICTOR\t27532\t065916-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21900.mp3\tArtie Shaw And His New Music\tFree For All\tBRUNSWICK\t8019\tB-21900-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE21836.mp3\tDykes Magic City Trio\tFree Little Bird\tBRUNSWICK\t129\tE21836\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21715.mp3\tArtie Shaw And His New Music\tFree Wheeling\tBRUNSWICK\t7976\tB-21715-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_224.mp3\tArtie Shaw And His Orchestra\tFree Wheeling\tVOCALION\t4198\t21715\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC349-3-.mp3\tJosh White\tFreedom Road\tASCH\t349-3\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17062H.mp3\tThe Dutch Swing College Band\tFreeze An'melt\tPhilips\tP17062H\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148171-1.mp3\tJoe Turner & His Memphis Men\tFreeze And Melt\tCOLUMBIA\t1813 D\tW148171-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Cam3798-B.mp3\tHenderson's Roseland Orchestra\tFreeze And Melt\tCameo\t9174\t3798-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/Col148171-1.mp3\tJoe Turner And The Memphis Men\tFreeze And Melt\tColumbia\t1813-D\t148171-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148941-3.mp3\tClarence Williams Jazz Kings\tFreeze Out\tCOLUMBIA\t14460 D\tW148941-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK2100-K2.mp3\tDelmore Brothers\tFreight Train Boogie\tKING\t570A\tK2100-K2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC042546.mp3\tArtie Shaw And His New Music\tFrenesi\tVICTOR\t26542B\t042546-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU058174.mp3\tGlenn Miller & His Orch\tFrenesi\tBLUEBIRD\t10994 A\t058174\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68157.mp3\tWoody Herman & His Orchestra\tFrenesi\tDECCA\t3427A\t68157\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_131.mp3\tWoody Herman And His Orchestra\tFrenesi\tDECCA\t3427A\t68157\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic042546-1.mp3\tArtie Shaw And His Orchestra\tFrenesi\tVictor\t26542\t042546-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/PACST1419-2.mp3\tOrchestre Du Balajo\tFrnsie Collection Musette Club De France\tPACIFIC\tMC700\tST1419-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43003.mp3\tUna Mae Carlisle\tFrenzy\tCOLUMBIA\t38973\tCO43003\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057610.mp3\tGlenn Miller & His Orch\tFresh As A Daisy (vjl)\tBLUEBIRD\t10959-B\t057610\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VICPB141-4.mp3\tWaring's Pennsylvanians\tFreshie\tVICTOR\t19784A\tPB141-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCE28949.mp3\tWhoopee Makers (pettis)\tFreshman Hop\tVOCALION\t15769\tE28949\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66074-B.mp3\tEddie Condon's Chicagoans\tFriar's Point Shuffle\tDECCA\t18040B\t66074-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_259.mp3\tFour Aces Featuring Al Alberts\tFriendly Persuasion (thee I Love)\tDecca\t30041\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_039.mp3\tPat Boone\tFriendly Persuasion (thee I Love)\tDot\t15490\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_172.mp3\tHorace Heidt Musical Knights\tFriendly Tavern Polka\tCOLUMBIA\t36006\tHCO207\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_058.mp3\tSterling Trio (henry Burr, Albert Campbell And John Meyer)\tFriends\tColumbia\t2744\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_361.mp3\tTommy Prisco With Hugo Peretti And His Orchestra\tFriends And Neighbors\tMERCURY\t70396\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4342.mp3\tLouis Jordan & His Tympani 5\tFriendship\tDECCA\t28444\tL4342\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_089.mp3\tKay Kyser And His Orchestra\tFriendship\tCOLUMBIA\t35368\t26406-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP767.mp3\tKing Cole Trio\tFrim Fram Sauce\tCAPITOL\t\t767\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU47167.mp3\tAllen Brothers\tFrisco Blues\tBLUEBIRD\t5224\t47167\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu5224.mp3\tAllen Brothers\tFrisco Blues\tBluebird\t5224\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19876-1.mp3\tCab Calloway & His Orch\tFrisco Flo\tBRUNSWICK\t7756\t19876-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1014.mp3\tJimmie Lunceford & His Orch\tFrisco Fog\tDECCA\t1569\tDLA1014\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA-1014-A.mp3\tJimmie Lunceford And His Orchestra\tFrisco Fog\tDecca\t1569\tDLA-1014-A\t1937\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3c/SUNSR1010.mp3\tJohnny Hodges & His Orchestra\tFrisky\tSUNSET\t2006\tSR1010\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03325-3.mp3\t Len Spencer And Ada Jones\tFritz And Louisa\tCOLUMBIA\tA-0289\t03325-3\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_079.mp3\tLen Spencer And Ada Jones\tFritz And Louisa\tEdison\t9172\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_079alt.mp3\t Len Spencer And Ada Jones\tFritz And Louisa\tCOLUMBIA\t\t03325-3\t1906\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480775.mp3\tBen Webster Quintet\tFrog And Mule\tHaven\t805\th-1939\t1946\tBen Webster (ts), Al Haig (p), Bill De Arango (g), John Simmons (sb), Sid Catlett (dm)\nhttp://www.jazz-on-line.com/a/mp3c/PAR11097-2.mp3\tLovie Austin's Serenaders\tFrog Tongue Stomp\tPARAMOUNT\t12361\t11097-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17181H-.mp3\tThe Dutch Swing College Band\tFrog-i-more Rag\tPhilips\tP17181H\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/AUT534.mp3\tJelly Roll Morton\tFroggie Moore\tAUTOGRAPH\t534\t534\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/Gen11390-B.mp3\tKing Oliver's Creole Jazz Band\tFroggie Moore\tGennett\t5135\t11390-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUKC619.mp3\tAndy Kirk 12 Clouds Of Joy\tFroggy Bottom\tBRUNSWICK\t4893\tKC619\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Col60865-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tFroggy Bottom\tColumbia\tDB-5000\t60865-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruKC-619.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tFroggy Bottom\tBrunswick\t4893\tKC-619\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/VarLO-372-2.mp3\tBarney Bigard And His Jazzopaters\tFrolic Sam\tVariety\t525\tLO-372-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64709.mp3\tJohn Kirby And Onyx Club Boys\tFrom A Flat To C\tDECCA\t2216B\t64709\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_426.mp3\tRover Boys\tFrom A School Ring To A Wedding Ring\tABC-Paramount\t9732\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047710.mp3\tCharlie Barnet & His Orch\tFrom Another World\tBLUEBIRD\t10637\t047710\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26697.mp3\tMildred Bailey\tFrom Another World\tCOLUMBIA\t35463\t26697\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67336.mp3\tBob Crosby & His Orch\tFrom Another World\tDECCA\t3091A\t67336\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_220.mp3\tCharlie Barnet And His Orchestra Feat. V/mary Ann Mccall\tFrom Another World\tBLUEBIRD\t10637\t47710\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_117.mp3\tFrank Sinatra\tFrom Here To Eternity\tCapitol\t2560\t11526\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/COL47218.mp3\tAl Jolson (baritone)\tFrom Here To Shanghai\tCOLUMBIA\tA-2224\t47218\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_091alt.mp3\tGene Greene\tFrom Here To Shanghai\tVICTOR\t18242\t19143-4\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU070447.mp3\tBill 'jazz' Gillum\tFrom Now On\tBLUEBIRD\t9034\t070447\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC56722-3.mp3\tBen Pollack & His Orch\tFrom Now On\tVICTOR\t22158\t56722-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/PATCPT-1700-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tFrom Now On\tPath\tPA-468\tCPT-1700-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC83182.mp3\tIsham Jones & His Orch\tFrom Now On\tVICTOR\t24682\t83182\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067629.mp3\tGlenn Miller & His Orch\tFrom One Love To Another (vre)\tBLUEBIRD\t11287\t067629\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS25057.mp3\tHarry James And His Orch\tFrom The Bottom Of My Heart\tCBS\tBR8443\t25057\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-25057-1.mp3\tHarry James And His Orchestra\tFrom The Bottom Of My Heart\tBrunswick\t8443\tB-25057-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22267-2.mp3\tMildred Bailey & Her Orchestra\tFrom The Land Of Sky Blue Waters\tVOCALION\t3982\t22267-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC64190.mp3\tAlma Gluck\tFrom The Land Of Sky Blue Waters\tVICTOR\t64190\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru2559.mp3\tPaul Ash & His Orchestra\tFrom The Land Of The Sky-blue Water\tBrunswick\t2559\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_125.mp3\tAlma Gluck\tFrom The Land Of The Sky-blue Water\tVICTOR\t64190\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18021.mp3\tWingy Manone & His Orch\tFrom The Top Of Your Head\tARC\tVO3023\t18021\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39852.mp3\tBing Crosby & Dorsey Brothers\tFrom The Top Of Your Head\tDECCA\t547B\t39852\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17886-1.mp3\tHal Kemp And His Orch\tFrom The Top Of Your Head\tBRUNSWICK\t7509\t17886-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru39852-A.mp3\tDorsey  Brothers  Orchestra With Bing Crosby\tFrom The Top Of Your Head\tBrunswick\tE02082\t39852-A \t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh001.mp3\tCarroll Gibbons And His Savoy Hotel Orpheans\tFrom The Top Of Your Head\tColumbia\tFB-1203\tCA-15386-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_047.mp3\tGaylords\tFrom The Vine Came The Grape\tMERCURY\t70296\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_241.mp3\tFrank Sinatra\tFrom This Day Forward\tCOLUMBIA\t36987\tHCO1733\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM53S3102.mp3\tAnn Miller And Tommy Rall\tFrom This Moment On\tMGM\t30814\t53S3102\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP136x.mp3\tCeele Burke\tFrom Twilight Till Dawn\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/PATCPT-1843-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tFrom You\tPath\tPA-537\tCPT-1843-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24945-A.mp3\tJohn Kirby & His Orchestra\tFront And Center\tVOCALION\t5520\t24945-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81464-4.mp3\tBessie Smith\tFrosty Mornin' Blues\tCOLUMBIA\t14005 D\t81464-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_275.mp3\tGene Autry\tFrosty The Snowman\tCOLUMBIA\t38907\tHCO4094\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_100.mp3\tNat ''king'' Cole Feat. Pete Rugolos Orchestra And The Pussy Cats\tFrosty The Snowman\tCAPITOL\t1203\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU74805.mp3\tAllen Brothers\tFruit Jar Blues\tBLUEBIRD\t5001\t74805\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU5001.mp3\tAllen Brothers\tFruit Jar Blues\tBLUEBIRD\t5001\t74805\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2078.mp3\tDuke Ellington\tFrustration\tMERCURY\t2078\t2078\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYHL158.mp3\tBill Harris And His New Music\tFrustration\tKEYNOTE\t634\tHL158\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63158.mp3\tEdgar Hayes & His Orchestra\tFugitive From A Harem\tDECCA\t1748B\t63158\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28967.mp3\tGene Krupa & His Orch\tFull Dress Hop\tOKEH\t6009\t28967\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKECO32603-1.mp3\tBenny Goodman And His Orchestra\tFull Moon\tOKEH\t6652\tCO32603-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_171.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tFull Moon\tDECCA\t4312A\t70481\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_235.mp3\tBenny Goodman And His Orchestra Feat. Peggy Lee\tFull Moon (noche De Luna)\tOKEH\t6652\tCO32603-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_227.mp3\tFrank Sinatra\tFull Moon And Empty Arms\tCOLUMBIA\t36947\tCO35441\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/MER332-1.mp3\tErroll Garner Trio\tFull Moon And Empty Arms\tMERCURY\t1033\t332-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/STAT-2008-A.mp3\tHenri Ren And His Accordion\tFull Moon On The Lake\tStandard\tT-2008-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2463.mp3\tGene Krupa & His Orch\tFun And Fancy Free\tCOLUMBIA\t37875\tHCO2463\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15464A.mp3\tLeo Reisman And His Orch (vha)\tFun To Be Fooled\tBRUNSWICK\t6942\t15464A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64223.mp3\tMills Brothers\tFuniculi, Funicula\tDECCA\t2029B\t64223\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_230.mp3\tNat ''king'' Cole Feat. Pete Rugolo's Orchestra\tFunny (not Much)\tCAPITOL\t2130\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_156.mp3\tVictor Arden - Phil Ohman Orchestra Feat. V/johnny Marvin\tFunny Face\tVICTOR\t21114\t41151\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBluB-6588.mp3\tVictoria Spivey\tFunny Feathers Blues\tBluebird\tB-6588\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic55853-2.mp3\tHerny ''red'' Allen And His New York Orchestra\tFunny Feathers Blues\tVictor\tV-38088\t55853-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_230.mp3\tTony Bennett With Percy Faith And His Orch.\tFunny Thing\tCOLUMBIA\t40376\tRHCO33236\t1954\t\nhttp://www.jazz-on-line.com/a/mp3d/BLUDSVB-36-1A.mp3\tEarl Hines & His Orchestra\tFurlough Blues\tBLUEBIRD\tAXM2-5508\tDSVB-36-1A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/BluD5VB-36-1A.mp3\tEarl Hines And His Orchestra\tFurlough Blues\tBluebird\tAXM2-5508\tD5VB-36-1A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_341.mp3\tGordon Jenkins And His Orchestra\tFury\tDECCA\t28806\t84890\t1953\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC90928-A.mp3\tOriginal St. Louis Crackerjacks\tFussin'\tDECCA\t7248B\t90928-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC59643-1.mp3\tJelly Roll Morton Peppers\tFussy Mabel\tVICTOR\t38125\t59643-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB655.mp3\tCount Basie & His Orchestra\tFutile Frustration\tRCA\t20-2529\tD7VB655\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic57566-1.mp3\tWilton Crawley And His Orchestra\tFuturistic Blues\tVictor\tV-38136\t57566-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban10628-2.mp3\tBlue Ribbon Boys\tFuturistic Jungleism - V G M\tBanner\t31140\t10628-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE29319.mp3\tLouisiana Rhythm Kings\tFuturistic Rhythm\tVOCALION\t15779\tE29319\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-29319.mp3\tLouisiana Rhythm Kings\tFuturistic Rhythm\tVocalion\t15779\tE-29319\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVU1331.mp3\tGene Ammons\tFuzzy\tSAVOY\t4529\tU1331\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64820.mp3\tThree Peppers\tFuzzy Wuzzy\tDECCA\t2239A\t64820\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO29901-A.mp3\tHorace Heidt And Musical Knights\tG'bye Now\tCOLUMBIA\t36026\tCO29901-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_080.mp3\tWoody Herman And His Orchestra\tG'bye Now\tDECCA\t3745A\t68983\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE30426.mp3\tCootie Williams Rug Cutters\tG-men\tOKEH\t6370\t30426\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D183-Aa.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tG. I. Jive\tV-Disc\t183-A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu10391.mp3\tEarl Hines & His Orchestra\tG. T. Stomp\tBluebird\t10391\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC8659x.mp3\tLouis Jordan Tympani 5\tG.i Jive\tDECCA\t8659\t-\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_014.mp3\tLouis Jordan And His Tympany Five\tG.i. Jive\tDECCA\t8659\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_114.mp3\tJohnny Mercer\tG.i. Jive\tCapitol\t141\t80A-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D118.mp3\tCount Basie & His Orch\tG.i. Stomp\tV-DISC\t034\t118\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038256.mp3\tEarl Hines & His Orch\tG.t.stomp\tBLUEBIRD\t10391\t038256\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/OKECO48459.mp3\tBig Maybelle\tGabbin' Blues\tOKEH\t6931\tCO48459\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047280-1.mp3\tErskine Hawkins & His Orch\tGabriel Meets The Duke\tBLUEBIRD\t10671\t047280-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-10-1.mp3\tPhilippe Brun And His Swing Band (with Django Reinhardt)\tGabriel's Swing\tSWING\t26\tOSW-10-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/PatOSW-356-1.mp3\tDjango Reinhardt Et Son Orchestre\tGaiement\tPath\tC054-16O14\tOSW-356-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/MERAP3197.mp3\tCharlie Barnet And His Orchestra\tGal From Joe's\tMERCURY\t8979\tAP3197\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_206.mp3\tCharlie Barnet And His Orchestra\tGal From Joe's\tAPOLLO\t1106\tAP3197\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/PARP2622-1.mp3\tLovie Austin Blue Serenaders\tGalion Stomp\tPARAMOUNT\t12380B\tP2622-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4583.mp3\tBing Crosby - Victor Young\tGalway Bay\tDECCA\t24295\tL4583\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC15063B.mp3\tStan Kenton Orch.\tGambler's Blues\tDECCA\t15063B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_344.mp3\tJim Lowe\tGambler's Guitar\tMERCURY\t70163\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70167x.mp3\tRusty Draper\tGambler's Guitar\tMERCURY\t70167\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_045.mp3\tRusty Draper Feat. David Carroll (director)\tGambler's Guitar\tMERCURY\t70167\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEWC3108-A.mp3\tChampion Jack Dupree\tGamblin' Man Blues\tOKEH\t5769\tWC3108-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU58971.mp3\tJimmie Rodgers\tGambling Bar Room Blues\tBLUEBIRD\t5037\t58971\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64313-1.mp3\tJelly Roll Morton Hot Peppers\tGambling Jack\tVICTOR\t23307\t64313-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic64313-1.mp3\tJelly-roll Morton And His Red Hot Peppers\tGambling Jack\tVictor\t23307\t64313-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC69439-2.mp3\tJimmie Rodgers\tGambling Polka Dot Blues\tVICTOR\t23636\t69439-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10111.mp3\tFrankie Laine - Paul Weston\tGandy Dancer's Ball\tCOLUMBIA\t39665\tHCO10111\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU040053.mp3\tCats And The Fiddle\tGang Busters\tBLUEBIRD\t8248\t040053\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035036.mp3\tBunny Berigan & His Orch\tGangbuster's Holiday\tVICTOR\t26338A\t035036\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MANS1285.mp3\tLuis Russell & His Orchestra\tGarbage Man Blues\tMANOR\t1284\tS1285\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99036.mp3\tFats Waller And His Rhythm\tGarbo Green\tVICTOR\t25281\t99036\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60406.mp3\tBob Howard & His Orch\tGarbo Green\tDECCA\t722B\t60406\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_089.mp3\tJoe Valino\tGarden Of Eden\tVik\t0226\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23293-2.mp3\tRed Norvo & His Orchestra\tGarden Of The Moon (v M B)\tCBS\tBR8202\t23293-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_249.mp3\tReginald Foresythe And His Orchestra\tGarden Of Weed\tColumbia\t3000\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/MER20234.mp3\tJay Mcshann's Sextet\tGarfield Avenue Blues\tMERCURY\t8002\t20234\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_101.mp3\tEnrico Caruso\tGaribaldi's Hymn\tVICTOR\t87297\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D31A.mp3\tArturo Toscanini & The Nbc Symphony\tGaribaldi's War Hymn\tv-disk\t31A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK9053.mp3\tErroll Garner\tGarner In Hollywood\tKING\t4477\tK9053\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/SIG117.mp3\tErrol Garner At The Piano\tGaslight\tSIGNATURE\t15135A\t117\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/BluBLP5016y.mp3\tErroll Garner\tGaslight\tBlue Note\tBLP5016\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI3897.mp3\tBilly Murray\tGasoline Gus And His Jitney Bus\tEDISON\t50266\t3897\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142427-1.mp3\tNew Orleans Wanderers\tGate Mouth\tCOLUMBIA\t698 D\tW142427-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S190.mp3\tLionel Hampton & His Orchestra\tGates Steps Out\tMGM\t11371\t51S190\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-190.mp3\tLionel Hampton And His Orchestra\tGates Steps Out\tMGM\t11371\t51-S-190\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14079-1.mp3\tJoe Venuti & His Orchestra\tGather Lip Rouge While You May (v D E)\tBANNER\t32872\t14079-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL17491-2.mp3\tCarter Family\tGathering Flowers From The Hillside\tCOLUMBIA\t37636\t17491-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU040477.mp3\tEarl Hines Orch\tGator Swing\tBLUEBIRD\t10763\t040477\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/MER2554-1.mp3\tCootie Williams & His Orch\tGator Tail Part 1\tMERCURY\t8131\t2554-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/MER2555-1.mp3\tCootie Williams & His Orch\tGator Tail Part 2\tMERCURY\t8131\t2555-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/OKeC0783-2.mp3\tMemphis Jug Band\tGator Wobble\tOKeh\t8958\tC0783-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW149067-3.mp3\tPaul Whiteman And His Orchestra (bing Crosby Solo)\tGay Love\tColumbia\t2001 D\tW149067-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW149067-3.mp3\tBing Crosby W Paul Whiteman\tGay Love (vbc)\tCOLUMBIA\t2001 D\tW149067-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Cor73326.mp3\tLionel Hampton And His Orchestra\tGay Notes\tCoral\t6.21886\t73326\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP124.mp3\tKing Cole Trio\tGee Baby Ain't I Good To You\tCAPITOL\t169\t124\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D339A2.mp3\tKing Cole Trio\tGee Baby Ain't I Good To You\tV-DISC\t339A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC57065-1.mp3\tMckinney's Cotton Pickers\tGee Baby, Ain't I Good To You\tVICTOR\t38097\t57065-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D124.mp3\tNat King Cole Qt\tGee Baby, Ain't I Good To You\tV-DISC\t339\t124\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D733.mp3\tCount Basie & His Orch\tGee Baby, Ain't I Good To You (vjr)\tV-DISC\t552\t733\t1944\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480507.mp3\tBen Webster And Harry Sweets Edison\tGee Baby, Aint I Good To You?\tVerve\tMGV8211\t20726-6\t1957\tBen Webster, Ts, Harry Sweets Edison, T, Oscar Peterson, P, Barney Kessel, G, Ray Brown, B, Alvin Stoller, D\nhttp://www.jazz-on-line.com/a/mp3c/DECC92093.mp3\tVillage Boys & Dick Mcbride\tGee But I Feel Blue\tDECCA\t5857\tC92093\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80367.mp3\tBilly Jones\tGee But I Hate To Go Home\tCOLUMBIA\tA-3641\t80367\t1922\t\nhttp://www.jazz-on-line.com/a/mp3r/RiReg9322.mp3\tStellar Saxophone Sextette\tGee But I Hate To Go Home Alone\tRegal\t9322\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/VICB9709-3.mp3\tBilly Murray\tGee But It's Great To Meet A Friend From Home\tVICTOR\t16897B\tB9709-3\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_152.mp3\tPat Boone\tGee Whittakers!\tDot\t15435\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_230.mp3\tBenny Goodman And His Orchestra Feat. Helen Ward\tGee! But You're Swell\tVICTOR\t25486\t03550-1\t1936\tIrving Goodman, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Murray McEachern (tb), Benny Goodman (cl), Hymie Schertzer, Bill DePew (as), Arthur Rollini, Vido Musso (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1944_193.mp3\tKing Cole Trio\tGee, Baby, Ain't I Good To You?\tCAPITOL\t169\t124\t1944\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD8VB3456.mp3\tRose Murphy (the Chee-chee Girl)\tGee, I Wonder What The Trouble Can Be\tVictor\t20-3409-B\tD8VB3456\t1948\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU014310-1.mp3\tTed Mays And His Band\tGee, It Must Be Love\tBLUEBIRD\t7193B\t014310-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic40097-1.mp3\tThomas Waller With Morris's Not Babies\tGeechee\tVictor\t21358\t40097-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE29868.mp3\tCab Calloway & His Orch\tGeechy Joe\tOKEH\t6147\t29868\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_027.mp3\tBing Crosby And Boswell Sisters And Mills Brothers Feat. Victor Young's Orchestra\tGems From George White's Scandals\tBRUNSWICK\t20102\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO37354.mp3\tGene Krupa & His Orch\tGene's Boogie\tCOLUMBIA\t37589\tCO37354\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC11843-1.mp3\tArthur Pryor's Band\tGeneral Mixup U.s.a March\tVICTOR\t17142\t11843-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC36700.mp3\tArthur Pryor's Band\tGeneral Pershing March\tVICTOR\t20303A\t36700\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS6070-1.mp3\tSarah Vaughn W-jimmy Jones Qua\tGentleman Friend\tMUSICRAFT\t539\t6070-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/EDI11092.mp3\tBilly Jones & Ernie Hare\tGentlemen Prefer Blondes\tEDISON\t51802L\t11092\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_072.mp3\tBilly Jones And Ernest Hare\tGentlemen Prefer Blondes\tEDISON\t51802L\t11092\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80428-2.mp3\tTed Lewis & His Jazz Band\tGeorgette\tCOLUMBIA\tA-3662\t80428-2\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC26321-4.mp3\tPaul Whiteman And His Orch\tGeorgia\tVICTOR\t18899B\t26321-4\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC26127.mp3\tPeerless Qt\tGeorgia\tVICTOR\t18876\t26127\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5275.mp3\tSidney Bechet - Lytleton Band\tGeorgia\tSAVOY\t746\tS5275\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99363.mp3\tBoots And His Buddies\tGeorgia\tBLUEBIRD\t6301\t99363\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU7511.mp3\tCarl Fenton And His Orch\tGeorgia\tBRUNSWICK\t2259\t7511\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_078.mp3\tCarl Fenton And His Orchestra\tGeorgia\tBRUNSWICK\t2259\t7511\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_123.mp3\tEthel Waters\tGeorgia Blues\tCOLUMBIA\t14565 D\tW148734-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2915.mp3\tCurly Williams Ga.peachpickers\tGeorgia Boogie\tCOLUMBIA\t20443\tHCO2915\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/PARG15466.mp3\tBlind Blake\tGeorgia Bound\tPARAMOUNT\t12824B\tG15466\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC067793-1.mp3\tBechet New Orleans Feetwarmers\tGeorgia Cabin\tVICTOR\t27904B\t067793-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70519-A.mp3\tArt Hodes & His Orchestra\tGeorgia Cake Walk\tDECCA\t18437A\t70519-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe09533-A.mp3\tLouis Armstrong's Hot Five\tGeorgia Grind\tOKeh\t8318\t09533-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/COM29054.mp3\tEddie Condon & His Band\tGeorgia Grind\tCOMMODORE\t536\t29054\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65436.mp3\tBlue Lu Barker & Fly Cats\tGeorgia Grind\tDECCA\t7588\t65436\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/Pat106729.mp3\tDuke Ellington's Washingtonians\tGeorgia Grind\tPathe Actuelle\t7504\t106729\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36047-3.mp3\tThomas Morris & Hot Babies\tGeorgia Grind (s. Williams)\tVICTOR\t20180\t36047-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE80586.mp3\tCofer Bros\tGeorgia Hobo\tOKEH\t45099\t80586\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC83699-1.mp3\tFats Waller And His Rhythm\tGeorgia May\tVICTOR\t24714\t83699-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic83699-1.mp3\tFats Waller And His Rhythm\tGeorgia May\tVictor\t24714\t83699-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU70624-1.mp3\tMildred Bailey W Matty Malneck\tGeorgia On My Mind\tBLUEBIRD\t6945\t70624-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC63653-1.mp3\tHoagy Carmichael And His Orch\tGeorgia On My Mind\tVICTOR\t23013\t63653-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe405063-C.mp3\tLouis Armstrong & His Orch\tGeorgia On My Mind\tOKeh\t41541\t405063-C\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2740-1.mp3\tFrankie Laine W Carl Fischer\tGeorgia On My Mind\tMERCURY\t5293\t2740-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29988.mp3\tBillie Holiday\tGeorgia On My Mind\tOKEH\t6134\t29988\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC062768.mp3\tArtie Shaw And His Orchestra\tGeorgia On My Mind\tVICTOR\t27499\t062768-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC063887-1.mp3\tFats Waller (piano Solo)\tGeorgia On My Mind\tVICTOR\t27765\t063887-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU70534-1.mp3\tWashboard Rhythm Kings\tGeorgia On My Mind\tBLUEBIRD\t6150\t70534-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1092-1.mp3\tDjango Reinhardt\tGeorgia On My Mind\tGramophone\tK-7890\tOLA-1092-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_218.mp3\tMildred Bailey Feat. Matt Malneck's Orchestra\tGeorgia On My Mind\tVICTOR\t22891\t70624-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481102.mp3\tGene Krupa Orch. Feat. Anita O'day\tGeorgia On My Mind\tOkeh\t6118\t29922-1\t1941\tTorg Halten, Shorty Sherock, Norman Murphy, Graham Young (tp), Pat Virgademo, Jay Kelliher, Babe Wagner (tb), Clint Neagley, Mascagni ''Musky'' Ruffo (as), Walter Bates (ts), Sam Musiker (cl,ts), Bob Kitsis (p), Ray Biondi (g), Ovid ''Biddy'' Bastien (sb), Gene Krupa (dm), Leroy Elton Hill (arr)\nhttp://www.jazz-on-line.com/a/mp3c/CON29922-1.mp3\tGene Krupa & His Orch\tGeorgia On My Mind (v A. O'day)\tCONQUEROR\t9616\t29922-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC7879.mp3\tFrankie Trumbauer & His Orch\tGeorgia On My Mind (va.jarrett)\tBRUNSWICK\t6159\tC7879\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC56787-1.mp3\tNat Shilkret & His Orch\tGeorgia Pines (vjm)\tVICTOR\t22195\t56787-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU92918.mp3\tFats Waller And His Rhythm\tGeorgia Rockin' Chair\tBLUEBIRD\t10288\t92918\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCB-14275.mp3\tCalifornian Ramblers\tGeorgia Rose\tVocalion\tB-14275\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC25770.mp3\tSterling Trio\tGeorgia Rose\tVICTOR\t18837\t25770\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_153.mp3\tSterling Trio\tGeorgia Rose\tVICTOR\t18837\t25770\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU45619-2.mp3\tJelly Roll Morton\tGeorgia Swing\tBLUEBIRD\t5109B\t45619-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic45619-2.mp3\tJelly-roll Morton's Red Hot Peppers\tGeorgia Swing\tVictor\tV-38024\t45619-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU82672-1.mp3\tGid Tanner & Skillet Lickers\tGeorgia Waggoner\tBLUEBIRD\t5433\t82672-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC15914-1.mp3\tIna Ray Hutton And Her Melodears\tGeorgia's Gorgeous Gal\tVOCALION\t2801\t15914-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR141838-3.mp3\tUniversity Six\tGeorgianna\tHARMONY\t155-H\t141838-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiMad1611g.mp3\tHarry Carpenter\tGet Away, Old Man, Get Away\tMadison\t1611\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152717.mp3\tBenny Morton & His Orch\tGet Goin'\tCOLUMBIA\t2902 D\tW152717\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62922-2.mp3\tBennie Moten Kansas City Orch\tGet Going\tVICTOR\t23023\t62922-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149999.mp3\tTed Wallace And His Campus Boys\tGet Happy\tCOLUMBIA\t2140 D\tW149999\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWCO26181.mp3\tRaymond Scott And His New Orch\tGet Happy\tCOLUMBIA\t37359\tWCO26181\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC62263-2.mp3\tHigh Hatters (shilkret)\tGet Happy\tVICTOR\t22444\t62263-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC100057.mp3\tBenny Goodman And His Orchestra\tGet Happy\tVICTOR\t25279\t100057\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA1035GH.mp3\tRed Norvo's Allstars\tGet Happy\tDIAL\t1035\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/SIGT1924-2.mp3\tColeman Hawkins Swing 4\tGet Happy\tSIGNATURE\t28104A\tT1924-2\t1943\t\nhttp://www.jazz-on-line.com/a/mp3h/CHAG16594.mp3\tBert Stock And His Orchestra\tGet Happy\tCHAMPION\t16018\tG16594\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1939.mp3\tArt Tatum\tGet Happy\tDECCA\t25200\tDLA1939\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_066.mp3\tNat Shilkret And The Victor Orchestra\tGet Happy\tVICTOR\t22444\t62263-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe404009-D.mp3\tFrankie Trumbauer & His Orch\tGet Happy (v F T)\tOKeh\t41431\t404009-D\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Har141422-1.mp3\tThe Dixie Stompers\tGet It Fixed\tHarmony\t88-H\t141422-1  \t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe73838-B.mp3\tClarence Williams Blue Five\tGet It Fixed (v E T)\tOKeh\t8267\t73838-B\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC42933-1.mp3\tBennie Moten Kansas City Orch\tGet Low Down Blues\tVICTOR\t21693\t42933-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70994-A.mp3\tJay Mcshann & His Orchestra\tGet Me On Your Mind\tDECCA\t4418\t70994-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_116.mp3\tJay Mcshann And His Orchestra\tGet Me On Your Mind\tDECCA\t4418\t70994-A\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_469.mp3\tJulius Larosa\tGet Me To The Church On Time\tRCA\t6567\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC69361-1.mp3\tJimmie Davis\tGet On Board Aunt Susan\tVICTOR\t23620\t69361-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC45880-3.mp3\tHelen Kane\tGet Out And Get Under The Moon\tVICTOR\t21557\t45880-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/COLW146319-3.mp3\tPaul Whiteman And His Orchestra, Vocals By Bing Crosby, Jack Fulton, Charles Gaylord, And Austin You\tGet Out And Get Under The Moon\tCOLUMBIA\t1402 D\tW146319-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_072.mp3\tHelen Kane\tGet Out And Get Under The Moon\tVICTOR\t21557\t45880-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC43699-3.mp3\tNat Shilkret & Victor Orch\tGet Out And Get Under The Moon (vjm+fb)\tVICTOR\t21432A\t43699-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5542.mp3\tArtie Shaw And His Orchestra\tGet Out Of Town\tMUSICRAFT\t389\t5542\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_093.mp3\tEddy Duchin And His Orchestra\tGet Out Of Town\tBRUNSWICK\t8252\t23621\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC964.mp3\tFreddy Martin And His Orch\tGet Rhythm In Your Feet\tBRUNSWICK\t7447\tC964\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73161.mp3\tJubilaires W Andy Kirk Orch.\tGet Together With The Lord\tDECCA\t18782A\t73161\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73161.mp3\tAndy Kirk And His Orchestra And The Jubalaires\tGet Together With The Lord\tDecca\t18782\t73161\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79164-2.mp3\tBert Williams\tGet Up\tCOLUMBIA\tA-3305\t79164-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_448.mp3\tJaye P. Morgan\tGet Up! Get Up! (you Sleepyhead)\tRCA\t6441\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67589.mp3\tWoody Herman & His Orchestra\tGet You Boots Laced, Papa Part 1\tDECCA\t3187A\t67589\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67590.mp3\tWoody Herman & His Orchestra\tGet You Boots Laced, Papa Part 2\tDECCA\t3187B\t67590\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_149.mp3\tKing Cole Trio\tGet Your Kicks On Route 66\tCAPITOL\t256\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13308-A.mp3\tDuke Ellington & His Orch\tGet Yourself A New Broom (and Sweep The Blues Away\tBRUNSWICK\t6607\t13308-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN2025K.mp3\tHank Penny\tGet Yourself A Red Head\tKING\t508B\t2025 K\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053111.mp3\tLonnie Johnson (guitar)\tGet Yourself Together\tBLUEBIRD\t8530\t053111\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/BruC-6017.mp3\tSeven Little Clouds Of Joy With >andy Kirk\tGettin' Off A Mess\tBrunswick\t7180\tC-6017\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC54848-1.mp3\tPaul Howard Quality Serenaders\tGettin' Ready Blues\tVICTOR\t23420\t54848-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC49447-2.mp3\tMemphis Stompers\tGettin' The Bird\tVICTOR\t23371\t49447-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030454.mp3\tMezz Mezzrow And His Orch\tGettin' Together\tBLUEBIRD\t10088\t030454\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu030454-2.mp3\tMezz Mezzrow - Ladnier Quintet\tGettin' Together\tBluebird\tB-10088\t030454-2  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS21686-1.mp3\tBillie Holiday\tGetting Some Fun Out Of Life\tCBS\tVO3701\t21686-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014668-2.mp3\tTommy Dorsey & His Orch\tGetting Some Fun Out Of Life\tVICTOR\t25694\t014668-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_164.mp3\tBillie Holiday\tGetting Some Fun Out Of Life\tCBS\tVO3701\t21686-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5455.mp3\tLester Young Quintet\tGhost Of A Chance\tSAVOY\t535\tS5455\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DiaD-1141-E.mp3\tDexter Gordon\tGhost Of A Chance\tDial\t1018\tD-1141-E\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64696.mp3\tAndy Kirk & Clouds Of Joy\tGhost Of Love\tDECCA\t2226A\t64696\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64696-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tGhost Of Love\tDecca\t2226\t64696-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/EME42587-2.mp3\tFletcher Henderson & His Orch\tGhost Of The Blues\tEMERSON\t10744\t42587-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN15573-1.mp3\tLuis Russell & His Orchestra\tGhost Of The Freaks (v Palmer Bros)\tBANNER\t33367\t15573-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE26572.mp3\tBillie Holiday\tGhost Of Yesterday\tOKEH\t5609\t26572\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_178.mp3\tDon Cherry\tGhost Town\tColumbia\t40705\tCO54439\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_413.mp3\tArt Mooney\tGiant\tMGM\t12320\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_476.mp3\tJack Pleis And His Orchestra\tGiant\tDecca\t30055\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_346.mp3\tLes Baxter And His Orchestra\tGiant\tCapitol\t3526\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM56S588.mp3\tArt Mooney And His Orch; Chorus\tGiant. (from George Stevens' Giant)\tMGM\t12320\t56S588\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3558.mp3\tChampion Jack Dupree\tGibing Blues\tOKEH\t6104\tC3558\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149282-1.mp3\tGid Tanner's Skillet Lickers\tGiddap Napoleon\tCOLUMBIA\t15695 D\tW149282-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4530.mp3\tLionel Hampton & His Orch\tGiddy Up\tDECCA\t24281\tL4530\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_251.mp3\tLes Baxter And His Orchestra\tGigi\tCapitol\t2479\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU020158-1.mp3\tBill \"jazz\" Gillum\tGillums Windy Blues\tBLUEBIRD\t7563\t020158-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_126.mp3\tFour Lads Feat. Norman Leyden's Orchestra\tGilly, Gilly, Ossenfeffer, Katzenellen Bogen By The Sea\tCOLUMBIA\t40236\tCO51006\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC34683-3.mp3\tJack Smith (whispering Piano)\tGimme A Little Kiss, Will Ya Huh?\tVICTOR\t19978\t34683-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC34798-1.mp3\tJean Goldkette & His Orch\tGimme A Little Kiss, Will Ya, Huh ?\tVICTOR\t20031A\t34798-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152578-2.mp3\tBessie Smith\tGimme A Pigfoot\tCOLUMBIA\t37574\tW152578-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75242.mp3\tBillie Holiday\tGimme A Pigfoot\tDECCA\t24947\t75242\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142853-1.mp3\tDixie Washboard Band (cw)\tGimme The Blues\tCOLUMBIA\t14188 D\tW142853-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1679.mp3\tGene Krupa & His Orch\tGimme' A Little Kiss\tCOLUMBIA\t36954\tHCO1679\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VocS-140-2.mp3\tBenny Carter And His Orchestra\tGin And Jive\tVocalion\tS-57\tS-140-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/AceS-118-1.mp3\tBenny Carter And His Orchestra\tGin And Jive\tAce Of Hearts\t1167\tS-118-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC043250-1.mp3\tLionel Hampton & His Orch\tGin For Christmas\tVICTOR\t26423B\t043250-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic043250-1.mp3\tLionel Hampton And His Orchestra\tGin For Christmas\tVictor\t26423\t043250-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CONDAL650-1.mp3\tLight Crust Doughboys\tGin Mill Blues\tCONQUEROR\t9254\tDAL650-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COL265140-2.mp3\tJoe Sullivan\tGin Mill Blues\tCOLUMBIA\t2876 D\t265140-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC61590.mp3\tBob Crosby & His Orchestra\tGin Mill Blues\tDECCA\t3382A\t61590\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-3187-A.mp3\tHorace Henderson And His Orchestra\tGinger Bells\tOKEH\t5978\tWC-3187-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA228.mp3\tAndy Iona & His Islanders\tGinger Lei\tCOLUMBIA\t2967 D\tLA228\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4459.mp3\tFrankie Laine\tGirl In The Woods\tCOLUMBIA\t39799\tHCO4459\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38618.mp3\tBuddy Clark\tGirl Of My Dreams\tCOLUMBIA\t38489\tCO38618\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC42585-3.mp3\tGene Austin\tGirl Of My Dreams\tVICTOR\t21334B\t42585-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM572-1.mp3\tBilly Kyle Swing Club Band\tGirl Of My Dreams\tVARIETY\tI659\tM572-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1768.mp3\tBing Crosby - J.s.trotter Orch\tGirl Of My Dreams\tDECCA\t2671B\tDLA1768\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66437.mp3\tRice Brothers Gang\tGirl Of My Dreams\tDECCA\t5893\t66437\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_012.mp3\tGene Austin Feat. Nat Shilkret And His Orchestra\tGirl Of My Dreams\tVICTOR\t21334B\t42585-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478330.mp3\tLes Brown And His Band Of Renown\tGirl Of My Dreams\tCAPITOL\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480844.mp3\tLes Brown And His Band Of Renown\tGirl Of My Dreams\tCAPITOL\tT657\t20843\t1955\tRay Sims (tb, vo), Wes Hensel, Don Paladino, Stan Stout, Don Fagerquist (tp), Vernon Friley, Bob Pring (tb), Stumpy Brown (b-tb), Les Brown, Sol Libero (cl,as), Ronnie Lang (as,fl), Dave Pell (ts,cl), Abe Aaron (ts,cl,ss,bar), Butch Stone (bar,cl), Donn Trenner (p), Vernon Polk (g), Buddy Clark (sb), Bill Richmond (dm)\nhttp://www.jazz-on-line.com/a/mp3c/BLU036487.mp3\tCharlie Barnet & His Orch\tGirl With The Pigtails In Her Hair\tBLUEBIRD\t10439\t036487\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/ARC10194-3.mp3\tMckenzie's Mound City Blue Blowers\tGirls Like You Were Meant For Boys Like Me\tARC\t\t10194-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD8VB3453.mp3\tRose Murphy (the Chee-chee Girl)\tGirls Were Made To Take Care Of Boys\tVictor\t20-3341-A\tD8VB3453\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74651.mp3\tBillie Holiday & Stardusters\tGirls Were Meant To Take Care Of Boys\tDECCA\t24551\t74651\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60861-B.mp3\tAndy Kirk & Clouds Of Joy\tGit\tDECCA\t931B\t60861-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60861-B.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tGit\tDecca\t931\t60861-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12627.mp3\tMills Brothers\tGit Along\tBRUNSWICK\t6430\t12627\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban12339-A.mp3\tCab Calloway And His Orchestra\tGit Along\tBanner\t32563\t12339-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69732.mp3\tSkeets Tolbert Gentlemen Swing\tGit It\tDECCA\t8589\t69732\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec69732-A.mp3\tBabe Wallace With Skeets Tolbert And His Gentlemen Of Swing\tGit It ('cause I Love To See You Wid It)\tDecca\t8589\t69732-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67152.mp3\tWoody Herman & His Orchestra\tGive A Little Whistle\tDECCA\t3008A\t67152\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_244.mp3\tCliff Edwards\tGive A Little Whistle\tDECCA\t29487\tL8219\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046431.mp3\tGlenn Miller & His Orch\tGive A Little Whistle (vmh)\tBLUEBIRD\t10580\t046431\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC81289.mp3\tElla Fitzgerald\tGive A Little, Get A Little\tDECCA\t27724\t81289\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61003-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tGive Her A Pint (and She'll Tell It All)\tDecca\t853\t61003-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/CONC3355-1.mp3\tCarter Family\tGive Him One More As He Goes\tCONQUEROR\t9664\tC3355-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60076-A.mp3\tBob Howard & His Orch\tGive Me A Break, Baby\tDECCA\t627A\t60076-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_1209_02.mp3\tLee Morse And Her Bluegrass Boys\tGive Me A Good-night Kiss\tColumbia\t1276DB\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA184.mp3\tBing Crosby W I.aaronson Orch\tGive Me A Heart To Sing To\tBRUNSWICK\t6953\tLA184\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA184-A.mp3\tIrving Aaronson And His Commanders With Bing Crosby\tGive Me A Heart To Sing To\tColumbia\tD01284\tLA184-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA184-B.mp3\tIrving Aaronson And His Commanders With Bing Crosby\tGive Me A Heart To Sing To\tColumbia\t\tLA184-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_206.mp3\tJohnny Marvin\tGive Me A Night In June\tVICTOR\t20984A\t40132\t1928\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR142679-2.mp3\tUniversity Six\tGive Me A Ukulele\tHARMONY\t262-H\t142679-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1922.mp3\tTex Beneke & His Orch.\tGive Me Five Minutes More\tRCA\t20-1922\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_040.mp3\tTex Beneke And The Glenn Miller Orchestra\tGive Me Five Minutes More\tRCA Victor\t1922\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14159-A.mp3\tMildred Bailey\tGive Me Liberty Or Give Me Love\tBRUNSWICK\t6680\t14159-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45065.mp3\tLefty Frizzell\tGive Me More\tCOLUMBIA\t20885\tCO45065\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80042.mp3\tAl Jolson\tGive Me My Mammy\tCOLUMBIA\tA-3540\t80042\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-3540.mp3\tAl Jolson\tGive Me My Mammy\tCOLUMBIA-\tA-3540\t80042\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_012.mp3\tAl Jolson\tGive Me My Mammy\tCOLUMBIA\tA-3540\t80042\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D100B.mp3\tGladys Swarthout\tGive Me One Hour\tV-DISC\t100B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142017-2.mp3\tCelestin's Tuxedo Orch\tGive Me Some More\tCOLUMBIA\t14200 D\tW142017-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC064055.mp3\tLionel Hampton & His Orch\tGive Me Some Skin\tVICTOR\t27409\t064055\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic064055-2.mp3\tLionel Hampton And His Sextet\tGive Me Some Skin\tVictor\t27409\t064055-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COL77305-1.mp3\tSamuel Ash\tGive Me The Moonlight - Give Me The Girl\tCOLUMBIA\tA-2415\t77305-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_137.mp3\tSam Ash\tGive Me The Moonlight, Give Me The Girl (and Leave The Rest To Me)\tColumbia\t2415\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/COL77323.mp3\tSterling Trio\tGive Me The Right To Love You\tCOLUMBIA\tA-2415\t77323\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO35210-3.mp3\tBenny Goodman And His Orchestra\tGive Me The Simple Life\tCOLUMBIA\t36908\tCO35210-3\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3937.mp3\tBing Crosby & Jimmy Dorsey\tGive Me The Simple Life\tDECCA\t23469\tL3937\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_193.mp3\tBenny Goodman And His Orchestra Feat. Liza Morrow\tGive Me The Simple Life\tCOLUMBIA\t36908\tCO35210-3\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26460-C.mp3\tMildred Bailey\tGive Me The Time\tCOLUMBIA\t35626\t26460-C\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP2724.mp3\tBenny Goodman And His Orchestra\tGive Me Those Good Old Days\tCAPITOL\t\t2724\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_315.mp3\tBenny Goodman And His Orchestra Feat. The Sportsmen, V\tGive Me Those Good Old Days\tCAPITOL\t15044\t2724\t1948\tEd Kusby (tb), Benny Goodman (cl), Chuck Gentry (bsx), Red Norvo (vib), Mel Powell (p), Al Hendrickson (g), Art Shapiro (sb), Dick Cornell (dm)\nhttp://www.jazz-on-line.com/a/mp3c/COLCO37686.mp3\tCab Calloway & His Orch\tGive Me Twenty Nickels For A Dollar\tCOLUMBIA\t37500\tCO37686\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE36920.mp3\tAbe Lyman's California Orch\tGive Me Your Affection (honey)\tBRUNSWICK\t6154\tE36920\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_236.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tGive Me Your Hand\tRCA Victor\t78-3521\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC61129-B.mp3\tCarter Family\tGive Me Your Love And I'll Give You Mine\tDECCA\t5318\t61129-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403736-B.mp3\tJ.c.higginbotham Six Hicks\tGive Me Your Telephone Number\tOKeh\t8772\t403736-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_006.mp3\tBilly Murray\tGive My Regards To Broadway\tCOLUMBIA\tA-0447\t03165-2\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_207.mp3\tJoni James\tGive Us This Day\tMGM\t12288\t56S425\t1956\t\nhttp://www.jazz-on-line.com/a/mp3/Joh402.mp3\tErmine Calloway And The Seven Blue Babies\tGive Your Little Baby Lots Of Lovin'\tEdison\t52495\t18978\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh205.mp3\tErmine Calloway Acc. By The Seven Blue Babies\tGive Your Little Baby Lots Of Lovin'\tEdison\t52495\t18978\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/CONM1114-A.mp3\tCab Calloway & His Orch\tGive, Baby, Give\tCONQUEROR\t9465\tM1114-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1114-A.mp3\tCab Calloway And His Orchestra\tGive, Baby, Give\tVocalion\t5406\tWM-1114-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC1236.mp3\tMary Lou Williams & Don Byas\tGjon Mili Jam Session\tASCH\t1006\t1236\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU50528-2.mp3\tEarl Hines (piano)\tGlad Rag Doll\tBLUEBIRD\t10555\t50528-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_144.mp3\tCrazy Otto\tGlad Rag Doll\tDecca\t29403\tDGG87222\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_114.mp3\tTed Lewis And His Band\tGlad Rag Doll\tCOLUMBIA\t1709 D\tW147423-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_202.mp3\tRuth Etting\tGlad Rag Doll\tCOLUMBIA\t1733 D\tW147781\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu50528-2.mp3\tEarl Hines And His Orchestra\tGlad Rag Doll\tBluebird\tB-10555\t50528-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/CAS11y.mp3\tLee Stafford\tGladiolus Rag\tCastle\t11\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic49496-1.mp3\tThomas Waller\tGladyse\tVictor\tV-38554\t49496-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S159.mp3\tLionel Hampton & His Orchestra\tGladysee Bounce\tMGM\t11448\t51S159\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-159.mp3\tLionel Hampton And His Orchestra\tGladysee Bounce\tMGM\t11448\t51-S-159\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038140.mp3\tGlenn Miller And His Orch\tGlen Island Special\tBLUEBIRD\t10388\t038140\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_057.mp3\tPerry Como\tGlendora\tRCA Victor\t6554\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/ATLRK14.mp3\tErroll Garner Trio\tGliss In The Dark\tATLANTIC\t677\tRK14\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/AtlRK-14.mp3\tErroll Garner Trio\tGliss In The Dark\tAtlantic\t677\tRK-14\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5719.mp3\tJohnny Guarnieri Trio\tGliss Me Again\tSAVOY\t530B\tS5719\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Son1880-SB.mp3\tBenny Carter Med All-star Orchestra\tGloaming\tSonora\t3188\t1880-SB\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/MERC517.mp3\tJohnny Hodges & His Orch\tGlobe Trotter\tMERCURY\t8954\tC517\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE31005.mp3\tBillie Holiday\tGloomy Sunday\tOKEH\t6451\t31005\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC26563-B.mp3\tArtie Shaw And His Orchestra\tGloomy Sunday\tVICTOR\t26563-B\t042548-1\t1940\tDomingo Sombrio, Vocal refrain by Pauline Byrne\nhttp://www.jazz-on-line.com/a/mp3c/VIC99879.mp3\tPaul Whiteman & His Orch\tGloomy Sunday\tVICTOR\t25274\t99879\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18766-1.mp3\tHal Kemp & His Orch\tGloomy Sunday\tBRUNSWICK\t7630\t18766-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/APO4112.mp3\tLuis Russell & His Orch\tGloomy Sunday\tAPOLLO\t1071\t4112\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/GOTS1184.mp3\tDon Byas Qt\tGloomy Sunday\tGOTHAM\t131\tS1184\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic042548-1.mp3\tArtie Shaw And His Orchestra\tGloomy Sunday -v P B\tVictor\t26563\t042548-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_130.mp3\tMills Brothers\tGloria\tDECCA\t24509\t74600\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU70700.mp3\tAllen Brothers\tGlorious Night Blues\tBLUEBIRD\t6149\t70700\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU6149.mp3\tAllen Brothers\tGlorious Night Blues\tBLUEBIRD\t6149\t70700\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN17476-1.mp3\tCarter Family\tGlory To The Lamb\tBANNER\t33465\t17476-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140093-2.mp3\tFletcher Henderson's Orch\tGo 'long Mule\tCOLUMBIA\t228D\t140093-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Col140093-2.mp3\tFletcher Henderson And His Orchestra\tGo 'long, Mule\tColumbia\t\t140093-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW140790-1.mp3\tEthel Waters\tGo Back Where You Stayed Last Night\tCOLUMBIA\t14093 D\tW140790-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOEA6387-3.mp3\tFats Waller (organ)\tGo Down, Moses (v A. Hall)\tVICTOR\t27458\tOEA6387-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65969.mp3\tJimmy Dorsey & His Orch.\tGo Fly A Kite\tDECCA\t2650B\t65969\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1771.mp3\tBing Crosby - J.s.trotter Orch\tGo Fly A Kite\tDECCA\t2641B\tDLA1771\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/QRS1002B.mp3\tNew Yorkers\tGo Get 'em Caroline\tQRS\t1002B\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC61123.mp3\tChick Webb & His Orchestra\tGo Harlem\tDECCA\t995A\t61123\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150711-2.mp3\tGuy Lombardo Royal Canadians\tGo Home And Tell Your Mother\tCOLUMBIA\t2276 D\tW150711-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC61003-2.mp3\tGus Arnheim Coconut Grove Orch\tGo Home And Tell Your Mother\tVICTOR\t22505\t61003-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_029.mp3\tGus Arnheim And His Orchestra Feat. V/bobby Burns\tGo Home And Tell Your Mother\tVICTOR\t22505\t61003-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_280.mp3\tJohnny Green And His Orchestra\tGo Into Your Dance\tARC\tCO3028D\t17207-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_239.mp3\tKitty Kallen And Georgie Shaw\tGo On With The Wedding\tDecca\t29776\t88941\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_083.mp3\tPatti Page\tGo On With The Wedding\tMercury\t70766\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM617-1.mp3\tCab Calloway & His Orch\tGo South, Young Man\tVARIETY\tI644\tM617-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_086.mp3\tMary Martin And Arthur Godfrey\tGo To Sleep, Go To Sleep, Go To Sleep\tCOLUMBIA\t38744\tCO42885\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_038.mp3\tOlive Kline And Elsie Baker And Marguerite Dunlap\tGo To Sleep, My Dusky Baby\tVICTOR\t17918\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3o/RCAF2PB-1055.mp3\tRalph Flanagan & His Orch.\tGo, Moses, Go!\tRCA VICTOR\t20-6023\tF2PB-1055\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAF2PB-1055.mp3\tRalph Flanagan And His Orchestra.\tGo, Moses, Go! (from Hebrew Chant, ''let My People Go'')\tRCA VICTOR \t20-6023 \tF2PB-1055\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1278.mp3\tArnett Cobb & His Orchestra\tGo, Red, Go\tAPOLLO\t778\tR1278\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_153.mp3\tKing Sisters\tGobs Of Love\tBLUEBIRD\t11576\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_030.mp3\tJohn Mccormack\tGod Be With Our Boys Tonight\tVICTOR\t64773\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC035319.mp3\tKate Smith\tGod Bless America\tVICTOR\t26198\t035319\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1739-A.mp3\tBing Crosby - J.s.trotter\tGod Bless America\tDECCA\t2400A\tDLA1739-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_269.mp3\tKate Smith\tGod Bless America\tVICTOR\t26198\t035319\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/COL30458.mp3\tBillie Holiday\tGod Bless The Child\tCOLUMBIA\t38792\t30458\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30458.mp3\tBillie Holiday\tGod Bless The Child\tOKEH\t6270\t30458\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_319.mp3\tBillie Holiday\tGod Bless The Child\tOKEH\t6270\t30458\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC9945.mp3\tBlind Willie And Katie Mctell\tGod Don't Like It\tDECCA\t7093\tC9945\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149599-1.mp3\tBlind Willie Johnson\tGod Moves On The Water\tCOLUMBIA\t14520 D\tW149599-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA3028.mp3\tBing Crosby\tGod Rest Ye, Merry Gentlemen\tDECCA\t10089\tDLA3028\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/PARL0316.mp3\tDelta Big Four\tGod Won't Forsake His Own\tPARAMOUNT\t12987B\tL0316\t1930\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC017057.mp3\tLeo Reisman & His Orch\tGod's Country\tVICTOR\t25714\t017057\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_281.mp3\tFrank Sinatra\tGod's Country\tCOLUMBIA\t38708\tHCO3999\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_299.mp3\tVic Damone Feat. Glenn Osser's Orchestra\tGod's Country\tMERCURY\t5374\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO40482.mp3\tChubby Jackson\tGodchild\tCOLUMBIA\t38451\tCO40482\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic56125-2.mp3\tThomas Waller\tGoin' About\tVictor\t\t56125-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23891-1.mp3\tJoe Turner & Pete Johnson\tGoin' Away Blues\tCBS\tVO4607\t23891-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401450-A.mp3\tJoe Venuti's Blue Four\tGoin' Home\tOKeh\t41251\t401450-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_306.mp3\tFats Domino\tGoin' Home\tIMPERIAL\t5180\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10522.mp3\tJo Stafford\tGoin' Like Wildfire\tCOLUMBIA\t40198\tRHCO10522\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE81059-B.mp3\tJoe Venuti & Eddie Lang\tGoin' Places\tOKEH\t40825\t81059-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_201.mp3\tBetty Hutton\tGoin' Steady\tCapitol\t2522\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2740.mp3\tJoe Turner & Freddie Slack\tGoin' To Chicago Blues\tDECCA\t4093B\tDLA2740\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_312.mp3\tCount Basie And His Orchestra Feat. V/jimmy Rushing\tGoin' To Chicago Blues\tOKEH\t6244\tWC3681\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeC-3681-1.mp3\tCount Basie And His Orchestra\tGoin' To Chicago Blues\tOkeh\t6244\tC-3681-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA96-A.mp3\tGus Arnheim And His Orch\tGoin' To Heaven On A Mule\tBRUNSWICK\t6751\tLA96-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU6751.mp3\tGus Arnheim & His Orchestra\tGoin' To Heaven On A Mule\tBRUNSWICK\t6751\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_282.mp3\tFats Domino\tGoin' To The River\tImperial\t5231\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401351-E.mp3\tDuke Ellington & His Orch\tGoin' To Town\tOKeh\t8675\t401351-E\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/Oke401351-E.mp3\tDuke Ellington And His Cotton Club Orchestra\tGoin' To Town\tOkeh\t8675\t401351-E\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70196-1.mp3\tLuis Russell & His Orch\tGoin' To Town (vcb)\tVICTOR\t22789\t70196-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147565-1.mp3\tLeroy Williams\tGoing Away Blues\tCOLUMBIA\t14402 D\tW147565-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU85515.mp3\tLeroy Carr\tGoing Back Home\tBLUEBIRD\t5963\t85515\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC9300.mp3\tMississippi Mudder (mccoy)\tGoing Back Home Blues\tDECCA\t7087\tC9300\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE28516.mp3\tCab Calloway & His Orch\tGoing Conga\tOKEH\t5911\t28516\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU56313-1.mp3\tG.b.grayson And Henry Whitter\tGoing Down Lee Highway\tBLUEBIRD\t5498\t56313-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3309.mp3\tBing Crosby - John S Trotter\tGoing My Way\tDECCA\t18597A\tL3309\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D301A2.mp3\tBing Crosby\tGoing My Way\tV-DISC\t301A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_107.mp3\tBing Crosby Feat. O/john Scott Trotter And The Williams Brothers Quartet\tGoing My Way\tDECCA\t18597A\tL3309\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148202.mp3\tGid Tanner's Skillet Lickers\tGoing On Down Town\tCOLUMBIA\t15420 D\tW148202\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Col24511-1.mp3\tBasie's Bad Boys\tGoing To Chicago\tColumbia\tGG 31224\t24511-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Col24511-1.mp3\tBasie's Bad Boys\tGoing To Chicago\tColumbia\tCG 31224  \t24511-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_300.mp3\tLouis Armstrong Feat. Decca Mixed Chorus\tGoing To Shout All Over God's Heaven\tDECCA\t2085A\t63983\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/V-DJDB305.mp3\tDuke Ellington's Orch\tGolden Cress\tV-DISC\t742\tJDB305\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0200_02.mp3\tLee Morse\tGolden Dream Girl\tPathe\t032103B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15009x.mp3\tPeggy Lee\tGolden Earrings\tCAPITOL\t\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_019.mp3\tPeggy Lee\tGolden Earrings\tCapitol\t15009\t2278\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_297.mp3\tDinah Shore\tGolden Earrings\tCOLUMBIA\t37932\tHCO2583\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5823.mp3\tDuke Ellington & His Orch\tGolden Feather\tMUSICRAFT\t465\t5823\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4458.mp3\tAl Jolson\tGolden Gate\tDECCA\t24107\tL4458\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78585-2.mp3\tLewis James - Charles Harrison\tGolden Gate\tCOLUMBIA\tA-2791\t78585-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_094.mp3\tAl Jolson\tGolden Gate\tBRUNSWICK\t3775\tE26012\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_033.mp3\tCharles Harrison And Lewis James\tGolden Gate\tCOLUMBIA\tA-2791\t78585-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU011931-1.mp3\tGolden Gate Jubilee Qt\tGolden Gate Gospel Train\tBLUEBIRD\t7126\t011931-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE21845.mp3\tDykes Magic City Trio\tGolden Slippers\tBRUNSWICK\t128\tE21845\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D458GWEDD.mp3\tWoody Herman Orch\tGolden Wedding\tV-DISC\t458\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4528.mp3\tLionel Hampton & His Orch\tGoldwyn Stomp\tDECCA\t24505\tL4528\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_157.mp3\tHarry Belafonte Feat. Henri Rene Orchestra:\tGomen Nasai (forgive Me)\tRCA Victor\t5210\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_112.mp3\tRichard Bowers Feat. Tokyo Orchestra\tGomen Nasai (forgive Me)\tCOLUMBIA\t39954\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU022198.mp3\tBoots And His Buddies\tGone\tBLUEBIRD\t7596\t022198\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43234.mp3\tUna Mae Carlisle\tGone\tCOLUMBIA\t38881\tCO43234\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69680.mp3\tJimmie Lunceford & His Orch\tGone\tDECCA\t4083A\t69680\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU022198HW2-7.mp3\tBoots And His Buddies\tGone\tBLUEBIRD\t7596\t022198-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_215.mp3\tGuy Lombardo And His Royal Canadians\tGone\tVictor\t25475\t03276\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69680-A.mp3\tJimmie Lunceford And His Orchestra\tGone\tDecca\t4083\t69680-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4483.mp3\tLionel Hampton & His Orch\tGone Again\tDECCA\t24248\tL4483\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-30-I.mp3\tMezzrow - Bechet Quntet\tGone Away Blues\tKing Jazz\t140\tKJ-30- I\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic40078-2.mp3\tCarol C. Tate\tGone But Not Forgotten-florence Mills\tVictor\t21061\t40078-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/PARL1254.mp3\tSolomon Hill\tGone Dead Train (the)\tPARAMOUNT\t13129A\tL1254\t1932\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL6262.mp3\tLouis Armstrong And Bing Crosby\tGone Fishin'\tDECCA\t27623\tL6262\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_173.mp3\tBing Crosby And Louis Armstrong\tGone Fishin'\tDECCA\t27623\tL6262\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26871-B.mp3\tCount Basie And His Orchestra\tGone With ''what'' Wind\tColumbia\tC-44\t26871-B\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_280.mp3\tBenny Goodman Sextet Feat. P/count Basie\tGone With ''what'' Wind?\tCOLUMBIA\t35404\t26495\t1940\tBenny Goodman (cl), Count Basie )p), Charlie Christian (elg), Artie Bernstein (sb), Nick Fatool (dm), Lionel Hampton (vib)\nhttp://www.jazz-on-line.com/a/mp3b/MER633-1.mp3\tJay Mcshann\tGone With The Blues\tMERCURY\t8032\t633-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2257.mp3\tKing Cole Trio\tGone With The Draft\tDECCA\t8535\tDLA2257\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67094.mp3\tHot Lips Page & His Band\tGone With The Gin\tDECCA\t7714\t67094\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62822-A.mp3\tArt Tatum\tGone With The Wind\tDECCA\t1603\t62822-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21244-1.mp3\tClaude Thornhill And His Orchestra With Maxine Sullivan\tGone With The Wind\tVocalion\t3595\t21244-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480377.mp3\tArt Tatum/ben Webster Quartet\tGone With The Wind\tBarclay\t74033\t2993-1\t1956\tBen Webster (ts) Art Tatum (p) Red Callender (b) Bill Douglass (d)\nhttp://www.jazz-on-line.com/a/mp3t/TS480809.mp3\tArt Farmer Quartet\tGone With The Wind\tPrestige\tLP193\t635\t1954\tArt Farmer, T, Flh, Wynton Kelley, P, Addison Farmer, B, Herbert Lovelle, D\nhttp://www.jazz-on-line.com/a/mp3t/TS480605.mp3\tArt Tatum And Ben Webster\tGone With The Wind (alt Take 1)\tPablo\tPACD-2405-431-2\t2993-1\t1956\tBen Webster (ts) Art Tatum (p) Red Callender (b) Bill Douglass (d)\nhttp://www.jazz-on-line.com/a/mp3t/TS480583.mp3\tArt Tatum And Ben Webster\tGone With The Wind (alt Take 2)\tPablo\tPACD-2405-431-2\t2993-2\t1956\tBen Webster (ts) Art Tatum (p) Red Callender (b) Bill Douglass (d)\nhttp://www.jazz-on-line.com/a/mp3c/COL29519.mp3\tBenny Goodman Sextet\tGone With What Draft\tCOLUMBIA\t35938\t29519\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26495.mp3\tBenny Goodman Sextet\tGone With What Wind\tCOLUMBIA\t35404\t26495\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_072.mp3\tPatience And Prudence\tGonna Get Along Without Ya Now\tLiberty\t55040\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_215.mp3\tTeresa Brewer Feat. Ray Bloch's Orchestra\tGonna Get Along Without Ya Now\tCORAL\t60676\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP60980.mp3\tLeon Chappel\tGonna Turn You Loose\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLH1145-1.mp3\tGene Autry\tGonna' Build A Big Fence Around Texas\tCOLUMBIA\t37402\tH1145-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_135.mp3\tKay Starr\tGood And Lonesome\tRCA Victor\t6146\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3r/RiSweg.mp3\tCount Basie\tGood Bait\tSweet & Hot - Jazz A\t\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5551-A.mp3\tDizzy Gillespie & His Orch\tGood Dues Blues (valice Roberts)\tMUSICRAFT\t399\t5551-A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC6128.mp3\tIsham Jones And His Orch\tGood Evenin'\tBRUNSWICK\t4909\tC6128\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/COL40976GEF.mp3\tJohnnie Ray & Frankie Laine\tGood Evening Friends\tCOLUMBIA\t40976\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47455.mp3\tRosemary Clooney\tGood For Nothin'\tCOLUMBIA\t39812\tCO47455\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC030761.mp3\tBenny Goodman And His Orchestra\tGood For Nothin' But Love\tVICTOR\t26159\t030761\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031533.mp3\tFats Waller And His Rhythm\tGood For Nothin' But Love\tBLUEBIRD\t10129\t031533\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU058768.mp3\tCharlie Barnet & His Orch\tGood For Nothin' Joe\tBLUEBIRD\t11037A\t058768\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DELX2000s.mp3\tBilly Eckstine\tGood Jelly Blues\tDELUXE\tX2000\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21909-B.mp3\tHigh Hatters\tGood Little Bad Little You\tVictor\t21909-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL1000x.mp3\tThe Clovers\tGood Lovin'\tATLANTIC\t1000\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010130.mp3\tTommy Dorsey & His Orch\tGood Mornin'\tVICTOR\t25581\t010130\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_360.mp3\tFrank Dailey And His Orchestra\tGood Mornin'\tVariety\t568\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_360.mp3\tFrank Dailey And His Orchestra\tGood Mornin'\tVariety\t568\tM483-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU040684.mp3\tAbe Lyman And His Californians Vocal Rose Blaine\tGood Morning\tBLUEBIRD\t10424\t040684\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU051501.mp3\tLeadbelly (h.ledbetter)\tGood Morning Blues\tBLUEBIRD\t8791\t051501\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC62511-B.mp3\tCount Basie And His Orch\tGood Morning Blues\tDECCA\t28926\t62511-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC73300.mp3\tBillie Holiday\tGood Morning Heartache\tDECCA\t23676\t73300\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5324.mp3\tWynonie Harris\tGood Morning Mister Blues\tKING\t4210B\tK5324\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_200.mp3\tGeorgia Gibbs\tGood Morning Mr. Echo\tMercury\t5662\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1902_006.mp3\tBert Williams\tGood Morning, Carrie\tMONARCH\tV-0997\t0997\t1902\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5913.mp3\tWynonie Harris & His Allstars\tGood Morning, Mr Judge\tKING\t4852\tK5913\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW144572-3.mp3\tFred Rich And His Orch\tGood News\tCOLUMBIA\t1108 D\tW144572-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh023.mp3\tJack Hylton And His Orchestra\tGood News (v Jack Hylton Trio)\tHMV\tB-5506\tBb-14114-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC39472-1.mp3\tGeorge Olsen & His Music\tGood News (v3)\tVICTOR\t20875B\t39472-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20875-B.mp3\tGeorge Olsen And His Music\tGood News2\tVictor\t20875-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp37/DECDLA1318A.mp3\tTed Lewis And His Orchestra\tGood Night\tDECCA\t23919 A\tDLA1318A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC76422.mp3\tGordon Jenkins And Weavers\tGood Night Irene\tDECCA\t27077\t76422\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC12863-1.mp3\tBilly Murray\tGood Night Nurse\tVICTOR\t17286B\t12863-1\t1913\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVel2457.mp3\tRoy Carrol & His Sands Point Orchestra\tGood Night Sweetheart\tVelvet Tone\t2457\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_019.mp3\tHenry Burr\tGood Night, Little Girl, Good Night\tColumbia\t3330\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_191.mp3\tRuth Etting\tGood Night, Sweetheart\tColumbia\t2557\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D224B1.mp3\tSammy Kay And His Orchestra\tGood Night, Wherever You Are\tV-DISC\t224B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC90929-B.mp3\tOriginal St. Louis Crackerjacks\tGood Old Bosom Bread\tDECCA\t7235\t90929-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COMR2584.mp3\tJelly Roll Morton's Seven\tGood Old New York\tCOMMODORE\t632\tR2584\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053604-1.mp3\tJohnny Hodges & His Orch\tGood Queen Bess\tBLUEBIRD\t11117\t053604-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK5386.mp3\tWynonie Harris\tGood Rockin' Tonight\tKING\t4210\tK5386\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16587-A.mp3\tCab Calloway & His Orch\tGood Sauce From The Gravy Bowl\tBRUNSWICK\t7386\t16587-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38684-2.mp3\tRichard M Jones Jazz Wizards\tGood Stuff\tVICTOR\t20859\t38684-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9496.mp3\tJimmie Davis\tGood Time Papa Blues\tDECCA\t5032A\tC9496\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42552.mp3\tDuke Ellington & His Orch\tGood Woman Blues\tCOLUMBIA\t38702\tCO42552\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3877.mp3\tBing Crosby & Andrew Sisters\tGood, Good, Good\tDECCA\t23437\tL3877\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_073.mp3\tXavier Cugat And His Waldorf-astoria Orchestra Feat. Del Campo\tGood, Good, Good (that's You-that's You)\tCOLUMBIA\t36793\tHCO1277\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_046.mp3\tArthur Collins And Byron Harlan\tGood-a-bye, John!\tEDISON\t9463\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_300.mp3\tBenny Goodman And His Orchestra\tGood-bye\tVICTOR\t25215\t97016-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2529.mp3\tPeerless Quartette\tGood-bye Barney Boy\tColumbia\tA2529\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_013.mp3\tAmerican Quartet\tGood-bye Broadway, Hello France\tVictor\t18338\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_068.mp3\tPeerless Quartet\tGood-bye Broadway, Hello France\tColumbia\t2333\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18857.mp3\tClub Royal Orchestra\tGood-bye Shanghai\tVictor\t18857\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_011.mp3\tArthur Collins\tGood-bye, Eliza Jane\tEDISON\t8515\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_011alt.mp3\tArthur Collins\tGood-bye, Eliza Jane (copy 2)\tEDISON\t8515\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_104.mp3\tErnest Ball Feat. O/charles Prince\tGood-bye, Good Luck, God Bless You\tCOLUMBIA\tA-1978\t46365\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_002.mp3\tHenry Burr\tGood-bye, Good Luck, God Bless You (is All That I Can Say)\tVICTOR\t17984\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_037.mp3\tHenry Burr\tGood-bye, My Lady Love\tCOLUMBIA\t1815\t\t1904\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_062.mp3\tAlan Turner\tGood-bye, Sweetheart, Good-bye\tVictor\t5351\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152054.mp3\tBen Selvin & His Orch\tGood-night Moon\tCOLUMBIA\t2592 D\tW152054\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC97016-1.mp3\tBenny Goodman And His Orchestra\tGoodbye\tVICTOR\t25215\t97016-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64782.mp3\tAndy Kirk & Clouds Of Joy\tGoodbye\tDECCA\t2570B\t64782\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVB4411.mp3\tErroll Garner\tGoodbye\tSAVOY\t782\tB4411\t1949\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25215.mp3\tBenny Goodman & His Orchestra\tGoodbye\tVictor\t25215\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64782-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tGoodbye\tDecca\t2570\t64782-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN11422-A.mp3\tMills Brothers\tGoodbye Blues\tBANNER\t33212\t11422-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Col404566-A.mp3\tChocolate Dandies With Benny Carter\tGoodbye Blues\tColumbia\t35679 \t404566-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU7436x.mp3\tDelmore Brothers\tGoodbye Booze\tBLUEBIRD\t7436\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142637-1.mp3\tCharlie Poole's N.c.ramblers\tGoodbye Booze\tCOLUMBIA\t15138 D\tW142637-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20317-2.mp3\tAmerican Qt\tGoodbye Broadway, Hello France\tVICTOR\t18335\t20317-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77214.mp3\tPeerless Qt\tGoodbye Broadway, Hello France\tCOLUMBIA\tA-2333\t77214\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP2139-1.mp3\tMa Gertrude Rainey\tGoodbye Daddy Blues\tPARAMOUNT\t12290\tP2139-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78175-3.mp3\tNora Bayes\tGoodbye France\tCOLUMBIA\tA-2678\t78175-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC22437-2.mp3\tPeerless Qt\tGoodbye France (goodbye Frenchy)\tVICTOR\t18514\t22437-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2402.mp3\tBing Crosby\tGoodbye Little Darlin'\tDECCA\t18767B\tDLA2402\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_276.mp3\tGene Autry\tGoodbye Little Darlin' Goodbye\tVOCALION\t5463\tLA2175-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC70063.mp3\tDick Robertson And His Orch\tGoodbye Mama\tDECCA\t4116\t70063\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148470-1.mp3\tCharlie Poole N.c.ramblers\tGoodbye Mary Dear\tCOLUMBIA\t15456 D\tW148470-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_211.mp3\tBob Dini Feat. O/paul Werrick\tGoodbye My Love\tDerby\t833\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030854.mp3\tSonny Boy Williamson\tGoodbye Red\tBLUEBIRD\t7995\t030854\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45451-1.mp3\tIda Mae Mack\tGoodbye Rider\tVICTOR\t38030\t45451-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_189.mp3\tGeorgia Gibbs\tGoodbye To Rome (arrivederci Roma)\tMercury\t70743\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_358.mp3\tKaren Chandler Feat. O/jack Pleis\tGoodbye, Charlie, Goodbye\tCORAL\t60958\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_033.mp3\tNora Bayes\tGoodbye, France\tColumbia\t2678\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011712.mp3\tTommy Dorsey & His Orch\tGoodbye, Jonah\tVICTOR\t25648\t011712\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU055582.mp3\tGlenn Miller & His Orch\tGoodbye, Little Darlin', Goodbye\tBLUEBIRD\t10931\t055582\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_097.mp3\tPerry Como\tGoodbye, Sue\tVICTOR\t1538\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO44015.mp3\tFrank Sinatra\tGoodnight Irene\tCOLUMBIA\t38892\tCO44015\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC76422.mp3\tGordon Jenkins And The Weavers\tGoodnight Irene\tDECCA\t28272\t76422\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_288.mp3\tAlexander Brothers\tGoodnight Irene\tMERCURY\t5448\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_052.mp3\tFrank Sinatra\tGoodnight Irene\tCOLUMBIA\t38892\tCO44015\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_178.mp3\tDennis Day Feat. O/charles Dant\tGoodnight Irene\tRCA Victor\t3870\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA136-A.mp3\tNat.  W.  Finston  And  His  Paramount  Orchestra\tGoodnight Lovely Little Lady\tColumbia\tDO1183\tLA136-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA136-B.mp3\tNat.  W.  Finston  And  His  Paramount  Orchestra\tGoodnight Lovely Little Lady\tColumbia\t\tLA136-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC02463.mp3\tBenny Goodman And His Orchestra Vocal Ella Fitzgerald\tGoodnight My Love\tVICTOR\t25461\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20187-3.mp3\tHal Kemp & His Orch\tGoodnight My Love\tBRUNSWICK\t7783\t20187-3\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43826.mp3\tSarah Vaughan\tGoodnight My Love\tCOLUMBIA\t38897\tCO43826\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu6685.mp3\tShep Fields & His Rippling Rhythm Orch.\tGoodnight My Love\tBluebird\t6685\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151835-2.mp3\tGuy Lombardo Royal Canadians\tGoodnight Sweetheart\tCOLUMBIA\t2547 D\tW151835-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC67572-1.mp3\tWayne King And His Orch\tGoodnight Sweetheart\tVICTOR\t22825\t67572-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOB371.mp3\tRay Noble And His Orch\tGoodnight Sweetheart\tVICTOR\t25016\tOB371\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC70282.mp3\tRuss Columbo\tGoodnight Sweetheart\tVICTOR\t27636\t70282\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE37237-A.mp3\tVictor Young & His Orch\tGoodnight Sweetheart (v N. Lucas)\tBRUNSWICK\t6195\tE37237-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU22239-2.mp3\tArtie Shaw And His New Music\tGoodnight, Angel (v Nita Bradley)\tBRUNSWICK\t8054\tB-22239-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_268.mp3\tDinah Shore\tGoodnight, Captain Curly-head\tBLUEBIRD\t11473\t071796\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_098.mp3\tJo Stafford\tGoodnight, Irene\tCapitol\t1142\t6327\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_107.mp3\tRed Foley And Ernest Tubb Feat. The Sunshine Trio\tGoodnight, Irene\tDecca\t46255\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/CONLA136-A.mp3\tBing Crosby\tGoodnight, Lovely Little Lady\tCONQUEROR\t8370\tLA136-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_026.mp3\tBing Crosby\tGoodnight, Lovely Little Lady\tBrunswick\t6854\tLA136\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_313.mp3\tTommy Dorsey And His Orchestra Feat. V/jack Leonard\tGoodnight, My Beautiful\tVICTOR\t26335\t038189\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1202.mp3\tAlice Faye Orchestra Under Direction Of Cy Feuer\tGoodnight, My Love\tBRUNSWICK\t7821\tLA1202\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61548-A.mp3\tDick Robertson & His Orch\tGoodnight, My Love\tDECCA\t1131A\t61548-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW152133.mp3\tArt Kassell And His Orchestra\tGoodnight, My Love\tCOLUMBIA\t2636 D\tW152133\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_009.mp3\tBenny Goodman And His Orchestra Feat. Ella Fitzgerald\tGoodnight, My Love\tVICTOR\t25461\t02463\t1936\tZeke Zarchy, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Murrey McEachern (tb), Benny Goodman (cl), Hymie Schertzer, Bill De Pew (as), Arthur Rollini, Vido Musso (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3c/VIC021040.mp3\tTommy Dorsey & His Orch\tGoodnight, Sweet Dreams\tVICTOR\t25803\t021040\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22519.mp3\tEarl Hines & His Orch\tGoodnight, Sweet Dreams, Goodnight\tVOCALION\t4008\t22519\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUE37285.mp3\tBing Crosby\tGoodnight, Sweetheart\tBRUNSWICK\t6203\tE37285\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_012.mp3\tGuy Lombardo And His Royal Canadians\tGoodnight, Sweetheart\tColumbia\t2547\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478331.mp3\tLes Brown And His Band Of Renown\tGoodnight, Sweetheart\tCAPITOL\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480845.mp3\tLes Brown And His Band Of Renown\tGoodnight, Sweetheart\tCAPITOL\tT657\t29841\t1955\tWes Hensel, Don Paladino, Stan Stout, Don Fagerquist (tp), Ray Sims, Vernon Friley, Bob Pring (tb), Stumpy Brown (b-tb), Les Brown, Sol Libero (cl,as), Ronnie Lang (as,fl), Dave Pell (ts,cl), Abe Aaron (ts,cl,ss,bar), Butch Stone (bar,cl), Donn Trenner (p), Vernon Polk (g), Buddy Clark (sb), Bill Richmond (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1954_148.mp3\tSunny Gale Feat. Joe Reisman's Orchestra\tGoodnight, Sweetheart, Goodnight\tRCA\t20-5746\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_233.mp3\tTed Weems And His Orchestra\tGoody Goodbye\tDECCA\t2794A\t66717\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_125.mp3\tDolly Dawn And Her Dawn Patrol\tGoody Goodbye\tVOCALION\t5160\tWM1081\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCB.mp3\tDolly Dawn\tGoody Goodbye Shine\tVOCALION\t5160\tB\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC96569-2.mp3\tBenny Goodman And His Orchestra\tGoody Goody\tVICTOR\t25245\t96569-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18798.mp3\tWingy Manone & His Orch\tGoody Goody\tARC\tBR5034\t18798\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82322.mp3\tElla Fitzgerald\tGoody Goody\tDECCA\t28126\t82322\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_101.mp3\tBob Crosby And His Orchestra\tGoody Goody\tDECCA\t727A\t60584\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC41883-1.mp3\tMemphis Stompers\tGoofer Feather Blues\tVICTOR\t21641\t41883-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC62946-2.mp3\tWayne King And His Orch\tGoofus\tVICTOR\t22600\t62946-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU11869-A.mp3\tRed Nichols & His 5 Pennies\tGoofus\tBRUNSWICK\t6312\t11869-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6312.mp3\tRed Nichols & His 5 Pennies\tGoofus\tBrunswick\t6312\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_125.mp3\tWayne King And His Orch.\tGoofus\tVictor\t22600\t62946-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_221.mp3\tLes Paul\tGoofus\tCapitol\t1192\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh090.mp3\tJack Hylton And His Orchestra\tGoopy Geer (v Pat Omalley)\tDecca\tF-2878\tGB-3942-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR144897.mp3\tDixie Stompers\tGoose Pimples\tHARMONY\t545-H\t144897\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCC-515.mp3\tEdmonia Henderson\tGorgia Grind\tVocalion\t1043\tC-515\t1926\t\nhttp://www.jazz-on-line.com/a/mp3h/ARC11649-1.mp3\tSleepy Hall's Collegians\tGosh Darn\tARC\tPE15597\t11649-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3560.mp3\tKarl And Harty\tGospel Cannon Ball\tOKEH\t6207\tC3560\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CON17492-2.mp3\tCarter Family\tGospel Ship\tCONQUEROR\t8692\t17492-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92997-1.mp3\tFats Waller And His Rhythm\tGot A Bran' New Suit\tVICTOR\t25123\t92997-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC95381.mp3\tTommy Dorsey & His Orch\tGot A Bran' New Suit\tVICTOR\t25173\t95381\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec60024-B.mp3\tLouis Armstrong And His Orchestra\tGot A Bran' New Suit\tDecca\t579\t60024-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COL130816.mp3\tDebroy Somers Orch\tGot A Date With An Angel\tCOLUMBIA\t2663 D\t130816\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB2228.mp3\tRay Noble & His Orch\tGot A Date With An Angel\tVICTOR\t22953\tOB2228\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16284-A.mp3\tHal Kemp & His Orch\tGot A Date With An Angel\tBRUNSWICK\t7780\t16284-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUB16284-A.mp3\tHal Kemp And His Orchestra\tGot A Date With An Angel (vs.ennis)\tBRUNSWICK\t7319\tB16284-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30827.mp3\tGene Krupa & His Orch\tGot A Letter From My Kid Today\tOKEH\t6306\t30827\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Col404597-B.mp3\tChocolate Dandies With Benny Carter\tGot Another Sweetie Now\tColumbia \t36009 \t404597-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BruE-28055-A.mp3\tKing Oliver\tGot Everything (don't Want Anything But You)\tBrunswick\t4028\tE-28055-A or B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU43504-2.mp3\tDuke Ellington And His Orch\tGot Everything But You\tBLUEBIRD\t10244\t43504-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS134.mp3\tJoe Sullivan Jazz Qt\tGot It And Gone\tDISC\t6005\t134\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3456.mp3\tTed Daffan's Texans\tGot Money On My Mind\tCOLUMBIA\t20530\tHCO3456\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe82038-B.mp3\tLouis Armstrong's Hot Five\tGot No Blues\tOKeh\t8551\t82038-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU032945.mp3\tFats Waller And His Rhythm\tGot No Time\tBLUEBIRD\t10170\t032945\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC034261.mp3\tTommy Dorsey & His Orch\tGot No Time\tVICTOR\t26195\t034261\t1939\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU15353.mp3\tGene Rodemich And His Orchestra\tGot No Time\tBRUNSWICK\t2892B\t15353\t1925\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24348-A.mp3\tHarry James And His Orchestra\tGot No Time\tBrunswick\t8355\tB-24348-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE36120.mp3\tNoble Sissle's Swingsters\tGot The Bench - Got The Park (but I Haven't You)\tBRUNSWICK\t6073\tE36120\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC91344.mp3\tLonnie Johnson\tGot The Blues For The West End\tDECCA\t7445\tC91344\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN842.mp3\tHank Penny\tGot The Louisiana Blues\tKING\t842\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2948.mp3\tBing Crosby\tGot The Moon In My Pocket\tDECCA\t10016\tDLA2948\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_162.mp3\tKay Kyser And His Orchestra\tGot The Moon In My Pocket\tCOLUMBIA\t36575\tHCO680\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Col152219-1.mp3\tHarlan Lattimore And His Connie's Inn Orchestra\tGot The South In My Soul\tColumbia\t2675-D\t152219-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Mel11979-3.mp3\tDon Redman And His Orchestra\tGot The South In My Soul\tMelotone\tM-12417\t11979-3  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/V-DCO34646.mp3\tBenny Goodman And His Orchestra.\tGotta Be This Or That\tV-DISC\t513\tCO34646\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_124.mp3\tGlen Gray And Casa Loma Orchestra\tGotta Be This Or That\tDecca\t18691\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_018.mp3\tBenny Goodman And His Orchestra Feat. Benny Goodman\tGotta Be This Or That\tCOLUMBIA\t36813\tCO34646-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5287.mp3\tJoe Marsala Septet\tGotta Be This Or That (v J. M.)\tMUSICRAFT\t328\t5287\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-9-1.mp3\tPhilippe Brun And His Swing Band (with Django Reinhardt)\tGotta Date In Louisiana\tSWING\t34\tOSW-9-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401953-B.mp3\tFrankie Trumbauer & His Orch\tGotta Feelin' For You (vsb)\tOKeh\t41252\t401953-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC53914-3.mp3\tHigh Hatters (l.joy)\tGotta Feeling For You\tVICTOR\t22041B\t53914-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67098.mp3\tBob Crosby & His Orch\tGotta Get Home\tDECCA\t2991B\t67098\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU033607.mp3\tGlenn Miller & His Orch\tGotta Get Some Shut Eye\tBLUEBIRD\t10139\t033607\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU14013-4.mp3\tIsham Jones & His Orch\tGotta Getta Girl\tBRUNSWICK\t2750\t14013-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1371-1.mp3\tJulia Lee And Her Boyfriends\tGotta Gimme What'cha Got\tCAPITOL\t\t1371-1\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru12695-A.mp3\tCab Calloway And His Orchestra\tGotta Go Places And Do Things\tBrunswick\t3473\t12695-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU98650-1.mp3\tCalifornia Ramblers (wallace)\tGotta Go To Work Again\tBLUEBIRD\t6254\t98650-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99038.mp3\tTommy Dorsey & His Clambake 7\tGotta Go To Work Again\tVICTOR\t25256\t99038\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC55510-3.mp3\tCoon-sanders Nighthawk Orch\tGotta Great Big Date With A Little Bitty Girl\tVICTOR\t22123\t55510-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64460-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tGotta Pebble In My Shoe\tDecca\t2231\t64460-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VICCO34646-1.mp3\tBenny Goodman And His Orchestra\tGotta' Be This Or That, Part 1\tCOLUMBIA\t36813\tCO34646-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_128.mp3\tFour Freshmen\tGraduation Day\tCapitol\t3410\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_112.mp3\tRover Boys\tGraduation Day\tABC-Paramount\t9700\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC60300.mp3\tRed Norvo & His Orchestra\tGramercy Square\tDECCA\t691A\t60300\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74767.mp3\tSy Oliver & His Orch.\tGran'ma Plays The Numbers\tDECCA\t24594\t74767\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10395.mp3\tFrankie Laine W P.weston Orch\tGranada\tCOLUMBIA\t40136\tRHCO10395\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_232.mp3\tClark Dennis With Eddie Ballantine And His Tiffany Recording Orchestra\tGranada\tTiffany\t1302\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC72096.mp3\tPaul Whiteman & His Orch\tGrand Canyon Suite - On The Trail Part 1\tVICTOR\t36053\t72096\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU57322-2.mp3\tEarl Hines & His Orch\tGrand Piano Blues\tBLUEBIRD\t6744\t57322-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic57322-2.mp3\tEarl Hines And His Orchestra\tGrand Piano Blues\tVictor\tV-38096\t57322-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26744-B.mp3\tBenny Goodman Sextet\tGrand Slam - Boy Meets Girl\tCOLUMBIA\t35482\t26744-B\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC63271.mp3\tBob Crosby & His Orch\tGrand Terrace Rhythm\tDECCA\t1725B\t63271\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100559-1.mp3\tFletcher Henderson & His Orch\tGrand Terrace Rhythm\tVICTOR\t25339\t100559-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic100559-1.mp3\tFletcher Henderson And His Orchestra\tGrand Terrace Rhythm\tVictor\t25339\t100559-1  \t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038258.mp3\tEarl Hines And His Orch\tGrand Terrace Shuffle\tBLUEBIRD\t10351\t038258\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_055.mp3\tHaydn Quartet\tGrandfather's Clock\tVictor\t4473\tB2558\t1905\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102775.mp3\tHartman's Heartbreakers\tGrandma And Grandpaw\tBLUEBIRD\t6516\t102775\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5647.mp3\tWynonie Harris\tGrandma Plays The Numbers\tKING\t4276\tK5647\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe82001-B.mp3\tChicago Footwarmers\tGrandma's Ball\tOKeh\t8533\t82001-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG11544.mp3\tJelly Roll Morton\tGrandpa Spells\tGENNETT\t5218\tG11544\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37255-3.mp3\tJelly Roll Morton Hot Peppers\tGrandpa's Spells\tVICTOR\t20431\t37255-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe9429.mp3\tCharlie Creath Jazzomaniacs\tGrandpa's Spells\tOKeh\t8257\t9429\t1925\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO8y.mp3\tTurk Murphy's Jazz Band\tGrandpa's Spells\tGood Time Jazz\t8\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9511.mp3\tJimmie Davis\tGraveyard Blues\tDECCA\t5064B\tC9511\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/COL81237-3.mp3\tBessie Smith\tGraveyard Dream Blues\tCOLUMBIA\tA-4001\t81237-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93033-A.mp3\tJohnny Dodds & His Orchestra\tGravier Street Blues\tDECCA\t18094B\tC93033-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VocB-20860-2..mp3\tFletcher Henderson And His Orchestra\tGreat Caesar's Ghost\tVocalion\t3534\tB-20860-2.\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/New124x.mp3\tErroll Garner\tGreat Christmas (part 1)\tNew York\t124\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/New124y.mp3\tErroll Garner\tGreat Christmas - White Christmas (part 2)\tNew York\t124\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149124-3.mp3\tPaul Whiteman And His Orch\tGreat Day\tCOLUMBIA\t2023\tW149124-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW149124-3.mp3\tPaul Whiteman And His Orchestra (bing Crosby Solo And In Chorus With Al Rinker, Jack Fulton And Boyc\tGreat Day\tColumbia\t\tW149124-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh036.mp3\tThe George Evans Orchestra\tGreat Day\tDecca\tF-8448\tDR-8555-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D524.mp3\tDon Redman & His Orch\tGreat Day In The Morning (vdb)\tV-DISC\t196\t524\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_236.mp3\tRoy Acuff Smoky Mountain Boys\tGreat Speckle Bird\tVOCALION\t4252\tC1581\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC1581-1.mp3\tRoy Acuff And Smoky Mtn.boys\tGreat Speckled Bird\tCOLUMBIA\t37005\tC1581-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/CONMEM42-1.mp3\tRoy Acuff Smoky Mountain Boys\tGreat Speckled Bird\tCONQUEROR\t9404\tMEM42-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2282.mp3\tDesi Arnaz And His Orch.\tGreen Eyes\tRCA\t20-2282\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30442-1.mp3\tGene Krupa & His Orch\tGreen Eyes\tOKEH\t6222\t30442-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh102.mp3\tHarry Roy And His Band\tGreen Eyes\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_005.mp3\tJimmy Dorsey Orch V Bob Eberle And Helen O'connell\tGreen Eyes\tDECCA\t3698B\t68840\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_142.mp3\tXavier Cugat And His Waldorf-astoria Orchestra\tGreen Eyes\tVICTOR\t27443\t055956\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481103.mp3\tGene Krupa Orch. Feat. Anita O'day\tGreen Eyes\tOkeh\t6222\t30442-1\t1941\tAnita O'Day, Howard Dulaney (vo), Roy Eldridge, Graham Young, Torg Halten, Norman Murphy (tp), Babe Wagner, Jay Kelliher, John Grassi (tb), Mascagni Ruffo, Clint Neagley (as), Sam Musiker, Walter Bates (ts), Bob Kitsis (p), Ray Biondi (g), Biddy Bastien (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3b/Joh086.mp3\tHarry Roy And His Band\tGreen Eyes (v Marjorie Kingsley)\tRegal Zonophone\tMR-3613\tCAR-6279-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68840.mp3\tJimmy Dorsey And His Orch.\tGreen Eyes (vbe-ho)\tDECCA\t3698B\t68840\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW141841-2.mp3\tBlueridge Highballers\tGreen Mountain Polka\tCOLUMBIA\t15070 D\tW141841-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_050.mp3\tEddie Fisher\tGreen Years\tRCA Victor\t5748\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_211.mp3\tFreddy Martin And His Orchestra\tGrieg Piano Concerto\tBLUEBIRD\t11430\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79540-1.mp3\tMarion Harris\tGrieving For You\tCOLUMBIA\tA-3353\t79540-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_087.mp3\tMarion Harris\tGrieving For You\tCOLUMBIA\tA-3353\t79540-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_097.mp3\tTony Pastor And His Orchestra\tGrieving For You\tCOLUMBIA\t38383\tCO38245\t1947\twith ROSEMARY CLOONEY\nhttp://www.jazz-on-line.com/a/mp3w/1921_026.mp3\tPaul Whiteman Ambassador Orchestra\tGrieving For You - Feather Your Nest\tVICTOR\t35703\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC35703GF.mp3\tPaul Whiteman Ambassador Orch\tGrievinng For You - Feather Your Nest\tVICTOR\t35703\t-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU064003.mp3\tMemphis Slim (p.chatman)\tGrinder Man Blues\tBLUEBIRD\t8784\t064003\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU8584.mp3\tMemphis Slim\tGrinder Man Blues\tBLUEBIRD\t8584\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_074.mp3\tArthur Collins\tGrizzly Bear\tColumbia\tA-844\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480740.mp3\tSlim Gaillard And His Flat Foot Floogie Boys\tGroove Juice Special\tMeritt\t10\tH790-1\t1942\tBen Webster (ts) Jimmy Rowles (p) Slim Gaillard (g,vcl) Slam Stewart (sb,vo) Leo Watson (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DECL3500.mp3\tLouis Armstrong & His Orch\tGroovin'\tDECCA\t9225\tL3500\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8968GO.mp3\tIllinois Jacquet & His Orch\tGroovin'\tMERCURY\t8968\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MUSG554.mp3\tDizzy Gillespie Sextet\tGroovin' High\tMUSICRAFT\t486\tG554\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480409.mp3\tArt Pepper\tGroovin' High\tContinental\tM3568\t\t1959\tMarty Paich, Ar, Art Pepper, Cl, As, Jack Sheldon, Tp, Bob Envoldsen, Ts, VTb, Russ Freeman, P, Bill Perkins, Ts, Bud Shank, As, Al Porcino, T, Joe Mondragon, B, Vince DeRosa, Fh, Med Flory, Bar, Dick Nash, Tb, Mel Lewis, D\nhttp://www.jazz-on-line.com/a/mp3b/RoyKJ-42-2.mp3\tMezzrow - Bechet Quintet\tGroovin' The Minor\tRoyal Jazz\t706\tKJ-42-2  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87642.mp3\tCharlie Barnet & His Orchestra\tGrowling\tBLUEBIRD\t5816\t87642\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic72944.mp3\tAnthero Ramalino\tGuarda Fiscal\tVictor\t72944\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037179.mp3\tGlenn Miller Orch\tGuess I'll Go Back Home\tBLUEBIRD\t10317 A\t037179\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24764.mp3\tMildred Bailey & Her Orchestra\tGuess I'll Go Back Home\tVOCALION\t4966\t24764\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037189-3.mp3\tTommy Dorsey & His Orch\tGuess I'll Go Back Home\tVICTOR\t26294\t037189-3\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK5687-1IC.mp3\tIvory Joe Hunter\tGuess Who\tKING\t4306AA\tK5687-1IC\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146872-2.mp3\tEthel Waters\tGuess Who's In Town\tCOLUMBIA\t14353 D\tW146872-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB2168.mp3\tCount Basie & His Orchestra\tGuest In A Nest\tRCA\t20-2771\tD7VB2168\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/ManA-1693.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tGug Mug (grazing)\tManor\t1138\tA-1693\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP324x.mp3\tMargaret Whiting\tGuilty\tCAPITOL\t324\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151761-3.mp3\tRuth Etting\tGuilty\tCOLUMBIA\t2529 D\tW151761-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5648-2.mp3\tArtie Shaw And His New Music (vocal Mel Torme And Mel-tones)\tGuilty\tMUSICRAFT\t428\t5648-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73786.mp3\tElla Fitzgerald W Eddy Heywood\tGuilty\tDECCA\t23844\t73786\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_051.mp3\tRuth Etting\tGuilty\tCOLUMBIA\t2529 D\tW151761-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_048.mp3\tMargaret Whiting\tGuilty\tCapitol\t324\t1439-3\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_151.mp3\tRuss Columbo\tGuilty\tVICTOR\t22801\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_131.mp3\tElla Fitzgerald Feat. O/ Eddie Heywood\tGuilty\tDECCA\t23844\t73786\t1947\t\nhttp://www.jazz-on-line.com/a/mp3/Joh105B.mp3\tJack Payne's Bbc Dance Orchestra\tGuilty\tColumbia \tCB-396\t\t\tv Billy Scott-Coomber\nhttp://www.jazz-on-line.com/a/mp3a/OKe401865-A.mp3\tLonnie Johnson\tGuitar Blues\tOKeh\t8711\t401865-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM48S39.mp3\tArthur Smith (guitar)\tGuitar Boogie\tMGM\t10293\t48S39\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CAargbP.mp3\tAlvino Rey\tGuitar Boogie\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_331.mp3\tArthur Smith\tGuitar Boogie\tMGM\t10293\t48S39\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/COLH746.mp3\tAl Dexter And His Troopers\tGuitar Polka\tCOLUMBIA\t36898\tH746\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_221.mp3\tAl Dexter And His Troopers\tGuitar Polka\tCOLUMBIA\t20010\tH746\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/PUR1413.mp3\tFletcher Henderson & His Orch\tGulf Coast Blues\tPURITAN\t20235\t1413\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80864-3.mp3\tBessie Smith\tGulf Coast Blues\tCOLUMBIA\tA-3844\t80864-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67701.mp3\tElla Fitzgerald And Her Orch\tGulf Coast Blues\tDECCA\t3324A\t67701\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D218B.mp3\tCharlie Barnet And His Orchestra\tGulf Coast Blues\tV-DISC\t218B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_047.mp3\tBessie Smith\tGulf Coast Blues\tCOLUMBIA\tA-3844\t80864-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Par1413-1.mp3\tFletcher Henderson's Orchestra\tGulf Coast Blues\tParamount\t20235\t1413-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc11662-3.mp3\tFletcher Henderson's Orchestra\tGulf Coast Blues\tVocalion\t14636\t11662-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Col81019-4.mp3\tHenderson's Hot Six\tGulf Coast Blues\tColumbia\tA-3951\t81019-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/OKe80877-D.mp3\tLouis Armstrong's Hot Five\tGully Low Blues\tOKeh\t8474\t80877-D\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70668x.mp3\tCrewcuts\tGum Drop\tMERCURY\t70668\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_076.mp3\tCrew-cuts\tGum Drop\tMercury\t70668\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO57426.mp3\tFrankie Laine - Jimmy Carroll\tGunfight At The Ok Corral\tCOLUMBIA\t40916\tCO57426\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D242A2.mp3\tCapt. Glenn Miller And The Aaftc Orchestra\tGuns In The Sky\tV-DISC\t242A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE9486-A.mp3\tLouis Armstrong's Hot Five\tGut Bucket Blues\tOKeh\t8261\t09486-A\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO27488.mp3\tLouis Armstrong And His Hot Five\tGut Bucket Blues\tCOLUMBIA\t36152\tCO27488\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN024.mp3\tJames P Johnson\tGut Stomp\tBLUENOTE\tBN024\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC25635-4.mp3\tPaul Whiteman & His Orch\tGypsy Blues\tVICTOR\t18839A\t25635-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18839.mp3\tPaul Whiteman & His Orchestra\tGypsy Blues\tVictor\t18839\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO3492.mp3\tXavier Cugat And His Orch\tGypsy Conga\tCOLUMBIA\t36388\tCCO3492\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1624.mp3\tBing Crosby & Frances Langford\tGypsy Love Song\tDECCA\t2316B\tDLA1624\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEWC3679.mp3\tCount Basie And His Orch\tH And J\tOKEH\t6365\tWC3679\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeC-3679-1.mp3\tCount Basie And His Orchestra\tH And J\tOkeh\t6365\tC-3679-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE31230.mp3\tHal Kemp And His Orch\tH'lo Baby\tBRUNSWICK\t4674\tE31230\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/MER2383.mp3\tBill Nettle Dixie Blueboys\tHadacol Boogie\tMERCURY\t6190\t2383\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COL77395.mp3\tIrving Kaufman And Qt\tHail Hail The Gang's All Here\tCOLUMBIA\tA-2443\t77395\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/BER0457.mp3\tSousa's Band\tHail To The Spirit Of Liberty\tBERLINER\tBER0457\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_006.mp3\tIrving Kaufman And Quartet\tHail! Hail! The Gang's All Here\tCOLUMBIA\tA-2443\t77395\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_069.mp3\tShannon Four\tHail! Hail! The Gangs All Here\tVictor\t18414\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_121.mp3\tHarmonicats\tHair Of Gold (eyes Of Blue)\tUniversal\t121\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_139.mp3\tJack Emerson Feat. O/chet Howard\tHair Of Gold (eyes Of Blue)\tMetronome\t2018\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_187.mp3\tBob Eberly Feat. Sunshine Serenaders\tHair Of Gold (eyes Of Blue)\tDECCA\t24491\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_161.mp3\tJohn Laurenz\tHair Of Gold (eyes Of Blue)\tMercury\t5172\t1844\t1948\taccompanied by DICK MALTBY'S Ochestra<br>from the film \"Silver Spurs\"\nhttp://www.jazz-on-line.com/a/mp3a/CAP15178.mp3\tGordon Macrae\tHair Of Gold, Eyes Of Blue\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM48S3002.mp3\tArt Lund\tHair Of Gold, Eyes Of Blue\tMGM\t10258\t48S3002\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_056.mp3\tGordon Macrae\tHair Of Gold, Eyes Of Blue\tCapitol\t15178\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_150.mp3\tArt Lund\tHair Of Gold, Eyes Of Blue\tMGM\t10258\t48S3002\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_147.mp3\tJack Lathrop And The Drugstore Cowboys\tHair Of Gold, Eyes Of Blue\tRCA Victor\t3109\t\t1948\tfrom the film \"Siver Spurs\"\nhttp://www.jazz-on-line.com/a/mp3c/BLU044590.mp3\tHarlan Leonard & His Rockets\tHairy Joe Jump\tBLUEBIRD\t10625\t044590\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481507.mp3\tCharles Mingus Quintet\tHaitian Fight Song\tFantasy\t6009\t\t1955\tEddie Bert (tb), George Barrow (ts), Mal Waldron (p), Charles Mingus (sb), Willie Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1954_089.mp3\tNat ''king'' Cole Feat. Nelson Riddle's Orchestra\tHaji Baba (persian Lament)\tCAPITOL\t2949\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_309.mp3\tEddy Howard And His Orchestra\tHalf A Heart Is All You Left Me\tMERCURY\t5349\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_150.mp3\tJohnny Marvin\tHalf A Moon\tEDISON\t51841\t11220\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP11444.mp3\tKay Starr - Harold Mooney\tHalf A Photograph\tCAPITOL\t\t11444\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47040.mp3\tRosemary Clooney\tHalf As Much\tCOLUMBIA\t39710\tCO47040\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO46909.mp3\tCurly Williams Ga.peachpickers\tHalf As Much\tCOLUMBIA\t20879\tCO46909\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_009.mp3\tRosemary Clooney Feat. Percy Faith's Orchestra\tHalf As Much\tCOLUMBIA\t39710\tCO47040\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS3442-2.mp3\tMiles Davis And Charlie Parker\tHalf Nelson\tSAVOY\t951B\tS3442-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB2661.mp3\tColeman Hawkins Allstars\tHalf Step Down Please\tRCA\t20-3143\tD7VB2661\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO49151.mp3\tGeorge Morgan\tHalf-hearted\tCOLUMBIA\t21108\tCO 49151\t\t\nhttp://www.jazz-on-line.com/a/mp3c/GUIG601.mp3\tCozy Cole & His Quintette\tHallelujah\tGUILDE\t119\tG601\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYHL36.mp3\tColeman Hawkins All American 4\tHallelujah\tKEYNOTE\t1320\tHL36\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR412-Hx.mp3\tAstorites\tHallelujah\tHarmony\t412-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/JCFST-1229-2.mp3\tLe ''jazz Club Mystery Hot Band'' (with Django Reinhardt)\tHallelujah\tJazz Club Franais\t122\tST-1229-2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38489-2.mp3\tRevelers\tHallelujah\tVICTOR\t20609\t38489-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D74B2.mp3\tFats Waller\tHallelujah\tv-disk\t74B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/Col26060-A.mp3\tTeddy Wilson And His Orchestra\tHallelujah\tColumbia\t35298\t26060-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480470.mp3\tArt Tatum And Buddy Rich & Lionel Hampton\tHallelujah\tClef\tMGC709\t2375-2\t1955\tArt Taum (p), Lionel Hampton (vib), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480584.mp3\tArt Tatum And Buddy Rich & Lionel Hampton\tHallelujah\tVerve\tMGV-8093\t2375-2\t1955\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480847.mp3\tAndre Previn\tHallelujah !\tRCA VICTOR\t20-3040\tD7VB1844\t1948\tAndre Previn, p; Al Viola, g; Lloyd Pratt, b; Jackie Mills, drums\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31904-G.mp3\tRed Nichols & His Orch\tHallelujah (from 'hit The Deck')\tBRUNSWICK\t4701\tE31904-G\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38347-1.mp3\tNat Shilkret & Victor Orch\tHallelujah (vfb)\tVICTOR\t20599B\t38347-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70413.mp3\tHazel Scott (piano)\tHallelujah!\tDECCA\t18342B\t70413\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/ARAARA1040-1.mp3\tArt Tatum\tHallelujah!\tARA\t4501A\tARA1040-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26060-A.mp3\tTeddy Wilson & His Orch\tHallelujah!\tCOLUMBIA\t35298\t26060-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_034.mp3\tNat Shilkret And The Victor Orchestra\tHallelujah!\tVICTOR\t20599B\t38347-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/HARB12761.mp3\tAl Jolson W Guy Lombardo\tHallelujah, I'm A Bum\tHARMONY\tHa1005\tB12761\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC01802.mp3\tFats Waller And His Rhythm\tHallelujah, Thing's Look Rosy Now\tVICTOR\t25489\t01802\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC01801.mp3\tFats Waller And His Rhythm\tHallelujah, Thing's Look Rosy Now (vfw)\tVICTOR\t25478\t01801\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC41374-3.mp3\tCoon Sanders Nighthawk Orch\tHallucinations\tVICTOR\t21397\t41374-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26281-A.mp3\tCount Basie And His Orchestra\tHam 'n' Eggs\tColumbia\tD-13319\t26281-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Col145760-2.mp3\tJohnny Dunn And His Band\tHam And Eggs\tColumbia\t14358-D\t145760-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36048-2.mp3\tThomas Morris 7 Hot Babies\tHam Gravy\tVICTOR\t20179\t36048-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28891.mp3\tGene Krupa & His Orch\tHam Track\tOKEH\t6106\t28891\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10125.mp3\tFrankie Laine-jo Stafford\tHambone\tCOLUMBIA\t39672\tHCO10125\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_152.mp3\tBell Sisters And Phil Harris Feat. O/ Henri Rene\tHambone\tRCA Victor\t4584\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_152.mp3\tBell Sisters And Phil Harris Feat. O/henri Rene\tHambone\tRCA Victor\t4584\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4106.mp3\tJohnny Hicks And Troubadors\tHamburger Hop\tCOLUMBIA\t20737\tHCO4106\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74730.mp3\tLionel Hampton & His Orch\tHamp's Boogie No.2\tDECCA\t24607\t74730\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec74730.mp3\tLionel Hampton And His Orchestra\tHamp's Boogie Number 2\tDecca\t24607\t74730\t1949\tBenny Bailey-Duke Garrette-Wendell Culley-Leo Shepherd-Walter Wiliams-t, Lester Bass-Al Grey-Benny Powell-Jimmy Wormick-tb, Johnny Board-Bobby Plater-as, Gene MorrisJohnny Sparrow-Billy Williams-ts, Ben Kynard-bar, Albert Ammons-p, Lionel Hampton-vib\nhttp://www.jazz-on-line.com/a/mp3a/DEC18613x.mp3\tLionel Hampton And His Orch.\tHamp's Boogie Woogie\tDECCA\t18613\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71828-A.mp3\tLionel Hampton And His Orchestra\tHamp's Boogie Woogie\tDecca\t18613\t71828-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_171.mp3\tLionel Hampton And His Orchestra\tHamp's Boogie Woogie\tDecca\t18613\t71828-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4482.mp3\tLionel Hampton & His Orch\tHamp's Got A Duke\tDECCA\t24248\tL4482\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC75746.mp3\tLionel Hampton & His Orch\tHamp's Gumbo\tDECCA\t24946\t75746\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec75746.mp3\tLionel Hampton And His Orchestra\tHamp's Gumbo\tDecca\t24946\t75746\t1950\tWalter Williams-Benny Bailey-Ed Mullens-Duke Garrette-Leo Shepherd-t, AI Grey-Benny Powell-Jimmy Wormick-Paul Lee Higaki-tb, Bobby Plater-Jerome Richardson-as, Curtis Lowe-Johnny Board-Billy ''Smallwood'' Williams-ts, Lonnie Shaw-bar, Lionel Hampton-vi\nhttp://www.jazz-on-line.com/a/mp3d/Cor74731.mp3\tLionel Hampton And His Orchestra\tHamp's Gumbo\tCoral\t622181\t74731\t1949\tBenny Bailey-Duke Garrette-Wendell Culley-Leo Shepherd-Walter Wiliams-t, Lester Bass-Al Grey-Benny Powell-Jimmy Wormick-tb, Johnny Board-Bobby Plater-as, Gene MorrisJohnny Sparrow-Billy Williams-ts, Ben Kynard-bar, Albert Ammons-p, Lionel Hampton-vib\nhttp://www.jazz-on-line.com/a/mp3b/DEC73328.mp3\tLionel Hampton Qt\tHamp's Salty Blues\tDECCA\t18830A\t73328\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73328-A.mp3\tLionel Hampton And His Quartet\tHamp's Salty Blues\tDecca\t18830\t73328-A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4299.mp3\tLionel Hampton & His Orch\tHamp's Walkin' Boogie\tDECCA\t23839\tL4299\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-4299-A.mp3\tLionel Hampton And His Orchestra\tHamp's Walkin' Boogie\tDecca\t23839\tL-4299-A\t1946\tLionel Hampton p  vib v dir. Joe Wilder Duke Garrette Leo Shepherd Joe Morris  Wendell Culley  Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn   Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb johnny Griffin ts, Charlie Fowlkes bar, Mi\nhttp://www.jazz-on-line.com/a/mp3c/COLW142034.mp3\tGid Tanner Skillet Lickers\tHand Me Down My Walking Cane\tCOLUMBIA\t15091 D\tW142034\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09628-1.mp3\tBenny Goodman Qt\tHandful Of Keys\tVICTOR\t25705\t09628-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49759-1.mp3\tFats Waller (piano)\tHandful Of Keys\tVICTOR\t38508\t49759-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB3886.mp3\tGene Krupa & His Orchestra\tHandful Of Keys\tRCA\t20-3734\tE0VB3886\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM571-1.mp3\tBilly Kyle Swing Club Band\tHandle My Heart With Care\tVARIETY\tI659\tM571-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC16296.mp3\tLucienne Boyer\tHands Across The Table\tARC\tCO2971D\t16296\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COL16296.mp3\tLuciene Boyer\tHands Across The Table\tCOLUMBIA\t2971 D\t16296\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16285.mp3\tHal Kemp & His Orch\tHands Across The Table\tBRUNSWICK\t7317\t16285\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/PATCPT-1841-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tHands Across The Table\tPath\tPA-530\tCPT-1841-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_033.mp3\tLucienne Boyer\tHands Across The Table\tARC\tCO2971D\t16296\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480668.mp3\tThe Art Tatum Trio\tHands Across The Table\tClef\tEP-319\t1801-1\t1954\tBenny Carter (as), Art Tatum (p), Louie Bellson (dm)\nhttp://www.jazz-on-line.com/a/mp3b/DEC66956.mp3\tBlue Lu Barker & Fly Cats\tHandy Andy\tDECCA\t7709\t66956\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC14758.mp3\tCharlie Patton\tHang It On The Wall\tARC\tVO2931z\t14758\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/VICOB1333.mp3\tRay Noble's Mayfair Orchestra\tHang Out The Stars In Indiana\tVICTOR\t24357\tOB1333\t1931\twith Al Bowlly\nhttp://www.jazz-on-line.com/a/mp3d/SwiOLA-1957-1.mp3\tAlix Combelle Et Son Orchestre\tHang Over Blues\tSwing\t11\tOLA-1957-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH1241.mp3\tBob Wills And His Texas Playboys\tHang Your Head In Shame\tOKEH\t6736\tH1241\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1719.mp3\tBing Crosby - J.s.trotter\tHang Your Heart On A Hickory Limb\tDECCA\t2360B\tDLA1719\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VICOLA1888.mp3\tDickie Wells Shim Shammers\tHangin' Around Boudon\tVICTOR\t26617\tOLA1888\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU31895.mp3\tJack Denny And His Orch\tHangin' On The Garden Gate\tBRUNSWICK\t4698\t31895\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5742.mp3\tJohnny Guarnieri Trio\tHangover\tSAVOY\t555B\tS5742\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN1008x.mp3\tBob Newman\tHangover Boogie\tKING\t1008\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM51S209.mp3\tLionel Hampton & His Orchestra\tHannah! Hannah!\tMGM\t11039\t51S209\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-209.mp3\tLionel Hampton And His Orchestra\tHannah, Hannah\tMGM\t11039\t51-S-209\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_042.mp3\tArthur Collins\tHannah, Won't You Open That Door?\tEDISON\t8637\t\t1904\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW145919-4.mp3\tSol Hoopi And Andy Iona's Trio\tHano Hano Hawaii\tCOLUMBIA\t1370 D\tW145919-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO34358.mp3\tWoody Herman And His Herd\tHappiness Is A Thing Called Joe\tCOLUMBIA\t36789\tCO34358\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D323B.mp3\tWoody Herman And His Orchestra (frances Wayne Voc.)\tHappiness Is Jes' A Thing Called Joe\tV-DISC\t323B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_156.mp3\tGeorgia Gibbs\tHappiness Street\tMercury\t70920\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_229.mp3\tTony Bennett\tHappiness Street (corner Sunshine Square)\tColumbia\t40726\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38601-B.mp3\tFletcher Henderson & His Orch\tHappy As The Day Is Long\tDECCA\t3885B\t38601-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU13306-A.mp3\tDuke Ellington's Famous Orch\tHappy As The Day Is Long\tBRUNSWICK\t6571\t13306-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec38601-B.mp3\tFletcher Henderson And His Orchestra\tHappy As The Day Is Long\tDecca\t214\t38601-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480632.mp3\tFletcher Henderson & His Orch.\tHappy As The Day Is Long\tDecca\t214\t38601-B\t1934\tRussell Smith, Irving Randolph, Henry Allen (tp), Keg Johnson, Claude Jones (tb), Buster Bailey, Hilton Jefferson, Russell Procope (cl, as), Ben Webster (ts), Horace Henderson (p), Lawrence Lucie (g), Elmer James (sb), Walter Johnson (dm), Benny Carter (arr), Fletcher Henderson (dir)\nhttp://www.jazz-on-line.com/a/mp3a/TTL101y.mp3\tAnonymous\tHappy Birthday Cake\tttle John Records\t101\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010343.mp3\tTommy Dorsey & His Orch\tHappy Birthday To Love\tVICTOR\t25596\t010343\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_346.mp3\tRosemary Clooney\tHappy Christmas, Little Friend\tCOLUMBIA\t40102\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR761-Hy.mp3\tJerry Mason And His Californians\tHappy Days And Lonely Night\tHarmony\t761-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146340-3.mp3\tRuth Etting\tHappy Days And Lonely Nights\tCOLUMBIA\t1454 D\tW146340-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_089.mp3\tRuth Etting\tHappy Days And Lonely Nights\tCOLUMBIA\t1454 D\tW146340-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_124.mp3\tFontane Sisters\tHappy Days And Lonely Nights\tDot\t15171\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45236-3.mp3\tCharlie Fry Million Dollar Or.\tHappy Days And Lonely Nights (vlj)\tVICTOR\t21610\t45236-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/CHA15930-A.mp3\tSam Lanin And His Orch\tHappy Days Are Here Again\tChampion\t15930-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe403207-B.mp3\tCasa Loma Orchestra\tHappy Days Are Here Again\tOKeh\t41339\t403207-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149956-1.mp3\tBen Selvin And His Orch\tHappy Days Are Here Again\tCOLUMBIA\t2116 D\tW149956-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC61546-A.mp3\tDick Robertson And His Orch\tHappy Days Are Here Again\tDECCA\t1125\t61546-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC57517-10.mp3\tLeo Reisman And His Orchestra\tHappy Days Are Here Again\tVICTOR\t22221\t57517-10\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149956-1.mp3\tBen Selvin's Orch\tHappy Days Are Here Again\tCOLUMBIA\t2116\tW149956-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol2116-D.mp3\tBen Selvin & His Orchestra\tHappy Days Are Here Again\tColumbia\t2116-D\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru4709.mp3\tBennny Meroff & His Orchestra\tHappy Days Are Here Again\tBrunswick\t4709\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_027.mp3\tLeo Reisman And His Orchestra\tHappy Days Are Here Again\tVICTOR\t22221\t57517-10\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/GRE3857-A.mp3\tFrisco Players\tHappy Days Are Here Again (vik)\tGREYGULL\t5025\t3857-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_099.mp3\tArthur Pryor's Band\tHappy Days March\tVICTOR\t16001\tB6210-6\t1908\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0216_04.mp3\tLee Morse\tHappy Dreams\tPerfect\t11609B\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149810-1.mp3\tPaul Whiteman And His Orch\tHappy Feet\tCOLUMBIA\t2164\tW149810-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10135-2.mp3\tCab Calloway & His Orch\tHappy Feet\tBANNER\t859\t10135-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1887.mp3\tWillie Lewis & Negro Band\tHappy Feet\tVARSITY\tEL4067s\t1887\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW149810-1.mp3\tPaul Whiteman And His Orchestra (vocal Bing Crosby)\tHappy Feet\tColumbia\tE CB86\tW149810-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404007-C.mp3\tFrankie Trumbauer & His Orch\tHappy Feet (vsb)\tOKeh\t41421\t404007-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5816.mp3\tDuke Ellington & His Orch\tHappy Go Lucky Local - Part 1\tMUSICRAFT\t461\t5816\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5814.mp3\tDuke Ellington Famous Orch\tHappy Go Lucky Local - Part 2\tMUSICRAFT\t461\t5814\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA3014.mp3\tBing Crosby - J.s.trotter Orch\tHappy Holiday\tDECCA\t18424A\tDLA3014\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068457.mp3\tGlenn Miller And His Orch\tHappy In Love\tBLUEBIRD\t11401\t068457\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74862.mp3\tElla Fitzgerald / G.jenkins\tHappy Talk\tDECCA\t24639\t74862\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_102.mp3\tFred Duprez\tHappy Tho' Married\tCOLUMBIA\tA-1516\t39197-1\t1914\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC521-1.mp3\tHal Kemp And His Orch\tHappy Times\tBRUNSWICK\t6492\tC521-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63237-A.mp3\tLil Armstrong And Her Swing Band\tHappy Today, Sad Tomorrow\tDecca\t1722\t63237-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUB-11805-A.mp3\tCasa Loma Orchestra\tHappy-go-lucky You (and Broken-hearted Me)\tBRUNSWICK\t6318\tB-11805-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUJC8594.mp3\tBing Crosby W Isham Jones\tHappy-go-lucky You And Broken Hearted Me\tBRUNSWICK\t6306\tJC8594\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO44235.mp3\tSammy Kaye\tHarbor Lights\tCOLUMBIA\t38963\tCO44235\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA916-A.mp3\tFrances Langford Sam Koki\tHarbor Lights\tDECCA\t1441\tDLA916-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC76747.mp3\tGuy Lombardo And His Orchestra\tHarbor Lights\tDECCA\t27208\t76747\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL5815.mp3\tBing Crosby / Lyn Murray\tHarbor Lights\tDECCA\t27219\tL5815\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_114.mp3\tKen Griffin\tHarbor Lights\tCOLUMBIA\t38889\tCO43891\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_045.mp3\tRay Anthony Feat. Ronnie Deauville\tHarbor Lights\tCapitol\t1190\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_197v1.mp3\tJerry Byrd And Harmonicats Feat. Jerry Murad And The Harmonicats\tHarbor Lights\tMERCURY\t5421\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_050.mp3\tRalph Flanagan And His Orchestra\tHarbor Lights\tRCA VICTOR\t3911\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_249.mp3\tSammy Kaye And His Orchestra\tHarbor Of Dreams\tVictor\t27498\t065991\t1941\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW149910.mp3\tPaul Specht And His Orchestra\tHarbor Of My Heart\tCOLUMBIA\t2106\tW149910\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC13450.mp3\tFletcher Henderson & His Orch\tHard Hearted Hannah\tVOCALION\t14859B\t13450\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_165.mp3\tCliff Edwards\tHard Hearted Hannah\tPath\t032054\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67114-A.mp3\tLouis Jordan & His Tympani 5\tHard Lovin' Blues\tDECCA\t7705\t67114-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL4026-1.mp3\tWynonie Harris & His Allstars\tHard Ridin' Mama\tALLADDIN\t208\t4026-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/KEY516K-.mp3\tJosh White\tHard Times Blues\tKEYNOTE\t516K\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC72209.mp3\tGraham Bros\tHard Times Come No More\tVICTOR\t23668\t72209\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC27299-1.mp3\tCab Calloway & His Orch\tHard Times Topsy Turvy\tVOCALION\t5566\t27299-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_031.mp3\tGisele Mackenzie\tHard To Get\tX\t0137\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_164.mp3\tBelle Baker\tHard-hearted Hannah\tVICTOR\t19436\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Har141834-3.mp3\tThe Dixie Stompers\tHard-to-get Gertie\tHarmony\t197-H\t141834-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU57485-3.mp3\tKay Kyser & His Orch\tHark The Sound Of Tarheel Voices\tBLUEBIRD\t5951\t57485-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic78096-1.mp3\tMills Blue Rhythm Band\tHarlem After Midnight\tVictor\t24442\t78096-1  \t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc13929-1.mp3\tMills Blue Rhythm Band\tHarlem After Midnight\tVocalion\tS-6\t13929-1  \t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC054606-1.mp3\tDuke Ellington & His Orch\tHarlem Air Shaft\tVICTOR\t26731B\t054606-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU78504-1.mp3\tCab Calloway & His Orchestra\tHarlem Camp Meeting\tBLUEBIRD\t5677\t78504-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic78504-1.mp3\tCab Calloway And His Cotton Club Orchestra\tHarlem Camp Meeting\tVictor\t24494\t78504-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE29383.mp3\tDuke Ellington And His Orch\tHarlem Flat Blues\tBRUNSWICK\t6806\tE29383\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/BruE-29383-A.mp3\tThe Jungle Band\tHarlem Flat Blues\tBrunswick\t4309\tE-29383-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49761-2.mp3\tFats Waller And His Buddies\tHarlem Fuss\tVICTOR\t38050B\t49761-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70030.mp3\tSam Price's Texas Blusicians\tHarlem Gin Blues\tDECCA\t8609\t70030\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COL17760.mp3\tMills Blue Rhythm Band\tHarlem Heat\tCOLUMBIA\t3071 D\t17760\t\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-17760-1.mp3\tMills Blue Rhythm Band\tHarlem Heat\tColumbia\t3071-D\tCO-17760-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_267.mp3\tMills Blue Rhythm Band\tHarlem Heat\tCOLUMBIA\t3071 D\t17760\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CAPskaho.mp3\tStan Kenton's Orchestra\tHarlem Holiday\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru12544-A.mp3\tCab Calloway And His Orchestra\tHarlem Holiday\tBrunswick\t6424\t12544-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU77698-1.mp3\tCab Calloway & His Orchestra\tHarlem Hospitality\tBLUEBIRD\t5676\t77698-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic77698-1.mp3\tCab Calloway And His Cotton Club Orchestra\tHarlem Hospitality\tVictor\t24414\t77698-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC-644-1.mp3\tEarl Hines And His Orch\tHarlem Lament\tBRUNSWICK\t6771\tC-644-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC57429-3.mp3\tCoon Sanders Orchestra\tHarlem Madness\tVICTOR\t22300\t57429-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic81789-2.mp3\tFletcher Henderson And His Orchestra\tHarlem Madness\tVictor\t24699\t81789-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVJO142B2.mp3\tJohnny Otis Orchestra\tHarlem Nocturne\tSAVOY\t815A\tJO142B2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-12775.mp3\tTed Heath And His Music; Leslie Gilbert, Alto Sax.\tHarlem Nocturne\tDECCA-LONDON\tEFF.50-2 (BEP 6025) \tDR-12775\t1948\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478332.mp3\tLes Brown And His Band Of Renown\tHarlem Nocturne\tCAPITOL\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_293.mp3\tHerbie Fields And His Orchestra\tHarlem Nocturne\tParrot\t775\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480848.mp3\tLes Brown And His Band Of Renown\tHarlem Nocturne\tCAPITOL\tT746\t15099\t1956\tWes Hensel, Don Paladino, Stan Stout, Don Fagerquist (tp), Ray Sims, Vernon Friley, Bob Pring (tb), Stumpy Brown (b-tb), Les Brown, Sol Libero (cl,as), Ronnie Lang (as,fl), Abe Aaron (ts,cl,ss,bar), Billy Usselton (ts), Butch Stone (bar,cl), Donn Trenner (p), Vernon Polk (g), Buddy Clark (sb), Lloyd Morales (dm) \nhttp://www.jazz-on-line.com/a/mp3a/DEC18844A.mp3\tRandy Brooks And His Orch\tHarlem Nocturne (eddie Caine - Sax)\tDECCA\t18844A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481104.mp3\tGene Krupa Orch. Feat. Anita O'day\tHarlem On Parade\tOkeh\t6607\t32312-1\t1942\tAnita O'Day (vo), Al Beck, Mickey Mangano, Norman Murphy, Roy Eldridge (tp), Babe Wagner, Jay Kelliher, John Grassi (tb), Ben Feman, Rex Kittig, Jimmy Migliore (as), Sam Musiker (cl, ts), Don Brassfield (ts), Milton Raskin (p), Ray Biondi (g), Ed Mihelich (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3a/DEC64606.mp3\tLil Armstrong And Her Swing Orchestra\tHarlem On Saturday Night\tDECCA\t2234B\t64606\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/WES107x.mp3\tLu Watters's Yerba Buena Jazz B\tHarlem Rag\tWest Coast\t107\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152668.mp3\tClaude Hopkins And His Orch\tHarlem Rhythm Dance\tCOLUMBIA\t2880 D\tW152668\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61325-A.mp3\tJimmie Lunceford And His Orchestra\tHarlem Shout\tDecca\t980\t61325-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61325-A.mp3\tJimmie Lunceford And His Orchestra\tHarlem Shout.mp3\tDecca\t980\t61325-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU061531.mp3\tCharlie Barnet And His Orch\tHarlem Speaks\tBLUEBIRD\t11281\t061531\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13802-A.mp3\tDuke Ellington & His Orch\tHarlem Speaks\tBRUNSWICK\t6646\t13802-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67323-A.mp3\tLouis Armstrong & His Orch.\tHarlem Stomp\tDECCA\t3092B\t67323-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-2310-1.mp3\tPhilippe Brun Et Son Swing Band (with Django Reinhardt)\tHarlem Swing\tSWING\t15\tOLA-2310-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC45814-2.mp3\tRed Nichols & His Orchestra\tHarlem Twist\tVICTOR\t21560\t45814-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/Vic48374-1.mp3\tDuke Ellington's Orchestra\tHarlemania\tVictor\tV-38045\t48374-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/CAPEAP3-1020-1b.mp3\tJackie Gleason And His Orchestra\tHarmon Hum\tCAPITOL\tEAP 3-1020-1b\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW26596-A.mp3\tSonny Terry\tHarmonica Blues\tCOLUMBIA\t37686\tW26596-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D203A1.mp3\tCurtis Bay Coast Guard Philharmonicas\tHarmonica Boogie Woogie\tV-DISC\t203A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403610-B.mp3\tFred Hall & His Sugar Babies\tHarmonica Harry\tOKeh\t41369\t403610-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh104.mp3\tJack Payne And His Bbc Dance Orchestra\tHarmonica Harry\tColumbia\tCB-129\tWA-10648-1\t1930\tv Bob Busby, Bob Manning, Jack Payne\nhttp://www.jazz-on-line.com/a/mp3a/CAP1725.mp3\tSonny Terry\tHarmonica Rag\tCAPITOL\t\t1725\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59533-1.mp3\tJelly Roll Morton Peppers\tHarmony Blues\tVICTOR\t38135\t59533-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2174HG.mp3\tMary Lou Williams Girl Stars\tHarmony Grits\tRCA\t20-2174\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/VOCWM-1132-A.mp3\tThe Quintones\tHarmony In Harlem\tVOCALION\t5596\tWM-1132-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1132-A.mp3\tBenny Carter\tHarmony In Harlem\tVocalion\t5596\tWM-1132-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_285.mp3\tDuke Ellington And His Famous Orchestra Feat. Johnny Hodges\tHarmony In Harlem\tBRUNSWICK\t8044\tM650\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP7556.mp3\tPete Daily\tHarmony Rag\tCAPITOL\t1588\t7556\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1136-1.mp3\tGene Ammons Sextet\tHarold The Fox\tMERCURY\t8123\t1136-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35336.mp3\tGene Krupa & His Orch\tHarriet (v A O'day)\tCOLUMBIA\t36890\tCO35336\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB4609.mp3\tBilly Murray And Haydn Qt\tHarrigan\tVICTOR\t16664\tB4609\t1907\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE31768.mp3\tCount Basie And His Orch\tHarvard Blues\tOKEH\t6564\t31768\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/COL4335.mp3\tAda Jones (soprano)\tHas Anybody Here Seen Kelly?\tCOLUMBIA\tA-0810\t4335\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_034.mp3\tAda Jones\tHas Anybody Here Seen Kelly?\tVICTOR\t16510\tB9038-2\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_020.mp3\tNora Bayes\tHas Anybody Here Seen Kelly?\tVICTOR\t60013\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3737.mp3\tBing Crosby - Xavier Cugat\tHasta Manana\tDECCA\t23547\tL3737\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO27910.mp3\tCharlie Spand (blake)\tHastings Street\tCOLUMBIA\t37336\tCO27910\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81672-2.mp3\tBessie Smith\tHateful Blues\tCOLUMBIA\t14023 D\t81672-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_124.mp3\tAlma Gluck\tHatikva (our Hope)\tVICTOR\t87296\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_279.mp3\tJo Stafford\tHaunted Heart\tCapitol\t15023\t2741\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_172.mp3\tPerry Como Feat. O/russ Morgan\tHaunted Heart\tRCA Victor\t2713\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81466-1.mp3\tBessie Smith\tHaunted House Blues\tCOLUMBIA\t14010 D\t81466-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC55847-2.mp3\tDuke Ellington And His Orch\tHaunted Nights\tVICTOR\t38092\t55847-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_114.mp3\tJan Garber And His Orchestra\tHaunting Blues\tColumbia\t3781\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_193.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tHaunting Me\tVICTOR\t24841\t86495-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh146.mp3\tMantovani And His Tipica Orchestra\tHavana Heaven (v George Barclay)\tColumbia\tFB-1420\tCA-15765-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_130.mp3\tTony Bennett\tHave A Good Time\tCOLUMBIA\t39764\tCO47411\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC15759-1.mp3\tCarl Shaw And Ho (reichman)\tHave A Little Dream On Me\tARC\tVO2785\t15759-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC84108-1.mp3\tFats Waller And His Rhythm\tHave A Little Dream On Me\tVICTOR\t24708\t84108-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84108-1.mp3\tFats Waller And His Rhythm\tHave A Little Dream On Me\tVictor\t24708\t84108-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149674-2.mp3\tGuy Lombardo Royal Canadians\tHave A Little Faith In Me\tCOLUMBIA\t2062 D\tW149674-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/CON9277-3.mp3\tDorsey Brothers Orch\tHave A Little Faith In Me (vsl)\tCONQUEROR\t7472\t9277-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18518B.mp3\tSterling Trio\tHave A Smile\tVictor\t18518B\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_125.mp3\tPerry Como\tHave I Stayed Away Too Long?\tVICTOR\t1548\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COLH1586.mp3\tGene Autry\tHave I Told You Lately That I Love You\tCOLUMBIA\t37079\tH1586\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE4406.mp3\tFletcher Henderson & His Orch\tHave It Ready\tVOCALION\t15532\tE4406\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24804.mp3\tRed Norvo & His Orch\tHave Mercy\tVOCALION\t5009\t24804\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1193.mp3\tJimmy Blythe's Owls\tHave Mercy\tVOCALION\t1136\tC1193\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65445-A.mp3\tChick Webb And His Orchestra\tHave Mercy\tDecca\t2468\t65445-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CON17891.mp3\tBlind Gary\tHave More Faith In Jesus\tCONQUEROR\t8768\t17891\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe401339-B.mp3\tLonnie Johnson\tHave To Change Keys To Play These Blues\tOKeh\t8637\t401339-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLHTN511-2.mp3\tLightnin' Hopkins\tHave To Let You Go\tALLADDIN\t3035\tHTN511-2\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30828.mp3\tGene Krupa & His Orch\tHave You Changed\tOKEH\t6306\t30828\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013332.mp3\tBunny Berigan & His Orch\tHave You Ever Been In Heaven?\tVICTOR\t25677A\t013332\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL693.mp3\tLee O'daniel Hillbilly Boys\tHave You Ever Been Lonely\tVOCALION\t4588\tDAL693\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152363-3.mp3\tTed Lewis And His Band, Vocal By Ted Lewis\tHave You Ever Been Lonely?\tCOLUMBIA\t36302\tW152363-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_078.mp3\tTed Lewis And His Band\tHave You Ever Been Lonely?\tCOLUMBIA\t2753 D\tW152363-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVicV38048.mp3\tEarl Hines & His Orchestra\tHave You Ever Felt That Way\tVictor\tV38048\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC48886-3.mp3\tEarl Hines & His Orch\tHave You Ever Felt That Way?\tVICTOR\t38048\t48886-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC38048h.mp3\tEarl Hines & His Orch\tHave You Ever Felt That Way?\tVICTOR\t38048\t48886-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/MER632-2.mp3\tJay Mcshann\tHave You Ever Loved A Woman?\tMERCURY\t8032\t632-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI4697-B.mp3\tHelen Clark - O\tHave You Forgotten Me? (james V. Monaco)\tEDISON\t\t4697-B\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23519-2.mp3\tMildred Bailey & Her Orchestra\tHave You Forgotten So Soon? (v M B)\tVOCALION\t4432\t23519-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM579-1.mp3\tDolly Dawn & Her Dawn Patrol\tHave You Got Any Castles, Baby?\tVARIETY\tI621\tM579-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011354.mp3\tTommy Dorsey & His Orch\tHave You Got Any Castles, Baby?\tVICTOR\t25635\t011354\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_135.mp3\tDolly Dawn And Her Dawn Patrol\tHave You Got Any Castles, Baby?\tVARIETY\tI621\tM579-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_187.mp3\tGus Arnheim And His Orchestra\tHave You Got Any Castles, Baby?\tBRUNSWICK\t7937\t21421-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_039.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tHave You Got Any Castles, Baby?\tVICTOR\t25635\t011354\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4572.mp3\tLouis Jordan's Tympani 5\tHave You Got The Gumption?\tDECCA\t24571\tL4572\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S6123.mp3\tJoni James\tHave You Heard?\tMGM\t11390A\t52S6123\t\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYHL160.mp3\tBernie Leighton Qt\tHave You Met Miss Jones\tKEYNOTE\t644\tHL160\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89059H.mp3\tStan Getz Quintet\tHave You Met Miss Jones?\tMERCURY\t89059\t\t\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC014623-2.mp3\tLeo Reisman & His Orch\tHave You Met Miss Jones?\tVICTOR\t25687\t014623-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480441.mp3\tArt Tatum/ Ben Webster Quartet\tHave You Met Miss Jones?\tBarclay\t74045\t2994-3\t1956\tBen Webster (ts), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480616.mp3\tArt Tatum/ Ben Webster Quartet\tHave You Met Miss Jones?\tBarclay\t74075\t2994-3\t1956\tBen Webster (ts), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3a/DECL3387.mp3\tJudy Garland - G.stoll\tHave Yourself A Merry Little Christmas\tDECCA\t23362\tL3387\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_251.mp3\tJudy Garland\tHave Yourself A Merry Little Christmas\tDECCA\t29295\tL3387\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC042942.mp3\tLionel Hampton & His Orch\tHaven't Named It Yet\tVICTOR\t26476\t042942\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic042942-1.mp3\tLionel Hampton And His Orchestra\tHaven't Named It Yet\tVictor\t26476\t042942-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM279-1.mp3\tBilly Kyle Swing Club Band\tHavin' A Ball\tVARIETY\tI574\tM279-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03840.mp3\tFats Waller And His Rhythm\tHavin' A Ball (vfw)\tVICTOR\t25515B\t03840\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VOC4099B.mp3\tOrrin Tucker\tHavin' Myself A Time\tVOCALION\t4099 B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS23151-2.mp3\tBillie Holiday & Her Orch\tHavin' Myself A Time\tCBS\tVO4208\t23151-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011351.mp3\tTommy Dorsey & Clambake 7\tHaving A Wonderful Time\tVICTOR\t25630\t011351\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CON623U.mp3\tSlam Stewart Qt\tHaw Haw\tCONTIN\t10004\t623U\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS26016-A.mp3\tJack Teagarden & His Orch\tHawaii Sang Me To Sleep\tCBS\tCO35233\t26016-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/COLLA193.mp3\tAndy Iona's Novelty Four\tHawaii Sing To Me\tCOLUMBIA\t3001 D\tLA193\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_039.mp3\tSterling Trio (henry Burr, Albert Campbell And John Meyer)\tHawaiian Butterfly\tVictor\t18272\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC19369-1.mp3\tSterling Trio\tHawaiian Butterfly (i Wonder Why......)\tVICTOR\t18272\t19369-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU028598.mp3\tTune Wranglers\tHawaiian Honeymoon\tBLUEBIRD\t7966\t028598\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC62071.mp3\tLouis Armstrong And Andy Iona\tHawaiian Hospitality\tDECCA\t1216\t62071\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/COLLA463.mp3\tAndy Iona's Novelty Four\tHawaiian Memories\tCOLUMBIA\t3129 D\tLA463\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA523-B.mp3\tBing Crosby & Dick Mcintyre\tHawaiian Paradise\tDECCA\t25010\tDLA523-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA523-A.mp3\tDick Mcintyre And His Harmony Hawaiians With Bing Crosby\tHawaiian Paradise\tDECCA\t886A\tDLA523-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA523-B.mp3\tDick Mcintyre And His Harmony Hawaiians With Bing Crosby\tHawaiian Paradise\tDECCA\tDE19017\tDLA523-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D349B1.mp3\tSammy Kaye And His Orchestra (billy Williams Voc.)\tHawaiian Sunset\tV-DISC\t349B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC030323.mp3\tTommy Dorsey And His Orch\tHawaiian War Chant\tVICTOR\t26126\t030323\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_192.mp3\tAmes Brothers, The Feat. Roy Smeck And The Serenaders\tHawaiian War Chant (ta-hu-wa-hu-wai)\tCORAL\t60510\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2169x.mp3\tErskine Hawkins And His Orch.\tHawk's Boogie\tRCA\t20-2169\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4543.mp3\tLionel Hampton & His Orch\tHawk's Nest\tDECCA\t24505\tL4543\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_211.mp3\tFrankie Laine\tHawk-eye\tColumbia\t40558\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/SIGT1907.mp3\tColeman Hawkins & His Orch\tHawkins' Barrel House\tSIGNATURE\t28101A\tT1907\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-1914-6.mp3\tFletcher Henderson And His Orchestra\tHay Foot, Straw Foot\tVocalion\t15174\tE-1914-6\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE1914.mp3\tFletcher Henderson & His Orch\tHay Foot, Straw Foot - Charleston\tVOCALION\t15174B\tE1914\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1505.mp3\tDuke Ellington Famous Orch\tHayfoot, Strawfoot\tRCA\t20-1505\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70411.mp3\tHazel Scott (piano)\tHazel's Boogie Woogie\tDECCA\t18340A\t70411\t1942\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478333.mp3\tAlec Templeton\tHazy And Blue\tVICTOR\t\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_032.mp3\tAl Hibbler\tHe\tDecca\t29660\t88328\t1955\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC88328.mp3\tAl Hibbler\tHe\tDECCA\t29660\t88328\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141815.mp3\tArt Gillam\tHe Ain't Done Right By Nell\tCOLUMBIA\t657 D\tW141815\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC03872-1.mp3\tBenny Goodman And His Orchestra\tHe Ain't Got Rhythm\tVICTOR\t25505\t03872-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61550-A.mp3\tJimmie Lunceford And His Orchestra\tHe Ain't Got Rhythm\tDecca\t1128\t61550-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20568-1.mp3\tTeddy Wilson And His Orchestra\tHe Ain't Got Rhythm\tBrunswick\t7824  \tB-20568-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_367.mp3\tBenny Goodman And His Orchestra Feat. Jimmy Rushing\tHe Ain't Got Rhythm\tVICTOR\t25505\t03872-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61550-A.mp3\tJimmie Lunceford And His Orchestra\tHe Ain't Got Rhythm.mp3\tDecca\t1128\t61550-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol117.mp3\tTenor Solo\tHe Calls Me His Own Darling\tColumbia\t117\t\t1901\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC64434.mp3\tBlue Lu Barker & Fly Cats\tHe Caught The B & O\tDECCA\t7506\t64434\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_106.mp3\tArthur Fields\tHe Comes Up Smiling\tCOLUMBIA\tA-1696\t39797\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_021.mp3\tBilly Murray\tHe Goes To Church On Sunday\tCOLUMBIA\tA-0480\t03671-1\t1907\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03671-1.mp3\tBilly Murray (tenor)\tHe Goes To Church Sunday\tCOLUMBIA\tA-0480\t03671-1\t1907\t\nhttp://www.jazz-on-line.com/a/mp3e/Cam3715-B.mp3\tOzie Ware Acc. By The Whoopee Makers\tHe Just Don't Appeal To Me\tCameo\t9042\t3715-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP60666.mp3\tDinning Sisters\tHe Like, She Like It\tCAPITOL\t\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80637-3.mp3\tEddie Cantor\tHe Loves It\tCOLUMBIA\tA-3754\t80637-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_102.mp3\tEddie Cantor\tHe Loves It\tCOLUMBIA\tA-3754\t80637-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI8638.mp3\tBilly Jones - Male Chorus - O\tHe Loves It (pete Wendling - Leigh)\tEDISON\t51079\t8638\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru2380.mp3\tCotton Pickers\tHe May Be Your Man But He Comes To See Me Sometimes\tBrunswick\t2380\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD312.mp3\tHelen Humes W Marshall Royal\tHe May Be Yours\tDISC\t520\tD312\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148476-2.mp3\tCharlie Poole N.c.ramblers\tHe Rambled\tCOLUMBIA\t15407 D\tW148476-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN17471.mp3\tCarter Family\tHe Took A White Rose From Her Hair\tBANNER\t33462\t17471\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU010138.mp3\tCharlie Barnet & His Orch\tHe Walked Right In\tBLUEBIRD\t6967\t010138\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_013.mp3\tKay Kyser And His Orchestra\tHe Wears A Pair Of Silver Wings\tCOLUMBIA\t36604\tCO32825-2\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO32825-2.mp3\tKay Kyser And His Orchestra\tHe Wears A Pair Of Silver Wings\tCOLUMBIA\t36604\tCO32825-2\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_144.mp3\tGordon Jenkins\tHe Wears A Pair Of Silver Wings\tCapitol\t106\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC23598.mp3\tBilly Murray\tHe Went In Like A Lion And Came Out Like A Lamb\tVICTOR\t18657\t23598\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_121.mp3\tBilly Murray\tHe Went In Like A Lion And Came Out Like A Lamb\tVictor\t18633\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_173.mp3\tFour Lads Feat. O/norman Leyden\tHe Who Has Love\tCOLUMBIA\t39958\tCO48844\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC14076-2.mp3\tBilly Murray\tHe'd Have To Get Out And Get Under\tVICTOR\t17491\t14076-2\t1913\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO34718.mp3\tLes Brown & Doris Day\tHe'll Have To Cross The Atlantic\tCOLUMBIA\t36828\tCO34718\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_039.mp3\tAmerican Quartet\tHe's A College Boy\tVictor\t16492\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3e/COL3536.mp3\tBert Williams\tHe's A Cousin Of Mine\tCOLUMBIA\tA-0862\t3536\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_009.mp3\tBert Williams\tHe's A Cousin Of Mine\tCOLUMBIA\tA-0303\t3536\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_018.mp3\tBilly Murray\tHe's A Devil In His Own Home Town\tVICTOR\t17576\t14779-1\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_088.mp3\tEddie Morton\tHe's A Devil In His Own Home Town\tCOLUMBIA\tA-1525\t39288-2\t1914\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_0527_01.mp3\tLee Morse And Her Bluegrass Boys\tHe's A Good Man To Have Around\tColumbia\t1866DA\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07805.mp3\tTommy Dorsey & Clambake 7\tHe's A Gypsy From Poughkeepsie\tVICTOR\t25577\t07805\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62207.mp3\tBob Howard & His Orch\tHe's A Gypsy From Poughkeepsie\tDECCA\t1306\t62207\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP40017.mp3\tNellie Lutcher\tHe's A Real Gone Guy\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152352.mp3\tClaude Hopkins & His Orch\tHe's A Son Of The South\tCOLUMBIA\t2747 D\tW152352\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2455.mp3\tGracie Fields\tHe's Dead, But He Won't Lie Down\tDECCA\t18183A\tDLA2455\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COL21689.mp3\tBillie Holiday\tHe's Funny That Way\tCOLUMBIA\t37495\t21689\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE26765-A.mp3\tGene Krupa & His Orch\tHe's Gone\tOKEH\t5985\t26765-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76079.mp3\tArtie Shaw And His Orchestra\tHe's Gone Away\tDECCA\t27009\t76079\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic40093-2.mp3\tThomas Waller With Morris's Not Babies\tHe's Gone Away\tVictor\t21202\t40093-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW140717-3.mp3\tBessie Smith\tHe's Gone Blues\tCOLUMBIA\t14083 D\tW140717-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_021.mp3\tArthur Fields\tHe's Got A Bungalow\tCOLUMBIA\tA-2086\t46956\t1916\t\nhttp://www.jazz-on-line.com/a/mp3e/PUR20147.mp3\tBlind Blake\tHe's In The Jailhouse Now\tPURITAN\t20123\t20147\t\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI5389.mp3\tEdward Meeker\tHe's Living The Life Of Reilly\tEDISON\t51040\t5389\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73264.mp3\tAndy Kirk And His Orchestra\tHe's My Baby\tDecca\t23870\t73264\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO827.mp3\tHarry James And His Orch\tHe's My Guy\tCOLUMBIA\t36614\tHCO827\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71288.mp3\tElla Fitzgerald & Four Keys\tHe's My Guy\tDECCA\t18472A\t71288\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE35743.mp3\tMarion Harris\tHe's My Secret Passion\tBRUNSWICK\t6016\tE35743\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_1126_02.mp3\tLee Morse And Her Bluegrass Boys\tHe's My Secret Passion\tColumbia\t2348DB\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu57027.mp3\tAbe Lyman And His Californians\tHe's My Uncle\tBluebird\t10924\t57027\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_215.mp3\tBenny Goodman And His Orchestra\tHe's Not Worth Your Tears\tMelotone\t12023\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-7300.mp3\tJimmie Noone's Apex Club Orchestra\tHe's Not Worth Your Tears ? V M B\tVocalion \t1580\tC-7300\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63394.mp3\tHot Lips Page & His Band\tHe's Pulling His Whiskers\tDECCA\t7451\t63394\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66895.mp3\tBlue Lu Barker & Fly Cats\tHe's So Good\tDECCA\t7695\t66895\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL100340-2.mp3\tRudy Marlow's Orch (f.rich)\tHe's So Unusual\tCOLUMBIA\tHA1063\t100340-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/Oke403208-B.mp3\tHal Kemp And His Orchestra (as Carolina Club Orch)\tHe's So Unusual\tOkey\t41326\t403208-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149429-2.mp3\tFred Rich & His Orchestra\tHe's So Unusual (from 'sweetie')\tCOLUMBIA\t2043 D\tW149429-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0800_01.mp3\tLee Morse\tHe's Still My Baby\tPerfect\t11628A\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/OKeWA7509-1.mp3\tSophie Tucker\tHe's Tall And Dark And Handsome\tOKeh\t41249\tWA7509-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81981-3.mp3\tFletcher Henderson's Orch\tHe's The Hottest Man In Town\tCOLUMBIA\t209D\t81981-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Col81981-3.mp3\tFletcher Henderson And His Orchestra\tHe's The Hottest Man In Town\tColumbia\t\t81981-3  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU048940-1.mp3\tTommy Dorsey Sentimentalists\tHead On My Pillow\tBLUEBIRD\t10726\t048940-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC02165-3.mp3\tTommy Dorsey & His Orch\tHead Over Heels In Love\tVICTOR\t25487\t02165-3\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh006.mp3\tJay Wilbur And His Band\tHead Over Heels  Film Selection Pt. 2\tRex\t9005\tF-2221-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEHCO1210.mp3\tTed Daffan's Texans\tHeadin' Down The Wrong Highway\tOKEH\t6744\tHCO1210\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151196-4.mp3\tTed Lewis And His Band\tHeadin' For Better Times\tCOLUMBIA\t2378 D\tW151196-4\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_063.mp3\tTed Lewis And His Band\tHeadin' For Better Times\tCOLUMBIA\t2721 D\tW151196-4\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU063895.mp3\tFats Waller And His Rhythm\tHeadlines In The News\tBLUEBIRD\t11188\t063895\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS1010.mp3\tKing Cole Quintet\tHeads\tDISC\t2010\t1010\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402224-A.mp3\tLouis Armstrong's Hot Five\tHeah Me Talkin To Ya\tOKeh\t8649\t402224-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW402224-A.mp3\tLouis Armstrong And His Orch\tHeah Me Talkin' To Ya?\tCOLUMBIA\t36378\tW402224-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU48798-4.mp3\tJohnny Dodds Washboard Band\tHeah' Me Talkin'\tBLUEBIRD\t10241\t48798-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO38639.mp3\tArthur Godfrey\tHeap Big Smoke\tCOLUMBIA\t38762\tCO38639\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC048479.mp3\tTommy Dorsey & His Orch\tHear My Song, Violetta\tVICTOR\t26616\t048479\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047097.mp3\tGlenn Miller & His Orch\tHear My Song, Violetta (vre)\tBLUEBIRD\t10684\t047097\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_100.mp3\tFour Aces Featuring Al Alberts\tHeart\tDecca\t29476\tL8200\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_048.mp3\tEddie Fisher\tHeart\tRCA Victor\t6097\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC026690.mp3\tLarry Clinton And His Orchestra\tHeart And Soul\tVICTOR\t26046\t026690\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC82993.mp3\tFour Aces\tHeart And Soul\tDECCA\t28390\t82993\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26046.mp3\tLarry Clinton & His Orchestra\tHeart And Soul\tVictor\t26046\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_083.mp3\tFour Aces\tHeart And Soul\tDECCA\t28390\t82993\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_316.mp3\tJohnny Maddox And The Rhythmasters\tHeart And Soul\tDot\t15488\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_025.mp3\tLarry Clinton And His Orchestra Feat. Bea Wain\tHeart And Soul\tVICTOR\t26046\t026690\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_216.mp3\tEddy Duchin And His Orchestra Feat. V/stanley Worth\tHeart And Soul\tBRUNSWICK\t8238\t23524-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_303.mp3\tAl Donahue And His Orchestra\tHeart And Soul\tVOCALION\t4398\t23432\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COL30209m.mp3\tBuddy Tate's Orch\tHeart Breakin' Baby\tCOLUMBIA\t30209\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_361.mp3\tCathy Carr\tHeart Hideaway\tFraternity\t743\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63694-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tHeart Of Mine\tDecca\t2721\t63694-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63694-A.mp3\tChick Webb & His Orchestra\tHeart Of Mine (vef)\tDECCA\t2721B\t63694-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_072.mp3\tDon Cornell, Alan Dale And John Feat. Jack Pleis' Orchestra\tHeart Of My Heart\tCoral\t61076\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC569.mp3\tHal Kemp And His Orch\tHeart Of Stone\tBRUNSWICK\t7958\tC569\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2175x.mp3\tTed Weems\tHeartaches\tRCA\t20-2175\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2232.mp3\tHarry James & His Orchestra\tHeartaches\tCOLUMBIA\t37305\tHCO2232\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1444.mp3\tTed Weems And His Orchestra\tHeartaches\tDECCA\t25017\tDLA1444\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_054.mp3\tHarry James And His Orchestra\tHeartaches\tCOLUMBIA\t37305\tHCO2232\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_378.mp3\tSomethin' Smith And The Redheads\tHeartaches\tEpic\t9179\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_139.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Carroll And Dee Parker\tHeartaches\tMGM\t10001A\t47S42\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_002alt.mp3\tTed Weems And His Orchestra\tHeartaches (decca Version)\tDecca\t2020\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe265145.mp3\tColeman Hawkins\tHeartbreak Blues\tOKeh\t41566\t265145\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_427.mp3\tStan Freberg\tHeartbreak Hotel\tCapitol\t3480\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_005.mp3\tElvis Presley\tHeartbreak Hotel\tRCA Victor\t6420\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4828.mp3\tAndrews Sisters And Harmonica\tHeartbreaker\tDECCA\t24427\tL4828\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM52S490.mp3\tArt Mooney And His Orchestra\tHeartbreaker\tMGM\t30782\t52S490\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_284.mp3\tArt Mooney And His Orchestra\tHeartbreaker\tMGM\t30782\t52S490\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_154.mp3\tAndrews Sisters\tHeartbreaker\tDECCA\t24427\tL4828\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_245.mp3\tTommy Leonetti\tHeartless\tCapitol\t3274\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480849.mp3\tVictor Concert Orchestra; Nat Shilkret, Cond.\tHearts And Flowers\tVICTOR\t35922-A\t2328\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/DOT15265.mp3\tFontaine Sisters\tHearts Of Stone\tCORAL\tDOT15265\t(?)\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC87082.mp3\tRed Foley\tHearts Of Stone\tDECCA\t29375\t87082\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_115.mp3\tCharms\tHearts Of Stone\tDeLuxe\t6062\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_011.mp3\tFontane Sisters\tHearts Of Stone\tDot\t15265\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14199.mp3\tGlen Gray And The Casa Loma Orch M Bailey\tHeat Wave\tBRUNSWICK\t6679\t14199\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152521-1.mp3\tEthel Waters And Her Ebony 4\tHeat Wave\tCOLUMBIA\t2826 D\tW152521-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38301-A.mp3\tDorsey Brothers Orchestra\tHeat Wave\tDECCA\t208A\t38301-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_073.mp3\tEthel Waters\tHeat Wave\tCOLUMBIA\t2826\tW152521-1\t1933\t\nhttp://www.jazz-on-line.com./a/mp3o/CAP13303.mp3\tRay Anthony & His Orchestra\tHeat Wave\tCAPITOL\t3029\t13303\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_104.mp3\tGlen Gray And Casa Loma Orchestra\tHeat Wave\tBRUNSWICK\t6679\t14199\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban11363-1.mp3\tBaron Lee And The Blue Rhythm Band (mills Blue Rhythm Band)\tHeat Waves\tBanner\t32444  \t11363-1  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC031802.mp3\tTommy Dorsey & His Orch\tHeaven Can Wait\tVICTOR\t26154\t031802\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec2321A.mp3\tGlen Gray & His Orchestra\tHeaven Can Wait\tDecca\t2321A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26154.mp3\tTommy Dorsey & His Orchestra\tHeaven Can Wait\tVictor\t26154\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_239.mp3\tKay Kyser And His Orchestra\tHeaven Can Wait\tCBS\tBR8317\t24023\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_013.mp3\tGlen Gray And Casa Loma Orchestra\tHeaven Can Wait\tDECCA\t2321A\t65037\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC65037.mp3\tGlen Gray And Casa Loma Orch.\tHeaven Can Wait (vclyde Burke)\tDECCA\t2321A\t65037\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC21334.mp3\tMildred Bailey & Her Orchestra\tHeaven Help This Heart Of Mine\tVOCALION\t3615\t21334\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26195.mp3\tBenny Goodman & His Orch\tHeaven In My Arms (vocal M. Bailey)\tCOLUMBIA\t35308\t26195-A\t1939\t\nhttp://www.78-tours.net/mp3/COLCA14588.mp3\tSavoy Htel Orpheans - Au Piano : Carrol Gibbons\tHeaven On Earth\tCOLUMBIA\tDF1598\tCA14588\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_238.mp3\tPlatters\tHeaven On Earth\tMercury\t70893\tYW12628\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14142-A.mp3\tAbe Lyman And His Californians (vphil Neeley)\tHeaven Only Knows\tBRUNSWICK\t6672\t14142-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6672.mp3\tAbe Lyman Sad His California Orchestra\tHeaven Only Knows\tBrunswick\t6672\tB-14142-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_168.mp3\tEddie Fisher\tHeaven Was Never Like This\tRCA Victor\t5830\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3352-1.mp3\tCarter Family\tHeaven's Radio\tOKEH\t5931\tC3352-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_232.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tHeavenly Hideaway\tDECCA\t4207A\t70480\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC4071-1.mp3\tChampion Jack Dupree\tHeavy Heart Blues\tOKEH\t6597\tC4071-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4605.mp3\tBill Monroe's Bluegrass Boys\tHeavy Traffic Ahead\tCOLUMBIA\t20595\tCCO4605\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D388B2.mp3\tNew Friends Of Rhythm\tHeavy Traffic On Canal St\tV-DISC\t388B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1795-1.mp3\tRoy Eldridge & His Orch\tHeckler's Hop\tVOCALION\t3577\tC1795-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic69978-8.mp3\tMills Blue Rhythm Band\tHeebie Jeebie V Wj /a B C\tVictor\t22763\t69978-8\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142476-3.mp3\tEthel Waters\tHeebie Jeebies\tCOLUMBIA\t14153 D\tW142476-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE09534-A.mp3\tLouis Armstrong And His Hot Five\tHeebie Jeebies\tOKeh\t8300A\t09534-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE37113.mp3\tBoswell Sisters\tHeebie Jeebies\tBRUNSWICK\t6173\tE37113\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404408-B.mp3\tThe Boswell Sisters\tHeebie Jeebies\tOKeh\t41444\t404408-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP2096.mp3\tLovie Austin Blue Serenaders\tHeebie Jeebies\tPARAMOUNT\t12283\tP2096\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COM619HJ.mp3\tGeorge Wettling Rhythm Kings\tHeebie Jeebies\tCOMMODORE\t619\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke8300.mp3\tLouis Armstrong\tHeebie Jeebies\tOkeh\t8300\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74838.mp3\tLouis Jordan\tHeed My Warning\tDECCA\t24981\t74838\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_029.mp3\tHarry Macdonough\tHeidelberg\tVICTOR\t1920\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB22345.mp3\tHorace Heidt's Musical Knights\tHeigh Ho\tCOLUMBIA\t36324\tB22345\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC018414.mp3\tBunny Berigan & His Orch\tHeigh Ho\tVICTOR\t25776A\t018414\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_226.mp3\tHorace Heidt And His Brigadiers\tHeigh Ho\tBRUNSWICK\t8074\t22345-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC53531-2.mp3\tRudy Vallee & His Ct.yankees\tHeigh Ho Everybody, Heigh Ho\tVICTOR\t22029\t53531-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_131.mp3\tRudy Vallee And His Connecticut Yankees\tHeigh Ho Everybody, Heigh Ho\tVICTOR\t22029\t53531-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC1632-A.mp3\tFreddie Rich And His Orch\tHeigh-ho\tDecca\t1632-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_285.mp3\tRusty Draper\tHeld For Questioning\tMercury\t70818\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD419.mp3\tHelen Humes\tHelen's Advice\tDISC\t535\tD419\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2491.mp3\tArt Kassel & His Orchestra\tHell's Bells\tMERCURY\t5298\t2491\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62262-A.mp3\tJimmie Lunceford And His Orchestra\tHell's Bells\tDecca\t1506\t62262-A\t1937\tJimmie Lunceford dir. Eddie Tompkins-Paul Webster/Sy Oliver-t-v-a/Elmer Crumbley- Russell Bowles-tb/Eddie Durharn tb-g-a/Willie Smith-cI-as-bar-v-a/Ed Brown as/Dan  Grissom-cl-as-v/Earl Carruthers-cl-as-bar/Joe Thomas-cl-ts/Edwin Wilc ox -p-cel-a/Al \nhttp://www.jazz-on-line.com/a/mp3a/COLW152225-2.mp3\tArt Kassell And His Orch\tHell's Bells (v3)\tCOLUMBIA\t2682 D\tW152225-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149281-2.mp3\tGid Tanner's Skillet Lickers\tHell's Broke Loose In Georgia\tCOLUMBIA\t15516 D\tW149281-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic63196-2.mp3\tMckinney's Cotton Pickers\tHello !\tVictor\t23031\t63196-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI3972-C.mp3\tHelen Clark - Harvey Hindermeyer - O\tHello 'frisco! (louis A. Hirsch - Gene Buck) - From ''1915 Follies''\tEDISON\tBA 2687\t3972-C\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU14267.mp3\tAl Jolson\tHello 'tucky\tBRUNSWICK\t2763\t14267\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142449-2.mp3\tRuth Etting W Art Kahn's Orch\tHello Baby\tCOLUMBIA\t716 D\tW142449-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC67516-1.mp3\tWayne King & His Orch\tHello Beautiful\tVICTOR\t22642\t67516-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142799-2.mp3\tCliquot Club Eskimos\tHello Bluebird\tCOLUMBIA\t795 D\tW142799-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/PUR6863-1.mp3\tSam Lanin & His Orch.\tHello Bluebird\tPURITAN\t20481\t6863-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE20874.mp3\tVincent Lopez & His Orch\tHello Bluebird (v Ks + L)\tBRUNSWICK\t3368\tE20874\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_003.mp3\tByron G. Harlan\tHello Central, Give Me Heaven\tEDISON\t7852\t\t1901\t\nhttp://www.jazz-on-line.com/a/mp3a/COL77753.mp3\tAl Jolson\tHello Central, Give Me No Man's Land\tCOLUMBIA\tA-2542\t77753\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_008.mp3\tAl Jolson\tHello Central, Give Me No Man's Land\tCOLUMBIA\tA-2542\t77753\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20608-A.mp3\tHorace Heidt And His Orch\tHello Cutie\tVICTOR\t20608A\tPB276-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC16191-5.mp3\tGeorge Hamilton Green\tHello Frisco\tVICTOR\t17837\t16191-5\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D713HGF.mp3\tJimmy Mundy\tHello Goodbye Forget It\tV-DISC\t713\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC45099HH.mp3\tNora Bayes\tHello Hawaii, How Are You?\tVICTOR\t45099\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141159.mp3\tArt Gillam\tHello Little Girl Of My Dreams\tCOLUMBIA\t737 D\tW141159\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COL29587.mp3\tOrrin Tucker And His Orch\tHello Ma! I Done It Again\tCOLUMBIA\t35966\t29587\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68559.mp3\tElla Fitzgerald & Her Orch\tHello Ma, I Done It Again\tDECCA\t3612B\t68559\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3147.mp3\tBing Crosby\tHello Mom\tDECCA\t4367A\tL3147\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR638-Hx.mp3\tHarmonians\tHello Montreal\tHarmony\t638-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23762-1.mp3\tTeddy Wilson & His Orch\tHello My Darling\tBRUNSWICK\t8281\t23762-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23762-1.mp3\tTeddy Wilson And His Orchestra\tHello My Darling\tBrunswick\t8281\tB-23762-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_164.mp3\tNorman Brooks Feat. Lou Harold Orchestra\tHello Sunshine\tZodiac\t101\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20467.mp3\tWaring's Pennsylvanians\tHello Swanee, Hello\tVictor\t20467\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI5379-C.mp3\tAdolph J. Hahl - O\tHello! I've Been Looking For You\tEDISON\tBA 3210\t5379-C\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN6539-5.mp3\tSam Lanin And His Orchestra\tHello, Aloha! How Are You? (vik)\tBANNER\t1744\t6539-5\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_031.mp3\tVincent Lopez And His Orchestra\tHello, Bluebird\tBrunswick\t3368\tE20874\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_033.mp3\tElida Morris And Sam Ash\tHello, Frisco!\tCOLUMBIA\tA-1801\t45831-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35539-A.mp3\tVictor Military Band\tHello, Hawaii\tVictor\t35539-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_093.mp3\tNora Bayes Feat. O/rosario Bourdon\tHello, Hawaii, How Are You?\tVICTOR\t45099\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1899_006.mp3\tArthur Collins\tHello, Ma Baby\tEDISON\t5470\t\t1899\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_332.mp3\tElla Fitzgerald\tHello, Ma! I Done It Again\tDECCA\t3612B\t68559\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66806-A.mp3\tDick Robertson And His Orch\tHello, Mister Kringle\tDECCA\t3365A\t66806-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_068.mp3\tBen Bernie And His Orchestra\tHello, Swanee, Hello\tBRUNSWICK\t3414\tE21083\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE21083.mp3\tBen Bernie & His Orch\tHello, Swanee, Hello (v S B)\tBRUNSWICK\t3414\tE21083\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_311.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tHello, Young Lovers\tRCA Victor\t4112\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63294.mp3\tEdgar Hayes & His Orchestra\tHelp Me\tDECCA\t2193A\t63294\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu53421.mp3\tAbe Lyman And His Californians\tHelp Me\tBluebird\t10887\t53421\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_381.mp3\tPete Hanley; Orchestra And Chorus Under The Diredtion Of The Leyden Brothers\tHelp Me Mend A Broken Heart\tOKEH\t6980\tCO48882\t1953\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUE-36909-A.mp3\tCasa Loma Orchestra\tHelp Yourself To Happiness\tBRUNSWICK\t6150\tE-36909-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW151795-2.mp3\tBenny Goodman & His Orch\tHelp Yourself To Happiness\tCOLUMBIA\t2542D\tW151795-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S3156.mp3\tLionel Hampton & His Hamptones\tHelpless\tMGM\t11108\t51S3156\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-3156.mp3\tLionel Hampton And His Orchestra\tHelpless\tMGM\t11108\t51-S-3156\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146000-1.mp3\tGid Tanner's Skillet Lickers\tHen Cackle\tCOLUMBIA\t15303 D\tW146000-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142902-2.mp3\tFletcher Henderson's Orch\tHenderson Stomp\tCOLUMBIA\t817 D\tW142902-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COL29064-1.mp3\tBenny Goodman And His Orchestra\tHenderson Stomp\tCOLUMBIA\t35820\t29064-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81017-3.mp3\tThe Georgians\tHenpecked Blues\tColumbia\tA-3907\t81017-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC3521.mp3\tDick Justice\tHenry Lee\tBRUNSWICK\t367\tC3521\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21174-A.mp3\tHappiness Boys\tHenry's Made A Lady Out Of\tVictor\t21174-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/EDI18175.mp3\tBilly Jones & Ernie Hare\tHenry's Made A Lady Out Of Lizzie\tEDISON\t52200\t18175\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_071.mp3\tErnest Hare And Billy Jones\tHenry's Made A Lady Out Of Lizzie\tVictor\t21174\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67321.mp3\tLouis Armstrong & His Orch.\tHep Cat's Ball\tDECCA\t3283A\t67321\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29866.mp3\tCab Calloway & His Orchestra\tHep Cat's Love Song\tOKEH\t6192\t29866\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_117.mp3\tWalter Van Brunt And John Bieling\tHer Bright Smile Haunts Me Still\tVICTOR\t16970\t10856-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA5665x.mp3\tTony Martin\tHere\tRCA\t20-5665\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_029.mp3\tTony Martin\tHere\tRCA\t20-5665\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/CON16923-1.mp3\tTeddy Hill & His Orch\tHere Comes Cookie (lookie Lookie Lookie)\tCONQUEROR\t8521\t16923-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC12790-4.mp3\tArthur Collins-byron Harlan\tHere Comes Daddy Now\tVICTOR\t17315\t12790-4\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_171.mp3\tPerry Como Feat. Russell Case's Orchestra\tHere Comes Heaven Again\tVICTOR\t1750\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5310.mp3\tGeorgie Auld & His Orch\tHere Comes Heaven Again (lynne Stevens)\tMUSICRAFT\t15043\t5310\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62915.mp3\tBennie Moten Kansas City Orch\tHere Comes Marjorie\tVICTOR\t23391\t62915\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR148179-2.mp3\tBert Lown & His Loungers\tHere Comes My Ball & Chain\tHARMONY\t892-H\t148179-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC48626-3.mp3\tCoon Sanders Nighthawk Orch.\tHere Comes My Ball And Chain\tVICTOR\t21812\t48626-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_064.mp3\tArthur Collins And Byron Harlan\tHere Comes My Daddy Now (oh Pop-oh Pop-oh Pop)\tColumbia\t1277\t38528\t1913\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2587.mp3\tGene Autry\tHere Comes Santa Claus\tCOLUMBIA\t37942\tHCO2587\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_248.mp3\tGene Autry\tHere Comes Santa Claus\tCOLUMBIA\t20377\tHCO2587\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_060.mp3\tGene Autry\tHere Comes Santa Claus (down Santa Claus Lane)\tCOLUMBIA\t37942\tHCO2587\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19733-A.mp3\tStuff Smith & Onyx Club Boys\tHere Comes The Man With The Jive\tVOCALION\t3316\t19733-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC71154.mp3\tAndrews Sisters\tHere Comes The Navy\tDECCA\t18497B\t71154\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_159.mp3\tAndrews Sisters\tHere Comes The Navy\tDECCA\t18497B\t71154\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO25285.mp3\tHarry James And His Orch\tHere Comes The Night\tCOLUMBIA\t35227\tCO25285\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Col25285-1.mp3\tHarry James And His Orchestra\tHere Comes The Night\tColumbia\t35227\t25285-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU24900.mp3\tSix Jumping Jacks\tHere Comes The Show Boat\tBRUNSWICK\t3699\t24900\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148497-1.mp3\tHarry Reser's Syncopators\tHere Comes The Show Boat\tCOLUMBIA\t1835 D\tW148497-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR502-Hy.mp3\tLou Gold And His Orch\tHere Comes The Show Boat\tHarmony\t502-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41377-4.mp3\tJean Goldkette & His Orch\tHere Comes The Showboat\tVICTOR\t21166\t41377-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC63671-3.mp3\tBert Lown Biltmore Hotel Orch\tHere Comes The Sun\tVICTOR\t22541\t63671-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1089.mp3\tVincent Lopez Orch\tHere Comes The Sun\tHit-Of-The-Week\t1089\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BLU82220-1.mp3\tJimmie Lunceford And His Orchestra\tHere Goes\tBLUEBIRD\t6133\t82220-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DCO35189.mp3\tCab Calloway & His Orch\tHere I Go Just Dreamin' Again\tV-DISC\t585\tCO35189\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_290.mp3\tJo Stafford\tHere I'll Stay\tCapitol\t15319\t3601\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_063.mp3\tVic Damone\tHere In My Heart\tMERCURY\t5858\tYB9140-7F\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_118.mp3\tTony Bennett\tHere In My Heart\tCOLUMBIA\t39745\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/ARC13151-A.mp3\tBing Crosby\tHere Is My Heart\tARC\tHA7147\t13151-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COL03454.mp3\tBert Williams\tHere It Comes Again\tCOLUMBIA\tA-3454\t03454\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_030.mp3\tBert Williams\tHere It Comes Again\tCOLUMBIA\tA-3454\t03454\t1906\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN12572-2.mp3\tChick Bullock's Levee Loungers\tHere It Is Monday And I've Still Got A Dollar\tBANNER\t32625\t12572-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23643-1.mp3\tTeddy Wilson & His Orch\tHere It Is Tomorrow Again\tBRUNSWICK\t8259\t23643-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23643-1.mp3\tTeddy Wilson And His Orchestra\tHere It Is Tomorrow Again\tBrunswick\t8259\tB-23643-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU12473A.mp3\tBing Crosby\tHere Lies Love\tBRUNSWICK\t6406\t12473A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_130.mp3\tBing Crosby\tHere Lies Love\tBRUNSWICK\t6406\t12473A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1563.mp3\tGlenn Miller & His Orchestra\tHere We Go Again\tRCA\t20-1563\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_198.mp3\tGlenn Miller And His Orchestra\tHere We Go Again\tRCA\t20-1563\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3h/COL152454-2HC2-7.mp3\tTed Lewis & His Orch\tHere You Come With Love\tCOLUMBIA\t2799 D\t152454-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_142.mp3\tTed Lewis And His Band\tHere You Come With Love\tCOLUMBIA\t2799\tW152454-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP3529.mp3\tBlue Lu Barker\tHere's A Little Girl From Jacksonville\tCAPITOL\t\t3529\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC97711-1.mp3\tBenny Goodman And His Orchestra\tHere's Love In Your Eye\tVICTOR\t25391\t97711-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_296.mp3\tHenry Allen And His Orchestra\tHere's Love In Your Eye\tVOCALION\t3389\t20269-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_124.mp3\tBenny Goodman And His Orchestra\tHere's Love In Your Eyes\tVICTOR\t25391\t97711-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401531-A.mp3\tFred Hall & His Sugar Babies\tHere's That Party Now In Person\tOKeh\t41239\t401531-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC15422.mp3\tAlice Faye Accompanied By Freddy Martin And His Orchestra\tHere's The Key To My Heart\tARC\t\t15422\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67523-A.mp3\tWoody Herman & His Orchestra\tHerman At The Sherman (byfield Stomp)\tDECCA\t3272A\t67523-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_091.mp3\tJohnnie Ray\tHernando's Hideaway\tCOLUMBIA\t40224\tCO51043\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70127.mp3\tMuggsy Spanier & His Orch.\tHesitating Blues\tDECCA\t4271B\t70127\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU101574.mp3\tWingy Manone & His Orch\tHesitation Blues\tBLUEBIRD\t6394\t101574\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKJ-39-1.mp3\tMezzrow - Bechet Quintet\tHey Daddy Blues\tStoryville \tSLP153\tKJ-39-1  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S39.mp3\tSy Oliver & His Orchestra\tHey Daddy-o\tMGM\t10004\t47S39\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE30939.mp3\tCab Calloway & His Orch\tHey Doc\tOKEH\t6354\t30939\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69567.mp3\tInk Spots\tHey Doc\tDECCA\t3987B\t69567\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4588.mp3\tLaine And Stafford\tHey Good Lookin'\tCOLUMBIA\t39570\tHCO4588\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S6029.mp3\tHank Williams\tHey Good Lookin'\tMGM\t11000\t51S6029\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69908-A.mp3\tLucky Millinder And His Orchestra\tHey Huss!\tDecca\t4146\t69908-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69908.mp3\tLucky Millinder & His Orch\tHey Huss'\tDECCA\t4146A\t69908\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLRHCO10521.mp3\tFrankie Laine W P.weston Orch\tHey Joe!\tCOLUMBIA\t40036\tRHCO10521\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71050.mp3\tAndy Kirk & Clouds Of Joy\tHey Lawdy Mama\tDECCA\t4405A\t71050\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68997.mp3\tLouis Armstrong And His Orch.\tHey Lawdy Mama\tDECCA\t60583\t68997\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64733-A.mp3\tCount Basie (piano)\tHey Lawdy Mama\tDECCA\t2722A\t64733-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71050-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tHey Lawdy Mama (meet Me In The Bottom)\tDecca\t4405\t71050-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec71198-A.mp3\tSkeets Tolbert And His Orchestra\tHey Man! Hey Man!\tDecca\t8641\t71198-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC71198.mp3\tSkeets Tolbert Gentlemen Swing\tHey Man, Hey Man\tDECCA\t8641\t71198\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL977.mp3\tClovers\tHey Miss Fannie\tATLANTIC\t977\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB2187.mp3\tCount Basie & His Orchestra\tHey Pretty Baby\tRCA\t20-2948\tD7VB2187\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_281.mp3\tJohnnie Ray\tHey There\tCOLUMBIA\t40224\tCO51042\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_007.mp3\tRosemary Clooney Feat. Buddy Cole And His Orchestra\tHey There\tCOLUMBIA\t40266\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_104.mp3\tSammy Davis Jr. Feat. Sy Oliver's Orchestra\tHey There\tDECCA\t5616\t64563\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_043.mp3\tTex Beneke And The Glenn Miller Orchestra\tHey! Ba-ba-re-bop\tRCA Victor\t1859\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_106.mp3\tLionel Hampton And His Orchestra\tHey! Ba-ba-re-bop\tDecca\t18754\tL-4009-B\t1945\tJoe Morris, Wendell Culley, Dave Page, Jimmy Nottingham, Lammar Wright, Jr. (tp), Jimmy Wormick, Mitchell \"Bootie\" Wood, Andrew Penn, Al Hayse (tb), Bobby Plater, Ben Kynard (as), Arnett Cobb, Johnny Griffin (ts), Charlie Fowlkes (bar), Milt Buckner (p), Billy Mackel (g), Charlie Harris, Ted Sinclair (sb), George Jenkins (dm)\nhttp://www.jazz-on-line.com/a/mp3h/VicD9VB1848-1.mp3\tRose Murphy (the Chee-chee Girl)\tHey! Mama (he's Tryin' To Kiss Me)\tVictor\t\tD9VB1848-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051871.mp3\tFats Waller And His Rhythm\tHey! Stop Kissin' My Sister\tBLUEBIRD\t10829\t051871\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CON13039-1.mp3\tRuth Etting\tHey! Young Fella\tCONQUEROR\t8122\t13039-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-4009-B.mp3\tLionel Hampton And His Orchestra\tHey, Ba-ba-re-bop\tDecca\t18754\tL-4009-B\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_083.mp3\tSunnysiders\tHey, Mr. Banjo\tKapp\t113\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73496.mp3\tEddie Heywood & His Orch\tHeywood Blues\tDECCA\t23677B\t73496\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM619-1.mp3\tCab Calloway & His Orch\tHi De Ho Romeo\tVARIETY\tI651\tM619-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLDAL361.mp3\tHi Flyers\tHi Flyer Stomp\tCOLUMBIA\t20288\tDAL361\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23091.mp3\tRoy Rogers\tHi Ho Silver\tCBS\tVO4190z\t23091\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/SIG565.mp3\tAnita O'day W Will Bradley Or.\tHi Ho Trailus Boot Whip\tSIGNATURE\t15162B\t565\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2041.mp3\tLouis Prima & His Orchestra\tHi Ho Trailus Bootwhip\tMERCURY\t5218\t2041\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73554.mp3\tRoy Eldridge & His Orchestra\tHi Ho, Trailus Boot Whip\tDECCA\t23637\t73554\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69681.mp3\tJimmie Lunceford And His Orch\tHi Spook\tDECCA\t4032A\t69681\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69681-A.mp3\tJimmie Lunceford And His Orchestra\tHi Spook\tDecca\t4032\t69681-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/COL670D.mp3\tTed Lewis And His Band\tHi-diddle-diddle\tCOLUMBIA\t670 D\t142274-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_455.mp3\tRoger Williams\tHi-lili Hi-lo\tKapp\t144\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_415.mp3\tDick Hyman Trio\tHi-lili, Hi-lo\tMGM\t12207\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_416.mp3\tLeslie Caron And Mel Ferrer Feat. Hans Sommer And The Mgm Studio Orchestra\tHi-lili, Hi-lo\tMGM\t30759\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_027alt.mp3\tColumbia Symphony Orchestra\tHiawatha\tCOLUMBIA\t32092\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3b/VICB0267.mp3\tSousa's Band\tHiawatha Two Step\tVICTOR\t17252\tB0267\t1913\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW265116.mp3\tJoe Venuti's Blue Five\tHiawatha's Lullaby\tCOLUMBIA\t-CB637\tW265116\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/DECTB2267.mp3\tAmbrose And His Orchestra\tHide And Seek\tDECCA\t985\tTB2267\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU70655.mp3\tJimmie Davis\tHigh Behind Blues\tBLUEBIRD\t5699\t70655\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/SUNSRC103.mp3\tJoe Sullivan Qt\tHigh Dudgeon\tSUNSET\t100-52\tSRC103\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL685.mp3\tLee O'daniel Hillbilly Boys\tHigh Falutin' Newton\tVOCALION\t4588\tDAL685\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC37214-3.mp3\tCoon Sanders Nighthawk Orch\tHigh Fever\tVICTOR\t20461\t37214-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60836.mp3\tJimmie Davis\tHigh Geared Mama\tDECCA\t5206\t60836\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-7820-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tHigh Hat, Trumpet, And Rhythm\tParlophone\tF-559\tCE-7820-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/Vic49654-1.mp3\tDuke Ellington And His Cotton Club Orchestra\tHigh Life\tVictor\tV-38036\t49654-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP10485.mp3\tTex Ritter\tHigh Noon\tCAPITOL\t\t10485\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47434.mp3\tFrankie Laine\tHigh Noon\tCOLUMBIA\t39770\tCO47434\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE28643-1.mp3\tGene Krupa And His Orch\tHigh On A Windy Hill\tOKEH\t5883\t28643-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU058251-1.mp3\tVaughn Monroe & His Orchestra\tHigh On A Windy Hill\tBLUEBIRD\t10976\t058251-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_110.mp3\tVaughn Monroe And His Orchestra\tHigh On A Windy Hill\tBLUEBIRD\t10976\t058251-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_070.mp3\tWill Bradley And His Orchestra\tHigh On A Windy Hill\tColumbia\t35912\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_065.mp3\tJimmy Dorsey And His Orchestra\tHigh On A Windy Hill\tDECCA\t3585B\t68464\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CON28643-1.mp3\tGene Krupa & His Orch\tHigh On A Windy Hill (v H. Dulany)\tCONQUEROR\t9615\t28643-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68464.mp3\tJimmy Dorsey And His Orch.\tHigh On A Windy Hill (vbe)\tDECCA\t3585B\t68464\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49991.mp3\tJimmie Rodgers\tHigh Powered Mama\tVICTOR\t22523\t49991\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14725-2.mp3\tCharlie Patton\tHigh Sheriff Blues\tARC\tVO2680z\t14725-2\t1934\t\nhttp://www.jazz-on-line.com/mp3/10023951.mp3\tJimmy Noone With Kid Ory's Creo\tHigh Society\tCarousel\t2501\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAP134-8.mp3\tBunny Berigan And His Orch\tHigh Society\tRCA\t20-1503-B\tP134-8\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO41854.mp3\tJimmy Dorsey Dorseyland Jazz\tHigh Society\tCOLUMBIA\t38656\tCO41854\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN215-1.mp3\tSidney Bechet Bluenote Jazzmen\tHigh Society\tBLUENOTE\tBN050A\tBN215-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3754.mp3\tKid Ory's Dixieland Band\tHigh Society\tDECCA\t25134\tL3754\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035393.mp3\tLionel Hampton & His Orch\tHigh Society\tVICTOR\t26209\t035393\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11766-A.mp3\tAbe Lyman & His Orch\tHigh Society\tBRUNSWICK\t6325\t11766-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041457.mp3\tJelly Roll Morton Jazzmen\tHigh Society\tBLUEBIRD\t10434\t041457\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP566-2A.mp3\tNappy Lamare's Louisiana Levee Loungers\tHigh Society\tCAPITOL\t10025\t566-2A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1189-1.mp3\tRoy Eldridge & His Orch\tHigh Society\tVARSITY\t8154\tUS1189-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM2142-B.mp3\tThe Dutch Swing College Band\tHigh Society\tDecca\tM32958\tAM2142-B\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS20014-1.mp3\tSharkey Bonano Sharks-o-rhythm\tHigh Society\tCBS\tCO35678\t20014-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66701.mp3\tBob Crosby & His Orch\tHigh Society\tDECCA\t2848B\t66701\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic035393-1.mp3\tLionel Hampton And His Orchestra\tHigh Society\tVictor\t26209\t035393-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu0414571.mp3\tJelly-roll Morton's New Orleans Jazzmen\tHigh Society\tBluebird\tB-10434\t0414571\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Oke8393-B.mp3\tKing Oliver's Jazz Band\tHigh Society Rag\tOkeh\t4933\t8393-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404430-B.mp3\tLuis Russell & His Orch\tHigh Tension\tOKeh\t8849\t404430-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1565-1.mp3\tCount Basie & His Orchestra\tHigh Tide\tCOLUMBIA\t36990\tHCO1565-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401197-A.mp3\tFrankie Trumbauer & His Orch\tHigh Up On A Hill-top\tOKeh\t41128\t401197-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62451.mp3\tEdgar Hayes & His Orch.\tHigh, Wide And Handsome\tDECCA\t1382\t62451\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC39599-1.mp3\tTed Weems & His Orch\tHighways Are Happy Ways\tVICTOR\t20910\t39599-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20907-A.mp3\tHarold Yates-cooper Lawley\tHighways Are Happy Ways (wh\tVictor\t20907-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC69972-2.mp3\tRudy Vallee & His Ct.yankees\tHikin Down The Highway\tVICTOR\t22751\t69972-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI5336-B.mp3\tVan Eps Banjo Orchestra\tHill And Dale Rag (henry Lodge)\tEDISON\tBA 3213\t5336-B\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2150.mp3\tTexas Jim Lewis\tHill Billy Bill\tDECCA\t5912\tDLA2150\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO42856.mp3\tJimmie Dickens String Band\tHillbilly Fever\tCOLUMBIA\t20677\tCO42856\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK2617-2.mp3\tHank Penny\tHillbilly Jump\tKING\t698B\tK2617-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1471.mp3\tTed Weems & His Orchestra\tHindustan\tMERCURY\t5139\t1471\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU063352.mp3\tAlvino Rey & His Orch\tHindustan\tBLUEBIRD\t11136\t063352\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC071704.mp3\tArtie Shaw And His Orchestra\tHindustan\tVICTOR\t27798\t071704-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO82x.mp3\tBob Scobey's Frisco Band\tHindustan\tGood Time Jazz\t82\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC61989-A.mp3\tBob Crosby's Bobcats\tHindustan\tDECCA\t2482A\t61989-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_168.mp3\tTed Weems And His Orchestra\tHindustan\tMERCURY\t5139\t1471\t1948\t\nhttp://www.jazz-on-line.com/a/mp3h/GRAEP-2020-B-1.mp3\tJoe Venuti, V; Paul Whiteman And His Orchestra\tHindustan\tGRAND AWARD\tEP-2020-B-1\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COLC1417-2.mp3\tSweet Violet Boys\tHinky Dinky Parley Voo Part 1\tCOLUMBIA\t37704\tC1417-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLC1443.mp3\tSweet Violet Boys\tHinky Dinky Parley Voo Part 2\tCOLUMBIA\t37705\tC1443\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC30246.mp3\tBilly Murray-edward Smalle\tHinky Dinky Parlez Voo\tVICTOR\t19388\t30246\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUM885-1.mp3\tDuke Ellington's Famous Orch\tHip Chic\tBRUNSWICK\t8221\tM885-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71241.mp3\tAndy Kirk & Clouds Of Joy\tHip Hip Hooray\tDECCA\t4366A\t71241\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71241-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tHip Hip Hooray\tDecca\t4366\t71241-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/MCA72646.mp3\tAndy Kirk And His Orchestra\tHippy-dippy\tMCA\t3151\t72646\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP60516.mp3\tStan Kenton & His Orch\tHis Feet's Too Big For De Bed\tCAPITOL\t\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP155x.mp3\tBetty Hutton\tHis Rocking Horse Ran Away\tCAPITOL\t155\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_061.mp3\tBetty Hutton\tHis Rocking Horse Ran Away\tCAPITOL\t155\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_103.mp3\tPerry Como Feat. Hugo Winterhalter's Orchestra\tHit And Run Affair\tRCA Victor\t5749\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3h/Cam3532-B.mp3\tOzie Ware Acc. By The Whoopee Makers\tHit Me In The Nose Blues\tCameo\t9039\t3532-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68515.mp3\tSkeets Tolbert Gentlemen Swing\tHit That Jive, Jack\tDECCA\t8528\t68515\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69853.mp3\tKing Cole Trio\tHit That Jive, Jack\tDECCA\t60151\t69853\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec68515-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tHit That Jive, Jack\tDecca\t8528\t68515-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28699.mp3\tSlim Gaillard Flatfoot Floogie\tHit That Mess\tOKEH\t6260\t28699\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69506.mp3\tKing Cole Trio\tHit The Ramp\tDECCA\t8571A\t69506\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_336.mp3\tAndrews Sisters\tHit The Road\tDECCA\t3328\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_051.mp3\tAmerican Quartet\tHitchy-koo\tVictor\t17196\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1445.mp3\tAugie Goupil's Royal Tahitians\tHitirea\tDECCA\t2254A\tDLA1445\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_233.mp3\tLola Ameche Feat. O/al Trace\tHitsity Hotsity\tMERCURY\t5675\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/HITT486.mp3\tLouis Prima & His Orch\tHitsum Kitsum Bumpity Itsum (v L P- L A C)\tHIT OF THE WEEK\t7124\tT486\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D399B1a.mp3\tLouis Prima And His Orchestra (louis Prima And Lily An\tHitsum-kitsum-bumpity-itsum\tV-DISC\t399B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60016-A.mp3\tJimmie Lunceford & His Orch\tHittin' The Bottle\tDECCA\t30349M\t60016-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC63360-1.mp3\tDuke Ellington & His Orch\tHittin' The Bottle\tVICTOR\t23016\t63360-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404269-C.mp3\tFrankie Trumbauer & His Orch\tHittin' The Bottle (vft)\tOKeh\t41437\t404269-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe401995-A.mp3\tSmith Ballew And His Orch\tHittin' The Ceiling (vsb)\tOKeh\t41254\t401995-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC51193-3.mp3\tNat Shilkret & Victor Orch\tHitting The Ceiling (vsl)\tVICTOR\t21969\t51193-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC61091-2.mp3\tGus Arnheim Coconut Grove Orch\tHo Hum (v B. Crosby)\tVICTOR\t22691\t61091-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_077.mp3\tTed Lewis And His Band\tHo Hum!\tCOLUMBIA\t2452 D\tW151517-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_078.mp3\tGus Arnheim And His Orchestra Feat. Bing Crosby And Loyce Whiteman\tHo Hum! (v B. Crosby)\tVICTOR\t22691\t61091-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89014H.mp3\tCount Basie\tHob Nail Boogie\tMERCURY\t89014\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC56528-3.mp3\tJimmie Rodgers\tHobo Bill's Last Ride\tVICTOR\t22421\t56528-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/MOD20-663x.mp3\tJohn Hooker\tHobo Blues\tMODERN\t20/663\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62481.mp3\tSleepy John Estes\tHobo Jungle Blues\tDECCA\t7354\t62481\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU74821-1.mp3\tLouis Armstrong & His Orch\tHobo, You Can't Ride This Train\tBLUEBIRD\t6501B\t74821-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_100.mp3\tLouis Armstrong\tHobo, You Can't Ride This Train\tVICTOR\t24200\t74821-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU81787-1.mp3\tFletcher Henderson & His Orch\tHocus Pocus\tBLUEBIRD\t10247\t81787-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Blu81787-1.mp3\tFletcher Henderson And His Orchestra\tHocus Pocus\tBluebird\tB-5682\t81787-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColWC2574.mp3\tGene Krupa And His Orchestra\tHodge Podge\tColumbia\t35262\tWC2574\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146058-3.mp3\tGid Tanner's Skillet Lickers\tHog Killing Day #1\tCOLUMBIA\t15468 D\tW146058-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146059-2.mp3\tGid Tanner's Skillet Lickers\tHog Killing Day Pt 2\tCOLUMBIA\t15468 D\tW146059-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147613.mp3\tDallas String Band\tHokum Blues\tCOLUMBIA\t14389 D\tW147613\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN15574-1.mp3\tLuis Russell & His Orchestra\tHokus Pokus\tBANNER\t33367\t15574-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_344.mp3\tHarry Belafonte With Hugo Winterhalter's Orchestra And Chorus\tHold 'em, Joe\tRCA Victor\t5617\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU59058.mp3\tJimmie Davis\tHold 'er, Newt\tBLUEBIRD\t6437\t59058\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS6050-2.mp3\tShep Fields & His Rippling Rhythm Vtoni Arden & Bob Johnstone\tHold It Joe\tMUSICRAFT\t546\t6050-2\t\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC41841-2.mp3\tMemphis Stompers\tHold It Still\tVICTOR\t21270\t41841-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152388-2.mp3\tHotel Commodore Do\tHold Me\tCOLUMBIA\t2767-D\tW152388-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1246.mp3\tFrankie Laine W Carl Fisher\tHold Me\tMERCURY\t5158\t1246\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/CAPplhm.mp3\tPeggy Lee\tHold Me\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC75561.mp3\tEddy Duchin & His Orch\tHold Me\tVICTOR\t24280\t75561\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/COL78694-3.mp3\tArt Hickman's Orch\tHold Me\tCOLUMBIA\tA-2899\t78694-3\t1919\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol2767.mp3\tHotel Commodore Orchestra\tHold Me\tColumbia\t2767\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_029.mp3\tHotel Commodore Orchestra\tHold Me\tColumbia\t2767\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_114.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tHold Me\tVICTOR\t24280\t75561\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_127.mp3\tTed Fio Rito And His Orchestra\tHold Me\tBRUNSWICK\t6555\tSF37\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLRR253-1.mp3\tAmos Milburn\tHold Me Baby\tALLADDIN\t3023\tRR253-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_039.mp3\tKaren Chandler Feat. Jack Pleis' Orchestra\tHold Me, Thrill Me, Kiss Me\tCORAL\t60831\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOB2031.mp3\tRay Noble And His Orch\tHold My Hand\tVICTOR\t24034\tOB2031\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_018.mp3\tDon Cornell Feat. Jerry Carr's Orchestra\tHold My Hand\tCoral\t61206\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022435-2.mp3\tFats Waller And His Rhythm\tHold My Hand (vfw)\tVICTOR\t26045\t022435-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC346-1.mp3\tUnion Boys\tHold On\tASCH\t346-1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL25713.mp3\tMildred Bailey W Alec Wilder\tHold On\tCOLUMBIA\t35348\t25713\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D328A2.mp3\tMildred Bailey\tHold On, Keep Your Hand On The Plow\tV-DISC\t328A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1134.mp3\tGene Ammons Sextet\tHold That Money\tMERCURY\t8062\t1134\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU031534-1.mp3\tFats Waller And His Rhythm\tHold Tight\tBLUEBIRD\t10116\t031534-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC033709.mp3\tTommy Dorsey & His Orch\tHold Tight\tVICTOR\t26163\t033709\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_174.mp3\tFats Waller\tHold Tight\tRCA\t20-1581\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64757.mp3\tAndrews Sisters\tHold Tight, Hold Tight\tDECCA\t23606\t64757\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_035.mp3\tAndrews Sisters Feat. Jimmy Dorsey And His Orchestra\tHold Tight, Hold Tight\tDECCA\t23606\t64757\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_103.mp3\tDon Bestor And His Orchestra\tHold Your Man\tVICTOR\t24345\t76467-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152229.mp3\tRuth Etting\tHolding My Honey's Hand\tCOLUMBIA\t2681\tW152229\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU13206A.mp3\tRed Norvo\tHole In The Wall\tBRUNSWICK\t6562\t13206A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC2311x.mp3\tFred Waring And His Orch\tHoliday For Strings\tDECCA\t2311\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1733x.mp3\tSpike Jones City Slickers\tHoliday For Strings\tRCA\t20-1733\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC47S3095.mp3\tDavid Rose And His Orch\tHoliday For Strings\tVICTOR\t27853\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D60B.mp3\tDavid Rose & His Orchestra\tHoliday For Strings\tv-disk\t60B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D421.mp3\tGlenn Miller Army Air Force Band\tHoliday For Strings\tV-Disc\t421\t\t1944-\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_018.mp3\tDavid Rose And His Orchestra\tHoliday For Strings\tV-DISC\t 60B\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_118.mp3\tJimmy Dorsey And His Orchestra\tHoliday For Strings\tDECCA\t18593A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC62728.mp3\tChick Webb And His Orchestra\tHoliday In Harlem\tDECCA\t1521\t62728\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480378.mp3\tBen Webster And Harry Sweets Edison\tHollerin? At Watkins\tClef\tMGC717\t2985-1\t1956\tBen Webster, Ts, Harry Sweets Edison, T, Joe Mondragon, B, Alvin Stoller, D, Barney Kessel, G, Jimmy Rowles, P\nhttp://www.jazz-on-line.com/a/mp3c/CAP2345.mp3\tRed Norvo's Nine\tHollyridge Drive\tCAPITOL\t\t2345\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD141.mp3\tGeorgie Auld\tHollywood Bazaar\tDISC\t102\tD141\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC339.mp3\tJoe Turner\tHollywood Bed - Cherry Red Blues\tNATIONAL\t\tNSC339\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP1397.mp3\tDuke Ellington Orch\tHollywood Hangover\tV-DISC\t505\tVP1397\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26282-A.mp3\tCount Basie And His Orchestra\tHollywood Jump\tColumbia\t291519\t26282-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38681-3.mp3\tRichard M Jones Jazz Wizards\tHollywood Shuffle\tVICTOR\t20812B\t38681-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP585.mp3\tColeman Hawkins & His Orch\tHollywood Stampede\tCAPITOL\t\t585\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5494.mp3\tMuggsy Spanier's Dixielanders\tHome\tMERCURY\t5494\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe405132-A.mp3\tLouis Armstrong & His Orch\tHome\tOKeh\t41552\t405132-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL73.mp3\tGeorge Wettling's New Yorkers\tHome\tKEYNOTE\t1311\tHL73\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU70630-1.mp3\tMildred Bailey W Matty Malneck\tHome\tBLUEBIRD\t7763 B\t70630-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2953.mp3\tErroll Garner Trio\tHome\tMERCURY\t8152\t2953\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0113_02.mp3\tLee Morse\tHome\tPerfect\t12189B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_210.mp3\tLouis Armstrong\tHome\tCOLUMBIA\t2606\tW152093\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_241.mp3\tNat ''king'' Cole\tHome\tCapitol\t1133\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC69910-2.mp3\tPeter Van Steeden And His Orch\tHome (vdr)\tVICTOR\t22868A\t69910-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE35035.mp3\tDuke Ellington & His Orch\tHome Again Blues\tBRUNSWICK\t6003\tE35035\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC24825-3.mp3\tOriginal Dixieland Jazz Band\tHome Again Blues\tVICTOR\t18729A\t24825-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18729.mp3\tOriginal Dixieland Jazz Band\tHome Again Blues\tVictor\t18729\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC25176-3.mp3\tAileen Stanley\tHome Again Blues\tVICTOR\t18760\t25176-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_127.mp3\tFrank Crumit\tHome Again Blues\tCOLUMBIA\tA-3375\t79644\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_075.mp3\tAileen Stanley\tHome Again Blues\tVICTOR\t18760\t25176-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU4543.mp3\tGene Rodemich And His Orchestra\tHome Again Blues\tBRUNSWICK\t2060B\t4543\t1921\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3w/1921_021.mp3\tOriginal Dixieland Jazz Band\tHome Again Blues\tVICTOR\t18729A\t24825-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh187.mp3\tJay Wilbur And His Band\tHome At Sundown\tRex\t9522\tR-3433-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55345.mp3\tJimmie Rodgers\tHome Call\tVICTOR\t23681\t55345\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_059.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tHome For The Holidays\tRCA Victor\t5950\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59067.mp3\tJimmie Davis\tHome In Caroline\tVICTOR\t23749\t59067\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D340B2.mp3\tBob Wills And His Texas Playboys\tHome In San Antoine\tV-DISC\t340B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/OKEH0836.mp3\tBob Wills And His Texas Playboys\tHome In San Antone\tOKEH\t6710\tH0836\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_170.mp3\tBob Wills And His Texas Playboys\tHome In San Antone\tOKEH\t6710\tH0836\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/DECGB6806.mp3\tAmbrose & His Orchestra\tHome James, And Don't Spare The Horses\tDECCA\t372A\tGB6806\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL355.mp3\tHi-flyers\tHome On The Range\tVOCALION\t4011\tDAL355\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA22.mp3\tBing Crosby - Lennie Hayton\tHome On The Range\tBRUNSWICK\t6663\tLA22\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COL30591.mp3\tAlice Nielsen (soprano)\tHome Sweet Home\tCOLUMBIA\tA-5283\t30591\t1910\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3902.mp3\tBing Crosby - Victor Young\tHome Sweet Home\tDECCA\t18705B\tL3902\t1945\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-24062-1.mp3\tHarry James And The Boogie Woogie Trio\tHome, James\tBrunswick\t8350\tB-24062-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_075.mp3\tAlma Gluck\tHome, Sweet Home\tVICTOR\t74251\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144800-3.mp3\tBessie Smith\tHomeless Blues\tCOLUMBIA\t14260 D\tW144800-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC27063.mp3\tBilly Murray And Ed Smalle\tHomesick\tVICTOR\t18982\t27063.\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU8883.mp3\tMarion Harris\tHomesick\tBRUNSWICK\t2329\t8883\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80549-2.mp3\tNora Bayes\tHomesick\tCOLUMBIA\tA-3711\t80549-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru2325.mp3\tCarl Fenton & His Orchestra\tHomesick\tBrunswick\t2325\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_044.mp3\tNora Bayes\tHomesick\tCOLUMBIA\tA-3711\t80549-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR603-1.mp3\tCharles Brown Trio\tHomesick Blues\tALLADDIN\t3039\tRR603-1\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC71529.mp3\tJay Mcshann & His Orchestra\tHometown Blues\tDECCA\t48037\t71529\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC48037.mp3\tJay Mcshann & His Orchestra\tHometown Blues\tDECCA\t48037\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4860.mp3\tBob Wills Texas Playboys\tHometown Stomp\tCOLUMBIA\t20487\tCCO4860\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/Cap4441.mp3\tJo Stafford\tHomework\tCapitol\t57-665\t4441\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_101.mp3\tJo Stafford\tHomework\tCapitol\t57-665\t4441\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76531.mp3\tRed Foley\tHominy Grits\tDECCA\t29494\t76531\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61552-A.mp3\tJimmie Lunceford And His Orchestra\tHonest And Truly\tDecca\t1219\t61552-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_157.mp3\tHenry Burr\tHonest And Truly\tVICTOR\t19597\t31735\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61552-A.mp3\tJimmie Lunceford And His Orchestra\tHonest And Truly.mp3\tDecca\t1219\t61552-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49930-2.mp3\tRudy Vallee Connecticut Yanks\tHoney\tVICTOR\t21869\t49930-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64777.mp3\tAndy Kirk & Clouds Of Joy\tHoney\tDECCA\t2326A\t64777\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC62140.mp3\tClaude Hopkins & His Orchestra\tHoney\tDECCA\t1316\t62140\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_002.mp3\tRudy Vallee And His Connecticut Yankees\tHoney\tVICTOR\t21869\t49930-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64777-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tHoney\tDecca\t2326\t64777-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM54S526.mp3\tArt Mooney And His Orchestra\tHoney Babe\tMGM\t11900\t54S526\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_056.mp3\tBilly Murray\tHoney Boy\tVICTOR\t16818\tB4782\t1907\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1130-A.mp3\tBenny Carter\tHoney Bunny  Boo\tVocalion\t5596\tWM-1130-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC90806-B.mp3\tEddie Cole's Solid Swingers\tHoney Hush\tDECCA\t7210B\tC90806-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038207-2.mp3\tFats Waller And His Rhythm\tHoney Hush\tBLUEBIRD\t10346B\t038207-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_263.mp3\tJoe Turner\tHoney Hush\tATLANTIC\t1001\t1073\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/CONW3529.mp3\tEthel Waters W J.c.heard Orch\tHoney In A Hurry\tCONTIN\t10009\tW3529\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64826-A.mp3\tLouis Jordan & His Tympani 5\tHoney In The Bee Ball\tDECCA\t7556\t64826-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_294.mp3\tFour Aces Feat. O/owen Bradley\tHoney In The Horn\tDECCA\t28691\t84282\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/COL3956.mp3\tArthur Collins And Byron Harlan\tHoney Lou\tCOLUMBIA\tA-0614\t3956\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_060.mp3\tArthur Collins And Byron Harlan\tHoney Lou\tCOLUMBIA\tA-0614\t03956\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_060alt.mp3\tArthur Collins And Byron G. Harlan\tHoney Lou\tIndestructible\t932\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_167.mp3\tDrifters\tHoney Love\tATLANTIC\t1029A\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142875-3.mp3\tBessie Smith\tHoney Man Blues\tCOLUMBIA\t14172 D\tW142875-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_014.mp3\tHenry Burr\tHoney On Our Honeymoon\tColumbia\t741\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB6174-3.mp3\tArthur Collins-byron Harlan\tHoney Won't You Please Come Down\tVICTOR\t16513\tB6174-3\t1908\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC32572-4.mp3\tPaul Whiteman & His Orch\tHoney, I'm In Love With You\tVICTOR\t19671B\t32572-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3h/GEN9502.mp3\tPerley Breed's Orchestra\tHoney, I'm In Love With You\tGENNETT\t3059\t9502\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/BruC-6432.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tHoney, Just For You\tBrunswick\t4981\tC-6432\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62346-A.mp3\tJimmie Lunceford And His Orchestra\tHoney, Keep Your Mind On Me\tDecca\t1355\t62346-A\t1937\tJimmie Lunceford dir. Eddie Tompkins-Paul Webster/Sy Oliver-t-v-a/Elmer Crumbley- Russell Bowles-tb/Eddie Durharn tb-g-a/Willie Smith-cI-as-bar-v-a/Ed Brown as/Dan  Grissom-cl-as-v/Earl Carruthers-cl-as-bar/Joe Thomas-cl-ts/Edwin Wilc ox -p-cel-a/Al \nhttp://www.jazz-on-line.com/a/mp3w/1908_087.mp3\tArthur Collins And Byron Harlan\tHoney, Won't You Please Come Down?\tVICTOR\t5471\tB6174-3\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_043.mp3\tArt Mooney\tHoney-babe\tMGM\t11900 A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/GENX0050.mp3\tFletcher Henderson\tHoneybunch\tGENNETT\t3286\tX0050\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/GenX-50.mp3\tFletcher Henderson And His Orchestra\tHoneybunch\tGennett\t3286\tX-50\t1926\t\nhttp://www.78-tours.net/mp3/PATCPT1052.mp3\tLe Jazz Du Poste Parisien\tHoneymoon Hotel\tPATH\tPA 166\tCPT 1.052 Feldman &\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh106.mp3\tJack Payne And His Band (vocal Billy Scott-coomber)\tHoneymoon Hotel\tImperial\t2939\t6540-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62596.mp3\tWillie Smith & His Cubs\tHoneymoonin' On A Dime\tDECCA\t1503\t62596\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149909.mp3\tCharlie Poole & Roy Harvey\tHoneysuckle\tCOLUMBIA\t15615 D\tW149909\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC61542-A.mp3\tCount Basie And His Orch\tHoneysuckle Rose\tDECCA\t1141\t61542-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC24826.mp3\tFats Waller And His Rhythm\tHoneysuckle Rose\tVICTOR\t24826\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC84921.mp3\tFats Waller And His Rhythm\tHoneysuckle Rose\tVICTOR\t24826\t84921\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOLA1742.mp3\tColeman Hawkins Allstar Jam\tHoneysuckle Rose\tVICTOR\t26219\tOLA1742\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COL16703-2.mp3\tRed Norvo's Swing Octet\tHoneysuckle Rose\tCOLUMBIA\t3059 D\t16703-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07755.mp3\tFats Waller And His Rhythm\tHoneysuckle Rose\tVICTOR\t25779\t07755\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D161-.mp3\tGlenn Miller Aaf Band\tHoneysuckle Rose\tV-DISC\t161\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38410-A.mp3\tDorsey Brothers Orchestra Part 2\tHoneysuckle Rose\tDECCA\t296B\t38410-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/SIGF1002.mp3\tEarl Hines Trio\tHoneysuckle Rose\tSIGNATURE\t28110\tF1002\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82491.mp3\tLouis Armstrong & His Allstars\tHoneysuckle Rose\tDECCA\t28173\t82491\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38409-A.mp3\tDorsey Brothers Orchestra Part 1\tHoneysuckle Rose\tDECCA\t296A\t38409-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06581-2.mp3\tJam Session At Victor\tHoneysuckle Rose\tVICTOR\t25559\t06581-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5436.mp3\tBen Webster & Band\tHoneysuckle Rose\tSAVOY\t553A\tS5436\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO45106.mp3\tErroll Garner Trio\tHoneysuckle Rose\tCOLUMBIA\t39249\tCO45106\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COL265139-2.mp3\tJoe Sullivan\tHoneysuckle Rose\tCOLUMBIA\t2876 D\t265139-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60202.mp3\tMildred Bailey & Her Alleycats\tHoneysuckle Rose\tDECCA\t18108A\t60202\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB3809.mp3\tGene Krupa & His Orchestra\tHoneysuckle Rose\tRCA\t20-3735\tE0VB3809\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYKBF2.mp3\tBud Freeman & His Orch\tHoneysuckle Rose\tKEYNOTE\t637\tKBF2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC13135A.mp3\tHopkins Claude\tHoneysuckle Rose\tARC\t\t13135A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/HITCR352.mp3\tCootie Williams Sextet\tHoneysuckle Rose\tHIT OF THE WEEK\t8088B\tCR352\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CONW3328.mp3\tSlam Stewart Qt\tHoneysuckle Rose\tCONTIN\t10003\tW3328\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66872-A.mp3\tLouis Jordan & His Tympani 5\tHoneysuckle Rose\tDECCA\t25473\t66872-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULA1431-A.mp3\tTeddy Wilson's Qt\tHoneysuckle Rose\tBRUNSWICK\t7964\tLA1431-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26290.mp3\tBenny Goodman & His Orch\tHoneysuckle Rose\tCOLUMBIA\t35319\t26290\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDTB-3523-1.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tHoneysuckle Rose\tDECCA\tF-6639\tDTB-3523-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2256.mp3\tKing Cole Trio\tHoneysuckle Rose\tDECCA\t8535\tDLA2256\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26219.mp3\tColeman Hawkins\tHoneysuckle Rose\tVictor\t26219\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72234.mp3\tJames P Johnson\tHoneysuckle Rose\tDECCA\t23593\t72234\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_245.mp3\tFats Waller\tHoneysuckle Rose\tRCA\t20-1580\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_071.mp3\tJam Session At Victor\tHoneysuckle Rose\tVICTOR\t25559\t06581-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84921-1.mp3\t\"fats\" Waller And His Rhythm\tHoneysuckle Rose\tVictor\t24826\t84921-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/SIGF-1002.mp3\tEarl Hines Trio\tHoneysuckle Rose\tSIGNATURE\t28110\tF-1002\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/SigF-1002.mp3\tEarl Hines Trio\tHoneysuckle Rose\tSignature\t28110\tF-1002\t1944\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD8VB3457.mp3\tRose Murphy (the Chee-chee Girl)\tHoneysuckle Rose\tVictor\t22-0028-A\tD8VB3457\t1948\t\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-3049-A.mp3\tHorace Henderson And His Orchestra\tHoneysuckle Rose\tOKEH\t5579\tWC-3049-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480642.mp3\tBenny Goodman & Company\tHoneysuckle Rose\tColumbia\tSL160\t\t1938\tCarnegie Hall Concert?:<br>Harry James, Buck Clayton (tp), Vernon Brown (tb), Benny Goodman (cl), Johnny Hodges (ss), Lester Young (ts), Harry Carney (bar), Count Basie (p), Freddie Greene (g), Walter Page (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480762.mp3\tBen Webster Quartet\tHoneysuckle Rose\tSavoy\t506\tS5436-2\t1944\tBen Webster (ts), Johnny Guarneri (p), Oscar Pettiford (sb), David ?Chick? Booth (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS481768.mp3\tAnita O'day\tHoneysuckle Rose\tVerve\tMGV2036\t2565-1\t1955\tacc. by Milt Bernhart, Lloyd Elliott, Joe Howard, Si Zentner (tb), Paul Smith (p), Barney Kessel (g), Joe Mondragon (sb), Alvin Stoller (dm), Buddy Bregman (arr, dir)\nhttp://www.jazz-on-line.com/a/mp3b/BRUC7880.mp3\tFrankie Trumbauer & His Orch\tHoneysuckle Rose (v3)\tBRUNSWICK\t6159\tC7880\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Col152324-1.mp3\tFletcher Henderson And His Orchestra\tHoneysukle Rose\tColumbia\t2732-D\t152324-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC038108.mp3\tTommy Dorsey And His Orch\tHong Kong Blues\tVICTOR\t26636\t038108\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2984-B.mp3\tHoagy Carmichael\tHong Kong Blues\tDECCA\t18395A\tDLA2984-B\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_077.mp3\tHoagy Carmichael\tHong Kong Blues\tDECCA\t18395A\tDLA2984-B\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_100.mp3\tTommy Dorsey And His Orchestra Feat. Skeets Herfurt\tHong Kong Blues\tVICTOR\t1722\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC33157-4.mp3\tCoon-sanders Nighthawk Orch\tHong Kong Dream Girl\tVICTOR\t19754\t33157-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_020b.mp3\tBill Doggett\tHonky Tonk (part 2)\tKing\t4950 B\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_020.mp3\tBill Doggett\tHonky Tonk (parts 1 & 2)\tKing\t4950\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S6129.mp3\tHank Williams\tHonky Tonk Blues\tMGM\t30639\t51S6129\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL938.mp3\tHi-flyers\tHonky Tonk Mama\tVOCALION\t5054\tDAL938\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CONSC73.mp3\tRoy Acuff Smoky Mountain Boys\tHonky Tonk Mamas\tCONQUEROR\t9257\tSC73\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/JazMLB-149.mp3\tJelly-roll Morton\tHonky Tonk Music\tJazz Man\t11\tMLB-149\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30366.mp3\tMeade Lux Lewis\tHonky Tonk Train Blues\tCOLUMBIA\t37336\tCO30366\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC91536.mp3\tBob Crosby & His Orch\tHonky Tonk Train Blues\tDECCA\t2208A\tC91536\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1420-1.mp3\tFrankie Trumbauer Orch\tHonky Tonk Train Blues\tVARSITY\t8236\tUS1420-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLURS791-B.mp3\tMeade Lux Lewis\tHonky Tonk Train Blues\tBLUENOTE\t015\tRS791-B\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM47S6025.mp3\tHank Williams\tHonky Tonkin'\tMGM\t10171\t47S6025\t1947\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU14052.mp3\tGene Rodemich And His Orchestra\tHonolou\tBRUNSWICK\t2760\t14052\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3c/VIC033731.mp3\tTommy Dorsey & His Orch\tHonolulu\tVICTOR\t26172\t033731\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_324.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tHonolulu\tVICTOR\t26172\t033731\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/OKeW81414-B.mp3\tMiff Mole's Little Molers\tHonolulu Blues\tOKeh\t40984\tW81414-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COL45913.mp3\tPali Kula And Dave Kaili\tHonolulu Rag\tCOLUMBIA\tA1861\t45913\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU94422.mp3\tHarry Chatmon (carter)\tHoo Doo Blues\tBLUEBIRD\t6095\t94422\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU19425-6.mp3\tBen Selvin And His Orch\tHoodle-dee-doo-dee-doo-doo\tBRUNSWICK\t3213\t19425-6\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE21848.mp3\tDykes Magic City Trio\tHook And Line\tBRUNSWICK\t128\tE21848\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP980x.mp3\tKay Starr\tHoop-dee-doo\tCAPITOL\t980\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA3747x.mp3\tPerry Como\tHoop-dee-doo\tRCA\t20\t3747x\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_024.mp3\tKay Starr\tHoop-dee-doo\tCapitol\t980\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_016.mp3\tPerry Como And Fontane Sisters\tHoop-dee-doo\tRCA Victor\t3747\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_177.mp3\tDoris Day Feat. George Wyle's Orchestra With The Mellomen\tHoop-dee-doo\tCOLUMBIA\t38771\tHCO4031\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_327.mp3\tJohnny Mercer\tHooray For Love\tCapitol\t15028\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20471-Bx.mp3\tJean Goldkette And His Orch\tHoosier Sweetheart\tVICTOR\t20471\t37584-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_110.mp3\tRuth Etting\tHoosier Sweetheart\tCOLUMBIA\t924 D\tW143550\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL6819.mp3\tBing Crosby-b.hope-peggy Lee\tHoot Mon\tDECCA\t28514\tL6819\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93731.mp3\tJay Mcshann & His Orchestra\tHootie Blues\tDECCA\t8559B\tC93731\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MER20233.mp3\tJay Mcshann's Sextet\tHootie Boogie\tMERCURY\t8002\t20233\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93816.mp3\tJay Mcshann Quartet\tHootie's Ignorant Oil\tDECCA\t8635B\tC93816\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2646.mp3\tTexas Jim Lewis\tHootin Nannie Annie\tDECCA\t6001\tDLA2646\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143706-2.mp3\tDuke Ellington Washingtonians\tHop Head\tCOLUMBIA\t953 D\tW143706-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/Col143706-2.mp3\tDuke Ellington And His Washingtonians\tHop Head\tColumbia\t953-D\t143706-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW144955-3.mp3\tFletcher Henderson And His Orch\tHop Off\tCOLUMBIA\t35670\tW144955-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/BruC-2315-A.mp3\tFletcher Henderson And His Orchestra\tHop Off\tBrunswick\t4119\tC-2315-A  \t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM49S261.mp3\tArt Mooney And His Orchestra\tHop Scotch Polka\tMGM\t10500\t49S261\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP990.mp3\tDuke Ellington Orch\tHop Skip And Jump\tV-DISC\t355\tVP990\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35342.mp3\tGene Krupa & His Orch\tHop Skip And Jump\tCOLUMBIA\t36931\tCO35342\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61313.mp3\tBob Howard & His Orch\tHop Skip Jump\tDECCA\t983B\t61313\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D355A1.mp3\tDuke Ellington And His Orchestra\tHop Skip Jump\tV-DISC\t355A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1105.mp3\tArtie Shaw And His Gramercy Five\tHop, Skip And Jump\tRCA\t20-1800\tD5VB1105\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT587.mp3\tDemarco Sisters+bud Freeman\tHop, Skip And Jump\tMAJESTIC\t7160\tT587\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/MANS1275.mp3\tSlam Stewart Trio\tHop, Skip, Jump\tMANOR\t1012\tS1275\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_243.mp3\tThe Ames Brothers With Hugo Winterhalter And His Orchestra\tHopelessly\tRCA Victor\t5840\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC11895-A.mp3\tClaude Hopkins & His Orch\tHopkins Scream\tARC\t\t11895-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2083.mp3\tBenny Goodman And His Orchestra\tHora Staccato\tCOLUMBIA\t37207\tHCO2083\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD6VB2482.mp3\tPat Flowers & His Rhythm\tHorizontal\tRCA\t20-1980\tD6VB2482\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_082.mp3\tAmbrose And His Orchestra\tHors D'oeurves\tDECCA\t500\tGB6853\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECGB6853.mp3\tAmbrose Orchestra\tHors D'oeuvres\tDECCA\t500\tGB6853\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/Glo3866.mp3\tCliff Jackson And His Krazy Kats\tHorse Feathers\tGlobe\t1839\t3866\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC34676-2.mp3\tGeorge Olsen And His Music\tHorses (vf.frey)\tVICTOR\t19977A\t34676-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_164.mp3\tKay Kyser And His Orchestra\tHorses Don't Bet On People\tCOLUMBIA\t36824\tHCO1402\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE28517.mp3\tCab Calloway & His Orch\tHot Air\tOKEH\t5950\t28517\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/GEN9726.mp3\tRichard Hitter's Blue Knights\tHot Aire\tGENNETT\t3149\t9726\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12006-A.mp3\tDon Redman & His Orch\tHot And Anxious\tBRUNSWICK\t6368\t12006-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Col151443-1.mp3\tFletcher Henderson And His Orchestra\tHot And Anxious\tColumbia\t2449-D\t151443-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401177-A.mp3\tDuke Ellington & His Orch\tHot And Bothered\tOKeh\t8623\t401177-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_481.mp3\tSarah Vaughan\tHot And Cold Running Tears\tMercury\t70846\tYBM12833 3\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/PAR20928-2.mp3\tRichard Jones Jazz Wizards\tHot And Ready\tPARAMOUNT\t12705\t20928-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC72688-1.mp3\tAlex Bartha And His Orch.\tHot Biscuits\tVICTOR\t24059\t72688-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC72688-1HC1-2.mp3\tAlex Bartha And His Orch.\tHot Biscuits\tVICTOR\t24059\t72688-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW255001.mp3\tBen Selvin's Orch\tHot Cha Medley\tCOLUMBIA\t18000D\tW255001\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic81093-1.mp3\tCab Calloway And His Cotton Club Orchestra\tHot Cha Razz-ma-tazz\tVictor\t24690\t81093-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic010571-1.mp3\tMezz Mezzrow And His Orchestra\tHot Club Stomp\tVictor\t25612\t010571-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh089.mp3\tJack Payne And His Band (vocal Billy Scott-coomber)\tHot Coffee\tImperial\t2677\t6014-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_016.mp3\tPerry Como\tHot Diggity (dog Diggity Boom)\tRCA Victor\t6427 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_332.mp3\tBill Haley And His Comets\tHot Dog Buddy Buddy\tDecca\t29948\t89615\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC89615.mp3\tBill Haley And His Comets\tHot Dog Buddy Buddy\tDECCA\t29948\t89615\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_205.mp3\tVan Alexander And His Orchestra Vocal Butch Stone\tHot Dog Joe\tVariety\t8082\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67667.mp3\tThree Peppers\tHot Dogs\tDECCA\t3342A\t67667\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA177-A.mp3\tTed Fiorito And His Orch\tHot Dogs & Sarsparilla\tBRUNSWICK\t6924\tLA177-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU49768.mp3\tDuke Ellington & His Orch\tHot Feet\tBLUEBIRD\t6335\t49768\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic49768-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tHot Feet\tVictor\tV-38065\t49768-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401960-C.mp3\tEddy Lang & His Orch\tHot Heels\tOKeh\t8696\t401960-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCE-7395.mp3\tJack Pettis And His Pets\tHot Heels\tVOCALION\t15703\tE-7395\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/CAM3912-A.mp3\tCotton Pickers (the Whopee Makers)\tHot Heels\tCAMEO\t9207\t3912-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/MUSG568.mp3\tDizzy Gillespie Quintet\tHot House\tMUSICRAFT\t486\tG568\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152614-2.mp3\tHenry Busse And His Orch\tHot Lips\tCOLUMBIA\t2937 D\tW152614-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/DECC9528.mp3\tHenry Busse And His Orch\tHot Lips\tDECCA\t198B\tC9528\t1934\t\nhttp://www.jazz-on-line.com/a/mp3l/Ban1101-2.mp3\tSpecht's Jazz Outfit\tHot Lips\tBanner\t1090\t1101-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC26650-2.mp3\tPaul Whiteman And His Orch\tHot Lips\tVICTOR\t18920\t26650-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUB21259-3.mp3\tHorace Heidt & His Brigadiers\tHot Lips\tBRUNSWICK\t7916\tB21259-3\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80463-6.mp3\tTed Lewis & His Jazz Band\tHot Lips\tCOLUMBIA\tA-3676\t80463-6\t1922\t\nhttp://www.jazz-on-line.com/a/mp3d/HMWOLA-1707-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tHot Lips\tHMW\tB-8690\tOLA-1707-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_327.mp3\tHenry Busse And His Orchestra\tHot Lips\tBANNER\t33260\t152614-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_076.mp3\tCotton Pickers\tHot Lips\tBRUNSWICK\t2292\t8270\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC041408.mp3\tLionel Hampton And His Orch\tHot Mallets\tVICTOR\t26371\t041408\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic041408-1.mp3\tLionel Hampton And His Orchestra\tHot Mallets\tVictor\t26371\t041408-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20991.mp3\tFletcher Henderson & His Orch.\tHot Mustard\tBRUNSWICK\t3406\t20991\t1926\t\nhttp://www.jazz-on-line.com/a/mp3l/BRUE18362.mp3\tGene Rodemich And His Orchestra\tHot Notes\tBRUNSWICK\t3073A\tE18362\t1926\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3w/1939_177.mp3\tWill Glahe\tHot Pretzels\tVictor\tV-710\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiPat021051.mp3\tNathan Glantz & His Orchestra\tHot Roasted Peanuts\tPath\t021051\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU11928.mp3\tGene Rodemich And His Orchestra\tHot Roasted Peanuts\tBRUNSWICK\t2525A\t11928\t1923\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3a/CAPrjd.mp3\tRamblin' Jimmie Dolan\tHot Rod Race\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_291.mp3\tTiny Hill And His Orchestra\tHot Rod Race\tMERCURY\t5547\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143584-2.mp3\tBessie Smith\tHot Springs Blues\tCOLUMBIA\t14569 D\tW143584-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM781.mp3\tJoe Marsala Chicagoans\tHot String Beans\tVOCALION\t4168\tM781\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG14323.mp3\tWilliam Harris\tHot Time Blues\tGENNETT\t6707\tG14323\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3449.mp3\tBing Crosby And Andrews Sisters\tHot Time In The Old Town Of Berlin\tDECCA\t23350-B\tL3449\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12340-1.mp3\tCab Calloway & His Orchestra\tHot Toddy\tBRUNSWICK\t6400\t12340-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_168.mp3\tCab Calloway And His Orchestra\tHot Toddy\tBRUNSWICK\t6400\t12340-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru12340-A.mp3\tCab Calloway And His Orchestra\tHot Toddy\tBrunswick\t6400\t12340-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_051.mp3\tRalph Flanagan And His Orchestra\tHot Toddy\tRCA VICTOR\t5095\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban12696-A.mp3\tCab Calloway And His Orchestra\tHot Water\tBanner\t32647\t12696-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN12696-1.mp3\tCab Calloway & His Orch\tHot Water (v C C)\tBANNER\t32647\t12696-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU42931-2.mp3\tBennie Moten's Kansas City Or.\tHot Water Blues\tBLUEBIRD\t7938\t42931-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D125B1.mp3\tSpike Jones And His City Slickers\tHotcha Cornia\tV-DISC\t125B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA30-0818.mp3\tSpike Jones\tHotcha Cornia\tRCA\t30-0818\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC81093-1.mp3\tCab Calloway & His Orchestra\tHotcha Razz Ma Tazz\tVICTOR\t24690\t81093-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38725.mp3\tFletcher Henderson & His Orch\tHotter Than 'ell\tDECCA\t3518A\t38725\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC38725-A.mp3\tFletcher Henderson And His Orchestra\tHotter Than 'ell\tDECCA\t555\t38725-A  \t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480634.mp3\tFletcher Henderson & His Orch.\tHotter Than 'ell\tDecca\t555\t38725-A\t1934\tRussell Smith, Irving Randolph, Henry Allen (tp), Keg Johnson, Claude Jones (tb), Buster Bailey, Hilton Jefferson, Russell Procope (cl, as), Benny Carter (as), Ben Webster (ts), Fletcher Henderson (p), Lawrence Lucie (g), Elmer James (sb), Walter Johnson (dm)\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP5026.mp3\tLouis Armstrong's Hot Five\tHotter Than Hot\tCOLUMBIA\t39226\tZSP5026\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE82055-B.mp3\tLouis Armstrong's Hot Five\tHotter Than That\tOKEH\t8535\t82055-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_113.mp3\tLouis Armstrong\tHotter Than That\tOKEH\t8535\t82055-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCB131.mp3\tJimmy Luverte And His Society Troubadours\tHottest Girl In Town\tVOCALION\t03559\tB131\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_002.mp3\tElvis Presley\tHound Dog\tRCA Victor\t6604\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC101255.mp3\tBenny Goodman And His Orchestra\tHouse Hop\tVICTOR\t25350A\t101255\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_209.mp3\tAndrews Sisters\tHouse Of Blue Lights\tDECCA\t23641\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP678-2A.mp3\tCootie Williams & His Orch\tHouse Of Joy\tCAPITOL\t\t678-2A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic049674-1.mp3\tLionel Hampton And His Orchestra\tHouse Of Morgan\tVictor\t26751\t049674-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC27991HP.mp3\tSy Oliver\tHouse Party\tDECCA\t27991\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-12-1.mp3\tArt Hodes Trio With Mezz Mezzrow\tHouse Party\tKing Jazz\t143\tKJ-12-1  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/AJA31508.mp3\tFletcher Henderson's Orch\tHouse Rent Ball\tAJAX\tAJX17023\t31508\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81884-4.mp3\tBessie Smith\tHouse Rent Blues\tCOLUMBIA\t14032 D\t81884-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16540-1.mp3\tLouis Prima & His Gang\tHouse Rent Party\tBRUNSWICK\t7376\t16540-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-16540-A.mp3\tLouis Prima And His New Orleans Gang\tHouse Rent Party Day\tBrunswick\t7376\tB-16540-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81838-1.mp3\tFletcher Henderson's Orch\tHouston Blues\tCOLUMBIA\t164D\t81838-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68149.mp3\tSam Price's Texas Blusicians\tHow 'bout That Mess\tDECCA\t8505B\t68149\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CON28754-1.mp3\tGene Krupa & His Orch\tHow 'bout That Mess (v I. Day)\tCONQUEROR\t9795\t28754-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93783.mp3\tLouis Jordan & His Tympani 5\tHow 'bout That?\tDECCA\t8605\tC93783\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69911.mp3\tLucky Millinder & His Orch\tHow About That Mess?\tDECCA\t4099A\t69911\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69911-A.mp3\tLucky Millinder And His Orchestra\tHow About That Mess?\tDecca\t4099\t69911-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC83377-1.mp3\tIna Ray Hutton And Melodears\tHow About Tomorrow Night\tVICTOR\t24692\t83377-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC4045-1.mp3\tDick Jurgens And His Orch\tHow About You\tOKEH\t6535\tC4045-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_087.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra\tHow About You?\tVICTOR\t27749\t061991\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC061991.mp3\tTommy Dorsey And His Orch\tHow About You? (vfs)\tVICTOR\t27749\t061991\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11366-A.mp3\tDon Redman & His Orch\tHow Am I Doin', Hey, Hey\tBRUNSWICK\t6273\t11366-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC56138.mp3\tGene Austin\tHow Am I To Know\tVICTOR\t22128\t56138\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62060.mp3\tGlenn Miller's Orchestra\tHow Am I To Know\tDECCA\t1239\t62060\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4742.mp3\tBillie Holiday W Eddy Heywood\tHow Am I To Know\tCOMMODORE\t569\t4742\t1944\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic22128.mp3\tGene Austin\tHow Am I To Know\tVictor\t22128\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh022.mp3\tArthur Young And Hatchetts Swingtette\tHow Am I To Know (v Beryl Davis)\tDecca\tF-7624\tDR-4581-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037135.mp3\tTommy Dorsey & His Orch\tHow Am I To Know?\tVICTOR\t26294\t037135\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/Pol2814bkp.mp3\tSam Wooding's Chocolate Kiddies\tHow Am I To Know?\tPolydor\t22994\t2814bkp\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_104.mp3\tArden-ohman Orchestra Feat. Scrappy Lambent\tHow Am I To Know?\tVICTOR\t22111\t55651-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_220.mp3\tTommy Dorsey And His Orchestra Feat. V/jack Leonard\tHow Am I To Know?\tVICTOR\t26294\t037135\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402964-A.mp3\tFrankie Trumbauer & His Orch\tHow Am I To Know? (v S B)\tOKeh\t41301\t402964-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO37013.mp3\tBuddy Clark\tHow Are Things In Glocca Mora\tCOLUMBIA\t37223\tCO37013\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_067.mp3\tBuddy Clark Feat. Mitchell Ayres' Orchestra\tHow Are Things In Glocca Mora\tCOLUMBIA\t37223\tCO37013\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_108.mp3\tTommy Dorsey And His Orchestra Feat. Stuart Foster\tHow Are Things In Glocca Mora?\tVICTOR\t2121\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23825.mp3\tLucky Millinder's Orchestra\tHow Big Can You Get, Little Man\tDECCA\t23825\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73395.mp3\tLucky Millinder And His Orchestra\tHow Big Can You Get, Little Man?\tDecca\t23825\t73395\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC57743.mp3\tBlind Alfred Reed\tHow Can A Poor Man Stand Such Times?\tVICTOR\t40236\t57743\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63221-A.mp3\tJabbo Smith And His Orchestra\tHow Can Cupid Be So Stupid?\tDecca\t1712\t63221-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014645-1.mp3\tFats Waller And His Rhythm\tHow Can I\tVICTOR\t25864\t014645-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN818HC.mp3\tZeb Turner\tHow Can I\tKING\t818\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu48918.mp3\tAbe Lyman And His Californians\tHow Can I Ever Be Alone\tBluebird\t10731\t48918\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27302.mp3\tMildred Bailey\tHow Can I Ever Be Alone?\tCOLUMBIA\t35532\t27302\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2009.mp3\tBob Wills And His Texas Playboys\tHow Can It Be Wrong (vjimmy Widener)\tCOLUMBIA\t37564\tHCO2009\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB5085.mp3\tRay Noble & His Orch\tHow Can We Be Wrong\tVICTOR\t24872\tOB5085\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64614.mp3\tAndy Kirk & Clouds Of Joy\tHow Can We Be Wrong?\tDECCA\t2081A\t64614\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64614-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tHow Can We Be Wrong?\tDecca\t2081\t64614-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_279.mp3\tEddy Duchin And His Orchestra Feat. V/stanley Worth\tHow Can We Be Wrong?\tBRUNSWICK\t8224\t23410\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC84418-1.mp3\tFats Waller And His Rhythm\tHow Can You Face Me\tVICTOR\t24737\t84418-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84418-1.mp3\t\"fats\" Waller And His Rhythm\tHow Can You Face Me\tVictor\t24737\t84418-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU22459-1.mp3\tRed Norvo & His Orch\tHow Can You Forget (v Terry Allen)\tBRUNSWICK\t8089\t22459-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC018421.mp3\tTommy Dorsey & His Orch\tHow Can You Forget?\tVICTOR\t25799\t018421\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38048.mp3\tBeatrice Kay\tHow Come The Mortgage Got Paid\tCOLUMBIA\t38373\tCO38048\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP9514.mp3\tErroll Garner (piano)\tHow Come You Do Me Like You Do\tCOLUMBIA\t39748\tZSP9514\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COMA4803.mp3\tGeorge Wettling Rhythm Kings\tHow Come You Do Me Like You Do\tCOMMODORE\t561\tA4803\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11911-1.mp3\tCab Calloway And His Orchestra\tHow Come You Do Me Like You Do\tBanner\t32540\t11911-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5728-1-2-3.mp3\tFletcher Henderson & His Orch\tHow Come You Do Me Like You Do?\tBANNER\t1445\t5728-1-2-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU-7.mp3\tMarion Harris\tHow Come You Do Me Like You Do?\tBRUNSWICK\t2610\t-7\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_048.mp3\tMarion Harris\tHow Come You Do Me Like You Do?\tBRUNSWICK\t2610\t7\t1924\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU14709.mp3\tGene Rodemich And His Orchestra\tHow Come You Do Me Like You Do?\tBRUNSWICK\t2824B\t14709\t1925\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3d/Ban5728-1.mp3\tFletcher Henderson And His Orchestra\tHow Come You Do Me Like You Do?\tBanner\t\t5728-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR142329.mp3\tBluegrass Footwarmers\tHow Could I Be Blue?\tHARMONY\t206-H\t142329\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU19707-8.mp3\tSix Jumping Jacks\tHow Could Red Riding Hood? (have Been So Very Good\tBRUNSWICK\t3254\t19707-8\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_314.mp3\tFred Astaire Feat. V/jane Powell\tHow Could You Believe Me When I Said I Loved You When You Know I've Been A Liar All My Life\tMGM\t30316A\t50S3168\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03991.mp3\tTommy Dorsey & His Orch\tHow Could You?\tVICTOR\t25513\t03991\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DECC91082.mp3\tAnson Weeks And His Orchestra\tHow Could You?\tDECCA\t1134\tC91082\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_117.mp3\tAnson Weeks And His Orchestra\tHow Could You?\tDECCA\t1134\tC91082\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC73708-1.mp3\tEthel Merman\tHow Deep In The Ocean\tVICTOR\t24146\t73708-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU12448-A.mp3\tGuy Lombardo Royal Canadians\tHow Deep Is The Ocean\tBRUNSWICK\t6399\t12448-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO31363-3.mp3\tBenny Goodman And His Orchestra\tHow Deep Is The Ocean\tCOLUMBIA\t36754\tCO31363-3\t1941\tvocal Peggy Lee\nhttp://www.jazz-on-line.com/a/mp3a/VIC73584.mp3\tPaul Whiteman And His Orch\tHow Deep Is The Ocean\tVICTOR\t24141\t73584\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT533.mp3\tLouis Prima & His Orchestra\tHow Deep Is The Ocean\tMAJESTIC\t7145\tT533\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU12472-A.mp3\tBing Crosby\tHow Deep Is The Ocean\tBRUNSWICK\t6406\t12472-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC73584-1.mp3\tPaul Whiteman & His Orch Vocal Jack Fulton\tHow Deep Is The Ocean (vjf)\tVICTOR\t24141B\t73584-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5418.mp3\tArtie Shaw And His New Music\tHow Deep Is The Ocean?\tMUSICRAFT\t409\t5418\t1945\tvocal Hal Stevens\nhttp://www.jazz-on-line.com/a/mp3c/SIGT1906-1.mp3\tColeman Hawkins & His Orch\tHow Deep Is The Ocean?\tSIGNATURE\t28102A\tT1906-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480442.mp3\tBen Webster And Harry Sweets Edison\tHow Deep Is The Ocean?\tClef\tMGC 717\t2984-2\t1956\tBen Webster, Ts, Harry Sweets Edison, T, Joe Mondragon, sB, Barney Kessel, G, Jimmy Rowles, P, Alvin Stoller (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480471.mp3\tBen Webster And Oscar Peterson\tHow Deep Is The Ocean?\tVerve\tMGV8349\t22995-3\t1959\tBen Webster (ts), Oscar Peterson, P Ed Thigpen, D, Ray Brown, B\nhttp://www.jazz-on-line.com/a/mp3w/1945_251.mp3\tBenny Goodman And His Orchestra Feat. Peggy Lee, Vcl\tHow Deep Is The Ocean?\tCOLUMBIA\t36754\tCO31363-3\t1941\tBilly Butterfield, Cootie Williams, Jimmy Maxwell, Al Davis (tp), Lou McGarity, Cutty Cutshall (tb), Benny Goodman (cl), Skippy Martin, Clint Neagley (as), Vido Musso, George Berg (ts), Chuck Gentry (bar), Mel Powell (p), Tom Morgan (g), Sid Weiss (sb), Ralph Collier (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1932_083.mp3\tRudy Vallee And His Connecticut Yankees\tHow Deep Is The Ocean? (how-high-is-the-sky?)\tCOLUMBIA\t2724 D\tW152313\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh188.mp3\tHarry Leader And His Band\tHow Did He Look ? (v Julie Dawn)\tRegal Zonophone\tMR-3481\tCAR-6058-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70542.mp3\tMaxine Sullivan\tHow Do I Know It's Real?\tDECCA\t4307A\t70542\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/CONLA127-A.mp3\tGuy Lombardo & Royal Canadians\tHow Do I Know It's Sunday (v3)\tCONQUEROR\t8379\tLA127-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic55854-2.mp3\tHerny ''red'' Allen And His New York Orchestra\tHow Do They Do It That Way\tVictor\tV-38088\t55854-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC067914.mp3\tTommy Dorsey And His Orch\tHow Do You Do Without Me ?\tVICTOR\t27710\t067914\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/OKe72921-A.mp3\tBilly Jones\tHow Do You Do?\tOKeh\t40217\t72921-A\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_099.mp3\tErnest Hare And Billy Jones\tHow Do You Do?\tEdison Diamond Disc\t51500-R\t9943 C-3-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_430.mp3\tGordon Macrae\tHow Do You Speak To An Angel?\tCapitol\t2352\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_105.mp3\tEddie Fisher\tHow Do You Speak To An Angel?\tRCA Victor\t5137\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D808.mp3\tLouis Jordan Tympany 5\tHow High Am I - Hey Now Let's Live\tV-DISC\t376\t808\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1451x.mp3\tLes Paul And Mary Ford\tHow High The Moon\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26491.mp3\tBenny Goodman And His Orchestra\tHow High The Moon\tCOLUMBIA\t35391\t26491\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/SIG657-2.mp3\tAnita O'day With Ralph Burns O\tHow High The Moon\tSIGNATURE\t15185A\t657-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44425.mp3\tErroll Garner Trio\tHow High The Moon\tCOLUMBIA\t39145\tCO44425\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73844.mp3\tLionel Hampton Quintet\tHow High The Moon\tDECCA\t24513\t73844\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS5025HH.mp3\tMary Lou Williams\tHow High The Moon\tDISC\t5025\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8943HH.mp3\tOscar Peterson\tHow High The Moon\tMERCURY\t8943\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5228.mp3\tHerman Chittison Trio\tHow High The Moon\tMUSICRAFT\t315\t5228\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SIGRHT1-A.mp3\tEddie Heywood & His Orch\tHow High The Moon\tSIGNATURE\t40002A\tRHT1-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74324.mp3\tElla Fitzgerald & Daydreamers\tHow High The Moon\tDECCA\t24387\t74324\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/SAV5846.mp3\tDon Byas Quintette\tHow High The Moon\tSAVOY\t597A\t5846\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-450-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tHow High The Moon\tSWING\t253\tOSW-450-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/JCFST-1227-2.mp3\tLe ''jazz Club Mystery Hot Band'' (with Django Reinhardt)\tHow High The Moon\tJazz Club Franais\t120\tST-1227-2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP559-2A.mp3\tAl Casey's Sextet\tHow High The Moon\tCAPITOL\t\t559-2A\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiSweh.mp3\tTeddy Wilson All Stars\tHow High The Moon\tSweet & Hot - Jazz A\t\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_259.mp3\tMitchell Ayres And His Fashions In Music\tHow High The Moon\tBluebird\t10609\t047025-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480564.mp3\tArt Tatum And Lionel Hampton\tHow High The Moon\tClef\tMGC709\t2387-2\t1955\tArt Tatum (p), Lionel Hampton (vib), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1940_155.mp3\tBenny Goodman And His Orchestra\tHow High The Moon\tCOLUMBIA\t35391\t26491\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/ASC453X.mp3\tArt Tatum \tHow High The Moon (1 & 2)\tASCH\t453\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80379.mp3\tLouis Armstrong & His Orch\tHow High The Moon Pt.1\tDECCA\t28104\t80379\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80380.mp3\tLouis Armstrong & His Orch\tHow High The Moon Pt.2\tDECCA\t28103\t80380\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140106.mp3\tEddie Cantor\tHow I Love That Girl\tCOLUMBIA\t234D\t140106\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_085.mp3\tSarah Vaughan\tHow Important Can It Be\tMercury\t70534\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM54S620.mp3\tJoni James\tHow Important Can It Be ?\tMGM\t11919\t54S620\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_131b.mp3\tTeresa Brewer\tHow Important Can It Be?\tCoral\t61362\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_022.mp3\tJoni James\tHow Important Can It Be?\tMGM\t11919\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_291.mp3\tKay Starr\tHow It Lies, How It Lies, How It Lies\tCapitol\t15419\t3988\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041973-1.mp3\tWingy Manone & His Orch\tHow Long Blues\tBLUEBIRD\t10749\t041973-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUC-2659.mp3\tWalter Barnes And His Royal Creolians\tHow Long Blues\tBRUNSWICK\t4187\tC-2659\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC64731.mp3\tCount Basie (piano)\tHow Long Blues\tDECCA\t60246\t64731\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWC-2634-A.mp3\tCount Basie And His Orchestra\tHow Long Blues\tVocalion\t5010\tWC-2634-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC11494.mp3\tLeroy Carr - Scapper Blackwell\tHow Long Has That Evening Train Been Gone\tARC\tVO1716\t11494\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE31743.mp3\tBenny Goodman And His Orchestra\tHow Long Has This Been Going On?\tOKEH\t6544\t31743-2\t1941\tvocal Peggy Lee\nhttp://www.jazz-on-line.com/a/mp3c/DEC76825.mp3\tElla Fitzgerald\tHow Long Has This Been Going On?\tDECCA\t27370\t76825\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/BANIND623-A.mp3\tLeroy Carr\tHow Long How Long Blues\tBANNER\t32557\tIND623-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24300HL.mp3\tLouis Jordan\tHow Long Must I Wait\tDECCA\t24300\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BLU99360.mp3\tBoots And His Buddies\tHow Long Part 2\tBLUEBIRD\t6301\t99360\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU11292-A.mp3\tBing Crosby\tHow Long Will It Last?\tBRUNSWICK\t6259\t11292-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVUS1284.mp3\tJoe Turner W Coleman Hawkins\tHow Long, How Long Blues\tSAVOY\t5544\tUS1284\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_371.mp3\tJoni James\tHow Lucky You Are\tMGM\t12288\t56S424\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74022.mp3\tAndrews Sisters / Vic Schoen\tHow Lucky You Are\tDECCA\t24171\t74022\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_273.mp3\tAndrews Sisters\tHow Lucky You Are\tDECCA\t24171\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D312B1.mp3\tJohnny Mercer With Paul Weston And His Orchestra\tHow Many Hearts Have You Broken\tV-DISC\t312B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_123.mp3\tTiny Hill And His Orchestra\tHow Many Hearts Have You Broken\tDecca\t4447\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/HITT380-2.mp3\tThree Suns And Artie Dunn\tHow Many Hearts Have You Broken (vad)\tHIT OF THE WEEK\t7092b\tT380-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB946.mp3\tPat Flowers & His Rhythm\tHow Many Kisses\tRCA\t20-2334\tD7VB946\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA1972-B.mp3\tOrrin Tucker And His Orch\tHow Many Times\tCOLUMBIA\t35228\tLA1972-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35791-2.mp3\tBrox Sisters\tHow Many Times\tVICTOR\t20123B\t35791-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35952-2.mp3\tSeattle Harmony Kings\tHow Many Times\tVICTOR\t20133B\t35952-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe74254.mp3\tBilly Jones & Ernest Hare\tHow Many Times\tOKeh\t40669\t74254\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D276A2.mp3\tDick Haymes\tHow Many Times Do I Have To Tell You\tV-DISC\t276A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_181.mp3\tErnest Hare And Billy Jones\tHow Many Times?\tCOLUMBIA\t700 D\tW142392-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC64645.mp3\tAndy Kirk & Clouds Of Joy\tHow Much Do You Mean To Me?\tDECCA\t2081B\t64645\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64645-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tHow Much Do You Mean To Me?\tDecca\t2081\t64645-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC73939.mp3\tBing Crosby - C.cavallaro\tHow Soon\tDECCA\t24101\t73939\t\t\nhttp://www.jazz-on-line.com/a/mp3o/EST99999.mp3\tVictor 18657-a\tHow Sorry You'll Be (wait'l\tEsther Walker\t99999\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB2660.mp3\tColeman Hawkins Allstars\tHow Strange\tRCA\t20-3057\tD7VB2660\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_291.mp3\tTed Fio Rito And His Orchestra (feat. Twin Fours)\tHow Strange\tDecca\t2381\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D148A2.mp3\tTony Pastor And His Orchestra\tHow Sweet You Are\tV-DISC\t148A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_143.mp3\tJo Stafford\tHow Sweet You Are\tCapitol\t142\t79\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_083.mp3\tKay Armen Feat. The Balladiers\tHow Sweet You Are\tDECCA\t18566A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/VicD9VB-889.mp3\tLucky Millinder And His Orchestra\tHow Would You Know?\tVictor\t20-3430\tD9VB-889\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-13006-A.mp3\tDon Redman And His Orchestra\tHow Ya Feelin'?\tBrunswick\t6523\tB-13006-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COL78218-1.mp3\tNora Bayes\tHow Ya Gonna Keep 'em Down On The Farm\tCOLUMBIA\tA-2687\t78218-1\t1918\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC22605-2.mp3\tArthur Fields\tHow Ya Gonna Keep 'em Down On The Farm\tVICTOR\t18537A\t22605-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D358B2.mp3\tEddie Cantor (with Tommy Dorsey)\tHow Ya Gonna Keep 'em Down On The Farm\tV-DISC\t358B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_014.mp3\tNora Bayes Feat. O/charles Prince\tHow Ya Gonna Keep 'em Down On The Farm\tCOLUMBIA\t2687\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_085.mp3\tArthur Fields\tHow Ya Gonna Keep 'em Down On The Farm (after They've Seen Paree)\tVICTOR\t18537A\t22605-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_110.mp3\tByron G. Harlan\tHow Ya Gonna Keep 'em Down On The Farm (after They've Seen Paree)\tEDISON\t50518\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/COL49618.mp3\tYerkes Jazzarimba Orchestra\tHow Ya Gonna Keep 'em Down On The Farm?\tCOLUMBIA\tA-6108\t49618\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80716.mp3\tEddie Cantor\tHow Ya Gonna Keep Your Mind On Dancing?\tCOLUMBIA\tA-3784\t80716\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13006-A.mp3\tDon Redman & His Orch\tHow Ya' Feelin'?\tBRUNSWICK\t6523\t13006-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014649-1.mp3\tFats Waller And His Rhythm\tHow Ya, Baby?\tVICTOR\t25712\t014649-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC75665.mp3\tLionel Hampton & His Orch\tHow You Sound\tDECCA\t24911\t75665\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec75665.mp3\tLionel Hampton And His Orchestra\tHow You Sound\tDecca\t24911\t75665\t1950\tWalter Williams-Benny Bailey-Ed Mullens-Duke Garrette-Leo Shepherd-t, AI Grey-Benny Powell-Jimmy Wormick-Paul Lee Higaki-tb, Bobby Plater-Jerome Richardson-as, Curtis Lowe-Johnny Board-Billy ''Smallwood'' Williams-ts, Lonnie Shaw-bar, Lionel Hampton-vi\nhttp://www.jazz-on-line.com/a/mp3w/1938_067.mp3\tJimmy Dorsey And His Orchestra Feat. V/don Mattison\tHow'd Ja Like To Love Me?\tDECCA\t1671\t63203\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_313.mp3\tDolly Dawn And Her Dawn Patrol\tHow'd Ja Like To Love Me?\tVOCALION\t4018\tM762\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152202-1.mp3\tClaude Hopkins & His Orch\tHow'm I Doin'?\tCOLUMBIA\t2674 D\tW152202-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-11366-A.mp3\tDon Redman And His Orchestra\tHow'm I Doin'? (hey-hey)\tBrunswick\t6273\tB-11366-A  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_099.mp3\tPhil Harris\tHow's About It?\tCOLUMBIA\t2766\tW152384-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_062.mp3\tAmerican Quartet\tHow's Every Little Thing In Dixie?\tVictor\t18225\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI5281-C.mp3\tPremier Quartette (incl. Billy Murray) - O\tHow's Every Little Thing In Dixie? (albert Gumble - Jack Yellen)\tEDISON\tBA 3143\t5281-C\t\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC340.mp3\tJoe Turner\tHowlin' Winds\tNATIONAL\t\tNSC340\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S6028.mp3\tHank Williams\tHowling At The Moon\tMGM\t10961\t51S6028\t\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-792-1.mp3\tCab Calloway And His Orchestra\tHoy-hoy\tVocalion\t4144\tM-792-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE21834.mp3\tDykes Magic City Trio\tHuckleberry Blues\tBRUNSWICK\t129\tE21834\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN861HB.mp3\tZeb Turner\tHuckleberry Boogie\tKING\t861\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26315-B.mp3\tRaymond Scott And His New Orch\tHuckleberry Duck\tCOLUMBIA\t35363\t26315-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_132.mp3\tVan And Schenck\tHuckleberry Finn\tVICTOR\t18318\t19954-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480851.mp3\tConway's Band; Patrick Conway, Cond.\tHuckleberry Finn (medley-fox Trot)\tVICTOR\t35650-A\tC-20377\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE29756.mp3\tBob Haring & His Orch\tHuggable Kissable You (vet)\tBRUNSWICK\t4359\tE29756\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4267.mp3\tHoagy Carmichael And Chickadees\tHuggin' And Chalkin'\tDECCA\t23675\tL4267\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_011.mp3\tHoagy Carmichael Feat. Vic Schoen's Orchestra And The Chakadees\tHuggin' And Chalkin'\tDECCA\t23675\tL4267\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP5119-3.mp3\tArmand Hug\tHuggin' The Keys\tCAPITOL\t\t5119-3\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULA39.mp3\tSol Hoopii & His Novelty Qt\tHula Girl\tBRUNSWICK\t6768\tLA39\t1933\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81468-1.mp3\tThe Georgians\tHula Lou\tColumbia\t70-D\t81468-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA194.mp3\tAndy Iona's Novelty Four\tHula O Ka Aima\tCOLUMBIA\t3001 D\tLA194\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ALCO20.mp3\tAbe Lyman's California Orch\tHullabaloo\tBRUNSWICK\t4912\tLAE866\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64006-3.mp3\tMckinney's Cotton Pickers\tHullabaloo\tVICTOR\t22511\t64006-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152210.mp3\tBen Selvin & His Orch\tHummin' To Myself\tCOLUMBIA\t2669 D\tW152210\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_087.mp3\tJohnny Hamp And His Orchestra\tHummin' To Myself\tVICTOR\t24000\t72517-1\t1932\tfeat. Carl Graub (vn, vo), Del Staigers (tp), Cliff Gamet, Johnny McAfee (cl, as)\nhttp://www.jazz-on-line.com/a/mp3b/VIC24864-6.mp3\tPaul Whiteman & His Orch\tHumming\tVICTOR\t18737\t24864-6\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_130.mp3\tFrankie Laine\tHumming Bird\tColumbia\t40526\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_058.mp3\tLes Paul And Mary Ford\tHummingbird\tCapitol\t3165\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/CON22080.mp3\tGlenn Miller's Orch\tHumoresque\tCONQUEROR\t9488\t22080\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1937.mp3\tArt Tatum\tHumoresque\tDECCA\t18049B\tDLA1937\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC2784.mp3\tJohn Kirby & His Orchestra\tHumoresque\tOKEH\t5605\tWC2784\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010148.mp3\tTommy Dorsey & His Orch\tHumoresque\tVICTOR\t25600\t010148\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD6VB2528.mp3\tMary Lou Williams Trio\tHumoresque\tRCA\t20-2025\tD6VB2528\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D206BH.mp3\tStuff Smith Trio\tHumoresque\tV-DISC\t206B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCon9488.mp3\tGlenn Miller's Orchestra\tHumoresque\tConqueror\t9488\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_084.mp3\tMischa Elman\tHumoresque\tVICTOR\t74163\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23167.mp3\tSlim And Slam\tHumpty Dumpty\tCBS\tVO4461\t23167\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKeW81488-A.mp3\tFrankie Trumbauer & His Orch\tHumpty Dumpty\tOKeh\t40926\tW81488-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP40065x.mp3\tHank Thompson\tHumpty Dumpty Heart\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068066.mp3\tGlenn Miller & His Orch\tHumpty Dumpty Heart\tBLUEBIRD\t11369A\t068066\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2598.mp3\tBing Crosby - Woody Herman\tHumpty Dumpty Heart\tDECCA\t4064B\tDLA2598\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh080.mp3\tHarry Roy And His Band\tHumpty Dumpty Heart\tRegal Zonophone\tMR-3639\tCAR-6337-2\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC4967hpp.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tHungaria\tDECCA\tF-7198\t4967hpp\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-225-1.mp3\tAndr Ekyan (with Django Reinhardt)\tHungaria\tSWING\t127\tOSW-225-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68485.mp3\tHazel Scott (piano)\tHungarian Rhapsody No.2\tDECCA\t18129B\t68485\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142660-1.mp3\tCharlie Poole N.c.ramblers\tHungry Hash House\tCOLUMBIA\t15160 D\tW142660-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75121.mp3\tLouis Jordan\tHungry Man\tDECCA\t24877\t75121\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA-541-A.mp3\tLouis Armstrong With Jimmy Dorsey And His Orchestra\tHurdy Gurdy Man\tDECCA\t949B\tDLA-541-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_004.mp3\tArthur Collins And Byron Harlan\tHurrah For Baffin's Bay\tCOLUMBIA\t1491\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU22984-6.mp3\tRed Nichols & His 5 Pennies\tHurricane\tBRUNSWICK\t3550\t22984-6\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe80340-A.mp3\tMiff Mole & His Little Molers\tHurricane\tOKeh\t40848\t80340-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480852.mp3\tRay Anthony And His Orchestra\tHurricane Anthony\tCAPITOL\t3241\t11906\t1953\tRay Anthony (tp,vcl,arr) Jack Hohlman, Jack Laubach, Ray Triscari, Warren Kime (tp) Sy Berger, Phil Baron, Ken Schrudder (tb) Dick Reynolds (tb,arr) Earl Bergman, Jim Schneider (cl,as) Bill Usselton, Bill Slapin (ts) Leo Anthony (bar,as) Eddie Ryan (p) Milt Norman (g) Don Simpson (b) Mel Lewis (d) \nhttp://www.jazz-on-line.com/a/mp3w/1939_052.mp3\tSammy Kaye And His Orchestra\tHurry Home\tVictor\t26084\t027405\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP95x.mp3\tBenny Carter And His Orchestra\tHurry, Hurry\tCAPITOL\t\t95\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_230.mp3\tBenny Carter And His Orchestra Feat. Savannah Churchill\tHurry, Hurry\tCapitol\t144\t95-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72177.mp3\tLucky Millinder And His Orchestra\tHurry, Hurry\tDecca\t18609\t72177\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap95-A.mp3\tBenny Carter And His Orchestra\tHurry, Hurry!\tCapitol\t144\t95-A\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC83729.mp3\tBing Crosby & Fred Waring Orch\tHush A Bye\tDECCA\t28581\t83729\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36815-2.mp3\tJean Goldkette & His Orch\tHush A Bye (w) (f B)\tVICTOR\t20270A\t36815-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19552-3-4-.mp3\tBob Haring's Colonial Club Or\tHush A Bye Baby\tBRUNSWICK\t3227\t19552-3-4-\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban14282-1.mp3\tHerny ''red'' Allen And His New York Orchestra\tHush My Mouth (if It Ain't Goin' South)\tBanner\t32915\t14282-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20270-A.mp3\tJean Goldkette And His Orch\tHush-a-bye\tVictor\t20270-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_005.mp3\tElsie Baker\tHush-a-bye Ma Baby (the Missouri Waltz)\tVICTOR\t18214\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_030.mp3\tHenry Burr And Albert Campbell\tHush-a-bye Ma Baby (the Missouri Waltz)\tColumbia\t2358\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77246.mp3\tAl Campbell & Henry Burr\tHushabye My Baby\tCOLUMBIA\tA-2358\t77246\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150657-1.mp3\tBessie Smith\tHustlin' Dan\tCOLUMBIA\t14554 D\tW150657-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/COLHCO2531.mp3\tDuke Ellington's Orch\tHy'a Sue\tCOLUMBIA\t38234\tHCO2531\t1947\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC323A.mp3\tDuke Ellington & His Orchestra\tHyde Park\tDECCA\t323A\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DECGB6038.mp3\tDuke Ellington & His Orch.\tHyde Park\tDECCA\t323A\tGB6038\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38627-2.mp3\tJelly Roll Morton Hot Peppers\tHyena Stomp\tVICTOR\t20772\t38627-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic38627-2.mp3\tJelly-roll Morton's Red Hot Peppers\tHyena Stomp\tVictor\t20772\t38627-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480472.mp3\tBenny Golson Sextet\tHymn To The Orient\tRiverside\tRLP12-256\t\t1957\tKenny Dorham (tp), J.J. Johnson (tb), Benny Golson (ts), Wynton Kelly (p), Paul Chambers (sb), Charlie Persip or Max Roach (dm)\nhttp://www.jazz-on-line.com/a/mp3c/VIC010566.mp3\tTommy Dorsey & His Orch\tHymn To The Sun\tVICTOR\t26259\t010566\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_057.mp3\tDon Cornell Feat. Norman Leyden's Orchestra\tI\tCoral\t60860\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480853.mp3\tCarmen Miranda And The Bando Da Lua\tI - Yi - Yi - Yi - Yi (i Like You Very Much)\tDECCA\t23209-A\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC01810.mp3\tFats Waller And His Rhythm\tI Adore You (vfw)\tVICTOR\t25491\t01810\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/SIG658-1.mp3\tAnita O'day With Benny Carter\tI Ain't Gettin' Any Younger\tSIGNATURE\t15216A\t658-1\t\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1068-A.mp3\tCab Calloway And His Orchestra\tI Ain't Gettin' Nowhere Fast\tVocalion\t5195\tWM-1068-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45025-1.mp3\tCarter Family\tI Ain't Goin' To Work Tomorrow\tVICTOR\t21517\t45025-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC063826-1.mp3\tSidney Bechet New Orleans F.w.\tI Ain't Gone Give Nobody None Of This Jelly Roll\tVICTOR\t27447\t063826-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu030452-1.mp3\tMezz Mezzrow - Ladnier Quintet\tI Ain't Gonna Give Nobody None 0' This Jelly Roll\tBluebird\tB-10090\t030452-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030452.mp3\tMezz Mezzrow And His Orch\tI Ain't Gonna Give Nobody None Of My Jelly Roll\tBLUEBIRD\t10090\t030452\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60845.mp3\tJimmie Davis\tI Ain't Gonna Let Satan Turn Me 'round\tDECCA\t5235\t60845\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26936-A.mp3\tJimmie Lunceford And His Orchestra\tI Ain't Gonna Study War No More\tColumbia\t35567\t26936-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe8477-B.mp3\tKing Oliver's Jazz Band\tI Ain't Gonna Tell Nobody\tOKeh\t8148\t8477-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC26624.mp3\tWoody Guthrie\tI Ain't Got No Home In This World Anymore\tVICTOR\t26624\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM-395-1.mp3\tBenny Carter And His Orchestra\tI Ain't Got Nobod\tDECCA\tF-42125\tAM-395-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79134-1.mp3\tMarion Harris\tI Ain't Got Nobody\tCOLUMBIA\tA-3371\t79134-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE80717-C.mp3\tSophie Tucker W Miff Mole\tI Ain't Got Nobody\tOKEH\t40837\t80717-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2600.mp3\tBing Crosby - Woody Herman\tI Ain't Got Nobody\tDECCA\t3971B\tDLA2600\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC1054.mp3\tCab Calloway & His Orch\tI Ain't Got Nobody\tBRUNSWICK\t7530\tC1054\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67092.mp3\tHot Lips Page & His Band\tI Ain't Got Nobody\tDECCA\t7714\t67092\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECW265173-2.mp3\tColeman Hawkins\tI Ain't Got Nobody\tDECCA\t18252B\tW265173-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76444.mp3\tSy Oliver & His Orch.\tI Ain't Got Nobody\tDECCA\t27094\t76444\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW140858-3.mp3\tBessie Smith\tI Ain't Got Nobody\tCOLUMBIA\t14095 D\tW140858-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1894.mp3\tWillie Lewis & Negro Band\tI Ain't Got Nobody\tVARSITY\tEL4071s\t1894\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC010656-1.mp3\tFats Waller (piano)\tI Ain't Got Nobody\tVICTOR\t27766B\t010656-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC39064-2.mp3\tCoon Sanders Nighthawk Orch\tI Ain't Got Nobody\tVICTOR\t20785A\t39064-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/Tim68228-2.mp3\tHenny Hendrickson's Louisville Serenaders\tI Ain't Got Nobody\tTimely Tunes\tC-1585\t68228-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe403493-A.mp3\tLouis Armstrong & His Orch\tI Ain't Got Nobody\tOKeh\t8756\t403493-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-3371.mp3\tMarion Harris\tI Ain't Got Nobody\tCOLUMBIA\tA-3371\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC38428-C.mp3\tArt Tatum\tI Ain't Got Nobody\tDECCA\t741A\t38428-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic40094-2.mp3\tThomas Waller With Morris's Not Babies\tI Ain't Got Nobody\tVictor\t21127\t40094-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_024.mp3\tMarion Harris\tI Ain't Got Nobody\tCOLUMBIA\tA-3371\t79134-1\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_097.mp3\tBessie Smith\tI Ain't Got Nobody\tCOLUMBIA\t14095 D\tW140858-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR142492-2.mp3\tUniversity Six\tI Ain't Got Nobody\tHARMONY\t230-H\t142492-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Col24510-1.mp3\tBasie's Bad Boys\tI Ain't Got Nobody\tColumbia\tCG 31214  \t24510-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic88778-1.mp3\tFats Waller And His Rhythm\tI Ain't Got Nobody (and Nobody Cares For Me) (instr.)\tVictor\t25026\t88778-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic88777-1.mp3\t\"fats\" Waller And His Rhythm\tI Ain't Got Nobody (and Nobody Cares For Me) (vocal)\tVictor\t24888\t88777-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_058.mp3\tMarion Harris\tI Ain't Got Nobody Much\tVICTOR\t18133\t18192-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/VicD9VB-18.mp3\tLucky Millinder And His Orchestra\tI Ain't Got Nothin' To Lose\tVictor\t20-3495\tD9VB-18  \t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152736-1.mp3\tBenny Goodman And His Orchestra\tI Ain't Lazy, I'm Just Dreamin'\tCOLUMBIA\t2923\tW152736-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_076.mp3\tBenny Goodman And His Orchestra Feat. Jack Teagarden\tI Ain't Lazy, I'm Just Dreamin'\tCOLUMBIA\t2923 D\tW152736-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPx0425.mp3\tJesse Price\tI Ain't Mad At You\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB897.mp3\tCount Basie & His Orchestra\tI Ain't Mad At You\tRCA\t20-2314\tD7VB897\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_082.mp3\tCount Basie And His Orchestra Feat. Taps Miller\tI Ain't Mad At You\tVictor\t2314\tD7VB897\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC70227-A.mp3\tBuddy Johnson And His Band\tI Ain't Mad With You\tDECCA\t8640\t70227-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW144303.mp3\tPaul Ash And His Orchestra\tI Ain't That Kind Of A Baby\tCOLUMBIA\t1066 D\tW144303\t1927\tDanny Polo, clarinet, alto & baritone saxes, replaces Wing or Nettles; Hank Winston, piano replaces Barris, v Paul Small. Chicago, June 8th 1927\nhttp://www.jazz-on-line.com/a/mp3c/BRU24601.mp3\tEsther Walker\tI Ain't That Kind Of A Baby!\tBRUNSWICK\t3670\t24601\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/Col24510-1.mp3\tBasie's Bad Boys\tI Aint Got Nobody\tColumbia\tCG 31224\t24510-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC18192-1.mp3\tMarion Harris\tI Aint Got Nobody Much\tVICTOR\t18133\t18192-1\t1916\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1924_1213_01.mp3\tLee Morse\tI Aint Got Nobody To Love\tPerfect\t12186BA\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S369.mp3\tIvory Joe Hunter\tI Almost Lost My Mind\tMGM\t10578\t49S369\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75666.mp3\tLionel Hampton & His Orch\tI Almost Lost My Mind\tDECCA\t24864\t75666\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_290.mp3\tNat King Cole\tI Almost Lost My Mind\tCapitol\t889\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_012.mp3\tPat Boone\tI Almost Lost My Mind\tDot\t15472 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec75666.mp3\tLionel Hampton And His Orchestra\tI Almost Lost My Mind\tDecca\t24864\t75666\t1950\tWalter Williams-Benny Bailey-Ed Mullens-Duke Garrette-Leo Shepherd-t, AI Grey-Benny Powell-Jimmy Wormick-Paul Lee Higaki-tb, Bobby Plater-Jerome Richardson-as, Curtis Lowe-Johnny Board-Billy ''Smallwood'' Williams-ts, Lonnie Shaw-bar, Lionel Hampton-vi\nhttp://www.jazz-on-line.com/a/mp3w/1940_182.mp3\tGray Gordon And His Orchestra\tI Am An American\tBLUEBIRD\t10783A\t051550\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_158.mp3\tNat King Cole\tI Am In Love\tCapitol\t2459\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe404431-C.mp3\tJoe Venuti's New Yorkers\tI Am Only Human After All (v S B)\tOKeh\t41451\t404431-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE37085.mp3\tBing Crosby\tI Apologize\tBRUNSWICK\t6179\tE37085\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM50S3182.mp3\tBilly Eckstine\tI Apologize\tMGM\t10903\t50S3182\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_044.mp3\tBing Crosby\tI Apologize\tBRUNSWICK\t6179\tE37085\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_141.mp3\tNat Shilkret And The Victor Orchestra\tI Apologize\tVICTOR\t22781A\t70134-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_293.mp3\tChamp Butler Feat. O/skippy Martin\tI Apologize\tCOLUMBIA\t39189\tEOCB5031\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_043.mp3\tBilly Eckstine Feat. Pete Rugolo's Orchestra\tI Apologize\tMGM\t10903\t50S3182\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70134-1.mp3\tNat Shilkret & His Orch\tI Apologize (v P S)\tVICTOR\t22781A\t70134-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC27719-A.mp3\tArtie Shaw And His Orchestra\tI Ask The Stars (and They Agree)\tVICTOR\t27719-A\t067749-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043973.mp3\tGlenn Miller & His Orch\tI Beg Your Pardon\tBLUEBIRD\t10561\t043973\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10392.mp3\tFrankie Laine\tI Believe\tCOLUMBIA\t39938\tHCO10392\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5703.mp3\tArtie Shaw And His Music (vocal Mel Torme)\tI Believe\tMUSICRAFT\t492\t5703\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_065.mp3\tFrank Sinatra\tI Believe\tCOLUMBIA\t37300\tHCO2122\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_014.mp3\tFrankie Laine\tI Believe\tCOLUMBIA\t39938\tHCO10392\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_078.mp3\tJane Froman Feat. Sid Feller Orchestra\tI Believe\tCapitol\t2332\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D802u.mp3\tBuddy Rich Orch\tI Believe - Just You Just Me\tV-DISC\t802\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CONSA2581-1.mp3\tRobert Johnson\tI Believe I'll Dust My Broom\tCONQUEROR\t8871\tSA2581-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCON8871.mp3\tRobert Johnson\tI Believe I'll Dust My Broom\tCONQUEROR\t8871\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5388.mp3\tWynonie Harris\tI Believe I'll Fall In Love\tKING\t4445\tK5388\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC15645-2.mp3\tLeroy Carr\tI Believe I'll Make A Change\tARC\tVO2820z\t15645-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC87086-1.mp3\tFats Waller And His Rhythm\tI Believe In Miracles\tVICTOR\t24853\t87086-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC17006-1.mp3\tWingy Manone & His Orch\tI Believe In Miracles\tVOCALION\t2913\t17006-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic87086-1.mp3\t\"fats\" Waller And His Rhythm\tI Believe In Miracles\tVictor\t24853\t87086-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_053.mp3\tDorsey Brothers Orchestra Feat. V/bob Crosby\tI Believe In Miracles\tDECCA\t335A\t39181-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh028.mp3\tThe Casani Club Orchestra Dir. By Charlie Kunz\tI Believe In Miracles (v George Barclay)\tRex\t8459\tF-1246-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39181-A.mp3\tDorsey Brothers Orchestra\tI Believe In Miracles (vbc)\tDECCA\t335A\t39181-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COL71405.mp3\tWill Fyffe\tI Belong To Glasgow\tCOLUMBIA\t183D\t71405\t1921\t\nhttp://www.jazz-on-line.com/a/mp3o/RCAF2PB-1054.mp3\tRalph Flanagan & His Orch. With Singing Winds\tI Belong To You\tRCA VICTOR\t20-6023\tF2PB-1054\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAF2PB-1054.mp3\tRalph Flanagan And His Orchestra. With Singing Winds\tI Belong To You\tRCA VICTOR \t20-6023\tF2PB-1054\t1955\t\nhttp://www.jazz-on-line.com/a/mp3h/RCAF2PB-1054.mp3\tRalph Flanagan & His Orch. With Singing Winds\tI Belong To You (1955) (jack Brooks & Alex North)\tRCA VICTOR\t20-6023\tF2PB-1054\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU9041IB.mp3\tZeke Manners & His Gang\tI Betcha My Heart I Love You\tBLUEBIRD\t9041\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Spo1895.mp3\tDexter Gordon Quintet\tI Blowed And Gone\tSpotlite\tSJP136\t1895\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43004.mp3\tUna Mae Carlisle\tI Bought Myself A Book\tCOLUMBIA\t38974\tCO43004\t1950\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU18390.mp3\tLeo Reisman & His Orch\tI Built A Dream One Day\tBRUNSWICK\t7582\t18390\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_282.mp3\tRay Noble And His Orchestra\tI Built A Dream One Day\tVICTOR\t25200\t98360-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1845IC.mp3\tZeke Manners\tI Can Beat You Doin' What You're Doin'\tRCA\t20-1845\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_055.mp3\tJoseph Cawthorn\tI Can Dance With Everybody But My Wife\tVICTOR\t55074\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404668-A.mp3\tKing David's Jug Band\tI Can Deal Worry\tOKeh\t8901\t404668-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_127.mp3\tTex Beneke And His Orchestra Feat. Glenn Douglas\tI Can Dream, Can't I\tRCA\t78-3553\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC017464.mp3\tTommy Dorsey And His Orch\tI Can Dream, Can't I?\tVICTOR\t25741\t017464\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75074.mp3\tAndrews Sisters / G.jenkins\tI Can Dream, Can't I?\tDECCA\t24705\t75074\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_070.mp3\tToni Arden Feat. Hugo Winterhalter's Orchestra\tI Can Dream, Can't I?\tCOLUMBIA\t38612\tCO41728\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_008.mp3\tAndrews Sisters Feat. Gordon Jenkins And His Orchestra And Patty Andrews\tI Can Dream, Can't I?\tDECCA\t24705\t75074\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_080.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tI Can Dream, Can't I?\tVICTOR\t25741\t017464\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035392.mp3\tLionel Hampton & His Orch\tI Can Give You Love\tVICTOR\t26343\t035392\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic035392-1.mp3\tLionel Hampton And His Orchestra\tI Can Give You Love\tVictor\t26343\t035392-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Mus5486.mp3\tSarah Vaughan And Orchestra Under The Direction Of Tadd Dameron\tI Can Make You Love Me\tMusicraft\t398\t5486\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24182.mp3\tMildred Bailey & Her Orchestra\tI Can Read Between The Lines\tVOCALION\t4749\t24182\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24342-2.mp3\tRed Norvo & His Orch\tI Can Read Between The Lines\tVOCALION\t4818\t24342-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64226.mp3\tBob Howard & His Orch\tI Can Tell By Looking In Your Eyes\tDECCA\t2356B\t64226\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC690B.mp3\tAmbrose And His Orchestra\tI Can Wiggle My Ears\tDECCA\t690B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24690-A.mp3\tHarry James And His Orchestra\tI Can't Afford To Dream\tBrunswick\t8395\tB-24690-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC85423.mp3\tLouis Armstrong & Commanders\tI Can't Afford To Miss This Dream\tDECCA\t28995\t85423\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO35108.mp3\tHarry James W Kitty Kallen\tI Can't Begin To Tell You\tCOLUMBIA\t36867\tCO35108\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3904.mp3\tBing Crosby - Carmen Cavallaro\tI Can't Begin To Tell You\tDECCA\t23457\tL3904\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP696-2A.mp3\tAndy Russell\tI Can't Begin To Tell You\tCAPITOL\t\t696-2A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_078.mp3\tAndy Russell\tI Can't Begin To Tell You\tCapitol\t221\t696-2A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_052.mp3\tHarry James And His Orchestra Feat. Betty Grable\tI Can't Begin To Tell You\tColumbia\t36867\tCO35108-1\t1945\tHarry James, Irwin Berken, James Troutman, James Campbell, Al Ramsey (tp), Victor Hamann, Jesse Heath, Charles Prebble, Juan Tizol (tb), Willie Smith (cl, as), Murray Williams (as), Corky Corcoran, Clint Davis (ts), Stewart Bruner (as, ts, bar),  Bob Bain, Sam Caplan, John DeVoogdt, Sol Geskin, Jack Gootkin, George Grossman, Harry Jawarski, Ernest Karpati, Gerson Oberstein, Jerome Reisler (vn), David Uchitel, Bill Spears, Al Nieman, Hal Sorin (va), Elias Friede, Carl Ziegler (vc), Arnold Ross (p), Hayden Causey (g), Ed Mihelich (sb), Ray Toland (dm).\nhttp://www.jazz-on-line.com/a/mp3b/BRU11838-A.mp3\tIsham Jones' Orch\tI Can't Believe It's True\tBRUNSWICK\t6308\t11838-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6308.mp3\tIsham Jones' Orchestra\tI Can't Believe It's True\tBrunswick\t6308\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MERYW604.mp3\tFrankie Lane\tI Can't Believe That You're In Love With Me\tMERCURY\t1028\tYW604\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVB4415.mp3\tErroll Garner\tI Can't Believe That You're In Love With Me\tSAVOY\t723B\tB4415\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN511IC.mp3\tEdmond Hall's Swingtet\tI Can't Believe That You're In Love With Me\tBLUENOTE\tBN511\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/SIG1112.mp3\tJess Stacy & His Orch\tI Can't Believe That You're In Love With Me\tSIGNATURE\t902\t1112\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38132-3.mp3\tRoger Wolfe Kahn & His Orch\tI Can't Believe That You're In Love With Me\tVICTOR\t20573\t38132-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2607.mp3\tElla Fitzgerald & Her Orch\tI Can't Believe That You're In Love With Me\tDECCA\t18421A\tDLA2607\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3905.mp3\tBing Crosby\tI Can't Believe That You're In Love With Me\tDECCA\t28963\tL3905\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/ComR2997.mp3\tThe Chocolate Dandies (with Benny Carter)\tI Can't Believe That You're In Love With Me\tCommodore\t1506\tR2997\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_218.mp3\tAmes Brothers, The Feat. Hugo Winterhalter And His Orchestra\tI Can't Believe That You're In Love With Me\tRCA Victor\t5530\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-157.mp3\tLionel Hampton And His Orchestra\tI Can't Believe That You're In Love With Me\tMGM\t10979\t51-S-157\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-8492-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tI Can't Believe That You're In Love With Me \tParlophone\tF-923\tCE-8492-1\t1937\tValaida Snow t v acc. by Johnny Claes t, Derek Neville as bar, Reggie Dare ts, Gun Finlay p, Norman Brown g, Louis Barreiro b, Ken Stewart d\nhttp://www.jazz-on-line.com/a/mp3d/Bru70417-A.mp3\tLionel Hampton Sextet\tI Can't Believe That You're In Love With Me\tBrunswick\t87526\t70417-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24980-A.mp3\tCount Basie And His Orchestra\tI Can't Believe That You're In Love With Me\tVocalion\t5036\t24980-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4726.mp3\tEddie Heywood\tI Can't Believe You're In Love With Me\tCOMMODORE\t577\t4726\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04950.mp3\tFats Waller And His Rhythm\tI Can't Break The Habit Of You\tVICTOR\t25530\t04950\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS20692.mp3\tMiff Mole's Molers\tI Can't Break The Habit Of You\tCBS\tVO3468\t20692\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99433-2.mp3\tTune Wranglers\tI Can't Change It\tBLUEBIRD\t6365\t99433-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC39521.mp3\tBob Howard & His Orchestra\tI Can't Dance\tDECCA\t484B\t39521\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-6802-1.mp3\tValaida (queen Of The Trumpet) With Billy Mason And His Orchestra\tI Can't Dance (i Got Ants In My Pants)\tParlophone\tF-1I8\tCE-6802-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15163.mp3\tClaude Hopkins And His Orch\tI Can't Dance, I've Got Ants In My Pants\tBRUNSWICK\t6891\t15163\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA440-A.mp3\tBing Crosby & Jimmy Dorsey Or.\tI Can't Escape From You\tDECCA\t871B\tDLA440-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1099.mp3\tArtie Shaw And His Orchestra\tI Can't Escape From You\tRCA\t20-1936\tD5VB1099\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB0516.mp3\tErroll Garner\tI Can't Escape From You\tRCA\t20-4723\tD7VB0516\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19580.mp3\tErskine Hawkins Bama St Coll.\tI Can't Escape From You\tVOCALION\t3280\t19580\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61324-A.mp3\tJimmie Lunceford And His Orchestra\tI Can't Escape From You\tDecca\t980\t61324-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_091.mp3\tBing Crosby\tI Can't Escape From You\tDECCA\t11009\tDLA440-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap254-3.mp3\tBenny Carter And His Orchestra\tI Can't Escape From You\tCapitol\t40048\t254-3\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Sav5880.mp3\tDexter Gordon Quintette\tI Can't Escape From You\tSavoy\t595\t5880\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/RCAD7VB-0516.mp3\tErroll Garner\tI Can't Escape From You   \tRCA\t20-4723\tD7VB-0516\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61324-A.mp3\tJimmie Lunceford And His Orchestra\tI Can't Escape From You.mp3\tDecca\t980\t61324-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22565.mp3\tMildred Bailey & Her Orchestra\tI Can't Face The Music\tVOCALION\t4016\t22565\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Col151637-1.mp3\tKing Carter And His Royal Orchestra\tI Can't Get Along Without My Baby ? V G M\tColumbia\t2638-D\t151637-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC69610-1.mp3\tRussell Wooding's Red Caps\tI Can't Get Enough Of You\tVICTOR\t22718\t69610-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20119-A.mp3\tJohnny Hamp's Kentucky Serenade\tI Can't Get Over A Girl Lik\tVictor\t20119-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC36056-2.mp3\tAileen Stanley\tI Can't Get Over A Girl Like You\tVICTOR\t20148\t36056-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA011675.mp3\tBunny Berigan And His Orch\tI Can't Get Started\tRCA\t20-1500\t011675\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC017197.mp3\tBunny Berigan And His Orch\tI Can't Get Started\tVICTOR\t25728A\t017197\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC011675-1.mp3\tBunny Berigan And His Orch\tI Can't Get Started\tVICTOR\t36208\t011675-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC366208.mp3\tBunny Berigan\tI Can't Get Started\tVICTOR\t36208\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL23468.mp3\tBillie Holiday\tI Can't Get Started\tCOLUMBIA\t37494\t23468\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS2002.mp3\tLester Young & Jatp\tI Can't Get Started\tDISC\t2002\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL177.mp3\tLennie Tristano Trio\tI Can't Get Started\tKEYNOTE\t647\tHL177\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COL30147.mp3\tDizzy Gillespie\tI Can't Get Started\tCOLUMBIA\t30147\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72297.mp3\tRoy Eldridge & His Orchestra\tI Can't Get Started\tDECCA\t24417\t72297\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO45108.mp3\tErroll Garner\tI Can't Get Started\tCOLUMBIA\t41231\tCO45108\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83246.mp3\tColeman Hawkins & His Orch\tI Can't Get Started\tDECCA\t28386\t83246\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT1126.mp3\tCootie Williams & His Orch\tI Can't Get Started\tMAJESTIC\t1136\tT1126\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC043248-1.mp3\tLionel Hampton & His Orch\tI Can't Get Started\tVICTOR\t26453\t043248-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap256-3.mp3\tBenny Carter And His Orchestra\tI Can't Get Started\tCapitol\t48015\t256-3\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_186alt.mp3\tBunny Berigan\tI Can't Get Started\tVICTOR\t36208\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic043248-1.mp3\tLionel Hampton And His Orchestra\tI Can't Get Started\tVictor\t26453\t043248-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481771.mp3\tAnita O'day\tI Can't Get Started\tVerve\tMGV2000\t2560-4\t1955\tacc. by Paul Smith (p), Barney Kessel (g), Joe Mondragon (sb), Alvin Stoller (dm), Corky Hale (harp), strings. Buddy Bregman (arr, dir)\nhttp://www.jazz-on-line.com/a/mp3w/1938_186.mp3\tBunny Berigan And His Orchestra\tI Can't Get Started (theme)\tVICTOR\t25728A\t017197\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18525-1.mp3\tHal Kemp & His Orch\tI Can't Get Started (vskinnay Ennis)\tARC\tBR7600\t18525-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1091.mp3\tArtie Shaw And His Orchestra\tI Can't Get Started With You\tRCA\t20-1934\tD5VB1091\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER164.mp3\tErroll Garner\tI Can't Get Started With You\tMERCURY\t1003\t164\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban5534-1.mp3\tFletcher Henderson And His Orchestra\tI Can't Get The One I Want\tBanner\t1384\t5534-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR660-Hx.mp3\tLou Gold And His Orch\tI Can't Give You Anything B\tHarmony\t660-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146622-3.mp3\tUkulele Ike\tI Can't Give You Anything But Love\tCOLUMBIA\t1471 D\tW146622-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/MAJT1470.mp3\tRose Murphy\tI Can't Give You Anything But Love\tMAJESTIC\t1204\tT1470\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe401690-C.mp3\tLouis Armstrong And His Orch\tI Can't Give You Anything But Love\tOKeh\t41204\t401690-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09690-2.mp3\tBenny Goodman And His Orchestra\tI Can't Give You Anything But Love\tVICTOR\t25678\t09690-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU48102-2.mp3\tDuke Ellington & His Orch\tI Can't Give You Anything But Love\tBLUEBIRD\t6280\t48102-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12782.mp3\tMills Bros\tI Can't Give You Anything But Love\tBRUNSWICK\t6519\t12782\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC95026-2.mp3\tRamona & Her Gang\tI Can't Give You Anything But Love\tVICTOR\t25156\t95026-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146380-3.mp3\tBen Selvin & His Orch\tI Can't Give You Anything But Love\tCOLUMBIA\t1424 D\tW146380-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL253.mp3\tLee O'daniel Hillbilly Boys\tI Can't Give You Anything But Love\tVOCALION\t3753\tDAL253\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS1013.mp3\tKing Cole Quintet\tI Can't Give You Anything But Love\tDISC\t2011\t1013\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC49203-3.mp3\tGene Austin\tI Can't Give You Anything But Love\tVICTOR\t21798\t49203-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC27620ICG.mp3\tLouis Jordan\tI Can't Give You Anything But Love\tDECCA\t27620\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL246.mp3\tErroll Garner Trio\tI Can't Give You Anything But Love\tATLANTIC\t666\t246\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1058-1.mp3\tDjango Reinhardt\tI Can't Give You Anything But Love\tGramophone\tK-7706\tOLA-1058-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-400-1.mp3\tDjango' Music\tI Can't Give You Anything But Love\tSWING\t254\tOSW-400-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_110.mp3\tRose Murphy\tI Can't Give You Anything But Love\tMAJESTIC\t1204\tT1470\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_142.mp3\tNat Shilkret And The Victor Orchestra\tI Can't Give You Anything But Love\tVICTOR\t21798\t49203-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_147.mp3\tGene Austin Feat. O/nat Shilkret\tI Can't Give You Anything But Love\tVICTOR\t21798\t49203-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20293-1.mp3\tTeddy Wilson And His Orchestra\tI Can't Give You Anything But Love\tBrunswick\t7781  \tB-20293-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Ton1064-A.mp3\tMiss Valaida Med Winstrup Olesens Swingband\tI Can't Give You Anything But Love \tTono\t21166\t1064-A\t1940\tValaida Snow t v acc. by W nstrup Olesen t dir. Kai Moeller cl, Leo Mathiesen p, Helge Jacobsen g, Christian Jensen b, Kai Fischer d\nhttp://www.jazz-on-line.com/a/mp3d/PatOLA-1960-1.mp3\tAlix Combelle And His Swing Band\tI Can't Give You Anything But Love\tPath? Marconi\t1552591\tOLA-1960-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_010.mp3\tCliff Edwards\tI Can't Give You Anything But Love\tCOLUMBIA\t1471\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-12783-A.mp3\tEthel Waters With Duke Ellington And His Famous Orchestra\tI Can't Give You Anything But Love\tBrunswick\t6517\tB-12783-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_030.mp3\tJohnny Hamp And His Orchestra\tI Can't Give You Anything But Love\tVICTOR\t21514A\t43990-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043351.mp3\tFats Waller And His Rhythm\tI Can't Give You Anything But Love (vu.carlyle)\tBLUEBIRD\t10573B\t043351\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CBSCO29260.mp3\tBenny Goodman Sextet\tI Can't Give You Anything But Love Baby\tCBS\tCO36755\tCO29260\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D482-A.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tI Can't Give You Anything But Love, Baby\tV-Disc\t482-A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CON26503-A.mp3\tJoe Sullivan (piano)\tI Can't Give You Anything But Love, Baby (vjt)\tCONQUEROR\t9503\t26503-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74591.mp3\tElla Fitzgerald\tI Can't Go On\tDECCA\t24497\t74591\t1948\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK5406.mp3\tBull Moose Jackson\tI Can't Go On Without You\tKING\t4230A\tK5406\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47087.mp3\tGuy Mitchell - Mitch Miller\tI Can't Help It\tCOLUMBIA\t39595\tCO47087\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S6027.mp3\tHank Williams\tI Can't Help It\tMGM\t10961\t51S6027\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141805.mp3\tArt Gillam\tI Can't Keep You Out Of My Dreams\tCOLUMBIA\t737 D\tW141805\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL6955.mp3\tElla Fitzgerald With\tI Can't Lie To Myself\tDECCA\t28589\tL6955\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26811.mp3\tBenny Goodman And His Orchestra\tI Can't Love You Any More\tCOLUMBIA\t35487\t26811\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_242.mp3\tMitchell Ayres And His Fashions In Music\tI Can't Love You Any More (any More Than I Do)\tBluebird\t10653\t048197-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_061.mp3\tBenny Goodman And His Orchestra\tI Can't Love You Any More (any More Than I Do)\tCOLUMBIA\t35487\t26811\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_180.mp3\tLavern Baker\tI Can't Love You Enough\tAtlantic\t1104\t2020-1\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61405-B.mp3\tWoody Herman & His Orch\tI Can't Pretend\tDECCA\t1057\t61405-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC75560.mp3\tEddy Duchin & His Orch\tI Can't Remember\tVICTOR\t24280\t75560\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_162.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tI Can't Remember\tVICTOR\t24280\t75560\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU058212.mp3\tCharlie Barnet And His Orch\tI Can't Remember To Forget\tBLUEBIRD\t10975\t058212\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_211.mp3\tBenny Goodman And His Orchestra Feat. V/helen Forrest\tI Can't Resist You\tCOLUMBIA\t35574\t26980-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_237.mp3\tKing Cole Trio\tI Can't See For Lookin'\tCapitol\t154\t142\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72179.mp3\tLucky Millinder And His Orchestra\tI Can't See For Lookin'\tDecca\t18609\t72179\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/MAD5051-b.mp3\tRadio Syncopators\tI Can't Sleep In The Movies\tMadison\t5051-b\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S3134.mp3\tBob Wills And His Texas Playboys\tI Can't Stand This Loneliness\tMGM\t11163\t51S3134\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/Vic57529-1.mp3\tKing Oliver And His Orchestra\tI Can't Stop Loving You\tVictor\t23029\t57529-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64461-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tI Can't Stop Loving You\tDecca\t2310\t64461-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5719-ANM-.mp3\tWynonie Harris & His Allstars\tI Can't Take It No More\tKING\t4342A\tK5719-ANM-\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20-1611-B.mp3\tDinah Shore\tI Can't Tell Why I Love You\tVictor\t20-1611-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS20293-1.mp3\tTeddy Wilson & His Orch\tI Cant Give You Anything But Love (vbh)\tCBS\tBR7781\t20293-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC32770-7.mp3\tCoon-sanders Nighthawk Orch\tI Cant Realize\tVICTOR\t19852\t32770-7\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66335.mp3\tBuddy Jones\tI Cant Use You Anymore\tDECCA\t5816\t66335\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO40814.mp3\tArtie Shaw And His Orchestra\tI Concentrate On You\tCOLUMBIA\t38775\tCO40814\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_278.mp3\tTommy Dorsey And His Orchestra Feat. Anna Boyer\tI Concentrate On You\tVICTOR\t26470\t044527\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38401.mp3\tDoris Day And Buddy Clark\tI Confess\tCOLUMBIA\t38174\tCO38401\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO48723.mp3\tSarah Vaughan\tI Confess\tCOLUMBIA\t39932\tCO48723\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_135.mp3\tPerry Como Feat. Hugo Winterhalter's Orchestra\tI Confess\tRCA Victor\t47-5152\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU31202.mp3\tHerb Gordon Ten Eyck Hotel Or.\tI Could Do It For You\tBRUNSWICK\t4584\t31202\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO38591.mp3\tDuke Ellington's Orch\tI Could Get A Man\tCOLUMBIA\t38519\tCO38591\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_276.mp3\tRosemary Clooney\tI Could Have Danced All Night\tColumbia\t40676\tRHCO33736\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_166.mp3\tSylvia Syms\tI Could Have Danced All Night\tDecca\t29903\t89577\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_483.mp3\tDinah Shore\tI Could Have Danced All Night\tRCA\t6469\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_179.mp3\tFrank Sinatra\tI Could Have Told You\tCapitol\t2787\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN2951IC.mp3\tZeb Turner\tI Could Lose These Blues\tKING\t2951\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_131.mp3\tTommy Dorsey Orch V Frank Sinatra\tI Could Make You Care\tVICTOR\t26717\t051876-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC051876-1.mp3\tTommy Dorsey And His Orch\tI Could Make You Care (vf.sinatra)\tVICTOR\t26717\t051876-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/CroBL-20.mp3\tJohn Kirby And His Orchestra\tI Could Make You Love Me\tCrown\t118\tBL-20\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1068.mp3\tArtie Shaw And His Orchestra\tI Could Write A Book\tRCA\t20-1933\tD5VB1068\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D397A1.mp3\tWings Over Jordan\tI Couldn't Hear Nobody Pray\tV-DISC\t397A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/GenX-72-A.mp3\tAlta Browne And Bertha Powell\tI Couldn't Hear Nobody Pray\tGennett\t3308\tX-72-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO33368.mp3\tFrank Sinatra\tI Couldn't Sleep A Wink Last Night\tCOLUMBIA\t36687\tCO33368\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D116B1.mp3\tFrank Sinatra\tI Couldn't Sleep A Wink Last Night\tV-DISC\t116B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL36687.mp3\tFrank Sinatra\tI Couldn't Sleep A Wink Last Night\tCOLUMBIA\t36687\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_033.mp3\tFrank Sinatra\tI Couldn't Sleep A Wink Last Night\tCOLUMBIA\t36687\tCO33368\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74686.mp3\tElla Fitzgerald\tI Couldn't Stay Away From You\tDECCA\t24562\t74686\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC591.mp3\tHal Kemp & His Orch\tI Couldn't Tell Them What I Thought\tBRUNSWICK\t6605\tC591\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU6605.mp3\tHal Kemp & His Orchestra\tI Couldn't Tell Them What I Thought\tBRUNSWICK\t6605\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh047.mp3\tRoy Fox And His Band\tI Cover The Watefront (peggy Dell Piano & Vocal)\tDecca\tF-3617\tGB-6042-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh181.mp3\tIvy Benson And Her All Girls Band\tI Cover The Water Front\tJohnW\t181\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO31003.mp3\tBillie Holiday\tI Cover The Waterfront\tCOLUMBIA\t37493\tCO31003\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18864B.mp3\tInk Spots\tI Cover The Waterfront\tDECCA\t18864B\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68797.mp3\tLouis Armstrong & His Orch.\tI Cover The Waterfront\tDECCA\t3700B\t68797\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO45101.mp3\tErroll Garner Trio\tI Cover The Waterfront\tCOLUMBIA\t39273\tCO45101\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4729.mp3\tEddie Heywood\tI Cover The Waterfront\tCOMMODORE\t1514\t4729\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S645.mp3\tSarah Vaughan\tI Cover The Waterfront\tMGM\t30732\t48S645\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D330B.mp3\tArtie Shaw And His Orchestra\tI Cover The Waterfront\tV-DISC\t330B\t055257-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_032.mp3\tEddy Duchin And His Orchestra\tI Cover The Waterfront\tVICTOR\t24325\t76165-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480647.mp3\tArt Tatum\tI Cover The Waterfront\tClef\tEP-C-351\t1447-1\t1953\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3a/VIC27362-A.mp3\tArtie Shaw And His Orchestra\tI Cover The Waterfront (el Puerto Es Mi Dominio)\tVICTOR\t27362-A\t055257-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_080.mp3\tPatti Page\tI Cried\tMERCURY\t70416\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO41762.mp3\tSarah Vaughan\tI Cried For You\tCOLUMBIA\t38630\tCO41762\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA472.mp3\tFrank Luther\tI Cried For You\tDECCA\t1000\tDLA472\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62885.mp3\tCasa Loma Orchestra\tI Cried For You\tDECCA\t1864B\t62885\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC030301.mp3\tBunny Berigan And His Orch\tI Cried For You\tVICTOR\t26116A\t030301\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23986.mp3\tMildred Bailey & Her Orchestra\tI Cried For You\tVOCALION\t4619\t23986\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1634.mp3\tBing Crosby & J S Trotter Orch\tI Cried For You\tDECCA\t2273A\tDLA1634\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA546.mp3\tGene Austin Acc Victor Young\tI Cried For You\tDECCA\t926B\tDLA546\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26116.mp3\tBunny Berigan & His Orchestra\tI Cried For You\tVictor\t26116\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D380A2.mp3\tHarry James And His Orchestra (helen Forrest Voc)\tI Cried For You\tV-DISC\t380A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_252.mp3\tBunny Berigan And His Orchestra Feat. Kathleen Lane And Ruth Gaylor\tI Cried For You\tVICTOR\t26116A\t030301\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_077.mp3\tGlen Gray And Casa Loma Orchestra\tI Cried For You\tDECCA\t1864B\t62885\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU19498-2.mp3\tTeddy Wilson And His Orchestra\tI Cried For You (v B H)\tBRUNSWICK\t7729\t19498-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80361.mp3\tLouis Armstrong & His Orch\tI Cried For You Pt.1\tDECCA\t28099\t80361\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80362.mp3\tLouis Armstrong & His Orch\tI Cried For You Pt.2\tDECCA\t28100\t80362\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL5696.mp3\tBing Crosby / A.stordahl Orch\tI Cross My Fingers\tDECCA\t27111\tL5696\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_271.mp3\tPerry Como Feat. The Fontane Sisters\tI Cross My Fingers\tRCA Victor\t3846\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_207.mp3\tPercy Faith And His Orchestra Feat. Russ Emery\tI Cross My Fingers\tCOLUMBIA\t38786\tCO42984\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC021176.mp3\tBunny Berigan & His Orch\tI Dance Alone\tVICTOR\t25820A\t021176\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO33955-2.mp3\tCount Basie & His Orch\tI Didn't Know About You\tCOLUMBIA\t36766\tCO33955-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D393B1.mp3\tJo Stafford\tI Didn't Know About You\tV-DISC\t393B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_258.mp3\tCount Basie And His Orchestra\tI Didn't Know About You\tColumbia\t36766\tCO33955-2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4930.mp3\tAndrews Sisters - Vic Schoen\tI Didn't Know The Gun Was Loaded\tDECCA\t24613\tL4930\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO25352.mp3\tBenny Goodman And His Orchestra\tI Didn't Know What Time It Was\tCOLUMBIA\t35230\tCO25352\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MER11038s.mp3\tCharlie Parker String Ensemble\tI Didn't Know What Time It Was\tMERCURY\t11038\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_212.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tI Didn't Know What Time It Was\tDECCA\t2813A\t66786-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480443.mp3\tBenny Golson\tI Didn't Know What Time It Was\tNew Jazz\tNJLP8220\t1834\t1959\tCurtis Fuller (tb) Benny Golson (ts) Ray Bryant (p) Paul Chambers (b) Art Blakey (d)\nhttp://www.jazz-on-line.com/a/mp3t/TS480704.mp3\tArt Tatum\tI Didn't Know What Time It Was\tPablo\t2310-835\t1601-1\t1954\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3w/1939_076.mp3\tBenny Goodman And His Orchestra Feat. Louise Tobin\tI Didn't Know What Time It Was\tCOLUMBIA\t35230\tCO25352\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480854.mp3\tAndre Previn\tI Didn't Know What Time It Was\tRCA VICTOR\t20-3043\t\t1947\tAndre Previn, p; Al Viola, g; Lloyd Pratt, b; Jackie Mills, drums\nhttp://www.jazz-on-line.com/a/mp3o/BLUB-10502-B.mp3\tArtie Shaw And His Orchestra\tI Didn't Know What Time It Was (from The Musical Prod. ''too Many Girls'')\tBLUEBIRD\tB-10502-B\t043368-1\t1939\tVocal refrain by Helen Forrest  (From the musical prod. ''Too Many Girls'')\nhttp://www.jazz-on-line.com/a/mp3b/Blu043368-1.mp3\tArtie Shaw And His Orchestra\tI Didn't Know What Time It Was - V H F\tBluebird\tB-10502\t043368-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73389.mp3\tElla Fitzgerald W Billy Kyle\tI Didn't Mean A Word I Said\tDECCA\t18814A\t73389\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COL39736.mp3\tPeerless Quartet\tI Didn't Raise My Boy To Be A Soldier\tCOLUMBIA\tA-1697\t39736\t1914\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC15553-6.mp3\tMorton Harvey\tI Didn't Raise My Boy To Be A Soldier\tVICTOR\t17716\t15553-6\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_008.mp3\tMorton Harvey\tI Didn't Raise My Boy To Be A Soldier\tVICTOR\t17716\t15553-6\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_006.mp3\tPeerless Quartet\tI Didn't Raise My Boy To Be A Soldier\tCOLUMBIA\tA-1697\t39736\t1915\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI3584-C.mp3\tHelen Clark - Chorus - O\tI Didn't Raise My Boy To Be A Soldier (al Piantadosi)\tEDISON\tBA 2580\t3584-C\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC27018X.mp3\tBing Crosby\tI Didn't Slip, I Wasn't Pushed, I Fell\tDECCA\t27018\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_199.mp3\tDoris Day Feat. George Wyle's Orchestra With The Mellomen\tI Didn't Slip-i Wasn't Pushed-i Fell\tCOLUMBIA\t38818\tHCO4030\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeC-3677-1.mp3\tCount Basie And His Orchestra\tI Do Mean You\tOkeh\t6180\tC-3677-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC409-B.mp3\tBilly Eckstine\tI Do, Do You?\tNATIONAL\t\tNSC409-B\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_237.mp3\tDinah Shore\tI Do, Do You?\tBLUEBIRD\t11003\t058249\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU058806.mp3\tGlenn Miller & His Orch\tI Do, Do You? (vre)\tBLUEBIRD\t11020-A\t058806\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/MER5396x.mp3\tPatti Page\tI Don't Care If The Sun Don't Shine\tMERCURY\t5396\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_085.mp3\tPatti Page\tI Don't Care If The Sun Don't Shine\tMERCURY\t5396\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_395.mp3\tElvis Presley\tI Don't Care If The Sun Don't Shine\tRCA\tEPA-965\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74210.mp3\tBuddy Johnson And His Orch.\tI Don't Care Who Knows\tDECCA\t48088\t74210\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S85.mp3\tJoe Turner\tI Don't Dig It\tMGM\t10397\t48S85\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66896.mp3\tBlue Lu Barker & Fly Cats\tI Don't Dig You, Jack\tDECCA\t7770\t66896\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CHE1531x.mp3\tWillie Mabon\tI Don't Know\tCHESS\tCHES1531\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/HITCR347.mp3\tCootie Williams Sextet\tI Don't Know\tHIT OF THE WEEK\t8090\tCR347\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC13232.mp3\tFletcher Henderson & His Orch\tI Don't Know And I Don't Care\tVOCALION\t14828B\t13232\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18834B.mp3\tMills Brothers\tI Don't Know Enough About You\tDECCA\t18834B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_083.mp3\tMills Brothers\tI Don't Know Enough About You\tDECCA\t18834B\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_080.mp3\tPeggy Lee\tI Don't Know Enough About You\tCapitol\t236\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_175.mp3\tBenny Goodman And His Orchestra Feat. Art Lund\tI Don't Know Enough About You\tCOLUMBIA\t37053\tHCO1684-1\t1946\tNate Kazebier, Bernie Privin, Brody Schroff, John Best (tp), Lou McGarity, Eddie Benson, Dick LeFave (tb), Benny Goodman (cl), Bill Shine, Gerald Sanfino (as), Stan Getz, Gish Gilberton (ts), Danny Bank (bar), Mel Powell (p), Mike Bryan (g), Barney Spieler (sb), Ralph Collier (dm)\nhttp://www.jazz-on-line.com/a/mp3a/DEC61965.mp3\tExecutor And Gerald Clark\tI Don't Know How The Young Men Living\tDECCA\t17301B\t61965\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73590.mp3\tAndy Kirk And His Orchestra\tI Don't Know What I'd Do Without You\tDecca\t18916\t73590\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC061943.mp3\tDuke Ellington & His Orch\tI Don't Know What Kind Of Blues I Got\tVICTOR\t27804A\t061943\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK2816.mp3\tMoon Mullican\tI Don't Know What To Do\tKING\t5473\tK2816\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_043.mp3\tArthur Collins\tI Don't Know Where I'm Goin', But I'm On My Way\tVICTOR\t4804\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77184.mp3\tPeerless Qt\tI Don't Know Where I'm Going But I'm On My Way\tCOLUMBIA\tA-2329\t77184\t1917\t\nhttp://www.jazz-on-line.com/a/mp3e/AME031383.mp3\tArthur Collins\tI Don't Know Where I'm Going But I'm On My Way\tAMERICA\tAM31383\t031383\t1906\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC67545.mp3\tWayne King And His Orch\tI Don't Know Why\tVICTOR\t22817\t67545\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1028.mp3\tKing Cole Trio\tI Don't Know Why\tCAPITOL\t\t1028\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23590IDK.mp3\tEddie Heywood\tI Don't Know Why\tDECCA\t23590\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44023.mp3\tErroll Garner Trio\tI Don't Know Why\tCOLUMBIA\t39168\tCO44023\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT588.mp3\tDemarco Sisters+bud Freeman\tI Don't Know Why\tMAJESTIC\t7194\tT588\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW151787.mp3\tKate Smith\tI Don't Know Why\tCOLUMBIA\t2539\tW151787\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4175.mp3\tAndrews Sisters - V. Schoen\tI Don't Know Why\tDECCA\t18899A\tL4175\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_181.mp3\tKate Smith\tI Don't Know Why\tCOLUMBIA\t2539\tW151787\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_228.mp3\tAndrews Sisters\tI Don't Know Why\tDECCA\t18899A\tL4175\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_218.mp3\tTommy Dorsey And His Orchestra Feat. Stuart Foster\tI Don't Know Why (i Just Do)\tVICTOR\t1901\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS59048.mp3\tDon Byas Qt\tI Don't Know Why (v Teddy Reig)\tSAVOY\t609A\tS59048\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/COLC1199.mp3\tDuke Ellington & His Orch\tI Don't Know Why I Love You So\tCOLUMBIA\t37296\tC1199\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1902_030.mp3\tBert Williams\tI Don't Like That Face You Wear\tMONARCH\tV-0987\t0987\t1902\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143028.mp3\tGid Tanner Skillet Lickers\tI Don't Love Nobody\tCOLUMBIA\t15123 D\tW143028\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL262.mp3\tLee O'daniel Hillbilly Boys\tI Don't Mind\tVOCALION\t4542\tDAL262\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC63631-1.mp3\tBix Beiderbecke & His Orch\tI Don't Mind Walking In The Rain\tVICTOR\t23008\t63631-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_098.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tI Don't See Me In Your Eyes Anymore\tRCA Victor\t78-3347\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5417.mp3\tArtie Shaw And His Orchestra\tI Don't Stand A Ghost Of A Chance\tMUSICRAFT\t357\t5417\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1403-1.mp3\tFrankie Trumbauer Orch\tI Don't Stand A Ghost Of A Chance\tVARSITY\t8256\tUS1403-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCW24821.mp3\tMildred Bailey\tI Don't Stand A Ghost Of A Chance\tVOCALION\t5086\tW24821\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVB4407.mp3\tErroll Garner\tI Don't Stand A Ghost Of A Chance\tSAVOY\t724\tB4407\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC049935-1.mp3\tLionel Hampton & His Orch\tI Don't Stand A Ghost Of A Chance\tVICTOR\t26696\t049935-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/CONS3277.mp3\tCozy Cole & His Orchestra\tI Don't Stand A Ghost Of A Chance\tCONTIN\tT6000\tS3277\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic049935-1.mp3\tLionel Hampton And His Orchestra\tI Don't Stand A Ghost Of A Chance\tVictor\t26696\t049935-1\t19401\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S517.mp3\tSarah Vaughan\tI Don't Stand A Ghost Of A Chance With You\tMGM\t30341\t48S517\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec66878-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tI Don't Stand A Ghost Of A Chance With You\tDecca\t2915\t66878-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_400.mp3\tWoody Herman And His Orchestra\tI Don't Want Nobody (to Have My Love But You)\tCapitol\t3488\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/GENX0033.mp3\tSterling Trio\tI Don't Want The World\tGENNETT\t3279\tX0033\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35109.mp3\tGene Krupa & His Orch\tI Don't Want To Be Loved\tCOLUMBIA\t36862\tCO35109\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT522.mp3\tLouis Prima & His Orchestra\tI Don't Want To Be Loved\tMAJESTIC\t7141\tT522\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141836.mp3\tArt Gillam\tI Don't Want To Forget\tCOLUMBIA\t842 D\tW141836\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_118.mp3\tVan And Schenck\tI Don't Want To Get Well\tVICTOR\t18413B\t20939-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D356B1.mp3\tThe Three Suns (artie Dunn Voc.)\tI Don't Want To Love You\tV-DISC\t356B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_200.mp3\tPhil Brito Feat. O/paul Lavalle\tI Don't Want To Love You (like I Do)\tMUSICRAFT\t15018\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC18817.mp3\tStuff Smith & Onyx Club Boys\tI Don't Want To Make History\tVOCALION\t3200\t18817\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU101134-1.mp3\tStew Pletcher And His Orchestra\tI Don't Want To Make History\tBLUEBIRD\t6344\t101134-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO3910-1.mp3\tHorace Heidt And His Knights\tI Don't Want To Set The World On Fire\tCOLUMBIA\t36295\tCCO3910-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047796.mp3\tHarlan Leonard & His Rockets\tI Don't Want To Set The World On Fire\tBLUEBIRD\t10919\t047796\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69557-A.mp3\tBon Bon & His Buddies\tI Don't Want To Set The World On Fire\tDECCA\t3980A\t69557-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69660.mp3\tInk Spots\tI Don't Want To Set The World On Fire\tDECCA\t3987A\t69660\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol36295.mp3\tHorace Heidt & His Musical Knights\tI Don't Want To Set The World On Fire\tColumbia\t36295\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_033.mp3\tInk Spots\tI Don't Want To Set The World On Fire\tDECCA\t3987A\t69660\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_163.mp3\tMitchell Ayres And His Fashions In Music Feat. V/johnny Bond\tI Don't Want To Set The World On Fire\tBluebird\t11275\t067670-2\t1941\t\nhttp://www.jazz-on-line.com./a/mp3o/COLLEHO.mp3\tLes Elgart & His Orchestra\tI Don't Want To Set The World On Fire\tCOLUMBIA\t40326\tCO51663\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE30764-1.mp3\tTommy Tucker Orch (va.arnett)\tI Don't Want To Set The World On Fire (va.arnett)\tOKEH\t6320\t30764-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_232.mp3\tEddy Howard And His Orchestra\tI Don't Want To Take A Chance\tMERCURY\t5871\tYB4674\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO31954.mp3\tHarry James And His Orch\tI Don't Want To Walk Without You\tCOLUMBIA\t36478\tCO31954\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2859.mp3\tBing Crosby - J.s.trotter Orch\tI Don't Want To Walk Without You\tDECCA\t4184A\tDLA2859\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU068713-1.mp3\tErskine Hawkins\tI Don't Want To Walk Without You\tBLUEBIRD\t11439\t068713-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27746i.mp3\tArtie Shaw And His Orchestra\tI Don't Want To Walk Without You\tVictor\t27746\t068806-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_084.mp3\tDinah Shore\tI Don't Want To Walk Without You\tBluebird\t11423\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC71270.mp3\tBuddy Johnson And His Band\tI Done Found Out\tDECCA\t8647\t71270\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/CBS22722-2.mp3\tBud Freeman's Trio\tI Dont Believe It\tCBS\tCM504\t22722-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS22131-1.mp3\tRuss Morgan And His Orchestra Vocal Bernice Parkes\tI Double Dare You\tCBS\tBR8037\t22131-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC017742-1.mp3\tLarry Clinton & His Orchestra\tI Double Dare You\tVICTOR\t25740\t017742-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62711-AB.mp3\tWoody Herman & His Orchestra\tI Double Dare You\tDECCA\t1523\t62711-AB\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25740.mp3\tLarry Clinton & His Orchestra\tI Double Dare You\tVictor\t25740\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/dECDLA-1136-A.mp3\tLouis Armstrong And His Orchestra\tI Double Dare You\tDecca\t1636\tDLA-1136-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_327.mp3\tWoody Herman And His Orchestra\tI Double Dare You\tDECCA\t1523\t62711-AB\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_337.mp3\tLouis Armstrong\tI Double Dare You\tDecca\t1636\tDLA-1136-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_095.mp3\tLarry Clinton And His Orchestra Feat. Bea Wain\tI Double Dare You\tVICTOR\t25740\t017742-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-3096-A.mp3\tJimmie Lunceford And His Orchestra\tI Dream A Lot About You\tDecca\t18618\tL-3096-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/ColLA1988.mp3\tMartha Raye With Dave Rose Orchestra \tI Dream Of Jeannie \tColumbia\t35305\tLA1988\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC036501-3.mp3\tMaxine Sullivan\tI Dream Of Jeannie With The Light Brown Hair\tVICTOR\t26260\t036501-3\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BruWC2577.mp3\tGene Krupa And His Orchestra\tI Dream Of Jeannie With The Light Brown Hair\tBrunswick\t8387\tWC2577\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh122.mp3\tAmbrose And His Orchestra\tI Dream Of San Marino (v Sam Browne)\tDecca\tF-6200\tTB-2637-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO33928.mp3\tFrank Sinatra\tI Dream Of You\tCOLUMBIA\t36762\tCO33928\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAD4VB1031.mp3\tTommy Dorsey And His Orchestra\tI Dream Of You\tRCA\t20-1608\tD4VB1031\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D337B2.mp3\tAndy Russell\tI Dream Of You\tV-DISC\t337B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_080.mp3\tFrank Sinatra\tI Dream Of You\tCOLUMBIA\t36762\tCO33928\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_143.mp3\tPerry Como\tI Dream Of You\tVICTOR\t1629\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_044.mp3\tTommy Dorsey And His Orchestra Feat. Freddy Stewart\tI Dream Of You\tVICTOR\t1608\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU058888.mp3\tGlenn Miller And His Orch\tI Dreamt I Dwelt In Harlem\tBLUEBIRD\t11063\t058888\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC019658-1.mp3\tLarry Clinton And His Orchestra\tI Dreamt I Dwelt In Marble Halls\tVICTOR\t25789\t019658-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_254.mp3\tEugenie Baird And Mel Torme\tI Fall In Love Too Easily\tDECCA\t18707A\tL3818\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481777.mp3\tAnita O'day\tI Fall In Love Too Easily\tVerve\tMGV2000\t2559-10\t1955\tacc. by Paul Smith (p), Barney Kessel (g), Joe Mondragon (sb), Alvin Stoller (dm), Corky Hale (harp), strings. Buddy Bregman (arr, dir)\nhttp://www.jazz-on-line.com/a/mp3c/GUIG552.mp3\tGeorgie Auld & His Orchestra\tI Fall In Love Too Easily (v Gordon Drake)\tGUILDE\t116\tG552\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_061.mp3\tJimmy Dorsey And His Orchestra\tI Fall In Love With You Every Day\tDECCA\t1671\t63204\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63204.mp3\tJimmy Dorsey & His Orch.\tI Fall In Love With You Every Day (vbe)\tDECCA\t1671\t63204\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21832-A.mp3\tGeorge Olsen And His Music\tI Faw Down An' Go Boom\tVictor\t21832-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN8419.mp3\tCampus Boys\tI Faw Down An' Go Boom\tBANNER\t6257\t8419\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC49689-2.mp3\tEddie Cantor\tI Faw Down And Go Boom\tVICTOR\t21862\t49689-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_174.mp3\tEddie Cantor Feat. D/nat Shilkret\tI Faw Down And Go Boom\tVICTOR\t21862\t49689-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh074.mp3\tJack Payne And His Bbc Dance Orchestra\tI Faw Down An Go Boom (v Jack Payne & Bob Busby & Bob Manning)\tColumbia\t5360\tWA-8862-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1067.mp3\tFrances Langford\tI Feel A Song Coming On\tBRUNSWICK\t7512\tLA1067\t1935\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU17683-1.mp3\tLeo Reisman & His Orch\tI Feel A Song Coming On\tBRUNSWICK\t7483\t17683-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21034-B.mp3\tGeorge Olsen And His Music\tI Feel At Home With You\tVictor\t21034-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18517-1.mp3\tTeddy Wilson's Orchestra\tI Feel Like A Feather In The Breeze\tBRUNSWICK\t7599\t18517-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_043.mp3\tJan Garber And His Orchestra\tI Feel Like A Feather In The Breeze\tDecca\t647\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COL30156x.mp3\tBig Three Trio\tI Feel Like Steppin' Out\tCOLUMBIA\t30156\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC4085.mp3\tBig Bill\tI Feel So Good\tCOLUMBIA\t37088\tC4085\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20923-B.mp3\tJohnny Hamp's Kentucky Serenade\tI Fell Head Over Heels In L\tVictor\t20923-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR540-Hx.mp3\tHarmonians\tI Fell Head Over Heels In L\tHarmony\t540-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_061.mp3\tJohnny Hamp's Kentucky Serenaders\tI Fell Head Over Heels In Love\tVICTOR\t20923\t39149-3\t1927\tHal White (vo, vn), Lester Brewer, Clayton Tewkesbury (tp), William Benedict (tb), Ray Stillson, Cliff Gamet (cl, as), Howard Bartlett (cl, ss, ts), Charles Buckwalter (p), Frank Masterson (bj, g), Elwood Groff (bb), John Strouse (dm), Johnny Hamp (dir)\nhttp://www.jazz-on-line.com/a/mp3c/DEC67706.mp3\tElla Fitzgerald & Her Orch\tI Fell In Love With A Dream\tDECCA\t3199B\t67706\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic62346-2.mp3\tHerny ''red'' Allen And His New York Orchestra\tI Fell In Love With You\tVictor\t23338\t62346-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18295-1.mp3\tTeddy Wilson And His Orchestra\tI Found A Dream\tBRUNSWICK\t7572\tB-18295-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1043-B.mp3\tBing Crosby\tI Found A Million Dollar Baby\tBRUNSWICK\t6140\tLA1043-B\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC53080-2.mp3\tWaring's Pennsylvanians\tI Found A Million Dollar Baby\tVICTOR\t22707\t53080-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic22707.mp3\tWaring's Pennsylvanians\tI Found A Million Dollar Baby\tVictor\t22707\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU36827.mp3\tVictor Young & His Orch\tI Found A Million Dollar Baby (v Boswell Sisters)\tBRUNSWICK\t6128\t36827\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151574-1.mp3\tPaul Specht And His Orch\tI Found A Million Dollar Baby (vj.morris)\tCOLUMBIA\t2482 D\tW151574-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_019.mp3\tBing Crosby\tI Found A Million-dollar Baby\tBrunswick\t6140\tLA1043-B\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_042.mp3\tBoswell Sisters Feat. Victor Young's Orchestra\tI Found A Million-dollar Baby\tBRUNSWICK\t6128\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30422-2.mp3\tBenny Goodman And His Sextet Feauting Count Basie\tI Found A New Baby\tCOLUMBIA\t36039\tCO-29514-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO29514-1.mp3\tBenny Goodman Sextet\tI Found A New Baby\tCOLUMBIA\t36721\tCO29514-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/SUNSRC126.mp3\tWillie Smith Sextet\tI Found A New Baby\tSUNSET\t7560\tSRC126\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC21507.mp3\tErskine Hawkins Bama St.coll.\tI Found A New Baby\tVOCALION\t3668\t21507\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/ASCMA715.mp3\tMary Lou Williams Trio\tI Found A New Baby\tASCH\t351-3\tMA715\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/BAN6552-6.mp3\tDixie Washboard Band\tI Found A New Baby\tBANNER\t1781\t6552-6\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_282.mp3\tMills Brothers\tI Found A New Baby\tBANNER\t33254\tLA132-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_246.mp3\tHarry James And His Orchestra\tI Found A New Baby\tBRUNSWICK\t8406\t24691-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Har141526-3.mp3\tThe Dixie Stompers\tI Found A New Baby\tHarmony\t121-H\t141526-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24691-A.mp3\tHarry James And His Orchestra\tI Found A New Baby\tBrunswick\t8406\tB-24691-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA34.mp3\tMae West\tI Found A New Way To Go To Town\tBRUNSWICK\t6675\tLA34\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC78264-1.mp3\tRamona & Roy Bargy\tI Found A New Way To Go To Town\tVICTOR\t24440\t78264-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_066.mp3\tSterling Trio\tI Found A Rose In The Devil's Garden\tVICTOR\t18746\t25103\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_092.mp3\tSam Ash Feat. Milton Watson\tI Found A Rose In The Devil's Garden\tCOLUMBIA\t3374\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64576.mp3\tChick Webb & His Orchestra\tI Found My Yellow Basket\tDECCA\t2148A\t64576\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64576-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tI Found My Yellow Basket\tDecca\t2148\t64576-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_062.mp3\tElla Fitzgerald Feat. Chick Webb Orchestra\tI Found My Yellow Basket\tDECCA\t2148\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COL78685.mp3\tAl Jolson\tI Gave Her That\tCOLUMBIA\tA-2835\t78685\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_069.mp3\tAl Jolson\tI Gave Her That\tCOLUMBIA\tA-2835\t78685\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_291.mp3\tLeo Reisman And His Orchestra\tI Get A Kick Out Of You\tBrunswick\t7332\t16355-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC84771.mp3\tPaul Whiteman And His Orch\tI Get A Kick Out Of You\tVICTOR\t24769\t84771\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16397.mp3\tEthel Merman W- Johnny Green\tI Get A Kick Out Of You\tBRUNSWICK\t7342\t16397\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75642.mp3\tArtie Shaw And His Orchestra\tI Get A Kick Out Of You\tDECCA\t24869\t75642\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/PatCPT-2143-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tI Get A Kick Out Of You\tPath\tPA-669\tCPT-2143-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU7342.mp3\tEthel Merman W- Johnny Green\tI Get A Kick Out Of You\tBRUNSWICK\t7342\t16397\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/AtlRK-11.mp3\tErroll Garner Trio\tI Get A Kick Out Of You\tAtlantic\tARL 128\tRK-11\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031536.mp3\tCharlie Barnet & His Orch\tI Get Along Without You Very Well\tBLUEBIRD\t10119 A\t031536\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_131.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly\tI Get Along Without You Very Well\tDECCA\t2322A\t65051\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS24091.mp3\tRed Norvo And His Orchestra\tI Get Along Without You Very Well (vterry Allen)\tCBS\tVO4648\t24091\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-4141x.mp3\tTony Martin\tI Get Ideas\tRCA\t20-4141\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC81308-A.mp3\tLouis Armstrong - Sy Oliver\tI Get Ideas\tDECCA\t27720A\t81308-A\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_019.mp3\tTony Martin\tI Get Ideas\tRCA\t20-4141\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_015.mp3\tFour Knights\tI Get So Lonely (when I Dream About You)\tCapitol\t2654\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUMP35-A.mp3\tSlatz Randall And His Orch\tI Get The Blues When It Rains\tBRUNSWICK\t4331\tMP35-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146497.mp3\tHaworth,carl\tI Get The Blues When It Rains\tCOLUMBIA\t1502 D\tW146497\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW148555.mp3\tGuy Lombardo Royal Canadians\tI Get The Blues When It Rains\tCOLUMBIA\t1888 D\tW148555\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW148555.mp3\tGuy Lombardo Royal Canadians\tI Get The Blues When It Rains\tCOLUMBIA\t1888\tW148555\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO886.mp3\tCab Calloway & His Orch\tI Get The Neck Of The Chicken\tCOLUMBIA\t36662\tHCO886\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCWC2867.mp3\tSweet Violet Boys\tI Give In So Easy (v Gale Ryan)\tVOCALION\t5368\tWC2867\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_161.mp3\tMitchell Ayres And His Fashions In Music Feat. Tommy Taylor\tI Give You My Word\tBluebird\t10895\t56140\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_102.mp3\tEddy Duchin And His Orchestra Feat. V/june Robbing\tI Give You My Word\tCOLUMBIA\t35812\t28853\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS23812-1.mp3\tMildred Bailey\tI Go For That\tCBS\tVO4548\t23812-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_251.mp3\tEddy Duchin And His Orchestra Feat. V/stanley Worth\tI Go For That\tBRUNSWICK\t8278\t23718\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401808-B.mp3\tFred Hall & His Sugar Babies\tI Got A Code In My Doze\tOKeh\t41239\t401808-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72523.mp3\tJoe Turner-pete Johnson\tI Got A Gal For Every Day Of The Week\tDECCA\t29711\t72523\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62726.mp3\tChick Webb And His Orchestra Vocal Ella Fitzgerald\tI Got A Guy\tDECCA\t1681\t62726\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_335.mp3\tChick Webb And His Orchestra Feat. Ella Fitzgerald\tI Got A Guy\tDECCA\t1681\t62726\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS299.mp3\tBilly Kyle Trio\tI Got A Right To Sing The Blues\tDISC\t5003\t299\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21853-A.mp3\tJean Goldkette And His Orch\tI Got A Woman Crazy For Me\tVictor\t21853-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAM741x.mp3\tBob Haring And His Orch\tI Got Along Before I Met Yo\tCameo\t741\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/ColWC-3067-A.mp3\tJimmie Lunceford And His Orchestra\tI Got It\tColumbia\t35510\tWC-3067-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2610.mp3\tElla Fitzgerald And Her Orch\tI Got It Bad\tDECCA\t25125\tDLA2610\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec04103.mp3\tJimmy Dorsey & His Orchestra\tI Got It Bad\tDecca\t04103\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-17850.mp3\tTed Heath And His Music; Don Lusher, Trombone; Leslie Gilbert, Alto Sax (his 89th London Palladium S\tI Got It Bad\tDECCA-LONDON\tEFF.289-2 (BEP 6121)\tDR-17850\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu070333-1.mp3\tEarl Hines And His Orchestra\tI Got It Bad (and That Ain't Good)\tBluebird\tB-11374\t070333-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Nat Atkins (tb) Joe McLewis, George Hunt, Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck Parham (b) Rudolph\nhttp://www.jazz-on-line.com/a/mp3t/TS480772.mp3\tBen Webster & His Orch.\tI Got It Bad (and That Ain't Good)\tHaven\t802\th-1936\t1946\tLeonhard Graham (tp), Tony Scott (cl), Ben Webster (ts), Sadik Hakim (p), Bill De Arango (g), John Simmons (sb), Sid Catlett (dm)\nhttp://www.jazz-on-line.com/a/mp3c/COLCO31391.mp3\tBenny Goodman And His Orchestra\tI Got It Bad (from Jump For Joy)\tCOLUMBIA\t36421\tCO31391-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC061319.mp3\tDuke Ellington And His Orch\tI Got It Bad And That Ain't Good\tVICTOR\t27531\t061319\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL154--.mp3\tAl Hibbler W Harry Carney Band\tI Got It Bad And That Ain't Good\tALLADDIN\t154\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_136.mp3\tDinah Shore\tI Got It Bad And That Ain't Good\tBLUEBIRD\t11357\t067764\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_106.mp3\tDuke Ellington And His Famous Orchestra\tI Got It Bad And That Ain't Good\tVICTOR\t27531\t061319\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu070333-1.mp3\tEarl Hines And His Orchestra\tI Got It Bad And That Ain't Good (be,mg,ttv Vcl)  \tBluebird\tB-11374\t070333-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VARW109.mp3\tBunny Berigan & His Orch\tI Got It Bad And That Ain't Good (vlr)\tVARSITY\tEL5006\tW109\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLRR1698-3.mp3\tPeppermint Harris\tI Got Loaded\tALLADDIN\t3097\tRR1698-3\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN1001IG.mp3\tZeb Turner\tI Got Loaded\tKING\t1001\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143030.mp3\tGid Tanner's Skillet Lickers\tI Got Mine\tCOLUMBIA\t15134 D\tW143030\t1926\t\nhttp://www.jazz-on-line.com/a/mp3l/COLB18265.mp3\tLeo Reisman & His Orch\tI Got Plenty O' Nuttin'\tCOLUMBIA\t35971\tB18265\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA324.mp3\tBing Crosby W Victor Young\tI Got Plenty Of Nuttin'\tDECCA\t806B\tDLA324\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/CBS22313.mp3\tBud Freeman Trio\tI Got Rhythm\tCBS\tCM502\t22313\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21234-3.mp3\tGlenn Miller & His Orchestra\tI Got Rhythm\tBRUNSWICK\t7915\t21234-3\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC60898.mp3\tRed Norvo Swing Sextette\tI Got Rhythm\tDECCA\t779A\t60898\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC12007-A.mp3\tDon Redman & His Orch\tI Got Rhythm\tARC\tBR6354\t12007-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/SIGT19003.mp3\tDickie Wells & His Orch\tI Got Rhythm\tSIGNATURE\t90002B\tT19003\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/COLCL-6719-1.mp3\tLarry Adlert (with Django Reinhardt)\tI Got Rhythm\tCOLUMBIA\tCL-6719-1\tCL-6719-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO35207-1.mp3\tBenny Goodman Sextet\tI Got Rhythm\tCOLUMBIA\t36923\tCO35207-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/MAJT560.mp3\tBud Freeman And His Orch\tI Got Rhythm\tMAJESTIC\t1018\tT560\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_195.mp3\tLouis Armstrong\tI Got Rhythm\tCOLUMBIA\t2590 D\t152058\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-8491-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tI Got Rhythm \tParlophone\tF-I048\tCE-8491-1\t1937\tValaida Snow t v acc. by Johnny Claes t, Derek Neville as bar, Reggie Dare ts, Gun Finlay p, Norman Brown g, Louis Barreiro b, Ken Stewart d\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-2966-A.mp3\tFletcher Henderson Conducts Horace Henderson And His Orchestra\tI Got Rhythm\tOKEH\t5518\tWC-2966-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/BluBLP5014.mp3\tErroll Garner\tI Got Rhythm\tBlue Note\tBLP5014\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480713.mp3\tBenny Goodman Quartet\tI Got Rhythm\tColumbia\tSL 160\t\t1938\tCarnegie Hall Concert: <br>Benny Goodman (cl), Teddy Wilson (p), Gene Krupa (dm), Lionel Hampton (vib)\nhttp://www.jazz-on-line.com/a/mp3h/DH480856.mp3\tAndre Kostelanetz And His Orchestra\tI Got Rhythm\tCOLUMBIA\t4268-M\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE34959.mp3\tRed Nichols And His Orch\tI Got Rhythm (vdr)\tBRUNSWICK\t4957\tE34959\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-12007-A.mp3\tDon Redman And His Orchestra\tI Got Rythm\tBrunswick\t6354\tB-12007-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18588B.mp3\tMerry Macs\tI Got Ten Bucks And 24 Hours Leave\tDECCA\t18588B\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151842.mp3\tJack Teagarden & His Orch\tI Got The Ritz From The One I Love\tCOLUMBIA\treject\tW151842\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3577-.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tI Got The Stinger\tBrunswick\t7120\tC-3577-\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5473.mp3\tArtie Shaw And His Orchestra\tI Got The Sun In The Morning\tMUSICRAFT\t365\t5473\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36021.mp3\tLes Brown & Doris Day\tI Got The Sun In The Morning\tCOLUMBIA\t36977\tCO36021\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_234.mp3\tArtie Shaw And His Orchestra\tI Got The Sun In The Morning\tMUSICRAFT\t365\t5473\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_129.mp3\tLes Brown And His Orchestra Feat. Doris Day\tI Got The Sun In The Morning\tCOLUMBIA\t36977\tCO36021\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/CONC3767.mp3\tMemphis Minnie\tI Got To Make A Change Blues\tCONQUEROR\t9935\tC3767\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC64769.mp3\tBlue Lu Barker & Fly Cats\tI Got Ways Like The Devil\tDECCA\t7560\t64769\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC69786-1.mp3\tBlanche Calloway & Her Orch\tI Got What It Takes\tVICTOR\t22866\t69786-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC19205.mp3\tDon Redman And His Orchestra\tI Gotcha\tARC\tME60802\t19205\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-120-2.mp3\tBenny Carter And His Orchestra\tI Gotta Go\tVocalion\tS-16\tS-120-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COM24406.mp3\tBillie Holiday\tI Gotta Right To Sing The Blues\tCOMMODORE\t527\t24406\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC13123.mp3\tLee Wiley W Victor Young Orch\tI Gotta Right To Sing The Blues\tARC\t(Reject?)\t13123\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12674-1.mp3\tCab Calloway & His Orch\tI Gotta Right To Sing The Blues\tBRUNSWICK\t6460\t12674-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC74892-1.mp3\tLouis Armstrong And His Orch\tI Gotta Right To Sing The Blues\tVICTOR\t24233A\t74892-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24233.mp3\tLouis Armstrong\tI Gotta Right To Sing The Blues\tVictor\t24233\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_195.mp3\tLouis Armstrong\tI Gotta Right To Sing The Blues\tVictor\t24233\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_179.mp3\tCab Calloway And His Orchestra\tI Gotta Right To Sing The Blues\tBRUNSWICK\t6460\t12674-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru12674-A.mp3\tCab Calloway And His Orchestra\tI Gotta Right To Sing The Blues\tBrunswick\t6460\t12674-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_296.mp3\tBenny Goodman And His Orchestra Feat. Jack Teagarden\tI Gotta Right To Sing The Blues\tCOLUMBIA\t2835\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC18241HK1-5.mp3\tBlanche Calloway And Her Joy Boys\tI Gotta Swing (king Porter Stomp)\tVOCALION\t3112\t18241-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_199.mp3\tWoody Herman And His Orchestra\tI Guess I'll Be On My Way\tDECCA\t4095B\tC93768\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_148.mp3\tLes Brown And His Orchestra Feat. V/jack Haskel\tI Guess I'll Get The Papers (and Go Home)\tCOLUMBIA\t37066\tCO36544\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12201-A.mp3\tGuy Lombardo Royal Canadians\tI Guess I'll Have To Change My Plan\tBRUNSWICK\t6363\t12201-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_017.mp3\tRudy Vallee And His Connecticut Yankees\tI Guess I'll Have To Change My Plan (the Blue Pajama Song)\tCOLUMBIA\t2700 D\tW152257-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh197.mp3\tAmbrose And His Orchestra\tI Guess I'll Have To Change My Plan (v Sam Browne)\tHMV\tB-6261\tOB-4262-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152257-3.mp3\tRudy Vallee Connect.yankees\tI Guess I'll Have To Change My Plans\tCOLUMBIA\t2700\tW152257-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC73199-1.mp3\tPaul Whiteman & His Orch\tI Guess I'll Have To Change My Plans\tVICTOR\t24097\t73199-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480606.mp3\tThe Art Tatum Trio\tI Guess I'll Have To Change My Plans\tPablo\t2310-735\t2674-2\t1956\tArt Tatum (p), Red Callender (sb), Jo Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3a/VIC066430.mp3\tTommy Dorsey And His Orch\tI Guess I'll Have To Dream The Rest\tVICTOR\t27526\t066430\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_112.mp3\tTommy Dorsey Orch V Frank Sinatra\tI Guess I'll Have To Dream The Rest\tVICTOR\t27526\t066430\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061265.mp3\tGlenn Miller & His Orch\tI Guess I'll Have To Dream The Rest (vre)\tBLUEBIRD\t11187\t061265\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/BANLA3-A.mp3\tBing Crosby\tI Guess It Had To Be That Way\tBANNER\t33198\tLA3-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2169IH.mp3\tErskine Hawkins & His Orch.\tI Had A Good Cry\tRCA\t20-2169\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68875.mp3\tJimmie Lunceford & His Orch\tI Had A Premonition\tDECCA\t3718B\t68875\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec68875-A.mp3\tJimmie Lunceford And His Orchestra\tI Had A Premonition\tDecca\t3718\t68875-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38015.mp3\tSidney Bechet & Bob Wilbur\tI Had It, But It's All Gone Now\tCOLUMBIA\t38320\tCO38015\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC70023-B.mp3\tDick Robertson And His Orch\tI Had Someone Else Before I Had You\tDECCA\t4129A\t70023-B\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO867.mp3\tHarry James And His Orch\tI Had The Craziest Dream\tCOLUMBIA\t36659\tHCO867\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL36659.mp3\tHarry James & His Orchestra\tI Had The Craziest Dream\tCOLUMBIA\t36659\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65093-A.mp3\tElla Fitzgerald And Her Savoy Eight\tI Had To Live And Learn\tDecca\t2581\t65093-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022921.mp3\tTommy Dorsey & His Orch\tI Hadn't Anyone Till You\tVICTOR\t25848A\t022921\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU045784-1.mp3\tErskine Hawkins & His Orch\tI Hadn't Anyone Till You\tBLUEBIRD\t10565\t045784-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44116.mp3\tEarl Hines\tI Hadn't Anyone Till You\tCOLUMBIA\t39262\tCO44116\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC75287.mp3\tElla Fitzgerald\tI Hadn't Anyone Till You\tDECCA\t28181\t75287\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_177.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tI Hadn't Anyone Till You\tVICTOR\t25848A\t022921\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3269.mp3\tSons Of The Pioneers\tI Hand My Head & Cry\tDECCA\t6096\tL3269\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC74822-1.mp3\tLouis Armstrong And His Orch\tI Hate To Leave You Now\tVICTOR\t24204\t74822-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR30058-A.mp3\tGeorge Hamilton Green\tI Hate To Lose You\tParamount\t30058-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP3054.mp3\tBenny Goodman And His Orchestra\tI Hate To Lose You\tCAPITOL\t\t3054\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4808.mp3\tAndrews Sisters\tI Hate To Lose You\tDECCA\t24380\tL4808\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_115.mp3\tAndrews Sisters\tI Hate To Lose You\tDECCA\t24380\tL4808\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_0317_02.mp3\tLee Morse And Her Bluegrass Boys\tI Hate To Say Goodbye\tColumbia\t1063DB\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC89765.mp3\tFats Waller And His Rhythm\tI Hate To Talk About Myself\tVICTOR\t25039\t89765\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic89765-1.mp3\t\"fats Waller And His Rhythm\tI Hate To Talk About Myself\tVictor\t25039\t89765-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC75374.mp3\tRamona & Her Grand Piano\tI Hate To Think That You'll Grow Old\tVICTOR\t24277\t75374\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/MER798.mp3\tVic Damone W Jerry Gray's Orch\tI Have But One Heart\tMERCURY\t5053B\t798\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_155.mp3\tFrank Sinatra\tI Have But One Heart\tCOLUMBIA\t37076\tCO35484\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_078.mp3\tVic Damone\tI Have But One Heart (''o Marinariello'')\tMERCURY\t5053B\t798\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU027234-1.mp3\tArtie Shaw And His Orchestra\tI Have Eyes\tBLUEBIRD\t7889\t027234-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23457-1.mp3\tRed Norvo & His Orch\tI Have Eyes\tBRUNSWICK\t8227\t23457-1\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1548.mp3\tBing Crosby - J S Trotter\tI Have Eyes\tDECCA\t2201A\tDLA1548\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu7889.mp3\tArtie Shaw And His Orchestra\tI Have Eyes\tBluebird\t7889\t027234-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_191.mp3\tArtie Shaw And His Orchestra\tI Have Eyes\tBluebird\t7889\t27234\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_100.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton, V\tI Have Eyes\tVICTOR\t26071\t025467\t1938\tHarry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Dave Matthews, Noni Bernardi (as), Arthur Rollini, Bud Freeman (ts), Jess Stacy (p), Ben Heller (g), Harry Goodman (sb), Dave Tough (dm)\nhttp://www.jazz-on-line.com/a/mp3a/VIC025467.mp3\tBenny Goodman And His Orchestra\tI Have Eyes (vmt)\tVICTOR\t26071\t025467\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/COL41187IHT.mp3\tFrankie Laine\tI Have To Cry\tCOLUMBIA\t41187\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57127-2.mp3\tHelen Kane\tI Have To Have You\tVICTOR\t22192\t57127-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-31948.mp3\tLouisiana Rhythm Kings\tI Have To Have You\tBrunswick\t4706\tE-31948\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31948-A.mp3\tLouisiana Rhythm Kings\tI Have To Have You (v W. Vaughn) ('pointed Heels')\tBRUNSWICK\t4706\tE31948-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23301-2.mp3\tMildred Baily W Red Norvo\tI Haven't Changed A Thing\tVOCALION\t4282\t23301-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_212.mp3\tJimmy Dorsey And His Orchestra Feat. V/june Richmond\tI Haven't Changed A Thing\tDECCA\t1961A\t64351\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1983.mp3\tBing Crosby\tI Haven't Time To Be A Millionaire\tDECCA\t3161A\tDLA1983\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_212.mp3\tBing Crosby\tI Haven't Time To Be A Millionaire\tDECCA\t3161A\tDLA1983\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL29503.mp3\tBenny Goodman And His Orchestra\tI Hear A Rhapsody\tCOLUMBIA\t35937\t29503\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68461.mp3\tJimmy Dorsey And His Orch (vb.eberle)\tI Hear A Rhapsody\tDECCA\t3570B\t68461\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_077.mp3\tDinah Shore\tI Hear A Rhapsody\tBLUEBIRD\t11003\t058247\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_208.mp3\tFrank Sinatra\tI Hear A Rhapsody\tCOLUMBIA\t39652\tHCO10082\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_012.mp3\tCharlie Barnet And His Orchestra\tI Hear A Rhapsody\tBluebird\t10934\t56483\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_166.mp3\tAl Donahue And His Orchestra Feat. Phil Brito\tI Hear A Rhapsody\tOKEH\t5888\t28832-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_025.mp3\tJimmy Dorsey And His Orchestra\tI Hear A Rhapsody\tDECCA\t3570B\t68461\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Sel215A12A.mp3\tErroll Garner\tI Hear A Rhapsody Part 1\tSelmer\tY7216\t215A12A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Sel216A12B.mp3\tErroll Garner\tI Hear A Rhapsody Part 2\tSelmer\tY7216\t216A12B\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1573-1.mp3\tJack Teagarden & Orch\tI Hear Bluebirds\tVARSITY\t8273\tUS1573-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28618.mp3\tBillie Holiday & Her Orch\tI Hear Music\tOKEH\t5831\t28618\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE28644-1.mp3\tGene Krupa & His Orch\tI Hear Music\tOKEH\t5802\t28644-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_017.mp3\tGale Storm\tI Hear You Knocking\tDot\t15412\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D264A.mp3\tGlenn Miller Army Air Force Band\tI Hear You Screamin'\tV-Disc\t264A\t\t1944-\tcorrupted at 1:09\nhttp://www.jazz-on-line.com/a/mp3a/BRU11377-A.mp3\tMills Brothers-novelty Quartet\tI Heard\tBRUNSWICK\t6269\t11377-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_027.mp3\tMills Brothers\tI Heard\tBANNER\t33213\t11377-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Col152218-1.mp3\tHarlan Lattimore And His Connie's Inn Orchestra\tI Heard\tColumbia\t2678-D\t152218-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-37292-A.mp3\tDon Redman And His Orchestra\tI Heard\tBrunswick\t6233\tE-37292-A  \t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh149.mp3\tJohnny Claes And His Clay Pigeons\tI Heard (v Benny Lee)\tColumbia\tFB-2741\tCA-18767-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE37292.mp3\tDon Redman & His Orch\tI Heard (vv D R)\tBRUNSWICK\t6233\tE37292\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS20259.mp3\tHenry Hall's Bbc Orchestra\tI Heard A Song In A Taxi\tCBS\tCO3160D\t20259\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO853.mp3\tHarry James And His Orch\tI Heard You Cried Last Night\tCOLUMBIA\t36677\tHCO853\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM54S304.mp3\tAl Vino  With Orch\tI Heard You Cried Last Night. (and So Did I)\tMGM\t11805\t54S304\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC100012-1.mp3\tGene Krupa's Swing Band\tI Hope Gabriel Likes My Music\tVICTOR\t25276\t100012-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18656.mp3\tStuff Smith Onyx Club Boys\tI Hope Gabriel Likes My Music\tARC\tVO3170\t18656\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60252-B.mp3\tLouis Armstrong & His Orch.\tI Hope Gabriel Likes My Music\tDECCA\t672A\t60252-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18630-1.mp3\tFrankie Trumbauer's Orch\tI Hope Gabriel Likes My Music\tBRUNSWICK\t7613\t18630-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU101135-1.mp3\tStew Pletcher And His Orchestra\tI Hope Gabriel Likes My Music\tBLUEBIRD\t6345\t101135-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_185.mp3\tLouis Armstrong\tI Hope Gabriel Likes My Music\tDECCA\t672A\t60252-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D491IH.mp3\tErskine Hawkins & His Orch\tI Hope To Die\tV-DISC\t491\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCLA1310.mp3\tLouis Prima New Orleans Gang\tI Just Can't Believe You're Gone\tVOCALION\t3921\tLA1310\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COL3588x.mp3\tAda Jones (soprano)\tI Just Can't Make My Eyes Behave\tCOLUMBIA\tA-0349\t3588\t1906\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic09685-1.mp3\tLionel Hampton And His Orchestra\tI Just Couldn't Take It Baby\tVictor\t25682\t09685-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09685.mp3\tLionel Hampton & His Orch\tI Just Couldn't Take It, Baby\tVICTOR\t25682\t09685\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB14297-A.mp3\tJack Teagarden & His Orch\tI Just Couldn't Take It, Baby (v J T)\tBRUNSWICK\t6716\tB14297-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S6074.mp3\tHank Williams\tI Just Don't Like This Kind Of Livin'\tMGM\t10609\t49S6074\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042782.mp3\tGlenn Miller & His Orch\tI Just Got A Letter (vmh)\tBLUEBIRD\t10448\t042782\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC102401.mp3\tFats Waller And His Rhythm\tI Just Made Up With That Old Girl Of Mine\tVICTOR\t25394\t102401\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic102401-1.mp3\tFats Waller And His Rhythm\tI Just Made Up With That Old Girl Of Mine\tVictor\t25394\t102401-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/MER861-2.mp3\tHelen Humes\tI Just Refuse To Sing The Blues\tMERCURY\t8056\t861-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_337.mp3\tMitchell Ayres And His Fashions In Music\tI Just Wanna Play With You\tBluebird\t10884\t056141-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC6126.mp3\tIsham Jones And His Orch\tI Keep Remembering (someone That I Should Forget)\tBRUNSWICK\t4985\tC6126\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043990.mp3\tCharlie Barnet & His Orch\tI Kinda Like You (v M A M)\tBLUEBIRD\t10568\t043990\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC51658-2.mp3\tJack Smith And Victor Orch\tI Kiss Your Hand Madame\tVICTOR\t21973\t51658-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS22753-2.mp3\tRed Norvo & His Orchestra\tI Kiss Your Hand Madame\tCBS\t(Reject)\t22753-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_138.mp3\tSmith Ballew And His Orchestra\tI Kiss Your Hand, Madame\tOkeh\t41226\t401804-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC73162.mp3\tJubilaires W Andy Kirk Orch.\tI Know\tDECCA\t18782B\t73162\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_116.mp3\tTex Beneke And The Glenn Miller Orchestra Feat. The Crew Chiefs\tI Know\tRCA Victor\t1914\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73162.mp3\tAndy Kirk And His Orchestra And The Jubalaires\tI Know\tDecca\t18782\t73162\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO3686.mp3\tTeddy Wilson & His Orchestra\tI Know All That You Know\tCOLUMBIA\t36633\tCCO3686\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69366.mp3\tSam Price's Texas Blusicians\tI Know How To Do It\tDECCA\t8566B\t69366\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_035.mp3\tGuy Lombardo And His Royal Canadians\tI Know Now\tVictor\t25566\t07729\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62679.mp3\tEdgar Hayes Quintet\tI Know Now\tDECCA\t1509\t62679\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP775.mp3\tKing Cole Trio\tI Know That You Know\tCAPITOL\t\t775\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1658.mp3\tBenny Goodman Quintet\tI Know That You Know\tCAPITOL\t\t1658\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC100059.mp3\tBenny Goodman And His Orchestra\tI Know That You Know\tVICTOR\t25290\t100059\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030777-2.mp3\tBenny Goodman Qt\tI Know That You Know\tVICTOR\t26139\t030777-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62831.mp3\tJimmy Noone & His Orchestra\tI Know That You Know\tDECCA\t1584\t62831\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07867-1.mp3\tLionel Hampton & His Orch\tI Know That You Know\tVICTOR\t25592\t07867-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN6977-3.mp3\tSam Lanin And His Orchestra\tI Know That You Know\tBANNER\t1913\t6977-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM491.mp3\tColeman Hawkins\tI Know That You Know\tDECCA\t8710\tAM491\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68856.mp3\tJoe Marsala & His Orchestra\tI Know That You Know\tDECCA\t3764A\t68856\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1937.mp3\tJimmie Noone's Apex Jazz Band\tI Know That You Know\tVOCALION\t1184\tC1937\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-66-1.mp3\tRex Stewart And His Feetwarmers (with Django Reinhardt)\tI Know That You Know\tSWING\t70\tOSW-66-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU19751-1.mp3\tRed Norvo And His Orch\tI Know That You Know\tBRUNSWICK\t7744\t19751-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_054.mp3\tNat Shilkret And The Victor Orchestra\tI Know That You Know\tVICTOR\t20437\t37539-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic07867-1.mp3\tLionel Hampton And His Orchestra\tI Know That You Know\tVictor\t25592\t07867-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480607.mp3\tNat King Cole\tI Know That You Know\tCapitol\tEAP2/EBF1/W-782\t15937-3\t1956\tNat King Cole, P & Vocal, John Collins, G, Stuff Smith, V, Charlie Harris, B, Lee Young, D\nhttp://www.jazz-on-line.com/a/mp3w/1936_205.mp3\tBenny Goodman And His Orchestra\tI Know That You Know\tVICTOR\t25290\t100059\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC37539-4.mp3\tNat Shilkret & Victor Orch\tI Know That You Know (v F B)\tVICTOR\t20437\t37539-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4889.mp3\tLouis Jordan\tI Know What I've Got\tDECCA\t24587\tL4889\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73721.mp3\tLouis Jordan\tI Know What You're Puttin' On\tDECCA\t23901\t73721\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK5032.mp3\tBull Moose Jackson\tI Know Who Threw The Whiskey In The Well\tKING\t4244\tK5032\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU061246.mp3\tGlenn Miller And His Orch\tI Know Why (vpk)\tBLUEBIRD\t11230-A\t061246\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68172.mp3\tLouis Jordan & His Tympani 5\tI Know You\tDECCA\t8501\t68172\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC72002-1.mp3\tCoon-sanders Orchestra\tI Know You're Lying\tVICTOR\t22969\t72002-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_395.mp3\tBilly Eckstine\tI Laugh To Keep From Crying\tMGM\t11511\t53S195\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC83301.mp3\tLouis Armstrong\tI Laughed At Love\tDECCA\t28394\t83301\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_110.mp3\tSunny Gale Feat. Ralph Burns' Orchestra\tI Laughed At Love\tRCA\t20-4789\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM53S195.mp3\tBilly Eckstine\tI Laughed To Keep From Crying\tMGM\t11511\t53S195\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM48S410.mp3\t5 Red Caps\tI Learned A Lesson I'll Never Forget\tMGM\t10330\t48S410\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_126.mp3\tFive Red Caps\tI Learned A Lesson I'll Never Forget\tBeacon\t7120\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC77685-3.mp3\tCab Calloway & His Orch\tI Learned About Love From Her\tVICTOR\t24557\t77685-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic77685-3.mp3\tCab Calloway And His Cotton Club Orchestra\tI Learned About Love From Her\tVictor\t24557\t77685-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23475x.mp3\tJosh White And Ed Hall\tI Left A Good Deal In Mobile\tDECCA\t23475\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149310.mp3\tTom Darby & Jimmie Tarlton\tI Left Her At The River\tCOLUMBIA\t15492 D\tW149310\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26277.mp3\tCount Basie And His Orch\tI Left My Baby\tCOLUMBIA\t35321\t26277\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26277-A.mp3\tCount Basie And His Orchestra\tI Left My Baby\tColumbia\t35231\t26277-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM50S3002.mp3\tBilly Eckstine Woody Herman\tI Left My Hat In Haiti (from The Royal Wedding)\tMGM\t10916A\t50S3002\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC075072.mp3\tSwing And Sway With Sammy Kaye\tI Left My Heart At The Stage Door Canteen\tVICTOR\t27932\t075072\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN2482-K.mp3\tMoon Mullican\tI Left My Heart In Texas\tKING\t673A\t2482-K\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP9688.mp3\tDuke Ellington And His Famous Orchestra\tI Let A Song Go Out Of My Heart\tCOLUMBIA\t39739\tZSP9688\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25840.mp3\tBenny Goodman & His Orchestra\tI Let A Song Go Out Of My Heart\tVictor\t25840\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC022487.mp3\tBenny Goodman And His Orchestra\tI Let A Song Go Out Of My Heart\tVICTOR\t25840\t022487\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_136.mp3\tMildred Bailey Feat. Red Norvo (bandleader)\tI Let A Song Go Out Of My Heart\tVOCALION\t4083\t22755-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_088.mp3\tConnee Boswell\tI Let A Song Go Out Of My Heart\tDECCA\t1896A\t63993\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_012.mp3\tDuke Ellington And His Famous Orchestra Feat. Johnny Hodges: Bigard. Carney, And Brown\tI Let A Song Go Out Of My Heart\tBRUNSWICK\t8108\tM772-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_027.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tI Let A Song Go Out Of My Heart\tVICTOR\t25840\t022487\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22755-2.mp3\tMildred Bailey & Her Orchestra\tI Let A Song Go Out Of My Heart (vmb)\tVOCALION\t4083\t22755-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64465-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tI Let A Tear Fall In The River\tDecca\t2080\t64465-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47500.mp3\tFrankie Laine\tI Let Her Go\tCOLUMBIA\t39979\tCO47500\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_365.mp3\tFrankie Laine\tI Let Her Go\tCOLUMBIA\t39979\tCO47500\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC15899.mp3\tHattie Hart\tI Let My Daddy Do That\tARC\tVO2855z\t15899\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC83536.mp3\tGoldie Hill\tI Let The Stars Get In My Eyes\tDECCA\t28473\t83536\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D605.mp3\tLouis Jordan Tympany 5\tI Like 'em Fat Like That\tV-DISC\t478\t605\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13037-B.mp3\tMae West W Studio Band\tI Like A Guy What Takes His Time\tBRUNSWICK\t6495\t13037-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_050.mp3\tMae West\tI Like A Guy What Takes His Time\tARC\tBR6495\tB13037-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC63684-2.mp3\tJoe Venuti & His Orchestra\tI Like A Little Girl Like That (v F L)\tVICTOR\t23015B\t63684-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102004-1.mp3\tWillie Bryant & His Orch\tI Like Bananas\tBLUEBIRD\t6436\t102004-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_181.mp3\tJane Turzy\tI Like It\tDECCA\t27851\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5793-ANM-.mp3\tWynonie Harris & His Allstars\tI Like My Baby's Pudding\tKING\t4342AA\tK5793-ANM-\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO30310.mp3\tFletcher Henderson\tI Like My Sugar Sweet\tCOLUMBIA\t36214\tCO30310\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/ColCO-30310-1.mp3\tFletcher Henderson And His Orchestra\tI Like My Sugar Sweet\tColumbia\t36214\tCO-30310-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU8884x.mp3\tFour Clefs\tI Like Pie I Like Cake\tBLUEBIRD\t8884\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0113_01.mp3\tLee Morse\tI Like Pie I Like Cake\tPerfect\t12189A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/V-DVP1025.mp3\tDuke Ellington And His Orchestra\tI Like The Sunrise\tV-DISC\t858\tXC040788\t1947\tShelton Hemphill, Francis Williams, Harold \"Shorty\" Baker, Al Killian (tp) Ray Nance (tp,vln,vcl) Lawrence Brown, Claude Jones (tb) Tyree Glenn (tb,vib) Jimmy Hamilton (cl,ts) Johnny Hodges (as) Russell Procope (as,cl) Al Sears (ts) Harry Carney (bar,cl,b-cl) Duke Ellington (p) Fred Guy (g) Oscar Pettiford, Junior Raglin (b) Sonny Greer (d) Elaine Jones (tympani) Al Hibbler (vcl) \nhttp://www.jazz-on-line.com/a/mp3w/1951_100.mp3\tArthur Godfrey And Laurie Anders\tI Like The Wide Open Spaces\tCOLUMBIA\t39404\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO45779.mp3\tArthur Godfrey\tI Like Them Wide Open Spaces\tCOLUMBIA\t39404\tCO45779\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE780.mp3\tJesse Stafford And His Orch\tI Like To Do Things For You\tBRUNSWICK\t4822\tLAE780\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/QRS2374-1.mp3\tPletcher's Eli Prom Trotters\tI Like To Do Things For You\tQRS\t1055A\t2374-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW149826-2.mp3\tPaul Whiteman And His Orchestra (vocal Bing Crosby)\tI Like To Do Things For You\tColumbia\tE CB87\tW149826-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404008-A.mp3\tFrankie Trumbauer & His Orch\tI Like To Do Things For You (v J. Lang)\tOKeh\t41421\t404008-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW149826.mp3\tPaul Whiteman & His Orch\tI Like To Do Things To You\tCOLUMBIA\t2170 D\tW149826\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR5898.mp3\tKing Cole Qt\tI Like To Riff\tVARSITY\t8340\t5898\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69507.mp3\tKing Cole Trio\tI Like To Riff\tDECCA\t8592\t69507\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D342A1.mp3\tCharlie Barnet And His Orchestra ('peanuts' Holland\tI Like To Riff\tV-DISC\t342A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU07393HW2-1.mp3\tBoots And His Buddies\tI Like You Best Of All\tBLUEBIRD\t6862\t07393-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_338.mp3\tJerry Vale\tI Live Each Day\tCOLUMBIA\t40201\tCO50234-1\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24070-3.mp3\tHorace Heidt & Musical Knights\tI Long To Belong To You (vlarry Cotton)\tCBS\tBR8331\t24070-3\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_357.mp3\tLassies\tI Look At You\tDecca\t29868\t89407\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14987-1.mp3\tCharlie Barnet & His Orch\tI Lost Another Sweetheart (v J M)\tBANNER\t33033\t14987-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCSA2869.mp3\tNite Owls\tI Lost My Gal Again\tVOCALION\t4853\tSA2869\t\t\nhttp://www.jazz-on-line.com/a/mp3h/Gen16605.mp3\tCliff Perrine And His Orchestra\tI Lost My Gal From Memphis\tGennett\t7214\t16605\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-5755-.mp3\tJimmie Noone's Apex Club Orchestra\tI Lost My Gal From Memphis\tVocalion \t1497\tC-5755-\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/BruC-4460-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tI Lost My Gal From Memphis\tBrunswick\t4803\tC-4460-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE20224.mp3\tIsham Jones & His Orch\tI Lost My Heart In Monterey\tBRUNSWICK\t3333\tE20224\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/CAPjmilmsinslc.mp3\tJohnny Mercer\tI Lost My Sugar In Salt Lake City\tCAPITOL\t\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_096.mp3\tJohnny Mercer\tI Lost My Sugar In Salt Lake City\tCapitol\t10157\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1163.mp3\tTed Daffan's Texans\tI Lost My Sunshine\tOKEH\t6504\tDAL1163\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_149.mp3\tArden-ohman Orchestra Feat. V/frank Luther\tI Love A Parade\tVICTOR\t22892\t71200-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC16965-1.mp3\tBilly Murray\tI Love A Piano\tVICTOR\t17945\t16965-1\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_018.mp3\tBilly Murray\tI Love A Piano\tVICTOR\t17945\t16965-1\t1916\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64574-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tI Love Each Move You Make\tDecca\t2105\t64574-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO47470.mp3\tArthur Godfrey\tI Love Girls\tCOLUMBIA\t39792\tCO47470\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_138.mp3\tArthur Godfrey\tI Love Girls\tCOLUMBIA\t39792\tCO47470\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE19454.mp3\tBen Bernie & His Orch\tI Love Her\tBRUNSWICK\t3201\tE19454\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80328.mp3\tEddie Cantor & Irving Kaufman\tI Love Her, She Loves Me\tCOLUMBIA\tA-3624\t80328\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_029.mp3\tEddie Cantor\tI Love Her-she Loves Me (i'm Her He-she's My She)\tCOLUMBIA\t3624\t80328\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/COL4901.mp3\tArthur Collins (baritone)\tI Love It\tCOLUMBIA\tA-0940\t4901\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_027.mp3\tArthur Collins\tI Love It!\tCOLUMBIA\tA-0940\t04901\t1911\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM53S3061.mp3\tFred Astaire\tI Love Louisa\tMGM\t30792\t53S3061\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_052.mp3\tLeo Reisman And His Orchestra Feat. V/ Fred Astaire\tI Love Louisa\tVICTOR\t22755\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10383.mp3\tDesi Arnaz\tI Love Lucy\tCOLUMBIA\t39937\tHCO10383\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81004.mp3\tEddie Cantor\tI Love Me\tCOLUMBIA\tA-3906\t81004\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_255.mp3\tGray Gordon And His Orchestra\tI Love Me\tBluebird\t10591\t46089\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_459.mp3\tMickey Mantle And Teresa Brewer\tI Love Mickey\tCoral\t61700\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC33823-3.mp3\tAileen Stanley\tI Love My Baby\tVICTOR\t19950\t33823-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_1100_01.mp3\tLee Morse\tI Love My Baby\tPathe\t25168A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR141341-2.mp3\tUniversity Six\tI Love My Baby\tHARMONY\t73-H\t141341-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCWC2755.mp3\tSweet Violet Boys\tI Love My Fruit\tVOCALION\t5162\tWC2755\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/APOR-1007.mp3\tEarl Hines Sextet\tI Love My Lovin' Lover\tAPOLLO\t356\tR-1007\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/ApoR-1007.mp3\tEarl Hines Sextet\tI Love My Lovin' Lover\tApollo\t356\tR-1007\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP670.mp3\tBilly Holiday\tI Love My Man\tV-DISC\t248\tVP670\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon056500.mp3\tByron Parker & Mountaineers\tI Love My Saviour\tMontgomeryWard\t8873\t056500\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2479x.mp3\tLes Baxter\tI Love Paris\tCAPITOL\t2479\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30891.mp3\tXavier Cugat And His Orch\tI Love The Conga\tCOLUMBIA\t36386\tCO30891\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44130.mp3\tSarah Vaughan\tI Love The Guy\tCOLUMBIA\t38925\tCO44130\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_108.mp3\tSarah Vaughan\tI Love The Guy\tCOLUMBIA\t38925\tCO44130\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/COL39248-2.mp3\tArthur Collins-byron Harlan\tI Love The Ladies\tCOLUMBIA\tA-1513\t39248-2\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_009.mp3\tArthur Collins And Byron Harlan\tI Love The Ladies\tCOLUMBIA\tA-1513\t39248-2\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC165.mp3\tBilly Eckstine & His Orch\tI Love The Loveliness\tNATIONAL\t\tNSC165\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_093.mp3\tWalter Van Brunt\tI Love The Name Of Mary\tVICTOR\t17107\t11811-3!\t1912\t\nhttp://www.jazz-on-line.com/a/mp3a/NATNSC55.mp3\tBilly Eckstine And His Orch\tI Love The Rhythm In A Riff\tNATIONAL\t\tNSC55\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_230.mp3\tFour Knights\tI Love The Sunshine Of Your Smile\tCapitol\t1587\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC67551-1.mp3\tTed Weems & His Orch\tI Love To Hear A Military Band\tVICTOR\t22822\t67551-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1090-A.mp3\tCab Calloway & His Orch\tI Love To Sing-a\tBRUNSWICK\t7638\tLA1090-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021151-1.mp3\tFats Waller And His Rhythm\tI Love To Whistle (vfw)\tVICTOR\t25806\t021151-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COL27897.mp3\tOrrin Tucker And His Orch\tI Love Ya, I Betcha\tCOLUMBIA\t35722\t27897\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLL3314.mp3\tBing Crosby\tI Love You\tDECCA\t18595A\tL3314\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/Cap191.mp3\tJo Stafford\tI Love You\tCapitol\t153\t191\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC28581-4.mp3\tPaul Whiteman & His Orch\tI Love You\tVICTOR\t19151\t28581-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D207B.mp3\tAndre Kostelanetz And His Orchestra\tI Love You\tV-DISC\t207B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_142.mp3\tPerry Como\tI Love You\tRCA\t20-1569\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_073.mp3\tJo Stafford\tI Love You\tCapitol\t153\t191\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24646-B.mp3\tJimmie Lunceford And His Orchestra\tI Love You\tOkeh\t4979\t24646-B\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3t/TS480565.mp3\tArt Farmer Quintet\tI Love You\tUnited Artists\tUAL4007\t\t1958\tArt Farmer, T, Flh, Benny Golson, Ts, Addison Farmer, B, Bill Evans, P, Dave Bailey, D, Gigi Gryce, Ar\nhttp://www.jazz-on-line.com/a/mp3w/1929_039.mp3\tTed Lewis And His Band\tI Love You (my Love Song)\tCOLUMBIA\t1916\tW148578-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4188.mp3\tLefty Frizell\tI Love You A Thousand Ways\tCOLUMBIA\t20739\tHCO4188\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-12077-A.mp3\tEarl Hines And His Orchestra\tI Love You Because I Love You (instr.)\tBrunswick\t\tB-12077-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-12076-A.mp3\tEarl Hines And His Orchestra\tI Love You Because I Love You (vocal)\tBrunswick\t6379\tB-12076-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_1205_01.mp3\tLee Morse\tI Love You Believe Me I Loveyou\tColumbia\t2063DA\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5442.mp3\tFrankie Laine & Patti Page\tI Love You For That\tMERCURY\t5442\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_174.mp3\tFour Coins\tI Love You Madly\tEpic\t9082\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3h/ARC12067-2.mp3\tArt Kahn's  Orchestra\tI Love You More And More Each Day\tARC\tME12441\t12067-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26534.mp3\tGene Krupa & His Orch\tI Love You Much Too Much\tCOLUMBIA\t35429\t26534\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_361.mp3\tBob Zurke And His Delta Rhythm Band And Evelyn Poe\tI Love You Much Too Much\tVictor\t26561\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0800_06.mp3\tLee Morse\tI Love You So\tPathe\t25158B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_022.mp3\tHarry Macdonough And Elise Stevenson\tI Love You So\tVictor\t5340\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_143.mp3\tBob Haring And His Orchestra\tI Love You So Much\tBRUNSWICK\t4852\tE33302\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15243.mp3\tJimmy Wakely\tI Love You So Much It Hurts\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4850.mp3\tMills Brothers\tI Love You So Much It Hurts\tDECCA\t24550\tL4850\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_153.mp3\tJimmy Wakely\tI Love You So Much It Hurts\tCapitol\t1630\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_071.mp3\tMills Brothers\tI Love You So Much It Hurts\tDECCA\t24550\tL4850\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_246.mp3\tBuddy Clark Feat. O/earle Hagen\tI Love You So Much It Hurts\tCOLUMBIA\t38406\tHCO3514\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79362-4.mp3\tTed Lewis Jazz Band\tI Love You Sunday\tCOLUMBIA\tA-3306\t79362-4\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC12069-1.mp3\tElsie Baker\tI Love You Truly\tVICTOR\t17121\t12069-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1080.mp3\tLouis Prima's New Orleans Gang\tI Love You Truly\tBRUNSWICK\t7596\tLA1080\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU065730-1.mp3\tErskine Hawkins & His Orch\tI Love You Truly\tBLUEBIRD\t11419\t065730-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU94525.mp3\tBoots And His Buddies\tI Love You Truly\tBLUEBIRD\t6081\t94525\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA6-B.mp3\tBing Crosby\tI Love You Truly\tDECCA\t100A\tDLA6-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_009.mp3\tElsie Baker\tI Love You Truly\tVICTOR\t17121\t12069-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA6-A.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tI Love You Truly\tDecca\t100\tDLA6-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA6-B.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tI Love You Truly\tDecca\t100\tDLA6-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1387.mp3\tCootie Williams & His Orch\tI Love You, Yes I Do\tMERCURY\t8073\t1387\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_185.mp3\tBull Moose Jackson\tI Love You, Yes I Do\tKING\t4181A\tK5231-S1-2\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_012.mp3\tArthur Collins\tI Love, I Love, I Love My Wife, But Oh You Kid!\tCOLUMBIA\tA-0707\t04115\t1909\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC32888-2.mp3\tFrank Crumit\tI Married A Bootlegger's Daughter\tVICTOR\t19739\t32888-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC2414.mp3\tSweet Violet Boys\tI Married A Mouse Of A Man\tVOCALION\t4714\tC2414\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022674-1.mp3\tLarry Clinton & His Orchestra\tI Married An Angel\tVICTOR\t25837\t022674-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_071.mp3\tLarry Clinton And His Orchestra Feat. V/bea Wain\tI Married An Angel\tVICTOR\t25837\t022674-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22949-1.mp3\tSammy Kaye Swing & Sway Orch\tI Married An Angel (vj.brown)\tCBS\tVO4140\t22949-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_148.mp3\tFrank Crumit\tI Married The Bootlegger's Daughter\tVICTOR\t19739\t32888-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP967.mp3\tCootie Williams & His Orch\tI May Be Easy But I'm No Fool\tCAPITOL\t\t967\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20082-1.mp3\tShannon Qt\tI May Be Gone For A Long, Long Time\tVICTOR\t18333\t20082-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77126.mp3\tPeerless Qt\tI May Be Gone For A Long, Long Time\tCOLUMBIA\tA-2306\t77126\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC97.mp3\tPete Johnson's Allstars\tI May Be Wonderful\tNATIONAL\t\tNSC97\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MER349-2.mp3\tFrankie Laine\tI May Be Wrong\tMERCURY\t5028\t349-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL48.mp3\tPete Brown Qt\tI May Be Wrong\tKEYNOTE\t1312\tHL48\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2465.mp3\tGene Krupa & His Orch\tI May Be Wrong\tCOLUMBIA\t37968\tHCO2465\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL432.mp3\tErroll Garner Trio\tI May Be Wrong\tATLANTIC\t673\t432\t1950\t\nhttp://www.jazz-on-line.com./a/mp3o/DECPWH.mp3\tPee Wee Hunt, Vocal  Glen Gray & The Casa Loma Orch\tI May Be Wrong\tDECCA\t15035A\tDLA828-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc24998-A.mp3\tJohn Kirby And His Orchestra\tI May Be Wrong (but I Think You're Wonderful)\tVocalion\t5048\t24998-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013357.mp3\tTommy Dorsey & His Orch\tI May Be Wrong But I Think You're Wonderful\tVICTOR\t25703\t013357\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC21684-3.mp3\tPeerless Qt\tI May Stay Away A Little Longer\tVICTOR\t18469\t21684-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC70061.mp3\tDick Robertson And His Orch\tI May Stay Away A Little Longer\tDECCA\t4116\t70061\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/SONSR1857.mp3\tColeman Hawkins Allstars\tI Mean You\tSONORA\t3027\tSR1857\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480473.mp3\tArt Blakey And Thelonious Monk\tI Mean You\tAtlantic\tLP1278\t2561\t1957\tArt Blakey, D, Thelonious Monk, P, Bill Hardman, T, Johnny Griffin, Ts, Spanky DeBrest, B\nhttp://www.jazz-on-line.com/a/mp3t/TS480801.mp3\tArt Blakey And Thelonious Monk\tI Mean You\tAtlantic\tLP1278\t2561\t1957\tArt Blakey, D, Thelonious Monk, P, Bill Hardman, T, Johnny Griffin, Ts, Spanky DeBrest, B\nhttp://www.jazz-on-line.com/a/mp3b/VIC79169-2.mp3\tDuke Ellington & His Orch\tI Met My Waterloo\tVICTOR\t24622\t79169-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057642-1.mp3\tUna Mae Carlisle\tI Met You Then, I Know You Now\tBLUEBIRD\t11033\t057642-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151117-1.mp3\tBen Selvin & His Orch\tI Miss A Little Miss\tCOLUMBIA\t2356 D\tW151117-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic64610-2.mp3\tMckinney's Cotton Pickers\tI Miss A Little Miss\tVictor\t23024\t64610-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC33304-3.mp3\tPaul Whiteman & His Orch\tI Miss My Swiss\tVICTOR\t19753\t33304-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW140724-2.mp3\tBilly Jones And Ernest Hare\tI Miss My Swiss\tCOLUMBIA\t410D\tW140724-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_031.mp3\tErnest Hare And Billy Jones\tI Miss My Swiss (my Swiss Miss Misses Me)\tVictor\t19718\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR140819-2.mp3\tSouthern Serenaders\tI Miss My Swiss (vbj)\tHARMONY\t4-H\t140819-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU044328-1.mp3\tCat And The Fiddle\tI Miss You So\tBLUEBIRD\t8429\t044328-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP2051.mp3\tKing Cole Trio\tI Miss You So\tCAPITOL\t\t2051\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4486.mp3\tLionel Hampton Sextet\tI Miss You So\tDECCA\t24181\tL4486\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_145.mp3\tCats And The Fiddle\tI Miss You So\tRCA\t20-2072\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400706-B.mp3\tJoe Venuti's New Yorkers\tI Must Be Dreaming\tOKeh\t41051\t400706-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/Vic59525-1.mp3\tKing Oliver And His Orchestra\tI Must Have It\tVictor\t62-0061\t59525-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU48168-1.mp3\tDuke Ellington & His Orch\tI Must Have That Man\tBLUEBIRD\t7182\t48168-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE28059.mp3\tAdelaide Hall\tI Must Have That Man\tBRUNSWICK\t4031\tE28059\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2608.mp3\tElla Fitzgerald & Her Orch\tI Must Have That Man\tDECCA\t18530B\tDLA2608\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20571-1.mp3\tTeddy Wilson And His Orchestra\tI Must Have That Man\tBrunswick\t7859  \tB-20571-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-7835-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tI Must Have That Man\tParlophone\tF-575\tCE-7835-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/Vic48168-I-.mp3\tDuke Ellington And His Cotton Club Orchestra\tI Must Have That Man\tVictor\tV-38007\t48168-I-\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/Col148170-3.mp3\tJoe Turner And The Memphis Men\tI Must Have That Man\tColumbia\t5486\t148170-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-12773-C.mp3\tAdelaide Hall With Duke Ellington And His Famous Orchestra\tI Must Have That Man\tBrunswick\t6518\tB-12773-C\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401194-B.mp3\tJoe Venuti's Blue Four\tI Must Have That Man!\tOKeh\t41133\t401194-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC028997-2.mp3\tBenny Goodman And His Orchestra\tI Must See Annie Tonight\tVICTOR\t26110\t028997-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VOC4460x.mp3\tChick Bullock And His Levee Loung\tI Must See Annie Tonight\tVocalion\t4460\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64761.mp3\tGuy Lombardo's Royal Canadians\tI Must See Annie Tonight\tDECCA\t2195A\t64761\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_214.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tI Must See Annie Tonight\tVICTOR\t26110\t028997-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19416-1.mp3\tBunny Berigan & His Boys\tI Nearly Let Love Go Slipping Through My Fingers\tVOCALION\t3254\t19416-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC055229.mp3\tLionel Hampton & His Orch\tI Nearly Lost My Mind\tVICTOR\t27316\t055229\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic055229-1.mp3\tLionel Hampton And His Sextet\tI Nearly Lost My Mind\tVictor\t27316\t055229-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC86081.mp3\tElla Fitzgerald W G.jenkins\tI Need\tDECCA\t29108\t86081\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_348.mp3\tElla Fitzgerald And Gordon Jenkins And His Chorus And Orchestra\tI Need\tDECCA\t29108\t86081\t1954\t\nhttp://www.jazz-on-line.com/a/mp3d/MajT-721.mp3\tJimmie Lunceford And His Orchestra\tI Need A Lift\tMajestic\t1060\tT-721\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72751.mp3\tJimmie Lunceford And His Orchestra\tI Need A Lift\tDecca\t\t72751\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/V-DVP-1590b.mp3\tJimmie Lunceford And His Orchestra\tI Need A Lift\tV-Disc\t568-A\tVP-1590b\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143126-2.mp3\tFletcher Henderson's Orch\tI Need Lovin'\tCOLUMBIA\t854 D\tW143126-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic64070-2.mp3\tBlanche Calloway And Her Joy Boys With Andy Kirk\tI Need Lovin'\tVictor\t22641\t64070-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/BANCP-1099-A.mp3\tBlanche Calloway And Her Joy Boys\tI Need Lovin' (vb.calloway)\tBANNER\t33224\tCP-1099-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-7913-A.mp3\tJimmie Noone And His Orchestra\tI Need Lovin' ? V A J\tBrunswick\t6174\tC-7913-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC37259-3.mp3\tCoon Sanders Nighthawk Orch\tI Need Loving\tVICTOR\t20408\t37259-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN11930-B.2H.mp3\tWolverine Orchestra\tI Need Some Pettin'\tGENNETT\t20062\t11930-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN11930-B.mp3\tWolverines\tI Need Some Pettin'\tGENNETT\t20062\t11930-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic56728-1.mp3\tThomas Waller And His Buddies\tI Need Someone Like You\tVictor\tV-38086\t56728-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_010.mp3\tEddie Fisher\tI Need You Now\tRCA Victor\t5830\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S370.mp3\tIvory Joe Hunter\tI Need You So\tMGM\t10663A\t49S370\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_274.mp3\tDon Cornell Feat. Hugo Winterhalter's Orchestra\tI Need You So\tRCA VICTOR\t3884\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81982-3.mp3\tFletcher Henderson's Orch\tI Never Care 'bout To-morrow\tCOLUMBIA\t209D\t81982-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Col81982-3.mp3\tFletcher Henderson And His Orchestra\tI Never Care 'bout Tomorrow\tColumbia\t\t81982-3  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu070334-1.mp3\tEarl Hines And His Orchestra\tI Never Dreamt\tBluebird\tB-11465\t070334-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Nat Atkins (tb) Joe McLewis, George Hunt, Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck Parham (b) Rudolph\nhttp://www.jazz-on-line.com/a/mp3b/Blu070334-1.mp3\tEarl Hines And His Orchestra\tI Never Dreamt (mg,ttv Vcl)\tBluebird\tB-11465A\t070334-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU070334.mp3\tEarl Hines & His Orch\tI Never Dreamt (v Madeline Greene)\tBLUEBIRD\t11465A\t070334\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWM1092.mp3\tDuke Ellington & Famous Orch\tI Never Felt This Way Before\tCOLUMBIA\t35353\tWM1092\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC80621-1.mp3\tEddy Duchin & His Orch\tI Never Had A Chance\tVICTOR\t24664\t80621-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_040.mp3\tEddy Duchin And His Orchestra\tI Never Had A Chance\tVICTOR\t24664\t80621-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_087.mp3\tGlen Gray And Casa Loma Orchestra Feat. Kenny Sargent\tI Never Had A Chance\tBRUNSWICK\t6927\t15372\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC022416.mp3\tBenny Goodman And His Orchestra\tI Never Knew\tVICTOR\t26089A\t022416\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL2.mp3\tLester Young Qt\tI Never Knew\tKEYNOTE\t603\tHL2\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26655.mp3\tCount Basie & His Orch\tI Never Knew\tCOLUMBIA\t35521\t26655\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL29233.mp3\tTeddy Wilson & His Orch\tI Never Knew\tCOLUMBIA\t35905\t29233\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021140.mp3\tTommy Dorsey & His Orch\tI Never Knew\tVICTOR\t25813\t021140\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47292.mp3\tErroll Garner Trio\tI Never Knew\tCOLUMBIA\t39918\tCO47292\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC34104-2.mp3\tGene Austin\tI Never Knew\tVICTOR\t19864\t34104-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE29209.mp3\tRed Nichols & His Orch\tI Never Knew\tBRUNSWICK\t4243\tE29209\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU87760.mp3\tKxyz Novelty Band\tI Never Knew\tBLUEBIRD\t5832\t87760\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D227B2.mp3\tTommy Dorsey And His Orchestra\tI Never Knew\tV-DISC\t227B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_088.mp3\tGene Austin Feat. O/nat Shilkret\tI Never Knew\tVICTOR\t19864\t34104-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_035.mp3\tSam Donahue And His Orchestra Feat. Bill Lockwood And Blue Hues\tI Never Knew\tCapitol\t405\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26655-1.mp3\tCount Basie And His Orchestra\tI Never Knew\tColumbia\tDD-480\t26655-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480679.mp3\tBenny Goodman Trio\tI Never Knew\tCapitol\tT395\t1844-2\t1947\tBenny Goodman (cl), Jimmy Rowles (p), Tommy Romersa (dm)\nhttp://www.jazz-on-line.com/a/mp3e/DECC91684.mp3\tBob Crosby & His Orch\tI Never Knew Heaven Could Speak\tDECCA\t2464A\tC91684\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_260.mp3\tBob Crosby And His Orchestra Feat. V/marion Mann\tI Never Knew Heaven Could Speak\tDECCA\t2464A\tC91684\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh007.mp3\tJoe Loss And His Band\tI Never Knew Heaven Could Speak (v Chick Henderson\tRegal Zonophone\tMR-3112\tCAR-5479-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW141583.mp3\tLeo Reisman & His Orch\tI Never Knew How Wonderful You Were\tCOLUMBIA\t575 D\tW141583\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_301.mp3\tJo Stafford\tI Never Loved Anyone\tCapitol\t15017\t2427-5\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D69A1.mp3\tTommy Tucker Time\tI Never Mentioned Your\tv-disk\t69A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA551-B.mp3\tBing Crosby\tI Never Realized\tDECCA\t24202\tDLA551-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA551-A.mp3\tBing Crosby & Victor Young\tI Never Realized\tDECCA\t1186\tDLA551-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA551-A.mp3\tVictor Young And His Orchestra With Bing Crosby\tI Never Realized\tDECCA\t1186\tDLA551-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA551-B.mp3\tVictor Young And His Orchestra With Bing Crosby\tI Never Realized\tDECCA\t24202\tDLA551-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC39724.mp3\tBob Howard & His Orchestra\tI Never Saw A Better Night\tDECCA\t524A\t39724\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/HARCO41731.mp3\tHot Lips Page\tI Never See Maggie Alone\tHARMONY\tHa1077\tCO41731\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM49S328.mp3\tArt Mooney And His Orchestra\tI Never See Maggie Alone\tMGM\t10548\t49S328\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_212.mp3\tArt Mooney And His Orchestra\tI Never See Maggie Alone\tMGM\t10548\t49S328\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_153.mp3\tIrving Aaronson's Commanders Feat. V Phil Saxe\tI Never See Maggie Alone\tVICTOR\t20473\t37410-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D596IDW.mp3\tStan Kenton's Orch\tI Never Thought I'd Sing The Blues\tV-DISC\t596\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_030.mp3\tArthur Collins And Joe Natus\tI Never Trouble Trouble Until Trouble Troubles Me\tEDISON\t7816\t\t1901\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC2908B.mp3\tVictor Sylvester Orch.\tI Once Had A Heart, Margarita - Tango\tDECCA\t2908B\t-\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146770-2.mp3\tCharlie Poole & Nc Ramblers\tI Once Loved A Sailor\tCOLUMBIA\t15385 D\tW146770-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152766.mp3\tBen Selvin And His Orch\tI Only Have Eyes For You\tCOLUMBIA\t2936 D\tW152766\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/NATNSC100.mp3\tBilly Eckstine And His Orch\tI Only Have Eyes For You\tNATIONAL\t\tNSC100\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC80619-2.mp3\tEddy Duchin And His Orch\tI Only Have Eyes For You\tVICTOR\t24665\t80619-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4142.mp3\tDoris Day\tI Only Have Eyes For You\tCOLUMBIA\t38953\tHCO4142\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO40056.mp3\tFreddy Gardner\tI Only Have Eyes For You\tCOLUMBIA\t38346\tCO40056\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3531.mp3\tDick Powell - Victor Young\tI Only Have Eyes For You\tDECCA\t24231\tL3531\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89002j.mp3\tBillie Holiday\tI Only Have Eyes For You\tMERCURY\t89002\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYKHL9.mp3\tColeman Hawkins Qt\tI Only Have Eyes For You\tKEYNOTE\t609\tKHL9\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_295.mp3\tJane Froman\tI Only Have Eyes For You\tDECCA\t181A\t38659\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_048.mp3\tEddy Duchin And His Orchestra Feat. Lew Sherwood\tI Only Have Eyes For You\tVICTOR\t24665\t80619-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480857.mp3\tGeorge Shearing, Piano; Jack Fallon, Bass; Norman Burns, Drums.\tI Only Have Eyes For You\tDECCA-LONDON\tF9386\tDR-12999\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_179.mp3\tFour Aces Featuring Al Alberts\tI Only Know I Love You\tDecca\t29989\tL9270\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC59697-3.mp3\tHelen Kane\tI Owe You\tVICTOR\t22407\t59697-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72748.mp3\tJimmie Lunceford And His Orchestra\tI Passed Through Memphis Last Night\tDecca\t\t72748\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98378.mp3\tTommy Dorsey & His Orch\tI Picked A Flower The Color Of Your Eyes\tVICTOR\t25217\t98378\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9490.mp3\tJones,billy\tI Popped The Question To Her Pop\tEDISON\t51340\t9490\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037176-2.mp3\tTommy Dorsey & His Orch\tI Poured My Heart Into A Song\tVICTOR\t26271\t037176-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/BLUB-10307-A.mp3\tArtie Shaw And His Orchestra\tI Poured My Heart Into A Song\tBLUEBIRD\tB-10307-A\t036238-4\t1939\tFrom 20th Century-Fox film ''Second Fiddle'' Vocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3w/1939_213.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tI Poured My Heart Into A Song\tDECCA\t2553A\t65740\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_312.mp3\tFrankie Lymon And The Teenagers\tI Promise To Remember\tGee\t1018\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_101.mp3\tKay Kyser And His Orchestra\tI Promise You\tCBS\tBR8317\t24022\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47070.mp3\tSarah Vaughan\tI Ran All The Way Home\tCOLUMBIA\t39576\tCO47070\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_160.mp3\tSarah Vaughan\tI Ran All The Way Home\tCOLUMBIA\t39576\tCO47070\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_305.mp3\tBuddy Greco\tI Ran All The Way Home\tCoral\t60573\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP214.mp3\tKing Cole Trio\tI Realize Now\tCAPITOL\t169\t214\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D339A1.mp3\tKing Cole Trio\tI Realize Now\tV-DISC\t339A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/MER8962IR.mp3\tRoy Eldridge\tI Remember Harlem\tMERCURY\t8962\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_255.mp3\tEddie Fisher\tI Remember When\tRCA\t20-4618\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D328B1.mp3\tJo Stafford\tI Remember You\tV-DISC\t328B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_063.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly\tI Remember You\tDECCA\t4132A\t70024\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU059100.mp3\tFats Waller And His Rhythm\tI Repent\tBLUEBIRD\t11188\t059100\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_211.mp3\tEthel Merman And Ray Bolger\tI Said My Pajamas (and Put On My Prayers)\tDECCA\t24873\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_217.mp3\tDoris Day\tI Said My Pajamas (and Put On My Prayers)\tCOLUMBIA\t38709\tHCO4005\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_071.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberly And Helen O'connell\tI Said No\tDECCA\t4102B\t69995\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU061915.mp3\tAlvino Rey And His Orch\tI Said No (v Yvonne King)\tBLUEBIRD\t11391\t061915\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_287.mp3\tAmes Brothers\tI Saw Esau\tRCA\t6720\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10228.mp3\tJimmy Boyd\tI Saw Mommy Kissing Santa Claus\tCOLUMBIA\t39871\tHCO10228\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_013.mp3\tJimmy Boyd Feat. Norman Luboff\tI Saw Mommy Kissing Santa Claus\tCOLUMBIA\t39871\tHCO10228\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VARP77164.mp3\tQuintet Hot Club Of France\tI Saw Stars\tVARSITY\tROY-?\tP77164\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC84014-1.mp3\tPaul Whiteman & His Orch\tI Saw Stars\tVICTOR\t24705\t84014-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU15532-A.mp3\tFreddy Martin & His Orch\tI Saw Stars\tBRUNSWICK\t6948\t15532-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/PATCPT-1702-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tI Saw Stars\tPath\tPA-468\tCPT-1702-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/ULTP-77164.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tI Saw Stars\tUltraphone\tAP-1422\tP-77164\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_009.mp3\tFreddy Martin And His Orchestra\tI Saw Stars\tBrunswick\t6948\t15532-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC17878-2.mp3\tBlind Gary\tI Saw The Light\tARC\tME60565\t17878-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM47S124.mp3\tHank Williams\tI Saw The Light\tMGM\t30454\t47S124\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCSA2875.mp3\tNite Owls\tI Saw Your Face In The Moon\tVOCALION\t3879\tSA2875\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic21099.mp3\tWaring's Pennsylvanians\tI Scream, You Scream, We All Scream For Ice Cream\tVictor\t21099\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL36379.mp3\tBenny Goodman & His Orch\tI See A Million People\tCOLUMBIA\t36379\tCCO3982-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO3982-1.mp3\tBenny Goodman And His Orchestra\tI See A Million People\tCOLUMBIA\t36379\tCCO3982-1\t1941\tvocal Peggy Lee\nhttp://www.jazz-on-line.com/a/mp3c/OKE30940.mp3\tCab Calloway And His Orchestra Feat. Dizzy Gillespie (trumpet)\tI See A Million People\tOKEH\t6341\t30940\t1941\t(v Cab Calloway & The Palmer Brothers)\nhttp://www.jazz-on-line.com/a/mp3c/BLU063837-1.mp3\tUna Mae Carlisle\tI See A Million People\tBLUEBIRD\t11181\t063837-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_263.mp3\tCab Calloway And His Orchestra Feat. Dizzy Gillespie (trumpet)\tI See A Million People\tOKEH\t6341\t30940\t1941\t(v Cab Calloway & The Palmer Brothers)\nhttp://www.jazz-on-line.com/a/mp3b/MERC647.mp3\tRoy Eldridge & His Orch\tI See Everybody's Baby\tMERCURY\t8975\tC647\t\t\n\tMahalia Jackson\tI See God\tCOLUMBIA\t40529\tCO53434\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22265.mp3\tMildred Bailey & Her Orchestra\tI See Your Face Before Me\tVOCALION\t3931\t22265\t\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYHL161.mp3\tBernie Leighton Qt\tI See Your Face Before Me\tKEYNOTE\t645\tHL161\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_234.mp3\tGlen Gray And Casa Loma Orchestra Feat. Kenny Sargent\tI See Your Face Before Me\tDECCA\t1608\t62862-A\t1937\tFrank Zullo, Grady Watts (tp), Sonny Dunham (tp, tb), Pee Wee Hunt, Billy Rauch, Murray McEachern (tb), Glen Gray (cl, as, fl, ldr),  Kenny Sargent (cl, as), Clarence Hutchinrider (cl, as, fl), Art Ralston (as, ob, bsn), Danny D'Andrea (as), Pat Davis (cl, ts, fl), Joe Hall (p), Jack Burdette (g), Stanley Dennis (sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3h/DH480858.mp3\tAndre Kostelanetz And His Orchestra\tI See Your Face Before Me\tCOLUMBIA\t4267-M\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_010.mp3\tAl Jolson\tI Sent My Wife To The Thousand Isles\tCOLUMBIA\tA-2021\t46786\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/COL46786.mp3\tAl Jolson\tI Sent My Wife To The Thousand Isles\tCOLUMBIA\tA-2021\t46786\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400980-AB.mp3\tArizona Dranes\tI Shall Wear A Crown\tOKeh\t8600\t400980-AB\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1232-1.mp3\tGene Krupa & His Orch\tI Should Care\tCOLUMBIA\t36784\tHCO1232-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_161.mp3\tMartha Tilton\tI Should Care\tCapitol\t184\t529\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_109.mp3\tFrank Sinatra\tI Should Care\tCOLUMBIA\t36791\tHCO1286\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_164.mp3\tJeff Chandler With Victor Young And His Singing Strings\tI Should Care\tDECCA\t29004\tL7477\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_155.mp3\tTommy Dorsey And His Orchestra Feat. Bonnie Lou Williams And Sentimentalists\tI Should Care\tVICTOR\t1625\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_192.mp3\tJimmy Dorsey And His Orchestra Feat. Teddy Waiters\tI Should Care\tDECCA\t18656B\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_033.mp3\tRalph Flanagan And His Orchestra Feat. Harry Prime And The Singing Winds\tI Should Care\tRCA VICTOR\t4885\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68327.mp3\tWoody Herman & His Orchestra\tI Should Have Known Years Ago\tDECCA\t3544A\t68327\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_337.mp3\tThe Four Lads; Orchestra Under The Direction Of Norman Leyden\tI Should Have Told You Long Ago\tCOLUMBIA\t40082\tCO49737\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/CONW3532.mp3\tEthel Waters W J.c.heard Orch\tI Shoulda Quit When I Was Ahead\tCONTIN\t10009\tW3532\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC26260.mp3\tMildred Bailey\tI Shoulda Stood In Bed\tVOCALION\t5236\t26260\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022433.mp3\tFats Waller And His Rhythm\tI Simply Adore You (vfw)\tVICTOR\t25830\t022433\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_105.mp3\tDoris Day Feat. Ray Heindorf's Orchestra\tI Speak To The Stars\tCOLUMBIA\t40210\tCO51053\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_237.mp3\tCrew-cuts\tI Spoke Too Soon\tMercury\t70404\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3o/DEL2000x.mp3\tBilly Eckstein With The Deluxe All Star Band\tI Stay In The Mood For You\tDELUXE\tX2000\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW146609.mp3\tLeo Reisman & His Orch\tI Still Belong To You\tCOLUMBIA\t1506 D\tW146609\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65116.mp3\tCliff Bruner's Texas Wanderers\tI Still Care For You\tDECCA\t5719\t65116\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC80292.mp3\tElla Fitzgerald & Ink Spots\tI Still Feel The Same About You\tDECCA\t27419\t80292\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_152.mp3\tGeorgia Gibbs\tI Still Feel The Same About You\tCoral\t60353\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_0725_01.mp3\tLee Morse And Her Bluegrass Boys\tI Still Get A Thrill\tColumbia\t2270DA\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE34117.mp3\tOzzie Nelson & His Orch\tI Still Get A Thrill (v O N)\tBRUNSWICK\t4897\tE34117\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62700-2.mp3\tTed Weems & His Orch\tI Still Get A Thrill (vart Jarrett)\tVICTOR\t22515\t62700-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-3271-A.mp3\tHorace Henderson And His Orchestra\tI Still Have My Dreams\tOKEH\t5841\tWC-3271-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_102.mp3\tShep Fields And His Rippling Rhythm Orchestra V/bob Goday\tI Still Love To Kiss You Goodnight\tBluebird\t7139\t011757\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA941.mp3\tBing Crosby  John S Trotter\tI Still Love To Kiss You Goodnight\tDECCA\t1451\tDLA941\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA941-A.mp3\tJohn Scott Trotter And His Orchestra\tI Still Love To Kiss You Goodnight\tDecca\t\tDLA941-A  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC58589-3.mp3\tRudy Vallee & His Ct.yankees\tI Still Remember\tVICTOR\t22361\t58589-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_167.mp3\tRudy Vallee And His Connecticut Yankees\tI Still Remember\tVICTOR\t22361\t58589-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-16288-A.mp3\tLouis Prima And His New Orleans Gang\tI Still Want You\tBrunswick\t7320\tB-16288-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE31642.mp3\tCount Basie & His Orch\tI Struck A Match In The Dark\tOKEH\t6508\t31642\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVBOP210.mp3\tErroll Garner Trio\tI Surrender Dear\tSAVOY\t701A\tBOP210\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/ARCB16022-1.mp3\tRed Norvo Swing Septet\tI Surrender Dear\tARC\tCO2977D\tB16022-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5240.mp3\tTeddy Wilson Quintet\tI Surrender Dear\tMUSICRAFT\t319\t5240\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/SES171.mp3\tBen Webster\tI Surrender Dear\tSESSION\t10010\t171\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5437-1.mp3\tBen Webster & J.guarnieri Orch\tI Surrender Dear\tSAVOY\t580\tS5437-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DIA0751ISD.mp3\tDon Byas & Orch\tI Surrender Dear\tDIAL\t0751\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COMR2996.mp3\tBenny Carter And His Orch\tI Surrender Dear\tCOMMODORE\t1506\tR2996\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63255-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tI Surrender Dear\tDecca\t1916\t63255-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480585.mp3\tArt Tatum And Roy Eldridge\tI Surrender Dear\tClef\tMGC679\t2302-1\t1955\tRoy Eldridge (tp), Art Tatum (p), John Simmons (sb), Alvin Stoller (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480748.mp3\tBen Webster Quintet\tI Surrender Dear\tCircle\tCLP41\tN1639-1\t1944\tHot Lips Page (tp), Ben Webster (ts), Clyde Hart (p), Charlie Drayton (sb), Denzil Best (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480763.mp3\tBen Webster Quartet\tI Surrender Dear\tSavoy\t505\tS5437-1\t1944\tBen Webster (ts), Johnny Guarneri (p), Oscar Pettiford (sb), David ?Chick? Booth (dm)\nhttp://www.jazz-on-line.com/a/mp3a/VIC61068-2.mp3\tGus Arnheim Coconut Grove Orch\tI Surrender Dear (vbing Crosby)\tVICTOR\t22618A\t61068-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76348.mp3\tLouis Armstrong & His Allstars\tI Surrender Dear- Part 1\tDECCA\t27190\t76348\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL156--.mp3\tAl Hibbler W Harry Carney Band\tI Surrender, Dear\tALLADDIN\t156\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09647-1.mp3\tLionel Hampton & His Orch\tI Surrender, Dear\tVICTOR\t25666\t09647-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC404.mp3\tBilly Eckstine\tI Surrender, Dear\tNATIONAL\t\tNSC404\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1744.mp3\tBing Crosby - J.s.trotter Orch\tI Surrender, Dear\tDECCA\t2535A\tDLA1744\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap257-3.mp3\tBenny Carter And His Orchestra\tI Surrender, Dear\tCapitol\t200\t257-3\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/COMR-2996-1.mp3\tThe Chocolate Dandies\tI Surrender, Dear\tCOMMODORE\t1506\tR-2996-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_029.mp3\tGus Arnheim And His Orchestra Feat. Bing Crosby\tI Surrender, Dear\tVICTOR\t22618A\t61068-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu042610-1.mp3\tArtie Shaw And His Orchestra\tI Surrender, Dear\tBluebird\tB-10430\t042610-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic09647-1.mp3\tLionel Hampton And His Orchestra\tI Surrender, Dear\tVictor\t25666\t09647-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/COLWC2655.mp3\tJack Teagarden & His Orch\tI Swung The Election\tCOLUMBIA\t35206\tWC2655\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CON30239.mp3\tGene Krupa & His Orch\tI Take To You (v Anita O'day)\tCONQUEROR\t9784\t30239\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1360x.mp3\tMel Blanc, Orchestra Of Billy May\tI Taut I Taw A Puddy Tat\tCAPITOL\t\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035719-1.mp3\tErskine Hawkins & His Orch\tI The Living\tBLUEBIRD\t10218\t035719-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC067913.mp3\tTommy Dorsey And His Orch\tI Think Of You\tVICTOR\t27701\t067913\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70312-A.mp3\tMildred Bailey\tI Think Of You\tDECCA\t4267A\t70312-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEH0544.mp3\tGene Krupa & His Orch\tI Think Of You\tOKEH\t6465\tH0544\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_181.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra\tI Think Of You\tVICTOR\t27749\t061991\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP2101.mp3\tKing Cole Trio\tI Think You Get What I Mean\tCAPITOL\t\t2101\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152281.mp3\tFrankie Trumbauer & His Orch\tI Think You're A Honey\tCOLUMBIA\t2710 D\tW152281\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP654.mp3\tKing Cole Trio\tI Tho't You Ought To Know\tCAPITOL\t\t654\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26196.mp3\tBenny Goodman And His Orchestra\tI Thought About You\tCOLUMBIA\t35313\t26196\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_249.mp3\tBenny Goodman And His Orchestra\tI Thought About You (vocal Mildred Bailey)\tCOLUMBIA\t35313\t26196-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041458.mp3\tJelly Roll Morton Jazzmen\tI Thought I Heard Buddy Bolden Say\tBLUEBIRD\t10434\t041458\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu041458-1.mp3\tJelly-roll Morton's New Orleans Jazzmen\tI Thought I Heard Buddy Bolden Say\tBluebird\tB-10434\t041458-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe82061-A.mp3\tHattie Mcdaniel\tI Thought I'd Do It\tOKeh\t8569\t82061-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO32601-1.mp3\tBenny Goodman And His Orchestra\tI Threw A Kiss In The Ocean\tCOLUMBIA\t36590\tCO32601-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_154.mp3\tKate Smith\tI Threw A Kiss In The Ocean\tCOLUMBIA\t36552\tCO32578-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_155.mp3\tJimmy Dorsey And His Orchestra Feat. V/helen O'connell\tI Threw A Kiss In The Ocean\tDECCA\t4132B\t70027\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW144992.mp3\tThe Four Aristocrats\tI Told Them All About You\tCOLUMBIA\t1227 D\tW144992\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLMEM32.mp3\tHank Penny's Radio Cowboys\tI Told Them All About You\tCOLUMBIA\t20317\tMEM32\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/SIG656-1.mp3\tAnita O'day W Ralph Burns Orch\tI Told Ya I Love Ya, Now Get Out\tSIGNATURE\t15181B\t656-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL79387-3.mp3\tMarion Harris\tI Told You So\tCOLUMBIA\tA-3300\t79387-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC060346.mp3\tTommy Dorsey And His Orch\tI Tried\tVICTOR\t27317\t060346\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_226.mp3\tTommy Dorsey Orch V Frank Sinatra\tI Tried\tVICTOR\t27317\t060346\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU063893.mp3\tFats Waller And His Rhythm\tI Understand\tBLUEBIRD\t11175A\t063893\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_055.mp3\tJune Valli\tI Understand\tRCA VICTOR\t5740\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_099.mp3\tJimmy Dorsey And His Orchestra\tI Understand\tDECCA\t3585A\t68462\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68462.mp3\tJimmy Dorsey And His Orch.\tI Understand (v Bob Eberle)\tDECCA\t3585A\t68462\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh194.mp3\tNat Gonella And His New Georgians\tI Understand (v Roy Dexter)\tColumbia\tFB-2637\tCA-18496-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_034.mp3\tFour Tunes Feat. Sid Bass Orchestra\tI Understand Just How You Feel\tJUBILEE\t5132\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19436-1.mp3\tArtie Shaw And His Orchestra\tI Used To Be Above Love\tBRUNSWICK\t7698\tB-19436-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23303-2.mp3\tMildred Bailey & Her Orchestra\tI Used To Be Color Blind\tVOCALION\t4345\t23303-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_147.mp3\tFred Astaire Feat. Ray Noble's Orchestra\tI Used To Be Color Blind\tBRUNSWICK\t8189\tLA1609\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145628-1.mp3\tBessie Smith\tI Used To Be Your Sweet Mama\tCOLUMBIA\t14292 D\tW145628-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/COL148440.mp3\tIpana Troubadors\tI Used To Love Her In The Moonlight\tCOLUMBIA\t1815 D\t148440\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038208.mp3\tFats Waller And His Rhythm\tI Used To Love You\tBLUEBIRD\t10369A\t038208\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93789.mp3\tLouis Armstrong & His Orch.\tI Used To Love You\tDECCA\t4106A\tC93789\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64343.mp3\tBob Howard & His Orch\tI Used To Love You\tDECCA\t2056B\t64343\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24969-A.mp3\tJimmie Lunceford And His Orchestra\tI Used To Love You (but It's All Over Now)\tOkeh\t5276\t24969-A\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Gerard Wilson-t/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-p\nhttp://www.jazz-on-line.com/a/mp3b/COL79643.mp3\tFrank Crumit\tI Used To Love You But It's All Over Now\tCOLUMBIA\tA-3388\t79643\t1921\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D149B2.mp3\tPhil Brito\tI Used To Love You But It's All Over Now\tV-DISC\t149B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_084.mp3\tFrank Crumit\tI Used To Love You, But It's All Over Now\tColumbia\t3388\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_161.mp3\tKay Starr\tI Waited A Little Too Long\tCapitol\t2062\t9601\t1952\t\nhttp://www.jazz-on-line.com/a/mp3d/ColLA1991.mp3\tMartha Raye With Dave Rose Orchestra \tI Walk Alone \tColumbia\t32560\tLA1991\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_123.mp3\tJohnny Cash And The Tennessee Two\tI Walk The Line\tSun\t241\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO4296.mp3\tGene Krupa & His Orch\tI Walked In With My Eyes Wide Open\tCOLUMBIA\t36768\tCCO4296\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CON17966-1.mp3\tPatsy Montana Prairie Ramblers\tI Wanna Be A Cowboy's Sweetheart\tCONQUEROR\t8575\t17966-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC68900-2.mp3\tBennie Moten's Kansas Orch\tI Wanna Be Around My Baby All The Time\tVICTOR\t22680\t68900-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62801.mp3\tWoody Herman & His Orchestra\tI Wanna Be In Winchell's Column\tDECCA\t1583\t62801\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM50S158.mp3\tBilly Eckstine Orchestra Of Russ Case\tI Wanna Be Loved\tMGM\t10716A\t50S158\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_013.mp3\tAndrews Sisters Feat. Gordon Jenkins And His Orchestra And Patty Andrews\tI Wanna Be Loved\tDECCA\t27007\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_071.mp3\tBilly Eckstine Feat. Russell Case's Orchestra\tI Wanna Be Loved\tMGM\t10716A\t50S158\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_249.mp3\tDottie O'brien Feat. Jan Garber Orchestra\tI Wanna Be Loved\tCAPITOL\t1044\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_016.mp3\tHelen Kane\tI Wanna Be Loved By You\tVictor\t21684\t47539-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC47539-3.mp3\tHelen Kane Orchestra Of Leonard Joy\tI Wanna Be Loved By You\tVICTOR\t21684\t47539-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC27268x.mp3\tRose Murphy\tI Wanna Be Loved By You\tDecca\t27268\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_152.mp3\tGertrude Niesen\tI Wanna Get Married\tDECCA\t23382A\t72614\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/HITT491.mp3\tLouis Prima & His Orch\tI Wanna Get Married (v L A C)\tHIT OF THE WEEK\t7125b\tT491\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_160.mp3\tPerry Como Feat. Fontane Sisters, The\tI Wanna Go Home\tRCA Victor\t78-3586\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh010.mp3\tJack Hylton And His Orchestra\tI Wanna Go Places And Do Things (intro Im All Of A Twitter)\tHMV\tB-5659\tBb-16944-3\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_214.mp3\tEddie Fisher\tI Wanna Go Where You Go, Do What You Do (then I'll Be Happy)\tRCA Victor\t6264\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO26014.mp3\tJack Teagarden & His Orch\tI Wanna Hat With Cherries\tCOLUMBIA\t35224\tCO26014\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038200.mp3\tGlenn Miller & His Orch\tI Wanna Hat With Cherries (vmh)\tBLUEBIRD\t10344\t038200\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU062763.mp3\tFats Waller And His Rhythm\tI Wanna Hear Swing Songs\tBLUEBIRD\t11115\t062763\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_153.mp3\tAmes Brothers, The Feat. Marty Manning (director)\tI Wanna Love You\tCORAL\t60617\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA21-0476.mp3\tEddy Arnold\tI Wanna Play House With You\tRCA\t21-0476\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC53053-2.mp3\tBert Lown Biltmore Hotel Orch\tI Wanna Sing About You\tVICTOR\t22689\t53053-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66941.mp3\tBob Crosby & His Orch\tI Wanna Wrap You Up\tDECCA\t2935B\t66941\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK5232-X.mp3\tBull Moose Jackson And His Buffalo Bearcats\tI Want A Bowlegged Woman\tKING\t4189B\tK5232-X\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_059.mp3\tAll-star Trio\tI Want A Daddy Who Will Rock Me To Sleep\tVICTOR\t18626\t23307\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146166.mp3\tDan Hornsby Trio\tI Want A Girl\tCOLUMBIA\t15276 D\tW146166\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_015.mp3\tWalter Van Brunt And American Quartet\tI Want A Girl Just Like The Girl That Married Dear Old Dad\tVictor\t16962\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO4684.mp3\tGene Krupa & His Orch\tI Want A Grown Up Man\tCOLUMBIA\t38622\tCCO4684\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_287.mp3\tGayla Peevey\tI Want A Hippopotamus For Christmas\tCOLUMBIA\t40106\tCO49818\t1953\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI7425.mp3\tCollins And Harlan\tI Want A Jazzy Kiss\tEDISON\t50940\t7425\t\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeWC-3259-A.mp3\tCount Basie And His Orchestra\tI Want A Litlle Girl\tOkey\t5773\tWC-3259-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU64007-4.mp3\tMckinney's Cotton Pickers\tI Want A Little Girl\tBLUEBIRD\t10954\t64007-4\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3259-A.mp3\tCount Basie & His Orch\tI Want A Little Girl\tOKEH\t5773\tWC3259-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVBOP4525.mp3\tErroll Garner\tI Want A Little Girl\tSAVOY\t767\tBOP4525\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/MER630.mp3\tJay Mcshann\tI Want A Little Girl\tMERCURY\t8026\t630\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D559IWA.mp3\tTrummy Young Allstars\tI Want A Little Girl (v Herman Wells)\tV-DISC\t559\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC-646-1.mp3\tEarl Hines And His Orchestra\tI Want A Lot Of Love\tBRUNSWICK\t6710\tC-646-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-7826-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tI Want A Lot Of Love\tParlophone\tF-575\tCE-7826-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014653.mp3\tBunny Berigan & His Orch\tI Want A New Romance\tVICTOR\t25688B\t014653\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70345.mp3\tLucky Millinder & His Orch\tI Want A Tall Skinny Papa\tDECCA\t18386A\t70345\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70345-A.mp3\tLucky Millinder And His Orchestra\tI Want A Tall Skinny Papa\tDecca\t18386\t70345-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141770-2.mp3\tBessie Smith\tI Want Every Bit Of It\tCOLUMBIA\t14129 D\tW141770-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB4057.mp3\tGene Krupa's Chicago Jazz Band\tI Want Gold In My Pockets\tRCA\t20-3816\tE0VB4057\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU76875-1.mp3\tJimmie Davis\tI Want Her Tailor Made\tBLUEBIRD\t5359\t76875-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5649-1.mp3\tWynonie Harris\tI Want My Fanny Brown\tKING\t4304A\tK5649-1\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2827.mp3\tBing Crosby & Woody Herman\tI Want My Mama\tDECCA\t18316B\tDLA2827\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031866.mp3\tArtie Shaw And His Orchestra\tI Want My Share Of Love\tBLUEBIRD\t10134\t031866-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/RoyKJ-47-I.mp3\tMezzrow - Bechet Quintet\tI Want Some\tRoyal Jazz\t708\tKJ-47-I  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLMEM110.mp3\tBlind Boy Fuller\tI Want Some Of Your Pie\tCOLUMBIA\t37683\tMEM110\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN6364-2.mp3\tSam Lanin And His Orchestra\tI Want Somebody To Cheer Me Up\tBANNER\t1676\t6364-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24968-A.mp3\tJimmie Lunceford And His Orchestra\tI Want The Waiter (with The Water)\tOkeh\t5033\t24968-A\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Gerard Wilson-t/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-p\nhttp://www.jazz-on-line.com/a/mp3d/Dec65905-A.mp3\tElla Fitzgerald And Her Famous Orchestra\tI Want The Waiter (with The Water)\tDecca\t2628\t65905-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_135.mp3\tElla Fitzgerald\tI Want The Waiter (with The Water)\tDecca\t2628\t65905-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Bla2116i.mp3\tF. H. Henderson\tI Want To\tBlack Swan\t2116\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC93658.mp3\tPatsy Montana\tI Want To Be A Cowboy's Sweetheart\tDECCA\t5956\tC93658\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_066alt.mp3\tAda Jones\tI Want To Be A Merry, Merry Widow\tZONOPHONE\t1073\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU96267-1.mp3\tGirls Of The Golden West\tI Want To Be A Real Cowboy Girl\tBLUEBIRD\t6164\t96267-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49699-3.mp3\tHelen Kane\tI Want To Be Bad\tVICTOR\t21863\t49699-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_213.mp3\tHelen Kane\tI Want To Be Bad\tVICTOR\t21863\t49699-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE32040-A.mp3\tRed Nichols And His Five Pennies\tI Want To Be Happy\tBRUNSWICK\t80007 B\tE 32040A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE32040-A.mp3\tRed Nichols And His Five Pennies\tI Want To Be Happy\tBRUNSWICK\t4724\tE 32040A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62886.mp3\tChick Webb And His Orchestra\tI Want To Be Happy\tDECCA\t15039A\t62886\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC04236-1.mp3\tBenny Goodman And His Orchestra\tI Want To Be Happy\tVICTOR\t25510\t04236-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2198.mp3\tLester Young Trio W B.rich\tI Want To Be Happy\tMERCURY\t2198?\t2198\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038174.mp3\tGlenn Miller & His Orch\tI Want To Be Happy\tBLUEBIRD\t10416\t038174\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC30455-4.mp3\tJan Garber & His Orch\tI Want To Be Happy\tVICTOR\t19404A\t30455-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_201.mp3\tRed Nichols And His Five Pennies\tI Want To Be Happy\tBRUNSWICK\t80007 B\tE 32040A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_045.mp3\tJan Garber And His Orchestra\tI Want To Be Happy\tVICTOR\t19404A\t30455-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_052.mp3\tCarl Fenton And His Orchestra Feat. Billy Jones, Ernest Hare, Wilfred Glenn, And Elliott Shaw\tI Want To Be Happy\tBRUNSWICK\t2640\t13406/10\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_300.mp3\tBenny Goodman And His Orchestra\tI Want To Be Happy\tVICTOR\t25510\t04236-1\t1937\tHarry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Murray McEachern (tb), Benny Goodman (cl), Hymie Schertzer, Dick DePew (as), Arthur Rollini, Vido Musso (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3c/MUS5654.mp3\tTeddy Wilson Octet\tI Want To Be Happy (v S. Vaughn)\tMUSICRAFT\t421\t5654\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/SINE4KB-6721.mp3\tBack To The Bible Quartet\tI Want To Be Like Jesus (1) (2) We Shall Walk Through The Walley\tSINGSPIRATION\tS-3160\tE4KB-6721\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC73843.mp3\tLionel Hampton Quintet\tI Want To Be Loved\tDECCA\t23879A\t73843\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/MAN1046x.mp3\tFour Tunes Savannah Churchill\tI Want To Be Loved\tMANOR\t1046\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1867.mp3\tBenny Goodman And His Orchestra\tI Want To Be Loved\tCAPITOL\t\t1867\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S100.mp3\tSy Oliver & His Orchestra\tI Want To Be Loved\tMGM\t10030\t47S100\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_244.mp3\tSavannah Churchill\tI Want To Be Loved\tMANOR\t1046\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_231.mp3\tBenny Goodman And His Orchestra Feat. V/lillian Lane\tI Want To Be Loved\tCAPITOL\t416\t1867\t1947\tJohn Best, Nate Kazebier, George Seaburg, Frank Beach (tp), Lou McGarity, Ray Simms, Tommy Pederson (tb), Benny Goodman (cl), Gus Bivona, Heinie Beau (as), Babe Russin, Zoot Sims (ts), Chuck Gentry (bar), Tommy Todd (p), Al Hendrickson (g), Harry Babasin (sb), Tommy Romersa (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1951_302.mp3\tJohnny Desmond Feat. Tony Mottola's Orchestra And Ray Charles Singers\tI Want To Be Near You\tMGM\t11027\t51S250\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_303.mp3\tPercy Faith And His Orchestra\tI Want To Be Near You\tCOLUMBIA\t39528\tCO47002\t1951\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI7664-C.mp3\tPremier Quartette (incl. Billy Murray) - O\tI Want To Be The Leader Of The Band\tEDISON\t\t7664-C\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S6039.mp3\tBob Wills Texas Playboys\tI Want To Be Wanted\tMGM\t11241\t52S6039\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_295.mp3\tLefty Frizzell\tI Want To Be With You Always\tCOLUMBIA\t20959\tCO45064\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC15137-6.mp3\tMorton Harvey\tI Want To Go Back To Michigan\tVICTOR\t17650\t15137-6\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_081.mp3\tMorton Harvey\tI Want To Go Back To Michigan (down On The Farm)\tVICTOR\t17650\t15137-6\t1915\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC72203.mp3\tCoon-sanders Orchestra\tI Want To Go Home\tVICTOR\t22972\t72203\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/HITT487.mp3\tLouis Prima & His Orch\tI Want To Go To Tokyo (v L P)\tHIT OF THE WEEK\t7123b\tT487\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/EDI6686-A.mp3\tAl Bernard And Ernest Hare\tI Want To Hold You In My Arms\tEDISON\t50558R\t6686-A\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_051.mp3\tAl Bernard And Ernest Hare\tI Want To Hold You In My Arms\tEDISON\t50558R\t6686-A\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79402-5.mp3\tBert Williams\tI Want To Know Where Tosti Went\tCOLUMBIA\tA-3305\t79402-5\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74300.mp3\tElla Fitzgerald & Daydreamers\tI Want To Learn About Love\tDECCA\t24581\t74300\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA1023.mp3\tAndy Iona's Novelty Four\tI Want To Learn To Speak Hawaiian\tCOLUMBIA\t3053 D\tLA1023\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5933.mp3\tWynonie Harris & His Allstars\tI Want To Love You, Baby\tKING\t4402\tK5933\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14077-1.mp3\tJoe Venuti & His Orch\tI Want To Ring Bells (v Don Elton)\tBANNER\t32872\t14077-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC4179.mp3\tCab Calloway & His Orch\tI Want To Rock\tOKEH\t6616\tC4179\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU2056-7.mp3\tFletcher Henderson & His Orch\tI Want To See A Little More Of What I Saw\tBRUNSWICK\t3026\t2056-7\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-2055-6.mp3\tFletcher Henderson And His Orchestra\tI Want To See A Little More Of What I Saw In Arkansas\tVocalion\t15205\tE-2055-6\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1924_1211_01.mp3\tLee Morse And Her Bluegrass Boys\tI Want To See My Tennessee\tPerfect\t12179A\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1268.mp3\tKing Cole Trio\tI Want To Thank Your Folks\tCAPITOL\t\t1268\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_219.mp3\tPerry Como Feat. O/lloyd Shaffer\tI Want To Thank Your Folks\tRCA Victor\t2117\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_075.mp3\tHenry Burr\tI Want You\tVICTOR\t16512\tB6031-5\t1908\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA62.mp3\tMae West\tI Want You - I Need You\tBRUNSWICK\t6676\tLA62\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14123-3.mp3\tCharlie Barnet & His Orch\tI Want You - I Need You (v H. Von Zell)\tBANNER\t32875\t14123-3\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC62697-B.mp3\tDick Robertson And His Orch\tI Want You For Christmas\tDECCA\t3365B\t62697-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/His57528-1.mp3\tKing Oliver And His Orchestra\tI Want You Just Myself\tHis Master's Voice\tR-14433\t57528-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_110.mp3\tGeorgia Gibbs\tI Want You To Be My Baby\tMercury\t70685\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_138.mp3\tLillian Briggs\tI Want You To Be My Baby\tEpic\t9115\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_093.mp3\tFrankie Lymon-teenagers\tI Want You To Be My Girl\tGee\t1012\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/DIS297.mp3\tBilly Kyle Trio\tI Want You, I Need You\tDISC\t5001\t297\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_017.mp3\tElvis Presley\tI Want You, I Need You, I Love You\tRCA Victor\t6540\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic63195-2.mp3\tMckinney's Cotton Pickers\tI Want Your Love\tVictor\t22683\t63195-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26399-A.mp3\tJimmie Lunceford And His Orchestra\tI Wanta Hear Swing Songs\tColumbia\t35453\t26399-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480680.mp3\tNat King Cole\tI Was A Little Too Lonely(and You Were A Little Too Late)\tCapitol\tEMS 1103\t15898-8\t1956\tNat King Cole, P & Vocal, Willie Smith, As, John Collins, G, Charlie Harris, B, Lee Young, D\nhttp://www.jazz-on-line.com/a/mp3c/DEC63226.mp3\tElla Fitzgerald & Her Savoy 8\tI Was Doing All Right\tDECCA\t1669\t63226\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1080.mp3\tArtie Shaw And His Orchestra\tI Was Doing Alright\tRCA\t20-1742\tD5VB1080\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU22323-1.mp3\tRed Norvo & His Orch\tI Was Doing Alright (v M. Bailey)\tBRUNSWICK\t8068\t22323-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT509.mp3\tLouis Prima & His Orchestra\tI Was Here When You Left (v L A C)\tMAJESTIC\t7135\tT509\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COL16889.mp3\tBenny Goodman And His Orchestra\tI Was Lucky\tCOLUMBIA\t3018 D\t16889\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_086.mp3\tBenny Goodman And His Orchestra Feat. Helen Ward\tI Was Lucky\tCOLUMBIA\t3018 D\t16889\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39212-A.mp3\tDorsey Brothers Orchestra\tI Was Lucky (vbc)\tDECCA\t358B\t39212-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC59694.mp3\tDuke Ellington & His Orch\tI Was Made To Love You\tVICTOR\t38130A\t59694\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK3026-2.mp3\tMoon Mullican\tI Was Sorta Wonderin'\tKING\t917AA\tK3026-2\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_150.mp3\tElvis Presley\tI Was The One\tRCA\t6420\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2068-3.mp3\tJulia Lee And Her Boyfriends\tI Was Wrong\tCAPITOL\t\t2068-3\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_367.mp3\tPaul Weston And His Orchestra\tI Went Out Of My Way\tCOLUMBIA\t40237\tRHCO10840\t1954\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62456-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tI Went To A Gypsy\tDecca\t1422\t62456-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/MERYB9244-4.mp3\tPatti Page W Jack Rael Orch\tI Went To Your Wedding\tMERCURY\t5899\tYB9244-4\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_178.mp3\tSteve Gibson And The Red Caps\tI Went To Your Wedding\tRCA Victor\t4835\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVUS11662.mp3\tFour Buddies\tI Will Wait\tSAVOY\t769A\tUS11662\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC72643.mp3\tMills Brothers\tI Wish\tDECCA\t3598\t72643\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_065.mp3\tMills Brothers\tI Wish\tDECCA\t18663B\t72643\t1945\t\nhttp://www.jazz-on-line.com/a/mp3l/Col80695-2.mp3\tThe Georgians\tI Wish I Could Shimmy Like My Sister Kate\tColumbia\tA-3775\t80695-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145633-3.mp3\tJan Garber & His Orch\tI Wish I Could Shimmy Like My Sister Kate\tCOLUMBIA\t1306 D\tW145633-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D307B2.mp3\tMuggsy Spanier And His Ragtime Band\tI Wish I Could Shimmy Like My Sister Kate\tV-DISC\t307B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_023.mp3\tVirginians\tI Wish I Could Shimmy Like My Sister Kate\tVICTOR\t18965A\t26917-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR143221-1.mp3\tUniversity Six\tI Wish I Could Shimmy Like My Sister Kate\tHARMONY\t414-H\t143221-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru13184-A.mp3\tHerny ''red'' Allen And His New York Orchestra\tI Wish I Could Shimmy Like My Sister Kate\tBrunswick\t\t13184-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_127.mp3\tGeorgians\tI Wish I Could Shimmy Like My Sister Kate\tColumbia\tA-3775\t80695-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2294x.mp3\tVaughn Monroe\tI Wish I Didn't Love You\tRCA\t20-2294\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP409x.mp3\tBetty Hutton\tI Wish I Didn't Love You So\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2321.mp3\tDinah Shore\tI Wish I Didn't Love You So\tCOLUMBIA\t37506\tHCO2321\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_027.mp3\tDinah Shore\tI Wish I Didn't Love You So\tCOLUMBIA\t37506\tHCO2321\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_106.mp3\tDick Haymes\tI Wish I Didn't Love You So\tDECCA\t23977\tL4434\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_056.mp3\tBetty Hutton\tI Wish I Didn't Love You So\tCapitol\t409\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB6693-2.mp3\tBilly Murray\tI Wish I Had A Girl\tVICTOR\t16291\tB6693-2\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_045.mp3\tHarry Tally\tI Wish I Had A Girl\tCOLUMBIA\tA-0642\t03994\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_017.mp3\tBilly Murray\tI Wish I Had A Girl\tVICTOR\t16291\tB6693-2\t1909\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67422x.mp3\tDick Robertson And His Orch\tI Wish I Had Died In My Cra\tDecca\t3125-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1645.mp3\tGene Autry\tI Wish I Had Never Met Sunshine\tCOLUMBIA\t20020\tHCO1645\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1645.mp3\tGene Autry\tI Wish I Had Never Met Sunshine\tCOLUMBIA\t36970\tHCO1645\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60835.mp3\tJimmie Davis\tI Wish I Had Never Seen Sunshine\tDECCA\t5231\t60835\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU030364-1.mp3\tFats Waller And His Rhythm\tI Wish I Had You\tBLUEBIRD\t10078\t030364\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23153-2.mp3\tBillie Holiday & Her Orch\tI Wish I Had You\tCBS\tVO4238\t23153-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75753.mp3\tLionel Hampton & His Orchestra\tI Wish I Knew\tDECCA\t28711\t75753\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_071.mp3\tDick Haymes\tI Wish I Knew\tV-DISC\t479\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec75753.mp3\tLionel Hampton And His Orchestra\tI Wish I Knew\tDecca\t28711\t75753\t1950\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480444.mp3\tAhmad Jamal\tI Wish I Knew\tArgo\tUnissued\t9025\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3b/Joh098.mp3\tVocal Elsie Carlisle\tI Wish I Knew A Bigger Word Than Love\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39853.mp3\tBing Crosby & Dorsey Brothers\tI Wish I Were Aladdin\tDECCA\t547A\t39853\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru39853-A.mp3\tDorsey  Brothers  Orchestra With Bing Crosby\tI Wish I Were Aladdin\tBrunswick\tE02082\t39853-A \t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC82527-1.mp3\tFats Waller And His Rhythm\tI Wish I Were Twins\tVICTOR\t24641\t82527-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_290.mp3\tHenry Allen And His Orchestra\tI Wish I Were Twins\tBANNER\t33081\t15146-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic82527-1.mp3\tFats Waller And His Rhythm\tI Wish I Were Twins\tVictor\t24641\t82527-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-6800-1.mp3\tValaida (queen Of The Trumpet) With Billy Mason And His Orchestra\tI Wish I Were Twins\tParlophone\tF-118\tCE-6800-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_116.mp3\tEmil Coleman And His Orchestra Feat. V/jerry Cooper, The Harmonians\tI Wish I Were Twins (so I Could Love You Twice As Much)\tCOLUMBIA\t2933 D\tW152764\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_262.mp3\tRosemary Clooney\tI Wish I Wuz\tCOLUMBIA\t39536\tCO46850\t1951\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D224A1.mp3\tSammy Kay And His Orchestra\tI Wish That I Could Hide Inside This Letter\tV-DISC\t224A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_133.mp3\tLawrence Welk And His Orchestra\tI Wish That I Could Hide Inside This Letter\tDecca\t4428\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39857.mp3\tBing Crosby\tI Wished On The Moon\tDECCA\t543A\t39857\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru39857-A.mp3\tDorsey  Brothers  Orchestra With Bing Crosby\tI Wished On The Moon\tBrunswick\tE02070\t39857-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru3593.mp3\tDorsey  Brothers  Orchestra With Bing Crosby\tI Wished On The Moon (dialogue Only)\tBrunswick\t\t3593 \t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB17766-1.mp3\tTeddy Wilson And His Orchestra\tI Wished On The Moon (v B H)\tBRUNSWICK\t7501\tB-17766-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_383.mp3\tJoni James\tI Woke Up Crying\tMGM\t12213\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S6035.mp3\tBob Wills And His Texas Playboys\tI Won't Be Back Tonight\tMGM\t11568\t52S6035\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67100.mp3\tHot Lips Page & His Band\tI Won't Be Here Long\tDECCA\t7699\t67100\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU030367.mp3\tFats Waller And His Rhythm\tI Won't Believe It Until I Hear It From You\tBLUEBIRD\t10062\t030367\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45193.mp3\tTony Bennett W Percy Faith\tI Won't Cry Anymore\tCOLUMBIA\t39362\tCO45193\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_083.mp3\tTony Bennett\tI Won't Cry Anymore\tCOLUMBIA\t39824\tZSP6774\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC83975.mp3\tEddy Duchin And His Orch\tI Won't Dance\tVICTOR\t24871\t83975\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-419-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tI Won't Dance\tSWING\t249\tOSW-419-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_007.mp3\tEddy Duchin And His Orchestra\tI Won't Dance\tVICTOR\t24871\t83975\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480410.mp3\tArt Tatum And Roy Eldridge\tI Won't Dance\tClef\tMGC679\t2305-5\t1955\tRoy Eldridge (tp), Art Tatum (p), John Simmons (sb), Alvin Stoller (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480608.mp3\tThe Art Tatum Quartet\tI Won't Dance\tClef\tMGC679\t2305-5\t1955\tRoy Eldridge (tp), Art Tatum p), John Simmons (sb), Alvin Stoller (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1935_089.mp3\tJohnny Green And His Orchestra Feat. Marjorie Logan & Jimmy Farrell, V\tI Won't Dance\tCOLUMBIA\t3022-D\t16977-4\t1935\tAngie Rattinger and another (tp), unknown (tb), Jimmy Lytell (cl, as), Charles Dale (cl, as, bar), Ernest White, Murray Cohan (cl, ts), Leo Kruczck, Lou Kosloff, Joe Baum (vn), Johnny Green (p, ldr), David Terry (p), Perry Botkin (g), Kaspar Markowitz (sb), Al Lapin (dm) \nhttp://www.jazz-on-line.com/a/mp3w/1935_281.mp3\tGeorge Hall And His Orchestra\tI Won't Dance\tBLUEBIRD\tB-5863\t88773\t1935\tLoretta Lee, Sonny Schuyler (vo), Phil Silverman, Walter Wax (tp), Howard Carlson, John Doyle (tb), Jack Shilkret, Joe Herde, George Paxton, Michael Bruce (saxes), Charlie Romano, Frank Sterling (vn), Fred Duro (p), Frank Klinger (g), Bernie Miller (sb), Sam Bass (dm). \nhttp://www.jazz-on-line.com/a/mp3a/DEC64643.mp3\tAndy Kirk And Clouds Of Joy\tI Won't Tell A Soul\tDECCA\t2127A\t64643\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64643-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tI Won't Tell A Soul (i Love You)\tDecca\t2127\t64643-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC027915.mp3\tBunny Berigan & His Orch\tI Won't Tell A Soul I Love You\tVICTOR\t26086B\t027915\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC72693.mp3\tLouis Armstrong And His Orch\tI Wonder\tDECCA\t18652A\t72693\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_256.mp3\tCecil Gant\tI Wonder\tGilt-Edge\t500\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/HITT485-2.mp3\tLouis Prima & His Orch\tI Wonder (v L P)\tHIT OF THE WEEK\t7123\tT485-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143483.mp3\tHarry Reser's Syncopators\tI Wonder How I Look When I'm Asleep\tCOLUMBIA\t907 D\tW143483\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE22078.mp3\tSix Jumping Jacks\tI Wonder How I Look When I'm Asleep (vts)\tBRUNSWICK\t3511\tE22078\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU76863-1.mp3\tJimmie Davis\tI Wonder If She's Blue\tBLUEBIRD\t5187\t76863-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65111.mp3\tCliff Bruner's Texas Wanderers\tI Wonder If You Feel\tDECCA\t5664\t65111\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81790-7.mp3\tTed Lewis & His Band\tI Wonder What Become Of Sally?\tCOLUMBIA\t157D\t81790-7\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83953.mp3\tElla Fitzgerald\tI Wonder What Kind Of Guy You'd Be\tDECCA\t28930\t83953\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13690-1.mp3\tAl Jolson - Carl Fenton Orch\tI Wonder What's Become Of Sally\tBRUNSWICK\t2671\t13690-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2444.mp3\tBing Crosby\tI Wonder What's Become Of Sally\tDECCA\t18531A\tDLA2444\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19487i.mp3\tThe Troubadours\tI Wonder What's Become Of Sally\tVictor\t19487\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_079.mp3\tHenry Burr And Billy Murray\tI Wonder Where My Baby Is To-night?\tVICTOR\t19864\t33772\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC33772.mp3\tHenry Burr & Billy Murray\tI Wonder Where My Baby Is Tonight\tVICTOR\t19864\t33772\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC4971hpp.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tI Wonder Where My Baby Is Tonight\tDECCA\tF-7100\t4971hpp\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_1111_01.mp3\tLee Morse\tI Wonder Where My Baby Is Tonight\tPerfect\t11599A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3o/HayBb-7494-2.mp3\tJack Hylton And His Orchestra\tI Wonder Where My Baby Is Tonight\tHMV\t\tBb-7494-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/MERYB16140.mp3\tBuddy Johnson\tI Wonder Where Our Love Has Gone\tMERCURY\t71262\tYB16140\t\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-8490-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tI Wonder Who Makes Rhythm ? \tParlophone\tF-89\tCE-8490-1\t1937\tValaida Snow t v acc. by Johnny Claes t, Derek Neville as bar, Reggie Dare ts, Gun Finlay p, Norman Brown g, Louis Barreiro b, Ken Stewart d\nhttp://www.jazz-on-line.com/a/mp3b/DEC69912-A.mp3\tBuddy Johnson & His Band\tI Wonder Who's Boogein' My Woogie Now? (vc.boone)\tDECCA\t8611\t69912-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66725.mp3\tTed Weems And His Orchestra\tI Wonder Who's Kissing Her Now\tDECCA\t2919A\t66725\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_132.mp3\tRay Noble And His Orchestra\tI Wonder Who's Kissing Her Now\tCOLUMBIA\t37544\tHCO2289\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_037.mp3\tBilly Murray\tI Wonder Who's Kissing Her Now\tVICTOR\t16426\tB8327-1\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_003.mp3\tHenry Burr\tI Wonder Who's Kissing Her Now\tColumbia\t707\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_021.mp3\tPerry Como Feat. Ted Weems' Orchestra\tI Wonder Who's Kissing Her Now\tDECCA\t25078\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_147.mp3\tDinning Sisters Feat. Art Van Damme Quintet\tI Wonder Who's Kissing Her Now\tCapitol\t433\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2671.mp3\tAl Jolson\tI Wonder Why She Kept Saying Si-si-si-si-senor\tColumbia\tA2671\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23865x.mp3\tGuy Lombardo\tI Wonder, I Wonder\tDECCA\t23865\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU88773.mp3\tGeorge Hall & His Orch\tI Wont Dance\tBLUEBIRD\t5863\t88773\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC92021.mp3\tRice Brothers Gang\tI Wont Have Any Troubles\tDECCA\t5893\tC92021\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC1855.mp3\tRed Norvo And His Orch\tI Would Do Anything For You\tBRUNSWICK\t7868\tC1855\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0234.mp3\tTempo King's Kings Of Tempo\tI Would Do Anything For You\tBLUEBIRD\t6534\t0234\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67091.mp3\tHot Lips Page & His Band\tI Would Do Anything For You\tDECCA\t7699\t67091\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC101258-1.mp3\tBenny Goodman And His Orchestra\tI Would Do Anything For You\tVICTOR\t25350B\t101258-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC12428-A.mp3\tWashboard Rhythm Kings\tI Would Do Anything For You\tVOCALION\t1734\t12428-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC12119.mp3\tJack Bland & His Rhythmakers\tI Would Do Anything For You (vbilly Banks)\tARC\tBA32530\t12119\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5733z.mp3\tFrankie Laine\tI Would Do Most Anything For You\tMERCURY\t5733\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUB794.mp3\tBing Crosby\tI Would If I Could But I Can't\tBRUNSWICK\t6623\tB794\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_147.mp3\tGloria Hart\tI Would Rather Look At You\tMERCURY\t5881\tYB9064-1\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC71270.mp3\tGene Kardos & His Orch\tI Wouldn't Change You For The World (v D R)\tVICTOR\t22918\t71270\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU033904.mp3\tCharlie Barnet & His Orch\tI Wouldn't Give That For Love (v J E)\tBLUEBIRD\t10162\t033904\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_181.mp3\tEddy Arnold\tI Wouldn't Know Where To Begin\tRCA\t6699\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68053.mp3\tWoody Herman & His Orchestra\tI Wouldn't Take A Million\tDECCA\t3397B\t68053\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU055516.mp3\tGlenn Miller & His Orch\tI Wouldn't Take A Million (vre)\tBLUEBIRD\t10860\t055516\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP5092.mp3\tJogi Jorgensen\tI Yust Go Nuts At Christmas\tCAPITOL\t\t5092\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec60157-C.mp3\tLouis Armstrong And His Orchestra\tI' Shooting High\tDecca\t623\t60157-C\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68970.mp3\tBuddy Johnson & His Band\tI'd Be Ever So Grateful\tDECCA\t8546\t68970\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO4538-1.mp3\tFrankie Carle & Rhythm\tI'd Be Lost Without You\tCOLUMBIA\t36994\tCCO4538-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC049675-1.mp3\tLionel Hampton & His Orch\tI'd Be Lost Without You\tVICTOR\t26751\t049675-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_195.mp3\tGuy Lombardo And His Royal Canadians\tI'd Be Lost Without You\tColumbia\t18901\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_200.mp3\tFrankie Carle And His Orchestra Feat. Marjorie Hughes\tI'd Be Lost Without You\tCOLUMBIA\t36994\tHCO1374\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic049675-1.mp3\tLionel Hampton And His Orchestra\tI'd Be Lost Without You\tVictor\t26751\t049675-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_139.mp3\tArt Gillham\tI'd Climb The Highest Mountain\tCOLUMBIA\t626\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141814.mp3\tArt Gillam\tI'd Climb The Highest Mountain If I Knew I'd Find You\tCOLUMBIA\t626 D\tW141814\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_176.mp3\tDean Martin\tI'd Cry Like A Baby\tCapitol\t2749\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC53560.mp3\tHelen Kane\tI'd Do Anything For You\tVICTOR\t22080\t53560\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-859-A.mp3\tJimmie Noone And His Orchestra\tI'd Do Anything For You\tVocalion \t2862\tC-859-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10252.mp3\tFrankie Laine W P.weston Orch\tI'd Give My Life\tCOLUMBIA\t40136\tRHCO10252\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC59639-3.mp3\tHelen Kane\tI'd Go Barefoot All Winter Long\tVICTOR\t22397\t59639-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28753-1.mp3\tGene Krupa & His Orch\tI'd Know You Anywhere\tOKEH\t5836\t28753-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECLA2124.mp3\tBob Crosby & His Orch\tI'd Know You Anywhere\tDECCA\t3434A\tLA2124\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/RCAE4VH-0792-a.mp3\tDick Collins And The Runaway Herd\tI'd Know You Anywhere\tRCA VICTOR\t547-0459\tE4VH-0792-a\t1955\tformerly of Woody Herman Orchestra\nhttp://www.jazz-on-line.com/a/mp3c/BLU056482.mp3\tGlenn Miller & His Orch\tI'd Know You Anywhere (vre)\tBLUEBIRD\t10906A\t056482\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1899_001.mp3\tArthur Collins\tI'd Leave My Happy Home For You\tBERLINER\tBER0441\t\t1899\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_076.mp3\tFrances White\tI'd Like To Be A Monkey In The Zoo\tVICTOR\t45149\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16319.mp3\tFreddy Martin And His Orch\tI'd Like To Dunk You In My Coffee\tBRUNSWICK\t7326\t16319\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU57066-2.mp3\tMckinney's Cotton Pickers\tI'd Love It\tBLUEBIRD\t10706\t57066-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_0316_01.mp3\tLee Morse And Her Bluegrass Boys\tI'd Love To Be In Love\tColumbia\t1011DA\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18692.mp3\tPeerless Quartet\tI'd Love To Fall Asleep And Wake Up In My Mammy's Arms\tVictor\t18692\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_047.mp3\tPeerless Quartet\tI'd Love To Fall Asleep And Wake Up In My Mammy's Arms\tVictor\t18692\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_086.mp3\tHenry Burr And Albert Campbell\tI'd Love To Live In Loveland With A Girl Like You\tCOLUMBIA\t1209\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR229-Hx.mp3\tIrving Kaufman\tI'd Love To Meet That Old S\tHarmony\t229-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014652.mp3\tBunny Berigan & His Orch\tI'd Love To Play A Love Scene\tVICTOR\t25688A\t014652\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_210.mp3\tPhil Harris\tI'd Love To Take Orders From You\tDECCA\t564A\t39979\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN11635-1.mp3\tChick Bullock\tI'd Rather Be A Beggar With You\tBANNER\t32415\t11635-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49261-3.mp3\tFanny Brice\tI'd Rather Be Blue Over You\tVICTOR\t21815\t49261-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC21815.mp3\tFanny Brice\tI'd Rather Be Blue Over You\tVICTOR\t21815\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_188.mp3\tFanny Brice Feat. Leonard Joy (director)\tI'd Rather Be Blue Over You (than Be Happy With Somebody Else)\tVICTOR\t21815\t49261-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145650-2.mp3\tBessie Smith\tI'd Rather Be Dead And Buried In My Grave\tCOLUMBIA\t14304 D\tW145650-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3724.mp3\tBing Crosby\tI'd Rather Be Me\tDECCA\t18690B\tL3724\t1945\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC014624.mp3\tLeo Reisman & His Orch\tI'd Rather Be Right\tVICTOR\t25687\t014624\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36814-8.mp3\tJean Goldkette & His Orch\tI'd Rather Be The Girl In Your Arms\tVICTOR\t20273A\t36814-8\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013347-1.mp3\tFats Waller And His Rhythm\tI'd Rather Call You Baby\tVICTOR\t25681\t013347-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/ConW-3326.mp3\tSarah Vaughan\tI'd Rather Have A Memory Than\tContinental\t6008\tW-3326\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1096.mp3\tFred Astaire W J.green\tI'd Rather Lead A Band\tBRUNSWICK\t7610\tLA1096\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_164.mp3\tFred Astaire\tI'd Rather Lead A Band\tCOLUMBIA\t3118 D\tLA1096\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC18719-1.mp3\tBunny Berigan & His Boys\tI'd Rather Lead A Band (v C B)\tVOCALION\t3178\t18719-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18091.mp3\tMildred Bailey\tI'd Rather Listen To Your Eyes\tARC\tVO3056\t18091\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC030703.mp3\tBenny Goodman And His Orchestra\tI'll Always Be In Love With You\tVICTOR\t26187\t030703\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100362-1.mp3\tFletcher Henderson & His Orch\tI'll Always Be In Love With You\tVICTOR\t25317B\t100362-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_094.mp3\tMorton Downey\tI'll Always Be In Love With You\tVictor\t21860\t49670-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_354.mp3\tJack Pleis And His Orchestra\tI'll Always Be In Love With You\tDecca\t30086\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3d/OKE28961-1.mp3\tHorace Henderson And His Orchestra\tI'll Always Be In Love With You\tOKEH\t5953\t28961-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic100362-1.mp3\tFletcher Henderson And His Orchestra\tI'll Always Be In Love With You\tVictor\t25317\t100362-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO34268.mp3\tLes Brown And Doris Day\tI'll Always Be With You\tCOLUMBIA\t36804\tCO34268\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC71272.mp3\tBuddy Johnson And His Band\tI'll Always Be With You\tDECCA\t8655B\t71272\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1028x.mp3\tDean Martin\tI'll Always Love You\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93692.mp3\tRice Brothers Gang\tI'll Always Love You\tDECCA\t6088\tC93692\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_115.mp3\tDean Martin\tI'll Always Love You\tCapitol\t1028\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_361.mp3\tBuddy Greco\tI'll Always Love You Some\tCoral\t60904\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC63632-3.mp3\tBix Beiderbecke And His Orch\tI'll Be A Friend With Pleasure\tVICTOR\t26415\t63632-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC70349.mp3\tMills Brothers\tI'll Be Around\tDECCA\t18318A\t70349\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_418.mp3\tDon Cherry\tI'll Be Around\tColumbia\t40705\tCO54436\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC4181.mp3\tCab Calloway & His Orch\tI'll Be Around\tOKEH\t6717\tC4181\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_151.mp3\tMills Brothers\tI'll Be Around\tDECCA\t27157B\t70349-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_140.mp3\tRuth Etting\tI'll Be Blue Just Thinking Of You\tCOLUMBIA\t2307 D\tW150744-6\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC6121.mp3\tIsham Jones & His Orch\tI'll Be Blue, Just Thinking Of You\tBRUNSWICK\t4914\tC6121\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150744-6.mp3\tRuth Etting\tI'll Be Blue, Just Thinking Of You\tCOLUMBIA\t2307 D\tW150744-6\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150785-2.mp3\tBert Lown & His Orch\tI'll Be Blue, Just Thinking Of You\tCOLUMBIA\t2292 D\tW150785-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S3100.mp3\tBilly Eckstine W S.burke Orch\tI'll Be Faithful\tMGM\t10259A\t47S3100\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_198.mp3\tBernie Cummins And His Orchestra\tI'll Be Faithful\tColumbia\t2827\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_059.mp3\tJan Garber And His Orchestra\tI'll Be Faithful\tVICTOR\t24412\t77018-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC77018-1.mp3\tJan Garber & His Orch\tI'll Be Faithful (v L P)\tVICTOR\t24412\t77018-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404871-A.mp3\tLouis Armstrong & His Orch\tI'll Be Glad When You're Dead, You Rascal You\tOKeh\t41504\t404871-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_149.mp3\tLouis Armstrong\tI'll Be Glad When You're Dead, You Rascal You\tOkeh\t41504\t404871-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_187.mp3\tRuss Morgan And His Orchestra\tI'll Be Hangin' Around\tDECCA\t28590\tL7036\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_334.mp3\tLes Brown And His Orchestra Feat. The Modernaires\tI'll Be Hangin' Around\tCORAL\t60946\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_033.mp3\tPat Boone With Orchestra\tI'll Be Home\tDot\t15443 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3203.mp3\tBing Crosby - J.s.trotter\tI'll Be Home For Christmas\tDECCA\t18570A\tL3203\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87037-1.mp3\tCarter Family\tI'll Be Home Some Day\tBLUEBIRD\t5911\t87037-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14358-C.mp3\tSpirits Of Rhythm\tI'll Be Ready When The Great Day Comes\tBRUNSWICK\t6728\t14358-C\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COL30142y.mp3\tBig Three Trio\tI'll Be Right Some Day\tCOLUMBIA\t30142\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/Cap38917.mp3\tJo Stafford\tI'll Be Seeing You\tCapitol\tST 1921 (L\t38917\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3318.mp3\tBing Crosby\tI'll Be Seeing You\tDECCA\t18595B\tL3318\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2508IBSY.mp3\tTommy Dorsey\tI'll Be Seeing You\tRCA\t20-2508\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4750.mp3\tBillie Holiday W Eddy Heywood\tI'll Be Seeing You\tCOMMODORE\t553\t4750\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL430.mp3\tErroll Garner Trio\tI'll Be Seeing You\tATLANTIC\t674\t430\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D156B2.mp3\tFreddy Martin And His Orchestra\tI'll Be Seeing You\tV-DISC\t156B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC26539.mp3\tTommy Dorsey And His Orch\tI'll Be Seeing You\tVICTOR\t26539\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D262B1.mp3\tJo Stafford\tI'll Be Seeing You\tV-DISC\t262B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_013.mp3\tBing Crosby\tI'll Be Seeing You\tDECCA\t18595B\tL3318\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_036.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra\tI'll Be Seeing You\tVICTOR\t1574\t047708\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh088.mp3\tStanley Black Orchestra\tI'll Be Seeing You (v Anne Shelton)\tDecca\t\tDR-8685-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC047708.mp3\tTommy Dorsey And His Orch\tI'll Be Seeing You (vfs)\tVICTOR\t26539\t047708\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO50699.mp3\tRay Price\tI'll Be There If You Want Me\tCOLUMBIA\t21214\tCO50699\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79292.mp3\tAl Campbell & Henry Burr\tI'll Be With You In Apple Blossom Time\tCOLUMBIA\tA-2967\t79292\t1920\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68351.mp3\tAndrews Sisters\tI'll Be With You In Apple Blossom Time\tDECCA\t3622B\t68351\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC3622B.mp3\tAndrews Sisters\tI'll Be With You In Apple Blossom Time\tDECCA\t3622B\t68351\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_035.mp3\tAndrews Sisters\tI'll Be With You In Apple Blossom Time\tDECCA\t3622B\t68351\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_041.mp3\tHenry Burr And Albert Campbell\tI'll Be With You In Apple Blossom Time\tCOLUMBIA\t2967\t79292\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_134.mp3\tReed Miller\tI'll Be With You In Apple Blossom Time\tEmerson\t10213\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_015.mp3\tCharles Harrison\tI'll Be With You In Apple Blossom Time\tVICTOR\t18693\t24378\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18693.mp3\tC.harrison-w.robyn\tI'll Be With You In Applebloss\tVICTOR\t18693\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC24378.mp3\tC.harrison-w.robyn\tI'll Be With You In Appleblossom Time\tVICTOR\t18693\t24378\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVoc3214.mp3\tHenry Allen & His Orchestra\tI'll Bet You Tell That To All The Girls\tVocalion\t3214\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU76154-1.mp3\tBert Lown And His Orchestra\tI'll Build A Nest\tBLUEBIRD\tB-5087\t76154-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC26748-5.mp3\tPaul Whiteman And His Orch\tI'll Build A Stairway To Paradise\tVICTOR\t18949\t26748-5\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72865-A.mp3\tEddie Condon & His Orch\tI'll Build A Stairway To Paradise\tDECCA\t23433\t72865-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3835.mp3\tDick Haymes And Helen Forrest\tI'll Buy That Dream\tDECCA\t23434\tL3835\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_103.mp3\tHal Mcintyre And His Orchestra\tI'll Buy That Dream\tVictor\t1679\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_019.mp3\tHelen Forrest And Dick Haymes Feat. Victor Young Orchestra\tI'll Buy That Dream\tDECCA\t23434\tL3835\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1409.mp3\tHarry James And His Orch\tI'll Buy That Dream (vkitty Kallen)\tCOLUMBIA\t36833\tHCO1409\t1945\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC640B.mp3\tChick Webb & His Orchestra\tI'll Chase The Blues Away\tDECCA\t640B\t60056\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60056.mp3\tChick Webb & His Orchestra\tI'll Chase The Blues Away\tDECCA\t640B\t60056\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT976.mp3\tMildred Bailey W Ellis Larkin\tI'll Close My Eyes\tMAJESTIC\t1093\tT976\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2669.mp3\tBuddy Clark W Ray Noble Orch\tI'll Dance At Your Wedding\tCOLUMBIA\t37967\tHCO2669\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU030365-1.mp3\tFats Waller And His Rhythm\tI'll Dance At Your Wedding\tBLUEBIRD\t10070\t030365-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_029.mp3\tBuddy Clark Feat. Ray Noble And His Orchestra\tI'll Dance At Your Wedding\tCOLUMBIA\t37967\tHCO2669\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_117.mp3\tBilly Murray\tI'll Do It All Over Again\tVICTOR\t17637B\t15138-2\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/IMP2774.mp3\tJack Payne's Band\tI'll Do My Best To Make You Happy\tIMPERIAL\t2774\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04929.mp3\tTommy Dorsey & His Orch\tI'll Dream My Way To Heaven\tVICTOR\t25534\t04929\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022450.mp3\tTommy Dorsey & His Orch\tI'll Dream Tonight\tVICTOR\t25832\t022450\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU22824-12.mp3\tTeddy Wilson & His Orch\tI'll Dream Tonight\tBRUNSWICK\t8141\t22824-12\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_258.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tI'll Dream Tonight\tVICTOR\t25832\t022450\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-22824-1.mp3\tTeddy Wilson And His Orchestra\tI'll Dream Tonight\tBrunswick\t8141\tB-22824-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_145.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tI'll Find You\tDECCA\t18545A\t71058\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36142-4.mp3\tGus Edwards & His Orch\tI'll Fly To Hawaii\tVICTOR\t20167A\t36142-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39101.mp3\tLee Wiley\tI'll Follow My Secret Heart\tDECCA\t322B\t39101\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COMB542-4.mp3\tWillie Smith (piano)\tI'll Follow You\tCOMMODORE\t519\tB542-4\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU12519A.mp3\tBing Crosby\tI'll Follow You\tBRUNSWICK\t6427\t12519A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC73583-1.mp3\tPaul Whiteman & His Orch\tI'll Follow You (v R M)\tVICTOR\t24141A\t73583-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29522-1.mp3\tCount Basie And His Orchestra\tI'll Forget\tOkeh\t6122\t29522-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80062.mp3\tEdwin Dale Orchestra Accompaniment\tI'll Forget You\tCOLUMBIA\tA3517\t80062\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH0824.mp3\tRoy Acuff-smoky Mountain Boys\tI'll Forgive You But I Can't Forget\tOKEH\t6723\tH0824\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU80930.mp3\tTampa Red\tI'll Get A Break Someday\tBLUEBIRD\t5744\t80930\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC21506.mp3\tErskine Hawkins Bama St.coll.\tI'll Get Along Somehow\tVOCALION\t3689\t21506\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_191.mp3\tSam Donahue And His Orchestra Feat. Bill Lockwood\tI'll Get Along Somehow\tCapitol\t15081\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec32136-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tI'll Get Along Somehow\tDecca\t1349\t32136-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW147955-3.mp3\tRuth Etting\tI'll Get By\tCOLUMBIA\t1733 D\tW147955-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLB21119.mp3\tTeddy Wilson And His Orch\tI'll Get By\tCOLUMBIA\t35926\tB21119\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30195.mp3\tHarry James And His Orch (vdick Haymes)\tI'll Get By\tCOLUMBIA\t36698\tCO30195\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL939.mp3\tHi-flyers\tI'll Get By\tVOCALION\t5176\tDAL939\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71610.mp3\tInk Spots\tI'll Get By\tDECCA\t25238\t71610\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4744.mp3\tBillie Holiday W Eddy Heywood\tI'll Get By\tCOMMODORE\t553\t4744\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BELLL1006o.mp3\tCab Calloway & 4 Belles\tI'll Get By\tBELL\tLL1006\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_104.mp3\tKing Sisters\tI'll Get By\tBluebird\t10856\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63258-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tI'll Get By\tDecca\t1916\t63258-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU29000.mp3\tNick Lucas\tI'll Get By (as Long As I Have You)\tBRUNSWICK\t4156\t29000\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/APOR-1010.mp3\tEarl Hines Sextet\tI'll Get By (as Long As I Have You)\tAPOLLO\t358\tR-1010\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/ApoR-1010.mp3\tEarl Hines Sextet\tI'll Get By (as Long As I Have You)\tApollo\t358\tR-1010\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh051.mp3\tCarroll Gibbons And The Savoy Hotel Orpheans\tI'll Get By (v Leslie Douglas)\tColumbia\tFB-3023\tCA-19500-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D598.mp3\tBing Crosby\tI'll Get By - Skeleton In The Closet\tV-DISC\t598\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC49620-3.mp3\tAileen Stanley\tI'll Get By As Long As I Have You\tVICTOR\t21839A\t49620-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_029.mp3\tRuth Etting\tI'll Get By As Long As I Have You\tCOLUMBIA\t1733 D\tW147955-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU70651.mp3\tJimmie Davis\tI'll Get Mine Bye And Bye\tBLUEBIRD\t5697\t70651\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68998.mp3\tLouis Armstrong & His Orch.\tI'll Get Mine Bye And Bye\tDECCA\t3900A\t68998\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO48023-1.mp3\tMarty Robbins\tI'll Go On Alone\tCOLUMBIA\t21022\tCO48023-1\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUMEM743.mp3\tRobert Wilkins\tI'll Go With Her Blues\tBRUNSWICK\t7158\tMEM743\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81666.mp3\tEddie Cantor\tI'll Have Vanilla\tCOLUMBIA\t120D\t81666\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_150.mp3\tEddie Fisher\tI'll Hold You In My Heart\tRCA\t20-4191\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_265.mp3\tEddy Arnold\tI'll Hold You In My Heart Till I Can Hold You In My Arms)\tRCA\t20-2332\tE29070\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2332.mp3\tEddy Arnold\tI'll Hold You In....\tRCA\t20-2332\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU94510.mp3\tJoe Kennedy & His Orch\tI'll Just Keep On Dreaming\tBLUEBIRD\t6080\t94510\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2406-1.mp3\tBud Powell (piano)\tI'll Keep Loving You\tMERCURY\t11045\t2406-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE5275y.mp3\tTiny Hill And His Orch\tI'll Keep On Loving You\tOkeh\t5275\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN9717-3.mp3\tAdrian Schubert And His Orchestra\tI'll Keep On Loving You\tBANNER\t\t9717-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_242.mp3\tConnee Boswell Feat. O/victor Young\tI'll Keep On Loving You\tDECCA\t3959B\tDLA2485\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75222.mp3\tLouis Armstrong - Sy Oliver\tI'll Keep The Lovelight Burning\tDECCA\t24751\t75222\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO44700.mp3\tSarah Vaughan\tI'll Know\tCOLUMBIA\t39124\tCO44700\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_460.mp3\tSammy Davis Jr.\tI'll Know\tDecca\t29672\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COL04682-2.mp3\tBert Williams\tI'll Lend You Anything\tCOLUMBIA\tA-0915\t04682-2\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23957g.mp3\tBillie Holiday & Billy Kyle\tI'll Look Around\tDECCA\t23957\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLB21791.mp3\tHorace Heidt And Musical Knights\tI'll Love You In My Dreams\tCOLUMBIA\t36080\tB21791\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru7981.mp3\tHorace Heidt & His Musical Knights\tI'll Love You In My Dreams\tBrunswick\t7981\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC58543-2.mp3\tMckinney's Cotton Pickers\tI'll Make Fun For You\tVICTOR\t38142\t58543-2\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69194.mp3\tSkeets Tolbert Gentlemen Swing\tI'll Make It Worth Your While\tDECCA\t8506B\t69194\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec68194-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tI'll Make It Worth Your While\tDecca\t8506\t68194-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0300_02.mp3\tLee Morse\tI'll Make You Fallin Love With Me\tPathe\t25178B\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1124x.mp3\tKay Starr And T.e.ford\tI'll Never Be Free\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75744.mp3\tLionel Hampton & His Orch\tI'll Never Be Free\tDECCA\t24911\t75744\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC76732.mp3\tElla Fitzgerald & Louis Jordan With The Tympany Five\tI'll Never Be Free\tDECCA\t27200\t76732\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/BluD9VB-2573.mp3\tLucky Millinder And His Orchestra\tI'll Never Be Free\tBluebird\t30-0004\tD9VB-2573\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec75744.mp3\tLionel Hampton And His Orchestra\tI'll Never Be Free\tDecca\t24911\t75744\t1950\tWalter Williams-Benny Bailey-Ed Mullens-Duke Garrette-Leo Shepherd-t, AI Grey-Benny Powell-Jimmy Wormick-Paul Lee Higaki-tb, Bobby Plater-Jerome Richardson-as, Curtis Lowe-Johnny Board-Billy ''Smallwood'' Williams-ts, Lonnie Shaw-bar, Lionel Hampton-vi\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB28.mp3\tArtie Shaw And His Orchestra\tI'll Never Be The Same\tRCA\t20-1638\tD5VB28\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12123-A.mp3\tGuy Lombardo Royal Canadians\tI'll Never Be The Same\tBRUNSWICK\t6350\t12123-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D219B1.mp3\tZiggy Elman And His Orchestra\tI'll Never Be The Same\tV-DISC\t219B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480411.mp3\tArt Tatum And Buddy Rich & Lionel Hampton\tI'll Never Be The Same\tClef\tMGC709\t2376-2\t1955\tArt Tatum (p), Lionel Hampton (vib), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480475.mp3\tBenny Goodman Trio\tI'll Never Be The Same\tCapitol\tT669\t1999-3\t1947\tBenny Goodman (cl), Teddy Wilson (p), Jimmy Crawford (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480586.mp3\tThe Art Tatum Trio\tI'll Never Be The Same\tPablo\t2310-735\t2672-1\t1956\tArt Tatum (p), Red Callender (sb), Jo Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3c/GUIG560-A.mp3\tGeorgie Auld & His Orchestra\tI'll Never Be The Same (v Patti Powers)\tGUILDE\t128\tG560-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39391.mp3\tBob Howard & His Orchestra\tI'll Never Change\tDECCA\t439B\t39391\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65251.mp3\tAndy Kirk & Clouds Of Joy\tI'll Never Fail You\tDECCA\t2407A\t65251\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23689-1.mp3\tTeddy Wilson & His Orch\tI'll Never Fail You\tBRUNSWICK\t8265\t23689-1\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23689-1.mp3\tTeddy Wilson And His Orchestra\tI'll Never Fail You\tBrunswick\t8265\tB-23689-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65251-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tI'll Never Fall You\tDecca\t2407\t65251-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU027291-1.mp3\tFats Waller And His Rhythm\tI'll Never Forgive Myself\tBLUEBIRD\t10000B\t027291-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S6062.mp3\tHank Williams\tI'll Never Get Out Of This World Alive\tMGM\t11366A\t52S6062\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM-371-2.mp3\tBenny Carter And The Ramblers\tI'll Never Give I\tDECCA\tF-42121\tAM-371-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK9030.mp3\tWynonie Harris & His Allstars\tI'll Never Give Up\tKING\t4468\tK9030\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC58995-2.mp3\tIsham Jones & His Orch\tI'll Never Have To Dream Again\tVICTOR\t24134\t58995-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_297.mp3\tFour Lads\tI'll Never Know\tColumbia\t40629\tCO53482\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC65189.mp3\tAndy Kirk And Clouds Of Joy\tI'll Never Learn\tDECCA\t2510B\t65189\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL943.mp3\tHi-flyers\tI'll Never Let You Cry\tVOCALION\t5176\tDAL943\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65112.mp3\tCliff Bruner's Texas Wanderers\tI'll Never Let You Cry\tDECCA\t5704\t65112\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S253.mp3\tBilly Eckstine\tI'll Never Make The Same Mistake Again\tMGM\t10123\t47S253\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2462.mp3\tGene Krupa & His Orch\tI'll Never Make The Same Mistake Again\tCOLUMBIA\t37875\tHCO2462\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_200.mp3\tDorsey Brothers Orchestra Feat. V/don Mattison, Skeets Herfurt And Roc Hillman\tI'll Never Say ''never Again'' Again\tDECCA\t480A\t39542\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_427.mp3\tBenny Goodman And His Orchestra Feat. Helen Ward, V\tI'll Never Say ''never Again'' Again\tCOLUMBIA\t39976\tCO48876\t1953\tBilly Butterfield, Jimmy Maxwell, Gordon \"Chris\" Griffin (tp), Lou McGarity, Cutty Cutshall, Bobby Byrne (tb), Benny Goodman (cl), Hymie Schertzer, Milt Yaner (as), Boomie Richman, Al Klink (ts), Bernie Leighton (p), Barry Galbraith (g), Eddie Safranski (sb), Don Lamond (dm), Fletcher Henderson (arr)\nhttp://www.jazz-on-line.com/a/mp3c/BRU17320-1.mp3\tOzzie Nelson & His Orch\tI'll Never Say Never Again\tBRUNSWICK\t7426\t17320-1\t1935\t\nhttp://www.jazz-on-line.com/mp3/318503618.mp3\tFrank Sinatra W T.dorsey Orch\tI'll Never Smile Again\tV-DISC\t582\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67968.mp3\tInk Spots\tI'll Never Smile Again\tDECCA\t3346A\t67968\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047069.mp3\tGlenn Miller & His Orch\tI'll Never Smile Again\tBLUEBIRD\t10673\t047069\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051866.mp3\tFats Waller And His Rhythm\tI'll Never Smile Again\tBLUEBIRD\t10841A\t051866\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE26969-A.mp3\tGene Krupa & His Orch\tI'll Never Smile Again\tOKEH\t5643\t26969-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67845.mp3\tTony Martin - Ray Sinatra Orch\tI'll Never Smile Again\tDECCA\t3247B\t67845\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_199.mp3\tFour Aces\tI'll Never Smile Again\tDECCA\t28391\t83006\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh066.mp3\tAmbrose And His Orchestra (vocals Anne Shelton)\tI'll Never Smile Again\tDecca\tF-7602\tDR-5011-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_003.mp3\tTommy Dorsey Orch V Frank Sinatra\tI'll Never Smile Again\tVICTOR\t26628\t048942-4\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC048942-4.mp3\tTommy Dorsey And His Orch Vocal Frank Sinatra\tI'll Never Smile Again (vfs)\tVICTOR\t26628\t048942-4\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO53210.mp3\tDoris Day\tI'll Never Stop Loving You\tCOLUMBIA\t40505\tCO53210\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_094.mp3\tDoris Day\tI'll Never Stop Loving You\tColumbia\t40505\tCO53210\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL786.mp3\tJoe Turner\tI'll Never Stop Loving You\tATLANTIC\t960\t786\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_226.mp3\tAndrews Sisters\tI'll Pray For You\tDecca\t4153\t70108\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec4153.mp3\tAndrews Sisters\tI'll Pray For You\tDecca\t4153\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27304.mp3\tMildred Bailey\tI'll Pray For You\tCOLUMBIA\t35589\t27304\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67736.mp3\tWoody Herman & His Orchestra\tI'll Pray For You\tDECCA\t3200B\t67736\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC70108.mp3\tAndrews Sisters\tI'll Pray For You\tDECCA\t4153\t70108\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036292.mp3\tArtie Shaw And His Orchestra\tI'll Remember\tBLUEBIRD\t10345 A\t036292-7\t1939\tVocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3b/CBS26022-A.mp3\tJack Teagarden & His Orch\tI'll Remember\tCBS\tCo35215\t26022-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_284.mp3\tLarry Clinton And His Orchestra\tI'll Remember\tVictor\t26303\t037679\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3455.mp3\tBing Crosby - J.s.trotter Or.\tI'll Remember April\tDECCA\t18621\tL3455\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76082.mp3\tArtie Shaw And His Orchestra\tI'll Remember April\tDECCA\t27056\t76082\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/DECLA5836.mp3\tLionel Hampton's Sextet\tI'll Remember April\tDECCA\t27375\tLA5836\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D268A.mp3\tCharlie Spivak And His Orchestra\tI'll Remember April\tV-DISC\t268A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5836.mp3\tLionel Hampton And His Sextet\tI'll Remember April\tDecca\t27375\tLA-5836\t1950\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481509.mp3\tCharles Mingus Quintet\tI'll Remember April\tFantasy\t6009\t\t1955\tEddie Bert (tb), George Barrow (ts), Mal Waldron (p), Charles Mingus (sb), Willie Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO4297-1.mp3\tGene Krupa & His Orch\tI'll Remember Suzanne\tCOLUMBIA\t36768\tCCO4297-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK2881-2.mp3\tMoon Mullican\tI'll Sail My Ship Alone\tKING\t830\tK2881-2\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_187.mp3\tMoon Mullican\tI'll Sail My Ship Alone\tKING\t830\tK2881-2\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78153-3.mp3\tAl Jolson\tI'll Say She Does\tCOLUMBIA\tA-2746\t78153-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_004.mp3\tAl Jolson\tI'll Say She Does\tCOLUMBIA\tA-2746\t78153-3\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_065.mp3\tAll-star Trio\tI'll Say She Does\tVICTOR\t18527A\t22358-3\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_052.mp3\tWilbur Sweatman's Original Jazz Band\tI'll Say She Does\tColumbia\t2752\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC57562-2.mp3\tLeo Reisman And His Orch\tI'll See You Again\tVICTOR\t22246\t57562-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC23540.mp3\tBilly Murray\tI'll See You In C-u-b-a\tVICTOR\t18652A\t23540\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_029.mp3\tBilly Murray\tI'll See You In C-u-b-a\tVICTOR\t18652A\t23540\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_155.mp3\tJack Kaufman\tI'll See You In C-u-b-a\tEmerson\t10158\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79047-1.mp3\tTed Lewis Jazz Band\tI'll See You In Cuba\tCOLUMBIA\tA-2927\t79047-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/BLA3505-B.mp3\tGaylord Carter\tI'll See You In My Dreams\tBlack & White\t3505-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14390-1-2.mp3\tRay Miller And His Orch - Isham Jones Guest Conductor\tI'll See You In My Dreams\tBRUNSWICK\t2788\t14390-1-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149806.mp3\tCliff Edwards 'ukelele Ike'\tI'll See You In My Dreams\tCOLUMBIA\t2169 D\tW149806\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1649.mp3\tVaughn Monroe\tI'll See You In My Dreams\tRCA\t20-1649\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC21504.mp3\tErskine Hawkins Bama St.coll.\tI'll See You In My Dreams\tVOCALION\t3689\t21504\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5810-1-5-6.mp3\tFletcher Henderson & His Orch\tI'll See You In My Dreams\tBANNER\t1470\t5810-1-5-6\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D341B2.mp3\tAndy Russell\tI'll See You In My Dreams\tV-DISC\t341B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61533-A.mp3\tJimmie Lunceford And His Orchestra\tI'll See You In My Dreams\tDecca\t1318\t61533-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_038.mp3\tMarion Harris\tI'll See You In My Dreams\tBRUNSWICK\t2784\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20413-1.mp3\tTeddy Wilson And His Orchestra\tI'll See You In My Dreams\tBrunswick\t7816  \tB-20413-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/TedP-23327-1.mp3\tTeddy Wilson And His Orchestra\tI'll See You In My Dreams\tTeddy Wilson School \t\tP-23327-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480663.mp3\tTeddy Wilson And His Orchestra\tI'll See You In My Dreams\tBrunswick\t7816\t20413-1-4\t1936\tIrving Randolph (tp), Vido Musso (cl), Ben Webster (ts), Teddy Wilson (p), Allen Reuss (g), John Kirby (sb), Cozy Cole (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS481776.mp3\tAnita O'day\tI'll See You In My Dreams\tVerve\tMGV2000\t2566-8\t1955\tacc. by Milt Bernhart, Lloyd Elliott, Joe Howard, Si Zentner (tb), Paul Smith (p), Barney Kessel (g), Joe Mondragon (sb), Alvin Stoller (dm), Buddy Bregman (arr, dir)\nhttp://www.jazz-on-line.com/a/mp3c/VIC019424.mp3\tTommy Dorsey & His Orch\tI'll See You In My Dreams (v J L)\tVICTOR\t26012-A\t019424\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_057.mp3\tJohn Mccormack\tI'll Sing Thee Songs Of Araby\tVictor\t64375\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0230.mp3\tTempo King's Kings Of Tempo\tI'll Sing You A Thousand Love Song\tBLUEBIRD\t6535\t0230\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_029.mp3\tEddy Duchin And His Orchestra\tI'll Sing You A Thousand Love Songs\tVICTOR\t25393\t97724-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_295.mp3\tDolly Dawn And Her Dawn Patrol\tI'll Stand By\tBluebird\t6381\t101538\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUSF97.mp3\tDick Powell\tI'll String Along With You\tBRUNSWICK\t6793\tSF97\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUSF101.mp3\tTed Fiorito And His Orch\tI'll String Along With You\tBRUNSWICK\t6859\tSF101\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_252.mp3\tTom Coakley And His Palace Hotel Orchestra Feat. Carl Ravazza\tI'll String Along With You\tVICTOR\t24600\t79127-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_005.mp3\tTed Fio Rito And His Orchestra Feat. Muzzy Marcellino\tI'll String Along With You\tBRUNSWICK\t6859\tSF101\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUSF34.mp3\tTed Fiorito And His Orch\tI'll Take An Option On You\tBRUNSWICK\t6505\tSF34\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6505.mp3\tTed Fiorito And His Orchestra\tI'll Take An Option On You\tBrunswick\t6505\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_069.mp3\tTed Fio Rito And His Orchestra\tI'll Take An Option On You\tBRUNSWICK\t6505\tSF34\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20597-B.mp3\tEdwin J. Mcenelly's Orch\tI'll Take Care Of Your Care\tVictor\t20597-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140616-1.mp3\tFletcher Henderson & His Orch\tI'll Take Her Back If She Wants To Come Back\tCOLUMBIA\t383D\t140616-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_362.mp3\tRudy Vallee And His Connecticut Yankees\tI'll Take Romance\tBluebird\t7331A\t17480\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480412.mp3\tArt Farmer New Jazz Stars\tI'll Take Romance\tPrestige\tPR7665\t555\t1954\tQuintet: Art Farmer, T, Flh, Sonny Rollins, Ts, Horace Silver, P, Percy Heath, B, Kenny Clarke, D\nhttp://www.jazz-on-line.com/a/mp3w/1942_121.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra And Pied Pipers\tI'll Take Tallulah\tVICTOR\t27869\t072109\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62349.mp3\tBob Howard & His Orch\tI'll Take The Key And Lock You Up\tDECCA\t1372\t62349\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18436i.mp3\tAda Jones & Billy Murray\tI'll Take You Back To Italy\tVictor\t18436\t21425-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC21425-3.mp3\tAda Jones & Billy Murray\tI'll Take You Back To Italy\tVICTOR\t18436\t21425-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_129.mp3\tAda Jones And Billy Murray\tI'll Take You Back To Italy\tVICTOR\t18436\t21425-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3898.mp3\tBing Crosby - J.s.trotter Orch\tI'll Take You Home Again, Kathleen\tDECCA\t18721B\tL3898\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1151.mp3\tTed Daffan's Texans\tI'll Travel Alone\tOKEH\t6504\tDAL1151\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_490.mp3\tBetty Johnson\tI'll Wait\tBally\t1000\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH0743.mp3\tAl Dexter And His Troopers\tI'll Wait For You, Dear\tOKEH\t6727\tH0743\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPmtilwa.mp3\tMartha Tilton\tI'll Walk Alone\tCAPITOL\t\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COR60659x.mp3\tDon Cornell\tI'll Walk Alone\tCORAL\t60659\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1586x.mp3\tDinah Shore\tI'll Walk Alone\tRCA\t20-1586\t20-1586x\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC82702.mp3\tLouis Armstrong And His Orch.\tI'll Walk Alone\tDECCA\t28177\t82702\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D230A2.mp3\tFrankie Carle And His Orchestra\tI'll Walk Alone\tV-DISC\t230A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_031.mp3\tMartha Tilton\tI'll Walk Alone\tCapitol\t157\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_012.mp3\tDinah Shore\tI'll Walk Alone\tRCA\t20-1586\t20-1586x\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_038.mp3\tDon Cornell Feat. Norman Leyden's Orchestra\tI'll Walk Alone\tCORAL\t60659\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_104.mp3\tJane Froman Feat. Sid Feller Orchestra\tI'll Walk Alone\tCapitol\t2044\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480566.mp3\tArt Farmer Quartet\tI'll Walk Alone\tPrestige\tLP193\t634\t1954\tArt Farmer, T, Flh, Wynton Kelley, P, Addison Farmer, B, Herbert Lovelle, D\nhttp://www.jazz-on-line.com/a/mp3b/MAJR383.mp3\tLouis Prima & His Orchestra\tI'll Walk Alone (v L. Carol)\tMAJESTIC\t7083\tR383\t1944\t\nhttp://www.jazz-on-line.com/a/mp3h/Pat106250.mp3\tDuke Ellington's Washingtonians\tI'm ''gonna'' Hang Around My Sugar\tPathe Actuelle\t36333\t106250-1\t1925\tPike Davis (tp) Charlie Irvis (tb) Prince Robinson (cl,ts) Otto Hardwick (as,bar) Duke Ellington (p) Fred Guy (bj) Bass Edwards (tu) \nhttp://www.jazz-on-line.com/a/mp3c/COL71404.mp3\tWill Fyffe\tI'm 94 To Day\tCOLUMBIA\t183D\t71404\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3786.mp3\tBrownie Mcghee\tI'm A Black Woman's Man\tOKEH\t6524\tC3786\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP5063.mp3\tLouis Armstrong And His Orch.\tI'm A Ding Dong Daddy\tCOLUMBIA\t39229\tZSP5063\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_222.mp3\tFreddie Fisher And His Orchestra\tI'm A Ding Dong Daddy\tDECCA\t1400\t91293-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_197.mp3\tLouis Armstrong\tI'm A Ding Dong Daddy (from Dumas)\tOKeh\t41442\t404403-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404403-A.mp3\tLouis Armstrong & His Orch\tI'm A Ding Dong Daddy From Dumas\tOKeh\t41442\t404403-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW149149-4.mp3\tPaul Whiteman And His Orchestra (bing Crosby Solo And In Chorus With Al Rinker, Jack Fulton And Boyc\tI'm A Dreamer - Aren't We All?\tColumbia\t\tW149149-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22148-A.mp3\tJohnny Marvin\tI'm A Dreamer Aren't We All\tVictor\t22148-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100360-1.mp3\tFletcher Henderson & His Orch\tI'm A Fool For Loving You\tVICTOR\t25297A\t100360-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic100360-1.mp3\tFletcher Henderson And His Orchestra\tI'm A Fool For Loving You\tVictor\t25297\t100360-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_111.mp3\tFrank Sinatra\tI'm A Fool To Want You\tCOLUMBIA\t39425\tCO45185\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COL16364.mp3\tBenny Goodman And His Orchestra\tI'm A Hundred Percent For You\tCOLUMBIA\t2988 D\t16364\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic87082-1.mp3\t\"fats\" Waller And His Rhythm\tI'm A Hundred Percent For You\tVictor\t24863\t87082-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic87082-3.mp3\t\"fats\" Waller And His Rhythm\tI'm A Hundred Percent For You\tVictor\t24867\t87082-3\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_112.mp3\tBenny Goodman And His Orchestra Feat. Helen Ward\tI'm A Hundred Percent For You\tCOLUMBIA\t2988 D\t16364\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79443-3.mp3\tMarion Harris\tI'm A Jazz Vampire\tCOLUMBIA\tA-3328\t79443-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_094.mp3\tMarion Harris\tI'm A Jazz Vampire\tCOLUMBIA\tA-3328\t79443-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe73027-B.mp3\tClarence Williams Blue Five\tI'm A Little Blackbird Looking For A Bluebird\tOKeh\t40260\t73027-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_243.mp3\tTwo-ton Baker And His Music Makers\tI'm A Lonely Petunia (in An Onion Patch)\tMERCURY\t5066\t959\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_040.mp3\tFrank Crumit\tI'm A Lonesome Little Raindrop\tCOLUMBIA\tA-3332\t79460-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP208x.mp3\tKing Cole Trio\tI'm A Shy Guy\tCAPITOL\t208\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC70912-3.mp3\tFrank Crumit\tI'm A Specialist\tVICTOR\t22859\t70912-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/CONDAL378-1.mp3\tRobert Johnson\tI'm A Steady Rollin' Man\tCONQUEROR\t8973\tDAL378-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_038.mp3\tByron G. Harlan\tI'm A Twelve O'clock Fellow In A Nine O'clock Town\tCOLUMBIA\tA-2219\t47369-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_124.mp3\tArthur Collins And Byron Harlan\tI'm A-dreamin' Of You\tCOLUMBIA\t399\t3326\t1910\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03767-2.mp3\tBilly Murray\tI'm Afraid To Come Home In The Dark\tCOLUMBIA\tA-0423\t03767-2\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_031.mp3\tBilly Murray\tI'm Afraid To Come Home In The Dark\tCOLUMBIA\tA-0423\t03767-2\t1908\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67113.mp3\tLouis Jordan & His Tympani 5\tI'm Alabama Bound\tDECCA\t7723\t67113\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S3138.mp3\tBob Wills And His Texas Playboys\tI'm All Alone\tMGM\t11288\t51S3138\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC27180-5.mp3\tGreat Whiteway Orch\tI'm All Alone\tVICTOR\t18992B\t27180-5\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/COL77572.mp3\tAl Jolson\tI'm All Bound Round With The Mason Dixon Line\tCOLUMBIA\tA-2478\t77572\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_007.mp3\tAl Jolson\tI'm All Bound Round With The Mason Dixon Line\tCOLUMBIA\tA-2478\t77572\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_087.mp3\tTed Lewis And His Band\tI'm All Dressed Up With A Broken Heart\tCOLUMBIA\t2492 D\tW151662-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS28617-1.mp3\tBillie Holiday & Her Orch\tI'm All For You\tCBS\toK5831\t28617-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22606-B.mp3\tLeo Reisman And His Orch\tI'm Alone Because I Love Yo\tVictor\t22606-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D266B1.mp3\tJimmie Lunceford And His Orchestra\tI'm Alone With You\tV-DISC\t266B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Col25750-1.mp3\tJimmie Lunceford And His Orchestra\tI'm Alone With You\tColumbia\t35484\t25750-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22181-3.mp3\tCharles Harrison\tI'm Always Chasing Rainbows\tVICTOR\t18496\t22181-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3982.mp3\tDick Haymes & Helen Forrest\tI'm Always Chasing Rainbows\tDECCA\t23472\tL3982\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_003.mp3\tCharles Harrison\tI'm Always Chasing Rainbows\tVICTOR\t18496\t22181-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_056.mp3\tPerry Como Feat. Russell Case's Orchestra And The Satisfiers\tI'm Always Chasing Rainbows\tVICTOR\t1788\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_054.mp3\tHarry Fox Feat. O/charles Prince\tI'm Always Chasing Rainbows\tCOLUMBIA\tA-2557\t77772\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013348.mp3\tFats Waller And His Rhythm\tI'm Always In The Mood For Love\tVICTOR\t25671\t013348\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM607-1.mp3\tCab Calloway & His Orch\tI'm Always In The Mood For You\tVARIETY\tI643\tM607-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_107.mp3\tFanny Brice Feat. D/rosario Bourdon\tI'm An Indian\tVICTOR\t45303\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/CON19211-3.mp3\tChick Bullock's Levee Loungers\tI'm An Old Cowhand\tCONQUEROR\t8708\t19211-3\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA442-A.mp3\tBing Crosby And Jimmy Dorsey Or.\tI'm An Old Cowhand\tDECCA\t871A\tDLA442-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_030.mp3\tBing Crosby\tI'm An Old Cowhand\tDECCA\t11008\tDLA442-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19442-1.mp3\tFrankie Trumbauer's Orch\tI'm An Old Cowhand (v J T)\tBRUNSWICK\t7687\t19442-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151664.mp3\tTed Wallace And His Campus Boys\tI'm An Unemployed Sweetheart\tCOLUMBIA\t2493\tW151664\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151671-3.mp3\tLee Morse And Her Bluegrass Boys\tI'm An Unemployed Sweetheart\tCOLUMBIA\t2497\tW151671-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC0341-1.mp3\tFats Waller And His Rhythm\tI'm At The Mercy Of Love\tVICTOR\t25409B\t0341-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_031.mp3\tAda Jones And Billy Murray\tI'm Awfully Glad I Met You\tVICTOR\t16346B\tB8014-1\t1909\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC38179-3.mp3\tAileen Stanley\tI'm Back In Love Again\tVICTOR\t20643B\t38179-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC72746.mp3\tElla Fitzgerald And Ink Spots\tI'm Beginning To See The Light\tDECCA\t23399\t72746\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP14238.mp3\tHarry James & His Orchestra\tI'm Beginning To See The Light\tCAPITOL\t\t14238\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_060.mp3\tElla Fitzgerald And Ink Spots\tI'm Beginning To See The Light\tDECCA\t23399\t72746\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_010.mp3\tHarry James And His Orchestra\tI'm Beginning To See The Light\tCAPITOL\t\t14238\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_064.mp3\tDuke Ellington And His Famous Orchestra Feat. V/joya Sherrill\tI'm Beginning To See The Light\tVictor\t1618\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D663.mp3\tArt Tatum\tI'm Beginning To See The Light - 9:20 Special\tV-DISC\t663\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4898.mp3\tErnest Tubb Texas Troubadors\tI'm Bitin' My Fingernails\tDECCA\t24592\tL4898\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_304.mp3\tAndrews Sisters And Ernest Tubb\tI'm Bitin' My Fingernails And Thinking Of You\tDECCA\t24592\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC48437-3.mp3\tGeorge Olsen And His Music\tI'm Bringing A Red Red Rose (vbb) ('whoopee')\tVICTOR\t21808A\t48437-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_176.mp3\tRuth Etting\tI'm Bringing A Red, Red Rose\tCOLUMBIA\t1680 D\tW147710-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1745.mp3\tBing Crosby - J.s.trotter Orch\tI'm Building A Sailboat Of Dreams\tDECCA\t2447A\tDLA1745\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1094.mp3\tFred Astaire W J.green\tI'm Building Up To An Awful Let Down\tBRUNSWICK\t7610\tLA1094\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_057.mp3\tFred Astaire\tI'm Building Up To An Awful Let-down\tCOLUMBIA\t3118 D\tLA1094\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh017.mp3\tHenry Hall And The Bbc Dance Orchestra\tI'm Building Up To An Awful Letdown\tBBC broadcast\t\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147013-2.mp3\tIrene Gibbons W C.williams Jb\tI'm Busy And You Can't Come In\tCOLUMBIA\t14362 D\tW147013-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Oke71984-B.mp3\tSara Martin - Clarence Williams\tI'm Cert'ny Gonna See Bout That\tOkeh\t8108\t71984-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWM1039.mp3\tDuke Ellington And Famous Orch\tI'm Checkin' Out, Goom Bye\tCOLUMBIA\t35208\tWM1039\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke40843.mp3\tFrankie Trumbauer & His Orchestra\tI'm Comin' Home Virginia\tOkeh\t40843\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE81083-B.mp3\tFrankie Trumbauer And His Orch\tI'm Comin' Virginia\tOKeh\t40843\t81083-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64616.mp3\tPaul Whiteman's Swing Wing\tI'm Comin', Virginia\tDECCA\t3943A\t64616\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21473-1.mp3\tMaxine Sullivan And Her Orchestra\tI'm Coming Virgina\tVocalion\t3654\t21473-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144133-3.mp3\tFletcher Henderson & His Orch\tI'm Coming Virginia\tCOLUMBIA\t1059 D\tW144133-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/COLZSP5555.mp3\tBenny Goodman\tI'm Coming Virginia\tCOLUMBIA\t39307\tZSP5555\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480633.mp3\tBenny Goodman & Company\tI'm Coming Virginia\tColumbia\tSL160\t\t1938\tCarnegie Hall Concert:<br>Bobby Hackett (co), Vernon Brown (tb), Benny Goodman (cl), Babe Russin (ts), Jess Stacy (p), Allen Reuss (g),  Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DEC60231.mp3\tBunny Berigan & His Blue Boys\tI'm Coming, Virginia\tDECCA\t18116\t60231\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66673.mp3\tWoody Herman & His Orchestra\tI'm Coming, Virginia\tDECCA\t2817A\t66673\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/SwiOSW-4-1.mp3\tBenny Carter And His Orchestra\tI'm Coming, Virginia\tSwing\t20\tOSW-4-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/CBS26356.mp3\tBenny Goodman Sextet\tI'm Confessin\tCBS\t(Reject)\t26356\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEW404405.mp3\tLouis Armstrong & His Orch\tI'm Confessin'\tOKEH\t6892\tW404405\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP1079.mp3\tLouis Armstrong Vdisc Allstars\tI'm Confessin' That I Love You\tV-DISC\t491\tVP1079\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC84013-1.mp3\tPaul Whiteman & His Orch\tI'm Counting On You\tVICTOR\t24705\t84013-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN528b.mp3\tHank Penny\tI'm Counting The Days\tKING\t528\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_039.mp3\tArthur Collins And Byron Harlan\tI'm Crazy 'bout It!\tVICTOR\t4850\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10484-3-4.mp3\tCab Calloway & His Orchestra\tI'm Crazy 'bout My Baby\tBANNER\t32185\t10484-3-4\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC102400-1.mp3\tFats Waller And His Rhythm\tI'm Crazy 'bout My Baby\tVICTOR\t25374\t102400-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BruE-36103-A.mp3\tKing Oliver And His Orchestra\tI'm Crazy 'bout My Baby\tBrunswick\t6065\tE-36103-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic102400-1.mp3\t\"fats\" Waller And His Rhythm\tI'm Crazy 'bout My Baby\tVictor\t25374\t102400-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/MelE-36454-A.mp3\tConnie's Inn Orchestra\tI'm Crazy 'bout My Baby\tMelotone\tM-12145\tE-36454-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Col151417-3.mp3\tThomas \"fats\" Waller And His Hot Piano\tI'm Crazy 'bout My Baby (and My Baby Is Crazy 'bout Me)\tColumbia\t14593-D\t151417-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Col151396-1.mp3\tTed Lewis And His Band\tI'm Crazy 'bout My Baby (and My Baby's Crazy 'bout Me)\tColumbia\t2428-D\t151396-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3315.mp3\tUna Mae Carlisle W Orch\tI'm Crazy 'bout My Baby.\tSAVOY\t617B\tS3315\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_106.mp3\tAvon Comedy Four\tI'm Crazy Over Every Girl In France\tCOLUMBIA\tA-2399\t77333-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/AJA31528.mp3\tFletcher Henderson Sawin' Six\tI'm Crazy Over You\tAJAX\tAJX17030\t31528\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42531.mp3\tSarah Vaughan\tI'm Crazy To Love You\tCOLUMBIA\t38701\tCO42531\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_283.mp3\tSarah Vaughan\tI'm Crazy To Love You\tCOLUMBIA\t38701\tCO42531\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_042.mp3\tAda Jones And Billy Murray\tI'm Crying Just For You\tVICTOR\t17562\t14523-3\t1914\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14063A.mp3\tFreddy Martin And His Orch\tI'm Dancin' On A Rainbow\tBRUNSWICK\t6659\t14063A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_0527_02.mp3\tLee Morse And Her Bluegrass Boys\tI'm Doing What I'm Doing For Love\tColumbia\t1866DB\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142844.mp3\tArt Gillam\tI'm Drifting Back To Dreamland\tCOLUMBIA\t955 D\tW142844\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150666.mp3\tArt Gillam\tI'm Drifting Back To Dreamland\tCOLUMBIA\t2291\tW150666\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC19150-B.mp3\tHelen Clark-lewis James\tI'm Drifting Back To Dreamland\tVICTOR\t19150\t19150-B\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL556.mp3\tLee O'daniel Hillbilly Boys\tI'm Drifting Back To Dreamland\tVOCALION\t4244\tDAL556\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC4339B.mp3\tBing Crosby\tI'm Drifting Back To Dreamland\tDECCA\t4339B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-5767-.mp3\tJimmie Noone's Apex Club Orchestra\tI'm Drifting Back To Dreamland\tVocalion \t1506\tC-5767-\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2346-A.mp3\tCount Basie And His Orch\tI'm Drownin' In Your Deep B\tRCA Victor\t20-2346-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2346-A.mp3\tCount Basie And His Orchestra\tI'm Drowning In Your Deep Blue Eyes\tRCA\t20-2346\tD7VB654-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73754.mp3\tAndy Kirk\tI'm Falling For You\tDECCA\t24139\t73754\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S262.mp3\tBilly Eckstine\tI'm Falling For You\tMGM\t30374\t47S262\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu055177-1.mp3\tEarl Hines And His Orchestra\tI'm Falling For You\tBluebird\tB-11065\t055177-1\t1940\tHarry \"Pee Wee\" Jackson, Rostelle Reese, Leroy White (tp) Joe McLewis, John Ewing, Edward Fant (tb) Leroy Harris, Scoops Carey (as) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck Parham (b) Alvin Burroughs (d) Billy Eckstine, Madeline Greene (vcl) The Three Varieties (vcl trio\nhttp://www.jazz-on-line.com/a/mp3d/Dec73754.mp3\tAndy Kirk And His Orchestra\tI'm Falling For You\tDecca\t24139\t73754\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1625.mp3\tBing Crosby & Frances Langford\tI'm Falling In Love With Love\tDECCA\t2316A\tDLA1625\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64174x.mp3\tJohn Mccormack\tI'm Falling In Love With Someone\tVICTOR\t64174\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_003.mp3\tJohn Mccormack\tI'm Falling In Love With Someone\tVICTOR\t64174\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_062.mp3\tNelson Eddy Feat. Nat Shilkret (director)\tI'm Falling In Love With Someone\tVictor\t4280\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU010209.mp3\tTeddy Hill And His Orch\tI'm Feelin Like A Million\tBLUEBIRD\t7013\t010209\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC59760-2.mp3\tFess Williams Royal Flush Orch\tI'm Feelin' Devilish\tVICTOR\t38131\t59760-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Har145977-2.mp3\tThe Dixie Stompers\tI'm Feelin' Devilish (oh By Golly Oh)\tHarmony\t974-H\t145977-2  \t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/SIGT19004.mp3\tDickie Wells & His Orch\tI'm Fer It Too\tSIGNATURE\t90002A\tT19004\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_0227_02.mp3\tLee Morse\tI'm Following You\tColumbia\t2136DB\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_136.mp3\tHigh Hatters\tI'm Following You\tVICTOR\t22218\t57137-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe403583-A.mp3\tArthur Schutt And His Orchestra\tI'm Following You (vsb)\tOKeh\t41360\t403583-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC22600-5.mp3\tCharles Hart - Elliott Shaw\tI'm Forever Blowing Bubbles\tVICTOR\t18540\t22600-5\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB5553.mp3\tGene Krupa's Chicago Jazz Band\tI'm Forever Blowing Bubbles\tRCA\t20-3965\tE0VB5553\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83569.mp3\tCharlie Ventura Septet\tI'm Forever Blowing Bubbles\tDECCA\t29138\t83569\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78263.mp3\tAl Campbell & Henry Burr\tI'm Forever Blowing Bubbles\tCOLUMBIA\tA-2701\t78263\t1919\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D316A1.mp3\tJune Hutton And The Pied Pipers\tI'm Forever Blowing Bubbles\tV-DISC\t316A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC76426.mp3\tArtie Shaw And Gordon Jenkins Orchestra\tI'm Forever Blowing Bubbles\tDECCA\t27186\t76426\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_120.mp3\tHelen Clark And George Wilton Ballard\tI'm Forever Blowing Bubbles\tEDISON\tBA 3798\t6679\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_008.mp3\tHenry Burr And Albert Campbell\tI'm Forever Blowing Bubbles\tColumbia\t2701\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC76141-1.mp3\tJimmie Rodgers\tI'm Free\tVICTOR\t23830\t76141-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/DECC91535.mp3\tBob Crosby & His Orch\tI'm Free (what's New)\tDECCA\t2205A\tC91535\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70470.mp3\tElla Fitzgerald & Four Keys\tI'm Gettin' Mighty Lonesome\tDECCA\t4315A\t70470\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC68941-1.mp3\tBlanche Calloway & Her Orch\tI'm Gettin' Myself Ready For You\tVICTOR\t22659\t68941-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB12363-B.mp3\tDorsey Brothers Orchestra\tI'm Gettin' Sentimental Over You\tCOLUMBIA\t36065\tB12363-B\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66752-B.mp3\tInk Spots\tI'm Gettin' Sentimental Over You\tDECCA\t3077A\t66752-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic2715.mp3\tTommy Dorsey & His Orchestra\tI'm Gettin' Sentimental Over You\tVictor\t2715\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_331.mp3\tInk Spots\tI'm Gettin' Sentimental Over You\tDECCA\t3077A\t66752-B\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC38304-A.mp3\tDorsey Brothers Orchestra\tI'm Gettin' Sentimental Over You (vbc)\tDECCA\t115A\t38304-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec66877-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tI'm Getting Nowhere With You\tDecca\t2957\t66877-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU12363.mp3\tBing Crosby W Dorsey Brothers\tI'm Getting Sentimental Over You\tBRUNSWICK\t6409\t12363\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VARUS1008-1.mp3\tRoy Eldridge And His Orch\tI'm Getting Sentimental Over You\tVARSITY\t8107\tUS1008-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC95145-3.mp3\tTommy Dorsey And His Orch\tI'm Getting Sentimental Over You\tVICTOR\t25236\t95145-3\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA95145-3.mp3\tTommy Dorsey And His Orch\tI'm Getting Sentimental Over You\tVICTOR\t27518\t95145-3\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL6816.mp3\tTommy Dorsey And His Orchestra\tI'm Getting Sentimental Over You\tDECCA\t28684\tL6816\t\t\nhttp://www.jazz-on-line.com/a/mp3e/ARC15884-1-2.mp3\tModernists (b. Goodman)\tI'm Getting Sentimental Over You\tARC\tBA33192\t15884-1-2\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_118.mp3\tTommy Dorsey And His Orchestra\tI'm Getting Sentimental Over You\tDECCA\t28684\tL6816\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN9120-C.mp3\tSioux City Six\tI'm Glad\tGENNETT\t5569\t9120-C\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62135-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tI'm Glad For Your Sake (but I'm Sorry For Mine)\tDecca\t1531\t62135-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPplimgiwfy.mp3\tPeggy Lee\tI'm Glad I Waited For You\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_045.mp3\tBilly Murray\tI'm Glad I'm Married\tVICTOR\t16766\tB6384-2\t1908\t\nhttp://www.jazz-on-line.com/a/mp3c/CROBL12.mp3\tMildred Bailey\tI'm Glad There Is You\tCROWN\t106\tBL12\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23551IG.mp3\tHazel Scott\tI'm Glad There Is You\tDECCA\t23551\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_013.mp3\tAl Jolson\tI'm Goin' South\tCOLUMBIA\t61D\t81423\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC56303.mp3\tFrank Stokes\tI'm Going Away Blues\tVICTOR\t23341\t56303\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/Gen11386-C.mp3\tKing Oliver's Creole Jazz Band\tI'm Going Away To Wear You Off My Mind\tGennetr\t5134\t11386-C\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_101.mp3\tArthur Collins And Byron Harlan\tI'm Going Back To Dixie\tCOLUMBIA\t1112\t19679\t1912\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4874.mp3\tBill Monroe Bluegrass Boys\tI'm Going Back To Old Kentucky\tCOLUMBIA\t20612\tCCO4874\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC92050.mp3\tBuddy Jones\tI'm Going Back To Sadie\tDECCA\t5861\tC92050\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81455-1.mp3\tPaul Specht And His Hotel Alamac Orchestra\tI'm Going South\tColumbia\t60-D\t81455-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC29131-4.mp3\tPaul Whiteman & His Orch\tI'm Going South\tVICTOR\t19229\t29131-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_139.mp3\tHenry Burr And Elizabeth Spencer\tI'm Going To Follow The Boys\tVictor\t18433\t21291-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/COL77550.mp3\tAl Campbell & Henry Burr\tI'm Going To Follow The Boys\tCOLUMBIA\tA-2479\t77550\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLNO2015.mp3\tShirley And Lee\tI'm Gone\tALLADDIN\t3153\tNO2015\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN672.mp3\tHank Penny\tI'm Gonna Change Things\tKING\t672\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC33251-2.mp3\tRevelers\tI'm Gonna Charleston Back To Charleston\tVICTOR\t19778\t33251-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC32768-4.mp3\tCoon-sanders Nighthawk Orch\tI'm Gonna Charleston Back To Charleston\tVICTOR\t19727\t32768-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19727i.mp3\tCoon Sanders Original Nighthawk Orchestra\tI'm Gonna Charleston Back To Charleston\tVictor\t19727\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR144495-2.mp3\tNight Club Orch (reser)\tI'm Gonna Dance Wit De Guy Wot Brung Me (vts)\tHARMONY\t473-H\t144495-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe09730-A.mp3\tLouis Armstrong's Hot Five\tI'm Gonna Gitcha\tOKeh\t8343\t09730-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D306A.mp3\tPatsy Kelly And Barry Wood\tI'm Gonna Hang My Hat On That Tree That Grows In Brooklyn\tV-DISC\t306A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC82015.mp3\tBuddy Johnson And His Orch.\tI'm Gonna Jump In The River\tDECCA\t27947\t82015\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU20694-1.mp3\tBunny Berigan & His Boys\tI'm Gonna Kiss Myself Goodbye\tBRUNSWICK\t7847\t20694-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_315.mp3\tNat ''king'' Cole\tI'm Gonna Laugh You Right Out Of My Life\tCapitol\t3305\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42744.mp3\tTed Daffan's Texans\tI'm Gonna Leave This Darned Old Town\tCOLUMBIA\t20679\tCO42744\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU074648.mp3\tBill 'jazz' Gillum\tI'm Gonna Leave You On The Outskirts Of Town\tBLUEBIRD\t9042\t074648\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71128.mp3\tLouis Jordan & His Tympani 5\tI'm Gonna Leave You On The Outskirts Of Town\tDECCA\t8638\t71128\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/MER3812-C.mp3\tFrankie Laine W Harry Geller\tI'm Gonna Live Til I Die (vconlon Singers)\tMERCURY\t1206\t3812-C\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23154-1.mp3\tBillie Holiday & Her Orch\tI'm Gonna Lock My Heart\tCBS\tVO4238\t23154-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_128.mp3\tHenry Busse And His Orchestra\tI'm Gonna Lock My Heart\tDecca\t1924\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_040.mp3\tPerry Como Feat. Russell Case's Orchestra\tI'm Gonna Love That Gal\tVICTOR\t1676\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DCO35013.mp3\tBenny Goodman And His Orchestra.\tI'm Gonna Love That Guy\tV-DISC\t535\tCO35013\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_128.mp3\tBenny Goodman And His Orchestra Feat. Dottie Reid\tI'm Gonna Love That Guy\tCOLUMBIA\t36843\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/RCA20-6400y.mp3\tAmes Brothers\tI'm Gonna Love You\tRCA\t20-6400\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_451.mp3\tAmes Brothers\tI'm Gonna Love You\tRCA\t6400\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC18318-1.mp3\tMarion Harris\tI'm Gonna Make Hay While The Sun Shines\tVICTOR\t18143\t18318-1\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_106.mp3\tMarion Harris\tI'm Gonna Make Hay While The Sun Shines In Virginia\tVICTOR\t18143\t18318-1\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20471-By.mp3\tJean Goldkette And His Orch\tI'm Gonna Meet My Sweetie Now\tVictor\t20471-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC37583-2.mp3\tJean Goldkette And His Orch\tI'm Gonna Meet My Sweetie Now\tVICTOR\t20675B\t37583-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37796-2.mp3\tJane Green\tI'm Gonna Meet My Sweetie Now\tVICTOR\t20509\t37796-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_245.mp3\tJean Goldkette And His Orchestra\tI'm Gonna Meet My Sweetie Now\tVICTOR\t20675B\t37583-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93824.mp3\tLouis Jordan & His Tympani 5\tI'm Gonna Move To The Outskirts Of Town\tDECCA\t8593\tC93824\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70655-A.mp3\tJimmie Lunceford And His Orchestra\tI'm Gonna Move To The Outskirts Of Town - Part 1\tDecca\t18324\t70655-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70656-A.mp3\tJimmie Lunceford And His Orchestra\tI'm Gonna Move To The Outskirts Of Town - Part 2\tDecca\t18324\t70656-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24998x.mp3\tAndrews Sisters\tI'm Gonna Paper All My Wall\tDecca\t24998\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC22113-1.mp3\tPeerless Qt\tI'm Gonna Pin My Medal On The Girl I Left Behind\tVICTOR\t18486\t22113-1\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC349-3-.mp3\tTom Glazer\tI'm Gonna Put My Name Down\tASCH\t349-3\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010650-1.mp3\tFats Waller And His Rhythm\tI'm Gonna Put You In Your Place\tVICTOR\t25608\t010650-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79567-2.mp3\tBert Williams\tI'm Gonna Quit Saturday\tCOLUMBIA\tA-3356\t79567-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9847-A.mp3\tRichard M Jones Jazz Wizards\tI'm Gonna Run You Down\tDECCA\t7064\tC9847-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057084.mp3\tFats Waller And His Rhythm\tI'm Gonna Salt Away Some Sugar\tBLUEBIRD\t10943\t057084\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_178.mp3\tJohnny Mercer\tI'm Gonna See My Baby\tCapitol\t183\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72655.mp3\tJimmie Lunceford And His Orchestra\tI'm Gonna See My Baby\tDecca\t18655\t72655\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/AJA31021-2.mp3\tFletcher Henderson Sawin' Six\tI'm Gonna See You\tAJAX\tAJX17017\t31021-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC60302.mp3\tBoswell Sisters\tI'm Gonna Sit Right Down & Write Myself A Letter\tDECCA\t671B\t60302\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC25044.mp3\tFats Waller And His Rhythm\tI'm Gonna Sit Right Down And W\tVICTOR\t25044\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC89764.mp3\tFats Waller And His Rhythm\tI'm Gonna Sit Right Down And Write Myself A Letter\tVICTOR\t25044\t89764\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S667.mp3\tSarah Vaughan W Ted Dale\tI'm Gonna Sit Right Down And Write Myself A Letter\tMGM\t10890A\t48S667\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic89764-1.mp3\t\"fats\" Waller And His Rhythm\tI'm Gonna Sit Right Down And Write Myself A Letter\tVictor\t25044\t89764-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_045.mp3\tBoswell Sisters\tI'm Gonna Sit Right Down And Write Myself A Letter\tDECCA\t671B\t60302\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72313.mp3\tJames Pete Johnson\tI'm Gonna Sit Right Down And Write Myself...\tDECCA\t23595\t72313\t1944\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru2743i.mp3\tAl Jolson\tI'm Gonna Tramp, Tramp, Tramp\tBrunswick\t2743\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/PatCPT-2147-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tI'm Gonna Wash My Hands Of You\tPath\tPA-668\tCPT-2147-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh030.mp3\tAmbrose And His Orchestra\tI'm Gonna Wash My Hands Of You (v. Elsie Carlisle & Sam Browne)\tDecca\tF-5318\tGB-6777-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74863.mp3\tElla Fitzgerald / G.jenkins\tI'm Gonna Wash That Man Right Out Of My Hair\tDECCA\t24639\t74863\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO35013.mp3\tBenny Goodman And His Orchestra\tI'm Gonna' Love That Guy (vd.reed)\tCOLUMBIA\t36843\tCO35013\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLC4226-1.mp3\tCount Basie & His Orch.\tI'm Gonna' Move To The Outskirts Of Town\tCOLUMBIA\t36601\tC4226-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_086.mp3\tRuth Etting\tI'm Good For Nothing But Love\tCOLUMBIA\t2505\tW151688-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102006.mp3\tWillie Bryant & His Orch\tI'm Grateful To You\tBLUEBIRD\t6436\t102006\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC84924.mp3\tFats Waller And His Rhythm\tI'm Growing Fonder Of You\tVICTOR\t24801\t84924\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/COLC823.mp3\tTed Weems & His Orch\tI'm Growing Fonder Of You\tCOLUMBIA\t2975 D\tC823\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84924-1.mp3\t\"fats Waller And His Rhythm\tI'm Growing Fonder Of You\tVictor\t24801\t84924-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC036053-9.mp3\tMaxine Sullivan\tI'm Happy About The Whole Thing\tVICTOR\t26237\t036053-9\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/MONV-5330.mp3\tBilly Murray And Haydn Qt\tI'm Happy When The Band Plays Dixie\tMONARCH\tV-5330\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_091.mp3\tBilly Murray And Haydn Quartet\tI'm Happy When The Band Plays Dixie\tVictor\t5330\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC010166.mp3\tBunny Berigan & His Orch\tI'm Happy, Darling, Dancing With You\tVICTOR\t25587B\t010166\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO31402.mp3\tBenny Goodman And His Orchestra\tI'm Here\tCOLUMBIA\t36411\tCO31402-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/Mon102640-1.mp3\tBlue Sky Boys\tI'm Here To Get My Baby Out Of Jail\tMontgomeryWard\t7017\t102640-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/BRULA181.mp3\tBing Crosby W I.aaronson Orch\tI'm Hummin' - I'm Whistlin' - I'm Singin'\tBRUNSWICK\t6953\tLA181\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruLA181-A.mp3\tIrving Aaronson And His Commanders With Bing Crosby\tI'm Hummin', I'm Whistlin', I'm Singin'\tBrunswick\t6953\tLA181-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruLA181-B.mp3\tIrving Aaronson And His Commanders With Bing Crosby\tI'm Hummin', I'm Whistlin', I'm Singin'\tBrunswick\t\tLA181-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80342.mp3\tEddie Cantor\tI'm Hungry For Beautiful Girls\tCOLUMBIA\tA-3624\t80342\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03084.mp3\tTommy Dorsey & His Orch\tI'm In A Dancing Mood\tVICTOR\t25476\t03084\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_082.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tI'm In A Dancing Mood\tVICTOR\t25476\t03084\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Cor72659.mp3\tJimmie Lunceford And His Orchestra\tI'm In A Jam With Baby\tCoral\t60041\t72659\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30457.mp3\tBillie Holiday\tI'm In A Low Down Groove\tOKEH\t6451\t30457\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047798.mp3\tHarlan Leonard & His Rockets\tI'm In A Weary Mood\tBLUEBIRD\t10736\t047798\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke25752-1.mp3\tJimmie Lunceford And His Orchestra\tI'm In An Awful Mood\tOkeh\t5395\t25752-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79341.mp3\tHenry Burr (tenor)\tI'm In Heaven When I'm In My Mammy's Arms\tCOLUMBIA\tA-2978\t79341\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_139.mp3\tHenry Burr\tI'm In Heaven When I'm In My Mother's Arms\tColumbia\t2978\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU15736-A.mp3\tAbe Lyman & His Californians\tI'm In Love (v Lou Rapp)\tBRUNSWICK\t6968\t15736-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-4148x.mp3\tHenri Rene\tI'm In Love Again\tRCA\t20-4148\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/IMP5386IIA.mp3\tFats Domino\tI'm In Love Again\tIMPERIAL\t5386\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC27635x.mp3\tAndrews Sisters\tI'm In Love Again\tDECCA\t27635\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_242.mp3\tAndrews Sisters\tI'm In Love Again\tDECCA\t27635\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_231.mp3\tFontane Sisters\tI'm In Love Again\tDot\t15462\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_027.mp3\tFats Domino\tI'm In Love Again\tImperial\t5386 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC17259-2.mp3\tWingy Manone & His Orchestra\tI'm In Love All Over Again\tVOCALION\t2933\t17259-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh782A.mp3\tKen Snakehips Johnson And His West Indian Orchestra\tI'm In Love For The Last Time (v Pat Oregan\tHMV\tBD-5559\tOEA-8470-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1986.mp3\tDorothy Shay\tI'm In Love With A Married Man\tCOLUMBIA\t37192\tHCO1986\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/HITT398.mp3\tArt Kassel And Kassels-in-air\tI'm In Love With Someone (vjf)\tHIT OF THE WEEK\t7090b\tT398\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1627.mp3\tHarry James & His Orch\tI'm In Love With Two Sweethearts\tCOLUMBIA\t36933\tHCO1627\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW140880.mp3\tCalifornia Ramblers\tI'm In Love With You\tCOLUMBIA\t449D\tW140880\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_313.mp3\tPat Boone\tI'm In Love With You\tDot\t15472\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0216_03.mp3\tLee Morse\tI'm In Love With You Thats Why\tPerfect\t11609A\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148183-3.mp3\tPaul Whiteman & His Orch\tI'm In Seventh Heaven\tCOLUMBIA\t1877 D\tW148183-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULAE446.mp3\tAl Jolson W Orch\tI'm In Seventh Heaven\tBRUNSWICK\t4400\tLAE446\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401846-B.mp3\tJoe Venuti's New Yorkers\tI'm In Seventh Heaven (v S B)\tOKeh\t41263\t401846-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC54592-2.mp3\tGeorge Olsen & His Music\tI'm In The Market For You\tVICTOR\t22391A\t54592-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COL195093-1.mp3\tBen Selvin's Orch\tI'm In The Market For You\tCOLUMBIA\t4094X\t195093-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404404-C.mp3\tLouis Armstrong Sebastian Orch\tI'm In The Market For You\tOKeh\t41442\t404404-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh059.mp3\tVan Phillips And His Band\tI'm In The Market For You (v Sam Browne)\tColumbia\tCB-67\tWA-10323-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COL17745-3.mp3\tLittle Jack Little And His Orch\tI'm In The Mood For Love\tCOLUMBIA\t3069 D\t17745-3\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC69.mp3\tBilly Eckstine & His Orch\tI'm In The Mood For Love\tNATIONAL\t\tNSC69\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER3377.mp3\tFrankie Laine\tI'm In The Mood For Love\tMERCURY\t1178\t3377\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92591.mp3\tPaul Whiteman & His Orch\tI'm In The Mood For Love\tVICTOR\t25091\t92591\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60021-F.mp3\tLouis Armstrong & His Orch.\tI'm In The Mood For Love\tDECCA\t3796B\t60021-F\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1069.mp3\tFrances Langford\tI'm In The Mood For Love\tBRUNSWICK\t7513\tLA1069\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1027.mp3\tKing Cole Trio\tI'm In The Mood For Love\tCAPITOL\t\t1027\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5739.mp3\tJohnny Guarnieri Trio\tI'm In The Mood For Love\tSAVOY\t554A\tS5739\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/OKECO49003.mp3\tBuck Clayton-marlow Morris 3\tI'm In The Mood For Love\tOKEH\t6968\tCO49003\t1953\t\nhttp://www.jazz-on-line.com/a/mp3o/KEYKHL11.mp3\tColeman Hawkins Qt\tI'm In The Mood For Love\tKEYNOTE\t610\tKHL11\t1944\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColD-3069.mp3\tLittle Jack Little & His Orch.\tI'm In The Mood For Love\tColumbia\tD-3069\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_216.mp3\tFrances Langford\tI'm In The Mood For Love\tBRUNSWICK\t7513\tLA1069\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_052.mp3\tLouis Armstrong\tI'm In The Mood For Love\tDECCA\t579A\t60021-F\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/RexRK-8.mp3\tErroll Garner Trio\tI'm In The Mood For Love\tRex\tJ502\tRK-8\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_165.mp3\tBilly Eckstine\tI'm In The Mood For Love\tNATIONAL\t9016\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3l/ARC17682-1.mp3\tLeo Reisman & His Orch\tI'm In The Mood For Love (vf.luther)\tARC\tBR7482\t17682-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC024065-1.mp3\tLionel Hampton And His Orch\tI'm In The Mood For Swing\tVICTOR\t26011\t024065-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VocS-143-2.mp3\tThe Chocolate Dandies\tI'm In The Mood For Swing\tVocalion\tS-69\tS-143-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic024065-1.mp3\tLionel Hampton And His Orchestra\tI'm In The Mood For Swing\tVictor\t26011\t024065-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC80700.mp3\tBuddy Johnson And His Orch.\tI'm In Your Power\tDECCA\t27711\t80700\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63695-A.mp3\tChick Webb & His Orchestra\tI'm Just A Jitterbug\tDECCA\t1899A\t63695-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63695-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tI'm Just A Jitterburg\tDecca\t1899\t63695-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC73388.mp3\tElla Fitzgerald W Billy Kyle\tI'm Just A Lucky So And So\tDECCA\t18814\t73388\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1799-.mp3\tDuke Ellington And His Famous Orchestra \tI'm Just A Lucky So And So\tVictor\t20-1799-B\tD5VB949-1\t1945\tVocal refrain by Al Hibbler \nhttp://www.jazz-on-line.com/a/mp3c/COLCO48420.mp3\tFrankie Laine\tI'm Just A Poor Bachelor\tCOLUMBIA\t39903\tCO48420\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_102.mp3\tFrankie Laine\tI'm Just A Poor Bachelor\tCOLUMBIA\t39903\tCO48420\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC51108-3.mp3\tRudy Vallee Connecticut Yankee\tI'm Just A Vagabond Lover\tVICTOR\t21967\t51108-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR914-Hy.mp3\tJack Miller\tI'm Just A Vagabond Lover\tHarmony\t914-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic21967ij.mp3\tRudy Vallee\tI'm Just A Vagabond Lover\tVictor\t21967\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_047.mp3\tRudy Vallee And His Connecticut Yankees\tI'm Just A Vagabond Lover\tVICTOR\t21967\t51108-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR142240-1.mp3\tNight Club Orch (reser)\tI'm Just Wild About Animal Crackers\tHARMONY\t193-H\t142240-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM399-1.mp3\tNoble Sissle & His Orchestra\tI'm Just Wild About Harry\tVARIETY\tI552\tM399-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT559.mp3\tBud Freeman & His Orch\tI'm Just Wild About Harry\tMAJESTIC\t1031\tT559\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/GENG07925-A.mp3\tVaughn Deleath\tI'm Just Wild About Harry\tGENNETT\t4905\tG07925-A\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26707-4.mp3\tPaul Whiteman & His Orch\tI'm Just Wild About Harry\tVICTOR\t18938\t26707-4\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31923.mp3\tRed Nichols & His 5 Pennies\tI'm Just Wild About Harry\tBRUNSWICK\t6833\tE31923\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18938.mp3\tPaul Whiteman & His Orch\tI'm Just Wild About Harry\tVICTOR-\t18938\t26707-4\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_116.mp3\tVaughn Deleath\tI'm Just Wild About Harry\tGENNETT\t4905\t07925-A\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU8443.mp3\tMarion Harris With Isham Jones\tI'm Just Wild Bout Harry\tBRUNSWICK\t2309\t8443\t1922\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU2309.mp3\tMarion Harris With Isham Jones\tI'm Just Wild Bout Harry\tBRUNSWICK-\t2309\t8443\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21957-B.mp3\tHorace Heidt And His Orch\tI'm Ka-razy For You\tVictor\t21957-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87644-1.mp3\tCharlie Barnet & His Orchestra\tI'm Keeping Those Keepsakes You Gave Me (vmn)\tBLUEBIRD\t5814\t87644-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC33337-4.mp3\tGeorge Olsen & His Music\tI'm Knee Deep In Daisies (v F F-b R)\tVICTOR\t19761A\t33337-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61948-A.mp3\tLil Armstrong And Her Swing Band\tI'm Knockin' At The Cabin Door\tDecca\t1272\t61948-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63135-A.mp3\tJimmie Lunceford And His Orchestra\tI'm Laughing Up My Sleeve (ha-ha-ha-ha-ha)\tDecca\t1659\t63135-A\t1938\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3a/COLW141824.mp3\tArt Gillam\tI'm Leaving You\tCOLUMBIA\t685 D\tW141824\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17241.mp3\tLouis Prima & His Gang\tI'm Livin' In A Great Big Way\tBRUNSWICK\t7419\t17241\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-17241-1.mp3\tLouis Prima And His New Orleans Gang\tI'm Livin' In A Great Big Way\tBrunswick\t7419\tB-17241-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_1209_03.mp3\tLee Morse\tI'm Lonely\tColumbia\t1381DB\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC47224-1.mp3\tJimmie Rodgers\tI'm Lonely And Blue\tVICTOR\t40054\t47224-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/Vic57527-1.mp3\tKing Oliver And His Orchestra\tI'm Lonesome, Sweetheart\tVictor\t23029\t57527-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU21481.mp3\tNick Lucas\tI'm Looking For A Girl Named Mary\tBRUNSWICK\t3466\t21481\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59507-2.mp3\tJelly Roll Morton Hot Peppers\tI'm Looking For A Little Bluebird\tVICTOR\t23004\t59507-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/MONV-5811.mp3\tAda Jones+american Qt\tI'm Looking For A Nice Young Fellow\tMONARCH\tV-5811\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_052.mp3\tAmerican Quartet Feat. Ada Jones\tI'm Looking For A Nice Young Fellow Who Is Looking For A Nice Young Girl\tVictor\t5811\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3e/MONV-5358.mp3\tBilly Murray\tI'm Looking For The Man Who Wrote The Merry Widow\tMONARCH\tV-5358\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR350-Hx.mp3\tHarmonians\tI'm Looking Over A Four Lea\tHarmony\t350-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU21353-4.mp3\tBen Bernie And His Orch\tI'm Looking Over A Four Leaf Clover\tBRUNSWICK\t3444\t21353-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP491x.mp3\tAlvino Rey\tI'm Looking Over A Four Leaf Clover\tCAPITOL\t491\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM47S427.mp3\tArt Mooney And His Orchestra\tI'm Looking Over A Four Leaf Clover\tMGM\t10119B\t47S427\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37580-4.mp3\tJean Goldkette & His Orch\tI'm Looking Over A Four Leaf Clover\tVICTOR\t20466B\t37580-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1595.mp3\tFrankie Laine\tI'm Looking Over A Four Leaf Clover\tMERCURY\t5105\t1595\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE80343.mp3\tSam Lanin & His Orch\tI'm Looking Over A Four Leaf Clover\tOKEH\t40766\t80343\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU21305.mp3\tNick Lucas\tI'm Looking Over A Four Leaf Clover\tBRUNSWICK\t3439\t21305\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74428.mp3\tAmes Brothers\tI'm Looking Over A Four Leaf Clover\tDECCA\t24319\t74428\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO38646.mp3\tArthur Godfrey And Mariners\tI'm Looking Over A Four Leaf Clover\tCOLUMBIA\t38081\tCO38646\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_009.mp3\tArt Mooney And His Orchestra\tI'm Looking Over A Four Leaf Clover\tMGM\t10119B\t47S427\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_118.mp3\tArthur Godfrey\tI'm Looking Over A Four Leaf-clover\tCOLUMBIA\t38081\tCO38646\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_025.mp3\tBen Bernie And His Orchestra Feat. Scrappy Lambent\tI'm Looking Over A Four-leaf Clover\tBRUNSWICK\t3444\t21353-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_119.mp3\tJean Goldkette And His Orchestra Feat. Billy Murray. Vocal\tI'm Looking Over A Four-leaf Clover\tVICTOR\t20466B\t37580-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70095-A.mp3\tJimmie Lunceford And His Orchestra\tI'm Losing My Mind (because Of You)\tDecca\t4289\t70095-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH0748.mp3\tAl Dexter And His Troopers\tI'm Losing My Mind Over You\tOKEH\t6727\tH0748\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP255.mp3\tBenny Carter And His Orchestra\tI'm Lost\tCAPITOL\t165\t255\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap255-2.mp3\tBenny Carter And His Orchestra\tI'm Lost\tCapitol\t165\t255-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic22675.mp3\tAndy Sennella & His All Star Orchestra\tI'm Mad About You\tVictor\t22675\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/CONM905-1.mp3\tCab Calloway & His Orch\tI'm Madly In Love With You\tCONQUEROR\t9127\tM905-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-905-1.mp3\tCab Calloway And His Orchestra\tI'm Madly In Love With You\tVocalion\t4511\tM-905-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC72371.mp3\tElla Fitzgerald And Ink Spots\tI'm Making Believe\tDECCA\t23356\t72371\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP947.mp3\tCab Calloway & His Orch\tI'm Making Believe\tV-DISC\t259\tVP947\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D338A1.mp3\tCab Calloway And His Orchestra (dotty Salters Voc.)\tI'm Making Believe\tV-DISC\t338A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_016.mp3\tElla Fitzgerald And Ink Spots\tI'm Making Believe\tDECCA\t23356\t72371\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4301.mp3\tLionel Hampton & His Orch\tI'm Mindin' My Business\tDECCA\t23834\tL4301\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-4301-A.mp3\tLionel Hampton And His Orchestra\tI'm Mindin' My Business (and Baby, My Business Is You)\tDecca\t23834\tL-4301-A\t1946\tLionel Hampton p  vib v dir. Joe Wilder Duke Garrette Leo Shepherd Joe Morris  Wendell Culley  Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn   Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb johnny Griffin ts, Charlie Fowlkes bar, Mi\nhttp://www.jazz-on-line.com/a/mp3a/COLW142842.mp3\tArt Gillam\tI'm Missing The Kissing Of Someone\tCOLUMBIA\t1472 D\tW142842\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU77225-1.mp3\tDelmore Brothers\tI'm Mississippi Bound\tBLUEBIRD\t5653\t77225-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69521-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tI'm Misunderstood\tDecca\t4141\t69521-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69521.mp3\tAndy Kirk & Clouds Of Joy\tI'm Misunderstood (vh.wells)\tDECCA\t4141A\t69521\t1941\t\nhttp://www.jazz-on-line.com/mp3/786674737.mp3\tHank Snow\tI'm Movin' On\tRCA\t21-0328\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/HAR68682-1.mp3\tLeon Rene's Orchestra\tI'm Mr. Africa\tHARRISON\tW\t68682-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69114.mp3\tBuddy Johnson & His Band\tI'm My Baby's Baby\tDECCA\t8573B\t69114\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC69114.mp3\tBuddy Johnson And His Band\tI'm My Baby's Baby\tDECCA\t8573\t69114\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC24288x.mp3\tGuy Lombardo's Orchestra\tI'm My Own Grandpaw\tDECCA\t24288\t24288x\t\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC62684-1.mp3\tHenny Hendrickson's Louisville Serenaders\tI'm Needin'you\tVICTOR\t\t62684-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_040.mp3\tBert Williams\tI'm Neutral\tCOLUMBIA\tA-1817\t45906-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_193.mp3\tNat King Cole\tI'm Never Satisfied\tCapitol\t2212\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3h/CRO1239-1.mp3\tEubie Blake And His Orchestra\tI'm No Account Anymore (vdr)\tCROWN\t3090B\t1239-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24440.mp3\tRamona & Roy Bargy\tI'm No Angel\tVictor\t24440\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA33.mp3\tMae West\tI'm No Angel\tBRUNSWICK\t6675\tLA33\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC78265-1.mp3\tRamona & Roy Bargy\tI'm No Angel\tVICTOR\t24440\t78265-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/CON14122-1.mp3\tCharlie Barnet & His Orch\tI'm No Angel (v Helen Heath)\tCONQUEROR\t8251\t14122-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_164.mp3\tGus Arnheim And His Orchestra Feat. V/shirley Ross\tI'm No Angel (vocal Shirley Ross)\tBRUNSWICK\t6683\tLA65\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC266603X.mp3\tBea Wain\tI'm Nobody's Baby\tVICTOR\t26603\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26698.mp3\tMildred Bailey\tI'm Nobody's Baby\tCOLUMBIA\t35626\t26698\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW143562.mp3\tRuth Etting\tI'm Nobody's Baby\tCOLUMBIA\t1104 D\tW143562\t1927\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1972.mp3\tJudy Garland - Bobby Sherwood\tI'm Nobody's Baby\tDECCA\t3174B\tDLA1972\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67474.mp3\tBob Crosby & His Orch\tI'm Nobody's Baby\tDECCA\t3179A\t67474\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_102.mp3\tRuth Etting\tI'm Nobody's Baby\tCOLUMBIA\t1104 D\tW143562\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_102.mp3\tBea Wain\tI'm Nobody's Baby\tVICTOR\t26603\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_025.mp3\tJudy Garland\tI'm Nobody's Baby\tDECCA\t3174B\tDLA1972\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26716-A.mp3\tBenny Goodman & His Orch\tI'm Nobody's Baby (vocal Helen Forrest)\tCOLUMBIA\t35472\t26716-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-3433.mp3\tMarion Harris\tI'm Nobodys Baby\tCOLUMBIA-\tA-3433\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79866-2.mp3\tMarion Harris\tI'm Nobodys Baby\tCOLUMBIA\tA-3433\t79866-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66137.mp3\tElla Fitzgerald & Her Orch\tI'm Not Complainin'\tDECCA\t3005B\t66137\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE82040-B.mp3\tLouis Armstrong's Hot Five\tI'm Not Rough\tOKEH\t8551\t82040-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148745-3.mp3\tClarence Williams Jazz Kings\tI'm Not Worrying\tCOLUMBIA\t14447 D\tW148745-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11914-1.mp3\tCab Calloway And His Orchestra\tI'm Now Prepared To Tell The World It's You\tBanner\t32483\t11914-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60275-B.mp3\tJimmie Lunceford And His Orchestra\tI'm Nuts About Screwy Music.mp3\tDecca\t682\t60275-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic699.mp3\tCal Stewart\tI'm Old But I'm Awfully Tough\tVictor\t699\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC074744.mp3\tGlenn Miller & His Orch\tI'm Old Fashioned (vsn)\tVICTOR\t27953\t074744\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_173.mp3\tFred Astaire Feat. O/john Scott Trotter\tI'm Old-fashioned\tDECCA\t18490A\tL3138\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC54544-2.mp3\tGeorge Olsen & His Music\tI'm On A Diet Of Love (ves)\tVICTOR\t22259\t54544-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92998-1.mp3\tFats Waller And His Rhythm\tI'm On A See Saw\tVICTOR\t25120\t92998-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DECGB6847.mp3\tAmbrose And His Orchestra\tI'm On A See-saw\tDECCA\t467B\tGB6847\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_043.mp3\tAmbrose And His Orchestra\tI'm On A See-saw\tDECCA\t467B\tGB6847\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC042941.mp3\tLionel Hampton & His Orch\tI'm On My Way From You\tVICTOR\t26476\t042941\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic042941-1.mp3\tLionel Hampton And His Orchestra\tI'm On My Way From You\tVictor\t26476\t042941-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36342-2.mp3\tJack Smith W Piano Acc\tI'm On My Way Home\tVICTOR\t20229\t36342-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC14091-1.mp3\tHenry Burr And Al Campbell\tI'm On My Way To Mandalay\tVICTOR\t17503\t14091-1\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_003.mp3\tHenry Burr And Albert Campbell And Will Oakland\tI'm On My Way To Mandalay\tVICTOR\t17503\t14091-1\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE27905.mp3\tHarry Richman\tI'm On The Crest Of A Wave\tBRUNSWICK\t4008\tE27905\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW146541.mp3\tPaul Whiteman & His Orch\tI'm On The Crest Of A Wave\tCOLUMBIA\t1465 D\tW146541\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_227.mp3\tHarry Richman\tI'm On The Crest Of A Wave\tBRUNSWICK\t4008\tE27905\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC45640-3.mp3\tGeorge Olsen & His Music\tI'm On The Crest Of A Wave (v B B)\tVICTOR\t21500B\t45640-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1931_0116_01.mp3\tLee Morse And Her Bluegrass Boys\tI'm One Of God's Children\tColumbia\t2388DA\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142843.mp3\tArt Gillam\tI'm Only Another To You\tCOLUMBIA\t955 D\tW142843\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29252.mp3\tGinny Simms & Eddie South\tI'm Out Of Style\tOKEH\t5990\t29252\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S260.mp3\tBilly Eckstine\tI'm Out To Forget Tonight\tMGM\t10154\t47S260\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39726.mp3\tBob Howard & His Orchestra\tI'm Painting The Town Red\tDECCA\t524B\t39726\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU12856A.mp3\tBing Crosby\tI'm Playing With Fire\tBRUNSWICK\t6480\t12856A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh144.mp3\tJack Jackson And His Orchestra\tI'm Playing With Fire (v Al Bowlly)\tHMV\tB-6322\tOB-6450-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031537.mp3\tCharlie Barnet & His Orch\tI'm Prayin' Humble\tBLUEBIRD\t10119 B\t031537\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECC91534.mp3\tBob Crosby & His Orch\tI'm Praying Humble\tDECCA\t2210B\tC91534\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE26900.mp3\tBillie Holiday\tI'm Pulling Through\tOKEH\t5991\t26900\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1089-B.mp3\tFred Astaire W Johnny Green\tI'm Putting All My Eggs In One Basket\tBRUNSWICK\t7609\tLA1089-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60464.mp3\tBoswell Sisters\tI'm Putting All My Eggs In One Basket\tDECCA\t709A\t60464\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60438.mp3\tLouis Armstrong & His Orch.\tI'm Putting All My Eggs In One Basket\tDECCA\t698A\t60438\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC18657.mp3\tStuff Smith Onyx Club Boys\tI'm Putting All My Eggs In One Basket\tVOCALION\t3170\t18657\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25242.mp3\tGuy Lombardo & His Royal Canadians\tI'm Putting All My Eggs In One Basket\tVictor\t25242\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_027.mp3\tFred Astaire\tI'm Putting All My Eggs In One Basket\tBRUNSWICK\t7609\tLA1089-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_204.mp3\tJan Garber And His Orchestra\tI'm Putting All My Eggs In One Basket\tDECCA\t699A\tC90594\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13800-A.mp3\tDuke Ellington & His Orch\tI'm Satisfied\tBRUNSWICK\t6638\t13800-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_115.mp3\tDuke Ellington And His Famous Orchestra Feat. V/ivie Anderson\tI'm Satisfied\tBRUNSWICK\t6600\t13338-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142014-2.mp3\tCelestin's Tuxedo Orch\tI'm Satisfied You Love Me\tCOLUMBIA\t14200 D\tW142014-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_043.mp3\tAl Jolson\tI'm Saving Up The Means To Get To New Orleans\tCOLUMBIA\tA-2064\t46820\t1916\t\nhttp://www.jazz-on-line.com/a/mp3e/CroBL-18.mp3\tJohn Kirby And His Orchestra\tI'm Scared\tCrown\t107\tBL-18\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC18403.mp3\tWingy Manone & His Orch\tI'm Shooting High\tVOCALION\t3134\t18403\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1079.mp3\tLouis Prima's New Orleans Gang\tI'm Shooting High\tBRUNSWICK\t7586\tLA1079\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98369.mp3\tTommy Dorsey & His Orch\tI'm Shooting High\tVICTOR\t25216\t98369\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC90518-A.mp3\tJan Garber And His Orch.\tI'm Shooting High\tDECCA\t647B\tC90518-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_041.mp3\tJan Garber And His Orchestra\tI'm Shooting High\tDECCA\t647B\tC90518-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN519.mp3\tHank Penny\tI'm Singing The Blues\tKING\t519\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62063.mp3\tGlenn Miller's Orchestra\tI'm Sittin' On Top Of The World\tDECCA\t1342\t62063\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU17173.mp3\tAl Jolson W Carl Fenton Orch\tI'm Sitting On Top Of The World\tBRUNSWICK\t3014\t17173\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC33867-3.mp3\tRoger Wolfe Kahn & His Orch\tI'm Sitting On Top Of The World\tVICTOR\t19845\t33867-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4441.mp3\tAl Jolson\tI'm Sitting On Top Of The World\tDECCA\t28697\tL4441\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_009.mp3\tAl Jolson\tI'm Sitting On Top Of The World\tDECCA\t28697\tL4441\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_151.mp3\tFrank Crumit\tI'm Sitting On Top Of The World\tVICTOR\t20462\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141190.mp3\tArt Gillam\tI'm Sitting On Top Of World\tCOLUMBIA\t505 D\tW141190\t1925\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81272-2.mp3\tThe Georgians\tI'm Sitting Pretty In A Pretty Little City\tColumbia\t11-D\t81272-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU11891.mp3\tGene Rodemich And His Orchestra\tI'm Sitting Pretty In A Pretty Little City\tBRUNSWICK\t2526B\t11891\t1923\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3c/BRUM810-2.mp3\tDuke Ellington's Famous Orch\tI'm Slappin' Seventh Avenue\tBRUNSWICK\t8131\tM810-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC7193.mp3\tIsham Jones' Orch\tI'm So Afraid Of You\tBRUNSWICK\t6041\tC7193\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1893.mp3\tAmbrose Haley Ozark Ramblers\tI'm So Alone With The Crowd\tVOCALION\t3590\tC1893\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC86113.mp3\tAndy Kirk & His Orchestra\tI'm So In Love With You\tDECCA\t29371\t86113\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64813-1.mp3\tDuke Ellington & His Orch\tI'm So In Love With You\tVICTOR\t23041A\t64813-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73591.mp3\tAndy Kirk And His Orchestra\tI'm So Lonely I Could Cry\tDecca\t18916\t73591\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S6072.mp3\tHank Williams\tI'm So Lonesome I Could Cry\tMGM\t30637\t49S6072\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_225.mp3\tJo Stafford\tI'm So Right Tonight\tCapitol\t423\t1895-5\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_123.mp3\tArthur Collins\tI'm So Tired Of Livin', I Don't Care When I Die\tVICTOR\t16683\tB9338-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh189.mp3\tAl Bowlly\tI'm So Used To You Now\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030782.mp3\tTommy Dorsey & His Orch\tI'm So Weary Of It All\tVICTOR\t26148\t030782\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037180.mp3\tGlenn Miller & His Orch\tI'm Sorry For Myself (vmh+tb)\tBLUEBIRD\t10299A\t037180\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78828-3.mp3\tBert Williams\tI'm Sorry I Ain't Got It\tCOLUMBIA\tA-2877\t78828-3\t1919\t\nhttp://www.jazz-on-line.com/a/mp3b/BruE-36993-A.mp3\tMills Blue Rhythm Band\tI'm Sorry I Made You Blue\tBrunswck\t6229  \tE-36993-A  \t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03841-1.mp3\tFats Waller And His Rhythm\tI'm Sorry I Made You Cry\tVICTOR\t25515A\t03841-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62634.mp3\tBob Howard & His Orch\tI'm Sorry I Made You Cry\tDECCA\t1605\t62634\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe401277-A.mp3\tEddie Condon's Footwarmers\tI'm Sorry I Made You Cry\tOKeh\t41142\t401277-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC21633-1.mp3\tHenry Burr\tI'm Sorry I Made You Cry\tVICTOR\t18462\t21633-1\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_012.mp3\tHenry Burr\tI'm Sorry I Made You Cry\tVICTOR\t18462\t21633-1\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP107-A.mp3\tCapitol Jazzmen\tI'm Sorry I Made You Cry (v J T)\tCAPITOL\t\t107-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1063.mp3\tTed Daffan's Texans\tI'm Sorry I Said Goodbye\tOKEH\t5855\tDAL1063\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49992-1.mp3\tJimmie Rodgers\tI'm Sorry We Met\tVICTOR\t22072B\t49992-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUE37440-B.mp3\tBing Crosby\tI'm Sorry, Dear\tBRUNSWICK\t6226\tE37440-B\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047638.mp3\tByron Parker Mountaineers\tI'm Sorry, That's All I Can Say\tBLUEBIRD\t8521\t047638\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/RoyKJ-48-3.mp3\tMezzrow - Bechet Quintet\tI'm Speaking My Mind\tRoyal Jazz\t708\tKJ-48-3  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69913-A.mp3\tBuddy Johnson & His Band\tI'm Stepping Out\tDECCA\t8599\t69913-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048484.mp3\tGlenn Miller & His Orch\tI'm Stepping Out With A Memory (vre)\tBLUEBIRD\t10717\t048484\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_385.mp3\tDon Cherry\tI'm Still A King To You\tColumbia\t40655\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic21967is.mp3\tRudy Vallee\tI'm Still Caring\tVictor\t21967\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC176.mp3\tJoe Turner\tI'm Still In The Dark\tNATIONAL\t\tNSC176\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152322-3.mp3\tTed Lewis And His Band\tI'm Sure Of Everything But You\tCOLUMBIA\t2728 D\tW152322-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12565-B.mp3\tGuy Lombardo Royal Canadians\tI'm Sure Of Everything But You\tBRUNSWICK\t6426\t12565-B\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS26013-A.mp3\tJack Teagarden & His Orch\tI'm Takin' My Time With You\tCBS\tCo35224\t26013-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BANMEM722.mp3\tMemphis Minnie\tI'm Talking About You\tBANNER\t32556\tMEM722\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_225.mp3\tShep Fields And His Rippling Rhythm Orchestra\tI'm Talking Through My Heart\tBluebird\t6547\t0089\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_074.mp3\tCliff Edwards\tI'm Tellin' The Birds, I'm Tellin' The Bees (how I Love You)\tPerfect\t11634\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_155.mp3\tWendell Hall\tI'm Tellin' The Birds, I'm Tellin' The Bees (how I Love You)\tBRUNSWICK\t3387\t20801\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC2818.mp3\tNick Lucas\tI'm Telling You (you're Not Asking Me)\tBRUNSWICK\t4214\tC2818\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3461.mp3\tTed Daffan's Texans\tI'm That Kind Of Guy\tCOLUMBIA\t20567\tHCO3461\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/DeLD-171.mp3\tBenny Carter And His All Star Orchestra\tI'm The Caring Kind\tDe Luxe\t1012\tD-171\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98183.mp3\tPaul Whiteman & His Orch\tI'm The Echo\tVICTOR\t25198\t98183\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_228.mp3\tTony Bennett\tI'm The King Of Broken Hearts\tCOLUMBIA\t39964\tCO48160\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC50561-3.mp3\tSophie Tucker\tI'm The Last Of The Red Hot Mamas\tVICTOR\t21994\t50561-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68331.mp3\tElla Fitzgerald & Her Orch\tI'm The Lonesomest Gal In Town\tDECCA\t3666A\t68331\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_120.mp3\tTed Lewis And His Band\tI'm The Medicine Man For The Blues\tDECCA\t23917\tDLA1344\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC53475-2-3.mp3\tNat Shilkret & His Orch\tI'm The Medicine Man For The Blues (vj.marvin)\tVICTOR\t22055\t53475-2-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC017468.mp3\tTommy Dorsey & His Orch\tI'm The One Who Loves You\tVICTOR\t25733\t017468\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067962.mp3\tUna Mae Carlisle\tI'm The One Who Loves You\tBLUEBIRD\t11362\t067962\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH678.mp3\tGene Autry\tI'm Thinking Tonight Of My Blue Eyes\tOKEH\t6648\tH678\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2829.mp3\tBing Crosby & Woody Herman\tI'm Thinking Tonight Of My Blue Eyes\tDECCA\t18316A\tDLA2829\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_112.mp3\tCarter Family\tI'm Thinking Tonight Of My Blue Eyes\tMontgomeryWard\t4230\t45859-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067626.mp3\tGlenn Miller & His Orch\tI'm Thrilled\tBLUEBIRD\t11287\t067626\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69906.mp3\tElla Fitzgerald & Her Orch\tI'm Thrilled\tDECCA\t4073A\t69906\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE1024.mp3\tBing Crosby\tI'm Through With Love\tBRUNSWICK\t6140\tLAE1024\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5614.mp3\tSarah Vaughn W-george Treadwel\tI'm Through With Love\tMUSICRAFT\t499\t5614\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP586.mp3\tColeman Hawkins & His Orch\tI'm Through With Love\tCAPITOL\t\t586\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_035.mp3\tBing Crosby\tI'm Through With Love\tBRUNSWICK\t6140\tLAE1024\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_092.mp3\tHenry Busse And His Orchestra Feat. V/ Richard Barry\tI'm Through With Love\tVICTOR\t22677\t68896-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA21-0083x.mp3\tEddy Arnold\tI'm Throwing Rice\tRCA\t21-0083\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_178.mp3\tEddy Arnold\tI'm Throwing Rice (at The Girl I Love)\tRCA Victor\t78-0083\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP647.mp3\tKing Cole Trio\tI'm Thru With Love\tCAPITOL\t\t647\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S668.mp3\tSarah Vaughan\tI'm Thru With Love\tMGM\t30731\t48S668\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1931_0603_02.mp3\tLee Morse And Her Bluegrass Boys\tI'm Thru With Love\tColumbia\t2474DB\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64624-3.mp3\tRed's Big Ten\tI'm Tickled Pink With A Blue Eyed Baby\tVICTOR\t23026\t64624-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74211.mp3\tBuddy Johnson And His Orch.\tI'm Tired Of Crying Over You\tDECCA\t24817\t74211\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0805_01.mp3\tLee Morse\tI'm Tired Of Everything But You\tPerfect\t11589A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64970-A.mp3\tRosetta Crawford With Mezz Mezzrow\tI'm Tired Of Fattenin' Frogs For Snaks\tDecca\t7584\t64970-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S6072.mp3\tBob Wills And His Texas Playboys\tI'm Tired Of Living This Life\tMGM\t11024\t51S6072\t1951\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1907.mp3\tBing Crosby - J.s.trotter\tI'm Too Romantic\tDECCA\t2998A\tDLA1907\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYRX1.mp3\tRex Stewart Big 8\tI'm True To You\tKEYNOTE\t1306\tRX1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071910-1.mp3\tUna Mae Carlisle\tI'm Tryin'\tBLUEBIRD\t11491\t071910-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_093.mp3\tByron G. Harlan\tI'm Tying The Leaves So They Won't Come Down\tEDISON\t9606\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65096-A.mp3\tChick Webb And His Orchestra\tI'm Up A Tree\tDecca\t2468\t65096-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75281.mp3\tElla Fitzgerald / Sy Oliver\tI'm Waitin' For The Junkman\tDECCA\t24868\t75281\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR616-Hy.mp3\tLou Gold And His Orch\tI'm Waiting For Ships That\tHarmony\t616-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1953.mp3\tBing Crosby\tI'm Waiting For Ships That Never Come In\tDECCA\t3257A\tDLA1953\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN4453x.mp3\tLucky Millinder's Orchestra\tI'm Waiting Just For You\tKING\t4453\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_193.mp3\tRosemary Clooney\tI'm Waiting Just For You\tCOLUMBIA\t39535\tCO46848\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_007.mp3\tEddie Fisher\tI'm Walking Behind You\tRCA Victor\t5293\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC84950.mp3\tWebb Pierce\tI'm Walking The Dog\tDECCA\t28834\t84950\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE29691.mp3\tLouisiana Rhythm Kings\tI'm Walking Through Clover\tVOCALION\t15810B\tE29691\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-29691.mp3\tLouisiana Rhythm Kings\tI'm Walking Through Clover\tVocalion\t15810\tE-29691\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2447.mp3\tJimmie Lunceford & His Orch\tI'm Walking Through Heaven With You\tDECCA\t25016\tDLA2447\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA-2447-A.mp3\tJimmie Lunceford And His Orchestra\tI'm Walking Through Heaven With You\tDecca\t25016\tDLA-2447-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_159.mp3\tTex Ritter\tI'm Wastin' My Tears On You\tCapitol\t174\t117-B\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BruE-28203.mp3\tKing Oliver\tI'm Watching The Clock\tBrunswick\t4469\tE-28203-A or B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU19413-4.mp3\tSix Jumping Jacks\tI'm Wild 'bout Animal Crackers\tBRUNSWICK\t3216\t19413-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC51019-1.mp3\tBilly Hays And His Orch\tI'm Wild About Horns On Automobiles\tVICTOR\t40055\t51019-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401311-A.mp3\tFred Hall & His Sugar Babies\tI'm Wild About Horns On Automobiles (v A F)\tOKeh\t41152\t401311-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148485-3.mp3\tBessie Smith\tI'm Wild About That Thing\tCOLUMBIA\t14427 D\tW148485-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99418.mp3\tTune Wranglers\tI'm Wild About That Thing\tBLUEBIRD\t6310\t99418\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC70231-1.mp3\tTed Black And His Orch\tI'm With You\tVICTOR\t22816-A\t70231-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45915-1.mp3\tFlatt And Scruggs Foggy Mtn Boys\tI'm Working On The Road\tCOLUMBIA\t21147\tCO45915-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CHE1560X.mp3\tMuddy Waters\tI'm Your Hootchie Kootchie Man\tCHESS\tCHES1560\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-4680x.mp3\tEddie Fisher\tI'm Yours\tRCA\t20-4680\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC63670-3.mp3\tBert Lown Biltmore Hotel Orch\tI'm Yours\tVICTOR\t22541\t63670-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/CON21898-1.mp3\tArtie Shaw And His New Music\tI'm Yours\tCONQUEROR\t9269\tB-21898-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/APO4106.mp3\tLuis Russell & His Orch\tI'm Yours\tAPOLLO\t1046\t4106\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4751.mp3\tBillie Holiday\tI'm Yours\tCOMMODORE\t585\t4751\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1113.mp3\tBenrus Radio Orch\tI'm Yours\tHit-Of-The-Week\t1113\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_025.mp3\tEddie Fisher\tI'm Yours\tRCA\t20-4680\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_210.mp3\tToni Arden Feat. O/percy Faith\tI'm Yours\tCOLUMBIA\t39737\tCO47395\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_163.mp3\tBen Bernie And His Orchestra\tI'm Yours\tBRUNSWICK\t4898\tBRUNSWICK\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_027.mp3\tDon Cornell Feat. Norman Leyden's Orchestra\tI'm Yours\tCORAL\t60690\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_137.mp3\tFour Aces\tI'm Yours\tDECCA\t28162\t82597\t1952\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI6002-C.mp3\t''that Girl'' Quartette - O\tI'm Yours With Love And Kisses\tEDISON\tBA 4730\t6002-C\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0928_03.mp3\tLee Morse\tI'must Have That Man\tColumbia\t1584DA\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1057-1.mp3\tDjango Reinhardt\tI'se A Muggin'\tGramophone\tK-7704\tOLA-1057-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60886-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tI'se A Muggin'\tDecca\t744\t60886-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu99776-1.mp3\tMezz Mezzrow And His Swing Band\tI'se A Muggin' Part 1\tBluebird\tB-6321\t99776-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu99777-1.mp3\tMezz Mezzrow And His Swing Band\tI'se A Muggin' Part 2\tBluebird\tB-6321\t99777-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18654.mp3\tStuff Smith Onyx Club Boys Part 1\tI'se A Mugging\tARC\tVO3169\t18654\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_029.mp3\tHarry Macdonough\tI've A Longing In My Heart For You, Louise\tVICTOR\t16290\tB1985-3\t1901\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21711.mp3\tArtie Shaw And His New Music\tI've A Strange New Rhythm In My Heart\tBRUNSWICK\t7971\tB-21711-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC75664.mp3\tLionel Hampton & His Orch\tI've Been A Fool\tDECCA\t24864\t75664\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec75664.mp3\tLionel Hampton And His Orchestra\tI've Been A Fool\tDecca\t24864\t75664\t1950\tWalter Williams-Benny Bailey-Ed Mullens-Duke Garrette-Leo Shepherd-t, AI Grey-Benny Powell-Jimmy Wormick-Paul Lee Higaki-tb, Bobby Plater-Jerome Richardson-as, Curtis Lowe-Johnny Board-Billy ''Smallwood'' Williams-ts, Lonnie Shaw-bar, Lionel Hampton-vi\nhttp://www.jazz-on-line.com/a/mp3c/APO4103.mp3\tLuis Russell & His Orch\tI've Been A Fool Again\tAPOLLO\t1071\t4103\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec68287-A.mp3\tBenny Carter And His Orchestra\tI've Been In Love Before\tDecca\t3545\t68287-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW145437.mp3\tPaul Ash And His Orchestra\tI've Been Longing For A Girl Like You\tCOLUMBIA\t1243 D\tW145437\t1927\tDanny Polo, clarinet, alto & baritone saxes, replaces Wing or Nettles; Hank Winston, piano replaces Barris. Danny polo omitted; possibly Joe Tarto, brass bass, v Irving Kaufman, New York, December 20th 1927\nhttp://www.jazz-on-line.com/a/mp3e/VIC023507.mp3\tBenny Goodman & His Orch\tI've Been Saving Myself For You\tVICTOR\t25867\t023507\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1987.mp3\tDorothy Shay\tI've Been To Hollywood\tCOLUMBIA\t37191\tHCO1987\t1946\t\nhttp://www.jazz-on-line.com/a/mp3h/COL17680-1.mp3\tVic Berton And His Orchestra\tI've Been Waiting All Winter\tCOLUMBIA\t3074 D\t17680-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38049.mp3\tBeatrice Kay\tI've Been Waiting For Your Phone Call\tCOLUMBIA\t38373\tCO38049\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_388.mp3\tKay Starr\tI've Changed My Mind A Thousand Times\tRCA\t6359\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO40608.mp3\tBeatrice Kay\tI've Come Back To Say I'm Sorry\tCOLUMBIA\t38528\tCO40608\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA191.mp3\tAndy Iona's Novelty Four\tI've Found A Little Grass Skirt\tCOLUMBIA\t2953 D\tLA191\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141542-1.mp3\tEthel Waters And Her Ebony 4\tI've Found A New Baby\tCOLUMBIA\t561 D\tW141542-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141673-3.mp3\tTed Lewis And His Band\tI've Found A New Baby\tCOLUMBIA\t600 D\tW141673-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC73400-1.mp3\tNew Orleans Feetwarmers\tI've Found A New Baby\tVICTOR\t24150\t73400-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC1886.mp3\tChicago Rhythm Kings\tI've Found A New Baby\tBRUNSWICK\t4001\tC1886\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87763.mp3\tKxyz Novelty Band\tI've Found A New Baby\tBLUEBIRD\t5868\t87763\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403631-A.mp3\tClarence Williams Orch\tI've Found A New Baby\tOKeh\t8763\t403631-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3949.mp3\tBing Crosby & Eddie Heywood\tI've Found A New Baby\tDECCA\t23530\tL3949\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1921.mp3\tWillie Lewis & Negro Band\tI've Found A New Baby\tVARSITY\tEL4078s\t1921\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VICOLA1894.mp3\tDickie Wells Shim Shammers\tI've Found A New Baby\tVICTOR\t26617\tOLA1894\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC043247.mp3\tLionel Hampton & His Orch\tI've Found A New Baby\tVICTOR\t26447B\t043247\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404549-B.mp3\tJoe Venuti's Blue Four\tI've Found A New Baby\tOKeh\t41469\t404549-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D713IFANB.mp3\tRoy Eldridge & His Orchestra\tI've Found A New Baby\tV-DISC\t713\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17261H-.mp3\tThe Dutch Swing College Band\tI've Found A New Baby\tPhilips\tP17261H\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3h/Cha19481.mp3\tPaul Cornelius And His Orchestra\tI've Found A New Baby\tChampion\t40084B\t19481\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77468.mp3\tFranck ''big Boy'' Goudie (with Django Reinhardt)\tI've Found A New Baby\tUltraphone\tAP-1527\tP-77468\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU87763HJ1-3.mp3\tKxyz Novelty Band\tI've Found A New Baby\tBLUEBIRD\t5868\t87763\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D175IF.mp3\tLouis Jordan Tympany 5\tI've Found A New Baby\tV-DISC\t175\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/Cha18873.mp3\tPaul Cornelius And His Orchestra\tI've Found A New Baby\tChampion\t40084A\t18873\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25355.mp3\tBenny Goodman & His Orchestra\tI've Found A New Baby\tVictor\t25355\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU038291-1.mp3\tBud Freeman And His Summa Cum Laude Orchestra\tI've Found A New Baby\tBLUEBIRD\t10370\t038291-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_019.mp3\tTed Lewis And His Band\tI've Found A New Baby\tCOLUMBIA\t600 D\tW141673-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Mer1892.mp3\tDexter Gordon Quintet\tI've Found A New Baby\tMercury\t8900\t1892\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic043247-1.mp3\tLionel Hampton And His Orchestra\tI've Found A New Baby\tVictor\t26447\t043247-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151274-2.mp3\tFletcher Henderson & His Orch\tI've Found What I Wanted In You\tCOLUMBIA\t2414 D\tW151274-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Col151274-2.mp3\tFletcher Henderson And His Orchestra\tI've Found What I Wanted In You\tColumbia\t2414-D\t151274-2  \t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC26259.mp3\tMildred Bailey\tI've Gone Off The Deep End\tVOCALION\t5236\t26259\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW152456.mp3\tJack Teagarden & His Orch\tI've Got 'it'\tCOLUMBIA\t2913 D\tW152456\t1933\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81376-2.mp3\tThe Georgians\tI've Got A Cross-eyed Papa\tColumbia\t40-D\t81376-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO44735.mp3\tLee Wiley W Bobby Hackett Orch\tI've Got A Crush On You\tCOLUMBIA\t39203\tCO44735\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE26778.mp3\tJoe Sullivan (piano)\tI've Got A Crush On You\tOKEH\t5647\t26778\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC76826.mp3\tElla Fitzgerald\tI've Got A Crush On You\tDECCA\t27370\t76826\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_248.mp3\tFrank Sinatra\tI've Got A Crush On You\tCOLUMBIA\t38151\tCO38333\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_072.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tI've Got A Date With A Dream\tVICTOR\t26000\t024020-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_148.mp3\tGeorge Hall And His Orchestra\tI've Got A Date With A Dream\tVOCALION\t4283\tM861-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_017.mp3\tArthur Collins\tI've Got A Feelin' For You\tEDISON\t8661\t\t1904\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39963.mp3\tDorsey Brothers Orch.\tI've Got A Feelin' You're Foolin'\tDECCA\t560A\t39963\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_047.mp3\tDorsey Brothers Orchestra Feat. Bob Eberle; Without Tommy Dorsey\tI've Got A Feelin' You're Foolin'\tDECCA\t560A\t39963\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/SIGF1001.mp3\tEarl Hines Trio\tI've Got A Feeling I'm Falling\tSIGNATURE\t28109\tF1001\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24332IG.mp3\tElla Fitzgerald\tI've Got A Feeling I'm Falling\tDECCA\t24332\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72233.mp3\tJames P Johnson\tI've Got A Feeling I'm Falling\tDECCA\t23593\t72233\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic53586-3.mp3\tGene Austin\tI've Got A Feeling I'm Falling\tVictor\t22033\t53586-3\t1929\tAccompaniement by Mike Mosiello, t, Andy Sannella, cl, as, Lou Raderman, Murray Kellner, Yascha Zayde, vn, Abe Borodkin, vc, Fats Waller, p, cel, Carl Kress, g, Dick Cherwin, sb, William Dom or Joe Green\nhttp://www.jazz-on-line.com/a/mp3b/Vic49494-2.mp3\tThomas Waller\tI've Got A Feeling I'm Falling\tVictor\t22092\t49494-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_118.mp3\tGene Austin Feat. Leonard Joy And His Orchestra\tI've Got A Feeling I'm Falling\tVICTOR\t22033\t53586-3\t1929\tAccompaniement by Mike Mosiello, t, Andy Sannella, cl, as, Lou Raderman, Murray Kellner, Yascha Zayde, vn, Abe Borodkin, vc, Fats Waller, p, cel, Carl Kress, g, Dick Cherwin, sb, William Dom or Joe Green\nhttp://www.jazz-on-line.com/a/mp3d/SIGF-1001.mp3\tEarl Hines Trio\tI've Got A Feeling I'm Falling\tSIGNATURE\t28109\tF-1001\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/SigF-1001.mp3\tEarl Hines Trio\tI've Got A Feeling I'm Falling\tSignature\t28109\tF-1001\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh020.mp3\tCarroll Gibbons And The Savoy Hotel Orpheans\tI've Got A Feelin Youre Foolin (v Brian Lawrence & Anne Lenner)\tColumbia\tFB-1229\tCA-15446-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1062.mp3\tLuis Russell & His Orch\tI've Got A Gal\tAPOLLO\t1022\tR1062\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO32795-2.mp3\tBenny Goodman And His Orchestra\tI've Got A Gal In Kalamazoo\tCOLUMBIA\t36622\tCO32795-2\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC022483.mp3\tBunny Berigan & His Orch\tI've Got A Guy\tVICTOR\t25833B\t022483\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D161-.mp3\tGlenn Miller Aaf Band\tI've Got A Heart Filled With Love\tV-DISC\t161\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D381-A.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tI've Got A Heart Filled With Love (for You Dear)\tV-Disc\t381-A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC62338-A.mp3\tLouis Armstrong And His Orchestra\tI've Got A Heart Full Of Rhythm\tDecca\t1408\t62338-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19240.mp3\tStuff Smith & Onyx Club Boys\tI've Got A Heavy Date\tVOCALION\t3234\t19240\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_276.mp3\tHenry King And His Orchestra\tI've Got A Heavy Date\tDECCA\t760B\t60950-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3554x.mp3\tFreddy Martin And His Orchestra\tI've Got A Lovely Bunch Of Coconuts\tRCA\t20-3554\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_286.mp3\tDanny Kaye\tI've Got A Lovely Bunch Of Coconuts\tDECCA\t24784\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07752.mp3\tFats Waller And His Rhythm\tI've Got A New Lease On Love\tVICTOR\t25571\t07752\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07751.mp3\tFats Waller And His Rhythm\tI've Got A New Lease On Love\tVICTOR\t25580\t07751\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC95504.mp3\tTommy Dorsey & His Orch\tI've Got A Note\tVICTOR\t25236\t95504\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25896.mp3\tHal Kemp & His Orchestra\tI've Got A Pocketful Of Dreams\tVictor\t25896\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64271-B.mp3\tRuss Morgan & His Orchestra\tI've Got A Pocketful Of Dreams\tDECCA\t1936A\t64271-B\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1312-A.mp3\tBing Crosby & Trotter's Orch\tI've Got A Pocketful Of Dreams\tDECCA\t1933A\tDLA1312-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_017.mp3\tRuss Morgan And His Orchestra\tI've Got A Pocketful Of Dreams\tDECCA\t1936A\t64271-B\t1938\t\nhttp://www.78-tours.net/mp3/EXC1014.mp3\tJoe Liggins And His \"honeydrippers\" \"little\" Willie Jackson, Alto And Baritone, James Jackson, Tenor\tI've Got A Right To Cry\tEXCLUSIVE\t1014\tEXC-1014\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5366.mp3\tGeorgie Auld & His Orchestra\tI've Got A Right To Know\tMUSICRAFT\t\t5366\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_072alt.mp3\tBob Roberts\tI've Got A Tickling Sensation 'round My Heart For You\tColumbia\t3743\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6036.mp3\tEmil Coleman & His Orchestra\tI've Got Five Dollars\tBrunswick\t6036\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1931_0220_02.mp3\tLee Morse And Her Bluegrass Boys\tI've Got Five Dollars\tColumbia\t2417B\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/BAN10416-5.mp3\tBen Pollack And His Orchestra\tI've Got Five Dollars (v C B)\tBANNER\t32104\t10416-5\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42745.mp3\tTed Daffan's Texans\tI've Got Five Dollars And It's Saturday Night\tCOLUMBIA\t20679\tCO42745\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC63103-3.mp3\tHelen Kane\tI've Got It\tVICTOR\t22475\t63103-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_487.mp3\tJulius Larosa\tI've Got Love\tRCA\t6499\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78652-2.mp3\tAl Jolson\tI've Got My Captain Working For Me Now\tCOLUMBIA\tA-2794\t78652-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2794i.mp3\tAl Jolson\tI've Got My Captain Working For Me Now\tColumbia\tA2794\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC23098.mp3\tBilly Murray\tI've Got My Captain Working For Me Now\tVICTOR\t18604\t23098\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_009.mp3\tAl Jolson\tI've Got My Captain Working For Me Now\tCOLUMBIA\tA-2794\t78652-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_070.mp3\tBilly Murray\tI've Got My Captain Working For Me Now\tEMERSON\t1042\t04331-1\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4248A.mp3\tBing Crosby With John Scott Trotter And His Orchestra\tI've Got My Captain Working For Me Now Featured In Paramount Picture \"blues Skies\"\tDECCA\t23649 B\tL4248A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67095.mp3\tBob Crosby & His Orch\tI've Got My Eyes On You\tDECCA\t2991A\t67095\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_156.mp3\tTommy Dorsey And His Orchestra Feat. Alan Dewitt\tI've Got My Eyes On You\tVICTOR\t26470\t044526\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_072.mp3\tBob Crosby And His Orchestra\tI've Got My Eyes On You\tDECCA\t2991A\t67095\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18406-1.mp3\tWingy Manone & His Orch\tI've Got My Fingers Crossed\tARC\tVO3135\t18406-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98173-1.mp3\tFats Waller And His Rhythm\tI've Got My Fingers Crossed\tVICTOR\t25211\t98173-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec60155-D.mp3\tLouis Armstrong And His Orchestra\tI've Got My Fingers Crossed\tDecca\t623\t60155-D\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1081.mp3\tLouis Prima's New Orleans Gang\tI've Got My Fingers Crosses\tBRUNSWICK\t7586\tLA1081\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_301.mp3\tGlen Gray And Casa Loma Orchestra Feat. Kenny Sargent, V\tI've Got My Heart Set On You\tDECCA\t1530\t62745\t1937\tFrank Zullo, Grady Watts (tp), Sonny Dunham (tp, tb), Pee Wee Hunt, Billy Rauch (tb), Murray McEachern (tb, as), Glen Gray (cl, as, fl, ldr),  Clarence Hutchinrider (cl, as, fl), Kenny Sargent (cl, as), Art Ralston (as, ob, bsn), Danny D'Andrea (as), Pat Davis (cl, ts, fl), Joe Hall (p), Jack Burdette (g), Stanley Dennis (sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3a/BRUC1736.mp3\tRed Norvo And His Orch\tI've Got My Love To Keep Me Warm\tBRUNSWICK\t7813\tC1736\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1242.mp3\tAlice Faye Orchestra Under Direction Of Cy Feuer\tI've Got My Love To Keep Me Warm\tBRUNSWICK\t7821\tLA1242\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2034.mp3\tLes Brown's Band Of Reknown\tI've Got My Love To Keep Me Warm\tCOLUMBIA\t38324\tHCO2034\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC03889.mp3\tRay Noble And His Orch\tI've Got My Love To Keep Me Warm\tVICTOR\t25507\t03889\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4851.mp3\tMills Brothers\tI've Got My Love To Keep Me Warm\tDECCA\t24550\tL4851\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS20507-2.mp3\tBillie Holiday\tI've Got My Love To Keep Me Warm\tCBS\tVO3431\t20507-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA727.mp3\tArt Tatum\tI've Got My Love To Keep Me Warm\tDECCA\t1198\tDLA727\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDR-2903-1.mp3\tDjango Reinhardt\tI've Got My Love To Keep Me Warm\tDECCA\tF-6935\tDR-2903-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_063.mp3\tBillie Holiday\tI've Got My Love To Keep Me Warm\tCBS\tVO3431\t20507-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_080.mp3\tMills Brothers\tI've Got My Love To Keep Me Warm\tDECCA\t24550\tL4851\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_016.mp3\tLes Brown And His Orchestra\tI've Got My Love To Keep Me Warm\tCOLUMBIA\t38324\tHCO2034\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_324.mp3\tGlen Gray And Casa Loma Orchestra\tI've Got My Love To Keep Me Warm\tDECCA\t1126\t61556\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2991.mp3\tBing Crosby - Bob Crosby Orch\tI've Got Plenty To Be Thankful For\tDECCA\t18426A\tDLA2991\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06676.mp3\tTommy Dorsey & His Orch\tI've Got Rain In My Eyes\tVICTOR\t25549\t06676\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COL04179.mp3\tAda Jones (soprano)\tI've Got Rings On My Fingers\tCOLUMBIA\tA-0741\t04179\t1909\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA-0741.mp3\tAda Jones\tI've Got Rings On My Fingers\tColumbia\tA-0741\t04179\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_010.mp3\tBlanche Ring\tI've Got Rings On My Fingers\tMONARCH\tV-5737\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_117.mp3\tBilly Murray\tI've Got Rings On My Fingers\tVICTOR\t16510\tB9042-3\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_154.mp3\tDick Kuhn And His Orchestra\tI've Got Rings On My Fingers\tDECCA\t4337A\t69970-A\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_008.mp3\tAda Jones\tI've Got Rings On My Fingers\tColumbia\tA-0741\t04179\t1909\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh029.mp3\tThe Organ, The Dance Band And Me (billy Thorburn)\tI've Got Sixpence\tParlophone\tF-1844\tCE-10753-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR186-Hy.mp3\tFred Rich And His Hotel Astor Orc\tI've Got Some Lovin' To Do\tHarmony\t186-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR1529-1.mp3\tCharles Brown & His Band\tI've Got That Old Feeling\tALLADDIN\t3060\tRR1529-1\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49651-1.mp3\tKing Oliver & His Orchestra\tI've Got That Thing\tVICTOR\t38521\t49651-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL559.mp3\tLee O'daniel Hillbilly Boys\tI've Got The Blues\tVOCALION\t4353\tDAL559\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-3909.mp3\tJimmie Lunceford And His Orchestra\tI've Got The Carolina Blues\tDecca\t\tL-3909\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_094.mp3\tAda Jones\tI've Got The Finest Man\tVICTOR\t17205\t12324-3\t1913\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA1208i.mp3\tMaurice Burkhart\tI've Got The Finest Man\tColumbia\tA1208\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36995-1.mp3\tGene Austin & His Orch\tI've Got The Girl\tVICTOR\t20397\t36995-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_099.mp3\tGene Austin\tI've Got The Girl\tVICTOR\t20397\t36995-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149501-1.mp3\tWashington Phillips\tI've Got The Key To The Kingdom\tCOLUMBIA\t14511 D\tW149501-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/MER2142.mp3\tHelen Humes W Buck Clayton\tI've Got The Strangest Feeling\tMERCURY\t8119\t2142\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2505x.mp3\tFrank Sinatra\tI've Got The World On A String\tCAPITOL\t2505\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU74891-1.mp3\tLouis Armstrong & His Orch\tI've Got The World On A String\tBLUEBIRD\t6910\t74891-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44288.mp3\tBobby Hackett\tI've Got The World On A String\tCOLUMBIA\t39020\tCO44288\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CROBL15.mp3\tMildred Bailey\tI've Got The World On A String\tCROWN\t106\tBL15\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP6839.mp3\tTeddy Wilson\tI've Got The World On A String\tCOLUMBIA\t39430\tZSP6839\t\t\nhttp://www.jazz-on-line.com/a/mp3b/HUNW265051.mp3\tDuke Ellington Orch\tI've Got The World On A String\tHUNDRED\tCoE\tW265051\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75937.mp3\tElla Fitzgerald / Sy Oliver\tI've Got The World On A String\tDECCA\t27120\t75937\t1950\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24245.mp3\tLouis Armstrong\tI've Got The World On A String\tVictor\t24245\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_106.mp3\tFrank Sinatra\tI've Got The World On A String\tCapitol\t1699\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_205.mp3\tBing Crosby\tI've Got The World On A String\tCOLUMBIA\t39516\tZSP7466\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_212.mp3\tCab Calloway And His Orchestra\tI've Got The World On A String\tBRUNSWICK\t6424\t12543A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru12543-A.mp3\tCab Calloway And His Orchestra\tI've Got The World On A String\tBrunswick\t6424\t12543-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480415.mp3\tArt Tatum\tI've Got The World On A String\tClef\tMGC615\t1437-1\t1953\tArt Tatum (p-solo)\nhttp://www.jazz-on-line.com/a/mp3e/BRUB12991-A.mp3\tBinng Crosby W Dorsey Bros.\tI've Got The World On A String (v Bing Crosby)\tBRUNSWICK\t6491\tB12991-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/ARCB12991-A.mp3\tDorsey Brothers Orch\tI've Got The World On A String (vbing Crosby)\tARC\tBR6491\tB12991-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81149-3.mp3\tEddie Cantor\tI've Got The Yes We Have No Bananas Blues\tCOLUMBIA\tA-3964\t81149-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_124.mp3\tBelle Baker Feat. The Virginians\tI've Got The Yes! We Have No Bananas Blues\tVICTOR\t19135A\t28511-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_015.mp3\tEddie Cantor\tI've Got The Yes! We Have No Bananas Blues\tCOLUMBIA\t3964\t81149-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/MASM179-1.mp3\tDuke Ellington Orch\tI've Got To Be A Rug Cutter\tMASTER\t101\tM179-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/MasM-179-1.mp3\tDuke Ellington And His Famous Orchestra\tI've Got To Be A Rug Cutter\tMaster\t101\tM-179-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC51810-3.mp3\tBilly Hays And His Orch\tI've Got To Have A Mama Now\tVICTOR\t40113\t51810-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUB782.mp3\tBing Crosby\tI've Got To Pass Your House To Get To My House\tBRUNSWICK\t6610\tB782\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/ColB782-B.mp3\tBing Crosby Acc. By Jimmy Grier Orchestra\tI've Got To Pass Your House To Get To My House\tBrunswick\t6610\tB-782-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB782.mp3\tBing Crosby\tI've Got To Pass Your House To Get To My House - A\tTest\t\tB782-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC565.mp3\tHal Kemp & His Orch\tI've Got To Sing A Torch Song\tBRUNSWICK\t6583\tC565\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW152397.mp3\tRudy Vallee & His Orch\tI've Got To Sing A Torch Song\tCOLUMBIA\t2773 D\tW152397\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC2139-1.mp3\tCharlie Palloy & His Orch\tI've Got To Sing A Torch Song\tCROWN\t3528\tC2139-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUB803.mp3\tBing Crosby\tI've Got To Sing A Torch Song\tBRUNSWICK\t6599\tB803\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1933_0411_02.mp3\tLee Morse And Her Bluegrass Boys\tI've Got To Sing A Torch Song\tBluebird\tB5052A\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/ColB803-A.mp3\tBing Crosby\tI've Got To Sing A Torch Song\tColumbia\tD01092\tB803-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/TesB803-x.mp3\tBing Crosby\tI've Got To Sing A Torch Song\tTest\t\tB803-x\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_202.mp3\tRudy Vallee And His Connecticut Yankees\tI've Got To Sing A Torch Song\tCOLUMBIA\t2773 D\tW152397\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70188.mp3\tSam Price's Texas Blusicians\tI've Got Too Many Blues (v Mabel Robinson)\tDECCA\t8601\t70188\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148533-2.mp3\tBessie Smith\tI've Got What It Takes\tCOLUMBIA\t14435 D\tW148533-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC0745.mp3\tRay Noble And His Orch\tI've Got You Under My Skin\tVICTOR\t25422\t0745\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19800-2.mp3\tHal Kemp And His Orch\tI've Got You Under My Skin\tBRUNSWICK\t7745\t19800-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/MER159.mp3\tErroll Garner\tI've Got You Under My Skin\tMERCURY\t1003\t159\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D209A2.mp3\tVaughn Monroe\tI've Got You Under My Skin\tV-DISC\t209A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU7745.mp3\tHal Kemp And His Orch\tI've Got You Under My Skin\tBRUNSWICK\t7745\t19800-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_082.mp3\tStan Freberg Feat. O/les Baxter\tI've Got You Under My Skin\tCapitol\t1711\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3o/MUS5541.mp3\tArtie Shaw And His Orchestra\tI've Got You Under My Skin (from The Warner Bros. Film ''night And Day'')\tMUSICRAFT\t392\t5541\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/PER12707-B.mp3\tGus Van\tI've Gotta Heavy Levee Date\tPerfect\t12707-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_372.mp3\tRosemary Clooney\tI've Grown Accustomed To Your Face\tColumbia\t40676\tRHCO33735\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_493.mp3\tGordon Macrae\tI've Grown Accustomed To Your Face\tCapitol\t3384\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC37500-4.mp3\tGene Austin\tI've Grown So Lonesome Thinking Of You\tVICTOR\t20411\t37500-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_203.mp3\tGene Austin\tI've Grown So Lonesome, Thinking Of You\tVICTOR\t20411\t37500-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI8672-B.mp3\tBilly Jones\tI've Had Fifty Seven Varieties Of Sweethearts\tEDISON\t51134L\t8672-B\t\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77538.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tI've Had My Moments\tUltraphone\tAP-1547\tP-77538\t1935\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC60929-B.mp3\tIsham Jones's Juniors\tI've Had The Blues So Long\tDecca\t770 B\t60929-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_191.mp3\tJohnny Long And His Orchestra\tI've Had This Feeling Before\tDecca\t4429\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO912.mp3\tHarry James And His Orch\tI've Heard That Song Before\tCOLUMBIA\t36668\tHCO912\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_001.mp3\tHarry James And His Orchestra\tI've Heard That Song Before\tCAPITOL\t\t14233\t1943\t\nhttp://www.jazz-on-line.com/mp3/410724520.mp3\tBenny Goodman And His Orchestra\tI've Hitched My Wagon To A Star\tVICTOR\t25708\t015538\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_264.mp3\tJan Garber And His Orchestra\tI've Hitched My Wagon To A Star\tBRUNSWICK\t8018\tLA1526\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_0827_02.mp3\tLee Morse And Her Bluegrass Boys\tI've Looked All Over For A Girl Like You\tColumbia\t1149DB\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480534.mp3\tArt Farmer Quartet\tI've Never Been In Love Before\tPrestige\tLP193\t633\t1954\tArt Farmer, T, Flh, Wynton Kelley, P, Addison Farmer, B, Herbert (or Herbie) Lovelle, D\nhttp://www.jazz-on-line.com/a/mp3h/VOCE29050.mp3\tWhoopee Makers (j.pettis)\tI've Never Been Loved By Anyone Like You\tVOCALION\t15768\tE29050\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW143507-2.mp3\tBilly Jones And Ernest Hare\tI've Never Seen A Straight Banana\tCOLUMBIA\t898 D\tW143507-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_204.mp3\tErnest Hare And Billy Jones\tI've Never Seen A Straight Banana\tCOLUMBIA\t898 D\tW143507-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU58972.mp3\tJimmie Rodgers\tI've Only Loved Three Women\tBLUEBIRD\t6810\t58972\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu6810.mp3\tJimmie Rodgers\tI've Only Loved Three Women\tBlue Bird\t6810\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1130.mp3\tFrankie Laine W Carl Fischer\tI've Only Myself To Blame\tMERCURY\t5096\t1130\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB2173.mp3\tCount Basie & His Orchestra\tI've Only Myself To Blame\tRCA\t20-2850\tD7VB2173\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24055-1.mp3\tJimmie Lunceford And His Orchestra\tI've Only Myself To Blame\tVocalion\t4754\t24055-1\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3c/BLU56456.mp3\tJimmie Rodgers\tI've Ranged, I've Roamed And I've Travelled\tBLUEBIRD\t5892\t56456\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_014.mp3\tAda Jones And Billy Murray\tI've Taken Quite A Fancy To You\tVICTOR\t16788\tB6267-2\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_097.mp3\tJack Denny And His Orchestra Feat. Paul Small\tI've Told Ev'ry Little Star\tVICTOR\t24183\t73945\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC73945.mp3\tJack Denny And His Orch Vocal Paul Small\tI've Told Every Little Star (vps)\tVICTOR\t24183\t73945\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_210.mp3\tAndrews Sisters\tI, Yi, Yi, Yi, Yi (i Like You Very Much)\tDECCA\t3622\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145392-2.mp3\tHarry Reser's Syncopators\tIce Cream\tCOLUMBIA\t1244 D\tW145392-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3384-2.mp3\tFats Navarro Qt\tIce Freezes Red\tSAVOY\t976A\tS3384-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69525-A.mp3\tBig Joe Turner\tIce Man\tDECCA\t7856\t69525-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_151.mp3\tJane Green\tIda - I Do\tVICTOR\t19707\t32731-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE21839.mp3\tDykes Magic City Trio\tIda Red\tBRUNSWICK\t125\tE21839\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S3108.mp3\tBob Wills And His Texas Playboys\tIda Red Likes The Boogie\tMGM\t10570A\t49S3108\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC04559-2.mp3\tBenny Goodman Qt\tIda Sweet As Apple Cider\tVICTOR\t25531-B\t04559-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1722A.mp3\tBing Crosby & Spike Jones 4\tIda! Sweet As Apple Cider\tDECCA\t28963\tDLA1722A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU15748-49.mp3\tIsham Jones & His Orch\tIda, I Do\tBRUNSWICK\t2915\t15748-49\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38615.mp3\tMills Brothers\tIda, Sweet As Apple Cider\tDECCA\t165A\t38615\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74033.mp3\tEddie Condon & His Orchestra\tIda, Sweet As Apple Cider\tDECCA\t24219B\t74033\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067885.mp3\tAlvino Rey & His Orch\tIdaho\tBLUEBIRD\t11331\t067885\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MER850-1.mp3\tGene Ammons Sextet\tIdaho\tMERCURY\t8048\t850-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480687.mp3\tThe Art Tatum Trio\tIdaho\tPablo\t2310-733\t1794-2\t1954\tBenny Carter (as), Art Tatum (p), Louie Bellson (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1942_030.mp3\tBenny Goodman And His Orchestra Feat. Dick Haymes, V\tIdaho\tCOLUMBIA\t36613\tCO32924-1\t1942\tCootie Williams, Bernie Privin, Tony Faso (tp), Lou McGarity, Charlie Castaldo (tb), Benny Goodman (cl), Hymie Schertzer, Bud Shiffman (as), Jerry Jerome, George Berg (ts), Johnny McAfee (bar), Mel Powell (p), Dave Barbour (g), Sid Weiss (sb), Alvin Stoller (dm)\nhttp://www.jazz-on-line.com/a/mp3h/DH480859.mp3\tRay Anthony And His Orchestra\tIdaho\tCAPITOL\t2293\t10601\t1952\tRay Anthony (tp,arr) Jack Laubach, Bruce Brukert, Dean Hinkle, Knobby Lee (tp) Keith Butterfield, Walter Shields, Ken Trimble (tb) Dick Reynolds (tb,arr) Earl Bergman, Jim Schneider (cl,as) Buddy Wise, Bill Usselton, Maxwell Davis (ts) Leo Anthony (bar,as) Fred Sarvise (p) Vince Terri (g) Billy Cronk (b) Archie Freeman (d)\nhttp://www.jazz-on-line.com/a/mp3a/COLCO32924-1.mp3\tBenny Goodman And His Orchestra\tIdaho (v Dick Haymes)\tCOLUMBIA\t36613\tCO32924-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3l/VOC8650.mp3\tLeo Reisman Orch\tIdola\tVOCALION\t14331B\t8650\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20270-B.mp3\tJean Goldkette And His Orch\tIdolizing\tVICTOR\t20270B\t36813-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4289.mp3\tJo Stafford\tIf\tCOLUMBIA\t39082\tHCO4289\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAVI203997.mp3\tPerry Como Orchestra Of Mitchell Ayres\tIf\tRCA\t20-3997\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM50S3185.mp3\tBilly Eckstine\tIf\tMGM\t10896\t50S3185\t1951\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL6047.mp3\tLouis Armstrong - G.jenkins\tIf\tDECCA\t27481\tL6047\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_113.mp3\tDean Martin\tIf\tCapitol\t1342\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_058.mp3\tJo Stafford\tIf\tCOLUMBIA\t39082\tHCO4289\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_274.mp3\tVic Damone Feat. O/george Siravo\tIf\tMercury\t5585\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_005.mp3\tPerry Como\tIf\tRCA Victor\t3997\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_072.mp3\tBilly Eckstine Feat. Pete Rugolo's Orchestra\tIf\tMGM\t10896\t50S3185\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_253.mp3\tJan Garber And His Orchestra\tIf\tCAPITOL\t1351\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480474.mp3\tThe Art Tatum Trio\tIf\tBarclay\tGLP3592\t2668-1\t1956\tArt Tatum (p) Red Callender (b) Jo Jones (d)\nhttp://www.jazz-on-line.com/a/mp3d/Dec65442-A.mp3\tElla Fitzgerald And Her Savoy Eight\tIf Anything Hapened To You\tDecca\t2481\t65442-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65442.mp3\tElla Fitzgerald & Her Savoy 8\tIf Anything Happened To You\tDECCA\t2481B\t65442\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC017454.mp3\tBenny Goodman And His Orchestra\tIf Dreams Come True\tVICTOR\t25726B\t017454\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62888.mp3\tChick Webb & His Orchestra\tIf Dreams Come True\tDECCA\t1716A\t62888\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S481.mp3\tEddie Heywood\tIf Dreams Come True\tMGM\t30633\t51S481\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBSW24757.mp3\tJames P Johnson\tIf Dreams Come True\tCBS\t(Reject)\tW24757\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/JCFST-1228-1.mp3\tLe ''jazz Club Mystery Hot Band'' (with Django Reinhardt)\tIf Dreams Come True\tJazz Club Franais\t121\tST-1228-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/Bru8-22255-1.mp3\tTeddy Wilson And His Orchestra\tIf Dreams Come True\tBrunswick\t8053\t8-22255-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU22255-1.mp3\tTeddy Wilson & His Orch\tIf Dreams Come True (v B. Holiday)\tBRUNSWICK\t8053\t22255-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_023.mp3\tFarber Sisters\tIf He Can Fight Like He Can Love (good Night, Germany)\tCOLUMBIA\tA-2556\t77777\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_027.mp3\tArthur Collins\tIf He Comes In, I'm Goin' Out\tCOLUMBIA\tA-0845\t04437\t1910\t\nhttp://www.jazz-on-line.com/a/mp3h/COL145812-3.mp3\tGerald Marks Hotel Tuller Orch\tIf I Can't Have You\tCOLUMBIA\t1432 D\t145812-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_1018_02.mp3\tLee Morse And Her Bluegrass Boys\tIf I Can't Have You\tColumbia\t2012DB\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_151.mp3\tInk Spots\tIf I Cared A Little Bit Less\tDECCA\t18528A\t71236\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS24241-1.mp3\tCount Basie And His Orch\tIf I Could Be With You\tCBS\tVO4748\t24241-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC96504.mp3\tBenny Goodman And His Orchestra\tIf I Could Be With You\tVICTOR\t25290\t96504\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE34202.mp3\tMarion Harris\tIf I Could Be With You\tBRUNSWICK\t4873\tE34202\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEW404406.mp3\tLouis Armstrong & His Orch\tIf I Could Be With You\tOKEH\t6892\tW404406\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD337.mp3\tHelen Humes\tIf I Could Be With You\tDISC\t530\tD337\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83245.mp3\tColeman Hawkins & His Orch\tIf I Could Be With You\tDECCA\t28386\t83245\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU4IIB.mp3\tCliff Jackson's Qt\tIf I Could Be With You\tBLUENOTE\tBN4\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72390.mp3\tJames P Johnson\tIf I Could Be With You\tDECCA\t24883\t72390\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/Bla6.mp3\tCliff Jackson\tIf I Could Be With You\tBlack & White\t4\t6\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COL150706-1.mp3\tHotel Pennsylvania Music\tIf I Could Be With You One Hour Tonight\tCOLUMBIA\tHA1201\t150706-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC58545-2.mp3\tMckinney's Cotton Pickers Vocal By George Thomas\tIf I Could Be With You One Hour Tonight\tVICTOR\t38118A\t58545-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/CHA9819.mp3\tBen Pollack's Orch\tIf I Could Be With You One Hour Tonight\tCHALLENGE\t770\t9819\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404406-A.mp3\tLouis Armstrong & His Orch\tIf I Could Be With You One Hour Tonight\tOKeh\t41448\t404406-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65953.mp3\tLouis Prima's New Orleans Gang\tIf I Could Be With You One Hour Tonight\tDECCA\t2660B\t65953\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D1074.mp3\tJack Teagarden Vdisc Allstars\tIf I Could Be With You One Hour Tonight\tV-DISC\t418\t1074\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_011.mp3\tMckinney's Cotton Pickers\tIf I Could Be With You One Hour Tonight\tBluebird\t5905\t58545-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_133.mp3\tLouis Armstrong\tIf I Could Be With You One Hour Tonight\tOKeh\t41448\t404406-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24241-1.mp3\tCount Basie And His Orchestra\tIf I Could Be With You One Hour Tonight\tVocalion\t4748\t24241-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/ARARR9794-2.mp3\tWingy Manone And His Orchestra\tIf I Could Be With You One Hour Tonight (vk.starr)\tARA\t145A\tRR9794-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-119-1.mp3\tBenny Carter And His Orchestra\tIf I Could Only Read Your Mind\tVocalion\tS-27\tS-119-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20390.mp3\tBenny Carter & His Orch\tIf I Could Read Your Mind\tBRUNSWICK\t7853\t20390\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64891.mp3\tInk Spots\tIf I Didn't Care\tDECCA\t2286A\t64891\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC2286A.mp3\tInk Spots\tIf I Didn't Care\tDECCA\t2286A\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_037.mp3\tInk Spots\tIf I Didn't Care\tDECCA\t23632A\t64891-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24338-A.mp3\tCount Basie And His Orchestra\tIf I Didn't Care\tVocalion\t4784\t24338-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74213.mp3\tBuddy Johnson And His Orch.\tIf I Ever Find You, Baby\tDECCA\t24641\t74213\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/CROC1965-1.mp3\tDick Robertson And His Band\tIf I Ever Get A Job Again (vdr)\tCROWN\t3438\tC1965-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_197.mp3\tJo Stafford\tIf I Ever Love Again\tCapitol\t742\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68363.mp3\tAndy Kirk & Clouds Of Joy\tIf I Feel This Way Tomorrow\tDECCA\t3582A\t68363\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec68363-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tIf I Feel This Way Tomrrow (then It's Love)\tDecca\t3582\t68363-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLRHCO33181.mp3\tDoris Day\tIf I Give My Heart To You\tCOLUMBIA\t40300\tRHCO33181\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_071.mp3\tConnee Boswell\tIf I Give My Heart To You\tDECCA\t29148\t85796\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_021.mp3\tDoris Day Feat. The Mellomen\tIf I Give My Heart To You\tCOLUMBIA\t40300\tRHCO33181\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC59771-3.mp3\tRudy Vallee And His Ct.yankees\tIf I Had A Girl Like You\tVICTOR\t22419\t59771-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC62681-1.mp3\tHenny Hendrickson's Louisville Serenaders\tIf I Had A Girl Like You\tVICTOR\t\t62681-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_026.mp3\tRudy Vallee And His Connecticut Yankees\tIf I Had A Girl Like You\tVICTOR\t22419\t59771-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA222.mp3\tThe Boswell Sisters\tIf I Had A Million Dollars\tBRUNSWICK\t7302\tLA222\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38923.mp3\tAl Bowlly\tIf I Had A Million Dollars\tDECCA\t293A\t38923\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU16007-A.mp3\tOzzie Nelson & His Orch\tIf I Had A Million Dollars (v O N)\tBRUNSWICK\t6991\t16007-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh025.mp3\tAmbrose And His Orchestra\tIf I Had A Million Dollars (v Sam Browne)\tDecca\tF-5363\tGB-6801-4\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_335.mp3\tRosemary Clooney Feat. O/percy Faith\tIf I Had A Penny\tCOLUMBIA\t39910\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22148-B.mp3\tJohnny Marvin\tIf I Had A Talking Picture\tVictor\t22148-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE585.mp3\tEarl Burtnett And His Orch\tIf I Had A Talking Picture Of You\tBRUNSWICK\t4501\tLAE585\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC55689.mp3\tJohnny Hamp's Kentucky Seren\tIf I Had A Talking Picture Of You\tVICTOR\t22124\t55689\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW149150-4.mp3\tPaul Whiteman And His Orchestra (bing Crosby Solo)\tIf I Had A Talking Picture Of You\tColumbia\t\tW149150-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_093.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra\tIf I Had A Talking Picture Of You\tBRUNSWICK\t4501\tLAE585\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_057.mp3\tJohnny Hamp And His Orchestra\tIf I Had A Talking Picture Of You\tVICTOR\t22124\t55689\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC84442.mp3\tRichard Himber & His Orch\tIf I Had Million Dollars\tVICTOR\t24745\t84442\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1742.mp3\tBing Crosby - J.s.trotter Orch\tIf I Had My Way\tDECCA\t11030\tDLA1742\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL518.mp3\tNite Owls\tIf I Had My Way\tVOCALION\t4452\tDAL518\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_270.mp3\tBunny Berigan And His Orchestra Feat. Chick Bullock\tIf I Had My Way\tVOCALION\t3254\t19418-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_326.mp3\tGlen Gray And Casa Loma Orchestra Feat. Kenny Sargent\tIf I Had My Way\tDECCA\t2437\t65264-A\t1939\tWalter Smith, Frank Ryerson, Sonny Dunham (tp), Pee Wee Hunt, Murray McEachern (tb), Glen Gray, Clarence Hutchenrider (cl, as, fl), Art Ralston, Danny D'Andrea (as), Pat Davis (cl, ts), Joe Hall (p), Jack Blanchette (g), Stanley Dennis (sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3c/VOCM498.mp3\tThree Peppers\tIf I Had My Way (swingout)\tVOCALION\t3803\tM498\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19418-1.mp3\tBunny Berigan & His Boys\tIf I Had My Way (vcb)\tARC\tVO3254\t19418-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN6287-A.mp3\tSam Lanin's Dance Ensemble\tIf I Had You\tBanner\t6287-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE31609-2.mp3\tBenny Goodman Sextet\tIf I Had You\tOKEH\t6486\t31609-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC062767.mp3\tArtie Shaw And His Orchestra\tIf I Had You\tVICTOR\t27536B\t062767-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU054677.mp3\tUna Mae Carlisle\tIf I Had You\tBLUEBIRD\t10898\t054677\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/HAR147765-3.mp3\tRudy Vallee & Connecticut Yank\tIf I Had You\tHARMONY\t825-H\t147765-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC61591.mp3\tBob Crosby & His Orchestra\tIf I Had You\tDECCA\t1170\t61591\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_135.mp3\tAl Bowlly Feat. O/fred Elizalde\tIf I Had You\tBRUNSWICK\t3948\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_071.mp3\tRudy Vallee And His Connecticut Yankees\tIf I Had You\tHARMONY\t825-H\t147765-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-3-1.mp3\tAlix Combelle's Hot Four\tIf I Had You\tSwing\t17\tOSW-3-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh174.mp3\tFred Elizalde And His Music\tIf I Had You (v Al Bowlly)\tBrunswick\t3948\tBB-146-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1920.mp3\tBing Crosby - J.s.trotter\tIf I Knew Then\tDECCA\t3024B\tDLA1920\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66672.mp3\tWoody Herman & His Orchestra\tIf I Knew Then\tDECCA\t2772A\t66672\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC63107-3.mp3\tHelen Kane\tIf I Knew You Better\tVICTOR\t22520\t63107-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/NATNSC558.mp3\tEileen Barton\tIf I Knew You Were Comin'\tNATIONAL\t\tNSC558\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM50S69.mp3\tArt Mooney And His Orchestra\tIf I Knew You Were Comin'\tMGM\t10660\t50S69\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_005.mp3\tEileen Barton Feat. The New Yorkers\tIf I Knew You Were Comin' I'd've Baked A Cake\tNATIONAL\t9103\tNSC558\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_059.mp3\tGeorgia Gibbs\tIf I Knew You Were Comin' I'd've Baked A Cake\tCoral\t60169\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_164.mp3\tEthel Merman And Ray Bolger Feat. O/sy Oliver\tIf I Knew You Were Conin' I'd've Baked A Cake\tDECCA\t24944\t75873\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_009.mp3\tMarguerite Farrell\tIf I Knock The 'l' Out Of Kelly (it Would Still Be Kelly To Me)\tColumbia\t39998\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_009.mp3\tMarguerite Farrell\tIf I Knock The 'l' Out Of Kelly (it Would Still Be Kelly To Me)\tVICTOR\t18105\t17930-3\t1916\t\nhttp://www.jazz-on-line.com/a/mp3e/COL3588y.mp3\tMurray,billy\tIf I Knock The L Out Of Kelly\tEDISON\t50364\t4777\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144509-2.mp3\tCharlie Poole N.c.ramblers\tIf I Lose, I Don't Care\tCOLUMBIA\t15215 D\tW144509-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC81062.mp3\tPaul Whiteman & His Orch\tIf I Love Again\tVICTOR\t24517\t81062\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC067740.mp3\tArtie Shaw And His Orchestra\tIf I Love Again\tVICTOR\t27664\t067740-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1380.mp3\tFrank Sinatra\tIf I Loved You\tCOLUMBIA\t36825\tHCO1380\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MERYW334.mp3\tErrol Garner & His Trio\tIf I Loved You\tMERCURY\t1034\tYW334\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3801.mp3\tBing Crosby\tIf I Loved You\tDECCA\t18686A\tL3801\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_090.mp3\tFrank Sinatra\tIf I Loved You\tCOLUMBIA\t36825\tHCO1380\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_032.mp3\tPerry Como Feat. Russell Case's Orchestra\tIf I Loved You\tVICTOR\t1676\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/MER334-1.mp3\tErroll Garner Trio\tIf I Loved You\tMERCURY\t1034\t334-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_272.mp3\tRoy Hamilton\tIf I Loved You\tEpic\t9047\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC026683.mp3\tHal Kemp & His Orch\tIf I Loved You More\tVICTOR\t26040A\t026683\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_066.mp3\tNat King Cole And The Four Knights\tIf I May\tCapitol\t3095\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4570.mp3\tAl Jolson - Morris Stoloff\tIf I Only Had A Match\tDECCA\t24296\tL4570\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MERCLEF324-3.mp3\tCharlie Parker With Strings\tIf I Should Lose You\tMERCURY\t11037\tCLEF324-3\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5500z.mp3\tFrankie Laine\tIf I Were A Bell\tMERCURY\t5500\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_329.mp3\tFrankie Laine\tIf I Were A Bell\tMERCURY\t5500\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC023761-1.mp3\tFats Waller And His Rhythm\tIf I Were You\tVICTOR\t26002\t023761-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22822-2.mp3\tTeddy Wilson\tIf I Were You\tCBS\tBR8150\t22822-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22923-2.mp3\tBillie Holiday & Her Orch\tIf I Were You\tCBS\tVO4151\t22923-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_027.mp3\tArthur Collins\tIf I'm Goin' To Die, I'm Goin' To Have Some Fun\tVICTOR\t5828\tB4719\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_245.mp3\tPerry Como Feat. Russell Case's Orchestra\tIf I'm Lucky\tRCA Victor\t1945\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3h/COL170421-1.mp3\tYale Collegians\tIf I'm Without You\tCOLUMBIA\t139P\t170421-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3314.mp3\tUna Mae Carlisle W Orch\tIf It Ain't Mine (whose Is It?)\tSAVOY\t617A\tS3314\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2683.mp3\tTexas Jim Lewis\tIf It Hadnt Been For You\tDECCA\t6020\tDLA2683\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84925-1.mp3\t\"fats\" Waller And His Rhythm\tIf It Isn't Love\tVictor\t24808\t84925-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC84925-1.mp3\tFats Waller And His Rhythm\tIf It Isnt Love\tVICTOR\t24808\t84925-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_219.mp3\tLarry Clinton And His Orchestra\tIf It Rains, Who Cares?\tVictor\t25841\t022675-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67196.mp3\tElla Fitzgerald & Her Orch\tIf It Weren't For You\tDECCA\t3026A\t67196\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MER20237.mp3\tJulia Lee W Tommy Doglas Orch\tIf It's Good\tMERCURY\t8005\t20237\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic037614-1.mp3\tLionel Hampton And His Orchestra\tIf It's Good (then I Want It)\tVictor\t6702-5\t037614-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65462.mp3\tLouis Armstrong & His Orch.\tIf It's Good Then I Want It\tDECCA\t2480A\t65462\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_251.mp3\tDorsey Brothers Orchestra Feat. V/bob Crosby\tIf It's Love\tDECCA\t321B\t39120-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39120-A.mp3\tDorsey Brothers Orchestra\tIf It's Love (v Bob Crosby)\tDECCA\t321B\t39120-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23669II.mp3\tLouis Jordan\tIf It's Love You Want, Baby That's Me\tDECCA\t23669\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21712-2.mp3\tArtie Shaw And His New Music\tIf It's The Last Thing I Do\tBRUNSWICK\t7971\tB-21712-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21940-1.mp3\tFletcher Henderson And His Orchestra\tIf It's The Last Thing I Do\tVocalion\t3850\t21940-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_061.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tIf It's The Last Thing I Do\tVICTOR\t25686\t013356\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-11994-A.mp3\tDon Redman And His Orchestra\tIf It's True\tBrunswick\t6368\tB-11994-A  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC055067.mp3\tArtie Shaw And His Orchestra\tIf It's You\tVICTOR\t26760\t055067-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055067-1.mp3\tArtie Shaw And His Orchestra\tIf It's You V A B\tVictor\t26760\t055067-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60936-A.mp3\tBob Howard & His Orch\tIf Love Is Blind\tDECCA\t862A\t60936-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_377.mp3\tNat ''king'' Cole\tIf Love Is Good To Me\tCAPITOL\t2540\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03899.mp3\tTommy Dorsey & His Orch\tIf My Heart Could Only Talk\tVICTOR\t25508\t03899\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_288.mp3\tTommy Dorsey And His Orchestra\tIf My Heart Could Only Talk\tVICTOR\t25508\t03899\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59505-2.mp3\tJelly Roll Morton Hot Peppers\tIf Somebody Would Only Love Me\tVICTOR\t23321\t59505-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO47384.mp3\tSarah Vaughan\tIf Someone Had Told Me\tCOLUMBIA\t39719\tCO47384\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_243.mp3\tRosemary Clooney\tIf Teardrops Were Pennies\tCOLUMBIA\t39535\tCO46307\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65443.mp3\tElla Fitzgerald & Her Savoy 8\tIf That's What You're Thinking\tDECCA\t2581B\t65443\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65443-A.mp3\tElla Fitzgerald And Her Savoy Eight\tIf That's What You're Thinking, You're Wrong\tDecca\t2581\t65443-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013525.mp3\tTommy Dorsey & His Clambake 7\tIf The Man In The Moon Were A Coon\tVICTOR\t25676\t013525\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB4631-2.mp3\tAda Jones\tIf The Man In The Moon Were A Coon\tVICTOR\t16040\tB4631-2\t1907\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25676.mp3\tTommy Dorsey & His Clambake 7\tIf The Man In The Moon Were A Coon\tVictor\t25676\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA-0502.mp3\tAda Jones\tIf The Man In The Moon Were A Coon\tColumbia\tA-0502\t03565-1\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_030.mp3\tAda Jones\tIf The Man In The Moon Were A Coon\tVICTOR\t16040\tB4631-2\t1907\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC39693.mp3\tBob Howard & His Orchestra\tIf The Moon Turns Green\tDECCA\t504B\t39693\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149906.mp3\tCharlie Poole N.c.ramblers\tIf The River Were Whiskey\tCOLUMBIA\t15545 D\tW149906\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35187.mp3\tCab Calloway & His Orch\tIf This Isn't Love\tCOLUMBIA\t36894\tCO35187\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC61059-A.mp3\tLouis Armstrong And His Orchestra\tIf We Never Meet Again\tDECCA\t906A\t61059-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_250.mp3\tNat Brandywynne And His Stork Club Orchestra\tIf We Never Meet Again\tBrunswick\t7714\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu42757.mp3\tArtie Shaw And His Orchestra\tIf What You Say Is True\tBluebird\t10446\t042757-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS26111A.mp3\tJack Teagarden & His Orch\tIf What You Say Is True\tCBS\t\t26111A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu042757-1.mp3\tArtie Shaw And His Orchestra\tIf What You Say Is True ? V T P\tBluebird\tB-10446\t042757-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D393A1.mp3\tFrank Sinatra\tIf You Are But A Dream\tV-DISC\t393A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_241.mp3\tFrank Sinatra\tIf You Are But A Dream\tCOLUMBIA\t36814\tCO33808\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_179.mp3\tJimmy Dorsey And His Orchestra\tIf You Are But A Dream\tDECCA\t4312B\t70393\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S40.mp3\tSy Oliver & His Orchestra\tIf You Believed In Me\tMGM\t10016\t47S40\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_253.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberly And Helen O'connell\tIf You Build A Better Mousetrap\tDECCA\t4132B\t70027\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_339.mp3\tFour Aces Featuring Al Alberts\tIf You Can Dream\tDecca\t29809\t88550\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/GENX0058.mp3\tDuke Ellington & His Orchestra\tIf You Can't Hold The Man You Love\tGENNETT\t3291-A\tX0058\t1926\t\nhttp://www.jazz-on-line.com/a/mp3h/GenX-58-A.mp3\tDuke Ellington & His Orchestra\tIf You Can't Hold The Man You Love\tGennett\t3291-A\tX-58-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE20703.mp3\tSix Jumping Jacks\tIf You Can't Land 'er On The Veranda\tBRUNSWICK\t3374\tE20703\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP126.mp3\tKing Cole Trio\tIf You Can't Smile And Say Yes\tCAPITOL\t\t126\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/Mus5485.mp3\tSarah Vaughan And Orchestra Under The Direction Of Tadd Dameron\tIf You Could See Me Now\tMusicraft\t380\t5485\t1946\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81460-2.mp3\tThe Georgians\tIf You Do - What You Do\tColumbia\t56-D\t81460-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81460-2.mp3\tEddie Cantor\tIf You Do What You Do\tCOLUMBIA\t56D\t81460-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC85591.mp3\tElla Fitzgerald\tIf You Don't I Know Who Will\tDECCA\t29259\t85591\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_224.mp3\tJohnny Marvin\tIf You Don't Love Me\tVICTOR\t21609\t46673-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_089.mp3\tJaye P. Morgan\tIf You Don't Want My Love\tRCA Victor\t6282\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81092-4.mp3\tBessie Smith\tIf You Don't, I Know Who Will\tCOLUMBIA\tA-3942\t81092-4\t1923\t\n\tArtie Shaw And His Orchestra\tIf You Ever Change Your Mind\tBLUEBIRD\tB-10195-B\t035302-1\t1939\tVocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3c/DEC65444.mp3\tElla Fitzgerald & Her Savoy 8\tIf You Ever Change Your Mind\tDECCA\t2481A\t65444\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65444-A.mp3\tElla Fitzgerald And Her Savoy Eight\tIf You Ever Change Your Mind\tDecca\t2481\t65444-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035398.mp3\tTommy Dorsey & His Orch\tIf You Ever Change Your Mind (v E W)\tVICTOR\t26210\t035398\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECLA5899.mp3\tLionel Hampton & His Orchestra\tIf You Ever Learn To Love Me\tDECCA\t28230\tLA5899\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5899.mp3\tLionel Hampton And His Orchestra\tIf You Ever Learn To Love Me\tDecca\t28230\tLA-5899\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC62214.mp3\tElla Fitzgerald And Her Savoy 8\tIf You Ever Should Leave\tDECCA\t1302\t62214\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-1955-1.mp3\tFletcher Henderson And His Orchestra\tIf You Ever Should Leave\tVocallon\t3627\tC-1955-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_202.mp3\tElla Fitzgerald Feat. Chick Webb Orchestra\tIf You Ever Should Leave\tDECCA\t1302\t62214\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE16344.mp3\tNick Lucas\tIf You Hadn't Gone Away\tBRUNSWICK\t2961-A\tE16344\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC67761-1.mp3\tRed's Big Ten\tIf You Haven't Got A Girl (vps)\tVICTOR\t23033\t67761-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_005.mp3\tEddie Cantor\tIf You Knew Susie\tDECCA\t23986\tL3668\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_080.mp3\tErnest Hare And Billy Jones\tIf You Knew Susie\tBRUNSWICK\t2888\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COL140499.mp3\tEddie Cantor\tIf You Knew Susie (like I Know Susie)\tCOLUMBIA\t364D\t140499\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_051.mp3\tCliff Edwards\tIf You Knew Susie (like I Know Susie)\tPath\t025141\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC21005.mp3\tErskine Hawkins Bama St.coll.\tIf You Leave Me\tVOCALION\t3545\t21005\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC609-1.mp3\tHal Kemp And His Orch\tIf You Lived In The Mountains\tBRUNSWICK\t6656\tC609-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_228.mp3\tJan Garber And His Orchestra\tIf You Love Me\tDECCA\t733A\tC90620-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN7056-B.mp3\tImperial Dance Orch\tIf You Loved Mary\tBanner\t7056-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74214.mp3\tBuddy Johnson And His Orch.\tIf You Never Return\tDECCA\t24641\t74214\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63710-A.mp3\tElla Fitzgerald And Her Savoy Eight\tIf You Only Knew\tDecca\t1967\t63710-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3173.mp3\tBing Crosby & Darby Singers\tIf You Please\tDECCA\t18561B\tL3173\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030453-1.mp3\tMezz Mezzrow-t.ladnier Qt\tIf You See Me Comin'\tBLUEBIRD\t10087\t030453-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu030453-1.mp3\tMezz Mezzrow - Ladnier Quintet\tIf You See Me Comin'\tBluebird\tB-10087\t030453-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAEOVB3187.mp3\tCount Basie Octet\tIf You See My Baby\tRCA\t(VIC-LP)\tEOVB3187\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_075.mp3\tTed Lewis And His Band\tIf You See Sally\tCOLUMBIA\t844 D\tW142963-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010559.mp3\tTommy Dorsey & His Clambake 7\tIf You Should Ever Leave\tVICTOR\t25605\t010559\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC21332.mp3\tMildred Bailey & Her Orchestra\tIf You Should Ever Leave Me\tVOCALION\t3615\t21332\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/BRULA984-A.mp3\tBing Crosby (vocal W Orch)\tIf You Should Ever Need Me\tBRUNSWICK\t6090\tLA984-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4779.mp3\tBing Crosby & Ken Darby Choir\tIf You Stub Your Toe On The Moon\tDECCA\t24524\tL4779\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC11305-2.mp3\tBilly Murray\tIf You Talk In Your Sleep\tVICTOR\t17025\t11305-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_472.mp3\tAmes Brothers\tIf You Wanna See Mamie Tonight\tRCA\t6481\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_1103_01.mp3\tLee Morse And Her Bluegrass Boys\tIf You Want The Rainbow\tColumbia\t1659DA\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22770-1.mp3\tMildred Bailey & Her Orchestra\tIf You Were In My Place\tVOCALION\t4109\t22770-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_188.mp3\tDuke Ellington And His Famous Orchestra Feat. V/ivie Anderson\tIf You Were In My Place (what Would You Do?)\tBRUNSWICK\t8093\tM770\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB18209.mp3\tTeddy Wilson & His Orch\tIf You Were Mine (vbh)\tCOLUMBIA\t36206\tB18209\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59030.mp3\tWashboard Rhythm Kings\tIf You Were Only Mine\tVICTOR\t23367\t59030\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD9VB1848-2.mp3\tRose Murphy (the Chee-chee Girl)\tIf You Were Only Mine\tVictor\t20-3534\tD9VB1848-2\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011713.mp3\tTommy Dorsey & His Orch\tIf You Were Someone Else\tVICTOR\t25649\t011713\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_196.mp3\tPerry Como Feat. Russell Case's Orchestra\tIf You Were The Only Girl In The World\tRCA VICTOR\t1857\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81516-5.mp3\tThe Georgians\tIf You'll Come Back\tColumbia\t102-D\t81516-5\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB5029.mp3\tRay Noble & His Orch\tIf You'll Say Yes, Cherie\tVICTOR\t24420\tOB5029\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63252-A.mp3\tBob Howard's Boys\tIf You're A Viper\tDECCA\t1698\t63252-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/VARM584-1.mp3\tCharlie Barnet And His Orch\tIf You're Ever In My Arms Again\tVARIETY\tI627\tM584-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUC-3941.mp3\tWalter Barnes And His Royal Creolians\tIf You're Thinking Of Me\tBRUNSWICK\t4480\tC-3941\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4189.mp3\tLefty Frizell\tIf You've Got The Money, I've Got The Time\tCOLUMBIA\t20739\tHCO4189\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_155.mp3\tJo Stafford\tIf You've Got The Money, I've Got The Time\tCOLUMBIA\t39065\tHCO4304\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0817_02.mp3\tLee Morse\tIf Youre Missing Me\tPathe\t25197B\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1950_0519_02.mp3\tLee Morse\tIfyouonlyknew\tDecca\t27066B\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic036963-1.mp3\tDon Redman And His Orchestra\tIgloo\tVictor\t26258\t036963-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Bru38429-A.mp3\tArt Tatum\tIii Wind\tBrunswick\t02051\t38429-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64941-AB.mp3\tMary Martin - Woody Herman\tIl Bacio\tDECCA\t2377B\t64941-AB\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic87001.mp3\tEnrico Caruso\tIl Travatore-di Quella Pira\tVictrola\t87001\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_110.mp3\tEnrico Caruso - Frances Alda\tIl Trovatore - Miserere (i Have Sighed To Rest Me)\tVICTROLA\t89030\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3a/MELM-12949x.mp3\tWill Osborne And His Orch\tIll Wind\tMelotone\tM-12949\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC81755-1.mp3\tEddy Duchin & His Orch\tIll Wind\tVICTOR\t24579\t81755-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC041599.mp3\tMaxine Sullivan\tIll Wind\tVICTOR\t26344\t041599\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic066793-2.mp3\tBenny Carter And His Orchestra\tIll Wind\tVictor\tRA-5335\t066793-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480567.mp3\tBen Webster Quintet\tIll Wind\tVerve\tMGV8274\t21743-5\t1957\tBen Webster (ts), Oscar Peterson P, Stan Levey, D, Ray Brown, B\nhttp://www.jazz-on-line.com/a/mp3a/BRU14951-C.mp3\tLeo Reisman And His Orch\tIll Wind (you're Blowin' Me No Good) (vphil Neely)\tBRUNSWICK\t6789\t14951-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_046.mp3\tEddy Duchin And His Orchestra Feat. V/harold Arlen\tIll Wind (you're Blowing Me No Good)\tVICTOR\t24569\t81701-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLRR138A.mp3\tIllinois Jacquet And His Orch\tIllinois Blows The Blues\tALLADDIN\t3001\tRR138A\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVS5875.mp3\tIllinois Jacquet Orch\tIllinois Goes To Chicago\tSAVOY\t911\tS5875\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35436-A.mp3\tVictor Dance Orch\tIllusion Valse\tVictor\t35436-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU74849-1.mp3\tBennie Moten's Kansas City Or.\tImagination\tBLUEBIRD\t5078\t74849-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE27626.mp3\tRed Nichols & His 5 Pennies\tImagination\tBRUNSWICK\t6823\tE27626\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW81296.mp3\tMiff Mole & Little Molers\tImagination\tCOLUMBIA\t35687\tW81296\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67198.mp3\tElla Fitzgerald & Her Orch\tImagination\tDECCA\t3078B\t67198\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYHL14.mp3\tColeman Hawkins Qt\tImagination\tKEYNOTE\t612\tHL14\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_067.mp3\tTommy Dorsey And His Orchestra\tImagination\tVICTOR\t26581\t048430-3\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-6948-1.mp3\tValaida (queen Of The Trumpet) With Billy Mason And His Orchestra\tImagination\tParlophone\tF-230\tCE-6948-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_226.mp3\tElla Fitzgerald\tImagination\tDECCA\t3078B\t67198\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480445.mp3\tArt Pepper\tImagination\tContinental\tC3532\t\t1957\tRed Grland, P, Philly Jo Jones, D, Paul Chambers, B\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1382-1.mp3\tGeorgie Auld & Ho\tImagination (v K. Foster)\tVARSITY\t8199\tUS1382-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC048430-3.mp3\tTommy Dorsey And His Orch\tImagination (vfs)\tVICTOR\t26581\t048430-3\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU047067.mp3\tGlenn Miller And His Orch\tImagination (vre)\tBLUEBIRD\t10622 A\t047067\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU030366.mp3\tFats Waller And His Rhythm\tImagine My Surprise\tBLUEBIRD\t10062\t030366\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D331B.mp3\tTommy Tucker And His Orchestra (the Three Two\tImers Voc.) - An Hour Never Passes\tV-DISC\t331B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/COL17679.mp3\tVic Berton And His Orchestra\tImitations Of You\tCOLUMBIA\t3092 D\t17679\t\t\nhttp://www.jazz-on-line.com/a/mp3h/VocE-4321.mp3\tDuke Ellington And His Kentucky Club Orchestra\tImmigration Blues\tVocalion\t1077\tE-4321\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL247.mp3\tErroll Garner Trio\tImpressions\tATLANTIC\t665\t247\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC1001I.mp3\tJames P Johnson\tImpressions\tASCH\t1001\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69683.mp3\tJimmie Lunceford & His Orch\tImpromptu\tDECCA\t4083B\t69683\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc24995-A.mp3\tJohn Kirby And His Orchestra\tImpromptu\tVocalion\t5570\t24995-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69883-A.mp3\tJimmie Lunceford And His Orchestra\tImpromptu\tDecca\t4083\t69883-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72621.mp3\tEddie Condon & His Orchestra\tImpromptu Ensemble No.1\tDECCA\t23718\t72621\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/HMWOLA-1739-1.mp3\tDjango Reinhardt\tImprovisation\tHMW\tB-8587\tOLA-1739-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73481.mp3\tEddie Condon & His Orch\tImprovisation For March Of Time\tDECCA\t23600\t73481\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDR-2908-1.mp3\tDjango Reinhardt\tImprovisation No 2\tDECCA\tF-6935\tDR-2908-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-329-1.mp3\tDjango Reinhardt\tImprovisation No 3 (part 1)\tSWING\t225\tOSW-329-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-329-2.mp3\tDjango Reinhardt\tImprovisation No 3 (part 2)\tSWING\t225\tOSW-329-2\t1943\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480860.mp3\tAlec Templeton (voice And Piano Impression)\tImprovisation On Five Varied Melodies\tGRAMOPHONE SHOP VARI\t\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW146607.mp3\tLeo Reisman & His Orch\tIn A Bamboo Garden\tCOLUMBIA\t1467 D\tW146607\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULAE975.mp3\tAbe Lyman's California Orch\tIn A Cafe On The Road To Calais\tBRUNSWICK\t6094\tLAE975\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC28476-2.mp3\tBenson Orchestra Of Chicago\tIn A Covered Wagon With You\tVICTOR\t19147\t28476-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_091.mp3\tBenson Orchestra Of Chicago\tIn A Covered Wagon With You\tVICTOR\t19147\t28476-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_187.mp3\tJoni James\tIn A Garden Of Roses\tMGM\t11753\t53S6196\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_226.mp3\tAnnette Hanshaw\tIn A Great Big Way\tHARMONY\t832\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19626.mp3\tDuke Ellington's Orch\tIn A Jam\tBRUNSWICK\t7734\t19626\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-19626-1.mp3\tDuke Ellington And His Orchestra\tIn A Jam\tBrunswick\t7734\tB-19626-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480660.mp3\tDuke Ellington And His Orchestra\tIn A Jam\tBrunswick\t7734\t19626-1\t1936\tIvie Anderson (vo), Arthur Whetsel, Cootie Williams (tp), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (as, bsx), Barney Bigard (cl, ts), Ben Webster (ts), Duke Ellington (p), Fred Guy (g), Hayes Alvis, Billy Taylor (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1938_356.mp3\tJan Garber And His Orchestra\tIn A Little Dutch Kintergarden\tBRUNSWICK\t8111\tLA1591\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17739.mp3\tLouis Prima And His Gang\tIn A Little Gypsy Tea Room\tBRUNSWICK\t7479\t17739\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC39723.mp3\tBob Howard & His Orchestra\tIn A Little Gypsy Tea Room\tDECCA\t513A\t39723\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39564.mp3\tBob Crosby And His Orchestra\tIn A Little Gypsy Tea Room\tDECCA\t478B\t39564\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_009.mp3\tBob Crosby And His Orchestra Feat. Frank Tennille\tIn A Little Gypsy Tea Room\tDECCA\t478B\t39564\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_035.mp3\tJan Garber And His Orchestra\tIn A Little Gypsy Tea-room\tVictor\t25013\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-17739-1.mp3\tLouis Prima And His New Orleans Gang\tIn A Little Gypsy Tearoom\tBrunswick\t7479\tB-17739-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62778.mp3\tLani Mcintyre And His Hawaiians\tIn A Little Hula Heaven\tDECCA\t1592\t62778\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC04928.mp3\tTommy Dorsey And His Orch\tIn A Little Hula Heaven\tVICTOR\t25532\t04928\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA729-B.mp3\tJimmy Dorsey And His Orchestra With Bing Crosby\tIn A Little Hula Heaven \tDECCA\t\tDLA729-B \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA729-A.mp3\tJimmy Dorsey And His Orchestra With Bing Crosby\tIn A Little Hula Heaven \tDECCA\t\tDLA729-A \t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36067-8.mp3\tPaul Whiteman And His Orch\tIn A Little Spanish Town\tVICTOR\t20266A\t36067-8\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COL17381-1.mp3\tGlenn Miller & His Orch\tIn A Little Spanish Town\tCOLUMBIA\t35881\t17381-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8992IA.mp3\tLester Young & His Orch\tIn A Little Spanish Town\tMERCURY\t8992\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL8849.mp3\tBing Crosby\tIn A Little Spanish Town\tDECCA\t29850\tL8849\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_324.mp3\tDavid Carroll And His Orchestra\tIn A Little Spanish Town\tMERCURY\t70444\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_282.mp3\tBing Crosby And The Buddy Cole Trio\tIn A Little Spanish Town ('twas On A Night Like This)\tDecca\t29850\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC11431-2.mp3\tAl Campbell & Henry Burr\tIn A Little While\tVICTOR\t17237\t11431-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_100.mp3\tHenry Burr And Albert Campbell\tIn A Little While\tCOLUMBIA\t1129\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D309B1.mp3\tRaymond Scott And His Orchestra\tIn A Magic Garden\tV-DISC\t309B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC053428.mp3\tDuke Ellington And His Orch\tIn A Mellotone\tVICTOR\t26788\t053428\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE81426-B.mp3\tBix Beiderbecke (piano)\tIn A Mist\tOKeh\t40916\t81426-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14361-A.mp3\tRed Norvo Quartet\tIn A Mist\tBRUNSWICK\t8236\t14361-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030168.mp3\tBunny Berigan & His Orch\tIn A Mist\tVICTOR\t26123A\t030168\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14850-A.mp3\tFrankie Trumbauer & His Orch\tIn A Mist\tBRUNSWICK\t6997\t14850-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_233.mp3\tBix Beiderbecke\tIn A Mist\tOKeh\t40916\t81426-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035051.mp3\tCharlie Barnet & His Orch\tIn A Mizz\tBLUEBIRD\t10191\t035051\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14248.mp3\tFreddy Martin And His Orch\tIn A One Room Flat\tBRUNSWICK\t6690\t14248\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_191.mp3\tLarry Clinton And His Orchestra\tIn A Persian Market\tVICTOR\t26283A\t037603\t1939\t\nhttp://www.jazz-on-line.com./a/mp3o/MERYB9027.mp3\tRalph Marterie & His Orchestra\tIn A Persian Market\tMERCURY\t5860\tYB9027\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU17406-1.mp3\tDuke Ellington And His Orch\tIn A Sentimental Mood\tBRUNSWICK\t7461\t17406-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC102214-2.mp3\tBenny Goodman And His Orchestra\tIn A Sentimental Mood\tVICTOR\t25351\t102214-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC171.mp3\tBilly Eckstine & His Orch\tIn A Sentimental Mood\tNATIONAL\t\tNSC171\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/HMVOLA-1718-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tIn A Sentimental Mood\tHMV\tB-8629\tOLA-1718-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU7461.mp3\tDuke Ellington And His Orch\tIn A Sentimental Mood\tBRUNSWICK\t7461\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_280.mp3\tMills Blue Rhythm Band\tIn A Sentimental Mood\tCOLUMBIA\t3148 D\t19687-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-19687-1.mp3\tMills Blue Rhythm Band\tIn A Sentimental Mood\tColumbia\t3148-D\tCO-19687-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480446.mp3\tArt Tatum And Roy Eldridge\tIn A Sentimental Mood\tClef\tMGC679\t2308-4\t1955\tRoy Eldridge (tp), Art Tatum (p), John Simmons (sb), Alvin Stoller (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480617.mp3\tThe Art Tatum Quartet\tIn A Sentimental Mood\tClef\tMGC679\t2308-4\t1955\tRoy Eldridge (tp), Art Tatum(p), John Simmons (sb), Alvin Stoller (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480688.mp3\tArt Tatum\tIn A Sentimental Mood\tClef\tEP-273\t1453-1\t1953\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3w/1935_198.mp3\tDuke Ellington And His Famous Orchestra\tIn A Sentimental Mood2\tBRUNSWICK\t7461\t17406-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152137-2.mp3\tTed Lewis And His Band, Vocal By Ted Lewis\tIn A Shanty In Old Shanty Town\tCOLUMBIA\t2652-D\tW152137-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23622A.mp3\tJohnny Long\tIn A Shanty In Old Shanty Town\tDECCA\t23622\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC23622.mp3\tJohnny Long\tIn A Shanty In Old Shanty Town\tDECCA\t23622\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec03409.mp3\tJohnny Long & His Orchestra\tIn A Shanty In Old Shanty Town\tDecca\t03409\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D332B2.mp3\tJohnny Long And His Orchestra\tIn A Shanty In Old Shanty Town\tV-DISC\t332B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_183.mp3\tJohnny Long And His Orchestra\tIn A Shanty In Old Shanty Town\tDECCA\t3409A\t68083\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_197.mp3\tSomethin' Smith And The Redheads\tIn A Shanty In Old Shanty Town\tEpic\t9168\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWCO26317-B.mp3\tRaymond Scott & His Orch\tIn A Subway Far From Ireland\tCOLUMBIA\t36211\tWCO26317-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3l/COL81143.mp3\tLeo Reisman & His Orch\tIn A Tent\tCOLUMBIA\tA-3960\t81143\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3605.mp3\tCarmen Cavallaro\tIn Acapulco\tDECCA\t23457\tL3605\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_122.mp3\tGuy Lombardo And His Royal Canadians\tIn An 18th Century Drawing Room\tDecca\t2701\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COL24742.mp3\tRaymond Scott Quintet\tIn An Eighteenth Century Drawing Room\tCOLUMBIA\t35347\t24742-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043909.mp3\tGlenn Miller & His Orch\tIn An Old Dutch Garden (vre)\tBLUEBIRD\t10553\t043909\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM692.mp3\tCab Calloway & His Orchestra\tIn An Old English Village\tVOCALION\t3912\tM692\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA2153.mp3\tAndy Iona & His Orch\tIn An Old Hawaiian Village\tCOLUMBIA\t35843\tLA2153\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/ARC17176-1.mp3\tVic Berton And His Orchestra\tIn Blinky Winky Chinatown\tARC\tVO2964\t17176-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC62599-2.mp3\tJimmie Lunceford And His Chickasaw Syncopators\tIn Dat Mornin'\tVICTOR\t38141\t62599-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW265149.mp3\tJoe Venuti's Blue Five\tIn De Ruff\tCOLUMBIA\t\tW265149\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_063.mp3\tHenry Burr\tIn Dear Old Georgia\tEdison\t9099\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_038.mp3\tHaydn Quartet\tIn Dear Old Georgia\tVictor\t4522\tB2838-1\t1906\t\nhttp://www.jazz-on-line.com/a/mp3b/Aja31578.mp3\tPorter Grainger\tIn Harlem's Araby\tAjax\t17039\t31578\t1924\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI4946-C.mp3\tArthur Collins - Byron G. Harlan - O\tIn Honeysuckle Time\tEDISON\tBA 3025\t4946-C\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT672-1.mp3\tMildred Bailey W E.sauter\tIn Love In Vain\tMAJESTIC\t1034\tT672-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_166.mp3\tMargaret Whiting\tIn Love In Vain\tCapitol\t240\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_169.mp3\tHelen Forrest And Dick Haymes Feat. D/earle Hagen\tIn Love In Vain\tDECCA\t23528\tL4088\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC43522-6.mp3\tGene Austin\tIn My Bouquet Of Memories\tVICTOR\t21374\t43522-6\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_159.mp3\tGene Austin Feat. O/nat Shilkret\tIn My Bouquet Of Memories\tVICTOR\t21374\t43522-6\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60823.mp3\tJimmie Davis\tIn My Cabin Tonight\tDECCA\t5231\t60823\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74622.mp3\tElla Fitzgerald\tIn My Dreams\tDECCA\t24529\t74622\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/CONC3764-1.mp3\tMemphis Minnie\tIn My Girlish Days\tCONQUEROR\t9933\tC3764-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20010-A.mp3\tWaring's Pennsylvanians\tIn My Gondola\tVICTOR\t20010\t34744-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3o/HMVBb-8388.mp3\tThe Savoy Orpheans With Vocal Refrain By Ramon Newton\tIn My Gondola\tHMV\tB 5066\tBb-8388\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC6123.mp3\tIsham Jones And His Orch\tIn My Heart It's You\tBRUNSWICK\t4914\tC6123\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011093.mp3\tTommy Dorsey & His Clambake 7\tIn My Meditations\tVICTOR\t25625\t011093\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COL03564.mp3\tBilly Murray (tenor)\tIn My Merry Oldsmobile\tCOLUMBIA\tA-0491\t03564\t1906\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic4467.mp3\tBilly Murray\tIn My Merry Oldsmobile\tVictor\t4467\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-0491.mp3\tBilly Murray (tenor)\tIn My Merry Oldsmobile\tCOLUMBIA\tA-0491\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA0491.mp3\tBilly Murray\tIn My Merry Oldsmobile\tCOLUMBIA\tA0491\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_004alt.mp3\tBilly Murray\tIn My Merry Oldsmobile\tVICTOR\t16248\tB2706-6\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_079.mp3\tArthur Collins And Byron Harlan\tIn My Merry Oldsmobile\tZONOPHONE\t290\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63575.mp3\tBob Howard & His Orch\tIn My Mizz\tDECCA\t1869A\t63575\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC263-B.mp3\tBilly Eckstine & His Octet\tIn My Solitude\tNATIONAL\t\tNSC263-B\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145501-1.mp3\tArt Gillam\tIn My Sweetheart's Arms\tCOLUMBIA\t1429 D\tW145501-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/COL41331MW.mp3\tFrankie Laine\tIn My Wildest Dreams\tCOLUMBIA\t41331\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62447-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tIn My Wildest Dreams\tDecca\t1579\t62447-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5132.mp3\tLeadbelly\tIn New Orleans\tMUSICRAFT\t312\t5132\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol2982.mp3\tArt Hickman's Orchestra\tIn Old Manila\tColumbia\t2982\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDIV2891-G.mp3\tIrving Kaufman & Lou Gould And His Orchestra\tIn Old Tijuana\tDIVA\t2891-G\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh195.mp3\tJoe Loss And His Orchestra\tIn Pinetops Footsteps\tHMV\tBD-5830\tOEA-10100-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC12067-2.mp3\tArthur Collins\tIn Ragtime Land\tVICTOR\t17126\t12067-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_063.mp3\tArthur Collins\tIn Ragtime Land\tVICTOR\t17126\t12067-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU055176.mp3\tEarl Hines & His Orch\tIn Swamp Lands\tBLUEBIRD\t11036\t055176\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu055176-1.mp3\tEarl Hines And His Orchestra\tIn Swamp Lands\tBluebird\tB-11036\t055176-1\t1940\tHarry \"Pee Wee\" Jackson, Rostelle Reese, Leroy White (tp) Joe McLewis, John Ewing, Edward Fant (tb) Leroy Harris, Scoops Carey (as) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck Parham (b) Alvin Burroughs (d) Billy Eckstine, Madeline Greene (vcl) The Three Varieties (vcl trio\nhttp://www.jazz-on-line.com/a/mp3c/COL79152-3.mp3\tAl Jolson\tIn Sweet September\tCOLUMBIA\tA-2946\t79152-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_052.mp3\tAl Jolson\tIn Sweet September\tCOLUMBIA\tA-2946\t79152-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/PARP2623-2.mp3\tLovie Austin Blue Serenaders\tIn The Alley Blues\tPARAMOUNT\t12391\tP2623-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC70774.mp3\tLionel Hampton And His Orch.\tIn The Bag\tDECCA\t18394B\t70774\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70774-A.mp3\tLionel Hampton And His Orchestra\tIn The Bag\tDecca\t18394\t70774-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_158.mp3\tVernon Dalhart\tIn The Baggage Coach Ahead\tVICTOR\t19627\t32226-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10980.mp3\tFrankie Laine\tIn The Beginning\tCOLUMBIA\t40378\tRHCO10980\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dia902z.mp3\tErroll Garner\tIn The Beginning\tDial\t902\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC2680.mp3\tWendell Hall\tIn The Big Rock Candy Mountains\tBRUNSWICK\t4174\tC2680\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC075282.mp3\tTommy Dorsey And His Orch\tIn The Blues Of The Evening (vfs)\tVICTOR\t27947\t075282\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU02192.mp3\tShep Fields Rippling Rhythm\tIn The Chapel In The Moonlight\tBLUEBIRD\t6640\t02192\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61478-A.mp3\tRuth Etting\tIn The Chapel In The Moonlight\tDECCA\t1084\t61478-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_363.mp3\tRuth Etting\tIn The Chapel In The Moonlight\tDECCA\t1084\t61478-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_025.mp3\tKitty Kallen\tIn The Chapel In The Moonlight\tDECCA\t29130\t85628\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_350.mp3\tThe Four Knights\tIn The Chapel In The Moonlight\tCapitol\t2840\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_014.mp3\tShep Fields And His Rippling Rhythm Orchestra\tIn The Chapel In The Moonlight\tBluebird\t6640A\t2192\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP987.mp3\tKing Cole Trio\tIn The Cool Of The Evening\tCAPITOL\t\t987\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL6318.mp3\tBing Crosby & Jane Wyman\tIn The Cool, Cool, Cool Of The Evening\tDECCA\t27678\tL6318\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_081.mp3\tBing Crosby And Jane Wyman\tIn The Cool, Cool, Cool Of The Evening\tDECCA\t27678\tL6318\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030338.mp3\tBunny Berigan & His Orch\tIn The Dark\tVICTOR\t26122A\t030338\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN12629-1.mp3\tCliff Martin Orchestra\tIn The Dim, Dim Dawning\tBANNER\t32628\t12629-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC29807-3.mp3\tJean Goldkette & His Orch\tIn The Evening\tVICTOR\t19308\t29807-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75279.mp3\tElla Fitzgerald / Sy Oliver\tIn The Evening\tDECCA\t24780\t75279\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/VICB2451-8.mp3\tHaydn Qt\tIn The Evening By The Moonlight\tVICTOR\t17305\tB2451-8\t1909\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLRR611-1.mp3\tCharles Brown Trio\tIn The Evening When The Sun Goes Down\tALLADDIN\t3030\tRR611-1\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022429-2.mp3\tFats Waller And His Rhythm\tIn The Gloaming\tVICTOR\t25847\t022429-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68798.mp3\tLouis Armstrong & His Orch.\tIn The Gloaming\tDECCA\t3825B\t68798\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D302B1.mp3\tMaj. Glenn Miller And The Aaftc Orchestra\tIn The Gloaming\tV-DISC\t302B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_062.mp3\tWill Oakland And American Quartet\tIn The Gloaming\tVictor\t16646\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D302.mp3\tGlenn Miller Aaftc Band\tIn The Gloaming - Deep Purple\tV-DISC\t302\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_103.mp3\tMurry K. Hill\tIn The Good Old Steamboat Days\tEdison\t9619\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_001.mp3\tHaydn Quartet\tIn The Good Old Summer Time\tVictor\t1793\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61951-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tIn The Groove\tDecca\t1261\t61951-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC65041.mp3\tChick Webb And His Orch\tIn The Groove At The Grove\tDECCA\t2323B\t65041\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30462.mp3\tWill Bradley And His Orch\tIn The Hall Of The Mountain King\tCOLUMBIA\t36286\tCO30462\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU065943.mp3\tAlvino Rey & His Orch\tIn The Hall Of The Mountain King\tBLUEBIRD\t11216\t065943\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_025.mp3\tHenry Burr\tIn The Heart Of The City That Has No Heart\tVictor\t17544\t14398-1\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC73324.mp3\tJimmie Rodgers\tIn The Hills Of Tennessee\tVICTOR\t23736\t73324\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_0703_02.mp3\tLee Morse And Her Bluegrass Boys\tIn The Hush Of The Night\tColumbia\t1896DB\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU41740.mp3\tJimmie Rodgers\tIn The Jailhouse Now\tBLUEBIRD\t5223\t41740\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC87157.mp3\tWebb Pierce\tIn The Jailhouse Now\tDECCA\t29391\t87157\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_016.mp3\tVan And Schenck\tIn The Land O Yamo Yamo\tVICTOR\t18443\t21298-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_063.mp3\tCharles Harrison\tIn The Land Of Beginning Again\tVictor\t18523\t22493.\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/COL03764.mp3\tArthur Collins\tIn The Land Of Harmony\tCOLUMBIA\tDR3764\t03764\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_056.mp3\tArthur Collins\tIn The Land Of Harmony\tCOLUMBIA\tDR3764\t03764\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_105.mp3\tAmerican Quartet\tIn The Land Of Harmony\tVictor\t16898\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_103alt.mp3\tHenry Burr And Albert Campbell\tIn The Land Of Love With The Songbirds\tVICTOR\t17721\t15273-3\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN6287-B.mp3\tNathan Glantz And His Orch\tIn The Light Of My Baby's E\tBanner\t6287-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU7797.mp3\tBilly Jones And Ernest Hare\tIn The Little Red Red School House\tBRUNSWICK\t2270\t7797\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_057.mp3\tAmerican Quartet\tIn The Little Red School House\tVictor\t18904\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_014.mp3\tErnest Hare And Billy Jones\tIn The Little Red School House\tEDISON\t50962R\t8400-C\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65876.mp3\tJimmy Dorsey & His Orch.\tIn The Middle Of A Dream\tDECCA\t2580A\t65876\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24802-1.mp3\tRed Norvo & His Orch\tIn The Middle Of A Dream\tVOCALION\t4953\t24802-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU17458-1.mp3\tHal Kemp And His Orch\tIn The Middle Of A Kiss\tBRUNSWICK\t7437\t17458-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39673-A.mp3\tGeorgia Washboard Stompers\tIn The Middle Of A Kiss\tDECCA\t7096\t39673-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_202.mp3\tPied Pipers\tIn The Middle Of May\tCapitol\t225\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_189.mp3\tFreddy Martin And His Orchestra\tIn The Middle Of May\tRCA\t20-1747\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_084.mp3\tVaughn Monroe\tIn The Middle Of The House\tRCA Victor\t6619\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_158.mp3\tRusty Draper\tIn The Middle Of The House\tMercury\t70921\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0420_01.mp3\tLee Morse\tIn The Middle Of The Night\tPerfect\t11590A\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VicD9VB-1750.mp3\tLucky Millinder And His Orchestra\tIn The Middle Of The Night\tVictor\t20-3526\tD9VB-1750  \t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014669-2.mp3\tTommy Dorsey & His Orch\tIn The Mission By The Sea\tVICTOR\t25694\t014669-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1072-A.mp3\tBing Crosby Acc E.dunstedter\tIn The Mission By The Sea\tDECCA\t1565\tDLA1072-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA1072-A.mp3\tBing Crosby And Eddie Dunstedter\tIn The Mission By The Sea\tDecca\t1554  \tDLA1072-A  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038170.mp3\tGlenn Miller And His Orchestra\tIn The Mood\tBLUEBIRD\t10416\t038170\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26436-A.mp3\tTeddy Wilson And His Orchestra\tIn The Mood\tCOLUMBIA\t35372\t26436-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63297-A.mp3\tEdgar Hayes & His Orchestra\tIn The Mood\tDECCA\t1882B\t63297-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC85534.mp3\tGlenn Miller ''the Glenn Miller Story''\tIn The Mood\tDECCA\t29016\t85534\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBluB-10456.mp3\tGlenn Miller & His Orchestra\tIn The Mood\tBluebird\tB-10456\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D842.mp3\tGlenn Miller Army Air Force Band\tIn The Mood\tV-Disc\t842\t\t1944-\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_155.mp3\tGlenn Miller And His Orchestra\tIn The Mood\tRCA\t20-1565\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh072.mp3\tJoe Loss And His Band\tIn The Mood\tRegal Zonophone\tMR-3232\tCAR-5664-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478338.mp3\tLes Brown And His Band Of Renown\tIn The Mood\tCAPITOL\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDR-19894.mp3\tTed Heath And His Music\tIn The Mood For Mambo\tDECCA \t'ffrr' 1534\tDR-19894\t1954\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDR-19894.mp3\tTed Heath And His Music\tIn The Mood For Mambo\tDECCA\t1534\tDR-19894\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_099.mp3\tPied Pipers\tIn The Moon Mist\tCapitol\t243\t894\t1946\t\nhttp://www.jazz-on-line.com/a/mp3l/COL140555.mp3\tLeo Reisman & His Orch\tIn The Purple Twilight\tCOLUMBIA\t384D\t140555\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL519.mp3\tNite Owls\tIn The Royal Hawaiian Hotel\tVOCALION\t4159\tDAL519\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC017056-2.mp3\tLeo Reisman & His Orch\tIn The Sahde Of The New Apple Tree\tVICTOR\t25714\t017056-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC38672.mp3\tClaude Hopkins And His Orchestra\tIn The Shade Of The Old Apple Tree\tDECCA\t184B\t38672\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62322.mp3\tLouis Amrstrong & Mills Bros.\tIn The Shade Of The Old Apple Tree\tDECCA\t1495\t62322\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU13803-A.mp3\tDuke Ellington & His Orch\tIn The Shade Of The Old Apple Tree\tBRUNSWICK\t6646\t13803-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec62322-A.mp3\tLouis Armstrong With The Mills Brothers\tIn The Shade Of The Old Apple Tree\tDecca\t1495\t62322-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_010alt.mp3\tAlbert Campbell\tIn The Shade Of The Old Apple Tree\tCOLUMBIA\t3153\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_003.mp3\tHenry Burr (as Irving Gillette)\tIn The Shade Of The Old Apple Tree\tEdison\t8958\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_147.mp3\tDuke Ellington And His Famous Orchestra\tIn The Shade Of The Old Apple Tree\tBRUNSWICK\t6646\t13803-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_017.mp3\tHaydn Quartet\tIn The Shade Of The Old Apple Tree\tVictor\t4337\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_032.mp3\tHarry Macdonough\tIn The Shade Of The Palm\tVICTOR\t16061\tB1190-2\t1901\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC61143-A.mp3\tCarter Family\tIn The Shadow Of The Pines\tDECCA\t5359\t61143-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI2821-C.mp3\tReed Orchestra\tIn The Shadows - Graceful Dance (herman Finck)\tEDISON\t\t2821-C\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0123_00.mp3\tLee Morse And Her Bluegrass Boys\tIn The Sing Song Sycamore Tree\tColumbia\t1381DA\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5547.mp3\tArtie Shaw And His New Music\tIn The Still Of The Night\tMUSICRAFT\t390\t5547\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013354.mp3\tTommy Dorsey & His Orch\tIn The Still Of The Night\tVICTOR\t25663\t013354\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC166.mp3\tBilly Eckstine & His Orch\tIn The Still Of The Night\tNATIONAL\t\tNSC166\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1094-1.mp3\tDjango Reinhardt\tIn The Still Of The Night\tGramophone\tK-7898\tOLA-1094-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU21787.mp3\tLeo Reisman & His Orch\tIn The Still Of The Night\tBRUNSWICK\t7985\t21787\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_057.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tIn The Still Of The Night\tVICTOR\t25663\t013354\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_186.mp3\tFive Satins\tIn The Still Of The Nite\tEmber\t1005\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_084.mp3\tPeerless Quartet (aka Columbia Male Quartet)\tIn The Sweet Bye And Bye\tColumbia\t32722\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1902_024.mp3\tHaydn Quartet\tIn The Sweet Bye And Bye\tVictor\t1316\t\t1902\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_025.mp3\tJames F. Harrison And James Reed\tIn The Sweet Long Ago\tCOLUMBIA\tA-2164\t47215\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_017.mp3\tHenry Burr And Helen Clark\tIn The Valley Of The Moon\tVICTOR\t17587\t14748-2\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_052.mp3\tByron G. Harlan\tIn The Village By The Sea\tVICTOR\t2567\t-1\t1903\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_052alt.mp3\tByron G. Harlan\tIn The Village By The Sea\tVICTOR\t2567\t-2\t1904\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480508.mp3\tBen Webster And Oscar Peterson\tIn The Wee Small Hours Of The Morning\tVerve\tMGV8349\t22992-3\t1959\tBen Webster (ts), Oscar Peterson, P Ed Thigpen, D, Ray Brown, B\nhttp://www.jazz-on-line.com/a/mp3w/1907_018.mp3\tHaydn Quartet\tIn The Wildwood Where The Blue Bells Grew\tVictor\t5168\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_068.mp3\tFrank Stanley And Byron G. Harlan\tIn The Wildwood Where The Blue Bells Grew\tEDISON\t9567\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68971.mp3\tBuddy Johnson & His Band\tIn There\tDECCA\t8555B\t68971\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D209B1.mp3\tVaughn Monroe\tIn Times Like These\tV-DISC\t209B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU548.mp3\tThelonious Monk Qt\tIn Walked Bud\tBLUENOTE\tBN548\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480413.mp3\tArt Blakey And Thelonious Monk\tIn Walked Bud\tBlue Note\t548\tBN 318-3\t1957\tArt Blakey, D, Thelonious Monk, P, Bill Hardman, T, Johnny Griffin, Ts, Spanky DeBrest, B\nhttp://www.jazz-on-line.com/a/mp3t/TS480797.mp3\tArt Blakey And Thelonious Monk\tIn Walked Bud\tAtlantic\tLP1278\t2565\t1957\tArt Blakey, D, Thelonious Monk, P, Bill Hardman, T, Johnny Griffin, Ts, Spanky DeBrest, B\nhttp://www.jazz-on-line.com/a/mp3w/1951_240.mp3\tDinah Shore\tIn Your Arms\tRCA\t20-4019\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141802.mp3\tArt Gillam\tIn Your Green Hat\tCOLUMBIA\t614 D\tW141802\t1926\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR141339-2.mp3\tUniversity Six\tIn Your Green Hat\tHARMONY\t73-H\t141339-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU010134.mp3\tCharlie Barnet & His Orch\tIn Your Own Little Way\tBLUEBIRD\t6975\t010134\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-143-1.mp3\tHubert Rostaing, Aim Barelli Et Leur Orchestre (with Django Reinhardt)\tIndcision\tSWING\t87\tOSW-143-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-132-1.mp3\tDjango Reinhardt\tIndcision Et Le Quintette Du Hot Club De France\tSWING\t\tOSW-132-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64832.mp3\tWoody Herman & His Orchestra\tIndian Boogie Woogie (p Tommy Linehan)\tDECCA\t3383A\t64832\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403999-A.mp3\tLouis Armstrong & His Orch\tIndian Cradle Song\tOKeh\t41423\t403999-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145686-3.mp3\tBen Selvin & His Orch\tIndian Cradle Song\tCOLUMBIA\t1399 D\tW145686-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC42373-2.mp3\tCoon-sanders Orchestra\tIndian Cradle Song\tVICTOR\t21562\t42373-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU011906.mp3\tArthur Smith Trio\tIndian Creek\tBLUEBIRD\t7511\t011906\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/Mon024080.mp3\tArtie Shaw And His Orchestra\tIndian Love Call\tMontgomeryWard\tM-7525\t024080-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/IMP8156x.mp3\tSlim Whitman\tIndian Love Call\tIMPERIAL\t8156\tIF-368#3\t\t\nhttp://www.jazz-on-line.com/a/mp3o/BLUB-7746-A.mp3\tArtie Shaw And His Orchestra\tIndian Love Call\tBLUEBIRD\tB-7746-A\t024080-1\t1938\tFrom the musical comedy ''Rose-Marie''\nhttp://www.jazz-on-line.com/a/mp3b/VIC31415-5.mp3\tPaul Whiteman & His Orch\tIndian Love Call\tVICTOR\t19517A\t31415-5\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL6553.mp3\tLouis Armstrong - G.jenkins\tIndian Love Call\tDECCA\t28076\tL6553\t1951\t\nhttp://www.jazz-on-line.com/a/mp3l/COL140099.mp3\tLeo Reisman & His Orch\tIndian Love Call\tCOLUMBIA\t242D\t140099\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_096.mp3\tArtie Shaw And His Orchestra\tIndian Love Call\tMontgomeryWard\tM-7525\t024080-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_067.mp3\tSlim Whitman\tIndian Love Call\tIMPERIAL\t8156\tIF-368#3\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_130.mp3\tJeanette Macdonald And Nelson Eddy Feat. Nat Shilkret (director)\tIndian Love Call\tVictor\t4323\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC24323x.mp3\tJeannette Mcdonald\tIndian Love Call (w)\tVICTOR\t24323\tU.K.\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU046832-1.mp3\tSidney Bechet\tIndian Summer\tBLUEBIRD\t10623A\t046832-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC042738.mp3\tTommy Dorsey And His Orch\tIndian Summer\tVICTOR\t26390\t042738\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26340-A.mp3\tKay Kyser & His Orch\tIndian Summer\tCOLUMBIA\t35337\t26340-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66708.mp3\tJan Savitt And His Top Hatters\tIndian Summer\tDECCA\t2821A\t66708\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66988.mp3\tTony Martin - Ray Sinatra Orch\tIndian Summer\tDECCA\t2936B\t66988\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_016.mp3\tTommy Dorsey And His Orchestra\tIndian Summer\tV-DISC\t282\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh093.mp3\tAmbrose And His Orchestra\tIndian Summer (v. Jack Cooper)\tDecca\tF-7452\tDR-4516-1-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043354.mp3\tGlenn Miller & His Orch\tIndian Summer (vre)\tBLUEBIRD\t10495A\t043354\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35645-B.mp3\tConway's Band\tIndiana\tVICTOR\t35645\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE-29708.mp3\tRed Nichols And His Five Pennies\tIndiana\tBRUNSWICK\t6718\tE 29708\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COL401035.mp3\tEddie Condon Qt\tIndiana\tCOLUMBIA\t35950\t401035\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038255.mp3\tEarl Fatha Hines\tIndiana\tBLUEBIRD\t10391\t038255\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO45105.mp3\tErroll Garner Trio\tIndiana\tCOLUMBIA\t39273\tCO45105\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC17518-A.mp3\tMound City Blue Blowers\tIndiana\tVOCALION\t2973\t17518-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2071-A.mp3\tArt Tatum\tIndiana\tDECCA\t8550\tDLA2071-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COM582I.mp3\tEddie Heywood's Orchestra\tIndiana\tCOMMODORE\t582\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU87761.mp3\tKxyz Novelty Band\tIndiana\tBLUEBIRD\t5868\t87761\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-74347-C.mp3\tHarry James And His Orchestra\tIndiana\tBrunswick\t8366\tB-74347-C\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/VocM-294-1-2.mp3\tChu Berry And His Stompy Stevedores\tIndiana\tVocalion\t3824\tM-294-1-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77087.mp3\tOriginal Dixieland Jazz Band\tIndiana - One Step\tCOLUMBIA\tA-2297\t77087\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80175.mp3\tBilly Jones & Ernest Hare\tIndiana Lullaby\tCOLUMBIA\tA-3564\t80175\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_104.mp3\tBilly Jones And Ernest Hare\tIndiana Lullaby\tColumbia\t3564\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_072.mp3\tWilbur Sweatman's Original Jazz Band\tIndianola\tColumbia\t2611\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB16976.mp3\tDuke Ellington & His Orch\tIndigo Echoes\tCOLUMBIA\t37297\tB16976\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU48869-2.mp3\tJohnny Dodds Trio\tIndigo Stomp\tBLUEBIRD\t10238\t48869-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBan33015.mp3\tCharlie Barnet & His Orchestra\tInfatuation\tBanner\t33015\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_220.mp3\tGlen Gray And Casa Loma Orchestra Feat. Kenny Sargent, V\tInfatuation\tBRUNSWICK\t6791\t14925-A\t1934\tBobby Jones, Grady Watts, Sonny Dunham (tp), Billy Rauch, Pee Wee Hunt (tb), Glen Gray (as), Clarence Hutchinrider (cl, as, fl), Kenny Sargent (cl, as), Pat Davis (cl, ts, fl), Mel Jenssen (vn), Joe Hall (p), Jack Blanchette (g), Stanley Dennis (sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3c/BAN14986-1.mp3\tCharlie Barnet & His Orch\tInfatuation (v H. Heath)\tBANNER\t33015\t14986-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4594.mp3\tLouis Jordan & His Tympani 5\tInflation Blues\tDECCA\t24381\tL4594\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/COLHCO3017.mp3\tVictor Borge\tInflation Language\tCOLUMBIA 38183\t\tHCO 3017\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA105-A.mp3\tJimmy Durante\tInka Dinka Doo\tCOLUMBIA\t36732\tLA105-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_091.mp3\tJimmy Durante\tInka Dinka Doo\tBRUNSWICK\t6774\tLA105-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-687-1.mp3\tJimmie Noone And His Orchestra\tInka Dinka Doo - V E P \tVocalion \t2619\tC-687-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_196.mp3\tDean Martin\tInnamorata\tCapitol\t3352\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_203.mp3\tJerry Vale\tInnamorata (sweetheart)\tColumbia\t40634\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COL42327.mp3\tCoro Orch. Accomp.\tInno A Trieste\tCOLUMBIA\tE2574\t42327\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022436-2.mp3\tFats Waller And His Rhythm\tInside (vfw)\tVICTOR\t26045\t022436-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYKBF8.mp3\tBud Freeman & His Orch\tInside On The South Side\tKEYNOTE\t638\tKBF8\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC61388.mp3\tAllen Bros\tInspiration\tVICTOR\t23678\t61388\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC23678.mp3\tAllen Bros\tInspiration\tVICTOR\t23678\t61388\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/Con3006.mp3\tSarah Vaughan With Dizzy Gillespie And His Orchestra\tInterlude\tContinental\t6031\t3006\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/MUSG542.mp3\tBoyd Raeburn And His Orch\tInterlude - Night In Tunisia\tMUSICRAFT\t489\tG542-2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30070-1.mp3\tBenny Goodman And His Orchestra\tIntermezzo\tCOLUMBIA\t36050\tCO30070-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68743.mp3\tGuy Lombardo's Royal Canadians\tIntermezzo\tDECCA\t3674A\t68743\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D380B1.mp3\tCharlie Spivak And His Orchestra\tIntermezzo\tV-DISC\t380B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_143.mp3\tBenny Goodman And His Orchestra\tIntermezzo (a Love Story)\tCOLUMBIA\t36050\tCO30070-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP892-2R.mp3\tStan Kenton And His Orch\tIntermission Riff\tCAPITOL\t298\t892-2R\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC72370.mp3\tElla Fitzgerald And Ink Spots\tInto Each Life Some Rain Must Fall\tDECCA\t23356\t72370\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_015.mp3\tElla Fitzgerald And Ink Spots\tInto Each Life Some Rain Must Fall\tDECCA\t23356\t72370\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_245.mp3\tTeresa Brewer Feat. O/jack Pleis, Les Brown And His Band Of Renown\tInto Each Life Some Rain Must Fall\tDECCA\t60994\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_439.mp3\tDream Weavers Featuring Wade Buff\tInto The Night\tDecca\t29818\t89157\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S254.mp3\tBilly Eckstine\tIntrigue\tMGM\t10154\t47S254\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_347.mp3\tBilly Eckstine Feat. O/hugo Winterhalter\tIntrigue\tMGM\t10154\t47S254\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D325B1.mp3\tElla Mae Morse With Freddie Slack\tInvitation To The Blues\tV-DISC\t325B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3458.mp3\tBing Crosby - J.s.trotter Or.\tIowa\tDECCA\t18912\tL3458\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_008.mp3\tCharles Harrison\tIreland Must Be Heaven, For My Mother Came From There\tVICTOR\t18111\t18134-1\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_031.mp3\tEdith Day\tIrene\tVICTOR\t45176\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_038.mp3\tEnrico Caruso\tIris - Serenata\tVICTOR\t85048\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE9981-A.mp3\tLouis Armstrong's Hot Five\tIrish Black Bottom\tOKeh\t8447\t09981-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUCP1119.mp3\tHal Kemp & His Orch\tIrresistable (v S E)\tBRUNSWICK\t6985\tCP1119\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71903.mp3\tWoody Herman & His Orch\tIrresistable You\tDECCA\t18603B\t71903\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D227B1.mp3\tTommy Dorsey And His Orchestra\tIrresistible You\tV-DISC\t227B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_120.mp3\tTed Lewis And His Band\tIs Everybody Happy Now?\tCOLUMBIA\t1207 D\tW144991-5\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_197.mp3\tAmos 'n Andy\tIs Everybody In Your Family As Dumb As You Is?\tVICTOR\t22119\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD9VB1858.mp3\tRose Murphy (the Chee-chee Girl)\tIs I In Love? I Is\tVictor\t\tD9VB1858\t1949\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD8VB3455.mp3\tRose Murphy (the Chee-chee Girl)\tIs I In Love? I Is\tVictor\t\tD8VB3455\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5305.mp3\tStuff Smith And His Trio\tIs Is (v Stuff Smith)\tMUSICRAFT\t337\t5305\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec68548-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tIs It A Sin (my Loving You)\tDecca\t3619\t68548-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68548.mp3\tAndy Kirk & Clouds Of Joy\tIs It A Sin?\tDECCA\t3619A\t68548\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20819-B.mp3\tJohnny Hamp's Kentucky Serenade\tIs It Possible\tVictor\t20819-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65879.mp3\tJimmy Dorsey & His Orch.\tIs It Possible?\tDECCA\t2577B\t65879\t1939\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW144460.mp3\tLeo Reisman & His Orch\tIs It Possible?\tCOLUMBIA\t1095 D\tW144460\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC067747.mp3\tArtie Shaw And His Orchestra\tIs It Taboo (to Fal In Love With You)\tVICTOR\t27641A\t067747-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4846.mp3\tAl Jolson & Mills Brothers\tIs It True What They Say About Dixie\tDECCA\t24534\tL4846\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC18797-1.mp3\tWingy Manone & His Orch\tIs It True What They Say About Dixie?\tVOCALION\t3191\t18797-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU99972.mp3\tWillie Bryant & His Orch\tIs It True What They Say About Dixie?\tBLUEBIRD\t6362\t99972\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA319-A.mp3\tJimmy Dorsey And His Orchestra\tIs It True What They Say About Dixie?\tDECCA\t768B\tDLA319-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_010.mp3\tJimmy Dorsey And His Orchestra\tIs It True What They Say About Dixie?\tDECCA\t768B\tDLA319-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_202.mp3\tWillie Bryant And His Orchestra\tIs It True What They Say About Dixie?\tBluebird\t6362\t99972\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC41376-1.mp3\tCoon Sanders Nighthawk Orch\tIs She My Girl Friend?\tVICTOR\t21148\t41376-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_215.mp3\tCoon-sanders Orchestra\tIs She My Girl Friend?\tVICTOR\t21148\t41376-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE35879-A.mp3\tCab Calloway & His Orch\tIs That Religion?\tBRUNSWICK\t6020\tE35879-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_286.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton Vcl\tIs That The Way To Treat A Sweetheart?\tVICTOR\t26082\t025798\t1938\tHarry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Dave Matthews, Noni Bernardi (as), Arthur Rollini, Bud Freeman (ts), Jess Stacy (p), Ben Heller (g), Harry Goodman (sb), Dave Tough (dm)\nhttp://www.jazz-on-line.com/a/mp3a/VIC025798.mp3\tBenny Goodman And His Orchestra\tIs That The Way To Treat A Sweetheart? (vmt)\tVICTOR\t26082\t025798\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC47540-3.mp3\tHelen Kane\tIs There Anything Wrong In That ?\tVICTOR\t21684\t47540-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67119.mp3\tElla Fitzgerald & Her Orch\tIs There Somebody Else\tDECCA\t2988B\t67119\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_462.mp3\tDream Weavers Featuring Wade Buff\tIs There Somebody Else\tDecca\t29905\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_022.mp3\tHenry Burr And Albert Campbell\tIs There Still Room For Me 'neath The Old Apple Tree?\tColumbia\t1900\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65114.mp3\tCliff Bruner's Texas Wanderers\tIs This A Dream\tDECCA\t5719\t65114\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010558.mp3\tTommy Dorsey & His Clambake 7\tIs This Gonna Be My Lucky Summer?\tVICTOR\t25610\t010558\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D358A2.mp3\tThe Andrews Sisters\tIs You Is Or Is You Ain't Ma Baby\tV-DISC\t358A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D158B1.mp3\tLouis Jordan\tIs You Is Or Is You Ain't My Baby\tV-DISC\t158B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC8659B.mp3\tLouis Jordan Tympany 5\tIs You Is Or Is You Ain't My Baby\tDECCA\t8659B\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL3205.mp3\tLouis Jordan Tympani 5\tIs You Is Or Is You Ain't My Baby\tDECCA\t8659B\tL3205\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3450-A.mp3\tBing Crosby And Andrews Sisters\tIs You Is Or Is You Ain't My Baby?\tDECCA\t23350\tL3450-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03464-1.mp3\tBilly Murray (tenor)\tIs Your Mother In, Molly Malone\tCOLUMBIA\tA-0307\t03464-1\t1906\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D344B.mp3\tMuggsy Spanier And His V\tIsc All Stars - Peewee Speaks\tV-DISC\t344B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D312A.mp3\tPerry Como With Benny Goodman And His V\tIsc All-star Band - Goodbye Sue\tV-DISC\t312A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D302A1.mp3\tMildred Bailey With Benny Goodman's V\tIsc All-stars - These Foolish Things Remind Me Of You\tV-DISC\t302A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D302A2.mp3\tBenny Goodman And His V\tIsc Quartette - Hallelujah\tV-DISC\t302A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0800_04.mp3\tLee Morse\tIse Gwine Back To Dixie\tPathe\t25157B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA2154.mp3\tAndy Iona & His Orch\tIsland Serenade\tCOLUMBIA\t35844\tLA2154\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CHATB1495.mp3\tAl Bowlly\tIsle Of Capri\tCHAMPION\t40032\tTB1495\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70350x.mp3\tGaylords\tIsle Of Capri\tMERCURY\t70350\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOEA816-2.mp3\tRay Noble And His Orch\tIsle Of Capri\tVICTOR\t24771A\tOEA816-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5685a.mp3\tFrankie Laine\tIsle Of Capri\tMERCURY\t5685\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_087.mp3\tGaylords\tIsle Of Capri\tMERCURY\t70350\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480530.mp3\tArt Farmer Quintet\tIsle Of Capri\tPrestige\tPRLP209\t742\t1954\tArt Farmer, T, FLh, Gigi Gryce, As, With, 2 rhythm sections, = Horace Silver or Freddie Redd, P, Addison Farmer or Percy Heath, B, Art Taylor or Kenny Clark, D\nhttp://www.jazz-on-line.com/a/mp3t/TS480561.mp3\tBenny Golson\tIsle Of Capri\tContemporary\tC3552\t\t1957\tArt Farmer (tp), Jimmy Cleveland (tb), Julius Watkins (fhr), Gigi Gryce (as), Benny Golson (ts), Sahib Shihab (bar), Wynton Kelly (p), Paul Chambers (sb), Charlie Persip (dm)\nhttp://www.jazz-on-line.com/a/mp3a/BRU17735-1.mp3\tJ.green And Leo Reisman Orch\tIsn't It A Lovely Day?\tBRUNSWICK\t7487\t17735-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_275.mp3\tConnee Boswell Feat. Jimmy Grier's Orchestra\tIsn't It A Shame\tBRUNSWICK\t7303\tLA220\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COL265118.mp3\tJoe Venuti's Blue Five\tIsn't It Heavenly\tCOLUMBIA\t2783 D\t265118\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_033.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tIsn't It Heavenly?\tVICTOR\t24325\t76166-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480568.mp3\tThe Art Tatum Trio\tIsn't It Romantic\tPablo\t2310-735\t2675-2\t1956\tArt Tatum (p), Red Callender (sb), Jo Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3c/MER89026d.mp3\tBenny Carter & His Orch\tIsn't It Romantic?\tMERCURY\t89026\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU101576.mp3\tWingy Manone & His Orch\tIsn't Love The Strangest Thing\tBLUEBIRD\t6393\t101576\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18734.mp3\tDuke Ellington And His Famous\tIsn't Love The Strangest Thing?\tBRUNSWICK\t7625\t18734\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_170.mp3\tDuke Ellington And His Famous Orchestra Feat. Ivie Anderson\tIsn't Love The Strangest Thing?\tBRUNSWICK\t7625\t18734\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU15345.mp3\tGene Rodemich And His Orchestra\tIsn't She The Sweetest Thing\tBRUNSWICK\t2892A\t15345\t1925\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3c/OKE29166-1.mp3\tGene Krupa & His Orch\tIsn't That Just Like Love\tOKEH\t5935\t29166-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057611.mp3\tGlenn Miller & His Orch\tIsn't That Just Like Love (vjl)\tBLUEBIRD\t10936 B\t057611\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17735-1.mp3\tJ.green & Leo Reisman Orch\tIsn't This A Lovely Day ?\tARC\tBR7487\t17735-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_046.mp3\tFred Astaire Feat. Johnny Green And His Orchestra\tIsn't This A Lovely Day?\tBRUNSWICK\t7487\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC76166-1.mp3\tEddy Duchin & His Orch\tIsnt It Heavenly\tVICTOR\t24325\t76166-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO49734.mp3\tFour Lads\tIstanbul\tCOLUMBIA\t40082\tCO49734\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_072.mp3\tFour Lads Feat. Norman Leyden's Orchestra\tIstanbul (not Constantinople)\tCOLUMBIA\t40082\tCO49734\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_143.mp3\tBilly Jones And Ernest Hare\tIt Ain't Gonna Rain No Mo\tCOLUMBIA\t87D\t81562-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_143alt.mp3\tErnest Hare And Billy Jones\tIt Ain't Gonna Rain No Mo\tCOLUMBIA\t\t81562-\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC28741-2.mp3\tWendell Hall\tIt Ain't Gonna Rain No Mo'\tVICTOR\t19171\t28741-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/CONMEM33.mp3\tHank Penny's Radio Cowboys\tIt Ain't Gonna Rain No Mo'\tCONQUEROR\t9332\tMEM33\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148201-2.mp3\tGid Tanner's Skillet Lickers\tIt Ain't Gonna Rain No Mo'\tCOLUMBIA\t15447 D\tW148201-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81562-3.mp3\tBilly Jones & Ernest Hare\tIt Ain't Gonna Rain No Mo'\tCOLUMBIA\t87D\t81562-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_001.mp3\tWendell Hall\tIt Ain't Gonna Rain No Mo'\tVICTOR\t19171A\t28741-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU066880-1.mp3\tUna Mae Carlisle\tIt Ain't Like That\tBLUEBIRD\t11271\t066880-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC64.mp3\tBilly Eckstine & His Orch\tIt Ain't Like That\tNATIONAL\t\tNSC64\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18266.mp3\tLeo Reisman & His Orch\tIt Ain't Necessarily So\tBRUNSWICK\t7562\t18266\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA325.mp3\tBing Crosby W Victor Young\tIt Ain't Necessarily So\tDECCA\t806A\tDLA325\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_256.mp3\tBing Crosby\tIt Ain't Necessarily So\tDECCA\t25409\tDLA325\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401807-B.mp3\tFred Hall & His Sugar Babies\tIt Ain't No Fault Of Mine\tOKeh\t41269\t401807-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19668-2.mp3\tArtie Shaw And His Orchestra\tIt Ain't Right\tBRUNSWICK\t7721\tB-19668-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19500.mp3\tStuff Smith & Onyx Club Boys\tIt Ain't Right\tVOCALION\t3270\t19500\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102670.mp3\tWashboard Wonders\tIt Ain't Right\tBLUEBIRD\t6464\t102670\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_298.mp3\tFrank Froeba And His Swing Band Feat. Midge Williams\tIt All Begins And Ends With You\tCOLUMBIA\t3152 D\t19766-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU19749-1.mp3\tRed Norvo & His Orch\tIt All Begins And Ends With You (v M. Bailey)\tBRUNSWICK\t7732\t19749-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_218.mp3\tRuth Etting\tIt All Belongs To Me\tCOLUMBIA\t1113 D\tW144593\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE28890-1.mp3\tGene Krupa And His Orch\tIt All Comes Back To Me Now\tOKEH\t5883\t28890-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC055217.mp3\tHal Kemp And His Orch\tIt All Comes Back To Me Now\tVICTOR\t27255\t055217\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_198.mp3\tTed Weems And His Orchestra\tIt All Comes Back To Me Now\tDECCA\t3627A\t68632-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_130.mp3\tEddy Duchin And His Orchestra Feat. V/june Robbing\tIt All Comes Back To Me Now\tCOLUMBIA\t35867\t29103-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC38119-7.mp3\tPaul Whiteman And His Orch\tIt All Depends On You\tVICTOR\t20513\t38119-7\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL45.mp3\tPete Brown Qt\tIt All Depends On You\tKEYNOTE\t1312\tHL45\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW143551.mp3\tRuth Etting\tIt All Depends On You\tCOLUMBIA\t908 D\tW143551\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_084.mp3\tRuth Etting\tIt All Depends On You\tCOLUMBIA\t908 D\tW143551\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_216.mp3\tBen Bernie And His Orchestra Feat. V/scrappy Lambert And Billy Hillpot\tIt All Depends On You\tBRUNSWICK\t3464\t21525\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU21525.mp3\tBen Bernie & His Orch\tIt All Depends On You (v S L)\tBRUNSWICK\t3464\t21525\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67013-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tIt Always Will Be You\tDecca\t2957\t67013-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20092-1.mp3\tMildred Bailey W Red Norvo\tIt Can Happen To You\tBRUNSWICK\t7761\t20092-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU61395.mp3\tAllen Brothers\tIt Can't Be Done\tBLUEBIRD\t5533\t61395\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU5533.mp3\tAllen Brothers\tIt Can't Be Done\tBLUEBIRD\t5533\t61395\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3273.mp3\tBing Crosby\tIt Could Happen To You\tDECCA\t18580\tL3273\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44022.mp3\tErroll Garner Trio\tIt Could Happen To You\tCOLUMBIA\t39168\tCO44022\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC23686.mp3\tBing Crosby - J.s.trotter\tIt Could Happen To You\tDECCA\t23686\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D241A2.mp3\tBing Crosby\tIt Could Happen To You\tV-DISC\t241A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480414.mp3\tAhmad Jamal\tIt Could Happen To You\tArgo\tLP2638\t9024\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3c/MER216-1.mp3\tBuddy Rich & His Orch\tIt Couldn't Be True\tMERCURY\t3001\t216-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_172.mp3\tTex Beneke And The Glenn Miller Orchestra\tIt Couldn't Be True (or Could It?)\tRCA Victor\t1835\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141823.mp3\tArt Gillam\tIt Don't Do Nothing But Rain\tCOLUMBIA\t657 D\tW141823\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC73307.mp3\tBilly Banks And His Band\tIt Don't Mean A Thing\tVICTOR\t24148\t73307\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035394.mp3\tLionel Hampton & His Orch\tIt Don't Mean A Thing\tVICTOR\t26254\t035394\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DJB486.mp3\tDuke Ellington's Orch\tIt Don't Mean A Thing\tV-DISC\t795\tJB486\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDR3334.mp3\tMills Brothers\tIt Don't Mean A Thing\tDECCA\t2982A\tDR3334\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-3669id.mp3\tCharlie Ventura's Orch\tIt Don't Mean A Thing\tRCA\t20-3669\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU11204-A.mp3\tDuke Ellington And His Orch\tIt Don't Mean A Thing (if It Ain't Got That Swing)\tBRUNSWICK\t6265\t11204-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6265.mp3\tDuke Ellington & His Famous Orchestra\tIt Don't Mean A Thing (if It Ain't Got That Swing)\tBrunswick\t6265\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic035394-1.mp3\tLionel Hampton And His Orchestra\tIt Don't Mean A Thing (if It Ain't Got That Swing)\tVictor\t26254\t035394-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_064.mp3\tDuke Ellington And His Famous Orchestra Feat. Ivie Anderson, Johnny Hodges And Joe Nanton (solos)\tIt Don't Mean A Thing (if It Ain't Got That Swing)\tBRUNSWICK\t6265\t11204-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1879-1.mp3\tCharlie Palloy & His Orch\tIt Don't Mean A Thing (v C P)\tCROWN\t3392B\tC1879-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC12427.mp3\tWashboard Rhythm Kings\tIt Don't Mean A Thing If It Ain't Got That Swing\tVOCALION\t1724\t12427\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23935-1.mp3\tJohn Kirby & His Orch\tIt Feels So Good\tVOCALION\t4624\t23935-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21701-B.mp3\tJohnny Johnson And His Statler Pe\tIt Goes Like This\tVictor\t21701-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401136-C.mp3\tFred Hall & His Sugar Babies\tIt Goes Like This\tOKeh\t41123\t401136-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3446.mp3\tDick Haymes-helen Forrest\tIt Had To Be You\tDECCA\t23349\tL3446\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030390.mp3\tBenny Goodman And His Orchestra\tIt Had To Be You\tBLUEBIRD\t11056\t030390\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU2610-2.mp3\tMarion Harris W Arden-ohman\tIt Had To Be You\tBRUNSWICK\t2610\t-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUCH116-7.mp3\tIsham Jones And His Orch\tIt Had To Be You\tBRUNSWICK\t2614\tCH116-7\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP155y.mp3\tBetty Hutton\tIt Had To Be You\tCAPITOL\t155\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiSwi44.mp3\tPhilippe Brun ''jam'' Band\tIt Had To Be You\tSwing\t44\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/ASCT2.mp3\tArt Tatum\tIt Had To Be You\tASCH\t356-1\tT2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC29779-1.mp3\tPaul Whiteman & His Orch\tIt Had To Be You\tVICTOR\t19339A\t29779-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS1012.mp3\tKing Cole Quintet\tIt Had To Be You\tDISC\t2010\t1012\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDTB3533.mp3\tDjango Reinhardt\tIt Had To Be You\tDECCA\t23079\tDTB3533\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC30247-3.mp3\tAileen Stanley-billy Murray\tIt Had To Be You\tVICTOR\t19373\t30247-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-2311-1.mp3\tPhilippe Brun ''jam'' Band (with Django Reinhardt)\tIt Had To Be You\tSWING\t44\tOLA-2311-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11308.mp3\tEarl Hines & His Orchestra\tIt Had To Be You\tBluebird\t11308\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_088.mp3\tArtie Shaw And His Orchestra\tIt Had To Be You\tBluebird\t10091B\t030736\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_049.mp3\tBetty Hutton\tIt Had To Be You\tCAPITOL\t155\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_063.mp3\tCliff Edwards\tIt Had To Be You\tSILVERTONE\t1240\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh103.mp3\tHarry Roy And His Band\tIt Had To Be You\tDecca\tF-8497\tDR-8773-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70654-A.mp3\tJimmie Lunceford And His Orchestra\tIt Had To Be You\tDecca\t18504\t70654-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-6861-1.mp3\tValaida (queen Of The Trumpet) With Billy Mason And His Orchestra\tIt Had To Be You\tParlophone\tF-I40\tCE-6861-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu061540-1.mp3\tEarl Hines And His Orchestra\tIt Had To Be You\tBluebird\tB-11308\t061540-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Freddy Webster (tp) Joe McLewis, George Hunt, John Ewing (tb) Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck\nhttp://www.jazz-on-line.com/a/mp3w/1944_038.mp3\tHelen Forrest And Dick Haymes Feat. Victor Young Orchestra\tIt Had To Be You\tDECCA\t23349\tL3446\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_026.mp3\tMarion Harris\tIt Had To Be You\tBRUNSWICK\t2610\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu061540-1.mp3\tEarl Hines And His Orchestra\tIt Had To Be You (mg,ttv Vcl)\tBluebird\tBB-11308A\t061540-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_382.mp3\tSarah Vaughan\tIt Happened Again\tMercury\t70947\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62153.mp3\tWoody Herman & His Orchestra\tIt Happened Down In Dixieland\tDECCA\t1288\t62153\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068462.mp3\tGlenn Miller & His Orch\tIt Happened In Hawaii (vre)\tBLUEBIRD\t11416-B\t068462\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150512.mp3\tRuth Etting\tIt Happened In Monterey\tCOLUMBIA\t2199 D\tW150512\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150512.mp3\tRuth Etting\tIt Happened In Monterey\tCOLUMBIA\t2199\tW150512\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149811-10.mp3\tPaul Whiteman & His Orch\tIt Happened In Monterey\tCOLUMBIA\t2163 D\tW149811-10\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_198.mp3\tRuth Etting\tIt Happened In Monterey\tCOLUMBIA\t2199 D\tW150512\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC54593-2.mp3\tGeorge Olsen & His Music\tIt Happened In Monterey (waltz V. Bob Burger)\tVICTOR\t22370A\t54593-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067625.mp3\tGlenn Miller & His Orch\tIt Happened In Sun Valley\tBLUEBIRD\t11263\t067625\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_396.mp3\tFour Freshmen\tIt Happened Once Before\tCapitol\t2564\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_109.mp3\tNat ''king'' Cole Feat. Nelson Riddle's Orchestra\tIt Happens To Be Me\tCAPITOL\t2754\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_208.mp3\tBenny Goodman And His Orchestra Feat. Anna Graham\tIt Happens To The Best Of Friends\tCOLUMBIA\t2947 D\t15642\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU044980.mp3\tTampa Red\tIt Hurts Me Too\tBLUEBIRD\t8635\t044980\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP765.mp3\tKing Cole Trio\tIt Is Better To Be By Yourself\tCAPITOL\t\t765\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_122.mp3\tJo Stafford\tIt Is No Secret\tCOLUMBIA\t39082\tHCO4305\t1951\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP4117.mp3\tBenny Goodman & His Orch\tIt Isn't Fair\tCAPITOL\t\t4117\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAVI203609.mp3\tSammy Kaye And His Orchestra\tIt Isn't Fair\tRCA\t20-3609\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_233.mp3\tLes Brown And His Orchestra Feat. Four Hits And A Miss\tIt Isn't Fair\tCOLUMBIA\t38735\tHCO4018\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_206.mp3\tBill Farrell Feat. Russ Case's Orchestra\tIt Isn't Fair\tMGM\t10637A\t50S27\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_145.mp3\tBenny Goodman And His Orchestra Feat. Buddy Greco\tIt Isn't Fair\tCAPITOL\t860\t4117\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC76734-1.mp3\tIsham Jones And His Orch\tIt Isnt Fair (vrita Smith)\tVICTOR\t24367\t76734-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_065.mp3\tArthur Collins And Byron G. Harlan\tIt Looks Like A Big Night To-night\tEDISON\t9985\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_065alt.mp3\tArthur Collins And Byron G. Harlan\tIt Looks Like A Big Night To-night (take 2)\tEDISON\t9985\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB6303.mp3\tBilly Murray\tIt Looks Like A Big Night Tonight\tVICTOR\t16768\tB6303\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_105.mp3\tWendell Hall\tIt Looks Like Rain\tVICTOR\t19270\t29312-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC07837.mp3\tGuy Lombardo Royal Canadians\tIt Looks Like Rain In Cherry Blossom Lane\tVICTOR\t25572A\t07837\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_098.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. V/bob Goday\tIt Looks Like Rain In Cherry Blossom Lane\tBluebird\t6953A\t10104\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10726-2.mp3\tCab Calloway & His Orch\tIt Looks Like Susie\tBANNER\t32237\t10726-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC68234-3.mp3\tBlanche Calloway & Her Orch\tIt Looks Like Susie\tVICTOR\t22733\t68234-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban10726-1.mp3\tCab Calloway And His Orchestra\tIt Looks Like Susie\tBanner\t32237\t10726-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR303-Hy.mp3\tAstorites\tIt Made You Happy When You\tHarmony\t303-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU20292.mp3\tIsham Jones & His Orch\tIt Made You Happy When You Made Me Cry\tBRUNSWICK\t3335\t20292\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20315i.mp3\tWaring's Pennsylvanians\tIt Made You Happy When You Made Me Cry\tVictor\t20315\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_040.mp3\tByron G. Harlan\tIt Makes Me Think Of Home, Sweet Home\tEDISON\t8932\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148904-1.mp3\tBessie Smith\tIt Makes My Love Come Down\tCOLUMBIA\t14464 D\tW148904-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2275.mp3\tBing Crosby & Bob Crosby\tIt Makes No Difference Now\tDECCA\t18766\tDLA2275\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_308.mp3\tCliff Bruner's Texas Wanderers Feat. Dickie Mcbride\tIt Makes No Difference Now\tDECCA\t5604\t64504\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_082.mp3\tMcguire Sisters\tIt May Sound Silly\tCoral\t61369\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO43828.mp3\tSarah Vaughan\tIt Might As Well Be Spring\tCOLUMBIA\t38899\tCO43828\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLRHCO10173.mp3\tClooney And James\tIt Might As Well Be Spring\tCOLUMBIA\t40496\tRHCO10173\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3879.mp3\tDick Haymes - Victor Young\tIt Might As Well Be Spring\tDECCA\t18706B\tL3879\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_053.mp3\tDick Haymes\tIt Might As Well Be Spring\tDECCA\t18796\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/CroBL-21.mp3\tJohn Kirby And His Orchestra\tIt Might As Well Be Spring\tCrown\t108\tBL-21\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP214x.mp3\tPaul Weston Orchestra\tIt Might As Well Be Spring (vm.whiting)\tCAPITOL\t214\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D320B1.mp3\tWoody Herman And His Orchestra\tIt Must Be Jelly 'cause Jame Don't Shake Like That\tV-DISC\t320B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU010250.mp3\tWingy Manone & His Orch\tIt Must Be Religion\tBLUEBIRD\t7014\t010250\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC72690-1.mp3\tAlex Bartha And His Orch\tIt Must Be Swell To Be Laying Out Dead\tVICTOR\t24059\t72690-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2174IM.mp3\tMary Lou Williams Girl Stars\tIt Must Be True\tRCA\t20-2174\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULAE902.mp3\tEarl Burtnett & His Orch\tIt Must Be True\tBRUNSWICK\t4984\tLAE902\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC61048-3.mp3\tGus Arnheim & His Orch\tIt Must Be True\tVICTOR\t25280\t61048-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1753.mp3\tBing Crosby & Music Maids\tIt Must Be True\tDECCA\t2535B\tDLA1753\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_047.mp3\tGus Arnheim And His Orchestra Feat. Bing Crosby\tIt Must Be True\tVICTOR\t22561\t61048-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63257-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tIt Must Be True (you Are Mine All Mine)\tDecca\t1827\t63257-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037688.mp3\tCharlie Barnet & His Orch\tIt Must Have Been Two Other People (vlt)\tBLUEBIRD\t10336\t037688\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60018.mp3\tVictor Young & His Orch\tIt Never Dawned On Me\tDECCA\t582A\t60018\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/COLWC2975.mp3\tBenny Goodman\tIt Never Entered My Mind\tCOLUMBIA\t39478\tWC2975\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER696.mp3\tFrankie Laine\tIt Only Happens Once\tMERCURY\t5227\t696\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_219.mp3\tFrank Sinatra\tIt Only Happens When I Dance With You\tCOLUMBIA\t38192\tHCO3224\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_069.mp3\tAmes Brothers\tIt Only Hurts For A Little While\tRCA Victor\t6481\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24763.mp3\tMildred Bailey & Her Orchestra\tIt Seems Like Old Times\tVOCALION\t4939\t24763\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW265172.mp3\tColeman Hawkins & Buck\tIt Sends Me\tCOLUMBIA\t-R\tW265172\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic55133-3.mp3\tHerny ''red'' Allen And His New York Orchestra\tIt Should Be You\tVictor\tV-38073\t55133-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5842.mp3\tDuke Ellington & His Orch\tIt Shouldn't Happen To A Dream (v Al Hibbler)\tMUSICRAFT\t484\t5842\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1522x.mp3\tTommy Dorsey W Frank Sinatra\tIt Started All Over Again\tRCA\t20-1522\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_028.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra And Pied Pipers\tIt Started All Over Again\tVictor\t1522\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC37751-2.mp3\tFive Harmaniacs\tIt Takes A Good Woman\tVICTOR\t20507\t37751-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR142900-2.mp3\tUniversity Six\tIt Takes A Good Woman\tHARMONY\t316-H\t142900-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1610.mp3\tBenny Goodman And His Orchestra\tIt Takes Time (vjohnny Mercer)\tCAPITOL\t\t1610\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU030734.mp3\tArtie Shaw And His Orchestra\tIt Took A Million Years\tBLUEBIRD\t10078\t030734-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic021056-1.mp3\tMaxine Sullivan With Claude Thornhill And Orchestra\tIt Was A Lover And His Lass\tVictor\t25810\t021056-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUSF42.mp3\tAnson Weeks And His Music\tIt Was A Night In June (v H L)\tBRUNSWICK\t6569\tSF42\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19578.mp3\tErskine Hawkins Bama St Colleg\tIt Was A Sad Night In Harlem\tVOCALION\t3289\t19578\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19563.mp3\tDuke Ellington And His Famous\tIt Was A Sad Night In Harlem\tBRUNSWICK\t7710\t19563\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-19563-1.mp3\tDuke Ellington And His Orchestra\tIt Was A Sad Night In Harlem\tBrunswick\t7710\tB-19563-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99396.mp3\tTune Wranglers\tIt Was Midnight On The Ocean\tBLUEBIRD\t6365\t99396\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20906-B.mp3\tJim Miller-charlie Farrell\tIt Was Only A Sun Shower\tVictor\t20906-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC40000-2.mp3\tTed Weems & His Orch\tIt Was Only A Sun Shower\tVICTOR\t20910\t40000-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI11881.mp3\tB.a.rolfe Palais Do\tIt Was Only A Sunshower\tEDISON\t52094\t11881\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_155.mp3\tRuth Etting\tIt Was So Beautiful\tARC\tBA32499\tB12115-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12045-A.mp3\tOzzie Nelson & His Orch\tIt Was So Beautiful (v O N)\tBRUNSWICK\t6347\t12045-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74415.mp3\tBuddy Johnson And His Orch.\tIt Was Swell Knowing You\tDECCA\t24817\t74415\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC43663-2.mp3\tPaul Whiteman & His Orch\tIt Was The Dawn Of Love\tVICTOR\t21453\t43663-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043355.mp3\tGlenn Miller & His Orch\tIt Was Written In The Stars (vre)\tBLUEBIRD\t10498\t043355\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC82830.mp3\tKitty Wells\tIt Wasn't God Who Made Honky Tonk Angels\tDECCA\t28232\t82830\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_296.mp3\tKitty Wells\tIt Wasn't God Who Made Honky Tonk Angels\tDECCA\t28232\t82830\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45420-2.mp3\tFrank Stokes\tIt Won't Be Long Now\tVICTOR\t21672\t45420-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55427-3.mp3\tBennie Moten's Kansas City Or.\tIt Won't Be Long Now\tVICTOR\t38123\t55427-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC39577-8.mp3\tPaul Whiteman's Rhythm Boys\tIt Won't Be Long Now\tVICTOR\t20883A\t39577-8\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145671-1.mp3\tBessie Smith\tIt Won't Be You\tCOLUMBIA\t14338 D\tW145671-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_364.mp3\tFrank Sinatra\tIt Worries Me\tCapitol\t2922\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26769.mp3\tOrrin Tucker And His Orch\tIt'll Come To You\tCOLUMBIA\t35528\t26769\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_255.mp3\tBuddy Clark Feat. Mitchell Ayres' Orchestra\tIt's A Big, Wide, Wonderful World\tCOLUMBIA\t38370\tCO38675\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67031.mp3\tWoody Herman & His Orchestra\tIt's A Blue World\tDECCA\t2970B\t67031\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66989.mp3\tTony Martin - Ray Sinatra Orch\tIt's A Blue World\tDECCA\t2932B\t66989\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_263.mp3\tFour Freshmen\tIt's A Blue World\tCapitol\t2152\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043975.mp3\tGlenn Miller & His Orch\tIt's A Blue World (vre)\tBLUEBIRD\t10536 B\t043975\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP322x.mp3\tPeggy Lee W Dave Barbour Orch\tIt's A Good Day\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO4672-1.mp3\tGene Krupa & His Orch\tIt's A Good Day\tCOLUMBIA\t37209\tCCO4672-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14010-1.mp3\tBlind Willie (mctell)\tIt's A Good Little Thing\tARC\tVO2622z\t14010-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3767.mp3\tDoris Day\tIt's A Great Feeling\tCOLUMBIA\t38517\tHCO3767\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/HARCO40905.mp3\tPearl Bailey & Hot Lips Page\tIt's A Great Feeling\tHARMONY\t1054\tCO40905\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-11995-A.mp3\tDon Redman And His Orchestra\tIt's A Great World After All\tBrunswick\t6344\tB-11995-A  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_258.mp3\tEddy Duchin And His Orchestra Feat. G/three Earbenders\tIt's A Hap, Hap, Happy Day\tCOLUMBIA\t35259\t25494\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142425.mp3\tPaul Ash And His Orchestra\tIt's A Happy Old World After All\tCOLUMBIA\t751 D\tW142425\t1926\tJohn Valentine, John Linn, tp, Roscoe Lantz, trombone, Phil Wing & Herbert \"Putty\" Nettle,clarinet,al sax, Howard Grantham, cl, tn sax, Harry Barris, p, Paul Ash, vio, Julian Davidson,bj, Pierre Olker,br bass, Arthur Layfield, drums, v Paul Small\nhttp://www.jazz-on-line.com/a/mp3c/VIC042612.mp3\tTommy Dorsey & His Clambake 7\tIt's A Hundred To One I'm In Love\tVICTOR\t26363\t042612\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL26021-A.mp3\tJack Teagarden & His Orch\tIt's A Hundred To One, I'm In Love\tCOLUMBIA\t35215\t26021-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1691.mp3\tBing Crosby & Trotter's Orch\tIt's A Lonely Trail\tDECCA\t2237B\tDLA1691\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC6186-A.mp3\tBen Bernie & His Orch\tIt's A Lonesome Old Town\tBRUNSWICK\t4943\tC6186-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_162.mp3\tBen Bernie And His Orchestra Feat. V/donald Saxon\tIt's A Lonesome Old Town (when You're Not Around)\tBRUNSWICK\t4943\tC6186-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic67934-2.mp3\tMckinney's Cotton Pickers\tIt's A Lonesome Old Town (when You're Not Around)\tVictor\t22628\t67934-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC11231-5.mp3\tPeerless Qt\tIt's A Long Lane That Has No Turning\tVICTOR\t17030\t11231-5\t1911\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC62367.mp3\tInternational Novelty Band\tIt's A Long Way To Tipperary\tVICTOR\t22487\t62367\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64476x.mp3\tJohn Mccormack\tIt's A Long Way To Tipperary\tVICTOR\t64476\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145050.mp3\tGid Tanner's Skillet Lickers\tIt's A Long Way To Tipperary\tCOLUMBIA\t15249 D\tW145050\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC15190-4.mp3\tAmerican Qt\tIt's A Long, Long Way To Tipperary\tVICTOR\t17639A\t15190-4\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21710-1.mp3\tArtie Shaw And His New Music\tIt's A Long, Long Way To Tipperary\tBRUNSWICK\t7965\tB-21710-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic17639.mp3\tAmerican Quartet\tIt's A Long, Long Way To Tipperary\tVictor\t17639\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_001.mp3\tJohn Mccormack\tIt's A Long, Long Way To Tipperary\tVICTOR\t64608\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_002.mp3\tAmerican Quartet\tIt's A Long, Long Way To Tipperary\tVictor\t17639\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_092.mp3\tAlbert Farrington\tIt's A Long, Long Way To Tipperary\tEDISON\t2487\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_315.mp3\tDoris Day Feat. O/george Siravo\tIt's A Lovely Day Today\tCOLUMBIA\t39055\tHCO4274\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC048941.mp3\tTommy Dorsey And His Orch\tIt's A Lovely Day Tomorrow\tVICTOR\t26596\t048941\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71133.mp3\tLouis Jordan & His Tympani 5\tIt's A Low Down Dirty Shame\tDECCA\t8638B\t71133\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC147.mp3\tJoe Turner's Allstars\tIt's A Low Down Dirty Shame\tNATIONAL\t\tNSC147\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/PAR20929-2.mp3\tRichard M Jones\tIt's A Low Down Thing\tPARAMOUNT\t12705\t20929-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC39689-1.mp3\tVirginians (n.shilkret)\tIt's A Million To One You're In Love\tVICTOR\t20837\t39689-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_081.mp3\tNat Shilkret And The Victor Orchestra\tIt's A Million To One You're In Love\tVICTOR\t20837\t39689-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_237.mp3\tRay Noble And His Orchestra\tIt's A Most Unusual Day\tCOLUMBIA\t38206\tHCO3041\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73670.mp3\tElla Fitzgerald-delta Rhythm\tIt's A Pity To Say Goodnight\tDECCA\t23670\t73670\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1216-3.mp3\tStan Kenton & His Orch\tIt's A Pity To Say Goodnight\tCAPITOL\t\t1216-3\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65619.mp3\tThree Peppers\tIt's A Puzzle To Me\tDECCA\t2609B\t65619\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC101667-1.mp3\tFats Waller And His Rhythm\tIt's A Sin To Tell A Lie\tVICTOR\t25342\t101667-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR32407.mp3\tBillie Holiday W T.wilson\tIt's A Sin To Tell A Lie\tHARMONY\tHa1075\t32407\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69949.mp3\tInk Spots\tIt's A Sin To Tell A Lie\tDECCA\t4112A\t69949\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1595.mp3\tFats Waller\tIt's A Sin To Tell A Lie\tRCA\t20-1595\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D359B1.mp3\tFats Waller And His Rhythm\tIt's A Sin To Tell A Lie\tV-DISC\t359B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_009.mp3\tFats Waller\tIt's A Sin To Tell A Lie\tRCA\t20-1595\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_059.mp3\tSomethin' Smith And The Redheads\tIt's A Sin To Tell A Lie\tEpic\t9093\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66830.mp3\tBob Crosby & His Orch\tIt's A Whole New Thing\tDECCA\t2839A\t66830\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT673.mp3\tMildred Bailey W E.sauter\tIt's A Woman's Prerogative\tMAJESTIC\t1040\tT673\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_075.mp3\tFour Aces Feat. Jack Pleis And His Orchestra\tIt's A Woman's World\tDECCA\t29269\t86655\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047015.mp3\tCharlie Barnet & His Orch\tIt's A Wonderful World\tBLUEBIRD\t10610\t047015\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_169.mp3\tCharlie Barnet And His Orchestra Feat. V/mary Ann Mccall\tIt's A Wonderful World\tBluebird\t10610A\t47015\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MER530-1.mp3\tBuddy Rich & His Orchestra\tIt's About Time\tMERCURY\t3038\t530-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3h/Cam3533-B.mp3\tOzie Ware Acc. By The Whoopee Makers\tIt's All Comin' Home To You\tCameo\t9039\t3533-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU76862-1.mp3\tJimmie Davis\tIt's All Coming Home To You\tBLUEBIRD\t5156\t76862-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB7441.mp3\tRay Noble & His Orch\tIt's All Forgotten Now\tVICTOR\t24724\tOB7441\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_185.mp3\tRay Noble And His Orchestra\tIt's All Forgotten Now\tVICTOR\t24724\tOB7441\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S256.mp3\tTommy Edwards\tIt's All In The Game\tMGM\t11035\t51S256\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_148.mp3\tTommy Edwards Feat. Leroy Holmes' Orchestra\tIt's All In The Game\tMGM\t11035\t51S256\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2001.mp3\tFrankie Carle\tIt's All Over Now\tCOLUMBIA\t37146\tHCO2001\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_125.mp3\tPeggy Lee\tIt's All Over Now\tCapitol\t292\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_071.mp3\tFrankie Carle And His Orchestra Feat. Marjorie Hughes\tIt's All Over Now\tCOLUMBIA\t37146\tHCO2001\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_283.mp3\tArt Kassel And His \"kassels-in-the-air\"\tIt's All Over Now (i Won't Worry)\tBluebird\t10750\t053014\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COL3473.mp3\tAda Jones (soprano)\tIt's All Right In Summertime\tCOLUMBIA\tA-0281\t3473\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_317.mp3\tJoan Crawford Feat. O/nat Finston\tIt's All So New To Me\tVICTOR\t26205\t036059\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031867-1.mp3\tArtie Shaw And His Orchestra\tIt's All Yours\tBLUEBIRD\t10141\t031867-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65053.mp3\tJimmy Dorsey & His Orch.\tIt's All Yours\tDECCA\t2332A\t65053\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_101.mp3\tJo Stafford\tIt's Almost Tomorrow\tColumbia\t40595\tRHCO33592\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_052.mp3\tDream Weavers\tIt's Almost Tomorrow\tDecca\t29683\t88571\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_151.mp3\tDavid Carroll And His Orchestra\tIt's Almost Tomorrow\tMercury\t70717\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_147.mp3\tSnooky Lanson\tIt's Almost Tomorrow\tDot\t15424\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC058879.mp3\tTommy Dorsey And His Orch\tIt's Always You\tVICTOR\t27345\t058879\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU060915.mp3\tGlenn Miller & His Orch\tIt's Always You\tBLUEBIRD\t11079\t060915\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11079.mp3\tGlenn Miller & His Orchestra\tIt's Always You\tBluebird\t11079\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2253.mp3\tBing Crosby\tIt's Always You\tDECCA\t3636A\tDLA2253\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_038.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra\tIt's Always You\tVICTOR\t1530\t058879\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_349.mp3\tFran Warren\tIt's Anybody's Heart\tMGM\t11616\t53S6157\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3460.mp3\tBing Crosby - J.s.trotter Or.\tIt's Anybody's Spring\tDECCA\t18743\tL3460\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOB5091.mp3\tRay Noble And His Orch\tIt's Bad For Me\tVICTOR\t24872\tOB5091\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO35081.mp3\tKitty Kallen W Harry James\tIt's Been A Long Long Time\tCOLUMBIA\t36838\tCO35081\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3889.mp3\tBing Crosby And Les Paul Trio\tIt's Been A Long, Long Time\tDECCA\t18708A\tL3889\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1721x.mp3\tCharlie Spivak And His Orchestra\tIt's Been A Long, Long Time\tRCA\t20-1721\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_048.mp3\tCharlie Spivak And His Orchestra\tIt's Been A Long, Long Time\tRCA\t20-1721\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/V-DCO35081.mp3\tHarry James And His Orch\tIt's Been A Long, Long Time (vkk)\tV-DISC\t535\tCO35081\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC96567.mp3\tBenny Goodman And His Orchestra\tIt's Been So Long\tVICTOR\t25245\t96567\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1101.mp3\tLouis Prima's New Orleans Gang\tIt's Been So Long\tBRUNSWICK\t7628\tLA1101\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN511IB.mp3\tEdmond Hall's Swingtet\tIt's Been So Long\tBLUENOTE\tBN511\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC84253.mp3\tWebb Pierce\tIt's Been So Long\tDECCA\t28725\t84253\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_255.mp3\tBunny Berigan And His Orchestra Feat. Chick Bullock\tIt's Been So Long\tVOCALION\t3179\t18718-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_018.mp3\tBenny Goodman And His Orchestra\tIt's Been So Long\tVICTOR\t25245\t96567\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh162.mp3\tRoy Fox And Hisorchestra\tIt's Been So Long (v Mary Lee)\tHMV\tBD-5069\tOEA-2787-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18718-1.mp3\tBunny Berigan & His Boys\tIt's Been So Long (vcb)\tARC\tVO3179\t18718-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC73035.mp3\tErnest Tubb\tIt's Been So Long, Darling\tDECCA\t6112\t73035\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9506.mp3\tJimmie Davis\tIt's Been Years Since I've Seen My Baby\tDECCA\t5031A\tC9506\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_333.mp3\tTony Martin\tIt's Better In The Dark\tRCA\t6597\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_220.mp3\tDorsey Brothers Orchestra Feat. Bob Crosby\tIt's Dark On Observatory Hill\tDECCA\t314B\t39021-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39021-A.mp3\tDorsey Brothers Orchestra\tIt's Dark On Observatory Hill (vbc)\tDECCA\t314B\t39021-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic20-2181-A.mp3\tSpade Cooley\tIt's Dark Outside\tVictor\t20-2181-A\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC0772-1.mp3\tEddy Duchin And His Orch\tIt's De-lovely\tVICTOR\t25432\t0772-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19997-3.mp3\tLeo Reisman & His Orch\tIt's De-lovely\tBRUNSWICK\t7753\t19997-3\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_232.mp3\tWill Osborne And His Orchestra\tIt's De-lovely\tDECCA\t1058\t61424-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_017.mp3\tEddy Duchin And His Orchestra Feat. Jerry Cooper\tIt's De-lovely\tVICTOR\t25432\t0772-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478340.mp3\tJan August Piano With Jerry Murad And The Harmonicats\tIt's De-lovely\tMERCURY\t\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_147.mp3\tShep Fields And His Rippling Rhythm Orchestra\tIt's De-lovely\tBluebird\t6639\t2197\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/SIG567-3.mp3\tAnita O'day With Will Bradley\tIt's Different When It Happens To You\tSIGNATURE\t15216B\t567-3\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_210.mp3\tGuy Lombardo And His Royal Canadians\tIt's Easier Said Than Done\tVictor\t25739\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU24045-1.mp3\tTeddy Wilson & His Orch\tIt's Easy To Blame The Weather\tBRUNSWICK\t8314\t24045-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24045-1.mp3\tTeddy Wilson And His Orchestra\tIt's Easy To Blame The Weather\tBrunswick\t8314\tB-24045-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150622.mp3\tBen Selvin & His Orch\tIt's Easy To Fall In Love\tCOLUMBIA\t2255 D\tW150622\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S484.mp3\tEddie Heywood\tIt's Easy To Remember\tMGM\t30632\t51S484\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA95.mp3\tBing Crosby And George Stoll\tIt's Easy To Remember\tDECCA\t391A\tDLA95\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BruDLA95.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tIt's Easy To Remember\tBrunswick\t\tDLA95\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BruDLA95-B.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tIt's Easy To Remember\tBrunswick\tE01993\tDLA95-B \t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64575-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tIt's Foxy\tDecca\t2309\t64575-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/Col25215-1.mp3\tHarry James And His Orchestra\tIt's Funny To Everyone But Me\tColumbia\t35209\t25215-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB25215.mp3\tHarry James And His Orch\tIt's Funny To Everyone But Me (v F. Sinatra)\tCOLUMBIA\t35209\tB25215\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60073.mp3\tBob Howard & His Orch\tIt's Funny What A Kiss Can Do\tDECCA\t627B\t60073\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23685.mp3\tSlim And Slam\tIt's Gettin' Kinda Chilly\tCBS\tVO4594\t23685\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU68239-1.mp3\tDuke Ellington & His Orch\tIt's Glory\tBLUEBIRD\t10245B\t68239-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC10172-1.mp3\tAda Jones\tIt's Got To Be Someone I Love\tVICTOR\t16896B\t10172-1\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB2187.mp3\tRay Noble & His Orch\tIt's Great To Be In Love\tVICTOR\t25232\tOB2187\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_311.mp3\tRay Noble And His Orchestra\tIt's Great To Be In Love\tVICTOR\t25232\tOB2187\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044990.mp3\tTommy Mcclennan\tIt's Hard To Be Lonesome\tBLUEBIRD\t8669\t044990\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_111.mp3\tArthur C. Clough\tIt's Hard To Kiss Your Sweetheart When The Last Kiss Means Good-bye\tEdison\t10251\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21174-B.mp3\tHappiness Boys\tIt's In The Bag\tVICTOR\t21174\t41193-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2249A.mp3\tJohnny Standley\tIt's In The Book\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2249B.mp3\tJohnny Standley\tIt's In The Book (vpt.2)\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN8500-2.mp3\tWillie Creager And His Orchestra\tIt's In The Morning\tBANNER\t6294\t8500-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW145019-2.mp3\tCelestin's Tuxedo Orch\tIt's Jam Up\tCOLUMBIA\t14323 D\tW145019-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36365.mp3\tGene Krupa & His Orch\tIt's Just A Matter Of Opinion\tCOLUMBIA\t37067\tCO36365\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19495-2.mp3\tTeddy Wilson & His Orch\tIt's Like Reaching For The Moon\tBRUNSWICK\t7702\t19495-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0545.mp3\tCharlie Barnet & His Orchestra\tIt's Love I'm After\tBLUEBIRD\t6594\t0545\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC20218.mp3\tMildred Bailey & Her Orchestra\tIt's Love I'm After\tVOCALION\t3367\t20218\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38379.mp3\tDoris Day\tIt's Magic\tCOLUMBIA\t38188\tCO38379\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4712.mp3\tDick Haymes - Gordon Jenkins\tIt's Magic\tDECCA\t23826\tL4712\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_018.mp3\tDoris Day Feat. George Siravo's Orchestra\tIt's Magic\tCOLUMBIA\t38188\tCO38379\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_183.mp3\tVic Damone\tIt's Magic\tMERCURY\t5138\t1750\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/MODMM1116.mp3\tLittle Willie Littlefield\tIt's Midnight\tMODERN\t686\tMM1116\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB2188.mp3\tCount Basie & His Orchestra\tIt's Monday Every Day\tRCA\t20-2850\tD7VB2188\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/COLHCO2596.mp3\tDuke Ellington's Orch\tIt's Monday Every Day\tCOLUMBIA\t38165\tHCO2596\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149907.mp3\tCharlie Poole N.c.ramblers\tIt's Movin' Day\tCOLUMBIA\t15545 D\tW149907\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec90972-A.mp3\tLil Armstrong And Her Swing Band\tIt's Murder\tDecca\t1182\t90972-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66899.mp3\tWoody Herman & His Orchestra\tIt's My Turn Now\tDECCA\t2914B\t66899\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC62897.mp3\tElla Fitzgerald And Her Savoy 8\tIt's My Turn Now\tDECCA\t2803A\t62897\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CROBL13.mp3\tMildred Bailey\tIt's Never Too Late To Pray\tCROWN\t103\tBL13\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101192.mp3\tFats Waller And His Rhythm\tIt's No Fun\tVICTOR\t25296\t101192\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU101300.mp3\tWingy Manone & His Orch\tIt's No Fun\tBLUEBIRD\t6360\t101300\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78394-1.mp3\tBert Williams\tIt's Nobody's Business But Mine\tCOLUMBIA\tA-2750\t78394-1\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/COL27663.mp3\tBert Williams\tIt's Nobody's Business But My Own\tCOLUMBIA\t35593\t27663\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_010.mp3\tBert Williams\tIt's Nobody's Business But My Own\tCOLUMBIA\t35593\t27663\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145318-2.mp3\tBlind Willie Johnson\tIt's Nobody's Fault But Mine\tCOLUMBIA\t14303 D\tW145318-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/HAR143449-2.mp3\tUniversity Six\tIt's O.k. Katy, With Me\tHARMONY\t382-H\t143449-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_237.mp3\tBuddy Johnson And His Orchestra\tIt's Obdacious\tMercury\t70695\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP20012x.mp3\tKing Cole Trio\tIt's Only A Paper Moon\tCAPITOL\t20012\t141\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP141.mp3\tKing Cole Trio\tIt's Only A Paper Moon\tCAPITOL\t20012\t141\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC612.mp3\tHal Kemp & His Orch\tIt's Only A Paper Moon\tBRUNSWICK\t6648\tC612\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DD5VB452.mp3\tJess Stacy & His Orch\tIt's Only A Paper Moon\tV-DISC\t539\tD5VB452\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC23812IOA.mp3\tEddie Heywood & His Orch\tIt's Only A Paper Moon\tDECCA\t23812\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC72798.mp3\tThe Delta Rhythm Boys\tIt's Only A Paper Moon\tDECCA\t29136\t72798\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D359A1.mp3\tThe King Cole Trio\tIt's Only A Paper Moon\tV-DISC\t359A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24400.mp3\tPaul Whiteman & His Orchestra\tIt's Only A Paper Moon\tVictor\t24400\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_137.mp3\tCliff Edwards\tIt's Only A Paper Moon\tVOCALION\t2586\t14143-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_123.mp3\tElla Fitzgerald And Delta Rhythm Boys\tIt's Only A Paper Moon\tDECCA\t23425\t72798\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480509.mp3\tNat King Cole\tIt's Only A Paper Moon\tCapitol\tEAP4\t15791-5\t1956\tNat King Cole, P & Vocal, Harry ''Sweets'' Edison, T, John Collins, G, Charlie Harris, B, Lee Young, D\nhttp://www.jazz-on-line.com/a/mp3w/1945_147.mp3\tBenny Goodman And His Orchestra Feat. Dottie Reid, V\tIt's Only A Paper Moon\tCOLUMBIA\t36843\tCO35010-2\t1945\tAl Cuozzo, Vince Badale, Frank Lopinto, Tony Faso (tp), Trummy Young, Chauncey Welsch, Eddie Aulino (tb), Hymie Schertzer, Ray Eckstrand (as), Bill Shine, Al Epstein (ts), Danny Bank (bar), Charlie Queener (p), Mike Bryan (g), Clyde Lombardi (sb), Morey Feld (dm)\nhttp://www.jazz-on-line.com/a/mp3b/Joh057.mp3\tBilly Cotton And His Band\tIt's Only A Paper Moon (v Alan Breeze)\tRegal Zonophone\tMR-1190\tCAR-2450-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC77645-1.mp3\tPaul Whiteman And His Orch\tIt's Only A Paper Moon (vpeggy Healy)\tVICTOR\t24400\t77645-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCB-25-1.mp3\tCarolina Cotton Pickers\tIt's Our Business\tVOCALION\t03527\tB-25-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1036.mp3\tWillie Bryant-tab Smith Septet\tIt's Over Because We're Through\tAPOLLO\t369\tR1036\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU81962-1.mp3\tRichard Himber And His Orch\tIt's Psychological\tBLUEBIRD\t5421\t81962-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401308-C.mp3\tTommy Dorsey Trumpet Specialty\tIt's Right Here For You\tOKeh\t41178\t401308-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC69026-2.mp3\tBlanche Calloway & Her Orch\tIt's Right Here For You\tVICTOR\t22717\t69026-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/COMP25708.mp3\tEddie Condon & His Band\tIt's Right Here For You\tCOMMODORE\t530\tP25708\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU062750-1.mp3\tUna Mae Carlisle\tIt's Sad But True\tBLUEBIRD\t11120\t062750-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO892.mp3\tCount Basie & His Orch\tIt's Sand, Man\tCOLUMBIA\t36647\tHCO892\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/CON24178.mp3\tMildred Bailey & Her Orch\tIt's Slumbertime Along The Swanee\tCONQUEROR\t9215\t24178\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65095-A.mp3\tChick Webb And His Orchestra\tIt's Slumbertime Along The Swanee\tDecca\t2389\t65095-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23841.mp3\tLouis Jordan Tympani 5\tIt's So Easy\tDECCA\t23841\t\t194\t\nhttp://www.jazz-on-line.com/a/mp3h/ORI2432-5.mp3\tDixie Jazz Band (the Whopee Makers)\tIt's So Good\tORIOLE\t1668\t2432-5\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO3946.mp3\tDinah Shore\tIt's So Nice To Have A Man Around The House\tCOLUMBIA\t38689\tHCO3946\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_210.mp3\tDinah Shore\tIt's So Nice To Have A Man Around The House\tCOLUMBIA\t38689\tHCO3946\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69412-AB.mp3\tMildred Bailey & Delta Rhythm\tIt's So Peaceful In The Country\tDECCA\t3953A\t69412-AB\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_287.mp3\tMildred Bailey\tIt's So Peaceful In The Country\tDECCA\t3953A\t69412-AB\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29521-1.mp3\tCount Basie And His Orchestra\tIt's Square But It Rocks\tOkeh\t6047\t29521-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1305.mp3\tAlice Faye Orchestra Under Direction Of Cy Feuer\tIt's Swell Of You\tBRUNSWICK\t7860\tLA1305\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21035-2.mp3\tTeddy Wilson & His Orch\tIt's Swell Of You\tBRUNSWICK\t7884\t21035-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_330.mp3\tTeddy Wilson And His Orchestra\tIt's Swell Of You\tBRUNSWICK\t7884\t21035-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17825.mp3\tEthel Merman\tIt's The Animal In Me\tBRUNSWICK\t7491\t17825\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC29810-2.mp3\tJean Goldkette & His Orch\tIt's The Blues\tVICTOR\t19600\t29810-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR351108-1.mp3\tD'orsay Dance Orch (selvin)\tIt's The Darndest Thing\tHARMONY\t1380-H\t351108-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-22251-1.mp3\tHarry James And His Orchestra\tIt's The Dreamer In Me\tBrunswick\t8055\tB-22251-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE36911.mp3\tBoswell Sisters W Dorsey Bros\tIt's The Girl\tBRUNSWICK\t6151\tE36911\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_109.mp3\tBoswell Sisters Feat. Dorsey Brothers Orchestra\tIt's The Girl\tBRUNSWICK\t6151\tE36911\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69116.mp3\tBuddy Johnson & His Band\tIt's The Gold (vella Johnson)\tDECCA\t8573A\t69116\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19796.mp3\tPutney Dandridge\tIt's The Gypsy In Me\tARC\tVO3315\t19796\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-2235-1.mp3\tFletcher Henderson And His Orchestra\tIt's The Litlle Things That Count\tVocalion\t4154\tC-2235-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC023289.mp3\tBunny Berigan & His Orch\tIt's The Little Things That Count\tVICTOR\t25868A\t023289\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_330.mp3\tBunny Berigan And His Orchestra Feat. Ruth Gaylor\tIt's The Little Things That Count\tVICTOR\t25868A\t023289\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC2235-1.mp3\tFletcher Henderson & His Orch\tIt's The Little Things That Count (v C R)\tVOCALION\t4154\tC2235-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA829-A.mp3\tBing Crosby\tIt's The Natural Thing To Do\tDECCA\t11015\tDLA829-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC21335.mp3\tMildred Bailey & Her Orchestra\tIt's The Natural Thing To Do\tVOCALION\t3626\t21335\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_236.mp3\tMildred Bailey\tIt's The Natural Thing To Do\tCBS\tVO3626\t21335-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLAB29-A.mp3\tJohn Scott Trotter And His Orchestra With Bing Crosby\tIt's The Natural Thing To Do \tDECCA\t1376\tDLAB29-A \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA829-B.mp3\tJohn Scott Trotter And His Orchestra With Bing Crosby\tIt's The Natural Thing To Do \tDECCA\t\tDLA829-B \t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-16541-A.mp3\tLouis Prima And His New Orleans Gang\tIt's The Rhythm In Me\tBrunswick\t7471\tB-16541-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5702.mp3\tArtie Shaw And His Music (vocal Mel Torme)\tIt's The Same Old Dream\tMUSICRAFT\t492\t5702\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_214.mp3\tTommy Dorsey And His Orchestra\tIt's The Same Old Dream\tVictor\t2210\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29246-1.mp3\tCount Basie And His Orchestra\tIt's The Same Old South\tOkeh\t5963\t29246-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72526.mp3\tBig Joe Turner\tIt's The Same Old Story\tDECCA\t29924\t72526\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28619.mp3\tBillie Holiday\tIt's The Same Old Story\tOKEH\t5806\t28619\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/ARCB13786-A-B.mp3\tConnie Boswell W Victor Young\tIt's The Talk Of The Town\tARC\tBR6632\tB13786-A-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70173.mp3\tGlen Gray & Casa Loma Orch.\tIt's The Talk Of The Town\tDECCA\t4292A\t70173\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP596.mp3\tColeman Hawkins & His Orch\tIt's The Talk Of The Town\tCAPITOL\t\t596\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4539.mp3\tErroll Garner Trio\tIt's The Talk Of The Town\tCOLUMBIA\t39580\tHCO4539\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73690.mp3\tRoy Eldridge & His Orchestra\tIt's The Talk Of The Town\tDECCA\t23783\t73690\t1946\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCap.mp3\tColeman Hawkins\tIt's The Talk Of The Town\tCapitol Jazz 50th An\t\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Col265136-3.mp3\tFletcher Henderson And His Orchestra\tIt's The Talk Of The Town\tColumbia\t2825-D\t265136-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_051.mp3\tGlen Gray And Casa Loma Orchestra Feat. Kenny Sargent, V\tIt's The Talk Of The Town\tBRUNSWICK\t6626\t13739-A\t1933\tJoe Hostetter, Frank Martinez (tp), Pee Wee Hunt, Billy Rauch (tb), Glen Gray (as, ldr), Clarence Hutchinrider (cl, as), Kenny Sargent, Pat Davis (ts), Mel Jenssen (vn), Joe Hall (p), Gene Gifford (bj, g), Stanley Dennis (bb, sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3c/BLU041530.mp3\tFats Waller And His Rhythm\tIt's The Tune That Counts\tBLUEBIRD\t10393\t041530\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC48619-2.mp3\tMckinney's Cotton Pickers\tIt's Tight Like That\tVICTOR\t38013\t48619-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC2710-A.mp3\tJimmie Noone's Apex Jazz Band\tIt's Tight Like That\tVOCALION\t1238\tC2710-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401534-A.mp3\tLuis Russell's Burning 8\tIt's Tight Like That\tOKeh\t8656\t401534-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUC-2705.mp3\tWalter Barnes And His Royal Creolians\tIt's Tight Like That\tBRUNSWICK\t4244\tC-2705\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke26400-A.mp3\tJimmie Lunceford And His Orchestra\tIt's Time To Jump And Shout\tOkeh\t5430\t26400-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU69321.mp3\tAllen Brothers\tIt's Too Bad For You\tBLUEBIRD\t5872\t69321\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU5872i.mp3\tAllen Brothers\tIt's Too Bad For You\tBLUEBIRD\t5872\t69321\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4950.mp3\tEvelyn Knight - Sonny Burke\tIt's Too Late Now\tDECCA\t24636\tL4950\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141817.mp3\tArt Gillam\tIt's Too Late To Be Sorry Now\tCOLUMBIA\t614 D\tW141817\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/MER1950.mp3\tDinah Washington W M.miller\tIt's Too Soon To Know\tMERCURY\t8107\t1950\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74590.mp3\tElla Fitzgerald\tIt's Too Soon To Know\tDECCA\t24497\t74590\t1948\t\nhttp://www.jazz-on-line.com/a/mp3o/JUB5000x.mp3\tOrioles\tIt's Too Soon To Know\tJUBILEE\t5000\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_102.mp3\tOrioles\tIt's Too Soon To Know\tJUBILEE\t5000\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeWC-3258-A.mp3\tCount Basie And His Orchestra\tIt's Torture\tOkey\t5773\tWC-3258-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic17874.mp3\tHarry Macdonough\tIt's Tulip Time In Holland\tVictor\t17874\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC56132-3.mp3\tChick Endor\tIt's Unanimous Now\tVICTOR\t22151A\t56132-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39217-B.mp3\tBob Howard & His Orchestra\tIt's Unbelievable\tDECCA\t347A\t39217-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc20753-1.mp3\tFletcher Henderson And His Orchestra\tIt's Wearin' Me Down\tVocalion\t3487\t20753-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38661.mp3\tGene Krupa\tIt's Whatcha' Do With Whatcha' Got\tCOLUMBIA\t38296\tCO38661\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC8850.mp3\tHal Kemp & His Orch\tIt's Winter Again\tBRUNSWICK\t6452\tC8850\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU12707-A.mp3\tBing Crosby\tIt's Within Your Power\tBRUNSWICK\t6464\t12707-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63225.mp3\tElla Fitzgerald & Her Savoy 8\tIt's Wonderful\tDECCA\t1669\t63225\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC017452.mp3\tBenny Goodman And His Orchestra\tIt's Wonderful\tVICTOR\t25727\t017452\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc22368-1.mp3\tMaxine Sullivan (orchestra Under Direction Claude Thornhill)\tIt's Wonderful\tVocalion\t3993\t22368-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_109.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tIt's Wonderful\tVICTOR\t25727\t017452\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_085.mp3\tEddy Howard And His Orchestra\tIt's Worth Any Price You Pay\tMERCURY\t70015\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA0279.mp3\tThe Boswell Sisters\tIt's Written All Over Your Face\tBRUNSWICK\t7348\tLA0279\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC95518.mp3\tTommy Dorsey & His Orch\tIt's Written In The Stars\tVICTOR\t25172\t95518\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60075-A.mp3\tBob Howard & His Orch\tIt's Written In The Stars\tDECCA\t598B\t60075-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-79I4-A.mp3\tJimmie Noone And His Orchestra\tIt's You ? V A J\tBrunswick\t6192\tC-79I4-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99919.mp3\tTommy Dorsey & His Orch\tIt's You I'm Talking About\tVICTOR\t25292\t99919\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043346.mp3\tFats Waller And His Rhythm\tIt's You Who Taught It To Me\tBLUEBIRD\t10527\t043346\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS25468.mp3\tSlim & Slam\tIt's You, Only You\tCBS\tVO5301\t25468\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_397.mp3\tDecastro Sisters\tIt's Yours\tRCA\t6661\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC60031x.mp3\tHulda Lashanka\tItalian Street Song (vlucy Marsh)\tVICTOR\t60031\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_170.mp3\tPerry Como And Fontane Sisters Feat. Mitchell Ayres' Orchestra\tIts Beginning To Look A Lot Like Christmas\tRCA Victor\t4314\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS20094-2.mp3\tMildred Bailey W Red Norvo\tIts Love I'm After\tCBS\t(REJ)\t20094-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COL37373.mp3\tPrince's Band\tIts Tulip Time In Holland\tCOLUMBIA\tA-5724\t37373\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_070.mp3\tOtis Williams-charms\tIvory Tower\tDeLuxe\t6093\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_025.mp3\tCathy Carr\tIvory Tower\tFraternity\t734\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_045.mp3\tGale Storm\tIvory Tower\tDot\t15458 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_202.mp3\tDick Haymes\tIvy\tDecca\t23877\tL4370\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_178.mp3\tJo Stafford\tIvy\tCapitol\t388\t1677\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh075.mp3\tThe Bbc Dance Orchestra Dir. By Henry Hall\tIm Pop-eye The Sailor Man (v Burton Gillis)\tColumbia\tFB-1054\tCA-14999-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh123.mp3\tRoy Fox And His Orchestra (vocal Mary Lee)\tIse A Muggin\tHMV\tBD-5060\tOEA-2771-1\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh101.mp3\tHarry Roy And His Band\tIve Got A Gal In Kalamazoo\tRegal Zonophone\tMR-3676\tCAR-6402-2\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC112.mp3\tPete Johnson's Allstars\tJ.c From K.c\tNATIONAL\t\tNSC112\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW140629-2.mp3\tBessie Smith\tJ.c.holmes Blues\tCOLUMBIA\t14095 D\tW140629-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN024JP.mp3\tJames P Johnson\tJ.p.boogies\tBLUENOTE\tBN024\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030318.mp3\tTommy Ladnier And His Orch\tJa Da\tBLUEBIRD\t10086\t030318\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCWM1051.mp3\tBobby Hackett & His Orch\tJa Da\tVOCALION\t5198\tWM1051\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47290.mp3\tErroll Garner Trio\tJa Da\tCOLUMBIA\t39713\tCO47290\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101454-1.mp3\tTommy Dorsey & His Orch\tJa Da\tVICTOR\t25326\t101454-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/COM22310.mp3\tEddie Condon Windy City 7\tJa Da\tCOMMODORE\t500\t22310\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC22561.mp3\tArthur Fields\tJa Da\tVICTOR\t18522\t22561\t1919\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67401.mp3\tBob Crosby & His Orch\tJa Da\tDECCA\t3233B\t67401\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_042.mp3\tArthur Fields\tJa-da (ja Da, Ja Da, Jing Jing Jing)\tVICTOR\t18522\t22561\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62479.mp3\tSleepy John Estes\tJack And Jill Blues\tDECCA\t7365\t62479\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22579.mp3\tEarl Hines & His Orch\tJack Climbed A Beanstalk (v Ray Nance)\tVOCALION\t4272\t22579\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Col27684-1.mp3\tBud Freeman And His Famous Chicagoans\tJack Hits The Road\tCBS\tCo35854\t27684-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_043.mp3\tSousa's Band\tJack Tar March\tVICTOR\t16151\tB0240-15\t1903\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC049677-1.mp3\tLionel Hampton And His Orch\tJack The Bellboy\tVICTOR\t26652A\t049677-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic049677-1.mp3\tLionel Hampton And His Orchestra\tJack The Bellboy\tVictor\t26652\t049677-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/CorL-4307-.mp3\tLionel Hampton And His Octet\tJack The Fox Boogie\tCoral\t6.22180\tL-4307-\t1946\tLionel Hampton p  vib v dir. Joe Wilder Duke Garrette Leo Shepherd Joe Morris  Wendell Culley  Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn   Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb johnny Griffin ts, Charlie Fowlkes bar, Mi\nhttp://www.jazz-on-line.com/a/mp3c/DEC63871.mp3\tTrixie Smith & Her Syncopators\tJack, I'm Mellow\tDECCA\t7528\t63871\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73718.mp3\tLouis Jordan\tJack, You're Dead\tDECCA\t23901\t73718\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142206-2.mp3\tFletcher Henderson & His Orch\tJackass Blues\tCOLUMBIA\t654 D\tW142206-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe74090-B.mp3\tClarence Williams Stompers\tJackass Blues\tOKeh\t40598\t74090-B\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRO11096B.mp3\tLovie Austin Blues Serenaders\tJackass Blues\tBROADWAY\t1018\t11096B\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC35763-3.mp3\tThomas Morris Hot Babies\tJackass Blues\tVICTOR\t20179\t35763-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN218-2.mp3\tSidney Bechet Bluenote Jazzmen\tJackass Blues\tBLUENOTE\tBN050B\tBN218-2\t\t\nhttp://www.jazz-on-line.com/a/mp3d/ManA-1690.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tJackie\tManor\t1161\tA-1690\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC041596-2.mp3\tMaxine Sullivan\tJackie Boy\tVICTOR\t26372\t041596-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe404714.mp3\tMississippi Mud Steppers\tJackson Stomp\tOKeh\t45504\t404714\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVS5874.mp3\tIllinois Jacquet Orch\tJacquet And No Vest\tSAVOY\t911\tS5874\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1055.mp3\tIllinois Jacquet Allstars\tJacquet Bounce\tAPOLLO\t766\tR1055\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVS5873.mp3\tIllinois Jacquet Orch\tJacquet In The Box\tSAVOY\t910\tS5873\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81226-2.mp3\tBessie Smith\tJail House Blues\tCOLUMBIA\tA-4001\t81226-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC93007.mp3\tSleepy John Estes\tJailhouse Blues\tDECCA\t7814\t93007\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66871.mp3\tLouis Jordan & His Tympani 5\tJake, What A Snake\tDECCA\t7719\t66871\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4595.mp3\tFrankie Laine\tJalousie\tCOLUMBIA\t39585\tHCO4595\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC12160x.mp3\tBoston Pops Orch\tJalousie\tVICTOR\t12160\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D52A.mp3\tBoston Pops Orchestra (arthur Fiedler, Cond.)\tJalousie\tv-disk\t52A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_238.mp3\tBoston Pops Orchestra With Arthur Fiedler\tJalousie\tVICTOR\t12160\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2693.mp3\tWingy Manone & His Orch\tJam And Jive Part 1\tDECCA\t18325A\tDLA2693\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2694.mp3\tWingy Manone & His Orch\tJam And Jive Part 2\tDECCA\t18325B\tDLA2694\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2696.mp3\tWingy Manone & His Orch\tJam And Jive Part 4 (corinne Corinna)\tDECCA\t18326B\tDLA2696\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2697.mp3\tWingy Manone & His Orch\tJam And Jive Part 5\tDECCA\t18327A\tDLA2697\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2698.mp3\tWingy Manone & His Orch\tJam And Jive Part 6 (manone Blues)\tDECCA\t18327B\tDLA2698\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2695.mp3\tWingy Manone & His Orch\tJam And Jive Part3\tDECCA\t18326A\tDLA2695\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP6514-6.mp3\tStan Kenton & His Orch\tJam Bo\tCAPITOL\t\t6514-6\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP5558.mp3\tBenny Goodman\tJam Session (beginning)\tCOLUMBIA\t39310\tZSP5558\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5847.mp3\tDuke Ellington And His Orchestra \tJam-a-ditty (concerto For 4 Jazz Horns)\tMUSICRAFT\t511\t5847\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5847-1.mp3\tDuke Ellington And His Orchestra \tJam-a-ditty (concerto For Four Jazz Horns)\tMUSICRAFT\t511\t5847-1\t1946\tfeaturing Quartet J. Hamilton, Clarinet, T. Jordan, Trumpet, H. Carney, Baritone Sax, L. Brown, Trombone\nhttp://www.jazz-on-line.com/a/mp3a/OKe265144.mp3\tColeman Hawkins\tJamaica Shout\tOKeh\t41566\t265144\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16024-A.mp3\tLouis Prima's New Orleans Gang\tJamaica Shout\tBRUNSWICK\t7524\t16024-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-16024-A.mp3\tLouis Prima And His New Orleans Gang\tJamaica Shout\tBrunswick\t7524\tB-16024-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10260.mp3\tJo Stafford\tJambalaya\tCOLUMBIA\t39838\tHCO10260\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_024.mp3\tJo Stafford\tJambalaya\tCOLUMBIA\t39838\tHCO10260\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S6060.mp3\tHank Williams Sings With His Drifting Cowboys\tJambalaya (on The Bayou)\tMGM\t11283-A\t52S6060\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03086.mp3\tTommy Dorsey & His Orch\tJamboree\tVICTOR\t25496\t03086\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06675-1.mp3\tTommy Dorsey & His Orch\tJammin'\tVICTOR\t25553B\t06675-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VarM-545-1.mp3\tLucky Millinder With Mills Blue Rhythm Band\tJammin' For The Jack-pot\tVariety\t634\tM-545-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66890.mp3\tBuddy Johnson & His Band\tJammin' In Georgia\tDECCA\t7684\t66890\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100363-1.mp3\tFletcher Henderson & His Orch\tJangled Nerves\tVICTOR\t25317A\t100363-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic100363-1.mp3\tFletcher Henderson And His Orchestra\tJangled Nerves\tVictor\t25317\t100363-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/Vic48373-2.mp3\tDuke Ellington's Orchestra\tJapanese Dream\tVictor\tV-38045\t48373-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU89566.mp3\tBenny Goodman And His Orchestra\tJapanese Sandman\tBLUEBIRD\t10459\t89566\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE26695.mp3\tRed Nichols & His 5 Pennies\tJapanese Sandman\tBRUNSWICK\t6821\tE26695\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79386-1.mp3\tNora Bayes\tJapanese Sandman\tCOLUMBIA\tA-2997\t79386-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39358.mp3\tEarl Hines & His Orchestra\tJapanese Sandman\tDECCA\t654B\t39358\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC4970hpp.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tJapanese Sandman\tDECCA\tF-7133\t4970hpp\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_081.mp3\tNora Bayes\tJapanese Sandman\tColumbia\t2997\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_155.mp3\tBenny Goodman And His Orchestra\tJapanese Sandman\tVICTOR\t25024\t89566\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru2517.mp3\tPaul Ash & His Orchestra\tJapanese Sunset\tBrunswick\t2517\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145831-3.mp3\tGuy Lombardo Royal Canadians\tJapansy\tCOLUMBIA\t1364 D\tW145831-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU053593.mp3\tMemphis Slim (b.chatmon)\tJasper's Gal\tBLUEBIRD\t8615\t053593\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU064000-1.mp3\tMemphis Slim (p.chatman)\tJasper's Gal\tBLUEBIRD\t8834\t064000-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67931.mp3\tInk Spots\tJava Jive\tDECCA\t3432B\t67931\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_137.mp3\tInk Spots\tJava Jive\tDECCA\t23633\t67931\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3309.mp3\tJay Jay Johnson\tJay Bird\tSAVOY\t975\tS3309\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/MajT-718.mp3\tJimmie Lunceford And His Orchestra\tJay Gee\tMajestic\t1053\tT-718\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_027.mp3\tMarion Harris\tJazz Baby\tVictor\t18555\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-2884-A.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tJazz Battle\tBrunswick\t4244\tC-2884-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban12357-1.mp3\tMills Blue Rhythm Band\tJazz Cocktail\tBanner \t32608  \t12357-1  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-12343-A.mp3\tDuke Ellington And His Famous Orchestra\tJazz Cocktail\tBrunswick\t6404\tB-12343-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE30938.mp3\tDuke Ellington & His Orch\tJazz Convulsions\tBRUNSWICK\t6810\tE30938\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC38611-A.mp3\tNew Orleans Rhythm Kings\tJazz It Blues\tDECCA\t162B\t38611-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE9890-A.mp3\tLouis Armstrong's Hot Five\tJazz Lips\tOKeh\t8436\t09890-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU57543-2.mp3\tDuke Ellington & His Orch\tJazz Lips\tBLUEBIRD\t6396A\t57543-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_296.mp3\tDuke Ellington And His Famous Orchestra\tJazz Lips\tBluebird\t6396A\t57543-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Mel13930-1.mp3\tMills Blue Rhythm Band\tJazz Martini\tMelotone\tM-12793\t13930-1  \t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE81520.mp3\tBix Beiderbecke And His Gang\tJazz Me Blues\tOKEH\t40923\t81520\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151887-2.mp3\tOriginal Memphis Five\tJazz Me Blues\tCOLUMBIA\t36064\tW151887-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76001.mp3\tEddie Condon & His Orchestra\tJazz Me Blues\tDECCA\t27035\t76001\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM414-2.mp3\tJoe Marsala Chicagoans\tJazz Me Blues\tVARIETY\tI565\tM414-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D973.mp3\tMuggsy Spanier Vdisc Allstars\tJazz Me Blues\tV-DISC\t507\t973\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN11754-A.mp3\tWolverine Orchestra\tJazz Me Blues\tGENNETT\t5408\t11754-A\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC25072-5.mp3\tOriginal Dixieland Jazz Band\tJazz Me Blues\tVICTOR\t18772\t25072-5\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035032.mp3\tBunny Berigan & His Orch\tJazz Me Blues\tVICTOR\t26244A\t035032\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17180H-.mp3\tThe Dutch Swing College Band\tJazz Me Blues\tPhilips\tP17180H\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR148180-3.mp3\tBert Lown & His Loungers\tJazz Me Blues\tHARMONY\t974-H\t148180-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/GENG11754-A.mp3\tWolverine Orchestra\tJazz Me Blues\tGENNETT\t5408\t11754-A\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN044JMB.mp3\tSidney Bechet Bluenote Jazzmen\tJazz Me Blues\tBLUENOTE\tBN044\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM1663-A.mp3\tThe Dutch Swing College Band\tJazz Me Blues\tDecca\tM32583\tAM1663-A\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_117.mp3\tOriginal Dixieland Jazz Band\tJazz Me Blues\tVICTOR\t18772\t25072-5\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_227.mp3\tLes Paul\tJazz Me Blues\tCapitol\t1825\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480535.mp3\tArt Pepper\tJazz Me Blues\tContemporary\tC3532\t\t1957\tRed Garland, P, Philly Jo Jones, D, Paul Chambers, B\nhttp://www.jazz-on-line.com/a/mp3b/BRUM947.mp3\tDuke Ellington's Famous Orch\tJazz Potpourri\tBRUNSWICK\t8293\tM947\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141819-2.mp3\tBessie Smith\tJazzbo Brown From Memphis Town\tCOLUMBIA\t14133 D\tW141819-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/Oke8403-4.mp3\tKing Oliver's Jazz Band\tJazzin' Babies' Blues\tOkeh\t4975\t8403-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU81325-1.mp3\tJimmie Lunceford & His Orch\tJazznocracy\tBLUEBIRD\t5713\t81325-1\t1934\t\nhttp://www.78-tours.net/mp3/COLL2032.mp3\tJean Sorbier\tJe Ne Suis Rien Sans Vous\tCOLUMBIA\tDF 22\tL 2032\t\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI11421.mp3\tB.a. Rolfe Palais D'or\tJe T'aime Means I Love You\tEDISON\t51925\t11421\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69568.mp3\tAndrews Sisters\tJealous\tDECCA\t4019A\t69568\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5532-3-4.mp3\tFletcher Henderson & His Orch\tJealous\tBANNER\t1372\t5532-3-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT638.mp3\tJohnny Guarnieri Trio\tJealous\tMAJESTIC\t1035\tT638\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCSA3017.mp3\tNite Owls\tJealous\tVOCALION\t4064\tSA3017\t\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU07389HW1-8.mp3\tBoots And His Buddies\tJealous\tBLUEBIRD\t6862\t07389-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC16784-1.mp3\tVic Berton And His Orchestra\tJealous\tVOCALION\t2915\t16784-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU2622J.mp3\tMarion Harris\tJealous\tBRUNSWICK\t2622\t-\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D94B.mp3\tVaughn Monroe\tJealous\tv-disk\t94B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_023.mp3\tMarion Harris\tJealous\tBRUNSWICK\t2622\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_213.mp3\tAndrews Sisters\tJealous\tDECCA\t4019A\t69568\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/DOTM-1037b.mp3\tJohnny Maddox And The Rhythmasters\tJealous\tDOT\tDEP-1016\tM-1037b\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP179x.mp3\tTex Ritter\tJealous Heart\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/LON500.mp3\tAl Morgan\tJealous Heart\tLONDON\t500\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24711x.mp3\tJack Owens\tJealous Heart\tDECCA\t24711\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_036.mp3\tAl Morgan\tJealous Heart\tLONDON\t500\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_227.mp3\tJan Garber And His Orchestra\tJealous Heart\tCAPITOL\t759\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC61137-A.mp3\tCarter Family\tJealous Hearted Me\tDECCA\t5241\t61137-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59065.mp3\tJimmie Davis\tJealous Lover\tVICTOR\t23778\t59065\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146776.mp3\tCharlie Poole N.c.ramblers\tJealous Mary\tCOLUMBIA\t15342 D\tW146776\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014650.mp3\tFats Waller And His Rhythm\tJealous Of Me\tVICTOR\t25864\t014650\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP8566.mp3\tFrankie Laine\tJealousy\tCOLUMBIA\t39662\tZSP8566\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75841.mp3\tBuddy Johnson\tJeannette\tDECCA\t28907\t75841\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO34079.mp3\tAbe Lyman And His Orchestra\tJeannine\tCOLUMBIA\t37510\tCO34079\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU22457-1.mp3\tRed Norvo & His Orch\tJeannine\tBRUNSWICK\t8103\t22457-1\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL6552.mp3\tLouis Armstrong - G.jenkins\tJeannine\tDECCA\t28076\tL6552\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_004.mp3\tGene Austin Feat. Nat Shilkret And His Orchestra\tJeannine (i Dream Of Lilac Time)\tVICTOR\t21564\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_015.mp3\tNat Shilkret And The Victor Orchestra\tJeannine (i Dream Of Lilac Time)\tVICTOR\t21564\t46619\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45297-3.mp3\tGene Austin\tJeannine I Dream Of Lilac Time\tVICTOR\t21564A\t45297-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC46619.mp3\tNat Shilkret & Victor Orch\tJeannine, I Dream Of Lilac Time (vfb)\tVICTOR\t21572A\t46619\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71760.mp3\tJimmie Lunceford And His Orchestra\tJeep Rhythm\tDecca\t18618\t71760\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COLM793.mp3\tJohnny Hodges\tJeep's Blues\tCOLUMBIA\t37837\tM793\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC92001.mp3\tPort Arthur Jumpers\tJeep's Blues\tDECCA\t5854\tC92001\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS23708-1.mp3\tAl Donahue And His Orch\tJeepers Creepers\tCBS\tVO4513\t23708-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64907.mp3\tLouis Armstrong And His Orch.\tJeepers Creepers\tDECCA\t2267A\t64907\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU1205JC.mp3\tCliff Jackson's Village Cats\tJeepers Creepers\tBLUENOTE\tBN1205\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULA1755-C.mp3\tGene Krupa & His Orch\tJeepers Creepers\tBRUNSWICK\t8280\tLA1755-C\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC49681-2hpp.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tJeepers Creepers\tDECCA\tF-7027\t49681-2hpp\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVoc4513.mp3\tAl Donahue & His Orchestra\tJeepers Creepers\tVocalion\t4513\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec02257.mp3\tLouis Armstrong\tJeepers Creepers\tDecca\t02257\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_183.mp3\tLouis Armstrong\tJeepers Creepers\tDecca\t02257\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_192.mp3\tLarry Clinton And His Orchestra Feat. Ford Leary\tJeepers Creepers\tVICTOR\t26108\t028950\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_006.mp3\tAl Donahue And His Orchestra\tJeepers Creepers\tVOCALION\t4513\t23708-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh063.mp3\tJack Hylton And His Orchestra\tJeepers Creepers (v Primrose Orrock)\tHMV\tBD-5465\tOEA-7616-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1332.mp3\tGene Ammons Sextet\tJeet Jet\tMERCURY\t8123\t1332\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D308B.mp3\tBilly Eckstein With Earl Hines And His Orchestra\tJelly Jelly\tV-DISC\t308B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU055180.mp3\tEarl Hines & His Orch\tJelly Jelly\tBLUEBIRD\t11065B\t055180\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC167.mp3\tBilly Eckstine & His Orch\tJelly Jelly\tNATIONAL\t\tNSC167\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76169.mp3\tLionel Hampton & His Orchestra\tJelly Roll\tDECCA\t28230\t76169\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/RoyKJ-27-2.mp3\tMezzrow - Bechet Quntet\tJelly Roll\tRoyal Jazz\t709\tKJ-27-2  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Cor76206.mp3\tLionel Hampton And His Orchestra\tJelly Roll\tCoral\t622422\t76206\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec76169.mp3\tLionel Hampton And His Orchestra\tJelly Roll\tDecca\t28230\t76169\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN4388.mp3\tLonnie Johnson\tJelly Roll Baker\tKING\t4388\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20-1502-A.mp3\tBunny Berigan And His Orch\tJelly Roll Blues\tVictor\t20-1502-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC030302.mp3\tBunny Berigan And His Orch\tJelly Roll Blues\tVICTOR\t26113A\t030302\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9510.mp3\tJimmie Davis\tJelly Roll Blues\tDECCA\t5064A\tC9510\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG11911.mp3\tJelly Roll Morton\tJelly Roll Blues\tGENNETT\t5552\tG11911\t1924\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9173.mp3\tOriginal Memphis Five\tJelly Roll Blues\tEDISON\t51246\t9173\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu055180-1.mp3\tEarl Hines And His Orchestra\tJelly, Jelly\tBluebird\tB-11065\t055180-1\t1940\tHarry \"Pee Wee\" Jackson, Rostelle Reese, Leroy White (tp) Joe McLewis, John Ewing, Edward Fant (tb) Leroy Harris, Scoops Carey (as) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck Parham (b) Alvin Burroughs (d) Billy Eckstine, Madeline Greene (vcl) The Three Varieties (vcl trio\nhttp://www.jazz-on-line.com/a/mp3c/SAV5410.mp3\tCozy Cole Allstars\tJericho\tSAVOY\t502A\t5410\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR908-Hx.mp3\tArthur Ross And His Westerners\tJericho\tHarmony\t908-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480754.mp3\tCozy Cole All Stars\tJericho\tSavoy\t502\t5410\t1944\tLammar Wright (tp), Ray Conniff (tb), Ben Webster (ts), Johnny Guarnieri (p), Teddy Walters (g), Billy Taylor (sb), Cozy Cole (dm)\nhttp://www.jazz-on-line.com/a/mp3a/ASC3583x.mp3\tJosh White\tJerry\tASCH\t3583\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC89820.mp3\tWillie Bryant & His Orch\tJerry The Junker\tVICTOR\t25045\t89820\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE32238.mp3\tBenny Goodman And His Orchestra\tJersey Bounce\tOKEH\t6590\t32238\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN869a.mp3\tHank Penny\tJersey Bounce\tKING\t869\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU063330.mp3\tEarl Hines & His Orch\tJersey Bounce\tBLUEBIRD\t11126\t063330\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/HIT7001.mp3\tLes Hite & His Orch\tJersey Bounce\tHIT OF THE WEEK\t7001\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO32564.mp3\tRed Norvo\tJersey Bounce\tCOLUMBIA\t36557\tCO32564\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_064.mp3\tJimmy Dorsey And His Orchestra\tJersey Bounce\tDECCA\t4288A\t70483\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu063330-1.mp3\tEarl Hines And His Orchestra\tJersey Bounce\tBluebird\tB-11126\t063330-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Benny Harris (tp) Joe McLewis, George Hunt, Edward Fant (tb) Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck\nhttp://www.jazz-on-line.com/a/mp3w/1942_133.mp3\tShep Fields And His Rippling Rhythm Orchestra\tJersey Bounce\tBluebird\t11490\t71919\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_011.mp3\tBenny Goodman And His Orchestra\tJersey Bounce\tOKEH\t6590\t32238\t1942\tBernie Privin, Jimmy Maxwell, Al Davis (tp), Lou McGarity, Cutty Cutshall (tb), Benny Goodman (cl), Sol Kane, Clint Neagley (as), Vido Musso, George Berg (ts), Chuck Gentry (bar), Mel Powell (p, arr), Tom Morgan (g), Sid Weiss (sb), Ralph Collier (dm)\nhttp://www.jazz-on-line.com/a/mp3b/Blu063330-1.mp3\tEarl Hines And His Orchestra\tJersey Bounce (jm Arr)\tBluebird\tB-11126\t063330-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14723-1.mp3\tCharlie Patton\tJersey Bull Blues\tARC\tVO2782z\t14723-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57081-1.mp3\tJelly Roll Morton Red Peppers\tJersey Joe\tVICTOR\t23402\t57081-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic57081-1.mp3\tJelly Roll Morton And His Red Hot Peppers\tJersey Joe\tVictor\t23402\t57081-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5466.mp3\tCozy Cole Allstars\tJersey Jump Off\tSAVOY\t519B\tS5466\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE402940-B.mp3\tLuis Russell And His Orch\tJersey Lightning\tOKeh\t8734\t402940-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142704-3.mp3\tEthel Waters\tJersey Walk\tCOLUMBIA\t14182 D\tW142704-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_1100_03.mp3\tLee Morse\tJersey Walk\tPerfect\t11636A\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19306.mp3\tCab Calloway & His Orch\tJes' Natch'ully Lazy\tBRUNSWICK\t7677\t19306\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-19298-1.mp3\tMills Blue Rhythm Band\tJes' Natch'ully Lazy (i Was Born That Way)\tColumbia\t3134-D\tCO-19298-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MonUS-4.mp3\tJess Stacy & His Stars\tJess Stay\tMontgomeryWard\t10088\tUS-4\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-24063-1.mp3\tHarry James And The Boogie Woogie Trio\tJesse\tBrunswick\t8350\tB-24063-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CON13793-1.mp3\tJoshua White\tJesus Gonna Make Up My Dyin' Bed\tCONQUEROR\t8244\t13793-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCON8244.mp3\tJoshua White\tJesus Gonna Make Up My Dyin' Bed\tCONQUEROR\t8244\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147574.mp3\tWashington Phillips\tJesus Is My Friend\tCOLUMBIA\t14404 D\tW147574\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_060.mp3\tAlma Gluck And Louise Homer\tJesus, Lover Of My Soul\tVICTOR\t87200\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_183.mp3\tNat ''king'' Cole Feat. Joe Lipman's Orchestra And The Ray Charles Singers\tJet\tCAPITOL\t1365\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/MER859.mp3\tHelen Humes\tJet Propelled Papa\tMERCURY\t8047\t859\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4455.mp3\tFrankie Laine\tJezebel\tCOLUMBIA\t39367\tHCO4455\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE30283-2.mp3\tGolden Gate Jubilee Qt\tJezebel\tOKEH\t6204\t30283-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021039.mp3\tTommy Dorsey & His Orch\tJezebel\tVICTOR\t25795\t021039\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_013.mp3\tFrankie Laine\tJezebel\tCOLUMBIA\t39367\tHCO4455\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22578.mp3\tEarl Hines & His Orch\tJezebel (v Ida Mae Johnson)\tVOCALION\t4032\t22578\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI1583-A.mp3\tStevens' Trio\tJi-ji Boo - Novelty Foxtrot\tEDISON\t\t1583-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU022321.mp3\tBill Boyd's Cowboy Ramblers\tJig\tBLUEBIRD\t7691\t022321\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COL265068.mp3\tJoe Venuti's Blue Five\tJig Saw Puzzle Blues\tCOLUMBIA\t2782 D\t265068\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12262-A.mp3\tThree Keys\tJig Time\tBRUNSWICK\t6388\t12262-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_038.mp3\tTeresa Brewer Feat. Jack Pleis Orchestra\tJilted\tCoral\t61152\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU063876.mp3\tDinah Shore\tJim\tBLUEBIRD\t11204\t063876\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31002.mp3\tBillie Holiday\tJim\tOKEH\t6369\t31002\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69784.mp3\tElla Fitzgerald & Her Orch\tJim\tDECCA\t4007A\t69784\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_043.mp3\tDinah Shore\tJim\tBLUEBIRD\t11204\t063876\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_039.mp3\tJimmy Dorsey And His Orchestra\tJim\tDECCA\t3963A\t69594\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69594.mp3\tJimmy Dorsey And His Orch.\tJim (vhelen O'connell)\tDECCA\t3963A\t69594\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/PARL0057.mp3\tCharles Patton\tJim Lee Blues\tPARAMOUNT\t13080A\tL0057\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic1008881.mp3\tFletcher Henderson And His Orchestra\tJim Town Blues\tVictor\t25379\t1008881  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/SES174.mp3\tPete Brown Quartet\tJim's Idea\tSESSION\t12012\t174\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COL17306-1.mp3\tSweet Violet Boys\tJim's Windy Mule\tCOLUMBIA\t37764\t17306-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5527-1-2.mp3\tFletcher Henderson & His Orch\tJiminy Gee\tBANNER\t1361\t5527-1-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC69427-4.mp3\tJimmie Rodgers\tJimmie Rodgers Visits The Carter Family\tVICTOR\t23574\t69427-4\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU76160-1.mp3\tJimmie Rodgers\tJimmie Rodgers' Last Blue Yodel\tBLUEBIRD\t5281\t76160-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC67135-3.mp3\tJimmie Rodgers\tJimmie The Kid\tVICTOR\t23549\t67135-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/Mon55332.mp3\tJimmie Rodgers\tJimmie's Texas Blues\tMontgomeryWard\t4212\t55332\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban5527-1.mp3\tFletcher Henderson And His Orchestra\tJimminy Gee\tBanner\t1361\t5527-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB5051-1.mp3\tAda Jones-len Spencer\tJimmy And Maggie At The Merry Widow's\tVICTOR\t16126\tB5051-1\t1908\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC10846-4.mp3\tPeerless Qt\tJimmy Valentine\tVICTOR\t17036\t10846-4\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_145.mp3\tCount Basie And His Orchestra Feat. Jimmy Rushing\tJimmy's Blues\tCOLUMBIA\t36831\tCO33954\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D240.mp3\tCount Basie & His Orch\tJimmy's Blues (vjr) Take Me Back Baby\tV-DISC\t240\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1357.mp3\tCount Basie & His Orchestra\tJimmy's Boogie Woogie\tV-DISC\t534\t1357\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COL25801-1.mp3\tWill Bradley And His Orch\tJimtown Blues\tCOLUMBIA\t35376\t25801-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14412-3-4.mp3\tCotton Pickers\tJimtown Blues\tBRUNSWICK\t2766\t14412-3-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100886-1.mp3\tFletcher Henderson & His Orch\tJimtown Blues\tVICTOR\t25379A\t100886-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2853.mp3\tBob Crosby & His Orchestra\tJimtown Blues\tDECCA\t25475\tDLA2853\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/MER631.mp3\tJimmy Witherspoon W J.mcshann\tJimtown Boogie\tMERCURY\t8026\t631\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU071192.mp3\tGlenn Miller And His Orch\tJingle Bells\tBLUEBIRD\t11353A\t071192\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1881x.mp3\tLes Paul And Mary Ford\tJingle Bells\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC92549-1.mp3\tBenny Goodman And His Orchestra\tJingle Bells\tVICTOR\t25145\t92549-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC92549-1.mp3\tBenny Goodman And His Orchestra\tJingle Bells\tVICTOR\t25145\t92549-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76845.mp3\tArtie Shaw And His Orchestra\tJingle Bells\tDECCA\t27243\t76845\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/CONW3332.mp3\tSlam Stewart Qt\tJingle Bells\tCONTIN\t10003\tW3332\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO30y.mp3\tFirehouse Five Plus Two\tJingle Bells\tGood Time Jazz\t30\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-131-1.mp3\tBenny Carter And His Swing Quintet\tJingle Bells\tVocalion\tS-39\tS-131-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_252.mp3\tBenny Goodman And His Orchestra\tJingle Bells\tVICTOR\t25145\t92549-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/COLRZSP10873.mp3\tPete Rugolo And His Orchestra\tJingle Bells Mambo\tCOLUMBIA\t40369\tRZSP 10873\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO32826-1.mp3\tKay Kyser & His Orchestra\tJingle Jangle Jingle\tCOLUMBIA\t36604\tCO32826-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL36604.mp3\tKay Kyser & His Orchestra\tJingle Jangle Jingle\tCOLUMBIA\t36604\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_105.mp3\tGene Autry\tJingle Jangle Jingle\tOKEH\t6690\tH0831\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27909.mp3\tFreddy Martin & His Orchestra\tJingle, Jangle, Jingle\tVictor\t27909\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_026.mp3\tMerry Macs\tJingle, Jangle, Jingle\tDECCA\t18361A\tDLA2913\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_291.mp3\tCab Calloway And His Orchestra\tJitter Bug\tVICTOR\t24592\t81090-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic81090-1.mp3\tCab Calloway And His Cotton Club Orchestra\tJitter Bug\tVictor\t24592\t81090-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU81090-1.mp3\tCab Calloway & His Orchestra\tJitterbug\tBLUEBIRD\t5676\t81090-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66957.mp3\tBlue Lu Barker & Fly Cats\tJitterbug Blues\tDECCA\t7713\t66957\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1639.mp3\tLouis Prima New Orleans Gang\tJitterbugs On Parade\tDECCA\t2242B\tDLA1639\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-897-1.mp3\tCab Calloway And His Orchestra\tJive (page One Of The Hepster's Dictionary)\tVocalion\t4437\tM-897-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC64982.mp3\tCount Basie And His Orch\tJive At Five\tDECCA\t2922B\t64982\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60982-A.mp3\tCount Basie And His Orchestra\tJive At Five\tDecca\t2922\t60982-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13801-A.mp3\tDuke Ellington & His Orch\tJive Stomp\tBRUNSWICK\t6638\t13801-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWm-1103-A.mp3\tCab Calloway And His Orchestra\tJiveformation Please\tVocalion\t5195\tWm-1103-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1564-1.mp3\tCount Basie & His Orchestra\tJivin' Joe Jackson\tCOLUMBIA\t36889\tHCO1564-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_171.mp3\tCount Basie And His Orchestra Feat. Ann Moore\tJivin' Joe Jackson\tCOLUMBIA\t36889\tHCO1564-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC04583-1.mp3\tLionel Hampton And His Orch\tJivin' The Vibes\tVICTOR\t25535\t04583-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic04583-1.mp3\tLionel Hampton And His Orchestra\tJivin' The Vibes\tVictor\t25535\t04583-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR97-2.mp3\tIllinois Jacquet\tJivin' With Jack The Bellboy\tALLADDIN\t179\tRR97-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic049933-1.mp3\tLionel Hampton And His Orchestra\tJivin' With Jarvis\tVictor\t26724\t049933-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC1856.mp3\tRed Norvo And His Orch\tJiving The Jeep\tBRUNSWICK\t7896\tC1856\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COL77044.mp3\tHenry Burr (tenor)\tJoan Of Arc\tCOLUMBIA\tA-2273\t77044\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_015.mp3\tHenry Burr\tJoan Of Arc\tColumbia\t2273\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC72692.mp3\tLouis Armstrong And His Orch\tJodie Man\tDECCA\t18652B\t72692\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80715.mp3\tEddie Cantor\tJoe Is Here\tCOLUMBIA\tA-3784\t80715\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL300.mp3\tHi-flyers\tJoe Turner Blues\tVOCALION\t3647\tDAL300\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC1242.mp3\tJohnny Dodds Black Bottom St.\tJoe Turner Blues\tBRUNSWICK\t3696\tC1242\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/Oke28876-1.mp3\tBenny Carter And His All Star Orchestra\tJoe Turner Blues (& Joe Turner)\tOkeh\t6001\t28876-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5423.mp3\tJoe Marsala's All-timers\tJoe's Blues\tSAVOY\t504\tS5423\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM54S119.mp3\tBetty Madigan\tJoey\tMGM\t11716\t54S119\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_262.mp3\tJeri Southern\tJoey\tDECCA\t29184\tL7700\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_076.mp3\tBetty Madigan\tJoey\tMGM\t11716\t54S119\t1954\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480861.mp3\tRichard Hayman, His Harmonica And Orchestra\tJoey's Theme (from ''the Little Fugitive'')\tMERCURY\t70252\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_407.mp3\tPeggy Lee\tJoey, Joey, Joey\tDecca\t29877\tL8905\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_198.mp3\tStan Freberg\tJohn And Marsha\tCapitol\t1356\t6826-D7\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5133.mp3\tLeadbelly\tJohn Hardy\tMUSICRAFT\t311\t5133\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45024-2.mp3\tCarter Family\tJohn Hardy Was A Desperate Little Man\tVICTOR\t40190\t45024-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC055285.mp3\tDuke Ellington & His Orch\tJohn Hardy's Wife\tVICTOR\t27434\t055285\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480770.mp3\tWoody Herman All Stars\tJohn Hardy's Wife\tV-Disc\t752\t\t1945\tBill Harris (tb), Ben Webster (ts), Ralph Burns (p), Billy Bauer (g), Chubby Jackson (sb), Johnny Blowers (dm)\nhttp://www.jazz-on-line.com/a/mp3a/BLU102601.mp3\tJ.e.mainer's Mountaineers\tJohn Henry Was A Little Boy\tBLUEBIRD\t6629\t102601\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D117B.mp3\tJimmy Dorsey And His Orchestra\tJohn Silver\tV-DISC\t117B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_245.mp3\tJimmy Dorsey And His Orchestra\tJohn Silver\tV-DISC\t117B\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC62334-A.mp3\tCount Basie And His Orch\tJohn's Idea\tDECCA\t3518B\t62334-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_246.mp3\tJohnnie Ray\tJohnnie's Comin' Home\tColumbia\t40578\tHCO33510\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402510-B.mp3\tFrank Hutchinson\tJohnny And Jane\tOKeh\t45361\t402510-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402511-B.mp3\tFrank Hutchinson\tJohnny And Jane Pt.2\tOKeh\t45361\t402511-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_438.mp3\tJaye P. Morgan\tJohnny Casanova\tRCA\t6565\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_401.mp3\tFrank Sinatra\tJohnny Concho Theme (wait For Me)\tCapitol\t3469\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO733.mp3\tKay Kyser And His Orchestra\tJohnny Doughboy Found A Rose In Ireland\tCOLUMBIA\t36558\tHCO733\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC074307.mp3\tSwing And Sway With Sammy Kaye\tJohnny Doughboy Found A Rose In Ireland\tVICTOR\t27870\t074307\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL36558.mp3\tKay Kyser & His Orchestra\tJohnny Doughboy Found A Rose In Ireland\tCOLUMBIA\t36558\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_047.mp3\tKay Kyser And His Orchestra\tJohnny Doughboy Found A Rose In Ireland\tCOLUMBIA\t36558\tHCO733\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_067.mp3\tGuy Lombardo And His Royal Canadians\tJohnny Doughboy Found A Rose In Ireland\tDecca\t4278\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_079.mp3\tKenny Baker Feat. Harry Sosnik Orchestra\tJohnny Doughboy Found A Rose In Irland\tDECCA\t18274A\t70530\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI4714.mp3\tAda Jones And Billy Murray\tJohnny Get A Girl\tEDISON\t50363\t4714\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic035395-1.mp3\tLionel Hampton And His Orchestra\tJohnny Get Your Horn And Blow It\tVictor\t26343\t035395-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_041.mp3\tSong Spinners\tJohnny Zero\tDECCA\t18553B\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3h/DOT15365-B.mp3\tJohnny Maddox And The Rhythmasters\tJohnny's Medley (spaghetti Rag, Brush Creek Rag, South, San Antonio Rose, Old Piano Roll Blues)\tDOT\t15365-B\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/LON30004x.mp3\tJack Teter\tJohnson Rag\tLONDON\t501\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043356.mp3\tGlenn Miller & His Orch\tJohnson Rag\tBLUEBIRD\t10498\t043356\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP6928.mp3\tPete Daily\tJohnson Rag\tCAPITOL\t1730\t6928\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_073v2.mp3\tRuss Morgan And His Orchestra\tJohnson Rag\tDECCA\t2778A\t66501\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh169.mp3\tNat Gonella And His New Georgians\tJohnson Rag\tColumbia\tFB-2638\tCA-18495-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_243.mp3\tLarry Clinton And His Orchestra\tJohnson Rag\tVICTOR\t26414\t043340\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_136.mp3\tJimmy Dorsey And His Orchestra\tJohnson Rag\tCOLUMBIA\t38649\tCO41829\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145058-2.mp3\tGid Tanner's Skillet Lickers\tJohnson's Old Gray Mule\tCOLUMBIA\t15221 D\tW145058-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65122.mp3\tCliff Bruner's Texas Wanderers\tJojo (joe Thomas)\tDECCA\t5664\t65122\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2205.mp3\tRoy Acuff And Smoky Mtn.boys\tJole Blon\tCOLUMBIA\t37287\tHCO2205\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK2295-K1.mp3\tMoon Mullican\tJole Blon's Sister\tKING\t632A\tK2295-K1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/EDI13583.mp3\tVesta Tilley - O\tJolly Good Luck To The Girl Who Loves A Soldier (kenneth Lyle - Fred W. Leigh)\tEDISON\t13583\t13583\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP5491-2D.mp3\tStan Kenton & His Orch\tJolly Rogers\tCAPITOL\t\t5491-2D\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_121.mp3\tLes Brown And His Orchestra\tJoltin' Joe Dimaggio\tOKEH\t6377\t31009\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE29867.mp3\tCab Calloway And His Orch\tJonah Joins The Cab\tOKEH\t6109\t29867\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC92000.mp3\tPort Arthur Jubileers\tJones Stomp\tDECCA\t5854\tC92000\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1550.mp3\tBing Crosby - J S Trotter\tJoobalai\tDECCA\t2200B\tDLA1550\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42551.mp3\tDuke Ellington& His Orch.\tJoog, Joog (vjoe Van Loan Qt)\tCOLUMBIA\t38789\tCO42551\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D543JG.mp3\tGene Krupa & His Orch\tJose Gonzalez\tV-DISC\t543\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63300-A.mp3\tAndrews Sisters\tJoseph, Joseph\tDECCA\t23605B\t63300-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_336.mp3\tAndrews Sisters\tJoseph, Joseph\tDECCA\t23605B\t63300-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1592x.mp3\tLes Paul\tJosephine\tCAPITOL\t1592\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC01916-1.mp3\tWayne King And His Orch\tJosephine\tVICTOR\t25518A\t01916-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/CON21559-2.mp3\tSammy Kaye Swing & Sway Orch\tJosephine\tCONQUEROR\t8905\t21559-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013524.mp3\tTommy Dorsey & His Clambake 7\tJosephine\tVICTOR\t25676\t013524\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_087.mp3\tLes Paul\tJosephine\tCapitol\t1592\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_058.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tJosephine\tVICTOR\t25676\t013524\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_186.mp3\tRalph Flanagan And His Orchestra\tJoshua\tRCA VICTOR\t3724\t\t1950\t\nhttp://www.jazz-on-line.com./a/mp3o/CAPLAg.mp3\tLaurindo Almeida, Guitar Stan Kenton & His Orchestra\tJourney To Brazil\tCAPITOL\t57631\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/COL41376JE.mp3\tFrankie Laine\tJourney's End\tCOLUMBIA\t41376\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC27153-2.mp3\tPaul Whiteman & His Orch\tJourney's End\tVICTOR\t18985\t27153-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/VicD9VB-2571.mp3\tLucky Millinder And His Orchestra\tJourney's End\tVictor\t20-3622\tD9VB-2571  \t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21107-B.mp3\tTroubadours\tJoy Bells\tVictor\t21107-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/JAZBN952.mp3\tJames P. Johnson And His Blue Note Jazzmen\tJoy Mentin'\tJAZZ SELECTION\tJ.S. 547\tBN952\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DOT15247y.mp3\tBilly Vaughn And His Orch\tJoy Ride\tDot\t15247\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_063.mp3\tTrinity Choir\tJoy To The World\tVICTOR\t16996\t10526-4\t1911\t\nhttp://www.jazz-on-line.com/a/mp3d/SOSW-135-1.mp3\tAlix Combelle And His Swing Band\tJoyeuse Fumee (holy Smoke)\tS\t85\tOSW-135-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14587-A.mp3\tFrankie Trumbauer & His Orch\tJuba Dance\tBRUNSWICK\t6763\t14587-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480416.mp3\tBenny Golson Quintet\tJubilation\tRiverside\tRLP12-290\t\t1958\tCurtis Fuller (tb), Benny Golson (ts), Barry Harris (p), Jymie Merritt (sb), Philly Joe Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480510.mp3\tArt Farmer Quintet\tJubilation\tUnited Artists\tUAL4007\t\t1958\tArt Farmer, T, Flh, Benny Golson, Ts, Addison Farmer, B, Bill Evans, P, Dave Bailey, D, Gigi Gryce, Ar\nhttp://www.jazz-on-line.com/a/mp3b/OKe400004-C.mp3\tFrankie Trumbauer & His Orch\tJubilee\tOKeh\t41044\t400004-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM691-3.mp3\tCab Calloway & His Orchestra\tJubilee\tVOCALION\t3896\tM691-3\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA-1133-A.mp3\tLouis Armstrong And His Orchestra\tJubilee\tDECCA\t1635\tDLA-1133-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-22083-1.mp3\tHarry James And His Orchestra\tJubilee\tBrunswick\t8038\tB-22083-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU43503-2.mp3\tDuke Ellington & His Orch\tJubilee Stomp\tBLUEBIRD\t6415A\t43503-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67360.mp3\tElla Fitzgerald & Her Orch\tJubilee Swing\tDECCA\t3236B\t67360\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09681.mp3\tLionel Hampton & His Orch\tJudy\tVICTOR\t25699\t09681\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25699.mp3\tLionel Hampton & His Orchestra\tJudy\tVictor\t25699\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic09681-2.mp3\tLionel Hampton And His Orchestra\tJudy\tVictor\t25699\t09681-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/MER237.mp3\tRex Stewart & His Rextet\tJug Blues\tMERCURY\t8001\t237\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP664.mp3\tCootie Williams & His Orch\tJuice Head Baby\tCAPITOL\t\t664\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_065.mp3\tPerry Como\tJuke Box Baby\tRCA Victor\t6427\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1243-1.mp3\tGeorgie Auld Orch\tJuke Box Jump\tVARSITY\t8159\tUS1243-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35826.mp3\tModernaires\tJuke Box Saturday Night\tCOLUMBIA\t36992\tCO35826\t1946\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20-1509.mp3\tGlenn Miller & His Orchestra\tJukebox Saturday Night\tVictor\t20-1509\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67588.mp3\tWoody Herman & His Orchestra\tJukin'\tDECCA\t3272B\t67588\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D117A1.mp3\tJimmy Dorsey And His Orchestra\tJulia\tV-DISC\t117A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB-15006-A.mp3\tEarl Hines And His Orchestra\tJulia\tBRUNSWICK\t6872\tB-15006-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu063331-1.mp3\tEarl Hines And His Orchestra\tJulia\tBluebird\tB-11199\t063331-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Benny Harris (tp) Joe McLewis, George Hunt, Edward Fant (tb) Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck\nhttp://www.jazz-on-line.com/a/mp3b/Blu063331-1.mp3\tEarl Hines And His Orchestra\tJulia (be Vcl)\tBluebird\tB-11199A\t063331-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64323.mp3\tMills Brothers\tJulius Caesar\tDECCA\t1964B\t64323\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64780.mp3\tAndy Kirk & Clouds Of Joy\tJulius Caesar\tDECCA\t2383B\t64780\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64780-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tJulius Caesar\tDecca\t2383\t64780-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO48416.mp3\tJimmy Dorsey\tJump Back Honey\tCOLUMBIA\t39896\tCO48416\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DeLD-166.mp3\tBenny Carter And His Orchestra\tJump Call\tDe Luxe\t1008\tD-166\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC061340.mp3\tDuke Ellington Orch\tJump For Joy\tVICTOR\t27517\t061340\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/LON194x.mp3\tGeorge Shearing\tJump For Joy-blue\tLONDON\t194\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VOC24244-1.mp3\tCount Basie And His Orch\tJump For Me\tVOCALION\t4886\t24244-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24244-1.mp3\tCount Basie And His Orchestra\tJump For Me\tVocalion\t4886\t24244-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64694-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tJump Jack Jump\tDecca\t2226\t64694-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23357.mp3\tSlim & Slam\tJump Session\tCBS\tVO4346\t23357\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU033903.mp3\tCharlie Barnet & His Orch\tJump Session\tBLUEBIRD\t10172A\t033903\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_126.mp3\tSlim And Slam\tJump Session\tVOCALION\t4346\t23357\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVS5469.mp3\tCozy Cole Allstars-c.hawkins\tJump Street\tSAVOY\t518\tS5469\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29581-1.mp3\tCount Basie And His Orchestra\tJump The Blues Away\tOkeh\t6157\t29581-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_195.mp3\tVic Damone Feat. George Bassman's Orchestra\tJump Through The Ring\tMERCURY\t5785\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64694.mp3\tAndy Kirk & Clouds Of Joy\tJump, Jack, Jump\tDECCA\t2226B\t64694\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23300-2.mp3\tRed Norvo & His Orch\tJump, Jump's Here\tBRUNSWICK\t8202\t23300-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5457-1.mp3\tLester Young\tJump, Lester, Jump\tSAVOY\t667\tS5457-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC055284-2.mp3\tDuke Ellington & His Orch\tJumpin Punkins\tVICTOR\t27356\t055284-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP125.mp3\tKing Cole Trio\tJumpin' At Capitol\tCAPITOL\t\t125\t\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1054.mp3\tIllinois Jacquet Allstars\tJumpin' At The Apollo\tAPOLLO\t766\tR1054\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5783.mp3\tSlam Stewart Qt\tJumpin' At The Deuce\tSAVOY\t538B\tS5783\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D5225.mp3\tLouis Jordan Tympany 5\tJumpin' At The Jubilee\tV-DISC\t196\t5225\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke6136.mp3\tAl Donahue & His Orchestra\tJumpin' At The Juke Box\tOkeh\t6136\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR124-3.mp3\tLester Young & His Sextet\tJumpin' At The Woodside\tALLADDIN\t200\tRR124-3\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/APO777JA.mp3\tIllinois Jacquet\tJumpin' At The Woodside\tAPOLLO\t777\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC64474-A.mp3\tCount Basie And His Orch\tJumpin' At The Woodside\tDECCA\t3709A\t64474-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_172.mp3\tCount Basie And His Orchestra\tJumpin' At The Woodside\tDECCA\t3709A\t64474-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-104-1.mp3\tAlix Combelle And His Swing Band\tJumpin' At The Woodside\tSwing\t93\tOSW-104-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65980.mp3\tWoody Herman & His Orchestra\tJumpin' Blues\tDECCA\t2664B\t65980\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68396.mp3\tBig Joe Turner\tJumpin' Down Blues\tDECCA\t7827\t68396\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU24824-B.mp3\tTeddy Wilson & His Orch\tJumpin' For Joy\tBRUNSWICK\t8438\t24824-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24824-B.mp3\tTeddy Wilson And His Orchestra\tJumpin' For Joy\tBrunswick\t8438\tB-24824-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU067547-1.mp3\tErskine Hawkins\tJumpin' In A Julep Joint\tBLUEBIRD\t11547\t067547-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69237.mp3\tSkeets Tolbert Gentlemen Swing\tJumpin' In The Numbers\tDECCA\t8565A\t69237\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec69237-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tJumpin' In The Numbers\tDecca\t8565\t69237-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26757-A.mp3\tJohn Kirby & His Orch\tJumpin' In The Pump Room\tCBS\toK5661\t26757-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/SAV5871.mp3\tIllinois Jacquet\tJumpin' Jacquet\tSAVOY\t593A\t5871\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB2663.mp3\tColeman Hawkins Allstars\tJumpin' Jane\tRCA\t20-3143\tD7VB2663\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D470.mp3\tJimmy Dorsey & His Band\tJumpin' Jehosaphat\tV-DISC\t470\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_250.mp3\tWayne King And His Orchestra\tJumpin' Jupiter\tVictor\t27575\t064464\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68192.mp3\tSkeets Tolbert Gentlemen Swing\tJumpin' Like Mad\tDECCA\t8528\t68192\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec68192-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tJumpin' Like Mad\tDecca\t8528\t68192-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/MER1642.mp3\tHelen Humes\tJumpin' On Sugar Hill\tMERCURY\t8077\t1642\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26058-A.mp3\tTeddy Wilson & His Orch\tJumpin' On The Blacks And White\tCOLUMBIA\t35232\t26058-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Col26058-A.mp3\tTeddy Wilson And His Orchestra\tJumpin' On The Blacks And Whites\tColumbia\t35232\t26058-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD4VB1055.mp3\tArtie Shaw And His Orchestra\tJumpin' On The Merry Go Round\tRCA\t20-1612\tD4VB1055\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66775.mp3\tAl Cooper And His Savoy Sultans\tJumpin' The Blues\tDECCA\t2930B\t66775\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68459.mp3\tSam Price's Texas Blusicians\tJumpin' The Boogie\tDECCA\t8515\t68459\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM51S3157.mp3\tLionel Hampton And His Orch\tJumpin' With G.h.\tMGM\t11765\t51S3157\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-3157.mp3\tLionel Hampton And His Orchestra\tJumpin' With G.h.\tMGM\t11765\t51-S-3157\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL163.mp3\tLester Young Sextet\tJumpin' With Symphony Sid\tALLADDIN\t163\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8933JW.mp3\tOscar Peterson\tJumpin' With Symphony Sid\tMERCURY\t8933\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64474-A.mp3\tCount Basie And His Orch\tJumping At The Woodside\tDECCA\t2212A\t64474-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051260-1.mp3\tErskine Hawkins & His Orch\tJunction Blues\tBLUEBIRD\t10790\t051260-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/CorLA-5897.mp3\tLionel Hampton And His Orchestra\tJune\tCoral\t6.22423\tLA-5897\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0331_01.mp3\tLee Morse\tJune Brought Ther Oses\tPerfect\t11573A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3693.mp3\tBing Crosby - J.s.trotter\tJune Comes Around Every Year\tDECCA\t18675A\tL3693\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA71-A.mp3\tBing Crosby W George Stoll\tJune In January\tDECCA\t310A\tDLA71-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39322.mp3\tClaude Hopkins And His Orchestra\tJune In January\tDECCA\t441B\t39322\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA71-B.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tJune In January\tDecca\t310\tDLA71-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruDLA71-A.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tJune In January\tBrunswick\tE01951\tDLA71-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_205.mp3\tGuy Lombardo And His Royal Canadians\tJune In January\tDecca\t307\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh153.mp3\tTeddy Joyce And His Orchestra\tJune In January (v Jack Plant\tHMV\tB-6566\tOEA-706-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO34645-4.mp3\tBenny Goodman & His Orch\tJune Is Bustin' Out All Over (vocal Kay Peyton)\tCOLUMBIA\t36823\tCO34645-4\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62141.mp3\tClaude Hopkins & His Orchestra\tJune Night\tDECCA\t1286\t62141\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81795-1.mp3\tTed Lewis & His Band\tJune Night\tCOLUMBIA\t157D\t81795-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_015.mp3\tTed Lewis And His Band\tJune Night\tCOLUMBIA\t157D\t81795-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67111.mp3\tLouis Jordan & His Tympani 5\tJune Tenth Jamboree\tDECCA\t7723\t67111\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE27638-A.mp3\tBenny Goodman And His Boys\tJungle Blues\tBRUNSWICK\t4013\tE27638-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38630-3.mp3\tJelly Roll Morton Hot Peppers\tJungle Blues\tVICTOR\t21345\t38630-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic38630-3.mp3\tJelly-roll Morton's Red Hot Peppers\tJungle Blues\tVictor\t21345\t38630-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030735.mp3\tArtie Shaw And His Orchestra\tJungle Drums\tBLUEBIRD\t10090\t030735-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA1338.mp3\tHenry King And His Orchestra\tJungle Drums\tDECCA\t2069B\tDLA1338\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_278.mp3\tArtie Shaw And His Orchestra\tJungle Drums\tBLUEBIRD\t10091A\t030735\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC2069-A.mp3\tHenry King And His Orchestra\tJungle Drums\tDECCA\t2069-A\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA131-A.mp3\tMills Bros\tJungle Fever\tBRUNSWICK\t6785\tLA131-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUB-15326-A.mp3\tCasa Loma Orchestra\tJungle Fever\tBRUNSWICK\t6932\tB-15326-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE30586.mp3\tDuke Ellington & His Orch\tJungle Jamboree\tOkeh\t8720\t402551-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/BruE-30586-A.mp3\tThe Jungle Band\tJungle Jamboree\tBrunswick\t4492\tE-30586-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU22825-2.mp3\tTeddy Wilson & His Orch\tJungle Love\tBRUNSWICK\t8150\t22825-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUWC2589.mp3\tGene Krupa & His Orch\tJungle Madness\tBRUNSWICK\t8400\tWC2589\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VarM-4-1.mp3\tMills Blue Rhythm Band\tJungle Madness\tVariety\t503\tM-4-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC62193-2.mp3\tDuke Ellington And His Orch\tJungle Nights In Harlem\tVICTOR\t23022\t62193-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478345.mp3\tJose Melis And His Orchestra\tJungle Rhumba\tMERCURY\t\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D125B2.mp3\tSpike Jones And His City Slickers\tJungle Town\tV-DISC\t125B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU15938-A.mp3\tJack Teagarden's Orch\tJunk Man\tBRUNSWICK\t7652\t15938-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38662.mp3\tSpirits Of Rhythm\tJunk Man\tDECCA\t160A\t38662\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW152702.mp3\tBenny Goodman & His Orch\tJunk Man\tCOLUMBIA\t2892 D\tW152702\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3592.mp3\tChampion Jack Dupree\tJunker Blues\tOKEH\t6152\tC3592\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOKE6152j.mp3\tChampion Jack Dupree\tJunker Blues\tOKEH\t6152\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO32481.mp3\tBuddy Clark\tJust A Baby's Prayer At Twilight\tCOLUMBIA\t36704-B\tCO32481\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21439-8.mp3\tHenry Burr (tenor W Orch)\tJust A Baby's Prayer At Twilight\tVICTOR\t18439A\t21439-8\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP94.mp3\tBenny Carter & His Orchestra\tJust A Baby's Prayer At Twilight\tCAPITOL\t\t94\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap94-A.mp3\tBenny Carter And His Orchestra\tJust A Baby's Prayer At Twilight\tCapitol\t165\t94-A\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_001.mp3\tHenry Burr\tJust A Baby's Prayer At Twilight (for Her Daddy Over There)\tVICTOR\t18439A\t21439-8\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_076.mp3\tAbe Lyman And His California Orchestra\tJust A Bird's Eye View Of My Old Kentucky Home\tBrunswick\t3322\t20157\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU20157.mp3\tAbe Lyman And His Orch\tJust A Bird's Eye View Of My Old Kentucky Home\tBRUNSWICK\t3322\t20157\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC14505x.mp3\tRed Foley\tJust A Closer Walk With Thee\tDECCA\t14505\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20010-B.mp3\tWaring's Pennsylvanians\tJust A Cottage Small (by A\tVictor\t20010-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC68938-2.mp3\tBlanche Calloway & Her Orch\tJust A Crazy Song\tVICTOR\t22661\t68938-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151206-1.mp3\tTed Lewis And His Band Vocal By Ted Lewis\tJust A Gigolo\tCOLUMBIA\t2378 D\tW151206-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26178.mp3\tRaymond Scott And His New Orch\tJust A Gigolo\tCOLUMBIA\t35363\t26178\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe404420-A.mp3\tLouis Armstrong And His Orch\tJust A Gigolo\tOKeh\t41486\t404420-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22606-A.mp3\tLeo Reisman And His Orch\tJust A Gigolo\tVICTOR\t22606\t67757\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC7195.mp3\tBen Bernie & His Orch\tJust A Gigolo\tBRUNSWICK\t6023\tC7195\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC61078-2.mp3\tBing Crosby\tJust A Gigolo\tVICTOR\t22701\t61078-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_239.mp3\tJaye P. Morgan\tJust A Gigolo\tDECCA\t29611\t87701\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_040.mp3\tBen Bernie And His Orchestra\tJust A Gigolo\tBRUNSWICK\t6023\tC7195\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_013.mp3\tTed Lewis And His Band\tJust A Gigolo\tCOLUMBIA\t2378\tW151206-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC28435.mp3\tHenry Burr\tJust A Girl That Men Forget\tVICTOR\t19131\t28435\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_024.mp3\tHenry Burr\tJust A Girl That Men Forget\tVICTOR\t19131\t28435\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57482-3.mp3\tKay Kyser & His Orch\tJust A Haven\tVICTOR\t40222B\t57482-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64466.mp3\tMills Brothers\tJust A Kid Named Joe\tDECCA\t2029A\t64466\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1690.mp3\tBing Crosby & Trotter's Orch\tJust A Kid Named Joe\tDECCA\t3601B\tDLA1690\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CON29976-1.mp3\tGene Krupa & His Orch\tJust A Little Bit South Of North Carolina\tCONQUEROR\t9654\t29976-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_096.mp3\tMitchell Ayres And His Fashions In Music\tJust A Little Bit South Of North Carolina\tBluebird\t11101\t060990\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481105.mp3\tGene Krupa Orch. Feat. Anita O'day\tJust A Little Bit South Of North Carolina\tOkeh\t6130\t29976-1\t1941\tTorg Halten, Shorty SherockNorman Murphy, Graham Young (tp), Pat Virgademo, Jay Kelliher, Babe Wagner (tb), Clint Neagley, Mascagni ''Musky'' Ruffo (as), Walter Bates (ts), Sam Musiker (cl,ts), Bob Kitsis (p), Ray Biondi (g), Ovid ''Biddy'' Bastien (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3b/VIC63118-3.mp3\tRudy Vallee & His Ct.yankees\tJust A Little Closer\tVICTOR\t22489\t63118-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1084.mp3\tHit-of-the-week Orch\tJust A Little Closer\tHit-Of-The-Week\t1084\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_107.mp3\tRuth Etting\tJust A Little Closer\tCOLUMBIA\t2307\tW150743-7\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_089.mp3\tRudy Vallee And His Connecticut Yankees\tJust A Little Closer\tVICTOR\t22489\t63118-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35112.mp3\tGene Krupa & His Orch\tJust A Little Fond Affection\tCOLUMBIA\t36877\tCO35112\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT572.mp3\tLouis Prima & His Orchestra\tJust A Little Fond Affection\tMAJESTIC\t7156\tT572\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12647-A.mp3\tGuy Lombardo Royal Canadians\tJust A Little Home For The Old Folks\tBRUNSWICK\t6440\t12647-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41378-2.mp3\tJean Goldkette & His Orch\tJust A Little Kiss From A Little Miss\tVICTOR\t21150\t41378-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142831.mp3\tArt Gillam\tJust A Little Longer\tCOLUMBIA\t806 D\tW142831\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_170.mp3\tPhil Spitalny And His Orchestra\tJust A Little Longer\tVictor\t20272\t36392-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_170.mp3\tEddie Fisher\tJust A Little Lovin'\tRCA\t20-4680\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_105.mp3\tEddy Arnold\tJust A Little Lovin' (will Go A Long, Long Way)\tRCA Victor\t3013\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_175.mp3\tGene Austin Feat. O/dorsey Brothers\tJust A Little Street Where Old Friends Meet\tMelotone\t12529\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_0926_02.mp3\tLee Morse And Her Bluegrass Boys\tJust A Little While\tColumbia\t2308DB\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20907-B.mp3\tHarold Yates-cooper Lawley\tJust A Memory\tVictor\t20907-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COLZSP5430.mp3\tHerman Chittison Trio\tJust A Memory\tCOLUMBIA\t39398\tZSP5430\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC39576-4.mp3\tPaul Whiteman & His Orch\tJust A Memory\tVICTOR\t20881A\t39576-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_132.mp3\tVincent Lopez And His Orchestra\tJust A Memory\tBrunswick\t3633\t24257\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh119.mp3\tThe Piccadilly Revels Band Dir. By Ray Starita\tJust A Memory\tColumbia\t4604\tWA-6357-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3088.mp3\tHank Penny's Radio Cowboys\tJust A Message\tOKEH\t5654\tWC3088\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB2171.mp3\tCount Basie & His Orchestra\tJust A Minute\tRCA\t20-3051\tD7VB2171\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151571-2.mp3\tArt Gillam\tJust A Minute More To Say Goodbye\tCOLUMBIA\t2506 D\tW151571-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47068.mp3\tSarah Vaughan\tJust A Moment More\tCOLUMBIA\t39576\tCO47068\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480669.mp3\tRed Norvo Sextet\tJust A Mood\tRCA\tLPM1449\tH2JB252\t1957\tHarry \"Sweets\" Edison (tp), Ben Webster (ts), Red Norvo (vib, xyl), Jimmy Rowles (p), Bob Carter (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1945_135.mp3\tSammy Kaye And His Orchestra\tJust A Prayer Away\tRCA\t20-1642\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3471.mp3\tBing Crosby & Ken Darby Sing.\tJust A Prayer Away (vocal Ethel Smith)\tDECCA\t23392\tL3471\t1944\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU20617.mp3\tLeo Reisman & His Orch\tJust A Quiet Evening\tBRUNSWICK\t7831\t20617\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM200-1.mp3\tEdgar Hayes & His Orch\tJust A Quiet Evening (v O R)\tVARIETY\tI513\tM200-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480760.mp3\tBig Sidney Catlett Quartet\tJust A Riff\tCommodore\tC1515\tA-4741-1\t1944\tBen Webster (ts) Marlowe Morris (p) John Simmons (b) Sidney Catlett (d)\nhttp://www.jazz-on-line.com/a/mp3c/BLU64002-2.mp3\tMckinney's Cotton Pickers\tJust A Shade Of Corn\tBLUEBIRD\t2275\t64002-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62725.mp3\tChick Webb And His Orchestra\tJust A Simple Melody\tDECCA\t1521\t62725\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC017467.mp3\tTommy Dorsey & His Orch\tJust A Simple Melody\tVICTOR\t25750\t017467\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_291.mp3\tTommy Dorsey And His Orchestra\tJust A Simple Melody\tVICTOR\t25750\t017467\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU102745.mp3\tMonroe Brothers\tJust A Song Of Old Kentucky\tBLUEBIRD\t6552\t102745\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCLA1445.mp3\tMildred Bailey & Her Orchestra\tJust A Stone's Throw Away From Heaven\tVOCALION\t3712\tLA1445\t\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR761-Hx.mp3\tJerry Mason And His Californians\tJust A Sweetheart\tHarmony\t761-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA7-A.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tJust A Wearyin' For You\tDecca\t100\tDLA7-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA7-B.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tJust A Wearyin' For You\tDecca\t\tDLA7-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP777.mp3\tStan Kenton's Orchestra\tJust A-settin' And A-rockin'\tCAPITOL\t\t777\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiUnkj.mp3\tDuke Ellington & His Famous Orchestra\tJust A-settin' And A-rockin'\tUnknown\t\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480734.mp3\tDuke Ellington And His Famous Orchestra\tJust A-settin' And A-rockin'\tVictor\t27587\t061285-1\t1941\tWardell Jones, Ray Nance (tp), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Barney Bigard (cl), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (cl, as, bsx), Ben Webster (ts), Duke Ellington, Billy Strayhorn (p), Fred Guy (g), Jimmy Blanton (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3a/DEC72969A.mp3\tDelta Rhythm Boys\tJust A-sittin' And A-rockin'\tDECCA\t18739A\t72969A\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_229.mp3\tDelta Rhythm Boys\tJust A-sittin' And A-rockin'\tDECCA\t18739A\t72969A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5313.mp3\tGeorgie Auld & His Orch\tJust A-sittin' And A-rockin' (lynne Stevens)\tMUSICRAFT\t15044\t5313\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA7-B.mp3\tBing Crosby\tJust A-wearyin' For You\tDECCA\t100B\tDLA7-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63577.mp3\tBob Howard & His Orch\tJust About The Time\tDECCA\t1790B\t63577\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU12530-A.mp3\tBing Crosby\tJust An Echo In The Valley\tBRUNSWICK\t6454\t12530-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1997-2.mp3\tCharlie Palloy & His Orch\tJust An Echo In The Valley\tCROWN\t3462\tC1997-2\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_013.mp3\tBing Crosby\tJust An Echo In The Valley\tBRUNSWICK\t6454\t12530-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_034.mp3\tRudy Vallee And His Connecticut Yankees\tJust An Echo In The Valley\tCOLUMBIA\t2733 D\tW152330-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S3102.mp3\tBilly Eckstine W Sonny Burke\tJust An Old Love Of Mine\tMGM\t10043\t47S3102\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18918A.mp3\tGlen Gray And His Orch\tJust An Old Manuscript\tDECCA\t18918A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1176.mp3\tCount Basie & His Orchestra\tJust An Old Manuscript\tV-DISC\t575\t1176\t1945\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20724.mp3\tWaring's Pennsylvanians\tJust Another Day Waisted Away\tVictor\t20724\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20724-A.mp3\tWaring's Pennsylvanians\tJust Another Day Wasted Awa\tVictor\t20724-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_241.mp3\tJo Stafford\tJust Another Polka\tCOLUMBIA\t40000\tRHCO10468\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_274.mp3\tEddie Fisher\tJust Another Polka\tRCA Victor\t5293\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp37/DECDLA2407A.mp3\tTed Lewis And His Orchestra\tJust Around The Corner\tDECCA\t23918 B\tDLA2407A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC34615-4.mp3\tRevelers\tJust Around The Corner\tVICTOR\t19968\t34615-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_145.mp3\tRevelers\tJust Around The Corner\tVICTOR\t19968\t34615-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_410.mp3\tPat Boone\tJust As Long As I'm With You\tDot\t15457\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_024.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra And Pied Pipers\tJust As Though You Were Here\tVICTOR\t27903A\t075904-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC075904-1.mp3\tTommy Dorsey And His Orch\tJust As Though You Were Here (vfs)\tVICTOR\t27903A\t075904-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COL78408.mp3\tBilly Murray (tenor)\tJust As We Used To Do\tCOLUMBIA\tA-2746\t78408\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_069.mp3\tFrankie Yankovic And His Yanks\tJust Because\tCOLUMBIA\t38072\tCO38326\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_149.mp3\tEddy Howard And His Orchestra\tJust Because\tMAJESTIC\t1231\tT1443\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10576.mp3\tDoris Day\tJust Blew In From The Windy City\tCOLUMBIA\t40095\tRHCO10576\t\t\nhttp://www.jazz-on-line.com/a/mp3c/AJA31544.mp3\tFletcher Henderson Orch\tJust Blues\tAJAX\tAJX17029\t31544\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/MelE-36456-A.mp3\tConnie's Inn Orchestra\tJust Blues\tMelotone\tM-12239\tE-36456-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Aja31544.mp3\tFletcher Henderson And His Orchestra\tJust Blues\tAjax\t17029\t31544\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe71582.mp3\tThomas Morris Past-jazz Master\tJust Blues, That's All\tOKeh\t8075\t71582\t1923\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480476.mp3\tBenny Golson\tJust By Myself\tContemporary\tC3552\t\t1957\tArt Farmer (tp), Jimmy Cleveland (tb), Julius Watkins (fhr), Gigi Gryce (as), Benny Golson (ts), Sahib Shihab (bar), Wynton Kelly (p), Paul Chambers (sb),  Charlie Persip (dm)\nhttp://www.jazz-on-line.com/a/mp3l/COLW144461.mp3\tLeo Reisman & His Orch\tJust Call On Me\tCOLUMBIA\t1095 D\tW144461\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/SAVS5702.mp3\tDon Byas Orchestra\tJust Can't Make Up My Mind (1944 Stomp)\tSAVOY\tSJL 2213\tS5702\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVU1163.mp3\tGene Ammons\tJust Chip\tSAVOY\t4528\tU1163\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR143-1.mp3\tLester Young Sextet\tJust Coolin'\tALLADDIN\t3057\tRR143-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1096.mp3\tArtie Shaw And His Orchestra\tJust Floating Along\tRCA\t20-1935\tD5VB1096\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D158A.mp3\tLes Brown And His Orchestra\tJust For A Day\tV-DISC\t158A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec90971-A.mp3\tLil Armstrong And Her Swing Band\tJust For A Thrill\tDecca\t1182\t90971-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/LVSOSW-505-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tJust For Fun\tLVSM\tFELP208\tOSW-505-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic055532-1.mp3\tLionel Hampton And His Orchestra\tJust For Laffs\tVictor\t26793\t055532-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC055532.mp3\tLionel Hampton & His Orch\tJust For Laughs\tVICTOR\t26793\t055532\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_208.mp3\tFrank Sinatra\tJust For Now\tCOLUMBIA\t38225\tCO38275\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3089.mp3\tHank Penny's Radio Cowboys\tJust For Old Times Sake\tOKEH\t6004\tWC3089\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69159.mp3\tPete Johnson\tJust For You\tDECCA\t8582A\t69159\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70100.mp3\tLionel Hampton & His Orch.\tJust For You\tDECCA\t18265B\t70100\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70100-A.mp3\tLionel Hampton And His Orchestra\tJust For You\tDecca\t18265\t70100-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5237.mp3\tTeddy Wilson Quintet\tJust For You Blues\tMUSICRAFT\t316\t5237\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149648-3.mp3\tArt Gillam\tJust Forget\tCOLUMBIA\t2245\tW149648-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3092-A.mp3\tHank Penny's Radio Cowboys\tJust Forget\tOKEH\t5844\tWC3092-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61815.mp3\tJimmie Davis\tJust Forgive And Forget\tDECCA\t5415\t61815\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0331_02.mp3\tLee Morse\tJust Fory Ou\tPerfect\t11573B\t\t1925\t\nhttp://www.jazz-on-line.com/mp3/132700562.mp3\tCharlie Parker String Ensemble\tJust Friends\tMERCURY\t11037\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152110.mp3\tBen Selvin & His Orch\tJust Friends\tCOLUMBIA\t2618 D\tW152110\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO40944.mp3\tSarah Vaughan\tJust Friends\tCOLUMBIA\t38810\tCO40944\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU71218-2.mp3\tRuss Columbo (baritone W Orch)\tJust Friends\tBLUEBIRD\t10859\t71218-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol2618-D.mp3\tBen Selvin & His Orchestra\tJust Friends\tColumbia\t2618-D\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D315A2.mp3\tCharlie Spivak And His Orchestra\tJust Friends\tV-DISC\t315A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/MAJTJV-9502.mp3\tNickelodeon\tJust Friends (lovers No More)\tMAJOR RECORDS\t4117-A\tTJV-9502\t1951\t\nhttp://www.jazz-on-line.com/a/mp3e/Gen11383-B.mp3\tKing Oliver's Creole Jazz Band\tJust Gone\tGennett\t5133\t11383-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc12080-1.mp3\tFletcher Henderson's Orchestra\tJust Hot\tVocalion\t14691\t12080-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC46070-4.mp3\tJean Goldkette & His Orch\tJust Imagine\tVICTOR\t21565\t46070-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru3971.mp3\tLyman's Calf. Orchestra\tJust Imagine\tBrunswick\t3971\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74766.mp3\tSy Oliver & His Orch.\tJust In Case\tDECCA\t24594\t74766\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC51809-5.mp3\tBilly Hays And His Orch\tJust In Time\tVICTOR\t40103\t51809-5\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_264.mp3\tTony Bennett\tJust In Time\tColumbia\t40770\tCO56628\t1956\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68923-A.mp3\tSam Price And His Texas Blusican\tJust Jivin' Around\tDECCA\t8557B\t68923-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC070345.mp3\tArtie Shaw And His Orchestra\tJust Kiddin' Around\tVICTOR\t27806\t070345-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC018112.mp3\tTommy Dorsey & His Orch\tJust Let Me Look At You\tVICTOR\t25766\t018112\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP6837.mp3\tTeddy Wilson\tJust Like A Butterfly - Ghost Of A Chance\tCOLUMBIA\t39429\tZSP6837\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69369.mp3\tMaxine Sullivan\tJust Like A Gypsy\tDECCA\t3954B\t69369\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/COL49665-2.mp3\tNora Bayes\tJust Like A Gypsy\tCOLUMBIA\tA-6138\t49665-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_024.mp3\tNora Bayes\tJust Like A Gypsy\tColombia\t6138\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC45183-3.mp3\tGeorge Olsen & His Music\tJust Like A Melody Out Of The Sky\tVICTOR\t21452A\t45183-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe400768-B.mp3\tJoe Venuti & His Orch\tJust Like A Melody Out Of The Sky\tOKeh\t41056\t400768-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_044.mp3\tGene Austin Feat. Nat Shilkret And His Orchestra\tJust Like A Melody Out Of The Sky\tVICTOR\t21454\t45184-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_161.mp3\tCliff Edwards\tJust Like A Melody Out Of The Sky\tCOLUMBIA\t1427 D\tW146397-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26809.mp3\tFred Astaire W B. Goodman Orch\tJust Like Taking Candy From A Baby\tCOLUMBIA\t35517\t26809\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL35517.mp3\tFred Astaire With Benny Goodman Orchestra\tJust Like Taking Candy From A Baby\tCOLUMBIA\t35517\t26809\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_041.mp3\tPeerless Quartet\tJust Like Washington Crossed The Delaware, General Pershing Will Cross The Rhine\tVictor\t18469\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_498.mp3\tJaye P. Morgan\tJust Love Me\tRCA\t6653\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC39283-3.mp3\tPaul Whiteman & His Orch\tJust Once Again\tVICTOR\t20751A\t39283-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/MajT-717.mp3\tJimmie Lunceford And His Orchestra\tJust Once Too Often\tMajestic\t1045\tT-717\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe16087.mp3\tWingy Manone & His Orch\tJust One Girl\tOKeh\t41569\t16087\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1037-A.mp3\tBing Crosby W-orch\tJust One More Chance\tBRUNSWICK\t6120\tLA1037-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38617.mp3\tBuddy Clark\tJust One More Chance\tCOLUMBIA\t38488\tCO38617\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1017.mp3\tAbe Lyman's California Orch\tJust One More Chance\tBRUNSWICK\t6125\tLA1017\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151628.mp3\tBen Selvin & His Orch\tJust One More Chance\tCOLUMBIA\t2487 D\tW151628\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2504JO.mp3\tLucky Thompson Lucky 7\tJust One More Chance\tRCA\t20-2504\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHKL1300.mp3\tCozy Cole Allstars\tJust One More Chance\tKEYNOTE\t1300\tHKL\t1944\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU6120.mp3\tBing Crosby\tJust One More Chance\tBRUNSWICK\t6120\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_234.mp3\tBing Crosby\tJust One More Chance\tBRUNSWICK\t6120\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36831-4.mp3\tJean Goldkette & His Orch\tJust One More Kiss\tVICTOR\t20300B\t36831-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC95536.mp3\tRichard Himber And His Orch\tJust One Of Those Things\tVICTOR\t25161\t95536\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP1245.mp3\tBenny Goodman Quintet\tJust One Of Those Things\tV-DISC\t446\tVP1245\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38040.mp3\tSidney Bechet Qt\tJust One Of Those Things\tCOLUMBIA\t38318\tCO38040\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8999JO.mp3\tOscar Peterson\tJust One Of Those Things\tMERCURY\t8999\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYHL35.mp3\tColeman Hawkins All American 4\tJust One Of Those Things\tKEYNOTE\t1317\tHL35\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/DECFO-1787-RC.mp3\tDjango Reinhardt Et Son Quintette Du Hot Club De France\tJust One Of Those Things\tDECCA\t9243\tFO-1787-RC\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC82780.mp3\tPeggy Lee With\tJust One Of Those Things\tDECCA\t28313\t82780\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3725.mp3\tBing Crosby\tJust One Of Those Things\tDECCA\t18887B\tL3725\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480379.mp3\tThe Art Tatum Trio (with Red Callender)\tJust One Of Those Things\tColumbia\t33C9039\t2671-1\t1956\tArt Tatum (p) Red Callender (b) Jo Jones (d)\nhttp://www.jazz-on-line.com/a/mp3h/DH480862.mp3\tAndre Previn\tJust One Of Those Things\tRCA VICTOR\t20-3042\t\t1947\tAndre Previn, p; Al Viola, g; Lloyd Pratt, b; Jackie Mills, drums\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP6836.mp3\tTeddy Wilson\tJust One Of Those Things - Runnin' Wild\tCOLUMBIA\t39429\tZSP6836\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_117.mp3\tJo Stafford\tJust One Way To Say I Love You\tCapitol\t665\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA555-A.mp3\tBing Crosby & Ivan Ditmars\tJust One Word Of Consolation\tDECCA\t1044A\tDLA555-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA555-A.mp3\tBing Crosby Accompanied By Ivan Ditmars (piano) And The Three Cheers (vocal Trio)\tJust One Word Of Consolation\tDECCA\t1044A\tDLA555-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149216-2.mp3\tRoy Harvey And Leonard Copeland\tJust Pickin'\tCOLUMBIA\t15514 D\tW149216-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_028alt.mp3\tAda Jones\tJust Plain Folks\tAMERICAN\tARC031223\t031223\t1910\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2949.mp3\tBing Crosby\tJust Plain Lonesome\tDECCA\t18354A\tDLA2949\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5789.mp3\tPete Brown Sextet\tJust Plain Shuffle\tSAVOY\t578\tS5789\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC42924-1.mp3\tBennie Moten's Orch\tJust Rite\tVICTOR\t21739\t42924-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_262.mp3\tJohnny Desmond\tJust Say I Love Her\tMGM\t10758\t50S15\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_147.mp3\tVic Damone Feat. Oc/ronnie Selby\tJust Say I Love Her\tMERCURY\t5474\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55429-1.mp3\tBennie Moten's Kansas City Or.\tJust Say Its Me\tVICTOR\t38132\t55429-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1965.mp3\tDick Jurgens And His Orch\tJust Squeeze Me\tCOLUMBIA\t37150\tHCO1965\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_174.mp3\tFour Aces\tJust Squeeze Me\tDECCA\t28390\t83083\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA226-A.mp3\tJoe Sullivan\tJust Strolling\tDECCA\t600B\tDLA226-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1093.mp3\tBob Crosby & His Bobcats\tJust Strolling\tDECCA\t1670\tDLA1093\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP952.mp3\tSam Donohue & His Orch\tJust The Other Day\tCAPITOL\t\t952\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36363.mp3\tGene Krupa & His Orch\tJust The Other Day\tCOLUMBIA\t37078\tCO36363\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_091.mp3\tSam Donahue And His Orchestra Feat. Mynell Allen\tJust The Other Day\tCapitol\t275\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20612-B.mp3\tJim Miller-charlie Farrell\tJust The Same\tVictor\t20612-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38469-4.mp3\tRoger Wolfe Kahn & His Orch\tJust The Same\tVICTOR\t20634B\t38469-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE80726-B.mp3\tJazz Pilots (h.reser)\tJust The Same\tOKEH\t40809\t80726-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU22138.mp3\tSix Jumping Jacks\tJust The Same (vts)\tBRUNSWICK\t3511\t22138\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_147.mp3\tEddie Fisher\tJust To Be With You\tRCA\t20-5453\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_069.mp3\tArthur Collins And Byron Harlan\tJust Try To Picture Me Down Home In Tennessee\tVICTOR\t17841\t16223\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141166.mp3\tArt Gillam\tJust Waiting For You\tCOLUMBIA\t771 D\tW141166\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_024.mp3\tJohnnie Ray\tJust Walking In The Rain\tColumbia\t40729\tCO56282\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_1210_01.mp3\tLee Morse And Her Bluegrass Boys\tJust You And I\tColumbia\t2270DB\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23294-1.mp3\tRed Norvo & His Orch\tJust You Just Me\tBRUNSWICK\t8240\t23294-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC38670.mp3\tClaude Hopkins And His Orchestra\tJust You, Just Me\tDECCA\t185A\t38670\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/MERHL1.mp3\tLester Young Quintet\tJust You, Just Me\tMERCURY\t1092\tHL1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21899.mp3\tArtie Shaw And His New Music\tJust You, Just Me\tBRUNSWICK\t8010\tB-21899-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5236.mp3\tTeddy Wilson Quintet\tJust You, Just Me\tMUSICRAFT\t316\t5236\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW148590.mp3\tCliff Edwards 'ukelele Ike'\tJust You, Just Me\tCOLUMBIA\t1907 D\tW148590\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73647.mp3\tEddie Condon & His Orchestra\tJust You, Just Me\tDECCA\t23720\t73647\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUE30617-8.mp3\tAl Goodman & His Orch\tJust You, Just Me\tBRUNSWICK\t4487\tE30617-8\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap848.mp3\tBenny Carter And His Orchestra\tJust You, Just Me\tCapitol\t11057\t848\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Sel233-B-20-A.mp3\tErroll Garner\tJust You, Just Me\tSelmer\tY7225\t233-B-20-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_157.mp3\tCliff Edwards\tJust You, Just Me\tCOLUMBIA\t1907 D\tW148590\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478347.mp3\tLes Brown And His Band Of Renown\tJust You, Just Me\tCAPITOL\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/JazB-13132-A.mp3\tClaude Hopkins And His Orchestra\tJust You, Just Me\tJazz Archives\t4\tB-13132-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480380.mp3\tNat King Cole\tJust You, Just Me\tCapitol\tEAP1/EBF1/W-782\t15897-7\t1956\tNat King Cole, P & Vocal, acc. by Willie Smith (as), John Collins (g), Charlie Harris (sb), Lee Young (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DEC82488.mp3\tLouis Armstrong & His Allstars\tJust You,just Me,pt.1\tDECCA\t28175\t82488\t1951\t\nhttp://www.jazz-on-line.com/a/mp3o/GEN8518-B.mp3\tArthur Hall\tK-k-k-katy\tGennett\t8518-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21479-4.mp3\tBilly Murray\tK-k-katy\tVICTOR\t18455\t21479-4\t1918\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480587.mp3\tBen Webster And Harry Sweets Edison\tK.m. Blues\tClef\tMGC717\t2989-3\t1956\tBen Webster, Ts, Harry Sweets Edison, T, Joe Mondragon, B, Alvin Stoller, D, Barney Kessel, G, Jimmy Rowles, P\nhttp://www.jazz-on-line.com/a/mp3w/1956_188.mp3\tG-clefs\tKa-ding Dong\tPilgrim\t715\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_222.mp3\tDiamonds\tKa-ding-dong\tMercury\t70934\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_230.mp3\tHilltoppers Featuring Chuck Schrouder\tKa-ding-dong\tDot\t15489\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_024.mp3\tElsie Baker Feat. Elliot Shaw\tKa-lu-a\tVICTOR\t18854\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1054.mp3\tArtie Shaw And His Orchestra\tKabash\tRCA\t20-1932\tD5VB1054\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/RoyKJ-52-2.mp3\tMezzrow - Bechet Quintet\tKaiser's Last Break\tRoyal Jazz\t711\tKJ-52-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COL45914.mp3\tPali Kula And Dave Kaili\tKaiwi Waltz\tCOLUMBIA\tA1861\t45914\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS20298.mp3\tBill Cox And Cliff Hobbs\tKansas City Blues\tCBS\tME70576\t20298\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG14310.mp3\tWilliam Harris\tKansas City Blues\tGENNETT\t6707\tG14310\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC41882-2.mp3\tMemphis Stompers\tKansas City Blues\tVICTOR\t21270\t41882-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC42929-1.mp3\tBennie Moten's Kansas Orch\tKansas City Breakdown\tVICTOR\t21693\t42929-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC50519-3.mp3\tCoon Sanders Nighthawk Orch\tKansas City Kitty\tVICTOR\t21939\t50519-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/OKeS71707.mp3\tClarence Williams\tKansas City Man Blues\tOKeh\t4925\tS71707\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38017.mp3\tSidney Bechet\tKansas City Man Blues\tCOLUMBIA\t38319\tCO38017\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37234-1.mp3\tBennie Moten's Kansas Orch\tKansas City Shuffle\tVICTOR\t20485A\t37234-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC55422-2.mp3\tBennie Moten's Kansas City Or.\tKansas City Squabble\tVICTOR\t38091\t55422-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO21y.mp3\tBenny Strickler And The Yerba Bue\tKansas City Stomps\tGood Time Jazz\t21\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic45620-3.mp3\tJelly-roll Morton's Red Hot Peppers\tKansas City Stomps\tVictor\tV-38010\t45620-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D711.mp3\tCount Basie & His Orch\tKansas City Stride\tV-DISC\t258A\t711\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31913.mp3\tLouisiana Rhythm Kings\tKaravan\tBRUNSWICK\t4908\tE31913\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-31913.mp3\tLouisiana Rhythm Kings\tKaravan\tBrunswick\t4908\tE-31913\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23044x.mp3\tRichard Tauber\tKashmiri Song\tDECCA\t23044\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480765.mp3\tBen Webster Quartet\tKat's Fur\tSavoy\t506\tS5439\t1944\tBen Webster (ts), Johnny Guarneri (p), Oscar Pettiford (sb), David ?Chick? Booth (dm\nhttp://www.jazz-on-line.com/a/mp3e/SAVS5439.mp3\tBen Webster And Band\tKat's Fur (feat. J. Guarnieri)\tSAVOY\t580\tS5439\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_028.mp3\tJohn Mccormack\tKathleen Mavourneen\tVICTOR\t74236\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC043387-2.mp3\tLeo Reisman Orch\tKatie Went To Haiti\tVICTOR\t26421\t043387-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC53562-3.mp3\tAileen Stanley And Billy Murray\tKatie, Keep Your Feet On The Ground\tVICTOR\t22040\t53562-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC35732-3.mp3\tGeorge Olsen & His Music\tKatinka (v F F-b B-b R)\tVICTOR\t20100A\t35732-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053739-1.mp3\tTommy Mcclennan\tKaty Mae Blues\tBLUEBIRD\t8689\t053739-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM53S7.mp3\tBill Farrell W Leroy Holmes\tKaw-liga\tMGM\t11424A\t53S7\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68005.mp3\tPete Johnson\tKaycee On My Mind\tDECCA\t3384B\t68005\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiGrek.mp3\tSwing & Sway With Sammy Kaye\tKaye's Melody\tGreat Bands 1936-194\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30890.mp3\tXavier Cugat And His Orch\tKee Kee Ree Kee Kee\tCOLUMBIA\t36386\tCO30890\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3046.mp3\tWoody Herman & His Orchestra\tKeen And Peachy\tCOLUMBIA\t38213\tHCO3046\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068459.mp3\tGlenn Miller And His Orch\tKeep 'em Flying\tBLUEBIRD\t11443-B\t068459\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150997-2.mp3\tFletcher Henderson And His Orch\tKeep A Song In Your Soul\tCOLUMBIA\t2352 D\tW150997-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Col150997-2.mp3\tFletcher Henderson And His Orchestra\tKeep A Song In Your Soul\tColumbia\t2352-D\t150997-2  \t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC67799-1.mp3\tDuke Ellington & His Orch\tKeep A Song In Your Soul (v C B)\tVICTOR\t22614\t67799-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE36111-A.mp3\tRed Nichols & His Orch\tKeep A Song In Your Soul (v J T)\tBRUNSWICK\t6068\tE36111-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65305-A.mp3\tLouis Jordan & His Tympani 5\tKeep A-knockin'\tDECCA\t7609\t65305-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU060404-1.mp3\tErskine Hawkins & His Orch\tKeep Cool, Fool\tBLUEBIRD\t11049\t060404-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68894.mp3\tElla Fitzgerald & Her Orch\tKeep Cool, Fool\tDECCA\t3754A\t68894\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31803.mp3\tGene Krupa & His Orch\tKeep Em Flying\tOKEH\t6506\t31803\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10316.mp3\tJo Stafford\tKeep It A Secret\tCOLUMBIA\t39891\tHCO10316\t\t\nhttp://www.jazz-on-line.com/a/mp3o/IMP8169x.mp3\tSlim Whitman\tKeep It A Secret\tIMPERIAL\t8169\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL6935.mp3\tBing Crosby - John S Trotter\tKeep It A Secret\tDECCA\t28511\tL6935\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_028.mp3\tJo Stafford\tKeep It A Secret\tCOLUMBIA\t39891\tHCO10316\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_418.mp3\tPerry Como\tKeep It Gay\tRCA Victor\t5317\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI8847-B.mp3\tAtlantic Dance Orchestra\tKeep It Under Your Hat\tEDISON\t51056\t8847-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75629.mp3\tBuddy Johnson\tKeep Me Close To You\tDECCA\t24996\t75629\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72388.mp3\tJames P Johnson\tKeep Off The Grass\tDECCA\t24883\t72388\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_016.mp3\tHaydn Quartet And Billy Murray\tKeep On Smiling\tVictor\t5379\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU45022-1.mp3\tCarter Family\tKeep On The Sunny Side\tBLUEBIRD\t5006\t45022-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_088.mp3\tCarter Family\tKeep On The Sunny Side\tBluebird\t5006\t45022-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_012.mp3\tByron G. Harlan\tKeep On The Sunny Side\tAMERICAN\t031346\t031346\t1906\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC60193-A.mp3\tBud Freeman's Windy City 5\tKeep Smilin' At Trouble\tDECCA\t18113B\t60193-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-3066-A.mp3\tJimmie Lunceford And His Orchestra\tKeep Smilin', Keep Laughin', Be Happy\tDecca\t18504\tL-3066-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/CBS22719.mp3\tBud Freeman's Trio\tKeep Smiling At Trouble\tCBS\tCM503\t22719\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_1209_01.mp3\tLee Morse And Her Bluegrass Boys\tKeep Sweeping The Cobwebs Off The Moon\tColumbia\t1276DA\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16589.mp3\tCab Calloway & His Orch\tKeep That Hi De Ho In Your Soul\tBRUNSWICK\t7386\t16589\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_276.mp3\tCab Calloway And His Orchestra\tKeep That Hi-de-hi In Your Soul\tBRUNSWICK\t7386\t16589\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC16626-3.mp3\tFrederick Wheeler\tKeep The Home Fires Burning\tVICTOR\t17881\t16626-3\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64696x.mp3\tJohn Mccormack\tKeep The Home Fires Burning\tVICTOR\t64696\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE32480.mp3\tBuddy Clark\tKeep The Home Fires Burning\tOKEH\t6671\t32480\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_045.mp3\tJohn Mccormack\tKeep The Home Fires Burning\tVICTOR\t64696\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_014.mp3\tJames F. Harrison\tKeep The Home Fires Burning (till The Boys Come Home)\tVICTOR\t17881\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/EDI4170-C.mp3\tFrederick J. Wheeler - Chorus - O\tKeep The Home Fires Burning (till The Boys Come Home) - March (ivor Novello - Lena G. Ford)\tEDISON\tBA 2773\t4170-C\t\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-16466-1.mp3\tMills Blue Rhythm Band\tKeep The Rhythm Going\tColumbia\t2994-D\tCO-16466-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC33182-3.mp3\tAileen Stanley-billy Murray\tKeep You Skirts Down Mary Ann\tVICTOR\t19795\t33182-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14232-A.mp3\tAbe Lyman & His Californians\tKeep Young & Beautiful (v3)\tBRUNSWICK\t6698\t14232-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh042.mp3\tRoy Fox And His Band (vocal Denny Dennis)\tKeep Young And Beautiful\tDecca\tF-3936\tTB-1135-1-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC57567-2.mp3\tWilton Crawley And His Orch\tKeep Your Business To Yourself\tVICTOR\t38116\t57567-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic57567-2.mp3\tWilton Crawley And His Orchestra\tKeep Your Business To Yourself\tVictor\tV-38116\t57567-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57637-3.mp3\tBen Pollack & His Orch\tKeep Your Undershirt On\tVICTOR\t22267\t57637-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055063-1.mp3\tArtie Shaw And His Gramercy Five\tKeepin' Myself For You\tVictor\t26762\t055063-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe405166-A.mp3\tLouis Armstrong & His Orch\tKeepin' Out Of Mischief Now\tOKeh\t41560\t405166-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU03237.mp3\tTempo King's Kings Of Tempo\tKeepin' Out Of Mischief Now\tBLUEBIRD\t6684\t03237\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010652-1.mp3\tFats Waller (piano)\tKeepin' Out Of Mischief Now\tVICTOR\t27767\t010652-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72235.mp3\tJames Pete Johnson\tKeepin' Out Of Mischief Now\tDECCA\t23594\t72235\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64344.mp3\tBob Howard & His Orch\tKeepin' Out Of Mischief Now\tDECCA\t2730B\t64344\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03085.mp3\tTommy Dorsey & His Orch\tKeepin' Out Of Mischief Now\tVICTOR\t25482\t03085\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/CROC1683-2.mp3\tThe High Steppers (joel Shaw And His Orchestra)\tKeepin' Out Of Mischief Now\tCROWN\t3300\tC1683-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC72001-1.mp3\tCoon-sanders Orchestra\tKeepin' Out Of Mischief Now\tVICTOR\t22969\t72001-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_196.mp3\tLouis Armstrong\tKeepin' Out Of Mischief Now\tCOLUMBIA\t2646 D\t405166\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_227.mp3\tCoon-sanders Orchestra Feat. Joe Sanders\tKeepin' Out Of Mischief Now\tVICTOR\t22969\t72001-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh199.mp3\tSavoy Hotel Orpheans Dir. By Carroll Gibbons\tKeepin Out Of Mischief Now\tColumbia\tCB-459\tCA-12692-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80865-9.mp3\tBessie Smith\tKeeps On A Rainin All Time\tCOLUMBIA\tA-3898\t80865-9\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC27145.mp3\tBillie Holiday\tKeeps On Rainin'\tDECCA\t27145\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D261B.mp3\tSammy Kaye And His Orchestra\tKentucky\tV-DISC\t261B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70244.mp3\tMaxine Sullivan\tKentucky Babe\tDECCA\t18349B\t70244\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_032.mp3\tYerkes Jazarimba Orchestra\tKentucky Dreams\tColumbia\t6092\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC4355.mp3\tBill Monroe Bluegrass Boys\tKentucky Waltz\tCOLUMBIA\t36907\tC4355\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_117.mp3\tBrox Sisters\tKentucky's Way Of Sayin' Good Morning\tVICTOR\t19921\t34048-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC34048-2.mp3\tBrox Sisters\tKentucky's Way Of Saying Good Morning\tVICTOR\t19921\t34048-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/SIG660-1.mp3\tAnita O'day With Benny Carter\tKey Largo\tSIGNATURE\t15185B\t660-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3790.mp3\tBrownie Mcghee\tKey To My Door\tOKEH\t6437\tC3790\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU044972.mp3\tBill 'jazz' Gillum\tKey To The Highway\tBLUEBIRD\t8529\t044972\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/PARL0177.mp3\tMary Johnson\tKey To The Mountain Blues\tPARAMOUNT\t12996B\tL0177\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S453.mp3\tEarl Hines Swingtette\tKeyboard Kapers\tMGM\t10382\t48S453\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE80876-B.mp3\tLouis Armstrong's Hot Five\tKeyhole Blues\tOKEH\t8496\t80876-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_269.mp3\tLouis Armstrong\tKeyhole Blues\tOKEH\t8496\t80876-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30604.mp3\tGene Krupa & His Orch\tKick It\tOKEH\t6278\t30604\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481106.mp3\tGene Krupa Orch. Feat. Anita O'day\tKick It\tOkeh\t6278\t30604-1\t1941\tRoy Eldridge, Norman Murphy, Torg Halten, Graham Young (tp), John Grassi, Jay Kelliher, Babe Wagner (tb), Sam Musiker (cl,ts), Clint Neagley, Mascagni ''Musky'' Ruffo (as), Walter Bates (ts), Bob Kitsis (p), Remo Biondi (g), Ovid ''Biddy'' Bastien (sb), Gene Krupa (dm), Leroy Elton Hill (arr)\nhttp://www.jazz-on-line.com/a/mp3c/OKE81118-B.mp3\tJoe Venuti's Blue Four\tKickin' The Cat\tOKEH\t40853\t81118-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COL152087.mp3\tLouis Armstrong & His Orch\tKickin' The Gong Around\tCOLUMBIA\t2600 D\t152087\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE37268.mp3\tCab Calloway & His Orch\tKickin' The Gong Around\tBRUNSWICK\t6511\tE37268\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_127.mp3\tLouis Armstrong\tKickin' The Gong Around\tCOLUMBIA\t2600 D\t152087\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_050.mp3\tCab Calloway And His Orchestra\tKickin' The Gong Around\tBRUNSWICK\t6209\tE37268\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-37268-A.mp3\tCab Calloway And His Orchestra\tKickin' The Gong Around\tBrunswick\t6209\tE-37268-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/HMW78868-1.mp3\tCab Calloway And His Cotton Club Orchestra\tKickin' The Gong Around\tHMW\tX-4318\t78868-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW148056.mp3\tLeo Reisman & His Orch\tKiddie Cabaret\tCOLUMBIA\t1849 D\tW148056\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_048.mp3\tJohn Mccormack\tKillarney\tVICTOR\t74157\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA245.mp3\tSons Of The Pioneers\tKilocycle Stomp\tDECCA\t5178A\tDLA245\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC030383.mp3\tMaxine Sullivan\tKinda Lonesome\tVICTOR\t26124\t030383\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC028998-2.mp3\tBenny Goodman And His Orchestra\tKinda Lonesome (vmt)\tVICTOR\t26110\t028998-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DISD452.mp3\tRoy Eldridge Sextet\tKing David\tDISC\t153\tD452\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC049691.mp3\tArtie Shaw And His Orchestra\tKing For A Day\tVICTOR\t26654\t049691-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_047.mp3\tTed Lewis And His Band\tKing For A Day\tCOLUMBIA\t1485 D\tW146746-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic049691-1.mp3\tArtie Shaw And His Orchestra\tKing For A Day\tVictor\t26654\t049691-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31374.mp3\tPaul Robeson W Count Basie\tKing Joe Part.2\tOKEH\t6475\t31374\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_141.mp3\tTed Fio Rito And His Orchestra\tKing Kamahamena (conquerer Of The Islands)\tDECCA\t1909B\tDLA1256\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULA160A.mp3\tSol Hoopii & His Novelty Qt\tKing Kamehameha\tBRUNSWICK\t6873\tLA160A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_100.mp3\tArthur Pryor's Band\tKing Of Rags\tVICTOR\t16821\tB4800\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_077.mp3\tGene Greene\tKing Of The Bungaloos\tVICTOR\t18266\t10211-5\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/COL19243-2.mp3\tGene Greene\tKing Of The Bungalows\tCOLUMBIA\tA-0994\t19243-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17344.mp3\tLouis Armstrong's Hot 5\tKing Of The Zulus\tARC\tBRS1\t17344\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142856-3.mp3\tDixie Washboard Band (cw)\tKing Of The Zulus\tCOLUMBIA\t14171 D\tW142856-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU027413.mp3\tGlenn Miller And His Orch\tKing Porter Stomp\tBLUEBIRD\t7853\t027413\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC38671.mp3\tClaude Hopkins And His Orchestra\tKing Porter Stomp\tDECCA\t184A\t38671\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu7839.mp3\tErskine Hawkins & His Orchestra\tKing Porter Stomp\tBluebird\t7839\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC92547-1.mp3\tBenny Goodman And His Orchestra\tKing Porter Stomp\tVICTOR\t25090A\t92547-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COMR2565.mp3\tJelly Roll Morton (piano)\tKing Porter Stomp\tCOMMODORE\t591\tR2565\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCC166.mp3\tJelly Roll Morton (piano)\tKing Porter Stomp\tVOCALION\t1020\tC166\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D514.mp3\tJimmy Dorsey Orch\tKing Porter Stomp\tV-DISC\t514\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145763-3.mp3\tFletcher Henderson's Orch\tKing Porter Stomp\tCOLUMBIA\t1543 D\tW145763-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU026860.mp3\tErskine Hawkins & His Orch\tKing Porter Stomp\tBLUEBIRD\t7839\t026860\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/AUT685.mp3\tKing Oliver W Jelly Roll Mort.\tKing Porter Stomp\tAUTOGRAPH\t617\t685\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiM33199.mp3\tThe Dutch Swing College Band\tKing Porter Stomp\tDecca\tM33199\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO28x.mp3\tWally Rose\tKing Porter Stomp\tGood Time Jazz\t28\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC25090A.mp3\tBenny Goodman & His Orch\tKing Porter Stomp\tVICTOR\t25090A\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc138328-1.mp3\tFletcher Henderson And His Orchestra\tKing Porter Stomp\tVocalion\t2527\t138328-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Col145763-3.mp3\tFletcher Henderson And His Orchestra\tKing Porter Stomp\tColumbia\t1543-D\t145763-3  \t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24349-C.mp3\tHarry James And His Orchestra\tKing Porter Stomp\tBrunswick\t8366\tB-24349-C\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_150.mp3\tBenny Goodman And His Orchestra\tKing Porter Stomp\tVICTOR\t25090A\t92547-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2445-4.mp3\tJulia Lee And Her Boyfriends\tKing Size Papa\tCAPITOL\t40082\t2445-4\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480790.mp3\tBen Webster Sextet\tKing's Riff\tMercury\t8298\t4722-1\t1951\tMaynard Ferguson (tp), Benny Carter (as), Ben Webster (ts), Gerald Wiggins (p), John Kirby (sb), George Jenkins (dm)\nhttp://www.jazz-on-line.com/a/mp3b/BRULA38-A.mp3\tSol Hoopii & His Novelty Qt\tKing's Serenade\tBRUNSWICK\t6950\tLA38-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe9721.mp3\tRichard Jones Jazz Wizards\tKint To Kant Blues\tOKeh\t8349\t9721\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU3807.mp3\tIsham Jones & His Orch\tKismet\tBRUNSWICK\t5021\t3807\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_162.mp3\tGreen Brothers Novelty Band\tKismet\tOKeh\t4119\tS7407-B\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC1369.mp3\tNick Lucas\tKiss And Make Up\tBRUNSWICK\t3736\tC1369\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_468.mp3\tPeggy King\tKiss And Run\tColumbia\t40638\tRHCO33640\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_076.mp3\tElsie Wood And Henry Burr\tKiss Duet (from A Waltz Dream) (walzertraum.?selections)\tCOLUMBIA\t33225\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03652.mp3\tBilly Murray And Ada Jones\tKiss Kiss Kiss\tCOLUMBIA\tA-0452\t03652\t1907\t\nhttp://www.jazz-on-line.com/a/mp3c/MER868-B4.mp3\tFrankie Laine\tKiss Me Again\tMERCURY\t5059A\t868-B4\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1185-1.mp3\tFrank Sinatra\tKiss Me Again\tCOLUMBIA\t38287\tHCO1185-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_420.mp3\tDoris Day Feat. O/paul Weston\tKiss Me Again, Stranger\tCOLUMBIA\t40020\tRHCO10503\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_204.mp3\tGeorgia Gibbs\tKiss Me Another\tMercury\t70850\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42746.mp3\tTed Daffan's Texans\tKiss Me Goodnight\tCOLUMBIA\t20707\tCO42746\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031535.mp3\tFats Waller And His Rhythm\tKiss Me With Your Eyes\tBLUEBIRD\t10136\t031535\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24092.mp3\tRed Norvo & His Orch\tKiss Me With Your Eyes (v Terry Allen)\tVOCALION\t4648\t24092\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MER5823x.mp3\tGeorgia Gibbs\tKiss Of Fire\tMERCURY\t5823\t5823x\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC82703.mp3\tLouis Armstrong And His Orch.\tKiss Of Fire\tDECCA\t28177\t82703\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM52S3070.mp3\tBilly Eckstine W Nelson Riddle\tKiss Of Fire\tMGM\t11225A\t52S3070\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_005.mp3\tGeorgia Gibbs\tKiss Of Fire\tMERCURY\t5823\t5823x\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_043.mp3\tTony Martin\tKiss Of Fire\tRCA\t20-4671\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_105.mp3\tToni Arden Feat. Percy Faith's Orchestra\tKiss Of Fire\tCOLUMBIA\t39737\tCO47396\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_173.mp3\tLouis Armstrong\tKiss Of Fire\tDECCA\t28177\t82703\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_124.mp3\tBilly Eckstine Feat. Nelson Riddle's Orchestra\tKiss Of Fire\tMGM\t11225A\t52S3070\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_205.mp3\tBea Wain\tKiss The Boys Goodbye\tVICTOR\t27445\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_125.mp3\tTommy Dorsey Orch V Connie Haines\tKiss The Boys Goodbye\tVICTOR\t27461\t065912\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142442.mp3\tPaul Ash And His Orchestra\tKiss Your Lttle Baby, Good-night\tCOLUMBIA\t751 D\tW142442\t1926\tJohn Valentine, John Linn, tp, Roscoe Lantz, trombone, Phil Wing & Herbert \"Putty\" Nettle,clarinet,al sax, Howard Grantham, cl, tn sax, Harry Barris, p, Paul Ash, vio, Julian Davidson,bj, Pierre Olker,br bass, Arthur Layfield, drums,v Paul Small\nhttp://www.jazz-on-line.com/a/mp3d/BruB-18739-1.mp3\tDuke Ellington And His Famous Orchestra\tKissin' My Baby Good-night\tBrunswick\t7627\tB-18739-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18739-2.mp3\tDuke Ellington And His Famous\tKissin' My Baby Goodnight\tBRUNSWICK\t7627\t18739-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_200.mp3\tThe Fontane Sisters With Orchestra Conducted By Hugo Winterhalter\tKissing Bridge\tRCA Victor\t5524\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_185.mp3\tJo Stafford\tKissing Bug Boogie\tColumbia\t39529\tRHCO 4548-\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/CON17475-1.mp3\tCarter Family\tKissing Is A Crime\tCONQUEROR\t8643\t17475-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/CON9007.mp3\tLeonard Feather Allstars\tKitchen Conniption\tCONTIN\tT6007\t9007\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU5061-3.mp3\tZez Confrey\tKitten On The Keys\tBRUNSWICK\t2082\t5061-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU2082.mp3\tZez Confrey\tKitten On The Keys\tBRUNSWICK\t2082\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_054.mp3\tZez Confrey And His Orchestra\tKitten On The Keys\tVICTOR\t18900A\t26259-8\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150618-4.mp3\tJohnny Walker's Orch (selvin)\tKitty From Kansas City\tCOLUMBIA\t2247 D\tW150618-4\t1930\t\nhttp://www.jazz-on-line.com/a/mp37/VIC011699.mp3\tRudy Valle And His Connecticut Yankees\tKitty From Kansas City\tVICTOR\t27844-A\t011699\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-2965-A.mp3\tFletcher Henderson Conducts Horace Henderson And His Orchestra\tKitty On Toast\tOKEH\t5433\tWC-2965-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVD832.mp3\tCharlie Parker's Allstars\tKlaustance\tSAVOY\t967\tD832\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe400991-B.mp3\tLouis Armstrong's Hot Five\tKnee Drops\tOKeh\t8631\t400991-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC072287.mp3\tGlenn Miller & His Orch\tKnit One, Purl Two\tVICTOR\t27894\t072287\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_244.mp3\tGlenn Miller And His Orchestra\tKnit One, Purl Two\tVICTOR\t27894\t072287\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLC4209-1.mp3\tGene Krupa & His Orch\tKnock Me A Kiss\tCOLUMBIA\t37533\tC4209-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU075528-1.mp3\tErskine Hawkins Orch\tKnock Me A Kiss\tBLUEBIRD\t11564\t075528-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC93786.mp3\tLouis Jordan And His Tympani 5\tKnock Me A Kiss\tDECCA\t8593\tC93786\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D158B2.mp3\tLouis Jordan\tKnock Me A Kiss\tV-DISC\t158B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-3065-A.mp3\tJimmie Lunceford And His Orchestra\tKnock Me A Kiss\tDecca\t18483\tL-3065-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_112.mp3\tAda Jones And Billy Murray\tKnock Wood\tVICTOR\t17008\t11145-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_146.mp3\tTed Weems And His Orchestra\tKnock! Knock! Who's There?\tDECCA\t885A\tC90815-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic100885-1.mp3\tFletcher Henderson And His Orchestra\tKnock, Knock Who's There \tVictor\t25373\t100885-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100885-1.mp3\tFletcher Henderson & His Orch\tKnock, Knock, Who's There\tVICTOR\t25373A\t100885-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19731-1.mp3\tStuff Smith & Onyx Club Boys\tKnock, Knock, Who's There?\tARC\tVO3300\t19731-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401689-B.mp3\tLouis Armstrong's Hot Five\tKnockin' A Jug\tOKeh\t8703\t401689-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031539.mp3\tCharlie Barnet & His Orch\tKnockin' At The Famous Door\tBLUEBIRD\t10131\t031539\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_266.mp3\tCharlie Barnet And His Orchestra\tKnockin' At The Famous Door\tBLUEBIRD\t10131\t031539\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU13205A.mp3\tRed Norvo & His Orch\tKnockin' On Wood\tBRUNSWICK\t6562\t13205A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN15003K.mp3\tMary Lou Williams\tKnowledge\tKING\t15003\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC044889-2.mp3\tDuke Ellington And His Orch\tKo Ko\tVICTOR\t26577A\t044889-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5853-2.mp3\tCharlie Parker\tKo Ko\tSAVOY\t4508\tS5853-2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_316.mp3\tDuke Ellington And His Famous Orchestra\tKo Ko\tVICTOR\t26537\t044887-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAF2PB0300.mp3\tPerry Como\tKo Ko Mo\tRCA\t20-5994\tF2PB0300\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_018.mp3\tPerry Como\tKo Ko Mo (i Love You So)\tRCA Victor\t5994\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_050.mp3\tCrew-cuts\tKo Ko Mo (i Love You So)\tMercury\t70529\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic78094-1.mp3\tMills Blue Rhythm Band\tKokey Joe\tVictor\t24482\t78094-1  \t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D42B1.mp3\tGoldman Band\tKorcoran Cadets\tv-disk\t42B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/Gen11638.mp3\tKing Oliver's Creole Jazz Band\tKrooked Blues\tGennett\t5274\t11638\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/COLLA427.mp3\tAndy Iona's Novelty Four\tKuu Ipo\tCOLUMBIA\t3094 D\tLA427\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic023753-1.mp3\tMaxine Sullivan With Claude Thornhill And Orchestra\tL'amour, Toujours L'amour\tVictor\t25895\t023753-1\t1938\t\nhttp://www.78-tours.net/mp3/GRA32-1153.mp3\tTito Schipa Tnor En Italien Avec Orch.\tL'elisir D'amore (2e Acte) \" Une Furtiva Lagrima \"\tGRAMOPHONE\tDB-1387\t32-1153\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_036.mp3\tEnrico Caruso And Geraldine Farrar Feat. Antonio Scotti And Gina Viafora\tLa Boheme - Quartetto: ''addio, Dolce Svegliare'' (farewell, Sweet Love)\tVICTOR\t96002\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3d/ColCL-7420-1.mp3\tCharles Trnet (with Django Reinhardt)\tLa Cigale Et La Fourmi\tColumbia\tDF2886\tCL-7420-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec60023-E.mp3\tLouis Armstrong And His Orchestra\tLa Cucaraca\tDecca\t580B\t60023-E\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/HARH-3001-A.mp3\tJuan Vicari Y Su Genial Orquest\tLa Cumparsita\tHarmonia\tH-3001-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D297A2.mp3\tXavier Cugat And His Orchestra\tLa Cumparsita\tV-DISC\t297A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/RCA49-3275-A.mp3\tBoston Pops Orchestra\tLa Cumparsita\tRCA VICTOR\t49-3275-A\t\t1953\tArthur Fiedler, cond\nhttp://www.jazz-on-line.com/a/mp3b/COL30130LD.mp3\tHot Lips Page & Orch\tLa Danse\tCOLUMBIA\t30130\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM847-2.mp3\tDuke Ellington's Famous Orch\tLa De Doody Doo\tBRUNSWICK\t8174\tM847-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_247.mp3\tMilt Herth Trio\tLa De Doody Doo\tDECCA\t1966A\t64341\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_179.mp3\tGisele Mackenzie\tLa Fiacre\tCapitol\t1907\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17458H.mp3\tThe Dutch Swing College Band\tLa Java\tPhilips\tP17458H\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_100.mp3\tFrances Alda Backed By The Metropolitan Opera Chorus\tLa Marseillaise\tVICTOR\t64693\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3h/DECF10077y.mp3\tTed Heath And His Music\tLa Mer\tDECCA-LONDON\tF10077y\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_228.mp3\tRoger Williams\tLa Mer (beyond The Sea)\tKapp\t138\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA1998.mp3\tOrrin Tucker And His Orch\tLa Rosita\tCOLUMBIA\t35722\tLA1998\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68765.mp3\tJimmy Dorsey & His Orch.\tLa Rosita\tDECCA\t3711A\t68765\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037138.mp3\tTommy Dorsey & His Orch\tLa Rosita\tVICTOR\t26333\t037138\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC3711A.mp3\tJimmy Dorsey & His Orchestra\tLa Rosita\tDECCA\t3711A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_284.mp3\tFour Aces Featuring Al Alberts\tLa Rosita\tDECCA\t28323\t83025\t1953\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColE3187.mp3\tThe Vagabondi\tLa Sirene-mazurka\tColumbia\tE3187\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/COL55590.mp3\tGuido Deiro\tLa Spaola\tCOLUMBIA\tA1152\t55590\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiViclat.mp3\tJohn Mccormack & Lucrezia Bori\tLa Traviata - Parigi, O Cara (v\tVictrola\t\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_079.mp3\tGreen Brothers Novelty Band\tLa Veeda\tVictor\t18667\t23866-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38968.mp3\tEdith Piaf\tLa Vie En Rose\tCOLUMBIA\t38912\tCO38968\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_304.mp3\tLouis Armstrong Feat. Sy Oliver's Orchestra\tLa Vie En Rose\tDECCA\t27113\t76528\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_300.mp3\tRalph Flanagan And His Orchestra\tLa Vie En Rose\tRCA\t20-3889\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic0343-1.mp3\t\"fats\" Waller And His Rhythm\tLa-de-de, La-de-da\tVictor\t25430\t0343-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC45130BOY.mp3\tNora Bayes\tLaddie Boy\tVICTOR\t45130\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VARP77163.mp3\tQunitet Of Hot Club Of France\tLady Be Good\tVARSITY\t8376\tP77163\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1418-1.mp3\tFrankie Trumbauer & Ho\tLady Be Good\tVARSITY\t8269\tUS1418-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1897.mp3\tWillie Lewis & Negro Band\tLady Be Good\tVARSITY\tEL4072s\t1897\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS232.mp3\tErroll Garner\tLady Be Good\tDISC\t5002\t232\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-501-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tLady Be Good\tSWING\t287\tOSW-501-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/ULTP-77163.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tLady Be Good\tUltraphone\tAP-1422\tP-77163\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481508.mp3\tCharles Mingus Quintet\tLady Bird\tFantasy\t6009\t\t1955\tEddie Bert (tb), George Barrow (ts), Mal Waldron (p), Charles Mingus (sb), Willie Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-13294.mp3\tTed Heath And His Music\tLady Byrd\tDECCA-LONDON\tEFF.50-2 (BEP 6025) \tDR-13294\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC010598.mp3\tBunny Berigan And His Orch\tLady From Fifth Avenue\tVICTOR\t25609B\t010598\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWM999.mp3\tDuke Ellington & Famous Orch\tLady In Blue\tCOLUMBIA\t35291\tWM999\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17612-1.mp3\tLouis Prima & His Gang\tLady In Red\tBRUNSWICK\t7448\t17612-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400987-B.mp3\tChicago Footwarmers\tLady Love\tOKeh\t8613\t400987-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE31272.mp3\tDick Robertson W Orch\tLady Luck\tBRUNSWICK\t4592\tE31272\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe403199-B.mp3\tSmith Ballew And His Orchestra\tLady Luck\tOKeh\t41329\t403199-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_037.mp3\tTed Lewis And His Band\tLady Luck\tCOLUMBIA\t1999\tW148932-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81078-3.mp3\tBessie Smith\tLady Luck Blues\tCOLUMBIA\tA-3939\t81078-3\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWB24934.mp3\tTeddy Wilson & His Orch\tLady Of Mystery\tCOLUMBIA\t35207\tWB24934\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/ColB-24934-A.mp3\tTeddy Wilson And His Orchestra\tLady Of Mystery\tColumbia\t35207\tB-24934-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOB683.mp3\tLondon Mayfair Orchestra\tLady Of Spain\tVICTOR\t22774\tOB683\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_041.mp3\tEddie Fisher\tLady Of Spain\tRCA\t20-4953\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478349.mp3\tLes Paul\tLady Of Spain\tCAPITOL\t\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC27430-2.mp3\tPaul Whiteman & His Orch\tLady Of The Evening\tVICTOR\t19016\t27430-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_034.mp3\tJohn Steel\tLady Of The Evening\tVICTOR\t18990\t27079-7\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2532.mp3\tDuke Ellington\tLady Of The Lavender Mist\tCOLUMBIA\t38235\tHCO2532\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE35771.mp3\tNick Lucas & Crooning Troub.\tLady Play Your Mandolin\tBRUNSWICK\t6013\tE35771\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480864.mp3\tJazz At The Philharmonic\tLady, Be Good!\tAsch\t453-2B-453-3A-453-3B\t1502, 1503, 1504\t1945\tJoe Guy, Howard McGhee (tp), Willie Smith (as), Illinois Jacquet, Charlie Ventura (ts), Garland Finney (p), Ulysses Livingston (g), Red Callender (sb), Gene Krupa (dm), Norman Granz (dir)\nhttp://www.jazz-on-line.com/a/mp3w/1931_118.mp3\tHavana Novelty Orchestra\tLady, Play Your Mandolin\tVICTOR\t22597A\t67724-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC74853-1.mp3\tBennie Moten Kansas City Orch\tLafayette\tVICTOR\t24216\t74853-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140223.mp3\tEddie Cantor\tLaff It Off!\tCOLUMBIA\t283D\t140223\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5782.mp3\tSlam Stewart Qt\tLaff Slam , Laff\tSAVOY\t538\tS5782\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUM883.mp3\tDuke Ellington's Famous Orch\tLambeth Walk\tBRUNSWICK\t8204\tM883\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDR-2879-1.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tLambeth Walk\tDECCA\tF-6776\tDR-2879-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_068.mp3\tRuss Morgan And His Orchestra\tLambeth Walk\tDECCA\t2009A\t64482-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_118.mp3\tAl Donahue And His Orchestra Feat. V/paula Kelly\tLambeth Walk\tVOCALION\t4318\t23330\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_115.mp3\tDuke Ellington And His Famous Orchestra\tLambeth Walk\tBRUNSWICK\t8204\tM883\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1055.mp3\tArtie Shaw And His Orchestra\tLament\tRCA\t20-1932\tD5VB1055\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037692.mp3\tCharlie Barnet & His Orch\tLament For A Lost Love\tBLUEBIRD\t10341\t037692\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480723.mp3\tBarney Bigard & His Orch.\tLament For Javanette\tBluebird\tB-11098\t053622-1\t1940\tRay Nance (tp) Juan Tizol (tb) Barney Bigard (cl) Ben Webster (ts) Harry Carney (bar) Duke Ellington (p) Jimmy Blanton (b) Sonny Greer (d)\nhttp://www.jazz-on-line.com/a/mp3c/DEC4254A.mp3\tStan Kenton & His Orchestra\tLamento Gitano\tDECCA\t4254A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S101.mp3\tSy Oliver & His Orch\tLammar's Boogie\tMGM\t10133B\t47S101\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09608.mp3\tHal Kemp & His Orch\tLamplight\tVICTOR\t25651B\t09608\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81196-1.mp3\tThe Georgians\tLand Of Cotton Blues\tColumbia\tA-3987\t81196-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_223.mp3\tPerry Como Feat. O/russ Morgan\tLaroo, Laroo, Lilli Bolero\t2734\t\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT1602.mp3\tEddy Howard & His Orchestra\tLaroo, Laroo, Lily Bolero\tMAJESTIC\t1224\tT1602\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DECLA2931.mp3\tBob Crosby & His Orch\tLast Call For You\tDECCA\t4316B\tLA2931\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE30031.mp3\tLouisiana Rhythm Kings\tLast Cent\tVOCALION\t15815B\tE30031\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-30031.mp3\tLouisiana Rhythm Kings\tLast Cent\tVocalion\t15815\tE-30031\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC56316.mp3\tCannon's Jug Stompers\tLast Chance Blues\tVICTOR\t38593\t56316\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/COL784.mp3\tCal Stewart\tLast Day Of School At Pumkin Center\tCOLUMBIA\tA-0276\t784\t1902\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_016alt.mp3\tCal Stewart\tLast Day Of School At Pumpkin Center\tCOLUMBIA\tA-3637\t78492\t1904\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC69789.mp3\tBlanche Calloway & Her Orch\tLast Dollar\tVICTOR\t22862\t69789\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Oke71106-B.mp3\tSara Martin\tLast Go Round Blues\tOkeh\t8045\t71106-B\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68607-A.mp3\tArt Tatum & His Band\tLast Goodbye Blues\tDECCA\t8536\t68607-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/PARL0257.mp3\tGeechie Wiley\tLast Kind Words Blues\tPARAMOUNT\t12951A\tL0257\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29277-1.mp3\tIda Cox Allstar Orch\tLast Mile Blues\tOKEH\t6405\t29277-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC56.mp3\tBilly Eckstine & His Orch\tLast Night\tNATIONAL\t\tNSC56\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031532.mp3\tFats Waller And His Rhythm\tLast Night A Miracle Happened\tBLUEBIRD\t10136\t031532\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC28529-3.mp3\tPaul Whiteman & His Orch\tLast Night On The Back Porch\tVICTOR\t19139A\t28529-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC13002-3.mp3\tHenry Burr\tLast Night Was The End Of The World\tVICTOR\t17339\t13002-3\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_005.mp3\tHenry Burr\tLast Night Was The End Of The World\tVICTOR\t17339\t13002-3\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_066.mp3\tCharles W. Harrison\tLast Night Was The End Of The World\tEDISON\t1796\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_251.mp3\tSammy Kaye And His Orchestra\tLast Night's Gardenias\tVictor\t26472\t045922\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC102021.mp3\tFats Waller And His Rhythm\tLatch On\tVICTOR\t25471\t102021\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic102021-1.mp3\t\"fats\" Waller And His Rhythm\tLatch On\tVictor\t25471\t102021-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480417.mp3\tBen Webster Quintet\tLate Date\tVerve\tMGV8274\t21744-6\t1957\tBen Webster (ts), Oscar Peterson P, Stan Levey, D, Ray Brown, B, Herb Ellis, G\nhttp://www.jazz-on-line.com/a/mp3b/MER8951LF.mp3\tIllinois Jacquet & His Orch\tLater For The Happenin'\tMERCURY\t8951\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_121.mp3\tKay Armen Feat. The Balladiers\tLater Tonight\tDECCA\t18568A\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU23306-2.mp3\tTeddy Wilson & His Orch\tLaugh And Call It Love\tBRUNSWICK\t8207\t23306-2\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1315.mp3\tBing Crosby & Trotter's Orch\tLaugh And Call It Love\tDECCA\t1934B\tDLA1315\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23306-2.mp3\tTeddy Wilson And His Orchestra\tLaugh And Call It Love\tBrunswick\t8207\tB-23306-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA1995.mp3\tIrene Young & Al Weston\tLaugh And You'll Never Fell Blue\tColumbia\tA1995\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC43131-3.mp3\tWaring's Pennsylvanians\tLaugh Clown Laugh\tVICTOR\t21308A\t43131-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE26902.mp3\tBillie Holiday\tLaughing At Life\tOKEH\t5719\t26902\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26902-1.mp3\tBillie Holiday\tLaughing At Life\tCBS\toK5719\t26902-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62450.mp3\tEdgar Hayes & His Orchestra\tLaughing At Life\tDECCA\t1416\t62450\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63608-C.mp3\tWoody Herman & His Orch\tLaughing Boy Blues\tDECCA\t25194\t63608-C\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_289.mp3\tSlim And Slam\tLaughing In Rhythm\tVOCALION\t4461\t23358\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP252.mp3\tAndy Russell\tLaughing On The Outside\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1716.mp3\tDinah Shore\tLaughing On The Outside\tCOLUMBIA\t36964\tHCO1716\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4050.mp3\tMerry Macs\tLaughing On The Outside\tDECCA\t18811B\tL4050\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_037.mp3\tAndy Russell\tLaughing On The Outside (crying On The Inside)\tCapitol\t252\t1021\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_212.mp3\tFour Aces\tLaughing On The Outside (crying On The Inside)\tDECCA\t28843\t83227\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP196y.mp3\tJohnny Johnston\tLaura\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO34288.mp3\tWoody Herman And His Herd\tLaura\tCOLUMBIA\t36785\tCO34288\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2118x.mp3\tSpike Jones And City Slickers\tLaura\tRCA\t20-2118\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS5837.mp3\tErroll Garner Trio\tLaura\tSAVOY\t571A\tS5837\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3744.mp3\tDick Haymes - V.young\tLaura\tDECCA\t18666A\tL3744\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38042.mp3\tSidney Bechet Qt\tLaura\tCOLUMBIA\t38318\tCO38042\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC23812L.mp3\tEddie Heywood & His Orch\tLaura\tDECCA\t23812\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2942.mp3\tDinah Shore\tLavender Blue\tCOLUMBIA\t38299\tHCO2942\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA3100y.mp3\tSammy Kaye And His Orchestra\tLavender Blue\tRCA\t20-3100\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74899.mp3\tLionel Hampton & His Orch\tLavender Coffin\tDECCA\t24652\t74899\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec74899.mp3\tLionel Hampton And His Orchestra\tLavender Coffin\tDecca\t24652\t74899\t1949\tWendell Culley-t, Gene Morris-ts, Ben Kynard-bar, Doug Dukeorg, Lionel Hampton vib p v, Wes Montgomery-g, Roy Johnson-b, Earl Walker-dioe James-v\nhttp://www.jazz-on-line.com/a/mp3c/BLU57709-1.mp3\tCecil Scott & His Bright Boys\tLawd, Lawd\tBLUEBIRD\t8276\t57709-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6300.mp3\tGuy Lombardo Royal Canadians\tLawd, You Made The Night Too Long\tBrunswick\t6300\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe405167-B.mp3\tLouis Armstrong & His Orch\tLawd, You Made The Night Too Long\tOKeh\t41560\t405167-B\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11668.mp3\tGuy Lombardo Royal Canadians\tLawd, You Made The Night Too Long\tBRUNSWICK\t6300\t11668\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_180.mp3\tLouis Armstrong\tLawd, You Made The Night Too Long\tCOLUMBIA\t2646 D\t405167\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU064924.mp3\tJohn Estes\tLawyer Clark Blues\tBLUEBIRD\t8871\t064924\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MOD354.mp3\tChordettes\tLay Down Your Arms\tMODERN\tCadenc1299\t354\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_321.mp3\tAnne Shelton\tLay Down Your Arms\tColumbia\t40759\tCO56857\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_111.mp3\tChordettes\tLay Down Your Arms\tCadence\t1299\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN6731-2.mp3\tSam Lanin And His Orchestra\tLay Me Down To Sleep In Carolina\tBANNER\t1820\t6731-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20315l.mp3\tNat Shilkret & The Victor Orchestra\tLay Me Down To Sleep In Carolina\tVictor\t20315\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKJ-18-1.mp3\tMezzrow - Bechet Septet\tLayin' My Rules In Blues\tStoryville\tSLP 153\tKJ-18-1  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81653-2.mp3\tThe Georgians\tLazy\tColumbia\t114-D\t81653-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC29588-3.mp3\tBrox Sisters\tLazy\tVICTOR\t19298\t29588-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC100-1-2.mp3\tAl Jolson - Gene Rodemich Orch\tLazy\tBRUNSWICK\t2595\tC100-1-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC29700-6.mp3\tPaul Whiteman & His Orch\tLazy\tVICTOR\t19299\t29700-6\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2989.mp3\tBing Crosby - Bob Crosby Orch\tLazy\tDECCA\t18427B\tDLA2989\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiViclaz.mp3\tThe Brox Sisters\tLazy\tVictor\t\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_154.mp3\tBrox Sisters\tLazy\tVICTOR\t19298\t29588-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM-394-2.mp3\tBenny Carter And His Orchestra\tLazy Afternoon\tDECCA\tF-42130\tAM-394-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC77653-1.mp3\tHoagy Carmichael (v & P)\tLazy Bones\tVICTOR\t24402\t77653-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU13694-A.mp3\tDon Redman & His Orch\tLazy Bones\tBRUNSWICK\t6622\t13694-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_090.mp3\tMildred Bailey\tLazy Bones\tBRUNSWICK\t6587\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036920.mp3\tCharlie Barnet & His Orch\tLazy Bug\tBLUEBIRD\t10294\t036920\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31912.mp3\tLouisiana Rhythm Kings\tLazy Daddy\tBRUNSWICK\t4855\tE31912\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN9080-A.mp3\tWolverine Orchestra\tLazy Daddy\tGENNETT\t5542\t9080-A\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-31912-A.mp3\tLouisiana Rhythm Kings\tLazy Daddy\tBrunswick\t4923\tE-31912-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU11804.mp3\tCasa Loma Orchestra\tLazy Day\tBRUNSWICK\t6311\t11804\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6306.mp3\tBing Crosby\tLazy Day\tBrunswick\t6306\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUJC8596.mp3\tBing Crosby W Isham Jones\tLazy Day\tBRUNSWICK\t6306\tJC8596\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL6536.mp3\tElla Fitzgerald\tLazy Day\tDECCA\t28034\tL6536\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC35762-3.mp3\tThomas Morris Hot Babies\tLazy Drag\tVICTOR\t20483\t35762-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69731.mp3\tSkeets Tolbert Gentlemen Swing\tLazy Gal Blues\tDECCA\t8589\t69731\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec69731-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tLazy Gal Blues\tDecca\t8589\t69731-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35730.mp3\tCount Basie & His Orchestra\tLazy Lady Blues\tCOLUMBIA\t36990\tCO35730\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_208.mp3\tChick Bullock And His Orchestra\tLazy Lou'siana Moon\tBANNER\t671\t9410-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VocE-7391.mp3\tKing Oliver\tLazy Mama\tVocalion\t1190\tE-7391-A or B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/VarB-4370-B.mp3\tRex Steward And His Fifty-second Street Stompers\tLazy Man's Shuffle\tVariety\t517\tB-4370-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S454.mp3\tEarl Hines Swingtette\tLazy Mornin'\tMGM\t10382\t48S454\t\t\nhttp://www.jazz-on-line.com/a/mp3b/MER5424LPM.mp3\tMuggsy Spanier's Dixielanders\tLazy Piano Man\tMERCURY\t5424\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11205-A.mp3\tDuke Ellington & His Orch\tLazy Rhapsody\tBRUNSWICK\t6288\t11205-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_317.mp3\tRoberta Sherwood\tLazy River\tDecca\t29911\t89450\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe405058-4.mp3\tLouis Armstrong & His Orch\tLazy River\tOKeh\t41541\t405058-4\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69854.mp3\tThe Mills Brothers\tLazy River\tDECCA\t28458\t69854\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64365-2.mp3\tHoagy Carmichael & His Orch\tLazy River\tVICTOR\t23034\t64365-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1104.mp3\tLouis Prima's New Orleans Gang\tLazy River\tBRUNSWICK\t7666\tLA1104\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM52S346.mp3\tArt Mooney And His Orchestra\tLazy River\tMGM\t11347\t52S346\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D268B1.mp3\tWoody Herman And His Orchestra\tLazy River\tV-DISC\t268B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_272.mp3\tMills Brothers\tLazy River\tDECCA\t4187A\t69854\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_302.mp3\tArt Mooney And His Orchestra\tLazy River\tMGM\t11347\t52S346\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_220.mp3\tHoagy Carmichael\tLazy River\tVICTOR\t23034\t64365-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480689.mp3\tBenny Goodman Duo\tLazy River\tCapitol\tT441\t1845-6\t1947\tBenny Goodman (cl), Jimmy Rowles (p)\nhttp://www.jazz-on-line.com/a/mp3c/V-D28LAZR.mp3\tWoody Herman\tLazy River - There'll Be Some Changes Made\tV-DISC\t268\t\t\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC31152-2.mp3\tCoon-sanders Nighthawk Orch\tLazy Waters\tVICTOR\t19522\t31152-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR144225-3.mp3\tUniversity Six\tLazy Weather\tHARMONY\t433-H\t144225-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_169.mp3\tCalifornia Ramblers Feat. Ed Kirkeby\tLazy Weather\tCOLUMBIA\t1038 D\tW144230-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW144230-4.mp3\tCalifornia Ramblers\tLazy Weather (v I K)\tCOLUMBIA\t1038 D\tW144230-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe9458.mp3\tBlanche Calloway\tLazy Woman's Blues\tOKeh\t8279\t9458\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DECTB1298.mp3\tMills Brothers\tLazybones\tDECCA\t176B\tTB1298\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_005.mp3\tTed Lewis And His Band\tLazybones\tCOLUMBIA\t2786 D\tW152420-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS23907.mp3\tJimmie Lunceford And His Orch\tLe Jazz Hot\tCBS\tVO4595\t23907\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke23907-1.mp3\tJimmie Lunceford And His Orchestra\tLe Jazz Hot\tOkeh\t4595\t23907-1\t1938\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.78-tours.net/mp3/COLCL8249.mp3\tJacques Hlian Et Son Orchestre Chant : Henri Betti Et \" Jo \" Charrier\tLe Rgiment Des Mandolines Marche De L'oprette \" Mam'zelle Primtemps \"\tCOLUMBIA\tDF 3140\tCL 8249\t\t\nhttp://www.78-tours.net/mp3/PATCPT9208.mp3\tJacques Hlian Et Son Orchestre Chant : Lou Darley Et Churs Enregistr Au Thatre Des Champs-lyse\tLe Rossignol Cubain (soun Soun Ba Bao)\tPATH\tPG 664\tCPT 9.208\t\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-139-1.mp3\tNol Chiboust Et Son Orchestre (with Django Reinhardt)\tLe Sheik\tSWING\t86\tOSW-139-1\t1940\t\nhttp://www.78-tours.net/mp3/PAT203212.mp3\tMistinguett Avec Quatuor Vocal Acc. Du Melodic-jazz Du Casino De Paris\tLe Tambour-major\tPATH\tX. 94100\t203212 Semfa\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146908-1.mp3\tJoseph Falcon And Clemo Breaux\tLe Vieux Soulard Et Sa Femme\tCOLUMBIA\t15301 D\tW146908-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC16533-B.mp3\tTrinity Choir\tLead Kindly Light\tVICTOR\t16533\t16533-B\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68922-A.mp3\tSam Price & His Texas Blusican\tLead Me Daddy Straight To The Bar\tDECCA\t8649B\t68922-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/REG9204y.mp3\tTrinity Quartet\tLead, Kindly Light\tRegal\t9204\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1793x.mp3\tBilly May\tLean Baby\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89021LB.mp3\tIllinois Jacquet\tLean Baby\tMERCURY\t89021\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36882-1.mp3\tGeorge Olsen & His Music\tLeander (vff-bb-br) (from 'katja')\tVICTOR\t20289B\t36882-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67206.mp3\tBob Crosby & His Orch\tLeanin' On The Ole Top Rail\tDECCA\t3027A\t67206\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_054.mp3\tBob Crosby And His Orchestra\tLeanin' On The Ole Top Rail\tDecca\t3027\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CONLA1548.mp3\tSons Of The Pioneers\tLeaning On The Everlasting Arm\tCONQUEROR\t9447\tLA1548\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO34716.mp3\tLes Brown's Band Of Reknown\tLeap Frog\tCOLUMBIA\t36857\tCO34716\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93788.mp3\tLouis Armstrong & His Orch.\tLeap Frog\tDECCA\t4106B\tC93788\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2540.mp3\tCharlie Barnet\tLeapin' At Lincoln Gardens\tRCA\t20-2540\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC2140-1.mp3\tCharlie Palloy & His Orch\tLearn To Croon\tCROWN\t3528\tC2140-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUB793.mp3\tBing Crosby\tLearn To Croon\tBRUNSWICK\t6594\tB793-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/TesB779-A.mp3\tBing Crosby\tLearn To Croon\tTest\t\tB779-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB793-A.mp3\tBing Crosby\tLearn To Croon\tBRUNSWICK\t\tB793-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB793-B.mp3\tBing Crosby\tLearn To Croon\tBRUNSWICK\t\tB793-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_163.mp3\tFran Frey\tLearn To Croon\tCOLUMBIA\t2788 D\tW152433-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_106.mp3\tVincent Lopez And His Orchestra\tLearn To Do The Strut\tOkeh\t4987\tS72036-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81273-1.mp3\tThe Georgians\tLearn To Do The Strut\tColumbia\t11-D\t81273-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC25323-8.mp3\tPaul Whiteman & His Orch\tLearn To Smile\tVICTOR\t18778A\t25323-8\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_151.mp3\tCarl Fenton And His Orchestra\tLearn To Smile\tBRUNSWICK\t2120\t6034\t1921\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU6034.mp3\tCarl Fenton And His Orch\tLearn To Smile, Introducing: Conversation Step\tBRUNSWICK\t2120\t6034\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_013.mp3\tFrank Sinatra\tLearnin' The Blues\tCapitol\t3102\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_201.mp3\tPeggy King\tLearnin' To Love\tColumbia\t40562\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_177.mp3\tGlen Gray And Casa Loma Orchestra Feat. Kenny Sargent, V\tLearning\tBRUNSWICK\t6964\t15658-A\t1934\tGrady Watts (tp), Sonny Dunham (tp, tb), Pee Wee Hunt, Billy Rauch (tb), Glen Gray (as, ldr), Clarence Hutchinrider (cl, as), Kenny Sargent, Pat Davis (ts), Mel Jenssen (vn), Joe Hall (p), Jack Blanchette (g), Stanley Dennis (bb, sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3c/COLW150200.mp3\tGid Tanner's Skillet Lickers\tLeather Breeches\tCOLUMBIA\t15623 D\tW150200\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/Ode403964-A.mp3\tCasa Loma Orchestra\tLeave It That Way\tOdon\tONY-36079\t403964-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_317.mp3\tThe Ames Brothers With Hugo Winterhalter's Orchestra And Chorus\tLeave It To Your Heart\tRCA Victor\t5764\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI1566-C.mp3\tStevens' Trio\tLeave Me With A Smile - Foxtrot (chas. Koehler & Earl Burnett)\tEDISON\t\t1566-C\t\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP3538.mp3\tBlue Lu Barker\tLeave My Man Alone\tCAPITOL\t\t3538\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D239B2b.mp3\tChuck Foster And His Orchestra\tLeave Us Face It\tV-DISC\t239B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148471-1.mp3\tCharlie Poole N.carolina Ramb.\tLeaving Dear Old Ireland\tCOLUMBIA\t15425 D\tW148471-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142645-2.mp3\tCharlie Poole's N.c.ramblers\tLeaving Home\tCOLUMBIA\t15116 D\tW142645-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC81327-1.mp3\tJimmie Lunceford And His Orchestra\tLeaving Me\tVICTOR\t24586\t81327-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COL79072-6.mp3\tMarion Harris\tLeft All Alone Again Blues\tCOLUMBIA\tA-2939\t79072-6\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_051.mp3\tMarion Harris\tLeft All Alone Again Blues\tCOLUMBIA\tA-2939\t79072-6\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2072.mp3\tBing Crosby\tLegend Of Old California\tDECCA\t3388A\tDLA2072\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO40430.mp3\tGene Krupa & His Orch\tLemon Drop (vfrank Ross)\tCOLUMBIA\t38415\tCO40430\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76738.mp3\tLouis Jordan & His Trio\tLemonade\tDECCA\t27324\t76738\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36774-4.mp3\tFats Waller (organ)\tLenox Avenue Blues\tVICTOR\t20357B\t36774-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/VogST-1987.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tLentement Mademoiselle\tVogue\tDP05\tST-1987\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-266-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tLentement, Mademoiselle\tSWING\t146\tOSW-266-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D392A.mp3\tToscanini And The Nbc Symphony Orchestra\tLeonore Overture In C Major Part. 1 (beethoven)\tV-DISC\t392A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D392B.mp3\tToscanini And The Nbc Symphony Orchestra\tLeonore Overture In C Major Part. 2 (beethoven)\tV-DISC\t392B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-168-1.mp3\tPierre Allier Et Son Orchestre (with Django Reinhardt)\tLes Yeux Noirs\tSWING\t108\tOSW-168-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-153-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tLes Yeux Noirs\tSWING\t88\tOSW-153-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73557.mp3\tRoy Eldridge & His Orchestra\tLes' Bounce\tDECCA\t23783\t73557\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_216.mp3\tHamish Menzies\tLess Than Tomorrow\tDECCA\t28601\t83917\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL123LBA.mp3\tLester Young\tLester Blows Again\tALLADDIN\t123\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS25297-1.mp3\tCount Basie And His Orch\tLester Leaps In\tCBS\tVO5118\t25297-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DJD347.mp3\tLester Young\tLester Leaps In\tV-DISC\t764\tJD347\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc25297-1.mp3\tCount Basie And His Orchestra\tLester Leaps In\tVocalion\t5118\t25297-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR142-1.mp3\tLester Young Sextet\tLester Smooths It Out\tALLADDIN\t3257\tRR142-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL138LB.mp3\tLester Young's Band\tLester's Be Bop Boogie\tALLADDIN\t138\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152526-2.mp3\tErnest Coleman's Riviera Orch\tLet 'em Eat Cake (v Rondoliers)\tCOLUMBIA\t2831 D\tW152526-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/MER2556.mp3\tCootie Williams & His Orch\tLet 'em Roll\tMERCURY\t8143\t2556\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21895.mp3\tArtie Shaw And His New Music\tLet 'er Go\tBRUNSWICK\t7986\tB-21895-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011673.mp3\tBunny Berigan & His Orch\tLet 'er Go\tVICTOR\t25646B\t011673\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21731-1.mp3\tFletcher Henderson And His Orchestra\tLet 'er Go\tVocalion\t3713\t21731-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC42420-2.mp3\tRoger Wolfe Kahn And His Orch\tLet A Smile Be Your Umbrella\tVICTOR\t21233\t42420-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42953.mp3\tJimmy Dorsey & Orchestra\tLet A Smile Be Your Umbrella\tCOLUMBIA\t38968\tCO42953\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0123_01.mp3\tLee Morse And Her Bluegrass Boys\tLet A Smile Be Your Umbrella On A Rainy Day\tColumbia\t1303DA\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17603-1.mp3\tClarence Williams & His Orch\tLet Every Day Be Mother's Day\tARC\tVO3195\t17603-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC13425-3.mp3\tBilly Murray\tLet Her Go, Let Her Go\tVICTOR\t17374\t13425-3\t1913\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC17374l.mp3\tBilly Murray\tLet Her Go, Let Her Go\tVICTOR\t17374\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3a/COL3504.mp3\tBert Williams\tLet It Alone\tCOLUMBIA\tA-0305\t3504\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_010.mp3\tBert Williams\tLet It Alone\tCOLUMBIA\tA-0305\t3504\t1906\t\nhttp://www.jazz-on-line.com/a/mp3b/VicD9VB-1751.mp3\tLucky Millinder And His Orchestra\tLet It Be\tVictor\t20-0088\tD9VB-1751  \t1949\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU18391.mp3\tLeo Reisman & His Orch\tLet It Be Me\tBRUNSWICK\t7585\t18391\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_288.mp3\tDoris Day\tLet It Ring\tColumbia\t40618\tRHCO33525\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73863.mp3\tLucky Millinder & His Orch.\tLet It Roll\tDECCA\t24182\t73863\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73863.mp3\tLucky Millinder And His Orchestra\tLet It Roll\tDecca\t24182\t73863\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/KinK-5907.mp3\tLucky Millinder And His Orchestra\tLet It Roll Again\tKing\t4379\tK-5907  \t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1759-x.mp3\tVaughn Monroe\tLet It Snow! Let It Snow\tRCA\t20-1759\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_203.mp3\tBob Crosby And His Orchestra\tLet It Snow! Let It Snow! Let It Snow\tARA\t129\tARA1110-3\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_113.mp3\tConnee Boswell Feat. O/runs Morgan\tLet It Snow! Let It Snow! Let It Snow!\tDECCA\t18741\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/ARAARA1110-3.mp3\tBob Crosby & His Orchestra\tLet It Snow! Let It Snow! Let It Snow! Vbob Crosby\tARA\t129\tARA1110-3\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO40513.mp3\tStanley Brothers\tLet Me Be Your Friend\tCOLUMBIA\t20590\tCO40513\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU7967x.mp3\tMorris Brothers\tLet Me Be Your Salty Dog\tBLUEBIRD\t7967\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU69424-3.mp3\tJimmie Rodgers\tLet Me Be Your Sidetrack\tBLUEBIRD\t5084\t69424-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA8-A.mp3\tBing Crosby\tLet Me Call You Sweetheart\tDECCA\t101A\tDLA8-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D301A1.mp3\tBing Crosby\tLet Me Call You Sweetheart\tV-DISC\t301A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA8-A.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tLet Me Call You Sweetheart\tDecca\t101\tDLA8-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_016.mp3\tArthur Clough\tLet Me Call You Sweetheart\tEdison Amberol\t637\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22472.mp3\tErskine Hawkins Bama St.coll.\tLet Me Day Dream\tVOCALION\t4007\t22472\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC63635-A.mp3\tHarlem Hamfats\tLet Me Feel It\tDECCA\t7466\t63635-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL7989.mp3\tPeggy Lee\tLet Me Go Lover\tDECCA\t29373\tL7989\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO52582.mp3\tJoan Weber\tLet Me Go, Lover\tCOLUMBIA\t40366\tCO52582\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_134.mp3\tSunny Gale\tLet Me Go, Lover!\tRCA Victor\t5952\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_052.mp3\tTeresa Brewer With The Lancers\tLet Me Go, Lover!\tCoral\t61315\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_009.mp3\tJoan Weber\tLet Me Go, Lover!\tColumbia\t40366\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_245.mp3\tFontane Sisters And Texas Jim Robertson\tLet Me In\tRCA Victor\t4077\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU040511.mp3\tWalter Davis\tLet Me In Your Saddle\tBLUEBIRD\t8282\t040511\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU2059-60.mp3\tFletcher Henderson & His Orch\tLet Me Introduce You To My Rosie\tBRUNSWICK\t3026\t2059-60\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC33484.mp3\tPeerless Qt\tLet Me Linger Longer In Your Arms\tVICTOR\t19827\t33484\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_060.mp3\tCharles King And Elizabeth Brice Feat. D/walter B. Rogers\tLet Me Live And Stay In Dixieland\tVICTOR\t5843\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D351A.mp3\tFrank Sinatra\tLet Me Love You Tonight - Just Close Your Eyes\tV-DISC\t351A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL30443-1.mp3\tGene Krupa & His Orch\tLet Me Off Uptown\tCOLUMBIA\t37532\t30443-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69909.mp3\tLucky Millinder & His Orch\tLet Me Off Uptown\tDECCA\t4099B\t69909\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69909-A.mp3\tLucky Millinder And His Orchestra\tLet Me Off Uptown\tDecca\t4099\t69909-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481107.mp3\tGene Krupa Orch. Feat. Anita O'day\tLet Me Off Uptown\tOkeh\t6210\t30443-1\t1941\tRoy Eldridge (tp, vo), Graham Young, Torg Halten, Norman Murphy (tp), Babe Wagner, Jay Kelliher, John Grassi (tb), Mascagni Ruffo, Clint Neagley (as), Sam Musiker, Walter Bates (ts), Bob Kitsis (p), Ray Biondi (g), Biddy Bastien (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3a/OKE30443-1.mp3\tGene Krupa And His Orch\tLet Me Off Uptown (v Anita O' Day - R. Eldridge)\tOKEH\t6210\t30443-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4218.mp3\tShenandoah Valley Trio\tLet Me Rest\tCOLUMBIA\t20753\tHCO4218\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26660-A.mp3\tCount Basie And His Orchestra\tLet Me See\tColumbia\tC-417\t26660-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE685.mp3\tAl Jolson\tLet Me Sing And I'm Happy\tBRUNSWICK\t4721\tLAE685\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC5377.mp3\tBen Bernie & His Orch\tLet Me Sing And I'm Happy\tBRUNSWICK\t4741\tC5377\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150055.mp3\tBen Selvin & His Orch\tLet Me Sing And I'm Happy\tCOLUMBIA\tHA1137\tW150055\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_015.mp3\tAl Jolson\tLet Me Sing And I'm Happy\tBRUNSWICK\t4721\tLAE685\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1276.mp3\tBing Crosby - J.s.trotter\tLet Me Whisper\tDECCA\t1819A\tDLA1276\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO46810-1.mp3\tCarl Smith W String Band\tLet Old Mother Nature Have Her Way\tCOLUMBIA\t20862\tCO46810-1\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC015535.mp3\tBenny Goodman And His Orchestra\tLet That Be A Lesson To You\tVICTOR\t25708\t015535\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC71929.mp3\tCoon-sanders Orchestra\tLet That Be A Lesson To You\tVICTOR\t22950\t71929\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA-1138-A.mp3\tLouis Armstrong And His Orchestra\tLet That Be A Lesson To You\tDECCA\t1661A\tDLA-1138-A\t1938\t\nhttp://www.jazz-on-line.com/mp3/486251711.mp3\tLouis Jordan Tympany Five\tLet The Good Times Roll\tDECCA\t23741\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_157.mp3\tShirley And Lee\tLet The Good Times Roll\tAladdin\t3325\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_055alt.mp3\tHarry Anthony And James F. Harrison\tLet The Lower Lights Be Burning\tEDISON\t9272\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh110.mp3\tJack Payne And His Band\tLet The People Sing (v Billy Scott-coomber)\tDecca\tF-7403\tDR-4311-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035720.mp3\tErskine Hawkins & His Orch\tLet The Punishment Fit The Crime\tBLUEBIRD\t10218\t035720\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_013.mp3\tElizabeth Spencer And Charles Hart\tLet The Rest Of The World Go By\t\t\t\t1920\t\nhttp://www.78-tours.net/mp3/VIC18716-B.mp3\tFrank Ferera - Anthony Franchini\tLet The Rest Of The World Go By - Introducing \"who'll Take The Place Af Mary\"\tVICTOR\t18716\t18716-B\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU026857.mp3\tErskine Hawkins & His Orch\tLet This Be A Warning To You\tBLUEBIRD\t7826\t026857\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70114.mp3\tAl Cooper & His Savoy Sultans\tLet Your Conscience Be Your Guide\tDECCA\t8615\t70114\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1095.mp3\tFred Astaire W J.green\tLet Yourself Go\tBRUNSWICK\t7608\tLA1095\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98670-1.mp3\tRay Noble & His Orch\tLet Yourself Go\tVICTOR\t25241\t98670-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60463.mp3\tBoswell Sisters\tLet Yourself Go\tDECCA\t709B\t60463\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_032.mp3\tFred Astaire\tLet Yourself Go\tCOLUMBIA\t3116 D\tLA1095\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_115.mp3\tAmerican Quartet\tLet's All Be Americans Now\tVictor\t18258\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2597-A.mp3\tBing Crosby - Woody Herman\tLet's All Meet At My House\tDECCA\t4162B\tDLA2597-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDTB3200.mp3\tBilly Costello\tLet's All Sing Like The Birdies Sing\tDECCA\t1573\tDTB3200\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC528.mp3\tBen Bernie & His Orch\tLet's All Sing Like The Birdies Sing\tBRUNSWICK\t6504\tC528\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_196.mp3\tBen Bernie And His Orchestra Feat. Pat Kennedy\tLet's All Sing Like The Birdies Sing\tBRUNSWICK\t6504\tC528\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26492.mp3\tBenny Goodman & His Orch\tLet's All Sing Together\tCOLUMBIA\t35396\t26492\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046737.mp3\tGlenn Miller & His Orch\tLet's All Sing Together (vmh)\tBLUEBIRD\t10598\t046737\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29169-1.mp3\tLes Brown & His Orch\tLet's Be Buddies\tOKEH\t5937\t29169-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_312.mp3\tConnee Boswell Feat. O/harry Sosnik\tLet's Be Buddies\tDECCA\t3478A\t68305\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CON17473-2.mp3\tCarter Family\tLet's Be Lovers Again\tCONQUEROR\t8539\t17473-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC71271.mp3\tBuddy Johnson And His Band\tLet's Beat Out Some Love\tDECCA\t8647B\t71271\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC78510-1.mp3\tPaul Whiteman & His Orch\tLet's Begin (vramona Davies)\tVICTOR\t24453\t78510-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022431-1.mp3\tFats Waller And His Rhythm\tLet's Break The Good News (vfw)\tVICTOR\t25830\t022431-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19974-2.mp3\tBillie Holiday\tLet's Call A Heart A Heart\tARC\tVO3334\t19974-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU19898-2.mp3\tArtie Shaw And His Orchestra\tLet's Call A Heart A Heart\tBRUNSWICK\t7750\tB-19898-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA478-A.mp3\tBing Crosby & Georgie Stoll\tLet's Call A Heart A Heart\tDECCA\t947A\tDLA478-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_262.mp3\tBillie Holiday\tLet's Call A Heart A Heart\tVOCALION\t3334\t19974-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1275-C.mp3\tFred Astaire\tLet's Call The Whole Thing Off\tBRUNSWICK\t7857\tLA1275-C\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_079.mp3\tFred Astaire Feat. Johnny Green And His Orchestra\tLet's Call The Whole Thing Off\tBRUNSWICK\t7857\tLA1275-C\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_362.mp3\tEddy Duchin And His Orchestra\tLet's Call The Whole Thing Off\tVICTOR\t25569\t07844\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_279.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. V/bob Goday\tLet's Call The Whole Thing Off\tBluebird\t6878\t6693\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26202-A.mp3\tBenny Goodman And His Orchestra\tLet's Dance\tCOLUMBIA\t35301\t26202-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWCO26202.mp3\tBenny Goodman And His Orchestra\tLet's Dance\tCOLUMBIA\t36224\tWCO26202\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC038106.mp3\tTommy Dorsey & His Orch\tLet's Disappear\tVICTOR\t26333\t038106\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO31367.mp3\tBenny Goodman And His Orchestra\tLet's Do It\tCOLUMBIA\t38281\tCO31367\t1941\tvocal Peggy Lee\nhttp://www.jazz-on-line.com/a/mp3c/COL30235.mp3\tBillie Holiday\tLet's Do It\tCOLUMBIA\t30235\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20697-2.mp3\tBunny Berigan & His Boys\tLet's Do It\tBRUNSWICK\t7858\t20697-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_1103_02.mp3\tLee Morse And Her Bluegrass Boys\tLet's Do It\tColumbia\t1659DB\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_099.mp3\tDorsey Brothers Orchestra Feat. Bing Crosby\tLet's Do It (let's Fall In Love)\tOKeh\t41181\t401561-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKeCO31367-2.mp3\tBenny Goodman And His Orchestra\tLet's Do It (let's Fall In Love) From \"paris\"\tOkeh\t6474\tCO31367-2\t1941\tvocal Peggy Lee\nhttp://www.jazz-on-line.com/a/mp3c/OKe401561-B.mp3\tDorsey Brothers Orchestra\tLet's Do It (vbc)\tOKeh\t41181\t401561-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE28398.mp3\tBill Wirges And His Orch\tLet's Do It - Let's Fall In Love\tBRUNSWICK\t4116\tE28398\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147536-5.mp3\tPaul Whiteman & His Orch\tLet's Do It - Let's Fall In Love\tCOLUMBIA\t1701 D\tW147536-5\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC47749-3.mp3\tIrving Aaronson's Commanders\tLet's Do It, Let's Fall In Love\tVICTOR\t21745\t47749-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_052.mp3\tIrving Aaronson's Commanders\tLet's Do It, Let's Fall In Love\tVICTOR\t21745\t47749-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP969.mp3\tCootie Williams & His Orch\tLet's Do The Whole Thing Or Nothing\tCAPITOL\t\t969\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23763-2.mp3\tTeddy Wilson & His Orch\tLet's Dream In The Moonlight\tBRUNSWICK\t8283\t23763-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23763-2.mp3\tTeddy Wilson And His Orchestra\tLet's Dream In The Moonlight\tBrunswick\t8283\tB-23763-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1088-C.mp3\tFred Astaire W J.green\tLet's Face The Music And Dance\tBRUNSWICK\t7608\tLA1088-C\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_067.mp3\tFred Astaire\tLet's Face The Music And Dance\tCOLUMBIA\t3116 D\tLA1088\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98672-1.mp3\tRay Noble & His Orch\tLet's Face The Music And Dance\tVICTOR\t25241\t98672-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_130.mp3\tTed Fio Rito And His Orchestra Feat. V/stanley Hickman\tLet's Face The Music And Dance\tDECCA\t697A\t60419-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA95-A.mp3\tGus Arnheim And His Orch\tLet's Fall In Love\tBRUNSWICK\t6729\tLA95-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_274.mp3\tHarold Arlen\tLet's Fall In Love\tVictor\t24467\t78375-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC81037-1.mp3\tEddy Duchin And His Orch\tLet's Fall In Love\tVICTOR\t24510\t81037-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP1271.mp3\tBenny Goodman Quintet\tLet's Fall In Love\tV-DISC\t475\tVP1271\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8963LFI.mp3\tLester Young & His Orch\tLet's Fall In Love\tMERCURY\t8963\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_008.mp3\tEddy Duchin And His Orchestra Feat. Lew Sherwood\tLet's Fall In Love\tVICTOR\t24510\t81037-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480699.mp3\tAhmad Jamal\tLet's Fall In Love\tArgo\tLP-2638\t\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3a/VIC060902.mp3\tTommy Dorsey And His Orch\tLet's Get Away From It All\tVICTOR\t27377\t060902\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU062766.mp3\tFats Waller And His Rhythm\tLet's Get Away From It All\tBLUEBIRD\t11115\t062766\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKECO29974-1.mp3\tGene Krupa & His Orch\tLet's Get Away From It All\tOKEH\t6130\tCO29974-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_062.mp3\tTommy Dorsey Orch V Pied Pipers\tLet's Get Away From It All\tVICTOR\t27377\t060902\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1931_0603_01.mp3\tLee Morse And Her Bluegrass Boys\tLet's Get Friendly\tColumbia\t2474DA\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/COMM777.mp3\tLeonard Feather Swynge Band\tLet's Get Happy\tCOMMODORE\t528\tM777\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63236-A.mp3\tLil Armstrong And Her Swing Band\tLet's Get Happy Together\tDecca\t1904\t63236-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55421-3.mp3\tBennie Moten's Kansas City Or.\tLet's Get It\tVICTOR\t38072\t55421-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO898.mp3\tKay Kyser And His Orchestra\tLet's Get Lost\tCOLUMBIA\t36673\tHCO898\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiUnkl.mp3\tTeddy Powell & His Orchestra\tLet's Get Lost\tUnknown\t\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_030.mp3\tKay Kyser And His Orchestra\tLet's Get Lost\tCOLUMBIA\t36673\tHCO898\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_051.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly\tLet's Get Lost\tDECCA\t18532A\t71060\t1943\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCB-26-2.mp3\tCarolina Cotton Pickers\tLet's Get Together\tVOCALION\t03527\tB-26-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3028-.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tLet's Get Together\tBrunswick\t7065\tC-3028-\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VarM-431-1.mp3\tLucky Millinder With Mills Blue Rhythm Band\tLet's Get Together\tVariety\t634\tM-431-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1111.mp3\tLouis Prima's New Orleans Gang\tLet's Get Together And Swing\tBRUNSWICK\t7740\tLA1111\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10443.mp3\tFrankie Laine & Jimmy Boyd\tLet's Go Fishin'\tCOLUMBIA\t40650\tRHCO10443\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA1040.mp3\tAndy Iona's Novelty Four\tLet's Go For Broke\tCOLUMBIA\t3062 D\tLA1040\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D217A.mp3\tHarry James And His Orchestra\tLet's Go Home\tV-DISC\t217A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE31000.mp3\tCharlie Spivak And His Orch\tLet's Go Home\tOKEH\t6366\t31000\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO30307.mp3\tFletcher Henderson\tLet's Go Home\tCOLUMBIA\t36214\tCO30307\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/ColCO-30307-1.mp3\tFletcher Henderson And His Orchestra\tLet's Go Home\tColumbia\t36214\tCO-30307-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_049.mp3\tByron G. Harlan\tLet's Go In To A Picture Show\tIndestructable\t1202\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP960x.mp3\tMargaret Whiting - Jimmy Wakely\tLet's Go To Church\tCAPITOL\t960\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16286-C-1.mp3\tLouis Prima & His Gang\tLet's Have A Jubilee\tARC\tBR7394\t16286-C-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DECB-16286-B.mp3\tLouis Prima And His New Orleans Gang\tLet's Have A Jubilee\tDECCA\tF-5499\tB-16286-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-16286-C.mp3\tLouis Prima And His New Orleans Gang\tLet's Have A Jubilee\tBrunswick\t7394\tB-16286-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-15036-A.mp3\tMills Blue Rhythm Band\tLet's Have A Jubilee\tColumbia\t2963-D\tCO-15036-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO10126.mp3\tFrankie Laine & Jo Stafford\tLet's Have A Party\tCOLUMBIA\t39672\tHCO10126\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC010599.mp3\tBunny Berigan & His Orch\tLet's Have Another Cigarette\tVICTOR\t25613B\t010599\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068837.mp3\tGlenn Miller And His Orch\tLet's Have Another Cup Of Coffee\tBLUEBIRD\t11450-A\t068837\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152175.mp3\tEnrique Madriguera Biltmore Or\tLet's Have Another Cup Of Coffee\tCOLUMBIA\t2651\tW152175\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol2651-D.mp3\tEnrique Madriguera Biltmore Orchestra\tLet's Have Another Cup Of Coffee\tColumbia\t2651-D\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC71890-1.mp3\tFred Waring's Pennsylvanians\tLet's Have Another Cup Of Coffee (vcb)\tVICTOR\t22936\t71890-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1116.mp3\tLouis Prima's New Orleans Gang\tLet's Have Fun\tBRUNSWICK\t7709\tLA1116\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU02520.mp3\tWashboard Wonders\tLet's Incorforate\tBLUEBIRD\t6761\t02520\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5317.mp3\tGeorgie Auld & His Orchestra\tLet's Jump\tMUSICRAFT\t15046\t5317\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45227.mp3\tCarl Smith W String Band\tLet's Live A Little\tCOLUMBIA\t20796\tCO45227\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62678.mp3\tEdgar Hayes & His Orch.\tLet's Love\tDECCA\t1665B\t62678\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPxy.mp3\tWalter Brown - Jay Mcshann\tLet's Love Awhile\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480781.mp3\tJay Mcshann & His Orch.ben Webster\tLet's Love Awhile\t\t\t\t1949\tJay McShann (p), Ben Webster (ts)\nhttp://www.jazz-on-line.com/a/mp3c/DECC92095.mp3\tVillage Boys\tLet's Make Believe We're Sweethearts\tDECCA\t5834\tC92095\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26657-A.mp3\tCount Basie And His Orchestra\tLet's Make Hey While The Sun Shines\tColumbia\t35500\t26657-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141803-3.mp3\tArt Gillam\tLet's Make Up\tCOLUMBIA\t892 D\tW141803-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_203.mp3\tBen Bernie And His Orchestra Feat. V/scrappy Lambert And Billy Hillpot\tLet's Misbehave\tBRUNSWICK\t3761\t25745\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU25745.mp3\tBen Bernie & His Orch\tLet's Misbehave (v S L- B H)\tBRUNSWICK\t3761\t25745\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC60981-A.mp3\tBob Howard & His Orch\tLet's Not Fall In Love\tDECCA\t839B\t60981-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62800.mp3\tWoody Herman & His Orchestra\tLet's Pitch A Little Woo\tDECCA\t1570\t62800\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC84421.mp3\tFats Waller And His Rhythm\tLet's Pretend There's A Moon\tVICTOR\t24742\t84421\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84421-1.mp3\t\"fats\" Waller And His Rhythm\tLet's Pretend There's A Moon\tVictor\t24742\t84421-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152298-2.mp3\tRudy Vallee Connect.yankees\tLet's Put Out The Lights\tCOLUMBIA\t2715 D\tW152298-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP7457.mp3\tBing Crosby\tLet's Put Out The Lights\tCOLUMBIA\t39521\tZSP7457\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_020.mp3\tRudy Vallee And His Connecticut Yankees\tLet's Put Out The Lights\tCOLUMBIA\t2715 D\tW152298-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU12510-A.mp3\tBing Crosby\tLet's Put Out The Lights (and Go To Sleep)\tBRUNSWICK\t6414\t12510-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12294.mp3\tBen Bernie & His Orch\tLet's Put Out The Lights (and Go To Sleep)\tBRUNSWICK\t6385\t12294\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_128.mp3\tBen Bernie And His Orchestra\tLet's Put Out The Lights (and Go To Sleep)\tBRUNSWICK\t6385\t12294\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC73581-1.mp3\tPaul Whiteman And His Orch\tLet's Put Out The Lights (ramona)\tVICTOR\t24140\t73581-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068701.mp3\tAbe Lyman & His Californians\tLet's Put The Ax To The Axis\tBLUEBIRD\t11410\t068701\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D356A1.mp3\tThe Merry Macs\tLet's Sing A Song About Susie\tV-DISC\t356A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_163.mp3\tMerry Macs\tLet's Sing A Song About Susie\tDECCA\t18622\tL3483\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101671-1.mp3\tFats Waller And His Rhythm\tLet's Sing Again\tVICTOR\t25348\t101671-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_200.mp3\tBobby Breen\tLet's Sing Again\tDECCA\t798A\t61101\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic101671-1.mp3\t\"fats\" Waller And His Rhythm\tLet's Sing Again\tVictor\t25398\t101671-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC48286-4.mp3\tBen Pollack Park Central Orch\tLet's Sit And Talk About You\tVICTOR\t21858\t48286-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA90-B.mp3\tLennie  Hayton  And  His  Orchestra\tLet's Spend An Evening At Home\tColumbia\t\tLA90-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA90-A.mp3\tLennie  Hayton  And  His  Orchestra\tLet's Spend An Evening At Home\tColumbia\tDO1086\tLA90-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/BANLA90-A.mp3\tBing Crosby\tLet's Spend The Evening At Home\tBANNER\t33163\tLA90-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL941.mp3\tHi-flyers\tLet's Spend The Night In Hawaii\tVOCALION\t5000\tDAL941\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17260-2.mp3\tWingy Manone & His Orch\tLet's Spill The Beans\tARC\tVO2934\t17260-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2990.mp3\tBing Crosby - Bob Crosby Orch\tLet's Start The New Year Right\tDECCA\t18429B\tDLA2990\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24017-1.mp3\tHorace Heidt & Musical Knights\tLet's Stop The Clock (vlarry Cotton)\tCBS\tBR8309\t24017-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17782.mp3\tWingy Manone & His Orch\tLet's Swing It\tARC\tVO2990\t17782\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-17740-1-2.mp3\tLouis Prima And His New Orleans Gang\tLet's Swing It\tBrunswick\t7479\tB-17740-1-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92230.mp3\tRay Noble & His Orch\tLet's Swing It (v4) ('earl Carroll Sketchbook')\tVICTOR\t25070\t92230\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_139.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tLet's Take An Old-fashioned Walk\tRCA Victor\t78-3469\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_153.mp3\tDoris Day And Frank Sinatra Feat. Axel Stordahl's Orchestra\tLet's Take An Old-fashioned Walk\tCOLUMBIA\t38513\tHCO3748\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD4VB1054.mp3\tArtie Shaw And His Orchestra\tLet's Take The Long Way Home\tRCA\t20-1620\tD4VB1054\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO4323.mp3\tCab Calloway & His Orch\tLet's Take The Long Way Home\tCOLUMBIA\t36786\tCCO4323\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3678.mp3\tBing Crosby - J.s.trotter\tLet's Take The Long Way Home\tDECCA\t18644\tL3678\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_199.mp3\tJo Stafford\tLet's Take The Long Way Home\tCapitol\t181\t404\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_255.mp3\tCab Calloway And His Orchestra\tLet's Take The Long Way Home\tCOLUMBIA\t36786\tCCO4323\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/HITT475.mp3\tLouis Prima & His Orch\tLet's Take The Long Way Home (v L C)\tHIT OF THE WEEK\t7118\tT475\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_172.mp3\tRuth Etting\tLet's Talk About My Sweetie\tCOLUMBIA\t580 D\tW141671\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS6441-2.mp3\tSam Lanin And His Orchestra\tLet's Talk About My Sweetie  (244?)\tCBS\tBA1711\t6441-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1692.mp3\tBing Crosby & Trotter's Orch\tLet's Tie The Old Forget-me-not\tDECCA\t2273B\tDLA1692\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUJC8597.mp3\tBing Crosby W Isham Jones\tLet's Try Again\tBRUNSWICK\t6320\tJC8597\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/ColWC-307D-A.mp3\tJimmie Lunceford And His Orchestra\tLet's Try Again\tColumbia\t35725\tWC-307D-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5408.mp3\tArtie Shaw And His Orchestra\tLet's Walk\tMUSICRAFT\t357\t5408\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1071.mp3\tBing Crosby Acc E.dunstedter\tLet's Waltz For Old Time's Sake\tDECCA\t1554\tDLA1071\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA1071-B.mp3\tBing Crosby And Eddie Dunstedter\tLet's Waltz For Old-time's-sake\tDecca\t1554  \tDLA1071-B \t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC12510-A.mp3\tBing Crosby\tLets Put Out The Lights\tARC\tBR6414\t12510-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU87641.mp3\tHarry Chatmon (p.carter)\tLetter From Texas\tBLUEBIRD\t6009\t87641\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh065.mp3\tHarry Roy And His Band\tLets Be Buddies\tRegal Zonophone\tMR-3493\tCAR-6069-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-17-1.mp3\tMezzrow - Bechet Septet\tLevee Blues\tKing Jazz\t144\tKJ-17-1  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/VocE-35986-B.mp3\tThe Chocolate Dandies\tLevee Low Down ? V D R\tVocallon\t1646\tE-35986-B\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28514.mp3\tCab Calloway & His Orch\tLevee Lullaby\tOKEH\t5950\t28514\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_119.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra\tLeven Thirty Saturday Night\tBRUNSWICK\t4754\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74122.mp3\tBuddy Johnson And His Orch.\tLi'l Dog\tDECCA\t48076\t74122\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/CHAX0191.mp3\tDuke Ellington & His Orchestra\tLi'l Farina\tCHAMPION\t15120\tX0191\t1926\t\nhttp://www.jazz-on-line.com/a/mp3h/GenX-191-A.mp3\tDuke Ellington & His Orchestra\tLi'l Farina\tGennett\t3342\tX-191-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLH374.mp3\tBob Wills And His Texas Playboys\tLi'l Liza Jane\tCOLUMBIA\t37664\tH374\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147253-1.mp3\tGid Tanner's Skillet Lickers\tLiberty\tCOLUMBIA\t15334 D\tW147253-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC21251-5.mp3\tPeerless Qt\tLiberty Bell, It's Time To Ring\tVICTOR\t18434\t21251-5\t1918\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC21275-2.mp3\tSousa's Band\tLiberty Loan March\tVICTOR\t18430\t21275-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_037.mp3\tSousa's Band\tLiberty Loan March\tVICTOR\t18430\t21275-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3d/HMWOSW-150-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tLiebesfreud\tHMW\tFELP 236\tOSW-150-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04933.mp3\tTommy Dorsey & His Orch\tLiebestraum\tVICTOR\t25539\t04933\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68528-A.mp3\tJan Savitt And His Orchestra\tLiebestraum\tDECCA\t3876A\t68528-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec3876.mp3\tJan Savitt & His Orchestra\tLiebestraum\tDecca\t3876\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/HMVOLA-1714-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tLiebestraum No 3\tHMV\tB-8737\tOLA-1714-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/BAN10977-1.mp3\tGene Austen With Ben Pollack Orchestra\tLies\tBANNER\t32325\t10977-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_213.mp3\tGene Austin Feat. O/ben Pollack\tLies\tPerfect\t15542\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_305.mp3\tPerry Como Feat. O/hugo Winterhalter, Bv/the Ramblers\tLies\tRCA Victor\t5064\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/CHAE60593.mp3\tLen Herman & Orch (red Norvo)\tLife Begins When You're In Love\tCHAMPION\t40101\tE60593\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_307.mp3\tIsham Jones And His Orchestra\tLife Begins When You're In Love\tDECCA\t704A\t60429-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18612-1.mp3\tTeddy Wilson And His Orchestra\tLife Begins When You're In Love (v B. Holiday)\tBRUNSWICK\t7612\t18612-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC60429-A.mp3\tIsham Jones And His Orchestra\tLife Begins When You're In Love - Vocal Woody Herman\tDecca\t704A\t60429-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_113.mp3\tCarson Robison\tLife Gets Tee-jus, Don't It?\tMGM\t10224\t47S309\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS22086-2.mp3\tHarry James And His Orchestra\tLife Goes To A Party\tCBS\tBR8035\t22086-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC017044-2.mp3\tBenny Goodman And His Orchestra\tLife Goes To A Party\tVICTOR\t25726A\t017044-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-22086-2.mp3\tHarry James And His Orchestra\tLife Goes To A Party\tBrunswick\t8035\tB-22086-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480640.mp3\tBenny Goodman And His Orchestra\tLife Goes To A Party\tColumbia\tSL160\t\t1938\tCarnegie Hall'' Concert:<br>Harry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Hymie Schertzer, George Koenig (as), Arthur Rollini, Babe Russin (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3b/COL77413.mp3\tLt.gitz Rice & Henry Burr\tLife In A Trench In Belgium\tCOLUMBIA\tA-2410\t77413\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_146a.mp3\tLieutenant Gitz Rice Of The First Canadians And Henry Burr\tLife In A Trench In Belgium - Part 1\tCOLUMBIA\t2410\t77413\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_146b.mp3\tLieutenant Gitz Rice Of The First Canadians And Henry Burr\tLife In A Trench In Belgium - Part 2\tCOLUMBIA\t2410\t77414\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_146c.mp3\tLieutenant Gitz Rice Of The First Canadians And Henry Burr\tLife In A Trench In Belgium - Part 3\tCOLUMBIA\t2583\t77498\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_146d.mp3\tLieutenant Gitz Rice Of The First Canadians And Henry Burr\tLife In A Trench In Belgium - Part 4\tCOLUMBIA\t2583\t77502\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC17250.mp3\tRuth Etting\tLife Is A Song\tARC\tCO3031D\t17250\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COL17250.mp3\tRuth Etting\tLife Is A Song\tCOLUMBIA\t3031 D\t17250\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_016.mp3\tRuth Etting\tLife Is A Song\tCOLUMBIA\t3031 D\t17250\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70096-A.mp3\tJimmie Lunceford And His Orchestra\tLife Is Fine\tDecca\t4289\t70096-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_327.mp3\tJaye P. Morgan\tLife Is Just A Bowl Of Cherries\tDECCA\t29611\t87696\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_046.mp3\tRudy Vallee And His Connecticut Yankees\tLife Is Just A Bowl Of Cherries\tVictor\t22783\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/VIC70156-1.mp3\tRudy Valle And His Connecticut Yankees Vocal Refrain By Rudy Valle, Frank Frisselle And Sy Baker\tLife Is Just A Bowl Of Cherries (from George White's Scandals Of 1931)\tVICTOR\t22783\t70156-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/CBS23235.mp3\tBud Freeman And His Band\tLife Spears A Jitterbug\tCBS\tCM507\t23235\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/APOR-1011.mp3\tEarl Hines Sextet\tLife With Fatha\tAPOLLO\t365\tR-1011\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/ApoR-1011.mp3\tEarl Hines Sextet\tLife With Fatha\tApollo\t356\tR-1011\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_055.mp3\tGeorge M. Cohan\tLife's A Funny Proposition, After All\tVICTOR\t60042\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC075407.mp3\tTommy Dorsey And His Orch\tLight A Candle In The Chapel\tVICTOR\t27941\t075407\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_194.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra\tLight A Candle In The Chapel\tVICTOR\t27941\t075407\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM941.mp3\tBuster Bailey Rhythm Busters\tLight Up\tVOCALION\t4564\tM941\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_248.mp3\tRusty Draper Feat. D/david Carroll; V/jack Halloran Singers\tLighthouse\tMERCURY\t70188\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULA1757.mp3\tGene Krupa & His Orch\tLightly And Politely\tBRUNSWICK\t8274\tLA1757\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC019423.mp3\tTommy Dorsey & His Orch\tLightly And Politely\tVICTOR\t26085\t019423\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU040479-1.mp3\tEarl Hines And His Orchestra\tLightly And Politely\tBLUEBIRD\tB-10727\t040479-1\t1939\tWalter Fuller (tp,vcl) Milton Fletcher, Ed Sims (tp) George Dixon (tp,as) Ed Burke, John Ewing, Joe McLewis (tb) Omer Simeon (cl,bar) Leroy Harris (as,vcl) Budd Johnson (cl,as,ts,bar) Robert Crowder (ts) Earl Hines (p) Claude Roberts (g) Quinn Wilson (b) Alvin Burroughs (d) Laura Rucker (vcl) Horace Henderson, Jimmy Mundy, Elmer \"Skippy\" Williams (arr)\nhttp://www.jazz-on-line.com/a/mp3e/BruB-12344-A.mp3\tDuke Ellington And His Famous Orchestra\tLightnin'\tBrunswick\t6404\tB-12344-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3o/IMPHTN506-1.mp3\tLightnin' Hopkins\tLightnin' Boogie\tIMPERIAL\t5852\tHTN506-1\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/VICOB950.mp3\tRay Noble & His Orch\tLights Of Paris\tVICTOR\t24004\tOB950\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_051.mp3\tRay Noble And His Orchestra\tLights Of Paris\tVICTOR\t24004\tOB950\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP5130-4.mp3\tTommy Douglas And His Orch\tLights Out\tCAPITOL\t\t5130-4\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC98458.mp3\tEddy Duchin And His Orch\tLights Out\tVICTOR\t25212A\t98458\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_025.mp3\tEddy Duchin And His Orchestra\tLights Out\tVICTOR\t25212A\t98458\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2439.mp3\tBing Crosby\tLights Out Till Reveille\tDECCA\t3886A\tDLA2439\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COL16366.mp3\tBenny Goodman And His Orchestra\tLike A Bolt From The Blue\tCOLUMBIA\t2988 D\t16366\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc16467-1.mp3\tMills Blue Rhythm Band\tLike A Bolt From The Blue\tVocalion\t2867\t16467-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA-1011-A.mp3\tJimmie Lunceford And His Orchestra\tLike A Ship At Sea\tDecca\t1617\tDLA-1011-A\t1937\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3a/VIC38782.mp3\tVaughn Deleath\tLike An Angel You Flew Into Everyone's Heart\tVICTOR\t20674-B\t38782\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA94-A.mp3\tGus Arnheim And His Orch\tLike Me A Little Bit Less\tBRUNSWICK\t6729\tLA94-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-689-1.mp3\tJimmie Noone And His Orchestra\tLike Me A Little Bit Less - V E P\tVocalion \t2619\tC-689-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3410.mp3\tBing Crosby\tLike Someone In Love\tDECCA\t18640\tL3410\t1944\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480418.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tLike Someone In Love\tRCA\t430044\t\t1958\tArt Blakey, D, Benny Golson, Ts, Lee Morgan, T,: Jymie Merritt, B, Bobby Timmons, P\nhttp://www.jazz-on-line.com/a/mp3t/TS480536.mp3\tArt Farmer Quintet\tLike Someone In Love\tUnited Artists\tUAL4007\t\t1958\tArt Farmer, T, Flh, Benny Golson, Ts, Addison Farmer, B, Bill Evans, P, Dave Bailey, D, Gigi Gryce, Ar\nhttp://www.jazz-on-line.com/a/mp3c/OKE28751-1.mp3\tGene Krupa & His Orch\tLike The Fella Once Said\tOKEH\t5836\t28751-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/EDI18336-C.mp3\tOreste And His Queensland Orch\tLila (ft)\tEDISON\t52273\t18336-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66293.mp3\tBob Crosby And His Orch\tLilacs In The Rain\tDECCA\t2763A\t66293\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_114.mp3\tCharlie Barnet And His Orchestra Feat. Del Casino\tLilacs In The Rain\tBLUEBIRD\t10439\t36484\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_040.mp3\tBob Crosby And His Orchestra\tLilacs In The Rain\tDECCA\t2763A\t66293\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036484.mp3\tCharlie Barnet & His Orch\tLilacs In The Rain (v  D C)\tBLUEBIRD\t10439\t036484\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC72237.mp3\tHildegarde\tLili Marlene\tDECCA\t23348\t72237\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D305B2.mp3\tVaughn Monroe\tLili Marlene\tV-DISC\t305B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_117.mp3\tPerry Como\tLili Marlene\tRCA\t20-1592\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_222.mp3\tPied Pipers\tLily Belle\tCapitol\t207\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_091.mp3\tFreddy Martin And His Orchestra\tLily Belle\tRCA\t20-1712\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77240.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tLily Belle May June\tUltraphone\tAP-1444\tP-77240\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2946.mp3\tBing Crosby & Mary Martin\tLily Of Laguna\tDECCA\t18278A\tDLA2946\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC19883-2.mp3\tArthur Collins-byron Harlan\tLily Of The Valley\tVICTOR\t18398\t19883-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_057.mp3\tArthur Collins And Byron Harlan\tLily Of The Valley\tCOLUMBIA\tA-2296\t77125\t1917\t\nhttp://www.jazz-on-line.com/a/mp3r/RiSwel.mp3\tGlen Gray & His Orchestra\tLimehouse Blues\tSweet & Hot - Jazz A\t\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE31610-1.mp3\tBenny Goodman Sextet\tLimehouse Blues\tOKEH\t6486\t31610-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38639.mp3\tMills Brothers\tLimehouse Blues\tDECCA\t267B\t38639\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC047078.mp3\tLarry Clinton & His Orchestra\tLimehouse Blues\tVICTOR\t26523A\t047078\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MER6393.mp3\tJerry Byrd\tLimehouse Blues\tMERCURY\t6393\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC067792-1.mp3\tNew Orleans Feetwarmers\tLimehouse Blues\tVICTOR\t27600\t067792-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN047n.mp3\tBenny Morton\tLimehouse Blues\tBLUENOTE\t47\tBN-222-0\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73331.mp3\tLionel Hampton Quintet\tLimehouse Blues\tDECCA\t23879B\t73331\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC29335-2.mp3\tPaul Whiteman & His Orch\tLimehouse Blues\tVICTOR\t19264\t29335-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/DIS5501lb.mp3\tCharlie Ventura Trio\tLimehouse Blues\tDISC\t5501\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC68237-1.mp3\tDuke Ellington & His Orch\tLimehouse Blues\tVICTOR\t22743\t68237-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1062-1.mp3\tDjango Reinhardt\tLimehouse Blues\tGramophone\tK-7706\tOLA-1062-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-119-1.mp3\tDjango's Music\tLimehouse Blues\tSWING\t82\tOSW-119-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DECTB1868.mp3\tAmbrose And His Orchestra\tLimehouse Blues\tDECCA\t660A\tTB1868\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D318B1.mp3\tKay Kyser And His Orchestra\tLimehouse Blues\tV-DISC\t318B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BluBN-221-2.mp3\tBenny Morton's All Stars\tLimehouse Blues\tBlue Note\t47\tBN-222-0\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73331-A.mp3\tLionel Hampton And His Quartet\tLimehouse Blues\tDecca\t23879\t73331-A\t1946\tLionel Hampton vib, Milt Buckner Dan Burley p, Billy Mackel g, Charles Harris b, George Jenkins d\nhttp://www.jazz-on-line.com/a/mp3d/Dec38598-A.mp3\tFletcher Henderson And His Orchestra\tLimehouse Blues\tDecca\t157\t38598-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_153.mp3\tDuke Ellington\tLimehouse Blues\tVICTOR\t22743\t68237-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/VocM-296-1.mp3\tChu Berry And His Stompy Stevedores\tLimehouse Blues\tVocalion\t3824\tM-296-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480769.mp3\tBenny Morton All Stars\tLimehouse Blues\tBlue Note\t47\tBN222-0\t1945\tBenny Morton (tb), Barney Bigard (cl), Ben Webster (ts), Sam Benskin (p), Israel Crosby (sb), Eddie Dougherty (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1934_297.mp3\tGlen Gray And Casa Loma Orchestra\tLimehouse Blues\tBrunswick\t6886\tB-14855-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_040.mp3\tFrank Chacksfield And His Orchestra\tLimelight (terry's Theme)\tLONDON\t1342\t\t1953\t\nhttp://www.78-tours.net/mp3/ODECe14500.mp3\tRon Godwin And His Orchestra\tLimelight Thme Musical Du Film Chalie Chaplin\tODON\t275.077\tCe 14.500\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3300-.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tLina Blues\tBrunswick\t7087\tC-3300-\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO37090-1.mp3\tBuddy Clark W Ray Noble Orch\tLinda\tCOLUMBIA\t37215\tCO37090-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D751x.mp3\tRay Noble Orch\tLinda\tV-DISC\t751\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_010.mp3\tRay Noble And His Orchestra Feat. Buddy Clark\tLinda\tCOLUMBIA\t37215\tCO37090-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DECC91840.mp3\tElla Fitzgerald & Her Orch\tLinda Hopper's Delight\tDECCA\t3186B\tC91840\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DECC93682.mp3\tRice Brothers Gang\tLinda May Polka\tDECCA\t6019\tC93682\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC38826.mp3\tVernon Dalhart\tLindbergh\tVICTOR\t20674-A\t38826\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_049.mp3\tVernon Dalhart\tLindbergh (the Eagle Of The U.s.a.)\tCHALLENGE\tCHG369\tX0661c\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62442-A.mp3\tLil Armstrong And Her Swing Band\tLindy Hop\tDecca\t1388\t62442-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_150.mp3\tFive Keys\tLing Ting Tong\tCapitol\t2945\t30469\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_172.mp3\tCharms\tLing, Ting, Tong\tDeLuxe\t6076\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU12500A.mp3\tBing Crosby\tLinger A Little Longer In The Twilight\tBRUNSWICK\t6491\t12500A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC28978-4.mp3\tPaul Whiteman And His Orch\tLinger Awhile\tVICTOR\t19211A\t28978-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUB-15374-A.mp3\tCasa Loma Orchestra\tLinger Awhile\tBRUNSWICK\t7325\tB-15374-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61551-A.mp3\tJimmie Lunceford And His Orchestra\tLinger Awhile\tDecca\t1229\t61551-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Edi9267.mp3\tFletcher Henderson's Orchestra\tLinger Awhile\tEdison\t51277\t9267\t1923\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480719.mp3\tRex Stewart & His Orch.\tLinger Awhile\tBluebird\tB-11057\t053610-2\t1940\tRex Stewart (co), Lawrence Brown (tb), Ben Webster (ts), Harry Carney (as, bar), Billy Strayhorn (p), Jimmy Blanton (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480758.mp3\tBig Sidney Catlett Quartet\tLinger Awhile\tCommodore\tXFL14938\tA-4739-1\t1944\tBen Webster (ts) Marlowe Morris (p) John Simmons (b) Sidney Catlett (d)\nhttp://www.jazz-on-line.com/a/mp3b/EDI9267.mp3\tFletcher Henderson And His Orchestra\tLinger Awhile - Foxtrot (vincent Rose - Harry Owens)\tEDISON\t\t9267\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61551-A.mp3\tJimmie Lunceford And His Orchestra\tLinger Awhile.mp3\tDecca\t1229\t61551-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_103.mp3\tAda Jones And Billy Murray\tLingering Love\tVICTOR\t17071\t11540-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN4242L.mp3\tRussell Jacquet & His Allstars\tLion's Roar\tKING\t4242\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_109.mp3\tJulius Larosa\tLipstick And Candy And Rubbersole Shoes\tRCA\t6416\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_011.mp3\tNelson Riddle And His Orchestra\tLisbon Antigua\tCapitol\t3287 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_155.mp3\tMitch Miller And His Orchestra\tLisbon Antigua (in Old Lisbon)\tColumbia\t40635\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62333-A.mp3\tCount Basie And His Orch\tListen My Children And You Shall Hear\tDECCA\t1379\t62333-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24090.mp3\tGeorge Olsen & His Music\tListen To The German Band\tVictor\t24090\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC73107.mp3\tGeorge Olsen & His Music\tListen To The German Band (ve.schutta)\tVICTOR\t24090\t73107\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64834.mp3\tMary Martin - Woody Herman\tListen To The Mocking Bird\tDECCA\t2265A\t64834\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC74465.mp3\tAlma Gluck\tListen To The Mocking Bird\tVICTOR\t74465\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_031.mp3\tAlma Gluck\tListen To The Mocking Bird\tVICTOR\t74465\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1211.mp3\tBing Crosby & Harry Owens\tLittle Angel\tDECCA\t1845B\tDLA1211\t1938\t\nhttp://www.jazz-on-line.com/mp3/880737781.mp3\tEddy Arnold\tLittle Angel With The Dirty Face\tRCA\t21-0300\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17493-1.mp3\tCarter Family\tLittle Black Train\tARC\tVO3112z\t17493-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_070.mp3\tStan Freberg Feat. Daws Butler And June Foray (talking)\tLittle Blue Riding Hood\tCapitol\t2596\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_411.mp3\tBilly Vaughn And His Orchestra\tLittle Boy Blue\tDot\t15444\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN11657-1.mp3\tJoshua White\tLittle Brother Blues\tBANNER\t32631\t11657-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBAN32631.mp3\tJoshua White\tLittle Brother Blues\tBANNER\t32631\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU035732.mp3\tGlenn Miller And His Orchestra\tLittle Brown Jug\tBLUEBIRD\t10286\t035732\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiLes.mp3\tGlen Miller Et Son Orchestre\tLittle Brown Jug\tLes Triomphes Du Jaz\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon035732.mp3\tGlenn Miller & His Orch\tLittle Brown Jug\tMontgomeryWard\t7947\t035732\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCWC2781.mp3\tJohn Kirby & His Orchestra\tLittle Brown Jug\tVOCALION\t5570\tWC2781\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC85532.mp3\tGlenn Miller ''the Glenn Miller Story''\tLittle Brown Jug\tDECCA\t29015\t85532\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D482.mp3\tGlenn Miller Army Air Force Band\tLittle Brown Jug\tV-Disc\t482\t\t1944-\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_148.mp3\tGlenn Miller And His Orchestra\tLittle Brown Jug\tBLUEBIRD\t10286\t035732\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404942-B.mp3\tJoe Venuti's Blue Four\tLittle Buttercup\tOKeh\t41506\t404942-B\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE30545.mp3\tLouisiana Rhythm Kings\tLittle By Little\tVOCALION\t15841B\tE30545\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-30545.mp3\tLouisiana Rhythm Kings\tLittle By Little\tVocalion\t15841\tE-30545\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI5153-B.mp3\tBilly Murray - O\tLittle By Little And Bit By Bit (william Hargreaves)\tEDISON\tBA 3147\t5153-B\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_309.mp3\tEddie Albert And Sondra Lee\tLittle Child\tKapp\t134\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_343.mp3\tLael And Cab Calloway\tLittle Child\tABC-Paramount\t9671\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4884.mp3\tBill Monroe Bluegrass Boys\tLittle Community Church\tCOLUMBIA\t20488\tCCO4884\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA2171.mp3\tEddie Cantor W Jerry Joyce\tLittle Curly Hair In A High Chair\tCOLUMBIA\t35428\tLA2171\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048777.mp3\tFats Waller And His Rhythm\tLittle Curly Hair In A High Chair\tBLUEBIRD\t10698\t048777\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_236.mp3\tJimmy Dorsey And His Orchestra Feat. V/helen O'connell\tLittle Curly Hair In A High Chair\tDECCA\t3150A\t67583\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU45021-2.mp3\tCarter Family\tLittle Darling Pal Of Mine\tBLUEBIRD\t5301\t45021-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_166alt.mp3\tCarter Family\tLittle Darling Pal Of Mine\tVICTOR\t21638\t45021-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CONLA144-A.mp3\tBing Crosby\tLittle Dutch Mill\tCONQUEROR\t8369\tLA144-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA144-B.mp3\tJimmie  Grier  And  His  Orchestra\tLittle Dutch Mill\tColumbia\t\tLA144-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruLA144-A.mp3\tJimmie  Grier  And  His  Orchestra\tLittle Dutch Mill\tBrunswick\t6794\tLA144-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULA126.mp3\tGuy Lombardo & Royal Canadians\tLittle Dutch Mill (v3)\tBRUNSWICK\t6781\tLA126\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035035.mp3\tBunny Berigan & His Orch\tLittle Gate's Special\tVICTOR\t26338B\t035035\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151655-1.mp3\tJoe Venuti's Rhythm Boys\tLittle Girl\tCOLUMBIA\t2488 D\tW151655-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA2012.mp3\tOrrin Tucker And His Orchestra Vocal Chorus By Orrin Tucker\tLittle Girl\tCOLUMBIA\t35344\tLA 2012\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC69684-1.mp3\tEubie Blake And His Orchestra\tLittle Girl\tVICTOR\t22735\t69684-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_277.mp3\tMitchell Ayres And His Fashions In Music\tLittle Girl\tBluebird\t10627\t047026-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_323.mp3\tKing Cole Trio\tLittle Girl\tCapitol\t1034\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_056.mp3\tJoe Venuti And His Orchestra Feat. Harold Arlen\tLittle Girl\tColumbia\t2488\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_308.mp3\tMargaret Whiting\tLittle Girl Blue\tCapitol\t20116\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/VicD9VB-17.mp3\tLucky Millinder And His Orchestra\tLittle Girl Don't Cry\tVictor\t20-3351\tD9VB-17  \t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU96240.mp3\tOtto Virgial\tLittle Girl In Rome\tBLUEBIRD\t6213\t96240\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_310.mp3\tCleftones\tLittle Girl Of Mine\tGee\t1011\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc74921.mp3\tAndy Kirk And His Clouds Of Joy\tLittle Girl, Don't Cry\tVocalion\t55010\t74921\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93679-A.mp3\tRice Brothers Gang\tLittle Girl, I'm So Blue Without You\tDECCA\t6004B\tC93679-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S6071.mp3\tBob Wills And His Texas Playboys\tLittle Girl, Little Girl\tMGM\t11452\t51S6071\t1951\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic64412.mp3\tAlma Gluck\tLittle Grey Home In The West\tVictrola\t64412\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_041.mp3\tCharles Harrison\tLittle Grey Home In The West\tVICTOR\t17522\t14150-5\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071683.mp3\tAlvino Rey & His Orch\tLittle Hawk\tBLUEBIRD\t11476\t071683\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21441-1.mp3\tHorace Heidt's Musical Knights\tLittle Heaven Of The Seven Seas\tBRUNSWICK\t7946\t21441-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26414.mp3\tMildred Bailey\tLittle High Chairman\tCOLUMBIA\t35370\t26414\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2502-1.mp3\tGene Ammons & His Sextet\tLittle Irv\tMERCURY\t8145\t2502-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1046.mp3\tArtie Shaw And His Orchestra\tLittle Jazz\tRCA\t20-1668\tD5VB1046\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC72756.mp3\tRoy Eldridge And His Orchestra\tLittle Jazz Boogie\tDECCA\t23471\t72756\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404870-C.mp3\tLouis Armstrong & His Orch\tLittle Joe\tOKeh\t41501\t404870-C\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1860-1.mp3\tMildred Bailey & Her Orch\tLittle Joe\tVOCALION\t3553\tC1860-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC63259-A.mp3\tAndy Kirk's 12 Clouds Of Joy\tLittle Joe From Chicago\tDECCA\t25118\t63259-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63259-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tLittle Joe From Chicago\tDecca\t1710\t63259-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru71246-A.mp3\tLucky Millinder And His Orchestra\tLittle John Special\tBrunswick\t03406\t71246-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1287.mp3\tBing Crosby & E.dunstedter\tLittle Lady Make Believe\tDECCA\t3603B\tDLA1287\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU064925.mp3\tJohn Estes\tLittle Laura Blues\tBLUEBIRD\t8871\t064925\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59532-2.mp3\tJelly Roll Morton's Peppers\tLittle Lawrence\tVICTOR\t38135\t59532-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC39751-2.mp3\tCarter Family\tLittle Log Cabin By The Sea\tVICTOR\t21074\t39751-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC43147-1.mp3\tPaul Whiteman & His Orch\tLittle Log Cabin Of Dreams\tVICTOR\t21325\t43147-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC3514.mp3\tDick Justice\tLittle Lulie\tBRUNSWICK\t336\tC3514\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC060629.mp3\tTommy Dorsey And His Orch\tLittle Man With A Candy Cigar\tVICTOR\t27338\t060629\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29975.mp3\tGene Krupa & His Orch\tLittle Man With A Candy Cigar\tOKEH\t6143\t29975\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC82512.mp3\tIsham Jones And His Orch\tLittle Man You've Had A Busy Day\tVICTOR\t24633\t82512\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh129.mp3\tThe Bbc Dance Orchestra Dir. By Henry Hall\tLittle Man, You've Had A Busy Day (v Kitty Masters)\tColumbia\tCB-768\tCA-14558-1-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151850-3.mp3\tBen Selvin & His Orch\tLittle Mary Brown\tCOLUMBIA\t2554 D\tW151850-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC70295-2.mp3\tEddie Deas And His Boston Brownies\tLittle Mary Brown (everyone In Town Loves)\tVICTOR\t22844\t70295-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67920-A.mp3\tAndy Kirk & Clouds Of Joy\tLittle Miss\tDECCA\t3491B\t67920-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67920-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tLittle Miss\tDecca\t3491\t67920-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU27126.mp3\tVaughn Deleath\tLittle Mother\tBRUNSWICK\t3893\t27126\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_125.mp3\tVaughn Deleath\tLittle Mother\tBRUNSWICK\t3893\t27126\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_025.mp3\tJohn Mccormack\tLittle Mother Of Mine\tVICTOR\t64776\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150248-1.mp3\tTom Darby & Jimmie Tarlton\tLittle Ola\tCOLUMBIA\t15591 D\tW150248-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC61538-A.mp3\tAbe Lyman And His Orchestra Vocal By Sonny Schuyler\tLittle Old Lady\tDECCA\t1120\t61538-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_136.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. V/bob Goday\tLittle Old Lady\tBluebird\t6747B\t3859\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1182-1.mp3\tJimmy Mundy Swing Club 7\tLittle Old Lady From Baltimore (v M. Greene)\tVARSITY\t8136\tUS1182-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DECC91109.mp3\tRanch Boys\tLittle Old Sod Shanty On The Claim\tDECCA\t2643B\tC91109\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO33864.mp3\tFrankie Carle And His Orch\tLittle On The Lonely Side\tCOLUMBIA\t36760\tCO33864\t1944\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC48657-1.mp3\tCoon Sanders Nighthawk Orch\tLittle Oprhan Annie\tVICTOR\t21895\t48657-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_189.mp3\tCoon-sanders Orchestra\tLittle Orphan Annie\tVICTOR\t21895\t48657-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047637.mp3\tByron Parker Mountaineers\tLittle Pal\tBLUEBIRD\t8521\t047637\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC51603-2.mp3\tGene Austin\tLittle Pal\tVICTOR\t21952\t51603-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/BRULAE447.mp3\tAl Jolson W Orch\tLittle Pal\tBRUNSWICK\t4400\tLAE447\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_070.mp3\tGene Austin Feat. O/nat Shilkret\tLittle Pal\tVICTOR\t21952\t51603-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401847-C.mp3\tJoe Venuti & His Orch.\tLittle Pal (v S B)\tOKeh\t41263\t401847-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO45658.mp3\tCount Basie & His Orch.\tLittle Pony\tCOLUMBIA\t39406\tCO45658\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_222.mp3\tAl Jazzbo Collins\tLittle Red Riding Hood\tCapitol\t2773\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S3165.mp3\tSlim Gaillard; His Trio\tLittle Red Riding Woods\tMGM\t10599B\t47S3165\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/DOT1019x.mp3\tMargie Day And Griffin Bros.\tLittle Red Rooster\tDOT\t1019\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA225-A.mp3\tJoe Sullivan\tLittle Rock Getaway\tDECCA\t600A\tDLA225-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1423-1.mp3\tFrankie Trumbauer Orch\tLittle Rock Getaway\tVARSITY\t8236\tUS1423-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1019-A.mp3\tBob Crosby & His Orchestra\tLittle Rock Getaway\tDECCA\t1552\tDLA1019-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_154.mp3\tLes Paul\tLittle Rock Getaway\tCapitol\t1316\t6833\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS24016-2.mp3\tHorace Heidt And Musical Knights\tLittle Sir Echo\tCBS\tBR8309\t24016-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1743.mp3\tBing Crosby - J.s.trotter Orch\tLittle Sir Echo\tDECCA\t2385A\tDLA1743\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_056.mp3\tTommy Dorsey And His Orchestra Feat. V/jack Leonard\tLittle Skipper\tVICTOR\t26195\t034262\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC034262.mp3\tTommy Dorsey & His Orch\tLittle Skipper (v J L)\tVICTOR\t26195\t034262\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC80291.mp3\tElla Fitzgerald & Ink Spots\tLittle Small Town Girl\tDECCA\t27419\t80291\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_001.mp3\tKitty Kallen\tLittle Things Mean A Lot\tDECCA\t29037\t85626\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26059-A.mp3\tTeddy Wilson & His Orch\tLittle Things That Mean So Much\tCOLUMBIA\t35232\t26059-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL35232.mp3\tTeddy Wilson & His Orch\tLittle Things That Mean So Much\tCOLUMBIA\t35232\t26059-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Col26059-A.mp3\tTeddy Wilson And His Orchestra\tLittle Things That Mean So Much\tColumbia\t35232\t26059-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC77697-1.mp3\tCab Calloway & His Orchestra\tLittle Town Gal\tVICTOR\t24494\t77697-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic77697-4.mp3\tCab Calloway And His Cotton Club Orchestra\tLittle Town Gal\tVictor\t24494\t77697-4\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2944.mp3\tDinah Shore\tLittle White Lies\tCOLUMBIA\t38570\tHCO2944\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4524.mp3\tDick Haymes - Gordon Jenkins\tLittle White Lies\tDECCA\t24280\tL4524\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC63309-3.mp3\tWaring's Pennsylvanians\tLittle White Lies\tVICTOR\t22492\t63309-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150644-2.mp3\tTed Wallace & His Campus Boys\tLittle White Lies\tCOLUMBIA\t2254 D\tW150644-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65446.mp3\tChick Webb & His Orch\tLittle White Lies\tDECCA\t2556A\t65446\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC017469.mp3\tTommy Dorsey & His Orch\tLittle White Lies\tVICTOR\t27521\t017469\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULAE857.mp3\tEarl Burtnett & His Orch\tLittle White Lies\tBRUNSWICK\t4881\tLAE857\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR150651-2.mp3\tAnnette Hanshaw W Novelty Acc.\tLittle White Lies\tHARMONY\t1196-H\t150651-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1088.mp3\tVincent Lopez Orch\tLittle White Lies\tHit-Of-The-Week\t1088\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic22494.mp3\tWaring's Pennsylvanians\tLittle White Lies\tVictor\t22494\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_0707_01.mp3\tLee Morse And Her Bluegrass Boys\tLittle White Lies\tColumbia\t2248DA\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_088.mp3\tDinah Shore\tLittle White Lies\tCOLUMBIA\t38570\tHCO2944\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_037.mp3\tTed Wallace And His Campus Boys\tLittle White Lies\tCOLUMBIA\t2254 D\tW150644-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_048.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra\tLittle White Lies\tBRUNSWICK\t4881\tLAE857\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65446-A.mp3\tChick Webb And His Orchestra\tLittle White Lies\tDecca\t2556\t65446-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-22811-1.mp3\tHarry James And His Orchestra\tLittle White Lies\tBrunswick\t8178\tB-22811-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh136.mp3\tJack Hylton And His Orchestra\tLittle White Lies (v Pat Omalley)\tHMV\tB-5887\tBb-19955-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-6107.mp3\tJimmie Noone's Apex Club Orchestra\tLittle White Lies ? V E P\tVocalion\t1531\tC-6107\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-2999-A.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tLittle Willie Blues\tBrunswick\t7058\tC-2999-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCMEM86.mp3\tSwift Jewel Cowboys\tLittle Willie Green\tVOCALION\t5188\tMEM86\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS3441.mp3\tCharlie Parker\tLittle Willie Leaps\tSAVOY\t305\tS3441\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS3441-2.mp3\tMiles Davis\tLittle Willie Leaps\tSAVOY\t4507\tS3441-2\t\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS3441-3.mp3\tMiles Davis\tLittle Willie Leaps\tSAVOY\t977\tS3441-3\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI4M-12066.mp3\tBilly Williams - O\tLittle Willie's Wild Woodbines (m + W: Robert P. Weston & Fred J. Barnes)\tEDISON\tA 12066\t4M-12066\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC79157-2.mp3\tDuke Ellington & His Orch\tLive And Love Tonight\tVICTOR\t24617\t79157-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Col24512-1.mp3\tBasie's Bad Boys\tLive And Love Tonight\tColumbia\tCG 31224\t24512-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Col24512-1.mp3\tBasie's Bad Boys\tLive And Love Tonight\tColumbia\tCG 31224  \t24512-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_312.mp3\tBill Haley And His Comets\tLive It Up\tEssex\t332\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053795.mp3\tFats Waller And His Rhythm\tLiver Lip Jones\tBLUEBIRD\t11010\t053795\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18255l.mp3\tOriginal Dixieland Jazz Band\tLivery Stable Blues\tVICTOR\t18255\t19331-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043378-2.mp3\tMuggsy Spanier Ragtime Band\tLivery Stable Blues\tBLUEBIRD\t10518\t043378-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144064-3.mp3\tFletcher Henderson's Orch\tLivery Stable Blues\tCOLUMBIA\t1002 D\tW144064-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC19331-1.mp3\tOriginal Dixieland Jazz Band\tLivery Stable Blues\tVICTOR\t18255\t19331-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC026871-1.mp3\tBunny Berigan & His Orch\tLivery Stable Blues\tVICTOR\t26068A\t026871-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_046.mp3\tOriginal Dixieland Jazz Band\tLivery Stable Blues\tVICTOR\t18255\t19331-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_091.mp3\tW.c. Handy's Orchestra\tLivery Stable Blues\tCOLUMBIA\tA-2419\t77377-1\t1918\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC62201-2.mp3\tBernie Cummins New Yorker Orch\tLivin' In The Sunlight, Lovin' In The Moonlight\tVICTOR\t22409B\t62201-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol2171-D.mp3\tPaul Whiteman & His Orchestra\tLivin' In The Sunlight, Lovin' In The Moonlight\tColumbia\t2171-D\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW149824-4.mp3\tPaul Whiteman And His Orchestra (vocal Bing Crosby)\tLivin' In The Sunlight, Lovin' In The Moonlight\tColumbia\tE CB117\tW149824-4\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_209.mp3\tBernie Cummins And His Orchestra\tLivin' In The Sunlight, Lovin' In The Moonlight\tVICTOR\t22409B\t62201-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61249-A.mp3\tJimmie Lunceford And His Orchestra\tLiving From Day To Day\tDecca\t960\t61249-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61249-A.mp3\tJimmie Lunceford And His Orchestra\tLiving From Day To Day.mp3\tDecca\t960\t61249-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe73687-B.mp3\tClarence Williams Blue Five\tLiving High (v E T)\tOKeh\t8272B\t73687-B\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC568-1.mp3\tHal Kemp And His Orch\tLiving In Doubt\tBRUNSWICK\t6574\tC568-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3329.mp3\tDon Byas Quartette\tLiving My Life For You\tSAVOY\t640B\tS3329\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/CON9006.mp3\tLeonard Feather Allstars\tLiving Room Romp\tCONTIN\tT6006\t9006\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COL25738-1.mp3\tTeddy Wilson And His Orch\tLiza\tCOLUMBIA\t35711\t25738-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM50S3154.mp3\tDavid Rose And His Orch\tLiza\tMGM\t30291\t50S3154\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D253L.mp3\tGene Krupa Trio\tLiza\tV-DISC\t253\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL38.mp3\tBenny Morton's Trombone Choir\tLiza\tKEYNOTE\t1309\tHL38\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38728.mp3\tFletcher Henderson & His Orch\tLiza\tDECCA\t555A\t38728\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4445.mp3\tAl Jolson - Morris Stoloff\tLiza\tDECCA\t24109\tL4445\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC09634-3.mp3\tBenny Goodman Qt\tLiza\tVICTOR\t25660\t09634-3\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS152753-1.mp3\tTeddy Wilson (piano)\tLiza\tCBS\t66370\t152753-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC1854.mp3\tRed Norvo And His Orch\tLiza (all The Cloud's Roll Away)\tBRUNSWICK\t7868\tC1854\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC38728-A.mp3\tFletcher Henderson And His Orchestra\tLiza (all The Clouds 'll Roll Away)\tDECCA\t555\t38728-A  \t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63708.mp3\tChick Webb And His Orchestra\tLiza (all The Clouds'll Roll Away)\tDECCA\t1840B\t63708\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDR-10029-1.mp3\tThe Quintet Of The Hot Club Of France (with Django Reinhardt)\tLiza (all The Clouds'll Roll Away)\tDECCA\tF8876\tDR-10029-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB-18131-1.mp3\tTeddy Wilson And His Orchestra\tLiza (all The Clouds'll Roll Away)\tBRUNSWICK\t7563\tB-18131-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke26069-A.mp3\tJimmie Lunceford And His Orchestra\tLiza (all The Clouds'll Roll Away)\tOkeh\t5276\t26069-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148737-3.mp3\tIpana Troubadors (s.lanin)\tLiza (vsb)\tCOLUMBIA\t1903 D\tW148737-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62921-1.mp3\tBennie Moten Kansas City Orch\tLiza Lee\tVICTOR\t23023\t62921-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC71928-1.mp3\tCoon-sanders Orchestra\tLo And Behold\tVICTOR\t22951\t71928-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19720.mp3\tSix Jumping Jacks\tLo-do-dee-o\tBRUNSWICK\t3252\t19720\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC62183-1.mp3\tJelly Roll Morton Red Peppers\tLoad Of Coal\tVICTOR\t23429\t62183-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5867.mp3\tKai's Krazy Kats\tLoaded\tSAVOY\t602\tS5867\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP4105-2.mp3\tBlue Lu Barker\tLoan Me Your Husband\tCAPITOL\t\t4105-2\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP5566.mp3\tBenny Goodman And His Orchestra\tLoch Lomond\tCOLUMBIA\t39285\tZSP5566\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COL21472-1.mp3\tMaxine Sullivan & Her Orch\tLoch Lomond\tCOLUMBIA\t37818\t21472-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69364.mp3\tMaxine Sullivan\tLoch Lomond\tDECCA\t3954A\t69364\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23590LL.mp3\tEddie Heywood\tLoch Lomond\tDECCA\t23590\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62802.mp3\tWoody Herman & His Orchestra\tLoch Lomond\tDECCA\t1570\t62802\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21472-1.mp3\tMaxine Sullivan And Her Orchestra\tLoch Lomond\tVocalion\t3654\t21472-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/TedP-23311-3.mp3\tTeddy Wilson And His Orchestra\tLoch Lomond\tTeddy Wilson School \t\tP-23311-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480717.mp3\tBenny Goodman And His Orchestra\tLoch Lomond\tColumbia\tSL 160\t\t1938\tCarnegie Hall Concert:<br>Harry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Hymie Schertzer, George Koenig (as), Arthur Rollini, Babe Russin (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm), Martha Tilton (vo)\nhttp://www.jazz-on-line.com/a/mp3w/1938_217.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tLoch Lomond\tVICTOR\t25717\t017041\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143736-3.mp3\tBessie Smith\tLock And Key Blues\tCOLUMBIA\t14232 D\tW143736-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23311-3.mp3\tTeddy Wilson School For Piano\tLock Lomond\tCBS\t(Reject)\t23311-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CON17900-1.mp3\tBlind Boy Fuller\tLog Cabin Blues\tCONQUEROR\t8846\t17900-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400621-B.mp3\tClarence Williams Washboard 5\tLog Cabin Blues\tOKeh\t8572\t400621-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_360.mp3\tMuir Mathieson And Orchestra\tLola's Theme\tColumbia\t40725\tCO56330\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_403.mp3\tSteve Allen\tLola's Theme\tCoral\t61681\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5387.mp3\tWynonie Harris & Orch\tLollipop Mama\tKING\t4226A\tK5387\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36842-3.mp3\tHarry Reser\tLolly Pops\tVICTOR\t20439B\t36842-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/Col81302-5.mp3\tKing Oliver's Jazz Band\tLondon (cafe) Blues\tColumbia\t14003-D\t81302-5\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/GENG11550.mp3\tNew Orlean Rhythm Kings\tLondon Blues\tGENNETT\t5221\tG11550\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64472-A.mp3\tCount Basie And His Orchestra\tLondon Bridge Is Fallin' Down\tDECCA\t2004B\t64472-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS59049.mp3\tDon Byas Qt\tLondon Donnie (danny Boy)\tSAVOY\t628A\tS59049\t1946\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480865.mp3\tTed Heath And His Music\tLondon Fog\tDECCA-LONDON\t1026\tDR-13090\t1949\tKenny Baker, Stan Reynolds, Stan Roderick, Dave Wilkins (tp) Jackie Armstrong, Maurice Pratt, Jack Bentley, Jimmy Coombes (tb) Les Gilbert, Reg Owen (as) Johnny Gray, Tommy Whittle (ts) Bob Burns (bar) Norman Stenfalt (p) Dave Goldberg (g) Charlie Short (b) Jack Parnell (d) Ted Heath (dir) \nhttp://www.jazz-on-line.com/a/mp3c/DECGB6818.mp3\tAmbrose & His Orchestra\tLondon On A Rainy Night\tDECCA\t360A\tGB6818\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_274.mp3\tAmbrose And His Orchestra\tLondon On A Rainy Night\tDECCA\t360A\tGB6818\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECTB2442.mp3\tMills Brothers\tLondon Rhythm\tDECCA\t1082\tTB2442\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D204A.mp3\tAaftac Symphonette\tLondonderry Air\tV-DISC\t204A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2252.mp3\tBing Crosby & J.s.trotter\tLone Star Trail\tDECCA\t3584B\tDLA2252\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU14354.mp3\tGene Rodemich And His Orchestra\tLonely And Blue\tBRUNSWICK\t2775\t14354\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3w/HAR142901-2.mp3\tUniversity Six\tLonely Eyes\tHARMONY\t296-H\t142901-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO41761.mp3\tSarah Vaughan\tLonely Girl\tCOLUMBIA\t38617\tCO41761\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU7660.mp3\tSmoky Woods\tLonely Heart Of Mine\tBLUEBIRD\t7660\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC30367-8.mp3\tPaul Whiteman & His Orch\tLonely Little Melody\tVICTOR\t19414\t30367-8\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_250.mp3\tMindy Carson Feat. O/norman Leyden\tLonely Little Robin\tRCA VICTOR\t4151\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41295-1.mp3\tPaul Whiteman & His Orch\tLonely Melody\tVICTOR\t21214B\t41295-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS5027LM.mp3\tMary Lou Williams\tLonely Moment\tDISC\t5027\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_1100_02.mp3\tLee Morse\tLonely Nights\tPathe\t25201B\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC56104-3.mp3\tRudy Vallee Connecticut Yankee\tLonely Troubador\tVICTOR\t22136B\t56104-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_045.mp3\tTed Lewis And His Band\tLonely Troubador\tCOLUMBIA\t1957\tW148936-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_024.mp3\tRudy Vallee And His Connecticut Yankees\tLonely Troubador\tVICTOR\t22136B\t56104-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82329.mp3\tColeman Hawkins & His Orch\tLonely Wine\tDECCA\t28216\t82329\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_224.mp3\tLes Baxter And His Orchestra\tLonely Wine\tCapitol\t2106\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_293.mp3\tStan Kenton And His Orchestra\tLonely Woman\tCapitol\t10125\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19285.mp3\tBrooke Johns & His Orchestra\tLonesome\tVictor\t19285\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_061alt.mp3\tByron G. Harlan\tLonesome\tEDISON\t10219\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79163-1.mp3\tBert Williams\tLonesome Alimony Blues\tCOLUMBIA\tA-2979\t79163-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC34799-1.mp3\tJean Goldkette & His Orch\tLonesome And Sorry\tVICTOR\t20031B\t34799-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC17178-1.mp3\tVic Berton And His Orchestra\tLonesome And Sorry\tVOCALION\t2944\t17178-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0300_03.mp3\tLee Morse\tLonesome And Sorry\tPerfect\t11618A\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_173.mp3\tJean Goldkette And His Orchestra\tLonesome And Sorry\tVICTOR\t20031B\t34799-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/CONC2004-1.mp3\tCurtis Jones\tLonesome Bedroom Blues\tCONQUEROR\t9030\tC2004-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/OKECCO5268.mp3\tBig Three Trio\tLonesome Blues\tOKEH\t6807\tCCO5268\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe17343.mp3\tLouis Armstrong & His Hot 5\tLonesome Blues\tOKeh\t41581\t17343\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99432.mp3\tTune Wranglers\tLonesome Blues\tBLUEBIRD\t6513\t99432\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141370-3.mp3\tBessie Smith\tLonesome Desert Blues\tCOLUMBIA\t14123 D\tW141370-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0606_04.mp3\tLee Morse And Her Bluegrass Boys\tLonesome For You\tColumbia\t1434DB\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEWC3356.mp3\tCarter Family\tLonesome For You Darling\tOKEH\t5843\tWC3356\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69359-A.mp3\tArt Tatum\tLonesome Graveyard\tDECCA\t8563A\t69359-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLH1213-2.mp3\tTed Daffan's Texans\tLonesome Highway\tCOLUMBIA\t20358\tH1213-2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3l/VOC8697.mp3\tLeo Reisman Orch\tLonesome Hours\tVOCALION\t14314B\t8697\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145205-2.mp3\tDarby & Tarlton\tLonesome In The Pines\tCOLUMBIA\t15684 D\tW145205-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU77254-1.mp3\tDelmore Brothers\tLonesome Jailhouse Blues\tBLUEBIRD\t5741\t77254-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/AJA31023-2.mp3\tFletcher Henderson Sawin' Six\tLonesome Journey Blues\tAJAX\tAJX17016\t31023-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/OKeS71531.mp3\tThomas Morris\tLonesome Journey Blues\tOKeh\t4867\tS71531\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC7116.mp3\tIsham Jones & His Orch\tLonesome Lover\tBRUNSWICK\t6015\tC7116\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1127.mp3\tVincent Lopez Orch\tLonesome Lover\tHit-Of-The-Week\t1127\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC67750-1.mp3\tBert Lown Biltmore Hotel Orch\tLonesome Lover (b S)\tVICTOR\t22602A\t67750-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC53.mp3\tBilly Eckstine & His Orch\tLonesome Lover Blues\tNATIONAL\t\tNSC53\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_484.mp3\tFontane Sisters\tLonesome Lover Blues\tDot\t15480\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe9459.mp3\tBlanche Calloway\tLonesome Lovesick Blues\tOKeh\t8279\t9459\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL743.mp3\tHi-flyers\tLonesome Mama Blues\tVOCALION\t5346\tDAL743\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_069.mp3\tMamie Smith And Her Jazz Hounds\tLonesome Mama Blues\tOKeh\t4630\tS70654-B\t1922\t\nhttp://www.jazz-on-line.com/a/mp3d/CBSWC-2594-C.mp3\tCount Basie And His Orchestra\tLonesome Miss Pretty\tCBS\tCL-1036\tWC-2594-C  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe265161-1.mp3\tBenny Carter & His Orch\tLonesome Nights\tOKeh\t41567\t265161-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28518-1.mp3\tCab Calloway & His Orchestra\tLonesome Nights\tOKEH\t5827\t28518-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/REG9763-B.mp3\tBilly Burton\tLonesome Pal\tRegal\t9763-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147361-2.mp3\tTom Darby & Jimmie Tarlton\tLonesome Railroad\tCOLUMBIA\t15375 D\tW147361-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/CBSW24761.mp3\tJames P Johnson\tLonesome Reverie\tCBS\t(Reject)\tW24761\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU045745-2.mp3\tMugsy Spanier Ragtime Band\tLonesome Road\tBLUEBIRD\t10766A\t045745-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_099.mp3\tGene Austin\tLonesome Road\tVICTOR\t21098\t39188-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOEA6390-1.mp3\tFats Waller (organ)\tLonesome Road (v A. Hall)\tVICTOR\t27459\tOEA6390-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC036842-1.mp3\tTommy Dorsey & His Orch\tLonesome Road - Part 2\tVICTOR\t26508\t036842-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE80755.mp3\tWilliamson Bros & Curry\tLonesome Road Blues\tOKEH\t45146\t80755\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL555.mp3\tLee O'daniel Hillbilly Boys\tLonesome Road Blues\tVOCALION\t4311\tDAL555\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146871-1.mp3\tEthel Waters\tLonesome Swallow\tCOLUMBIA\t14411 D\tW146871-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COL30924.mp3\tHank Penny's Radio Cowboys\tLonesome Train Blues\tCOLUMBIA\t20265\t30924\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_175.mp3\tCarter Family\tLonesome Valley\tVictor\t23541\t64705-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU77222.mp3\tDelmore Brothers\tLonesome Yodel Blues\tBLUEBIRD\t5299\t77222\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43233.mp3\tUna Mae Carlisle\tLong\tCOLUMBIA\t38881\tCO43233\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DECTB2445.mp3\tMills Brothers\tLong About Midnight\tDECCA\t1360\tTB2445\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC81088-1.mp3\tCab Calloway & His Orchestra\tLong About Midnight\tVICTOR\t24592\t81088-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC89818.mp3\tWillie Bryant & His Orch\tLong About Midnight\tVICTOR\t25045\t89818\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC20219.mp3\tMildred Bailey & Her Orchestra\tLong About Midnight\tVOCALION\t3378\t20219\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16025-A.mp3\tLouis Prima And His Gang\tLong About Midnight\tBRUNSWICK\t7335\t16025-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-16025-A.mp3\tLouis Prima And His New Orleans Gang\tLong About Midnight\tBrunswick\t7335\tB-16025-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/ARCB14851-A.mp3\tFrankie Trumbauer & His Orch\tLong About Midnight (vjt)\tARC\tBR6788\tB14851-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC8758.mp3\tHal Kemp & His Orch\tLong About Sundown\tBRUNSWICK\t6419\tC8758\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23317x.mp3\tHelen Forrest And Dick Haymes\tLong Ago\tDECCA\t23317\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1569x.mp3\tPerry Como\tLong Ago\tRCA\t20-1569\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3409.mp3\tBing Crosby\tLong Ago\tDECCA\t18608\tL3409\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_152.mp3\tThree Suns\tLong Ago (and Far Away)\tHit\t7085\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_075.mp3\tPerry Como\tLong Ago (and Far Away)\tVICTOR\t1569\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_022.mp3\tHelen Forrest And Dick Haymes Feat. Camarata's Orchestra\tLong Ago (and Far Away)\tDECCA\t23317\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU101647.mp3\tCharlie Barnet & His Orchestra\tLong Ago And Far Away\tBLUEBIRD\t6432\t101647\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44026.mp3\tErroll Garner Trio\tLong Ago And Far Away\tCOLUMBIA\t39166\tCO44026\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101845-2.mp3\tTommy Dorsey & His Orch\tLong Ago And Far Away\tVICTOR\t25335\t101845-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5480.mp3\tTeddy Wilson\tLong Ago And Far Away\tMUSICRAFT\t372\t5480\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D166B2.mp3\tFrank Sinatra\tLong Ago And Far Away\tV-DISC\t166B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_291.mp3\tBen Bernie And His Orchestra With Ray Hendricks\tLong Ago And Far Away\tDECCA\t874B\tDLA432\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/DECEFF707-1C-1.mp3\tTed Heath And His Music\tLong Ago And Far Away\tDECCA-LONDON\tEFF.707-1C-1 (BEP 62\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480866.mp3\tTed Heath And His Music\tLong Ago And Far Away\tDECCA-LONDON\tEFF.707-1C-1\t\t1954\tBobby Pratt, Duncan Campbell, Eddie Blair, Bert Ezard (tp) Don Lusher, Jimmy Coombes, Ric Kennedy, Maurice Pratt (tb) Les Gilbert, Roy Willox (as) Henry Mackenzie (ts,cl) Danny Moss (ts) George Hunter (bar) Frank Horrox (p) Johnny Hawksworth (b) Ronnie Verrell (d) Ted Heath (dir)\nhttp://www.jazz-on-line.com/a/mp3a/PARP2243.mp3\tIda Cox\tLong Distance Blues\tPARAMOUNT\t12307A\tP2243\t1925\t\nhttp://www.jazz-on-line.com/mp3/748991250.mp3\tBlind Lemon Jefferson\tLong Distance Moan\tPARAMOUNT\t12852B\tG15668!\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO82y.mp3\tBob Scobey's Frisco Band\tLong Gone\tGood Time Jazz\t82\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24249-1.mp3\tBillie Holiday\tLong Gone Blues\tCBS\tCO37586\t24249-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16096.mp3\tAllen Bros\tLong Gone From Bowling Green\tARC\tVO2817z\t16096\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM50S6003.mp3\tHank Williams\tLong Gone Lonesome Blues\tMGM\t10645A\t50S6003\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLH661.mp3\tTed Daffan's Texans\tLong John\tCOLUMBIA\t20358\tH661\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63689-A.mp3\tJimmy Dorsey & His Orch.\tLong John Silver\tDECCA\t3334A\t63689-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-970-1.mp3\tCab Calloway And His Orchestra\tLong Long Ago\tVocalion\t4905\tM-970-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BlaBW54.mp3\tEtta Jones Acc By Barney Bigard And His Orchestra\tLong Long Journey\tBlack & White\t\tBW54\t1944\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81018-3.mp3\tThe Georgians\tLong Lost Mamma\tColumbia\tA-3907\t81018-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN11617-1.mp3\tBig Bill (broonzy)\tLong Tall Mama\tBANNER\t33085\t11617-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC068070.mp3\tGlenn Miller & His Orch\tLong Tall Mama\tVICTOR\t27943\t068070\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC58969.mp3\tJimmie Rodgers\tLong Tall Mama Blues\tVICTOR\t23766\t58969\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_047.mp3\tLittle Richard\tLong Tall Sally\tSpecialty\t572 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_059.mp3\tPat Boone\tLong Tall Sally\tDot\t15457\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/PARL0399.mp3\tLouise Johnson\tLong Way From Home\tPARAMOUNT\t12992B\tL0399\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68799.mp3\tLouis Armstrong & His Orch.\tLong, Long Ago\tDECCA\t3700A\t68799\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D304B.mp3\tBid Sayo, Soprano\tLong, Long Ago\tV-DISC\t304B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC72.mp3\tBilly Eckstine & His Orch\tLong, Long Journey\tNATIONAL\t\tNSC72\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/Sav5878.mp3\tDexter Gordon Quintette\tLong, Tall, Dexter\tSavoy\t603\t5878\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SUNSR1011.mp3\tJohnny Hodges & His Orchestra\tLonghorn Blues\tSUNSET\t2005\tSR1011\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1950_0519_03.mp3\tLee Morse\tLonging\tDecca\t27163A\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/MER4352-2.mp3\tVic Damone\tLonging For You\tMERCURY\t5655X\t4352-2\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_285.mp3\tTeresa Brewer Feat. Jack Pleis Orchestra\tLonging For You\tLONDON\t1086\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_054.mp3\tByron G. Harlan\tLonging For You\tCOLUMBIA\t3187\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37586-2.mp3\tJean Goldkette & His Orch\tLook At The World And Smile\tVICTOR\t20472\t37586-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_229.mp3\tJean Goldkette And His Orchestra\tLook At The World And Smile\tVICTOR\t20472\t37586-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC32128-4.mp3\tWaring's Pennsylvanians\tLook At Those Eyes\tVICTOR\t19648B\t32128-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150774.mp3\tCharlie Poole N.c.ramblers\tLook Before You Leap\tCOLUMBIA\t15601 D\tW150774\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79612-2.mp3\tMarion Harris\tLook For The Silver Lining\tCOLUMBIA\tA-3367\t79612-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_011.mp3\tMarion Harris\tLook For The Silver Lining\tCOLUMBIA\tA-3367\t79612-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/CONS3276.mp3\tCozy Cole & His Orchestra\tLook Here\tCONTIN\tT6000\tS3276\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe402008-B.mp3\tUncle Bud Walker\tLook Here Mama Blues\tOKeh\t8828\t402008-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_306.mp3\tFour Esquires\tLook Homeward Angel\tLondon\t1652\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE81867-B.mp3\tFred Hall & His Sugar Babies\tLook In The Mirror (v A F)\tOKEH\t40986\t81867-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26149.mp3\tSlim & Slam\tLook Out\tCBS\tVO5483\t26149\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24155LO.mp3\tLouis Jordan\tLook Out\tDECCA\t24155\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_236.mp3\tPerry Como With Hugo Winterhalter's Orchestra And Chorus\tLook Out The Window (and See How I'm Standing In The Rain)\tRCA Victor\t5647\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37548-2.mp3\tNat Shilkret & Victor Orch\tLook Up And Smile (vlj)\tVICTOR\t20456A\t37548-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN13253-1.mp3\tEd Lloyd Orchestra\tLook What I've Got\tBANNER\t32750\t13253-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4283.mp3\tLefty Frizzell\tLook What Thoughts Will Do\tCOLUMBIA\t20772\tHCO4283\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0800_04.mp3\tLee Morse\tLook What You Went And Done\tPathe\t25205B\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULAE643.mp3\tEarl Burtnett & His Orch\tLook What You've Done To Me\tBRUNSWICK\t4618\tLAE643\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_1018_01.mp3\tLee Morse And Her Bluegrass Boys\tLook What You've Done To Me\tColumbia\t2012DA\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_200.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra\tLook What You've Done To Me\tBRUNSWICK\t4605\tLAE644\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol2741-D.mp3\tClaude Hopkins & His Orchestra\tLook Who's Here\tColumbia\t2741-D\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152351.mp3\tClaude Hopkins & His Orch\tLook Who's Here\tCOLUMBIA\t2741 D\tW152351\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU16679-80.mp3\tPaul Ash And His Orchestra\tLook Who's Here\tBRUNSWICK\t2964\t16679-80\t1925\tPaul Ash violin, Directing 2 trumpets, trombone, 2 alto saxes, tenor sax, banjo, piano, brass bass, drums v Paul Small. New York, October 13th 1925\nhttp://www.jazz-on-line.com/a/mp3c/COLH662.mp3\tTed Daffan's Texans\tLook Who's Talkin'\tCOLUMBIA\t37033\tH662\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39374.mp3\tCasa Loma Orchestra\tLookie, Lookie Here Comes Cookie\tDECCA\t386A\t39374\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_097.mp3\tGlen Gray And Casa Loma Orchestra\tLookie, Lookie, Lookie, Here Comes Cookie\tDECCA\t386\t39374\t1935\tGrady Watts (tp), Sonny Dunham (tp, tb), Pee Wee Hunt (tb, vo), Billy Rauch, Fritz Hummel (tb), Glen Gray (as, ldr), Clarence Hutchinrider (cl, as), Art Ralston (as, ob, bsn), Kenny Sargent, Pat Davis (ts), Mel Jenssen (vn), Joe Hall (p), Jack Blanchette (g), Stanley Dennis (bb, sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3b/Joh009.mp3\tLew Stone And His Band\tLookie, Lookie, Lookie, Here Comes Cookie (v. Tiny Winters)\tRegal Zonophone\tMR-1673\tCAR-3345-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic57926-1.mp3\tFats Waller And His Buddies\tLookin' For Another Sweetie\tVictor\tV-38110\t57926-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144801-3.mp3\tBessie Smith\tLookin' For My Man Blues\tCOLUMBIA\t14569 D\tW144801-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/CON17868-1.mp3\tBlind Boy Fuller\tLookin' For My Woman\tCONQUEROR\t8562\t17868-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC56727-2.mp3\tFats Waller And His Buddies\tLookin' Good But Feelin' Bad\tVICTOR\t38086\t56727-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic56727-2..mp3\tThomas Waller And His Buddies\tLookin' Good But Feelin' Bad\tVictor\tV-38086\t56727-2.\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04202.mp3\tTommy Dorsey & His Orch\tLooking Around The Corners For You\tVICTOR\t25509\t04202\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142408.mp3\tPaul Ash And His Orchestra\tLooking At The World Thru Rose Colored Glasses\tCOLUMBIA\t694 D\tW142408\t1926\tJohn Valentine, John Linn, tp, Roscoe Lantz, trombone, Phil Wing & Herbert \"Putty\" Nettle,clarinet,al sax, Howard Grantham, cl, tn sax, Harry Barris, p, Paul Ash, vio, Julian Davidson,bj, Pierre Olker,br bass, Arthur Layfield, drums, v Milton Watson\nhttp://www.jazz-on-line.com/a/mp3a/BRUC5350.mp3\tBen Bernie And His Orch\tLooking At You\tBRUNSWICK\t4740\tC5350\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76823.mp3\tElla Fitzgerald\tLooking For A Boy\tDECCA\t27369\t76823\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/DeLD-172.mp3\tBenny Carter And His All Star Orchestra\tLooking For A Boy\tDe Luxe\t1009\tD-172\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_149.mp3\tArden-ohman Orchestra\tLooking For A Boy\tBRUNSWICK\t3035\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU69443-3.mp3\tJimmie Rodgers\tLooking For A New Mama\tBLUEBIRD\t5037\t69443-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3097.mp3\tHank Penny's Radio Cowboys\tLooking For Somebody To Love\tOKEH\t5957\tWC3097\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68054.mp3\tWoody Herman & His Orchestra\tLooking For Yesterday\tDECCA\t3397A\t68054\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE26954-A.mp3\tGene Krupa & His Orch\tLooking For Yesterday\tOKEH\t5747\t26954-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_232.mp3\tWoody Herman And His Orchestra\tLooking For Yesterday\tDECCA\t3397A\t68054\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB3182.mp3\tRay Noble & His Orch\tLooking On The Bright Side Of Life\tVICTOR\t24212\tOB3182\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC4093-1.mp3\tMemphis Minnie\tLooking The World Over\tOKEH\t6707\tC4093-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_012.mp3\tHenry Burr And Albert Campbell\tLookout Mountain\tVICTOR\t18295\t19605-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/MUSGM509K.mp3\tLeadbelly\tLooky Looky Yonder, Yallow Woman's Doorbell\tMUSICRAFT\t224\tGM509K\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64361.mp3\tAl Cooper & His Savoy Sultans\tLooney\tDECCA\t7549\t64361\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECC91551.mp3\tBob Crosby's Bobcats\tLoopin' The Loop\tDECCA\t2209A\tC91551\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_178.mp3\tBob Crosby And His Orchestra Feat. Eddie Miller And Irving Fazola\tLoopin' The Loop\tDECCA\t2209A\tC91551\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/BruC-4462-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tLoose Ankles\tBrunswick\t4803\tC-4462-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU9489.mp3\tCotton Pickers\tLoose Feet\tBRUNSWICK\t2382\t9489\t1922\t\nhttp://www.jazz-on-line.com/a/mp3l/Col80804-1.mp3\tThe Georgians\tLoose Feet\tColumbia\tA-3825\t80804-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC066921.mp3\tTommy Dorsey And His Orch\tLoose Lid Special\tVICTOR\t27526\t066921\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55428-2.mp3\tBennie Moten's Kansas City Or.\tLoose Like A Goose\tVICTOR\t38123\t55428-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA11095.mp3\tErroll Garner\tLoose Nut\tDIAL\t1041\t11095\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71825-A.mp3\tLionel Hampton And His Orchestra\tLoose Wig\tDecca\t18669\t71825-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB892.mp3\tCount Basie & His Orchestra\tLopin'\tRCA\t(VIC-LP)\tD7VB892\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14027-1.mp3\tBlind Willie (mctell)\tLord Have Mercy, If You Please\tARC\tVO2623z\t14027-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO32040-1.mp3\tCab Calloway & His Orch\tLordy\tCOLUMBIA\t36751\tCO32040-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D220A.mp3\tTommy Dorsey And His Orchestra\tLosers Weepers\tV-DISC\t220A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18765.mp3\tHal Kemp & His Orch\tLost\tBRUNSWICK\t7626\t18765\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80593.mp3\tAl Jolson\tLost - A Wonderful Girl\tCOLUMBIA\tA-3744\t80593\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021154-1.mp3\tFats Waller And His Rhythm\tLost And Found (vfw)\tVICTOR\t25812\t021154-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_220.mp3\tKing Cole Trio\tLost April\tCapitol\t15054\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S6032.mp3\tHank Williams\tLost Highway\tMGM\t30453\t49S6032\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC84242-1.mp3\tRudy Vallee And His Ct.yankees\tLost In A Fog\tVICTOR\t24721\t84242-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82233.mp3\tColeman Hawkins & His Orch\tLost In A Fog\tDECCA\t27999\t82233\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_056.mp3\tRudy Vallee And His Connecticut Yankees\tLost In A Fog\tVICTOR\t24721\t84242-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_224.mp3\tDorsey Brothers Orchestra Feat. V/bob Crosby\tLost In A Fog\tDECCA\t195A\t38705-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU15841-A.mp3\tLeo Reisman & His Orch\tLost In A Fog (vsally Singer)\tBRUNSWICK\t6980\t15841-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM54S3004.mp3\tBilly Eckstine\tLost In Loveliness\tMGM\t11694\t54S3004\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_328.mp3\tDolores Gray\tLost In Loveliness\tDECCA\t29109\t85880\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_228.mp3\tBilly Eckstine\tLost In Loveliness\tMGM\t11694\t54S3004\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM752-2.mp3\tDuke Ellington's Famous Orch\tLost In Meditation\tBRUNSWICK\t8083\tM752-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_247.mp3\tWayne King And His Orchestra\tLost In My Dreams\tVictor\t25416\t01192\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_369.mp3\tJaye P. Morgan\tLost In The Shuffle\tRCA\t6505\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_318.mp3\tLonnie Donegan And His Skiffle Group\tLost John\tMercury\t70872\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/SPE390x.mp3\tPercy Mayfield\tLost Love\tSPECIALTY\t390\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010649.mp3\tFats Waller And His Rhythm\tLost Love\tVICTOR\t25604\t010649\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC055228.mp3\tLionel Hampton & His Orch\tLost Love\tVICTOR\t27278\t055228\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic055228-1.mp3\tLionel Hampton And His Sextet\tLost Love\tVictor\t27278\t055228-1\t19401\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39725.mp3\tBob Howard & His Orchestra\tLost My Rhythm, Lost My Music, Lost My Man\tDECCA\t513B\t39725\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142149-4.mp3\tBessie Smith\tLost Your Head Blues\tCOLUMBIA\t14158 D\tW142149-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_055.mp3\tBessie Smith\tLost Your Head Blues\tCOLUMBIA\t14158 D\tW142149-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC12655.mp3\tFletcher Henderson & His Orch\tLot's O' Mama\tVOCALION\t14759A\t12655\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60854-A.mp3\tAndy Kirk & Clouds Of Joy\tLotta Sax Appeal\tDECCA\t3883A\t60854-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60854-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tLotta Sax Appeal\tDecca\t1046\t60854-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/VocKC-601.mp3\tJohn Williams And His Memphis Stompers With Andy Kirk\tLotta Sax Appeal\tVocalion\t1453\tKC-601\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK9054.mp3\tErroll Garner\tLotus Blues\tKING\t4477\tK9054\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO56619.mp3\tFrankie Laine\tLotus Land\tCOLUMBIA\t40780\tCO56619\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152435.mp3\tGeorge Olsen & His Orch\tLou'siana Lullaby\tCOLUMBIA\t2790 D\tW152435\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe72320-B.mp3\tPiron New Orleans Orch\tLou'siana Swing\tOKeh\t40189\t72320-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN8238-2.mp3\tFred Hall's Jazz Band\tLouder And Funnier\tBANNER\t6269\t8238-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC41369-3.mp3\tCoon-sanders Nighthawk Orch\tLouder And Funnier\tVICTOR\t38083\t41369-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73752.mp3\tAndy Kirk\tLouella\tDECCA\t23959\t73752\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73752.mp3\tAndy Kirk And His Orchestra\tLouella\tDecca\t23959\t73752\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401472-A.mp3\tMississippi John Hurt\tLouis Collins\tOKeh\t8724\t401472-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC50942-2.mp3\tMaurice Chevalier\tLouise\tVICTOR\t21918\t50942-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC030391.mp3\tBenny Goodman And His Orchestra\tLouise\tVICTOR\t26125\t030391\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148086-3.mp3\tPaul Whiteman & His Orch\tLouise\tCOLUMBIA\t1771 D\tW148086-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYHL32.mp3\tColeman Hawkins Sax Ens.\tLouise\tKEYNOTE\t1308\tHL32\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDR-2907-1.mp3\tDjango Reinhardt\tLouise\tDECCA\tF-6828\tDR-2907-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUDET-300.mp3\tDel Delbridge And His Capitol Theater Orchestra\tLouise\tBRUNSWICK\t4393\tDET-300\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR914-Hx.mp3\tJack Miller\tLouise\tHarmony\t914-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW148086.mp3\tBing Crosby W Whiteman Orch\tLouise\tCOLUMBIA\t38218\tW148086\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol1771-D.mp3\tPaul Whiteman & His Orchestra\tLouise\tColumbia\t1771-D\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D316B2.mp3\tPaul Weston And His Orchestra\tLouise\tV-DISC\t316B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC21918.mp3\tMaurice Chevalier\tLouise\tVICTOR\t21918\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_028.mp3\tMaurice Chevalier Feat. Leonard Joy (director)\tLouise\tVICTOR\t21918\t50942-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_178.mp3\tRuss Morgan\tLouise\tDecca\t18598\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480690.mp3\tBen Webster And Harry Edison\tLouise\tVerve\tEPV5046\t20574-15\t1957\tBen Webster, Ts, Harry Sweets Edison, T, Jimmy Rowles, P, Barney Kessel, G, Joe Mondragon, B, Larry Bunker, D, Woody Herman, Vocal\nhttp://www.jazz-on-line.com/a/mp3o/DECC90981.mp3\tJohnnie Temple\tLouise Louise Blues\tDECCA\t7244\tC90981\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC34061-2.mp3\tCoon-sanders Nighthawk Orch\tLouise You Tease\tVICTOR\t19958\t34061-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC63387.mp3\tBob Crosby & His Orch\tLouise, Louise\tDECCA\t2032B\t63387\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_339.mp3\tBob Crosby And His Orchestra Feat. Eddie Miller\tLouise, Louise\tDECCA\t2032B\t63387\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26658.mp3\tCount Basie And His Orch\tLouisiana\tCOLUMBIA\t35448\t26658\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/PARR-2768y.mp3\tCount Basie And His Orch\tLouisiana\tParlophone\tR-2768\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401139.mp3\tBix Beiderbecke & His Gang\tLouisiana\tOKeh\t41173\t401139\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26658.mp3\tCount Basie & His Orch\tLouisiana\tCBS\tCO35448\t26658\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC43667-1.mp3\tPaul Whiteman & His Orch\tLouisiana\tVICTOR\t21438\t43667-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE28360.mp3\tDuke Ellington & His Orch\tLouisiana\tBRUNSWICK\t4110\tE28360\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/GENGEX-1224.mp3\tVan And His Hotel Half Moon Orch.\tLouisiana\tGENNETT\t6472\tGEX-1224\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146898-3.mp3\tJan Garber & His Orch\tLouisiana (v3)\tCOLUMBIA\t1615 D\tW146898-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/HAR149796.mp3\tGeorgia Cotton Pickers\tLouisiana Bobo\tHARMONY\t1127-H\t149796\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88776.mp3\tFats Waller And His Rhythm\tLouisiana Fairy Tale\tVICTOR\t24898\t88776\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic88776-1.mp3\t\"fats Waller And His Rhythm\tLouisiana Fairy Tale\tVictor\t24898\t88776-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP2138-1.mp3\tMa Gertrude Rainey\tLouisiana Hoodoo Blues\tPARAMOUNT\t12290\tP2138-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC18240-1.mp3\tBlanche Calloway And Her Joy Boys\tLouisiana Liza\tVOCALION\t3112\t18240-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81881-1.mp3\tBessie Smith\tLouisiana Low Down Blues\tCOLUMBIA\t14031 D\t81881-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_334.mp3\tRay Noble And His Orchestra\tLouisiana Purchase\tCOLUMBIA\t35507\t26843\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404047-A.mp3\tLuis Russell & His Orch\tLouisiana Swing\tOKeh\t8811\t404047-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64148.mp3\tElla Fitzgerald & Her Orch\tLouisville K.y\tDECCA\t3441A\t64148\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC76737-1.mp3\tIsham Jones & His Orch\tLouisville Lady (ves)\tVICTOR\t24366\t76737-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC81123.mp3\tLouis Jordan & His Trio\tLouisville Lodge Meeting\tDECCA\t27969\t81123\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC27849-4.mp3\tArthur Gibbs & His Gang\tLouisville Lou\tVICTOR\t19070\t27849-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80981-3.mp3\tTed Lewis & His Jazz Band\tLouisville Lou\tCOLUMBIA\tA-3892\t80981-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_075.mp3\tArthur Gibbs And His Gang\tLouisville Lou\tVICTOR\t19070\t27849-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_272.mp3\tElla Fitzgerald\tLouisville, K-y\tDECCA\t3441A\t64148\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC102020.mp3\tFats Waller And His Rhythm\tLounging At The Waldorf\tVICTOR\t25430\t102020\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic102020-1.mp3\t\"fats\" Waller And His Rhythm\tLounging At The Waldorf\tVictor\t25430\t102020-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26658-A.mp3\tCount Basie And His Orchestra\tLousiana\tColumbia\t291188\t26658-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC43145-1.mp3\tPaul Whiteman & His Orch\tLovable\tVICTOR\t27685\t43145-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402888-D.mp3\tAnnette Hanshaw\tLovable And Sweet\tOKeh\t41292\t402888-D\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-7834-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tLovable And Sweet\tParlophone\tF-657\tCE-7834-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/VOC9010.mp3\tLeo Reisman Orch\tLovable Eyes\tVOCALION\t14347B\t9010\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402963-C.mp3\tFrankie Trumbauer & His Orch\tLove Ain't Nothin' But The Blues (v S B)\tOKeh\t41301\t402963-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_474.mp3\tKay Starr\tLove Ain't Right\tRCA\t6541\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39617.mp3\tChick Webb & His Orchestra\tLove And Kisses\tDECCA\t494A\t39617\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW144332-2.mp3\tPaul Ash And His Orchestra\tLove And Kisses\tCOLUMBIA\t1090 D\tW144332-2\t1927\tDanny Polo, clarinet, alto & baritone saxes, replaces Wing or Nettles; Hank Winston, piano replaces Barris. Chicago, v Paul Small & Milton Watson, June 15th 1927\nhttp://www.jazz-on-line.com/a/mp3c/BRU20342-2.mp3\tArtie Shaw And His Orchestra\tLove And Learn\tBRUNSWICK\t7787\tB-20342-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_155.mp3\tEddy Duchin And His Orchestra\tLove And Learn\tVICTOR\t25472\t03221-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_036.mp3\tFrank Sinatra\tLove And Marriage\tCapitol\t3260\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_152.mp3\tDinah Shore\tLove And Marriage\tRCA Victor\t6266\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_306.mp3\tJo Stafford\tLove And The Weather\tCapitol\t443\t2075\t1947\t\nhttp://www.jazz-on-line.com/a/mp3l/COL79634.mp3\tLeo Reisman & His Orch\tLove Bird\tCOLUMBIA\tA-3366\t79634\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-3366.mp3\tLeo Reisman & His Orch\tLove Bird\tCOLUMBIA -\tA-3366\t79634\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_254.mp3\tClyde Mccoy And His Orchestra\tLove Can Do The Darndest Things\tDecca\t3581\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481510.mp3\tCharles Mingus Quintet\tLove Chant\tFantasy\t6009\t\t1955\tEddie Bert (tb), George Barrow (ts), Mal Waldron (p), Charles Mingus (sb), Willie Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3d/Bla10072j.mp3\tHenderson's  Dance Orchestra\tLove Days\tBlack Swan\t10072\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_278.mp3\tEddy Howard And His Orchestra\tLove Every Moment You Live\tMERCURY\t70176\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE35973.mp3\tLibby Holman And Orch\tLove For Sale\tBRUNSWICK\t6044\tE35973\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5636.mp3\tArtie Shaw And His Orchestra\tLove For Sale\tMUSICRAFT\t391\t5636\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP96.mp3\tBenny Carter & His Orchestra\tLove For Sale\tCAPITOL\t\t96\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA11096.mp3\tErroll Garner\tLove For Sale\tDIAL\t760\t11096\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38041.mp3\tSidney Bechet Qt\tLove For Sale\tCOLUMBIA\t38321\tCO38041\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap96-A.mp3\tBenny Carter And His Orchestra\tLove For Sale\tCapitol\t10038\t96-A\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/DIAD1096-A.mp3\tErroll Garner\tLove For Sale\tDIAL\t760\tD1096-A\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480538.mp3\tThe Art Tatum Trio\tLove For Sale\tPablo\t2310-735\t2673-2\t1956\tArt Tatum (p), Red Callender (sb), Jo Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480511.mp3\tArt Tatum And Buddy Rich & Lionel Hampton\tLove For Sale (concept I)\tPablo\t2310-775\t2377\t1955\tLionel Hampton (vib), Art Tatum (p), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480537.mp3\tArt Tatum And Buddy Rich & Lionel Hampton\tLove For Sale (concept Ii)\tPablo\t2310-775\t2377-2\t1955\tLionel Hampton (vib), Art Tatum (p), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1364-1.mp3\tJack Teagarden & His Orch\tLove For Sale (v K K)\tVARSITY\t8202\tUS1364-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU24931-A.mp3\tTeddy Wilson & His Orch\tLove Grown On The White Oak Tree\tBRUNSWICK\t8455\t24931-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65618.mp3\tThree Peppers\tLove Grows On The White Oak Tree\tDECCA\t2557A\t65618\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_250.mp3\tThree Peppers\tLove Grows On The White Oak Tree\tDECCA\t2557A\t65618\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24931-A.mp3\tTeddy Wilson And His Orchestra\tLove Grows On The White Oak Tree\tBrunswick\t8455\tB-24931-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038279.mp3\tCharlie Barnet & His Orch\tLove Grows On The White Oak Tree (v J. Ellington)\tBLUEBIRD\t10389\t038279\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_141.mp3\tGaylords\tLove I You (you I Love)\tMERCURY\t70350\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_424.mp3\tDoris Day\tLove In A Home\tColumbia\t40758\tRHCO33915\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BANLA182-A.mp3\tBing Crosby\tLove In Bloom\tBANNER\t33198\tLA182-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC83353-1.mp3\tPaul Whiteman & His Orch\tLove In Bloom\tVICTOR\t24672\t83353-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39321.mp3\tClaude Hopkins And His Orchestra\tLove In Bloom\tDECCA\t374B\t39321\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA182-B.mp3\tIrving Aaronson And His Commanders With Bing Crosby\tLove In Bloom\tColumbia\t\tLA182-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA182-A.mp3\tIrving Aaronson And His Commanders With Bing Crosby\tLove In Bloom\tColumbia\tD01284\tLA182-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26538-A.mp3\tGene Krupa & His Orch\tLove In My Heart\tCOLUMBIA\t35490\t26538-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUM881.mp3\tDuke Ellington's Famous Orch\tLove In Swingtime\tBRUNSWICK\t8200\tM881\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA339-A.mp3\tCleo Brown\tLove In The First Degree\tDECCA\t846A\tDLA339-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC68423-2.mp3\tGus Arnheim Coconut Grove Orch\tLove In The Moonlight\tVICTOR\t24235\t68423-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_101.mp3\tGus Arnheim And His Orchestra Feat. V/loyce Whiteman\tLove In The Moonlight\tVICTOR\t24235\t68423-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC68422-2.mp3\tGus Arnheim Coconut Grove Orch\tLove Is A Dream\tVICTOR\t24234\t68422-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_187.mp3\tGus Arnheim And His Orchestra\tLove Is A Dream\tVICTOR\t24234\t68422-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_005.mp3\tFour Aces Featuring Al Alberts\tLove Is A Many Splendored Thing\tDecca\t29625\t88334\t1955\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC88334.mp3\tThe Four Aces\tLove Is A Many Splendored Thing\tDECCA\t29625\t88334\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_241.mp3\tDon, Dick N' Jimmy\tLove Is A Many Splendored Thing\tCrown\t158\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_171.mp3\tDon Cornell\tLove Is A Many-splendored Thing\tCoral\t61467\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_219.mp3\tWoody Herman And His Orchestra\tLove Is A Many-splendored Thing\tAtco\t6052\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_195.mp3\tDavid Rose And His Orchestra\tLove Is A Many-splendored Thing\tMGM\t30883\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC010164.mp3\tBunny Berigan & His Orch\tLove Is A Merry Go Round\tVICTOR\t25588B\t010164\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS20678-1.mp3\tArtie Shaw And His Orchestra\tLove Is Good For Anything That Ails You\tCBS\tBR7841\tB-20678-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_377.mp3\tArtie Shaw And His Orchestra\tLove Is Good For Anything That Ails You\tCBS\tBR7841\tB-20678-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu43316.mp3\tArtie Shaw And His Orchestra\tLove Is Here\tBluebird\t10482\t043316-1\t1939\tVocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3b/Blu043316-1.mp3\tArtie Shaw And His Orchestra\tLove Is Here - V H F\tBluebird\tB-10482\t043316-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_284.mp3\tLarry Clinton And His Orchestra Feat. V/ Bea Wain\tLove Is Here To Stay\tVICTOR\t25761\t018107-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480569.mp3\tBen Webster And Harry Sweets Edison\tLove Is Here To Stay\tClef\tMGC717\t2983-1\t1956\tBen Webster, Ts, Harry Sweets Edison, T, Joe Mondragon, B, Alvin Stoller, D, Barney Kessel, G, Jimmy Rowles, P\nhttp://www.jazz-on-line.com/a/mp3b/BRU22325-1.mp3\tRed Norvo & His Orch\tLove Is Here To Stay (v M. Bailey)\tBRUNSWICK\t8068\t22325-1\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh179.mp3\tJack Harris And His Orchestra\tLove Is Here To Stay (v Sam Browne)\tHMV\tBD-5375\tOEA-6490-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/COM22306.mp3\tEddie Condon Windy City 7\tLove Is Just Around The Corner\tCOMMODORE\t500\t22306\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA72-A.mp3\tBing Crosby W George Stoll\tLove Is Just Around The Corner\tDECCA\t310B\tDLA72-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D328B2.mp3\tJo Stafford\tLove Is Just Around The Corner\tV-DISC\t328B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA72-B.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tLove Is Just Around The Corner\tDecca\t310\tDLA72-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA72-A.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tLove Is Just Around The Corner\tDecca\t310\tDLA72-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18738.mp3\tDuke Ellington's Orch\tLove Is Like A Cigarette\tBRUNSWICK\t7627\t18738\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-18738-1.mp3\tDuke Ellington And His Famous Orchestra\tLove Is Like A Cigarette\tBrunswick\t7627\tB-18738-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_110.mp3\tDuke Ellington And His Famous Orchestra/ivie Anderson\tLove Is Like A Cigarette\tBRUNSWICK\t7627\t18738\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5314.mp3\tWynonie Harris\tLove Is Like Rain\tKING\t4217\tK5314\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_065.mp3\tRuth Etting\tLove Is Like That\tCOLUMBIA\t2398 D\tW151204-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic87095.mp3\tEnrico Caruso\tLove Is Mine\tVictrola\t87095\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_008.mp3\tEnrico Caruso\tLove Is Mine\tVictor\t40000\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07897.mp3\tTommy Dorsey & His Orch\tLove Is Never Out Of Season\tVICTOR\t25591\t07897\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4457.mp3\tFrankie Laine\tLove Is Such A Cheat\tCOLUMBIA\t39599\tHCO4457\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19304-1.mp3\tCab Calloway & His Orch\tLove Is The Reason\tBRUNSWICK\t7677\t19304-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA11092.mp3\tErroll Garner\tLove Is The Strangest Game\tDIAL\t1041\t11092\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/DIAD1092-A.mp3\tErroll Garner\tLove Is The Strangest Game\tDIAL\t1041\tD1092-A\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB3196.mp3\tRay Noble & His Orch\tLove Is The Sweetest Thing\tVICTOR\t24333\tOB3196\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68916.mp3\tGuy Lombardo's Royal Canadians\tLove Is The Sweetest Thing\tDECCA\t3760B\t68916\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC611.mp3\tHal Kemp & His Orch\tLove Is The Sweetest Thing\tBRUNSWICK\t6636\tC611\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC13738-1-2.mp3\tDick Himber+essex House Orch\tLove Is The Sweetest Thing (vj.nash)\tARC\tVO2526\t13738-1-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13293-A.mp3\tEthel Waters W C.ventura Orch\tLove Is The Thing\tBRUNSWICK\t6564\t13293-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC122.mp3\tBilly Eckstine & His Orch\tLove Is The Thing\tNATIONAL\t\tNSC122\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67011-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tLove Is The Thing\tDecca\t2962\t67011-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Fut7005.mp3\tErroll Garner\tLove Is The Thing (part 1)\tFuturama\t3006\t7005\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC13737-1-2.mp3\tDick Himber+essex House Orch\tLove Is The Thing (vj.nash)\tARC\tVO2526\t13737-1-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23302-2.mp3\tMildred Bailey & Her Orchestra\tLove Is Where You Find It\tVOCALION\t4345\t23302-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29088-3.mp3\tCount Basie And His Orchestra\tLove Jumped Out\tOkeh\t5963\t29088-3\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3743.mp3\tDick Haymes - V.young\tLove Letters\tDECCA\t18699B\tL3743\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC70184-1.mp3\tTed Black And His Orch\tLove Letters In The Sand\tVICTOR\t22799A\t70184-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1931_0904_01.mp3\tLee Morse And Her Bluegrass Boys\tLove Letters In The Sand\tColumbia\t2530DA\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh083.mp3\tAmbrose And His Orchestra (vocal Sam Browne)\tLove Letters In The Sand\tHMV\tB-6110\tOB-2456-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE27615-1.mp3\tGene Krupa & His Orch\tLove Lies\tOKEH\t5686\t27615-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_118.mp3\tTommy Dorsey Orch V Frank Sinatra\tLove Lies\tVICTOR\t26678\t051875-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC051875-1.mp3\tTommy Dorsey And His Orch\tLove Lies (vfs)\tVICTOR\t26678\t051875-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_149.mp3\tAmbrose And His Orchestra\tLove Locked Out\tBRUNSWICK\t6755\t14655\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VICOB5134.mp3\tRay Noble & His Orch\tLove Locked Out\tVICTOR\t24485\tOB5134\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_267.mp3\tRay Noble And His Orchestra\tLove Locked Out\tVICTOR\t24485\tOB5134\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47475.mp3\tJohnnie Ray\tLove Me\tCOLUMBIA\t39837\tCO47475\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38391.mp3\tArt Tatum\tLove Me\tDECCA\t156A\t38391\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66050.mp3\tWoody Herman & His Orchestra\tLove Me\tDECCA\t2728B\t66050\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79696-2.mp3\tTed Lewis Jazz Band\tLove Me\tCOLUMBIA\tA-3411\t79696-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_0911_02.mp3\tLee Morse And Her Bluegrass Boys\tLove Me\tColumbia\t1972DB\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_043.mp3\tNat Shilkret And The Victor Orchestra\tLove Me\tVICTOR\t22152\t55693-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_227.mp3\tGlen Gray And Casa Loma Orchestra\tLove Me\tBRUNSWICK\t6791\t14924-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI10215.mp3\tErnie Golden And His Hotel Mcalpin Orchestra\tLove Me (just Like I Love You) Ft\tEDISON\t51512\t10215\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW149006.mp3\tPaul Whiteman & His Orch\tLove Me (v B C)\tCOLUMBIA\t1974 D\tW149006\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC066147.mp3\tArtie Shaw And His Orchestra\tLove Me A Little\tVICTOR\t27509\t066147-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO30731-1.mp3\tWill Bradley & His Orch\tLove Me A Little Little\tCOLUMBIA\t36231\tCO30731-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_213.mp3\tSunny Gale With Orchestra Conducted By Hugo Winterhalter\tLove Me Again\tRCA\t20-5424\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_006.mp3\tAlbert Campbell\tLove Me And The World Is Mine\tMONARCH\tV-4823\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_060.mp3\tHarry Anthony\tLove Me And The World Is Mine\tEDISON\t9371\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_004.mp3\tHenry Burr\tLove Me And The World Is Mine\tColumbia\t3499\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC065915.mp3\tTommy Dorsey & His Orch\tLove Me As I Am\tVICTOR\t27483\t065915\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30602-1.mp3\tGene Krupa & His Orch\tLove Me As I Am\tOKEH\t6255\t30602-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140167-5.mp3\tBessie Smith\tLove Me Daddy Blues\tCOLUMBIA\t14060 D\t140167-5\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_344.mp3\tJo Stafford\tLove Me Good\tColumbia\t40745\tRHCO33875\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COL41354x.mp3\tDoris Day\tLove Me In The Daytime\tCOLUMBIA\t41354\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW147711-2.mp3\tRuth Etting\tLove Me Or Leave Me\tCOLUMBIA\t1680 D\tW147711-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4727.mp3\tEddie Heywood\tLove Me Or Leave Me\tCOMMODORE\t577\t4727\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM54S3146.mp3\tBilly Eckstine\tLove Me Or Leave Me\tMGM\t11984\t54S3146\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22583.mp3\tKansas City 5\tLove Me Or Leave Me\tCBS\t(Reject)\t22583\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31004.mp3\tBillie Holiday\tLove Me Or Leave Me\tOKEH\t6369\t31004\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152651.mp3\tBenny Goodman And His Orchestra\tLove Me Or Leave Me\tCOLUMBIA\t2871 D\tW152651\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62573.mp3\tEdgar Hayes Quintet\tLove Me Or Leave Me\tDECCA\t1444\t62573\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP9512.mp3\tErroll Garner (piano)\tLove Me Or Leave Me\tCOLUMBIA\t39749\tZSP9512\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/Col24513-1.mp3\tBasie's Bad Boys\tLove Me Or Leave Me\tColumbia\tCG 31224\t24513-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_084.mp3\tSammy Davis Jr.\tLove Me Or Leave Me\tDecca\t29484\t87526\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic49495-3.mp3\tThomas Waller\tLove Me Or Leave Me\tVictor\t22092\t49495-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_016.mp3\tRuth Etting\tLove Me Or Leave Me\tCOLUMBIA\t1680 D\tW147711-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_146.mp3\tLena Horne\tLove Me Or Leave Me\tRCA Victor\t6073\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3d/Col24513-1.mp3\tBasie's Bad Boys\tLove Me Or Leave Me\tColuColumbiambLa\tCG 31224\t24513-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_239.mp3\tBenny Goodman And His Orchestra\tLove Me Or Leave Me\tCOLUMBIA\t2871 D\tW152651\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_009.mp3\tElvis Presley\tLove Me Tender\tRCA\tVictor 6643\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_255.mp3\tHenri Rene And His Orchestra And Chorus\tLove Me Tender\tRCA\t6728\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUA1.mp3\tAnson Weeks And His Music\tLove Me Tonight\tBRUNSWICK\t6341\tA1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUJC8640.mp3\tBing Crosby W Lennie Hayton\tLove Me Tonight\tBRUNSWICK\t6351\tJC8640\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB-12079-A-C.mp3\tEarl Hines And His Orch\tLove Me Tonight\tBRUNSWICK\t6403\tB-12079-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC73356.mp3\tGeorge Olsen & His Music\tLove Me Tonight (v P S)\tVICTOR\t24124B\t73356\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_151.mp3\tBobby Wayne\tLove Me, Love Me\tMERCURY\t70148\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC14746.mp3\tCharlie Patton\tLove My Stuff\tARC\tVO2782z\t14746\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D210B.mp3\tFrankie Carle\tLove Nest, Mean To Me, Girl Of My Dreams, My Heart Stood Still\tV-DISC\t210B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO25353.mp3\tBenny Goodman & His Orch\tLove Never Went To College\tCOLUMBIA\t35230\tCO25353\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5416-C.mp3\tArtie Shaw And His New Music\tLove Of My Life\tMUSICRAFT\t378\t5416-C\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68325.mp3\tWoody Herman & His Orchestra\tLove Of My Life\tDECCA\t3528B\t68325\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055095-1.mp3\tArtie Shaw And His Orchestra\tLove Of My Life\tVictor\t26790\t055095-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18873A.mp3\tGuy Lombardo & His Orch.\tLove On A Greyhound Bus\tDECCA\t18873A\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_276.mp3\tGuy Lombardo And His Royal Canadians\tLove On A Greyhound Bus\tDecca\t18873\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU9633.mp3\tCarl Fenton And His Orch\tLove Sends A Little Gift Of Roses\tBRUNSWICK\t2392\t9633\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_008.mp3\tCarl Fenton And His Orchestra\tLove Sends A Little Gift Of Roses\tBrunswick\t2392\t9633\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38402.mp3\tBuddy Clark And Doris Day\tLove Somebody\tCOLUMBIA\t38174\tCO38402\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_010.mp3\tDoris Day And Buddy Clark Feat. George Siravo's Orchestra\tLove Somebody\tCOLUMBIA\t38174\tCO38402\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_240.mp3\tHudson-delange Orchestra\tLove Song Of A Half-wit\tBrunswick\t7828\t20424\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu46044.mp3\tAbe Lyman And His Californians\tLove Song Of Reynaldo\tBluebird\t10572\t46044\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_073.mp3\tBen Bernie And His Orchestra\tLove Tales\tVOCALION\t14622A\t11624\t1923\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU10909.mp3\tGene Rodemich And His Orchestra\tLove Tales\tBRUNSWICK\t2454A\t10909\t1923\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3b/CAP5117-2.mp3\tBlue Lu Barker\tLove That Man\tCAPITOL\t\t5117-2\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA134.mp3\tBing Crosby\tLove Thy Neighbor\tBRUNSWICK\t6852\tLA134\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA134-B.mp3\tNat.  W.  Finston  And  His  Paramount  Orchestra\tLove Thy Neighbor\tColumbia\t\tLA134-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA134-A.mp3\tNat.  W.  Finston  And  His  Paramount  Orchestra\tLove Thy Neighbor\tColumbia\tDO1182\tLA134-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA134-C.mp3\tNat.  W.  Finston  And  His  Paramount  Orchestra\tLove Thy Neighbor -\tColumbia\t\tLA134-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75679.mp3\tArtie Shaw And His Orchestra\tLove Walked In\tDECCA\t27213\t75679\t1950\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC019806.mp3\tLeo Reisman's Orch\tLove Walked In\tVICTOR\t25790\t019806\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_347.mp3\tLouis Armstrong\tLove Walked In\tDECCA\t1842A\t63812\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_262.mp3\tKenny Baker Feat. Harry Sosnik Orchestra\tLove Walked In\tDECCA\t1795A\tDLA1273-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_113.mp3\tJimmy Dorsey And His Orchestra\tLove Walked In\tDecca\t1724\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_080.mp3\tBen Selvin And His Orchestra\tLove Will Find A Way\tBrunswick\t2144\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98391.mp3\tTommy Dorsey & His Clambake 7\tLove Will Live On\tVICTOR\t25214\t98391\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038141.mp3\tGlenn Miller & His Orch\tLove With A Capital U (vks)\tBLUEBIRD\t10383\t038141\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66048.mp3\tWoody Herman & His Orchestra\tLove With A Capital You\tDECCA\t2658B\t66048\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053740-1.mp3\tTommy Mcclennan\tLove With A Feeling\tBLUEBIRD\t8689\t053740-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S193.mp3\tLionel Hampton & His Orchestra\tLove You Like Mad\tMGM\t11176\t51S193\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-193.mp3\tLionel Hampton And His Orchestra\tLove You Like Mad\tMGM\t11176\t51-S-193\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44663.mp3\tDuke Ellington & His Orchestra\tLove You Madly\tCOLUMBIA\t39110\tCO44663\t1950\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-24517-1.mp3\tHarry James And His Orchestra\tLove's A Necessary Thing\tBrunswick\t8326\tB-24517-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC15175-7.mp3\tVenetian Trio\tLove's Dream After The Ball\tVICTOR\t17720\t15175-7\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_068.mp3\tVenetian Trio\tLove's Dream After The Ball\tVICTOR\t17720\t15175-7\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_026.mp3\tJohn Mccormack\tLove's Garden Of Roses\tVICTOR\t64787\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66955.mp3\tWoody Herman & His Orchestra\tLove's Got Me Down Again\tDECCA\t2933B\t66955\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VOCWM-1111-1.mp3\tBenny Carter And His Orchestra\tLove's Got Me Down Again\tVOCALION\t5224\tWM-1111-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDR-10026-2.mp3\tThe Quintet Of The Hot Club Of France (with Django Reinhardt)\tLove's Melody\tDECCA\tF8604\tDR-10026-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc16465-1.mp3\tMills Blue Rhythm Band\tLove's Serenade\tVocalion\t2867\t16465-1  \t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic78095-1.mp3\tMills Blue Rhythm Band\tLove's Serenade\tVictor\t24442\t78095-1  \t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_206.mp3\tDiamonds\tLove, Love, Love\tMercury\t70889\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_205.mp3\tClovers\tLove, Love, Love\tAtlantic\t1094\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_041.mp3\tLouis Armstrong\tLove, You Funny Thing\tCOLUMBIA\t2631 D\t405154\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe405154-B.mp3\tLouis Armstrong & His Orch\tLove, You Funny Thing!\tOKeh\t41557\t405154-B\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU11330-A.mp3\tBing Crosby\tLove, You Funny Thing!\tBRUNSWICK\t6268\t11330-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Col265093-2.mp3\tBenny Carter And His Orchestra\tLove, You're Not The One For Me \tColumbia \tCB-636\t265093-2 \t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/MER5547x.mp3\tTiny Hill And His Orchestra\tLovebug Itch\tMERCURY\t5547\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS28875-1.mp3\tBilly Holiday+b.carter Orch\tLoveless Love\tCBS\tCO30229\t28875-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN11710-A.mp3\tMills Brothers\tLoveless Love\tBANNER\t33213\t11710-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC68942-2.mp3\tBlanche Calloway & Her Orch\tLoveless Love\tVICTOR\t22659\t68942-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37359-3.mp3\tFats Waller At The Organ\tLoveless Love\tVICTOR\t23260\t37359-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/CROC1120-2.mp3\tJack Teagarden & His Orch\tLoveless Love (v J T)\tCROWN\t3051\tC1120-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66426.mp3\tRice Brothers Gang\tLovelight In The Starlight\tDECCA\t5763\t66426\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC021170.mp3\tBunny Berigan & His Orch\tLovelight In The Starlight\tVICTOR\t25816B\t021170\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_184.mp3\tBuddy Rogers And His Orchestra\tLovelight In The Starlight\tVocalion\t4058\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3230.mp3\tDorothy Lamour - D.mcintyre\tLovely Hula Hands\tDECCA\t23321\tL3230\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74967.mp3\tBuddy Johnson And His Orch\tLovely In Her Evening Gown\tDECCA\t24716\t74967\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98367.mp3\tTommy Dorsey & His Orch\tLovely Lady\tVICTOR\t25216\t98367\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA309.mp3\tBing Crosby & Victor Young\tLovely Lady\tDECCA\t756A\tDLA309\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh161.mp3\tCasani Club Orchestra Dir. By Charlie Kunz\tLovely Lady\tRex\t8801\tF-1868-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_168.mp3\tTommy Dorsey And His Orchestra Feat. Buddy Gately\tLovely Lady\tVICTOR\t25216\t98367\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_261.mp3\tManhattan Brothers And Miriam Makeba\tLovely Lies\tLondon\t1610\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_163.mp3\tFour Voices\tLovely One\tColumbia\t40643\tCO54394\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC83974.mp3\tEddy Duchin And His Orch\tLovely To Look At\tVICTOR\t24871\t83974\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17248-2.mp3\tIrene Dunne W Jack Shilkret\tLovely To Look At\tBRUNSWICK\t7420\t17248-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_005.mp3\tEddy Duchin And His Orchestra Feat. Lew Sherwood\tLovely To Look At\tVICTOR\t24871\t83974\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_278.mp3\tIrene Dunne Feat. O/nat Shilkret\tLovely To Look At\tBRUNSWICK\t7420\t17248-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15037x.mp3\tLes Paul\tLover\tCAPITOL\t15037\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC75712-1.mp3\tPaul Whiteman And His Orch\tLover\tVICTOR\t24283\t75712-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80358.mp3\tLouis Armstrong & His Orch\tLover\tDECCA\t28097\t80358\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/ARA1043-1.mp3\tArt Tatum\tLover\tARA\t4502\tARA1043-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/SAV8926L.mp3\tOscar Peterson\tLover\tSAVOY\t8926\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5285.mp3\tJoe Marsala Septet\tLover\tMUSICRAFT\t329\t5285\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44424.mp3\tErroll Garner Trio\tLover\tCOLUMBIA\t39100\tCO44424\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU13176.mp3\tGuy Lombardo Royal Canadians\tLover\tBRUNSWICK\t6535\t13176\t1933\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC82813.mp3\tPeggy Lee\tLover\tDECCA\t28215\t82813\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D334B2.mp3\tDavid Rose And His Orchestra\tLover\tV-DISC\t334B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_231.mp3\tLes Paul\tLover\tCapitol\t15037\t3207\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_166.mp3\tGreta Keller\tLover\tBRUNSWICK\t6544\t13170-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS22268-1.mp3\tMildred Bailey\tLover Come Back To Me\tCBS\tVO3982\t22268-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC47782-3.mp3\tVictor Arden-phil Ohman Orch\tLover Come Back To Me\tVICTOR\t21776\t47782-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1892.mp3\tWillie Lewis & Negro Band\tLover Come Back To Me\tVARSITY\tEL4070s\t1892\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/KEY655.mp3\tCozy Cole Allstars\tLover Come Back To Me\tKEYNOTE\t655\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89042LC.mp3\tStan Getz\tLover Come Back To Me\tMERCURY\t89042\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73688.mp3\tRoy Eldridge & His Orchestra\tLover Come Back To Me\tDECCA\t24119\t73688\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/COLCL-6717-1.mp3\tLarry Adler (with Django Reinhardt)\tLover Come Back To Me\tCOLUMBIA\tCL-6717-1\tCL-6717-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/CHE1456.mp3\tAl Hibbler\tLover Come Back To Me\tCHESS\tCHES1456\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62872-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tLover Come Back To Me\tDecca\t1663\t62872-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480477.mp3\tBen Webster Quintet\tLover Come Back To Me\tMGV\t8274\t21740-4\t1957\tBen Webster (ts), Oscar Peterson (p), Herb Ellis (g), Ray Brown (sb), Stan Levey (dm)\nhttp://www.jazz-on-line.com/a/mp3a/DEC23391x.mp3\tBillie Holiday\tLover Man\tDECCA\t23391\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DIAD1022.mp3\tCharlie Parker\tLover Man\tDIAL\t1007\tD1022\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD6VB2115.mp3\tDuke Ellington And His Orchestra\tLover Man\tRCA\tPM42415\tD6VB2115\t1946\tShelton Hemphill, Taft Jordan, Francis Williams, Cat Anderson, Harold \"Shorty\" Baker (tp) Ray Nance (tp,vln,vcl) Lawrence Brown, Claude Jones, Wilbur DeParis (tb) Jimmy Hamilton (cl,ts) Russell Procope (as,cl) Johnny Hodges (as) Al Sears (ts) Harry Carney (bar,cl,b-cl) Duke Ellington (p) Billy Strayhorn (p-1) replaces Ellington, Fred Guy (g) Oscar Pettiford (b) Sonny Greer (d) Marion Cox (vcl) \nhttp://www.jazz-on-line.com/a/mp3c/MUSG558-A.mp3\tGeorgie Auld & His Orchestra\tLover Man\tMUSICRAFT\t501\tG558-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72669.mp3\tEddie Heywood\tLover Man\tDECCA\t23998\t72669\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-451-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tLover Man\tSWING\t253\tOSW-451-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480447.mp3\tArt Tatum And Buddy Rich & Lionel Hampton\tLover Man\tPablo\t2310-775\t2383-1\t1955\tArt Tatum (p), Lionel Hampton (vib), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480539.mp3\tArt Tatum And Buddy Defranco Quartet\tLover Man\tHis Master's Voice\t7EG8619\t2683-2\t1956\tBuddy DeFranco (cl) Art Tatum (p) Red Callender (b) Bill Douglass (d)\nhttp://www.jazz-on-line.com/a/mp3a/MUSG567-A.mp3\tSarah Vaughn W-dizzy Gillespie\tLover Man (vs.vaughn)\tMUSICRAFT\t499\tG567-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/GuiG-567.mp3\tDizzy Gillespie And His Orchestra\tLover Man Oh Where Can You Be\tGuild\t1002\tG-567\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24646LG.mp3\tElla Fitzgerald\tLover's Gold\tDECCA\t24646\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW147925.mp3\tPaul Whiteman & His Orch\tLover, Come Back To Me\tCOLUMBIA\t1731 D\tW147925\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COM4755.mp3\tBillie Holiday W Eddy Heywood\tLover, Come Back To Me\tCOMMODORE\t559\t4755\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_063.mp3\tArden-ohman Orchestra Feat. Revelers, The\tLover, Come Back To Me\tVICTOR\t21776\t47782-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_096alt.mp3\tRudy Vallee And His Connecticut Yankees\tLover, Come Back To Me\tVICTOR\t21880\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/BLUB-10126-A.mp3\tArtie Shaw And His Orchestra\tLover, Come Back To Me (from M-g-m Film And Musical Comedy ''the New Moon'')\tBLUEBIRD\tB-10126-A\t031491-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_122.mp3\tNat ''king'' Cole Feat. Billy May's Orchestra\tLover, Come Back To Me!\tCAPITOL\t2610\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401775-B.mp3\tDorsey Brothers Concert Orch\tLover, Come Back To Me! (part 1)(vsb)\tOKeh\t41223\t401775-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S6060.mp3\tHank Williams\tLovesick Blues\tMGM\t10352\t49S6060\t\t\nhttp://www.jazz-on-line.com/a/mp3h/COLW152369.mp3\tMark Fisher And His Edgewater Beach Hotel Orchestra\tLovey\tCOLUMBIA\t2749 D\tW152369\t1933\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81444-3.mp3\tThe Georgians\tLovey Came Back\tColumbia\t62-D\t81444-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL1022x.mp3\tClovers\tLovey Dovey\tATLANTIC\t1022\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67309.mp3\tLouis Jordan & His Tympani 5\tLovie Joe\tDECCA\t7745\t67309\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK8037-1.mp3\tWynonie Harris\tLovin' Machine\tKING\t4485A\tK8037-1\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC25025.mp3\tPete Johnson Boogie Woogie Boy\tLovin' Mama Blues\tVOCALION\t5186\t25025\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_036.mp3\tNora Bayes Feat. O/charles Prince\tLovin' Sam (sheik Of Alabam')\tCOLUMBIA\t3757\t80662-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80662-1.mp3\tNora Bayes\tLovin' Sam - The Sheik Of Alabam\tCOLUMBIA\tA-3757\t80662-1\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_137.mp3\tEartha Kitt\tLovin' Spree\tRCA\t20-5610\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/COL41163LUS.mp3\tFrankie Laine\tLovin' Up A Storm\tCOLUMBIA\t41163\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCLA1446.mp3\tMildred Bailey & Her Orchestra\tLoving You\tVOCALION\t3758\tLA1446\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_1031_02.mp3\tLee Morse And Her Bluegrass Boys\tLoving You The Way I Do\tColumbia\t2333 D\tW150925-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64348-1.mp3\tBert Lown Biltmore Hotel Orch\tLoving You The Way I Do (v3)\tVICTOR\t22568\t64348-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO812.mp3\tRoy Acuff Smoky Mountain Boys\tLow And Lonely\tCOLUMBIA\t20198\tHCO812\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-64-1.mp3\tRex Stewart And His Feetwarmers (with Django Reinhardt)\tLow Cotton\tSWING\t203\tOSW-64-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/Mon049100.mp3\tLewis Bronzeville Five\tLow Down Gal Blues\tMontgomeryWard\t8899\t049100\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-36925-A.mp3\tConnie's Inn Orchestra\tLow Down On The Bayou\tBrunswick\t6176\tE-36925-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Cro1434-3.mp3\tConnie's Inn Orchestra\tLow Down On The Bayou\tCrown\t3194\t1434-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban10626-3.mp3\tBlue Ribbon Boys\tLow Down On The Bayou A N L\tBanner\t32240\t10626-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Col151639-1.mp3\tKing Carter And His Royal Orchestra\tLow Down On The Bayou A N L\tColumbia\t2638-D\t151639-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COL149477-2.mp3\tLloyd Keating & His Music\tLow Down Rhythm\tCOLUMBIA\tHA1052\t149477-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN1122.mp3\tHank Penny\tLow Down Woman Blues\tKING\t1122\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU62339-1.mp3\tJelly Roll Morton Hot Peppers\tLow Gravy\tBLUEBIRD\t8302\t62339-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic62339-1.mp3\tJelly-roll Morton And His Red Hot Peppers\tLow Gravy\tVictor\t23344\t62339-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe405084-1.mp3\tGeorgia Bill (w.mctell)\tLow Rider Blues\tOKeh\t8924\t405084-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68855.mp3\tJoe Marsala & His Orchestra\tLower Register\tDECCA\t3764B\t68855\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66959.mp3\tBlue Lu Barker & Fly Cats\tLu's Blues\tDECCA\t7770\t66959\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe405053.mp3\tBuddy Campbell Orch (selvin)\tLucille\tOKeh\t41527\t405053\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69356-B.mp3\tArt Tatum & His Band\tLucille\tDECCA\t8577B\t69356-B\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_130.mp3\tRevelers\tLucky Day\tVICTOR\t20111\t35769-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE19660.mp3\tPhil Ohman & Victor Arlen\tLucky Day\tBRUNSWICK\t3242\tE19660\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC35769-2.mp3\tRevelers\tLucky Day\tVICTOR\t20111\t35769-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC35731-4.mp3\tGeorge Olsen & His Music\tLucky Day (v F F-b R-b B)\tVICTOR\t20101A\t35731-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC84389.mp3\tColeman Hawkins W Paul Nielson\tLucky Duck\tDECCA\t28764\t84389\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW144571-3.mp3\tFred Rich And His Orch\tLucky In Love\tCOLUMBIA\t1108 D\tW144571-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/MBI1108-D.mp3\tFred Rich And His Hotel Astor O\tLucky In Love\tColumbia\t1108-D\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20872-A.mp3\tGeorge Olsen And His Music\tLucky In Love\tVictor\t20872-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiNip.mp3\tNat Shilkret And The Victor Orchestra & Chorus\tLucky Lindy\tNipper's Greatest Hi\t\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3r/RiHar418.mp3\tJack Kaufman\tLucky Lindy\tHarmony\t418\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_137.mp3\tVernon Dalhart\tLucky Lindy\tCOLUMBIA\t1000 D\tW144212!\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC38844-3.mp3\tNat Shilkret And Victor Orch\tLucky Lindy (vqt)\tVICTOR\t20681-A\t38844-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe403205-B.mp3\tCasa Loma Orchestra\tLucky Me - Lovable You\tOKeh\t41339\t403205-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4227.mp3\tBing Crosby - Jasha Heifetz\tLullaby\tDECCA\t40012\tL4227\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_163.mp3\tReginald Foresythe And His Orchestra\tLullaby\tColumbia\t3012\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS22810-1.mp3\tHarry James And His Orchestra\tLullaby In Rhythm\tCBS\tBR8136\t22810-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC022415.mp3\tBenny Goodman And His Orchestra\tLullaby In Rhythm\tVICTOR\t25827\t022415\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63931.mp3\tWoody Herman & His Orchestra\tLullaby In Rhythm\tDECCA\t1900B\t63931\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-22810-1.mp3\tHarry James And His Orchestra\tLullaby In Rhythm\tBrunswick\t8136\tB-22810-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_259.mp3\tBenny Goodman And His Orchestra\tLullaby In Rhythm\tVICTOR\t25827\t022415\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DiaD-1082-C.mp3\tDexter Gordon Quintet\tLullaby In Rythm\tDial\t1038\tD-1082-C\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_118.mp3\tBlue Stars\tLullaby Of Birdland\tMercury\t70742\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S278.mp3\tGeorge Shearing Quintet\tLullaby Of Birdland Vocal Ray Charles Singers\tMGM\t11354B\t52S278\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3548.mp3\tAndrew Sisters - Vic Schoen\tLullaby Of Broadway\tDECCA\t23824\tL3548\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4412.mp3\tDoris Day & Harry James Orch.\tLullaby Of Broadway\tCOLUMBIA\t39159\tHCO4412\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA321.mp3\tDick Powell And His Orch\tLullaby Of Broadway\tBRUNSWICK\t7374\tLA321\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUB16660-A.mp3\tHal Kemp & His Orchestra\tLullaby Of Broadway\tBRUNSWICK\t7369\tB16660-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D358A1.mp3\tThe Andrews Sisters\tLullaby Of Broadway\tV-DISC\t358A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU7369.mp3\tHal Kemp & His Orchestra\tLullaby Of Broadway\tBRUNSWICK\t7369\tB16660-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_199.mp3\tHal Kemp And His Orchestra\tLullaby Of Broadway\tBRUNSWICK\t7369\tB16660-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_017.mp3\tDorsey Brothers Orchestra Feat. Bob Crosby\tLullaby Of Broadway\tDECCA\t370A\t39280\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39280.mp3\tDorsey Brothers Orchestra, Vocal By Bob Crosby\tLullaby Of Broadway (v  Bob Crosby)\tDECCA\t370A\t39280\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh040.mp3\tAmbrose And His Orchestra\tLullaby Of Broadway (v Sam Browne & The Rhythm Brothers)\tDecca\tF-5558\tGB-7138-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO44674.mp3\tBenny Goodman Sextet\tLullaby Of The Leaves\tCOLUMBIA\t39121\tCO44674\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/ARCB11682-A.mp3\tConnie Boswell\tLullaby Of The Leaves\tARC\tBR6297\tB11682-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1940.mp3\tArt Tatum\tLullaby Of The Leaves\tDECCA\t18051A\tDLA1940\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL420.mp3\tErroll Garner Trio\tLullaby Of The Leaves\tATLANTIC\t672\t420\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC72287-1.mp3\tGeorge Olsen And His Music\tLullaby Of The Leaves (v6)\tVICTOR\t22998\t72287-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC072286.mp3\tGlenn Miller & His Orch\tLullaby Of The Rain (vre+tm)\tVICTOR\t27894\t072286\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu063702-2.mp3\tBenny Carter And His Orchestra\tLullaby To A Dream\tBluebird\t\t063702-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64670.mp3\tAndrews Sisters\tLullaby To A Jitterbug\tDECCA\t2082B\t64670\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_185.mp3\tAndrews Sisters\tLullaby To A Jitterbug\tDECCA\t2082B\t64670\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC45098.mp3\tJimmie Rodgers\tLullaby Yodel\tVICTOR\t21636\t45098\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC89760-1.mp3\tFats Waller And His Rhythm\tLulu's Back In Town\tVICTOR\t25063\t89760-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC39694.mp3\tBob Howard & His Orchestra\tLulu's Back In Town\tDECCA\t504A\t39694\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC25063.mp3\tFats Waller And His Rhythm\tLulu's Back In Town\tVICTOR\t25063\t89760-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP265-1B-1.mp3\tZutty Singleton's Trio\tLulu's Mood\tCAPITOL\t10022\t265-1B-1\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap265-1B.mp3\tZutty's Trio With Barney Bigard\tLulus Mood\tCapitol\t10022\t265-1B\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_226.mp3\tAlan Dean Feat. Joe Lipman Orchestra\tLuna Rossa (blushing Moon)\tMGM\t11269\t52S197\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COL25756-1.mp3\tJimmy Lunceford & His Orch\tLunceford Special\tCOLUMBIA\t38338\t25756-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke25756-1.mp3\tJimmie Lunceford And His Orchestra\tLunceford Special\tOkeh\t5326\t25756-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR616-Hx.mp3\tLou Gold And His Orch\tLuscious\tHarmony\t616-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK8039-1.mp3\tWynonie Harris\tLuscious Woman\tKING\t4485\tK8039-1\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL53.mp3\tJonah Jones Sextet\tLust For Licks\tKEYNOTE\t614\tHL53\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61106.mp3\tLouis Armstrong & His Orch.\tLyin' To Myself\tDECCA\t835A\t61106\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_147.mp3\tLouis Armstrong And His Orchestra\tLyin' To Myself\tDECCA\t835A\t61106\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13312.mp3\tAbe Lyman And His Orch\tLying In The Hay\tBRUNSWICK\t6572\t13312\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB4395.mp3\tRay Noble & His Orch\tLying In The Hay\tVICTOR\t24297\tOB4395\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_138.mp3\tRay Noble And His Orchestra\tLying In The Hay\tVICTOR\t24297\tOB4395\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480867.mp3\tTed Heath And His Music\tLyonia\tDECCA\tF9255\tDR-14020\t1949\tBobby Pratt, Stan Roderick, Stan Reynolds, Ronnie Hughes (tp) Jackie Armstrong, Maurice Pratt, Jack Bentley, Jimmy Coombes (tb) Les Gilbert, Reg Owen (as) Tommy Whittle, Henry Mackenzie (ts) Dave Shand (bar) Dave Simpson (p) Jack Seymour (b) Jack Parnell (d) Ted Heath (dir) \nhttp://www.jazz-on-line.com/a/mp3w/1917_023.mp3\tAnna Wheaton\tM-i-s-s-i-s-s-i-p-p-i\tCOLUMBIA\tA-2224\t47433\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_292.mp3\tBill Darnel Feat. O/roy Ross; Bv/the Heathertones\tM-i-s-s-i-s-s-i-p-p-i\tCoral\t60220\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_230.mp3\tRed Foley Feat. The Dixie Dons\tM-i-s-s-i-s-s-i-p-p-i\tDECCA\t46241\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_092.mp3\tGeorge Wilton Ballard\tM-o-t-h-e-r (a Word That Means The World To Me)\tEDISON\t50325\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_001.mp3\tHenry Burr\tM-o-t-h-e-r (a Word That Means The World To Me)\tVICTOR\t17913\t16778-2\t1916\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79984.mp3\tTed Lewis Jazz Band\tMa\tCOLUMBIA\tA-3473\t79984\t1921\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC2920-B.mp3\tDick Robertson And His Orch\tMa (he's Making Eyes At Me)\tDECCA\t2920B\t66933-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D306B2.mp3\tAl Jolson\tMa Blushin' Rosie\tV-DISC\t306B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70245.mp3\tMaxine Sullivan\tMa Curly-headed Baby\tDECCA\t18349A\t70245\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/PAR20229-2.mp3\tMa Rainey's Georgia Jazz Band\tMa Rainey's Black Bottom\tPARAMOUNT\t12590\t20229-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO10336.mp3\tDoris Day & Johnnie Ray\tMa Says, Pa Says\tCOLUMBIA\t39898\tHCO10336\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_278.mp3\tDoris Day And Johnnie Ray Feat. Paul Weston's Orchestra\tMa Says, Pa Says\tCOLUMBIA\t39898\tHCO10336\t1952\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-151-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tMabel\tSWING\t137\tOSW-151-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/GraX2LA-1997-1.mp3\tQuintette Du Hot Club De France (with Django Reinhardt)\tMabel\tGramophone\tL-1046\tX2LA-1997-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC1622-1.mp3\tKing Oliver's Jazz Band\tMabel's Dream\tDecca\tMU60279\t1622-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17062H-.mp3\tThe Dutch Swing College Band\tMabel's Dream\tPhilips\tP17062H\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/MOD327.mp3\tStan Kenton & His Orch\tMachito\tMODERN\tCAP408\t327\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63935-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tMacpherson Is Rehearsin'\tDecca\t2080\t63935-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/GENG11552-A.mp3\tNew Orlean Rhythm Kings\tMad\tGENNETT\t5221\tG11552-A\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43006.mp3\tUna Mae Carlisle\tMad About Love\tCOLUMBIA\t38973\tCO43006\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC25020MA.mp3\tRay Noble & His Orch\tMad About The Boy\tVICTOR\t25020\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_269.mp3\tRay Noble And His Orchestra\tMad About The Boy\tVICTOR\t25020\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480868.mp3\tAndre Previn\tMad About The Boy\tRCA VICTOR\t20-3042\t\t1947\tAndre Previn, p; Al Viola, g; Lloyd Pratt, b; Jackie Mills, drums\nhttp://www.jazz-on-line.com/a/mp3b/MER1641-2.mp3\tHelen Humes\tMad About You\tMERCURY\t8074\t1641-2\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3312.mp3\tJ J Johnson Quintet\tMad Bebop\tSAVOY\t930A\tS3312\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142439-1.mp3\tNew Orleans Bootblacks\tMad Dog\tCOLUMBIA\t14337 D\tW142439-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152200-1.mp3\tClaude Hopkins & His Orch\tMad Moments\tCOLUMBIA\t2665 D\tW152200-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol2665-D.mp3\tClaude Hopkins & His Orchestra\tMad Moments\tColumbia\t2665-D\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BruLA1816-A.mp3\tGene Krupa And His Orchestra\tMadam Swings It\tBrunswick\t8335\tLA1816-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_037.mp3\tEnrico Caruso And Geraldine Farrar\tMadama Butterfly - Finale Act I: O Quantiocchi Fisi (o Kindly Heavens)\tVICTOR\t89017\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_085.mp3\tGeraldine Farrar Feat. Caruso Farrar, Antonio Scotti And Gina Viafora\tMadama Butterfly: Finale Ultimo (butterfly's Death Scene)\tVICTOR\t87030\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/ARCB14195-B.mp3\tEddy Condon & His Orch\tMadame Dynamite\tARC\tCO36009\tB14195-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_286.mp3\tMitch Miller And His Orchestra\tMadeira\tColumbia\t40655\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO48931.mp3\tMitch Miller And His Music\tMadeira (vstan Freeman)\tCOLUMBIA\t40655\tCO48931\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_153.mp3\tSammy Kaye And His Orchestra\tMadelaine\tVictor\t27704\t068092\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_229.mp3\tBob Chester And His Orchestra Feat. V/bob Haymes\tMadelaine\tBluebird\t11355\t068044\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_037.mp3\tVictor Military Band\tMadelon\tVictor\t18534\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_112.mp3\tEddy Howard And His Orchestra\tMademoiselle\tMERCURY\t5898\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU97017-2.mp3\tBenny Goodman And His Orchestra\tMadhouse\tBLUEBIRD\t10461\t97017-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVoc3379.mp3\tEarl Hines\tMadhouse\tVocalion\t3379\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VOCB-15003-A.mp3\tEarl Hines And His Orchestra\tMadhouse\tVOCALION\t3379\tB-15003-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/ColM-623-1.mp3\tChu Berry And His Stompy Stevedores\tMaelstrom\tColumbia\t37571\tM-623-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5766.mp3\tDuke Ellington & His Orch\tMagenta Haze\tMUSICRAFT\t483\t5766\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1926.mp3\tWillie Lewis & Negro Band\tMaggie\tVARSITY\tEL4081s\t1926\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19161m.mp3\tThe Manhattan Merrymakers\tMaggie, Yes Ma'am\tVictor\t19161\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68339.mp3\tEddie Durham & His Band\tMagic Carpet\tDECCA\t8529\t68339\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_192.mp3\tEddie Fisher\tMagic Fingers\tRCA Victor\t6264\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D337B1.mp3\tAndy Russell\tMagic Is The Moonlight\tV-DISC\t337B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_242.mp3\tLes Paul And Mary Ford\tMagic Melody\tCapitol\t3248\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3d/PerA-169z.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tMagic Of You\tPerception\tPLP35-2\tA-169z\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Pol2423hpp.mp3\tDjango Reinhardt\tMagic Strings\tPolydor\tF-512736\t2423hpp\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/COL41230MO.mp3\tFrankie Laine\tMagnificent Obsession\tCOLUMBIA\t41230\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC39224-3.mp3\tJohnny Marvin (uke)\tMagnolia\tVICTOR\t20731\t39224-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE28058.mp3\tLew Leslie's Blackbirds Orch\tMagnolia's Wedding Day\tBRUNSWICK\t4030\tE28058\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUE28058HR2-3.mp3\tLew Leslie's Blackbirds Orch\tMagnolia's Wedding Day\tBRUNSWICK\t4030\tE-28058\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU02896-1.mp3\tFrank Tanner's Rhythm Kings\tMagnolias In The Moonlight\tBLUEBIRD\tB-6667\t02896-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC75106.mp3\tLouis Armstrong And His Orch\tMahogany Hall Stomp\tVICTOR\t24232\t75106\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4112.mp3\tKid Ory Creole Dixieland Band\tMahogany Hall Stomp\tCOLUMBIA\t38956\tHCO4112\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011122.mp3\tBunny Berigan & His Orch\tMahogany Hall Stomp\tVICTOR\t25622A\t011122\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61111-A.mp3\tLouis Armstrong And His Orchestra\tMahogany Hall Stomp\tDecca\t824\t61111-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC93004.mp3\tSleepy John Estes\tMailman Blues\tDECCA\t7789\t93004\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC64328.mp3\tTiny Mayberry\tMailman Blues\tDECCA\t7593\t64328\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/V-DVP990.mp3\tDuke Ellington Orch\tMain Stem\tV-DISC\t355\tVP990\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D355A2.mp3\tDuke Ellington And His Orchestra\tMain Stem\tV-DISC\t355A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_194.mp3\tDuke Ellington And His Famous Orchestra Feat. Ben Webster\tMain Stem\tVICTOR\t1556\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480741.mp3\tDuke Ellington And His Famousorchestra\tMain Stem\tRCA Victor\t20-1556\t072438-1\t1942\tWardell Jones (tp), Ray Nance (tp, vn), Rex Stewart (co), Joe Nanoton, Lawrence Brown (tb), Juan Tizol (vtb), Barney Bigard (cl), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (as, bsx), Ben Webster (ts), Billy Strayhorn (p), Fred Guy (g), Junior Raglin (sb), Sonny Greer (dm), Duke Ellington (ldr)\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0928_02.mp3\tLee Morse\tMain Street\tColumbia\t1752DB\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_391.mp3\tConnee Boswell\tMain Street On Saturday Night\tDECCA\t28626\t83950\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_307.mp3\tLes Elgart And His Orchestra\tMain Title - Golden Arm\tColumbia\t40664\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_176.mp3\tDick Jacobs And His Chorus And Orchestra\tMain Title And \"molly-o\"\tCoral\t61606\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_275.mp3\tBilly May And His Orchestra\tMain Title From The Man With The Golden Arm\tCapitol\t3372\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_116.mp3\tElmer Bernstein And Orchestra\tMain Title From The Man With The Golden Arm\tDecca\t29869\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18588A.mp3\tMerry Macs\tMairzy Doats\tDECCA\t18588A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_076.mp3\tPied Pipers\tMairzy Doats\tCapitol\t148\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_011.mp3\tMerry Macs\tMairzy Doats\tDECCA\t18588A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_207.mp3\tKing Sisters\tMairzy Doats\tBLUEBIRD\tBB30-0822\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_067.mp3\tAl Trace And His Sily Symphonists\tMairzy Doats\tHit\t8079\t\t1944\tvocal by Red Maddock And Group\nhttp://www.jazz-on-line.com/a/mp3c/HITR333-2.mp3\tAl Trace Silly Symphonists\tMairzy Doats (v Red Maddock)\tHIT OF THE WEEK\t8079\tR333-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55852-2.mp3\tHenry Allen & His Orch\tMake A Country Bird Fly Wild\tVICTOR\t38107\t55852-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic55852-2.mp3\tHerny ''red'' Allen And His New York Orchestra\tMake A Country Bird Fly Wild\tVictor\tV-38107\t55852-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_296.mp3\tJane Russell - Connie Haines - Beryl Davis - Della Russell - Arranged And Conducted By Lyn Murray\tMake A Joyful Noise Unto The Lord - Do Lord\tCoral\t61113\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79723-6.mp3\tNora Bayes\tMake Believe\tCOLUMBIA\tA-3392\t79723-6\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC021131.mp3\tBenny Goodman And His Orchestra\tMake Believe\tVICTOR\t26088\t021131\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYHL33.mp3\tColeman Hawkins All American 4\tMake Believe\tKEYNOTE\t1317\tHL33\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC24893-10.mp3\tPaul Whiteman And His Orchestra\tMake Believe\tVICTOR\t18742\t24893-10\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU4894-5.mp3\tIsham Jones & His Orch\tMake Believe\tBRUNSWICK\t5049\t4894-5\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT641.mp3\tJohnny Guarnieri Trio\tMake Believe\tMAJESTIC\t1035\tT641\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC41470-5.mp3\tPaul Whiteman And His Orchestra<br>vocal Bing Crosby<br>\tMake Believe\tVICTOR\t25249\t41470-5\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74988.mp3\tBing Crosby / C.cavallaro\tMake Believe\tDECCA\t24677\t74988\t1949\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-3392.mp3\tNora Bayes\tMake Believe\tCOLUMBIA\tA-3392\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_010.mp3\tNora Bayes Feat. Charles Prince's Orchestra\tMake Believe\tCOLUMBIA\t3392\t79723-6\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_020.mp3\tAda Jones And Billy Murray\tMake Believe\tZONOPHONE\t987\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102407.mp3\tCharlie Barnet & His Orchestra\tMake Believe Ballroom\tBLUEBIRD\t6504\t102407\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu6504.mp3\tCharlie Barnet & His Orchestra\tMake Believe Ballroom\tBluebird\t6504\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU056479.mp3\tGlenn Miller And His Orch\tMake Believe Ballroom Time (vmodernaires)\tBLUEBIRD\t10913\t056479\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_141.mp3\tSammy Kaye And His Orchestra\tMake Believe Island\tVictor\t26594\t050134\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_123.mp3\tDick Todd\tMake Believe Island\tBluebird\t10729\t048906-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26767.mp3\tGene Krupa & His Orch\tMake Believe Island\tCOLUMBIA\t35474\t26767\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_127.mp3\tNat ''king'' Cole Feat. Nelson Riddle's Orchestra\tMake Her Mine\tCAPITOL\t2803\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69907.mp3\tElla Fitzgerald & Her Orch\tMake Love To Me\tDECCA\t4073B\t69907\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC070343-2.mp3\tArtie Shaw And His Orchestra\tMake Love To Me\tVICTOR\t27705\t070343-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO33739.mp3\tFrankie Laine W Paul Weston\tMake Me A Child Again\tCOLUMBIA\t40720\tHCO33739\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU051226-1.mp3\tSidney Bechet New Orleans F.w.\tMake Me A Pallet On The Floor\tBLUEBIRD\t8509\t051226-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW141543-2.mp3\tEthel Waters\tMake Me A Pallet On The Floor\tCOLUMBIA\t14125 D\tW141543-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC69027-4.mp3\tBlanche Calloway & Her Orch\tMake Me Know It\tVICTOR\t22736\t69027-4\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC40513-1.mp3\tRed And Miff's Stompers\tMake My Cot Where The Cot Cot Cotton Grows\tVICTOR\t21056\t40513-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW144834.mp3\tCalifornia Ramblers\tMake My Cot Where The Cot-cot-cotton Grows\tCOLUMBIA\t1227 D\tW144834\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26194-A.mp3\tBenny Goodman & His Orch\tMake With The Kisses (vocal Mildred Bailey)\tCOLUMBIA\t35313\t26194-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28866.mp3\tCab Calloway & His Orch\tMake Yourself At Home\tOKEH\t5847\t28866\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70469x.mp3\tSarah Vaughn\tMake Yourself Comfortable\tMERCURY\t70469\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_179.mp3\tPeggy King\tMake Yourself Comfortable\tColumbia\t40363\tRHCO33251\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_173.mp3\tAndy Griffith\tMake Yourself Comfortable\tCapitol\t3057\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_044.mp3\tSarah Vaughan\tMake Yourself Comfortable\tMercury\t70469\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_008.mp3\tMitchell Ayres And His Fashions In Music\tMake-believe Island\tBluebird\t10687\t048716-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480670.mp3\tBen Webster And Harry Edison\tMakin Whoopee\tVerve\t10069\t20572-7\t1957\tBen Webster, Ts, Harry Sweets Edison, T, Jimmy Rowles, P, Barney Kessel, G, Joe Mondragon, B, Larry Bunker, D, Woody Herman, Vocal, from Songs for Hip Lovers\nhttp://www.jazz-on-line.com/a/mp3c/OKe404973-B.mp3\tGolden Terrace Orch (selvin)\tMakin' Faces At The Man In The Moon\tOKeh\t41517\t404973-B\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe401278-A.mp3\tEddie Condon's Footwarmers\tMakin' Friends (v J T)\tOKeh\t41142\t401278-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148031.mp3\tEddie Walters\tMakin' Whoopee\tCOLUMBIA\t1763\tW148031\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21816-A.mp3\tGeorge Olsen And His Music\tMakin' Whoopee\tVictor\t21816-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49001-2.mp3\tEddie Cantor W N.shilkret Orch\tMakin' Whoopee\tVICTOR\t21831\t49001-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_187.mp3\tBen Bernie And His Orchestra Feat. V/scrappy Lambert\tMakin' Whoopee\tBRUNSWICK\t4142\tE28881\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_017.mp3\tEddie Cantor Feat. O/nat Shilkret\tMakin' Whoopee\tVICTOR\t21831\t49001-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480448.mp3\tArt Tatum And Lionel Hampton\tMakin' Whoopee\tClef\tMGC709\t2385-1\t1955\tArt Tatum (p), Lionel Hampton (vib), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480512.mp3\tArt Tatum\tMakin' Whoopee\tClef\tMGC613\t1419-1\t1953\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3t/TS480540.mp3\tBen Webster Quintet\tMakin' Whoopee\tVerve\tMGV8274\t21742-5\t1957\tBen Webster (ts), Oscar Peterson P, Stan Levey, D, Ray Brown, B, Herb Ellis, G\nhttp://www.jazz-on-line.com/a/mp3t/TS480588.mp3\tArt Tatum/buddy Defranco Quartet\tMakin' Whoopee\tVerve\tMGV-8229\t2684-4\t1956\tBuddy De Franco (cl), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480810.mp3\tThe Art Tatum Trio\tMakin' Whoopee\tPablo\t2310-379\t1798-2\t1954\tBenny Carter (as), Art Tatum (p), Louie Bellson (dm)\nhttp://www.jazz-on-line.com/a/mp3c/COLW147540-7.mp3\tPaul Whiteman & His Orch\tMakin' Whoopee!\tCOLUMBIA\t1683 D\tW147540-7\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE28881.mp3\tBen Bernie & His Orch\tMakin' Whoopee! (v Scrappy Lambert)\tBRUNSWICK\t4142\tE28881\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC87329.mp3\tRed Foley And Kitty Wells\tMaking Believe\tDECCA\t29419\t87329\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC74094.mp3\tCarmen Cavallaro\tMalaguena\tDECCA\t28403\t74094\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SIG655-2.mp3\tAnita O'day W Ralph Burns Orch\tMalaguena (tb Solo-ray Sims)\tSIGNATURE\t15181A\t655-2\t\t\nhttp://www.78-tours.net/mp3/PATCPT7779.mp3\tJacques Helian Et Son Orchestre Chant : Jean Marco Et Churs\tMalgr Tout, Du Film \"pigalle - Saint-germain-des-prs\"\tPATH\tPG 431\tCPT 7779\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP611.mp3\tBenny Carter & His Orchestra\tMalibu\tCAPITOL\t\t611\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap611-3.mp3\tBenny Carter And His Orchestra\tMalibu\tCapitol\t200\t611-3\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/CONDAL396-1.mp3\tRobert Johnson\tMalted Milk\tCONQUEROR\t8944\tDAL396-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCON8944ma.mp3\tRobert Johnson\tMalted Milk\tCONQUEROR\t8944\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP396x.mp3\tPied Pipers - Paul Weston Orch\tMam'selle\tCAPITOL\t396\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2256.mp3\tFrank Sinatra\tMam'selle\tCOLUMBIA\t37343\tHCO2256\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4368.mp3\tDick Haymes - Gordon Jenkins\tMam'selle\tDECCA\t23861\tL4368\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MER754-1.mp3\tFrankie Laine\tMam'selle\tMERCURY\t5048\t754-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_157.mp3\tFrankie Laine\tMam'selle\tMERCURY\t5048\t754-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_018.mp3\tFrank Sinatra\tMam'selle\tCOLUMBIA\t37343\tHCO2256\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_087.mp3\tDennis Day Feat. Charles Dant's Orchestra\tMam'selle\tRCA Victor\t2211\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_076.mp3\tRay Dorey\tMam'selle\tMAJESTIC\t7217\tT1002\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70653.mp3\tElla Fitzgerald & Four Keys\tMama Come Home\tDECCA\t18347B\t70653\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2061-3.mp3\tJulia Lee And Her Boyfriends\tMama Don't Allow It\tCAPITOL\t\t2061-3\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVoc1434.mp3\tCow Cow Davenport\tMama Don't Allow No Easy Riders Here\tVocallion\t1434\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39580.mp3\tCleo Brown\tMama Don't Want No Peas An' No Rice\tDECCA\t512A\t39580\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_320.mp3\tCount Basie And His Orchestra Feat. Jimmy Rushing\tMama Don't Want No Peas An' Rice An' Coconut Oil\tDECCA\t2030B\t63918-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480870.mp3\tCarmen Miranda And The Bando Da Lua\tMama Eu Quero (i Want My Mama)\tDECCA\t23132-A\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_079.mp3\tPatti Page\tMama From The Train\tMercury\t70971\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/EME42526-2.mp3\tFletcher Henderson & His Orch\tMama Gonna Slow You Down\tEMERSON\t10713\t42526-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC1476.mp3\tBen Pollack & His Orchestra\tMama I Wanna Make Rhythm\tDECCA\t1476\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_200.mp3\tMaurice Chevalier Feat. D/leonard Joy\tMama Inez\tVICTOR\t22731\t69661-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU11616.mp3\tIsham Jones & His Orch\tMama Loves Papa\tBRUNSWICK\t2506\t11616\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU75863-1.mp3\tEddie South & His Orch\tMama Mocking Bird\tBLUEBIRD\t10120\t75863-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_191.mp3\tFrank Sinatra And Dagmar Feat. Axel Stordahl's Orchestra\tMama Will Bark\tColumbia\t39425\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe8756-A.mp3\tJimmy Joy's St. Anthony's Hotel Orchestra\tMama Will Be Gone\tOKeh\t40251\t8756-A\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA379-A.mp3\tJimmie Davis\tMama's Getting Hot And Papa's Getting Cold\tDECCA\t5249\tDLA379-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67241.mp3\tBob Crosby's Bobcats\tMama's Gone, Goodbye\tDECCA\t3056A\t67241\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80995-2.mp3\tBessie Smith\tMama's Got The Blues\tCOLUMBIA\tA-3900\t80995-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/Oke71105-B.mp3\tSara Martin\tMama's Got The Blues\tOkeh\t8046\t71105-B\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/GenX-100.mp3\tCaroline Johnson\tMama's Losin' A Might Good Chance\tGennett\t3307\tX-100\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM618-1.mp3\tCab Calloway & His Orch\tMama, I Wanna Make Rhythm\tVARIETY\tI644\tM618-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013333.mp3\tBunny Berigan & His Orch\tMama, I Wanna Make Rhythm\tVICTOR\t25677A\t013333\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_359.mp3\tCab Calloway And His Orchestra\tMama, I Wanna Make Rhythm\tVOCALION\t3788\tM618\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh049.mp3\tJack Harris And His Orchestra\tMama, I Wanna Make Rhythm (v Dinah Miller)\tHMV\tBD-5356\tOEA-6289-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_217.mp3\tEydie Gorme\tMama, Teach Me To Dance\tABC-Paramount\t9722\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_174.mp3\tShep Fields And His Rippling Rhythm Orchestra\tMama, That Moon Is Here Again\tBluebird\t7318\t017434\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-11078-B.mp3\tFats Waller And His Rhythm\tMamacita\tBluebird\tB-11078-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/GENG11910.mp3\tJelly Roll Morton\tMamamita\tGENNETT\t3043\tG11910\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO33234.mp3\tRosemary Clooney\tMambo Italiano\tCOLUMBIA\t40361\tHCO33234\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_136.mp3\tBill Haley And His Comets\tMambo Rock\tDecca\t29418\t87326\t1955\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC87326.mp3\tBill Haley And His Comets\tMambo Rock\tDECCA\t29418\t87326\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COMR2573.mp3\tJelly Roll Morton (piano)\tMamie's Blues\tCOMMODORE\t587\tR2573\t1939\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81214-2.mp3\tThe Georgians\tMamma Goes Where Papa Goes\tColumbia\tA-3996\t81214-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81197-1.mp3\tThe Georgians\tMamma Loves Papa (papa Loves Mama)\tColumbia\tA-3987\t81197-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4307-2.mp3\tEddie Condon & His Band\tMammy O' Mine\tCOMMODORE\t1509\t4307-2\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/COL49610.mp3\tYerkes Jazzarimba Orchestra\tMammy O' Mine - Soudan - Don't Cry Little Girl\tCOLUMBIA\tA-6108\t49610\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC23206-4.mp3\tJoseph Smith's Orch\tMammy Of Mine\tVICTOR\t18615\t23206-4\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC18531-A.mp3\tJoseph C. Smith's Orchestra With Vocal Refrain\tMammy's Lullaby\tVICTOR\t18531\t18531-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2110.mp3\tBenny Goodman And His Orchestra\tMan Here Plays Fine Piano (veve Young)\tCOLUMBIA\t37207\tHCO2110\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS5026MI.mp3\tMary Lou Williams\tMan I Love\tDISC\t5026\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC1234.mp3\tMary Lou Williams Orch\tMan O' Mine\tASCH\t1006\t1234\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS231.mp3\tErroll Garner\tMan Of Mine\tDISC\t5001\t231\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS438.mp3\tMacbeth, The Great\tMan Smart - Woman Smarter\tMUSICRAFT\t434\t438\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CONW3527.mp3\tEthel Waters W J.c.heard Orch\tMan Wanted\tCONTIN\t10007\tW3527\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/COL49384.mp3\tNora Bayes\tMan Who Put The Germ In Germany\tCOLUMBIA\tA-6051\t49384!\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_087.mp3\tNora Bayes\tMan Who Put The Germ In Germany\tColumbia\t6051\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5985.mp3\tWynonie Harris & His Allstars\tMan, Have I Got Troubles\tKING\t4468\tK5985\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_343.mp3\tThe Ames Brothers With Hugo Winterhalter And His Orchestra\tMan, Man, Is For The Woman Made\tRCA Victor\t5644\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2026x.mp3\tFreddy Martin And His Orchestra\tManagua Nicaragua\tRCA\t20-2026\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15022x.mp3\tPeggy Lee - Dave Barbour\tManana\tCAPITOL\t15022\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140092-3.mp3\tFletcher Henderson's Orch\tManda\tCOLUMBIA\t228D\t140092-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Col140092-3.mp3\tFletcher Henderson And His Orchestra\tManda\tColumbia\t\t140092-3  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79477.mp3\tAl Campbell & Henry Burr\tMandalay\tCOLUMBIA\tA-3350\t79477\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_131.mp3\tHenry Burr And Albert Campbell\tMandalay\tColumbia\t3350\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13473-4.mp3\tAl Jolson W Carl Fenton Orch\tMandalay (vaj)\tBRUNSWICK\t2650\t13473-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC35744M.mp3\tPaul Whiteman\tMandalay - Step Henrietta\tVICTOR\t35744\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78518.mp3\tVan And Schenck\tMandy\tCOLUMBIA\tA-2780\t78518\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/BANLA204-A.mp3\tEddie Cantor\tMandy\tBANNER\t33216\tLA204-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC84420-1.mp3\tFats Waller And His Rhythm\tMandy\tVICTOR\t24738\t84420-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC38986.mp3\tClaude Hopkins And His Orchestra\tMandy\tDECCA\t353A\t38986\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_017.mp3\tVan And Schenck\tMandy\tCOLUMBIA\tA-2780\t78518\t1919\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84420-1.mp3\t\"fats\" Waller And His Rhythm\tMandy\tVictor\t24738\t84420-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24350-A.mp3\tJimmie Lunceford And His Orchestra\tMandy\tOkeh\t4831\t24350-A\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2841.mp3\tBing Crosby - J.s.trotter\tMandy Is Two\tDECCA\t4249B\tDLA2841\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1900_004.mp3\tArthur Collins\tMandy Lee\tEDISON\t7404\t\t1900\t\nhttp://www.jazz-on-line.com/a/mp3e/Gen11385-C.mp3\tKing Oliver's Creole Jazz Band\tMandy Lee Blues\tGennett\t5134\t11385-C\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/PUR1974.mp3\tFletcher Henderson Orch\tMandy Make Up Your Mind\tPURITAN\tPU11367T\t1974\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_136.mp3\tAmerican Quartet\tMandy'n Me\tVictor\t18832\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe73026-B.mp3\tClarence Williams Blue Five\tMandy, Make Up Your Mind\tOKeh\t40260\t73026-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC30820-3.mp3\tPaul Whiteman & His Orch\tMandy, Make Up Your Mind\tVICTOR\t19492\t30820-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4697.mp3\tEddie Condon & His Band\tMandy, Make Up Your Mind\tCOMMODORE\t604\t4697\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_104.mp3\tTommy Dorsey And His Orchestra\tMandy, Make Up Your Mind\tVictor\t1522\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2170.mp3\tCharlie Parker\tMango Mangue Pt.1\tMERCURY\t11017\t2170\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1894_012.mp3\tU.s. Marine Band\tManhattan Beach\tCOLUMBIA\t\t\t1894\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM268-1.mp3\tCab Calloway Cotton Club Orch\tManhattan Jam\tVARIETY\tI612\tM268-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM201.mp3\tEdgar Hayes & His Orch\tManhattan Jam\tVOCALION\t3773\tM201\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20874-B.mp3\tPaul Whiteman And His Orch\tManhattan Mary\tVICTOR\t20874\t39653-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWB24914.mp3\tRaymond Scott's Quintet\tManhattan Minuet\tCOLUMBIA\t37361\tWB24914\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403051-C.mp3\tFrankie Trumbauer & His Orch\tManhattan Rag\tOKeh\t41330\t403051-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO854.mp3\tHarry James And His Orch\tManhattan Serenade\tCOLUMBIA\t36644\tHCO854\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC075405.mp3\tTommy Dorsey And His Orch\tManhattan Serenade\tVICTOR\t27962\t075405\t1942\t\nhttp://www.jazz-on-line.com/mp3/753688097.mp3\tTommy Dorsey (jo Stafford Voc)\tManhattan Serenade\tABBOTT\t15003\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27962.mp3\tTommy Dorsey & His Orchestra\tManhattan Serenade\tVictor\t27962\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_083.mp3\tTommy Dorsey And His Orchestra Feat. Jo Stafford\tManhattan Serenade\tVICTOR\t27962\t075405\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_172.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tManhattan Serenade\tDECCA\t18467A\t71061\t1942\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480871.mp3\tAndre Kostelanetz And His Orchestra\tManhattan Serenade\tCOLUMBIA\t7429-M\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26539-A.mp3\tGene Krupa & His Orch\tManhattan Transfer\tCOLUMBIA\t35444\t26539-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-410-1.mp3\tDjango Reinhardt And His American Swing Band\tManoir De Mes Rves\tSWING\t221\tOSW-410-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-323-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tManoir De Mes Rves\tSWING\t158\tOSW-323-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1629.mp3\tAugie Goupil's Royal Tahitians\tManue\tDECCA\t2255B\tDLA1629\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042755.mp3\tArtie Shaw And His Orchestra\tMany Dreams Ago\tBLUEBIRD\t10446\t042755-1\t1939\tVocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3b/Blu042755-1.mp3\tArtie Shaw And His Orchestra\tMany Dreams Ago ? V H F\tBluebird\tB-10446\t042755-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/HITJ3.mp3\tMaxwell House Orch\tMany Happy Returns Of The D\tHit-Of-The-Week\tJ3\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BRULA1042.mp3\tBing Crosby\tMany Happy Returns Of The Day\tBRUNSWICK\t6145\tLA1042\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_031.mp3\tBing Crosby\tMany Happy Returns Of The Day\tBRUNSWICK\t6145\tLA1042\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_423.mp3\tPercy Faith And His Orchestra\tMany Times\tCOLUMBIA\t40066\tCO49714\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_027.mp3\tEddie Fisher\tMany Times\tRCA Victor\t5453\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-5453x.mp3\tEddie Fisher\tMany Times I've Wandered\tRCA\t20-5453\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE16074.mp3\tVernon Dalhart\tMany, Many Years Ago\tBRUNSWICK\t2924\tE16074\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_183.mp3\tRudy Vallee And His Connecticut Yankees\tMaori\tColumbia\t2700\tW152256-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152256-2.mp3\tRudy Vallee Connect.yankees\tMaori\tCOLUMBIA\t2700 D\tW152256-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/Col73557-1.mp3\tDuke Ellington And His Famous Orchestra\tMaori\tColumbia\tFDC 1022\t73557-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE32448.mp3\tDuke Ellington And His Orch\tMaori - A Samoan Dance\tBRUNSWICK\t6812\tE32448\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU73502-1.mp3\tNew Orleans Feetwarmers\tMaple Leaf Rag\tBLUEBIRD\t7614\t73502-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3805-B.mp3\tFrankie Carle\tMaple Leaf Rag\tRCA\t20-3805\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3805-B.mp3\tFrankie Carle And His Orch\tMaple Leaf Rag\tRCA Victor\t20-3805-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9463-A.mp3\tEarl Hines & His Orchestra\tMaple Leaf Rag\tDECCA\t218B\tC9463-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC02172.mp3\tTommy Dorsey & His Orch\tMaple Leaf Rag\tVICTOR\t25496\t02172\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG11358-B.mp3\tNew Orleans Rhythm Kings\tMaple Leaf Rag\tGENNETT\t5104\tG11358-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75988.mp3\tEddie Condon & His Orchestra\tMaple Leaf Rag\tDECCA\t27035\t75988\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_023.mp3\tU.s. Marine Band\tMaple Leaf Rag\tVICTOR\t4911\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA811.mp3\tAugie Goupil's Royal Tahitians\tMarcelle Vahine\tDECCA\t1326\tDLA811\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63423.mp3\tBob Crosby And His Bobcats\tMarch Of The Bobcats\tDECCA\t1865B\t63423\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478350.mp3\tJan August  With Jerry Murad And The Harmonicats\tMarch Of The Sardar\tMERCURY\t\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC041534.mp3\tTommy Dorsey & His Orch\tMarch Of The Toys\tVICTOR\t26346\t041534\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_226.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tMarch Of The Toys\tVICTOR\t26346\t041534\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL16842.mp3\tRuth Etting\tMarch Winds And April Showers\tCOLUMBIA\t3014 D\t16842\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1918.mp3\tBing Crosby - J.s.trotter\tMarcheta\tDECCA\t3133B\tDLA1918\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC036837.mp3\tTommy Dorsey & His Orch\tMarcheta\tVICTOR\t26628\t036837\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU67556-1.mp3\tEddie South & His Orch\tMarcheta\tBLUEBIRD\t10138\t67556-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU10556.mp3\tIsham Jones & His Orch\tMarcheta\tBRUNSWICK\t2439\t10556\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_062.mp3\tOlive Kline And Elsie Baker\tMarcheta\tVICTOR\t45309\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_095.mp3\tBen Bernie And His Orchestra\tMarching Along Together\tCOLUMBIA\t2804\tW152461-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh013.mp3\tThe Bbc Dance Orchestra Dir. By Henry Hall\tMarching Along Together\tColumbia\tCB-535\tCA-13247-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022920.mp3\tTommy Dorsey & His Orch\tMarching Along With Time\tVICTOR\t25862\t022920\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480872.mp3\tCarmen Miranda And The Bando Da Lua\tMarchinha Do Grande Gallo (co-co-co-co-co-co-ro)\tDECCA\t23131-A\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S82.mp3\tJoe Turner\tMardi Gras Boogie\tMGM\t10274\t48S82\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU025476.mp3\tBenny Goodman And His Orchestra\tMargie\tBLUEBIRD\t10973B\t025476\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15164.mp3\tClaude Hopkins And His Orch\tMargie\tBRUNSWICK\t6916\t15164\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63133.mp3\tJimmie Lunceford And His Orch\tMargie\tDECCA\t1617\t63133\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/TEMTR-652-B.mp3\tBrother Bones And His Shadows\tMargie\tTempo\tTR-652-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC81094-1.mp3\tCab Calloway & His Orchestra\tMargie\tVICTOR\t24659\t81094-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_006.mp3\tEddie Cantor\tMargie\tEMERSON\t10301\t41534-1\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL421.mp3\tErroll Garner Trio\tMargie\tATLANTIC\t672\t421\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM281-1.mp3\tBilly Kyle Swing Club Band\tMargie\tVARIETY\tI531\tM281-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79546-2.mp3\tTed Lewis & His Band\tMargie\tCOLUMBIA\tA-3351\t79546-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE27625.mp3\tRed Nichols & His Orch\tMargie\tBRUNSWICK\t3961\tE27625\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79461-3.mp3\tFrank Crumit\tMargie\tCOLUMBIA\tA-3332\t79461-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-117-1.mp3\tAndr Ekyan (with Django Reinhardt)\tMargie\tSWING\t194\tOSW-117-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-141-1.mp3\tNol Chiboust Et Son Orchestre (with Django Reinhardt)\tMargie\tSWING\t97\tOSW-141-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU16973-1.mp3\tDuke Ellington's Orch\tMargie\tBRUNSWICK\t7526\t16973-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/EME41534-1.mp3\tEddie Cantor\tMargie\tEMERSON\t10301\t41534-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6916.mp3\tClaude Hopkins & His Orchestra\tMargie\tBrunswick\t6916\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiEME10301.mp3\tEddie Cantor\tMargie\tEMERSON\t10301\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM1712-A.mp3\tThe Dutch Swing College Band\tMargie\tDecca\tM32610\tAM1712-A\t1949\tobligingly provided by Louis P. W. E\nhttp://www.jazz-on-line.com/a/mp3w/1921_036.mp3\tTed Lewis And His Band\tMargie\tCOLUMBIA\tA-3351\t79546-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU4537.mp3\tGene Rodemich And His Orchestra\tMargie\tBRUNSWICK\t2060A\t4537\t1921\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3w/1921_085.mp3\tFrank Crumit\tMargie\tCOLUMBIA\tA-3332\t79461-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63133-A.mp3\tJimmie Lunceford And His Orchestra\tMargie\tDecca\t1617\t63133-A\t1938\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3d/Vic81094-1.mp3\tCab Calloway And His Cotton Club Orchestra\tMargie\tVictor\t24659\t81094-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Col25471-1.mp3\tMarie Lou Williams With Andy Kirk\tMargie\tColumbia\t\t25471-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/MajT-880.mp3\tJimmie Lunceford And His Orchestra\tMargie\tMajestic\t1103\tT-880\t1946\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480705.mp3\tBenny Goodman Trio\tMargie\tBlue Disc\tT1016\t20336-3\t1954\tBenny Goodman (cl), Mel Powell (p), Eddie Grady (dm)\nhttp://www.jazz-on-line.com/a/mp3b/VIC24581-5.mp3\tOriginal Dixieland Jazz Band\tMargie - Singin' The Blues\tVICTOR\t18717A\t24581-5\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG11536-A.mp3\tNew Orlean Rhythm Kings\tMarguerite\tGENNETT\t5217\tG11536-A\t1923\t\nhttp://www.78-tours.net/mp3/POL6556.mp3\tRay Ventura Et Son Orchestre\tMaria De Bahia Du Film \"mademoiselle S'amuse\"\tPOLYDOR\t6.556-2LPP\t560.014\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU063704.mp3\tTony Pastor And His Orch\tMaria Elena\tBLUEBIRD\t11127\t063704\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC053418.mp3\tWayne King And His Orch\tMaria Elena\tVICTOR\t26767\t053418\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30237-1.mp3\tGene Krupa & His Orch\tMaria Elena\tOKEH\t6165\t30237-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D238B.mp3\tDick Haymes With Harry James\tMaria Elena\tV-DISC\t238B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_006.mp3\tJimmy Dorsey And His Orchestra\tMaria Elena\tDecca\t3698\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478351.mp3\tEdmundo Ros And His Rumba Band\tMaria Elena\tPARLOPHONE\t\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18806B.mp3\tJimmy Dorsey & His Orch\tMaria Elena (vbe)\tDECCA\t18806B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE30546.mp3\tLouisiana Rhythm Kings\tMarianne\tVOCALION\t15833B\tE30546\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_171.mp3\tArden-ohman Orchestra Feat. Revelers, The\tMarianne\tVICTOR\t21776\t47783-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-30546.mp3\tLouisiana Rhythm Kings\tMarianne\tVocalion\t15833\tE-30546\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC04534-1.mp3\tTommy Dorsey And His Orch\tMarie\tVICTOR\t25523-B\t04534-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67531.mp3\tLouis Armstrong & Mills Bros\tMarie\tDECCA\t3291A\t67531\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80122-3.mp3\tTed Lewis & His Band\tMarie\tCOLUMBIA\tA-3538\t80122-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99359.mp3\tBoots And His Buddies\tMarie\tBLUEBIRD\t6307\t99359\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/JUB5128x.mp3\tFour Tunes\tMarie\tJUBILEE\t5128\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3336.mp3\tDon Byas Qt\tMarie\tSAVOY\t627\tS3336\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_063.mp3\tTed Lewis And His Band\tMarie\tCOLUMBIA\tA-3538\t80122-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_025.mp3\tRudy Vallee And His Connecticut Yankees\tMarie\tHARMONY\t834-H\t147853\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_019.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard And Bunny Berigan\tMarie\tVICTOR\t25523-B\t04534-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_083.mp3\tFour Tunes Feat. Sid Bass Orchestra\tMarie\tJUBILEE\t5128\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/Col152666-2.mp3\tClaude Hopkins And His Orchestra\tMarie\tColumbia\t2904-D\t152666-2\t1934\t\nhttp://www.78-tours.net/mp3/COLCL7967.mp3\tOrchestre Jacques Hlian\tMarie (petit Bguin Du Mois De Mai)\tCOLUMBIA\tDF 3006\tCL 7967\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152666.mp3\tClaude Hopkins & His Orch\tMarie (v Orlando Robertson)\tCOLUMBIA\t2904 D\tW152666\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68834.mp3\tJimmy Dorsey And His Orch.\tMarie Elena\tDECCA\t3698A\t68834\t1941\t\nhttp://www.78-tours.net/mp3/PATCPT7786.mp3\tJacques Helian Et Son Orchestre Chant : Claude Evelyne Et Jean Marco\tMarie-blanche\tPATH\tPG 440\tCPT 7786\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_176.mp3\tRay Anthony Feat. Tommy Mercer And The Skyliners:\tMarilyn\tCapitol\t2207\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D266B2.mp3\tJimmie Lunceford And His Orchestra\tMarilyn Comes On\tV-DISC\t266B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_441.mp3\tMarimba Chiapas\tMarimba Charleston\tCapitol\t3447\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_080.mp3\tBlue And White Marimba Band\tMarimba March\tVICTOR\t17928B\t16767-5\t1916\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055098-1.mp3\tArtie Shaw And His Orchestra\tMarinela\tVictor\t27362\t055098-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC27362-B.mp3\tArtie Shaw And His Orchestra\tMarinella\tVICTOR\t27362-B\t055098-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18671.mp3\tRachel Grant & Billy Murray\tMarion\tVICTOR-\t18671\t23981-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC23981-1.mp3\tRachel Grant & Billy Murray\tMarion\tVICTOR\t18671\t23981-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66246.mp3\tBlue Lu Barker & Fly Cats\tMarked Woman\tDECCA\t7648\t66246\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC69360-1.mp3\tJimmie Davis\tMarket House Blues\tVICTOR\t23620\t69360-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVB909-6.mp3\tCharlie Parker\tMarmaduke\tSAVOY\t311\tB909-6\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_402.mp3\tTeddi King\tMarried I Can Always Get\tRCA\t6660\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLSA2872.mp3\tNite Owls\tMarried Man Blues\tCOLUMBIA\t20295\tSA2872\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/MER1811.mp3\tHelen Humes W Buck Clayton Or\tMarried Man Blues\tMERCURY\t8088\t1811\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S216.mp3\tJoe Turner\tMarried Woman Blues\tMGM\t10492\t48S216\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67027.mp3\tArthur Tracy\tMarta\tDECCA\t2967B\t67027\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC019656-1.mp3\tLarry Clinton And His Orchestra\tMartha\tVICTOR\t25789\t019656-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_028.mp3\tLarry Clinton And His Orchestra Feat. Bea Wain\tMartha\tVICTOR\t25789\t019656-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_121.mp3\tEnrico Caruso And Frances Alda And Marcel Journet\tMartha - Quartetto Nocturno (good Night Quartet)\tVICTOR\t95210\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC055533-2.mp3\tLionel Hampton & His Orch\tMartin On Every Block\tVICTOR\t26739\t055533-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic055533-2.mp3\tLionel Hampton And His Orchestra\tMartin On Every Block\tVictor\t26739\t055533-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW145477.mp3\tPaul Ash And His Orchestra\tMary\tCOLUMBIA\t1256 D\tW145477\t1928\tDanny Polo, clarinet, alto & baritone saxes, replaces Wing or Nettles; Hank Winston, piano replaces Barris. Danny polo omitted; possibly Joe Tarto, brass bass, v Irving Kaufman, New York, January 4th 1928\nhttp://www.jazz-on-line.com/a/mp3e/V-D388A.mp3\tGeorge Paxton And His Orchestra\tMary - Louise - Margie\tV-DISC\t388A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400082-B.mp3\tDorsey Brothers Orchestra\tMary Ann\tOKeh\t40995\t400082-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW145459.mp3\tUkelele Ike (cliff Edwards)\tMary Ann\tCOLUMBIA\t1295 D\tW145459\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_106.mp3\tTed Lewis And His Band\tMary Ann\tCOLUMBIA\t1313 D\tW145552-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_027.mp3\tCliff Edwards\tMary Ann\tCOLUMBIA\t1295 D\tW145459\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26589.mp3\tHenry Burr\tMary Dear\tVICTOR\t18955\t26589\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16698.mp3\tLeadbelly (h.ledbetter)\tMary Dont You Weep\tARC\t(Reject)\t16698\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC19646.mp3\tPutney Dandridge\tMary Had A Little Lamb\tARC\tVO3287\t19646\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC1376.mp3\tTeddy Wilson & His Orch\tMary Had A Little Lamb\tBRUNSWICK\t7673\tC1376\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102003-1.mp3\tWillie Bryant & His Orch\tMary Had A Little Lamb\tBLUEBIRD\t6435\t102003-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67668.mp3\tThree Peppers\tMary Had A Little Lamb\tDECCA\t8508B\t67668\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic100561-1.mp3\tFletcher Henderson And His Orchestra\tMary Had A Little Lamb\tVictor\tLPM-10019\t100561-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC25341-A.mp3\tTommy Dorsey And His Orchestra Vocal Refrain By Edythe Wright\tMary Had A Little Lamb (mara Tena Un Corderito)\tVICTOR\t25341\t25341-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU57313-3.mp3\tBennie Moten's Kansas City Or.\tMary Lee\tBLUEBIRD\t6638\t57313-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC92031.mp3\tRice Brothers Gang\tMary Lou\tDECCA\t5870\tC92031\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC17175-1.mp3\tVic Berton And His Orchestra\tMary Lou\tVOCALION\t2944\t17175-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18384-5.mp3\tAbe Lyman & His Orch\tMary Lou (vck)\tBRUNSWICK\t3135\t18384-5\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic17130.mp3\tAmerican Quartet\tMary Was My Mother's Name\tVictor\t17130\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_120.mp3\tAmerican Quartet\tMary Was My Mother's Name\tVictor\t17130\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2446.mp3\tBing Crosby\tMary's A Grand Old Name\tDECCA\t18360A\tDLA2446\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_091.mp3\tHarry Belafonte\tMary's Boy Child\tRCA Victor\t6735\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64783.mp3\tAndy Kirk And Clouds Of Joy\tMary's Idea\tDECCA\t2326B\t64783\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64783-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tMary's Idea\tDecca\t2326\t64783-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/BruC-4473.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tMary's Idea\tBrunswick\t4863\tC-4473\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_110.mp3\tHenry Burr\tMary, Dear\tVICTOR\t18955\t26589\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_037.mp3\tCharles Harrison\tMary, You're A Little Bit Old-fashioned\tVICTOR\t17638\t15029-7\t1914\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE17975.mp3\tSix Jumping Jacks\tMasculine Women\tBRUNSWICK\t3095\tE17975\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru71244-A.mp3\tLucky Millinder And His Orchestra\tMason Flyer\tBrunswick\t03406\t71244-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_030.mp3\tTed Black And His Orchestra\tMasquerade\tVictor\t24046\t73025-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU011942-1.mp3\tGolden Gate Jubilee Qt\tMassa's In The Cold, Cold Ground\tBLUEBIRD\t7264\t011942-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/OKECO33001.mp3\tGene Krupa & His Orch\tMassachusetts\tOKEH\t6696\tCO33001\t1942\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481108.mp3\tGene Krupa Orch. Feat. Anita O'day\tMassachusetts\tOkeh\t6695\t33001-1\t1942\tAl Beck, Mickey Mangano, Norman Murphy, Roy Eldridge (tp), Babe Wagner, Tommy Pederson, Greg Phillips (tb), Ben Feman, Rex Kittig, Jimmy Migliore (as), Sam Musiker (cl, ts), Don Brassfield (ts), Joe Springer (p), Teddy Walters (g), Ed Mihelich (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3a/PARP4424.mp3\tBlind Lemon Jefferson\tMatch Box Blues\tPARAMOUNT\t12474\tP4424\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70032-B.mp3\tSam Price's Texas Blusicians\tMatch Box Blues\tDECCA\t8624\t70032-B\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_270.mp3\tBuddy Clark Feat. O/mitchell Ayres\tMatinee\tCOLUMBIA\t38083\tCO38616\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26150.mp3\tSlim & Slam\tMatzoh Balls\tCBS\tVO5301\t26150\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VEL1826-Vx.mp3\tFrank Ferera's Hawaiian Trio\tMaui Chimes\tVelvet Tone\t1826-V\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/Gen14859-B.mp3\tPat Dollohan And His Orchestra\tMay Be This Is Love\tGennett\t6784\t14859-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BANLA137-A.mp3\tBing Crosby\tMay I\tBANNER\t33200\tLA137-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC81757-2.mp3\tEddy Duchin & His Orch\tMay I\tVICTOR\t24591\t81757-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3/Joh004.mp3\tBing Crosby Acc. By Nat W. Finston\tMay I ?\tJohnW\t004\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh004.mp3\tRoy Fox And His Band\tMay I ? (v Denny Dennis)\tDecca\tF-3981\tTB-1189-1-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC02169-3.mp3\tTommy Dorsey & His Orch\tMay I Have The Next Romance With You?\tVICTOR\t25487\t02169-3\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_188.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tMay I Have The Next Romance With You?\tVICTOR\t25487\t02169-3\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_148.mp3\tLud Gluskin And His Orchestra\tMay I Have The Next Romance?\tBRUNSWICK\t7788\t20244-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_136.mp3\tBob Chester And His Orchestra\tMay I Never Love Again\tBLUEBIRD\t10904\t058166\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_269.mp3\tEileen Barton\tMay I Take Two Giant Steps\tNATIONAL\t\tNSC571\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/BRULA137.mp3\tBing Crosby\tMay I?\tBRUNSWICK\t6853\tLA137\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA137-B.mp3\tNat.  W.  Finston  And  His  Paramount  Orchestra\tMay I?\tColumbia\t\tLA137-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA137-A.mp3\tNat.  W.  Finston  And  His  Paramount  Orchestra\tMay I?\tColumbia\tDB2059\tLA137-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_238.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tMay I?\tVICTOR\t24591\t81757-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5580.mp3\tFrankie Laine\tMay The Good Lord Bless And Keep You\tMERCURY\t5580\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S6033.mp3\tHank Williams\tMay You Never Be Alone\tMGM\t10609\t49S6033\t\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81474-2.mp3\tThe Georgians\tMaybe\tColumbia\t70-D\t81474-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20417-B.mp3\tFranklyn Baur\tMaybe\tVICTOR\t20417\t37119\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26874-A.mp3\tGene Krupa & His Orch\tMaybe\tCBS\toK5643\t26874-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC76837.mp3\tElla Fitzgerald\tMaybe\tDECCA\t27371\t76837\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67863.mp3\tInk Spots\tMaybe\tDECCA\t3258-B\t67863\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1776.mp3\tBing Crosby & Victor Young Or.\tMaybe\tDECCA\t2874B\tDLA1776\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_116.mp3\tDinah Shore\tMaybe\tBluebird\t10793\t51564\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_012.mp3\tInk Spots\tMaybe\tDECCA\t23634B\t67863-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_137.mp3\tBobby Byrne And His Orchestra (voc Jimmy Palmer)\tMaybe\tDecca\t3392A\t67941\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_026.mp3\tPerry Como And Eddie Fisher Feat. Mitchell Ayres Orchestra\tMaybe\tRCA Victor\t4744\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic53587-3.mp3\tGene Austin\tMaybe ! Who Knows\tVictor\t22033\t53587-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh172.mp3\tJoe Loss And His Band\tMaybe (v Paula Greene)\tHMV\tBD-5637\tOEA-8955-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol1854-D.mp3\tTed Lewis & His Band\tMaybe - Who Knows\tColumbia\t1854-D\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/ARCB-13062-A.mp3\tEarl Hines And His Orch\tMaybe I'm To Blame\tARC\tBR9407\tB-13062-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-13062-A-B.mp3\tEarl Hines And His Orchestra With Valaida Snow, Vocal\tMaybe I'm To Blame\tBrunswick\tA-9407\tB-13062-A-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA73-A.mp3\tBing Crosby W George Stoll\tMaybe I'm Wrong Again\tDECCA\t309B\tDLA73-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA73-A.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tMaybe I'm Wrong Again\tDecca\t309\tDLA73-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA73-B.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tMaybe I'm Wrong Again\tDecca\t\tDLA73-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh021.mp3\tRoy Fox And His Band\tMaybe I'm Wrong Again (v Denny Dennis)\tDecca\tF-5512\tGB-7063-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75221.mp3\tLouis Armstrong - Sy Oliver\tMaybe It's Because\tDECCA\t24751\t75221\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/COLHCO3711.mp3\tBob Crosby\tMaybe It's Because\tCOLUMBIA\t38504\tHCO3711\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24650x.mp3\tDick Haymes\tMaybe It's Because\tDECCA\t24650\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_051.mp3\tDick Haymes\tMaybe It's Because\tDECCA\t24650\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_076.mp3\tEddy Howard And His Orchestra\tMaybe It's Because\tMERCURY\t5314\t2750-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_219.mp3\tBob Crosby And His Orchestra Feat. Marion Morgan\tMaybe It's Because\tCOLUMBIA\t38504\tHCO3711\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1116.mp3\tSam Lanin's Dance Ensemble\tMaybe It's Love\tHit-Of-The-Week\t1116\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_201.mp3\tJoni James\tMaybe Next Time\tMGM\t11696\t53S6195\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/Mon62996.mp3\tAllen Brothers\tMaybe Next Week Sometime\tMontgomeryWard\t4439\t62996\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiMon4439.mp3\tAllen Brothers\tMaybe Next Week Sometime (part 1)\tMontgomery Ward\t4439\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu5700.mp3\tAllen Brothers\tMaybe Next Week Sometime (part 2)\tBluebird\t5700\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU62996.mp3\tAllen Brothers\tMaybe Next Week Sometime Pt.2\tBLUEBIRD\t5700\t62996\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc13567.mp3\tHazel Meyers\tMaybe Someday\tVocalion\t14861\t13567\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4366.mp3\tGordon Jenkins Orch\tMaybe You'll Be There\tDECCA\t23864\tL4366\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC24403x.mp3\tGordon Jenkins And His Orch\tMaybe You'll Be There\tDECCA\t24403\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COL148807-3.mp3\tKate Smith\tMaybe, Who Knows\tCOLUMBIA\tHA0970\t148807-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/CHE1604x.mp3\tChuck Berry\tMaybellene\tCHESS\tCHES1604\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_040.mp3\tChuck Berry And His Combo\tMaybellene\tChess\t1604 A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1074.mp3\tEffros-faberman-klein-berigan\tMcconville-lewis-brilhart-yorks-abbott-landau\tHIT OF THE WEEK\t\t1074\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1133.mp3\tGene Ammons Rhythm Kings\tMcdougal's Sprout\tMERCURY\t8062\t1133\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC71053.mp3\tAndy Kirk And Clouds Of Joy\tMcghee Special\tDECCA\t4405B\t71053\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71053-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tMcghee Special\tDecca\t4405\t71053-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC73219.mp3\tBing Crosby And Jesters\tMcnamara's Band\tDECCA\t23495A\t73219\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63935.mp3\tChick Webb & His Orchestra\tMcpherson Is Rehearsin'\tDECCA\t2080B\t63935\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_276.mp3\tElla Fitzgerald Feat. Chick Webb Orchestra\tMcpherson Is Rehearsin' To Swing\tDECCA\t2080\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL107MS.mp3\tJay Mcshann & His Jazzmen\tMcshann's Boogie Blues\tALLADDIN\t107\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65463.mp3\tLouis Armstrong & His Orch.\tMe And Brother Bill\tDECCA\t2538B\t65463\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU040475.mp3\tEarl Hines & His Orch\tMe And Columbus\tBLUEBIRD\t10467\t040475\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_253.mp3\tJohnny Green And His Orchestra\tMe And Marie\tBRUNSWICK\t7521\t18050-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3765.mp3\tMemphis Minnie\tMe And My Chauffer\tOKEH\t6288\tC3765\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70187.mp3\tMabel Robinson\tMe And My Chauffeur\tDECCA\t8601\t70187\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146897-3.mp3\tBessie Smith\tMe And My Gin\tCOLUMBIA\t14384 D\tW146897-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE32497-1.mp3\tGene Krupa & His Orch\tMe And My Melinda\tOKEH\t6619\t32497-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/VARW140-2.mp3\tBunny Berigan & His Orch\tMe And My Melinda (v Danny Richards)\tVARSITY\tEL5019B\tW140-2\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDiv2412.mp3\tThe Astorites\tMe And My Shadow\tDiva\t2412\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC38704-3.mp3\tJack Smith And His Orch\tMe And My Shadow\tVICTOR\t20626\t38704-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR412-Hy.mp3\tAstorites\tMe And My Shadow\tHarmony\t412-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_055.mp3\tNat Shilkret And The Victor Orchestra Feat. Johnny Marvin\tMe And My Shadow\tVICTOR\t20675A\t38399-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_195.mp3\tJohnny Marvin\tMe And My Shadow\tDECCA\t5891\tDLA2152\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38399-4.mp3\tNat Shilkret & His Orch\tMe And My Shadow (v J M)\tVICTOR\t20675A\t38399-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39581-A.mp3\tCleo Brown\tMe And My Wonderful One\tDECCA\t486A\t39581-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_189.mp3\tCleo Brown\tMe And My Wonderful One\tDECCA\t486A\t39581-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB403.mp3\tCount Basie & His Orchestra\tMe And The Blues\tRCA\t20-2127\tD7VB403\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT977.mp3\tMildred Bailey W Ellis Larkin\tMe And The Blues\tMAJESTIC\t1093\tT977\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_052.mp3\tJane Green\tMe And The Boy Friend\tVICTOR\t19502\t31402-5\t1925\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUE-29779.mp3\tRoy Ingraham And His Orchestra\tMe And The Clock\tBRUNSWICK\t4366\tE-29779\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/EDI19199-C.mp3\tOreste And His Queensland Orch\tMe And The Clock (vrollickers)\tEDISON\t52592\t19199-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA2359.mp3\tFred Astaire Acc Perry Botkin\tMe And The Ghost Upstairs\tCOLUMBIA\t35815\tLA2359\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49169-3.mp3\tTed Weems & His Orch\tMe And The Man In The Moon\tVICTOR\t21809\t49169-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW147158.mp3\tCliff Edwards 'ukelele Ike'\tMe And The Man In The Moon\tCOLUMBIA\t1705 D\tW147158\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUE28660.mp3\tArnold Johnson & His Orch\tMe And The Man In The Moon\tBRUNSWICK\t4125\tE28660\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/Gen14483.mp3\tBob Mcgowan And His Orchestra\tMe And The Man In The Moon\tGennett\t6709\t14483\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCC2667.mp3\tAmbassadors\tMe And The Man In The Moon\tVOCALION\t15752\tC2667\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_223.mp3\tCliff Edwards\tMe And The Man In The Moon\tCOLUMBIA\t1705 D\tW147158\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19540.mp3\tHal Kemp & His Orch\tMe And The Moon\tBRUNSWICK\t7707\t19540\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA589.mp3\tBing Crosby & V.young Orch\tMe And The Moon\tDECCA\t912A\tDLA589\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61248-A.mp3\tJimmie Lunceford And His Orchestra\tMe And The Moon\tDecca\t915\t61248-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA589-A.mp3\tVictor Young And His Orchestra With Dixie Lee Crosby, Vocal\tMe And The Moon\tDECCA\t912A\tDLA589-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61248-A.mp3\tJimmie Lunceford And His Orchestra\tMe And The Moon.mp3\tDecca\t915\t61248-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC049017.mp3\tDuke Ellington & His Orch\tMe And You\tVICTOR\t26598\t049017\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12379-A.mp3\tConnie Boswell\tMe Minus You\tBRUNSWICK\t6405\t12379-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR105831.mp3\tFletcher Henderson's Orch.\tMe Neenyah\tHARMOGRAPH\t1020\t105831\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0200_01.mp3\tLee Morse\tMe Neenyah\tPathe\t032103A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol704-D.mp3\tCalifornia Ramblers\tMe Too\tColumbia\t704-D\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE37004.mp3\tBen Bernie & His Orch\tMe!\tBRUNSWICK\t6166\tE37004\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_129.mp3\tBen Bernie And His Orchestra\tMe!\tBRUNSWICK\t6166\tE37004\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS21249-2.mp3\tBillie Holiday & Her Orch\tMe, Myself And I\tCBS\tVO3593\t21249-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62036.mp3\tBob Howard & His Orch\tMe, Myself And I\tDECCA\t1205\t62036\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_241.mp3\tTex Beneke And His Orchestra\tMeadowlands\tRCA Victor\t2898\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/COL22675-1.mp3\tBlind Boy Fuller\tMean And No Good Woman\tCOLUMBIA\t37781\t22675-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE23755.mp3\tRed Nichols & His 5 Pennies\tMean Dog Blues\tBRUNSWICK\t3597\tE23755\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT828.mp3\tSlim Gaillard Trio\tMean Mama Blues\tMAJESTIC\t9006\tT828\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4485.mp3\tKarl Davis And Harty Taylor\tMean Mean Mama\tCOLUMBIA\t20353\tCCO4485\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU80604.mp3\tTampa Red\tMean Mistreater Blues\tBLUEBIRD\t5546\t80604\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70189.mp3\tGene Kardos & His Orch\tMean Music (v D R)\tVICTOR\t22790\t70189\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144796-3.mp3\tBessie Smith\tMean Old Bed Bug Blues\tCOLUMBIA\t14250 D\tW144796-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe81214-A.mp3\tLonnie Johnson\tMean Old Bedbug Blues\tOKeh\t8497\t81214-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN6348-A.mp3\tHollywood Dance Orch\tMean To Me\tBanner\t6348-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLB21120.mp3\tTeddy Wilson And His Orch\tMean To Me\tCOLUMBIA\t35926\tB21120\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO43829.mp3\tSarah Vaughan\tMean To Me\tCOLUMBIA\t38899\tCO43829\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148030-2.mp3\tRuth Etting\tMean To Me\tCOLUMBIA\t1762 D\tW148030-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89084MTM.mp3\tIllinois Jacquet\tMean To Me\tMERCURY\t89084\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYCB323.mp3\tBill Harris Septet\tMean To Me\tKEYNOTE\t618\tCB323\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_031.mp3\tRuth Etting\tMean To Me\tCOLUMBIA\t1762 D\tW148030-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_130.mp3\tHelen Morgan\tMean To Me\tVictor\t21930\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-7838-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tMean To Me\tParlophone\tF-631\tCE-7838-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/ConW-3327.mp3\tSarah Vaughan\tMean To Me\tContinental\t6024\tW-3327\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480589.mp3\tArt Tatum\tMean To Me\tVerve\tMGV-8347\t2195-1\t1955\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3t/TS480648.mp3\tBenny Goodman\tMean To Me\tCapitol\tT441\t1842-2\t1947\tBenny Goodman (cl) acc. by Jimmy Rowles (p)\nhttp://www.jazz-on-line.com/a/mp3w/1955_012b.mp3\tLes Baxter And His Orchestra\tMedic\tCapitol\t3055\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/DECAM178.mp3\tColeman Hawkins Orchestra\tMeditation\tDECCA\t742A\tAM178\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS266.mp3\tMeade Lux Lewis\tMedium Boogie\tDISC\t6020\t266\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh130.mp3\tJack Hylton Orchestra\tMedley\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D123-A.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tMedley (goin' Home, Honeysuckle Rose, My Blue Heaven)\tV-Disc\t123-A\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh038.mp3\tCarroll Gibbons And The Boyfriends\tMedley (incl. Coffee In The Morning)\t\t\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1441.mp3\tSweet Violet Boys\tMedley Of Bar Room Songs\tVOCALION\t3281\tC1441\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW255005-2.mp3\tFrankie Trumbauer & H.o.\tMedley Of Isham Jones Dance Hits\tCOLUMBIA\t18002D\tW255005-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3o/GRE255005-2.mp3\tIsham Jones\tMedley Of Isham Jones Hits\tGREYGULL\tCO18002\t255005-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042933.mp3\tColeman Hawkins & His Orch.\tMeet Doctor Foo\tBLUEBIRD\t10477\t042933\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1288.mp3\tKing Cole Trio\tMeet Me At No Special Place\tCAPITOL\t393\t1288\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB653-1.mp3\tCount Basie & His Orchestra\tMeet Me At No Special Place\tRCA\t20-2262\tD7VB653-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_025.mp3\tFrank Stanley And Byron G. Harlan\tMeet Me In Rose-time, Rosie\tCOLUMBIA\tA-0630\t03979\t1909\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3390.mp3\tJudy Garland - G.stoll\tMeet Me In St Louis, Louis\tDECCA\t23360\tL3390\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_191.mp3\tGuy Lombardo And His Royal Canadians\tMeet Me In St. Louis, Louis\tDecca\t18626\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_221.mp3\tJudy Garland\tMeet Me In St. Louis, Louis\tDECCA\t23360\tL3390\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_268.mp3\tHenry Allen And His Orchestra\tMeet Me In The Moonlight\tVOCALION\t3574\t21071-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_006.mp3\tHenry Burr\tMeet Me To-night In Dreamland\tCOLUMBIA\t905\t4658\t1910\t\nhttp://www.jazz-on-line.com/a/mp3a/COL4658.mp3\tHenry Burr (tenor)\tMeet Me Tonight In Dreamland\tCOLUMBIA\tA-0905\t4658\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/COM22831.mp3\tEddy Condon Windy City 7\tMeet Me Tonight In Dreamland\tCOMMODORE\t505\t22831\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_038.mp3\tElizabeth Wheeler And Harry Anthony\tMeet Me Tonight In Dreamland\tEDISON\t10290\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_253.mp3\tJimmie Davis Feat. Charles Mitchell And His Texans\tMeet Me Tonight In Dreamland\tDECCA\t5616\t64563\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2193x.mp3\tLes Paul\tMeet Mister Callaghan\tCAPITOL\t\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_250.mp3\tCarmen Cavallaro And His Orchestra\tMeet Mr Callaghan\tDECCA\t28373\t83229\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_084.mp3\tHarry Grove Trio\tMeet Mr. Callaghan\tLondon\t1248\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63157.mp3\tEdgar Hayes & His Orchestra\tMeet The Band\tDECCA\t1940B\t63157\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1981.mp3\tBing Crosby\tMeet The Sun Half Way\tDECCA\t3162B\tDLA1981\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3359-1.mp3\tCarter Family\tMeeting In The Air\tOKEH\t5931\tC3359-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU443.mp3\tMeade Lux Lewis\tMelancholy\tBLUENOTE\t001\t443\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74023.mp3\tEddie Condon & His Orchestra\tMelancholy Baby\tDECCA\t24218A\t74023\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe80862-A.mp3\tLouis Armstrong's Hot Five\tMelancholy Blues\tOKeh\t8496\t80862-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140758-1.mp3\tThe Little Ramblers\tMelancholy Lou\tCOLUMBIA\t423D\t140758-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3o/KIR140758-1.mp3\tLittle Ramblers\tMelancholy Lou\tKIRKEBY\tCO0423D\t140758-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/VOCWM-1048-A.mp3\tBenny Carter And His Orchestra\tMelancholy Lullaby\tVOCALION\t4984\tWM-1048-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042662.mp3\tGlenn Miller And His Orchestra\tMelancholy Lullaby (vre)\tBLUEBIRD\t10423 A\t042662\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC85592.mp3\tElla Fitzgerald\tMelancholy Me\tDECCA\t29008\t85592\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_110.mp3\tEddy Howard And His Orchestra\tMelancholy Me\tMERCURY\t70304\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/54_255.mp3\tElla Fitzgerald\tMelancholy Me\tDECCA\t29008\t85592\t1954\t\nhttp://www.jazz-on-line.com/a/mp3d/BruLA1896.mp3\tMartha Raye With Dave Rose Orchestra \tMelancholy Mood \tBrunswick\t8394\tLA1896\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-25059-1.mp3\tHarry James And His Orchestra\tMelancholy Mood\tBrunswick\t8443\tB-25059-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS2-1.mp3\tJess Stacy & His Stars\tMelancholy Mood (v C D)\tVARSITY\t8064\tUS2-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_214.mp3\tJackie Gleason And His Orchestra\tMelancholy Serenade\tCAPITOL\t2361\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2611.mp3\tElla Fitzgerald & Her Orch\tMelinda The Mousie\tDECCA\t3968B\tDLA2611\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_021.mp3\tArthur Collins And Byron Harlan\tMelinda's Wedding Day\tVICTOR\t17295\t12872-1\t1913\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL259.mp3\tLee O'daniel Hillbilly Boys\tMellow Mountain Moon\tVOCALION\t4049\tDAL259\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-357-1.mp3\tDjango Reinhardt Et Son Orchestre\tMlodie Au Crpuscule\tSWING\t166\tOSW-357-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/VogST-1988.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tMelodie Au Crpuscule\tVogue\tLD668-30\tST-1988\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26913.mp3\tEddie South & His Orch\tMelodie In A\tCOLUMBIA\t35634\t26913\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480873.mp3\tConway's Band; Patrick Conway, Cond.\tMelodious Memories - Fragments Of Old Favorites (medley)\tVICTOR\t35600-B\tC-18053\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03992-1.mp3\tTommy Dorsey & His Orch\tMelody In F\tVICTOR\t25519\t03992-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS24026.mp3\tTeddy Wilson & His Orch\tMelody In F\tCBS\t(Reject)\t24026\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/TedP-24026-1.mp3\tTeddy Wilson And His Orchestra\tMelody In F\tTeddy Wilson School\t\tP-24026-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70516x.mp3\tDavid Carroll\tMelody Of Love\tMERCURY\t70516\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC053158-4.mp3\tWayne King And His Orch\tMelody Of Love\tVICTOR\t27713\t053158-4\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC87165.mp3\tThe Four Aces\tMelody Of Love\tDECCA\t29395\t87165\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_026.mp3\tFour Aces Featuring Al Alberts\tMelody Of Love\tDecca\t29395\t87165\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_019.mp3\tBilly Vaughn\tMelody Of Love\tDot\t15247\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_145.mp3\tFrank Sinatra And Ray Anthony And His Orchestra\tMelody Of Love\tCapitol\t3018\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_178.mp3\tLeo Diamond\tMelody Of Love\tRCA Victor\t5973\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_064.mp3\tDavid Carroll And His Orchestra\tMelody Of Love\tMercury\t70516\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_118.mp3\tHenry Burr\tMemories\tColumbia\t1923\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_299.mp3\tMindy Carson\tMemories Are Made Of This\tColumbia\t40573\tCO53784\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_008.mp3\tDean Martin\tMemories Are Made Of This\tCapitol\t3295\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_040.mp3\tGale Storm\tMemories Are Made Of This\tDot\t15436\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC45298-1.mp3\tGene Austin\tMemories Of France\tVICTOR\t21545\t45298-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_055.mp3\tGene Austin Feat. O/nat Shilkret\tMemories Of France\tVICTOR\t21545\t45298-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62827.mp3\tCasa Loma Orchestra\tMemories Of You\tDECCA\t1672\t62827\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26284.mp3\tBenny Goodman Sextet\tMemories Of You\tCOLUMBIA\t35320\t26284\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66463-B.mp3\tInk Spots\tMemories Of You\tDECCA\t2966A\t66463-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037630.mp3\tLionel Hampton & His Orch\tMemories Of You\tVICTOR\t26304A\t037630\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/ARA1044-B.mp3\tArt Tatum\tMemories Of You\tARA\t4501\tARA1044-B\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/APOS1103.mp3\tIllinois Jacquet & His Orch\tMemories Of You\tAPOLLO\t760\tS1103\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S476.mp3\tEddie Heywood\tMemories Of You\tMGM\t30634\t51S476\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MANS1182.mp3\tColeman Hawkins Septet\tMemories Of You\tMANOR\t1036\tS1182\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_183.mp3\tLouis Armstrong\tMemories Of You\tOKeh\t41463\t404412-D\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/CONS3283.mp3\tCozy Cole & His Orchestra\tMemories Of You\tCONTIN\tT6004\tS3283\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU63363-1.mp3\tDuke Ellington & His Orch\tMemories Of You\tBLUEBIRD\t6280\t63363-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5241.mp3\tTeddy Wilson Quintet\tMemories Of You\tMUSICRAFT\t318\t5241\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe405134.mp3\tGarland Wilson (piano)\tMemories Of You\tOKeh\t41556\t405134\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/COMP23234.mp3\tBud Freeman And His Gang\tMemories Of You\tCOMMODORE\t508\tP23234\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_168.mp3\tBenny Goodman Trio And Rosemary Clooney\tMemories Of You\tColumbia\t40616\tCO54296-1\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_354.mp3\tInk Spots\tMemories Of You\tDECCA\t2966A\t66463-B\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_342.mp3\tHugo Winterhalter And His Orchestra\tMemories Of You\tRCA Victor\t6339\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_160.mp3\tFour Coins\tMemories Of You\tEpic\t9129\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5761.mp3\tLionel Hampton And His Sextet\tMemories Of You\tDecca\t27374\tLA-5761\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic037630-1.mp3\tLionel Hampton And His Orchestra\tMemories Of You\tVictor\t26304\t037630-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/MER450-1.mp3\tErroll Garner Trio\tMemories Of You   \tMERCURY\t1033\t450-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480449.mp3\tArt Tatum/buddy Defranco Quartet\tMemories Of You\tVerve\tMGV8229\t2680-2\t1956\tBuddy De Franco (cl), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480759.mp3\tBig Sidney Catlett Quartet\tMemories Of You\tCommodore\tC1515\tA-4740-1\t1944\tBen Webster (ts) Marlowe Morris (p) John Simmons (b) Sidney Catlett (d)\nhttp://www.jazz-on-line.com/a/mp3a/VIC29695-4.mp3\tWaring's Pennsylvanians\tMemory Lane (w)\tVICTOR\t19303A\t29695-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41343-2.mp3\tBen Pollack & His Californians\tMemphis Blues\tVICTOR\t21184\t41343-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCMEM122.mp3\tSwift Jewel Cowboys\tMemphis Blues\tVOCALION\t5188\tMEM122\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS6010MP.mp3\tCliff Jackson & Don Frye\tMemphis Blues\tDISC\t6010\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_091.mp3\tArthur Collins And Byron Harlan\tMemphis Blues\tCOLUMBIA\tA-1721\t45564-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec38605-B.mp3\tFletcher Henderson And His Orchestra\tMemphis Blues\tDecca\t158\t38605-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/HMVOCS-450-2.mp3\tBenny Carter With Kai Ewans' Orchestra\tMemphis Blues\tHMV\t4698\tOCS-450-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DISD197.mp3\tCliff Jackson\tMemphis Blues\tDISC\t6010A\tD197\t1945\tW. C. Handy\nhttp://www.jazz-on-line.com/a/mp3c/VOCNN729.mp3\tFletcher Henderson & His Orch\tMemphis Bound\tVOCALION\t15030B\tNN729\t1925\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe9107-A.mp3\tJimmy Joy's St. Anthony's Hotel Orchestra\tMemphis Bound\tOKeh\t40388\t9107-A\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4669.mp3\tHoagy Carmichael\tMemphis In June\tDECCA\t24674\tL4669\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCMEM-93.mp3\tSwift Jewel Cowboys\tMemphis Oomph\tVOCALION\t5052\tMEM-93\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC41840-1.mp3\tMemphis Stompers\tMemphis Stomp\tVICTOR\t21641\t41840-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41742-2.mp3\tJimmie Rodgers\tMemphis Yodel\tVICTOR\t21636\t41742-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65439.mp3\tLeonard Feather Allstars\tMen Of Harlem - Tempo Di Jump (pete Brown)\tDECCA\t18118\t65439\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D141A2.mp3\tMilitary District Of Washington Band\tMen Of Ohio\tV-DISC\t141A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61256.mp3\tBob Howard & His Orch\tMendel's Son's Swing Song\tDECCA\t927B\t61256\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04934.mp3\tTommy Dorsey & His Orch\tMendelsohn's Spring Song\tVICTOR\t25539\t04934\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478352.mp3\tAlec Templeton\tMendelssohn Mows 'em Down\tVICTOR\t\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_270.mp3\tShep Fields And His Rippling Rhythm Orchestra\tMene Mene Tekel\tBluebird\t10546\t041765\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/MER1453.mp3\tCootie Williams & His Orch\tMercenary Papa\tMERCURY\t8168\t1453\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16107.mp3\t Austinallen\tMercy Mercy Blues\tARC\tVO2874z\t16107\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_257.mp3\tFrankie Laine\tMermaid\tCOLUMBIA\t39862\tZSP10235\t1952\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5896.mp3\tLionel Hampton And His Orchestra\tMerry Christmas Baby\tDecca\t27325\tLA-5896\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_167.mp3\tAndrews Sisters Feat. Guy Lombardo And His Royal Canadians\tMerry Christmas Polka\tDECCA\t24748\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DECLA5896.mp3\tLionel Hampton & His Orch\tMerry Christmas, Baby\tDECCA\t27325\tLA5896\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17408.mp3\tDuke Ellington's Orch\tMerry Go Round\tBRUNSWICK\t7440\t17408\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/PARP2624-2.mp3\tLovie Austin Blue Serenaders\tMerry Makers Twine\tPARAMOUNT\t12391\tP2624-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_071.mp3\tPrince's Orchestra\tMerry Widow Waltz\tCOLUMBIA\tA-2319\t77076\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_092.mp3\tDuke Ellington And His Famous Orchestra\tMerry-go-round\tBrunswick\t7440\t17408\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_221.mp3\tMills Blue Rhythm Band\tMerry-go-round\tCOLUMBIA\t3147 D\t19685\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-19685-1.mp3\tMills Blue Rhythm Band\tMerry-go-round\tColumbia\t3147-D\tCO-19685-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24624.mp3\tGuy Lombardo & His Orchestra\tMerry-go-round Waltz\tDECCA\t24624\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL6822.mp3\tBing Crosby & Bob Hope\tMerry-go-run-around\tDECCA\t28514\tL6822\t1952\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO69y.mp3\tTurk Murphy's Jazz Band\tMesa 'round\tGood Time Jazz\t69\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64615-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tMess-a Stomp\tDecca\t2204\t64615-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUKC591.mp3\tAndy Kirk's 12 Clouds Of Joy\tMess-a-stomp\tBRUNSWICK\t4694\tKC591\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/BruKC-591.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tMess-a-stomp\tBrunswick\t4694\tKC-591\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S81.mp3\tJoe Turner\tMessin' Around\tMGM\t10321\t48S81\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/SIG2602-2.mp3\tJimmy Blythe Ragamuffins\tMessin' Around (trixie Smith)\tSIGNATURE\t906B\t2602-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69827.mp3\tBoone's Jumping Jack\tMessy\tDECCA\t8644B\t69827\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_162.mp3\tFrankie Laine\tMetro Polka\tMERCURY\t5581\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA1316.mp3\tBing Crosby And Trotter's Orch\tMexicali Rose\tDECCA\t2001B\tDLA1316\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31331.mp3\tLes Brown & His Orch\tMexican Hat Dance\tOKEH\t6697\t31331\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_262.mp3\tJim Reeves\tMexican Joe\tABBOTT\t116\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWCO26179.mp3\tRaymond Scott And His New Orch\tMexican Jumping Bean\tCOLUMBIA\t36211\tWCO26179\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC63776-A.mp3\tLouis Armstrong And His Orchestra\tMexican Swing\tDECCA\t1822B\t63776-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_406.mp3\tKen Remo\tMexico\tMGM\t11419\t52S546\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D177A.mp3\tHarry James And His Orchestra\tMexico City\tV-DISC\t177A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_145.mp3\tIvie Anderson Feat. Ceele Burke's Orchestra\tMexico Joe\tExclusive\t394043113\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_222.mp3\tGray Gordon And His Orchestra\tMexiconga\tVictor\t26365\t041590-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/SesF-163.mp3\tArt Hodes Trio With Mezz Mezzrow\tMezzin' Around\tSession\t10007\tF-163  \t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17179.mp3\tAl Jolson W Carl Fenton Orch\tMiami\tBRUNSWICK\t3013\t17179\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2341.mp3\tXavier Cugat & His Orch\tMiami Beach Rhumba\tCOLUMBIA\t37556\tHCO2341\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COMR2579.mp3\tJelly Roll Morton (piano)\tMichigan Water Blues\tCOMMODORE\t588\tR2579\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404220-B.mp3\tClarence Williams (solo)\tMichigan Water Blues (v C W)\tOKeh\t8806\t404220-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3212-A.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tMichigander Blues\tBrunswick\t7069\tC-3212-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/MER939-2.mp3\tTed Weems And His Orch\tMickey\tMERCURY\t5062A\t939-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1899_013.mp3\tHarry Macdonough And S. H. Dudley\tMid The Green Fields Of Virginia\tEdison\t7262\t\t1899\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU063700.mp3\tBenny Carter & His Orch\tMidnight\tBLUEBIRD\t11288\t063700\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC81639.mp3\tRed Foley\tMidnight\tDECCA\t28420\t81639\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu063700-1.mp3\tBenny Carter And His Orchestra\tMidnight\tBluebird\tB-11288\t063700-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYKBF11.mp3\tBud Freeman & His Orch\tMidnight At Eddie Condon's\tKEYNOTE\t636\tKBF11\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_216.mp3\tHenry Allen And His Orchestra\tMidnight Blue\tVOCALION\t3339\t20049-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/CON30933.mp3\tHank Penny's Radio Cowboys\tMidnight Blues\tCONQUEROR\t9847\t30933\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU69362-1.mp3\tJimmie Davis\tMidnight Blues\tBLUEBIRD\t6249\t69362-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81080-3.mp3\tBessie Smith\tMidnight Blues\tCOLUMBIA\tA-3936\t81080-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5786.mp3\tPete Brown's Sextet\tMidnight Blues\tSAVOY\t579\tS5786\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66247.mp3\tBlue Lu Barker & Fly Cats\tMidnight Blues\tDECCA\t7683\t66247\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Col81071-2.mp3\tHenderson's Hot Six\tMidnight Blues\tColumbia\tA-3951\t81071-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65979.mp3\tWoody Herman & His Orchestra\tMidnight Echoes\tDECCA\t2817B\t65979\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35645-A.mp3\tConway's Band\tMidnight Frolic\tVICTOR\t35645\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC11499.mp3\tLeroy Carr S.blackwell\tMidnight Hour Blues\tARC\tVO1703\t11499\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62890-A.mp3\tChick Webb & His Orchestra\tMidnight In A Madhouse\tDECCA\t1587\t62890-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/GRAEP-2020-A-2.mp3\tJoe Venuti, V; Paul Whiteman And His Orchestra\tMidnight In Monte Carlo\tGRAND AWARD\tEP-2020-A-2\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/VOCWM-1133-A.mp3\tThe Quintones\tMidnight Jamboree\tVOCALION\t5409\tWM-1133-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1133-A.mp3\tBenny Carter\tMidnight Jamboree\tVocalion\t5409\tWM-1133-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16123.mp3\tAllen Bros\tMidnight Mama\tARC\tVO2841z\t16123\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/VocC-1630.mp3\tLevee Serenaders\tMidnight Mama\tVocalion\t1154\tC-1630\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030324.mp3\tTommy Dorsey & His Orch\tMidnight On The Trail\tVICTOR\t26126\t030324\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/JazCO-18548-2.mp3\tMills Blue Rhythm Band\tMidnight Ramble\tJazz Panorama\t3\tCO-18548-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11128-9-0.mp3\tAbe Lyman's California Orch.\tMidnight Rose\tBRUNSWICK\t2478\t11128-9-0\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU047278-2.mp3\tErskine Hawkins And His Orch\tMidnight Stroll\tBLUEBIRD\t10709\t047278-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67919.mp3\tAndy Kirk & Clouds Of Joy\tMidnight Stroll\tDECCA\t3350B\t67919\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67919-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tMidnight Stroll\tDecca\t3350\t67919-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4546.mp3\tLionel Hampton And His Orch\tMidnight Sun\tDECCA\t24429\tL4546\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82330.mp3\tColeman Hawkins & His Orch\tMidnight Sun\tDECCA\t28311\t82330\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOB5900.mp3\tRay Noble And His Orch\tMidnight The Stars & You\tVICTOR\t24700\tOB5900\t1934\t\n\tDelmore Brothers\tMidnight Train\tKING\t548A\t1982\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_040.mp3\tCarl Fenton And His Orchestra Feat. V/ Frank Munn\tMidnight Waltz\tBRUNSWICK\t2853\t15044-5-6\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU15044-5-6.mp3\tCarl Fenton And His Orch\tMidnight Waltz (v F M)\tBRUNSWICK\t2853\t15044-5-6\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146175-2.mp3\tNellie Florence\tMidnight Weeping Blues\tCOLUMBIA\t14342 D\tW146175-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/DotA-1663.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tMidriff\tDot\tDLP3487\tA-1663\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE15830.mp3\tAbe Lyman & His Orch\tMighty Blue\tBRUNSWICK\t2934\tE15830\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044602.mp3\tFats Waller And His Rhythm\tMighty Fine\tBLUEBIRD\t10744\t044602\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D310A.mp3\tFrank Sinatra\tMighty Lak' A Rose\tV-DISC\t310A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35395-B.mp3\tMckee's Society Orch\tMighty Lak' A Rose\tVictor\t35395-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP6411.mp3\tEddie Heywood\tMighty Like A Rose\tCOLUMBIA\t39318\tZSP6411\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM779.mp3\tJoe Marsala Chicagoans\tMighty Like The Blues\tVOCALION\t4168\tM779\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUM899.mp3\tDuke Ellington's Famous Orch\tMighty Like The Blues\tBRUNSWICK\t8231\tM899\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM-398-3.mp3\tBenny Carter And His Orchestra\tMighty Like The Blues\tDECCA\tF-42125\tAM-398-3\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO48130.mp3\tSarah Vaughan\tMighty Lonesome Feelin'\tCOLUMBIA\t39873\tCO48130\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CON12365-1.mp3\tChick Bullock\tMighty River\tCONQUEROR\t8015\t12365-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/ARCB-12325-A.mp3\tCasa Loma Orchestra\tMighty River\tARC\tBR6402\tB-12325-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiARCBR6402.mp3\tCasa Loma Orchestra\tMighty River\tARC\tBR6402\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban11788-1.mp3\tMills Blue Rhythm Band\tMighty Sweet\tBanner\t32465  \t11788-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-500-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tMike\tSWING\t287\tOSW-500-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD167.mp3\tGeorgie Auld & His Orch\tMild And Mellow\tDISC\t117\tD167\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC1317-18.mp3\tRodney Rogers Red Peppers\tMilenberg Joys\tBRUNSWICK\t3744\tC1317-18\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/PER14480-B.mp3\tSeven Missing Links\tMilenberg Joys\tPerfect\t14480-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe08754-A.mp3\tJimmy Joy & His Orch\tMilenberg Joys\tOKeh\t40251\t08754-A\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11764-A.mp3\tAbe Lyman & His Orch\tMilenberg Joys\tBRUNSWICK\t6325\t11764-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU74852-1.mp3\tBennie Moten's Kansas City Or.\tMilenberg Joys\tBLUEBIRD\t5585\t74852-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2855.mp3\tBob Crosby & His Bobcats\tMilenberg Joys\tDECCA\t25293\tDLA2855\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_192.mp3\tMckinney's Cotton Pickers\tMilenberg Joys\tVICTOR\t21611\t46096-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh177.mp3\tLew Stone And His Band\tMilenberg Joys\tDecca\tF-3953\tTB-1131-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC031805.mp3\tTommy Dorsey & His Orch\tMilenberg Joys - Part 1\tVICTOR\t26437\t031805\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC031806.mp3\tTommy Dorsey & His Orch\tMilenberg Joys - Part 2\tVICTOR\t26437\t031806\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014654.mp3\tBunny Berigan & His Orch\tMiles Apart\tVICTOR\t25690A\t014654\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS3440-1.mp3\tCharlie Parker\tMilestones\tSAVOY\t310\tS3440-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D141A1.mp3\tMilitary District Of Washington Band\tMilitary District Of Washington March\tV-DISC\t141A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU59918.mp3\tSleepy John Estes\tMilk Cow Blues\tBLUEBIRD\t7677\t59918\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63389.mp3\tBob Crosby & His Orch\tMilk Cow Blues\tDECCA\t1962A\t63389\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC39324.mp3\tBirmingham Serenaders\tMilk Cow Blues\tDECCA\t7060\t39324\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/SesF-161.mp3\tMezz Mezzrow Trio\tMilk For Mezz\tSession\t10008\tF-161\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/CONDAL403-2.mp3\tRobert Johnson\tMilkcow's Calf Blues\tCONQUEROR\t8944\tDAL403-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCON8944mi.mp3\tRobert Johnson\tMilkcow's Calf Blues\tCONQUEROR\t8944\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP151x.mp3\tElla Mae Morse\tMilkman, Keep Those Bottles Quiet\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D227A2.mp3\tGeorgia Gibbs With Tommy Dorsey\tMilkman, Keep Those Bottles Quiet\tV-DISC\t227A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35395-A.mp3\tMckee's Society Orch\tMillicent\tVICTOR\t35395\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3644.mp3\tLionel Hampton & His Orch.\tMillion Dollar Smile\tDECCA\t18719B\tL3644\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL3644-A.mp3\tLionel Hampton And His Orchestra\tMillion Dollar Smile\tDecca\t18719\tL3644-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW26758-A.mp3\tJohn Kirby & His Orch\tMilumbu\tCOLUMBIA\t35920\tW26758-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150779.mp3\tCharlie Poole N.c.ramblers\tMilwaukee Blues\tCOLUMBIA\t15688 D\tW150779\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_261.mp3\tPatti Page\tMilwaukee Polka\tMERCURY\t70230\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3h/CAM3901-A.mp3\tMill's Merry Makers\tMilwaukee Walk\tCAMEO\t9203\t3901-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC68360.mp3\tMaurice Chevalier\tMimi\tVICTOR\t24063\t68360\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_098.mp3\tMaurice Chevalier Feat. Nat Finston (director)\tMimi\tVICTOR\t24063\t68360\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S6035.mp3\tHank Williams\tMind Your Own Business\tMGM\t10461\t49S6035\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_158.mp3\tErnest Hare\tMindin' My Business\tOKeh\t40055\t72316-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81515-6.mp3\tThe Georgians\tMindin'n My Business\tColumbia\t102-D\t81515-6\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20608-B.mp3\tHorace Heidt And His Orch\tMine\tVictor\t20608-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_123.mp3\tEmil Coleman And His Orchestra\tMine\tCOLUMBIA\t2831 D\tW152525-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3486.mp3\tBing Crosby J. Garland J. Lilley\tMine (v B. Crosby - Judy Garland)\tDECCA\t23804\tL3486\t1944\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC41372-3.mp3\tCoon Sanders Nighthawk Orch\tMine All Mine\tVICTOR\t21148\t41372-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD9VB1899.mp3\tCount Basie & His Orchestra\tMine Too\tRCA\t20-3699\tD9VB1899\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4544.mp3\tLionel Hampton & His Orch\tMingus Fingers\tDECCA\t24428\tL4544\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_149.mp3\tSammy Kaye And His Orchestra\tMinka\tVictor\t27567\t065992\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE36212.mp3\tCab Calloway And His Orch\tMinnie The Moocher\tBRUNSWICK\t6511\tE36212\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC4183-1.mp3\tCab Calloway And His Orch\tMinnie The Moocher\tOKEH\t6634\tC4183-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/SONSEB4875.mp3\tValaida\tMinnie The Moocher\tSONORA\t3577\tSEB4875\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_016.mp3\tCab Calloway And His Orchestra\tMinnie The Moocher\tBrunswick\t6074\tE-36212-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6074.mp3\tCab Calloway\tMinnie The Moocher\tBrunswick\t6074\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Son4875-SEB.mp3\tValaida Acc. By Lulle Ellbojs Orkester\tMinnie The Moocher \tSonora\t3577\t4875-SEB\t1939\tValaida Snow t v acc. by Sven Arefeldt dir. Bengt Artander Gunnar Green t, Sture Green tb, Gunnar Wallberg Rune ''Lulle'' Ellboj as, Rudolf Eriksson ts, Willard Ringstrand p, Karl L?rh g, Roland Bengtsson b, Olle Sahlin d\nhttp://www.jazz-on-line.com/a/mp3d/Vic78866-2.mp3\tCab Calloway And His Cotton Club Orchestra\tMinnie The Moocher\tVictor\tM-10120\t78866-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE36212.mp3\tCab Calloway And His Orch\tMinnie The Moocher (the Ho-de-ho Song)\tBRUNSWICK\t6074\tE36212\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Col151456-1.mp3\tKing Carter And His Royal Orchestra\tMinnie The Moocher ? V D R & Ch\tColumbia\t2439-D\t151456-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/MelE-36665-A.mp3\tBlue Rhythm Boys\tMinnie The Moocher ? V G M\tMelotone\tM-12164\tE-36665-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26937-A.mp3\tJimmie Lunceford And His Orchestra\tMinnie The Moocher Is Dead\tColumbia\t35700\t26937-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic69980-1.mp3\tMills Blue Rhythm Band\tMinnie The Moocher V G M ? C B\tVictor\t22763\t69980-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09691.mp3\tBenny Goodman And His Orchestra\tMinnie The Moocher's Wedding Day\tVICTOR\t25683\t09691\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11725-A.mp3\tCab Calloway & His Orch\tMinnie The Moocher's Wedding Day\tBRUNSWICK\t6321\t11725-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban11152-A.mp3\tMills Blue Rhythm Band\tMinnie The Moocher's Wedding Day\tBanner\t32444  \t11152-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_085.mp3\tCab Calloway And His Orchestra\tMinnie The Moocher's Wedding Day\tBRUNSWICK\t6321\t11725-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-11725-A.mp3\tCab Calloway And His Orchestra\tMinnie The Moocher's Wedding Day\tBrunswick\t6321\tB-11725-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/BluST-1984.mp3\tDjango's Music\tMinor Blues\tBlue Star\t59\tST-1984\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D220A2.mp3\tTommy Dorsey And His Orchestra\tMinor Goes A-muggin'\tV-DISC\t220A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152669.mp3\tClaude Hopkins And His Orch\tMinor Mania\tCOLUMBIA\t2904 D\tW152669\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-1990-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tMinor Swing\tSWING\t23\tOLA-1990-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKJ-21-1.mp3\tMezzrow - Bechet Septet\tMinor Swoon\tStoryville\t820/21\tKJ-21-1  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOLA1990.mp3\tQuintet Of Hot Club Of France\tMinor's Swing\tVICTOR\t26218\tOLA1990\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_105.mp3\tArthur Collins And Byron Harlan\tMinstrel Parade\tVICTOR\t17783\t15746-5\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/WES110y.mp3\tLu Watters's Yerba Buena Jazz B\tMinstrels Of Annie Street\tWest Coast\t110\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_043.mp3\tGeorgia Minstrel Co.\tMinstrels: First Part, No. 5\tVICTOR\t3039\t\t1901\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57083-1.mp3\tJelly Roll Morton Hot Peppers\tMint Julep\tVICTOR\t23334\t57083-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic57083-1.mp3\tJelly Roll Morton And His Red Hot Peppers\tMint Julep\tVictor\t23334\t57083-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic20-2181-B.mp3\tSpade Cooley\tMinuet In Swing\tVictor\t20-2181-B\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24680-A.mp3\tJohn Kirby & His Orchestra\tMinute Waltz\tVOCALION\t5542\t24680-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_136.mp3\tEileen Rodgers\tMiracle Of Love\tColumbia\t40708\tCO55938\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_365.mp3\tGinny Gibson\tMiracle Of Love\tABC-Paramount\t9739\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/DiaD-1081-D.mp3\tDexter Gordon Quintet\tMischievous Lady\tDial\t1018\tD-1081-D\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_110alt.mp3\tEnrico Caruso And Frances Alda\tMiserere (i Have Sighed To Rest Me) (il Trovatore) Take 1\tVICTOR\t89030\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4862.mp3\tBob Wills Texas Playboys\tMisery\tCOLUMBIA\t20582\tCCO4862\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC69025-3.mp3\tBlanche Calloway & Her Orch\tMisery\tVICTOR\t22717\t69025-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14835.mp3\tCotton Pickers\tMishawaka Blues\tBRUNSWICK\t2818\t14835\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_088.mp3\tJan August\tMisirlou\tMERCURY\t1057\t1399-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_333.mp3\tLeon Berry\tMisirlou\tDOT\t15063\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21104-A.mp3\tPaul Whiteman's Rhythm Boys<br>(vocal Bing Crosby)<br>\tMiss Annabelle Lee\tVICTOR\t21104\t40894-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036919.mp3\tCharlie Barnet & His Orch\tMiss Annabelle Lee\tBLUEBIRD\t10294\t036919\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/HMVOLA-1715-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tMiss Annabelle Lee\tHMV\tB-8614\tOLA-1715-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/BRUC1094-6-8.mp3\tBen Bernie And His Orch\tMiss Annabelle Lee\tBRUNSWICK\t3631\tC1094-6-8\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC173.mp3\tJoe Turner's Allstars\tMiss Brown Blues\tNATIONAL\t\tNSC173\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17768-1.mp3\tTeddy Wilson & His Orch\tMiss Brown To You (vbh)\tBRUNSWICK\t7501\t17768-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-891-1.mp3\tCab Calloway And His Orchestra\tMiss Hallelujah Brown\tVocalion\t4400\tM-891-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC5748.mp3\tIsham Jones And His Orch\tMiss Hannah\tBRUNSWICK\t4868\tC5748\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57068-2.mp3\tMckinney's Cotton Pickers\tMiss Hannah\tVICTOR\t38102A\t57068-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COL30204ML.mp3\tHot Lips Page\tMiss Larceny Blues\tCOLUMBIA\t30204\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17417y.mp3\tTiger\tMiss Marie's Advice\tDECCA\t17417\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW147379-2.mp3\tAlec Johnson\tMiss Meal Cramp Blues\tCOLUMBIA\t14446 D\tW147379-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH0839.mp3\tBob Wills And His Texas Playboys\tMiss Molly\tOKEH\t6710\tH0839\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D340B1.mp3\tBob Wills And His Texas Playboys\tMiss Molly\tV-DISC\t340B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC1053-A.mp3\tCab Calloway And His Orch\tMiss Otis Regrets\tBRUNSWICK\t7504\tC1053-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38612.mp3\tMills Brothers\tMiss Otis Regrets\tDECCA\t166B\t38612\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC38542-A.mp3\tJimmie Lunceford And His Orchestra\tMiss Otis Regrets\tDECCA\t130B\t38542-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/PATCPT-1857-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tMiss Otis Regrets (she's Unable To Lunch Today)\tPath\tPA-537\tCPT-1857-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU73326.mp3\tJimmie Rodgers\tMiss The Mississippi & You\tBLUEBIRD\t5081\t73326\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480874.mp3\tCount Basie And His Orchestra\tMiss Thing\tVocalion\t4860\t24340-A, 24341-A\t1939\tBuck Clayton, Ed Lewis, Harry Edison, Shad Collins (tp), Dicky Wells, Benny Morton, Dan Minor (tb), Earl Warren (as), Jack Washington (as, bar), Buddy Tate, Lester Young (ts), Count Basie (p, ldr), Freddy Green (g), Walter Page (sb), Jo Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3d/Voc24340-A.mp3\tCount Basie And His Orchestra\tMiss Thing, Part 1\tVocalion\t4860\t24340-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24341-A.mp3\tCount Basie And His Orchestra\tMiss Thing, Part 2\tVocalion\t4560\t24341-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60082.mp3\tLouisiana Ramblers\tMiss Vandy\tDECCA\t5152B\t60082\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU067765.mp3\tDinah Shore\tMiss You\tBLUEBIRD\t11322\t067765\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2840.mp3\tBing Crosby - J.s.trotter\tMiss You\tDECCA\t4183B\tDLA2840\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiRad2193.mp3\tBen Litchfield\tMiss You\tRadiex\t2193\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D318A2.mp3\tClyde Lucas And His Orchestra (jean La Salle Voc.)\tMiss You\tV-DISC\t318A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_0703_01.mp3\tLee Morse And Her Bluegrass Boys\tMiss You\tColumbia\t1896DA\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_052.mp3\tDinah Shore\tMiss You\tBLUEBIRD\t11322\t067765\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO33070-1.mp3\tBenny Goodman And His Orchestra\tMission To Moscow\tCOLUMBIA\t36680\tCO33070-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_068.mp3\tBenny Goodman And His Orchestra\tMission To Moscow\tCOLUMBIA\t36680\tCO33070-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM50S154.mp3\tArt Mooney And His Orchestra\tMississippi\tMGM\t10721\t50S154\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_196.mp3\tKay Starr\tMississippi\tCapitol\t1072\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_250.mp3\tArt Mooney And His Orchestra\tMississippi\tMGM\t10721\t50S154\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/PARG15211.mp3\tCharlie Patton\tMississippi Boll Weavil Blues\tPARAMOUNT\t12805B\tG15211\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC76328-1.mp3\tJimmie Rodgers\tMississippi Delta Blues\tVICTOR\t23816\t76328-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC48879-2.mp3\tCoon-sanders Orchestra\tMississippi Here I Am\tVICTOR\t21891\t48879-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR20419-2.mp3\tRuben Lacey\tMississippi Jailhouse Groan\tPARAMOUNT\t12629\t20419-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57082-1.mp3\tJelly Roll Morton Red Peppers\tMississippi Mildred\tVICTOR\t23424\t57082-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic57082-1.mp3\tJelly Roll Morton And His Red Hot Peppers\tMississippi Mildred\tVictor\t23424\t57082-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148172-3.mp3\tJoe Turner & His Memphis Men\tMississippi Moan\tCOLUMBIA\t1813 D\tW148172-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/Col148172-3.mp3\tJoe Turner And The Memphis Men\tMississippi Moan\tColumbia\t1813-D\t148172-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU45091-5.mp3\tJimmie Rodgers\tMississippi Moon\tBLUEBIRD\t5136\t45091-5\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE400034-A.mp3\tFrankie Trumbauer And His Orchestra<br>vocal Bing Crosby<br>\tMississippi Mud\tOKeh\t40979\t400034-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC41696-3.mp3\tPaul Whiteman And His Orchestra\tMississippi Mud\tVICTOR\t21274A\t41696-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0928_04.mp3\tLee Morse And Her Bluegrass Boys\tMississippi Mud\tColumbia\t1584DB\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO52x.mp3\tFirehouse Five Plus Two\tMississippi Rag\tGood Time Jazz\t52\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN592B.mp3\tDelmore Brothers\tMississippi Show\tKING\t592B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN8245-2-3.mp3\tFred Hall's Jazz Band\tMissouri Squabble\tBANNER\t6264\t8245-2-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO34084.mp3\tAbe Lyman And His Orchestra\tMissouri Waltz\tCOLUMBIA\t37510\tCO34084\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D352B1.mp3\tGlenn Miller And His Orchestra\tMissouri Waltz\tV-DISC\t352B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046432.mp3\tGlenn Miller And His Orchestra\tMissouri Waltz\tBLUEBIRD\t10587\t046432\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1769.mp3\tBing Crosby - J.s.trotter Orch\tMissouri Waltz\tDECCA\t2676B\tDLA1769\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC38392-7.mp3\tPaul Whiteman And His Orchestra\tMissouri Waltz\tVICTOR\t20973A\t38392-7\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_051.mp3\tPrince's Orchestra\tMissouri Waltz\tCOLUMBIA\tA-6121\t48828-3\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_142.mp3\tEarl Fuller's Novelty Orchestra\tMissouri Waltz\tCOLUMBIA\tA-2578\t77821-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL516.mp3\tNite Owls\tMistakes\tVOCALION\t4452\tDAL516\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVOC4452.mp3\tNite Owls\tMistakes\tVOCALION\t4452\tDAL516\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_096.mp3\tDennis Day Feat. Norman Luboff Choir\tMister And Mississippi\tRCA Victor\t4140\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_153.mp3\tTennessee Ernie Ford\tMister And Mississippi\tCapitol\t1521\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP115x.mp3\tFreddie Slack\tMister Five By Five\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO911.mp3\tHarry James And His Orch\tMister Five By Five\tCOLUMBIA\t36650\tHCO911\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC71152-B.mp3\tAndrews Sisters\tMister Five By Five\tDECCA\t18470B\t71152-B\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_101.mp3\tAndrews Sisters\tMister Five By Five\tDECCA\t18470B\t71152-B\t1942\t\nhttp://www.jazz-on-line.com/mp3/736096262.mp3\tEd Gallager And Al Shean\tMister Gallagher And Mister Shean\tVICTOR\t18941B\t26703-4\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/COMR2564.mp3\tJelly Roll Morton (piano)\tMister Joe\tCOMMODORE\t590\tR2564\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67735.mp3\tWoody Herman & His Orchestra\tMister Meadowlark\tDECCA\t3217B\t67735\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1985.mp3\tBing Crosby & Johnny Mercer\tMister Meadowlark\tDECCA\t3182B\tDLA1985\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC049689.mp3\tArtie Shaw And His Orchestra\tMister Meadowlark\tVICTOR\t26614\t049689-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_264.mp3\tBing Crosby And Johnny Mercer\tMister Meadowlark\tDECCA\t3182B\tDLA1985\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048967.mp3\tGlenn Miller & His Orch\tMister Meadowlark (vjl)\tBLUEBIRD\t10745 B\t048967\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic049689-1.mp3\tArtie Shaw And His Orchestra\tMister Meadowlark V J P\tVictor\t26614\t049689-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-896-1.mp3\tCab Calloway And His Orchestra\tMister Paganini\tVocalion\t4369\tM-896-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC86957.mp3\tThe Four Aces\tMister Sandman\tDECCA\t29344\t86957\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_157.mp3\tFour Aces Feat. Jack Pleis And His Orchestra\tMister Sandman\tDECCA\t29344\t86957\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10335.mp3\tDoris Day\tMister Tap Toe\tCOLUMBIA\t39906\tHCO10335\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_071.mp3\tDoris Day Feat. Paul Weston's Orchestra\tMister Tap Toe\tCOLUMBIA\t39906\tHCO10335\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_352.mp3\tCab Calloway And His Orchestra\tMister Toscanini, Swing For Minnie\tVOCALION\t4369\tM896\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152467-2.mp3\tClarence Williams Jug Band\tMister, Will You Serenade\tCOLUMBIA\tOK41565\tW152467-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/CON22155.mp3\tBlind Boy Fuller\tMistreater, You're Going To Be Sorry\tCONQUEROR\t9000\t22155\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/AJA17022MD.mp3\tFletcher Henderson Sawin' Six\tMistreatin' Daddy\tAJAX\tAJX17022\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81392-3.mp3\tBessie Smith\tMistreatin' Daddy\tCOLUMBIA\t14000 D\t81392-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVSLA5114-1.mp3\tLittle Esther W Johnny Otis\tMistrustin' Blues (vesther-mw)\tSAVOY\t735A\tSLA5114-1\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_352.mp3\tErroll Garner Trio\tMisty\tMERCURY\t70442\tY10845\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_148.mp3\tJan Garber And His Orchestra\tMisty Islands Of The Highlands\tDECCA\t717A\tC90595\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC51972-2.mp3\tDuke Ellington & His Orch\tMisty Mornin'\tVICTOR\t38058\t51972-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/Oke401352-D.mp3\tDuke Ellington And His Cotton Club Orchestra\tMisty Mornin'\tOkeh\t8662\t401352-D\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/Cam3564-C.mp3\tThe Whoopee Makers\tMisty Mornin'\tCameo\t9037\t3564-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic51972-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tMisty Mornin'\tVictor\tV-38058\t51972-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45147.mp3\tRosemary Clooney\tMixed Emotions\tCOLUMBIA\t39333\tCO45147\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC81214.mp3\tElla Fitzgerald\tMixed Emotions\tDECCA\t27680\t81214\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_217.mp3\tRosemary Clooney Feat. Percy Faith's Orchestra\tMixed Emotions\tCOLUMBIA\t39333\tCO45147\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142436-1.mp3\tNew Orleans Bootblacks\tMixed Salad\tCOLUMBIA\t14465 D\tW142436-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16196.mp3\tDjango Reinhardt Et Son Grand Orchestre Fud Candrix Et Son Orchestre\tMixture\tRythme\tD5018\t16196\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Col24084-1.mp3\tJimmie Lunceford And His Orchestra\tMixup\tColumbia\t35919\t24084-1\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3c/MUS5563.mp3\tGeorgie Auld & His Orch\tMo Mo\tMUSICRAFT\t394\t5563\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic53068-1.mp3\tConnie's Inn Orchestra\tMoan, Your Moaners\tVictor\t22698\t53068-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-4101-.mp3\tJabbo Smith And His Orchestra\tMoanful Blues\tBrunswick\t7111\tC-4101-\t1929\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480513.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tMoanin With Hazel (so What)\tRCA\t430044\t\t1959\tArt Blakey, D, Benny Golson, Ts, Lee Morgan, T,: Jymie Merritt, B, Bobby Timmons, P\nhttp://www.jazz-on-line.com/a/mp3h/COL151638-1.mp3\tKing Carter And His Royal Orchestra\tMoanin'\tCOLUMBIA\t2504-D\t151638-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA91-B.mp3\tMills Brothers\tMoanin' For You\tDECCA\t497B\tDLA91-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014681.mp3\tTommy Dorsey & His Orch\tMoanin' In The Mornin'\tVICTOR\t25692\t014681\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE30297.mp3\tLibby Holman And Orch\tMoanin' Low\tBRUNSWICK\t4445\tE30297\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22047-A.mp3\tLeo Reisman And His Orch\tMoanin' Low\tVICTOR\t22047\t53497-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402530.mp3\tMiff Mole & His Little Molers\tMoanin' Low\tOKeh\t41273\t402530\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC53590-2.mp3\tSophie Tucker\tMoanin' Low\tVICTOR\t22049A\t53590-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL7519.mp3\tElla Fitzgerald\tMoanin' Low\tDECCA\t29475\tL7519\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_221.mp3\tCharleston Chasers Feat. Eva Taylor\tMoanin' Low\tCOLUMBIA\t1891 D\tW148763\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_0724_01.mp3\tLee Morse And Her Bluegrass Boys\tMoanin' Low (from 'little Show')\tColumbia\t1922DA\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM50S6097.mp3\tHank Williams\tMoanin' The Blues\tMGM\t10832\t50S6097\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VicD9VB-888.mp3\tLucky Millinder And His Orchestra\tMoanin' The Blues\tVictor\t20-3430\tD9VB-888  \t1949\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480381.mp3\tArt Blakey And Benny Golson And The Jazz Messengers\tMoanin' With Hazel (so What)\tRCA\t430044\t\t1958\tArt Blakey, D, Benny Golson, Ts, Lee Morgan, T, Bobbie Timmons, P, Jymie Merritt, B\nhttp://www.jazz-on-line.com/a/mp3t/TS480419.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tMoanin' With Hazel (so What) (alternate Take)\tRCA\t430044\t\t1958\tArt Blakey, D, Benny Golson, Ts, Lee MOrgan, T, Bobbie Timmons, P, Jymie Merritt, B\nhttp://www.jazz-on-line.com/a/mp3b/BruE-35987-A.mp3\tMills Blue Rhythm Band\tMoanin?\tBrunswick\t6156\tE-35987-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic69963-1.mp3\tMills Blue Rhythm Band\tMoanin? - V G M\tVictor\t22800\t69963-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Col151638-1.mp3\tKing Carter And His Royal Orchestra\tMoanin? V G M\tColumbia\t2504-D\t151638-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC57430-1.mp3\tCoon Sanders Orchestra\tMoaning For You\tVICTOR\t22278\t57430-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC56734-1.mp3\tVictoria Spivey\tMoaning The Blues\tVICTOR\t38546\t56734-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC13027.mp3\tFletcher Henderson Club Alabam\tMobile Blues\tVOCALION\t14800A\t13027\t1924\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU47CH.mp3\tGene Rodemich And His Orchestra\tMobile Blues\tBRUNSWICK\t2599B\t47CH\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3c/COLW143977-2.mp3\tSam Morgan's Jazz Band\tMobile Stomp\tCOLUMBIA\t14258 D\tW143977-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1373x.mp3\tLes Paul And Mary Ford\tMockin' Bird Hill\tCAPITOL\t1373\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/COR76734.mp3\tPinetoppers\tMockin' Bird Hill\tCORAL\t64061\t76734\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/MER5595x.mp3\tPatti Page\tMockin' Bird Hill\tMERCURY\t5595\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_017.mp3\tPatti Page\tMockin' Bird Hill\tMERCURY\t5595\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_012.mp3\tLes Paul And Mary Ford\tMockin' Bird Hill\tCAPITOL\t1373\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1373y.mp3\tLes Paul And Mary Ford\tMocking Bird Hill\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA392.mp3\tMale Voices\tMocking Bird Medley\tColumbia\tA392\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3a/MER11082.mp3\tCharlie Parker's Orchestra\tMohawk\tMERCURY\t11082\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP2098.mp3\tLovie Austin Blue Serenaders\tMojo Blues\tPARAMOUNT\t12283\tP2098\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76900.mp3\tElla Fitzgerald\tMolasses, Molasses\tDECCA\t27255\t76900\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2682.mp3\tTexas Jim Lewis\tMollie Darling\tDECCA\t6020\tDLA2682\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_0317_04.mp3\tLee Morse And Her Bluegrass Boys\tMollie Make Up Your Mind\tColumbia\t939DB\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4887.mp3\tBill Monroe Bluegrass Boys\tMolly And Tenbrooks\tCOLUMBIA\t20612\tCCO4887\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_317.mp3\tGray Gordon And His Orchestra\tMolly Malone\tBluebird\t10861\t054621\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COL27768.mp3\tMaxine Sullivan\tMolly Malone\tCOLUMBIA\t35710\t27768\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO46265-1.mp3\tLefty Frizzel\tMom And Dad's Waltz\tCOLUMBIA\t20837\tCO46265-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC047707.mp3\tTommy Dorsey And His Orch\tMoments In The Moonlight\tVICTOR\t26525\t047707\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26536-A.mp3\tGene Krupa & His Orch\tMoments In The Moonlight\tCOLUMBIA\t35444\t26536-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047096.mp3\tGlenn Miller & His Orch\tMoments In The Moonlight (vre)\tBLUEBIRD\t10638 B\t047096\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic021054-1.mp3\tMaxine Sullivan With Claude Thornhill And Orchestra\tMoments Like This\tVictor\t25802\t021054-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO53481.mp3\tFour Lads\tMoments To Remember\tCOLUMBIA\t40539\tCO53481\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_016.mp3\tFour Lads\tMoments To Remember\tColumbia\t40539\tCO53481\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S3163.mp3\tSlim Gaillard Trio\tMomma's In The Kitchen\tMGM\t10231\t47S3163\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1871x.mp3\tEddy Arnold\tMommy, Please Stay Home With Me\tRCA\t20-1871\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17458H-.mp3\tThe Dutch Swing College Band\tMon Homme\tPhilips\tP17458H\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/COL195065.mp3\tBen Selvin & His Orch\tMona\tCOLUMBIA\t3943X\t195065\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC22259B.mp3\tGeorge Olsen's Music\tMona\tVICTOR\t22259\tB\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149760.mp3\tColumbia Photoplayers (selvin)\tMona\tCOLUMBIA\t2105 D\tW149760\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/GEN16347.mp3\tHarold Austin's Ambassadors\tMona\tGENNETT\t7147\t16347\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1010x.mp3\tNat King Cole\tMona Lisa\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1010x.mp3\tKing Cole Trio\tMona Lisa\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM50S3026.mp3\tArt Lund\tMona Lisa\tMGM\t10689\t50S3026\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_150.mp3\tArt Lund\tMona Lisa\tMGM\t10689\t50S3026\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_006.mp3\tNat King Cole Feat. Les Baxter And His Orchestra\tMona Lisa\tCAPITOL\t1010\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_276.mp3\tDennis Day Feat. Henri Rene's Orchestra\tMona Lisa\tRCA Victor\t3753\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_175.mp3\tRalph Flanagan And His Orchestra\tMona Lisa\tRCA\t20-3888\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/ComR-4180-2.mp3\tChu Berry And His Jazz Ensemble\tMonday At Minton's (what's It To You?)\tCommodore\t541\tR-4180-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_205.mp3\tKay Kyser And His Orchestra\tMonday Morning\tCBS\tBR8234\t23405\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU23414.mp3\tFletcher Henderson & His Orch\tMoney Blues\tBRUNSWICK\t8223\t23414\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_206.mp3\tDean Martin\tMoney Burns A Hole In My Pocket\tCapitol\t2818\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_408.mp3\tElvis Presley\tMoney Honey\tRCA\tEPA-821\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULA130.mp3\tMills Brothers\tMoney In My Pockets\tBRUNSWICK\t6894\tLA130\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_183.mp3\tMills Brothers\tMoney In My Pockets\tBRUNSWICK\t6894\tLA130\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB2170.mp3\tCount Basie & His Orchestra\tMoney Is Honey\tRCA\t20-2771\tD7VB2170\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC17254A.mp3\tNeville Marcano\tMoney Is King\tDECCA\t17254A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D57.mp3\tAndrew Sisters\tMoney Is The Root Of All Evil\tV-DISC\t579\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_112.mp3\tAndrews Sisters\tMoney Is The Root Of All Evil\tDECCA\t23474\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_284.mp3\tPatti Page\tMoney, Marbles And Chalk\tMERCURY\t5251\t2486\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S3320.mp3\tSlim Gaillard; His Trio\tMoney, Money, Money\tMGM\t10164B\t47S3320\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC38872.mp3\tClaude Hopkins And His Orchestra\tMonkey Business\tDECCA\t674B\t38872\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142638-1.mp3\tCharlie Poole N.c.ramblers\tMonkey On A String\tCOLUMBIA\t15099 D\tW142638-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBluB-11160.mp3\tVaughn Monroe & His Orchestra\tMonkey On A String\tBluebird\tB-11160\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO45818.mp3\tDuke Ellington\tMonologue\tCOLUMBIA\t39496\tCO45818-1\t1951\tJimmy Hamilton, Willie Smith, Russell Procope (cl) Harry Carney (b-cl) Duke Ellington (narrator) Wendell Marshall (b) Louie Bellson (d) \nhttp://www.jazz-on-line.com/a/mp3c/COLWC3071.mp3\tJimmie Lunceford & His Orch\tMonotony In Four Flats\tCOLUMBIA\t35567\tWC3071\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/ColWC-3071-A.mp3\tJimmie Lunceford And His Orchestra\tMonotony In Four Flats\tColumbia\t35567\tWC-3071-A\t1940\t\nhttp://www.78-tours.net/mp3/POL6555.mp3\tRay Ventura Et Son Orchestre\tMonsieur De La Palice\tPOLYDOR\t6.555-2LPP\t560.014\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21897.mp3\tArtie Shaw And His New Music\tMonsoon\tBRUNSWICK\t8019\tB-21897-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-63-1.mp3\tRex Stewart And His Feetwarmers (with Django Reinhardt)\tMontmartre\tSWING\t56\tOSW-63-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE34928.mp3\tDuke Ellington And Famous Orch.\tMood Indigo\tBRUNSWICK\t6682\tE34928\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe404481-B.mp3\tHarlem Footwarmers (ellington)\tMood Indigo\tOKeh\t8840\t404481-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64811-4.mp3\tDuke Ellington And His Orch\tMood Indigo\tVICTOR\t22587A\t64811-4\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64811-3.mp3\tDuke Ellington And His Orch\tMood Indigo\tVICTOR\t24486A\t64811-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC057616.mp3\tDinah Shore\tMood Indigo\tVICTOR\t27302\t057616\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12860-A.mp3\tBoswell Sisters\tMood Indigo\tBRUNSWICK\t6470\t12860-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10482-2-3.mp3\tCab Calloway & His Orchestra\tMood Indigo\tBANNER\t32152\t10482-2-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-3671mi.mp3\tCharlie Ventura's Orch\tMood Indigo\tRCA\t20-3671\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW152270.mp3\tThe Three Keys\tMood Indigo\tCOLUMBIA\t2706 D\tW152270\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC38532-B.mp3\tJimmie Lunceford & His Orch\tMood Indigo\tDECCA\t131A\t38532-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/Cha17944.mp3\tHenry Lange And His Orchestra\tMood Indigo\tChampion\t16332\t17944\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24486A.mp3\tDuke Ellington & His Famous Orchestra\tMood Indigo\tVictor\t24486A\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1931_0904_02.mp3\tLee Morse And Her Bluegrass Boys\tMood Indigo\tColumbia\t2530DB\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_233.mp3\tFour Freshmen\tMood Indigo\tCapitol\t2961\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_030.mp3\tDuke Ellington And His Famous Orch.\tMood Indigo\tVictor\t22587\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480875.mp3\tDuke Ellington And His Famous Orchestra, Ivie Anderson, Vocal\tMood Indigo\tCOLUMBIA\t35427\tWM1137\t1940\tWallace Jones, Cootie Williams (tp), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Barney Bigard (cl), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (as, bsx), Duke Ellington (p), Fred Guy (g), Jimmy Blanton (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3h/DH480876.mp3\tIvy Anderson, V; Duke Ellington And His Orchestra. (comp: Ellington, Mills, Bigard)\tMood Indigo\tCOLUMBIA\t35427\tWM1137\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480877.mp3\tAndre Kostelanetz And His Orchestra\tMood Indigo\tCOLUMBIA\t7430-M\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/MASLO377-1.mp3\tDuke Ellington Orch\tMood Indigo - Solitude\tMASTER\t102\tLO377-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruLO-377-1.mp3\tDuke Ellington\tMood Indigo And Solitude\tBrunswick\t7990\tLO-377-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP704.mp3\tDuke Ellington & Orch\tMood To Be Wooed\tV-DISC\t252A\tVP704\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S217.mp3\tJoe Turner\tMoody Baby\tMGM\t10719\t48S217\t\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAE2VB-8063.mp3\tRalph Flanagan And His Orchestra Harry Prime Singing Winds\tMoon\tRCA VICTOR \t20-5237\tE2VB-8063\t1953\t\nhttp://www.jazz-on-line.com/a/mp3o/RCAE2VB-8063.mp3\tRalph Flanagan & His Orch  Harry Prime, Singing Winds\tMoon\tRCA VICTOR\t20-5237\tE2VB-8063\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM606-2.mp3\tCab Calloway & His Orch\tMoon At Sea\tVARIETY\tI651\tM606-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_338.mp3\tCab Calloway And His Orchestra\tMoon At Sea\tVOCALION\t3789\tM606-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC34064-3.mp3\tCoon-sanders Nighthawk Orch\tMoon Deer\tVICTOR\t19979\t34064-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D201A.mp3\tCapt. Glenn Miller And The Aaftc Orchestra\tMoon Dreams\tV-DISC\t201A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D201-A.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tMoon Dreams\tV-Disc\t201-A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS20343-2.mp3\tArtie Shaw And His Orchestra\tMoon Face\tBrunswick\t7787\tB-20343-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5810.mp3\tSarah Vaughn & Teddy Wilson 4\tMoon Faced And Starry Eyed\tMUSICRAFT\t462\t5810\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152738.mp3\tBenny Goodman And His Orchestra\tMoon Glow\tVictor\t25398-A\t97752-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_018.mp3\tBenny Goodman And His Orchestra\tMoon Glow\tColumbia\t2927\tW152738-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB15912.mp3\tDuke Ellington & His Orch\tMoon Glow\tCOLUMBIA\t36317\tB15912\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14080-1.mp3\tJoe Venuti & His Orchestra\tMoon Glow\tBANNER\t33114\t14080-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVBOP4524.mp3\tErroll Garner\tMoon Glow\tSAVOY\t767\tBOP4524\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1944.mp3\tArt Tatum\tMoon Glow\tDECCA\t25202\tDLA1944\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COL152738-1.mp3\tBenny Goodman And His Orchestra\tMoon Glow\tCOLUMBIA\t35839\t152738-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/SIGT1928.mp3\tBarney Bigard Trio\tMoon Glow\tSIGNATURE\t28116-B\tT1928-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_103.mp3\tCab Calloway And His Orchestra\tMoon Glow\tVICTOR\t24690\t81089-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic81089-1.mp3\tCab Calloway And His Cotton Club Orchestra\tMoon Glow\tVictor\t24690\t81089-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_029.mp3\tDuke Ellington And His Famous Orchestra\tMoon Glow\tVictor\t24617\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/PARL0432-1.mp3\tCharlie Patton\tMoon Going Down\tPARAMOUNT\t13014A\tL0432-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65863.mp3\tPaul Whiteman Modernaires\tMoon Love\tDECCA\t2578A\t65863\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24765.mp3\tMildred Bailey & Her Orchestra\tMoon Love\tVOCALION\t4939\t24765\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_112.mp3\tPaul Whiteman And His Orchestra\tMoon Love\tDECCA\t2578A\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_231.mp3\tMildred Bailey Feat. Red Norvo (bandleader)\tMoon Love\tVOCALION\t4939\t24765-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_096.mp3\tAl Donahue And His Orchestra Feat. V/paula Kelly\tMoon Love\tVOCALION\t4888\t24703-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037157.mp3\tGlenn Miller & His Orch\tMoon Love (vre)\tBLUEBIRD\t10303\t037157\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC070684-1.mp3\tDuke Ellington Orch\tMoon Mist\tVICTOR\t27856\t070684-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31375.mp3\tCount Basie & His Orch\tMoon Nocturne\tOKEH\t6449\t31375\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1151-A.mp3\tBing Crosby - J Trotter Orch\tMoon Of Manakoora\tDECCA\t1649\tDLA1151-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D218A1.mp3\tDorothy Lamour And Dick Mcintire\tMoon Of Manakoora\tV-DISC\t218A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDIV2751-G.mp3\tMusical Comedy Orchestra\tMoon Of My Delight\tDIVA\t2751-G\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_328.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. V/dorothy Allen\tMoon Over Burma\tBluebird\t10886\t56306\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CON28642-1.mp3\tGene Krupa & His Orch\tMoon Over Burma (v Irene Daye)\tCONQUEROR\t9543\t28642-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC061341.mp3\tDuke Ellington & His Orch\tMoon Over Cuba - Puerto Rican Gal\tVICTOR\t27587\t061341\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11200-A.mp3\tDuke Ellington & His Orch\tMoon Over Dixie\tBRUNSWICK\t6317\t11200-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_161.mp3\tDuke Ellington And His Famous Orchestra Feat. V/sonny Greer\tMoon Over Dixie\tBRUNSWICK\t6317\t11200-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC98456.mp3\tEddy Duchin And His Orch\tMoon Over Miami\tVICTOR\t25212B\t98456\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60282.mp3\tConnie Boswell\tMoon Over Miami\tDECCA\t657A\t60282\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25212.mp3\tEddy Duchin & His Orchestra\tMoon Over Miami\tVictor\t25212\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_260.mp3\tConnee Boswell\tMoon Over Miami\tDECCA\t657A\t60282\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_012.mp3\tEddy Duchin And His Orchestra\tMoon Over Miami\tVICTOR\t25212B\t98456\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_075.mp3\tJan Garber\tMoon Over Miami\tDECCA\t651B\tC90521-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC18447-1.mp3\tLud Gluskin's Orch\tMoon Over Miami (vbuddy Clark)\tARC\tBR7590\t18447-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC91841.mp3\tElla Fitzgerald & Her Orch\tMoon Ray\tDECCA\t2904B\tC91841\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL25737.mp3\tTeddy Wilson & His Orch\tMoon Ray\tCOLUMBIA\t35354\t25737\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/GEN4828-B.mp3\tSpecialty Orchestra\tMoon River\tGennett\t4828-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_046.mp3\tJack Denny And His Orchestra\tMoon Song\tVICTOR\t24217\t74735-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480514.mp3\tArt Tatum And Roy Eldridge\tMoon Song\tClef\tMGC 679\t2306-2\t1955\tRoy Eldridge (tp), Art Tatum (p), John Simmons (sb), Alvin Stoller (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480681.mp3\tBen Webster And Harry Edison\tMoon Song\tVerve\tEPV5045\t20573-5\t1957\tBen Webster, Ts, Harry Sweets Edison, T, Jimmy Rowles, P, Barney Kessel, G, Joe Mandragon, B, Larry Bunker, D, Woody Herman, Vocal\nhttp://www.jazz-on-line.com/a/mp3c/CAP1619.mp3\tBenny Goodman And His Orchestra\tMoon-faced And Starry-eyed\tCAPITOL\t\t1619\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_232.mp3\tBenny Goodman And His Orchestra Feat. V/johnny Mercer\tMoon-faced, Starry-eyed\tCAPITOL\t376\t1619\t1947\tNate Kazebier, George Wendt, Zeke Zarchy, Joe Triscari (tp), Red Ballard, Lou McGarity, Bill Schaefer (tb), Benny Goodman (cl), Arthur \"Skeets\" Herfurt, Heinie Beau (as), Babe Russin, Jack Chaney (ts), Chuck Gentry (bar), Jess Stacy (p), Allen Reuss (g), Larry Breen (sb), Sam Weiss (dm) \nhttp://www.jazz-on-line.com/a/mp3a/BRUE21825.mp3\tNick Lucas\tMoonbeam Kiss Her For Me\tBRUNSWICK\t3492\tE21825\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20419-A.mp3\tB. F. Goodrich Silvertown Cord\tMoonbeam Kiss Her For Me\tVictor\t20419-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR337-Hx.mp3\tLou Gold And His Orch\tMoonbeam Kiss Her For Me2\tHarmony\t337-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/ManA-1578.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tMoonbeams\tManor\t1111\tA-1578\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA262-B.mp3\tBing Crosby W Georgie Stoll\tMoonburn\tDECCA\t617B\tDLA262-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU15912.mp3\tDuke Ellington & His Orch\tMoonglow\tBRUNSWICK\t6987\t15912\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC055258.mp3\tArtie Shaw And His Orchestra\tMoonglow\tVICTOR\t27549\t055258-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECLA5835.mp3\tLionel Hampton's Sextet\tMoonglow\tDECCA\t27372\tLA5835\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC81089-1.mp3\tCab Calloway & His Orchestra\tMoonglow\tVICTOR\t24690\t81089-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/MER5717M.mp3\tMuggsy Spanier's Dixielanders\tMoonglow\tMERCURY\t5717\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Cor74855.mp3\tLionel Hampton And His Orchestra\tMoonglow\tCoral\t622421\t74855\t1949\tBenny Bailey-Duke Garrette-Wendell Culley-Leo Shepherd-Walter Wiliams-t, Lester Bass-Al Grey-Benny Powell-Jimmy Wormick-tb, Johnny Board-Bobby Plater-as, Gene MorrisJohnny Sparrow-Billy Williams-ts, Ben Kynard-bar, Doug Duke-p, Lionel Harnpton-vib-p,\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5835.mp3\tLionel Hampton And His Sextet\tMoonglow\tDecca\t27372\tLA-5835\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_118.mp3\tGlen Gray And Casa Loma Orchestra Feat. Kenny Sargent, V\tMoonglow\tBRUNSWICK\t6937\t15434-A\t1934\tGrady Watts (tp), Sonny Dunham (tp, tb), Pee Wee Hunt, Billy Rauch (tb), Glen Gray (as, ldr), Clarence Hutchinrider (cl, as), Kenny Sargent, Pat Davis (ts), Mel Jenssen (vn), Joe Hall (p), Jack Blanchette (g), Stanley Dennis (bb, sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1956_014.mp3\tMorris Stoloff And Col. Pic Orchestra\tMoonglow And Theme From Picnic\tColumbia\t29888 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_035.mp3\tGeorge Cates And His Orchestra\tMoonglow And Theme From Picnic\tLiberty\t55022 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_034.mp3\tSousa's Band\tMoonlight\tMONARCH\tV-4528\tB2830-2\t1906\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25514.mp3\tEddy Duchin & His Orchestra\tMoonlight & Shadows\tVictor\t25514\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68783.mp3\tGuy Lombardo's Royal Canadians\tMoonlight And Roses\tDECCA\t3722B\t68783\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/DOTM-1036a.mp3\tJohnny Maddox And The Rhythmasters\tMoonlight And Roses\tDOT\tDEP-1016\tM-1036a\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW91790-1.mp3\tPaul Whiteman And His Orchestra (chorus With Al Rinker, Jack Fulton And Possibly Bing Crosby)\tMoonlight And Roses Medley\tColumbia\ttest\tW91790-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04264.mp3\tEddy Duchin & His Orch\tMoonlight And Shadows\tVICTOR\t25514\t04264\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1243.mp3\tDorothy Lamour\tMoonlight And Shadows\tBRUNSWICK\t7829\tLA1243\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA743.mp3\tBing Crosby & Victor Young\tMoonlight And Shadows\tDECCA\t1186\tDLA743\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_169.mp3\tDorothy Lamour\tMoonlight And Shadows\tBRUNSWICK\t7829\tLA1243\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA743-A.mp3\tVictor Young And His Orchestra With Bing Crosby\tMoonlight And Shadows \tDECCA\t1186\tDLA743-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_088.mp3\tEddy Duchin And His Orchestra Feat. Lew Sherwood\tMoonlight And Shadows\tVICTOR\t25514\t04264\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_050.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. Bob Goday\tMoonlight And Shadows\tBluebird\t6803\t4352\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC31153-2.mp3\tCoon-sanders Nighthawk Orch\tMoonlight And You\tVICTOR\t19525\t31153-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC11381-1.mp3\tAmerican Qt\tMoonlight Bay\tVICTOR\t17034\t11381-1\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67340.mp3\tMills Brothers\tMoonlight Bay\tDECCA\t3331A\t67340\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D149.mp3\tBing Crosby\tMoonlight Bay\tV-DISC\t149\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC25075-B.mp3\tGlenn Miller And His Orch\tMoonlight Bay\tDecca\t25075-B\t25075-B\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D149A1.mp3\tBing Crosby\tMoonlight Bay\tV-DISC\t149A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_001.mp3\tAmerican Quartet\tMoonlight Bay\tVictor\t17034\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_021.mp3\tDolly Connolly\tMoonlight Bay\tCOLUMBIA\t1128\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_112.mp3\tGary Crosby And Friend Feat. Bing Crosby\tMoonlight Bay\tDecca\t27577\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA3034.mp3\tBing Crosby - J.s.trotter Orch\tMoonlight Becomes You\tDECCA\t18513A\tDLA3034\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068456.mp3\tGlenn Miller And His Orch\tMoonlight Cocktail\tBLUEBIRD\t11401\t068456\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiEli5017.mp3\tDolly Dawn & Her Dawn Patrol\tMoonlight Cocktail\tElite\t5017\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2858.mp3\tBing Crosby - J.s.trotter Orch\tMoonlight Cocktail\tDECCA\t4184B\tDLA2858\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11401.mp3\tGlenn Miller & His Orchestra\tMoonlight Cocktail\tBluebird\t11401\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO56620.mp3\tFrankie Laine\tMoonlight Gambler\tCOLUMBIA\t40780\tCO56620\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_083.mp3\tCollins And Harlan\tMoonlight In Jungle Land\tColumbia\t814\t4653\t1907\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP182x.mp3\tBilly Butterfield\tMoonlight In Vermont\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_244.mp3\tBilly Butterfield And His Orchestra Feat. V/margaret Whiting\tMoonlight In Vermont\tCapitol\t182\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478354.mp3\tLes Brown And His Band Of Renown\tMoonlight In Vermont\tCAPITOL\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480450.mp3\tBen Webster And Harry Sweets Edison\tMoonlight In Vermont\tVerve\tMGV8211\t20826-3\t1957\tBen Webster, Ts, Harry Sweets Edison, T, Oscar Peterson, P, Herb Ellis, G, Ray Brown, B, Alvin Stoller, D\nhttp://www.jazz-on-line.com/a/mp3c/ATL156.mp3\tPaul Dunlap Orchestra\tMoonlight In Vermont (vfrankie Laine)\tATLANTIC\t156\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COL81286-3.mp3\tCalifornia Ramblers\tMoonlight Kisses\tCOLUMBIA\t15D\t81286-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_119.mp3\tCalifornia Ramblers\tMoonlight Kisses\tCOLUMBIA\t15D\t81286-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_249.mp3\tPerry Como\tMoonlight Love\tRCA\t6670\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR701-Hy.mp3\tArthur Ross And His Westerners\tMoonlight Madness (then You\tHarmony\t701-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067965-1.mp3\tUna Mae Carlisle\tMoonlight Masquerade\tBLUEBIRD\t11330\t067965-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_314.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tMoonlight Masquerade\tDECCA\t3991A\t69597\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiUnkm.mp3\tGlenn Miller & His Orchestra\tMoonlight Mood\tUnknown\t\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_076.mp3\tKay Kyser And His Orchestra\tMoonlight Mood\tCOLUMBIA\t36657\tHCO900\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_228.mp3\tConnee Boswell\tMoonlight Mood\tDECCA\t18509\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3457.mp3\tBing Crosby - J.s.trotter Or.\tMoonlight On A White Picket Fence\tDECCA\t24379\tL3457\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150673-1.mp3\tBen Selvin & His Orch\tMoonlight On The Colorado\tCOLUMBIA\t2266\tW150673-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-6108.mp3\tJimmie Noone's Apex Club Orchestra\tMoonlight On The Colorado ? V E P\tVocalion\t1531\tC-6108\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36044-2.mp3\tPaul Whiteman And His Orch\tMoonlight On The Ganges\tVICTOR\t20139B\t36044-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17380.mp3\tGlenn Miller & His Orchestra\tMoonlight On The Ganges\tARC\tCO3051\t17380\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC072169.mp3\tTommy Dorsey & His Orch\tMoonlight On The Ganges\tVICTOR\t27876\t072169\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5812.mp3\tTeddy Wilson Qt\tMoonlight On The Ganges\tMUSICRAFT\t446\t5812\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA12.mp3\tSons Of The Pioneers\tMoonlight On The Prairie\tDECCA\t5047B\tDLA12\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021042.mp3\tTommy Dorsey & His Orch\tMoonlight On The Purple Sage\tVICTOR\t25803\t021042\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1932_0826_01.mp3\tLee Morse And Her Bluegrass Boys\tMoonlight On The River\tColumbia\t2705DA\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUCP1105.mp3\tCab Calloway & His Orch\tMoonlight Rhapsody\tBRUNSWICK\t7411\tCP1105\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/BruCP-1105-A.mp3\tCab Calloway And His Orchestra\tMoonlight Rhapsody\tBrunswick\t7411\tCP-1105-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC69656.mp3\tMaurice Chevalier\tMoonlight Saving Time\tVICTOR\t22723\t69656\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151527-2.mp3\tGuy Lombardo Royal Canadians\tMoonlight Saving Time (vcl)\tCOLUMBIA\t2457 D\tW151527-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC53093-3.mp3\tHigh Hatters\tMoonlight Savings Time\tVICTOR\t22703\t53093-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE36652.mp3\tHal Kemp & His Orch\tMoonlight Savings Time\tBRUNSWICK\t6108\tE36652\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU035701.mp3\tGlenn Miller And His Orchestra\tMoonlight Serenade\tBLUEBIRD\t10214\t035701\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC85530.mp3\tGlenn Miller ''the Glenn Miller Story''\tMoonlight Serenade\tDECCA\t29014\t85530\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu10214.mp3\tGlenn Miller & His Orchestra\tMoonlight Serenade\tBluebird\t10214\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/RCAVI20-1566x.mp3\tGlenn Miller And His Orchestra\tMoonlight Serenade\tRCA\t20-1566\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_039.mp3\tGlenn Miller And His Orchestra\tMoonlight Serenade\tBLUEBIRD\t10214\t035701\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24978-A.mp3\tCount Basie And His Orchestra\tMoonlight Serenade\tVocalion\t5036\t24978-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068418.mp3\tGlenn Miller & His Orch\tMoonlight Sonata\tBLUEBIRD\t11386-A\t068418\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D210A.mp3\tFrankie Carle And His Orchestra\tMoonlight Whispers\tV-DISC\t210A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_333.mp3\tTex Beneke And His Orchestra\tMoonlight Whispers\tRCA Victor\t2667\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU99977.mp3\tWillie Bryant & His Orch\tMoonrise On The Lowlands\tBLUEBIRD\t6362\t99977\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100361-1.mp3\tFletcher Henderson & His Orch\tMoonrise On The Lowlands\tVICTOR\t25297B\t100361-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_292.mp3\tWillie Bryant And His Orchestra Feat. Willie Bryant\tMoonrise On The Lowlands\tBLUEBIRD\t6362\t99977\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic100361-1.mp3\tFletcher Henderson And His Orchestra\tMoonrise On The Lowlands\tVictor\t25297\t100361-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81676-1.mp3\tBessie Smith\tMoonshine Blues\tCOLUMBIA\t14018 D\t81676-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC022484-2.mp3\tBunny Berigan & His Orch\tMoonshine Over Kentucky\tVICTOR\t25833A\t022484-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC25833A.mp3\tBunny Berigan & His Orch\tMoonshine Over Kentucky\tVICTOR\t25833A\t022484-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUB780.mp3\tBing Crosby\tMoonstruck\tBRUNSWICK\t6594\tB780\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DIAD1010.mp3\tCharlie Parker Septet\tMoose The Mooche\tDIAL\t1004\tD1010\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC8668B.mp3\tLouis Jordan Tympani 5\tMop! Mop!\tDECCA\t8668B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA40-4003.mp3\tFats Waller And His Rhythm\tMoppin' And Boppin'\tRCA\t40-4003\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_036.mp3\tPerry Como\tMore\tRCA Victor\t6554\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_136.mp3\tTommy Dorsey And His Orchestra\tMore And More\tVictor\t20-1614\tD4VB1047\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3681.mp3\tBing Crosby - J.s.trotter\tMore And More\tDECCA\t18649\tL3681\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_203.mp3\tWebb Pierce\tMore And More\tDECCA\t29252\t86660\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_201.mp3\tPerry Como\tMore And More\tVICTOR\t1630\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4847.mp3\tAndrews Sisters\tMore Beer\tDECCA\t24548\tL4847\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_303.mp3\tAndrews Sisters\tMore Beer!\tDECCA\t24548\tL4847\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_306.mp3\tLily Ann Carol\tMore Luck Than Money\tRCA VICTOR\t5184\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013351.mp3\tFats Waller And His Rhythm\tMore Power To You\tVICTOR\t25679\t013351\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63220-A.mp3\tJabbo Smith And His Orchestra\tMore Rain, More Rest\tDecca\t1980\t63220-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/GOTS1185.mp3\tDon Byas Qt\tMore Than A Mood\tGOTHAM\t131\tS1185\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC018422.mp3\tTommy Dorsey & His Orch\tMore Than Ever\tVICTOR\t25774\t018422\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_105.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tMore Than Ever\tVICTOR\t25774\t018422\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU22406-2.mp3\tRed Norvo & His Orch\tMore Than Ever (v M B)\tBRUNSWICK\t8085\t22406-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149412-2.mp3\tRuth Etting\tMore Than You Know\tCOLUMBIA\t2038\tW149412-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100396-1.mp3\tBenny Goodman Trio\tMore Than You Know\tVICTOR\t25345-B\t100396-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB24046-2.mp3\tTeddy Wilson & His Orch\tMore Than You Know\tCOLUMBIA\t36117\tB24046-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70313-A.mp3\tMildred Bailey\tMore Than You Know\tDECCA\t4267B\t70313-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041381.mp3\tErskine Hawkins & His Orch\tMore Than You Know\tBLUEBIRD\t10504\t041381\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVB4416.mp3\tErroll Garner\tMore Than You Know\tSAVOY\t863\tB4416\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT1422.mp3\tJohnny Guarnieri\tMore Than You Know\tMAJESTIC\t1229\tT1422\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE31767.mp3\tCount Basie & His Orch\tMore Than You Know\tOKEH\t6584\t31767\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VOCWM-1112-1.mp3\tBenny Carter And His Orchestra\tMore Than You Know\tVOCALION\t5508\tWM-1112-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_093.mp3\tRuth Etting\tMore Than You Know\tCOLUMBIA\t2038\tW149412-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_255.mp3\tMildred Bailey\tMore Than You Know\tDECCA\t4267B\t70313-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_246.mp3\tPerry Como Feat. Russell Case's Orchestra\tMore Than You Know\tRCA Victor\t1877\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24046-1.mp3\tTeddy Wilson And His Orchestra\tMore Than You Know\tBrunswick\t8319\tB-24046-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480420.mp3\tThe Art Tatum Trio\tMore Than You Know\tPablo\t2310-735\t2670-1\t1956\tArt Tatum (p), Red Callender (sb), Jo Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480541.mp3\tArt Tatum And Lionel Hampton\tMore Than You Know\tClef\tMGC709\t2386-1\t1955\tArt Tatum (p), Lionel Hampton (vib), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3d/Dec73396.mp3\tLucky Millinder And His Orchestra\tMore, More, More\tDecca\t23825\t73396\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D297B2.mp3\tChu Chu Martinez And His Orchestra\tMorena Linda\tV-DISC\t297B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_108.mp3\tMontgomery And Stone\tMoriah - Scotch Medley\tVICTOR\t70044\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_133.mp3\tLawrence Welk And His Sparkling Septet\tMoritat (a Theme From The Three Penny Opera)\tCoral\t61574\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_055.mp3\tDick Hyman Trio\tMoritat (a Theme From The Threepenny Opera)\tMGM\t12149\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_278.mp3\tLes Paul\tMoritat (theme From Three Penny Opera)\tCapitol\t3329\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL1000-2.mp3\tJoe Turner & His Orch\tMorning Glory\tALLADDIN\t3013\t1000-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC5594.mp3\tMary Johnson\tMorning Sun Blues\tBRUNSWICK\t7175\tC5594\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80929.mp3\tAl Jolson\tMorning Will Come\tCOLUMBIA\tA-3880\t80929\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_106.mp3\tGeorgie Price\tMorning Will Come\tVICTOR\t19047\t27674-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_041.mp3\tAl Jolson\tMorning Will Come\tCOLUMBIA\tA-3880\t80929\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/PARG15666.mp3\tBlind Lemon Jefferson\tMosquito Moan\tPARAMOUNT\t12899B\tG15666\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36311.mp3\tMary Martin W E.duchin Orch\tMost Gentlemen Don't Like Love\tCOLUMBIA\t36310\tCO36311\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_108.mp3\tDon Cornell\tMost Of All\tCoral\t61393\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_208.mp3\tCrew-cuts\tMostly Martha\tMercury\t70741\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-2236-1.mp3\tFletcher Henderson And His Orchestra\tMoten Stomp\tVocalion\t4180\tC-2236-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP345.mp3\tJulia Lee And Mcshann Stomper\tMoten Swing\tCAPITOL\t\t345\t\t\nhttp://www.jazz-on-line.com/a/mp3a/PARR-2768x.mp3\tCount Basie And His Orch\tMoten Swing\tParlophone\tR-2768\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC60853.mp3\tAndy Kirk And Clouds Of Joy\tMoten Swing\tDECCA\t3517B\t60853\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYHL162.mp3\tBernie Leighton Qt\tMoten Swing\tKEYNOTE\t644\tHL162\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60853-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tMoten Swing\tDecca\t853\t60853-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeWC-3257-A.mp3\tCount Basie And His Orchestra\tMoten Swing\tOkey\t5732\tWC-3257-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU55424-2.mp3\tBennie Moten's Kansas City Or.\tMoten's Blues\tBLUEBIRD\t7938\t55424-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC74847-1.mp3\tBennie Moten's Kansas Orch\tMoten's Swing\tVICTOR\t23384\t74847-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0606_02.mp3\tLee Morse And Her Bluegrass Boys\tMother And Dad\tColumbia\t1497DB\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0420_02.mp3\tLee Morse\tMother And Dad\tPerfect\t11590B\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011120.mp3\tBunny Berigan & His Orch\tMother Goose\tVICTOR\t25616B\t011120\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU69329.mp3\tAllen Brothers\tMother In Law Blues\tBLUEBIRD\t5380\t69329\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU5380m.mp3\tAllen Brothers\tMother In Law Blues\tBLUEBIRD\t5380\t69329\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64181x.mp3\tJohn Mccormack\tMother Machree\tVICTOR\t64181\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_004.mp3\tJohn Mccormack\tMother Machree\tVICTOR\t64181\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU25184.mp3\tAl Jolson W W.wirges Orch\tMother Of Mine, I Still Have You\tBRUNSWICK\t3719\t25184\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC40752.mp3\tJimmie Rodgers\tMother Was A Lady\tVICTOR\t23193\t40752\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145319.mp3\tBlind Willie Johnson\tMother's Children Have A Hard Time\tCOLUMBIA\t14343 D\tW145319\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150778.mp3\tCharlie Poole\tMother's Last Farewell Kiss\tCOLUMBIA\treject\tW150778\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4611-1.mp3\tBill Monroe's Bluegrass Boys\tMother's Only Sleeping\tCOLUMBIA\t37294\tCCO4611-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon58961.mp3\tJimmie Rodgers\tMother, Queen Of My Heart\tMontgomeryWard\t4206\t58961\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/PARL0264.mp3\tElvie Thomas\tMotherless Child Blues\tPARAMOUNT\t12977A\tL0264\t1930\t\nhttp://www.78-tours.net/mp3/VOGV3095s.mp3\tSidney Bechet Claude Luter Et Son Orchestre\tMoulin  Caf\tVOGUE\tV. 5066\tV. 3095 s\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO48810.mp3\tPercy Faith\tMoulin Rouge\tCOLUMBIA\t39944\tCO48810\t\t\nhttp://www.78-tours.net/mp3/ODECe14499.mp3\tRon Godwin And His Orchestra\tMoulin-rouge\tODON\t275.077\tCe 14.499\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70299.mp3\tPete Brown & His Jump Band\tMound Bayou\tDECCA\t8613\t70299\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/KeyHL-25.mp3\tCharlie Shavers Quintet\tMountain Air\tKeynote\t1304\tHL-25\t1944\tCharlie Shavers t, Tab Smith as, Earl Hines p,Al Lucas b, Jo Jones d\nhttp://www.jazz-on-line.com/a/mp3o/KIN624x.mp3\tGrandpa Jones And Grandchildren\tMountain Dew\tKING\t624\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1977.mp3\tDorothy Shay\tMountain Gal\tCOLUMBIA\t37190\tHCO1977\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35633-2.mp3\tRoger Wolfe Kahn And His Orch\tMountain Greenery\tVICTOR\t20071\t35633-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20124-B.mp3\tFrank Crumit\tMountain Greenery\tVICTOR\t20124\t35949-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20071m.mp3\tRoger Wolfe Kahn & His Orchestra\tMountain Greenery\tVictor\t20071\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142633-2.mp3\tCharlie Poole N.c.ramblers\tMountain Reel\tCOLUMBIA\t15279 D\tW142633-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81882-1.mp3\tBessie Smith\tMountain Top Blues\tCOLUMBIA\t14031 D\t81882-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87035-1.mp3\tCarter Family\tMountains Of Tennessee\tBLUEBIRD\t5956\t87035-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU45624-2.mp3\tJelly Roll Morton Trio\tMournful Serenade\tBLUEBIRD\t6601\t45624-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic45624-2.mp3\tJelly-roll Morton's Red Hot Peppers\tMournful Serenade\tVictor\tV-38024\t45624-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480382.mp3\tArt Pepper\tMove\tContemporary\tM3568\t\t1959\tJackSheldon, Al Porcino (tp), Dick Nash (tb), Bob Ebevoldsen (vtb), Vince DeRosa (fhr), Art Pepper, Charlie Kennedy (as), Richie Kamuca (ts), Med Flory (bar), Russ Freeman (p), Joe Mondragon (sb), Mel Lewis (dm), Marty Paich (arr, cond)\nhttp://www.jazz-on-line.com/a/mp3a/MGM47S123.mp3\tHank Williams\tMove It On Over\tMGM\t10033\t47S123\t\t\nhttp://www.jazz-on-line.com/a/mp3a/APO164x.mp3\tMahalia Jackson\tMove On Up A Little Higher (pt1 & 2)\tAPOLLO\t164\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE401176-BA.mp3\tHarlem Footwarmers (ellington)\tMove Over\tOKeh\t8638\t401176-BA\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC066120.mp3\tAlbert Ammons & Pete Johnson\tMovin' The Boogie\tVICTOR\t27507B\t066120\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_432.mp3\tLu Ann Simms\tMoving Away\tCOLUMBIA\t39928\tCO48714\t1953\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480383.mp3\tArt Farmer Quintet (with Benny Golson)\tMox Nix\tUnited Artists\tUAL4007\t\t1958\tArt Farmer, T, Flh, Benny Golson, Ts, Addison Farmer, B, Bill Evans, P, Dave Bailey, D, Gigi Gryce, Ar\nhttp://www.jazz-on-line.com/a/mp3b/DEC38950.mp3\tVictor Young & His Orch\tMr And Mrs Is The Name\tDECCA\t279A\t38950\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5932.mp3\tWynonie Harris & His Allstars\tMr Blues Is Coming To Town\tKING\t4402\tK5932\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL75-2.mp3\tWynonie Harris & His Allstars\tMr Blues Jumped The Rabbit\tAladdin\t171\t75-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC109.mp3\tPete Johnson's Allstars\tMr Clarinet Knocks Twice\tNATIONAL\t\tNSC109\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC107.mp3\tPete Johnson's Allstars\tMr Drum Man Meets Mr Piano\tNATIONAL\t\tNSC107\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC90564.mp3\tMeade Lux Lewis\tMr Freddie Blues\tDECCA\t3831A\tC90564\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/OKeS70638-B.mp3\tErnest Hare And Billy Jones\tMr Gallagher And Mr Shean\tOKeh\t4608\tS70638-B\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1298-A.mp3\tBing Crosby & Johnny Mercer\tMr Gallagher And Mr Sheen\tDECCA\t1960A\tDLA1298-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04201.mp3\tTommy Dorsey & His Orch\tMr Ghost Goes To Town\tVICTOR\t25509\t04201\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1675-1.mp3\tLouis Prima New Orleans Gang\tMr Ghost Goes To Town\tVOCALION\t3388\tC1675-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61447.mp3\tWoody Herman & His Orchestra\tMr Ghost Goes To Town\tDECCA\t1079\t61447\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh173.mp3\tThe Royal Navy Blue Mariners\tMr Ghost Goes To Town\tDecca\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW146765-3.mp3\tBilly Jones And Ernest Hare\tMr Hoover And Mr Smith\tCOLUMBIA\t1483 D\tW146765-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC38664-1.mp3\tJelly Roll Morton Trio\tMr Jelly Lord\tVICTOR\t21064\t38664-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC107.mp3\tAl Jolson W-isham Jones Orch\tMr Radio Man\tBRUNSWICK\t2582\tC107\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL8904.mp3\tPeggy Lee\tMr Wonderful\tDECCA\t29834\tL8904\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_096.mp3\tSarah Vaughan\tMr Wonderful\tMercury\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18941.mp3\tEd Gallagher & Al Shean\tMr. Gallagher & Mr. Shean (absoloutely)\tVictor\t18941\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_008.mp3\tErnest Hare And Billy Jones\tMr. Gallagher And Mr. Shean\tOKeh\t4608\tS70638-B\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-20295-1.mp3\tMills Blue Rhythm Band\tMr. Ghost Goes To Town\tColumbia\t3158-D\tCO-20295-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_197.mp3\tErnest Hare And Billy Jones\tMr. Hoover And Mr. Smith\tVictor\t21607\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic38564-1.mp3\tJelly-roll Morton's Red Hot Peppers\tMr. Jelly Lord\tVictor\t21064\t38564-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/VocC-1632.mp3\tLevee Serenaders\tMr. Jelly Lord\tVocalion\t1154\tC-1632\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI3899.mp3\tHelen Clark - Joseph A. Phillips - O\tMr. Love Will Catch You Yet\tEDISON\t\t3899\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45224.mp3\tCarl Smith W String Band\tMr. Moon\tCOLUMBIA\t20825\tCO45224\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_006.mp3\tChordettes\tMr. Sandman\tCadence\t1247\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/KinK-5861.mp3\tLucky Millinder And His Orchestra\tMr. Trumpet Man\tKing\t4436\tK-5861\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_144.mp3\tTeddi King\tMr. Wonderful\tRCA\t6392\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_102.mp3\tPeggy Lee\tMr. Wonderful\tDecca\t29834\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31301.mp3\tCab Calloway & His Orch\tMrs Finnegan\tOKEH\t6459\t31301\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60405.mp3\tBob Howard & His Orch\tMuch Too Much\tDECCA\t722A\t60405\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4545.mp3\tLionel Hampton & His Orch\tMuchacho Azul\tDECCA\t24428\tL4545\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75640.mp3\tArtie Shaw And His Orchestra\tMucho De Nada\tDECCA\t24889\t75640\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU059435.mp3\tBill 'jazz' Gillum\tMuddy Pond Blues\tBLUEBIRD\t8739\t059435\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38143-3.mp3\tPaul Whiteman & His Orch\tMuddy Water\tVICTOR\t20508A\t38143-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE21260-1.mp3\tHarry Richman\tMuddy Water\tBRUNSWICK\t3435\tE21260-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_115.mp3\tHarry Richman\tMuddy Water\tBRUNSWICK\t3435\tE21260-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_059.mp3\tBen Bernie And His Orchestra Feat. V/frank Munn\tMuddy Water\tBRUNSWICK\t3414\tE21076\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61323-A.mp3\tJimmie Lunceford And His Orchestra\tMuddy Water (a Mississippi Moan)\tDecca\t1219\t61323-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61323-A.mp3\tJimmie Lunceford And His Orchestra\tMuddy Water (a Mississippi Moan).mp3\tDecca\t1219\t61323-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE21076.mp3\tBen Bernie & His Orch\tMuddy Water (v Frank Munn)\tBRUNSWICK\t3414\tE21076\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS20015.mp3\tSharkey Bonano Sharks-rhythm\tMudhole Blues\tCBS\tVO3353\t20015\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9846-A.mp3\tRichard M Jones Jazz Wizards\tMuggin' The Blues\tDECCA\t7064\tC9846-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404428-B.mp3\tLuis Russell & His Orch\tMugging Lightly\tOKeh\t8830\t404428-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402200-B.mp3\tLouis Armstrong's Hot Five With Earl Hines Piano\tMuggles\tOKeh\t8703\t402200-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030822.mp3\tBill 'jazz' Gillum\tMule Blues\tBLUEBIRD\t8027\t030822\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP40258x.mp3\tTennessee Ford\tMule Train\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MERME3041-8.mp3\tFrankie Laine - Carl Fisher\tMule Train\tMERCURY\t5345\tME3041-8\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24798x.mp3\tBing Crosby\tMule Train\tDECCA\t24798\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_084.mp3\tTennessee Ernie Ford\tMule Train\tCapitol\t40258\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu99774-1.mp3\tMezz Mezzrow And His Swing Band\tMunity In The Parlor\tBluebird\tB-6313\t99774-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKECO33002.mp3\tGene Krupa & His Orch\tMurder He Says\tOKEH\t6696\tCO33002\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULA1759-B.mp3\tGene Krupa And His Orch\tMurdy Purdy\tBRUNSWICK\t8284\tLA1759-B\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81839-2.mp3\tFletcher Henderson's Orch\tMuscle Shoals Blues\tCOLUMBIA\t164D\t81839-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/Oke70948-D.mp3\tThomas Waller (fats Waller)\tMuscle Shoals Blues\tOkeh\t4757\t70948-D\t1922\t\nhttp://www.jazz-on-line.com/a/mp3d/Col81839-2.mp3\tFletcher Henderson And His Orchestra\tMuscle Shoals Blues\tColumbia\t164-D\t81839-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152201-1.mp3\tClaude Hopkins & His Orch\tMush Mouth\tCOLUMBIA\t2674 D\tW152201-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe9772.mp3\tRichard Jones Jazz Wizards\tMushmouth Blues\tOKeh\t8349\t9772\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU62342-1.mp3\tJelly Roll Morton Hot Peppers\tMushmouth Shuffle\tBLUEBIRD\t8201\t62342-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic62342-1.mp3\tJelly-roll Morton And His Red Hot Peppers\tMushmouth Shuffle\tVictor\t23004\t62342-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/DecB-13355-A.mp3\tSpike Hughes And His Negro Orchestra With Benny Carter\tMusic At Midnight \tDecca \tF-3836\tB-13355-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_159.mp3\tVic Damone Feat. George Siravo's Orchestra\tMusic By The Angels\tMERCURY\t5563\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67587.mp3\tWoody Herman & His Orchestra\tMusic By The Moon\tDECCA\t3380B\t67587\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/APO777MHB.mp3\tIllinois Jacquet\tMusic Hall Beat\tAPOLLO\t777\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16367.mp3\tBenny Goodman And His Orchestra\tMusic Hall Rag\tARC\tCO3011D\t16367\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_120.mp3\tBenny Goodman And His Orchestra\tMusic Hall Rag\tCOLUMBIA\t3011 D\t16367\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_117.mp3\tJimmie Grier And His Orchestra\tMusic In The Moonlight\tVictor\t22971\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/MER5458x.mp3\tFrankie Laine\tMusic Maestro Please\tMERCURY\t5458\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22948.mp3\tKay Kyser & His Orchestra\tMusic Maestro Please\tCBS\tBR8149\t22948\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC023211.mp3\tTommy Dorsey And His Orch\tMusic Maestro, Please\tVICTOR\t25866\t023211\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO29423.mp3\tHarry James And His Orch\tMusic Makers\tCOLUMBIA\t37143\tCO29423\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29580-1.mp3\tCount Basie And His Orchestra\tMusic Makers\tOkeh\t6047\t29580-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COL131160.mp3\tFred Astaire\tMusic Makes Me\tCOLUMBIA\t2912 D\t131160\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COL29423.mp3\tHarry James And His Orch\tMusic Makes Me\tCOLUMBIA\t35932\t29423\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_211.mp3\tFred Astaire\tMusic Makes Me\tColumbia\t2912\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_012.mp3\tTeresa Brewer Feat. Dixieland All Stars\tMusic! Music! Music!\tLONDON\t30023\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_057.mp3\tCarmen Cavallaro And His Orchestra Feat. Bob Lido And Cavaliers\tMusic! Music! Music!\tDECCA\t24881\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU023270-1.mp3\tArt Kassel & His Orch\tMusic, Maestro, Please\tBLUEBIRD\t7619\t023270-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47296.mp3\tErroll Garner Trio\tMusic, Maestro, Please\tCOLUMBIA\t39734\tCO47296\t1952\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25866.mp3\tTommy Dorsey & His Orchestra\tMusic, Maestro, Please\tVictor\t25866\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_003.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tMusic, Maestro, Please\tVICTOR\t25866\t023211\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh785A.mp3\tLaddie Ray Piano And Dance Band\tMusical Comedy Memories Part 1\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC4036-C.mp3\tBenny Goodman And His Boys\tMuskrat Ramble\tBRUNSWICK\t4968\tC4036-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPemmr.mp3\tEddie Miller\tMuskrat Ramble\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE9538-A.mp3\tLouis Armstrong And His Hot Five\tMuskrat Ramble\tOKeh\t8300\t09538-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC053435.mp3\tBechet New Orleans Feetwarmers\tMuskrat Ramble\tVICTOR\t27240\t053435\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC057618-1.mp3\tHenry Levine Barefoot Dixielnd\tMuskrat Ramble\tVICTOR\t27302\t057618-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL9538A.mp3\tLouis Armstrong And His Hot Five Cornet-louis Armstrong ; Trombone-kid Ory ; Clarinet-johnny Dodds ;\tMuskrat Ramble\tCOLUMBIA\t36153\t9538A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3755.mp3\tKid Ory's Dixieland Band\tMuskrat Ramble\tDECCA\t25133\tL3755\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1190-1.mp3\tRoy Eldridge & His Orch\tMuskrat Ramble\tVARSITY\t8154\tUS1190-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17262H-.mp3\tThe Dutch Swing College Band\tMuskrat Ramble\tPhilips\tP17262H\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN043MR.mp3\tSidney Bechet Bluenote Jazzmen\tMuskrat Ramble\tBLUENOTE\tBN043\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC61036.mp3\tBob Crosby & His Orchestra\tMuskrat Ramble\tDECCA\t3338A\t61036\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Col27686-1.mp3\tBud Freeman And His Famous Chicagoans\tMuskrat Ramble\tCOLUMBIA\t35855\t27686-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_300.mp3\tLouis Armstrong\tMuskrat Ramble\tOKeh\t8300\t09538-A\t1954\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic024068-1.mp3\tLionel Hampton And His Orchestra\tMuskrat Ramble\tVictor\t26017\t024068-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80352.mp3\tLouis Armstrong & His Orch\tMuskrat Ramble Pt.1\tDECCA\t28095\t80352\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80353.mp3\tLouis Armstrong & His Orch\tMuskrat Ramble Pt.2\tDECCA\t28096\t80353\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_114.mp3\tHilltoppers\tMust I Cry Again\tCORAL\tDOT15034\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC108.mp3\tPete Johnson's Allstars\tMutiny In The Doghouse\tNATIONAL\t\tNSC108\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC100013-1.mp3\tGene Krupa's Swing Band\tMutiny In The Parlor\tVICTOR\t25263\t100013-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/CAR2501x.mp3\tJimmy Noone With Kid Ory's Creo\tMutt's Blues\tCarousel\t2501\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36704-1.mp3\tCount Basie & His Orch\tMutton Leg\tCOLUMBIA\t37093\tCO36704-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_169.mp3\tTeresa Brewer\tMutual Admiration Society\tCoral\t61737\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_268.mp3\tEddy Arnold And Jaye P. Morgan\tMutual Admiration Society\tRCA\t6708\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/MAJCT1055.mp3\tEddy Howard And His Orchestra\tMy Adobe Hacienda\tMAJESTIC\t1117A\tCT1055\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_180.mp3\tKenny Baker Feat. Russ Morgan's Orchestra\tMy Adobe Hacienda\tDECCA\t23846\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_112.mp3\tDinning Sisters\tMy Adobe Hacienda\tCapitol\t389\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC43661-1.mp3\tPaul Whiteman And His Orch\tMy Angel\tVICTOR\t21388A\t43661-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU27434.mp3\tVincent Lopez & His Orch\tMy Angel (v L J)\tBRUNSWICK\t3927\t27434\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR787-Hy.mp3\tHarmonians\tMy Annapolis\tHarmony\t787-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG13686.mp3\tJimmie Blythe\tMy Baby\tGENNETT\t6454\tG13686\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE82076.mp3\tChicago Footwarmers\tMy Baby\tOKEH\t8548\t82076\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/PerA-169x.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tMy Baby And Me\tPerception\tPLP35-2\tA-169x\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_045.mp3\tLewis James\tMy Baby Boy\tCOLUMBIA\tA-2638\t78008-1\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC6127.mp3\tIsham Jones And His Orch\tMy Baby Just Cares For Me\tBRUNSWICK\t4907\tC6127\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1104-B132.mp3\tTed Fio Rito's Orchestra\tMy Baby Just Cares For Me  Fox Trot\tHIT OF THE WEEK\t1104\t1104-B132\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64001-3.mp3\tTed Weems And His Orch\tMy Baby Just Cares For Me (va.jarrett)\tVICTOR\t22499A\t64001-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC37215-4.mp3\tCoon Sanders Nighthawk Orch\tMy Baby Knows How\tVICTOR\t20390A\t37215-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR142899-3.mp3\tUniversity Six\tMy Baby Knows How\tHARMONY\t296-H\t142899-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_209.mp3\tElvis Presley\tMy Baby Left Me\tRCA\t6540\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24332MBL.mp3\tElla Fitzgerald\tMy Baby Likes Bebop\tDECCA\t24332\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3477-A.mp3\tBing Crosby & Louis Jordan\tMy Baby Said Yes\tDECCA\t23417\tL3477-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146884-2.mp3\tEthel Waters\tMy Baby Sure Knows How To Love\tCOLUMBIA\t14411 D\tW146884-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2265x.mp3\tLes Paul And Mary Ford\tMy Baby's Coming Home\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14038-2.mp3\tBlind Willie (mctell)\tMy Baby's Gone\tARC\tVO2668z\t14038-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044989.mp3\tTommy Mcclennan\tMy Baby's Gone\tBLUEBIRD\t8669\t044989\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_277.mp3\tJoni James\tMy Believing Heart\tMGM\t12126\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU14010-1.mp3\tIsham Jones & His Orch\tMy Best Girl\tBRUNSWICK\t2750\t14010-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU-2768MB.mp3\tNick Lucas (guitar And Voice)\tMy Best Girl\tBRUNSWICK\t2768\t-\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_167.mp3\tCliff Edwards\tMy Best Girl\tPath\t032088\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC48617-2.mp3\tJean Goldkette & His Orch\tMy Blackbirds Are Bluebirds Now\tVICTOR\t21805\t48617-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_100.mp3\tRuth Etting\tMy Blackbirds Are Bluebirds Now\tCOLUMBIA\t1595 D\tW147092-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA377.mp3\tJimmie Davis\tMy Blue Bonnet Girl\tDECCA\t5238\tDLA377\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC69685-2.mp3\tEubie Blake And His Orchestra\tMy Blue Days Blew Over (when You Came Back To Me)\tVICTOR\t22735\t69685-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D351B1b.mp3\tBilly Williams\tMy Blue Heaven\tV-DISC\t351B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC39627-3.mp3\tPaul Whiteman And His Orch\tMy Blue Heaven\tVICTOR\t20828A\t39627-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046158.mp3\tColeman Hawkins Allstar Orch\tMy Blue Heaven\tBLUEBIRD\t10770\t046158\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048968.mp3\tGlenn Miller & His Orch\tMy Blue Heaven\tBLUEBIRD\t10994 B\t048968\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144651-3.mp3\tDon Voorhees & His Orch\tMy Blue Heaven\tCOLUMBIA\t1129 D\tW144651-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22597.mp3\tSammy Kaye Swing & Sway Orch\tMy Blue Heaven\tCBS\tVO4199\t22597\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS7794-2.mp3\tStuff Smith & His Orch\tMy Blue Heaven\tVARSITY\t8081\tUS7794-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5723.mp3\tJohnny Guarnieri Trio\tMy Blue Heaven\tSAVOY\t556A\tS5723\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69370.mp3\tMaxine Sullivan\tMy Blue Heaven\tDECCA\t4154B\t69370\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/COLZSP5428.mp3\tHerman Chittison Trio\tMy Blue Heaven\tCOLUMBIA\t39397\tZSP5428\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC39179-1.mp3\tGene Austin\tMy Blue Heaven\tVICTOR\t20964A\t39179-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR494-Hx.mp3\tRoyal Troubadours\tMy Blue Heaven\tHarmony\t494-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC60274.mp3\tJimmie Lunceford And His Orch\tMy Blue Heaven\tDECCA\t712A\t60274\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_001.mp3\tGene Austin Feat. Nat Shilkret And His Orchestra\tMy Blue Heaven\tVICTOR\t20964A\t39179-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_148.mp3\tFats Domino\tMy Blue Heaven\tImperial\t5386\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478355.mp3\tLes Brown And His Band Of Renown\tMy Blue Heaven\tCAPITOL\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/TedP-22827-2.mp3\tTeddy Wilson And His Orchestra\tMy Blue Heaven\tTeddy Wilson School \t\tP-22827-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480649.mp3\tThe Art Tatum/benny Carter/louis Bellson Trio\tMy Blue Heaven\tClef\tEP-320\t1788-1\t1954\tBenny Carter (as) Art Tatum (p) Louie Bellson (d)\nhttp://www.jazz-on-line.com/a/mp3c/BAN15572-1.mp3\tLuis Russell & His Orchestra\tMy Blue Heaven (v Sonny Woods)\tBANNER\t33399\t15572-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60274-A.mp3\tJimmie Lunceford And His Orchestra\tMy Blue Heaven.mp3\tDecca\t712\t60274-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_067.mp3\tVernon Dalhart Feat. Carson Robinson\tMy Blue Ridge Mountain Home\tVICTOR\t20539A\t38150-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/GENGEX-1415.mp3\tVan And His Hotel Half Moon Orch.\tMy Blue Ridge Mountan Home\tGENNETT\t6629\tGEX-1415\t1928\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480384.mp3\tBenny Golson\tMy Blues House\tNew Jazz\tNJLP8220\t1833\t1959\tCurtis Fuller (tb) Benny Golson (ts) Ray Bryant (p) Paul Chambers (b) Art Blakey (d)\nhttp://www.jazz-on-line.com/a/mp3w/1949_092.mp3\tVic Damone Feat. Glenn Osser's Orchestra\tMy Bolero\tMERCURY\t5313\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_079.mp3\tAmes Brothers\tMy Bonnie Lassie\tRCA Victor\t6208\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL746.mp3\tHi-flyers\tMy Bonnie Lies Over The Ocean\tVOCALION\t5346\tDAL746\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63338.mp3\tGlen Gray & Casa Loma Orch.\tMy Bonnie Lies Over The Ocean\tDECCA\t1755A\t63338\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83247.mp3\tElla Fitzgerald\tMy Bonnie Lies Over The Ocean\tDECCA\t28375\t83247\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_141.mp3\tElla Logan\tMy Bonnie Lies Over The Ocean\tCOLUMBIA\t36313\tLA1685\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC70115MBB.mp3\tHarry Lauder\tMy Bonny, Bonny Jean\tVICTOR\t70115\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_185.mp3\tBoyd Bennett And His Rockets\tMy Boy Flat-top\tKing\t1494\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_123.mp3\tDorothy Collins\tMy Boy-flat Top\tCoral\t61510\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9508.mp3\tJimmie Davis\tMy Brown Eyed Texas Rose\tDECCA\t5104B\tC9508\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/CON17898.mp3\tBlind Boy Fuller\tMy Brownskin Sugar Plum\tCONQUEROR\t8683\t17898\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S6075.mp3\tHank Williams\tMy Bucket's Got A Hole In It\tMGM\t10560\t49S6075\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE32477.mp3\tBuddy Clark\tMy Buddy\tOKEH\t6670\t32477\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC26590.mp3\tHenry Burr\tMy Buddy\tVICTOR\t18930\t26590\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D102.mp3\tTed Fiorito & His Orch\tMy Buddy\tV-DISC\t102\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC046025-1.mp3\tLionel Hampton & His Orch\tMy Buddy\tVICTOR\t26608\t046025-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2315.mp3\tBing Crosby & Victor Young\tMy Buddy\tDECCA\t3736A\tDLA2315\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/VOC10554.mp3\tBen Bernie And His Orch\tMy Buddy\tVOCALION\t14494A\t10554\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB890.mp3\tCount Basie & His Orchestra\tMy Buddy\tRCA\t20-2693\tD7VB890\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D334A1.mp3\tMaj. Glenn Miller And The Aaftco\tMy Buddy\tV-DISC\t334A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM-400-1.mp3\tBenny Carter And His Orchestra\tMy Buddy\tDECCA\tF-42135\tAM-400-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_010.mp3\tHenry Burr\tMy Buddy\tVICTOR\t18930\t26590\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_125.mp3\tBen Bernie And His Orchestra\tMy Buddy\tVOCALION\t14494A\t10554\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic046025-1.mp3\tLionel Hampton And His Orchestra\tMy Buddy\tVictor\t26608\t046025-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Col25212-2.mp3\tHarry James And His Orchestra\tMy Buddy\tColumbia\t35242\t25212-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20030-B.mp3\tGene Austin\tMy Bundle Of Love\tVICTOR\t20030\t34111-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/MER2034.mp3\tLester Flatt And Earl Scruggs\tMy Cabin In Caroline\tMERCURY\t6181\t2034\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3555-1.mp3\tChampion Jack Dupree\tMy Cabin Inn\tOKEH\t6152\tC3555-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOKE6152m.mp3\tChampion Jack Dupree\tMy Cabin Inn\tOKEH\t6152\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC011090.mp3\tTommy Dorsey And His Clambake 7\tMy Cabin Of Dreams\tVICTOR\t25620\t011090\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU014314-1.mp3\tTed Mays And His Band\tMy Cabin Of Dreams\tBLUEBIRD\t7193A\t014314-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_193.mp3\tGus Arnheim And His Orchestra Feat. V/jimmy Farrell\tMy Cabin Of Dreams\tBRUNSWICK\t7933\t21419-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_046.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright; Tommy Dorsey And His Clambake Seven\tMy Cabin Of Dreams\tVICTOR\t25620\t011090\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_325.mp3\tGeorge Hall And His Orchestra\tMy Cabin Of Dreams\tVARIETY\t611\tM573\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/GRE4360.mp3\tWaldorfians\tMy Canary Has Circles Under His Eyes\tGREYGULL\tPIC780\t4360\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/PATCPT-1705-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tMy Carolina Hideaway\tPath\tPA-467\tCPT-1705-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_079.mp3\tVernon Dalhart And Carson Robison\tMy Carolina Home\tVICTOR\t20795\t38743-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_031alt.mp3\tAda Jones\tMy Carolina Lady\tMONARCH\tV-4430\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC47215-1.mp3\tJimmie Rodgers\tMy Carolina Sunshine Girl\tVICTOR\t40096\t47215-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU17261-62.mp3\tIsham Jones & His Orch\tMy Castle In Spain\tBRUNSWICK\t3015\t17261-62\t1925\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW148055-1.mp3\tLeo Reisman & His Orch\tMy Castle In Spain Is A Shack In The Lane\tCOLUMBIA\t1767 D\tW148055-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051211.mp3\tAlberta Hunter\tMy Castle's Rocking\tBLUEBIRD\t8539\t051211\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31302.mp3\tCab Calloway & His Orch\tMy Coo Coo Bird\tOKEH\t6459\t31302\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_051.mp3\tBilly Murray\tMy Cousin Caruso\tVICTOR\t16327\tB7073-2\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_311.mp3\tFrank Sinatra\tMy Cousin Louella\tCOLUMBIA\t38045\tCO38284\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC35591-2.mp3\tTed Weems & His Orch\tMy Cutey's Due At Two To Two Today\tVICTOR\t20120\t35591-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR234-Hy.mp3\tW. M. C. A. Broadcasters\tMy Cutey's Due At Two-to-tw\tHarmony\t234-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3013-B.mp3\tEddy Arnold\tMy Daddy Is Only A Picture\tRCA\t20-3013-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRIBRS-1008y.mp3\tJimmy Noone And His Orch\tMy Daddy Rocks Me\tBritish Rhythm Socie\tBRS-1008\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC63868.mp3\tTrixie Smith\tMy Daddy Rocks Me Part 1\tDECCA\t7469\t63868\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63869.mp3\tTrixie Smith\tMy Daddy Rocks Me Part 2\tDECCA\t7617\t63869\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC29869-2.mp3\tCoon-sanders Nighthawk Orch\tMy Daddy's Dream-time Lullaby\tVICTOR\t19325\t29869-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14255-1.mp3\tJoe Venuti & His Orchestra\tMy Dancing Lady (v Howard Philips)\tBANNER\t32895\t14255-1\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_091.mp3\tDon Bestor And His Orchestra\tMy Darling\tVICTOR\t24142\t73713-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/Cap3462.mp3\tJo Stafford, Gordon Macrae And S\tMy Darling, My Darling\tCapitol\t15270\t3462\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO40060.mp3\tBuddy Clark And Doris Day\tMy Darling, My Darling\tCOLUMBIA\t38353\tCO40060\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_055.mp3\tDoris Day And Buddy Clark Feat. George Siravo's Orchestra\tMy Darling, My Darling\tCOLUMBIA\t38353\tCO40060\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_005.mp3\tHarry Macdonough\tMy Dear\tVICTOR\t16059\tB4882\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_154.mp3\tJan Garber And His Orchestra (vocal Refrain By Lew Palmer)\tMy Dear\tVICTOR\t24636\t77361-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC61.mp3\tBilly Eckstine & His Orch\tMy Deep Blue Dream\tNATIONAL\t\tNSC61\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO32965.mp3\tCharlie Spivak And His Orch\tMy Devotion\tCOLUMBIA\t36620\tCO32965\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_072.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly\tMy Devotion\tDECCA\t18372A\t70809\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC073897-1.mp3\tVaughn Monroe And His Orch\tMy Devotion (vvm)\tVICTOR\t27925\t073897-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC61128-A.mp3\tCarter Family\tMy Dixie Darling\tDECCA\t5240\t61128-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS440.mp3\tMacbeth, The Great\tMy Donkey Want Water\tMUSICRAFT\t434\t440\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053208.mp3\tHarlan Leonard & His Rockets\tMy Dream\tBLUEBIRD\t11032\t053208\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO3100.mp3\tDoris Day\tMy Dream Is Yours\tCOLUMBIA\t38375\tHCO3100\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5713-1-2.mp3\tFletcher Henderson & His Orch\tMy Dream Man\tBANNER\t1475\t5713-1-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban5713-1.mp3\tFletcher Henderson And His Orchestra\tMy Dream Man\tBanner\t\t5713-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_324.mp3\tNat ''king'' Cole\tMy Dream Sonata\tCapitol\t3456\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO34261.mp3\tLes Brown And Doris Day\tMy Dreams Are Getting Better All The Time\tCOLUMBIA\t36779\tCO34261\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18661A.mp3\tJimmy Long And D.robertson\tMy Dreams Are Getting Better All The Time\tDECCA\t18661A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1641x.mp3\tPhil Moore Four\tMy Dreams Are Getting Better All The Time\tRCA\t20-1641\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1967-.mp3\tVaughn Monroe\tMy Dreams Are Getting Better All The Time\tRCA\t20-1967\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_035.mp3\tPhil Moore Four\tMy Dreams Are Getting Better All The Time\tRCA\t20-1641\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_005.mp3\tLes Brown And His Orchestra Feat. Doris Day\tMy Dreams Are Getting Better All The Time\tCOLUMBIA\t36779\tCO34261\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/HITT489.mp3\tLouis Prima & His Orch\tMy Dreams Are Getting Better All The Time (vlp)\tHIT OF THE WEEK\t7128\tT489\t1944\t\nhttp://www.jazz-on-line.com/a/mp3l/COL81141.mp3\tLeo Reisman & His Orch\tMy Electric Girl\tCOLUMBIA\tA-3960\t81141\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC72250.mp3\tGene Kardos & His Orch\tMy Extra Ordinary Gal\tVICTOR\t22986\t72250\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU11669-A.mp3\tGuy Lombardo Royal Canadians\tMy Extraordinary Gal\tBRUNSWICK\t6290\t11669-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/REG9204x.mp3\tGeorge Lenox And Edith Roberts\tMy Faith Looks Up To Thee\tRegal\t9204\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1809.mp3\tTed Daffan's Texans\tMy Fallen Star\tCOLUMBIA\t20181\tHCO1809\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC042549.mp3\tArtie Shaw And His Orchestra\tMy Fantasy (v P B)\tVICTOR\t26614\t042549-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic042549-1.mp3\tArtie Shaw And His Orchestra\tMy Fantasy - V P B\tVictor\t26614\t042549-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC57170-1.mp3\tGene Austin\tMy Fate Is In Your Hands\tVICTOR\t22223\t57170-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72236.mp3\tJames Pete Johnson\tMy Fate Is In Your Hands\tDECCA\t23594\t72236\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_1104_02.mp3\tLee Morse And Her Bluegrass Boys\tMy Fate Is In Your Hands\tColumbia\t2037DB\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_232.mp3\tGene Austin Feat. O/leonard Joy\tMy Fate Is In Your Hands\tVICTOR\t22223\t57170-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic57190-4.mp3\tThomas \"fats\" Waller\tMy Fate Is In Your Hands\tVictor\tV-38568\t57190-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic57170-1.mp3\tGene Austin\tMy Fate Is In Your Hands\tVictor\t22223\t57170-1\t1929\tFats Waller, piano\nhttp://www.jazz-on-line.com/a/mp3d/SIGF-1000.mp3\tEarl Hines Trio\tMy Fate Is In Your Hands\tSIGNATURE\t28110\tF-1000\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/SigF-1000.mp3\tEarl Hines Trio\tMy Fate Is In Your Hands\tSignature\t28110\tF-1000\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS35113-1.mp3\tBrownie Mcghee\tMy Fault\tSAVOY\t5551\tS35113-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83429.mp3\tElla Fitzgerald\tMy Favorite Song\tDECCA\t28433\t83429\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_121.mp3\tAmes Brothers Feat. O/ray Bloch\tMy Favorite Song\tCORAL\t60846\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_220.mp3\tGeorgia Gibbs\tMy Favorite Song\tMERCURY\t5912\tYBF9264-3\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu063701-1.mp3\tBenny Carter And His Orchestra\tMy Favourite Blues\tBluebird\tB-11288\t063701-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic56126-1.mp3\tThomas Waller\tMy Feelin's Are Hurt\tVictor\tV-38613\t56126-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/RCA20-1915.mp3\tBetty Hutton\tMy Fickle Eye\tRCA\t20-1915\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_258.mp3\tBetty Hutton\tMy Fickle Eye\tRCA\t20-1915\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC46175.mp3\tErnest Tubb\tMy Filipino Rose\tDECCA\t46175\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22079.mp3\tGlenn Miller & His Orchestra\tMy Fine Feathered Friend\tCBS\tBR8034\t22079\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62713.mp3\tWoody Herman & His Orchestra\tMy Fine Feathered Friend\tDECCA\t1535\t62713\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_431.mp3\tPatti Page\tMy First Formal Gown\tMercury\t70820\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09889.mp3\tFats Waller And His Rhythm\tMy First Impression Of You\tVICTOR\t25753\t09889\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_218.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tMy First Love\tDECCA\t18582B\tL3212\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19241-1.mp3\tCharlie Barnet & His Orchestra\tMy First Thrill (v Robt Parkes)\tARC\tME60712\t19241-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24830x.mp3\tGordon Jenkins\tMy Foolish Heart\tDECCA\t24830\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S422.mp3\tBilly Eckstine\tMy Foolish Heart\tMGM\t10623A\t49S422\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/CHE1425MFH.mp3\tGene Ammons\tMy Foolish Heart\tCHESS\tCHES1425\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_064.mp3\tMindy Carson\tMy Foolish Heart\tCOLUMBIA\t41221\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_061.mp3\tBilly Eckstine Feat. Russell Case's Orchestra\tMy Foolish Heart\tMGM\t10623A\t49S422\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC13357.mp3\tHerman Chittison\tMy Four Reasons\tARC\tVo25011\t13357\t1933\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI4221.mp3\tIrving Kaufman\tMy Foxtrot Wedding Day\tEDISON\t50317\t4221\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_099.mp3\tEddie Fisher\tMy Friend\tRCA Victor\t5748\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_347.mp3\tTommy Dorsey And His Orchestra Featuring Jimmy Dorsey; Vocal By Gorden Polk\tMy Friend The Ghost\tBELL\tLL1029\t5004-1/3\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC81146.mp3\tSy Oliver & His Orch.\tMy Friend Told Me So\tDECCA\t27672\t81146\t1951\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC62686-2.mp3\tHenny Hendrickson's Louisville Serenaders\tMy Future Just Passed\tVICTOR\t\t62686-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN16065-1.mp3\tAlice Faye\tMy Future Star\tBANNER\t33253\t16065-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/COL41139MG.mp3\tFrankie Laine\tMy Gal And A Prayer\tCOLUMBIA\t41139\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_012.mp3\tArthur Collins And Byron Harlan\tMy Gal Irene\tVICTOR\t5399\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_012alt.mp3\tArthur Collins And Byron G. Harlan\tMy Gal Irene\tIndestructible\t742\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC59693.mp3\tDuke Ellington & His Orch\tMy Gal Is Good For Nothing But Love\tVICTOR\t38130B\t59693\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM146-2.mp3\tCab Calloway & His Orch\tMy Gal Mezzanine\tVARIETY\tI593\tM146-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE254.mp3\tTom Gerun And His Orch\tMy Gal Sal\tBRUNSWICK\t4050\tLAE254\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15043.mp3\tClaude Hopkins And His Orch\tMy Gal Sal\tBRUNSWICK\t6864\t15043\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044593.mp3\tHarlan Leonard & His Rockets\tMy Gal Sal\tBLUEBIRD\t10625\t044593\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38616-A.mp3\tMills Brothers\tMy Gal Sal\tDECCA\t165B\t38616-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19849-1.mp3\tFletcher Henderson & His Orch\tMy Gal Sal\tVOCALION\t3360\t19849-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT745.mp3\tJohnny Guarnieri Trio\tMy Gal Sal\tMAJESTIC\t1094\tT745\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/OKeW81413-B.mp3\tMiff Mole's Little Molers\tMy Gal Sal\tOKeh\t40932\tW81413-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE26752.mp3\tRed Nichols & His Orch\tMy Gal Sal\tBRUNSWICK\t4844\tE26752\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec03799.mp3\tGuy Lombardo & His Royal Canadians\tMy Gal Sal\tDecca\t03799\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400979-B.mp3\tChicago Footwarmers\tMy Girl\tOKeh\t8792\t400979-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU69449-2.mp3\tJimmie Rodgers\tMy Good Gal's Gone Blues\tBLUEBIRD\t5942\t69449-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC50525-2.mp3\tKing Oliver & His Orchestra\tMy Good Man Sam\tVICTOR\t38049\t50525-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA3032.mp3\tBing Crosby - J.s.trotter Orch\tMy Great, Great Grandfather\tDECCA\t18432A\tDLA3032\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC054624.mp3\tDuke Ellington & His Orch\tMy Greatest Mistake\tVICTOR\t26719\t054624\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_119.mp3\tInk Spots\tMy Greatest Mistake\tDECCA\t3379A\t67990\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35190.mp3\tBenny Goodman And His Orchestra\tMy Guy's Come Back\tCOLUMBIA\t36874\tCO35190\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_198.mp3\tDinah Shore\tMy Guy's Come Back\tRCA\t20-1731\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_173.mp3\tBenny Goodman And His Orchestra Feat. Liza Morrow\tMy Guy's Come Back\tCOLUMBIA\t36874\tCO35190\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149901-1.mp3\tCharlie Poole N.c.ramblers\tMy Gypsy Girl\tCOLUMBIA\t15519 D\tW149901-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW265119-2.mp3\tJoe Venuti's Blue Five\tMy Gypsy Rhapsody\tCOLUMBIA\tCB637\tW265119-2\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU24546-1.mp3\tGene Krupa & His Orch\tMy Hands Are Tied\tBRUNSWICK\t8346\t24546-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146873-1.mp3\tEthel Waters\tMy Handy Man\tCOLUMBIA\t14353 D\tW146873-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15094x.mp3\tPied Pipers - Paul Weston\tMy Happiness\tCAPITOL\t\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24446x.mp3\tElla Fitzgerald\tMy Happiness\tDECCA\t24446\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_192.mp3\tJohn Laurenz\tMy Happiness\tMERCURY\t5144\t1752-1\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_023.mp3\tPied Pipers\tMy Happiness\tCapitol\t15094\t3280\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_179.mp3\tMarlin Sisters\tMy Happiness\tCOLUMBIA\t38217\tCO38826\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_048.mp3\tElla Fitzgerald Feat. Song Spinners\tMy Happiness\tDECCA\t24446\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/VICOB4700.mp3\tRay Noble & His Orch\tMy Hat's On The Side Of My Head\tVICTOR\t24624\tOB4700\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_166.mp3\tRay Noble And His Orchestra\tMy Hat's On The Side Of My Head\tVICTOR\t24624\tOB4700\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI10750.mp3\tWaikiki Hawaiian Orchestra\tMy Hawaiian Evenin' Star\tEDISON\tBA 5112\t10750\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC18697-2.mp3\tAl Campbell & Henry Burr\tMy Hawaiian Sunshine\tVICTOR\t18202\t18697-2\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_036.mp3\tHenry Burr And Albert Campbell\tMy Hawaiian Sunshine\tVICTOR\t18202\t18697-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3873.mp3\tSweet Violet Boys\tMy Head Went Round And Round\tOKEH\t6482\tC3873\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA260-A.mp3\tBing Crosby W Georgie Stoll\tMy Heart And I\tDECCA\t631A\tDLA260-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71286.mp3\tElla Fitzgerald & Four Keys\tMy Heart And I Decided\tDECCA\t18530A\t71286\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68544-A.mp3\tJan Savitt And His Orchestra\tMy Heart At Thy Sweet Voice\tDECCA\t3640A\t68544-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU047057-1.mp3\tEarl Hines And His Orchestra\tMy Heart Beats For You\tBLUEBIRD\tB-10763\t047057-1\t1940\tWalter Fuller (tp,vcl) Milton Fletcher, Edward Sims (tp) George Dixon (tp,as) Edward Burke, John Ewing, Joe McLewis (tb) Omer Simeon (cl,bar) Leroy Harris (as,vcl) Jimmy Mundy, Robert Crowder (ts,arr) Earl Hines (p,dir,arr) Claude Robertson (g) Quinn Wilson (b,arr) Alvin Burroughs (d) Billy Eckstine (vcl) George Dixon (speech-1)\nhttp://www.jazz-on-line.com/a/mp3a/COLB23778.mp3\tMary Martin W E.duchin Orch\tMy Heart Belongs To Daddy\tCOLUMBIA\t36310\tB23778\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64851.mp3\tCount Basie And His Orchestra Vocal Hele Humes\tMy Heart Belongs To Daddy\tDECCA\t2249A\t64851-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC65043-A.mp3\tChick Webb And His Orchestra\tMy Heart Belongs To Daddy\tDECCA\t2309A\t65043-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DECSEB4878.mp3\tValaida\tMy Heart Belongs To Daddy\tDECCA\t9112\tSEB4878\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL36310.mp3\tMary Martin\tMy Heart Belongs To Daddy\tCOLUMBIA\t36310\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_271.mp3\tArtie Shaw And His Orchestra\tMy Heart Belongs To Daddy\tMGM\t30244\t50XY-44\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_062.mp3\tLarry Clinton And His Orchestra Feat. Bea Wain\tMy Heart Belongs To Daddy\tVICTOR\t26100\t028947\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65043-A.mp3\tChick Webb And His Orchestra\tMy Heart Belongs To Daddy\tDecca\t2309\t65043-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_139.mp3\tMary Martin Feat. Eddy Duchin Orchestra\tMy Heart Belongs To Daddy\tBRUNSWICK\t8282\t23778\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Son4878-SEB.mp3\tValaida Acc. By Lulle Ellbojs Orkester\tMy Heart Belongs To Daddy \tSonora\t3557\t4878-SEB\t1939\tValaida Snow t v acc. by Sven Arefeldt dir. Bengt Artander Gunnar Green t, Sture Green tb, Gunnar Wallberg Rune ''Lulle'' Ellboj as, Rudolf Eriksson ts, Willard Ringstrand p, Karl L?rh g, Roland Bengtsson b, Olle Sahlin d\nhttp://www.jazz-on-line.com/a/mp3o/MUS5546.mp3\tArtie Shaw And His Orchestra Featuring Kitty Kallen\tMy Heart Belongs To Daddy (from The Warner Bros. Film ''night And Day'')\tMUSICRAFT\t392\t5546\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23778-1.mp3\tEddy Duchin & His Orch\tMy Heart Belongs To Daddy (vmary Martin)\tCBS\tBR8282\t23778-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_221.mp3\tJune Christy Feat. O/ Pete Rugolos\tMy Heart Belongs To Only You\tCAPITOL\t1073\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S83.mp3\tJoe Turner\tMy Heart Belongs To You\tMGM\t10274\t48S83\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO44590.mp3\tGuy Mitchell\tMy Heart Cries For You\tCOLUMBIA\t39067\tCO44590\t\t\nhttp://www.jazz-on-line.com/mp3/246239781.mp3\tVic Damone\tMy Heart Cries For You\tMERCURY\t5563\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3978x.mp3\tDinah Shore\tMy Heart Cries For You\tRCA\t20-3978\t20-3978x\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_025.mp3\tDinah Shore\tMy Heart Cries For You\tRCA\t20-3978\t20-3978x\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_011.mp3\tGuy Mitchell\tMy Heart Cries For You\tCOLUMBIA\t39067\tCO44590\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_084.mp3\tJimmy Wakely\tMy Heart Cries For You\tCapitol\t1328\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_030.mp3\tVic Damone Feat. George Siravo's Orchestra\tMy Heart Cries For You\tMERCURY\t5563\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_156.mp3\tBill Farrell Feat. O/russ Case\tMy Heart Cries For You\tMGM\t10868\t50S350\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_273.mp3\tRed Foley And Evelyn Knight\tMy Heart Cries For You\tDecca\t27378\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_086.mp3\tHaydn Quartet With Harry Macdonough\tMy Heart Has Learned To Love You, Now Do Not Say Good-bye\tVictor\t16503\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_225.mp3\tSammy Kaye And His Orchestra\tMy Heart Has Wings\tVictor\t26238\t036542\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_263.mp3\tTex Beneke And The Glenn Miller Orchestra Feat. The Mello Larks\tMy Heart Is A Hobo\tRCA Victor\t2260\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_181.mp3\tGlen Gray And Casa Loma Orchestra\tMy Heart Is An Open Book\tDECCA\t386B\t39377\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh113.mp3\tThe Bbc Dance Orchestra Dir. By Henry Hall (vocal Dan Donovan)\tMy Heart Is Sleeping\tColumbia\tFB-1013\tCA-14856-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1148.mp3\tBing Crosby - J Trotter Orch\tMy Heart Is Taking Lessons\tDECCA\t25233\tDLA1148\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA1148-A.mp3\tJohn Scott Trotter And His Orchestra\tMy Heart Is Taking Lessons\tDecca\t1565  \tDLA1148-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036483.mp3\tCharlie Barnet & His Orch\tMy Heart Keeps Crying (v J E)\tBLUEBIRD\t10426\t036483\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1644.mp3\tDuke Ellington Famous Orch\tMy Heart Sings\tRCA\t20-1644\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_261.mp3\tGuy Lombardo And His Royal Canadians\tMy Heart Sings\tDecca\t18642\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D352A1.mp3\tGuy Lombardo And His Orchestra (stuart Foster Voc.)\tMy Heart Sings (all Of A Sudden)\tV-DISC\t352A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21034-A.mp3\tGeorge Olsen And His Music\tMy Heart Stood Still\tVictor\t21034-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44024.mp3\tErroll Garner Trio\tMy Heart Stood Still\tCOLUMBIA\t39249\tCO44024\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC40501-5.mp3\tGeorge Olsen & His Music\tMy Heart Stood Still\tVICTOR\t21034A\t40501-5\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu31492.mp3\tArtie Shaw And His Orchestra\tMy Heart Stood Still\tBluebird\t10125\t031492-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18567A.mp3\tGlen Gray And Casa Loma Orch.\tMy Heart Tells Me\tDECCA\t18567A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_127.mp3\tJan Garber And His Orchestra\tMy Heart Tells Me\tHit\t7070\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_009.mp3\tGlen Gray And Casa Loma Orchestra\tMy Heart Tells Me\tDECCA\t18567\t71439\t1943\tEugenie Baird (vo), Fritz Austin, John Owens, Ray Grien (tp), Otto Alburn, George Jean, Jack Pageler (tb), Clarence Hutchinrider (cl, as), Glen Gray, Bunny Bardach, Conn Humphries (as), Lon Doty, Gus Jean (ts), Lou Carter (p), Herb Ellis (g), Morrie Rayman (sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3c/CROC1787-1.mp3\tRuss Carlson & His Orch\tMy Heart's At Ease (v)\tCROWN\t3351\tC1787-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_274.mp3\tRalph Flanagan And His Orchestra\tMy Hero\tBluebird\t0006\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec90968-A.mp3\tLil Armstrong And Her Swing Band\tMy Hi-de-ho-man\tDecca\t1059\t90968-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC3360-1.mp3\tCarter Family\tMy Home Among The Hills\tCOLUMBIA\t20253\tC3360-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81192.mp3\tFrank Crumit\tMy Home Town In Kansas\tCOLUMBIA\tA-3997\t81192\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_104.mp3\tFrank Crumit\tMy Home Town In Kansas\tCOLUMBIA\tA-3997\t81192\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU028999.mp3\tBenny Goodman And His Orchestra\tMy Honey's Lovin' Arms\tBLUEBIRD\t11056\t028999\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE07111.mp3\tRay Miller's Hotel Gibson Orch\tMy Honey's Lovin' Arms\tBRUNSWICK\t3827\tE07111\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10710-3.mp3\tCab Calloway & His Orchestra\tMy Honey's Lovin' Arms\tBANNER\t32227\t10710-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401449-A.mp3\tJoe Venuti's Blue Four\tMy Honey's Lovin' Arms\tOKeh\t41251\t401449-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU8458.mp3\tIsham Jones & His Orch\tMy Honey's Lovin' Arms\tBRUNSWICK\t2301\t8458\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/COLZSP7472.mp3\tBing Crosby\tMy Honey's Lovin' Arms\tCOLUMBIA\t39519\tZSP7472\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_115.mp3\tCalifornia Ramblers\tMy Honey's Lovin' Arms\tVOCALION\t14329B\t8793\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_244.mp3\tBenny Goodman And His Orchestra\tMy Honey's Lovin' Arms\tVICTOR\t26095\t028999\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/KIR8795.mp3\tCalifornia Ramblers\tMy Honey's Loving Arms\tKIRKEBY\tVO14329\t8795\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/CBS22721.mp3\tBud Freeman's Trio\tMy Honeys Loving Arms\tCBS\tCM504\t22721\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_0316_03.mp3\tLee Morse And Her Bluegrass Boys\tMy Idea Of Heaven\tColumbia\t974DA\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC7191.mp3\tIsham Jones And His Orch\tMy Ideal\tBRUNSWICK\t6041\tC7191\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP134x.mp3\tBilly Butterfield\tMy Ideal\tCAPITOL\t134\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3247.mp3\tJimmy Dorsey Orch\tMy Ideal\tDECCA\t18574A\tL3247\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70247.mp3\tMaxine Sullivan\tMy Ideal\tDECCA\t18555B\t70247\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_132.mp3\tMaxine Sullivan\tMy Ideal\tDECCA\t18555B\t70247\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_135.mp3\tMaurice Chevalier Feat. D/leonard Joy\tMy Ideal\tVICTOR\t22542\t62387-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_095.mp3\tBilly Butterfield And His Orchestra Feat. V/margaret Whiting\tMy Ideal\tCAPITOL\t134\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480542.mp3\tArt Tatum/ Ben Webster Quartet\tMy Ideal\tBarclay\t74033\t2992-1\t1956\tBen Webster (ts), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3c/KIN813.mp3\tHank Penny\tMy Inlaws Made An Outlaw Of Me\tKING\t813\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECC91543.mp3\tBob Crosby & His Orch\tMy Inspiration\tDECCA\t2209B\tC91543\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_020.mp3\tArthur Collins\tMy Irish Molly O\tVICTOR\t4371\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC18716-A.mp3\tBlue And White Marimba Band\tMy Isle Of Golden Dreams\tVICTOR\t18716\t18716-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038143.mp3\tGlenn Miller & His Orch\tMy Isle Of Golden Dreams\tBLUEBIRD\t10399 A\t038143\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1775.mp3\tBing Crosby & Dick Mcintyre\tMy Isle Of Golden Dreams\tDECCA\t2775A\tDLA1775\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MERYB9419.mp3\tPatti Page W Jack Rael Orch\tMy Jealous Eyes\tMERCURY\t70070\tYB9419\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_314.mp3\tEddie Delange Feat. Elisse Cooper\tMy Kid's Singing Swing Songs\tBLUEBIRD\t10003\t028117\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MonUSLA13-A.mp3\tPhil Harris & His Orch\tMy Kind Of Country\tMontgomeryWard\t10008\tUSLA13-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62143.mp3\tClaude Hopkins & His Orchestra\tMy Kinda Love\tDECCA\t1316\t62143\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/Mus5488.mp3\tSarah Vaughan And Orchestra Under The Direction Of Tadd Dameron\tMy Kinda Love\tMusicraft\t398\t5488\t1946\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUC-2660.mp3\tWalter Barnes And His Royal Creolians\tMy Kinda Love (one Way To Paradise)\tBRUNSWICK\t4187\tC-2660\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC64183.mp3\tAlma Gluck\tMy Laddie\tVICTOR\t64183\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_126.mp3\tAlma Gluck\tMy Laddie\tVICTOR\t64183\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1751.mp3\tMildred Bailey & Her Orchestra\tMy Last Affair\tVOCALION\t3449\tC1751\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61423.mp3\tElla Fitzgerald & Her Savoy 8\tMy Last Affair\tDECCA\t1061\t61423\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04582-1.mp3\tLionel Hampton & His Orch\tMy Last Affair\tVICTOR\t25527\t04582-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_165.mp3\tMildred Bailey\tMy Last Affair\tVOCALION\t3449\tC1751\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic04582-1.mp3\tLionel Hampton And His Orchestra\tMy Last Affair\tVictor\t25527\t04582-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_084.mp3\tHenry Busse And His Orchestra (v-dick Wharton)\tMy Last Good-bye\tDecca\t2454\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66134.mp3\tElla Fitzgerald & Her Orch\tMy Last Goodbye\tDECCA\t2721A\t66134\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035764.mp3\tGlenn Miller & His Orch\tMy Last Goodbye\tBLUEBIRD\t10229\t035764\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_175.mp3\tFour Lads\tMy Little Angel\tColumbia\t40674\tCO55528\t1956\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu8265.mp3\tSonny Boy Williamson\tMy Little Baby\tBluebird\t8265\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/KinK-5908.mp3\tLucky Millinder And His Orchestra\tMy Little Baby\tKing\t4379\tK-5908  \t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79344.mp3\tFrank Crumit\tMy Little Bimbo Down On The Bamboo Isles\tCOLUMBIA\tA-2981\t79344\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_060.mp3\tFrank Crumit\tMy Little Bimbo Down On The Bimbo Isle\tCOLUMBIA\tA-2981\t79344\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP705.mp3\tDuke Ellington & Orch\tMy Little Brown Book\tV-DISC\t252B\tVP705\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DECC91140.mp3\tRanch Boys\tMy Little Buckaroo\tDECCA\t5354\tC91140\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA746-A.mp3\tBing Crosby\tMy Little Buckaroo\tDECCA\t91120\tDLA746-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW143273.mp3\tLeo Reisman & His Orch\tMy Little Bunch Of Happiness\tCOLUMBIA\t855 D\tW143273\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_011.mp3\tHaydn Quartet\tMy Little Canoe\tVictor\t4064\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke6606.mp3\tBenny Goodman & His Orchestra\tMy Little Cousin\tOkeh\t6606\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_116.mp3\tBenny Goodman And His Orchestra Feat. Peggy Lee\tMy Little Cousin\tOKEH\t6606\t32384\t1942\tBernie Privin, Jimmy Maxwell, Al Davis (tp), Lou McGarity, Cutty Cutshall (tb), Benny Goodman (cl), Sol Kane, Clint Neagley (as), Vido Musso, George Berg (ts), Art Ralston (bar), Mel Powell (p), Tom Morgan (g), Sid Weiss (sb), Ralph Collier (dm)\nhttp://www.jazz-on-line.com/a/mp3b/VARW138.mp3\tBunny Berigan & His Orch\tMy Little Cousin (v L R)\tVARSITY\tEL5020\tW138\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57787-1.mp3\tJelly Roll Morton Trio\tMy Little Dixie Home\tVICTOR\t38601\t57787-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC16073-1.mp3\tAl Campbell & Henry Burr\tMy Little Girl\tVICTOR\t17810\t16073-1\t1915\t\nhttp://www.jazz-on-line.com/a/mp3e/COL45562-1.mp3\tAda Jones And Will Robbins\tMy Little Girl\tCOLUMBIA\tA-1724\t45562-1\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_020.mp3\tHenry Burr And Albert Campbell\tMy Little Girl\tVICTOR\t17810\t16073-1\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA100-A.mp3\tTed Fio Rito And His Orch\tMy Little Grass Shack In Kealakekua Hawaii\tBRUNSWICK\t6736\tLA100-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D218A2.mp3\tDorothy Lamour And Dick Mcintire\tMy Little Grass Shack In Kealakekua, Hawaii\tV-DISC\t218A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_019.mp3\tTed Fio Rito And His Orchestra\tMy Little Grass Shack In Kealakekua, Hawaii\tBRUNSWICK\t6736\tLA100-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU48842-2.mp3\tJohnny Dodds Washboard Band\tMy Little Isabel\tBLUEBIRD\t10241\t48842-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC45096.mp3\tJimmie Rodgers\tMy Little Lady\tVICTOR\t40072\t45096\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC83204-A.mp3\tConnie Boswell - Artie Shaw\tMy Little Nest Of Heavenly Blue\tDECCA\t28377\t83204-A\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_285.mp3\tConnee Boswell Feat. Artie Shaw And His Gramercy Five\tMy Little Nest Of Heavenly Blue\tDECCA\t28377\t83204-A\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC48432-3.mp3\tTal Henry And His Orch\tMy Little Old Home Down In New Orleans\tVICTOR\t40034\t48432-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC48432-3HP2-7.mp3\tTal Henry And His Orch\tMy Little Old Home Down In New Orleans\tVICTOR\t40034\t48432-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU45093.mp3\tJimmie Rodgers\tMy Little Old Home Town In New Orleans\tBLUEBIRD\t5609\t45093\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO53296.mp3\tFrankie Laine\tMy Little One\tCOLUMBIA\t40526\tCO53296\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MON1084.mp3\tBert Williams\tMy Little Zulu Babe\tMONARCH\tV-3619\t1084\t1901\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC70226-A.mp3\tBuddy Johnson And His Band\tMy Lonely Cabin\tDECCA\t8640B\t70226-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUB781.mp3\tBing Crosby\tMy Love\tBRUNSWICK\t6623\tB781\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB781.mp3\tBing Crosby\tMy Love\tBrunswick\t6623\tB781-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24803-1.mp3\tRed Norvo & His Orch\tMy Love For You\tVOCALION\t4953\t24803-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL150910-2.mp3\tChester Leighton Orch (rich)\tMy Love For You (vsb)\tCOLUMBIA\tHA1242\t150910-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_158.mp3\tMaurice Chevalier Feat. D/leonard Joy\tMy Love Parade\tVICTOR\t22285A\t58514-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/OKECCO5360.mp3\tBig Three Trio\tMy Love Will Never Die\tOKEH\t6901\tCCO5360\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_389.mp3\tAmes Brothers Feat. O/hugo Winterhalter\tMy Love, My Life, My Happiness\tRCA Victor\t5404\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM53S6076.mp3\tJoni James\tMy Love, My Love\tMGM\t11543\t53S6076\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41741.mp3\tJimmie Rodgers\tMy Lovin' Gal Lucille (blue Yodel #11)\tVICTOR\t21291\t41741\t1928\t\nhttp://www.jazz-on-line.com/a/mp37/COL142275.mp3\tTed Lewis And His Band\tMy Mama's In Town\tCOLUMBIA\t697 D\tW142275-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC1831.mp3\tAl Jolson\tMy Mammy\tBRUNSWICK\t3912\tC1831\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC24863-17.mp3\tPaul Whiteman And His Orch\tMy Mammy\tVICTOR\t18737\t24863-17\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU4887.mp3\tIsham Jones & His Orch\tMy Mammy\tBRUNSWICK\t5046\t4887\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC24924.mp3\tPeerless Qt W Fred Van Eps\tMy Mammy\tVICTOR\t18730\t24924\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18730.mp3\tPeerless Quartet With Fred Van Eps\tMy Mammy\tVictor\t18730\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_199.mp3\tAl Jolson\tMy Mammy\tBRUNSWICK\t3912\tC1831\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLB21984-1.mp3\tTeddy Wilson And His Orch\tMy Man\tCOLUMBIA\t36113\tB21984-1\t1937\t\nhttp://www.jazz-on-line.com/mp3/316629767.mp3\tFanny Brice\tMy Man\tVICTOR\t45263\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24638x.mp3\tBillie Holiday\tMy Man\tDECCA\t24638\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68896.mp3\tElla Fitzgerald And Her Orch\tMy Man\tDECCA\t4291A\t68896\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC45263.mp3\tFanny Brice\tMy Man\tVICTOR\t45263\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_285.mp3\tDinah Shore\tMy Man\tBLUEBIRD\t10978\t056437\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_234.mp3\tBelle Baker\tMy Man\tBRUNSWICK\t4086\tE28439\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_011.mp3\tFanny Brice Feat. Rosario Bourdon (director)\tMy Man\tVICTOR\t45263\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_134.mp3\tFanny Brice Feat. D/leonard Joy\tMy Man\tVICTOR\t21168\t25752-7\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW140890-2.mp3\tBessie Smith\tMy Man Blues\tCOLUMBIA\t14098 D\tW140890-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150900-1.mp3\tBen Selvin And His Orch\tMy Man From Caroline\tCOLUMBIA\t2323 D\tW150900-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC63683-2.mp3\tJoe Venuti & His Orchestra\tMy Man From Caroline\tVICTOR\t23015A\t63683-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC63106-3.mp3\tHelen Kane\tMy Man Is On The Make\tVICTOR\t22475\t63106-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC64972-A.mp3\tRosetta Crawford And Hepcats\tMy Man Jumped Salty On Me\tDECCA\t7567B\t64972-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64972-A.mp3\tRosetta Crawford With Mezz Mezzrow\tMy Man Jumped Salty On Me\tDecca\t7567\t64972-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1253.mp3\tSam Donohue And His Orch\tMy Melancholy Baby\tCAPITOL\t357\t1253\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe400634-C.mp3\tDorsey Brothers Orchestra\tMy Melancholy Baby\tOKeh\t41032\t400634-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21015-B.mp3\tGene Austin\tMy Melancholy Baby\tVICTOR\t21015-B\t39177-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC89327.mp3\tAl Bowly\tMy Melancholy Baby\tVICTOR\t25007\t89327\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECHPP4973.mp3\tThe Quintet Of The Hot Club Of France\tMy Melancholy Baby\tDECCA\t23261 B\tHPP4973\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC063334.mp3\tEarl Hines (piano)\tMy Melancholy Baby\tVICTOR\t27562\t063334\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18830-1.mp3\tTeddy Wilson & His Orch\tMy Melancholy Baby\tBRUNSWICK\t7729\t18830-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22906.mp3\tMildred Bailey & Her Orchestra\tMy Melancholy Baby\tVOCALION\t4474\t22906\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/COLCL-6718-1.mp3\tLarry Adler (with Django Reinhardt)\tMy Melancholy Baby\tCOLUMBIA\tCL-6718-1\tCL-6718-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC49731-2hpp.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tMy Melancholy Baby\tDECCA\t23261\t49731-2hpp\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1633.mp3\tBing Crosby & J S Trotter Orch\tMy Melancholy Baby\tDECCA\t2289A\tDLA1633\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_081.mp3\tTeddy Wilson And His Orchestra\tMy Melancholy Baby\tBRUNSWICK\t7729\t18830-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic063334-1.mp3\tEarl Hines\tMy Melancholy Baby   \tVictor\t27562\t063334-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_026.mp3\tGene Austin Feat. Nat Shilkret And His Orchestra\tMy Melancholy Baby\tVICTOR\t21015-B\t39177-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_275.mp3\tAl Bowlly Feat. O/ray Noble\tMy Melancholy Baby\tVICTOR\t25007\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63586-A.mp3\tJimmie Lunceford And His Orchestra\tMy Melancholy Baby\tDecca\t1808\t63586-A\t1938\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3w/1947_061.mp3\tSam Donahue And His Orchestra\tMy Melancholy Baby\tCapitol\t357\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478356.mp3\tLes Brown And His Band Of Renown\tMy Melancholy Baby\tCAPITOL\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic063334-1.mp3\tEarl Hines And His Orchestra\tMy Melancholy Baby\tVictor\t27562\t063334-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046736.mp3\tGlenn Miller & His Orch\tMy Melancholy Baby (vtb)\tBLUEBIRD\t10665\t046736\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU020853.mp3\tYank Rachel\tMy Mind Got Bad\tBLUEBIRD\t7694\t020853\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1631.mp3\tAugie Goupil's Royal Tahitians\tMy Miri\tDECCA\t2256B\tDLA1631\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051867.mp3\tFats Waller And His Rhythm\tMy Mommy Sent Me To The Store\tBLUEBIRD\t10892\t051867\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82492.mp3\tLouis Armstrong & His Allstars\tMy Monday Date Pt.1\tDECCA\t28174\t82492\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC76672-1.mp3\tPaul Whiteman & His Orch\tMy Moonlight Madonna (v J F)\tVICTOR\t24364\t76672-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_079.mp3\tGeorge Jessel\tMy Mother's Eyes\tARA\t4515A\tARA1163-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC16533-A.mp3\tFrederic C. Freemantel\tMy Mother's Prayer\tVICTOR\t16533\t16533-A\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3472.mp3\tBing Crosby & Ethel Smith (vy)\tMy Mother's Waltz\tDECCA\t23392\tL3472\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC38235-2.mp3\tKelly Harrell\tMy Name Is John Johanna\tVICTOR\t21520\t38235-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36543.mp3\tLes Brown & Doris Day\tMy Number One Dream Came True\tCOLUMBIA\t37208\tCO36543\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_031.mp3\tNick Lucas\tMy Ohio Home\tBrunswick\t3773\tE25978\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41367-4.mp3\tJean Goldkette & His Orch\tMy Ohio Home\tVICTOR\t21166\t41367-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE25978.mp3\tNick Lucas\tMy Ohio Home\tBRUNSWICK\t3773\tE25978\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO31392-1.mp3\tBenny Goodman And His Orchestra\tMy Old Flame\tCOLUMBIA\t36754\tCO31392-1\t1941\tvocal Peggy Lee\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2592x.mp3\tSpike Jones\tMy Old Flame\tRCA\t20-2592\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC79212-2.mp3\tDuke Ellington And His Orchestra Vocal Ivie Anderson\tMy Old Flame\tVICTOR\t24651\t79212-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047m.mp3\tBenny Morton\tMy Old Flame\tBLUENOTE\t47\tBN-219-0\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4743.mp3\tBillie Holiday\tMy Old Flame\tCOMMODORE\t585\t4743\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31353-1.mp3\tCount Basie & His Orch\tMy Old Flame\tOKEH\t6527\t31353-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/HITCR349.mp3\tCootie Williams Sextet\tMy Old Flame\tHIT OF THE WEEK\t8087\tCR349\t1944\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24651.mp3\tDuke Ellington & His Orchestra\tMy Old Flame\tVictor\t24651\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480766.mp3\tBenny Morton All Stars\tMy Old Flame\tBlue Note\t47\tBN219-0\t1945\tBenny Morton (tb), Barney Bigard (cl), Ben Webster (ts), Sam Benskin (p), Israel Crosby (sb), Eddie Dougherty (dm)\nhttp://www.jazz-on-line.com/a/mp3b/BRULA151.mp3\tGuy Lombardo & His Orch\tMy Old Flame (v C. Lombardo)\tBRUNSWICK\t6909\tLA151\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU6909.mp3\tGuy Lombardo & His Orch\tMy Old Flame (v C. Lombardo)\tBRUNSWICK\t6909\tLA151\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2261.mp3\tBing Crosby & King's Men\tMy Old Kentucky Home\tDECCA\t18803A\tDLA2261\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC74468.mp3\tAlma Gluck\tMy Old Kentucky Home\tVICTOR\t74468\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_025.mp3\tHarry Macdonough\tMy Old Kentucky Home\tVICTOR\t16389\tB1347-5\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_035.mp3\tAlma Gluck\tMy Old Kentucky Home\tVICTOR\t74468\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1898_010.mp3\tEdison Male Quartette\tMy Old Kentucky Home\tEdison\t2223\t\t1898\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_013.mp3\tHaydn Quartet\tMy Old Kentucky Home\tVictor\t1997\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14426-A.mp3\tSpirits Of Rhythm\tMy Old Man\tBRUNSWICK\t6728\t14426-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC45090.mp3\tJimmie Rodgers\tMy Old Pal\tVICTOR\t23191\t45090\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/CHAE90079.mp3\tFrank Blackwell\tMy Old Pal Blues\tCHAMPION\t50036\tE90079\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CON17483.mp3\tCarter Family\tMy Old Virginia Home\tCONQUEROR\t8633\t17483\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145271.mp3\tCliquot Club Eskimos (reser)\tMy One And Only\tCOLUMBIA\t1213 D\tW145271\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72868-A.mp3\tEddie Condon & His Orch\tMy One And Only\tDECCA\t23431\t72868-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC76824.mp3\tElla Fitzgerald\tMy One And Only\tDECCA\t27368\t76824\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM49S3048.mp3\tFred Astaire\tMy One And Only\tMGM\t30198\t49S3048\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_163.mp3\tJane Green\tMy One And Only\tVictor\t21145\t41154-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_209.mp3\tFred Astaire\tMy One And Only\tMGM\t30198\t49S3048\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_082.mp3\tPerry Como Feat. Hugo Winterhalter's Orchestra And The Ramblers\tMy One And Only Heart\tRCA Victor\t5277\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480478.mp3\tArt Tatum/ Ben Webster Quartet\tMy One And Only Love\tBarclay\t74045\t2991-1\t1956\tBen Webster (ts), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1955_166.mp3\tNat ''king'' Cole\tMy One Sin\tCapitol\t3136\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3d/BlaP-138-2.mp3\tHenderson's  Dance Orchestra\tMy Oriental Rose\tBlack Swan\t2022\tP-138-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC019419.mp3\tTommy Dorsey & His Clambake 7\tMy Own\tVICTOR\t26005\t019419\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_255.mp3\tDeanna Durbin\tMy Own\tDECCA\t2274B\tDLA1696\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_315.mp3\tGeorge Hall And His Orchestra Feat. Dolly Dawn\tMy Own\tVOCALION\t4297\tM860-3\t1938\tPhil Silverman, Walter Wax (tp), Howard Carlson, John Doyle (tb), Jack Shilkret, Joe Herde, George Paxton, Michael Bruce (saxes), Charlie Romano, Frank Sterling (vn), Fred Duro (p), Frank Klinger (g), Bernie Miller (sb), Sam Bass (dm)\nhttp://www.jazz-on-line.com/a/mp3e/COLW142173.mp3\tDixie Washboard Band (cw)\tMy Own Blues\tCOLUMBIA\t14141 D\tW142173\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC18304-1.mp3\tDietrich And Wright W Louise And F\tMy Own Iona\tVICTOR\t18171\t18304-1\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_037.mp3\tCharles King And Elizabeth Brice\tMy Own Iona\tCOLUMBIA\t2059\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19670-71.mp3\tBob Haring & His Orch\tMy Pal Jerry\tBRUNSWICK\t3244\t19670-71\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC96-7-8.mp3\tAl Jolson - Gene Rodemich Orch\tMy Papa Doesn't Two Time No Time\tBRUNSWICK\t2595\tC96-7-8\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81691-2.mp3\tFletcher Henderson's Orch\tMy Papa Doesn't Two-time No Time\tCOLUMBIA\t126D\t81691-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Edi9482.mp3\tFletcher Henderson's Orchestra\tMy Papa Doesn't Two-time No Time\tEdison\t\t9482\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW145837-3.mp3\tPaul Ash And His Orchestra\tMy Pet\tCOLUMBIA\t1349 D\tW145837-3\t1928\tD Lindley,J Valentine,J Linn tr,R Lantz,M Durso tb, P Wing,H Nettles cl,al sax,V Hayes,H Grantham,cl, tn sax,H Winston,p, P Ash,vio,H Hoffman,K Sirinsky,H Struble, vio, M Feiler,vio cello,J Davidson,bj, P Olker,br bass, A Layfield, dr Chicago, Mar 26\nhttp://www.jazz-on-line.com/a/mp3c/VIC43662-1.mp3\tPaul Whiteman & His Orch\tMy Pet\tVICTOR\t27686\t43662-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_202.mp3\tPaul Ash And His Orchestra\tMy Pet\tCOLUMBIA\t1349 D\tW145837-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_016.mp3\tAda Jones\tMy Pony Boy\tVICTOR\t16356\tB8172\t1909\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053209.mp3\tHarlan Leonard & His Rockets\tMy Pop Gave Me A Nickel\tBLUEBIRD\t10823\t053209\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66608.mp3\tInk Spots\tMy Prayer\tDECCA\t2790A\t66608\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_041.mp3\tInk Spots\tMy Prayer\tDECCA\t2790A\t66608\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_010.mp3\tPlatters\tMy Prayer\tMercury\t70893\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU041587.mp3\tGlenn Miller And His Orch\tMy Prayer (vray Eberle)\tBLUEBIRD\t10404\t041587\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37587-1.mp3\tJean Goldkette & His Orch\tMy Pretty Girl\tVICTOR\t25283\t37587-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151276-2.mp3\tFletcher Henderson & His Orch\tMy Pretty Girl\tCOLUMBIA\t2586 D\tW151276-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Col151276-2.mp3\tFletcher Henderson And His Orchestra\tMy Pretty Girl\tColumbia\t2586-D\t151276-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26651-2.mp3\tPaul Whiteman & His Orch\tMy Rambler Rose\tVICTOR\t18923\t26651-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh117.mp3\tKen Snakehips Johnson And His West Indian Orchestra\tMy Ranch (v Don Johnson)\tHMV\tBD-5560\tOEA-8469-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0629_02.mp3\tLee Morse\tMy Red Headed Blue Eyed Colleen\tPerfect\t11624B\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_178.mp3\tPatti Page\tMy Restless Lover\tMERCURY\t70302\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU027410.mp3\tGlenn Miller And His Orch\tMy Reverie\tBLUEBIRD\t7853\t027410\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COS6097-4.mp3\tLarry Clinton & His Orchestra\tMy Reverie\tCOSMO\t705\t6097-4\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4500.mp3\tSarah Vaughan\tMy Reverie\tCOLUMBIA\t39446\tHCO4500\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECC91513.mp3\tBing Crosby\tMy Reverie\tDECCA\t2123A\tC91513\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D310B1.mp3\tBea Wain\tMy Reverie\tV-DISC\t310B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26006.mp3\tLarry Clinton & His Orchestra\tMy Reverie\tVictor\t26006\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_180.mp3\tMildred Bailey\tMy Reverie\tVOCALION\t4406\t23464-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_002.mp3\tLarry Clinton And His Orchestra Feat. Bea Wain\tMy Reverie\tVICTOR\t26006\t024049\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC024049.mp3\tLarry Clinton And His Orchestra\tMy Reverie (vbea Wain)\tVICTOR\t26006\t024049\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23464.mp3\tMildred Bailey & Her Orchestra\tMy Reveries\tVOCALION\t4406\t23464\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99444.mp3\tPaul Whiteman & His Orch\tMy Romance (vgloria Grafton)\tVICTOR\t25269\t99444\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/SIL105605-1.mp3\tFletcher Henderson's Orch.\tMy Rose Marie\tSILVERTONE\t1298\t105605-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Pat105605.mp3\tFletcher Henderson And His Orchestra\tMy Rose Marie\tPath? Actuelle\t\t105605  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4878-1.mp3\tBill Monroe And Bluegrass Boys\tMy Rose Of Old Kentucky (vbm)\tCOLUMBIA\t20423\tCCO4878-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA1032-B.mp3\tAndy Iona's Novelty Four\tMy Rose Of Waikiki\tCOLUMBIA\t3057 D\tLA1032-B\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC56455-3.mp3\tJimmie Rodgers\tMy Rough And Rowdy Ways\tVICTOR\t22220\t56455-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_093.mp3\tHappy Six\tMy Sahara Rose\tCOLUMBIA\tA-2934\t79003-10\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU02538.mp3\tMonroe Brothers\tMy Saviour's Train\tBLUEBIRD\t6729\t02538\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB4137.mp3\tGene Krupa's Chicago Jazz Band\tMy Scandinavian Baby\tRCA\t20-3766\tE0VB4137\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/SwiM-624-1.mp3\tChu Berry And His Stompy Stevedores\tMy Secret Love Affair\tSwing\t358\tM-624-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-1998-1.mp3\tQuintette Du Hot Club De France (with Django Reinhardt)\tMy Serenade\tSWING\t77\tOLA-1998-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18567B.mp3\tGlen Gray And Casa Loma Orch.\tMy Shining Hour\tDECCA\t18567B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D166B1.mp3\tFrank Sinatra\tMy Shining Hour\tV-DISC\t166B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_043.mp3\tGlen Gray And Casa Loma Orchestra\tMy Shining Hour\tDECCA\t18567B\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480878.mp3\tAndre Previn\tMy Shining Hour\tRCA VICTOR\t20-3041\t\t1947\tAndre Previn, p; Al Viola, g; Lloyd Pratt, b; Jackie Mills, drums\nhttp://www.jazz-on-line.com/a/mp3a/VIC72843.mp3\tRuby Newman And His Orch\tMy Silent Love\tVICTOR\t24042\t72843\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR2255-1.mp3\tCharles Brown W Johnny Moore\tMy Silent Love\tALLADDIN\t3254\tRR2255-1\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152181.mp3\tRoger Wolfe Kahn & His Orch\tMy Silent Love\tCOLUMBIA\t2653 D\tW152181\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC168.mp3\tBilly Eckstine & His Orch\tMy Silent Love\tNATIONAL\t\tNSC168\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU11836-A.mp3\tIsham Jones & His Orch\tMy Silent Love\tBRUNSWICK\t6308\t11836-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480880.mp3\tTed Heath And His Music\tMy Silent Love\tDECCA\tF9370\tDR-14191\t1950\tBobby Pratt, Stan Roderick, Stan Reynolds, Ronnie Hughes (tp) Jackie Armstrong, Maurice Pratt, Jack Bentley, Jimmy Coombes (tb) Les Gilbert, Reg Owen (as) Tommy Whittle, Henry Mackenzie (ts) Dave Shand (bar) Frank Horrox (p) Sammy Stokes (b) Jack Parnell (d) Ted Heath (dir) \nhttp://www.jazz-on-line.com/a/mp3c/COLW147147-2.mp3\tBroadway Nitelites\tMy Silver Tree (vlm)\tCOLUMBIA\t1622 D\tW147147-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2066-4.mp3\tJulia Lee And Her Boyfriends\tMy Sin\tCAPITOL\t\t2066-4\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148196-2.mp3\tBen Selvin And His Orch\tMy Sin\tCOLUMBIA\t1800 D\tW148196-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_219.mp3\tBelle Baker\tMy Sin\tBRUNSWICK\t4343\tE29662\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_170.mp3\tGeorgia Gibbs\tMy Sin\tMERCURY\t70339\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3634.mp3\tDick Jurgens And His Orch\tMy Sister And I\tOKEH\t6094\tC3634\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68833.mp3\tJimmy Dorsey And His Orch.\tMy Sister And I\tDECCA\t3710A\t68833\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_118.mp3\tBea Wain\tMy Sister And I\tVICTOR\t27363\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_164.mp3\tBob Chester And His Orchestra Feat. Bill Darnell\tMy Sister And I\tBLUEBIRD\t11088\t060958\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_007.mp3\tJimmy Dorsey And His Orchestra\tMy Sister And I\tDECCA\t3710A\t68833\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_169.mp3\tBenny Goodman And His Orchestra Feat. V/helen Forrest\tMy Sister And I\tCOLUMBIA\t36022\tCO29864-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh164.mp3\tCarroll Gibbons And The Savoy Hotel Orpheans\tMy Sister And I (v Leslie Douglas)\tColumbia\tFB-2711\tCA-18718-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO29864-1.mp3\tBenny Goodman & His Orch\tMy Sister And I (vocal Helen Forrest)\tCOLUMBIA\t36022\tCO29864-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC70158-1.mp3\tRudy Vallee & His Ct.yankees\tMy Song\tVICTOR\t22784\t70158-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_122.mp3\tRudy Vallee And His Connecticut Yankees\tMy Song\tVICTOR\t22784\t70158-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_205.mp3\tNat Shilkret And The Victor Orchestra\tMy Song Of The Nile\tVICTOR\t22073B\t55641-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148789-1.mp3\tBen Selvin & His Orch\tMy Song Of The Nile (v S. Ballew)\tCOLUMBIA\t1900 D\tW148789-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU6656.mp3\tHartman's Tennessee Ramblers\tMy Southern Movements\tBLUEBIRD\t6656\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142651-3.mp3\tEthel Waters\tMy Special Friend Is Back In Town\tCOLUMBIA\t14182 D\tW142651-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/OKECO48097.mp3\tChuck Willis\tMy Story\tOKEH\t6905\tCO48097\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149132-3.mp3\tIpana Troubadors (s.lanin)\tMy Strongest Weakness Is You\tCOLUMBIA\t2006 D\tW149132-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_1111_02.mp3\tLee Morse\tMy Sugar Babe\tPerfect\t11599B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP268x.mp3\tJohnny Mercer\tMy Sugar Is So Refined\tCAPITOL\t268\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_142.mp3\tJohnny Mercer\tMy Sugar Is So Refined\tCapitol\t268\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru12675-A.mp3\tCab Calloway And His Orchestra\tMy Sunday Gal\tBrunswick\t6450\t12675-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC38223-3.mp3\tJack Smith\tMy Sunday Girl\tVICTOR\t20572\t38223-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143539-3.mp3\tClicquot Club Eskimos (reser)\tMy Sunday Girl (vts)\tCOLUMBIA\t921 D\tW143539-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC25539.mp3\tPeerless Qt\tMy Sunny Tennessee\tVICTOR\t18812\t25539.\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC20810-2.mp3\tSterling Trio\tMy Sunshine Jane\tVICTOR\t18403\t20810-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_117.mp3\tSterling Trio\tMy Sunshine Jane\tVICTOR\t18403\t20810-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC48609-2.mp3\tCoon-sanders Orchestra\tMy Suppressed Desire\tVICTOR\t21803\t48609-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDTB-3526-2.mp3\tDjango Reinhardt & The Hot Club De France Quintet W_stphane Grapelli, Violin\tMy Sweet\tDECCA\tF-6769\tDTB-3526-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_063.mp3\tJames F. Harrison And James Reed\tMy Sweet Adair\tVictor\t17852\t16346-3\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75343-A.mp3\tLouis Armstrong - Sy Oliver\tMy Sweet Hunk O' Trash\tDECCA\t24785\t75343-A\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99430.mp3\tTune Wranglers\tMy Sweet Thing\tBLUEBIRD\t6326\t99430\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151682-1.mp3\tBen Selvin & His Orch\tMy Sweet Tooth Says I Wanna\tCOLUMBIA\t2501 D\tW151682-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149133-2.mp3\tIpana Troubadors (s.lanin)\tMy Sweeter Than Sweet\tCOLUMBIA\t2006 D\tW149133-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403082-A.mp3\tFrankie Trumbauer & His Orch\tMy Sweeter Than Sweet (vsb)\tOKeh\t41326\t403082-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/CLO3766.mp3\tClover Do\tMy Sweetest Memory\tCLOVER\t1639\t3766\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC29809-2.mp3\tJean Goldkette And His Orch\tMy Sweetheart\tVICTOR\t19313\t29809-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_1005_01.mp3\tLee Morse\tMy Sweetie Turned Me Down\tPerfect\t11596A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC28455.mp3\tBilly Murray-edward Smalle\tMy Sweetie Went Away\tVICTOR\t19144\t28455\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/PUR1459.mp3\tFletcher Henderson & His Orch\tMy Sweetie Went Away\tPURITAN\tTR11251\t1459\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81245-6.mp3\tBessie Smith\tMy Sweetie Went Away\tCOLUMBIA\t13000 D\t81245-6\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Par1459-1.mp3\tFletcher Henderson's Orchestra\tMy Sweetie Went Away (she Didn't Say Where When Or Why)\tParamount\t20251\t1459-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA192.mp3\tAndy Iona's Novelty Four\tMy Tane\tCOLUMBIA\t3030 D\tLA192\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CON17489-2.mp3\tCarter Family\tMy Texas Girl\tCONQUEROR\t8691\t17489-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/MonUS7793-2.mp3\tStuff Smith & His Orch\tMy Thoughts\tMontgomeryWard\t10027\tUS7793-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU70647-3.mp3\tJimmie Rodgers\tMy Time Ain't Long\tBLUEBIRD\t5083\t70647-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49720-5.mp3\tRudy Valle And His Connecticut Yankees Vocal Refrain By Rudy Valle\tMy Time Is Your Time\tVICTOR\t27841-B\t49720-5\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_083.mp3\tRudy Vallee And His Connecticut Yankees\tMy Time Is Your Time\tVICTOR\t21924\t49720-5\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO48129.mp3\tSarah Vaughan\tMy Tormented Heart\tCOLUMBIA\t39839\tCO48129\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_295.mp3\tSarah Vaughan\tMy Tormented Heart\tCOLUMBIA\t39839\tCO48129\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_210.mp3\tHilltoppers Featuring Jimmy Sacca\tMy Treasure\tDot\t15437\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45678.mp3\tGuy Mitchell\tMy Truly Truly Fair\tCOLUMBIA\t39415\tCO45678\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_284.mp3\tRay Anthony Feat. Tommy Mercer\tMy Truly, Truly Fair\tCapitol\t1583\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_029.mp3\tVic Damone Feat. George Bassman's Orchestra\tMy Truly, Truly Fair\tMERCURY\t5646\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO28858-1.mp3\tEddy Duchin And His Orch\tMy Twilight Dream\tCOLUMBIA\t35314\t28858-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO28858-1.mp3\tEddy Duchin And His Orch\tMy Twilight Dream\tCOLUMBIA\t36224\tCO28858-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCMEM98.mp3\tSwift Jewel Cowboys\tMy Untrue Cowgirl\tVOCALION\t5369\tMEM98\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63877-A.mp3\tTrixie Smith\tMy Unusual Man\tDECCA\t7489\t63877-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC88992-1.mp3\tFats Waller And His Rhythm\tMy Very Good Friend, The Milkman\tVICTOR\t25075\t88992-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CON17484-2.mp3\tCarter Family\tMy Virginia Rose Is Blooming\tCONQUEROR\t8691\t17484-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022922.mp3\tTommy Dorsey & His Orch\tMy Walking Stick\tVICTOR\t25856\t022922\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_317.mp3\tRay Noble And His Orchestra\tMy Walking Stick\tBRUNSWICK\t8153\tLA1598\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29089-1.mp3\tCount Basie And His Orchestra\tMy Wanderin' Man\tOkeh\t5922\t29089-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUCPB1096-A.mp3\tAnson Weeks Mark Hopkins Orch (vks)\tMy Whole Day Is Spoiled\tBRUNSWICK\t6965\tCPB1096-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146768.mp3\tCharlie Poole N.c.ramblers\tMy Wife Went Away And Left Me\tCOLUMBIA\t15584 D\tW146768\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_041.mp3\tArthur Collins And Byron Harlan\tMy Wife's Gone To The Country (hurrah! Hurrah!)\tColumbia\t724\t4137\t1909\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC86750.mp3\tMuggsy Spanier\tMy Wild Irish Rose\tDECCA\t29857\t86750\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_019.mp3\tHaydn Quartet With Harry Macdonough\tMy Wild Irish Rose\tVictor\t5149\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09886.mp3\tFats Waller And His Rhythm\tMy Window Faces The South\tVICTOR\t25762\t09886\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW146749.mp3\tLeo Reisman & His Orch\tMy Window Of Dreams\tCOLUMBIA\t1603 D\tW146749\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70102.mp3\tLionel Hampton & His Orch.\tMy Wish\tDECCA\t18265A\t70102\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067963-1.mp3\tUna Mae Carlisle\tMy Wish\tBLUEBIRD\t11330\t067963-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70102-A.mp3\tLionel Hampton And His Orchestra\tMy Wish\tDecca\t18265\t70102-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU11331-A.mp3\tBing Crosby\tMy Woman\tBRUNSWICK\t6268\t11331-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26766-A.mp3\tGene Krupa & His Orch\tMy Wonderful One Let's Dance\tCOLUMBIA\t35474\t26766-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh081.mp3\tLew Stone And His Band\tMy Wubba Dolly (v Celia Lipton)\tDecca\tF-7397\tDR-4275-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23982.mp3\tSophie Tucker\tMy Yiddishe Momme\tDECCA\t23982\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_041.mp3\tSophie Tucker\tMy Yiddishe Momme\tDECCA\t23982\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_202.mp3\tTommy Dorsey And His Orchestra Feat. V/pied Pipers\tMy! My!\tVICTOR\t26535\t047746\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC75862-1.mp3\tEddie South & His Orch\tMy! Oh My!\tVICTOR\t24343\t75862-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN9633-1-2.mp3\tKarl Radlach & His Orchestra\tMysterious Mose\tBANNER\t689\t9633-1-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/Gen16604.mp3\tCliff Perrine And His Orchestra\tMysterious Mose\tGennett\t7214\t16604\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_037.mp3\tPaul Biese And His Novelty Orchestra\tMystery\tVICTOR\t18647A\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14438-A.mp3\tClaude Hopkins And His Orch\tMystic Moan\tBRUNSWICK\t6750\t14438-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COL77602.mp3\tAl Jolson\tN Everything\tCOLUMBIA\tA-2519\t77602\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_019.mp3\tAl Jolson\tN Everything\tCOLUMBIA\tA-2519\t77602\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_187.mp3\tPerry Como Feat. V/the Fontane Sisters\tN'yot N'yow (the Pussycat Song)\tRCA Victor\t3288\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D437.mp3\tRed Norvo & His Orch\tN.r.c Jump\tV-DISC\t143\t437\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA195.mp3\tAndy Iona's Novelty Four\tNa Pua\tCOLUMBIA\t3030 D\tLA195\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOLA1290.mp3\tQuintet Hot Club Of France\tNagasaki\tVICTOR\t25558\tOLA1290\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DECTB1299.mp3\tMills Brothers\tNagasaki\tDECCA\t176A\tTB1299\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC1055-A.mp3\tCab Calloway & His Orch\tNagasaki\tBRUNSWICK\t7504\tC1055-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP2198.mp3\tBenny Goodman Sextet\tNagasaki\tCAPITOL\t\t2198\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87643.mp3\tCharlie Barnet & His Orchestra\tNagasaki\tBLUEBIRD\t5815\t87643\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC90567.mp3\tAlbert Ammons Rhythm Kings\tNagasaki\tDECCA\t749B\tC90567\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66425.mp3\tRice Brothers Gang\tNagasaki\tDECCA\t5805\t66425\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12447-A.mp3\tDon Redman & His Orch\tNagasaki\tBRUNSWICK\t6429\t12447-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1090-1.mp3\tDjango Reinhardt\tNagasaki\tGramophone\tK-7843\tOLA-1090-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VocS-141-1.mp3\tBenny Carter And His Orchestra\tNagasaki\tVocalion\tS-69\tS-141-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-8489-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tNagasaki \tParlophone\tF-952\tCE-8489-1 \t1937\tValaida Snow t v acc. by Johnny Claes t, Derek Neville as bar, Reggie Dare ts, Gun Finlay p, Norman Brown g, Louis Barreiro b, Ken Stewart d\nhttp://www.jazz-on-line.com/a/mp3d/BruB-12447-A.mp3\tDon Redman And His Orchestra\tNagasaki\tBrunswick\t6429\tB-12447-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Col265138-2.mp3\tFletcher Henderson And His Orchestra\tNagasaki\tColumbia\t2828-D\t265138-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31640.mp3\tCab Calloway & His Orch\tNain Nain\tOKEH\t6547\t31640\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39678.mp3\tGeorgia Washboard Stompers\tName It\tDECCA\t7095\t39678\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8943NB.mp3\tOscar Peterson\tNameless Blues\tMERCURY\t8943\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_352.mp3\tDon Cherry\tNamely You\tColumbia\t40746\tCO56522\t1956\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480515.mp3\tBenny Golson Sextet\tNamely You\tRiverside\tRLP12-256\t\t1957\tKenny Dorham (tp), J.J. Johnson (tb), Benny Golson (ts), Wynton Kelly (p), Paul Chambers (sb), Charlie Persip or Max Roach (dm)\nhttp://www.jazz-on-line.com/a/mp3e/DEC38541-A.mp3\tJimmie Lunceford And His Orchestra\tNana\tDECCA\t130A\t38541-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1521.mp3\tFrank Sinatra\tNancy\tCOLUMBIA\t36868\tHCO1521\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D323A.mp3\tFrank Sinatra\tNancy\tV-DISC\t323A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147254.mp3\tGid Tanner's Skillet Lickers\tNancy Rolling\tCOLUMBIA\t15382 D\tW147254\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA1028.mp3\tAndy Iona's Novelty Four\tNani Wale Ka Ma Hina\tCOLUMBIA\t3056 D\tLA1028\t\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480881.mp3\tCarmen Miranda And The Bando Da Lua\tNao Te Dou A Chupeta\tDECCA\t23241-B\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15752.mp3\tGlen Gray And The Casa Loma Orch\tNarcissus\tBRUNSWICK\t7321\t15752\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU7321.mp3\tGlen Gray & The Casa Loma Orch\tNarcissus\tBRUNSWICK\t7321\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD165.mp3\tGeorgie Auld & His Orch\tNashooma\tDISC\t116\tD165\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75584.mp3\tSy Oliver & His Orch.\tNashville Blues\tDECCA\t24840\t75584\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW140625-2.mp3\tBessie Smith\tNashville Women's Blues\tCOLUMBIA\t14090 D\tW140625-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480782.mp3\tJay Mcshann & His Orch.\tNasty Attitude\t\t\t\t1949\tJay McShann (p), Ben Webster (ts)\nhttp://www.jazz-on-line.com/a/mp3a/ARC15421.mp3\tAlice Faye Accompanied By Freddy Martin And His Orchestra\tNasty Man\tARC\t\t15421\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC81783-1.mp3\tRudy Vallee & His Ct.yankees\tNasty Man\tVICTOR\t24581\t81783-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_145.mp3\tRudy Vallee And His Connecticut Yankees\tNasty Man\tVICTOR\t24581\t81783-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DECAM180.mp3\tColeman Hawkins & Ramblers\tNatcha's Dream\tDECCA\t3881B\tAM180\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU044966.mp3\tLewis Bronzeville Five\tNatchez Mississippi Blues\tBLUEBIRD\t8445\t044966\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB6214-3.mp3\tArthur Pryor's Band\tNational Emblem March\tVICTOR\t17957\tB6214-3\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_089.mp3\tArthur Pryor's Band\tNational Emblem March\tVICTOR\t17957\tB6214-3\t1909\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1416-1.mp3\tFrankie Trumbauer Orch\tNational Emblem March (f T)\tVARSITY\t8243\tUS1416-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_249.mp3\tRusty Draper Feat. D/david Carroll; V/jack Halloran Singers\tNative Dancer\tMERCURY\t70256\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_363.mp3\tRudy Vallee And His Connecticut Yankees\tNaturally\tBluebird\t7645\t23491\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15054.mp3\tNat King Cole\tNature Boy\tCAPITOL\t\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_057.mp3\tFrank Sinatra\tNature Boy\tCOLUMBIA\t38210\tHCO3250\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP2050.mp3\tKing Cole Trio\tNaughty Angeline\tCAPITOL\t\t2050\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA426.mp3\tAndy Iona's Novelty Four\tNaughty Hula Eyes\tCOLUMBIA\t3094 D\tLA426\t\t\nhttp://www.jazz-on-line.com/a/mp3e/RCA20-5897x.mp3\tAmes Brothers\tNaughty Lady Of Shady Lane\tRCA\t20-5897\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_019.mp3\tAmes Brothers\tNaughty Lady Of Shady Lane\tRCA Victor\t5897\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC13953.mp3\tFletcher Henderson & His Orch\tNaughty Man\tVOCALION\t14935B\t13953\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Ori5749-3.mp3\tFletcher Henderson And His Orchestra\tNaughty Man\tOriole\t\t5749-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Col140139-3.mp3\tFletcher Henderson And His Orchestra\tNaughty Man\tColumbia\t\t140139-3  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc13953.mp3\tFletcher Henderson And His Orchestra\tNaughty Man\tVocalion\t\t13953  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI5151.mp3\tGladys Rice\tNaughty Naughty Naughty\tEDISON\t50419\t5151\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_024.mp3\tHarry Macdonough\tNavajo\tMONARCH\tV-2656\t\t1904\t\nhttp://www.jazz-on-line.com/a/mp3e/COL01655!.mp3\tBilly Murray (tenor)\tNavajo From Nancy Brown\tCOLUMBIA\tBS1655\t01655\t1904\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20396-2.mp3\tConway's Band\tNaval Reserve March\tVICTOR\t18360\t20396-2\t1917\t\nhttp://www.78-tours.net/mp3/GRA50-2759.mp3\tMaguy Fred De L'empire Avec Accordon Par Vaissade Et Banjo Par Latorre\tNe Brlez Pas Vos Lettres D'amour\tGRAMOPHONE\tK-6804\t50-2759\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43261.mp3\tCount Basie & His Orchestra\tNeal's Deal\tCOLUMBIA\t39075\tCO43261\t1950\t\nhttp://www.jazz-on-line.com/a/mp3r/RiPat36867.mp3\tCasino Dance Orchestra\tNeapolitan Nights\tPath\t36867\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BUL1001x.mp3\tFrancis Craig\tNear You\tBULLET\t1001\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP452x.mp3\tAlvino Rey\tNear You\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2421x.mp3\tLarry Green\tNear You\tRCA\t20-2421\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74021.mp3\tAndrews Sisters / Vic Schoen\tNear You\tDECCA\t24171\t74021\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_031.mp3\tAndrews Sisters\tNear You\tDECCA\t24171\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_142.mp3\tTwo-ton Baker And His Music Makers\tNear You\tMERCURY\t5066\t957-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_001.mp3\tFrancis Craig And His Orchestra Feat. Bob Lamm\tNear You\tBullet\t1001\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_036.mp3\tLarry Green And His Orchestra\tNear You\tRCA\t20-2421\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_086.mp3\tJohn Mccormack\tNearer My God To Thee\tVICTOR\t64345\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_090.mp3\tRichard Jose\tNearer My God To Thee\tMONARCH\tV-4818\tB3145\t1906\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26390-4.mp3\tPaul Whiteman & His Orch\tNeath The South Sea Moon\tVICTOR\t18911\t26390-4\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_092.mp3\tMerle Tillotson\tNeath The Southern Moon\tColumbia\t5255\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4589.mp3\tFrankie Laine\tNecessary Evil\tCOLUMBIA\t39598\tHCO4589\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL6526.mp3\tL.armstrong-ella Fitzgerald\tNecessary Evil\tDECCA\t27901\tL6526\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO37341.mp3\tCab Calloway & His Orch\tNecessity\tCOLUMBIA\t37312\tCO37341\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62466.mp3\tSleepy John Estes\tNeed More Blues\tDECCA\t7365\t62466\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/Cap3922.mp3\tJo Stafford And Gordon Macrae\tNeed You\tCapitol\t15393\t3922\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_308.mp3\tGuy Lombardo And His Royal Canadians\tNeed You\tDecca\t24614\t74803\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_064.mp3\tJo Stafford And Gordon Macrae\tNeed You\tCapitol\t15393\t3922\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC071710.mp3\tArtie Shaw And His Orchestra\tNeedlenose\tVICTOR\t27860\t071710-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/MER8934N.mp3\tLester Young Orch\tNeenah\tMERCURY\t8934\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09885.mp3\tFats Waller And His Rhythm\tNeglected\tVICTOR\t25749\t09885\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_079.mp3\tIsham Jones And His Orchestra\tNeighbors\tVICTOR\t24582\t81798-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_221.mp3\tFreddy Martin And His Orchestra\tNeighbors\tBRUNSWICK\t6777\t14819\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1793.mp3\tBing Crosby - J.s.trotter\tNeighbors In The Sky\tDECCA\t2626B\tDLA1793\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2503.mp3\tBing Crosby\tNell And I\tDECCA\t18801B\tDLA2503\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_071.mp3\tAmerican Quartet\tNellie Kelly I Love You\tVictor\t18957\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D790k.mp3\tBuddy Rich Orch\tNellie's Nightmare\tV-DISC\t790\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03845-1.mp3\tFats Waller And His Rhythm\tNero\tVICTOR\t25498\t03845-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-106-1.mp3\tAlix Combelle And His Swing Band\tNerves And Fever\tSwing\t\tOSW-106-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Har141527-3.mp3\tThe Dixie Stompers\tNervous Charlie Stomp\tHarmony\t153-H\t141527-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN520N.mp3\tJohn Hardee Sextet\tNervous From The Service\tBLUENOTE\tBN520\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC29832-3.mp3\tPaul Biese Novelty Trio\tNever Again\tVICTOR\t19313\t29832-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030783.mp3\tTommy Dorsey & His Orch\tNever Again\tVICTOR\t26148\t030783\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN861NB.mp3\tZeb Turner\tNever Been So Lonesome\tKING\t861\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66894.mp3\tBlue Lu Barker & Fly Cats\tNever Brag About Your Man\tDECCA\t7683\t66894\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022482.mp3\tBunny Berigan & His Orch\tNever Felt Better, Never Had Less\tVICTOR\t25858B\t022482\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1135.mp3\tFred Astaire W Johnny Green\tNever Gonna Dance\tBRUNSWICK\t7718\tLA1135\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_073.mp3\tFred Astaire\tNever Gonna Dance\tCOLUMBIA\t3146 D\tLA1135\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC15631-B.mp3\tWingy Manone & His Orch\tNever Had No Lovin'\tARC\tSE5011\t15631-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1304.mp3\tAlice Faye Orchestra Under Direction Of Cy Feuer\tNever In A Million Years\tBRUNSWICK\t7860\tLA1304\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA730-A.mp3\tBing Crosby And Jimmy Dorsey Or\tNever In A Million Years\tDECCA\t1210\tDLA730-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1857.mp3\tMildred Bailey & Her Orchestra\tNever In A Million Years\tVOCALION\t3508\tC1857\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_134.mp3\tMildred Bailey\tNever In A Million Years\tVOCALION\t3508\tC1857\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA730-A.mp3\tJimmy Dorsey And His Orchestra With Bing Crosby\tNever In A Million Years \tDECCA\t1210\tDLA730-A \t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_122.mp3\tGlen Gray And Casa Loma Orchestra\tNever In A Million Years\tDECCA\t1211\t62084\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_422.mp3\tNat ''king'' Cole\tNever Let Me Go\tCapitol\t3390\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67635.mp3\tLouis Jordan & His Tympani 5\tNever Let Your Left Hand Know\tDECCA\t7777\t67635\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1415-2.mp3\tFrankie Trumbauer Orch\tNever Never Land Fantasy\tVARSITY\t8243\tUS1415-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D049656-1.mp3\tDuke Ellington Orch\tNever No Lament\tV-DISC\t010\t049656-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148208.mp3\tGid Tanner's Skillet Lickers\tNever Seen The Like Since Gettin' Upstairs\tCOLUMBIA\t15472 D\tW148208\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC03873-1.mp3\tBenny Goodman And His Orchestra\tNever Should Have Told You\tVICTOR\t25500\t03873-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_323.mp3\tBenny Goodman And His Orchestra Feat. Margaret Mccrae\tNever Should Have Told You\tVICTOR\t25500\t03873-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE872.mp3\tAbe Lyman's California Orch\tNever Swat A Fly\tBRUNSWICK\t4924\tLAE872\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh156.mp3\tSydney Lipton And His Grosvenor House Dance Orchestra\tNever Took A Lesson In My Life\tColumbia\tFB-2516\tCA-18173-1\t1040\t\nhttp://www.jazz-on-line.com/a/mp3c/CON26951-A.mp3\tGene Krupa & His Orch\tNever Took A Lesson In My Life (v I. Day)\tCONQUEROR\t9656\t26951-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP40054x.mp3\tTex Williams\tNever Trust A Woman\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_174.mp3\tAl Hibbler\tNever Turn Back\tDecca\t29950\t88984\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC88984.mp3\tAl Hibbler\tNever Turn Back\tDECCA\t29950\t88984\t\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKJ-49-2.mp3\tMezzrow - Bechet Quintet\tNever Will I Forget The Blues\tStoryville \tSLP153\tKJ-49-2  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC10693-2.mp3\tRuth Etting (6-9-31)\tNevertheless\tARC\tBA32214\t10693-2\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1190x.mp3\tRay Anthony\tNevertheless\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4228.mp3\tPaul Weston\tNevertheless\tCOLUMBIA\t38982\tHCO4228\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/MERME1439-1.mp3\tFrankie Laine\tNevertheless\tMERCURY\t5495\tME1439-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB618.mp3\tPat Flowers & His Rhythm\tNevertheless\tRCA\t20-2215\tD7VB618\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC27253x.mp3\tMills Brothers\tNevertheless\tDECCA\t27253\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_114.mp3\tFrank Sinatra\tNevertheless\tCOLUMBIA\t39044\tCO44430\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_097.mp3\tRay Anthony Feat. Ronnie Deauville And The Skyliners\tNevertheless (i'm In Love With You)\tCapitol\t1190\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_068.mp3\tJack Denny And His Orchestra Feat. V/rob May\tNevertheless (i'm In Love With You)\tBRUNSWICK\t6114\tE36404\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_096.mp3\tRalph Flanagan And His Orchestra Feat. Harry Prime\tNevertheless (i'm In Love With You)\tRCA\t20-3904\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/MERC665-4.mp3\tCount Basie & His Orchestra\tNew Basie Blues\tMERCURY\t8964\tC665-4\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151004.mp3\tJimmie Tarlton\tNew Birmingham Jail\tCOLUMBIA\t15629 D\tW151004\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3407.mp3\tRhythm Willie And His Gang\tNew Block And Tackle Blues\tOKEH\t5856\tC3407\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74728.mp3\tLionel Hampton Sextet\tNew Central Avenue Breakdown\tDECCA\t24607\t74728\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec74728.mp3\tLionel Hampton And His Orchestra\tNew Central Avenue Breakdown\tDecca\t24607\t74728\t1949\tBenny Bailey-Duke Garrette-t, Johnny Board-as, Gene Morrists, Albert Ammons-p, Lionel Flampton-vib-p-a-v, Wes Montgomery-g, Roy Johnson-p, Earl Walker-d, Sonny Parker-Betty Carter-v\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu5380n.mp3\tAllen Brothers\tNew Chattanooga Blues\tBluebird\t5380\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU62593.mp3\tAllen Brothers\tNew Chattanooga Blues\tBLUEBIRD\t5380\t62593\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93812.mp3\tJay Mcshann Quartet\tNew Confessin' The Blues\tDECCA\t48008\tC93812\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62190-1.mp3\tWilton Crawley Rhythm Kings\tNew Crawley Blues\tVICTOR\t23344\t62190-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic62190-1.mp3\tWilton Crawley And His Orchestra\tNew Crawley Blues\tVictor\t23344\t62190-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC3756ND.mp3\tLouis Armstrong & His Orch.\tNew Do You Call That A Buddy\tDECCA\t3756\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUM180.mp3\tDuke Ellington And His Orch\tNew East St Louis Toodle-oo\tBRUNSWICK\t7989\tM180\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5722.mp3\tJohnny Guarnieri Trio\tNew Exercise In Swing\tSAVOY\t556B\tS5722\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW151930.mp3\tTed Lewis & His Band\tNew Farewell Blues\tCOLUMBIA\t2721 D\tW151930\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_188.mp3\tTed Lewis And His Band\tNew Farewell Blues\tCOLUMBIA\t2721 D\tW151930\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55430-1.mp3\tBennie Moten's Kansas City Or.\tNew Goofy Dust Rag\tVICTOR\t38091\t55430-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW141276-3.mp3\tBessie Smith\tNew Gulf Coast Blues\tCOLUMBIA\t14109 D\tW141276-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe152325-1.mp3\tFletcher Henderson & His Orch\tNew King Porter Stomp\tOKeh\t41565\t152325-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke152325-1.mp3\tFletcher Henderson And His Orchestra\tNew King Porter Stomp\tOkeh\t41565\t152325-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL137NLL.mp3\tLester Young\tNew Lester Leaps In\tALLADDIN\t137\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CONWC3111-A.mp3\tChampion Jack Dupree\tNew Low Down Dog\tCONQUEROR\t9369\tWC3111-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN578A.mp3\tMoon Mullican And The Showboys\tNew Milk Cow Blues\tKING\t578A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62925-2.mp3\tBennie Moten's Kansas Orch\tNew Moten Stomp\tVICTOR\t23030\t62925-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU12791-A.mp3\tCasa Loma Orchestra\tNew Orleans\tBRUNSWICK\t6486\t12791-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC74850-1.mp3\tBennie Moten Kansas City Orch\tNew Orleans\tVICTOR\t24216\t74850-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COM622y.mp3\tBobby Hackett & His Orch\tNew Orleans\tCOMMODORE\t622\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC64433.mp3\tBlue Lu Barker And Fly Cats\tNew Orleans Blues\tDECCA\t7538\t64433\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49456-1.mp3\tJelly Roll Morton Peppers\tNew Orleans Bump\tVICTOR\t38078\t49456-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic49456-1.mp3\tJelly Roll Morton And His Orchestra\tNew Orleans Bump (monrovia)\tVictor\tV-38078\t49456-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76339-40.mp3\tLouis Armstrong & His Allstars\tNew Orleans Function\tDECCA\t27059\t76339-40\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/WES115y.mp3\tLu Watters's Yerba Buena Jazz B\tNew Orleans Joys\tWest Coast\t115\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG11538.mp3\tJelly Roll Morton\tNew Orleans Joys\tGENNETT\t5486\tG11538\t1923\t\nhttp://www.jazz-on-line.com/a/mp3h/VocE-4510.mp3\tDuke Ellington And His Kentucky Club Orchestra\tNew Orleans Low-down\tVocalion\t1086\tE-4510\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC58340-1.mp3\tKing Oliver & His Orchestra\tNew Orleans Shout\tVICTOR\t23388\t58340-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE6674.mp3\tJohnny Dodds Black Bottom St.\tNew Orleans Stomp\tVOCALION\t15632\tE6674\t1927\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO7x.mp3\tTurk Murphy's Jazz Band\tNew Orleans Stomp\tGood Time Jazz\t7\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/Col81304-2.mp3\tKing Oliver's Jazz Band\tNew Orleans Stomp\tColumbia\t13003-D\t81304-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69115-B.mp3\tBuddy Johnson & His Band\tNew Please, Mr Johnson\tDECCA\t8555A\t69115-B\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK2165-K.mp3\tMoon Mullican And The Showboys\tNew Pretty Blonde - Now Jole Blon\tKING\t578A\tK2165-K\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEDAL981.mp3\tBob Wills And His Texas Playboys\tNew San Antonio Rose\tOKEH\t5694\tDAL981\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D115A2.mp3\tBob Wills And His Texas Playboys\tNew San Antonio Rose\tV-DISC\t115A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_141.mp3\tBob Wills And His Texas Playboys\tNew San Antonio Rose\tOKEH\t5694\tDAL981\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044240.mp3\tTommy Mcclennan\tNew Shake Em On Down\tBLUEBIRD\t8347\t044240\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC7473.mp3\tSleepy John Estes\tNew Someday Baby\tDECCA\t7473\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLH1369-1.mp3\tBob Wills Texas Playboys\tNew Spanish Two Step\tCOLUMBIA\t36966\tH1369-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20136.mp3\tAbe Lyman & His Orch\tNew St Louis Blues\tBRUNSWICK\t3316\t20136\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM-370-1.mp3\tBenny Carter And The Ramblers\tNew Street Swing\tDECCA\tF-42165\tAM-370-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480780.mp3\tJay Mcshann & His Orch.\tNew Style Baby\t\t\t\t1949\tJay McShann (p), Ben Webster (ts)\nhttp://www.jazz-on-line.com/a/mp3w/1931_119.mp3\tLeo Reisman And His Orchestra Feat. V/fred Astaire\tNew Sun In The Sky\tVICTOR\t22755\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150683-1.mp3\tPaul Whiteman & His Orch\tNew Tiger Rag\tCOLUMBIA\t2277 D\tW150683-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57315-2.mp3\tBennie Moten Kansas City Orch\tNew Vine Street Blues\tVICTOR\t23007\t57315-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE3871.mp3\tKing Oliver Dixie Syncopators\tNew Wang Wang Blues\tVOCALION\t1049\tE3871\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D695NW2.mp3\tDuke Ellington Orch\tNew World A-comin' Part 2\tV-DISC\t695\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DJDB206.mp3\tDuke Ellington Orch\tNew World A-coming Part 1\tV-DISC\t695\tJDB206\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051323.mp3\tLeadbelly\tNew York City\tBLUEBIRD\t8750\t051323\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38672.mp3\tDuke Ellington & His Orch\tNew York City Blues\tCOLUMBIA\t38235\tCO38672\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK9058.mp3\tErroll Garner\tNew York Concerto\tKING\t4479\tK9058\t1951\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481516.mp3\tCharles Mingus\tNew York Sketchbook\tBethlehem\tBCP6026\t\t1957\tClarence ?Gene? Shaw (tp), Jimmy Knepper (tb), Shafi Hadi (ts), Bob Hammer, Horace Parlan (p), Charles Mingus (sb), Dannie Richmond (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1956_329.mp3\tSammy Davis Jr.\tNew York's My Home\tDecca\t30111\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR21100-2.mp3\tCincinatti Jug Band\tNewport Blues\tPARAMOUNT\t12743A\t21100-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480451.mp3\tArt Farmer And Gigi Gryce\tNica's Tempo\tPrestige\tLP 7017\t808\t1955\tArt Farmer, FLH, Gigi Gryce, As, Duke Jordan, P, Addison Farmer, B,, Art's Twin Brother, Philly Joe Jones, D, [Featuring Gigi Gryce]\nhttp://www.jazz-on-line.com/a/mp3c/SAV5426-B.mp3\tCozy Cole Allstars\tNice And Cozy\tSAVOY\t502B\t5426-B\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU013807.mp3\tShep Fields Rippling Rhythm\tNice Work If You Can Get It\tBLUEBIRD\t7195\t013807\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62810-A.mp3\tAndrews Sisters\tNice Work If You Can Get It\tDECCA\t1562\t62810-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43831.mp3\tSarah Vaughan\tNice Work If You Can Get It\tCOLUMBIA\t38897\tCO43831\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014679.mp3\tTommy Dorsey & Clambake 7\tNice Work If You Can Get It\tVICTOR\t25695\t014679\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_218.mp3\tAndrews Sisters\tNice Work If You Can Get It\tDECCA\t1562\t62810-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_024.mp3\tFred Astaire Feat. Ray Noble's Orchestra\tNice Work If You Can Get It\tBRUNSWICK\t7983\tLA1467-B-C\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21939-1.mp3\tMaxine Sullivan (orchestra Under Direction Claude Thornhill)\tNice Work If You Can Get It\tVocalion\t3848\t21939-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_127.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. Bob Goday\tNice Work If You Can Get It\tBluebird\t7195\t13807\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150205.mp3\tGid Tanner's Skillet Lickers\tNigger In The Woodpile\tCOLUMBIA\t15562 D\tW150205\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_206.mp3\tJack Denny And His Orchestra Feat. V/frank Luther\tNight\tVICTOR\t22995\t72263-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043991.mp3\tCharlie Barnet & His Orch\tNight After Night After You (v M A M)\tBLUEBIRD\t10549\t043991\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU12692-1.mp3\tEddy Duchin And His Orch\tNight And Day\tBRUNSWICK\t6445\t12692-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW265121.mp3\tFred Astaire\tNight And Day\tCOLUMBIA\t-R\tW265121\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5543.mp3\tArtie Shaw And His Orchestra\tNight And Day\tMUSICRAFT\t389\t5543\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC73977-1.mp3\tLeo Reisman And His Orch\tNight And Day\tVICTOR\t24716\t73977-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC011356.mp3\tTommy Dorsey And His Orch\tNight And Day\tVICTOR\t25657\t011356\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDTB3525.mp3\tQuintet Of Hot Club Of France\tNight And Day\tDECCA\t23067\tDTB3525\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU072045.mp3\tFrank Sinatra\tNight And Day\tBLUEBIRD\t11463\t072045\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3316.mp3\tBing Crosby\tNight And Day\tDECCA\t18887A\tL3316\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL15.mp3\tColeman Hawkins Qt\tNight And Day\tKEYNOTE\t611\tHL15\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/SIGBOB4.mp3\tEddie Heywood Trio\tNight And Day\tSIGNATURE\t40003B\tBOB4\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/ASCMA713.mp3\tMary Lou Williams Trio\tNight And Day\tASCH\t351-2\tMA713\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/SUNSRC102.mp3\tJoe Sullivan Qt\tNight And Day\tSUNSET\t100-50\tSRC102\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/CON26341-A.mp3\tBillie Holiday & Her Orch\tNight And Day\tCONQUEROR\t9457\t26341-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDTB-3525-1.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tNight And Day\tDECCA\tF-6616\tDTB-3525-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu56128.mp3\tCharlie Barnet & His Orch\tNight And Day\tBluebird\t10888\t56128\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_134.mp3\tFrank Sinatra\tNight And Day\tBLUEBIRD\t11463\t072045\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_260.mp3\tBing Crosby\tNight And Day\tDECCA\t18887A\tL3316\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_002.mp3\tLeo Reisman And His Orchestra Feat. Fred Astaire\tNight And Day\tVICTOR\t24193\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_298.mp3\tCharlie Barnet And His Orchestra\tNight And Day\tBLUEBIRD\t10888\t56128\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_012.mp3\tEddy Duchin And His Orchestra\tNight And Day\tBRUNSWICK\t6445\t12692-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480385.mp3\tThe Art Tatum/roy Eldridge/alvin Stoller/john Simmons Quartet\tNight And Day\tClef\tMGC679\t2309-1\t1955\tRoy Eldridge (tp) Art Tatum (p) John Simmons (b) Alvin Stoller (d)\nhttp://www.jazz-on-line.com/a/mp3t/TS480516.mp3\tArt Tatum/ Ben Webster Quartet\tNight And Day\tBarclay\t74030\t2995-2\t1956\tBen Webster (ts), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480694.mp3\tArt Tatum\tNight And Day\tClef\tMGC657\t1440-1\t1953\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3c/BLU042180.mp3\tCharlie Barnet & His Orch\tNight Glow\tBLUEBIRD\t10511 A\t042180\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC042600.mp3\tTommy Dorsey & His Orch\tNight Glow\tVICTOR\t26376\t042600\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_123.mp3\tCoon-sanders Orchestra\tNight Hawk Blues\tVICTOR\t19316\t29837-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec67781-A.mp3\tBenny Carter And His Orchestra\tNight Hop\tDecca\t3294A\t67781-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037650.mp3\tTommy Dorsey & His Orch\tNight In Sudan\tVICTOR\t26321\t037650\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/V-D275x.mp3\tBoyd Raeburn\tNight In Tunisia\tV-DISC\t275\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Col265137-2.mp3\tFletcher Henderson And His Orchestra\tNight Life\tColumbia\tCB-727\t265137-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC027265.mp3\tXavier Cugat & His Orch\tNight Must Fall\tVICTOR\t26074\t027265\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE32062-1.mp3\tGene Krupa & His Orch\tNight Of Nights\tOKEH\t6635\t32062-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU15229-A.mp3\tLeo Reisman & His Orch\tNight On The Desert (vgb)\tBRUNSWICK\t6903\t15229-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1572-1.mp3\tJack Teagarden & His Orch\tNight On The Shalimar (v J T)\tVARSITY\t8278\tUS1572-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_096.mp3\tGuy Lombardo And His Royal Canadians\tNight On The Water\tBrunswick\t6714\t14383-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6714.mp3\tGuy Lombardo Royal Canadians\tNight On The Water\tBrunswick\t6714\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU14383-A.mp3\tGuy Lombardo Royal Canadians\tNight On The Water (v3)\tBRUNSWICK\t6714\t14383-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW152484.mp3\tGeorge Olsen & His Orch\tNight Owl\tCOLUMBIA\t2811 D\tW152484\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU029N.mp3\tEdmond Hall Bluenote Jazzmen\tNight Shift Blues\tBLUENOTE\tBN029\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035052.mp3\tCharlie Barnet & His Orch\tNight Song\tBLUEBIRD\t10191\t035052\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC043926.mp3\tBunny Berigan & His Orch\tNight Song\tVICTOR\t27258B\t043926\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_108.mp3\tArthur Collins And Byron Harlan\tNight Time In Little Italy\tEdison Blue Amberol\t3196\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC91205-A.mp3\tHoney Dripper (r.sykes)\tNight Time Is The Right Time\tDECCA\t7324\t91205-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEHCO810.mp3\tRoy Acuff - Smoky Mountain Boys\tNight Train To Memphis\tOKEH\t6694\tHCO810\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D239B2a.mp3\tChuck Foster And His Orchestra\tNight Train To Memphis\tV-DISC\t239B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480882.mp3\tTed Heath And His Music\tNight Train To Scotland\tDECCA-LONDON\t454\tDR-13404\t1949\tStan Reynolds, Stan Roderick, Dave Wilkins, Maurice Miller (tp) Jackie Armstrong, Maurice Pratt, Jack Bentley, Jimmy Coombes (tb) Les Gilbert, Reg Owen (as) Johnny Gray, Tommy Whittle (ts), Dave Shand (bar) Norman Stenfalt (p) Dave Goldberg (g) Charlie Short (b) Jack Parnell (d) Ted Heath (dir)\nhttp://www.jazz-on-line.com/a/mp3c/CAP7823-D1.mp3\tStan Kenton & His Orch\tNight Watch\tCAPITOL\t\t7823-D1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC4088.mp3\tBig Bill\tNight Watchman Blues\tOKEH\t6705\tC4088\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COL16890.mp3\tBenny Goodman And His Orchestra\tNight Wind\tCOLUMBIA\t3015 D\t16890\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/GUIG616.mp3\tCozy Cole & His Quintet\tNight Wind\tGUILDE\t130\tG616\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_148.mp3\tDorsey Brothers Orchestra Feat. Bob Crosby\tNight Wind\tDECCA\t376A\t39224-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_124.mp3\tBenny Goodman And His Orchestra Feat. O/helen Ward\tNight Wind\tCOLUMBIA\t3015 D\t16890\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39224-A.mp3\tDorsey Brothers Orch.\tNight Wind (vbob Crosby)\tDECCA\t376A\t39224-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI5416-C.mp3\tArthur Collins - Byron G. Harlan - O\tNight-time In Little Italy - Foxtrot (fred Fischer - Joe Mccarthy)\tEDISON\tBA 3196\t5416-C\t\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC29837-3.mp3\tCoon-sanders Nighthawk Orch\tNighthawk Blues\tVICTOR\t19316\t29837-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU056481.mp3\tGlenn Miller And His Orch\tNightingale Sang In Berkeley Square (vre)\tBLUEBIRD\t10931\t056481\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU027229.mp3\tArtie Shaw And His Orchestra\tNightmare\tBLUEBIRD\t7875A\t027229-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-7875-A.mp3\tArtie Shaw And His Orchestra\tNightmare\tBLUEBIRD\tB-7875\t027229-1\t1938\ttheme song\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu7875.mp3\tArtie Shaw And His Orchestra\tNightmare\tBluebird\t7875\t027229-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_117.mp3\tArtie Shaw And His Orchestra\tNightmare\tBLUEBIRD\t7875A\t027229\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU060611-1.mp3\tAlvino Rey & His Orch\tNighty Night\tBLUEBIRD\t11041A\t060611-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11041.mp3\tAlvino Rey & His Orchestra\tNighty Night\tBluebird\t11041\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_302.mp3\tDick Jurgens And His Orchestra\tNighty Night\tOkeh\t6166\tC3676\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27415.mp3\tJoshua White & Carolinians\tNine Foot Shovel\tCOLUMBIA\t35559\t27415\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL35559n.mp3\tJoshua White & Carolinians\tNine Foot Shovel\tCOLUMBIA\t35559\t27415\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64812-1.mp3\tDuke Ellington & His Orch\tNine Little Miles From Tennessee\tVICTOR\t22586\t64812-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74917.mp3\tSy Oliver & His Orch\tNine O'clock Sal\tDECCA\t24662\t74917\t1949\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC49443-2.mp3\tDoc Daugherty And His Orchestra\tNinety In The Shade\tVICTOR\tV-40111\t49443-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC7446.mp3\tBen Bernie & His Orch\tNinety Nine Out Of A Hundred Wanna Be Loved\tBRUNSWICK\t6062\tC7446\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_183.mp3\tGuy Mitchell\tNinety Nine Years (dead Or Alive)\tColumbia\t40631\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC70648-2.mp3\tJimmie Rodgers\tNinety Nine Years Blues\tVICTOR\t23669\t70648-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_150.mp3\tBen Bernie And His Orchestra Feat. V/frank Sylvano\tNinety-nine Out Of A Hundred (wanna Be Loved)\tBRUNSWICK\t6062\tC7446\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-172-1.mp3\tPierre Allier Et Son Orchestre (with Django Reinhardt)\tNinouche\tSWING\t108\tOSW-172-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480421.mp3\tArt Farmer Quartet\tNita\tContemporary\tC3554\t\t1958\tArt Farmer (tp), Hank Jones (p), Addison Farmer (sb), Roy Haynes (dm)\nhttp://www.jazz-on-line.com/a/mp3c/COL15643.mp3\tBenny Goodman And His Orchestra\tNitwit Serenade\tCOLUMBIA\t2958 D\t15643\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65434.mp3\tBlue Lu Barker & Fly Cats\tNix On Those Lush Heads\tDECCA\t7588\t65434\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC18882.mp3\tLouis Armstrong & His Orch\tNo (papa No)\tVOCALION\t3205\t18882\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69522-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tNo Answer\tDecca\t4141\t69522-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69522.mp3\tAndy Kirk & Clouds Of Joy\tNo Answer (vhenry Wells)\tDECCA\t4141B\t69522\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_204.mp3\tGaylords\tNo Arms Can Ever Hold You\tMercury\t70706\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_165.mp3\tGeorgie Shaw\tNo Arms Can Ever Hold You (like These Arms Of Mine)\tDecca\t29679\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU15150-A.mp3\tWingy Manone & His Orch\tNo Calling Card\tBRUNSWICK\t6911\t15150-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/SIG409.mp3\tLarry Douglas W Ray Bloch 7\tNo Greater Love (there Is)\tSIGNATURE\t15107-A\t409\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC58968.mp3\tJimmie Rodgers\tNo Hard Times - Blue Yodel\tVICTOR\t23751\t58968\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70028x.mp3\tThe Carlisles\tNo Help Wanted\tMERCURY\t70028\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70077x.mp3\tRusty Draper\tNo Help Wanted\tMERCURY\t70077\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_075.mp3\tRusty Draper Feat. David Carroll (director) And Jack Halloran Singers\tNo Help Wanted\tMERCURY\t70077\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102777.mp3\tHartman's Heartbreakers\tNo Hugging Or Kissing\tBLUEBIRD\t6542\t102777\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH0659.mp3\tTed Daffan's Texans\tNo Letter Today\tOKEH\t6706\tH0659\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_102.mp3\tTed Daffan And His Texans Feat. Chuck Keeshan And Leon Seago\tNo Letter Today\tOKEH\t6706\tH0659\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP143x.mp3\tElla Mae Morse\tNo Love, No Nothin'\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC4427-A.mp3\tJohnny Long And His Orchestra\tNo Love, No Nothin'\tDECCA\t4427A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_047.mp3\tJohnny Long And His Orchestra\tNo Love, No Nothin'\tDECCA\t4427A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_184.mp3\tJan Garber And His Orchestra\tNo Love, No Nothin'\tHit\t7070\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC39379-A.mp3\tNew Orleans Rhythm Kings\tNo Lovers Allowed\tDECCA\t401B\t39379-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141207-2.mp3\tEthel Waters And Her Ebony 4\tNo Man's Mama\tCOLUMBIA\t14116 D\tW141207-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_179.mp3\tAmes Brothers, The Feat. Les Brown And His Band Of Renown\tNo Moon At All\tCORAL\t60870\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481774.mp3\tAnita O'day\tNo Moon At All\tVerve\tMGV2000\t2564-10\t1955\tacc. by Milt Bernhart, Lloyd Elliott, Joe Howard, Si Zentner (tb), Paul Smith (p), Barney Kessel (g), Joe Mondragon (sb), Alvin Stoller (dm), Buddy Bregman (arr, dir)\nhttp://www.jazz-on-line.com/a/mp3b/DEC72405-A.mp3\tBillie Holiday\tNo More\tDECCA\t23483\t72405-A\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_128.mp3\tMcguire Sisters\tNo More\tCoral\t61323\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_270.mp3\tDejohn Sisters Feat. D/o.b. Masingill\tNo More\tEpic\t9085\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC349-1-.mp3\tJosh White\tNo More Blues\tASCH\t349-1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14254-1.mp3\tJoe Venuti & His Orchestra\tNo More Love (v Howard Philips)\tBANNER\t32896\t14254-1\t\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN950NM.mp3\tZeb Turner\tNo More Nothin'\tKING\t950\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4843.mp3\tBig Three Trio\tNo More Sweet Potatoes\tCOLUMBIA\t38064\tCCO4843\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS20679.mp3\tArtie Shaw And His Orchestra\tNo More Tears\tBRUNSWICK\t7835\tB-20679-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe404437-A.mp3\tLonnie Johnson\tNo More Troubles Now\tOKeh\t8831\t404437-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe400446-A.mp3\tTexas Alexander\tNo More Women Blues\tOKeh\t8624\t400446-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO27323-A.mp3\tGene Krupa & His Orch\tNo Name Jive\tCOLUMBIA\t37870\tCO27323-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67344.mp3\tGlen Gray Casa Loma Orch\tNo Name Jive\tDECCA\t3089A\t67344\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_073.mp3\tGlen Gray And Casa Loma Orchestra\tNo Name Jive\tDECCA\t3089\t67344\t1940\tFrank Ryerson, Cy Baker, Grady Watts (tp), Billy Rauch, Murray McEachern, Pee Wee Hunt (tb), Glen Gray, Clarence Hutchinrider (cl, as, fl), Kenny Sargent (cl, as), Art Ralston (as, ob, bsn), Danny D'Andrea (as), Pat Davis (cl, ts, fl), Joe Hall (p), Jack Burdette (g), Stanley Dennis (sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3o/DEC67345.mp3\tGlen Gray Casa Loma Orch\tNo Name Jive Part 2\tDECCA\t3089B\t67345\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COL81148-2.mp3\tEddie Cantor\tNo No Nora\tCOLUMBIA\tA-3964\t81148-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBrun.mp3\tLyman's California Orchestra\tNo No Nora\tBrunswick\t\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68895.mp3\tElla Fitzgerald & Her Orch\tNo Nothing\tDECCA\t3754B\t68895\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU2836.mp3\tMarion Harris Acc Piano\tNo One\tBRUNSWICK\t2836\t-\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/Gre3930-A.mp3\tCliff Jackson And His Krazy Kats\tNo One But Betty Brown\tGrey Gull\t1865\t3930-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1073.mp3\tArtie Shaw And His Orchestra\tNo One But You\tRCA\t20-1935\tD5VB1073\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_269.mp3\tCharlie Applewhite Feat. O/jack Pleis\tNo One But You\tDECCA\t29125\t86185\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe402168-B.mp3\tLouis Armstrong Savoy Ballroom\tNo One Else But You\tOKeh\t8669\t402168-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_170.mp3\tPat Boone\tNo Other Arms\tDot\t15422\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/Cap6042.mp3\tJo Stafford\tNo Other Love\tCapitol\t1053\t6042\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_009.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tNo Other Love\tRCA Victor\t5317\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC96501.mp3\tBenny Goodman And His Orchestra\tNo Other One\tVICTOR\t25193\t96501\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC96501.mp3\tBenny Goodman And His Orchestra\tNo Other One\tVICTOR\t25193\t96501\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_351.mp3\tEddie Fisher\tNo Other One\tRCA\t6470\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_079.mp3\tBenny Goodman And His Orchestra Feat. Helen Ward\tNo Other One\tVICTOR\t25193\t96501\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CON17490-2.mp3\tCarter Family\tNo Other's Bride I'll Be\tCONQUEROR\t8733\t17490-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COL77341.mp3\tBert Williams\tNo Place Like Home\tCOLUMBIA\tA-2438\t77341\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_073.mp3\tBert Williams\tNo Place Like Home\tCOLUMBIA\tA-2438\t77341\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19536-1.mp3\tBillie Holiday\tNo Regrets\tARC\tVO3276\t19536-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU102376-1.mp3\tWingy Manone & His Orch\tNo Regrets\tBLUEBIRD\t6473A\t102376-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiARCVO3276.mp3\tBillie Holiday\tNo Regrets\tARC\tVO3276\t19536-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_128.mp3\tBillie Holiday\tNo Regrets\tARC\tVO3276\t19536-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_056.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tNo Regrets\tVICTOR\t25349B\t101262-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101262-1.mp3\tTommy Dorsey & His Orch\tNo Regrets (vj.leonard)\tVICTOR\t25349B\t101262-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/CON19437-4.mp3\tArtie Shaw And His Orchestra\tNo Regrets (vw.vaughn)\tCONQUEROR\t9096\tB-19437-4\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1402-1.mp3\tFrankie Trumbauer Orch\tNo Retard\tVARSITY\t8215\tUS1402-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73642.mp3\tLouis Jordan & His Orch.\tNo Sale\tDECCA\t27898\t73642\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74323.mp3\tElla Fitzgerald\tNo Sense\tDECCA\t24538\t74323\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/Con3007.mp3\tSarah Vaughan With Dizzy Gillespie And His Orchestra\tNo Smoke Blues\tContinental\t6061\t3007\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036945.mp3\tErskine Hawkins & His Orch\tNo Soap\tBLUEBIRD\t10292\t036945\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/RCAE4VH-0796-a.mp3\tDick Collins And The Runaway Herd Formerly Of Woody Herman Orchestra\tNo Soap!\tRCA VICTOR\t547-0460\tE4VH-0796-a\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_123.mp3\tFred Astaire Feat. O/leo Reisman\tNo Strings\tBRUNSWICK\t7486\t17733\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17733-1.mp3\tLeo Reisman & His Orch\tNo Strings (f.astaire)\tARC\tBR7486\t17733-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2518.mp3\tBing Crosby - Victor Young\tNo Te Importe Saber\tDECCA\t3965B\tDLA2518\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404101.mp3\tFred Gardner Texas Troubadors\tNo Trumps\tOKeh\t41458\t404101\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_217.mp3\tDoris Day And Donald O'connor Feat. O/paul Weston\tNo Two People\tCOLUMBIA\t39863\tHCO10273\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU060405.mp3\tErskine Hawkins & His Orch\tNo Use Squawkin'\tBLUEBIRD\t11049\t060405\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1032-3L.mp3\tMerle Travis\tNo Vacancy\tCAPITOL\t258\t1032-3L\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB4379-4.mp3\tBilly Murray\tNo Wedding Bells For Me\tVICTOR\t16130\tB4379-4\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_014.mp3\tBilly Murray\tNo Wedding Bells For Me\tVICTOR\t16130\tB4379-4\t1907\t\nhttp://www.jazz-on-line.com/a/mp3a/PARL1120.mp3\tBumble Bee\tNo Woman No Nickel\tPARAMOUNT\t13109A\tL1120\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/CONWC3025-A.mp3\tHoosier Hot Shots\tNo, No, Nora\tCONQUEROR\t9398\tWC3025-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_011.mp3\tEddie Cantor\tNo, No, Nora\tCOLUMBIA\t3964\t81148-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_018.mp3\tFour Lads\tNo, Not Much!\tColumbia\t40629\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3h/Vic48303-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tNo, Papa, No\tVictor\tLPV-568\t48303-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4561.mp3\tLionel Hampton Sextet\tNo.2 Re Bop And Re Bop\tDECCA\t24430\tL4561\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480750.mp3\tWoody Herman And His Orchestra\tNoah\tCoral\tEC 81015\t71626\t1944\tCappy Lewis, Bob Guyer, Ray Wetzel, Ben Stabler, Nick Travis, tp, Eddie Bert, Al Mastren, Ed Kiefer, tb, Woody Herman, cl, voc, Johnny Bothwell, Chuck Di Maggio, as, Allen Eager, Pete Mondello, Ben Webster, ts, Skippy De Sair, bs, Ralph Burns, p, Hy White, g, Chubby Jackson, b, Cliff Leeman, d\nhttp://www.jazz-on-line.com/a/mp3a/COL03423-2.mp3\tBert Williams W Orch\tNobody\tCOLUMBIA\tA-0302\t03423-2\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_043.mp3\tBert Williams\tNobody\tColumbia\tA3423\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA3423.mp3\tBert Williams\tNobody\tColumbia\tA3423\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93543.mp3\tRed Foley\tNobody\tDECCA\t5981\tC93543\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_013.mp3\tArthur Collins\tNobody\tVICTOR\t4391\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR143446-2.mp3\tUniversity Six\tNobody But (my Baby Is Getting My Love)\tHARMONY\t382-H\t143446-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1454.mp3\tLuois Jordan Tympany 5\tNobody But Me\tV-DISC\t273B\t1454\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1451.mp3\tLouis Jordan's Tympani Five\tNobody But Me\tV-DISC\t513\t1451\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe80362-C.mp3\tClarence Williams Washboard Four\tNobody But My Baby Is Getting My Love\tOKeh\t8440\t80362-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148503.mp3\tFred Rich & His Orch\tNobody But You\tCOLUMBIA\t1838\tW148503\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148503.mp3\tFred Rich & His Orch\tNobody But You (vrollickers)\tCOLUMBIA\t1838 D\tW148503\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401952-C.mp3\tFrankie Trumbauer & His Orch\tNobody But You (vsb)\tOKeh\t41252\t401952-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_0707_02.mp3\tLee Morse And Her Bluegrass Boys\tNobody Cares If I'm Blue (from 'bright Lights')\tColumbia\t2248DB\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC311.mp3\tJoe Turner\tNobody In Mind\tNATIONAL\t\tNSC311\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69523.mp3\tBig Joe Turner\tNobody In Mind\tDECCA\t7868\t69523\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC7868.mp3\tJoe Turner\tNobody In Mind\tDECCA\t7868\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL81095-2.mp3\tBessie Smith\tNobody In Town Can Bake A Jelly Roll Like My Man\tCOLUMBIA\tA-3942\t81095-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74025.mp3\tEddie Condon & His Orchestra\tNobody Knows\tDECCA\t24217A\t74025\t1947\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2795.mp3\tIrving & Jack Kaufman\tNobody Knows (and Nobody Seems To Care)\tColumbia\tA2795\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3b/Col145534-3.mp3\tJohnny Thompson (andy Razaf)\tNobody Knows (how Much I Love You)\tColumbia\t14285-D\t145534-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE30538.mp3\tRed Nichols & His 5 Pennies\tNobody Knows (v S L)\tBRUNSWICK\t6832\tE30538\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/GenX-71-A.mp3\tAlta Browne And Bertha Powell\tNobody Knows De Trouble I See\tGennett\t3318\tX-71-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D364A.mp3\tCharlie Barnet And His Orchestra (kay Starr Voc)\tNobody Knows The Trouble I'v Seen\tV-DISC\t364A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63984.mp3\tLouis Armstrong Decca Mixed Ch\tNobody Knows The Trouble I've Seen\tDECCA\t2085B\t63984-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2509.mp3\tJack Teagarden & His Orch\tNobody Knows The Trouble I've Seen\tDECCA\t4317A\tDLA2509\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COL25710.mp3\tMildred Bailey W Alec Wilder\tNobody Knows The Trouble I've Seen\tCOLUMBIA\t35348\t25710\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D364.mp3\tCharlie Barnet And His Orch\tNobody Knows The Trouble I've Seen\tV-DISC\t364\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_163.mp3\tMarian Anderson\tNobody Knows The Trouble I've Seen\tVictor\t19560\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC051225-1.mp3\tSidney Bechet New Orleans Fw\tNobody Knows The Way I Feel Dis Mornin'\tVICTOR\t26663B\t051225-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/GENG09246.mp3\tJosephine Beatty (a.hunter)\tNobody Knows The Way I Feel Dis Morning (vah)\tGENNETT\t5626\t09246\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COL140201.mp3\tVaughn Deleath\tNobody Knows What A Red-head Mama Can Do\tCOLUMBIA\t271D\t140201\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5766-1-2.mp3\tCalifornia Ramblers\tNobody Knows What A Red-head Mama Can Do\tBANNER\t1459\t5766-1-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148534-3.mp3\tBessie Smith\tNobody Knows You When You're Down And Out\tCOLUMBIA\t14451-D\tW148534-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4687.mp3\tEddie Condon & His Band\tNobody Knows You When You're Down And Out\tCOMMODORE\t603\t4687\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColD-14451.mp3\tBessie Smith\tNobody Knows You When You're Down And Out\tColumbia\tD-14451\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_184.mp3\tBessie Smith\tNobody Knows You When You're Down And Out\tCOLUMBIA\t37577\t21842\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWC-2596-C.mp3\tCount Basie And His Orchestra\tNobody Knows You When You're Down And Out\tVocalion\t5169\tWC-2596-C  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80376-3.mp3\tMarion Harris\tNobody Lied\tCOLUMBIA\tA-3646\t80376-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_037.mp3\tMarion Harris\tNobody Lied (when They Said I Cried Over You)\tCOLUMBIA\tA-3646\t80376-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC18913-A.mp3\tThe Virginians\tNobody Lied (when They Said That I Cired Over You)\tVICTOR\t18913\t18913-A\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW140857-3.mp3\tBessie Smith And Her Band\tNobody's Blues But Mine\tCOLUMBIA\t14098 D\tW140857-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_158.mp3\tDinah Shore\tNobody's Chasing Me\tRCA\t20-3978\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9494.mp3\tJimmie Davis\tNobody's Darlin' But Mine\tDECCA\t5090B\tC9494\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2844.mp3\tBing Crosby - V.young Orch\tNobody's Darlin' But Mine\tDECCA\t18391B\tDLA2844\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_340.mp3\tJimmie Davis\tNobody's Darling But Mine\tDECCA\t1504\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_006.mp3\tByron G. Harlan\tNobody's Little Girl\tVICTOR\t5147\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW141410-1.mp3\tFletcher Henderson & His Orch\tNobody's Rose\tCOLUMBIA\t532 D\tW141410-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/Col141410-1.mp3\tFletcher Henderson And His Orchestra\tNobody's Rose\tColumbia\t532-D\t141410-1  \t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149123.mp3\tPaul Whiteman And His Orchestra\tNobody's Sweetheart\tCOLUMBIA\t2098 D\tW149123\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe82082.mp3\tMckenzie & Condon Chicagoans\tNobody's Sweetheart\tOKeh\t40971\t82082\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE37288-A.mp3\tMills Bros\tNobody's Sweetheart\tBRUNSWICK\t6197\tE37288-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE35881-A.mp3\tCab Calloway & His Orch\tNobody's Sweetheart\tBRUNSWICK\t6105\tE35881-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT639.mp3\tJohnny Guarnieri Trio\tNobody's Sweetheart\tMAJESTIC\t1032\tT639\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE26749.mp3\tRed Nichols & His Orch\tNobody's Sweetheart\tBRUNSWICK\t3854\tE26749\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66073-A.mp3\tEddie Condon's Chicagoans\tNobody's Sweetheart\tDECCA\t18040A\t66073-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC57-58.mp3\tIsham Jones & His Orch\tNobody's Sweetheart\tBRUNSWICK\t2578\tC57-58\t1924\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN9299-1.mp3\tAdrian Schubert And His Orchestra\tNobody's Sweetheart\tBANNER\t0598\t9299-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/CRO1296-2.mp3\tEubie Blake And His Orchestra\tNobody's Sweetheart\tCROWN\t3130\t1296-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOut.mp3\tTampa Red\tNobody's Sweetheart\tOut The Blues\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_018.mp3\tPaul Whiteman And His Orchestra\tNobody's Sweetheart\tCOLUMBIA\t2098 D\tW149123\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_157.mp3\tCab Calloway And His Orchestra\tNobody's Sweetheart\tBrunswick\t6205\tE-35881-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC5031.mp3\tRay Miller And His Orch\tNobody's Using It Now\tBRUNSWICK\t4687\tC5031\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC4780.mp3\tMarion Harris\tNobody's Using It Now\tBRUNSWICK\t4663\tC4780\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_210.mp3\tMarion Harris\tNobody's Using It Now\tBRUNSWICK\t4663\tC4780\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400223-B.mp3\tMississippi John Hurt\tNobodys Dirty Business\tOKeh\t8560\t400223-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/HARH-3001-B.mp3\tJuan Vicari Y Su Genial Orquest\tNoche De Ronda\tHarmonia\tH-3001-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCWC2782.mp3\tJohn Kirby & His Orchestra\tNocturne\tVOCALION\t5520\tWC2782\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC067737.mp3\tArtie Shaw And His Orchestra\tNocturne\tVICTOR\t27703\t067737-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/DecB-13257-A.mp3\tSpike Hughes And His Negro Orchestra With Benny Carter\tNocturne\tDecca \tF-3563\tB-13257-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D228A2.mp3\tArtur Rubinstein\tNocturne In F Sharp Major (chopin)\tV-DISC\t228A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-140-1.mp3\tNol Chiboust Et Son Orchestre (with Django Reinhardt)\tNol Blues\tSWING\t97\tOSW-140-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA1029.mp3\tAndy Iona's Novelty Four\tNohea I Muolau Lani\tCOLUMBIA\t3056 D\tLA1029\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1014x.mp3\tLes Paul\tNola\tCAPITOL\t1014\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21100-B.mp3\tRevelers\tNola\tVICTOR\t21100B\t40597-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07808.mp3\tTommy Dorsey & His Orch\tNola\tVICTOR\t25570\t07808\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70103.mp3\tLionel Hampton & His Orch.\tNola\tDECCA\t18285A\t70103\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI8386.mp3\tVincent Lopez And His Orch\tNola\tEDISON\t50960\t8386\t1922\t\nhttp://www.jazz-on-line.com/a/mp3r/RiEDI50960.mp3\tVincent Lopez And His Orch\tNola\tEDISON -\t50960\t8386\t1922\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC60931-A.mp3\tIsham Jones's Juniors\tNola\tDecca\t834 A\t60931-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_088.mp3\tLes Paul\tNola\tCapitol\t1014\t5860\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70103-A.mp3\tLionel Hampton And His Orchestra\tNola\tDecca\t18285\t70103-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_062.mp3\tTommy Dorsey And His Orchestra\tNola\tVICTOR\t25570\t07808\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDLA1053.mp3\tEddie Dunstedter At The Hammond Electric Organ\tNola\tDECCA\t1572-B\tDLA 1053\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-7875-B.mp3\tArtie Shaw And His Orchestra\tNon Stop Flight\tBLUEBIRD\tB-7875\t027230-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057365-1.mp3\tErskine Hawkins & His Orch\tNona\tBLUEBIRD\t10979\t057365-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_148.mp3\tErskine Hawkins And His Orchestra\tNona\tBluebird\t10979\t057365-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS-3.mp3\tJess Stacy & His Stars\tNoni\tVARSITY\t8076\tUS-3\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_204.mp3\tPerry Como Feat. O/mitchell Ayres, V/the Fontane Sisters\tNoodlin' Rag\tRCA Victor\t4542\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_115.mp3\tBlanche Ring\tNora Malone\tVICTOR\t60024\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057363-1.mp3\tErskine Hawkins & His Orch\tNorfolk Ferry\tBLUEBIRD\t10932\t057363-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28865.mp3\tCab Calloway & His Orch\tNorth Of The Mohawk Trail\tOKEH\t5911\t28865\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN9557.mp3\tAlabama Sacred Harp Singers\tNorth Port (vlee Wells)\tBANNER\t714\t9557\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO34371.mp3\tWoody Herman & His Herd\tNorthwest Passage\tCOLUMBIA\t36835\tCO34371\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3483.mp3\tFats Navarro\tNostalgia\tSAVOY\t955\tS3483\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/ColCO-31945-2.mp3\tBenny Goodman And His Orchestra\tNot A Care In The World\tColumbia\tGL-523\tCO-31945-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC5742.mp3\tIsham Jones And His Orch\tNot A Cloud In The Sky\tBRUNSWICK\t4826\tC5742\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_283.mp3\tTony Bennett With Percy Faith And His Orch.\tNot As A Stranger\tCOLUMBIA\t40311\tCO51431\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03489-1.mp3\tBilly Murray (tenor)\tNot Because Your Hair Is Curly\tCOLUMBIA\tA-0875\t03489-1\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_042.mp3\tBilly Murray\tNot Because Your Hair Is Curly\tVICTOR\t16251\tB3787-2\t1906\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC78262-1.mp3\tRoy Bargy And Ramona\tNot For All The Rice In China\tVICTOR\t24445\t78262-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80191-1.mp3\tBert Williams\tNot Lately\tCOLUMBIA\tA-3589\t80191-1\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_050.mp3\tBert Williams\tNot Lately\tCOLUMBIA\tA-3589\t80191-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO31944-1.mp3\tBenny Goodman And His Orchestra\tNot Mine\tCOLUMBIA\t36580\tCO31944-1\t1941\tVocal Chorus by Art London\nhttp://www.jazz-on-line.com/a/mp3c/VIC071702.mp3\tArtie Shaw And His Orchestra\tNot Mine\tVICTOR\t27779\t071702-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_233.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberly And Helen O'connell\tNot Mine\tDECCA\t4122B\t70025\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1407-1.mp3\tFrankie Trumbauer Orch\tNot On The First Night, Babe\tVARSITY\t8225\tUS1407-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_274.mp3\tJaye P. Morgan\tNot One Goodbye\tRCA Victor\t6329\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1898.mp3\tWillie Smith Quintet\tNot So Bop Blues\tMERCURY\t8103\t1898\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D220B2.mp3\tTommy Dorsey And His Orchestra\tNot So Quiet Please\tV-DISC\t220B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC072111-4.mp3\tTommy Dorsey & His Orch\tNot So Quiet, Please\tVICTOR\t27869\t072111-4\t1942\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD9VB1849.mp3\tRose Murphy (the Chee-chee Girl)\tNot Tonight\tVictor\t\tD9VB1849\t1949\t\nhttp://www.jazz-on-line.com/a/mp3l/Col80745-4.mp3\tThe Georgians\tNothin' But\tColumbia\tA-3804\t80745-4\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU89794-1.mp3\tGene Gifford & His Orch\tNothin' But The Blues\tBLUEBIRD\t10704\t89794-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75678.mp3\tArtie Shaw And His Gramercy Five\tNothin' From Nothin'\tDECCA\t24870\t75678\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S3113.mp3\tBob Wills Texas Playboys\tNothing But Trouble\tMGM\t10491\t49S3113\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN4432.mp3\tLonnie Johnson\tNothing But Trouble\tKING\t4432\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_380.mp3\tNat ''king'' Cole\tNothing Ever Changes My Love For You\tCapitol\t3328\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3167-A.mp3\tMemphis Minnie\tNothing In Ramblin'\tOKEH\t5670\tWC3167-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_074.mp3\tWill Denny\tNothing Like That In Our Family\tCOLUMBIA\t3368\t03368-3\t1906\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63786.mp3\tLouis Prima's New Orleans Gang\tNothing's Too Good For You\tDECCA\t1871B\t63786\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_353b.mp3\tGuy Lombardo And His Royal Canadians\tNotre Dame Medley\tDecca\t3368.\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481511.mp3\tCharles Mingus Sextet\tNouroog\tBethlehem\tBCP6026\t\t1957\tClarence ?Gene? Shaw, Bill Hardman (tp), Jim Knepper (tb), Curtis Porter (as, ts), Horace Parlan (p), Charles Mingus (sb), Dannie Richmond (dm)\nhttp://www.78-tours.net/mp3/PATN202551.mp3\tConcert Acc. Du Jeffry's Jazz Max Rog De L'empire\tNouveau Bonheur, Du Film \" La Grande Mare \"\tPATH\tX. 3874\tN 202551 Salabert\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Pol2426hpp.mp3\tDjango Reinhardt\tNovel Pets\tPolydor\tF-512738\t2426hpp\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU48872-1.mp3\tRichard M Jones Jazz Wizards\tNovelty Blues\tBLUEBIRD\t6627\t48872-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN2622.mp3\tHank Penny\tNow Ain't You Glad\tKING\t2622\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1640.mp3\tLouis Prima New Orleans Gang\tNow And Then\tDECCA\t2279B\tDLA1640\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_120.mp3\tBen Selvin And His Orchestra\tNow And Then\tEmerson\t10315\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/HITCR353.mp3\tCootie Williams & His Orch\tNow I Know (v Pearl Bailey)\tHIT OF THE WEEK\t7075\tCR353\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU054675-1.mp3\tUna Mae Carlisle\tNow I Lay Me Down To Dream\tBLUEBIRD\t10853\t054675-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC054652.mp3\tLeo Reisman & His Orch\tNow I Lay Me Down To Dream\tVICTOR\t26718\t054652\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_208.mp3\tGuy Lombardo And His Royal Canadians\tNow I Lay Me Down To Dream\tDecca\t3330\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_187.mp3\tBob Chester And His Orchestra Feat. V/dolores O'neill\tNow I Lay Me Down To Dream\tBLUEBIRD\t10821\t051845\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67917-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tNow I Lay Me Down To Dream\tDecca\t3306\t67917-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1864-1.mp3\tJack Teagarden & Ho\tNow I Lay Me Down To Dream (v D A)\tVARSITY\t8374\tUS1864-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2574.mp3\tTed Daffan's Texans\tNow I Must Reap\tCOLUMBIA\t20506\tHCO2574\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC89576.mp3\tPaul Whiteman And His Orch\tNow I'm A Lady\tVICTOR\t25022\t89576\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148702-6.mp3\tRuth Etting\tNow I'm In Love\tCOLUMBIA\t1883 D\tW148702-6\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15024y.mp3\tMargaret Whiting\tNow Is The Hour\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4541.mp3\tBing Crosby And Ken Darby Choir\tNow Is The Hour\tDECCA\t24279\tL4541\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/MAJT1375.mp3\tEddy Howard And His Orchestra\tNow Is The Hour\tMAJESTIC\t1191\tT1375\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38686.mp3\tBuddy Clark & Charioteers\tNow Is The Hour\tCOLUMBIA\t38115\tCO38686\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/LON110x.mp3\tGrace Fields\tNow Is The Hour\tLONDON\t110\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_058.mp3\tEddy Howard And His Orchestra\tNow Is The Hour\tMAJESTIC\t1191\tT1375\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_100.mp3\tKate Smith\tNow Is The Hour\tMGM\t10125A\t47S418\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_326.mp3\tGale Storm\tNow Is The Hour\tDot\t15492\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_024.mp3\tGracie Fields Feat. Phil Green's Orchestra\tNow Is The Hour\tLONDON\t110\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_053.mp3\tBuddy Clark Feat. The Charioteers\tNow Is The Hour (maori Farewell Song)\tCOLUMBIA\t38115\tCO38686\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC023209.mp3\tTommy Dorsey & His Orch\tNow It Can Be Told\tVICTOR\t25856\t023209\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23305-1.mp3\tTeddy Wilson & His Orch\tNow It Can Be Told\tCBS\tBR8199\t23305-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1294.mp3\tBing Crosby - J.s.trotter\tNow It Can Be Told\tDECCA\t1888A\tDLA1294\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23299-1.mp3\tMildred Bailey & Her Orchestra\tNow It Can Be Told\tVOCALION\t4282\t23299-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_033.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tNow It Can Be Told\tVICTOR\t25856\t023209\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23305-1.mp3\tTeddy Wilson And His Orchestra\tNow It Can Be Told\tBrunswick\t8199\tB-23305-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75344.mp3\tBillie Holiday / Sy Oliver\tNow Or Never\tDECCA\t24947\t75344\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3668.mp3\tDoris Day\tNow That I Need You\tCOLUMBIA\t38507\tHCO3668\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU62928-2.mp3\tBennie Moten Kansas City Orch\tNow That I Need You\tBLUEBIRD\t6711\t62928-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_188.mp3\tFrankie Laine\tNow That I Need You\tMERCURY\t5311\t2742\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_186.mp3\tDoris Day Feat. John Rarig's Orchestra\tNow That I Need You\tCOLUMBIA\t38507\tHCO3668\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151791-1.mp3\tJoe Venuti's Rhythm Boys\tNow That I Need You, You're Gone\tCOLUMBIA\t2535 D\tW151791-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_149.mp3\tPatti Page\tNow That I'm In Love\tMERCURY\t70127\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU20093-1.mp3\tMildred Bailey W Red Norvo\tNow That Summers Gone\tBRUNSWICK\t7767\t20093-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151762-1.mp3\tRuth Etting\tNow That You're Gone\tCOLUMBIA\t2529\tW151762-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUE37281.mp3\tBing Crosby\tNow That You're Gone\tBRUNSWICK\t6200\tE37281\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_147.mp3\tRuth Etting\tNow That You're Gone\tColumbia\t2529\tW151762-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151759-3.mp3\tGuy Lombardo Royal Canadians\tNow That You're Gone (vcl)\tCOLUMBIA\t2528 D\tW151759-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC064056.mp3\tLionel Hampton & His Orch\tNow That You're Mine\tVICTOR\t27529\t064056\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic064056-1.mp3\tLionel Hampton And His Sextet\tNow That You're Mine\tVictor\t27529\t064056-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22281-2.mp3\tBillie Holiday\tNow They Call It Swing\tCBS\tVO3947\t22281-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63166.mp3\tLouis Prima New Orleans Gang\tNow They Call It Swing\tDECCA\t1674\t63166\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC049688.mp3\tArtie Shaw And His Orchestra\tNow We Know\tVICTOR\t26642\t049688-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic49688.mp3\tArtie Shaw And His Orchestra\tNow We Know ? V M T\tVictor\t26642\t49688\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_466.mp3\tBing Crosby And Louis Armstrong\tNow You Has Jazz\tCapitol\t3506\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043989.mp3\tCharlie Barnet & His Orch\tNow You Know (v M A M)\tBLUEBIRD\t10549\t043989\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73751.mp3\tAndy Kirk\tNow You Tell Me\tDECCA\t23959\t73751\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73751.mp3\tAndy Kirk And His Orchestra\tNow You Tell Me\tDecca\t23959\t73751\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP4102-2.mp3\tBlue Lu Barker\tNow You're Down In The Alley\tCAPITOL\t\t4102-2\t\t\nhttp://www.jazz-on-line.com/a/mp3h/ARC12054-1.mp3\tDan Ritchie And His Orchestra\tNow You've Got Me Worryin' For You\tARC\tBA32512\t12054-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_124.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tNow You've Got Me Worryin' For You\tCOLUMBIA\t2680 D\tW152234\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS5851-4.mp3\tCharlie Parker Bee Boppers\tNow's The Time\tSAVOY\t573B\tS5851-4\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/GUIG618.mp3\tCozy Cole & His Quintet\tNow's The Time\tGUILDE\t130\tG618\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480452.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tNow's The Time\tRCA\t430043\t\t1958\tArt Blakey, D, Benny Golson, Ts, Lee Morgan, T,: Jymie Merritt, B, Bobby Timmons, P\nhttp://www.jazz-on-line.com/a/mp3c/VIC70951-2.mp3\tGene Kardos & His Orch\tNow's The Time To Fall In Love (v D R)\tVICTOR\t22865\t70951-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82320.mp3\tElla Fitzgerald\tNowhere Guy\tDECCA\t28707\t82320\t\t\nhttp://www.jazz-on-line.com/a/mp3d/LVSTLA-1587.mp3\tDjango Reinhardt\tNuages\tLVSM\t7EMF 310\tTLA-1587\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16219.mp3\tDjango Reinhardt - Stan Brenders Et Son Grand Orchestre De Danse\tNuages\tRythme\tD5000\t16219\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-146-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tNuages\tSWING\t88\tOSW-146-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDR-10028-1.mp3\tThe Quintet Of The Hot Club Of France (with Django Reinhardt)\tNuages\tDECCA\tF8604\tDR-10028-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-127-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tNuages\tSWING\t\tOSW-127-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_479.mp3\tLes Paul And Mary Ford\tNuevo Laredo\tCapitol\t3329\t\t1956\t\nhttp://www.78-tours.net/mp3/PAT203214.mp3\tMistinguett Avec Quatuor Vocal Acc. Du Melodic-jazz Du Casino De Paris\tNuit De Paris (rio De Janeiro)\tPATH\tX. 94100\t203214 Salabert\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49762-2.mp3\tFats Waller (piano)\tNumb Fumblin'\tVICTOR\t38508\t49762-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU047058-1.mp3\tEarl Hines And His Orchestra\tNumber 19\tBLUEBIRD\tB-10674\t047058-1\t1940\tWalter Fuller (tp,vcl) Milton Fletcher, Edward Sims (tp) George Dixon (tp,as) Edward Burke, John Ewing, Joe McLewis (tb) Omer Simeon (cl,bar) Leroy Harris (as,vcl) Jimmy Mundy, Robert Crowder (ts,arr) Earl Hines (p,dir,arr) Claude Robertson (g) Quinn Wilson (b,arr) Alvin Burroughs (d) Billy Eckstine (vcl) George Dixon (speech-1)\nhttp://www.jazz-on-line.com/a/mp3w/1955_238b.mp3\tBob Corley\tNumber One Street (sides 1 & 2)\tStars\t4773\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP4724.mp3\tSugar Chile Robinson\tNumbers Boogie\tCAPITOL\t\t4724\t\t\nhttp://www.jazz-on-line.com/a/mp3h/RENR-166-1.mp3\tB. Bumble And The Stingers Al Hazan, Rene Hall And Friends\tNut Rocker\tRENDEZVOUS\tR-166-1\t\t1962\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU040056.mp3\tCats And The Fiddle\tNuts To You\tBLUEBIRD\t8216\t040056\t1939\t\nhttp://www.jazz-on-line.com/mp3/654036402.mp3\tArt Mooney And His Orchestra\tNuttin' For Christmas\tMGM\t12092\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_182.mp3\tFontane Sisters\tNuttin' For Christmas\tDot\t15434\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_150.mp3\tJoe Ward\tNuttin' For Christmas\tKing\t4854\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_193.mp3\tStan Freberg\tNuttin' For Christmas\tCapitol\t3280\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIX2SW-262-1.mp3\tDjango's Music\tNymphas\tSWING\tX186\tX2SW-262-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78025-3.mp3\tBert Williams\tO Death, Where Is Thy Sting?\tCOLUMBIA\tA2652\t78025-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3b/MER8965ob.mp3\tCharlie Ventura & His Orch\tO H Blues\tMERCURY\t8965\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_047.mp3\tVincent Lopez And His Orchestra\tO Katharina!\tOkeh\t40307\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_100.mp3\tRay Anthony\tO Mein Papa (oh! My Papa)\tCapitol\t2678\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480883.mp3\tCarmen Miranda And The Bando Da Lua\tO Que E Que A Bahiana Tem\tDECCA\t23131-B\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic501A.mp3\tEnrico Caruso\tO Solo Mio\tVictrola\t501A\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1584.mp3\tAugie Goupil's Royal Tahitians\tO Tahiti\tDECCA\t2252A\tDLA1584\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/EDI5039-A.mp3\tAda Jones - O\tO'brien Is Tryin' To Learn To Talk Hawaiian (rennie Cormack - Al Dubin)\tEDISON\tBA 3037\t5039-A\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31911.mp3\tLouisiana Rhythm Kings\tO'er The Billowy Sea\tBRUNSWICK\t4908\tE31911\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-31911.mp3\tLouisiana Rhythm Kings\tO'er The Billowy Sea\tBrunswick\t4908\tE-31911\t1930\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81459-3.mp3\tThe Georgians\tO-gee, Georgie!\tColumbia\t56-D\t81459-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67783-A.mp3\tBenny Carter And His Orchestra\tO. K. For Baby\tDECCA\t3294B\t67783-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP341x.mp3\tJack Guthrie\tOakie Boogie\tCAPITOL\t341\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_203.mp3\tElla Mae Morse\tOakie Boogie\tCapitol\t2072\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU073439.mp3\tTony Pastor & His Orch\tObey Your Air Raid Warden\tBLUEBIRD\t11525\t073439\t1942\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-16739.mp3\tTed Heath And His Music\tObsession\tDECCA-LONDON\tEFF.54-1 (BEP 6027) \tDR-16739\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB5822.mp3\tRay Noble & His Orch\tOceans Of Time\tVICTOR\t24603\tOB5822\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC062858.mp3\tWingy Manone & His Orch\tOchi Chornya\tVICTOR\t29916\t062858\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COR60609x.mp3\tModernaires\tOctober 32nd, 1992\tCoral\t60609\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38681.mp3\tFrankie Carle\tOctober Twilight\tCOLUMBIA\t38291\tCO38681\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1333-1.mp3\tGene Ammons & His Orchestra\tOdd-en-dow\tMERCURY\t8080\t1333-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI10320.mp3\tBilly Jones\tOf All My Wifes Relations\tEDISON\t51547\t10320\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COM4700.mp3\tEddie Condon & His Band\tOf All The Wrongs You've Done To Me\tCOMMODORE\t551\t4700\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC11189.mp3\tAbe Lyman & His Californians\tOf Thee I Sing\tARC\tBr20103\t11189\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65954.mp3\tLouis Prima's New Orleans Gang\tOf Thee I Sing\tDECCA\t2749A\t65954\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_198.mp3\tFour Aces Featuring Al Alberts\tOf This I'm Sure\tDecca\t29725\t88778\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE1VB2934.mp3\tGene Krupa & His Orchestra\tOff And On\tRCA\t20-4234\tE1VB2934\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_107.mp3\tLeo Diamond\tOff Shore\tAmbassador\t1005\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480884.mp3\tRichard Hayman, His Harmonica And Orchestra\tOff Shore\tMERCURY\t70252\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC3900.mp3\tJimmie Noone Apex Club Orch\tOff Time\tVOCALION\t15819B\tC3900\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP2828.mp3\tFletcher Henderson & His Orch\tOff To Buffalo\tPARAMOUNT\t12486\tP2828\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CON30922.mp3\tHank Penny's Radio Cowboys\tOff To Honolulu\tCONQUEROR\t9847\t30922\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC29886.mp3\tBilly Murray\tOfficer Kelly\tVICTOR\t19366\t29886\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO885.mp3\tCab Calloway & His Orch\tOgeechee River Lullaby\tCOLUMBIA\t36662\tHCO885\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_110.mp3\tCab Calloway And His Orchestra\tOgeechee River Lullaby\tCOLUMBIA\t36662\tHCO885\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042174.mp3\tCharlie Barnet & His Orch\tOguon Badagris\tBLUEBIRD\t10530\t042174\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2442x.mp3\tPee Wee Hunt\tOh\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78826-4.mp3\tTed Lewis & His Band\tOh\tCOLUMBIA\tA-2844\t78826-4\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1278x.mp3\tKay Starr\tOh Babe\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO44431.mp3\tBenny Goodman W A.godfrey\tOh Babe\tCOLUMBIA\t39045\tCO44431\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DECLA5880.mp3\tLionel Hampton & His Orch\tOh Babe\tDECCA\t27305\tLA5880\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18740.mp3\tDuke Ellington's Orch\tOh Babe Maybe Someday\tARC\tBR7667\t18740\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_205.mp3\tAmes Brothers, The Feat. Roy Ross Orchestra\tOh Babe!\tCORAL\t60327\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/KinK-5979.mp3\tLucky Millinder And His Orchestra\tOh Babe!\tKing\t4418\tK-5979  \t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5880.mp3\tLionel Hampton And His Orchestra\tOh Babe!\tDecca\t27305\tLA-5880\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_115.mp3\tDuke Ellington And His Famous Orchestra\tOh Babe! Maybe Someday\tBRUNSWICK\t7667\t18740-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-18740-1.mp3\tDuke Ellington And His Famous Orchestra\tOh Babe! Maybe Someday\tBrunswick\t7667\tB-18740-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44359.mp3\tBobby Hackett\tOh Baby\tCOLUMBIA\t39022\tCO44359\t\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN11852.mp3\tWolverine Orchestra\tOh Baby\tGENNETT\t5453\t11852\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC39999-A.mp3\tJimmie Lunceford And His Orchestra\tOh Boy\tDECCA\t628B\t39999-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0800_05.mp3\tLee Morse\tOh Boy What A Girl\tPathe\t25158A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_103.mp3\tEddie Cantor\tOh Boy! What A Girl\tCOLUMBIA\t457\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67634.mp3\tLouis Jordan & His Tympani 5\tOh Boy, I'm In The Groove\tDECCA\t3360B\t67634\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-2964-A.mp3\tFletcher Henderson Conducts Horace Henderson And His Orchestra\tOh Boy, I'm In The Groove\tOKEH\t5433\tWC-2964-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79089.mp3\tFrank Crumit\tOh By Jingo\tCOLUMBIA\tA-2935\t79089\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU13204-A.mp3\tThree Keys\tOh By Jingo\tBRUNSWICK\t6567\t13204-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-2935.mp3\tFrank Crumit\tOh By Jingo\tCOLUMBIA-\tA-2935\t79089\t1920\t\nhttp://www.jazz-on-line.com/a/mp3e/MED41110-1.mp3\tBilly Murray\tOh By Jingo!\tMEDALLION\t8179\t41110-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI3900.mp3\tElizabeth Spencer - Knickerbocker Quartette - O\tOh Canada! Beloved Country (calixa Lavalle - Adolphe Routhier)\tEDISON\t80249\t3900\t\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO69x.mp3\tTurk Murphy's Jazz Band\tOh Daddy\tGood Time Jazz\t69\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80953-2.mp3\tBessie Smith\tOh Daddy Blues\tCOLUMBIA\tA-3888\t80953-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047642.mp3\tByron Parker Mountaineers\tOh Darling Come Back\tBLUEBIRD\t8551\t047642\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62911-2.mp3\tBennie Moten Kansas City Orch\tOh Eddie\tVICTOR\t22958\t62911-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5526-1-2-3.mp3\tFletcher Henderson & His Orch\tOh Eva (ain't You Comin' Out Tonight?)\tBANNER\t1375\t5526-1-2-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC22117-3.mp3\tArthur Fields\tOh Frenchy\tVICTOR\t18489\t22117-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D359B2.mp3\tFats Waller And His Rhythm\tOh Frenchy\tV-DISC\t359B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72658.mp3\tJimmie Lunceford And His Orchestra\tOh Gee, Oh Gosh\tDecca\t\t72658\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_136.mp3\tErnest Hare And Billy Jones\tOh Gee, Oh Gosh, Oh Golly (i'm In Love)\tEdison\t51193\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC28635-4.mp3\tJan Garber And His Orch\tOh Gee, Oh Gosh, Oh Golly I'm In Love\tVICTOR\t19164\t28635-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/VOC11617.mp3\tErnest Hare And Billy Jones\tOh Gee, Oh Gosh, Oh! Golly\tVOCALION\t14644A\t11617\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/GEN8518-A.mp3\tArthur Hall\tOh How I Hate To Get Up In\tGennett\t8518-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22118-2.mp3\tArthur Fields\tOh How I Hate To Get Up In The Morning\tVICTOR\t18489\t22118-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021141.mp3\tTommy Dorsey & His Orch\tOh How I Hate To Get Up In The Morning\tVICTOR\t25824\t021141\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_063.mp3\tNora Bayes Feat. O/ Charles Prince\tOh How I Laugh When I Think That I Cried Over You\tCOLUMBIA\t2852\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_281.mp3\tGloria Hart\tOh How I Love You\tMERCURY\t5881\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC32714-4.mp3\tBenson Orchestra Of Chicago\tOh How I Miss You Tonight\tVICTOR\t19685A\t32714-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_134.mp3\tIrving Kaufman\tOh How I Miss You Tonight\tVocalion\t15023\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_082.mp3\tLewis James\tOh How I Miss You Tonight\tVictor\t19623\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_034.mp3\tHenry Burr\tOh How I Wish I Could Sleep Until My Daddy Comes Back Home\tColumbia\t2656\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3r/RiPat36564.mp3\tThe Virginia Creepers\tOh How She Could Play The Ukulele\tPath\t36564\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20478o.mp3\tJohnny Marvin\tOh How She Could Play The Ukulele\tVictor\t20478\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC18061-2.mp3\tArthur Collins-byron Harlan\tOh How She Could Yacki Hacki Wicki Wacki Woo\tVICTOR\t18110A\t18061-2\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC19378-2.mp3\tAmerican Qt\tOh Johnny Oh Johnny\tVICTOR\t18279\t19378-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA1790-A.mp3\tOrrin Tucker And His Orch\tOh Johnny, Oh Johnny, Oh\tCOLUMBIA\t35228\tLA1790-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL35228.mp3\tOrrin Tucker & His Orch\tOh Johnny, Oh Johnny, Oh\tCOLUMBIA\t35228\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043392.mp3\tGlenn Miller & His Orch\tOh Johnny, Oh Johnny, Oh (vmh)\tBLUEBIRD\t10507\t043392\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66498-A.mp3\tAndrews Sisters\tOh Johnny, Oh Johnny, Oh!\tDECCA\t2840A\t66498-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_009.mp3\tAmerican Quartet\tOh Johnny, Oh Johnny, Oh!\tVictor\t18279\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79104-2.mp3\tMarion Harris\tOh Judge He Treats Me Mean\tCOLUMBIA\tA-2968\t79104-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47293.mp3\tErroll Garner Trio\tOh Lady Be Good\tCOLUMBIA\t39713\tCO47293\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72933-A.mp3\tEddie Condon & His Orch\tOh Lady Be Good\tDECCA\t23431\t72933-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_149.mp3\tCliff Edwards\tOh Lady Be Good\tPath\t025130\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68151.mp3\tSam Price's Texas Blusicians\tOh Lawdy Mama\tDECCA\t7811B\t68151\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR143447-3.mp3\tUniversity Six\tOh Lizzie\tHARMONY\t367-H\t143447-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC058760.mp3\tTommy Dorsey And His Orch\tOh Look At Me Now\tVICTOR\t27274\t058760\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU022437.mp3\tRudy Vallee And His Orch\tOh Mama\tBLUEBIRD\t7543\t022437\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_246.mp3\tLouis Prima\tOh Marie\tCOLUMBIA\t39969\tCO48870\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68629-A.mp3\tTed Weems & His Orchestra\tOh Mo'nah!\tDECCA\t3697B\t68629-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN0542-B.mp3\tRoy Carlson's Dance Orch\tOh Molly, My Molly-o\tBanner\t0542-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC67548-1.mp3\tTed Weems & His Orchestra\tOh Monah\tVICTOR\t22822\t67548-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/BLU102667.mp3\tWashboard Wonders\tOh My Goodness\tBLUEBIRD\t6455\t102667\t1936\t\n\tMahalia Jackson\tOh My Lord\tDECCA\t7321\t91265\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_434.mp3\tEddie Fisher\tOh My Maria\tRCA\t6615\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5448.mp3\tSlam Stewart Quartet\tOh My, Oh My, Oh Gosh\tMUSICRAFT\t367\t5448\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC12417-2.mp3\tAlan Turner\tOh Promise Me\tVICTOR\t17189\t12417-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_099.mp3\tAlan Turner\tOh Promise Me\tVICTOR\t17189\t12417-2\t1913\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68150.mp3\tSam Price's Texas Blusicians\tOh Red\tDECCA\t8505A\t68150\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN1009OS.mp3\tZeb Turner\tOh She's Gone\tKING\t1009\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COM29055.mp3\tEddie Condon's Chicagoans\tOh Sister Ain't That Hot\tCOMMODORE\t535\t29055\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/EME42524-2.mp3\tFletcher Henderson & His Orch\tOh Sister, Ain't That Hot\tEMERSON\t10713\t42524-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66438.mp3\tRice Brothers Gang\tOh Susanah\tDECCA\t5804\t66438\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88787-1.mp3\tFats Waller And His Rhythm\tOh Susanna Dust Off That Old Piana\tVICTOR\t24888\t88787-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16668-A.mp3\tOzzie Nelson & His Orch\tOh Suzanna, Dust Off That Old Pianna\tBRUNSWICK\t7375\t16668-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102773-C.mp3\tHartman's Heartbreakers\tOh Sweet Daddy Oh Paw\tBLUEBIRD\t6494B\t102773-C\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_105.mp3\tAmerican Quartet Feat. Billy Murray\tOh That Navajo Rag\tVictor\t17000\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28969-1.mp3\tGene Krupa & His Orch\tOh They're Makin' Me All Over In The Army\tOKEH\t5872\t28969-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3182.mp3\tBing Crosby And Sportsmen\tOh What A Beautiful Morning\tDECCA\t18564B\tL3182\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC18564B.mp3\tBing Crosby & Sportsmen\tOh What A Beautiful Morning\tDECCA\t18564B\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC18564.mp3\tBing Crosby & Sportsmen\tOh What A Beautiful Morning\tDECCA\t18564\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D314A2.mp3\tJimmy Dorsey And His Orchestra\tOh What A Beautiful Morning\tV-DISC\t314A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC23087.mp3\tHenry Burr\tOh What A Pal Was Mary\tVICTOR\t18606\t23087\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO35367.mp3\tFrankie Carle\tOh What It Seemed To Be\tCOLUMBIA\t36892\tCO35367\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3985.mp3\tDick Haymes And Helen Forrest\tOh What It Seemed To Be\tDECCA\t23481\tL3985\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24643-B.mp3\tJimmie Lunceford And His Orchestra\tOh Why, Oh Why\tOkeh\t4979\t24643-B\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3a/VIC11047-3.mp3\tBilly Murray\tOh You Beautiful Doll\tVICTOR\t16979\t11047-3\t1911\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB8128.mp3\tAda Jones\tOh You Candy Kid\tVICTOR\t16429\tB8128\t1909\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC037649.mp3\tTommy Dorsey And His Orch\tOh You Crazy Moon\tVICTOR\t26287\t037649\t1939\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC42375-2.mp3\tCoon Sanders Nighthawk Orch\tOh You Have No Idea\tVICTOR\t21501\t42375-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW140925.mp3\tEddie Cantor\tOh! Boy, What A Girl\tCOLUMBIA\t457D\tW140925\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_025.mp3\tFrank Crumit\tOh! By Jingo! Oh! By Gee!\tColumbia\t2935\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_108.mp3\tArthur Fields\tOh! Frenchy\tVictor\t18489\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_074.mp3\tEddie Cantor\tOh! Gee, Oh! Gosh, Oh! Golly, I'm In Love\tCOLUMBIA\t3934\t81073\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/EDI7244.mp3\tRachel Grant & Billy Murray\tOh! How I Laugh When I Think How I\tEDISON\t50687\t7244\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2500-A.mp3\tBing Crosby\tOh! How I Miss You Tonight\tDECCA\t4152A\tDLA2500-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_073.mp3\tVan And Schenck\tOh! How She Can Sing\tCOLUMBIA\tA-2757\t78393\t1919\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142443-1.mp3\tPaul Ash And His Orchestra\tOh! If I Only Had You\tCOLUMBIA\t707 D\tW142443-1\t1926\tJohn Valentine, John Linn, tp, Roscoe Lantz, trombone, Phil Wing & Herbert \"Putty\" Nettle,clarinet,al sax, Howard Grantham, cl, tn sax, Harry Barris, p, Paul Ash, vio, Julian Davidson,bj, Pierre Olker,br bass, Arthur Layfield, drums, v Milton Watson\nhttp://www.jazz-on-line.com/a/mp3l/HAR142491-3.mp3\tUniversity Six\tOh! If I Only Had You\tHARMONY\t230-H\t142491-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_132.mp3\tMarion Harris\tOh! Judge (he Treats Me Mean)\tCOLUMBIA\tA-2968\t79104-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC60899.mp3\tRed Norvo Swing Sextette\tOh! Lady Be Good\tDECCA\t3884B\t60899\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec65985-A.mp3\tCount Basie And His Orchestra\tOh! Lady, Be Good\tDecca\t2631\t65985-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu042609-1.mp3\tArtie Shaw And His Orchestra\tOh! Lady, Be Good\tBluebird\tB-10430\t042609-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64985-A.mp3\tCount Basie And His Orchestra\tOh! Lady, Be Good\tDecra\t2631\t64985-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68611.mp3\tWoody Herman & His Orchestra\tOh! Look At Me Now\tDECCA\t3630B\t68611\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO29862-1.mp3\tBenny Goodman & His Orch\tOh! Look At Me Now (vocal Helen Forrest)\tCOLUMBIA\t36012\tCO29862-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_236.mp3\tGuy Lombardo And His Royal Canadians\tOh! Moytle\tDecca\t18651\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_004.mp3\tEddie Fisher\tOh! My Pa-pa\tRCA Victor\t5552\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/BAN11717-3.mp3\tBilly Banks And His Rhythmakers\tOh! Peter (v B. Banks)\tBANNER\t32462\t11717-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64954-A.mp3\tCount Basie And His Rhythm\tOh! Red\tDECCA\t2780A\t64954-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_162.mp3\tDon Charles And The Singing Dogs\tOh! Susanna\tRCA Victor\t6344\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_003.mp3\tHenry Burr\tOh! What A Pal Was Mary\tVICTOR\t18606\t23087\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_006.mp3\tFrank Sinatra\tOh! What It Seemed To Be\tCOLUMBIA\t36905\tCO35442\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_002.mp3\tFrankie Carle And His Orchestra Feat. Marjorie Hughes\tOh! What It Seemed To Be\tCOLUMBIA\t36892\tCO35367\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_045.mp3\tHelen Forrest And Dick Haymes Feat. Orchestra Directed By Earle Hagen\tOh! What It Seemed To Be\tDECCA\t23481\tL3985\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_019.mp3\tArthur Collins And Byron Harlan\tOh! You Circus Day\tCOLUMBIA\t1187\t19912\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037675.mp3\tGlenn Miller & His Orch\tOh! You Crazy Moon (vre)\tBLUEBIRD\t10329\t037675\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400615-B.mp3\tSophie Tucker W Miff Mole\tOh! You Have No Idea\tOKeh\t41058\t400615-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC73306-1.mp3\tBilly Banks & His Band\tOh! You Sweet Thing\tVICTOR\t24148\t73306-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_296.mp3\tRalph Flanagan And His Orchestra Feat. Steve Benoric\tOh, Babe!\tRCA VICTOR\t3954\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_270.mp3\tBenny Goodman Sextet Feat. Nancy Redd & Rickey\tOh, Babe!\tCOLUMBIA\t39045\tCO44431\t1950\tBenny Goodman (cl), Terry Gibbs (vib), Teddy Wilson (p), Johnny Smith (g), Bob Carter (sb), Terry Snyder (dm)\nhttp://www.jazz-on-line.com/a/mp3b/COL400899.mp3\tEddie Condon Qt\tOh, Baby!\tCOLUMBIA\t35950\t400899\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Har145975-1.mp3\tThe Dixie Stompers\tOh, Baby!\tHarmony\t636-H\t145975-1  \t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041456.mp3\tJelly Roll Morton Jazzmen\tOh, Didn't He Ramble\tBLUEBIRD\t10429\t041456\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap262-1D1.mp3\tZutty's Creole Band With Barney Bigard\tOh, Didn't He Ramble\tCapitol\t930\t262-1D1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu041456-1.mp3\tJelly-roll Morton's New Orleans Jazzmen\tOh, Didn't He Ramble?\tBluebird\tB-10429\t041456-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/HAR144612-1.mp3\tUniversity Six\tOh, Doris! Where Do You Live?\tHARMONY\t489-H\t144612-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81459-3.mp3\tEddie Cantor W Georgians\tOh, Gee, Georgie\tCOLUMBIA\t56D\t81459-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_063.mp3\tFour Knights\tOh, Happy Day\tCapitol\t2315\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_004.mp3\tArthur Fields\tOh, How I Hate To Get Up In The Morning\tVictor\t18489\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_069.mp3\tBenson Orchestra Of Chicago Feat. Cloyd Griswold\tOh, How I Miss You Tonight\tVICTOR\t19685A\t32714-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_123.mp3\tIrving Berlin\tOh, How That German Could Love!\tCOLUMBIA\tA-0804\t4333\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU063838-1.mp3\tUna Mae Carlisle\tOh, I'm Evil\tBLUEBIRD\t11159\t063838-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/Vic20133B.mp3\tTed Weems & His Orchestra\tOh, If I Only Had You\tVictor\t20133 B\t35589-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic70140-1.mp3\tFletcher Henderson And His Connie's Inn Orchestra\tOh, It Looks Like Rain\tVictor\t22786\t70140-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2265.mp3\tElizabeth Brice\tOh, Johnny! Oh, Johnny! Oh!\tColumbia\tA2265\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_041.mp3\tElizabeth Brice Feat. D/charles Prince\tOh, Johnny! Oh, Johnny! Oh!\tColumbia\t2265\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/COL140374-3.mp3\tTed Lewis & His Band\tOh, Katarina!\tCOLUMBIA\t295D\t140374-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC73820.mp3\tElla Fitzgerald W Bob Haggart\tOh, Lady Be Good\tDECCA\t23956\t73820\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC31555-4.mp3\tPaul Whiteman And His Orch\tOh, Lady Be Good\tVICTOR\t19551\t31555-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC100500-1.mp3\tBenny Goodman Trio\tOh, Lady Be Good\tVICTOR\t25333-B\t100500-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO29927-1.mp3\tEddie South & His Quintet\tOh, Lady Be Good\tCOLUMBIA\t36193\tCO29927-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/CON26501-A.mp3\tJoe Sullivan (piano)\tOh, Lady Be Good\tCONQUEROR\t9503\t26501-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO29236-1.mp3\tTeddy Wilson & His Orch\tOh, Lady Be Good\tCOLUMBIA\t36084\tCO29236-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-31945.mp3\tLouisiana Rhythm Kings\tOh, Lady Be Good\tBrunswick\t4706\tE-31945\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31945-A.mp3\tLouisiana Rhythm Kings\tOh, Lady Be Good!\tBRUNSWICK\t4706\tE31945-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20-1551-B.mp3\tArtie Shaw And His Orchestra\tOh, Lady, Be Good\tVictor\t20-1551-B\t042609-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_011.mp3\tTommy Dorsey Orch V Frank Sinatra\tOh, Look At Me Now\tVICTOR\t27274\t058760\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_082.mp3\tRudy Vallee And His Connecticut Yankees\tOh, Ma, Ma (the Butcher Boy)\tBLUEBIRD\t7543\t022437\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_033.mp3\tEddie Calvert Feat. Norrie Faramor's Orchestra\tOh, Mein Papa\tEssex\t336\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_011.mp3\tAmerican Quartet\tOh, You Beautiful Doll\tVictor\t16979\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_025.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tOh, You Crazy Moon\tVICTOR\t26287\t037649\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42663.mp3\tUna Mae Carlisle & A.holmes\tOhi Ohio Boogie\tCOLUMBIA\t38736\tCO42663\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COL79568.mp3\tAl Jolson\tOhio\tCOLUMBIA\tA-3361\t79568\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_364.mp3\tLisa Kirk\tOhio\tRCA Victor\t5187\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1118.mp3\tEddie Vinson & His Orchestra\tOil Man Blues\tMERCURY\t8067\t1118\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62182-1.mp3\tJelly Roll Morton Hot Peppers\tOil Well\tVICTOR\t23321\t62182-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-156-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tOiseaux Des les\tSWING\t103\tOSW-156-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/ARCB11704.mp3\tMills Bros+young Do\tOk America Pt.2\tARC\tBr20112\tB11704\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64004-2.mp3\tMckinney's Cotton Pickers\tOkay Baby\tVICTOR\t23000A\t64004-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/COL29293.mp3\tJimmie Lunceford & His Orch\tOkay For Baby\tCOLUMBIA\t35967\t29293\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D305A2.mp3\tLes Brown And His Orchestra\tOkay For Baby\tV-DISC\t305A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Col29293-1.mp3\tJimmie Lunceford And His Orchestra\tOkay For Baby\tColumbia\t35967\t29293-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BANLA207-A.mp3\tEddie Cantor\tOkay Toots\tBANNER\t33217\tLA207-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/PATCPT-1703-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tOkay, Toots\tPath\tPA-466\tCPT-1703-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_276.mp3\tEddie Cantor\tOkay, Toots\tMelotone\t13184\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1818.mp3\tSpade Cooley & His Orch\tOklahoma Stomp (wills)\tCOLUMBIA\t20573\tHCO1818\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA1606.mp3\tEddy Duchin And His Orch\tOl' Man Mose\tCOLUMBIA\t36278\tLA1606\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec60156-E.mp3\tLouis Armstrong And His Orchestra\tOl' Man Mose\tDecca\t622\t60156-E\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_030.mp3\tEddy Duchin And His Orchestra Feat. Patricia Norman\tOl' Man Mose\tCOLUMBIA\t36278\tLA1606\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM409x.mp3\tWarfield Grays\tOl' Man River\tMGM\t409\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC41607-2.mp3\tPaul Whiteman And His Orchestra<br>vocal Bing Crosby<br>\tOl' Man River\tVICTOR\t21218\t41607-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DECW265152.mp3\tHorace Henderson & His Orch.\tOl' Man River\tDECCA\t18172\tW265152\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU26880.mp3\tAl Jolson W Bill Wirges Orch\tOl' Man River\tBRUNSWICK\t3867\t26880\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT562.mp3\tBud Freeman\tOl' Man River\tMAJESTIC\t1031\tT562\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5450.mp3\tCozy Cole Allstars\tOl' Man River\tSAVOY\t512A\tS5450\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1923.mp3\tWillie Lewis & Negro Band\tOl' Man River\tVARSITY\tEL4079s\t1923\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/ARCB-14774-4.mp3\tCasa Loma Orchestra\tOl' Man River\tARC\tBR6800\tB-14774-4\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCC-2304.mp3\tSammy Stewart Orch\tOl' Man River\tVOCALION\t15724\tC-2304\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL8848.mp3\tBing Crosby\tOl' Man River\tDECCA\t29850\tL8848\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN15576-1.mp3\tLuis Russell & His Orchestra\tOl' Man River (v Sonny Woods)\tBANNER\t33179\t15576-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_113.mp3\tBenny Goodman And His Orchestra Feat. Mildred Bailey, Voacls\tOl' Pappy\tCOLUMBIA\t2892 D\tW152703\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU14878-A.mp3\tJack Teagarden & His Orch\tOl' Pappy (v N L)\tBRUNSWICK\t6780\t14878-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152703.mp3\tBenny Goodman And His Orchestra\tOl' Pappy (vm.bailey)\tCOLUMBIA\t2892 D\tW152703\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_131.mp3\tJo Stafford\tOld Acquaintance\tCapitol\t142\t78-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/CONMEM47-1.mp3\tRoy Acuff Smoky Mountain Boys\tOld Age Pension Check\tCONQUEROR\t9432\tMEM47-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146778-1.mp3\tCharlie Poole's N.c.ramblers\tOld And Only In The Way\tCOLUMBIA\t15672 D\tW146778-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC3513.mp3\tDick Justice\tOld Black Dog\tBRUNSWICK\t395\tC3513\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2445.mp3\tBing Crosby\tOld Black Joe\tDECCA\t18804B\tDLA2445\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU055518.mp3\tGlenn Miller & His Orch\tOld Black Joe\tBLUEBIRD\t10913\t055518\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC028178.mp3\tTommy Dorsey & His Orch\tOld Black Joe\tVICTOR\t26145\t028178\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/ColB-24926-A.mp3\tGene Krupa And His Orchestra\tOld Black Joe\tColumbia\t35205\tB-24926-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC1248263.mp3\tFletcher Henderson & His Orch\tOld Black Joe's Blues\tVOCALION\t14740A\t1248263\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Cam3491-4.mp3\tFletcher Henderson's Happy Six Orch\tOld Black Joe's Blues\tCameo\t9033\t349 1-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Pat70424.mp3\tHenderson's ''club Alabam'' Orchestra\tOld Black Joe's Blues\tPath? Actuelle\t036042\t70424\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1912.mp3\tKay Kyser And His Orch\tOld Buttermilk Sky\tCOLUMBIA\t37073\tHCO1912\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147255.mp3\tGid Tanner's Skillet Lickers\tOld Dan Tucker\tCOLUMBIA\t15382 D\tW147255\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE871.mp3\tAbe Lyman's California Orch\tOld Fashioned Girl\tBRUNSWICK\t4924\tLAE871\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26214-7.mp3\tPaul Whiteman & His Orch\tOld Fashioned Girl\tVICTOR\t18879A\t26214-7\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2681.mp3\tTexas Jim Lewis\tOld Fashioned Hoedown\tDECCA\t5990\tDLA2681\t1941\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81361-1.mp3\tThe Georgians\tOld Fashioned Love\tColumbia\t30-D\t81361-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/MER898.mp3\tFrankie Laine W Carl Fischer\tOld Fashioned Love\tMERCURY\t5177\t898\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38607.mp3\tMills Brothers\tOld Fashioned Love\tDECCA\t166A\t38607\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/COL16021-A.mp3\tRed Norvo's Swing Octet\tOld Fashioned Love\tCOLUMBIA\t3059 D\t16021-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72389.mp3\tJames P Johnson\tOld Fashioned Love\tDECCA\t24882\t72389\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D364B.mp3\tEddy Howard And His Orchestra\tOld Fashioned Love\tV-DISC\t364B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480609.mp3\tThe Art Tatum Trio\tOld Fashioned Love\tClef\tEP-318\t1799-1\t1954\tBenny Carter (as), Art Tatum (p), Louie Bellson (dm)\nhttp://www.jazz-on-line.com/a/mp3o/KIN910-A.mp3\tWayne Raney\tOld Fashioned Matrimony\tKING\t910\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_1010_02.mp3\tLee Morse And Her Bluegrass Boys\tOld Fashioned Romance\tColumbia\t1199DB\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC026689.mp3\tLarry Clinton & His Orchestra\tOld Folks\tVICTOR\t26056\t026689\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82533.mp3\tGene Ammons\tOld Folks\tDECCA\t28094\t82533\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS59050.mp3\tDon Byas Quartet\tOld Folks\tSAVOY\t628B\tS59050\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23466.mp3\tMildred Bailey & Her Orchestra\tOld Folks\tVOCALION\t4432\t23466\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECC91512-A.mp3\tBing Crosby\tOld Folks\tDECCA\t2123B\tC91512-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECC91512-B.mp3\tBing Crosby\tOld Folks\tDECCA\t2123B\tC91512-B\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_074.mp3\tLarry Clinton And His Orchestra Feat. V/bea Wain\tOld Folks\tVICTOR\t26056\t026689\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480789.mp3\tBen Webster Sextet\tOld Folks\tMercury\t8298\t4721-3\t1951\tMaynard Ferguson (tp), Benny Carter (as), Ben Webster (ts), Gerald Wiggins (p), John Kirby (sb), George Jenkins (dm)\nhttp://www.jazz-on-line.com/a/mp3c/HAR142330.mp3\tBluegrass Footwarmers\tOld Folks Shuffle\tHARMONY\t248-H\t142330\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE80729.mp3\tClarence Williams Jazz Kings\tOld Folks Shuffle\tOKEH\t8465\t80729\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048775.mp3\tFats Waller And His Rhythm\tOld Grand Dad\tBLUEBIRD\t10698\t048775\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143032-1.mp3\tGid Tanner Skillet Lickers\tOld Joe Clark\tCOLUMBIA\t15108 D\tW143032-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU8918OJ.mp3\tVillage Boys\tOld Joe Is At It Again\tBLUEBIRD\t8918\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19501-1.mp3\tStuff Smith & Onyx Club Boys\tOld Joe's Hittin' The Jug\tARC\tVO3270\t19501-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62676-A.mp3\tEdgar Hayes & His Orchestra\tOld King Cole\tDECCA\t1527\t62676-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/Col80992-4.mp3\tThe Georgians\tOld King Tut\tColumbia\tA-3902\t80992-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1921.mp3\tKay Kyser And His Orch\tOld Lamplighter\tCOLUMBIA\t37095\tHCO1921\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC76327-1.mp3\tJimmie Rodgers\tOld Love Letters\tVICTOR\t23190\t76327-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/MER636.mp3\tEddie Vinson And His Orchestra\tOld Maid Boogie\tMERCURY\t8028\t636\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4687.mp3\tBig Bill And His Rhythm\tOld Man Blues\tCOLUMBIA\t37502\tCCO4687\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe404521-B.mp3\tHarlem Footwarmers (ellington)\tOld Man Blues\tOKeh\t8869\t404521-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC051223-1.mp3\tSidney Bechet New Orleans Fw\tOld Man Blues\tVICTOR\t26663A\t051223-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_211.mp3\tDorsey Brothers Orchestra\tOld Man Harlem\tBRUNSWICK\t6624\t13426-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13426-A.mp3\tDorsey Brothers Orch\tOld Man Harlem (vmb)\tBRUNSWICK\t6624\t13426-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC18597-1.mp3\tWingy Manone & His Orch\tOld Man Mose\tVOCALION\t3159\t18597-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC60156-D.mp3\tLouis Armstrong And His Orch.\tOld Man Mose\tDECCA\t622A\t60156-D\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11924-A.mp3\tCab Calloway And His Orchestra\tOld Man Of The Mountain\tBanner\t32511\t11924-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41539-2.mp3\tRevelers\tOld Man River\tVICTOR\t21241\t41539-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/DIV2661-Gy.mp3\tBroadway Bell-hops\tOld Man Sunshine\tDiva\t2661-G\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC45628-3.mp3\tGeorge Olsen & His Music\tOld Man Sunshine (v F F)\tVICTOR\t21566A\t45628-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_1023_01.mp3\tLee Morse And Her Bluegrass Boys\tOld Man Sunshine Little Boy Bluebird\tColumbia\t1621DA\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145047-2.mp3\tGid Tanner's Skillet Lickers\tOld Mcdonald Had A Farm\tCOLUMBIA\t15204 D\tW145047-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146079.mp3\tClayton Mcmichen & R.puckett\tOld Molly Hare\tCOLUMBIA\t15295 D\tW146079\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74687.mp3\tElla Fitzgerald & Daydreamers\tOld Mother Hubbard\tDECCA\t24581\t74687\t1949\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec.mp3\tElla Fitzgerald\tOld Mother Hubbard\tDecca\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW150580.mp3\tPaul Whiteman & His Orch\tOld New England Moon\tCOLUMBIA\t2224 D\tW150580\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1082.mp3\tPhil Spitalny's Music\tOld New England Moon (vbc)\tHIT OF THE WEEK\t1082\t1082-C73\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC9429.mp3\tKokomo Arnold\tOld Original Kokomo Blues\tDECCA\t7026\tC9429\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_051.mp3\tHenry Burr\tOld Pal, Why Don't You Answer Me?\tCOLUMBIA\t2995\t79380\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC45185-1.mp3\tGene Austin\tOld Pals Are The Best Pals After All\tVICTOR\t21545\t45185-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_114.mp3\tGene Austin Feat. O/nat Shilkret\tOld Pals Are The Best Pals After All\tVICTOR\t21545\t45185-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06417.mp3\tFats Waller And His Rhythm\tOld Plantation\tVICTOR\t25550\t06417\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/V-DVP1706.mp3\tRoy Eldridge & His Orchestra\tOld Rob Roy\tV-DISC\t605\tVP1706\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93538.mp3\tRed Foley\tOld Shep\tDECCA\t5944\tC93538\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_272.mp3\tElvis Presley\tOld Shep\tRCA\tEPA-993\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D141B2.mp3\tMilitary District Of Washington Band\tOld Soldiers Never Die\tV-DISC\t141B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC56304.mp3\tFrank Stokes\tOld Sometime Blues\tVICTOR\t23341\t56304\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC61589.mp3\tBob Crosby & His Orchestra\tOld Spinning Wheel\tDECCA\t1196\t61589\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU059497.mp3\tMemphis Slim (p.chatman)\tOld Taylor\tBLUEBIRD\t8903\t059497\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL358.mp3\tHi-flyers\tOld Tobacco Mill\tVOCALION\t4093\tDAL358\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11912-1.mp3\tCab Calloway & His Orchestra\tOld Yazoo\tBRUNSWICK\t6400\t11912-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL692.mp3\tLee O'daniel Hillbilly Boys\tOld Yazoo\tVOCALION\t4778\tDAL692\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Mel12203-1.mp3\tMills Blue Rhythm Band\tOld Yazoo\tMelotone\tM-12480  \t12203-1  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru11912-A.mp3\tCab Calloway And His Orchestra\tOld Yazoo\tBrunswick\t6400\t11912-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28524-1.mp3\tGene Krupa & His Orch\tOld, Old Castle In Scotland\tOKEH\t5788\t28524-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC055068-2.mp3\tArtie Shaw And His Orchestra\tOld, Old Castle In Scotland\tVICTOR\t26760\t055068-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055068-1.mp3\tArtie Shaw And His Orchestra\tOld, Old Castle In Scotland V A B\tVictor\t26760\t055068-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_073.mp3\tHelen Carroll Feat. Russ Case Orchestra And The Satisfiers\tOle Buttermilk Sky\tRCA VICTOR\t1982\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_197.mp3\tConnee Boswell Feat. Bob Haggart's Orchestra\tOle Buttermilk Sky\tDECCA\t18913A\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_025.mp3\tHoagy Carmichael\tOle Buttermilk Sky\tARA\t155A\tARA1189-2C\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/ARA1189-2C.mp3\tHoagy Carmichael And His Orch\tOle Buttermilk Sky. (from Canyon Passage)\tARA\t155A\tARA1189-2C\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1866.mp3\tGene Autry\tOle Faithful\tCOLUMBIA\t20543\tHCO1866\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_135.mp3\tGene Autry\tOle Faithful\tCOLUMBIA\t20543\tHCO1866\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-25-2.mp3\tMezzrow - Bechet Quntet\tOle Miss\tKing Jazz\t142 \tKJ-25-2  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DECC91141.mp3\tThe Ranch Boys\tOle Pardner\tDECCA\t5354\tC91141\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62238-2.mp3\tKing Oliver & His Orchestra\tOlga\tVICTOR\t22681\t62238-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/APO1317.mp3\tJ.c.heard\tOllopa\tAPOLLO\t783\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC59910-3.mp3\tWayne King & His Orch\tOn A Blue And Moonless Night\tVICTOR\t22399\t59910-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL247.mp3\tLee O'daniel Hillbilly Boys\tOn A Chinese Honeymoon\tVOCALION\t3986\tDAL247\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA582A.mp3\tLouis Armstrong & Andy Iona\tOn A Cocoanut Island\tDECCA\t29117\tDLA582A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_243.mp3\tLouis Armstrong Feat. Louis, Andy Iona, George Archer And Harry Baty And The Polynesians\tOn A Cocoanut Island\tDECCA\t914A\tDLA582\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA478.mp3\tAndy Iona's Novelty Four\tOn A Coconut Island\tCOLUMBIA\t3132 D\tLA478\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87647.mp3\tCharlie Barnet & His Orchestra\tOn A Holiday\tBLUEBIRD\t5816\t87647\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03990.mp3\tTommy Dorsey & His Orch\tOn A Little Bamboo Bridge\tVICTOR\t25513\t03990\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC62070.mp3\tLouis Armstrong And Andy Iona\tOn A Little Bamboo Bridge\tDECCA\t1216\t62070-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_161.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. V/bob Goday\tOn A Little Bamboo Bridge\tBluebird\t6781\t3986\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWC2798.mp3\tHarry James And His Orch\tOn A Little Street In Singapore\tCOLUMBIA\t35261\tWC2798\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_207.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tOn A Little Street In Singapore\tDECCA\t2838A\t66825\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/ColWC-2798-A.mp3\tHarry James And His Orchestra\tOn A Little Street In Singapore\tColumbia\t35261\tWC-2798-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043911.mp3\tGlenn Miller & His Orch\tOn A Little Street In Singapore (vre)\tBLUEBIRD\t10526A\t043911\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_029.mp3\tCollins And Harlan\tOn A Monkey Honeymoon\tVICTOR\t16426\tB6930-1\t1910\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67925.mp3\tDick Robertson And His Orch\tOn A Simmery Summery Day\tDECCA\t3305B\t67925\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2765.mp3\tKay Kyser And His Orch\tOn A Slow Boat To China\tCOLUMBIA\t38301\tHCO2765\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM47S3264.mp3\tArt Lund\tOn A Slow Boat To China\tMGM\t10269\t47S3264\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/CAPH2370.mp3\tBenny Goodman And His Orchestra\tOn A Slow Boat To China\tCAPITOL\t\tH2370\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2014.mp3\tEddy Howard & His Orchestra\tOn A Slow Boat To China\tMERCURY\t5210\t2014\t1947\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL38301.mp3\tKay Kyser & His Orch\tOn A Slow Boat To China\tCOLUMBIA\t38301\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_047.mp3\tEddy Howard And His Orchestra\tOn A Slow Boat To China\tMERCURY\t5210\t2014\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_096.mp3\tArt Lund\tOn A Slow Boat To China\tMGM\t10269\t47S3264\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_188.mp3\tLarry Clinton And His Orchestra Feat. V/helen Lee And Dipsy Doodlers\tOn A Slow Boat To China\tDECCA\t24482\t74202\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_068.mp3\tBenny Goodman And His Orchestra Feat. Al Hendrickson\tOn A Slow Boat To China\tCAPITOL\t15208\tH2370\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/VICOB5833.mp3\tRay Noble And His Orchestra\tOn A Steamer Coming Over\tVICTOR\t24575\tOB5833\t1933\twith Al Bowlly\nhttp://www.jazz-on-line.com/a/mp3b/Joh016.mp3\tRay Noble And His Orchestra (new Mayfair)\tOn A Steamer Coming Over \tHMV \tB-6440\t\t\tv Al Bowlly\nhttp://www.jazz-on-line.com/a/mp3b/Joh107.mp3\tJack Payne And His Bbc Dance Orchestra\tOn A Steamer Coming Over\tImperial\t2940\t6539-2-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152565-3.mp3\tMeyer Davis & His Orch\tOn A Steamer Coming Over (vc.palloy)\tCOLUMBIA\t2861 D\tW152565-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81667.mp3\tEddie Cantor\tOn A Windy Day 'way Down In Waikiki\tCOLUMBIA\t120D\t81667\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1986.mp3\tBing Crosby & Johnny Mercer\tOn Behalf Of The Visiting Fireman\tDECCA\t91615\tDLA1986\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2724.mp3\tDick Jurgens And His Orch\tOn Green Dolphin Street\tCOLUMBIA\t38027\tHCO2724\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_324.mp3\tJimmy Dorsey And His Orchestra Feat. V/bill Lawrence\tOn Green Dolphin Street\tMGM\t10098\t47S3167\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143040-1.mp3\tSeventh Day Advent Choir\tOn Jordan's Stormy Banks We Stand\tCOLUMBIA\t14178 D\tW143040-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_232.mp3\tJo Stafford\tOn London Bridge\tColumbia\t40782\tCO56669\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146165.mp3\tDan Hornsby Trio\tOn Mobile Bay\tCOLUMBIA\t15276 D\tW146165\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COL19181-2.mp3\tAlbert Campbell & Henry Burr\tOn Mobile Bay\tCOLUMBIA\tA-0976\t19181-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_029.mp3\tHenry Burr And Albert Campbell\tOn Mobile Bay\tColumbia\t976\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9885.mp3\tBilly Jones And Ernest Hare\tOn My Ukelele\tEDISON\t51470\t9885\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC27991OM.mp3\tSy Oliver\tOn My Way\tDECCA\t27991\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D329B.mp3\tSammy Kaye And His Orchestra (sally Stuart Voc.)\tOn My Way Out\tV-DISC\t329B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150574-4.mp3\tBessie Smith\tOn Revival Day\tCOLUMBIA\t14538 D\tW150574-4\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404049-C.mp3\tLuis Russell & His Orch\tOn Revival Day\tOKeh\t8811\t404049-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/V-DD6TC6298.mp3\tJack Teagarden & His Band\tOn Revival Day\tV-DISC\t724\tD6TC6298\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64349.mp3\tBob Howard & His Orch\tOn Revival Day\tDECCA\t2263B\t64349\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC72005-2.mp3\tCoon-sanders Orchestra\tOn Revival Day\tVICTOR\t22979\t72005-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-5766-.mp3\tJimmie Noone's Apex Club Orchestra\tOn Revival Day ? V E T\tVocalion \t1506\tC-5766-\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03548-1.mp3\tBilly Murray (tenor)\tOn San Francisco Bay\tCOLUMBIA\tBS3548\t03548-1\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_022.mp3\tAmerican Quartet\tOn The 5:15\tVictor\t17704\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_072.mp3\tArthur Collins And Byron Harlan\tOn The 5:15\tCOLUMBIA\tA-1675\t39697\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067884.mp3\tAlvino Rey & His Orch\tOn The Alamo\tBLUEBIRD\t11319\t067884\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO29513-1.mp3\tBenny Goodman Sextet\tOn The Alamo\tCOLUMBIA\t37513\tCO29513-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23811OTA.mp3\tEddie Heywood & His Orch\tOn The Alamo\tDECCA\t23811\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/COLZSP5433.mp3\tHerman Chittison Trio\tOn The Alamo\tCOLUMBIA\t39399\tZSP5433\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU7367.mp3\tIsham Jones & His Orch\tOn The Alamo\tBRUNSWICK\t2245\t7367!\t1922\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW148053-3.mp3\tLeo Reisman & His Orch\tOn The Alamo\tCOLUMBIA\t1767 D\tW148053-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE29710.mp3\tRed Nichols & His Orch\tOn The Alamo (v S L)\tBRUNSWICK\t4363\tE29710\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT532.mp3\tLouis Prima & His Orchestra\tOn The Atcheson, Topeka And Santa Fe\tMAJESTIC\t7145\tT532\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP3518.mp3\tJohnny Mercer\tOn The Atcheson, Topeka And The Sante Fe\tCAPITOL\t195\t3518\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3320.mp3\tBing Crosby\tOn The Atchison, Topeka And Santa Fe\tDECCA\t18690\tL3320\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3320.mp3\tBing Crosby\tOn The Atchison, Topeka And Se\tDECCA\t18690A\tL3320\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_070.mp3\tTommy Dorsey And His Orchestra Feat. The Sentimentalists\tOn The Atchison, Topeka, And The Santa Fe\tVICTOR\t1682\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_127.mp3\tJudy Garland And Merry Macs\tOn The Atchison, Topeka, And The Santa Fe\tDECCA\t23458\tL3958\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_218.mp3\tAndrews Sisters Feat. O/carmen Cavallaro\tOn The Avenue\tDECCA\t24102\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh154.mp3\tCarroll Gibbons And The Savoy Hotel Orpheans\tOn The Avenue - Selection Part 1 \tColumbia\tFB-1741\tCA-16407-1\t1937\tv Anne Lenner\nhttp://www.jazz-on-line.com/a/mp3w/1913_049.mp3\tHarry Macdonough And American Quartet\tOn The Banks Of The Wabash\tVictor\t17397\t12676-3\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1897_001.mp3\tGeorge J. Gaskin\tOn The Banks Of The Wabash\tCOLUMBIA\t4130\t\t1897\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_245.mp3\tShep Fields And His Rippling Rhythm Orchestra\tOn The Beach At Bali Bali\tBluebird\t6417.\t101828\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19454-1.mp3\tHenry Allen & His Orch\tOn The Beach At Bali Bali\tARC\tVO3261\t19454-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_253.mp3\tHenry Allen And His Orchestra\tOn The Beach At Bali Bali\tVOCALION\t3261\t19454-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_126.mp3\tTommy Dorsey And His Orchestra\tOn The Beach At Bali Bali\tVICTOR\t25349A\t101261-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101261-1.mp3\tTommy Dorsey & His Orch\tOn The Beach At Bali Bali (ve.wright)\tVICTOR\t25349A\t101261-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61247-A.mp3\tJimmie Lunceford And His Orchestra\tOn The Beach At Bali-bali\tDecca\t915\t61247-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_046.mp3\tConnee Boswell Feat. Bob Crosby's Orchestra\tOn The Beach At Bali-bali\tDECCA\t829A\t61148\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61247-A.mp3\tJimmie Lunceford And His Orchestra\tOn The Beach At Bali-bali.mp3\tDecca\t915\t61247-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_124.mp3\tJohnny Hamp And His Orchestra\tOn The Beach With You\tVICTOR\t22730\t69689-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE36785.mp3\tOzzie Nelson & His Orch\tOn The Beach With You (v O N)\tBRUNSWICK\t6131\tE36785\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO36634.mp3\tCharioteers\tOn The Boardwalk In Atlantic City\tCOLUMBIA\t37074\tCO36634\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_173.mp3\tCharioteers\tOn The Boardwalk In Atlantic City\tCOLUMBIA\t37074\tCO36634\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S251.mp3\tBilly Eckstine\tOn The Boulevard Of Memories\tMGM\t10069\t47S251\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU23307-1.mp3\tTeddy Wilson And His Orchestra Vocal Nan Wynn\tOn The Bumpy Road To Love\tBRUNSWICK\t8207\t23307-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC023763.mp3\tFats Waller And His Rhythm\tOn The Bumpy Road To Love\tVICTOR\t25898\t023763\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23307-1.mp3\tTeddy Wilson And His Orchestra\tOn The Bumpy Road To Love\tBrunswick\t8207\tB-23307-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D42A2.mp3\tGoldman Band\tOn The Campus\tv-disk\t42A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC87201-1.mp3\tRudy Vallee Connecticuts Yanks\tOn The Good Ship Lollipop\tVICTOR\t24838\t87201-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC17008.mp3\tWingy Manone & His Orch\tOn The Good Ship Lollipop\tVOCALION\t2914\t17008\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_058.mp3\tRudy Vallee And His Connecticut Yankees\tOn The Good Ship Lollipop\tVICTOR\t24838\t87201-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_066.mp3\tArthur Collins And Byron Harlan\tOn The Honeymoon Express\tEdison\t2130\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67063.mp3\tWoody Herman & His Orchestra\tOn The Isle Of May\tDECCA\t2993A\t67063\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1916.mp3\tConnie Boswell - V.young\tOn The Isle Of May\tDECCA\t3004A\tDLA1916\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_024.mp3\tConnee Boswell\tOn The Isle Of May\tDECCA\t3004A\tDLA1916\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC72687-1.mp3\tAlex Bartha Hotel Traymore Or.\tOn The Merry Go Round\tVICTOR\t24056\t72687-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_027.mp3\tAmerican Quartet\tOn The Mississippi\tVictor\t17237\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400846-B.mp3\tFred Hall & His Sugar Babies\tOn The Night We Did The Boom Boom By The Sea\tOKeh\t41112\t400846-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068836.mp3\tGlenn Miller And His Orch\tOn The Old Assembly Line\tBLUEBIRD\t11480 A\t068836\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_052.mp3\tArthur Collins And Byron Harlan\tOn The Old Fall River Line\tCOLUMBIA\t1419\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_061.mp3\tAda Jones And Billy Murray\tOn The Old Front Porch\tVICTOR\t17425\t13688-2\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_103.mp3\tAda Jones Feat. O/ Henry Burr\tOn The Old Front Porch\tCOLUMBIA\t1443\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_167.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tOn The Outgoing Tide\tRCA Victor\t3747\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC3184B.mp3\tFlanagan & Allen\tOn The Outside Looking In\tDECCA\t3184B\t-\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiPat36505.mp3\tTuxedo Dance Orchestra\tOn The Riviera\tPath\t36505\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_072.mp3\tNat Shilkret And The Victor Orchestra\tOn The Riviera\tVICTOR\t20113\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COL78193.mp3\tAl Jolson\tOn The Road To Calais\tCOLUMBIA\tA-2690\t78193\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_062.mp3\tAl Jolson\tOn The Road To Calais\tCOLUMBIA\tA-2690\t78193\t1919\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1150-A.mp3\tBing Crosby - J Trotter Orch\tOn The Sentimental Side\tDECCA\t1648\tDLA1150-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/BruDLA1150-A.mp3\tJohn Scott Trotter And His Orchestra\tOn The Sentimental Side\tBrunswick\tE-02641  \tDLA1150-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/COL46848.mp3\tSterling Trio\tOn The South Sea Isle\tCOLUMBIA\tA-2045\t46848\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_099.mp3\tSterling Trio\tOn The South Sea Isle\tVICTOR\t18113\t17979-3\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_205.mp3\tSammy Kaye And His Orchestra\tOn The Street Of Regret\tVictor\t27750\t068491\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_030.mp3\tVic Damone\tOn The Street Where You Live\tColumbia\t40654\tCO54483\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_496.mp3\tLawrence Welk And His Champagne Music\tOn The Street Where You Live\tCoral\t61644\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_137.mp3\tEddie Fisher\tOn The Street Where You Live\tRCA\t6529\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150043-2.mp3\tTed Lewis And His Band, Vocal By Ted Lewis\tOn The Sunny Side Of The Street\tCOLUMBIA\t2144 D\tW150043-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/SAV5899.mp3\tKing Cole Trio\tOn The Sunny Side Of The Street\tSAVOY\t600A\t5899\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC07864-1.mp3\tLionel Hampton And His Orch\tOn The Sunny Side Of The Street\tVICTOR\t25592\t07864-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO32053.mp3\tBenny Goodman Sextet\tOn The Sunny Side Of The Street\tCOLUMBIA\t37514\tCO32053\t1941\tvocal Peggy Lee\nhttp://www.jazz-on-line.com/a/mp3c/RCAD4VB1030.mp3\tTommy Dorsey & His Orchestra\tOn The Sunny Side Of The Street\tRCA\t20-1648\tD4VB1030\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/Cap276.mp3\tJo Stafford & Pied Pipers\tOn The Sunny Side Of The Street\tCapitol\t199\t276\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC063333.mp3\tEarl Hines (piano)\tOn The Sunny Side Of The Street\tVICTOR\t27562\t063333\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW265175.mp3\tColeman Hawkins & Buck\tOn The Sunny Side Of The Street\tCOLUMBIA\t-R\tW265175\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYHL29.mp3\tColeman Hawkins Sax Ens.\tOn The Sunny Side Of The Street\tKEYNOTE\t1308\tHL29\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/MERYW602-1.mp3\tFrankie Laine W Carl Fischer\tOn The Sunny Side Of The Street\tMERCURY\t1027A\tYW602-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/V-DJB485.mp3\tDuke Ellington's Orch\tOn The Sunny Side Of The Street\tV-DISC\t795\tJB485\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4010.mp3\tEddie Heywood & His Orch\tOn The Sunny Side Of The Street\tDECCA\t28549\tL4010\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/SAV5468.mp3\tColeman Hawkins-cozy Cole Band\tOn The Sunny Side Of The Street\tSAVOY\t550A\t5468\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE32426.mp3\tHarry Richman\tOn The Sunny Side Of The Street\tBRUNSWICK\t4747\tE32426\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/Ode403965-B.mp3\tCasa Loma Orchestra\tOn The Sunny Side Of The Street\tOdon\tONY-36080\t403965-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-418-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tOn The Sunny Side Of The Street\tSWING\t249\tOSW-418-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP348.mp3\tMcshann's Kansas City Stompers\tOn The Sunny Side Of The Street\tCAPITOL\t\t348\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_138.mp3\tHarry Richman\tOn The Sunny Side Of The Street\tBRUNSWICK\t4747\tE32426\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic063333-2.mp3\tEarl Hines\tOn The Sunny Side Of The Street\tVictor\t27562\t063333-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_233.mp3\tJo Stafford\tOn The Sunny Side Of The Street\tCapitol\t199\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73288-A.mp3\tBing Crosby And Lionel Hampton And His Orchestra\tOn The Sunny Side Of The Street\tDecca\t23843\t73288-A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_245.mp3\tTommy Dorsey And His Orchestra Feat. The Sentimentalists\tOn The Sunny Side Of The Street\tVICTOR\t1648\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic07864-1.mp3\tLionel Hampton And His Orchestra\tOn The Sunny Side Of The Street\tVictor\t25592\t07864-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic063333-2.mp3\tEarl Hines And His Orchestra\tOn The Sunny Side Of The Street\tVictor\t27562\t063333-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/ComR-4179.mp3\tChu Berry And His Jazz Ensemble\tOn The Sunny Side Of The Street\tCommodore\t1508\tR-4179\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480708.mp3\tArt Tatum\tOn The Sunny Side Of The Street\tPablo\t2310-793\t2214-1\t1955\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3e/DEC80372.mp3\tLouis Armstrong And His Orch\tOn The Sunny Side Of The Street Part 1\tDECCA\t28105\t80372\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru1481-1-2wpp.mp3\tLouis Armstrong And His Orchestra\tOn The Sunny Side Of The Street Part 1\tBrunswick\t500491\t1481-1/2wpp\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC80373.mp3\tLouis Armstrong And His Orch\tOn The Sunny Side Of The Street Part 2\tDECCA\t28106\t80373\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru1482-1-2wpp.mp3\tLouis Armstrong And His Orchestra\tOn The Sunny Side Of The Street Part 2\tBrunswick\t500491\t1482-1/2wpp\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC81686.mp3\tSy Oliver & His Orchestra\tOn The Trail\tDECCA\t28793\t81686\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_320.mp3\tRay Anthony And His Orchestra\tOn The Trail - From The Grand Canyon Suite\tCapitol\t2327\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1280.mp3\tCount Basie & His Orchestra\tOn The Upbeat\tV-DISC\t468\t1280\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/CONW3333.mp3\tSlam Stewart Qt\tOn The Upside Looking Down\tCONTIN\t10002\tW3333\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/PARL0419.mp3\tLouise Johnson\tOn The Wall\tPARAMOUNT\t13008A\tL0419\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_226.mp3\tJan Garber And His Orchestra\tOn The Wrong Side Of The Fence\tVICTOR\t24507\t77360-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC77360-2.mp3\tJan Garber & His Orch\tOn The Wrong Side Of The Fence (v L B)\tVICTOR\t24507\t77360-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO29677.mp3\tBurl Ives\tOn Top Of Old Smoky\tCOLUMBIA\t36735\tCO29677\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_071.mp3\tPercy Faith And His Orchestra Feat. Burl Ives\tOn Top Of Old Smoky\tCOLUMBIA\t39328\tCO45173\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COL18174.mp3\tLittle Jack Little\tOn Treasure Island\tCOLUMBIA\t3095 D\t18174\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA255-B.mp3\tBing Crosby W Victor Young\tOn Treasure Island\tDECCA\t617A\tDLA255-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18296-1.mp3\tTeddy Wilson And His Orch\tOn Treasure Island\tBRUNSWICK\t7572\t18296-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_231.mp3\tTeddy Wilson And His Orchestra\tOn Treasure Island\tBRUNSWICK\t7572\t18296-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_024.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tOn Treasure Island\tVictor\t25144\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/Cap2582.mp3\tJo Stafford\tOnce And For Always\tCapitol\t15424\t2582\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_145.mp3\tJo Stafford\tOnce And For Always\tCapitol\t15424\t2582\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/CONLA135-A.mp3\tBing Crosby\tOnce In A Blue Moon\tCONQUEROR\t8365\tLA135-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA135-B.mp3\tNat.  W.  Finston  And  His  Paramount  Orchestra\tOnce In A Blue Moon\tColumbia\t\tLA135-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_282.mp3\tLouis Armstrong\tOnce In A While\tDecca\t1560\tDLA1084\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC011363.mp3\tTommy Dorsey And His Orch\tOnce In A While\tVICTOR\t25686\t011363\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1084.mp3\tLouis Armstrong & His Orch\tOnce In A While\tDECCA\t28306\tDLA1084\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21792-2.mp3\tHorace Heidt & His Brigadiers\tOnce In A While\tBRUNSWICK\t7977\t21792-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S510.mp3\tSarah Vaughan\tOnce In A While\tMGM\t30732\t48S510\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25686.mp3\tTommy Dorsey & His Orchestra\tOnce In A While\tVictor\t25686\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh163.mp3\tJay Wilbur And His Band\tOnce In A While\tRex\t9248\tR-2607-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_002.mp3\tTommy Dorsey And His Orchestra Feat. Vocal Quartet\tOnce In A While\tVICTOR\t25686\t011363\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480479.mp3\tArt Tatum/buddy Defranco Quartet\tOnce In A While\tVerve\tMGV-8229\t2678-3\t1956\tBuddy De Franco (cl), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480618.mp3\tArt Tatum/buddy Defranco Quartet\tOnce In A While\tVerve\tMGV-8229\t2678-3\t1956\tBuddy De Franco (cl), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3a/CAPdsoiaw.mp3\tDinning Sisters\tOnce In Awhile\tCAPITOL\t\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL39.mp3\tBenny Morton's Trombone Choir\tOnce In Awhile\tKEYNOTE\t1309\tHL39\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/ColLA2020.mp3\tMartha Raye With Dave Rose Orchestra \tOnce In Awhile \tColumbia\t32560\tLA2020\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_142.mp3\tRay Bolger Feat. Sy Oliver's Orchestra\tOnce In Love With Amy\tDECCA\t40065\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65092.mp3\tElla Fitzgerald & Her Savoy 8\tOnce Is Enough For Me\tDECCA\t2451B\t65092\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65092-A.mp3\tElla Fitzgerald And Her Savoy Eight\tOnce Is Enough For Me\tDecca\t2451\t65092-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/COLWC2976.mp3\tBenny Goodman & His Orch\tOnce More\tCOLUMBIA\t35543\tWC2976\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/BruC-4480.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tOnce Or Twice\tBrunswick\t4863\tC-4480\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN7689-2.mp3\tAl Goering's Dance Orch.\tOnce Over Lightly\tBANNER\t7001\t7689-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU17761.mp3\tMills Blue Rhythm Band\tOnce To Every Heart\tBRUNSWICK\t7534\t17761\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BruCO-17761-1.mp3\tMills Blue Rhythm Band\tOnce To Every Heart\tBrunswick\t7534\tCO-17761-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC71889.mp3\tElla Fitzgerald\tOnce Too Often\tDECCA\t18605\t71889\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_190.mp3\tElla Fitzgerald\tOnce Too Often\tDECCA\t18605\t71889\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17185.mp3\tHal Kemp & His Orch\tOnce Upon A Midnight (v Bob Allen)\tBRUNSWICK\t7413\t17185\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_292.mp3\tEthel Merman And Ray Bolger Feat. O/sy Oliver\tOnce Upon A Nickel\tDECCA\t27506\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe265158-1.mp3\tChocolate Dandies\tOnce Upon A Time\tOKeh\t41568\t265158-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/PER15167-B.mp3\tSam Lanin And His Orch\tOne Alone\tPerfect\t15167-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC2783.mp3\tJohn Kirby & His Orchestra\tOne Alone\tOKEH\t5605\tWC2783\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36982-3.mp3\tNat Shilkret & Victor Orch\tOne Alone\tVICTOR\t20373B\t36982-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_043.mp3\tNat Shilkret And The Victor Orchestra\tOne Alone\tVICTOR\t20373B\t36982-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COL21297.mp3\tBessie Smith's Blue Boys\tOne And Two Blues\tCOLUMBIA\t36281\t21297\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VICV-40051-A.mp3\tMissouri Pacific Lines Booster\tOne At Last\tVictor\t40051-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5497.mp3\tDizzy Gillespie Sextet\tOne Bass Hit Part 1\tMUSICRAFT\t404\t5497\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5609.mp3\tDizzy Gillespie & His Orch\tOne Bass Hit Part 2\tMUSICRAFT\t404\t5609\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM743.mp3\tCab Calloway & His Orchestra\tOne Big Onion For Two\tVOCALION\t3970\tM743\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC3522.mp3\tDick Justice\tOne Cold December Day\tBRUNSWICK\t367\tC3522\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_107.mp3\tHenry Burr And Albert Campbell\tOne Day In June (it Might Have Been You)\tVICTOR\t18462\t21088-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR20075-2.mp3\tBlind Lemon Jefferson\tOne Dime Blues\tPARAMOUNT\t12578\t20075-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC4194-1.mp3\tDick Jurgens And His Orch\tOne Dozen Roses\tOKEH\t6636\tC4194-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70441.mp3\tConnie Boswell\tOne Dozen Roses\tDECCA\t4280B\t70441\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70607.mp3\tGlen Gray & Casa Loma Orch.\tOne Dozen Roses\tDECCA\t4299A\t70607\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_050.mp3\tGlen Gray And Casa Loma Orchestra Feat. Pee Wee Hunt, V\tOne Dozen Roses\tDECCA\t4299\t70607\t1942\tFrank Ryerson, Cy Baker, Grady Watts (tp), Billy Rauch, Murray McEachern, Pee Wee Hunt (tb), Glen Gray, Clarence Hutchinrider (cl, as, fl), Kenny Sargent (cl, as), Art Ralston (as, ob, bsn), Danny D'Andrea (as), Pat Davis (cl, ts, fl), Joe Hall (p), Jack Burdette (g), Stanley Dennis (sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1950_094.mp3\tFrank Sinatra\tOne Finger Melody\tCOLUMBIA\t39014\tCO44367\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-10202-B.mp3\tArtie Shaw And His Orchestra\tOne Foot In The Groove\tBLUEBIRD\tB-10202-B\t035304-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S3115.mp3\tBilly Eckstine\tOne For My Baby\tMGM\t30805\t52S3115\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4592.mp3\tFrankie Laine - Paul Weston\tOne For My Baby\tCOLUMBIA\t39597\tHCO4592\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2522.mp3\tFrank Sinatra\tOne For My Baby\tCOLUMBIA\t38474\tHCO2522\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/ManA-1576.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tOne For The Book\tManor\t1120\tA-1576\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_079.mp3\tJimmy Wakely\tOne Has My Name (the Other Has My Heart)\tCapitol\t15162\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU57146-3.mp3\tRed Mckenzie Blue Blowers\tOne Hour\tBLUEBIRD\t10037\t57146-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0978.mp3\tTempo King's Kings Of Tempo\tOne Hour For Lunch\tBLUEBIRD\t6642\t0978\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_016.mp3\tJimmie Grier And His Orchestra\tOne Hour With You\tVICTOR\t22971A\t68346-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC68351.mp3\tJeannette Mcdonald\tOne Hour With You (in French)\tVICTOR\t24019\t68351\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24019.mp3\tJeannette Mcdonald\tOne Hour With You (in French)\tVictor\t24019\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC68346-1.mp3\tJimmy Grier Coconut Grove Orch\tOne Hour With You (vdon Novis)\tVICTOR\t22971A\t68346-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC22971A.mp3\tJimmy Grier Coconut Grove Orch\tOne Hour With You (vdon Novis)\tVICTOR\t22971A\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1932_0330_01.mp3\tLee Morse\tOne Hour With You Medley With Eddy Duchin\tColumbia\t18001DA\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03844.mp3\tFats Waller And His Rhythm\tOne In A Million\tVICTOR\t25499\t03844\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru7823.mp3\tBunny Berigan's Boys\tOne In A Million\tBrunswick\t7823\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_369.mp3\tMal Hallet And His Orchestra\tOne In A Million\tDECCA\t1116\t61518-A\t1937\tfeat. Jerry Perkins (vo), Turk Murphy (tb), Stuart Anderson (ts), Frankie Carle (p)\nhttp://www.jazz-on-line.com/a/mp3b/BRU20562-2.mp3\tBunny Berigan's Boys\tOne In A Million (v Art Gentry)\tBRUNSWICK\t7823\t20562-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_066.mp3\tNat Shilkret And The Victor Orchestra\tOne Kiss\tVICTOR\t21775\t47765-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_392.mp3\tCoasters\tOne Kiss Led To Another\tAtco\t6073\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA21-0051x.mp3\tEddy Arnold\tOne Kiss Too Many\tRCA\t21-0051\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_238.mp3\tEddy Arnold\tOne Kiss Too Many\tRCA\t21-0051\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_140.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra And The Fontane Sisters\tOne Little Candle\tRCA Victor\t47-4631\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4485.mp3\tLionel Hampton Sextet\tOne Little Tear Is Like An Ocean\tDECCA\t24181\tL4485\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1874-2.mp3\tCharlie Palloy & His Orch\tOne Little Word Led To Another (v C P)\tCROWN\t3389B\tC1874-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CONM1010-1.mp3\tCab Calloway & His Orch\tOne Look At You\tCONQUEROR\t9199\tM1010-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCon9099.mp3\tCab Calloway\tOne Look At You\tConqueror\t9099\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1010-1.mp3\tCab Calloway And His Orchestra\tOne Look At You\tVocalion\t4767\tWM-1010-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72459AA.mp3\tAndrews Sisters\tOne Meat Ball\tDECCA\t18636B\t72459AA\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_215.mp3\tAndrews Sisters\tOne Meat Ball\tDECCA\t18636B\t72459AA\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL755.mp3\tClovers\tOne Mint Julep\tATLANTIC\t963\t755\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL963.mp3\tThe Clovers\tOne Mint Julep\tATLANTIC\t963\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14488-1.mp3\tJoe Venuti & His Orchestra\tOne Minute To One (v Slim Porter)\tBANNER\t32939\t14488-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150775.mp3\tCharlie Poole N.c.ramblers\tOne Moonlit Night\tCOLUMBIA\t15688 D\tW150775\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA414.mp3\tSons Of The Pioneers\tOne More Ride\tDECCA\t5275\tDLA414\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKELA1540.mp3\tSons Of The Pioneers\tOne More River To Cross\tOKEH\t5725\tLA1540\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10678-2.mp3\tSnook's Memphis Ramblers\tOne More Time\tBANNER\t32190\t10678-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/CRO1297-1.mp3\tEubie Blake And His Orchestra\tOne More Time\tCROWN\t3111\t1297-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_064.mp3\tGus Arnheim And His Orchestra Feat. Bing Crosby\tOne More Time\tVictor\t22700\tPBVE61076-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC61076-2.mp3\tGus Arnheim Coconut Grove Orch\tOne More Time (v Bing Crosby)\tVICTOR\t22700A\t61076-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35985.mp3\tFrankie Carle\tOne More Tomorrow\tCOLUMBIA\t36978\tCO35985\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_127.mp3\tFrankie Carle And His Orchestra\tOne More Tomorrow\tCOLUMBIA\t36978\tCO35985\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98389.mp3\tTommy Dorsey & His Clambake 7\tOne Night In Monte Carlo\tVICTOR\t25220\t98389\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUB16102.mp3\tGrace Moore And Metropolitan Or.\tOne Night Of Love\tBRUNSWICK\t6994\tB16102\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB16102.mp3\tGrace Moore+metro Opera\tOne Night Of Love\tCOLUMBIA\t35969\tB16102\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-10202-A.mp3\tArtie Shaw And His Orchestra\tOne Night Stand\tBLUEBIRD\tB-10202-A\t035303-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB652-1.mp3\tCount Basie & His Orchestra\tOne O'clock Boogie\tRCA\t20-2262\tD7VB652-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_101.mp3\tCount Basie And His Orchestra\tOne O'clock Boogie\tRCA\t20-2262\tD7VB652-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLB22252.mp3\tHarry James And His Orch\tOne O'clock Jump\tCOLUMBIA\t37142\tB22252\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP5553.mp3\tBenny Goodman And His Orchestra\tOne O'clock Jump\tCOLUMBIA\t39278\tZSP5553\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62332-A.mp3\tCount Basie And His Orch\tOne O'clock Jump\tDECCA\t1363\t62332-A\t1937\t\nhttp://www.78-tours.net/mp3/DEC62332-A.mp3\tCount Basie And His Orch\tOne O'clock Jump\tDECCA\t3708A\t62332-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC060332-1.mp3\tMetronome All Star Band\tOne O'clock Jump\tVICTOR\t27314\t060332-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLRR123-5.mp3\tLester Young & His Sextet\tOne O'clock Jump\tALLADDIN\t200\tRR123-5\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC046833-1.mp3\tSidney Bechet & His Rhythm\tOne O'clock Jump\tVICTOR\t27204\t046833-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_143.mp3\tCount Basie And His Orchestra\tOne O'clock Jump\tDECCA\t25056\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_247.mp3\tCount Basie And His Orchestra Feat. Lester Young-2nd Tenor Sax Solo\tOne O'clock Jump\tDECCA\t1363A\t62332-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-22252-1.mp3\tHarry James And His Orchestra\tOne O'clock Jump\tBrunswick\t8055\tB-22252-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480628.mp3\tBenny Goodman And His Orchestra\tOne O'clock Jump\tColumbia\tSL160\t\t1938\tCarnegie Hall'' Concert:<br>Harry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Hymie Schertzer, George Koenig (as), Arthur Rollini, Babe Russin (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480786.mp3\tJohnny Otis And His Orchestra\tOne O'clock Jump\tEmarcy\t824836-1\t4616-1\t1951\tDon Johnson, Gerald Wilson, tp; John Pettigrew, George Washington, tb; Floyd Turnham, as; Ben Webster, Lorenzo Holden, ts; Curtis Lowe, bs; Devonia Williams, p; Johnny Otis, vib; Pete Lewis, g; Mario Delargarde, b; Leard Bell, d\nhttp://www.jazz-on-line.com/a/mp3w/1938_140.mp3\tBenny Goodman And His Orchestra\tOne O'clock Jump\tVICTOR\t25792\t019832\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480885.mp3\tLes Elgart And His Orchestra\tOne O'clock Jump Mambo\tCOLUMBIA\t40326\tCO51662\t1955\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban5712-1.mp3\tFletcher Henderson And His Orchestra\tOne Of These Days\tBanner\t\t5712-1  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/CONSC64.mp3\tRoy Acuff Smoky Mountain Boys\tOne Old Shirt\tCONQUEROR\t9257\tSC64\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65042-A.mp3\tChick Webb And His Orchestra\tOne Side Of Me\tDecca\t2556\t65042-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLC4392.mp3\tCurly Williams Peachpickers\tOne Sided Affair\tCOLUMBIA\t20381\tC4392\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU22238.mp3\tArtie Shaw And His New Music\tOne Song\tBRUNSWICK\t8050\tB-22238-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_281.mp3\tArtie Shaw And His Orchestra\tOne Song\tBRUNSWICK\t8050\t22238\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU14715.mp3\tGene Rodemich And His Orchestra\tOne Stolen Kiss\tBRUNSWICK\t2824A\t14715\t1925\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3c/OKe80737-B.mp3\tSophie Tucker W Miff Mole\tOne Sweet Letter From You\tOKeh\t40813\t80737-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3319.mp3\tBing Crosby\tOne Sweet Letter From You\tDECCA\t24595\tL3319\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC041407.mp3\tLionel Hampton & His Orch\tOne Sweet Letter From You\tVICTOR\t26393\t041407\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38790.mp3\tGene Austin\tOne Sweet Letter From You\tVICTOR\t20730\t38790\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_090.mp3\tTed Lewis And His Band\tOne Sweet Letter From You\tCOLUMBIA\t988 D\tW144053-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_161.mp3\tGene Austin\tOne Sweet Letter From You\tVICTOR\t20730\t38790\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_173.mp3\tCharleston Chasers Feat. Kate Smith\tOne Sweet Letter From You\tCOLUMBIA\t911\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic041407-1.mp3\tLionel Hampton And His Orchestra\tOne Sweet Letter From You\tVictor\t26393\t041407-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30831.mp3\tCount Basie & His Orch\tOne Two Three O'leary\tOKEH\t6319\t30831\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93809.mp3\tJay Mcshann Quartet\tOne Woman's Man\tDECCA\t8607\tC93809\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA479-A.mp3\tBing Crosby & Georgie Stoll\tOne, Two Button Your Shoe\tDECCA\t948B\tDLA479-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19897.mp3\tArtie Shaw And His Orchestra\tOne, Two Button Your Shoe\tBRUNSWICK\t7750\tB-19897-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19973.mp3\tBillie Holiday\tOne, Two, Button Your Shoe\tARC\tVO3334\t19973\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_173.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. Charles Chester\tOne, Two, Button Your Shoe\tBluebird\t6604A\t102432\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh077.mp3\tJack Hylton And His Orchestra\tOne, Two, Button Your Shoe (v The Swingtette)\tHMV\tBD-5166\tOEA-4198-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067581-1.mp3\tMitchell Ayres\tOne, Two, Three O'leary (vvaughn Monroe)\tBLUEBIRD\t11283\t067581-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/ARA1130-5H.mp3\tPhil Harris And His Orchestra\tOne-zy Two-zy (vph)\tARA\t136A\tARA1130-5H\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_022.mp3\tPhil Harris\tOne-zy, Two-zy (i Love You-zy)\tARA\t136A\tARA1130-5H\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74836.mp3\tLouis Jordan\tOnions\tDECCA\t27058\t74836\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035561-2.mp3\tCharlie Barnet & His Orch\tOnly A Rose\tBLUEBIRD\t10227\t035561-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO34031-2.mp3\tBenny Goodman Qt\tOnly Another Boy And Girl\tCOLUMBIA\t36767\tCO34031-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2033-A.mp3\tBing Crosby\tOnly Forever\tDECCA\t3300A\tDLA2033-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_004.mp3\tBing Crosby\tOnly Forever\tDECCA\t3300A\tDLA2033-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE27614-1.mp3\tGene Krupa & His Orch\tOnly Forever More\tOKEH\t5686\t27614-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0800_02.mp3\tLee Morse\tOnly This Time I'll Be True\tPerfect\t11590B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC034260.mp3\tTommy Dorsey & His Orch\tOnly When You're In My Arms\tVICTOR\t26202\t034260\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19380.mp3\tLewis James & International Novalty Orchestra\tOnly You\tVictor\t19380\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_035.mp3\tPlatters\tOnly You (and You Alone)\tMercury\t70633 A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_065.mp3\tHilltoppers Featuring Jimmy Sacca\tOnly You (and You Alone)\tDot\t15423\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/COLA-244x.mp3\tColumbia Male Quartette\tOnward Christian Soldiers\tColumbia\tA-244\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62175.mp3\tStuff Smith & Onyx Club Boys\tOnyx Club Spree\tDECCA\t1279\t62175\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-164-1.mp3\tTrio De Saxophones Alix Combelle\tOnze Heures Vingt\tSwing\t96\tOSW-164-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC164.mp3\tBilly Eckstine & His Orch\tOo Bop Sh' Bam\tNATIONAL\t\tNSC164\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_323.mp3\tRoy Orbison And The Teen Kings\tOoby Dooby\tSun\t242\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_225.mp3\tDoris Day\tOoh Bang Jiggilly Jang\tRPM\t428\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT1260.mp3\tCootie Williams & His Orch\tOoh La La\tMAJESTIC\t1165\tT1260\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC60912-A.mp3\tBob Crosby & His Orchestra\tOoh Looka There Ain't She Pretty\tDECCA\t759B\t60912-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/SAV5480.mp3\tPete Brown Qt\tOoh Wee\tSAVOY\t523\t5480\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67097.mp3\tBob Crosby & His Orch\tOoh What You Said\tDECCA\t2992A\t67097\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_228.mp3\tCharioteers\tOoh! Look-a-there, Ain't She Pretty?\tCOLUMBIA\t38065\tCO38493\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_169.mp3\tBuddy Greco\tOoh! Look-a-there, Ain't She Pretty?\tMUSICRAFT\t515\t5913\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU24307.mp3\tBen Selvin & His Orch\tOoh! Maybe It's You (v F B)\tBRUNSWICK\t3639\t24307\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_123.mp3\tArden-ohman Orchestra\tOoh! That Kiss\tVICTOR\t22818\t70251-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_214.mp3\tDorsey Brothers Orchestra Feat. Tony Stan\tOoh! That Kiss\tCOLUMBIA\t2581 D\tW152036-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/ManA-1661.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tOoh, That's What I Like\tManor\t1187\tA-1661\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/SPE440x.mp3\tLloyd Price\tOooh Oooh Oooh\tSPECIALTY\t440\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC021129.mp3\tBenny Goodman And His Orchestra\tOooooh Boom\tVICTOR\t25808\t021129\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5498-A.mp3\tDizzy Gillespie And His Sextet\tOop Bop Sha Bam\tMUSICRAFT\t383\t5498-A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MER533-2.mp3\tBuddy Rich & His Orch\tOop Bop Sham Bam\tMERCURY\t3037\t533-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_238.mp3\tHelen Grayco With Orchestra Directed By Harold Mooney\tOop Shoop\tX\t0051\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_082.mp3\tCrew-cuts Feat. David Carroll's Orchestra\tOop-shoop\tMERCURY\t70443\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL6527.mp3\tL.armstrong-ella Fitzgerald\tOops\tDECCA\t27901\tL6527\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/COLDAL239.mp3\tBob Wills Texas Playboys\tOozlin' Daddy Blues\tCOLUMBIA\t20289\tDAL239\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC055235.mp3\tLionel Hampton & His Orch\tOpen House\tVICTOR\t27341\t055235\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic055235-1.mp3\tLionel Hampton And His Sextet\tOpen House\tVictor\t27341\t055235-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2192.mp3\tCharioteers\tOpen The Door Richard\tCOLUMBIA\t37240\tHCO2192\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO37301.mp3\tThree Flames\tOpen The Door, Richard\tCOLUMBIA\t37268\tCO37301\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4351.mp3\tLouis Jordan And His Tympani 5\tOpen The Door, Richard\tDECCA\t23841\tL4351\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/NATNSC222.mp3\tDusty Fletcher\tOpen The Door, Richard\tNATIONAL\t\tNSC222\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAD7VB406.mp3\tCount Basie And His Orchestra\tOpen The Door, Richard\tRCA\t20-2127\tD7VB406\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_016.mp3\tThree Flames\tOpen The Door, Richard\tCOLUMBIA\t37268\tCO37301\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_075.mp3\tCharioteers\tOpen The Door, Richard\tCOLUMBIA\t37240\tHCO2192\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_045.mp3\tDusty Fletcher Feat. Jimmy Jones' Orchestra\tOpen The Door, Richard (parts 1 & 2)\tNATIONAL\t4012\tNSC222\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_017.mp3\tCount Basie And His Orchestra Feat. Harry Edison And Bill Johnson\tOpen The Door, Richard!\tVictor\t2127\tD7VB406\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL6815.mp3\tBing Crosby\tOpen Up Your Heart\tDECCA\t28470\tL6815\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_223.mp3\tBing Crosby\tOpen Up Your Heart\tDECCA\t28470\tL6815\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_067.mp3\tCowboy Church Sunday School\tOpen Up Your Heart (and Let The Sunshine In)\tDecca\t29367\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBan1139.mp3\tRoy Collins' Orchestra\tOpen Your Arms My Alabamy\tBanner\t1139\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102691-1.mp3\tJimmie Gunn & His Orch\tOperator Special\tBLUEBIRD\t6578\t102691-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BluBLP5016x.mp3\tErroll Garner\tOpus 1\tBlue Note\tBLP5016\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/CONW24947-A.mp3\tJohn Kirby And His Orch\tOpus 5\tCONQUEROR\t9504\tW24947-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480453.mp3\tArt Pepper Plus Eleven\tOpus De Funk\tContinental\tM3568\t\t1959\tPete Candoli, Jack Sheldon (tp), Dick Nash (tb), Bob Ebevoldsen (ts, vtb), Vince DeRosa (fhr), Art Pepper, Herb Geller (as), Bill Perkins (ts), Med Flory (bar), Russ Freeman (p), Joe Mondragon (sb), Mel Lewis (dm), Marty Paich (arr, cond)\nhttp://www.jazz-on-line.com/a/mp3e/COL26365.mp3\tBenny Goodman & His Orch\tOpus Local 802\tCOLUMBIA\t35362\t26365\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35110.mp3\tGene Krupa & His Orch\tOpus No. 1\tCOLUMBIA\t37224\tCO35110\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_107.mp3\tTommy Dorsey And His Orchestra\tOpus No. 1\tVICTOR\t1608\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481109.mp3\tGene Krupa Orch. Feat. Anita O'day\tOpus No. 1\tColumbia\t37224\tCO35110-1\t1945\tDon Fagerquist, Joe Triscari, Vince Hughes, Tony Russo (tp), Leon Cox, Tommy Pederson, Bill Culley (tb), Johnny Bothwell, Adrian Tei (as), Charlie Ventura, Charlie Kennedy (ts), Stuart Olsson (bar), Teddy Napoleon (p), Ed Yance (g), Irv Lang (sb), Gene Krupa, Joe Dale (dm), Sy Oliver (arr)\nhttp://www.jazz-on-line.com/a/mp3a/RCAD4VB1033.mp3\tTommy Dorsey And His Orchestra\tOpus No.1\tRCA\t20-1608\tD4VB1033\t1944\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480543.mp3\tBen Webster And Harry Sweets Edison\tOpus Seven Eleven\tClef\tMGC717\t2981-3\t1956\tHarry Sweets Edison, Tp, Ben Webster, Ts, Jimmy Rowles (p), Barney Kessel (g), Joe Mondragon (sb), Alvin Stoller (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DEC68364.mp3\tAndy Kirk & Clouds Of Joy\tOr Have I?\tDECCA\t3582B\t68364\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec68364-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tOr Have I?\tDecca\t3582\t68364-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec90967-B.mp3\tLil Armstrong And Her Swing Band\tOr Leave Me Alone\tDecca\t1092\t90967-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067742.mp3\tGlenn Miller & His Orch\tOrange Blossom Lane\tBLUEBIRD\t11326\t067742\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU037358.mp3\tRouse Bros\tOrange Blossom Special\tBLUEBIRD\t8218\t037358\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU8893x.mp3\tBill Monroe Bluegrass Boys\tOrange Blossom Special\tBLUEBIRD\t8893\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW148564.mp3\tCliff Edwards 'ukelele Ike'\tOrange Blossom Time\tCOLUMBIA\t1869 D\tW148564\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_236.mp3\tCliff Edwards\tOrange Blossom Time\tCOLUMBIA\t1869 D\tW148564\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPncskoocs.mp3\tNat Cole - Stan Kenton Orch\tOrange Colored Sky\tCAPITOL\t\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE27326-A.mp3\tGene Krupa & His Orch\tOrchids For Remembrance\tOKEH\t5672\t27326-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC78517-1.mp3\tRudy Vallee And His Ct.yankees\tOrchids In The Moonlight\tVICTOR\t24459\t78517-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24459.mp3\tRudy Vallee & His Connecticut Yankees\tOrchids In The Moonlight\tVictor\t24459\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_050.mp3\tRudy Vallee And His Connecticut Yankees\tOrchids In The Moonlight\tVICTOR\t24459\t78517-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146882-2.mp3\tEthel Waters\tOrgan Grinder Blues\tCOLUMBIA\t14365 D\tW146882-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU59061.mp3\tJimmie Davis\tOrgan Grinder Blues\tBLUEBIRD\t6272\t59061\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu6272.mp3\tJimmie Davis\tOrgan Grinder Blues\tBlue Bird\t6272\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC02101-1.mp3\tBenny Goodman And His Orchestra\tOrgan Grinder's Swing\tVICTOR\t25442A\t02101-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0231.mp3\tTempo King's Kings Of Tempo\tOrgan Grinder's Swing\tBLUEBIRD\t6533\t0231\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76290.mp3\tSy Oliver & His Orch\tOrgan Grinder's Swing\tDECCA\t27185\t76290\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC61246908A.mp3\tJimmie Lunceford And His Orch\tOrgan Grinder's Swing\tDECCA\t908A\t61246\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-2214-1.mp3\tMichel Warlop Et Son Orchestre (with Django Reinhardt)\tOrgan Grinder's Swing\tSWING\t43\tOLA-2214-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC61246.mp3\tJimmie Lunceford And His Orch\tOrgan Grinder's Swing\tDECCA\t60872\t61246\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_031.mp3\tJimmie Lunceford And His Orchestra\tOrgan Grinder's Swing\tDecca\t908\t61246-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_160.mp3\tFrank Froeba And His Swing Band Feat. Midge Williams\tOrgan Grinder's Swing\tCOLUMBIA\t3151D\t19764-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_136.mp3\tFour Aces Feat. Owen Bradley's Orchestra\tOrgan Grinder's Swing\tDECCA\t28691\t84283\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_127.mp3\tBenny Goodman And His Orchestra\tOrgan Grinder's Swing\tVICTOR\t25442\t02101-1\t1936\tZeke Zarchy, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Murray McEachern (tb), Benny Goodman (cl), Hymie Schertzer, Bill DePew (as), Arthur Rollini, Vido Musso (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3d/Dec61246-A.mp3\tJimmie Lunceford And His Orchestra\tOrgan Grinder's Swing.mp3\tDecca\t908\t61246-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM49S391.mp3\tSlim Gaillard\tOrgan Oreenie\tMGM\t10599A\t49S391\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26377-22.mp3\tPaul Whiteman & His Orch\tOriental\tVICTOR\t21599\t26377-22\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_085.mp3\tPaul Whiteman And His Orchestra\tOriental\tVICTOR\t21599\t26377-22\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_061.mp3\tEarl Fuller's Novelty Orchestra\tOriental\tCOLUMBIA\tA-6075\t49474-1\t1918\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18940o.mp3\tPaul Whiteman & His Orchestra\tOriental Fox Trot\tVictor\t18940\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC29839-4.mp3\tCoon-sanders Nighthawk Orch\tOriental Love Dreams\tVICTOR\t19325\t29839-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe82077-B.mp3\tChicago Footwarmers\tOriental Man\tOKeh\t8548\t82077-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/PAR20240-1.mp3\tDixie Thumpers\tOriental Man\tPARAMOUNT\t12594\t20240-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1829.mp3\tJimmy Blythe Washboard Wizards\tOriental Man\tVOCALION\t1180\tC1829\t1928\t\nhttp://www.jazz-on-line.com/a/mp3l/COL140554-2.mp3\tLeo Reisman & His Orch\tOriental Moon\tCOLUMBIA\t371D\t140554-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1059-1.mp3\tDjango Reinhardt\tOriental Shuffle\tGramophone\tK-7704\tOLA-1059-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe09536-A.mp3\tLouis Armstrong's Hot Five\tOriental Strut\tOKeh\t8299B\t09536-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63239-B.mp3\tLil Armstrong And Her Swing Band\tOriental Swing\tDecca\t1904\t63239-B\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/GUIT390-1.mp3\tPat Flowers\tOriginal Blues\tGUILDE\t1010\tT390-1\t\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe71307.mp3\tThomas Morris Pastjazz Masters\tOriginal Charleston Strut\tOKeh\t8055A\t71307\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe81298-B.mp3\tMiff Mole's Little Molers\tOriginal Dixieland One Step\tOKeh\t40932\t81298-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE27627.mp3\tRed Nichols & His Orch\tOriginal Dixieland One Step\tBRUNSWICK\t3989\tE27627\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC38736-A.mp3\tNew Orleans Rhythm Kings\tOriginal Dixieland One Step\tDECCA\t229B\t38736-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiM33183.mp3\tThe Dutch Swing College Band\tOriginal Dixieland One Step\tDecca\tM33183\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC37256-2.mp3\tJelly Roll Morton Hot Peppers\tOriginal Jelly Roll Blues\tVICTOR\t20405\t37256-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_212.mp3\tJelly Roll Morton's Red Hot Peppers\tOriginal Jelly Roll Blues\tBLUEBIRD\t10255\t37256-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/GenR-2561.mp3\tJelly-roll Morton\tOriginal Rag\tGeneral\t4001\tR-2561\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COMR2561.mp3\tJelly Roll Morton (piano)\tOriginal Rags\tCOMMODORE\t587\tR2561\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe08906-A.mp3\tOrig.tuxedo Orch (celestin)\tOriginal Tuxedo Rag (short Dress Gal)\tOKeh\t8215B\t08906-A\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75639.mp3\tArtie Shaw And His Orchestra\tOrinoco\tDECCA\t24889\t75639\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW81310-D.mp3\tLouis Armstrong's Hot Five\tOry's Creole Trombone\tCOLUMBIA\t35838\tW81310-D\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/SUN3003.mp3\tKid Ory's Sunshine Orch\tOry's Creole Trombone\tSUNSET\t3003\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8922OB.mp3\tOscar Peterson\tOscar's Blues\tMERCURY\t8922\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC38735-A.mp3\tNew Orleans Rhythm Kings\tOstrich Walk\tDECCA\t229A\t38735-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-331-2.mp3\tDjango Reinhardt Et Son Orchestre Fud Candrix Et Son Orchestre\tOubli\tSWING\t215\tOSW-331-2\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-324-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tOui\tSWING\t158\tOSW-324-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-144-1.mp3\tDjango Reinhardt\tOui, C'est a\tSWING\t87\tOSW-144-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18505.mp3\tArthur Fields\tOui, Oui, Marie\tVictor\t18505\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_020.mp3\tArthur Fields\tOui, Oui, Marie\tVictor\t18505\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_110.mp3\tIrving Kaufman\tOui, Oui, Marie\tColumbia\t2637\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC14345-1-2.mp3\tRichard Himber's Orch (vj.nash)\tOur Big Love Scene\tARC\tVO2588\t14345-1-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/BANLA70-A.mp3\tBing Crosby\tOur Big Love Scene\tBANNER\t33166\tLA70-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D141B1.mp3\tMilitary District Of Washington Band\tOur Bugler\tV-DISC\t141B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN6148-Ay.mp3\tFred Rich's Dance Orch\tOur Bungalow Of Dreams\tBanner\t6148-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN6148-Ax.mp3\tFred Rich's Dance Orch\tOur Bungalow Of Dreams (b#2\tBanner\t6148-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN6148-Az.mp3\tFred Rich's Dance Orch\tOur Bungalow Of Dreams (b#3\tBanner\t6148-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN6148-Aw.mp3\tFred Rich's Dance Orch\tOur Bungalow Of Dreams (bad\tBanner\t6148-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400188-A.mp3\tFrankie Trumbauer & His Orch\tOur Bungalow Of Dreams (v I K)\tOKeh\t41019\t400188-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN540.mp3\tTadd Dameron Sextet\tOur Delight\tBLUENOTE\tBN540\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_219.mp3\tTeresa Brewer\tOur Heartbreaking Waltz\tCoral\t61066\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/MER5466x.mp3\tKitty Kallen-richard Hayes\tOur Lady Of Fatima\tMERCURY\t5466\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_168.mp3\tRed Foley Feat. Anita Kerr Singers\tOur Lady Of Fatima\tDecca\t14526\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC034400.mp3\tTommy Dorsey & His Orch\tOur Love\tVICTOR\t26202\t034400\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/NATNSC406.mp3\tBilly Eckstine\tOur Love\tNATIONAL\t\tNSC406\t1948\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26202.mp3\tTommy Dorsey & His Orchestra\tOur Love\tVictor\t26202\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_063.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly\tOur Love\tDECCA\t2352A\t65098\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_018.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tOur Love\tVICTOR\t26202\t034400\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_251.mp3\tTommy Charles\tOur Love Affair\tDecca\t29717\t88725\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/OKELA2288-A.mp3\tDick Jurgens And His Orch\tOur Love Affair\tOKEH\t5759\tLA2288-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC055543.mp3\tTommy Dorsey And His Orch\tOur Love Affair\tVICTOR\t26736\t055543\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_043.mp3\tTommy Dorsey Orch V Frank Sinatra\tOur Love Affair\tVICTOR\t26736\t055543\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU055502.mp3\tGlenn Miller & His Orch\tOur Love Affair (vre)\tBLUEBIRD\t10845\t055502\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS24878-1.mp3\tBillie Holiday\tOur Love Is Different\tCBS\tVO5129\t24878-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62512.mp3\tCount Basie And His Orch\tOur Love Was Meant To Be\tDECCA\t1446\t62512\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013346.mp3\tFats Waller And His Rhythm\tOur Love Was Meant To Be\tVICTOR\t25681\t013346\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010562.mp3\tTommy Dorsey & His Clambake 7\tOur Love Was Meant To Be\tVICTOR\t25607\t010562\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65461.mp3\tLouis Armstrong & His Orch.\tOur Monday Date\tDECCA\t2615B\t65461\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU010109.mp3\tOzzie Nelson & His Orch\tOur Penthouse On 3rd Ave\tBLUEBIRD\t6987\t010109\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS21130-1.mp3\tGene's Merrymakers (kardos)\tOur Penthouse On 3rd Ave (vb.wain)\tCBS\tME70710\t21130-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07899.mp3\tTommy Dorsey & His Orch\tOur Penthouse On Third Avenue\tVICTOR\t25591\t07899\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43209.mp3\tSarah Vaughan\tOur Very Own\tCOLUMBIA\t38860\tCO43209\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_161.mp3\tSarah Vaughan\tOur Very Own\tCOLUMBIA\t38860\tCO43209\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D276A1.mp3\tDick Haymes\tOur Waltz\tV-DISC\t276A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D60A.mp3\tDavid Rose & His Orchestra\tOur Waltz\tv-disk\t60A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_048.mp3\tArthur Collins And Byron Harlan\tOut In An Automobile\tCOLUMBIA\tA-0402\t03320-2\t1906\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC15761-1.mp3\tCarl Shaw And Ho (reichman)\tOut In The Cold Again\tARC\tVO2786\t15761-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU15657.mp3\tCasa Loma Orchestra\tOut In The Cold Again\tBRUNSWICK\t6964\t15657\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S263.mp3\tBilly Eckstine\tOut In The Cold Again\tMGM\t11073A\t47S263\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_049.mp3\tGlen Gray And Casa Loma Orchestra\tOut In The Cold Again\tBRUNSWICK\t6964\t15657\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19717-8.mp3\tSix Jumping Jacks\tOut In The New Moan Hay\tBRUNSWICK\t3252\t19717-8\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-15037-A.mp3\tMills Blue Rhythm Band\tOut Of A Dream\tColumbia\t2963-D\tCO-15037-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4501.mp3\tSarah Vaughan\tOut Of Breath\tCOLUMBIA\t39494\tHCO4501\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic22481.mp3\tVictor Allen & His Orchestra\tOut Of Breath\tVictor\t22481\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe404432-B.mp3\tJoe Venuti's New Yorkers\tOut Of Breath (v S B)\tOKeh\t41451\t404432-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA983-A.mp3\tBing Crosby (vocal W-orch)\tOut Of Nowhere\tBRUNSWICK\t6090\tLA983-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO31320.mp3\tWilson & Horne\tOut Of Nowhere\tCOLUMBIA\t36737\tCO31320\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65907.mp3\tElla Fitzgerald & Her Orch\tOut Of Nowhere\tDECCA\t25292\t65907\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151519-2.mp3\tRuth Etting\tOut Of Nowhere\tCOLUMBIA\t2454 D\tW151519-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D316B1.mp3\tPaul Weston And His Orchestra\tOut Of Nowhere\tV-DISC\t316B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65907-A.mp3\tElla Fitzgerald And Her Famous Orchestra\tOut Of Nowhere\tDecca\t2598\t65907-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-22808-2.mp3\tHarry James And His Orchestra\tOut Of Nowhere\tBrunswick\t8136\tB-22808-2  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_182.mp3\tFive Keys\tOut Of Sight, Out Of Mind\tCapitol\t3502\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC38516-.mp3\tIsham Jones And His Orchestra\tOut Of Space\tDecca\t170\t38516-\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042729.mp3\tGlenn Miller & His Orch\tOut Of Space (vre)\tBLUEBIRD\t10438 A\t042729\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_083.mp3\tNat Shilkret And The Victor Orchestra\tOut Of The Dawn\tVICTOR\t21572B\t46322-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC46322-2.mp3\tNat Shilkret & Victor Orch\tOut Of The Dawn (v F B)\tVICTOR\t21572B\t46322-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-32-3.mp3\tMezzrow - Bechet Quntet\tOut Of The Gallion\tKing Jazz\t142\tKJ-32-3\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480386.mp3\tBenny Golson\tOut Of The Past\tRiverside\tRLP12-256\t\t1957\tKenny Dorham (tp), J.J. Johnson (tb), Benny Golson (ts), Wynton Kelly (p), Paul Chambers (sb), Charlie Persip or Max Roach (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480480.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tOut Of The Past\tRCA\t430045\t\t1958\tArt Blakey, D, Benny Golson, Ts, Lee Morgan, T,: Jymie Merritt, B, Bobby Timmons, P\nhttp://www.jazz-on-line.com/a/mp3w/1945_130.mp3\tJo Stafford\tOut Of This World\tCapitol\t191\t274-4\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3679.mp3\tBing Crosby - J.s.trotter\tOut Of This World\tDECCA\t18675B\tL3679\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_185.mp3\tTommy Dorsey And His Orchestra\tOut Of This World\tVictor\t1669\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC62683-A.mp3\tCount Basie And His Orch\tOut The Window\tDECCA\t3946B\t62683-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE29320.mp3\tLouisiana Rhythm Kings\tOut Where The Blues Begin\tVOCALION\t15779\tE29320\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-29320.mp3\tLouisiana Rhythm Kings\tOut Where The Blues Begin\tVocalion\t15779\tE-29320\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22063-A.mp3\tGeorge Olsen And His Music\tOut Where The Little Moonbe\tVictor\t22063-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW146550.mp3\tPaul Whiteman & His Orch\tOut-o'-town Gal\tCOLUMBIA\t1505 D\tW146550\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146922-2.mp3\tJan Garber & His Orch\tOutside\tCOLUMBIA\t1615 D\tW146922-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiHar857-Ho.mp3\tRudy Valee\tOutside\tHarmony\t857-H\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_060.mp3\tEddie Fisher\tOutside Of Heaven\tRCA\t20-4953\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_273.mp3\tMargaret Whiting\tOutside Of Heaven\tCapitol\t2217\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC018416.mp3\tBunny Berigan & His Orch\tOutside Of Paradise\tVICTOR\t25781A\t018416\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80996-1.mp3\tBessie Smith\tOutside Of That\tCOLUMBIA\tA-3900\t80996-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BROL0144-3.mp3\tBlind Joe Reynolds\tOutside Woman Blues\tBROADWAY\t5106B\tL0144-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/VICOB7432.mp3\tRay Noble And His Orchestra\tOver My Shoulder\tVICTOR\t24720\tOB7432\t1934\twith Al Bowlly\nhttp://www.jazz-on-line.com/a/mp3c/BAN15075-1.mp3\tEddie Cantor\tOver Somebody Else's Shoulder\tBANNER\t33039\t15075-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72392-AA.mp3\tJames Pete Johnson\tOver The Bars\tDECCA\t24884\t72392-AA\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038262.mp3\tGlenn Miller And His Orch\tOver The Rainbow\tBLUEBIRD\t10366\t038262\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC65998.mp3\tBob Crosby & His Orch\tOver The Rainbow\tDECCA\t2657A\t65998\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1840.mp3\tJudy Garland - Victor Young\tOver The Rainbow\tDECCA\t2672A\tDLA1840\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_143.mp3\tLarry Clinton And His Orchestra Feat. Bea Wain\tOver The Rainbow\tVICTOR\t26174\t030376\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_066.mp3\tJudy Garland\tOver The Rainbow\tDECCA\t23961\tDLA1840\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480706.mp3\tArt Tatum\tOver The Rainbow\tClef\tMGC613\t1415-1\t1953\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3e/DEC67337.mp3\tBob Crosby & His Orch\tOver The Waves\tDECCA\t3091B\t67337\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20306-2.mp3\tAmerican Qt\tOver There\tVICTOR\t18333\t20306-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45130B.mp3\tNora Bayes\tOver There\tVICTOR\t45130-B\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3r/RiEdi50443.mp3\tBilly Murray\tOver There\tEdison\t50443\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_001.mp3\tAmerican Quartet\tOver There\tVictor\t18333\t20306-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_007.mp3\tNora Bayes\tOver There\tVICTOR\t45130-B\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_072.mp3\tBilly Murray\tOver There\tEdison\t50443\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_009.mp3\tEnrico Caruso\tOver There\tVICTOR\t87294\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3e/EDI5659-A.mp3\tBilly Murray - Chorus - O\tOver There! - March-foxtrot (m + W: George M. Cohan)\tEDISON\tBA 3275\t5659-A\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM592-2.mp3\tCharlie Barnet & His Orch\tOverheard In A Cocktail Lounge\tVARIETY\tI633\tM592-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE36028.mp3\tBelle Baker (comedienne W-orch\tOvernight\tBRUNSWICK\t6051\tE36028\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_202.mp3\tRuth Etting\tOvernight\tCOLUMBIA\t2377 D\tW151203-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL3646-A.mp3\tLionel Hampton And His Orchestra\tOvertime\tDecca\t18669\tL3646-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5846.mp3\tDuke Ellington & His Orch\tOverture To A Jam Session - Part 2\tMUSICRAFT\t463\t5846\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5845.mp3\tDuke Ellington & His Orch\tOverture To A Jam Session Part 1\tMUSICRAFT\t463\t5845\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2480.mp3\tDizzy Gillespie\tOw!\tRCA\t20-2480\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36926-3.mp3\tThomas Morris Hot Babies\tP.d.q Blues\tVICTOR\t20330\t36926-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144063-2.mp3\tFletcher Henderson's Orch\tP.d.q Blues\tCOLUMBIA\t1002 D\tW144063-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/CORDOT15085x.mp3\tHilltoppers\tP.s. I Love You\tCORAL\tDOT15085\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_029.mp3\tHilltoppers\tP.s. I Love You\tCORAL\tDOT15085\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_167.mp3\tRudy Vallee And His Connecticut Yankees\tP.s. I Love You\tVICTOR\t24723\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN8605-1.mp3\tDixie Jazz Band (billy James And His Orchestra)\tPa's Old Hat\tBANNER\t6356\t8605-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_083.mp3\tPerry Como Feat. Hugo Winterhalter's Orchestra\tPa-paya Mama\tRCA Victor\t5447\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/COL30220PB.mp3\tHot Lips Page\tPacifying Blues\tCOLUMBIA\t30220\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63934.mp3\tChick Webb & His Orchestra\tPack Up Your Sins And Go To The Devil\tDECCA\t1894B\t63934\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63934-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tPack Up Your Sins And Go To The Devil\tDecca\t1894\t63934-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC18924-1.mp3\tEdward Hamilton\tPack Up Your Troubles In The Old Kit Bag\tVICTOR\t18222\t18924-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/COL77127-1.mp3\tPrince's Band\tPack Up Your Troubles In Your Old Kit Bag\tCOLUMBIA\tA-2317\t77127-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_052.mp3\tOscar Seagle And Columbia Stellar Quartet\tPack Up Your Troubles In Your Old Kit Bag\tCOLUMBIA\t6028\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_103.mp3\tHelen Clark\tPack Up Your Troubles In Your Old Kit Bag And Smile, Smile, Smile\tEdison\t50419\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_082.mp3\tArthur Collins And Byron Harlan\tPaddle Your Own Canoe\tVICTOR\t4602\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW141228.mp3\tIpana Troubadors (s.lanin)\tPaddlin' Madelin' Home\tCOLUMBIA\t503 D\tW141228\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_024.mp3\tCliff Edwards\tPaddlin' Madelin' Home\tPath\t025128\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16108.mp3\tAllen Brothers\tPadlock Key Blues\tARC\t(Reject?)\t16108\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiARCpadock.mp3\tAllen Brothers\tPadlock Key Blues\tARC\t\t16108\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_245.mp3\tLola Dee With Stubby And The Buccaneers\tPadre\tMERCURY\t70342\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/BruE-29382-A.mp3\tThe Jungle Band\tPaducah\tBrunswick\t4309\tE-29382-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038202.mp3\tGlenn Miller And His Orch\tPagan Love Song\tBLUEBIRD\t10352-B\t038202\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21931-A.mp3\tTroubadours\tPagan Love Song\tVictor\t21931-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_038.mp3\tNat Shilkret And The Victor Orchestra\tPagan Love Song\tVICTOR\t21931\t51012-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_057.mp3\tColumbians Feat. D/ben Selvin\tPagan Love Song\tCOLUMBIA\t1817 D\tW148466-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_006.mp3\tBob Haring And His Orchestra\tPagan Love Song\tBRUNSWICK\t4321\tE29562\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480886.mp3\tTed Heath And His Music\tPagan Love Song\tDECCA\tF8956\tDR-12218\t1948\tKenny Baker, Stanley Roderick, Cliff Haines, Dave Wilkins (tp), Harry Roche, Jackie Armstrong, Jack Bentley, Jimmy Coombes (tb), Les Gilbert, Reg Owen (as), Johnny Gray, Tommy Whittle (ts), Dave Shand (bar), Norman Stenfalt (p), Peter Chilver (g), Charlie Short (sb), Jack Parnell (dm), Ted Heath (dir)\nhttp://www.jazz-on-line.com/a/mp3c/VIC53904-1.mp3\tNat Shikret Victor Salon Orch\tPagan Love Song (steel Gtr)\tVICTOR\t22043B\t53904-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC51012-2.mp3\tThe Troubadors (shilkret)\tPagan Love Song (vfm)\tVICTOR\t21931\t51012-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-12306-A.mp3\tDon Redman And His Orchestra\tPagan Paradies\tBrunswick\t6412\tB-12306-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12306-A.mp3\tDon Redman & His Orch\tPagan Paradise\tBRUNSWICK\t6412\t12306-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98104.mp3\tTommy Dorsey & His Orch\tPagan Star\tVICTOR\t25206\t98104\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17804.mp3\tHal Kemp & His Orch\tPage Miss Glory\tBRUNSWICK\t7493\t17804\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC111.mp3\tPete Johnson's Allstars\tPage Mr Trumpet\tNATIONAL\t\tNSC111\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh052.mp3\tNew Mayfair Orchestra Dir. By Ray Noble\tPages Of Radio Land  Pt.1\tHMV\tB-3836\tOB-680-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COMP23425.mp3\tKansas City Six\tPagin' The Devil\tCOMMODORE\t512\tP23425\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE497.mp3\tNick Lucas\tPainting The Clouds With Sunshine\tBRUNSWICK\t4418\tLAE497\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC53564-3.mp3\tJean Goldkette & His Orch\tPainting The Clouds With Sunshine\tVICTOR\t22027\t53564-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_225.mp3\tSammy Fain (the Crooning Composer)\tPainting The Clouds With Sunshine\tHarmony\t1014\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_012.mp3\tNick Lucas\tPainting The Clouds With Sunshine\tBRUNSWICK\t4418\tLAE497\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_064.mp3\tJean Goldkette And His Orchestra\tPainting The Clouds With Sunshine\tVICTOR\t22027\t53564-3\t1929\tvocal : Franck Munn, from the film \"Gold Diggers of Broadway\"\nhttp://www.jazz-on-line.com/a/mp3b/VIC32723-4.mp3\tPaul Whiteman & His Orch\tPal Of My Cradle Days\tVICTOR\t19690A\t32723-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA907.mp3\tBing Crosby\tPalace In Paradise\tDECCA\t19019\tDLA907\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruDLA907-A.mp3\tLani Mcintyre And His Hawaiians\tPalace In Paradise\tBrunswick\tE-02485  \tDLA907-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA907-B.mp3\tLani Mcintyre And His Hawaiians\tPalace In Paradise\tDecca\t1616  \tDLA907-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLOCB370.mp3\tSidney Phillips & His Orch\tPalais De Danse\tCOLUMBIA\t35312\tOCB370\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC067654.mp3\tTommy Dorsey And His Orch\tPale Moon\tVICTOR\t27591\t067654\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2291.mp3\tBing Crosby & Merry Macs\tPale Moon\tDECCA\t3887A\tDLA2291\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC29778-3.mp3\tPaul Whiteman & His Orch\tPale Moon\tVICTOR\t19345\t29778-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D215A2.mp3\tTony Pastor\tPale Moon\tV-DISC\t215A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65634.mp3\tWoody Herman & His Orchestra\tPaleface - Blues\tDECCA\t2539B\t65634\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/EME41494.mp3\tEddie Cantor\tPalesteena\tEMERSON\t12092\t41494\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC24590-5.mp3\tOriginal Dixieland Jazz Band\tPalesteena\tVICTOR\t18717B\t24590-5\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79444.mp3\tFrank Crumit\tPalesteena\tCOLUMBIA\tA-3324\t79444\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18717B.mp3\tOriginal Dixieland Jazz Band\tPalesteena\tVICTOR-\t18717B\t24590-5\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiEME12092.mp3\tEddie Cantor\tPalesteena\tEMERSON-\t12092\t41494\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_028.mp3\tOriginal Dixieland Jazz Band\tPalesteena\tVICTOR\t18717B\t24590-5\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_133.mp3\tFrank Crumit\tPalesteena\tCOLUMBIA\tA-3324\t79444\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_052.mp3\tEddie Cantor\tPalesteena\tEMERSON\t12092\t41494\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO10472.mp3\tHarry James\tPalladium Party\tCOLUMBIA\t39994\tHCO10472\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU07635-1.mp3\tMerline Johnson (yas Yas Gal)\tPallet On The Floor\tBLUEBIRD\t7166\t07635-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480738.mp3\tSlim Gaillard And His Flat Foot Floogie Boys\tPalm Springs Jump\tColumbia\tCJ33566\tH-788-1\t1942\tBen Webster (ts) Jimmy Rowles (p) Slim Gaillard (g,vcl) Slam Stewart (sb,vo) Leo Watson (dm)\nhttp://www.jazz-on-line.com/a/mp3b/VICB2514-3.mp3\tAda Jones-len Spencer\tPals\tVICTOR\t16164\tB2514-3\t1905\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColE589.mp3\tFrancesco Daddi\tPalummella, Palumme'\tColumbia\tE589\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM48S22.mp3\tHank Williams\tPan American\tMGM\t10226\t48S22\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU062762.mp3\tFats Waller And His Rhythm\tPan Pan\tBLUEBIRD\t11383\t062762\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68824.mp3\tLouis Jordan & His Tympani 5\tPan-pan\tDECCA\t8537\t68824\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15433A.mp3\tCasa Loma Orchestra\tPanama\tBRUNSWICK\t7325\t15433A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC38515.mp3\tIsham Jones And His Orchestra\tPanama\tDecca\t662A\t38515\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO41853.mp3\tJimmy Dorsey Dorseyland Jazz\tPanama\tCOLUMBIA\t38654\tCO41853\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU101578-1.mp3\tWingy Manone & His Orch\tPanama\tBLUEBIRD\t6411B\t101578-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76337.mp3\tLouis Armstrong & His Allstars\tPanama\tDECCA\t27191\t76337\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38515.mp3\tIsham Jones & His Orchestra\tPanama\tDECCA\t662A\t38515\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COMR2583.mp3\tJelly Roll Morton's Seven\tPanama\tCOMMODORE\t631\tR2583\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404429-A.mp3\tLuis Russell & His Orch\tPanama\tOKeh\t8849\t404429-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCL6417.mp3\tLecuona Cuban Boys\tPanama\tCOLUMBIA\t36252\tCL6417\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC019425.mp3\tTommy Dorsey & His Orch\tPanama\tVICTOR\t26185\t019425\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS131.mp3\tJoe Sullivan Jazz Qt\tPanama\tDISC\t6004\t131\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE27605.mp3\tRed Nichols & His Orch\tPanama\tBRUNSWICK\t3961\tE27605\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM1662-A.mp3\tThe Dutch Swing College Band\tPanama\tDecca\tM32583\tAM1662-A\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC38610.mp3\tNew Orleans Rhythm Kings\tPanama\tDECCA\t3945B\t38610\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/BRU15433AHT2-4.mp3\tCasa Loma Orchestra\tPanama\tBRUNSWICK\t7325\tB-1543-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/JAZ8y.mp3\tBunk Johnson's Original Superio\tPanama\tJazz Man\t8\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1094-A.mp3\tBob Crosby & His Bobcats\tPanama\tDECCA\t3340B\tDLA1094-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU7325.mp3\tCasa Loma Orchestra\tPanama\tBRUNSWICK\t7325\tB-1543-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Har141424-3.mp3\tThe Dixie Stompers\tPanama\tHarmony\t92-H\t141424-3  \t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/WES115x.mp3\tLu Watters's Yerba Buena Jazz B\tPanama2\tWest Coast\t115\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1244.mp3\tDorothy Lamour\tPanamania\tBRUNSWICK\t7829\tLA1244\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64750-A.mp3\tCount Basie And His Orch\tPanassie Stomp\tDECCA\t2224B\t64750-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-108-1.mp3\tAlix Combelle And His Swing Band\tPanassie Stomp\tSwing\t81\tOSW-108-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2671.mp3\tJerry Byrd & String Dusters\tPanhandle Rag\tMERCURY\t6241\t2671\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB5552.mp3\tGene Krupa's Chicago Jazz Band\tPanhandle Rag\tRCA\t20-4026\tE0VB5552\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1375.mp3\tSons Of The West\tPanhandle Shuffle\tOKEH\t6196\tDAL1375\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU053797.mp3\tFats Waller And His Rhythm\tPantin' In The Panther Room\tBLUEBIRD\t11175A\t053797\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Pur1458.mp3\tBroadway Melody Makers\tPapa Better Watch Your Step\tPuritan\t11250\t1458\t1923\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC39326.mp3\tBirmingham Serenaders\tPapa De Da Da\tDECCA\t7052\t39326\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142429-2.mp3\tNew Orleans Wanderers\tPapa Dip\tCOLUMBIA\t735 D\tW142429-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_024.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tPapa Loves Mambo\tRCA Victor\t5857\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071191.mp3\tGlenn Miller & His Orch\tPapa Nicolini\tBLUEBIRD\t11342 B\t071191\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0232.mp3\tTempo King's Kings Of Tempo\tPapa Tree Top Tall\tBLUEBIRD\t6535\t0232\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW143954-2.mp3\tCelestin's Tuxedo Orch\tPapa's Got The Jim Jams\tCOLUMBIA\t14220 D\tW143954-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE27801-1.mp3\tCab Calloway & His Orch\tPapa's In Bed With His Britches On\tOKEH\t5731\t27801-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU054676-2.mp3\tUna Mae Carlisle\tPapa's In Bed With His Britches On\tBLUEBIRD\t10853\t054676-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN6348-B.mp3\tHollywood Dance Orch\tPapa's Mama's Blue\tBanner\t6348-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_230.mp3\tDoris Day Feat. O/lou Brings\tPapa, Won't You Dance With Me?\tCOLUMBIA\t37931\tHCO2604\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC70348.mp3\tMills Brothers\tPaper Doll\tDECCA\t18318B\t70348\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC18318B.mp3\tMills Brothers\tPaper Doll\tDECCA\t18318B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_002.mp3\tMills Brothers\tPaper Doll\tDECCA\t27157A\t70348-2\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_210.mp3\tLola Dee\tPaper Roses\tWing\t90015\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA643.mp3\tAugie Goupil's Royal Tahitians\tPapio\tDECCA\t1133\tDLA643\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1586.mp3\tAugie Goupil's Royal Tahitians\tPapoa\tDECCA\t2253A\tDLA1586\t1938\t\nhttp://www.78-tours.net/mp3/SIG28106-B.mp3\t\"flip\" Phillips Fliptet Neil Hefti, Trumpet, Aaron Sachs, Clarinet, Bill Harris, Trombone, Joe Phill\tPappilloma\tSIGNATURE\t28106\tS-2\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D266A2.mp3\tCharlie Barnet And His Orchestra\tPara Vega Me Voy\tV-DISC\t266A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26914.mp3\tEddie South & His Orch\tPara Viga Me Voy\tCOLUMBIA\t35635\t26914\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULAE655.mp3\tEarl Burtnett & His Orch\tParade Of The Blues\tBRUNSWICK\t4634\tLAE655\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047799.mp3\tHarlan Leonard & His Rockets\tParade Of The Stompers\tBLUEBIRD\t10736\t047799\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_071.mp3\tCarl Fenton And His Orchestra\tParade Of The Wooden Soldiers\tBrunswick\t2282\t8189\t1922\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOKe4638.mp3\tVincent Lopez & His Orch\tParade Of The Wooden Soldiers\tOKeh-\t4638\tS70681-C\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC27268-8.mp3\tPaul Whiteman And His Orch\tParade Of The Wooden Soldiers\tVICTOR\t19007\t27268-8\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/OKeS70681-C.mp3\tVincent Lopez & His Orch\tParade Of The Wooden Soldiers\tOKeh\t4638\tS70681-C\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU8189.mp3\tCarl Fenton And His Orch\tParade Of The Wooden Soldiers\tBRUNSWICK\t2282\t8189\t1922\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDLA1050.mp3\tEddie Dunstedter At The Hammond Electric Organ\tParade Of The Wooden Soldiers\tDECCA\t1572-A\tDLA 1050\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CONWC2985-A.mp3\tCab Calloway & His Orch\tParadiddle\tCONQUEROR\t9467\tWC2985-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU11706-A.mp3\tGuy Lombardo Royal Canadians\tParadise\tBRUNSWICK\t6290\t11706-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036379-2.mp3\tDorothy Lamour\tParadise\tBLUEBIRD\t10494\t036379-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89057P.mp3\tGene Krupa Sextet\tParadise\tMERCURY\t89057\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC72244.mp3\tRuss Columbo\tParadise\tVICTOR\t27636\t72244\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU11480-A.mp3\tBing Crosby\tParadise\tBRUNSWICK\t6285\t11480-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_213.mp3\tRuss Columbo\tParadise\tVICTOR\t27636\t72244\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_075.mp3\tBing Crosby\tParadise\tBRUNSWICK\t6285\t11480-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC71205-2.mp3\tLeo Reisman And Rose Maddux\tParadise (v Fm)\tVICTOR\t22904\t71205-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC18319-5.mp3\tMarion Harris\tParadise Blues\tVICTOR\t18152\t18319-5\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_092.mp3\tMarion Harris\tParadise Blues\tVICTOR\t18152\t18319-5\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2061.mp3\tBing Crosby Paradise Isle Trio\tParadise Isle\tDECCA\t3797A\tDLA2061\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89014PS.mp3\tCount Basie\tParadise Squat\tMERCURY\t89014\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1932_0330_02.mp3\tLee Morse\tParadise Waltz Medley With Eddy Duchin\tColumbia\t18001DB\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC61964.mp3\tCaresser And Gerald Clark\tParamaribo\tDECCA\t17301A\t61964\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D.mp3\tTommy Dorsey & His Orchestra\tParamount On Parade\tV-DISC\t206\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D206A.mp3\tTommy Dorsey And His Orchestra\tParamount On Parade\tV-DISC\t206A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-1995-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tParamount Stomp\tSWING\t40\tOLA-1995-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEWC2981-A.mp3\tBukka White\tParchman Farm Blues\tOKEH\t5683\tWC2981-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN10754-3.mp3\tJack Smith\tPardon Me Pretty Baby\tBANNER\t32232\t10754-3\t1931R\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404940-B.mp3\tJoe Venuti's Blue Four\tPardon Me Pretty Baby\tOKeh\t41506\t404940-B\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1156.mp3\tSam Lanin's Orch\tPardon Me Pretty Baby\tHit-Of-The-Week\t1156\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM-399-1.mp3\tBenny Carter And His Orchestra\tPardon Me Pretty Baby\tDECCA\t18256B\tAM-399-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88783-1.mp3\tFats Waller And His Rhythm\tPardon My Love\tVICTOR\t24889\t88783-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39388.mp3\tBob Howard & His Orchestra\tPardon My Love\tDECCA\t400B\t39388\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic88783-1.mp3\t\"fats Waller And His Rhythm\tPardon My Love\tVictor\t24889\t88783-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_192.mp3\tGlen Gray And Casa Loma Orchestra\tPardon My Southern Accent\tBRUNSWICK\t6945\t15459-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN910y.mp3\tWayne Raney\tPardon My Whiskers\tKING\t910\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26910.mp3\tEddie South & His Orch\tPardon, Madame!\tCOLUMBIA\t35633\t26910\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/HMWOLA-1740-1.mp3\tDjango Reinhardt\tParfum\tHMW\tB-8587\tOLA-1740-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88963-2.mp3\tRay Noble & His Orch\tParis In The Spring\tVICTOR\t25040\t88963-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_027.mp3\tRay Noble And His Orchestra\tParis In The Spring\tVICTOR\t25040\t88963-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480778.mp3\tBen Webster Quintet\tPark And Tilford Blues\tHaven\t804\th-1942\t1946\tBen Webster (ts), Al Haig (p), Bill De Arango (g), John Simmons (sb), Sid Catlett (dm)\nhttp://www.jazz-on-line.com/a/mp3c/VIC36131.mp3\tPaul Whiteman\tPark Avenue Fantasy\tVICTOR\t36131\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVB903-3.mp3\tCharlie Parker\tParker's Mood\tSAVOY\t307\tB903-3\t1948\t\nhttp://www.jazz-on-line.com/a/mp3h/Pat106730.mp3\tDuke Ellington's Washingtonians\tParlor Social Stomp\tPathe Actuelle\t7504\t106730\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_035.mp3\tArthur Collins And Byron Harlan\tParody On ''hiawatha''\tEDISON\t8475\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO95x.mp3\tBob Scobey's Frisco Band\tParsons, Kansas Blues\tGood Time Jazz\t95\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142036-1.mp3\tGid Tanner's Skillet Lickers\tPass Around The Bottle\tCOLUMBIA\t15074 D\tW142036-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38672-3.mp3\tBennie Moten's Kansas Orch\tPass Out Lightly\tVICTOR\t21199\t38672-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_253.mp3\tBing Crosby\tPass That Peace Pipe\tDecca\t24269\tL4552\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4552.mp3\tBing Crosby\tPass That Peace Pipe\tDECCA\t24269\tL4552\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE32063.mp3\tGene Krupa & His Orch\tPass The Bounce\tOKEH\t6619\t32063\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D587-.mp3\tGlenn Miller Army Air Force Band\tPassage Interdit\tV-Disc\t587-\t\t1944-\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_164.mp3\tMargaret Whiting\tPasse\tCapitol\t294\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_111.mp3\tTex Beneke And The Glenn Miller Orchestra Feat. V/lillian Lane\tPasse'\tRCA Victor\t1951\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS27850-2.mp3\tColeman Hawkins\tPassin It Around\tCBS\toK6284\t27850-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA30-0817.mp3\tJohnny Hodges\tPassion Flower\tRCA\t30-0817\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MER2756-2.mp3\tCharlie Parker And His Orch\tPassport\tMERCURY\t11022\t2756-2\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE81482-B.mp3\tThe Jazz Pilots (h.reser)\tPastafazoola\tOKEH\t40908\t81482-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR144473-1.mp3\tUniversity Six\tPastafazoola\tHARMONY\t474-H\t144473-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DIAD1055-B.mp3\tErroll Garner Trio\tPastel\tDIAL\t1016\tD1055-B\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8941P.mp3\tIllinois Jacquet Sextet\tPastel\tMERCURY\t8941\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/DIAD1055-B.mp3\tErroll Garner Trio\tPastel\tDIAL\t1016\tD1055-B\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU032966-2.mp3\tArtie Shaw And His Orchestra\tPastel Blue\tBLUEBIRD\t10178\t032966-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64710.mp3\tJohn Kirby & Onyx Club Boys\tPastel Blue\tDECCA\t2367A\t64710\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM50S6029.mp3\tBob Wills And His Texas Playboys\tPastime Blues\tMGM\t10681B\t50S6029\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/DecB-13259-A.mp3\tBenny Carter And His Orchestra\tPastorale \tDecca \tF-3606\tB-13259-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC102019.mp3\tFats Waller And His Rhythm\tPaswonky\tVICTOR\t25359\t102019\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic102019-1.mp3\t\"fats\" Waller And His Rhythm\tPaswonky\tVictor\t25359\t102019-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_087.mp3\tNora Bayes Feat. O/charles Prince\tPatches\tCOLUMBIA\t2921\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78734-1.mp3\tNora Bayes\tPatches: Freckles\tCOLUMBIA\tA-2921\t78734-1\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO35602.mp3\tCount Basie And His Orchestra\tPatience And Fortitude\tCOLUMBIA\t36946\tCO35602\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4043.mp3\tAndrews Sisters - Vic Schoen\tPatience And Fortitude\tDECCA\t18780A\tL4043\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DeLD-167.mp3\tBenny Carter And His Orchestra\tPatience And Fortitude\tDe Luxe\t1008\tD-167\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_199.mp3\tCount Basie And His Orchestra\tPatience And Fortitude\tCOLUMBIA\t36946\tCO35602\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_170.mp3\tAndrews Sisters\tPatience And Fortitude\tDECCA\t18780A\tL4043\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_075.mp3\tPerry Como Feat. Russell Case's Orchestra\tPatricia\tRCA Victor\t3905\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/CHAG18806-1.mp3\tJimmie Oden\tPatrol Wagon Blues\tCHAMPION\t16613\tG18806-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCha16613.mp3\tJimmie Oden\tPatrol Wagon Blues\tChampion\t16613\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic62345-2.mp3\tHerny ''red'' Allen And His New York Orchestra\tPatrol Wagon Blues\tVictor\t23006\t62345-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU030369-1.mp3\tFats Waller And His Rhythm\tPatty Cake, Patty Cake\tBLUEBIRD\t10149\t030369-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035031.mp3\tBunny Berigan & His Orch\tPatty Cake, Patty Cake\tVICTOR\t26196B\t035031\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145306.mp3\tWashington Phillips\tPaul And Silas In Jail\tCOLUMBIA\t14369 D\tW145306\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035766.mp3\tGlenn Miller And His Orchestra\tPavanne\tBLUEBIRD\t10286\t035766\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26939-A.mp3\tJimmie Lunceford And His Orchestra\tPavanne\tColumbia\t36700\t26939-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL243.mp3\tErroll Garner Trio\tPavanne Mood\tATLANTIC\t667\t243\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1279.mp3\tArnett Cobb & His Orchestra\tPay It No Mind\tAPOLLO\t796\tR1279\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC69368.mp3\tJimmie Davis\tPea Pickin' Papa\tVICTOR\t23573\t69368\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69035.mp3\tJimmie Lunceford & His Orch\tPeace And Love For All\tDECCA\t3892A\t69035\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69035-A.mp3\tJimmie Lunceford And His Orchestra\tPeace And Love For All (prayer For Moderns)\tDecca\t3892\t69035-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26288-A.mp3\tBenny Goodman & His Orch\tPeace, Brother (vocal Mildred Bailey)\tCOLUMBIA\t35331\t26288-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66954.mp3\tWoody Herman & His Orchestra\tPeace, Brother!\tDECCA\t2939B\t66954\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3094-A.mp3\tHank Penny's Radio Cowboys\tPeach Tree Shuffle\tOKEH\t5724\tWC3094-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67154.mp3\tWoody Herman & His Orchestra\tPeach Tree Street\tDECCA\t3501B\t67154\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB3382-2.mp3\tAda Jones And Len Spencer\tPeaches And Cream\tVICTOR\t16102\tB3382-2\t1906\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC41890-2.mp3\tMemphis Jug Band\tPeaches In The Springtime\tVICTOR\t21657\t41890-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU054597.mp3\tByron Parker+mountaineers\tPeanut Special\tBLUEBIRD\t8673\t054597\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_172.mp3\tLouis Armstrong\tPeanut Vendor\tOkeh\t41478\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/V-D074170-1.mp3\tDoctor Clayton\tPearl Harbor Blues\tV-DISC\t082B\t074170-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC75939.mp3\tElla Fitzgerald / Sy Oliver\tPeas And Rice\tDECCA\t27120\t75939\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/BluST-1986.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tPche  La Mouche\tBlue Star\t59\tST-1986\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-790-1.mp3\tCab Calloway And His Orchestra\tPeck-a-doodle-do\tVocalion\t4100\tM-790-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM156-1.mp3\tCab Calloway Cotton Club Orch\tPeckin'\tVARIETY\tI612\tM156-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09569-1.mp3\tBenny Goodman And His Orchestra\tPeckin'\tVICTOR\t25621\t09569-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_319.mp3\tCab Calloway And His Orchestra\tPeckin'\tVOCALION\t3830\tM156\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA739-A.mp3\tJimmy Dorsey And His Orchestra With Bing Crosby\tPeckin' \tDECCA\t\tDLA739-A \t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_141.mp3\tBenny Goodman And His Orchestra\tPeckin'\tVICTOR\t25621\t09569-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC033733.mp3\tTommy Dorsey & His Orch\tPeckin' With The Penguins\tVICTOR\t26181\t033733\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2780.mp3\tRoy Rogers\tPecos Bill\tRCA\t20-2780\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481520.mp3\tCharles Mingus\tPedal Point Blues\tColumbia\tJG35717\tCO63158-1\t1959\tJimmy Knepper (tb), John Handy (as), Shafi Hadi, Booker Ervin (ts), Horace Parlan (p), Charles Mingus (p, sb), Dannie Richmond (dm)\nhttp://www.jazz-on-line.com/a/mp3c/LON319.mp3\tGracie Fields\tPedro The Fisherman\tLONDON\t319\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SILP2097.mp3\tLovie Austin\tPeeping Blues\tSILVERTONE\t3572\tP2097\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS24683.mp3\tRay Noble And His Orch\tPeer Gynt Suite\tCBS\tBR8390\t24683\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP346x.mp3\tClark Dennis\tPeg O' My Heart\tCAPITOL\t346\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO37671.mp3\tBuddy Clark\tPeg O' My Heart\tCOLUMBIA\t37392\tCO37671\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC043925.mp3\tBunny Berigan & His Orch\tPeg O' My Heart\tVICTOR\t27258A\t043925\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE33304B.mp3\tRed Nichols And His Five Pennies\tPeg O' My Heart\tBRUNSWICK\t4877\tE33304B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/COL26023.mp3\tJack Teagarden\tPeg O' My Heart\tCOLUMBIA\t35727\t26023\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73926.mp3\tEddie Heywood\tPeg O' My Heart\tDECCA\t23960\t73926\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC25075.mp3\tGlenn Miller And His Orch\tPeg O' My Heart\tDecca\t25075\t25075\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_013.mp3\tHenry Burr\tPeg O' My Heart\tCOLUMBIA\t1404\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_098.mp3\tClark Dennis Feat. Billy May's Orchestra\tPeg O' My Heart\tCapitol\t1644\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_003.mp3\tCharles Harrison\tPeg O' My Heart\tVICTOR\t17412\t13628-2\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_004.mp3\tHarmonicats\tPeg O' My Heart\tVitacoustic\t1\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDR-19893.mp3\tTed Heath And His Music\tPeg O' My Heart - Mambo\tDECCA \t'ffrr' 1534\tDR-19893\t1954\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDR-19893.mp3\tTed Heath And His Music\tPeg O' My Heart - Mambo\tDECCA\t1534\tDR-19893\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/MER5365x.mp3\tJerry Murad Harmonicats\tPeg Of My Heart\tMERCURY\t5365\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM47S3077.mp3\tJ.thompson\tPeg Of My Heart\tMGM\t10037B\t47S3077\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2272x.mp3\tThree Suns\tPeg Of My Heart\tRCA\t20-2272\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC13628-2.mp3\tCharles Harrison\tPeg Of My Heart\tVICTOR\t17412\t13628-2\t1913\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC17412.mp3\tCharles Harrison\tPeg Of My Heart\tVICTOR\t17412\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU57139-3.mp3\tMckinney's Cotton Pickers\tPeggy\tBLUEBIRD\t10706\t57139-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP7557.mp3\tPete Daily\tPeggy O'neal\tCAPITOL\t1820\t7557\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2606.mp3\tFrankie Carle\tPeggy O'neil\tCOLUMBIA\t37930\tHCO2606\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COL79873.mp3\tCharles Harrison\tPeggy O'neil\tCOLUMBIA\tA-3438\t79873\t1921\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU5470.mp3\tBilly Jones\tPeggy O'neil\tBRUNSWICK\t2108\t5470\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_238.mp3\tFrankie Carle And His Orchestra Feat. V/gregg Lawrence\tPeggy O'neil\tCOLUMBIA\t37930\tHCO2606\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_095.mp3\tCharles Harrison\tPeggy O'neil\tVOCALION\t14191B\t7376\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_248.mp3\tHarmonicats\tPeggy O'neil\tVitacoustic\t7\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D533-A.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tPeggy The Pin-up Girl\tV-Disc\t533-A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC48797-3.mp3\tJohnny Dodds & His Band\tPencil Papa\tVICTOR\t38038\t48797-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO37564.mp3\tFrankie Carle\tPenguin At The Waldorf\tCOLUMBIA\t37567\tCO37564\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE81822-B.mp3\tJoe Venuti & His Blue Four\tPenn Beach Blues\tOKEH\t40947\t81822-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA463-A.mp3\tBing Crosby\tPennies From Heaven\tDECCA\t11010\tDLA463-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC61543-A.mp3\tCount Basie And His Orch\tPennies From Heaven\tDECCA\t1121\t61543-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19803.mp3\tHal Kemp & His Orch\tPennies From Heaven\tBRUNSWICK\t7749\t19803\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61575.mp3\tMills Brothers\tPennies From Heaven\tDECCA\t1147\t61575\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC265.mp3\tCharlie Ventura Sextet\tPennies From Heaven\tNATIONAL\t\tNSC265\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-1890-1.mp3\tAndr Ekyan (with Django Reinhardt)\tPennies From Heaven\tSWING\t4\tOLA-1890-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA463-A-947B.mp3\tBing Crosby And George Stoll Or\tPennies From Heaven\tDECCA\t947B\tDLA463-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1676.mp3\tLouis Prima & His Gang\tPennies From Heaven\tVOCALION\t3376\tC1676\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA519-A.mp3\tJimmy Dorsey's Orchestra (crosby, Armstrong, Langford)\tPennies From Heaven\tDECCA\t951A\tDLA519-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVoc3376.mp3\tLouis Prima & His Gang\tPennies From Heaven\tVocalion\t3376\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA-508-A.mp3\tLouis Armstrong With Bing Crosby And Frances Langford\tPennies From Heaven\tDecca\t15027\tDLA-508-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_001.mp3\tBing Crosby\tPennies From Heaven\tDECCA\t11010\tDLA463-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh027.mp3\tDuncan Whyte And His Orchestra\tPennies From Heaven\tParlophone \tR-2338\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20290-1.mp3\tTeddy Wilson And His Orchestra\tPennies From Heaven\tBrunswick\t7789  \tB-20290-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA580-A.mp3\tJimmy Dorsey And His Orchestra With Bing Crosby\tPennies From Heaven\tDECCA\t947B\tDLA580-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_040.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tPennies From Heaven\tVICTOR\t25431\t97624-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_272.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tPennies From Heaven\tDECCA\t951A\tDLA519-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD8VB3428.mp3\tRose Murphy (the Chee-chee Girl)\tPennies From Heaven\tVictor\t\tD8VB3428\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS20290-1.mp3\tTeddy Wilson & His Orch\tPennies From Heaven (vbh)\tCBS\tBR7789\t20290-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA-579-A.mp3\tLouis Armstrong With Bing Crosby And Frances Langford\tPennies From Heaven Medley\tDecca\t15027\tDLA-579-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA579-A.mp3\tJimmy Dorsey And His Orchestra With Bing Crosby\tPennies From Heaven Medley\tDecca\t15027\tDLA579-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA579-B.mp3\tJimmy Dorsey And His Orchestra With Bing Crosby\tPennies From Heaven Medley\tDECCA\tDE29226F\tDLA579-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC85536.mp3\tGlenn Miller ''the Glenn Miller Story''\tPennsylvania 6-5000\tDECCA\t29016\t85536\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA3003.mp3\tAndrew Sisters\tPennsylvania Polka\tDECCA\t23608\tDLA3003\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_158.mp3\tAndrews Sisters\tPennsylvania Polka\tDECCA\t18398\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_318.mp3\tPied Pipers\tPenny\tCapitol\t478\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN2193-K4.mp3\tHank Penny\tPenny Blows His Top\tKING\t621B\t2193-K4\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC65014-A.mp3\tGuy Lombardo's Royal Canadians\tPenny Serenade\tDECCA\t2291A\t65014-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC031815.mp3\tSwing And Sway With Sammy Kaye\tPenny Serenade\tVICTOR\t26150\t031815\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62351-A.mp3\tBob Howard & His Orch\tPenny Wise And Pound Foolish\tDECCA\t1372\t62351-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW141411-2.mp3\tFletcher Henderson & His Orch\tPensacola\tCOLUMBIA\t532 D\tW141411-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/Col141411-2.mp3\tFletcher Henderson And His Orchestra\tPensacola\tColumbia\t532-D\t141411-2  \t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67318.mp3\tLouis Jordan & His Tympani 5\tPenthouse In The Basement\tDECCA\t7777\t67318\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS22084-2.mp3\tHarry James And His Orchestra\tPenthouse Serenade\tCBS\tBR8035\t22084-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1780.mp3\tBob Hope & Shirley Ross\tPenthouse Serenade\tDECCA\t2568B\tDLA1780\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL5760.mp3\tLionel Hampton's Sextet\tPenthouse Serenade\tDECCA\t27372\tL5760\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/SIGRHT4.mp3\tEddie Heywood & His Orch\tPenthouse Serenade\tSIGNATURE\t40001B\tRHT4\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5760.mp3\tLionel Hampton And His Sextet\tPenthouse Serenade\tDecca\t27372\tLA-5760\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT674.mp3\tMildred Bailey W E.sauter Orch\tPenthouse Serenade (v M B)\tMAJESTIC\t1040\tT674\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5652.mp3\tSarah Vaughn W Teddy Wilson 8\tPenthouse Serenade (when We're Alone)\tMUSICRAFT\t505\t5652\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3181.mp3\tBing Crosby-trudy Erwin\tPeople Will Say We're In Love\tDECCA\t18564A\tL3181\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44426.mp3\tErroll Garner Trio\tPeople Will Say We're In Love\tCOLUMBIA\t39100\tCO44426\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP108.mp3\tSidney Catlett W Hazel Scott\tPeople Will Say We're In Love\tV-DISC\t030\tVP108\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_036.mp3\tFrank Sinatra\tPeople Will Say We're In Love\tCOLUMBIA\t36682\tCO33250\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_074.mp3\tHal Goodman And His Orchestra\tPeople Will Say We're In Love\tHIT OF THE WEEK\t7059\tW316-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/HITW316-1.mp3\tHal Goodman & His Orchestra\tPeople Will Say We're In Love (from Oklahoma)\tHIT OF THE WEEK\t7059\tW316-1\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic49448-2.mp3\tJelly Roll Morton And His Orchestra\tPep\tVictor\tV-38627\t49448-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/GRE2327-B!.mp3\tUniversal Do (f.hall)\tPepper Blues\tGREYGULL\t1620B\t2327-B!\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_200.mp3\tGisele Mackenzie\tPepper Hot Baby\tX\t0172\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_105.mp3\tJaye P. Morgan\tPepper-hot Baby\tRCA Victor\t6282\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65621.mp3\tThree Peppers\tPepperism\tDECCA\t2751B\t65621\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC070682.mp3\tDuke Ellington And His Orch\tPerdido\tVICTOR\t27880A\t070682\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DECLA5898.mp3\tLionel Hampton & His Orch\tPerdido\tDECCA\t27401\tLA5898\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S483.mp3\tEddie Heywood\tPerdido\tMGM\t30635\t51S483\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MERC730-3.mp3\tGene Krupa's Jazz Trio\tPerdido\tMERCURY\t8990\tC730-3\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/SES170.mp3\tBen Webster\tPerdido\tSESSION\t10010\t170\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/ATLRK5.mp3\tErroll Garner Trio\tPerdido\tATLANTIC\t678\tRK5\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO44309.mp3\tSarah Vaughan\tPerdido\tCOLUMBIA\t39001\tCO44309\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/AtlRK-5.mp3\tErroll Garner Trio\tPerdido\tAtlantic\t678\tRK-5\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5898.mp3\tLionel Hampton And His Orchestra\tPerdido\tDecca\t27401\tLA-5898\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_159.mp3\tDuke Ellington And His Famous Orchestra Feat. Harry Carney And Ray Nance\tPerdido\tVICTOR\t27880A\t070682\t1943\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480517.mp3\tArt Tatum And Lionel Hampton\tPerdido\tClef\tMGC709\t2374-2\t1955\tArt Tatum (p), Lionel Hampton (vib), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480736.mp3\tDuke Ellington And His Famous Orchestra\tPerdido\tVictor\t27880\t070682-1\t1942\tWardell Jones )tp), Ray Nance (tp, vn), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Barney Bigard (cl), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (as, bsx), Ben Webster (ts), Duke Ellington or Billy Strayhorn (p), Fred Guy (g), Junior Raglin (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3a/DEC67817-A.mp3\tLouis Armstrong And His Orch.\tPerdido Street Blues\tDECCA\t18090\t67817-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142426-1.mp3\tNew Orleans Wanderers\tPerdido Street Blues\tCOLUMBIA\t698 D\tW142426-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKJ-13-1.mp3\tMezzrow - Bechet Septet\tPerdido Street Stomp\tStoryville\tSEP 411\tKJ-13-1  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/RoyKJ-28-2.mp3\tMezzrow - Bechet Quntet\tPerdido Street Stomp Kj\tRoyal Jazz\t704\tKJ-28-2  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE81560.mp3\tEddy Lang (guitar Solo)\tPerfect\tOKEH\t40936\t81560\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU060914.mp3\tGlenn Miller And His Orch\tPerfidia\tBLUEBIRD\t11095\t060914\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC037626.mp3\tXavier Cugat And His Orch\tPerfidia\tVICTOR\t26334\t037626\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL29578.mp3\tBenny Goodman And His Orchestra\tPerfidia\tCOLUMBIA\t35962\t29578\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCon9652.mp3\tGinny Simms\tPerfidia\tConqueror\t9652\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_052.mp3\tFour Aces\tPerfidia\tDecca\t27987\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_024.mp3\tXavier Cugat And His Waldorf-astoria Orchestra\tPerfidia (tonight)\tVICTOR\t26334\t037626\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_089.mp3\tBenny Goodman And His Orchestra Feat. V/helen Forrest\tPerfidia (tonight)\tCOLUMBIA\t35962\t29578\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP1478.mp3\tDuke Ellington & His Orch\tPerfume Suite Part 1\tV-DISC\t516\tVP1478\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DsuiteVPA478.mp3\tDuke Ellington & His Orch\tPerfume Suite Part 2\tV-DISC\t516\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVB908-6.mp3\tCharlie Parker\tPerhaps\tSAVOY\t309\tB908-6\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_195.mp3\tFour Knights\tPeriod\tCapitol\t2847\t20361\t1954\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478361.mp3\tThe Comedian-harmonists\tPerpetual Motion\tELECTROLA / HMV / VI\t\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D204B.mp3\tAaftac Symphonette\tPerpetual Motion (strauss)\tV-DISC\t204B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC42569-1.mp3\tLouisiana Sugar Babes\tPersian Rug\tVICTOR\t21346\t42569-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400083-C.mp3\tDorsey Brothers Orchestra\tPersian Rug\tOKeh\t40995\t400083-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/ASCMA712.mp3\tMary Lou Williams Trio\tPersian Rug\tASCH\t351-2\tMA712\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic42569-1.mp3\tLouisiana Sugar Babes\tPersian Rug\tVictor\t21346\t42569-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP230y.mp3\tJohnny Mercer\tPersonality\tCAPITOL\t\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1781.mp3\tDinah Shore\tPersonality\tRCA\t20-1781\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18790A.mp3\tBing Crosby & Eddy Condon Orch\tPersonality\tDECCA\t18790A\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_013.mp3\tJohnny Mercer\tPersonality\tCapitol\t230\t761\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_132.mp3\tDinah Shore\tPersonality\tRCA\t20-1781\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUDAL-718-4.mp3\tCline's Collegians\tPeruna\tBRUNSWICK\t4162\tDAL-718-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_202.mp3\tRosemary Clooney\tPet Me, Poppa\tColumbia\t40579\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5482.mp3\tPete Brown Quintette\tPete Brown's Boogie\tSAVOY\t522A\tS5482\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC113.mp3\tPete Johnson's Allstars\tPete's Housewarming\tNATIONAL\t\tNSC113\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SES176.mp3\tPete Brown Quartet\tPete's Idea\tSESSION\t12012\t176\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC106.mp3\tPete Johnson's Allstars\tPete's Lonesome Blues\tNATIONAL\t\tNSC106\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69160.mp3\tPete Johnson\tPete's Mixture\tDECCA\t8582B\t69160\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70906-2.mp3\tGene Kardos & His Orch\tPeter And Paul (v D R)\tVICTOR\t22843\t70906-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO42939.mp3\tGene Autry\tPeter Cottontail\tCOLUMBIA\t38750\tCO42939\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_172.mp3\tGene Autry\tPeter Cottontail\tCOLUMBIA\t38750\tCO42939\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_294.mp3\tJimmy Wakely\tPeter Cottontail\tCapitol\t929\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_289.mp3\tFran Allison Feat. C/jack Fascinato\tPeter Cottontail\tRCA VICTOR\t3727\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC02102-1.mp3\tBenny Goodman And His Orchestra\tPeter Piper\tVICTOR\t25442B\t02102-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU20095-1.mp3\tRed Norvo's Orch\tPeter Piper (v M B)\tBRUNSWICK\t7767\t20095-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO3516.mp3\tRaymond Scott And His New Orch\tPetite\tCOLUMBIA\t35940\tCCO3516\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-171-1.mp3\tPierre Allier Et Son Orchestre (with Django Reinhardt)\tPetite Lili\tSWING\t126\tOSW-171-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-152-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tPetits Mensonges\tSWING\t103\tOSW-152-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC73074.mp3\tElla Fitzgerald And Louis Jordan\tPetootie Pie\tDECCA\t23546\t73074\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_446.mp3\tBilly Vaughn And His Orchestra\tPetticoats Of Portugal\tDot\t15506\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_117.mp3\tDick Jacobs And His Chorus And Orchestra\tPetticoats Of Portugal\tCoral\t61724\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4598.mp3\tLouis Jordan & His Tympani 5\tPettin' And Pokin'\tDECCA\t24527\tL4598\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1933_0411_01.mp3\tLee Morse And Her Bluegrass Boys\tPettin' In The Park (\"gold Diggers\")\tBluebird\tB5052B\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC2122-1.mp3\tCharlie Palloy & His Orch\tPettin' In The Park (v C P)\tCROWN\t3512\tC2122-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/Per14874ab.mp3\tJoe Candullo And His (new York Frolic) Orchestra\tPhantom Blues\tPerfect\t14874\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU78190-1.mp3\tJoe Venuti & His Orch\tPhantom Rhapsody\tBLUEBIRD\t5293\t78190-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic81788-2.mp3\tFletcher Henderson And His Orchestra\tPhanton Fantasie\tVictor\t24699\t81788-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/COLHCO1482-1483.mp3\tVictor Borge\tPhoenetic Punctuation\tCOLUMBIA\t36911\tHCO 1482 And 1483\t1946\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478363.mp3\tAlec Templeton\tPhonograph Record, Player Piano And Carmen Lombardo\tVICTOR\t\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_229.mp3\tPerry Como\tPianissimo\tRCA Victor\t2593\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU061301.mp3\tFreddie Martin And His Orchestra\tPiano Concerto In B Flat\tBLUEBIRD\t11211\t061301\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11211.mp3\tFreddy Martin & His Orchestra\tPiano Concerto In B Flat\tBluebird\t11211\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D263A.mp3\tFreddy Martin And His Orchestra\tPiano Concerto In B Flat (tchaikovsky)\tV-DISC\t263A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09646-1.mp3\tLionel Hampton & His Orch\tPiano Stomp (shine)\tVICTOR\t25666\t09646-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic09646-1.mp3\tLionel Hampton And His Orchestra\tPiano Stomp (shine)\tVictor\t25666\t09646-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC018413.mp3\tBunny Berigan & His Orch\tPiano Tuner Man\tVICTOR\t25776B\t018413\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2073.mp3\tColeman Hawkins\tPicasso\tMERCURY\t2073\t2073\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC55067-2.mp3\tTed Weems And His Orchestra\tPiccolo Pete\tVICTOR\t22037A\t55067-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic22037.mp3\tTed Weems & His Orchestra\tPiccolo Pete\tVictor\t22037\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE22677.mp3\tBlind Boy Fuller\tPiccolo Rag\tOKEH\t6437\t22677\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC051295.mp3\tH.ledbetter And Golden Gate Qt\tPick A Bale Of Cotton\tVICTOR\t27268\t051295\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67030.mp3\tWoody Herman & His Orchestra\tPick A Rib\tDECCA\t2979B\t67030\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC030774.mp3\tBenny Goodman Qt\tPick A Rib Part 1\tVICTOR\t26166\t030774\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC030775.mp3\tBenny Goodman Qt\tPick A Rib Part 2\tVICTOR\t26166\t030775\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRO11116-B.mp3\tFrisco Syncopators\tPick Me Up And Lay Me Down\tBroadway\t11116-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/PARL0824.mp3\tGeechie Wiley\tPick Poor Robin Clean\tPARAMOUNT\t13074B\tL0824\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA1136.mp3\tFred Astaire W Johnny Green\tPick Yourself Up\tCOLUMBIA\t3145 D\tLA1136\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89044h.mp3\tBenny Carter\tPick Yourself Up\tMERCURY\t89044\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC97712-1.mp3\tBenny Goodman & His Orch\tPick Yourself Up\tVICTOR\t25387\t97712-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_097.mp3\tFred Astaire\tPick Yourself Up\tBRUNSWICK\t7717\tLA1136\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe400884-C.mp3\tJoe Venuti's New Yorkers\tPickin' Cotton\tOKeh\t41087\t400884-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COL30152x.mp3\tBrownie Mcghee\tPickin' My Tomatoes\tCOLUMBIA\t30152\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU11134.mp3\tEddie Lang\tPickin' My Way\tBRUNSWICK\t6254\t11134\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe73084.mp3\tClarence Williams Blue Five\tPickin' On Your Baby (v Eva Taylor)\tOKeh\t40330\t73084\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-2983-A.mp3\tCab Calloway And His Orchestra\tPickin' The Cabbage\tVocalion\t5467\tWM-2983-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145627-2.mp3\tBessie Smith\tPickpocket Blues\tCOLUMBIA\t14304 D\tW145627-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_092.mp3\tMcguire Sisters\tPicnic\tCoral\t61627\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU073564-2.mp3\tAlvina Rey & His Orch\tPicnic In Purgatory\tBLUEBIRD\t11501\t073564-2\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC19752-1.mp3\tRed Norvo And His Orch\tPicture Me Without You (vm.bailey)\tARC\tBR7732\t19752-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLRR452.mp3\tLightnin' Hopkins\tPicture On The Wall\tALLADDIN\t3015\tRR452\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB2484.mp3\tRay Noble & His Orch\tPied Piper Of Hamblin\tVICTOR\t24034\tOB2484\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic055534-1.mp3\tLionel Hampton And His Orchestra\tPig Foot Sonata\tVictor\t26793\t055534-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC055534-1.mp3\tLionel Hampton & His Orch\tPig Foot Sonata (you Gotta See Mama Every Night)\tVICTOR\t26793\t055534-1\t1940\t\nhttp://www.78-tours.net/mp3/PACST1418-3.mp3\tOrchestre Du Balajo\tPigalle Collection Musette Club De France\tPACIFIC\tMC700\tST1418-3\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1010.mp3\tJimmie Lunceford & His Orch\tPigeon Walk\tDECCA\t1659B\tDLA1010\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA-1010-A.mp3\tJimmie Lunceford And His Orchestra\tPigeon Walk\tDecca\t1659\tDLA-1010-A\t1937\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3c/CONC3937-A.mp3\tBeale Street Washboard Band\tPiggly Wiggly\tCONQUEROR\t7980\tC3937-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU69326.mp3\tAllen Brothers\tPile Driving Papa\tBLUEBIRD\t5772\t69326\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU5772p.mp3\tAllen Brothers\tPile Driving Papa\tBLUEBIRD\t5772\t69326\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe73959-B.mp3\tClarence Williams Blue Five\tPile Of Logs And Stone (v Eva Taylor)\tOKeh\t8286\t73959-B\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COL41462x.mp3\tDoris Day\tPillow Talk\tCOLUMBIA\t41462\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA1971.mp3\tOrrin Tucker And His Orch\tPinch Me\tCOLUMBIA\t35328\tLA1971\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66940.mp3\tBob Crosby & His Orch\tPinch Me\tDECCA\t2924B\t66940\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81668-3.mp3\tBessie Smith\tPinchbacks, Take 'em Away\tCOLUMBIA\t14025 D\t81668-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/CONC1996-2.mp3\tBukka White\tPine Bluff, Arkansas\tCONQUEROR\t9072\tC1996-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC066119.mp3\tAlbert Ammons & Pete Johnson\tPine Creek Boogie\tVICTOR\t27506\t066119\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1843-1.mp3\tBuster Bailey & Ho\tPine Top's Boogie Woogie\tVARSITY\t8365\tUS1843-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_271.mp3\tJohnny Desmond - Eileen Barton And The Mcguire Sisters\tPine Tree, Pine Over Me\tCORAL\t61125\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/WES110x.mp3\tLu Watters's Yerba Buena Jazz B\tPineapple Rag\tWest Coast\t110\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23843x.mp3\tBing Crosby And Lionel Hampton\tPinetop's Boogie Woogie\tDECCA\t23843\t23843x\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAVI20-1583.mp3\tPinetop Smith\tPinetop's Boogie Woogie\tRCA\t20-1583\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/SUPC3540.mp3\tPinetop Smith\tPinetop's Boogie Woogie\tSUPERTONE\t2216s\tC3540\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68621.mp3\tLouis Jordan & His Tympani 5\tPinetop's Boogie Woogie\tDECCA\t8525\t68621\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73287-A.mp3\tBing Crosby And Lionel Hampton And His Orchestra\tPinetop's Boogie Woogie\tDecca\t23843\t73287-A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68333-A.mp3\tJoe Turner And His Fly Cats\tPiney Brown Blues\tDECCA\t29711\t68333-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68333.mp3\tJoe Turner & His Flycats\tPiney Brown Blues\tDECCA\t18121B\t68333\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL5758.mp3\tLionel Hampton's Orch\tPink Champagne\tDECCA\t27164\tL5758\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5758.mp3\tLionel Hampton And His Orchestra\tPink Champagne\tDecca\t27164\tLA-5758\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW265069.mp3\tJoe Venuti's Blue Five\tPink Elephants\tCOLUMBIA\t\tW265069\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12450-A.mp3\tGuy Lombardo Royal Canadians\tPink Elephants\tBRUNSWICK\t6399\t12450-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC73577.mp3\tGeorge Olsen & His Music\tPink Elephants (v F F)\tVICTOR\t24138A\t73577\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47069.mp3\tSarah Vaughan\tPinky\tCOLUMBIA\t39634\tCO47069\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D145B.mp3\tRoy Acuff And His Smokey Mountain Boys\tPins And Needles\tV-DISC\t145B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_122.mp3\tBob Atcher And Bonnie Blue Eyes\tPins And Needles (in My Heart)\tOKEH\t6689\tCCO4243\t1943\t\nhttp://www.jazz-on-line.com/a/mp3h/DECF9983.mp3\tTed Heath And His Music\tPiper's Patrol\tDECCA-LONDON\tF9983\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3197.mp3\tBing Crosby And Andrews Sisters\tPistol Packin' Mama\tDECCA\t23277\tL3197\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke6708.mp3\tAl Dexter & His Troopers\tPistol Packin' Mama\tOkeh\t6708\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH741-1.mp3\tAl Dexter And His Troopers\tPistol Packin' Mama\tOKEH\t6708\tH741-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC23277A.mp3\tBing Crosby & Andrews Sisters\tPistol Packin' Mama\tDECCA\t23277A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D104A2.mp3\tDon Redman And His Orchestra\tPistol Packin' Mama\tV-DISC\t104A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_014.mp3\tBing Crosby And Andrews Sisters\tPistol Packin' Mama\tDECCA\t23277A\tDLA3197\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_011.mp3\tAl Dexter And His Troopers\tPistol Packin' Mama\tOKEH\t6708\tH741-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/COL22674-1.mp3\tBlind Boy Fuller\tPistol Slappin' Blues\tCOLUMBIA\t37781\t22674-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/COMA4842.mp3\tJack Teagarden Swinging Gates\tPitchin' A Bit Short\tCOMMODORE\t1521\tA4842\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC053504.mp3\tDuke Ellington (piano)\tPitter Panther Patter\tVICTOR\t27221B\t053504\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47334.mp3\tGuy Mitchell\tPittsburgh Pennsylvania\tCOLUMBIA\t39663\tCO47334\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO36519.mp3\tBenny Goodman & His Orch\tPity The Poor Lobster\tCOLUMBIA\t37077\tCO36519\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16194.mp3\tDjango Reinhardt Et Son Grand Orchestre Fud Candrix Et Son Orchestre\tPlace De Brouckere\tRythme\tD5030\t16194\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-359-1.mp3\tDjango Reinhardt Et Son Orchestre\tPlace De Brouckre\tSWING\t166\tOSW-359-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480422.mp3\tLionel Hampton And His Giants\tPlaid\tNorgran\tEPN143\t2489-2\t1955\tHarry ??Sweets?? Edison (tp), Lionel Hampton (vib), Art Tatum (p), Barney Kessel (g), Red Callender (sb), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3a/VIC57064-2.mp3\tMckinney's Cotton Pickers\tPlain Dirt\tVICTOR\t38097\t57064-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17762.mp3\tLouis Prima & His Gang\tPlain Old Me\tBRUNSWICK\t7499\t17762\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_142.mp3\tLenny Dee\tPlantation Boogie\tDecca\t29360\t87001\t1955\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC87001.mp3\tLenny Dee\tPlantation Boogie\tDECCA\t29360\t87001\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe9903.mp3\tLuis Russell Heebie Jeebie St\tPlantation Joys\tOKeh\t8424\t9903\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152457.mp3\tJack Teagarden & His Orch\tPlantation Moods\tCOLUMBIA\t2913 D\tW152457\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC86220-1.mp3\tFrankie Trumbauer & His Orch\tPlantation Moods\tVICTOR\t24834\t86220-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM758.mp3\tBuster Bailey Rhythm Busters\tPlanter's Punch\tVOCALION\t4089\tM758\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MERC278-6.mp3\tColeman Hawkins & Allstars\tPlatinum Love\tMERCURY\t8909\tC278-6\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE31643.mp3\tCount Basie And His Orch\tPlatterbrains\tOKEH\t6508\t31643\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLAP-104-2.mp3\tKatie Crippen Cocal Ac. By Henderson's Novelty Orchestra\tPlay 'em For Mama, Sing 'em For Me\tBlack Swan\t2003\tP-104-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC27112x.mp3\tGary Crosby And Friend\tPlay A Simple Little Melody\tDECCA\t27112\t27112x\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_020.mp3\tGary Crosby And Friend\tPlay A Simple Melody\tDecca\t27112\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_272.mp3\tGeorgia Gibbs Feat. Bob Crosby Orchestra\tPlay A Simple Melody\tCoral\t60227\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_328.mp3\tPhil Harris\tPlay A Simple Melody\tRCA Victor\t3781\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW152323.mp3\tTed Lewis & His Band\tPlay Fiddle Play\tCOLUMBIA\t2728 D\tW152323\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC73840-1.mp3\tGeorge Olsen & His Music\tPlay Fiddle Play\tVICTOR\t24165\t73840-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5780.mp3\tSlam Stewart Qt\tPlay Fiddle, Play\tSAVOY\t537A\tS5780\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_423.mp3\tJaye P. Morgan\tPlay For Keeps\tRCA\t6505\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_046.mp3\tJohnny Desmond\tPlay Me Hearts And Flowers (i Wanna Cry)\tCoral\t61379\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC31209-3.mp3\tJean Goldkette & His Orch\tPlay Me Slow\tVICTOR\t19664\t31209-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140357-3.mp3\tFletcher Henderson & His Orch\tPlay Me Slow\tCOLUMBIA\t292D\t140357-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/DIAD1091-C.mp3\tErroll Garner\tPlay Piano Play\tDIAL\t1026A\tD1091-C\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_020.mp3\tAmerican Quartet Feat. Billy Murray\tPlay That Barber-shop Chord\tVictor\t5799\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3a/COL04849-1.mp3\tBert Williams\tPlay That Barbershop Chord\tCOLUMBIA\tA-0929\t04849-1\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC26132.mp3\tCharles Harrison\tPlay That Song Of India Again\tVICTOR\t18877\t26132\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_038.mp3\tCharles Harrison\tPlay That Song Of India Again\tVICTOR\t18877\t26132\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/PARP1502-2.mp3\tOllie Powers Harmony Syncopats\tPlay That Thing\tPARAMOUNT\t12059\tP1502-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/MONV-5799d.mp3\tBilly Murray\tPlay The Barbershop Chord\tMONARCH\tV-5799\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_124.mp3\tBbc Dance Orchestra Dir. By Henry Hall\tPlay To Me, Gypsy\tCOLUMBIA\t2910-D\t131153\t1934\tLes Allen (vo), Frank Wilson, Arthur Williams (tp), Bill Mulraney, Eric Tann (tb), Burton Gillis, Freddy Williams (cl, as), Eddie Cromar (cl, as, bar), Jack Halsall (cl, ts), Joseph Hitchenor, Cyril Hellier (vn), Eddie Carroll (p), George Dickinson (g), Theo Farrar (sb, bb), Len Bermon (dm)\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45109.mp3\tErroll Garner Trio\tPlay, Piano, Play\tCOLUMBIA\t39276\tCO45109\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/CorL-4287-.mp3\tLionel Hampton And His Orchestra\tPlayboy\tCoral\t6.22116\tL-4287-\t1946\tLionel Hampton vib dir. Joe Wilder Richard ''Duke'' Garrette Leo Sheppard  Joe Morris Wendell Culley Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb Johnny Griffin ts, Charlie fowlkes bar\nhttp://www.jazz-on-line.com/a/mp3c/APO372PB.mp3\tWynonie Harris\tPlayful Baby\tAPOLLO\t372\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D1120.mp3\tCount Basie & His Orchestra\tPlayhouse No.2 Stomp\tV-DISC\t439\t1120\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62336-1.mp3\tFess Williams Royal Flush Orch\tPlaying My Saxophone\tVICTOR\t24153\t62336-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe400277-B.mp3\tLonnie Johnson\tPlaying With The Strings\tOKeh\t8558\t400277-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26468-A.mp3\tKay Kyser And His Orchestra Vocal Sully Mason\tPlaymates\tCOLUMBIA\t35375\t26468-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_194.mp3\tMitchell Ayres And His Fashions In Music\tPlaymates\tBluebird\t10585\t046458-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_099b.mp3\tFontane Sisters\tPlaymates\tDot\t15370\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUSF11.mp3\tBing Crosby\tPlease\tBRUNSWICK\t6394\tSF11\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D128A1.mp3\tBing Crosby\tPlease\tV-DISC\t128A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_291.mp3\tBing Crosby\tPlease\tDECCA\t25502\tDLA2073\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC73575.mp3\tGeorge Olsen & His Music\tPlease (v B B)\tVICTOR\t24139B\t73575\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC021127.mp3\tBenny Goodman And His Orchestra\tPlease Be Kind\tVICTOR\t25814\t021127\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47019.mp3\tDuke Ellington And His Orchestra\tPlease Be Kind\tCOLUMBIA\t39545\tCO47019-1\t1951\tSax. Solo - Willie Smith - Cat Anderson, Nelson Williams, Harold \"Shorty\" Baker (tp) Ray Nance (tp,vln,vcl) Quentin Jackson, Britt Woodman, Juan Tizol (tb) Jimmy Hamilton (cl,ts) Russell Procope (as,cl) Willie Smith (as) Paul Gonsalves (ts) Harry Carney (bar,cl,b-cl) Duke Ellington (p) Billy Strayhorn (p-1) Wendell Marshall (b) Louie Bellson (d) Al Hibbler (vcl)\nhttp://www.jazz-on-line.com/a/mp3d/DECDR-2904-1.mp3\tDjango Reinhardt\tPlease Be Kind\tDECCA\tF-6828\tDR-2904-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC63268.mp3\tBob Crosby & His Orch\tPlease Be Kind\tDECCA\t1693\t63268\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic021055-2.mp3\tMaxine Sullivan With Claude Thornhill And Orchestra\tPlease Be Kind\tVictor\t25802\t021055-2  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_221.mp3\tBob Crosby And His Orchestra Feat. V/kay Weber\tPlease Be Kind\tDECCA\t1693\t63268\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480590.mp3\tArt Tatum And Lionel Hampton\tPlease Be Kind\tPablo\t2310-775\t2379-1\t1955\tLionel Hampton (vib) Art Tatum (p) Buddy Rich (d)\nhttp://www.jazz-on-line.com/a/mp3w/1938_260.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tPlease Be Kind\tVICTOR\t25814\t021127\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22518.mp3\tEarl Hines & His Orch\tPlease Be Kind (v Ida James)\tVOCALION\t4008\t22518\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18599.mp3\tWingy Manone & His Orch\tPlease Believe Me\tARC\tVO3159\t18599\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98379.mp3\tTommy Dorsey & His Orch\tPlease Believe Me\tVICTOR\t25217\t98379\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/MelE-35949-A.mp3\tMills Music Masters\tPlease Do\"t Talk About Me When I'm Gone-v C L\tMelotone\tM- 12091\tE-35949-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/PER12707-A.mp3\tGus Van\tPlease Don't Cut Out My Sau\tPerfect\t12707-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU87640-1.mp3\tBo Chatmon (harry Carter)\tPlease Don't Do It No More\tBLUEBIRD\t6009\t87640-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_305.mp3\tFontane Sisters\tPlease Don't Leave Me\tDot\t15501\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO40378.mp3\tGeorge Morgan\tPlease Don't Let Me Love You\tCOLUMBIA\t20547\tCO40378\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2464.mp3\tGene Krupa & His Orch\tPlease Don't Play Number 6 Tonight\tCOLUMBIA\t37968\tHCO2464\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053210.mp3\tHarlan Leonard & His Rockets\tPlease Don't Squabble\tBLUEBIRD\t10899\t053210\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_024.mp3\tElsie Baker\tPlease Don't Take My Lovin' Man Away\tVICTOR\t17102\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPdspdtam.mp3\tDinning Sisters\tPlease Don't Talk About Me\tCAPITOL\t\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151299-3.mp3\tEthel Waters And Her Ebony 4\tPlease Don't Talk About Me When I'm Gone\tCOLUMBIA\t2409 D\tW151299-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4388.mp3\tDoris Day - Frank Comstock Or.\tPlease Don't Talk About Me When I'm Gone\tCOLUMBIA\t39197\tHCO4388\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_039.mp3\tGene Austin\tPlease Don't Talk About Me When I'm Gone\tVictor\t22635\t64863-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64863-1.mp3\tGene Austin\tPlease Don't Talk About Me When I'm Gone\tVICTOR\t22635\t64863-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4538.mp3\tErroll Garner\tPlease Don't Talk About Me When I'm Gone\tCOLUMBIA\t39681\tHCO4538\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC67486-2.mp3\tBert Lown Biltmore Hotel Orch\tPlease Don't Talk About Me When I'm Gone\tVICTOR\t22652\t67486-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23427PDO.mp3\tEddie Heywood & His Orchestra\tPlease Don't Talk About Me When I'm Gone\tDECCA\t23427\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC67486-2HD2-6.mp3\tBert Lown And His Orchestra\tPlease Don't Talk About Me When I'm Gone\tVICTOR\t22652\t67486-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/CRO1234-4.mp3\tEubie Blake And His Orchestra\tPlease Don't Talk About Me When I'm Gone\tCROWN\t3090A\t1234-4\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_116.mp3\tBert Lown And His Orchestra\tPlease Don't Talk About Me When I'm Gone\tVICTOR\t22652\t67486-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_404.mp3\tJohnnie Ray\tPlease Don't Talk About Me When I'm Gone\tCOLUMBIA\t40090\tRHCO10322\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec66879-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tPlease Don't Talk About Me When I'm Gone\tDecca\t3033\t66879-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/RCAE4VH-0797-b.mp3\tDick Collins And The Runaway Herd\tPlease Don't Talk About Me When I'm Gone\tRCA VICTOR\t547-0459\tE4VH-0797-b\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe9904.mp3\tLuis Russell Hot Six\tPlease Don't Turn Me Down\tOKeh\t8424\t9904\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93694.mp3\tRice Brothers Gang\tPlease Dont Stay Away\tDECCA\t6088\tC93694\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_322.mp3\tTony Bennett With Percy Faith And His Orch.\tPlease Driver (once Around The Park Again)\tCOLUMBIA\t40213\tCO50409\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUM882-2.mp3\tDuke Ellington's Famous Orch\tPlease Forgive Me\tBRUNSWICK\t8256\tM882-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec75752.mp3\tLionel Hampton And His Orchestra\tPlease Give Me A Chance\tDecca\t27401\t75752\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146896-2.mp3\tBessie Smith\tPlease Help Me Get Him Off My Mind\tCOLUMBIA\t14375 D\tW146896-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03843-1.mp3\tFats Waller And His Rhythm\tPlease Keep Me In Your Dreams\tVICTOR\t25498\t03843-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS20509-2.mp3\tBillie Holiday\tPlease Keep Me In Your Dreams\tCBS\tVO3440\t20509-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_223.mp3\tBillie Holiday\tPlease Keep Me In Your Dreams\tCBS\tVO3440\t20509-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102774.mp3\tHartman's Heartbreakers\tPlease Mr Moon, Don't Tell On Me\tBLUEBIRD\t6516\t102774\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47223.mp3\tJohnnie Ray\tPlease Mr Sun\tCOLUMBIA\t39636\tCO47223\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_089.mp3\tPerry Como\tPlease Mr. Sun\tRCA Victor\t4453\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT510.mp3\tLouis Prima & His Orchestra\tPlease No Squeeza Da Banana\tMAJESTIC\t7135\tT510\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/KinK-5980.mp3\tLucky Millinder And His Orchestra\tPlease Open Your Heart\tKing\t4419\tK-5980  \t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21460-2.mp3\tArtie Shaw And His New Music\tPlease Pardon Us We're In Love (v P. Lacentra)\tBRUNSWICK\t7942\tB-21460-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL688.mp3\tLee O'daniel Hillbilly Boys\tPlease Pass The Biscuits,pappy\tVOCALION\t4727\tDAL688\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic23786.mp3\tAllen Brothers\tPlease Pay In Advance\tVictor\t23786\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC74815-1.mp3\tAllen Bros\tPlease Pay In Advance\tVICTOR\t23786\t74815-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/VarM-430-1.mp3\tLucky Millinder With Mills Blue Rhythm Band\tPlease Pity My Heart\tVariety\t\tM-430-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_142.mp3\tDon Cornell Feat. Norman Leyden's Orchestra\tPlease Play Our Song (mister Record Man)\tCoral\t61030\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/COL28008-A.mp3\tJimmie Lunceford & His Orch\tPlease Say The Word\tCOLUMBIA\t35625\t28008-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Col28008-A.mp3\tJimmie Lunceford And His Orchestra\tPlease Say The Word\tColumbia\t35625\t28008-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/SPE375x.mp3\tPercy Mayfield\tPlease Send Me Someone To Love\tSPECIALTY\t375\t375\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_333.mp3\tPercy Mayfield\tPlease Send Me Someone To Love\tSPECIALTY\t375\t375\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic40098-2.mp3\tThomas Waller With Morris's Not Babies\tPlease Take Me Out Of Jail\tVictor\t21202\t40098-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24857.mp3\tBillie Holiday\tPlease Tell Me Now\tDECCA\t24857\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66136.mp3\tElla Fitzgerald & Her Orch\tPlease Tell The Truth\tDECCA\t2769A\t66136\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_083.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. Ralph Young\tPlease Think Of Me\tBluebird\t0807\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68292.mp3\tBuddy Johnson & His Band\tPlease, Mr Johnson\tDECCA\t8507A\t68292\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1899_018.mp3\tByron G. Harlan\tPlease, Mr. Conductor, Don't Put Me Off This Train\tEdison\t7219\t\t1899\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_189.mp3\tTommy Edwards Feat. O/leroy Holmes\tPlease, Mr. Sun\tMGM\t11134A\t51S401\t1952\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic55855-2.mp3\tHerny ''red'' Allen And His New York Orchestra\tPleasin' Paul\tVictor\tV-38107\t55855-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL125.mp3\tHelen Humes & Her Allstars\tPleasing Man Blues\tALLADDIN\t125\t?\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK5547.mp3\tLonnie Johnson\tPleasing You (as Long As I Live)\tKING\t4245A\tK5547\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_125.mp3\tJohnny Ace\tPledging My Love\tDuke\t136\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_131.mp3\tTeresa Brewer\tPledging My Love\tCoral\t61362\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe81866-C.mp3\tFred Hall & His Sugar Babies\tPlenty Of Sunshine (v A F)\tOKeh\t40986\t81866-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S6073.mp3\tBob Wills And His Texas Playboys\tPliney Jane\tMGM\t11024\t51S6073\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWM1121.mp3\tDuke Ellington+jimmy Blanton\tPlucked Again\tCOLUMBIA\t35322\tWM1121\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CONM1067-A.mp3\tCab Calloway & His Orch\tPluckin' The Bass\tCONQUEROR\t9465\tM1067-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1007-1.mp3\tRoy Eldridge & His Orch\tPluckin' The Bass\tVARSITY\t8107\tUS1007-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1067-A.mp3\tCab Calloway And His Orchestra\tPluckin' The Bass\tVocalion\t5406\tWM-1067-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21909-A.mp3\tHigh Hatters\tPlucky Lindy's Lucky Day\tVictor\t21909-A\t\t\t\nhttp://www.78-tours.net/mp3/GRAOLA3605.mp3\tJacques Metehen Et Son Orchestre\tPlus Qu'un Amour\tGRAMOPHONE\tK-8528\tOLA. 3605\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VOCWM-1046-A.mp3\tBenny Carter And His Orchestra\tPlymount Rock\tVOCALION\t4984\tWM-1046-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3202.mp3\tBing Crosby - J.s.trotter\tPoinciana\tDECCA\t18586A\tL3202\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27888.mp3\tDavid Rose & His Orchestra\tPoinciana\tVictor\t27888\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC27888.mp3\tDavid Rose\tPoinciana\tVICTOR\t27888\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP93.mp3\tBenny Carter & His Orchestra\tPoinciana\tCAPITOL\t\t93\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC18586A.mp3\tBing Crosby\tPoinciana\tDECCA\t18586A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D242B.mp3\tJohnny Desmond With Glenn Miller\tPoinciana\tV-DISC\t242B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_181.mp3\tSteve Lawrence\tPoinciana\tKING\t15185A\tK8221-X-1\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_103.mp3\tBenny Carter And His Orchestra\tPoinciana\tCapitol\t144\t93-A\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap93-A.mp3\tBenny Carter And His Orchestra\tPoinciana\tCapitol\t144\t93-A\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_029.mp3\tBing Crosby Feat. John Scott Trotter's Orchestra\tPoinciana (song Of The Tree)\tDECCA\t18586A\t18586A\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_092.mp3\tDavid Rose And His Orchestra\tPoinciana (song Of The Tree)\tVICTOR\t27888\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_101.mp3\tStan Freberg Feat. Daws Butler\tPoint Of Order\tCapitol\t2838\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA21-0377x.mp3\tJohnnie And Jack\tPoison Love\tRCA\t21-0377\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU071055.mp3\tRoy Hall Happy Valley Boys\tPolecat Blues\tBLUEBIRD\t8863\t071055\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/PARG15463.mp3\tBlind Blake\tPolice Dog Blues\tPARAMOUNT\t12888A\tG15463\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh208.mp3\tPeatie Wheatstraw\tPolice Station Blues\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC90158.mp3\tKokomo Arnold\tPolicy Wheel Blues\tDECCA\t7147\t90158\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480387.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tPolitely\tRCA\t430043\t\t1959\tArt Blakey, D, Benny Golson, Ts, Lee Morgan, T,: Jymie Merritt, B, Bobby Timmons, P\nhttp://www.jazz-on-line.com/a/mp3a/DECC9298.mp3\tNoble Sissle And His Orch.\tPolka Dot Rag\tDECCA\t153B\tC9298\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38335.mp3\tClaude Thornhill\tPolka Dots And Moonbeams\tCOLUMBIA\t38347\tCO38335\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8927.mp3\tLester Young Qt\tPolka Dots And Moonbeams\tMERCURY\t8927\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_266.mp3\tTommy Dorsey Orch V Frank Sinatra\tPolka Dots And Moonbeams\tVICTOR\t26539\t047747\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC047747.mp3\tTommy Dorsey And His Orch\tPolka Dots And Moonbeams (vfs)\tVICTOR\t26539\t047747\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047093.mp3\tGlenn Miller & His Orch\tPolka Dots And Moonbeams (vre)\tBLUEBIRD\t10657 A\t047093\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036944.mp3\tErskine Hawkins & His Orch\tPolka Dotty\tBLUEBIRD\t10287\t036944\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI7350-C.mp3\tPremier Quartette (incl. Billy Murray) - O\tPolly\tEDISON\tBA 4112\t7350-C\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143019.mp3\tGid Tanner's Skillet Lickers\tPolly Woddle Doo\tCOLUMBIA\t15200 D\tW143019\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC60301.mp3\tRed Norvo & His Orchestra\tPolly Wolly Doodle\tDECCA\t670A\t60301\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec67782-A.mp3\tBenny Carter And His Orchestra\tPom Pom\tDecca\t3262B\t67782-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67782-A.mp3\tBenny Carter\tPom Pom\tDecca\t3262\t67782-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147390-3.mp3\tBroadway Nitelites\tPompanola\tCOLUMBIA\t1622 D\tW147390-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2540x.mp3\tCharlie Barnet\tPompton Turnpike\tRCA\t20-2540\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68170-A.mp3\tLouis Jordan & His Tympani 5\tPompton Turnpike\tDECCA\t8500\t68170-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D307A2.mp3\tCharlie Barnet And His Orchestra\tPompton Turnpike\tV-DISC\t307A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_028.mp3\tCharlie Barnet And His Orchestra\tPompton Turnpike\tAPOLLO\t1105\tAP3199\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59644-1.mp3\tJelly Roll Morton Peppers\tPontchartrain Blues\tVICTOR\t38125\t59644-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/PARG15216.mp3\tCharley Patton\tPony Blues\tPARAMOUNT\t12792A\tG15216\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS3459.mp3\tBrownie Mcghee\tPoor Boy Blues\tSAVOY\t5565\tS3459\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35605y.mp3\tVictor Military Band\tPoor Butterfly\tVICTOR\t35605\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26719.mp3\tBenny Goodman Sextet\tPoor Butterfly\tCOLUMBIA\t35466\t26719\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042772-2.mp3\tRed Nichols & His Orch\tPoor Butterfly\tBLUEBIRD\t10522\t042772-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/ARA1041-1B.mp3\tArt Tatum\tPoor Butterfly\tARA\t4502A\tARA1041-1B\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5245.mp3\tHerman Chittison Trio\tPoor Butterfly\tMUSICRAFT\t323\t5245\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44027.mp3\tErroll Garner Trio\tPoor Butterfly\tCOLUMBIA\t39145\tCO44027\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC41680-2.mp3\tPaul Whiteman And His Orchestra\tPoor Butterfly\tVICTOR\t24078\t41680-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_078.mp3\tHilltoppers\tPoor Butterfly\tCORAL\tDOT15156\t()\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_118.mp3\tFritz Kreisler\tPoor Butterfly\tVICTOR\t64655\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_002.mp3\tVictor Military Band\tPoor Butterfly\tVICTOR\t35605\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62873-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tPoor Butterfly\tDecca\t1663\t62873-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-6799-2.mp3\tValaida (queen Of The Trumpet) With Billy Mason And His Orchestra\tPoor Butterfly\tParlophone\t\tCE-6799-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-124-1.mp3\tElisabeth Welch\tPoor Butterfly\tVocalion\t526\tS-124-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0125_04.mp3\tLee Morse And Her Bluegrass Boys\tPoor Butterfly Waits For Me\tColumbia\t1328DB\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE21806.mp3\tDykes Magic City Trio\tPoor Ellen Smith\tBRUNSWICK\t127\tE21806\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC3518.mp3\tJarvis & Justice\tPoor Girl Waltz\tBRUNSWICK\t333\tC3518\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404048-C.mp3\tLuis Russell & His Orch\tPoor Lil Me\tOKeh\t8830\t404048-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_085.mp3\tAll-star Trio\tPoor Little Butterfly Is A Fly Gal Now\tVICTOR\t18641\t23558\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10444.mp3\tJimmy Boyd & Frankie Laine\tPoor Little Piggy Bank\tCOLUMBIA\t40069\tRHCO10444\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_157.mp3\tGuy Lombardo And His Royal Canadians\tPoor Little Rhode Island\tDecca\t18651\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146895-1.mp3\tBessie Smith\tPoor Man's Blues\tCOLUMBIA\t14399 D\tW146895-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62480.mp3\tSleepy John Estes\tPoor Man's Friend\tDECCA\t7442\t62480\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14757-1.mp3\tCharlie Patton\tPoor Me\tARC\tVO2651z\t14757-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/IMP5369x.mp3\tFats Domino\tPoor Me\tIMPERIAL\t5369\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban10590-3.mp3\tBlue Ribbon Boys\tPoor Minnie The Moocher V C B\tBanner\t32166\t10590-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66984.mp3\tLouis Armstrong & His Orch.\tPoor Old Joe\tDECCA\t3011B\t66984\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1723.mp3\tBing Crosby & Spike Jones 4\tPoor Old Rover\tDECCA\t2385B\tDLA1723\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC34639-1.mp3\tJack Smith\tPoor Papa\tVICTOR\t19998\t34639-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0216_02.mp3\tLee Morse\tPoor Papa\tPathe\t25174B\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_107.mp3\tArthur Fields\tPoor Pauline\tCOLUMBIA\tA-1626\t39594\t1915\t\nhttp://www.jazz-on-line.com/mp3/840094923.mp3\tBenny Goodman And His Orchestra\tPop Corn Man\tVICTOR\t25808\t015538\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D271A2.mp3\tClaude Thornhill And His Orchestra\tPop Goes The Weasel\tV-DISC\t271A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC38764.mp3\tTed Lewis & His Band\tPop Goes Your Heart\tDECCA\t239A\t38764\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_250.mp3\tHudson-delange Orchestra\tPopcorn Man\tBRUNSWICK\t8007\tM542-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT823.mp3\tSlim Gaillard & His Orch\tPopity Pop\tMAJESTIC\t9001\tT823\t1945\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol36422.mp3\tKay Kyser & His Orchestra\tPopocatepetl\tColumbia\t36422\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/COL3529.mp3\tVess Ossman (banjo)\tPopularity March 2 Step\tCOLUMBIA\tA-0892\t3529\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_212.mp3\tVic Damone\tPor Favor\tMercury\t70699\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150159-2.mp3\tEthel Waters & Her Ebony 4\tPorgy\tCOLUMBIA\t2184 D\tW150159-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC24638y.mp3\tBillie Holiday\tPorgy\tDECCA\t24638\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-12784-A.mp3\tEthel Waters With Duke Ellington And His Famous Orchestra\tPorgy\tBrunswick\t6521\tB-12784-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_164.mp3\tNelson Riddle And His Orchestra\tPort Au Prince\tCapitol\t5574\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUGM515-A.mp3\tPort Of Harlem Jazzmen\tPort Of Harlem Blues\tBLUENOTE\t014\tGM515-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MER89001x.mp3\tIllinois Jacquet And His Orch\tPort Of Rico - One Night Boogie\tMERCURY\t89001\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/DECFO-1782-RB.mp3\tDjango Reinhardt Et Son Quintette Du Hot Club De France\tPorto Cabello\tDECCA\t9242\tFO-1782-RB\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM1006-1.mp3\tDuke Ellington And His Famous\tPortrait Of The Lion\tBRUNSWICK\t8365\tM1006-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_149.mp3\tJoe ''fingers'' Carr\tPortuguese Washerwoman\tCapitol\t3418\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU21375.mp3\tRed Norvo And His Orch\tPosin (v Mildred Bailey)\tBRUNSWICK\t7928\t21375\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010563.mp3\tTommy Dorsey & His Clambake 7\tPosin'\tVICTOR\t25605\t010563\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-1956-1.mp3\tFletcher Henderson And His Orchestra\tPosin'\tVocalion\t3627\tC-1956-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62344-A.mp3\tJimmie Lunceford And His Orchestra\tPosin'\tDecca\t1355\t62344-A\t1937\tJimmie Lunceford dir. Eddie Tompkins-Paul Webster/Sy Oliver-t-v-a/Elmer Crumbley- Russell Bowles-tb/Eddie Durharn tb-g-a/Willie Smith-cI-as-bar-v-a/Ed Brown as/Dan  Grissom-cl-as-v/Earl Carruthers-cl-as-bar/Joe Thomas-cl-ts/Edwin Wilc ox -p-cel-a/Al \nhttp://www.jazz-on-line.com/a/mp3w/1937_101.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tPosin'\tVICTOR\t25605\t010563\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38752-4.mp3\tJan Garber & His Orch\tPositively Absolutely\tVICTOR\t20676A\t38752-4\t1927\t\nhttp://www.jazz-on-line.com/mp3/690867662.mp3\tGallagher And Shean\tPositively Mr Gallagher\tVICTOR\t18941A\t26728-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE23520.mp3\tSix Jumping Jacks\tPositively, Absolutely (vts)\tBRUNSWICK\t3582\tE23520\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146056-2.mp3\tGid Tanner's Skillet Lickers\tPossum Hunt On Stump House Mountain Part 1\tCOLUMBIA\t15298 D\tW146056-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146057-1.mp3\tGid Tanner's Skillet Lickers\tPossum Hunt On Stump House Mountain Part 2\tCOLUMBIA\t15298 D\tW146057-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/PAR20554-2.mp3\tWisconsin Skyrockets\tPostage Stomp\tPARAMOUNT\t12642\t20554-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK5670-1C.mp3\tTodd Rhodes And His Orch\tPot Likker\tKING\t4287A\tK5670-1C\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP5028.mp3\tLouis Armstrong And His Hot Seven\tPotato Head Blues\tCOLUMBIA\t39239\tZSP5028\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE80855-C.mp3\tLouis Armstrong And His Hot Seven\tPotato Head Blues\tOKEH\t8503\t80855-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_140.mp3\tLouis Armstrong And His Hot Seven\tPotato Head Blues\tOKEH\t8503\t80855-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COL30231x.mp3\tCount Basie And His Orch\tPound Cake\tCOLUMBIA\t30231\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/ColWC-2597-C.mp3\tCount Basie And His Orchestra\tPound Cake\tColumbia\t5085\tWC-2597-C  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-167-1.mp3\tDjango Reinhardt\tPour Commencer\tSWING\t102\tOSW-167-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/MERYB9444.mp3\tBilly Williams\tPour Me A Glass Of Teardrops\tMERCURY\t70094\tYB9444\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-166-1.mp3\tChristian Wagner Et Son Orchestre (with Django Reinhardt)\tPour Terminer\tSWING\t102\tOSW-166-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-147-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tPour Vous\tSWING\t118\tOSW-147-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC74623.mp3\tEvelyn Knight And Stardusters\tPowder Your Face With Sunshine\tDECCA\t24530A\t74623\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_147.mp3\tDoris Day And Buddy Clark Feat. George Siravo's Orchestra\tPowder Your Face With Sunshine (smile! Smile! Smile!)\tCOLUMBIA\t38394\tHCO3484\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28620-2.mp3\tBillie Holiday\tPractice Makes Perfect\tOKEH\t5806\t28620-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_046.mp3\tBob Chester And His Orchestra\tPractice Makes Perfect\tBLUEBIRD\t10838\t054670\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26912.mp3\tEddie South & His Orch\tPraeludium And Allegro\tCOLUMBIA\t35636\t26912\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU73325.mp3\tJimmie Rodgers\tPrairie Lullaby\tBLUEBIRD\t5076\t73325\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61813.mp3\tJimmie Davis\tPrairie Of Love\tDECCA\t5336\t61813\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2075-A.mp3\tBing Crosby\tPrairieland Lullaby\tDECCA\t3388B\tDLA2075-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU058808.mp3\tGlenn Miller & His Orch\tPrairieland Lullaby (vre)\tBLUEBIRD\t11011-B\t058808\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO904.mp3\tKay Kyser And His Orchestra\tPraise The Lord And Pass The Ammunition\tCOLUMBIA\t36640\tHCO904\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL36640.mp3\tKay Kyser & His Orchestra\tPraise The Lord And Pass The Ammunition\tCOLUMBIA\t36640\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_010.mp3\tKay Kyser And His Orchestra\tPraise The Lord And Pass The Ammunition\tCOLUMBIA\t36640\tHCO904\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_049.mp3\tMerry Macs\tPraise The Lord And Pass The Ammunition\tDECCA\t18498A\tL3152\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe9950-A.mp3\tBertha Chippie Hill\tPratt City Blues\tOKeh\t8420\t9950-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/COL47217.mp3\tAl Jolson\tPray For Sunshine\tCOLUMBIA\tA-2169\t47217\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_043.mp3\tAl Jolson\tPray For Sunshine\tCOLUMBIA\tA-2169\t47217\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4695.mp3\tEddie Condon & His Band\tPray For The Lights To Go Out\tCOMMODORE\t568\t4695\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_127.mp3\tGeorge O'connor\tPray For The Lights To Go Out\tCOLUMBIA\tA-2143\t47080\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401878-C.mp3\tJimmy Dorsey (clarinet Solo)\tPrayin' The Blues\tOKeh\t41245\t401878-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046834-1.mp3\tSidney Bechet New Orleans Fw\tPreachin' Blues\tBLUEBIRD\t10623B\t046834-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL143490-2.mp3\tBessie Smith\tPreachin' The Blues\tCOLUMBIA\t14195 D\t143490-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480619.mp3\tArt Farmer Quartet\tPreamp\tPrestige\tLP193\t637\t1954\tArt Farmer, T, Flh, Wynton Kelley, P, Addison Farmer, B, Herbert Lovelle, D\nhttp://www.jazz-on-line.com/a/mp3e/COLW142424-2.mp3\tPaul Ash And His Orchestra\tPrecious\tCOLUMBIA\t707 D\tW142424-2\t1926\tJohn Valentine, John Linn, tp, Roscoe Lantz, trombone, Phil Wing & Herbert \"Putty\" Nettle,clarinet,al sax, Howard Grantham, cl, tn sax, Harry Barris, p, Paul Ash, vio, Julian Davidson,bj, Pierre Olker,br bass, Arthur Layfield, drums, v Paul Small\nhttp://www.jazz-on-line.com/a/mp3o/DEC69513.mp3\tDelmore Brothers\tPrecious Jewel\tDECCA\t5970\t69513\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_194.mp3\tJohnny Marvin And Ed Smalle\tPrecious Little Thing Called Love\tVictor\t21892\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe80940.mp3\tEddie Lang\tPrelude\tOKeh\t40989\t80940\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC055194-2.mp3\tArtie Shaw And His Orchestra\tPrelude In C Major\tVICTOR\t27432\t055194-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68483.mp3\tHazel Scott (piano)\tPrelude In C Sharp Minor\tDECCA\t18128B\t68483\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP184.mp3\tKing Cole Trio\tPrelude In C Sharp Minor\tCAPITOL\t\t184\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68637-A.mp3\tJack Teagarden & His Orch\tPrelude In C Sharp Minor\tDECCA\t3642A\t68637-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLM884.mp3\tDuke Ellington Famous Orch\tPrelude To A Kiss\tCOLUMBIA\t36279\tM884\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CONM887.mp3\tJohnny Hodges And His Orch\tPrelude To A Kiss\tCONQUEROR\t9092\tM887\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC028940.mp3\tRichard Himber Essex House Or\tPrelude To A Kiss\tVICTOR\t26106\t028940\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D329A.mp3\tLes Brown And His Orchestra\tPrelude To A Kiss\tV-DISC\t329A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap847-2.mp3\tBenny Carter And His Orchestra\tPrelude To A Kiss\tCapitol\t40048\t847-2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/VarM-2-1.mp3\tLucky Millinder With Mills Blue Rhythm Band\tPrelude To A Stomp\tVariety\t546\tM-2-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC064346.mp3\tJan Savitt's Tophatters\tPrelude To Carmen\tVICTOR\t27570\t064346\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-261-1.mp3\tHubert Rostaing Et Son Orchestre (with Django Reinhardt)\tPremire Ide D'eddie\tSWING\t151\tOSW-261-1\t1942\t\nhttp://www.78-tours.net/mp3/PATCPT1054.mp3\tLe Jazz Du Poste Parisien Avec Refrain Chant Par Le \" Trio Vocal \"\tPrs De La Cascade (by A Waterfall)\tPATH\tPA 166\tCPT 1.054 Feldman &\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146092-2.mp3\tAlabama Sacred Harp Singers\tPresent Joys\tCOLUMBIA\t15274 D\tW146092-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/GRAOPG-1415-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tPresentation Stomp\tGramophone\tK-7314\tOPG-1415-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70045x.mp3\tRalph Marterie And His Orch\tPretend\tMERCURY\t70045\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_128.mp3\tEileen Barton Feat. Jack Pleis (director)\tPretend\tCORAL\t60927\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_018.mp3\tNat ''king'' Cole Feat. Nelson Riddle's Orchestra\tPretend\tCAPITOL\t2346\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1110.mp3\tAndy Russell\tPretending\tCAPITOL\t271\t1110\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_125.mp3\tRudy Vallee And His Connecticut Yankees\tPretending\tVictor\t22062\t55600-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC55600-4.mp3\tRudy Vallee & His Ct.yankees\tPretending\tVICTOR\t22062\t55600-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_124.mp3\tAndy Russell\tPretending\tCAPITOL\t271\t1110\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146004-3.mp3\tGid Tanner's Skillet Lickers\tPrettiest Liitle Girl In The County\tCOLUMBIA\t15315 D\tW146004-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC18013-2.mp3\tBilly Murray\tPretty Baby\tVICTOR\t18102\t18013-2\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35589-A.mp3\tVictor Military Band\tPretty Baby\tVictor\t35589-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31914.mp3\tLouisiana Rhythm Kings\tPretty Baby\tBRUNSWICK\t6840\tE31914\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_019.mp3\tBilly Murray\tPretty Baby\tVICTOR\t18102\t18013-2\t1916\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-31914.mp3\tLouisiana Rhythm Kings\tPretty Baby\tBrunswick\t4938\tE-31914\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35883-2.mp3\tBrox Sisters\tPretty Cinderella\tVICTOR\t20325\t35883-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20325.mp3\tThe Brox Sisters\tPretty Cinderella\tVictor\t20325\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COL03410.mp3\tBert Williams\tPretty Desdamone (abyssinia)\tCOLUMBIA\tST2251\t03410\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COM29057.mp3\tEddie Condon & His Band\tPretty Doll\tCOMMODORE\t535\t29057\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4461.mp3\tFrankie Laine & Jo Stafford\tPretty Eyed Baby\tCOLUMBIA\t39388\tHCO4461\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_098.mp3\tFrankie Laine And Jo Stafford\tPretty Eyed Baby\tCOLUMBIA\t39388\tHCO4461\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke25754-1.mp3\tJimmie Lunceford And His Orchestra\tPretty Eyes\tOkeh\t5430\t25754-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5131.mp3\tLeadbelly\tPretty Flowers In Your Backyard\tMUSICRAFT\t313\t5131\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC23026-5.mp3\tJohn Steel\tPretty Girl Is Like Melody\tVICTOR\t18588\t23026-5\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3391.mp3\tMerry Macs\tPretty Kitty Blue Eyes\tDECCA\t18610\tL3391\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D206B2.mp3\tMorton Downey With Tommy Dorsey\tPretty Kitty Blue Eyes\tV-DISC\t206B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_060.mp3\tMerry Macs\tPretty Kitty Blue Eyes\tDECCA\t18610\tL3391\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_021.mp3\tCharles Harrison\tPretty Kitty Kelly\tLYRIC\t5222\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49454-2.mp3\tJelly Roll Morton & His Orch\tPretty Lil\tVICTOR\t38078\t49454-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic49454-2.mp3\tJelly Roll Morton And His Orchestra\tPretty Lil\tVictor\tV-38078\t49454-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWC3291.mp3\tRaymond Scott And His New Orch\tPretty Little Petticoat\tCOLUMBIA\t36226\tWC3291\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142840-3.mp3\tArt Gillam\tPretty Little Thing\tCOLUMBIA\t1051 D\tW142840-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147263-2.mp3\tGid Tanner's Skillet Lickers\tPretty Little Window\tCOLUMBIA\t15334 D\tW147263-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2644.mp3\tTexas Jim Lewis\tPretty Quadroon\tDECCA\t5990\tDLA2644\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/COLLA477.mp3\tAndy Iona's Novelty Four\tPretty Red Hibiscus\tCOLUMBIA\t3132 D\tLA477\t\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe400789-B.mp3\tJoe Venuti's Blue Four\tPretty Trix\tOKeh\t41076\t400789-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/BlaP-132-2.mp3\tBlack Swan Dance Orchestra\tPretty Ways\tBlack Swan\t2014\tP-132-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83014.mp3\tElla Fitzgerald\tPreview\tDECCA\t28321\t83014\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62991.mp3\tAllen Bros\tPrice Of Cotton Blues\tVICTOR\t23507\t62991\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic23507.mp3\tAllen Brothers\tPrice Of Cotton Blues\tVictor\t23507\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN15575-1.mp3\tLuis Russell & His Orchestra\tPrimitive\tBANNER\t33399\t15575-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62185-1.mp3\tJelly Roll Morton Red Peppers\tPrimrose Stomp\tVICTOR\t23424\t62185-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_060.mp3\tHarry James And His Orchestra\tPrince Charming\tCOLUMBIA\t36672\tHCO863\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14383-4-5.mp3\tCotton Pickers\tPrince Of Wails\tBRUNSWICK\t2766\t14383-4-5\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/PUR1973-1.mp3\tFletcher Henderson & His Orch\tPrince Of Wails\tPURITAN\tPU11367\t1973-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/GENG09231-A.mp3\tWolverines Orch\tPrince Of Wails\tGENNETT\t5620\tG09231-A\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/EDI9902.mp3\tDave Harman And His Orchestra\tPrince Of Wails (elmer Schoebel)\tEDISON\t\t9902\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU74854-1.mp3\tBennie Moten Kansas City Orch\tPrince Of Wales\tBLUEBIRD\t6851A\t74854-1\t1932\t\nhttp://www.78-tours.net/mp3/ODEBE5969.mp3\tLe Maestro Dajos Bela Et Son Orchestre Viennois\tPrincesse Dollar\tODON\t165.202\tBE 5967\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_159.mp3\tEddie Cooley And The Dimples\tPriscilla\tRoyal Roost\t621\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18864A.mp3\tInk Spots\tPrisoner Of Love\tDECCA\t18864A\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/NATNSC62.mp3\tBilly Eckstine And His Orch\tPrisoner Of Love\tNATIONAL\t9017\tNSC62\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1814-x.mp3\tPerry Como\tPrisoner Of Love\tRCA\t20-1814\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/V-DCO31321.mp3\tTeddy Wilson And His Orch\tPrisoner Of Love\tV-DISC\t317\tCO31321\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC70283-1.mp3\tRuss Colombo\tPrisoner Of Love\tVICTOR\t22867\t70283-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24233.mp3\tMildred Bailey & Her Orch\tPrisoner Of Love\tVOCALION\t5268\t24233\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC70283.mp3\tRuss Columbo\tPrisoner Of Love\tVICTOR\t27635\t70283\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D317A.mp3\tTeddy Wilson And His Orchestra (lena Horne Voc.)\tPrisoner Of Love\tV-DISC\t317A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_011.mp3\tPerry Como Feat. Andre Kostelanetz Orchestra\tPrisoner Of Love\tRCA\t20-1814\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_104.mp3\tInk Spots\tPrisoner Of Love\tDECCA\t18864A\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_122.mp3\tBilly Eckstine And His Orchestra\tPrisoner Of Love\tNATIONAL\t9017\tNSC62\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_193.mp3\tRuss Columbo Feat. Nat Shilkret And His Orchestra\tPrisoner Of Love\tVICTOR\t27635\t70283\t1932\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480481.mp3\tArt Tatum And Lionel Hampton\tPrisoner Of Love\tPablo\t2310-775\t2384-2\t1955\tArt Tatum (p), Lionel Hampton (vib), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2959.mp3\tSons Of The Pioneers\tPrivate Buckaroo\tDECCA\t6042\tDLA2959\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS1011.mp3\tKing Cole Quintet\tPro-sky\tDISC\t2011\t1011\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62923-1.mp3\tBennie Moten Kansas City Orch\tProfessor Hot Stuff\tVICTOR\t23429\t62923-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUR3461.mp3\tEdmond Hall Celestial Qt\tProfoundly Blue\tBLUENOTE\tBN017\tR3461\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59176-2.mp3\tMissourians\tProhibition Blues\tVICTOR\t38120\t59176-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78575-2.mp3\tNora Bayes\tProhibition Blues\tCOLUMBIA\tA-2823\t78575-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_074.mp3\tNora Bayes Feat. Charles Prince's Orchestra\tProhibition Blues\tCOLUMBIA\t2823\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe404032-C.mp3\tJoe Venuti & His Orch.\tPromises (v S B)\tOKeh\t41427\t404032-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_265.mp3\tAndrews Sisters\tPross-tchai (goodbye)\tDECCA\t2082A\t64671\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64671.mp3\tAndrews Sisters\tPross-tchai - Goodbye, Goodbye\tDECCA\t2082A\t64671\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37579-4.mp3\tJean Goldkette & His Orch\tProud Of A Baby Like You\tVICTOR\t20469\t37579-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR20665-2.mp3\tMa Rainey Georgia Jazz Band\tProve It On Me Blues\tPARAMOUNT\t12668\t20665-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC84243-1.mp3\tRudy Vallee & His Ct.yankees\tPs I Love You\tVICTOR\t24723\t84243-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/COLLA2289.mp3\tAndy Iona And His Orch\tPua Mamame (v Miulan)\tCOLUMBIA\t36236\tLA2289\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_120.mp3\tLouis Armstrong\tPublic Melody Number One\tDECCA\t1347\t62328-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60980-A.mp3\tBob Howard & His Orch\tPublic Weakness No.1\tDECCA\t862B\t60980-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC658.mp3\tHal Kemp & His Orch\tPuddin' Head Jones\tBRUNSWICK\t6703\tC658\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC78591-2.mp3\tRudy Vallee & His Ct.yankees\tPuddin' Head Jones\tVICTOR\t24475\t78591-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24475.mp3\tRudy Vallee & His Conecticut Yankees\tPuddin' Head Jones\tVictor\t24475\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6703.mp3\tHal Kemp & His Orchestra\tPuddin' Head Jones\tBrunswick\t6703\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_204.mp3\tRudy Vallee And His Connecticut Yankees\tPuddin' Head Jones\tVICTOR\t24475\t78591-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Col60961-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tPuddin' Head Serenade\tColumbia\tDB-5027\t60961-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60961-C.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tPuddin' Head Serenade\tDecca\t1208\t60961-C\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S3166.mp3\tSlim Gaillard\tPuerto Vootie\tMGM\t10231\t47S3166\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12256-A.mp3\tGuy Lombardo Royal Canadians\tPuleeze Mister Hemingway\tBRUNSWICK\t6390\t12256-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74418.mp3\tBuddy Johnson And His Orch.\tPullamo\tDECCA\t24596\t74418\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE19415.mp3\tSix Jumping Jacks\tPump Song\tBRUNSWICK\t3216\tE19415\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72882.mp3\tLionel Hampton & His Orch\tPunch And Judy\tDECCA\t23639\t72882\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72882-A.mp3\tLionel Hampton And His Orchestra\tPunch And Judy\tDecca\t23639\t72882-A\t19451\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S324.mp3\tJoni James-l.douglas\tPurple Shades\tMGM\t11333-B\t52S324\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480544.mp3\tArt Blakey And Thelonious Monk\tPurple Shades\tAtlantic\tLP1278\t2563\t1957\tArt Blakey, D, Thelonious Monk, P, Bill Hardman, T, Johnny Griffin, Ts, Spanky DeBrest, B\nhttp://www.jazz-on-line.com/a/mp3t/TS480806.mp3\tArt Blakey And Thelonious Monk\tPurple Shades\tAtlantic\tLP1278\t2563\t1957\tArt Blakey, D, Thelonious Monk, P, Bill Hardman, T, Johnny Griffin, Ts, Spanky DeBrest, B\nhttp://www.jazz-on-line.com/a/mp3a/COL46004-1.mp3\tBert Williams\tPurpostus\tCOLUMBIA\tA-1853\t46004-1\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74833.mp3\tLouis Jordan\tPush-ka-pee Shee Pie\tDECCA\t24877\t74833\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_088.mp3\tKay Kyser And His Orchestra\tPushin' Sand\tCOLUMBIA\t36676\tCCO4236-2\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5790.mp3\tPete Brown Sextet\tPushin' The Mop\tSAVOY\t578\tS5790\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COL01578.mp3\tAda Jones And Peerless Qt\tPussy Cat Rag\tCOLUMBIA\t\t01578\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4842.mp3\tPatty Andrew - Bob Crosby Orch\tPussy Cat Song\tDECCA\t24533\tL4842\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUWM997.mp3\tDuke Ellington & His Orch\tPussy Willow\tBRUNSWICK\t8344\tWM997\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE81302-B.mp3\tLouis Armstrong's Hot Five\tPut 'em Down Blues\tOKEH\t8503\t81302-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_210.mp3\tKing Cole Trio\tPut 'em In A Box, Tie It With A Ribbon\tCAPITOL\t15060\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_346.mp3\tDoris Day Feat. George Siravo's Orchestra\tPut 'em In A Box, Tie It With A Ribbon (and Throw 'em In The Deep Blue Sea)\tCOLUMBIA\t38188\tCO38415\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe404006-C.mp3\tJoe Venuti's Blue Four\tPut And Take\tOKeh\t41432\t404006-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_196.mp3\tMills Brothers\tPut Another Chair At The Table\tDECCA\t18663A\t72634\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9651.mp3\tTop Notchers - George Wilton Ballard (voc)\tPut Away A Little Ray Of Golden Sunshine\tEDISON\t51389\t9651\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_256.mp3\tRed Foley\tPut Christ Back Into Christmas\tDECCA\t28940\t85322\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D317B1a.mp3\tJimmie Lunceford And His Orchestra (willie Smith Voc\tPut It Away\tV-DISC\t317B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke25749-1.mp3\tJimmie Lunceford And His Orchestra\tPut It Away\tOkeh\t5362\t25749-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5934.mp3\tWynonie Harris & His Allstars\tPut It Back\tKING\t4415\tK5934\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145787-3.mp3\tBessie Smith\tPut It Right Here\tCOLUMBIA\t14324 D\tW145787-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL3686.mp3\tBing Crosby And Bob Hope\tPut It There, Pal\tDECCA\t40000\tL3686\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL266.mp3\tLee O'daniel Hillbilly Boys\tPut Me In Your Pocket\tVOCALION\t4049\tDAL266\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN17532-2.mp3\tPrairie Ramblers\tPut On An Old Pair Of Shoes\tBANNER\t33457\t17532-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17239.mp3\tLouis Prima And His Gang\tPut On An Old Pair Of Shoes\tBRUNSWICK\t7419\t17239\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-17239-1.mp3\tLouis Prima And His New Orleans Gang\tPut On An Old Pair Of Shoes\tBrunswick\t7419\tB-17239-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_075.mp3\tByron G. Harlan\tPut On Your Old Gray Bonnet\tIndestructable\t1303\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3a/VICB8297-4.mp3\tHaydn Qt\tPut On Your Old Grey Bonnet\tVICTOR\t16377\tB8297-4\t1909\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDR3332.mp3\tMills Brothers\tPut On Your Old Grey Bonnet\tDECCA\t2982B\tDR3332\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/COL04273.mp3\tArthur Clough (tenor)\tPut On Your Old Grey Bonnet\tCOLUMBIA\tA-0778\t04273\t1909\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP6536-5.mp3\tPete Daily\tPut On Your Old Grey Bonnet\tCAPITOL\t\t6536-5\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62347-A.mp3\tJimmie Lunceford And His Orchestra\tPut On Your Old Grey Bonnet\tDecca\t1506\t62347-A\t1937\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3b/VICB9159-1.mp3\tAda Jones\tPut On Your Slippers And Fill Up Your Pipe\tVICTOR\t16788\tB9159-1\t1910\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66531.mp3\tWoody Herman & His Orchestra\tPut That Down In Writing\tDECCA\t2762B\t66531\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_098.mp3\tSam Donahue And His Orchestra Feat. Bill Lockwood\tPut That Kiss Back Where You Found It\tCaptol\t298\t970\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC11240-A.mp3\tBoswell Sisters\tPut That Sun Back In The Sky\tARC\t\t11240-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18565A.mp3\tDick Haymes\tPut Your Arms Around Me, Honey\tDECCA\t18565-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VICB9655-1.mp3\tArthur Collins-byron Harlan\tPut Your Arms Around Me, Honey\tVICTOR\t16708\tB9655-1\t1910\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69971-A.mp3\tDick Kuhn And His Orchestra\tPut Your Arms Around Me, Honey\tDECCA\t4337B\t69971-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_033.mp3\tDick Haymes\tPut Your Arms Around Me, Honey\tDECCA\t18565-A\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_005.mp3\tArthur Collins And Byron Harlan\tPut Your Arms Around Me, Honey\tVICTOR\t16708\tB9655-1\t1911\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR352-Hy.mp3\tHarmonians\tPut Your Arms Where They Be\tHarmony\t352-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1377.mp3\tFrank Sinatra\tPut Your Dreams Away\tCOLUMBIA\t36814\tHCO1377\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D262A1.mp3\tFrank Sinatra\tPut Your Dreams Away For Another Day\tV-DISC\t262A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_323.mp3\tLarry Clinton And His Orchestra (v-bea Wain)\tPut Your Heart In A Song\tVictor\t25892.\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23182-2.mp3\tRed Norvo & His Orch\tPut Your Heart In A Song (v M. Bailey)\tBRUNSWICK\t8182\t23182-2\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWC2953.mp3\tLouise Massey And Westerners\tPut Your Little Foot Right Out\tCOLUMBIA\t20245\tWC2953\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057362-1.mp3\tErskine Hawkins & His Orch\tPut Yourself In My Place (v Dolores Brown)\tBLUEBIRD\t10932\t057362-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COLHCO2598.mp3\tDuke Ellington's Orch\tPut Yourself In My Place Baby\tCOLUMBIA\t37957\tHCO2598\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MER899-4.mp3\tFrankie Laine W Carl Fischer\tPut Yourself In My Place, Baby\tMERCURY\t5064\t899-4\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE672.mp3\tHarry Richman W Earl Burtnett\tPuttin' On The Ritz\tBRUNSWICK\t4677\tLAE672\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC58608-3.mp3\tLeo Reisman & His Orch\tPuttin' On The Ritz\tVICTOR\t22306A\t58608-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149912-3.mp3\tJan Garber & His Orch\tPuttin' On The Ritz\tCOLUMBIA\t2115 D\tW149912-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe403791-A.mp3\tCarl Webster's Yale Collegians\tPuttin' On The Ritz\tOKeh\t41393\t403791-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_013.mp3\tHarry Richman\tPuttin' On The Ritz\tDECCA\t24391\tL4504\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_173.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra\tPuttin' On The Ritz\tBRUNSWICK\t4679\tBRUNSWICK\t1930\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480671.mp3\tBenny Goodman Trio\tPuttin' On The Ritz\tCapitol\tT441\t1843-4\t1947\tBenny Goodman (cl), Jimmy Rowles (p), Tommy Romersa (dm)\nhttp://www.jazz-on-line.com/a/mp3h/COL490041-A.mp3\tCarl Webster's Yale Collegians\tPutting On The Ritz\tCOLUMBIA\tOD36052\t490041-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM834-1.mp3\tDuke Ellington's Famous Orch\tPyramid\tBRUNSWICK\t8168\tM834-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC055186-2.mp3\tArtie Shaw And His Orchestra\tPyramid\tVICTOR\t27343\t055186-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055186-1.mp3\tArtie Shaw And His Orchestra\tPyramid\tVictor\t27343\t055186-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480887.mp3\tCarmen Miranda And The Bando Da Lua\tQuando Eu Penso Na Bahia\tODEON\t\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DIA1015u.mp3\tCharlie Parker\tQuasimodo\tDIAL\t1015\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-137-1.mp3\tAlix Combelle And His Swing Band\tQuatre Tickets\tSwing\t84\tOSW-137-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480888.mp3\tPerez Prado And His Orchestra\tQue Rico El Mambo (a-k-a ''mambo Jambo'')\tRCA VICTOR\t20-3782\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN4159QB.mp3\tSlim Gaillard\tQueen Boogie\tKING\t4159\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM620-2.mp3\tCab Calloway & His Orch\tQueen Isabel\tVARIETY\tI662\tM620-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62675.mp3\tEdgar Hayes & His Orchestra\tQueen Isabella\tDECCA\t1527\t62675\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Col265135-2.mp3\tFletcher Henderson And His Orchestra\tQueer Notions\tColumbia\tCB-678\t265135-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc138329-1.mp3\tFletcher Henderson And His Orchestra\tQueer Notions\tVocalion\t2583\t138329-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1566-1.mp3\tCount Basie & His Orchestra\tQueer Street\tCOLUMBIA\t36889\tHCO1566-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_235.mp3\tOzzie Nelson And His Orchestra\tQuicker Than You Can Say Jack Robinson\tBRUNSWICK\t7576\t18338\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_062.mp3\tBing Crosby And Andrews Sisters Feat. Vic Schoen's Orchestra\tQuicksilver\tDECCA\t24827\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_209.mp3\tDoris Day Feat. The Country Cousins\tQuicksilver\tCOLUMBIA\t38638\tHCO3923\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_254.mp3\tXavier Cugat And His Waldorf-astoria Orchestra Feat. Carmen Castillo\tQuiero A Mi Mama (i Want My Mama)\tVICTOR\t29522\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051280-3.mp3\tTommy Dorsey Sentimentalists\tQuiet Please\tBLUEBIRD\t10810\t051280-3\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU1204QP.mp3\tCliff Jackson's Village Cats\tQuiet Please\tBLUENOTE\tBN1204\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER361-2.mp3\tBuddy Rich & His Orchestra\tQuiet Riot\tMERCURY\t3017\t361-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_120.mp3\tBill Haley And His Comets\tR-o-c-k\tDecca\t29870\t88690\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC88690.mp3\tBill Haley And His Comets\tR-o-c-k\tDECCA\t29870\t88690\t1956\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-449-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tR-vingt Six\tSWING\t259\tOSW-449-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480739.mp3\tSlim Gaillard And His Flat Foot Floogie Boys\tRa-da-da-da\tMeritt\t10\tH789-1\t1942\tBen Webster (ts) Jimmy Rowles (p) Slim Gaillard (g,vcl) Slam Stewart (sb,vo) Leo Watson (dm)\nhttp://www.jazz-on-line.com/a/mp3a/PARP3089.mp3\tBlind Lemon Jefferson\tRabbit Foot Blues\tPARAMOUNT\t12454\tP3089\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/MERC477-2.mp3\tJohnny Hodges & His Orchestra\tRabbitt's Blues\tMERCURY\t8937\tC477-2\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe81882-B.mp3\tHelen Humes\tRace Horse Blues\tOKeh\t8825\t81882-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_495.mp3\tGene Vincent And His Blue Caps\tRace With The Devil\tCapitol\t3530\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/MERYB9525.mp3\tArtie Wayne\tRachel\tMERCURY\t70090\tYB9525\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_191.mp3\tArtie Wayne\tRachel\tMERCURY\t70090\tYB9525\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_431.mp3\tAl Martino\tRachel\tCapitol\t2353\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO34030-4.mp3\tBenny Goodman Sextet\tRachel's Dream\tCOLUMBIA\t36925\tCO34030-4\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU060651.mp3\tVaughn Monroe And His Orch\tRacing With The Moon\tBLUEBIRD\t11070\t060651\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-36927-A.mp3\tConnie's Inn Orchestra\tRadio Rhythm\tBrunswick\t6176\tE-36927-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42650.mp3\tJimmy Dorsey & Orchestra\tRag Mop\tCOLUMBIA\t38710\tCO42650\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC75636.mp3\tLionel Hampton And His Orch\tRag Mop\tDECCA\t24855\t75636\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_126.mp3\tStarlighters\tRag Mop\tCapitol\t844\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_264.mp3\tEddy Howard And His Orchestra\tRag Mop\tMERCURY\t5371\tME3146\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_014.mp3\tAmes Brothers, The Feat. Roy Ross Orchestra\tRag Mop\tCORAL\t60140\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/RCA47-3212-A.mp3\tRalph Flanagan And His Orchestra - Vocals - Harry Prime And The Band\tRag Mop\tRCA VICTOR \t20-3688-A\t47-3212-A\t1948\t\nhttp://www.jazz-on-line.com/a/mp3o/RCA47-3212-A.mp3\tRalph Flanagan & His Orch  Vocals - Harry Prime & The Band\tRag Mop\tRCA VICTOR\t20-3688-A\t47-3212-A\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_157.mp3\tJimmy Dorsey And His Orchestra Feat. Claire Hogan And Band\tRag Mop\tCOLUMBIA\t38710\tCO42650\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec75636.mp3\tLionel Hampton And His Orchestra\tRag Mop\tDecca\t24855\t75636\t1949\tWalter Williams-Benny Bailey-Ed Mullens-Duke Garrette-Leo Shepherd-t, AI Grey-Benny Powell-Jimmy Wormick-Paul Lee Higaki-tb, Bobby Plater-Jerome Richardson-as, Curtis Lowe-Johnny Board-Billy ''Smallwood'' Williams-ts, Lonnie Shaw-bar, Lionel Hampton-vi\nhttp://www.jazz-on-line.com/a/mp3w/1950_037.mp3\tRalph Flanagan And His Orchestra Feat. Harry Prime\tRag Mop\tRCA VICTOR\t78-3688-A\t47-3212-A\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_067.mp3\tLionel Hampton And His Orchestra\tRag Mop\tDECCA\t24855\t75636\t1949\tWalter Williams, Benny Bailey, Ed Mullens, Duke Garrette, Leo Shepherd (tp), Al Grey, Benny Powell, Paul Lee, R.N. Paul Higaki, Jimmy Wormick (tb), Bobby Plater, Jerome Richardson (as), Curtis Lowe, Johnny Board, Billy Williams (ts), Lonnie Shaw (bar), Lionel Hampton (vib), Douglas Duke (p,org), Wes Montgomery (g), Roy Johnson (sb), Ellis Bartee (dm), vocals by the band. \nhttp://www.jazz-on-line.com/a/mp3c/OKE81390.mp3\tVance Tennessee Breakdowners\tRagged Ann\tOKEH\t45151\t81390\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC28794-4.mp3\tPaul Whiteman & His Orch\tRaggedy Ann\tVICTOR\t19187\t28794-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63254.mp3\tBob Howard & His Orch\tRaggedy But Right\tDECCA\t1698\t63254\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCMEM94.mp3\tSwift Jewel Cowboys\tRaggin' The Rails (casey Jones)\tVOCALION\t5369\tMEM94\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe404005-C.mp3\tJoe Venuti's Blue Four\tRaggin' The Scale\tOKeh\t41432\t404005-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC11883-1.mp3\tAl Jolson\tRagging The Baby To Sleep\tVICTOR\t17081B\t11883-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_006.mp3\tAl Jolson\tRagging The Baby To Sleep\tVICTOR\t17081B\t11883-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3a/COL265066.mp3\tVenuti-lang And Blue Five\tRagging The Scale\tCOLUMBIA\t2765 D\t265066\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_052.mp3\tConway's Band\tRagging The Scale\tVictor\t17850\t16303-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec62261-A.mp3\tJimmie Lunceford And His Orchestra\tRagging The Scale\tDecca\t1364\t62261-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62261-A.mp3\tJimmie Lunceford And His Orchestra\tRagging The Scale.mp3\tDecca\t1364\t62261-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142904.mp3\tArt Gillam\tRags\tCOLUMBIA\t806 D\tW142904\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_004.mp3\tTony Bennett\tRags To Riches\tCOLUMBIA\t40048\tCO48927\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142642-1.mp3\tCharlie Poole N.c.ramblers\tRagtime Annie\tCOLUMBIA\t15127 D\tW142642-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWC2767.mp3\tLouise Massey And Westerners\tRagtime Cowboy Joe\tCOLUMBIA\t37644\tWC2767\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC11906-1.mp3\tBob Roberts\tRagtime Cowboy Joe\tVICTOR\t17090\t11906-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99399.mp3\tTune Wranglers\tRagtime Cowboy Joe\tBLUEBIRD\t6438\t99399\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic17090.mp3\tBob Roberts\tRagtime Cowboy Joe\tVictor\t17090\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_003.mp3\tBob Roberts\tRagtime Cowboy Joe\tVICTOR\t17090\t11906-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1897_011alt.mp3\tVess Ossman\tRagtime Medley\tCOLUMBIA\tB&S\t03830\t1897\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_087.mp3\tDolly Connolly\tRagtime Mocking Bird\tCOLUMBIA\t1126\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_023.mp3\tAmerican Quartet\tRagtime Violin\tEdison\t10560\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035722.mp3\tErskine Hawkins\tRaid The Joint\tBLUEBIRD\t10224\t035722\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402509-B.mp3\tFrank Hutchinson\tRailroad Bill\tOKeh\t45425\t402509-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/DECG19660.mp3\tSam And Kirk Mcgee\tRailroad Blues\tDECCA\t5348\tG19660\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149057-1.mp3\tClarence Williams Jazz Kings\tRailroad Rhythm\tCOLUMBIA\t14468 D\tW149057-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN6148-B.mp3\tSam Lanin's Dance Orch\tRain\tBanner\t6148-B\t7648-2\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15873-A.mp3\tDon Bestor And His Orch (vnb)\tRain\tBRUNSWICK\t6981\t15873-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21107-A.mp3\tJacques Renard And His Cocoanut G\tRain\tVictor\t21107-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC80783.mp3\tJan Garber & His Orch\tRain\tVICTOR\t24730\t80783\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/OKE81324-B.mp3\tArnold Frank Roger Cafe Orch\tRain\tOKEH\t40896\t81324-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_182.mp3\tFrank Petty Trio\tRain\tMGM\t10669\t48S567\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_181.mp3\tSam Lanin And His Orchestra\tRain\tBanner\t6148-B\t7648-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_108.mp3\tJan Garber And His Orchestra\tRain\tVICTOR\t24730\t80783\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10973.mp3\tFrankie Laine\tRain Rain Rain\tCOLUMBIA\t40295\tRHCO10973\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_153.mp3\tFrankie Laine And Four Lads Feat. Buddy Cole Quartet\tRain, Rain, Rain\tCOLUMBIA\t40295\tRHCO10973\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_049.mp3\tFrank Stanley And Henry Burr\tRainbow\tCOLUMBIA\tA-0600\t03935-3\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_049alt.mp3\tFrank Stanley And Henry Burr\tRainbow\tCOLUMBIA\tA-0600\t03935-3\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_081.mp3\tBilly Murray And Haydn Quartet\tRainbow\tMONARCH\tV-5571\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB6383-3.mp3\tHaydn Qt And Billy Murray\tRainbow (vocal B. M.)\tVICTOR\t17233\tB6383-3\t1908\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0542.mp3\tCharlie Barnet & His Orchestra\tRainbow On The River\tBLUEBIRD\t6619\t0542\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_263.mp3\tGuy Lombardo And His Royal Canadians\tRainbow On The River\tVICTOR\t25435A\t0702-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_248.mp3\tGlenn Miller And His Orchestra\tRainbow Rhapsody\tRCA Victor\t20-1546B\t74746\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC026899.mp3\tTommy Dorsey & His Orch\tRainbow Round The Moon\tVICTOR\t26062\t026899\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC061941.mp3\tDuke Ellington Orch\tRaincheck\tVICTOR\t27880B\t061941\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke23904-1.mp3\tJimmie Lunceford And His Orchestra\tRainin'\tOkeh\t4595\t23904-1\t1938\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3c/DEC68397.mp3\tBig Joe Turner\tRainy Day Blues\tDECCA\t7824\t68397\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/PURT2006.mp3\tDuke Ellington's Washingtonians\tRainy Nights\tPURITAN\tPU11437\tT2006\t1924\t\nhttp://www.jazz-on-line.com/a/mp3h/BluT-2006-2.mp3\tDuke Ellington's Washingtonians\tRainy Nights\tBlu-Dlsc\tT-1002\tT-2006-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S86.mp3\tJoe Turner\tRainy Weather Blues\tMGM\t10397\t48S86\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81907-1.mp3\tBessie Smith\tRainy Weather Blues\tCOLUMBIA\t14037 D\t81907-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC75671-1.mp3\tPaul Whiteman Presents Ramona\tRaisin The Rent\tVICTOR\t24316\t75671-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24316.mp3\tPaul Whiteman Presents Ramona\tRaisin The Rent\tVictor\t24316\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13307-A.mp3\tDuke Ellington & His Orch\tRaisin' The Rent\tBRUNSWICK\t6571\t13307-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Cam3799-A.mp3\tHenderson's Roseland Orchestra\tRaisin' The Roof\tCameo\t9175\t3799-A  \t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM-369-2.mp3\tBenny Carter And The Ramblers\tRambler's Rhythm\tDECCA\tF-44076\tAM-369-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146773-1.mp3\tCharlie Poole N.c.ramblers\tRamblin Blues\tCOLUMBIA\t15286 D\tW146773-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COMP22828.mp3\tJess Stacy\tRamblin'\tCOMMODORE\t506\tP22828\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COL30118x.mp3\tBig Bill\tRamblin' Bill\tCOLUMBIA\t30118\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S6056.mp3\tHank Williams\tRamblin' Man\tMGM\t11479\t51S6056\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO10113.mp3\tFrankie Laine\tRamblin' Man\tCOLUMBIA\t39979\tHCO10113\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VocS-144-1.mp3\tBenny Carter And His Orchestra\tRambling In C\tVocalion\tS-69\tS-144-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_137.mp3\tPerry Como Feat. Russell Case's Orchestra And The Satisfiers\tRambling Rose\tRCA Victor\t2947\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN7056-A.mp3\tRoyal Marimba Band\tRamona\tBanner\t7056-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D235B.mp3\tHarry Horlick And His Orchestra\tRamona\tV-DISC\t235B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC42584-3.mp3\tGene Austin\tRamona\tVICTOR\t21334A\t42584-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_002.mp3\tGene Austin Feat. Nat Shilkret And His Orchestra\tRamona\tVICTOR\t21334A\t42584-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_104.mp3\tRuth Etting\tRamona\tCOLUMBIA\t1352 D\tW145848\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_087.mp3\tGaylords\tRamona\tMERCURY\t70112\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC41293-3.mp3\tPaul Whiteman And His Orch\tRamona - Waltz\tVICTOR\t21214A\t41293-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/SILP2220-1.mp3\tLovie Austin Blue Serenaders\tRampart Street Blues\tSILVERTONE\t3551\tP2220-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA1107.mp3\tPrince's Band\tRamshackle Rag\tColumbia\tA1107\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/COLDAL513.mp3\tNite Owls\tRancho Grande\tCOLUMBIA\t37635\tDAL513\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99395.mp3\tTune Wranglers\tRancho Grande\tBLUEBIRD\t6554\t99395\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC3966-1.mp3\tGene Krupa & His Orch\tRancho Pillow\tOKEH\t6376\tC3966-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480788.mp3\tBen Webster Sextet\tRandall's Island\tMercury\t8265\t4720-2\t1951\tMaynard Ferguson (tp), Benny Carter (as), Ben Webster (ts), Gerald Wiggins (p), John Kirby (sb), George Jenkins (dm)\nhttp://www.jazz-on-line.com/a/mp3c/VOCHS1.mp3\tRange Riders\tRange Rider's Stomp\tVOCALION\t3579\tHS1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146804-3.mp3\tLeo Reisman And His Orch\tRaquel (vlc)\tCOLUMBIA\t1521 D\tW146804-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU13199-A.mp3\tThree Keys\tRasputin (that Highfalutin Lovin' Man)\tBRUNSWICK\t6567\t13199-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB3189.mp3\tCount Basie Octet\tRat Race\tRCA\t(VIC-LP)\tE0VB3189\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-972-1.mp3\tCab Calloway And His Orchestra\tRatamacue\tVocalion\t4700\tM-972-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC8654A.mp3\tLouis Jordan Tympany 5\tRation Blues\tDECCA\t8654A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL3204.mp3\tLouis Jordan Tympani 5\tRation Blues\tDECCA\t8654\tL3204\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/COS4900.mp3\tTrummy Young\tRattle And Roll\tCOSMO\t901\t4900\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL41230.mp3\tFrankie Laine\tRawhide\tCOLUMBIA\t41230\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36194x.mp3\tRay Noble And His London Orch\tRay Noble Medley\tVICTOR\t36194\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC87922.mp3\tBill Haley And His Comets\tRazzle Dazzle\tDECCA\t29552\t87922\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_116.mp3\tBill Haley And His Comets\tRazzle-dazzle\tDecca\t29552\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480785.mp3\tJay Mcshann & His Orch.\tReach\tMercury\t70040\t4620-1\t1951\tOrville Minor (tp), Clifford Jenkins (as, ts), Ben Webster, Fats Dennis (ts), Jay McShann (p), Gene Griddins (g), Lloyd Anderson (sb), Cooky Jackson (dm)\nhttp://www.jazz-on-line.com/a/mp3b/OKe401962-C.mp3\tFrankie Trumbauer & His Orch\tReaching For Someone\tOKeh\t41268\t401962-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic78828-1.mp3\tMills Blue Rhythm Band\tReaching For The Cotton Moon\tVictor\t\t78828-1  \t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18755-6.mp3\tBen Bernie & His Orch\tReaching For The Moon\tBRUNSWICK\t3170\t18755-6\t1926\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1133.mp3\tSam Lanin's Dance Ensemble\tReaching For The Moon\tHit-Of-The-Week\t1133\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_075.mp3\tRuth Etting\tReaching For The Moon\tCOLUMBIA\t2377 D\tW151202-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_018.mp3\tBen Bernie And His Orchestra Feat. Paul Hagan\tReaching For The Moon\tBRUNSWICK\t3170\t18755-6\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC63102-3.mp3\tHelen Kane\tReadin' Ritin' Rhythm\tVICTOR\t22520\t63102-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053624.mp3\tBarney Bigard & His Orch\tReady Eddy\tBLUEBIRD\t11098\t053624\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC42374-2.mp3\tCoon Sanders Nighthawk Orch\tReady For The River\tVICTOR\t21501\t42374-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_235.mp3\tCoon-sanders Orchestra\tReady For The River\tVICTOR\t21501\t42374-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_254.mp3\tLittle Richard\tReady Teddy\tSpecialty\t579\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/MER531-2.mp3\tBuddy Rich & His Orch\tReady To Go Steady\tMERCURY\t3037A\t531-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB2190.mp3\tCount Basie & His Orchestra\tReady, Set, Go\tRCA\t20-3003\tD7VB2190\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64301-1.mp3\tJoe Venuti's Blue Four\tReally Blue\tVICTOR\t23021\t64301-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030319.mp3\tTommy Ladnier And His Orch\tReally The Blues\tBLUEBIRD\t10089\t030319\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/SesF-160.mp3\tMezz Mezzrow Trio\tReally The Blues\tSession\t10008\tF-160  \t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-34-I.mp3\tMezzrow - Bechet Quintet\tReally The Blues - Part 1\tKing jazz\t146\tKJ-34-I  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-35-1.mp3\tMezzrow - Bechet Quintet\tReally The Blues - Part 2\tKing Jazz\t146\tKJ-35-1  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC1101y.mp3\tBig Joe Turner - Pete Johnson\tRebecca\tDECCA\t11001\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_004.mp3\tAmerican Quartet\tRebecca Of Sunny-brook Farm\tVictor\t17534\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_070.mp3\tHenry Burr And Helen Clark Feat. Irving Gillette\tRebecca Of Sunny-brook Farm\tCOLUMBIA\t1483\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC14231-5.mp3\tAmerican Qt\tRebecca Of Sunnybrook Farm\tVICTOR\t17534\t14231-5\t1914\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480889.mp3\tCarmen Miranda And The Bando Da Lua\tRebola A Bola (embolada)\tDECCA\t23240-B\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_141.mp3\tDeep River Boys\tRecess In Heaven\tRCA Victor\t3203\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC961.mp3\tFreddy Martin & His Orch\tReckless\tBRUNSWICK\t7439\tC961\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18762Ax.mp3\tLouis Jordan And His Orch.\tReconversion Blues\tDECCA\t18762A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC72689-1.mp3\tAlex Bartha And His Orch.\tRed Blues\tVICTOR\t24083\t72689-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC72689-1HC1-3.mp3\tAlex Bartha And His Orch.\tRed Blues\tVICTOR\t24083\t72689-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC21505.mp3\tErskine Hawkins Bama St.coll.\tRed Cap\tVOCALION\t3668\t21505\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC62330-A.mp3\tLouis Armstrong And His Orchestra\tRed Cap\tDECCA\t1347\t62330-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS5713-2.mp3\tCharlie Parker\tRed Cross\tSAVOY\t915\tS5713-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/BanE-36668-A.mp3\tEarl Jackson And His Musical Champions (pseudonym For Mills Blue Rhythm Band)\tRed Devil\tBanner\t32733\tE-36668-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_055.mp3\tAda Jones\tRed Head\tVICTOR\t16360\tB8224-1\t1909\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70188.mp3\tGene Kardos & His Orch\tRed Headed Baby (v D R)\tVICTOR\t22792\t70188\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic40096-1.mp3\tThomas Waller With Morris's Not Babies\tRed Hot Dan\tVictor\t21127\t40096-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE15181.mp3\tRay Miller & His Orch\tRed Hot Henry Brown\tBRUNSWICK\t2855\tE15181\t1925\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe9371-A.mp3\tJimmy Joy's Baker Hotel Orchestra\tRed Hot Henry Brown\tOKeh\t40494\t9371-A\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC30972-2.mp3\tBrox Sisters\tRed Hot Mama\tVICTOR\t19510\t30972-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe08552-B.mp3\tSophie Tucker W Miff Mole\tRed Hot Mama\tOKeh\t40129\t08552-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COLMEM21.mp3\tHank Penny Radio Cowboys\tRed Hot Papa\tCOLUMBIA\t20317\tMEM21\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU48434-1.mp3\tJelly Roll Morton Peppers\tRed Hot Pepper\tBLUEBIRD\t6601\t48434-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic48434-1.mp3\tJelly Roll Morton And His Orchestra\tRed Hot Pepper\tVictor\tV-38055\t48434-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC48434-1.mp3\tJelly Roll Morton Peppers\tRed Hot Pepper Stomp\tVICTOR\t38055\t48434-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR392-Hy.mp3\tLou Gold And His Orch\tRed Lips - Kiss My Blues Away\tHarmony\t392-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC32121-3.mp3\tPiron's New Orleans Orch\tRed Man Blues\tVICTOR\t19646\t32121-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW141293-2.mp3\tBessie Smith\tRed Mountain Blues\tCOLUMBIA\t14115 D\tW141293-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU70658-1.mp3\tJimmie Davis\tRed Nightgown Blues\tBLUEBIRD\t5699\t70658-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC61110.mp3\tLouis Armstrong And His Orchestra\tRed Nose\tDECCA\t1049B\t61110-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC30254-3.mp3\tTed Weems & His Orch.\tRed Nose Pete\tVICTOR\t19377B\t30254-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16097.mp3\tAllen Bros\tRed Pajama Sal\tARC\tVO2817z\t16097\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiARCVO2817z.mp3\tAllen Bros\tRed Pajama Sal\tARC\tVO2817z\t16097\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480423.mp3\tArt Pepper\tRed Pepper Blues\tContemporary\tC3532\t\t1957\tRed Garland, P, Philly Jo Jones, D, Paul Chambers, B\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-19296-1.mp3\tMills Blue Rhythm Band\tRed Rhythm\tColumbia\t3135-D\tCO-19296-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/CON13714-2.mp3\tJack Kelly\tRed Ripe Tomatoes\tCONQUEROR\t8242\t13714-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC90218.mp3\tJimmie Davis\tRed River Blues\tDECCA\t5155B\tC90218\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16704.mp3\tLeadbelly (h.ledbetter)\tRed River Blues\tARC\t(Reject)\t16704\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93813.mp3\tJay Mcshann Quartet\tRed River Blues (v J M)\tDECCA\t8595\tC93813\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DECC9583.mp3\tRanch Boys\tRed River Valley\tDECCA\t5045B\tC9583\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_087.mp3\tDolly Connolly\tRed Rose Rag\tCOLUMBIA\t1028\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA3319x.mp3\tVaughn Monroe\tRed Roses For A Blue Lady\tRCA\t20-3319\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24549x.mp3\tGuy Lombardo's Royal Canadians\tRed Roses For A Blue Lady\tDECCA\t24549\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60227.mp3\tLouis Armstrong & His Orch.\tRed Sails In The Sunset\tDECCA\t648B\t60227\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVB4418.mp3\tErroll Garner\tRed Sails In The Sunset\tSAVOY\t862\tB4418\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA253-A.mp3\tBing Crosby W Victor Young\tRed Sails In The Sunset\tDECCA\t616A\tDLA253-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/LON129x.mp3\tGracie Fields\tRed Sails In The Sunset\tLONDON\t129\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC60048.mp3\tGuy Lombardo's Royal Canadians\tRed Sails In The Sunset\tDECCA\t585A\t60048\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec648.mp3\tLouis Armstrong\tRed Sails In The Sunset\tDecca\t648\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec585A.mp3\tGuy Lombardo's Royal Canadians\tRed Sails In The Sunset\tDecca\t585A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC648B.mp3\tLouis Armstrong & His Orch.\tRed Sails In The Sunset\tDECCA\t648B\t60227\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_217.mp3\tLouis Armstrong\tRed Sails In The Sunset\tDecca\t648\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_236.mp3\tNat ''king'' Cole Feat. Pete Rugolos Orchestra\tRed Sails In The Sunset\tCAPITOL\t1468\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh056.mp3\tAmbrose And His Orchestra\tRed Sails In The Sunset (v Jack Cooper)\tDecca\tF-5656\tTB-1851-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/MER849-1.mp3\tGene Ammons Sextet\tRed Top\tMERCURY\t8048\t849-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4529.mp3\tLionel Hampton & His Orch\tRed Top\tDECCA\t24281\tL4529\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COL18076.mp3\tJoe Venuti & His Orch\tRed Velvet\tCOLUMBIA\t3105 D\t18076\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COL28006.mp3\tJimmie Lunceford & His Orch\tRed Wagon\tCOLUMBIA\t35782\t28006\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC64958.mp3\tCount Basie And His Rhythm\tRed Wagon\tDECCA\t3071B\t64958\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_325.mp3\tCount Basie And His Orchestra\tRed Wagon\tDECCA\t3071B\t64958\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Col28006-A.mp3\tJimmie Lunceford And His Orchestra\tRed Wagon\tColumbia\t35782\t28006-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64958-B.mp3\tCount Basie\tRed Wagon\tDecca\t3071\t64958-B  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1743.mp3\tSam Donohue & His Orch\tRed Wing\tCAPITOL\t\t1743\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COL26166-A.mp3\tJack Teagarden & His Orch\tRed Wing\tCOLUMBIA\t35450\t26166-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_117.mp3\tSam Donahue And His Orchestra Feat. Shirley Lloyd\tRed Wing\tCapitol\t472\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99398.mp3\tTune Wranglers\tRed's Tight Like That\tBLUEBIRD\t6438\t99398\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_044.mp3\tWendell Hall\tRed-headed Music Maker\tVICTOR\t19171\t28740-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D322.mp3\tDon Redman & His Orch\tRedman Blues\tV-DISC\t104\t322\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D104B.mp3\tDon Redman And His Orchestra\tRedman Blues\tV-DISC\t104B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147956-2.mp3\tBen Selvin & His Orch\tRedskin (hunt)\tCOLUMBIA\t1739 D\tW147956-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR147963-2.mp3\tBert Lown & His Orch\tRedskin (v I K)\tHARMONY\t852-H\t147963-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_117.mp3\tCharlie Barnet And His Orchestra\tRedskin Rhumba\tCAPITOL\t\t3423\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC-4319A.mp3\tStan Kenton's Sax Quintet\tReed Rapture\tDECCA\t4319A\t-\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Mel12204-2.mp3\tMills Blue Rhythm Band\tReefer Man\tMelotone\tM-12464  \t12204-2  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_132.mp3\tCab Calloway And His Orchestra\tReefer Man\tBRUNSWICK\t6340\t11923\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11923-A.mp3\tCab Calloway And His Orchestra\tReefer Man\tBanner\t32944\t11923-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Col152220-2.mp3\tHarlan Lattimore And His Connie's Inn Orchestra\tReefer Man\tColumbia\t2678-D\t152220-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66892.mp3\tBuddy Johnson & His Band\tReese's Idea\tDECCA\t7700\t66892\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-163-1.mp3\tTrio De Saxophones Alix Combelle\tReflets\tSwing\t117\tOSW-163-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COL49343-1.mp3\tNora Bayes\tRegretful Blues\tCOLUMBIA\tA-6038\t49343-1\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_056.mp3\tNora Bayes\tRegretful Blues\tColumbia\t6038\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64708-A.mp3\tJohn Kirby & Onyx Club Boys\tRehearsin' For A Nervous Breakdown\tDECCA\t2367B\t64708-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS24175.mp3\tRed Norvo And His Orchestra\tRehearsing For A Nervous Breakdown\tCBS\tVO4833\t24175\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA1071.mp3\tCharlie Parker\tRelaxin' At Camarillo\tDIAL\t1012\t1071\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/RCA40-0139A.mp3\tMuggsy Spanier And His Ragtime Band  -\tRelaxin' At The Touro\tRCA VICTOR\t40-0139-A\t40-0139A\t\t\nhttp://www.jazz-on-line.com/a/mp3b/KINK5506.mp3\tRussell Jacquet & His Allstars\tRelaxing\tKING\t4259B\tK5506\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA1030.mp3\tCharlie Parker\tRelaxing At Camarillo\tDIAL\t1030\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_199.mp3\tPeter Lind Hayes And Mary Healy\tRememb'ring\tColumbia\t40547\tCO53302\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_034.mp3\tDuncan Sisters\tRememb'ring\tVICTOR\t19206A\t28967-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_046.mp3\tPaul Ash And His Orchestra\tRememb'ring\tBRUNSWICK\t2498\t11214\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC1853-1.mp3\tRed Norvo And His Orch\tRemember\tBRUNSWICK\t7896\tC1853-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC100382.mp3\tBenny Goodman And His Orchestra\tRemember\tVICTOR\t25329\t100382\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2950.mp3\tErroll Garner Trio\tRemember\tMERCURY\t5378\t2950\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU16468-9.mp3\tIsham Jones & His Orch\tRemember\tBRUNSWICK\t2963\t16468-9\t1925\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUC1853-1HX2-8.mp3\tRed Norvo And His Orchestra\tRemember\tBRUNSWICK\t7896\tC-1853-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_119.mp3\tCliff Edwards\tRemember\tPath\t025163\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC4173B.mp3\tBing Crosby & Dick Mcintyre\tRemember Hawaii\tDECCA\t4173B\t-\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1381.mp3\tTeddy Wilson And His Orch\tRemember Me\tBRUNSWICK\t7940\tLA1381\t1937\t\nhttp://www.jazz-on-line.com./a/mp3o/MERYB11315.mp3\tBill Walters, Vocal  Ralph Marterie & His Orchestra\tRemember Me\tMERCURY\t70535\tYB11315\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh039.mp3\tJoe Orlando And His Orchestra At Gleneagles Hotel\tRemember Me ?\tHMV\tBD-5303\tOEA-5100-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4069.mp3\tStuart Hamblen\tRemember Me, I'm The One Who Loves You\tCOLUMBIA\t20714\tHCO4069\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA942.mp3\tBing Crosby\tRemember Me?\tDECCA\t18866A\tDLA942\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA942-A.mp3\tJohn Scott Trotter And His Orchestra\tRemember Me?\tDecca\t\tDLA942-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu5113.mp3\tGeorge Hall & The Hotel Taft Orchestra\tRemember My Forgotten Man\tBluebird\t5113\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068496.mp3\tCarson Robison Trio\tRemember Pearl Harbor\tBLUEBIRD\t11414\t068496\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4108.mp3\tEddy Howard And His Orch\tRemember Pearl Harbor\tCOLUMBIA\t36497\tCCO4108\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC068489.mp3\tSwing And Sway With Sammy Kaye\tRemember Pearl Harbor\tVICTOR\t27738\t068489\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC82221-2.mp3\tJimmie Lunceford And His Orchestra\tRemember When\tVICTOR\t24669\t82221-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU032948.mp3\tFats Waller And His Rhythm\tRemember Who You're Promised To\tBLUEBIRD\t10205\t032948\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT1423.mp3\tJohnny Guarnieri\tReminiscenses\tMAJESTIC\t1228\tT1423\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480482.mp3\tArt Farmer\tReminiscing\tNew Jazz\tLP8203\t1019\t1953\tArt Farmer, T, FLH, Kenny Drew, P, Addison Farmer, B, Elvin Jones, D\nhttp://www.jazz-on-line.com/a/mp3t/TS480802.mp3\tArt Farmer\tReminiscing\tNew Jazz\tLP 8203\t1019\t1953\tArt Farmer, T, FLH, Kenny Drew, P, Addison Farmer, B, Elvin Jones, D\nhttp://www.jazz-on-line.com/a/mp3c/BLU005RAB.mp3\tEarl Hines\tReminiscing At Blue Note\tBLUENOTE\tBN005\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18072-A.mp3\tDuke Ellington And His Orch\tReminiscing In Tempo - Part 1\tBRUNSWICK\t7546\t18072-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18073-1.mp3\tDuke Ellington And His Orch\tReminiscing In Tempo - Part 2\tBRUNSWICK\t7546\t18073-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18074-2.mp3\tDuke Ellington And His Orch\tReminiscing In Tempo - Part 3\tBRUNSWICK\t7547\t18074-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18075-1.mp3\tDuke Ellington And His Orch\tReminiscing In Tempo - Part 4\tBRUNSWICK\t7547\t18075-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4303.mp3\tLionel Hampton & His Orch\tReminiscing Mood\tDECCA\t24015\tL4303\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-4303-A.mp3\tLionel Hampton And His Orchestra\tReminiscing Mood\tDecca\t24015\tL-4303-A\t1946\tLionel Hampton p  vib v dir. Joe Wilder Duke Garrette Leo Shepherd Joe Morris  Wendell Culley  Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn   Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb johnny Griffin ts, Charlie Fowlkes bar, Mi\nhttp://www.jazz-on-line.com/a/mp3e/DEC67190.mp3\tBob Crosby & His Orch\tReminiscing Time\tDECCA\t3054A\t67190\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU050618.mp3\tCharlie Barnet & His Orch\tReminiscinng\tBLUEBIRD\t10846\t050618\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30241-1.mp3\tGene Krupa & His Orch\tRendezvous In Rio\tOKEH\t6165\t30241-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65878.mp3\tJimmy Dorsey & His Orch.\tRendezvous Time In Paree\tDECCA\t2577A\t65878\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_137.mp3\tTommy Dorsey And His Orchestra Feat. V/jack Leonard\tRendezvous Time In Paree\tVICTOR\t26264\t037134\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037154.mp3\tGlenn Miller & His Orch\tRendezvous Time In Paree (vre)\tBLUEBIRD\t10309\t037154\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_068.mp3\tJohnny Green And His Orchestra\tRendezvous With A Dream\tBRUNSWICK\t7662\t19160-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COL30142x.mp3\tBig Three Trio\tReno Blues\tCOLUMBIA\t30142\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE29381.mp3\tDuke Ellington And His Orch Jungle Band\tRent Party Blues\tBRUNSWICK\t6807\tE29381\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/BruE-29381-A.mp3\tThe Jungle Band\tRent Party Blues\tBrunswick\t4345\tE-29381-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC36701.mp3\tArthur Pryor's Band\tRepasz Band March\tVICTOR\t20303B\t36701\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/MER2071.mp3\tNeil Hefti W Charlie Parker\tRepetition\tMERCURY\t2072\t2071\t1947\t\nhttp://www.78-tours.net/mp3/GRA50-2760.mp3\tMaguy Fred De L'empire Avec Accordon Par Vaissade Et Banjo Par Latorre\tReste Encore\tGRAMOPHONE\tK-6804\t50-2760\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17184.mp3\tHal Kemp & His Orch\tRestless (v Maxine Gray)\tBRUNSWICK\t7413\t17184\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC56163-1.mp3\tFrank Crumit\tReturn Of The Gay Caballero\tVICTOR\t22154\t56163-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_222.mp3\tFrank Crumit Feat. O/leonard Joy\tReturn Of The Gay Caballero\tVICTOR\t22154\t56163-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_357.mp3\tMusic By Camarata\tReturn To Paradise\tDECCA\t28714\tL7155\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_118.mp3\tNat ''king'' Cole\tReturn To Paradise\tCAPITOL\t2498\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_159.mp3\tPercy Faith And His Orchestra\tReturn To Paradise\tCOLUMBIA\t39998\tCO49233\t1953\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480424.mp3\tBenny Golson\tReunion\tRiverside\tRLP12-256\t\t1957\tKenny Dorham (tp), J.J. Johnson (tb), Benny Golson (ts), Wynton Kelly (p), Paul Chambers (sb), Charlie Persip or Max Roach (dm)\nhttp://www.jazz-on-line.com/a/mp3a/ARC14747.mp3\tCharlie Patton\tRevenue Man Blues\tARC\tVO2931z\t14747\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL240.mp3\tErroll Garner Trio\tReverie\tATLANTIC\t665\t240\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAE3VB-2477.mp3\tRalph Flanagan And His Orchestra\tReverie In The Rain\tRCA VICTOR \t20-5591\tE3VB-2477\t1953\t\nhttp://www.jazz-on-line.com/a/mp3o/RCAE3VB-2477.mp3\tRalph Flanagan & His Orch.\tReverie In The Rain\tRCA VICTOR\t20-5591\tE3VB-2477\t1953\t\nhttp://www.78-tours.net/mp3/COLCL6593.mp3\tJaime Plana\tReviens Piccina Bella\tCOLUMBIA\tDF2346\tCL6593\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU028988.mp3\tMezz Mezzrow And His Orch\tRevolutionary Blues\tBLUEBIRD\t10088\t028988\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu028988-1.mp3\tMezz Mezzrow And His Orchestra\tRevolutionary Blues\tBluebird\tB-10088\t028988-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKJ-14-1.mp3\tMezzrow - Bechet Septet\tRevolutionary Blues Part 1\tStoryville\tSLP 153\tKJ-14-1  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKJ-15-1.mp3\tMezzrow - Bechet Septet\tRevolutionary Blues Part 2\tStoryville\tSLP 153\tKJ-15-1  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-29-3.mp3\tMezzrow - Bechet Quntet\tRevolutionary Blues_old School\tKing Jazz\t141\tKJ-29-3  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148973-2.mp3\tFred Rich & His Orch\tRevolutionary Rhythm\tCOLUMBIA\t1965 D\tW148973-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VARB4369-A.mp3\tRex Stewart 52nd St Stompers\tRexations\tVARIETY\tI517\tB4369-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/VarB-4369-A.mp3\tRex Steward And His Fifty-second Street Stompers\tRexatious\tVariety\t517\tB-4369-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478365.mp3\tSpike Jones And His City Slickers\tRhapsody From Hunger\tRCA VICTOR\t\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_021.mp3\tPaul Whiteman And His Orch.\tRhapsody In Blue, Parts 1 & 2\tVictor\t55225\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_077.mp3\tPaul Whiteman And His Orchestra Feat. George Gershwin\tRhapsody In Blue, Parts 1 & 2\tVictor\t35822\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CONWC3161-A.mp3\tCab Calloway & His Orch\tRhapsody In Rhumba\tCONQUEROR\t9641\tWC3161-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC39553-A.mp3\tJimmie Lunceford And His Orchestra\tRhapsody Junior\tDECCA\t639A\t39553-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/COLCO34674.mp3\tVictor Borge, Piano; Orchestra Conducted By Paul Baron\tRhapsody On Themes Of Grieg\tCOLUMBIA 36913\t\tCO 34674\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67383.mp3\tAndrews Sisters\tRhumboogie\tDECCA\t3097B\t67383\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68055.mp3\tWoody Herman & His Orchestra\tRhumboogie\tDECCA\t3396A\t68055\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28525-1.mp3\tGene Krupa & His Orch\tRhumboogie\tOKEH\t5788\t28525-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_184.mp3\tAndrews Sisters\tRhumboogie\tDECCA\t3097B\t67383\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_039b.mp3\tMcguire Sisters\tRhythm 'n' Blues (mama's Got The Rhythm Papa's Got The Blues)\tCoral\t61423\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60054.mp3\tChick Webb & His Orchestra\tRhythm And Romance\tDECCA\t588A\t60054\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92994-1.mp3\tFats Waller And His Rhythm\tRhythm And Romance\tVICTOR\t25131\t92994-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98364.mp3\tTommy Dorsey & His Clambake 7\tRhythm In My Nursery Rhymes\tVICTOR\t25201\t98364\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh079.mp3\tScott Wood And His Six Swingers\tRhythm In My Nursery Rhymes\tRegal Zonophone\tMR-2054\tCAR-3967-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63218-A.mp3\tJabbo Smith And His Orchestra\tRhythm In Spain\tDecca\t1980\t63218-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17785-1.mp3\tWingy Manone & His Orch\tRhythm Is Our Business\tARC\tVO2990\t17785-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU94513.mp3\tJoe Kennedy & His Orch\tRhythm Is Our Business\tBLUEBIRD\t6233\t94513\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39172-A.mp3\tJimmie Lunceford And His Orch\tRhythm Is Our Business\tDECCA\t369A\t39172-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VarM-3-2.mp3\tLucky Millinder With Mills Blue Rhythm Band\tRhythm Jam\tVariety\t546\tM-3-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC48725-3.mp3\tCoon-sanders Nighthawk Orch\tRhythm King\tVICTOR\t21891\t48725-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUW401138-A.mp3\tBix Beiderbecke\tRhythm King\tBRUNSWICK\t8242\tW401138-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke41173.mp3\tBix Beiderbecke & His Gang\tRhythm King\tOkeh\t41173\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39209-A.mp3\tDorsey Brothers Orchestra\tRhythm Of The Rain (vkw)\tDECCA\t358A\t39209-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc20755-1.mp3\tFletcher Henderson And His Orchestra\tRhythm Of The Tambourine\tVocalion\t3487\t20755-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCLA1311.mp3\tLouis Prima New Orleans Gang\tRhythm On The Radio\tVOCALION\t3921\tLA1311\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2042.mp3\tBing Crosby\tRhythm On The River\tDECCA\t3309B\tDLA2042\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECTB2250-2.mp3\tMills Brothers\tRhythm Saved The World\tDECCA\t961B\tTB2250-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99921.mp3\tTommy Dorsey & His Clambake 7\tRhythm Saved The World\tVICTOR\t25314\t99921\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19015-1.mp3\tBunny Berigan & His Boys\tRhythm Saved The World\tBRUNSWICK\t7949\t19015-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU101301.mp3\tWingy Manone & His Orch\tRhythm Saved The World\tBLUEBIRD\t6360\t101301\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec60363-A.mp3\tLouis Armstrong And His Orchestra\tRhythm Saved The World\tDecca\t685\t60363-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Mel11823-1.mp3\tMills Blue Rhythm Band\tRhythm Spasm\tMelotone\tM-12418  \t11823-1  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC07865-1.mp3\tLionel Hampton And His Orch\tRhythm, Rhythm\tVICTOR\t25586B\t07865-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic07865-1.mp3\tLionel Hampton And His Orchestra\tRhythm, Rhythm\tVictor\t25586\t07865-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480518.mp3\tArt Blakey And Thelonious Monk\tRhythm-a-ning\tAtlantic\tLP1278\t2562\t1957\tArt Blakey, D, Thelonious Monk, P, Bill Hardman, T, Johnny Griffin, Ts, Spanky DeBrest, B\nhttp://www.jazz-on-line.com/a/mp3t/TS480805.mp3\tArt Blakey And Thelonious Monk\tRhythm-a-ning\tAtlantic\tLP1278\t2562\t1957\tArt Blakey, D, Thelonious Monk, P, Bill Hardman, T, Johnny Griffin, Ts, Spanky DeBrest, B\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-128-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tRhythme Futur\tSWING\t83\tOSW-128-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU07392-1.mp3\tBoots And His Buddies\tRhythmic Rhapsody\tBLUEBIRD\t6921\t07392-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72872.mp3\tLionel Hampton Septet\tRibs And Hot Sauce\tDECCA\t24513\t72872\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72872-A.mp3\tLionel Hampton And His Septet\tRibs And Hot Sauce\tDecca\t24513\t72872-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER532-1.mp3\tBuddy Rich & His Orchestra\tRich-ual Fire Dance\tMERCURY\t3038\t532-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/GENG15032.mp3\tRutherford And Burnett\tRichmond Blues\tGENNETT\t6976\t15032\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_016.mp3\tTeresa Brewer Feat. Jack Pleis Orchestra\tRicochet (rick-o-shay)\tCoral\t61043\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUB12311-A.mp3\tAbe Lyman And His Orch\tRiddle Me This (vdr)\tBRUNSWICK\t6380\tB12311-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047797.mp3\tHarlan Leonard & His Rockets\tRide My Blues Away\tBLUEBIRD\t11032\t047797\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70260.mp3\tSkeets Tolbert Gentlemen Swing\tRide On\tDECCA\t8608\t70260\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec70260-A.mp3\tJean Eldrige With Skeets Tolbert And His Orchestra\tRide On\tDecca\t8608\t70260-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO889.mp3\tCount Basie & His Orch\tRide On - Blues\tCOLUMBIA\t36647\tHCO889\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99401.mp3\tTune Wranglers\tRide On, Old Timer, Ride On\tBLUEBIRD\t6403\t99401\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71052.mp3\tAndy Kirk & Clouds Of Joy\tRide On, Ride On\tDECCA\t4436B\t71052\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71052-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tRide On, Ride On\tDecca\t4436\t71052-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA383.mp3\tSons Of The Pioneers\tRide Ranger Ride\tDECCA\t5243\tDLA383\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COL17759.mp3\tMills Blue Rhythm Band\tRide Red Ride\tCOLUMBIA\t3087 D\t17759\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU99976.mp3\tWillie Bryant & His Orch\tRide Red Ride\tBLUEBIRD\t6374\t99976\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69439.mp3\tLucky Millinder & His Orch\tRide, Red, Ride\tDECCA\t4146B\t69439\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-17759-1.mp3\tMills Blue Rhythm Band\tRide, Red, Ride\tColumbia\t3087-D\tCO-17759-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69439-A.mp3\tLucky Millinder And His Orchestra\tRide, Red, Ride\tDecca\t4146\t69439-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPplrits.mp3\tPeggy Lee\tRiders In The Sky\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA3411x.mp3\tVaughn Monroe\tRiders In The Sky\tRCA\t20-3411\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4939.mp3\tBing Crosby & Ken Darby Choir\tRiders In The Sky\tDECCA\t24618\tL4939\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-8-1.mp3\tPhilippe Brun And His Swing Band (with Django Reinhardt)\tRidin' Along The Moscowa\tSWING\t34\tOSW-8-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038257.mp3\tEarl Fatha Hines\tRidin' And Jivin'\tBLUEBIRD\t10351\t038257\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon038257.mp3\tEarl Hines & His Orch\tRidin' And Jivin'\tMontgomeryWard\t8346\t038257\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA147.mp3\tBing Crosby W J.grier Orch\tRidin' Around In The Rain\tBRUNSWICK\t6852\tLA147\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_249.mp3\tGene Austin\tRidin' Around In The Rain\tVICTOR\t24663\tPB1349\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruLA147-A.mp3\tJimmie  Grier  And  His  Orchestra\tRidin' Around In The Rain\tBrunswick\t6852\tLA147-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA147-B.mp3\tJimmie  Grier  And  His  Orchestra\tRidin' Around In The Rain\tColumbia\t\tLA147-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_188.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra\tRidin' Around In The Rain\tCOLUMBIA\t2921 D\tW152609\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic57927-3.mp3\tFats Waller And His Buddies\tRidin' But Walkin'\tVictor\tV-38119\t57927-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA378.mp3\tJimmie Davis\tRidin' Down The Arizona Trail\tDECCA\t5238\tDLA378\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2516.mp3\tBing Crosby - Victor Young\tRidin' Down The Canyon\tDECCA\t18768B\tDLA2516\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D156A.mp3\tFreddy Martin And His Orchestra\tRidin' For A Fall\tV-DISC\t156A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D149A2.mp3\tBing Crosby\tRidin' Herd On A Cloud\tV-DISC\t149A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA13.mp3\tSons Of The Pioneers\tRidin' Home\tDECCA\t5013B\tDLA13\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Col265074-3.mp3\tMills Blue Rhythm Band\tRidin' In Rhythm\tColumbia\tCB-734\t265074-3  \t1933\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC60263.mp3\tShelton Brothers\tRidin' On A Humpback Mule\tDECCA\t5173B\t60263\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73329-A.mp3\tLionel Hampton And His Quartet\tRidin' On The L & N\tDecca\t23839\t73329-A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73329.mp3\tLionel Hampton Qt\tRidin' On The L And N\tDECCA\t23839\t73329\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5452.mp3\tCozy Cole Allstars\tRidin' The Riff (v Coleman Hawkins)\tSAVOY\t583A\tS5452\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93681-A.mp3\tRice Brothers Gang\tRiding Down The Canyon\tDECCA\t6004A\tC93681-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU011820-1.mp3\tWade Mainer And Zeke Morris\tRiding On That Train 45\tBLUEBIRD\t7298\t011820-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VICPB1349.mp3\tGene Austin & His Orch\tRiding Round In The Rain\tVICTOR\t24663\tPB1349\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1298.mp3\tSonny Terry\tRiff And Harmonica Jump\tCAPITOL\t\t1298\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT827.mp3\tSlim Gaillard Trio\tRiff City\tMAJESTIC\t9006\tT827\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26278-A.mp3\tCount Basie And His Orchestra\tRiff Interlude\tColumbia\t35231\t26278-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU040474.mp3\tEarl Hines & His Orch\tRiff Medley\tBLUEBIRD\t10531\t040474\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VocWM-1071-A.mp3\tBenny Carter And His Orchestra\tRiff Romp\tVocalion\t5294\tWM-1071-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057724-1.mp3\tErskine Hawkins & His Orch\tRiff Time\tBLUEBIRD\t11161\t057724-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP602.mp3\tCapitol Jazzmen\tRiffamarole\tCAPITOL\t\t602\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP129x.mp3\tFreddie Slack\tRiffette\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_087.mp3\tFreddie Slack And His Orchestra\tRiffette\tCapitol\t15239\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100560-1.mp3\tFletcher Henderson & His Orch\tRiffin'\tVICTOR\t25339\t100560-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic100560-1.mp3\tFletcher Henderson And His Orchestra\tRiffin'\tVictor\t25339\t100560-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC02103-1.mp3\tBenny Goodman And His Orchestra\tRiffin' At The Ritz\tVICTOR\t25445B\t02103-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67332-A.mp3\tLil Armstrong And Her Dixielanders\tRiffin' The Blues\tDecca\t7803\t67332-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152650-2.mp3\tBenny Goodman And His Orchestra\tRiffin' The Scotch\tCOLUMBIA\t2867 D\tW152650-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_086.mp3\tBenny Goodman And His Orchestra Feat. Billie Holiday\tRiffin' The Scotch\tCOLUMBIA\t2867\tW152650\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU94522.mp3\tBoots And His Buddies\tRiffs\tBLUEBIRD\t6081\t94522\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72393.mp3\tJames P Johnson\tRiffs\tDECCA\t24882\t72393\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP574.mp3\tColeman Hawkins & His Orch\tRifftide\tCAPITOL\t\t574\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC89817.mp3\tWillie Bryant & His Orch\tRigamarole\tVICTOR\t25038\t89817\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480643.mp3\tWillie Bryant & His Orch.\tRigamarole\tVictor\t25038\t89817-1\t1935\tWillie Bryant (ldr, speech), Benny Carter, Robert Cheek, Richard Clark (tp), Edgar ?Pudding Head? Battle (tp, vtb), John Haughton, Robert Horton, Eddie Durham (tb), Glyn Paque (cl, as), Stanley Payne (as), Ben Webster, Johnny Russell (ts), Teddy Wilson (p), Arnold Adams (g), Louis Thompson (sb), Cozy Cole (dm)\nhttp://www.jazz-on-line.com/a/mp3c/V-D1028.mp3\tMildred Bailey\tRight As Rain\tV-DISC\t387\t1028\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCLA1447.mp3\tMildred Bailey & Her Orchestra\tRight Or Wrong\tVOCALION\t3758\tLA1447\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_336.mp3\tMildred Bailey\tRight Or Wrong\tVOCALION\t3758\tLA1447\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20410-1.mp3\tTeddy Wilson And His Orchestra\tRight Or Wrong (i'm With You)\tBrunswick\t7797  \tB-20410-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_074.mp3\tAlice Nielsen And Florencio Constantino\tRigoletto - E Il Sol Dell Prima (love Is The Sun)\tColumbia\t3881\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3e/Gre3926-A.mp3\tCliff Jackson And His Krazy Kats\tRing Around The Moon\tGrey Gull\t1850\t3926-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC61011-6.mp3\tDuke Ellington And His Orch\tRing Dem Bells\tVICTOR\t22528\t61011-6\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC063891.mp3\tFats Waller (piano Solo)\tRing Dem Bells\tVICTOR\t27563\t063891\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/VIC018337-1.mp3\tLionel Hampton And Orchestra Vocal Refrain And Vibraphone By Lionel Hampton, J. Hodges, E. Sampson,\tRing Dem Bells\tVICTOR\t26017-B\t018337-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic018337-1.mp3\tLionel Hampton And His Orchestra\tRing Dem Bells\tVictor\t26017\t018337-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec68549-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tRing Dem Bells\tDecca\t3663\t68549-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_174.mp3\tDuke Ellington And His Famous Orchestra Feat. V/cootie Williams\tRing Dem Bells\tVICTOR\t22528\t61011-6\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D147B1.mp3\tThe Southern Sons\tRing Dem Golden Bells\tV-DISC\t147B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU056108.mp3\tGlenn Miller & His Orch\tRing Telephone, Ring\tBLUEBIRD\t11042\t056108\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_089.mp3\tAda Jones\tRing Ting A Ling\tVICTOR\t17051\t11538-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021174.mp3\tBunny Berigan & His Orch\tRinka Tinka Man\tVICTOR\t25820B\t021174\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU028596.mp3\tTune Wranglers\tRio Pecos Rose\tBLUEBIRD\t7992\t028596\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE24416.mp3\tFloridians\tRio Rita\tBRUNSWICK\t6559\tE24416\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_086.mp3\tNat Shilkret And The Victor Orchestra\tRio Rita\tVICTOR\t20474A\t37748\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC37748-4.mp3\tNat Shilkret & Victor Orch\tRio Rita (v L J)\tVICTOR\t20474A\t37748-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU76817-1.mp3\tElizabeth Washington\tRiot Call Blues\tBLUEBIRD\t5229\t76817-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_126.mp3\tLittle Richard\tRip It Up\tSpecialty\t579\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_190.mp3\tBill Haley And His Comets\tRip It Up\tDecca\t30028\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP755-2A.mp3\tElla Mae Morse\tRip Van Winkle\tCAPITOL\t\t755-2A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/STAT-2008-B.mp3\tHenri Ren And His Accordion\tRippling Brook Polka\tStandard\tT-2008-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COMB536-2.mp3\tWillie Smith (piano)\tRippling Waters\tCOMMODORE\t522\tB536-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_031.mp3\tGuy Lombardo And His Royal Canadians\tRiptide\tBrunswick\t6866\tLA152\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/CONLA152.mp3\tGuy Lombardo & Royal Canadians\tRiptide (v C. Lombardo)\tCONQUEROR\t8373\tLA152\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC74610.mp3\tPaul Whiteman & His Orch\tRise N Shine\tVICTOR\t24197\t74610\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24197.mp3\tPaul Whiteman & His Orchestra\tRise N Shine\tVictor\t24197\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/PARP4491.mp3\tBlind Lemon Jefferson\tRising Water Blues\tPARAMOUNT\t12487\tP4491\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57314-2.mp3\tBennie Moten's Kansas City Or.\tRit Dit Day (tiger Rag)\tVICTOR\t23342\t57314-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC55423-1.mp3\tBennie Moten's Kansas City Or.\tRite Tite\tVICTOR\t38104\t55423-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68482.mp3\tHazel Scott (piano)\tRitual Fire Dance\tDECCA\t18127A\t68482\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D228B.mp3\tArtur Rubinstein\tRitual Fire Dance (de Falla)\tV-DISC\t228B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN521R.mp3\tJohn Hardee Sextet\tRiver Edge Rock-sw\tBLUENOTE\tBN521\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1867-1.mp3\tJack Teagarden & Ho\tRiver Home (v J T)\tVARSITY\t8374\tUS1867-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU102374.mp3\tWingy Manone & His Orch\tRiver Man\tBLUEBIRD\t6483\t102374\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN17499.mp3\tCarter Family\tRiver Of Jordan\tBANNER\t33466\t17499\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/COL365048-3.mp3\tKate Smith\tRiver Stay 'way From My Door\tCOLUMBIA\tVE2483\t365048-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152032-2.mp3\tGuy Lombardo Royal Canadians\tRiver, Stay 'way From My Door\tCOLUMBIA\t2578\tW152032-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-7915-A.mp3\tJimmie Noone And His Orchestra (vocal Art Jarrett)\tRiver, Stay 'way From My Door\tBrunswick\t6192\tC-7915-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152032-2.mp3\tGuy Lombardo Royal Canadians\tRiver, Stay Away From My Door\tCOLUMBIA\t2578 D\tW152032-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC32715-4.mp3\tBenson Orchestra Of Chicago\tRiverboat Shuffle\tVICTOR\t19688B\t32715-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64962-A.mp3\tGlen Gray & Casa Loma Orch.\tRiverboat Shuffle\tDECCA\t2398B\t64962-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe81072-B.mp3\tFrankie Trumbauer & His Orch\tRiverboat Shuffle\tOKeh\t40822\t81072-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043894-2.mp3\tMuggsy Spanier Ragtime Band\tRiverboat Shuffle\tBLUEBIRD\t10532\t043894-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE24225.mp3\tRed Nichols & His 5 Pennies\tRiverboat Shuffle\tBRUNSWICK\t6820\tE24225\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN568RS.mp3\tSidney Bechet W Claude Luter\tRiverboat Shuffle\tBLUENOTE\tBN568\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN11854-C.mp3\tWolverine Orchestra\tRiverboat Shuffle\tGENNETT\t5454\t11854-C\t1924\t\nhttp://www.jazz-on-line.com/a/mp3h/CLOSAH4.mp3\tRichard Hitter's Cabineers\tRiverboat Shuffle\tCLOVER\tEBS1063\tSAH4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe9108-A.mp3\tJimmy Joy's St. Anthony's Hotel Orchestra\tRiverboat Shuffle\tOKeh\t40388\t9108-A\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC38878.mp3\tAdrian Rollini And His Orchestra\tRiverboat Shuffle\tDECCA\t265B\t38878\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D307B1.mp3\tMuggsy Spanier And His Ragtime Band\tRiverboat Shuffle\tV-DISC\t307B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_164.mp3\tBenson Orchestra Of Chicago\tRiverboat Shuffle\tVICTOR\t19688B\t32715-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/TEM536y.mp3\tWolverines\tRiverboat Shuffle2\tTemple\t536\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/JAZ5x.mp3\tLu Watters's Yerba Buena Jazz B\tRiverside Blues\tJazz Man\t5\t\t\t\nhttp://www.78-tours.net/mp3/SWIOSW207.mp3\tAim Barelli, Christian Bellest, Raoul Coucoulle (tromp.) Maurice Gladieu (trombone) Alix Combelle (\tRiviera\tSWING\tSW. 111B\tOSW. 207\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU24319.mp3\tHarry Archer & His Orch\tRoam On Little Gypsy Sweetheart (vik)\tBRUNSWICK\t3640\t24319\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20920-A.mp3\tRevelers\tRoam On My Little Gypsy Swe\tVictor\t20920-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR144472-2.mp3\tUniversity Six\tRoam On My Little Gypsy Sweetheart\tHARMONY\t466-H\t144472-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62343-2.mp3\tHenry Allen & His Orchestra\tRoamin'\tVICTOR\t23006\t62343-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic62343-2.mp3\tHerny ''red'' Allen And His New York Orchestra\tRoamin'\tVictor\t23006\t62343-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4575.mp3\tLouis Jordan's Tympani 5\tRoamin' Blues\tDECCA\t24571\tL4575\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC60105x.mp3\tHarry Lauder\tRoamin' In The Gloamin'\tVICTOR\t60105\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_041.mp3\tHarry Lauder\tRoamin' In The Gloamin'\tVICTOR\t70061\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3e/COL81355-2.mp3\tCalifornia Ramblers\tRoamin' To Wyomin'\tCOLUMBIA\t39D\t81355-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_120.mp3\tCalifornia Ramblers\tRoamin' To Wyomin'\tCOLUMBIA\t39D\t81355-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS35112-2.mp3\tBrownie Mcghee\tRobbie Dobby Boogie\tSAVOY\t5550\tS35112-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38267.mp3\tClaude Thornhill\tRobbin's Nest\tCOLUMBIA\t38136\tCO38267\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1216-D2.mp3\tIllinois Jacquet Allstars\tRobbin's Nest\tAPOLLO\t769\tR1216-D2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB2186.mp3\tCount Basie & His Orchestra\tRobbin's Nest\tRCA\t20-2677\tD7VB2186\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_268.mp3\tCount Basie And His Orchestra\tRobbin's Nest\tRCA\t20-2677\tD7VB2186\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4304.mp3\tLionel Hampton Octet\tRobbins In Your Hair\tDECCA\t23792\tL4304\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-4304-A.mp3\tLionel Hampton And His Orchestra\tRobbins In Your Hair\tDecca\t23792\tL-4304-A\t1946\tLionel Hampton p  vib v dir. Joe Wilder Duke Garrette Leo Shepherd Joe Morris  Wendell Culley  Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn   Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb johnny Griffin ts, Charlie Fowlkes bar, Mi\nhttp://www.jazz-on-line.com/a/mp3c/MER8930RN.mp3\tOscar Peterson\tRobbins Nest\tMERCURY\t8930\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_199.mp3\tJill Corey\tRobe Of Calvary\tCOLUMBIA\t40123\tCO49848\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_380.mp3\tJane Froman Feat. O/henry Sylvern\tRobe Of Calvary\tCapitol\t2639\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051506.mp3\tLeadbelly\tRoberta\tBLUEBIRD\t8709\t051506\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_182.mp3\tLes Brown And His Orchestra Feat. V/ Butch Stone\tRobin Hood\tCOLUMBIA\t36763\tCO33824\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4537.mp3\tErroll Garner Trio\tRobin's Nest\tCOLUMBIA\t39580\tHCO4537\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74393.mp3\tElla Fitzgerald\tRobin's West\tDECCA\t24538\t74393\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18952.mp3\tOrville Knapp And His Orch\tRobins And Rose\tBRUNSWICK\t7649\t18952\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19239.mp3\tStuff Smith & Onyx Club Boys\tRobins And Roses\tVOCALION\t3234\t19239\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA323-A.mp3\tBing Crosby W Victor Young\tRobins And Roses\tDECCA\t791A\tDLA323-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh121.mp3\tCasani Club Orchestra Dir. By Charlie Kunz\tRobins And Roses (v George Barclay)\tRex\t8812\tF-1870-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/CONW24239-1.mp3\tCount Basie And His Orch\tRock A Bye Basie\tCONQUEROR\t9555\tW24239-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC73576-2.mp3\tGeorge Olsen & His Music\tRock A Bye Moon (v E.schutta)\tVICTOR\t24165\t73576-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/COL77720.mp3\tAl Jolson\tRock A Bye Your Baby With A Dixie Melody\tCOLUMBIA\tA-2560\t77720\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053206-1.mp3\tHarlan Leonard & His Rockets\tRock And Ride\tBLUEBIRD\t10883A\t053206-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA221.mp3\tBoswell Sisters - Jimmy Grier\tRock And Roll\tCOLUMBIA\t36523\tLA221\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_100.mp3\tBoswell Sisters Feat. Jimmie Grier's Orchestra\tRock And Roll\tBRUNSWICK\t7302\tLA221\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_006.mp3\tKay Starr\tRock And Roll Waltz\tRCA Victor\t6359\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_356.mp3\tSunny Gale\tRock And Roll Wedding\tRCA\t6479\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_273.mp3\tLouise Massey And The Westerners\tRock And Rye Polka\tVocalion\t5511\tWC2951-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_296.mp3\tBarry Gordon\tRock Around Mother Goose\tMGM\t12166\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC86163.mp3\tBill Haley And His Comets\tRock Around The Clock\tDECCA\t29124A\t86163\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D129B2.mp3\tSister Rosetta Tharpe With Lucky Millinder\tRock Daniel\tV-DISC\t129B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/V-DVP-392A.mp3\tSister Tharpe With Lucky Millinder And His Orchestra\tRock Daniel\tV-Disc\t129-B\tVP-392\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC025867.mp3\tLionel Hampton And His Orch\tRock Hill Special\tVICTOR\t26114\t025867\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic025867-1.mp3\tLionel Hampton And His Orchestra\tRock Hill Special\tVictor\t26114\t025867-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP398-3A.mp3\tLeadbelly\tRock Island Line\tCAPITOL\t10021\t398-3A-1\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_058.mp3\tLonnie Donegan\tRock Island Line\t London\t1650\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_322.mp3\tDon Cornell\tRock Island Line\tCoral\t61613\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62492.mp3\tTeddy Grace\tRock It For Me\tDECCA\t1398\t62492\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62738.mp3\tChick Webb And His Orchestra\tRock It For Me\tDECCA\t1586\t62738\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22768-1.mp3\tMildred Bailey\tRock It For Me\tCBS\tVO4083\t22768-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Col25751-1.mp3\tJimmie Lunceford And His Orchestra\tRock It For Me\tColumbia\t35860\t25751-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_355.mp3\tElla Fitzgerald Feat. Chick Webb Orchestra\tRock It For Me\tDECCA\t1586\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_096.mp3\tFontane Sisters\tRock Love\tDot\t15333\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69709.mp3\tLucky Millinder & His Orch\tRock Me\tDECCA\t18353B\t69709\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D129A1.mp3\tSister Rosetta Tharpe With Lucky Millinder\tRock Me\tV-DISC\t129A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/V-DVP-391A.mp3\tSister Tharpe With Lucky Millinder And His Orchestra\tRock Me\tV-Disc\t129-A\tVP-391\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69709-A.mp3\tLucky Millinder And His Orchestra\tRock Me\tDecca\t18353\t69709-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D397A2.mp3\tWings Over Jordan\tRock Me In The Bosom Of Abraham\tV-DISC\t397A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69357-A.mp3\tArt Tatum & His Band\tRock Me Mama\tDECCA\t8577A\t69357-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD310.mp3\tHelen Humes W Marshall Royal\tRock Me To Sleep\tDISC\t519\tD310\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5911.mp3\tWynonie Harris\tRock Mister Blues\tKING\t4389\tK5911\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8967.mp3\tAnita O'day\tRock N' Roll Blues\tMERCURY\t8967\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC87198.mp3\tAlma Gluck And Louise Homer\tRock Of Ages\tVICTOR\t87198\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_111.mp3\tAlma Gluck And Louise Homer\tRock Of Ages\tVICTOR\t87198\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC175.mp3\tJoe Turner\tRock Of Gibraltar\tNATIONAL\t\tNSC175\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_224.mp3\tGeorgia Gibbs\tRock Right\tMercury\t70811\tYBM12173-3\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149278-1.mp3\tGid Tanner's Skillet Lickers\tRock That Cradle Lucy\tCOLUMBIA\t15538 D\tW149278-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COL30209n.mp3\tBuddy Tate's Orch\tRock With Me Mama\tCOLUMBIA\t30209\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69440-A.mp3\tLucky Millinder And His Orchestra\tRock! Daniel\tDecca\t3956\t69440-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69440.mp3\tLucky Millinder & His Orch\tRock, Daniel (v Rosetta Tharpe)\tDECCA\t3956B\t69440\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_163.mp3\tBill Haley And His Comets\tRock-a-beatin' Boogie\tDecca\t29713\t88691\t1955\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC88691.mp3\tBill Haley And His Comets\tRock-a-beatin' Boogie\tDECCA\t29713\t88691\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM50S3083.mp3\tBob Wills And His Texas Playboys\tRock-a-bye Baby Blues\tMGM\t10731\t50S3083\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-109-1.mp3\tAlix Combelle And His Swing Band\tRock-a-bye Basie\tSwing\t73\tOSW-109-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24239-1.mp3\tCount Basie And His Orchestra\tRock-a-bye Basie\tVocalion\t4747\t24239-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_064.mp3\tJerry Lewis\tRock-a-bye Your Baby With A Dixie Melodie\tDecca\t30124\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_002.mp3\tAl Jolson\tRock-a-bye Your Baby With A Dixie Melody\tARC\tBR6502\tB12764-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA40-4134-A.mp3\tDuke Ellington And His Orchestra Featuring Johnny Hodges, Alto Sax\tRockabye River\tRCA VICTOR\t40-4134-A\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/DELX3212x.mp3\tRoy Brown\tRockin' At Midnight\tDELUXE\tX3212\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS6833.mp3\tJohnny Otis-mel Walker\tRockin' Blues (vmel Walker)\tSAVOY\t766A\tS6833\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU11421-B.mp3\tMills Bros\tRockin' Chair\tBRUNSWICK\t6278\t11421-B\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE30830.mp3\tGene Krupa And His Orch\tRockin' Chair\tOKEH\t6352\t30830\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC73304.mp3\tMildred Bailey\tRockin' Chair\tVICTOR\t24117\t73304\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59800-2.mp3\tHoagy Carmichael & His Orch\tRockin' Chair\tVICTOR\t25494\t59800-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2845.mp3\tFrankie Laine\tRockin' Chair\tMERCURY\t1180\t2845\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLC1859.mp3\tMildred Bailey & Her Orch\tRockin' Chair\tCOLUMBIA\t35943\tC1859\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COL403496-C.mp3\tLouis Armstrong And His Orchestra\tRockin' Chair\tCOLUMBIA\t2688 D\t403496-C\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe405135.mp3\tGarland Wilson (piano)\tRockin' Chair\tOKeh\t41556\t405135\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC063888-1.mp3\tFats Waller (piano Solo)\tRockin' Chair\tVICTOR\t27765\t063888-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC067738.mp3\tArtie Shaw And His Orchestra\tRockin' Chair\tVICTOR\t27664\t067738-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73689.mp3\tRoy Eldridge & His Orchestra\tRockin' Chair\tDECCA\t23697\t73689\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/DECGB5174.mp3\tNat Gonella\tRockin' Chair\tDECCA\t8726\tGB5174\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/Cha17162.mp3\tBud Ritchie And His Boys\tRockin' Chair\tChampion\t16109\t17162\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_158.mp3\tLouis Armstrong And Hoagy Carmichael\tRockin' Chair\tCOLUMBIA\t2688 D\t403496-C\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_226.mp3\tMildred Bailey\tRockin' Chair\tVOCALION\t3553\tC1859\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/CROC1119-1.mp3\tJack Teagarden & His Orch\tRockin' Chair (v E M)\tCROWN\t3051\tC1119-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62115.mp3\tMills Brothers\tRockin' Chair Swing\tDECCA\t1227\t62115\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC67401-1.mp3\tDuke Ellington Orch\tRockin' In Rhythm\tVICTOR\t26310\t67401-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVicVI26310.mp3\tDuke Ellington & His Famous Orchestra\tRockin' In Rhythm\tVictor\tVI26310\t\t1931\tthis recording is wrong following an expert\nhttp://www.jazz-on-line.com/a/mp3w/1931_208.mp3\tDuke Ellington And His Orch.\tRockin' In Rhythm\tBRUNSWICK\t6038\tE35801\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73324.mp3\tLionel Hampton & His Orch\tRockin' In Rhythm Part 1\tDECCA\t24415\t73324\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73325.mp3\tLionel Hampton & His Orch\tRockin' In Rhythm Part 2\tDECCA\t24415\t73325\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73324-A.mp3\tLionel Hampton And His Orchestra\tRockin' In Rhythm, Part 1\tDecca\t24415\t73324-A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73325-A.mp3\tLionel Hampton And His Orchestra\tRockin' In Rhythm, Part 2\tDecca\t24415\t73325-A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU026855.mp3\tErskine Hawkins & His Orch\tRockin' Roller's Jubilee\tBLUEBIRD\t7826\t026855\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC027916.mp3\tBunny Berigan & His Orch\tRockin' Roller's Jubilee\tVICTOR\t26077A\t027916\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29249-1.mp3\tCount Basie And His Orchestra\tRockin' The Blues\tOkeh\t6010\t29249-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_416.mp3\tBill Haley And His Comets\tRockin' Through The Rye\tDecca\t29948\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC89616.mp3\tBill Haley And His Comets\tRockin' Thru The Rye\tDECCA\t29948\t89616\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044589.mp3\tHarlan Leonard & His Rockets\tRockin' With The Rockets\tBLUEBIRD\t10586\t044589\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81669-2.mp3\tBessie Smith\tRocking Chair Blues\tCOLUMBIA\t14020 D\t81669-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0619_02.mp3\tLee Morse\tRocking Chair Blues\tPerfect\t11582B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe404804-A.mp3\tHarlem Footwarmers (ellington)\tRocking In Rhythm\tOKeh\t8869\t404804-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC313.mp3\tJoe Turner\tRocks In My Bed\tNATIONAL\t\tNSC313\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC061685.mp3\tDuke Ellington Orch\tRocks In My Bed\tVICTOR\t27639\t061685\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS27852-1.mp3\tColeman Hawkins\tRocky Comfort\tCBS\toK6284\t27852-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143344-3.mp3\tFletcher Henderson And His Orch\tRocky Mountain Blues\tCOLUMBIA\t970 D\tW143344-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW404483.mp3\tDuke Ellington Harlem Fw\tRocky Mountain Blues\tCOLUMBIA\t35682\tW404483\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149276-2.mp3\tGid Tanner's Skillet Lickers\tRocky Pallet\tCOLUMBIA\t15516 D\tW149276-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64606-1.mp3\tMckinney's Cotton Pickers\tRocky Road\tVICTOR\t22932\t64606-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC4354.mp3\tBill Monroe Bluegrass Boys\tRocky Road Blues\tCOLUMBIA\t36907\tC4354\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09576-3.mp3\tBenny Goodman And His Orchestra\tRoll 'em\tVICTOR\t25627B\t09576-3\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC653.mp3\tMary Lou Williams\tRoll 'em\tASCH\t1003\t653\t1944\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25627B.mp3\tBenny Goodman And His Orchestra\tRoll 'em\tVictor\t25627B\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/EME43018.mp3\tCalifornia Melody Syncopators\tRoll 'em Girls\tEMERSON\t-3010\t43018\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLB23892-1.mp3\tJoe Turner And Pete Johnson Vocal By Joe Turner\tRoll 'em Pete\tCOLUMBIA\t35959\t23892-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU70645-2.mp3\tJimmie Rodgers\tRoll Along Kentucky Moon\tBLUEBIRD\t5082\t70645-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_136.mp3\tSmith Ballew And His Orchestra\tRoll Along, Prairie Moon\tMelotone\t351006\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU02546-1.mp3\tMonroe Brothers\tRoll In My Sweet Baby's Arms\tBLUEBIRD\t6773\t02546-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU5317.mp3\tAllen Brothers\tRoll It Down\tBLUEBIRD\t5317\t69328\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU69328.mp3\tAllen Brothers\tRoll It Down\tBLUEBIRD\t5317\t69328\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/COL00067.mp3\tBilly Golden\tRoll On The Ground\tCOLUMBIA\tBUB-67\t00067\t1901\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_045.mp3\tBilly Golden\tRoll On The Ground\tCOLUMBIA\tBUB-67\t00067\t1901\t\nhttp://www.jazz-on-line.com/a/mp3b/MER456.mp3\tJay Mcshann & His Sextet\tRoll On, Katy\tMERCURY\t8018\t456\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_090.mp3\tBoswell Sisters Feat. Dorsey Brothers Orchestra\tRoll On, Mississippi, Roll On\tBRUNSWICK\t6109\tE36654\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic53067-1.mp3\tConnie's Inn Orchestra\tRoll On, Mississippi, Roll On\tVictor\t22698\t53067-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_202.mp3\tChuck Berry And His Combo\tRoll Over Beethoven\tChess\t1626\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/VICOB4634.mp3\tRay Noble And His Orchestra\tRoll Up The Carpet\tVICTOR\t25262\tOB4634\t1933\twith Al Bowlly\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10523.mp3\tFrankie Laine\tRollin' Down The Line\tCOLUMBIA\t40198\tRHCO10523\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN9818-3.mp3\tBen Pollack & His Orchestra\tRollin' Down The River (vben Pollack)\tBANNER\t752\t9818-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_099.mp3\tFontane Sisters\tRollin' Stone\tDot\t15370\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_234.mp3\tPerry Como And Fontane Sisters\tRollin' Stone\tRCA Victor\t4269\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3h/EDI11854.mp3\tJoe Herlihy And His Orchestra\tRolling Around In Roses\tEDISON\t52100\t11854\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC18723-1.mp3\tAl Campbell & Henry Burr\tRolling Stones\tVICTOR\t18215\t18723-1\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/COLH1245-1.mp3\tBob Wills Texas Playboys\tRoly Poly\tCOLUMBIA\t36966\tH1245-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29989.mp3\tBillie Holiday\tRomance In The Dark\tOKEH\t6214\t29989\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_224.mp3\tLarry Clinton And His Orchestra\tRomance In The Dark\tVictor\t25800\t021023-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_291.mp3\tLil Green And Big Bill Broonzy\tRomance In The Dark\tBluebird\t8524\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_291.mp3\tLil Green And Big Bill Broonzy\tRomance In The Dark\tBluebird\t8524\t44974\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_073.mp3\tBen Selvin And His Orchestra\tRomany Love\tBrunswick\t2273\t7899\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26708-2.mp3\tPaul Whiteman & His Orch\tRomany Love\tVICTOR\t18966\t26708-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU7899.mp3\tBen Selvin And His Orch\tRomany Love\tBRUNSWICK\t2273\t7899\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14233-A.mp3\tAbe Lyman And His California Or.\tRome Wasn't Built In A Day\tBRUNSWICK\t6699\t14233-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_289.mp3\tAndy Griffith\tRomeo And Juliet\tCAPITOL\t2698\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU030R.mp3\tEdmond Hall Allstar Qunitet\tRompin' In 44\tBLUENOTE\tBN030\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC39065-3.mp3\tCoon Sanders Nighthawk Orch\tRoodles (scat Vocal)\tVICTOR\t20785B\t39065-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE27639-A.mp3\tBenny Goodman's Boys\tRoom 1411\tBRUNSWICK\t4013\tE27639-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh141.mp3\tAmbrose And His Orchestra\tRoom 504 (v Anne Shelton)\tDecca\tF-7742\tDR-5360-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO40692-1.mp3\tGeorge Morgan W String Band\tRoom Full Of Roses\tCOLUMBIA\t20594\tCO40692-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MER2749-2.mp3\tEddy Howard And His Orchestra\tRoom Full Of Roses\tMERCURY\t5296\t2749-2\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_060.mp3\tJerry Wayne\tRoom Full Of Roses\tCOLUMBIA\t38525\tCO40823\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_037.mp3\tEddy Howard And His Orchestra\tRoom Full Of Roses\tMERCURY\t5296\t2749-2\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe8478-A.mp3\tKing Oliver's Jazz Band\tRoom Rent Blues\tOKeh\t8148\t8478-A\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17262H.mp3\tThe Dutch Swing College Band\tRoom Rent Blues\tPhilips\tP17262H\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLRR900-1.mp3\tAmos Milburn\tRoomin' House Boogie\tALLADDIN\t3032\tRR900-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe403313-A.mp3\tRoosevelt Sykes\tRoosevelt Blues\tOKeh\t8776\t403313-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC82016.mp3\tBuddy Johnson And His Orch\tRoot Man Blues (vocal Geezil Minerve)\tDECCA\t27998\t82016\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM47S6018.mp3\tHank Williams\tRootie Tootie\tMGM\t10124\t47S6018\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_101.mp3\tNora Bayes And Jack Norworth\tRosa Rosetta\tVictor\t70019\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63168.mp3\tLouis Prima's New Orleans Gang\tRosalie\tDECCA\t1618\t63168\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC014671-1.mp3\tLeo Reisman & His Orch\tRosalie\tVICTOR\t25698B\t014671-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-10126-B.mp3\tArtie Shaw And His Orchestra\tRosalie (from M-g-m Film \"rosalie\")\tBLUEBIRD\tB-10126-B\t031493-1\t1939\tVocal refrain by Tony Pastor\nhttp://www.jazz-on-line.com/a/mp3a/CBS21642-1.mp3\tSammy Kaye Swing And Sway Orch\tRosalie (vt.ryan)\tCBS\tVO3700\t21642-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH738-1.mp3\tAl Dexter Texans\tRosalita\tOKEH\t6708\tH738-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_217.mp3\tAl Dexter And His Troopers\tRosalita\tCOLUMBIA\t20267\tH738\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_202.mp3\tVic Damone Feat. O/norman Leyden\tRosanne\tMERCURY\t5877\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41952.mp3\tBill Helms Upson County Band\tRoscoe Trillion\tVICTOR\t40079\t41952\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_058.mp3\tPaul Biese Trio\tRose\tCOLUMBIA\tA-3352\t79560\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_148.mp3\tFour Vagabonds\tRose Ann Of Charing Cross\tBLUEBIRD\t30-0811\tD3AB4\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC30832-4.mp3\tPaul Whiteman & His Orch\tRose Marie\tVICTOR\t19461\t30832-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_165.mp3\tJesse Crawford\tRose Marie\tDECCA\t23663\t70635\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_055.mp3\tJohn Mccormack\tRose Marie\tVictor\t1067\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU061546.mp3\tFreddie Martin And His Orchestra\tRose O'day\tBLUEBIRD\t11286\t061546\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO31627-1.mp3\tKate Smith\tRose O'day\tCOLUMBIA\t36448\tCO31627-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11286.mp3\tFreddy Martin & His Orchestra\tRose O'day\tBluebird\t11286\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_125.mp3\tWoody Herman And His Orchestra\tRose O'day\tDECCA\t4113B\t70080\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_077.mp3\tCharles Hart And Elliott Shaw\tRose Of No Man's Land\tVictor\t18508\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_111.mp3\tCharles Harrison\tRose Of No Man's Land\tCOLUMBIA\t2670\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC22411-2.mp3\tCharles Hart-elliott Shaw\tRose Of No Mans Land\tVICTOR\t18508\t22411-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1890.mp3\tWillie Lewis & Negro Band\tRose Of Picardie\tVARSITY\tEL4069s\t1890\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_118.mp3\tWalter Van Brunt And Helen Clark\tRose Of Pyramid Land\tVICTOR\t17173\t12364-3\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM833-1.mp3\tDuke Ellington's Famous Orch\tRose Of The Rio Grand\tBRUNSWICK\t8186\tM833-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU9478.mp3\tMarion Harris\tRose Of The Rio Grande\tBRUNSWICK\t2370\t9478\t1922\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC61155.mp3\tCasa Loma Orchestra\tRose Of The Rio Grande\tDECCA\t869A\t61155\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_027.mp3\tMarion Harris\tRose Of The Rio Grande\tBRUNSWICK\t2370\t9478\t1923\t\nhttp://www.78-tours.net/mp3/LONDR9012.mp3\tAmbose And His Orchestra\tRose Of Washington Square\tLONDON\t120\tDR.9012 A\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC035717.mp3\tBenny Goodman And His Orchestra\tRose Of Washington Square\tVICTOR\t26230\t035717\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC91711.mp3\tBob Crosby & His Orch\tRose Of Washington Square\tDECCA\t2464B\tC91711\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79084.mp3\tHenry Burr (tenor)\tRose Of Washington Square\tCOLUMBIA\tA-2928\t79084\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE30057-A.mp3\tRed Nichols & His Orch\tRose Of Washington Square\tBRUNSWICK\t4778\tE30057-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_019.mp3\tKentucky Serenaders\tRose Of Washington Square\tCOLUMBIA\tA-2908\t79007-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_050poo.mp3\tHenry Burr\tRose Of Washington Square\tCOLUMBIA\t2928\t79084\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_156.mp3\tBenny Goodman And His Orchestra\tRose Of Washington Square\tVICTOR\t26230\t035717\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VARB0572.mp3\tWillie Smith+sidney Bechet Or\tRose Rhumba\tVARSITY\t8405\tB0572\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU037717.mp3\tArt Hinett Threesome (organ)\tRose Room\tBLUEBIRD\t10392\t037717\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU031865-1.mp3\tArtie Shaw And His Orchestra\tRose Room\tBLUEBIRD\tB-10148-B\t031865-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW24997-A.mp3\tJohn Kirby And His Orch\tRose Room\tCOLUMBIA\t36000\tW24997-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWCO26133.mp3\tBenny Goodman Sextet\tRose Room\tCOLUMBIA\t36720\tWCO26133\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC65185.mp3\tTony Martin - Abe Lyman\tRose Room\tDECCA\t2433A\t65185\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057653.mp3\tAlvino Rey\tRose Room\tBLUEBIRD\t11002\t057653\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-3409RR.mp3\tErskine Hawkins & His Orch.\tRose Room\tRCA\t20-3409\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCMEM123.mp3\tSwift Jewel Cowboys\tRose Room\tVOCALION\t5449\tMEM123\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COM4688.mp3\tEddie Condon & His Band\tRose Room\tCOMMODORE\t603\t4688\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU94520.mp3\tBoots And His Buddies\tRose Room\tBLUEBIRD\t6063B\t94520\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8995rr.mp3\tCharlie Ventura & His Orch\tRose Room\tMERCURY\t8995\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU11265-A.mp3\tDuke Ellington & His Orch\tRose Room\tBRUNSWICK\t6265\t11265-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/HMWOLA-1709-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tRose Room\tHMW\tB-8718\tOLA-1709-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/KEYHL82.mp3\tBarney Bigard Quintet\tRose Room\tKEYNOTE\t617\tHL82\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/COL78676-1.mp3\tArt Hickman's Orch\tRose Room\tCOLUMBIA\tA-2858\t78676-1\t1919\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC65361.mp3\tPaul Whiteman's Bouncing Brass\tRose Room\tDECCA\t2466A\t65361\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DeLD-173.mp3\tBenny Carter And His All Star Orchestra\tRose Room\tDe Luxe\t1028\tD-173\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_176.mp3\tDuke Ellington\tRose Room\tBRUNSWICK\t6265\t11265-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480709.mp3\tBenny Goodman Trio\tRose Room\tPausa\t9031\t20547-4\t1954\tBenny Goodman (cl), Mel Powell (p), Bobby Donaldson (dm)\nhttp://www.jazz-on-line.com/a/mp3e/DEC38533-A.mp3\tJimmie Lunceford And His Orchestra\tRose Room (in Sunny Roseland)\tDECCA\t131B\t38533-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VocB-20859-1.mp3\tFletcher Henderson And His Orchestra\tRose Room (in Sunny Roseland)\tVocalion\t3511\tB-20859-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4458.mp3\tFrankie Laine\tRose Rose I Love You\tCOLUMBIA\t39367\tHCO4458\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5315.mp3\tWynonie Harris\tRose, Get Your Clothes\tKING\t4202\tK5315\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC61545-A.mp3\tCount Basie And His Orch\tRoseland Shuffle\tDECCA\t1141\t61545-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_138.mp3\tKay Kyser And His Orchestra\tRosemary\tCOLUMBIA\t36824\tHCO1401\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC34796-1.mp3\tJean Goldkette & His Orch\tRoses\tVICTOR\t20033\t34796-1\t19/6\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_203.mp3\tRay Anthony Feat. Ronnie Deauville\tRoses\tCapitol\t1001\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU010592.mp3\tOzzie Nelson & His Orch\tRoses In December\tBLUEBIRD\t7034\t010592\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011119.mp3\tBunny Berigan & His Orch\tRoses In December\tVICTOR\t25613A\t011119\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh200.mp3\tCarroll Gibbons And The Savoy Hotel Orpheans\tRoses In December (v Anne Lenner)\tColumbia\tFB-1857\tCA-16747-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_115.mp3\tFrankie Carle And His Orchestra\tRoses In The Rain\tCOLUMBIA\t37252\tCO37214\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO30145.mp3\tAl Goodman & His Orch\tRoses Of Picardy\tCOLUMBIA\t36218\tCO30145\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE29296.mp3\tRed Nichols & His 5 Pennies\tRoses Of Picardy\tBRUNSWICK\t4286\tE29296\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19117.mp3\tThe Troubadours\tRoses Of Picardy\tVictor\t19117\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic64825.mp3\tJohn Mccormack\tRoses Of Picardy\tVictrola\t64825\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_112alt.mp3\tJohn Mccormack\tRoses Of Picardy\tVICTOR\t64825\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3l/COL80940.mp3\tPaul Specht And His Orchestra\tRoses Of Picardy\tCOLUMBIA\tA-3870\t80940\t1923\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480620.mp3\tBen Webster\tRoses Of Picardy\tVerve\t833551-2\t21748-1\t1957\tBen Webster (p), Ray Brown (sb), Stan Levey (dm)\nhttp://www.jazz-on-line.com/a/mp3a/BLU040480-3.mp3\tEarl Hines (piano)\tRosetta\tBLUEBIRD\t10555\t040480-3\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BluBN-250-2.mp3\tSammy Benskin Trio\tRosetta\tBlue Note\t\tBN-251\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC04238-1.mp3\tBenny Goodman And His Orchestra\tRosetta\tVICTOR\t25510\t04238-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2094.mp3\tFrankie Laine\tRosetta\tMERCURY\t5227\t2094\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88782-1.mp3\tFats Waller And His Rhythm\tRosetta\tVICTOR\t25026\t88782-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66051.mp3\tWoody Herman & His Orchestra\tRosetta\tDECCA\t2728A\t66051\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4813.mp3\tMuggsy Spanier Ragtime Band\tRosetta\tCOMMODORE\t586\t4813\t1944\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU94512.mp3\tJoe Kennedy & His Orch\tRosetta\tBLUEBIRD\t6080\t94512\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-730-1.mp3\tDjango Reinhardt\tRosetta\tGramophone\tK-7618\tOLA-730-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-114-1.mp3\tAndr Ekyan (with Django Reinhardt)\tRosetta\tSWING\t98\tOSW-114-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC9465.mp3\tEarl Hines And His Orchestra\tRosetta\tDECCA\t337A\tC9465\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18132-1.mp3\tTeddy Wilson And His Orchestra\tRosetta\tBRUNSWICK\t7563\tB-18132-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS152754-2.mp3\tTeddy Wilson (piano)\tRosetta\tCBS\t66370\t152754-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu040480-3.mp3\tEarl Hines\tRosetta\tBluebird\tB-10555\t040480-3\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Mer1893.mp3\tDexter Gordon Quintet\tRosetta\tMercury\t8900\t1893\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/KeyHL-28.mp3\tCharlie Shavers Quintet\tRosetta\tKeynote\t1304\tHL-28\t1944\tCharlie Shavers t, Tab Smith as, Earl Hines p,Al Lucas b, Jo Jones d\nhttp://www.jazz-on-line.com/a/mp3h/VicD8VB3458.mp3\tRose Murphy (the Chee-chee Girl)\tRosetta\tVictor\t20-3409-A\tD8VB3458\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_137.mp3\tJean Goldkette And His Orchestra\tRosetta\tVICTOR\t20675B\t37583-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62645.mp3\tRosetta Howard W Harlem Hamfat\tRosetta Blues\tDECCA\t7370\t62645\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC45987-4.mp3\tJean Goldkette & His Orch\tRosette\tVICTOR\t21527\t45987-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUD3AB5.mp3\tFour Vagabonds\tRosie The Riveter\tBLUEBIRD\t30-0810\tD3AB5\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_0630_02.mp3\tLee Morse And Her Bluegrass Boys\tRosita\tColumbia\t1082DB\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18815d.mp3\tEddie Ross\tRoss' Dog Trot\tVictor\t18815\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18815r.mp3\tEddie Ross\tRoss' Reel\tVictor\t18815\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR144022-2.mp3\tUniversity Six\tRosy Cheeks\tHARMONY\t399-H\t144022-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK9211.mp3\tWynonie Harris\tRot Gut\tKING\t4592\tK9211\t1952\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic23756.mp3\tAllen Brothers\tRough Neck Blues\tVictor\t23756\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC74812-1.mp3\tAllen Bros\tRough Neck Blues\tVICTOR\t23756\t74812-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82076.mp3\tElla Fitzgerald\tRough Ridin'\tDECCA\t27948\t82076\t1952\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480890.mp3\tTed Heath And His Music\tRoumanian Roundabout\tDECCA\tF9435\tDR-14492\t1950\tBobby Pratt, Stan Roderick, Stan Reynolds, Ronnie Hughes (tp) Jackie Armstrong, Maurice Pratt, Jack Bentley, Jimmy Coombes (tb) Les Gilbert, Reg Owen (as) Tommy Whittle, Henry Mackenzie (ts) Dave Shand (bar) Frank Horrox (p) Sammy Stokes (b) Jack Parnell (d) Ted Heath (dir) \nhttp://www.jazz-on-line.com/a/mp3b/CAP5113-2.mp3\tBlue Lu Barker\tRound And Round The Valley\tCAPITOL\t\t5113-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146914-3.mp3\tJan Garber & His Orch\tRound Evening\tCOLUMBIA\t1550 D\tW146914-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT450.mp3\tCootie Williams & His Orch\tRound Midnight\tMAJESTIC\t7119\tT450\t1944\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC72000.mp3\tCoon-sanders Orchestra\tRound My Heart\tVICTOR\t22972\t72000\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22907.mp3\tMildred Bailey & Her Orchestra\tRound My Old Deserted Farm\tVOCALION\t4139\t22907\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2115.mp3\tRoy Rogers Buckle Busters\tRound That Couple, Go Through And Swing\tDECCA\t3734B\tDLA2115\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022485.mp3\tBunny Berigan & His Orch\tRound The Old Deserted Farm\tVICTOR\t25858A\t022485\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA437-A.mp3\tBing Crosby\tRound Up Lullaby\tDECCA\t870B\tDLA437-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1029.mp3\tKing Cole Trio\tRoute 66\tCAPITOL\t\t1029\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER363-2.mp3\tBuddy Rich & His Orchestra\tRoute 66\tMERCURY\t3025\t363-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC12555-3.mp3\tAda Jones\tRow Row Row\tVICTOR\t17205\t12555-3\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_083.mp3\tArthur Collins And Byron Harlan\tRow! Row! Row!\tEDISON AMBEROL\t1529\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_111.mp3\tEddie Cantor\tRow, Row, Rosie\tCOLUMBIA\t415D\tW140641\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW140641.mp3\tEddie Cantor\tRow, Row, Rosie!\tCOLUMBIA\t415D\tW140641\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_088.mp3\tAmerican Quartet\tRow, Row, Row\tVictor\t17295\t12898-3\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_230.mp3\tMitchell Ayres And His Fashions In Music Feat. Mary Ann Mercer\tRow, Row, Row\tBluebird\t10541\t046009-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151005.mp3\tJimmie Tarlton\tRoy Dixon\tCOLUMBIA\t15629 D\tW151005\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/V-DVP1703.mp3\tRoy Eldridge Jazz Band\tRoy Meets Horn\tV-DISC\t612\tVP1703\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru70416-A.mp3\tLionel Hampton Sextet\tRoyal Family\tBrunswick\t87526\t70416-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030450-1.mp3\tMezz Mezzrow-t.ladnier Qt\tRoyal Garden Blues\tBLUEBIRD\t10087\t030450-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW81519.mp3\tBix Beiderbecke And No Lucky-7\tRoyal Garden Blues\tCOLUMBIA\t35664\tW81519\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44285.mp3\tBobby Hackett\tRoyal Garden Blues\tCOLUMBIA\t39021\tCO44285\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO874.mp3\tCount Basie & His Band\tRoyal Garden Blues\tCOLUMBIA\t36710\tHCO874\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/MOD203.mp3\tBen Pollack Pick-a-rib Boys\tRoyal Garden Blues\tMODERN\t203\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN11931-C.mp3\tWolverine Orchestra\tRoyal Garden Blues\tGENNETT\t20062\t11931-C\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC25413-4.mp3\tOriginal Dixieland Jazz Band\tRoyal Garden Blues\tVICTOR\t18798\t25413-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCW24946-A.mp3\tJohn Kirby & His Orchestra\tRoyal Garden Blues\tVOCALION\t5187\tW24946-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99950-1.mp3\tTommy Dorsey & His Orch\tRoyal Garden Blues\tVICTOR\t25326\t99950-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU029R.mp3\tEdmond Hall Bluenote Jazzmen\tRoyal Garden Blues\tBLUENOTE\tBN029\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM1889-A.mp3\tThe Dutch Swing College Band\tRoyal Garden Blues\tDecca\tM32754\tAM1889-A\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC61217.mp3\tBob Crosby & His Orchestra\tRoyal Garden Blues\tDECCA\t3339A\t61217\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_029.mp3\tOriginal Dixieland Jazz Band\tRoyal Garden Blues\tVICTOR\t18798\t25413-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu030450-1.mp3\tMezz Mezzrow - Ladnier Quintet\tRoyal Garden Blues\tBluebird\tB-10087\t030450-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Col151398-2.mp3\tTed Lewis And His Band\tRoyal Garden Blues\tColumbia\t2527-D\t151398-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-132-1.mp3\tBenny Carter And His Swing Quintet\tRoyal Garden Blues\tVocalion\tS-46\tS-132-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/BlaBW21.mp3\tCliff Jackson\tRoyal Garden Blues\tBlack & White\t26\tBW21\t1944\tWilliams\nhttp://www.jazz-on-line.com/a/mp3a/ARC17064.mp3\tTed Lewis And His Band\tRoyal Garden Blues (151398)\tARC\tCo35684\t17064\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80356.mp3\tLouis Armstrong & His Orch\tRoyal Garden Blues Part.1\tDECCA\t28096\t80356\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80357.mp3\tLouis Armstrong & His Orch\tRoyal Garden Blues Part.2\tDECCA\t28095\t80357\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_160.mp3\tRalph Flanagan And His Orchestra\tRub-a-dub-dub\tRCA VICTOR\t5361\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66310.mp3\tTexas Wanderers (c.bruner)\tRubber Dolly\tDECCA\t5740\t66310\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70115x.mp3\tRichard Hayman\tRuby\tMERCURY\t70115\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC84387.mp3\tColeman Hawkins W Paul Nielson\tRuby\tDECCA\t28713\t84387\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_053.mp3\tLes Baxter And His Orchestra\tRuby\tCapitol\t2457\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_392.mp3\tLes Brown And His Orchestra\tRuby\tCORAL\t60959\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC77025-1.mp3\tDuke Ellington & His Orch\tRude Interlude\tVICTOR\t24431\t77025-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO3810.mp3\tGene Autry\tRudolph The Red-nosed Reindeer\tCOLUMBIA\t38610\tHCO3810\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_103.mp3\tGene Autry Feat. The Pinafores\tRudolph, The Red-nosed Reindeer\tCOLUMBIA\t38610\t38610\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_216.mp3\tBill Haley And His Comets\tRudy's Rock\tDecca\t30985\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUKC585.mp3\tGeorge Lee & His Orch\tRuff Scufflin'\tBRUNSWICK\t4684\tKC585\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU046738.mp3\tGlenn Miller And His Orch\tRug Cutter's Swing\tBLUEBIRD\t10754\t046738\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38724-A.mp3\tFletcher Henderson & His Orch\tRug Cutter's Swing\tDECCA\t342B\t38724-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC38724-A.mp3\tFletcher Henderson And His Orchestra\tRug Cutter's Swing\tDECCA\t342\t38724-A  \t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLA76-1.mp3\tWynonie Harris & His Allstars\tRugged Road\tALLADDIN\t172\tA76-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO34085.mp3\tAbe Lyman And His Orchestra Vocal By Rose Blane\tRum And Coca Cola\tCOLUMBIA\t36775\tCO34085\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC72460A.mp3\tAndrews Sisters\tRum And Coca Cola\tDECCA\t18636A\t72460A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_001.mp3\tAndrews Sisters\tRum And Coca-cola\tDECCA\t18636\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_113.mp3\tVaughn Monroe And His Orchestra\tRum And Coca-cola\tVictor\t1637\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/HITT490.mp3\tLouis Prima & His Orch\tRum And Coca-cola (v Lilyann Carol)\tHIT OF THE WEEK\t7125A\tT490\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC81684.mp3\tSy Oliver & His Orchestra\tRumania, Rumania\tDECCA\t28793\t81684\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57301-1.mp3\tBennie Moten's Kansas City Or.\tRumba Negra\tVICTOR\t23037\t57301-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCL5491.mp3\tLecuona Cuban Boys\tRumba Tambah\tCOLUMBIA\t36250\tCL5491\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1899.mp3\tFrankie Carle\tRumors Are Flying\tCOLUMBIA\t37069\tHCO1899\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4239.mp3\tAndrews Sisters And Les Paul\tRumors Are Flying\tDECCA\t23656\tL4239\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_041.mp3\tAndrews Sisters And Les Paul\tRumors Are Flying\tDECCA\t23656\tL4239\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_003.mp3\tFrankie Carle And His Orchestra Feat. Marjorie Hughes\tRumors Are Flying\tCOLUMBIA\t37069\tHCO1899\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_070.mp3\tBilly Butterfield And His Orchestra Feat. Pat O'connor\tRumors Are Flying\tCapitol\t282\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061336.mp3\tFats Waller And His Rhythm\tRump Steak Serenade\tBLUEBIRD\t11296B\t061336\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73886.mp3\tLouis Jordan\tRun Joe\tDECCA\t24448\t73886\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC3518.mp3\tCab Calloway & His Orch\tRun Little Rabbit\tOKEH\t6084\tC3518\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOKE6084.mp3\tCab Calloway & His Orchestra\tRun Little Rabbit\tOKEH\t6084\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143796.mp3\tGid Tanner's Skillet Lickers\tRun Nigger Run\tCOLUMBIA\t15158 D\tW143796\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COL30203.mp3\tBill Landford And Landfordairs\tRun On For A Long Time\tCOLUMBIA\t30203\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU9487.mp3\tCotton Pickers\tRunnin' Wild\tBRUNSWICK\t2382\t9487\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC39554-A.mp3\tJimmie Lunceford And His Orchestra\tRunnin' Wild\tDECCA\t503B\t39554-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC04561-1.mp3\tBenny Goodman Qt\tRunnin' Wild\tVICTOR\t25529-A\t04561-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035767.mp3\tGlenn Miller And His Orchestra\tRunnin' Wild\tBLUEBIRD\t10269\t035767\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU10014.mp3\tMarion Harris\tRunnin' Wild\tBRUNSWICK\t2410\t10014\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/ARA1045-1A.mp3\tArt Tatum\tRunnin' Wild\tARA\t4503B\tARA1045-1A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80703-3.mp3\tTed Lewis & His Jazz Band\tRunnin' Wild\tCOLUMBIA\tA-3790\t80703-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE34927.mp3\tDuke Ellington & His Orch\tRunnin' Wild\tBRUNSWICK\t6732\tE34927\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5239.mp3\tTeddy Wilson Quintet\tRunnin' Wild\tMUSICRAFT\t319\t5239\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/HMVOLA-1712-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tRunnin' Wild\tHMV\tB-8614\tOLA-1712-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_199.mp3\tGlenn Miller And His Orchestra\tRunnin' Wild\tBLUEBIRD\t10269\t035767\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61346-A.mp3\tJimmie Lunceford And His Orchestra\tRunning A Temperature\tDecca\t1035\t61346-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61346-A.mp3\tJimmie Lunceford And His Orchestra\tRunning A Temperature.mp3\tDecca\t1035\t61346-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC038105.mp3\tTommy Dorsey & His Orch\tRunning Through My Mind\tVICTOR\t26325\t038105\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3323B.mp3\tStan Getz Qt & T.reig\tRunning Water\tSAVOY\t954A\tS3323B\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1282.mp3\tArnett Cobb & His Orchestra\tRunning With Ray\tAPOLLO\t784\tR1282\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCE28948.mp3\tWhoopee Makers (pettis)\tRush Inn Blues\tVOCALION\t15769\tE28948\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU025478.mp3\tBenny Goodman And His Orchestra\tRussian Lullaby\tBLUEBIRD\t11226\t025478\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1443.mp3\tRed Norvo And His Orch\tRussian Lullaby\tBRUNSWICK\t7975\tLA1443\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC38468-3.mp3\tRoger Wolfe Kahn And His Orch\tRussian Lullaby\tVICTOR\t20602\t38468-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC017768-1.mp3\tBunny Berigan And His Orch\tRussian Lullaby\tVICTOR\t26001B\t017768-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D85.mp3\tTeddy Wilson Trio\tRussian Lullaby\tV-DISC\t016\t85\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ASCMA710.mp3\tMary Lou Williams Trio\tRussian Lullaby\tASCH\t351-1\tMA710\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_350.mp3\tBunny Berigan And His Orchestra\tRussian Lullaby\tVICTOR\t26001B\t017768-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_162.mp3\tJesse Crawford (organ)\tRussian Lullaby\tVICTOR\t20791\t39067\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76350.mp3\tLouis Armstrong & His Allstars\tRussian Lullaby Part 1\tDECCA\t27188\t76350\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76350-76351.mp3\tLouis Armstrong\tRussian Lullaby Part 1 & Part 2\tDECCA\t\t76350-76351\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76351.mp3\tLouis Armstrong & His Allstars\tRussian Lullaby Part 2\tDECCA\t27187\t76351\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI8849-C.mp3\tAtlantic Dance Orchestra\tRussian Rose\tEDISON\t51056\t8849-C\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh132.mp3\tGeraldo And His Orchestra\tRussian Rose\tParlophone\tF-1861\tCE-10796-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_209.mp3\tJohnny Long And His Orchestra\tRussian Rose\tDecca\t4126\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D271B.mp3\tClaude Thornhill And His Orchestra\tRustle Of Spring\tV-DISC\t271B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM745-2.mp3\tCab Calloway & His Orchestra\tRustle Of Swing\tVOCALION\t4144\tM745-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_109.mp3\tCount Basie And His Orchestra Feat. Jimmy Rushing\tRusty Dusty Blues\tCOLUMBIA\t36675\tHCO888\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62064.mp3\tChick Webb & His Orchestra\tRusty Hinge\tDECCA\t1273\t62064\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB30.mp3\tArtie Shaw And His Orchestra\tS Wonderful\tRCA\t20-1638\tD5VB30\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72623-A.mp3\tEddie Condon & His Orch\tS Wonderful\tDECCA\t23430\t72623-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC025879.mp3\tBenny Goodman Qt\tS Wonderful\tVICTOR\t26090\t025879\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYKHL10.mp3\tColeman Hawkins Qt\tS Wonderful\tKEYNOTE\t609\tKHL10\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_040.mp3\tFrank Crumit\tS Wonderful\tVICTOR\t21029\t40507\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC40507.mp3\tFrank Crumit\tS' Wonderful\tVICTOR\t21029\t40507\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19116-1.mp3\tFrankie Trumbauer's Orch\tS' Wonderful (v J T)\tBRUNSWICK\t7663\t19116-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1754.mp3\tBing Crosby & Music Maids\tS'posin'\tDECCA\t3543B\tDLA1754\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC0339-1.mp3\tFats Waller And His Rhythm\tS'posin'\tVICTOR\t25415\t0339-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65250.mp3\tAndy Kirk & Clouds Of Joy\tS'posin'\tDECCA\t2510A\t65250\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057726-1.mp3\tErskine Hawkins & His Orch\tS'posin'\tBLUEBIRD\t11001\t057726-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/ALL155.mp3\tAl Hibbler W Harry Carney Band\tS'posin'\tALLADDIN\t155\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu35562.mp3\tCharlie Barnet & His Orch\tS'posin'\tBluebird\t10206\t35562\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic0339-1.mp3\t\"fats\" Waller And His Rhythm\tS'posin'\tVictor\t25415\t0339-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_076.mp3\tRudy Vallee And His Connecticut Yankees\tS'posin'\tVICTOR\t21998\t51666-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65250-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tS'posin'\tDecca\t2510\t65250-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_378.mp3\tDon Cornell Feat. Norman Leyden's Orchestra\tS'posin'\tCoral\t60903\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC51666-2.mp3\tRudy Vallee & His Ct.yankees\tS'posing\tVICTOR\t21998\t51666-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/CorL-4306-.mp3\tLionel Hampton And His Octet\tS'wonderful\tCoral\t6.22180\tL-4306-\t1946\tLionel Hampton p  vib v dir. Joe Wilder Duke Garrette Leo Shepherd Joe Morris  Wendell Culley  Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn   Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb johnny Griffin ts, Charlie Fowlkes bar, Mi\nhttp://www.jazz-on-line.com/a/mp3h/BAN8095-2.mp3\tJoe Candullo And His Orchestra\tS-l-u-e Foot\tBANNER\t7169\t8095-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC33.mp3\tJoe Turner Allstars\tS.k. Blues Part 1\tNATIONAL\t\tNSC33\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL162SMB.mp3\tLester Young Sextet\tS.m Blues\tALLADDIN\t162\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/COLW81126-B.mp3\tLouis Armstrong And His Hot Seven - Vocal Chorus By Louis Armstrong - Trompet-louis Armstrong ; Trom\tS.o.l. Blues\tCOLUMBIA\t35661\tW81126-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3029-A.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tSa-sha Stomp\tBrunswick\t7065\tC-3029-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU045787.mp3\tErskine Hawkins & His Orch\tSaboo\tBLUEBIRD\t10756\t045787\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO3043.mp3\tWoody Herman And His Orchestra\tSabre Dance\tCOLUMBIA\t38102\tHCO3043\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4827.mp3\tAndrews Sisters & Harmonica\tSabre Dance\tDECCA\t24427\tL4827\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_031.mp3\tWoody Herman And His Orchestra\tSabre Dance\tCOLUMBIA\t38102\tHCO3043\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_155.mp3\tAndrews Sisters\tSabre Dance\tDECCA\t24427\tL4827\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2721x.mp3\tFreddy Martin\tSabre Dance Boogie\tRCA\t20-2721\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-12151.mp3\tTed Heath And His Music\tSabre Dance Boogie\tDECCA-LONDON\tEFF.49-1 (BEP 6025) \tDR-12151\t1948\t\nhttp://www.78-tours.net/mp3/GRAOLA3603.mp3\tJacques Metehen Et Son Orchestre\tSachez Prendre Mon Coeur\tGRAMOPHONE\tK-8528\tOLA. 3603\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CON17480-2.mp3\tCarter Family\tSad And Lonesome Day\tCONQUEROR\t8735\t17480-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0800_02.mp3\tLee Morse\tSad And Lonesome Little Pickaninny\tPerfect\t11628B\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC75745.mp3\tLionel Hampton & His Orch\tSad Feelin'\tDECCA\t24946\t75745\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec75745.mp3\tLionel Hampton And His Orchestra\tSad Feelin'\tDecca\t24946\t75745\t1950\tWalter Williams-Benny Bailey-Ed Mullens-Duke Garrette-Leo Shepherd-t, AI Grey-Benny Powell-Jimmy Wormick-Paul Lee Higaki-tb, Bobby Plater-Jerome Richardson-as, Curtis Lowe-Johnny Board-Billy ''Smallwood'' Williams-ts, Lonnie Shaw-bar, Lionel Hampton-vi\nhttp://www.jazz-on-line.com/a/mp3c/DISD309.mp3\tHelen Humes W Marshall Royal\tSad Feeling\tDISC\t519\tD309\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1043.mp3\tLuis Russell & His Orch\tSad Lover Blues\tAPOLLO\t1012\tR1043\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC42928-2.mp3\tBennie Moten's Kansas City Or.\tSad Man Blues\tVICTOR\t38048\t42928-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVicV-38048.mp3\tBennie Molen's Kansas City Orchestra\tSad Man Blues\tVictor\tV-38048\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC38048s.mp3\tBennie Moten's Kansas City Or.\tSad Man Blues\tVICTOR\t38048\t42928-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/CONB9.mp3\tRoy Acuff Smoky Mountain Boys\tSad Memories\tCONQUEROR\t9791\tB9\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU063894.mp3\tFats Waller And His Rhythm\tSad Sap Sucker Am I\tBLUEBIRD\t11296A\t063894\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S613.mp3\tSy Oliver & His Orch\tSad Story Blues (vtommy Roberts)\tMGM\t10335A\t47S613\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_133.mp3\tDuke Ellington And His Famous Orchestra\tSaddest Tale\tBRUNSWICK\t7310\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99060.mp3\tPaul Whiteman & His Orch\tSaddle Your Blues To A Wild Mustang\tVICTOR\t25251\t99060\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh191.mp3\tRoy Fox And His Band\tSaddle Your Blues To A Wild Mustang (v Sid Buckman)\tHMV\tBD-5043\tOEA-2710-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC60436-A.mp3\tIsham Jones And His Orchestra\tSaddle Your Blues To A Wild Mustang - Vocal Eddy Stone\tDecca\t695\t60436-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36326-2.mp3\tFive Harmaniacs\tSadie Green, The Vamp Of New Orleans\tVICTOR\t20293\t36326-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_079.mp3\tEdward M. Favor\tSadie Salome, Go Home!\tEdison\t10243\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_290.mp3\tBob Sharples\tSadie's Shawl\tLondon\t1661\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLA-244y.mp3\tHenry Burr\tSafe In The Arms Of Jesus\tColumbia\tA-244\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4887.mp3\tLouis Jordan\tSafe, Sane And Single\tDECCA\t24587\tL4887\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64606-A.mp3\tLil Armstrong And Her Swing Band\tSafely Locked Up In My Heart\tDecca\t2234\t64606-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/WES116x.mp3\tLu Watters's Yerba Buena Jazz B\tSage Hen Strut\tWest Coast\t116\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D279B2.mp3\tLarry Clinton And His Orchestra\tSahara\tV-DISC\t279B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA909-B.mp3\tBing Crosby - Lani Mcintyre\tSail Along Silv'ry Moon\tDECCA\t1518\tDLA909-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA909-B.mp3\tLani Mcintyre And His Hawaiians\tSail Along Silvery Moon\tDecca\t1518  \tDLA909-B  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_065.mp3\tBing Crosby Feat. Lani Mcintyre And His Hawaiians\tSail Along, Silvery Moon\tDECCA\t1518\tDLA909-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_231.mp3\tGuy Lombardo And His Royal Canadians\tSail Boat In The Sky\tDecca\t4066\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051505.mp3\tLeadbelly (h.ledbetter)\tSail On Little Girl\tBLUEBIRD\t8550\t051505\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_179.mp3\tDick Robertson And His Orchestra\tSailboat In The Moonlight\tDECCA\t1367\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20292-2.mp3\tTeddy Wilson And His Orchestra\tSailin'\tBrunswick\t7781  \tB-20292-2  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_029.mp3\tAmerican Quartet\tSailin' Away On The Henry Clay\tVictor\t18353\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh011.mp3\tRay Noble And His New Mayfair Orchestra (vocal Al Bowlly)\tSailin' On The Robert E. Lee\tHMV\tB-6176\tOB-2874-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC027209.mp3\tTommy Dorsey & His Clambake 7\tSailing At Midnight\tVICTOR\t26066\t027209\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_045.mp3\tAmerican Quartet\tSailing Down The Chesapeake Bay\tVictor\t17411\t13503-8\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_016.mp3\tHenry Burr And Albert Campbell\tSailing Down The Chesapeake Bay\tCOLUMBIA\t1378\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_048.mp3\tRay Noble And His Orchestra\tSailing On The Robert E. Lee\tVICTOR\t24128\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA259.mp3\tBing Crosby W Georgie Stoll\tSailor Beware\tDECCA\t631B\tDLA259\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87039-1.mp3\tCarter Family\tSailor Boy\tBLUEBIRD\t5974\t87039-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU02901-1.mp3\tFrank Tanner's Rhythm Kings\tSailor Man Rhythm\tBLUEBIRD\tB-6690\t02901-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC58527-3.mp3\tKing Oliver & His Orchestra\tSaint James Infirmary\tVICTOR\t22298A\t58527-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480891.mp3\tAndre Kostelanetz And His Orchestra\tSaint Louis Blues\tCOLUMBIA\t7429-M\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-1952-1.mp3\tDjango Reinhardt\tSaint-louis Blues\tSWING\t7\tOLA-1952-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17132.mp3\tGid Tanner & Skillet Lickers\tSal Let Me Chaw Your Rosin\tARC\tVO2985\t17132\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150204.mp3\tGid Tanner's Skillet Lickers\tSal's Gone To The Cider Mill\tCOLUMBIA\t15562 D\tW150204\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/DECC92019.mp3\tRice Brothers Gang\tSally Do You Love Me\tDECCA\t5823\tC92019\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC48302-1.mp3\tBen Pollack Park Central Orch\tSally Of My Dreams\tVICTOR\t21857\t48302-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULAE297.mp3\tEarl Burtnett Biltmore Trio\tSally Of My Dreams\tBRUNSWICK\t4104\tLAE297\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR768-Hx.mp3\tHarmonians\tSally Of My Dreams\tHarmony\t768-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_115.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra\tSally Of My Dreams\tBRUNSWICK\t4104\tLAE297\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_201.mp3\tDorsey Brothers Orchestra Feat. Smith Ballew\tSally Of My Dreams\tOKeh\t41151\t401385-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe401385-B.mp3\tDorsey Brothers Orchestra\tSally Of My Dreams (v S B)\tOKeh\t41151\t401385-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79923-3.mp3\tTed Lewis Jazz Band\tSally Won't You Come Back\tCOLUMBIA\tA-3453\t79923-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu063329-1.mp3\tEarl Hines And His Orchestra\tSally Won't You Come Back (mg,ttv Vcl)\tBluebird\tB-11126\t063329-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13555.mp3\tAbe Lyman's California Orch\tSally's Got The Blues\tBRUNSWICK\t2780\t13555\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu063329-1.mp3\tEarl Hines And His Orchestra\tSally, Won't You Come Back?\tBluebird\tB-11126\t063329-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Benny Harris (tp) Joe McLewis, George Hunt, Edward Fant (tb) Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck\nhttp://www.jazz-on-line.com/a/mp3b/CAP665.mp3\tCootie Williams & His Orch\tSalt Lake City Bounce\tCAPITOL\t\t665\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/GUIG565-B.mp3\tDizzy Gillespie Quintet\tSalt Peanuts\tGUILDE\t1003\tG565-B\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/MUSG565.mp3\tDizzy Gillespie Quintet\tSalt Peanuts\tMUSICRAFT\t518\tG565\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_265.mp3\tDizzy Gillespie\tSalt Peanuts\tGUILDE\t1003\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18762B.mp3\tLouis Jordan And His Orch.\tSalt Pork, West Virginia\tDECCA\t18762B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81893-2.mp3\tBessie Smith\tSalt Water Blues\tCOLUMBIA\t14037 D\t81893-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW145822.mp3\tPaul Ash And His Orchestra\tSalty\tCOLUMBIA\t1616 D\tW145822\t1928\tD Lindley,J Valentine,J Linn tr,R Lantz,M Durso tb, P Wing,H Nettles cl,al sax,V Hayes,H Grantham,cl, tn sax,H Winston,p, P Ash,vio,H Hoffman,K Sirinsky,H Struble, vio, M Feiler,vio cello,J Davidson,bj, P Olker,br bass, A Layfield, dr Chicago, Mar 21\nhttp://www.jazz-on-line.com/a/mp3r/RiVic23674.mp3\tJimmie Davis\tSalty Dog\tVictor\t23674\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/PARP2653-2.mp3\tFreddie Keppard Jazz Cardinals\tSalty Dog\tPARAMOUNT\t12399\tP2653-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN049SD.mp3\tSidney Bechet\tSalty Dog\tBLUENOTE\tBN049\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BlaBW51.mp3\tEtta Jones Acc By Barney Bigard And His Orchestra\tSalty Papa Blues\tBlack & White\t\tBW51\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/KEYLHS3.mp3\tLionel Hampton 6 W D.washington\tSalty Papa Blues (vdw)\tKEYNOTE\t606\tLHS3\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8940ST.mp3\tOscar Peterson\tSalute To Garner\tMERCURY\t8940\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC67800-1.mp3\tDuke Ellington - Cotton Club O\tSam And Delilah (v C B)\tVICTOR\t23036B\t67800-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65306-A.mp3\tLouis Jordan & His Tympani 5\tSam Jones Done Snagged His Britches\tDECCA\t7623\t65306-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81232-2.mp3\tBessie Smith\tSam Jones' Blues\tCOLUMBIA\t13005 D\t81232-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_187.mp3\tJohnny Mercer\tSam's Got Him\tCapitol\t164\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP962x.mp3\tJoe Fingers Carr\tSam's Song\tCAPITOL\t962\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC27112x.mp3\tGary Crosby And Friend\tSam's Song\tDECCA\t27112\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_072.mp3\tJoe ''fingers'' Carr Feat. The Carr-hops\tSam's Song\tCAPITOL\t962\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_028.mp3\tGary Crosby And Friend Feat. Bing Crosby And Matty Matlock's Orchestra\tSam's Song\tDECCA\t27112\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143564.mp3\tRuth Etting\tSam, The Old Accordion Man\tCOLUMBIA\t908 D\tW143564\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_060.mp3\tRuth Etting\tSam, The Old Accordion Man\tCOLUMBIA\t908 D\tW143564\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS7792-3.mp3\tStuff Smith & His Orch\tSam, The Vegetable Man\tVARSITY\t8063\tUS7792-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68191.mp3\tSkeets Tolbert Gentlemen Swing\tSammy's Choppin' Block\tDECCA\t8534\t68191\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec68191-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tSammy's Chopping Block\tDecca\t8534\t68191-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM51S3158.mp3\tLionel Hampton & His Hamptones\tSamson's Boogie\tMGM\t11108A\t51S3158\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-3158.mp3\tLionel Hampton And His Orchestra\tSamson's Boogie\tMGM\t11108\t51-S-3158\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh031.mp3\tHenry Hall And His Gleneagles Hotel Band\tSamur  A Symphonic Foxtrot\tDecca\t\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC25149-4.mp3\tBenson Orchestra Of Chicago\tSan\tVICTOR\t18779B\t25149-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC1954.mp3\tAbe Lyman's Sharps & Flats\tSan\tBRUNSWICK\t3964\tC1954\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81681-2.mp3\tTed Lewis & His Band\tSan\tCOLUMBIA\t122D\t81681-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_050.mp3\tBenson Orchestra Of Chicago\tSan\tVICTOR\t18779B\t25149-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/HAR142196-2-3.mp3\tUniversity Six\tSan\tHARMONY\t224-H\t142196-2-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-5903-B.mp3\tJimmie Noone's Apex Club Orchestra\tSan\tVocalion \t\tC-5903-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU07750-1.mp3\tFats Waller And His Rhythm\tSan Anton'\tBLUEBIRD\t10109\t07750-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07749.mp3\tFats Waller And His Rhythm\tSan Anton'\tVICTOR\t25579\t07749\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLDAL615-1.mp3\tBob Wills And His Texas Playboys\tSan Antonio Rose\tCOLUMBIA\t37009\tDAL615-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2274.mp3\tBing Crosby And Bob Crosby\tSan Antonio Rose\tDECCA\t3590A\tDLA2274\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D115A1.mp3\tBob Wills And His Texas Playboys\tSan Antonio Rose\tV-DISC\t115A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC38608.mp3\tNew Orleans Rhythm Kings\tSan Antonio Shout\tDECCA\t161A\t38608\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU07394-1.mp3\tBoots And His Buddies\tSan Antonio Tomales\tBLUEBIRD\t7005\t07394-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3275.mp3\tBing Crosby\tSan Fernando Valley\tDECCA\t18586B\tL3275\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_197.mp3\tJohnny Mercer\tSan Fernando Valley\tCapitol\t150\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101263.mp3\tTommy Dorsey & His Orch\tSan Francisco\tVICTOR\t25352\t101263\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_139.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tSan Francisco\tVICTOR\t25352\t101263\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D744SJ.mp3\tCount Basie & His Orchestra\tSan Jose\tV-DISC\t744\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_047.mp3\tEarl Fuller's Novelty Orchestra\tSand Dunes\tCOLUMBIA\tA-2697\t78208-1\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_289.mp3\tConnee Boswell Feat. O/victor Young\tSand In My Shoes\tDECCA\t3893B\tDLA2483\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC96299-1.mp3\tBenny Goodman And His Orchestra\tSandman\tVICTOR\t25215\t96299-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL6848.mp3\tPeggy Lee With Gordon Jenkins\tSans Souci\tDECCA\t28395\tL6848\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480519.mp3\tArt Farmer And Gigi Gryce\tSans Souci\tPrestige\tLP7017\t805\t1955\tArt Farmer, FLH, Gigi Gryce, As, Duke Jordan, P, Addison Farmer, B,, Art's Twin Brother, Philly Joe Jones, D, [Featuring Gigi Gryce]\nhttp://www.jazz-on-line.com/a/mp3w/1954_235.mp3\tArt Carney\tSanta And The Doodle-li-boop\tCOLUMBIA\t40400\tCO52804\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe73695-B.mp3\tClarence Williams Blue Five\tSanta Claus Blues (v E T)\tOKeh\t8245A\t73695-B\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe73721-A.mp3\tClarence Williams Trio\tSanta Claus Blues (v E T)\tOKeh\t8254B\t73721-A\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18186.mp3\tPutney Dandridge\tSanta Claus Came In The Spring\tARC\tVO3083\t18186\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR20191-2.mp3\tElzadie Robinson\tSanta Claus Crave\tPARAMOUNT\t12573\t20191-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC76899.mp3\tElla Fitzgerald\tSanta Claus Got Stuck In My Chimney\tDECCA\t27255\t76899\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3200.mp3\tBing Crosby And Andrew Sisters\tSanta Claus Is Comin' To Town\tDECCA\t23281\tL3200\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu61752.mp3\tAlvino Rey & His Orch\tSanta Claus Is Comin' To Town\tBluebird\t11353B\t61752\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_178.mp3\tGeorge Hall And His Orchestra\tSanta Claus Is Comin' To Town\tBLUEBIRD\t5711\t84971\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC95144.mp3\tTommy Dorsey & His Orch\tSanta Claus Is Coming To Town\tVICTOR\t25145\t95144\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM12092x.mp3\tArt Mooney And His Orchestra\tSanta Claus Looks Just Like Daddy\tMGM\t12092\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78100.mp3\tRiccardo Stracciani\tSanta Lucia\tCOLUMBIA\t78100\t2-A-I63\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT830.mp3\tSlim Gaillard Orch\tSanta Monica Jump\tMAJESTIC\t9004\tT830\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM49S3122.mp3\tBob Wills; His Texas Playboys\tSanta's On His Way (v Jack Loyd)\tMGM\t10512B\t49S3122\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/Mon99403.mp3\tTune Wranglers\tSarah Jane\tMontgomeryWard\t7041\t99403\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403680-A.mp3\tLuis Russell & His Orch\tSaratoga Shout\tOKeh\t8780\t403680-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU51974-2.mp3\tDuke Ellington And His Orch\tSaratoga Swing\tBLUEBIRD\t6565\t51974-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic51974-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tSaratoga Swing\tVictor\tV-38058\t51974-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/Cam3713-C.mp3\tThe Washingtonians\tSaratoga Swing\tCameo\t9175\t3713-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/SIGRHT2.mp3\tEddie Heywood & His Orch\tSarcastic Lady\tSIGNATURE\t40002B\tRHT2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24967-A.mp3\tJimmie Lunceford And His Orchestra\tSassin' The Boss\tOkeh\t5116\t24967-A\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Gerard Wilson-t/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-p\nhttp://www.jazz-on-line.com/a/mp3c/BLU041380.mp3\tErskine Hawkins\tSatan Does The Rhumba\tBLUEBIRD\t10456\t041380\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62452-A.mp3\tEdgar Hayes & His Orch.\tSatan Takes A Holiday\tDECCA\t1382\t62452-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/VIC07809.mp3\tTommy Dorsey And His Orch\tSatan Takes A Holiday\tVICTOR\t25570\t07809\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_014.mp3\tTommy Dorsey And His Orchestra\tSatan Takes A Holiday\tVICTOR\t25570\t07809\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2856.mp3\tFrankie Laine\tSatan Wears A Satin Gown\tMERCURY\t5358\t2856\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_310.mp3\tFrankie Laine\tSatan Wears A Satin Gown\tMERCURY\t5358\t2856\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP1423.mp3\tNat King Cole Qt\tSatchel Mouth Baby\tV-DISC\t508\tVP1423\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC656.mp3\tMary Lou Williams\tSatchel Mouth Baby\tASCH\t502\t656\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/decDLA1132-A.mp3\tLouis Armstrong And His Orchestra\tSatchel Mouth Swing\tDECCA\t1636\tDLA1132-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480484.mp3\tArt Farmer And Gigi Gryce\tSatellite\tPrestige\tLP7017\t807\t1955\tArt Farmer, FLH, Gigi Gryce, As, Duke Jordan, P, Addison Farmer, B,, Art's Twin Brother, Philly Joe Jones, D, [Featuring Gigi Gryce]\nhttp://www.jazz-on-line.com/a/mp3w/1953_351.mp3\tDuke Ellington And His Famous Orchestra\tSatin Doll\tCapitol\t2458\t11398-1\t1953\tClark Terry, Willie Cook, Cat Anderson (tp), Ray Nance (tp,vn), Quentin Jackson, Britt Woodman, Juan Tizol (tb), Jimmy Hamilton (cl,ts), Rick Henderson (as), Russell Procope (as,cl), Paul Gonsalves (ts), Harry Carney (bar,b-cl,cl), Duke Ellington (p), Wendell Marshall (sb), Butch Ballard (dm) \nhttp://www.jazz-on-line.com/a/mp3h/DH480892.mp3\tDuke Ellington And His Famous Orchestra\tSatin Doll\tCAPITOL\t2458\t11398-1\t1952\tClark Terry, Willie Cook, Cat Anderson (tp), Ray Nance (tp,vn), Quentin Jackson, Britt Woodman, Juan Tizol (tb), Jimmy Hamilton (cl,ts), Rick Henderson (as), Russell Procope (as,cl), Paul Gonsalves (ts), Harry Carney (bar,b-cl,cl), Duke Ellington (p), Wendell Marshall (sb), Butch Ballard (dm) \nhttp://www.jazz-on-line.com/a/mp3h/DH480893.mp3\tDuke Ellington And His Famous Orchestra\tSatin Doll\tCAPITOL\t2458\t11398\t1953\tClark Terry, Willie Cook, Cat Anderson (tp), Ray Nance (tp,vn), Quentin Jackson, Britt Woodman, Juan Tizol (tb), Jimmy Hamilton (cl,ts), Rick Henderson (as), Russell Procope (as,cl), Paul Gonsalves (ts), Harry Carney (bar,b-cl,cl), Duke Ellington (p), Wendell Marshall (sb), Butch Ballard (dm) \nhttp://www.jazz-on-line.com/a/mp3w/1929_207.mp3\tHenry Busse And His Orchestra\tSatisfied\tVICTOR\t22116\t53987-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79888-1.mp3\tNora Bayes\tSaturday\tCOLUMBIA\tA-3471\t79888-1\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_111.mp3\tNora Bayes Feat. O/charles Prince\tSaturday\tCOLUMBIA\t3471\t79888-1\t1921\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-35750.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tSaturday\tBrunswick\t6027\tE-35750\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4712.mp3\tBig Bill And His Rhythm Band\tSaturday Evening Blues\tCOLUMBIA\t37314\tCCO4712\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO33957.mp3\tFrankie Carle & His Orch\tSaturday Night\tCOLUMBIA\t36777\tCO33957\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT501.mp3\tCootie Williams & His Orch\tSaturday Night\tMAJESTIC\t7131\tT501\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D393A2.mp3\tFrank Sinatra\tSaturday Night\tV-DISC\t393A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_110.mp3\tFrankie Carle And His Orchestra Feat. Phyllis Lynne\tSaturday Night (is The Loneliest Night In The Week)\tCOLUMBIA\t36777\tCO33957\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2803.mp3\tAl Dexter And His Troopers\tSaturday Night Boogie\tCOLUMBIA\t20593\tHCO2803\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49653-2.mp3\tEllington Cotton Club Orch\tSaturday Night Function\tVICTOR\t38036\t49653-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/Vic49653-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tSaturday Night Function\tVictor\tV-38036\t49653-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO33809.mp3\tFrank Sinatra\tSaturday Night Is The Loneliest Night Of The .\tCOLUMBIA\t36762\tCO33809\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4090.mp3\tCurly Williams Ga.peachpickers\tSaturday Night Rag\tCOLUMBIA\t20725\tHCO4090\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70656-1.mp3\tJimmie Davis\tSaturday Night Stroll\tVICTOR\t23688\t70656-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC55540.mp3\tColumbus Fruge And J.gauthier\tSaut Crapaud - The Toad\tVICTOR\t22184\t55540\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM621-2.mp3\tCab Calloway & His Orch\tSavage Rhythm\tVARIETY\tI662\tM621-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE36992.mp3\tMill's Blue Rhythm Band\tSavage Rhythm\tBRUNSWICK\t6229\tE36992\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BruE-36992-A.mp3\tMills Blue Rhythm Band\tSavage Rhythm\tBrunswick\t6229  \tE-36992-A  \t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14035-1.mp3\tBlind Willie (mctell)\tSavanah Mama\tARC\tVO2568z\t14035-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81783-3.mp3\tThe Georgians\tSavannah\tColumbia\t142-D\t81783-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38051-1.mp3\tFats Waller And Morris Hot Babys\tSavannah Blues\tVICTOR\t20776\t38051-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79318-3.mp3\tBert Williams\tSave A Little Dram For Me\tCOLUMBIA\tA-2979\t79318-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-2979.mp3\tBert Williams\tSave A Little Dram For Me\tCOLUMBIA\tA-2979\t79318-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2979.mp3\tBert Williams\tSave A Little Dram For Me\tColumbia\tA2979\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_111.mp3\tBert Williams\tSave A Little Dram For Me\tCOLUMBIA\tA-2979\t79318-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC26595.mp3\tLionel Hampton & His Orchestra\tSave It Pretty Mama\tVICTOR\t26595\t044727-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402170-C.mp3\tLouis Armstrong & His Hot 5\tSave It Pretty Mama\tOKeh\t41180\t402170-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW402170C.mp3\tLouis Armstrong And His Savoy Ballroom Five - Vocal Chorus By Louis Armstrong - Trumpet-louis Armstr\tSave It Pretty Mama\tCOLUMBIA\t35662\tW402170C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC044727-1.mp3\tLionel Hampton & His Orch\tSave It Pretty Mama\tVICTOR\t26595\t044727-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic044727-1.mp3\tLionel Hampton And His Orchestra\tSave It, Pretty Mama\tVictor\t26595\t044727-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1092-A.mp3\tCab Calloway & His Orch\tSave Me Sister\tBRUNSWICK\t7638\tLA1092-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT1261.mp3\tCootie Williams & His Orch\tSave The Bones For Henry Jones\tMAJESTIC\t1172\tT1261\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_150.mp3\tJohnny Mercer And King Cole Trio\tSave The Bones For Henry Jones\tCAPITOL\t15000\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/COM4702.mp3\tEddie Condon & His Band\tSave Your Sorrow\tCOMMODORE\t605\t4702\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC34100-4.mp3\tGene Austin\tSave Your Sorrow\tVICTOR\t19857\t34100-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3910.mp3\tBing Crosby - Eddie Heywood\tSave Your Sorrow\tDECCA\t24595\tL3910\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_161.mp3\tGene Austin Feat. O/nat Shilkret\tSave Your Sorrow (for Tomorrow)\tVICTOR\t19857\t34100-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh786.mp3\tNew Princess Toronto Band\tSave Your Sorrow (for Tomorrow)\tColumbia\t3786\tWA-2510-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63709-B.mp3\tElla Fitzgerald And Her Savoy Eight\tSaving Myself For You\tDecca\t1846\t63709-B  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC2232-1.mp3\tFletcher Henderson & His Orch\tSaving Myself For You (v C R)\tVOCALION\t4154\tC2232-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU22842-2.mp3\tRed Norvo & His Orch\tSaving Myself For You (v M. Bailey)\tBRUNSWICK\t8145\t22842-2\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC70347.mp3\tLucky Millinder And His Orch\tSavoy\tDECCA\t18353\t70347\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70347-A.mp3\tLucky Millinder And His Orchestra\tSavoy\tDecca\t18353\t70347-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/V-DVP-496.mp3\tLucky Millinder And His Orchestra\tSavoy\tV-Disc\t176-B\tVP-496\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW82056.mp3\tLouis Armstrong's Hot Five\tSavoy Blues\tCOLUMBIA\t37537\tW82056\t1927\t\nhttp://www.78-tours.net/mp3/JSMM1362.mp3\tKid Ory And His Creole Jazz Band Kid Ory (tb), Teddy Buckner (tp), Joe Darensbourg, Albert Nicholas\tSavoy Blues\tJAZZ SELECTION DIXIE\tJ.S. 594\tM. M. 1360\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC61184-A.mp3\tBob Crosby & His Orchestra\tSavoy Blues\tDECCA\t1094\t61184-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65347.mp3\tLouis Armstrong & His Orch.\tSavoy Blues\tDECCA\t2538A\t65347\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh120.mp3\tThe Midnight Minstrels (debroy Somers)\tSavoy Christmas Medley (foxtrot)\tRegal\tMR-430\tCAR-843-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5700.mp3\tDon Byas Orch\tSavoy Jam Party Part 1\tSAVOY\t8078\tS5700\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/SAVS5701.mp3\tDon Byas Orchestra\tSavoy Jam Party Part 1\tSAVOY\t8078\tS5701\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVS5701.mp3\tDon Byas Orch\tSavoy Jam Party Part 2\tSAVOY\t8078\tS5701\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402598-A.mp3\tRoy Johnson's Happy Pals\tSavoy Rhythm\tOKeh\t8723\t402598-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401532-A.mp3\tLuis Russell & His Orch\tSavoy Shout\tOKeh\t8760\t401532-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VOCWM-1047-A.mp3\tBenny Carter And His Orchestra\tSavoy Stampede\tVOCALION\t5112\tWM-1047-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-20-1.mp3\tMezzrow - Bechet Septet\tSaw Mill Man Blues\tKing Jazz\t144\tKJ-20-1  \t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_042.mp3\tIsham Jones And His Orchestra\tSaw Mill River Road\tBrunswick\t2406\t9794\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN568SB.mp3\tSidney Bechet W Claude Luter\tSawmill Blues\tBLUENOTE\tBN568\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI11714.mp3\tB. A. Rolfe Palais Do\tSax Appeal\tEDISON\t52047\t11714\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_184.mp3\tSam Donahue And His Orchestra\tSaxa-boogie\tCapitol\t1508\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68906.mp3\tLouis Jordan & His Tympani 5\tSaxa-woogie\tDECCA\t25394\t68906\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/ManA-1574.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tSaxology\tManor\t1110\tA-1574\t1948\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-15812.mp3\tTed Heath And His Music; Leslie Gilbert, Alto Sax.\tSaxophone Mambo\tDECCA-LONDON\tEFF.54-1 (BEP 6027) \tDR-15812\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_127.mp3\tRuth Etting\tSay ''yes'' Today\tCOLUMBIA\t1352 D\tW145851\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_173.mp3\tSmith Ballew And His Orchestra\tSay A Little Prayer For Me\tCOLUMBIA\t2430\tW151413-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC20886-2.mp3\tPeerless Qt\tSay A Prayer For The Boys Out There\tVICTOR\t18411\t20886-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18411.mp3\tPeerless Quartette\tSay A Prayer For The Boys Out There\tVictor\t18411\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_057.mp3\tJohn Mccormack\tSay Au Revoir But Not Goodbye\tVictor\t64328\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_229.mp3\tIsham Jones And His Orchestra\tSay It\tVictor\t24681\t83178\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC047746.mp3\tTommy Dorsey And His Orch\tSay It\tVICTOR\t26535\t047746\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_195.mp3\tTommy Dorsey Orch V Frank Sinatra\tSay It\tVICTOR\t26535\t047746\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU047095.mp3\tGlenn Miller And His Orch\tSay It  (vre)\tBLUEBIRD\t10631 B\t047095\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141816.mp3\tArt Gillam\tSay It Again\tCOLUMBIA\t626 D\tW141816\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64785.mp3\tAndy Kirk & Clouds Of Joy\tSay It Again\tDECCA\t2774B\t64785\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR141633-1.mp3\tHarmonians\tSay It Again (vbj) (i Don't Believe It)\tHARMONY\t127-H\t141633-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC408.mp3\tBilly Eckstine\tSay It Isn't So\tNATIONAL\t\tNSC408\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD6VB1308.mp3\tColeman Hawkins 52nd St Allst\tSay It Isn't So\tRCA\t40-0131\tD6VB1308\t1946\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24124A.mp3\tGeorge Olsen And His Music\tSay It Isn't So\tVictor\t24124A\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_105.mp3\tConnee Boswell\tSay It Isn't So\tBRUNSWICK\t6393\t12278-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB12240-A.mp3\tOzzie Nelson & His Orch\tSay It Isn't So (v O N)\tBRUNSWICK\t6372\tB12240-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC73355-1.mp3\tGeorge Olsen And His Music\tSay It Isn't So (vps)\tVICTOR\t24124A\t73355-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU8502.mp3\tIsham Jones Orch\tSay It While Dancing\tBRUNSWICK\t2314\t8502\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC26802-8.mp3\tBenson Orchestra Of Chicago\tSay It While Dancing\tVICTOR\t18938\t26802-8\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_045.mp3\tBenson Orchestra Of Chicago\tSay It While Dancing\tVICTOR\t18938\t26802-8\t1922\t\nhttp://www.jazz-on-line.com/a/mp3d/Bla10072j.mp3\tHenderson's  Dance Orchestra\tSay It While Dancing\tBlack Swan\t10072\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23687-1.mp3\tTeddy Wilson & His Orch\tSay It With A Kiss\tCBS\tBR8270\t23687-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC030385.mp3\tMaxine Sullivan\tSay It With A Kiss\tVICTOR\t26124\t030385\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23687-1.mp3\tTeddy Wilson And His Orchestra\tSay It With A Kiss\tBrunswick\t8270\tB-23687-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU030732.mp3\tArtie Shaw And His Orchestra\tSay It With A Kiss (v H F)\tBLUEBIRD\t10078\t030732-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC25471-4.mp3\tPaul Whiteman And His Orch\tSay It With Music\tVICTOR\t18803B\t25471-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31270.mp3\tRed Nichols & His Orch\tSay It With Music (v S L)\tBRUNSWICK\t4651\tE31270\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_104.mp3\tBob Carroll Feat. Jimmy Leyden's Orchestra\tSay It With Your Heart\tDERBY\t814\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3091-A.mp3\tHank Penny's Radio Cowboys\tSay Mister! Have You Met Rosie's Sister\tOKEH\t5844\tWC3091-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC62274-3.mp3\tLeo Reisman & His Orch\tSay Oui Cherie\tVICTOR\t22531\t62274-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Pat105222.mp3\tFletcher Henderson And His Orchestra\tSay Say Sadie\tPath? Actuelle\t036084\t105222\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26535-A.mp3\tGene Krupa & His Orch\tSay Si Si\tCOLUMBIA\t35408\t26535-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_032.mp3\tAndrews Sisters\tSay Si Si (para Vigo Me Voy)\tDECCA\t3013B\t67180\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046727.mp3\tGlenn Miller & His Orch\tSay Si Si (vmh)\tBLUEBIRD\t10622 B\t046727\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74598.mp3\tInk Spots\tSay Something Sweet To Your Sweetheart\tDECCA\t24507A\t74598\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_163.mp3\tInk Spots\tSay Something Sweet To Your Sweetheart\tDECCA\t24507A\t74598\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_167.mp3\tPatti Page And Vic Damone Feat. O/eric Robinson\tSay Something Sweet To Your Sweetheart\tMERCURY\t5192\t1960-2\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1975.mp3\tDorothy Shay\tSay That We're Sweethearts Again\tCOLUMBIA\t37189\tHCO1975\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70197-1.mp3\tLuis Russell & His Orch\tSay The Word (v C B)\tVICTOR\t22789\t70197-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO48127.mp3\tSarah Vaughan\tSay You'll Wait For Me\tCOLUMBIA\t39839\tCO48127\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_025.mp3\tPerry Como Feat. Hugo Winterhalter's Orchestra And The Ramblers\tSay You're Mine Again\tRCA Victor\t5277\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23152-2.mp3\tBillie Holiday & Her Orch\tSays My Heart\tCBS\tVO4208\t23152-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63911.mp3\tAndrews Sisters\tSays My Heart\tDECCA\t1875 A\t63911\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021952.mp3\tTommy Dorsey & His Orch\tSays My Heart\tVICTOR\t25828\t021952\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_176.mp3\tAndrews Sisters\tSays My Heart\tDECCA\t1875 A\t63911\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh050.mp3\tAmbrose And His Orchestra\tSays My Heart (v Evelyn Dall)\tDecca\tF-6834\tDR-2993-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS22754-1.mp3\tRed Norvo And His Orchestra\tSays My Heart (vmb)\tCBS\tBR8135\t22754-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067741.mp3\tGlenn Miller & His Orch\tSays Who? Says You, Says I\tBLUEBIRD\t11315\t067741\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31303.mp3\tCab Calloway & His Orch\tSays Who? Says You, Says I\tOKEH\t6422\t31303\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe09961-A.mp3\tRichard Jones Jazz Wizards\tScagamore Green\tOKeh\t8431\t09961-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/KINK5503.mp3\tRussell Jacquet & His Allstars\tScamparoo\tKING\t4259A\tK5503\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCWM1049.mp3\tBenny Carter & His Orch\tScandal In A Flat\tVOCALION\t5112\tWM1049\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-115-2.mp3\tBenny Carter And His Orchestra\tScandal In A Flat\tVocalion\tS-14\tS-115-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COL79726-2.mp3\tAl Jolson\tScandinavia\tCOLUMBIA\tA-3382\t79726-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO29775.mp3\tBenny Goodman And His Orchestra\tScarecrow\tCOLUMBIA\t36180\tCO29775\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU058258.mp3\tGray Gordon Tictoc Rhythm\tScarf Dance\tBLUEBIRD\t10993\t058258\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_304.mp3\tHarry Belafonte Feat. O/milliard Thomas\tScarlet Ribbons (for Her Hair)\tRCA Victor\t5051\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65433.mp3\tBlue Lu Barker & Fly Cats\tScat Skunk\tDECCA\t7813\t65433\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COL25354.mp3\tBenny Goodman And His Orchestra\tScatter Brain\tCOLUMBIA\t35241\t25354\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_126.mp3\tBenny Goodman And His Orchestra Feat. Louise Tobin\tScatter Brain\tCOLUMBIA\t37246\tCO25354\t1939\tZiggy Elman, Jimmy Maxwell, Johnny Martell (tp), Red Ballard, Vernon Brown, Ted Vesley (tb), Benny Goodman (cl), Toots Mondello, Buff Estes (as), Jerry Jerome, Bus Bassey (ts), Fletcher Henderson (p), Arnold Covarrubias (g), Artie Bernstein (sb), Nick Fatool (dm)\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu10436.mp3\tFreddy Martin & His Orchestra\tScatter-brain\tBluebird\t10436\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/FDCLO-375-1.mp3\tDuke Ellington And His Orchestra\tScattin' At The Cotton Club\tFDC\t1022\tLO-375-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM178.mp3\tDuke Ellington & His Orch\tScattin' At The Kit Kat\tBRUNSWICK\t7994\tM178\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/MasM-178-1.mp3\tDuke Ellington And His Famous Orchestra\tScattin' At The Kit Kat\tMaster\t123\tM-178-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481517.mp3\tCharles Mingus\tScenes In The City\tBethlehem\tBCP6026\t\t1957\tClarence ?Gene? Shaw (tp), Jimmy Knepper (tb), Shafi Hadi (as, ts), Bob Hammer (p), Charles Mingus (voice, sb), Dannie Richmond (dm), Melvin Stewart (narration)\nhttp://www.jazz-on-line.com/a/mp3e/V-D275A1.mp3\tTony Pastor And His Orchestra\tSchicklegrber\tV-DISC\t275A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24815SD.mp3\tLouis Jordan\tSchool Days\tDECCA\t24815\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03745.mp3\tAlbert Campbell\tSchool Days\tCOLUMBIA\tA-0425\t03745\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_029.mp3\tAlbert Campbell\tSchool Days\tCOLUMBIA\tA-0425\t03745\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_125.mp3\tBrox Sisters Feat. O/ Bennie Krueger\tSchool House Blues\tBRUNSWICK\t2268\t7481\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_054b.mp3\tByron G. Harlan\tSchoolmates\tEDISON\t10159\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D153B.mp3\tBoston Symphony Orch. (serge Koussevitsky)\tSchubert Rosamunde Ballet Music\tV-DISC\t153B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU13279.mp3\tGene Rodemich And His Orchestra\tScissor Grinder Joe\tBRUNSWICK\t2663A\t13279\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3d/BLUDSVB-34-1A.mp3\tEarl Hines And His Orchestra\tScoops-carry's-merry\tBLUEBIRD\tAXM2-5508\tDSVB-34-1A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/BluD5VB-34-1A.mp3\tEarl Hines And His Orchestra\tScoops-carry's-merry\tBluebird\tAXM2-5508\tD5VB-34-1A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17429B.mp3\tAtilla\tScorpion - Calypso\tDECCA\t17429B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035564.mp3\tCharlie Barnet & His Orch\tScotch And Soda\tBLUEBIRD\t10210\t035564\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC93597.mp3\tKing Cole Trio\tScotchin' With The Soda\tDECCA\t60036\tC93597\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S612.mp3\tSy Oliver & His Orchestra\tScotty\tMGM\t10255\t47S612\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057088.mp3\tFats Waller And His Rhythm\tScram\tBLUEBIRD\t10989\t057088\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/CON9001.mp3\tLeonard Feather Allstars\tScram\tCONTIN\tT6016\t9001\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP311.mp3\tMildred Bailey\tScrap Your Fat\tV-DISC\t135\tVP311\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D135B.mp3\tMildred Bailey With Teddy Wilson\tScrap Your Fat\tV-DISC\t135B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/ManA-1573.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tScratch My Back\tManor\t1110\tA-1573\t1948\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67894-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tScratchin' In The Gravel\tDecca\t3293\t67894-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/PARG15214.mp3\tCharley Patton\tScreamin' And Hollerin' The Blues\tPARAMOUNT\t12805A\tG15214\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/V-DVP-1126.mp3\tLionel Hampton And His Orchestra\tScreamin' Boogie\tV-Disc\t428-A\tVP-1126\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC68352.mp3\tAndrews Sisters\tScrub Me Mama With A Boogie Beat\tDECCA\t3553A\t68352\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COL28654-1.mp3\tWill Bradley And His Orch\tScrub Me Mama, With A Boogie Beat\tCOLUMBIA\t35743\t28654-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_153.mp3\tAndrews Sisters\tScrub Me, Mama, With A Boogie Beat\tDECCA\t3553A\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_019.mp3\tWill Bradley And His Orchestra\tScrub Me, Mama, With A Boogie Beat\tCOLUMBIA\t35743\t28654-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/PatCPT-2144-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tSeagulls\tPath\tPA-668\tCPT-2144-1\t1935\t\nhttp://www.78-tours.net/mp3/DEC74267.mp3\tErnest Tubb\tSeaman's Blues\tDECCA\t46119\t74267\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_223.mp3\tHilltoppers Featuring Jimmy Sacca\tSearching\tAtlantic\t1048\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC71606-1.mp3\tBlind Willie Mctell\tSearching The Desert For The Blues\tVICTOR\t23353\t71606-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49449-1.mp3\tJelly Roll Morton (piano)\tSeattle Hunch\tVICTOR\t38527\t49449-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic49449-1.mp3\tJelly Roll Morton And His Orchestra\tSeattle Hunch\tVictor\tV-38527\t49449-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68754-A.mp3\tAl Cooper & His Savoy Sultans\tSecond Balcony Jump\tDECCA\t8545\t68754-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC115.mp3\tBilly Eckstine & His Orch\tSecond Balcony Jump\tNATIONAL\t\tNSC115\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/BLU073461-1.mp3\tEarl Hines And His Orchestra\tSecond Balcony Jump\tBLUEBIRD\tB-11567B\t073461-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Blu073461-1.mp3\tEarl Hines And His Orchestra\tSecond Balcony Jump\tBluebird\t11567\t073461-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_241.mp3\tKay Starr\tSecond Fiddle\tRCA\t6541\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79937-2.mp3\tTed Lewis Jazz Band\tSecond Hand Rose\tCOLUMBIA\tA-3453\t79937-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_022.mp3\tFanny Brice Feat. Rosario Bourdon (director)\tSecond Hand Rose\tVICTOR\t45263\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D156B1.mp3\tFreddy Martin And His Orchestra\tSecond Hungarian Rhapsody\tV-DISC\t156B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC70710-A.mp3\tRaymond Scott And His Orchestra\tSecret Agent\tDECCA\t18377A\t70710-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_220.mp3\tRaymond Scott And His Orchestra\tSecret Agent\tDECCA\t18377A\t70710-A\t1942\t\nhttp://www.78-tours.net/mp3/PAT301437.mp3\tFredo Gardoni Puig Et Leur Ensemble\tSecret D'une Nuit\tPATH\tX. 98.087\t301.437 Billon\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_318.mp3\tRay Anthony And His Orchestra; Vocal By Tommy Mercer And The Anthony Choir\tSecret Love\tCapitol\t2678\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_008.mp3\tDoris Day Feat. Ray Heindorf's Orchestra\tSecret Love\tCOLUMBIA\t40108\tRHCO10587\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_305.mp3\tTommy Edwards Feat. Leroy Holmes' Orchestra\tSecret Love\tMGM\t11604\t53S348\t1954\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480591.mp3\tAhmad Jamal\tSecret Love\tArgo\t5317\t8887\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3w/1956_193.mp3\tMoonglows\tSee Saw\tChess\t1629\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_314.mp3\tDon Cornell\tSee Saw\tCoral\t61721\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17131H.mp3\tThe Dutch Swing College Band\tSee See Rider\tPhilips\tP17131H\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP1925-2.mp3\tMa Rainey & Georgia Jazz Band\tSee See Rider Blues\tPARAMOUNT\t12252B\tP1925-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC70570-B.mp3\tBea Booze\tSee See Rider Blues\tDECCA\t8633\t70570-B\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_143.mp3\tBea Booze\tSee See Rider Blues\tDECCA\t8633\t70570-B\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC10889-1.mp3\tChubby Parker And His Banjo\tSee The Black Clouds A Breakin' Over Yonder\tARC\tCQ7890\t10889-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC88995.mp3\tBill Haley And His Comets\tSee You Later, Alligator\tDECCA\t29791\t88995\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_041.mp3\tBill Haley And His Comets\tSee You Later, Alligator\tDecca\t29791 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031SR.mp3\tEdmond Hall Allstar Quintet\tSeein' Red\tBLUENOTE\tBN031\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70149.mp3\tBon Bon & His Buddies\tSeeing You Again Did Me No Good\tDECCA\t8603\t70149\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1841-1.mp3\tBuster Bailey & Ho\tSeems Like A Month Of Sundays (v J E)\tVARSITY\t8358\tUS1841-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18737B.mp3\tGuy Lombardo And His Orch\tSeems Like Old Times\tDECCA\t18737B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_182.mp3\tKate Smith\tSeems Like Old Times\tCOLUMBIA\t36950\tCO35639-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5370.mp3\tGeorgie Auld & His Orchestra\tSeems Like Old Times (v L S)\tMUSICRAFT\t15060\t5370\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_1205_02.mp3\tLee Morse And Her Bluegrass Boys\tSeems To Me\tColumbia\t2225DB\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480695.mp3\tAhmad Jamal\tSeleritus\tArgo\tLP-2638\t9044\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3c/VIC51206-2.mp3\tMckinney's Cotton Pickers\tSelling That Stuff\tVICTOR\t38052B\t51206-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC32720-2.mp3\tJan Garber And His Orch\tSeminola\tVICTOR\t19689\t32720-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_001.mp3\tU.s. Marine Band\tSemper Fidelis\tCOLUMBIA\tCOLUMBIA\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3a/NATNSC349.mp3\tRavens\tSend For Me If You Need Me\tNATIONAL\t9045\tNSC349\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU15152-A.mp3\tWingy Manone & His Orch\tSend Me\tBRUNSWICK\t6940\t15152-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64741y.mp3\tJohn Mccormack\tSend Me Away With A Smile\tVICTOR\t64741\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_005.mp3\tJohn Mccormack\tSend Me Away With A Smile\tVICTOR\t64741\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143576-2.mp3\tBessie Smith\tSend Me To The 'lectric Chair\tCOLUMBIA\t14209 D\tW143576-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048781.mp3\tFats Waller And His Rhythm\tSend Me, Jackson\tBLUEBIRD\t10730\t048781\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM53S196.mp3\tBilly Eckstine\tSend My Baby Back To Me\tMGM\t11511\t53S196\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_310.mp3\tBilly Eckstine Feat. O/nelson Riddle\tSend My Baby Back To Me\tMGM\t11511\t53S196\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17284B.mp3\tThe Lion\tSend You Children To Orphan Home\tDECCA\t17284B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC82394.mp3\tMezz Mezzrow And His Orch\tSendin' The Vipers\tVICTOR\t25019\t82394\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE80198.mp3\tClarence Williams Jazz Kings\tSenegalese Stomp\tOKEH\t-R\t80198\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR142306.mp3\tBluegrass Footwarmers\tSenorita Mine\tHARMONY\t206-H\t142306\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe401160-A.mp3\tJoe Venuti's Blue Four\tSensation\tOKeh\t41144\t401160-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU22028-9.mp3\tFletcher Henderson & His Orch\tSensation\tBRUNSWICK\t3521\t22028-9\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN9079.mp3\tWolverine Orchestra\tSensation\tGENNETT\t5542A\t9079\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC38737-A.mp3\tNew Orleans Rhythm Kings\tSensation\tDECCA\t464A\t38737-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D214B2.mp3\tThe Original Dixieland Jazz Band\tSensation Rag\tV-DISC\t214B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480630.mp3\tBenny Goodman & Company\tSensation Rag\tColumbia\tSL 160\t\t1938\tCarnegie Hall Concert:<br>Bobby Hackett (co), Vernon Brown (tb), Benny Goodman (cl), Jess Stacy (p), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3b/BruB-12078-A.mp3\tEarl Hines And His Orchestra\tSensational Mood\tBrunswick\t6379\tB-12078-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63286-A.mp3\tCount Basie And His Orch\tSent For You Yesterday\tDECCA\t1880A\t63286-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_338.mp3\tCount Basie And His Orchestra Feat. Jimmy Rushing\tSent For You Yesterday And Here You Come Today\tDECCA\t1880A\t63286-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA745.mp3\tBing Crosby & Victor Young\tSentimental And Melancholy\tDECCA\t1201\tDLA745\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20700-2.mp3\tTeddy Wilson And His Orchestra\tSentimental And Melancholy\tBrunswick\t7844  \tB-20700-2  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYKBF5.mp3\tBud Freeman & His Orch\tSentimental Baby\tKEYNOTE\t637\tKBF5\t1946\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC12426-A.mp3\tWashboard Rhythm Kings\tSentimental Gentleman From Georgia\tVOCALION\t1724\t12426-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban12181-1.mp3\tMills Blue Rhythm Band\tSentimental Gentleman From Georgia\tBanner\t32531  \t12181-1  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1844-2.mp3\tGerardine Do\tSentimental Gentleman From Georgia (vc.palloy)\tCROWN\t3376B\tC1844-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO33822.mp3\tLes Brown And Doris Day\tSentimental Journey\tCOLUMBIA\t36769\tCO33822\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3807.mp3\tMerry Macs\tSentimental Journey\tDECCA\t18684A\tL3807\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT523.mp3\tLouis Prima & His Orchestra\tSentimental Journey\tMAJESTIC\t7140\tT523\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73787.mp3\tElla Fitzgerald W Eddy Heywood\tSentimental Journey\tDECCA\t23844\t73787\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_039.mp3\tMerry Macs\tSentimental Journey\tDECCA\t18684A\tL3807\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_223.mp3\tAmes Brothers, The Feat. Les Brown And His Band Of Renown\tSentimental Journey\tCORAL\t60566\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_003.mp3\tLes Brown And His Orchestra Feat. Doris Day\tSentimental Journey\tCOLUMBIA\t36769\tCO33822\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh165.mp3\tPaul Fenoulhet With The Sky Rockets Dance Orchestra\tSentimental Journey (v Doreen Lundy)\tHMV\tBD-5908\tOEA-10617-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D212A2.mp3\tDuke Ellington And His Orchestra\tSentimental Lady\tV-DISC\t212A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_128.mp3\tDuke Ellington And His Famous Orchestra\tSentimental Lady\tVictor\t1528\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1528.mp3\tDuke Ellington And His Famous Orchestra\tSentimental Lady (someone)\tRCA\t20-1528\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D074782-1.mp3\tDuke Ellington And His Famous Orchestra\tSentimental Lady (someone)\tV-DISC\t212\t074782-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_065.mp3\tRay Anthony Feat. Ronnie Deauville\tSentimental Me\tCapitol\t923\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24904x.mp3\tMargaret Whiting\tSentimental Me\tDECCA\t24904\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_300.mp3\tDuke Ellington And His Famous Orchestra\tSepia Panorama\tVICTOR\t26731A\t054625\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC054625.mp3\tDuke Ellington Orch\tSepia Panorama (night House)\tVICTOR\t26731A\t054625\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480715.mp3\tDuke Ellington And His Famous Orchestra\tSepia Panorama (night House)\tVictor\t26731\t054625-1\t1940\tWardell Jones, Cootie Williams (tp), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Barney Bigard (cl), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (cl, as, bsx), Ben Webster (ts), Duke Ellington (p), Fred Guy (g), Jimmy Blanton (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3b/DEC70996.mp3\tJay Mcshann & His Orchestra\tSepian Bounce\tDECCA\t4387B\t70996\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S86.mp3\tGeorge Shearing Quintet\tSeptember In The Rain\tMGM\t30250A\t49S86\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC04553.mp3\tGuy Lombardo Royal Canadians\tSeptember In The Rain\tVICTOR\t25526\t04553\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MER480-1.mp3\tFrankie Lane\tSeptember In The Rain\tMERCURY\t5003\t480-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62137.mp3\tJames Melton & Bobby Dolan\tSeptember In The Rain\tDECCA\t1247\t62137\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64778.mp3\tAndy Kirk & Clouds Of Joy\tSeptember In The Rain\tDECCA\t2617B\t64778\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL5759.mp3\tLionel Hampton's Orch\tSeptember In The Rain\tDECCA\t27176\tL5759\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4769.mp3\tMuggsy Spanier Ragtime Band\tSeptember In The Rain\tCOMMODORE\t1517\t4769\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS59052.mp3\tDon Byas Quartette\tSeptember In The Rain\tSAVOY\t621B\tS59052\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2952.mp3\tErroll Garner Trio\tSeptember In The Rain\tMERCURY\t5378\t2952\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_274.mp3\tJames Melton\tSeptember In The Rain\tDECCA\t1247\t62137\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_313.mp3\tGeorge Shearing Quintet\tSeptember In The Rain\tMGM\t30250A\t49S86\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5759.mp3\tLionel Hampton And His Orchestra\tSeptember In The Rain\tDecca\t27176\tLA-5759\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_194.mp3\tSam Donahue And His Orchestra Feat. Bob Durant, Tak Takvorian. And Ralph Osborn\tSeptember In The Rain\tCapitol\t15172\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64778-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tSeptember In The Rain\tDecca\t2617\t64778-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2760.mp3\tHarry James And His Orch\tSeptember Song\tCOLUMBIA\t38300\tHCO2760\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4769.mp3\tCarmen Cavallaro\tSeptember Song\tDECCA\t24545\tL4769\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23732.mp3\tWalter Huston\tSeptember Song\tCBS\tBR8272\t23732\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5811-1.mp3\tSarah Vaughn\tSeptember Song\tMUSICRAFT\t500\t5811-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3274.mp3\tBing Crosby\tSeptember Song\tDECCA\t18898B\tL3274\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1045.mp3\tArtie Shaw And His Orchestra\tSeptember Song\tRCA\t20-1668\tD5VB1045\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3333-A.mp3\tDon Byas Qt\tSeptember Song\tSAVOY\t626\tS3333-A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_102.mp3\tFrank Sinatra\tSeptember Song\tCOLUMBIA\t37161\tHCO1932\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_239.mp3\tLiberace\tSeptember Song\tCOLUMBIA\t39709\tHCO10116\t1952\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480485.mp3\tLionel Hampton And His Giants\tSeptember Song\tNorgran\tEPN144\t2493-1\t1955\tHarry \"Sweets\" Edison (tp), Lionel Hampton (vib), Art Tatum (p), Red Callender (sb), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480545.mp3\tLionel Hampton And His Giants\tSeptember Song (short Version)\tNorgran\tEPN150\t2493-3\t1955\tHarry \"Sweets\" Edison (tp), Lionel Hampton (vib), Art Tatum (p), Red Callender (sb), Buddy Rich (dm)\nhttp://www.78-tours.net/mp3/PAT203281.mp3\tEdme Favart\tSerait-ce Un Rve ? (das Gibt's Nur Einmal) Du Film \"le Congrs S'amuse\"\tPATH\tX .94136\t203281 Salabert\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWC2785.mp3\tJohn Kirby & His Orch\tSerenade\tCOLUMBIA\t36001\tWC2785\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP5426.mp3\tHerman Chittison Trio\tSerenade\tCOLUMBIA\t39396\tZSP5426\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D379A1.mp3\tWayne King And His Orchestra\tSerenade\tV-DISC\t379A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA1885.mp3\tPrince's Band\tSerenade\tColumbia\tA1885\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-138-1.mp3\tNol Chiboust Et Son Orchestre (with Django Reinhardt)\tSrnade D'hiver\tSWING\t86\tOSW-138-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUCP1116.mp3\tHal Kemp & His Orch\tSerenade For A Wealthy Widow\tBRUNSWICK\t7319\tCP1116\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU84417-1.mp3\tFats Waller\tSerenade For A Wealthy Widow\tBLUEBIRD\t10262\t84417-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19503-2.mp3\tStuff Smith & Onyx Club Boys\tSerenade For A Wealthy Widow\tVOCALION\t3316\t19503-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-1999-1.mp3\tMichel Warlop Et Son Orchestre (with Django Reinhardt)\tSerenade For A Wealthy Widow\tSWING\t28\tOLA-1999-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84417-1.mp3\t\"fats\" Waller And His Rhythm\tSerenade For A Wealthy Widow\tVictor\t24742\t84417-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_212.mp3\tReginald Foresythe And His Orchestra\tSerenade For A Wealthy Widow\tColumbia\t2916\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC072284.mp3\tGlenn Miller And His Orch\tSerenade In Blue\tVICTOR\t27935\t072284\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC262.mp3\tBilly Eckstine & His Octet\tSerenade In Blue\tNATIONAL\t\tNSC262\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL428.mp3\tErroll Garner Trio\tSerenade In Blue\tATLANTIC\t675\t428\t1950\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27935.mp3\tGlenn Miller & His Orchestra\tSerenade In Blue\tVictor\t27935\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_103.mp3\tBenny Goodman And His Orchestra Feat. Dick Haymes\tSerenade In Blue\tCOLUMBIA\t36622\tCO32923-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh202.mp3\tHenry Hall And The Bbc Dance Orchestra\tSerenade In The Night\tHenry Halls Hour\tbroadcasting\t\t1936\tthis was a 1936 hit, recorded by many of the famous bands of these days. However, it was never officially waxed by the BBC Dance Orchestra. It's a recording for broadcast, produced at the BBC Maida Vale studios in London and then put on air (\"Henry Hall's Hour\")\nhttp://www.jazz-on-line.com/a/mp3w/1937_211.mp3\tJan Garber And His Orchestra\tSerenade In The Night\tBRUNSWICK\t7804\tLA1208\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM499-2.mp3\tThree Peppers\tSerenade In The Night (vtoy Wilson-bob Bell)\tVARIETY\tI630\tM499-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/Cap2285.mp3\tJo Stafford\tSerenade Of The Bells\tCapitol\t15007\t2285\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2372x.mp3\tSammy Kaye\tSerenade Of The Bells\tRCA\t20-2372\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_066.mp3\tJo Stafford\tSerenade Of The Bells\tCapitol\t15007\t2285\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068074.mp3\tTeddy Powell And His Orch\tSerenade To A Maid\tBLUEBIRD\t11373\t068074\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S3323.mp3\tSlim Gaillard Trio\tSerenade To A Poodle\tMGM\t10442\t47S3323\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67784-A.mp3\tBenny Carter And His Orchestra\tSerenade To A Sarong\tDECCA\t3262A\t67784-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUB-10385-B.mp3\tArtie Shaw And His Orchestra\tSerenade To A Savage\tBLUEBIRD\tB-10385-B\t036269-10\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS27851-1.mp3\tColeman Hawkins\tSerenade To A Sleeping Beauty\tCBS\toK6347\t27851-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COLWM1033.mp3\tDuke Ellington & Famous Orch\tSerenade To Sweden\tCOLUMBIA\t35214\tWM1033\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Col145759-2.mp3\tJohnny Dunn And His Band\tSergeant Dunn's Bugle Call Blues\tColumbia\t14306-D\t145759-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC69318.mp3\tDavid And Howard (mccarn-long)\tServes Em Fine\tVICTOR\t23577\t69318\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74120.mp3\tBuddy Johnson And His Orch.\tServes Me Right\tDECCA\t48060\t74120\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD168.mp3\tGeorgie Auld & His Orch\tSettin' The Pace\tDISC\t117\tD168\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S6061.mp3\tHank Williams-drifting Cowboys\tSettin' The Woods On Fire\tMGM\t11318A\t52S6061\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16195.mp3\tDjango Reinhardt Et Son Grand Orchestre Fud Candrix Et Son Orchestre\tSeul Ce Soir\tRythme\tD5030\t16195\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26286-A.mp3\tBenny Goodman Sextet\tSeven Come Eleven\tCOLUMBIA\t35349\t26286-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL52.mp3\tRed Norvo Sextet\tSeven Come Eleven\tKEYNOTE\t1314\tHL52\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL1081x.mp3\tClyde Mcphatter\tSeven Days\tATLANTIC\t1081\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_258.mp3\tClyde Mcphatter\tSeven Days\tAtlantic\t1081\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_122.mp3\tDorothy Collins\tSeven Days\tCoral\t61562\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_135.mp3\tCrew-cuts\tSeven Days\tMercury\t70782\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/MERYB9450.mp3\tGeorgia Gibbs\tSeven Lonely Days\tMERCURY\t70095\tYB9450\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_037.mp3\tGeorgia Gibbs\tSeven Lonely Days\tMERCURY\t70095\tYB9450\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLRR1620.mp3\tCharles Brown And His Band\tSeven Long Days\tALLADDIN\t3092\tRR1620\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_042.mp3\tBoyd Bennett And His Rockets\tSeventeen\tKing\t1470\tK9551-1\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_028.mp3\tFontane Sisters\tSeventeen\tDot\t15386\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_137.mp3\tRusty Draper\tSeventeen\tMercury\t70651\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh781A.mp3\tKen Snakehips Johnson And His West Indian Orchestra\tSeventeen Candles (v Pat Oregan)\tHMV\tBD-5559\tOEA-8467-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D557SA.mp3\tSy Oliver & His Orch\tSeventh Avenue\tV-DISC\t557\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB1092.mp3\tCount Basie & His Orchestra\tSeventh Avenue Express\tRCA\t20-3003\tD7VB1092\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU70657-1.mp3\tJimmie Davis\tSewing Machine Blues\tBLUEBIRD\t5751\t70657-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70404x.mp3\tCrew Cuts\tSh-boom\tMERCURY\t70404\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_030.mp3\tChords\tSh-boom\tCat\t104\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_002.mp3\tCrew-cuts, Orchestra Of David Carroll\tSh-boom\tMERCURY\t70404\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_096.mp3\tStan Freberg Feat. Billy May's Orchestra, The Toads\tSh-boom\tCapitol\t2929\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_319.mp3\tAndrews Sisters Feat. O/jimmy Dorsey\tSha-sha\tDECCA\t1974\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_104.mp3\tSammy Kaye And His Orchestra\tShabby Old Cabby\tVictor\t26298\t037472\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480546.mp3\tArt Farmer And Gigi Gryce\tShabozz\tPrestige\tLP7017\t809\t1955\tArt Farmer, FLH, Gigi Gryce, As, Duke Jordan, P, Addison Farmer, B,, Art's Twin Brother, Philly Joe Jones, D, [Featuring Gigi Gryce]\nhttp://www.jazz-on-line.com/a/mp3b/VIC044724-1.mp3\tLionel Hampton & His Orch\tShades Of Jade\tVICTOR\t26604\t044724-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic044724-1.mp3\tLionel Hampton And His Orchestra\tShades Of Jade\tVictor\t26604\t044724-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUB794-A.mp3\tBing Crosby\tShadow Waltz\tBRUNSWICK\t6599\tB794\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU6599.mp3\tBing Crosby\tShadow Waltz\tBRUNSWICK\t6599\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D235A2.mp3\tHarry Horlick And His Orchestra\tShadow Waltz\tV-DISC\t235A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-10502-A.mp3\tArtie Shaw And His Orchestra\tShadows\tBLUEBIRD\tB-10502-A\t043367-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu043367-1.mp3\tArtie Shaw And His Orchestra\tShadows\tBluebird\tB-10502\t043367-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BANLA145-A.mp3\tBing Crosby\tShadows Of Love\tBANNER\t33167\tLA145-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA145-B.mp3\tJimmie  Grier  And  His  Orchestra\tShadows Of Love\tColumbia\t\tLA145-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC019804.mp3\tLeo Reisman & His Orch\tShadows On The Moon\tVICTOR\t25793\t019804\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU055581.mp3\tGlenn Miller & His Orch\tShadows On The Sand (vr.eberle)\tBLUEBIRD\t10900\t055581\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban13619-1.mp3\tHerny ''red'' Allen And His New York Orchestra\tShadows On The Swanee\tBanner\t32829\t13619-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC76738-1.mp3\tIsham Jones & His Orch\tShadows On The Swanee (v E S)\tVICTOR\t24368\t76738-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0600_03.mp3\tLee Morse And Her Bluegrass Boys\tShadows On The Wall\tPerfect\t11581B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1938_0302_02.mp3\tLee Morse And Her Bluegrass Boys\tShadows On The Wall\tDecca\t1919B\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0606_01.mp3\tLee Morse And Her Bluegrass Boys\tShadows On The Wall\tColumbia\t1497DA\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63982-A.mp3\tLouis Armstrong-decca Mixed Ch\tShadrack\tDECCA\t25150\t63982-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU77246-2.mp3\tPrairie Ramblers\tShady Grove My Darling\tBLUEBIRD\t5322\t77246-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO31426-3.mp3\tBenny Goodman And His Orchestra\tShady Lady Bird\tCOLUMBIA\t36429\tCO31426-3\t1941\tvocal Peggy Lee\nhttp://www.jazz-on-line.com/a/mp3e/COLCO31426-1.mp3\tBenny Goodman And His Orch\tShady Lady Bird\tCOLUMBIA\t36429\tCO31426-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU73503-1.mp3\tBechet New Orleans Feet Warmers\tShag\tBLUEBIRD\t10022\t73503-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/CONC1997-1.mp3\tBukka White\tShake 'em On Down\tCONQUEROR\t9072\tC1997-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38043.mp3\tSidney Bechet Qt\tShake 'em Up\tCOLUMBIA\t38321\tCO38043\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75631.mp3\tBuddy Johnson\tShake 'em Up\tDECCA\t27087\t75631\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_227.mp3\tFaye Adams\tShake A Hand\tHERALD\t416\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_230.mp3\tSavannah Churchill\tShake A Hand\tDECCA\t28836\t84968\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS5765.mp3\tSonny Terry\tShake Down\tSAVOY\t5549\tS5765\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC047706.mp3\tTommy Dorsey And His Orch\tShake Down The Stars\tVICTOR\t26525\t047706\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047068.mp3\tGlenn Miller & His Orch\tShake Down The Stars\tBLUEBIRD\t10689\t047068\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67700.mp3\tElla Fitzgerald & Her Orch\tShake Down The Stars\tDECCA\t3199A\t67700\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COLWC2971.mp3\tBenny Goodman & His Orch\tShake Down The Stars\tCOLUMBIA\t35426\tWC2971\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67187.mp3\tBob Crosby & His Orch\tShake Down The Stars\tDECCA\t3027B\t67187\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_260.mp3\tElla Fitzgerald\tShake Down The Stars\tDECCA\t3199A\t67700\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1379-1.mp3\tGeorgie Auld & Ho\tShake Down The Stars (vkf)\tVARSITY\t8199\tUS1379-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVUS1285.mp3\tJoe Turner W Coleman Hawkins\tShake It And Break It\tSAVOY\t5544\tUS1285\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC051222-1.mp3\tBechet New Orleans Feetwarmers\tShake It And Break It\tVICTOR\t26640A\t051222-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/QRS1023ab.mp3\tCarl Fenton's New Yorkers\tShake It Down\tQRS\t1023\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU69327.mp3\tAllen Brothers\tShake It, Ida, Shake It\tBLUEBIRD\t5165\t69327\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU5165.mp3\tAllen Brothers\tShake It, Ida, Shake It\tBLUEBIRD\t5165\t69327\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141429-1.mp3\tEthel Waters And Her Ebony 4\tShake That Thing\tCOLUMBIA\t14116 D\tW141429-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE17825.mp3\tAbe Lyman's Californians\tShake That Thing\tBRUNSWICK\t3069\tE17825\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC7366ST.mp3\tWingy Manone & His Orch.\tShake That Thing\tDECCA\t7366\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe73837-B.mp3\tClarence Williams Blue Five\tShake That Thing (v E T)\tOKeh\t8267\t73837-B\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC13130-A.mp3\tHopkins Clawed\tShake Your Ashes\tARC\t(ARC-)\t13130-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/JazB-13130-A.mp3\tClaude Hopkins And His Orchestra\tShake Your Ashes\tJazz Archives\t4\tB-13130-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC63194.mp3\tJohnny Dodds Chicago Boys\tShake Your Can\tDECCA\t7413\t63194\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81360-3.mp3\tThe Georgians\tShake Your Feet\tColumbia\t30-D\t81360-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Edi9266.mp3\tFletcher Henderson's Orchestra\tShake Your Feet\tEdison\t51276\t9266\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9266-C.mp3\tFletcher Henderson And His Orch\tShake Your Feet (ziegfield Follies Of 1923)\tEDISON\t51276R\t9266-C\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38916-C.mp3\tJimmie Lunceford & His Orch\tShake Your Head\tDECCA\t30249M\t38916-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152458.mp3\tJack Teagarden And His Orch\tShake Your Hips\tCOLUMBIA\t2802 D\tW152458\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL1026v.mp3\tJoe Turner\tShake, Rattle And Roll\tATLANTIC\t1026\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC86380.mp3\tBill Haley And His Comets\tShake, Rattle And Roll\tDECCA\t29204\t86380\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_041.mp3\tBill Haley And His Comets\tShake, Rattle, And Roll\tDECCA\t29204\t86380\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAE3VB-2478.mp3\tRalph Flanagan And His Orchestra\tShaker Heights Stomp\tRCA VICTOR \t20-5591\tE3VB-2478\t1953\t\nhttp://www.jazz-on-line.com/a/mp3o/RCAE3VB-2478.mp3\tRalph Flanagan & His Orch.\tShaker Heights Stomp\tRCA VICTOR\t20-5591\tE3VB-2478\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE37291.mp3\tDon Redman And His Orchestra Vocal Chorus By Don Redman\tShakin' The African\tBrunswick\t80036 B\tE37291A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-37291-A.mp3\tDon Redman And His Orchestra\tShakin' The African\tBrunswick\t6211\tE-37291-A  \t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-37224-A.mp3\tDon Redman And His Orchestra\tShakin' The African\tBrunswick\t01244\tE-37224-A  \t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE37291.mp3\tDon Redman And His Orch\tShakin' The Africann\tBRUNSWICK\t6211\tE37291\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW144592.mp3\tRuth Etting\tShaking The Blues Away\tCOLUMBIA\t1113 D\tW144592\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC39573-5.mp3\tPaul Whiteman & His Orch\tShaking The Blues Away\tVICTOR\t20885A\t39573-5\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_039.mp3\tRuth Etting\tShaking The Blues Away\tCOLUMBIA\t1113 D\tW144592\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1276-D.mp3\tFred Astaire\tShall We Dance\tBRUNSWICK\t7857\tLA1276-D\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_052.mp3\tFred Astaire Feat. Johnny Green And His Orchestra\tShall We Dance?\tBRUNSWICK\t7857\tLA1276-D\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S210.mp3\tLionel Hampton & His Orchestra\tShalom! Shalom!\tMGM\t11039\t51S210\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/MGM51-S-210.mp3\tLionel Hampton And His Orchestra\tShalom, Shalom\tMGM\t11039\t51-S-210\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18698.mp3\tLawrence Welk Champagne Music\tShame On You\tDECCA\t18698\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM582.mp3\tCharlie Barnet & His Orch\tShame On You\tVARIETY\tI627\tM582\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_195.mp3\tRed Foley Feat. Lawrence Welk Orchestra\tShame On You\tDecca\t18698\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU027290-1.mp3\tFats Waller And His Rhythm\tShame! Shame!\tBLUEBIRD\t7885\t027290-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec38599-A.mp3\tFletcher Henderson And His Orchestra\tShangai Shuffle\tDecca\t158\t38599-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4489.mp3\tDoris Day\tShanghai\tCOLUMBIA\t39423\tHCO4489\t\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM51S214.mp3\tBilly Williams Qt\tShanghai\tMGM\t10998A\t51S214\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_218.mp3\tBob Crosby And His Orchestra\tShanghai\tCapitol\t1525\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_046.mp3\tDoris Day Feat. Paul Weston's Orchestra\tShanghai\tCOLUMBIA\t39423\tHCO4489\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU62594.mp3\tAllen Brothers\tShanghai Rooster\tBLUEBIRD\t5668\t62594\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu5668.mp3\tAllen Brothers\tShanghai Rooster\tBluebird\t5668\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC38599.mp3\tFletcher Henderson And His Orch\tShanghai Shuffle\tDECCA\t158A\t38599\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB16446.mp3\tBuster Bailey+7 Chocolates\tShanghai Shuffle\tCOLUMBIA\t35677\tB16446\t1934\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU14034.mp3\tGene Rodemich And His Orchestra\tShanghai Shuffle\tBRUNSWICK\t2760\t14034\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3c/DEC65826.mp3\tLouis Armstrong & His Orch.\tShanty Boat On The Mississippi\tDECCA\t2729B\t65826\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D326B.mp3\tCharlie Barnet And His Orchestra (kay Starr Voc.)\tSharecropper Blues\tV-DISC\t326B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE808.mp3\tBen Bernie And His Orch\tSharing\tBRUNSWICK\t4837\tLAE808\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11793-A.mp3\tGuy Lombardo Royal Canadians\tSharing\tBRUNSWICK\t6315\t11793-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D357B2.mp3\tRaymond Scott And His Orchestra\tShavetail (roxy Special)\tV-DISC\t357B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/GUIG566-A.mp3\tDizzy Gillespie Quintet\tShaw 'nuff\tGUILDE\t1002\tG566-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480547.mp3\tArt Pepper\tShaw ?nuff\tContemporary\tM3568\t\t1959\tMarty Paich, Ar, Art Pepper, Cl, As, Jack Sheldon, Tp, Bob Envoldsen, Ts, VTb, Russ Freeman, P, Bill Perkins, Ts, Bud Shank, As, Al Porcino, T, Joe Mondragon, B, Vince DeRosa, Fh, Med Flory, Bar, Dick Nash, Tb, Mel Lewis, D\nhttp://www.jazz-on-line.com/a/mp3h/BRUKC-611.mp3\tChic Scoggin And The Pla-mor Orchestra\tShe Chills Me\tBRUNSWICK\t4654\tKC-611\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151872-2.mp3\tBen Selvin & His Orch\tShe Didn't Say \"yes\"\tCOLUMBIA\t2562 D\tW151872-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC70939-3.mp3\tLeo Reisman And His Orch\tShe Didn't Say Yes\tVICTOR\t22869\t70939-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_174.mp3\tLeo Reisman And His Orchestra\tShe Didn't Say Yes\tVictor\t22870\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D239B1.mp3\tChuck Foster And His Orchestra\tShe Don't Wanna\tV-DISC\t239B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU049040.mp3\tWashboard Sam\tShe Fooled Me\tBLUEBIRD\t8450\t049040\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC2920-A.mp3\tDick Robertson And His Orch\tShe Had To Go And Lose It A\tDecca\t2920-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_015.mp3\tHarry Lauder\tShe Is My Daisy\tVICTOR\t55123\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_027.mp3\tHenry Burr And Albert Campbell\tShe Is The Sunshine Of Virginia\tVICTOR\t18112\t18128-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC69357.mp3\tJimmie Davis\tShe Left A Runnin' Like A Sewing Machine\tVICTOR\t23587\t69357\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/COL81906-3.mp3\tBilly Jones And Ernest Hare\tShe Loves Me\tCOLUMBIA\t194D\t81906-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_254.mp3\tDon Cornell Feat. O/norman Leyden\tShe Loves Me\tCoral\t61011\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_175.mp3\tErnest Hare And Billy Jones\tShe Loves Me\tCOLUMBIA\t194D\t81906-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9655.mp3\tGreen Bros Novelty Orch\tShe Loves Me (vbj)\tEDISON\t51385\t9655\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BANLA146-A.mp3\tBing Crosby\tShe Reminds Me Of You\tBANNER\t33201\tLA146-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4591.mp3\tFrankie Laine\tShe Reminds Me Of You\tCOLUMBIA\t39599\tHCO4591\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC81760-2.mp3\tEddy Duchin & His Orch\tShe Reminds Me Of You\tVICTOR\t24591\t81760-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruLA146-A.mp3\tJimmie  Grier  And  His  Orchestra\tShe Reminds Me Of You\tBrunswick\t6853\tLA146-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA146-B.mp3\tBing Crosby Acc. By Jimmy Grier And His Orchestra\tShe Reminds Me Of You\tColumbia\tCL-2750\tLA-146-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_104.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tShe Reminds Me Of You\tVICTOR\t24591\t81760-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic62191-1.mp3\tWilton Crawley And His Orchestra\tShe Saves Her Sweetest Smiles For Me\tVictor\t23292\t62191-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_044.mp3\tLud Gluskin And His Orchestra\tShe Shall Have Music\tBRUNSWICK\t7658\t19091-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU02523.mp3\tWashboard Wonders\tShe Takes Her Time\tBLUEBIRD\t6671\t02523\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1898_003.mp3\tGeorge J. Gaskin\tShe Was Bred In Old Kentucky\tCOLUMBIA\t4166\t\t1898\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_189.mp3\tJudy Valentine\tShe Was Five And He Was Ten\tEpic\t9004\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR140963-2.mp3\tThe University Six\tShe Was Just A Sailor's Sweetheart\tHARMONY\t36-H\t140963-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17954-55.mp3\tSix Jumping Jacks\tShe Was Just A Sailor's Sweetheart (vts)\tBRUNSWICK\t3094\t17954-55\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47484.mp3\tGuy Mitchell\tShe Wears Red Feathers\tCOLUMBIA\t39909\tCO47484\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_162.mp3\tGuy Mitchell\tShe Wears Red Feathers\tCOLUMBIA\t39909\tCO47484\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh185.mp3\tJack Hylton And His Orchestra\tShe Wore A Little Jacket Of Blue (v Billy Munn)\tHMV\tBD-143\tOEA-1818-4\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_221.mp3\tAndrews Sisters Feat. Russ Morgan Orchestra\tShe Wore A Yellow Ribbon\tDECCA\t18572A\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU11898.mp3\tGene Rodemich And His Orchestra\tShe Wouldnt What A Asked Her Clo\tBRUNSWICK\t2556B\t11898\t1923\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11493.mp3\tGlenn Miller & His Orchestra\tShe'll Always Remember\tBluebird\t11493\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071862.mp3\tGlenn Miller & His Orch\tShe'll Always Remember\tBLUEBIRD\t11493-A\t071862\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/BLU073459-1.mp3\tEarl Hines And His Orchestra\tShe'll Always Remember\tBLUEBIRD\tB-11512\t073459-1\t1942\tv Madeline Green - The Three Varieties\nhttp://www.jazz-on-line.com/a/mp3d/Blu073459-1.mp3\tEarl Hines And His Orchestra\tShe'll Always Remember\tBluebird\t11512\t073459-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143027.mp3\tGid Tanner's Skillet Lickers\tShe'll Be Coming Round The Mountain\tCOLUMBIA\t15200 D\tW143027\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE26850.mp3\tHal Kemp And His Orch\tShe's A Great Great Girl\tBRUNSWICK\t3863\tE26850\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC43358-1.mp3\tRoger Wolfe Kahn & His Orch\tShe's A Great, Great Girl\tVICTOR\t21326\t43358-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145753-3.mp3\tJan Garber & His Orch\tShe's A Great, Great Girl (v Goldie)\tCOLUMBIA\t1372 D\tW145753-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC17516-1.mp3\tMound City Blue Blowers\tShe's A Latin From Manhattan\tVOCALION\t2957\t17516-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39442.mp3\tVictor Young And His Orch\tShe's A Latin From Manhattan\tDECCA\t418A\t39442\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_060.mp3\tJohnny Green And His Orchestra\tShe's A Latin From Manhattan\tColumbia\t3029\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC91041.mp3\tHarlem Hamfats\tShe's A Mellow Mother For You\tDECCA\t7262\tC91041\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD9VB1766.mp3\tCount Basie & His Orchestra\tShe's A Wine'o\tRCA\t20-3542\tD9VB1766\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151106-2.mp3\tGeorgia Cotton Pickers\tShe's Coming Back Some Cold Rainy Day\tCOLUMBIA\t14577 D\tW151106-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU32125-1.mp3\tNew Orleans Rhythm Kings\tShe's Cryin' For Me\tBLUEBIRD\t10956\t32125-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480894.mp3\tConway's Band; Patrick Conway, Cond.\tShe's Dixie All The Time (medley-fox Trot)\tVICTOR\t35650-B\tC-20367\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81682-3.mp3\tTed Lewis & His Band\tShe's Everybody's Sweetheart\tCOLUMBIA\t122D\t81682-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_080.mp3\tTed Lewis And His Band\tShe's Everybody's Sweetheart\tCOLUMBIA\t122D\t81682-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_180.mp3\tHenry Burr\tShe's Everybody's Sweetheart (but Nobody's Gal)\tVICTOR\t19301\t29688\t1924\t\nhttp://www.jazz-on-line.com/a/mp3h/Pat300502-1.mp3\tSam Wooding And His Orchestra\tShe's Funny That Wag [sic] (she's Funny That Way)\tPath\tX-8697\t300502-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYCB324.mp3\tBill Harris Septet\tShe's Funny That Way\tKEYNOTE\t626\tCB324\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC48135-3.mp3\tGene Austin\tShe's Funny That Way\tVICTOR\t21779\t48135-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC48671-4.mp3\tJean Goldkette And His Orch\tShe's Funny That Way\tVICTOR\t21853A\t48671-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4754.mp3\tBillie Holiday W Eddy Heywood\tShe's Funny That Way\tCOMMODORE\t569\t4754\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47392.mp3\tFrankie Laine\tShe's Funny That Way\tCOLUMBIA\t39798\tCO47392\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL138.mp3\tLester Young's Band\tShe's Funny That Way\tALLADDIN\t138\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1709.mp3\tArt Tatum\tShe's Funny That Way\tV-DISC\t604\t1709\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73482.mp3\tEddie Condon & His Orch\tShe's Funny That Way\tDECCA\t23600\t73482\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1056.mp3\tIllinois Jacquet\tShe's Funny That Way\tAPOLLO\t764\tR1056\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVBOP4526.mp3\tErroll Garner\tShe's Funny That Way\tSAVOY\t768\tBOP4526\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_036.mp3\tGene Austin Feat. Nat Shilkret And His Orchestra\tShe's Funny That Way\tVICTOR\t21779\t48135-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU042935-2.mp3\tColeman Hawkins And His Orch.\tShe's Funny That Way (vthelma Carpenter)\tBLUEBIRD\t10477\t042935-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/HAR144224-2.mp3\tUniversity Six\tShe's Got It!\tHARMONY\t425-H\t144224-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC260.mp3\tBilly Eckstine & His Octet\tShe's Got The Blues For Sale\tNATIONAL\t\tNSC260\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic57568-1.mp3\tWilton Crawley And His Orchestra\tShe's Got What I Need\tVictor\tV-381I6\t57568-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLSC124.mp3\tHank Penny's Radio Cowboys\tShe's Just That Kind\tCOLUMBIA\t20310\tSC124\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/Gre2929-A.mp3\tCliff Jackson And His Krazy Kats\tShe's Just The Baby For Me\tGrey Gull\t1854\t2929-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE24206.mp3\tSix Jumping Jacks\tShe's Just What The Doctor Ordered\tBRUNSWICK\t3623\tE24206\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU044047.mp3\tLonnie Johnson\tShe's My Mary\tBLUEBIRD\t8322\t044047\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic67935-1.mp3\tMckinney's Cotton Pickers\tShe's My Secret Passion\tVictor\t22628\t67935-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC42934-1.mp3\tBennie Moten Kansas City Orch\tShe's No Trouble\tVICTOR\t24893\t42934-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64566-A.mp3\tBuddy Jones\tShe's Selling What She Used To Give Away\tDECCA\t5613A\t64566-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC58184-5.mp3\tLeo Reisman & His Orch\tShe's Such A Comfort To Me\tVICTOR\t22282B\t58184-5\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99402.mp3\tTune Wranglers\tShe's Sweet (ain't She Sweet)\tBLUEBIRD\t6326\t99402\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM608-1.mp3\tCab Calloway & His Orch\tShe's Tall, She's Tan, She's Terrific\tVARIETY\tI643\tM608-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013349-1.mp3\tFats Waller And His Rhythm\tShe's Tall, She's Tan, She's Terrific\tVICTOR\t25671\t013349-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62636.mp3\tBob Howard & His Orch\tShe's Tall, She's Tan, She's Terrific\tDECCA\t1489\t62636\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_287.mp3\tCab Calloway And His Orchestra\tShe's Tall, She's Tan, She's Terrific\tVOCALION\t3787\tM608\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC62335-A.mp3\tLouis Armstrong And His Orchestra\tShe's The Daughter Of A Planet From Havana\tDECCA\t1353\t62335-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_150.mp3\tManuel Romain\tShe's The Daughter Of Mother Machree\tColumbia\t1951\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-0414.mp3\tFrank Stanley & Henry Burr\tShe's The Fairest Little Flowe\tCOLUMBIA\tA-0414\t03785-2\t1907\t\nhttp://www.jazz-on-line.com/a/mp3b/COL03785-2.mp3\tFrank Stanley & Henry Burr\tShe's The Fairest Little Flower\tCOLUMBIA\tA-0414\t03785-2\t1907\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA0414.mp3\tFrank Stanley & Henry Burr\tShe's The Fairest Little Flower\tCOLUMBIA\tA0414\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55130ST.mp3\tHarry Lauder\tShe's The Lass For Me\tVICTOR\t55130\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_105.mp3\tHarry Lauder\tShe's The Lass For Me\tVICTOR\t55130\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400612-B.mp3\tFred Hall & His Sugar Babies\tShe's The Sweetheart Of Six Other Guys\tOKeh\t41026\t400612-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72631.mp3\tEddie Condon & His Orchestra\tSheik Of Araby\tDECCA\t23718\t72631\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU12144-1.mp3\tBennie Krueger And His Orch\tSheltered By The Stars Cradled By The Moon\tBRUNSWICK\t6366\t12144-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO3931-1.mp3\tHorace Heidt And His Knights\tShepherd Serenade\tCOLUMBIA\t36370\tCCO3931-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC69863.mp3\tBing Crosby\tShepherd's Serenade\tDECCA\t4065A\t69863\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1135-2.mp3\tGene Ammons Sextet\tShermanski\tMERCURY\t8096\t1135-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/MANS1276.mp3\tSlam Stewart Trio\tSherry Lynn Flip\tMANOR\t1028\tS1276\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU071860.mp3\tGlenn Miller And His Orch\tShhh, It's A Military Secret\tBLUEBIRD\t11493-B\t071860\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBluB-11493.mp3\tGlenn Miller & His Orchestra\tShhh, It's A Military Secret\tBluebird\tB-11493\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13152-B.mp3\tDorsey Brothers Orchestra\tShim Sham Shimmy\tBRUNSWICK\t6537\t13152-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE33334A.mp3\tRed Nichols And His Five Pennies\tShim-me-sha-wabble\tBRUNSWICK\t6836\tE33334A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Blu045948-1.mp3\tDon Redman And His Orchestra\tShim-me-sha-wabble\tBluebird\tB-10765\t045948-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG11354.mp3\tNew Orleans Rhythm Kings\tShimme She Wabble\tGENNETT\t5106\tG11354\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/COL27688-1.mp3\tBud Freeman And His Famous Chicagoans\tShimme-me-sha-wabble\tCOLUMBIA\t35856\t27688-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62677.mp3\tEdgar Hayes & His Orch.\tShindig\tDECCA\t2048B\t62677\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/MER1131.mp3\tFrankie Laine W Carl Fischer\tShine\tMERCURY\t5091\t1131\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49781-3.mp3\tBoyd Senter And His Senterpedes\tShine\tVICTOR\t21912A\t49781-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOLA1293.mp3\tQuintet Hot Club Of France\tShine\tVICTOR\t25558\tOLA1293\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404421-C.mp3\tLouis Armstrong Sebastian Orch\tShine\tOKeh\t41486\t404421-C\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11376-A.mp3\tBing Crosby & Mills Bros\tShine\tBRUNSWICK\t6485\t11376-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDR3739.mp3\tMills Brothers\tShine\tDECCA\t3688B\tDR3739\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1093-1.mp3\tDjango Reinhardt\tShine\tGramophone\tK-7890\tOLA-1093-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC61421.mp3\tElla Fitzgerald And Her Savoy 8\tShine\tDECCA\t25354\t61421\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/COL81699-3.mp3\tCalifornia Ramblers\tShine\tCOLUMBIA\t127D\t81699-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_121.mp3\tCalifornia Ramblers\tShine\tCOLUMBIA\t1314 D\tW145529\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_072.mp3\tFrankie Laine\tShine\tMERCURY\t5091\t1131\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_204.mp3\tLouis Armstrong Feat. Lionel Hampton\tShine\tCOLUMBIA\t39232\tZSP5057\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_076.mp3\tBing Crosby And The Mills Brothers\tShine\tBRUNSWICK\t6276\t11376-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480637.mp3\tBenny Goodman And His Orchestra\tShine\tColumbia\tSL160\t\t1938\tCarnegie Hall'' Concert:<br>Harry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Hymie Schertzer, George Koenig (as), Arthur Rollini, Babe Russin (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480730.mp3\tJack Teagarden's Big Eight\tShine\tHRS\t2006\tR3417\t1940\tRex Stewart (co), Jack Teagarden (tb), Barney Bigard (cl), Ben Webster (ts), Billy Kyle (p), Brick Fleagle (g), Billy Taylor Sr. (sb), Dave Tough (dm)\nhttp://www.jazz-on-line.com/a/mp3c/V-D236.mp3\tKay Kyser & His Orchestra\tShine On Harvest Moon\tV-DISC\t236\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR365031-2.mp3\tRuth Brown (k.smith)\tShine On Harvest Moon\tHARMONY\t1371-H\t365031-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB891.mp3\tCount Basie & His Orchestra\tShine On Harvest Moon\tRCA\t20-2694\tD7VB891\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC019619-2.mp3\tTommy Dorsey & His Orch\tShine On, Harvest Moon\tVICTOR\t25780\t019619-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_209.mp3\tKate Smith\tShine On, Harvest Moon\tCOLUMBIA\t36674\tCO31988-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_005.mp3\tAda Jones And Billy Murray\tShine On, Harvest Moon\tEDISON\t10134\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_002.mp3\tHarry Macdonough And Elise Stevenson\tShine On, Harvest Moon\tVICTOR\t16259\tB6666-4\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_112.mp3\tEthel Waters\tShine On, Harvest Moon\tCOLUMBIA\t2511 D\tW151719-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_018.mp3\tFrank Stanley And Henry Burr\tShine On, Harvest Moon\tIndestructable\t1075\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3h/M-G59-XY-81.mp3\tHarry James And His Orchestra\tShiny Stockings\tM-G-M\tK12842\t59-XY-81\t1959\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU065731-1.mp3\tErskine Hawkins & His Orch\tShipyard Ramble\tBLUEBIRD\t11218\t065731-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18674B.mp3\tLucky Millinder's Orch\tShipyard Social Function\tDECCA\t18674B\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71453.mp3\tLucky Millinder And His Orchestra\tShipyard Social Function\tDecca\t18674\t71453\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP2722.mp3\tBenny Goodman Sextet\tShirley Steps Out\tCAPITOL\t\t2722\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLNO-2141.mp3\tShirley And Lee\tShirley's Back\tALLADDIN\t3192\tNO-2141\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC9497.mp3\tJimmie Davis\tShirt Tail Blues\tDECCA\t5032B\tC9497\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE27643-B.mp3\tBenny Goodman And His Boys\tShirt Tail Stomp\tBRUNSWICK\t3975\tE27643-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26354.mp3\tBenny Goodman Sextet\tShivers\tCOLUMBIA\t35349\t26354\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401961-D.mp3\tFrankie Trumbauer & His Orch\tShivery Stomp\tOKeh\t41268\t401961-D\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D349B2.mp3\tSammy Kaye And His Orchestra (nancy Norman And Billy W\tSho' Nuff\tV-DISC\t349B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18795.mp3\tWingy Manone & His Orch\tShoe Shine Boy\tARC\tBR5046\t18795\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DECTB2251-2.mp3\tMills Brothers\tShoe Shine Boy\tDECCA\t961A\tTB2251-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC60250-A.mp3\tLouis Armstrong And His Orch.\tShoe Shine Boy\tDECCA\t672B\t60250-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA521.mp3\tBing Crosby & Jimmy Dorsey\tShoe Shine Boy\tDECCA\t91612\tDLA521\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec60250-A.mp3\tLouis Armstrong And His Orchestra\tShoe Shine Boy\tDecca\t672\t60250-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/JazCO-18547-2.mp3\tMills Blue Rhythm Band\tShoe Shine Boy\tJazz Panorama\t3\tCO-18547-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA521-B.mp3\tJimmy Dorsey And His Orchestra With Bing Crosby\tShoe Shine Boy\tDECCA\t91612\tDLA521-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA521-A.mp3\tJimmy Dorsey And His Orchestra With Bing Crosby\tShoe Shine Boy\tDECCA\t3601A\tDLA521-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic100882-1.mp3\tFletcher Henderson And His Orchestra\tShoe Shine Boy\tVictor\t25375\t100882-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-19562-2.mp3\tDuke Ellington And His Orchestra\tShoe Shine Boy\tBrunswick\t7710\tB-19562-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480548.mp3\tBenny Goodman Trio\tShoe Shine Boy\tCapitol\tH/T441\t2501-2\t1947\tBenny Goodman (cl), Teddy Wilson (p), Jimmy Crawford (dm)\nhttp://www.jazz-on-line.com/a/mp3b/BRU19562-2.mp3\tDuke Ellington's Orch\tShoe Shine Boy (v Ivie Anderson)\tBRUNSWICK\t7710\t19562-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC024066-1.mp3\tLionel Hampton And His Orch\tShoe Shiner's Drag\tVICTOR\t26011\t024066-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU45621-3.mp3\tJelly Roll Morton Peppers\tShoe Shiner's Drag\tBLUEBIRD\t5707\t45621-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic024066-1.mp3\tLionel Hampton And His Orchestra\tShoe Shiner's Drag\tVictor\t26011\t024066-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic45621-3.mp3\tJelly-roll Morton's Red Hot Peppers\tShoe Shiner's Drag\tVictor\t21658\t45621-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15466A.mp3\tLeo Reisman And His Orch\tShoein' The Mare (vh.arlen)\tBRUNSWICK\t6942\t15466A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24085-1.mp3\tJimmie Lunceford And His Orchestra\tShoemaker's Holiday\tOkeh\t4712\t24085-1\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3c/CBS24085.mp3\tJimmie Lunceford & His Orch\tShoemakers Holiday\tCBS\tVO4712\t24085\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP143y.mp3\tElla Mae Morse\tShoo Shoo Baby\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3220.mp3\tAndrew Sisters And Vic Schoen\tShoo Shoo Baby\tDECCA\t18572A\tL3220\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC18572A.mp3\tAndrews Sisters & Vic Schoen\tShoo Shoo Baby\tDECCA\t18572A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_106.mp3\tJan Garber And His Orchestra\tShoo Shoo Baby\tHit\t7069\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1654.mp3\tDinah Shore\tShoo-fly Pie And Apple Pan Dowdy\tCOLUMBIA\t36943\tHCO1654\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_067.mp3\tDinah Shore\tShoo-fly Pie And Apple Pan Dowdy\tCOLUMBIA\t36943\tHCO1654\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_002.mp3\tAndrews Sisters\tShoo-shoo Baby\tDECCA\t18572A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_203.mp3\tTeresa Brewer\tShoot It Again\tCoral\t61528\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21714.mp3\tArtie Shaw And His New Music\tShoot The Likker To Me John Boy\tBRUNSWICK\t7976\tB-21714-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK2155-1.mp3\tMoon Mullican\tShoot The Moon\tKING\t1043A\tK2155-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC042614.mp3\tTommy Dorsey & His Clambake 7\tShoot The Sherbet To Me Herbert\tVICTOR\t26370\t042614\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146779-2.mp3\tCharlie Poole N.c.ramblers\tShootin' Creek\tCOLUMBIA\t15286 D\tW146779-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17308B.mp3\tThe Executor\tShop Closing Ordinance\tDECCA\t17308B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLRR219-1.mp3\tLightnin' Hopkins\tShort Haired Woman\tALLADDIN\t3005\tRR219-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63314-A.mp3\tAndrews Sisters\tShortenin' Bread\tDECCA\t1744A\t63314-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D311B2.mp3\tBob Crosby And His Orchestra\tShortenin' Bread\tV-DISC\t311B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_299.mp3\tAndrews Sisters\tShortenin' Bread\tDECCA\t1744A\t63314-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143031.mp3\tGid Tanner Skillet Lickers\tShortening Bread\tCOLUMBIA\t15123 D\tW143031\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-11078-A.mp3\tFats Waller And His Rhythm\tShortnin' Bread\tBluebird\tB-11078-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67403-B.mp3\tBob Crosby & His Orch\tShortnin' Bread\tDECCA\t3271A\t67403-B\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/MCA71535.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tShorty Boo\tMCA\t3151\t71535\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64747-A.mp3\tCount Basie And His Orchestra\tShorty George\tDECCA\t2325B\t64747-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2225x.mp3\tBill Johnson Musical Notes\tShorty's Blues\tRCA\t20-2225\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18867A.mp3\tLucky Millinder And His Orch\tShorty's Got To Go\tDECCA\t18867A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73398.mp3\tLucky Millinder And His Orchestra\tShorty's Got To Go\tDecca\t18867\t73398\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_107.mp3\tTennessee Ernie Ford\tShot Gun Boogie\tCapitol\t1295\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN0542-A.mp3\tVincent Lopez And His Orch\tShould I\tBanner\t0542-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VEL2043-V.mp3\tHarmonians\tShould I\tVelvet Tone\t2043-V\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC53960-2.mp3\tVictor Arden-phil Ohman Orch\tShould I\tVICTOR\t22255A\t53960-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149157-3.mp3\tPaul Whiteman & His Orch\tShould I\tCOLUMBIA\t2047 D\tW149157-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COLZSP5427.mp3\tHerman Chittison Trio\tShould I\tCOLUMBIA\t39396\tZSP5427\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_071.mp3\tFour Aces\tShould I\tDECCA\t28323\t83025\t1952\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480896.mp3\tAndre Previn\tShould I\tRCA VICTOR\t20-3043\tD7VB1804\t1948\tAndre Previn, p; Al Viola, g; Lloyd Pratt, b; Jackie Mills, drums\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1759-1.mp3\tBuster Bailey Sextet\tShould I ?\tVARSITY\t8337\tUS1759-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_025.mp3\tVictor Arden - Phil Ohman Orchestra Feat. Scrappy Lambent\tShould I?\tVICTOR\t22255A\t53960-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480691.mp3\tAhmad Jamal\tShould I?\tArgo\tLP-636\t9039\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3h/DH480895.mp3\tAndre Previn\tShould I?\tRCA VICTOR\t20-3043\tD7VB1804\t1947\tAndre Previn, p; Al Viola, g; Lloyd Pratt, b; Jackie Mills, drums\nhttp://www.jazz-on-line.com/a/mp3a/VIC62195-2.mp3\tDuke Ellington And His Orch\tShout 'em Aunt Tillie\tVICTOR\t23041B\t62195-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COL23894-2.mp3\tAlbert Ammons\tShout For Joy\tCOLUMBIA\t35961\t23894-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE26968-A.mp3\tGene Krupa & His Orch\tShout I Am An American\tOKEH\t5701\t26968-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-895-1.mp3\tCab Calloway And His Orchestra\tShout, Shout, Shout\tVocalion\t4369\tM-895-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69707.mp3\tLucky Millinder & His Orch\tShout, Sister, Shout\tDECCA\t18386B\t69707\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69707-A.mp3\tLucky Millinder And His Orchestra\tShout, Sister, Shout!\tDecca\t18386\t69707-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD9VB1768.mp3\tCount Basie & His Orchestra\tShoutin' Blues\tRCA\t20-3514\tD9VB1768\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13955-A.mp3\tMildred Bailey (dorsey Bros)\tShoutin' In That Amen Corner\tBRUNSWICK\t6655\t13955-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/CONWC2866.mp3\tSweet Violet Boys\tShow Me A Man That Won't (v G. Ryan)\tCONQUEROR\t9446\tWC2866\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC31182-2.mp3\tCoon-sanders Nighthawk Orch\tShow Me The Way\tVICTOR\t19525\t31182-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/COL140095-2.mp3\tTed Lewis & His Band\tShow Me The Way\tCOLUMBIA\t241D\t140095-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_114.mp3\tTed Lewis And His Band\tShow Me The Way\tCOLUMBIA\t241D\t140095-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141355.mp3\tCalifornia Ramblers\tShow Me The Way To Go Home\tCOLUMBIA\t522 D\tW141355\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/KIR106263.mp3\tGolden Gate Orch\tShow Me The Way To Go Home\tKIRKEBY\tPA36307\t106263\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148209-1.mp3\tGid Tanner's Skillet Lickers\tShow Me The Way To Go Home\tCOLUMBIA\t15404 D\tW148209-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76672.mp3\tArtie Shaw And His Orchestra\tShow Me The Way To Go Home\tDECCA\t27434\t76672\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D230B.mp3\tFrankie Carle And His Orchestra\tShow Me The Way To Go Home\tV-DISC\t230B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBan1649.mp3\tThe Happiness Boys\tShow Me The Way To Go Home\tBanner\t1649\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/BAN6263-2.mp3\tBilly Jones And Ernest Hare\tShow Me The Way To Go Home\tBANNER\t1649\t6263-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3r/RiPer14488.mp3\tThe Golden Gate Orchestra\tShow Me The Way To Go Home\tPerfect\t14488\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_156.mp3\tErnest Hare And Billy Jones\tShow Me The Way To Go Home\tEDISON\t51660\t10705B\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU26317.mp3\tKing Oliver's Jazz Band\tShowboat Shuffle\tBRUNSWICK\t3998\t26317\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17407-1.mp3\tDuke Ellington And His Orch\tShowboat Shuffle\tBRUNSWICK\t7461\t17407-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-20076-2.mp3\tMills Blue Rhythm Band\tShowboat Shuffle\tColumbia\t3157-D\tCO-20076-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC45623-2.mp3\tJelly Roll Morton Trio\tShreveport\tVICTOR\t21658\t45623-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic45623-2.mp3\tJelly-roll Morton's Red Hot Peppers\tShreveport\tVictor\t21658\t45623-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe72040-B.mp3\tClarence Williams Blue Five\tShreveport Blues\tOKeh\t40006\t72040-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16707.mp3\tLeadbelly (h.ledbetter)\tShreveport Jail\tARC\t(Reject)\t16707\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG11908.mp3\tJelly Roll Morton\tShreveport Stomp\tGENNETT\t5590\tG11908\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4554.mp3\tJo Stafford\tShrimp Boats\tCOLUMBIA\t39581\tHCO4554\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_015.mp3\tJo Stafford\tShrimp Boats\tCOLUMBIA\t39581\tHCO4554\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/PARP3077.mp3\tBlind Lemon Jefferson\tShuckin' Sugar Blues\tPARAMOUNT\t12454\tP3077\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC8851.mp3\tHal Kemp And His Orch\tShuffle Off To Buffalo\tBRUNSWICK\t6471\tC8851\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_022.mp3\tDon Bestor And His Orchestra Feat. Maurice Cross\tShuffle Off To Buffalo\tVICTOR\t24253\t75299-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC75299-1.mp3\tDon Bestor And His Orch\tShuffle Off To Buffalo (vnb)\tVICTOR\t24253\t75299-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13007-A.mp3\tDon Redman & His Orch\tShuffle Your Feet (and Just Roll Along)\tBRUNSWICK\t6520\t13007-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-13007-A.mp3\tDon Redman And His Orchestra\tShuffle Your Feet/bandana Babies\tBrunswick\t6520\tB-13007-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/WM-1109-1.mp3\tBenny Carter And His Orchestra\tShufflebug Shuffle\tVOCALION\t5508\tWM-1109-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC035704-2.mp3\tLionel Hampton And His Orch\tShufflin' At The Hollywood\tVICTOR\t26254\t035704-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic035704-2.mp3\tLionel Hampton And His Orchestra\tShufflin' At The Hollywood\tVictor\t26254\t035704-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-2963-A.mp3\tFletcher Henderson Conducts Horace Henderson And His Orchestra\tShufflin' Joe\tOKEH\t5518\tWC-2963-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1808.mp3\tTed Daffan's Texans\tShut That Gate\tCOLUMBIA\t20077\tHCO1808\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE31460.mp3\tBilly Murray & Walter Scanlan\tShut The Door (they're Coming Through The Window)\tBRUNSWICK\t4611\tE31460\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/MajT-882.mp3\tJimmie Lunceford And His Orchestra\tShut-out (close Out)\tMajestic\t1077\tT-882\t1946\t\nhttp://www.78-tours.net/mp3/PATN202552.mp3\tConcert Acc. Du Jeffry's Jazz Max Rog De L'empire\tSi Les Photos Pouvaient Parler, Du Film \" La Vie En Rose \"\tPATH\tX. 3874\tN 202552 Semfa\t\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-484-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tSi Tu Savais\tSWING\t270\tOSW-484-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_116.mp3\tAmerican Quartet\tSiam\tVictor\t17993\t17288-2\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2282x.mp3\tDesi Arnaz And His Orch.\tSiboney\tRCA\t20-2282\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3735.mp3\tBing Crosby - Xavier Cugat\tSiboney\tDECCA\t23547\tL3735\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2334x.mp3\tKay Starr\tSide By Side\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKECO32310-1.mp3\tGene Krupa & His Orch\tSide By Side\tOKEH\t6721\tCO32310-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU22107-8.mp3\tNick Lucas (crooning Troubadr)\tSide By Side\tBRUNSWICK\t3512\t22107-8\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC38780-3.mp3\tAileen Stanley W J. Marvin\tSide By Side\tVICTOR\t20714\t38780-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_0316_04.mp3\tLee Morse And Her Bluegrass Boys\tSide By Side\tColumbia\t974DB\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_023.mp3\tKay Starr\tSide By Side\tCapitol\t1688\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_023.mp3\tNick Lucas\tSide By Side\tCapitol\t15242\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh158.mp3\tSavoy Havana Band\tSide By Side\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh784A.mp3\tEd Smalle With His Piano\tSide By Side\tColumbia\t4463B\tA 5822\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_143.mp3\tCliff Edwards\tSide By Side\tPerfect\t11640\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC38378-4.mp3\tPaul Whiteman And His Orch\tSide By Side (rn)\tVICTOR\t20627A\t38378-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64249.mp3\tMills Brothers\tSide Kick Joe\tDECCA\t2599B\t64249\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36283-3.mp3\tJelly Roll Morton's Peppers\tSidewalk Blues\tVICTOR\t20252\t36283-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480897.mp3\tTed Heath And His Music\tSidewalks Of Cuba\tDECCA\tF9594\tDR-14618\t1950\tBobby Pratt, Stan Roderick, Stan Reynolds, Ronnie Hughes (tp) Jackie Armstrong, Maurice Pratt, Jack Bentley, Jimmy Coombes (tb) Les Gilbert, Reg Owen (as) Tommy Whittle, Henry Mackenzie (ts) Dave Shand (bar) Frank Horrox (p) Sammy Stokes (b) Jack Parnell (d) Ted Heath (dir) \nhttp://www.jazz-on-line.com/a/mp3b/MERC656-3.mp3\tJohnny Hodges & His Orch\tSideways\tMERCURY\t8961\tC656-3\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046835.mp3\tSidney Bechet New Orleans F.w.\tSidney's Blues\tBLUEBIRD\t8509\t046835\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27028-1.mp3\tGene Krupa & His Orch\tSierra Sue\tCOLUMBIA\t35454\t27028-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1970.mp3\tBing Crosby\tSierra Sue\tDECCA\t3133A\tDLA1970\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_007.mp3\tBing Crosby\tSierra Sue\tDECCA\t3133A\tDLA1970\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047098.mp3\tGlenn Miller & His Orch\tSierra Sue (vre)\tBLUEBIRD\t10638 A\t047098\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75739.mp3\tSy Oliver & His Orch.\tSiesta At The Fiesta\tDECCA\t24936\t75739\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA-2450-A.mp3\tJimmie Lunceford And His Orchestra\tSiesta At The Fiesta\tDecca\t3931\tDLA-2450-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5299.mp3\tIvory Joe Hunter\tSiesta With Sonny\tKING\t4220\tK5299\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/PatCPT-3837-1.mp3\tRay Ventura Et Ses Collgiens (with Django Reinhardt)\tSifflez En Travaillant (whistle While You Work)\tPath\t1476\tCPT-3837-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS29251.mp3\tEddie South & Ginny Simms\tSighs And Tears (v Sims)\tCBS\toK6087\t29251\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN658x.mp3\tCowboy Copas\tSigned, Sealed And Delivered\tKING\t658\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4750.mp3\tBig Three Trio\tSignifying Monkey\tCOLUMBIA\t37358\tCCO4750\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/Con3005.mp3\tSarah Vaughan With Dizzy Gillespie And His Orchestra\tSigning Off\tContinental\t6024\t3005\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/KinK-5982.mp3\tLucky Millinder And His Orchestra\tSilent George\tKing\t4418\tK-5982\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4375.mp3\tBing Crosby - Ken Darby Sing.\tSilent Night\tDECCA\t15074\tL4375\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_072.mp3\tElsie Baker\tSilent Night, Hallowed Night\tVICTOR\t17164\t11791-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_012.mp3\tHaydn Quartet\tSilent Night, Hallowed Night\tVictor\t4511\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA261-A.mp3\tBing Crosby W Georgie Stoll\tSilent Night, Holy Night\tDECCA\t621A\tDLA261-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/WhiDLA97-A.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tSilent Night, Holy Night\tWhite Label\t\tDLA97-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22082.mp3\tGlenn Miller & His Orchestra\tSilhouetted In Moonlight\tCBS\tBR8034\t22082\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC015576.mp3\tBenny Goodman Trio\tSilhouetted In The Moonlight\tVICTOR\t25711\t015576\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CON27802-1.mp3\tCab Calloway & His Orch\tSilly Old Moon\tCONQUEROR\t9641\t27802-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S3129.mp3\tBob Wills And His Texas Playboys\tSilver Bell\tMGM\t11082\t51S3129\t1951\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic16646.mp3\tPeerless Quartet\tSilver Bell\tVictor\t16646\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_118.mp3\tThat Girl Quartet\tSilver Bell\tVictor\t16695\tB9582-1\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_011.mp3\tPeerless Quartet\tSilver Bell\tVictor\t16646\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1255x.mp3\tMargaret Whiting And J.wakely\tSilver Bells\tCAPITOL\t1255\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLH1367.mp3\tBob Wills Texas Playboys\tSilver Dew On The Blue Grass Tonight\tCOLUMBIA\t20002\tH1367\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68070.mp3\tDelmore Brothers\tSilver Dollar\tDECCA\t5878\t68070\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR426-Hy.mp3\tRoyal Troubadours\tSilver Moon\tHarmony\t426-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38104-3.mp3\tPaul Whiteman & His Orch\tSilver Moon (w)\tVICTOR\t20505B\t38104-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1314-A.mp3\tBing Crosby & Trotter's Orch\tSilver On The Sage\tDECCA\t2001A\tDLA1314-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_369.mp3\tWill Osborne And His Orchestra\tSilver On The Sage\tDECCA\t1951B\t64256\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW143276.mp3\tLeo Reisman & His Orch\tSilver Song Bird\tCOLUMBIA\t926 D\tW143276\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4542.mp3\tBing Crosby And Ken Darby Choir\tSilver Threads Among The Gold\tDECCA\t24279\tL4542\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_005.mp3\tRichard Jose\tSilver Threads Among The Gold\tVICTROLA\t7758\t2556\t1904\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_065.mp3\tJohn Mccormack\tSilver Threads Among The Gold\tVICTOR\t64260\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_040.mp3\tWill Oakland\tSilver Threads Among The Gold\tVictor\t5691\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO40432.mp3\tGene Krupa & His Orch\tSimilan (vbill Blakc)\tCOLUMBIA\t38415\tCO40432\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC027913.mp3\tBunny Berigan & His Orch\tSimple And Sweet\tVICTOR\t26086A\t027913\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_211.mp3\tConnee Boswell\tSimple And Sweet\tDECCA\t2028A\t64600\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC17588-1.mp3\tEdna Brown And Billy Murray\tSimple Melody\tVICTOR\t18051\t17588-1\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_046.mp3\tBilly Murray And Elsie Baker\tSimple Melody\tVICTOR\t18051\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-4280x.mp3\tSarah Churchill\tSin\tRCA\t20-4280\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC81483.mp3\tColeman Hawkins & His Orch\tSin\tDECCA\t27853\t81483\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_031.mp3\tFour Aces\tSin\tVictoria\t101\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80363.mp3\tLouis Armstrong & His Orch\tSince I Fell For You\tDECCA\t28098\t80363\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_213.mp3\tPaul Gayten And His Trio\tSince I Fell For You\tDeLuxe\t1082\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_086.mp3\tIvory Joe Hunter\tSince I Met You Baby\tAtlantic\t1111\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145632-3.mp3\tJan Garber & His Orch\tSince My Best Gal Turned Me Down\tCOLUMBIA\t1306 D\tW145632-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe81572-B.mp3\tBix Beiderbecke & His Gang\tSince My Best Girl Turned Me Down\tOKeh\t41001\t81572-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA90-A.mp3\tMills Brothers\tSince We Fell Out Of Love\tDECCA\t1495\tDLA90-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC39381-A.mp3\tNew Orleans Rhythm Kings\tSince We Fell Out Of Love\tDECCA\t388B\t39381-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh076.mp3\tTeddy Joyce And His Orchestra\tSince We Fell Out Of Love\tHMV\tBD-139\tOEA-1432-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1115-A.mp3\tCab Calloway And His Orchestra\tSincere Love\tVocalion\t5364\tWM-1115-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CHE1052.mp3\tMoonglows\tSincerely\tCHESS\tCHES1581\t1052\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_157.mp3\tMoonglows\tSincerely\tChess\t1581\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_002.mp3\tMcguire Sisters\tSincerely\tCoral\t61323\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140162-5.mp3\tBessie Smith\tSinful Blues\tCOLUMBIA\t14052 D\t140162-5\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU12380A.mp3\tDorsey Brothers Orch\tSing (it's Good For You)\tBRUNSWICK\t6409\t12380A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN9625-2-3.mp3\tSam Lanin's Dance Orchestra\tSing A Little Theme Song (vsl)\tBANNER\t683\t9625-2-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC71931-1.mp3\tCoon-sanders Orchestra\tSing A New Song\tVICTOR\t22951\t71931-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1721.mp3\tBing Crosby - J.s.trotter\tSing A Song Of Sunbeams\tDECCA\t2359B\tDLA1721\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_166.mp3\tAndrews Sisters\tSing A Tropical Song\tDECCA\t18581\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99035-1.mp3\tFats Waller And His Rhythm\tSing An Old Fashioned Song\tVICTOR\t25253\t99035-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62350.mp3\tBob Howard & His Orch\tSing And Be Happy\tDECCA\t1357\t62350\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUV0546.mp3\tCharlie Barnet & His Orchestra\tSing Baby Sing\tBLUEBIRD\t6593\tV0546\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC028942.mp3\tBenny Goodman And His Orchestra\tSing For Your Supper\tVICTOR\t26099\t028942\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64852-A.mp3\tCount Basie And His Orchestra\tSing For Your Supper\tDECCA\t2249B\t64852-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-409-1.mp3\tDjango Reinhardt And His American Swing Band\tSing Guitars\tSWING\t208\tOSW-409-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC73353-2.mp3\tHoagy Carmichael And His Orch\tSing It Way Down Low\tVICTOR\t24182\t73353-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16150-E.mp3\tLouis Prima & His Gang\tSing It Way Low Down (vlp)\tBRUNSWICK\t7394\t16150-E\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20724-B.mp3\tWaring's Pennsylvanians\tSing Me A Baby Song\tVICTOR\t20724B\t38270-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1938_0302_04.mp3\tLee Morse And Her Bluegrass Boys\tSing Me A Song Of Texas\tDecca\t1737B\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61124.mp3\tChick Webb & His Orchestra\tSing Me A Swing Song\tDECCA\t3319A\t61124\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_259.mp3\tElla Fitzgerald O Chick Webb\tSing Me A Swing Song (and Let Me Dance)\tDecca\t830\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU101257.mp3\tBenny Goodman And His Orchestra\tSing Me A Swing Song (vhw)\tBLUEBIRD\t10462\t101257\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC88573.mp3\tAlma Gluck And Efrem Zimbalist\tSing Me To Sleep\tVICTOR\t88573\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_078.mp3\tAlma Gluck\tSing Me To Sleep\tVICTOR\t88573\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140170-4.mp3\tBessie Smith\tSing Sing Prison Blues\tCOLUMBIA\t14051 D\t140170-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09571-2.mp3\tBenny Goodman And His Orchestra\tSing Sing Sing\tVICTOR\t25796\t09571-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09572-2.mp3\tBenny Goodman And His Orchestra\tSing Sing Sing\tVICTOR\t25796\t09572-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL6636.mp3\tAndrew Sisters\tSing Sing Sing\tDECCA\t28480\tL6636\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100883-1.mp3\tFletcher Henderson & His Orch\tSing Sing Sing\tVICTOR\t25375\t100883-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/COLZSP5573-4-5.mp3\tBenny Goodman\tSing Sing Sing\tCOLUMBIA\t39306-304\tZSP5573-4-5\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25375.mp3\tFletcher Henderson & His Orchestra\tSing Sing Sing\tVictor\t25375\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480731.mp3\tBenny Goodman And His Orchestra\tSing Sing Sing\tColumbia\tSL 160\t\t1938\tCarnegie Hall Concert:<br>Harry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Hymie Schertzer, George Koenig (as), Arthur Rollini, Babe Russin (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3b/VIC041598.mp3\tMaxine Sullivan\tSing Something Simple\tVICTOR\t26372\t041598\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67197.mp3\tElla Fitzgerald & Her Orch\tSing Song Swing\tDECCA\t3026B\t67197\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_288.mp3\tElla Fitzgerald\tSing Song Swing\tDECCA\t3026B\t67197\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC58571-1.mp3\tLeonard Joy's Hi Hatters\tSing You Sinners\tVICTOR\t22322\t58571-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_0327_02.mp3\tLee Morse And Her Bluegrass Boys\tSing You Sinners (from 'honey')\tColumbia\t2165DB\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COL150060-3.mp3\tLloyd Keating's Music (albin)\tSing You Sinners (vps)\tCOLUMBIA\tHA1118\t150060-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21941-1.mp3\tFletcher Henderson And His Orchestra\tSing Your Sinners\tVocalion\t4125\t21941-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1161.mp3\tTeddy Wilson & His Orch\tSing, Baby Sing\tBRUNSWICK\t7736\tLA1161\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruLA-1161-A.mp3\tTeddy Wilson And His Orchestra\tSing, Baby Sing\tBrunswick\t7736  \tLA-1161-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61257.mp3\tBob Howard & His Orch\tSing, Baby, Sing\tDECCA\t917A\t61257\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_086.mp3\tCharlie Barnet And His Orchestra\tSing, Baby, Sing\tBLUEBIRD\t6593\tV0546\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25796.mp3\tBenny Goodman & His Orchestra\tSing, Sing, Sing\tVictor\t25796\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic100883-1.mp3\tFletcher Henderson And His Orchestra\tSing, Sing, Sing\tVictor\t25375\t100883-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_119.mp3\tBenny Goodman And His Orchestra\tSing, Sing, Sing (intro. Christopher Columbus)\tVictor\t25796\t09571-2, 09572-2\t1938\tHarry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Murray McEachern (tb), Benny Goodman (cl, ldr), Hymie Schertzer, George Koenig (as), Arthur Rollini, Vido Musso (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1930_180.mp3\tSmith Ballew And His Orchestra\tSing, You Sinners\tOKeh\t41384\t403772-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-6949-1.mp3\tValaida (queen Of The Trumpet) With Billy Mason And His Orchestra\tSing, You Sinners\tParlophone\tF-230\tCE-6949-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480664.mp3\tFletcher Henderson & His Orch.\tSing, You Sinners\tVocalion\t4125\t21941-1\t1937\tRussell Smith, Emmett Berry, Dick Vance (tp), Albert Wynn, John McConnell, Ed Cuffee (tb), Jerry Blake (cl, as), Hilton Jefferson (as), Elmer Williams, Ben Webster (ts), Fletcher Henderson (p), Lawrence Lucie (g), Israel Crosby (sb), Pete Suggs (dm)\nhttp://www.jazz-on-line.com/a/mp3c/COLW145529.mp3\tCalifornia Ramblers\tSingapore Sorrows\tCOLUMBIA\t1314 D\tW145529\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_143.mp3\tCalifornia Ramblers\tSingapore Sorrows\tCOLUMBIA\t1314 D\tW145529\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh045.mp3\tFred Elizalde And His Music\tSingapore Sorrows\tParlophone\tR-1201\tE-2403-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_090.mp3\tGus Arnheim And His Orchestra\tSingin In The Rain\tVICTOR\t22012-A\t50874-5\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic046026-1.mp3\tLionel Hampton And His Orchestra\tSingin The Blues (till My Dadd)\tVictor\t26557\t046026-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE31271.mp3\tDick Robertson W Orch\tSingin' In The Bathtub\tBRUNSWICK\t4592\tE31271\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC57155-2.mp3\tHigh Hatters\tSingin' In The Bathtub\tVICTOR\t22219B\t57155-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE495.mp3\tEarl Burtnett And His Orch\tSingin' In The Rain\tBRUNSWICK\t4375\tLAE495\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148563.mp3\tCliff Edwards 'ukelele Ike'\tSingin' In The Rain\tCOLUMBIA\t1869 D\tW148563\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22012-A.mp3\tGus Arnheim And His Orch\tSingin' In The Rain\tVICTOR\t22012-A\t50874-5\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148502.mp3\tFred Rich & His Orch\tSingin' In The Rain\tCOLUMBIA\t1838 D\tW148502\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D352A2.mp3\tGuy Lombardo And His Orchestra\tSingin' In The Rain\tV-DISC\t352A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_040.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra Feat. Paul Gibbons\tSingin' In The Rain\tBRUNSWICK\t4375\tLAE495\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-6953-1.mp3\tValaida (queen Of The Trumpet) With Billy Mason And His Orchestra\tSingin' In The Rain\tParlophone\tF-165\tCE-6953-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_007.mp3\tCliff Edwards\tSingin' In The Rain\tCOLUMBIA\t1869 D\tW148563\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe80393-B.mp3\tFrankie Trumbauer And His Orch\tSingin' The Blues\tOKeh\t40772\t80393-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC046026-1.mp3\tLionel Hampton & His Orch\tSingin' The Blues\tVICTOR\t26557\t046026-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COM4698.mp3\tEddie Condon & His Band\tSingin' The Blues\tCOMMODORE\t568\t4698\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC24657-6.mp3\tAileen Stanley\tSingin' The Blues\tVICTOR\t18703\t24657-6\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_147.mp3\tAileen Stanley\tSingin' The Blues\tVICTOR\t18703\t24657-6\t1921\t\nhttp://www.jazz-on-line.com/a/mp3d/Col151845-1.mp3\tFletcher Henderson And His Orchestra\tSingin' The Blues\tColumbia\t2565-D\t151845-1  \t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/MelE-36457-A.mp3\tConnie's Inn Orchestra\tSingin' The Blues\tMelotone\tM-12145\tE-36457-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic53069-1.mp3\tConnie's Inn Orchestra\tSingin' The Blues (take 1)\tVictor\t22721\t53069-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COL16887.mp3\tBenny Goodman And His Orchestra\tSinging A Happy Song\tCOLUMBIA\t3018 D\t16887\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_263.mp3\tBenny Goodman And His Orchestra Feat. O/helen Ward\tSinging A Happy Song\tCOLUMBIA\t3018 D\t16887\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1080.mp3\tHit Of The Week Orch (hirsch)\tSinging A Song To The Stars (vdr)\tHIT OF THE WEEK\t1080\t1080-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULAE671.mp3\tHarry Richman W Earl Burtnett\tSinging A Vagabond Song\tBRUNSWICK\t4678\tLAE671\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_079.mp3\tHarry Richman\tSinging A Vagabond Song\tDECCA\t24389\tL4536\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU011892.mp3\tDelmore Brothers\tSinging My Troubles Away\tBLUEBIRD\t7129\t011892\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic62344-2.mp3\tHerny ''red'' Allen And His New York Orchestra\tSinging Pretty Songs\tVictor\t23338\t62344-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC19486-1.mp3\tFrankie Trumbauer And His Orch\tSinging The Blues\tARC\tBR7703\t19486-1\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_003.mp3\tGuy Mitchell\tSinging The Blues\tColumbia\t40769\tCO56636\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1247.mp3\tFrankie Laine W Carl Fisher\tSinging The Blues\tMERCURY\t5174\t1247\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_125.mp3\tMarty Robbins\tSinging The Blues\tColumbia\t21545\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COL17478-2.mp3\tCarter Family\tSinking In The Lonesome Sea\tCOLUMBIA\t20333\t17478-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_444.mp3\tLes Baxter, His Chorus And Orchestra\tSinner Man\tCapitol\t3404\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO48128.mp3\tSarah Vaughan\tSinner Or Saint\tCOLUMBIA\t39873\tCO48128\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_198.mp3\tSarah Vaughan\tSinner Or Saint\tCOLUMBIA\t39873\tCO48128\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23508x.mp3\tBing Crosby And Jesters\tSioux City Sue\tDECCA\t23508\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_226.mp3\tDick Thomas\tSioux City Sue\tNATIONAL\t\tNSC44\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18745x.mp3\tHoosier Hot Shots\tSioux City Sue (vsally Foster-two Ton Baker)\tDECCA\t18745\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35206-B.mp3\tVictor Concert Orch\tSiren Waltzes (leo Fall)\tVictor\t35206-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29925-1.mp3\tGene Krupa & His Orch\tSirens Serenade\tOKEH\t6198\t29925-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC48888-3.mp3\tEarl Hines & His Orch\tSister Kate\tVICTOR\t22683\t48888-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP218-2A-1.mp3\tWingy Manone's Dixieland Band\tSister Kate\tCAPITOL\t10024\t218-2A-1\t\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic48888-3.mp3\tEarl Hines And His Orchestra\tSister Kate\tVictor\t22683\t48888-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_075.mp3\tBilly Murray\tSister Susie's Sewing Shirts For Soldiers\tVICTOR\t17659\t15279-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_342.mp3\tRosemary And Betty Clooney\tSisters\tCOLUMBIA\t40305\tRHCO10956\t1954\t\nhttp://www.jazz-on-line.com/a/mp3d/MajT-719.mp3\tJimmie Lunceford And His Orchestra\tSit Back Ree-lax\tMajestic\t1053\tT-719\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76789.mp3\tLouis Armstrong - Sy Oliver\tSit Down, You're Rocking The Boat\tDECCA\t27254\t76789\t1950\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR141840-2.mp3\tUniversity Six\tSittin' Around\tHARMONY\t160-H\t141840-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18293-4.mp3\tSix Jumping Jacks\tSittin' Around\tBRUNSWICK\t3131\t18293-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC34063-8.mp3\tCoon Sanders Nighthawk Orch\tSittin' Around\tVICTOR\t20015\t34063-8\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64698.mp3\tAndy Kirk & Clouds Of Joy\tSittin' Around An Dreamin'\tDECCA\t2261B\t64698\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64698-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tSittin' Around And Dreamin'\tDecca\t2261\t64698-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19161s.mp3\tPaul Whiteman & His Orchestra\tSittin' In A Corner\tVictor\t19161\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10512.mp3\tFrankie Laine W P.weston Orch\tSittin' In The Sun\tCOLUMBIA\t40036\tRHCO10512\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC77647-1.mp3\tPaul Whiteman & His Orch\tSittin' On A Backyard Fence (vrhythm Boys)\tVICTOR\t24403\t77647-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150579.mp3\tPaul Whiteman & His Orch\tSittin' On A Rainbow\tCOLUMBIA\t2224 D\tW150579\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC70984.mp3\tJulia Garrity And Her Orchestra\tSittin' On A Rubbish Can\tVICTOR\t22896\t70984\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM49S413.mp3\tBilly Eckstine\tSitting By The Window\tMGM\t10602\t49S413\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_222.mp3\tRay Anthony Feat. Ronnie Deauville And The Skyliners\tSitting By The Window\tCapitol\t794\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_320.mp3\tVic Damone Feat. Glenn Osser's Orchestra\tSitting By The Window\tMERCURY\t5343\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_245.mp3\tBilly Eckstine Feat. Russell Case's Orchestra\tSitting By The Window\tMGM\t10602\t49S413\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/COM23699.mp3\tChu Berry And His 'little Jazz' Ensemble Chu Berry, Tenor Sax-'little Jazz,' Trumpet Clyde Hart, Pia\tSitting In\tCOMMODORE\t516B\tP23699\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh782B.mp3\tJay Wilbur And His Band\tSittin Up Waiting For You (v Maurice Elwin)\tRex\t8152\tF-743-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Col265092-2.mp3\tBenny Carter And His Orchestra\tSix Bells Stampede \tColumbia \tGB-628 \t265092-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27324-A.mp3\tGene Krupa & His Orch\tSix Lessons From Madame La Zonga\tCOLUMBIA\t35508\t27324-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_091.mp3\tCharlie Barnet And His Orchestra Feat. V/mary Ann Mccall\tSix Lessons From Madame La Zonga\tBluebird\t10743A\t50622\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu50622.mp3\tCharlie Barnet & His Orch\tSix Lessons From Madame Lazonga\tBluebird\t10743A\t50622\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67508.mp3\tJimmy Dorsey And His Orch.\tSix Lessons From Madame Zonga\tDECCA\t3152B\t67508\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_162.mp3\tCab Calloway And His Orchestra\tSix Or Seven Times\tBrunswick\t6141\tE-36804-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke402966-D.mp3\tThe Little Chocolate Dandies With Benny Carter\tSix Or Seven Times \tOkeh \t8728 \t402966-D \t1929 \tRex Stewart, Leonard Davls tp, J.C. Higginbottamn tb,, Don Redman, Benny Carter as, Coleman Hawkins ts, Fats Waller p, Cyrus St Clair tu, George Stafford d, Don Redman, Benny Carter vcl\nhttp://www.jazz-on-line.com/a/mp3c/BANE36804-A.mp3\tCab Calloway & His Orch\tSix Or Seven Times (vcc)\tBANNER\t32766\tE36804-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK9057.mp3\tErroll Garner\tSix P. M\tKING\t4479\tK9057\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_133.mp3\tJohnny Desmond\tSixteen Tons\tCoral\t61529\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_004.mp3\tTennessee Ernie Ford\tSixteen Tons\tCapitol\t3262 A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC066118.mp3\tAlbert Ammons & Pete Johnson\tSixth Avenue Express\tVICTOR\t27506\t066118\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67331-A.mp3\tLil Armstrong And Her Dixielanders\tSixth Street\tDecca\t7739\t67331-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_138.mp3\tDominoes\tSixty Minute Man\tFederal\t12022\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64324.mp3\tMills Brothers\tSixty Seconds Got Together\tDECCA\t1964A\t64324\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_210.mp3\tDon Cornell Feat. Jerry Carr's Orchestra\tSize 12\tCoral\t62125\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW255004-1.mp3\tFrankie Trumbauer & H.o.\tSizzlin' One Step Medley (vjm)\tCOLUMBIA\t18002D\tW255004-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC39823-2.mp3\tRoss Deluxe Syncopators\tSkad-o-lee\tVICTOR\t20961\t39823-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64927.mp3\tBob Crosby & His Orch\tSkater's Waltz\tDECCA\t2282A\t64927\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044594-2.mp3\tHarlan Leonard & His Rockets\tSkee\tBLUEBIRD\t10919\t044594-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COM622x.mp3\tBobby Hackett & His Orch\tSkeleton Jangle\tCOMMODORE\t622\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_372.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tSkies Are Blue\tDECCA\t1349\t61599\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61599-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tSkies Are Blue\tDecca\t1349\t61599-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/VOCC2217.mp3\tLouisiana Rhythm Kings\tSkinner's Sock\tVOCALION\t15729\tC2217\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_194.mp3\tTeresa Brewer Feat. O/jack Pleis\tSkinnie Minnie (fish Tail)\tCORAL\t61197\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/PARL0261.mp3\tGeechie Wiley\tSkinny Leg Blues\tPARAMOUNT\t12951B\tL0261\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM-393-3.mp3\tBenny Carter And His Orchestra\tSkip It\tDECCA\tF-42136\tAM-393-3\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe400961-A.mp3\tLouis Armstrong's Hot Five\tSkip The Gutter\tOKeh\t8631\t400961-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/MERC277-1.mp3\tColeman Hawkins & Allstars\tSkippy Whipy\tMERCURY\t8912\tC277-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_182.mp3\tEddy Howard And His Orchestra\tSkirts\tMercury\t70225\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO51831.mp3\tFour Lads\tSkokiaan\tCOLUMBIA\t40306\tCO51831\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_122.mp3\tRay Anthony\tSkokiaan\tCapitol\t2896\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_117.mp3\tBulawayo Sweet Rhythms Band\tSkokiaan\tLondon\t1491\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_046.mp3\tFour Lads Feat. Neal Hefti And His Orchestra\tSkokiaan\tCOLUMBIA\t40306\tCO51831\t1954\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480898.mp3\tPerez Prado And His Orchestra\tSkokiaan\tRCA VICTOR\t\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_319.mp3\tLouis Armstrong Feat. D/barney Bigard\tSkokiaan (south African Song)\tDECCA\t29256\t86652\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC86652.mp3\tLouis Armstrong With\tSkokiaan, Pt.1\tDECCA\t29256\t86652\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70432x.mp3\tRalph Marterie And His Orch\tSkokian\tMERCURY\t70432\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-788-1.mp3\tCab Calloway And His Orchestra\tSkrontch\tVocalion\t4045\tM-788-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022432.mp3\tFats Waller And His Rhythm\tSkrontch (vfw)\tVICTOR\t25834\t022432\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU022927-1.mp3\tOran Hot Lips Page And His Band\tSkull Duggery\tBLUEBIRD\t7583\t022927-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Cor75638.mp3\tLionel Hampton And His Orchestra\tSky Blue\tCoral\t622421\t75638\t1949\tWalter Williams-Benny Bailey-Ed Mullens-Duke Garrette-Leo Shepherd-t, AI Grey-Benny Powell-Jimmy Wormick-Paul Lee Higaki-tb, Bobby Plater-Jerome Richardson-as, Curtis Lowe-Johnny Board-Billy ''Smallwood'' Williams-ts, Lonnie Shaw-bar, Lionel Hampton-vi\nhttp://www.jazz-on-line.com/a/mp3a/BRU03601-A.mp3\tCharlie Barnet And His Orch\tSky Liner\tBrunswick\t03601-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068789.mp3\tGlenn Miller And His Orch\tSkylark\tBLUEBIRD\t11462\t068789\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO32347-1.mp3\tHarry James And His Orch\tSkylark\tCOLUMBIA\t36533\tCO32347-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2843.mp3\tBing Crosby - J.s.trotter\tSkylark\tDECCA\t4193A\tDLA2843\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071797.mp3\tDinah Shore\tSkylark\tBLUEBIRD\t11473\t071797\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31800-1.mp3\tGene Krupa & His Orch\tSkylark\tOKEH\t6607\t31800-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL245.mp3\tErroll Garner Trio\tSkylark\tATLANTIC\t666\t245\t1949\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11512.mp3\tEarl Hines & His Orchestra\tSkylark\tBluebird\t11512\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_148.mp3\tDinah Shore\tSkylark\tBLUEBIRD\t11473\t071797\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/BLU073460-1.mp3\tEarl Hines And His Orchestra\tSkylark\tBLUEBIRD\tB-11512\t073460-1\t1942\tvocal Billy Eckstine\nhttp://www.jazz-on-line.com/a/mp3d/Blu073460-1.mp3\tEarl Hines And His Orchestra\tSkylark\tBluebird\t11512\t073460-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481110.mp3\tGene Krupa Orch. Feat. Anita O'day\tSkylark\tOkeh\t6607\t31800-1\t1941\tRoy Eldridge, Norman Murphy, Al Beck, Graham Young (tp), John Grassi, Jay Kelliher, Babe Wagner (tb), Mascagni ''Musky'' Ruffo (as), Sam Musiker (cl,as), Jimmy Migliori (as), Walter Bates (ts), Sam Listengart (as), Milt Raskin (p) Ray Biondi (g), Ed Mihelich (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3b/VARW137.mp3\tBunny Berigan & His Orch\tSkylark (v D R)\tVARSITY\tEL5020\tW137\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU073460.mp3\tEarl Hines And His Orch\tSkylark (vbilly Eckstine)\tBLUEBIRD\t11512\t073460\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3487.mp3\tCharlie Barnet And His Orch\tSkyliner\tDECCA\t18659A\tL3487\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_252.mp3\tCharlie Barnet And His Orchestra\tSkyliner\tMERCURY\t8979\tC748\t1945\t\nhttp://www.jazz-on-line.com/mp3/156302213.mp3\tKenny Graham Afro-cubists\tSkylon\tABBOTT\t148\t\t\t\nhttp://www.78-tours.net/mp3/SIG28106-A.mp3\t\"flip\" Phillips Fliptet Neil Hefti, Trumpet, Aaron Sachs, Clarinet, Bill Harris, Trombone, Joe Phill\tSkyscrapper\tSIGNATURE\t28106\tS-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COMT6SSB.mp3\tRed Norvo & His Selected Sextet\tSlam Slam Blues\tCOMET\tT6\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CONW3331.mp3\tSlam Stewart Qt\tSlammin' The Gate\tCONTIN\t10000\tW3331\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38473.mp3\tArthur Godfrey\tSlap 'er Down Again Paw\tCOLUMBIA\t38066\tCO38473\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_054.mp3\tArthur Godfrey\tSlap 'er Down Again, Paw\tCOLUMBIA\t38066\tCO38473\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5936.mp3\tEsmereldy And Her Novelty Band\tSlap Her Down Again, Paw\tMUSICRAFT\t524\t5936\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1277-B.mp3\tFred Astaire\tSlap That Bass\tBRUNSWICK\t7856\tLA1277-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/Cha17164-B.mp3\tBud Ritchie And His Boys\tSlappin' The Bass\tChampion\t16109\t17164-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59913-3.mp3\tTed Weems & His Orchestra\tSlapping The Bass\tVICTOR\t22411\t59913-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_184.mp3\tRay Anthony\tSlaughter On 10th Avenue\tCapitol\t2085\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP9969-9970.mp3\tRay Anthony And His Orchestra\tSlaughter On 10th Avenue\tCAPITOL\t7-2085\t9969-9970\t1952\t\nhttp://www.jazz-on-line.com/a/mp3o/CAP9969-9970.mp3\tRay Anthony & His Orchestra\tSlaughter On 10th Avenue\tCAPITOL\t7-2085\t9969-9970\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S3008.mp3\tLennie Hayton\tSlaughter On Tenth Avenue\tMGM\t30174\t49S3008\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC90168.mp3\tPeetie Wheatstraw\tSlave Man Blues\tDECCA\t7111\t90168\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC54831-2.mp3\tJack Smith\tSlave To Love\tVICTOR\t22452\t54831-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D330A2.mp3\tBenny Carter And His Orchestra\tSleep\tV-DISC\t330A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC02170-1.mp3\tTommy Dorsey & His Orch\tSleep\tVICTOR\t25573B\t02170-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_339.mp3\tBenny Carter And His Orchestra\tSleep\tV-DISC\t330A2\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480757.mp3\tBig Sidney Catlett Quartet\tSleep\tCommodore\tXFL14938\tA-4738-1\t1944\tBen Webster (ts) Marlowe Morris (p) John Simmons (b) Sidney Catlett (d)\nhttp://www.jazz-on-line.com/a/mp3a/VIC28663-9.mp3\tWaring's Pennsylvanians\tSleep (wz)\tVICTOR\t19172\t28663-9\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU39768.mp3\tJimmie Rodgers\tSleep Baby Sleep\tBLUEBIRD\t6225\t39768\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/PER11935-1.mp3\tSmith Ballew & His Orch\tSleep Come On And Take Me (vsb)\tPERFECT\t15626\t11935-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC072232.mp3\tGlenn Miller & His Orch\tSleep Song\tVICTOR\t27879\t072232\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCro3345A.mp3\tRuss Carlson & His Orchestra\tSleep, Come On And Take Me\tCrown\t3345A\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1761-3.mp3\tRuss Carlson & His Orch\tSleep, Come On And Take Me (v D R)\tCROWN\t3345A\tC1761-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D128B1.mp3\tBing Crosby And The Charioteers\tSleep, Kentucky Babe\tV-DISC\t128B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBluB-6277.mp3\tWhistlin' Rufus\tSleepin' By Myself\tBluebird\tB-6277\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh209.mp3\tPeatie Wheatstraw\tSleepless Nights Blues\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3/Joh407.mp3\tPeatie Wheatstraw\tSleepless Nights Blues\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU22014.mp3\tFive Harmaniacs\tSleepy Blues (v Walt Howard)\tBRUNSWICK\t7002\t22014\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU07395HW2-3.mp3\tBoots And His Buddies\tSleepy Gal\tBLUEBIRD\t6968\t07395-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUSF105A.mp3\tMills Brothers\tSleepy Head\tBRUNSWICK\t6913\tSF105A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_035.mp3\tMills Brothers\tSleepy Head\tBRUNSWICK\t6913\tSF105A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO32472-1.mp3\tHarry James And His Orch\tSleepy Lagoon\tCOLUMBIA\t36549\tCO32472-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiUnks.mp3\tTommy Dorsey & His Orchestra\tSleepy Lagoon\tUnknown\t\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC2980.mp3\tBukka White\tSleepy Man Blues\tOKEH\t5743\tWC2980\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5500.mp3\tFrankie Laine\tSleepy Old River\tMERCURY\t5500\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70150-A.mp3\tBon Bon & His Buddies\tSleepy Old Town\tDECCA\t8603\t70150-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_247.mp3\tWoody Herman And His Orchestra\tSleepy Serenade\tDECCA\t3693B\t68804\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_239.mp3\tAndrews Sisters\tSleepy Serenade\tDECCA\t3821\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3000-A.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tSleepy Time Blues\tBrunswick\t7058\tC-3000-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5273.mp3\tSidney Bechet-h.littleton\tSleepy Time Down South\tSAVOY\t745\tS5273\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU21235.mp3\tGlenn Miller And His Orchestra\tSleepy Time Gal\tBRUNSWICK\t7923\t21235\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC34139-2.mp3\tGene Austin\tSleepy Time Gal\tVICTOR\t19899\t34139-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62865.mp3\tCasa Loma Orchestra\tSleepy Time Gal\tDECCA\t15042A\t62865\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4790.mp3\tEdmund Hall\tSleepy Time Gal\tCOMMODORE\t581\t4790\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE17082.mp3\tNick Lucas\tSleepy Time Gal\tBRUNSWICK\t2990\tE17082\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE17062.mp3\tBen Bernie & His Orch\tSleepy Time Gal\tBRUNSWICK\t2992\tE17062\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/CBS6320.mp3\tArthur Fields And H.cross\tSleepy Time Gal\tCBS\tBA1669\t6320\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru7923.mp3\tGlenn Miller And His Orchestra\tSleepy Time Gal\tBrunswick\t7923\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_027.mp3\tNick Lucas\tSleepy Time Gal\tBRUNSWICK\t2990\tE17082\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_031.mp3\tGene Austin\tSleepy Time Gal\tVICTOR\t19899\t34139-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_005.mp3\tBen Bernie And His Orchestra Feat. Arthur Fields\tSleepy Time Gal\tBRUNSWICK\t2992\tE17062\t1926\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478369.mp3\tLes Brown And His Band Of Renown\tSleepy Time Gal\tCAPITOL\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/ColWC-2800-B.mp3\tHarry James And His Orchestra\tSleepy Time Gal\tColumbia\t36713\tWC-2800-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC33611-1.mp3\tArt Landry And His Orch\tSleepy Time Gal (vhb)\tVICTOR\t19843A\t33611-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D201B.mp3\tGlenn Miller And His Orchestra\tSleepy Town Train\tV-DISC\t201B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC50837-1.mp3\tGus Arnheim Coconut Grove Orch\tSleepy Valley\tVICTOR\t21986\t50837-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_019.mp3\tGus Arnheim And His Orchestra Feat. V/buster Bees\tSleepy Valley\tVICTOR\t21986\t50837-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_249.mp3\tBoston Pops Orchestra Feat. Arr Leroy Anderson\tSleigh Ride\tRCA VICTOR\t78-1484\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3462.mp3\tBing Crosby - J.s.trotter Or.\tSleigh Ride In July\tDECCA\t18640\tL3462\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_114.mp3\tDinah Shore\tSleigh Ride In July\tV-DISC\t167B\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_234.mp3\tLes Brown And His Orchestra Feat. Gordon Drake\tSleigh Ride In July\tCOLUMBIA\t36763\tCO33823\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_210.mp3\tTommy Dorsey And His Orchestra Feat. Bonnie Lou Williams\tSleigh Ride In July\tVICTOR\t1622\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC81396.mp3\tSy Oliver & His Orchestra\tSlick Chick On The Try\tDECCA\t28320\t81396\t\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-4008-A.mp3\tLionel Hampton And His Orchestra\tSlide Hamp Slide\tDecca\t18754\tL-4008-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4008.mp3\tLionel Hampton & His Orch\tSlide, Hamp, Slide\tDECCA\t18754 B\tL4008\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_050.mp3\tWilbur Sweatman's Original Jazz Band\tSlide, Kelly, Slide\tCOLUMBIA\tA-2775\t78367-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69438.mp3\tLucky Millinder & His Orch\tSlide, Mr Trombone\tDECCA\t3956A\t69438\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69438-A.mp3\tLucky Millinder And His Orchestra\tSlide, Mr. Trombone\tDecca\t3956\t69438-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/MER2557.mp3\tCootie Williams & His Orch\tSlidin' And Glidin'\tMERCURY\t8143\t2557\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5348.mp3\tJoe Marsala Septet\tSlightly Dizzy\tMUSICRAFT\t344\t5348\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP155.mp3\tFats Waller\tSlightly Less Than Wonderful\tV-DISC\t032B\tVP155\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29915.mp3\tSlim Gaillard\tSlim Slam Boogie\tOKEH\t6135\t29915\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT824.mp3\tSlim Gaillard & His Orch\tSlim's Jam\tMAJESTIC\t9001\tT824\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL40.mp3\tBenny Morton's Trombone Choir\tSliphorn Outing\tKEYNOTE\t1315\tHL40\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO34263-1.mp3\tBenny Goodman Sextet\tSlipped Disc\tCOLUMBIA\t36817\tCO34263-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D344A.mp3\tBenny Goodman Quintet\tSlipped Disc\tV-DISC\t344A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_105.mp3\tEarl Fuller's Novelty Orchestra Feat. Earl Fuller's Jazz Band\tSlippery Hank\tVICTOR\t18321\t20062-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6527.mp3\tDuke Ellington & His Orchestra\tSlippery Horn\tBrunswick\t6527\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/ColB-11865-A.mp3\tDuke Ellington And His Famous Orchestra\tSlippery Horn\tColumbia\t37299\tB-11865-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_214.mp3\tLittle Richard\tSlippin' And Slidin' (peepin' And Hidin')\tSpecialty\t572\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP40224x.mp3\tMargaret Whiting And Jimmy Wakely\tSlippin' Around\tCAPITOL\t40224\t40224x\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC40168-1.mp3\tRed & Miff's Stompers\tSlippin' Around\tVICTOR\t21397\t40168-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_010.mp3\tMargaret Whiting And Jimmy Wakely\tSlippin' Around\tCapitol\t40224\t4672\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_157.mp3\tErnest Tubb\tSlippin' Around\tDECCA\t46173\t74979\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC74813-1.mp3\tAllen Bros\tSlipping Clutch Blues\tVICTOR\t23773\t74813-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC23773s.mp3\tAllen Bros\tSlipping Clutch Blues\tVICTOR\t23773\t74813-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA11098.mp3\tErroll Garner\tSloe Gin Fizz\tDIAL\t760\t11098\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/DIAD1098-A.mp3\tErroll Garner\tSloe Gin Fizz   \tDIAL\t1031\tD1098-A\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM759.mp3\tBuster Bailey Rhythm Busters\tSloe Jam Fizz\tVOCALION\t4089\tM759\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU064493.mp3\tSonny Boy Williamson\tSloppy Drunk Blues\tBLUEBIRD\t8822\t064493\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC5562.mp3\tLucille Bogan\tSloppy Drunk Blues\tBRUNSWICK\t7210\tC5562\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic49769-1.mp3\tDuke Ellington And His Cotton Club Orchestra\tSloppy Joe\tVictor\tV-38065\t49769-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS36128.mp3\tStan Getz Allstars\tSlow\tSAVOY\t967\tS36128\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC044010.mp3\tJimmy Yancey\tSlow And Easy Blues\tVICTOR\t26591\t044010\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146894-2.mp3\tBessie Smith\tSlow And Easy Man\tCOLUMBIA\t14384 D\tW146894-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BruE-28757-A.mp3\tKing Oliver\tSlow And Steady\tBrunswick\t4469\tE-28757-A or B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S41.mp3\tSy Oliver & His Orchestra\tSlow Burn\tMGM\t10004\t47S41\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29977-1.mp3\tGene Krupa & His Orch\tSlow Down\tOKEH\t6154\t29977-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68857.mp3\tJoe Marsala & His Orchestra\tSlow Down\tDECCA\t3715B\t68857\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC93598.mp3\tKing Cole Trio\tSlow Down\tDECCA\t8556A\tC93598\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481111.mp3\tGene Krupa Orch. Feat. Anita O'day\tSlow Down\tOkeh\t6154\t29977-1\t1941\tTorg Halten, Shorty SherockNorman Murphy, Graham Young (tp), Pat Virgademo, Jay Kelliher, Babe Wagner (tb), Clint Neagley, Mascagni ''Musky'' Ruffo (as), Walter Bates (ts), Sam Musiker (cl,ts), Bob Kitsis (p), Ray Biondi (g), Ovid ''Biddy'' Bastien (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480783.mp3\tJay Mcshann & His Orch.\tSlow Down Baby\t\t\t\t1949\tJay McShann (p), Ben Webster (ts)\nhttp://www.jazz-on-line.com/a/mp3a/BLU048491.mp3\tGlenn Miller And His Orchestra\tSlow Freight\tBLUEBIRD\t10740\t048491\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67603.mp3\tMilt Herth Trio\tSlow Freight\tDECCA\t3171B\t67603\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VOCWM-1129-1.mp3\tBenny Carter And His Orchestra\tSlow Freight\tVOCALION\t5399\tWM-1129-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_071.mp3\tGlenn Miller And His Orchestra\tSlow Freight\tBLUEBIRD\t10740\t048491\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC63425.mp3\tBob Crosby's Bobcats\tSlow Mood\tDECCA\t3884 A\t63425\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC42926-3.mp3\tBennie Moten's Kansas City Or.\tSlow Motion\tVICTOR\t38012\t42926-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1837x.mp3\tHelen O'connell\tSlow Poke\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAVI210489.mp3\tPee Wee King Golden Cowboys\tSlow Poke\tRCA\t21-0489\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO47307.mp3\tArthur Godfrey\tSlow Poke\tCOLUMBIA\t39632\tCO47307\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_061.mp3\tHelen O'connell\tSlow Poke\tCapitol\t1837\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_088.mp3\tArthur Godfrey\tSlow Poke\tCOLUMBIA\t39632\tCO47307\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_246.mp3\tTiny Hill And His Orchestra\tSlow Poke\tMERCURY\t5740\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_042.mp3\tRalph Flanagan And His Orchestra\tSlow Poke\tRCA VICTOR\t4373\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR144223-3.mp3\tUniversity Six\tSlow River\tHARMONY\t433-H\t144223-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_127.mp3\tSil Austin\tSlow Walk\tMercury\t70963\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_231.mp3\tHawkshaw Hawkins\tSlow-poke\tKING\t998\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC85547.mp3\tWebb Pierce\tSlowly\tDECCA\t28991\t85547\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_154.mp3\tKay Kyser And His Orchestra\tSlowly\tCOLUMBIA\t36900\tHCO1512\t1946\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC41370-2.mp3\tCoon Sanders Nighthawk Orch\tSluefoot\tVICTOR\t21305A\t41370-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068419.mp3\tGlenn Miller & His Orch\tSlumber Song\tBLUEBIRD\t11386-B\t068419\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC1735.mp3\tRed Norvo And His Orch\tSlummin' On Park Ave\tBRUNSWICK\t7813\tC1735\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1241.mp3\tAlice Faye Orchestra Under Direction Of Cy Feuer\tSlumming On Park Avenue\tBRUNSWICK\t7825\tLA1241\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61553-A.mp3\tJimmie Lunceford And His Orchestra\tSlumming On Park Avenue\tDecca\t1128\t61553-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc20754-1.mp3\tFletcher Henderson And His Orchestra\tSlumming On Park Avenue\tVocallon\t3485\t20754-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_328.mp3\tJimmie Lunceford And His Orchestra\tSlumming On Park Avenue\tDecca\t1128\t61553-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61553-A.mp3\tJimmie Lunceford And His Orchestra\tSlumming On Park Avenue.mp3\tDecca\t1128\t61553-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/COMR-2995-1.mp3\tThe Chocolate Dandies\tSmack\tCOMMODORE\t533\tR-2995-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/ComR-2996-1.mp3\tBenny Carter\tSmack\tCommodore\t1506\tR-2996-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKECO47020.mp3\tDuke Ellington & His Orch\tSmada\tOKEH\t6911\tCO47020\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57304-3.mp3\tBennie Moten's Kansas City Or.\tSmall Black\tVICTOR\t23342\t57304-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA1297-A.mp3\tBing Crosby And Johnny Mercer\tSmall Fry\tDECCA\t1960B\tDLA1297-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VOC4224y.mp3\tMildred Bailey And Her Orch\tSmall Fry\tVocalion\t4224\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/CBS23148.mp3\tAdrian Rollini And His Orchestra\tSmall Fry\tCBS\tVO4212\t23148\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D269A.mp3\tBing Crosby With Tommy Dorsey And His Orchestra\tSmall Fry\tV-DISC\t269A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_163.mp3\tMildred Bailey Feat. Red Norvo (bandleader)\tSmall Fry\tVocalion\t4224\t23179-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93823.mp3\tLouis Jordan & His Tympani 5\tSmall Town Boy\tDECCA\t8627\tC93823\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_188.mp3\tJan Garber And His Orchestra\tSmall Town Girl\tDECCA\t802A\t61086-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64560-A.mp3\tBuddy Jones\tSmall Town Mama #2\tDECCA\t5613B\t64560-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC055236.mp3\tLionel Hampton & His Orch\tSmart Alec\tVICTOR\t27278\t055236\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic055236-1.mp3\tLionel Hampton And His Sextet\tSmart Aleck\tVictor\t27278\t055236-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC010647-1.mp3\tFats Waller And His Rhythm\tSmarty\tVICTOR\t25608\t010647-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA832-A.mp3\tBing Crosby-john Scott Trotter\tSmarty\tDECCA\t1375\tDLA832-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA832-A.mp3\tJohn Scott Trotter And His Orchestra With Bing Crosby\tSmarty (you Know It All) \tDECCA\t11014\tDLA832-A \t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66952.mp3\tWoody Herman & His Orchestra\tSmarty Pants\tDECCA\t2955B\t66952\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_306.mp3\tEddy Duchin And His Orchestra Feat. V/carolyn Horton\tSmarty Pants\tCOLUMBIA\t35255\t26122\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC56710-2.mp3\tFats Waller (piano)\tSmashing Thirds\tVICTOR\t38613\t56710-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic56710-2.mp3\tThomas Waller\tSmashing Thirds\tVictor\tV-38613\t56710-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41294-5.mp3\tPaul Whiteman & His Orch\tSmile\tVICTOR\t21228A\t41294-5\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic21228.mp3\tPaul Whiteman & His Orchestra\tSmile\tVictor\t21228\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_129.mp3\tSunny Gale Feat. Hugo Winterhalter's Orchestra\tSmile\tRCA VICTOR\t5836\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_065.mp3\tNat \"king\" Cole Feat. Nelson Riddle's Orchestra\tSmile\tCapitol\t2897\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_263.mp3\tDavid Whitfield\tSmile\tLondon\t1494\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR141305-3.mp3\tUniversity Six\tSmile A Little Bit\tHARMONY\t71-H\t141305-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW140703.mp3\tPaul Specht's Georgians\tSmile All The While\tCOLUMBIA\t408D\tW140703\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_138.mp3\tSam Ash\tSmile And Show Your Dimple\tCOLUMBIA\t2425\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_082.mp3\tLewis James And Peerless Quartet\tSmile And The World Smiles With You\tVictor\t18545\t22620-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151365.mp3\tBen Selvin & His Orch\tSmile Darn Ya Smile\tCOLUMBIA\t2421\tW151365\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65617.mp3\tThree Peppers\tSmile Up At The Sun\tDECCA\t2751A\t65617\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_165.mp3\tBen Selvin And His Orchestra\tSmile, Darn Ya, Smile\tCOLUMBIA\t2421 D\tW151365\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh166.mp3\tPercival Mackey And His Kit-cat Band\tSmile, Darn Ya, Smile\tRegal\tMR-423\tCAR-818-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_158.mp3\tCrazy Otto\tSmiles\tDecca\t29403\tDGG87223\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21881-1.mp3\tJoseph Smith And His Orch\tSmiles\tVICTOR\t18473\t21881-1\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09633-2.mp3\tBenny Goodman Qt\tSmiles\tVICTOR\t25660\t09633-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D342A2.mp3\tCharlie Barnet And His Orchestra\tSmiles\tV-DISC\t342A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE32479.mp3\tBuddy Clark\tSmiles\tOKEH\t6669\t32479\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77971.mp3\tAl Campbell & Henry Burr\tSmiles\tCOLUMBIA\tA-2616\t77971\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_027.mp3\tHenry Burr And Albert Campbell\tSmiles\tCOLUMBIA\tA-2616\t77971\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_013.mp3\tJoseph C. Smith's Orchestra\tSmiles\tVICTOR\t18473\t21881-1\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_064.mp3\tLambert Murphy\tSmiles\tVICTOR\t45155\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE30540-B.mp3\tRed Nichols & His Orch\tSmiles (v S L)\tBRUNSWICK\t4790\tE30540-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC48625-1.mp3\tCoon Sanders Nighthawks\tSmilin' Skies\tVICTOR\t38083\t48625-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU57784-1.mp3\tJelly Roll Morton Trio\tSmilin' The Blues Away\tBLUEBIRD\t10194\t57784-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon054527.mp3\tArthur Smith Dixie Liners\tSmith's Rag\tMontgomeryWard\t8891\t054527\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC1734-2.mp3\tRed Norvo And His Orch\tSmoke Dreams\tBRUNSWICK\t7815\tC1734-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC03551-2.mp3\tBenny Goodman And His Orchestra\tSmoke Dreams\tVICTOR\t25486\t03551-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_067.mp3\tBenny Goodman And His Orchestra Feat. Helen Ward, V\tSmoke Dreams\tVICTOR\t25486\t03551-2\t1936\tIrving Goodman, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Murray McEachern (tb), Benny Goodman (cl), Hymie Schertzer, Bill DePew (as), Arthur Rollini, Vido Musso (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3c/VIC018113.mp3\tTommy Dorsey & His Orch\tSmoke From A Chimney\tVICTOR\t25763\t018113\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLA3000-B.mp3\tGaylord Carter\tSmoke Gets In Your Eyes\tBlack & White\t3000-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14387-B.mp3\tLeo Reisman And His Orch (vhw)\tSmoke Gets In Your Eyes\tBRUNSWICK\t6715\t14387-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30599-1.mp3\tBenny Goodman And His Orchestra\tSmoke Gets In Your Eyes\tCOLUMBIA\t36284\tCO30599-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC011357.mp3\tTommy Dorsey And His Orch\tSmoke Gets In Your Eyes\tVICTOR\t25657\t011357\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC055198.mp3\tArtie Shaw And His Gramercy Five\tSmoke Gets In Your Eyes\tVICTOR\t27335\t055198-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT1428.mp3\tJohnny Guarnieri\tSmoke Gets In Your Eyes\tMAJESTIC\t1229\tT1428\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO3653.mp3\tTeddy Wilson\tSmoke Gets In Your Eyes\tCOLUMBIA\t36631\tCCO3653\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU14818-A.mp3\tRuth Etting\tSmoke Gets In Your Eyes\tBRUNSWICK\t6769\t14818-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-3467sg.mp3\tCharlie Ventura\tSmoke Gets In Your Eyes\tRCA\t20-3467\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6715.mp3\tLeo Reisman & His Orchestra\tSmoke Gets In Your Eyes\tBrunswick\t6715\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480899.mp3\tAndre Kostelanetz And His Orchestra\tSmoke Gets In Your Eyes\tCOLUMBIA\t4265-M\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC78511-1.mp3\tPaul Whiteman And His Orch\tSmoke Gets In Your Eyes (vbob Lawrence)\tVICTOR\t24455\t78511-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_217.mp3\tRuth Etting\tSmoke Gets Inyour Eyes\tBrunswick\t6769\t14818-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC028944.mp3\tBenny Goodman And His Orchestra\tSmoke House Rhythm\tVICTOR\t26107\t028944\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH1242.mp3\tBob Wills And His Texas Playboys\tSmoke On The Water\tOKEH\t6736\tH1242\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC72135.mp3\tRed Foley\tSmoke On The Water\tDECCA\t6102\t72135\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_062.mp3\tRed Foley\tSmoke On The Water\tDECCA\t6102\t72135\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPlpmfsr.mp3\tLes Paul And Mary F\tSmoke Rings\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA834.mp3\tGlen Gray And Casa Loma Orch\tSmoke Rings\tDECCA\t1473\tDLA834\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11534.mp3\tCasa Loma Orchestra\tSmoke Rings\tBRUNSWICK\t6289\t11534\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12985-A.mp3\tMills Bros\tSmoke Rings\tBRUNSWICK\t6525\t12985-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/ARCB12985-A.mp3\tMills Brothers\tSmoke Rings\tARC\tBR6525\tB12985-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/ARCB11534-A.mp3\tCasa Loma Orchestra\tSmoke Rings\tARC\tBR6289\tB11534-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDLA834HT1-1.mp3\tCasa Loma Orchestra\tSmoke Rings\tDECCA\t1473\tDLA-834-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77435.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tSmoke Rings\tUltraphone\tAP-1512\tP-77435\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban12358-1.mp3\tMills Blue Rhythm Band\tSmoke Rings\tBanner \t32608\t12358-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_258.mp3\tGlen Gray And Casa Loma Orchestra\tSmoke Rings\tDECCA\t1473\tDLA-834-A\t1937\tFrank Zullo, Grady Watts, Walter Smith (tp), Pee Wee Hunt, Billy Rauch, Fritz Hummel (tb), Glen Gray (cl, as, fl, ldr),  Clarence Hutchinrider (cl, as, fl), Kenny Sargent (cl, as), Art Ralston (as, ob, bsn), Danny D'Andrea (as), Pat Davis (cl, ts, fl), Joe Hall (p), Jack Burdette (g), Stanley Dennis (sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3l/VIC76622-1.mp3\tLeo Reisman & His Orch\tSmoke Rings (vh.arlen)\tVICTOR\t24358\t76622-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_090.mp3\tPhil Harris\tSmoke! Smoke! Smoke! (that Cigarrette)\tRCA Victor\t2370\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP40001x.mp3\tTex Williams\tSmoke, Smoke, Smoke\tCAPITOL\t40001\t40001x\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2472.mp3\tJohnny Bond\tSmoke, Smoke, Smoke\tCOLUMBIA\t37831\tHCO2472\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38683-1.mp3\tRichard M Jones Jazz Wizards\tSmoked Meat Blues\tVICTOR\t20859\t38683-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU36240-2.mp3\tJelly Roll Morton's Peppers\tSmokehouse Blues\tBLUEBIRD\t8372\t36240-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_221.mp3\tRobins\tSmokey Joe's Caf\tRCA Victor\t6294\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64929.mp3\tBob Crosby & His Orch\tSmokey Mary\tDECCA\t3336B\t64929\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO40418.mp3\tRoy Acuff Smoky Mountain Boys\tSmokey Mountain Rag\tCOLUMBIA\t20559\tCO40418\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU030S.mp3\tEdmond Hall Allstar Quintet\tSmooth Sailing\tBLUENOTE\tBN030\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/MER1388.mp3\tCootie Williams & His Orch\tSmooth Sailing\tMERCURY\t8073\t1388\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/OKE28959-1.mp3\tHorace Henderson And His Orchestra\tSmooth Sailing\tOKEH\t5900\t28959-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_221.mp3\tElla Fitzgerald Feat. Bill Doggett's Orchestra And Ray Charles Singers\tSmooth Sailing\tDECCA\t27693\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM1000-1.mp3\tDuke Ellington & His Orch\tSmorgasbord And Schnapps\tBRUNSWICK\t8380\tM1000-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DJDB15.mp3\tBunk Johnson New Orleans Band\tSnag It\tV-DISC\t658\tJDB15\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27904.mp3\tFletcher Henderson Dixie Stomp\tSnag It\tCOLUMBIA\t35670\t27904\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/HAR149793-2.mp3\tGeorgia Cotton Pickers\tSnag It\tHARMONY\t1127-H\t149793-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/BruC-4470.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tSnag It\tBrunswick\t4878\tC-4470\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE36995.mp3\tMill's Blue Rhythm Band\tSnake Hips\tBRUNSWICK\t6199\tE36995\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/OKeS8391.mp3\tKing Oliver Jazz Band\tSnake Rag\tOKeh\t4933\tS8391\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/Oke8391-A.mp3\tKing Oliver's Jazz Band\tSnake Rag\tOkeh\t4933\t8391-A\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/Gen11391.mp3\tKing Oliver's Creole Jazz Band\tSnake Rag\tGennett\t5184\t11391\t1923\t\nhttp://www.jazz-on-line.com/a/mp3l/Col80900-2.mp3\tThe Georgians\tSnakes Hips\tColumbia\tA-3864\t80900-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044592.mp3\tHarlan Leonard & His Rockets\tSnaky Feelin'\tBLUEBIRD\t10883\t044592\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_076.mp3\tAl Jolson\tSnap Your Fingers\tVICTOR\t17075\tB11732-3\t1912\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S6040.mp3\tBob Wills Texas Playboys\tSnatchin' And Grabbin' (vjoe Holley)\tMGM\t11241A\t52S6040\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COMB537-1.mp3\tWillie Smith (piano)\tSneakaway\tCOMMODORE\t524\tB537-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/ManA-1577.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tSneaky Pete\tManor\t1111\tA-1577\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC12948-1.mp3\tBilly Murray\tSnooky Ookums\tVICTOR\t17313\t12948-1\t1913\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO10107.mp3\tFrankie Laine\tSnow In Lover's Lane\tCOLUMBIA\t39716\tHCO10107\t\t\nhttp://www.78-tours.net/mp3/PATCPT3036.mp3\tJo Bouillon And Son Orchestre\tSnowboat Shuffle\tPATH\tPA 1095\tCPT 3036\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_227.mp3\tDecastro Sisters\tSnowbound For Christmas\tColumbia\t40581\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30532.mp3\tClaude Thornhill And His Orch\tSnowfall\tCOLUMBIA\t36268\tCO30532\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D271A1.mp3\tClaude Thornhill And His Orchestra\tSnowfall\tV-DISC\t271A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol36268.mp3\tClaude Thornhill & His Orchestra\tSnowfall\tColumbia\t36268\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_182.mp3\tClaude Thornhill And His Orchestra\tSnowfall\tV-DISC\t271A1\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152117.mp3\tEddy Duchin & His Orch\tSnuggled On Your Shoulder\tCOLUMBIA\t2625 D\tW152117\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW152121.mp3\tKate Smith\tSnuggled On Your Shoulder\tCOLUMBIA\t2624\tW152121\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU11163-A.mp3\tBing Crosby\tSnuggled On Your Shoulder\tBRUNSWICK\t6248\t11163-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_120.mp3\tKate Smith\tSnuggled On Your Shoulder\tCOLUMBIA\t2624\tW152121\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC8389.mp3\tIsham Jones & His Orch\tSnuggled On Your Shoulder (cuddled In Your Arms)\tBRUNSWICK\t6249\tC8389\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_084.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tSnuggled On Your Shoulder (cuddled In Your Arms)\tCOLUMBIA\t2625 D\tW152117\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/CON11139-2.mp3\tSmith Ballew And His Orch\tSnuggled On Your Shoulder (vsb)\tCONQUEROR\t7928\t11139-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULAE803.mp3\tEarl Burtnett & His Orch\tSo Beats My Heart For You\tBRUNSWICK\t4830\tLAE803\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_016.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra\tSo Beats My Heart For You\tBrunswick\t4830\tLAE803\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE21829.mp3\tNick Lucas\tSo Blue\tBRUNSWICK\t3492\tE21829\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38310-1.mp3\tPaul Whiteman & His Orch\tSo Blue\tVICTOR\t20570B\t38310-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_165.mp3\tNick Lucas\tSo Blue\tBRUNSWICK\t3492\tE21829\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_203.mp3\tHenry King And His Orchestra\tSo Close To The Forest\tARC\tCO3010D\t16637\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA462-A.mp3\tBing Crosby & George Stoll Or\tSo Do I\tDECCA\t948A\tDLA462-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_257.mp3\tBing Crosby\tSo Do I\tDECCA\t11011\tDLA462-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480900.mp3\tTed Heath And His Music\tSo Easy\tDECCA-LONDON\t1058\tDR-14260\t1949\tBobby Pratt, Stan Roderick, Stan Reynolds, Ronnie Hughes (tp) Jackie Armstrong, Maurice Pratt, Jack Bentley, Jimmy Coombes (tb) Les Gilbert, Reg Owen (as) Tommy Whittle, Henry Mackenzie (ts) Dave Shand (bar) Dave Simpson (p) Jack Seymour (b) Jack Parnell (d,vcl) Ted Heath (dir) \nhttp://www.jazz-on-line.com/a/mp3w/1947_105.mp3\tFrank Sinatra\tSo Far\tCOLUMBIA\t37883\tHCO2540\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_137.mp3\tPerry Como Feat. Runs Case's Orchestra\tSo Far\tRCA Victor\t2402\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67242.mp3\tBob Crosby's Bobcats\tSo Far So Good\tDECCA\t3055A\t67242\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC044891.mp3\tDuke Ellington & His Orch\tSo Far, So Good\tVICTOR\t26537\t044891\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_179.mp3\tBob Crosby And His Orchestra Feat. V/marion Mann\tSo Far, So Good\tDECCA\t3055A\t67242\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047018.mp3\tCharlie Barnet & His Orch\tSo Far, So Good (v M. Mc Call)\tBLUEBIRD\t10618\t047018\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64824.mp3\tRodney Sturgis\tSo Good\tDECCA\t7579\t64824\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23178.mp3\tMildred Bailey & Her Orchestra\tSo Help Me\tVOCALION\t4253\t23178\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_032.mp3\tMildred Bailey Feat. Red Norvo (bandleader)\tSo Help Me\tVOCALION\t4253\t23178-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15357x.mp3\tGordon Macrae\tSo In Love\tCAPITOL\t15357\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2123.mp3\tPatti Page\tSo In Love\tMERCURY\t5230\t2123\t1948?\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3490.mp3\tDinah Shore\tSo In Love\tCOLUMBIA\t38399\tHCO3490\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLNO-2143.mp3\tShirley And Lee\tSo In Love\tALLADDIN\t3192\tNO-2143\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_193.mp3\tDinah Shore\tSo In Love\tCOLUMBIA\t38399\tHCO3490\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_183.mp3\tGordon Macrae\tSo In Love\tCapitol\t535\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_126.mp3\tPatti Page\tSo In Love\tMERCURY\t5230\t2123\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC63775-A.mp3\tLouis Armstrong And His Orchestra\tSo Little Time (so Much To Do)\tDECCA\t1822A\t63775-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/ATLA239.mp3\tRuth Brown\tSo Long\tATLANTIC\t879\t239\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68147.mp3\tElla Fitzgerald & Her Orch\tSo Long\tDECCA\t3420A\t68147\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27026-1.mp3\tGene Krupa & His Orch\tSo Long\tCOLUMBIA\t35423\t27026-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26591.mp3\tCharioteers\tSo Long\tCOLUMBIA\t35424\t26591\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_290.mp3\tCharioteers\tSo Long\tCOLUMBIA\t37399\tWCO26591\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_267.mp3\tFour Aces Feat. O/jack Pleis\tSo Long\tDECCA\t29036\t85374\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20535-6.mp3\tCharles Hart\tSo Long Mother\tVICTOR\t18374\t20535-6\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79066.mp3\tFrank Crumit\tSo Long Ooh Long\tCOLUMBIA\tA-2935\t79066\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH0736.mp3\tAl Dexter And His Troopers\tSo Long Pal\tOKEH\t6718\tH0736\t1942\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR144021-2.mp3\tUniversity Six\tSo Long, Pal\tHARMONY\t399-H\t144021-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071909-1.mp3\tUna Mae Carlisle\tSo Long, Shorty\tBLUEBIRD\t11507\t071909-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU065909-1.mp3\tErskine Hawkins & His Orch\tSo Long, Shorty\tBLUEBIRD\t11485\t065909-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_326.mp3\tWill Osborne And His Orchestra\tSo Lovely\tDecca\t1905\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_186.mp3\tGeorgia Gibbs\tSo Madly In Love\tMERCURY\t5874\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC042736.mp3\tTommy Dorsey & His Orch\tSo Many Times\tVICTOR\t26386\t042736\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL26163-A.mp3\tJack Teagarden & His Orch\tSo Many Times\tCOLUMBIA\t35252\t26163-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_323.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tSo Many Times\tDECCA\t2727A\t66083\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042730.mp3\tGlenn Miller & His Orch\tSo Many Times (vre)\tBLUEBIRD\t10438 B\t042730\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S84.mp3\tJoe Turner\tSo Many Women Blues\tMGM\t10321\t48S84\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62575.mp3\tEdgar Hayes Quintet\tSo Rare\tDECCA\t1444\t62575\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25626.mp3\tGuy Lombardo & His Royal Canadians\tSo Rare\tVictor\t25626\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_042.mp3\tGus Arnheim And His Orchestra Feat. Jimmy Farrell\tSo Rare\tBRUNSWICK\t7919\t21298-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16613.mp3\tHal Kemp And His Orch\tSo Red The Rose (v Bob Allen)\tBRUNSWICK\t7360\t16613\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/MOD340.mp3\tMerle Travis\tSo Round, So Firm, So Fulled Packed\tMODERN\tCAP349\t340\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2162.mp3\tJohnny Bond\tSo Round, So Firm, So Fully Packed\tCOLUMBIA\t37255\tHCO2162\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_260.mp3\tMerle Travis\tSo Round, So Firm, So Fully Packed\tCapitol\t15264\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu7528.mp3\tOzzie Nelson & His Orchestra\tSo Says My Heart\tBluebird\t7528\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73753.mp3\tAndy Kirk\tSo Soon\tDECCA\t24139\t73753\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73753.mp3\tAndy Kirk And His Orchestra\tSo Soon\tDecca\t24139\t73753\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_299.mp3\tInk Spots\tSo Sorry\tDECCA\t3806B\t68532\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10662.mp3\tJoe Evans & Arthur Mcclain\tSo Sorry Dear\tBANNER\t32268\t10662\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-5901-.mp3\tJimmie Noone's Apex Club Orchestra\tSo Sweet\tVocalion \t1518\tC-5901-\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10429-3.mp3\tCab Calloway & His Orchestra\tSo Sweet (vcc)\tBANNER\t32116\t10429-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15314x.mp3\tKay Starr\tSo Tired\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/V-D884x.mp3\tRuss Morgan\tSo Tired\tV-DISC\t884\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41368-1.mp3\tJean Goldkette & His Orch\tSo Tired\tVICTOR\t21150\t41368-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW145499-3.mp3\tArt Gillham (piano)\tSo Tired\tCOLUMBIA\t1282 D\tW145499-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_063.mp3\tKay Starr\tSo Tired\tCapitol\t1660\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_092.mp3\tGene Austin\tSo Tired\tVICTOR\t21329B\t43507-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_204.mp3\tArt Gillham\tSo Tired\tCOLUMBIA\t1282 D\tW145499-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL690.mp3\tLee O'daniel Hillbilly Boys\tSo Tired Of Dreaming\tVOCALION\t4778\tDAL690\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24521x.mp3\tRuss Morgan And His Music\tSo Tired!\tDECCA\t24521\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93811-B.mp3\tJay Mcshann Quartet\tSo You Won't Jump\tDECCA\t8607\tC93811-B\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC055145.mp3\tHal Kemp And His Orch\tSo You're The One\tVICTOR\t27222\t055145\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_147.mp3\tVaughn Monroe And His Orchestra\tSo You're The One\tBLUEBIRD\t10901\t056447-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_101.mp3\tEddy Duchin And His Orchestra Feat. V/june Robbing\tSo You're The One\tCOLUMBIA\t35812\t28852-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_252.mp3\tFats Domino\tSo-long\tImperial\t5396\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN567SAC.mp3\tSidney Bechet W Claude Luter\tSobbin' And Cryin'\tBLUENOTE\tBN567\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/CON20448-4.mp3\tArtie Shaw And His Orchestra\tSobbin' Blues\tCONQUEROR\t9193\tB-20448-4\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC030300.mp3\tBunny Berigan And His Orch\tSobbin' Blues\tVICTOR\t26116B\t030300\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKeS8394-B.mp3\tKing Oliver Jazz Band\tSobbin' Blues\tOKeh\t4906\tS8394-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/JAZ14y.mp3\tBunk Johnson's Jazz Band\tSobbin' Blues\tJazz Information\t14\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/Oke8394-B.mp3\tKing Oliver's Jazz Band\tSobbin' Blues\tOkeh\t4906\t8394-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140249-2.mp3\tBessie Smith\tSobbin' Hearted Blues\tCOLUMBIA\t14056 D\t140249-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480520.mp3\tArt Farmer And Gigi Gryce\tSocial Call\tPrestige\tPRLP209\t744\t1955\tArt Farmer, T, FLh, Gigi Gryce, As, With, 2 rhythm sections, = Horace Silver or Freddie Redd, P, Addison Farmer or Percy Heath, B, Art Taylor or Kenny Clark, D\nhttp://www.jazz-on-line.com/a/mp3c/ASC349-2-.mp3\tTom Glazer\tSocial Worker's Talking Blues\tASCH\t349-2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/NOR3009B.mp3\tSpikes Seven Pods Of Pepper\tSociety Blues\tNORDSKOG\t3009B\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/SUN3003SB.mp3\tKid Ory's Sunshine Orch\tSociety Blues\tSUNSET\t3003\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/PAR20241-2.mp3\tDixie Thumpers\tSock That Thing\tPARAMOUNT\t12594\t20241-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17429A.mp3\tLord Invader\tSoffie Bellah\tDECCA\t17429A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK9175-1.mp3\tTiny Bradshaw And His Orchestra\tSoft\tKING\t4577\tK9175-1\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/AtlRK4.mp3\tFantasy For Clarinet And Strings With Barney Bigard\tSoft And Warm\tAtlantic\tEP 528\tRK4\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/RexRK-6.mp3\tErroll Garner Trio\tSoft And Warm\tRex\tJ503\tRK-6\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_176.mp3\tTed Fio Rito And His Orchestra\tSoft Green Seas\tBRUNSWICK\t6859\tSF101\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC71891-1.mp3\tWaring's Pennsylvanians\tSoft Lights & Sweet Music\tVICTOR\t22936\t71891-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480388.mp3\tArt Farmer New Jazz Stars\tSoft Shoe\tPrestige\tPR7665\t553\t1954\tQuintet: Art Farmer, T, Flh, Sonny Rollins, Ts, Horace Silver, P, Percy Heath, B, Kenny Clarke, D\nhttp://www.jazz-on-line.com/a/mp3b/Joh094.mp3\tGeraldo And His Orchestra\tSoft Shoe Shuffle\tParlophone\tF-1901\tCE-10911-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_219.mp3\tDiamonds\tSoft Summer Breeze\tMercury\t70934\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057364.mp3\tErskine Hawkins & His Orch\tSoft Winds\tBLUEBIRD\t11001\t057364\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26285.mp3\tBenny Goodman Sextet\tSoft Winds\tCOLUMBIA\t35320\t26285\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_359.mp3\tBenny Goodman Sextet\tSoft Winds\tCOLUMBIA\t35320\t26285\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480901.mp3\tAl Goodman And His Orchestra\tSoftly As In A Morning Sunrise\tRCA VICTOR\t28-0403-B\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC47767-3.mp3\tThe Troubadors (shilkret)\tSoftly As In The Morning Sunrise (vfb)\tVICTOR\t21775\t47767-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_321.mp3\tCount Basie And His Orchestra\tSoftly With Feeling\tClef\t89112\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_054.mp3\tNat Shilkret And The Victor Orchestra\tSoftly, As In A Morning Sunrise\tVICTOR\t21775\t47767-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D297B1.mp3\tChu Chu Martinez And His Orchestra\tSolamente Una Vez\tV-DISC\t297B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_095.mp3\tFrank Stanley And Byron G. Harlan\tSoldier Boy\tCOLUMBIA\t3067\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150223.mp3\tGid Tanner's Skillet Lickers\tSoldier Will You Marry Me\tCOLUMBIA\t15589 D\tW150223\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU82722-1.mp3\tGid Tanner Skillet Lickers\tSoldier's Joy Breakdown\tBLUEBIRD\t5658\t82722-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU5658.mp3\tGid Tanner Skillet Lickers\tSoldier's Joy Breakdown\tBLUEBIRD\t5658\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC072231.mp3\tGlenn Miller & His Orch\tSoldier, Let Me Read Your Letter (vre)\tVICTOR\t27873\t072231\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149277-2.mp3\tGid Tanner's Skillet Lickers\tSoldiers Joy\tCOLUMBIA\t15538 D\tW149277-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB3188.mp3\tCount Basie Octet\tSolid As A Rock\tRCA\t20-3699\tE0VB3188\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU044706.mp3\tCurtis Jones\tSolid Jive\tBLUEBIRD\t8455\t044706\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22517.mp3\tEarl Hines & His Orch\tSolid Mama\tVOCALION\t4143\t22517\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/SWI0SW-67-1.mp3\tRex Stewart And His Feetwarmers (with Django Reinhardt)\tSolid Old Man\tSWING\t56\t0SW-67-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D508.mp3\tKing Cole Trio\tSolid Potato Salad\tV-DISC\t508\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC070344.mp3\tArtie Shaw And His Orchestra\tSolid Sam\tVICTOR\t27705\t070344-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUWM1008-1.mp3\tDuke Ellington & His Orch\tSolid, Old Man\tBRUNSWICK\t8380\tWM1008-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE22809.mp3\tDuke Ellington & His Orch\tSoliloquy\tBRUNSWICK\t6804\tE22809\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/BruE-4965.mp3\tThe Washingtonians\tSoliloquy\tBrunswick\t3526\tE-4965\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU022157.mp3\tTune Wranglers\tSolita\tBLUEBIRD\t7703\t022157\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_143.mp3\tTony Bennett\tSolitaire\tCOLUMBIA\t39555\tCO45854\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15910.mp3\tDuke Ellington And His Orch\tSolitude\tBRUNSWICK\t6987\t15910\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWM1135.mp3\tDuke Ellington And Famous Orch\tSolitude\tCOLUMBIA\t35427\tWM1135\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE30460.mp3\tBillie Holiday\tSolitude\tOKEH\t6270\t30460\t1941\t\nhttp://www.78-tours.net/mp3/PATCPT3039.mp3\tJo Bouillon And Son Orchestre\tSolitude\tPATH\tPA 1095\tCPT 3039\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC80149-1.mp3\tDuke Ellington And His Orch\tSolitude\tVICTOR\t24755A\t80149-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC065605.mp3\tDuke Ellington (piano)\tSolitude\tVICTOR\t27564\t065605\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COL16272-1.mp3\tMills' Blue Rhythm Band\tSolitude\tCOLUMBIA\t2994 D\t16272-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC26500.mp3\tJoe Sullivan (piano)\tSolitude\tVOCALION\t5531\t26500\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D658S.mp3\tFats Waller - Organ\tSolitude\tV-DISC\t658\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-3670s.mp3\tCharlie Ventura's Orch\tSolitude\tRCA\t20-3670\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/HMWOLA-1706-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tSolitude\tHMW\tB-8669\tOLA-1706-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec60251-B.mp3\tLouis Armstrong And His Orchestra\tSolitude\tDecca\t666\t60251-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-16272-1.mp3\tMills Blue Rhythm Band\tSolitude\tColumbia\t2994-D\tCO-16272-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-17853.mp3\tTed Heath And His Music; Leslie Gilbert, Alto Sax (his 89th London Palladium Sunday Concert, April 1\tSolitude\tDECCA-LONDON\tEFF.290-1 (BEP 6121)\tDR-17853\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_038.mp3\tDuke Ellington And His Famous Orchestra\tSolitude\tBRUNSWICK\t6987\t15910\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480675.mp3\tDuke Ellington And His Famous Orchestra (ivie Anderson, Vocals)\tSolitude\tColumbia\t35427\tWM-1135-1\t1940\tWallace Jones, Cootie Williams (tp), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Barney Bigard (cl), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (as, bsx), Duke Ellington (p), Fred Guy (g), Jimmy Blanton (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3a/COLCO29865-1.mp3\tBenny Goodman And His Orchestra\tSolo Flight\tCOLUMBIA\t36684\tCO29865-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_148.mp3\tBenny Goodman And His Orchestra\tSolo Flight\tCOLUMBIA\t36684\tCO29865-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COL17382-1.mp3\tGlenn Miller & His Orch\tSolo Hop\tCOLUMBIA\t3058 D\t17382-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10393.mp3\tFrankie Laine W Paul Weston\tSome Day\tCOLUMBIA\t40235\tRHCO10393\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18867B.mp3\tLucky Millinder & His Orch\tSome Day\tDECCA\t18867B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_214.mp3\tTony Martin\tSome Day\tRCA\t20-4836\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BLURS655-3.mp3\tPete Johnson Blues Trio\tSome Day Blues\tBLUENOTE\tBN011\tRS655-3\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC1632-B.mp3\tFreddie Rich And His Orch\tSome Day My Prince Will Com\tDecca\t1632-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/HARB12531.mp3\tBing Crosby\tSome Day We'll Meet Again\tHARMONY\tHa1003\tB12531\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3617.mp3\tFrank Sinatra\tSome Enchanted Evening\tCOLUMBIA\t38446\tHCO3617\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4922.mp3\tBing Crosby - J.s.trotter\tSome Enchanted Evening\tDECCA\t24609\tL4922\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_062.mp3\tFrank Sinatra\tSome Enchanted Evening\tCOLUMBIA\t38446\tHCO3617\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_044.mp3\tJo Stafford\tSome Enchanted Evening\tCapitol\t57-544\t4087-4D-6\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_007.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tSome Enchanted Evening\tRCA Victor\t78-3402\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035054.mp3\tCharlie Barnet & His Orch\tSome Like It Hot\tBLUEBIRD\t10182\t035054\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24801.mp3\tRed Norvo & His Orch\tSome Like It Hot\tVOCALION\t5009\t24801\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BruLA1814-A.mp3\tGene Krupa And His Orchestra\tSome Like It Hot\tBrunswick\t8340\tLA1814-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3l/COL79697-2.mp3\tCoon-sanders Orchestra\tSome Little Bird\tCOLUMBIA\tA-3403\t79697-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA3403.mp3\tCoon Sanders Orchestra\tSome Little Bird\tColumbia\tA3403\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_114.mp3\tCoon-sanders Orchestra\tSome Little Bird\tCOLUMBIA\tA-3403\t79697-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142955-2.mp3\tTed Lewis And His Band, Vocal By Sophie Tucker\tSome Of These Days\tCOLUMBIA\t36300\tW142955-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_026.mp3\tAmerican Quartet\tSome Of These Days\tVictor\t16834\tB9740-3\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402943-A.mp3\tLouis Armstrong & His Orch\tSome Of These Days\tOKeh\t41298\t402943-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU55602-2.mp3\tSophie Tucker\tSome Of These Days\tBLUEBIRD\t6835\t55602-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DECTB1077.mp3\tJack Hylton & His Orchestra\tSome Of These Days\tDECCA\t411A\tTB1077\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE26943-A.mp3\tMary Small\tSome Of These Days\tOKEH\t5794\t26943-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE35880-A.mp3\tCab Calloway & His Orch\tSome Of These Days\tBRUNSWICK\t6020\tE35880-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1927.mp3\tWillie Lewis & Negro Band\tSome Of These Days\tVARSITY\tEL4082s\t1927\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM148.mp3\tColeman Hawkins & Ramblers\tSome Of These Days\tDECCA\t500F\tAM148\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/OKeS71043.mp3\tOriginal Dixieland Jass Band\tSome Of These Days\tOKeh\t4738A\tS71043\t1922\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC31172-3.mp3\tCoon-sanders Nighthawk Orch\tSome Of These Days\tVICTOR\t19600\t31172-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77539.mp3\tDjango Reinhardt\tSome Of These Days\tUltraphone\tAP-1548\tP-77539\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5270.mp3\tSidney Bechet-h.littleton\tSome Of These Days\tSAVOY\t744\tS5270\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE4397.mp3\tFletcher Henderson & His Orch\tSome Of These Days\tVOCALION\t1079\tE4397\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/BANJC8641-1.mp3\tBing Crosby\tSome Of These Days\tBANNER\t33163\tJC8641-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D358B1.mp3\tSophie Tucker (with Tommy Dorsey)\tSome Of These Days\tV-DISC\t358B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DeLD-170.mp3\tBenny Carter And His All Star Orchestra\tSome Of These Days\tDe Luxe\t1012\tD-170\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_013alt.mp3\tSophie Tucker\tSome Of These Days\tBLUEBIRD\t6835\t55602-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-8486-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tSome Of These Days \tParlophone\tF-952\tCE-8486-1\t1937\tValaida Snow t v acc. by Johnny Claes t, Derek Neville as bar, Reggie Dare ts, Gun Finlay p, Norman Brown g, Louis Barreiro b, Ken Stewart d\nhttp://www.jazz-on-line.com/a/mp3d/Son1879-SA.mp3\tBenny Carter Med Sonora Swing Band\tSome Of These Days\tSonora\t3188\t1879-SA\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142955-2.mp3\tTed Lewis And His Band\tSome Of These Days (vs.tucker)\tCOLUMBIA\t826 D\tW142955-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/PARL0043.mp3\tCharlie Patton\tSome Of These Days I'll Be Gone\tPARAMOUNT\t13110B\tL0043\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC33848-4.mp3\tJack Smith\tSome Other Bird Whistled Another Tune\tVICTOR\t19914\t33848-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26061-A.mp3\tTeddy Wilson & His Orch\tSome Other Spring\tCBS\tCO35298\t26061-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Col26061-A.mp3\tTeddy Wilson And His Orchestra\tSome Other Spring\tColumbia\t35298\t26061-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480454.mp3\tThe Art Tatum Trio\tSome Other Spring\tPablo\t2310-735\t2669-1\t1956\tArt Tatum (p), Red Callender (sb), Jo Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3e/V-D241B1.mp3\tFrank Sinatra\tSome Other Time\tV-DISC\t241B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D305A1.mp3\tLes Brown And His Orchestra\tSome Peaceful Evening\tV-DISC\t305A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC2819.mp3\tNick Lucas\tSome Rainy Day\tBRUNSWICK\t4214\tC2819\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU032943.mp3\tFats Waller And His Rhythm\tSome Rainy Day\tBLUEBIRD\t10192\t032943\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC17299-2.mp3\tEdna Brown & Billy Murray\tSome Sort Of Somebody\tVICTOR\t17992\t17299-2\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_146.mp3\tBilly Murray And Elsie Baker\tSome Sort Of Somebody\tVICTOR\t17992\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/PARL0431.mp3\tCharlie Patton\tSome Summer Day\tPARAMOUNT\t13080B\tL0431\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3836.mp3\tDick Haymes & Helen Forrest\tSome Sunday Morning\tDECCA\t23434\tL3836\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC20625-3.mp3\tAda Jones And Billy Murray\tSome Sunday Morning\tVICTOR\t18393\t20625-3\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_121.mp3\tHelen Forrest And Dick Haymes Feat. Gordon Jenkins' Orchestra\tSome Sunday Morning\tDECCA\t23434\tL3836\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU2268x.mp3\tBrox Sisters W Benny Krueger\tSome Sunny Day\tBRUNSWICK\t2268\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73646.mp3\tEddie Condon & His Orchestra\tSome Sunny Day\tDECCA\t23721\t73646\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26278-2.mp3\tPaul Whiteman & His Orch\tSome Sunny Day\tVICTOR\t18891\t26278-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_030.mp3\tMarion Harris\tSome Sunny Day\tCOLUMBIA\tA-3593\t80241-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21990-A.mp3\tJohnny Marvin\tSome Sweet Day\tVICTOR\t21990\t51641-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKeW80339-A.mp3\tMiff Mole's Little Molers\tSome Sweet Day\tOKeh\t40758\tW80339-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_182.mp3\tNat Shilkret And The Victor Orchestra\tSome Sweet Day\tVICTOR\t21896\t49931-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC20215-1.mp3\tMarion Harris\tSome Sweet Day (olman)\tVICTOR\t18343\t20215-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49931-3.mp3\tNat Shilkret & Victor Orch\tSome Sweet Day (vfb)\tVICTOR\t21896\t49931-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78835.mp3\tBert Williams\tSomebody\tCOLUMBIA\tA-2849\t78835\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30923.mp3\tHank Penny's Radio Cowboys\tSomebody\tOKEH\t6426\t30923\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_093.mp3\tJo Stafford\tSomebody\tCOLUMBIA\t39389\tHCO4419\t1951\t\nhttp://www.jazz-on-line.com/mp3/866748332.mp3\tEartha Kitt\tSomebody Bad Stole De Wedding Bell\tRCA\t20-5610\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC85593.mp3\tElla Fitzgerald\tSomebody Bad Stole De Wedding Bell\tDECCA\t29008\t85593\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_123.mp3\tGeorgia Gibbs\tSomebody Bad Stole De Wedding Bell\tMERCURY\t70298\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU96221-1.mp3\tCasey Bill Weldon\tSomebody Changed The Lock On My Door\tBLUEBIRD\t6243\t96221-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/APO362SC.mp3\tWynonie Harris W Jack Mcvea\tSomebody Changed The Lock On My Heart\tAPOLLO\t362\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC8670B.mp3\tLouis Jordan Tympani 5\tSomebody Done Changed The Lock\tDECCA\t8670B\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67310.mp3\tLouis Jordan & His Tympani 5\tSomebody Done Hoodooed The Hoodoo Man\tDECCA\t7745\t67310\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA1208s.mp3\tArthur Collins\tSomebody Else Is Getting It\tColumbia\tA1208\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3a/COL31741.mp3\tBenny Goodman And His Orchestra\tSomebody Else Is Taking My Place\tCOLUMBIA\t38198\t31741\t1941\tvocal Peggy Lee\nhttp://www.jazz-on-line.com/a/mp3e/COL31741-1.mp3\tBenny Goodman & His Orch\tSomebody Else Is Taking My Place\tCOLUMBIA\t37244\t31741-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_032.mp3\tRuss Morgan And His Orchestra\tSomebody Else Is Taking My Place\tDECCA\t4098A\t69871\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_033.mp3\tBenny Goodman And His Orchestra Feat. Peggy Lee\tSomebody Else Is Taking My Place\tOKEH\t6497\t31741-1\t1941\tBilly Butterfield, Jimmy Maxwell,  Al Davis (tp), Lou McGarity, Cutty Cutshall (tb), Benny Goodman (cl), Julie Schwartz, Clint Neagley (as), Vido Musso, George Berg (ts), Chuck Gentry (bar), Mel Powell (p), Tom Morgan (g), Sid Weiss (sb), Ralph Collier (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1948_211.mp3\tBenny Goodman And His Orchestra\tSomebody Else Is Taking My Place\tCOLUMBIA\t38198\t31741\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/VARW139.mp3\tBunny Berigan & His Orch\tSomebody Else Is Taking My Place (v N S)\tVARSITY\tEL5019\tW139\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE31741-1.mp3\tBenny Goodman And His Orchestra\tSomebody Else Is Taking My Place (vpl)\tOKEH\t6497\t31741-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW152292.mp3\tThe Three Keys\tSomebody Loses - Somebody Wins\tCOLUMBIA\t2706 D\tW152292\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COL152751-1.mp3\tTeddy Wilson (piano)\tSomebody Loves Me\tCOLUMBIA\t\t152751-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4387.mp3\tDoris Day\tSomebody Loves Me\tCOLUMBIA\t39200\tHCO4387\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC30380-4.mp3\tPaul Whiteman And His Orch\tSomebody Loves Me\tVICTOR\t19414\t30380-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC02458-1.mp3\tBenny Goodman And His Orchestra\tSomebody Loves Me\tVICTOR\t25497\t02458-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72633-A.mp3\tEddie Condon & His Orch\tSomebody Loves Me\tDECCA\t23430\t72633-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYHL75.mp3\tGeorge Wettling's New Yorkers\tSomebody Loves Me\tKEYNOTE\t1318\tHL75\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVS5839.mp3\tErroll Garner Trio\tSomebody Loves Me\tSAVOY\t571B\tS5839\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA669-A.mp3\tCliff Edwards & Andy Iona\tSomebody Loves Me\tDECCA\t1166\tDLA669-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU13872.mp3\tMarion Harris\tSomebody Loves Me\tBRUNSWICK\t2735\t13872\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/MER1812.mp3\tHelen Humes W Buck Clayton Or\tSomebody Loves Me\tMERCURY\t8092\t1812\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1777.mp3\tBing Crosby & Victor Young Or.\tSomebody Loves Me\tDECCA\t2874A\tDLA1777\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM-397-1.mp3\tBenny Carter And His Orchestra\tSomebody Loves Me\tDECCA\t18256A\tAM-397-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_081.mp3\tMarion Harris\tSomebody Loves Me\tBRUNSWICK\t2735\t13872\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/Col150858-3.mp3\tFletcher Henderson And His Orchestra\tSomebody Loves Me\tColumbia\t2329-D\t150858-3  \t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Cla85010.mp3\tErroll Garner With Inez Cavanaugh\tSomebody Loves Me\tClassics\t850\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_131.mp3\tCliff Edwards\tSomebody Loves Me\tPath\t302073\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_196.mp3\tFour Lads Feat. Mitch Miller's Orchestra\tSomebody Loves Me\tCOLUMBIA\t39865\tCO48149\t1952\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480455.mp3\tLionel Hampton And His Giants\tSomebody Loves Me\tNorgran\tEPN 143\t2490-2\t1955\tHarry ??Sweets?? Edison (tp), Lionel Hampton (vib), Art Tatum (p), Barney Kessel (g), John Simmons (sb), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3b/BRU19113-1.mp3\tFrankie Trumbauer's Orch\tSomebody Loves Me (v J T)\tBRUNSWICK\t7665\t19113-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152141-1.mp3\tTed Lewis And His Band, Vocal By Ted Lewis\tSomebody Loves You\tCOLUMBIA\t2635 D\tW152141-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69875.mp3\tElla Fitzgerald & Her Orch\tSomebody Nobody Loves\tDECCA\t4082B\t69875\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC071701.mp3\tArtie Shaw And His Orchestra\tSomebody Nobody Loves\tVICTOR\t27798\t071701-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU18392.mp3\tLeo Reisman And His Orch\tSomebody Oughta Be Told\tBRUNSWICK\t7582\t18392\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU82740.mp3\tArthur Gillham\tSomebody Painted My Dream Castle Blue\tBLUEBIRD\t5454\t82740\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW152459.mp3\tJack Teagarden & His Orch\tSomebody Stole Gabriel's Horn\tCOLUMBIA\t2802\tW152459\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC12429-A.mp3\tWashboard Rhythm Kings\tSomebody Stole Gabriel's Horn\tVOCALION\t1725\t12429-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC61075-A.mp3\tLouis Armstrong And His Orchestra\tSomebody Stole My Break\tDECCA\t797A\t61075-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COL29275.mp3\tBenny Goodman And His Orchestra\tSomebody Stole My Gal\tCOLUMBIA\t35916\t29275\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10334.mp3\tJohnnie Ray\tSomebody Stole My Gal\tCOLUMBIA\t39961\tHCO10334\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC29015-2.mp3\tTed Weems And His Orch.\tSomebody Stole My Gal\tVICTOR\t19212B\t29015-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62927-1.mp3\tBennie Moten Kansas City Orch\tSomebody Stole My Gal\tVICTOR\t23028\t62927-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC845.mp3\tHarry Roy & His Orchestra\tSomebody Stole My Gal\tDECCA\t845\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88997-1.mp3\tFats Waller And His Rhythm\tSomebody Stole My Gal\tVICTOR\t25194\t88997-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10868-1-2.mp3\tCab Calloway & His Orchestra\tSomebody Stole My Gal\tBANNER\t32323\t10868-1-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCDAL-730-.mp3\tHarris Bros Texans\tSomebody Stole My Gal\tVOCALION\t15747\tDAL-730-\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26662.mp3\tCount Basie & His Orch\tSomebody Stole My Gal\tCOLUMBIA\t35500\t26662\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_066.mp3\tJohnnie Ray\tSomebody Stole My Gal\tCOLUMBIA\t39961\tHCO10334\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban10868-1.mp3\tCab Calloway And His Orchestra\tSomebody Stole My Gal\tBanner\t32323\t10868-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Col81692-3.mp3\tFletcher Henderson And His Orchestra\tSomebody Stole My Gal\tColumbia\t126-D\t81692-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Cro1233-3.mp3\tFletcher Henderson And His Orchestra\tSomebody Stole My Gal\tCrown\t3107\t1233-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26662-A.mp3\tCount Basie And His Orchestra\tSomebody Stole My Gal\tColumbia\t291189\t26662-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043993.mp3\tCharlie Barnet & His Orch\tSomebody Told Me (v M A M)\tBLUEBIRD\t10543\t043993\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_142.mp3\tPerry Como\tSomebody Up There Likes Me\tRCA\t6590\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/CON20446.mp3\tCallahan Brothers\tSomebody's Been Using That Thing\tCONQUEROR\t8790\t20446\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69550.mp3\tMabel Robinson\tSomebody's Getting My Love\tDECCA\t8580B\t69550\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69524-A.mp3\tBig Joe Turner\tSomebody's Got To Go\tDECCA\t7856\t69524-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC7856.mp3\tJoe Turner\tSomebody's Got To Go\tDECCA\t7856\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/HITT449-2.mp3\tCootie Williams And His Orch\tSomebody's Got To Go (v Eddie Vinson)\tHIT OF THE WEEK\t7119\tT449-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24857t.mp3\tBillie Holiday\tSomebody's On My Mind\tDECCA\t24857\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_093.mp3\tHenry Burr And Albert Campbell\tSomebody's Waiting For Someone\tColumbia\t2729\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81215-3.mp3\tThe Georgians\tSomebody's Wrong\tColumbia\tA-3996\t81215-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/MAN1129x.mp3\tFour Tunes\tSomeday\tMANOR\t1129\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3510x.mp3\tVaughn Monroe\tSomeday\tRCA\t20-3510\t20-3510x\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24694x.mp3\tMills Brothers\tSomeday\tDECCA\t24694\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72875-A.mp3\tLionel Hampton And His Orchestra\tSomeday\tDecca\tBM30811\t72875-A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72949-C.mp3\tLucky Millinder And His Orchestra\tSomeday\tDecca\t18867\t72949-C\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18738A.mp3\tHoosier Hot Shots\tSomeday (vsally Foster)\tDECCA\t18738A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC90096.mp3\tSleepy John Estes\tSomeday Baby Blues\tDECCA\t7279\t90096\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D261A.mp3\tSammy Kaye And His Orchestra\tSomeday I'll Meet You Again\tV-DISC\t261A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC37254-2.mp3\tJelly Roll Morton Hot Peppers\tSomeday Sweetheart\tVICTOR\t20405\t37254-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC92707-1.mp3\tBenny Goodman Trio\tSomeday Sweetheart\tVICTOR\t25181-A\t92707-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU040261.mp3\tMuggsy Spanier Ragtime Band\tSomeday Sweetheart\tBLUEBIRD\t10384B\t040261\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66109-A.mp3\tAlberta Hunter\tSomeday Sweetheart\tDECCA\t7727\t66109-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143258-3.mp3\tThe Charleston Chasers\tSomeday Sweetheart\tCOLUMBIA\t861 D\tW143258-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC18092.mp3\tMildred Bailey\tSomeday Sweetheart\tVOCALION\t3057\t18092\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP173-A.mp3\tCapitol Jazzmen\tSomeday Sweetheart\tCAPITOL\t\t173-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL691.mp3\tLee O'daniel Hillbilly Boys\tSomeday Sweetheart\tVOCALION\t4852\tDAL691\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO95y.mp3\tBob Scobey's Frisco Band\tSomeday Sweetheart\tGood Time Jazz\t95\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38174-3.mp3\tGene Austin\tSomeday Sweetheart\tVICTOR\t20561\t38174-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA9-A.mp3\tBing Crosby\tSomeday Sweetheart\tDECCA\t101B\tDLA9-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap173-A.mp3\tCapitol Jazzmen With Barney Bigard\tSomeday Sweetheart\tCapitol\t1232\t173-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA9-A.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tSomeday Sweetheart\tDecca\t101\tDLA9-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2748.mp3\tIrving & Jack Kaufman\tSomeday You'll Be Sorry That You're Glad\tColumbia\tA2748\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20900.mp3\tJohnny Hamp's Kentucky Serenaders\tSomeday You'll Say O-k\tVictor\t20900\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS21170.mp3\tArtie Shaw And His New Music\tSomeday, Sweetheart\tCBS\tBR7914\tB-21170-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81655-2.mp3\tThe Georgians\tSomeday, Sweetheart\tColumbia\t117-D\t81655-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66075-A.mp3\tEddie Condon's Chicagoans\tSomeday, Sweetheart\tDECCA\t18041B\t66075-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_057.mp3\tGene Austin\tSomeday, Sweetheart\tVICTOR\t20561\t38174-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_237.mp3\tCharleston Chasers\tSomeday, Sweetheart\tCOLUMBIA\t861 D\tW143258-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru13183-A.mp3\tHerny ''red'' Allen And His New York Orchestra\tSomeday, Sweetheart\tBrunswick\t\t13183-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26283-A.mp3\tCount Basie And His Orchestra\tSomeday, Sweetheart\tColumbia\t291519\t26283-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM49S4.mp3\tBilly Eckstine\tSomehow\tMGM\t30375\t49S4\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_254.mp3\tBilly Eckstine\tSomehow\tMGM\t10383\t49S4\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu070332-1.mp3\tEarl Hines And His Orchestra\tSomehow\tBluebird\tB-11432\t070332-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Nat Atkins (tb) Joe McLewis, George Hunt, Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck Parham (b) Rudolph\nhttp://www.jazz-on-line.com/a/mp3b/Blu070332-1.mp3\tEarl Hines And His Orchestra\tSomehow (be Vcl)   \tBluebird\tB-11432B\t070332-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU11912.mp3\tGene Rodemich And His Orchestra\tSomehow( I'm Always To Blame)\tBRUNSWICK\t2550A\t11912\t1923\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3c/COL47029-1.mp3\tAl Jolson\tSomeone Else May Be Up There While I'm Gone\tCOLUMBIA\tA-2124\t47029-1\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_129.mp3\tHarry Reser's Orchestra\tSomeone Is Losin' Susan\tColumbia\t708\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74688.mp3\tElla Fitzgerald\tSomeone Like You\tDECCA\t24562\t74688\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC19244A.mp3\tPaul Whiteman O.\tSomeone Loves You After All\tVICTOR\t19244\tA\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_216.mp3\tChamp Butler With George Cates And His Chorus And Orchestra\tSomeone On Your Mind\tCoral\t61496\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC12362-A.mp3\tDorsey Brothers Orchestra\tSomeone Stole Gabriel's Horn\tARC\tBR01386\t12362-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12263-A.mp3\tThree Keys\tSomeone Stole Gabriel's Horn\tBRUNSWICK\t6388\t12263-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/BAN13149-A.mp3\tBing Crosby\tSomeone Stole Gabriel's Horn\tBANNER\t33203\t13149-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/DecB-13258-A.mp3\tBenny Carter And His Orchestra\tSomeone Stole Gabriel's Horn \tDecca \tF-3563\tB-13258-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61390.mp3\tWoody Herman & His Orch.\tSomeone To Care For Me\tDECCA\t1057\t61390\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D262B2.mp3\tJo Stafford\tSomeone To Love\tV-DISC\t262B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_271.mp3\tFour Aces Featuring Al Alberts\tSomeone To Love\tDecca\t30123\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36654-3.mp3\tGertrude Lawrence\tSomeone To Watch Over Me\tVICTOR\t20331\t36654-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1081.mp3\tArtie Shaw And His Orchestra\tSomeone To Watch Over Me\tRCA\t20-1744\tD5VB1081\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC76836.mp3\tElla Fitzgerald\tSomeone To Watch Over Me\tDECCA\t27368\t76836\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP595.mp3\tColeman Hawkins & His Orch\tSomeone To Watch Over Me\tCAPITOL\t\t595\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MOD692ST.mp3\tErroll Garner Trio\tSomeone To Watch Over Me\tMODERN\t692\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_021.mp3\tGertrude Lawrence\tSomeone To Watch Over Me\tVICTOR\t20331\t36654-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_219.mp3\tGeorge Gershwin\tSomeone To Watch Over Me\tCOLUMBIA\t812 D\tW142925\t1927\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480710.mp3\tArt Tatum\tSomeone To Watch Over Me\tClef\tMGC658\t1442-1\t1953\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3c/VIC36924-4.mp3\tGeorge Olsen & His Music\tSomeone To Watch Over Me (from 'oh Kay')\tVICTOR\t20392B\t36924-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0800_10.mp3\tLee Morse\tSomeone Will Miss Me Sometime\tPathe\t25161B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_092.mp3\tNat ''king'' Cole\tSomeone You Love\tCapitol\t3234 A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK9336-1.mp3\tInk Spots\tSomeone's Rocking My Dream Boat\tKING\t1425\tK9336-1\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_143.mp3\tInk Spots\tSomeone's Rocking My Dream Boat\tKING\t1425\tK9336-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec4045.mp3\tInk Spots\tSomeone's Rocking My Dreamboat\tDecca\t4045\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC27746s.mp3\tArtie Shaw And His Orchestra\tSomeone's Rocking My Dreamboat\tVICTOR\t27746\t068805-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC068805.mp3\tArtie Shaw And His Orchestra\tSomeone's Rocking My Dreamboat\tVICTOR\t27746\t068805-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/VocKC-600.mp3\tJohn Williams And His Memphis Stompers With Andy Kirk\tSomepin' Slow And Low\tVocalion\t1453\tKC-600\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D87B1.mp3\tCarol Bruce With Red Norvo\tSomething For\tv-disk\t87B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S651.mp3\tTeddy Wilson & His Orch\tSomething I Dreamed Last Night\tMGM\t10873A\t48S651\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480389.mp3\tBenny Golson\tSomething In B Flat\tContemporary\tC3552\t\t1957\tArt Farmer (tp) Benny Golson (ts) Wynton Kelly (p) Paul Chambers (b) Charlie Persip (d)\nhttp://www.jazz-on-line.com/a/mp3b/Lee1932_0826_02.mp3\tLee Morse And Her Bluegrass Boys\tSomething In The Night\tColumbia\t2705DB\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE31376.mp3\tCount Basie & His Orch\tSomething New\tOKEH\t6449\t31376\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D135A.mp3\tVaughn Monroe\tSomething Sentimental\tV-DISC\t135A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021150-1.mp3\tFats Waller And His Rhythm\tSomething Tells Me (vadelaide Hall)\tVICTOR\t25817\t021150-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUWM1007-1.mp3\tDuke Ellington & His Orch\tSomething To Live For\tBRUNSWICK\t8365\tWM1007-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/MERC478-3.mp3\tJohnny Hodges & His Orchestra\tSomething To Pat Your Foot To\tMERCURY\t8937\tC478-3\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE34708.mp3\tLibby Holman And Orch\tSomething To Remember You By\tBRUNSWICK\t4910\tE34708\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLIM3581.mp3\tLester Young Quintet\tSomething To Remember You By\tALLADDIN\t3057\tIM3581\t1947\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC63616-1.mp3\tLeo Reisman & His Orch\tSomething To Remember You By\tVICTOR\t22537\t63616-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/CHAX2795.mp3\tSam Lanin & His Orch\tSomething To Remember You By (vps)\tCHAMPION\t16130\tX2795\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-6465.mp3\tJimmie Noone's Apex Club Orchestra\tSomething To Remember You By ? V M A\tVocalion \t1554\tC-6465\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COL04683-1.mp3\tBert Williams\tSomething You Dont Expect\tCOLUMBIA\tA-0929\t04683-1\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_039.mp3\tMcguire Sisters\tSomething's Gotta Give\tCoral\t61423\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_068.mp3\tSammy Davis Jr.\tSomething's Gotta Give (orchestra Of Sy Oliver)\tDecca\t29484\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_285.mp3\tInk Spots\tSometime\tDECCA\t27102\tL5670\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_295.mp3\tJo Stafford\tSometime\tCapitol\t1053\t6041-4\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_165.mp3\tMariners\tSometime\tCOLUMBIA\t38781\tCO43028\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70310-A.mp3\tMildred Bailey\tSometimes\tDECCA\t4252A\t70310-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU068712-2.mp3\tErskine Hawkins\tSometimes\tBLUEBIRD\t11439\t068712-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D743SIF.mp3\tFats Waller At The Organ\tSometimes I Feel Like A Motherless Child\tV-DISC\t743\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC25374.mp3\tMildred Bailey\tSometimes I Feel Like A Motherless Child\tVOCALION\t5209\t25374\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC071712.mp3\tArtie Shaw And His Orchestra\tSometimes I Feel Like A Motherless Child\tVICTOR\t27806\t071712-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20599-A.mp3\tRoger Wolfe Kahn And His Orch\tSometimes I'm Happy\tVICTOR\t20599A\t38467-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS21613.mp3\tSammy Kaye Swing & Sway Orch\tSometimes I'm Happy\tCBS\tVO3909\t21613\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92546-1.mp3\tBenny Goodman And His Orchestra\tSometimes I'm Happy\tVICTOR\t25090B\t92546-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31903-G.mp3\tRed Nichols & His Orch\tSometimes I'm Happy\tBRUNSWICK\t4701\tE31903-G\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68821-A.mp3\tMildred Bailey\tSometimes I'm Happy\tDECCA\t3755B\t68821-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP558-4A.mp3\tAl Casey's Sextet\tSometimes I'm Happy\tCAPITOL\t\t558-4A\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC25090B.mp3\tBenny Goodman & His Orch\tSometimes I'm Happy\tVICTOR\t25090B\t92546-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_103.mp3\tCharles King And Louise Groody\tSometimes I'm Happy\tVICTOR\t20609\t38601-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480456.mp3\tNat King Cole\tSometimes I'm Happy\tCapitol\tEAP1\t15936-5\t1956\tNat King Cole, P & Vocal, acc. by Stuff Smith (vn), John Collins (g), Charlie Harris (sb), Lee Young (dm)\nhttp://www.jazz-on-line.com/a/mp3c/SIG376-4A.mp3\tAnita O'day & Little Band\tSometimes I'm Happy (from Hit The Deck)\tSIGNATURE\t15222B\t376-4A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28752-1.mp3\tGene Krupa & His Orch\tSomewhere\tOKEH\t5859\t28752-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057648.mp3\tGlenn Miller & His Orch\tSomewhere (vre)\tBLUEBIRD\t10959-A\t057648\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR30006-A.mp3\tGrace Kearns And Harry Mcclasky\tSomewhere A Voice Is Callin\tParamount\t30006-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS26244A.mp3\tJack Teagarden & His Orch\tSomewhere A Voice Is Calling\tCBS\tCO35450\t26244A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_013.mp3\tJohn Mccormack\tSomewhere A Voice Is Calling\tVICTOR\t64405\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2069x.mp3\tNat King Cole\tSomewhere Along The Way\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82535.mp3\tGene Ammons\tSomewhere Along The Way\tDECCA\t28222\t82535\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89001SA.mp3\tIllinois Jacquet & His Orch\tSomewhere Along The Way\tMERCURY\t89001\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon76331.mp3\tJimmie Rodgers\tSomewhere Below The Mason Dixon Line\tMontgomeryWard\t4454\t76331\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20534-7.mp3\tCharles Hart\tSomewhere In France Is Daddy\tVICTOR\t18374\t20534-7\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77393.mp3\tHenry Burr (tenor)\tSomewhere In France Is Lily\tCOLUMBIA\tA-2408\t77393\t1917\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC20880-3.mp3\tCharles Hart\tSomewhere In France Is Lily\tVICTOR\t18409\t20880-3\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_018.mp3\tHenry Burr\tSomewhere In France Is The Lily\tCOLUMBIA\t2408\t77393\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_102.mp3\tCharles Hart\tSomewhere In France Is The Lily\tVICTOR\t18409\t20880-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3r/RiWiz.mp3\tJudy Garland\tSomewhere Over The Rainbow\tWizard of Oz Soundtr\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC023288.mp3\tBunny Berigan & His Orch\tSomewhere With Somebody Else\tVICTOR\t25868B\t023288\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30893.mp3\tXavier Cugat And His Orch\tSon Los Dandis\tCOLUMBIA\t36387\tCO30893\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_123.mp3\tJo Stafford\tSonata\tCapitol\t337\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_107.mp3\tPerry Como Feat. Lloyd Shaffer's Orchestra\tSonata\tRCA Victor\t2033\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/ColLA-2166-C.mp3\tJimmie Lunceford And His Orchestra\tSonata By L. Van Beethoven (pathetique Op. 13)\tColumbia\t35453\tLA-2166-C\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_056.mp3\tMitch Miller\tSong For A Summer Night\tColumbia\t40730\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA3011.mp3\tBing Crosby - J.s.trotter Orch\tSong Of Freedom\tDECCA\t18426B\tDLA3011\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21037-A.mp3\tHilo Hawaiian Orch\tSong Of Hawaii\tVictor\t21037-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL695.mp3\tLee O'daniel Hillbilly Boys\tSong Of Hawaii\tVOCALION\t4656\tDAL695\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC25322-4.mp3\tPaul Whiteman And His Orch\tSong Of India\tVICTOR\t18777B\t25322-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC04533-2.mp3\tTommy Dorsey And His Orch\tSong Of India\tVICTOR\t25523-A\t04533-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_169.mp3\tMario Lanza\tSong Of India\tRCA\t10-4209\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_146.mp3\tTommy Dorsey And His Orchestra\tSong Of India\tVICTOR\t27520\t04533-2\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_357.mp3\tGlen Gray And Casa Loma Orchestra\tSong Of India\tDECCA\t2031A\t62829\t1938\t\nhttp://www.78-tours.net/mp3/COL80020.mp3\tEdwin Dale Orchestra Accompaniment\tSong Of Love - From \"blossom Time\"\tCOLUMBIA\tA3517\t80020\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68158.mp3\tWoody Herman & His Orchestra\tSong Of Old Hawaii\tDECCA\t3427B\t68158\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_035.mp3\tEdwin Dale\tSong Of Persia\tCOLUMBIA\tA-3638\t80309\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC30187-3.mp3\tPaul Whiteman & His Orch\tSong Of Songs\tVICTOR\t19402\t30187-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_167.mp3\tHugo Winterhalter And His Orchestra\tSong Of The Barefoot Contessa\tRCA Victor\t5888\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC4625.mp3\tIsham Jones And His Orch\tSong Of The Blues\tBRUNSWICK\t4595\tC4625\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW149822-2.mp3\tPaul Whiteman And His Orchestra (vocal Bing Crosby)\tSong Of The Dawn\tColumbia\tE CB87\tW149822-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-6196x.mp3\tEddie Fisher\tSong Of The Dreamer\tRCA\t20-6196\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic16687.mp3\tNat M. Wills\tSong Of The English Chappy\tVictor\t16687\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe403681-A.mp3\tLouis Armstrong And His Orch\tSong Of The Islands\tOKeh\t41375\t403681-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA452-A.mp3\tBing Crosby\tSong Of The Islands\tDECCA\t25009\tDLA452-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCW24979-A.mp3\tCount Basie & His Orch\tSong Of The Islands\tVOCALION\t5169\tW24979-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC57253-2.mp3\tWayne King & His Orch\tSong Of The Islands\tVICTOR\t22301B\t57253-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_203.mp3\tBing Crosby\tSong Of The Islands\tDECCA\tDE19016\tDLA452-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24979-A.mp3\tCount Basie And His Orchestra\tSong Of The Islands\tVocalion\t5169\t24979-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D112A.mp3\tU.s. Coast Guard Band (lt. Rudy Vallee Dir.)\tSong Of The Navies Pt. 1\tV-DISC\t112A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D112B.mp3\tU.s. Coast Guard Band (lt. Rudy Vallee Dir.)\tSong Of The Navies Pt. 2\tV-DISC\t112B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_491.mp3\tMitch Miller And His Orchestra\tSong Of The Sparrow\tColumbia\t40772\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403682-C.mp3\tLuis Russell & His Orch\tSong Of The Swanee\tOKeh\t8780\t403682-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/ARA1042-1.mp3\tArt Tatum\tSong Of The Vagabonds\tARA\t4504A\tARA1042-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru1484wpp.mp3\tLouis Armstrong And His Orchestra\tSong Of The Vipers\tBrunswick\t500492\t1484wpp\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU058885.mp3\tGlenn Miller And His Orchestra\tSong Of The Volga Boatmen\tBLUEBIRD\t11029\t058885\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_010.mp3\tGlenn Miller And His Orchestra\tSong Of The Volga Boatmen\tBluebird\t11029\t58885\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC19960-A.mp3\tKirilloff's Russian Balalaika Orchestra\tSong Of The Volga Boatmen\tVICTOR\t19960-A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS22250-1.mp3\tHarry James And His Orch\tSong Of The Wanderer\tCBS\tBR8067\t22250-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU050157.mp3\tErskine Hawkins & His Orch\tSong Of The Wanderer\tBLUEBIRD\t10879\t050157\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64931.mp3\tBob Crosby & His Orch\tSong Of The Wanderer\tDECCA\t2379A\t64931\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC36543-4.mp3\tArt Landry And His Orch\tSong Of The Wanderer\tVICTOR\t20300A\t36543-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-22250-I.mp3\tHarry James And His Orchestra\tSong Of The Wanderer\tBrunswick\t8067\tB-22250-I  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_228.mp3\tErskine Hawkins And His Orchestra\tSong Of The Wanderer\tBLUEBIRD\tB-10879\t050157\t1940\tJimmy Mitchelle (as, vo), Erskine Hawkins, Sam Lowe, Wilbur Bascomb, Marcellus Green (tp), Edward Sims, Robert Range (tb), William Johnson (as), Julian Dash (ts), Heywood Henry (cl, bar), Avery Parrish (p), William McLemore (g), Leemie Stanfield (sb), James Morrison (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1927_100.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra\tSong Of The Wanderer (where Shall I Go?)\tCOLUMBIA\t787 D\tW142777-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/VICOB5200.mp3\tRay Noble And His Orchestra\tSong Without Words\tVICTOR\t24555\tOB5200\t1933\twith Al Bowlly\nhttp://www.jazz-on-line.com/a/mp3d/DECFO-1784-RC.mp3\tDjango Reinhardt Et Son Quintette Du Hot Club De France\tSonge D'automne\tDECCA\t9244\tFO-1784-RC\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D533-A.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tSongs My Mother Taught Me\tV-Disc\t533-A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE250.mp3\tAl Jolson\tSonny Boy\tBRUNSWICK\t4033\tLAE250\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146915-2.mp3\tJan Garber & His Orch\tSonny Boy\tCOLUMBIA\t1550 D\tW146915-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC48134-3.mp3\tGene Austin\tSonny Boy\tVICTOR\t21779\t48134-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_001.mp3\tAl Jolson\tSonny Boy\tBRUNSWICK\t4033\tLAE250\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_240.mp3\tAndrews Sisters\tSonny Boy\tDECCA\t3871\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_148.mp3\tGene Austin Feat. O/nat Shilkret\tSonny Boy\tVICTOR\t21779\t48134-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_063.mp3\tRuth Etting\tSonny Boy\tCOLUMBIA\t1563 D\tW147018-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_162.mp3\tJan Garber And His Orchestra\tSonny Boy\tCOLUMBIA\t1550 D\tW146915-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW140673-1.mp3\tCalifornia Ramblers\tSonya (yup Alay Yup)\tCOLUMBIA\t419D\tW140673-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1071.mp3\tArtie Shaw And His Orchestra\tSoon\tRCA\t20-1742\tD5VB1071\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76835.mp3\tElla Fitzgerald\tSoon\tDECCA\t27371\t76835\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU31885.mp3\tRed Nichols & His Orch\tSoon\tBRUNSWICK\t4695\t31885\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA93.mp3\tBing Crosby And George Stoll\tSoon\tDECCA\t392B\tDLA93\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BruDLA93-A.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tSoon\tBrunswick\tE01994\tDLA93-A \t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_104.mp3\tLes Brown And His Orchestra Feat. Doris Day\tSooner Or Later\tCOLUMBIA\t37153\tHCO1980\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1980.mp3\tLes Brown & His Band\tSooner Or Later (vdoris Day)\tCOLUMBIA\t37153\tHCO1980\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73266.mp3\tAndy Kirk And His Orchestra\tSoothe Me\tDecca\t23870\t73266\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80636-2.mp3\tEddie Cantor\tSophie\tCOLUMBIA\tA-3754\t80636-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13338-A.mp3\tDuke Ellington And His Orch\tSophisticated Lady\tBRUNSWICK\t6600\t13338-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWM1138-A.mp3\tDuke Ellington And Famous Orch\tSophisticated Lady\tCOLUMBIA\t35556\tWM1138-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC067551.mp3\tDinah Shore W Henry Levine\tSophisticated Lady\tVICTOR\t27624\t067551\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2074.mp3\tWillie Smith\tSophisticated Lady\tMERCURY\t2074\t2074\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4533.mp3\tErroll Garner Trio\tSophisticated Lady\tCOLUMBIA\t39615\tHCO4533\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC264.mp3\tBilly Eckstine & His Octet\tSophisticated Lady\tNATIONAL\t\tNSC264\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-3669sl.mp3\tCharlie Ventura's Orch\tSophisticated Lady\tRCA\t20-3669\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU13284-A.mp3\tDon Redman & His Orch\tSophisticated Lady\tBRUNSWICK\t6560\t13284-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBrus.mp3\tDuke Ellington & His Orchestra\tSophisticated Lady\tBrunswick 6600\t\t\t2000\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-13165-A.mp3\tArt Tatum\tSophisticated Lady\tBrunswick\t6553\tB-13165-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_313.mp3\tBilly Eckstine\tSophisticated Lady\tMODERN\tNAT-9049\t302\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_024.mp3\tDuke Ellington And His Famous Orchestra\tSophisticated Lady\tBRUNSWICK\t6600\t13338-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_038.mp3\tGlen Gray And Casa Loma Orchestra\tSophisticated Lady\tVICTOR\t24338\t76382-1\t1933\tJoe Hostetter, Frank Martinez (tp), Pee Wee Hunt, Billy Rauch (tb), Glen Gray (as, ldr), Clarence Hutchinrider (cl, as), Kenny Sargent, Pat Davis (ts), Mel Jenssen (vn), Joe Hall (p), Gene Gifford (bj, g), Stanley Dennis (bb, sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3b/MASL0378-1.mp3\tDuke Ellington Orch\tSophisticated Lady - In A Sentimental Mood\tMASTER\t102\tL0378-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruLO-378-1.mp3\tDuke Ellington\tSophisticated Lady And In A Sentimental Mood\tBrunswick\t7990\tLO-378-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480902.mp3\tAndre Kostelanetz And His Orchestra\tSophisticated Lady And Solitude (medley)\tCOLUMBIA\t7430-M\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13165.mp3\tArt Tatum (piano)\tSophisticated Laldy\tBRUNSWICK\t6553\t13165\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB2167.mp3\tCount Basie & His Orchestra\tSophisticated Swing\tRCA\t20-3255\tD7VB2167\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021169-2.mp3\tBunny Berigan & His Orch\tSophisticated Swing\tVICTOR\t25811A\t021169-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC63299-A.mp3\tEdgar Hayes & His Orchestra\tSophisticated Swing\tDECCA\t1748A\t63299-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE35751.mp3\tAndy Kirk Clouds Of Joy\tSophomore\tBRUNSWICK\t6027\tE35751\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-35751.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tSophomore\tBrunswick\t6027\tE-35751\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402899-B.mp3\tFred Hall & His Sugar Babies\tSophomore Prom\tOKeh\t41310\t402899-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_193.mp3\tJimmy Dorsey And His Orchestra\tSorghum Switch\tDECCA\t18372B\t70811\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68609.mp3\tWoody Herman & His Orchestra\tSorrento\tDECCA\t3630A\t68609\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81664-1.mp3\tBessie Smith\tSorrowful Blues\tCOLUMBIA\t14020 D\t81664-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/PARR-2711x.mp3\tBix Beiderbecke And His Gang\tSorry\tParlophone\tR-2711\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SIL7638.mp3\tFletcher Henderson Orch\tSorry\tSILVERTONE\t1561\t7638\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban7638-3.mp3\tFletcher Henderson's Collegians\tSorry\tBanner\t6154\t7638-3  \t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRO7638.mp3\tEarl Randolph's Orch\tSorry (vharry White)\tBROADWAY\tBD1128\t7638\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_104.mp3\tJean Goldkette And His Orchestra\tSorry And Blue\tVICTOR\t19962\t34392-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT1421.mp3\tJohnny Guarnieri\tSorry I Lost My Head\tMAJESTIC\t1189\tT1421\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_345.mp3\tTony Martin\tSorta On The Border\tRCA\t20-5352\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/Gre3929-B.mp3\tCliff Jackson And His Krazy Kats\tSoubrette\tGrey Gull\t1865\t3929-B\t1830\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480390.mp3\tBen Webster Quintet\tSoulville\tVerve\tMGV8274\t21749-1\t1957\tBen Webster (ts), Oscar Peterson P, Stan Levey, D, Ray Brown, B, Herb Ellis, G\nhttp://www.jazz-on-line.com/a/mp3b/MAJT1129.mp3\tCootie Williams & His Orch\tSound Track\tMAJESTIC\t1150\tT1129\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/EME41886-4.mp3\tEubie Blake (piano)\tSounds Of Africa\tEMERSON\t10434\t41886-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2346-B.mp3\tCount Basie And His Orchestra\tSouth\tRCA\t20-2346-B\tD7VB908\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC42935-1.mp3\tBennie Moten's Kansas City Or.\tSouth\tVICTOR\t38021\t42935-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/MER5879S.mp3\tMuggsy Spanier's Dixielanders\tSouth\tMERCURY\t5879\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe8769.mp3\tBennie Moten Kansas City Orch\tSouth\tOKeh\t8194\t8769\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COLBF-106y.mp3\tXavier Cugat And His Waldorf Asto\tSouth America, Take It Away\tColumbia\tBF-106\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4178.mp3\tBing Crosby And Andrews Sisters\tSouth America, Take It Away\tDECCA\t23569\tL4178\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_061.mp3\tXavier Cugat And His Waldorf-astoria Orchestra (vocal Buddy Clark) Feat. Buddy Clark\tSouth America, Take It Away\tCOLUMBIA\t37051\tCO36397\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO36397.mp3\tXavier Cugat And His Orch\tSouth America, Take It Away (vbuddy Clark)\tCOLUMBIA\t37051\tCO36397\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_237.mp3\tAl Donahue And His Orchestra Feat. V/paula Kelly\tSouth American Way\tVOCALION\t4902\t24701-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480903.mp3\tCarmen Miranda And The Bando Da Lua\tSouth American Way\tDECCA\t23130-A\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC18990-1.mp3\tKid Prince Moore\tSouth Bound Blues\tARC\t(Reject)\t18990-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU041153.mp3\tShep Fields Rippling Rhythm\tSouth Of The Border\tBLUEBIRD\t10376\t041153\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66638.mp3\tGuy Lombardo's Royal Canadians\tSouth Of The Border\tDECCA\t2768A\t66638\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_287.mp3\tTony Martin\tSouth Of The Border\tDECCA\t28992\t66669\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_165.mp3\tAmbrose And His Orchestra Feat. Denny Dennis\tSouth Of The Border (down Mexico Way)\tDECCA\t2732B\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_185.mp3\tGene Autry\tSouth Of The Border (down Mexico Way)\tVocalion\t5122\tWC2696-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_004.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. Hal Derwin\tSouth Of The Border (down Mexico Way)\tBLUEBIRD\t10376\t041153\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA1090.mp3\tBob Crosby And His Bobcats\tSouth Rampart Street Parade\tDECCA\t15038A\tDLA1090\t1937\t\nhttp://www.78-tours.net/mp3/VOG55V5043.mp3\tSidney Bechet Andr Rwliotty Et Son Orchestre\tSouth Rampart Street Parade\tVOGUE\tV. 5194\t55 V. 5043\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO41845.mp3\tJimmy Dorsey Dixielanders\tSouth Rampart Street Parade\tCOLUMBIA\t38657\tCO41845\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA229.mp3\tAndy Iona's Novelty Four\tSouth Sea Island Magic\tCOLUMBIA\t3138 D\tLA229\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU19667-1.mp3\tArtie Shaw And His Orchestra\tSouth Sea Island Magic\tBRUNSWICK\t7721\tB-19667-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA522-A.mp3\tBing Crosby And Dick Mcintyre\tSouth Sea Island Magic\tDECCA\t886B\tDLA522-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA522-B.mp3\tDick Mcintyre And His Harmony Hawaiians With Bing Crosby\tSouth Sea Island Magic\tDECCA\t\tDLA522-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA522-A.mp3\tDick Mcintyre And His Harmony Hawaiians With Bing Crosby\tSouth Sea Island Magic\tDECCA\t25010\tDLA522-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC54482-6.mp3\tGeorge Olsen & His Music\tSouth Sea Rose (v E S)\tVICTOR\t22213B\t54482-6\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU063332.mp3\tEarl Hines & His Orch\tSouth Side\tBLUEBIRD\t11237\t063332\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D209B2.mp3\tVaughn Monroe\tSouth Side\tV-DISC\t209B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu063332-1.mp3\tEarl Hines And His Orchestra\tSouth Side\tBluebird\tB-11237\t063332-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Benny Harris (tp) Joe McLewis, George Hunt, Edward Fant (tb) Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck\nhttp://www.jazz-on-line.com/a/mp3w/1942_189.mp3\tConnee Boswell\tSouth Wind\tDECCA\t18413\t70876\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLC4395.mp3\tCurly Williams Peachpickers\tSouthern Belle\tCOLUMBIA\t20005\tC4395\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151904-1.mp3\tBlind Sammie (w.mctell)\tSouthern Can Is Mine\tCOLUMBIA\t14632 D\tW151904-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64234.mp3\tBob Howard & His Orch\tSouthern Casey Jones\tDECCA\t1958B\t64234\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5284.mp3\tJoe Marsala Septet\tSouthern Comfort\tMUSICRAFT\t328\t5284\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68290.mp3\tBuddy Johnson & His Band\tSouthern Echoes\tDECCA\t8518\t68290\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70101.mp3\tLionel Hampton & His Orch.\tSouthern Echoes\tDECCA\t18285B\t70101\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70101-A.mp3\tLionel Hampton And His Orchestra\tSouthern Echoes\tDecca\t18285\t70101-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69118-A.mp3\tBuddy Johnson & His Band\tSouthern Exposure\tDECCA\t8562\t69118-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu56129.mp3\tCharlie Barnet & His Orch\tSouthern Fried\tBluebird\t10944\t56129\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW91791-1.mp3\tPaul Whiteman And His Orchestra (bing Crosby Solo)\tSouthern Medley\tColumbia\ttest\tW91791-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D42B2.mp3\tGoldman Band\tSouthern Melodies\tv-disk\t42B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR20123-1.mp3\tBlind Blake\tSouthern Rag\tPARAMOUNT\t12565\t20123-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/PARG15667.mp3\tBlind Lemon Jefferson\tSouthern Woman Blues\tPARAMOUNT\t12899A\tG15667\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046059.mp3\tCharlie Barnet & His Orch\tSouthland Shuffle\tBLUEBIRD\t10602\t046059\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC71933-2.mp3\tJoe Sanders (piano)\tSouthology\tVICTOR\t24033\t71933-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu063332-1.mp3\tEarl Hines And His Orchestra\tSouthside (fj Arr)\tBluebird\tB-11237\t063332-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDTB3527.mp3\tQuintet Of Hot Club Of France\tSouvenirs\tDECCA\t23065B\tDTB3527\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDTB-3527-1.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tSouvenirs\tDECCA\tF-6639\tDTB-3527-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC29933-5.mp3\tPaul Whiteman & His Orch\tSpain\tVICTOR\t19330\t29933-5\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC119-120.mp3\tIsham Jones & His Orch\tSpain\tBRUNSWICK\t2600\tC119-120\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67173.mp3\tBob Crosby's Bobcats\tSpain\tDECCA\t3248B\t67173\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/COL81755-2.mp3\tLeo Reisman & His Orch\tSpain\tCOLUMBIA\t134D\t81755-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480776.mp3\tBen Webster Quintet\tSpang\tHaven\t805\th-1940\t1946\tBen Webster (ts), Al Haig (p), Bill De Arango (g), John Simmons (sb), Sid Catlett (dm)\nhttp://www.jazz-on-line.com/a/mp3c/COLW142417-1.mp3\tDoc Cook's Dreamland Orch\tSpanish Mama\tCOLUMBIA\t727 D\tW142417-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe73893-B.mp3\tClarence Williams Stompers\tSpanish Shawl\tOKeh\t40541\t73893-B\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Har141301-2.mp3\tThe Dixie Stompers\tSpanish Shawl\tHarmony\t70-H\t141301-2  \t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4241.mp3\tTexas Jim Lewis\tSpanish Two Step\tDECCA\t46015\tL4241\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM48S462.mp3\tJerry And Sky\tSparkling Brown Eyes\tMGM\t10400\t48S462\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45033-1.mp3\tGuy Mitchell\tSparrow In The Tree Top\tCOLUMBIA\t39190\tCO45033-1\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_277.mp3\tRex Allen Orch Harry Geller\tSparrow In The Tree Top\tMercury\t5597\t4090-C\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_051.mp3\tGuy Mitchell\tSparrow In The Tree Top\tCOLUMBIA\t39190\tCO45033-1\t1951\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67476.mp3\tBob Crosby & His Orch\tSpeak Easy\tDECCA\t3179B\t67476\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18573A.mp3\tGuy Lombardo And His Orch\tSpeak Low (from 'one Touch Of Venus')\tDECCA\t18573A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D154A1.mp3\tFrank Sinatra\tSpeak Low, Speak Love\tV-DISC\t154A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_070.mp3\tLucienne Boyer\tSpeak To Me Of Love (parlez-moi D'amour)\tCOLUMBIA\tDF-61\tL2177\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VocE-28185-B.mp3\tKing Oliver\tSpeakeasy Blues\tVocalion\t1225\tE-28185-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU17684-1.mp3\tLeo Reisman And His Orch\tSpeaking Confidentially\tBRUNSWICK\t7483\t17684-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon042926.mp3\tGlenn Miller & His Orch\tSpeaking Of Heaven\tMontgomeryWard\t8644\t042926\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29869.mp3\tCab Calloway & His Orch\tSpecial Delivery\tOKEH\t6147\t29869\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC055061-1.mp3\tArtie Shaw And His Gramercy Five\tSpecial Delivery Stomp\tVICTOR\t26762A\t055061-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055061-1.mp3\tArtie Shaw And His Gramercy Five\tSpecial Delivery Stomp\tVictor\t26762\t055061-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/MER8951S.mp3\tIllinois Jacquet & His Orch\tSpeedliner\tMERCURY\t8951\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_130.mp3\tCadillacs\tSpeedoo\tJosie\t785\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82231.mp3\tColeman Hawkins & His Orch\tSpellbound\tDECCA\t28311\t82231\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_136.mp3\tGlen Gray And Casa Loma Orchestra\tSpellbound\tBRUNSWICK\t6910\t15187\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC12430-A.mp3\tWashboard Rhythm Kings\tSpider Crawl\tVOCALION\t1734\t12430-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN11719-4.mp3\tBilly Banks & His Rhythmakers\tSpider Crawl (vbb)\tBANNER\t32459\t11719-4\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145783-2.mp3\tBessie Smith\tSpider Man Blues\tCOLUMBIA\t14324 D\tW145783-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401488-B.mp3\tMississippi John Hurt\tSpike Driver Blues\tOKeh\t8692\t401488-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_126.mp3\tGaylords\tSpinning A Web\tMERCURY\t70112\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_040.mp3\tConway's Band\tSpirt Of Independence March\tVICTOR\t18559B\t12223-4\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/COL16701.mp3\tMills' Blue Rhythm Band\tSpitfire\tCOLUMBIA\t3020 D\t16701\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-16701-1.mp3\tMills Blue Rhythm Band\tSpitfire\tColumbia\t3020-D\tCO-16701-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE27196-1.mp3\tSlim & Slam\tSploghm\tOKEH\t5619\t27196-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COMR2560.mp3\tJelly Roll Morton (piano)\tSporting House Rag\tCOMMODORE\t-R\tR2560\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/ComR-2560.mp3\tJelly-roll Morton\tSporting House Rag\tCommodore\tXFL-14942\tR-2560\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD6VB1309.mp3\tColeman Hawkins 52nd St Allst\tSpotlite\tRCA\t40-0131\tD6VB1309\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/GRE1156.mp3\tBenny Krueger And His Orch\tSpread Yo' Stuff\tGREYGULL\t1046\t1156\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO37999.mp3\tSidney Bechet & Bob Wilbur\tSpreadin' Joy\tCOLUMBIA\t38320\tCO37999\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC98174-1.mp3\tFats Waller And His Rhythm\tSpreadin' Rhythm Around\tVICTOR\t25211\t98174-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60454.mp3\tBob Howard & His Orch\tSpreadin' Rhythm Around\tDECCA\t720B\t60454\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06418-1.mp3\tFats Waller And His Rhythm\tSpring Cleaning\tVICTOR\t25554\t06418-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62037.mp3\tBob Howard & His Orch\tSpring Cleaning\tDECCA\t1195\t62037\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44028.mp3\tErroll Garner Trio\tSpring Is Here\tCOLUMBIA\t39167\tCO44028\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI10907.mp3\tBilly Jones And Ernest Hare\tSpring Is Here\tEDISON\t51741\t10907\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic023750-1.mp3\tMaxine Sullivan With Claude Thornhill And Orchestra\tSpring Is Here\tVictor\t25894\t023750-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_353.mp3\tBuddy Clark\tSpring Is Here\tVOCALION\t4191\t23095\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30882.mp3\tXavier Cugat And His Orch\tSpring Song\tCOLUMBIA\t36385\tCO30882\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/KEY513.mp3\tPaul Robeson\tSpring Song\tKEYNOTE\t513\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_250.mp3\tMorton Downey Feat. O/jimmy Lytell\tSpring Will Be A Little Late This Year\tDecca\t18607\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh142.mp3\tGeraldo And His Orchestra\tSpring Will Be A Little Late This Year (v Johnny Green)\tParlophone\tF-2047\tCE-11283-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU060916.mp3\tGlenn Miller & His Orch\tSpring Will Be So Sad\tBLUEBIRD\t11095\t060916\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061346.mp3\tJohnny Hodges & His Orch\tSquatty Roo\tBLUEBIRD\t11447B\t061346\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8940SR.mp3\tOscar Peterson\tSquatty Roo\tMERCURY\t8940\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480610.mp3\tAhmad Jamal\tSquatty Roo\tArgo\tLP-636\t9032\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3a/BLU041528-1.mp3\tFats Waller And His Rhythm\tSqueeze Me\tBLUEBIRD\t10405\t041528-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62739.mp3\tChick Webb & His Orchestra\tSqueeze Me\tDECCA\t1716B\t62739\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/SIGT1901.mp3\tEddie Condon Barrelhouse Gang\tSqueeze Me\tSIGNATURE\t28130\tT1901\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU003SM.mp3\tCliff Jackson's Qt\tSqueeze Me\tBLUENOTE\tBN003\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31944.mp3\tLouisiana Rhythm Kings\tSqueeze Me\tBRUNSWICK\t4953\tE31944\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72312.mp3\tJames Pete Johnson\tSqueeze Me\tDECCA\t23596\t72312\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1020-A.mp3\tBob Crosby & His Orchestra\tSqueeze Me\tDECCA\t3339B\tDLA1020-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/SIGF-1003.mp3\tEarl Hines Trio\tSqueeze Me\tSIGNATURE\t28109\tF-1003\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/SigF-1003.mp3\tEarl Hines Trio\tSqueeze Me\tSignature\t28109\tF-1003\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-31944.mp3\tLouisiana Rhythm Kings\tSqueeze Me\tBrunswick\t4953\tE-31944\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/BlaHS1207.mp3\tCliff Jackson\tSqueeze Me\tBlack & White\t3\tHS1207\t1944\tWALLER - WILLIAMS\nhttp://www.jazz-on-line.com/a/mp3a/CAP2596x.mp3\tStan Freberg\tSt George And The Dragonet\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/ASC3582x.mp3\tJosh White\tSt James Infirmary\tASCH\t3582\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU58527-3.mp3\tKing Oliver And His Orch\tSt James Infirmary\tBLUEBIRD\t5466\t58527-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE35882-A.mp3\tCab Calloway And His Orchestra\tSt James Infirmary\tBRUNSWICK\t6105\tE35882-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE402225-A.mp3\tLouis Armstrong's Hot Five\tSt James Infirmary\tOKeh\t8657\t402225-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3608x.mp3\tPhil Harris\tSt James Infirmary\tRCA\t20-3608\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/HARCO38291.mp3\tHot Lips Page\tSt James Infirmary\tHARMONY\tHa1069\tCO38291\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2414.mp3\tJack Teagarden & His Orch\tSt James Infirmary\tDECCA\t3844A\tDLA2414\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/QRS2002-3.mp3\tCarl Fenton's New Yorkers\tSt James Infirmary\tQRS\t1023\t2002-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC068195.mp3\tArtie Shaw And His Orchestra\tSt James Infirmary - Part 1\tVICTOR\t27895\t068195-1-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC068196.mp3\tArtie Shaw And His Orchestra\tSt James Infirmary - Part 2\tVICTOR\t27895\t068196-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU11711-A.mp3\tMills Bros\tSt Louis Blues\tBRUNSWICK\t6330\t11711-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COL140241-1.mp3\tBessie Smith\tSt Louis Blues\tCOLUMBIA\t14064 D\t140241-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79124-4.mp3\tMarion Harris\tSt Louis Blues\tCOLUMBIA\tA-2944\t79124-4\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe403495.mp3\tLouis Armstrong And His Orch\tSt Louis Blues\tOKeh\t41350\t403495-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17646-2.mp3\tBoswell Sisters\tSt Louis Blues\tARC\tBR7467\t17646-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC97748-1.mp3\tBenny Goodman And His Orchestra\tSt Louis Blues\tVICTOR\t25411\t97748-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE33355-A.mp3\tCab Calloway & His Orchestra\tSt Louis Blues\tBRUNSWICK\t4936\tE33355-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC25412-2.mp3\tOriginal Dixieland Jazz Band\tSt Louis Blues\tVICTOR\t18772\t25412-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO880.mp3\tCount Basie & His Rhythm\tSt Louis Blues\tCOLUMBIA\t36711\tHCO880\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/MERC726-3.mp3\tGene Krupa's Jazz Trio\tSt Louis Blues\tMERCURY\t8983\tC726-3\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP6410.mp3\tEddie Heywood\tSt Louis Blues\tCOLUMBIA\t39317\tZSP6410\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3334-A.mp3\tDon Byas Quartet\tSt Louis Blues\tSAVOY\t626B\tS3334-A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23516-3.mp3\tMildred Bailey & Her Orchestra\tSt Louis Blues\tVOCALION\t4801\t23516-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC58590-2.mp3\tRudy Vallee & His Ct.yankees\tSt Louis Blues\tVICTOR\t22321B\t58590-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN044SLB.mp3\tSidney Bechet Bluenote Jazzmen\tSt Louis Blues\tBLUENOTE\tBN044\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC38408-B.mp3\tDorsey Brothers' Orchestra\tSt Louis Blues\tDECCA\t119B\t38408-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2068-A.mp3\tArt Tatum\tSt Louis Blues\tDECCA\t8550\tDLA2068-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-2944.mp3\tMarion Harris\tSt Louis Blues\tCOLUMBIA\tA-2944\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_111.mp3\tCab Calloway And His Orchestra\tSt Louis Blues\tBRUNSWICK\t4936\tE33355-A\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh067.mp3\tBilly Cotton And His Band\tSt Louis Blues\tRegal Zonophone\tMR-1413\tCAR-2799-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/ARCB11263-A.mp3\tDuke Ellington And His Orch\tSt Louis Blues (vbc)\tARC\tBR20105\tB11263-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM53S309.mp3\tBilly Eckstine\tSt Louis Blues (vocal Billy Eckstine)\tMGM\t11573\t53S309\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2722-x.mp3\tTex Beneke And His Orch\tSt Louis Blues March\tRCA\t20-2722\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB887.mp3\tCount Basie & His Orchestra\tSt Louis Boogie\tRCA\t20-2694\tD7VB887\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81231-3.mp3\tBessie Smith\tSt Louis Gal\tCOLUMBIA\t13005 D\t81231-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC38496-2.mp3\tFletcher Henderson And His Orch\tSt Louis Shuffle\tVICTOR\t20944A\t38496-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030846.mp3\tSpeckled Red Trio\tSt Louis Stomp\tBLUEBIRD\t7985\t030846\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68905.mp3\tLouis Jordan & His Tympani 5\tSt Vitus Dance\tDECCA\t8581\t68905\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_010.mp3\tStan Freberg Feat. Daws Butler And June Foray (talking)\tSt. George And The Dragonet\tCapitol\t2596\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_034.mp3\tCab Calloway And His Orchestra\tSt. James Infirmary\tBrunswick\t6105\tE-35882-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480725.mp3\tJack Teagarden's Big Eight\tSt. James Infirmary\tHRS\t2006\tR3414\t1940\tRex Stewart (co), Jack Teagarden (tb, vo), Barney Bigard (cl), Ben Webster (ts), Billy Kyle (p), Brick Fleagle (g), Billy Taylor Sr. (sb), Dave Tough (dm)\nhttp://www.jazz-on-line.com/a/mp3e/BruB-13163-A.mp3\tArt Tatum\tSt. Louis Blues\tBrunswick\t6543\tB-13163-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22321-B.mp3\tRudy Valle And His Connecticut Y\tSt. Louis Blues\tVictor\t22321-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77469.mp3\tFranck ''big Boy'' Goudie (with Django Reinhardt)\tSt. Louis Blues\tUltraphone\tAP-1527\tP-77469\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru1478wpp.mp3\tLouis Armstrong And His Orchestra\tSt. Louis Blues\tBrunswick\t500490\t1478wpp\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru1483wpp.mp3\tLouis Armstrong And His Orchestra\tSt. Louis Blues\tBrunswick\t500490\t1483wpp\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_164.mp3\tCab Calloway And His Orchestra\tSt. Louis Blues\tBrunswick\t4936\tE-33355-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_118.mp3\tLouis Armstrong\tSt. Louis Blues\tOKeh\t41350\t403495-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic59720-1.mp3\tThomas Waller - Bennie Paine\tSt. Louis Blues\tVictor\t22371\t59720-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_155.mp3\tRudy Vallee And His Connecticut Yankees\tSt. Louis Blues\tVICTOR\t22321\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic023752-1.mp3\tMaxine Sullivan With Claude Thornhill And Orchestra\tSt. Louis Blues\tVictor\t25895\t023752-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_212.mp3\tBoswell Sisters\tSt. Louis Blues\tBRUNSWICK\t7467\t17646-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Ton1065-B.mp3\tMiss Valaida Med Winstrup Olesens Swingband\tSt. Louis Blues\tTono\t21166\t1065-B\t1940\tValaida Snow t v acc. by W nstrup Olesen t dir. Kai Moeller cl, Leo Mathiesen p, Helge Jacobsen g, Christian Jensen b, Kai Fischer d\nhttp://www.jazz-on-line.com/a/mp3h/Vic49007-2.mp3\tWarren Mills And His Blues Serenaders\tSt. Louis Blues\tVictor\t35962\t49007-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_291b.mp3\tBilly Eckstine Feat. Metronome All-stars\tSt. Louis Blues\tMGM\t11573\t53S309\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_007.mp3\tMarion Harris\tSt. Louis Blues\tCOLUMBIA\tA-2944\t79124-4\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_103.mp3\tW.c. Handy's Orchestra\tSt. Louis Blues\tOKeh\t4896\tS71350\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh180.mp3\tAmbrose And His Orchestra\tSt. Louis Blues (v Anne Shelton)\tDecca\tF-7892\tDR-5792-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/EDI7000-A.mp3\tAl Bernard - O\tSt. Louis Blues - Foxtrot (will C. Handy)\tEDISON\tBA 3930\t7000-A\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D65-B.mp3\tCaptain Glenn Miller And The 418th Aaftc Marching Band\tSt. Louis Blues March\tV-Disc\t65-B\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_038.mp3\tTex Beneke And His Orchestra\tSt. Louis Blues March\tRCA Victor\t2722\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9254.mp3\tOriginal Memphis Five\tSt. Louis Gal - Blues Foxtrot\tEDISON\t\t9254\t\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR142490-3.mp3\tUniversity Six\tSt. Louis Hop\tHARMONY\t245-H\t142490-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_030.mp3\tVess Ossman\tSt. Louis Rag\tColumbia\t32576\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBan1908s.mp3\tJack Pettis & His Band\tSt. Louis Shuffle\tBanner\t1908\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-19299-1.mp3\tMills Blue Rhythm Band\tSt. Louis Wiggle Rhythm\tColumbia\t3135-D\tCO-19299-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480391.mp3\tArt Farmer Quartet\tStablemates\tContemporary\tC3554\t\t1958\tArt Farmer (tp) Hank Jones (p) Addison Farmer (b) Roy Haynes (d)\nhttp://www.jazz-on-line.com/a/mp3a/COL100593.mp3\tCliff  Edwards\tStack O Lee Blues\tCOLUMBIA\tHA1408\t100593\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401481-B.mp3\tMississippi John Hurt\tStack O Lee Blues\tOKeh\t8654\t401481-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/OKE80547-C.mp3\tJack Linx Birmingham Serenaders\tStack O Lee Blues\tOKEH\t\t80547-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA1663.mp3\tSol Hoopii\tStack O' Lee Blues\tDECCA\t2241B\tDLA1663\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11018-1.mp3\tCab Calloway And His Orchestra\tStack O' Lee Blues\tBanner\t32378\t11018-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN11018-1.mp3\tCab Calloway & His Orch\tStack O' Lee Blues (vcc)\tBANNER\t32378\t11018-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COL100594.mp3\tCliff  Edwards\tStack O' Lee Pt.2\tCOLUMBIA\tHA1408\t100594\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC63193.mp3\tJohnny Dodds Chicago Boys\tStack O'lee Blues\tDECCA\t1676\t63193\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE80350-A.mp3\tFrank Hutchinson\tStackalee\tOKEH\t45106\t80350-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon036878.mp3\tGlenn Miller & His Orch\tStairway To The Stars\tMontgomeryWard\t8371\t036878\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVU1332.mp3\tGene Ammons\tStairway To The Stars\tSAVOY\t4528\tU1332\t1953\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC65904.mp3\tElla Fitzgerald And Her Orch\tStairway To The Stars\tDECCA\t2598A\t65904\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/KEY648y.mp3\tArnold Ross Qt\tStairway To The Stars\tKEYNOTE\t648\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_059.mp3\tKay Kyser And His Orchestra\tStairway To The Stars\tCBS\tBR8381\t24455-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/BruLA1893.mp3\tMartha Raye With Dave Rose Orchestra \tStairway To The Stars \tBrunswick\t8394\tLA1893\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_115.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly\tStairway To The Stars\tDECCA\t2567A\t65837\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65904-A.mp3\tElla Fitzgerald And Her Famous Orchestra\tStairway To The Stars\tDecca\t2598\t65904-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/RCAD7VB-0517.mp3\tErroll Garner\tStairway To The Stars \tRCA\t20-4723\tD7VB-0517\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/RCAE4VH-0793-b.mp3\tDick Collins And The Runaway Herd Formerly Of Woody Herman Orchestra\tStairway To The Stars\tRCA VICTOR\t547-0460\tE4VH-0793-b\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU036878.mp3\tGlenn Miller And His Orch\tStairway To The Stars (vr.eberle)\tBLUEBIRD\t10276\t036878\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VocB-20857-2.mp3\tFletcher Henderson And His Orchestra\tStampede\tVocalion\t3534\tB-20857-2  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29247-1.mp3\tCount Basie And His Orchestra\tStampede In G Minor\tOkeh\t5987\t29247-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS36126.mp3\tStan Getz All Stars\tStan Gets Along\tSAVOY\t966A\tS36126\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS36127.mp3\tStan Getz All Stars\tStan's Mood\tSAVOY\t966B\tS36127\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70223-A.mp3\tBuddy Johnson & His Band\tStand Back And Smile\tDECCA\t8632\t70223-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic037615-1.mp3\tLionel Hampton And His Orchestra\tStand By! For Further Announcements (and For More Good News)\tVictor\t26296\t037615-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe402009-B.mp3\tUncle Bud Walker\tStand Up Suitcase Blues\tOKeh\t8828\t402009-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145670-1.mp3\tBessie Smith\tStandin' In The Rain Blues\tCOLUMBIA\t14338 D\tW145670-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_311.mp3\tMills Brothers\tStanding On The Corner\tDecca\t29897\tL9061\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_026.mp3\tFour Lads\tStanding On The Corner\tColumbia\t40674\tCO55538\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_177.mp3\tDean Martin\tStanding On The Corner\tCapitol\t3414\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO37355.mp3\tGene Krupa & His Orch\tStar Burst\tCOLUMBIA\t37539\tCO37355\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/DECAM401-1.mp3\tColeman Hawkins\tStar Dust\tDECCA\t18251\tAM401-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC38544-A.mp3\tJimmie Lunceford And His Orchestra\tStar Dust\tDECCA\t369B\t38544-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27230.mp3\tArtie Shaw And His Orchestra\tStar Dust\tVictor\t27230\t055097-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_184.mp3\tLouis Armstrong\tStar Dust\tOKeh\t41530\t405061-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC055158.mp3\tTommy Dorsey And His Orch\tStar Dust\tVICTOR\t27233\t055158\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW405061-1.mp3\tLouis Armstrong & His Orch\tStar Dust\tCOLUMBIA\t37808\tW405061-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU010653.mp3\tFats Waller (piano Solo)\tStar Dust\tBLUEBIRD\t10099A\t010653\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5838.mp3\tErroll Garner Trio\tStar Dust\tSAVOY\t577A\tS5838\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC63298-A.mp3\tEdgar Hayes & His Orchestra\tStar Dust\tDECCA\t1882A\t63298-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-731-1.mp3\tDjango Reinhardt\tStar Dust\tGramophone\tK-7645\tOLA-731-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/RAD25718-A.mp3\tJack Jenney And His Orchestra\tStar Dust\tRADIO COPY\t25278-A\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1734.mp3\tBing Crosby\tStar Dust\tDECCA\t2374B\tDLA1734\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC27233.mp3\tFrank Sinatra With Tommy Dorsey\tStar Dust\tVICTOR\t27233\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC38427-C.mp3\tArt Tatum\tStar Dust\tDECCA\t306A\t38427-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_067.mp3\tBing Crosby\tStar Dust\tDECCA\t2374B\tDLA1734\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_145.mp3\tJimmie Lunceford And His Orchestra\tStar Dust\tDECCA\t369B\t38544-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-16026-A.mp3\tLouis Prima And His New Orleans Gang\tStar Dust\tBrunswick\t7335\tB-16026-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_174.mp3\tTommy Dorsey And His Orchestra\tStar Dust\tVICTOR\t27520\t055158\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_066.mp3\tTommy Dorsey Orch V Frank Sinatra And Pied Pipers\tStar Dust\tVICTOR\t27233\t055158\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_114.mp3\tTommy Dorsey And His Orchestra Feat. V/edythe Wright\tStar Dust\tVICTOR\t25320A\t99949-5\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Cro1231-3.mp3\tFletcher Henderson And His Orchestra\tStar Dust\tCrown\t3093\t1231-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_115.mp3\tBaron Elliott And His Stardust Melodies Orchestra Feat. Stardust Trio\tStar Dust\tMUSICRAFT\t15010\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_034.mp3\tBenny Goodman And His Orchestra\tStar Dust\tVICTOR\t25320B\t100379-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480549.mp3\tArt Tatum\tStar Dust\tClef\tEP-C-352\t1446-1\t1953\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3t/TS480720.mp3\tBen Webster & Duke Ellington (live)\tStar Dust\tPalm Club\tP30-11\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC055097.mp3\tArtie Shaw And His Orchestra\tStar Dust (polvillo De Estrellas)\tVICTOR\t27230-A\t055097-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/CON10589-2.mp3\tMills Blue Rhythm Band\tStar Dust (v C B)\tCONQUEROR\t7865\t10589-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh184.mp3\tThe Six Swingers, Dir. By George Scott Wood\tStar Dust (v Marjorie Stedeford)\tRegal Zonophone\tMR-1771\tCAR-3495-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban10589-2.mp3\tBlue Ribbon Boys\tStar Dust ? V G B\tBanner\t32166\t10589-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC1239.mp3\tMary Lou Williams Orch\tStar Dust Part 1\tASCH\t1005\t1239\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC1235.mp3\tMary Lou Williams Orch\tStar Dust Part 2\tASCH\t1005\t1235\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/MER11087.mp3\tCharile Parker And His Orchestra\tStar Eyes\tMERCURY\t11087\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3216.mp3\tJimmy Dorsey's Orch\tStar Eyes\tDECCA\t18571B\tL3216\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D174A.mp3\tJimmy Dorsey And His Orchestra\tStar Eyes\tV-DISC\t174A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_027.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly And Kitty Kallen\tStar Eyes\tDECCA\t18571B\tL3216\t1944\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480592.mp3\tArt Pepper\tStar Eyes\tContemporary\tC3532\t\t1957\tArt Pepper (as), Red Garland, P, Philly Jo Jones, D, Paul Chambers, B\nhttp://www.jazz-on-line.com/a/mp3r/RiVic87247.mp3\tGeraldine Farrar\tStar Spangled Banner\tVictor Red Seal\t87247\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic45135.mp3\tReinald Werrenrath\tStar Spangled Banner\tVictor\t45135\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC4015-1.mp3\tCharlie Spivak & His Orch\tStardreams\tOKEH\t6632\tC4015-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke6546.mp3\tCharlie Spivak & His Orchestra\tStardreams\tOkeh\t6546\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC5753-A.mp3\tIsham Jones And His Orch\tStardust\tBRUNSWICK\t4856\tC5753-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24484.mp3\tHoagy Carmichael\tStardust\tVictor\t24484\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC78842-1.mp3\tHoagy Carmichael (piano)\tStardust\tVICTOR\t24484\t78842-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151885.mp3\tLouis Armstrong & His Orch\tStardust\tCOLUMBIA\t2574 D\tW151885\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP575.mp3\tColeman Hawkins & His Orch\tStardust\tCAPITOL\t\t575\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE37087.mp3\tBing Crosby\tStardust\tBRUNSWICK\t6169\tE37087\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10865-1.mp3\tCab Calloway & His Orchestra\tStardust\tBANNER\t32295\t10865-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22988.mp3\tSammy Kaye Swing & Sway Orch\tStardust\tCBS\tVO4433\t22988\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MERC728-1.mp3\tGene Krupa's Jazz Trio\tStardust\tMERCURY\t8983\tC728-1\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16026-A.mp3\tLouis Prima's New Orleans Gang\tStardust\tBRUNSWICK\t7335\t16026-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC67517-2.mp3\tWayne King & His Orch\tStardust\tVICTOR\t24509A\t67517-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT1427.mp3\tJohnny Guarnieri\tStardust\tMAJESTIC\t1226\tT1427\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D65-A.mp3\tCaptain Glenn Miller And The 418th Aaftc Orchestra\tStardust\tV-Disc\t65-A\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055097-1.mp3\tArtie Shaw And His Orchestra\tStardust\tVictor\t27230\t055097-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban10865-1.mp3\tCab Calloway And His Orchestra\tStardust\tBanner\t32295\t10865-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/KeyHL-27.mp3\tCharlie Shavers Quintet\tStardust\tKeynote\t1305\tHL-27\t1944\tCharlie Shavers t, Tab Smith as, Earl Hines p,Al Lucas b, Jo Jones d\nhttp://www.jazz-on-line.com/a/mp3h/DAN478373.mp3\tLes Brown And His Band Of Renown\tStardust\tCAPITOL\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478372.mp3\tAlec Templeton\tStardust\tVICTOR\t\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480787.mp3\tJohnny Otis And His Orchestra\tStardust\tVerve\t824836-2\t4719-1\t1951\tDon Johnson, Gerald Wilson, tp; John Pettigrew, George Washington, tb; Floyd Turnham, as; Ben Webster, Lorenzo Holden, ts; Curtis Lowe, bs; Devonia Williams, p; Johnny Otis, vib; Pete Lewis, g; Mario Delargarde, b; Leard Bell, d\nhttp://www.jazz-on-line.com/a/mp3h/DH480904.mp3\tAndre Kostelanetz And His Orchestra\tStardust\tCOLUMBIA\t7428-M\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011353.mp3\tTommy Dorsey & Clambake 7\tStardust On The Moon\tVICTOR\t25630\t011353\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62515-A.mp3\tWoody Herman & His Orchestra\tStardust On The Moon\tDECCA\t1385\t62515-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_146.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tStardust On The Moon\tVICTOR\t25630\t011353\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU11291-A.mp3\tBing Crosby\tStarlight\tBRUNSWICK\t6259\t11291-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047070.mp3\tGlenn Miller & His Orch\tStarlight And Music (vre)\tBLUEBIRD\t10684\t047070\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/COL80788.mp3\tPaul Specht And His Orchestra\tStarlight Bay\tCOLUMBIA\tA-3830\t80788\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67121.mp3\tElla Fitzgerald And Her Orch\tStarlit Hour\tDECCA\t2988A\t67121\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038138.mp3\tGlenn Miller & His Orch\tStarlit Hour (vre)\tBLUEBIRD\t10553\t038138\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-12345-A.mp3\tDuke Ellington And His Famous Orchestra\tStars\tBrunswick\tA-9331\tB-12345-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1021x.mp3\tGordon Macrae\tStars And Stripes\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1417-1.mp3\tFrankie Trumbauer Orch\tStars And Stripes Forever\tVARSITY\t8253\tUS1417-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D31B.mp3\tArturo Toscanini & The Nbc Symphony\tStars And Stripes Forever\tv-disk\t31B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic16777.mp3\tSousa's Band\tStars And Stripes Forever\tVictor\t16777\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3900.mp3\tJudy Canova And Riders Of Sage\tStars And Stripes On Iwo Jima\tDECCA\t23447A\tL3900\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH1366.mp3\tBob Wills And His Texas Playboys\tStars And Stripes On Iwo Jima\tOKEH\t6742\tH1366\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_184.mp3\tAmes Brothers Feat. O/roy Ross\tStars Are The Windows Of Heaven\tCORAL\t60209\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC38444.mp3\tGuy Lombardo's Royal Canadians\tStars Fell On Alabama\tDECCA\t104A\t38444\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC84439.mp3\tRichard Himber And His Orch\tStars Fell On Alabama\tVICTOR\t24745\t84439\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT986.mp3\tJohnny Guarnieri Trio\tStars Fell On Alabama\tMAJESTIC\t1096\tT986\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89025S.mp3\tStan Getz\tStars Fell On Alabama\tMERCURY\t89025\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73483.mp3\tEddie Condon & His Orchestra\tStars Fell On Alabama\tDECCA\t23719\t73483\t1946\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480425.mp3\tArt Tatum And Lionel Hampton\tStars Fell On Alabama\tPablo\t2310-775\t2381-2\t1955\tArt Tatum (p), Lionel Hampton (vib), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3c/BRU15939-A.mp3\tJack Teagarden & His Orch\tStars Fell On Alabama (v J T)\tBRUNSWICK\t6993\t15939-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80359.mp3\tLouis Armstrong & His Orch\tStars Fell On Alabama Pt.1\tDECCA\t28101\t80359\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80360.mp3\tLouis Armstrong & His Orch\tStars Fell On Alabama Pt.2\tDECCA\t28101\t80360\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_230.mp3\tGuy Lombardo And His Royal Canadians\tStars In Your Eyes\tDecca\t18696\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1781.mp3\tBing Crosby & Connie Boswell\tStart The Day Right\tDECCA\t2626A\tDLA1781\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe80761-C.mp3\tJesse Stone Sepia Serenaders\tStarvation Blues\tOKeh\t8471\t80761-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/CON10743-1.mp3\tCowboy Ed Crane\tStarving To Death On A Government Claim\tCONQUEROR\t8013\t10743-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/EDI11750.mp3\tJoe Herlihy And His Orchestra\tState And Madison\tEDISON\t52076\t11750\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU80404.mp3\tLouie Bluie And Ted Bogan\tState Street Rag\tBLUEBIRD\t5593\t80404\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL362.mp3\tHi-flyers\tStatic Stomp\tVOCALION\t4093\tDAL362\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW141494-5.mp3\tPaul Specht's Georgians\tStatic Strut\tCOLUMBIA\t627 D\tW141494-5\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COR60429SB.mp3\tErskine Hawkins\tStation Break\tCORAL\t60429\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142016-2.mp3\tCelestin Original Tuxedo Jazz\tStation Calls\tCOLUMBIA\t636 D\tW142016-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19189.mp3\tVernon Dalhart & The Virginians\tStavin' Change\tVictor\t19189\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030825.mp3\tBill 'jazz' Gillum\tStaving Chain\tBLUEBIRD\t7986\t030825\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLH1247-1.mp3\tBob Wills And His Texas Playboys\tStay A Little Longer\tCOLUMBIA\t37097\tH1247-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA226.mp3\tJimmy Grier And His Orch\tStay As Sweet As You Are\tBRUNSWICK\t7307\tLA226\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/MER695-1.mp3\tFrankie Laine\tStay As Sweet As You Are\tMERCURY\t5028\t695-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC38911.mp3\tGuy Lombardo's Royal Canadians\tStay As Sweet As You Are\tDECCA\t274B\t38911\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_013.mp3\tJimmie Grier And His Orchestra Feat. Pinky Tomlin\tStay As Sweet As You Are\tBRUNSWICK\t7307\tLA226-C\t1934\tStanley Green, Cliff Barber (tp), Homer Menge (tb), James Briggs, Frank Schumacher (cl, as), Art Grier, Gordon Green (cl, ts), Dick Webster, Henry Jaworski, Dwight Muma, Bob Morrow (vn), Ted Repay (p), Wally Heglin (g), Jake Garcia (sb), Billy Marcus (dm), Jimmie Grier (dir)\nhttp://www.jazz-on-line.com/a/mp3c/VICOB6479.mp3\tRay Noble & His Orch\tStay On The Right Side Of The Road\tVICTOR\t24375\tOB6479\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/CON13150-2.mp3\tBing Crosby\tStay On The Right Side Of The Road\tCONQUEROR\t8416\t13150-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/CON13150-A.mp3\tBing Crosby\tStay On The Right Side Of The Road\tCONQUEROR\t9557\t13150-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39390.mp3\tBob Howard & His Orchestra\tStay Out Of Love\tDECCA\t439A\t39390\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41375-2.mp3\tCoon Sanders Nighthawk Orch\tStay Out Of The South\tVICTOR\t21258\t41375-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145930-3.mp3\tEarl Burtnett & His Orch\tStay Out Of The South\tCOLUMBIA\t1361 D\tW145930-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_234.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra Feat. The Biltmore Trio\tStay Out Of The South If You Want To Miss A Heaven On Earth)\tCOLUMBIA\t1361 D\tW145930-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_300.mp3\tTony Bennett\tStay Where You Are\tCOLUMBIA\t39866\tCO48154\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_290.mp3\tJohnny Desmond Feat. O/tony Mottola\tStay Where You Are\tCoral\t60848\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051870.mp3\tFats Waller And His Rhythm\tStayin' At Home\tBLUEBIRD\t10841B\t051870\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC9346.mp3\tDorothy Baker\tSteady Grinding Blues\tDECCA\t7080\tC9346\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92909.mp3\tWillie Bryant & His Orch\tSteak And Potatoes\tVICTOR\t25160\t92909\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80369.mp3\tLouis Armstrong\tSteak Face,pt.1\tDECCA\t28108\t80369\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC80370.mp3\tLouis Armstrong\tSteak Face,pt.2\tDECCA\t28108\t80370\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC14505.mp3\tRed Foley\tSteal Away\tDECCA\t14505\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC33087-4.mp3\tPaul Robeson\tSteal Away\tVICTOR\t19742B\t33087-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_153.mp3\tPaul Robeson\tSteal Away\tVICTOR\t19742B\t33087-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA1951-C.mp3\tBenny Goodman And His Orchestra\tStealin' Apples\tCOLUMBIA\t35362\tLA1951-C\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D223-B.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tStealin' Apples\tV-Disc\t223-B\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Col21943-1.mp3\tFletcher Henderson And His Orchestra\tStealin' Apples\tColumbia\tD-77\t21943-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeC-I334-1.mp3\tFletcher Henderson And His Orchestra\tStealin' Apples\tOkeh\t3213\tC-I334-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM2143-1C.mp3\tThe Dutch Swing College Band\tStealin' The Blues\tDecca\tM32958\tAM2143-1C\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3370.mp3\tEddie Davis Be Boppers\tStealin' Trash\tSAVOY\t907\tS3370\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/Vic64014-1.mp3\tKing Oliver And His Orchestra\tStealing Love\tVictor\t430709\t64014-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_053.mp3\tPatti Page\tSteam Heat\tMERCURY\t70380\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC10151-2.mp3\tArthur Collins\tSteamboat Bill\tVICTOR\t16867\t10151-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_021.mp3\tArthur Collins\tSteamboat Bill\tVICTOR\t16867\t10151-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S6038.mp3\tBob Wills And His Texas Playboys\tSteamboat Stomp\tMGM\t11377\t52S6038\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36285-3.mp3\tJelly Roll Morton's Peppers\tSteamboat Stomp\tVICTOR\t20296B\t36285-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/CONC1599.mp3\tRoy Acuff Smoky Mountain Boys\tSteamboat Whistle Blues\tCONQUEROR\t9122\tC1599\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036SAB.mp3\tEdmond Hall\tSteamin' And Beamin'\tBLUENOTE\tBN036\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CONB10-2.mp3\tRoy Acuff Smoky Mountain Boys\tSteel Guitar Blues\tCONQUEROR\t9086\tB10-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP384x.mp3\tMerle Travis\tSteel Guitar Rag\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1820.mp3\tSpade Cooley And His Orch\tSteel Guitar Rag\tCOLUMBIA\t20572\tHCO1820\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC1479-2.mp3\tBob Wills And Texas Playboys\tSteel Guitar Rag\tCOLUMBIA\t37620\tC1479-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D347B2.mp3\tHarry James And His Orchestra\tSteel Guitar Rag\tV-DISC\t347B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2670.mp3\tJerry Byrd & String Dusters\tSteel Guitar Rag\tMERCURY\t6241\t2670\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN528a.mp3\tHank Penny\tSteel Guitar Stomp\tKING\t528\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2350.mp3\tJerry Byrd\tSteelin' The Blues\tMERCURY\t6175\t2350\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2619.mp3\tJerry Byrd & String Dusters\tSteelin' The Chimes\tMERCURY\t6215\t2619\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_102.mp3\tHaydn Quartet\tStein Song\tVictor\t5136\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_001.mp3\tRudy Vallee And His Connecticut Yankees\tStein Song (university Of Maine)\tVICTOR\t22321\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_049.mp3\tColonial Club Orchestra\tStein Song University Of Maine)\tBRUNSWICK\t4748\tE32427\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/MAD5051-a.mp3\tSynco Jazzers\tStein Song2\tMadison\t5051-a\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81016.mp3\tAl Jolson\tStella\tCOLUMBIA\tA-3913\t81016\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_033.mp3\tAl Jolson\tStella\tCOLUMBIA\tA-3913\t81016\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_223.mp3\tFrank Sinatra\tStella By Starlight\tCOLUMBIA\t37343\tHCO2258\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_252.mp3\tHarry James And His Orchestra\tStella By Starlight\tCOLUMBIA\t37323\tHCO2234-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLC3782-1.mp3\tBrownie Mcghee\tStep It Up And Go No.2\tCOLUMBIA\t37460\tC3782-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480457.mp3\tBenny Golson\tStep Lightly\tContemporary\tOJC 164\tC3552\t1957\tArt Farmer (tp), Benny Golsen (ts), Wynton Kelly (p), Paul Chambers (sb), Charlie Persip (dm)\nhttp://www.jazz-on-line.com/a/mp3c/MANS1179.mp3\tColeman Hawkins Septet\tStep On It\tMANOR\t1036\tS1179\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/SIGT1927.mp3\tBarney Bigard Trio\tStep Steps Down\tSIGNATURE\t28114B\tT1927\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/SIGT1926.mp3\tBarney Bigard Trio\tStep Steps Up\tSIGNATURE\t28114A\tT1926\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU032946.mp3\tFats Waller And His Rhythm\tStep Up And Shake My Hand\tBLUEBIRD\t10184\t032946\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/GenGEX-2369-A.mp3\tCarl Fenton And His Orchestra\tSteppin' Along\tGennett\t7013\tGEX-2369-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36590-2.mp3\tJan Garber & His Orch\tSteppin' Around\tVICTOR\t20367\t36590-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN7690-3.mp3\tAl Goering's Dance Orch.\tSteppin' It Off\tBANNER\t7005\t7690-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/PAR10004-2.mp3\tLovie Austin Blue Serenaders\tSteppin' On The Blues\tPARAMOUNT\t12255\t10004-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_110.mp3\tVincent Lopez And His Orchestra\tSteppin' Out\tOkeh\t40024\t72250-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC42.mp3\tAl Jolson W-isham Jones Orch\tSteppin' Out\tBRUNSWICK\t2567\tC42\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81382-3.mp3\tTed Lewis & His Jazz Band\tSteppin' Out\tCOLUMBIA\t48D\t81382-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC60867.mp3\tAndy Kirk And Clouds Of Joy\tSteppin' Pretty\tDECCA\t931A\t60867\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60867-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tSteppin' Pretty\tDecca\t931\t60867-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/EME42525-2.mp3\tFletcher Henderson & His Orch\tStepping Out\tEMERSON\t10714\t42525-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO4542.mp3\tWoody Herman Woodchoppers\tSteps\tCOLUMBIA\t37229\tCCO4542\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh069.mp3\tMadame Tussauds Dance Orchestra Dir. By Stanley Barnett\tStevedore Stomp\tEdison Bell Winner\t5590\tEB-1047-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic49770-1.mp3\tDuke Ellington And His Cotton Club Orchestra\tStevedore Stomp\tVictor\tV-38053\t49770-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_456.mp3\tFontane Sisters\tStill\tDot\t15501\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1232.mp3\tArnett Cobb & His Orchestra\tStill Flying\tAPOLLO\t772\tR1232\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL602.mp3\tJoe Turner\tStill In Love\tATLANTIC\t982\t602\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037690.mp3\tCharlie Barnet & His Orch\tStill The Blue Bird Sings\tBLUEBIRD\t10349\t037690\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1770.mp3\tBing Crosby - J.s.trotter Orch\tStill The Bluebird Sings\tDECCA\t2640B\tDLA1770\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66049.mp3\tWoody Herman & His Orchestra\tStill The Bluebird Sings\tDECCA\t2658A\t66049\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI80748-L.mp3\tCriterion Quartet\tStill, Still With Thee\tEdison\t80748-L\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16410.mp3\tRex Stewart & His Orch\tStingaree\tARC\tVO2880\t16410\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU63640-1.mp3\tKing Oliver & His Orchestra\tStingaree Blues\tBLUEBIRD\t10707\t63640-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Par1455-2.mp3\tAlberta Hunter\tStingaree Blues\tParamount\t12049\t1455-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN991-A.mp3\tJimmy Thomason\tStingy\tKING\t991-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-174-1.mp3\tDjango's Music\tStockholm\tSWING\t95\tOSW-174-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143234.mp3\tCalifornia Ramblers\tStockholm Stomp\tCOLUMBIA\t883 D\tW143234\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE21422.mp3\tFletcher Henderson & His Orch\tStockholm Stomp\tBRUNSWICK\t3460\tE21422\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_082.mp3\tEddy Howard And His Orchestra\tStolen Love\tMERCURY\t5771\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_394.mp3\tDinah Shore\tStolen Love\tRCA\t6360\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC04585-1.mp3\tLionel Hampton And His Orch\tStomp\tVICTOR\t25535\t04585-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic04585-1.mp3\tLionel Hampton And His Orchestra\tStomp\tVictor\t25535\t04585-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC038109-1.mp3\tTommy Dorsey And His Orch\tStomp It Off\tVICTOR\t26376\t038109-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38917.mp3\tJimmie Lunceford & His Orch\tStomp It Off\tDECCA\t712B\t38917\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/GEN9725.mp3\tRichard Hitter's Blue Knights\tStomp Off, Let's Go\tGENNETT\t3149\t9725\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64928.mp3\tBob Crosby & His Orch\tStomp Off, Let's Go\tDECCA\t2379B\t64928\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/RCA20-2062-A.mp3\tJohn B. Sebastian, Sr., Harmonica; Norris Shawker, Drums; Russ Case And His Orchestra\tStompe A La Turca (rondo From Sonata #9)\tRCA VICTOR\t20-2062-A\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDTB3530.mp3\tQuintet Of Hot Club Of France\tStompin' At Decca\tDECCA\t23066\tDTB3530\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDTB-3530-1.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tStompin' At Decca\tDECCA\tF-6616\tDTB-3530-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO34921.mp3\tGene Krupa Jazz Trio\tStompin' At The Savoy\tCOLUMBIA\t38214\tCO34921\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLZSP5570.mp3\tBenny Goodman Qt\tStompin' At The Savoy\tCOLUMBIA\t39288\tZSP5570\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COR60609y.mp3\tModernaires\tStompin' At The Savoy\tCoral\t60609\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC96568-1.mp3\tBenny Goodman And His Orchestra\tStompin' At The Savoy\tVICTOR\t25247\t96568-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68606.mp3\tArt Tatum & His Band\tStompin' At The Savoy\tDECCA\t8536\t68606\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM51S478.mp3\tEddie Heywood\tStompin' At The Savoy\tMGM\t30635\t51S478\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5293.mp3\tTeddy Wilson Sextet\tStompin' At The Savoy\tMUSICRAFT\t332\t5293\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/CBSCO29928-2.mp3\tEddie South & His Quintet\tStompin' At The Savoy\tCBS\tCO36193\tCO29928-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/GUIG602.mp3\tCozy Cole & His Quintette\tStompin' At The Savoy\tGUILDE\t118\tG602\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/JCFST-1230-1.mp3\tLe ''jazz Club Mystery Hot Band'' (with Django Reinhardt)\tStompin' At The Savoy\tJazz Club Franais\t123\tST-1230-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D223SATS.mp3\tGlenn Miller Army Air Force Band\tStompin' At The Savoy\tV-Disc\t223\t\t1944-\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_151.mp3\tBenny Goodman And His Orchestra\tStompin' At The Savoy\tVICTOR\t25247\t96568-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480458.mp3\tArt Tatum\tStompin' At The Savoy\tClef\tEP273\t1460-1\t1955\tArt Tatum (p-solo)\nhttp://www.jazz-on-line.com/a/mp3t/TS480521.mp3\tAhmad Jamal\tStompin' At The Savoy\tArgo\tLP 636\t9027\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3t/TS480621.mp3\tBenny Goodman Trio\tStompin' At The Savoy\tCapitol\tH343\t2520-1\t1947\tBenny Goodman (cl), Teddy Wilson (p), Jimmy Crawford (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480726.mp3\tBenny Goodman Quartet\tStompin' At The Savoy\tColumbia\tSL 160\t\t1938\tCarnegie Hall Concert: <br>Benny Goodman (cl), Teddy Wilson (p), Gene Krupa (dm), Lionel Hampton (vib)\nhttp://www.jazz-on-line.com/a/mp3c/VIC027210.mp3\tTommy Dorsey & His Orch\tStompin' At The Stadium\tVICTOR\t26062\t027210\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_324.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright And Skeets Herfurt\tStompin' At The Stadium\tVICTOR\t26062\t027210\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC49446-1.mp3\tMemphis Stompers\tStompin' Away\tVICTOR\t23371\t49446-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62220.mp3\tEdgar Hayes & His Orchestra\tStomping At The Renny\tDECCA\t1416\t62220\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC07794-1.mp3\tLionel Hampton And His Orch\tStompology\tVICTOR\t25601\t07794-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic07794-1.mp3\tLionel Hampton And His Orchestra\tStompology\tVictor\t25601\t07794-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC053434-1.mp3\tBechet New Orleans Feetwarmers\tStompy Jones\tVICTOR\t27240\t053434-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC80145-2.mp3\tDuke Ellington & His Orch\tStompy Jones\tVICTOR\t24521A\t80145-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/VarLO-374-1.mp3\tBarney Bigard And His Jazzopaters\tStompy Jones\tVariety\t515\tLO-374-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC73073.mp3\tElla Fitzgerald And Louis Jordan\tStone Cold Dead In The Market\tDECCA\t23546\t73073\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_079.mp3\tElla Fitzgerald And Louis Jordan\tStone Cold Dead In The Market (he Had It Coming)\tDECCA\t23546\t73073\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14727-1.mp3\tCharlie Patton\tStone Pony Blues\tARC\tVO2680z\t14727-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/CONDAL377-2.mp3\tRobert Johnson\tStones In My Passway\tCONQUEROR\t8973\tDAL377-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCON8973.mp3\tRobert Johnson\tStones In My Passway\tCONQUEROR\t8973\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BEL5006.mp3\tArtie Shaw And His Gramercy Five\tStop And Go Mambo\tBELL\tBELL1027\t5006\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe404785-B.mp3\tMississipi Sheiks\tStop And Listen Blues No.2\tOKeh\t8859\t404785-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64471-A.mp3\tCount Basie And His Orchestra\tStop Beatin' Around The Mulberry Bush\tDECCA\t2004A\t64471-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_104.mp3\tCount Basie And His Orchestra Feat. Jimmy Rushing\tStop Beatin' Around The Mulberry Bush\tDECCA\t2004A\t64471-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_036.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright And Skeets Herfurt\tStop Beatin' Around The Mulberry Bush\tVICTOR\t26012-B\t019422\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC019422.mp3\tTommy Dorsey And His Orch\tStop Beatin' Round The Mulberry Bush\tVICTOR\t26012-B\t019422\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC336.mp3\tUna Mae Carlisle\tStop Going Through The Motions\tNATIONAL\t\tNSC336\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC038107.mp3\tTommy Dorsey And His Orch\tStop It! It's Wonderful\tVICTOR\t26325\t038107\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64971-A.mp3\tRosetta Crawford With Mezz Mezzrow\tStop It, Joe\tDecca\t7567\t64971-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC042611.mp3\tTommy Dorsey & His Clambake 7\tStop Kicking My Heart Around\tVICTOR\t26356\t042611\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL26110-A.mp3\tJack Teagarden & His Orch\tStop Kicking My Heart Around\tCOLUMBIA\t35245\t26110-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051865.mp3\tFats Waller And His Rhythm\tStop Pretending\tBLUEBIRD\t10829\t051865\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66891.mp3\tBuddy Johnson & His Band\tStop Pretending\tDECCA\t48052\t66891\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN2521-S.mp3\tDelmore Brothers\tStop That Boogie\tKING\t751A\t2521-S\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC90095.mp3\tSleepy John Estes\tStop That Thing\tDECCA\t7325\t90095\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU71910-1.mp3\tMildred Bailey W Matty Malneck\tStop The Sun Stop The Moon\tBLUEBIRD\t7763 A\t71910-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU11353-B.mp3\tBoswell Sisters\tStop The Sun Stop The Moon (my Man's Gone)\tBRUNSWICK\t6271\t11353-B\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_159.mp3\tBoswell Sisters Feat. Dorsey Brothers Orchestra\tStop The Sun, Stop The Moon (my Man's Gone)\tBRUNSWICK\t6271\t11353-B\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU062861.mp3\tWingy Manone And His Orch\tStop The War\tBLUEBIRD\t11107\t062861\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA2001.mp3\tOrrin Tucker And His Orch\tStop! It's Wonderful\tCOLUMBIA\t35249\tLA2001\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481112.mp3\tGene Krupa's Swing Band Feat. Anita O'day\tStop! The Red Light's On\tOkeh\t6411\tC3967-1\t1941\tRoy Eldridge, Graham Young, Torg Halten, Norman Murphy (tp), Babe Wagner, Jay Kelliher, John Grassi (tb), Mascagni Ruffo, Sam Listengart, Jimmy Migliore (as), Sam Musiker, Walter Bates (ts), Milton Raskin (p), Ray Biondi (g), Ed Mihelich (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3b/Voc21243-2.mp3\tClaude Thornhill And His Orchestra With Maxine Sullivan\tStop! You're Breaking My Heart\tVocalion\t3616\t21243-2  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC740.mp3\tStuff Smith Trio\tStop, Look\tASCH\t353-2\t740\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07810.mp3\tTommy Dorsey & His Orch\tStop, Look And Listen\tVICTOR\t25767\t07810\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69505.mp3\tKing Cole Trio\tStop, The Red Light's On\tDECCA\t8592\t69505\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/BLU073462-1.mp3\tEarl Hines And His Orchestra\tStormy Monday Blues\tBLUEBIRD\tB-11567A\t073462-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Blu073462-1.mp3\tEarl Hines And His Orchestra\tStormy Monday Blues\tBluebird\t11567\t073462-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU073462.mp3\tEarl Hines And His Orch\tStormy Monday Blues (vb.eckstine)\tBLUEBIRD\t11567A\t073462\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC15603-1.mp3\tCarr Leroy\tStormy Night Blues\tARC\tVO2922z\t15603-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5912.mp3\tWynonie Harris\tStormy Night Blues\tKING\t4378\tK5912\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13241.mp3\tGuy Lombardo And His Royal Canadians, Vocal By Carmen Lombardo\tStormy Weather\tBRUNSWICK\t6550\t13241\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13292-A.mp3\tEthel Waters W C.ventura Orch\tStormy Weather\tBRUNSWICK\t6564\t13292-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13339-A.mp3\tDuke Ellington And His Famous Orchestra\tStormy Weather\tBRUNSWICK\t6600\t13339-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLB13292.mp3\tEthel Waters, With Uncredited Studio Orchestra\tStormy Weather\tCOLUMBIA\t38248\tB13292\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC27819.mp3\tLena Horne\tStormy Weather\tVICTOR\t27819\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC75329-1.mp3\tLeo Reisman And His Orchestra, Vocal By Harold Arlen\tStormy Weather\tVICTOR\t24262\t75329-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC061977.mp3\tLena Horne, Orchestra Of Lou Bring\tStormy Weather\tVICTOR\t27819\t061977\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COMB544-2.mp3\tWillie Smith (piano)\tStormy Weather\tCOMMODORE\t519\tB544-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62823-A.mp3\tArt Tatum\tStormy Weather\tDECCA\t1603\t62823-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA1023SW.mp3\tDon Byas Qt\tStormy Weather\tDIAL\t1023\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC2069-2.mp3\tCharlie Palloy & His Orch\tStormy Weather\tCROWN\t3500\tC2069-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC80456.mp3\tBuddy Johnson And His Orch.\tStormy Weather\tDECCA\t27711\t80456\t1951\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D325A.mp3\tConnee Boswell\tStormy Weather\tV-DISC\t325A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D91-A.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tStormy Weather\tV-Disc\t91-A\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_036.mp3\tDuke Ellington And His Famous Orchestra\tStormy Weather\tBRUNSWICK\t6600\t13339-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_163.mp3\tLena Horne\tStormy Weather\tVICTOR\t27819\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_007.mp3\tEthel Waters\tStormy Weather\tCOLUMBIA\t36329\tB13292\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_002.mp3\tLeo Reisman And His Orchestra Feat. Harold Arlen\tStormy Weather\tVICTOR\t24262\t75329-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480905.mp3\tAndre Kostelanetz And His Orchestra\tStormy Weather\tCOLUMBIA\t7431-M\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic69452s.mp3\tNina De Charny\tStornelli Toscani\tVictor\t69452\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068461.mp3\tGlenn Miller & His Orch\tStory Of A Starry Night (vre)\tBLUEBIRD\t11462\t068461\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VocE-35985-B.mp3\tThe Chocolate Dandies\tStraddle The Fence ? V D R\tVocalion\t1646\tE-35985-B\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/BANLA183-A.mp3\tBing Crosby\tStraight From The Shoulder\tBANNER\t33202\tLA183-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruLA183-A.mp3\tIrving Aaronson And His Commanders With Bing Crosby\tStraight From The Shoulder\tBrunswick\t6396\tLA183-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruLA183-B.mp3\tIrving Aaronson And His Commanders With Bing Crosbyirving Aaronson And His Commanders With Bing Cros\tStraight From The Shoulder\tBrunswick\t\tLA183-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480522.mp3\tArt Pepper\tStraight Life\tContemporary\tC3532\t\t1957\tRed Garland, P, Philly Jo Jones, D, Paul Chambers, B\nhttp://www.jazz-on-line.com/a/mp3e/Blu061542-1.mp3\tEarl Hines And His Orchestra\tStraight To Love\tBluebird\tB-11374\t061542-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Freddy Webster (tp) Joe McLewis, George Hunt, John Ewing (tb) Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck\nhttp://www.jazz-on-line.com/a/mp3b/Blu061542-1.mp3\tEarl Hines And His Orchestra\tStraight To Love (lh Vcl)\tBluebird\tB-11374\t061542-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_079.mp3\tKing Cole Trio\tStraighten Up And Fly Right\tCapitol\t154\t123\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP123.mp3\tKing Cole Trio\tStraighten Up And Fly Right\tCAPITOL\t\t123\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18606A.mp3\tAndrews Sisters\tStraighten Up And Fly Right\tDECCA\t18606A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC18606.mp3\tAndrews Sisters\tStraighten Up And Fly Right\tDECCA\t18606\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_074.mp3\tAndrews Sisters\tStraighten Up And Fly Right\tDECCA\t18606A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_110.mp3\tCadets\tStranded In The Jungle\tModern\t994\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_145.mp3\tJayhawks\tStranded In The Jungle\tFlash\t109\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_240.mp3\tGadabouts\tStranded In The Jungle\tMercury\t70898\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43232.mp3\tUna Mae Carlisle\tStrange\tCOLUMBIA\t38864\tCO43232\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_165.mp3\tNat ''king'' Cole Feat. Nelson Riddle's Orchestra\tStrange\tCAPITOL\t2309\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11959-1.mp3\tCab Calloway And His Orchestra\tStrange As It Seems\tBanner\t32624\t11959-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU15151-A.mp3\tWingy Manone & His Orch\tStrange Blues\tBRUNSWICK\t6911\t15151-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COL25800-1.mp3\tWill Bradley & His Orch\tStrange Cargo\tCOLUMBIA\t35545\t25800-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036149-3.mp3\tDorothy Lamour\tStrange Enchanment\tBLUEBIRD\t10265\t036149-3\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035559-1.mp3\tCharlie Barnet & His Orch\tStrange Enchantment (v J E)\tBLUEBIRD\t10227\t035559-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COM24403-B.mp3\tBillie Holiday, Orchestra Of Frankie Newton\tStrange Fruit\tCOMMODORE\t526\t24403-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_286.mp3\tBillie Holiday\tStrange Fruit\tCBS\tCMS526\t24403-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5464.mp3\tTeddy Wilson\tStrange Interlude\tMUSICRAFT\t370\t5464\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO33323.mp3\tFrankie Laine - Paul Weston\tStrange Lady In Town\tCOLUMBIA\t40457\tRHCO33323\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3692.mp3\tBing Crosby - J.s.trotter\tStrange Music\tDECCA\t18649\tL3692\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM1474-1B.mp3\tThe Dutch Swing College Band\tStrange Peach\tDecca\tM32385\tAM1474-1B\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_200.mp3\tJune Valli\tStrange Sensation\tRCA\t20-4759\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO48924.mp3\tRed Buttons\tStrange Things Are Happening\tCOLUMBIA\t39981\tCO48924\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_110.mp3\tRed Buttons Feat. Elliot Lawrence And His Orchestra\tStrange Things Are Happening (ho Ho, Hee Hee, Ha Ha)\tCOLUMBIA\t39981\tCO48924\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-5535x.mp3\tTony Martin\tStranger In Paradise\tRCA\t20-5535\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC85378.mp3\tThe Four Aces\tStranger In Paradise\tDECCA\t28927\t85378\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_014.mp3\tTony Bennett\tStranger In Paradise\tCOLUMBIA\t40121\tCO49845\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_402.mp3\tGordon Macrae\tStranger In Paradise\tCapitol\t2652\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_067.mp3\tTony Martin\tStranger In Paradise\tRCA\t20-5535\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_022.mp3\tFour Aces Feat. Jack Pleis And His Orchestra\tStranger In Paradise\tDECCA\t28927\t85378\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_154.mp3\tMartha Tilton\tStranger In Town\tCAPITOL\t184\t428-2B\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010344.mp3\tTommy Dorsey & His Orch\tStrangers In The Dark\tVICTOR\t25596\t010344\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG11915.mp3\tJelly Roll Morton\tStratford Hunch\tGENNETT\t5590\tG11915\t1924\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480906.mp3\tTed Heath And His Music\tStratford Water\tDECCA-LONDON\t454\tDR-13403\t1949\tStan Reynolds, Stan Roderick, Dave Wilkins, Maurice Miller (tp) Jackie Armstrong, Maurice Pratt, Jack Bentley, Jimmy Coombes (tb) Les Gilbert, Reg Owen (as) Johnny Gray, Tommy Whittle (ts) Dave Shand (bar) Norman Stenfalt (p) Dave Goldberg (g) Charlie Short (b) Jack Parnell (d) Ted Heath (dir)\nhttp://www.jazz-on-line.com/a/mp3c/DECC90598-B.mp3\tRed Nelson\tStreamline Train\tDECCA\t7171\tC90598-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71233-A.mp3\tInk Spots\tStreet Of Dreams\tDECCA\t18503A\t71233-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVU1164.mp3\tGene Ammons\tStreet Of Dreams\tSAVOY\t4527\tU1164\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12710.mp3\tGuy Lombardo Royal Canadians\tStreet Of Dreams\tBRUNSWICK\t6455\t12710\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47381.mp3\tSarah Vaughan\tStreet Of Dreams\tCOLUMBIA\t39789\tCO47381\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU12706A.mp3\tBing Crosby\tStreet Of Dreams\tBRUNSWICK\t6464\t12706A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_139.mp3\tBing Crosby\tStreet Of Dreams\tBRUNSWICK\t6464\t12706A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_160.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra And Pied Pipers\tStreet Of Dreams\tVICTOR\t27903B\t075905-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480550.mp3\tArt Tatum And Benny Carter\tStreet Of Dreams\tClef\tEP-320\t1793-2\t1954\tBenny Carter (as), Art Tatum (p), Louie Bellson (dm)\nhttp://www.jazz-on-line.com/a/mp3c/MER89044m.mp3\tBenny Carter\tStreet Scene\tMERCURY\t89044\t\t\t\nhttp://www.jazz-on-line.com./a/mp3o/MERYB9024.mp3\tEnnio Bolognini, Cellist  Ralph Marterie & His Orchestra\tStreet Scene\tMERCURY\t5860\tYB9024\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2407-4.mp3\tBud Powell (piano)\tStrictly Confidential\tMERCURY\t11047\t2407-4\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUJC8526.mp3\tCab Calloway & His Orch\tStrictly Cullud Affair\tBRUNSWICK\t6292\tJC8526\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_129.mp3\tCab Calloway And His Orchestra\tStrictly Cullud Affair\tBRUNSWICK\t6292\tJC8526\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/BruJC-8526-B.mp3\tCab Calloway And His Orchestra\tStrictly Cullud Affair\tBrunswick\t6292\tJC-8526-B\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/GUIG615.mp3\tCozy Cole & His Quintet\tStrictly Drums\tGUILDE\t129\tG615\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64462.mp3\tElla Fitzgerald & Her Savoy 8\tStrictly From Dixie\tDECCA\t2202B\t64462\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64462-A.mp3\tElla Fitzgerald And Her Savoy Eight\tStrictly From Dixie\tDecca\t2202\t64462-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D311A2.mp3\tHarry James And His Orchestra\tStrictly Instrumental\tV-DISC\t311A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_035.mp3\tHarry James And His Orchestra\tStrictly Instrumental\tV-DISC\t311A2\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-3063-A.mp3\tJimmie Lunceford And His Orchestra\tStrictly Instrumental\tDecca\t18463\tL-3063-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU027958.mp3\tErskine Hawkins & His Orch\tStrictly Swing\tBLUEBIRD\t10012B\t027958\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC59660-3.mp3\tRevelers\tStrike Up The Band\tVICTOR\t22401\t59660-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_126.mp3\tArden-ohman Orchestra Feat. Revelers, The\tStrike Up The Band\tVICTOR\t22308A\t58640-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/DECF10093.mp3\tTed Heath And His Music\tStrike Up The Band\tDECCA-LONDON\tF10093\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU31883-B.mp3\tRed Nichols & His Orch\tStrike Up The Band!\tBRUNSWICK\t4695\t31883-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_141.mp3\tAmes Brothers, The Feat. Ray Bloch Orchestra\tString Along\tCORAL\t60804\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO45247.mp3\tCurly Williams Ga.peachpickers\tString Steeling\tCOLUMBIA\t20849\tCO45247\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban13618-1.mp3\tHerny ''red'' Allen And His New York Orchestra\tStringin' Along On A Shoe String\tBanner\t32829\t13618-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COW142697.mp3\tVenuti And Lang\tStringing The Blues\tCOLUMBIA\t914 D\tW142697\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP103x.mp3\tJohnny Mercer\tStrip Polka\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO905.mp3\tKay Kyser And His Orchestra\tStrip Polka\tCOLUMBIA\t36635\tHCO905\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC71105.mp3\tAndrews Sisters\tStrip Polka\tDECCA\t18470A\t71105\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol36635.mp3\tKay Kyser & His Orchestra\tStrip Polka\tColumbia\t36635\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_039.mp3\tAndrews Sisters\tStrip Polka\tDECCA\t18470A\t71105\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_038.mp3\tKay Kyser And His Orchestra\tStrip Polka\tCOLUMBIA\t37962\tHCO905\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_041.mp3\tJohnny Mercer\tStrip Polka\tCapitol\t103\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1160.mp3\tTed Daffan's Texans\tStrip Tease Swing\tOKEH\t6126\tDAL1160\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic62340-2.mp3\tJelly-roll Morton And His Red Hot Peppers\tStrokin' Away\tVictor\t23351\t62340-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU62340-2.mp3\tJelly Roll Morton Hot Peppers\tStroking Away\tBLUEBIRD\t8302\t62340-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62236-2.mp3\tKing Oliver & His Orchestra\tStruggle Buggy\tVICTOR\t23001\t62236-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COMP25707.mp3\tEddie Condon & His Band\tStrut Miss Lizzie\tCOMMODORE\t530\tP25707\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480392.mp3\tBenny Golson Quintet\tStrut Time\tRiverside\tRLP12-290\t\t1958\tCurtis Fuller (tb) Benny Golson (ts) Barry Harris (p) Jymie Merritt (b) Philly Joe Jones (d)\nhttp://www.jazz-on-line.com/a/mp3w/1921_048.mp3\tAmerican Quartet\tStrut, Miss Lizzie\tVictor\t18799\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC13234.mp3\tFletcher Henderson & His Orch\tStrutter's Drag\tVOCALION\t14828A\t13234\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO41832.mp3\tJimmy Dorsey Dorseyland Band\tStruttin' With Some Barbecue\tCOLUMBIA\t38655\tCO41832\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO44286.mp3\tBobby Hackett\tStruttin' With Some Barbecue\tCOLUMBIA\t39019\tCO44286\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA-1134-A.mp3\tLouis Armstrong And His Orchestra\tStruttin' With Some Barbecue\tDECCA\t1661B\tDLA-1134-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_157.mp3\tLouis Armstrong\tStruttin' With Some Barbecue\tOKEH\t8566\t82037-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA1134.mp3\tLouis Armstrong And His Orch\tStruttin' With Some Barbeque\tDECCA\t1661\tDLA1134\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COMA4802.mp3\tGeorge Wettling Rhythm Kings\tStruttin' With Some Barbeque\tCOMMODORE\t561\tA4802\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN566SWS.mp3\tSidney Bechet W Claude Luter\tStruttin' With Some Barbeque\tBLUENOTE\tBN566\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3709-1.mp3\tRoy Acuff Smoky Mountain Boys\tStuck Up Blues\tOKEH\t6300\tC3709-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16192.mp3\tDjango Reinhardt\tStudio 24\tRythme\tD5017\t16192\t1942\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480486.mp3\tBen Webster And Harry Sweets Edison\tStudio Call (nice Work If You Can Get It)\tClef\tMGC717\t2987-1\t1956\tBen Webster, Ts, Harry Sweets Edison, T, Joe Mondragon, B, Alvin Stoller, D, Barney Kessel, G, Jimmy Rowles, P\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25653.mp3\tBunny Berigan & His Orchestra\tStudy In Brown\tVictor\t25653\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_050.mp3\tBetty Hutton\tStuff Like That There\tCapitol\t188\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC26282-3.mp3\tPaul Whiteman And His Orch\tStumbling\tVICTOR\t18899A\t26282-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1063-A.mp3\tBob Crosby & His Bobcats\tStumbling\tDECCA\t1593\tDLA1063-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26490.mp3\tBilly Murray\tStumbling\tVICTOR\t18906\t26490\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_046.mp3\tBilly Murray\tStumbling\tVICTOR\t18906\t26490\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA1074.mp3\tCharlie Parker\tStupendous\tDIAL\t1022\t1074\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480459.mp3\tArt Farmer And Gigi Gryce\tStupendous-lee\tPrestige\tLP7085\t577\t1954\tArt Farmer, T, FLh, Gigi Gryce, As, With, 2 rhythm sections, = Horace Silver or Freddie Redd, P, Addison Farmer or Percy Heath, B, Art Taylor or Kenny Clark, D\nhttp://www.jazz-on-line.com/a/mp3d/VocWC-2635-A.mp3\tCount Basie And His Orchestra\tSub-deb Blues\tVocalion\t5010\tWC-2635-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUWM998.mp3\tDuke Ellington And His Famous\tSubtle Lament\tBRUNSWICK\t8344\tWM998\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU061343-1.mp3\tRex Stewart And His Orch\tSubtle Slough\tBLUEBIRD\t11258\t061343-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_494.mp3\tVera Lynn\tSuch A Day\tLondon\t1642\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_473.mp3\tRita Raines\tSuch A Day (so Ein Tag)\tDeed\t1010\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12685-6.mp3\tFletcher Henderson & His Orch\tSud Bustin' Blues\tBRUNSWICK\t2592\t12685-6\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru12684.mp3\tFletcher Henderson And His Orchestra\tSud Bustin' Blues\tBrunswick\t2592\t12684\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_138.mp3\tHildegarde\tSuddenly It's Spring\tDecca\t23297\t71619\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_101.mp3\tGlen Gray And Casa Loma Orchestra\tSuddenly It's Spring\tDECCA\t18596A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_098.mp3\tJo Stafford\tSuddenly There's A Valley\tColumbia\t40559\tRHCO33503\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_187.mp3\tMills Brothers\tSuddenly There's A Valley\tDecca\t29686\t88574\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_072.mp3\tGogi Grant\tSuddenly There's A Valley\tEra\t1003\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_148.mp3\tJulius Larosa\tSuddenly There's A Valley\tCadence\t1270\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_206.mp3\tPatty Andrews\tSuddenly There's A Valley\tCapitol\t3228\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN4242S.mp3\tRussell Jacquet & His Allstars\tSuede Jacket\tKING\t4242\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_051.mp3\tClyde Doerr And His Orchestra\tSuez\tVICTOR\t18947\t26747-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151848-1.mp3\tFletcher Henderson And His Orch\tSugar\tCOLUMBIA\t2559 D\tW151848-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLB24047-1.mp3\tTeddy Wilson And His Orch\tSugar\tCOLUMBIA\t36117\tB24047-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC38045-2.mp3\tAlberta Hunter\tSugar\tVICTOR\t20771\t38045-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC40512-1.mp3\tRed And Miff's Stompers\tSugar\tVICTOR\t21056\t40512-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC43118-1.mp3\tPaul Whiteman And His Orch\tSugar\tVICTOR\t25368\t43118-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC021628-2.mp3\tBenny Goodman Qt\tSugar\tVICTOR\t26240\t021628-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE82030.mp3\tMckenzie & Condon Chicagoans\tSugar\tOKEH\t41011\t82030\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP171-A.mp3\tCapitol Jazzmen\tSugar\tCAPITOL\t\t171-A\t\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB894.mp3\tCount Basie & His Orchestra\tSugar\tRCA\t20-2696\tD7VB894\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-115-1.mp3\tAndr Ekyan (with Django Reinhardt)\tSugar\tSWING\t98\tOSW-115-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap171-A.mp3\tCapitol Jazzmen With Barney Bigard\tSugar\tCapitol\t1232\t171-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_114.mp3\tEthel Waters\tSugar\tCOLUMBIA\t14146 D\tW141707-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_100.mp3\tVic Damone Feat. David Carroll's Orchestra\tSugar\tMERCURY\t70054\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24047-1.mp3\tTeddy Wilson And His Orchestra\tSugar\tBrunswick\t8319\tB-24047-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144798-3.mp3\tEddie Thomas Collegians (bs)\tSugar (vet)\tCOLUMBIA\t1154 D\tW144798-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE21801.mp3\tDoc Boggs\tSugar Baby\tBRUNSWICK\t118\tE21801\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151238.mp3\tClyde Mccoy And His Orch\tSugar Blues\tCOLUMBIA\t2389 D\tW151238\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67120.mp3\tElla Fitzgerald & Her Orch\tSugar Blues\tDECCA\t3078A\t67120\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN17422-1.mp3\tClyde Mccoy & His Orch\tSugar Blues\tBANNER\t33442\t17422-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon92916-1.mp3\tFats Waller And His Rhythm\tSugar Blues\tMontgomeryWard\t4895\t92916-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU68939-2.mp3\tBlanche Calloway & Her Orch\tSugar Blues\tBLUEBIRD\t5334\t68939-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC9763-A.mp3\tClyde Mccoy And His Orchestra\tSugar Blues\tDECCA\t381B\tC9763-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec381.mp3\tClyde Mccoy\tSugar Blues\tDecca\t381\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_053.mp3\tJohnny Mercer\tSugar Blues\tCapitol\t448\t2096-2\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_344.mp3\tElla Fitzgerald\tSugar Blues\tDECCA\t3078A\t67120\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban18625-4.mp3\tBlue Ribbon Boys\tSugar Blues V- G M\tBanner\t32199\t18625-4\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69193.mp3\tSkeets Tolbert Gentlemen Swing\tSugar Boogie\tDECCA\t8506A\t69193\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec68193-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tSugar Boogie\tDecca\t8506\t68193-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-25058-1.mp3\tHarry James And His Orchestra\tSugar Daddy\tBrunswick\t\tB-25058-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09689.mp3\tBenny Goodman And His Orchestra\tSugar Foot Stomp\tVICTOR\t25678\t09689\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151442-1.mp3\tFletcher Henderson & His Orch\tSugar Foot Stomp\tCOLUMBIA\t2513 D\tW151442-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19669-2.mp3\tArtie Shaw And His Orchestra\tSugar Foot Stomp\tBRUNSWICK\t7735\tB-19669-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1419-1.mp3\tFrankie Trumbauer Orch\tSugar Foot Stomp\tVARSITY\t8256\tUS1419-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECLA2851.mp3\tBob Crosby & His Orch\tSugar Foot Stomp\tDECCA\t4390B\tLA2851\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Col151442-1.mp3\tFletcher Henderson And His Orchestra\tSugar Foot Stomp\tColumbia\t2513-D\t151442-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Cro1433-3.mp3\tConnie's Inn Orchestra\tSugar Foot Stomp\tCrown\t3194\t1433-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/MelE-36455-A.mp3\tConnie's Inn Orchestra\tSugar Foot Stomp\tMelotone\tM-12239\tE-36455-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic53066-1.mp3\tConnie's Inn Orchestra\tSugar Foot Stomp\tVictor\t22721\t53066-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP5049.mp3\tLouis Armstrong & Earl Hines\tSugar Foot Strut\tCOLUMBIA\t39236\tZSP5049\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC61164-A.mp3\tBob Crosby & His Orchestra\tSugar Foot Strut\tDECCA\t3337A\t61164-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic58581-2.mp3\tHerny ''red'' Allen And His New York Orchestra\tSugar Hill Function\tVictor\tV-38140\t58581-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM551-1.mp3\tRex Stewart 52nd St Stompers\tSugar Hill Shim Sham\tVARIETY\tI664\tM551-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150202.mp3\tGid Tanner's Skillet Lickers\tSugar In The Gourd\tCOLUMBIA\t15612 D\tW150202\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-17240-1.mp3\tLouis Prima And His New Orleans Gang\tSugar Is Sweet And So Are You\tBrunswick\t7431\tB-17240-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_246.mp3\tThe Four Tunes; Sid Bass Orch.\tSugar Lump\tJUBILEE\t5132\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2007.mp3\tBob Wills And His Texas Playboys\tSugar Moon\tCOLUMBIA\t37313\tHCO2007\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_030.mp3\tCollins And Harlan\tSugar Moon\tVICTOR\t16540\tB9036-2\t1910\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65094-A.mp3\tChick Webb And His Orchestra\tSugar Pie\tDecca\t2665\t65094-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60074.mp3\tBob Howard & His Orch\tSugar Plum\tDECCA\t598A\t60074\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU18317-1.mp3\tTeddy Wilson And His Orchestra\tSugar Plum\tBRUNSWICK\t7577\t18317-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98895.mp3\tFats Waller And His Rhythm\tSugar Rose\tVICTOR\t25266\t98895\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/CBS20256.mp3\tCarroll Gibbons And His Orch.\tSugar Rose\tCBS\tCO3161D\t20256\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1391.mp3\tGene Ammons Sextet\tSugar-coated\tMERCURY\t8905\t1391\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10118.mp3\tDoris Day\tSugarbush\tCOLUMBIA\t39693\tHCO10118\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_054.mp3\tDoris Day And Frankie Laine Feat. Carl Fischer's Orchestra\tSugarbush\tCOLUMBIA\t39693\tHCO10118\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75938.mp3\tElla Fitzgerald / Sy Oliver\tSugarfoot Rag\tDECCA\t24958\t75938\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_263.mp3\tRed Foley\tSugarfoot Rag\tDECCA\t46205\t75519\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043347.mp3\tFats Waller And His Rhythm\tSuitcase Susie\tBLUEBIRD\t10500\t043347\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COL42329.mp3\tCoro Orch. Accomp.\tSulle Balze Del Trentino\tCOLUMBIA\tE2574\t42329\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2677-1.mp3\tDuke Ellington's Orch\tSultry Serenade\tCOLUMBIA\t38363\tHCO2677-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5813-2.mp3\tDuke Ellington & His Orch\tSultry Sunset\tMUSICRAFT\t466\t5813-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102375-1.mp3\tWingy Manone & His Orch\tSummer Holiday\tBLUEBIRD\t6473B\t102375-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D338B1.mp3\tSkymen Of The 718th Aaf Band\tSummer Holiday\tV-DISC\t338B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_299.mp3\tJan Garber And His Orchestra\tSummer Holiday\tDecca\t821\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiRad1284.mp3\tHigh Society Orchestra\tSummer Night\tRadiex\t1284\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3062.mp3\tWoody Herman & His Herd\tSummer Sequence, Part 4\tCOLUMBIA\t38367\tHCO3062\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC026686.mp3\tLarry Clinton & His Orchestra\tSummer Souvenirs\tVICTOR\t26042\t026686\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_055.mp3\tLarry Clinton And His Orchestra Feat. V/ Bea Wain\tSummer Souvenirs\tVICTOR\t26042\t026686\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_358.mp3\tAmes Brothers\tSummer Sweetheart\tRCA\t6608\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUGM533.mp3\tSidney Bechet Blue Note 5\tSummertime\tBLUENOTE\t006\tGM533\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COL19537-1.mp3\tBillie Holiday\tSummertime\tCOLUMBIA\t37496\t19537\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/MER11038.mp3\tCharlie Parker String Ensemble\tSummertime\tMERCURY\t11038\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VC1091.mp3\tArtie Shaw And His Orchestra\tSummertime\tRCA\t28-0406\tD5VC1091\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COMR4061.mp3\tJoe Sullivan (piano)\tSummertime\tCOMMODORE\t540\tR4061\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CROBL17.mp3\tMildred Bailey\tSummertime\tCROWN\t105\tBL17\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42532.mp3\tSarah Vaughan\tSummertime\tCOLUMBIA\t38701\tCO42532\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47291.mp3\tErroll Garner Trio\tSummertime\tCOLUMBIA\t39888\tCO47291\t1952\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1822.mp3\tAnne Jamison\tSummertime\tDECCA\t2876A\tDLA1822\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1310.mp3\tBing Crosby & Matty Malneck\tSummertime\tDECCA\t2147B\tDLA1310\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_175.mp3\tBillie Holiday\tSummertime\tCOLUMBIA\t37496\t19537\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D311B1.mp3\tBob Crosby And His Orchestra\tSummertime (theme Song)\tV-DISC\t311B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4609.mp3\tBill Monroe's Bluegrass Boys\tSummertime Is Past And Gone\tCOLUMBIA\t20503\tCCO4609\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC055062-1.mp3\tArtie Shaw And His Gramercy Five\tSummit Ridge Drive\tVICTOR\t26763-A\t055062-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA26763-A.mp3\tArtie Shaw And His Gramercy Five\tSummit Ridge Drive\tRCA VICTOR\t26763-A\t055062-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055062-1.mp3\tArtie Shaw And His Gramercy Five\tSummit Ridge Drive\tVictor\t26763\t055062-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU15913.mp3\tDuke Ellington And His Orch\tSump'n 'bout Rhythm\tBRUNSWICK\t7310\t15913\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2741.mp3\tJoe Turner & Freddie Slack\tSun Risin' Blues\tDECCA\t7889\tDLA2741\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC62339.mp3\tLouis Armstrong And His Orchestra\tSun Showers\tDECCA\t1369\t62339\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-11110-B.mp3\tGlenn Miller And His Orch\tSun Valley Jump\tBluebird\tB-11110-B\tB-11110-B\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-11110-B.mp3\tGlenn Miller And His Orch\tSun Valley Jump\tBLUEBIRD\t11110\t058889\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_036.mp3\tVincent Lopez And His Orchestra\tSun-kist Rose\tOkeh\t4944\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-17769-1.mp3\tTeddy Wilson And His Orchestra\tSunbonnet Blue (v B. Holiday)\tBRUNSWICK\t7498\tB-17769-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_041alt.mp3\tByron G. Harlan\tSunbonnet Sue\tEDISON\t9958\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU066792.mp3\tBenny Carter And His Orch\tSunday\tBLUEBIRD\t11341\t066792\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/REG8181-B.mp3\tSam Lanin's Dance Orch\tSunday\tRegal\t8181-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36829-3.mp3\tJean Goldkette And His Orch\tSunday\tVICTOR\t20273B\t36829-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5717S.mp3\tMuggsy Spanier's Dixielanders\tSunday\tMERCURY\t5717\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC37501-1.mp3\tGene Austin\tSunday\tVICTOR\t20411\t37501-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu066792-1.mp3\tBenny Carter And His Orchestra\tSunday\tBluebird\tB-11341\t066792-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_127.mp3\tGene Austin Feat. P/abel Baer\tSunday\tVICTOR\t20411\t37501-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_026.mp3\tCliff Edwards\tSunday\tPerfect\t11633\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_129.mp3\tJean Goldkette And His Orchestra\tSunday\tVICTOR\t20273B\t36829-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480551.mp3\tBen Webster And Oscar Peterson\tSunday\tVerve\tMGV8349\t22989-6\t1959\tOscar Peterson, P Ed Thigpen, D, Ray Brown, B\nhttp://www.jazz-on-line.com/a/mp3a/COLCO33268.mp3\tFrank Sinatra\tSunday Monday Or Always\tCOLUMBIA\t36679\tCO33268\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/PARP2545.mp3\tBartlette,viola\tSunday Morning Blues\tPARAMOUNT\t12369\tP2545\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1181-1.mp3\tJimmy Mundy Swing Club 7\tSunday Special\tVARSITY\t8148\tUS1181-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP310.mp3\tMildred Bailey\tSunday, Monday And Always\tV-DISC\t105\tVP310\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3172.mp3\tBing Crosby & Darby Singers\tSunday, Monday And Always\tDECCA\t10127\tL3172\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3172.mp3\tBing Crosby\tSunday, Monday Or Always\tDECCA\t18561A\tL3172\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC18561.mp3\tBing Crosby\tSunday, Monday Or Always\tDECCA\t18561\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol36679.mp3\tFrank Sinatra\tSunday, Monday Or Always\tColumbia\t36679\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VARM278-1.mp3\tBilly Kyle Swing Club Band\tSundays Are Reserved (vocal Palmer Bros)\tVARIETY\tI574\tM278-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU064870.mp3\tJohnny Temple\tSundown Blues\tBLUEBIRD\t8913\t064870\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC92070.mp3\tTexas Wanderers (c.bruner)\tSundown Blues (tin Roof Blues)\tDECCA\t5856\tC92070\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_047.mp3\tRuss Morgan And His Orchestra\tSunflower\tDECCA\t24568\tL4873\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4873.mp3\tRuss Morgan And His Orchestra\tSunflower\tDECCA\t24568\tL4873\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_133.mp3\tFrank Sinatra\tSunflower\tCOLUMBIA\t38391\tHCO3467\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_116.mp3\tJack Fulton Feat. Eddie Ballantyne And His Orchestra\tSunflower\tTower\t1454\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC33855-3.mp3\tGeorge Olsen And His Music\tSunny\tVICTOR\t19840B\t33855-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh785B.mp3\tNew Princess Toronto Band\tSunny Havana (v Hal Swain)\tColumbia\t3786\tWA-2509-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5462.mp3\tTeddy Wilson\tSunny Morning\tMUSICRAFT\t371\t5462\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO46493.mp3\tWilma Lee And Stoney Cooper\tSunny Side Of The Mountain\tCOLUMBIA\t20861\tCO46493\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE586.mp3\tEarl Burtnett And His Orch\tSunny Side Up\tBRUNSWICK\t4501\tLAE586\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_091.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra\tSunny Side Up\tBRUNSWICK\t4501\tLAE586\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_107.mp3\tJohnny Hamp And His Orchestra\tSunny Side Up\tVICTOR\t22124\t55687-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403052-B.mp3\tFrankie Trumbauer & His Orch\tSunny Side Up (v S B)\tOKeh\t41313\t403052-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC55687-1.mp3\tJohnny Hamp's Kentucky Seren.\tSunny Side Up (vf.luther)\tVICTOR\t22124\t55687-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC22124.mp3\tJohnny Hamp's Kentucky Seren.\tSunny Side Up (vf.luther)\tVICTOR\t22124\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480682.mp3\tRed Norvo Sextet\tSunrise Blues\tRCA\tLPM1449\tH2JB249\t1956\tBen Webster (ts), Harry ?Sweets? Edison (tp), Red Norvo (vib), Jimmy Rowles (p), Bob Carter (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3a/BLU035731.mp3\tGlenn Miller And His Orch\tSunrise Serenade\tBLUEBIRD\t10214 A\t035731\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC65035.mp3\tGlen Gray And Casa Loma Orch.\tSunrise Serenade\tDECCA\t2321B\t65035\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D230A1.mp3\tFrankie Carle And His Orchestra\tSunrise Serenade\tV-DISC\t230A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26215.mp3\tHal Kemp & His Orchestra\tSunrise Serenade\tVictor\t26215\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_012.mp3\tGlen Gray And Casa Loma Orchestra\tSunrise Serenade\tDECCA\t2321B\t65035\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE27804.mp3\tCab Calloway & His Orch\tSunset\tOKEH\t5804\t27804\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe09893-A.mp3\tLouis Armstrong's Hot Five\tSunset Cafe Stomp\tOKeh\t8423\t09893-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D326.mp3\tJimmy Dorsey & His Orch\tSunset Strip\tV-DISC\t326\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D326A.mp3\tJimmy Dorsey And His Orchestra\tSunset Strip\tV-DISC\t326A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU3850S.mp3\tNick Lucas\tSunshine\tBRUNSWICK\t3850\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC41688-3.mp3\tPaul Whiteman & His Orch\tSunshine\tVICTOR\t21240\t41688-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_145.mp3\tNick Lucas\tSunshine\tBRUNSWICK\t3850\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80360-7.mp3\tTed Lewis & His Jazz Band\tSunshine Alley\tCOLUMBIA\tA-3647\t80360-7\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5498.mp3\tPete Brown's Band\tSunshine Blues\tSAVOY\t644\tS5498\t1944\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU45CH.mp3\tGene Rodemich And His Orchestra\tSunshine Of Mine\tBRUNSWICK\t2579B\t45CH\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3d/Col26872-A.mp3\tCount Basie And His Orchestra\tSuper Chief\tColumbia\tMZ-257\t26872-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-10127-B.mp3\tArtie Shaw And His Orchestra\tSupper Time\tBLUEBIRD\tB-10127-B\t031494-1\t1939\tVocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3a/VIC78167-1.mp3\tLeo Reisman And His Orch\tSupper Time (vthelma Nevins)\tVICTOR\t24428\t78167-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/DECF10077.mp3\tTed Heath And His Music\tSur Le Pont D'avignon\tDECCA-LONDON\tF10077\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-165-1.mp3\tTrio De Saxophones Alix Combelle\tSur Les Bords De L'alamo (on The Alamo)\tSwing\t96\tOSW-165-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73720.mp3\tLouis Jordan\tSure Had A Wonderful Time\tDECCA\t24104\t73720\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MERC666-3.mp3\tCount Basie & His Orchestra\tSure Thing\tMERCURY\t8964\tC666-3\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM590-1.mp3\tCharlie Barnet & His Orch\tSurrealism\tVARIETY\tI633\tM590-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_017.mp3\tPerry Como Feat. Russell Case's Orchestra\tSurrender\tRCA Victor\t1877\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_072.mp3\tArthur Collins And Byron Harlan\tSusan, Kiss Me Good And Hard\tCOLUMBIA\tA-0401\t3494\t1906\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0928_01.mp3\tLee Morse\tSusianna\tColumbia\t1752DA\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/TEM536x.mp3\tWolverines\tSusie\tTemple\t536\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80440.mp3\tEddie Cantor\tSusie\tCOLUMBIA\tA-3682\t80440\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN11855-A.mp3\tWolverine Orchestra\tSusie\tGENNETT\t5454\t11855-A\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP10109x.mp3\tTex Williams\tSuspicion\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_328.mp3\tRay Noble And His Orchestra\tSuspicion\tCOLUMBIA\t38146\tHCO3042\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_302.mp3\tJo Stafford\tSuspicion\tCapitol\t15068\t2919\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVS5748.mp3\tHelen Humes W Herbie Fields\tSuspicious Blues (v Helen Humes)\tSAVOY\t5514A\tS5748\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP2827.mp3\tFletcher Henderson & His Orch\tSwamp Blues\tPARAMOUNT\t12486\tP2827\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17020-1.mp3\tOzzie Nelson & His Orch\tSwamp Fire\tBRUNSWICK\t7414\t17020-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D356B2.mp3\tThe Three Suns\tSwamp Fire\tV-DISC\t356B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_433.mp3\tKay Starr\tSwamp Fire\tCapitol\t2595\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-11850-A.mp3\tDuke Ellington And His Famous Orchestra\tSwampy River\tBrunswick\t6355\tB-11850-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78917-2.mp3\tAl Jolson\tSwanee\tCOLUMBIA\tA-2884\t78917-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31943.mp3\tLouisiana Rhythm Kings\tSwanee\tBRUNSWICK\t4845\tE31943\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72934-B.mp3\tEddie Condon & His Orch\tSwanee\tDECCA\t23433\t72934-B\t1945\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18688.mp3\tPeerless Quartet\tSwanee\tVictor\t18688\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-2884.mp3\tAl Jolson\tSwanee\tCOLUMBIA\tA-2884\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_136.mp3\tPeerless Quartet\tSwanee\tVictor\t18688\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_127.mp3\tAll-star Trio\tSwanee\tVICTOR\t18651B\t23645-4\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_003.mp3\tAl Jolson\tSwanee\tColumbia\t2884\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-31943.mp3\tLouisiana Rhythm Kings\tSwanee\tBrunswick\t4845\tE-31943\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11915-1.mp3\tCab Calloway And His Orchestra\tSwanee Lullaby\tBanner\t32540\t11915-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MonP77352.mp3\tQunitet Of Hot Club Of France\tSwanee River\tMontgomeryWard\t10103\tP77352\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUWC2575.mp3\tGene Krupa & His Orch\tSwanee River\tBRUNSWICK\t8387\tWC2575\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC055112-1.mp3\tTommy Dorsey & His Orch\tSwanee River\tVICTOR\t27233\t055112-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC010167.mp3\tBunny Berigan & His Orch\tSwanee River\tVICTOR\t25588A\t010167\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77352.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tSwanee River\tUltraphone\tAP-1479\tP-77351\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA96.mp3\tBing Crosby\tSwanee River\tDECCA\t18804A\tDLA96\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC39997-A.mp3\tJimmie Lunceford And His Orchestra\tSwanee River\tDECCA\t668A\t39997-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_278.mp3\tJimmie Lunceford And His Orchestra\tSwanee River\tDECCA\t668A\t39997-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BruDLA96-A.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tSwanee River\tBrunswick\tE01993\tDLA96-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh210.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stephane Grappely\tSwanee River\tUltraphon\tAP-1479\tP-77352\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_317.mp3\tBunny Berigan And His Orchestra\tSwanee River\tVICTOR\t25588A\t010167\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU07396HW2-4.mp3\tBoots And His Buddies\tSwanee River Blues\tBLUEBIRD\t6921\t07396-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_308.mp3\tThe Commanders\tSwanee River Boogie\tDECCA\t28659\t84025\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/MER430-3.mp3\tAlbert Ammons Rhythm Kings\tSwanee River Boogie\tMERCURY\t8022\t430-3\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC1101-2-3.mp3\tBen Bernie And His Orch\tSwanee Shore\tBRUNSWICK\t3631\tC1101-2-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/HAR144474-1.mp3\tUniversity Six\tSwanee Shore\tHARMONY\t466-H\t144474-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_098.mp3\tDean Martin\tSway\tCapitol\t2818\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_163.mp3\tEileen Barton With The Terry Gibbs Sextet\tSway (quien Sera)\tCORAL\t61185\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_174.mp3\tPercy Faith And His Orchestra\tSwedish Rhapsody (midsummer Vigil)\tColumbia\t39944\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400986-A.mp3\tChicago Footwarmers\tSweep Em Clean\tOKeh\t8792\t400986-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67306-A.mp3\tSam Price's Texas Blusicians\tSweepin' The Blues Away\tDECCA\t7781B\t67306-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC57232-2.mp3\tCoon-sanders Orchestra\tSweepin' The Clouds Away\tVICTOR\t22346\t57232-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/MERC660-2.mp3\tJohnny Hodges & His Orchestra\tSweeping The Blues Away\tMERCURY\t8977\tC660-2\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU70224-2.mp3\tRuss Columbo\tSweet & Lovely\tBLUEBIRD\t7118\t70224-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC61099-1.mp3\tGus Arnheim Coconut Grove Orch\tSweet & Lovely (vnovis)\tVICTOR\t22770\t61099-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU018631.mp3\tGolden Gate Jubilee Qt\tSweet Adeline\tBLUEBIRD\t7676\t018631\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21425-2.mp3\tArtie Shaw And His New Music\tSweet Adeline\tBRUNSWICK\t7936\tB-21425-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0425.mp3\tTempo King's Kings Of Tempo\tSweet Adeline\tBLUEBIRD\t6563\t0425\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic16803s.mp3\tHaydn Quartet\tSweet Adeline\tVictor\t16803\t\t1904\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_001.mp3\tHaydn Quartet\tSweet Adeline (you're The Flower Of My Heart)\tVictor\t2934\t\t1904\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_088.mp3\tGeorgia Gibbs\tSweet And Gentle\tMercury\t70647\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_073.mp3\tAlan Dale\tSweet And Gentle\tCoral\t61435\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3d/BruC-4471.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tSweet And Hot\tBrunswick\t4878\tC-4471\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Col151277-2.mp3\tFletcher Henderson And His Orchestra\tSweet And Hot\tColumbia\t2414-D\t151277-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/ASCT5.mp3\tArt Tatum\tSweet And Lovely\tASCH\t356-3\tT5\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CAPH2371.mp3\tBenny Goodman And His Orchestra\tSweet And Lovely\tCAPITOL\t\tH2371\t\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1020.mp3\tGeorgie Auld & His Orchestra\tSweet And Lovely\tAPOLLO\t359\tR1020\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUE37156.mp3\tBing Crosby W Victor Young\tSweet And Lovely\tBRUNSWICK\t6179\tE37156\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D320A1.mp3\tTommy Dorsey And His Orchestra\tSweet And Lovely\tV-DISC\t320A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_003.mp3\tGus Arnheim And His Orchestra Feat. Donald Novis\tSweet And Lovely\tVICTOR\t22770\t61099-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/DiaD-1142-D.mp3\tDexter Gordon\tSweet And Lovely\tDial\t1042\tD-1142-D\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh152.mp3\tSavoy Hotel Orpheans Dir. By Carroll Gibbons\tSweet And Lovely (v Al Bowlly)\tWorld\tSM-634\tCA-12093-1\t1931\tthe beginning is missing (cut off)\nhttp://www.jazz-on-line.com/a/mp3a/COLW151692-3.mp3\tGuy Lombardo Royal Canadians\tSweet And Lovely (vcl)\tCOLUMBIA\t2500 D\tW151692-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_153.mp3\tElsie Baker\tSweet And Low\tVICTOR\t45174\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3e/COL78664-3.mp3\tArt Hickman's Orch\tSweet And Low (w)\tCOLUMBIA\tA-2814\t78664-3\t1919\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3004-A.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tSweet And Low Blues\tBrunswick\t7061\tC-3004-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65955.mp3\tLouis Prima's New Orleans Gang\tSweet And Low Down\tDECCA\t2749B\t65955\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL152752-1.mp3\tTeddy Wilson (piano)\tSweet And Simple\tCBS\t66370\t152752-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic49455-1.mp3\tJelly Roll Morton And His Orchestra\tSweet Aneta Mine\tVictor\tV-38093\t49455-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49455-1.mp3\tJelly Roll Morton Peppers\tSweet Anita Mine\tVICTOR\t38093\t49455-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_033.mp3\tHarry Macdonough And S. H. Dudley\tSweet Annie Moore\tVictor\t775\t\t1901\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA-1139-A.mp3\tLouis Armstrong And His Orchestra\tSweet As A Song\tDECCA\t1653\tDLA-1139-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3/Joh003.mp3\tJack White And His Collegions\tSweet As A Song\tJohnW\t003\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh003.mp3\tJack White And His Collegians\tSweet As A Song (v Tony Morris)\tParlophone\tF-1107\tCE-9052-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe8485-A.mp3\tKing Oliver's Jazz Band\tSweet Baby Doll\tOKeh\t8235\t8485-A\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC34171-2.mp3\tGene Austin\tSweet Child\tVICTOR\t19928\t34171-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19946.mp3\tPaul Whiteman & His Orchestra\tSweet Child\tVictor\t19946\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN6362-3.mp3\tSam Lanin And His Orchestra\tSweet Child (i'm Wild About You)\tBANNER\t1676\t6362-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_162.mp3\tGene Austin\tSweet Child (i'm Wild About You)\tVICTOR\t19928\t34171-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1095-1.mp3\tDjango Reinhardt\tSweet Chorus\tGramophone\tK-7843\tOLA-1095-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75990.mp3\tEddie Condon & His Orch\tSweet Cider Time, When You're Mine\tDECCA\t27106\t75990\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC62192-1.mp3\tDuke Ellington & His Orch\tSweet Dreams Of Love\tVICTOR\t38143\t62192-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC48883-3.mp3\tEarl Hines & His Orch\tSweet Ella May\tVICTOR\t22842\t48883-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR146332-2.mp3\tHarmonians\tSweet Ella May (v Dick Burnett=ik)\tHARMONY\t694-H\t146332-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC072233.mp3\tGlenn Miller And His Orch\tSweet Eloise\tVICTOR\t27879\t072233\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh118.mp3\tGeraldo And His Orchestra\tSweet Eloise (v George Evans)\tParlophone\tF-1944\tCE-10999-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE7390.mp3\tKing Oliver Dixie Syncopators\tSweet Emalina\tVOCALION\t1190\tE7390\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64345.mp3\tBob Howard & His Orch\tSweet Emalina, My Gal\tDECCA\t2263A\t64345\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67402.mp3\tBob Crosby & His Orch\tSweet Genevieve\tDECCA\t3668 A\t67402\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUJC8592-A.mp3\tBing Crosby W Isham Jones\tSweet Georgia Brown\tBRUNSWICK\t6320\tJC8592-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP653.mp3\tKing Cole Trio\tSweet Georgia Brown\tCAPITOL\t\t653\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW140597.mp3\tEthel Waters And Her Ebony Four\tSweet Georgia Brown\tCOLUMBIA\t379D\tW140597\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDTB3524.mp3\tQuintet Of Hot Club Of France\tSweet Georgia Brown\tDECCA\t23065A\tDTB3524\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/TEMTR-652-A.mp3\tBrother Bones And His Shadows\tSweet Georgia Brown\tTempo\tTR-652-A\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC32565-3.mp3\tOliver Naylor's Orch\tSweet Georgia Brown\tVICTOR\t19688A\t32565-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOLA2146.mp3\tEddie South And His Orch\tSweet Georgia Brown\tVICTOR\t26222\tOLA2146\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140603.mp3\tCalifornia Ramblers\tSweet Georgia Brown\tCOLUMBIA\t380D\t140603\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28968.mp3\tGene Krupa & His Orch\tSweet Georgia Brown\tOKEH\t6070\t28968\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC90578.mp3\tJimmy Noone & New Orleans Band\tSweet Georgia Brown\tDECCA\t18440B\tC90578\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38606.mp3\tMills Brothers\tSweet Georgia Brown\tDECCA\t380A\t38606\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051261-1.mp3\tErskine Hawkins & His Orch\tSweet Georgia Brown\tBLUEBIRD\t10854\t051261-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE33305-A.mp3\tRed Nichols & His Orch\tSweet Georgia Brown\tBRUNSWICK\t4944\tE33305-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW24678.mp3\tJohn Kirby & His Orch\tSweet Georgia Brown\tCOLUMBIA\t36001\tW24678\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDTB-3524-1.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tSweet Georgia Brown\tDECCA\tF-6675\tDTB-3524-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/CRO1478-2.mp3\tEubie Blake & His Orch\tSweet Georgia Brown\tCROWN\t3197\t1478-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-2220-1.mp3\tDjango Reinhardt\tSweet Georgia Brown\tSWING\t35\tOLA-2220-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19688.mp3\tOliver Naylor's Orchestra\tSweet Georgia Brown\tVictor\t19688\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_088.mp3\tBrother Bones And His Shadows\tSweet Georgia Brown\tTempo\tTR-652-A\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_004.mp3\tBen Bernie And His Orchestra\tSweet Georgia Brown\tVOCALION\t15002B\tNN575\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/Con10727-2.mp3\tCab Calloway And His Orchestra\tSweet Georgia Brown\tConqueror\t7817\t10727-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-24515-1.mp3\tHarry James And His Orchestra\tSweet Georgia Brown\tBrunswick\t8327\tB-24515-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CON10727-2.mp3\tCab Calloway & His Orch\tSweet Georgia Brown (vcc)\tCONQUEROR\t7817\t10727-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/MER3376-6.mp3\tMuggsy Spanier.\tSweet Georgia Brown - Featherbrain\tMERCURY\t3375\t3376-6\t\t\nhttp://www.jazz-on-line.com/a/mp3a/EDI10428.mp3\tTennessee Happy Boys\tSweet Georgia Brown - Foxtrot (bernie, Casey & Pinkard)\tEDISON\t\t10428\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU99365.mp3\tBoots And His Buddies\tSweet Girl\tBLUEBIRD\t10043A\t99365\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1210.mp3\tBing Crosby & Harry Owens\tSweet Hawaiian Chimes\tDECCA\t1845A\tDLA1210\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/COLLA1022.mp3\tAndy Iona's Novelty Four\tSweet Hawaiian Maid\tCOLUMBIA\t3053 D\tLA1022\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC18531-B.mp3\tJoseph C. Smith's Orchestra\tSweet Hawaiian Moonlight\tVICTOR\t18531\t18531-B\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07753-1.mp3\tFats Waller And His Rhythm\tSweet Heartache\tVICTOR\t25580\t07753-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07754.mp3\tFats Waller And His Rhythm\tSweet Heartache\tVICTOR\t25571\t07754\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-8480-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tSweet Heartache \tParlophone\tF-867\tCE-8480-1 \t1937\tValaida Snow t v acc. by Johnny Claes t, Derek Neville as bar, Reggie Dare ts, Gun Finlay p, Norman Brown g, Louis Barreiro b, Ken Stewart d\nhttp://www.jazz-on-line.com/a/mp3w/1956_248.mp3\tEddie Fisher\tSweet Heartaches\tRCA\t6529\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S6016.mp3\tEarl Hines & His Orch\tSweet Honey Babe\tMGM\t10329A\t47S6016\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU8486.mp3\tMarion Harris\tSweet Indiana Home\tBRUNSWICK\t2310\t8486\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC26519.mp3\tAileen Stanley\tSweet Indiana Home\tVICTOR\t18922\t26519\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_061.mp3\tMarion Harris\tSweet Indiana Home\tBRUNSWICK\t2310\t8486\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_016.mp3\tAileen Stanley\tSweet Indiana Home\tVICTOR\t18922\t26519\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA742.mp3\tBing Crosby & Victor Young\tSweet Is The Word For You\tDECCA\t1184\tDLA742\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04927.mp3\tTommy Dorsey & His Orch\tSweet Is The Word For You\tVICTOR\t25532\t04927\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA742-B.mp3\tVictor Young And His Orchestra With Bing Crosby\tSweet Is The Word For You \tDECCA\t\tDLA742-B \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA742-A.mp3\tVictor Young And His Orchestra With Bing Crosby\tSweet Is The Word For You \tDECCA\t1184\tDLA742-A \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA742.mp3\tVictor Young And His Orchestra With Bing Crosby\tSweet Is The Word For You \tDECCA\t\tDLA742 \t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_104.mp3\tBilly Murray\tSweet Italian Love\tVICTOR\t16951\tB9382-1\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_040.mp3\tByron G. Harlan\tSweet Italian Love\tCOLUMBIA\tA-0896\t04563\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62194-2.mp3\tDuke Ellington & His Orch\tSweet Jazz Of Mine\tVICTOR\t38143\t62194-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/KIR150838-3.mp3\tTed Wallace\tSweet Jennie Lee\tKIRKEBY\tCO2301D\t150838-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1122.mp3\tReser's Radio Band\tSweet Jennie Lee\tHit-Of-The-Week\t1122\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CON10134-1.mp3\tCab Calloway & His Orch\tSweet Jennie Lee (vcc)\tCONQUEROR\t7644\t10134-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC6129.mp3\tIsham Jones And His Orch\tSweet Jennie Lee!\tBRUNSWICK\t4909\tC6129\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_215.mp3\tKitty Kallen\tSweet Kentucky Rose\tDecca\t29708\t88680\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79972-3.mp3\tFrank Crumit\tSweet Lady\tCOLUMBIA\tA-3475\t79972-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_025.mp3\tFrank Crumit\tSweet Lady\tCOLUMBIA\tA-3475\t79972-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA722-B.mp3\tBing Crosby And Lani Mcintyre\tSweet Leilani\tDECCA\t1175\tDLA722-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D379B1.mp3\tHarry Owens And His Royal Hawaiians\tSweet Leilani\tV-DISC\t379B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480907.mp3\tJerry Murad, Harmonica; Richard Hayman And His Orchestra\tSweet Leilani\tMERCURY\t70202\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA722-B.mp3\tLani Mcintyre And His Hawaiians With Bing Crosby\tSweet Lelani\tDECCA\t11012\tDLA722-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA722-A.mp3\tLani Mcintyre And His Hawaiians With Bing Crosby\tSweet Lelani\tDECCA\t\tDLA722-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC56757-2.mp3\tKing Oliver And His Orchestra\tSweet Like This\tVictor\tV-38101\t56757-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_454.mp3\tJaye P. Morgan\tSweet Lips\tRCA\t6441\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe09779-A.mp3\tLouis Armstrong's Hot Five\tSweet Little Papa\tOKeh\t8379\t09779-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3h/Gen15150.mp3\tPat Dollohan And His Orchestra\tSweet Liza\tGennett\t\t15150\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP139.mp3\tKing Cole Trio\tSweet Lorraine\tCAPITOL\t20009\t139\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL27523.mp3\tFrankie Carle\tSweet Lorraine\tCOLUMBIA\t35572\t27523\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COL25736-1.mp3\tTeddy Wilson And His Orch\tSweet Lorraine\tCOLUMBIA\t35711\t25736-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/V-D139.mp3\tNat King Cole Qt\tSweet Lorraine\tV-DISC\t359\t139\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC021625.mp3\tBenny Goodman Trio\tSweet Lorraine\tVICTOR\t25822\t021625\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61814.mp3\tJimmie Davis\tSweet Lorraine\tDECCA\t5465\t61814\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJCR350-3.mp3\tCootie Williams & His Orch\tSweet Lorraine\tMAJESTIC\t1171\tCR350-3\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW265146.mp3\tJoe Venuti's Blue Five\tSweet Lorraine\tCOLUMBIA\t\tW265146\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D802SL.mp3\tCount Basie & His Orchestra\tSweet Lorraine\tV-DISC\t802\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC48841-2.mp3\tJohnny Dodds & His Band\tSweet Lorraine\tVICTOR\t38038\t48841-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/SIGT19005.mp3\tColeman Hawkins Swing 4\tSweet Lorraine\tSIGNATURE\t90001A\tT19005\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4766.mp3\tMuggsy Spanier Ragtime Band\tSweet Lorraine\tCOMMODORE\t1517\t4766\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1938.mp3\tArt Tatum\tSweet Lorraine\tDECCA\t25200\tDLA1938\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR660-Hy.mp3\tLou Gold And His Och\tSweet Lorraine\tHarmony\t660-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D359A2.mp3\tThe King Cole Trio\tSweet Lorraine\tV-DISC\t359A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-17916-1.mp3\tTeddy Wilson And His Orchestra\tSweet Lorraine\tBRUNSWICK\t7520\tB-17916-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Mer1894.mp3\tDexter Gordon Quintet\tSweet Lorraine\tMerculy\t15003\t1894\t1943\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480426.mp3\tNat King Cole\tSweet Lorraine\tCapitol\tEAP2/EBF1/W-782\t15790-4\t1957\tNat King Cole, P & Vocal, acc. by Harry ?Sweets? Edison (tp), John Collins (g), Charlie Harris (sb), Lee Young (dm)\nhttp://www.jazz-on-line.com/a/mp3c/GENG11352.mp3\tNew Orleans Rhythm Kings\tSweet Lovin' Man\tGENNETT\t5104\tG11352\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/Oke8392-3.mp3\tKing Oliver's Jazz Band\tSweet Lovin' Man\tOkeh\t4906\t8392-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA88-A.mp3\tMills Brothers\tSweet Lucy Brown\tDECCA\t497A\tDLA88-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14051-1.mp3\tCasa Loma Orchestra\tSweet Madness\tBRUNSWICK\t6660\t14051-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31508.mp3\tDuke Ellington & His Orch\tSweet Mama\tBRUNSWICK\t6811\tE31508\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COL79394-1.mp3\tMarion Harris\tSweet Mama\tCOLUMBIA\tA-3300\t79394-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18722B.mp3\tOriginal Dixieland Jazz Band\tSweet Mama - Papa's Getting Ma\tVICTOR\t18722B\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC24810-2.mp3\tOriginal Dixieland Jazz Band\tSweet Mama - Papa's Getting Mad\tVICTOR\t18722B\t24810-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69559.mp3\tBon Bon & His Buddies\tSweet Mama, Papa's Getting Mad\tDECCA\t3980B\t69559\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141163-2.mp3\tEthel Waters' Plantation Orch\tSweet Man\tCOLUMBIA\t487D\tW141163-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1042.mp3\tLuis Russell & His Orch\tSweet Memory\tAPOLLO\t1020\tR1042\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143735-3.mp3\tBessie Smith\tSweet Mistreater\tCOLUMBIA\t14260 D\tW143735-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe9905.mp3\tLuis Russell's Hot Six\tSweet Mumtaz\tOKeh\t8454\t9905\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic70141-1.mp3\tFletcher Henderson And His Connie's Inn Orchestra\tSweet Music\tVictor\t22775\t70141-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57080-1.mp3\tJelly Roll Morton Red Peppers\tSweet Peter\tVICTOR\t23402\t57080-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic57080-1.mp3\tJelly Roll Morton And His Red Hot Peppers\tSweet Peter\tVictor\t23402\t57080-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046784.mp3\tGlenn Miller & His Orch\tSweet Potato Piper\tBLUEBIRD\t10605\t046784\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1909.mp3\tBing Crosby & Foursome\tSweet Potato Piper\tDECCA\t2999B\tDLA1909\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC62600-1.mp3\tJimmie Lunceford And His Chickasaw Syncopators\tSweet Rhythm\tVICTOR\t38141\t62600-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru12587-A.mp3\tCab Calloway And His Orchestra\tSweet Rhythm\tBrunswick\t6473\t12587-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23684.mp3\tSlim And Slam\tSweet Safronia\tCBS\tVO4594\t23684\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402541-B.mp3\tLouis Armstrong & His Orch\tSweet Savannah Sue\tOKeh\t8717\t402541-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic49493-2.mp3\tThomas Waller\tSweet Savannah Sue\tVictor\t22108\t49493-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Pol2424hpp.mp3\tDjango Reinhardt\tSweet Serenade\tPolydor\tF-512737\t2424hpp\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL787.mp3\tJoe Turner\tSweet Sixteen\tATLANTIC\t960\t787\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149900-2.mp3\tCharlie Poole N.carolina Ramb.\tSweet Sixteen\tCOLUMBIA\t15519 D\tW149900-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18569B.mp3\tLucky Millinder's Orch.\tSweet Slumber\tDECCA\t18569B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VicD9VB-2572.mp3\tLucky Millinder And His Orchestra\tSweet Slumber\tVictor\t20-0088\tD9VB-2572  \t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71452.mp3\tLucky Millinder And His Orchestra\tSweet Slumber\tDecca\t18569\t71452\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64153.mp3\tRice Brothers Gang\tSweet Someone\tDECCA\t5552\t64153\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW144302.mp3\tPaul Ash And His Orchestra\tSweet Someone\tCOLUMBIA\t1034 D\tW144302\t1927\tDanny Polo, clarinet, alto & baritone saxes, replaces Wing or Nettles; Hank Winston, piano replaces Barris. Chicago, June 8th 1927\nhttp://www.jazz-on-line.com/a/mp3c/ARCB13354.mp3\tSpike Hughes & His Orchestra\tSweet Sorrow Blues\tARC\tDE5101F\tB13354\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/DecB-13354-A.mp3\tSpike Hughes And His Negro Orchestra With Benny Carter\tSweet Sorrow Blues \tDecca \tF-5101\tB-13354-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_086.mp3\tMills Brothers\tSweet Sue\tBANNER\t33214\t11709-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC12505A.mp3\tBing Crosby\tSweet Sue\tARC\t\t12505A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC028176.mp3\tTommy Dorsey & His Orch\tSweet Sue\tVICTOR\t26105\t028176\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-154-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tSweet Sue\tSWING\t118\tOSW-154-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_221.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tSweet Sue\tVICTOR\t26105\t028176\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11315-A.mp3\tRed Nichols & His Orchestra\tSweet Sue - Just You\tBRUNSWICK\t6266\t11315-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR638-Hy.mp3\tWesterners\tSweet Sue - Just You\tHarmony\t638-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404550-C.mp3\tJoe Venuti's Blue Four\tSweet Sue - Just You\tOKeh\t41469\t404550-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC38498-B.mp3\tIsham Jones And His Orchestra\tSweet Sue - Just You\tDecca\t443\t38498-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_025.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra Feat. The Biltmore Trio\tSweet Sue - Just You\tCOLUMBIA\t1361 D\tW145931-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63587-A.mp3\tJimmie Lunceford And His Orchestra\tSweet Sue - Just You\tDecca\t1927\t63587-A\t1938\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3d/BruE-31946.mp3\tLouisiana Rhythm Kings\tSweet Sue - Just You\tBrunswick\t4953\tE-31946\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC03062-1.mp3\tBenny Goodman Qt\tSweet Sue Just You\tVICTOR\t25473-A\t03062-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88998-1.mp3\tFats Waller And His Rhythm\tSweet Sue, Just You\tVICTOR\t25087\t88998-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64959.mp3\tMills Brothers\tSweet Sue, Just You\tDECCA\t2441B\t64959\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1938.mp3\tJimmie Noone's Apex Jazz Band\tSweet Sue, Just You\tVOCALION\t1184\tC1938\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1078.mp3\tLouis Prima's New Orleans Gang\tSweet Sue, Just You\tBRUNSWICK\t7596\tLA1078\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31946.mp3\tLouisiana Rhythm Kings\tSweet Sue, Just You\tBRUNSWICK\t4953\tE31946\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77241.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tSweet Sue, Just You\tUltraphone\tAP-1444\tP-77241\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-2312-1.mp3\tMichel Warlop (with Django Reinhardt)\tSweet Sue, Just You\tSWING\t43\tOLA-2312-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC25087.mp3\tFats Waller And His Rhythm\tSweet Sue, Just You\tVICTOR\t25087\t88998-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC43541-5.mp3\tBen Pollack And His Californians\tSweet Sue, Just You (vfb)\tVICTOR\t21437A\t43541-5\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/DecB-13356-A.mp3\tSpike Hughes And His Negro Orchestra With Benny Carter\tSweet Sue-just You \tDecca \tF-3972\tB-13356-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148475-2.mp3\tCharlie Poole N.c.ramblers\tSweet Sunny South\tCOLUMBIA\t15425 D\tW148475-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071911-1.mp3\tUna Mae Carlisle\tSweet Talk\tBLUEBIRD\t11507\t071911-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN2623.mp3\tHank Penny\tSweet Talking Mama\tKING\t\t2623\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN2492-K.mp3\tMoon Mullican\tSweet Than The Flowers\tKING\t673B\t2492-K\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143125-6.mp3\tFletcher Henderson's Orch\tSweet Thing\tCOLUMBIA\t854 D\tW143125-6\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013329.mp3\tBunny Berigan & His Orch\tSweet Varsity Sue\tVICTOR\t25667A\t013329\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLC1138.mp3\tSweet Violet Boys\tSweet Violets\tCOLUMBIA\t20208\tC1138\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLC1138-2.mp3\tSweet Violet Boys\tSweet Violets\tCOLUMBIA\t37609\tC1138-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_172.mp3\tSweet Violet Boys\tSweet Violets\tVOCALION\t3110\tC1138-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_213.mp3\tDoris Drew Feat. Cliff Parman Orchestra And Jack Halloran Chorus\tSweet Violets\tMERCURY\t5673\tMe4329\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/CONC1885-2.mp3\tSweet Violet Boys\tSweet Violets #3\tCONQUEROR\t9067\tC1885-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70905-4.mp3\tGene Kardos & His Orch\tSweet Violets (v D R)\tVICTOR\t22863\t70905-4\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_236.mp3\tSweet Violet Boys\tSweet Violets No. 2\tCOLUMBIA\t37615\tC1295\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38613.mp3\tMills Brothers\tSweeter Than Sugar\tDECCA\t267A\t38613\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061255.mp3\tGlenn Miller & His Orch\tSweeter Than The Sweetest (vpaula Kelly)\tBLUEBIRD\t11183\t061255\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62680.mp3\tEdgar Hayes Quintet\tSweetheart\tDECCA\t1684B\t62680\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC25350-3.mp3\tPaul Whiteman & His Orch\tSweetheart\tVICTOR\t18789B\t25350-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18789B.mp3\tPaul Whiteman & His Orch\tSweetheart\tVICTOR-\t18789B\t25350-3\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW265123-2.mp3\tBen Selvin & His Orch\tSweetheart Darlin' (vjm)\tCOLUMBIA\t2778\tW265123-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC38871.mp3\tClaude Hopkins And His Orchestra\tSweetheart O' Mine\tDECCA\t270B\t38871\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_055.mp3\tRudy Vallee And His Connecticut Yankees\tSweetheart Of All My Dreams\tHARMONY\t811-H\t147119\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/GUIG551-A1.mp3\tGeorgie Auld & His Orchestra\tSweetheart Of All My Dreams (v Patti Powers)\tGUILDE\t113\tG551-A1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1117y.mp3\tHit-of-the-week Orch\tSweetheart Of My Student Da\tHit-Of-The-Week\t1117\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150929.mp3\tTed Wallace & His Campus Boys\tSweetheart Of My Student Days\tCOLUMBIA\t2334 D\tW150929\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC64324-3.mp3\tRudy Vallee & His Ct.yankees\tSweetheart Of My Student Days\tVICTOR\t22560A\t64324-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_145.mp3\tTed Wallace And His Campus Boys\tSweetheart Of My Student Days\tCOLUMBIA\t2334 D\tW150929\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_097.mp3\tRudy Vallee And His Connecticut Yankees\tSweetheart Of My Student Days\tVICTOR\t22560A\t64324-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC019442.mp3\tTommy Dorsey & His Orch\tSweetheart Of Sigma Chi\tVICTOR\t26016A\t019442\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2440.mp3\tBing Crosby\tSweetheart Of Sigma Chi\tDECCA\t25228\tDLA2440\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_084.mp3\tGene Austin\tSweetheart Of Sigma Chi\tBluebird\t6815\t39189\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU57316-2.mp3\tBennie Moten's Kansas Orch\tSweetheart Of Yesterday\tBLUEBIRD\t6851\t57316-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_232.mp3\tGuy Mitchell\tSweetheart Of Yesterday\tCOLUMBIA\t39512\tCO45844\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/DECC92033.mp3\tRice Brothers Gang\tSweetheart Wait For Me\tDECCA\t5823\tC92033\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_0911_01.mp3\tLee Morse And Her Bluegrass Boys\tSweetheart's Holiday\tColumbia\t1972DA\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_268.mp3\tGuy Lombardo And His Royal Canadians\tSweetheart, Let's Grow Old Together\tVictor\t25417\t0706\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4880-1.mp3\tBill Monroe And Bluegrass Boys\tSweetheart, You Done Me Wrong (vbm)\tCOLUMBIA\t38172\tCCO4880-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC60101x.mp3\tChristie Mcdonald\tSweethearts\tVICTOR\t60101\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLNO2013.mp3\tShirley And Lee\tSweethearts\tALLADDIN\t3153\tNO2013\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO33060.mp3\tAl Goodman & His Orch\tSweethearts\tCOLUMBIA\t36739\tCO33060\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1607.mp3\tBing Crosby & J.s.trotter\tSweethearts\tDECCA\t2315B\tDLA1607\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC73321-2.mp3\tWayne King & His Orch\tSweethearts Forever\tVICTOR\t24115\t73321-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_031.mp3\tWayne King And His Orchestra\tSweethearts Forever\tVictor\t24117\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW147502-3.mp3\tGuy Lombardo Royal Canadians\tSweethearts On Parade\tCOLUMBIA\t1628 D\tW147502-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC035703.mp3\tLionel Hampton And His Orch\tSweethearts On Parade\tVICTOR\t26209\t035703\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC2512.mp3\tAbe Lyman & His Californians\tSweethearts On Parade\tBRUNSWICK\t4117\tC2512\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR787-Hx.mp3\tFrank Guarente And His Orch\tSweethearts On Parade\tHarmony\t787-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_061.mp3\tLouis Armstrong\tSweethearts On Parade\tCOLUMBIA\t2688 D\t404417-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic035703-1.mp3\tLionel Hampton And His Orchestra\tSweethearts On Parade\tVictor\t26209\t035703-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC4043-1.mp3\tDick Jurgens And His Orch\tSweethearts Or Strangers\tOKEH\t6525\tC4043-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU73398-1.mp3\tNew Orleans Feetwarmers\tSweetie Dear\tBLUEBIRD\t7614\t73398-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC73398-1.mp3\tNew Orleans Feetwarmers\tSweetie Dear\tVICTOR\t23360\t73398-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUCP1093-A.mp3\tAnson Weeks And California Orch (vks)\tSweetie Pie\tBRUNSWICK\t6965\tCP1093-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC84419-1.mp3\tFats Waller And His Rhythm\tSweetie Pie\tVICTOR\t24737\t84419-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_097.mp3\tFats Waller\tSweetie Pie\tBluebird\t10262\t84419-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2442.mp3\tBing Crosby\tSweetly She Sleeps, My Alice Fair\tDECCA\t18802B\tDLA2442\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0800_03.mp3\tLee Morse\tSweetman\tPathe\t25157A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_0724_02.mp3\tLee Morse And Her Bluegrass Boys\tSweetness\tColumbia\t1922DB\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB3190.mp3\tCount Basie Octet\tSweets\tRCA\t(VIC-LP)\tE0VB3190\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/DECHPP4969.mp3\tThe Quintet Of The Hot Club Of France\tSwing 39\tDECCA\t23262 B\tHPP4969\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC49691-2hpp.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tSwing 39\tDECCA\tF-7027\t49691-2hpp\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-145-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tSwing 41\tSWING\t95\tOSW-145-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-229-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tSwing 42\tSWING\t137\tOSW-229-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/BluST-2092-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tSwing 48\tBlue Star\t37\tST-2092-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC8507B.mp3\tBuddy Johnson & His Band\tSwing Along With Me\tDECCA\t8507B\t68293\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68293.mp3\tBuddy Johnson & His Band\tSwing Along With Me\tDECCA\t8507B\t68293\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_261.mp3\tSammy Kaye And His Orchestra\tSwing And Sway\tVOCALION\t3669\t21411-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS21411-1.mp3\tSwing & Sway With Sammy Kaye\tSwing And Sway (vbarons)\tCBS\tVO3669\t21411-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-155-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tSwing De Paris\tSWING\t176\tOSW-155-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC61574.mp3\tMills Brothers\tSwing For Sale\tDECCA\t1147\t61574\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT737.mp3\tJohnny Guarnieri Trio\tSwing For Yourself, John\tMAJESTIC\t1146\tT737\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC4210hpp.mp3\tDjango Reinhardt & The Hot Club De France Quintet W_stphane Grapelli, Violin\tSwing From Paris\tDECCA\tF-6899\t4210hpp\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOLA1291.mp3\tQuintet Of Hot Club\tSwing Guitars\tVICTOR\t25601\tOLA1291\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/VICOLA1982.mp3\tBill Coleman And His Orch\tSwing Guitars\tVICTOR\t26223\tOLA1982\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1091-1.mp3\tDjango Reinhardt\tSwing Guitars\tGramophone\tK-7898\tOLA-1091-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU04171.mp3\tTempo King's Kings Of Tempo\tSwing High Swing Low\tBLUEBIRD\t6780A\t04171\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1245.mp3\tDorothy Lamour\tSwing High, Swing Low\tBRUNSWICK\t7838\tLA1245\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_273.mp3\tDorothy Lamour\tSwing High, Swing Low\tBRUNSWICK\t7838\tLA1245\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU100015.mp3\tGene Krupa's Swing Band\tSwing Is Here To Stay\tBLUEBIRD\t10705\t100015\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC1351x.mp3\tAmbrose And His Orchestra\tSwing Is In The Air\tDECCA\t1351\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-8488-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tSwing Is The Thing \tParlophone\tF-88\tCE-8488-1 \t1937\tValaida Snow t v acc. by Johnny Claes t, Derek Neville as bar, Reggie Dare ts, Gun Finlay p, Norman Brown g, Louis Barreiro b, Ken Stewart d\nhttp://www.jazz-on-line.com/a/mp3d/Col265090-2.mp3\tBenny Carter And His Orchestra\tSwing It\tColumbia \tCB-628\t265090-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA129.mp3\tMills Brothers\tSwing It Sister\tBRUNSWICK\t6894\tLA129\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_037.mp3\tMills Brothers\tSwing It, Sister\tBRUNSWICK\t6894\tLA129\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC90930.mp3\tOriginal St. Louis Crackerjacks\tSwing Jackson\tDECCA\t7235\t90930\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-12346-A.mp3\tDuke Ellington And His Famous Orchestra\tSwing Low\tBrunswick\t6432\tB-12346-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS25711.mp3\tMildred Bailey W Alec Wilder\tSwing Low Sweet Chariot\tCBS\t(Reject)\t25711\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36399.mp3\tTommy Dorsey's Orch\tSwing Low, Sweet Chariot\tVICTOR\t36399\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1290.mp3\tBing Crosby - J.s.trotter\tSwing Low, Sweet Chariot\tDECCA\t1819B\tDLA1290\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC03552-1.mp3\tBenny Goodman & His Orch\tSwing Low, Sweet Chariot\tVICTOR\t25492\t03552-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic17890.mp3\tTuskagee Institute Singers\tSwing Low, Sweet Chariot\tVictor\t17890\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_079.mp3\tFisk University Jubilee Quartet\tSwing Low, Sweet Chariot\tVICTOR\t16453A\tB8420-2-3\t1910\t\nhttp://www.jazz-on-line.com/a/mp3d/Son4877-SEB.mp3\tValaida Acc. By Lulle Ellbojs Orkester\tSwing Low, Sweet Chariot \tSonora\t3577\t4877-SEB\t1939\tValaida Snow t v acc. by Sven Arefeldt dir. Bengt Artander Gunnar Green t, Sture Green tb, Gunnar Wallberg Rune ''Lulle'' Ellboj as, Rudolf Eriksson ts, Willard Ringstrand p, Karl L?rh g, Roland Bengtsson b, Olle Sahlin d\nhttp://www.jazz-on-line.com/a/mp3c/VICOEA6385-3.mp3\tFats Waller (organ)\tSwing Low, Sweet Chariot (v A. Hall)\tVICTOR\t27458\tOEA6385-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1113.mp3\tLouis Prima's New Orleans Gang\tSwing Me A Lullaby\tBRUNSWICK\t7680\tLA1113\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17242.mp3\tLouis Prima & His Gang\tSwing Me With Rhythm\tBRUNSWICK\t7431\t17242\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-17242-1.mp3\tLouis Prima And His New Orleans Gang\tSwing Me With Rhythm\tBrunswick\t7431\tB-17242-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_241.mp3\tHerbie Kay And His Orchestra\tSwing Mr. Charlie\tCOLUMBIA\t3125\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035721.mp3\tErskine Hawkins & H.o.\tSwing Out\tBLUEBIRD\t10224\t035721\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic53930-3.mp3\tHerny ''red'' Allen And His New York Orchestra\tSwing Out\tVictor\tV-38080\t53930-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67307.mp3\tSam Price's Texas Blusicians\tSwing Out In The Groove\tDECCA\t7732\t67307\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC91343-A.mp3\tLonnie Johnson\tSwing Out Rhythm\tDECCA\t7427\tC91343-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC063823-1.mp3\tSidney Bechet New Orleans F.w.\tSwing Parade\tVICTOR\t27574\t063823-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh192.mp3\tGeorge Elrick And His Swing Music Makers\tSwing Session In Siberia\tColumbia\tFB-1845\tCA-16711-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU033906.mp3\tCharlie Barnet & His Orch\tSwing Street Strut\tBLUEBIRD\t10172B\t033906\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM158-2.mp3\tCab Calloway & His Orch\tSwing Swing Swing\tVARIETY\tI501\tM158-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVar501.mp3\tCab Calloway & His Orchestra\tSwing Swing Swing\tVariety\t501\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA543-A.mp3\tLouis Armstrong & J.dorsey\tSwing That Music\tDECCA\t3105A\tDLA543-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA-543-A.mp3\tLouis Armstrong With Jimmy Dorsey And His Orchestra\tSwing That Music\tDecca\t866A\tDLA-543-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec61108-A.mp3\tLouis Armstrong And His Orchestra\tSwing That Music\tDecca\t866A\t61108-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe16574.mp3\tWingy Manone & His Orch\tSwing, Brother, Swing\tOKeh\t41573\t16574\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCW24880-A.mp3\tBillie Holiday\tSwing, Brother, Swing\tVOCALION\t5129\tW24880-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC61166.mp3\tJudy Garland & Bob Crosby\tSwing, Mr Charlie\tDECCA\t848B\t61166\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044597.mp3\tFats Waller And His Rhythm\tSwinga Dilla Street\tBLUEBIRD\t10858\t044597\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-3051-B.mp3\tHorace Henderson And His Orchestra\tSwingin' And Jumpin'\tOKEH\t5606\tWC-3051-B\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM141.mp3\tThree Peppers\tSwingin' At The Cotton Club\tVOCALION\t3805\tM141\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU101302-1.mp3\tWingy Manone And His Orch\tSwingin' At The Hickory House\tBLUEBIRD\t6375\t101302-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DECC91533.mp3\tBob Crosby & His Orch\tSwingin' At The Sugar Bowl\tDECCA\t2210A\tC91533\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_289.mp3\tBob Crosby And His Orchestra Feat. Nappy Lamare\tSwingin' At The Sugar Bowl\tDECCA\t2210A\tC91533\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB5187.mp3\tGene Krupa & His Orchestra\tSwingin' Doors\tRCA\t20-3906\tE0VB5187\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/VOCB-15009-A.mp3\tEarl Hines And His Orch\tSwingin' Down\tVOCALION\t3392\tB-15009-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU10564.mp3\tIsham Jones And His Orch\tSwingin' Down The Lane\tBRUNSWICK\t2438\t10564\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiGre1175.mp3\tLannin & His Orchestra\tSwingin' Down The Lane\tGrey Gull\t1175\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61569.mp3\tClaude Hopkins & His Orchestra\tSwingin' Down The Lane\tDECCA\t1153\t61569\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_002.mp3\tIsham Jones And His Orchestra\tSwingin' Down The Lane\tBRUNSWICK\t2438\t10564\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/VARM440.mp3\tCalifornia Ramblers (barnet)\tSwingin' Down To Rio\tVARIETY\tI603\tM440\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1083.mp3\tPhil Spitalny's Music\tSwingin' In A Hammock\tHit-Of-The-Week\t1083\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1995_032.mp3\tGuy Lombardo And His Orchestra\tSwingin' In A Hammock\tCOLUMBIA\t2237 D\tW150605-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_1205_01.mp3\tLee Morse And Her Bluegrass Boys\tSwingin' In A Hammock\tColumbia\t2225DA\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150605-3.mp3\tGuy Lombardo Royal Canadians\tSwingin' In A Hammock (v C L)\tCOLUMBIA\t2237 D\tW150605-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-15035-A.mp3\tMills Blue Rhythm Band\tSwingin' In E Flat\tColumbia\t3038-D\tCO-15035-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65307.mp3\tLouis Jordan & His Tympani 5\tSwingin' In The Cocoanut Trees\tDECCA\t7623\t65307\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63159.mp3\tEdgar Hayes & His Orchestra\tSwingin' In The Promised Land\tDECCA\t1665A\t63159\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D301B2.mp3\tBing Crosby\tSwingin' On A Star\tV-DISC\t301B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWC3069.mp3\tJimmie Lunceford & His Orch\tSwingin' On C\tCOLUMBIA\t35725\tWC3069\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061544.mp3\tEarl Hines & His Orch\tSwingin' On C\tBLUEBIRD\t11465B\t061544\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/ColWC-3069-A.mp3\tJimmie Lunceford And His Orchestra\tSwingin' On C\tColumbia\t35725\tWC-3069-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu061544-1.mp3\tEarl Hines And His Orchestra\tSwingin' On C\tBluebird\tB-11465\t061544-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Freddy Webster (tp) Joe McLewis, George Hunt, John Ewing (tb) Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck\nhttp://www.jazz-on-line.com/a/mp3b/Blu061544-1.mp3\tEarl Hines And His Orchestra\tSwingin' On C (ed Arr)  \tBluebird\tB-11465B\t061544-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC066924-1.mp3\tTommy Dorsey & His Orch\tSwingin' On Nothing\tVICTOR\t27578\t066924-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26245A.mp3\tJack Teagarden & His Orch\tSwingin' On The Teagarden Gate\tCBS\tCO35323\t26245A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-170-1.mp3\tPierre Allier Et Son Orchestre (with Django Reinhardt)\tSwingin' The Blues\tSWING\t89\tOSW-170-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC01806.mp3\tFats Waller And His Rhythm\tSwingin' Them Jingle Bells\tVICTOR\t25490\t01806\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC01805-1.mp3\tFats Waller And His Rhythm\tSwingin' Them Jingle Bells (vfw)\tVICTOR\t25483B\t01805-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1893.mp3\tWillie Lewis & Negro Band\tSwinging At Chez Florence\tVARSITY\tEL4070s\t1893\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEMEM83.mp3\tSwift Jewel Cowboys\tSwinging At The Circle Five\tOKEH\t5737\tMEM83\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC61544-A.mp3\tCount Basie And His Orch\tSwinging At The Daisy Chain\tDECCA\t3708B\t61544-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24778-2.mp3\tJames P Johnson\tSwinging At The Lido\tCBS\t(Reject)\t24778-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VOC10923.mp3\tBen Bernie & His Orch\tSwinging Down The Lane\tVOCALION\t14537B\t10923\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_017.mp3\tBen Bernie And His Orchestra\tSwinging Down The Lane\tVocalion\t14537\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/Jaz028991-1.mp3\tMezz Mezzrow And His Orchestra\tSwinging For Mezz\tJazz Archives\t40\t028991-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19822.mp3\tErskine Hawkins Bama St Colleg\tSwinging In Harlem\tVOCALION\t3336\t19822\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM493.mp3\tColeman Hawkins\tSwinging In The Groove\tDECCA\t8710\tAM493\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3307.mp3\tBing Crosby And Williams Bros Qt\tSwinging On A Star\tDECCA\t18597B\tL3307\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_001.mp3\tBing Crosby Feat. John Scott Trotter's Orchestra And The Williams Brothers Quartet\tSwinging On A Star\tDECCA\t18597B\tL3307\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61258.mp3\tBob Howard & His Orch\tSwinging On The Moon\tDECCA\t927A\t61258\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU87269.mp3\tInk Spots\tSwinging On The Strings\tBLUEBIRD\t6530\t87269\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63289-A.mp3\tCount Basie And His Orch\tSwinging The Blues\tDECCA\t1880B\t63289-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC82218-2.mp3\tJimmie Lunceford And His Orchestra\tSwinging Uptown\tVICTOR\t24669\t82218-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-1994-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tSwinging With Django\tSWING\t40\tOLA-1994-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/COM75958.mp3\tBud Freeman Trio\tSwinging Without Mezz\tCOMMODORE\t514\t75958\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh097.mp3\tBert Firmans Quintuplets Of Swing\tSwingitis\tParlophone\tR-2436\tCE-8599-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC93730.mp3\tJay Mcshann And His Orchestra\tSwingmatism\tDECCA\t8570A\tC93730\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-416-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tSwingtime In Springtime\tSWING\t218\tOSW-416-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC102217.mp3\tBenny Goodman And His Orchestra\tSwingtime In The Rockies\tVICTOR\t25355\t102217\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_038.mp3\tBenny Goodman And His Orchestra\tSwingtime In The Rockies\tVICTOR\t25355\t102217\t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480721.mp3\tBenny Goodman And His Orchestra\tSwingtime In The Rockies\tColumbia\tSL160\t\t1938\tCarnegie Hall Concert?:<br>Harry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Hymie Schertzer, George Koenig (as), Arthur Rollini, Babe Russin (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3752.mp3\tGene Krupa & His Orch\tSwiss Lullaby\tCOLUMBIA\t38520\tHCO3752\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE30398.mp3\tBrunswick Concert Orch (katz)\tSylvia\tBRUNSWICK\t4632\tE30398\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67475.mp3\tBob Crosby & His Orch\tSympathy\tDECCA\t3862 A\t67475\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_011.mp3\tHelen Clark And Walter Van Brunt\tSympathy\tVictor\t17270\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3a/Cap797.mp3\tJo Stafford\tSymphony\tCapitol\t227\t797\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3968.mp3\tBing Crosby - Victor Young\tSymphony\tDECCA\t18735A\tL3968\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA1747x.mp3\tFreddy Martin And His Orchestra\tSymphony\tRCA\t20-1747\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D601.mp3\tGlenn Miller Army Air Force Band\tSymphony\tV-Disc\t601\t\t1944-\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_044.mp3\tJo Stafford\tSymphony\tCapitol\t227\t797\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_014.mp3\tFreddy Martin And His Orchestra\tSymphony\tRCA\t20-1747\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_128.mp3\tGuy Lombardo And His Royal Canadians\tSymphony\tDecca\t18737\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_025.mp3\tBenny Goodman And His Orchestra Feat. Liza Morrow\tSymphony\tCOLUMBIA\t36874\tCO35236-1\t1945\tBernie Privin, Vince Badale, Tony Faso, Frank LoPinto (tp), Tom Reo, Sy Shaeffer, Eddie Aulino (tb), Benny Goodman (cl), Bill Shine, Gerald Sanfino (as), Bud Freeman, Al Epstein (ts), Danny Bank (bar), Charlie Queener (p), Mike Bryan (g), Clyde Lombardi (sb), Morey Feld (dm) \nhttp://www.jazz-on-line.com/a/mp3a/COLCO35236-1.mp3\tBenny Goodman And His Orchestra\tSymphony (v Lisa Morrow)\tCOLUMBIA\t36874\tCO35236-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COL265162-2.mp3\tBenny Carter & His Orch\tSymphony In Riffs\tCOLUMBIA\t2898 D\t265162-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC019444.mp3\tTommy Dorsey & His Orch\tSymphony In Riffs\tVICTOR\t26163\t019444\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480460.mp3\tBenny Golson Quintet\tSymptoms\tRiverside\tRLP12-290\t\t1958\tCurtis Fuller (tb), Benny Golson (ts), Barry Harris (p), Jymie Merritt (sb), Philly Joe Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1951_278.mp3\tBoston Pops Orchestra Feat. Arthur Fiedler; Leroy Anderson\tSyncopated Clock\tDECCA\t16005\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN9543-1.mp3\tImperial Dance Orchestra (adrian Schubert And His Orchestra)\tSyncopated Jamboree\tBANNER\t0804\t9543-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403288-B.mp3\tHarlem Footwarmers (ellington)\tSyncopated Shuffle\tOKeh\t8746\t403288-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Col265091-3.mp3\tBenny Carter And His Orchestra\tSynthetic Love\tColumbia \tCB-636\t265091-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400213.mp3\tMooche Richardson\tT And T Blues\tOKeh\t8554\t400213\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/COLM948.mp3\tDuke Ellington Famous Orch\tT T On Toast\tCOLUMBIA\t37296\tM948\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_318.mp3\tElla Fitzgerald Feat. Chick Webb Orchestra\tT'ain't What You Do (it's The Way That Cha Do It)\tDECCA\t2310\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COMA4722-1.mp3\tEddie Heywood & His Orch\tT'aint Me\tCOMMODORE\t554\tA4722-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68623-A.mp3\tLouis Jordan & His Tympani 5\tT-bone Blues\tDECCA\t25473\t68623-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC25473.mp3\tLouis Jordan & His Tympani 5\tT-bone Blues\tDECCA\t25473\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL1065x.mp3\tT-bone Walker\tT-bone Shuffle\tATLANTIC\t1065\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/ASCMA1214.mp3\tJosh White\tT.b. Blues\tASCH\t5501\tMA1214\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU67133.mp3\tJimmie Rodgers\tT.b. Blues\tBLUEBIRD\t6275\t67133\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW141170-1.mp3\tFletcher Henderson & His Orch\tT.n.t\tCOLUMBIA\t509 D\tW141170-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA620.mp3\tAndy Iona\tTa Hu-wa-hu-wa-i\tDECCA\t1100\tDLA620\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW147633-2.mp3\tCelestin's Tuxedo Orch\tTa Ta Daddy\tCOLUMBIA\t14396 D\tW147633-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_272.mp3\tGene Krupa And His Orchestra\tTa-ra-ra-boom-der-e\tBrunswick\t8296\tLA-1760-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1630.mp3\tAugie Goupil's Royal Tahitians\tTaata Hu'a\tDECCA\t2256A\tDLA1630\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2751.mp3\tStan Kenton & His Orch\tTaboo\tDECCA\t4038B\tDLA2751\t1941\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC16785-3.mp3\tVic Berton And His Orchestra\tTaboo\tVOCALION\t2974\t16785-3\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480622.mp3\tAhmad Jamal\tTaboo\tArgo\tLP 636\t9034\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1058.mp3\tArtie Shaw And His Orchestra\tTabu\tRCA\t20-1976\tD5VB1058\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VocE-3556.mp3\tKing Oliver And His Dixie Syncopators\tTack Annie\tVocalion\t1049\tE-3556\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_244.mp3\tSam Donahue And His Orchestra Feat. Shirley Lloyd\tTacos, Enchiladas, & Beans\tCapitol\t493\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D144A2.mp3\tCapt. Glenn Miller And The Aaftc Orch.\tTail End Charlie\tV-DISC\t144A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D144-Ab.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tTail End Charlie\tV-Disc\t144-A\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC01804-1.mp3\tFats Waller And His Rhythm\tTain't Good\tVICTOR\t25489\t01804-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC01803.mp3\tFats Waller And His Rhythm\tTain't Good (v F W)\tVICTOR\t25478\t01803\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_146.mp3\tLes Brown And His Orchestra Feat. Doris Day\tTain't Me\tCOLUMBIA\t39094\tZSP4064\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC4182.mp3\tCab Calloway & His Orch\tTain't No Good\tOKEH\t6616\tC4182\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU075529.mp3\tErskine Hawkins Orch\tTain't No Good\tBLUEBIRD\t11564\t075529\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149737-3.mp3\tBen Selvin And His Orch\tTain't No Sin\tCOLUMBIA\t2096 D\tW149737-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403611-B.mp3\tFred Hall & His Sugar Babies\tTain't No Sin\tOKeh\t41369\t403611-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_0227_01.mp3\tLee Morse And Her Bluegrass Boys\tTain't No Sin\tColumbia\t2136DA\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC02459-1.mp3\tBenny Goodman And His Orchestra\tTain't No Use\tVICTOR\t25469\t02459-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC18818-2.mp3\tStuff Smith & Onyx Club Boys\tTain't No Use\tVOCALION\t3200\t18818-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80862-10.mp3\tBessie Smith\tTain't Nobody's Bizness If I Do\tCOLUMBIA\tA-3898\t80862-10\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057085.mp3\tFats Waller And His Rhythm\tTain't Nobody's Bizness If I Do\tBLUEBIRD\t10967\t057085\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_116.mp3\tClarence Williams' Blue Five\tTain't Nobody's Bus'ness If I Do\tOkeh\t4966\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC27894-3.mp3\tLena Wilson\tTain't Nobody's Business If I Do\tVICTOR\t19085\t27894-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe400707-A.mp3\tJoe Venuti's New Yorkers\tTain't So, Honey, 'tain't So\tOKeh\t41051\t400707-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS23905.mp3\tJimmie Lunceford And His Orch\tTain't What You Do\tCBS\tVO4582\t23905\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CON24179.mp3\tMildred Bailey & Her Orch\tTain't What You Do\tCONQUEROR\t9215\t24179\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU032944.mp3\tFats Waller And His Rhythm\tTain't What You Do\tBLUEBIRD\t10192\t032944\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-2000-1.mp3\tMichel Warlop Et Son Orchestre (with Django Reinhardt)\tTaj Mahal\tSWING\t28\tOLA-2000-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol387-D.mp3\tVan & Schenck\tTake 'em To The Door\tColumbia\t387-D\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144515.mp3\tCharlie Poole's N.c.ramblers\tTake A Drink On Me\tCOLUMBIA\t15193 D\tW144515\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC48777-3.mp3\tJean Goldkette & His Orch\tTake A Good Look At Mine\tVICTOR\t21889\t48777-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD7VB896.mp3\tCount Basie & His Orch\tTake A Little Off The Top\tRCA\t20-2435\tD7VB896\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036485.mp3\tCharlie Barnet & His Orch\tTake A Tip From The Whip-poor-will\tBLUEBIRD\t10426\t036485\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC15604.mp3\tCarr Leroy\tTake A Walk Around The Corner\tARC\tVO2986z\t15604\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO40406.mp3\tJimmie Dickens String Band\tTake An Old Cold Tater\tCOLUMBIA\t20548\tCO40406\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20168-1.mp3\tArtie Shaw And His Orchestra\tTake Another Guess\tBRUNSWICK\t7778\tB-20168-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC02464-1.mp3\tBenny Goodman And His Orchestra\tTake Another Guess\tVICTOR\t25461\t02464-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-7827-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tTake Care Of You For Me\tParlophone\tF-657\tCE-7827-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142970.mp3\tPaul Ash And His Orchestra\tTake In The Sun, Hang Out The Moon\tCOLUMBIA\t828 D\tW142970\t1926\tJohn Valentine, John Linn, tp, Roscoe Lantz, trombone, Phil Wing & Herbert \"Putty\" Nettle,clarinet,al sax, Howard Grantham, cl, tn sax, Harry Barris, p, Paul Ash, vio, Julian Davidson,bj, Pierre Olker,br bass, Arthur Layfield, drums. Chicago Nov 30 1\nhttp://www.jazz-on-line.com/a/mp3w/1927_206.mp3\tClevelanders Feat. Tom Stacks\tTake In The Sun, Hang Out The Moon\tBRUNSWICK\t3375\t20716\t1927\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC71240.mp3\tAndy Kirk And Clouds Of Joy\tTake It And Git\tDECCA\t4366B\t71240\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71240-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tTake It And Git\tDecca\t4366\t71240-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480908.mp3\tPenny Piper, V; Xavier Cugat And His Orchestra\tTake It Away (tomalu Tu)\tCOLUMBIA\t38239\tHCO-3096\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88990.mp3\tFats Waller And His Rhythm\tTake It Easy\tVICTOR\t25078\t88990\t1935\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU17685-1.mp3\tLeo Reisman & His Orch\tTake It Easy\tBRUNSWICK\t7482\t17685-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic88990-1.mp3\t\"fats Waller And His Rhythm\tTake It Easy\tVictor\t25078\t88990-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Ton1063-B.mp3\tMiss Valaida Med Winstrup Olesens Swingband\tTake It Easy \tTono\t21165\t1063-B\t1940\tValaida Snow t v acc. by W nstrup Olesen t dir. Kai Moeller cl, Leo Mathiesen p, Helge Jacobsen g, Christian Jensen b, Kai Fischer d\nhttp://www.jazz-on-line.com/a/mp3c/HAR351072-1.mp3\tJerry Fenwyck's Orch (selvin)\tTake It From Me (i'm Taking To You) (vdr)\tHARMONY\t1348-H\t351072-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC69993.mp3\tLeo Reisman & His Orch\tTake It From Me (vlee Wiley)\tVICTOR\t22757\t69993\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67358.mp3\tElla Fitzgerald & Her Orch\tTake It From The Top\tDECCA\t3236A\t67358\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/CONS3278.mp3\tCozy Cole & His Orchestra\tTake It On Back\tCONTIN\tT6001\tS3278\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC075264.mp3\tTommy Dorsey And His Orch\tTake Me\tVICTOR\t27923\t075264\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_034.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra\tTake Me\tVICTOR\t27923\t075264\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_097.mp3\tJimmy Dorsey And His Orchestra Feat. V/helen O'connell\tTake Me\tDECCA\t18376B\t70705\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_073.mp3\tBenny Goodman And His Orchestra Feat. Dick Haymes\tTake Me\tCOLUMBIA\t36613\tCO32796-2\t1942\tCootie Williams, Bernie Privin, Tony Faso (tp), Lou McGarity, Charlie Castaldo (tb), Benny Goodman (cl), Hymie Schertzer, Bud Shiffman (as), Jerry Jerome, George Berg (ts), Johnny McAfee (bar), Mel Powell (p), Dave Barbour (g), Sid Weiss (sb), Alvin Stoller (dm)\nhttp://www.jazz-on-line.com/a/mp3a/COLCO32796-2.mp3\tBenny Goodman And His Orchestra\tTake Me (v Dick Haymes)\tCOLUMBIA\t36613\tCO32796-2\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_323.mp3\tTony Bennett With Percy Faith And His Orch.\tTake Me Back Again\tCOLUMBIA\t40272\tCO50610\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31356.mp3\tCount Basie & His Orch\tTake Me Back Baby\tOKEH\t6440\t31356\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC95141.mp3\tTommy Dorsey & His Orch\tTake Me Back To My Boots And Saddle\tVICTOR\t25144\t95141\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60019.mp3\tVictor Young & His Orch\tTake Me Back To My Boots And Saddle\tDECCA\t581B\t60019\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA254-A.mp3\tBing Crosby W Victor Young\tTake Me Back To My Boots And Saddle\tDECCA\t2677A\tDLA254-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_057.mp3\tTommy Dorsey And His Orchestra Feat. Cliff Weston\tTake Me Back To My Boots And Saddle\tVICTOR\t25144\t95141\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_062alt.mp3\tBilly Murray\tTake Me Back To New York Town\tCOLUMBIA\tA-0418\t3717\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_083.mp3\tWalter Van Brunt\tTake Me Back To The Garden Of Love\tVICTOR\t17076\t11408-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_020.mp3\tColumbia Stellar Quartet\tTake Me Back To The Garden Of Love\tCOLUMBIA\tA-1141\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_269.mp3\tNat ''king'' Cole\tTake Me Back To Toyland\tCapitol\t3305\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152579-2.mp3\tBessie Smith\tTake Me For A Buggy Ride\tCOLUMBIA\t37574\tW152579-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOKe8949.mp3\tBessie Smith\tTake Me For A Buggy Ride\tOKeh\t8949\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/APO381TM.mp3\tWynonie Harris\tTake Me Out Of The Rain\tAPOLLO\t381\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_001.mp3\tHarry Macdonough And Haydn Quartet\tTake Me Out To The Ball Game\tVictor\t5570\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP7555.mp3\tPete Daily\tTake Me Out To The Ballgame\tCAPITOL\t1588\t7555\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC22899-3.mp3\tMarion Harris\tTake Me To The Land Of Jazz\tVICTOR\t18593\t22899-3\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_056.mp3\tMarion Harris\tTake Me To The Land Of Jazz\tVICTOR\t18593\t22899-3\t1919\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3026-.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tTake Me To The River\tBrunswick\t7071\tC-3026-\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_086.mp3\tAl Martino\tTake My Heart\tCapitol\t2122\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_103.mp3\tNat Brandywynne And His Stork Club Orchestra\tTake My Heart\tBrunswick\t7676\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_023.mp3\tEddy Duchin And His Orchestra\tTake My Heart\tVICTOR\t25343\t101886-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_261.mp3\tVic Damone Feat. Norman Leyden's Orchestra\tTake My Heart\tMERCURY\t5877\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101886-1.mp3\tEddy Duchin & His Orch\tTake My Heart (vjc)\tVICTOR\t25343\t101886-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COL15641.mp3\tBenny Goodman And His Orchestra\tTake My Word\tCOLUMBIA\t2947 D\t15641\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/VARM441-1.mp3\tCalifornia Ramblers (barnet)\tTake My Word\tVARIETY\tI577\tM441-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_068.mp3\tBenny Goodman And His Orchestra\tTake My Word\tCOLUMBIA\t2947 D\t15641-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COL20628TT.mp3\tTed Daffan\tTake That Lease Off Me\tCOLUMBIA\t20628\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_129.mp3\tDuke Ellington And His Famous Orchestra\tTake The ''a'' Train\tVICTOR\t27380A\t055283-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27380.mp3\tDuke Ellington & His Famous Orchestra\tTake The 'a' Train\tVictor\t27380\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU061266.mp3\tGlenn Miller And His Orch\tTake The A Train\tBLUEBIRD\t11187\t061266\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D212A1.mp3\tDuke Ellington And His Orchestra\tTake The A Train\tV-DISC\t212A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC055283-1.mp3\tDuke Ellington And His Orch\tTake The A Train\tVICTOR\t27380A\t055283-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30835.mp3\tCab Calloway & His Orch\tTake The A Train\tOKEH\t6305\t30835\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-3670tt.mp3\tCharlie Ventura's Orch\tTake The A Train\tRCA\t20-3670\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69668.mp3\tDelta Rhythm Boys\tTake The A Train\tDECCA\t8578B\t69668\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67896-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tTake Those Blues Away\tDecca\t3293\t67896-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECG14187.mp3\tAsa Martin & Doc Roberts\tTake Those Lips Away\tDECCA\t5444\tG14187\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe80689-F.mp3\tClarence Williams Washboard 5\tTake Your Black Bottom Outside\tOKeh\t8462\t80689-F\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC23020.mp3\tBilly Murray\tTake Your Girlie To The Movies\tVICTOR\t18592\t23020\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/HARCO38289.mp3\tHot Lips Page\tTake Your Shoes Off, Baby\tHARMONY\tHa1069\tCO38289\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3003-A.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tTake Your Time\tBrunswick\t7061\tC-3003-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3l/COL81349.mp3\tPaul Specht And His Orchestra\tTake, Oh Take Those Lips Away\tCOLUMBIA\t27D\t81349\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru39854-A.mp3\tDorsey  Brothers  Orchestra With Bing Crosby\tTakes Two To Make A Bargain\tBrunswick\tE02070\t39854-A \t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COR83152.mp3\tPearl Bailey\tTakes Two To Tango\tCORAL\t60817\t83152\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC83302.mp3\tLouis Armstrong\tTakes Two To Tango\tDECCA\t28394\t83302\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_155.mp3\tLouis Armstrong Feat. By Oliver (orchestra Director)\tTakes Two To Tango\tDECCA\t28394\t83302\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_051.mp3\tPearl Bailey Feat. Don Redman's Orchestra\tTakes Two To Tango\tCORAL\t60817\t83152\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3101.mp3\tKay Kyser & His Orch\tTakin' Miss Mary To The Ball\tCOLUMBIA\t38202\tHCO3101\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/COL29177.mp3\tBenny Goodman And His Orchestra\tTaking A Chance On Love\tCOLUMBIA\t35869\t29177\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27239.mp3\tSwing & Sway With Sammy Kaye\tTaking A Chance On Love\tVictor\t27239\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68329.mp3\tElla Fitzgerald & Her Orch\tTaking A Chance On Love\tDECCA\t3490B\t68329\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL35869.mp3\tBenny Goodman & His Orchestra\tTaking A Chance On Love\tCOLUMBIA\t35869\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_008.mp3\tBenny Goodman And His Orchestra Feat. Helen Forrest\tTaking A Chance On Love\tCOLUMBIA\t35869\t29177\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS29031.mp3\tEthel Waters\tTaking Chance On Love\tCBS\tLMS310\t29031\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57237-3.mp3\tTed Weems & His Orch\tTalk Of The Town\tVICTOR\t22304\t57237-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/DiaD-1086-B.mp3\tDexter Gordon\tTalk Of The Town\tDial\t1038\tD-1086-B\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64605-1.mp3\tMckinney's Cotton Pickers\tTalk To Me\tVICTOR\t22640A\t64605-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63578.mp3\tBob Howard & His Orch\tTalk To Me\tDECCA\t1790A\t63578\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480755.mp3\tCozy Cole All Stars\tTalk To Me\tSavoy\t501\t5411\t1944\tLammar Wright (tp), Ray Conniff (tb), Ben Webster (ts), Johnny Guarnieri (p), Teddy Walters (g), Billy Taylor (sb), Cozy Cole (dm)\nhttp://www.jazz-on-line.com/a/mp3c/CON625U.mp3\tSlam Stewart Qt\tTalkin' Back\tCONTIN\t10005\t625U\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC26619.mp3\tWoody Guthrie\tTalkin' Dust Bowl Blues\tVICTOR\t26619\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCP1124.mp3\tTed Weems & His Orch\tTalkin' To Myself\tCOLUMBIA\t2957 D\tCP1124\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN15819-1.mp3\tTodd Rollins And His Orchestra\tTalkin' To Myself (vcb)\tBANNER\t33189\t15819-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_294.mp3\tPeggy Lee\tTalking To Myself About You\tCapitol\t15048\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17798.mp3\tMills Blue Rhythm Band\tTallahassee\tBRUNSWICK\t7534\t17798\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4397.mp3\tBing Crosby & Andrew Sisters\tTallahassee\tDECCA\t23885\tL4397\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/BruCO-17798-1.mp3\tMills Blue Rhythm Band\tTallahassee\tBrunswick\t7534\tCO-17798-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC27203TB.mp3\tLouis Jordan\tTamburitza Boogie\tDECCA\t27203\t\t\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW141584.mp3\tLeo Reisman & His Orch\tTamiami Trail\tCOLUMBIA\t623 D\tW141584\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_018.mp3\tArthur Collins And Byron Harlan\tTammany\tVICTOR\t4373\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI11031.mp3\tCharlie Skeete And His Orch\tTampeeko\tEDISON\t51775L\t11031\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Har141832-2.mp3\tThe Dixie Stompers\tTampeekoe\tHarmony\t166-H\t141832-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP202x.mp3\tStan Kenton And His Orch\tTampico\tCAPITOL\t\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_021.mp3\tStan Kenton And His Orchestra\tTampico\tCapitol\t15196\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC70028.mp3\tJimmy Dorsey And His Orch. (vhelen O'connell And Bob Eberle)\tTangerine\tDECCA\t4123A\t70028\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu11433.mp3\tVaughn Monroe & His Orchestra\tTangerine\tBluebird\t11433\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_005.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly And Helen O'connell\tTangerine\tDECCA\t4123A\t70028\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068677-1.mp3\tVaughn Monroe & His Orchestra\tTangerine (vvm)\tBLUEBIRD\t11433\t068677-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/56069-1.mp3\tThomas Waller\tTanglefoot\t\t\t56069-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_253.mp3\tLes Baxter And His Orchestra\tTango Of The Drums\tCapitol\t3404\t\t1956\t\nhttp://www.78-tours.net/mp3/COLCL6592.mp3\tJaime Plana\tTango Ramona\tCOLUMBIA\tDF2346\tCL6592\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-4024-.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tTanguay Blues\tBrunswick\t7101\tC-4024-\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49459-2.mp3\tJelly Roll Morton's Peppers\tTank Town Bump\tVICTOR\t38075\t49459-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic49459-2.mp3\tJelly Roll Morton And His Orchestra\tTank Town Bump\tVictor\tV-38075\t49459-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU82720.mp3\tGid Tanner & Skillet Lickers\tTanner's Rag\tBLUEBIRD\t5657\t82720\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU051527.mp3\tEarl Hines & His Orch\tTantalizing A Cuban\tBLUEBIRD\t10792\t051527\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu051527-1.mp3\tEarl Hines And His Orchestra\tTantalizing A Cuban\tBluebird\tB-11394\t051527-1\t1940\tWalter Fuller (tp,vcl) Shirley Clay, Ed Sims (tp) George Dixon (tp,as) Ed Burke, John Ewing, Joe McLewis (tb) Omer Simeon (cl,bar) Leroy Harris (as,vcl) Jimmy Mundy (ts,arr) Robert Crowder (ts) Earl Hines (p) Claude Roberts (g) Quinn Wilson (b) Alvin Burroughs (d) Billy Eckstine, Leroy Harris (vcl) Buster Harding, Edgar Battle (arr)\nhttp://www.jazz-on-line.com./a/mp3o/MERYB10670.mp3\tRalph Marterie & His Orchestra\tTantalizing Melody\tMERCURY\t70406\tYB10670\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO33953.mp3\tCount Basie And His Orch\tTap's Miller\tCOLUMBIA\t36831\tCO33953\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046057.mp3\tCharlie Barnet & His Orch\tTappin' At The Tappa\tBLUEBIRD\t10584\t046057\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COMP23233.mp3\tBud Freeman And His Gang\tTappin' The Commodore Til\tCOMMODORE\t508\tP23233\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31641.mp3\tCab Calloway & His Orch\tTapping Off\tOKEH\t6547\t31641\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1115.mp3\tCount Basie & His Orchestra\tTaps Miller\tV-DISC\t419\t1115\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1022.mp3\tGeorgie Auld & His Orchestra\tTaps Miller\tAPOLLO\t359R\tR1022\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CHAG16951.mp3\tWingy Mannone & His Orch\tTar Paper Stomp\tCHAMPION\t16153\tG16951\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1102-A.mp3\tCab Calloway And His Orchestra\tTarzan Of Harlem\tVocalion\t5267\tWM-1102-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480487.mp3\tBen Webster And Harry Sweets Edison\tTaste On The Place\tVerve\tMGV8211\t20825-3\t1957\tBen Webster, Ts, Harry Sweets Edison, T, Oscar Peterson, P, Herb Ellis, G, Ray Brown, B, Alvin Stoller, D\nhttp://www.jazz-on-line.com/a/mp3o/GOO30x.mp3\tFirehouse Five Plus Two\tTavern In The Town\tGood Time Jazz\t30\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS24242-1.mp3\tCount Basie And His Orch\tTaxi War Dance\tCBS\tVO4748\t24242-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24242-1.mp3\tCount Basie And His Orchestra\tTaxi War Dance\tVocalion\t4748\t24242-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC92045.mp3\tBuddy Jones\tTaxicab Driver Blues\tDECCA\t5861\tC92045\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152719.mp3\tBenny Morton & His Orch\tTaylor Made\tCOLUMBIA\t2924 D\tW152719\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO48749.mp3\tFrankie Laine\tTe Amo\tCOLUMBIA\t40022\tCO48749\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_374.mp3\tDick Jacobs And His Chorus And Orchestra\tTe Amo\tCoral\t61653\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM552-1.mp3\tRex Stewart 52nd St Stompers\tTea And Trumpets\tVARIETY\tI618\tM552-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67359.mp3\tElla Fitzgerald & Her Orch\tTea Dance\tDECCA\t3441B\t67359\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU2747x.mp3\tMarion Harris\tTea For Two\tBRUNSWICK\t2747\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-13162-A.mp3\tArt Tatum\tTea For Two\tBrunswick\t6553\tB-13162-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC04560-1.mp3\tBenny Goodman Qt\tTea For Two\tVICTOR\t25529-B\t04560-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC010655-1.mp3\tFats Waller (piano)\tTea For Two\tVICTOR\t25618\t010655-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4141.mp3\tDoris Day\tTea For Two\tCOLUMBIA\t38954\tHCO4141\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/Cap6557.mp3\tJo Stafford & Gordon Macrae\tTea For Two\tCapitol\t1195\t6557\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20412-2.mp3\tTeddy Wilson & His Orch\tTea For Two\tBRUNSWICK\t7816\t20412-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_009.mp3\tMarion Harris\tTea For Two\tBRUNSWICK\t2747\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23842.mp3\tJoe Mooney Qt\tTea For Two\tDECCA\t23842\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1048.mp3\tArtie Shaw And His Orchestra\tTea For Two\tRCA\t20-1696\tD5VB1048\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-2216-1.mp3\tMichel Warlop Et Son Orchestre (with Django Reinhardt)\tTea For Two\tSWING\t13\tOLA-2216-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC034401.mp3\tTommy Dorsey & His Orch\tTea For Two\tVICTOR\t26321\t034401\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS6009TFT.mp3\tCliff Jackson & Don Frye\tTea For Two\tDISC\t6009\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MERC673.mp3\tJohnny Hodges & His Orchestra\tTea For Two\tMERCURY\t8991\tC673\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12005-A.mp3\tDon Redman & His Orch\tTea For Two\tBRUNSWICK\t6354\t12005-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/SUN107.mp3\tCharlie Ventura Sextet\tTea For Two\tSUNSET\t10051\t107\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE32041A.mp3\tRed Nichols And His Five Pennies\tTea For Two\tBRUNSWICK\t80007 A\tE32041A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-2221-1.mp3\tDjango Reinhardt\tTea For Two\tSWING\t211\tOLA-2221-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1759.mp3\tArt Tatum\tTea For Two\tDECCA\t2456B\tDLA1759\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC49721-2hpp.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tTea For Two\tDECCA\t\t49721-2hpp\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC30570-6.mp3\tBenson Orchestra Of Chicago\tTea For Two\tVICTOR\t19438\t30570-6\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/SIGT1925.mp3\tBarney Bigard Trio\tTea For Two\tSIGNATURE\t28116\tT1925\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYKBF1.mp3\tBud Freeman And His Orch\tTea For Two\tKEYNOTE\t636\tKBF1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_316.mp3\tTeddy Wilson And His Orchestra\tTea For Two\tBRUNSWICK\t7816\t20412-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_044.mp3\tBenson Orchestra Of Chicago\tTea For Two\tVICTOR\t19438\t30570-6\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_117.mp3\tBen Bernie And His Orchestra\tTea For Two\tVOCALION\t14901A\t13803\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20412-3.mp3\tTeddy Wilson And His Orchestra\tTea For Two\tBrunswick\t7816  \tB-20412-3  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-12005-A.mp3\tDon Redman And His Orchestra\tTea For Two\tBrunswick\t6354\tB-12005-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/DOTM-1037a.mp3\tJohnny Maddox And The Rhythmasters\tTea For Two\tDOT\tDEP-1016\tM-1037a\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/DISD196.mp3\tCliff Jackson\tTea For Two\tDISC\t6009B\tD196\t1945\tCAESAR - YOUMANS\nhttp://www.jazz-on-line.com/a/mp3t/TS480700.mp3\tArt Tatum\tTea For Two\tClef\tEP-C-360\t1473-1\t1953\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3t/TS480749.mp3\tBen Webster Quintet\tTea For Two\tCircle\tCLP41\tN1640-5\t1944\tHot Lips Page (tp), Ben Webster (ts), Clyde Hart (p), Charlie Drayton (sb), Denzil Best (dm)\nhttp://www.jazz-on-line.com/a/mp3h/DH480909.mp3\tAndre Kostelanetz And His Orchestra\tTea For Two\tCOLUMBIA\t4266-M\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481113.mp3\tGene Krupa Orch. Feat. Anita O'day\tTea For Two\tColumbia\t38345\tCO35335-1\t1945\tAnita O'Day (vo), Don Fagerquist, Pinky Savitt, Vince Hughes, Tony Russo (tp), Leon Cox, Dick Taylor, Nick Gaglio (tb), Harry Terrill, Charlie Kennedy (as), Charlie Ventura, Buddy Wise (ts), Joe Koch (bar), Teddy Napoleon (p), Frank Morrell (g), Irv Lang (sb), Gene Krupa, Joe Dale (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2271.mp3\tBing Crosby & Connie Boswell\tTea For Two (vbing Crosby & Connie Boswell)\tDECCA\t25406\tDLA2271\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80365.mp3\tLouis Armstrong & His Orch\tTea For Two Pt.1\tDECCA\t28100\t80365\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80366.mp3\tLouis Armstrong & His Orch\tTea For Two Pt.2\tDECCA\t28099\t80366\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24446.mp3\tElla Fitzgerald\tTea Leaves\tDECCA\t24446\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79805-6.mp3\tNora Bayes\tTea Leaves\tCOLUMBIA\tA-3416\t79805-6\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_307.mp3\tElla Fitzgerald\tTea Leaves\tDECCA\t24446\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_112.mp3\tNora Bayes\tTea Leaves\tColumbia\t3416\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_176.mp3\tEmile Cote Serenaders\tTea Leaves\tColumbia\t35230\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03083.mp3\tTommy Dorsey & His Orch\tTea On The Terrace\tVICTOR\t25476\t03083\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS22458-1.mp3\tRed Norvo And His Orchestra\tTea Time\tCBS\tBR8103\t22458-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI8797.mp3\tStevens Trio\tTeach Me How\tEDISON\t51277\t8797\t1923\t\nhttp://www.jazz-on-line.com/mp3/412967801.mp3\tDecastro Sisters\tTeach Me Tonight\tABBOTT\t3001\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_224.mp3\tDinah Washington\tTeach Me Tonight\tMERCURY\t70497\t11062\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_158.mp3\tJo Stafford\tTeach Me Tonight\tColumbia\t40351\tRHCO 33227\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_155.mp3\tDecastro Sisters\tTeach Me Tonight\tABBOTT\t3001\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_329.mp3\tHelen Grayco With Orchestra Directed By Harold Mooney\tTeach Me Tonight\tX\t0051\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38659.mp3\tGene Krupa\tTeach Me, Teach Me Baby\tCOLUMBIA\t38141\tCO38659\t1947\t\nhttp://www.jazz-on-line.com/mp3/501287698.mp3\tDoris Day\tTeacher's Pet\tCOLUMBIA\t41123\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/ATLA514.mp3\tRuth Brown\tTeardrops From My Eyes\tATLANTIC\t919\t514\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/KinK-5981.mp3\tLucky Millinder And His Orchestra\tTeardrops From My Eyes\tKing\t4419\tK-5981  \t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_091.mp3\tSunny Gale O/ralph Burns\tTeardrops On My Pillow\tRCA\t20-5103\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64824-2.mp3\tRudy Vallee & His Ct.yankees\tTears\tVICTOR\t22585\t64824-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17389H.mp3\tThe Dutch Swing College Band\tTears\tPhilips\tP17389H\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3d/HMVOLA-1705-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tTears\tHMV\tB-8718\tOLA-1705-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-118-1.mp3\tDjango's Music\tTears\tSWING\t79\tOSW-118-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1142.mp3\tHit-of-the-week Orch\tTears\tHit-Of-The-Week\t1142\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_0723_02.mp3\tLee Morse And Her Bluegrass Boys\tTears\tColumbia\t2365DB\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_137.mp3\tRudy Vallee And His Connecticut Yankees\tTears\tVICTOR\t22585\t64824-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_060.mp3\tGlen Gray And Casa Loma Orchestra\tTears From My Inkwell\tDecca\t2388\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULA1440.mp3\tRed Norvo And His Orch\tTears In My Heart (v M. Bailey)\tBRUNSWICK\t7970\tLA1440\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA-1012-A.mp3\tJimmie Lunceford And His Orchestra\tTeasin' Tessie Brown\tDecca\t1734\tDLA-1012-A\t1937\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3a/BLU80405.mp3\tLouie Bluie And Ted Bogan\tTed's Stomp\tBLUEBIRD\t5593\t80405\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/CAS11x.mp3\tLee Stafford\tTeddy Bear Blues\tCastle\t11\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC27160-4.mp3\tVirginians\tTeddy Bear Blues\tVICTOR\t18992B\t27160-4\t1922\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU9395.mp3\tGene Rodemich And His Orchestra\tTeddy Bear Blues\tBRUNSWICK\t2379A\t9395\t1922\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3r/RiDec2806.mp3\tTeddy Powell & His Orchestra\tTeddy's Boogie Woogie\tDecca\t2806\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-910-1.mp3\tCab Calloway And His Orchestra\tTee-um Tee-um Tee-i, Tahiti\tVocalion\t4538\tM-910-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_146.mp3\tGloria Mann\tTeen Age Prayer\tSound\t126\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_044.mp3\tGale Storm\tTeen Age Prayer\tDot\t15436\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_260.mp3\tChordettes\tTeenage Goodnight\tCadence\t1299\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_430.mp3\tDon Cornell\tTeenage Meeting (gonna Got It Up Right)\tCoral\t61584\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_364.mp3\tBill Haley And His Comets\tTeenager's Mother (are You Right?)\tMercury\t70750\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480743.mp3\tBen Webster Quintet.\tTeezol\tCircle\tCLP42\tN1634-1\t1944\tHot Lips Page (tp), Ben Webster (ts), Clyde Hart (p), Charlie Drayton (sb), Denzil Best (dm)\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-133-1.mp3\tAlix Combelle And His Swing Band\tTel Quel\tSwing\t93\tOSW-133-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP4339.mp3\tSonny Terry\tTelephone Blues\tCAPITOL\t\t4339\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4696.mp3\tEddie Condon & His Band\tTell 'em About Me\tCOMMODORE\t604\t4696\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/Cro1765-1.mp3\tBenny Carter And His Orchestra\tTell All Your Day Dreams To Me\tCrown\t3321\t1765-1 \t1932\tBenny Carter-d-as dir. Louis Bacon-Frank Newton and another t, Dicky Wells tb, Wayman Carver as, f, Chu Berry ts, Teddy Wilson p, g, RIchard Fullbright sb, Sid Catlett d, unknown girl v\nhttp://www.jazz-on-line.com/a/mp3b/VIC31414-3.mp3\tPaul Whiteman & His Orch\tTell Her In The Springtime\tVICTOR\t19517B\t31414-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU054599.mp3\tByron Parker & Mountaineers\tTell Her Not To Wait For Me\tBLUEBIRD\t8708\t054599\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL78722.mp3\tAl Jolson W Orch\tTell Me\tCOLUMBIA\tA-2821\t78722\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31915.mp3\tLouisiana Rhythm Kings\tTell Me\tBRUNSWICK\t6840\tE31915\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-31915.mp3\tLouisiana Rhythm Kings\tTell Me\tBrunswick\t4938\tE-31915\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38417.mp3\tFrankie Carle\tTell Me A Story\tCOLUMBIA\t38050\tCO38417\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10384.mp3\tLaine And Boyd\tTell Me A Story\tCOLUMBIA\t39945\tHCO10384\t\t\nhttp://www.jazz-on-line.com/a/mp3l/COL81142.mp3\tLeo Reisman & His Orch\tTell Me A Story\tCOLUMBIA\tA-3975\t81142\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_031.mp3\tFrankie Laine And Jimmy Boyd\tTell Me A Story\tCOLUMBIA\t39945\tHCO10384\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC055564.mp3\tFrank Sinatra W Tommy Dorsey\tTell Me At Midnight\tVICTOR\t26747\t055564\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU040541.mp3\tSonny Boy Williamson\tTell Me Baby\tBLUEBIRD\t8474\t040541\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/COL79332-2.mp3\tArt Hickman's Orch\tTell Me Little Gypsy\tCOLUMBIA\tA-2972\t79332-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-2972.mp3\tArt Hickman's Orch\tTell Me Little Gypsy\tCOLUMBIA\tA-2972\t79332-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/PARL0065.mp3\tHenry Sims\tTell Me Man Blues\tPARAMOUNT\t12940B\tL0065\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE26901.mp3\tBillie Holiday\tTell Me More\tOKEH\t5719\t26901\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC117.mp3\tBilly Eckstine & His Orch\tTell Me Pretty Baby\tNATIONAL\t\tNSC117\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/JUB5005x.mp3\tOrioles\tTell Me So\tJUBILEE\t5005\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70067x.mp3\tThe Gaylords\tTell Me That You're Mine\tMERCURY\t70067\t70067x\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75630.mp3\tBuddy Johnson\tTell Me What They're Saying\tDECCA\t27087\t75630\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC27860x.mp3\tFour Aces\tTell Me Why\tDECCA\t27860\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_017.mp3\tFour Aces\tTell Me Why\tDECCA\t27860\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_295.mp3\tGale Storm\tTell Me Why\tDot\t15474\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_262.mp3\tCrew Cuts\tTell Me Why\tMercury\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_035.mp3\tEddie Fisher\tTell Me Why\tRCA Victor\t4444\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-2356-4.mp3\tGene Krupa And His Orchestra\tTell Me With Your Kisses\tBrunswick\t8246\tC-2356-4\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_194.mp3\tVic Damone Feat. O/george Siravo\tTell Me You Love Me\tMERCURY\t5572\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_017.mp3\tGaylords\tTell Me You're Mine\tMERCURY\t70067\t70067x\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_210.mp3\tMindy Carson Feat. O/jimmy Carroll\tTell Me You're Mine (per Un Bacio D'amour)\tCOLUMBIA\t39914\tCO48431\t1953\t\nhttp://www.jazz-on-line.com/a/mp3h/GEN9204.mp3\tPerley Breed's Shepard Colonial Orchestra\tTell Me, Dreamy Eyes\tGENNETT\t5608\t9204\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_093.mp3\tIsham Jones And His Orchestra\tTell Me, Dreamy Eyes\tBrunswick\t2738\tCH169-70\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/Pat105604.mp3\tFletcher Henderson And His Orchestra\tTell Me, Dreamy Eyes\tPath? Actuelle\t\t105604  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1902_013alt.mp3\tArthur Collins And Joe Natus\tTell Me, Dusky Maiden\tEDISON\t8000\t\t1902\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_012.mp3\tByron G. Harlan And Joe Belmont And Florodora Girls\tTell Me, Pretty Maiden\tCOLUMBIA\t31604\t\t1901\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_012.mp3\tByron G. Harlan And Joe Belmont And Florodora Girls\tTell Me, Pretty Maiden\tColumbia\t31604\t\t1901\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_108.mp3\tJune Valli\tTell Me, Tell Me\tRCA VICTOR\t5837\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70987.mp3\tGene Kardos & His Orch\tTell Tales (v Dick Robertson)\tVICTOR\t22897\t70987\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2657.mp3\tAl Jolson\tTell That To The Marines\tColumbia\tA2657\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_025.mp3\tAl Jolson\tTell That To The Marines\tColumbia\tA2657\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/OKECO46260.mp3\tJohnny Ray W Maurice King\tTell The Lady I Said Goodbye\tOKEH\t6809\tCO46260\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_269.mp3\tGuy Mitchell And Mindy Carson Feat. O/mitch Miller\tTell Us Where The Good Times Are\tCOLUMBIA\t39992\tCO48199\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1748-.mp3\tDuke Ellington And His Famous Orchestra\tTell Ya What I'm Gonna Do\tRCA\t20-1748-B\tD5VB662-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0000_01.mp3\tLee Morse\tTelling Eyes\tPerfect\t12186BB\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUE32602.mp3\tBen Bernie & His Orchestra\tTelling It To The Daisies\tBRUNSWICK\t4771\tE32602\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9761.mp3\tJosie Miles - O\tTemper'mental Papa\tEDISON\t\t9761\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC044728-1.mp3\tLionel Hampton & His Orch\tTempo And Swing\tVICTOR\t26608\t044728-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic044728-1.mp3\tLionel Hampton And His Orchestra\tTempo And Swing\tVictor\t26608\t044728-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151656.mp3\tJoe Venuti's Rhythm Boys\tTempo Di Modernage\tCOLUMBIA\t2488 D\tW151656\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4289.mp3\tLionel Hampton & His Orch\tTempo's Birthday\tDECCA\t23696\tL4289\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Cor73327.mp3\tLionel Hampton And His Quartet\tTempo's Birthday\tCoral\t6.22116\t73327\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-4289-A.mp3\tLionel Hampton And His Orchestra\tTempo's Birthday\tDecca\t23696\tL-4289-A\t1946\tLionel Hampton vib dir. Joe Wilder Richard ''Duke'' Garrette Leo Sheppard  Joe Morris Wendell Culley Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb Johnny Griffin ts, Charlie fowlkes bar\nhttp://www.jazz-on-line.com/a/mp3a/BRULA69.mp3\tBing Crosby\tTemptation\tBRUNSWICK\t6695\tLA69\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP412x.mp3\tRed Ingles\tTemptation\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S8.mp3\tBilly Eckstine\tTemptation\tMGM\t30323\t49S8\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2327x.mp3\tPerry Como\tTemptation\tRCA\t20-1658\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT746.mp3\tJohnny Guarnieri Trio\tTemptation\tMAJESTIC\t1096\tT746\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA69-A.mp3\tLennie  Hayton  And  His  Orchestra\tTemptation\tColumbia\tDO1094\tLA69-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BruLA69-B.mp3\tLennie  Hayton  And  His  Orchestra\tTemptation\tBrunswick\t6695\tLA69-B\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055069-1.mp3\tArtie Shaw And His Orchestra\tTemptation\tVictor\t27230\t055069-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_261.mp3\tPerry Como Feat. Russell Case's Orchestra\tTemptation\tVictor\t1658\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_216.mp3\tPerry Como Feat. Ted Steele's Orchestra\tTemptation\tVICTOR\t1658\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_218.mp3\tTed Fio Rito And His Orchestra\tTemptation\tBRUNSWICK\t6705\tSF73\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC27230-B.mp3\tArtie Shaw And His Orchestra\tTemptation (tentacin)\tVICTOR\t27230-B\t055069-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECCE6778-2.mp3\tHarry Roy & His Orch.\tTemptation Rag\tDECCA\t3531A\tCE6778-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44677.mp3\tBenny Goodman Sextet\tTemptation Rag\tCOLUMBIA\t39121\tCO44677\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN567TR.mp3\tSidney Bechet W Claude Luter\tTemptation Rag\tBLUENOTE\tBN567\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2174.mp3\tBud Powell (piano)\tTempus Fugue It\tMERCURY\t11045\t2174\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150062-3.mp3\tRuth Etting\tTen Cents A Dance\tCOLUMBIA\t2146 D\tW150062-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC59620-2.mp3\tHigh Hatters\tTen Cents A Dance\tVICTOR\t22353\t59620-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/FILF-1242.mp3\tClive Erard's Dance Band\tTen Cents A Dance\tFILMOPHONE\t203\tF-1242\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_053.mp3\tRuth Etting\tTen Cents A Dance\tCOLUMBIA\t2146 D\tW150062-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh151.mp3\tRoy Fox And His Band\tTen Cents A Dance (v Betty Bolton)\tDecca\tF-2294\tGB-2497-1-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DD7TC7338.mp3\tBenny Goodman And His Band\tTen Days With Baby\tV-DISC\t779\tD7TC7338\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D318A1.mp3\tClyde Lucas And His Orchestra (jean La Salle Voc.)\tTen Days With Baby\tV-DISC\t318A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79126-3.mp3\tBert Williams\tTen Little Bottles\tCOLUMBIA\tA-2941\t79126-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_023.mp3\tBert Williams\tTen Little Bottles\tCOLUMBIA\tA-2941\t79126-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC25526.mp3\tBilly Murray-edward Smalle\tTen Little Fingers And Ten Little Toes\tVICTOR\t18830\t25526\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18830.mp3\tBilly Murray-edward Smalle\tTen Little Fingers And Ten Little Toes\tVICTOR-\t18830\t25526\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146862-3.mp3\tPaul Ash & His Orch\tTen Little Miles From Town\tCOLUMBIA\t1531 D\tW146862-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR701-Hx.mp3\tHarmonians\tTen Little Miles From Town\tHarmony\t701-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_100.mp3\tBen Bernie And His Orchestra Feat. V/frank Luther\tTen Little Miles From Town\tBRUNSWICK\t4020\tE27909\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_149.mp3\tFour Vagabonds\tTen Little Soldiers\tBLUEBIRD\t30-0811\tD3AB6-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC1563.mp3\tAmbrose & His Orchestra\tTen Pretty Girls\tDECCA\t1563\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULA43.mp3\tSol Hoopii & His Novelty Qt\tTen Tiny Toes, One Baby Nose\tBRUNSWICK\t6687\tLA43\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/OKEH846.mp3\tBob Wills And His Texas Playboys\tTen Years\tOKEH\t6692\tH846\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_225.mp3\tBob Wills And His Texas Playboys\tTen Years\tOKEH\t6692\tH846\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66339.mp3\tBuddy Jones\tTend To Your Business\tDECCA\t5809\t66339\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47257-1.mp3\tRosemary Clooney\tTenderly\tCOLUMBIA\t40031\tCO47257-1\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142376.mp3\tArt Gillam\tTenderly\tCOLUMBIA\t710 D\tW142376\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20119-B.mp3\tJohnny Hamp's Kentucky Serenade\tTenderly\tVictor\t20119-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BEL5005.mp3\tArtie Shaw And His Gramercy Five\tTenderly\tBELL\tBELL1027\t5005\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/MERC676.mp3\tJohnny Hodges & His Orchestra\tTenderly\tMERCURY\t89000\tC676\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8917T.mp3\tOscar Peterson\tTenderly\tMERCURY\t8917\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MOD692T.mp3\tErroll Garner Trio\tTenderly\tMODERN\t692\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S542.mp3\tSarah Vaughan\tTenderly\tMGM\t30730\t48S542\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_317.mp3\tSarah Vaughan\tTenderly\tMGM\t30730\t48S542\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_132.mp3\tRosemary Clooney Feat. Percy Faith's Orchestra\tTenderly\tCOLUMBIA\t39648\tCO47257\t1952\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC46151x.mp3\tRed Foley\tTennessee Border\tDECCA\t46151\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN966A-.mp3\tDelmore Brothers\tTennessee Choo Choo\tKING\t966A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27303.mp3\tMildred Bailey\tTennessee Fish Fry\tCOLUMBIA\t35532\t27303\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE21832.mp3\tDykes Magic City Trio\tTennessee Girls\tBRUNSWICK\t120\tE21832\t1927\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC48880-2.mp3\tCoon Sanders Nighthawk Orch\tTennessee Lazy\tVICTOR\t21939\t48880-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/BLU027722.mp3\tH.goodman Tenn.valley Boys\tTennessee Swing\tBLUEBIRD\t7868\t027722\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/COLB14194.mp3\tEddie Condon Orch\tTennessee Twilight\tCOLUMBIA\t36009\tB14194\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1316x.mp3\tLes Paul And Mary Ford\tTennessee Waltz\tCAPITOL\t1316\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO40412.mp3\tRoy Acuff Smoky Mountain Boys\tTennessee Waltz\tCOLUMBIA\t20551\tCO40412\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/ColHCO4303-1.mp3\tJo Stafford\tTennessee Waltz\tColumbia\t39065\tHCO 4303-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MOD366.mp3\tPatti Page Duet\tTennessee Waltz\tMODERN\tMERC5534\t366\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC27336x.mp3\tGuy Lombardo And His Orch\tTennessee Waltz\tDECCA\t27336\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK2440-L6.mp3\tCowboy Copas\tTennessee Waltz\tKING\t696A\tK2440-L6\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_042.mp3\tLes Paul And Mary Ford\tTennessee Waltz\tCAPITOL\t1316\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_047.mp3\tJo Stafford\tTennessee Waltz\tColumbia\t39065\tHCO 4303-1\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_180.mp3\tFontane Sisters\tTennessee Waltz\tRCA Victor\t3979\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK3623-X1.mp3\tBonnie Lou\tTennessee Wig Walk\tKING\t1237\tK3623-X1\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol14097-F.mp3\tI Sei Ladroni\tTentazione\tColumbia\t14097-F\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU53CH.mp3\tGene Rodemich And His Orchestra\tTenth Interval Rag\tBRUNSWICK\t2599A\t53CH\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0216_01.mp3\tLee Morse\tTentin Down In Tennessee\tPerfect\t11608A\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4655.mp3\tDick Haymes And Andrews Sisters\tTeresa\tDECCA\t24320\tL4655\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_255.mp3\tDick Haymes And Andrews Sisters\tTeresa\tDECCA\t24320\tL4655\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_426.mp3\tJackie Gleason And His Orchestra\tTerry's Theme From ''limelight''\tCAPITOL\t2507\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D227A1.mp3\tGeorgia Gibbs With Tommy Dorsey\tTess's Torch Song\tV-DISC\t227A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/HITCR354.mp3\tCootie Williams & His Orch\tTess's Torch Song (v P. Bailey)\tHIT OF THE WEEK\t7075B\tCR354\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_047.mp3\tHarry Macdonough And John Bieling\tTessie\tVictor\t2056\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU14589-90-1.mp3\tRay Miller & His Orch\tTessie Stop Teasing Me\tBRUNSWICK\t2830\t14589-90-1\t1925\t\nhttp://www.jazz-on-line.com/mp3/208995819.mp3\tEddy Arnold\tTexarkana Baby\tRCA\t20-2806\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_142.mp3\tEddy Arnold\tTexarkana Baby\tRCA\t20-2806\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23810x.mp3\tLouis Jordan\tTexas And Pacific\tDECCA\t23810\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD6VB3409.mp3\tPat Flowers & His Rhythm\tTexas And Pacific\tRCA\t20-2125\tD6VB3409\t1946\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-22249-1.mp3\tHarry James And His Orchestra\tTexas Chatter\tBrunswick\t8067\tB-22249-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN581.mp3\tHank Penny\tTexas In My Soul\tKING\t581\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_477.mp3\tLes Paul And Mary Ford\tTexas Lady\tCapitol\t3301\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC067794-1.mp3\tNew Orleans Feetwarmers\tTexas Moaner\tVICTOR\t27600\t067794-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE72914-B.mp3\tClarence Williams Blue Five\tTexas Moaner Blues\tOKeh\t8171B\t72914-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1243-2.mp3\tBob Wills And His Texas Playboys\tTexas Playboy Rag\tCOLUMBIA\t36841\tHCO1243-2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MER70466.mp3\tJerry Byrd\tTexas Playboy Rag\tMERCURY\t70466\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_242.mp3\tMartha Tilton\tTexas Polka\tCapitol\t157\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99431.mp3\tTune Wranglers\tTexas Sand\tBLUEBIRD\t6513\t99431\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64473-A.mp3\tCount Basie And His Orch\tTexas Shuffle\tDECCA\t2030A\t64473-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic20-3137-B.mp3\tSpade Cooley\tTexas Steel Guitar\tVictor\t20-3137-B\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COL265167-2.mp3\tBenny Goodman And His Orchestra\tTexas Tea Party\tCOLUMBIA\t2845 D\t265167-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL2845-D.mp3\tBenny Goodman & His Orchestra\tTexas Tea Party\tCOLUMBIA\t2845-D\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU02902-1.mp3\tFrank Tanner's Rhythm Kings\tTexas Teaser\tBLUEBIRD\tB-6750B\t02902-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_077.mp3\tJo Stafford\tThank You For Calling\tColumbia\t40250\tRHCO 10880\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL254.mp3\tLee O'daniel Hillbilly Boys\tThank You Mr Moon\tVOCALION\t3753\tDAL254\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC59696-2.mp3\tHelen Kane\tThank Your Father\tVICTOR\t22397\t59696-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COL195071.mp3\tBen Selvin & His Orch\tThank Your Father\tCOLUMBIA\tHA1119H\t195071\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUE32205.mp3\tAl Goodman & His Orch\tThank Your Father\tBRUNSWICK\t4726\tE32205\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_175.mp3\tAl Goodman And His Orchestra\tThank Your Father\tBRUNSWICK\t4726\tE32205\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67064.mp3\tWoody Herman & His Orchestra\tThank Your Lucky Stars\tDECCA\t2971B\t67064\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046056.mp3\tCharlie Barnet & His Orch\tThank Your Stars (v M A M)\tBLUEBIRD\t10568\t046056\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC61109.mp3\tLouis Armstrong And His Orchestra\tThankful\tDECCA\t866B\t61109-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1.mp3\tBing Crosby\tThanks\tBRUNSWICK\t6643\tLA1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/CONLA1-A.mp3\tBing Crosby\tThanks\tCONQUEROR\t8367\tLA1-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60249.mp3\tLouis Armstrong & His Orch.\tThanks A Million\tDECCA\t666A\t60249-A;B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_244.mp3\tLouis Armstrong\tThanks A Million\tDECCA\t666A\t60249-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_095.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tThanks For Everything\tVICTOR\t25534\t04932\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh116.mp3\tJoe Loss And His Band\tThanks For Everything (v Chick Henderson)\tRegal Zonophone\tMR-3030\tCAR-5359-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU028974-1.mp3\tArtie Shaw And His Orchestra\tThanks For Everything (v H F)\tBLUEBIRD\t10055\t028974-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23814-2.mp3\tRed Norvo & His Orch\tThanks For Everything (v Terry Allen)\tBRUNSWICK\t8288\t23814-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31802.mp3\tGene Krupa & His Orch\tThanks For The Boogie Ride\tOKEH\t6506\t31802\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481114.mp3\tGene Krupa Orch. Feat. Anita O'day\tThanks For The Boogie Ride\tOkeh\t6506\t31802-2\t1941\tRoy Eldridge (tp, vo), Norman Murphy, Al Beck, Graham Young (tp), John Grassi, Jay Kelliher, Babe Wagner (tb), Mascagni ''Musky'' Ruffo (as), Sam Musiker (cl,as), Jimmy Migliori (as), Walter Bates (ts), Sam Listengart (as), Milt Raskin (p) Ray Biondi (g), Ed Mihelich (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3a/VIC20030-A.mp3\tFrank Crumit\tThanks For The Buggy Ride\tVICTOR\t20030\t35310-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe74013-A.mp3\tThe Jazz Pilots (harry Reser)\tThanks For The Buggy Ride\tOKeh\t40569\t74013-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0300_01.mp3\tLee Morse\tThanks For The Buggy Ride\tPathe\t25178A\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_114.mp3\tXavier Cugat And His Waldorf-astoria Orchestra Feat. Carmen Castillo\tThanks For The Dream\tCOLUMBIA\t36681\tCO32078-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU017433.mp3\tShep Fields Rippling Rhythm\tThanks For The Memory\tBLUEBIRD\t7318\t017433\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1583-A.mp3\tBob Hope & Shirley Ross\tThanks For The Memory\tDECCA\t2219B\tDLA1583-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22266-2.mp3\tMildred Bailey\tThanks For The Memory\tCBS\tVO3931\t22266-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/CON9004.mp3\tLeonard Feather Allstars\tThanks For The Memory\tCONTIN\tT6016\t9004\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_201.mp3\tMildred Bailey\tThanks For The Memory\tCBS\tVO3931\t22266-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_010.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. Bob Goday\tThanks For The Memory\tBluebird\t7318\t17433\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D165A2.mp3\tFats Waller And Ada Brown\tThat Ain't Right\tV-DISC\t165A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D772TAR.mp3\tMildred Bailey\tThat Ain't Right\tV-DISC\t772\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69852.mp3\tKing Cole Trio\tThat Ain't Right\tDECCA\t8630A\t69852\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_216.mp3\tTony Pastor And His Orchestra\tThat Ain't The Way I Dreamed It\tBluebird\t11502\t071907\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/CONC1253-2.mp3\tLil Johnson\tThat Bonus Done Gone Through\tCONQUEROR\t8647\tC1253-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63495-B.mp3\tInk Spots\tThat Cat Is High\tDECCA\t1789B\t63495-B\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC34177-4.mp3\tPaul Whiteman & His Orch\tThat Certain Feeling\tVICTOR\t19920\t34177-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55426-1.mp3\tBennie Moten's Kansas City Or.\tThat Certain Motion\tVICTOR\t38104\t55426-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW141415-2.mp3\tTed Lewis And His Band\tThat Certain Party\tCOLUMBIA\t531 D\tW141415-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/BAN6264-2.mp3\tBilly Jones And Ernest Hare\tThat Certain Party\tBANNER\t1649\t6264-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_096.mp3\tTed Lewis And His Band\tThat Certain Party\tCOLUMBIA\t531 D\tW141415-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_106.mp3\tErnest Hare And Billy Jones\tThat Certain Party\tVictor\t19865\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh143.mp3\tJack Hylton And His Orchestra\tThat Certain Party Of Mine\tHMV\tB-2243\tBb-7496-1-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23610x.mp3\tLouis Jordan\tThat Chick's Too Young To Fry\tDECCA\t23610\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/PARG15671.mp3\tBlind Lemon Jefferson\tThat Crawlin' Baby Blues\tPARAMOUNT\t12880B\tG15671\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU040263.mp3\tMuggsy Spanier Ragtime Band\tThat Da Da Strain\tBLUEBIRD\t10384A\t040263\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE30029.mp3\tLouisiana Rhythm Kings\tThat Da Da Strain\tVOCALION\t15828B\tE30029\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COL27687-1.mp3\tBud Freeman And His Famous Chicagoans\tThat Da Da Strain\tCOLUMBIA\t35854\t27687-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-30029.mp3\tLouisiana Rhythm Kings\tThat Da Da Strain\tVocalion\t15828\tE-30029\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12861-A.mp3\tThree Keys\tThat Doggone Dog Of Mine\tBRUNSWICK\t6522\t12861-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU6522.mp3\tThree Keys\tThat Doggone Dog Of Mine\tBRUNSWICK\t6522\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35111.mp3\tGene Krupa & His Orch\tThat Feeling In The Moonlight\tCOLUMBIA\t36862\tCO35111\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC022417.mp3\tBenny Goodman And His Orchestra\tThat Feeling Is Gone\tVICTOR\t25827\t022417\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03247.mp3\tTommy Dorsey & His Orch\tThat Foolish Feeling\tVICTOR\t25474\t03247\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_248.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tThat Foolish Feeling\tVICTOR\t25474\t03247\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU20315-1.mp3\tBunny Berigan And His Boys\tThat Foolish Feeling (v Art Gentry)\tBRUNSWICK\t7784\t20315-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC82379.mp3\tWebb Pierce\tThat Heart Belongs To Me\tDECCA\t28091\t82379\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_129.mp3\tHomer And Jethro\tThat Hound Dog In The Window\tRCA\t20-5280\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_142.mp3\tCharles King And Elizabeth Brice\tThat Hula Hula\tCOLUMBIA\t1944\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC63361-3.mp3\tDuke Ellington & His Orch\tThat Lindy Hop\tVICTOR\t23016\t63361-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3918.mp3\tBing Crosby & Eddie Heywood\tThat Little Dream Got Nowhere\tDECCA\t23636\tL3918\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99040.mp3\tTommy Dorsey & His Clambake 7\tThat Lovely Night In Budapest\tVICTOR\t25246\t99040\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_102.mp3\tNora Bayes\tThat Lovin' Rag\tVICTOR\t60023\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC040980.mp3\tTommy Dorsey & His Orch\tThat Lucky Fellow ('very Warm For May')\tVICTOR\t26401B\t040980\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26203-A.mp3\tBenny Goodman & His Orch\tThat Lucky Fellow (vocal Mildred Bailey)\tCOLUMBIA\t35308\t26203-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MERME2855.mp3\tFrankie Lane\tThat Lucky Old Sun\tMERCURY\t5316\tME2855\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3531x.mp3\tVaughn Monroe\tThat Lucky Old Sun\tRCA\t20-3531\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3747.mp3\tSarah Vaughan\tThat Lucky Old Sun\tCOLUMBIA\t38559\tHCO3747\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75227.mp3\tLouis Armstrong - G.jenkins\tThat Lucky Old Sun\tDECCA\t24752\t75227\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/HARCO41730.mp3\tHot Lips Page\tThat Lucky Old Sun\tHARMONY\tHa1077\tCO41730\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_135.mp3\tFrank Sinatra\tThat Lucky Old Sun\tCOLUMBIA\t38608\tHCO3903\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_175.mp3\tLouis Armstrong Feat. Gordon Jenkins And His Orchestra\tThat Lucky Old Sun\tDECCA\t24752\t75227\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC64770.mp3\tBlue Lu Barker & Fly Cats\tThat Made Him Mad\tDECCA\t7538\t64770\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM147-1.mp3\tCab Calloway & His Orch\tThat Man Is Here Again\tVARIETY\tI501\tM147-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_102.mp3\tIrene Bordoni\tThat Means Nothing To Me\tVICTOR\t19966\t34358-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_095.mp3\tWalter Van Brunt\tThat Mellow Melody\tVICTOR\t17170\t12330-3\t1912\t\nhttp://www.jazz-on-line.com/a/mp3a/COL04328-1.mp3\tArthur Collins And Byron Harlan\tThat Mesmerizing Mendelssohn Tune\tCOLUMBIA\tA-0801\t04328-1\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_012.mp3\tArthur Collins And Byron Harlan\tThat Mesmerizing Mendelssohn Tune\tCOLUMBIA\tA-0801\t04328-1\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_012alt.mp3\tArthur Collins And Byron G. Harlan\tThat Mesmerizing Mendelssohn Tune\tIndestructible\t3065\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_044.mp3\tBrown Brothers\tThat Moaning Saxophone Rag\tVictor\t17677\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_069.mp3\tAmerican Quartet\tThat Mysterious Rag\tVictor\t16982\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_045.mp3\tArthur Collins And Albert Campbell\tThat Mysterious Rag\tCOLUMBIA\t1086\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62073.mp3\tChick Webb & His Orchestra\tThat Naughty Waltz\tDECCA\t1356\t62073\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_356.mp3\tChick Webb And His Orchestra\tThat Naughty Waltz\tDecca\t1356\t62073-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_116.mp3\tColumbia Orchestra W Burr And Campbell\tThat Naughty Waltz\tCOLUMBIA\t6139\t49695\t1920\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC60434-A.mp3\tIsham Jones And His Orchestra\tThat Never - To - Be - Forgotten Night - Vocal Eddy Stone\tDecca\t\t60434-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98899.mp3\tFats Waller And His Rhythm\tThat Never To Be Forgotten Night\tVICTOR\t25255\t98899\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP126x.mp3\tFreddie Slack\tThat Old Black Magic\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC71098-A.mp3\tCharlie Barnet And His Orch\tThat Old Black Magic\tDECCA\t18541A\t71098-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_101.mp3\tSammy Davis Jr.\tThat Old Black Magic\tDecca\t29541\t87521\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5741.mp3\tJohnny Guarnieri Trio\tThat Old Black Magic\tSAVOY\t554B\tS5741\t1944\t\nhttp://www.jazz-on-line.com/a/mp3r/RiUnkt.mp3\tGlenn Miller & His Orchestra\tThat Old Black Magic\tUnknown\t\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU011071.mp3\tShep Fields Rippling Rhythm\tThat Old Feeling\tBLUEBIRD\t7066\t011071\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO3499.mp3\tDoris Day\tThat Old Feeling\tCOLUMBIA\t38542\tHCO3499\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP62449.mp3\tPeggy Lee - Capitol Jazzmen\tThat Old Feeling\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1360.mp3\tJan Garber And His Orch\tThat Old Feeling\tBRUNSWICK\t7935\tLA1360\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO34354.mp3\tCount Basie & His Orchestra\tThat Old Feeling\tCOLUMBIA\t36795\tCO34354\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MERC527-6.mp3\tCharlie Ventura & His Orch\tThat Old Feeling\tMERCURY\t8949\tC527-6\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74301.mp3\tElla Fitzgerald\tThat Old Feeling\tDECCA\t28049\t74301\t\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS22826-4.mp3\tTeddy Wilson School For Piano\tThat Old Feeling\tCBS\t(Reject)\t22826-4\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25629.mp3\tGuy Lombardo & His Royal Canadians\tThat Old Feeling\tVictor\t25629\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Cap174-A.mp3\tCapitol Jazzmen With Barney Bigard And Peggy Lee\tThat Old Feeling\tCapitol\t1609\t174-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_173.mp3\tJan Garber And His Orchestra\tThat Old Feeling\tBRUNSWICK\t7935\tLA1360\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_007.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. Bob Goday\tThat Old Feeling\tBluebird\t7066A\t11071\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/TedP-22826-4.mp3\tTeddy Wilson And His Orchestra\tThat Old Feeling\tTeddy Wilson School \t\tP-22826-4\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D174.mp3\tPeggy Lee+capitol Jazzmen\tThat Old Feeling (vpl)\tV-DISC\t354\t174\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-11082-A.mp3\tTeddy Powell And His Orch\tThat Old Gang Of Mine\tBLUEBIRD\t11082\t060601-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC28448-4.mp3\tBenson Orchestra Of Chicago\tThat Old Gang Of Mine\tVICTOR\t19136\t28448-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC27997.mp3\tBilly Murray And Ed Smalle\tThat Old Gang Of Mine\tVICTOR\t19095A\t27997.\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/EDI9114-B.mp3\tBilly Jones & Ernest Hare\tThat Old Gang Of Mine\tEDISON\t51235L\t9114-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_003.mp3\tBilly Murray And Ed Smalle\tThat Old Gang Of Mine\tVICTOR\t19095A\t27997.\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_063.mp3\tBenson Orchestra Of Chicago\tThat Old Gang Of Mine\tVICTOR\t19136\t28448-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_064.mp3\tErnest Hare And Billy Jones\tThat Old Gang Of Mine\tEDISON\t51235L\t9114-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_023.mp3\tAmerican Quartet\tThat Old Girl Of Mine\tVictor\t17264\t12722-1\t1913\t\nhttp://www.jazz-on-line.com/a/mp3b/LYR5222i.mp3\tCharles Harrison\tThat Old Irish Mother Of Mine\tLYRIC\t5222\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_064.mp3\tCharles Harrison\tThat Old Irish Mother Of Mine\tLYRIC\t5222\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC23391r.mp3\tBillie Holiday\tThat Ole Devil Called Love\tDECCA\t23391\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_045.mp3\tWalter Van Brunt\tThat Railroad Rag\tVICTOR\t16876A\t10256-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBan1203.mp3\tJoseph Samuals & His Orchestra\tThat Red Head Gal\tBanner\t1203\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC38593-A.mp3\tChick Webb And His Orchestra\tThat Rhythm Man\tDECCA\t173A\t38593-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402540-C.mp3\tLouis Armstrong & His Orch\tThat Rhythm Man\tOKeh\t8717\t402540-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/Col148640-1.mp3\tSonny Greer And The Memphis Men\tThat Rhythm Man\tColumbia\t36157\t148640-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA3392.mp3\tTed Lewis' Jazz Band\tThat Riga-liga-lee\tColumbia\tA3392\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/CON10943-1.mp3\tGene Autry And Jimmy Long\tThat Silver Haired Daddy Of Mine\tCONQUEROR\t7908\t10943-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_099.mp3\tGene Autry And Jimmy Long\tThat Silver-haired Daddy Of Mine\tVocalion\t2991\t10943-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1720.mp3\tBing Crosby - J.s.trotter\tThat Sly Old Gentleman\tDECCA\t3600B\tDLA1720\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72656.mp3\tJimmie Lunceford And His Orchestra\tThat Someone Must Be You\tDecca\t18655\t72656\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010564.mp3\tTommy Dorsey & His Orch\tThat Stolen Melody\tVICTOR\t25603\t010564\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1797.mp3\tRoy Eldridge & His Orch\tThat Thing\tVOCALION\t3577\tC1797\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62912-2.mp3\tBennie Moten Kansas City Orch\tThat Too Do Blues\tVICTOR\t22793B\t62912-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/COL19259.mp3\tAda Jones And Walter Van Brunt\tThat Was Before I Met You\tCOLUMBIA\tA-0998\t19259\t1911\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65448-A.mp3\tChick Webb And His Orchestra\tThat Was My Heart\tDecca\t2665\t65448-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_084.mp3\tArthur Collins And Byron Harlan\tThat Welcome Mat Ain't Out For Me\tVICTOR\t5092\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_028.mp3\tHenry Burr\tThat Wonderful Mother Of Mine\tVICTOR\t18524\t22564-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU31133.mp3\tRoy Ingraham And His Orch\tThat Wonderful Something (is Love)\tBRUNSWICK\t4586\t31133\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/BRU31133HU2-1.mp3\tRoy Ingraham And His Orchestra\tThat Wonderful Something (is Love)\tBRUNSWICK\t4586\tE-31133\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57516-5.mp3\tNat Shilkret & His Orch\tThat Wonderful Something (vmk)\tVICTOR\t22203B\t57516-5\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D157A.mp3\tJimmy Dorsey And His Orchestra\tThat Wonderful, Worrisome Feeling\tV-DISC\t157A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU99178.mp3\tDelmore Brothers\tThat Yodelin' Gal, Miss Julie\tBLUEBIRD\t8687\t99178\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71129.mp3\tLouis Jordan & His Tympani 5\tThat'll Just 'bout Knock Me Out\tDECCA\t8653\t71129\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59506-1.mp3\tJelly Roll Morton's Peppers\tThat'll Never Do\tVICTOR\t23019\t59506-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS25363-2.mp3\tSlim & Slam\tThat's A Bringer, That's A Hanger\tCBS\tVO5220\t25363-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL20628TA.mp3\tTed Daffan\tThat's A Dad Blamed Lie\tCOLUMBIA\t20628\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE20329.mp3\tBen Selvin & His Orch\tThat's A Good Girl\tBRUNSWICK\t3340\tE20329\t1926\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR142678-3.mp3\tUniversity Six\tThat's A Good Girl\tHARMONY\t262-H\t142678-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BIL1021x.mp3\tBenny Goodman\tThat's A Plenty\tBiltmore\t1021\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101264.mp3\tTommy Dorsey & His Orch\tThat's A Plenty\tVICTOR\t25363\t101264\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM1916-A.mp3\tThe Dutch Swing College Band\tThat's A Plenty\tDecca\tM32772\tAM1916-A\t1950\t\nhttp://www.jazz-on-line.com/a/mp3h/CroC-1780-3.mp3\tJoel Shaw And His Orchestra\tThat's A Plenty\tCrown\t3352\tC-1780-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU87764.mp3\tKxyz Novelty Band\tThat's A Plenty\tBLUEBIRD\t5852\t87764\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE29321.mp3\tLouisiana Rhythm Kings\tThat's A Plenty\tVOCALION\t15784\tE29321\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-29321.mp3\tLouisiana Rhythm Kings\tThat's A Plenty\tVocalion\t15784\tE-29321\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU48346-1.mp3\tEddie Condon's Hotshots\tThat's A Serious Thing (v J T)\tBLUEBIRD\t10168B\t48346-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69910.mp3\tLucky Millinder & His Orch\tThat's All\tDECCA\t18496B\t69910\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC56070-2.mp3\tFats Waller (piano)\tThat's All\tVICTOR\t23260\t56070-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D129A2.mp3\tSister Rosetta Tharpe With Lucky Millinder\tThat's All\tV-DISC\t129A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic56070-3.mp3\tThomas Waller\tThat's All\tVictor\t23260\t56070-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_134.mp3\tTennessee Ernie Ford\tThat's All\tCapitol\t3343\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69910-A.mp3\tLucky Millinder And His Orchestra\tThat's All\tDecca\t18496\t69910-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/V-DVP-391B.mp3\tSister Tharpe With Lucky Millinder And His Orchestra\tThat's All\tV-Disc\t129-A\tVP-391\t1943\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480683.mp3\tAhmad Jamal\tThat's All\tArgo\tLP-636\t9038\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3c/CBS23992-1.mp3\tBillie Holiday\tThat's All I Ask Of You\tCBS\tVO4631\t23992-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_029.mp3\tJaye P. Morgan\tThat's All I Want From You\tRCA Victor\t5896\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO52857-1.mp3\tMarty Robbins\tThat's All Right\tCOLUMBIA\t21351\tCO52857-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3557.mp3\tChampion Jack Dupree\tThat's All Right\tOKEH\t6068\tC3557\t1941\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC33159-3.mp3\tCoon-sanders Nighthawk Orch\tThat's All There Is\tVICTOR\t19750\t33159-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_113.mp3\tNat King Cole And The Four Knights\tThat's All There Is To That\tCapitol\t3456\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65906.mp3\tElla Fitzgerald & Her Orch\tThat's All, Brother\tDECCA\t2628B\t65906\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65906-A.mp3\tElla Fitzgerald And Her Famous Orchestra\tThat's All, Brother\tDecca\t2628\t65906-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2589x.mp3\tDean Martin\tThat's Amore\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_011.mp3\tDean Martin\tThat's Amore\tCapitol\t2589\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR234-Hx.mp3\tHarmonians\tThat's Annabelle\tHarmony\t234-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5500.mp3\tDizzy Gillespie & His Sextet\tThat's Earl, Brother\tMUSICRAFT\t383\t5500\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3881.mp3\tDick Haymes - Victor Young\tThat's For Me\tDECCA\t18706A\tL3881\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2043-A.mp3\tBing Crosby\tThat's For Me\tDECCA\t3309A\tDLA2043-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1075.mp3\tArtie Shaw And His Orchestra\tThat's For Me\tRCA\t20-1716\tD5VB1075\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_095.mp3\tBing Crosby\tThat's For Me\tDECCA\t3309A\tDLA2043-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_177.mp3\tKay Kyser And His Orchestra\tThat's For Me\tCOLUMBIA\t36844\tHCO1468\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_051.mp3\tJo Stafford\tThat's For Me\tCapitol\t213\t689-1A\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76343.mp3\tLouis Armstrong & His Allstars\tThat's For Me Part 1\tDECCA\t27187\t76343\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76344.mp3\tLouis Armstrong & His Allstars\tThat's For Me Part 2\tDECCA\t27188\t76344\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/ARCB13014.mp3\tMills Bros\tThat's Georgia\tARC\t(ARC-?)\tB13014\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81948-4.mp3\tFletcher Henderson's Orch\tThat's Georgia\tCOLUMBIA\t202D\t81948-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU137CH.mp3\tGene Rodemich And His Orchestra\tThat's Georgia\tBRUNSWICK\t2731A\t137CH\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3a/PER15092.mp3\tLou Gold And His Orch\tThat's How I Feel About You\tPerfect\t15092\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic010570-1.mp3\tMezz Mezzrow And His Orchestra\tThat's How I Feel Today\tVictor\t25636\t010570-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke402965-C.mp3\tThe Little Chocolate Dandies With Benny Carter\tThat's How I Feel Today\tOkeh\t8728 \t402965-C\t1929 \tRex Stewart, Leonard Davls tp, J.C. Higginbottamn tb,, Don Redman, Benny Carter as, Coleman Hawkins ts, Fats Waller p, Cyrus St Clair tu, George Stafford d, Don Redman, Benny Carter vcl\nhttp://www.jazz-on-line.com/a/mp3w/1912_037.mp3\tHenry Burr\tThat's How I Need You\tVICTOR\t17173\t12196-4\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO10108.mp3\tFrankie Laine - Paul Weston\tThat's How It Goes\tCOLUMBIA\t39716\tHCO10108\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC23840--.mp3\tBing Crosby\tThat's How Much I Love You\tDECCA\t23840\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_124.mp3\tFrank Sinatra\tThat's How Much I Love You\tCOLUMBIA\t37231\tCO37163\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13991-1.mp3\tBoswell Sisters\tThat's How Rhythm Was Born\tBRUNSWICK\t6650\t13991-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCB-13740-A.mp3\tCasa Loma Orch\tThat's How Rhythm Was Born\tVOCALION\t4822\tB-13740-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-127-1.mp3\tElisabeth Welch\tThat's How The First Song Was Born\tVocalion\t526\tS-127-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5787.mp3\tPete Brown's Sextet\tThat's It\tSAVOY\t579\tS5787\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DIV2661-Gx.mp3\tBroadway Bell-hops\tThat's Just My Way Of Forge\tDiva\t2661-G\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC46097-3.mp3\tJean Goldkette & His Orch\tThat's Just My Way Of Forgetting You\tVICTOR\t21590\t46097-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20291-1.mp3\tTeddy Wilson And His Orchestra\tThat's Life I Guess\tBrunswick\t7789  \tB-20291-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR908-Hy.mp3\tBarth's Mississippians\tThat's Living\tHarmony\t908-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14775A.mp3\tCasa Loma Orchestra\tThat's Love\tBRUNSWICK\t6764\t14775A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_304.mp3\tStan Freberg Feat. O/les Baxter\tThat's My Boy\tCapitol\t1711\t\t1951\t\nhttp://www.jazz-on-line.com/mp3/867960929.mp3\tWoody Herman And His Orch\tThat's My Desire\tCOLUMBIA\t37329\tCO37499\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COL41331x.mp3\tFrankie Laine\tThat's My Desire\tCOLUMBIA\t41331\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/MER481-2.mp3\tFrankie Laine W Manny Klein\tThat's My Desire\tMERCURY\t5007A\t481-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/MOD147x.mp3\tHadda Brooks\tThat's My Desire\tMODERN\t147\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73819.mp3\tElla Fitzgerald W Bob Haggart\tThat's My Desire\tDECCA\t23866\t73819\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_119.mp3\tMartha Tilton\tThat's My Desire\tCapitol\t395\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_049.mp3\tFrankie Laine\tThat's My Desire\tCOLUMBIA\t41331\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80376.mp3\tLouis Armstrong & His Orch\tThat's My Desire Part.1\tDECCA\t28106\t80376\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80377.mp3\tLouis Armstrong & His Orch\tThat's My Desire Part.2\tDECCA\t28105\t80377\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36237.mp3\tGene Krupa & His Orch\tThat's My Home\tCOLUMBIA\t37067\tCO36237\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC74820-1.mp3\tLouis Armstrong & His Orch\tThat's My Home\tVICTOR\t24200\t74820-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_181.mp3\tLouis Armstrong\tThat's My Home\tVICTOR\t24200\t74820-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR635-Hy.mp3\tLou Gold And His Orch\tThat's My Mammy\tHarmony\t635-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3313.mp3\tUna Mae Carlisle W Orch\tThat's My Man\tSAVOY\t616A\tS3313\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45881-2.mp3\tHelen Kane - Nat Shilkret Orch\tThat's My Weakness Now\tVICTOR\t21557\t45881-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC2019.mp3\tAbe Lyman & His Californians\tThat's My Weakness Now\tBRUNSWICK\t3971\tC2019\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE20995.mp3\tRed Nichols 5 Pennies\tThat's No Bargain\tVOCALION\t1069\tE20995\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1596.mp3\tElla Fitzgerald Vdisc Jumpers\tThat's Rich (v E. Fitzgerald)\tV-DISC\t603\t1596\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036922.mp3\tCharlie Barnet & His Orch\tThat's Right, I'm Wrong (v J E)\tBLUEBIRD\t10273\t036922\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC075090.mp3\tGlenn Miller & His Orch\tThat's Sabotage\tVICTOR\t27935\t075090\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69730.mp3\tSkeets Tolbert Gentlemen Swing\tThat's That Messy Boggie\tDECCA\t8631\t69730\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec69730-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tThat's That Messy Boogie\tDecca\t8631\t69730-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP988.mp3\tKing Cole Trio\tThat's The Beginning Of The End\tCAPITOL\t\t988\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_078.mp3\tEddie Fisher\tThat's The Chance You Take\tRCA\t20-4574\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/SAV5785.mp3\tPete Brown Sextet\tThat's The Curfew\tSAVOY\t533B\t5785\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74918.mp3\tSy Oliver & His Orch\tThat's The Gal For Me\tDECCA\t24653\t74918\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401584-C.mp3\tJoe Venuti's New Yorkers\tThat's The Good Old Sunny South (v S B)\tOKeh\t41192\t401584-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_136.mp3\tEddie Cantor\tThat's The Kind Of A Baby For Me\tVICTOR\t18342\t20217-2\t1917\t\nhttp://www.78-tours.net/mp3/VIC7135.mp3\tRay Ventura Et Son Orchestre\tThat's The Moon, My Son\tVICTORY\t9050\t7135\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_163.mp3\tAndrews Sisters\tThat's The Moon, My Son\tDECCA\t18398\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/APO361TT.mp3\tWynonie Harris\tThat's The Stuff You Gotta Watch\tAPOLLO\t361\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC8671x.mp3\tBuddy Johnson's Orch\tThat's The Stuff You Gotta Watch\tDECCA\t8671\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/Col031656-1.mp3\tBenny Goodman And His Orchestra\tThat's The Way It Goes\tColumbia\tGL-523\tCO-031656-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72747.mp3\tElla Fitzgerald & Ink Spots\tThat's The Way It Is\tDECCA\t25047\t72747\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/PerA-169y.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tThat's The Way You Fall In Love\tPerception\tPLP35-2\tA-169y\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP2052.mp3\tKing Cole Trio\tThat's What\tCAPITOL\t\t2052\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49988-2.mp3\tGene Austin\tThat's What I Call Heaven\tVICTOR\t21893\t49988-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC50931-2.mp3\tLeo Reisman & His Orch\tThat's What I Call Heaven\tVICTOR\t21921\t50931-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_233.mp3\tGene Austin Feat. O/leonard Joy\tThat's What I Call Heaven\tVICTOR\t21893\t49988-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45134-3.mp3\tEddie South And His Alabamians\tThat's What I Call Keen\tVICTOR\t21605\t45134-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/KI991-AN.mp3\tJimmy Thomason\tThat's What I Got For Loving You\tKING\t991-A\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/Bru12672-A.mp3\tCab Calloway And His Orchestra\tThat's What I Hate About Love\tBrunswick\t6460\t12672-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_092.mp3\tDon, Dick N' Jimmy\tThat's What I Like\tCROWN\t0125\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/MOD313.mp3\tPhil Harris\tThat's What I Like About The South\tMODERN\tARA-104\t313\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_249.mp3\tPhil Harris\tThat's What I Like About The South\tMODERN\tARA-104\t313\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151840-1.mp3\tJack Teagarden & His Orch\tThat's What I Like About You\tCOLUMBIA\t2558 D\tW151840-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55425-1.mp3\tBennie Moten's Kansas City Or.\tThat's What I'm Talking 'bout\tVICTOR\t38081\t55425-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB6535.mp3\tRay Noble & His Orch\tThat's What Life Is Made Of\tVICTOR\t24599\tOB6535\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75628.mp3\tBuddy Johnson\tThat's What My Baby Says\tDECCA\t24920\t75628\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC48611-3.mp3\tJean Goldkette And His Orch\tThat's What Puts The Sweet In Home Sweet Home\tVICTOR\t21800B\t48611-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76790.mp3\tLouis Armstrong - Sy Oliver\tThat's What The Man Said\tDECCA\t27254\t76790\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS22320-3.mp3\tSlim Gaillard\tThat's What You Call Romance\tCBS\tVO3981\t22320-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0424.mp3\tTempo King's Kings Of Tempo\tThat's What You Mean To Me\tBLUEBIRD\t6560\t0424\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61312.mp3\tBob Howard & His Orch\tThat's What You Mean To Me\tDECCA\t990B\t61312\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO32496-1.mp3\tGene Krupa & His Orch\tThat's What You Think\tCOLUMBIA\t36621\tCO32496-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU94515.mp3\tJoe Kennedy & His Orch\tThat's What You Think\tBLUEBIRD\t6062\t94515\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481115.mp3\tGene Krupa Orch. Feat. Anita O'day\tThat's What You Think\tColumbia\t36621\t32426-1\t1942\tRoy Eldridge, Mickey Mangano, Norman Murphy, Al Beck (tp), John Grassi, Jay Kelliher, Babe Wagner (tb), Ben Feman, Rex Kittig, Jimmy Migliori (as), Sam Musiker (ts,cl), Don Brassfield (ts), Joe Springer (p), Ray Biondi (g), Ed Mihelich (sb), Gene Krupa (dm\nhttp://www.jazz-on-line.com/a/mp3c/OKe80884-B.mp3\tLouis Armstrong's Hot Five\tThat's When I'll Come Back To You\tOKeh\t8519\t80884-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC177.mp3\tJoe Turner\tThat's When It Really Hurts\tNATIONAL\t\tNSC177\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_228.mp3\tPerry Como Feat. O/lloyd Shaffer\tThat's Where I Came In\tRCA Victor\t2117\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64623-1.mp3\tRed's Big Ten\tThat's Where The South Begins\tVICTOR\t23026\t64623-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16023-A.mp3\tLouis Prima's New Orleans Gang\tThat's Where The South Begins\tBRUNSWICK\t7524\t16023-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-16023-A.mp3\tLouis Prima And His New Orleans Gang\tThat's Where The South Begins\tBrunswick\t7524\tB-16023-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/QRS2375-2.mp3\tEli Pletcher's Prom Trotters\tThat's Where You're Wrong\tQRS\t1055B\t2375-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_142.mp3\tKate Smith\tThat's Why Darkies Were Born\tCOLUMBIA\t2563\tW151866-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20105-A.mp3\tJohnny Hamp's Kentucky Serenade\tThat's Why I Love You\tVictor\t20105-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR229-Hy.mp3\tIrving Kaufman\tThat's Why I Love You\tHarmony\t229-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_105.mp3\tJohnny Hamp And His Orchestra\tThat's Why I Love You\tVICTOR\t20105A\t35745-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC10026-2.mp3\tBilly Murray\tThat's Why I Never Married\tVICTOR\t16851\t10026-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_109.mp3\tBilly Murray\tThat's Why I Never Married\tVICTOR\t16851\t10026-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU056502.mp3\tByron Parker & Mountaineers\tThat's Why I'm Blue\tBLUEBIRD\t8771\t056502\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21917-B.mp3\tHelen Kane\tThat's Why I'm Happy\tVICTOR\t21917\t50946-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147922-2.mp3\tJan Garber & His Orch\tThat's Why I'm Happy\tCOLUMBIA\t1823 D\tW147922-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61811.mp3\tJimmie Davis\tThat's Why I'm Nobody's Darling\tDECCA\t5336\t61811\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_273.mp3\tOtis Williams And His New Group\tThat's Your Mistake\tDeLuxe\t6091\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/EasARH001.mp3\tKid Ory's All Stars\tThats A Plenty\tArhoolie\t\t\t1944\tKid Ory (trombone), Mutt Carey (trumpet), Jimmie Noone (clarinet), Buster Wilson (piano), Bud Scott (guitar), Ed Garland (bass) and Zutty Singleton (drums)\nhttp://www.jazz-on-line.com/a/mp3b/Joh159.mp3\tJohn Firman And His Band\tThats My Desire (v Maurice Elwin)\tZonophone\t6039\tOY-1533-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/MajT-720.mp3\tJimmie Lunceford And His Orchestra\tThe ''jimmies''\tMajestic\t1060\tT-720\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/MONV-5502.mp3\tAda Jones And Billy Murray\tThe A.b.c's Of The U.s.a\tMONARCH\tV-5502\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3r/RiMONV-5502.mp3\tAda Jones And Billy Murray\tThe A.b.c's Of The U.s.a\tMONARCH\tV-5502\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_224.mp3\tHoagy Carmichael And Cass Daley Feat. Matty Mattock's All-stars\tThe Aba Daba Honeymoon\tDECCA\t27474\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_010.mp3\tArthur Collins And Byron Harlan\tThe Aba Daba Honeymoon\tVICTOR\t17620\tB8078-2\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_224.mp3\tHoagy Carmichael And Cass Daley Feat. Matty Mattock's All-stars\tThe Aba Daba Honeymoon\tDecca\t27474\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_412.mp3\tFrankie Lymon And The Teenagers\tThe Abc's Of Love\tGee\t1022\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI6577-C.mp3\tVernon Dalhart - O\tThe Alcoholic Blues (albert Von Tilzer)\tEDISON\tBA 3735\t6577-C\t\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAE4VB-5592.mp3\tRalph Flanagan And His Orchestra.\tThe American Patrol Mambo\tRCA VICTOR \t20-5908\tE4VB-5592\t1954\t\nhttp://www.jazz-on-line.com/a/mp3o/RCAE4VB-5592.mp3\tRalph Flanagan & His Orch.\tThe American Patrol Mambo\tRCA VICTOR\t20-5908\tE4VB-5592\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061268.mp3\tGlenn Miller & His Orch\tThe Angels Came Thru (vre)\tBLUEBIRD\t11215-B\t061268\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4270.mp3\tAl Jolson\tThe Anniversary Song\tDECCA\t23714B\tL4270\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_020.mp3\tAl Jolson\tThe Anniversary Song\tDECCA\t23714B\tL4270\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/PER12910-A.mp3\tGene Autry And Jimmy Long\tThe Answer To 21 Years\tPerfect\t12910-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke26276-A.mp3\tCount Basie And His Orchestra\tThe Apple Jump\tOkeh\t5862\t26276-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_161.mp3\tArthur Collins\tThe Argentines, The Portugese, And The Greeks\tGennett\t9065\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU11866.mp3\tGene Rodemich And His Orchestra\tThe Arkansas Mule\tBRUNSWICK\t2550B\t11866\t1923\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3r/RiEdi51010-R.mp3\tSteve Porter & Earnst Hare\tThe Arkansas Traveler\tEdison\t51010-R\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu71669.mp3\tAlvino Rey & His Orch\tThe Army Air Corps\tBluebird\t11476\t71669\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT580.mp3\tBud Freeman W Ray Mckinley\tThe Atomic Era\tMAJESTIC\t1031\tT580\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_320.mp3\tChuck Miller\tThe Auctioneer\tMercury\t71001\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_140.mp3\tTony Bennett\tThe Autumn Waltz\tColumbia\t40770\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_304.mp3\tKay Kyser And His Orchestra\tThe Bad Humor Man\tCOLUMBIA\t35761\tLA2361\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_168.mp3\tJimmy Dorsey And His Orchestra\tThe Bad Humor Man\tDecca\t3435\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68176.mp3\tJimmy Dorsey & His Orch.\tThe Bad Humor Man (vho)\tDECCA\t3435B\t68176\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_102.mp3\tWalter Schumann\tThe Ballad Of Davy Crockett\tRCA Victor\t6041\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1895_001.mp3\tDan Quinn\tThe Band Played On\tBERLINER\t0961\t(Early)\t1895\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68714-A.mp3\tGuy Lombardo's Royal Canadians\tThe Band Played On\tDECCA\t3675A\t68714-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_362.mp3\tTex Ritter\tThe Bandit\tCapitol\t2916\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_254.mp3\tPercy Faith And His Orch.\tThe Bandit\tColumbia\t40323\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_140.mp3\tEddie Barclay\tThe Bandit (o'cangaceiro)\tTico\t249\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_117.mp3\tTeresa Brewer\tThe Banjo's Back In Town\tCoral\t61448\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_065.mp3\tJohn Mccormack\tThe Barefoot Trail\tVICTOR\t64878\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D373A2.mp3\tPaul Baron And His Orchestra\tThe Baron Riffs\tV-DISC\t373A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S3029.mp3\tSlim Gaillard & His Trio\tThe Bartender's Just Like A Mother\tMGM\t10111B\t47S3029\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D324A2.mp3\tRed Norvo And His Quintet\tThe Bass On The Barroom Floor\tV-DISC\t324A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/SUNSRC101.mp3\tJoe Sullivan (piano)\tThe Bass Romps Away\tSUNSET\t100-53\tSRC101\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_103.mp3\tFrank Stanley And Byron G. Harlan\tThe Battle Cry Of Freedom\tVICTOR\t4099\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_014.mp3\tColumbia Stellar Quartet Feat. Charles Harrison\tThe Battle Hymn Of The Republic\tCOLUMBIA\t2012\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_140.mp3\tThomas Chalmers\tThe Battle Hymn Of The Republic (song)\tEDISON\t28279\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3b/CONS3286.mp3\tCozy Cole & His Orchestra\tThe Beat\tCONTIN\tT6014\tS3286\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152725-2.mp3\tBen Pollack & His Orch\tThe Beat Of My Heart\tCOLUMBIA\t2905 D\tW152725-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC81987-2.mp3\tRamona's Park Avenue Boys\tThe Beat Of My Heart\tVICTOR\t24597\t81987-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144933-3.mp3\tMal Hallett & His Orch\tThe Beggar\tCOLUMBIA\t1287 D\tW144933-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3992-1.mp3\tDick Jurgens And His Orch\tThe Bells Of San Raquel (vh.cool)\tOKEH\t6456\tC3992-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3962.mp3\tBing Crosby - J.s.trotter\tThe Bells Of St Mary's\tDECCA\t18721\tL3962\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_077.mp3\tFrances Alda\tThe Bells Of St Mary's\tVICTOR\t64844\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP980.mp3\tKing Cole Trio\tThe Best Man\tCAPITOL\t\t980\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_198.mp3\tKing Cole Trio\tThe Best Man\tCapitol\t304\t980\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_214.mp3\tLes Brown And His Orchestra Feat. Butch Stone\tThe Best Man\tCOLUMBIA\t37086\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60939.mp3\tBob Howard & His Orch\tThe Best Things Happen At Night\tDECCA\t839A\t60939\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20872-B.mp3\tGeorge Olsen And His Music\tThe Best Things In Life Are\tVictor\t20872-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC39379-2.mp3\tJack Smith\tThe Best Things In Life Are Free\tVICTOR\t21039\t39379-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec60276-A.mp3\tJimmie Lunceford And His Orchestra\tThe Best Things In Life Are Free\tDecca\t788\t60276-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_239.mp3\tJo Stafford\tThe Best Things In Life Are Free\tCapitol\t15017\t2428\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC39473-1.mp3\tGeorge Olsen And His Music\tThe Best Things In Life Are Free (vbb)\tVICTOR\t20872B\t39473-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60276-A.mp3\tJimmie Lunceford And His Orchestra\tThe Best Things In Life Are Free.mp3\tDecca\t788\t60276-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_379.mp3\tSonny Curtis\tThe Best Way To Hold A Girl\tCoral\t61023\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_161.mp3\tNick Noble\tThe Bible Tells Me So\tWing\t90003\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_057.mp3\tDon Cornell\tThe Bible Tells Me So\tCoral\t61467\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_295.mp3\tHod Williams And His Orchestra\tThe Big Apple\tBLUEBIRD\t7104\t011829-3\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_022.mp3\tTommy Dorsey And His Orchestra Feat. Tommy Dorsey And His Clambake Seven\tThe Big Apple\tVictor\t25652\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU07615.mp3\tWashboard Sam\tThe Big Boat\tBLUEBIRD\t6970\t07615\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62874.mp3\tAndy Kirk & Clouds Of Joy\tThe Big Dipper\tDECCA\t1606\t62874\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC018114.mp3\tTommy Dorsey & His Orch\tThe Big Dipper\tVICTOR\t25763\t018114\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_121.mp3\tLarry Clinton And His Orchestra Feat. Bea Wain\tThe Big Dipper\tVICTOR\t25697\t014691-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62874-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tThe Big Dipper\tDecca\t1606\t62874-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEWC3211.mp3\tGene Krupa & His Orch\tThe Big Do\tOKEH\t6034\tWC3211\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MERC276-5.mp3\tColeman Hawkins & Allstars\tThe Big Head\tMERCURY\t8909\tC276-5\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2456.mp3\tGracie Fields\tThe Biggest Aspidastra In The World\tDECCA\t18183B\tDLA2456\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/MER1800.mp3\tCharlie Parker Qt\tThe Bird\tMERCURY\t2081\t1800\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1902_034.mp3\tByron G. Harlan And Joe Belmont\tThe Birds\tCOLUMBIA\t\t927\t1902\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW142386.mp3\tLeo Reisman & His Orch\tThe Birth Of The Blues\tCOLUMBIA\t701 D\tW142386\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCCO3951-2.mp3\tBenny Goodman & His Orch\tThe Birth Of The Blues\tCOLUMBIA\t36359\tCCO3951-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2412.mp3\tBing Crosby-jack Teagarden\tThe Birth Of The Blues\tDECCA\t25408\tDLA2412\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCCO3951-1.mp3\tBenny Goodman & His Orch\tThe Birth Of The Blues\tCOLUMBIA\tPG33405\tCCO3951-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150247.mp3\tTom Darby & Jimmie Tarlton\tThe Black Sheep\tCOLUMBIA\t15674 D\tW150247\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_088.mp3\tHarry Lauder\tThe Blarney Stone\tVICTOR\t70018\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT492.mp3\tLouis Prima & His Orchestra\tThe Blizzard\tMAJESTIC\t7128\tT492\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_098.mp3\tAndrews Sisters\tThe Blond Sailor\tDECCA\t18700\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D151A.mp3\tToscanini And The Nbc Symphony Orchestra\tThe Blue Danube Pt. 1\tV-DISC\t151A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D151B.mp3\tToscanini And The Nbc Symphony Orchestra\tThe Blue Danube Pt. 2\tV-DISC\t151B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC83183-1.mp3\tIsham Jones And His Orchestra\tThe Blue Room\tVictor\t24701\t83183-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20082-B.mp3\tRevelers\tThe Blue Room\tVICTOR\t20082\t35666-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC021132.mp3\tBenny Goodman And His Orchestra\tThe Blue Room\tVICTOR\t26088\t021132\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1760-1.mp3\tBuster Bailey Sextet\tThe Blue Room\tVARSITY\t8333\tUS1760-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_035.mp3\tRevelers\tThe Blue Room\tVICTOR\t20082-B\t35666-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480631.mp3\tBennie Moten's Kansas City Orch.\tThe Blue Room\tVictor\t24381\t74848-1\t1932\tHot Lips Page, Joe Keyes, Dee Stewart (tp), Dan Minor, Eddie Durham (tb), Eddie Barefield (cl, as), Jack Washington (as, bar), Ben Webster (ts), Count Basie (p), Leroy Berry (g), Walter Page (sb), Willie McWashington (dm), Bennie Moten (ldr)\nhttp://www.jazz-on-line.com/a/mp3t/TS480718.mp3\tBenny Goodman And His Orchestra\tThe Blue Room\tColumbia\tSL160\t\t1938\tCarnegie Hall Concert?:<br>Harry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Hymie Schertzer, George Koenig (as), Arthur Rollini, Babe Russin (ts), Jess Stacy (p), Allen Reuss (g), Harry Goodman (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3h/COLCO34675.mp3\tVictor Borge, Piano\tThe Blue Serenade (hybrid Of Strauss' ''blue Danube'' And Schubert's ''serenade'')\tCOLUMBIA\t36912\tCO 34675\t1946\tOrchestra conducted by Paul Baron\nhttp://www.jazz-on-line.com/a/mp3c/MonUS1359-1.mp3\tJack Teagarden & His Orch\tThe Blues\tMontgomeryWard\t10012\tUS1359-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/HARB21462.mp3\tArtie Shaw And His New Music\tThe Blues - Part 1\tHARMONY\tHa1057\tB-21462-3\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/VOC21462-A.mp3\tArtie Shaw And His New Music\tThe Blues - Part 1\tVOCALION\t4401\tB-21462-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/HARB21463.mp3\tArtie Shaw And His New Music\tThe Blues - Part 2\tHARMONY\tHa1057\tB-21463-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU21463-2.mp3\tArtie Shaw And His New Music\tThe Blues - Part 2\tBRUNSWICK\t7947\tB-21463-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC91545.mp3\tGeorgia White\tThe Blues Ain't Nothin' But\tDECCA\t7562\tC91545\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKJ-50-1.mp3\tMezzrow - Bechet Quintet\tThe Blues And Freud - Part 1\tStoryville \tSLP136\tKJ-50-1  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKJ-51-1.mp3\tMezzrow - Bechet Quintet\tThe Blues And Freud - Part 2\tStoryville \tSLP136\tKJ-51-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM47S6022.mp3\tHank Williams\tThe Blues Come Around\tMGM\t30637\t47S6022\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU2747-1.mp3\tMarion Harris\tThe Blues Have Got Me\tBRUNSWICK\t2747\t-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2508.mp3\tJack Teagarden & His Orch\tThe Blues Have Got Me\tDECCA\t4409B\tDLA2508\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64748-A.mp3\tCount Basie And His Orch\tThe Blues I Like To Hear (vocal J. Rushing)\tDECCA\t2284B\t64748-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021627.mp3\tBenny Goodman Qt\tThe Blues In My Flat\tVICTOR\t26044\t021627\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC021626.mp3\tBenny Goodman Qt\tThe Blues In Your Flat\tVICTOR\t26044\t021626\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP3057.mp3\tBenny Goodman And His Orchestra\tThe Blues Jumped Up And Got Me\tCAPITOL\t\t3057\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU486-A2.mp3\tMeade Lux Lewis\tThe Blues Part 1\tBLUENOTE\t008\t486-A2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU487-A.mp3\tMeade Lux Lewis\tThe Blues Part 2\tBLUENOTE\t008\t487-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW401350.mp3\tDuke Ellington & His Orch\tThe Blues With A Feelin'\tCOLUMBIA\t35955\tW401350\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/Oke401350-D.mp3\tDuke Ellington And His Cotton Club Orchestra\tThe Blues With A Feelin'\tOkeh\t8662\t401350-D\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_190.mp3\tMitch Miller And His Orchestra\tThe Bonnie Blue Gal\tColumbia\t40575\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU062860.mp3\tWingy Manone & His Band\tThe Boogie Beat'll Getcha\tBLUEBIRD\t11298\t062860\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CONM893.mp3\tCab Calloway & His Orch\tThe Boogie Woogie\tCONQUEROR\t9091\tM893\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN871.mp3\tPaul Howard Ark Cotton Pickers\tThe Boogie's Fine Tonight\tKING\t871\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-893-1.mp3\tCab Calloway And His Orchestra\tThe Boogie-woogie\tVocalion\t4400\tM-893-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15133-A.mp3\tConnie Boswell\tThe Boulevard Of Broken Dreams\tBRUNSWICK\t6871\t15133-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_074.mp3\tJan Garber And His Orchestra\tThe Boulevard Of Broken Dreams\tVICTOR\t24498\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/CON14765-1.mp3\tEd Lloyd's Rhythm Boys\tThe Boulevard Of Broken Dreams (vh.ward)\tCONQUEROR\t8261\t14765-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh160.mp3\tLew Stone And His Band\tThe Bouncing Ball\tRegal Zonophone\tMR-1678\tCAR-3337-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/MUSGM504.mp3\tLeadbelly\tThe Bourgeois Blues\tMUSICRAFT\t227\tGM504\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3385.mp3\tJudy Garland - G.stoll\tThe Boy Next Door\tDECCA\t23362\tL3385\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu068400-1.mp3\tEarl Hines And His Orchestra\tThe Boy With The Wistful Eyes\tBluebird\tB-11394\t068400-1\t1941\tacc. George Dixon (tp,as) Gerald Valentine (tb) Robert Crowder (ts,arr), Nat Atkins, Mel Powell (arr) Tommy Enoch, Joe McLewis, George Hunt, Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ra\nhttp://www.jazz-on-line.com/a/mp3b/Blu068400-1.mp3\tEarl Hines And His Orchestra\tThe Boy With The Wistful Eyes (mg,ttv Vcl)\tBluebird\tB-11394\t068400-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUW152624.mp3\tAnson Weeks And His Music\tThe Breeze (that's Bringin' My Honey Back To Me)\tBRUNSWICK\t6946\tW152624\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_198.mp3\tHelene Dixon Feat. O/norman Leyden\tThe Breeze (that's Bringin' My Honey Back To Me)\tOKEH\t6964\tCO48993\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D217B1.mp3\tJimmy Dorsey And His Orchestra\tThe Breeze And I\tV-DISC\t217B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D217.mp3\tJimmy Dorsey Orch\tThe Breeze And I\tV-DISC\t217\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048910.mp3\tCharlie Barnet & His Orch\tThe Breeze And I\tBLUEBIRD\t10696\t048910\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDGGN43.mp3\tCaterina Valente\tThe Breeze And I\tDECCA\t29467\tDGGN43\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_010.mp3\tJimmy Dorsey And His Orchestra\tThe Breeze And I\tV-DISC\t217B1\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_130.mp3\tXavier Cugat And His Waldorf-astoria Orchestra\tThe Breeze And I\tVICTOR\t26641\t050882\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_166.mp3\tVic Damone Feat. O/david Carroll; V/the Jack Halloran Singers\tThe Breeze And I\tMERCURY\t70287\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_063.mp3\tCaterina Valente\tThe Breeze And I (andalucia)\tDecca\t29467\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67584.mp3\tJimmy Dorsey And His Orch.\tThe Breeze And I (vbe)\tDECCA\t3150B\t67584\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_425.mp3\tGeorgia Gibbs\tThe Bridge Of Sighs\tMERCURY\t70238\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC18598-1.mp3\tWingy Manone & His Orch\tThe Broken Record\tVOCALION\t3158\t18598-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MonE60295.mp3\tMound City Blue Blowers\tThe Broken Record\tMontgomeryWard\t5022\tE60295\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE32311-1.mp3\tGene Krupa And His Orch\tThe Caissons Go Rolling Along\tOKEH\t6582\t32311-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC39575-2.mp3\tPaul Whiteman And His Orchestra<br>vocal Bing Crosby\tThe Calinda\tVICTOR\t20882\t39575-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_126.mp3\tTommy Dorsey Orch V Frank Sinatra\tThe Call Of The Canyon\tVictor\t26678\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR140962-3.mp3\tUniversity Six\tThe Camel Walk\tHARMONY\t36-H\t140962-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145840.mp3\tGuy Lombardo Royal Canadians\tThe Cannon Ball\tCOLUMBIA\t1451 D\tW145840\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/HAR143448-3.mp3\tUniversity Six\tThe Cat\tHARMONY\t367-H\t143448-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_207.mp3\tEddy Arnold With Hugo Winterhalter's Chorus And Orchestra\tThe Cattle Call\tRCA Victor\t6129\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-17833.mp3\tTed Heath And His Music (his 89th London Palladium Sunday Concert, April 12, 1953)\tThe Champ\tDECCA-LONDON\tEFF.287-1 (BEP 6120)\tDR-17833\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU36241-3.mp3\tJelly Roll Morton's Jazzmen\tThe Chant\tBLUEBIRD\t10253\t36241-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36241-3.mp3\tJelly Roll Morton's Jazzmen\tThe Chant\tVICTOR\t20221B\t36241-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142903-2.mp3\tFletcher Henderson's Orch\tThe Chant\tCOLUMBIA\t817 D\tW142903-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVoc4539.mp3\tArtie Shaw And His New Music\tThe Chant\tVocalion\t4539\tB-21461-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21461-1.mp3\tArtie Shaw And His New Music\tThe Chant (st.james Infirmary)\tBRUNSWICK\t7952\tB-21461-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D145A3.mp3\tCarson Robison\tThe Charms Of The City Ain't Fer Me\tV-DISC\t145A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D145A.mp3\tCarson Robison\tThe Charms Of The City Ain't Fer Me\tv-disk\t145A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DiaD-1083-D.mp3\tDexter Gordon Tenor Sax Wardell Gray Tenor Sax\tThe Chase - Part 1\tDial\t1017\tD-1083-D\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DiaD-1084-D.mp3\tDexter Gordon Tenor Sax Wardell Gray Tenor Sax\tThe Chase - Part 2\tDial\t1017\tD-1084-D\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU035399.mp3\tGlenn Miller And His Orch\tThe Chestnut Tree (vmh)\tBLUEBIRD\t10201\t035399\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402506.mp3\tFrank Hutchinson\tThe Chevrolet Six\tOKeh\t45378\t402506\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71127.mp3\tLouis Jordan & His Tympani 5\tThe Chicks I Pick Are Slender And Tender\tDECCA\t8645B\t71127\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_399.mp3\tBuddy Hackett\tThe Chinese Waiter\tCoral\t61150\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24511-A.mp3\tGuy Lombardo And His Royal Canadi\tThe Chocolate Choo-choo\tDecca\t24511-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP981.mp3\tKing Cole Trio\tThe Christmas Song\tCAPITOL\t\t981\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_417.mp3\tKing Cole Trio\tThe Christmas Song\tCapitol\t311\t981\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_158.mp3\tLes Brown And His Orchestra Feat. Doris Day\tThe Christmas Song\tCOLUMBIA\t37174\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_336.mp3\tWillows\tThe Church Bells May Ring\tMelba\t102\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLSA2598.mp3\tChuck Wagon Gang\tThe Church In The Wildwood\tCOLUMBIA\t20501\tSA2598\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38671.mp3\tDuke Ellington& His Orch.\tThe Clothed Woman\tCOLUMBIA\t38236\tCO38671\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-892-1.mp3\tCab Calloway And His Orchestra\tThe Congo-conga\tVocalion\t4411\tM-892-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUB15756-C.mp3\tLeo Reisman And His Orchestra\tThe Continental\tBRUNSWICK\t6973\tB15756-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COL15890-2.mp3\tLud Gluskin & His Orch\tThe Continental\tCOLUMBIA\t2952 D\t15890-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76081.mp3\tArtie Shaw And His Orchestra\tThe Continental\tDECCA\t27056\t76081\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77243.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tThe Continental\tUltraphone\tAP-1443\tP-77243\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478379.mp3\tLes Brown And His Band Of Renown\tThe Continental\tCAPITOL\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_017.mp3\tLeo Reisman And His Orchestra\tThe Continental (you Kiss While You're Dancing)\tBrunswick\t6973\tB15756-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_022.mp3\tJolly Coburn And His Orchestra Feat. Harold Van Emburgh And Roy Strom\tThe Continental (you Kiss While You're Dancing)\tVICTOR\t24735\t84400-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_075.mp3\tLud Gluskin And His Orchestra\tThe Continental (you Kiss While You're Dancing)\tCOLUMBIA\t2952 D\t15890-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLDAL618.mp3\tBob Wills Texas Playboys\tThe Convict And The Rose\tCOLUMBIA\t20035\tDAL618\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol20035.mp3\tBob Will's Texas Playboys\tThe Convict And The Rose\tColumbia\t20035\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19770.mp3\tVernon Dalhart\tThe Convict And The Rose\tVictor\t19770\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_098.mp3\tVernon Dalhart\tThe Convict And The Rose\tVictor\t19770\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89021TCR.mp3\tIllinois Jacquet\tThe Cool Rage\tMERCURY\t89021\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68317-A.mp3\tAndy Kirk & Clouds Of Joy\tThe Count\tDECCA\t18123B\t68317-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU62916-1.mp3\tBennie Moten Kansas City Orch\tThe Count\tBLUEBIRD\t6719\t62916-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec68317-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tThe Count\tDecca\t18123\t68317-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CON30603-1.mp3\tGene Krupa & His Orch\tThe Cowboy Serenade (v H. Dulany)\tCONQUEROR\t9896\t30603-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/ZON23191C.mp3\tJimmie Rodgers\tThe Cowhand's Last Ride\tZONOPHONE\t23191C\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COMR2562.mp3\tJelly Roll Morton (piano)\tThe Crave\tCOMMODORE\t589\tR2562\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_015.mp3\tJohnny Maddox And The Rhythmasters\tThe Crazy Otto\tDot\t15325\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3h/VocE-4323.mp3\tDuke Ellington And His Kentucky Club Orchestra\tThe Creeper\tVocalion\t1077\tE-4323\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_159.mp3\tTennessee Ernie Ford\tThe Cry Of The Wild Goose\tCapitol\t40280\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO11x.mp3\tTurk Murphy's Jazz Band\tThe Curse Of An Aching Hear\tGood Time Jazz\t11\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic102404-1.mp3\t\"fats\" Waller And His Rhythm\tThe Curse Of An Aching Heart\tVictor\t25394\t102404-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2086.mp3\tAnna Chandler\tThe Dance Of The Nations' Ragtime Ball\tColumbia\tA2086\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_314.mp3\tPhil Harris\tThe Dark Town Poker Club\tRCA Victor\t2471\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143708-2.mp3\tTed Lewis & His Band\tThe Darktown Strutter's Ball\tCOLUMBIA\t1084 D\tW143708-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480910.mp3\tRay Anthony And His Orchestra\tThe Darktown Strutters' Ball\tCAPITOL\t979\t3738-1D-2\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_029.mp3\tLewis James\tThe Daughter Of Rosie O'grady\tColumbia\t2561\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3308.mp3\tBing Crosby\tThe Day After Forever\tDECCA\t18580\tL3308\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98390.mp3\tTommy Dorsey & His Clambake 7\tThe Day I Let You Get Away\tVICTOR\t25220\t98390\t1935\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC60433-A.mp3\tIsham Jones And His Orchestra\tThe Day I Let You Get Away - Vocal Woody Herman\tDecca\t713\t60433-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5685b.mp3\tFrankie Laine\tThe Day Isn't Long Enough\tMERCURY\t5685\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037699.mp3\tGlenn Miller And His Orchestra\tThe Day We Meet Again (vre)\tBLUEBIRD\t10344\t037699\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW265143.mp3\tColeman Hawkins\tThe Day You Came Along\tCOLUMBIA\t-R\tW265143\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/CONLA2-A.mp3\tBing Crosby\tThe Day You Came Along\tCONQUEROR\t8368\tLA2-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/CONLA2-A.mp3\tBing Crosby\tThe Day You Came Along\tTest\t\tLA2-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVSLA502-1.mp3\tBig Jay Mcneeley Bluejays\tThe Deacon's Hop\tSAVOY\t685A\tSLA502-1\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe402508.mp3\tFrank Hutchinson\tThe Deal\tOKeh\t45570\t402508\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_021.mp3\tVernon Dalhart\tThe Death Of Floyd Collins\tVICTOR\t19779\t33374-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_1100_02.mp3\tLee Morse\tThe Deep Wide Ocean Blues\tPathe\t25168B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/PER15167.mp3\tSam Lanin And His Orch\tThe Desert Song\tPerfect\t15167\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_241.mp3\tNat Shilkret And The Victor Orchestra\tThe Desert Song\tVICTOR\t20512\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4858.mp3\tBob Wills Texas Playboys\tThe Devil Ain't Lazy\tCOLUMBIA\t20458\tCCO4858\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh182.mp3\tLondon Radio Dance Band Dir. By Sid Firman\tThe Devil Is Afraid Of Music\tColumbia\t4669\tWA-6458-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC028951.mp3\tLarry Clinton & His Orchestra\tThe Devil With The Devil\tVICTOR\t26108\t028951\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_256.mp3\tLarry Clinton And His Orchestra Feat. Ford Leary\tThe Devil With The Devil\tVICTOR\t26108\t028951\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK8263-X1.mp3\tHot Lips Page\tThe Devil's Kiss\tKING\t15198\tK8263-X1\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_162.mp3\tLarry Clinton And His Orchestra Feat. V/helen Lee And Dipsy Doodlers\tThe Dickey-bird Song\tDECCA\t24301\t74201\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/Vic49767-2.mp3\tDuke Ellington And His Cotton Club Orchestra\tThe Dicty Glide\tVictor\tV-38053\t49767-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic40095-2.mp3\tThomas Waller With Morris's Not Babies\tThe Digah's Stomp\tVictor\t21358\t40095-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC014684-1.mp3\tTommy Dorsey And His Orch V Edythe Wright\tThe Dipsy Doodle\tVICTOR\t25693A\t014684-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25693.mp3\tTommy Dorsey & His Orchestra\tThe Dipsy Doodle\tVictor\t25693\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_003.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tThe Dipsy Doodle\tVICTOR\t25693A\t014684-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_158.mp3\tTommy Dorsey And His Orchestra\tThe Dipsy Doodle\tVICTOR\t25693A\t014684-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68152-A.mp3\tSam Price's Texas Blusicians\tThe Dirty Dozens\tDECCA\t7811A\t68152-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64732-A.mp3\tCount Basie And His Rhythm\tThe Dirty Dozens\tDECCA\t2498A\t64732-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39563.mp3\tBob Crosby And His Orchestra\tThe Dixieland Band\tDECCA\t479A\t39563\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_133.mp3\tBenny Goodman And His Orchestra Feat. Helen Ward\tThe Dixieland Band\tCOLUMBIA\t3033\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_167.mp3\tBenny Goodman And His Orchestra Feat. Helen Ward\tThe Dixieland Band\tVICTOR\t25009\t89519\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38134.mp3\tNat Shilkret & Victor Orch\tThe Doll Dance\tVICTOR\t20503A\t38134\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_066.mp3\tNat Shilkret And The Victor Orchestra\tThe Doll Dance\tVICTOR\t20503A\t38134\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_148.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra\tThe Doll Dance\tCOLUMBIA\t934\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/TTL101x.mp3\tAnonymous\tThe Doll's Tea Party\tttle John Records\t101\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031824.mp3\tArtie Shaw And His Orchestra\tThe Donkey Serenade\tBLUEBIRD\t10125\t031824-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_108b.mp3\tDon Cornell\tThe Door Is Still Open To My Heart\tCoral\t61393\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC551TD.mp3\tJames P Johnson\tThe Dream\tASCH\t551\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480523.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tThe Drum Thunder (miniature) Suite\tBlue Note\tBLP 4003\t\t1958\tArt Blakey, D, Benny Golson, Ts, Lee MOrgan, T, Bobbie Timmons, P, Jymie Merritt, B\nhttp://www.jazz-on-line.com/a/mp3w/1934_082.mp3\tRudy Vallee And His Connecticut Yankees\tThe Drunkard Song (there Is A Tavern In The Town)\tVICTOR\t24721\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480784.mp3\tJay Mcshann & His Orch.\tThe Duke And The Brute\tMercury\t8283\t4619-2\t1951\tOrville Minor (tp), Clifford Jenkins (as, ts), Ben Webster, Fats Dennis (ts), Jay McShann (p), Gene Griddins (g), Lloyd Anderson (sb), Cooky Jackson (dm)\nhttp://www.jazz-on-line.com/a/mp3a/BLU068402.mp3\tEarl Hines And His Orch\tThe Earl\tBLUEBIRD\t11432\t068402\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu068402-1.mp3\tEarl Hines And His Orchestra\tThe Earl\tBluebird\tB-11432\t068402-1\t1941\tacc. George Dixon (tp,as) Gerald Valentine (tb) Robert Crowder (ts,arr), Nat Atkins, Mel Powell (arr) Tommy Enoch, Joe McLewis, George Hunt, Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ra\nhttp://www.jazz-on-line.com/a/mp3b/Blu068402-1.mp3\tEarl Hines And His Orchestra\tThe Earl (mp Arr)\tBluebird\tB-11432\t068402-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038294-1.mp3\tBud Freeman Summa Cum Laude Or\tThe Eel\tBLUEBIRD\t10386\t038294-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/SIG413.mp3\tLarry Douglas W Ray Bloch 7\tThe Egg And I  (from The Egg And I)\tSIGNATURE\t15107B\t413\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL30159TE.mp3\tHot Lips Page Orch\tThe Egg Or The Hen\tCOLUMBIA\t30159\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO45830.mp3\tDuke Ellington\tThe Eighth Veil\tCOLUMBIA\t39496\tCO45830-1\t1951\tCat Anderson, Nelson Williams, Harold \"Shorty\" Baker, Fats Ford (tp) Ray Nance (tp,vln,vcl) Quentin Jackson, Britt Woodman, Juan Tizol (tb) Jimmy Hamilton (cl,ts) Russell Procope (as,cl) Willie Smith (as) Paul Gonsalves (ts) Harry Carney (bar,cl,b-cl) Duke Ellington (p) Wendell Marshall (b) Louie Bellson (d)\nhttp://www.jazz-on-line.com/a/mp3a/CAP2699.mp3\tBobby Sherwood And His Orchestra\tThe Elk's Parade\tCAPITOL\t107\t2699\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67734.mp3\tWoody Herman & His Orchestra\tThe End Of The Rainbow\tDECCA\t3231B\t67734\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480911.mp3\tConway's Band; Patrick Conway, Cond.\tThe Evolution Of Dixie\tVICTOR\t35600-A\tC-18122\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_279.mp3\tBenny Goodman And His Orchestra Feat. V/helen Forrest\tThe Fable Of The Rose\tColumbia\t35391\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC048129.mp3\tTommy Dorsey And His Orch\tThe Fable Of The Rose (vfs)\tVICTOR\t26555\t048129\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_293.mp3\tTed Heath And His Music\tThe Faithful Hussar\tLondon\t1675\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047639.mp3\tByron Parker Mountaineers\tThe Family Circle\tBLUEBIRD\t8476\t047639\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU8476.mp3\tByron Parker Mountaineers\tThe Family Circle\tBLUEBIRD\t8476\t047639\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU070335.mp3\tEarl Hines & His Orch\tThe Father Jumps\tBLUEBIRD\t11535\t070335\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu070335-1.mp3\tEarl Hines And His Orchestra\tThe Father Jumps\tBluebird\tB-11535\t070335-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu070335-1.mp3\tEarl Hines And His Orchestra\tThe Father Jumps\tBluebird\tB-11535\t070335-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Nat Atkins (tb) Joe McLewis, George Hunt, Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck Parham (b) Rudolph\nhttp://www.jazz-on-line.com/a/mp3c/BLU005TFG.mp3\tEarl Hines\tThe Father's Getaway\tBLUENOTE\tBN005\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VocWM-1070-A.mp3\tBenny Carter And His Orchestra\tThe Favor Of A Fool\tVocalion\t5294\tWM-1070-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC89093.mp3\tAlma Gluck And E.zimbalist\tThe Fiddle And I\tVICTOR\t89093\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_045.mp3\tAlma Gluck\tThe Fiddle And I\tVICTOR\t88539\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3d/CenEG-182-A.mp3\tErroll Garner\tThe Fighting Cocks\tCentury\t1503\tEG-182-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_105.mp3\tPhiladelphia Orchestra (leopold Stokowski, Conductor)\tThe Fire Bird, Parts 1 & 2\tVictor\t6492\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480488.mp3\tArt Blakey And Benny Golson: Jazz Messengers\tThe First Theme\tRCA\t430043\t\t1958\tArt Blakey, D, Benny Golson, Ts, Lee Morgan, T,: Jymie Merritt, B, Bobby Timmons, P\nhttp://www.jazz-on-line.com/a/mp3c/VIC010163.mp3\tBunny Berigan & His Orch\tThe First Time I Saw You\tVICTOR\t25593A\t010163\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_124.mp3\tBunny Berigan And His Orchestra Feat. Ford Leary\tThe First Time I Saw You\tVICTOR\t25593A\t010163\t1937\t\nhttp://www.jazz-on-line.com/a/mp3/Joh155.mp3\tJay Wilber And His Band\tThe First Time I Saw You\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62345-A.mp3\tJimmie Lunceford And His Orchestra\tThe First Time I Saw You\tDecca\t1364\t62345-A\t1937\tJimmie Lunceford dir. Eddie Tompkins-Paul Webster/Sy Oliver-t-v-a/Elmer Crumbley- Russell Bowles-tb/Eddie Durharn tb-g-a/Willie Smith-cI-as-bar-v-a/Ed Brown as/Dan  Grissom-cl-as-v/Earl Carruthers-cl-as-bar/Joe Thomas-cl-ts/Edwin Wilc ox -p-cel-a/Al \nhttp://www.jazz-on-line.com/a/mp3b/Joh155.mp3\tJay Wilbur And His Band\tThe First Time I Saw You (v Sam Costa)\tRex\t9164\tR-2483-1-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VocWM-1131-A.mp3\tThe Quintones\tThe Five Little Quints\tVocalion\t5409\tWM-1131-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1131-A.mp3\tBenny Carter\tThe Five Little Quints\tVocalion\t5409\tWM-1131-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL284.mp3\tHi-flyers\tThe Five Piece Band\tVOCALION\t3964\tDAL284\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17402B.mp3\tAtilla The Hun\tThe Five Year Plan\tDECCA\t17402B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64734-A.mp3\tCount Basie And His Rhythm\tThe Fives\tDECCA\t2722B\t64734-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_122.mp3\tBenny Goodman And His Orchestra Feat. The Band\tThe Flat Foot Floogee\tVictor\t25871\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDR-2878-1.mp3\tDjango Reinhardt\tThe Flat Foot Floogie\tDECCA\tF-6776\tDR-2878-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC55509-4.mp3\tCoon Sanders Orchestra\tThe Flippety Flop\tVICTOR\t22089\t55509-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS21937.mp3\tMaxine Sullivan & Her Orch\tThe Folks Who Live On The Hill\tCBS\tVO3885\t21937\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21937-1.mp3\tMaxine Sullivan (orchestra Under Direction Claude Thornhill)\tThe Folks Who Live On The Hill\tVocalion\t3885\t21937-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA940-B.mp3\tJohn Scott Trotter And His Orchestra\tThe Folks Who Live On The Hill\tDecca\t\tDLA940-B  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA940-A.mp3\tJohn Scott Trotter And His Orchestra\tThe Folks Who Live On The Hill\tDecca\t\tDLA940-A  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_051.mp3\tSanford Clark\tThe Fool\tDot\t15481\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_337.mp3\tGallahads\tThe Fool\tJubilee\t5252\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_173.mp3\tGuy Lombardo And His Royal Canadians\tThe Four Winds And The Seven Seas\tDecca\t24648\t74829\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_146.mp3\tVic Damone Feat. Glenn Osser's Orchestra\tThe Four Winds And The Seven Seas\tMERCURY\t5271\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150078-3.mp3\tColumbia Photoplayers (selvin)\tThe Free And Easy\tCOLUMBIA\t2149 D\tW150078-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COL490051.mp3\tEd Lloyd & Ho (ben Selvin)\tThe Free And Easy\tCOLUMBIA\tOD36060\t490051\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23496TFF.mp3\tElla Fitzgerald\tThe Frim Fram Sauce\tDECCA\t23496\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_244.mp3\tKing Cole Trio\tThe Frim Fram Sauce\tCAPITOL\t224\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1549.mp3\tBing Crosby - J S Trotter\tThe Funny Old Hills\tDECCA\t2201B\tDLA1549\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18433.mp3\tBilly Murray\tThe Further It Is From Tipperary\tVictor\t18433\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU033901.mp3\tCharlie Barnet & His Orch\tThe Gal From Joe's\tBLUEBIRD\t10153\t033901\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_365.mp3\tDuke Ellington And His Famous Orchestra\tThe Gal From Joe's\tBRUNSWICK\t8108\tM-753-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_180.mp3\tFrank Sinatra\tThe Gal That Got Away\tCapitol\t2864\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_478.mp3\tFour Aces Featuring Al Alberts\tThe Gal With The Yaller Shoes\tDecca\t29809\t88549\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/MUSGM509A.mp3\tLeadbelly\tThe Gallis Pole\tMUSICRAFT\t227\tGM509A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP24-A.mp3\tPaul Whiteman & His Orch\tThe General Jumped At Dawn\tCAPITOL\t\t24-A\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_209.mp3\tJo Stafford\tThe Gentleman Is A Dope\tCapitol\t15007\t2286\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39962.mp3\tDorsey Brothers Orch.\tThe Gentleman Obviously Doesn't Believe\tDECCA\t561A\t39962\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_243.mp3\tDorsey Brothers Orchestra Feat. V/kay Weber\tThe Gentlemen Obviously Doesn't Believe (in Love)\tDECCA\t561A\t39962\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S6009.mp3\tLouvin Brothers\tThe Get Acquainted Waltz (v)\tMGM\t11221B\t51S6009\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480641.mp3\tBob Howard & His Orch.\tThe Ghost Of Dinah\tDecca\t400\t39387-A\t1935\tBob Howard (vo), Benny Carter (tp, as), Ben Webster (ts), Teddy Wilson (p), Clarence Holiday (g), Elmer James (sb), Cozy Cole (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DEC39387.mp3\tBob Howard & His Orchestra\tThe Ghost Of Dinah (v B H)\tDECCA\t400A\t39387\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_218.mp3\tCab Calloway And His Orchestra\tThe Ghost Of Smokey Joe\tVOCALION\t4807\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1011-1.mp3\tCab Calloway And His Orchestra\tThe Ghost Of Smokey Joe\tVocalion\t4807\tWM-1011-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20124-A.mp3\tFrank Crumit\tThe Girl Friend\tVICTOR\t20124\t35948-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC35336-4.mp3\tGeorge Olsen & His Music\tThe Girl Friend (vff-lm-bb)\tVICTOR\t20029A\t35336-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D318B2.mp3\tKay Kyser And His Orchestra (sully Mason Voc.)\tThe Girl I Left Behind Me\tV-DISC\t318B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92920-1.mp3\tFats Waller And His Rhythm\tThe Girl I Left Behind Me\tVICTOR\t25116\t92920-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140786.mp3\tCharlie Poole N.c.ramblers\tThe Girl I Left In Sunny Tennessee\tCOLUMBIA\t15043 D\t140786\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC55581-1.mp3\tSleepy John Estes\tThe Girl I Love Got Long Curly Hair\tVICTOR\t38549\t55581-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_263.mp3\tCliques\tThe Girl In My Dreams\tModern\t987\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC053782.mp3\tDuke Ellington & His Orch\tThe Girl In My Dreams Tries To Look Like You\tVICTOR\t27326\t053782\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC74795-1.mp3\tGeorge Olsen & His Music\tThe Girl In The Little Green Hat (v F F)\tVICTOR\t24220A\t74795-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480571.mp3\tAhmad Jamal Trio\tThe Girl Next Door\tArgo\tLP636\t9030\t1958\tAhmad Jamal, P, Israel Crosby, B, Vernell Fournier, D\nhttp://www.jazz-on-line.com/a/mp3c/MAJCT919-5.mp3\tEddy Howard & His Orchestra\tThe Girl That I Marry\tMAJESTIC\t1083A\tCT919-5\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_196.mp3\tEddy Howard And His Orchestra\tThe Girl That I Marry\tMAJESTIC\t1083A\tCT919-5\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3756.mp3\tKid Ory's Dixieland Band\tThe Girls Go Crazy About The Way I Walk\tDECCA\t25133\tL3756\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5419-2.mp3\tArtie Shaw And His Orchestra\tThe Glider\tMUSICRAFT\t378\t5419-2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLRC1643-B.mp3\tFive Keys\tThe Glory Of Love\tALLADDIN\t3099\tRC1643-B\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC19457.mp3\tCotton Billy\tThe Glory Of Love\tARC\t\t19457\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU99975.mp3\tWillie Bryant & His Orch\tThe Glory Of Love\tBLUEBIRD\t6374\t99975\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC62080-A.mp3\tCount Basie And His Orch\tThe Glory Of Love\tDECCA\t3708\t62080-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_003.mp3\tBenny Goodman And His Orchestra\tThe Glory Of Love\tVICTOR\t25316\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/RCA20-1893-A.mp3\tSpike Jones And His City Slickers; Red Ingle And Aileen Carlisle, Vocals\tThe Glow Worm\tRCA VICTOR\t20-1893-A\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480912.mp3\tVictor Concert Orchestra; Rosario Bourdon, Cond.\tThe Glow Worm\tVICTOR\t35922-B\t23776\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_007.mp3\tLucy Isabelle Marsh\tThe Glow-worm\tColumbia\t3791\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152720.mp3\tBenny Morton & His Orch\tThe Gold Digger's Song\tCOLUMBIA\t2924\tW152720\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC579.mp3\tHal Kemp & His Orch\tThe Gold Digger's Song\tBRUNSWICK\t6582\tC579\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152393-3.mp3\tTed Lewis And His Orch\tThe Gold Diggers' Song\tCOLUMBIA\t2775 D\tW152393-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW152720-1.mp3\tBenny Morton And His Orchestra\tThe Gold Diggers' Song\tCOLUMBIA\t2924 D\tW152720-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17327A.mp3\tThe Tiger\tThe Gold In Africa\tDECCA\t17327A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh026.mp3\tJack Hyltons And His Orchestra\tThe Gold-diggers Song (were In The Money)\tDecca\tF-3672\tGB-6061-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43263.mp3\tCount Basie & His Orchestra\tThe Golden Bullet\tCOLUMBIA\t38888\tCO43263\t1950\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478381.mp3\tFrankie Carle And His Orchestra\tThe Golden Touch (samba)\tRCA VICTOR\t\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68328.mp3\tWoody Herman & His Orchestra\tThe Golden Wedding\tDECCA\t3436B\t68328\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_275.mp3\tWoody Herman And His Orchestra\tThe Golden Wedding\tDECCA\t3436B\t68328\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03898.mp3\tTommy Dorsey & His Orch\tThe Gonna Goo\tVICTOR\t25508\t03898\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU20560-2.mp3\tBunny Berigan's Boys\tThe Gonna Goo\tBRUNSWICK\t7832\t20560-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_470.mp3\tKay Starr\tThe Good Book\tRCA\t6617\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68920-A.mp3\tSam Price & Texas Blusicians\tThe Good Drag\tDECCA\t8547\t68920-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_005.mp3\tByron G. Harlan\tThe Good Old U.s.a.\tCOLUMBIA\t3463\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_021.mp3\tNora Bayes\tThe Good Ship Mary Ann\tVICTOR\t60113\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61403.mp3\tWoody Herman & His Orch\tThe Goose Hangs High\tDECCA\t1056\t61403\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_090.mp3\tVernon Dalhart\tThe Governor's Pardon\tOKeh\t40608\t74134-B\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17363B.mp3\tAtilla The Hun\tThe Governor's Resignation\tDECCA\t17363B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAD5VB32.mp3\tArtie Shaw And His Gramercy Five\tThe Grabtown Grapple - Stomp\tRCA\t20-1647A\tD5VB32\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_001.mp3\tBilly Murray\tThe Grand Old Rag\tMONARCH\tV-4634\tB3086-3\t1906\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145468.mp3\tPaul Specht's Georgians\tThe Grass Grows Greener\tCOLUMBIA\t1273 D\tW145468\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5562-1-2.mp3\tFletcher Henderson Dance Orch\tThe Grass Is Always Greener\tBANNER\t1388\t5562-1-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN13193-1.mp3\tArt Kahn Orch (v.young)\tThe Grass Is Gettin' Greener All The Time (vcb)\tBANNER\t32731\t13193-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MERYB12071.mp3\tThe Platters\tThe Great Pretender\tMERCURY\t70753\tYB12071\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83244.mp3\tElla Fitzgerald\tThe Greatest There Is\tDECCA\t28930\t83244\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_013.mp3\tJim Lowe\tThe Green Door\tDot\t15486\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC93821.mp3\tLouis Jordan & His Tympani 5\tThe Green Grass Grows All Around\tDECCA\t8605\tC93821\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_118.mp3\tReginald Foresythe And His Orchestra\tThe Greener The Grass\tColumbia\t3060\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_039.mp3\tAmerican Quartet\tThe Grizzly Bear\tVictor\t16681\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN11767-1.mp3\tBaron Lee & Blue Rhythm Band\tThe Growl\tBANNER\t32465\t11767-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban11767-1.mp3\tMills Blue Rhythm Band\tThe Growl\tBanner\t32465\t11767-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu80279-1.mp3\tMills Blue Rhythm Band\tThe Growl\tBluebird\tB-5628\t80279-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1715.mp3\tDinah Shore\tThe Gypsy\tCOLUMBIA\t36964\tHCO1715\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC73387.mp3\tInk Spots\tThe Gypsy\tDECCA\t18817A\t73387\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC85422.mp3\tLouis Armstrong & Commanders\tThe Gypsy\tDECCA\t28995\t85422\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_005.mp3\tDinah Shore\tThe Gypsy\tCOLUMBIA\t36964\tHCO1715\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_001.mp3\tInk Spots\tThe Gypsy\tDECCA\t18817A\t73387\t1946\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA1913t.mp3\tHarry Mcclaskey\tThe Gypsy's Warning\tColumbia\tA1913\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_212.mp3\tEddie Fisher\tThe Hand Of Fate\tRCA Victor\t4830\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU014298HW2-6.mp3\tBoots And His Buddies\tThe Happy\tBLUEBIRD\t7245\t014298\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_332.mp3\tTommy Leonetti\tThe Happy Wanderer\tCapitol\t2788\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_043.mp3\tDon Robertson\tThe Happy Whistler\tCapitol\t3391\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol2.mp3\tBaritone Solo\tThe Heart Bowed Down\tColumbia\t2\t\t1901\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19134-1.mp3\tRamona & Piano\tThe Heart Is Quicker Than The Eye\tARC\tLMS194\t19134-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic042943-1.mp3\tLionel Hampton And His Orchestra\tThe Heebie Jeebies Are Rockin'\tVictor\t26423\t042943-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Col142902-2.mp3\tFletcher Henderson And His Orchestra\tThe Henderson Stomp\tColumbia\t817-D\t142902-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_061.mp3\tGeorge Stehl, Marshall Lufsky And Paul Surth\tThe Herd Girl's Dream\tColumbia\t587\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL7722.mp3\tVictor Young And Singing Strings\tThe High And The Mighty\tDECCA\t29203\tL7722\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_061.mp3\tLeroy Holmes And His Orchestra\tThe High And The Mighty\tMGM\t11761\t54S208\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_028.mp3\tLes Baxter And His Orchestra\tThe High And The Mighty\tCapitol\t2845\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_118.mp3\tJohnny Desmond\tThe High And The Mighty\tCoral\t61204\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480913.mp3\tPerez Prado And His Orchestra\tThe High And The Mighty (theme From The Warner Bros Picture)\tRCA VICTOR\t\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142659-2.mp3\tCharlie Poole N.c.ramblers\tThe Highway Man\tCOLUMBIA\t15160 D\tW142659-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA358.mp3\tSons Of The Pioneers\tThe Hills Of Old Wyoming\tDECCA\t5222\tDLA358\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_068.mp3\tRed Buttons Feat. Elliot Lawrence And His Orchestra\tThe Ho Ho Song\t\t\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S3321.mp3\tSlim Gaillard Trio\tThe Hogan Song\tMGM\t10164\t47S3321\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1900_019.mp3\tHarry Macdonough\tThe Holy City\tVICTOR\t16408\tB3702-3\t1900\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_107.mp3\tHaydn Quartet\tThe Holy City\tVictor\t4256\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DCO35420.mp3\tCab Calloway & His Orch\tThe Honey Dripper\tV-DISC\t600\tCO35420\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3908.mp3\tJimmie Lunceford And His Orch\tThe Honeydripper\tDECCA\t23451\tL3908\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DOT1031x.mp3\tJoe Liggins\tThe Honeydripper\tDOT\t1031\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_188.mp3\tJoe Liggins\tThe Honeydripper\tDOT\t1031\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-3909.mp3\tJimmie Lunceford And His Orchestra And Delta Rhythm Boys\tThe Honeydripper\tDecca\t23451\tL-3909\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_111.mp3\tTennessee Ernie Ford And Betty Hutton Feat. Billy May's Orchestra\tThe Honeymoon's Over\tCapitol\t2809\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480745.mp3\tBen Webster Quintet\tThe Horn\tCircle\tCLP42\tN1636-1\t1944\tHot Lips Page (tp), Ben Webster (ts), Clyde Hart (p), Charlie Drayton (sb), Denzil Best (dm)\nhttp://www.jazz-on-line.com/a/mp3a/MUS5420.mp3\tArtie Shaw And His New Music\tThe Hornet\tMUSICRAFT\t409\t5420\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15373x.mp3\tPaul Weston\tThe Hot Canary\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLWCO26789.mp3\tMaxine Sullivan W J.kirby\tThe Hour Of Parting\tCOLUMBIA\t36341\tWCO26789\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26740.mp3\tBenny Goodman And His Orchestra\tThe Hour Of Parting\tCOLUMBIA\t35527\t26740\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCHS28.mp3\tOriginal Yellow Jackets\tThe Hour Of Parting\tVOCALION\t3504\tHS28\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_140.mp3\tBenny Goodman And His Orchestra\tThe Hour Of Parting\tCOLUMBIA\t35527\t26740\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150210.mp3\tClarence Ashley\tThe House Carpenter\tCOLUMBIA\t15654 D\tW150210\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1519.mp3\tFrank Sinatra\tThe House I Live In\tCOLUMBIA\t36886\tHCO1519\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_274.mp3\tFrank Sinatra\tThe House I Live In\tCOLUMBIA\t36886\tHCO1519\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC81988-2.mp3\tRamona's Park Avenue Boys\tThe House Is Haunted\tVICTOR\t24597\t81988-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_198.mp3\tGlen Gray And Casa Loma Orchestra\tThe House Is Haunted (by The Echo Of Your Last Goobye)\tBRUNSWICK\t6858\t15011\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP251x.mp3\tElla Mae Morse-freddy Slack\tThe House Of Blue Lights\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_069.mp3\tChuck Miller\tThe House Of Blue Lights\tMercury\t70627\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3d/BanE-36926-A.mp3\tConnie's Inn Orchestra\tThe House Of David Blues\tBanner\t32733\tE-36926-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA441-A.mp3\tBing Crosby & Jimmy Dorsey Or.\tThe House That Jack Built\tDECCA\t905B\tDLA441-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/HARCO40904.mp3\tPearl Bailey & Hot Lips Page\tThe Huckle Buck\tHARMONY\tHa1049\tCO40904\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS23011.mp3\tJay Mcneeley Hucklebusters\tThe Huckle-buck\tSAVOY\t683A\tS23011\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3427x.mp3\tTommy Dorsey Orch\tThe Hucklebuck\tRCA\t20-3427\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74897.mp3\tLionel Hampton & His Orch\tThe Hucklebuck\tDECCA\t24652\t74897\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec74897.mp3\tLionel Hampton And His Orchestra\tThe Hucklebuck\tDecca\t24652\t74897\t1949\tEd Mullen-Wendell Culley-Leo Shepherd-Walter Wiliams-t, Lester Bass-Al Grey-Chippie Outcalt-Jimmy Wormick-tb, Johnny Board-Bobby Plater-as, Gene Morris-Johnny Sparrow-Billy Williams-ts, Ben Kynard-bar, Frances Gaddison-p, Lionel Hampton-vib-p-v, Wes \nhttp://www.jazz-on-line.com/a/mp3w/1949_052.mp3\tTommy Dorsey And His Orchestra Feat. Charlie Shavers\tThe Hucklebuck\tVICTOR\t3427\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30301-1.mp3\tHorace Heidt And Musical Knights\tThe Hut Sut Song\tCOLUMBIA\t36138\tCO30301-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU11154X.mp3\tFour King Sisters\tThe Hut Sut Song\tBLUEBIRD\t11154\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MER364-2.mp3\tBuddy Rich & His Orchestra\tThe Iggidy Song\tMERCURY\t3025\t364-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC010165.mp3\tBunny Berigan & His Orch\tThe Image Of You\tVICTOR\t25587A\t010165\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VarM-546-1.mp3\tLucky Millinder With Mills Blue Rhythm Band\tThe Image Of You\tVariety\t604\tM-546-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480593.mp3\tArt Farmer And Gigi Gryce\tThe Infant's Song\tPrestige\tPRLP209\t743\t1954\tArt Farmer, T, FLh, Gigi Gryce, As, With, 2 rhythm sections, = Horace Silver or Freddie Redd, P, Addison Farmer or Percy Heath, B, Art Taylor or Kenny Clark, D\nhttp://www.jazz-on-line.com/a/mp3w/1914_022.mp3\tArthur Collins And Byron Harlan\tThe International Rag\tVICTOR\t17431\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_191.mp3\tCyril Stapleton And His Orchestra\tThe Italian Theme\tLondon\t1672\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5581.mp3\tFrankie Laine\tThe Jalopy Song\tMERCURY\t5581\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_294.mp3\tKay Cee Jones\tThe Japanese Farewell Song\tMarquee\t1031\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19434-2.mp3\tArtie Shaw And His Orchestra\tThe Japanese Sandman\tVOCALION\t4465\tB-19434-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE81520-A.mp3\tBix Beiderbecke And His Gang\tThe Jazz Me Blues\tOKeh\t40923\t81520-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480771.mp3\tBen Webster & His Orch.\tThe Jeep Is Jumpin'\tHaven\t802\th-1935\t1946\tLeonhard Graham (tp), Tony Scott (cl), Ben Webster (ts), Sadik Hakim (p), Bill De Arango (g), John Simmons (sb), Sid Catlett (dm)\nhttp://www.jazz-on-line.com/a/mp3c/OKEM889-1.mp3\tJohnny Hodges & His Orch\tThe Jeep Is Jumping\tOKEH\t6824\tM889-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/V-DVP-1590a.mp3\tJimmie Lunceford And His Orchestra\tThe Jimmies\tV-Disc\t568-A\tVP-1590a\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068401.mp3\tEarl Hines & His Orch\tThe Jitney Man\tBLUEBIRD\t11535\t068401\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu068401-1.mp3\tEarl Hines And His Orchestra\tThe Jitney Man\tBluebird\tB-11535\t068401-1\t1941\tacc. George Dixon (tp,as) Gerald Valentine (tb) Robert Crowder (ts,arr), Nat Atkins, Mel Powell (arr) Tommy Enoch, Joe McLewis, George Hunt, Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ra\nhttp://www.jazz-on-line.com/a/mp3b/Blu068401-1.mp3\tEarl Hines And His Orchestra\tThe Jitney Man (be Vcl,gv Arr)\tBluebird\tB-11535\t068401-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU040247-1.mp3\tVincent Lopez Suave Swing Orch\tThe Jitterbug (vbetty Hutton)\tBLUEBIRD\t10367\t040247-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29583-1.mp3\tCount Basie And His Orchestra\tThe Jitters\tOkeh\t6095\t29583-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU034864.mp3\tFour Clefs\tThe Jive Is Jumpin'\tBLUEBIRD\t8297\t034864\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA014646-1.mp3\tFats Waller\tThe Joint's Jumpin'\tRCA\t20-1582\t014646-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL7401.mp3\tMills Bros W Sy Oliver\tThe Jones Boy\tDECCA\t28945\tL7401\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CONM1057-A.mp3\tCab Calloway And His Orch\tThe Jumpin' Jive\tCONQUEROR\t9300\tM1057-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC037631.mp3\tLionel Hampton And His Orch\tThe Jumpin' Jive\tVICTOR\t26304B\t037631\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC65967.mp3\tJimmy Dorsey And His Orch.\tThe Jumpin' Jive\tDECCA\t2612A\t65967\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec2756.mp3\tAndrew Sisters\tThe Jumpin' Jive\tDecca\t2756\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic037631-1.mp3\tLionel Hampton And His Orchestra\tThe Jumpin' Jive\tVictor\t26304\t037631-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_268.mp3\tLionel Hampton And His Orchestra\tThe Jumpin' Jive\tVICTOR\t26304B\t037631\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/KinK-5909.mp3\tLucky Millinder And His Orchestra\tThe Jumping Jack\tKing\t4436\tK-5909  \t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66591-A.mp3\tAndrews Sisters\tThe Jumping Jive\tDECCA\t2756A\t66591-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_304.mp3\tLes Paul\tThe Kangaroo\tCapitol\t2614\t11879\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D47A2.mp3\tRichard Dyer-bennett\tThe Keeper Of The Ed\tv-disk\t47A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_149.mp3\tHilltoppers\tThe Kentuckian Song\tDot\t15375\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_443.mp3\tRosemary Clooney\tThe Key To My Heart\tColumbia\t40619\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62455-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tThe Key To My Heart\tDecca\t1710\t62455-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO35733.mp3\tCount Basie And His Orchestra\tThe King\tCOLUMBIA\t37070\tCO35733\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC837y.mp3\tCount Basie And His Orch\tThe King\tColumbia\tC837\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe09776-A.mp3\tLouis Armstrong's Hot Five\tThe King Of The Zulus (at A Chit'lin Rag)\tOKeh\t8396\t09776-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_084.mp3\tBen Bernie And His Hotel Roosevelt Orchestra\tThe King's Horses\tBRUNSWICK\t6024\tC7196\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067627.mp3\tGlenn Miller & His Orch\tThe Kiss Polka\tBLUEBIRD\t11263\t067627\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULAE809.mp3\tBen Bernie & His Orch\tThe Kiss Waltz\tBRUNSWICK\t4837\tLAE809\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_181.mp3\tBen Bernie And His Orchestra\tThe Kiss Waltz\tBRUNSWICK\t4837\tLAE809\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh112.mp3\tBilly Cotton And His Band\tThe Kiss Waltz\tRegal\tMR-222\tWAR-382-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC54801-3.mp3\tGeorge Olsen & His Music\tThe Kiss Waltz (vbb) ('dancing Sweeties')\tVICTOR\t22462A\t54801-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP1538-.mp3\tDuke Ellington & His Orchestra\tThe Kissing Bug\tV-DISC\t558\tVP1538\t1945\tRex Stewart, Shelton Hemphill, Taft Jordan, Cat Anderson, Rex Stewart (tp) Ray Nance (tp,vln,vcl) Joe \"Tricky Sam\" Nanton, Claude Jones, Lawrence Brown (tb) Jimmy Hamilton (cl,ts) Johnny Hodges (as) Otto Hardwick (as,cl) Al Sears (ts) Harry Carney (bar,cl,b-cl) Duke Ellington (p) Fred Guy (g) Junior Raglin (b) Sonny Greer (d) Joya Sherrill, Kay Davis, Marie Ellington, Al Hibbler (vcl) \nhttp://www.jazz-on-line.com/a/mp3e/DEC73923.mp3\tAndrews Sisters / Vic Schoen\tThe Lady From 29 Palms\tDECCA\t23976\t73923\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_085.mp3\tAndrews Sisters\tThe Lady From 29 Palms\tDECCA\t23976\t73923\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62516-A.mp3\tWoody Herman And His Orchestra\tThe Lady From Fifth Avenue\tDECCA\t1385\t62516-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12754.mp3\tCasa Loma Orchestra\tThe Lady From St. Paul\tBRUNSWICK\t6486\t12754\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC89508.mp3\tXavier Cugat And His Orch\tThe Lady In Red\tVICTOR\t25012\t89508-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU89540.mp3\tJoe Haymes & His Orch\tThe Lady In Red\tBLUEBIRD\t5918\t89540\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D347A2.mp3\tTommy Dorsey And His Orchestra (the Sentimentalists\tThe Lady In Red\tV-DISC\t347A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-17612-1.mp3\tLouis Prima And His New Orleans Gang\tThe Lady In Red\tBrunswick\t7448\tB-17612-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_044.mp3\tXavier Cugat And His Waldorf-astoria Orchestra Feat. Don Reid\tThe Lady In Red\tVICTOR\t25012\t89508-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA949-A.mp3\tSophie Tucker - Harry Sosnik\tThe Lady Is A Tramp\tDECCA\t1472\tDLA949-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM49S3004.mp3\tLena Horne W Lennie Hayton\tThe Lady Is A Tramp\tMGM\t30171A\t49S3004\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013522.mp3\tTommy Dorsey & Clambake 7\tThe Lady Is A Tramp\tVICTOR\t25673\t013522\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61464.mp3\tAndy Kirk & Clouds Of Joy\tThe Lady Who Swings The Band\tDECCA\t1085\t61464\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61464-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tThe Lady Who Swings The Band\tDecca\t1085\t61464-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic78503-1.mp3\tCab Calloway And His Cotton Club Orchestra\tThe Lady With The Fan\tVictor\t24451\t78503-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPnltlilwy.mp3\tNellie Lutcher And Her Rhythm\tThe Lady's In Love With You\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1779.mp3\tBob Hope & Shirley Ross\tThe Lady's In Love With You\tDECCA\t2568A\tDLA1779\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4837.mp3\tMuggsy Spanier Ragtime Band\tThe Lady's In Love With You\tCOMMODORE\t576\t4837\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035702.mp3\tGlenn Miller & His Orch\tThe Lady's In Love With You (vtb)\tBLUEBIRD\t10229\t035702\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh064.mp3\tLeon Van Straten And His Music\tThe Ladys In Love With You (v Julie Dawn)\tParlophone\tF-1505\tCE-9937-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64480.mp3\tMills Brothers\tThe Lambeth Walk\tDECCA\t2008A\t64480\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC036838.mp3\tTommy Dorsey & His Orch\tThe Lamp Is Low\tVICTOR\t26259\t036838\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon037153.mp3\tGlenn Miller & His Orch\tThe Lamp Is Low\tMontgomeryWard\t8370\t037153\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24429.mp3\tMildred Bailey & Her Orchestra\tThe Lamp Is Low\tVOCALION\t4845\t24429\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D320A2.mp3\tTommy Dorsey And His Orchestra\tThe Lamp Is Low\tV-DISC\t320A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu10290.mp3\tGlenn Miller & His Orchestra\tThe Lamp Is Low\tBluebird\t10290\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_043.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tThe Lamp Is Low\tVICTOR\t26259\t036838\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/OKECO-32239-1.mp3\tBenny Goodman And His Orchestra\tThe Lamp Of Memory\tOKEY\t6580\tCO-32239-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL3645-A.mp3\tLionel Hampton And His Orchestra\tThe Lamplighter\tDecca\t18910\tL3645-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071863.mp3\tGlenn Miller & His Orch\tThe Lamplighter's Serenade\tBLUEBIRD\t11474-A\t071863\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_052.mp3\tElsie Baker And James F. Harrison\tThe Land Of Golden Dreams\tVictor\t17334\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_429.mp3\tMike Pedicin Quintet\tThe Large Large House\tRCA\t6369\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_140.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra And Pied Pipers\tThe Last Call For Love\tVictor\t27849\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3h/HAR351126-2.mp3\tEddie Droesch And His Orchestra\tThe Last Dollar\tHARMONY\t1388-H\t351126-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S3130.mp3\tBob Wills And His Texas Playboys\tThe Last Goodbye\tMGM\t11082\t51S3130\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/CONMEM28.mp3\tHank Penny's Radio Cowboys\tThe Last Goodbye\tCONQUEROR\t9711\tMEM28\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038281.mp3\tCharlie Barnet & His Orch\tThe Last Jump\tBLUEBIRD\t10389\t038281\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec68285-A.mp3\tBenny Carter And His Orchestra\tThe Last Kiss You Gave Me\tDecca\t6588\t68285-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66367.mp3\tJimmie Davis\tThe Last Letter\tDECCA\t5726\t66367\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_126.mp3\tCharles Hart\tThe Last Long Mile\tVictor\t18455\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152436.mp3\tGeorge Olsen & His Orch\tThe Last Round Up\tCOLUMBIA\t2791\tW152436\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/DECC9416.mp3\tThe Ranch Boys\tThe Last Round Up\tDECCA\t3848A\tC9416\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC615.mp3\tGuy Lombardo Royal Canadians\tThe Last Round-up\tBRUNSWICK\t6662\tC615\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152436.mp3\tGeorge Olsen And His Orch\tThe Last Round-up\tCOLUMBIA\t2791 D\tW152436\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_014.mp3\tDon Bestor And His Orchestra Feat. Neil Buckley\tThe Last Round-up\tVICTOR\t24391\t77553-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BANLA20-A.mp3\tBing Crosby\tThe Last Roundup\tBANNER\t33203\tLA20-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA20.mp3\tBing Crosby W Lennie Hayton\tThe Last Roundup\tBRUNSWICK\t6663\tLA20\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D341A.mp3\tBing Crosby\tThe Last Roundup\tV-DISC\t341A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13995-A.mp3\tVictor Young And His Orch\tThe Last Roundup (v4)\tBRUNSWICK\t6651\t13995-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC77553-1.mp3\tDon Bestor And His Orch\tThe Last Roundup (vn.buckley)\tVICTOR\t24391\t77553-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE81317-A.mp3\tLouis Armstrong's Hot Five\tThe Last Time\tOKEH\tCO37534\t81317-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO28897.mp3\tKate Smith\tThe Last Time I Saw Paris\tCOLUMBIA\t35802\tCO28897\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_162.mp3\tKate Smith\tThe Last Time I Saw Paris\tCOLUMBIA\t35802\tCO28897\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu042608-1.mp3\tArtie Shaw And His Orchestra\tThe Last Two Weeks In July - V L - If\tBluebird  \tB-10412\t042608-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D340A2.mp3\tHarry Owens And His Royal Hawaiians\tThe Laughing Song\tV-DISC\t340A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1408-1.mp3\tFrankie Trumbauer Orch\tThe Laziest Gal In Town (v Fred Gibson)\tVARSITY\t8223\tUS1408-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_445.mp3\tLes Baxter, His Chorus And Orchestra\tThe Left Arm Of Buddha\tCapitol\t3573\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_120.mp3\tVernon Dalhart\tThe Letter Edged In Black\tCBS\tOR0511\t6256-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU054598.mp3\tByron Parker+mountaineers\tThe Letter That Went To God\tBLUEBIRD\t8633\t054598\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/COM75962-A.mp3\tWillie Smith (piano)\tThe Lion And The Lamb\tCOMMODORE\t520\t75962-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_296.mp3\tFrankie Laine And Jimmy Boyd\tThe Little Boy And The Old Man\tCOLUMBIA\t39945\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAE4VB-5591.mp3\tRalph Flanagan And His Orchestra.\tThe Little Brown Mambo\tRCA VICTOR \t20-5908\tE4VB-5591\t1954\t\nhttp://www.jazz-on-line.com/a/mp3o/RCAE4VB-5591.mp3\tRalph Flanagan & His Orch.\tThe Little Brown Mambo)\tRCA VICTOR\t20-5908\tE4VB-5591\t1954\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic17755.mp3\tBilly Murray\tThe Little Ford Rambled Right Along\tVictor\t17755\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_029.mp3\tBilly Murray\tThe Little Ford Rambled Right Along\tVICTOR\t17755\t15755-1\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_026.mp3\tJames F. Harrison And James Reed\tThe Little House Upon The Hill\tVICTOR\t17789\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037681.mp3\tLarry Clinton & His Orchestra\tThe Little Man Who Wasn't There\tVICTOR\t26308\t037681\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24820.mp3\tMildred Bailey & Her Orchestra\tThe Little Man Who Wasn't There\tVOCALION\t4966\t24820\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_166.mp3\tLarry Clinton And His Orchestra Feat. Ford Leary\tThe Little Man Who Wasn't There\tVICTOR\t26308\t037681\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038263.mp3\tGlenn Miller & His Orch\tThe Little Man Who Wasn't There (vt.beneke)\tBLUEBIRD\t10358\t038263\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_245.mp3\tHugo Winterhalter And His Orchestra\tThe Little Musicians\tRCA\t6459\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_097.mp3\tFiddlin' John Carson\tThe Little Old Log Cabin In The Lane\tOKeh\t4890\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66942.mp3\tBob Crosby & His Orch\tThe Little Red Fox\tDECCA\t2924A\t66942\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_017.mp3\tGaylords\tThe Little Shoemaker\tMERCURY\t70403\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150930.mp3\tTed Wallace & His Campus Boys\tThe Little Things In Life\tCOLUMBIA\t2334 D\tW150930\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1117x.mp3\tHit-of-the-week Orch\tThe Little Things In Life\tHit-Of-The-Week\t1117\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_0723_01.mp3\tLee Morse And Her Bluegrass Boys\tThe Little Things In Life\tColumbia\t2365DA\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_122.mp3\tTed Wallace And His Campus Boys\tThe Little Things In Life\tCOLUMBIA\t2334 D\tW150930\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_057.mp3\tGus Arnheim And His Orchestra Feat. Bing Crosby And The Rhythm Boys\tThe Little Things In Life\tVictor\t22580\tPBVE61058-7\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_033.mp3\tJohnny Green And His Orchestra\tThe Little Things You Used To Do\tCOLUMBIA\t3028 D\t17209-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_1100_01.mp3\tLee Morse\tThe Little White House\tPathe\t25201A\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480572.mp3\tNat King Cole\tThe Lonely One\tCapitol\tEAP2\t15921-11\t1956\tNat King Cole, P & Vocal, Juan Tizol, V-Tb, John Collins, G, Charlie Harris, B, Jack Costanzo, Conga & Bongos, Lee Young, D\nhttp://www.jazz-on-line.com/a/mp3a/CBS24053.mp3\tJimmie Lunceford And His Orch\tThe Lonesome Road\tCBS\tCo38340\t24053\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149758-2.mp3\tTed Lewis And His Band, Vocal By Ted Lewis And The Four Dusty Travelers\tThe Lonesome Road\tCOLUMBIA\t2181 D\tW149758-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/V-D211x.mp3\tMuggsy Spanier Ragtime Band\tThe Lonesome Road\tV-DISC\t211\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe405064-5.mp3\tLouis Armstrong & His Orch\tThe Lonesome Road\tOKeh\t41538\t405064-5\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1635.mp3\tBing Crosby & J S Trotter Orch\tThe Lonesome Road\tDECCA\t3541B\tDLA1635\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1698.mp3\tBenny Goodman Qt\tThe Lonesome Road\tCAPITOL\t\t1698\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22908.mp3\tMildred Bailey & Her Orchestra\tThe Lonesome Road\tVOCALION\t4474\t22908\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_123.mp3\tNat Shilkret And The Victor Orchestra Feat. Gene Austin\tThe Lonesome Road\tVICTOR\t21996\t51927-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24053-1.mp3\tJimmie Lunceford And His Orchestra\tThe Lonesome Road\tOkeh\t4831\t24053-1\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3c/VIC51927-2.mp3\tNat Shilkret & Victor Orch\tThe Lonesome Road (vwr)\tVICTOR\t21996\t51927-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC21474-5.mp3\tCharles Hart And Shannon Qt\tThe Long Last Mile\tVICTOR\t18455\t21474-5\t1918\t\nhttp://www.jazz-on-line.com/a/mp3h/RCAE4VH-0796-b.mp3\tDick Collins And The Runaway Herd\tThe Long Night\tRCA VICTOR\t547-0460\tE4VH-0796-b\t1955\tformerly of Woody Herman Orchestra\nhttp://www.jazz-on-line.com/a/mp3a/BLU94340.mp3\tJ.e.mainer's Mountaineers\tThe Longest Train\tBLUEBIRD\t6222\t94340\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-6182x.mp3\tJaye Morgan\tThe Longest Walk\tRCA\t20-6182\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_049.mp3\tJaye P. Morgan\tThe Longest Walk\tRCA Victor\t6182\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN631x.mp3\tBrown's Ferry Four\tThe Lord Is Waiting\tKING\t631\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_286.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tThe Lord's Prayer\tRCA Victor\t78-0436\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_025.mp3\tEnrico Caruso\tThe Lost Chord\tVICTOR\t88378\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA735.mp3\tJimmy Dorsey's Orch\tThe Love Bug Will Bite You\tDECCA\t1187\tDLA735\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62106.mp3\tMills Brothers\tThe Love Bug Will Bite You\tDECCA\t1227\t62106\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07748.mp3\tFats Waller And His Rhythm\tThe Love Bug Will Bite You\tVICTOR\t25563\t07748\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCLA1309.mp3\tLouis Prima New Orleans Gang\tThe Love Bug Will Bite You\tVOCALION\t3509\tLA1309\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_097.mp3\tJimmy Dorsey And His Orchestra Feat. Ray Mckinley\tThe Love Bug Will Bite You\tDECCA\t1187\tDLA735\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D879TLI.mp3\tMildred Bailey\tThe Love I Long For\tV-DISC\t879\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC24106-2.mp3\tJohn Steele\tThe Love Nest\tVICTOR\t18676\t24106-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63134-A.mp3\tJimmie Lunceford And His Orchestra\tThe Love Nest\tDecca\t1734\t63134-A\t1938\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3b/VarM-429-1.mp3\tLucky Millinder With Mills Blue Rhythm Band\tThe Lucky Swing\tVariety\t604\tM-429-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_123.mp3\tCount Basie And His Orchestra\tThe Mad Boogie\tColumbia\t36946\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_122.mp3\tCharles Harrison\tThe Magic Of Your Eyes\tVICTOR\t18244\t18995-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1101.mp3\tArtie Shaw And His Orchestra\tThe Maid With The Flaccid Air\tRCA\t28-0406\tD5VB1101\t1945\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478383.mp3\tJohn B. Sebastian, Sr., Harmonica/ - Albert Malver, Piano\tThe Maiden With Flaxen Hair\tRCA VICTOR\t\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_297.mp3\tDave Barbour\tThe Mambo (que Rico El Mambo)\tCapitol\t973\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12673-A.mp3\tCab Calloway & His Orch\tThe Man From Harlem\tBRUNSWICK\t6450\t12673-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban12673-A.mp3\tCab Calloway And His Orchestra\tThe Man From Harlem\tBanner\t32886\t12673-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe400788-C.mp3\tJoe Venuti's Blue Four\tThe Man From The South\tOKeh\t41076\t400788-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68633-A.mp3\tTed Weems And His Orchestra\tThe Man From The South\tVICTOR\t22238\t57209-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_014.mp3\tTed Weems And His Orchestra\tThe Man From The South\tDECCA\t3782A\t68633-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU036152-2.mp3\tDorothy Lamour\tThe Man I Love\tBLUEBIRD\t10302\t036152-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC41346-4.mp3\tMarion Harris\tThe Man I Love\tVICTOR\t21116B\t41346-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09632.mp3\tBenny Goodman Qt\tThe Man I Love\tVICTOR\t25644\t09632\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400137-B.mp3\tSophie Tucker W Miff Mole\tThe Man I Love\tOKeh\t41010\t400137-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41583-5.mp3\tThe Troubadors (shilkret)\tThe Man I Love\tVICTOR\t21233\t41583-5\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD450.mp3\tRoy Eldridge Sextet\tThe Man I Love\tDISC\t152\tD450\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067906.mp3\tHerman Chittison Trio\tThe Man I Love\tBLUEBIRD\t11333\t067906\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP182.mp3\tKing Cole Trio\tThe Man I Love\tCAPITOL\t\t182\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU24826-A.mp3\tTeddy Wilson And His Orch\tThe Man I Love\tBRUNSWICK\t8438\t24826-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72851.mp3\tHazel Scott\tThe Man I Love\tDECCA\t23429\t72851\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S509.mp3\tSarah Vaughan\tThe Man I Love\tMGM\t30733\t48S509\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CROBL10.mp3\tMildred Bailey\tThe Man I Love\tCROWN\t105\tBL10\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVBOP4523.mp3\tErroll Garner\tThe Man I Love\tSAVOY\t765\tBOP4523\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D529TM.mp3\tColeman Hawkins Swing 4\tThe Man I Love\tV-DISC\t529\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4011.mp3\tEddie Heywood\tThe Man I Love\tDECCA\t23534\tL4011\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COMA4703.mp3\tEdmond Hall Sextet\tThe Man I Love\tCOMMODORE\t550\tA4703\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/DECLA5837.mp3\tLionel Hampton's Sextet\tThe Man I Love\tDECCA\t27373\tLA5837\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL51.mp3\tRed Norvo Sextet\tThe Man I Love\tKEYNOTE\t1314\tHL51\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1792.mp3\tFrances Langford - V.young Or.\tThe Man I Love\tDECCA\t2882A\tDLA1792\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCBSCo55001.mp3\tBenny Goodman & His Orchestra\tThe Man I Love\tCBS\tCo55001\tCO29063-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_195.mp3\tArtie Shaw And His Orchestra\tThe Man I Love\tBluebird\t10128-A\t31823\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_033.mp3\tMarion Harris\tThe Man I Love\tVICTOR\t21116B\t41346-4\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5837.mp3\tLionel Hampton And His Sextet\tThe Man I Love\tDecca\t27373\tLA-5837\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-126-2.mp3\tElisabeth Welch\tThe Man I Love\tVocalion\t515\tS-126-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24826-A.mp3\tTeddy Wilson And His Orchestra\tThe Man I Love\tBrunswick\t8438\tB-24826-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480657.mp3\tBenny Goodman Quartet\tThe Man I Love\tColumbia\tSL 160\t\t1938\tCarnegie Hall Concert?:<br>Benny Goodman (cl), Teddy Wilson (p), Gene Krupa (dm), Lionel Hampton (vib)\nhttp://www.jazz-on-line.com/a/mp3w/1937_368.mp3\tBenny Goodman And His Orchestra\tThe Man I Love\tVICTOR\t25644\t09632\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/BLUB-10128-A.mp3\tArtie Shaw And His Orchestra\tThe Man I Love (from The Musical Comedy \"strike Up The Band\")\tBLUEBIRD\tB-10128-A\t031823-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/BLU031823.mp3\tArtie Shaw And His Orchestra\tThe Man I Love (from The Musical Comedy ''strike Up The Band'')\tBLUEBIRD\tB-10128-A\t031823-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72622-A.mp3\tEddie Condon & His Orch\tThe Man I Love (v Lee Wiley)\tDECCA\t23432\t72622-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CBSCO29063-2.mp3\tBenny Goodman And His Orchestra\tThe Man I Love (vhelen Forrest)\tCBS\tCo55001\tCO29063-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145295-3.mp3\tFred Rich And His Orch V Vaughn De Leath\tThe Man I Love (vvdl)\tCOLUMBIA\t1241 D\tW145295-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D604.mp3\tArt Tatum\tThe Man I Love - Summertime\tV-DISC\t604\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067744.mp3\tGlenn Miller & His Orch\tThe Man In The Moon (vre)\tBLUEBIRD\t11299\t067744\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_113.mp3\tMarion Marlowe\tThe Man In The Raincoat\tCadence\t1266\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_119.mp3\tPriscilla Wright\tThe Man In The Raincoat\tUnique\t303\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC15076-1.mp3\tEddie Cantor\tThe Man On The Flying Trapeze\tARC\tBA33039\t15076-1\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_185.mp3\tJudy Garland\tThe Man That Got Away\tCOLUMBIA\t40270\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_043.mp3\tKay Starr\tThe Man Upstairs\tCapitol\t2769\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVar8143.mp3\tWill Osbourne & His Slide Music\tThe Man Who Comes Around\tVarsity\t8143\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_032.mp3\tAmes Brothers, The\tThe Man With The Banjo\tRCA Victor\t5644\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480914.mp3\tCarmen Miranda And The Bando Da Lua\tThe Man With The Lollypop Song\tDECCA\t23241-A\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038264.mp3\tGlenn Miller And His Orchestra\tThe Man With The Mandolin (vm.hutton)\tBLUEBIRD\t10358\t038264\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_207.mp3\tHoosier Hot Shots\tThe Man With The Whiskers\tCONQUEROR\t9248\tC2368-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1902_008.mp3\tByron G. Harlan\tThe Mansion Of Aching Hearts\tEDISON\t8093\t\t1902\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_205.mp3\tRichard Hayes\tThe Mask Is Off\tMERCURY\t5872\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC65002.mp3\tJimmy Dorsey And His Orch.\tThe Masquerade Is Over\tDECCA\t2293B\t65002\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_050.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly\tThe Masquerade Is Over\tDECCA\t2293B\t65002\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19114-1.mp3\tFrankie Trumbauer's Orch\tThe Mayor Of Alabam'\tBRUNSWICK\t7663\t19114-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc13632.mp3\tFletcher Henderson And His Orchestra\tThe Meanest Kind O' Blues\tVocalion\t14880\t13632\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140138-4.mp3\tFletcher Henderson's Orch\tThe Meanest Kind Of Blues\tCOLUMBIA\t249D\t140138-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Col140138-4.mp3\tFletcher Henderson And His Orchestra\tThe Meanest Kind Of Blues\tColumbia\t\t140138-4  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-31947.mp3\tLouisiana Rhythm Kings\tThe Meanest Kind Of Blues\tBrunswick\t4845\tE-31947\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04953-1.mp3\tFats Waller And His Rhythm\tThe Meanest Thing You Ever Did Was Kiss Me\tVICTOR\t25536\t04953-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC60277-AB.mp3\tJimmie Lunceford And His Orch\tThe Melody Man\tDECCA\t805A\t60277-A;B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60277-A.mp3\tJimmie Lunceford And His Orchestra\tThe Melody Man.mp3\tDecca\t802\t60277-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_303.mp3\tSammy Kaye And His Orchestra\tThe Mem'ry Of A Rose\tVictor\t27287\t058861\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143997-1.mp3\tTed Lewis & His Band\tThe Memphis Blues\tCOLUMBIA\t1050 D\tW143997-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_104.mp3\tTed Lewis And His Band\tThe Memphis Blues\tCOLUMBIA\t1050 D\tW143997-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31638.mp3\tCab Calloway & His Orch\tThe Mermaid Song\tOKEH\t6501\t31638\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec62260-A.mp3\tJimmie Lunceford And His Orchestra\tThe Merry-go-round Broke Down\tDecca\t1328\t62260-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_115.mp3\tJimmie Lunceford And His Orchestra\tThe Merry-go-round Broke Down\tDecca\t1328\t62260-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_041.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tThe Merry-go-round Broke Down\tVICTOR\t25585\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_020.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. Bob Goday\tThe Merry-go-round Broke Down\tBluebird\t7015\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62260-A.mp3\tJimmie Lunceford And His Orchestra\tThe Merry-go-round Broke Down.mp3\tDecca\t1328\t62260-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36962-3.mp3\tThomas Morris Hot Babies\tThe Mess\tVICTOR\t20364\t36962-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07803.mp3\tTommy Dorsey & His Clambake 7\tThe Milkman's Matinee\tVICTOR\t25568\t07803\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic49760-2.mp3\tFats Waller And His Buddies\tThe Minor Drag\tVictor\tV-38050\t49760-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_124.mp3\tArthur Collins And Byron Harlan\tThe Mississippi Dippy Dip\tVICTOR\t16870\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1899_021.mp3\tJoe Belmont\tThe Mocking Bird\tEDISON\t7169\t\t1899\t\nhttp://www.jazz-on-line.com/a/mp3w/1891_003.mp3\tJohn Yorke Atlee\tThe Mocking Bird\tCOLUMBIA\t\t\t1891\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_363.mp3\tFour Lads\tThe Mocking Bird\tEpic\t9150\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_236.mp3\tCab Calloway And His Orchestra\tThe Moment I Laid Eyes On You\tCOLUMBIA\t36751\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB6452.mp3\tRay Noble & His Orch\tThe Moment I Met You\tVICTOR\t24610\tOB6452\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_147.mp3\tTommy Dorsey And His Orchestra\tThe Moment I Met You\tVictor\t1761\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_161.mp3\tMargaret Whiting\tThe Money Tree\tCapitol\t3586\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke8623.mp3\tDuke Ellington & His Famous Orchestra\tThe Mooch\tOkeh\t8623\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE6812.mp3\tDuke Ellington Cotton Club Or.\tThe Mooche\tBRUNSWICK\t4122\tE6812\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE28359.mp3\tDuke Ellington And His Orch\tThe Mooche\tBRUNSWICK\t6812\tE28359\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe401175.mp3\tDuke Ellington And His Orch\tThe Mooche\tOKeh\t8623\t401175\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC47799-2.mp3\tDuke Ellington And His Orch\tThe Mooche\tVICTOR\t24486B\t47799-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_190.mp3\tDuke Ellington And His Famous Orchestra\tThe Mooche\tOKeh\t8623\t401175\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/ParCE-8479-1.mp3\tValaida Snow With Swing Accompaniment\tThe Mood That I'm In\tParlophone\tF-867\tCE-8479-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04584-1.mp3\tLionel Hampton & His Orch\tThe Mood That I'm In\tVICTOR\t25527\t04584-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-8479-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tThe Mood That I'm In \tParlophone\tF-867\tCE-8479-1\t1937\tValaida Snow t v acc. by Johnny Claes t, Derek Neville as bar, Reggie Dare ts, Gun Finlay p, Norman Brown g, Louis Barreiro b, Ken Stewart d\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20698-2.mp3\tTeddy Wilson And His Orchestra\tThe Mood That I'm In\tBrunswick\t7844  \tB-20698-2  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic04584-1.mp3\tLionel Hampton And His Orchestra\tThe Mood That I'm In\tVictor\t25527\t04584-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1366-1.mp3\tJack Teagarden Orch\tThe Moon And The Willow Tree\tVARSITY\t8196\tUS1366-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1908.mp3\tBing Crosby - J.s.trotter\tThe Moon And The Willow Tree\tDECCA\t2998B\tDLA1908\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29007-2.mp3\tCount Basie And His Orchestra\tThe Moon Fell In The River\tOkey\t5884\t29007-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA831.mp3\tBing Crosby - J.s.trotter\tThe Moon Got In My Eyes\tDECCA\t1375\tDLA831\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25624.mp3\tHal Kemp & His Orchestra\tThe Moon Got In My Eyes\tVictor\t25624\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC21333.mp3\tMildred Bailey & Her Orchestra\tThe Moon Got In My Eyes\tVOCALION\t3626\t21333\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA831-A.mp3\tJohn Scott Trotter And His Orchestra With Bing Crosby\tThe Moon Got In My Eyes \tDECCA\t11014\tDLA831-A \t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_185.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. V/bob Goday\tThe Moon Got In My Eyes\tBluebird\t7099A\t10509\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-20075-1.mp3\tMills Blue Rhythm Band\tThe Moon Is Grinning At Me\tColumbia\t3157-D\tCO-20075-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044603.mp3\tFats Waller And His Rhythm\tThe Moon Is Low\tBLUEBIRD\t10624\t044603\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480489.mp3\tArt Tatum Quartet\tThe Moon Is Low\tClef\tMGC679\t2303-1\t1955\tRoy Eldridge (tp), Art Tatum (p), John Simmons (sb), Alvin Stoller (dm)\nhttp://www.jazz-on-line.com/a/mp3b/VIC54702-3.mp3\tGeorge Olsen & His Music\tThe Moon Is Low (v F F) ('montana Moon' Mgm Film)\tVICTOR\t22392A\t54702-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22922.mp3\tBillie Holiday & Her Orch\tThe Moon Looks Down And Laughs\tVOCALION\t4126\t22922\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/BruDLA1151-A.mp3\tJohn Scott Trotter And His Orchestra\tThe Moon Of Manakoora\tBrunswick\tE-02640  \tDLA1151-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/BruDLA1151-B.mp3\tJohn Scott Trotter And His Orchestra\tThe Moon Of Manakoora\tBrunswick\t\tDLA1151-B\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_238.mp3\tJimmy Dorsey And His Orchestra Feat. V/teddy Waiters\tThe Moon On My Pillow\tDECCA\t18627\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh125.mp3\tLew Stone And His Band\tThe Moon Remembered But You Forgot (v Sam Browne)\tDecca\tF-7186\tDR-3847-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/COL27667.mp3\tBert Williams\tThe Moon Shines On The Moonshine\tCOLUMBIA\t35590\t27667\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_035.mp3\tWayne King And His Orchestra\tThe Moon Song\tBrunswick\t6474\tC504\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC504.mp3\tWayne King & His Orch\tThe Moon Song\tBRUNSWICK\t6474\tC504\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/MER2659.mp3\tJudy Perkins\tThe Moon Still Shines On The Moonshine Still\tMERCURY\t6240\t2659\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC85165.mp3\tEddie Heywood\tThe Moon Was Yellow\tDECCA\t28893\t85165\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA64-B.mp3\tBing Crosby W George Stoll\tThe Moon Was Yellow\tDECCA\t179A\tDLA64-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA64-B.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tThe Moon Was Yellow\tDecca\t179\tDLA64-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22063-B.mp3\tGeorge Olsen And His Music\tThe Moonlight March\tVictor\t22063-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU03601-B.mp3\tCharlie Barnet And His Orch\tThe Moose\tBrunswick\t03601-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101668-1.mp3\tFats Waller And His Rhythm\tThe More I Know You\tVICTOR\t25348\t101668-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe80724.mp3\tThe Jazz Pilots (h.reser)\tThe More We Are Together\tOKeh\t40812\t80724\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC71220-2.mp3\tBert Lown & His Orch\tThe More You Hurt Me\tVICTOR\t22908\t71220-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011362.mp3\tTommy Dorsey & His Orch\tThe Morning After\tVICTOR\t25703\t011362\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21376-2.mp3\tRed Norvo And His Orch, Vc. Mi\tThe Morning After (v M. Bailey)\tBRUNSWICK\t7932\t21376-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_244.mp3\tTommy Edwards Feat. Leroy Holmes' Orchestra\tThe Morning Side Of The Mountain\tMGM\t10989A\t51S154\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_290.mp3\tJan Garber And His Orchestra\tThe Morning Side Of The Mountain\tCAPITOL\t1594\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_269.mp3\tMerv Griffin\tThe Morning Side Of The Mountain\tRCA Victor\t4181\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_293.mp3\tTed Straeter And His Orchestra\tThe Most Beautiful Girl In The World\tHIT OF THE WEEK\t3017\tS2142\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_178.mp3\tTommy Dorsey And His Orchestra\tThe Most Beautiful Girl In The World\tDECCA\t28766\t84553\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC92094.mp3\tVillage Boys\tThe Mountains Will See Her Face No More\tDECCA\t5857\tC92094\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68562.mp3\tElla Fitzgerald & Her Orch\tThe Muffin Man\tDECCA\t3666B\t68562\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_273.mp3\tElla Fitzgerald\tThe Muffin Man\tDECCA\t3666B\t68562\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic043246-1.mp3\tLionel Hampton And His Orchestra\tThe Munsen Street Breakdown\tVictor\t26453\t043246-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC18404-1.mp3\tWingy Manone & His Orch\tThe Music Goes 'round And 'round\tVOCALION\t3134\t18404-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478384.mp3\tAlec Templeton\tThe Music Goes 'round And 'round\tLIBERTY MUSIC SHOPS\t\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COL18444-1.mp3\tFrank Froeba & His Band\tThe Music Goes 'round And Around\tCOLUMBIA\t3110 D\t18444-1\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec60362-A.mp3\tLouis Armstrong And His Orchestra\tThe Music Goes 'round And Around\tDecca\t685\t60362-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18430.mp3\tHal Kemp & His Orch\tThe Music Goes Round And Round\tBRUNSWICK\t7587\t18430\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC60006.mp3\tMike Riley And Eddie Farley\tThe Music Goes Round And Round\tDECCA\t578A\t60006\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/MonE60296.mp3\tMound City Blue Blowers\tThe Music Goes Round And Round\tMontgomeryWard\t5022\tE60296\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25201.mp3\tTommy Dorsey & His Clambake 7\tThe Music Goes Round And Round\tVictor\t25201\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_007.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright And Tommy Dorsey (dialog)\tThe Music Goes Round And Round\tVictor\t25201\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D116A.mp3\tFrank Sinatra\tThe Music Stopped\tV-DISC\t116A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_241.mp3\tDinah Shore, Tony Martin, Betty Hutton And Phil Harris\tThe Musicians\tRCA Victor\t4225\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2754.mp3\tStan Kenton & His Orch\tThe Nango\tDECCA\t4037B\tDLA2754\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_127.mp3\tArchie Bleyer\tThe Naughty Lady Of Shady Lane\tCadence\t1254\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_023.mp3\tAmes Brothers\tThe Naughty Lady Of Shady Lane\tRCA Victor\t5897\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU048965.mp3\tGlenn Miller And His Orch\tThe Nearness Of You\tBLUEBIRD\t10745\t048965\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68001.mp3\tConnie Boswell\tThe Nearness Of You\tDECCA\t3366B\t68001\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_125.mp3\tBob Manning\tThe Nearness Of You\tCapitol\t2383\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480915.mp3\tTed Heath And His Music\tThe Nearness Of You\tDECCA\tF9255\tDR-14021\t1949\tBobby Pratt, Stan Roderick, Stan Reynolds, Ronnie Hughes (tp) Jackie Armstrong, Maurice Pratt, Jack Bentley, Jimmy Coombes (tb) Les Gilbert, Reg Owen (as) Tommy Whittle, Henry Mackenzie (ts) Dave Shand (bar) Dave Simpson (p) Jack Seymour (b) Jack Parnell (d) Ted Heath (dir) \nhttp://www.jazz-on-line.com/a/mp3c/BRUM177.mp3\tDuke Ellington And His Famous\tThe New Birmingham Breakdown\tBRUNSWICK\t7994\tM177\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/MasM-177-1.mp3\tDuke Ellington And His Famous Orchestra\tThe New Birmingham Breakdown\tMaster\t123\tM-177-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/MasM-180-1.mp3\tDuke Ellington And His Famous Orchestra\tThe New East St. Louis Toodle-o\tMaster\t101\tM-180-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_269.mp3\tDuke Ellington And His Famous Orchestra\tThe New East St. Louis Toodle-oo\tMaster\t101\tM-180-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp37/COL142276.mp3\tTed Lewis And His Band\tThe New St. Louis, Blues\tCOLUMBIA\t697 D\tW142276-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/OKeW81415-C.mp3\tMiff Mole's Little Molers\tThe New Twister\tOKeh\t40984\tW81415-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE30504-A.mp3\tRed Nichols & His Orch\tThe New Yorkers\tBRUNSWICK\t4500\tE30504-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152284.mp3\tFrankie Trumbauer & His Orch\tThe Newest St Louis Blues\tCOLUMBIA\t2729 D\tW152284\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_406.mp3\tCarmen Mcrae\tThe Next Time It Happens\tDecca\t29749\t88862\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_074.mp3\tRosemary Clooney And Gene Autry Feat. Carl Cotner's Orchestra\tThe Night Before Christmas Song\tCOLUMBIA\t39876\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/COL16034-A.mp3\tRed Norvo & His Swing Septet\tThe Night Is Blue\tCOLUMBIA\t3026 D\t16034-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480623.mp3\tRed Norvo Sextet\tThe Night Is Blue\tRCA\tLPM 1449\tH2JB251\t1957\tHarry ''Sweets'' Edison, T, Ben Webster, Ts, Red Norvo (vib), Jimmy Rowles (p), Bob Carter (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1935_234.mp3\tSmith Ballew And His Orchestra\tThe Night Is Young\tPerfect\t16059\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_202.mp3\tGlen Gray And Casa Loma Orchestra\tThe Night Is Young\tDECCA\t349B\t39235-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39235-A.mp3\tGlen Gray Casa Loma Orch\tThe Night Is Young (v Kenny Sargent)\tDECCA\t349B\t39235-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5566X.mp3\tVic Damone\tThe Night Is Young And You're So Beautiful\tMERCURY\t5566\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_256.mp3\tRay Anthony\tThe Night Is Young And You're So Beautiful\tCapitol\t1310\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_084.mp3\tGeorge Hall And His Orchestra\tThe Night Is Young And You're So Beautiful\tBLUEBIRD\t6702\t03504\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC70940-3.mp3\tLeo Reisman & His Orch\tThe Night Was Made For Love\tVICTOR\t22869\t70940-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1553x.mp3\tTommy Dorsey And His Orchestra\tThe Night We Called It A Day\tRCA\t20-1553\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW152230.mp3\tRuth Etting\tThe Night When Love Was Born\tCOLUMBIA\t2681\tW152230\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_162.mp3\tRuth Etting\tThe Night When Love Was Born\tColumbia\t2681\tW152230\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_056.mp3\tAlma Gluck\tThe Nightingale Song\tVICTOR\t64566\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10711-3.mp3\tCab Calloway & His Orchestra\tThe Nightmare\tBANNER\t32227\t10711-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA0278.mp3\tBoswell Sisters W J.grier Orch\tThe Object Of My Affection\tBRUNSWICK\t7348\tLA0278\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2278.mp3\tPinky Tomlin\tThe Object Of My Affection\tDECCA\t3649A\tDLA2278\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09680-2.mp3\tLionel Hampton & His Orch\tThe Object Of My Affection\tVICTOR\t25699\t09680-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC85010-1.mp3\tJan Garber & His Orch\tThe Object Of My Affection\tVICTOR\t24809A\t85010-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-732-1.mp3\tDjango Reinhardt\tThe Object Of My Affection\tGramophone\tK-7618\tOLA-732-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_018.mp3\tBoswell Sisters Feat. Jimmie Grier's Orchestra\tThe Object Of My Affection\tBRUNSWICK\t7348\tLA0278\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic09680-2.mp3\tLionel Hampton And His Orchestra\tThe Object Of My Affection\tVictor\t25699\t09680-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_101.mp3\tJan Garber And His Orchestra\tThe Object Of My Affection\tVICTOR\t24809A\t85010-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_015.mp3\tJimmie Grier And His Orchestra Feat. Pinky Tomlin, V\tThe Object Of My Affection\tBRUNSWICK\t7308\tLA229\t1934\tStanley Green, Cliff Barber (tp), Homer Menge (tb), James Briggs, Frank Schumacher (cl, as), Art Grier, Gordon Green (cl, ts), Dick Webster, Henry Jaworski, Dwight Muma, Bob Morrow (vn), Ted Repay (p), Wally Heglin (g), Jake Garcia (sb), Billy Marcus (dm), Jimmie Grier (dir)\nhttp://www.jazz-on-line.com/a/mp3w/1935_134.mp3\tGlen Gray And Casa Loma Orchestra\tThe Object Of My Affection\tDECCA\t298B\t39133\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA229-A.mp3\tJimmy Grier Coconut Grove Orch\tThe Object Of My Affection (vpinky Tomlin)\tBRUNSWICK\t7308\tLA229-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU7308.mp3\tJimmy Grier Coconut Grove Orch\tThe Object Of My Affection (vpinky Tomlin)\tBRUNSWICK\t7308\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_033.mp3\tArthur Collins\tThe Oceanna Roll\tCOLUMBIA\t1071\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D353A1.mp3\tWings Over Jordan\tThe Old Ark's A'moverin'\tV-DISC\t353A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE80756.mp3\tWilliamson Bros & Curry\tThe Old Armchair\tOKEH\t45146\t80756\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/KEY104.mp3\tTony Kraber\tThe Old Chisholm Trail\tKEYNOTE\t104\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec62323-A.mp3\tLouis Armstrong With The Mills Brothers\tThe Old Folks At Home\tDecca\t1360\t62323-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_032.mp3\tAlma Gluck\tThe Old Folks At Home (swanee River)\tVICTOR\t87196\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/PER12910-B.mp3\tGene Autry And Jimmy Long\tThe Old Folks Back Home\tPerfect\t12910-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_033.mp3\tArthur Collins And Byron Harlan\tThe Old Grey Mare\tCOLUMBIA\t2478\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1963x.mp3\tSammy Kaye And His Orchestra\tThe Old Lamp Lighter\tRCA\t20-1963\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP288x.mp3\tHal Derwin\tThe Old Lamplighter\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_136.mp3\tKenny Baker Feat. Russ Morgan's Orchestra\tThe Old Lamplighter\tDECCA\t23781\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh128.mp3\tRoy Fox And His Band\tThe Old Man Of The Mountains (v Al Bowlly)\tDecca\tF-3181\tGB-4936-1-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_026.mp3\tRichard Hayes\tThe Old Master Painter\tMERCURY\t5342\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_111.mp3\tPhil Harris\tThe Old Master Painter\tRCA Victor\t78-3608\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP31-A.mp3\tPaul Whiteman & His Orch\tThe Old Music Master\tCAPITOL\t\t31-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2438.mp3\tBing Crosby\tThe Old Oaken Bucket\tDECCA\t4343B\tDLA2438\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MONV-1790TO.mp3\tHaydn Qt (peerless Qt)\tThe Old Oaken Bucket\tMONARCH\tV-1790\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_218.mp3\tEddie Lawrence\tThe Old Philosopher\tCoral\t61671\t\t1956\t\nhttp://www.jazz-on-line.com/mp3/753688097.mp3\tLawrence Cook\tThe Old Piano Rol\tABBOTT\t15003\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_120.mp3\tHoagy Carmichael And Cass Daley Feat. Matty Mattock's All-stars\tThe Old Piano Roll Blues\tDECCA\t24977\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_298.mp3\tEddie Cantor And Lisa Kirk Feat. O/sammy Kaye\tThe Old Piano Roll Blues\tRCA VICTOR\t3751\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_135.mp3\tLawrence (piano Roll) Cook Feat. The Jim Dandies\tThe Old Piano Roll Blues\tABBEY\t15003\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_120.mp3\tHoagy Carmichael And Cass Daley Feat. Matty Mattock's All-stars\tThe Old Piano Roll Blues\tDecca\t24977\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_327.mp3\tJan Garber And His Orchestra\tThe Old Piano Roll Blues\tCAPITOL\t970\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_028.mp3\tJohn Mccormack\tThe Old Refrain\tVICTOR\t64559\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_105.mp3\tRudy Vallee And His Connecticut Yankees\tThe Old Sow Song\tBLUEBIRD\t7079\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOB6533.mp3\tRay Noble's Mayfair Orch\tThe Old Spinning Wheel\tVICTOR\t24357\tOB6533\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU14440-A.mp3\tVictor Young's Orch\tThe Old Spinning Wheel\tBRUNSWICK\t6725\t14440-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/DECC9417.mp3\tThe Ranch Boys\tThe Old Spinning Wheel\tDECCA\t3852B\tC9417\t1934\t\nhttp://www.jazz-on-line.com/a/mp37/DECDLA1346A.mp3\tTed Lewis And His Orchestra\tThe Old St. Louis Blues\tDECCA\t23917 A\tDLA1346A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-11110-A.mp3\tGlenn Miller And His Orch\tThe One I Love\tBluebird\tB-11110-A\tB-11110-A\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC017466.mp3\tTommy Dorsey And His Orch\tThe One I Love\tVICTOR\t25741\t017466\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68561.mp3\tElla Fitzgerald & Her Orch\tThe One I Love\tDECCA\t3608A\t68561\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_296.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tThe One I Love (will Come Along Someday)\tVICTOR\t25741\t017466\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe08554-A.mp3\tSophie Tucker W Miff Mole\tThe One I Love Belongs To Somebody Else\tOKeh\t40054\t08554-A\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_099.mp3\tTommy Dorsey Orch V Frank Sinatra\tThe One I Love Belongs To Somebody Else\tVICTOR\t26660\t051581-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/PUR9323.mp3\tBert Lown & His Orch\tThe One I Love Just Can't Be Bothered With Me\tPURITAN\t20799\t9323\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA741.mp3\tBing Crosby And Victor Young\tThe One Rose\tDECCA\t1201\tDLA741\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC017417-1.mp3\tLarry Clinton & His Orchestra\tThe One Rose\tVICTOR\t25724\t017417-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_145.mp3\tLarry Clinton And His Orchestra\tThe One Rose (that's Left In My Heart)\tVICTOR\t25724\t017417-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA741-C.mp3\tVictor Young And His Orchestra With Bing Crosby\tThe One Rose (that's Left In My Heart)\tDECCA\t\tDLA741-C \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA741-A.mp3\tVictor Young And His Orchestra With Bing Crosby\tThe One Rose (that's Left In My Heart)\tDECCA\t1201\tDLA741-A \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU02875.mp3\tTune Wranglers\tThe One Rose In My Heart\tBLUEBIRD\t6655\t02875\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35436-B.mp3\tVictor Dance Orch\tThe Only Girl\tVictor\t35436-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3l/COL81484.mp3\tLeo Reisman & His Orch\tThe Only Girl\tCOLUMBIA\t71D\t81484\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA2049.mp3\tEddie Cantor & Mitchell Choir\tThe Only Thing I Want For Christmas\tCOLUMBIA\t35325\tLA2049\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_128.mp3\tGene Austin Feat. O/nat Shilkret\tThe Only, Only One For Me\tVICTOR\t19599\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru2970.mp3\tIsham Jones & His Orchestra\tThe Original Charleston\tBrunswick\t2970\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_065.mp3\tIsham Jones And His Orchestra\tThe Original Charleston\tBrunswick\t2970\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/MONB2958-2.mp3\tAda Jones And Len Spencer\tThe Original Cohens\tMONARCH\tV-4605\tB2958-2\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_458.mp3\tSarah Vaughan\tThe Other Woman\tMercury\t70885\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_037.mp3\tVernon Dalhart\tThe Pal That I Loved (stole The Gal That I Loved)\tOkeh\t40177\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW144087.mp3\tArt Gillam\tThe Pal You Left At Home\tCOLUMBIA\t1194 D\tW144087\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA230.mp3\tAndy Iona's Novelty Four\tThe Palm Trees Sing Aloha\tCOLUMBIA\t3138 D\tLA230\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98894.mp3\tFats Waller And His Rhythm\tThe Panic Is On\tVICTOR\t25266\t98894\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu99775-1.mp3\tMezz Mezzrow And His Swing Band\tThe Panic Is On\tBluebird\tB-6313\t99775-1   \t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_071.mp3\tArthur Collins\tThe Parson And The Turkey\tCOLUMBIA\tA-0293\t03416-1\t1906\t\nhttp://www.jazz-on-line.com/a/mp3a/COLRHCO40023.mp3\tDoris Day\tThe Party's Over\tCOLUMBIA\t40798\tRHCO40023\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW145630.mp3\tCalifornia Ramblers\tThe Pay Off\tCOLUMBIA\t1642 D\tW145630\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCDAL-731-.mp3\tHarris Bros Texans\tThe Pay Off\tVOCALION\t15747\tDAL-731-\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26180-C.mp3\tRaymond Scott And His New Orch\tThe Peanut Vendor\tCOLUMBIA\t35364\t26180-C\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_311.mp3\tLouis Armstrong\tThe Peanut Vendor\tOKeh\t41478\t404419-B\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404419-B.mp3\tLouis Armstrong & His Orch\tThe Peanut Vendor\tOKeh\t41478\t404419-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE35954.mp3\tRed Nichols & His Orch\tThe Peanut Vendor\tBRUNSWICK\t6035\tE35954\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_001.mp3\tDon Azpiazu And His Havana Casino Orchestra Feat. Arturo Machin\tThe Peanut Vendor\tVICTOR\t22483A\t62152-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_066.mp3\tCalifornia Ramblers\tThe Peanut Vendor\tCOLUMBIA\t2351\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC2069-B.mp3\tHenry King And His Orchestra\tThe Peanut Vendor (el Manisero)\tDECCA\t2069-B\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU38662-3.mp3\tJelly Roll Morton\tThe Pearls\tBLUEBIRD\t10252\t38662-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3o/GENG11547.mp3\tJelly Roll Morton (piano)\tThe Pearls\tGENNETT\t5323\t11547\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic38662-3.mp3\tJelly-roll Morton's Red Hot Peppers\tThe Pearls\tVictor\t20948\t38662-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4297.mp3\tLionel Hampton & His Orch\tThe Pencil Broke\tDECCA\t23696\tL4297\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-4297-A.mp3\tLionel Hampton And His Orchestra\tThe Pencil Broke (and That's All She Wrote)\tDecca\t23696\tL-4297-A\t1946\tLionel Hampton p  vib v dir. Joe Wilder Duke Garrette Leo Shepherd Joe Morris  Wendell Culley  Jimmy Nottingham t, Jimmy Wormick Booty Wood  Andrew Penn   Al Hayse tb, Bobby Plater Ben Kynard as, Arnett Cobb johnny Griffin ts, Charlie Fowlkes bar, Mi\nhttp://www.jazz-on-line.com/a/mp3b/Joh171.mp3\tAmbrose And His Orchestra\tThe Penguin\tDecca\tF-7089\tDR-3659-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE31566.mp3\tLouis Katzman Brunswick Orch\tThe Perfect Song\tBRUNSWICK\t4632\tE31566\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1984.mp3\tBing Crosby\tThe Pessimistic Character\tDECCA\t3162A\tDLA1984\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_345.mp3\tConnee Boswell Feat. O/george Siravo\tThe Philadelphia Waltz\tDECCA\t29051\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17810.mp3\tFred Astaire\tThe Piccolino\tBRUNSWICK\t7488\t17810-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DECTB1876.mp3\tAmbrose And His Orchestra\tThe Piccolino\tDECCA\t551A\tTB1876\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_139.mp3\tFred Astaire Feat. Leo Reisman Orchestra\tThe Piccolino\tBRUNSWICK\t7488\t17810-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92231-1.mp3\tRay Noble & His Orch\tThe Piccolino (v A B)\tVICTOR\t25094\t92231-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_214.mp3\tJohnny Desmond Feat. Tony Mottola's Orchestra And Ray Charles Singers\tThe Picnic Song\tMGM\t10703\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC023476-2.mp3\tBunny Berigan And His Orch\tThe Pied Piper\tVICTOR\t25881A\t023476-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC38557.mp3\tFrank Crumit\tThe Pig Got Up And Slowly Walked Away\tDECCA\t313B\t38557\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_154.mp3\tRuss Morgan\tThe Poor People Of Paris\tDecca\t29835\t89235\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_007.mp3\tLes Baxter And His Orchestra\tThe Poor People Of Paris\tCapitol\t3336\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_132.mp3\tLawrence Welk And His Orchestra\tThe Poor People Of Paris\tCoral\t61592\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_291.mp3\tChet Atkins\tThe Poor People Of Paris\tRCA\t6366\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_111.mp3\tCliffie Stone\tThe Popcorn Song\tCapitol\t3131\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2290t.mp3\tArthur Collins\tThe Preacher And The Bear\tColumbia\tA2290\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_268.mp3\tPhil Harris\tThe Preacher And The Bear\tRCA Victor\t2143\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_467.mp3\tMitch Miller And His Orchestra\tThe President On The Dollar\tColumbia\t40715\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC30633-6.mp3\tVernon Dalhart\tThe Prisoner's Song\tVICTOR\t19427B\t30633-6\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC36208x.mp3\tBunny Berigan\tThe Prisoner's Song\tVICTOR\t36208\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_002.mp3\tVernon Dalhart\tThe Prisoner's Song\tVICTOR\t19427B\t30633-6\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC35477.mp3\tHenry Burr\tThe Prisoner's Sweetheart\tVICTOR\t20098\t35477\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_164.mp3\tHenry Burr\tThe Prisoner's Sweetheart\tVICTOR\t20098\t35477\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152767-2.mp3\tBen Selvin & His Orch\tThe Prize Waltz (v Howard Philips)\tCOLUMBIA\t2935 D\tW152767-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_119.mp3\tRoy Acuff - Smoky Mountain Boys\tThe Prodigal Son\tOKEH\t6716\tH0811\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_115.mp3\tPatty Andrews Feat. Bob Crosby Orchestra\tThe Pussy Cat Song (nyow! Nyot! Nyow!)\tDECCA\t24533\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_115.mp3\tPatty Andrews Feat. Bob Crosby Orchestra\tThe Pussy Cat Song (nyow! Nyot! Nyow!)\tDecca\t24533\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_062.mp3\tMaurice Burkhardt And Peerless Quartet\tThe Ragtime Jockey Man\tColumbia\t1188\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147359-2.mp3\tTom Darby & Jimmie Tarlton\tThe Rainbow Division\tCOLUMBIA\t15360 D\tW147359-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU50868-1.mp3\tPaul Howard Quality Serenaders\tThe Ramble\tBLUEBIRD\t5804\t50868-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC60993.mp3\tTiger And Gerald Clark\tThe Rats\tDECCA\t17272B\t60993\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC605.mp3\tErroll Garner W F.wright\tThe Real Gone Tune\tNATIONAL\t\tNSC605\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DELX2002u.mp3\tBilly Eckstine\tThe Real Thing Happened To Me\tDELUXE\tX2002\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_303.mp3\tSammy Davis, Jr. With Orchestra Directed By Sy Oliver\tThe Red Grapes\tDECCA\t29310\t86788\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_134.mp3\tRalph Flanagan And His Orchestra\tThe Red We Want Is The Red We've Got (in The Old Red, White, & Blue)\tRCA\t20-3904\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_133.mp3\tSammy Kaye And His Orchestra\tThe Reluctant Dragon\tVictor\t27449\t065901\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DAVJD7175tr.mp3\tUna Mae Carlisle\tThe Rest Of My Life\tDAVIS\tJD7175\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69236.mp3\tSkeets Tolbert Gentlemen Swing\tThe Rhumba Blues\tDECCA\t8565B\t69236\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec69236-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tThe Rhumba Blues\tDecca\t8565\t69236-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66953.mp3\tWoody Herman & His Orchestra\tThe Rhumba Jumps\tDECCA\t2939A\t66953\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC675.mp3\tAmbrose & His Orchestra, Vocal Evelyn Dall\tThe Rhythm's O.k. In Harlem\tDECCA\t675\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_244.mp3\tEddy Arnold With Hugo Winterhalter's Chorus And Orchestra\tThe Richest Man (in The World)\tRCA Victor\t6290\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/MAJT705.mp3\tEddy Howard And His Orchestra\tThe Rickety Rickshaw Man (veh)\tMAJESTIC\t7192\tT705\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_098.mp3\tNat Shilkret And The Victor Orchestra\tThe Riff Song\tVICTOR\t20373A\t36981-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36981-3.mp3\tNat Shilkret & Victor Orch\tThe Riff Song (vr)\tVICTOR\t20373A\t36981-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_004.mp3\tArthur Collins And Byron Harlan\tThe Right Church, But The Wrong Pew\tCOLUMBIA\tA-0621\t3966\t1909\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU042179.mp3\tCharlie Barnet And His Orch\tThe Right Idea\tBLUEBIRD\t10530\t042179\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_191.mp3\tRuth Etting\tThe Right Kind Of Man\tCOLUMBIA\t1998\tW149099\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU99974.mp3\tWillie Bryant & His Orch\tThe Right To Love Somebody\tBLUEBIRD\t6361\t99974\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC67798-2.mp3\tDuke Ellington & His Orch\tThe River And Me (v C B)\tVICTOR\t22614\t67798-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban13616-1.mp3\tHerny ''red'' Allen And His New York Orchestra\tThe River's Takin' Care Of Me\tBanner\t32840\t13616-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA15.mp3\tDick Powell\tThe Road Is Open Again\tBRUNSWICK\t6685\tLA15\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA3030.mp3\tBing Crosby - J.s.trotter Orch\tThe Road To Morocco\tDECCA\t18514A\tDLA3030\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_259.mp3\tBing Crosby And Bob Hope\tThe Road To Morocco\tDECCA\t40000\tL3687\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_335.mp3\tArchie Bleyer\tThe Rockin' Ghost\tCadence\t1293\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BRO9332.mp3\tLawrence Veda Orch\tThe Rogue Song\tBROADWAY\tBD1356\t9332\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB3206.mp3\tAlan Turner\tThe Rosary\tVICTOR\t17446\tB3206\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_032.mp3\tJohn Mccormack\tThe Rosary\tVICTOR\t64257\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_033alt.mp3\tHenry Burr\tThe Rosary\tGREYGULL\t4053A\t0947-A\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_094.mp3\tErnestine Schumann-heink\tThe Rosary\tVICTROLA\t\t88108\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_088.mp3\tAlan Turner\tThe Rosary\tVICTOR\t17446\tB3206\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_220.mp3\tPerry Como\tThe Rose Tattoo\tCapitol\t3202\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW141582.mp3\tLeo Reisman & His Orch\tThe Roses Brought Me You\tCOLUMBIA\t575 D\tW141582\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148211-2.mp3\tGid Tanner's Skillet Lickers\tThe Rovin' Gambler\tCOLUMBIA\t15447 D\tW148211-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_331.mp3\tTennessee Ernie Ford\tThe Rovin' Gambler\tCapitol\t3421\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO44591.mp3\tGuy Mitchell\tThe Roving Kind\tCOLUMBIA\t39067\tCO44591\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC80129.mp3\tWeavers\tThe Roving Kind\tDECCA\t27332\t80129\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_077.mp3\tWeavers\tThe Roving Kind\tDECCA\t27332\t80129\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_027.mp3\tGuy Mitchell\tThe Roving Kind\tCOLUMBIA\t39067\tCO44591\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_179.mp3\tRex Allen Feat. D Lew Douglas\tThe Roving Kind\tMERCURY\t5573\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_216.mp3\tNat ''king'' Cole Feat. Les Baxter's Orchestra\tThe Ruby And The Pearl\tCAPITOL\t2230\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_269.mp3\tXavier Cugat And His Waldorf-astoria Orchestra Feat. V/dinah Shore\tThe Rumba-cardi\tVICTOR\t26665\t051569\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU014295.mp3\tBoots And His Buddies\tThe Sad\tBLUEBIRD\t7236\t014295\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15911.mp3\tDuke Ellington And His Orch\tThe Saddest Tale\tBRUNSWICK\t7310\t15911\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon41739.mp3\tJimmie Rodgers\tThe Sailor's Plea\tMontgomeryWard\t5036\t41739\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC88692.mp3\tBill Haley And His Comets\tThe Saints Rock & Roll\tDECCA\t29870\t88692\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_139.mp3\tBill Haley And His Comets\tThe Saints Rock 'n Roll\tDecca\t29870\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/CON20344-2.mp3\tArtie Shaw And His Orchestra\tThe Same Old Line\tCONQUEROR\t9093\tB-20344-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_245.mp3\tFrankie Masters And His Orchestra\tThe Same Old Story\tOkeh\t5716\t27729\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_164.mp3\tNat ''king'' Cole\tThe Sand And The Sea\tCapitol\t3027\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC8479.mp3\tCab Calloway & His Orch\tThe Scat Song\tBRUNSWICK\t6272\tC8479\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/Vic72560-1.mp3\tBilly Banks Blue Rhythm Boys\tThe Scat Song\tVictor\t24027\t72560-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC78867-1.mp3\tCab Calloway & His Orchestra\tThe Scat Song\tVICTOR\t24511\t78867-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC12431-A.mp3\tWashboard Rhythm Kings\tThe Scat Song\tVOCALION\t1725\t12431-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban11651-A.mp3\tMills Blue Rhythm Band\tThe Scat Song\tBanner\t32445  \t11651-A  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Ori11360-1.mp3\tBaron Lee And The Blue Rhythm Band (mills Blue Rhythm Band)\tThe Scat Song\tOriole\t2464  \t11360-1  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/BruJC-8479-A.mp3\tCab Calloway And His Orchestra\tThe Scat Song\tBrunswick\t6272\tJC-8479-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic78867-1.mp3\tCab Calloway And His Cotton Club Orchestra\tThe Scat Song\tVictor\t24511\t78867-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE26967-A.mp3\tGene Krupa & His Orch\tThe Sergeant Was Shy\tOKEH\t5985\t26967-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_056.mp3\tRudy Vallee And His Connecticut Yankees\tThe Shadow Waltz\tCOLUMBIA\t2773\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26718.mp3\tBenny Goodman Sextet\tThe Sheik\tCOLUMBIA\t35466\t26718\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC89819.mp3\tWillie Bryant & His Orch\tThe Sheik\tVICTOR\t25038\t89819\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_034.mp3\tClub Royal Orchestra\tThe Sheik\tVICTOR\t18831\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/BluBN-221-0.mp3\tBenny Morton's All Stars\tThe Sheik Of Araby\tBlue Note\t\tBN-221-2\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/BluBN-220-0.mp3\tBenny Morton's All Stars\tThe Sheik Of Araby\tBlue Note\t46\tBN-221-0\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCA-14275.mp3\tCalifornian Ramblers\tThe Sheik Of Araby\tVocalion\tA-14275\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP1073.mp3\tHot Lips Page Vdisc Allstars\tThe Sheik Of Araby\tV-DISC\t418\tVP1073\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE33333A.mp3\tRed Nichols And His Five Pennies Vocal Chorus By Jack Teagarten\tThe Sheik Of Araby\tBRUNSWICK\t80005 A\tE33333A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE33333A.2H.mp3\tRed Nichols And His Five Pennies Vocal Chorus By Jack Teagarten\tThe Sheik Of Araby\tBRUNSWICK\t80005 A\tE33333A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5998-2.mp3\tTeddy Wilson Sextet\tThe Sheik Of Araby\tMUSICRAFT\t547\t5998-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046157.mp3\tColeman Hawkins Octet\tThe Sheik Of Araby\tBLUEBIRD\t10770\t046157\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/HMVOLA-1737-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tThe Sheik Of Araby\tHMV\tB-8737\tOLA-1737-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKJ-22-1.mp3\tMezzrow - Bechet Septet\tThe Sheik Of Araby\tStoryville\tSEP 408\tKJ-22-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Ult77523.mp3\tAlix Combelle Et Son Orchestre\tThe Sheik Of Araby\tUltraphon\tAP-1544\t77523\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480767.mp3\tBenny Morton All Stars\tThe Sheik Of Araby\tBlue Note\t46\tBN221-0\t1945\tBenny Morton (tb), Barney Bigard (cl), Ben Webster (ts), Sam Benskin (p), Israel Crosby (sb), Eddie Dougherty (dm)\nhttp://www.jazz-on-line.com/a/mp3e/BruB-11840-A.mp3\tDuke Ellington And His Famous Orchestra\tThe Shelk Of Araby\tBrunswick\t6336\tB-11840-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_024.mp3\tRusty Draper\tThe Shifting, Whispering Sands\tMercury\t70696\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_034.mp3\tBilly Vaughn And His Orchestra\tThe Shifting, Whispering Sands Part 1 & 2\tDot\t15409\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478386.mp3\tAlec Templeton\tThe Shortest Wagner Opera Ever Written\tLIBERTY MUSIC SHOPS\t\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38430-A.mp3\tArt Tatum\tThe Shout\tDECCA\t468A\t38430-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC69946.mp3\tAndrews Sisters\tThe Shrine Of St Cecelia\tDECCA\t4097A\t69946\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_099.mp3\tAndrews Sisters\tThe Shrine Of St. Cecelia\tDECCA\t04097\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_151.mp3\tSammy Kaye And His Orchestra\tThe Shrine Of St. Cecelia\tVictor\t27691\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec04097.mp3\tAndrews Sisters\tThe Shrine Of St. Cecilia\tDecca\t04097\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL8181.mp3\tPeggy Lee And Oliver Wallace\tThe Siamese Cat Song (from The Disney Movie Lady And The Tramp)\tDECCA\t29427\tL8181\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_022.mp3\tNat Shilkret And The Victor Orchestra\tThe Sidewalks Of New York\tVICTOR\t21493\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh138.mp3\tMaurice Winnick And His Orchestra\tThe Simple Things In Life (v Judy Shirley)\tParlophone\tF-372\tCE-7396-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1952.mp3\tBing Crosby\tThe Singing Hills\tDECCA\t3064A\tDLA1952\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_015.mp3\tBing Crosby\tThe Singing Hills\tDECCA\t3064A\tDLA1952\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC4339A.mp3\tBing Crosby\tThe Singing Sands Of Alamosa\tDECCA\t4339A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035718.mp3\tBenny Goodman And His Orchestra\tThe Siren's Song\tVICTOR\t26230\t035718\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DeDLA-539-A.mp3\tLouis Armstrong With Jimmy Dorsey And His Orchestra\tThe Skeleton In The Closet\tDecca\t949\tDLA-539-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_070.mp3\tAmerican Quartet\tThe Skeleton Rag\tVictor\t16681\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_195.mp3\tTommy Dorsey And His Orchestra Feat. Charlie Peterson\tThe Skunk Song\tVICTOR\t27621\t067932\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC044680.mp3\tTommy Dorsey And His Orch\tThe Sky Fell Down\tVICTOR\t26518\t044680\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67153.mp3\tWoody Herman & His Orchestra\tThe Sky Fell Down\tDECCA\t3017A\t67153\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COLWC2974.mp3\tBenny Goodman & His Orch\tThe Sky Fell Down\tCOLUMBIA\t35420\tWC2974\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046083.mp3\tGlenn Miller & His Orch\tThe Sky Fell Down (vre)\tBLUEBIRD\t10580\t046083\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36905.mp3\tGene Krupa & His Orch\tThe Slow Mosquito\tCOLUMBIA\t37209\tCO36905\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_095.mp3\tGeorge M. Cohan Feat. D/walter B. Rogers\tThe Small-town Gal\tVICTOR\t60052\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC017420-2.mp3\tLarry Clinton & His Orchestra\tThe Snake Charmer\tVICTOR\t25734\t017420-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU014297HW2-5.mp3\tBoots And His Buddies\tThe Somebody\tBLUEBIRD\t7269\t014297-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC1365.mp3\tNick Lucas\tThe Song Is Ended\tBRUNSWICK\t3736\tC1365\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC40509-3.mp3\tJack Smith\tThe Song Is Ended\tVICTOR\t21028A\t40509-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5226.mp3\tHerman Chittison Trio\tThe Song Is Ended\tMUSICRAFT\t315\t5226\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21040-B.mp3\tGeorge Olsen And His Music\tThe Song Is Ended (but The\tVictor\t21040-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU072044.mp3\tFrank Sinatra\tThe Song Is You\tBLUEBIRD\t11515\t072044\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_017.mp3\tLucy Isabelle Marsh Feat. Royal Dadmun\tThe Song Of Love\tVictor\t45304\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_001.mp3\tHenry Burr\tThe Song That Stole My Heart Away\tCOLUMBIA\t1512\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUDAL-7003-A.mp3\tHarris Brother's Texans\tThe South's Been A Mother To Me\tBRUNSWICK\t6047\tDAL-7003-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/Jaz1623-2.mp3\tKing Oliver's Jazz Band\tThe Southern Stomps\tJazz Collector\tL-4\t1623-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC17318.mp3\tAl Jolson\tThe Spaniard Who Blighted My L\tVICTOR\t17318\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC12972-1.mp3\tAl Jolson\tThe Spaniard Who Blighted My Life\tVICTOR\t17318\t12972-1\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_286.mp3\tVic Damone And The Jack Halloran Singers With Orchestra Conducted By David Carroll\tThe Sparrow Sings\tMERCURY\t70326\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1803.mp3\tStan Kenton\tThe Spider And The Fly\tCAPITOL\tB20129\t1803\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU030368.mp3\tFats Waller And His Rhythm\tThe Spider And The Fly\tBLUEBIRD\t10205\t030368\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23949TS.mp3\tLucky Millinder\tThe Spider And The Fly\tDECCA\t23949\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73862.mp3\tLucky Millinder And His Orchestra\tThe Spider And The Fly\tDecca\t23949\t73862\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BRO1256.mp3\tDelia Murphy\tThe Spinning Wheel\tBROADWAY\tBD1256\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU060912.mp3\tGlenn Miller & His Orch\tThe Spirit Is Willing\tBLUEBIRD\t11135\t060912\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D144A1.mp3\tCapt. Glenn Miller And The Aaftc Orch.\tThe Squadron Song\tV-DISC\t144A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D144-Aa.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tThe Squadron Song\tV-Disc\t144-A\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColD-14064.mp3\tBessie Smith\tThe St. Louis Blues\tColumbia\tD-14064\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_025.mp3\tBessie Smith\tThe St. Louis Blues\tColumbia\tD-14064\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_106alt.mp3\tAl Bernard\tThe St. Louis Blues\tEmerson\t9163\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142205-3.mp3\tFletcher Henderson And His Orch\tThe Stampede\tCOLUMBIA\t654 D\tW142205-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Col142205-3.mp3\tFletcher Henderson And His Orchestra\tThe Stampede\tColumbia\t654-D\t142205-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_246.mp3\tGisele Mackenzie\tThe Star You Wished Upon Last Night\tVik\t0233\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC042601.mp3\tTommy Dorsey & His Orch\tThe Starlit Hour\tVICTOR\t26445\t042601\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_210.mp3\tTommy Dorsey And His Orchestra Feat. V/jack Leonard\tThe Starlit Hour\tVICTOR\t26445\t042601\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_247.mp3\tElla Fitzgerald\tThe Starlit Hour\tDECCA\t2988\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_307.mp3\tRalph Flanagan And His Orchestra\tThe Stars And Stripes Forever\tRCA VICTOR\t3762\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1114.mp3\tLouis Prima's New Orleans Gang\tThe Stars Know\tBRUNSWICK\t7740\tLA1114\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68326.mp3\tWoody Herman & His Orchestra\tThe Stars Remain\tDECCA\t3544B\t68326\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3574.mp3\tJohnny Green's Orch.\tThe Steam Is On The Beam\tDECCA\t23435\tL3574\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC58653-3.mp3\tRudy Vallee & His Ct.yankees\tThe Stein Song\tVICTOR\t24270\t58653-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM846-1.mp3\tDuke Ellington's Famous Orch\tThe Stevedore's Serenade\tBRUNSWICK\t8174\tM846-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S413.mp3\tMaxine Sullivan\tThe Story Of Our Love Affair\tMGM\t10343\t48S413\t1948\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478387.mp3\tJerry Murad, Harmonica; Richard Hayman And His Orchestra\tThe Story Of Three Loves (theme From The M-g-m Picture) (18th Variation On A Theme Of Paganini)\tMERCURY\t\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_488.mp3\tPatti Page\tThe Strangest Romance\tMercury\t70878\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03544.mp3\tBilly Murray (tenor)\tThe Streets Of New York\tCOLUMBIA\tA-0305\t03544\t1906\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17371x.mp3\tAtilla The Hun\tThe Strike\tDECCA\t17371\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_169.mp3\tGaylords\tThe Strings Of My Heart\tMERCURY\t70258\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU075456.mp3\tAlvino Rey And His Orch\tThe Strip Polka\tBLUEBIRD\t11573\t075456\t1942\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480490.mp3\tBenny Golson\tThe Stroller\tNew Jazz\tNJLP8220\t1835\t1959\tCurtis Fuller (tb), Benny Golson (ts), Ray Bryant (p), Paul Chambers (sb), Art Blakey (dm)\nhttp://www.jazz-on-line.com/a/mp3b/Blu80278-1.mp3\tMills Blue Rhythm Band\tThe Stuff Is Here (and It's Mellow)\tBluebird\tB-56728\t80278-1 \t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39398.mp3\tCleo Brown\tThe Stuff Is Here And It's Mellow\tDECCA\t410B\t39398\t1935\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW147706-2.mp3\tLeo Reisman & His Orch\tThe Sun Is At My Window\tCOLUMBIA\t1702 D\tW147706-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC018336.mp3\tLionel Hampton & His Orch\tThe Sun Will Shine Tonight\tVICTOR\t25771\t018336\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic018336-2.mp3\tLionel Hampton And His Orchestra\tThe Sun Will Shine Tonight\tVictor\t25771\t018336-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23184-1.mp3\tRed Norvo & His Orch\tThe Sunny Side Of Things (v M. Bailey)\tBRUNSWICK\t8182\t23184-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC64622x.mp3\tJohn Mccormack\tThe Sunshine Of Your Smile\tVICTOR\t64622\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_004.mp3\tJohn Mccormack\tThe Sunshine Of Your Smile\tVICTOR\t64622\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_160.mp3\tAlfred Drake Feat. Jay Blacktop (director)\tThe Surrey With The Fringe On Top\tDecca\t23284\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh070.mp3\tMaurice Winnick And His Orchestra\tThe Sweetest Music This Side Of Heaven (v Sam Costa & Judy Shirley)\tParlophone\tF-321\tCE-7250-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp37/DECDLA1317A.mp3\tTed Lewis And His Orchestra\tThe Sweetheart Of Sigma Chi\tDECCA\t23919 B\tDLA1317A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW147632-2.mp3\tCelestin's Tuxedo Orch\tThe Sweetheart Of T.k.o.\tCOLUMBIA\t14396 D\tW147632-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA67-B.mp3\tBing Crosby W George Stoll\tThe Sweetheart Waltz\tDECCA\t245B\tDLA67-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA67-B.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tThe Sweethearts Waltz\tDecca\t\tDLA67-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA67-C.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tThe Sweethearts Waltz\tDecca\tY5106\tDLA67-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99364.mp3\tBoots And His Buddies\tThe Swing\tBLUEBIRD\t6333\t99364\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic010572-1.mp3\tMezz Mezzrow And His Orchestra\tThe Swing Session Is Called To\tVictor\t25612\t010572-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO33317.mp3\tFrankie Laine - Paul Weston\tThe Tarrier Song\tCOLUMBIA\t40433\tRHCO33317\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_231.mp3\tEddy Howard And His Orchestra\tThe Teen-ager's Waltz\tMercury\t70700\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/MER3952-2.mp3\tPatti Page W Jack Rael Orch\tThe Tennessee Waltz\tMERCURY\t5544\t3952-2\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/Gre3935.mp3\tCliff Jackson And His Krazy Kats\tThe Terror\tGrey Gull\t1879\t3935\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3968x.mp3\tPhil Harris\tThe Thing\tRCA\t20-3968\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_010.mp3\tPhil Harris\tThe Thing\tRCA\t20-3968\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_319.mp3\tAmes Brothers Feat. O/roy Ross\tThe Thing\tCORAL\t60333\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_255.mp3\tArthur Godfrey\tThe Thing\tCOLUMBIA\t919\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_147.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tThe Things I Didn't Do\tRCA Victor\t5857\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68832.mp3\tJimmy Dorsey And His Orch.\tThe Things I Love\tDECCA\t3737A\t68832\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_059.mp3\tJimmy Dorsey And His Orchestra\tThe Things I Love\tDECCA\t3737A\t68832\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CON29923-1.mp3\tGene Krupa & His Orch\tThe Things I Love (v H. Dulany)\tCONQUEROR\t9616\t29923-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_243.mp3\tKitty Wells\tThe Things I Might Have Been\tDECCA\t28525\t83418\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_471.mp3\tKay Starr\tThe Things I Never Had\tRCA\t6617\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011095.mp3\tTommy Dorsey & His Orch\tThe Things I Want\tVICTOR\t25623\t011095\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/PER108763-1.mp3\tTen Freshmen\tThe Things That Were Made For Love\tPERFECT\t15163\t108763-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_137.mp3\tJo Stafford\tThe Things We Did Last Summer\tCapitol\t297\t1220\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/LON536.mp3\tAnton Karas\tThe Third Man Theme\tLONDON\t536\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_003.mp3\tAnton Karas\tThe Third Man Theme\tLONDON\t536\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_244.mp3\tOwen Bradley And His Quintet\tThe Third Man Theme\tCoral\t60159\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_354.mp3\tJohnny Mercer\tThe Thousand Islands Song\tCapitol\t15028\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_254.mp3\tArthur Godfrey\tThe Thousand Islands Song\tCOLUMBIA\t38081\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3476-A.mp3\tBing Crosby & Andrews Sisters\tThe Three Caballeros\tDECCA\t23364\tL3476-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_235.mp3\tAl Jazzbo Collins\tThe Three Little Pigs\tBrunswick\t86001\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC70159-1.mp3\tRudy Vallee & His Ct.yankees\tThe Thrill Is Gone\tVICTOR\t22784\t70159-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_127.mp3\tRudy Vallee And His Connecticut Yankees\tThe Thrill Is Gone\tVICTOR\t22784\t70159-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1890_003.mp3\tU.s. Marine Band\tThe Thunderer\tCOLUMBIA\t\t\t1890\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_074.mp3\tKay Kyser And His Orchestra\tThe Tinkle Song\tCBS\tBR8377\t24456\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14386-1.mp3\tLeo Reisman And His Orch (vaw)\tThe Touch Of Your Hand\tBRUNSWICK\t6715\t14386-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA308.mp3\tBing Crosby & Victor Young\tThe Touch Of Your Lips\tDECCA\t757A\tDLA308\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18764.mp3\tHal Kemp And His Orch\tThe Touch Of Your Lips\tBRUNSWICK\t7626\t18764\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99902-1.mp3\tRay Noble & His Orch\tThe Touch Of Your Lips\tVICTOR\t25277\t99902-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU101132-1.mp3\tStew Pletcher And His Orchestra\tThe Touch Of Your Lips\tBLUEBIRD\t6345\t101132-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh032.mp3\tCarroll Gibbons\tThe Touch Of Your Lips\tColumbia\tFB-1401\tCA-15740-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480393.mp3\tBen Webster And Oscar Peterson\tThe Touch Of Your Lips\tVerve\tMGV8349\t22991-4\t1959\tBen Webster (ts), Oscar Peterson, P, Ed Thigpen, D, Ray Brown, B\nhttp://www.jazz-on-line.com/a/mp3t/TS480491.mp3\tArt Farmer Quintet\tThe Touch Of Your Lips\tUnited Artists\tUAL4007\t\t1958\tArt Farmer, T, Flh, Benny Golson, Ts, Addison Farmer, B, Bill Evans, P, Dave Bailey, D, Gigi Gryce, Ar\nhttp://www.jazz-on-line.com/a/mp3w/1913_092.mp3\tElsie Baker And James F. Harrison\tThe Trail Of The Lonesome Pine\tVICTOR\t17338\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_008.mp3\tHenry Burr And Albert Campbell\tThe Trail Of The Lonesome Pine\tCOLUMBIA\t1315\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_092.mp3\tElsie Baker And James F. Harrison\tThe Trail Of The Lonesome Pine\tVICTOR\t17338\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D115B.mp3\tBill Boyd And His Cowboy Ramblers\tThe Train Song\tV-DISC\t115B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP168x.mp3\tPied Pipers\tThe Trolley Song\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_040.mp3\tJudy Garland\tThe Trolley Song\tDECCA\t23361\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D316A2.mp3\tJune Hutton And The Pied Pipers\tThe Trolly Song\tV-DISC\t316A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_432.mp3\tLes Baxter And His Orchestra\tThe Trouble With Harry\tCapitol\t3291\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_257.mp3\tAlfi And Harry\tThe Trouble With Harry\tLiberty\t55008\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA-1135-A.mp3\tLouis Armstrong And His Orchestra\tThe Trumpet Player's Lament\tDecca\t1653\tDLA-1135-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU48334-1.mp3\tKing Oliver & His Orch\tThe Trumpet's Prayer\tBLUEBIRD\t7705\t48334-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1931_0327_02.mp3\tLee Morse And Her Bluegrass Boys\tThe Tune That Never Grows Old\tColumbia\t2436DB\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc23937-1.mp3\tJohn Kirby And His Orchestra\tThe Turf\tVocalion\t4653\t23937-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC9671.mp3\tKokomo Arnold\tThe Twelves\tDECCA\t7083\tC9671\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68622.mp3\tLouis Jordan & His Tympani 5\tThe Two Little Squirrels\tDECCA\t8537\t68622\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_180.mp3\tLeroy Anderson And His \"pops\" Concert Orchestra\tThe Typewriter\tDecca\t28881\t85198\t1953\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC85198.mp3\tLeroy Anderson Pops Concert Or\tThe Typewriter\tDECCA\t28881\t85198\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS23404.mp3\tKay Kyser And His Orchestra\tThe Umbrella Man\tCBS\tBR8225\t23404\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26117.mp3\tSwing & Sway With Sammy Kaye\tThe Umbrella Man\tVictor\t26117\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_019.mp3\tKay Kyser And His Orchestra\tThe Umbrella Man\tCBS\tBR8225\t23404\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU99362.mp3\tBoots And His Buddies\tThe Vamp\tBLUEBIRD\t6333\t99362\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_090.mp3\tWaldorf-astoria Dance Orchestra With Irving And Jack Kaufman\tThe Vamp\tColumbia\t2758\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20875-A.mp3\tGeorge Olsen And His Music\tThe Varsity Drag\tVictor\t20875-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP2261.mp3\tBenny Goodman Sextet\tThe Varsity Drag\tCAPITOL\t\t2261\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_189.mp3\tCass Hagan And His Orchestra With Red Nichols\tThe Varsity Drag\tCOLUMBIA\t1114 D\tW144617-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO343.mp3\tRay Noble And His Orch\tThe Very Thought Of You\tCOLUMBIA\t37542\tHCO343\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D332VT.mp3\tGene Krupa & His Orch\tThe Very Thought Of You\tV-DISC\t332\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1044.mp3\tLuis Russell & His Orch\tThe Very Thought Of You\tAPOLLO\t1012\tR1044\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu57657.mp3\tBenny Carter & His Orch\tThe Very Thought Of You\tBluebird\t10962\t57657\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC3110B.mp3\tCarmen Cavallaro (piano And Acc)\tThe Very Thought Of You\tDECCA\t3110B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA65-A.mp3\tBing Crosby W George Stoll\tThe Very Thought Of You\tDECCA\t179B\tDLA65-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D332A.mp3\tGene Krupa And His New Orchestra (lillian Lane Voc.)\tThe Very Thought Of You\tV-DISC\t332A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu057657-1.mp3\tBenny Carter And His Orchestra\tThe Very Thought Of You\tBluebird\tB-10962\t057657-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA65-B.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tThe Very Thought Of You\tDecca\t179\tDLA65-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA65-A.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tThe Very Thought Of You\tDecca\t179\tDLA65-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_006.mp3\tRay Noble And His Orchestra\tThe Very Thought Of You\tVictor\t24657\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/HITT444-2.mp3\tLouis Prima & His Orch\tThe Very Thought Of You (v L P)\tHIT OF THE WEEK\t7109b\tT444-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU17703-4.mp3\tSix Jumping Jacks\tThe Village Blacksmith Owns The Village Now\tBRUNSWICK\t3064\t17703-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_116.mp3\tCal Stewart And Byron G. Harlan\tThe Village Gossips\tVICTOR\t17854\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC10246-1.mp3\tCab Calloway & His Orch\tThe Viper's Drag\tDOMINO\t4686\t10246-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC72284.mp3\tPaul Whiteman & His Orch\tThe Voice In The Old Village Choir\tVICTOR\t22998\t72284\t1932\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480658.mp3\tWillie Bryant & His Orch.\tThe Voice Of Old Man River\tVictor\t25129\t92908-1\t1935\tWillie Bryant (ldr, speech), Otis Johnson, Richard Clark (tp), Edgar ?Pudding Head? Battle (tp, vtb), John Haughton, Robert Horton, George Matthews (tb), Glyn Paque (cl, as), Stanley Payne (as), Ben Webster, Johnny Russell (ts), Roger Ramirez (p), Arnold Adams (g), Ernest Hill (sb), Cozy Cole (dm)\nhttp://www.jazz-on-line.com/a/mp3c/BLU1567l.mp3\tBud Powell Modernists\tThe Wail\tBLUENOTE\t1567\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC41373-1.mp3\tCoon Sanders Nighthawk Orch\tThe Wail\tVICTOR\t21305B\t41373-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2411.mp3\tBing Crosby-jack Teagarden\tThe Waiter And The Porter & The Upstairs Maid\tDECCA\t3970A\tDLA2411\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC3979-1.mp3\tGene Krupa & His Orch\tThe Walls Keep Talking\tOKEH\t6438\tC3979-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_230.mp3\tJohnny Green And His Orchestra\tThe Waltz In Swing Time\tBRUNSWICK\t7716\tLA1139-D\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2057-A.mp3\tBing Crosby Paradise Isle Trio\tThe Waltz You Saved For Me\tDECCA\t3354B\tDLA2057-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_265.mp3\tWayne King And His Orchestra\tThe Waltz You Saved For Me\tDECCA\t29566\t87580\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh014.mp3\tRoy Fox And His Orchestra\tThe Wanderers (v Denny Dennis)\tHMV\tBD-5173\tOEA-4639-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC102-7.mp3\tBenny Goodman And His Sextet\tThe Wang Wang Blues\tCOLUMBIA\t36723\tC 102-7  (32593)\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC9526.mp3\tHenry Busse And His Orch\tThe Wang Wang Blues\tDECCA\t25015\tC9526\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Col148541-3.mp3\tFletcher Henderson And His Orchestra\tThe Wang-wang Blues\tColumbia\t1913-D\t148541-3  \t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57067-1.mp3\tMckinney's Cotton Pickers\tThe Way I Feel Today\tVICTOR\t38102B\t57067-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1134.mp3\tJohnny Green And His Orch\tThe Way You Look Tonight\tBRUNSWICK\t7717\tLA1134\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89025T.mp3\tStan Getz\tThe Way You Look Tonight\tMERCURY\t89025\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73649.mp3\tEddie Condon & His Orchestra\tThe Way You Look Tonight\tDECCA\t23721\t73649\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D116B2.mp3\tFrank Sinatra\tThe Way You Look Tonight\tV-DISC\t116B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20107-2.mp3\tTeddy Wilson And His Orchestra\tThe Way You Look Tonight\tBrunswick\t7762  \tB-20107-2  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA587-A.mp3\tVictor Young And His Orchestra With Dixie Lee Crosby, Vocal\tThe Way You Look Tonight\tDECCA\t23681B\tDLA587-A  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_196.mp3\tBenny Goodman Sextet Feat. Peggy Lee,v\tThe Way You Look Tonight\tCOLUMBIA\t36594\t32595-1\t1942\tLou McGarity (tb), Benny Goodman (cl), Mel Powell (cel), Tom Morgan (g), Sid Weiss (sb), Ralph Collier (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1956_198.mp3\tTex Ritter\tThe Wayward Wind\tCapitol\t3430\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_004.mp3\tGogi Grant O/buddy Bregman\tThe Wayward Wind\tEra\t1013 A\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC023291.mp3\tBunny Berigan And His Orch\tThe Wearin' Of The Green\tVICTOR\t25872B\t023291\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULAE597.mp3\tEarl Burtnett & His Orch\tThe Web Of Love\tBRUNSWICK\t4511\tLAE597\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_235.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra Feat. The Biltmore Trio\tThe Web Of Love\tBRUNSWICK\t4511\tLAE597\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_475.mp3\tChordettes\tThe Wedding\tCadence\t1273\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC12322-2.mp3\tAda Jones & Billy Murray\tThe Wedding Glide\tVICTOR\t17170\t12322-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_035.mp3\tAda Jones And Billy Murray\tThe Wedding Glide\tVICTOR\t17170\t12322-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75075.mp3\tAndrews Sisters (jenkins)\tThe Wedding Of Lili Marlene\tDECCA\t24705\t75075\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_194.mp3\tAndrews Sisters Feat. Gordon Jenkins And His Orchestra\tThe Wedding Of Lili Marlene\tDECCA\t24705\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480661.mp3\tCab Calloway And His Orchestra (with Ben Webster)\tThe Wedding Of Mr And Mrs Swing\tBrunswick\t7748\t19877-1\t1936\tShad Collins, Irving Randolph, Lammar Wright, tp; Claude Jones, Keg Johnson, De Priest Wheeler, tb; Garvin Bushell, Andrew Brown, cl, as; Ben Webster, Walter Thomas, ts; Bennie Payne, p; Morris White, g; Milt Hinton, b; Leroy Maxey, d; Cab Calloway, vocal\nhttp://www.jazz-on-line.com/a/mp3c/BRU19877-1.mp3\tCab Calloway & His Orch\tThe Wedding Of Mr. And Mrs. Swing\tBRUNSWICK\t7748\t19877-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_017.mp3\tArthur Collins And Byron Harlan\tThe Wedding Of Reuben And The Maid\tCOLUMBIA\t403\t791\t1901\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21957-A.mp3\tHorace Heidt And His Orch\tThe Wedding Of The Painted\tVictor\t21957-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148054-2.mp3\tLeo Reisman And His Orch\tThe Wedding Of The Painted Doll\tCOLUMBIA\t1780 D\tW148054-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_111.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra Feat. Paul Gibbons\tThe Wedding Of The Painted Doll\tBRUNSWICK\t4232\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh783B.mp3\tRay Starita And His Ambassadors Band\tThe Wedding Of The Painted Doll (v Betty Bolton)\tColumbia\t5380\tWA-8950-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU15437.mp3\tJack Hylton And His Orch\tThe Wedding Of The Rose\tBRUNSWICK\t6939\t15437\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_054.mp3\tHenry Burr And Albert Campbell\tThe Wedding Of The Sunshine And The Rose\tVICTOR\t17913\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_246.mp3\tAndrews Sisters And Carmen Miranda\tThe Wedding Samba\tDECCA\t24841\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480916.mp3\tCarmen Miranda, The Andrews Sisters And Vic Schoen's Orchestra\tThe Wedding Samba\tDECCA\t24841\tL5257\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU22407-2.mp3\tRed Norvo & His Orch\tThe Week End Of A Private Secretary\tBRUNSWICK\t8088\t22407-2\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC86148.mp3\tLouis Armstrong With\tThe Whiffenpoof Song\tDECCA\t29153\t86148\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D154B.mp3\tU.s. Coast Guard Band, 11th Naval District, Dir. B\tThe Whiffenpoof Song\tV-DISC\t154B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_255.mp3\tRudy Vallee And His Connecticut Yankees\tThe Whiffenpoof Song\tEnterprise\t181\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_217.mp3\tVaughn Deleath\tThe Whisper Song\tOkeh\t40814\t80697-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR392-Hx.mp3\tLou Gold And His Orch\tThe Whisper Song\tHarmony\t392-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1744.mp3\tSam Donohue & His Orch\tThe Whistler\tCAPITOL\t\t1744\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_072.mp3\tSam Donahue And His Orchestra Feat. Shirley Lloyd\tThe Whistler\tCapitol\t472\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/DOT15365-A.mp3\tJohnny Maddox And The Rhythmasters\tThe Whistlin' Piano Man\tDOT\t15365-A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1896_005.mp3\tGeorge W. Johnson\tThe Whistling Coon (1896)\tArcheophone\t2244\t\t1896\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068240.mp3\tGlenn Miller And His Orchestra\tThe White Cliffs Of Dover\tBLUEBIRD\t11397-A\t068240\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D373B2.mp3\tLouis Prima And His Orchestra\tThe White Cliffs Of Dover\tV-DISC\t373B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU11397-A.mp3\tGlenn Miller & His Orchestra\tThe White Cliffs Of Dover\tBLUEBIRD\t11397-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec04102tw.mp3\tJimmy Dorsey & His Orchestra\tThe White Cliffs Of Dover\tDecca\t04102\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D332B1.mp3\tJohnny Long And His Orchestra\tThe White Star Of Sigma Nu\tV-DISC\t332B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150158-3.mp3\tColumbia Photoplayers (selvin)\tThe Whole Darned Thing's For You\tCOLUMBIA\t2177 D\tW150158-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COL195092.mp3\tBen Selvin & His Orch\tThe Whole Darned Thing's For You\tCOLUMBIA\t4094X\t195092\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_064.mp3\tLes Brown And His Orchestra (vocal Doris Day)\tThe Whole World Is Singing My Song\tColumbia\t37066\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_174.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Carroll\tThe Whole World Is Singing My Song\tDECCA\t18917A\tL4249\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE30359-0.mp3\tSix Jumping Jacks\tThe Whoopee Hat Brigade (vts)\tBRUNSWICK\t4457\tE30359/0\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC023762.mp3\tFats Waller And His Rhythm\tThe Wide Open Spaces\tVICTOR\t26002\t023762\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400179-A.mp3\tJoe Venuti & Eddie Lang\tThe Wild Dog\tOKeh\t41025\t400179-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1942x.mp3\tHank Thompson\tThe Wild Side Of Life\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_333.mp3\tFreddie Fisher And His Orchestra\tThe Wild, Wild Women (are Making A Wild Man Of Me)\tDECCA\t1771A\tDLA1176-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S261.mp3\tBilly Eckstine\tThe Wildest Gal In Town\tMGM\t10069\t47S261\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_276.mp3\tBilly Eckstine Feat. O/hugo Winterhalter\tThe Wildest Gal In Town\tMGM\t10069\t47S261\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17630-31.mp3\tSix Jumping Jacks\tThe Wind Blew Through His Whiskers (vts)\tBRUNSWICK\t3031\t17630-31\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_174.mp3\tKay Kyser And His Orchestra\tThe Wise Old Owl\tCOLUMBIA\t36051\tHCO240\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_060.mp3\tAl Donahue And His Orchestra Feat. Dee Keating\tThe Wise Old Owl\tOKEH\t6037\t29440\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151792.mp3\tJoe Venuti's Rhythm Boys\tThe Wolf Wobble\tCOLUMBIA\t2589 D\tW151792\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_268.mp3\tTex Beneke And The Glenn Miller Orchestra Feat. The Crew Chiefs\tThe Woodchuck Song\tRCA Victor\t1951\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_058.mp3\tAndrews Sisters\tThe Woodpecker Song\tDECCA\t3065\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046739.mp3\tGlenn Miller And His Orchestra\tThe Woodpecker Song (vmarion Hutton)\tBLUEBIRD\t10598\t046739\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28864.mp3\tCab Calloway & His Orch\tThe Worker's Train\tOKEH\t5874\t28864\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE27617-1.mp3\tGene Krupa & His Orch\tThe World Is In My Arms (v Howard Dulany)\tOKEH\t5760\t27617-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC051877.mp3\tTommy Dorsey And His Orch\tThe World Is In My Arms (vfs)\tVICTOR\t26717\t051877\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeWC-3255-A.mp3\tCount Basie And His Orchestra\tThe World Is Mad - Part 1\tOkey\t5816\tWC-3255-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/OkeWC-3256-A.mp3\tCount Basie And His Orchestra\tThe World Is Mad - Part 2\tOkey\t5816\tWC-3256-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO13y.mp3\tFirehouse Five Plus Two\tThe World Is Waiting For Th\tGood Time Jazz\t13\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1748x.mp3\tLes Paul And Mary Ford\tThe World Is Waiting For The Sunrise\tCAPITOL\t1748\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_019.mp3\tIsham Jones And His Orchestra\tThe World Is Waiting For The Sunrise\tBrunswick\t2313\t8462\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42550.mp3\tAl Hibbler - Duke Ellington\tThe World Is Waiting For The Sunrise\tCOLUMBIA\t38789\tCO42550\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU8462.mp3\tIsham Jones & His Orch\tThe World Is Waiting For The Sunrise\tBRUNSWICK\t2313\t8462\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_283.mp3\tStan Freberg\tThe World Is Waiting For The Sunrise\tCapitol\t2279\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_014.mp3\tLes Paul And Mary Ford\tThe World Is Waiting For The Sunrise\tCAPITOL\t1748\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3l/COL80939.mp3\tPaul Specht And His Orchestra\tThe World Is Waiting For The Sunrise\tCOLUMBIA\tA-3870\t80939\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_042.mp3\tJohn Steel\tThe World Is Waiting For The Sunrise\tVictor\t18844\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480727.mp3\tJack Teagarden's Big Eight\tThe World Is Waiting For The Sunrise\tHRS\t2007\tR3415\t1940\tRex Stewart (co), Jack Teagarden (tb), Barney Bigard (cl), Ben Webster (ts), Billy Kyle (p), Brick Fleagle (g), Billy Taylor Sr. (sb), Dave Tough (dm)\nhttp://www.jazz-on-line.com/a/mp3e/BluBN-252-0.mp3\tSammy Benskin Trio\tThe World's Waiting For The Sunrise\tBlue Note\t522\tBN-252-0\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/PerA-169xx.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tThe Worm\tPerception\tPLP35-2\tA-169xx\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_198.mp3\tVernon Dalhart\tThe Wreck Of The Number Nine\tBRUNSWICK\t3470\tE21508\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70801.mp3\tMuggsy Spanier & His Orch.\tThe Wreck Of The Old 97\tDECCA\t4336B\t70801\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_036.mp3\tVernon Dalhart\tThe Wreck Of The Old 97\tBANNER\t1531\t5552\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_068.mp3\tVernon Dalhart\tThe Wreck Of The Shenandoah\tEDISON\tBA 5078\t10573\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042178.mp3\tCharlie Barnet & His Orch\tThe Wrong Idea\tBLUEBIRD\t10804\t042178\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64475.mp3\tMills Brothers\tThe Yam\tDECCA\t2008B\t64475\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64367.mp3\tJimmy Dorsey & His Orch.\tThe Yam\tDECCA\t2002B\t64367\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_173.mp3\tFred Astaire Feat. Ray Noble's Orchestra\tThe Yam\tBRUNSWICK\t8190\tLA1610-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC18913-B.mp3\tThe Virginians\tThe Yankee Doodle Blues\tVICTOR\t18913\t18913-B\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COL77956.mp3\tPeerless Quartet And Arthur Fields\tThe Yanks Are At It Again\tCOLUMBIA\tA-2620\t77956\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_125.mp3\tArthur Fields And Peerless Quartet\tThe Yanks Are At It Again\tColumbia\t2620\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3e/COL77723.mp3\tArthur Fields\tThe Yanks Started Yankin'\tCOLUMBIA\tA-2528\t77723\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_120.mp3\tStan Freberg\tThe Yellow Rose Of Texas\tCapitol\t3249\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_006.mp3\tMitch Miller Orchestra And Chorus\tThe Yellow Rose Of Texas\tColumbia\t40540 A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_027.mp3\tJohnny Desmond\tThe Yellow Rose Of Texas\tCoral\t61476\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_113.mp3\tDolly Dawn And Her Dawn Patrol\tThe You And Me That Used To Be\tVARIETY\tI557\tM448-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68530-A.mp3\tJan Savitt And His Orchestra\tThe Young Prince And The Young Princess\tDECCA\t3640B\t68530-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB3183.mp3\tRay Noble & His Orch\tThe Younger Generation\tVICTOR\t25020\tOB3183\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN311.mp3\tThelonious Monk Sextet\tThelonious\tBLUENOTE\tBN542A\tBN311\t1948\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol2644-D.mp3\tBob Miller's Orchestra\tThem Good Old Times\tColumbia\t2644-D\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152126-1.mp3\tBob Miller's Orch (selvin)\tThem Good Old Times (vbm) (vdr)\tCOLUMBIA\t2644 D\tW152126-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3l/KIR1143-C.mp3\tUniversity Six\tThem Rambling Blues\tKIRKEBY\tLI2270\t1143-C\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO3687.mp3\tTeddy Wilson And His Orchestra\tThem There Eyes\tCOLUMBIA\t36631\tCCO3687\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW24879.mp3\tBillie Holiday\tThem There Eyes\tCOLUMBIA\t37836\tW24879\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404872-C.mp3\tLouis Armstrong & His Orch\tThem There Eyes\tOKeh\t41501\t404872-C\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/JUB7007.mp3\tDon Byas Quintet\tThem There Eyes\tJUBILEE\tJAM903\t7007\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/SIGRHT3.mp3\tEddie Heywood & His Orch\tThem There Eyes\tSIGNATURE\t40001A\tRHT3\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17130H.mp3\tThe Dutch Swing College Band\tThem There Eyes\tPhilips\tP17130H\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC91696.mp3\tBob Crosby And His Orch\tThem There Eyes\tDECCA\t2537B\tC91696\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC4211hpp.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tThem There Eyes\tDECCA\tF-6899\t4211hpp\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_211.mp3\tChamp Butler\tThem There Eyes\tCOLUMBIA\t39434\tHCO4488\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_089.mp3\tGus Arnheim And His Orchestra Feat. Bing Crosby And The Rhythm Boys\tThem There Eyes\tVictor\t22580\tPBVE61057-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC61057-3.mp3\tGus Arnheim Coconut Grove Orch\tThem There Eyes (vrhythm Boys)\tVICTOR\t22580B\t61057-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/MajT-879.mp3\tJimmie Lunceford And His Orchestra\tThem Who Has Gets\tMajestic\t1077\tT-879\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143583-2.mp3\tBessie Smith\tThem's Graveyard Words\tCOLUMBIA\t14209 D\tW143583-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D235A1.mp3\tHarry Horlick And His Orchestra\tTheme\tV-DISC\t235A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D334B1.mp3\tDavid Rose And His Orchestra\tTheme\tV-DISC\t334B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_393.mp3\tDick Jacobs And His Chorus And Orchestra\tTheme From East Of Eden\tCoral\t61692\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3h/COLRZSP10876.mp3\tPete Rugolo And His Orchestra\tTheme From The Lombardo Ending (based On ''filii Mi Boni Belli'' From Chamberlain's ''umbrella Suite\tCOLUMBIA\t40369\tRZSP 10876\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_386.mp3\tLionel Newman And His Orchestra\tTheme From The Proud Ones\tColumbia\t40717\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_492.mp3\tLeroy Holmes And His Orchestra\tTheme From The Proud Ones\tMGM\t12275\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_235.mp3\tNelson Riddle And His Orchestra\tTheme From The Proud Ones\tCapitol\t3472\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98392.mp3\tTommy Dorsey & His Clambake 7\tThen I Shan't Love You Anymore\tVICTOR\t25214\t98392\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_305.mp3\tEddy Arnold\tThen I Turned And Walked Slowly Away\tRCA Victor\t3174\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS6297-4.mp3\tFletcher Henderson & His Orch\tThen I'll Be Happy\tCBS\tBA1654\t6297-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW26999-A.mp3\tJohn Kirby & His Orch\tThen I'll Be Happy\tCOLUMBIA\t35999\tW26999-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR141306-1.mp3\tUniversity Six\tThen I'll Be Happy\tHARMONY\t71-H\t141306-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15531-A.mp3\tFreddy Martin And His Orch\tThen I'll Be Tired Of You\tBRUNSWICK\t6948\t15531-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC84106-1.mp3\tFats Waller And His Rhythm\tThen I'll Be Tired Of You\tVICTOR\t24708\t84106-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84106-1.mp3\tFats Waller And His Rhythm\tThen I'll Be Tired Of You\tVictor\t24708\t84106-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC38520.mp3\tIsham Jones And His Orchestra\tThen I'll Be Tired Of You - Vocal Joe Martin\tDecca\t171\t38520\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC58547-1.mp3\tMckinney's Cotton Pickers\tThen Someone's In Love\tVICTOR\t38142\t58547-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_036.mp3\tHenry Burr\tThen You'll Remember Me\tColumbia\t615\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU76877.mp3\tJimmie Davis\tThere Ain't Gonna Be An After Awhile\tBLUEBIRD\t5570\t76877\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63251.mp3\tBob Howard & His Orch\tThere Ain't Gonna Be No Doggone Afterwhile\tDECCA\t1721A\t63251\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/REG8181-A.mp3\tHollywood Dance Orch\tThere Ain't No Maybe In My\tRegal\t8181-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE20922.mp3\tHarry Archer & His Orch\tThere Ain't No Maybe In My Baby's Eyes\tBRUNSWICK\t3399\tE20922\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC36582-2.mp3\tJan Garber & His Orch\tThere Ain't No Maybe In My Baby's Eyes\tVICTOR\t20336\t36582-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI11649.mp3\tAl Lynn's Music Makers\tThere Ain't No Maybe In My Baby's Eyes\tEDISON\t52004\t11649\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142952.mp3\tPaul Ash And His Orchestra\tThere Ain't No Maybe In My Baby's Eyes\tCOLUMBIA\t839 D\tW142952\t1926\tJohn Valentine, John Linn, tp, Roscoe Lantz, trombone, Phil Wing & Herbert \"Putty\" Nettle,clarinet,al sax, Howard Grantham, cl, tn sax, Harry Barris, p, Paul Ash, vio, Julian Davidson,bj, Pierre Olker,br bass, Arthur Layfield, drums, v the foursome\nhttp://www.jazz-on-line.com/a/mp3c/VIC41681-2.mp3\tPaul Whiteman & His Orch\tThere Ain't No Sweet Man Worth The Salt Of My Tear\tVICTOR\t25675B\t41681-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC41681-3.mp3\tPaul Whiteman And His Orch\tThere Ain't No Sweet Man Worth The Salt Of My Tear\tVICTOR\t21464\t41681-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/BlaP-133-1.mp3\tBlack Swan Dance Orchestra\tThere Aint No Nothin (gonna Take The Place Of You)\tBlack Swan\t2014\tP-133-1\t1921\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D305B1.mp3\tWoody Herman And His Orchestra\tThere Are No Wings On A Foxhole\tV-DISC\t305B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC075400.mp3\tTommy Dorsey And His Orch\tThere Are Such Things\tVICTOR\t27974\t075400\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC407.mp3\tBilly Eckstine\tThere Are Such Things\tNATIONAL\t\tNSC407\t1948\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC27974.mp3\tTommy Dorsey And His Orchestra\tThere Are Such Things\tVICTOR\t27974\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_004.mp3\tTommy Dorsey And His Orchestra Feat. Frank Sinatra And Pied Pipers\tThere Are Such Things\tVICTOR\t27974\t075400\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC102403.mp3\tFats Waller And His Rhythm\tThere Goes My Attraction\tVICTOR\t25388\t102403\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38642.mp3\tMills Brothers\tThere Goes My Headache\tDECCA\t380B\t38642\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3539.mp3\tRuss Morgan And His Orchestra\tThere Goes That Song Again\tDECCA\t18625\tL3539\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D347B1.mp3\tHarry James And His Orchestra (kitty Kalen Voc.)\tThere Goes That Song Again\tV-DISC\t347B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH0333.mp3\tDick Jurgens And His Orch\tThere Goes That Song Again\tOKEH\t6331\tH0333\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/F505018204O.mp3\tSammy Kaye (nancy Norman Voc)\tThere Goes That Song Again\tCOLUMBIA\t35958\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_175.mp3\tKate Smith\tThere Goes That Song Again\tCOLUMBIA\t36759\tCO33814-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_086.mp3\tKay Kyser And His Orchestra\tThere Goes That Song Again\tCOLUMBIA\t36757\tHCO1120\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_034.mp3\tRuss Morgan And His Orchestra\tThere Goes That Song Again\tDECCA\t18625\tL3539\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_142.mp3\tBilly Butterfield And His Orchestra Feat. Margaret Whiting\tThere Goes That Song Again\tCAPITOL\t182\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COL28655-1.mp3\tWill Bradley & His Orch\tThere I Go\tCOLUMBIA\t35743\t28655-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68230.mp3\tWoody Herman & His Orchestra\tThere I Go\tDECCA\t3454A\t68230\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_097.mp3\tWoody Herman And His Orchestra\tThere I Go\tDECCA\t3454A\t68230\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_128.mp3\tKenny Baker\tThere I Go\tVICTOR\t27207\t057053\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_042.mp3\tWill Bradley And His Orchestra\tThere I Go\tCOLUMBIA\t35743\t28655-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU055526-1.mp3\tVaughn Monroe And His Orchestra\tThere I Go (vvm)\tBLUEBIRD\t10848\t055526-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC50934-2.mp3\tNat Shilkret Trio\tThere Is A Happy Land\tVICTOR\t21913\t50934-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO36904.mp3\tGene Krupa & His Orch\tThere Is No Breeze To Cool The Flame Of Love\tCOLUMBIA\t37158\tCO36904\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL427.mp3\tErroll Garner Trio\tThere Is No Greater Love\tATLANTIC\t673\t427\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67918-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tThere Is No Greater Love\tDecca\t3350\t67918-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0123_02.mp3\tLee Morse And Her Bluegrass Boys\tThere Must Be A Silver Lining\tColumbia\t1303DB\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR145559-2.mp3\tNewport Society Orch\tThere Must Be A Silver Lining (vlj)\tHARMONY\t579-H\t145559-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75677.mp3\tArtie Shaw And His Gramercy Five\tThere Must Be Something Better Than Love\tDECCA\t24870\t75677\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC81288.mp3\tElla Fitzgerald\tThere Never Was A Baby\tDECCA\t27724\t81288\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_165.mp3\tPerry Como Feat. O/hugo Winterhalter\tThere Never Was A Night So Beautiful\tRCA Victor\t5749\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC053427.mp3\tDuke Ellington & His Orch\tThere Shall Be No Night\tVICTOR\t26748\t053427\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_194.mp3\tBetty Madigan\tThere Should Be Rules (protecting Fools Who Fall In Love)\tMGM\t12094\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC84256.mp3\tWebb Pierce\tThere Stands The Glass\tDECCA\t28834\t84256\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75755.mp3\tLionel Hampton's Quintet\tThere Will Never Be Another You\tDECCA\t27198\t75755\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec75755.mp3\tLionel Hampton And His Quintet\tThere Will Never Be Another You\tDecca\t27198\t75755\t1950\t\nhttp://www.jazz-on-line.com/mp3/204710960.mp3\tVaughn Monroe\tThere! I've Said It Again\tRCA\t20-1637\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_093.mp3\tJimmy Dorsey And His Orchestra Feat. Teddy Waiters\tThere! I've Said It Again\tDECCA\t18670B\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143570-2.mp3\tBessie Smith\tThere'll Be A Hot Time In Old Town Tonight\tCOLUMBIA\t14219 D\tW143570-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149279-1.mp3\tGid Tanner's Skillet Lickers\tThere'll Be A Hot Time In The Old Town Tonight\tCOLUMBIA\t15695 D\tW149279-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D337A2.mp3\t Bing Crosby And The Andrews Sisters\tThere'll Be A Hot Time In The Town Of Berlin\tV-DISC\t337A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC3354.mp3\tCarter Family\tThere'll Be No Distinction There\tOKEH\t5982\tC3354\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_049.mp3\tTony Bennett\tThere'll Be No Teardrops Tonight\tCOLUMBIA\t40169\tCO50410\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA1947-A.mp3\tBenny Goodman And His Orchestra\tThere'll Be Some Changes Made\tCOLUMBIA\t35210\tLA1947-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW24228-1.mp3\tMildred Bailey & Her Orch\tThere'll Be Some Changes Made\tCOLUMBIA\t35943\tW24228-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU88996.mp3\tFats Waller And His Rhythm\tThere'll Be Some Changes Made\tBLUEBIRD\t10322\t88996\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU2651.mp3\tMarion Harris\tThere'll Be Some Changes Made\tBRUNSWICK\t2651\t-\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe81314-B.mp3\tSophie Tucker W Piano\tThere'll Be Some Changes Made\tOKeh\t40921\t81314-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC1885.mp3\tChicago Rhythm Kings\tThere'll Be Some Changes Made\tBRUNSWICK\t4001\tC1885\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU062749-1.mp3\tUna Mae Carlisle\tThere'll Be Some Changes Made\tBLUEBIRD\t11096\t062749-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66072-A.mp3\tEddie Condon's Chicagoans\tThere'll Be Some Changes Made\tDECCA\t18041A\t66072-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035034.mp3\tBunny Berigan & His Orch\tThere'll Be Some Changes Made\tVICTOR\t26244B\t035034\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/PARP0147.mp3\tEthel Waters\tThere'll Be Some Changes Made\tPARAMOUNT\t12170\tP0147\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81811-3.mp3\tTed Lewis & His Band\tThere'll Be Some Changes Made\tCOLUMBIA\t170D\t81811-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D268B2.mp3\tWoody Herman And His Orchestra\tThere'll Be Some Changes Made\tV-DISC\t268B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_320.mp3\tTed Weems And His Orchestra\tThere'll Be Some Changes Made\tDECCA\t3044B\t66723\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_051.mp3\tTed Lewis And His Band\tThere'll Be Some Changes Made\tCOLUMBIA\t170D\t81811-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_075.mp3\tMarion Harris\tThere'll Be Some Changes Made\tBRUNSWICK\t2651\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_194.mp3\tVaughn Monroe And His Orchestra\tThere'll Be Some Changes Made\tBLUEBIRD\t11025\t060317-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_052.mp3\tEthel Waters\tThere'll Be Some Changes Made\tPARAMOUNT\t12170\tP0147\t1922\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-130-2.mp3\tBenny Carter And His Swing Quintet\tThere'll Be Some Changes Made\tVocalion\tS-46\tS-130-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480696.mp3\tBenny Goodman Trio\tThere'll Be Some Changes Made\tCapitol\tT669\t20333-5\t1954\tBenny Goodman (cl), Mel Powell (p), Eddie Grady (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1941_053.mp3\tBenny Goodman And His Orchestra\tThere'll Be Some Changes Made\tCOLUMBIA\t35210\tLA1947-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC3528-2.mp3\tGene Krupa & His Orch\tThere'll Be Some Changes Made (v Irene Day)\tOKEH\t6021\tC3528-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP4762-3.mp3\tDixie Thumpers\tThere'll Come A Day\tPARAMOUNT\t12525\tP4762-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142657-3.mp3\tCharlie Poole's N.c.ramblers\tThere'll Come A Time\tCOLUMBIA\t15116 D\tW142657-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE27606.mp3\tRed Nichols & His 5 Pennies\tThere'll Come A Time (wait And See)\tBRUNSWICK\t6822\tE27606\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke6239.mp3\tGene Autry\tThere'll Never Be Another Pal Like You\tOkeh\t6239\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24177-1.mp3\tMildred Bailey W Red Norvo\tThere'll Never Be Another You\tVOCALION\t4738\t24177-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_112.mp3\tPerry Como\tThere'll Soon Be A Rainbow\tVICTOR\t1358\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_249.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tThere's A Big Blue Cloud (next To Heaven)\tRCA Victor\t4158\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18425-6.mp3\tAbe Lyman & His Orch\tThere's A Blueridge In My Heart, Virginia\tBRUNSWICK\t3139\t18425-6\t1926\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC18282B.mp3\tLeo Reisman & His Orch\tThere's A Boat Dat's Leavin' Soon For New York\tDECCA\t18282B\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC018423.mp3\tTommy Dorsey & His Orch\tThere's A Boy In Harlem\tVICTOR\t25799\t018423\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10382.mp3\tDesi Arnaz\tThere's A Brand New Baby\tCOLUMBIA\t39937\tHCO10382\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT531.mp3\tLouis Prima & His Orchestra\tThere's A Broken Heart For Every Light\tMAJESTIC\t7144\tT531\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_079.mp3\tElsie Baker\tThere's A Broken Heart For Every Light On Broadway\tVICTOR\t17943\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC78869-1.mp3\tCab Calloway & His Orchestra\tThere's A Cabin In The Cotton\tVICTOR\t24511\t78869-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic78869-1.mp3\tCab Calloway And His Cotton Club Orchestra\tThere's A Cabin In The Cotton\tVictor\t24511\t78869-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUB804.mp3\tBing Crosby\tThere's A Cabin In The Pines\tBRUNSWICK\t6610\tB804\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21015-A.mp3\tGene Austin\tThere's A Cradle In Carolin\tVictor\t21015-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_085.mp3\tGene Austin Feat. O/nat Shilkret\tThere's A Cradle In Caroline\tVictor\t21015-A\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC40539-2.mp3\tNat Shilkret And Victor Orch\tThere's A Cradle In Caroline (vjm)\tVICTOR\t21040A\t40539-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_295.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tThere's A Faraway Look In Your Eye\tDECCA\t1834B\t63787\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3684.mp3\tBing Crosby & Andrew Sisters\tThere's A Fellow Waiting In Poughkeepsie\tDECCA\t23379\tL3684\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D69B.mp3\tTommy Tucker Time\tThere's A Flame Still Burning\tv-disk\t69B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_033.mp3\tHenry Burr And Andrea Sarto\tThere's A Girl In The Heart Of Maryland\tColumbia\t1360\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA1051-A.mp3\tBing Crosby And E. Dunstedter\tThere's A Gold Mine In The Sky\tDECCA\t1565\tDLA1051-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_093.mp3\tBing Crosby\tThere's A Gold Mine In The Sky\tDECCA\t2678B\tDLA1051-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/BruDLA1051-A.mp3\tBing Crosby And Eddie Dunstedter\tThere's A Goldmine In The Sky\tBrunswick\tE-02492  \tDLA1051-A  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS20761.mp3\tHenry Allen & His Orch\tThere's A Kitchen Up In Heaven\tCBS\tVO3490\t20761\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35589-B.mp3\tVictor Military Band\tThere's A Little Bit Of Bad\tVictor\t35589-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI7648-C.mp3\tAileen Stanley - O\tThere's A Little Bit Of Irish In Us All\tEDISON\tBA 4266\t7648-C\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL360.mp3\tHi-flyers\tThere's A Little Green Mill\tVOCALION\t3619\tDAL360\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_023.mp3\tHenry Burr\tThere's A Little Lane Without A Turning\tVictor\t17878\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_023alt.mp3\tHenry Burr\tThere's A Little Lane Without A Turning (1915)\tCOLUMBIA\t1791\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_102.mp3\tHenry Burr\tThere's A Little Spark Of Love Still Burning\tVictor\t17697\t15282-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR30006-B.mp3\tRoyden D. Massey\tThere's A Long, Long Trail\tParamount\t30006-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC16575-1.mp3\tJames Harrison-james Reed\tThere's A Long, Long Trail\tVICTOR\t17882\t16575-1\t1915\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA1791.mp3\tHerbert Stewart & Billy Burton\tThere's A Long, Long Trail\tColumbia\tA1791\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_031.mp3\tJames F. Harrison And James Reed\tThere's A Long, Long Trail\tVICTOR\t17882\t16575-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1306-A.mp3\tAlice Faye Orchestra Under Direction Of Cy Feuer\tThere's A Lull In My Life\tBRUNSWICK\t7876\tLA1306-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU21034-1.mp3\tTeddy Wilson And His Orch\tThere's A Lull In My Life\tBRUNSWICK\t7884\t21034-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1858.mp3\tMildred Bailey & Her Orchestra\tThere's A Lull In My Life\tVOCALION\t3508\tC1858\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_036.mp3\tTeddy Wilson And His Orchestra\tThere's A Lull In My Life\tBRUNSWICK\t7884\t21034-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_209.mp3\tDuke Ellington And His Famous Orchestra Feat. Ivie Anderson\tThere's A Lull In My Life\tMASTER\t117\tM379\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_364.mp3\tAlice Faye Feat. Cy Fever And His Orchestra\tThere's A Lull In My Life\tBRUNSWICK\t7876\tLA1306-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_100.mp3\tMarion Harris\tThere's A Lump Of Sugar Down In Dixie\tVICTOR\t18482\t21994-4\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC21994-4.mp3\tMarion Harris\tThere's A Lump Of Sugar Down In Dixieland\tVICTOR\t18482\t21994-4\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1888-4.mp3\tSweet Violet Boys\tThere's A Man That Comes To Our House\tVOCALION\t3766\tC1888-4\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152360-1.mp3\tTed Lewis And His Band\tThere's A New Day Comin'\tCOLUMBIA\t2753 D\tW152360-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_135.mp3\tTed Lewis And His Band\tThere's A New Day Comin'\tCOLUMBIA\t2753 D\tW152360-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/CROC1999-2.mp3\tSam Ross Silvertown Orch\tThere's A New Day Comin' (vtrio(larry,tom,larry)\tCROWN\t3455\tC1999-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP174x.mp3\tTex Ritter\tThere's A New Moon Over My Shoulder\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_212.mp3\tTex Ritter\tThere's A New Moon Over My Shoulder\tCapitol\t174\t115-A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU22240.mp3\tArtie Shaw And His New Music\tThere's A New Moon Over The Mill\tBRUNSWICK\t8054\tB-22240-1\t1937\t\n\tAngelina Marco\tThere's A New Star In Heave\tHarmony\t240-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_037.mp3\tVernon Dalhart\tThere's A New Star In Heaven Tonight\tCOLUMBIA\t718 D\tW142578\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_011.mp3\tHenry Burr And Albert Campbell\tThere's A Quaker Down In Quaker Town\tVICTOR\t18034\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE249.mp3\tAl Jolson\tThere's A Rainbow 'round My Shoulder\tBRUNSWICK\t4033\tLAE249\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47391.mp3\tFrankie Laine\tThere's A Rainbow 'round My Shoulder\tCOLUMBIA\t39798\tCO47391\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4569.mp3\tAl Jolson - Morris Stoloff\tThere's A Rainbow Round My Shoulder\tDECCA\t24400\tL4569\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/SIL7624.mp3\tFletcher Henderson Orch\tThere's A Rickety Rackety Shack\tSILVERTONE\t1613\t7624\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban7624-1.mp3\tFletcher Henderson's Collegians\tThere's A Rickety Rackety Shack (by A Rickety Rackety Road)\tBanner\t6129\t7624-1  \t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA123.mp3\tSons Of The Pioneers\tThere's A Roundup In The Sky\tDECCA\t5083B\tDLA123\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB18811.mp3\tHal Kemp & His Orch\tThere's A Small Hotel\tCOLUMBIA\t35931\tB18811\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99878.mp3\tPaul Whiteman & His Orch\tThere's A Small Hotel\tVICTOR\t25270\t99878\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/MERC279.mp3\tColeman Hawkins & Allstars\tThere's A Small Hotel\tMERCURY\t8912\tC279\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/VocS-142-2.mp3\tBenny Carter And His Orchestra\tThere's A Small Hotel\tVocalion\tS-57\tS-142-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VocS-142-1.mp3\tBenny Carter And His Orchestra\tThere's A Small Hotel\tVocalion\tS-58\tS-142-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU9000x.mp3\tElton Britt\tThere's A Star Spangled Banner Waving Somewhere\tBLUEBIRD\t9000\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_102.mp3\tElton Britt\tThere's A Star Spangled Banner Waving Somewhere\tBLUEBIRD\t9000\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/CONM894.mp3\tCab Calloway & His Orch\tThere's A Sunny Side To Everything\tCONQUEROR\t9088\tM894\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-894-1.mp3\tCab Calloway And His Orchestra\tThere's A Sunny Side To Everything\tVocalion\t4411\tM-894-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE23517.mp3\tSix Jumping Jacks\tThere's A Trick In Pickin' A Chick Chick Chicken\tBRUNSWICK\t3582\tE23517\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38892-3.mp3\tNat Shilkret & Victor Orch\tThere's A Trick In Pickin' Chicken (vjm)\tVICTOR\t20759\t38892-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC5751-2.mp3\tIsham Jones And His Orch\tThere's A Wah Wah Girl In Agua Caliente\tBRUNSWICK\t4868\tC5751-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_184.mp3\tRudy Vallee And His Connecticut Yankees\tThere's Always A Happy Ending\tVICTOR\t25260\t99818\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_188.mp3\tGuy Mitchell\tThere's Always Room At Our House\tCOLUMBIA\t39595\tCO47089\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5229.mp3\tHerman Chittison Trio\tThere's Beauty Everywhere\tMUSICRAFT\t314\t5229\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA21-0412x.mp3\tEddy Arnold\tThere's Been A Change In Me\tRCA\t21-0412\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-31916-A.mp3\tLouisiana Rhythm Kings\tThere's Egypt In Your Dreamy\tBrunswick\t4923\tE-31916-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE31916.mp3\tLouisiana Rhythm Kings\tThere's Egypt In Your Dreamy Eyes\tBRUNSWICK\t4923\tE31916\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03248.mp3\tTommy Dorsey & His Orch\tThere's Frost On The Moon\tVICTOR\t25482\t03248\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_145.mp3\tArtie Shaw And His Orchestra\tThere's Frost On The Moon\tCBS\tBR7771\t20169\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_201.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tThere's Frost On The Moon\tVICTOR\t25482\t03248\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20169-1.mp3\tArtie Shaw And His Orchestra\tThere's Frost On The Moon (spring In My Heart)\tBRUNSWICK\t7771\tB-20169-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88994.mp3\tFats Waller And His Rhythm\tThere's Going To Be The Devil To Pay\tVICTOR\t25078\t88994\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18835A.mp3\tLucky Millinder Orch\tThere's Good Blues Tonight\tDECCA\t18835A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_277.mp3\tTommy Dorsey And His Orchestra Feat. Sy Oliver\tThere's Good Blues Tonight\tVICTOR\t1842\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC023760-1.mp3\tFats Waller And His Rhythm\tThere's Honey On The Moon Tonight\tVICTOR\t25891\t023760-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_184.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tThere's No Boat Like A Rowboat\tRCA Victor\t4158\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_301.mp3\tBing Crosby And Andrews Sisters And Dick Haymes\tThere's No Business Like Show Business\tDecca\t40039\tL4378\t1947\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC87097.mp3\tEthel Merman\tThere's No Business Like Show Business\tDECCA\t29379\t87097\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4378.mp3\tBing Crosby & Dick Haymes\tThere's No Business Like Show Business\tDECCA\t40039\tL4378\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN10712-3.mp3\tVincent Rose And His Orch\tThere's No Depression In Love (vsl)\tBANNER\t32236\t10712-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_269.mp3\tMills Brothers\tThere's No One But You\tDECCA\t18834A\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_232.mp3\tHal Mcintyre And His Orchestra\tThere's No One But You\tCosmo\t470\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC29840-3.mp3\tCoon-sanders Nighthawk Orch\tThere's No One Just Like You\tVICTOR\t19357\t29840-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC61135.mp3\tCarter Family\tThere's No One Like Mother To Me\tDECCA\t5242\t61135\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151790-1.mp3\tJoe Venuti's Rhythm Boys\tThere's No Other Girl\tCOLUMBIA\t2535 D\tW151790-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC025331.mp3\tTommy Dorsey & His Orch\tThere's No Place Like Your Arms\tVICTOR\t26030\t025331\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/RCAVI20-3582.mp3\tTony Martin\tThere's No Tomorrow\tRCA\t20-3582\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_021.mp3\tTony Martin\tThere's No Tomorrow\tRCA\t20-3582\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_085.mp3\tJo Stafford\tThere's No You\tCapitol\t191\t517\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D343B2.mp3\tUnited States Army Air Forces Band (glenn Darwin V\tThere's Nothing In Front Of The Infantry\tV-DISC\t343B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC72686-2.mp3\tAlex Bartha & His Orch\tThere's Oceans Of Love By The Beautiful Sea\tVICTOR\t24056\t72686-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC2233.mp3\tFletcher Henderson & His Orch\tThere's Rain In My Eyes\tVOCALION\t4167\tC2233\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-2233-1.mp3\tFletcher Henderson And His Orchestra\tThere's Rain In My Eyes\tVocalion\t4167\tC-2233-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-17797-1.mp3\tMills Blue Rhythm Band\tThere's Rhythm In Harlem\tColumbia\t3071-D\tCO-17797-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic64069-2.mp3\tBlanche Calloway And Her Joy Boys With Andy Kirk\tThere's Rhythm In The River\tVictor\t22641\t64069-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20167.mp3\tArtie Shaw And His Orchestra\tThere's Something In The Air\tBRUNSWICK\t7778\tB-20167-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_075.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. V/bob Goday\tThere's Something In The Air\tBluebird\t6683\t3210\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC71256.mp3\tLeo Reisman & His Orch\tThere's Something In Your Eyes (vfl)\tVICTOR\t22912\t71256\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20612-A.mp3\tJohnny Marvin\tThere's Something Nice Abou\tVictor\t20612-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC29756-3.mp3\tPaul Whiteman & His Orch\tThere's Yes Yes In Your Eyes (f T)\tVICTOR\t19309\t29756-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT524.mp3\tLouis Prima & His Orchestra\tThere, I've Said It Again\tMAJESTIC\t7140\tT524\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu060354-1.mp3\tBenny Carter And His Orchestra\tThere, I've Said It Again\tBluebird\tB-11090\t060354-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/CBS22460-2.mp3\tMildred Bailey & Red Norvo\tTheres A Boy In Harlem\tCBS\tBR8089\t22460-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68069.mp3\tDelmore Brothers\tTheres Trouble On My Mind\tDECCA\t5878\t68069\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh092.mp3\tLouis Levy And His Gaumont - British Symphony\tTheres That Look In Your Eyes Again (v  Janet Lind)\tColumbia\tFB-1651\tCA-16243-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18316-1.mp3\tTeddy Wilson & His Orch\tThese 'n That 'n Those\tBRUNSWICK\t7577\t18316-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU19496-2.mp3\tTeddy Wilson And His Orch\tThese Foolish Things\tBRUNSWICK\t7699\t19496-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26941.mp3\tBenny Goodman Sextet\tThese Foolish Things\tCOLUMBIA\t35553\t26941\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL124.mp3\tLester Young\tThese Foolish Things\tALLADDIN\t124\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19326.mp3\tCarroll Gibbons\tThese Foolish Things\tARC\tCO3136\t19326\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1060.mp3\tArtie Shaw And His Orchestra\tThese Foolish Things\tRCA\t20-1930\tD5VB1060\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS5027TF.mp3\tMary Lou Williams\tThese Foolish Things\tDISC\t5027\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CROBL14.mp3\tMildred Bailey\tThese Foolish Things\tCROWN\t104\tBL14\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44117.mp3\tEarl Hines\tThese Foolish Things\tCOLUMBIA\t39261\tCO44117\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5246.mp3\tHerman Chittison Trio\tThese Foolish Things\tMUSICRAFT\t323\t5246\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC90772-A.mp3\tJoe Sanders And His Orchestra\tThese Foolish Things\tDECCA\t843A\tC90772-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA416.mp3\tChuck Sims\tThese Foolish Things\tDECCA\t879A\tDLA416\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC61199-A.mp3\tBenny Fields\tThese Foolish Things\tDECCA\t849A\t61199-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA427.mp3\tVictor Young And His Orch\tThese Foolish Things\tDECCA\t865A\tDLA427\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3707.mp3\tBing Crosby\tThese Foolish Things\tDECCA\t18829B\tL3707\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_249.mp3\tJoe Sanders And His Orchestra\tThese Foolish Things\tDECCA\t843A\tC90772-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_116.mp3\tCarroll Gibbons And His Orchestra\tThese Foolish Things\tCOLUMBIA\t3136 D\t19326\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19496-2.mp3\tTeddy Wilson & His Orch\tThese Foolish Things (vb.holiday)\tARC\tBR7699\t19496-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC101256-4.mp3\tBenny Goodman And His Orchestra\tThese Foolish Things Remind Me Of You\tVICTOR\t25351\t101256-4\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19481.mp3\tBenny Carter & His Orch\tThese Foolish Things Remind Me Of You\tARC\tS-106\t19481\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25351.mp3\tBenny Goodman & His Orchestra\tThese Foolish Things Remind Me Of You\tVictor\t25351\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/COL29255-1.mp3\tBenny Goodman & His Orch\tThese Foolish Things You Left Me (vocal Helen Forrest)\tCOLUMBIA\t35910\t29255-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_437.mp3\tLes Dresslar\tThese Hands\tMercury\t70774\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO45192.mp3\tSarah Vaughan\tThese Things I Offer You\tCOLUMBIA\t39370\tCO45192\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_255.mp3\tPatti Page\tThese Things I Offer You\tMERCURY\t5645\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_141.mp3\tRay Anthony Feat. Tommy Mercer And The Skyliners\tThese Things I Offer You (for A Lifetime)\tCapitol\t1522\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC3531-1.mp3\tGene Krupa & His Orch\tThese Things You Left (v H. Dulany)\tOKEH\t6021\tC3531-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29253.mp3\tGinny Simms & Eddie South\tThese Things You Left Me\tOKEH\t5990\t29253\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_316.mp3\tBenny Goodman And His Orchestra Feat. V/helen Forrest\tThese Things You Left Me\tVICTOR\t25351\t101256-4\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC5549.mp3\tLucille Bogan\tThey Ain't Walking No More\tBRUNSWICK\t7163\tC5549\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_098.mp3\tAmerican Quartet\tThey All Had A Finger In The Pie\tVictor\t17704\t15450-3\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06619-2.mp3\tTommy Dorsey & His Orch\tThey All Laughed\tVICTOR\t25544\t06619-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_094.mp3\tFred Astaire Feat. Johnny Green And His Orchestra\tThey All Laughed\tBRUNSWICK\t7856\tLA1273-D\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_084.mp3\tAda Jones\tThey Always Pick On Me\tVICTOR\t17008\t11126-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26008-8.mp3\tPaul Whiteman & His Orch\tThey Call It Dancing\tVICTOR\t18856\t26008-8\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA61.mp3\tMae West\tThey Call Me Sister Honky Tonk\tBRUNSWICK\t6676\tLA61\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_317.mp3\tMariners\tThey Call The Wind Maria\tCOLUMBIA\t39568\tCO46889\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5647.mp3\tArtie Shaw And His Orchestra\tThey Can't Convince Me\tMUSICRAFT\t441\t5647\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS20920-1.mp3\tBillie Holiday\tThey Can't Take That Away From Me\tCBS\tVO3520\t20920-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1272.mp3\tFred Astaire\tThey Can't Take That Away From Me\tBRUNSWICK\t7855\tLA1272\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU06634.mp3\tOzzie Nelson & His Orch\tThey Can't Take That Away From Me\tBLUEBIRD\t6873\t06634\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06431.mp3\tTommy Dorsey & His Orch\tThey Can't Take That Away From Me\tVICTOR\t25549\t06431\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1076.mp3\tArtie Shaw And His Orchestra\tThey Can't Take That Away From Me\tRCA\t20-1743\tD5VB1076\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_204.mp3\tBillie Holiday\tThey Can't Take That Away From Me\tVOCALION\t3520\t20920-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_027.mp3\tFred Astaire Feat. Johnny Green And His Orchestra\tThey Can't Take That Away From Me\tBRUNSWICK\t7855\tLA1272\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_195.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tThey Can't Take That Away From Me\tVICTOR\t25549\t06431\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26461.mp3\tMildred Bailey\tThey Can't Take That From Me\tCBS\t(Reject)\t26461\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU02869.mp3\tTune Wranglers\tThey Cut Down The Old Pine Tree\tBLUEBIRD\t6692\t02869\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1089.mp3\tArtie Shaw And His Orchestra\tThey Didn't Believe Me\tRCA\t20-1931\tD5VB1089\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYHL81.mp3\tCozy Cole Allstars\tThey Didn't Believe Me\tKEYNOTE\t656\tHL81\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD142.mp3\tGeorgie Auld\tThey Didn't Believe Me\tDISC\t102\tD142\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8921TD.mp3\tOscar Peterson\tThey Didn't Believe Me\tMERCURY\t8921\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE30712.mp3\tRed Nichols & His Orch\tThey Didn't Believe Me (v S L)\tBRUNSWICK\t4651\tE30712\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC20213-2.mp3\tMarion Harris\tThey Go Wild, Simply Wild Over Me\tVICTOR\t18343\t20213-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_019.mp3\tMarion Harris\tThey Go Wild, Simply Wild, Over Me\tVICTOR\t18343\t20213-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-6052-A.mp3\tHorace Henderson And His Orchestra\tThey Jittered All The Time\tOKEH\t5579\tWC-6052-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D178A2.mp3\tKay Kyser And His Orchestra\tThey Just Chopped Down The Old Apple Tree\tV-DISC\t178A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149530-1.mp3\tWhistlin' Alex Moore\tThey May Not Be My Toes\tCOLUMBIA\t14596 D\tW149530-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/MER862-3.mp3\tHelen Humes\tThey Raided The Joint\tMERCURY\t8056\t862-3\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/MelE-35948-A.mp3\tMills Music Masters\tThey Satisfy ? V C L\tMelotone\tM-12091\tE-35948-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-10075-A.mp3\tArtie Shaw And His Orchestra\tThey Say\tBLUEBIRD\tB-10075-A\t030733-1\t1938\tVocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3w/1939_015.mp3\tArtie Shaw And His Orchestra\tThey Say\tBluebird\t10075\t030733-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23690-2.mp3\tTeddy Wilson & His Orch\tThey Say\tCBS\tBR8270\t23690-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23810-1.mp3\tMildred Bailey & Her Orchestra\tThey Say\tVOCALION\t4548\t23810-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23690-1.mp3\tTeddy Wilson And His Orchestra\tThey Say\tBrunswick\t8270\tB-23690-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1748.mp3\tFrank Sinatra\tThey Say It's Wonderful\tCOLUMBIA\t36975\tHCO1748\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3331-B.mp3\tDon Byas Quartet\tThey Say It's Wonderful\tSAVOY\t625A\tS3331-B\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC18829A.mp3\tBing Crosby\tThey Say It's Wonderful\tDECCA\t18829A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_126.mp3\tAndy Russell\tThey Say It's Wonderful\tCapitol\t252\t1020\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_024.mp3\tFrank Sinatra\tThey Say It's Wonderful\tCOLUMBIA\t36975\tHCO1748\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC93739-B.mp3\tFloyd Tillman\tThey Took The Stars Out Of Heaven\tDECCA\t6090\tC93739-B\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC21923-3.mp3\tBilly Murray\tThey Were All Out Of Step But Jim\tVICTOR\t18465\t21923-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_031.mp3\tBilly Murray\tThey Were All Out Of Step But Jim\tVICTOR\t18465\t21923-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-5767x.mp3\tVaughn Monroe\tThey Were Doing The Mambo\tRCA\t20-5767\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_119.mp3\tHenry Burr And Albert Campbell\tThey'll Be Mighty Proud In Dixie Of Their Old Black Joe\tCOLUMBIA\t2641\t78014\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM50S6064.mp3\tHank Williams\tThey'll Never Take Her Love From Me\tMGM\t10760\t50S6064\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D69A2.mp3\tTommy Tucker Time\tThey're Either Too Youn\tv-disk\t69A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3217.mp3\tJimmy Dorsey's Orch\tThey're Either Too Young Or Too Old\tDECCA\t18571A\tL3217\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC18571A.mp3\tJimmy Dorsey's Orchestra\tThey're Either Too Young Or Too Old\tDECCA\t18571A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_025.mp3\tJimmy Dorsey And His Orchestra Feat. Kitty Kallen\tThey're Either Too Young Or Too Old\tDECCA\t18571A\tL3217\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_017.mp3\tArthur Collins And Byron Harlan\tThey're Wearing 'em Higher In Hawaii\tVICTOR\t18210\t18768-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1608.mp3\tBing Crosby & J.s.trotter\tThine Alone\tDECCA\t2680B\tDLA1608\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68921-A.mp3\tSam Price And His Texas Blusican\tThings 'bout Coming My Way (sitting On Top)\tDECCA\t8557A\t68921-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU061348.mp3\tJohnny Hodges And His Orch\tThings Ain't What They Used To Be\tBLUEBIRD\t11447\t061348\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP866.mp3\tDuke Ellington Orch\tThings Ain't What They Used To Be\tV-DISC\t315\tVP866\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D315B.mp3\tDuke Ellington And His Orchestra\tThings Ain't What They Used To Be\tV-DISC\t315B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/HITCR356-3.mp3\tCootie Williams & His Orch\tThings Ain't What They Used To Be (v E V)\tHIT OF THE WEEK\t7084B\tCR356-3\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1466-B.mp3\tFred Astaire W Ray Noble Orch\tThings Are Looking Up\tBRUNSWICK\t7983\tLA1466-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1082.mp3\tArtie Shaw And His Orchestra\tThings Are Looking Up\tRCA\t20-1744\tD5VB1082\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYHL163.mp3\tBernie Leighton Qt\tThings Are Looking Up\tKEYNOTE\t643\tHL163\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_335.mp3\tFred Astaire Feat. Ray Noble's Orchestra\tThings Are Looking Up\tBrunswick\t7983\tLA1466-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142841.mp3\tArt Gillam\tThings That Remind Me Of You\tCOLUMBIA\t892 D\tW142841\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5611.mp3\tDizzy Gillespie And His Orch\tThings To Come\tMUSICRAFT\t447\t5611\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VEL2043-H.mp3\tGolden Gate Orch\tThings We Want The Most Are\tVelvet Tone\t2043-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU31204.mp3\tHerb Gordon Ten Eyck Hotel Or.\tThings We Want The Most Are Hard To Get\tBRUNSWICK\t4584\t31204\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_088.mp3\tByron G. Harlan\tThink It Over, Mary\tVICTOR\t16712\tB9635-2\t1911\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO29594-1.mp3\tWill Bradley And His Orch\tThink Of Me\tCOLUMBIA\t36101\tCO29594-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_117.mp3\tRoy Rogers\tThink Of Me\tDECCA\t6092\tDLA2958-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke26068-A.mp3\tJimmie Lunceford And His Orchestra\tThink Of Me, Little Daddy\tOkeh\t5207\t26068-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142377.mp3\tArt Gillam\tThinking\tCOLUMBIA\t710 D\tW142377\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68457.mp3\tSam Price's Texas Blusicians\tThinking\tDECCA\t8515\t68457\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145626-2.mp3\tBessie Smith\tThinking Blues\tCOLUMBIA\t14292 D\tW145626-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC27128x.mp3\tDon Cherry\tThinking Fo You\tDECCA\t27128\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3901x.mp3\tEddie Fisher\tThinking Of You\tRCA\t20-3901\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO44131.mp3\tSarah Vaughan\tThinking Of You\tCOLUMBIA\t38925\tCO44131\t1950\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20411.mp3\tGene Austin\tThinking Of You\tVictor\t20411\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_051.mp3\tRuth Etting\tThinking Of You\tCOLUMBIA\t827\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_050.mp3\tNat Shilkret And The Victor Orchestra\tThinking Of You\tVICTOR\t20996B\t40134-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_053.mp3\tEddie Fisher\tThinking Of You\tRCA VICTOR\t3901\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_043.mp3\tDon Cherry Feat. Dave Terry's Orchestra\tThinking Of You\tDECCA\t27128\t\t1950\taccompanied by Dave Terry's Orchestra featured in the film \"Three Little Words\"\nhttp://www.jazz-on-line.com/a/mp3w/1950_171_Sa.mp3\tSarah Vaughan\tThinking Of You\tCOLUMBIA\t38925\tCO44131\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_194.mp3\tBen Selvin And His Orchestra\tThinking Of You\tCOLUMBIA\t1164\tW144904-3\t1928\tfrom the Broadway musical \"The Five O'Clock Girl\"\nhttp://www.jazz-on-line.com/a/mp3a/COLB23941-1.mp3\tKay Kyser And His Orchestra\tThinking Of You (vhb)\tCOLUMBIA\t36106\tB23941-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC40134-2.mp3\tNat Shilkret And Victor Orch\tThinking Of You (vlj)\tVICTOR\t20996B\t40134-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24839x.mp3\tGuy Lombardo's Royal Canadians\tThird Man Theme\tDECCA\t24839\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUC3010-B.mp3\tWalter Barnes And His Royal Creolians\tThird Rail\tBRUNSWICK\t7072\tC3010-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64724-2.mp3\tBlind Willie Reynolds\tThird Street Woman Blues\tVICTOR\t23258\t64724-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_284.mp3\tAmes Brothers Feat. O/roy Ross\tThirsty For Your Kisses\tCoral\t60300\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP8071.mp3\tJelly Roll Morton\tThirty Fifth Street Blues\tPARAMOUNT\t12216\tP8071\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/MAN1005x.mp3\tDeel Watson\tThirty One Miles For A Nickel\tMANOR\t1005\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_325.mp3\tMindy Carson\tThis Above All\tCOLUMBIA\t40206\tCO50878\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC025901.mp3\tBenny Goodman And His Orchestra\tThis Can't Be Love\tVICTOR\t26099\t025901\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVBOP4522.mp3\tErroll Garner\tThis Can't Be Love\tSAVOY\t768\tBOP4522\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_032.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tThis Can't Be Love\tVICTOR\t26099\t025901\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_101.mp3\tHorace Heidt And His Brigadiers\tThis Can't Be Love\tBRUNSWICK\t8257\t23659B\t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480394.mp3\tArt Tatum And Buddy Rich & Lionel Hampton\tThis Can't Be Love\tPablo\t2310-775\t2382-2\t1955\tLionel Hampton (vib) Art Tatum (p) Buddy Rich (d)\nhttp://www.jazz-on-line.com/a/mp3t/TS480427.mp3\tArt Tatum/ Buddy Defranco Quartet\tThis Can't Be Love\tVerve\tMGV-8229\t2679-3\t1956\tBuddy De Franco (cl), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480573.mp3\tBen Webster And Oscar Peterson\tThis Can't Be Love\tVerve\tMGV8349\t22993-1\t1959\tOscar Peterson, P Ed Thigpen, D, Ray Brown, B\nhttp://www.jazz-on-line.com/a/mp3t/TS480650.mp3\tArt Tatum/buddy Defranco Quartet\tThis Can't Be Love\tVerve\tMGV-8229\t2679-3\t1956\tBuddy De Franco (cl), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480808.mp3\tThe Art Tatum Quartet\tThis Can't Be Love\tClef\tMGC 679\t2307-1\t1955\tRoy Eldridge (tp), Art Tatum (p), John Simmons (sb), Alvin Stoller (dm)\nhttp://www.jazz-on-line.com/a/mp3h/DH480917.mp3\tAndre Previn\tThis Can't Be Love\tRCA VICTOR\t20-3041\tD7VB1802\t1947\tAndre Previn, p; Al Viola, g; Lloyd Pratt, b; Jackie Mills, drums\nhttp://www.jazz-on-line.com/a/mp3b/DEC66898.mp3\tWoody Herman And His Orchestra\tThis Changing World\tDECCA\t2914A\t66898\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_167.mp3\tGlenn Miller And His Orchestra\tThis Changing World\tBLUEBIRD\t10526B\t043910\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043910.mp3\tGlenn Miller And His Orchestra\tThis Changing World (v R E)\tBLUEBIRD\t10526B\t043910\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA228.mp3\tAndy Iona & His Islanders\tThis Ginger Lei\tCOLUMBIA\t3137 D\tLA228\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D399B1b.mp3\tLouis Prima And His Orchestra (lily Ann Carol Voc.)\tThis Heart Of Mine\tV-DISC\t399B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_264.mp3\tJudy Garland - Victor Young\tThis Heart Of Mine\tDECCA\t18660A\tL3727\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/HITT477.mp3\tLouis Prima & His Orch\tThis Heart Of Mine (v L A C)\tHIT OF THE WEEK\t7117b\tT477\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5234-1.mp3\tTeddy Wilson Quintet\tThis Heart Of Mine (v Maxine Sullivan)\tMUSICRAFT\t317\t5234-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DIA1015.mp3\tCharlie Parker\tThis Is Always\tDIAL\t1015\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_156.mp3\tJo Stafford\tThis Is Always\tCAPITOL\t277\t1058\t1946\tfrom the film \"Three Little Girls in Blue\"\nhttp://www.jazz-on-line.com/a/mp3w/1946_136.mp3\tHarry James And His Orchestra\tThis Is Always\tCOLUMBIA\t37052\tHCO1826\t1946\tfrom the film \"Three Littel Girls in Blue\"\nhttp://www.jazz-on-line.com/a/mp3w/1953_193.mp3\tJulius Larosa\tThis Is Heaven\tCadence\t1230\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/APO1318.mp3\tJ.c.heard\tThis Is It\tAPOLLO\t783\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031868-1.mp3\tArtie Shaw And His Orchestra\tThis Is It\tBLUEBIRD\t10141\t031868-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC031800.mp3\tTommy Dorsey & His Orch\tThis Is It\tVICTOR\t26149\t031800\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_107.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tThis Is It\tVICTOR\t26149\t031800\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23454.mp3\tRed Norvo & His Orch\tThis Is Madness (v M. Bailey)\tBRUNSWICK\t8230\t23454\t\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK9055.mp3\tErroll Garner\tThis Is My Beloved\tKING\t4478\tK9055\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72750.mp3\tJimmie Lunceford And His Orchestra\tThis Is My Confession To You\tDecca\t24254\t72750\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1149.mp3\tBing Crosby - J Trotter Orch\tThis Is My Night To Dream\tDECCA\t1649\tDLA1149\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/BruDLA1149-B.mp3\tJohn Scott Trotter And His Orchestra\tThis Is My Night To Dream\tBrunswick\t\tDLA1149-B  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/BruDLA1149-A.mp3\tJohn Scott Trotter And His Orchestra\tThis Is My Night To Dream\tBrunswick\tE-02640  \tDLA1149-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_170.mp3\tPatti Page\tThis Is My Song\tMERCURY\t70183\tYB9567\t1953\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC055272.mp3\tLeo Reisman & His Orch\tThis Is New\tVICTOR\t27340\t055272\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035752-1.mp3\tTommy Dorsey & His Orch\tThis Is No Dream\tVICTOR\t26234\t035752-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_127.mp3\tTommy Dorsey And His Orchestra\tThis Is No Dream\tVICTOR\t26234\t035752-1\t1939\tvocal Jack Leonard\nhttp://www.jazz-on-line.com/a/mp3e/Blu36921.mp3\tCharlie Barnet & His Orch\tThis Is No Dream (v Judy Ellington)\tBluebird\t10273\t36921\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC4016-1.mp3\tCharlie Spivak & His Orch\tThis Is No Laughing Matter\tOKEH\t6458\tC4016-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec04102ti.mp3\tJimmy Dorsey & His Orchestra\tThis Is No Laughing Matter\tDecca\t04102\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_132.mp3\tJimmy Dorsey And His Orchestra\tThis Is No Laughing Matter\tDECCA\t4102A\t69992\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_054.mp3\tCharlie Spivak And His Orchestra\tThis Is No Laughing Matter\tOKEH\t6458\tC4016-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_111.mp3\tGlenn Miller And His Orchestra\tThis Is No Laughing Matter\tBLUEBIRD\t11369B\t071193\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071193.mp3\tGlenn Miller & His Orch\tThis Is No Laughing Matter (vre)\tBLUEBIRD\t11369B\t071193\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC15021.mp3\tCharlie Barnet & His Orch\tThis Is Our Last Night Together\tARC\tBA33029\t15021\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_159.mp3\tBen Bernie And His Orchestra\tThis Is Romance\tCOLUMBIA\t2820 D\tW152502-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1242-1.mp3\tGeorgie Auld Orch\tThis Is Romance\tVARSITY\t8159\tUS1242-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC055184-2.mp3\tArtie Shaw And His Orchestra\tThis Is Romance\tVICTOR\t27343\t055184-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055184-1.mp3\tArtie Shaw And His Orchestra\tThis Is Romance\tVictor\t27343\t055184-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D74A.mp3\tFats Waller\tThis Is So Nice It Must Be Illegal - Martinique\tv-disk\t74A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLH1554.mp3\tBob Wills And His Texas Playboys\tThis Is Southland\tCOLUMBIA\t38137\tH1554\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_150.mp3\tHorace Heidt Musical Knights\tThis Is The Army Mr Jones\tCOLUMBIA\t36667\tCCO4272-2\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_138.mp3\tHal Mcintyre And His Orchestra\tThis Is The Army, Mr. Jones\tVICTOR\t27951\t075572\t1942\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC83202.mp3\tTommy Dorsey And His Orchestra\tThis Is The Beginning Of The End\tDECCA\t28366\t83202\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67400.mp3\tBob Crosby & His Orch\tThis Is The Beginning Of The End\tDECCA\t3103A\t67400\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_171.mp3\tDon Cornell Feat. O/norman Leyden\tThis Is The Beginning Of The End\tCoral\t60748\t\t1952\taccompanied by Norman Leyden's Orchestra\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S3103.mp3\tBilly Eckstine, Sonny Burke\tThis Is The Inside Story\tMGM\t10043A\t47S3103\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_067.mp3\tBilly Murray\tThis Is The Life\tVICTOR\t17584\t14702-2\t1914\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151724-1.mp3\tBen Selvin And His Orch\tThis Is The Missus\tCOLUMBIA\t2515 D\tW151724-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU24932-A.mp3\tTeddy Wilson & His Orch\tThis Is The Moment\tBRUNSWICK\t8455\t24932-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24932-A.mp3\tTeddy Wilson And His Orchestra\tThis Is The Moment\tBrunswick\t8455\tB-24932-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_140.mp3\tFrank Sinatra\tThis Is The Night\tCOLUMBIA\t38853\tHCO1924\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_098.mp3\tJimmy Dorsey And His Orchestra Feat. Bob Eberly\tThis Is Worth Fighting For\tDECCA\t18376A\t70706\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_162.mp3\tCharlie Applewhite With Chorus And Orchestra Conducted By Jack Pleis\tThis Is You\tDECCA\t29055\t85579\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_085.mp3\tVictor Young And His Orchestra\tThis Little Piggie Went To Market\tBRUNSWICK\t6747\t14591-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC81032-1.mp3\tEddy Duchin & His Orch\tThis Little Piggy Went To Market\tVICTOR\t24512\t81032-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_067.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tThis Little Piggy Went To Market\tVICTOR\t24512\t81032-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU017430.mp3\tShep Fields Rippling Rhythm\tThis Little Ripple Had Rhythm\tBLUEBIRD\t7304\t017430\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC065917.mp3\tTommy Dorsey And His Orch\tThis Love Of Mine\tVICTOR\t27508\t065917\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2753.mp3\tStan Kenton & His Orch\tThis Love Of Mine\tDECCA\t4037A\tDLA2753\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69785.mp3\tElla Fitzgerald & Her Orch\tThis Love Of Mine\tDECCA\t4007B\t69785\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DISD311.mp3\tHelen Humes W Marshall Royal\tThis Love Of Mine\tDISC\t520\tD311\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_023.mp3\tTommy Dorsey Orch V Frank Sinatra\tThis Love Of Mine\tVICTOR\t27508\t065917\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC033708.mp3\tTommy Dorsey & His Orch\tThis Night\tVICTOR\t26172\t033708\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_285.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tThis Night\tVICTOR\t26172\t033708\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480552.mp3\tBenny Golson Quintet\tThis Night\tRiverside\tRLP12-290\t\t1958\tCurtis Fuller (tb), Benny Golson (ts), Barry Harris (p), Jymie Merritt (sb), Philly Joe Jones (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1939_103.mp3\tGlen Gray And Casa Loma Orchestra\tThis Night (will Be My Souvenir)\tDECCA\t2308A\t65015\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_009.mp3\tRosemary Clooney Feat. Buddy Cole And His Orchestra\tThis Ole House\tCOLUMBIA\t40266\tRHCO10928\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_145.mp3\tStuart Hamblen\tThis Ole House\tRCA Victor\t5739\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2258.mp3\tKing Cole Trio\tThis Side Up\tDECCA\t8520\tDLA2258\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-12167-A.mp3\tAdelaide Hall\tThis Time It's Love\tBrunswick\t6362\tB-12167-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_153.mp3\tIsham Jones And His Orchestra\tThis Time It's Love\tVICTOR\t24392\t76791-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_064.mp3\tGuy Lombardo And His Royal Canadians\tThis Time It's Love\tBRUNSWICK\t6641\t13862-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11960-1.mp3\tCab Calloway And His Orchestra\tThis Time It's Love\tBanner\t32624\t11960-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU13862.mp3\tGuy Lombardo Royal Canadians\tThis Time It's Love (v C. Lombardo)\tBRUNSWICK\t6641\t13862\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63703.mp3\tElla Fitzgerald & Her Savoy 8\tThis Time It's Real\tDECCA\t1806A\t63703\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC023210.mp3\tTommy Dorsey & His Orch\tThis Time It's Real\tVICTOR\t25879\t023210\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_094.mp3\tHorace Heidt And His Brigadiers\tThis Time It's Real\tBRUNSWICK\t8121\t22663\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63703-A.mp3\tElla Fitzgerald And Her Savoy Eight\tThis Time It's Real\tDecca\t1806\t63703-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC24392.mp3\tIsham Jones & His Orchestra\tThis Time Its Love\tVICTOR\t24392\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC76791-1.mp3\tIsham Jones & His Orch\tThis Time Its Love (v J M)\tVICTOR\t24392\t76791-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU067746.mp3\tGlenn Miller & His Orch\tThis Time The Dream's On Me\tBLUEBIRD\t11315\t067746\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEH0528.mp3\tGene Krupa & His Orch\tThis Time The Dream's On Me\tOKEH\t6447\tH0528\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC067735-2.mp3\tArtie Shaw And His Orchestra\tThis Time The Dream's On Me\tVICTOR\t27609\t067735-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_206.mp3\tWoody Herman And His Orchestra\tThis Time The Dream's On Me\tDECCA\t4030A\tDLA2747\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP776.mp3\tKing Cole Trio\tThis Way Out\tCAPITOL\t\t776\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69504.mp3\tKing Cole Trio\tThis Will Make You Laugh\tDECCA\t8571B\t69504\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU20476-1.mp3\tHal Kemp And His Orch\tThis Year's Kisses\tBRUNSWICK\t7812\t20476-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1240.mp3\tAlice Faye Orchestra Under Direction Of Cy Feuer\tThis Year's Kisses\tBRUNSWICK\t7825\tLA1240\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC03874-1.mp3\tBenny Goodman And His Orchestra\tThis Year's Kisses\tVICTOR\t25505\t03874-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_144.mp3\tTeddy Wilson And His Orchestra Feat. Billie Holiday\tThis Year's Kisses\tBRUNSWICK\t7824\t20569-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_011.mp3\tHal Kemp And His Orchestra\tThis Year's Kisses\tBRUNSWICK\t7812\t20476-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_083.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. V/bob Goday\tThis Year's Kisses\tBLUEBIRD\t6757\t03858\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_015.mp3\tBenny Goodman And His Orchestra Feat. Margaret Mccrae\tThis Year's Kisses\tVICTOR\t25505\t03874-1\t1936\tfrom the film \"On the  Avenue\"\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20569-2.mp3\tTeddy Wilson And His Orchestra\tThis Year's Kisses\tBrunswick\t7824  \tB-20569-2  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20569-2.mp3\tTeddy Wilson & His Orch\tThis Year's Kisses (vbh)\tBRUNSWICK\t7824\t20569-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic64055-2.mp3\tMckinney's Cotton Pickers\tTho Whom It May Concern\tVictor\t23035\t64055-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1166.mp3\tTed Daffan's Texans\tThose Blue Eyes Don't Sparkle Anymore\tOKEH\t6172\tDAL1166\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKeS71739.mp3\tThomas Morris\tThose Blues\tOKeh\t4940\tS71739\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC13278.mp3\tFletcher Henderson & His Orch\tThose Broken Busted Can't Be Trusted Blues\tVOCALION\t14838B\t13278\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_124.mp3\tArthur Collins And Byron Harlan\tThose Charlie Chaplin Feet\tCOLUMBIA\tA-1780\t45706\t1915\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0400_02.mp3\tLee Morse\tThose Daisy Days\tPathe\t025140B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68514.mp3\tSkeets Tolbert Gentlemen Swing\tThose Draftin' Blues\tDECCA\t8516A\t68514\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec68514-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tThose Draftin' Blues\tDecca\t8516\t68514-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC54855.mp3\tJimmie Rodgers\tThose Gambler's Blues\tVICTOR\t22554\t54855\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/NOR3019B.mp3\tAbe Lyman - Hotel Ambassador O\tThose Longing For You Blues\tNORDSKOG\t3019B\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140145.mp3\tEddie Cantor\tThose Panama Mamas\tCOLUMBIA\t256D\t140145\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66308.mp3\tTexas Wanderers (c.bruner)\tThose Things I Cant Forget\tDECCA\t5730\t66308\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_245.mp3\tBuddy Clark Feat. O/ray Noble\tThose Things Money Can't Buy\tCOLUMBIA\t37967\tHCO2670\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_266.mp3\tKing Cole Trio\tThose Things Money Can't Buy\tCapitol\t15011\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1805-3.mp3\tRuss Carlson & His Orch\tThou Shalt Not (v H V E)\tCROWN\t3367B\tC1805-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU42568-1.mp3\tLouisiana Sugar Babes\tThou Swell\tBLUEBIRD\t10260A\t42568-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19670-3.mp3\tArtie Shaw And His Orchestra\tThou Swell\tBRUNSWICK\t7735\tB-19670-3\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/MER8963TS.mp3\tLester Young & His Orch\tThou Swell\tMERCURY\t8963\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic42568-2.mp3\tLouisiana Sugar Babes\tThou Swell\tVictor\t21346\t42568-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_353.mp3\tGordon Macrae\tThoughtless\tCapitol\t15027\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_276.mp3\tGuy Lombardo And His Royal Canadians\tThoughtless\tDecca\t124318\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_306.mp3\tDoris Day Feat. The Modernaires\tThoughtless\tCOLUMBIA\t38079\tHCO3073\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCA21423.mp3\tLes Compagnons De La Chanson\tThree Bells - Trois Cloches\tCOLUMBIA\t39657\tCA21423\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC86165.mp3\tThe Four Aces\tThree Coins In The Fountain\tDECCA\t29123\t86165\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_027.mp3\tFrank Sinatra\tThree Coins In The Fountain\tCapitol\t2816\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_011.mp3\tFour Aces Feat. Jack Pleis And His Orchestra\tThree Coins In The Fountain\tDECCA\t29123\t86165\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic48-0467-B.mp3\tSpade Cooley\tThree Fiddle Rag\tVictor\t48-0467-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65620.mp3\tThree Peppers\tThree Foot Skipper Jones\tDECCA\t2609A\t65620\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61958.mp3\tExecutor & Gerald Clark\tThree Friend's Advice\tDECCA\t17298B\t61958\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC16315.mp3\tHolloway Stan\tThree Ha'pence A Foot\tARC\t\t16315\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COM75961-A.mp3\tWillie Smith (piano)\tThree Keyboards\tCOMMODORE\t520\t75961-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_190.mp3\tKay Starr\tThree Letters\tCapitol\t2213\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43154.mp3\tUna Mae Carlisle\tThree Little Bugs\tCOLUMBIA\t38979\tCO43154\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU035730.mp3\tGlenn Miller & His Orch\tThree Little Fishies\tBLUEBIRD\t10219\t035730\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65366.mp3\tPaul Whiteman's Swing Wing\tThree Little Fishies\tDECCA\t2417A\t65366\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24345-C.mp3\tRed Norvo & His Orch\tThree Little Fishies (v Mildred Bailey)\tVOCALION\t4785\t24345-C\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB24359-A.mp3\tKay Kyser & His Orchestra\tThree Little Fishies (v4)\tCOLUMBIA\t36119\tB24359-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D343A.mp3\tUnited States Army Air Forces Band (glenn Darwin N\tThree Little Messerschmitts\tV-DISC\t343A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_114.mp3\tVaughn Monroe And His Orchestra\tThree Little Sisters\tBLUEBIRD\t11508\t073424-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_128.mp3\tAndrews Sisters\tThree Little Sisters\tDECCA\t18319\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15044.mp3\tClaude Hopkins And His Orch\tThree Little Words\tBRUNSWICK\t6864\t15044\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC61013-5.mp3\tDuke Ellington And His Orch\tThree Little Words\tVICTOR\t22528\t61013-5\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150967-5.mp3\tEthel Waters W Novelty Acc.\tThree Little Words\tCOLUMBIA\t2346 D\tW150967-5\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8934.mp3\tLester Young Qt\tThree Little Words\tMERCURY\t8934\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70415.mp3\tHazel Scott (piano)\tThree Little Words\tDECCA\t18341B\t70415\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68558.mp3\tElla Fitzgerald & Her Orch\tThree Little Words\tDECCA\t3608B\t68558\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYHL30.mp3\tColeman Hawkins Sax Ensemble\tThree Little Words\tKEYNOTE\t1316\tHL30\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC4212hpp.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tThree Little Words\tDECCA\tF-6875\t4212hpp\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/COM75957.mp3\tBud Freeman Trio\tThree Little Words\tCOMMODORE\t514\t75957\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/HMVPBVE61013-5.mp3\tDuke Ellington And His Orchestra\tThree Little Words\tHMV\tE B5945\tPBVE61013-5\t1930\tvocal by the Rhythm Boys (Bing Crosby, Harry Barris, Al Rinker)\nhttp://www.jazz-on-line.com/a/mp3b/VocC-6466.mp3\tJimmie Noone's Apex Club Orchestra\tThree Little Words\tVocalion \t1554\tC-6466\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_113.mp3\tIpana Troubadors\tThree Little Words\tColumbia\t2317\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_006.mp3\tDuke Ellington And His Famous Orchestra Feat. Bing Crosby, Al Rinker, And Harry Barris (rhythm Boys)\tThree Little Words\tVICTOR\t22528\t61013-5\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/JazB-11893-A.mp3\tClaude Hopkins And His Orchestra\tThree Little Words\tJazz Archives\t4\tB-11893-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/JazB-13129-A.mp3\tClaude Hopkins And His Orchestra\tThree Little Words\tJazz Archives\t4\tB-13129-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4484.mp3\tLionel Hampton & His Orch\tThree Minutes On 52nd Street\tDECCA\t24429\tL4484\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC12072.mp3\tTommy Dorsey (trombone Solo)\tThree Moods\tARC\tBR1367\t12072\t1932\t\nhttp://www.jazz-on-line.com/a/mp3o/GEN4828-A.mp3\tSpecialty Orchestra\tThree O'clock In The Mornin\tGennett\t4828-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC26729-3.mp3\tPaul Whiteman And His Orch\tThree O'clock In The Morning\tVICTOR\t18940\t26729-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8923TO.mp3\tOscar Peterson\tThree O'clock In The Morning\tMERCURY\t8923\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79864.mp3\tFrank Crumit\tThree O'clock In The Morning\tCOLUMBIA\tA-3431\t79864\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol3724.mp3\tPrince's Dance Orchestra\tThree O'clock In The Morning\tColumbia\t3724\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-3431.mp3\tFrank Crumit\tThree O'clock In The Morning\tCOLUMBIA-\tA-3431\t79864\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18940t.mp3\tPaul Whiteman & His Orchestra\tThree O'clock In The Morning\tVictor\t18940\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_017.mp3\tTed Lewis And His Band\tThree O'clock In The Morning\tDECCA\t2110B\tDLA1343\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_060.mp3\tFrank Crumit\tThree O'clock In The Morning\tColumbia\t3431\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC73192.mp3\tPaul Whiteman And His Orch\tThree On A Match\tVICTOR\t24089\t73192\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1803-1.mp3\tRuss Carlson & His Orch\tThree On A Match (v H V E)\tCROWN\t3367A\tC1803-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC064058.mp3\tLionel Hampton & His Orch\tThree Quarter Boogie\tVICTOR\t27409\t064058\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM746.mp3\tCab Calloway & His Orchestra\tThree Swings In And Out\tVOCALION\t3995\tM746\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77711.mp3\tHenry Burr (tenor)\tThree Wonderful Letters From Home\tCOLUMBIA\tA-2529\t77711\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_123alt.mp3\tHenry Burr\tThree Wonderful Letters From Home\tPath\t20366\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_125.mp3\tTom Gerun And His Orchestra\tThree's A Crowd\tBRUNSWICK\t6365\t12212-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic064058-1.mp3\tLionel Hampton And His Sextet\tThree-quarter Boogie\tVictor\t27409\t064058-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_298.mp3\tArt Kassel And His \"kassels-in-the-air\"\tThrill Of A Lifetime\tBluebird\t7255\t015827-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1069.mp3\tArtie Shaw And His Orchestra\tThrill Of A Lifetime\tRCA\t20-1937\tD5VB1069\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu015827-1.mp3\tArt Kassel & His Orch\tThrill Of A Lifetime\tBluebird\t7255B\t015827-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC17456-1.mp3\tHal Kemp & His Orch\tThrilled (vmaxine Grey)\tARC\tBR7437\t17456-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU071199-1.mp3\tClarence Williams Blue Five\tThriller Blues (v E T)\tBLUEBIRD\t11368\t071199-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5852-3.mp3\tCharlie Parker's Bebop Boys\tThriving On A Riff\tSAVOY\t945B\tS5852-3\t1945\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC57536-4.mp3\tLeo Reisman & His Orch\tThrough\tVICTOR\t22204A\t57536-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/GUIG604.mp3\tCozy Cole & His Quintette\tThrough For The Night (v June Hawkins)\tGUILDE\t119\tG604\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC067739.mp3\tArtie Shaw And His Orchestra\tThrough The Years\tVICTOR\t27703\t067739-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_068.mp3\tHenry Burr And Albert Campbell\tThrough These Wonderful Glasses Of Mine\tCOLUMBIA\t2019\t46788-2\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_169.mp3\tGeorge Olsen And His Orchestra\tThrow Another Log On The Fire\tColumbia\t2857\tW152573\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3316.mp3\tUna Mae Carlisle W Orch\tThrow It Our Your Mind\tSAVOY\t616B\tS3316\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COL16640.mp3\tBenny Goodman And His Orchestra\tThrowin' Stones At The Sun\tCOLUMBIA\t3003 D\t16640\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39219-A.mp3\tBob Howard & His Orchestra\tThrowin' Stones At The Sun\tDECCA\t343A\t39219-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_224.mp3\tBenny Goodman And His Orchestra Feat. O/helen Ward\tThrowin' Stones At The Sun\tCOLUMBIA\t3003 D\t16640\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30441-1.mp3\tGene Krupa & His Orch\tThrowing Pebbles In The Mill Stream\tOKEH\t6222\t30441-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10227.mp3\tJimmy Boyd\tThumbellina\tCOLUMBIA\t39871\tHCO10227\t\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC69683-1.mp3\tEubie Blake And His Orchestra\tThumpin' And Bumpin'\tVICTOR\t22737\t69683-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC90809.mp3\tEddie Cole's Solid Swingers\tThunder\tDECCA\t7210A\tC90809\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_324.mp3\tRay Anthony Feat. Leo Anthony\tThunderbird\tCapitol\t2451\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64983-A.mp3\tCount Basie And His Orchestra\tThursday\tDecca\t2325\t64983-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64983.mp3\tCount Basie & His Orch\tThursday (v H H)\tDECCA\t2325A\t64983\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC63301-A.mp3\tAndrews Sisters\tTi Pi Tin\tDECCA\t1703\t63301-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC021128.mp3\tBenny Goodman And His Orchestra\tTi-pi-tin\tVICTOR\t25814\t021128\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1889.mp3\tWillie Lewis & Negro Band\tTi-pi-tin\tVARSITY\tEL4068s\t1889\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_215.mp3\tAndrews Sisters\tTi-pi-tin\tDECCA\t1703\t63301-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_166.mp3\tGeorge Hall And His Orchestra\tTi-pi-tin\tVocalion\t3991\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/GENG9115-B.mp3\tWolverine Orchestra\tTia Juana\tGENNETT\t5565\t9115-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG11907.mp3\tJelly Roll Morton\tTia Juana\tGENNETT\t3043\tG11907\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/GENG09115-B.mp3\tWolverines\tTia Juana\tGENNETT\t5565\tG09115-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1448.mp3\tAugie Goupil's Royal Tahitians\tTiare Tahiti\tDECCA\t2254B\tDLA1448\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480919.mp3\tCarmen Miranda And The Bando Da Lua\tTic Tac Do Meu Coracao\tDECCA\t23266-A\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81670-2.mp3\tBessie Smith\tTicket Agent Easy Your Window Down\tCOLUMBIA\t14025 D\t81670-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU48874-2.mp3\tRichard M Jones Jazz Wizards\tTickle Britches Blues\tBLUEBIRD\t6627\t48874-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COL26656.mp3\tCount Basie And His Orch\tTickle Toe\tCOLUMBIA\t35521\t26656\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB9405-2.mp3\tAda Jones\tTickle Toes\tVICTOR\t16683\tB9405-2\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_121.mp3\tAmerican Quartet Feat. Ada Jones\tTickle Toes\tVICTOR\t16683\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26656-1.mp3\tCount Basie And His Orchestra\tTickle-toe\tColumbia\tDD-480\t26656-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18606B.mp3\tAndrews Sisters\tTico Tico\tDECCA\t18606B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D339B2.mp3\tThe Three Suns\tTico Tico\tV-DISC\t339B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3730.mp3\tCarmen Miranda\tTico Tico\tDECCA\t23414\tL3730\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_167.mp3\tAndrews Sisters\tTico Tico\tDECCA\t18606B\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480920.mp3\tAl Goodman And His Orchestra\tTico-tico\tRCA VICTOR\t28-0403-A\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/DECL3423A.mp3\tEthel Smith And The Banda Carioca\tTico-tico (from M-g-m Picture ''bathing Beauty'')\tDECCA\t23353-A\tL3423A\t1944\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480921.mp3\tCarmen Miranda And The Bando Da Lua\tTico-tico No Fuba\tDECCA\t23414-A\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec38602-A.mp3\tFletcher Henderson And His Orchestra\tTidal Wave\tDecca\t213\t38602-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Blu81790-1.mp3\tFletcher Henderson And His Orchestra\tTidal Wave\tBluebird\tB-5682\t81790-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC34040-3.mp3\tJack Chapman And His Orch\tTie Me To Your Apron Strings Again\tVICTOR\t19915\t34040-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC34047-1.mp3\tBrox Sisters\tTie Me To Your Apron Strings Again\tVICTOR\t19921\t34047-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_178.mp3\tBrox Sisters\tTie Me To Your Apron Strings Again\tVICTOR\t19921\t34047-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS5007.mp3\tLord Beginner & Invader\tTie Tongue Baby\tDISC\t5007\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/C548-3.mp3\tMaple City Four\tTiger Rag\tBANNER\t32770\tC548-3\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLA3000-A.mp3\tGaylord Carter\tTiger Rag\tBlack & White\t3000-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE37289-A.mp3\tMills Bros\tTiger Rag\tBRUNSWICK\t6197\tE37289-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13164.mp3\tArt Tatum (piano)\tTiger Rag\tBRUNSWICK\t6543\t13164\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1920x.mp3\tLes Paul And Mary Ford\tTiger Rag\tCAPITOL\t\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151261-1.mp3\tRed Devils\tTiger Rag\tCOLUMBIA\t14586 D\tW151261-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2089.mp3\tKid Ory And His Band\tTiger Rag\tCOLUMBIA\t37274\tHCO2089\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe404002-B.mp3\tLouis Armstrong And His Orch\tTiger Rag\tOKeh\t8800\t404002-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOB5119-1.mp3\tRay Noble And His Orch\tTiger Rag\tVICTOR\t24577A\tOB5119-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21701-3.mp3\tOriginal Dixieland Jazz Band\tTiger Rag\tVICTOR\t25908\t21701-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO35143-1.mp3\tBenny Goodman Sextet\tTiger Rag\tCOLUMBIA\t36922\tCO35143-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU72694-1.mp3\tGeorgia Washboard Stompers\tTiger Rag\tBLUEBIRD\t6084\t72694-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU87729.mp3\tWanderers\tTiger Rag\tBLUEBIRD\t5887\t87729\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38641-A.mp3\tMills Brothers\tTiger Rag\tDECCA\t167B\t38641-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5425.mp3\tJoe Marsala All Timers\tTiger Rag\tSAVOY\t10001A\tS5425\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23312-3.mp3\tTeddy Wilson School For Piano\tTiger Rag\tCBS\t(Reject)\t23312-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU11932.mp3\tWolverine Orchestra\tTiger Rag\tBRUNSWICK\t02205\t11932\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401309-C.mp3\tTommy Dorsey Trumpet Specialty\tTiger Rag\tOKeh\t41178\t401309-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe17075-2.mp3\tTed Lewis & His Band\tTiger Rag\tOKeh\t41580\t17075-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT1426.mp3\tJohnny Guarnieri\tTiger Rag\tMAJESTIC\t1226\tT1426\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-1891-1.mp3\tAndr Ekyan (with Django Reinhardt)\tTiger Rag\tSWING\t4\tOLA-1891-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27029-1.mp3\tGene Krupa & His Orch\tTiger Rag\tCOLUMBIA\t35454\t27029-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/MER5879TR.mp3\tMuggsy Spanier's Dixielanders\tTiger Rag\tMERCURY\t5879\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/ULTP-77162.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tTiger Rag\tUltraphone\tAP-1423\tP-77162\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu57651.mp3\tAlvino Rey\tTiger Rag\tBluebird\t11002\t57651\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO13x.mp3\tFirehouse Five Plus Two\tTiger Rag\tGood Time Jazz\t13\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80765-2.mp3\tTed Lewis & His Jazz Band\tTiger Rag\tCOLUMBIA\tA-3813\t80765-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D214B1.mp3\tThe Original Dixieland Jazz  Band\tTiger Rag\tV-DISC\t214B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BruTO1192.mp3\tArt Tatum\tTiger Rag\tBrunswick\t\tTO1192\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru1479wpp.mp3\tLouis Armstrong And His Orchestra\tTiger Rag\tBrunswick\t500490\t1479wpp\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_088.mp3\tRay Noble And His Orchestra\tTiger Rag\tVICTOR\t24577\tOB5119-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_010.mp3\tOriginal Dixieland Jazz Band\tTiger Rag\tVICTOR\t18472\t21701-3\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_004.mp3\tMills Brothers\tTiger Rag\tDECCA\t167B\t38641-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/HAR142195-2-3.mp3\tUniversity Six\tTiger Rag\tHARMONY\t224-H\t142195-2-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh108.mp3\tJack Payne And His Bbc Dance Orchestra\tTiger Rag\tRex\t8179\tF-731-1-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-8493-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tTiger Rag \tParlophone\tF-923\tCE-8493-1\t1937\tValaida Snow t v acc. by Johnny Claes t, Derek Neville as bar, Reggie Dare ts, Gun Finlay p, Norman Brown g, Louis Barreiro b, Ken Stewart d\nhttp://www.jazz-on-line.com/a/mp3d/Cro1232-3.mp3\tFletcher Henderson And His Orchestra\tTiger Rag\tCrown\t3107\t1232-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-123-1.mp3\tBenny Carter And His Swing Quartet\tTiger Rag\tVocalion\tS-19\tS-123-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/TedP-23312-3.mp3\tTeddy Wilson And His Orchestra\tTiger Rag\tTeddy Wilson School \t\tP-23312-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU80048-A.mp3\tDuke Ellington And His Cotton Club Orchestra\tTiger Rag Part 1\tBrunswick\t80048-A\tE-28940-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU80048-B.mp3\tDuke Ellington And His Cotton Club Orchestra\tTiger Rag Part 2\tBrunswick\t80048-B\tE-28941-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/BruE-28940-A.mp3\tDuke Ellington And His Cotton Club Orchestra\tTiger Rag, (part 1)\tBrunswick\t4238\tE-28940-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/BruE-28941-A.mp3\tDuke Ellington And His Cotton Club Orchestra\tTiger Rag, (part 2)\tBrunswick\t4238\tE-28941-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/SUPC5076.mp3\tMozelle Alderson\tTight In Chicago\tSUPERTONE\t2221s\tC5076\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW402226-C.mp3\tLouis Armstrong And His Orch\tTight Like This\tCOLUMBIA\t36378\tW402226-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE402226-C.mp3\tLouis Armstrong Savoy Ballroom\tTight Like This\tOKeh\t8649\t402226-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVoc3303.mp3\tLouis Armstrong\tTight Like This\tVocalion\t3303\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D309B2.mp3\tRaymond Scott And His Orchestra\tTijuana\tV-DISC\t309B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC22447-2.mp3\tCharles Hart-lewis James\tTil We Meet Again\tVICTOR\t18518\t22447-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/COR60873x.mp3\tTeresa Brewer\tTill I Waltz Again With You\tCORAL\t60873\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_141.mp3\tDick Todd\tTill I Waltz Again With You\tDECCA\t28506\t83633\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_006.mp3\tTeresa Brewer Feat. Jack Pleis Orchestra\tTill I Waltz Again With You\tCORAL\t60873\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_339.mp3\tHarmonicats\tTill I Waltz Again With You\tMERCURY\t70069\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC82013.mp3\tBuddy Johnson And His Orch.\tTill My Baby Comes Back\tDECCA\t27947\t82013\t1951\t\nhttp://www.jazz-on-line.com/a/mp3r/RiGre2087.mp3\tMr X From \"little Nellie Kelly\"\tTill My Luck Comes Rolling Along\tGrey Gull\t2087\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/COL47417.mp3\tAnna Wheaton (soprano)\tTill The Clouds Roll Be\tCOLUMBIA\tA-2261\t47417\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_003.mp3\tAnna Wheaton And James Harrod\tTill The Clouds Roll By\tCOLUMBIA\t2261\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3882.mp3\tDick Haymes - Victor Young\tTill The End Of Time\tDECCA\t18699A\tL3882\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1709x.mp3\tPerry Como\tTill The End Of Time\tRCA\t20-1709\t20-1709x\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_030.mp3\tLes Brown And His Orchestra Feat. Doris Day\tTill The End Of Time\tCOLUMBIA\t36828\tCO34715\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_002.mp3\tPerry Como Feat. Russell Case's Orchestra\tTill The End Of Time\tVICTOR\t1709\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_329.mp3\tBob Chester And His Orchestra Feat. Bill Darnell\tTill The Lights Of London Shine Again\tBLUEBIRD\t10972\t057747\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_044.mp3\tDonald Chalmers\tTill The Sands Of The Desert Grow Cold\tEDISON\t1043\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3a/COR15132x.mp3\tHilltoppers\tTill Then\tCORAL\tDOT15132\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71811.mp3\tMills Brothers\tTill Then\tDECCA\t18599B\t71811\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_071.mp3\tMills Brothers\tTill Then\tDECCA\t18599B\t71811\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_066.mp3\tHilltoppers\tTill Then\tCORAL\tDOT15132\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3234-A.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tTill Times Get Better\tBrunswick\t7078\tC-3234-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26494-A.mp3\tBenny Goodman Sextet\tTill Tom Special\tCOLUMBIA\t35404\t26494-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC044725-1.mp3\tLionel Hampton & His Orch\tTill Tom Special\tVICTOR\t26604\t044725-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic044725-1.mp3\tLionel Hampton And His Orchestra\tTill Tom Special\tVictor\t26004\t044725-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78159.mp3\tAl Campbell And Henry Burr\tTill We Meet Again\tCOLUMBIA\tA-2668\t78159\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70658.mp3\tGlen Gray & Casa Loma Orch.\tTill We Meet Again\tDECCA\t18322\t70658\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18518.mp3\tCharles Hart & Lewis James\tTill We Meet Again\tVictor\t18518\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_012.mp3\tCharles Hart And Lewis James\tTill We Meet Again\tSILVERTONE\t5013o\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_001.mp3\tHenry Burr And Albert Campbell\tTill We Meet Again\tCOLUMBIA\t2668\t78159\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_102.mp3\tVernon Dalhart And Gladys Rice\tTill We Meet Again\tEDISON\tBA 3670\t6449-B\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22360-1.mp3\tNicholas Orlando's Orch\tTill We Meet Again (vhart)\tVICTOR\t18526\t22360-1\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_196.mp3\tEddy Howard And His Orchestra\tTill We Two Are One\tMERCURY\t70293\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_044.mp3\tGeorgie Shaw\tTill We Two Are One\tDECCA\t28937\t85384\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC60192-A.mp3\tBud Freeman's Windy City 5\tTillie's Downtown Now\tDECCA\t18112B\t60192-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_083.mp3\tPaul Biese Trio And Frank Crumit\tTimbuctoo\tCOLUMBIA\tA-3352\t79556\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79556.mp3\tPaul Biese-frank Crumit\tTimbuctoo (v Crumit)\tCOLUMBIA\tA-3352\t79556\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_434.mp3\tSarah Vaughan\tTime\tCOLUMBIA\t40041\tCO48725-1\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2116.mp3\tFrank Sinatra\tTime After Time\tCOLUMBIA\t37300\tHCO2116\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_189.mp3\tFrank Sinatra\tTime After Time\tCOLUMBIA\t37300\tHCO2116\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_126.mp3\tHenry Burr\tTime After Time\tVICTOR\t18875B\t26163\t1922\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481775.mp3\tAnita O'day\tTime After Time\tVerve\tMGV2000\t2562-9\t1955\tacc. by Paul Smith (p), Barney Kessel (g), Joe Mondragon (sb), Alvin Stoller (dm), Corky Hale (harp), strings. Buddy Bregman (arr, dir)\nhttp://www.jazz-on-line.com/a/mp3c/MUS5809.mp3\tTeddy Wilson Quartet\tTime After Time (v Sarah Vaughn)\tMUSICRAFT\t462\t5809\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC71890.mp3\tElla Fitzgerald\tTime Alone Will Tell\tDECCA\t18605\t71890\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/Mus5304.mp3\tSarah Vaughan With Stuff Smith And His Trio\tTime And Again\tMusicraft\t337\t5304\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5304.mp3\tStuff Smith And His Trio\tTime And Again (v Sarah Vaughn)\tMUSICRAFT\t337\t5304\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2248.mp3\tRoy Rogers & His Saddle Pals\tTime Changes Everything\tDECCA\t5908\tDLA2248\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VARUS1061.mp3\tJudy Canova W Orch\tTime For Jookin'\tVARSITY\t8094\tUS1061\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU02900-1.mp3\tFrank Tanner's Rhythm Kings\tTime For One More\tBLUEBIRD\tB-6686\t02900-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC93005.mp3\tSleepy John Estes\tTime Is Drawing Near\tDECCA\t7789\t93005\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151812.mp3\tSmith Ballew And His Orch\tTime On My Hands\tCOLUMBIA\t2544 D\tW151812\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/NATNSC169.mp3\tBilly Eckstine And His Orch\tTime On My Hands\tNATIONAL\t\tNSC169\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE26903.mp3\tBillie Holiday\tTime On My Hands\tOKEH\t5991\t26903\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1057.mp3\tArtie Shaw And His Orchestra\tTime On My Hands\tRCA\t20-1930\tD5VB1057\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/DECLA5838.mp3\tLionel Hampton's Sextet\tTime On My Hands\tDECCA\t27375\tLA5838\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO891.mp3\tCount Basie & His Orch\tTime On My Hands\tCOLUMBIA\t36685\tHCO891\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/CONW3334.mp3\tSlam Stewart Qt\tTime On My Hands\tCONTIN\t10001\tW3334\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/SIGBOB3.mp3\tEddie Heywood Trio\tTime On My Hands\tSIGNATURE\t40004A\tBOB3\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC49741-2hpp.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tTime On My Hands\tDECCA\tF-7100\t49741-2hpp\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D224A2.mp3\tSammy Kay And His Orchestra\tTime On My Hands\tV-DISC\t224A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5838.mp3\tLionel Hampton And His Sextet\tTime On My Hands\tDecca\t27375\tLA-5838\t1950\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480461.mp3\tBen Webster Quintet\tTime On My Hands\tVerve\tMGV8274\t21745-2\t1957\tBen Webster (ts), Oscar Peterson, P, Stan Levey, D, Ray Brown, B, Herb Ellis, G\nhttp://www.jazz-on-line.com/a/mp3b/Joh053.mp3\tNew Mayfair Orchestra Dir. By Ray Noble\tTime On My Hands (v Al Bowlly)\tHMV\tB-5983\tOB-368-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU21240-1.mp3\tGlenn Miller And His Orch\tTime On My Hands (you In My Arms)\tBRUNSWICK\t7915\t21240-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_073.mp3\tSmith Ballew And His Orchestra\tTime On My Hands (you In My Arms)\tCOLUMBIA\t2544 D\tW151812\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/MER1810.mp3\tHelen Humes W Buck Clayton Or\tTime Out For Tears\tMERCURY\t8088\t1810\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_180.mp3\tSavannah Churchill And Four Tunes Feat. The Four Tunes\tTime Out For Tears\tMANOR\t1116\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/APO378TT.mp3\tWynonie Harris\tTime To Change Your Town\tAPOLLO\t378\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47382.mp3\tSarah Vaughan\tTime To Go\tCOLUMBIA\t39789\tCO47382\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18600A.mp3\tHelen Forrest\tTime Waits For No One\tDECCA\t18600A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D357A.mp3\tWoody Herman And His Orchestra (frances Wayne Voc.)\tTime Waits For No One\tV-DISC\t357A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_072.mp3\tJohnny Long And His Orchestra\tTime Waits For No One\tDecca\t4439\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_024.mp3\tHelen Forrest Feat. Camarata's Orchestra\tTime Waits For No One\tDECCA\t18600A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_079.mp3\tJimmy Dorsey And His Orchestra\tTime Was\tDECCA\t3859A\t69212\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC69212.mp3\tJimmy Dorsey And His Orch.\tTime Was (vhelen O'connell & Bob Eberle)\tDECCA\t3859A\t69212\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN1989.mp3\tHank Penny\tTime Will Tell\tKING\t551A\t1989\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke23908-1.mp3\tJimmie Lunceford And His Orchestra\tTime's A-wastin'\tOkeh\t4887\t23908-1\t1938\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3w/1955_205.mp3\tThree Chuckles\tTimes Two, I Love You\tX\t0162\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/DIS133.mp3\tJoe Sullivan (solo)\tTimothy\tDISC\t6005\t133\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145655-3.mp3\tJan Garber & His Orch\tTin Ear\tCOLUMBIA\t1642 D\tW145655-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN891.mp3\tHank Penny\tTin Pan Polka\tKING\t891\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE7388.mp3\tKing Oliver Dixie Syncopators\tTin Roof Blues\tVOCALION\t1189\tE7388\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_160.mp3\tTed Lewis And His Band\tTin Roof Blues\tCOLUMBIA\t439D\tW140710-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/OKeS71605-B.mp3\tHarry Raderman Jazz Orch\tTin Roof Blues\tOKeh\t4885\tS71605-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC28718-1.mp3\tOriginal Memphis Five\tTin Roof Blues\tVICTOR\t19170\t28718-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO41846.mp3\tJimmy Dorsey Dixielanders\tTin Roof Blues\tCOLUMBIA\t38657\tCO41846\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU031538.mp3\tCharlie Barnet & His Orch\tTin Roof Blues\tBLUEBIRD\t10131\t031538\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC028175.mp3\tTommy Dorsey & His Orch\tTin Roof Blues\tVICTOR\t26105\t028175\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DECAM1917-A.mp3\tThe Dutch Swing College Band\tTin Roof Blues\tDecca\tM32772\tAM1917-A\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44358.mp3\tBobby Hackett\tTin Roof Blues\tCOLUMBIA\t39021\tCO44358\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1627.mp3\tMuggsy Spanier Vdisc Allstars\tTin Roof Blues - Cherry\tV-DISC\t588\t1627\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480574.mp3\tArt Pepper\tTin Tin Deo\tContemporary\tC3532\t\t1957\tRed Garland, P, Philly Jo Jones, D, Paul Chambers, B\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-6192x.mp3\tPerry Como\tTina Marie\tRCA\t20-6192\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_038.mp3\tPerry Como\tTina Marie\tRCA Victor\t6192 A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL822.mp3\tClovers\tTing-a-ling\tATLANTIC\t969\t822\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_149.mp3\tDorsey Brothers Orchestra Feat. V/kay Weber\tTiny Little Fingerprints\tDECCA\t367A\t39264\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS5710-3.mp3\tCharlie Parker\tTiny's Tempo\tSAVOY\t310\tS5710-3\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU56537-1.mp3\tJones-collins Astoria Hot 8\tTip Easy Blues\tBLUEBIRD\t10952\t56537-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM47S3031.mp3\tSlim Gaillard\tTip Light\tMGM\t10017\t47S3031\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_210.mp3\tRoy Fox And His Orchestra\tTip Toe Through The Tulips\tBRUNSWICK\t4419\tLAE515\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_049.mp3\tJean Goldkette And His Orchestra\tTip Toe Through The Tulips\tVICTOR\t22027\t53565-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE498.mp3\tNick Lucas\tTip-toe Thru' The Tulips With Me\tBRUNSWICK\t4418\tLAE498\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh131.mp3\tMantovani And His Tipica Orchestra\tTipica Stomp\tColumbia\tFB-1616\tCA-16150-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22520.mp3\tEarl Hines & His Orch\tTippin' At The Terrace\tVOCALION\t4143\t22520\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_118.mp3\tErskine Hawkins And His Orchestra\tTippin' In\tVictor\t1639\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU065729-1.mp3\tErskine Hawkins & His Orch\tTippin' In (blue Sea)\tBLUEBIRD\t11419\t065729-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1686.mp3\tCount Basie & His Orchestra\tTippin' On The Q.t\tV-DISC\t627\t1686\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480492.mp3\tBenny Golson\tTippin' On Through\tNew Jazz\tNJLP8248\t1969\t1959\tCurtis Fuller (tb), Benny Golson (ts), Tommy Flanagan (p), Doug Watkins (sb), Art Taylor (dm)\nhttp://www.jazz-on-line.com/a/mp3b/DEC73555.mp3\tRoy Eldridge & His Orchestra\tTippin' Out\tDECCA\t23637\t73555\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC57130-4.mp3\tEddie Cantor\tTips On The Stock Market\tVICTOR\t22189\t57130-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC53565-3.mp3\tJean Goldkette & His Orch\tTiptoe Thru The Tulips With Me\tVICTOR\t22027\t53565-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/APO194x.mp3\tMahalia Jackson\tTired\tAPOLLO\t194\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO34619.mp3\tPearl Bailey\tTired\tCOLUMBIA\t36837\tCO34619\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN513T.mp3\tJohn Hardee\tTired\tBLUENOTE\tBN513\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC71221-1.mp3\tBert Lown & His Orch\tTired\tVICTOR\t22927\t71221-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43231.mp3\tUna Mae Carlisle\tTired Hands\tCOLUMBIA\t38864\tCO43231\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D357B1.mp3\tRaymond Scott And His Orchestra\tTired Little Teddy Bear\tV-DISC\t357B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA3329.mp3\tTed Lewis' Jazz Band\tTired Of Me\tColumbia\tA3329\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89042TA.mp3\tStan Getz\tTis Autumn\tMERCURY\t89042\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_152.mp3\tWoody Herman And His Orchestra\tTis Autumn\tDECCA\t4095A\tC93767\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_161.mp3\tLes Brown And His Orchestra\tTis Autumn\tOKEH\t6430\t31329\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VARW111.mp3\tBunny Berigan & His Orch\tTis Autumn (v L R)\tVARSITY\tEL5005\tW111\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE27772.mp3\tDuke Ellington & His Orch\tTishomingo Blues\tBRUNSWICK\t6802\tE27772\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24428.mp3\tMildred Bailey & Her Orchestra\tTit Willow\tVOCALION\t4845\t24428\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC11476-A.mp3\tHi Henry Brown\tTitanic Blues\tARC\tVO1728\t11476-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC32294-2.mp3\tBilly Murray\tTitina\tVICTOR\t19640\t32294-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_171.mp3\tBilly Murray\tTitina\tVICTOR\t19640\t32294-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC068194.mp3\tArtie Shaw And His Orchestra\tTo A Broadway Rose\tVICTOR\t27838\t068194-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06416.mp3\tFats Waller And His Rhythm\tTo A Sweet Pretty Thing\tVICTOR\t25551\t06416\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1929_1104_01.mp3\tLee Morse And Her Bluegrass Boys\tTo Be Forgotten\tColumbia\t2037DA\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC595-1.mp3\tHal Kemp And His Orch\tTo Be Or Not To Be In Love\tBRUNSWICK\t6613\tC595-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4594.mp3\tFrankie Laine\tTo Be Worthy Of You\tCOLUMBIA\t39600\tHCO4594\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4226.mp3\tInk Spots\tTo Each His Own\tDECCA\t23615\tL4226\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/MAJT703.mp3\tEddy Howard And His Orchestra\tTo Each His Own\tMAJESTIC\t7188\tT703\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1884.mp3\tModernaires\tTo Each His Own\tCOLUMBIA\t37063\tHCO1884\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS3330-A.mp3\tDon Byas Qt\tTo Each His Own\tSAVOY\t640A\tS3330-A\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_042.mp3\tTony Martin\tTo Each His Own\tMERCURY\t3022\t374-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_018.mp3\tInk Spots\tTo Each His Own\tDECCA\t23615\tL4226\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/LVSOSW-506-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tTo Each His Own + Symphonie\tLVSM\tFELP247\tOSW-506-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_158.mp3\tPerry Como Feat. O/mitchell Ayres, V/the Fontane Sisters\tTo Know You (is To Love You)\tRCA Victor\t4959\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_250.mp3\tFour Aces Featuring Al Alberts\tTo Love Again\tDecca\t29889\t89451\t1956\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC89682.mp3\tCarmen Cavallaro\tTo Love Again\tDECCA\t29907\t89682\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74621.mp3\tElla Fitzgerald\tTo Make A Mistake Is Human\tDECCA\t24529\t74621\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0979.mp3\tTempo King's Kings Of Tempo\tTo Mary With Love\tBLUEBIRD\t6637\t0979\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC5351.mp3\tBen Bernie And His Orch\tTo My Mammy\tBRUNSWICK\t4740\tC5351\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULAE686.mp3\tAl Jolson\tTo My Mammy\tBRUNSWICK\t4722\tLAE686\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_077.mp3\tAl Jolson\tTo My Mammy\tBRUNSWICK\t4722\tLAE686\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_192.mp3\tNat ''king'' Cole\tTo The Ends Of The Earth\tCapitol\t3551\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB9493-3.mp3\tBilly Murray\tTo The Strain Of The Wedding March\tVICTOR\t16833\tB9493-3\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_090.mp3\tEddy Howard And His Orchestra\tTo Think You've Chosen Me\tMERCURY\t5517\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151793.mp3\tJoe Venuti's Rhythm Boys\tTo To Blues\tCOLUMBIA\treject\tW151793\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC7102.mp3\tBen Bernie & His Orch\tTo Whom It May Concern\tBRUNSWICK\t6008\tC7102\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_041.mp3\tBen Bernie And His Orchestra\tTo Whom It May Concern\tBRUNSWICK\t6008\tC7102\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035751-2.mp3\tTommy Dorsey & His Orch\tTo You\tVICTOR\t26234\t035751-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_146.mp3\tTommy Dorsey And His Orchestra Feat. V/jack Leonard\tTo You\tVICTOR\t26234\t035751-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036877.mp3\tGlenn Miller And His Orchestra\tTo You (vray Eberle)\tBLUEBIRD\t10276\t036877\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1774.mp3\tBing Crosby & Dick Mcintyre\tTo You Sweetheart, Aloha\tDECCA\t2775B\tDLA1774\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_377.mp3\tGeorgie Shaw\tTo You, My Love\tDecca\t29839\t89261\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_195.mp3\tNick Noble\tTo You, My Love\tMercury\t70821\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA-581-A.mp3\tLouis Armstrong With The Polynesians\tTo You, Sweetheart, Aloha\tDecca\t914B\tDLA-581-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE30999.mp3\tCharlie Spivak And His Orch\tTo Your Hearts Content\tOKEH\t6366\t30999\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP1923-2.mp3\tMa Rainey & Georgia Jazz Band\tToad Frog Blues\tPARAMOUNT\t12242\tP1923-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64642.mp3\tAndy Kirk & Clouds Of Joy\tToadie Toddle\tDECCA\t2127B\t64642\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64642-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tToadie Toddle\tDecca\t2127\t64642-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU74846-1.mp3\tBennie Moten's Kansas Orch\tToby\tBLUEBIRD\t10259\t74846-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480629.mp3\tBennie Moten's Kansas City Orchestra\tToby\tVictor\t23384\t74846-1\t1932\tHot Lips Page, Joe Keyes, Dee Stewart (tp), Dan Minor, Eddie Durjam (tb), Eddie Barefield (cl, as), Jack Washington (as, bar), Ben Webster (ts), Count Basie (p), Lercy Berry (g), Walter Page (sb), Willie McWashington (dm)\nhttp://www.jazz-on-line.com/a/mp3b/MER1644-5.mp3\tHelen Humes\tToday I Sing The Blues\tMERCURY\t8011\t1644-5\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_126.mp3\tPaul Biese Trio\tToddle\tCOLUMBIA\tA-3383\t79661-1\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/GEN12140.mp3\tBix And His Rhythm Jugglers\tToddlin' Blues\tGENNETT\t5654\t12140\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3447.mp3\tDick Haymes And Helen Forrest\tTogether\tDECCA\t23349\tL3447\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35883x.mp3\tPaul Whiteman\tTogether\tVICTOR\t35883\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW145460.mp3\tCliff Edwards 'ukelele Ike'\tTogether\tCOLUMBIA\t1295 D\tW145460\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D275A2.mp3\tTony Pastor And His Orchestra\tTogether\tV-DISC\t275A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_102.mp3\tCliff Edwards\tTogether\tCOLUMBIA\t1295 D\tW145460\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_028.mp3\tHelen Forrest And Dick Haymes Feat. Victor Young Orchestra\tTogether\tDECCA\t23349\tL3447\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC40503.mp3\tVaughn Deleath & Ed Smalle\tTogether We Two\tVICTOR\t21042\t40503\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_148.mp3\tVaughn Deleath And Ed Smalle\tTogether We, Two\tVICTOR\t21042\t40503\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_136.mp3\tRuth Etting\tTogether, We Two\tCOLUMBIA\t1196 D\tW144968-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL35562.mp3\tJoshua White & Carolinians\tTold My Cap'n\tCOLUMBIA\t35562\t27417\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27417.mp3\tJoshua White & Carolinians\tTold My Cap'n\tCOLUMBIA\t35562\t27417\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU94136.mp3\tFreddie Jenkins & His Harlem-7\tToledo Shuffle\tBLUEBIRD\t6174\t94136\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU6174.mp3\tFreddie Jenkins & His Harlem-7\tToledo Shuffle\tBLUEBIRD\t6174\t94136\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG11914.mp3\tJelly Roll Morton\tTom Cat Blues\tGENNETT\t5515\tG11914\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/AUT687.mp3\tKing Oliver W Jelly Roll Morton\tTom Cat Blues\tAUTOGRAPH\t617\t687\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC56312-2.mp3\tG.b.grayson And Henry Whitter\tTom Dooley\tVICTOR\t40235\t56312-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31355-1.mp3\tCount Basie & His Orch\tTom Thumb\tOKEH\t6527\t31355-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67666.mp3\tThree Peppers\tTom Tom Serenade\tDECCA\t3342B\t67666\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_201.mp3\tGeorgia Gibbs\tTom's Tune\tMercury\t5644\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/RoyKJ-44-1.mp3\tMezzrow - Bechet Quintet\tTommy's Blues\tRoyal Jazz\t705\tKJ-44-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/VicD9VB-19.mp3\tLucky Millinder And His Orchestra\tTomorrow\tVictor\t20-3495\tD9VB-19  \t1949\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA3709.mp3\tTed Lewis & His Band\tTomorrow (i'll Be In My Dixie Home Again)\tColumbia\tA3709\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_168.mp3\tTed Fio Rito And His Orchestra (feat. Muzzy Macellino)\tTomorrow Is Another Day\tDecca\t1257\tDLA700\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4596.mp3\tFrankie Laine\tTomorrow Mountain\tCOLUMBIA\t39597\tHCO4596\t1951\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN4201x.mp3\tLonnie Johnson\tTomorrow Night\tKING\t4201\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_146.mp3\tLonnie Johnson\tTomorrow Night\tKING\t4201\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39346.mp3\tDorsey Brothers Orch.\tTomorrow's Another Day\tDECCA\t515A\t39346\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/HAR147961-3.mp3\tBert Lown & His Orch\tTomorrow's Violets (v I K)\tHARMONY\t863-H\t147961-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77353.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tTon Doux Sourire (the Sunshine Of Your Smile)\tUltraphone\tAP-1484\tP-77353\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE26953.mp3\tGene Krupa & His Orch\tTonight (perfidia)\tOKEH\t5715\t26953\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_115.mp3\tJimmy Dorsey And His Orchestra\tTonight (perfidia)\tDECCA\t3198B\t67711\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42662.mp3\tUna Mae Carlisle\tTonight Be Tender With Me\tCOLUMBIA\t38797\tCO42662\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec74099.mp3\tLucky Millinder And His Orchestra\tTonight He Sailed Again\tDecca\t24384\t74099  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3746.mp3\tSarah Vaughan\tTonight I Shall Sleep With A Smile On My Face\tCOLUMBIA\t38512\tHCO3746\t\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU15226-A.mp3\tLeo Reisman & His Orch\tTonight Is Mine (vgb)\tBRUNSWICK\t6903\t15226-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC70177.mp3\tLeo Reisman & His Orch\tTonight Or Never\tVICTOR\t22794\t70177\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2653.mp3\tTony Martin - David Rose Orch\tTonight We Love\tDECCA\t3988A\tDLA2653\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC023477.mp3\tBunny Berigan & His Orch\tTonight Will Live Forever\tVICTOR\t25877A\t023477\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO10236.mp3\tFrankie Laine\tTonight You Belong To Me\tCOLUMBIA\t39903\tHCO10236\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CONMEM31.mp3\tHank Penny's Radio Cowboys\tTonight You Belong To Me\tCONQUEROR\t9711\tMEM31\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69958.mp3\tGene Austin\tTonight You Belong To Me\tDECCA\t3939A\t69958\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057727-1.mp3\tErskine Hawkins & His Orch\tTonight You Belong To Me\tBLUEBIRD\t11161\t057727-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_326.mp3\tFrankie Laine\tTonight You Belong To Me\tCOLUMBIA\t39903\tHCO10236\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_010.mp3\tGene Austin Feat. Nat Shilkret And His Orchestra\tTonight You Belong To Me\tVICTOR\t20371\t36989-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_034.mp3\tPatience And Prudence\tTonight You Belong To Me\tLiberty\t55022\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_108.mp3\tLawrence Welk And His Sparkling Strings (with The Lennon Sisters And The Sparklers)\tTonight You Belong To Me\tCoral\t61701\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_280.mp3\tKaren Chandler And Jimmy Wakely\tTonight You Belong To Me\tDecca\t30040\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36964-2.mp3\tRoger Wolfe Kahn & His Orch\tTonight You Belong To Me (w)\tVICTOR\t20359A\t36964-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0816_01.mp3\tLee Morse\tTonight You Belong Tome\tPathe\t25197A\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35351-3.mp3\tJack Smith\tTonight's My Night With Baby\tVICTOR\t20069A\t35351-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBan1745.mp3\tSam Lanlin & His Orchestra\tTonight's My Night With Baby\tBanner\t1745\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_177.mp3\tBill Darnel Feat. O/bob Austin\tTonight, Love\tDECCA\t28706\t83598\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16224.mp3\tDjango Reinhardt - Stan Brenders Et Son Grand Orchestre De Danse\tTons D'bne\tRythme\tD5024\t16224\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC75372.mp3\tRoy Bargy & Ramona\tTonys Wife\tVICTOR\t24268\t75372\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE17843.mp3\tAbe Lyman's California Orch\tToo Bad\tBRUNSWICK\t3084\tE17843\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VocE-2632.mp3\tKing Oliver And His Dixie Syncopators\tToo Bad\tVocalion\t1007\tE-2632\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh061.mp3\tTeddy Joyce And His Orchestra\tToo Beautiful For Words\tHMV\tBD-125\tOEA-749-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17390By.mp3\tThe Growler\tToo Botheration\tDECCA\t17390B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA1997.mp3\tOrrin Tucker And His Orch\tToo Busy\tCOLUMBIA\t35528\tLA1997\t1939\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC46003-2.mp3\tCoon Sanders Nighthawk Orch\tToo Busy\tVICTOR\t21546\t46003-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_237.mp3\tEydie Gorme\tToo Close For Comfort\tABC-Paramount\t9684\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO38067.mp3\tArthur Godfrey\tToo Fat Polka\tCOLUMBIA\t37921\tCO38067\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_019.mp3\tArthur Godfrey\tToo Fat Polka (i Don't Want Her-you Can Have Her-she's Too Fat For Me)\tCOLUMBIA\t37921\tCO38067\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC1377.mp3\tTeddy Wilson And His Orchestra\tToo Good To Be True\tBRUNSWICK\t7673\tC1377\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19244-1.mp3\tCharlie Barnet & His Orchestra\tToo Good To Be True (v C. Barnet)\tARC\tME60712\t19244-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU56758-2.mp3\tKing Oliver & His Orch\tToo Late\tBLUEBIRD\t7242\t56758-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUE37284.mp3\tBing Crosby\tToo Late\tBRUNSWICK\t6203\tE37284\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_355.mp3\tDecastro Sisters\tToo Late Now\tAbbott\t3011\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH0737.mp3\tAl Dexter And His Troopers\tToo Late To Worry\tOKEH\t6718\tH0737\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL3310.mp3\tTexas Jim Lewis\tToo Late To Worry, Too Blue To Care\tDECCA\t6099\tL3310\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_169.mp3\tAl Dexter And His Troopers\tToo Late To Worry, Too Blue To Cry\tOKEH\t6718\tH0737\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1156.mp3\tTed Daffan's Texans\tToo Late, Little Girl, Too Late\tOKEH\t6253\tDAL1156\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_224.mp3\tBob Dini Feat. O/norman Leyden\tToo Long\tDerby\t826\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU050158-1.mp3\tErskine Hawkins & His Orch\tToo Many Dreams\tBLUEBIRD\t10812\t050158-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU11334-A.mp3\tGuy Lombardo Royal Canadians\tToo Many Tears\tBRUNSWICK\t6261\t11334-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC71953.mp3\tLeo Reisman & His Orch\tToo Many Tears (vff)\tVICTOR\t22961\t71953\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA738-B.mp3\tJimmy Dorsey And His Orchestra With Bing Crosby\tToo Marvellous For Words \tDECCA\t\tDLA738-B \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA738-A.mp3\tJimmy Dorsey And His Orchestra With Bing Crosby\tToo Marvellous For Words \tDECCA\t1185\tDLA738-A \t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPjstmfw.mp3\tJo Stafford\tToo Marvelous For Words\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO4011.mp3\tDoris Day W Harry James Orch\tToo Marvelous For Words\tCOLUMBIA\t38728\tHCO4011\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA738-A.mp3\tBing Crosby And Jimmy Dorsey\tToo Marvelous For Words\tDECCA\t1185\tDLA738-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYHL72.mp3\tGeorge Wettling's New Yorkers\tToo Marvelous For Words\tKEYNOTE\t1311\tHL72\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D110TMFW.mp3\tHelen Ward W Red Norvo\tToo Marvelous For Words\tV-DISC\t110\t\t\t\nhttp://www.jazz-on-line.com/a/mp3l/CBS20616.mp3\tLeo Reisman & His Orch\tToo Marvelous For Words\tCBS\tBR7831\t20616\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/VRIM-295-1.mp3\tChu Berry And His Stompy Stevedores\tToo Marvelous For Words\tVRI\t532\tM-295-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480395.mp3\tArt Tatum\tToo Marvelous For Words\tClef\tEP-C-357\t1467-1\t1953\tArt Tatum (p-solo)\nhttp://www.jazz-on-line.com/a/mp3b/Joh062.mp3\tRoy Fox And His Orchestra\tToo Marvelous For Words (v Denny Dennis)\tHMV\tBD-5245\tOEA-5040-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP593.mp3\tColeman Hawkins & His Orch\tToo Much Of A Good Thing\tCAPITOL\t\t593\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MER6348X.mp3\tCarlisle Brothers\tToo Old To Cut The Mustard\tMERCURY\t6348\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_094.mp3\tRosemary Clooney And Marlene Dietrich Feat. Stan Freeman (director) (harpsichord)\tToo Old To Cut The Mustard\tCOLUMBIA\t39812\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_094.mp3\tRosemary Clooney And Marlene Dietrich Feat. Stan Freeman (director) (harpsichord)\tToo Old To Cut The Mustard\tCOLUMBIA\t39812\tCO47401\t1952\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3456.mp3\tBing Crosby - J.s.trotter Or.\tToo Ra-loo-ra Loo-rai\tDECCA\t18621\tL3456\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC044682.mp3\tTommy Dorsey And His Orch\tToo Romantic\tVICTOR\t26500\t044682\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046785.mp3\tGlenn Miller & His Orch\tToo Romantic\tBLUEBIRD\t10605\t046785\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/SILP2222-2.mp3\tLovie Austin Blue Serenaders\tToo Sweet For Words\tSILVERTONE\t3537\tP2222-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142428-3.mp3\tNew Orleans Wanderers\tToo Tight\tCOLUMBIA\t735 D\tW142428-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU48800-3.mp3\tJohnny Dodds Washboard Band\tToo Tight\tBLUEBIRD\t10240\t48800-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/PARG15460.mp3\tBlind Blake\tToo Tight Blues #2\tPARAMOUNT\t12824A\tG15460\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048780.mp3\tFats Waller And His Rhythm\tToo Tired\tBLUEBIRD\t10779\t048780\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1924_1211_02.mp3\tLee Morse And Her Bluegrass Boys\tToo Tired\tPerfect\t12179B\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC55653-1.mp3\tAllstar Orch (shilkret)\tToo Wonderful For Words (vfm)\tVICTOR\t22104A\t55653-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1449x.mp3\tKing Cole Trio\tToo Young\tCAPITOL\t1449\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_246.mp3\tRichard Hayes\tToo Young\tMERCURY\t5599\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_117.mp3\tToni Arden Feat. Percy Faith's Orchestra\tToo Young\tCOLUMBIA\t39271\tCO45145\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_182.mp3\tFran Allison Feat. C/jack Fascinato\tToo Young\tRCA VICTOR\t4105\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_165.mp3\tPatty Andrews Feat. V/bob Crosby And O/victor Young\tToo Young\tDECCA\t27569\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_389.mp3\tPatti Page\tToo Young To Go Steady\tMercury\t70820\tYMB12178-1\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_170.mp3\tNat ''king'' Cole\tToo Young To Go Steady\tCapitol\t3390\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142641-1.mp3\tCharlie Poole N.c.ramblers\tToo Young To Marry\tCOLUMBIA\t15127 D\tW142641-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D301B1.mp3\tBing Crosby\tToo-ra-loo-ra-loo-ral (that's An Irish Lullaby)\tV-DISC\t301B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3895.mp3\tBing Crosby - J.s.trotter Orch\tToo-ra-loo-ra-ral (going My Way - Album)\tDECCA\t18704A\tL3895\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64823.mp3\tRodney Sturgis\tToodle-loo On Down\tDECCA\t7550\t64823\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63576.mp3\tBob Howard & His Orch\tToodle-oo\tDECCA\t1869B\t63576\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69915-B.mp3\tBuddy Johnson & His Band\tToodle-oodle-oo\tDECCA\t8599\t69915-B\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146774.mp3\tCharlie Poole N.c.ramblers\tTook My Gal A Walking\tCOLUMBIA\t15672 D\tW146774\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4702.mp3\tAndrews Sisters - Vic Schoen\tToolie Oolie Doolie\tDECCA\t24380\tL4702\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_089.mp3\tSportsmen\tToolie Oolie Doolie\tCapitol\t15077\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_022.mp3\tAndrews Sisters\tToolie Oolie Doolie (yodel Polka)\tDECCA\t24380\tL4702\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1449.mp3\tAugie Goupil's Royal Tahitians\tToomba\tDECCA\t2244B\tDLA1449\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/SON3003-B.mp3\tRaymond Scott\tToonerville Trolley\tSONORA\t3003\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80532.mp3\tAl Jolson\tToot Toot Tootsie\tCOLUMBIA\tA-3705\t80532\t1922\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-3705.mp3\tAl Jolson\tToot Toot Tootsie\tCOLUMBIA\tA-3705\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_132.mp3\tVincent Lopez And His Orchestra\tToot Toot Tootsie (goo'bye)\tOkeh\t4706\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC26872-3.mp3\tBenson Orchestra Of Chicago\tToot Toot Tootsie Goodby\tVICTOR\t18954\t26872-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_138.mp3\tBenson Orchestra Of Chicago\tToot Toot Tootsie! (goo-bye!)\tVICTOR\t18954\t26872-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4443.mp3\tAl Jolson - Morris Stoloff\tToot, Toot, Tootsie\tDECCA\t24108\tL4443\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM49S326.mp3\tArt Mooney And His Orchestra\tToot,toot,tootsie\tMGM\t30780\t49S326\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1234.mp3\tArnett Cobb & His Orchestra\tTop Flight\tAPOLLO\t770\tR1234\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUB17736-2.mp3\tFred Astaire W Johnny Green\tTop Hat, White Tie And Tails\tBRUNSWICK\t7487\tB17736-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60029.mp3\tBoswell Sisters\tTop Hat, White Tie And Tails\tDECCA\t574B\t60029\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC92229.mp3\tRay Noble And His Orch\tTop Hat, White Tie And Tails (vab)\tVICTOR\t25094\t92229\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_030.mp3\tFred Astaire Feat. Johnny Green And His Orchestra\tTop Hat, White Tie, And Tails\tBRUNSWICK\t7487\tB17736-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU06850.mp3\tClarence Williams Washboard Bd\tTop Of The Town\tBLUEBIRD\t6918\t06850\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic20-3020-A.mp3\tSpade Cooley\tTopeka Polka\tVictor\t20-3020-A\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62514.mp3\tCount Basie And His Orch\tTopsy\tDECCA\t1770B\t62514\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC028943.mp3\tBenny Goodman And His Orchestra\tTopsy\tVICTOR\t26107\t028943\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_277.mp3\tBenny Goodman And His Orchestra\tTopsy\tVICTOR\t26107\t028943\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu051524-1.mp3\tEarl Hines And His Orchestra\tTopsy - Turvy\tBluebird\tB-10870\t051524-1\t1940\tWalter Fuller (tp,vcl) Shirley Clay, Ed Sims (tp) George Dixon (tp,as) Ed Burke, John Ewing, Joe McLewis (tb) Omer Simeon (cl,bar) Leroy Harris (as,vcl) Jimmy Mundy (ts,arr) Robert Crowder (ts) Earl Hines (p) Claude Roberts (g) Quinn Wilson (b) Alvin Burroughs (d) Billy Eckstine, Leroy Harris (vcl) Buster Harding, Edgar Battle (arr)\nhttp://www.jazz-on-line.com/a/mp3c/BLU051524.mp3\tEarl Hines & His Orch\tTopsy Turvy\tBLUEBIRD\t10870\t051524\t1940\t\nhttp://www.jazz-on-line.com/a/mp3l/DEC60965-B.mp3\tIsham Jones's Juniors\tTormented\tDecca\t770 A\t60965-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU101198.mp3\tWingy Manone & His Orch\tTormented\tBLUEBIRD\t6359\t101198\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_234.mp3\tWingy Manone And His Orchestra\tTormented\tBluebird\t6359\t101198\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_136.mp3\tRichard Himber And His Orchestra\tTormented\tVictor\t25293\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/GRE3867.mp3\tCliff Jackson\tTorrid Rhythm\tGREYGULL\t0951\t3867\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/Mad951.mp3\tCliff Jackson And His Krazy Kats\tTorrid Rhythm\tMadison\t3867\t951\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COM4308-3.mp3\tEddie Condon & His Band\tTortilla B Flat\tCOMMODORE\t1509\t4308-3\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU42927-1.mp3\tBennie Moten's Kansas City Or.\tTough Breaks\tBLUEBIRD\t6638\t42927-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB16975.mp3\tDuke Ellington & His Orch\tTough Truckin'\tCOLUMBIA\t37297\tB16975\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480923.mp3\tCarmen Miranda, The Andrews Sisters And Vic Schoen's Orchestra\tTouradas Em Madrid (a-k-a ''the Matador''\tDECCA\t24479-B\tL-4589\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480922.mp3\tCarmen Miranda And The Bando Da Lua\tTouradas Em Madrid (a-k-a ''the Matador'')\tDECCA\t23130-B\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYKTS4.mp3\tBud Freeman & His Orch\tTown Hall Blues\tKEYNOTE\t638\tKTS4\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_012.mp3\tCorrine Morgan And Haydn Quartet\tToyland\tVictor\t2721\t\t1904\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_176.mp3\tEileen Barton Feat. O/jack Pleis\tToys\tCORAL\t61019\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW143345-4.mp3\tFletcher Henderson & His Orch\tTozo!\tCOLUMBIA\t970 D\tW143345-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_489.mp3\tLavern Baker And The Gliders\tTra La La\tAtlantic\t1116\t1809\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_189.mp3\tGeorgia Gibbs\tTra La La\tMercury\t70998\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC051579.mp3\tTommy Dorsey And His Orch\tTrade Winds\tVICTOR\t26666\t051579\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2013.mp3\tBing Crosby And Dick Mcintyre\tTrade Winds\tDECCA\t3299B\tDLA2013\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2013.mp3\tBing Crosby & Dick Mcintyre\tTrade Winds\tDECCA\t25024\tDLA2013\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_076.mp3\tTommy Dorsey And His Orchestra\tTrade Winds\tVICTOR\t26666\t051579\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLUB-10385-A.mp3\tArtie Shaw And His Orchestra\tTraffic Jam\tBLUEBIRD\tB-10385-A\t036268-4\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_130.mp3\tArtie Shaw And His Orchestra\tTraffic Jam\tBLUEBIRD\tB-10385-A\t036268\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU07055.mp3\tWade Mainer And Zeke Morris\tTrain Carry My Gal Back Home\tBLUEBIRD\t6890\t07055\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS23882.mp3\tSonny Terry\tTrain Whistle Blues\tCBS\tCo417M\t23882\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic69452t.mp3\tNina De Charny\tTramonto D'oro\tVictor\t69452\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3a/VICB4213.mp3\tByron Harlan And Frank Stanley\tTramp Tramp Tramp\tVICTOR\t16531A\tB4213\t1907\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC16531A.mp3\tByron Harlan & Frank Stanley\tTramp Tramp Tramp\tVICTOR\t16531A\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_010.mp3\tFrank Stanley And Byron G. Harlan\tTramp! Tramp! Tramp!\tVICTOR\t16531A\tB4213\t1910\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77242.mp3\tCharles Harrison (tenor)\tTramp, Tramp, Tramp The Boys Are Marching\tCOLUMBIA\tA-2357\t77242\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_060.mp3\tNervous Norvus\tTransfusion\tDot\t15470\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-7301.mp3\tJimmie Noone's Apex Club Orchestra\tTrav'lin All Alone ? V M B\tVocalion \t1580\tC-7301\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC6125.mp3\tIsham Jones And His Orch\tTrav'lin' All Alone\tBRUNSWICK\t4985\tC6125\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS21688-1.mp3\tBillie Holiday\tTrav'lin' All Alone\tCBS\tVO3748\t21688-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_313.mp3\tBillie Holiday\tTrav'lin' All Alone\tCBS\tVO3748\t21688-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP30-A.mp3\tPaul Whiteman And His Orch\tTrav'lin' Light (vb.holiday)\tCAPITOL\t116\t30-A\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC67840.mp3\tAlabama Sheiks\tTravelin' Railroad Man Blues\tVICTOR\t23265\t67840\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/PAR10005.mp3\tLovie Austin Blue Serenaders\tTraveling Blues\tPARAMOUNT\t12255\t10005\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN1009TB.mp3\tZeb Turner\tTraveling Boogie\tKING\t1009\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVU1166.mp3\tGene Ammons\tTraveling Light\tSAVOY\t4526\tU1166\t1952\t\nhttp://www.jazz-on-line.com/a/mp3d/BruC-6431.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tTravellin' That Rocky Road\tBrunswick\t4981\tC-6431\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU59141-2.mp3\tMckinney's Cotton Pickers\tTravelling All Alone\tBLUEBIRD\t5647\t59141-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_114.mp3\tClyde Mcphatter\tTreasure Of Love\tAtlantic\t1092\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU41737.mp3\tJimmie Rodgers\tTreasures Untold\tBLUEBIRD\t5838\t41737\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic066795-1.mp3\tBenny Carter And His Orchestra\tTree Of Hope\tVictor\t741073\t066795-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC017767-1.mp3\tBunny Berigan And His Orch\tTrees\tVICTOR\t26138A\t017767-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CHE1456.mp3\tAl Hibbler\tTrees\tCHESS\tCHES1456\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL431.mp3\tErroll Garner Trio\tTrees\tATLANTIC\t674\t431\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC5747-A.mp3\tIsham Jones' Orchestra\tTrees\tBRUNSWICK\t4856\tC5747-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC86146.mp3\tLouis Armstrong With\tTrees\tDECCA\t29352\t86146\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21734-1.mp3\tFletcher Henderson And His Orchestra\tTrees\tVocalion\t3760\t21734-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39320.mp3\tClaude Hopkins And His Orchestra\tTrees (vorlando Robertson)\tDECCA\t374A\t39320\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK9028.mp3\tWynonie Harris\tTremblin'\tKING\t4662\tK9028\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/WES120x.mp3\tLu Watters Yerba Buena Jazz Ban\tTriangle Jazz Blues\tWest Coast\t120\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE37267.mp3\tCab Calloway & His Orch\tTrickeration\tBRUNSWICK\t6214\tE37267\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_096.mp3\tCab Calloway And His Orchestra\tTrickeration\tBrunswick\t6214\tE37267\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-37267-A.mp3\tCab Calloway And His Orchestra\tTrickeration\tBrunswick\t6214\tE-37267-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_428.mp3\tGus Jinkins And Orchestra\tTricky\tFlash\t115\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3h/RCAE4VH-0793-a.mp3\tDick Collins And The Runaway Herd\tTricky Dick\tRCA VICTOR\t547-0460\tE4VH-0793-a\t1955\tformerly of Woody Herman Orchestra\nhttp://www.jazz-on-line.com/a/mp3a/OKEHCO1365.mp3\tAl Dexter And His Troopers\tTriflin' Gal\tOKEH\t6740\tHCO1365\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU76874-1.mp3\tJimmie Davis\tTriflin' Mama Blues\tBLUEBIRD\t5635\t76874-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5984.mp3\tWynonie Harris & His Allstars\tTriflin' Woman\tKING\t4415\tK5984\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DIAD1056-B.mp3\tErroll Garner Trio\tTrio\tDIAL\t1016\tD1056-B\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/DIAD1056-B.mp3\tErroll Garner Trio\tTrio\tDIAL\t1016\tD1056-B\t1946\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480624.mp3\tArt Tatum And Red Callender\tTrio Blues\tBarclay\tGLP3592\t2676-2\t1956\tArt Tatum (p) Red Callender (b) Jo Jones (d)\nhttp://www.jazz-on-line.com/a/mp3b/Har1473-2.mp3\tAnna Jones\tTrixie Blues\tHarmograph\t859\t1473-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3h/Pat106251.mp3\tDuke Ellington's Washingtonians\tTrombone Blues\tPathe Actuelle\t36333\t106251-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143575-3.mp3\tBessie Smith\tTrombone Cholly\tCOLUMBIA\t14232 D\tW143575-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP3539.mp3\tBlue Lu Barker\tTrombone Man Blues\tCAPITOL\t\t3539\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31805.mp3\tGene Krupa & His Orch\tTropical Magic\tOKEH\t6517\t31805\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/PUR601.mp3\tFletcher Henderson & His Orch\tTrot Along\tPURITAN\tPU11256\t601\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC27514-7.mp3\tBenson Orchestra Of Chicago\tTrot Along\tVICTOR\t19044\t27514-7\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_113.mp3\tBenson Orchestra Of Chicago\tTrot Along\tVICTOR\t19044\t27514-7\t1922\t\nhttp://www.jazz-on-line.com/a/mp3d/Oly601-1.mp3\tHenderson's  Dance Players\tTrot Along\tOlympic\t1442\t601-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27416.mp3\tJoshua White & Carolinians\tTrouble\tCOLUMBIA\t35560\t27416\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL35560.mp3\tJoshua White & Carolinians\tTrouble\tCOLUMBIA\t35560\t27416\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/ALLRR613-5.mp3\tCharles Brown Trio\tTrouble Blues\tALLADDIN\t3024\tRR613-5\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP347.mp3\tMcshann's Kansas City Stompers\tTrouble In Mind\tCAPITOL\t\t347\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62152.mp3\tWoody Herman & His Orchestra\tTrouble In Mind\tDECCA\t1307\t62152\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU100681-1.mp3\tRichard M Jones\tTrouble In Mind\tBLUEBIRD\t6963\t100681-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17432H-.mp3\tThe Dutch Swing College Band\tTrouble In Mind\tPhilips\tP17432H\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC42930-1.mp3\tBennie Moten Kansas City Orch\tTrouble In Mind\tVICTOR\t21739\t42930-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC90723-A.mp3\tGeorgia White\tTrouble In Mind\tDECCA\t7192\tC90723-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO7y.mp3\tTurk Murphy's Jazz Band\tTrouble In Mind\tGood Time Jazz\t7\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D129B1.mp3\tSister Rosetta Tharpe With Lucky Millinder\tTrouble In Mind\tV-DISC\t129B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69437-A.mp3\tLucky Millinder And His Orchestra\tTrouble In Mind\tDecca\t4041\t69437-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/V-DVP-392B.mp3\tSister Tharpe With Lucky Millinder And His Orchestra\tTrouble In Mind\tV-Disc\t129-B\tVP-392\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69437.mp3\tLucky Millinder & His Orch\tTrouble In Mind (v R. Tharpe)\tDECCA\t4041B\t69437\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC77440-1.mp3\tEddy Duchin & His Orch\tTrouble In Paradise\tVICTOR\t24377\t77440-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC24377.mp3\tEddy Duchin & His Orchestra\tTrouble In Paradise\tVICTOR\t24377\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_199.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tTrouble In Paradise\tVICTOR\t24377\t77440-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_173.mp3\tGlen Gray And Casa Loma Orchestra\tTrouble In Paradise\tBRUNSWICK\t6602\t13500-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLH1212.mp3\tTed Daffan's Texans\tTrouble Keeps Hangin' Round My Door\tCOLUMBIA\t20015\tH1212\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC27203TT.mp3\tLouis Jordan\tTrouble Then Satisfaction\tDECCA\t27203\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE37223.mp3\tDon Redman & His Orch\tTrouble Why Pick On Me\tBRUNSWICK\t6233\tE37223\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S6042.mp3\tBob Wills And His Texas Playboys\tTrouble, Trouble\tMGM\t11322\t52S6042\t1952\t\nhttp://www.jazz-on-line.com/a/mp3d/APOR-1008.mp3\tEarl Hines Sextet\tTrouble, Trouble\tAPOLLO\t357\tR-1008\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/ApoR-1008.mp3\tEarl Hines Sextet\tTrouble, Trouble\tApollo\t357\tR-1008\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC86222-1.mp3\tFrankie Trumbauer & His Orch\tTroubled\tVICTOR\t24834\t86222-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14752.mp3\tCharlie Patton & Bertha Lee\tTroubled Bout My Mother\tARC\tVO2904z\t14752\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC79211-2.mp3\tDuke Ellington & His Orch\tTroubled Waters\tVICTOR\t24651\t79211-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69117.mp3\tBuddy Johnson & His Band\tTroyon Swing\tDECCA\t8562\t69117\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM51S6000.mp3\tCannonball Lewis\tTruck Driver Night Run Blues\tMGM\t11071\t51S6000\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC92915-1.mp3\tFats Waller And His Rhythm\tTruckin'\tVICTOR\t25116\t92915-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COL17925.mp3\tMills Blue Rhythm Band\tTruckin'\tCOLUMBIA\t3078 D\t17925\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17975.mp3\tDuke Ellington's Famous Orch\tTruckin'\tBRUNSWICK\t7514\t17975\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/HISB-D-262y.mp3\tFats Waller And His Rhythm\tTruckin'\tHis Master's Voice\tB-D-262\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-17925-1.mp3\tMills Blue Rhythm Band\tTruckin'\tColumbia\t3078-D\tCO-17925-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_164.mp3\tMills Blue Rhythm Band\tTruckin'\tCOLUMBIA\t3078 D\t17925\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480659.mp3\tDuke Ellington And His Famous Orchestra\tTruckin'\tBrunswick\t7514\t17975-1\t1935\tIvie Anderson (vo), Arthur Whetsel, Cootie Williams (tp), Rex Stewart (co), Joe Nanton, Lawrence Brown (tb), Juan Tizol (vtb), Johnny Hodges (cl, ss, as), Harry Carney (cl, as, bar), Otto Hardwick (as, bsx), Barney Bigard (cl, ts), Ben Webster (ts), Duke Ellington (p), Fred Guy (g), Hayes Alvis, Billy Taylor (sb), Sonny Greer (dm)\nhttp://www.jazz-on-line.com/a/mp3h/Gen14860-B.mp3\tPat Dollohan And His Orchestra\tTrue Blue\tGennett\t6784\t14860-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW148671-4.mp3\tEthel Waters And Her Ebony 4\tTrue Blue Lou\tCOLUMBIA\t1871 D\tW148671-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU022203.mp3\tBoots And His Buddies\tTrue Blue Lou\tBLUEBIRD\t7596\t022203\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU022203HW2-8.mp3\tBoots And His Buddies\tTrue Blue Lou\tBLUEBIRD\t7596\t022203\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA-1137-1.mp3\tLouis Armstrong And His Orchestra\tTrue Confession\tDecca\t1635\tDLA-1137-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC015839-1.mp3\tLarry Clinton & His Orchestra\tTrue Confession (vbw)\tVICTOR\t25706B\t015839-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CON21958-2.mp3\tSammy Kaye Swing & Sway Orch\tTrue Confession (vcharlie Wilson)\tCONQUEROR\t8970\t21958-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC4356.mp3\tBill Monroe\tTrue Life Blues\tCOLUMBIA\t20080\tC4356\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_028.mp3\tBing Crosby And Grace Kelly\tTrue Love\tDecca\t3507\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_107.mp3\tJane Powell\tTrue Love\tVerve\t2018\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE35890.mp3\tOzzie Nelson & His Orch\tTruly (i Love You) (v O N)\tBRUNSWICK\t6018\tE35890\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO32473-1.mp3\tHarry James And His Orch\tTrumpet Blues\tCOLUMBIA\t36549\tCO32473-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-19564-1.mp3\tDuke Ellington And His Orchestra\tTrumpet In Spades (rex's Concerto)\tBrunswick\t7752\tB-19564-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19564.mp3\tDuke Ellington's Orch\tTrumpet In Spades (rex)\tBRUNSWICK\t7752\t19564\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5815-.mp3\tDuke Ellington & His Orch\tTrumpet No End (blue Skies)\tMUSICRAFT\t484\t5815\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D213A2.mp3\tHarry James And His Orchestra\tTrumpet Rhapsody\tV-DISC\t213A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_172b.mp3\tHarry James And His Orchestra\tTrumpet Rhapsody\tV-DISC\t213A2\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82327.mp3\tColeman Hawkins & His Orch\tTrust In Me\tDECCA\t28056\t82327\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1752.mp3\tMildred Bailey & Her Orchestra\tTrust In Me\tVOCALION\t3449\tC1752\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_064.mp3\tMildred Bailey\tTrust In Me\tVOCALION\t3449\tC1752\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_218.mp3\tEddie Fisher\tTrust In Me\tRCA Victor\t4444\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_122.mp3\tStan Freberg\tTry\tCapitol\t2029\t9814\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152365-2.mp3\tTed Lewis And His Band\tTry A Little Tenderness\tCOLUMBIA\t2748 D\tW152365-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12857-A.mp3\tBing Crosby\tTry A Little Tenderness\tBRUNSWICK\t6480\t12857-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP6413.mp3\tEddie Heywood\tTry A Little Tenderness\tCOLUMBIA\t39319\tZSP6413\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1996-2.mp3\tCharlie Palloy & His Orch\tTry A Little Tenderness\tCROWN\t3462\tC1996-2\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_052.mp3\tTed Lewis And His Band\tTry A Little Tenderness\tCOLUMBIA\t2748 D\tW152365-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_171.mp3\tRuth Etting\tTry A Little Tenderness\tBANNER\t32695\t13040-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC60989.mp3\tTiger And Gerald Clark\tTry A Screw To Get Through\tDECCA\t17268B\t60989\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-11367-A.mp3\tDon Redman And His Orchestra\tTry Getting A Good Night's Sleep\tBrunswick\t6273\tB-11367-A  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_137.mp3\tErnest Tubb\tTry Me One More Time\tDECCA\t6093\tL3100\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49458-2.mp3\tJelly Roll Morton Peppers\tTry Me Out\tVICTOR\t38113A\t49458-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic49458-2.mp3\tJelly Roll Morton And His Orchestra\tTry Me Out\tVictor\tV-381I3\t49458-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC70938-4.mp3\tLeo Reisman & His Orch\tTry To Forget\tVICTOR\t22870\t70938-4\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11367-A.mp3\tDon Redman & His Orch\tTry To Get A Good Night's Sleep\tBRUNSWICK\t6273\t11367-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83243.mp3\tElla Fitzgerald\tTrying\tDECCA\t28375\t83243\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_247.mp3\tJohnny Desmond Feat. O/tony Mottola; Bv/ray Charles Singers\tTrying\tCoral\t608823\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_192.mp3\tElla Fitzgerald Feat. Leroy Kirkland's Orchestra\tTrying\tDECCA\t28375\t83243\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS21524.mp3\tManone,wingy\tTrying To Stop My Crying\tCBS\tHRS-3\t21524\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1054-A.mp3\tCab Calloway And His Orchestra\tTrylon Swing\tVocalion\t5005\tWM-1054-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/CONM1054-A.mp3\tCab Calloway & His Orch\tTrylong Swing\tCONQUEROR\t9300\tM1054-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC64350.mp3\tAndrews Sisters And Jimmy Dorsey\tTu-li Tulip Time\tDECCA\t1974A\t64350\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_162.mp3\tAndrews Sisters Feat. O/jimmy Dorsey\tTu-li Tulip Time\tDECCA\t1974A\t64350\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_351.mp3\tHenry Busse And His Orchestra (v-don Huston)\tTu-li Tulip Time\tDecca\t1975\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU55308.mp3\tJimmie Rodgers\tTuck Away My Lonesome Blues\tBLUEBIRD\t5664\t55308\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL256-2.mp3\tLee O'daniel Hillbilly Boys\tTuck Away My Lonesome Blues\tVOCALION\t4102\tDAL256-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_018.mp3\tVernon Dalhart With Criterion Trio\tTuck Me To Sleep (in My Old 'tucky Home)\tVICTOR\t18807\t25532-5\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO30648-2.mp3\tBenny Goodman & His Orch\tTuesday At Ten\tCOLUMBIA\t36254\tCO30648-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29584-1.mp3\tCount Basie And His Orchestra\tTuesday At Ten\tOkeh\t6071\t29584-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic48-0467-A.mp3\tSpade Cooley\tTuesday Twostep\tVictor\t48-0467-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5841.mp3\tDuke Ellington & His Orch\tTulip Or Turnip (v Ray Nance)\tMUSICRAFT\t483\t5841\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24218TTH.mp3\tEddie Condon & His Orchestra\tTulip Time In Holland\tDECCA\t24218\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_126.mp3\tPerry Como Feat. Mitchell Ayres' Orchestra\tTulips And Heather\tRCA Victor\t4453\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO3491.mp3\tXavier Cugat And His Orch\tTumbao\tCOLUMBIA\t36388\tCCO3491\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1919.mp3\tBing Crosby - J.s.trotter\tTumbling Tumbleweeds\tDECCA\t3024A\tDLA1919\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61927.mp3\tSons Of The Pioneers\tTumbling Tumbleweeds\tDECCA\t5358\t61927\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D393B2.mp3\tJo Stafford\tTumbling Tumbleweeds\tV-DISC\t393B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_142.mp3\tGene Autry\tTumbling Tumbleweeds\tCOLUMBIA\t20084\tHCO1868\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_330.mp3\tRoger Williams\tTumbling Tumbleweeds\tKapp\t156\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_299.mp3\tGlen Gray And Casa Loma Orchestra\tTumbling Tumbleweeds\tDECCA\t2777A\t66078\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30522.mp3\tCount Basie & His Orch\tTune Town Shuffle\tOKEH\t6267\t30522\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30829.mp3\tGene Krupa & His Orch\tTunin' Up\tOKEH\t6352\t30829\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1585.mp3\tAugie Goupil's Royal Tahitians\tTupuha\tDECCA\t2252B\tDLA1585\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec76021.mp3\tLionel Hampton And His Orchestra\tTurkey Hop - Part 1\tDecca\t24992\t76021\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec76022.mp3\tLionel Hampton And His Orchestra\tTurkey Hop - Part 2\tDecca\t24992\t76022\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76021.mp3\tLionel Hampton's Orch\tTurkey Hop Part 1\tDECCA\t24992\t76021\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76022.mp3\tLionel Hampton's Orch\tTurkey Hop Part 2\tDECCA\t24992\t76022\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142041-3.mp3\tGid Tanner's Skillet Lickers\tTurkey In The Straw\tCOLUMBIA\t15084 D\tW142041-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/COL30041.mp3\tBilly Golden\tTurkey In The Straw\tCOLUMBIA\tA-5031\t30041\t1906\t\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-3272-A.mp3\tHorace Henderson And His Orchestra\tTurkey Special\tOKEH\t6026\tWC-3272-A\t1940\t\nhttp://www.jazz-on-line.com/mp3/783320188.mp3\tRay Noble's Mayfair Orch\tTurkish Delight\tVICTOR\t24427\t24427x\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_280.mp3\tLew Douglas And His Orchestra; Vocal By Bill Bailey\tTurn Around Boy\tMGM\t11654\t53S509\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_054.mp3\tEddie Fisher\tTurn Back The Hands Of Time\tRCA Victor\t4257\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_245.mp3\tJimmy Dorsey And His Orchestra\tTurn Left\tDECCA\t3647A\t68463\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06674-2.mp3\tTommy Dorsey & His Orch\tTurn Off The Moon\tVICTOR\t25553A\t06674-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_333.mp3\tMal Hallet And His Orchestra\tTurn Off The Moon\tDECCA\t1270\t62184\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70038TO.mp3\tNora Bayes & Jack Norworth\tTurn Off Your Light, Mister Moon Man\tVICTOR\t70038\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_084.mp3\tNora Bayes Feat. Jack Norworth\tTurn Off Your Light, Mr. Moon Man\tVICTOR\t70038\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_318.mp3\tBunny Berigan And His Orchestra Feat. Gail Reese\tTurn On That Red Hot Heat\tVICTOR\t25646A\t011674\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU31103.mp3\tEarl Burtnett & His Orch\tTurn On The Heat\tBRUNSWICK\t4573\t31103\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57503-4.mp3\tHorace Heidt & His Orch\tTurn On The Heat\tVICTOR\t22195\t57503-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC57191-1.mp3\tThomas Fats Waller\tTurn On The Heat\tVICTOR\t38568\t57191-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic57191-1.mp3\tThomas \"fats\" Waller\tTurn On The Heat\tVictor\tV-38568\t57191-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_073.mp3\tEarl Burtnett And His Los Angeles Biltmore Hotel Orchestra\tTurn On The Heat\tBRUNSWICK\t4573\t31103\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403050-B.mp3\tFrankie Trumbauer & His Orch\tTurn On The Heat (v S B)\tOKeh\t41313\t403050-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011674.mp3\tBunny Berigan & His Orch\tTurn On The Red Hot Heat\tVICTOR\t25646A\t011674\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL241.mp3\tErroll Garner Trio\tTurquoise\tATLANTIC\t663\t241\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC041597.mp3\tMaxine Sullivan\tTurtle Dove\tVICTOR\t26344\t041597\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU57785-1.mp3\tJelly Roll Morton Trio\tTurtle Twist\tBLUEBIRD\t10194\t57785-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64672-A.mp3\tDick Robertson And His Orch\tTutti Frutti\tDECCA\t2059A\t64672-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23165.mp3\tSlim And Slam\tTutti Frutti\tCBS\tVO4225\t23165\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/SPE561.mp3\tLittle Richard\tTutti Frutti\tSPECIALTY\t561\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_131.mp3\tLittle Richard\tTutti Frutti\tSpecialty\t561\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_088.mp3\tPat Boone\tTutti-frutti\tDot\t15443\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU038421.mp3\tErskine Hawkins And His Orch\tTuxedo Junction\tBLUEBIRD\t10409\t038421\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU046786.mp3\tGlenn Miller And His Orch\tTuxedo Junction\tBLUEBIRD\t10612\t046786\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK3002-1.mp3\tHank Penny\tTuxedo Junction\tKING\t1020A\tK3002-1\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon038421.mp3\tErskine Hawkins & His Orch\tTuxedo Junction\tMontgomeryWard\t8340\t038421\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO27027.mp3\tGene Krupa & His Orch\tTuxedo Junction\tCOLUMBIA\t37530\tCO27027\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC85531.mp3\tGlenn Miller ''the Glenn Miller Story''\tTuxedo Junction\tDECCA\t29014\t85531\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_005.mp3\tGlenn Miller And His Orchestra\tTuxedo Junction\tRCA\t20-1565\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_157.mp3\tErskine Hawkins And His Orchestra\tTuxedo Junction\tBluebird\t10409\t38421\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_219.mp3\tBob Bachelder And His Orchestra\tTv Rhumba\tMood\t62152-31011\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1066-A.mp3\tCab Calloway And His Orchestra\tTwee-twee-tweet\tVocalion\t5126\tWM-1066-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70517x.mp3\tGeorgia Gibbs\tTweedle Dee\tMERCURY\t70517\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL1334.mp3\tLaverne Baker & Gliders\tTweedle Dee\tATLANTIC\t1047\t1334\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_021.mp3\tGeorgia Gibbs\tTweedle Dee\tMercury\t70517\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_146.mp3\tGene Autry\tTweedle-o-twill\tOKEH\t6680\tH676\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_104.mp3\tLavern Baker And The Gliders\tTweedlee Dee\tAtlantic\t1047\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/ASC350-1B.mp3\tFletcher Henderson's Connie's I\tTwelfth Street Rag\tAsch Recordings\t350-1B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP3330-1D.mp3\tPeen Wee Hunt\tTwelfth Street Rag\tCAPITOL\t15105\t3330-1D\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS24339-A.mp3\tCount Basie And His Orch\tTwelfth Street Rag\tCBS\tVO4886\t24339-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COL27525.mp3\tFrankie Carle\tTwelfth Street Rag\tCOLUMBIA\t35572\t27525\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVoc4886.mp3\tCount Basie\tTwelfth Street Rag\tVocalion\t4886\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/MOD337.mp3\tPeen Wee Hunt\tTwelfth Street Rag\tMODERN\tCAP15105\t337\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88995-1.mp3\tFats Waller And His Rhythm\tTwelfth Street Rag\tVICTOR\t25087\t88995-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-3120.mp3\tSidney Bechet Footwarmers\tTwelfth Street Rag\tRCA\t20-3120\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11763-A.mp3\tAbe Lyman & His Orch\tTwelfth Street Rag\tBRUNSWICK\t6314\t11763-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68318-A.mp3\tAndy Kirk & Clouds Of Joy\tTwelfth Street Rag\tDECCA\t18123A\t68318-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW80864-A.mp3\tLouis Armstrong's Hot Five\tTwelfth Street Rag\tCOLUMBIA\t35663\tW80864-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037632.mp3\tLionel Hampton & His Orch\tTwelfth Street Rag\tVICTOR\t26362\t037632\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE35802.mp3\tDuke Ellington & His Orch\tTwelfth Street Rag\tBRUNSWICK\t6038\tE35802\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/COL149794.mp3\tGeorgia Cotton Pickers\tTwelfth Street Rag\tCOLUMBIA\tHA1090\t149794\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38671-1.mp3\tBennie Moten's Kansas Orch\tTwelfth Street Rag\tVICTOR\t20946\t38671-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_222.mp3\tLiberace\tTwelfth Street Rag\tCOLUMBIA\t40217\tRHCO10601\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_083.mp3\tFrankie Carle And His Orchestra\tTwelfth Street Rag\tCOLUMBIA\t35572\t27525\t1948\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec68318-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tTwelfth Street Rag\tDecca\t18123\t68318-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24339-A.mp3\tCount Basie And His Orchestra\tTwelfth Street Rag\tVocalion\t4886\t24339-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC4975hpp.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tTwelfth Year\tDECCA\tF-7133\t4975hpp\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL81381-5.mp3\tTed Lewis & His Band\tTwelve O'clock At Night\tCOLUMBIA\t52D\t81381-5\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_065.mp3\tTed Lewis And His Band\tTwelve O'clock At Night\tCOLUMBIA\t52D\t81381-5\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/CorLA-5840.mp3\tLionel Hampton And His Sextet\tTwentieth Century Boogie\tCoral\t622423\tLA-5840\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18196-1.mp3\tTeddy Wilson & His Orch\tTwenty Four Hours A Day (vbh)\tBRUNSWICK\t7550\t18196-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC15916-1.mp3\tIna Ray Hutton And Her Melodears\tTwenty Four Hours In Georgia\tVOCALION\t2801\t15916-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU063892.mp3\tFats Waller And His Rhythm\tTwenty Four Robbers\tBLUEBIRD\t11222\t063892\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM49S173.mp3\tArt Mooney And His Orchestra\tTwenty-four Hours Of Sunshine\tMGM\t10446A\t49S173\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_122.mp3\tArt Mooney And His Orchestra\tTwenty-four Hours Of Sunshine\tMGM\t10446A\t49S173\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec68876-A.mp3\tJimmie Lunceford And His Orchestra\tTwenty-four Robbers\tDecca\t3718\t68876-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_306.mp3\tMerv Griffin\tTwenty-three Starlets (and Me)\tRCA Victor\t4270\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_108.mp3\tMills Brothers\tTwice As Much\tDECCA\t28586\tL7027\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/ATL248.mp3\tErroll Garner Trio\tTwilight\tATLANTIC\t662\t248\t1949\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU13268.mp3\tGene Rodemich And His Orchestra\tTwilight\tBRUNSWICK\t2797B\t13268\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA1661.mp3\tSol Hoopii\tTwilight Blues\tDECCA\t2560A\tDLA1661\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/DECF10053.mp3\tTed Heath And His Music\tTwilight Boogie\tDECCA-LONDON\tF10053\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07804.mp3\tTommy Dorsey & His Clambake 7\tTwilight In Turkey\tVICTOR\t25568\t07804\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLM118.mp3\tRaymond Scott Qt\tTwilight In Turkey\tCOLUMBIA\t36107\tM118\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62172.mp3\tStuff Smith & Onyx Club Boys\tTwilight In Turkey\tDECCA\t1279\t62172\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_322.mp3\tTommy Dorsey And His Clambake Seven\tTwilight In Turkey\tRCA Victor\t25568\t07804\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_180.mp3\tRaymond Scott Quintet\tTwilight In Turkey\tBRUNSWICK\t7992\tM118\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038140.mp3\tGlenn Miller & His Orch\tTwilight Interlude (vre)\tBLUEBIRD\t10388\t038140\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE21810.mp3\tDykes Magic City Trio\tTwilight Is Stealing\tBRUNSWICK\t130\tE21810\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA307.mp3\tBing Crosby\tTwilight On The Trail\tDECCA\t2677B\tDLA307\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/COL140551.mp3\tLeo Reisman & His Orch\tTwilight The Stars & You\tCOLUMBIA\t384D\t140551\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC72431.mp3\tRoy Eldridge & His Orchestra\tTwilight Time\tDECCA\t23383\t72431\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/HITT378-2.mp3\tThree Suns\tTwilight Time\tHIT OF THE WEEK\t7092\tT378-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D339B1.mp3\tThe Three Suns\tTwilight Time\tV-DISC\t339B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiHIT7092.mp3\tThree Suns\tTwilight Time\tHIT OF THE WEEK\t7092\tT378-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_206.mp3\tJohnny Maddox And The Rhythmasters\tTwilight Time\tDOT\t15062\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_219.mp3\tLes Brown And His Orchestra\tTwilight Time\tCOLUMBIA\t36769\tCO33825\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_095.mp3\tThree Suns\tTwilight Time\tHIT OF THE WEEK\t7092\tT378-2\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63605.mp3\tWoody Herman & His Orchestra\tTwin City Blues\tDECCA\t1801B\t63605\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEDAL1178.mp3\tBob Wills And His Texas Playboys\tTwin Guitar Special\tOKEH\t6327\tDAL1178\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC63256.mp3\tAndy Kirk And Clouds Of Joy\tTwinklin'\tDECCA\t2483B\t63256\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63256-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tTwinklin'\tDecca\t2483\t63256-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Sel10474.mp3\tErroll Garner\tTwistin' The Cat's Tail\tSelmer\tY7086\t10474\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/IMPBW68.mp3\tErroll Garner Trio\tTwisting The Cat's Tail\tIMPERIAL\t5078\tBW68\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143602-3.mp3\tMoran And Mack\tTwo Black Crows Part 1\tCOLUMBIA\t935 D\tW143602-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW143603-2.mp3\tMoran And Mack\tTwo Black Crows Part 2\tCOLUMBIA\t935 D\tW143603-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_152b.mp3\tMoran And Mack\tTwo Black Crows Part 8\tCOLUMBIA\t1350 D\tW145235\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_258.mp3\tKenny Baker Feat. O/nat Finston\tTwo Blind Loves\tVICTOR\t26413\t042121-6\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03733!.mp3\tBilly Murray (tenor-orch)\tTwo Blue Eyes\tCOLUMBIA\tA-0354\t03733!\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_026.mp3\tByron G. Harlan\tTwo Blue Eyes (two Little Baby Shoes)\tVictor\t5310\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC15618.mp3\tJohnny Green & His Orchestra\tTwo Cigarets In The Dark\tARC\tCO2943\t15618\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA66-C.mp3\tBing Crosby W George Stoll\tTwo Cigarets In The Dark\tDECCA\t245A\tDLA66-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC80697.mp3\tBuddy Johnson\tTwo Cigarettes In The Dark\tDECCA\t29058\t80697\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA66-C.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tTwo Cigarettes In The Dark\tDecca\t245\tDLA66-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruDLA66-A.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tTwo Cigarettes In The Dark\tBrunswick\t1874\tDLA66-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_023.mp3\tJohnny Green And His Orchestra\tTwo Cigarettes In The Dark\tColumbia\t2943-D\t15618\t1934\tGeorge Beuler (vo), Angie Rattinger and another (tp), unknown (tb), Jimmy Lytell (cl, as), Charles Dale (cl, as, bar), Ernest White, Murray Cohan (cl, ts), Leo Kruczck, Lou Kosloff, Joe Baum (vn), Johnny Green (p, ldr), David Terry (p), Perry Botkin (g), Kaspar Markowitz (sb), Al Lapin (dm) \nhttp://www.jazz-on-line.com/a/mp3w/1934_142.mp3\tGlen Gray And Casa Loma Orchestra Feat. Kenny Sargent\tTwo Cigarettes In The Dark\tBRUNSWICK\t6954\t15659-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_077.mp3\tDon Rondo\tTwo Different Worlds\tJubilee\t5256\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_433.mp3\tDick Haymes\tTwo Different Worlds\tCapitol\t3565\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_242.mp3\tRoger Williams And Jane Morgan\tTwo Different Worlds\tKapp\t161\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_220.mp3\tLarry Clinton And His Orchestra (v-bea Wain)\tTwo Dreams Got Together\tVictor\t25740\t017743-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_171.mp3\tMitchell Ayres And His Fashions In Music (voc Mary Ann Mercer)\tTwo Dreams Met\tBluebird\t10877\t056138\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_139.mp3\tEddy Duchin And His Orchestra Feat. V/johnny Drake\tTwo Dreams Met\tCOLUMBIA\t35774\t28749\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_106.mp3\tTommy Dorsey And His Orchestra Feat. V/connie Haines\tTwo Dreams Met\tVICTOR\t26764\t056130\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS28527-1.mp3\tGene Krupa & His Orch\tTwo Dreams Met (v Howard Dulany)\tCBS\toK5826\t28527-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72874.mp3\tLionel Hampton Septet\tTwo Finger Boogie\tDECCA\t23838\t72874\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72874.mp3\tLionel Hampton And His Septet\tTwo Finger Boogie\tDecca\t23838\t72874\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC39855.mp3\tBing Crosby & Dorsey Brothers\tTwo For Tonight\tDECCA\t543B\t39855\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru39855-A.mp3\tDorsey  Brothers  Orchestra With Bing Crosby\tTwo For Tonight\tBrunswick\tE02083\t39855-A \t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478392.mp3\tAlec Templeton\tTwo German Lieder Singers\tLIBERTY MUSIC SHOPS\t\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480924.mp3\tAlec Templeton (voice And Piano Impression)\tTwo German Lieder Singers\tGRAMOPHONE SHOP VARI\t\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_118.mp3\tPat Boone\tTwo Hearts\tDot\t15338\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU042181.mp3\tCharlie Barnet & His Orch\tTwo Hearts Are Better Than One (v J E)\tBLUEBIRD\t10479\t042181\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98100.mp3\tTommy Dorsey & His Orch\tTwo Hearts Carved On A Lonesome Pine\tVICTOR\t25191\t98100\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_136.mp3\tJohnny Hamp And His Orchestra\tTwo Hearts In Waltz Time\tVICTOR\t22638\t67501-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC87921.mp3\tBill Haley And His Comets\tTwo Hound Dogs\tDECCA\t29552\t87921\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_116b.mp3\tBill Haley And His Comets\tTwo Hound Dogs\tDecca\t29552\t87921\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC067651.mp3\tTommy Dorsey And His Orch\tTwo In Love\tVICTOR\t27611\t067651\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEH0527.mp3\tGene Krupa & His Orch\tTwo In Love\tOKEH\t6447\tH0527\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_072.mp3\tTommy Dorsey Orch V Frank Sinatra\tTwo In Love\tVICTOR\t27611\t067651\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA71711.mp3\tArtie Shaw And His Orchestra\tTwo In One Blues\tVICTOR\t20-1526\t071711-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3h/CRO1295-1.mp3\tEubie Blake And His Orchestra\tTwo Little Blue Little Eyes\tCROWN\t3111\t1295-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_256.mp3\tFour Aces\tTwo Little Kisses\tFlash\t103\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_141.mp3\tPerry Como And Jaye P. Morgan\tTwo Lost Souls\tRCA Victor\t6137\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/MER900-1.mp3\tFrankie Laine W Carl Fischer\tTwo Loves Have I\tMERCURY\t5064\t900-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_229.mp3\tPerry Como\tTwo Loves Have I\tRCA Victor\t2545\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480701.mp3\tNat King Cole\tTwo Loves Have I\tCapitol\tEMS-1103\t15939-15\t1956\tNat King Cole, P & Vocal, John Collins, G, Stuff Smith, V, Charlie Harris, B, Lee Young, D\nhttp://www.jazz-on-line.com/a/mp3a/CBS24194-1.mp3\tHarry James And His Orch\tTwo O'clock Jump\tCBS\tBR8337\t24194-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70803.mp3\tMuggsy Spanier & His Orch.\tTwo O'clock Jump\tDECCA\t4336A\t70803\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCBSBR8337.mp3\tHarry James And His Orch\tTwo O'clock Jump\tCBS\tBR8337\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_134.mp3\tHarry James And His Orchestra\tTwo O'clock Jump\tCAPITOL\t\t14253\t1943\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-24194-1.mp3\tHarry James And His Orchestra\tTwo O'clock Jump\tBrunswick\t8337\tB-24194-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68484.mp3\tHazel Scott (piano)\tTwo Part Invention In A Minor\tDECCA\t18127B\t68484\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_133.mp3\tJerry Vale\tTwo Purple Shadows\tCOLUMBIA\t40131\tCO50231\t1954\t\nhttp://www.jazz-on-line.com/a/mp3h/COL17681.mp3\tVic Berton And His Orchestra\tTwo Rivers Flow Thru Harlem\tCOLUMBIA\t3092 D\t17681\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1902_029.mp3\tByron G. Harlan And Frank Stanley\tTwo Rubes In A Tavern\tCOLUMBIA\t938\t\t1902\t\nhttp://www.jazz-on-line.com/a/mp3b/COL01559-1.mp3\tByron Harlan & Frank Stanley\tTwo Rubes In An Eating House\tCOLUMBIA\tA-0391\t01559-1\t1903\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh085.mp3\tAmbrose And His Orchestra\tTwo Sleeping People\tJohnW\t085\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU027289-1.mp3\tFats Waller And His Rhythm\tTwo Sleepy People\tBLUEBIRD\t10000A\t027289-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23568.mp3\tKay Kyser & His Orchestra\tTwo Sleepy People\tCBS\tBR8244\t23568\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DECC91540.mp3\tBob Crosby & His Orch\tTwo Sleepy People\tDECCA\t2150A\tC91540\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_261.mp3\tBob Hope And Shirley Ross\tTwo Sleepy People\tDECCA\t2219A\tDLA1582\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_129.mp3\tKay Kyser And His Orchestra\tTwo Sleepy People\tCBS\tBR8244\t23568\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_022.mp3\tFats Waller\tTwo Sleepy People\tRCA\t20-1583\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_239.mp3\tHoagy Carmichael And Ella Logan\tTwo Sleepy People\tBrunswick\t8250\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_203.mp3\tBob Crosby And His Orchestra Feat. V/bob Crosby And Marian Mann\tTwo Sleepy People\tDECCA\t2150A\tC91540\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24284.mp3\tBen Pollack & Jack Teagarden\tTwo Tickets To Georgia\tVictor\t24284\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12307-A.mp3\tDon Redman & His Orch\tTwo Time Man\tBRUNSWICK\t6412\t12307-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC74855-1.mp3\tBennie Moten Kansas City Orch\tTwo Times\tVICTOR\t23393\t74855-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401338-B.mp3\tLonnie Johnson-blind Willie\tTwo Tone Stomp\tOKeh\t8637\t401338-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D147A1.mp3\tThe Southern Sons\tTwo Wings\tV-DISC\t147A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL4384.mp3\tErnest Tubb\tTwo Wrongs Don't Make A Right\tDECCA\t46061\tL4384\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/MER1386.mp3\tCootie Williams & His Orch\tTyphoon\tMERCURY\t8083\t1386\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/MER5454x.mp3\tVic Damone\tTzena, Tzena, Tzena\tMERCURY\t5454\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC76421.mp3\tGordon Jenkins And Weavers\tTzena, Tzena, Tzena\tDECCA\t27077\t76421\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_066.mp3\tVic Damone Feat. Ronnie Selby's Orchestra And Chorus\tTzena, Tzena, Tzena\tMERCURY\t5454\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_172.mp3\tRalph Flanagan And His Orchestra\tTzena, Tzena, Tzena\tRCA VICTOR\t3847\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_067.mp3\tVaughn Deleath\tUkelele Lady\tCOLUMBIA\t361D\t140500\t1925\t\nhttp://www.jazz-on-line.com/a/mp3o/HMVBb-7069-3.mp3\tJack Hylton And His Orchestra\tUkulele Baby\tHMV\tB-5019\tBb-7969-3\t1926\tv Jack Hylton, Chappie D'Amato\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19690.mp3\tPaul Whiteman & His Orchestra\tUkulele Lady\tVictor\t19690\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0500_01.mp3\tLee Morse\tUkulele Lady\tPerfect\t11579A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/UltP-77354.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France Avec Stphane Grapelly\tUltrafox\tUltraphone\tAP-1484\tP-77354\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_183.mp3\tJimmy Durante\tUmbriago\tDECCA\t23351\tL3481\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/PatCPT-3836-1.mp3\tRay Ventura Et Ses Collgiens (with Django Reinhardt)\tUn Sourire En Chantant (with A Smile And A Song)\tPath\t1476\tCPT-3836-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_264.mp3\tNat King Cole Feat. O/nelson Riddle\tUnbelievable\tCAPITOL\t2949\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DJDB111.mp3\tDuke Ellington Orch\tUnbooted Character\tV-DISC\t671\tJDB111\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_025.mp3\tAl Hibbler\tUnchained Melody\tDecca\t29441\t87422\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_047.mp3\tRoy Hamilton\tUnchained Melody\tEpic\t9102\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_176.mp3\tJune Valli\tUnchained Melody\tRCA Victor\t6078\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_012.mp3\tLes Baxter And His Orchestra\tUnchained Melody\tCapitol\t3055\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU065727-1.mp3\tErskine Hawkins & His Orch\tUncle Bud\tBLUEBIRD\t11372 B\t065727-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69234.mp3\tSkeets Tolbert Gentlemen Swing\tUncle Eph's Dream\tDECCA\t8579\t69234\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec69234-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tUncle Epp's Dream\tDecca\t8579\t69234-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1984.mp3\tDorothy Shay\tUncle Fud\tCOLUMBIA\t37192\tHCO1984\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1891_011.mp3\tBilly Golden\tUncle Jefferson\tBERLINER\t0775V\t(Late)\t1891\t\nhttp://www.jazz-on-line.com/a/mp3c/SIL78502-2.mp3\tCal Stewart & Ada Jones\tUncle Josh & Aunt Nancy Visit New York\tSILVERTONE\t3199\t78502-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_121.mp3\tCal Stewart\tUncle Josh Buys A Victrola\tVICTOR\t18793\t23007.\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1898_022.mp3\tCal Stewart\tUncle Josh On A Fifth Avenue Bus\tVictor\t16228\t\t1898\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol3021.mp3\tCal Stewart\tUncle Josh On Jim Lawson's Horse Trade\tColumbia\t3021\t\t1904\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D542.mp3\tEddy Condon's Jazz Band\tUncle Sam Blues\tV-DISC\t191\t542\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5463.mp3\tHot Lips Page & His Band\tUncle Sam's Blues\tSAVOY\t520A\tS5463\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071198-1.mp3\tClarence Williams Blue Five\tUncle Sammy Here I Am (v E T)\tBLUEBIRD\t11368\t071198-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_069.mp3\tRay Anthony Feat. Tommy Mercer. Gloria Craig, And The Skyliners\tUndecided\tCapitol\t1824\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64711-A.mp3\tJohn Kirby And Onyx Club Boys\tUndecided\tDECCA\t2216A\t64711-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC65039.mp3\tChick Webb And His Orch\tUndecided\tDECCA\t2323A\t65039\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC030704.mp3\tBenny Goodman And His Orchestra\tUndecided\tVICTOR\t26134\t030704\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU032947.mp3\tFats Waller And His Rhythm\tUndecided\tBLUEBIRD\t10184\t032947\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD448.mp3\tRoy Eldridge Sextet\tUndecided\tDISC\t151\tD448\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVB4417.mp3\tErroll Garner\tUndecided\tSAVOY\t862\tB4417\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23809-2.mp3\tRed Norvo & His Orch\tUndecided\tBRUNSWICK\t8288\t23809-2\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_319.mp3\tJohn Kirby And His Onyx Club Boys\tUndecided\tDecca\t2216\t64711-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_016.mp3\tAmes Brothers, The\tUndecided\tCORAL\t60566\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec65039-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tUndecided\tDecca\t2323\t65039-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_117.mp3\tElla Fitzgerald Feat. Chick Webb Orchestra\tUndecided\tDECCA\t2323\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480428.mp3\tThe Art Tatum/benny Carter/louis Bellson Trio\tUndecided\tMetro\t2364014\t1796-2\t1954\tBenny Carter (as) Art Tatum (p) Louie Bellson (d)\nhttp://www.jazz-on-line.com/a/mp3d/Oke29585-1.mp3\tCount Basie And His Orchestra\tUndecided Blues\tOkeh\t6071\t29585-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13392-A.mp3\tCasa Loma Orchestra\tUnder A Blanket Of Blue\tBRUNSWICK\t6584\t13392-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP2346.mp3\tRed Norvo's Nine\tUnder A Blanket Of Blue\tCAPITOL\t\t2346\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL65.mp3\tColeman Hawkins Qt\tUnder A Blanket Of Blue\tKEYNOTE\t655\tHL65\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_085.mp3\tDon Bestor And His Orchestra\tUnder A Blanket Of Blue\tVICTOR\t24345\t76469-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480462.mp3\tArt Tatum And Benny Carter\tUnder A Blanket Of Blue\tPablo\t2310-732\t1797-2\t1954\tArt Tatum (p), Benny Carter (as), Louie Bellson (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1933_054.mp3\tGlen Gray And Casa Loma Orchestra Feat. Kenny Sargent, V\tUnder A Blanket Of Blue\tBRUNSWICK\t6584\t13392-A\t1933\tJoe Hostetter, Frank Martinez (tp), Pee Wee Hunt, Billy Rauch (tb), Glen Gray (as, ldr), Clarence Hutchinrider (cl, as), Pat Davis (ts), Mel Jenssen (vn), Joe Hall (p), Gene Gifford (bj, g), Stanley Dennis (bb, sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DEC66686.mp3\tGlen Gray & Casa Loma Orch.\tUnder A Blanket Of Blue (vk.sargent)\tDECCA\t3193B\t66686\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_227.mp3\tMitchell Ayres And His Fashions In Music\tUnder A Strawberry Moon\tBluebird\t11588\t075700\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149624.mp3\tGuy Lombardo Royal Canadians\tUnder A Texas Moon\tCOLUMBIA\t2089 D\tW149624\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR149741-1.mp3\tBert Lown & His Loungers\tUnder A Texas Moon (v S B)\tHARMONY\t1088-H\t149741-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03768-1.mp3\tBilly Murray (tenor)\tUnder Any Old Flag At All\tCOLUMBIA\tA-0414\t03768-1\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_003.mp3\tBilly Murray\tUnder Any Old Flag At All\tVICTOR\t16150\tB4967-1\t1908\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU064471.mp3\tGlenn Miller & His Orch\tUnder Blue Canadian Skies\tBLUEBIRD\t11219\t064471\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_014.mp3\tArthur Collins And Byron G. Harlan\tUnder The Anheuser Bush\tVICTOR\t32409\t\t1904\t\nhttp://www.jazz-on-line.com/a/mp3w/1902_009.mp3\tArthur Collins\tUnder The Bamboo Tree\tZONOPHONE\t5412C\t\t1902\t\nhttp://www.jazz-on-line.com/a/mp3a/COLDAL298.mp3\tHi Flyers\tUnder The Double Eagle\tCOLUMBIA\t20288\tDAL298\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VICB0355-8.mp3\tSousa's Band\tUnder The Double Eagle\tVICTOR\t19064\tB0355-8\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20754-A.mp3\tJan Garber And His Orch\tUnder The Moon\tVICTOR\t20754\t38762-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150655-3.mp3\tBert Lown & His Orch\tUnder The Moon, It's You\tCOLUMBIA\t2258 D\tW150655-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_006.mp3\tArthur Collins And Byron Harlan\tUnder The Yum Yum Tree\tCOLUMBIA\tA-0943\t04902\t1911\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC27431.mp3\tPaul Whiteman & His Orch\tUnderneath A Mellow Moon\tVICTOR\t24100\t27431\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/LON238x.mp3\tPrimo Scala's Orchestra\tUnderneath The Arches\tLONDON\t238\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74581.mp3\tAndrews Sisters / B. Terment\tUnderneath The Arches\tDECCA\t24490\t74581\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_039.mp3\tAndrews Sisters Feat. Billy Ternant's Orchestra\tUnderneath The Arches\tDECCA\t24490\t74581\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC74796-1.mp3\tGeorge Olsen And His Music\tUnderneath The Arches (vocal Ethel Schutta)\tVICTOR\t24229\t74796-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152326-1.mp3\tFletcher Henderson & His Orch\tUnderneath The Harlem Moon\tCOLUMBIA\t2732 D\tW152326-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12444-A.mp3\tDon Redman & His Orch\tUnderneath The Harlem Moon\tBRUNSWICK\t6401\t12444-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_211.mp3\tChick Bullock And His Orchestra\tUnderneath The Harlem Moon\tPerfect\t15678\t12364-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Col152326-1.mp3\tFletcher Henderson And His Orchestra\tUnderneath The Harlem Moon\tColumbia\t2732-D\t152326-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-12444-A.mp3\tDon Redman And His Orchestra\tUnderneath The Harlem Moon\tBrunswick\t6401\tB-12444-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_110.mp3\tIrving Kaufman\tUnderneath The Japanese Moon\tVICTOR\t17699\t15156-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60081.mp3\tLouisiana Ramblers\tUnderneath The Louisiana Moon\tDECCA\t5152A\t60081\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_107.mp3\tLambert Murphy (as Raymond Dixon)\tUnderneath The Stars\tVictor\t17946\t16920-4\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_084.mp3\tArthur Collins And Byron Harlan\tUnderneath The Tango Lmoon\tEdison\t2159\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE21483.mp3\tNick Lucas\tUnderneath The Weeping Willow\tBRUNSWICK\t3466\tE21483\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80040-2.mp3\tBert Williams W Orch\tUnexpectedly\tCOLUMBIA\tA-3508\t80040-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1808x.mp3\tNat King Cole\tUnforgettable\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_087.mp3\tNat ''king'' Cole Feat. Nelson Riddle's Orchestra\tUnforgettable\tCAPITOL\t1808\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE26167.mp3\tJack Teagarden & His Orch\tUnited We Swing\tOKEH\t6272\t26167\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI5086-A.mp3\tJaudas' Society Orchestra: Eugene A. Jaudas\tUniversity Lancers Iii, Iv\tEDISON\t\t5086-A\t\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP0148.mp3\tFletcher Henderson\tUnknown Blues\tPARAMOUNT\t12144\tP0148\t1921\t\nhttp://www.jazz-on-line.com/a/mp3d/BlaP148-2.mp3\tF. H. Henderson\tUnknown Blues\tBlack Swan\t2026\tP148-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL6247.mp3\tLouis Armstrong And His Allstars\tUnless\tDECCA\t27626\tL6247\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_126.mp3\tGuy Mitchell\tUnless\tCOLUMBIA\t39331\tCO45179\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_136.mp3\tEddie Fisher\tUnless\tRCA Victor\t4120\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/COL27664.mp3\tBert Williams\tUnlucky Blues\tCOLUMBIA\t35592\t27664\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71242-B.mp3\tAndy Kirk & Clouds Of Joy\tUnlucky Blues\tDECCA\t4436A\t71242-B\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71242-B.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tUnlucky Blues\tDecca\t4436\t71242-B\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN1203.mp3\tJoe Marsala & His Orch\tUnlucky Woman (v Linda Keane)\tBLUENOTE\tBN1203\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC38543-A.mp3\tJimmie Lunceford And His Orchestra\tUnsophisticated Sue\tDECCA\t129B\t38543-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3061x.mp3\tTommy Dorsey And His Orchestra\tUntil\tRCA\t20-3061\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_033.mp3\tTommy Dorsey And His Orchestra Feat. Harry Prime\tUntil\tVICTOR\t3061\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_0116_01.mp3\tLee Morse And Her Bluegrass Boys\tUntil Love Comes Along\tColumbia\t2101DA\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/ASCMA1228.mp3\tMary Lou Williams\tUntil My Baby Comes Home\tASCH\t5502\tMA1228\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_227.mp3\tJoe ''fingers'' Carr And His Ragtime Band, Vocal By The Carr-hops\tUntil Sunrise\tCapitol\t2730\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2463-1.mp3\tJulia Lee And Her Boyfriends\tUntil The Real Thing Comes Along\tCAPITOL\t15144\t2463-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO32408.mp3\tBillie Holiday\tUntil The Real Thing Comes Along\tCOLUMBIA\t37493\tCO32408\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60972-A.mp3\tAndy Kirk 12 Clouds Of Joy\tUntil The Real Thing Comes Along\tDECCA\t809B\t60972-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102406.mp3\tCharlie Barnet & His Orchestra\tUntil The Real Thing Comes Along\tBLUEBIRD\t6487\t102406\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU6487.mp3\tCharlie Barnet & His Orchestra\tUntil The Real Thing Comes Along\tBLUEBIRD\t6487\t102406\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_300.mp3\tInk Spots\tUntil The Real Thing Comes Along\tDECCA\t3958B\t69566\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic102402-1.mp3\t\"fats\" Waller And His Rhythm\tUntil The Real Thing Comes Along\tVictor\t25374\t102402-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-19686-1.mp3\tMills Blue Rhythm Band\tUntil The Real Thing Comes Along\tColumbia\t3147-D\tCO-19686-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_142.mp3\tJan Garber And His Orchestra\tUntil The Real Thing Comes Along\tDecca\t891\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec60972-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tUntil The Real Thing Comes Along\tDecca\t809\t60972-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-7819-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tUntil The Real Thing Comes Along\tParlophone\tF-559\tCE-7819-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Col60887-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tUntil The Real Thing Comes Along\tColumbia\tDB-5004\t60887-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_302.mp3\tErskine Hawkins And His Orchestra\tUntil The Real Thing Comes Along\tVOCALION\t3280\t19579\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100884-1.mp3\tFletcher Henderson & His Orch\tUntil Today\tVICTOR\t25373B\t100884-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic100884-1.mp3\tFletcher Henderson And His Orchestra\tUntil Today\tVictor\t25373\t100884-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_242.mp3\tTony Bennett With Percy Faith And His Orch.\tUntil Yesterday (non  La Pioggia)\tCOLUMBIA\t40213\tCO50408\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21816-B.mp3\tGeorge Olsen And His Music\tUntil You Get Somebody Else\tVictor\t21816-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D344.mp3\tBenny Goodman Quintet\tUntitled Blues\tV-DISC\t344\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38665.mp3\tGene Krupa\tUp An Atom\tCOLUMBIA\t38382\tCO38665\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE18505.mp3\tBen Bernie & His Orch\tUp And At 'em\tBRUNSWICK\t3145\tE18505\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_153.mp3\tNat Shilkret And The Victor Orchestra\tUp In The Clouds\tVICTOR\t20996A\t40157-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC40157-2.mp3\tNat Shilkret & Victor Orch\tUp In The Clouds (v F B)\tVICTOR\t20996A\t40157-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047644.mp3\tByron Parker Mountaineers\tUp Jumped The Devil\tBLUEBIRD\t8432\t047644\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU063328.mp3\tEarl Hines & His Orch\tUp Jumped The Devil\tBLUEBIRD\t11237\t063328\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu063328-1.mp3\tEarl Hines And His Orchestra\tUp Jumped The Devil\tBluebird\tB-11237\t063328-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Benny Harris (tp) Joe McLewis, George Hunt, Edward Fant (tb) Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck\nhttp://www.jazz-on-line.com/a/mp3b/Blu063328-1.mp3\tEarl Hines And His Orchestra\tUp Jumped The Devil (jm Arr)\tBluebird\tB_11237\t063328-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/MER8927UN.mp3\tLester Young Qt\tUp N' Adam\tMERCURY\t8927\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVG17058.mp3\tWingy Manone\tUp The Country Blues\tSAVOY\t500\tG17058\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D356A2.mp3\tThe Merry Macs\tUp Up Up\tV-DISC\t356A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480925.mp3\tCarmen Miranda And The Bando Da Lua\tUpa! Upa!\tDECCA\t23414-B\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC21004-2.mp3\tErskine Hawkins Bama St.coll.\tUproar Shout\tVOCALION\t3545\t21004-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh148.mp3\tLew Stone And His Band\tUps And Downs\tDecca\tF-6188\tTB-2605-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62174.mp3\tStuff Smith And Onyx Club Boys\tUpstairs\tDECCA\t1287\t62174\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COL25755.mp3\tJimmy Lunceford And His Orch\tUptown Blues\tCOLUMBIA\t38338\t25755\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke25755-1.mp3\tJimmie Lunceford And His Orchestra\tUptown Blues\tOkeh\t5362\t25755-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COMA4705.mp3\tEdmond Hall Sextet\tUptown Cafe Blues\tCOMMODORE\t1512\tA4705\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-19628-1.mp3\tDuke Ellington And His Orchestra\tUptown Downbeat (black Out)\tBrunswick\t7734\tB-19628-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1018.mp3\tColeman Hawkins Saxtet\tUptown Lullaby\tAPOLLO\t755\tR1018\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041381-1.mp3\tErskine Hawkins & His Orch\tUptown Shuffle\tBLUEBIRD\t10504\t041381-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101194-1.mp3\tFats Waller And His Rhythm\tUs On A Bus\tVICTOR\t25295A\t101194-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480429.mp3\tBen Webster And Harry Sweets Edison\tUsed To Be Basie\tVerve\tMGC717\t2986-3\t1956\tBen Webster, Ts, Harry Sweets Edison, T, Joe Mondragon, B, Alvin Stoller, D, Barney Kessel, G, Jimmy Rowles, P\nhttp://www.jazz-on-line.com/a/mp3c/BRULAE448.mp3\tAl Jolson W Orch\tUsed To You\tBRUNSWICK\t4401\tLAE448\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1055-A.mp3\tCab Calloway And His Orchestra\tUtt Da Zay (the Tailor's Song)\tVocalion\t5062\tWM-1055-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D214A.mp3\tSidney Bechet And His New Orleans Foot Warmers\tV-disc Blues\tV-DISC\t214A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO45816.mp3\tDuke Ellington And His Orchestra\tV.i.p.'s Boogie\tCOLUMBIA\t39670\tCO 45816\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146537-3.mp3\tJan Garber & His Orch\tV.m.i Spirit\tCOLUMBIA\t1452 D\tW146537-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043912.mp3\tGlenn Miller & His Orch\tVagabond Dreams\tBLUEBIRD\t10520\t043912\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VOCWM-1110-1.mp3\tBenny Carter And His Orchestra\tVagabond Dreams\tVOCALION\t5224\tWM-1110-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_176.mp3\tVic Damone\tVagabond Shoes\tMERCURY\t5429\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA3755x.mp3\tTony Martin\tValencia\tRCA\t20-3755\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35242-8.mp3\tPaul Whiteman And His Orch\tValencia\tVICTOR\t20007\t35242-8\t1926\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic20007.mp3\tPaul Whiteman & His Orchestra\tValencia\tVictor\t20007\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_030.mp3\tBen Selvin And His Orchestra\tValencia\tAJAX\tAPX8494\t6560\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_189.mp3\tTony Martin\tValencia\tRCA\t20-3755\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_171.mp3\tJesse Crawford\tValencia\tDECCA\t28593\tL6979\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_155.mp3\tRoss Gorman And His Orchestra\tValencia\tCOLUMBIA\t631 D\tW141999-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20082-A.mp3\tRevelers\tValencia (a Song Of Spain)\tVictor\t20082-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE19287.mp3\tBen Selvin & His Orch\tValencia (v I K)\tBRUNSWICK\t3172\tE19287\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49785-2.mp3\tMaurice Chevalier\tValentine\tVICTOR\t22093\t49785-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU49497-2.mp3\tFats Waller (piano)\tValentine Stomp\tBLUEBIRD\t10263\t49497-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49497-2.mp3\tThomas Waller (piano)\tValentine Stomp\tVICTOR\t38554\t49497-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic49497-2.mp3\tThomas Waller\tValentine Stomp\tVictor\tV-38554\t49497-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69367.mp3\tSam Price's Texas Blusicians\tValetta\tDECCA\t8566A\t69367\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_301.mp3\tPercy Faith And His Orchestra\tValley Valparaiso\tColumbia\t40633\tCO54362\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68480.mp3\tHazel Scott (piano)\tValse In D Flat Major\tDECCA\t18129A\t68480\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCCO4685.mp3\tGene Krupa & His Orch\tValse Tristo\tCOLUMBIA\t37224\tCCO4685\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA475.mp3\tAndy Iona's Novelty Four\tVana Vana\tCOLUMBIA\t3133 D\tLA475\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA809.mp3\tAugie Goupil's Royal Tahitians\tVana Vana\tDECCA\t1325\tDLA809\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDR-17141.mp3\tTed Heath And His Music\tVanessa\tDECCA-LONDON\tF9983\tDR-17141\t1952\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC27618x.mp3\tDon Cherry\tVanity\tDECCA\t27618\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4499.mp3\tSarah Vaughan\tVanity\tCOLUMBIA\t39446\tHCO4499\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_174.mp3\tSarah Vaughan\tVanity\tCOLUMBIA\t39446\tHCO4499\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_079.mp3\tDon Cherry Feat. Sy Oliver's Orchestra\tVanity\tDECCA\t27618\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3d/Dia902x.mp3\tErroll Garner\tVariations On A Nursery Rhyme\tDial\t902\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru24547-1.mp3\tGene Krupa And His Orchestra\tVariety Is The Spice Of Life\tBrunswick\t8346\t24547-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU38497-3.mp3\tFletcher Henderson & His Orch\tVariety Stomp\tBLUEBIRD\t10246\t38497-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_201.mp3\tEmery Deutsch And His Orchestra Feat. V/mildred Craig\tVas Vilst Du Gaily Star\tBluebird\t10340\t038204-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2486x.mp3\tLes Paul And Mary Ford\tVaya Con Dios\tCAPITOL\t2486\t2486x\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89047.mp3\tAnita O'day\tVaya Con Dios\tMERCURY\t89047\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO914.mp3\tHarry James & His Orch\tVelvet Moon\tCOLUMBIA\t36672\tHCO914\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44114.mp3\tEarl Hines\tVelvet Moon\tCOLUMBIA\t39263\tCO44114\t1950\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOL36672.mp3\tHarry James & His Orchestra\tVelvet Moon\tCOLUMBIA\t36672\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-149-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tVendredi 13\tSWING\t123\tOSW-149-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480463.mp3\tBenny Golson\tVenetian Breeze\tRiverside\tRLP12-256\t\t1957\tKenny Dorham (tp), J.J. Johnson (tb), Benny Golson (ts), Wynton Kelly (p), Paul Chambers (sb), Charlie Persip or Max Roach (dm)\nhttp://www.jazz-on-line.com/a/mp3l/COLW141323.mp3\tLeo Reisman & His Orch\tVenetian Isles\tCOLUMBIA\t623 D\tW141323\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D47A1.mp3\tRichard Dyer-bennett\tVenezuela\tv-disk\t47A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_353.mp3\tThe Gaylords\tVeni-vidi-vici (i Came, I Saw, I Conquered)\tMERCURY\t70427\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_249.mp3\tCamarata And His Orchestra\tVeradero\tDECCA\t28376\t83237\t1952\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480396.mp3\tLionel Hampton And His Giants\tVerve Blues\tNorgran\tMGN1080\t2494-1\t1955\tHarry ??Sweets?? Edison (tp), Lionel Hampton (vib), Art Tatum (p), John Simmons (sb), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1951_199.mp3\tMario Lanza\tVesti La Giubba\tRCA\t10-3228\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3o/CAPVlG.mp3\tVido Musso, Tenor Saxophone  Stan Kenton & His Orchestra\tVesti La Giubba From ''i Pagliacci''\tCAPITOL\t\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3d/BluST-2909-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tVette\tBlue Star\t37\tST-2909-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D404VB.mp3\tLionel Hampton & His Orchestra\tVibe Boogie\tV-DISC\t404\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/V-DVP-1125.mp3\tLionel Hampton And His Orchestra\tVibe Boogie\tV-Disc\t404-A\tVP-1125\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC97774-1.mp3\tBenny Goodman Qt\tVibraphone Blues (vocal Lionel Hampton)\tVICTOR\t25521-B\t97774-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COL265117-2.mp3\tJoe Venuti's Blue Five\tVibraphonia\tCOLUMBIA\t2782 D\t265117-2\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU02645.mp3\tLittle Brother Montgomery\tVicksburg Blues (pt.3)\tBLUEBIRD\t6697\t02645\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404716.mp3\tMississippi Mud Steppers\tVicksburg Stomp\tOKeh\t45519\t404716\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3198.mp3\tBing Crosby & Andrews Sisters\tVict'ry Polka\tDECCA\t23277B\tL3198\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN032VS.mp3\tJames P Johnson Jazz Men\tVictory Stride\tBLUENOTE\tBN032\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480752.mp3\tJames P. Johnson's Blue Note Jazz Men\tVictory Stride\tBlue Note\t32\tBN951-3\t1944\tSidney De Paris (tp), Vic Dickenson (tb), Ben Webster (ts), James P. Johnson (p), Jimmy Shirley (g), John Simmons (sb), Sid Catlett (dm)\nhttp://www.jazz-on-line.com/a/mp3a/BLU011138.mp3\tRudy Valle And His Connecticut Yankees Vocal Refrain By Rudy Valle And The Gentlemen Songsters\tVieni ... Vieni \tBLUEBIRD\t7069A\t011138\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/CON21796-1.mp3\tBert Block & His Bell Music\tVieni Vienie (vb.johnson)\tCONQUEROR\t8909\t21796-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27842.mp3\tRudy Vallee\tVieni, Vieni\tVictor\t27842\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_025.mp3\tRudy Vallee And His Connecticut Yankees\tVieni, Vieni\tBluebird\t7069A\t11138\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_289.mp3\tTed Fio Rito And His Orchestra Feat. Muzzy Macellino\tVieni, Vieni\tDECCA\t1450\tDLA930\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5424.mp3\tJoe Marsala's All-timers\tVillage Blues\tSAVOY\t504\tS5424\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/BLURS653-1.mp3\tPete Johnson Blues Trio\tVine Street Bustle\tBLUENOTE\tBN011\tRS653-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKECCO5269.mp3\tBig Three Trio\tViolent Love\tOKEH\t6807\tCCO5269\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC067652-3.mp3\tTommy Dorsey And His Orch\tViolets For Your Furs\tVICTOR\t27690\t067652-3\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEH0529.mp3\tGene Krupa & His Orch\tViolets For Your Furs\tOKEH\t6498\tH0529\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63263.mp3\tNoble Sissle Swingsters\tViper Mad\tDECCA\t3521A\t63263\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU86211-1.mp3\tFats Waller (piano)\tViper's Drag\tBLUEBIRD\t10133\t86211-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic86211-1.mp3\t\"fats\" Waller\tViper's Drag\tVictor\t25015\t86211-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VICOLA1991.mp3\tHot Club Of France\tViper's Dream\tVICTOR\t26218\tOLA1991\t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/Ult77286.mp3\tFreddy Taylor And His Swing Men From Harlem\tViper's Dream\tUltraphone\tAP-1489\t77286\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-1991-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tViper's Dream\tSWING\t23\tOLA-1991-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC25981-9.mp3\tBenson Orchestra Of Chicago\tVirginia Blues\tVICTOR\t18868A\t25981-9\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_085.mp3\tBenson Orchestra Of Chicago\tVirginia Blues\tVICTOR\t18868A\t25981-9\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_047.mp3\tVan And Schenck\tVirginia Blues\tCOLUMBIA\tA-3577\t80193-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-5900-.mp3\tJimmie Noone's Apex Club Orchestra\tVirginia Lee - V E T\tVocalion \t1518\tC-5900-\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKECO32038-1.mp3\tCab Calloway & His Orch\tVirginia, Georgia And Caroline\tOKEH\t6574\tCO32038-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45180A.mp3\tWalter Kelly\tVirginian Judge - First Session Part 1\tVICTOR\t45180-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45180B.mp3\tWalter Kelly\tVirginian Judge - First Session Part 2\tVICTOR\t45180-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35297-1.mp3\tWalter Kelly\tVirginian Judge - Fourth Session Part 1\tVICTOR\t20136-A\t35297-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35298-3.mp3\tWalter Kelly\tVirginian Judge - Fourth Session Part 2\tVICTOR\t20136-B\t35298-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45202A.mp3\tWalter Kelly\tVirginian Judge - Second Session Part 1\tVICTOR\t45202-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45202B.mp3\tWalter Kelly\tVirginian Judge - Second Session Part 2\tVICTOR\t45202-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45250A.mp3\tWalter Kelly\tVirginian Judge - Third Session Part 1\tVICTOR\t45250-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45250B.mp3\tWalter Kelly\tVirginian Judge - Third Session Part 2\tVICTOR\t45250-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MER2543-2.mp3\tCharlie Parker And His Orch\tVisa\tMERCURY\t11022\t2543-2\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144231.mp3\tCalifornia Ramblers\tVo-do-do-de-o Blues\tCOLUMBIA\t1038 D\tW144231\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92908-1.mp3\tWillie Bryant & His Orch\tVoice Of Old Man River\tVICTOR\t25129\t92908-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_270.mp3\tFontane Sisters\tVoices\tDot\t15480\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23359.mp3\tSlim & Slam\tVol Vist Du Gaily Star\tCBS\tVO4346\t23359\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66224-A.mp3\tJan Savitt & His Top Hatters\tVol Vistu Gaily Star\tDECCA\t2739A\t66224-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC042613.mp3\tTommy Dorsey & His Clambake 7\tVol Vistu Gaily Star\tVICTOR\t26363\t042613\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Col25213-1.mp3\tHarry James And His Orchestra\tVol Vistu Gaily Star\tColumbia\t35209\t25213-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEWCO26279.mp3\tCount Basie And His Orch\tVolcano\tOKEH\t6010\tWCO26279\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COL37346.mp3\tPrince's Band\tVon Tilser Medley: Sleepy Moon\tCOLUMBIA\tA-5724\t37346\t1915\t\nhttp://www.jazz-on-line.com/a/mp3b/MER457.mp3\tJay Mcshann & His Sextet\tVoodoo Woman Blues\tMERCURY\t8020\t457\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/SIGT1905.mp3\tColeman Hawkins & His Orch\tVoodte\tSIGNATURE\t28101B\tT1905\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN4159VB.mp3\tSlim Gaillard\tVoot Boogie\tKING\t4159\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_147.mp3\tBaron Elliott And His Stardust Melodies Orchestra Feat. Stardust Trio\tVos Zokt Eer\tMUSICRAFT\t15010\tNRM-1-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3d/Ryt16189.mp3\tDjango Reinhardt\tVous Et Moi\tRythme\tD5016\t16189\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWM-1104-A.mp3\tCab Calloway And His Orchestra\tVuelva\tVocalion\t5315\tWM-1104-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECLA2834.mp3\tBob Crosby & His Orch\tVultee Special\tDECCA\t4397B\tLA2834\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_324.mp3\tLouis Armstrong And Mills Brothers\tW.p.a.\tDECCA\t3151\t67519\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU032677.mp3\tDelmore Brothers\tWabash Blues\tBLUEBIRD\t8204\t032677\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU6248.mp3\tIsham Jones And His Orch\tWabash Blues\tBRUNSWICK\t5065\t6248\t1921\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC25703-4.mp3\tBenson Orchestra Of Chicago\tWabash Blues\tVICTOR\t18820B\t25703-4\t1921\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU5065.mp3\tIsham Jones & His Orch\tWabash Blues\tBRUNSWICK\t5065\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_303.mp3\tRuss Morgan And His Orchestra\tWabash Blues\tDECCA\t25107\t64847-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_075.mp3\tBenson Orchestra Of Chicago\tWabash Blues\tVICTOR\t18820B\t25703-4\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/CONSC101.mp3\tRoy Hall Blueridge Ent.\tWabash Cannon Ball\tCONQUEROR\t9230\tSC101\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO2207.mp3\tRoy Acuff And Smoky Mtn.boys\tWabash Cannonball\tCOLUMBIA\t37008\tHCO2207\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_223.mp3\tRoy Acuff Crazy Tennesseans\tWabash Cannonball\tVOCALION\t4466\tC1589\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC67507-2.mp3\tWayne King And His Orch\tWabash Moon\tVICTOR\t22643\t67507-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1793-1.mp3\tRoy Eldridge & His Orch\tWabash Stomp\tVOCALION\t3479\tC1793-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MER2618.mp3\tJerry Byrd & String Dusters\tWabash Wah Wah Blues\tMERCURY\t6215\t2618\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC023290.mp3\tBunny Berigan & His Orch\tWacky Dust\tVICTOR\t25872A\t023290\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64459-A.mp3\tChick Webb And His Orchestra With Ella Fitzgerald\tWacky Dust\tDecca\t2021\t64459-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_233.mp3\tElla Fitzgerald Feat. Chick Webb Orchestra\tWacky Dust\tDECCA\t2021\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN6553.mp3\tMissouri Jazz Band (shubert)\tWaffles\tBANNER\t1764\t6553\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC81064.mp3\tPaul Whiteman & His Orch\tWagon Wheels\tVICTOR\t24517\t81064\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC76442.mp3\tSy Oliver & His Orch.\tWagon Wheels\tDECCA\t27094\t76442\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU12342-A.mp3\tThree Keys\tWah Dee Dah\tBRUNSWICK\t6423\t12342-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU18638.mp3\tLeo Reisman & His Orch\tWah Hoo\tBRUNSWICK\t7614\t18638\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban12586-A.mp3\tCab Calloway And His Orchestra\tWah-dee-dah\tBanner\t32812\t12586-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480807.mp3\tArt Farmer\tWailin? With Hank\tNew Jazz\tLP 8203\t1021\t1953\tArt Farmer, T, FLH, Hank Mobley, Ts, Horace Silver, P, Addison Farmer, B, Elvin Jones, D\nhttp://www.jazz-on-line.com/a/mp3b/Blu051521-1.mp3\tEarl Hines And His Orchestra\tWait 'til It Happens To You\tBluebird\tB-10985\t051521-1\t1940\tWalter Fuller (tp,vcl) Shirley Clay, Ed Sims (tp) George Dixon (tp,as) Ed Burke, John Ewing, Joe McLewis (tb) Omer Simeon (cl,bar) Leroy Harris (as,vcl) Jimmy Mundy (ts,arr) Robert Crowder (ts) Earl Hines (p) Claude Roberts (g) Quinn Wilson (b) Alvin Burroughs (d) Billy Eckstine, Leroy Harris (vcl) Buster Harding, Edgar Battle (arr)\nhttp://www.jazz-on-line.com/a/mp3c/BLU038209.mp3\tFats Waller And His Rhythm\tWait And See\tBLUEBIRD\t10405\t038209\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_283.mp3\tJudy Garland - Lennie Heyton\tWait And See\tDECCA\t23459\tL3860\t1945\tfrom the film \"The Harvey Girls\"\nhttp://www.jazz-on-line.com/a/mp3w/1943_075.mp3\tDick Haymes\tWait For Me Mary\tDECCA\t18556B\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_225.mp3\tGeorgia Gibbs\tWait For Me, Darling\tMERCURY\t70386\tYW10435\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1865-1.mp3\tJack Teagarden & Ho\tWait Till I Catch You In My Dream (v D A)\tVARSITY\t8388\tUS1865-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VICB9163-2.mp3\tWill Oakland\tWait Till The Clouds Roll By\tVICTOR\t16608\tB9163-2\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_058.mp3\tWill Oakland\tWait Till The Clouds Roll By\tVICTOR\t16928\tB9163-2\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_131.mp3\tHarry Macdonough And Olive Kline\tWait Till The Cows Come Home\tVICTOR\t18408\t20877\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2947.mp3\tBing Crosby & Mary Martin\tWait Till The Sun Shines, Nellie\tDECCA\t18278B\tDLA2947\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_011.mp3\tHarry Tally\tWait Till The Sun Shines, Nellie\tVICTOR\t16097\tB2928-3\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_002.mp3\tByron G. Harlan\tWait Till The Sun Shines, Nellie\tCOLUMBIA\tA-0321\t03321-1\t1905\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA2794w.mp3\tBilly Murray\tWait Till You Get Them Up In The Air, Boys\tColumbia\tA2794\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_075.mp3\tBilly Murray\tWait Till You Get Them Up In The Air, Boys\tCOLUMBIA\tA-2794\t78577\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_098.mp3\tMaurice Chevalier Feat. D/tom Griselle\tWait Till You See Ma Cherie\tRCA\t25-0092\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/BruLA-1754-A.mp3\tGene Krupa And His Orchestra\tWait Until My Heart Finds Out\tBrunswick\t8274\tLA-1754-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC23427.mp3\tBilly Murray\tWait'll You Get Them Up In The Air, Boys\tVICTOR\t18628\t23427\t1919\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR142680-2.mp3\tUniversity Six\tWait'll You See (my Brand New Mama)\tHARMONY\t316-H\t142680-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5533-4.mp3\tFletcher Henderson Dance Orch\tWait'll You See My Gal\tBANNER\t1373\t5533-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_250.mp3\tDon Bestor And His Orchestra Feat. V/maurice Cross\tWaitin' At The Gate For Katy\tVICTOR\t24596\t81975-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN14955-1.mp3\tPaul Small And His Orch\tWaitin' At The Gate For Katy (vps)\tBANNER\t33012\t14955-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBAN33012.mp3\tPaul Small & His Orch\tWaitin' At The Gate For Katy (vps)\tBANNER\t33012\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41342-2.mp3\tBen Pollack & His Californians\tWaitin' For Katie\tVICTOR\t21184\t41342-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400613-C.mp3\tFred Hall & His Sugar Babies\tWaitin' For Katy\tOKeh\t41026\t400613-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE37437-A.mp3\tRed Nichols & His Orch\tWaitin' For The Evening Mail (vj.davis)\tBRUNSWICK\t6767\tE37437-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67637-A.mp3\tLouis Jordan & His Tympani 5\tWaitin' For The Robert E Lee\tDECCA\t3360A\t67637-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP218x.mp3\tPeggy Lee\tWaitin' For The Train To Come In\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT573.mp3\tLouis Prima & His Orchestra\tWaitin' For The Train To Come In\tMAJESTIC\t7156\tT573\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_042.mp3\tPeggy Lee\tWaitin' For The Train To Come In\tCapitol\t218\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_083.mp3\tJohnny Long And His Orchestra\tWaitin' For The Train To Come In\tDECCA\t18718\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_068.mp3\tHarry James And His Orchestra Feat. Kitty Kallen\tWaitin' For The Train To Come In\tCOLUMBIA\t36867\tCO35107\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO35107.mp3\tHarry James And His Orch\tWaitin' For The Train To Come In (vkitty Kallen)\tCOLUMBIA\t36867\tCO35107\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/Gre3934-A.mp3\tCliff Jackson And His Krazy Kats\tWaitin' Thru' The Night\tGrey Gull\t1880\t3934-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC23205-1.mp3\tJoseph Smith's Orch\tWaiting\tVICTOR\t18615\t23205-1\t1919\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78487.mp3\tCharles Harrison\tWaiting\tCOLUMBIA\tA-2786\t78487\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_118.mp3\tCharles Harrison\tWaiting\tColumbia\t2786\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB3322-2.mp3\tAda Jones\tWaiting At The Church\tVICTOR\t16057\tB3322-2\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_017.mp3\tAda Jones\tWaiting At The Church (my Wife Won't Let Me)\tVictor\t4714\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_051.mp3\tVesta Victoria\tWaiting At The Church (my Wife Won't Let Me)\tVICTOR\t5182\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU55375-1.mp3\tFats Waller And His Rhythm\tWaiting At The End Of The Road\tBLUEBIRD\t10264\t55375-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCE30544.mp3\tLouisiana Rhythm Kings\tWaiting At The End Of The Road\tVOCALION\t15833\tE30544\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW148986.mp3\tPaul Whiteman & His Orch\tWaiting At The End Of The Road\tCOLUMBIA\t1974 D\tW148986\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65117.mp3\tCliff Bruner's Texas Wanderers\tWaiting At The End Of The Road\tDECCA\t5712\t65117\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW148986-8.mp3\tPaul Whiteman And His Orchestra (bing Crosby Solo)\tWaiting At The End Of The Road\tColumbia\t\tW148986-8\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_145.mp3\tPaul Whiteman And His Orchestra\tWaiting At The End Of The Road\tCOLUMBIA\t1974\tW148986-8\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/56067-2.mp3\tThomas Waller\tWaiting At The End Of The Road\t\t\t56067-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu55375-1.mp3\tFats Waller And His Piano\tWaiting At The End Of The Road\tBluebird\tB-10264\t55375-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/VocE-30544.mp3\tLouisiana Rhythm Kings\tWaiting At The End Of The Road\tVocalion\t15833\tE-30544\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE30531-B.mp3\tRed Nichols & His Orch\tWaiting For A Happy Ending (vsl)\tBRUNSWICK\t4510\tE30531-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU47223-4.mp3\tJimmie Rodgers\tWaiting For A Train\tBLUEBIRD\t5163\t47223-4\t1928\t\nhttp://www.78-tours.net/mp3/DEC74347.mp3\tErnest Tubb\tWaiting For A Train\tDECCA\t46119\t74347\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_165.mp3\tJimmie Rodgers\tWaiting For A Train\tVICTOR\t40014\t47223-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/KEYKRW8.mp3\tBernie Leighton Qt\tWaiting For Leighton\tKEYNOTE\t645\tKRW8\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70187.mp3\tGene Kardos & His Orch\tWaiting For The Moon (v D R)\tVICTOR\t22792\t70187\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4457.mp3\tAl Jolson\tWaiting For The Robert E Lee\tDECCA\t24106\tL4457\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_034.mp3\tDolly Connolly\tWaiting For The Robert E. Lee\tColumbia\t1197\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_026.mp3\tArthur Collins And Byron Harlan\tWaiting For The Robert E. Lee\tEdison Amberol\t1144\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_004.mp3\tHeidelberg Quintet\tWaiting For The Robert E. Lee\tVICTOR\t17141A\t12181-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_096.mp3\tLambert Murphy\tWaiting For The Sun To Come Out\tVICTOR\t45199\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-17922-1.mp3\tMills Blue Rhythm Band\tWaiting In The Garden\tColumbia\t3083-D\tCO-17922-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_097.mp3\tMindy Carson\tWake The Town And Tell The People\tColumbia\t40537\tCO53513\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_041.mp3\tLes Baxter And His Orchestra\tWake The Town And Tell The People\tCapitol\t3120\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1307-A.mp3\tAlice Faye Orchestra Under Direction Of Cy Feuer\tWake Up And Live\tBRUNSWICK\t7876\tLA1307-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM266-1.mp3\tCab Calloway Cotton Club Orch\tWake Up And Live\tVARIETY\tI535\tM266-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_298.mp3\tCab Calloway And His Orchestra Feat. Ben Webster (tenor Sax)\tWake Up And Live\tVARIETY\t535\tM266-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07807-1.mp3\tTommy Dorsey & His Orch\tWake Up And Live (vedythe Wright)\tVICTOR\t25573A\t07807-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60455-A.mp3\tBob Howard & His Orch\tWake Up And Sing\tDECCA\t720A\t60455-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC51926-2.mp3\tNat Shilkret & Victor Orch.\tWake Up Chillun\tVICTOR\t21976A\t51926-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe402728-A.mp3\tPrince Albert Hunt Texas Ramb.\tWake Up Jacob\tOKeh\t45375\t402728-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/COL148126-3.mp3\tIpana Troubadors\tWake Up! Chill'un, Wake Up!\tCOLUMBIA\t1779 D\t148126-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh784B.mp3\tRay Starita And His Ambassadors Band\tWake Up! Chill'un, Wake Up! (v Betty Bolton)\tColumbia\t5380\tWA-8951-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_027.mp3\tJames F. Harrison\tWake Up, America!\tVICTOR\t17984\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/SUPC3379.mp3\tJimmie Noone's Apex Club Orch\tWake Up, Chill'un, Wake Up\tSUPERTONE\t2254s\tC3379\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/PARP2554.mp3\tBartlette,viola\tWalk Easy Cause My Papa's Home\tPARAMOUNT\t12369\tP2554\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_302.mp3\tAndy Williams\tWalk Hand In Hand\tCadence\t1288\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_373.mp3\tDenny Vaughn\tWalk Hand In Hand\tKapp\t143\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_067.mp3\tTony Martin\tWalk Hand In Hand\tRCA Victor\t6493\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67099.mp3\tHot Lips Page & His Band\tWalk It To Me\tDECCA\t7757\t67099\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC56897-2.mp3\tTed Weems & His Orch\tWalkin My Baby Back Home\tVICTOR\t22637\t56897-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480611.mp3\tBen Webster And Harry Sweets Edison\tWalkin With Sweets\tClef\tMGC717\t2982-2\t1956\tBen Webster, Ts, Harry Sweets Edison, T, Joe Mondragon, B, Alvin Stoller, D, Barney Kessel, G, Jimmy Rowles, P\nhttp://www.jazz-on-line.com/a/mp3t/TS480672.mp3\tArt Pepper\tWalkin' (alternate Take 1)\tContemporary\tM3568\t\t1959\tJack Sheldon, Al Porcino (tp), Dick Nash (tb), Bob Enevoldsen (vtb), Vice DeRosa (fhr), Art Pepper, Charlie Kennedy (as), Richie Kamuca (ts), Med Flory (bar), Russ Freeman (p), Joe Mondragon (sb), Mel Lewis (dm), Marty Paich (arr, cond)\nhttp://www.jazz-on-line.com/a/mp3t/TS480684.mp3\tArt Pepper\tWalkin' (alternate Take 2)\tContemporary\tM3568\t\t1959\tJack Sheldon, Al Porcino (tp), Dick Nash (tb), Bob Enevoldsen (vtb), Vice DeRosa (fhr), Art Pepper, Charlie Kennedy (as), Richie Kamuca (ts), Med Flory (bar), Russ Freeman (p), Joe Mondragon (sb), Mel Lewis (dm), Marty Paich (arr, cond)\nhttp://www.jazz-on-line.com/a/mp3t/TS480651.mp3\tArt Pepper\tWalkin' (original Take)\tContemporary\tM3568\t\t1959\tJack Sheldon, Al Porcino (tp), Dick Nash (tb), Bob Enevoldsen (vtb), Vice DeRosa (fhr), Art Pepper, Charlie Kennedy (as), Richie Kamuca (ts), Med Flory (bar), Russ Freeman (p), Joe Mondragon (sb), Mel Lewis (dm), Marty Paich (arr, cond)\nhttp://www.jazz-on-line.com/a/mp3d/Col60852-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWalkin' And Swingin'\tColumbia\tDB-5023\t60852-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/CAPlpmfwawb.mp3\tLes Paul And Mary Ford\tWalkin' And Whistlin' Blues\tCAPITOL\t\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL108WB.mp3\tJay Mcshann & His Jazzmen\tWalkin' Blues\tALLADDIN\t108\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83430.mp3\tElla Fitzgerald\tWalkin' By The River\tDECCA\t28433\t83430\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_301.mp3\tElla Fitzgerald Feat. O/leroy Kirkland\tWalkin' By The River\tDECCA\t28433\t83430\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COL30130WI.mp3\tHot Lips Page & Orch\tWalkin' In A Daze\tCOLUMBIA\t30130\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10135.mp3\tJohnnie Ray And Buddy Cole Qt\tWalkin' My Baby Back Home\tCOLUMBIA\t39701\tHCO10135\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404422-B.mp3\tLouis Armstrong & His Orch\tWalkin' My Baby Back Home\tOKeh\t41497\t404422-B\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/HARW151332-2.mp3\tAnnette Hanshaw\tWalkin' My Baby Back Home\tHARMONY\t1288-H\tW151332-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1931_0220_01.mp3\tLee Morse And Her Bluegrass Boys\tWalkin' My Baby Back Home\tColumbia\t2417A\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_029.mp3\tJohnnie Ray\tWalkin' My Baby Back Home\tCOLUMBIA\t39750\tHCO10135\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_169.mp3\tCharleston Chasers\tWalkin' My Baby Back Home\tColumbia\t2404\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_062.mp3\tNat ''king'' Cole Feat. Billy May's Orchestra\tWalkin' My Baby Back Home\tCAPITOL\t2130\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480594.mp3\tArt Pepper Plus Eleven\tWalkin' Shoes\tContemporary\tM3568\t\t1959\tJackSheldon, Al Porcino (tp), Dick Nash (tb), Bob Ebevoldsen (vtb), Vince DeRosa (fhr), Art Pepper, Charlie Kennedy (as), Richie Kamuca (ts), Med Flory (bar), Russ Freeman (p), Joe Mondragon (sb), Mel Lewis (dm), Marty Paich (arr, cond)\nhttp://www.jazz-on-line.com/a/mp3c/APO4102.mp3\tLuis Russell & His Orch\tWalkin' Slow\tAPOLLO\t1079\t4102\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAE0VB5551.mp3\tGene Krupa's Chicago Jazz Band\tWalkin' The Blues\tRCA\t20-3965\tE0VB5551\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC066117.mp3\tAlbert Ammons & Pete Johnson\tWalkin' The Boogie\tVICTOR\t27505\t066117\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/CAP6927.mp3\tPete Daily\tWalkin' The Dog\tCAPITOL\t1486\t6927\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S102.mp3\tSy Oliver & His Orchestra\tWalkin' The Dog\tMGM\t11092\t47S102\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030339.mp3\tBunny Berigan & His Orch\tWalkin' The Dog\tVICTOR\t26123B\t030339\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71003.mp3\tJoe Marsala & His Chosen 7\tWalkin' The Dog\tDECCA\t27075\t71003\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1421-1.mp3\tFrankie Trumbauer Orch\tWalkin' The Dog\tVARSITY\t8225\tUS1421-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC38870.mp3\tClaude Hopkins And His Orchestra\tWalkin' The Dog\tDECCA\t270A\t38870\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU15153-A.mp3\tWingy Manone & His Orch\tWalkin' The Streets (until My Baby Comes Home)\tBRUNSWICK\t6940\t15153-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47389.mp3\tSammy Kaye\tWalkin' To Missouri\tCOLUMBIA\t39769\tCO47389\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480553.mp3\tArt Farmer\tWalkin' With Hank\tNew Jazz\tLP 8203\t1021\t1953\tArt Farmer, T, FLH, Hank Mobley, Ts, Horace Silver, P, Addison Farmer, B, Elvin Jones, D\nhttp://www.jazz-on-line.com/a/mp3c/APOR1231.mp3\tArnett Cobb & His Orchestra\tWalkin' With Sid\tAPOLLO\t770\tR1231\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_216.mp3\tUna Mae Carlisle\tWalking By The River\tBluebird\t11033\t057641-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE36029.mp3\tNick Lucas' Troubadors\tWalking My Baby Back Home\tBRUNSWICK\t6048\tE36029\t1931\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBan32102.mp3\tSam Lanlin & His Orchestra\tWalking My Baby Back Home\tBanner\t32102\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD9VB1900.mp3\tCount Basie & His Orchestra\tWalking Slow Behind You\tRCA\t20-3572\tD9VB1900\t1949\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC93673.mp3\tErnest Tubb\tWalking The Floor\tDECCA\t5958\tC93673\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2999.mp3\tBing Crosby & Bob Crosby Orch\tWalking The Floor Over You\tDECCA\t18371A\tDLA2999\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO33322.mp3\tFrankie Laine W P.weston Orch\tWalking The Night Away\tCOLUMBIA\t40583\tHCO33322\t\t\nhttp://www.jazz-on-line.com/a/mp3h/Oke401826-C.mp3\tHal Kemp And His Orchestra (as Carolina Club Orch)\tWalking With Susie\tOkey\t41237\t401826-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh196.mp3\tBilly Ternent And His Orchestra\tWalkin By The River\tDecca\tF-8365\tDR-7620-2\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D74B1.mp3\tFats Waller\tWaller Jive\tv-disk\t74B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/V-DVP181.mp3\tFats Waller\tWaller Jive - Hallelujah\tV-DISC\t074\tVP181\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66375.mp3\tJimmie Davis\tWalls Of White\tDECCA\t5766\t66375\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2025WB.mp3\tMary Lou Williams Trio\tWaltz Boogie\tRCA\t20-2025\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB3380-4.mp3\tHaydn Qt And Billy Murray\tWaltz Me Around Again, Willie\tVICTOR\t16770\tB3380-4\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_053.mp3\tBilly Murray And Haydn Quartet\tWaltz Me Around Again, Willie\tVictor\t4738\tB3380\t1906\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480493.mp3\tArt Pepper\tWaltz Me Blues\tContemporary\tC3532\t\t1957\tRed Garland, P, Philly Joe Jones, D, Paul Chambers, B\nhttp://www.jazz-on-line.com/a/mp3o/EDI9996.mp3\tW.c.polla Clover Garden Do\tWaltz Me Lightly\tEDISON\t51509\t9996\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4905.mp3\tRoy Acuff And Smoky Mtn.boys\tWaltz Of The Wind\tCOLUMBIA\t38042\tCCO4905\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D207A1.mp3\tAndre Kostelanetz And His Orchestra\tWaltz Theme\tV-DISC\t207A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BRUJC8593.mp3\tBing Crosby W Isham Jones\tWaltzing In A Dream\tBRUNSWICK\t6394\tJC8593\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-122-1.mp3\tBenny Carter And His Swing Quartet\tWaltzing The Blues\tVocalion\tS-19\tS-122-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/PATCPT-1858-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tWaltzing With A Dream\tPath\tPA-538\tCPT-1858-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1950_113.mp3\tSammy Kaye And His Orchestra\tWanderin'\tRCA\t20-3680\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047989.mp3\tCharlie Barnet & His Orch\tWandering Blues\tBLUEBIRD\t10721\t047989\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18694.mp3\tPaul Whiteman & His Orch\tWang Wang Blues\tVICTOR\t18694\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC24392-2.mp3\tPaul Whiteman And His Orch\tWang Wang Blues\tVICTOR\t18694\t24392-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO32593-1.mp3\tBenny Goodman Sextet\tWang Wang Blues\tCOLUMBIA\t36594\tCO32593-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE35036.mp3\tDuke Ellington & His Orch\tWang Wang Blues\tBRUNSWICK\t6003\tE35036\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D466-A.mp3\tCaptain Glenn Miller And The Aaftc Orchestra\tWang Wang Blues\tV-Disc\t466-A\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_268.mp3\tBenny Goodman Sextet\tWang Wang Blues\tCOLUMBIA\t36594\tCO32593-1\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_001.mp3\tPaul Whiteman And His Orchestra\tWang Wang Blues\tCapitol\t10026\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_131.mp3\tAmes Brothers Feat. O/roy Ross\tWang Wang Blues\tCORAL\t60489\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0800_09.mp3\tLee Morse\tWant A Little Lovin\tPathe\t25161A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC34037-4.mp3\tFred Hamm And His Orch\tWant A Little Loving\tVICTOR\t19915\t34037-4\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06621.mp3\tTommy Dorsey & His Orch\tWanted\tVICTOR\t25557B\t06621\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_003.mp3\tPerry Como Feat. Hugo Winterhalter's Orchestra\tWanted\tRCA Victor\t5647\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_319.mp3\tVic Damone\tWar And Peace\tColumbia\t40733\tCO56486\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU12688.mp3\tFletcher Henderson & His Orch\tWar Horse Mama\tBRUNSWICK\t2592\t12688\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU049197.mp3\tSonny Boy Williamson\tWar Time Blues\tBLUEBIRD\t8580\t049197\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE80752.mp3\tWilliamson Bros & Curry\tWarfield\tOKEH\t45127\t80752\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC14008-2.mp3\tBlind Willie (mctell)\tWarm It Up To Me\tARC\tVO2595z\t14008-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC053430-3.mp3\tDuke Ellington And His Orch\tWarm Valley\tVICTOR\t26796\t053430-3\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D053430-3.mp3\tDuke Ellington\tWarm Valley\tV-DISC\t010\t053430-3\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC1378.mp3\tTeddy Wilson And His Orchestra\tWarming Up\tBRUNSWICK\t7684\tC1378\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/SAVS5849.mp3\tCharlie Parker's Bebop Boys\tWarming Up A Riff\tSAVOY\t945A\tS5849\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL3963.mp3\tCarmen Cavallaro\tWarsaw Concerto\tDECCA\t18742A\tL3963\t1945\t\nhttp://www.jazz-on-line.com/a/mp3r/RiUnkw.mp3\tFreddy Martin & His Orchestra\tWarsaw Concerto\tUnknown\t\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/PARP3070.mp3\tBlind Lemon Jefferson\tWartime Blues\tPARAMOUNT\t12425\tP3070\t1926\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC90854-A.mp3\tGeorgia White\tWas I Drunk ?\tDECCA\t7216-A\tC90854-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_118.mp3\tJan Garber And His Orchestra\tWas It A Dream?\tCOLUMBIA\t1372 D\tW145637-9\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW145637-9.mp3\tJan Garber & His Orch\tWas It A Dream? (v S. Faircloth)\tCOLUMBIA\t1372 D\tW145637-9\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU20681-2.mp3\tArtie Shaw And His Orchestra\tWas It Rain?\tBRUNSWICK\t7841\tB-20681-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_182.mp3\tFrances Langford\tWas It Rain?\tDECCA\t1202\tDLA756-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D276B2.mp3\tIna Ray Hutton And Her Orchestra\tWas It Worth It\tV-DISC\t276B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67669.mp3\tThree Peppers\tWas That All I Meant To You?\tDECCA\t8508A\t67669\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC71222-1.mp3\tBert Lown & His Orch\tWas That The Human Thing To Do?\tVICTOR\t22908\t71222-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/ARCB11320-A.mp3\tBoswell Sisters\tWas That The Human Thing To Do?\tARC\tBR6257\tB11320-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_079.mp3\tBoswell Sisters Feat. Dorsey Brothers Orchestra\tWas That The Human Thing To Do?\tBRUNSWICK\t6257\t11320-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC23541.mp3\tHenry Burr\tWas There Ever A Pal Like You\tVICTOR\t18645A\t23541\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_114.mp3\tHenry Burr\tWas There Ever A Pal Like You?\tVictor\t18645\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC20367-1.mp3\tSharkey Bonano Sharks O Rhythm\tWash It Clean\tVOCALION\t3410\t20367-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20992.mp3\tRed Nichols & His 5 Pennies\tWashboard Blues\tBRUNSWICK\t3407\t20992\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC019426.mp3\tTommy Dorsey & His Orch\tWashboard Blues\tVICTOR\t26085\t019426\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36186WB.mp3\tPaul Whiteman's Concert Orch.\tWashboard Blues\tVICTOR\t36186\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22905.mp3\tMildred Bailey & Her Orchestra\tWashboard Blues\tVOCALION\t4139\t22905\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80985.mp3\tColumbians - Dance Orchestra\tWashington And Lee Swing\tCOLUMBIA\tA-3890\t80985\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146536-3.mp3\tJan Garber & His Orch\tWashington And Lee Swing\tCOLUMBIA\t1452 D\tW146536-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC86749.mp3\tMuggsy Spanier\tWashington And Lee Swing\tDECCA\t29857\t86749\t\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC45487-3.mp3\tMemphis Stompers\tWashington And Lee Swing\tVICTOR\t21709\t45487-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE27616-2.mp3\tGene Krupa & His Orch\tWashington And Lee Swing\tOKEH\t5921\t27616-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66662.mp3\tBob Crosby's Bobcats\tWashington And Lee Swing\tDECCA\t2789A\t66662\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1890_002.mp3\tU.s. Marine Band\tWashington Post\tCOLUMBIA\t\t\t1890\t\nhttp://www.jazz-on-line.com/a/mp3c/VICB0312-12.mp3\tSousa's Band\tWashington Post March\tVICTOR\t17302\tB0312-12\t1912\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D52B1.mp3\tBoston Pops Orchestra (arthur Fiedler, Cond.)\tWashington Post March\tv-disk\t52B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1895_011.mp3\tSousa's Band\tWashington Post March\tVICTOR\t17302\tB0312-12\t1895\t\nhttp://www.jazz-on-line.com/a/mp3c/ARCB14437-A.mp3\tClaude Hopkins & His Orch\tWashington Squabble\tARC\tBR6750\tB14437-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC71101-A.mp3\tCharlie Barnet And His Orch\tWashington Whirligig\tDECCA\t18547A\t71101-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_142.mp3\tCharlie Barnet And His Orchestra\tWashington Whirligig\tDECCA\t18547A\t71101-A\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_271.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tWasn't It You?\tDECCA\t3991B\t69599\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_1031_01.mp3\tLee Morse And Her Bluegrass Boys\tWasting My Love On You\tColumbia\t2333 D\tW150924\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC63682-2.mp3\tJoe Venuti & His Orchestra\tWasting My Love On You (v F L)\tVICTOR\t23018\t63682-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3751.mp3\tGene Krupa & His Orch\tWatch Out\tCOLUMBIA\t38590\tHCO3751\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU070403.mp3\tDoctor Clayton\tWatch Out Mama\tBLUEBIRD\t8938\t070403\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC3977-1.mp3\tGene Krupa & His Orch\tWatch The Birdie\tOKEH\t6400\tC3977-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481116.mp3\tGene Krupa Orch. Feat. Anita O'day\tWatch The Birdie\tOkeh\t6400\tC3977-1\t1941\tRoy Eldridge, Norman Murphy, Torg Halten, Graham Young (tp), John Grassi, Jay Kelliher, Babe Wagner (tb), Mascagni ''Musky'' Ruffo (as), Sam Musiker (as,cl), Walter Bates, Jimmy Migliori (ts), Sam Listengart (bar), Milt Raskin (p), Ray Biondi (g), Ed Mihelich (sb), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3a/COLW147387-2.mp3\tCliquot Club Eskimos (reser)\tWatching The Clouds Roll By\tCOLUMBIA\t1625 D\tW147387-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_447.mp3\tDean Martin\tWatching The World Go By\tCapitol\t3414\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu061543-1.mp3\tEarl Hines And His Orchestra\tWater Boy\tBluebird\tB-11329\t061543-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Freddy Webster (tp) Joe McLewis, George Hunt, John Ewing (tb) Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck\nhttp://www.jazz-on-line.com/a/mp3b/Blu061543-1.mp3\tEarl Hines And His Orchestra\tWater Boy (be Vcl,ar Arr)\tBluebird\tB-11329\t061543-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/MajT-1103.mp3\tJimmie Lunceford And His Orchestra\tWater Faucet\tMajestic\t1122\tT-1103\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh100.mp3\tMaurice Winnick And His Sweet Music\tWater Lilies In The Moonlight (v Hughie Diamond)\tDecca\tF-6575\tDTB-3466-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142038.mp3\tGid Tanner's Skillet Lickers\tWatermelon On The Vine\tCOLUMBIA\t15091 D\tW142038\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-4744x.mp3\tPerry Como\tWatermelon Weather\tRCA\t20-4744\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DECL6769-A.mp3\tBing Crosby And Peggy Lee\tWatermelon Weather\tDECCA\t28238\tL6769-A\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_245.mp3\tBing Crosby And Peggy Lee\tWatermelon Weather\tDECCA\t28238\tL6769-A\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_151.mp3\tPerry Como And Eddie Fisher Feat. Mitchell Ayres' Orchestra\tWatermelon Weather\tRCA Victor\t4744\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_243.mp3\tElton Britt\tWave To Me, My Lady\tVICTOR\t1789\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO879.mp3\tCount Basie And His Rhythm\tWay Back Blues\tCOLUMBIA\t36712\tHCO879\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17631-1.mp3\tBoswell Sisters\tWay Back Home\tBRUNSWICK\t7454\t17631-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75003.mp3\tBing Crosby / Fred Waring Or.\tWay Back Home\tDECCA\t24800\t75003\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_112.mp3\tPeerless Quartet\tWay Down East\tEdison\t10489\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC31905-2.mp3\tGene Austin\tWay Down Home\tVICTOR\t19637\t31905-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_109.mp3\tGene Austin And Carson Robison\tWay Down Home\tVICTOR\t19637\t31905-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030809.mp3\tCasey Bill Weldon\tWay Down In Louisiana\tBLUEBIRD\t8060\t030809\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC21002-1.mp3\tErskine Hawkins Bama St.coll.\tWay Down Upon The Swanee River\tVOCALION\t3567\t21002-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3/Joh409.mp3\tHot Club Of France, Django Reinhardt And Stephane Grappelli\tWay Down Upon The Swanny River\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3l/Col80744-2.mp3\tThe Georgians\tWay Down Yonder In New Orlean\tColumbia\tA-3804\t80744-2\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU9870.mp3\tCotton Pickers\tWay Down Yonder In New Orleans\tBRUNSWICK\t2404\t9870\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146899-2.mp3\tJan Garber & His Orch\tWay Down Yonder In New Orleans\tCOLUMBIA\t1823 D\tW146899-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10450.mp3\tFrankie Laine & Jo Stafford\tWay Down Yonder In New Orleans\tCOLUMBIA\t40116\tRHCO10450\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38633.mp3\tRed Mckenzie-spirits Of Rhythm\tWay Down Yonder In New Orleans\tDECCA\t186A\t38633\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC27611-4.mp3\tPaul Whiteman & His Orch\tWay Down Yonder In New Orleans\tVICTOR\t19030\t27611-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17261H.mp3\tThe Dutch Swing College Band\tWay Down Yonder In New Orleans\tPhilips\tP17261H\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26565.mp3\tPeerless Qt\tWay Down Yonder In New Orleans\tVICTOR\t18942\t26565.\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/COL80571-3.mp3\tBlossom Seeley\tWay Down Yonder In New Orleans\tCOLUMBIA\tA-3731\t80571-3\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_057.mp3\tBlossom Seeley\tWay Down Yonder In New Orleans\tCOLUMBIA\tA-3731\t80571-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_342.mp3\tFrankie Laine And Jo Stafford\tWay Down Yonder In New Orleans\tCOLUMBIA\t40116\tRHCO10450\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT445.mp3\tLouis Prima & His Orchestra\tWay Down Yonder In New Orleans (v L P)\tMAJESTIC\t7159\tT445\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82494.mp3\tLouis Armstrong & His Allstars\tWay Down Yonder In New Orleans Pt.1\tDECCA\t28170\t82494\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM52S137.mp3\tJohnny King W Budd Johnson All\tWay Downtown At The Bottom Of The Hill\tMGM\t11255A\t52S137\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUM1032-A.mp3\tDuke Ellington & His Orch\tWay Low\tBRUNSWICK\t8411\tM1032-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA10.mp3\tSons Of The Pioneers\tWay Out There\tDECCA\t5013A\tDLA10\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_300.mp3\tBelltones\tWay Up In North Carolina\tMercury\t5692\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_0630_01.mp3\tLee Morse And Her Bluegrass Boys\tWe (my Honey And Me)\tColumbia\t1082DA\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_362.mp3\tPercy Faith And His Orchestra\tWe All Need Love\tColumbia\t40644\tCO54361\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLDAL1037.mp3\tChuck Wagon Gang\tWe Are Climbing\tCOLUMBIA\t37450\tDAL1037\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24192.mp3\tLeo Reisman & His Orchestra\tWe Belong Together\tVictor\t24192\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC73976.mp3\tLeo Reisman & His Orch\tWe Belong Together\tVICTOR\t24192\t73976\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74026.mp3\tEddie Condon & His Orchestra\tWe Called It Music\tDECCA\t24217B\t74026\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0421.mp3\tTempo King's Kings Of Tempo\tWe Can Huddle At Home\tBLUEBIRD\t6563\t0421\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU037155.mp3\tGlenn Miller & His Orch\tWe Can Live On Love (vmh)\tBLUEBIRD\t10309\t037155\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4573.mp3\tLouis Jordan's Tympani 5\tWe Can't Agree\tDECCA\t24483\tL4573\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63706-A.mp3\tElla Fitzgerald And Her Savoy Eight\tWe Can't Go On This Way\tDecca\t1846\t63706-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC55270.mp3\tSunny Clapp's Band O Sunshine\tWe Cant Use Each Other\tVICTOR\t40152\t55270\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478393.mp3\tMechanical Carousel Band Organ\tWe Did It Before And We'll Do It Again\tMAJOR RECORDS\t\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUB-15001-A.mp3\tEarl Hines And His Orchestra\tWe Found Romance (v Walter Fuller)\tBRUNSWICK\t6960\tB-15001-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30938.mp3\tCab Calloway & His Orch\tWe Go Well Together\tOKEH\t6341\t30938\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO30309.mp3\tFletcher Henderson\tWe Go Well Together\tCOLUMBIA\t36289\tCO30309\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/ColCO-30309-1.mp3\tFletcher Henderson And His Orchestra\tWe Go Well Together\tColumbia\t36289\tCO-30309-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VICOB2861.mp3\tRay Noble & His Orch\tWe Got The Moon & Sixpence\tVICTOR\t24212\tOB2861\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU12124.mp3\tGuy Lombardo Royal Canadians\tWe Just Couldn't Say Good-bye\tBRUNSWICK\t6350\t12124\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC12124-A.mp3\tGuy Lombardo Royal Canadians\tWe Just Couldn't Say Goodbye\tARC\tBR6350\t12124-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC73191-1.mp3\tPaul Whiteman And His Orch\tWe Just Couldn't Say Goodbye\tVICTOR\t24088\t73191-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC57499-3.mp3\tCoon Sanders Orchestra\tWe Love Us\tVICTOR\t22304\t57499-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEH834.mp3\tBob Wills And His Texas Playboys\tWe Might As Well Forget It\tOKEH\t6722\tH834\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_094.mp3\tBob Wills And His Texas Playboys\tWe Might As Well Forget It\tOKEH\t6722\tH834\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17392B.mp3\tLord Esxecutor\tWe Mourn The Loss Of Sir Murchison\tDECCA\t17392B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_089.mp3\tHarry Lauder\tWe Parted On The Shore\tVICTOR\t70013\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1093.mp3\tFred Astaire W J.green\tWe Saw The Sea\tBRUNSWICK\t7609\tLA1093\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25240.mp3\tRay Noble & His Orchestra\tWe Saw The Sea\tVictor\t25240\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_215.mp3\tFred Astaire\tWe Saw The Sea\tCOLUMBIA\t3117 D\tLA1093\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047641.mp3\tByron Parker Mountaineers\tWe Shall Rise\tBLUEBIRD\t8551\t047641\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150273.mp3\tBarbeque Bob (r.hicks)\tWe Sure Got Hard Times\tCOLUMBIA\t14558 D\tW150273\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC023765.mp3\tFats Waller And His Rhythm\tWe The People\tVICTOR\t25898\t023765\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67928.mp3\tInk Spots\tWe Three\tDECCA\t3379B\t67928\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC3379B.mp3\tInk Spots\tWe Three\tDECCA\t3379B\t67928\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec03379.mp3\tInk Spots\tWe Three\tDecca\t03379\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_029.mp3\tTommy Dorsey Orch V Frank Sinatra\tWe Three (my Echo, My Shadow, And Me)\tVICTOR\t26747\t055565\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC055565.mp3\tFrank Sinatra W Tommy Dorsey\tWe Three (vfs)\tVICTOR\t26747\t055565\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/PATCPT-1842-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tWe Were So Young\tPath\tPA-530\tCPT-1842-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D147A2.mp3\tThe Southern Sons\tWe'll Anchor Bye And Bye\tV-DISC\t147A2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_349.mp3\tThe Four Coins\tWe'll Be Married (in The Church In The Wildwood)\tEpic\t9074\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/Gre3928.mp3\tCliff Jackson And His Krazy Kats\tWe'll Be Married In June\tGrey Gull\t1853\t3928\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1132-1.mp3\tFrankie Laine W Carl Fischer\tWe'll Be Together Again\tMERCURY\t5091\t1132-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75585.mp3\tSy Oliver & His Orch.\tWe'll Build A Bungalow\tDECCA\t24840\t75585\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1678.mp3\tGene Krupa & His Orch\tWe'll Gather Lilacs\tCOLUMBIA\t36954\tHCO1678\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_284.mp3\tTommy Dorsey And His Orchestra (v Stuart Foster)\tWe'll Gather Lilacs\tRCA Victor\t20-1809\tD6VB1569\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/CONLA68-A.mp3\tBing Crosby\tWe'll Make Hay While The Sun Shines\tCONQUEROR\t9557\tLA68-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/ColLA68-A.mp3\tLennie  Hayton  And  His  Orchestra\tWe'll Make Hay While The Sun Shines\tColumbia\tDO1094\tLA68-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE32602-1.mp3\tBenny Goodman And His Orchestra\tWe'll Meet Again\tOKEH\t6644\t32602-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47386.mp3\tSammy Kaye\tWe'll Meet Again\tCOLUMBIA\t39774\tCO47386\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_304.mp3\tKay Kyser And His Orchestra\tWe'll Meet Again\tCOLUMBIA\t35870\t29194\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_156.mp3\tBenny Goodman And His Orchestra Feat. Peggy Lee\tWe'll Meet Again\tOKEH\t6644\t32602-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh193.mp3\tJack Hylton And His Orchestra\tWe'll Meet Again (v Dolly Elsie)\tHMV\tBD-5540\tOEA-8427-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24173-1.mp3\tRed Norvo & His Orch\tWe'll Never Know (v Terry Allen)\tVOCALION\t4698\t24173-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI3988-C.mp3\tFrederick J. Wheeler - Male Chorus - O\tWe'll Never Let The Old Flag Fall (kelly - Mcnutt)\tEDISON\tBA 2746\t3988-C\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA306-A.mp3\tBing Crosby\tWe'll Rest At The End Of The Trail\tDECCA\t2678A\tDLA306-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/CON12501-A.mp3\tBing Crosby\tWe're A Couple Of Soldiers\tCONQUEROR\t8365\t12501-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COL140558.mp3\tEddie Cantor\tWe're Back Together Again\tCOLUMBIA\t397D\t140558\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/VocM-789-1.mp3\tCab Calloway And His Orchestra\tWe're Breakin' Up A Lovely Affair\tVocalion\t4045\tM-789-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068499.mp3\tCarson Robison Trio\tWe're Gonna Have To Slap The Dirty Little Jap\tBLUEBIRD\t11414\t068499\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70346.mp3\tLucky Millinder & His Orch\tWe're Gonna Have To Slap The Dirty Little Jap\tDECCA\t4261A\t70346\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec70346-A.mp3\tLucky Millinder And His Orchestra\tWe're Gonna Have To Slap The Dirty Little Jap (and Uncle Sam's The Guy Who Can Do It)\tDecca\t4261\t70346-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU82776-1.mp3\tDave Harman And His Orch\tWe're Out Of The Red\tBLUEBIRD\t5436\t82776-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC81990.mp3\tRamona's Park Avenue Boys\tWe're Out Of The Red\tVICTOR\t24598\t81990\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068241.mp3\tGlenn Miller & His Orch\tWe're The Couple In The Castle\tBLUEBIRD\t11397-B\t068241\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO43153.mp3\tUna Mae Carlisle\tWe've All Got A Lesson To Learn\tCOLUMBIA\t38979\tCO43153\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_118.mp3\tSammy Kaye And His Orchestra\tWe've Come A Long Way Together\tVictor\t26178\t033746\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC13423-2.mp3\tArthur Collins-byron Harlan\tWe've Got A Parrot In Our House\tVICTOR\t17374\t13423-2\t1913\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC17374w.mp3\tArthur Collins Byron Harlan\tWe've Got A Parrot In Our House\tVICTOR\t17374\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic17374-A.mp3\tCollins & Harlan\tWe've Got A Parrot In Our House (pretty Poll, Pretty Poll)\tVictor\t17374-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC349-2-.mp3\tTom Glazer\tWe've Got A Plan\tASCH\t349-2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC80633.mp3\tLouis Jordan & His Trio\tWeak Minded Blues\tDECCA\t27547\t80633\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUCP1107.mp3\tCab Calloway And His Orch\tWeakness\tBRUNSWICK\t6992\tCP1107\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM48S25.mp3\tHank Williams\tWealth Won't Save Your Soul\tMGM\t30455\t48S25\t\t\nhttp://www.jazz-on-line.com/a/mp37/DECDLA1320A.mp3\tTed Lewis And His Orchestra\tWear A Hat With A Silver Lining\tDECCA\t23918 A\tDLA1320A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1401-1.mp3\tFrankie Trumbauer Orch\tWearin' Of The Green Medley\tVARSITY\t8215\tUS1401-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98368.mp3\tTommy Dorsey & His Orch\tWeary\tVICTOR\t25206\t98368\t1935\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU18324.mp3\tLeo Reisman And His Orch\tWeary\tBRUNSWICK\t7585\t18324\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030321.mp3\tTommy Ladnier And His Orch\tWeary Blues\tBLUEBIRD\t10085\t030321\t1938\t\nhttp://www.78-tours.net/mp3/GRAOA095142.mp3\tTommy Dorsey And His Orchestra Tommy Dorsey, W. Mercurio, B. Pickering (tromb.) M. Kaminsky, S. Koln\tWeary Blues\tGRAMOPHONE\tK. 8250\tOA. 095142\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE80863-A.mp3\tLouis Armstrong's Hot Five\tWeary Blues\tOKEH\t8519\t80863-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39341-A.mp3\tDorsey Brothers Orchestra\tWeary Blues\tDECCA\t15013B\t39341-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC95142.mp3\tTommy Dorsey & His Orch\tWeary Blues\tVICTOR\t25159\t95142\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU026859.mp3\tErskine Hawkins & His Orch\tWeary Blues\tBLUEBIRD\t7839\t026859\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU4WB.mp3\tCliff Jackson's Qt\tWeary Blues\tBLUENOTE\tBN4\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/BLUBN049WB.mp3\tSidney Bechet\tWeary Blues\tBLUENOTE\tBN049\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/SAVG17060.mp3\tWingy Manone\tWeary Blues\tSAVOY\t500\tG17060\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG11355-B.mp3\tNew Orleans Rhythm Kings\tWeary Blues\tGENNETT\t5102\tG11355-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17131H-.mp3\tThe Dutch Swing College Band\tWeary Blues\tPhilips\tP17131H\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_211.mp3\tMcguire Sisters And Lawrence Welk And His Orchestra\tWeary Blues\tCoral\t61670\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/Bla7.mp3\tCliff Jackson\tWeary Blues\tBlack & White\t4\t7\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC46064-2.mp3\tJohnny Dodds Washboard Band\tWeary City\tVICTOR\t38004A\t46064-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147866-2.mp3\tJan Garber & His Orch\tWeary River\tCOLUMBIA\t1724 D\tW147866-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE29378.mp3\tBob Haring & His Orch\tWeary River\tBRUNSWICK\t4273\tE29378\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC49926-3.mp3\tRudy Vallee's Ct.yankees\tWeary River\tVICTOR\t21868A\t49926-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC49646-4.mp3\tGene Austin\tWeary River\tVICTOR\t21856\t49646-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCNO-133.mp3\tEllis Stratakos And His Hotel Jung Orchestra\tWeary River\tVOCALION\t15792B\tNO-133\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiHar857-Hw.mp3\tJack Miller\tWeary River\tHarmony\t857-H\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_048.mp3\tGene Austin Feat. O/nat Shilkret\tWeary River\tVICTOR\t21856\t49646-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_014.mp3\tRudy Vallee And His Connecticut Yankees\tWeary River\tVICTOR\t21868A\t49926-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401585-A.mp3\tJoe Venuti's New Yorkers\tWeary River (v S B)\tOKeh\t41192\t401585-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR147911-2.mp3\tGolden Gate Orch\tWeary River (vjr)\tHARMONY\t839-H\t147911-2\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Par265075-2.mp3\tMills Blue Rhythm Band\tWeary Traveller\tParlophone\tR-2366\t265075-2  \t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP4763-1.mp3\tDixie Thumpers\tWeary Way Blues\tPARAMOUNT\t12525\tP4763-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU11091.mp3\tAbe Lyman & His Orch\tWeary Weasel (tiger Rag)\tBRUNSWICK\t2504\t11091\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1155.mp3\tTed Daffan's Texans\tWeary, Worried And Blue\tOKEH\t6253\tDAL1155\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe402199-A.mp3\tLouis Armstrong And His Hot 5\tWeather Bird\tOKeh\t41454\t402199-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/Gen11388.mp3\tKing Oliver's Creole Jazz Band\tWeather Bird Rag\tGennett\t5132\t11388\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17764.mp3\tLouis Prima & His Gang\tWeather Man\tBRUNSWICK\t7499\t17764\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92265-1.mp3\tAdrian's Taproom Gang\tWeather Man (vw.manone)\tVICTOR\t25072\t92265-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU07138.mp3\tDixon Brothers\tWeaver's Life\tBLUEBIRD\t7802\t07138\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW147969-4.mp3\tFred Rich And His Orch\tWedding Bells\tCOLUMBIA\t1740 D\tW147969-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S6038.mp3\tHank Williams\tWedding Bells\tMGM\t10401\t49S6038\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE29237.mp3\tBob Haring And His Orch\tWedding Bells\tBRUNSWICK\t4246\tE29237\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_095.mp3\tAmerican Quartet\tWedding Bells\tEdison\t10294\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_144.mp3\tFour Aces Feat. Jack Pleis And His Orchestra\tWedding Bells (are Breaking Up That Old Gang Of Mine)\tDECCA\t29123\t86167\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_109.mp3\tAl Jolson\tWedding Bells (will They Ever Ring For Me?)\tColumbia\tA-2512\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9236.mp3\tOrlando's Orchestra\tWedding Bells - Waltz\tEDISON\t\t9236\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC49989-3.mp3\tGene Austin\tWedding Bells Are Breaking Up That Old Gang\tVICTOR\t21893\t49989-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_080.mp3\tGene Austin\tWedding Bells Are Breaking Up That Old Gang Of Mine\tVictor\t21893\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_245.mp3\tSteve Gibson And The Red Caps\tWedding Bells Are Breaking Up That Old Gang Of Mine\tMERCURY\t8069\t1097-5\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/COL77571.mp3\tAl Jolson\tWedding Bells, Will You Ever Ring For Me?\tCOLUMBIA\tA-2512\t77571\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19877-1.mp3\tCab Calloway\tWedding Of Mr & Mrs Swing\tARC\tBR7748\t19877-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61598-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWednesday Night Hop\tDecca\t1303\t61598-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74733.mp3\tLionel Hampton & His Orch\tWee Albert\tDECCA\t24699\t74733\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec74733.mp3\tLionel Hampton And His Orchestra\tWee Albert\tDecca\t24699\t74733\t1949\tBenny Bailey-Duke Garrette-Wendell Culley-Leo Shepherd-Walter Wiliams-t, Lester Bass-Al Grey-Benny Powell-Jimmy Wormick-tb, Johnny Board-Bobby Plater-as, Gene MorrisJohnny Sparrow-Billy Williams-ts, Ben Kynard-bar, Albert Ammons-p, Lionel Hampton-vib\nhttp://www.jazz-on-line.com/a/mp3o/DEC68605.mp3\tArt Tatum\tWee Baby Blues\tDECCA\t48062\t68605\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-105-1.mp3\tAlix Combelle And His Swing Band\tWeekend Stomp\tSwing\t73\tOSW-105-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74650.mp3\tBillie Holiday & Stardusters\tWeep No More\tDECCA\t24551\t74650\t1948\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol3519.mp3\tRay Miller & His Black & White Melody Boys\tWeep No More (my Mammy)\tColumbia\t3519\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_189.mp3\tGlen Gray And Casa Loma Orchestra Feat. Kenny Sargent, V\tWeep No More, My Baby\tBRUNSWICK\t6647\t13878\t1933\tJoe Hostetter, Frank Martinez (tp), Pee Wee Hunt, Billy Rauch (tb), Glen Gray (as, ldr), Clarence Hutchinrider (cl, as), Kenny Sargent, Pat Davis (ts), Mel Jenssen (vn), Joe Hall (p), Gene Gifford (bj, g), Stanley Dennis (bb, sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1922_059.mp3\tVernon Dalhart\tWeep No More, My Mammy\tCOLUMBIA\tA-3500\t80019\t1922\t\nhttp://www.jazz-on-line.com/a/mp3o/DOT1071x.mp3\tGriffin Brothers Orch\tWeepin' And Cryin' (vtommy Brown)\tDOT\t1071\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COL140062-2.mp3\tBessie Smith\tWeeping Willow Blues\tCOLUMBIA\t14042 D\t140062-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-3301-A.mp3\tJabbo Smith's Rhythm Aces (four Aces And The Jokers)\tWeird And Blue\tBrunswick\t\tC-3301-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-399-1.mp3\tNol Chiboust Et Son Grand Orchestre (with Django Reinhardt)\tWelcome (2e Partie)\tSWING\t197\tOSW-399-1\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_258.mp3\tJimmy Dorsey And His Orchestra Feat. V/kay Weber\tWelcome Stranger\tDECCA\t768A\tDLA313-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037137.mp3\tTommy Dorsey & His Orch\tWell All Right\tVICTOR\t26281\t037137\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_064.mp3\tAndrews Sisters\tWell All Right (tonight's The Night)\tDECCA\t2462B\t65532\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_482.mp3\tBing Crosby And Frank Sinatra\tWell Did You Evah\tCapitol\t3507\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/CAPevah.mp3\tBing Crosby\tWell Did You Evah?\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECAM402-1.mp3\tColeman Hawkins\tWell, All Right Then\tDECCA\t18251B\tAM402-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24644-A.mp3\tJimmie Lunceford And His Orchestra\tWell, All Right Then\tOkeh\t4887\t24644-A\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3c/DEC65532.mp3\tAndrews Sisters\tWell, All Right!\tDECCA\t2462B\t65532\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_141.mp3\tTommy Dorsey And His Orchestra\tWell, Git It!\tVICTOR\t27887\t072172-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5757.mp3\tLionel Hampton And His Orchestra\tWell, Oh Well\tDecca\t27164\tLA-5757\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh019.mp3\tBilly Cotton And His Band\tWere You Sincere ? (v  Sid Buckman)\tColumbia\tCB-291\tCA-11557-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW151516.mp3\tRuth Etting\tWere You Sincere?\tCOLUMBIA\t2445\tW151516\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/BRULA1036-A.mp3\tBing Crosby\tWere You Sincere?\tBRUNSWICK\t6120\tLA1036-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_130.mp3\tRuth Etting\tWere You Sincere?\tCOLUMBIA\t2445\tW151516\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU07644.mp3\tWalter Davis\tWest Coast Blues\tBLUEBIRD\t7064\t07644\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN9740.mp3\tSalty Dog Four\tWest Coast Stomp\tBANNER\t32394\t9740\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146881-2.mp3\tEthel Waters\tWest End Blues\tCOLUMBIA\t14365 D\tW146881-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC72452.mp3\tCharlie Barnet And His Orch\tWest End Blues\tDECCA\t18659B\t72452\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe400967-B.mp3\tLouis Armstrong And His Hot Five\tWest End Blues\tOKeh\t8597\t400967-B\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49650-2.mp3\tKing Oliver And His Orch\tWest End Blues\tVICTOR\t38034\t49650-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/MERYW603.mp3\tFrankie Lane\tWest End Blues\tMERCURY\t1028\tYW603\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG14837.mp3\tWhyte Zack\tWest End Blues\tGENNETT\t6798\tG14837\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041362-2.mp3\tJelly Roll Morton Jazzmen\tWest End Blues\tBLUEBIRD\t10442\t041362-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/MER70275WED.mp3\tFrankie Laine\tWest End Blues\tMERCURY\t70275\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN8244-2-3.mp3\tFred Hall's Jazz Band\tWest End Blues\tBANNER\t7248\t8244-2-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE30423.mp3\tCootie Williams Rug Cutters\tWest End Blues\tOKEH\t6370\t30423\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke8597.mp3\tLouis Armstrong\tWest End Blues\tOkeh\t8597\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_216.mp3\tLouis Armstrong\tWest End Blues\tOkeh\t8597\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu041362-2.mp3\tJelly-roll Morton's New Orleans Jazzmen\tWest End Blues\tBluebird\tB-10442\t041362-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Aja31012-2.mp3\tSeven Brown Babies\tWest Indian Blues\tAjax\t17009\t31012-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/Ohe72515-A.mp3\tJamaica Jazzers\tWest Indies Blues\tOkeh\t40177\t72515-A\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC30734.mp3\tHenry Burr\tWest Of The Great Divide\tVICTOR\t19651\t30734\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_147.mp3\tHenry Burr\tWest Of The Great Divide\tVICTOR\t19651\t30734\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/COL80984.mp3\tShannon Four (male Qt)\tWest Virginia Hills\tCOLUMBIA\tA-3890\t80984\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98898.mp3\tFats Waller And His Rhythm\tWest Wind\tVICTOR\t25253\t98898\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Oly575-2.mp3\tHenderson's  Dance Players\tWet Yo Thumb\tOlympic\t1435\t575-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67010.mp3\tAndy Kirk & Clouds Of Joy\tWham\tDECCA\t2962A\t67010\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL25735-1.mp3\tTeddy Wilson & His Orch\tWham\tCOLUMBIA\t35354\t25735-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26413.mp3\tMildred Bailey\tWham\tCOLUMBIA\t35370\t26413\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/MERC658-3.mp3\tJohnny Hodges & His Orchestra\tWham\tMERCURY\t89058\tC658-3\t1952\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke25753-1.mp3\tJimmie Lunceford And His Orchestra\tWham (re Bop Boom Bam)\tOkeh\t5326\t25753-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1367-1.mp3\tJack Teagarden & His Orch\tWham (v K K)\tVARSITY\t8202\tUS1367-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67010-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWham (wham Re Bop Boom Bam)\tDecca\t2962\t67010-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN869b.mp3\tHank Penny\tWham Bam! Thank You Ma'am\tKING\t869\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/MERC779.mp3\tJohnny Hodges & His Orchestra\tWham I Gotchere\tMERCURY\t89000\tC779\t1952\t\nhttp://www.jazz-on-line.com/a/mp3d/ManA-1575.mp3\tJimmie Lunceford's Orchestra Under The Direction Of Eddie  Wilcox - Joe Thomas\tWhat 'cha Gonna Do?\tManor\t1120\tA-1575\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/COLLA232.mp3\tAndy Iona's Novelty Four\tWhat A Brownskin Maiden Taught Me\tCOLUMBIA\t3139 D\tLA232\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_359.mp3\tWally Cox\tWhat A Crazy Guy (dufo)\tRCA Victor\t5278\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_064.mp3\tDorsey Brothers Orchestra Feat. Bob Crosby\tWhat A Diff'rence A Day Made\tDECCA\t195A\t38705-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU063703.mp3\tBenny Carter & His Orch\tWhat A Difference A Day Made\tBLUEBIRD\t11197\t063703\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44361.mp3\tBobby Hackett\tWhat A Difference A Day Made\tCOLUMBIA\t39022\tCO44361\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu063703-1.mp3\tBenny Carter And His Orchestra\tWhat A Difference A Day Made\tBluebird\tB-11197\t063703-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC283A.mp3\tDorsey Brothers Orchestra\tWhat A Difference A Day Made (\tDECCA\t283A\t38914-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC38914-A.mp3\tDorsey Brothers Orchestra\tWhat A Difference A Day Made (vbc)\tDECCA\t283A\t38914-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM48S625.mp3\tSarah Vaughan W Orch\tWhat A Difference A Day Makes\tMGM\t10762B\t48S625\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_070.mp3\tPatti Page\tWhat A Dream\tMERCURY\t70416\t\t1954\t\nhttp://www.jazz-on-line.com/mp3/956883192.mp3\tEddy Arnold\tWhat A Fool I Was\tRCA\t20-2700\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_204.mp3\tEddy Arnold\tWhat A Fool I Was\tRCA\t20-2700\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN9357-3.mp3\tHometowners (fred Hall)\tWhat A Funny World This Would Be\tBANNER\t626\t9357-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC48610-3.mp3\tCoon-sanders Orchestra\tWhat A Girl What A Night\tVICTOR\t21803\t48610-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64697.mp3\tAndy Kirk & Clouds Of Joy\tWhat A Life\tDECCA\t2617A\t64697\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC71930.mp3\tCoon-sanders Orchestra\tWhat A Life\tVICTOR\t22950\t71930\t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64697-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWhat A Life (trying To Live Without You)\tDecca\t2617\t64697-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU7498.mp3\tTeddy Wilson & His Orch\tWhat A Little Moonlight Can Do\tBRUNSWICK\t7498\t17767-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh201.mp3\tJack Jackson And His Orchestra\tWhat A Little Moonlight Can Do\tHMV\tB-6547\tOEA-667-2\t1934\tnot only issued by HMV (B-6547), but also as Victor 25069<br>the vocals are by Fred Latham and 2 other guys (band members ?), the featured trumpet could well be played Mr. Jackson himself. Norbert have a song in his collection, \"Be still, my heart\", vocals by the famous Alberta Hunter, which was recorded the same day and it could well be the same Jackson orchestra for the \"Moonlight\"\nhttp://www.jazz-on-line.com/a/mp3t/TS480654.mp3\tTeddy Wilson & His Orch.\tWhat A Little Moonlight Can Do\tBrunswick\t7498\t17767-1\t1935\tBillie Holiday (vo), Roy Eldridge (tp), Ben Webster (ts), Teddy Wilson (p), John Trueheart (g), John Kirby (sb), Cozy Cole (dm)\nhttp://www.jazz-on-line.com/a/mp3c/BRU17767-1.mp3\tTeddy Wilson & His Orch\tWhat A Little Moonlight Can Do (vbh)\tBRUNSWICK\t7498\t17767-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR141839-3.mp3\tUniversity Six\tWhat A Man\tHARMONY\t160-H\t141839-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17913-1.mp3\tTeddy Wilson & His Orch\tWhat A Night What A Moon What A Girl\tBRUNSWICK\t7511\t17913-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152316-3.mp3\tEddie Cantor\tWhat A Perfect Combination\tCOLUMBIA\t2723 D\tW152316-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_074.mp3\tEddie Cantor\tWhat A Perfect Combination\tCOLUMBIA\t2723 D\tW152316-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh150.mp3\tThe Bbc Dance Orchestra Dir. By Henry Hall\tWhat A Perfect Combination\tColumbia\tCB-568\tCA-13416-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1907-1.mp3\tCharlie Palloy & His Orch\tWhat A Perfect Combination (vcp)\tCROWN\t3410A\tC1907-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038212.mp3\tFats Waller And His Rhythm\tWhat A Pretty Little Miss\tBLUEBIRD\t10437\t038212\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW145476.mp3\tPaul Ash And His Orchestra\tWhat A Wonderful Wedding That Will Be\tCOLUMBIA\t1256 D\tW145476\t1928\tDanny Polo, clarinet, alto & baritone saxes, replaces Wing or Nettles; Hank Winston, piano replaces Barris. Danny polo omitted; possibly Joe Tarto, brass bass, v Harold \"Scrappy\" Lambert, New York, January 4th 1928\nhttp://www.jazz-on-line.com/a/mp3b/Joh096.mp3\tThe Rhythmic Eight (bert & John Firman)\tWhat A Wonderfull Wedding That Will Be (v Maurice Elwin)\tZonophone\t5269\tYy-14915-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70907.mp3\tGene Kardos & His Orch\tWhat Are You Thinking About, Baby? (v D R)\tVICTOR\t22840\t70907\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe81775.mp3\tDuke Ellington & His Orch\tWhat Can A Poor Fella Do?\tOKeh\t40955\t81775\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP646.mp3\tKing Cole Trio\tWhat Can I Say After I Say I'm Sorry\tCAPITOL\t\t646\t1946\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480711.mp3\tBenny Goodman Trio\tWhat Can I Say After I Say I'm Sorry\tCapitol\tEAP2-565\t20548\t1954\tBenny Goodman (cl), Mel Powell (p), Bobby Donaldsen (dm)\nhttp://www.jazz-on-line.com/a/mp3a/COLW141787.mp3\tFrank Harris\tWhat Can I Say After I Say I'm Sorry?\tCOLUMBIA\t607 D\tW141787\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15465A.mp3\tLeo Reisman And His Orch\tWhat Can You Say In A Love Song (vha)\tBRUNSWICK\t6941\t15465A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0800_01.mp3\tLee Morse\tWhat Cha Call Em Blues\tPerfect\t11590A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru2471.mp3\tIsham Jones & His Orchestra\tWhat Could Be Sweeter\tBrunswick\t2471\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/COLCO38494.mp3\tCharioteers\tWhat Did He Say\tCOLUMBIA\t38065\tCO38494\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_242.mp3\tCharioteers\tWhat Did He Say?\tCOLUMBIA\t38065\tCO38494\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP3527.mp3\tBlue Lu Barker\tWhat Did You Do To Me\tCAPITOL\t\t3527\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20754-B.mp3\tJan Garber And His Orch\tWhat Do I Care What Somebod\tVictor\t20754-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_0317_01.mp3\tLee Morse And Her Bluegrass Boys\tWhat Do I Care What Somebody Said?\tColumbia\t1063DA\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/ARCB13043-A.mp3\tBing Crosby\tWhat Do I Care, It's Home\tARC\tBR6515\tB13043-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/CONDAL1288.mp3\tHi Flyers\tWhat Do I Do Now?\tCONQUEROR\t9875\tDAL1288\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20906-A.mp3\tJim Miller-charlie Farrell\tWhat Do We Do On A Dew-dew-\tVictor\t20906-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC39618-3.mp3\tNat Shilkret's Victor Orch\tWhat Do We Do On A Dew-dew-dewey Day (vjm)\tVICTOR\t20819A\t39618-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D128B2.mp3\tBing Crosby\tWhat Do You Do In The Infantry\tV-DISC\t128B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_171.mp3\tAmerican Quartet\tWhat Do You Do Sunday, Mary?\tVictor\t19188\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-2234-2.mp3\tFletcher Henderson And His Orchestra\tWhat Do You Hear From The Mob In Scotland\tVocalion\t4167\tC-2234-2  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC2234-2.mp3\tFletcher Henderson & His Orch\tWhat Do You Hear From The Mob?\tVOCALION\t4167\tC2234-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC030781.mp3\tTommy Dorsey & His Orch\tWhat Do You Know About Love\tVICTOR\t26140\t030781\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU027960.mp3\tErskine Hawkins & His Orch\tWhat Do You Know About Love?\tBLUEBIRD\t10012A\t027960\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62635.mp3\tBob Howard & His Orch\tWhat Do You Want To Make Those Eyes At Me For?\tDECCA\t1605\t62635\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VICB18224.mp3\tAda Jones And Billy Murray\tWhat Do You Want To Make Those Eyes At Me For?\tVICTOR\t18224\tB\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_032.mp3\tAda Jones And Billy Murray\tWhat Do You Want To Make Those Eyes At Me For?\tVICTOR\t18224\tB\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5703.mp3\tDon Byas Qt\tWhat Do You Want With My Heart\tSAVOY\t551A\tS5703\t1944\t\nhttp://www.jazz-on-line.com/a/mp3d/SAVS5703.mp3\tDon Byas Orchestra\tWhat Do You Want With My Heart\tSAVOY\t551A\tS5703\t1944\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR352-Hx.mp3\tW. M. C. A. Broadcasters\tWhat Does It Matter\tHarmony\t352-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_116.mp3\tNat Shilkret And The Victor Orchestra\tWhat Does It Matter Now?\tVICTOR\t20471\t37598-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL6534.mp3\tElla Fitzgerald\tWhat Does It Take\tDECCA\t28034\tL6534\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_060.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tWhat Goes On Here In My Heart\tVICTOR\t25878\t023511\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VOC24238-1.mp3\tCount Basie And His Orch\tWhat Goes Up Must Come Down\tVOCALION\t4734\t24238-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24238-1.mp3\tCount Basie And His Orchestra\tWhat Goes Up Must Come Down\tVocalion\t4734\t24238-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64378-4.mp3\tDuke Ellington & His Orch\tWhat Good Am I Without You\tVICTOR\t22586\t64378-4\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Col150998-2.mp3\tFletcher Henderson And His Orchestra\tWhat Good Am I Without You\tColumbia\t2352-D\t150998-2  \t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150998-2.mp3\tFletcher Henderson & His Orch\tWhat Good Am I Without You?\tCOLUMBIA\t2352 D\tW150998-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC061942.mp3\tDuke Ellington Orch\tWhat Good Would It Do\tVICTOR\t27740\t061942\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECAM179.mp3\tColeman Hawkins & Ramblers\tWhat Harlem Is To Me\tDECCA\t742B\tAM179\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCam572.mp3\tBernard & Robinson\tWhat Has Become Of Hinky Dinky Parly Voo\tCameo\t572\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC75341-1.mp3\tPaul Whiteman Presents Ramona\tWhat Have We Got To Lose\tVICTOR\t24268\t75341-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_146.mp3\tRoy Bargy And Ramona\tWhat Have We Got To Lose?\tVICTOR\t24268\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_079.mp3\tPhil Harris\tWhat Have We Got To Lose? (heigh-ho Lackaway)\tCOLUMBIA\t2761 D\tW152383\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23465.mp3\tMildred Bailey & Her Orchestra\tWhat Have You Got That Gets Me\tVOCALION\t4406\t23465\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC025477.mp3\tBenny Goodman And His Orchestra\tWhat Have You Got That Gets Me?\tVICTOR\t26053\t025477\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_098.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton, V\tWhat Have You Got That Gets Me?\tVICTOR\t26053\t025477\t1938\tHarry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Dave Matthews, Noni Bernardi (as), Arthur Rollini, Bud Freeman (ts), Jess Stacy (p), Ben Heller (g), Harry Goodman (sb), Dave Tough (dm)\nhttp://www.jazz-on-line.com/a/mp3e/COLCO45840.mp3\tArthur Godfrey - Mitch Miller\tWhat Is A Boy\tCOLUMBIA\t40656\tCO45840\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_263.mp3\tArthur Godfrey\tWhat Is A Boy\tCOLUMBIA\t39487\tCO45840\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_308.mp3\tSteve Allen\tWhat Is A Wife\tCoral\t61542\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_189.mp3\tSmith Ballew And His Orchestra\tWhat Is It?\tCOLUMBIA\t2503 D\tW151701-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2058x.mp3\tEddy Arnold\tWhat Is Life Without Love\tRCA\t20-2058\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA747-A.mp3\tBing Crosby & Victor Young\tWhat Is Love\tDECCA\t1234\tDLA747-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0420_02.mp3\tLee Morse\tWhat Is Love All About\tPerfect\t11616B\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA747-A.mp3\tVictor Young And His Orchestra With Bing Crosby\tWhat Is Love? \tDECCA\t1234\tDLA747-A \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14121.mp3\tCharlie Barnet & His Orch\tWhat Is Sweeter (v H V Z)\tBANNER\t32876\t14121\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC69733.mp3\tSkeets Tolbert Gentlemen Swing\tWhat Is The Matter Now?\tDECCA\t8631B\t69733\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COMB538-2.mp3\tWillie Smith (piano)\tWhat Is There To Say\tCOMMODORE\t518\tB538-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP587.mp3\tColeman Hawkins & His Orch\tWhat Is There To Say\tCAPITOL\t\t587\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC60190-A.mp3\tBud Freeman's Windy City 5\tWhat Is There To Say\tDECCA\t18113A\t60190-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480697.mp3\tNat King Cole\tWhat Is There To Say\tCapitol\tEMS-1103\t15923-14\t1957\tNat King Cole, P & Vocal, Juan Tizol, V-Tb, John Collins, G, Charlie Harris, B, Lee Young, D\nhttp://www.jazz-on-line.com/a/mp3b/Vic055185-1.mp3\tArtie Shaw And His Orchestra\tWhat Is There To Say ?\tVictor\t27432\t055185-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC055185-2.mp3\tArtie Shaw And His Orchestra\tWhat Is There To Stay?\tVICTOR\t27432\t055185-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CON26574-A.mp3\tBillie Holiday & Her Orch\tWhat Is This Going To Get Us?\tCONQUEROR\t9458\t26574-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP185.mp3\tKing Cole Trio\tWhat Is This Thing Called Love\tCAPITOL\t20011\t185\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5548.mp3\tArtie Shaw And His New Music (vocal Mel Torme)\tWhat Is This Thing Called Love\tMUSICRAFT\t390\t5548\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/APOST2299.mp3\tErroll Garner\tWhat Is This Thing Called Love\tAPOLLO\t797\tST2299\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/BLUBN520W.mp3\tJohn Hardee Sextet\tWhat Is This Thing Called Love\tBLUENOTE\tBN520\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23565g.mp3\tBillie Holiday\tWhat Is This Thing Called Love\tDECCA\t23565\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D779r.mp3\tBuddy Rich Orch\tWhat Is This Thing Called Love\tV-DISC\t779\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480397.mp3\tArt Tatum And Lionel Hampton\tWhat Is This Thing Called Love\tClef\tMGC709\t2380-2\t1955\tLionel Hampton (vib), Art Tatum (p), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480575.mp3\tLionel Hampton And His Giants\tWhat Is This Thing Called Love\tVerve\tMGV8215\t2492-4\t1955\tHarry \"Sweets\" Edison (tp), Lionel Hampton (vib), Art Tatum (p), Barney Kessel (g), Red Callender (sb), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480595.mp3\tLionel Hampton And His Giants\tWhat Is This Thing Called Love\tVerve\tMGV8215\t2492-4\t1955\tHarry \"Sweets\" Edison (tp), Lionel Hampton (vib), Art Tatum (p), Barney Kessel (g), Red Callender (sb), Buddy Rich (dm)\nhttp://www.jazz-on-line.com/a/mp3c/SIG564.mp3\tAnita O'day W Will Bradley Or.\tWhat Is This Thing Called Love (wake Up & Live)\tSIGNATURE\t15162A\t564\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC58183-8.mp3\tLeo Reisman And His Orch\tWhat Is This Thing Called Love?\tVICTOR\t22282A\t58183-8\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC5188.mp3\tBen Bernie & His Orch\tWhat Is This Thing Called Love?\tBRUNSWICK\t4707\tC5188\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_112.mp3\tBen Bernie And His Orchestra\tWhat Is This Thing Called Love?\tBRUNSWICK\t4707\tC5188\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_279.mp3\tArtie Shaw And His Orchestra\tWhat Is This Thing Called Love?\tMusicraft\t\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_093.mp3\tTommy Dorsey And His Orchestra\tWhat Is This Thing Called Love?\tVICTOR\t27782A\t061989\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2693A.mp3\tAndy Griffith\tWhat It Was, Was Football\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_064.mp3\tAndy Griffith\tWhat It Was, Was Football (parts 1 & 2)\tCAPITOL\t2693\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_139.mp3\tArthur Fields\tWhat Kind Of American Are You?\tBRUNSWICK\t2950\t16309-10\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/COL77130-1.mp3\tPrince's Band\tWhat Kind Of An American Are You?\tCOLUMBIA\tA-2317\t77130-1\t1917\t\nhttp://www.jazz-on-line.com/a/mp3e/COL77056.mp3\tArthur Fields\tWhat Kind Of An American Are You?\tCOLUMBIA\tA-2272\t77056\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC37750-2.mp3\tFive Harmaniacs\tWhat Makes My Baby Cry?\tVICTOR\t20507\t37750-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_207.mp3\tFrank Sinatra\tWhat Makes The Sunset\tCOLUMBIA\t36774\tCO33930\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC63546.mp3\tPeetie Wheatstraw\tWhat More Can A Man Do?\tDECCA\t7479\t63546\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CONT6008.mp3\tSarah Vaughn\tWhat More Can A Woman Do?\tCONTIN\tT6008\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/ConW-3325.mp3\tSarah Vaughan\tWhat More Can A Woman Do?\tContinental\t6008\tW-3325\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOB4365.mp3\tRay Noble & His Orch\tWhat More Can I Ask\tVICTOR\t24314\tOB4365\t1932\t\nhttp://www.jazz-on-line.com/a/mp3o/KINK2817.mp3\tMoon Mullican And String Band\tWhat My Eyes See, My Heart Believes\tKING\t722A\tK2817\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU24044-1.mp3\tTeddy Wilson & His Orch\tWhat Shall I Say\tBRUNSWICK\t8314\t24044-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC23988.mp3\tMildred Bailey & Her Orchestra\tWhat Shall I Say\tVOCALION\t4632\t23988\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24044-1.mp3\tTeddy Wilson And His Orchestra\tWhat Shall I Say ?\tBrunswick\t8314\tB-24044-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_176.mp3\tEddie Delange Feat. Elisse Cooper\tWhat This Country Needs Is Foo'\tBLUEBIRD\t10074\t030717\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/V-DVP-1598b.mp3\tJimmie Lunceford And His Orchestra\tWhat To Do\tV-Disc\t586-A\tVP-1598b\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VAR1886.mp3\tWillie Lewis & Negro Band\tWhat Will I Do\tVARSITY\tEL4067s\t1886\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014648-1.mp3\tFats Waller And His Rhythm\tWhat Will I Do In The Morning?\tVICTOR\t25712\t014648-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20657.mp3\tHal Kemp & His Orch\tWhat Will I Tell My Heart\tBRUNSWICK\t7830\t20657\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_299.mp3\tDolly Dawn And Her Dawn Patrol\tWhat Will I Tell My Heart\tBLUEBIRD\t6796\t04329\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDLA737-A.mp3\tJimmy Dorsey And His Orchestra With Bing Crosby\tWhat Will I Tell My Heart \tDECCA\t1185\tDLA737-A \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc20752-1.mp3\tFletcher Henderson And His Orchestra\tWhat Will I Tell My Heart \tVocalion\t3485\t20752-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC61465.mp3\tAndy Kirk And Clouds Of Joy\tWhat Will I Tell My Heart?\tDECCA\t1085\t61465\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA726-A.mp3\tArt Tatum Swingsters\tWhat Will I Tell My Heart?\tDECCA\t1197\tDLA726-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC20752.mp3\tFletcher Henderson & His Orch\tWhat Will I Tell My Heart?\tVOCALION\t3485\t20752\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA737.mp3\tBing Crosby & Jimmy Dorsey\tWhat Will I Tell My Heart?\tDECCA\t1185\tDLA737\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec61465-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWhat Will I Tell My Heart?\tDecca\t1085\t61465-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1678-1.mp3\tLouis Prima New Orleans Gang\tWhat Will Santa Claus Say?\tVOCALION\t3376\tC1678-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64644-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWhat Would People Say\tDecca\t2227\t64644-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64644.mp3\tAndy Kirk & Clouds Of Joy\tWhat Would People Say?\tDECCA\t2277B\t64644\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403083-B.mp3\tFrankie Trumbauer & His Orch\tWhat Wouldn't I Do For That Man! (vsb)\tOKeh\t41330\t403083-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_014.mp3\tArthur Collins\tWhat You Goin' To Do When De Rent Comes 'round?\tCOLUMBIA\t3250\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU56756-1.mp3\tKing Oliver & His Orch\tWhat You Want Me To Do\tBLUEBIRD\t7242\t56756-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3l/COL81661-1.mp3\tPaul Specht And His Orchestra\tWhat'll I Do\tCOLUMBIA\t118D\t81661-1\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC29599-8.mp3\tPaul Whiteman And His Orch\tWhat'll I Do?\tVICTOR\t19299\t29599-8\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021142.mp3\tTommy Dorsey & His Orch\tWhat'll I Do?\tVICTOR\t25824\t021142\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_033.mp3\tHenry Burr And Marcia Freer\tWhat'll I Do?\tVICTOR\t19301\t29684\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_271.mp3\tKing Cole Trio\tWhat'll I Do?\tCAPITOL\t15019\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26417-A.mp3\tBenny Goodman & His Orch\tWhat'll They Think Of Next\tCOLUMBIA\t35374\t26417-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR540-Hy.mp3\tHarmonians\tWhat'll You Do\tHarmony\t540-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW145225-2.mp3\tLeo Reisman & His Orch\tWhat'll You Do?\tCOLUMBIA\t1212 D\tW145225-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/ARC14772-1.mp3\tOzzie Nelson And His Orch\tWhat's Good For The Goose\tARC\tVO2642\t14772-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74853.mp3\tLionel Hampton & His Orch\tWhat's Happening Baby\tDECCA\t24642\t74853\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec74853.mp3\tLionel Hampton And His Orchestra\tWhat's Happening, Baby\tDecca\t24642\t74853\t1949\tBenny Bailey-Duke Garrette-Wendell Culley-Leo Shepherd-Walter Wiliams-t, Lester Bass-Al Grey-Benny Powell-Jimmy Wormick-tb, Johnny Board-Bobby Plater-as, Gene MorrisJohnny Sparrow-Billy Williams-ts, Ben Kynard-bar, Doug Duke-p, Lionel Harnpton-vib-p,\nhttp://www.jazz-on-line.com/a/mp3c/VIC69448-1.mp3\tJimmie Rodgers\tWhat's It\tVICTOR\t23609\t69448-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62453-B.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWhat's Mine Is Yours\tDecca\t1827\t62453-B\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MonUS-1-1.mp3\tJess Stacy & His Stars\tWhat's New\tMontgomeryWard\t10089\tUS-1-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC261.mp3\tBilly Eckstine & His Octet\tWhat's New\tNATIONAL\t\tNSC261\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47354.mp3\tErroll Garner (piano)\tWhat's New\tCOLUMBIA\t39888\tCO47354\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038278.mp3\tCharlie Barnet & His Orch\tWhat's New (v L T)\tBLUEBIRD\t10361\t038278\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA1965.mp3\tBenny Goodman And His Orchestra\tWhat's New ?\tCOLUMBIA\t35211\tLA1965\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA1794.mp3\tBing Crosby - J.s.trotter\tWhat's New?\tDECCA\t2671A\tDLA1794\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_142.mp3\tBob Crosby And His Orchestra\tWhat's New?\tDecca\t2205\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_098.mp3\tBenny Goodman And His Orchestra Feat. Louise Tobin\tWhat's New?\tCOLUMBIA\t35211\tLA1965\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Par106736.mp3\tRose Henderson\tWhat's The Matter Now\tParamount\t7501\t106736\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/Dec69733-A.mp3\tSkeets Tolbert And His Gentlemen Of Swing\tWhat's The Matter Now\tDecca\t8631\t69733-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe74091-B.mp3\tClarence Williams Stompers\tWhat's The Matter Now?\tOKeh\t40598\t74091-B\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67122.mp3\tElla Fitzgerald & Her Orch\tWhat's The Matter With Me\tDECCA\t3005A\t67122\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26416-A.mp3\tBenny Goodman & His Orch\tWhat's The Matter With Me\tCOLUMBIA\t35374\t26416-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU046434.mp3\tGlenn Miller & His Orch\tWhat's The Matter With Me (vmh)\tBLUEBIRD\t10657 B\t046434\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_271.mp3\tBenny Goodman And His Orchestra Feat. V/helen Forrest\tWhat's The Matter With Me?\tCOLUMBIA\t35374\t26416-A\t1940\tZiggy Elman, Jimmy Maxwell, Johnny Martell (tp), Red Ballard, Vernon Brown, Ted Vesley (tb), Benny Goodman (cl), Toots Mondello, Buff Estes (as), Jerry Jerome, Bus Bassey (ts), Johnny Guarneri (p), Charlie Christian (elg), Artie Bernstein (sb), Nick Fatool (dm)\nhttp://www.jazz-on-line.com/a/mp3c/HITT488.mp3\tLouis Prima & His Orch\tWhat's The Matter, Marie? (v L P)\tHIT OF THE WEEK\t7124b\tT488\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88785-1.mp3\tFats Waller And His Rhythm\tWhat's The Reason\tVICTOR\t25027\t88785-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA92.mp3\tMills Brothers\tWhat's The Reason\tDECCA\t402A\tDLA92\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA101-B.mp3\tGuy Lombardo Royal Canadians\tWhat's The Reason\tDECCA\t393B\tDLA101-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88784-1.mp3\tFats Waller And His Rhythm\tWhat's The Reason (i'm Not Pleasin' You)\tVICTOR\t24889\t88784-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic88785-1.mp3\t\"fats\" Waller And His Rhythm\tWhat's The Reason (i'm Not Pleasin' You)\tVictor\t25027\t88785-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic88784-1.mp3\t\"fats\" Waller And His Rhythm\tWhat's The Reason (i'm Not Pleasin' You)\tVictor\t24889\t88784-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_273.mp3\tJimmy Dorsey And His Orchestra\tWhat's The Reason (i'm Not Pleasin' You)\tDECCA\t762A\tDLA321-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC17515.mp3\tMound City Blue Blowers\tWhat's The Reason, I'm Not Pleasin' You\tVOCALION\t2957\t17515\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVOC2957.mp3\tMound City Blue Blowers\tWhat's The Reason, I'm Not Pleasin' You\tVOCALION\t2957\t17515\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47690.mp3\tJohnnie Ray\tWhat's The Use\tCOLUMBIA\t39698\tCO47690\t\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1094.mp3\tPhil Spitalny's Music\tWhat's The Use\tHit-Of-The-Week\t1094\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COMP23236.mp3\tBud Freeman And His Gang\tWhat's The Use\tCOMMODORE\t507\tP23236\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC71126.mp3\tLouis Jordan And His Tympani 5\tWhat's The Use Of Getting Sober\tDECCA\t8645\t71126\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC63134-3.mp3\tKing Oliver & His Orchestra\tWhat's The Use Of Living Without Love?\tVICTOR\t23011\t63134-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3h/Ode404552-B.mp3\tYale Collegians\tWhat's The Use Of Living Without Love?\tOdeon\tONY-36162\t404552-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404268-D.mp3\tFrankie Trumbauer & His Orch\tWhat's The Use?\tOKeh\t41437\t404268-D\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC574446.mp3\tIsham Jones & His Orch\tWhat's The Use?\tBRUNSWICK\t4810\tC574446\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24083-1.mp3\tJimmie Lunceford And His Orchestra\tWhat's This Thing Called Swing\tOkeh\t4875\t24083-1\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1234-1.mp3\tGene Krupa & His Orch\tWhat's This?\tCOLUMBIA\t37870\tHCO1234-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29008-1.mp3\tCount Basie And His Orchestra\tWhat's Your Number?\tOkey\t5897\t29008-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21733-1.mp3\tFletcher Henderson And His Orchestra\tWhat's Your Story (what's Your Jive)\tVocallon\t3760\t21733-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/ColLA-2163-C.mp3\tJimmie Lunceford And His Orchestra\tWhat's Your Story Mornin' Glory\tColumbia\t35510\tLA-2163-C\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64699-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWhat's Your Story Morning Glory\tDecca\t3306\t64699-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64699-A.mp3\tAndy Kirk & His Clouds Of Joy\tWhat's Your Story, Morning Glory\tDECCA\t3306B\t64699-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU055504.mp3\tGlenn Miller & His Orch\tWhat's Your Story, Morning Glory (vtb)\tBLUEBIRD\t10832\t055504\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW140640-2.mp3\tFletcher Henderson's Orch\tWhat-cha-call-'em Blues\tCOLUMBIA\t395D\tW140640-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN8156-2.mp3\tJoe Candullo And His Orchestra\tWhat-cha-call-'em Blues\tBANNER\t7217\t8156-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu56484.mp3\tCharlie Barnet & His Orch\tWhatcha Know Joe?\tBluebird\t10918\t56484\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Col28005-A.mp3\tJimmie Lunceford And His Orchestra\tWhatcha Know Joe?\tColumbia\t35625\t28005-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_154.mp3\tCharlie Barnet And His Orchestra Feat. V/ford Leary And Three Moaxes\tWhatcha Know, Joe?\tBluebird\t10918\t56484\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_286.mp3\tXavier Cugat And His Waldorf-astoria Orchestra Feat. V/dinah Shore\tWhatever Happened To You\tVICTOR\t26665\t051570\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68229.mp3\tWoody Herman & His Orchestra\tWhatever Happened To You?\tDECCA\t3461B\t68229\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70595x.mp3\tSarah Vaughn\tWhatever Lola Wants\tMERCURY\t70595\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_090.mp3\tDinah Shore\tWhatever Lola Wants (lola Gets)\tRCA Victor\t6077\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_051.mp3\tSarah Vaughan O/hugo Peretti\tWhatever Lola Wants (lola Gets)\tMercury\t70595 A\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_021.mp3\tDoris Day\tWhatever Will Be, Will Be (que Sera, Sera)\tColumbia\t40704\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh137.mp3\tJack Jackson And His Orchestra\tWhats Good For The Goose Is Good For The Gander\tHMV\tB-6473\tOB-5933-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL958x.mp3\tCardinals\tWheel Of Fortune\tATLANTIC\t958\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1964y.mp3\tKay Starr\tWheel Of Fortune\tCAPITOL\t1964\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/MER4805-4.mp3\tBobby Wayne W Joe Reisman\tWheel Of Fortune\tMERCURY\t5779\t4805-4\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_002.mp3\tKay Starr\tWheel Of Fortune\tCapitol\t1964\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_077.mp3\tBell Sisters\tWheel Of Fortune\tRCA\t20-4520\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_101.mp3\tSunny Gale Feat. Eddie Wilcox Orchestra\tWheel Of Fortune\tDerby\t787\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC64380-4.mp3\tDuke Ellington & His Orch\tWhen A Black Man's Blue (v B. Payne)\tVICTOR\t22587B\t64380-4\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60824.mp3\tJimmie Davis\tWhen A Boy From The Mountains Weds A Girl\tDECCA\t5203\t60824\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC0798.mp3\tBenny Goodman And His Orchestra\tWhen A Lady Meets A Gentleman\tVICTOR\t25434\t0798\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_246.mp3\tBenny Goodman And His Orchestra\tWhen A Lady Meets A Gentleman Down South\tVICTOR\t25434\t0798\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC74811-1.mp3\tAllen Bros\tWhen A Man's Got A Woman\tVICTOR\t23773\t74811-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic23773w.mp3\tAllen Brothers\tWhen A Man's Got A Woman\tVictor\t23773\t\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU31963.mp3\tRoger Wolfe Kahn And His Orch\tWhen A Woman Loves A Man\tBRUNSWICK\t4699\t31963\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COL22284-2.mp3\tBillie Holiday\tWhen A Woman Loves A Man\tCOLUMBIA\t37494\t22284-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC21983-5.mp3\tMarion Harris\tWhen Alexander Takes His Ragtime Band To Dixieland\tVICTOR\t18486\t21983-5\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_043.mp3\tMarion Harris\tWhen Alexander Takes His Ragtime Band To France\tVICTOR\t18486\t21983-5\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_233.mp3\tSomethin' Smith And The Redheads\tWhen All The Streets Are Dark\tEpic\t9119\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic18476.mp3\tSix Brown Brothers\tWhen Aunt Dinah's Daughter Hannah Bangs On That Piano\tVictor\t18476\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3b/MGM49S388.mp3\tSlim Gaillard\tWhen Banana Skins Are Falling (i'll Come Sliding B\tMGM\t10938A\t49S388\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC25674-2.mp3\tPaul Whiteman & His Orch\tWhen Buddha Smiles\tVICTOR\t18839B\t25674-2\t1921\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC51811-4.mp3\tBilly Hays And His Orch\tWhen Carolina Smiles\tVICTOR\t40103\t51811-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO3514.mp3\tRaymond Scott And His New Orch\tWhen Cootie Left The Duke\tCOLUMBIA\t35940\tCCO3514\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU046156-1.mp3\tColeman Hawkins\tWhen Day Is Done\tBLUEBIRD\t10693\t046156-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35828x.mp3\tPaul Whiteman's Concert Orch\tWhen Day Is Done\tVICTOR\t35828\t35828x\t\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18093-1.mp3\tMildred Bailey\tWhen Day Is Done\tARC\tVO3057\t18093-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2314.mp3\tBing Crosby & Victor Young\tWhen Day Is Done\tDECCA\t3614B\tDLA2314\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19799.mp3\tCarter's Orch\tWhen Day Is Done\tBRUNSWICK\t7786\t19799\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/CONS3285.mp3\tCozy Cole & His Orchestra\tWhen Day Is Done\tCONTIN\tT6014\tS3285\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/COM1523a.mp3\tBobby Hackett\tWhen Day Is Done\tCOMMODORE\t1523\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/HMWOLA-1711-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tWhen Day Is Done\tHMW\tB-8669\tOLA-1711-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2314.mp3\tBing Crosby & Victor Young\tWhen Day Is Done\tDECCA\t91290\tDLA2314\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75842.mp3\tBuddy Johnson And His Orch.\tWhen Day Is Done\tDECCA\t24920\t75842\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_086.mp3\tNat Shilkret And The Victor Orchestra\tWhen Day Is Done\tVictor\t20456\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480926.mp3\tAndre Kostelanetz And His Orchestra\tWhen Day Is Done\tCOLUMBIA\t7431-M\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC100766.mp3\tGuy Lombardo Royal Canadians\tWhen Did You Leave Heaven\tVICTOR\t25357\t100766\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC19659-1.mp3\tHenry Allen & His Orch\tWhen Did You Leave Heaven\tARC\tVO3302\t19659-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102410.mp3\tCharlie Barnet & His Orchestra\tWhen Did You Leave Heaven\tBLUEBIRD\t6488B\t102410\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25357.mp3\tGuy Lombardo & His Royal Canadians\tWhen Did You Leave Heaven\tVictor\t25357\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_226.mp3\tHenry Allen And His Orchestra\tWhen Did You Leave Heaven\tVOCALION\t3302\t19659-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh178.mp3\tCarroll Gibbons And The Savoy Hotel Orpheans\tWhen Did You Leave Heaven\tColumbia\tFB-1530\tCA-15972-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_087.mp3\tBen Bernie And His Orchestra\tWhen Did You Leave Heaven?\tDecca\t878\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-3270-A.mp3\tHorace Henderson And His Orchestra\tWhen Dreams Come True\tOKEH\t5748\tWC-3270-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC1245.mp3\tJohnny Dodds Black Bottom St.\tWhen Erastus Plays His Old Kazoo\tBRUNSWICK\t3997\tC1245\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27407.mp3\tBilly Williams\tWhen Father Papered The Parlor\tCOLUMBIA\tA-1691\t27407\t1909?\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC25519.mp3\tAda Jones\tWhen Frances Dances With Me\tVICTOR\t18830\t25519\t1921\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4696.mp3\tMolly O'day\tWhen God Comes To Gather His Jewels\tCOLUMBIA\t37981\tCCO4696\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC27154-1.mp3\tPaul Whiteman & His Orch\tWhen Hearts Are Young\tVICTOR\t18985\t27154-1\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA270-A.mp3\tCleo Brown\tWhen Hollywood Goes Black And Tan\tDECCA\t632B\tDLA270-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COL195052.mp3\tBen Selvin & His Orch\tWhen I Am Housekeeping For You\tCOLUMBIA\t\t195052\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70471.mp3\tElla Fitzgerald & Four Keys\tWhen I Come Back Crying\tDECCA\t4315B\t70471\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_307.mp3\tBob Eberly Feat. O/les Baxter\tWhen I Dream\tCapitol\t2239\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_026.mp3\tWalter Van Brunt\tWhen I Dream In The Gloaming Of You\tVICTOR\t16363\tB8118-2\t1909\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44119.mp3\tEarl Hines\tWhen I Dream Of You\tCOLUMBIA\t39261\tCO44119\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_172.mp3\tDoris Day Feat. Percy Faith's Orchestra\tWhen I Fall In Love\tCOLUMBIA\t39693\tHCO10118\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70009WI.mp3\tHarry Lauder\tWhen I Get Back To Bonnie Scotland\tVICTOR\t70009\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC16897-2.mp3\tBilly Murray\tWhen I Get Back To The U.s.a\tVICTOR\t17930\t16897-2\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61002.mp3\tChick Webb & His Orchestra\tWhen I Get Low I Get High\tDECCA\t1123\t61002\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU049983-1.mp3\tWingy Manone & His Orch\tWhen I Get You Alone Tonight\tBLUEBIRD\t10909\t049983-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC024493.mp3\tBenny Goodman And His Orchestra\tWhen I Go A-dreamin'\tVICTOR\t26021\t024493\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_195.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tWhen I Go A-dreamin'\tVICTOR\t26021\t024493\t1938\tHarry James, Ziggy Elman, Gordon Griffin (tp), Red Ballard, Vernon Brown (tb), Benny Goodman (cl), Dave Matthews, Noni Bernardi (as), Bud Freeman (ts), Jess Stacy (p), Ben Heller (g), Harry Goodman (sb), Dave Tough (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1935_117.mp3\tNelson Eddy Feat. D/nat Shilkret\tWhen I Grow Too Old To Dream\tVictor\t4285\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480652.mp3\tNat King Cole\tWhen I Grow Too Old To Dream\tCapitol\tEAP1/EBF1/W-782\t\t1956\tNat King Cole, P & Vocal, John Collins, G, Stuff Smith, V, Charlie Harris, B, Lee Young, D\nhttp://www.jazz-on-line.com/a/mp3w/1935_003.mp3\tGlen Gray And Casa Loma Orchestra\tWhen I Grow Too Old To Dream\tDECCA\t349A\t39234-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC39234-A.mp3\tGlen Gray Casa Loma Orch\tWhen I Grow Too Old To Dream (v K. Sargent)\tDECCA\t349A\t39234-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1253.mp3\tArnett Cobb & His Orchestra\tWhen I Grow Too Old To Dream Part 1\tAPOLLO\t775\tR1253\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/APOR1254.mp3\tArnett Cobb & His Orchestra\tWhen I Grow Too Old To Dream Part 2\tAPOLLO\t775\tR1254\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_099.mp3\tSam Ash\tWhen I Leave The World Behind\tCOLUMBIA\t1772\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_047.mp3\tHenry Burr\tWhen I Leave The World Behind\tVICTOR\t17874B\t16586-1\t1915\t\nhttp://www.jazz-on-line.com/a/mp3r/RiRom445.mp3\tClyde Doerr & His Orchestra\tWhen I Look At You\tRomeo\t445\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC12787-2.mp3\tHenry Burr\tWhen I Lost You\tVICTOR\t17275\t12787-2\t1913\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2060.mp3\tBing Crosby Paradise Isle Trio\tWhen I Lost You\tDECCA\t3477A\tDLA2060\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0606_03.mp3\tLee Morse And Her Bluegrass Boys\tWhen I Lost You\tColumbia\t1434DA\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_002.mp3\tHenry Burr\tWhen I Lost You\tVICTOR\t17275\t12787-2\t1913\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1938_0302_01.mp3\tLee Morse And Her Bluegrass Boys\tWhen I Lost You\tDecca\t1919A\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480927.mp3\tCarmen Miranda And The Bando Da Lua\tWhen I Love, I Love !\tDECCA\t23240-A\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D351B1a.mp3\tBilly Williams\tWhen I Marry I'll Marry For Love\tV-DISC\t351B1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68319-A.mp3\tAndy Kirk & Clouds Of Joy\tWhen I Saw You (ev'rything Happened)\tDECCA\t3491A\t68319-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE36492.mp3\tBoswell Sisters\tWhen I Take My Sugar To Tea\tBRUNSWICK\t6083\tE36492\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_074.mp3\tBoswell Sisters Feat. Dorsey Brothers Orchestra\tWhen I Take My Sugar To Tea\tBRUNSWICK\t6083\tE36492\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1147-D23.mp3\tHarry Reser's Radio Band\tWhen I Take My Sugar To Tea (vfl)\tHIT OF THE WEEK\t1147\t1147-D23\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_046.mp3\tHelen Clark\tWhen I Waltz With You\tVICTOR\t17298B\t12905-4\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_017.mp3\tHarry Macdonough And American Quartet\tWhen I Was Twenty-one And You Were Sweet Sixteen\tVictor\t17057\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_007.mp3\tHenry Burr And Albert Campbell\tWhen I Was Twenty-one And You Were Sweet Sixteen\tColumbia\t1138\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62443-A.mp3\tLil Armstrong And Her Swing Band\tWhen I Went Back Home\tDecca\t1388\t62443-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74076.mp3\tBob Eberly / Eddie Heywood Or.\tWhen I Write My Song\tDECCA\t24195\t74076\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC62924-2.mp3\tBennie Moten Kansas City Orch\tWhen I'm Alone\tVICTOR\t22734\t62924-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic57929-2.mp3\tFats Waller And His Buddies\tWhen I'm Alone\tVictor\tV-38110\t57929-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe7200-A.mp3\tPeerless Qt\tWhen I'm Gone You'll Soon Forget\tOKeh\t4143\t7200-A\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_108.mp3\tPeerless Quartet (voc Henry Burr)\tWhen I'm Gone You'll Soon Forget\tVictor\t18609\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/CHA15930-B.mp3\tSam Lanin And His Orch\tWhen I'm Looking At You\tChampion\t15930-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU19245-1.mp3\tHal Kemp And His Orch\tWhen I'm With You\tBRUNSWICK\t7681\t19245-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU101648.mp3\tCharlie Barnet & His Orchestra\tWhen I'm With You\tBLUEBIRD\t6433\t101648\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW145018-3.mp3\tOscar Celestin Tuxedo Orch\tWhen I'm With You\tCOLUMBIA\t14323 D\tW145018-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COL01310.mp3\tCharles Olcott\tWhen Irish Eyes Are Smiling\tCOLUMBIA\t1310\t01310\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4168.mp3\tBing Crosby\tWhen Irish Eyes Are Smiling\tDECCA\t23788\tL4168\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_050.mp3\tJohn Mccormack\tWhen Irish Eyes Are Smiling\tVICTOR\t64631\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/VarM-547-1.mp3\tLucky Millinder With Mills Blue Rhythm Band\tWhen Irish Eyes Are Smiling\tVariety\t624\tM-547-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_026.mp3\tHarry Macdonough\tWhen Irish Eyes Art Smiling\tVictor\t17057\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20096-1.mp3\tRed Norvo's Orch\tWhen Is A Kiss Not A Kiss (v Lou Hurst)\tBRUNSWICK\t7761\t20096-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_097.mp3\tEddie Cantor\tWhen It Comes To Lovin' The Girls, I'm Way Ahead Of The Times\tEMERSON\t10105\t04759-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3b/EME04759-3.mp3\tEddie Cantor\tWhen It Comes To Loving The Girls\tEMERSON\t10105\t04759-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_095.mp3\tHarry Macdonough And Marguerite Dunlap\tWhen It's Apple Blossom Time In Normandy\tVictor\t17445\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC92035.mp3\tRice Brothers Gang\tWhen It's Blossom Time In Old Kentucky\tDECCA\t5852\tC92035\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM49S3121.mp3\tBob Wills Texas Playboys\tWhen It's Christmas On The Range\tMGM\t10512\t49S3121\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC075520.mp3\tAlvino Rey And His Orch\tWhen It's Moonlight On The Blue Pacific\tVICTOR\t27948\t075520\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_058.mp3\tHaydn Quartet\tWhen It's Moonlight On The Prairie\tVictor\t5448\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA380-A.mp3\tJimmie Davis\tWhen It's Peach Pickin' Time In Georgia\tDECCA\t5270\tDLA380-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_059.mp3\tHenry Burr And Albert Campbell\tWhen It's Peach Picking Time In Delaware\tVictor\t17837\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC09577-2.mp3\tBenny Goodman And His Orchestra\tWhen It's Sleepy Time Down South\tVICTOR\t25634\t09577-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4590.mp3\tFrankie Laine\tWhen It's Sleepy Time Down South\tCOLUMBIA\t39600\tHCO4590\t1951\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC93787.mp3\tLouis Armstrong And His Orch.\tWhen It's Sleepy Time Down South\tDECCA\t60514\tC93787\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOke41504.mp3\tLouis Armstrong\tWhen It's Sleepy Time Down South\tOkeh\t41504\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_154.mp3\tLouis Armstrong Feat. Gordon Jerkins Orchestra\tWhen It's Sleepy Time Down South\tDECCA\t27899\tL6551\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC70611-1.mp3\tPaul Whiteman And His Orch\tWhen It's Sleepy Time Down South (vmb-trio)\tVICTOR\t22828A\t70611-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BruC-79I6-A.mp3\tJimmie Noone And His Orchestra\tWhen It's Sleepy Time Down South ? V A J\tBrunswick\t6174\tC-79I6-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COL41308x.mp3\tJohnny Horton\tWhen It's Springtime In Alaska\tCOLUMBIA\t41308\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150430.mp3\tBen Selvin And His Orch\tWhen It's Springtime In The Rockies\tCOLUMBIA\t2206\tW150430\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC58599-2.mp3\tHilo Hawaiian Orch.\tWhen It's Springtime In The Rockies\tVICTOR\t22339\t58599-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66321.mp3\tTexas Wanderers (c.bruner)\tWhen It's Your Time Of Day\tDECCA\t5730\t66321\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071864.mp3\tGlenn Miller & His Orch\tWhen Johnny Comes Marching Home\tBLUEBIRD\t11480 B\t071864\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44021.mp3\tErroll Garner Trio\tWhen Johnny Comes Marching Home\tCOLUMBIA\t39165\tCO44021\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU071864.mp3\tGlenn Miller & His Orch\tWhen Johnny Comes Marching Home (vtb-mh-mod)\tBLUEBIRD\t11480\t071864\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiPat021027.mp3\tLanin's Arcadians\tWhen June Comes Along With A Song\tPath\t021027\t\t1922\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU10927.mp3\tGene Rodemich And His Orchestra\tWhen June Comes Along With A Song\tBRUNSWICK\t2455A\t10927\t1923\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3c/VIC42932-4.mp3\tBennie Moten's Kansas City Or.\tWhen Life Seems So Blue\tVICTOR\t38132\t42932-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC041406.mp3\tLionel Hampton And His Orch\tWhen Lights Are Low\tVICTOR\t26371\t041406\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC28874-3.mp3\tBenson Orchestra Of Chicago\tWhen Lights Are Low\tVICTOR\t19198\t28874-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/ColWM-1069-1.mp3\tBenny Carter And His Orchestra\tWhen Lights Are Low\tColumbia\tCL-2162\tWM-1069-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_031.mp3\tBenson Orchestra Of Chicago\tWhen Lights Are Low\tVICTOR\t19198\t28874-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic041406-1.mp3\tLionel Hampton And His Orchestra\tWhen Lights Are Low\tVictor\t26371\t041406-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/HMVOCS-451-2.mp3\tBenny Carter With Kai Ewans' Orchestra\tWhen Lights Are Low\tHMV\t4699\tOCS-451-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-121-1.mp3\tBenny Carter And His Swing Quartet\tWhen Lights Are Low\tVocalion\tS-16\tS-121-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu43370.mp3\tArtie Shaw And His Orchestra\tWhen Love Beckoned\tBluebird\t10509\t043370-1\t1939\tVocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3b/Blu043370-1.mp3\tArtie Shaw And His Orchestra\tWhen Love Beckoned - V H F\tBluebird\tB-10509\t043370-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04952.mp3\tFats Waller And His Rhythm\tWhen Love Is Young\tVICTOR\t25537\t04952\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1288.mp3\tBing Crosby & E.dunstedter\tWhen Mother Nature Sings Her Lullaby\tDECCA\t1874B\tDLA1288\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP680.mp3\tCootie Williams & His Orch\tWhen My Baby Left Me\tCAPITOL\t\t680\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78925-2.mp3\tTed Lewis And His Band\tWhen My Baby Smiles At Me\tCOLUMBIA\tA-2908\t78925-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3e/COL-39307.mp3\tBenny Goodman\tWhen My Baby Smiles At Me\tCOLUMBIA\t39307\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/EDI7150A.mp3\tRachel Grant And Billy Murray\tWhen My Baby Smiles At Me\tEDISON\t50651\t7150A\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-2908.mp3\tTed Lewis & His Band\tWhen My Baby Smiles At Me\tCOLUMBIA\tA-2908\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480635.mp3\tBenny Goodman & Company\tWhen My Baby Smiles At Me\tColumbia\tSL160\t\t1938\tCarnegie Hall Concert:<br>Gordon Griffin (tp), Vernon Brown (tb), Benny Goodman (cl), Jess Stacy (p), Gene Krupa (dm)\nhttp://www.jazz-on-line.com/a/mp3a/OKEDAL1265.mp3\tWiley Walker And Gene Sullivan\tWhen My Blue Moon Turns To Gold Again\tOKEH\t6374\tDAL1265\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_153.mp3\tElvis Presley\tWhen My Blue Moon Turns To Gold Again\tRCA\tEPA-992\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC0703-1.mp3\tGuy Lombardo Royal Canadians\tWhen My Dream Boat Comes Home\tVICTOR\t25435B\t0703-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_163.mp3\tHenry Allen And His Orchestra\tWhen My Dream Boat Comes Home\tVOCALION\t3389\t20270-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_167.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. V/bob Goday\tWhen My Dream Boat Comes Home\tBluebird\t6661\t3007\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/DECLA1095.mp3\tBob Crosby And His Bobcats\tWhen My Dreamboat Comes Home\tDECCA\t1615\tLA1095\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_105.mp3\tFats Domino\tWhen My Dreamboat Comes Home\tImperial\t5396\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW148407.mp3\tPaul Whiteman & His Orch\tWhen My Dreams Come True\tCOLUMBIA\t1822 D\tW148407\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC71273.mp3\tBuddy Johnson And His Band\tWhen My Man Comes Home\tDECCA\t8655\t71273\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BANLA206-C.mp3\tEddie Cantor\tWhen My Ship Comes In\tBANNER\t33217\tLA206-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16076.mp3\tEddy Cantor W Anson Weeks\tWhen My Ship Comes In\tARC\t\t16076\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/PATCPT-1704-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tWhen My Ship Comes In\tPath\tPA-466\tCPT-1704-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_036.mp3\tHenry Burr And Albert Campbell\tWhen My Ship Comes In\tVictor\t17732\t15624-3\t1915\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC31792-1.mp3\tGene Austin\tWhen My Sugar Walks Down The Street\tVICTOR\t19585\t31792-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM835-2.mp3\tDuke Ellington's Famous Orch\tWhen My Sugar Walks Down The Street\tBRUNSWICK\t8168\tM835-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA2609.mp3\tElla Fitzgerald & Her Orch\tWhen My Sugar Walks Down The Street\tDECCA\t18587B\tDLA2609\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC74919.mp3\tSy Oliver & His Orch\tWhen My Sugar Walks Down The Street\tDECCA\t24662\t74919\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/GENG09218-B.mp3\tWolverines Orch\tWhen My Sugar Walks Down The Street\tGENNETT\t5620\tG09218-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru2829.mp3\tThe Radio Franks\tWhen My Sugar Walks Down The Street\tBrunswick\t2829\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_162.mp3\tWarner's Seven Aces\tWhen My Sugar Walks Down The Street\tCOLUMBIA\t305D\t140286-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_023.mp3\tGene Austin And Aileen Stanley Feat. Nat Shilkret And His Orchestra\tWhen My Sugar Walks Down The Street\tVICTOR\t19585\t31792-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_219.mp3\tElla Fitzgerald\tWhen My Sugar Walks Down The Street\tDECCA\t18587B\tDLA2609\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS7795-3.mp3\tStuff Smith & His Orch\tWhen Paw Was Courtin' Maw\tVARSITY\t8063\tUS7795-3\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/BRUE27908.mp3\tBen Bernie & His Orch\tWhen Polly Walks Through The Hollyhocks (vsl)\tBRUNSWICK\t4020\tE27908\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC026870.mp3\tBunny Berigan & His Orch\tWhen Prince Of A Fellow Meets Cinderella\tVICTOR\t26055B\t026870\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_011.mp3\tS. H. Dudley\tWhen Reuben Comes To Town\tGram-o-Phone\t519\t\t1901\t\nhttp://www.jazz-on-line.com/a/mp3b/DECDLA-540-A.mp3\tLouis Armstrong With Jimmy Dorsey And His Orchestra\tWhen Ruben Swings The Cuban\tDECCA\t1049A\tDLA-540-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_035.mp3\tJohn Mccormack\tWhen Shadows Gather\tVictor\t64127\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98172.mp3\tFats Waller And His Rhythm\tWhen Somebody Thinks You're Wonderful\tVICTOR\t25222\t98172\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/GENX0054.mp3\tFletcher Henderson\tWhen Spring Comes Peeping Through\tGENNETT\t3285\tX0054\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/GenX-54-A.mp3\tFletcher Henderson And His Orchestra\tWhen Spring Comes Peeping Through\tGennett\t3285\tX-54-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR768-Hy.mp3\tLou Gold And His Orch\tWhen Summer Is Gone\tHarmony\t768-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_231.mp3\tNat Shilkret And The Victor Orchestra\tWhen Summer Is Gone\tVICTOR\t21847A\t49630-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC49630-2.mp3\tNat Shilkret & Victor Orch\tWhen Summer Is Gone (v F M)\tVICTOR\t21847A\t49630-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_070.mp3\tHarry Macdonough And John Bieling\tWhen Sweet Marie Was Sweet Sixteen\tVICTOR\t5505\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC45648-1.mp3\tNat Shilkret & Victor Orch\tWhen Sweet Susie Goes Stepping By\tVICTOR\t21515\t45648-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/BAN8157-1.mp3\tJoe Candullo And His Orchestra\tWhen Sweet Susie Goes Stepping By\tBANNER\t7218\t8157-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68712.mp3\tMildred Bailey\tWhen That Man Is Dead And Gone\tDECCA\t3661A\t68712\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU060911.mp3\tGlenn Miller & His Orch\tWhen That Man Is Dead And Gone (vtb)\tBLUEBIRD\t11069\t060911\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1636.mp3\tBing Crosby & Foursome\tWhen The Bloom Is On The Sage\tDECCA\t2237A\tDLA1636\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU69432-2.mp3\tJimmie Rodgers\tWhen The Cactus Is In Bloom\tBLUEBIRD\t5163\t69432-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC84694.mp3\tElla Fitzgerald\tWhen The Hands Of The Clock Pray At Midnight\tDECCA\t28762\t84694\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_024.mp3\tHarry Macdonough\tWhen The Harvest Days Are Over\tVICTOR\t16219\tB6766-2\t1901\t\nhttp://www.jazz-on-line.com/a/mp3w/1902_027alt.mp3\tByron G. Harlan\tWhen The Harvest Days Are Over\tCOLUMBIA\t31521\t\t1902\t\nhttp://www.jazz-on-line.com/a/mp3a/VICV-40051-B.mp3\tMissouri Pacific Lines Booster\tWhen The Home Gates Swing O\tVictor\t40051-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/OKeS71532.mp3\tThomas Morris\tWhen The Jazz Band Starts To Play\tOKeh\t4867\tS71532\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC71245.mp3\tLucky Millinder And His Orch\tWhen The Lights Go On Again\tDECCA\t18496A\t71245\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC075421-1.mp3\tVaughn Monroe And His Orch\tWhen The Lights Go On Again\tVICTOR\t27945\t075421-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27945.mp3\tVaughn Monroe & His Orchestra\tWhen The Lights Go On Again\tVictor\t27945\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71245-A.mp3\tLucky Millinder And His Orchestra\tWhen The Lights Go On Again (all Over The World)\tDecca\t18496\t71245-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULAE688.mp3\tAl Jolson\tWhen The Little Red Roses Get The Blues For You\tBRUNSWICK\t4722\tLAE688\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/ODE403955-B.mp3\tCasa Loma Orchestra\tWhen The Little Red Roses Get The Blues For You\tODEON\tONY-3607\t403955-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4609.mp3\tAndrews Sisters - Vic Schoen\tWhen The Midnight Choo Choo Leaves For Alabam\tDECCA\t24425\tL4609\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC12566-1.mp3\tArthur Collins-byron Harlan\tWhen The Midnight Choo Choo Leaves For Alabam\tVICTOR\t17246\t12566-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021144.mp3\tTommy Dorsey & His Clambake 7\tWhen The Midnight Choo Choo Leaves For Alabam\tVICTOR\t25821\t021144\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_006.mp3\tArthur Collins And Byron Harlan\tWhen The Midnight Choo Choo Leaves For Alabam'\tCOLUMBIA\t1246\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_051alt.mp3\tHarry Anthony And James F. Harrison\tWhen The Mists Have Rolled Away\tEDISON\t9105\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2031-A.mp3\tBing Crosby\tWhen The Moon Comes Over Madison Square\tDECCA\t3300B\tDLA2031-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_340.mp3\tBing Crosby\tWhen The Moon Comes Over Madison Square\tDECCA\t3300B\tDLA2031-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151736-1.mp3\tKate Smith\tWhen The Moon Comes Over The Mountain\tCOLUMBIA\t2516 D\tW151736-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC69990-1.mp3\tLeo Reisman & His Orch\tWhen The Moon Comes Over The Mountain\tVICTOR\t22746\t69990-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3l/COLW144017.mp3\tLeo Reisman & His Orch\tWhen The Moon Comes Peeping Thru\tCOLUMBIA\t1416 D\tW144017\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN9240-3.mp3\tDubin's Dandies (a.schubert)\tWhen The Moon Shines Down On Sunshine And Me\tBANNER\t570\t9240-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20981-A.mp3\tJacques Renard And His Cocoanut G\tWhen The Morning Glories Wa\tVictor\t20981-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC518-1.mp3\tHal Kemp And His Orch\tWhen The Morning Rolls Around\tBRUNSWICK\t6492\tC518-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COL130979.mp3\tHenry Hall And The Bbc Orch\tWhen The Morning Rolls Around\tCOLUMBIA\t2743 D\t130979\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC31548-4.mp3\tPaul Whiteman & His Orch\tWhen The One You Love, Loves You\tVICTOR\t19553\t31548-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA1052-A.mp3\tBing Crosby And Eddie Dunstedter\tWhen The Organ Played 'o Promise Me'\tDecca\t1565  \tDLA1052-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1105.mp3\tFio-rito's Music\tWhen The Organ Played At Tw\tHit-Of-The-Week\t1105\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_0926_01.mp3\tLee Morse And Her Bluegrass Boys\tWhen The Organ Played At Twilight\tColumbia\t2308DA\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1052-A.mp3\tBing Crosby & E. Dunstedter\tWhen The Organ Played Oh Promise Me\tDECCA\t1554\tDLA1052-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_249.mp3\tGeorge Hall And His Orchestra\tWhen The Poppies Bloom Again\tBluebird\t6801A\t4538\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC055196.mp3\tArtie Shaw And His Gramercy Five\tWhen The Quail Come Back To San Quentin\tVICTOR\t27289\t055196-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE30918.mp3\tBob Haring And His Orch\tWhen The Real Thing Comes Your Way\tBRUNSWICK\t4545\tE30918\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC91695.mp3\tBob Crosby & His Orch\tWhen The Red Red Robin Comes\tDECCA\t2537A\tC91695\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU19419-9.mp3\tAl Jolson W Carl Fenton Orch\tWhen The Red Red Robin Comes Bob Bob Bobbing Along\tBRUNSWICK\t3222\t19419-9\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_157.mp3\tIpana Troubadors\tWhen The Red Red Robin Comes Bob-bob-bobbin' Along\tColumbia\t662\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_394.mp3\tDoris Day Feat. O/paul Weston\tWhen The Red Red Robin Comes Bob-bob-bobbin' Along\tCOLUMBIA\t39970\tHCO10431\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC35350-3.mp3\tJack Smith\tWhen The Red, Red Robin Comes Bob Bob Bobbin'\tVICTOR\t20069B\t35350-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36091-4.mp3\tPaul Whiteman & His Orch\tWhen The Red, Red Robin Comes Bob Bob Bobbin'\tVICTOR\t20177B\t36091-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/COL236004-1.mp3\tJerry Fenwyck Orch (selvin)\tWhen The Rest Of The Crowd Goes Home\tCOLUMBIA\tHA6500H\t236004-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151873.mp3\tBen Selvin & His Orch\tWhen The Rest Of The Crowd Goes Home\tCOLUMBIA\t2566 D\tW151873\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_062.mp3\tHaydn Quartet\tWhen The Roll Is Called Up Yonder\tVictor\t4689\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe32242-2.mp3\tBenny Goodman And His Orchestra\tWhen The Roses Bloom Again\tOkeh\t6580\t32242-2\t1942\tvocal chorus by Art London\nhttp://www.jazz-on-line.com/a/mp3c/BLU068790.mp3\tGlenn Miller & His Orch\tWhen The Roses Bloom Again\tBLUEBIRD\t11438-A\t068790\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_273.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tWhen The Roses Bloom Again\tDECCA\t4165A\t70154\t1942\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17431H.mp3\tThe Dutch Swing College Band\tWhen The Saint's Go Marching In Part 1\tPhilips\tP17431H\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/PhiP17431H-.mp3\tThe Dutch Swing College Band\tWhen The Saint's Go Marching In Part 2\tPhilips\tP17431H\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/MEM4y.mp3\tSouthern Jazz Group\tWhen The Saints Go Marching\tMemphis\t4\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW144282-2.mp3\tBarbeque Bob (r.hicks)\tWhen The Saints Go Marching In\tCOLUMBIA\t14231 D\tW144282-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO41619.mp3\tChuck Wagon Gang\tWhen The Saints Go Marching In\tCOLUMBIA\t20630\tCO41619\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63778.mp3\tLouis Armstrong And His Orch.\tWhen The Saints Go Marching In\tDECCA\t2230B\t63778\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_152.mp3\tLouis Armstrong\tWhen The Saints Go Marching In\tDECCA\t2230B\t63778\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_294.mp3\tPercy Faith And His Orchestra\tWhen The Saints Go Marching In\tCOLUMBIA\t39528\tCO47003\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU050617.mp3\tCharlie Barnet & His Orch\tWhen The Spirit Moves Me\tBLUEBIRD\t10734\t050617\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU85496.mp3\tLeroy Carr\tWhen The Sun Goes Down\tBLUEBIRD\t5877\t85496\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64957-B.mp3\tCount Basie And His Orchestra\tWhen The Sun Goes Down\tDecca\t2498\t64957-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64957-B.mp3\tCount Basie\tWhen The Sun Goes Down\tDecca\t2498\t64957-B  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC19501-2.mp3\tPeerless Qt\tWhen The Sun Goes Down In Dixie\tVICTOR\t18272\t19501-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_083.mp3\tPeerless Quartet\tWhen The Sun Goes Down In Dixie (and The Moon Begins To Rise)\tVictor\t18272\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC63265.mp3\tSidney Bechet And Noble Sissle\tWhen The Sun Sets Down South\tDECCA\t2129A\t63265\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU053130.mp3\tGlenn Miller & His Orch\tWhen The Swallows Come Back To Capistrano\tBLUEBIRD\t10776\t053130\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL27325-A.mp3\tGene Krupa & His Orch\tWhen The Swallows Come Back To Capistrano\tCOLUMBIA\t35520\t27325-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67718.mp3\tInk Spots\tWhen The Swallows Come Back To Capistrano\tDECCA\t3195A\t67718\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC3195A.mp3\tInk Spots\tWhen The Swallows Come Back To Capistrano\tDECCA\t3195A\t67718\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU10776.mp3\tGlenn Miller & His Orchestra\tWhen The Swallows Come Back To Capistrano\tBLUEBIRD\t10776\t053130\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_033.mp3\tInk Spots\tWhen The Swallows Come Back To Capistrano\tDECCA\t3195A\t67718\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/ClaLR-3007.mp3\tA Tribute To Jimmie Lunceford\tWhen The Swallows Come Back To Capistrano, Part 1\tClass\t504\tLR-3007\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/ClaLR-3008.mp3\tA Tribute To Jimmie Lunceford\tWhen The Swallows Come Back To Capistrano, Part 2\tClass\t504\tLR-3008\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_405.mp3\tGogi Grant\tWhen The Tide Is High\tEra\t1019\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP4103-2.mp3\tBlue Lu Barker\tWhen The Wagon Comes\tCAPITOL\t\t4103-2\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_283.mp3\tFlorian Zabach\tWhen The White Lilacs Bloom Again\tMercury\t70936\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_327.mp3\tLeroy Holmes And His Orchestra\tWhen The White Lilacs Bloom Again\tMGM\t12317\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_090.mp3\tHelmut Zacharias\tWhen The White Lilacs Bloom Again\tDecca\t30039\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_370.mp3\tLawrence Welk And His Sparkling Strings\tWhen The White Lilacs Bloom Again\tCoral\t61701\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_138.mp3\tBilly Vaughn And His Orchestra\tWhen The White Lilacs Bloom Again\tDot\t15491\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_241.mp3\tFreddy Martin And His Orchestra\tWhen There's A Breeze On Lake Louise\tBluebird\t11437\t072003\t1942\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D174B.mp3\tFreddy Martin And His Orchestra\tWhen They Ask About You\tV-DISC\t174B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_035.mp3\tJimmy Dorsey And His Orchestra Feat. Kitty Kallen\tWhen They Ask About You\tDECCA\t18582A\tL3249\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC59735-2.mp3\tBillie Young\tWhen They Get Lovin' They's Gone\tVICTOR\t23339\t59735-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/CON22986.mp3\tSammy Kaye Swing & Sway Orch\tWhen They Played The Polka (vo)\tCONQUEROR\t9048\t22986\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU14751-A.mp3\tFreddy Martin & His Orch\tWhen Tomorrow Comes\tBRUNSWICK\t6760\t14751-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru6760.mp3\tFreddy Martin & His Orchestra\tWhen Tomorrow Comes\tBrunswick\t6760\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_219.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. V/bob Goday\tWhen Two Love Each Other\tBluebird\t6931\t7828\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_016.mp3\tArthur Collins\tWhen Uncle Joe Plays A Rag On His Old Banjo\tVICTOR\t17118\t12066-2\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_124.mp3\tArthur Collins And Byron Harlan\tWhen Uncle Joe Steps Into France\tVictor\t18492\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_134.mp3\tSterling Trio\tWhen We Meet In The Sweet Bye And Bye\tVICTOR\t18484\t21968-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC71228-1.mp3\tVictor Arden And Phil Ohman\tWhen We're Alone\tVICTOR\t22910\t71228-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152069-3.mp3\tBen Selvin & His Orch\tWhen We're Alone\tCOLUMBIA\t2596 D\tW152069-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152123.mp3\tRuth Etting\tWhen We're Alone\tCOLUMBIA\t2630\tW152123\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_091.mp3\tRuth Etting\tWhen We're Alone\tColumbia\t2630\tW152123\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_029.mp3\tArden-ohman Orchestra Feat. Frank Luther\tWhen We're Alone (penthouse Serenade)\tVICTOR\t22910\t71228-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3h/Bru8-22084-2.mp3\tHarry James And His Orchestra\tWhen We're Alone (penthouse Serenade)\tBrunswick\t8035\t8-22084-2  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_207.mp3\tTom Gerun And His Orchestra\tWhen We're Alone (penthouse Serenade)\tBRUNSWICK\t6236\tE37451-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru2436w.mp3\tThe Cotton Pickers\tWhen Will The Sun Shine For Me\tBrunswick\t2436\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/BLUB-10307-B.mp3\tArtie Shaw And His Orchestra\tWhen Winter Comes\tBLUEBIRD\tB-10307-B\t036239-7\t1939\tFrom 20th Contury-Fox film ''Second Fiddle'' Vocal refrain by Tony Pastor\nhttp://www.jazz-on-line.com/a/mp3w/1939_089.mp3\tArtie Shaw And His Orchestra\tWhen Winter Comes\tBluebird\t10307\t36239\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/COL77514.mp3\tArthur Fields\tWhen Yankee Doodle Learns To Parlez Vous Franais\tCOLUMBIA\tA-2451\t77514\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_099.mp3\tArthur Fields\tWhen Yankee Doodle Learns To Parlez Vous Francais\tColumbia\t2451\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24027-1.mp3\tTeddy Wilson & His Orch\tWhen You & I Were Young\tCBS\tpriv\t24027-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU2836WY.mp3\tMarion Harris Acc Piano\tWhen You And I Were Seventeen\tBRUNSWICK\t2836\t-\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_132.mp3\tMarion Harris\tWhen You And I Were Seventeen\tBRUNSWICK\t2836\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_056.mp3\tGary Crosby And Friend\tWhen You And I Were Young Maggie, Blues\tDecca\t27577\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU030320.mp3\tMezz Mezzrow And His Orch\tWhen You And I Were Young, Maggie\tBLUEBIRD\t10089\t030320\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62681.mp3\tEdgar Hayes Quintet\tWhen You And I Were Young, Maggie\tDECCA\t25106\t62681\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_083.mp3\tWill Oakland\tWhen You And I Were Young, Maggie\tVICTOR\t16666\tB6822-1\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_053.mp3\tHenry Burr\tWhen You And I Were Young, Maggie\tVICTOR\t19112\t28130.\t1909\t\nhttp://www.jazz-on-line.com/a/mp3e/TedP-24027-1.mp3\tTeddy Wilson And His Orchestra\tWhen You And I Were Young, Maggie\tTeddy Wilson School\t\tP-24027-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA1913w.mp3\tHarry Mcclaskey\tWhen You And I Where Young, Maggie\tColumbia\tA1913\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4886.mp3\tBill Monroe Bluegrass Boys\tWhen You Are Lonely\tCOLUMBIA\t20526\tCCO4886\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28889-1.mp3\tGene Krupa & His Orch\tWhen You Awake\tOKEH\t5872\t28889-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_049.mp3\tJohn Mccormack\tWhen You Come Back\tVICTOR\t64791\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC51649-3.mp3\tLeo Reisman & His Orch\tWhen You Come To The End Of The Day\tVICTOR\t21968\t51649-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_213.mp3\tTurbans\tWhen You Dance\tHerald\t458\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCNN732.mp3\tFletcher Henderson & His Orch\tWhen You Do What You Do\tVOCALION\t15030A\tNN732\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA908.mp3\tBing Crosby\tWhen You Dream About Hawaii\tDECCA\t19021\tDLA908\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruDLA908-A.mp3\tLani Mcintyre And His Hawaiians\tWhen You Dream About Hawaii\tBrunswick\tSA-1441  \tDLA908-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA908-B.mp3\tLani Mcintyre And His Hawaiians\tWhen You Dream About Hawaii\tDecca\t1518  \tDLA908-B  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC17768-1.mp3\tBilly Murray\tWhen You Drop Off At Cairo\tVICTOR\t18102\t17768-1\t1916\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE19705.mp3\tSix Jumping Jacks\tWhen You Dunk A Donut Don't It Make It Nice?\tBRUNSWICK\t3254\tE19705\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL251.mp3\tLee O'daniel Hillbilly Boys\tWhen You Hear Me Call\tVOCALION\t3674\tDAL251\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP296x.mp3\tTex Ritter\tWhen You Leave, Don't Slam The Door\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78273.mp3\tCharles Harrison\tWhen You Look In The Heart Of A Rose\tCOLUMBIA\tA-2699\t78273\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_015.mp3\tJohn Mccormack\tWhen You Look In The Heart Of A Rose\tVICTOR\t64814\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_029.mp3\tCharles Harrison\tWhen You Look In The Heart Of A Rose\tCOLUMBIA\tA-2699\t78273\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_338.mp3\tDavid Whitfield With Mantrovani And His Orchestra And Chorus\tWhen You Lose The One You Love\tLondon\t1617\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC70179.mp3\tLeo Reisman & His Orch\tWhen You Press Your Lips To Mine\tVICTOR\t22798\t70179\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC21967-5.mp3\tSterling Trio\tWhen You Sang Hush-a-bye Baby\tVICTOR\t18493\t21967-5\t1918\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_070.mp3\tSterling Trio\tWhen You Sang Hush-a-bye To Me\tVictor\t18493\t\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU10543.mp3\tIsham Jones & His Orch\tWhen You Walked Out\tBRUNSWICK\t2456\t10543\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/PUR1414.mp3\tFletcher Henderson & His Orch\tWhen You Walked Out Someone Else Walked In\tPURITAN\t20239\t1414\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Par1414-2.mp3\tFletcher Henderson's Orchestra\tWhen You Walked Out Someone Else Walked In\tParamount\t20239\t1414-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4459.mp3\tAl Jolson\tWhen You Were Sweet Sixteen\tDECCA\t24106\tL4459\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2259x.mp3\tPerry Como\tWhen You Were Sweet Sixteen\tRCA\t20-2259\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67382.mp3\tMills Brothers\tWhen You Were Sweet Sixteen\tDECCA\t3381B\t67382\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_188.mp3\tMills Brothers\tWhen You Were Sweet Sixteen\tDECCA\t3381B\t67382\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_034.mp3\tPerry Como Feat. Lloyd Shaffer's Orchestra And Satisfiers\tWhen You Were Sweet Sixteen\tRCA Victor\t2259\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14139-A.mp3\tAbe Lyman And His Californians\tWhen You Were The Girl On The Scooter (vrevere Sis\tBRUNSWICK\t6674\t14139-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/COLRHCO10168.mp3\tRosemary Clooney - H.james\tWhen You Wish Upon A Star\tCOLUMBIA\t40496\tRHCO10168\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_176.mp3\tCliff Edwards\tWhen You Wish Upon A Star\tDECCA\t29487\tL8222\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU046084.mp3\tGlenn Miller And His Orch\tWhen You Wish Upon A Star (vre)\tBLUEBIRD\t10570A\t046084\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC15214-2.mp3\tAmerican Qt\tWhen You Wore A Tulip\tVICTOR\t17652\t15214-2\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42652.mp3\tJimmy Dorsey & Orchestra\tWhen You Wore A Tulip\tCOLUMBIA\t38731\tCO42652\t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1915_025.mp3\tAmerican Quartet\tWhen You Wore A Tulip And I Wore A Big Red Rose\tVictor\t17652\t\t1915\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2059-A.mp3\tBing Crosby Paradise Isle Trio\tWhen You're A Long, Long Way From Home\tDECCA\t3477B\tDLA2059-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_012.mp3\tHenry Burr\tWhen You're A Long, Long Way From Home\tVICTOR\t17632A\t15135-3\t1914\t\nhttp://www.jazz-on-line.com/a/mp3b/SUN3001WY.mp3\tRoberta Dudley W Kid Ory\tWhen You're Alone Blues\tSUNSET\t3001\t\t\t\nhttp://www.jazz-on-line.com/mp3/911933660.mp3\tArtie Shaw And His Orchestra\tWhen You're Around\tMUSICRAFT\t512\t5704\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1605.mp3\tBing Crosby & J.s.trotter\tWhen You're Away\tDECCA\t2680A\tDLA1605\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/EDIN1128-C.mp3\tCalifornia Ramblers\tWhen You're Counting The Stars\tEDISON\t14072R\tN1128-C\t\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC56736-6.mp3\tLeo Reisman & His Orch\tWhen You're Counting The Stars Alone\tVICTOR\t22181\t56736-6\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW149005.mp3\tPaul Whiteman And His Orchestra (bing Crosby Solo And In Chorus With Al Rinker And Jack Fulton)\tWhen You're Counting The Stars Alone\tColumbia\t1993 D\tW149005-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW149005.mp3\tBing Crosby W Paul Whiteman\tWhen You're Counting The Stars Alone (v B C)\tCOLUMBIA\t1993 D\tW149005\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_105.mp3\tAnna Chandler\tWhen You're Down In Louisville\tColumbia\t1939\t46315\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO10109.mp3\tFrankie Laine\tWhen You're In Love\tCOLUMBIA\t39665\tHCO10109\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_265.mp3\tFrankie Laine\tWhen You're In Love\tCOLUMBIA\t39665\tHCO10109\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_071.mp3\tHenry Burr And Elise Stevenson\tWhen You're In Town\tVICTOR\t16898\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC64862-2.mp3\tGene Austin\tWhen You're Lover Has Gone\tVICTOR\t22635\t64862-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66889.mp3\tBuddy Johnson & His Band\tWhen You're Out With Me\tDECCA\t7700\t66889\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2067-5.mp3\tJulia Lee And Her Boyfriends\tWhen You're Smiling\tCAPITOL\t\t2067-5\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MER1245.mp3\tFrankie Laine\tWhen You're Smiling\tMERCURY\t5413\t1245\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64510.mp3\tCliff Bruner's Texas Wanderers\tWhen You're Smiling\tDECCA\t5660\t64510\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19305-1.mp3\tCab Calloway & His Orch\tWhen You're Smiling\tBRUNSWICK\t7685\t19305-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149782-2.mp3\tTed Wallace & His Campus Boys\tWhen You're Smiling\tCOLUMBIA\t2104 D\tW149782-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44025.mp3\tErroll Garner Trio\tWhen You're Smiling\tCOLUMBIA\t39167\tCO44025\t1950\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE32447.mp3\tDuke Ellington & His Orch\tWhen You're Smiling\tBRUNSWICK\t6811\tE32447\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/DECGB5175.mp3\tNat Gonella\tWhen You're Smiling\tDECCA\t8726\tGB5175\t1932\t\nhttp://www.jazz-on-line.com/a/mp3l/VOCC2215.mp3\tLouisiana Rhythm Kings\tWhen You're Smiling\tVOCALION\t15716\tC2215\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_172.mp3\tLouis Armstrong\tWhen You're Smiling\tOkeh\t8729\t402924-B\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_035.mp3\tSeger Ellis And His Orchestra\tWhen You're Smiling\tColumbia\t1494\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3d/SwiOSW-2-1.mp3\tAlix Combelle's Hot Four\tWhen You're Smiling\tSwing\t17\tOSW-2-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480596.mp3\tBenny Goodman Trio\tWhen You're Smiling\tCapitol\t15887\t2518-6\t1947\tBenny Goodman (cl), Teddy Wilson (p), Jimmy Crawford (dm)\nhttp://www.jazz-on-line.com/a/mp3b/VocC-5754-.mp3\tJimmie Noone's Apex Club Orchestra\tWhen You're Smiling ? V G W\tVocalion\t1497\tC-5754-\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic42532-2.mp3\tShilkret's Rhythm - Melodists\tWhen You're With Somebody Else\tVictor\t21298\t42532-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_117.mp3\tRuth Etting\tWhen You're With Somebody Else\tCOLUMBIA\t1288 D\tW145466\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/VICOB7433.mp3\tRay Noble And His Orchestra\tWhen You've Got A Little Springtime In Your Heart\tVICTOR\t24720\tOB7433\t1934\twith Al Bowlly\nhttp://www.jazz-on-line.com/a/mp3a/VIC64814.mp3\tBud Billings And Carson Robison\tWhen Your Hair Has Turned To Silver\tVICTOR\t22588\t64814\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW151298-3.mp3\tEthel Waters And Her Ebony 4\tWhen Your Lover Has Gone\tCOLUMBIA\t2409 D\tW151298-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70246.mp3\tMaxine Sullivan\tWhen Your Lover Has Gone\tDECCA\t18555A\t70246\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72619.mp3\tEddie Condon & His Orch\tWhen Your Lover Has Gone\tDECCA\t23393B\t72619\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP6412.mp3\tEddie Heywood\tWhen Your Lover Has Gone\tCOLUMBIA\t39318\tZSP6412\t\t\nhttp://www.jazz-on-line.com/a/mp3e/OKe404873-A.mp3\tLouis Armstrong And His Orch\tWhen Your Lover Has Gone\tOKeh\t41498\t404873-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_117.mp3\tGene Austin Feat. Leonard Joy And His Orchestra\tWhen Your Lover Has Gone\tVICTOR\t22635\t64862-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480430.mp3\tBen Webster And Oscar Peterson\tWhen Your Lover Has Gone\tVerve\tMGV8349\t22990-1\t1959\tBen Webster (ts), Oscar Peterson, P Ed Thigpen, D, Ray Brown, B\nhttp://www.jazz-on-line.com/a/mp3o/DEC70021.mp3\tDick Robertson And His Orch\tWhen Your Old Wedding Ring Was New\tDECCA\t4129B\t70021\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc13569.mp3\tHazel Meyers\tWhen Your Troubles Are Just Like Mine\tVocalion\t14861\t13569\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/PARL0049.mp3\tCharlie Patton\tWhen Your Way Gets Dark\tPARAMOUNT\t12998B\tL0049\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_026.mp3\tRudy Vallee And His Connecticut Yankees\tWhen Yuba Plays The Rhumba On The Tuba\tVICTOR\t22742\t69934-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151610-2.mp3\tThe Knickerbockers (selvin)\tWhen Yuba Plays The Rumba On The Tuba\tCOLUMBIA\t2483 D\tW151610-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC69934-1.mp3\tRudy Vallee & His Ct.yankees\tWhen Yuba Plays The Rumba On The Tuba\tVICTOR\t22742\t69934-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/RoyKJ-43-3.mp3\tMezzrow - Bechet Quintet\tWhere Am I\tRoyal Jazz\t703\tKJ-43-3  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98065.mp3\tRay Noble & His Orch\tWhere Am I? (vab)\tVICTOR\t25187A\t98065\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20316-2.mp3\tBunny Berigan & His Boys\tWhere Are You\tBRUNSWICK\t7784\t20316-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1753.mp3\tMildred Bailey & Her Orch\tWhere Are You\tVOCALION\t3456\tC1753\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/MER89060WA.mp3\tIllinois Jacquet\tWhere Are You\tMERCURY\t89060\t\t\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480524.mp3\tBen Webster Quintet\tWhere Are You\tVerve\tMGV8274\t21741-1\t1957\tBen Webster (ts), Oscar Peterson P, Stan Levey, D, Ray Brown, B\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3805-A.mp3\tFrankie Carle And His Orch\tWhere Are You Gonna Be When\tRCA Victor\t20-3805-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3805-A.mp3\tFrankie Carle\tWhere Are You Gonna Be When The Moon Shines\tRCA\t20-3805\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/COL30192WA.mp3\tHot Lips Page\tWhere Are You, Blue Eyes?\tCOLUMBIA\t30192\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03246.mp3\tTommy Dorsey & His Orch\tWhere Are You?\tVICTOR\t25474\t03246\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_074.mp3\tMildred Bailey\tWhere Are You?\tVOCALION\t3456\tC1753\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_104.mp3\tAda Jones And Henry Burr\tWhere Can I Meet You To-night?\tCOLUMBIA\t1495\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU033902.mp3\tCharlie Barnet & His Orch\tWhere Can She Be (v J E)\tBLUEBIRD\t10162\t033902\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL46459.mp3\tAl Jolson\tWhere Did Robinson Crusoe Go With Friday\tCOLUMBIA\tA-1976\t46459\t1916\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4066.mp3\tTexas Jim Lewis\tWhere Did Robinson Crusoe Go With Friday\tDECCA\t69000\tL4066\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5128.mp3\tLeadbelly\tWhere Did You Sleep Last Night?\tMUSICRAFT\t312\t5128\t\t\nhttp://www.jazz-on-line.com/a/mp3e/Oke8401-4.mp3\tKing Oliver's Jazz Band\tWhere Did You Stay Last Night\tOkeh\t4918\t8401-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67733.mp3\tWoody Herman & His Orchestra\tWhere Do I Go From You?\tDECCA\t3200A\t67733\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_299.mp3\tJimmy Dorsey And His Orchestra Feat. V/bob Eberle\tWhere Do You Keep Your Heart\tDECCA\t3270A\t67855\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiHar235-H.mp3\tJack Kaufman & Al Campbell\tWhere Do You Work A John\tHarmony\t235-H\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VEL1295-Vy.mp3\tJack Kaufman And Al Campbell\tWhere Do You Work-a John\tVelvet Tone\t1295-V\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiMad1611w.mp3\tJames Wylie\tWhere Do You Work-a John\tMadison\t1611\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe80280-B.mp3\tThe Jazz Pilots (h.reser)\tWhere Do You Work-a, John?\tOKeh\t40741\t80280-B\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74385.mp3\tInk Spots\tWhere Flamingoes Fly\tDECCA\t24461\t74385\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_229.mp3\tDolly Dawn And Her Dawn Patrol\tWhere Has My Little Dog Gone?\tVOCALION\t4509\tM921\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63169.mp3\tLouis Prima's New Orleans Gang\tWhere Have We Met Before?\tDECCA\t1674\t63169\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT561.mp3\tBud Freeman & His Orch\tWhere Have You Been?\tMAJESTIC\t1018\tT561\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_079.mp3\tEmil Coleman And His Orchestra\tWhere Have You Been?\tBRUNSWICK\t6006\tE35666\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU101649.mp3\tCharlie Barnet & His Orchestra\tWhere Is My Heart\tBLUEBIRD\t6432\t101649\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101844.mp3\tTommy Dorsey & His Orch\tWhere Is My Heart?\tVICTOR\t25335\t101844\t1936\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic21025.mp3\tNat Silkret & The Victor Orchestra\tWhere Is My Meyer\tVictor\t21025\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS7559.mp3\tSam Lanin & His Orchestra\tWhere Is My Meyer? (1137)\tCBS\tBA6099\t7559\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_220.mp3\tFranklyn Baur\tWhere Is The Song Of Songs For Me?\tVICTOR\t21904\t49757\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU06465.mp3\tTeddy Hill & His Orch\tWhere Is The Sun\tBLUEBIRD\t6898\t06465\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-8482-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tWhere Is The Sun ? \tParlophone\tF-868\tCE-8482-1\t1937\tValaida Snow t v acc. by Johnny Claes t, Derek Neville as bar, Reggie Dare ts, Gun Finlay p, Norman Brown g, Louis Barreiro b, Ken Stewart d\nhttp://www.jazz-on-line.com/a/mp3c/VIC06414.mp3\tFats Waller And His Rhythm\tWhere Is The Sun?\tVICTOR\t25550\t06414\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62173.mp3\tStuff Smith & Onyx Club Boys\tWhere Is The Sun?\tDECCA\t1287\t62173\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU20867-1.mp3\tHal Kemp And His Orch\tWhere Or When\tBRUNSWICK\t7865\t20867-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COL32052.mp3\tBenny Goodman\tWhere Or When\tCOLUMBIA\t38281\t32052\t1941\tvocal Peggy Lee\nhttp://www.jazz-on-line.com/a/mp3c/MGM49S3003.mp3\tLena Horne W Lennie Hayton\tWhere Or When\tMGM\t30171B\t49S3003\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/ASCT4.mp3\tArt Tatum\tWhere Or When\tASCH\t356-2\tT4\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/MER8922WOW.mp3\tOscar Peterson\tWhere Or When\tMERCURY\t8922\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75754.mp3\tLionel Hampton's Quintet\tWhere Or When\tDECCA\t27198\t75754\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/KEYHL37.mp3\tBenny Morton's Trombone Choir\tWhere Or When\tKEYNOTE\t1315\tHL37\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/MER453-2.mp3\tErroll Garner Trio\tWhere Or When\tMERCURY\t5008\t453-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/MUS5280-1.mp3\tHerman Chittison Trio\tWhere Or When\tMUSICRAFT\t330\t5280-1\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru7865.mp3\tHal Kemp And His Orchestra\tWhere Or When\tBrunswick\t7865\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_024.mp3\tHal Kemp And His Orchestra\tWhere Or When\tBrunswick\t7865\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec75754.mp3\tLionel Hampton And His Quintet\tWhere Or When\tDecca\t27198\t75754\t1950\t\nhttp://www.jazz-on-line.com/a/mp3d/MER453-1-2.mp3\tErroll Garner Trio\tWhere Or When\tMERCURY\t5008\t453-1-2\t1946\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480576.mp3\tArt Tatum/ben Webster Quartet\tWhere Or When\tBarclay\t74030\t2996-2\t1956\tBen Webster (ts) Art Tatum (p) Red Callender (sb) Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3e/V-D178B.mp3\tDinah Shore\tWhere Or When - If I Could Be With You - Don't Cry\tV-DISC\t178B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_287.mp3\tBuddy Clark\tWhere The Apple Blossoms Fall\tCOLUMBIA\t38241\tHCO3287\t1948\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC18978-2.mp3\tAl Campbell & Henry Burr\tWhere The Black Eyed Susans Grow\tVICTOR\t18239A\t18978-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_056.mp3\tHenry Burr And Albert Campbell\tWhere The Black-eyed Susans Grow\tVICTOR\t18239A\t18978-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE37373-A.mp3\tBing Crosby\tWhere The Blue Of The Night\tBRUNSWICK\t6226\tE37373-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC70955.mp3\tRuss Columbo\tWhere The Blue Of The Night\tVICTOR\t27637\t70955\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-2088.mp3\tLouis Armstrong\tWhere The Blues Were Born In New Orleans\tRCA\t20-2088\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_160.mp3\tBernie Cummins And His Orchestra\tWhere The Cot-cot-cotton Grows\tBrunswick\t3722\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEDAL1061.mp3\tTed Daffan's Texans\tWhere The Deep Waters Flow\tOKEH\t5741\tDAL1061\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5561-1-2.mp3\tFletcher Henderson Dance Orch\tWhere The Dreamy Wabash Flows\tBANNER\t1388\t5561-1-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC30637-3.mp3\tPaul Whiteman & His Orch\tWhere The Dreamy Wabash Flows\tVICTOR\t19428A\t30637-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78794.mp3\tAl Campbell & Henry Burr\tWhere The Lanterns Glow\tCOLUMBIA\tA-2842\t78794\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_126.mp3\tFred Van Eps\tWhere The Lanterns Glow\tVICTOR\t18640\t23328-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN1301.mp3\tCliff Edwards\tWhere The Lazy Daisies Grow\tBANNER\t1328\t1301\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC29808-2.mp3\tJean Goldkette & His Orch\tWhere The Lazy Daisies Grow\tVICTOR\t19308\t29808-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_173.mp3\tCliff Edwards\tWhere The Lazy Daisies Grow\tBANNER\t1328\t1301\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_157.mp3\tJean Goldkette And His Orchestra\tWhere The Lazy Daisies Grow\tVICTOR\t19308\t29808-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru2580.mp3\tOriole Orchestra\tWhere The Lazy Dasies Grow\tBrunswick\t2580\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_074.mp3\tOlive Kline And Elsie Baker\tWhere The Lazy Mississippi Flows\tVICTOR\t45252\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC02162.mp3\tRay Noble & His Orch\tWhere The Lazy River Goes By\tVICTOR\t25459\t02162\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1796-1.mp3\tRoy Eldridge & His Orch\tWhere The Lazy River Goes By\tVOCALION\t3458\tC1796-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20411-1.mp3\tTeddy Wilson And His Orchestra\tWhere The Lazy River Goes By\tBrunswick\t7797\tB-20411-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1905_005.mp3\tByron G. Harlan\tWhere The Morning Glories Twine Around The Door\tCOLUMBIA\t3282\t\t1905\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_182.mp3\tSammy Kaye And His Orchestra\tWhere The Mountains Meet The Sky\tVictor\t27944\t075545\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VICB8480-1.mp3\tHarry Macdonough\tWhere The River Shannon Flows\tVICTOR\t16440B\tB8480-1\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_003.mp3\tHarry Macdonough\tWhere The River Shannon Flows\tVICTOR\t16440B\tB8480-1\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_082.mp3\tHenry Burr\tWhere The River Shannon Flows\tColombia\t815\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe401392-C.mp3\tMilt Shaw And His Detroiters\tWhere The Shy Little Violets Grow\tOKeh\t41158\t401392-C\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0928_05.mp3\tLee Morse And Her Bluegrass Boys\tWhere The Shy Little Violets Grow\tColumbia\t1716DA\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38801-2.mp3\tRoger Wolfe Kahn & His Orch\tWhere The Wild, Wild Flowers Grow\tVICTOR\t20717\t38801-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1927_0316_02.mp3\tLee Morse And Her Bluegrass Boys\tWhere The Wild, Wild Flowers Grow\tColumbia\t1011DB\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47499-1.mp3\tFrankie Laine\tWhere The Wind Blows\tCOLUMBIA\t40022\tCO47499-1\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU57140-2.mp3\tMckinney's Cotton Pickers\tWhere There's A Will, Baby\tBLUEBIRD\t10249A\t57140-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_404.mp3\tGeorge Cates And His Orchestra\tWhere There's Life\tCoral\t61683\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83203-A.mp3\tConnie Boswell - Artie Shaw\tWhere There's Smoke There's Fire\tDECCA\t28377\t83203-A\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16389-A.mp3\tFreddy Martin & His Orch\tWhere There's Smoke, There's Fire (v E F)\tARC\tBR7344\t16389-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100557-1.mp3\tFletcher Henderson & His Orch\tWhere There's You, There's Me\tVICTOR\t25334\t100557-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic100557-1.mp3\tFletcher Henderson And His Orchestra\tWhere Theres You There's Me\tVictor\t25334\t100557-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC17385y.mp3\tAtilla The Hun\tWhere Was Butler?\tDECCA\t17385\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/PARL0319.mp3\tDelta Big Four\tWhere Was Eve Sleeping\tPARAMOUNT\t12948A\tL0319\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU047986.mp3\tCharlie Barnet And His Orch\tWhere Was I?\tBLUEBIRD\t10669\t047986\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_092.mp3\tSammy Kaye And His Orchestra (voc Clyde Burke)\tWhere Was I?\tVictor\t26594\t050135\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_216.mp3\tJan Savitt And His Orchestra\tWhere Was I?\tDECCA\t3153B\t67538\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_009.mp3\tCharlie Barnet And His Orchestra\tWhere Was I?\tBluebird\t10669A\t47986\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM52S136.mp3\tJohnny King W Budd Johnson All\tWhere Were You\tMGM\t11255\t52S136\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE30240.mp3\tGene Krupa & His Orch\tWhere You Are\tOKEH\t6187\t30240\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142272-4.mp3\tTed Lewis & His Band\tWhere'd You Get Those Eyes\tCOLUMBIA\t667 D\tW142272-4\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_0600_01.mp3\tLee Morse\tWhere'd You Get Those Eyes\tPerfect\t11623A\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3h/GEN9205-B.mp3\tPerley Breed's Shepard Colonial Orchestra\tWhere's My Sweetie Hiding?\tGENNETT\t5608\t9205-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37550-4.mp3\tGeorge Olsen & His Music\tWhere's That Rainbow? (vbb-ff-br)\tVICTOR\t20455B\t37550-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/DecL-3907.mp3\tJimmie Lunceford And His Orchestra\tWhere's The Melody\tDecca\t\tL-3907\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC72620.mp3\tEddie Condon & His Orch\tWherever There's Love\tDECCA\t23393A\t72620\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR32405.mp3\tBillie Holiday W T.wilson\tWherever You Are\tHARMONY\tHa1075\t32405\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70311-A.mp3\tMildred Bailey\tWherever You Are\tDECCA\t4252B\t70311-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D1203.mp3\tMildred Bailey\tWhich Of The Great 48\tV-DISC\t444\t1203\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D882.mp3\tRed Norvo Quintet\tWhich Switch Witch\tV-DISC\t324\t882\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D324A1.mp3\tRed Norvo And His Quintet\tWhich Switch Witch\tV-DISC\t324A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp37/VIC011700.mp3\tRudy Valle And His Connecticut Yankees Vocal Refrain By Rudy Valle And The Gentlemen Songsters\tWhiffenpoof Song\tVICTOR\t27843-A\t011700\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC23990.mp3\tBing Crosby - Fred Waring\tWhiffenpoof Song\tDECCA\t23990\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_079.mp3\tBing Crosby Feat. Fred Waring Orchestra\tWhiffenpoof Song\tDECCA\t23990\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_038.mp3\tBuddy Rogers And His Orchestra\tWhile A Cigarette Was Burning\tVocalion\t4408\t23476\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64676.mp3\tPaul Whiteman & His Orch\tWhile A Cigarette Was Burning\tDECCA\t2083B\t64676\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_328.mp3\tPaul Whiteman And His Orchestra\tWhile A Cigarette Was Burning\tDECCA\t2083B\t64676\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/TO-1300-PA.mp3\tJimmie Lunceford And His Orchestra\tWhile Love Lasts\tCBS\t\tTO-1300-PA\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/CON18003-1.mp3\tJoshua White\tWhile The Blood Runs Warm In Your Veins\tCONQUEROR\t8590\t18003-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCON8590.mp3\tJoshua White\tWhile The Blood Runs Warm In Your Veins\tCONQUEROR\t8590\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1902_033.mp3\tS. H. Dudley Feat. V/harry Macdonough\tWhile The Leaves Came Drifting Down\tVICTOR\t16219\tB6749-2\t1902\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29170-1.mp3\tLes Brown & His Orch\tWhile The Music Plays On\tOKEH\t5964\t29170-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_089.mp3\tPeerless Quartet\tWhile They Were Dancing Around\tVictor\t17571\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC61547-A.mp3\tDick Robertson And His Orch\tWhile We Danced At The Mardi Gras\tDECCA\t1125\t61547-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_020.mp3\tPeerless Quartet\tWhile You're Away (pack Up Your Cares In A Bundle Of Joy)\tColumbia\t2642\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO40426.mp3\tSarah Vaughan\tWhile You're Gone\tCOLUMBIA\t38512\tCO40426\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/PAR21474-1.mp3\tFreddie Brown\tWhip It To A Jelly\tPARAMOUNT\t12910B\t21474-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_104.mp3\tIsham Jones And His Orchestra\tWhip-poor-will\tBrunswick\t5045\t\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1901_021.mp3\tJoe Belmont\tWhip-poor-will Song\tEDISON\t7682\t\t1901\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU4874.mp3\tIsham Jones & His Orch\tWhipoorwill\tBRUNSWICK\t2224\t4874\t1921\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO44308.mp3\tSarah Vaughan\tWhippa Whippa Woo\tCOLUMBIA\t39001\tCO44308\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU58964.mp3\tJimmie Rodgers\tWhippin' That Old T.b\tBLUEBIRD\t5076\t58964\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU070434-1.mp3\tMemphis Slim (peter Chatman)\tWhiskey And Gin Blues\tBLUEBIRD\t8945\t070434-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/OKECO46259.mp3\tJohnny Ray-maurice King\tWhiskey And Gin Blues\tOKEH\t6809\tCO46259\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/ALLA78-4.mp3\tWynonie Harris & His Allstars\tWhiskey And Jelly Roll Blues\tALLADDIN\t171\tA78-4\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU020844.mp3\tSonny Boy Williamson\tWhiskey Head Blues\tBLUEBIRD\t7707\t020844\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044242.mp3\tTommy Mcclennan\tWhiskey Headed Woman\tBLUEBIRD\t8373\t044242\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480431.mp3\tBenny Golson\tWhisper Not\tContemporary\tC3552\t\t1957\tArt Farmer (tp), Jimmy Cleveland (tb), Julius Watkins (fhr), Gigi Gryce (as), Benny Golson (ts), Sahib Shihab (bar), Wynton Kelly (p), Paul Chambers (sb),  Charlie Persip (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480798.mp3\tBenny Golson\tWhisper Not\tContemporary\tC3552\t\t1957\tArt Farmer (tp), Jimmy Cleveland (tb), Julius Watkins (fhr), Gigi Gryce (as), Benny Golson (ts), Sahib Shihab (bar), Wynton Kelly (p), Paul Chambers (sb), Charlie Persip (dm)\nhttp://www.jazz-on-line.com/a/mp3c/DEC39218-B.mp3\tBob Howard & His Orchestra\tWhisper Sweet\tDECCA\t347B\t39218-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-6952-1.mp3\tValaida (queen Of The Trumpet) With Billy Mason And His Orchestra\tWhisper Sweet\tParlophone\tF-165\tCE-6952-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-24927-A.mp3\tGene Krupa And His Orchestra\tWhisper While We Dance\tBrunswick\t8451\tB-24927-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1748y.mp3\tLes Paul And Mary Ford\tWhispering\tCAPITOL\t1748\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC24393-9.mp3\tPaul Whiteman And His Orch\tWhispering\tVICTOR\t18690\t24393-9\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC03515-1.mp3\tBenny Goodman Qt\tWhispering\tVICTOR\t25481-A\t03515-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS6006-11.mp3\tTeddy Wilson Trio\tWhispering\tMUSICRAFT\t580\t6006-11\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COL79396-1.mp3\tArt Hickman's Orch\tWhispering\tCOLUMBIA\tA-3301\t79396-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE27623.mp3\tRed Nichols & His Orch\tWhispering\tBRUNSWICK\t3955\tE27623\t1928\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC18690.mp3\tPaul Whiteman & His Orch\tWhispering\tVICTOR\t18690\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_271.mp3\tGordon Jenkins And His Orchestra\tWhispering\tDecca\t27585\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_045.mp3\tLes Paul\tWhispering\tCAPITOL\t1748\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_084.mp3\tArt Hickman And His Orchestra\tWhispering\tCOLUMBIA\tA-3301\t79396-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_002.mp3\tPaul Whiteman And His Orchestra\tWhispering\tVICTOR\t18690\t24393-9\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_340.mp3\tPaul Whiteman And His New Ambassador Hotel Orchestra\tWhispering\tCoral\t61228\t\t1954\tvocal by Dick Ridgely\nhttp://www.jazz-on-line.com/a/mp3a/DEC67862-A.mp3\tInk Spots\tWhispering Grass\tDECCA\t23632-B\t67862-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047279.mp3\tErskine Hawkins & His Orch\tWhispering Grass\tBLUEBIRD\t10671\t047279\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_110.mp3\tErskine Hawkins And His Orchestra\tWhispering Grass\tBLUEBIRD\t10671B\t047279\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_083.mp3\tInk Spots\tWhispering Grass (don't Tell The Trees)\tDECCA\t23632-B\t67862-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/Cap4515.mp3\tJo Stafford And Gordon Macrae\tWhispering Hope\tCapitol\t57-690\t4515\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC87107.mp3\tAlma Gluck And Louise Homer\tWhispering Hope\tVICTOR\t87107\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic87107.mp3\tAlma Gluck & Louise Homer\tWhispering Hope\tVictor Red Seal\t87107\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_043.mp3\tJo Stafford And Gordon Macrae\tWhispering Hope\tCapitol\t57-690\t4515\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_047.mp3\tAlma Gluck And Louise Homer\tWhispering Hope\tVictrola\t87107\t\t1912\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_127.mp3\tPatti Page\tWhispering Winds\tMERCURY\t5816\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC62340.mp3\tBob Crosby And His Orch\tWhispers In The Dark\tDECCA\t1346\t62340\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA857-A.mp3\tConnie Boswell\tWhispers In The Dark\tDECCA\t1420\tDLA857-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_153.mp3\tConnee Boswell\tWhispers In The Dark\tDECCA\t1420\tDLA857-A\t1937\tfrom the film \"Artists and Models\"\nhttp://www.jazz-on-line.com/a/mp3w/1937_008.mp3\tBob Crosby And His Orchestra\tWhispers In The Dark\tDecca\t1346\t62340\t1937\tFeat. Kay Weber<br>from the film \"Artists and Models\"\nhttp://www.jazz-on-line.com/a/mp3w/1937_191.mp3\tHal Kemp And His Orchestra\tWhispers In The Dark\tVICTOR\t25598\t010372\t1937\tfrom the film \"Artists and Models\"\nhttp://www.jazz-on-line.com/a/mp3b/Vic055188-1.mp3\tArtie Shaw And His Orchestra\tWhispers In The Night\tVictor\t27256\t055188-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC27256-B.mp3\tArtie Shaw And His Orchestra\tWhispers In The Night (murmullos En La Noche)\tVICTOR\t27256-\t055188-2\t1940\tVocal refrain by Anita Boyer\nhttp://www.jazz-on-line.com/a/mp3a/COLW152196.mp3\tBen Selvin And His Orch\tWhistle And Blow Your Blues Away\tCOLUMBIA\t2654 D\tW152196\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic20-2742-A.mp3\tSpade Cooley\tWhistle Bait\tVictor\t20-2742-A\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1612.mp3\tBenny Goodman And His Orchestra\tWhistle Blues\tCAPITOL\t\t1612\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_024.mp3\tAda Jones And Billy Murray\tWhistle It\tCOLUMBIA\tA-0493\t03589-2\t1907\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_024alt.mp3\tAda Jones, Billy Murray And Frank C. Stanley\tWhistle It(red Mill Selections)\tColumbia\t3589\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67522.mp3\tWoody Herman & His Orchestra\tWhistle Stop\tDECCA\t3332B\t67522\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC338.mp3\tJoe Turner\tWhistle Stop Blues\tNATIONAL\t\tNSC338\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/CBS22237-2.mp3\tArtie Shaw And His New Music\tWhistle While You Work\tCBS\tBR8050\tB-22237-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_085.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. V/bob Goday\tWhistle While You Work\tBLUEBIRD\t7343\t017488-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_034.mp3\tAdrienne Casillotti And The Seven Dwarfs\tWhistle While You Work\tVICTOR\t25736\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VICB2902-13.mp3\tArthur Pryor's Band\tWhistler And His Dog\tVICTOR\t19869\tB2902-13\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU06302-1.mp3\tMeade Lux Lewis\tWhistlin' Blues\tBLUEBIRD\t10175\t06302-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC73771.mp3\tLeo Reisman & His Orch\tWhistling For A Kiss\tVICTOR\t24156\t73771\t1932\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_032.mp3\tGuy Lombardo And His Royal Canadians\tWhistling In The Dark\tCOLUMBIA\t2444 D\tW151501-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh111.mp3\tThe Blue Lyres (ambrose)\tWhistling In The Dark (v Sam Browne)\tDecca\tF-2440\tGB-3087-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1144-A.mp3\tSam Lanin's Dance Ensemble\tWhistling In The Dark (vft) (vps)\tHIT OF THE WEEK\t1144\t1144-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1757.mp3\tBing Crosby - J.s.trotter Orch\tWhistling In The Wildwood\tDECCA\t2448A\tDLA1757\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_236.mp3\tBing Crosby Feat. John Scott Trotter's Orchestra\tWhistling In The Wildwood\tDECCA\t2448A\tDLA1757\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1911_127.mp3\tBilly Golden And Joe Hughes\tWhistling Pete\tVICTOR\t35202\t\t1911\t\nhttp://www.jazz-on-line.com/a/mp3a/ATL1048x.mp3\tDrifters\tWhite Christmas\tATLANTIC\t1048\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_353.mp3\tBing Crosby\tWhite Christmas\tDecca\t23778\tDLA3009-B\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO33811.mp3\tFrank Sinatra\tWhite Christmas\tCOLUMBIA\t36756\tCO33811\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA3009-B.mp3\tBing Crosby - J.s.trotter Orch\tWhite Christmas\tDECCA\t18429A\tDLA3009-B\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec18429.mp3\tBing Crosby\tWhite Christmas\tDecca\t18429\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_113.mp3\tCharlie Spivak And His Orchestra\tWhite Christmas\tHARMONY\tHa1082\tCO32962\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_001.mp3\tBing Crosby Feat. Ken Darby Singers\tWhite Christmas\tDECCA\t18429A\tDLA3009-B\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_060.mp3\tFrank Sinatra\tWhite Christmas\tCOLUMBIA\t36860\tCO33811\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_121.mp3\tJo Stafford\tWhite Christmas\tCapitol\t319\t999\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_222.mp3\tDrifters\tWhite Christmas\tAtco\t6059\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_090.mp3\tGordon Jenkins And His Orchestra\tWhite Christmas\tCapitol\t124\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_220.mp3\tFreddy Martin And His Orchestra\tWhite Christmas\tVICTOR\t27946\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_283.mp3\tPerry Como\tWhite Christmas\tRCA Victor\t1970\t\t1947\taccompanied by Lloyd Shaffer's Orchestra\nhttp://www.jazz-on-line.com/a/mp3w/1952_281.mp3\tMantovani And His Orchestra\tWhite Christmas\tLondon\t1280\t\t1952\tfrom the film \"Holiday Inn\"\nhttp://www.jazz-on-line.com/a/mp3w/1946_020.mp3\tBing Crosby Feat. John Scott Trotter's Orchestra\tWhite Christmas\tDECCA\t23778\tDLA3009-B\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/COLH1553-1.mp3\tBob Wills Texas Playboys\tWhite Cross On Okinawa\tCOLUMBIA\t36881\tH1553-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU81324-1.mp3\tJimmie Lunceford & His Orch\tWhite Heat\tBLUEBIRD\t5713\t81324-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D355B2.mp3\tJimmie Lunceford And His Orchestra\tWhite Heat\tV-DISC\t355B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24353-A.mp3\tJimmie Lunceford And His Orchestra\tWhite Heat\tOkeh\t5156\t24353-A\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3a/VIC70259-1.mp3\tLeo Reisman And His Orch\tWhite Heat (v Astaire)\tVICTOR\t22836\t70259-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW142658-2.mp3\tCharlie Poole N.c.ramblers\tWhite House Blues\tCOLUMBIA\t15099 D\tW142658-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh068.mp3\tLew Stone And His Band\tWhite Jazz\tDecca\tF-3782\tGB-6279-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_212.mp3\tGlen Gray And Casa Loma Orchestra\tWhite Jazz\tBRUNSWICK\t6092\tE36502-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU56615.mp3\tGeorgia Yellow Hammers\tWhite Lightning\tBLUEBIRD\t5126\t56615\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/Mel11815-1.mp3\tMills Blue Rhythm Band\tWhite Lightning\tMelotone\tM-12414  \t11815-1  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC20397-2.mp3\tConway's Band\tWhite Rose March\tVICTOR\t18360\t20397-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU037411.mp3\tOzzie Nelson And His Orch\tWhite Sails\tBLUEBIRD\t10311\t037411\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_057.mp3\tSammy Kaye And His Orchestra\tWhite Sails (beneath A Yellow Moon)\tVICTOR\t26267B\t036952\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_029.mp3\tOzzie Nelson And His Orchestra\tWhite Sails (beneath A Yellow Moon)\tBLUEBIRD\t10311\t037411\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_174.mp3\tLaurie Loman\tWhither Thou Goest\tCentury\t106\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_292.mp3\tMarion Marlowe; Orch. Under Dir. Of Will Roland\tWhither Thou Goest\tCOLUMBIA\t40315\tCO52516\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_073.mp3\tLes Paul And Mary Ford\tWhither Thou Goest\tCapitol\t2928\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC92706-1.mp3\tBenny Goodman Trio\tWho\tVICTOR\t25181-B\t92706-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS27618-1.mp3\tGene Krupa & His Orch\tWho\tCBS\toK6009\t27618-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19840.mp3\tGeorge Olson & His Orchestra\tWho\tVictor\t19840\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/Bla24.mp3\tCliff Jackson\tWho\tBlack & White\t25\t24\t1944\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480597.mp3\tBen Webster Quintet\tWho\tVerve\t833551-2\t21746-2\t1957\tBen Webster (p), Ray Brown (sb), Stan Levey (dm)\nhttp://www.jazz-on-line.com/a/mp3a/VIC014683-1.mp3\tTommy Dorsey And His Orch\tWho ? ('sunny')\tVICTOR\t27519B\t014683-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29248-1.mp3\tCount Basie And His Orchestra\tWho Am I?\tOkeh\t5987\t29248-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_340.mp3\tGogi Grant\tWho Are We\tEra\t1008\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69905.mp3\tElla Fitzgerald & Her Orch\tWho Are You\tDECCA\t4291B\t69905\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23455.mp3\tRed Norvo & His Orch\tWho Blew Out The Flame (v M. Bailey)\tBRUNSWICK\t8230\t23455\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CONM901-1.mp3\tDolly Dawn's Dawn Patrol\tWho Blew Out The Flame (vdd)\tCONQUEROR\t9137\tM901-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_097.mp3\tLarry Clinton And His Orchestra\tWho Blew Out The Flame?\tVictor\t26073\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_139.mp3\tDolly Dawn And Her Dawn Patrol\tWho Blew Out The Flame?\tVOCALION\t4383\tM901\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE31639.mp3\tCab Calloway & His Orch\tWho Calls\tOKEH\t6501\t31639\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2398.mp3\tBing Crosby\tWho Calls?\tDECCA\t3887B\tDLA2398\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC3978.mp3\tGene Krupa & His Orch\tWho Can I Turn To\tOKEH\t6411\tC3978\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COL80631.mp3\tAl Jolson\tWho Cares\tCOLUMBIA\tA-3779\t80631\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/COL26807.mp3\tFred Astaire W B.goodman Orch\tWho Cares\tCOLUMBIA\t35517\t26807\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MER697-3.mp3\tFrankie Laine W Carl Fischer\tWho Cares What People Say\tMERCURY\t5018B\t697-3\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DECLA5881.mp3\tLionel Hampton & His Orch\tWho Cares?\tDECCA\t27305\tLA5881\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE30056.mp3\tRed Nichols & His 5 Pennies\tWho Cares?\tBRUNSWICK\t6831\tE30056\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5881.mp3\tLionel Hampton And His Orchestra\tWho Cares?\tDecca\t27305\tLA-5881\t1950\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481770.mp3\tAnita O'day\tWho Cares?\tVerve\tMGV2000\t2557-7\t1955\tacc. by Paul Smith (p), Barney Kessel (g), Joe Mondragon (sb), Alvin Stoller (dm), Buddy Bregman (arr, dir)\nhttp://www.jazz-on-line.com/a/mp3c/BAN6730.mp3\tSam Lanin And His Orchestra\tWho Could Be More Wonderful Than You? (vjm)\tBANNER\t1813\t6730\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24965-A.mp3\tJimmie Lunceford And His Orchestra\tWho Did You Meet Last Night\tOkeh\t5116\t24965-A\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Gerard Wilson-t/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-p\nhttp://www.jazz-on-line.com/a/mp3a/CAP1119.mp3\tAndy Russell\tWho Do You Love, I Hope\tCAPITOL\t271\t1119\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_101.mp3\tArthur Collins And Byron Harlan\tWho Do You Love?\tIndestructible\t645\tB4855\t1908\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO27767.mp3\tMaxine Sullivan\tWho Is Sylvia?\tCOLUMBIA\t36233\tCO27767\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_252.mp3\tRosemary Clooney Feat. O/percy Faith\tWho Kissed Me Last Night?\tCOLUMBIA\t39813\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013355.mp3\tTommy Dorsey & His Orch\tWho Knows?\tVICTOR\t25663\t013355\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20142-1.mp3\tTeddy Wilson & His Orch\tWho Loves You\tBRUNSWICK\t7768\t20142-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20142-3.mp3\tTeddy Wilson And His Orchestra\tWho Loves You \tBrunswick\t7768  \tB-20142-3  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/Cam3714-A.mp3\tThe Washingtonians\tWho Said ''it's Tight Like That''?\tCameo\t9195\t3714-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC2681.mp3\tWendell Hall\tWho Said I Was A Bum\tBRUNSWICK\t4174\tC2681\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/KinK-5860.mp3\tLucky Millinder And His Orchestra\tWho Said Shorty Wasn't Coming Back?\tKing\t4398\tK-5860  \t1950\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_078.mp3\tCliff Edwards\tWho Takes Care Of The Caretaker's Daughter?\tPath\t025128\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18674A.mp3\tLucky Millinder's Orch\tWho Threw The Whiskey In The Well\tDECCA\t18674A\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT546.mp3\tLouis Prima & His Orchestra\tWho Threw The Whiskey In The Well\tMAJESTIC\t7151\tT546\t1945\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec72180.mp3\tLucky Millinder And His Orchestra\tWho Threw The Whiskey In The Well\tDecca\t19674\t72180\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1191-1.mp3\tRoy Eldridge & Ho\tWho Told You I Cared (v Laurel Wilson)\tVARSITY\t8144\tUS1191-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/ColWC-2799-A.mp3\tHarry James And His Orchestra\tWho Told You I Cared?\tColumbia\t35261\tWC-2799-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_270.mp3\tConnee Boswell (o-bob Haggart W Paulette Sisters)\tWho Told You That Lie?\tDecca\t18881\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/VICOB4770-2.mp3\tRay Noble & His Orch\tWho Walks In When I Walk Out\tVICTOR\t24594\tOB4770-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL6529-A.mp3\tL.armstrong-ella Fitzgerald\tWho Walks In When I Walk Out?\tDECCA\t28552\tL6529-A\t1951\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU11916.mp3\tGene Rodemich And His Orchestra\tWho Will It Be\tBRUNSWICK\t2556A\t11916\t1923\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3b/VIC43437-2.mp3\tTed Weems & His Orch\tWho Wouldn't Be Blue\tVICTOR\t21511\t43437-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR635-Hx.mp3\tLou Gold And His Orch\tWho Wouldn't Be Blue\tHarmony\t635-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/HAR147910-2.mp3\tGolden Gate Orch\tWho Wouldn't Be Jealous Of You (vjr)\tHARMONY\t839-H\t147910-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO632.mp3\tKay Kyser And His Orchestra\tWho Wouldn't Love You\tCOLUMBIA\t36526\tHCO632\t1942\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic27891.mp3\tFreddy Martin & His Orchestra\tWho Wouldn't Love You\tVictor\t27891\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_009.mp3\tKay Kyser And His Orchestra\tWho Wouldn't Love You\tCOLUMBIA\t36526\tHCO632\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC33158-3.mp3\tCoon-sanders Nighthawk Orch\tWho Wouldnt Love You\tVICTOR\t19754\t33158-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC64464.mp3\tChick Webb & His Orchestra\tWho Ya Hunchin'?\tDECCA\t2231B\t64464\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC010560.mp3\tTommy Dorsey & His Clambake 7\tWho'll Be The One This Summer?\tVICTOR\t25610\t010560\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC034651-2.mp3\tBenny Goodman And His Orchestra\tWho'll Buy My Bublitchki\tVICTOR\t26263\t034651-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64833.mp3\tMary Martin - Woody Herman\tWho'll Buy My Violets\tDECCA\t2362B\t64833\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03989.mp3\tTommy Dorsey & His Orch\tWho'll Buy My Violets?\tVICTOR\t25519\t03989\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/Mon041532.mp3\tFats Waller And His Rhythm\tWho'll Take My Place\tMontgomeryWard\t8391\t041532\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL78982.mp3\tPeerless Qt\tWho'll Take The Place Of Mary?\tCOLUMBIA\tA-2913\t78982\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC86082.mp3\tElla Fitzgerald With\tWho's Afraid\tDECCA\t29137\t86082\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU20561-2.mp3\tBunny Berigan's Boys\tWho's Afraid Of Love (v Art Gentry)\tBRUNSWICK\t7823\t20561-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC03842-1.mp3\tFats Waller And His Rhythm\tWho's Afraid Of Love?\tVICTOR\t25499\t03842-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COL233670-1.mp3\tBen Bernie And All The Lads\tWho's Afraid Of The Big Bad Wolf\tCOLUMBIA\t50371\t233670-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC77983-3.mp3\tDon Bestor And His Orch\tWho's Afraid Of The Big Bad Wolf?\tVICTOR\t24410\t77983-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_081.mp3\tBen Bernie And His Orchestra\tWho's Afraid Of The Big Bad Wolf?\tCOLUMBIA\t2824 D\tW152513\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_015.mp3\tDon Bestor And His Orchestra Feat. Florence Case. Charles Youtz And Frank Sherry\tWho's Afraid Of The Big Bad Wolf?\tVICTOR\t24410\t77983-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13994-A.mp3\tVictor Young And His Orch\tWho's Afraid Of The Big Bad Wolf? (v4)\tBRUNSWICK\t6882\t13994-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN14084-3.mp3\tHarry Reser And His Eskimos\tWho's Afraid Of The Big Bad Wolf? (vl.clemens)\tBANNER\t32870\t14084-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/CON14084-3.mp3\tRounders (harry Reser)\tWho's Afraid Of The Big Bad Wolf? (vl.clemens)\tCONQUEROR\t8218\t14084-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU060406-2.mp3\tErskine Hawkins & His Orch\tWho's Beating My Time\tBLUEBIRD\t11192\t060406-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU26542.mp3\tHal Kemp & His Orch\tWho's Blue Now?\tBRUNSWICK\t3840\t26542\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BruE-35911-A.mp3\tKing Oliver And His Orchestra\tWho's Blue?\tBrunswick\tA-9065\tE-35911-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36071-2.mp3\tThomas Morris Hot Babies\tWho's Dis Heah Stranger?\tVICTOR\t20316\t36071-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/MERC659-3.mp3\tJohnny Hodges & His Orchestra\tWho's Excited\tMERCURY\t8977\tC659-3\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC055193-2.mp3\tArtie Shaw And His Orchestra\tWho's Excited?\tVICTOR\t27385\t055193-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN966A-.mp3\tDelmore Brothers\tWho's Gonna Be Lonesome\tKING\t966A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe09732-A.mp3\tLouis Armstrong's Hot Five\tWho's It\tOKeh\t8357\t09732-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU10559-4.mp3\tIsham Jones And His Orch\tWho's Sorry Now\tBRUNSWICK\t2438\t10559-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU10623.mp3\tMarion Harris\tWho's Sorry Now\tBRUNSWICK\t2443\t10623\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1630.mp3\tHarry James & His Orch\tWho's Sorry Now\tCOLUMBIA\t36973\tHCO1630\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC22473.mp3\tErskine Hawkins Bama St.coll.\tWho's Sorry Now\tVOCALION\t4072\t22473\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/DeLD-169.mp3\tBenny Carter And His All Star Orchestra\tWho's Sorry Now\tDe Luxe\t1009\tD-169\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041586.mp3\tGlenn Miller & His Orch\tWho's Sorry Now (vre)\tBLUEBIRD\t10486\t041586\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3950.mp3\tBing Crosby & Eddie Heywood\tWho's Sorry Now?\tDECCA\t23530\tL3950\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE29210.mp3\tRed Nichols & His Orch\tWho's Sorry Now?\tBRUNSWICK\t4243\tE29210\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC39334-A.mp3\tCasa Loma Orchestra\tWho's Sorry Now?\tDECCA\t379B\t39334-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_045.mp3\tMarion Harris\tWho's Sorry Now?\tBRUNSWICK\t2443\t10623\t1923\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR144609-1.mp3\tUniversity Six\tWho's That Knockin' At My Door?\tHARMONY\t489-H\t144609-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC27301.mp3\tCab Calloway & His Orch\tWho's Yehoodi?\tVOCALION\t5566\t27301\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW351148.mp3\tBen Selvin\tWho's Your Little Whozis\tCOLUMBIA\tPA3406\tW351148\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE34111.mp3\tRed Nichols & His 5 Pennies\tWho?\tBRUNSWICK\t6839\tE34111\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014683.mp3\tTommy Dorsey & His Orch\tWho?\tVICTOR\t25693B\t014683\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_077.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tWho?\tVICTOR\t25693B\t014683\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLDAL626.mp3\tBob Wills Texas Playboys\tWhoa Babe\tCOLUMBIA\t20308\tDAL626\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC07793-1.mp3\tLionel Hampton And His Orch\tWhoa Babe\tVICTOR\t25575\t07793-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic07793-1.mp3\tLionel Hampton And His Orchestra\tWhoa Babe\tVictor\t25575\t07793-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81244-7.mp3\tBessie Smith\tWhoa, Tillie, Take Your Time\tCOLUMBIA\t13000 D\t81244-7\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4091.mp3\tCurly Williams Ga.peachpickers\tWhole Hog Or None\tCOLUMBIA\t20748\tHCO4091\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/COL29027-2.mp3\tBenny Goodman Sextet\tWholly Cats\tCOLUMBIA\t35810\t29027-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/StoKJ-40-1.mp3\tMezzrow - Bechet Quintet\tWhoop This Wolf Away From My D\tStoryville \tA45077\tKJ-40-1  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60404-A.mp3\tBob Howard & His Orch\tWhose Big Baby Are You?\tDECCA\t689B\t60404-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88779-1.mp3\tFats Waller And His Rhythm\tWhose Honey Are You\tVICTOR\t24892\t88779-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic88780-1.mp3\t\"fats\" Waller And His Rhythm\tWhose Honey Are You (instr.)\tVictor\t25027\t88780-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN16682-1.mp3\tHenry Allen & His Orchestra\tWhose Honey Are You (vha)\tBANNER\t33355\t16682-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic88779-1.mp3\t\"fats Waller And His Rhythm\tWhose Honey Are You (vocal)\tVictor\t24892\t88779-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE17138.mp3\tNick Lucas\tWhose Who Are You\tBRUNSWICK\t3052\tE17138\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149699.mp3\tBen Selvin & His Orch\tWhy\tCOLUMBIA\t2077\tW149699\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_213.mp3\tKaren Chandler Feat. O/jack Pleis\tWhy\tCORAL\t61088\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_285.mp3\tNat King Cole Feat. O/nelson Riddle\tWhy\tCAPITOL\t2687\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24498.mp3\tTeddy Wilson & His Orch\tWhy Begin Again\tCBS\t(Reject)\t24498\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-24498-1.mp3\tTeddy Wilson And His Orchestra\tWhy Begin Again\tBrunswick\t\tB-24498-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC036840.mp3\tTommy Dorsey & His Orch\tWhy Begin Again?\tVICTOR\t26246\t036840\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62454-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWhy Can't We Do It Again?\tDecca\t1477\t62454-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULAE449.mp3\tAl Jolson W Orch\tWhy Can't You\tBRUNSWICK\t4401\tLAE449\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148426-3.mp3\tFred Rich & His Orch\tWhy Can't You (v4)\tCOLUMBIA\t1878 D\tW148426-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC51132-3.mp3\tNat Shilkret & Victor Orch\tWhy Can't You (vsl)\tVICTOR\t21953\t51132-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5811-4-5-6.mp3\tFletcher Henderson & His Orch\tWhy Couldn't It Be Poor Little Me\tBANNER\t1476\t5811-4-5-6\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU14387-8.mp3\tRay Miller & His Orch - Isham Jones Guest Conductor\tWhy Couldn't It Be Poor Little Me\tBRUNSWICK\t2788\t14387-8\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COL30920.mp3\tHank Penny's Radio Cowboys\tWhy Did I Cry\tCOLUMBIA\t20265\t30920\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC29375-4.mp3\tPaul Whiteman & His Orch\tWhy Did I Kiss That Girl ?\tVICTOR\t19267A\t29375-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC21990-B.mp3\tJohnny Marvin-ed. Smalle\tWhy Did You Leave Me\tVictor\t21990-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_328.mp3\tGloria Mann\tWhy Do Fools Fall In Love\tDecca\t29832\tL8920\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_042.mp3\tTeenagers Featuring Frankie Lymon\tWhy Do Fools Fall In Love\tGee\t1002\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_062.mp3\tGale Storm\tWhy Do Fools Fall In Love\tDot\t15448\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4490.mp3\tKarl And Harty\tWhy Do Girls Wear Breeches\tCOLUMBIA\t37281\tCCO4490\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_268.mp3\tBob Causer And His Orchestra\tWhy Do I Dream These Dreams?\tMELOTONE\t12925\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_117.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tWhy Do I Dream These Dreams?\tVICTOR\t24576\t81758-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC81758-1.mp3\tEddy Duchin & His Orch\tWhy Do I Dream Those Dream\tVICTOR\t24576\t81758-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/BAN14716-1.mp3\tBob Causer And His Cornelians\tWhy Do I Dream Those Dreams? (vocal T S)\tBANNER\t32975\t14716-1\t\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU19497-2.mp3\tTeddy Wilson And His Orchestra\tWhy Do I Lie To Myself About You\tBRUNSWICK\t7699\t19497-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic101670-1.mp3\t\"fats\" Waller And His Rhythm\tWhy Do I Lie To Myself About You\tVictor\t25353\t101670-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101670-1.mp3\tFats Waller And His Rhythm\tWhy Do I Lie To Myself About You?\tVICTOR\t25353\t101670-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3746.mp3\tBing Crosby - J.s.trotter\tWhy Do I Like You?\tDECCA\t23754\tL3746\t1945\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC65159.mp3\tSelph Leon\tWhy Do I Love You\tDECCA\t5696\t65159\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC41170-2.mp3\tNat Shilkret & Victor Orch\tWhy Do I Love You (vfb)\tVICTOR\t21215B\t41170-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_097.mp3\tNat Shilkret And The Victor Orchestra\tWhy Do I Love You?\tVICTOR\t21215B\t41170-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3h/ABBG-711.mp3\tLawrence Piano Roll Cook And His Orchestra; The Jim Dandies, V\tWhy Do They Always Say ''no''?\tABBEY\t15003\tG-711\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP11699.mp3\tJune Christy\tWhy Do You Have To Go Home\tCAPITOL\t\t11699\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC36090-9.mp3\tPaul Whiteman & His Orch\tWhy Do You Roll Those Eyes?\tVICTOR\t20197\t36090-9\t1926\t\nhttp://www.jazz-on-line.com/a/mp3e/COL195055.mp3\tBen Selvin And His Orch\tWhy Do You Suppose\tCOLUMBIA\t\t195055\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_273.mp3\tHelen Forrest And Dick Haymes Feat. D/earle Hagen\tWhy Does It Get So Late So Early\tDECCA\t23611\tL4219\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_332.mp3\tTony Bennett\tWhy Does It Have To Be Me?\tCOLUMBIA\t40121\tCO49846\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC026873.mp3\tBunny Berigan & His Orch\tWhy Doesn't Somebody Tell Me These Things?\tVICTOR\t26055A\t026873\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec65252-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWhy Don't I Get Wise To Myself\tDecca\t2774\t65252-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65252.mp3\tAndy Kirk & Clouds Of Joy\tWhy Don't I Get Wise To Myself?\tDECCA\t2774A\t65252\t1939\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC29868-3.mp3\tCoon-sanders Nighthawk Orch\tWhy Don't My Dreams Come True?\tVICTOR\t19357\t29868-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO346.mp3\tKay Kyser And His Orchestra\tWhy Don't We Do This More Often\tCOLUMBIA\t36253\tHCO346\t1941\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBluB-11211.mp3\tFreddy Martin & His Orchestra\tWhy Don't We Do This More Often\tBluebird\tB-11211\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/MER70025x.mp3\tPatti Page\tWhy Don't You Believe Me\tMERCURY\t70025\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S323.mp3\tJoni James W Lew Douglas\tWhy Don't You Believe Me\tMGM\t11333\t52S323\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_034.mp3\tPatti Page\tWhy Don't You Believe Me\tMERCURY\t70025\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO33048-1.mp3\tBenny Goodman And His Orchestra\tWhy Don't You Do Right\tCOLUMBIA\t36652\tCO33048-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU064130.mp3\tLil Green And Her Trio\tWhy Don't You Do Right ?\tBLUEBIRD\t8714\t064130\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_029.mp3\tBenny Goodman And His Orchestra Feat. Peggy Lee\tWhy Don't You Do Right?\tCOLUMBIA\t36652\tCO33048-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC072558.mp3\tDinah Shore W Paul Weston\tWhy Don't You Fall In Love With Me\tVICTOR\t27970\t072558\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_048.mp3\tJohnny Long And His Orchestra\tWhy Don't You Fall In Love With Me?\tDECCA\t4375A\t71183\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_190.mp3\tConnee Boswell\tWhy Don't You Fall In Love With Me?\tDECCA\t18483\t71247\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN845WD.mp3\tZeb Turner\tWhy Don't You Haul Off And Get Religion\tKING\t845\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM50S6004.mp3\tHank Williams\tWhy Don't You Love Me\tMGM\t10696\t50S6004\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC70029.mp3\tSam Price's Texas Blusicians\tWhy Don't You Love Me Any More?\tDECCA\t8609\t70029\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_155.mp3\tJan Garber And His Orchestra\tWhy Don't You Practice What You Preach?\tVICTOR\t24634\t80502\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU15358-A.mp3\tBoswell Sisters\tWhy Don't You Practise What You Preach\tBRUNSWICK\t6929\t15358-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC80502.mp3\tJan Garber & His Orch\tWhy Don't You Practise What You Preach\tVICTOR\t24634\t80502\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/MER2610.mp3\tLester Flatt And Earl Scruggs\tWhy Don't You Tell Me So?\tMERCURY\t6211\t2610\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_224.mp3\tJacks\tWhy Don't You Write Me?\tDot\t15415\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC92747-1.mp3\tRay Noble And His Orchestra\tWhy Dream?\tVICTOR\t25104\t92747-1\t1935\twith Al Bowlly\nhttp://www.jazz-on-line.com/a/mp3b/V-D587x.mp3\tGlenn Miller Army Air Force Band\tWhy Dream?\tV-Disc\t587\t\t1944-\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO3753.mp3\tGene Krupa & His Orch\tWhy Fall In Love With A Stranger\tCOLUMBIA\t38622\tHCO3753\t1949\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec67012-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWhy Go On Pretending\tDecca\t3033\t67012-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW150621.mp3\tBen Selvin & His Orch\tWhy Have You Forgotten Waikiki?\tCOLUMBIA\t2255 D\tW150621\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC09888.mp3\tFats Waller And His Rhythm\tWhy Hawaiians Sing Aloha\tVICTOR\t25762\t09888\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic17554.mp3\tBilly Murray\tWhy Is The Ocean So Near The Shore\tVictor\t17554\t\t1914\t\nhttp://www.jazz-on-line.com/a/mp3b/ARCB-13061-A.mp3\tEarl Hines And His Orch\tWhy Must We Part\tARC\tBR9407\tB-13061-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/MERC667-2.mp3\tCount Basie & His Orchestra\tWhy Not\tMERCURY\t8988\tC667-2\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC697-1.mp3\tHal Kemp And His Orch\tWhy Not ?\tBRUNSWICK\t6925\tC697-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Pat105121.mp3\tHenderson's Dance Orchestra\tWhy Put The Blame On You?\tPath? Actuelle\t036069\t105121\t1924\t\nhttp://www.jazz-on-line.com/a/mp3b/GUIG617.mp3\tCozy Cole & His Quintet\tWhy Regret? (vjune Hawkins)\tGUILDE\t129\tG617\t\t\nhttp://www.jazz-on-line.com/mp3/488595843.mp3\tEddy Arnold\tWhy Should I Cry\tRCA\t21-0300\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/OKeS70732-A.mp3\tBilly Jones & Ernest Hare\tWhy Should I Cry Over You\tOKeh\t4657\tS70732-A\t1922\t\nhttp://www.jazz-on-line.com/a/mp3r/RiOKe4657.mp3\tBilly Jones & Ernest Hare\tWhy Should I Cry Over You\tOKeh-\t4657\tS70732-A\t1922\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_256.mp3\tHarptones\tWhy Should I Love You?\tBruce\t109\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63783.mp3\tLouis Prima's New Orleans Gang\tWhy Should I Pretend?\tDECCA\t1953B\t63783\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/OKEC4083.mp3\tBig Bill Broonzy Blind John Davis And Washboard Sam\tWhy Should I Spend My Money?\tOKEH\t6630\tC4083\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/DECDR-2880-1.mp3\tThe Quintet Of The Hot Club De France With Django Reinhardt And Stphane Grappelly\tWhy Should'nt I Care?\tDECCA\t23077\tDR-2880-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC062769.mp3\tArtie Shaw And His Orchestra\tWhy Shouldn't I?\tVICTOR\t27499\t062769-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5463.mp3\tTeddy Wilson\tWhy Shouldn't I?\tMUSICRAFT\t371\t5463\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_102.mp3\tGus Arnheim And His Orchestra\tWhy Shouldn't I?\tVICTOR\t22702\t61094-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_173.mp3\tJohnny Green And His Orchestra\tWhy Shouldn't I?\tBRUNSWICK\t7522\t18048A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC61094-2.mp3\tGus Arnheim Coconut Grove Orch\tWhy Shouldnt I\tVICTOR\t22702\t61094-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013201.mp3\tBunny Berigan & His Orch\tWhy Talk About Love\tVICTOR\t25667B\t013201\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU69412-1.mp3\tJimmie Rodgers & Carter Family\tWhy There's A Tear In My Eye\tBLUEBIRD\t6698\t69412-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC56704-2.mp3\tLeo Reisman & His Orch\tWhy Was I Born\tVICTOR\t22187\t56704-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBru7859.mp3\tBillie Holiday\tWhy Was I Born\tBrunswick\t7859\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20570-1.mp3\tTeddy Wilson And His Orchestra\tWhy Was I Born \tBrunswick\t7859  \tB-20570-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3h/RCAE4VH-0797-a.mp3\tDick Collins And The Runaway Herd\tWhy Was I Born\tRCA VICTOR\t547-0459\tE4VH-0797-a\t1955\tformerly of Woody Herman Orchestra\nhttp://www.jazz-on-line.com/a/mp3c/BRU20570-1.mp3\tTeddy Wilson & His Orch\tWhy Was I Born (vb.holiday)\tBRUNSWICK\t7859\t20570-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_087.mp3\tHelen Morgan\tWhy Was I Born?\tVICTOR\t27682\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_185.mp3\tVic Damone Feat. Glenn Osser's Orchestra\tWhy Was I Born?\tMERCURY\t5326\t2868\t1949\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79570-1.mp3\tNora Bayes\tWhy Worry\tCOLUMBIA\tA-3360\t79570-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_124.mp3\tNora Bayes\tWhy Worry\tCOLUMBIA\tA-3360\t79570-1\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_214.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tWhy'd Ya Make Me Fall In Love?\tVICTOR\t25846\t022488\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4633.mp3\tLouis Jordan\tWhy'd You Do It, Baby?\tDECCA\t24527\tL4633\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149699.mp3\tBen Selvin & His Orch\tWhy?\tCOLUMBIA\t2077 D\tW149699\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149549-2.mp3\tOakcliff T-bone (walker)\tWichita Falls Blues\tCOLUMBIA\t14506 D\tW149549-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/COLCO34676.mp3\tVictor Borge, Piano; Orchestra Conducted By Paul Baron\tWiegenlied (lullaby)\tCOLUMBIA\t36913\tCO 34676\t1946\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29534-1.mp3\tCount Basie And His Orchestra\tWiggle Woogie\tOkeh\t6157\t29534-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23183-1.mp3\tRed Norvo & His Orch\tWigwammin (vmb)\tBRUNSWICK\t8194\t23183-1\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45813-3.mp3\tJoe Venuti And Eddie Lang\tWild Cat\tVICTOR\t21561\t45813-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE80328-A.mp3\tJoe Venuti & Eddie Lang\tWild Cat\tOKEH\t40762\t80328-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_200.mp3\tDon Cherry\tWild Cherry\tColumbia\t40665\tCO54438\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU94523-1.mp3\tBoots And His Buddies\tWild Cherry\tBLUEBIRD\t6063\t94523-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/COL04151-2.mp3\tEddie Morton\tWild Cherry Rag\tCOLUMBIA\tA-0737\t04151-2\t1909\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD451.mp3\tRoy Eldridge Sextet\tWild Driver\tDISC\t152\tD451\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/COL78617-8.mp3\tYerkes Jazarimba Orchestra\tWild Flower Waltz\tCOLUMBIA\tA2851\t78617-8\t1919\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU13001.mp3\tCasa Loma Orchestra\tWild Goose Chase\tBRUNSWICK\t6588\t13001\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBRU6588.mp3\tCasa Loma Orchestra\tWild Goose Chase\tBRUNSWICK\t6588\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW142631-1.mp3\tCharlie Poole N.c.ramblers\tWild Horses\tCOLUMBIA\t15279 D\tW142631-1\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_374.mp3\tRay Anthony And His Orchestra; Vocal By Jo Ann Greer\tWild Horses\tCapitol\t2349\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_046.mp3\tPerry Como Feat. Hugo Winterhalter's Orchestra\tWild Horses\tRCA Victor\t5152\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe9113-A.mp3\tJimmy Joy's St. Anthony's Hotel Orchestra\tWild Jazz\tOKeh\t40420\t9113-A\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE80848-C.mp3\tLouis Armstrong's Hot Five\tWild Man Blues\tOKEH\t8474\t80848-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC051224-1.mp3\tSidney Bechet N.o Feetwarmers\tWild Man Blues\tVICTOR\t26640B\t051224-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU38629-1.mp3\tJelly Roll Morton Trio\tWild Man Blues\tBLUEBIRD\t10256\t38629-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU22726.mp3\tJohnny Dodds Black Bottom St.\tWild Man Blues\tBRUNSWICK\t3567\t22726\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_187.mp3\tJohnny Dodds' Black Bottom Stompers\tWild Man Blues\tBRUNSWICK\t3567\t22726\t1927\t\nhttp://www.jazz-on-line.com/a/mp3d/Blu38629-1.mp3\tJelly-roll Morton's Red Hot Peppers\tWild Man Blues\tBluebird\tB-10256\t38629-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38723.mp3\tFletcher Henderson & His Orch\tWild Party\tDECCA\t342A\t38723\t1934\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC15915-1.mp3\tIna Ray Hutton And Her Melodears\tWild Party\tVOCALION\t2816\t15915-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/DEC38723-A.mp3\tFletcher Henderson And His Orchestra\tWild Party\tDECCA\t342\t38723-A  \t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban11826-1.mp3\tMills Blue Rhythm Band\tWild Waves\tBanner\t32493  \t11826-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/OKES71706.mp3\tClarence Williams\tWildcat Blues\tOKeh\t4925\tS71706\t1923\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN597x.mp3\tHank Penny\tWildcat Mama\tKING\t597\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC11126.mp3\tBen Bernie & His Orch\tWildflower\tVOCALION\t14555B\t11126\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_028.mp3\tBen Bernie And His Orchestra\tWildflower\tVOCALION\t14555B\t11126\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/QRSQ267.mp3\tClarence Williams & His Orch\tWildflower Rag\tQRS\t7033\tQ267\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45029-1.mp3\tCarter Family\tWildwood Flower\tVICTOR\t40000\t45029-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_023.mp3\tCarter Family\tWildwood Flower\tVICTOR\tVICTOR\t45029-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99920.mp3\tTommy Dorsey & His Orch\tWill I Ever Know?\tVICTOR\t25292\t99920\t1936\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU101133-1.mp3\tStew Pletcher And His Orchestra\tWill I Ever Know?\tBLUEBIRD\t6344\t101133-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_149.mp3\tJan Garber And His Orchestra\tWill I Ever Know?\tDecca\t732\t\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68075.mp3\tDelmore Brothers\tWill You Be Lonesome Too\tDECCA\t5925\t68075\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4613-1.mp3\tBill Monroe's Bluegrass Boys\tWill You Be Lovin' Another Man?\tCOLUMBIA\t37565\tCCO4613-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_037.mp3\tAlbert Campbell\tWill You Love Me In December As You Do In May?\tCOLUMBIA\t3324\t\t1906\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_021.mp3\tHaydn Quartet\tWill You Love Me In December As You Do In May?\tVictor\t4575\tB2925-4\t1906\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC45026-1.mp3\tCarter Family\tWill You Miss Me When I'm Gone\tVICTOR\t21638\t45026-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/MONV-4329c.mp3\tMacdonald-eddy\tWill You Remember - Farewell To Dreams\tMONARCH\tV-4329c\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru1480-1-2wpp.mp3\tLouis Armstrong And His Orchestra\tWill You, Wont Tou Be My Baby\tBrunswick\t500492\t1480-1/2wpp\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0233.mp3\tTempo King's Kings Of Tempo\tWilliam Tell\tBLUEBIRD\t6534\t0233\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2861-x.mp3\tSpike Jones And City Slickers\tWilliam Tell Overture\tRCA\t20-2861\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC37915.mp3\tErnie Rogers\tWillie The Chimney Sweeper\tVICTOR\t20502\t37915\t1927\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE80847-C.mp3\tLouis Armstrong And His Hot Seven\tWillie The Weeper\tOKEH\t8482\t80847-C\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BruE-5168.mp3\tKing Oliver And His Dixie Syncopators\tWillie The Weeper\tBrunswick\t80079\tE-5168\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCMEM88.mp3\tSwift Jewel Cowboys\tWillie The Weeper\tVOCALION\t5052\tMEM88\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60201-A.mp3\tMildred Bailey & Her Alleycats\tWillow Tree\tDECCA\t18108B\t60201-A\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic42566-1.mp3\tLouisiana Sugar Babes\tWillow Tree\tVictor\t21348\t42566-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15179x.mp3\tStan Kenton And His Orchestra\tWillow Weep For Me\tCAPITOL\t15179\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC73968.mp3\tPaul Whiteman And His Orch\tWillow Weep For Me\tVICTOR\t24187\t73968\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC3519.mp3\tCab Calloway & His Orch\tWillow Weep For Me\tOKEH\t6109\tC3519\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN4349WW.mp3\tMary Lou Williams\tWillow Weep For Me\tKING\t4349\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/CONS3275.mp3\tCozy Cole & His Orchestra\tWillow Weep For Me\tCONTIN\tT6001\tS3275\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_198.mp3\tTed Fio Rito And His Orchestra Feat. Muzzy Marcellino\tWillow Weep For Me\tBRUNSWICK\t6422\tSF21\t1932\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480525.mp3\tBen Webster And Harry Sweets Edison\tWillow Weep For Me\tClef\tMGC717\t2988-1\t1956\tBen Webster, Ts, Harry Sweets Edison, T, Joe Mondragon, B, Alvin Stoller, D, Barney Kessel, G, Jimmy Rowles, P\nhttp://www.jazz-on-line.com/a/mp3t/TS480625.mp3\tBen Webster And Harry Edison\tWillow Weep For Me\tVerve\tEPV5044\t20570-10\t1957\tBen Webster, Ts, Harry Sweets Edison, T, Jimmy Rowles, P, Barney Kessel, G, Joe Mondragon, Larry Bunker, D, Woody Herman, Vocal, from Songs for Hip Lovers\nhttp://www.jazz-on-line.com/a/mp3e/Col25286-1.mp3\tHarry James And His Orchestra\tWillow, Weep For Me\tColumbia\t35242\t25286-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW146495.mp3\tHaworth,carl\tWillows\tCOLUMBIA\t1502 D\tW146495\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_107.mp3\tWeavers (gordon Jenkins And His Orchestra)\tWimoweh\tDecca\t27928\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU61396.mp3\tAllen Brothers\tWindow Shade Blues\tBLUEBIRD\t5701\t61396\t1932\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBLU5701.mp3\tAllen Brothers\tWindow Shade Blues\tBLUEBIRD\t5701\t61396\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061541.mp3\tEarl Hines & His Orch\tWindy City Jive\tBLUEBIRD\t11329\t061541\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu061541-1.mp3\tEarl Hines And His Orchestra\tWindy City Jive\tBluebird\tB-11329\t061541-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Freddy Webster (tp) Joe McLewis, George Hunt, John Ewing (tb) Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck\nhttp://www.jazz-on-line.com/a/mp3b/Blu061541-1.mp3\tEarl Hines And His Orchestra\tWindy City Jive (bh Arr)\tBluebird\tB-11329\t061541-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/COLH1345-1.mp3\tAl Dexter And His Troopers\tWine Women And Song\tCOLUMBIA\t37062\tH1345-1\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU041459.mp3\tJelly Roll Morton Jazzmen\tWinin' Boy Blues\tBLUEBIRD\t10429\t041459\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/JazMLB-147.mp3\tJelly-roll Morton\tWinin' Boy Blues\tJazz Man\t11\tMLB-147\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu041459-2.mp3\tJelly-roll Morton's New Orleans Jazzmen\tWinin' Boy Blues\tBluebird\tB-10429\t041459-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_284.mp3\tPlatters\tWinner Take All\tMercury\t70819\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COL31811-1.mp3\tBenny Goodman And His Orchestra\tWinter Weather\tCOLUMBIA\t38283\t31811-1\t1941\tvocal Peggy Lee\nhttp://www.jazz-on-line.com/a/mp3w/1942_274.mp3\tBenny Goodman And His Orchestra Feat. Peggy Lee And Lee And Art Lund\tWinter Weather\tOKEH\t6516\t31811-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP316x.mp3\tJohnny Mercer\tWinter Wonderland\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLC825.mp3\tTed Weems And His Orch\tWinter Wonderland\tCOLUMBIA\t2976 D\tC825\t1934\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC23722.mp3\tAndrews Sisters\tWinter Wonderland\tDECCA\t23722\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC38909.mp3\tGuy Lombardo's Royal Canadians\tWinter Wonderland\tDECCA\t294A\t38909\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_048.mp3\tJohnny Mercer\tWinter Wonderland\tCapitol\t316\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_267.mp3\tAndrews Sisters Feat. O/guy Lombardo\tWinter Wonderland\tDECCA\t23722\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_292.mp3\tPerry Como Feat. Russell Case's Orchestra And The Satisfiers\tWinter Wonderland\tRCA Victor\t1968\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC8757-1.mp3\tHal Kemp And His Orch\tWintergreen For President\tBRUNSWICK\t6416\tC8757-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61389-A.mp3\tWoody Herman & His Orch.\tWintertime Dreams\tDECCA\t1056\t61389-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149690.mp3\tSeven Gallon Jug Band\tWipe 'em Off\tCOLUMBIA\t2087\tW149690\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VICOGF28.mp3\tGracie Fields\tWish Me Luck\tVICTOR\t26377\tOGF28\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-4830x.mp3\tEddie Fisher\tWish You Were Here\tRCA\t20-4830\t20-4830x\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_014.mp3\tEddie Fisher\tWish You Were Here\tRCA\t20-4830\t20-4830x\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_219.mp3\tJane Froman Feat. O/sid Feller\tWish You Were Here\tCapitol\t2154\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D715WYW.mp3\tMildred Bailey\tWish You Were Waiting\tV-DISC\t715\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_233.mp3\tGinny Simms\tWish You Were Waiting For Me\tCOLUMBIA\t36753\tHCO1074\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC68560.mp3\tElla Fitzgerald & Her Orch\tWishful Thinking\tDECCA\t3612A\t68560\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC82328.mp3\tColeman Hawkins & His Orch\tWishin'\tDECCA\t28056\t82328\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_133.mp3\tEddy Howard And His Orchestra\tWishin'\tMERCURY\t5784\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_262.mp3\tEileen Barton Feat. Paul Nelson's Orchestra\tWishin'\tCoral\t60651\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148693-3.mp3\tFred Rich & His Orch\tWishing And Waiting For Love\tCOLUMBIA\t1924 D\tW148693-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU035729.mp3\tGlenn Miller And His Orch\tWishing Will Make It So\tBLUEBIRD\t10219\t035729\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26212.mp3\tSkinnay Ennis & His Orchestra\tWishing Will Make It So\tVictor\t26212\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480494.mp3\tArt Farmer New Jazz Stars\tWisteria\tPrestige\tLP177\t552\t1954\tArt Farmer, T, Flh, Horace Silver, P, Percy Heath, B, Kenny Clarke, D\nhttp://www.jazz-on-line.com/a/mp3c/DEC62059.mp3\tGlenn Miller's Orchestra\tWistful And Blue\tDECCA\t1284\t62059\t1937\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec1284.mp3\tGlenn Miller's Orchestra\tWistful And Blue\tDecca\t1284\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_111.mp3\tRuth Etting\tWistful And Blue\tCOLUMBIA\t924 D\tW142958\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/VOC16012-1.mp3\tIna Ray Hutton And  Her Melodears\tWitch Doctor\tVOCALION\t2816\t16012-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVOC2816.mp3\tIna Ray Hutton And Her Melodears\tWitch Doctor\tVOCALION\t2816\t16012-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_453.mp3\tJo Stafford\tWith A Little Bit Of Luck\tColumbia\t40718\tRHCO 33820\t1956\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_442.mp3\tPercy Faith And His Orchestra\tWith A Little Bit Of Luck\tColumbia\t40696\tCO55842\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC50949-2.mp3\tLeo Reisman And His Orch\tWith A Song In My Heart\tVICTOR\t21923\t50949-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480928.mp3\tTed Heath And His Music\tWith A Song In My Heart\tDECCA-LONDON\t1058\tDR-14259\t1949\tBobby Pratt, Stan Roderick, Stan Reynolds, Ronnie Hughes (tp) Jackie Armstrong, Maurice Pratt, Jack Bentley, Jimmy Coombes (tb) Les Gilbert, Reg Owen (as) Tommy Whittle, Henry Mackenzie (ts) Dave Shand (bar) Dave Simpson (p) Jack Seymour (b) Jack Parnell (d) Ted Heath (dir) \nhttp://www.jazz-on-line.com/a/mp3r/RiCol36075.mp3\tKay Kyser & His Orchestra\tWith A Twist Of The Wrist\tColumbia\t36075\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_293.mp3\tAl Donahue And His Orchestra Feat. Phil Brito\tWith A Twist Of The Wrist\tOKEH\t6012\t29441\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1926_1100_04.mp3\tLee Morse\tWith All My Heart\tPerfect\t11636B\t\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_132.mp3\tGlen Gray And Casa Loma Orchestra, Feat. Kenny Sargent V\tWith All My Heart\tDECCA\t652\t60234-A\t1936\tGrady Watts (tp), Sonny Dunham (tp, tb), Pee Wee Hunt (tb, vo), Billy Rauch, Fritz Hummel (tb), Glen Gray (as, ldr), Clarence Hutchinrider (cl, as), Art Ralston (as, ob, bsn), Kenny Sargent, Pat Davis (ts), Mel Jenssen (vn), Joe Hall (p), Jack Blanchette (g), Stanley Dennis (bb, sb), Tony Briglia (dm)\nhttp://www.jazz-on-line.com/a/mp3b/COL16709-1.mp3\tRed Norvo's Swing Octet\tWith All My Heart And Soul\tCOLUMBIA\t3026 D\t16709-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_286.mp3\tPerry Como And Fontane Sisters Feat. O/mitchell Ayres\tWith All My Heart And Soul\tRCA Victor\t4269\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47357.mp3\tErroll Garner (piano)\tWith Every Breath I Take\tCOLUMBIA\t39749\tCO47357\t1952\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA70-A.mp3\tBing Crosby W George Stoll\tWith Every Breath I Take\tDECCA\t309A\tDLA70-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/DecDLA70-B.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tWith Every Breath I Take\tDecca\t309\tDLA70-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BruDLA70-A.mp3\tGeorgie Stoll And His Orchestra With Bing Crosby\tWith Every Breath I Take\tBrunswick\tE01951\tDLA70-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_075.mp3\tByron G. Harlan\tWith His Hands In His Pockets And His Pockets In His Pants\tEDISON\tBA 3124\t5173\t1917\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62449-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWith Love In My Heart\tDecca\t1477\t62449-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC82509.mp3\tIsham Jones & His Orch\tWith My Eyes Wide Open\tVICTOR\t24643\t82509\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/MER5344x.mp3\tPatti Page Qt\tWith My Eyes Wide Open, I'm Dreaming\tMERCURY\t5344\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3/Joh002.mp3\tSidney Kite And His Piccadilly Hotel Band\tWith Out A Word Of Warning\tJohnW\t002\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC61583.mp3\tInk Spots\tWith Plenty Of Money And You\tDECCA\t1154\t61583\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA725.mp3\tArt Tatum\tWith Plenty Of Money And You\tDECCA\t1198\tDLA725\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/MAJT1425.mp3\tJohnny Guarnieri\tWith Plenty Of Money And You\tMAJESTIC\t1228\tT1425\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_029.mp3\tHenry Busse And His Orchestra Feat. Bob Hannon\tWith Plenty Of Money And You\tDECCA\t1076A\tC90996-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_203.mp3\tGeorge Hamilton Dir. The Veloz And Yolanda Dancing Music\tWith Plenty Of Money And You\tVICTOR\t25458\t02432-1\t1936\tLee Norton (vo), Kenneth Robison (tp), Stanley Loye, Kenneth Brackett, Walter Robison (as, ts), George Hamilton (vn, ldr), Emil Briano (vl), Rex Koury (p), Jerry Shelton (pac), Lee Allen (g), Louis Chicco (harp), Harold George (sb), Judd Ferguson (dm)\nhttp://www.jazz-on-line.com/a/mp3a/DECC90996-A.mp3\tHenry Busse And His Orch\tWith Plenty Of Money And You (vbob Hannon)\tDECCA\t1076A\tC90996-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480398.mp3\tArt Farmer\tWith Prestige\tNewJazz\tLP8203\t1024\t1956\tArt Farmer, T, FLH, Hank Mobley, Ts, Kenny Drew, P, Addison Farmer, B, Elvin Jones, D\nhttp://www.jazz-on-line.com/a/mp3t/TS480795.mp3\tArt Farmer\tWith Prestige\tNew Jazz\tLP 8203\t1024\t1953\tArt Farmer, T, FLH, Hank Mobley, Ts, Kenny Drew, P, Addison Farmer, B, Elvin Jones, D\nhttp://www.jazz-on-line.com/a/mp3e/BRUJC8636.mp3\tBing Crosby W Lennie Hayton\tWith Summer Coming On\tBRUNSWICK\t6329\tJC8636\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP216x.mp3\tWesley Tuttle\tWith Tears In My Eyes\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67189.mp3\tBob Crosby And His Orch\tWith The Wind And The Rain In Your Hair\tDECCA\t3018A\t67189\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_263.mp3\tBob Chester And His Orchestra Feat. V/dolores O'neill\tWith The Wind And The Rain In Your Hair\tBluebird\t10614\t47019\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_052.mp3\tBob Crosby And His Orchestra\tWith The Wind And The Rain In Your Hair\tDecca\t3018\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh203.mp3\tThe Organ, The Dance Band And Me (billy Thorburn)\tWith The Wind And The Rain In Your The Hair (v George Barclay)\tParlophone\tF-1709\tCE-10419-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20106-2.mp3\tTeddy Wilson And His Orchestra\tWith Thee I Swing\tBrunswick\t7768  \tB-20106-2  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_052.mp3\tEddie Fisher\tWith These Hands\tRCA Victor\t5365\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D42A1.mp3\tGoldman Band\tWith Trumpet And Drums\tv-disk\t42A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/OKe403792-B.mp3\tCarl Webster's Yale Collegians\tWith You\tOKeh\t41393\t403792-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23463.mp3\tMildred Bailey\tWith You On My Mind\tCBS\t(Reject)\t23463\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu42758.mp3\tArtie Shaw And His Orchestra\tWithout A Dream To My Name\tBluebird\t10468\t042758-1\t1939\tVocal refrain by Helen Forrest\nhttp://www.jazz-on-line.com/a/mp3b/Blu042758-1.mp3\tArtie Shaw And His Orchestra\tWithout A Dream To My Name ? V H F\tBluebird\tB-10468\t042758-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_397.mp3\tJudy Garland\tWithout A Memory\tCOLUMBIA\t40010\tRHCO10466\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC19581.mp3\tErskine Hawkins Bama St Colleg\tWithout A Shadow Of A Doubt\tVOCALION\t3289\t19581\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149125-3.mp3\tPaul Whiteman And His Orch\tWithout A Song\tCOLUMBIA\t2023 D\tW149125-3\t1929\t\nhttp://www.jazz-on-line.com/mp3/250648498.mp3\tTommy Dorsey Orch V Frank Sinatra\tWithout A Song\tVICTOR\t36396\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLZSP6407.mp3\tEddie Heywood\tWithout A Song\tCOLUMBIA\t39316\tZSP6407\t\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC123.mp3\tBilly Eckstine & His Orch\tWithout A Song\tNATIONAL\t\tNSC123\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW149125-3.mp3\tPaul Whiteman And His Orchestra (bing Crosby Solo)\tWithout A Song\tColumbia\t\tW149125-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_217.mp3\tRoy Hamilton\tWithout A Song\tCoral\t61496\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39856.mp3\tBing Crosby & Dorsey Brothers\tWithout A Word Of Warning\tDECCA\t548A\t39856\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Bru39856-A.mp3\tDorsey  Brothers  Orchestra With Bing Crosby\tWithout A Word Of Warning\tBrunswick\tE02083\t39856-A \t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh190.mp3\tSidney Kite\tWithout A Word Of Warning\t\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh002.mp3\tSidney Kyte And His Piccadilly Hotel Band\tWithout A Word Of Warning (v Gerry Fitzgerald)\tPanachord\t25801\tTB-2049-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3h/GEN16346.mp3\tHarold Austin's Ambassadors\tWithout My Gal\tGENNETT\t7147\t16346\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO48392.mp3\tMitch Miller\tWithout My Love\tCOLUMBIA\t39901\tCO48392\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN11016-1-2.mp3\tCab Calloway & His Orchestra\tWithout Rhythm\tBANNER\t32378\t11016-1-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11016-1.mp3\tCab Calloway And His Orchestra\tWithout Rhythm\tBanner\t32378\t11016-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_121.mp3\tAmbrose And His Orchestra\tWithout That Certain Thing\tBRUNSWICK\t6755\t14657\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC68235-1.mp3\tBlanche Calloway & Her Orch\tWithout That Gal\tVICTOR\t22733\t68235-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC68244-1.mp3\tHenny Hendrickson's Louisville Serenaders\tWithout That Gal\tVICTOR\t22750\t68244-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151588-1.mp3\tGuy Lombardo Royal Canadians\tWithout That Gal (v C L)\tCOLUMBIA\t2475 D\tW151588-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480627.mp3\tBlanche Calloway And Her Joy Boys\tWithout That Gal!\tVictor\t22733\t68235-1\t1931\tBlanche Calloway (vo), Joe Keyes, Edgar Battle, Clarence Smith (tp), Alton Moore, Herb Alvis (tb), Booker Pitman (cl, as), Leroy Hardy (as), Ben Webster (ts), Clyde Hart (p), Andy Jackson (bj, g), Joe Durham (bb), Cozy Cole (dm)\nhttp://www.jazz-on-line.com/a/mp3b/DEC69916.mp3\tBuddy Johnson & His Band\tWithout The One You Love\tDECCA\t8616\t69916\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC63295.mp3\tEdgar Hayes & His Orchestra\tWithout You\tDECCA\t2193B\t63295\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU9408.mp3\tGene Rodemich And His Orchestra\tWithout You\tBRUNSWICK\t2398A\t9408\t1922\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3w/1946_282.mp3\tFrankie Carle And His Orchestra Feat. Marjorie Hughes\tWithout You\tCOLUMBIA\t37069\tCO35987\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_244.mp3\tEddie Fisher\tWithout You\tRCA\t6470\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC43635-2.mp3\tGene Austin\tWithout You Sweetheart\tVICTOR\t21374\t43635-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE25976.mp3\tNick Lucas\tWithout You Sweetheart\tBRUNSWICK\t3773\tE25976\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_241.mp3\tNat Shilkret And The Victor Orchestra\tWithout You Sweetheart\tVICTOR\t21259\t43107-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1928_045.mp3\tGene Austin Feat. O/nat Shilkret\tWithout You, Sweetheart\tVICTOR\t21374\t43635-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS21252-1.mp3\tBillie Holiday & Her Orch\tWithout Your Love\tCBS\tVO3593\t21252-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035706-2.mp3\tLionel Hampton & His Orch\tWizzin' The Wiz\tVICTOR\t26233\t035706-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_150.mp3\tLionel Hampton And His Orchestra\tWizzin' The Wiz\tVICTOR\t26233\t035706-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic035706-2.mp3\tLionel Hampton And His Orchestra\tWizzin' The Wizz\tVictor\t26233\t035706-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec64463-A.mp3\tElla Fitzgerald And Her Savoy Eight\tWoe Is Me\tDecca\t2202\t64463-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480742.mp3\tBen Webster Quintet\tWoke Up Clipped\tCircle\tCLP42\tN1633-1\t1944\tHot Lips Page (tp), Ben Webster (ts), Clyde Hart (p), Charlie Drayton (sb), Denzil Best (dm)\nhttp://www.jazz-on-line.com/a/mp3a/VIC38663-1.mp3\tJelly Roll Morton (piano)\tWolverine Blues\tVICTOR\t21064\t38663-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26165A.mp3\tJack Teagarden & His Orch\tWolverine Blues\tCOLUMBIA\t35297\t26165A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67324.mp3\tLouis Armstrong & His Orch.\tWolverine Blues\tDECCA\t3105B\t67324\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VARM412-1.mp3\tJoe Marsala Chicagoans\tWolverine Blues\tVARIETY\tI565\tM412-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/GENG11357-B.mp3\tNew Orleans Rhythm Kings\tWolverine Blues\tGENNETT\t5102A\tG11357-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC63272-A.mp3\tBob Crosby & His Orch\tWolverine Blues\tDECCA\t3340A\t63272-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU10908.mp3\tGene Rodemich And His Orchestra\tWolverine Blues\tBRUNSWICK\t2455B\t10908\t1923\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3d/Vic38663-1.mp3\tJelly-roll Morton's Red Hot Peppers\tWolverine Blues\tVictor\t21064\t38663-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_063.mp3\tJohnny Desmond\tWoman\tCoral\t61069\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3b/COL140166-6.mp3\tBessie Smith\tWoman's Trouble Blues\tCOLUMBIA\t14060 D\t140166-6\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO2533.mp3\tDuke Ellington's Orch\tWomen, They'll Get You\tCOLUMBIA\t38576\tHCO2533\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU62909-2.mp3\tBennie Moten & His Orch\tWon't You Be My Baby?\tBLUEBIRD\t6711A\t62909-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1907_082.mp3\tHenry Burr\tWon't You Come Over To My House?\tCOLUMBIA\t3603\t\t1907\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic57928-1.mp3\tFats Waller And His Buddies\tWon't You Get Off It, Please\tVictor\tV-38119\t57928-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/CONMEM37.mp3\tHank Penny's Radio Cowboys\tWon't You Ride In My Little Red Wagon\tCONQUEROR\t9392\tMEM37\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC38052-3.mp3\tThomas Morris W Fats Waller\tWon't You Take Me Home\tVICTOR\t20776\t38052-3\t1927\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU13293.mp3\tGene Rodemich And His Orchestra\tWond'ring Blues\tBRUNSWICK\t2663b\t13293\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3w/1951_301.mp3\tKen Carson Feat. Oc/ Hal Kanner\tWond'rous Word (of The Lord)\tSILVERSTONE\t770\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC65121.mp3\tCliff Bruner's Texas Wanderers\tWonder Stomp (a. Scanlin)\tDECCA\t5681\t65121\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_175.mp3\tSammy Kaye And His Orchestra\tWonder When My Baby's Coming Home\tVictor\t27922\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_234.mp3\tJimmy Dorsey And His Orchestra (vocal Helen O'connell)\tWonder When My Baby's Coming Home\tDecca\t18382\t\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL6856.mp3\tDanny Kaye W Gordon Jenkins Or\tWonderful Copenhagen\tDECCA\t28379\tL6856\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048486.mp3\tGlenn Miller & His Orch\tWonderful One\tBLUEBIRD\t10701\t048486\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC29532.mp3\tHenry Burr\tWonderful One\tVICTOR\t19282\t29532\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_155.mp3\tHenry Burr\tWonderful One\tVICTOR\t19282\t29532\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/COL78699-5.mp3\tArt Hickman Trio\tWonderful Pal - One Step (intro Sweet Baby)\tCOLUMBIA\tA-2839\t78699-5\t1919\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD9VB1897.mp3\tCount Basie & His Orchestra\tWonderful Thing\tRCA\t(VIC-LP)\tD9VB1897\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO4460.mp3\tFrankie Laine\tWonderful, Wasn't It\tCOLUMBIA\t39489\tHCO4460\t\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC46364x.mp3\tWebb Pierce\tWondering\tDECCA\t46364\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03682-2.mp3\tBilly Murray And Ada Jones\tWont You Be My Honey\tCOLUMBIA\tA-0463\t03682-2\t1907\t\nhttp://www.78-tours.net/mp3/VOGV3106s.mp3\tSidney Bechet Claude Luter Et Son Orchestre\tWont You Please Come Home, Bill Bailley\tVOGUE\tV. 5066\tV. 3106 s\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCM780.mp3\tJoe Marsala Chicagoans\tWoo Woo\tVOCALION\t4116\tM780\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/COLB24061-2.mp3\tHarry James And The Boogie Woogie Trio\tWoo-woo\tCOLUMBIA\t35958\tB2461\t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-24061-1.mp3\tHarry James And The Boogie Woogie Trio\tWoo-woo\tBrunswick\t8318\tB-24061-1  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU7729.mp3\tSmoky Wood's Woodchips\tWoodchip Blues\tBLUEBIRD\t7729\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4690-1.mp3\tWoody Herman And His Orch\tWoodchopper's Ball\tCOLUMBIA\t37238\tCCO4690-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_147.mp3\tWill Glahe\tWoodpecker\tVictor\tV-743\t\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2676.mp3\tWoody Herman & His Orch\tWoodsheddin' With Woody\tDECCA\t3972B\tDLA2676\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC10801.mp3\tBob Roberts\tWoodsman Spare That Tree\tVICTOR\t16909\t10801\t1911\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO3108.mp3\tKay Kyser And His Orch\tWoody Woodpecker\tCOLUMBIA\t38197\tHCO3108\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4838.mp3\tDanny Kaye And Andrews Sisters\tWoody Woodpecker\tDECCA\t24462\tL4838\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_136.mp3\tAndrews Sisters And Danny Kaye\tWoody Woodpecker\tDECCA\t24462\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15145x.mp3\tMel Blanc\tWoody Woodpecker Polka\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc13926.mp3\tFletcher Henderson And His Orchestra\tWords\tVocalion\t\t13926  \t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU58544-1.mp3\tMckinney's Cotton Pickers\tWords Can't Express The Way I Feel\tBLUEBIRD\t5205\t58544-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol14032-D.mp3\tBessie Smith\tWork House Blues\tColumbia\t14032-D\t\t1924\t\nhttp://www.jazz-on-line.com/a/mp3e/COL81883-2.mp3\tBessie Smith\tWork House Blues\tCOLUMBIA\t14032 D\t81883-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe08486-B.mp3\tKing Oliver's Jazz Band\tWorking Man Blues\tOKeh\t40034\t08486-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/Gen11636-B.mp3\tKing Oliver's Creole Jazz Band\tWorking Man's Blues\tGennett\t5275\t11636-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COL31573-1.mp3\tBrownie Mcghee\tWorkingman's Blues\tCOLUMBIA\t37460\t31573-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3l/COL81660-3.mp3\tPaul Specht And His Orchestra\tWorried\tCOLUMBIA\t118D\t81660-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/SAVS5492.mp3\tDon Byas Qt\tWorried And Blue\tSAVOY\t582\tS5492\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU064190-1.mp3\tBig Maceo (merriweather)\tWorried Life Blues\tBLUEBIRD\t8827\t064190-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC71239.mp3\tAndy Kirk & Clouds Of Joy\tWorried Life Blues\tDECCA\t4381A\t71239\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec71239-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWorried Life Blues (someday, Baby)\tDecca\t4381\t71239-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3c/GENX1011.mp3\tJohn Fox (sam Collins)\tWorried Man Blues\tGENNETT\t6352\tX1011\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_142.mp3\tCarter Family\tWorried Man Blues\tVICTOR\t40317A\t59987-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/CONDAL1058-2.mp3\tTed Daffan's Texans\tWorried Mind\tCONQUEROR\t9699A\tDAL1058-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1441.mp3\tRed Norvo & His Orch\tWorried Over You\tBRUNSWICK\t7970\tLA1441\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21732-1.mp3\tFletcher Henderson And His Orchestra\tWorried Over You\tVocalion\t3713\t21732-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62133-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tWorried Over You\tDecca\t1303\t62133-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/BruB-16542-A.mp3\tLouis Prima And His New Orleans Gang\tWorry Blues\tBrunswick\t7371\tB-16542-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN11606-2.mp3\tBig Bill (broonzy)\tWorryin You Off My Mind #1\tBANNER\t32559\t11606-2\t\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU141CH.mp3\tGene Rodemich And His Orchestra\tWorrying Blues\tBRUNSWICK\t2731B\t141CH\t1924\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3a/MER5571x.mp3\tPatti Page\tWould I Love You\tMERCURY\t5571\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_070.mp3\tDoris Day Feat. Harry James Orchestra\tWould I Love You (love You, Love You)\tCOLUMBIA\t39159\tHCO4413\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA2011.mp3\tOrrin Tucker And His Orch\tWould Ja Mind\tCOLUMBIA\t35328\tLA2011\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA115-B.mp3\tGuy Lombardo\tWould There Be Love?\tDECCA\t425B\tDLA115-B\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/OKe74443-A.mp3\tClarence Williams Blue 7\tWould Ya\tOKeh\t8443\t74443-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU101531.mp3\tGeorge Hall And His Orch\tWould You\tBLUEBIRD\t6378\t101531\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU76865-1.mp3\tJimmie Davis\tWould You\tBLUEBIRD\t5359\t76865-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1906_073.mp3\tArthur Collins And Byron Harlan\tWould You Leave Your Happy Home For Me?\tCOLUMBIA\t33018\t03514-2\t1906\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL6528-A.mp3\tL.armstrong-ella Fitzgerald\tWould You Like To Take A Walk\tDECCA\t28552\tL6528-A\t1951\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC67788-1.mp3\tRudy Vallee And His Ct.yankees\tWould You Like To Take A Walk?\tVICTOR\t22611\t67788-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_053.mp3\tRudy Vallee And His Connecticut Yankees\tWould You Like To Take A Walk?\tVICTOR\t22611\t67788-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480673.mp3\tArt Tatum\tWould You Like To Take A Walk?\tClef\tEP-C-350\t1464-1\t1955\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3t/TS480813.mp3\tArt Tatum\tWould You Like To Take A Walk?\tClef\tEP-C-350\t1464-1\t1953\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3w/1919_068.mp3\tArthur Fields\tWould You Rather Be A Colonel With An Eagle On Your Shoulder Or A Private With A Chicken On Your Kne\tColumbia\t2669\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe1109.mp3\tArthur Fields\tWould You Rather Be A Colonel?\tOKeh\t1109\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3464.mp3\tBing Crosby & Eddy Condon\tWould You?\tDECCA\t18790B\tL3464\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_053.mp3\tHenry King And His Orchestra\tWould You?\tDECCA\t760A\t60949-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_294.mp3\tBing Crosby\tWould You?\tDECCA\t91611\tDLA322-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_069.mp3\tGeorge Hall And His Orchestra\tWould You?\tBLUEBIRD\t6378\t101531\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67029.mp3\tWoody Herman & His Orchestra\tWouldja Mind?\tDECCA\t2970A\t67029\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COL01688.mp3\tBob Roberts\tWouldn't It Make You Hungry?\tCOLUMBIA\tBS\t01688\t1903\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE37161.mp3\tMildred Bailey\tWrap Your Troubles In Dreams\tBRUNSWICK\t6184\tE37161\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC61077-2.mp3\tBing Crosby\tWrap Your Troubles In Dreams\tVICTOR\t22701\t61077-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD449.mp3\tRoy Eldridge Sextet\tWrap Your Troubles In Dreams\tDISC\t151\tD449\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe405060-2.mp3\tLouis Armstrong & His Orch\tWrap Your Troubles In Dreams\tOKeh\t41530\t405060-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/MERYW601.mp3\tFrankie Laine W Carl Fischer\tWrap Your Troubles In Dreams\tMERCURY\t1026\tYW601\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU068714-1.mp3\tErskine Hawkins & His Orch\tWrap Your Troubles In Dreams\tBLUEBIRD\t11485\t068714-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1422-1.mp3\tFrankie Trumbauer & Ho\tWrap Your Troubles In Dreams\tVARSITY\t8269\tUS1422-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/CAP588.mp3\tColeman Hawkins & His Orch\tWrap Your Troubles In Dreams\tCAPITOL\t\t588\t\t\nhttp://www.jazz-on-line.com/a/mp3c/SAV5451.mp3\tCozy Cole Allstars\tWrap Your Troubles In Dreams\tSAVOY\t512B\t5451\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/AtlRK3.mp3\tFantasy For Clarinet And Strings With Barney Bigard\tWrap Your Troubles In Dreams\tAtlantic\tEP 528\tRK3\t1944\t\nhttp://www.jazz-on-line.com/a/mp3h/BruB-22809-1.mp3\tHarry James And His Orchestra\tWrap Your Troubles In Dreams\tBrunswick\t8178\tB-22809-1  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1942_256.mp3\tErskine Hawkins And His Orchestra\tWrap Your Troubles In Dreams\tBluebird\t11485\t068714-1\t1942\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic70495-1.mp3\tMckinney's Cotton Pickers\tWrap Your Troubles In Dreams (and Dream Your Troubles Away)\tVictor\t22811\t70495-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU02897-1.mp3\tFrank Tanner's Rhythm Kings\tWrappin It Up\tBLUEBIRD\tB-6686\t02897-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC38604-B.mp3\tFletcher Henderson & His Orch\tWrappin' It Up\tDECCA\t157B\t38604-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec38604-B.mp3\tFletcher Henderson And His Orchestra\tWrappin' It Up\tDecca\t157\t38604-B\t1934\t\nhttp://www.jazz-on-line.com/a/mp3o/KIN716x.mp3\tCurley Fox\tWreck Of The 1256\tKING\t716\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC30632-4.mp3\tVernon Dalhart\tWreck Of The Old 97\tVICTOR\t19427A\t30632-4\t1924\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC67275.mp3\tDick Robertson And His Orch\tWreck Of The Old 97\tDECCA\t3125A\t67275\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/OKe81450-A.mp3\tTram Bix And Lang\tWringin' An' Twistin'\tOKeh\t40916\t81450-A\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW81450.mp3\tFrankie Trumbauer & His Orch\tWringin' And Twistin'\tCOLUMBIA\t37806\tW81450\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149904.mp3\tCharlie Poole N.carolina Ramb.\tWrite A Letter To My Mother\tCOLUMBIA\t15711\tW149904\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/NATNSC269.mp3\tRavens\tWrite Me A Letter\tNATIONAL\t9038\tNSC269\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_293.mp3\tRavens\tWrite Me A Letter\tMERCURY\t70554\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC71528.mp3\tJay Mcshann & His Orchestra\tWrong Neighborhood\tDECCA\t48037\t71528\t1943\t\nhttp://www.jazz-on-line.com/a/mp3c/APO362WB.mp3\tWynonie Harris W Jack Mcvea\tWynonie's Blues\tAPOLLO\t362\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_089.mp3\tCharles Hart\tWyoming (lullaby)\tVICTOR\t18740\t24945\t1921\t\nhttp://www.jazz-on-line.com/a/mp3e/VOC7150.mp3\tElliot Shaw And Charles Hart\tWyoming Lullaby\tVOCALION\t14162B\t7150\t1921\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU040476.mp3\tEarl Hines & His Orch\tX Y Z\tBLUEBIRD\t10531\t040476\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035033.mp3\tBunny Berigan & His Orch\tY' Had It Comin' To You\tVICTOR\t26196A\t035033\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL7461.mp3\tBing Crosby\tY'all Come\tDECCA\t28969\tL7461\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_132.mp3\tBing Crosby\tY'all Come\tDECCA\t28969\tL7461\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC53012-2.mp3\tBennie Moten's Kansas Orch\tYa Got Love\tVICTOR\t22680\t53012-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC025330.mp3\tTommy Dorsey & His Orch\tYa Got Me\tVICTOR\t26030\t025330\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_160.mp3\tKay Kyser And His Orchestra\tYa Got Me\tCBS\tBR8220\t23377-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC35353-2.mp3\tGene Austin\tYa Gotta How To Love\tVICTOR\t20044\t35353-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU19502-3.mp3\tEsther Walker\tYa Gotta Know How To Love\tBRUNSWICK\t3215\t19502-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_089.mp3\tGene Austin\tYa Gotta Know How To Love\tVICTOR\t20044\t35353-2\t1926\t\nhttp://www.jazz-on-line.com/a/mp3b/COLHCO4129.mp3\tKid Ory Creole Dixieland Band\tYaaka Hula Hickey Dula\tCOLUMBIA\t38958\tHCO4129\t1950\t\nhttp://www.jazz-on-line.com/a/mp3o/GOO99999a.mp3\tGeorge Lewis\tYaaka Hula Hickey Dula\tGood Time Jazz\t99999a\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_020.mp3\tAl Jolson\tYaaka Hula Hickey Dula\tCOLUMBIA\tA-1956\t46337\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_094.mp3\tArthur Collins And Byron Harlan\tYaaka Hula Hickey Dula\tVICTOR\t18014\t17330-3\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU027294-1.mp3\tFats Waller And His Rhythm\tYacht Club Swing\tBLUEBIRD\t10035\t027294-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/ARCB13470.mp3\tStoopnagle & Bud\tYacht Sale\tARC\t(ARC-?)\tB13470\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3751.mp3\tBing Crosby & Judy Garland\tYah Ta-ta Yah Ta-ta\tDECCA\t23410\tL3751\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_059.mp3\tBing Crosby And Judy Garland Feat. Joseph Lilley's Orchestra\tYah-ta-ta, Yah-ta-ta (talk, Talk, Talk)\tDECCA\t23410\tL3751\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10245-2.mp3\tCab Calloway & His Orchestra\tYaller\tBANNER\t32062\t10245-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63386-A.mp3\tBob Crosby & His Orch\tYancey Special\tDECCA\t3834 A\t63386-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC044006-1.mp3\tJimmy Yancey\tYancey Stomp\tVICTOR\t26589\t044006-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/ASC732.mp3\tMeade Lux Lewis\tYancey's Pride\tASCH\t352-1\t732\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS5008.mp3\tLord Beginner & Invader\tYankee Dollar\tDISC\t5008\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC26853.mp3\tBilly Murray - Edward Smalle\tYankee Doodle Blues\tVICTOR\t18959\t26853\t1922\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03051-2.mp3\tBilly Murray (tenor)\tYankee Doodle Boy\tCOLUMBIA\tA-0298\t03051-2\t1905\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03904!.mp3\tBilly Murray (tenor Solo)\tYankee Doodle Come To Town\tCOLUMBIA\tA-0583\t03904!\t1907\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC96500.mp3\tBenny Goodman And His Orchestra\tYankee Doodle Never Went To Town\tVICTOR\t25193\t96500\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC96500.mp3\tBenny Goodman And His Orchestra\tYankee Doodle Never Went To Town\tVICTOR\t25193\t96500\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18197-1.mp3\tTeddy Wilson & His Orch\tYankee Doodle Never Went To Town (vbh)\tBRUNSWICK\t7550\t18197-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC38173-4.mp3\tRevelers\tYankee Rose\tVICTOR\t20564\t38173-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBan1908y.mp3\tHollywood Dance Orchestra\tYankee Rose\tBanner\t1908\t\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1927_233.mp3\tRevelers\tYankee Rose\tVICTOR\t20564\t38173-4\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/VICB6420-2.mp3\tArthur Pryor's Band\tYankee Shuffle March\tVICTOR\t16795\tB6420-2\t1908\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73556.mp3\tRoy Eldridge & His Orchestra\tYard Dog\tDECCA\t23697\t73556\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69682.mp3\tJimmie Lunceford & His Orch\tYard Dog Mazurka\tDECCA\t4032B\t69682\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec69682-A.mp3\tJimmie Lunceford And His Orchestra\tYard Dog Mazurka\tDecca\t4032\t69682-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2750.mp3\tWoody Herman's 4 Chips\tYardbird Shuffle\tDECCA\t4353A\tDLA2750\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38544.mp3\tClaude Thornhill & His Orch.\tYardbird Suite\tCOLUMBIA\t39133\tCO38544\t1947\t\nhttp://www.jazz-on-line.com/a/mp3h/VIC45486-2.mp3\tMemphis Stompers\tYea Alabama\tVICTOR\t21709\t45486-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/VARC2092.mp3\tScorpion Washboard Band\tYeah Man\tVARSITY\t6003\tC2092\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D495.mp3\tCount Basie & His Orch\tYeah Man - Rhythm Man\tV-DISC\t175\t495\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc138327-1.mp3\tFletcher Henderson And His Orchestra\tYeah Man!\tVocalion\t2527\t138327-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0400_01.mp3\tLee Morse\tYearning\tPathe\t025140A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_014.mp3\tGene Austin\tYearning (just For You)\tVICTOR\t19625\t32092-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_059.mp3\tTommy Dorsey And His Orchestra Feat. Jack Leonard\tYearning (just For You)\tVICTOR\t25815\t021120-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021120-2.mp3\tTommy Dorsey & His Orch\tYearning - Just For You\tVICTOR\t25815\t021120-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19565-2.mp3\tDuke Ellington's Orch\tYearning For Love\tBRUNSWICK\t7752\t19565-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_238.mp3\tDuke Ellington And His Famous Orchestra\tYearning For Love\tBRUNSWICK\t7752\t19565-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-19565-2.mp3\tDuke Ellington And His Orchestra\tYearning For Love (lawrence's Concerto)\tBrunswick\t7752\tB-19565-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC32092-2.mp3\tGene Austin\tYearning Just For You\tVICTOR\t19625\t32092-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLB12121.mp3\tRhythmakers\tYellow Dog Blues\tCOLUMBIA\t35882\tB12121\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE27771.mp3\tDuke Ellington & His Orch\tYellow Dog Blues\tBRUNSWICK\t3987\tE27771\t1928\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC49674-2.mp3\tBen Pollack & His Orchestra\tYellow Dog Blues\tVICTOR\t21971\t49674-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_243.mp3\tBen Pollack And His Orchestra\tYellow Dog Blues\tVICTOR\t21971\t49674-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU061545.mp3\tEarl Hines & His Orch\tYellow Fire\tBLUEBIRD\t11308\t061545\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu061545-1.mp3\tEarl Hines And His Orchestra\tYellow Fire\tBluebird\tB-11308\t061545-1\t1941\tacc. George Dixon (tp,as) Harry ''Pee Wee'' Jackson, Tommy Enoch, Freddy Webster (tp) Joe McLewis, George Hunt, John Ewing (tb) Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ramey (g) Truck\nhttp://www.jazz-on-line.com/a/mp3b/Blu061545-1.mp3\tEarl Hines And His Orchestra\tYellow Fire (fj Arr)   \tBluebird\tB-11308B\t061545-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5129.mp3\tLeadbelly\tYellow Gal\tMUSICRAFT\t310\t5129\t\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCHS23.mp3\tOriginal Yellow Jackets\tYellow Jacket Get Together\tVOCALION\t3549\tHS23\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO53604.mp3\tMitch Miller And His Music\tYellow Rose Of Texas\tCOLUMBIA\t40540\tCO53604\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE9485-A.mp3\tLouis Armstrong's Hot Five\tYes I'm In De Barrell\tOKeh\t8261\t09485-A\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146887-2.mp3\tBessie Smith\tYes Indeed He Do\tCOLUMBIA\t14354 D\tW146887-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057649.mp3\tGlenn Miller & His Orch\tYes My Darling Daughter (vmh)\tBLUEBIRD\t10970-B\t057649\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MER5768.mp3\tFrankie Laine\tYes My Dear\tMERCURY\t5768\t\t\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR144023-1.mp3\tUniversity Six\tYes She Do, No She Don't\tHARMONY\t425-H\t144023-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60641.mp3\tMilton Brown & His Brownies\tYes Sir (just Because)\tDECCA\t5260\t60641\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1925_0500_03.mp3\tLee Morse\tYes Sir Thats My Baby\tPerfect\t11580A\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC33200-2.mp3\tCoon-sanders Nighthawk Orch\tYes Sir! That's My Baby\tVICTOR\t19745A\t33200-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_001.mp3\tGene Austin\tYes Sir! That's My Baby\tVICTOR\t19656\t32469-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_118.mp3\tAce Brigode And His Virginians\tYes Sir! That's My Baby\tColumbia\t398\t\t1925\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC32469-3.mp3\tGene Austin\tYes Sir, That's My Baby\tVICTOR\t19656\t32469-3\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_059.mp3\tBen Bernie And His Orchestra\tYes Sir, That's My Baby\tVOCALION\t15080A\tNN1092\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1925_130.mp3\tCoon-sanders Orchestra\tYes Sir, That's My Baby\tVICTOR\t19745A\t33200-2\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL261.mp3\tLee O'daniel Hillbilly Boys\tYes Suh\tVOCALION\t3902\tDAL261\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN12122-2.mp3\tBilly Banks Rhythmakers\tYes Suh (vocal B. Banks)\tBANNER\t32530\t12122-2\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69000.mp3\tLouis Armstrong & His Orch.\tYes Suh!\tDECCA\t3900B\t69000\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN16066-1.mp3\tAlice Faye\tYes To You\tBANNER\t33253\t16066-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO37353.mp3\tGene Krupa & His Orch\tYes Yes Honey\tCOLUMBIA\t37354\tCO37353\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO27489.mp3\tLouis Armstrong And His Hot Five\tYes! I'm In The Barrell\tCOLUMBIA\t36152\tCO27489\t1925\t\nhttp://www.jazz-on-line.com/a/mp3e/VOC11338.mp3\tBilly Jones\tYes! We Have No Bananas\tVOCALION\t14579A\t11338\t1923\t\nhttp://www.jazz-on-line.com/a/mp3r/RiColA3873.mp3\tFurman & Nash\tYes! We Have No Bananas\tColumbia\tA3873\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_004.mp3\tBilly Jones\tYes! We Have No Bananas\tVOCALION\t14579A\t11338\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_025.mp3\tGreat White Way Orchestra Feat. Billy Murray\tYes! We Have No Bananas\tVICTOR\t19068A\t27855-4\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/ColCO-18422-1.mp3\tMills Blue Rhythm Band\tYes! Yes!\tColumbia\t3111-D\tCO-18422-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC60439-A.mp3\tLouis Armstrong And His Orchestra\tYes! Yes! My! My!\tDECCA\t698B\t60439-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC060905-1.mp3\tTommy Dorsey And His Orchestra\tYes, Indeed\tVICTOR\t\t060905-1\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_030.mp3\tTommy Dorsey And His Orchestra\tYes, Indeed!\tVICTOR\t27421\t060908\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU056438.mp3\tDinah Shore\tYes, My Darling Daughter\tBLUEBIRD\t10920\t056438\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_086.mp3\tDinah Shore\tYes, My Darling Daughter\tBLUEBIRD\t10920\t056438\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/CON28966-1.mp3\tGene Krupa & His Orch\tYes, My Darling Daughter (vi.day)\tCONQUEROR\t9787\t28966-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic19068.mp3\tBilly Murray & The Great White Way Orchestra\tYes, We Have No Bananas\tVictor\t19068\t\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC075093.mp3\tGlenn Miller & His Orch\tYesterday's Gardenias\tVICTOR\t27933\t075093\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_027.mp3\tLeo Reisman And His Orchestra\tYesterdays\tBrunswick\t6701\t14288-C\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU027231.mp3\tArtie Shaw And His Orchestra\tYesterdays\tBLUEBIRD\t10001\t027231-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/ARA1046-1B.mp3\tArt Tatum\tYesterdays\tARA\t4503A\tARA1046-1B\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/ME8995RY.mp3\tCharlie Ventura & His Orch\tYesterdays\tMERCURY\t8995\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC73925.mp3\tEddie Heywood\tYesterdays\tDECCA\t23960\t73925\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MER11047o.mp3\tBud Powell (piano)\tYesterdays\tMERCURY\t11047\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS24404-A.mp3\tBillie Holiday\tYesterdays\tCBS\tCM527\t24404-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/ColLA2021.mp3\tMartha Raye With Dave Rose Orchestra \tYesterdays \tColumbia\t35305\tLA2021\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Sel234-B-20-B.mp3\tErroll Garner\tYesterdays\tSelmer\tY7225\t234-B-20-B\t1944\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480526.mp3\tBenny Golson\tYesterdays\tNew Jazz\tNJLP8220\t1836\t1959\tCurtis Fuller (tb), Benny Golson (ts), Ray Bryant (p), Paul Chambers (sb), Art Blakey (dm)\nhttp://www.jazz-on-line.com/a/mp3c/BLU055579.mp3\tGlenn Miller & His Orch\tYesterthoughts (vre)\tBLUEBIRD\t10893 B\t055579\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP5091.mp3\tJogi Jorgensen\tYingle Bells\tCAPITOL\t781\t5091\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_069.mp3\tArthur Collins And Byron Harlan\tYip-i-addy-i-ay!\tEDISON\t10094\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3w/1909_069alt.mp3\tArthur Collins And Byron Harlan\tYip-i-addy-i-ay! (take 2)\tEDISON\t10094\t\t1909\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480929.mp3\tCarmen Miranda And Frank Fontaine With M-g-m Studio Orchestra And Chorus\tYipsee-i-o (from Film, ''nancy Goes To Rio'')\tM-G-M\t30224\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE27805.mp3\tCab Calloway & His Orchestra\tYo Et Cansa\tOKEH\t5827\t27805\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU59059.mp3\tJimmie Davis\tYo Yo Mama\tBLUEBIRD\t6437\t59059\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe400511-A.mp3\tVal And Pete\tYodel Blues Pt.2\tOKeh\t45224\t400511-A\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_031.mp3\tBing Crosby And Andrews Sisters\tYodelin' Jive\tDECCA\t2800B\t66633\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66633.mp3\tAndrews Sisters\tYodelin' Jive\tDECCA\t2800B\t66633\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81079-3.mp3\tBessie Smith\tYodeling Blues\tCOLUMBIA\tA-3939\t81079-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCDAL260.mp3\tLee O'daniel Hillbilly Boys\tYodeling Ranger\tVOCALION\t4388\tDAL260\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/RCAD5VB1098.mp3\tArtie Shaw And His Orchestra\tYolanda\tRCA\t20-1716\tD5VB1098\t1945\t\nhttp://www.jazz-on-line.com/a/mp3b/COL80052.mp3\tAl Jolson\tYoo Hoo\tCOLUMBIA\tA-3513\t80052\t1921\t\nhttp://www.jazz-on-line.com/a/mp3w/1922_039.mp3\tAl Jolson\tYoo Hoo\tCOLUMBIA\tA-3513\t80052\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC99915.mp3\tTommy Dorsey And His Orch\tYou\tVICTOR\t25291\t99915\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_028.mp3\tTommy Dorsey And His Orchestra\tYou\tVICTOR\t25291\t99915\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_074.mp3\tJimmy Dorsey And His Orchestra\tYou\tDECCA\t764A\tDLA332-A\t1936\t\nhttp://www.78-tours.net/mp3/VIC25291-A.mp3\tTommy Dorsey And His Orchestra\tYou (featured In The M-g-m Film \"the Great Ziegfels\") (t)\tVICTOR\t25291\t25291-A\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh124.mp3\tBilly Merrin And His Commanders\tYou (v Rita Wiiliams)\tCrown\t226\tH-608-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66245.mp3\tBlue Lu Barker & Fly Cats\tYou Ain't Had No Blues\tDECCA\t7648\t66245\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL78684-2.mp3\tAl Jolson\tYou Ain't Heard Nothing Yet\tCOLUMBIA\tA-2836\t78684-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66875.mp3\tLouis Jordan & His Tympani 5\tYou Ain't Nowhere\tDECCA\t7693\t66875\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL28007.mp3\tJimmie Lunceford & His Orch\tYou Ain't Nowhere\tCOLUMBIA\t35782\t28007\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Col28007-A.mp3\tJimmie Lunceford And His Orchestra\tYou Ain't Nowhere\tColumbia\t35782\t28007-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3d/Blu045946-1.mp3\tDon Redman And His Orchestra\tYou Ain't Nowhere\tBluebird\tB-10615\t045946-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW144511.mp3\tCharlie Poole's N.c.ramblers\tYou Ain't Talking To Me\tCOLUMBIA\t15193 D\tW144511\t1927\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_017.mp3\tEddie Morton\tYou Ain't Talking To Me\tCOLUMBIA\tA-0777\t04271-4\t1910\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_067.mp3\tPerry Como Feat. Hugo Winterhalter's Orchestra\tYou Alone\tRCA Victor\t5447\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC71812.mp3\tMills Brothers\tYou Always Hurt The One You Love\tDECCA\t18599A\t71812\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-1762x.mp3\tSpike Jones And City Slickers\tYou Always Hurt The One You Love\tRCA\t20-1762\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D315A1.mp3\tCharlie Spivak And His Orchestra\tYou Always Hurt The One You Love\tV-DISC\t315A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_007.mp3\tMills Brothers\tYou Always Hurt The One You Love\tDECCA\t18599A\t71812\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU064473.mp3\tGlenn Miller And His Orch\tYou And I\tBLUEBIRD\t11215-A\t064473\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC066431.mp3\tTommy Dorsey And His Orch\tYou And I\tVICTOR\t27532\t066431\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2400.mp3\tBing Crosby\tYou And I\tDECCA\t3840B\tDLA2400\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_051.mp3\tBing Crosby\tYou And I\tDECCA\t3840B\tDLA2400\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_122.mp3\tTommy Dorsey Orch V Frank Sinatra\tYou And I\tVICTOR\t27532\t066431\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011711.mp3\tTommy Dorsey & His Orch\tYou And I Know\tVICTOR\t25648\t011711\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_181.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tYou And I Know\tVICTOR\t25648\t011711\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU16354-A.mp3\tLeo Reisman And His Orch\tYou And The Night And The Music\tBRUNSWICK\t7331\t16354-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC86484.mp3\tLibby Holman\tYou And The Night And The Music\tVICTOR\t24839\t86484\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/PatCPT-2142-1.mp3\tPatrick Et Son Orchestre De Danse (with Django Reinhardt)\tYou And The Night And The Music\tPath\tPA-667\tCPT-2142-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_161.mp3\tLibby Holman\tYou And The Night And The Music\tVICTOR\t24839\t86484\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC053033-2.mp3\tHal Kemp & His Orch\tYou And Who Else\tVICTOR\t26635\t053033-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU050619.mp3\tCharlie Barnet & His Orch\tYou And Who Else?\tBLUEBIRD\t10734\t050619\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC034650.mp3\tBenny Goodman And His Orchestra\tYou And Your Love\tVICTOR\t26263\t034650\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCW24823.mp3\tMildred Bailey\tYou And Your Love\tVOCALION\t5006\tW24823\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU24924-B.mp3\tGene Krupa & His Orch\tYou And Your Love\tBRUNSWICK\t8448\t24924-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWC-2633-A.mp3\tCount Basie And His Orchestra\tYou And Your Love\tVocalion\t4967\tWC-2633-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3h/DECDH478309.mp3\tTed Heath And His Music\tYou Are My Heart's Delight\tDECCA-LONDON\tF10182x\tDH478309\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_053.mp3\tJoni James\tYou Are My Love\tMGM\t12066\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60022-E.mp3\tLouis Armstrong & His Orch.\tYou Are My Lucky Star\tDECCA\t580A\t60022-E\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec60022-A.mp3\tLouis Armstrong And His Orchestra\tYou Are My Lucky Star\tDecca\t580\t60022-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_091.mp3\tLouis Armstrong\tYou Are My Lucky Star\tDECCA\t580A\t60022-E\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_041.mp3\tDorsey Brothers Orchestra Feat. V/bob Eberle\tYou Are My Lucky Star\tDECCA\t559A\t39965\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_140.mp3\tTommy Dorsey And His Orchestra Feat. Eleanor Powell\tYou Are My Lucky Star\tVICTOR\t25158\t95379\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_012.mp3\tEddy Duchin And His Orchestra Feat. Lew Sherwood\tYou Are My Lucky Star\tVictor\t25125\t\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC95379.mp3\tTommy Dorsey & His Orch\tYou Are My Lucky Star (veleanor Powell)\tVICTOR\t25158\t95379\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1928_0928_06.mp3\tLee Morse And Her Bluegrass Boys\tYou Are My Own\tColumbia\t1716DB\t\t1928\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2515.mp3\tBing Crosby - Victor Young\tYou Are My Sunshine\tDECCA\t18768A\tDLA2515\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DECDLA2515.mp3\tBing Crosby - Victor Young\tYou Are My Sunshine\tDECCA\t3952A\tDLA2515\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_148.mp3\tWayne King And His Orchestra\tYou Are My Sunshine\tVictor\t26767\t053419\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_186.mp3\tBing Crosby\tYou Are My Sunshine\tDECCA\t29634\tDLA2515\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_260.mp3\tGene Autry\tYou Are My Sunshine\tOKEH\t6274\tH315-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA2074-A.mp3\tBing Crosby\tYou Are The One\tDECCA\t3450B\tDLA2074-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CON29165-1.mp3\tGene Krupa & His Orch\tYou Are The One (v H. Dulany)\tCONQUEROR\t9788\t29165-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU057664.mp3\tGlenn Miller & His Orch\tYou Are The One (vre)\tBLUEBIRD\t11020-B\t057664\t1940\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVoc3392.mp3\tEarl Hines & His Orchestra\tYou Are The One Of My Dreams\tVocalion\t3392\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18781A.mp3\tDick Haymes\tYou Are Too Beautiful\tDECCA\t18781-A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_421.mp3\tBob Eberly Feat. O/les Baxter\tYou Are Too Beautiful\tCapitol\t2525\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU032942.mp3\tFats Waller And His Rhythm\tYou Asked For It\tBLUEBIRD\t10170\t032942\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_419.mp3\tCleftones\tYou Baby You\tGee\t1000\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC66958.mp3\tBlue Lu Barker And Fly Cats\tYou Been Holding Out Too Long\tDECCA\t7695\t66958\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO10204.mp3\tJo Stafford\tYou Belong To Me\tCOLUMBIA\t39811\tHCO10204\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MERYB9243-4.mp3\tPatti Page W Jack Rael Orch\tYou Belong To Me\tMERCURY\t5899\tYB9243-4\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_090.mp3\tDean Martin\tYou Belong To Me\tCapitol\t2165\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3738.mp3\tBing Crosby - Xavier Cugat\tYou Belong To My Heart\tDECCA\t23413\tL3738\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_159.mp3\tPhil Brito Feat. O/paul Lavalle\tYou Belong To My Heart\tMUSICRAFT\t15018\t5185\t1944\t\nhttp://www.jazz-on-line.com/a/mp3b/OKE30520.mp3\tCount Basie & His Orch\tYou Betcha My Life\tOKEH\t6221\t30520\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/COLHCO1814.mp3\tTed Daffan's Texans\tYou Better Change Your Ways, Baby\tCOLUMBIA\t20103\tHCO1814\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64233.mp3\tBob Howard & His Orch\tYou Better Come Back\tDECCA\t2730A\t64233\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC73008-A.mp3\tBillie Holiday\tYou Better Go Now\tDECCA\t23483\t73008-A\t\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP2701x.mp3\tTommy Collins\tYou Better Not Do That\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_311.mp3\tGinny Gibson\tYou Blew Me A Kiss\tMGM\t11383\t48S816\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU050159-1.mp3\tErskine Hawkins & His Orch\tYou Bring Me Down\tBLUEBIRD\t10756\t050159-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_238.mp3\tInk Spots\tYou Bring Me Down\tDECCA\t2707B\t66118\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-6862-1.mp3\tValaida (queen Of The Trumpet) With Billy Mason And His Orchestra\tYou Bring Out The Savage In Me\tParlophone\tF-140\tCE-6862-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/ColW149827-4.mp3\tPaul Whiteman And His Orchestra (vocal Bing Crosby)\tYou Brought A New Kind Of Love\tColumbia\tE CB117\tW149827-4\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW149827-4.mp3\tPaul Whiteman And His Orch\tYou Brought A New Kind Of Love To Me\tCOLUMBIA\t2171 D\tW149827-4\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/KEYHL74.mp3\tGeorge Wettling's New Yorkers\tYou Brought A New Kind Of Love To Me\tKEYNOTE\t1318\tHL74\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_132.mp3\tHigh Hatters\tYou Brought A New Kind Of Love To Me\tVICTOR\t22409\t62203-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_124.mp3\tMaurice Chevalier Feat. Leonard Joy (director)\tYou Brought A New Kind Of Love To Me\tVICTOR\t22405\t59672-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3o/HIT1081.mp3\tHit Of The Week Orch (hirsch)\tYou Brought A New Kind Of Love To Me (vdr)\tHIT OF THE WEEK\t1081\t1081-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_157.mp3\tAl Trace And His Orchestra (vocal Bob Vincent)\tYou Call Everybody Darlin'\tSterling\t3023\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/MER1820.mp3\tAnne Vincent\tYou Call Everybody Darling\tMERCURY\t5155\t1820\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/MGM48S3003.mp3\tArt Lund\tYou Call Everybody Darling\tMGM\t10258\t48S3003\t1948\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74580.mp3\tAndrews Sisters / B.terment\tYou Call Everybody Darling\tDECCA\t24490\t74580\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_116.mp3\tJerry Wayne\tYou Call Everybody Darling\tCOLUMBIA\t38286\tCO38855\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_107.mp3\tJack Smith\tYou Call Everybody Darling\tCapitol\t15156\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_061.mp3\tAndrews Sisters Feat. Billy Ternant's Orchestra\tYou Call Everybody Darling\tDECCA\t24490\t74580\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP1096.mp3\tKing Cole Trio\tYou Call It Madness\tCAPITOL\t\t1096\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC70212.mp3\tRuss Colombo\tYou Call It Madness\tVICTOR\t22802\t70212\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/NATNSC70.mp3\tBilly Eckstine & His Orch\tYou Call It Madness\tNATIONAL\t\tNSC70\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_139.mp3\tKing Cole Trio\tYou Call It Madness\tCapitol\t274\t1096\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE37159.mp3\tMildred Bailey\tYou Call It Madness (but I Call It Love)\tBRUNSWICK\t6184\tE37159\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_187.mp3\tBilly Eckstine\tYou Call It Madness (but I Call It Love)\tNational\t9019\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/COL236002.mp3\tBen Selvin's Orch\tYou Call It Madness (vrc)\tCOLUMBIA\t\t236002\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-2913x.mp3\tRay Mckinley Orch\tYou Came A Long Way From St Louis\tRCA\t20-2913\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_253.mp3\tTommy Dorsey And His Orchestra\tYou Came Along (from Out Of Nowhere)\tVictor\t1722\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0091.mp3\tShep Fields Rippling Rhythm\tYou Came To My Rescue\tBLUEBIRD\t6547\t0091\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BRULA1158-B.mp3\tTeddy Wilson And His Orchestra\tYou Came To My Rescue\tBRUNSWICK\t7739\tLA1158-B\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_275.mp3\tShep Fields And His Rippling Rhythm Orchestra Feat. V/dick Robertson\tYou Came To My Rescue\tBLUEBIRD\t6547\t91\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM1041-A.mp3\tDuke Ellington And His Famous\tYou Can Count On Me\tBRUNSWICK\t8411\tM1041-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/VocWC-2632-A.mp3\tCount Basie And His Orchestra\tYou Can Countoon Me\tVocalion\t4967\tWC-2632-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152057.mp3\tLouis Armstrong And His Orch\tYou Can Depend On Me\tCOLUMBIA\t2590 D\tW152057\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL745.mp3\tHi-flyers\tYou Can Depend On Me\tVOCALION\t4703\tDAL745\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64978-A.mp3\tCount Basie & His Orch\tYou Can Depend On Me\tDECCA\t3882B\t64978-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO44120.mp3\tEarl Hines\tYou Can Depend On Me\tCOLUMBIA\t39262\tCO44120\t1950\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC100887-1.mp3\tFletcher Henderson & His Orch\tYou Can Depend On Me\tVICTOR\t25379B\t100887-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/CONDAL745.mp3\tHi Flyers\tYou Can Depend On Me\tCONQUEROR\t9244\tDAL745\t1938\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU94517.mp3\tJoe Kennedy & His Orch\tYou Can Depend On Me\tBLUEBIRD\t6245\t94517\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC64978-Av.mp3\tCount Basie And His Orchestra\tYou Can Depend On Me\tDecca\t2631\t64978-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_036.mp3\tLouis Armstrong\tYou Can Depend On Me\tCOLUMBIA\t2590 D\tW152057\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu051526-1.mp3\tEarl Hines And His Orchestra\tYou Can Depend On Me\tBluebird\tB-10792\t051526-1\t1940\tWalter Fuller (tp,vcl) Shirley Clay, Ed Sims (tp) George Dixon (tp,as) Ed Burke, John Ewing, Joe McLewis (tb) Omer Simeon (cl,bar) Leroy Harris (as,vcl) Jimmy Mundy (ts,arr) Robert Crowder (ts) Earl Hines (p) Claude Roberts (g) Quinn Wilson (b) Alvin Burroughs (d) Billy Eckstine, Leroy Harris (vcl) Buster Harding, Edgar Battle (arr)\nhttp://www.jazz-on-line.com/a/mp3d/Vic100887-1.mp3\tFletcher Henderson And His Orchestra\tYou Can Depend On Me\tVictor\t25379\t100887-1  \t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec64978-A.mp3\tCount Basie And His Orchestra\tYou Can Depend On Me\tDecca\t2631\t64978-A  \t1939\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480692.mp3\tNat King Cole\tYou Can Depend On Me\tCapitol\tEMS-1103\t15788-10\t1956\tNat King Cole, P & Vocal, Harry ''Sweets'' Edison, T, John Collins, G, Charlie Harris, B, Lee Young, D\nhttp://www.jazz-on-line.com/a/mp3d/Oke26067-A.mp3\tJimmie Lunceford And His Orchestra\tYou Can Fool Some Of The People (some Of The Time)\tOkeh\t5156\t26067-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/COL03600-3.mp3\tBilly Murray (tenor)\tYou Can Have Broadway\tCOLUMBIA\t3600\t03600-3\t\t\nhttp://www.jazz-on-line.com/a/mp3l/Ban1100-1.mp3\tSpecht's Jazz Outfit\tYou Can Have Him I Don't Want Him Blues\tBanner\t1090\t1100-1\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU044239.mp3\tTommy Mcclennan\tYou Can Mistreat Me Here\tBLUEBIRD\t8347\t044239\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_409.mp3\tJerry Vale\tYou Can Never Give Me Back My Heart\tCOLUMBIA\t39929\tCO48712\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC03875-1.mp3\tBenny Goodman And His Orchestra\tYou Can Tell She Comes From Dixie\tVICTOR\t25500\t03875-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/CON20345-1.mp3\tArtie Shaw And His Orchestra\tYou Can Tell She Comes From Dixie (v P. Lacentra)\tCONQUEROR\t9093\tB-20345-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec63705-A.mp3\tElla Fitzgerald And Her Savoy Eight\tYou Can't Be Mine\tDecca\t1806\t63705-A  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS23470-2.mp3\tBillie Holiday\tYou Can't Be Mine And Someone Else's Too\tCBS\tVO4396\t23470-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_131.mp3\tWill Glahe\tYou Can't Be True Dear\tRCA Victor\t1117\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP15077x.mp3\tSportsmen\tYou Can't Be True, Dear\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC24439x.mp3\tDick Haymes\tYou Can't Be True, Dear\tDECCA\t24439\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_067.mp3\tDick Haymes\tYou Can't Be True, Dear\tDECCA\t24439\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_005.mp3\tKen Griffin Feat. Ken On Organ, Jerry Wayne; Vocal\tYou Can't Be True, Dear\tRondo\t228\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_014.mp3\tKen Griffin\tYou Can't Be True, Dear\tRondo\t128\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1488.mp3\tSpade Cooley And His Orch\tYou Can't Break My Heart\tCOLUMBIA\t36935\tHCO1488\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe401822-C.mp3\tTommy Dorsey\tYou Can't Cheat A Cheater\tOKeh\t41422\t401822-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COM4701.mp3\tEddie Condon & His Band\tYou Can't Cheat A Cheater\tCOMMODORE\t605\t4701\t1943\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-41-1.mp3\tMezzrow - Bechet Quintet\tYou Can't Do That To Me\tKing Jazz\t148\tKJ-41-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW140864-1.mp3\tEthel Waters And Her Ebony Four\tYou Can't Do What My Last Man Did\tCOLUMBIA\t14112 D\tW140864-1\t1925\t\nhttp://www.jazz-on-line.com/a/mp3b/Par1469-1.mp3\tAnna Jones\tYou Can't Do What My Last Man Did\tParamount\t12043\t1469-1\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_054.mp3\tNora Bayes\tYou Can't Get Lovin' Where There Ain't No Love\tCOLUMBIA\t2771\t78547-1\t1919\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC8668x.mp3\tLouis Jordan And His Tympani Five\tYou Can't Get That No More\tDECCA\t8668\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/CHAG16596.mp3\tBert Stock And His Orchestra\tYou Can't Get To Heaven That Way\tCHAMPION\t16018\tG16596\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1921_039.mp3\tMamie Smith And Her Jazz Hounds\tYou Can't Keep A Good Man Down\tOKeh\t4305\tS7793-B\t1921\t\nhttp://www.jazz-on-line.com/a/mp3h/CROC1448-2.mp3\tThe High Steppers\tYou Can't Keep Me From Loving You\tCROWN\t3184A\tC1448-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC75342-A.mp3\tBillie Holiday & L.armstrong\tYou Can't Lose A Broken Heart\tDECCA\t24785\t75342-A\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1913_082.mp3\tJoseph Cawthorn\tYou Can't Play Every Instrument In The Band\tVICTOR\t70098\t\t1913\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC100380.mp3\tBenny Goodman And His Orchestra\tYou Can't Pull The Wool Over My Eyes\tVICTOR\t25316\t100380\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_036.mp3\tBenny Goodman And His Orchestra V Helen Ward\tYou Can't Pull The Wool Over My Eyes\tVICTOR\t25316\t100380\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC23949YC.mp3\tLucky Millinder\tYou Can't Put Out A Fire\tDECCA\t23949\t\t\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec73861.mp3\tLucky Millinder And His Orchestra\tYou Can't Put Out A Fire\tDecca\t23949\t73861\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/Col26873-A.mp3\tCount Basie And His Orchestra\tYou Can't Run Around\tColumbia\tMZ-257\t26873-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_167.mp3\tFour Aces Featuring Al Alberts\tYou Can't Run Away From It\tDecca\t30041\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC06590.mp3\tBunny Berigan & His Orch\tYou Can't Run Away From Love Tonight\tVICTOR\t25562A\t06590\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_200.mp3\tInk Spots\tYou Can't See The Sun When You're Crying\tDECCA\t23809\t73740\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe73739-B.mp3\tClarence Williams Blue Five\tYou Can't Shush Katie (v E T)\tOKeh\t8342\t73739-B\t1925\t\nhttp://www.jazz-on-line.com/a/mp3c/VAREL4083sYC.mp3\tWillie Lewis & Negro Band\tYou Can't Stop Me\tVARSITY\tEL4083s\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULA1405-A.mp3\tTeddy Wilson And His Orch,vc.by\tYou Can't Stop Me From Dreamin'\tBRUNSWICK\t7954\tLA1405-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62561-A.mp3\tDick Robertson & His Orch\tYou Can't Stop Me From Dreaming\tDECCA\t1415\t62561-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh114.mp3\tJay Wilbur And His Band\tYou Can't Stop Me From Dreaming (v Sam Costa)\tRex\t9189\tR-2512-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404951.mp3\tBuddy Campbell Orch (selvin)\tYou Can't Stop Me From Lovin' You\tOKeh\t41507\t404951\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN10866-1.mp3\tCab Calloway & His Orch\tYou Can't Stop Me From Lovin' You\tBANNER\t32295\t10866-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban10866-1.mp3\tCab Calloway And His Orchestra\tYou Can't Stop Me From Lovin' You\tBanner\t32295\t10866-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62038-A.mp3\tBob Howard & His Orch\tYou Can't Take It With You\tDECCA\t1205\t62038-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU59056.mp3\tJimmie Davis\tYou Can't Tell About The Women Nowadays\tBLUEBIRD\t5697\t59056\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S267.mp3\tSy Oliver & His Orch\tYou Can't Tell The Depth Of The Well\tMGM\t10083B\t47S267\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC74121.mp3\tBuddy Johnson And His Orch.\tYou Can't Tell Who's Lovin' Who\tDECCA\t48060\t74121\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79484-1.mp3\tBert Williams\tYou Can't Trust Nobody\tCOLUMBIA\tA-3589\t79484-1\t1920\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCOLA-3589.mp3\tBert Williams\tYou Can't Trust Nobody\tCOLUMBIA\tA-3589\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC53508-2.mp3\tNapoleon's Emperors\tYou Cant Cheat A Cheater\tVICTOR\t38069\t53508-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC018111.mp3\tTommy Dorsey & His Orch\tYou Couldn't Be Cuter\tVICTOR\t25766\t018111\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_311.mp3\tRay Noble And His Orchestra\tYou Couldn't Be Cuter\tBRUNSWICK\t8076\tLA1571\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_049.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tYou Couldn't Be Cuter\tVICTOR\t25766\t018111\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh115.mp3\tLew Stone And His Band\tYou Couldn't Be Cuter (v Al Bowlly)\tDecca\tF-6745\tDR-2842-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU11927.mp3\tGene Rodemich And His Orchestra\tYou Darling You\tBRUNSWICK\t2527A\t11927\t1923\tpiano duets by Gene Rodemich and Austin Wylie\nhttp://www.jazz-on-line.com/a/mp3c/BAN10867-7.mp3\tCab Calloway & His Orchestra\tYou Dawg\tBANNER\t32323\t10867-7\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70913.mp3\tSylvia Froos\tYou Didn't Know The Music\tVICTOR\t22846\t70913\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_052.mp3\tDinah Shore\tYou Do\tCOLUMBIA\t37587\tHCO2344\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_077.mp3\tVic Damone Feat. Jerry Gray's Orchestra\tYou Do\tMERCURY\t5056A\t796-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0544.mp3\tCharlie Barnet & His Orchestra\tYou Do Darndest Things\tBLUEBIRD\t6594\t0544\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/MUS5544.mp3\tArtie Shaw And His Orchestra\tYou Do Something To Me\tMUSICRAFT\t391\t5544\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC57587-1.mp3\tLeo Reisman And His Orch\tYou Do Something To Me\tVICTOR\t22244\t57587-1\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban10867-2.mp3\tCab Calloway And His Orchestra\tYou Dog\tBanner\t32323\t10867-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_421.mp3\tTennessee Ernie Ford\tYou Don't Have To Be A Baby To Cry\tCapitol\t3262\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/DECL4577.mp3\tBing Crosby And Andrew Sisters\tYou Don't Have To Know The Language\tDECCA\t24282\tL4577\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3641.mp3\tJudy Canova\tYou Don't Have To Say You're Sorry\tDECCA\t23447\tL3641\t1944\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC037648.mp3\tTommy Dorsey & His Orch\tYou Don't Know How Much You Can Suffer\tVICTOR\t26287\t037648\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC65326-B.mp3\tAndrews Sisters\tYou Don't Know How Much You Can Suffer\tDECCA\t2414A\t65326-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_242.mp3\tAndrews Sisters\tYou Don't Know How Much You Can Suffer\tDECCA\t2414A\t65326-B\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_099.mp3\tJerry Vale\tYou Don't Know Me\tColumbia\t40710\tCO55919\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24232.mp3\tMildred Bailey & Her Orchestra\tYou Don't Know My Mind\tVOCALION\t4802\t24232\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL6813.mp3\tBing Crosby\tYou Don't Know What Lonesome Is\tDECCA\t28470\tL6813\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_255.mp3\tBing Crosby\tYou Don't Know What Lonesome Is\tDECCA\t28470\tL6813\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU068403.mp3\tEarl Hines Orch\tYou Don't Know What Love Is\tBLUEBIRD\t11394\t068403\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC69876.mp3\tElla Fitzgerald & Her Orch\tYou Don't Know What Love Is\tDECCA\t4082A\t69876\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu068403-1.mp3\tEarl Hines And His Orchestra\tYou Don't Know What Love Is\tBluebird\tB-11394\t068403-1\t1941\tacc. George Dixon (tp,as) Gerald Valentine (tb) Robert Crowder (ts,arr), Nat Atkins, Mel Powell (arr) Tommy Enoch, Joe McLewis, George Hunt, Leroy Harris, Scoops Carey (as,cl) Willie Randall, Budd Johnson, Franz Jackson (ts) Earl Hines (p) Hurley Ra\nhttp://www.jazz-on-line.com/a/mp3b/Blu068403-1.mp3\tEarl Hines And His Orchestra\tYou Don't Know What Love Is (be Vcl)   \tBluebird\tB-11394\t068403-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUC7472-3.mp3\tIsham Jones And His Orch\tYou Don't Know What You're Doin'\tBRUNSWICK\t6118\tC7472-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1273.mp3\tKing Cole Trio\tYou Don't Learn That In School\tCAPITOL\t\t1273\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_271.mp3\tKing Cole Trio\tYou Don't Learn That In School\tCapitol\t393\t1273\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW144301.mp3\tPaul Ash And His Orchestra\tYou Don't Like It - Not Much\tCOLUMBIA\t1034 D\tW144301\t1927\tDanny Polo, clarinet, alto & baritone saxes,  Hank Winston, piano. Chicago, June 8th 1927\nhttp://www.jazz-on-line.com/a/mp3w/1927_093.mp3\tErnest Hare And Billy Jones\tYou Don't Like It - Not Much\tVictor\t20756\t7498-1\t1927\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU02899-1.mp3\tFrank Tanner's Rhythm Kings\tYou Don't Love Me\tBLUEBIRD\tB-6667\t02899-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28958.mp3\tHorace Henderson's Orch\tYou Don't Mean Me No Good\tOKEH\t5953\t28958\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/PARP2546.mp3\tBartlette,viola\tYou Don't Mean Me No Good\tPARAMOUNT\t12363\tP2546\t1926\t\nhttp://www.jazz-on-line.com/a/mp3d/OKE28958-1.mp3\tHorace Henderson And His Orchestra\tYou Don't Mean No Good\tOKEH\t5953\t28958-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1919_107.mp3\tEddie Cantor\tYou Don't Need The Wine To Have A Wonderful Time\tPath\t22163\t\t1919\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe403280-C.mp3\tClarence Williams Washboard Bd\tYou Don't Understand (v C W)\tOKeh\t8752\t403280-C\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16706.mp3\tLeadbelly (h. Ledbetter)\tYou Dont Know My Mind\tARC\t(Reject)\t16706\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/CONC1769-2.mp3\tChicago Black Swans\tYou Drink Too Much (vbb)\tCONQUEROR\t8780\tC1769-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC77498-1.mp3\tPaul Whiteman Presents Ramona\tYou Excite Me\tVICTOR\t24389\t77498-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC24389.mp3\tPaul Whiteman Presents Ramona\tYou Excite Me\tVICTOR\t24389\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC87087.mp3\tFats Waller And His Rhythm\tYou Fit Into The Picture\tVICTOR\t24863\t87087\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC39220-A.mp3\tBob Howard & His Orchestra\tYou Fit Into The Picture\tDECCA\t343B\t39220-A\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic87087-1.mp3\t\"fats Waller And His Rhythm\tYou Fit Into The Picture\tVictor\t24863\t87087-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCSA3020.mp3\tNite Owls\tYou Fooled Around And Waited Too Long\tVOCALION\t4118\tSA3020\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_225.mp3\tFour Aces\tYou Fooled Me\tDECCA\t28560\t83482\t1953\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142172.mp3\tDixie Washboard Band (cw)\tYou For Me, Me For You\tCOLUMBIA\t14141 D\tW142172\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE29167-1.mp3\tGene Krupa & His Orch\tYou Forgot About Me\tOKEH\t5961\t29167-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DECLA2127.mp3\tBob Crosby & His Orch\tYou Forgot About Me\tDECCA\t3417A\tLA2127\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic055187-1.mp3\tArtie Shaw And His Orchestra\tYou Forgot About Me\tVictor\t27256\t055187-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_108.mp3\tBob Crosby And His Orchestra\tYou Forgot About Me\tDECCA\t3417A\tLA2127\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/VIC27256-A.mp3\tArtie Shaw And His Orchestra\tYou Forgot About Me (from The Rko Film ''let's Make Music'') (que Olvidaste De M)\tVICTOR\t27256-A\t055187-2\t1940\tVocal refrain by Anita Boyer\nhttp://www.jazz-on-line.com/a/mp3b/VIC33329-10.mp3\tHenry Burr\tYou Forgot To Remember\tVICTOR\t19780\t33329-10\t1925\t\nhttp://www.jazz-on-line.com/a/mp3w/1926_059.mp3\tHenry Burr\tYou Forgot To Remember\tVictor\t19780\t33329-10\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/APO4101.mp3\tLuis Russell & His Orch\tYou Gave Me Everything But Love\tAPOLLO\t1072\t4101\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/Ban12182-1.mp3\tMills Blue Rhythm Band\tYou Gave Me Everything But Love\tBanner\t32531  \t12182-1  \t1932\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-11996-A.mp3\tDon Redman And His Orchestra\tYou Gave Me Everything But Love\tBrunswick\t6344\tB-11996-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUM832-1.mp3\tDuke Ellington's Famous Orch\tYou Gave Me The Gate (and I'm Swingin')\tBRUNSWICK\t8169\tM832-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_065may.mp3\tGreat White Way Orchestra\tYou Gave Me Your Heart (so I Gave You Mine)\tVICTOR\t18964B\t26923-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/Par106735.mp3\tRose Henderson\tYou Get Mad\tParamount\t7501\t106735\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO44584.mp3\tTallulah Bankhead\tYou Go To My Head\tCOLUMBIA\t39109\tCO44584\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021025-1.mp3\tLarry Clinton & His Orchestra\tYou Go To My Head\tVICTOR\t25849\t021025-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU22823-1.mp3\tTeddy Wilson & His Orch\tYou Go To My Head\tBRUNSWICK\t8141\t22823-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CON22921-1.mp3\tBillie Holiday & Her Orch\tYou Go To My Head\tCONQUEROR\t9097\t22921-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/SONSR1859.mp3\tColeman Hawkins Allstars\tYou Go To My Head\tSONORA\t3027\tSR1859\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL5762.mp3\tLionel Hampton's Sextet\tYou Go To My Head\tDECCA\t27373\tL5762\t1950\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu7783.mp3\tJan Savitt & His Top Hatters\tYou Go To My Head\tBluebird\t7783\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_045.mp3\tLarry Clinton And His Orchestra Feat. Bea Wain\tYou Go To My Head\tVICTOR\t25849\t021025-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/DecLA-5762.mp3\tLionel Hampton And His Sextet\tYou Go To My Head\tDecca\t27375\tLA-5762\t1950\t\nhttp://www.jazz-on-line.com/a/mp3e/CroBL-19.mp3\tJohn Kirby And His Orchestra\tYou Go To My Head\tCrown\t109\tBL-19\t1946\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480495.mp3\tArt Tatum\tYou Go To My Head\tClef\tMGC-712\t1591-1\t1954\t(p-solo)\nhttp://www.jazz-on-line.com/a/mp3w/1938_158.mp3\tGlen Gray And Casa Loma Orchestra\tYou Go To My Head\tDECCA\t1783A\t63339\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/GOTS1182.mp3\tDon Byas\tYou Go To The Head Of The Class\tGOTHAM\t132\tS1182\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC26759-A.mp3\tJohn Kirby & His Orchestra\tYou Go Your Way\tVOCALION\t5542\t26759-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC7340x.mp3\tBlack Ace\tYou Gonna Need My Help Some Day\tDECCA\t7340\t\t\t\nhttp://www.jazz-on-line.com/a/mp3b/Oke71069-B.mp3\tSara Martin\tYou Got Ev'rything A Sweet Mama Needs But Me\tOkeh\t8043\t71069-B\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62658.mp3\tHarlem Hamfats\tYou Got The Devil To Pay\tDECCA\t7382\t62658\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/COL30134x.mp3\tMemphis Minnie\tYou Got To Get Out Of Here\tCOLUMBIA\t30134\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL4025-1.mp3\tWynonie Harris & His Allstars\tYou Got To Get Yourself A Job\tALLADDIN\t208\t4025-1\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/KinKJ-38-1.mp3\tMezzrow - Bechet Quintet\tYou Got To Give It To Me\tKing Jazz\t148\tKJ-38-1  \t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63644.mp3\tRosetta Howard W Harlem Hamfat\tYou Got To Go When The Wagon Comes\tDECCA\t7447\t63644\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67308.mp3\tLouis Jordan & His Tympani 5\tYou Got To Go When The Wagon Comes\tDECCA\t7729\t67308\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU059499.mp3\tMemphis Slim (p.chatman)\tYou Got To Help Me Some\tBLUEBIRD\t8749\t059499\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/MER2454.mp3\tCootie Williams & His Orch\tYou Got To Pay\tMERCURY\t8168\t2454\t1949\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC75843.mp3\tBuddy Johnson And His Orch.\tYou Got To Walk That Chalk Line\tDECCA\t24996\t75843\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/CON14085-1.mp3\tRounders (harry Reser) V Jimmy Brierly\tYou Gotta Be A Football Hero\tCONQUEROR\t8218\t14085-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64489-A.mp3\tDick Robertson And His Orch\tYou Gotta Be A Football Hero\tDECCA\t2023B\t64489-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_102.mp3\tBen Bernie And His Orchestra\tYou Gotta Be A Football Hero (to Get Along With The Beautiful Girls)\tCOLUMBIA\t2820 D\tW152503-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCMEM121.mp3\tSwift Jewel Cowboys\tYou Gotta Ho De Ho\tVOCALION\t5133\tMEM121\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Ban11925-A.mp3\tCab Calloway And His Orchestra\tYou Gotta Ho-de-ho\tBanner\t32945\t11925-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT545.mp3\tLouis Prima & His Orchestra\tYou Gotta See Baby Tonight\tMAJESTIC\t7151\tT545\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC035397.mp3\tTommy Dorsey & His Orch\tYou Grow Sweeter As The Years Go By (vjl)\tVICTOR\t26226\t035397\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC022430.mp3\tFats Waller And His Rhythm\tYou Had An Evening To Spare (vfw)\tVICTOR\t25834\t022430\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1908_024.mp3\tHenry Burr\tYou Have Always Been The Same Old Pal\tColumbia\t591\t\t1908\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_240.mp3\tGlen Gray And Casa Loma Orchestra\tYou Have Taken My Heart\tBRUNSWICK\t6738\t14471\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14489-1.mp3\tJoe Venuti & His Orchestra\tYou Have Taken My Heart (v Slim Fortier)\tBANNER\t32939\t14489-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5368.mp3\tGeorgie Auld & His Orchestra\tYou Haven't Changed At All (v Lynne Stevens)\tMUSICRAFT\t15059\t5368\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP60443.mp3\tLeon Chappell\tYou Hear Me Talkin'\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60407.mp3\tBob Howard & His Orch\tYou Hit The Spot\tDECCA\t689A\t60407\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_057.mp3\tDinah Shore\tYou Keep Coming Back Like A Song\tCOLUMBIA\t37072\tHCO1894\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN5535-1-2.mp3\tFletcher Henderson & His Orch\tYou Know Me, Alabam'\tBANNER\t1372\t5535-1-2\t1924\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM47S266.mp3\tSy Oliver & His Orch\tYou Know What The Trouble Is Baby (v Tammy Roberts)\tMGM\t10133A\t47S266\t\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC27536.mp3\tHenry Burr\tYou Know You Belong To Somebody Else\tVICTOR\t19026\t27536\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_050.mp3\tHenry Burr\tYou Know You Belong To Somebody Else (so Why Don't You Leave Me Alone)\tVICTOR\t19026\t27536\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/ASCMA714.mp3\tMary Lou Williams Trio\tYou Know, Baby\tASCH\t351-3\tMA714\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC022449.mp3\tTommy Dorsey And His Orch\tYou Leave Me Breathless\tVICTOR\t25828\t022449\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic25828.mp3\tTommy Dorsey And His Orchestra\tYou Leave Me Breathless\tVictor\t25828\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_066.mp3\tTommy Dorsey And His Orchestra\tYou Leave Me Breathless\tVictor\t25828\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU22843-1.mp3\tRed Norvo & His Orch\tYou Leave Me Breathless (v M. Bailey)\tBRUNSWICK\t8135\t22843-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU18261-1.mp3\tKay Thompson And Her Orch\tYou Let Me Down\tBRUNSWICK\t7560\t18261-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/CBS24645-A.mp3\tJimmie Lunceford And His Orchestra\tYou Let Me Down\tCBS\t66421\t24645-A\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3d/Oke24966-A.mp3\tJimmie Lunceford And His Orchestra\tYou Let Me Down\tOkeh\t5033\t24966-A\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Gerard Wilson-t/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-p\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-7837-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tYou Let Me Down\tParlophone\tF-605\tCE-7837-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60037.mp3\tJimmy Dorsey & His Orch.\tYou Let Me Down (v B E)\tDECCA\t602A\t60037\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18318-1.mp3\tTeddy Wilson & His Orch\tYou Let Me Down (vb.holiday)\tARC\tBR7581\t18318-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke29533-1.mp3\tCount Basie And His Orchestra\tYou Lied To Me\tOkeh\t6267\t29533-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic40079-2.mp3\tCarol C. Tate\tYou Live On In Memory\tVictor\t21061\t40079-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU027292.mp3\tFats Waller And His Rhythm\tYou Look Good To Me\tBLUEBIRD\t10008\t027292\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2288.mp3\tBing Crosby\tYou Lucky People You\tDECCA\t3636B\tDLA2288\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO30509-1.mp3\tHarry James And His Orch\tYou Made Me Love You\tCOLUMBIA\t36296\tCO30509-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/DECDLA967-A.mp3\tJudy Garland - Harry Sosnik\tYou Made Me Love You\tDECCA\t1463\tDLA967-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/OKE9980-A.mp3\tLouis Armstrong's Hot Five\tYou Made Me Love You\tOKeh\t8447\t09980-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2067-A.mp3\tBing Crosby & Merry Macs\tYou Made Me Love You\tDECCA\t3423B\tDLA2067-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU054678-1.mp3\tUna Mae Carlisle\tYou Made Me Love You\tBLUEBIRD\t10898\t054678-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4258-T8.mp3\tEddie Heywood & His Orch\tYou Made Me Love You\tDECCA\t23677\tL4258-T8\t1946\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDec1463.mp3\tJudy Garland\tYou Made Me Love You\tDecca\t1463\t\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_038.mp3\tHarry James And His Orchestra\tYou Made Me Love You\tCAPITOL\t\t14231\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC54770-6.mp3\tJack Smith\tYou May Not Like It\tVICTOR\t22443\t54770-6\t1930\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81336-2.mp3\tThe Georgians\tYou Maybe Fast, But Your Mamma's Gonna Slow You Down\tColumbia\t23-D\t81336-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU063839-1.mp3\tUna Mae Carlisle\tYou Mean So Much To Me\tBLUEBIRD\t11159\t063839-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec62445-A.mp3\tLil Armstrong And Her Swing Band\tYou Mean So Much To Me\tDecca\t1502\t62445-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU038210.mp3\tFats Waller And His Rhythm\tYou Meet The Nicest People In Your Dreams\tBLUEBIRD\t10346A\t038210\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic58582-2.mp3\tHerny ''red'' Allen And His New York Orchestra\tYou Might Get Better, But You'll Never Get Well\tVictor\tV-38140\t58582-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC058761.mp3\tTommy Dorsey And His Orch\tYou Might Have Belonged To Another\tVICTOR\t27274\t058761\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_129.mp3\tTommy Dorsey Orch V Frank Sinatra\tYou Might Have Belonged To Another\tVICTOR\t27274\t058761\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU073441.mp3\tFats Waller And His Rhythm\tYou Must Be Losing Your Mind\tBLUEBIRD\t11539\t073441\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/VOC4460y.mp3\tChick Bullock And His Levee Loung\tYou Must Have Been A Beauti\tVocalion\t4460\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/DECC91511.mp3\tBing Crosby\tYou Must Have Been A Beautiful Baby\tDECCA\t2147A\tC91511\t1938\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic26066.mp3\tTommy Dorsey & His Clambake 7\tYou Must Have Been A Beautiful Baby\tVictor\t26066\t\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC027243-2.mp3\tTommy Dorsey & His Clambake 7\tYou Must Have Been A Beautiful Baby\tVICTOR\t26066\t027243-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_142.mp3\tTommy Dorsey And His Orchestra Feat. Edythe Wright\tYou Must Have Been A Beautiful Baby\tVICTOR\t26066\t027243-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Col145762-3.mp3\tJohnny Dunn And His Band\tYou Need Some Loving\tColumbia\t14358-D\t145762-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR186-Hx.mp3\tBroadway Bell-hops\tYou Need Someone To Love\tHarmony\t186-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3h/BLU101137-1.mp3\tStew Pletcher And His Orchestra\tYou Never Looked So Beautiful\tBLUEBIRD\t6343\t101137-1\t1936\t\nhttp://www.78-tours.net/mp3/VIC25291-B.mp3\tTommy Dorsey And His Orchestra\tYou Never Looked So Beautiful (featured In The M-g-m Film \"the Great Ziegfels\") (na Ica Estabas Tan\tVICTOR\t25291\t25291-B\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO41687.mp3\tDuke Ellington & His Orchestra\tYou Of All People\tCOLUMBIA\t38606\tCO41687\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW146889-3.mp3\tBessie Smith\tYou Ought To Be Ashamed\tCOLUMBIA\t14399 D\tW146889-3\t1928\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW152710.mp3\tLittle Jack Little\tYou Oughta Be In Pictures\tCOLUMBIA\t2895 D\tW152710\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC81786-2.mp3\tRudy Vallee & His Ct.yankees\tYou Oughta Be In Pictures\tVICTOR\t24580\t81786-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3r/RiCol2895-D.mp3\tLittle Jack Little\tYou Oughta Be In Pictures\tColumbia\t2895-D\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_069.mp3\tRudy Vallee And His Connecticut Yankees\tYou Oughta Be In Pictures\tVICTOR\t24580\t81786-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/BRU14993-A.mp3\tBoswell Sisters\tYou Oughta Be In Pictures (my Star Of Stars)\tBRUNSWICK\t6798\t14993-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_259.mp3\tBoswell Sisters\tYou Oughta Be In Pictures (my Star Of Stars)\tBRUNSWICK\t6798\t14993-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh781B.mp3\tJay Wilbur And His Band\tYou Oughta Be In Pictures (v Maurice Elwin)\tRex\t8152\tF-742-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC57565-2.mp3\tWilton Crawley And His Orch\tYou Oughta See My Gal\tVICTOR\t38136\t57565-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic57565-2.mp3\tWilton Crawley And His Orchestra\tYou Oughta See My Gal\tVictor\tV-38136\t57565-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3e/VICOB5835-2.mp3\tRay Noble And His Orchestra\tYou Oughta See Sally On Sunday\tVICTOR\t24575\tOB5835-2\t1933\twith Al Bowlly\nhttp://www.jazz-on-line.com/a/mp3c/BLU031531.mp3\tFats Waller And His Rhythm\tYou Out Smarted Yourself\tBLUEBIRD\t10116\t031531\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA21-0431x.mp3\tHank Snow\tYou Pass Me By\tRCA\t21-0431\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1914_026.mp3\tHenry Burr\tYou Planted A Rose In The Garden Of Love\tCOLUMBIA\t1549\t39356\t1914\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUE37391-A.mp3\tMills Bros\tYou Rascal You\tBRUNSWICK\t6225\tE37391-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151839-1.mp3\tJack Teagarden & His Orch\tYou Rascal You\tCOLUMBIA\t2558 D\tW151839-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70195-1.mp3\tLuis Russell & His Orch\tYou Rascal You\tVICTOR\t22793A\t70195-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/BruC-6435.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tYou Rascal You\tBrunswick\t7180\tC-6435\t1930\t\nhttp://www.jazz-on-line.com/a/mp3d/MelE-36928-A.mp3\tConnie's Inn Orchestra\tYou Rascal You\tMelotone\tM-12216\tE-36928-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE36831-A.mp3\tRed Nichols & His Orch\tYou Rascal You (v R M)\tBRUNSWICK\t6133\tE36831-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUE37221.mp3\tCab Calloway & His Orch\tYou Rascal, You\tBRUNSWICK\t6196\tE37221\t1931\t\nhttp://www.jazz-on-line.com/a/mp3o/DECC93790.mp3\tLouis Armstrong And His Orch.\tYou Rascal, You\tDECCA\t25156\tC93790\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOLA-2215-1.mp3\tDjango Reinhardt\tYou Rascal, You\tSWING\t35\tOLA-2215-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_193.mp3\tCab Calloway And His Orchestra\tYou Rascal, You\tBRUNSWICK\t6196\tE37221\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/BruE-37221-A.mp3\tCab Calloway And His Orchestra\tYou Rascal, You\tBrunswick\t6196\tE-37221-A\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VocC-5950-A.mp3\tJimmie Noone's Apex Club Orchestra\tYou Rascal, You ? V J N - E P\tVocalion \t1584\tC-5950-A\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_101.mp3\tHenry Burr\tYou Remind Me Of My Mother\tVictor\t18957\t26897\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC26897.mp3\tHenry Burr\tYou Remind Me Of My Mother\tVICTOR\t18957\t26897\t1922\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67112.mp3\tLouis Jordan & His Tympani 5\tYou Run Your Mouth And I'll Run My Business\tDECCA\t7705\t67112\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048779.mp3\tFats Waller And His Rhythm\tYou Run Your Mouth, I'll Run My Business\tBLUEBIRD\t10779\t048779\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67649.mp3\tLouis Armstrong & His Orch.\tYou Run Your Mouth, I'll Run My Business\tDECCA\t3204A\t67649\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW151363-2.mp3\tBen Selvin & His Orch\tYou Said It (vps+hr)\tCOLUMBIA\t2426\tW151363-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO41759.mp3\tSarah Vaughan\tYou Say You Care\tCOLUMBIA\t38630\tCO41759\t\t\nhttp://www.jazz-on-line.com/a/mp3a/OKe404764-B.mp3\tMississippi Bracy\tYou Scolded Me And Drove Me From Your Door\tOKeh\t8904\t404764-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D238A.mp3\tDick Haymes\tYou Send Me\tV-DISC\t238A\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC65188.mp3\tAndy Kirk & Clouds Of Joy\tYou Set Me On Fire\tDECCA\t2383A\t65188\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Oke24054-2.mp3\tJimmie Lunceford And His Orchestra\tYou Set Me On Fire\tOkeh\t4712\t24054-2\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3d/Dec65188-A.mp3\tAndy Kirk And His Twelve Clouds Of Joy\tYou Set Me On Fire\tDecca\t2383\t65188-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/Dec63238-A.mp3\tLil Armstrong And Her Swing Band\tYou Shall Reap What You Sow\tDecca\t1722\t63238-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP982.mp3\tKing Cole Trio\tYou Should Have Told Me\tCAPITOL\t\t982\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU064916.mp3\tDelta Boys (estes)\tYou Shouldn't Do That\tBLUEBIRD\t8852\t064916\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_209.mp3\tNorman Brooks, Orch. Under Dir. Of Burt Farber\tYou Shouldn't Have Kissed Me The First Time\tZodiac\t102\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07745.mp3\tFats Waller And His Rhythm\tYou Showed Me The Way\tVICTOR\t25579\t07745\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC07746.mp3\tFats Waller And His Rhythm\tYou Showed Me The Way\tVICTOR\t25565\t07746\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU04568.mp3\tWingy Manone & His Orch\tYou Showed Me The Way\tBLUEBIRD\t6804\t04568\t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/BruB-20699-2.mp3\tTeddy Wilson And His Orchestra\tYou Showed Me The Way\tBrunswick\t7840  \tB-20699-2  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU20699-2.mp3\tTeddy Wilson & His Orch\tYou Showed Me The Way (vb.holiday)\tBRUNSWICK\t7840\t20699-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_196.mp3\tWingy Manone And His Orchestra\tYou Started Me Dreaming\tBluebird\t6359\t101197\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99918.mp3\tTommy Dorsey & His Orch\tYou Started Me Dreaming\tVICTOR\t25284\t99918\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/BLU101197.mp3\tWingy Manone & His Orch\tYou Started Me Dreaming\tBLUEBIRD\t6359\t101197\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_070.mp3\tTommy Dorsey And His Orchestra Feat. Joe Dixon\tYou Started Me Dreaming\tVICTOR\t25284\t99918\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT1418.mp3\tMildred Bailey\tYou Started Something\tMAJESTIC\t1209\tT1418\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh186.mp3\tBilly Ternent And His Sweet Rhythm Orchestra\tYou Started Something\tHMV\tBD-5447\tOEA-6232-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC98176.mp3\tFats Waller And His Rhythm\tYou Stayed Away Too Long\tVICTOR\t25222\t98176\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU058887.mp3\tGlenn Miller & His Orch\tYou Stepped Out Of A Dream\tBLUEBIRD\t11042\t058887\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_251.mp3\tKay Kyser And His Orchestra\tYou Stepped Out Of A Dream\tCOLUMBIA\t35946\t29196\t1941\t\nhttp://www.jazz-on-line.com/a/mp3b/COL30192YS.mp3\tHot Lips Page\tYou Stole My Wife, You Horse Thief\tCOLUMBIA\t30192\t\t1950\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCCO4988.mp3\tBig Three Trio\tYou Sure Look Good To Me\tCOLUMBIA\t38093\tCCO4988\t1947\t\nhttp://www.jazz-on-line.com/a/mp3b/MER1385.mp3\tCootie Williams & His Orch\tYou Talk A Little Trash\tMERCURY\t8083\t1385\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/MANW1243.mp3\tLuis Russell & His Orchestra\tYou Taught Me How To Smile Again\tMANOR\t1006\tW1243\t1945\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC031803.mp3\tTommy Dorsey & His Orch\tYou Taught Me To Love Again\tVICTOR\t26154\t031803\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUWC2587-A.mp3\tGene Krupa & His Orch\tYou Taught Me To Love Again\tBRUNSWICK\t8400\tWC2587-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COLCO40943.mp3\tSarah Vaughan\tYou Taught Me To Love Again\tCOLUMBIA\t38810\tCO40943\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_308.mp3\tGene Krupa And His Orchestra\tYou Taught Me To Love Again\tBrunswick\t8400\tWV-2587-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3l/Col80848-3.mp3\tThe Georgians\tYou Tell Her - I Strutter\tColumbia\tA-3857\t80848-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_059.mp3\tVan And Schenck\tYou Tell Her - I Stutter\tCOLUMBIA\tA-3770\t80667-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1923_088.mp3\tErnest Hare And Billy Jones\tYou Tell Her - I Stutter\tEDISON\t51079R\t8639-B\t1923\t\nhttp://www.jazz-on-line.com/a/mp3e/OKeS71014-B.mp3\tBilly Jones And Ernest Hare\tYou Tell Her I Stutter\tOKeh\t4756\tS71014-B\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC26886.mp3\tBilly Murray\tYou Tell Her I Stutter\tVICTOR\t18982\t26886?\t1922\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU9866.mp3\tCotton Pickers\tYou Tell Her I Stutter (vbj)\tBRUNSWICK\t2404\t9866\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC67732.mp3\tWoody Herman & His Orchestra\tYou Think Of Everything\tDECCA\t3217A\t67732\t1940\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCB109.mp3\tJimmy Luverte And His Society Troubadours\tYou Think She Ain't\tVOCALION\t03559\tB109\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_218.mp3\tRoyal Jokers\tYou Tickle Me Baby\tEpic\t9125\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC43670-1.mp3\tPaul Whiteman And His Orch\tYou Took Advantage Of Me\tVICTOR\t21398\t43670-1\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe400896.mp3\tMiff Mole's Little Molers\tYou Took Advantage Of Me\tOKeh\t41098\t400896\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC60229.mp3\tBunny Berigan & His Blue Boys\tYou Took Advantage Of Me\tDECCA\t18117\t60229\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/DIS6008YT.mp3\tCliff Jackson & Don Frye\tYou Took Advantage Of Me\tDISC\t6008\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/COM22311.mp3\tBud Freeman Trio\tYou Took Advantage Of Me\tCOMMODORE\t501\t22311\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/DISD195.mp3\tCliff Jackson\tYou Took Advantage Of Me\tDISC\t6008B\tD195\t1945\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480554.mp3\tArt Tatum Quartet\tYou Took Advantage Of Me\tClef\tMGC679\t2304-1\t1955\tRoy Eldridge (tp), Art Tatum (p), John Simmons (sb), Alvin Stoller (dm)\nhttp://www.jazz-on-line.com/a/mp3w/1943_125.mp3\tTommy Dorsey And His Orchestra Feat. V/jo Stafford\tYou Took My Love\tVictor\t1569\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/CONW3528.mp3\tEthel Waters W J.c.heard Orch\tYou Took My Man\tCONTIN\t10008\tW3528\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_267.mp3\tShep Fields And His Rippling Rhythm Orchestra (v-bob Goday)\tYou Took The Words Right Out Of My Heart\tBluebird\t7304\t017429\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_153.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tYou Took The Words Right Out Of My Heart\tVICTOR\t25720\t017039\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO47269.mp3\tWilma Lee And Stoney Cooper\tYou Tried To Ruin My Name\tCOLUMBIA\t20898\tCO47269\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_098.mp3\tGuy Lombardo And His Royal Canadians\tYou Try Somebody Else (we'll Be Back Together Again)\tColumbia\t2567\t\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COL97710-1.mp3\tBenny Goodman And His Orchestra\tYou Turned The Tables On Me\tVICTOR\t25391\t97710-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU03239.mp3\tTempo King's Kings Of Tempo\tYou Turned The Tables On Me\tBLUEBIRD\t6684\t03239\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74387.mp3\tElla Fitzgerald & Daydreamers\tYou Turned The Tables On Me\tDECCA\t24387\t74387\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO38660.mp3\tGene Krupa\tYou Turned The Tables On Me\tCOLUMBIA\t38141\tCO38660\t1947\t\nhttp://www.jazz-on-line.com/a/mp3d/BruLA-1160-A.mp3\tTeddy Wilson And His Orchestra\tYou Turned The Tables On Me\tBrunswick\t7736  \tLA-1160-A\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_024.mp3\tBenny Goodman And His Orchestra\tYou Turned The Tables On Me\tVICTOR\t25391\t97710-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/VocS-117-2.mp3\tBenny Carter And His Orchestra\tYou Understand\tVocalion\tS-27\tS-117-2\t1936\t\nhttp://www.jazz-on-line.com/a/mp3a/COL29210.mp3\tEddy Duchin And His Orch\tYou Walk By\tCOLUMBIA\t35903\t29210\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_111.mp3\tKenny Baker O Leonard Joy\tYou Walk By\tVICTOR\t27250\t057054\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_183.mp3\tBobby Byrne And His Orchestra Feat. V/jerry Wayne\tYou Walk By\tDECCA\t3613A\t68593\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_046.mp3\tEddy Duchin And His Orchestra\tYou Walk By\tCOLUMBIA\t35903\t29210\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC021152.mp3\tFats Waller And His Rhythm\tYou Went To My Head\tVICTOR\t25812\t021152\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc22371-2.mp3\tMaxine Sullivan (orchestra Under Direction Claude Thornhill)\tYou Went To My Head\tVocalion\t3993\t22371-2  \t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/BluBLP5007x.mp3\tErroll Garner\tYou Were Born To Be Kissed\tBlue Note\tBLP5007\t\t1944\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_016.mp3\tHenry Burr And Albert Campbell\tYou Were Just Made To Order For Me\tVICTOR\t18137\t18308-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC18308-2.mp3\tAl Campbell & Henry Burr\tYou Were Made Just To Order For Me\tVICTOR\t18137\t18308-2\t1916\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW147920-3.mp3\tBroadway Nitelites\tYou Were Meant For Me\tCOLUMBIA\t1738 D\tW147920-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR845-Hy.mp3\tJack Hart\tYou Were Meant For Me\tHarmony\t845-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBan6319.mp3\tWillie Creager & His Orchestra\tYou Were Meant For Me\tBanner\t6319\t\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1929_015.mp3\tNat Shilkret And The Victor Orchestra\tYou Were Meant For Me\tVICTOR\t21886\t49959-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_218.mp3\tConnee Boswell Feat. Victor Young's Orchestra\tYou Were Meant For Me\tDECCA\t3837A\tDLA2422\t1948\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD8VB3429.mp3\tRose Murphy (the Chee-chee Girl)\tYou Were Meant For Me\tVictor\t22-0028-B\tD8VB3429\t1948\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC49959-3.mp3\tNat Shilkret And Victor Orch\tYou Were Meant For Me (vsl)\tVICTOR\t21886\t49959-3\t1929\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM47S96.mp3\tBlue Barron And His Orch\tYou Were Only Fooling\tMGM\t10185\t47S96\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC63135-3.mp3\tKing Oliver & His Orchestra\tYou Were Only Passing Time With Me\tVICTOR\t23011\t63135-3\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKEC3976-1.mp3\tGene Krupa & His Orch\tYou Were There\tOKEH\t6376\tC3976-1\t1941\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP223x.mp3\tTex Ritter\tYou Will Have To Pay\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_018.mp3\tFiddlin' John Carson\tYou Will Never Miss Your Mother Until She Is Gone\tOKeh\t4994A\tS72011-B\t1924\t\nhttp://www.jazz-on-line.com/a/mp3l/VIC62373-6.mp3\tLeo Reisman & His Orch\tYou Will Remember Vienna\tVICTOR\t22512\t62373-6\t1930\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM52S6067.mp3\tHank Williams\tYou Win Again\tMGM\t11318B\t52S6067\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_096alt.mp3\tTommy Edwards\tYou Win Again\tMGM\t11326\t52S300\t1952\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_235.mp3\tPaulette Sisters\tYou Win Again\tCapitol\t3186\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_096.mp3\tTommy Edwards Feat. Leroy Holmes' Orchestra\tYou Win Again\tMGM\t11326\t52S300\t1952\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO35391.mp3\tLes Brown And Doris Day\tYou Won't Be Satisfied\tCOLUMBIA\t36884\tCO35391\t1945\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC73285.mp3\tElla Fitzgerald And L.armstrong\tYou Won't Be Satisfied\tDECCA\t23496\t73285\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/MAJT534.mp3\tLouis Prima & His Orchestra\tYou Won't Be Satisfied\tMAJESTIC\t7144\tT534\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_135.mp3\tElla Fitzgerald And Louis Armstrong Feat. Bob Haggart's Orchestra\tYou Won't Be Satisfied (until You Break My Heart)\tDECCA\t23496\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_021.mp3\tLes Brown And His Orchestra Feat. Doris Day\tYou Won't Be Satisfied (until You Break My Heart)\tCOLUMBIA\t36884\tCO35391\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_049.mp3\tPerry Como Feat. Russell Case's Orchestra And The Satisfiers\tYou Won't Be Satisfied (until You Break My Heart)\tVICTOER\t1788\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC68291.mp3\tBuddy Johnson And His Band\tYou Won't Let Me Go\tDECCA\t8518\t68291\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh018.mp3\tJack Hyltons And His Orchestra\tYou Wouldn't Fool Me (v Sam Browne)\tHMV\tB-5695\tBb-17297-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_003.mp3\tAmes Brothers, The Feat. Hugo Winterhalter And His Orchestra\tYou You You\tRCA VICTOR\t20-5325\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/RCA20-1519.mp3\tDinah Shore\tYou'd Be So Nice To Come Home To\tRCA\t20-1519\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_027.mp3\tDinah Shore\tYou'd Be So Nice To Come Home To\tRCA\t20-1519\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480399.mp3\tArt Pepper\tYou'd Be So Nice To Come Home To\tContinental\tC3532\t\t1957\tRed Garland, P, Philly Jo Jones, D, Paul Chambers, B\nhttp://www.jazz-on-line.com/a/mp3a/COLLA2075.mp3\tOrrin Tucker And His Orchestra Vocal Chorus By Bonnie Baker\tYou'd Be Surprised\tCOLUMBIA\t35344\tLA 2075\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/EME04670-2.mp3\tEddie Cantor\tYou'd Be Surprised\tEMERSON\t10102\t04670-2\t1919\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_020.mp3\tEddie Cantor\tYou'd Be Surprised\tEMERSON\t10102\t04670-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_261.mp3\tJohnnie Ray\tYou'd Be Surprised\tCOLUMBIA\t40154\tCO50572-1\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_086.mp3\tAll-star Trio\tYou'd Be Surprised\tVICTOR\t18643\t23357-2\t1920\t\nhttp://www.jazz-on-line.com/a/mp3l/Col81375-3.mp3\tThe Georgians\tYou'd Better Keep Babying Baby\tColumbia\t40-D\t81375-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_120.mp3\tArthur Collins And Byron Harlan\tYou'd Never Know That Old Home Town Of Mine\tVictor\t17911\t\t1916\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC70225-A.mp3\tBuddy Johnson & His Band\tYou'll Get Them Blues\tDECCA\t8611\t70225-A\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_359.mp3\tFrank Sinatra\tYou'll Get Yours\tCapitol\t3350\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83010.mp3\tElla Fitzgerald With\tYou'll Have To Swing It - Part.1\tDECCA\t28774\t83010\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1952_134.mp3\tTeresa Brewer Feat. Jack Pleis Orchestra\tYou'll Never Get Away\tCORAL\t60829\t\t1952\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU13177-A.mp3\tGuy Lombardo Royal Canadians\tYou'll Never Get To Heaven That Way\tBRUNSWICK\t6536\t13177-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC2068-2.mp3\tCharlie Palloy & His Orch\tYou'll Never Get To Heaven That Way\tCROWN\t3500\tC2068-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81949-3.mp3\tFletcher Henderson's Orch\tYou'll Never Get To Heaven With Those Eyes\tCOLUMBIA\t202D\t81949-3\t1924\t\nhttp://www.jazz-on-line.com/a/mp3a/COLCO33251.mp3\tFrank Sinatra\tYou'll Never Know\tCOLUMBIA\t36678\tCO33251\t1942\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18556A.mp3\tDick Haymes And Song Spinners\tYou'll Never Know\tDECCA\t18556-A\t\t1943\t\nhttp://www.jazz-on-line.com/a/mp3r/RiDEC18556.mp3\tDick Haymes & Song Spinners\tYou'll Never Know\tDECCA\t18556\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_015.mp3\tFrank Sinatra\tYou'll Never Know\tCOLUMBIA\t36678\tCO33251\t1943\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_146.mp3\tRosemary Clooney Feat. Harry James And His Orchestra\tYou'll Never Know\tCOLUMBIA\t39905\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/COL79516-3.mp3\tBert Williams\tYou'll Never Need A Doctor No More\tCOLUMBIA\tA-3339\t79516-3\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_071.mp3\tPlatters\tYou'll Never Never Know\tMercury\t70948\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/COLHCO1379.mp3\tFrank Sinatra\tYou'll Never Walk Alone\tCOLUMBIA\t36825\tHCO1379\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1945_129.mp3\tFrank Sinatra\tYou'll Never Walk Alone\tCOLUMBIA\t39741\tZSP6514\t1945\t\nhttp://www.jazz-on-line.com/a/mp3w/1946_262.mp3\tJudy Garland\tYou'll Never Walk Alone\tDECCA\t29295\t72973\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_160.mp3\tRoy Hamilton\tYou'll Never Walk Alone\tEpic\t9015\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3e/VIC74823-1.mp3\tLouis Armstrong And His Orch\tYou'll Wish You'd Never Been Born\tVICTOR\t24204\t74823-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU15462-1.mp3\tLeo Reisman And His Orch (vha)\tYou're A Builder Upper\tBRUNSWICK\t6941\t15462-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_084.mp3\tLeo Reisman And His Orchestra Feat. Harold Arlen\tYou're A Builder Upper\tBrunswick\t6941\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_161.mp3\tGlen Gray And Casa Loma Orchestra\tYou're A Builder Upper\tDecca\t193\t\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16118-A.mp3\tJohnny Green & His Orch\tYou're A Builder Upper (v E.merman)\tBRUNSWICK\t6995\t16118-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1916_023.mp3\tAl Jolson\tYou're A Dangerous Girl\tCOLUMBIA\tA-2041\t46787\t1916\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_098.mp3\tPrince's Orchestra\tYou're A Grand Old Flag\tColumbia\t5978\t\t1917\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC89567-1.mp3\tBenny Goodman And His Orchestra\tYou're A Heavenly Thing\tVICTOR\t25021\t89567-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_176.mp3\tBenny Goodman And His Orchestra Feat. Helen Ward\tYou're A Heavenly Thing\tVICTOR\t25021\t89567-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP62622.mp3\tLeon Chappel\tYou're A Lovin' Woman\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26344.mp3\tBillie Holiday & Her Orch\tYou're A Lucky Guy\tCBS\tVO5302\t26344\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66985.mp3\tLouis Armstrong And His Orch.\tYou're A Lucky Guy\tDECCA\t60810\t66985\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/Blu43319.mp3\tArtie Shaw And His Orchestra\tYou're A Lucky Guy\tBluebird\t10482\t043319-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VARUS1006-1.mp3\tRoy Eldridge & His Orch\tYou're A Lucky Guy (v Roy Eldridge)\tVARSITY\t8084\tUS1006-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/Blu043319-1.mp3\tArtie Shaw And His Orchestra\tYou're A Lucky Guy ? V T P\tBluebird\tB-10482\t043319-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC025466.mp3\tBenny Goodman And His Orchestra\tYou're A Sweet Little Headache\tVICTOR\t26071\t025466\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU027233-1.mp3\tArtie Shaw And His Orchestra\tYou're A Sweet Little Headache\tBLUEBIRD\t7889\t027233-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23456-1.mp3\tRed Norvo & His Orch\tYou're A Sweet Little Headache\tBRUNSWICK\t8227\t23456-1\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECDLA1547.mp3\tBing Crosby - J S Trotter\tYou're A Sweet Little Headache\tDECCA\t2200A\tDLA1547\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_083.mp3\tBenny Goodman And His Orchestra Feat. Martha Tilton\tYou're A Sweet Little Headache\tVICTOR\t26071\t025466\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC63130-B.mp3\tEthel Waters\tYou're A Sweetheart\tDECCA\t1613\t63130-B\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62714.mp3\tWoody Herman & His Orchestra\tYou're A Sweetheart\tDECCA\t1535\t62714\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC014680.mp3\tTommy Dorsey & Clambake 7\tYou're A Sweetheart\tVICTOR\t25695\t014680\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_026.mp3\tDolly Dawn And Her Dawn Patrol\tYou're A Sweetheart\tVOCALION\t3874\tM677\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_307.mp3\tEthel Waters\tYou're A Sweetheart\tDECCA\t1613\t63130-B\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM49S431.mp3\tBilly Eckstine; Sarah Vaughan\tYou're All I Need\tMGM\t10690A\t49S431\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_031.mp3\tEddy Duchin And His Orchestra Feat. V/lew Sherwood\tYou're All I Need\tVICTOR\t25029\t89700-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3a/MER1640-1.mp3\tFrankie Laine W Carl Fischer\tYou're All I Want For Christmas\tMERCURY\t5177\t1640-1\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_189.mp3\tFrank Gallagher Feat. The Dana Serenaders\tYou're All I Want For Christmas\tDana\t2026\t\t1948\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_236.mp3\tEddie Fisher\tYou're All I Want For Christmas\tRCA Victor\t5065\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2448.mp3\tJimmie Lunceford & His Orch\tYou're Always In My Dreams\tDECCA\t18534B\tDLA2448\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/DecDLA-2448-A.mp3\tJimmie Lunceford And His Orchestra\tYou're Always In My Dreams\tDecca\t18534\tDLA-2448-A\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC17258-2.mp3\tWingy Manone & His Orch\tYou're An Angel\tVOCALION\t2933\t17258-2\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1938_046.mp3\tLarry Clinton And His Orchestra Feat. V/bea Wain\tYou're An Education\tVICTOR\t25794\t019660-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC74652-1.mp3\tPaul Whiteman Presents Ramona\tYou're An Old Smoothie (vramona)\tVICTOR\t24202\t74652-1\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC019421-2.mp3\tTommy Dorsey & His Clambake 7\tYou're As Pretty As A Picture\tVICTOR\t26005\t019421-2\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1903_049.mp3\tJ.w. Myers\tYou're As Welcome As The Flowers In May\tColumbia\t1600\t\t1903\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU12889-A.mp3\tBing Crosby\tYou're Beautiful Tonight, My Dear\tBRUNSWICK\t6477\t12889-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3e/Mus5561.mp3\tGeorgie Auld And His Orchestra\tYou're Blas\tMusicraft\t394\t5561\t1946\t\nhttp://www.jazz-on-line.com/a/mp3w/1932_054.mp3\tGus Arnheim And His Orchestra\tYou're Blase (meri Bell Vocal)\tVICTOR\t24054\t71763-4\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1774-2.mp3\tRuss Carlson & His Orch\tYou're Blase (v D R)\tCROWN\t3347A\tC1774-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC71763-4.mp3\tGus Arnheim Coconut Grove Orch\tYou're Blase (v Meri Bell)\tVICTOR\t24054\t71763-4\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS5561.mp3\tGeorgie Auld & His Orch\tYou're Blase (v Sarah Vaughn)\tMUSICRAFT\t394\t5561\t1946\t\nhttp://www.jazz-on-line.com/a/mp3h/DEC39327.mp3\tBirmingham Serenaders\tYou're Bound To Look Like A Monkey\tDECCA\t7060\t39327\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404035-B.mp3\tClarence Williams Novelty Band\tYou're Bound To Look Like A Monkey (vcw)\tOKeh\t8798\t404035-B\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC74014.mp3\tElla Fitzgerald W Bob Haggart\tYou're Breakin' In A New Heart\tDECCA\t24157\t74014\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/MERME2517-2.mp3\tVic Damone W Glenn Osser Orch\tYou're Breaking My Heart\tMERCURY\t5271\tME2517-2\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/COLH667.mp3\tTed Daffan's Texans\tYou're Breaking My Heart\tCOLUMBIA\t37038\tH667\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_056.mp3\tInk Spots\tYou're Breaking My Heart\tDECCA\t24693\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_041.mp3\tBuddy Clark Feat. Harry Zimmerman's Orchestra\tYou're Breaking My Heart\tCOLUMBIA\t38546\tHCO3800\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_008.mp3\tVic Damone Feat. Glenn Osser's Orchestra\tYou're Breaking My Heart\tMERCURY\t5271\tME2517-2\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_128.mp3\tRalph Flanagan And His Orchestra Feat. Harry Prime\tYou're Breaking My Heart\tBluebird\t0001\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28640-1.mp3\tGene Krupa & His Orch\tYou're Breaking My Heart All Over Again\tOKEH\t5814\t28640-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_257.mp3\tInk Spots\tYou're Breaking My Heart All Over Again\tDECCA\t3288 B\t67900A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA2286.mp3\tBing Crosby & J S Trotter\tYou're Dangerous\tDECCA\t3637A\tDLA2286\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/MUS595x.mp3\tMel Torme\tYou're Driving Me Crazy\tMUSICRAFT\t595\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/ALL137.mp3\tLester Young\tYou're Driving Me Crazy\tALLADDIN\t137\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO47289-1.mp3\tErroll Garner\tYou're Driving Me Crazy\tCOLUMBIA\t40172\tCO47289-1\t1952\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUE35404.mp3\tNick Lucas & His Troubadors\tYou're Driving Me Crazy\tBRUNSWICK\t4987\tE35404\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC64351-2.mp3\tRudy Vallee & His Ct.yankees\tYou're Driving Me Crazy\tVICTOR\t22572\t64351-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COMR2127.mp3\tJess Stacy\tYou're Driving Me Crazy\tCOMMODORE\t529\tR2127\t1939\t\nhttp://www.jazz-on-line.com/a/mp3d/GraOLA-1704-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tYou're Driving Me Crazy\tGramophone\tK-8396\tOLA-1704-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3b/Joh054.mp3\tJack Payne And His Bbc Dance Orchestra (vocal Val Rosing)\tYou're Driving Me Crazy\tColumbia\tCB-222\tWA-11128-3\t1931\t\nhttp://www.jazz-on-line.com/a/mp3d/Ton1062-B.mp3\tMiss Valaida Med Winstrup Olesens Swingband\tYou're Driving Me Crazy \tTono\t21165\t1062-B\t1940\tValaida Snow t v acc. by W nstrup Olesen t dir. Kai Moeller cl, Leo Mathiesen p, Helge Jacobsen g, Christian Jensen b, Kai Fischer d\nhttp://www.jazz-on-line.com/a/mp3d/Vic64056-2.mp3\tMckinney's Cotton Pickers\tYou're Driving Me Crazy\tVictor\t23031\t64056-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_338.mp3\tBuddy Greco\tYou're Driving Me Crazy (what Did I Do)\tCoral\t60979\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3a/COLW150944-2.mp3\tGuy Lombardo Royal Canadians\tYou're Driving Me Crazy!\tCOLUMBIA\t2335 D\tW150944-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/OKe404418-C.mp3\tLouis Armstrong & His Orch\tYou're Driving Me Crazy!\tOKeh\t41478\t404418-C\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/Lee1930_1126_01.mp3\tLee Morse And Her Bluegrass Boys\tYou're Driving Me Crazy!\tColumbia\t2348DA\t\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_033.mp3\tRudy Vallee And His Connecticut Yankees\tYou're Driving Me Crazy! (what Did I Do?)\tVICTOR\t22572\t64351-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70988.mp3\tGene Kardos & His Orch\tYou're Foolin' Yourself (v D R)\tVICTOR\t22897\t70988\t1931\t\nhttp://www.jazz-on-line.com/a/mp3e/COLH843.mp3\tBob Wills And His Texas Playboys\tYou're From Texas\tCOLUMBIA\t20059\tH843\t1942\t\nhttp://www.jazz-on-line.com/a/mp3w/1944_124.mp3\tBob Wills And His Texas Playboys\tYou're From Texas\tCOLUMBIA\t20059\tH843\t1944\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU12887-A.mp3\tBing Crosby W Guy Lombardo\tYou're Getting To Be A Habit With Me\tBRUNSWICK\t6472\t12887-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/BAN12899-1.mp3\tEd Lloyd And His Orch (kardos)\tYou're Getting To Be A Habit With Me (vdr)\tBANNER\t32675\t12899-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU19895.mp3\tArtie Shaw And His Orchestra\tYou're Give Me A Song And A Dance\tBRUNSWICK\t7741\tB-19895-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC61314.mp3\tBob Howard & His Orch\tYou're Giving Me A Song And A Dance\tDECCA\t983A\t61314\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC0799-1.mp3\tBenny Goodman And His Orchestra\tYou're Giving Me A Song And Dance\tVICTOR\t25434\t0799-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU0422.mp3\tTempo King's Kings Of Tempo\tYou're Giving Me A Song And Dance Routine\tBLUEBIRD\t6575\t0422\t1936\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC64432.mp3\tBlue Lu Barker & Fly Cats\tYou're Going To Leave This Old Home, Jim\tDECCA\t7560\t64432\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/KIN818YG.mp3\tZeb Turner\tYou're Gonna Be Lonesome, Downhearted And Blue\tKING\t818\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM49S6036.mp3\tHank Williams\tYou're Gonna Change\tMGM\t10506\t49S6036\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DAVJD7175YG.mp3\tUna Mae Carlisle\tYou're Gonna Change Your Mind\tDAVIS\tJD7175\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DECC91836.mp3\tElla Fitzgerald & Her Orch\tYou're Gonna Lose Your Gal\tDECCA\t2816B\tC91836\t1939\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_105.mp3\tJan Garber And His Orchestra\tYou're Gonna Lose Your Gal\tVICTOR\t24444\t77071-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_171.mp3\tGlen Gray And Casa Loma Orchestra\tYou're Gonna Lose Your Gal\tBRUNSWICK\t6708\t14354\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC77071-2.mp3\tJan Garber & His Orch\tYou're Gonna Lose Your Gal (v F. Heilbron)\tVICTOR\t24444\t77071-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/PARL0052.mp3\tCharlie Patton\tYou're Gonna Need Somebody When You Die\tPARAMOUNT\t13031B\tL0052\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23761-1.mp3\tTeddy Wilson & His Orch\tYou're Gonna See A Lot Of Me\tBRUNSWICK\t8281\t23761-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23761-1.mp3\tTeddy Wilson And His Orchestra\tYou're Gonna See A Lot Of Me\tBrunswick\t8281\tB-23761-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3o/EDI9675.mp3\tEthel Firmie - O\tYou're Gonna Wake Some Mornin'\tEDISON\tBA 4917\t9675\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_210.mp3\tShep Fields And His Rippling Rhythm Orchestra (v-bob Goday)\tYou're Here, You're There (you're Everywhere)\tBluebird\t6931\t07827\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04532.mp3\tTommy Dorsey & His Orch\tYou're Here, You're There, You're Everywhere\tVICTOR\t25516\t04532\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC64347.mp3\tBob Howard & His Orch\tYou're In Kentucky Sure As You're Born\tDECCA\t2112B\t64347\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/BRUC9-10.mp3\tIsham Jones & His Orch\tYou're In Kentucky Sure As You're Born\tBRUNSWICK\t2557\tC9-10\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_128.mp3\tJan Garber And His Orchestra\tYou're In Kentucky Sure As You're Born\tVICTOR\t19216A\t29071-5\t1924\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_368.mp3\tGogi Grant\tYou're In Love\tEra\t1019\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3b/Voc21942-1.mp3\tFletcher Henderson And His Orchestra\tYou're In Love With Love\tVocalion\t3850\t21942-1  \t1937\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc24052-2.mp3\tJimmie Lunceford And His Orchestra\tYou're Just A Dream\tVocalion\t4754\t24052-2\t1939\tJimmie Lunceford dir. Eddie Tompkins-t-v/Paul Webster-t/Sy  O1iver-t-v-a/Elmer Crumbley-Russell Bowles-tb/James ''Trummy'' Young-tb-v/Willie Smith-cl-as-bar-v-a/Earl Carruthers-cl-as-bar/Ted Buckner-as/Dan Grissom-as-v/Joe Thomas-cl-ts/Edwin Willcox-\nhttp://www.jazz-on-line.com/a/mp3a/BRUC7117.mp3\tIsham Jones And His Orch\tYou're Just A Dream Come True\tBRUNSWICK\t6015\tC7117\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC62039.mp3\tBob Howard & His Orch\tYou're Just A Little Diff'rent\tDECCA\t1195\t62039\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC26343.mp3\tBillie Holiday & Her Orch\tYou're Just A No Account\tVOCALION\t5302\t26343\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC66986.mp3\tLouis Armstrong & His Orch.\tYou're Just A No Account\tDECCA\t2934B\t66986\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC22034-B.mp3\tRudy Vale And His Connecticut Ya\tYou're Just Another Memory\tVictor\t22034-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL6046.mp3\tLouis Armstrong - G.jenkins\tYou're Just In Love\tDECCA\t27481\tL6046\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_237.mp3\tRosemary Clooney And Guy Mitchell\tYou're Just In Love\tCOLUMBIA\t39052\tCO44540\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_036.mp3\tPerry Como And Fontane Sisters\tYou're Just In Love\tRCA Victor\t3945\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3c/Vic59527-1.mp3\tKing Oliver And His Orchestra\tYou're Just My Type\tVictor\t62-0061\t59527-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3b/MERME2739-1.mp3\tFrankie Laine W Carl Fischer\tYou're Just The Kind\tMERCURY\t5293\tME2739-1\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC04949-2.mp3\tFats Waller And His Rhythm\tYou're Laughing At Me\tVICTOR\t25530\t04949-2\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCC1754.mp3\tMildred Bailey & Her Orch\tYou're Laughing At Me\tVOCALION\t3456\tC1754\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU043349.mp3\tFats Waller And His Rhythm\tYou're Letting The Grass Grow Under Your Feet\tBLUEBIRD\t10527\t043349\t1939\t\nhttp://www.jazz-on-line.com/a/mp3b/COL77799.mp3\tAl Campbell & Henry Burr\tYou're Lips Are No Man's Land But Mine\tCOLUMBIA\tA-2580\t77799\t1918\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048791.mp3\tCharlie Barnet & His Orch\tYou're Lonely And I'm Lonely\tBLUEBIRD\t10691\t048791\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_174.mp3\tTommy Dorsey Orch V Frank Sinatra\tYou're Lonely And I'm Lonely\tVICTOR\t26596\t048938\t1940\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480555.mp3\tNat King Cole\tYou're Looking At Me\tCapitol\tEAP3\t15896-11\t1957\tNat King Cole, P & Vocal, acc. by Willie Smith (as), John Collins (g), Charlie Harris (sb), Lee Young (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480707.mp3\tNat King Cole\tYou're Looking At Me (alt Take)\tCapitol\t7243-5-20087-2-8\t\t1957\tNat King Cole, P & Vocal, Willie Smith, As, John Collins, G, Charlie Harris, B, Lee Young, D\nhttp://www.jazz-on-line.com/a/mp3c/BLU010135.mp3\tCharlie Barnet & His Orch\tYou're Looking For Romance\tBLUEBIRD\t6975\t010135\t1937\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC025468-4.mp3\tBenny Goodman And His Orchestra\tYou're Lovely, Madame\tVICTOR\t26053\t025468-4\t1938\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC63362-2.mp3\tDuke Ellington & His Orch\tYou're Lucky To Me\tVICTOR\t23017\t63362-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_500.mp3\tDream Weavers Featuring Wade Buff\tYou're Mine\tDecca\t29818\t89158\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/COLCO42530.mp3\tSarah Vaughan\tYou're Mine You\tCOLUMBIA\t39071\tCO42530\t1949\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480556.mp3\tBenny Golson Quartet\tYou're Mine, You\tContemporary\tC3552\t\t1957\tBenny Golson (ts), Wynton Kelly (p), Paul Chambers (sb), Charlie Persip (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480578.mp3\tArt Tatum/ Buddy Defranco Quartet\tYou're Mine, You\tVerve\tMGV-8229\t2681-1\t1956\tBuddy De Franco (cl), Art Tatum (p), Red Callender (sb), Bill Douglass (dm)\nhttp://www.jazz-on-line.com/a/mp3t/TS480685.mp3\tThe Art Tatum Trio\tYou're Mine, You\tPablo\t2310-733\t1795-1\t1954\tBenny Carter (as), Art Tatum (p), Louie Bellson (dm)\nhttp://www.jazz-on-line.com/a/mp3d/OKEWC-3048-A.mp3\tHorace Henderson And His Orchestra\tYou're Mine,you!\tOKEH\t5606\tWC-3048-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4595.mp3\tLouis Jordan & His Tympani 5\tYou're Much Too Fat\tDECCA\t28444\tL4595\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1912_071.mp3\tAmerican Quartet\tYou're My Baby\tVictor\t17114\t12051-1\t1912\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC66417.mp3\tLeon Self Blueridge Playboys\tYou're My Darling\tDECCA\t5747\t66417\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011091.mp3\tTommy Dorsey & His Clambake 7\tYou're My Desire\tVICTOR\t25625\t011091\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_346.mp3\tHudson-delange Orchestra\tYou're My Desire\tBRUNSWICK\t7998\tM212\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1937_284.mp3\tTeddy Wilson And His Orchestra\tYou're My Desire\tBRUNSWICK\t7940\tLA1380\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013350-1.mp3\tFats Waller And His Rhythm\tYou're My Dish\tVICTOR\t25679\t013350-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152071-3.mp3\tBen Selvin & His Orch\tYou're My Everything\tCOLUMBIA\t2596 D\tW152071-3\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/NATNSC103.mp3\tBilly Eckstine & His Orch\tYou're My Everything\tNATIONAL\t\tNSC103\t1946\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC3804B.mp3\tCarmen Cavallaro\tYou're My Everything\tDECCA\t3804B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1931_114.mp3\tArden-ohman Orchestra Feat. Frank Luther\tYou're My Everything\tVICTOR\t22818\t70250-1\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC63296.mp3\tEdgar Hayes & His Orchestra\tYou're My First Thought Every Morning\tDECCA\t2048A\t63296\t1938\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_280.mp3\tFrank Sinatra\tYou're My Girl\tCOLUMBIA\t37978\tCO38270\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC018335.mp3\tLionel Hampton & His Orch\tYou're My Ideal\tVICTOR\t25771\t018335\t1938\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic018335-1.mp3\tLionel Hampton And His Orchestra\tYou're My Ideal\tVictor\t25771\t018335-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC66876.mp3\tLouis Jordan & His Tympani 5\tYou're My Meat\tDECCA\t7719\t66876\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14076-1.mp3\tJoe Venuti & His Orch\tYou're My Past, Present And Future (v Don Elton)\tBANNER\t32874\t14076-1\t\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24796-.mp3\tBillie Holiday - Gordon Jenkin\tYou're My Thrill\tDECCA\t24796\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC24796-.mp3\tBillie Holiday\tYou're My Thrill\tDECCA\t24796\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480791.mp3\tBen Webster Sextet\tYou're My Thrill\tMercury\t8265\t4723-2\t1951\tMaynard Ferguson (tp), Ben Webster (ts), Gerald Wiggins (p), John Kirby (sb), George Jenkins (dm)\nhttp://www.jazz-on-line.com/a/mp3h/CAM3768-A.mp3\tDixie Daisy (the Whopee Makers)\tYou're My Waterloo\tCAMEO\t9142\t3768-A\t1929\t\nhttp://www.jazz-on-line.com/a/mp3h/DH480930.mp3\tTed Heath And His Music\tYou're Nearer\tDECCA\tF9086\tDR-13089\t1949\tKenny Baker, Stan Reynolds, Stan Roderick, Dave Wilkins (tp) Jackie Armstrong, Maurice Pratt, Jack Bentley, Jimmy Coombes (tb) Les Gilbert, Reg Owen (as) Johnny Gray, Tommy Whittle (ts) Bob Burns (bar) Norman Stenfalt (p) Dave Goldberg (g) Charlie Short (b) Jack Parnell (d) Ted Heath (dir) \nhttp://www.jazz-on-line.com/a/mp3a/OKE9537-A.mp3\tLouis Armstrong's Hot Five\tYou're Next\tOKeh\t8299A\t09537-A\t1926\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC18724B.mp3\tMusic In The Morgan Manner\tYou're Nobody 'til Somebody Loves You\tDECCA\t18724B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101669-1.mp3\tFats Waller And His Rhythm\tYou're Not The Kind\tVICTOR\t25353\t101669-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU102379.mp3\tWingy Manone & His Orch\tYou're Not The Kind\tBLUEBIRD\t6472\t102379\t1936\t\nhttp://www.jazz-on-line.com/a/mp3d/ParCE-7836-1.mp3\tValaida (queen Of The Trumpet) With Swing Accompaniment\tYou're Not The Kind\tParlophone\tF-63I\tCE-7836-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3e/Mus5487.mp3\tSarah Vaughan And Orchestra Under The Direction Of Tadd Dameron\tYou're Not The Kind\tMusicraft\t380\t5487\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC84422-1.mp3\tFats Waller And His Rhythm\tYou're Not The Only Oyster In The Stew\tVICTOR\t24738\t84422-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic84422-1.mp3\t\"fats Waller And His Rhythm\tYou're Not The Only Oyster In The Stew\tVictor\t24738\t84422-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_335.mp3\tFrank Novak And His Orchestra\tYou're On The Right Side Of The Ocean\tOkeh\t4171\t22821\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL4631.mp3\tLouis Jordan\tYou're On The Right Track, Baby\tDECCA\t24502\tL4631\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_290.mp3\tDon Cornell Feat. O/norman Leyden\tYou're On Trial\tCoral\t61068\t\t1953\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480779.mp3\tTony Scott And His Down Beat Club Septet\tYou're Only Happy When I'm Blue\tGotham\t117\tS1121\t1946\tB. Bopstein aka Dizzy Gillespie (tp), Trummy Young (tb), Tony Scott (cl, as), Ben Webster (ts), Jimmy Jones (p), Gene Ramey (sb), Eddie Nicholson (dm)\nhttp://www.jazz-on-line.com/a/mp3c/VIC010342.mp3\tTommy Dorsey & His Orch\tYou're Precious\tVICTOR\t25603\t010342\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_289.mp3\tFrank Sinatra\tYou're Sensational\tCapitol\t3469\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC92992.mp3\tFats Waller And His Rhythm\tYou're So Darn Charming\tVICTOR\t25120\t92992\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU17803.mp3\tHal Kemp And His Orch\tYou're So Darn Charming (v Bob Allen)\tBRUNSWICK\t7493\t17803\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU23760-1.mp3\tTeddy Wilson & His Orch\tYou're So Desirable\tBRUNSWICK\t8283\t23760-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3e/BruB-23760-1.mp3\tTeddy Wilson And His Orchestra\tYou're So Desirable\tBrunswick\t8283\tB-23760-1\t1938\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24176-2.mp3\tRed Norvo & His Orch\tYou're So Desirable (v Larry Allen)\tVOCALION\t4785\t24176-2\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/KIN957.mp3\tHank Penny\tYou're So Different\tKING\t957\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_234.mp3\tLoreleis\tYou're So Nice To Be Near\tSpotlight\t390\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3b/V-D249YS.mp3\tPat Flowers\tYou're Some Pretty Baby Doll\tV-DISC\t249\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU11481-A.mp3\tBing Crosby\tYou're Still In My Heart\tBRUNSWICK\t6285\t11481-A\t1932\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC1871-2.mp3\tCharlie Palloy & His Orch\tYou're Telling Me (v C P)\tCROWN\t3389A\tC1871-2\t1932\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL6249.mp3\tLouis Armstrong And His Allstars\tYou're The Apple Of My Eye\tDECCA\t27931\tL6249\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_341.mp3\tFour Lovers\tYou're The Apple Of My Eye\tRCA\t6518\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC47851-2.mp3\tTed Weems And His Orch\tYou're The Cream In My Coffee\tVICTOR\t21767A\t47851-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/CAP1269.mp3\tKing Cole Trio\tYou're The Cream In My Coffee\tCAPITOL\t\t1269\t\t\nhttp://www.jazz-on-line.com/a/mp3h/VOCC2668.mp3\tAmbassadors\tYou're The Cream In My Coffee\tVOCALION\t15752\tC2668\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/BRULA1091.mp3\tCab Calloway & His Orch\tYou're The Cure For What Ails Me\tBRUNSWICK\t7639\tLA1091\t1936\t\nhttp://www.jazz-on-line.com/a/mp3w/1936_293.mp3\tCab Calloway And His Orchestra\tYou're The Cure For What Ails Me\tBRUNSWICK\t7639\tLA1091\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU89763.mp3\tFats Waller And His Rhythm\tYou're The Cutest One\tBLUEBIRD\t10129\t89763\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic89763-1.mp3\t\"fats\" Waller And His Rhythm\tYou're The Cutest One\tVictor\t25039\t89763-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/BRUC1959.mp3\tJimmy Joy's Orch\tYou're The First Thing I Think Of Each Morning\tBRUNSWICK\t3959\tC1959\t1928\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_013.mp3\tAlbert Campbell And James F. Harrison\tYou're The Flower Of My Heart, Sweet Adeline (copy 1)\tEdison\t8677\t\t1904\t\nhttp://www.jazz-on-line.com/a/mp3w/1904_013alt.mp3\tAlbert Campbell And James F. Harrison\tYou're The Flower Of My Heart, Sweet Adeline?\tEDISON\t8677\t-2\t1904\t\nhttp://www.jazz-on-line.com/a/mp3c/VOCW24822.mp3\tMildred Bailey\tYou're The Moment Of My Life\tVOCALION\t5006\tW24822\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC68324.mp3\tWoody Herman & His Orchestra\tYou're The One\tDECCA\t3528A\t68324\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_147.mp3\tFrank Sinatra\tYou're The One\tCOLUMBIA\t39213\tCO45112\t1951\t\nhttp://www.jazz-on-line.com/a/mp3h/MAJTJV-9500.mp3\tNickelodeon\tYou're The One\tMAJOR RECORDS\t4116-A\tTJV-9500\t1951\t\nhttp://www.jazz-on-line.com/a/mp3o/HAR350-Hy.mp3\tRoss Gorman And His Virginians\tYou're The One For Me\tHarmony\t350-H\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VOCDAL296.mp3\tHi-flyers\tYou're The One I Care For\tVOCALION\t3764\tDAL296\t1937\t\nhttp://www.jazz-on-line.com/a/mp3e/HAR151235-2.mp3\tAnnette Hanshaw\tYou're The One I Care For\tHARMONY\t1273-H\t151235-2\t1931\t\nhttp://www.jazz-on-line.com/a/mp3b/VocB-15008-A.mp3\tEarl Hines And His Orchestra\tYou're The One Of My Dreams\tVocalion\t3392\tB-15008-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3b/COL79345.mp3\tHenry Burr (tenor)\tYou're The Only Girl That Made Me Cry\tCOLUMBIA\tA-2984\t79345\t1920\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_100.mp3\tHenry Burr\tYou're The Only Girl That Made Me Cry (1920)\tCOLUMBIA\t2984\t79345\t1920\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC64488-A.mp3\tDick Robertson And His Orch\tYou're The Only Star\tDECCA\t2059B\t64488-A\t1938\t\nhttp://www.jazz-on-line.com/a/mp3a/CONC1594.mp3\tRoy Acuff Smoky Mountain Boys\tYou're The Only Star (in My Blue Heaven)\tCONQUEROR\t8791\tC1594\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC88991.mp3\tFats Waller And His Rhythm\tYou're The Picture\tVICTOR\t25075\t88991\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_021.mp3\tPaul Whiteman And His Orchestra\tYou're The Top\tVictor\t24769\t84772-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC84772-2.mp3\tPaul Whiteman And His Orch\tYou're The Top\tVICTOR\t24769\t84772-2\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/BRU16398.mp3\tEthel Merman W Johnny Green\tYou're The Top\tBRUNSWICK\t7342\t16398\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1934_253.mp3\tDorsey Brothers Orchestra\tYou're The Top\tDECCA\t319\t39104-A\t1934\t\nhttp://www.jazz-on-line.com/a/mp3w/1935_157.mp3\tCole Porter\tYou're The Top\tVICTOR\t24766\t84901\t1935\t\nhttp://www.jazz-on-line.com/a/mp3t/TS481767.mp3\tAnita O'day\tYou're The Top\tVerve\tMGV2036\t2563-7\t1955\tacc. by Milt Bernhart, Lloyd Elliott, Joe Howard, Si Zentner (tb), Paul Smith (p), Barney Kessel (g), Joe Mondragon (sb), Alvin Stoller (dm), Buddy Bregman (arr, dir)\nhttp://www.jazz-on-line.com/a/mp3e/COLW145830-3.mp3\tPaul Ash And His Orchestra\tYou're Wonderful\tCOLUMBIA\t1394 D\tW145830-3\t1928\tD Lindley,J Valentine,J Linn tr,R Lantz,M Durso tb, P Wing,H Nettles cl,al sax,V Hayes,H Grantham,cl, tn sax,H Winston,p, P Ash,vio,H Hoffman,K Sirinsky,H Struble, vio, M Feiler,vio cello,J Davidson,bj, P Olker,br bass, A Layfield, dr Chicago, Mar 23\nhttp://www.jazz-on-line.com/a/mp3c/VIC45571-2.mp3\tNat Shilkret & Victor Orch\tYou're Wonderful\tVICTOR\t21497B\t45571-2\t1928\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC06415.mp3\tFats Waller And His Rhythm\tYou've Been Reading My Mail\tVICTOR\t25554\t06415\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC89762-1.mp3\tFats Waller And His Rhythm\tYou've Been Taking Lessons In Love\tVICTOR\t25044\t89762-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3b/Vic89762-1.mp3\t\"fats Waller And His Rhythm\tYou've Been Taking Lessons In Love\tVictor\t25044\t89762-1\t1935\t\nhttp://www.jazz-on-line.com/a/mp3w/1954_363.mp3\tConnie Russell\tYou've Changed\tCapitol\t2666\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3a/BRUSF66-A.mp3\tAnson Weeks And His Music (vbc)\tYou've Got Everything\tBRUNSWICK\t6661\tSF66-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBAN32873.mp3\tAdrian Rollini & His Orchestra\tYou've Got Everything\tBANNER\t32873\t\t1933\t\nhttp://www.jazz-on-line.com/a/mp3w/1933_106.mp3\tJan Garber And His Orchestra\tYou've Got Everything\tVICTOR\t24444\t77073-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC77073-1.mp3\tJan Garber & His Orch\tYou've Got Everything (v L. Bennett)\tVICTOR\t24444\t77073-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN14147-1.mp3\tAdrian Rollini & His Orchestra\tYou've Got Everything (vherb Weil)\tBANNER\t32873\t14147-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC031842.mp3\tHal Kemp And His Orch  V Bob Allen\tYou've Got Me Crying Again\tVICTOR\t26165\t031842\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/BRU13044-A.mp3\tBing Crosby\tYou've Got Me Crying Again\tBRUNSWICK\t6515\t13044-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/DISD139.mp3\tGeorgie Auld\tYou've Got Me Jumpin'\tDISC\t116\tD139\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047711.mp3\tCharlie Barnet & His Orch\tYou've Got Me Out On A Limb\tBLUEBIRD\t10644\t047711\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_190.mp3\tKay Kyser And His Orchestra\tYou've Got Me This Way\tCOLUMBIA\t35762\tLA2350\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_128.mp3\tJimmy Dorsey And His Orchestra\tYou've Got Me This Way\tDecca\t3435\t68173-A\t1941\twith Helen O'Connell as the singer\nhttp://www.jazz-on-line.com/a/mp3w/1941_103.mp3\tTommy Dorsey And His Orchestra Feat. V/pied Pipers\tYou've Got Me This Way\tVICTOR\t26770\t056134-2\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU056480.mp3\tGlenn Miller & His Orch\tYou've Got Me This Way (vmh)\tBLUEBIRD\t10906B\t056480\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC013344-1.mp3\tFats Waller And His Rhythm\tYou've Got Me Under Your Thumb\tVICTOR\t25672\t013344-1\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU047988.mp3\tCharlie Barnet & His Orch\tYou've Got Me Voodoo\tBLUEBIRD\t10662\t047988\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/DEC67322.mp3\tLouis Armstrong & His Orch\tYou've Got Me Voodoo\tDECCA\t3092A\t67322\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU1204YG.mp3\tCliff Jackson's Village Cats\tYou've Got Me Walkin' And Talkin' To Myself\tBLUENOTE\tBN1204\t\t1945\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL3485.mp3\tBing Crosby & Judy Garland\tYou've Got Me Where You Want Me\tDECCA\t23804\tL3485\t1944\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D312B2.mp3\tJohnny Mercer With Paul Weston And His Orchestra\tYou've Got Me Where You Want Me\tV-DISC\t312B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC011355.mp3\tTommy Dorsey & His Orch\tYou've Got Something There\tVICTOR\t25635\t011355\t1937\t\nhttp://www.jazz-on-line.com/a/mp3w/1930_051.mp3\tTed Lewis And His Band\tYou've Got That Thing\tCOLUMBIA\t2088\tW149613-2\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC57702-2.mp3\tJimmie Johnson & His Orch\tYou've Got To Be Modernistic\tVICTOR\t38099\t57702-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC101260.mp3\tTommy Dorsey & His Orch\tYou've Got To Eat Your Spinach, Baby\tVICTOR\t25352\t101260\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC12199.mp3\tFletcher Henderson & His Orch\tYou've Got To Get Hot\tVOCALION\t14726B\t12199\t1923\t\nhttp://www.jazz-on-line.com/a/mp3d/Voc12199.mp3\tFletcher Henderson's Orchestra\tYou've Got To Get Hot\tVocalion\t14726\t12199\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW148486-2.mp3\tBessie Smith\tYou've Got To Give Me Some\tCOLUMBIA\t14427 D\tW148486-2\t1929\t\nhttp://www.jazz-on-line.com/a/mp3l/Col80870-3.mp3\tThe Georgians\tYou've Got To See Mama Ev'ry Night\tColumbia\tA-3857\t80870-3\t1923\t\nhttp://www.jazz-on-line.com/a/mp3b/VIC27551-2.mp3\tAileen Stanley-billy Murray\tYou've Got To See Mama Every Night\tVICTOR\t19027A\t27551-2\t1923\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC70908.mp3\tGene Kardos & His Orch\tYou've Got To Sell It (v D R)\tVICTOR\t22843\t70908\t1931\t\nhttp://www.jazz-on-line.com/a/mp3a/COLLA2353.mp3\tOrrin Tucker And His Orch\tYou've Got What It Takes\tCOLUMBIA\t35744\tLA2353\t1940\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU14957-C.mp3\tEthel Waters W Orch\tYou've Seen Harlem At It's Best\tBRUNSWICK\t6885\t14957-C\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/COL81201.mp3\tAl Jolson\tYou've Simply Got Me Cuckoo\tCOLUMBIA\tA-3984\t81201\t1923\t\nhttp://www.jazz-on-line.com/a/mp3w/1924_078.mp3\tAl Jolson\tYou've Simply Got Me Cuckoo\tCOLUMBIA\tA-3984\t81201\t1924\t\nhttp://www.jazz-on-line.com/a/mp3h/VicD9VB1847.mp3\tRose Murphy (the Chee-chee Girl)\tYou, Wonderful You\tVictor\t20-3534\tD9VB1847\t1949\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC044887-2.mp3\tDuke Ellington & His Orch\tYou, You Darlin'\tVICTOR\t26537\t044887-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/DEC67188.mp3\tBob Crosby & His Orch\tYou, You Darlin'\tDECCA\t3018B\t67188\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D217B2.mp3\tJimmy Dorsey And His Orchestra\tYou, You Darlin'\tV-DISC\t217B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_350.mp3\tDuke Ellington Orch V Herb Jeffries\tYou, You Darlin'\tVICTOR\t26537\t044887-2\t1940\t\nhttp://www.jazz-on-line.com/a/mp3b/VARUS1365-1.mp3\tJack Teagarden Orch\tYou, You Darlin' (v Kitty Kallen)\tVARSITY\t8196\tUS1365-1\t1940\t\nhttp://www.jazz-on-line.com/a/mp3w/1940_349.mp3\tBob Crosby And His Orchestra Feat. V Marion Mann\tYou, You, Darlin'\tDECCA\t3018B\t67188\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/RCA20-5325x.mp3\tAmes Brothers\tYou, You, You\tRCA\t20-5325\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_152.mp3\tRuss Morgan And His Orchestra\tYou, You, You Are The One\tDECCA\t24569\tL4872\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_230.mp3\tAmes Brothers Feat. O/roy Ross\tYou, You, You Are The One\tRCA\t20-5325\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_232.mp3\tHugo And Luigi With Their Family Singers\tYoung Abe Lincoln\tMercury\t70721\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1955_169.mp3\tDon Cornell\tYoung Abe Lincoln\tCoral\t61521\t\t1955\t\nhttp://www.jazz-on-line.com/a/mp3w/1910_081.mp3\tNora Bayes\tYoung America\tVictor\t70015\t\t1910\t\nhttp://www.jazz-on-line.com/a/mp3a/BRU12888-A.mp3\tBing Crosby\tYoung And Healthy\tBRUNSWICK\t6472\t12888-A\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/CROC2027-2.mp3\tCharlie Palloy & His Orch\tYoung And Healthy\tCROWN\t3473\tC2027-2\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/APO381YA.mp3\tWynonie Harris\tYoung And Wild\tAPOLLO\t381\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/APO360YM.mp3\tWynonie Harris\tYoung Man's Blues\tAPOLLO\t360\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLP21171.mp3\tBessie Smith & Her Blue Boys\tYoung Woman's Blues\tCOLUMBIA\t35673\tP21171\t1926\t\nhttp://www.jazz-on-line.com/a/mp3w/1949_315.mp3\tGordon Macrae\tYounger Than Springtime\tCapitol\t602\t\t1949\t\nhttp://www.jazz-on-line.com/a/mp3a/MGM53S6000.mp3\tJoni James\tYour Cheatin' Heart\tMGM\t11426\t53S6000\t\t\nhttp://www.jazz-on-line.com/a/mp3c/MGM52S6096.mp3\tHank Williams With His Drifting Cowboys\tYour Cheatin' Heart\tMGM\t11416-B\t52S6096\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_015.mp3\tJoni James\tYour Cheatin' Heart\tMGM\t11426\t53S6000\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1953_145.mp3\tFrankie Laine\tYour Cheatin' Heart\tCOLUMBIA\t39938\tHCO10391\t1953\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC83986.mp3\tLouis Armstrong With\tYour Cheating Heart\tDECCA\t28628\t83986\t1953\t\nhttp://www.jazz-on-line.com/a/mp3w/1920_061.mp3\tJohn Mccormack\tYour Eyes Have Told Me So\tVICTOR\t64860\t\t1920\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC20058-2.mp3\tHenry Burr\tYour Eyes, Your Lips, Your Heart\tVICTOR\t18283\t20058-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3w/1917_102.mp3\tHenry Burr\tYour Eyes, Your Lips, Your Heart\tVictor\t18283\t20058-2\t1917\t\nhttp://www.jazz-on-line.com/a/mp3a/BLU043348-1.mp3\tFats Waller And His Rhythm\tYour Feet's Too Big\tBLUEBIRD\t10500\t043348-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3r/RiBlu10500.mp3\tFats Waller And His Rhythm\tYour Feet's Too Big\tBluebird\t10500\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D308A1.mp3\tFats Waller\tYour Feet's Too Big\tV-DISC\t308A1\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1939_263.mp3\tFats Waller\tYour Feet's Too Big\tV-DISC\t308A1\t\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/PARP2750.mp3\tJimmie Blythe\tYour Folks\tPARAMOUNT\t12428\tP2750\t1926\t\nhttp://www.jazz-on-line.com/a/mp3o/DEL1063x.mp3\tPaul Gayten Trio\tYour Hands Ain't Clean\tDELUXE\t1063\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO10979.mp3\tFrankie Laine\tYour Heart My Heart\tCOLUMBIA\t40295\tRHCO10979\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1918_021.mp3\tHenry Burr And Albert Campbell\tYour Lips Are No Man's Land But Mine\tVICTOR\t18470\t21685-2\t1918\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA21-0498x.mp3\tHank Snow\tYour Locket Is My Broken Heart\tRCA\t21-0498\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/COLRHCO33316.mp3\tFrankie Laine W P.weston Orch\tYour Love\tCOLUMBIA\t40558\tRHCO33316\t1954\t\nhttp://www.jazz-on-line.com/a/mp3c/COLWM1107.mp3\tDuke Ellington & His Orch\tYour Love Has Faded\tCOLUMBIA\t35640\tWM1107\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/KINK5321.mp3\tWynonie Harris\tYour Money Don't Mean A Thing\tKING\t4217\tK5321\t1947\t\nhttp://www.jazz-on-line.com/a/mp3a/BRULAE500.mp3\tEarl Burtnett And His Orch\tYour Mother And Mine\tBRUNSWICK\t4377\tLAE500\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/COLW148422.mp3\tPaul Whiteman & His Orch\tYour Mother And Mine\tCOLUMBIA\t1845 D\tW148422\t1929\t\nhttp://www.jazz-on-line.com/a/mp3c/BAN17474.mp3\tCarter Family\tYour Mother Still Prays For You\tBANNER\t33462\t17474\t1935\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW152568-3.mp3\tBenny Goodman And His Orchestra\tYour Mother's Son-in-law\tCOLUMBIA\t2856 D\tW152568-3\t1933\t\nhttp://www.jazz-on-line.com/a/mp3b/RCAD7VB2169.mp3\tCount Basie & His Orchestra\tYour Red Wagon\tRCA\t20-2677\tD7VB2169\t1947\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL4519.mp3\tAndrews Sisters - Vic Schoen\tYour Red Wagon\tDECCA\t24268\tL4519\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1948_305.mp3\tAndrews Sisters\tYour Red Wagon\tDECCA\t24268\tL4519\t1948\t\nhttp://www.jazz-on-line.com/a/mp3c/DECL3479.mp3\tBing Crosby & Louis Jordan\tYour Socks Don't Match\tDECCA\t23417\tL3479\t1944\t\nhttp://www.jazz-on-line.com/a/mp3t/TS480577.mp3\tBen Webster And Harry Sweets Edison\tYoure Getting To Be A Habit With Me\tVerve\tMGV 8211\t20728-1\t1957\tHarry Sweets Edison, Tp, Ben Webster, Ts, Oscar Peterson, P, Barney Kessel (g), Ray Brown, B, Alvin Stoller, D\nhttp://www.jazz-on-line.com/a/mp3w/1954_149.mp3\tDick Contino\tYours\tMERCURY\t70455\t\t1954\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_014.mp3\tJimmy Dorsey And His Orchestra\tYours\tDECCA\t3657B\t68653\t1941\t\nhttp://www.jazz-on-line.com/a/mp3w/1941_170.mp3\tBenny Goodman And His Orchestra\tYours\tCOLUMBIA\t36067\tCO29776\t1941\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC68653.mp3\tJimmy Dorsey And His Orch.\tYours - Lolita (vho-be)\tDECCA\t3657B\t68653\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC18807A.mp3\tJimmy Dorsey & His Orch\tYours - Quiereme Mucho\tDECCA\t18807A\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-417-1.mp3\tDjango Reinhardt Et Le Quintette Du Hot Club De France\tYours And Mine\tSWING\t266\tOSW-417-1\t1946\t\nhttp://www.jazz-on-line.com/a/mp3b/Dec62329-A.mp3\tLouis Armstrong And His Orchestra\tYours And Mine\tDecca\t1369\t62329-A\t1937\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU036902.mp3\tOzzie Nelson & His Orch\tYours For A Song\tBLUEBIRD\t10270\t036902\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/VOC24344-4.mp3\tRed Norvo & His Orch\tYours For A Song\tVOCALION\t4818\t24344-4\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC048431-3.mp3\tTommy Dorsey And His Orch\tYours Is My Heart Alone\tVICTOR\t26616\t048431-3\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/DECDLA1969.mp3\tBing Crosby\tYours Is My Heart Alone\tDECCA\t3118A\tDLA1969\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/BLU048483.mp3\tGlenn Miller & His Orch\tYours Is My Heart Alone\tBLUEBIRD\t10728 B\t048483\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC99900-1.mp3\tRay Noble & His Orch\tYours Truly Is Truly Yours\tVICTOR\t25277\t99900-1\t1936\t\nhttp://www.jazz-on-line.com/a/mp3l/BRU18637.mp3\tLeo Reisman & His Orch\tYours Truly Is Truly Yours\tBRUNSWICK\t7614\t18637\t1936\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC18637.mp3\tLeo Reisman & His Orch\tYours Truly Is Truly Yours (vbenny Davis)\tARC\tBR7614\t18637\t1936\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC24511-B.mp3\tGuy Lombardo And His Royal Canadi\tYours With Love And Kisses\tDecca\t24511-B\t\t\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D219B2.mp3\tZiggy Elman And His Orchestra\tZaggin' With Zig\tV-DISC\t219B2\t\t\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS26368-A.mp3\tBenny Goodman And His Orchestra\tZaggin' With Zig\tCBS\tCO35356\t26368-A\t1939\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC78505-1.mp3\tCab Calloway And His Orchestra\tZah Zuh Zaz\tVICTOR\t24557\t78505-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVic24557.mp3\tCab Calloway & His Orchestra\tZah Zuh Zaz\tVictor\t24557\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1956_399.mp3\tLou Busch And His Orchestra\tZambezi\tCapitol\t3272\t\t1956\t\nhttp://www.jazz-on-line.com/a/mp3c/DEC85419.mp3\tLouis Armstrong & Commanders\tZat You,santa Claus?\tDECCA\t28943\t85419\t1953\t\nhttp://www.jazz-on-line.com/a/mp3d/Vic78505-1.mp3\tCab Calloway And His Cotton Club Orchestra\tZaz Zuh Zaz\tVictor\t24557\t78505-1\t1933\t\nhttp://www.jazz-on-line.com/a/mp3c/ARC16089-1.mp3\tWingy Manone & His Orch\tZero\tARC\tOK41570\t16089-1\t1934\t\nhttp://www.jazz-on-line.com/a/mp3c/V-D31826.mp3\tArtie Shaw And His Orchestra\tZigeuner\tV-DISC\t399\t031826-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3c/COL26911.mp3\tEddie South & His Orch\tZigeuner\tCOLUMBIA\t35634\t26911\t1940\t\nhttp://www.jazz-on-line.com/a/mp3e/V-D399A2.mp3\tArtie Shaw And His Orchestra\tZigeuner\tV-DISC\t399A2\t031826-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3o/BLUB-10127-A.mp3\tArtie Shaw And His Orchestra\tZigeuner (from ''bitter Sweet'')\tBLUEBIRD\tB-10127-A\t031826-1\t1939\t\nhttp://www.jazz-on-line.com/a/mp3e/DECL6756.mp3\tBing Crosby\tZing A Little Zong\tDECCA\t28255A\tL6756\t\t\nhttp://www.jazz-on-line.com/a/mp3a/VIC88615.mp3\tRichard Himber And His Orch\tZing Went The Strings Of My Heart\tVICTOR\t24868\t88615\t1935\t\nhttp://www.jazz-on-line.com/a/mp3r/RiVIC24868.mp3\tRichard Himber & His Orch\tZing Went The Strings Of My Heart\tVICTOR\t24868\t\t\t\nhttp://www.jazz-on-line.com/a/mp3a/RCA20-3997x.mp3\tPerry Como\tZing Zing Zoom Zoom\tRCA\t20-3997\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1951_089.mp3\tPerry Como And The Fontane Sisters Feat. Sigmund Romberg Orchestra\tZing Zing-zoom Zoom\tRCA Victor\t3997\t\t1951\t\nhttp://www.jazz-on-line.com/a/mp3w/1943_171.mp3\tJudy Garland\tZing! Went The Strings Of My Heart\tDECCA\t18543A\tDLA1850\t1943\t\nhttp://www.jazz-on-line.com/a/mp3a/DEC23748x.mp3\tConnie Boswell And Bob Crosby Or\tZip A Dee Doo Dah\tDECCA\t23748\t\t1946\t\nhttp://www.jazz-on-line.com/a/mp3a/CAP323x.mp3\tJohnny Mercer And Pied Pipers\tZip-a-dee-doo-dah\tCAPITOL\t\t\t\t\nhttp://www.jazz-on-line.com/a/mp3w/1947_129.mp3\tSammy Kaye And His Orchestra\tZip-a-dee-doo-dah\tRCA\t20-1976\t\t1947\t\nhttp://www.jazz-on-line.com/a/mp3w/1898_023.mp3\tArthur Collins\tZizzy Ze Zum Zum\tEDISON\t5452\t\t1898\t\nhttp://www.jazz-on-line.com/a/mp3h/DAN478398.mp3\tEdmundo Ros And His Rumba Band\tZombie\tPARLOPHONE\t\t\t1941\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC59140-1.mp3\tMckinney's Cotton Pickers\tZonky\tVICTOR\t38118B\t59140-1\t1930\t\nhttp://www.jazz-on-line.com/a/mp3c/COLW149665-4.mp3\tClarence Williams Jazz Kings\tZonky (v E T = Gibbons)\tCOLUMBIA\t14488 D\tW149665-4\t1929\t\nhttp://www.jazz-on-line.com/a/mp3b/DECL4562.mp3\tLionel Hampton Sextet\tZoo Baba Da-oo-ee\tDECCA\t24431\tL4562\t1947\t\nhttp://www.jazz-on-line.com/a/mp3c/OKE28004-A.mp3\tJohn Kirkby & His Orch\tZooming At The Zombie\tOKEH\t5761\t28004-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3c/CBS28004-A.mp3\tJohn Kirby & His Orch\tZooming At The Zombie\tCBS\toK5761\t28004-A\t1940\t\nhttp://www.jazz-on-line.com/a/mp3o/DEC38873.mp3\tClaude Hopkins And His Orchestra\tZozoi\tDECCA\t674A\t38873\t1934\t\nhttp://www.jazz-on-line.com/a/mp3d/SWIOSW-332-1.mp3\tDjango Reinhardt Et Son Orchestre Fud Candrix Et Son Orchestre\tZuiderzee Blues\tSWING\t180\tOSW-332-1\t1943\t\nhttp://www.jazz-on-line.com/a/mp3e/COLW142857-3.mp3\tDixie Washboard Band (cw)\tZulu Blues\tCOLUMBIA\t14171 D\tW142857-3\t1926\t\nhttp://www.jazz-on-line.com/a/mp3c/VIC39619-2.mp3\tNat Shilkret & Victor Orch\tZulu Wail\tVICTOR\t20926\t39619-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3l/HAR144613-2.mp3\tUniversity Six\tZulu Wail\tHARMONY\t510-H\t144613-2\t1927\t\nhttp://www.jazz-on-line.com/a/mp3e/Gen11635-A.mp3\tKing Oliver's Creole Jazz Band\tZulus Ball\tGennett\t5275\t11635-A\t1923\t\n"
  },
  {
    "path": "kibergrad/content/contents/code/kibergrad.js",
    "content": "/* Kibergrad,com resolver for Tomahawk.\n *\n * Written in 2015 by Anton Romanov\n * Licensed under the Eiffel Forum License 2.\n *\n */\n\nvar KibergradResolver = Tomahawk.extend( Tomahawk.Resolver, {\n    apiVersion: 0.9,\n\n    settings: {\n        cacheTime: 300,\n        name: 'Kibergrad',\n        weight: 76,\n        icon: '../images/icon.png',\n        timeout: 8\n    },\n\n    search: function (params) {\n        var that = this;\n\n        return Tomahawk.get(\"https://kiber.me/search?q=\" + params.query,\n            {}).then(function (response){\n            var results = [];\n            var trackRe = /<span.+?data-url=\"([^\"]+)\".+?data-title=\"([^\"]+)\".+?data-artist=\"([^\"]+)\"/gm;\n            var matches;\n            while (matches = trackRe.exec(response)) {\n                results.push({\n                    type:       'track',\n                    artist:     Tomahawk.htmlDecode(matches[3]),\n                    title:      Tomahawk.htmlDecode(matches[2]),\n                    track:      Tomahawk.htmlDecode(matches[2]),\n                    url:        \"kiber://\" + matches[1],\n                });\n            }\n\n            return results;\n        });\n    },\n\n    getStreamUrl: function(params) {\n        return {url: params.url.replace('kiber://', 'https://kiber.me')};\n    },\n\n    resolve: function (params) {\n        var query = [ params.artist, params.track ].join(' - ');\n        return this.search({query:query});\n    }\n});\n\nTomahawk.resolver.instance = KibergradResolver;\n\n"
  },
  {
    "path": "kibergrad/content/metadata.json",
    "content": "{\n    \"name\": \"Kibergrad\",\n    \"pluginName\": \"kibergrad\",\n    \"author\": \"Anton Romanov\",\n    \"email\": \"\",\n    \"version\": \"0.0.2\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Streams music from kibergrad.com\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/kibergrad.js\",\n        \"icon\": \"contents/images/icon.png\",\n\t\t\"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"scripts\": [\n                \"contents/code/lru.js\"\n            ],\n        \"resources\": []\n    },\n    \"staticCapabilities\": []\n}\n"
  },
  {
    "path": "lastfm/content/contents/code/lastfm.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2011-2015, Thierry Göckel <thierry@strayrayday.lu>\n *   Copyright 2017, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU Lesser General Public License as\n *   published by the Free Software Foundation, version 3.\n *\n *   Tomahawk is distributed in the hope that it will be useful, but\n *   WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n *   Lesser General Public License for more details.\n *\n *   You should have received a copy of the GNU Lesser General Public License\n *   along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar LastfmResolver = Tomahawk.extend(TomahawkResolver, {\n\n    settings: {\n        name: 'Last.fm',\n        icon: 'lastfm-icon.png',\n        weight: 85,\n        timeout: 5\n    },\n\n    init: function () {\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n    },\n\n    canParseUrl: function (params) {\n        var url = params.url;\n        var type = params.type;\n\n        switch (type) {\n            case Tomahawk.UrlType.Album:\n                return /^https?:\\/\\/((www|cn)\\.last\\.).+\\/music\\/[^\\/\\n]+\\/[^\\/\\n]+$/.test(url);\n            case Tomahawk.UrlType.Artist:\n                return /^https?:\\/\\/((www|cn)\\.last\\.).+\\/music\\/[^\\/\\n][^\\/\\n_]+$/.test(url);\n            case Tomahawk.UrlType.Track:\n                return /^https?:\\/\\/((www|cn)\\.last\\.).+\\/music\\/[^\\/\\n]+\\/_\\/[^\\/\\n]+$/.test(url);\n            default:\n                return false;\n        }\n    },\n\n    lookupUrl: function (params) {\n        var url = params.url;\n\n        Tomahawk.log(\"lookupUrl: \" + url);\n        var urlParts =\n            url.split('/').filter(function (item) {\n                return item.length != 0;\n            }).map(function (s) {\n                return decodeURIComponent(s.replace(/\\+/g, '%20'));\n            });\n        if (/^https?:\\/\\/((www|cn)\\.last\\.).+\\/music\\/[^\\/\\n]+\\/[^\\/\\n]+$/.test(url)) {\n            Tomahawk.log(\"Found an album\");\n            // We have to deal with an Album\n            return {\n                type: Tomahawk.UrlType.Album,\n                artist: urlParts[urlParts.length - 2],\n                album: urlParts[urlParts.length - 1]\n            };\n        } else if (/^https?:\\/\\/((www|cn)\\.last\\.).+\\/music\\/[^\\/\\n][^\\/\\n_]+$/.test(url)) {\n            Tomahawk.log(\"Found an artist\");\n            // We have to deal with an Artist\n            return {\n                type: Tomahawk.UrlType.Artist,\n                artist: urlParts[urlParts.length - 1]\n            };\n        } else if (/^https?:\\/\\/((www|cn)\\.last\\.).+\\/music\\/[^\\/\\n]+\\/_\\/[^\\/\\n]+$/.test(url)) {\n            Tomahawk.log(\"Found a track\");\n            // We have to deal with a Track\n            return {\n                type: Tomahawk.UrlType.Track,\n                artist: urlParts[urlParts.length - 3],\n                track: urlParts[urlParts.length - 1]\n            };\n        }\n    }\n});\n\nTomahawk.resolver.instance = LastfmResolver;\n\nTomahawk.PluginManager.registerPlugin('infoPlugin', {\n\n    _apiUrl: 'http://ws.audioscrobbler.com/2.0/',\n\n    _apiKey: '7194b85b6d1f424fe1668173a78c0c4a',\n\n    _apiSecret: '59edd383762b4f933c059a527423dc0e',\n\n    _convertArtist: function (artist) {\n        var result = {\n            id: \"\",\n            artist: \"\",\n            bio: \"\",\n            images: [],\n            tracks: [],\n            albums: [],\n            similar: []\n        };\n        if (artist) {\n            if (typeof artist == 'string' || artist instanceof String) {\n                result.artist = artist;\n            } else {\n                result.id = artist.mbid;\n                result.artist = artist.name;\n                result.bio = artist.bio ? artist.bio.content : \"\";\n                result.images = this._convertImages(artist.image);\n                result.similar = artist.similar ? this._convertArtists(artist.similar.artist) : [];\n            }\n        }\n        return result;\n    },\n\n    _convertArtists: function (artists) {\n        var that = this;\n\n        var result = [];\n        if (artists) {\n            artists.forEach(function (artist) {\n                result.push(that._convertArtist(artist));\n            });\n        }\n        return result;\n    },\n\n    _convertImages: function (images) {\n        var result = [];\n        if (images) {\n            images.forEach(function (image) {\n                if (image[\"#text\"] && image.size\n                    && (image.size == \"medium\" || image.size == \"extralarge\")) {\n                    result.push({\n                        url: image[\"#text\"]\n                    });\n                }\n            });\n        }\n        return result;\n    },\n\n    _convertTracks: function (tracks) {\n        var that = this;\n\n        var result = [];\n        if (tracks) {\n            tracks.forEach(function (track) {\n                result.push({\n                    id: track.mbid,\n                    track: track.name,\n                    artist: that._convertArtist(track.artist),\n                    album: that._convertAlbum(track.album),\n                    composer: \"\",\n                    date: 0,        // in Unix time\n                    genre: \"\",\n                    number: 0,\n                    discnumber: 0,\n                    bitrate: 0,     // in kbps\n                    duration: track.duration,    // in ms\n                    samplerate: 0,  // in hz\n                    filesize: 0,    // in kb\n                    bpm: 0,\n                    lyrics: \"\",\n                    similar: []     // list of similar track's ids\n                });\n            });\n        }\n        return result;\n    },\n\n    _convertAlbum: function (album) {\n        var result = {\n            id: \"\",\n            album: \"\",\n            artist: this._convertArtist(),\n            composer: \"\",\n            date: 0,     // in Unix time\n            genre: \"\",\n            images: []  // list of album image urls (low res first)\n        };\n        if (album) {\n            result = {\n                id: album.mbid,\n                album: album.name,\n                artist: this._convertArtist(album.artist),\n                composer: \"\",\n                date: 0,  // in Unix time\n                genre: \"\",\n                images: this._convertImages(album.image),  // list of album image urls (low res first)\n            };\n            if (album.tracks && album.tracks.track && album.tracks.track.length > 0) {\n                result.tracks = this._convertTracks(album.tracks.track);\n            }\n        }\n        return result;\n    },\n\n    _convertAlbums: function (albums) {\n        var that = this;\n\n        if (albums) {\n            var promises = [];\n            albums.forEach(function (album) {\n                if (album && album.image && album.name && album.artist && album.artist.name\n                    && album.image.length > 0 && album.image[0][\"#text\"]) {\n                    var params = {\n                        album: album.name,\n                        artist: album.artist.name\n                    };\n                    promises.push(that.album(params));\n                }\n            });\n        }\n        return RSVP.all(promises).then(function (albums) {\n            var validAlbums = [];\n            if (albums) {\n                albums.forEach(function (album) {\n                    if (album.tracks) {\n                        validAlbums.push(album);\n                    }\n                });\n            }\n            return validAlbums;\n        });\n    },\n\n    _apiRequest: function (method, optionsData) {\n        optionsData.method = method;\n        optionsData.api_key = this._apiKey;\n        optionsData.format = \"json\";\n        var options = {\n            data: optionsData\n        };\n        return Tomahawk.get(this._apiUrl, options);\n    },\n\n    /**\n     * Search for tracks, artists and albums\n     *\n     * @param params A map containing all of the necessary parameters describing the query\n     *\n     *               Example:\n     *               { query: \"Queen\" }\n     *\n     * @returns A map consisting of the contentType and parsed results.\n     *\n     *          Example:\n     *          {\n     *            artists: [],\n     *            albums: [],\n     *            tracks: []\n     *          }\n     *\n     */\n    search: function (params) {\n        var that = this;\n\n        var query = params.query;\n\n        if (params.suggestions) {\n            return;\n        }\n\n        var promises = [];\n\n        promises.push(that._apiRequest(\"artist.search\", {artist: query}).then(function (result) {\n            return that._convertArtists(result.results.artistmatches.artist);\n        }));\n        promises.push(\n            that._apiRequest(\"album.search\", {limit: 20, album: query}).then(function (result) {\n                return that._convertAlbums(result.results.albummatches.album);\n            }));\n        return RSVP.all(promises).then(function (results) {\n            return {\n                artists: results[0],\n                albums: results[1],\n                tracks: []\n            }\n        });\n    },\n\n    /**\n     * Get the artist info from the server specified by the given params map and parse them into the\n     * correct result format.\n     *\n     * @param params A map containing all of the necessary parameters describing the artist which to\n     *               get infos from the server for.\n     *\n     *               Example:\n     *               { name: \"Queen\",   // the artist's name\n     *                 short: true   }  // if true, only basic information is being fetched\n     *\n     * @returns A map containing the parsed results.\n     *\n     *          Example:\n     *          {\n     *            id: \"421421\",\n     *            name: \"Queen\",\n     *            bio: \"Queen is da best. For real!\",\n     *            images: [\"http://www.img.de/queen_small.png\",   // list of artist image urls (low res first)\n      *                    \"http://www.img.de/queen_medium.png\",\n      *                    \"http://www.img.de/queen_large.png\"],\n     *            tracks: [],     // list of track objects\n     *            similar: []     // list of similar artists\n     *          }\n     *\n     */\n    artist: function (params) {\n        var that = this;\n\n        var artistName = params.artist;\n\n        return that._apiRequest(\"artist.getinfo\", {artist: artistName}).then(function (result) {\n            return that._convertArtist(result.artist);\n        }).then(function (result) {\n            if (params.short) {\n                return result;\n            } else {\n                var promises = [];\n                promises.push(that._apiRequest(\n                    \"artist.gettopalbums\", {limit: 20, artist: artistName})\n                    .then(function (result) {\n                        return that._convertAlbums(result.topalbums.album);\n                    }));\n                promises.push(that._apiRequest(\"artist.gettoptracks\", {artist: artistName})\n                    .then(function (result) {\n                        return that._convertTracks(result.toptracks.track);\n                    }));\n                return RSVP.all(promises).then(function (results) {\n                    result.albums = results[0];\n                    result.tracks = results[1];\n                    return result;\n                }).catch(function (reason) {\n                    reject(\"search error! \" + reason);\n                });\n            }\n        });\n    },\n\n    /**\n     * Get the album info from the server specified by the given params map and parse them into the\n     * correct result format.\n     *\n     * @param params A map containing all of the necessary parameters describing the album which to\n     *               get infos from the server for.\n     *\n     *               Example:\n     *               { album: \"Greatest Hits\",   // the album's name\n     *                 artist: \"Queen\",    // the artist's name\n     *                 short: true   }          // if true, only basic information is being fetched\n     *\n     * @returns A map containing the parsed results.\n     *\n     *          Example:\n     *          {\n     *           id: \"25525252\",\n     *           name: \"Greatest Hits\",\n     *           artist: {name: \"Queen\", ...},\n     *           composer: \"\",\n     *           date: 1484086490,  // in Unix time\n     *           genre: \"Rock\",\n     *           images: [\"http://www.img.de/greatesthits_small.png\",   // list of album image urls (low res first)\n      *                   \"http://www.img.de/greatesthits_medium.png\",\n      *                   \"http://www.img.de/greatesthits_large.png\"],\n     *           tracks: [],     // list of track objects\n     *          }\n     *\n     */\n    album: function (params) {\n        var that = this;\n\n        var artistName = params.artist;\n        var albumName = params.album;\n\n        return that._apiRequest(\"album.getinfo\", {artist: artistName, album: albumName})\n            .then(function (result) {\n                return that._convertAlbum(result.album);\n            });\n    }\n});"
  },
  {
    "path": "lastfm/content/metadata.json",
    "content": "{\n    \"name\": \"Last.fm\",\n    \"pluginName\": \"lastfm\",\n    \"author\": \"Thierry Göckel, Enno Gottschalk\",\n    \"email\": \"thierry@strayrayday.lu\",\n    \"version\": \"0.5.0\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Resolves to freely downloadable tracks on Last.fm.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/lastfm.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/lastfm-icon.png\"\n        ]\n    }\n}\n"
  },
  {
    "path": "muzebra/muzebra.js",
    "content": "\nRegExp.prototype.execAll = function(string) {\n    var match = null;\n    var matches = new Array();\n    while (match = this.exec(string)) {\n        var matchArray = [];\n        for (i in match) {\n            if (parseInt(i) == i) {\n                matchArray.push(match[i]);\n            }\n        }\n        matches.push(matchArray);\n    }\n    return matches;\n}\n\nvar MuzebraResolver = Tomahawk.extend(TomahawkResolver, {\n    \n    asyncRequest: function(url, method, success) {\n\t    var r = new XMLHttpRequest();\n\t    \n        var headers = {\n            \"Accept\" : \"application/json, text/javascript, */*; q=0.01\",\n            \"Accept-Language\" : \"de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\",\n            \"Accept-Charset\" : \"ISO-8859-1,utf-8;q=0.7,*;q=0.3\",\n            \"DNT\" : \"1\",\n            \"Host\" : \"muzebra.com\",\n            \"Origin\" : \"http://muzebra.com\",\n            \"Referer\" : \"http://muzebra.com/\",\n            \"User-Agent\" : \"Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0\",\n            \"X-Requested-With\" : \"XMLHttpRequest\"\n        }\n\n\t    r.open(method, url, true);\n        \n        for(var i in headers) {\n            r.setRequestHeader(i, headers[i]);\n        }\n\n\t    r.onreadystatechange = function() {\n\t        if(r.readyState == 4 &&\n\t           r.status == 200) {\n\t\t        success(r);\n\t        } else if(r.readyState == 4) {\n\t\t        Tomahawk.log(\"asyncRequest error \" + r.status);\n\t        }\n\t    }\n\n\t    r.send(null);\n    },\n\n    settings: {\n\t    name: 'Muzebra'\n    },\n\n    resolve: function(qid, artist, album, title) {\n\t    return Tomahawk.addTrackResults(this.internalSearch(qid));\n    },\n\n    search: function(qid, searchString) {        \n        var that = this;\n        this.results = [];\n        \n        this.asyncRequest('http://muzebra.com/service/playerparams/', 'POST', function(xhr) {\n            var key = JSON.parse(xhr.responseText).hash + '/';\n\n            that.asyncRequest(\n                'http://muzebra.com/search/?q=' + searchString, \n                'GET', \n                function(xhr) {\n                    var content = JSON.parse(xhr.responseText).content;\n\n                    var artists = /<a href=\".+\" class=\"hash artist\".+?>(.+?)<\\/a>/g.execAll(content);\n                    var tracks = /<span itemprop=\"name\" class=\"name\">(.+?)<\\/span>/g.execAll(content);\n                    var durations = /<a class=\"info\"  data-aid=\".+\" data-link=\".+\" data-current=\"0\" data-duration=\"([0-9]+)\">/g.execAll(content);\n                    var dataids = /<a class=\"info\"  data-aid=\".+\" data-link=\"(.+?)\"/g.execAll(content);\n\n                    for(var i = 0; i < artists.length; i++) {\n                        var res = {};\n                        \n                        res.artist = artists[i][1];\n                        res.duration = durations[i][1];\n                        res.track = tracks[i][1];\n                        res.url = 'http://savestreaming.com/t/' + dataids[i][1] + '_' + key;\n                        Tomahawk.log(res.url);\n\n                        that.results[i] = res;\n                    }\n                    \n\t                Tomahawk.addTrackResults(that.internalSearch(qid));\n\t            });\n        });\n\n\n    },\n    \n    results: [],\n\n    internalSearch: function(qid) {\n\t    return {\n\t        qid: qid,\n\t        results: this.results\n\t    }\n    },\n    \n});\n\nTomahawk.resolver.instance = MuzebraResolver;"
  },
  {
    "path": "myzuka/content/contents/code/myzuka.js",
    "content": "/* Myzuka resolver for Tomahawk.\n *\n * Written in 2015 by Anton Romanov\n * Licensed under the Eiffel Forum License 2.\n *\n */\n\nvar MyzukaResolver = Tomahawk.extend( Tomahawk.Resolver, {\n    apiVersion: 0.9,\n\n    apiLocation : 'https://myzuka.club/',\n\n    settings: {\n        cacheTime: 300,\n        name: 'myzuka',\n        weight: 80,\n        icon: '../images/icon.png',\n        timeout: 8\n    },\n\n    search: function (param) {\n        var that = this;\n\n        var params = {\n            searchText: param.query\n        };\n\n        return Tomahawk.get(this.apiLocation + \"Search\", {\n            data: params\n        }).then( function (response) {\n            var results = [];\n            var trackRe = /<a\\ +href=\"\\/Artist\\/[^\"]+\">([^<]+)<[\\s\\S]*?<a\\ +href=\"\\/?(Song[^\"]+)\">([^<]+)/gm;\n            var tracks = response.substring(response.indexOf(\"Поиск по композициям\"), response.length);\n            var matches;\n            while (matches = trackRe.exec(tracks)) {\n                results.push({\n                    type: 'track',\n                    artist: Tomahawk.htmlDecode(matches[1]),\n                    title: Tomahawk.htmlDecode(matches[3]),\n                    track: Tomahawk.htmlDecode(matches[3]),\n                    url: 'myzuka://' + matches[2],\n                });\n            }\n\n            return results;\n        });\n    },\n\n    resolve: function (params) {\n        var query = [ params.artist, params.album, params.track ].join(' ');\n        return this.search({query:query});\n    },\n\n    _parseUrn: function (urn) {\n        var match = urn.match( /^myzuka:\\/\\/([a-z]+)\\/(.+)$/ );\n        if (!match) return null;\n\n        return {\n            type: match[ 1 ],\n            id:   match[ 2 ]\n        };\n    },\n\n    getStreamUrl: function(params) {\n        var that = this;\n        var songPageUrl = this.apiLocation + params.url.match(/^myzuka:\\/\\/(.+)$/)[1];\n        return Tomahawk.get(songPageUrl).then(function(response) {\n            var mediaRe = /<a itemprop=\"audio\" href=\"([^\"]+)/gm;\n            var match = mediaRe.exec(response);\n            var streamUrl = match[1].replace(/&amp;/g, '&');\n            if (streamUrl.substring(0, 4) != \"http\") {\n                streamUrl = that.apiLocation + streamUrl;\n            }\n            return {url: streamUrl};\n        });\n    }\n});\n\nTomahawk.resolver.instance = MyzukaResolver;\n\n"
  },
  {
    "path": "myzuka/content/metadata.json",
    "content": "{\n    \"name\": \"myzuka.club\",\n    \"pluginName\": \"myzuka\",\n    \"author\": \"Anton Romanov\",\n    \"email\": \"\",\n    \"version\": \"0.0.1\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Streams music from myzuka.club\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/myzuka.js\",\n        \"icon\": \"contents/images/icon.png\",\n        \"scripts\": [],\n        \"resources\": []\n    },\n    \"staticCapabilities\": []\n}\n"
  },
  {
    "path": "netease/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>390</width>\n    <height>120</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>250</width>\n    <height>120</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::ExpandingFieldsGrow</enum>\n     </property>\n     <item row=\"2\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_3\">\n       <property name=\"text\">\n        <string>Stream Quality</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"1\">\n      <widget class=\"QComboBox\" name=\"quality\">\n       <item>\n        <property name=\"text\">\n         <string>LOW</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>MEDIUM</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>HIGH</string>\n        </property>\n       </item>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "netease/content/contents/code/netease.js",
    "content": "/* http://music.163.com resolver for Tomahawk.\n *\n * Written in 2015 by Anton Romanov\n * Licensed under the Eiffel Forum License 2.\n *\n */\n\nvar NeteaseResolver = Tomahawk.extend( Tomahawk.Resolver, {\n    apiVersion: 0.9,\n\n    settings: {\n        cacheTime: 300,\n        name: 'netease',\n        weight: 90,\n        icon: '../images/logo.png',\n        timeout: 15\n    },\n\n    getConfigUi: function () {\n        return {\n            \"widget\": Tomahawk.readBase64(\"config.ui\"),\n            fields: [{\n                name: \"quality\",\n                widget: \"quality\",\n                property: \"currentIndex\"\n            }]\n        };\n    },\n\n    strQuality: ['lMusic', 'mMusic', 'hMusic'],//There are some additional formats like m4a in bMusic, etc\n    numQuality: [96, 160, 320],\n\n    newConfigSaved: function (newConfig) {\n        var changed =\n            this._quality != newConfig.quality;\n\n        if (changed) {\n            this.init();\n        }\n    },\n\n    _convertTrack: function (entry) {\n        return {\n            artist:     entry.artists[0].name,\n            album:      entry.album.name,\n            track:      entry.name,\n            title:      entry.name,\n            bitrate:    this.numQuality[this._quality],\n            duration:   parseInt(entry.duration)/1000,\n            url:        this._convertStreamUrl(entry),\n            checked:    true,\n            type:       \"track\"\n        };\n    },\n\n    init: function() {\n        this.API_BASE = 'http://music.163.com/api/';\n        this.SALT = '3go8&$8' + '*3*3h0k(2)2';\n        var config = this.getUserConfig();\n        this._quality = config.quality || 2;\n    },\n\n    _encrypt: function(input) {\n        var xor_string = function ( str, key ) {\n            var xored = \"\";\n            var key_length = key.length;\n            for (i=0; i<str.length;i++) {\n                var a = str.charCodeAt(i) ^ key.charCodeAt(i % key_length);\n                xored = xored+String.fromCharCode(a);\n            }\n            return xored;\n        }\n        return CryptoJS.enc.Base64.stringify(CryptoJS.MD5(xor_string(input, this.SALT))).replace(/\\//g, '_').replace(/\\+/g, '-');\n    },\n\n    _convertStreamUrl: function(song) {\n        var that = this;\n        var format = that.strQuality[that._quality];\n        if (!song[format])\n        {\n            //Requested quality not found , try to find the one going down\n            //a step\n            for(var i = that._quality; i >= 0 && !song[format]; --i) {\n                var format = that.strQuality[i];\n            }\n        }\n        if (!song[format])\n        {\n            return null;\n        }\n        var dfsid = song[format].dfsId.toString();\n        if (dfsid == '0') {\n            return null;\n        }\n        var ext   =  song[format].extension;\n        // m2.music.126.net is also working but is properly resolvable via\n        // chinese DNS servers only, thus p2\n        var url = 'http://p2.music.126.net/' + that._encrypt(dfsid) + '/' +\n            dfsid + '.' + ext;\n        return url;\n    },\n\n    _apiCall: function(endpoint, params) {\n        return Tomahawk.post(this.API_BASE + endpoint, {data: params, headers: {\n            'Referer' : this.API_BASE\n        }});\n    },\n\n    search: function (params) {\n        var that = this;\n\n        return this._apiCall('search/get', {type:1, s:params.query, limit:100}).then(function(results){\n            if(!results.result) {\n                results = JSON.parse(results);\n            }\n            if(results.result.songCount > 0) {\n                var songIds = results.result.songs.map(function(song) {\n                    return song.id;\n                });\n                return that._apiCall('song/detail', {ids:'['+songIds.join(',')+']'}).then(function(result){\n                    if(!result.code) {\n                        result = JSON.parse(result);\n                    }\n                    return result.songs.map(that._convertTrack,that);\n                });\n            } else {\n                return [];\n            }\n        });\n    },\n\n    resolve: function (params) {\n        var query = [ params.artist, params.track ].join(' ');\n        return this.search({query:query});\n    }\n});\n\nTomahawk.resolver.instance = NeteaseResolver;\n\n\n"
  },
  {
    "path": "netease/content/metadata.json",
    "content": "{\n    \"name\": \"Netease\",\n    \"pluginName\": \"netease\",\n    \"author\": \"Anton Romanov\",\n    \"email\": \"\",\n    \"version\": \"0.0.5\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Streams music from http://music.163.com\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/netease.js\",\n        \"icon\": \"contents/images/logo.png\",\n        \"scripts\": [],\n        \"resources\": [\n            \"contents/code/config.ui\"\n        ]\n    },\n    \"staticCapabilities\": []\n}\n"
  },
  {
    "path": "officialfm/content/contents/code/officialfm.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2011, lasconic <lasconic@gmail.com>\n *   Copyright 2011, Leo Franchi <lfranchi@kde.org>\n *   Copyright 2015, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU General Public License as published by\n *   the Free Software Foundation, either version 3 of the License, or\n *   (at your option) any later version.\n *\n *   Tomahawk is distributed in the hope that it will be useful,\n *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n *   GNU General Public License for more details.\n *\n *   You should have received a copy of the GNU General Public License\n *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar OfficialfmResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'Official.fm',\n        icon: 'officialfm-icon.png',\n        weight: 70,\n        timeout: 5\n    },\n\n    _baseUrl: \"http://api.official.fm/tracks/search\",\n\n    _apiKey: \"lcghXySUP3nmYYpOALbPUJ6g30V1Z5hl\",\n\n    _convertTracks: function (results, limit) {\n        var tracks = [];\n        limit = limit || 9999;\n        for (var i = 0; i < results.length && i < limit; i++) {\n            var result = results[i].track;\n            if (result.streaming && result.streaming.http) {\n                tracks.push({\n                    artist: result.artist,\n                    track: result.title,\n                    source: this.settings.name,\n                    url: result.streaming.http,\n                    duration: result.duration\n                });\n            }\n        }\n        return tracks;\n    },\n\n    _searchRequest: function (query, limit) {\n        var that = this;\n\n        var settings = {\n            data: {\n                api_key: this._apiKey,\n                fields: \"streaming\",\n                api_version: \"2.0\",\n                q: query\n            }\n        };\n        return Tomahawk.get(this._baseUrl, settings).then(function (response) {\n            return that._convertTracks(response.tracks, limit);\n        });\n    },\n\n    resolve: function (params) {\n        var artist = params.artist;\n        var album = params.album;\n        var track = params.track;\n\n        return this._searchRequest(artist + \" \" + track, 20);\n    },\n\n    search: function (params) {\n        var query = params.query;\n\n        return this._searchRequest(query);\n    }\n});\n\nTomahawk.resolver.instance = OfficialfmResolver;\n"
  },
  {
    "path": "officialfm/content/metadata.json",
    "content": "{\n    \"name\": \"Official.fm\",\n    \"pluginName\": \"officialfm\",\n    \"author\": \"Leo, lasconic and Enno\",\n    \"email\": \"lasconic@gmail.com\",\n    \"version\": \"1.1.0\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Searches Official.fm for playable tracks.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/officialfm.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/officialfm-icon.png\"\n        ]\n    }\n}\n"
  },
  {
    "path": "omnify-metadata/content/contents/code/omnify-metadata.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2017, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU Lesser General Public License as\n *   published by the Free Software Foundation, version 3.\n *\n *   Tomahawk is distributed in the hope that it will be useful, but\n *   WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n *   Lesser General Public License for more details.\n *\n *   You should have received a copy of the GNU Lesser General Public License\n *   along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar OmnifyMetadataResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'Omnify Metadata',\n        icon: 'icon.png',\n        weight: 0, // We cannot resolve, so use minimum weight\n        timeout: 15\n    },\n\n    canParseUrl: function (params) {\n        var url = params.url;\n        var type = params.type;\n\n        switch (type) {\n            case Tomahawk.UrlType.Album:\n                return /^https?:\\/\\/(www\\.)?omni\\.fyi\\/music\\/[^\\/\\n]+\\/[^\\/\\n]+$/.test(url);\n            case Tomahawk.UrlType.Artist:\n                return /^https?:\\/\\/(www\\.)?omni\\.fyi\\/music\\/[^\\/\\n][^\\/\\n_]+$/.test(url);\n            case Tomahawk.UrlType.Track:\n                return /^https?:\\/\\/(www\\.)?omni\\.fyi\\/music\\/[^\\/\\n]+\\/_\\/[^\\/\\n]+$/.test(url);\n            case Tomahawk.UrlType.Playlist:\n                return /^https?:\\/\\/(www\\.)?omni\\.fyi\\/people\\/[^\\/\\n]+\\/playlists\\/[^\\/\\n]+$/.test(url);\n            default:\n                return false;\n        }\n    },\n\n    lookupUrl: function (params) {\n        var url = params.url;\n\n        Tomahawk.log(\"lookupUrl: \" + url);\n        var urlParts =\n            url.split('/').filter(function (item) {\n                return item.length != 0;\n            }).map(function (s) {\n                return decodeURIComponent(s.replace(/\\+/g, '%20'));\n            });\n        if (/^https?:\\/\\/(www\\.)?omni\\.fyi\\/music\\/[^\\/\\n]+\\/[^\\/\\n]+$/.test(url)) {\n            Tomahawk.log(\"Found an album\");\n            // We have to deal with an Album\n            return {\n                type: Tomahawk.UrlType.Album,\n                artist: urlParts[urlParts.length - 2],\n                album: urlParts[urlParts.length - 1]\n            };\n        } else if (/^https?:\\/\\/(www\\.)?omni\\.fyi\\/music\\/[^\\/\\n][^\\/\\n_]+$/.test(url)) {\n            Tomahawk.log(\"Found an artist\");\n            // We have to deal with an Artist\n            return {\n                type: Tomahawk.UrlType.Artist,\n                artist: urlParts[urlParts.length - 1]\n            };\n        } else if (/^https?:\\/\\/(www\\.)?omni\\.fyi\\/music\\/[^\\/\\n]+\\/[^\\/\\n]+\\/[^\\/\\n]+$/.test(\n                url)) {\n            Tomahawk.log(\"Found a track\");\n            // We have to deal with a Track\n            return {\n                type: Tomahawk.UrlType.Track,\n                artist: urlParts[urlParts.length - 3],\n                track: urlParts[urlParts.length - 1]\n            };\n        } else if (/^https?:\\/\\/(www\\.)?omni\\.fyi\\/people\\/[^\\/\\n]+\\/playlists\\/[^\\/\\n]+$/.test(\n                url)) {\n            // no playlist support just yet\n        }\n    }\n});\n\nTomahawk.resolver.instance = OmnifyMetadataResolver;\n"
  },
  {
    "path": "omnify-metadata/content/metadata.json",
    "content": "{\n\t\"name\": \"Omnify\",\n\t\"pluginName\": \"omnify-metadata\",\n\t\"author\": \"Enno Gottschalk\",\n\t\"email\": \"mrmaffen@googlemail.com\",\n\t\"version\": \"0.0.1\",\n\t\"website\": \"http://omni.fyi\",\n\t\"description\": \"Supports loading/drag'n'drop of omni.fyi URLs.\",\n\t\"type\": \"resolver/javascript\",\n\t\"manifest\": {\n\t\t\"main\": \"contents/code/omnify-metadata.js\",\n\t\t\"scripts\": [],\n\t\t\"icon\": \"contents/images/icon.png\",\n\t\t\"iconWhite\": \"contents/images/iconWhite.png\",\n\t\t\"iconBackground\": \"contents/images/iconBackground.png\"\n\t}\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"tomahawk-resolvers\",\n  \"version\": \"0.7.99\",\n  \"description\": \"Tomahawk Resolvers\",\n  \"main\": \"\",\n  \"directories\": {\n    \"test\": \"test\"\n  },\n  \"scripts\": {\n    \"test\": \"buster-test\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/tomahawk-player/tomahawk-resolvers.git\"\n  },\n  \"keywords\": [\n    \"tomahawk\",\n    \"resolver\"\n  ],\n  \"author\": \"\",\n  \"license\": \"Various\",\n  \"bugs\": {\n    \"url\": \"https://github.com/tomahawk-player/tomahawk-resolvers/issues\"\n  },\n  \"homepage\": \"https://github.com/tomahawk-player/tomahawk-resolvers\",\n  \"dependencies\": {\n    \"buster\": \"^0.7.13\",\n    \"minimist\": \"^1.1.0\",\n    \"nock\": \"^0.32.0\",\n    \"tomahawkjs\": \"^0.3.4\"\n  }\n}\n"
  },
  {
    "path": "prostopleer/content/contents/code/pleer.js",
    "content": "/* pleer.com resolver for Tomahawk.\n *\n * Written in 2015 by Anton Romanov\n * Licensed under the Eiffel Forum License 2.\n *\n */\n\nvar ProstopleerResolver = Tomahawk.extend( Tomahawk.Resolver, {\n    apiVersion: 0.9,\n\n    settings: {\n        cacheTime: 300,\n        name: 'prostopleer',\n        weight: 76,\n        icon: '../images/icon.png',\n        timeout: 15\n    },\n\n    _convertTrack: function (entry) {\n        return {\n            artist:     entry.artist,\n            track:      entry.track,\n            title:      entry.track,\n            size:       entry.size,\n            duration:   entry.length,\n            bitrate:    parseInt(entry.bitrate.split(' ')[0]),\n            url:        entry.file,\n            checked:    true,\n            type:       \"track\",\n        };\n    },\n\n    search: function (params) {\n        var that = this;\n\n        var query = params.query.replace(/\\ /g, '+');\n\n        return Tomahawk.get(\"http://pleer.com/browser-extension/search?q=\" + query).then(function (response){\n            return response.tracks.map(that._convertTrack, that);\n        });\n    },\n\n    resolve: function (params) {\n        var query = [ encodeURIComponent(params.artist), encodeURIComponent(params.track) ].join(' - ');\n        return this.search({query:query});\n    }\n});\n\nTomahawk.resolver.instance = ProstopleerResolver;\n\n"
  },
  {
    "path": "prostopleer/content/metadata.json",
    "content": "{\n    \"name\": \"Prostopleer\",\n    \"pluginName\": \"prostopleer\",\n    \"author\": \"Anton Romanov\",\n    \"email\": \"\",\n    \"version\": \"0.0.1\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Streams music from pleer.com\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/pleer.js\",\n        \"icon\": \"contents/images/icon.png\",\n        \"scripts\": [],\n        \"resources\": []\n    },\n    \"staticCapabilities\": []\n}\n"
  },
  {
    "path": "qobuz/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n\t<class>Form</class>\n\t<widget class=\"QWidget\" name=\"Form\">\n\t\t<property name=\"geometry\">\n\t\t\t<rect>\n\t\t\t\t<x>0</x>\n\t\t\t\t<y>0</y>\n\t\t\t\t<width>450</width>\n\t\t\t\t<height>310</height>\n\t\t\t</rect>\n\t\t</property>\n\t\t<property name=\"windowTitle\">\n \t\t\t<string>Qobuz (Beta) Login Parameters</string>\n\t\t</property>\n\t\t<layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n\t\t\t<item>\n\t\t\t\t<widget class=\"QLabel\" name=\"label_2\">\n\t\t\t\t\t<property name=\"text\">\n\t\t\t\t\t\t<string/>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"pixmap\">\n\t\t\t\t\t\t<pixmap>qobuz.png</pixmap>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"alignment\">\n\t\t\t\t\t\t<set>Qt::AlignCenter</set>\n\t\t\t\t\t</property>\n\t\t\t\t</widget>\n\t\t\t</item>\n\t\t\t<item>\n\t\t\t\t<widget class=\"QLabel\" name=\"label\">\n\t\t\t\t\t<property name=\"text\">\n\t\t\t\t\t\t<string>Log in with your Qobuz account to access all your music in Tomahawk.</string>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"alignment\">\n\t\t\t\t\t\t<set>Qt::AlignCenter</set>\n\t\t\t\t\t</property>\n\t\t\t\t</widget>\n\t\t\t</item>\n\t\t\t<item>\n\t\t\t\t<layout class=\"QFormLayout\" name=\"formLayout\">\n\t\t\t\t\t<property name=\"fieldGrowthPolicy\">\n\t\t\t\t\t\t<enum>QFormLayout::FieldsStayAtSizeHint</enum>\n\t\t\t\t\t</property>\n\t\t\t\t\t<item row=\"0\" column=\"0\">\n\t\t\t\t\t\t<widget class=\"QLabel\" name=\"usernameLabel\">\n\t\t\t\t\t\t\t<property name=\"text\">\n\t\t\t\t\t\t\t\t<string>Username or email</string>\n\t\t\t\t\t\t\t</property>\n\t\t\t\t\t\t</widget>\n\t\t\t\t\t</item>\n\t\t\t\t\t<item row=\"0\" column=\"1\">\n\t\t\t\t\t\t<widget class=\"QLineEdit\" name=\"usernameLineEdit\"/>\n    \t\t\t\t</item>\n \t\t\t\t\t<item row=\"1\" column=\"0\">\n\t\t\t\t\t\t<widget class=\"QLabel\" name=\"passwordLabel\">\n\t\t      \t\t\t\t<property name=\"text\">\n\t\t      \t\t\t\t\t<string>Password</string>\n\t\t     \t\t\t\t</property>\n\t\t   \t\t\t\t</widget>\n\t\t\t\t\t</item>\n\t\t\t\t\t<item row=\"1\" column=\"1\">\n\t\t   \t\t\t\t<widget class=\"QLineEdit\" name=\"passwordLineEdit\">\n\t\t  \t\t\t\t\t<property name=\"echoMode\">\n\t\t  \t\t\t\t\t\t<enum>QLineEdit::Password</enum>\n\t\t \t\t\t\t\t</property>\n\t\t\t\t\t\t</widget>\n\t\t    \t\t</item>\n    \t\t\t</layout>\n    \t\t</item>\n    \t\t<item>\n\t\t\t\t<widget class=\"QLabel\" name=\"label\">\n\t\t\t\t\t<property name=\"text\">\n\t\t\t\t\t\t<string>If you do not have an account, sign up at http://www.qobuz.com/, </string>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"alignment\">\n\t\t\t\t\t\t<set>Qt::AlignCenter</set>\n\t\t\t\t\t</property>\n\t\t\t\t</widget>\n\t\t\t</item>\n\t\t\t<item>\n\t\t\t\t<widget class=\"QLabel\" name=\"label\">\n\t\t\t\t\t<property name=\"text\">\n\t\t\t\t\t\t<string>Non-members get 1 minute samples for each track.</string>\n\t\t\t\t\t</property>\n\t\t\t\t\t<property name=\"alignment\">\n\t\t\t\t\t\t<set>Qt::AlignCenter</set>\n\t\t\t\t\t</property>\n\t\t\t\t</widget>\n\t\t\t</item>\n    \t</layout>\n\t</widget>\n\t<resources/>\n\t<connections/>\n</ui>"
  },
  {
    "path": "qobuz/content/contents/code/qobuz.js",
    "content": "/* Qobuz Tomahawk Resolver\n *\n * Adds the Qobuz Search functionality in Tomahawk\n * COPYRIGHT QOBUZ 2012\n *\n */\n\nvar debug = false;\n\n// Construct Query from object and url\nfunction http_build_query(url, parameters){\n  var qs = \"\";\n  for(var key in parameters) {\n    var value = parameters[key];\n    qs += encodeURIComponent(key) + \"=\" + encodeURIComponent(value) + \"&\";\n  }\n  if (qs.length > 0){\n    qs = qs.substring(0, qs.length-1); //chop off last \"&\"\n    url = url + \"?\" + qs;\n  }\n  return url;\n};\n\n// Flatten for a better resolve\nfunction flatten(str)\n{\n    var rExps=[\n    {re:/[\\xE0-\\xE6]/g, ch:'a'},\n    {re:/[\\xE8-\\xEB]/g, ch:'e'},\n    {re:/[\\xEC-\\xEF]/g, ch:'i'},\n    {re:/[\\xF2-\\xF6]/g, ch:'o'},\n    {re:/[\\xF9-\\xFC]/g, ch:'u'},\n    {re:/[\\xF1]/g, ch:'n'} ];\n\n    for(var i=0, len=rExps.length; i<len; i++)\n    str=str.replace(rExps[i].re, rExps[i].ch);\n\n    // And .. only alphanumeric and no double spaces\n    return str.replace(/[^a-z0-9]/gi,' ').replace(/\\s{2,}/g, ' ').toLowerCase();\n};\n\n\n/* MAIN RESOLVER\n *\n */ \nvar QobuzResolver = Tomahawk.extend(TomahawkResolver, {\n\n    // Basic settings\n    settings: {\n        name: 'Qobuz (Beta)',\n        nameForTracks: 'Qobuz',\n        icon: 'qobuz.png',\n        weight: 91,\n        timeout: 5\n    },\n    userAuthToken: false,\n    hasFullTracks: false,\n    resolverVersion: \"0.2\",\n\n    // API settings\n    apiParameter: {\n        endPoint: \"http://www.qobuz.com/api.json/0.2/\",\n        userLogin: \"user/login\",\n        search: \"search/getResults\",\n        getFileUrl: \"track/getFileUrl\", \n        app_id: \"546568742\",\n        secret: \"6e3e4f6d46c15303c618f474eb7962c3\"\n    },\n\n    // General configuration\n    qobuzTomahawkProtocol: \"qobuz\",\n    formatId: 5, // MP3 320Kbits by default, except if user is HIFI\n    purchaseUrl: \"http://www.qobuz.com/abonnement-streaming\",\n\n    // Get Config UI\n    getConfigUi: function () {\n\n        if (debug) Tomahawk.log(\"# INIT : Constructing UI for version \" + this.resolverVersion);\n\n        var uiData = Tomahawk.readBase64(\"config.ui\");\n\n        return {\n\n            \"widget\": uiData,\n            fields: [{\n                name: \"username\",\n                widget: \"usernameLineEdit\",\n                property: \"text\"\n            }, {\n                name: \"password\",\n                widget: \"passwordLineEdit\",\n                property: \"text\"\n            } ],\n            images: [{\n                \"qobuz.png\": Tomahawk.readBase64(\"qobuz.png\")\n            } ]\n\n        };\n    },\n\n    // Saves user credentials and preferences if any\n    newConfigSaved: function () {\n\n        // newUserConfig = new credentials provided by user\n        var newUserConfig = this.getUserConfig();\n\n        if (newUserConfig.username != \"\" && (newUserConfig.username != this.username) || (newUserConfig.password != this.password)) {\n\n            if (debug) Tomahawk.log(\"# AUTH : Saving new Qobuz credentials with username: \" + newUserConfig.username);\n            \n            // Erasing the current session\n            this.userAuthToken = false;\n            this.formatId = 5;\n            this.hasFullTracks = false;\n            window.localStorage['userAuthToken'] = false;\n            window.localStorage['hasFullTracks'] = false;\n            window.localStorage['formatId'] = 5;\n\n            // Saving credentials\n            this.username = newUserConfig.username;\n            this.password = newUserConfig.password;\n\n            // Launching init() again\n            this.init();\n        }\n    },\n\n    init: function () {\n\n        var userConfig = this.getUserConfig();\n\n        if (!userConfig.username || !userConfig.password) {\n            if (debug) Tomahawk.log(\"# INIT : Qobuz Resolver is not configured properly. This might be the first use - Try logging in again.\");\n\n            // Erasing the current session\n            this.userAuthToken = false;\n            this.hasFullTracks = false;\n            this.formatId = 5;\n            window.localStorage['userAuthToken'] = false;\n            window.localStorage['hasFullTracks'] = false;\n            window.localStorage['formatId'] = 5;\n\n            return;\n        }\n\n        if (debug) Tomahawk.log(\"# INIT : Initing Qobuz Resolver, got credentials: \" + userConfig.username );\n\n        this.username = userConfig.username;\n        this.password = userConfig.password;\n\n        this.userAuthToken = window.localStorage['userAuthToken'];\n        this.hasFullTracks = window.localStorage['hasFullTracks'];\n        this.formatId = window.localStorage['formatId'];\n\n        Tomahawk.addCustomUrlHandler( this.qobuzTomahawkProtocol, \"getStreamUrl\" );\n        if (debug) Tomahawk.log(\"# INIT : Qobuz <-> Tomahawk Protocol registered.\");\n\n        this.authenticate();\n\n        // Testing only\n//         Tomahawk.log(\"Getting playlist songs!\");\n//         this._apiCall('getPlaylistSongs', { playlistID: '64641975' }, function (xhr) {\n//             Tomahawk.log(\"PLAYLIST RESPONSE: \" + xhr.responseText );\n//         });\n//         this._apiCall('getSongsInfo', { songIDs: ['3GBAjY'] }, function(xhr) {\n//             Tomahawk.log(\"GOT SONG INFO:\" + xhr.responseText );\n//         });\n    },\n\n\n    authenticate: function () {\n\n        if (debug) Tomahawk.log(\"# AUTH : Qobuz resolver authenticating with username: \" + this.username );\n\n        // We build the parameters for this call\n        var params;\n        var hashString;\n        if (typeof CryptoJS !== \"undefined\" && typeof CryptoJS.MD5 == \"function\") {\n            hashString = CryptoJS.MD5(this.password).toString(CryptoJS.enc.Hex);\n        } else {\n            hashString = Tomahawk.md5(this.password);\n        }\n        if (this.username.indexOf('@') != -1) {\n            params = { // User provided us with a username\n                email: this.username,\n                password: hashString\n            };\n        } else {\n            params = { // User provided us with an email\n                username: this.username,\n                password: hashString\n            };\n        }\n        \n        var that = this;\n        this.apiCall(this.apiParameter.userLogin, params, function (xhr) {\n            \n            var ret = JSON.parse(xhr.responseText);\n\n            if (ret.user_auth_token && ret.user_auth_token != \"\" && ret.user_auth_token != null  ) {\n\n                if (debug) Tomahawk.log(\"# AUTH : Authentication succeeded with username: \" + that.username);\n\n                that.userAuthToken = ret.user_auth_token;\n                window.localStorage['userAuthToken'] = ret.user_auth_token;\n\n                // Is user premium ?\n                that.hasFullTracks = (ret.user.credential.parameters.lossy_streaming == true) ;\n                window.localStorage['hasFullTracks'] = that.hasFullTracks;\n\n                // Is user hifi ?\n                if (ret.user.credential.parameters.lossless_streaming) {\n                    that.formatId = 6;\n                    window.localStorage['formatId'] = 6;\n                }\n\n                if (debug) Tomahawk.log(\"#        User is premium ? \" + that.hasFullTracks + \" (formatId : \" + that.formatId + \")\");\n\n            } else {\n\n                if (debug) Tomahawk.log(\"# AUTH : Authentication failed with username: \" + that.username );\n                that.userAuthToken = false;\n                that.hasFullTracks = false;\n                that.formatId = 5;\n                window.localStorage['userAuthToken'] = false;\n                window.localStorage['hasFullTracks'] = false;\n                window.localStorage['formatId'] = 5;\n            }\n\n        }, false);\n    },\n\n    /* Build the Payload and adds the Signature to the arguments\n     *\n     */\n    signRequest: function (methodName, args) {\n\n        // Setp 1\n        var payload = methodName.replace('/','');\n\n        // Step 2\n        var paramsAsArray = [];\n\n        for(var key in args)\n        {\n            if(args.hasOwnProperty(key))\n            {\n                paramsAsArray.push(key+args[key]);\n            }\n        };\n\n        payload += paramsAsArray.sort().join('');\n\n        // Step 3\n        var ts = Math.round((new Date()).getTime() / 1000);\n        payload += ts;\n\n        // Step 4\n        payload += this.apiParameter.secret;\n\n        // Hashing Parmentier\n        var md5Payload;\n        if (typeof CryptoJS !== \"undefined\" && typeof CryptoJS.MD5 == \"function\") {\n            md5Payload = CryptoJS.MD5(payload).toString(CryptoJS.enc.Hex);\n        } else {\n            md5Payload = Tomahawk.md5(payload);\n        }\n\n        // Creating the new arguments\n        var newArgs = args;\n\n            newArgs[\"request_ts\"] = ts;\n            newArgs[\"request_sig\"] = md5Payload;\n            newArgs[\"app_id\"] = this.apiParameter.app_id;\n        if (this.userAuthToken && this.userAuthToken != \"\")\n            newArgs[\"user_auth_token\"] = this.userAuthToken;\n\n        return newArgs;\n\n    },\n\n    /* Makes an Async or Sync request API CALL\n     *\n     */\n    apiCall: function (methodName, args, callback, forceSync) {\n\n        if (debug) Tomahawk.log(\"## LOW LEVEL : API Async call for method '\" + methodName + \"'.\");\n\n        // Adding the payload / requests to the args (including app_id)\n        args = this.signRequest(methodName,args);\n        var url = this.apiParameter.endPoint + methodName;\n\n        if (debug) Tomahawk.log(\"##             - CALL : \" + http_build_query(url, args));\n\n        if (forceSync == true)\n            return Tomahawk.syncRequest(http_build_query(url, args));\n        else\n            return Tomahawk.asyncRequest(http_build_query(url, args), callback);\n\n    },\n\n    /* Gets the stream url from the API\n     *\n     */\n    getStreamUrl: function (ourUrl) {\n\n        if (debug) Tomahawk.log(\"# PLAY : Track requested for streaming: \" + ourUrl);\n\n        // Building parameters\n        var params = {\n            track_id: ourUrl.replace(this.qobuzTomahawkProtocol + \"://\",\"\"),\n            format_id: this.formatId\n        };\n\n        // Getting stream (FORCING sync)\n        var stream = this.apiCall( this.apiParameter.getFileUrl, params, null, true);\n        var ret = JSON.parse(stream);\n\n        // In case the token is not good ?\n        if (ret.status && ret.status == \"error\") {\n\n            if (debug) Tomahawk.log(\"# PLAY : Error retrieving the file, trying a new login.\");\n            this.authenticate();\n\n            // We retry once :\n            return this.getStreamUrl(ourUrl);\n\n        } else {\n            \n            if (debug) Tomahawk.log(\"# PLAY : got the stream: \" + ret.url); \n\n            // We have to set a timeout to report the streaming status\n            // window.setTimeout(, 6000);\n            // FIX ME\n\n            // We return the stream\n            return unescape(ret.url);\n\n        }\n        \n        return \"\";\n    },\n\n    /* Process an array of items from the API\n     *\n     */\n    process: function (qid, itemsArray) {\n\n        if (!itemsArray) return;\n\n        var count = itemsArray.length;\n\n        // Building results\n        var results = [];\n        var durationTC = [];\n        var duration;\n        var bitrate = \"320\";\n        var audioMimetype = \"audio/mpeg\";\n        var isPreview = false;\n        var release_date;\n\n        for (var i = 0; i < count; i++) {\n\n            var retrievedTrack = itemsArray[i];\n\n            // If the track is a sample or if the user is not registered, we gotta change the track info\n            if (!this.hasFullTracks || retrievedTrack.streaming_type == \"sample\") isPreview = true;\n            else isPreview = false;\n\n            // Bitrate information\n            if (this.formatId == 6 && retrievedTrack.streaming_type == \"full\") {\n                bitrate = \"0\";\n                audioMimetype = \"audio/flac\";\n            } else {\n                bitrate = \"320\";\n                audioMimetype = \"audio/mpeg\";           \n            }\n\n            release_date = new Date(retrievedTrack.album.released_at * 1000); // Unix timestamp in javascript : x1000\n\n            // Building result array\n            var resultTrack = {\n                artist: retrievedTrack.performer.name,\n                album: retrievedTrack.album.title,\n                track: retrievedTrack.title,\n                source: this.settings.nameForTracks,\n                url: this.qobuzTomahawkProtocol + \"://\" + retrievedTrack.id,\n                mimetype: audioMimetype,\n                duration: retrievedTrack.duration,\n                bitrate: bitrate,\n                year: release_date.getFullYear(),\n                albumpos: retrievedTrack.track_number,\n                discnumber: retrievedTrack.media_number,\n                preview: isPreview,\n                purchaseurl: (isPreview)?this.purchaseUrl:null\n                //score: How accurate this search result is, a float, from 0-1.\n            }\n            results.push(resultTrack);\n        };\n\n        // TOMAHAWK Specifications for returning results\n        var toReturn = {\n            results: results,\n            qid: qid\n        };\n\n        Tomahawk.addTrackResults(toReturn);\n\n    },\n\n    /* Resolves the current track / album / artist\n     *\n     */\n    resolve: function (qid, artist, album, title) {\n\n\n        if (debug) Tomahawk.log(\"# RESOLVE : Resolve initiated with artist=\" + artist + \", album=\" + album + \", title=\" + title);\n\n        if (album == null) album = '';\n        if (artist == null) artist = '';\n        if (title == null) title = '';\n\n        // Constructing the query string\n        var params = {\n            query: flatten(artist + ' ' + album + ' ' + title),\n            type: \"tracks\",\n            limit: 1\n        };\n\n        // Calling the API\n        var that = this;\n        this.apiCall(this.apiParameter.search, params, function (xhr) {\n\n            var ret = JSON.parse(xhr.responseText);\n\n            // In case of error or no result.\n            if ( !ret || !ret.tracks ) return;\n\n            // Maybe another album ? Why not ?\n            if (ret.tracks.total == 0) {\n\n                if ( album != '' ) {\n                    if (debug) Tomahawk.log(\"# RESOLVE : NOTHING FOUND ! Relauching resolve without the album\");\n                    return that.resolve(qid, artist, '', title);\n                } else {\n                    if (debug) Tomahawk.log(\"# RESOLVE : NOTHING FOUND ! Sorry\");\n                    return \"\";\n                }\n\n            };\n\n            if (debug) Tomahawk.log(\"# RESOLVE : Found a matching track on QOBUZ\");\n\n            // Processes and adds to Tomahawk\n            that.process(qid, ret.tracks.items);\n\n        });\n    },\n\n    /* Search for a query/term\n     *\n     */\n    search: function (qid, searchString) {\n\n        if (debug) Tomahawk.log(\"# SEARCH : Search initiated on Qobuz\");\n\n        // Constructing the query string\n        var params = {\n            query: flatten(searchString),\n            type: \"tracks\"  \n        };\n\n        // Calling the API\n        var that = this;\n        this.apiCall(this.apiParameter.search, params, function (xhr) {\n\n            var ret = JSON.parse(xhr.responseText);\n\n            // In case of error or no result.\n            if ( !ret || !ret.tracks ) return;\n\n            var count = ret.tracks.total;\n\n            // Typo ? ==> SUGGEST !\n            if (count == 0 && ret.suggestions && ret.suggestions.length != 0 ) {\n\n                if (debug) Tomahawk.log(\"# SEARCH : TYPO ALERT ! Relauching search on '\" + ret.suggestions[0] + \"'\");\n                return that.search(qid, ret.suggestions[0]);\n\n            };\n\n            if (debug) Tomahawk.log(\"# SEARCH : Found \" + count + \" tracks on QOBUZ\");\n\n            // Processes and adds to Tomahawk\n            that.process(qid, ret.tracks.items);\n\n        });\n    }\n});\n\n// Instanciating the resolver\nTomahawk.resolver.instance = QobuzResolver;\n"
  },
  {
    "path": "qobuz/content/metadata.json",
    "content": "{\n    \"name\": \"Qobuz\",\n    \"pluginName\": \"qobuz\",\n    \"author\": \"Qobuz Sarl\",\n    \"email\": \"regbasket@gmail.com\",\n    \"version\": \"0.1\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Searches Qobuz for playable tracks. Qobuz subscription required.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/qobuz.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"resources\": [\n            \"contents/code/qobuz.png\",\n            \"contents/code/config.ui\"\n        ]\n    }\n}\n"
  },
  {
    "path": "rhapsody/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>390</width>\n    <height>120</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>250</width>\n    <height>120</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::ExpandingFieldsGrow</enum>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Email</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"email_edit\"/>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Password</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"password_edit\">\n       <property name=\"echoMode\">\n        <enum>QLineEdit::Password</enum>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_3\">\n       <property name=\"text\">\n        <string>Stream Quality</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"1\">\n      <widget class=\"QComboBox\" name=\"quality\">\n       <item>\n        <property name=\"text\">\n         <string>AAC PLUS 64</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>AAC 192</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>AAC 320</string>\n        </property>\n       </item>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "rhapsody/content/contents/code/rhapsody.js",
    "content": "/* http://music.163.com resolver for Tomahawk.\n *\n * Written in 2015 by Anton Romanov\n * Licensed under the Eiffel Forum License 2.\n *\n */\n\nvar RhapsodyResolver = Tomahawk.extend( Tomahawk.Resolver, {\n    apiVersion: 0.9,\n\n    logged_in: null, // null, = not yet tried, 0 = pending, 1 = success, 2 = failed\n    numQuality: [\"64\", \"192\", \"320\"],\n\n    settings: {\n        cacheTime: 300,\n        name: 'Rhapsody',\n        weight: 90,\n        icon: '../images/logo.png',\n        timeout: 15\n    },\n\n    getConfigUi: function () {\n        return {\n            \"widget\": Tomahawk.readBase64(\"config.ui\"),\n            fields: [{\n                name: \"email\",\n                widget: \"email_edit\",\n                property: \"text\"\n            }, {\n                name: \"password\",\n                widget: \"password_edit\",\n                property: \"text\"\n            }, {\n                name: \"quality\",\n                widget: \"quality\",\n                property: \"currentIndex\"\n            }]\n        };\n    },\n\n    newConfigSaved: function (newConfig) {\n        var changed =\n            this._email !== newConfig.email ||\n            this._password !== newConfig.password ||\n            this._quality != newConfig.quality;\n\n        if (changed) {\n            this.init();\n        }\n    },\n\n    testConfig: function (config) {\n        return this._getLoginPromise(config).then(function () {\n            return Tomahawk.ConfigTestResultType.Success;\n        }, function (xhr) {\n            if (xhr.status == 401) {\n                return Tomahawk.ConfigTestResultType.InvalidCredentials;\n            } else {\n                return Tomahawk.ConfigTestResultType.CommunicationError;\n            }\n        });\n    },\n\n    _convertTrack: function (entry) {\n        return {\n            artist:     entry.artist.name,\n            album:      entry.album.name,\n            track:      entry.name,\n            title:      entry.name,\n            bitrate:    this.numQuality[this._quality],\n            duration:   entry.duration,\n            url:        'rhap://track/' + entry.id,\n            checked:    true,\n            type:       \"track\"\n        };\n    },\n\n    init: function() {\n        var config = this.getUserConfig();\n\n        this._email = config.email;\n        this._password = config.password;\n        this._quality = config.quality;\n\n        if (!this._email || !this._password) {\n            //This is being called even for disabled ones\n            //throw new Error( \"Invalid configuration.\" );\n            Tomahawk.log(\"Invalid Configuration\");\n            return;\n        }\n\n        this._login(config);\n    },\n\n    _getSession: function() {\n        var that = this;\n        if (this._session) {\n            return Promise.resolve(this._session);\n        } else {\n            return Tomahawk.post('https://direct.rhapsody.com/playbackserver/v1/users/' +\n                    that._rhap_config.userId + '/sessions', {data : {clientType:'rhap-web'},\n                        headers: that._headers, dataFormat: 'json'}).then(function(resp) {\n                            that._session = resp;\n                            return resp;\n                    });\n        }\n    },\n\n    getStreamUrl: function(params) {\n        var that = this;\n        var id = params.url.match(/^rhap:\\/\\/([a-z]+)\\/(.+)$/);\n        if(!id ) {\n            return {url:params.url};\n        }\n        id = id[2];\n\n        return this._getSession().then(function(session) {\n\n            return Tomahawk.get('https://direct.rhapsody.com/playbackserver/v1/users/' +\n                that._rhap_config.userId + '/sessions/' +\n                session.id + '/track/' + id + '?context=ON_DEMAND', {\n                    headers: Tomahawk.extend(that._headers, {'x-rhapsody-access-token-v2':that._rhap_config.rhapsodyAccessToken})\n                }).then(function(track) {\n                    var url = track.stationTrack.medias.filter(function(m){\n                        return m.bitrate == that.numQuality[that._quality];\n                    })[0].location;\n                    url = url.split('/');\n                    url[5] = 'mp4:' + url[5];\n                    url = url.join('/');\n                    return {url:url};\n                });\n        });\n    },\n\n    search: function (params) {\n        var that = this;\n        return this._loginPromise.then(function() {\n            return Tomahawk.get('http://api.rhapsody.com/v1/search/typeahead', {\n                    data : {\n                       type: 'track',\n                       limit: '10',\n                       offset: '0',\n                       apikey: that._api_key,\n                       catalog: that._rhap_config.country,\n                       q: params.query\n                    }\n                    }).then(function(results) {\n                        return results.map(that._convertTrack, that);\n                    });\n        }, function() {\n            return [];\n        });\n    },\n\n    resolve: function (params) {\n        var query = [ params.artist, params.track ].join(' ');\n        return this.search({query:query});\n    },\n\n    _getLoginPromise: function (config) {\n        var that = this;\n        return Tomahawk.get('http://app.rhapsody.com/assets/webclient-cli.js').then(function(data){\n            var headers_to_search = [\n                'x-rds-devkey',\n                'x-rds-cobrand',\n                'Authorization'\n            ];\n            var saved_headers = {};\n            headers_to_search.forEach(function(header) {\n                var re = RegExp('\"?' + header + '\"?:\"([^\"]+)');\n                saved_headers[header] = data.match(re)[1];\n            });\n            saved_headers['Accept'] = 'application/json';\n            saved_headers['Origin'] = 'http://app.rhapsody.com';\n            //I know this function is not supposed to change state as it is\n            //also used from testConfig ... but these 2 lines are safe, trust me\n            that._headers = saved_headers;\n            that._api_key = data.match(/apikey[\", ]+([^\"]+)/)[1];\n\n            return Tomahawk.get('https://direct.rhapsody.com/authserver/v3/useraccounts?userName=' + encodeURIComponent(config.email),{\n                    headers : Tomahawk.extend(saved_headers, {'x-rds-authentication' : config.password, })\n                });\n        });\n    },\n\n    _login: function (config) {\n        // If a login is already in progress don't start another!\n        if (this.logged_in === 0) {\n            return this._loginPromise;\n        }\n        this.logged_in = 0;\n\n        var that = this;\n\n        this._loginPromise = this._getLoginPromise(config)\n            .then(function (resp) {\n                Tomahawk.log(that.settings.name + \" successfully logged in.\");\n\n                that._rhap_config = resp;\n\n                that.logged_in = 1;\n            }, function (error) {\n                Tomahawk.log(that.settings.name + \" failed login.\");\n\n                delete that._rhap_config;\n\n                that.logged_in = 2;\n            }\n        );\n        return this._loginPromise;\n    }\n});\n\nTomahawk.resolver.instance = RhapsodyResolver;\n\n\n"
  },
  {
    "path": "rhapsody/content/metadata.json",
    "content": "{\n    \"name\": \"Rhapsody\",\n    \"pluginName\": \"rhapsody\",\n    \"author\": \"Anton Romanov\",\n    \"email\": \"\",\n    \"version\": \"0.0.1\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Rhapsody (PREMIER) on-demand streaming\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/rhapsody.js\",\n        \"icon\": \"contents/images/logo.png\",\n        \"scripts\": [],\n        \"resources\": [\n            \"contents/code/config.ui\"\n        ]\n    },\n    \"staticCapabilities\": []\n}\n"
  },
  {
    "path": "soundcloud/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>400</width>\n    <height>300</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <widget class=\"QCheckBox\" name=\"covers\">\n   <property name=\"geometry\">\n    <rect>\n     <x>40</x>\n     <y>210</y>\n     <width>181</width>\n     <height>21</height>\n    </rect>\n   </property>\n   <property name=\"text\">\n    <string>Include cover versions</string>\n   </property>\n  </widget>\n  <widget class=\"QCheckBox\" name=\"remixes\">\n   <property name=\"geometry\">\n    <rect>\n     <x>40</x>\n     <y>240</y>\n     <width>181</width>\n     <height>21</height>\n    </rect>\n   </property>\n   <property name=\"text\">\n    <string>Include remixes</string>\n   </property>\n  </widget>\n  <widget class=\"QCheckBox\" name=\"live\">\n   <property name=\"geometry\">\n    <rect>\n     <x>40</x>\n     <y>270</y>\n     <width>181</width>\n     <height>21</height>\n    </rect>\n   </property>\n   <property name=\"text\">\n    <string>Include live versions</string>\n   </property>\n  </widget>\n  <widget class=\"QLabel\" name=\"soundcloud\">\n   <property name=\"geometry\">\n    <rect>\n     <x>40</x>\n     <y>0</y>\n     <width>320</width>\n     <height>200</height>\n    </rect>\n   </property>\n   <property name=\"pixmap\">\n    <pixmap>soundcloud.png</pixmap>\n   </property>\n  </widget>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "soundcloud/content/contents/code/soundcloud.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2012, Thierry Göckel <thierry@strayrayday.lu>\n *   Copyright 2013, Uwe L. Korn <uwelk@xhochy.com>\n *   Copyright 2015, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU Lesser General Public License as\n *   published by the Free Software Foundation, version 3.\n *\n *   Tomahawk is distributed in the hope that it will be useful, but\n *   WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n *   Lesser General Public License for more details.\n *\n *   You should have received a copy of the GNU Lesser General Public License\n *   along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar SoundcloudResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    soundcloudClientId: \"TiNg2DRYhBnp01DA3zNag\",\n\n    echonestClientId: \"JRIHWEP6GPOER2QQ6\",\n\n    baseUrl: \"https://api.soundcloud.com/\",\n\n    settings: {\n        name: 'SoundCloud',\n        icon: 'soundcloud-icon.png',\n        weight: 85,\n        timeout: 15\n    },\n\n    getConfigUi: function () {\n        var uiData = Tomahawk.readBase64(\"config.ui\");\n        return {\n            \"widget\": uiData,\n            fields: [\n                {\n                    name: \"includeCovers\",\n                    widget: \"covers\",\n                    property: \"checked\"\n                },\n                {\n                    name: \"includeRemixes\",\n                    widget: \"remixes\",\n                    property: \"checked\"\n                },\n                {\n                    name: \"includeLive\",\n                    widget: \"live\",\n                    property: \"checked\"\n                }\n            ],\n            images: [\n                {\n                    \"soundcloud.png\": Tomahawk.readBase64(\"soundcloud.png\")\n                }\n            ]\n        };\n    },\n\n    /**\n     * Defines this Resolver's config dialog UI.\n     */\n    configUi: [\n        {\n            id: \"includeCovers\",\n            type: \"checkbox\",\n            label: \"Include cover versions\"\n        },\n        {\n            id: \"includeRemixes\",\n            type: \"checkbox\",\n            label: \"Include remix versions\"\n        },\n        {\n            id: \"includeLive\",\n            type: \"checkbox\",\n            label: \"Include live versions\"\n        }\n    ],\n\n    newConfigSaved: function (newConfig) {\n        this.includeCovers = newConfig.includeCovers;\n        this.includeRemixes = newConfig.includeRemixes;\n        this.includeLive = newConfig.includeLive;\n    },\n\n    /**\n     * Initialize the Soundcloud resolver.\n     */\n    init: function () {\n        // Set userConfig here\n        var userConfig = this.getUserConfig();\n        if (userConfig) {\n            this.includeCovers = userConfig.includeCovers;\n            this.includeRemixes = userConfig.includeRemixes;\n            this.includeLive = userConfig.includeLive;\n        } else {\n            this.includeCovers = false;\n            this.includeRemixes = false;\n            this.includeLive = false;\n        }\n\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n    },\n\n    _isValidTrack: function (trackTitle, origTitle) {\n        if (!this.includeCovers &&\n            trackTitle.search(/cover/i) >= 0 &&\n            origTitle.search(/cover/i) < 0) {\n            return false;\n        }\n        if (!this.includeRemixes &&\n            trackTitle.search(/mix/i) >= 0 &&\n            origTitle.search(/mix/i) < 0) {\n            return false;\n        }\n        if (!this.includeLive &&\n            trackTitle.search(/live/i) >= 0 &&\n            origTitle.search(/live/i) < 0) {\n            return false;\n        }\n        return true;\n    },\n\n    resolve: function (params) {\n        var artist = params.artist;\n        var album = params.album;\n        var track = params.track;\n\n        var that = this;\n\n        var url = this.baseUrl + \"tracks.json\";\n        var settings = {\n            data: {\n                consumer_key: this.soundcloudClientId,\n                filter: \"streamable\",\n                limit: 20,\n                q: [artist, track].join(\" \")\n            }\n        };\n        return Tomahawk.get(url, settings).then(function (response) {\n            var results = [];\n            for (var i = 0; i < response.length; i++) {\n                // Check if the title-string contains the track name we are looking for. Also check\n                // if the artist name can be found in either the title-string or the username. Last\n                // but not least we make sure that we only include covers/remixes and live versions\n                // if the user wants us to.\n                if (!response[i] || !response[i].title\n                    || (response[i].title.toLowerCase().indexOf(artist.toLowerCase()) < 0\n                    && response[i].user.username.toLowerCase().indexOf(artist.toLowerCase()) < 0)\n                    || response[i].title.toLowerCase().indexOf(track.toLowerCase()) < 0\n                    || !that._isValidTrack(response[i].title, track)) {\n                    continue;\n                }\n\n                var guessedMetaData = that._guessMetaData(response[i].title);\n                var title = guessedMetaData ? guessedMetaData.track : response[i].title;\n\n                var result = {\n                    track: title,\n                    artist: artist,\n                    bitrate: 128,\n                    mimetype: \"audio/mpeg\",\n                    source: that.settings.name,\n                    duration: response[i].duration / 1000,\n                    year: response[i].release_year,\n                    url: response[i].stream_url + \".json?client_id=\" + that.soundcloudClientId\n                };\n                if (response[i].permalink_url) {\n                    result.linkUrl = response[i].permalink_url;\n                }\n                results.push(result);\n            }\n            return results;\n        });\n    },\n\n    _guessMetaData: function (title) {\n        var matches = title.match(/\\s*(.+?)\\s*(?:\\s[-\\u2014]|\\s[\"']|:)\\s*[\"']?(.+?)[\"']?\\s*$/);\n        if (matches && matches.length > 2) {\n            return {\n                track: matches[2],\n                artist: matches[1]\n            };\n        }\n        matches = title.match(/\\s*(.+?)\\s*[-\\u2014]+\\s*(.+?)\\s*$/);\n        if (matches && matches.length > 2) {\n            return {\n                track: matches[2],\n                artist: matches[1]\n            };\n        }\n    },\n\n    search: function (params) {\n        var query = params.query;\n\n        var that = this;\n\n        var url = this.baseUrl + \"tracks.json\";\n        var settings = {\n            data: {\n                consumer_key: this.soundcloudClientId,\n                filter: \"streamable\",\n                limit: 50,\n                q: query.replace(\"'\", \"\")\n            }\n        };\n        return Tomahawk.get(url, settings).then(function (response) {\n            var results = [];\n            for (var i = 0; i < response.length; i++) {\n                // Make sure that we only include covers/remixes and live versions if the user wants\n                // us to.\n                if (!response[i] || !response[i].title\n                    || !that._isValidTrack(response[i].title, \"\")) {\n                    continue;\n                }\n\n                var result = {\n                    mimetype: \"audio/mpeg\",\n                    bitrate: 128,\n                    duration: response[i].duration / 1000,\n                    year: response[i].release_year,\n                    url: response[i].stream_url + \".json?client_id=\" + that.soundcloudClientId\n                };\n                if (response[i].permalink_url) {\n                    result.linkUrl = response[i].permalink_url;\n                }\n\n                var guessedMetaData = that._guessMetaData(response[i].title);\n                if (guessedMetaData) {\n                    result.track = guessedMetaData.track;\n                    result.artist = guessedMetaData.artist;\n                } else if (response[i].user.username) {\n                    // We weren't able to guess the artist and track name, so we assume the username\n                    // as the artist name. No further check with Echonest needed since it's very\n                    // unlikely that the username actually is the name of the track and not of the\n                    // artist.\n                    result.track = response[i].title;\n                    result.artist = response[i].user.username;\n                }\n                results.push(result);\n            }\n            return results;\n        });\n    },\n\n    canParseUrl: function (params) {\n        var url = params.url;\n        var type = params.type;\n        // Soundcloud only returns tracks and playlists\n        switch (type) {\n            case TomahawkUrlType.Album:\n                return false;\n            case TomahawkUrlType.Artist:\n                return false;\n            default:\n                return (/https?:\\/\\/(www\\.)?soundcloud.com\\//).test(url);\n        }\n    },\n\n    _convertTrack: function (track) {\n        var result = {\n            type: Tomahawk.UrlType.Track,\n            track: track.title,\n            artist: track.user.username\n        };\n\n        if (!(track.stream_url === null || typeof track.stream_url === \"undefined\")) {\n            result.hint = track.stream_url + \"?client_id=\" + this.soundcloudClientId;\n        }\n        return result;\n    },\n\n    lookupUrl: function (params) {\n        var url = params.url;\n\n        var that = this;\n\n        var queryUrl = this.baseUrl + \"resolve.json\";\n        var settings = {\n            data: {\n                client_id: this.soundcloudClientId,\n                url: url.replace(/\\/likes$/, '')\n            }\n        };\n        return Tomahawk.get(queryUrl, settings).then(function (response) {\n            if (response.kind == \"playlist\") {\n                var result = {\n                    type: Tomahawk.UrlType.Playlist,\n                    title: response.title,\n                    guid: 'soundcloud-playlist-' + response.id.toString(),\n                    info: response.description,\n                    creator: response.user.username,\n                    linkUrl: response.permalink_url,\n                    tracks: []\n                };\n                response.tracks.forEach(function (item) {\n                    result.tracks.push(that._convertTrack(item));\n                });\n                return result;\n            } else if (response.kind == \"track\") {\n                return that._convertTrack(response);\n            } else if (response.kind == \"user\") {\n                var url2 = response.uri;\n                var prefix = 'soundcloud-';\n                var title = response.full_name + \"'s \";\n                if (url.indexOf(\"/likes\") === -1) {\n                    url2 += \"/tracks.json?client_id=\" + that.soundcloudClientId;\n                    prefix += 'user-';\n                    title += \"Tracks\";\n                } else {\n                    url2 += \"/favorites.json?client_id=\" + that.soundcloudClientId;\n                    prefix += 'favortites-';\n                    title += \"Favorites\";\n                }\n                return Tomahawk.get(url2).then(function (response) {\n                    var result = {\n                        type: Tomahawk.UrlType.Playlist,\n                        title: title,\n                        guid: prefix + response.id.toString(),\n                        info: title,\n                        creator: response.username,\n                        linkUrl: response.permalink_url,\n                        tracks: []\n                    };\n                    response.forEach(function (item) {\n                        result.tracks.push(that._convertTrack(item));\n                    });\n                    return result;\n                });\n            } else {\n                Tomahawk.log(\"Could not parse SoundCloud URL: \" + url);\n                throw new Error(\"Could not parse SoundCloud URL: \" + url);\n            }\n        });\n    }\n});\n\nTomahawk.resolver.instance = SoundcloudResolver;\n"
  },
  {
    "path": "soundcloud/content/contents/code/test.js",
    "content": "var buster = require(\"buster\");\nvar nock = require(\"nock\");\nvar utils = require(\"../../../../test/utils.js\");\n\nbuster.testCase(\"soundcloud\", {\n    setUp: function (done) {\n        utils.loadResolver('soundcloud', this, done);\n    },\n\n    \"test capabilities\": function () {\n        buster.assert(this.context.hasCapability('urllookup'));\n        buster.refute(this.context.hasCapability('playlistsync'));\n        buster.refute(this.context.hasCapability('browsable'));\n    },\n\n    \"test resolving\": function (done) {\n        this.context.on('track-result', function (qid, result) {\n            buster.assert.equals(\"qid-001\", qid);\n            buster.assert.equals(\"Bloc Party\", result.artist);\n            buster.assert.equals(\"Ratchet\", result.track);\n            done();\n        });\n        // This is not the original reponse but one of the answer slightly adjusted\n        nock(\"https://api.soundcloud.com\")\n            .get(\"/tracks.json?consumer_key=TiNg2DRYhBnp01DA3zNag&filter=streamable&q=Bloc%20Party+Ratchet\")\n            .reply(200, JSON.stringify([\n                {\n                    \"kind\": \"track\",\n                    \"id\": 112482070,\n                    \"created_at\": \"2013/09/25 21:51:32 +0000\",\n                    \"user_id\": 932254,\n                    \"duration\": 1249970,\n                    \"commentable\": true,\n                    \"state\": \"finished\",\n                    \"original_content_size\": 49995285,\n                    \"sharing\": \"public\",\n                    \"tag_list\": \"kele okereke bloc party tapes k7 records dj mix cd download\",\n                    \"permalink\": \"20-min-snippet\",\n                    \"streamable\": true,\n                    \"embeddable_by\": \"all\",\n                    \"downloadable\": false,\n                    \"purchase_url\": null,\n                    \"label_id\": null,\n                    \"purchase_title\": null,\n                    \"genre\": \"Dance\",\n                    \"title\": \"Bloc Party - Ratchet\",\n                    \"description\": \"<--truncated-->\",\n                    \"label_name\": \"\",\n                    \"release\": \"\",\n                    \"track_type\": \"recording\",\n                    \"key_signature\": \"\",\n                    \"isrc\": \"\",\n                    \"video_url\": null,\n                    \"bpm\": null,\n                    \"release_year\": null,\n                    \"release_month\": null,\n                    \"release_day\": null,\n                    \"original_format\": \"mp3\",\n                    \"license\": \"all-rights-reserved\",\n                    \"uri\": \"https://api.soundcloud.com/tracks/112482070\",\n                    \"user\": {\n                        \"id\": 932254,\n                        \"kind\": \"user\",\n                        \"permalink\": \"keleokereke\",\n                        \"username\": \"Kele Okereke\",\n                        \"uri\": \"https://api.soundcloud.com/users/932254\",\n                        \"permalink_url\": \"http://soundcloud.com/keleokereke\",\n                        \"avatar_url\": \"https://i1.sndcdn.com/avatars-000056100835-hnk1ji-large.jpg?30a2558\"\n                    },\n                    \"permalink_url\": \"http://soundcloud.com/keleokereke/20-min-snippet\",\n                    \"artwork_url\": \"https://i1.sndcdn.com/artworks-000059074336-nf414w-large.jpg?30a2558\",\n                    \"waveform_url\": \"https://w1.sndcdn.com/nprcFygtaWnU_m.png\",\n                    \"stream_url\": \"https://api.soundcloud.com/tracks/112482070/stream\",\n                    \"playback_count\": 38057,\n                    \"download_count\": 0,\n                    \"favoritings_count\": 679,\n                    \"comment_count\": 39,\n                    \"attachments_uri\": \"https://api.soundcloud.com/tracks/112482070/attachments\"\n                }\n            ]));\n        this.instance.resolve(\"qid-001\", \"Bloc Party\", \"\", \"Ratchet\");\n    },\n\n    \"// test search\": function () {\n    },\n\n    \"// test url lookup\": function () {\n    }\n});\n\n"
  },
  {
    "path": "soundcloud/content/metadata.json",
    "content": "{\n\t\"name\": \"SoundCloud\",\n\t\"pluginName\": \"soundcloud\",\n\t\"author\": \"Thierry Göckel, Enno Gottschalk\",\n\t\"email\": \"thierry@strayrayday.lu\",\n\t\"version\": \"1.0.3\",\n\t\"website\": \"http://gettomahawk.com\",\n\t\"description\": \"Resolves to playable tracks on SoundCloud, including live, cover and remixed versions if specified.\",\n\t\"type\": \"resolver/javascript\",\n\t\"manifest\": {\n\t\t\"main\": \"contents/code/soundcloud.js\",\n\t\t\"scripts\": [],\n\t\t\"icon\": \"contents/images/icon.png\",\n\t\t\"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n\t\t\"resources\": [\n\t\t\t\"contents/code/soundcloud.png\",\n\t\t\t\"contents/code/soundcloud-icon.png\",\n\t\t\t\"contents/code/config.ui\"\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "spotify/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Uwe L. Korn\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "spotify/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>1506</width>\n    <height>1566</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <widget class=\"QFrame\" name=\"horizontalFrame\">\n     <property name=\"maximumSize\">\n      <size>\n       <width>16777215</width>\n       <height>250</height>\n      </size>\n     </property>\n     <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n      <property name=\"spacing\">\n       <number>6</number>\n      </property>\n      <property name=\"sizeConstraint\">\n       <enum>QLayout::SetMinimumSize</enum>\n      </property>\n      <item>\n       <widget class=\"QLabel\" name=\"spotify_label\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <property name=\"maximumSize\">\n         <size>\n          <width>200</width>\n          <height>200</height>\n         </size>\n        </property>\n        <property name=\"baseSize\">\n         <size>\n          <width>0</width>\n          <height>0</height>\n         </size>\n        </property>\n        <property name=\"pixmap\">\n         <pixmap>spotify.png</pixmap>\n        </property>\n        <property name=\"scaledContents\">\n         <bool>true</bool>\n        </property>\n        <property name=\"alignment\">\n         <set>Qt::AlignCenter</set>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::ExpandingFieldsGrow</enum>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Username:</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"user_edit\"/>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Password:</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"password_edit\">\n       <property name=\"echoMode\">\n        <enum>QLineEdit::Password</enum>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "spotify/content/contents/code/spotify.js",
    "content": "/*\n *   Copyright 2014, Uwe L. Korn <uwelk@xhochy.com>\n *   Copyright 2015, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   The MIT License (MIT)\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n *\n *   THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n *   FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n *   COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n *   IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n *   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\nvar SpotifyAuth = {\n\n    _clientId: \"q3r9p989687p496no2s92p9r84s779qp\",\n\n    _clientSecret: \"789r9n607poo4s9no6998771s969o630\",\n\n    _tokenEndPoint: \"https://accounts.spotify.com/api/token\",\n\n    _redirectUri: \"tomahawkspotifyresolver://callback\",\n\n    _storageKeyRefreshToken: \"spotify_refresh_token\",\n\n    _clientCredsTokenExpires: 0,\n\n    /**\n     * Get the access token. Refresh when it is expired.\n     */\n    getAccessToken: function (getClientCredsToken) {\n        var that = this;\n        if (that._getAccessTokenPromise\n            && new Date().getTime() + 60000 > that._accessTokenExpires) {\n            Tomahawk.log(\"Access token expired.\");\n            that._getAccessTokenPromise = null;\n        }\n        if (!that._getAccessTokenPromise) {\n            Tomahawk.log(\"Access token is not valid. We need to get a new one.\");\n            that._getAccessTokenPromise = new RSVP.Promise(function (resolve, reject) {\n                var refreshToken = Tomahawk.localStorage.getItem(that._storageKeyRefreshToken);\n                if (!refreshToken) {\n                    if (!getClientCredsToken) {\n                        reject(\"Can't fetch new access token, because there's no stored refresh\"\n                            + \" token. Are you logged in?\");\n                    } else {\n                        if (that._getClientCredsTokenPromise\n                            && new Date().getTime() + 60000 > that._clientCredsTokenExpires) {\n                            Tomahawk.log(\"ClientCreds access token expired.\");\n                            that._getClientCredsTokenPromise = null;\n                        }\n                        // User is not logged into Spotify.\n                        // We need to get a basic accessToken through the client credentials auth flow\n                        if (!that._getClientCredsTokenPromise) {\n                            Tomahawk.log(\n                                \"ClientCreds access token is not valid. We need to get a new one.\");\n                            Tomahawk.log(\"Fetching new ClientCreds access token ...\");\n                            var options = {\n                                headers: {\n                                    \"Authorization\": \"Basic \" + Tomahawk.base64Encode(\n                                        that._spell(that._clientId)\n                                        + \":\" + that._spell(that._clientSecret)),\n                                    \"Content-Type\": \"application/x-www-form-urlencoded\"\n                                },\n                                data: {\n                                    grant_type: \"client_credentials\"\n                                }\n                            };\n                            that._getClientCredsTokenPromise =\n                                Tomahawk.post(that._tokenEndPoint, options).then(\n                                    function (res) {\n                                        that._clientCredsTokenExpires =\n                                            new Date().getTime() + res.expires_in * 1000;\n                                        Tomahawk.log(\"Received new ClientCreds access token!\");\n                                        return {\n                                            accessToken: res.access_token\n                                        };\n                                    });\n                        }\n                        resolve(that._getClientCredsTokenPromise);\n                    }\n                } else {\n                    Tomahawk.log(\"Fetching new access token ...\");\n                    var settings = {\n                        headers: {\n                            \"Authorization\": \"Basic \"\n                            + Tomahawk.base64Encode(that._spell(that._clientId)\n                                + \":\" + that._spell(that._clientSecret)),\n                            \"Content-Type\": \"application/x-www-form-urlencoded\"\n                        },\n                        data: {\n                            \"grant_type\": \"refresh_token\",\n                            \"refresh_token\": refreshToken\n                        }\n                    };\n                    resolve(Tomahawk.post(that._tokenEndPoint, settings).then(function (res) {\n                        that._accessToken = res.access_token;\n                        that._accessTokenExpires = new Date().getTime() + res.expires_in * 1000;\n                        Tomahawk.log(\"Received new access token!\");\n                        return {\n                            accessToken: res.access_token\n                        };\n                    }));\n                }\n            });\n        }\n        return this._getAccessTokenPromise;\n    },\n\n    get: function (url, settings) {\n        return this.getAccessToken(true).then(function (result) {\n            settings = settings || {};\n            settings.headers = settings.headers || {};\n            settings.headers.Authorization = \"Bearer \" + result.accessToken;\n            return Tomahawk.get(url, settings);\n        })\n    },\n\n    _spell: function (a) {\n        var magic = function (b) {\n            return (b = (b) ? b : this).split(\"\").map(function (d) {\n                if (!d.match(/[A-Za-z]/)) {\n                    return d\n                }\n                var c = d.charCodeAt(0) >= 96;\n                var k = (d.toLowerCase().charCodeAt(0) - 96 + 12) % 26 + 1;\n                return String.fromCharCode(k + (c ? 96 : 64))\n            }).join(\"\")\n        };\n        return magic(a)\n    }\n\n};\n\nvar SpotifyResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'Spotify',\n        icon: 'spotify.png',\n        weight: 95,\n        timeout: 15\n    },\n\n    /**\n     * Get the access token. Refresh when it is expired.\n     */\n    getAccessToken: function () {\n        return SpotifyAuth.getAccessToken(false);\n    },\n\n    login: function () {\n        Tomahawk.log(\"Starting login\");\n\n        var authUrl = \"https://accounts.spotify.com/authorize\";\n        authUrl += \"?client_id=\" + SpotifyAuth._spell(SpotifyAuth._clientId);\n        authUrl += \"&response_type=code\";\n        authUrl += \"&redirect_uri=\" + encodeURIComponent(SpotifyAuth._redirectUri);\n        authUrl\n            += \"&scope=playlist-read-private%20streaming%20user-read-private%20user-library-read\";\n        authUrl += \"&show_dialog=true\";\n\n        var that = this;\n\n        var params = {\n            url: authUrl\n        };\n        return Tomahawk.NativeScriptJobManager.invoke(\"showWebView\", params).then(\n            function (result) {\n                var error = that._getParameterByName(result.url, \"error\");\n                if (error) {\n                    Tomahawk.log(\"Authorization failed: \" + error);\n                    return error;\n                } else {\n                    Tomahawk.log(\"Authorization successful, fetching new refresh token ...\");\n                    var settings = {\n                        headers: {\n                            \"Authorization\": \"Basic \"\n                            + Tomahawk.base64Encode(SpotifyAuth._spell(SpotifyAuth._clientId)\n                                + \":\" + SpotifyAuth._spell(SpotifyAuth._clientSecret)),\n                            \"Content-Type\": \"application/x-www-form-urlencoded\"\n                        },\n                        data: {\n                            grant_type: \"authorization_code\",\n                            code: that._getParameterByName(result.url, \"code\"),\n                            redirect_uri: SpotifyAuth._redirectUri\n                        }\n                    };\n\n                    return Tomahawk.post(SpotifyAuth._tokenEndPoint, settings)\n                        .then(function (response) {\n                            Tomahawk.localStorage.setItem(SpotifyAuth._storageKeyRefreshToken,\n                                response.refresh_token);\n                            Tomahawk.log(\"Received new refresh token!\");\n                            return TomahawkConfigTestResultType.Success;\n                        });\n                }\n            });\n    },\n\n    logout: function () {\n        Tomahawk.localStorage.removeItem(SpotifyAuth._storageKeyRefreshToken);\n        return TomahawkConfigTestResultType.Logout;\n    },\n\n    isLoggedIn: function () {\n        var refreshToken = Tomahawk.localStorage.getItem(SpotifyAuth._storageKeyRefreshToken);\n        return refreshToken !== null && refreshToken.length > 0;\n    },\n\n    /**\n     * Returns the value of the query parameter with the given name from the given URL.\n     */\n    _getParameterByName: function (url, name) {\n        name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n        var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\n            results = regex.exec(url);\n        return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n    },\n\n    init: function () {\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n    },\n\n    getStreamUrl: function (params) {\n        var url = params.url;\n\n        return {\n            url: url.replace(\"spotify://track/\", \"\")\n        };\n    },\n\n    resolve: function (params) {\n        var artist = params.artist;\n        var album = params.album;\n        var track = params.track;\n\n        var q = \"artist:\\\"\" + artist.replace('&', '') + \"\\\" track:\\\"\"\n            + track.replace('&', '') + \"\\\"\";\n        if (album) {\n            q += \" album:\\\"\" + album.replace('&', '') + \"\\\"\";\n        }\n\n        return this._search(q);\n    },\n\n    search: function (params) {\n        var query = params.query;\n\n        return this._search(query.replace('&', ''));\n    },\n\n    _search: function (query) {\n        var that = this;\n\n        var url = \"https://api.spotify.com/v1/search\";\n        var settings = {\n            data: {\n                market: \"from_token\",\n                type: \"track\",\n                q: query\n            }\n        };\n        return SpotifyAuth.get(url, settings).then(function (response) {\n            return response.tracks.items.map(function (item) {\n                var combinedArtistName = \"\";\n                for (var i = 0; i < item.artists.length; i++) {\n                    if (i != 0) {\n                        combinedArtistName += \" & \";\n                    }\n                    combinedArtistName += item.artists[i].name;\n                }\n                return {\n                    artist: combinedArtistName,\n                    album: item.album.name,\n                    duration: item.duration_ms / 1000,\n                    source: that.settings.name,\n                    track: item.name,\n                    url: \"spotify://track/\" + item.id\n                };\n            });\n        });\n    },\n\n    canParseUrl: function (params) {\n        var url = params.url;\n        var type = params.type;\n\n        if (!url) {\n            throw new Error(\"Provided url was empty or null!\");\n        }\n        switch (type) {\n            case TomahawkUrlType.Album:\n                return /spotify:album:([^:]+)/.test(url)\n                    || /https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/album\\/([^\\/\\?]+)/.test(url);\n            case TomahawkUrlType.Artist:\n                return /spotify:artist:([^:]+)/.test(url)\n                    || /https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/artist\\/([^\\/\\?]+)/.test(url);\n            case TomahawkUrlType.Playlist:\n                return /spotify:user:([^:]+):playlist:([^:]+)/.test(url)\n                    || /https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/user\\/([^\\/]+)\\/playlist\\/([^\\/\\?]+)/.test(url);\n            case TomahawkUrlType.Track:\n                return /spotify:track:([^:]+)/.test(url)\n                    || /https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/track\\/([^\\/\\?]+)/.test(url);\n            // case TomahawkUrlType.Any:\n            default:\n                return /spotify:(album|artist|track):([^:]+)/.test(url)\n                    || /https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/(album|artist|track)\\/([^\\/\\?]+)/.test(url)\n                    || /spotify:user:([^:]+):playlist:([^:]+)/.test(url)\n                    || /https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/user\\/([^\\/]+)\\/playlist\\/([^\\/\\?]+)/.test(url);\n        }\n    },\n\n    lookupUrl: function (params) {\n        var url = params.url;\n        Tomahawk.log(\"lookupUrl: \" + url);\n\n        var match = url.match(/spotify[/:]+(album|artist|track)[/:]+([^/:?]+)/);\n        if (match == null) {\n            match\n                = url.match(/https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/(album|artist|track)\\/([^\\/\\?]+)/);\n        }\n        var playlistmatch = url.match(/spotify[/:]+user[/:]+([^/:]+)[/:]+playlist[/:]+([^/:?]+)/);\n        if (playlistmatch == null) {\n            playlistmatch\n                = url.match(/https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/user\\/([^\\/]+)\\/playlist\\/([^\\/\\?]+)/);\n        }\n        var query;\n        if (match != null) {\n            if (match[1] == \"artist\") {\n                query = \"https://api.spotify.com/v1/artists/\";\n            } else if (match[1] == \"album\") {\n                query = \"https://api.spotify.com/v1/albums/\";\n            } else if (match[1] == \"track\") {\n                query = \"https://api.spotify.com/v1/tracks/\";\n            }\n            query += match[2];\n            Tomahawk.log(\"Found album/artist/track, calling \" + query);\n            return SpotifyAuth.get(query).then(function (response) {\n                if (match[1] == \"artist\") {\n                    Tomahawk.log(\"Reported found artist '\" + response.name + \"'\");\n                    return {\n                        type: Tomahawk.UrlType.Artist,\n                        artist: response.name\n                    };\n                } else if (match[1] == \"album\") {\n                    Tomahawk.log(\"Reported found album '\" + response.name + \"' by '\"\n                        + response.artists[0].name + \"'\");\n                    return {\n                        type: Tomahawk.UrlType.Album,\n                        album: response.name,\n                        artist: response.artists[0].name\n                    };\n                } else if (match[1] == \"track\") {\n                    Tomahawk.log(\"Reported found track '\" + response.name + \"' by '\"\n                        + response.artists[0].name + \"'\");\n                    return {\n                        type: Tomahawk.UrlType.Track,\n                        track: response.name,\n                        artist: response.artists[0].name,\n                        album: response.album.name\n                    };\n                }\n            });\n        } else if (playlistmatch != null) {\n            query = 'https://api.spotify.com/v1/users/' + playlistmatch[1]\n                + '/playlists/' + playlistmatch[2];\n            Tomahawk.log(\"Found playlist, calling url: '\" + query + \"'\");\n            return this._fetchPlaylist(query);\n        }\n    },\n\n    _fetchPlaylist: function (url) {\n        var that = this;\n        return SpotifyAuth.get(url).then(function (res) {\n            return that._fetchPlaylistTracks(res, []).then(function (tracks) {\n                Tomahawk.log(\"Reported found playlist '\" + res.name + \"' containing \"\n                    + tracks.length + \" tracks\");\n                return {\n                    type: Tomahawk.UrlType.Playlist,\n                    title: res.name,\n                    guid: \"spotify-playlist-\" + url,\n                    info: \"A playlist on Spotify.\",\n                    creator: res.owner.uri,\n                    linkUrl: res.external_urls.spotify,\n                    tracks: tracks\n                };\n            });\n        });\n    },\n\n    _fetchPlaylistTracks: function (response, tracks) {\n        var that = this;\n        var firstBatch = !response.items;\n        var items = firstBatch ? response.tracks.items : response.items;\n        var newTracks = items.map(function (item) {\n            return {\n                type: Tomahawk.UrlType.Track,\n                track: item.track.name,\n                artist: item.track.artists[0].name,\n                album: item.track.album.name\n            };\n        });\n        tracks = tracks.concat(newTracks);\n        Tomahawk.log(\"Parsed so far: \" + tracks.length + \" tracks\");\n        var nextUrl = firstBatch ? response.tracks.next : response.next;\n        if (!nextUrl) {\n            Tomahawk.log(\"Done parsing playlist tracks.\");\n            return RSVP.resolve(tracks);\n        } else {\n            Tomahawk.log(\"Getting next batch of playlist tracks: \" + nextUrl);\n            return SpotifyAuth.get(nextUrl).then(function (res) {\n                return that._fetchPlaylistTracks(res, tracks);\n            });\n        }\n    }\n});\n\nTomahawk.resolver.instance = SpotifyResolver;\n\nTomahawk.PluginManager.registerPlugin('chartsProvider', {\n\n    _baseUrl: \"https://spotifycharts.com/\",\n\n    countryCodes: {\n        defaultCode: \"global\",\n        codes: [\n            {\"Global\": \"global\"},\n            {\"United States\": \"us\"},\n            {\"United Kingdom\": \"gb\"},\n            {\"Andorra\": \"ad\"},\n            {\"Argentina\": \"ar\"},\n            {\"Australia\": \"au\"},\n            {\"Austria\": \"at\"},\n            {\"Belgium\": \"be\"},\n            {\"Bolivia\": \"bo\"},\n            {\"Brazil\": \"br\"},\n            {\"Bulgaria\": \"bg\"},\n            {\"Canada\": \"ca\"},\n            {\"Chile\": \"cl\"},\n            {\"Colombia\": \"co\"},\n            {\"Costa Rica\": \"cr\"},\n            {\"Cyprus\": \"cy\"},\n            {\"Czech Republic\": \"cz\"},\n            {\"Denmark\": \"dk\"},\n            {\"Dominican Republic\": \"do\"},\n            {\"Ecuador\": \"ec\"},\n            {\"El Salvador\": \"sv\"},\n            {\"Estonia\": \"ee\"},\n            {\"Finland\": \"fi\"},\n            {\"France\": \"fr\"},\n            {\"Germany\": \"de\"},\n            {\"Greece\": \"gr\"},\n            {\"Guatemala\": \"gt\"},\n            {\"Honduras\": \"hn\"},\n            {\"Hong Kong\": \"hk\"},\n            {\"Hungary\": \"hu\"},\n            {\"Iceland\": \"is\"},\n            {\"Ireland\": \"ie\"},\n            {\"Italy\": \"it\"},\n            {\"Latvia\": \"lv\"},\n            {\"Lithuania\": \"lt\"},\n            {\"Luxembourg\": \"lu\"},\n            {\"Malaysia\": \"my\"},\n            {\"Malta\": \"mt\"},\n            {\"Mexico\": \"mx\"},\n            {\"Netherlands\": \"nl\"},\n            {\"New Zealand\": \"nz\"},\n            {\"Nicaragua\": \"ni\"},\n            {\"Norway\": \"no\"},\n            {\"Panama\": \"pa\"},\n            {\"Paraguay\": \"py\"},\n            {\"Peru\": \"pe\"},\n            {\"Philippines\": \"ph\"},\n            {\"Poland\": \"pl\"},\n            {\"Portugal\": \"pt\"},\n            {\"Singapore\": \"sg\"},\n            {\"Slovakia\": \"sk\"},\n            {\"Spain\": \"es\"},\n            {\"Sweden\": \"se\"},\n            {\"Switzerland\": \"ch\"},\n            {\"Taiwan\": \"tw\"},\n            {\"Turkey\": \"tr\"},\n            {\"Uruguay\": \"uy\"}\n        ]\n    },\n\n    types: [\n        {\"Top 200\": \"regional\"},\n        {\"Viral 50\": \"viral\"}\n    ],\n\n    /**\n     * Get the charts from the server specified by the given params map and parse them into the\n     * correct result format.\n     *\n     * @param params A map containing all of the necessary parameters describing the charts which to\n     *               get from the server.\n     *\n     *               Example:\n     *               { countryCode: \"us\",                //country code from the countryCodes map\n     *                 type: \"regional\" }                //type from the types map\n     *\n     * @returns A map consisting of the contentType and parsed results.\n     *\n     *          Example:\n     *          { contentType: Tomahawk.UrlType.Track,\n     *            results: [\n     *              { track: \"We will rock you\",\n     *                artist: \"Queen\",\n     *                album: \"Greatest Hits\" },\n     *              { track: \"Bohemian rhapsody\",\n     *                artist: \"Queen\",\n     *                album: \"Greatest Hits\" }\n     *            ]\n     *          }\n     *\n     */\n    charts: function (params) {\n        var url = this._baseUrl + params.type + \"/\" + params.countryCode + \"/daily/latest/download\";\n        return Tomahawk.get(url).then(function (response) {\n            var rows = response.split(\"\\n\");\n            var parsedResults = [];\n            for (var i = 1; i < rows.length; i++) {\n                if (rows[i]) {\n                    var columns = rows[i].split(\",\");\n                    if (columns && columns.length > 2) {\n                        parsedResults.push({\n                            track: columns[1].replace(/(^\")|(\"$)/g, \"\"),\n                            artist: columns[2].replace(/(^\")|(\"$)/g, \"\"),\n                            album: \"\"\n                        });\n                    }\n                }\n            }\n            return {\n                contentType: Tomahawk.UrlType.Track,\n                results: parsedResults\n            };\n        });\n    }\n\n});\n\nTomahawk.PluginManager.registerPlugin('playlistGenerator', {\n\n    _sessions: {},\n\n    /**\n     * Fetch all available genres from the Spotify API\n     */\n    _genres: function () {\n        var that = this;\n        if (!that._genrePromise) {\n            var url = \"https://api.spotify.com/v1/recommendations/available-genre-seeds\";\n            that._genrePromise = SpotifyAuth.get(url).then(function (response) {\n                return response.genres;\n            });\n        }\n        return that._genrePromise;\n    },\n\n    /**\n     * Searches the source for available playlist seeds like artists or songs. The results from this\n     * function are later being used as a seed to fill the playlist with tracks.\n     *\n     * @param params Example: {  query: \"Queen rock you\"  }\n     *\n     * @returns Example: {   artists: [ { artist: 'Queen', id: '123' },\n     *                                  { artist: 'Queens', id: '124' } ],\n     *                       albums:  [ { artist: 'Queen', album: 'Greatest Hits', id: '125' } ],\n     *                       tracks:  [ { artist: 'Queen', track: 'We will rock you', id: '126' } ],\n     *                       genres:  [ { name: 'Rock' },\n     *                                  { name: 'Alternative Rock' } ],\n     *                       moods:   [ { name: 'Happy' } ]   }\n     */\n    search: function (params) {\n        var that = this;\n        var promises = [];\n        var url = \"https://api.spotify.com/v1/search\";\n        var settings = {\n            data: {\n                type: \"track,artist\",\n                q: params.query\n            }\n        };\n        promises.push(SpotifyAuth.get(url, settings).then(function (response) {\n            return {\n                artists: response.artists.items.map(function (item) {\n                    return {\n                        artist: item.name,\n                        id: item.id\n                    };\n                }),\n                tracks: response.tracks.items.map(function (item) {\n                    return {\n                        artist: item.artists[0].name,\n                        album: item.album.name,\n                        track: item.name,\n                        id: item.id\n                    };\n                })\n            };\n        }));\n        promises.push(that._genres().then(function (allGenres) {\n            // Search for genres by manually iterating through all available genres\n            return {\n                genres: allGenres.filter(function (item) {\n                    return item.toLowerCase().indexOf(params.query.toLowerCase()) > -1;\n                }).map(function (item) {\n                    return {\n                        name: item\n                    };\n                })\n            };\n        }));\n        return RSVP.all(promises).then(function (results) {\n            return {\n                artists: results[0].artists,\n                albums: [],\n                tracks: results[0].tracks,\n                genres: results[1].genres,\n                moods: []\n            };\n        });\n    },\n\n    /**\n     * Converts the given params to the format the Spotify API expects. If an artist or track\n     * doesn't yet have an id, fetch the id automagically.\n     */\n    _buildSettingsData: function (params) {\n        var that = this;\n\n        var artistIds = [];\n        var trackIds = [];\n        var genreIds = [];\n        var promises = [];\n        if (params.artists) {\n            for (var i = 0; i < params.artists.length; i++) {\n                var artist = params.artists[i];\n                if (artist.id) {\n                    artistIds.push(artist.id);\n                } else if (artist.artist) {\n                    // No artist id provided, so we have to search for it\n                    var queryParams1 = {\n                        query: artist.artist\n                    };\n                    promises.push(this.search(queryParams1).then(function (result) {\n                            if (result.artists && result.artists.length > 0) {\n                                // Let's use the first result\n                                Tomahawk.log(\"Resolved artist to id: \" + result.artists[0].id);\n                                artistIds.push(result.artists[0].id);\n                            } else {\n                                var parts = queryParams1.query.split(\"&\");\n                                if (parts && parts.length > 0) {\n                                    queryParams1.query = parts[0];\n                                    return that.search(queryParams1).then(function (result) {\n                                        if (result.artists && result.artists.length > 0) {\n                                            // Let's use the first result\n                                            Tomahawk.log(\"Resolved partial artist to id: \"\n                                                + result.artists[0].id);\n                                            artistIds.push(result.artists[0].id);\n                                        }\n                                    });\n                                }\n                            }\n                        }\n                    ));\n                }\n            }\n        } else if (params.tracks) {\n            for (var i = 0; i < params.tracks.length; i++) {\n                var track = params.tracks[i];\n                if (track.id) {\n                    trackIds.push(track.id);\n                } else if (track.track && track.artist) {\n                    // No artist id provided, so we have to search for it\n                    var queryParams = {\n                        query: \"track:\" + track.track + \" artist:\" + track.artist\n                    };\n                    promises.push(this.search(queryParams).then(function (result) {\n                        if (result.tracks && result.tracks.length > 0) {\n                            // Let's use the first result\n                            Tomahawk.log(\"Resolved track to id: \" + result.tracks[0].id);\n                            trackIds.push(result.tracks[0].id);\n                        }\n                    }));\n                }\n            }\n        } else if (params.genres) {\n            genreIds = params.genres.map(function (item) {\n                return item.name;\n            });\n        }\n        return RSVP.all(promises).then(function () {\n            var result = {\n                limit: 100\n            };\n            if (artistIds.length > 0) {\n                result.seed_artists = artistIds.join(',');\n            }\n            if (trackIds.length > 0) {\n                result.seed_tracks = trackIds.join(',');\n            }\n            if (genreIds.length > 0) {\n                result.seed_genres = genreIds.join(',');\n            }\n            return result;\n        });\n    },\n\n    /**\n     * This function requests a new set of tracks from the Spotify API based on the\n     * artists/tracks/genres seeds that are given in the params object.\n     *\n     * @param params\n     *               Using params from a previous session:\n     *               Example: {   sessionId: \"12476294\"  }\n     *\n     *               Using params to create a new session:\n     *               Example: {   artists: [ { artist: 'Queen', id: '123' },\n     *                                       { artist: 'Queens', id: '124' } ],\n     *                            tracks:  [ { artist: 'Queen', track: 'We will rock you', id: '126' } ],\n     *                            genres:  [ { name: 'Rock' },\n     *                                       { name: 'Alternative Rock' } ]   }\n     *\n     * @returns Example: {   sessionId: \"124252622\",  // this id should be used in subsequent calls\n     *                       results: [\n     *                                  { artist: 'Queen',\n     *                                    track: 'We will rock you',\n     *                                    album: 'Greatest Hits' }\n     *                                  { artist: 'Queen',\n     *                                    track: 'We won't rock you',\n     *                                    album: 'Crappiest Hits' }\n     *                                ]\n     *                   }\n     */\n    fillPlaylist: function (params) {\n        var that = this;\n        var settingsDataPromise;\n        if (params.sessionId && that._sessions[params.sessionId]) {\n            // We can use the cached settingsData from the previous call\n            settingsDataPromise = RSVP.resolve(that._sessions[params.sessionId]);\n        } else {\n            // No cached settingsData available\n            settingsDataPromise = that._buildSettingsData(params);\n        }\n        return settingsDataPromise.then(function (settingsData) {\n            var sessionId = params.sessionId;\n            if (!sessionId) {\n                sessionId = new Date().getTime();\n            }\n            // Cache the settingsData\n            that._sessions[sessionId] = settingsData;\n\n            var url = \"https://api.spotify.com/v1/recommendations\";\n            var settings = {\n                data: settingsData\n            };\n            return SpotifyAuth.get(url, settings).then(function (response) {\n                var results = [];\n                if (response.tracks) {\n                    results = response.tracks.map(function (item) {\n                        return {\n                            artist: item.artists[0].name,\n                            album: item.album.name,\n                            track: item.name\n                        };\n                    });\n                } else {\n                    throw new Error(\"Sorry, artist/track not available.\");\n                }\n                Tomahawk.log(\"Filled playlist with sessionId: \" + sessionId\n                    + \", resultCount: \" + results.length);\n                return {\n                    sessionId: sessionId,\n                    results: results\n                };\n            });\n        });\n    }\n\n});\n\n"
  },
  {
    "path": "spotify/content/metadata.json",
    "content": "{\n    \"name\": \"Spotify\",\n    \"pluginName\": \"spotify\",\n    \"author\": \"Uwe L. Korn, Enno Gottschalk\",\n    \"email\": \"uwelk@xhochy.com\",\n    \"version\": \"0.4.4\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Stream music from Spotify. Requires a Premium account.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/spotify.js\",\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"scripts\": [],\n        \"resources\": [\n            \"contents/code/config.ui\",\n            \"contents/code/spotify.png\"\n        ]\n    },\n     \"staticCapabilities\": [\n         \"configTestable\"\n     ]\n}\n"
  },
  {
    "path": "spotify/native/CMakeLists.txt",
    "content": "project( spotify-native )\ncmake_minimum_required( VERSION 2.8.6 )\nset( CMAKE_MODULE_PATH  \"${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules\" )\n\nfind_package(Microhttpd REQUIRED)\nfind_package(Spotify REQUIRED)\n\ninclude(CheckCXXCompilerFlag)\ncheck_cxx_compiler_flag( \"-std=c++11\" CXX11_FOUND )\ncheck_cxx_compiler_flag( \"-std=c++0x\" CXX0X_FOUND )\ncheck_cxx_compiler_flag( \"-stdlib=libc++\" LIBCPP_FOUND )\nif(CXX11_FOUND)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=c++11\")\nelseif(CXX0X_FOUND)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=c++0x\")\nelse()\n    message(FATAL_ERROR \"${CMAKE_CXX_COMPILER} does not support C++11, please\n    use a different compiler\")\nendif()\nif(LIBCPP_FOUND AND APPLE)\n    set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -stdlib=libc++\")\nendif()\n\n# We want as many as possible warnings\nset( CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall -Wextra\")\n\ninclude_directories(\n    ${MICROHTTPD_INCLUDE_DIR}\n)\n\n# Define the \"resolver\" target\nadd_executable( spotify_native_bin\n    main.cpp\n)\ntarget_link_libraries( spotify_native_bin\n    ${MICROHTTPD_LIBRARY}\n)\nset_target_properties( spotify_native_bin\n    PROPERTIES\n        RUNTIME_OUTPUT_NAME spotify-native${SPOTIFY_NATIVE_SUFFIX}\n)\n"
  },
  {
    "path": "spotify/native/CMakeModules/FindMicrohttpd.cmake",
    "content": "find_package(PkgConfig)\npkg_check_modules(PC_MICROHTTPD libmicrohttpd)\n\nfind_path(MICROHTTPD_INCLUDE_DIR microhttpd.h\n    HINTS\n        ${PC_MICROHTTPD_INCLUDEDIR}\n        ${PC_MICROHTTPD_INCLUDE_DIRS}\n)\n\nfind_library(MICROHTTPD_LIBRARY NAMES microhttpd\n    HINTS\n    ${PC_MICROHTTPD_LIBDIR}\n    ${PC_MICROHTTPD_LIBRARY_DIRS}\n)\n\nset(MICROHTTPD_VERSION ${PC_MICROHTTPD_VERSION})\n\nfind_package_handle_standard_args(Microhttpd\n    REQUIRED_VARS MICROHTTPD_INCLUDE_DIR MICROHTTPD_LIBRARY\n    VERSION_VAR MICROHTTPD_VERSION\n)\n\n"
  },
  {
    "path": "spotify/native/CMakeModules/FindSpotify.cmake",
    "content": "find_package(PkgConfig)\npkg_check_modules(PC_SPOTIFY libspotify)\n\nfind_path(SPOTIFY_INCLUDE_DIR libspotify/api.h\n    HINTS\n        ${PC_SPOTIFY_INCLUDEDIR}\n        ${PC_SPOTIFY_INCLUDE_DIRS}\n)\n\nfind_library(SPOTIFY_LIBRARY NAMES spotify\n    HINTS\n    ${PC_SPOTIFY_LIBDIR}\n    ${PC_SPOTIFY_LIBRARY_DIRS}\n)\n\nset(SPOTIFY_VERSION ${PC_SPOTIFY_VERSION})\n\nfind_package_handle_standard_args(Spotify\n  REQUIRED_VARS SPOTIFY_INCLUDE_DIR SPOTIFY_LIBRARY\n  VERSION_VAR SPOTIFY_VERSION\n)\n\n"
  },
  {
    "path": "spotify/native/main.cpp",
    "content": "/*\n *   Copyright 2014, Uwe L. Korn <uwelk@xhochy.com>\n *\n *   The MIT License (MIT)\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n *\n *   THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n *   FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n *   COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n *   IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n *   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#include <microhttpd.h>\n\n#include <cstring>\n#include <iostream>\n#include <mutex>\n\n// Typedef the pointers for better readability.\ntypedef struct MHD_Connection* connection_ptr;\ntypedef struct MHD_Daemon* daemon_ptr;\ntypedef struct MHD_Response* response_ptr ;\n\nstd::mutex exit_mutex;\n\nint handle_exit(const connection_ptr connection)\n{\n    // Shutdown requested, unlock the relevant mutex.\n    response_ptr response = MHD_create_response_from_data( strlen( \"OK\" ), (void*)\"OK\", MHD_NO, MHD_NO );\n    int ret = MHD_queue_response( connection, MHD_HTTP_OK, response );\n    MHD_destroy_response( response );\n    // FIXME: Add a settle time so that we can actually send the response.\n    exit_mutex.unlock();\n    return ret;\n}\n\nstatic int ahc_echo( void* /*cls*/, connection_ptr connection, const char* url,\n                     const char* method, const char* /*version*/, const char* /*upload_data*/,\n                     size_t* upload_data_size, void** ptr)\n{\n    static int header_test;\n\n    // We only expect GET requests.\n    if ( strcmp( method, \"GET\" ) )\n    {\n        return MHD_NO;\n    }\n\n    // On the first call only the headers are valid. Reply in the second round.\n    if ( &header_test != *ptr )\n    {\n        *ptr = &header_test;\n        return MHD_YES;\n    }\n\n    // There should be no data uploaded in the GET request.\n    if ( *upload_data_size )\n    {\n        return MHD_NO;\n    }\n\n    int ret;\n    if ( !strcmp( url, \"/exit\" ) )\n    {\n        ret = handle_exit(connection);\n    }\n    else\n    {\n        response_ptr response = MHD_create_response_from_data( strlen(url), (void*)url, MHD_NO, MHD_NO );\n        ret = MHD_queue_response( connection, MHD_HTTP_OK, response );\n        MHD_destroy_response( response );\n    }\n\n    return ret;\n}\n\nint main( int argc, char* argv[] )\n{\n    // TODO: Kill all other instances on startup.\n\n    if ( argc != 2 ) {\n        std::cout << \"Usage:\" << std::endl;\n        std::cout << \"\\t\" << argv[0] << \" <port>\" << std::endl;\n        return EXIT_FAILURE;\n    }\n\n    daemon_ptr daemon = MHD_start_daemon( MHD_USE_THREAD_PER_CONNECTION,\n                                          atoi(argv[1]), nullptr, nullptr,\n                                          &ahc_echo, nullptr, MHD_OPTION_END);\n    if ( daemon == nullptr )\n    {\n        return EXIT_FAILURE;\n    }\n\n    // Lock mutex twice. The second call will hang until we receive an unlock\n    // command from a different. This will initiate the shutdown process.\n    exit_mutex.lock();\n    exit_mutex.lock();\n\n    // (void) getc ();\n\n    MHD_stop_daemon(daemon);\n\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "spotify-metadata/content/contents/code/spotify-metadata.js",
    "content": "/*\n *   Copyright 2013, Uwe L. Korn <uwelk@xhochy.com>\n *   Copyright 2016, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n\nvar SpotifyMetadataResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'Spotify Metadata',\n        icon: 'spotify-metadata.png',\n        weight: 0, // We cannot resolve, so use minimum weight\n        timeout: 15\n    },\n\n\tinit: function() {\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n\t},\n\n    canParseUrl: function (params) {\n        var url = params.url;\n        var type = params.type;\n\n        if (!url) {\n            throw new Error(\"Provided url was empty or null!\");\n        }\n        switch (type) {\n            case TomahawkUrlType.Album:\n                return /spotify:album:([^:]+)/.test(url)\n                    || /https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/album\\/([^\\/\\?]+)/.test(url);\n            case TomahawkUrlType.Artist:\n                return /spotify:artist:([^:]+)/.test(url)\n                    || /https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/artist\\/([^\\/\\?]+)/.test(url);\n            case TomahawkUrlType.Playlist:\n                return /spotify:user:([^:]+):playlist:([^:]+)/.test(url)\n                    || /https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/user\\/([^\\/]+)\\/playlist\\/([^\\/\\?]+)/.test(url);\n            case TomahawkUrlType.Track:\n                return /spotify:track:([^:]+)/.test(url)\n                    || /https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/track\\/([^\\/\\?]+)/.test(url);\n            // case TomahawkUrlType.Any:\n            default:\n                return /spotify:(album|artist|track):([^:]+)/.test(url)\n                    || /https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/(album|artist|track)\\/([^\\/\\?]+)/.test(url)\n                    || /spotify:user:([^:]+):playlist:([^:]+)/.test(url)\n                    || /https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/user\\/([^\\/]+)\\/playlist\\/([^\\/\\?]+)/.test(url);\n        }\n    },\n\n    lookupUrl: function (params) {\n        var url = params.url;\n        Tomahawk.log(\"lookupUrl: \" + url);\n\n        var match = url.match(/spotify[/:]+(album|artist|track)[/:]+([^/:?]+)/);\n        if (match == null) {\n            match\n                = url.match(/https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/(album|artist|track)\\/([^\\/\\?]+)/);\n        }\n        var playlistmatch = url.match(/spotify[/:]+user[/:]+([^/:]+)[/:]+playlist[/:]+([^/:?]+)/);\n        if (playlistmatch == null) {\n            playlistmatch\n                = url.match(/https?:\\/\\/(?:play|open)\\.spotify\\.[^\\/]+\\/user\\/([^\\/]+)\\/playlist\\/([^\\/\\?]+)/);\n        }\n        if (match != null) {\n            var query = 'https://ws.spotify.com/lookup/1/.json?uri=spotify:' + match[1] + ':'\n                + match[2];\n            Tomahawk.log(\"Found album/artist/track, calling \" + query);\n            return Tomahawk.get(query).then(function (response) {\n                if (match[1] == \"artist\") {\n                    Tomahawk.log(\"Reported found artist '\" + response.artist.name + \"'\");\n                    return {\n                        type: Tomahawk.UrlType.Artist,\n                        artist: response.artist.name\n                    };\n                } else if (match[1] == \"album\") {\n                    Tomahawk.log(\"Reported found album '\" + response.album.name + \"' by '\"\n                        + response.album.artist + \"'\");\n                    return {\n                        type: Tomahawk.UrlType.Album,\n                        album: response.album.name,\n                        artist: response.album.artist\n                    };\n                } else if (match[1] == \"track\") {\n                    var artist = response.track.artists.map(function (item) {\n                        return item.name;\n                    }).join(\" & \");\n                    Tomahawk.log(\"Reported found track '\" + response.track.name + \"' by '\" + artist\n                        + \"'\");\n                    return {\n                        type: Tomahawk.UrlType.Track,\n                        track: response.track.name,\n                        artist: artist\n                    };\n                }\n            });\n        } else if (playlistmatch != null) {\n            var query = 'http://spotikea.tomahawk-player.org/browse/spotify:user:'\n                + playlistmatch[1] + ':playlist:' + playlistmatch[2];\n            Tomahawk.log(\"Found playlist, calling url: '\" + query + \"'\");\n            return Tomahawk.get(query).then(function (res) {\n                var tracks = res.playlist.result.map(function (item) {\n                    return {\n                        type: Tomahawk.UrlType.Track,\n                        track: item.title,\n                        artist: item.artist\n                    };\n                });\n                Tomahawk.log(\"Reported found playlist '\" + res.playlist.name + \"' containing \"\n                    + tracks.length + \" tracks\");\n                return {\n                    type: Tomahawk.UrlType.Playlist,\n                    title: res.playlist.name,\n                    guid: \"spotify-playlist-\" + url,\n                    info: \"A playlist on Spotify.\",\n                    creator: res.playlist.creator,\n                    linkUrl: url,\n                    tracks: tracks\n                };\n            });\n        }\n    }\n});\n\nTomahawk.resolver.instance = SpotifyMetadataResolver;\n\n"
  },
  {
    "path": "spotify-metadata/content/metadata.json",
    "content": "{\n    \"name\": \"Spotify Metadata\",\n    \"pluginName\": \"spotify-metadata\",\n    \"author\": \"Uwe L. Korn, Enno Gottschalk\",\n    \"email\": \"uwelk@xhochy.com\",\n    \"version\": \"0.1.3\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Supports drag and drop of Spotify artist and track URLs (no Spotify account required)\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/spotify-metadata.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/spotify-metadata.png\"\n        ]\n    }\n}\n"
  },
  {
    "path": "subsonic/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>331</width>\n    <height>250</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>331</width>\n    <height>250</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <widget class=\"QLabel\" name=\"subsonic_label\">\n     <property name=\"pixmap\">\n      <pixmap>subsonic.png</pixmap>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>40</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"label\">\n     <property name=\"text\">\n      <string>Requires at least Subsonic version 4.7</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::ExpandingFieldsGrow</enum>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_3\">\n       <property name=\"text\">\n        <string>Server URL</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"subsonic_url_edit\"/>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Username:</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"user_edit\"/>\n     </item>\n     <item row=\"2\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Password:</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"password_edit\">\n       <property name=\"echoMode\">\n        <enum>QLineEdit::Password</enum>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "subsonic/content/contents/code/subsonic.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2012, mack-t <no_register_no_volatile@ymail.com>\n *   Copyright 2012, Peter Loron <peterl@standingwave.org>\n *   Copyright 2013, Teo Mrnjavac <teo@kde.org>\n *   Copyright 2014, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU General Public License as published by\n *   the Free Software Foundation, either version 3 of the License, or\n *   (at your option) any later version.\n *\n *   Tomahawk is distributed in the hope that it will be useful,\n *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n *   GNU General Public License for more details.\n *\n *   You should have received a copy of the GNU General Public License\n *   along with Tomahawk. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar SubsonicResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'Subsonic',\n        icon: 'subsonic-icon.png',\n        weight: 70,\n        timeout: 8\n    },\n\n    _subsonicApiVersion: \"1.8.0\",\n\n    getConfigUi: function () {\n        var uiData = Tomahawk.readBase64(\"config.ui\");\n        return {\n            \"widget\": uiData,\n            fields: [{\n                name: \"subsonic_url\",\n                widget: \"subsonic_url_edit\",\n                property: \"text\"\n            }, {\n                name: \"user\",\n                widget: \"user_edit\",\n                property: \"text\"\n            }, {\n                name: \"password\",\n                widget: \"password_edit\",\n                property: \"text\"\n            }],\n            images: [{\n                \"subsonic.png\": Tomahawk.readBase64(\"subsonic.png\")\n            }]\n        };\n    },\n\n    /**\n     * Defines this Resolver's config dialog UI.\n     */\n    configUi: [\n        {\n            type: \"textview\",\n            text: \"Requires at least Subsonic version 4.7\"\n        },\n        {\n            id: \"subsonic_url\",\n            type: \"textfield\",\n            label: \"Server URL\",\n            defaultValue: \"http://localhost:4040/\"\n        },\n        {\n            id: \"user\",\n            type: \"textfield\",\n            label: \"Username\"\n        },\n        {\n            id: \"password\",\n            type: \"textfield\",\n            label: \"Password\",\n            isPassword: true\n        }\n    ],\n\n    newConfigSaved: function (newConfig) {\n        Tomahawk.log(\"newConfigSaved User: \" + newConfig.user);\n\n        if (this.user !== newConfig.user ||\n            this.password !== newConfig.password ||\n            this.subsonic_url !== newConfig.subsonic_url) {\n            Tomahawk.log(\"Invalidating cache\");\n            var that = this;\n            subsonicCollection.wipe({id: subsonicCollection.settings.id}).then(function () {\n                window.localStorage.removeItem(\"subsonic_last_cache_update\");\n                that.init();\n            });\n        }\n    },\n\n    _hexEncode: function (string) {\n        var hex_slice;\n        var hex_string = \"\";\n        var padding = [\"\", \"0\", \"00\"];\n        for (var pos = 0; pos < string.length; hex_string += hex_slice) {\n            hex_slice = string.charCodeAt(pos++).toString(16);\n            hex_slice = hex_slice.length < 2 ? (padding[2 - hex_slice.length] + hex_slice)\n                : hex_slice;\n        }\n        return \"enc:\" + hex_string;\n    },\n\n    init: function () {\n        var userConfig = this._sanitizeConfig(this.getUserConfig());\n        if (!userConfig.user || !userConfig.password) {\n            Tomahawk.log(\"Subsonic Resolver not properly configured!\");\n            return;\n        }\n\n        this.user = userConfig.user;\n        this.user = this.user.trim();\n        this.password = this._hexEncode(userConfig.password);\n        this.subsonic_url = userConfig.subsonic_url || \"\";\n\n        Tomahawk.log(\"Subsonic resolver initalized, got credentials from config. user: \"\n            + this.user + \", subsonic_url: \" + this.subsonic_url);\n\n        this._ensureCollection();\n    },\n\n    _sanitizeConfig: function (config) {\n        if (!config.subsonic_url) {\n            config.subsonic_url = \"http://localhost:4040/\";\n        } else {\n            if (config.subsonic_url.search(\"^.*:\\/\\/\") < 0) {\n                // couldn't find a proper protocol, so we default to \"http://\"\n                config.subsonic_url = \"http://\" + config.subsonic_url;\n            }\n            var url = new URL(config.subsonic_url);\n            if (!url.port) {\n                url.port = 4040;\n            }\n            config.subsonic_url = url.toString();\n        }\n\n        return config;\n    },\n\n    _buildStreamUrl: function (id) {\n        return this.subsonic_url + \"/rest/stream.view\" +\n            \"?u=\" + this.user +\n            \"&p=\" + this.password +\n            \"&v=\" + this._subsonicApiVersion +\n            \"&c=tomahawk\" +\n            \"&f=json\" +\n            \"&id=\" + id;\n    },\n\n    _convertTracks: function (results) {\n        var tracks = [];\n        for (var i = 0; results && i < results.length; i++) {\n            var result = results[i];\n            if (!result.isDir && !result.isVideo && result.type == \"music\") {\n                tracks.push({\n                    artist: result.artist,\n                    album: result.album,\n                    track: result.title,\n                    albumpos: result.track,\n                    source: this.settings.name,\n                    size: result.size,\n                    duration: result.duration,\n                    bitrate: result.bitRate,\n                    url: this._buildStreamUrl(result.id),\n                    extension: result.suffix,\n                    year: result.year\n                });\n            }\n        }\n        return tracks;\n    },\n\n    _ensureCollection: function () {\n        var that = this;\n\n        return subsonicCollection.revision({\n            id: subsonicCollection.settings.id\n        }).then(function (result) {\n            var lastCollectionUpdate = window.localStorage[\"subsonic_last_collection_update\"];\n            if (lastCollectionUpdate && lastCollectionUpdate == result) {\n                Tomahawk.log(\"Collection database has not been changed since last time.\");\n                var ifModifiedSince;\n                if (window.localStorage[\"subsonic_last_cache_update\"]) {\n                    ifModifiedSince = window.localStorage[\"subsonic_last_cache_update\"];\n                }\n                return that._fetchAndStoreCollection(ifModifiedSince);\n            } else {\n                Tomahawk.log(\"Collection database has been changed. Wiping and re-fetching...\");\n                return subsonicCollection.wipe({\n                    id: subsonicCollection.settings.id\n                }).then(function () {\n                    return that._fetchAndStoreCollection();\n                });\n            }\n        });\n    },\n\n    _fetchAndStoreCollection: function (ifModifiedSince) {\n        var that = this;\n\n        if (!this._requestPromise) {\n            Tomahawk.log(\"Checking if collection needs to be updated\");\n            var time = Date.now();\n\n            var url = this.subsonic_url + \"/rest/getIndexes.view\";\n            var settings = {\n                data: {\n                    c: \"tomahawk\",\n                    f: \"json\",\n                    p: this.password,\n                    u: this.user,\n                    v: this._subsonicApiVersion\n                }\n            };\n            if (ifModifiedSince) {\n                settings.data.ifModifiedSince = ifModifiedSince;\n            }\n            this._requestPromise = Tomahawk.get(url, settings).then(function (response) {\n                Tomahawk.PluginManager.registerPlugin(\"collection\", subsonicCollection);\n                var artists = response[\"subsonic-response\"].indexes;\n                if (artists) {\n                    Tomahawk.log(\"Collection needs to be updated\");\n\n                    var promises = [];\n                    for (var i = 0; i < artists.index.length; i++) {\n                        var directoryId = artists.index[i].artist[0].id;\n                        var url = that.subsonic_url + \"/rest/getMusicDirectory.view\";\n                        var settings = {\n                            data: {\n                                c: \"tomahawk\",\n                                f: \"json\",\n                                p: that.password,\n                                u: that.user,\n                                v: that._subsonicApiVersion,\n                                id: directoryId\n                            }\n                        };\n                        var promise = Tomahawk.get(url, settings).then(function (response) {\n                            return that._convertTracks(\n                                response[\"subsonic-response\"].directory.child);\n                        });\n                        promises.push(promise);\n                    }\n\n                    RSVP.all(promises).then(function (tracksList) {\n                        var tracks = [];\n                        for (var i = 0; i < tracksList.length; i++) {\n                            tracks = tracks.concat(tracksList[i]);\n                        }\n                        subsonicCollection.addTracks({\n                            id: subsonicCollection.settings.id,\n                            tracks: tracks\n                        }).then(function (newRevision) {\n                            Tomahawk.log(\"Updated cache in \" + (Date.now() - time) + \"ms\");\n                            window.localStorage[\"subsonic_last_cache_update\"]\n                                = response[\"subsonic-response\"].indexes.lastModified;\n                            window.localStorage[\"subsonic_last_collection_update\"] = newRevision;\n                        });\n                    });\n                } else {\n                    Tomahawk.log(\"Collection doesn't need to be updated\");\n                    subsonicCollection.addTracks({\n                        id: subsonicCollection.settings.id,\n                        tracks: []\n                    });\n                }\n            }, function (xhr) {\n                Tomahawk.log(\"Tomahawk.get failed: \" + xhr.status + \" - \"\n                    + xhr.statusText + \" - \" + xhr.responseText);\n            }).finally(function () {\n                that._requestPromise = undefined;\n            });\n        }\n        return this._requestPromise;\n    },\n\n    testConfig: function (config) {\n        config = this._sanitizeConfig(config);\n        var url = config.subsonic_url + \"/rest/ping.view\";\n        var settings = {\n            data: {\n                u: config.user,\n                p: config.password,\n                v: this._subsonicApiVersion,\n                c: \"tomahawk\",\n                f: \"json\"\n            }\n        };\n        return Tomahawk.get(url, settings).then(function (response) {\n                if (response && response[\"subsonic-response\"]\n                    && response[\"subsonic-response\"].status) {\n                    if (response[\"subsonic-response\"].status === \"ok\") {\n                        return Tomahawk.ConfigTestResultType.Success;\n                    } else {\n                        if (response[\"subsonic-response\"].error) {\n                            if (response[\"subsonic-response\"].error.code === 40) {\n                                return Tomahawk.ConfigTestResultType.InvalidCredentials;\n                            } else if (response[\"subsonic-response\"].error.code === 50) {\n                                return Tomahawk.ConfigTestResultType.InvalidAccount;\n                            } else if (response[\"subsonic-response\"].error.message) {\n                                return response[\"subsonic-response\"].error.message;\n                            }\n                        } else {\n                            return Tomahawk.ConfigTestResultType.CommunicationError;\n                        }\n                    }\n                } else {\n                    return Tomahawk.ConfigTestResultType.CommunicationError;\n                }\n            }, function (xhr) {\n                if (xhr.status == 404 || xhr.status == 0) {\n                    return Tomahawk.ConfigTestResultType.CommunicationError;\n                } else {\n                    return xhr.responseText.trim();\n                }\n            }\n        );\n    }\n\n});\n\nTomahawk.resolver.instance = SubsonicResolver;\n\nvar subsonicCollection = Tomahawk.extend(Tomahawk.Collection, {\n    settings: {\n        id: \"subsonic\",\n        prettyname: \"Subsonic\",\n        description: SubsonicResolver.subsonic_url,\n        iconfile: \"contents/images/icon.png\",\n        trackcount: 0\n    }\n});"
  },
  {
    "path": "subsonic/content/metadata.json",
    "content": "{\n    \"name\": \"Subsonic\",\n    \"pluginName\": \"subsonic\",\n    \"author\": \"mack_t, Teo and Enno\",\n    \"email\": \"teo@kde.org\",\n    \"version\": \"0.9.1\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Searches your Subsonic server for music to play.\",\n    \"platform\": \"any\",\n    \"tomahawkVersion\": \"0.6.99\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/subsonic.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/config.ui\",\n            \"contents/code/subsonic.png\"\n        ]\n    },\n    \"staticCapabilities\": [\n        \"configTestable\"\n    ]\n}\n"
  },
  {
    "path": "synology-audiostation/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>331</width>\n    <height>250</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>331</width>\n    <height>250</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <widget class=\"QLabel\" name=\"audiostation_label\">\n     <property name=\"pixmap\">\n      <pixmap>audiostation-icon.png</pixmap>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>40</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::ExpandingFieldsGrow</enum>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"username_label\">\n       <property name=\"text\">\n        <string>Username:</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"username_edit\"/>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"password_label\">\n       <property name=\"text\">\n        <string>Password:</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"password_edit\">\n       <property name=\"echoMode\">\n        <enum>QLineEdit::Password</enum>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"0\">\n      <widget class=\"QLabel\" name=\"server_label\">\n       <property name=\"text\">\n        <string>Server:</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"dsm_url_edit\"/>\n     </item>\n     <item row=\"3\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_4\">\n       <property name=\"text\">\n        <string>Max Songs:</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"3\" column=\"1\">\n      <widget class=\"QSpinBox\" name=\"max_songs_spinbox\">\n       <property name=\"minimum\">\n        <number>1</number>\n       </property>\n       <property name=\"maximum\">\n        <number>1000</number>\n       </property>\n       <property name=\"value\">\n        <number>500</number>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "synology-audiostation/content/contents/code/synology-audiostation.js",
    "content": "/*\n * (c) 2013 Ron Jaegers <ron.jaegers@gmail.com>\n *\n * TODO List\n * - Timeout after login, recover.\n * - User feedback in case of wrong credentials.\n * - Use \"new style\" API for searches and starting stream (based on track id).\n * - Support multiple mime types\n * - Remove limitation of single search keyword (i.e. use new api for searches).\n */\n\nvar SynologyResolver = Tomahawk.extend(TomahawkResolver, {\n    trackCount: -1,\n    settings: {\n        name: 'Synology',\n        icon: 'audiostation-icon.png',\n        weight: 95,\n        timeout: 5\n    },\n    errors: {\n        100: \"Unknown error\",\n        101: \"Invalid parameters\",\n        102: \"The requested API does not exist\",\n        103: \"The requested method does not exist\",\n        104: \"The requested version does not support this functionality\",\n        105: \"The logged-in session does not have permission\",\n        106: \"Session timeout\",\n        107: \"Session interrupted by duplicate login\"\n    },\n    getConfigUi: function () {\n        var uiData = Tomahawk.readBase64(\"config.ui\");\n        return {\n            \"widget\": uiData,\n            fields: [{\n                name: \"username\",\n                widget: \"username_edit\",\n                property: \"text\"\n            }, {\n                name: \"password\",\n                widget: \"password_edit\",\n                property: \"text\"\n            }, {\n                name: \"dsm_url\",\n                widget: \"dsm_url_edit\",\n                property: \"text\"\n            }, {\n                name: \"max_songs\",\n                widget: \"max_songs_spinbox\",\n                property: \"value\"\n            }],\n            images: [{\n                \"audiostation-icon.png\" : Tomahawk.readBase64(\"audiostation-icon.png\")\n            }]\n        };\n    },\n    newConfigSaved: function () {\n        this.init();\n    },\n    init: function() {\n        var userConfig = this.getUserConfig();\n        if (!userConfig.username || !userConfig.password || !userConfig.dsm_url) {\n            Tomahawk.log(\"Synology Resolver not properly configured!\");\n            return;\n        }\n\n        if (this.user !== userConfig.username ||\n            this.password !== userConfig.password ||\n            this.dsm_url !== userConfig.dsm_url)\n        {\n            this.user = userConfig.username;\n            this.password = userConfig.password;\n            this.dsm_url = userConfig.dsm_url.replace(/\\/+$/, \"\");\n            this.dsm_port = userConfig.dsm_port || 5000\n            this.use_tls = false;\n\n            this.api_info = this.retrieveApiInfo();\n            this.authenticate();\n        }\n\n        this.max_songs = userConfig.max_songs;\n    },\n    retrieveApiInfo: function() {\n        // This is the only time we need to construct a API URI ourselves.\n        // SYNO.API.Info has a fixed path that will never change. We use\n        // this to find the location of the other services.\n        var info_url = this.apiBaseUrl() +\n                       \"query.cgi\" +\n                       \"?api=SYNO.API.Info&version=1&method=query&query=ALL\";\n\n        var result = JSON.parse(Tomahawk.syncRequest(info_url));\n        return result.data;\n    },\n    authenticate: function() {\n        var auth_url = this.buildApiUrl(\"SYNO.API.Auth\", 2, \"login\",\n                                        { account: this.user, passwd: this.password, session: this.createSessionId(), format: \"sid\" }),\n            that = this;\n\n        this.doApiRequest(auth_url, function(jsonResponse) {\n            if (typeof(jsonResponse.data.sid) === \"undefined\") {\n                Tomahawk.log(\"No session identifier (sid) received. Future api calls will fail.\");\n                Tomahawk.PluginManager.unregisterPlugin(\"collection\", that);\n\n                return;\n            }\n\n            that.sid = jsonResponse.data.sid;\n            that.getTrackCount();\n        });\n    },\n    getTrackCount: function() {\n        // Request all tracks but limit the results to one.\n        // In this case the response will contain the total tracks count.\n        var track_url = this.buildApiUrl(\"SYNO.AudioStation.Song\", 1, \"list\", { offset: 0, limit: 1 }),\n            that = this;\n\n        this.doApiRequest(track_url, function(jsonResponse) {\n            that.trackCount = jsonResponse.data.total;\n            Tomahawk.PluginManager.registerPlugin(\"collection\", that);\n        });\n    },\n\n    // Resolve and search support.\n    resolve: function(qid, artist, album, title) {\n        var resolve_url = this.apiBaseUrl().replace(\"/webapi/\", \"\") +\n                          \"/webman/3rdparty/AudioStation/webUI/audio_browse.cgi\" +\n                          \"?start=0&limit=1000&target=musiclib_root&action=search&category=title&library=shared\" +\n                          \"&server=musiclib_root&keyword=\" + encodeURIComponent(title) +\n                          \"&sort=album&dir=ASC\",\n            that = this;\n\n        this.doApiRequest(resolve_url, function(jsonResponse) {\n            var results = [];\n\n            jsonResponse.items.forEach(function (item) {\n                // This sucks, strings need to exactly match!\n                if (item.artist === artist) {\n                    results.push(that.convertTrack(item));\n                }\n            });\n\n            Tomahawk.addTrackResults({\n                qid: qid,\n                results: results\n            });\n        });\n    },\n    search: function(qid, searchString) {\n        var search_url = this.apiBaseUrl().replace(\"/webapi/\", \"\") +\n                         \"/webman/3rdparty/AudioStation/webUI/audio_browse.cgi\" +\n                         \"?action=search&target=musiclib_root&server=musiclib_root&category=all\" +\n                         \"&keyword=\" + encodeURIComponent(searchString) +\n                         \"&start=0&limit=\" + this.max_songs,\n            that = this;\n\n        this.doApiRequest(search_url, function(jsonResponse) {\n            var results = [];\n\n            jsonResponse.items.forEach(function (item) {\n               results.push(that.convertTrack(item));\n            });\n\n            Tomahawk.addTrackResults({\n                qid: qid,\n                results: results\n            });\n        });\n    },\n\n    // Collection support.\n    collection: function() {\n        return {\n            prettyname: this.settings.name,\n            description: this.dsm_url,\n            iconfile: this.settings.icon,\n            trackcount: this.trackCount\n        };\n    },\n    artists: function(qid) {\n        var artists_url = this.buildApiUrl(\"SYNO.AudioStation.Artist\", 1, \"list\", { offset: 0, limit: 2000 });\n\n        this.doApiRequest(artists_url, function(jsonResponse) {\n            var results = [];\n\n            jsonResponse.data.artists.forEach(function (item) {\n                results.push(item.name);\n            });\n\n            Tomahawk.addArtistResults({\n                qid: qid,\n                artists: results\n            });\n        });\n    },\n    albums: function(qid, artist) {\n        var albums_url = this.buildApiUrl(\"SYNO.AudioStation.Album\", 1, \"list\", { offset: 0, limit: 2000, artist: artist });\n\n        this.doApiRequest(albums_url, function(jsonResponse) {\n            var results = [];\n\n            jsonResponse.data.albums.forEach(function (item) {\n                results.push(item.name);\n            });\n\n            Tomahawk.addAlbumResults({\n                qid: qid,\n                artist: artist,\n                albums: results\n            });\n        });\n    },\n    tracks: function(qid, artist, album) {\n        var track_url = this.buildApiUrl(\"SYNO.AudioStation.Song\", 1, \"list\", { offset: 0, limit: this.max_songs, artist: artist, album: album }),\n            that = this;\n\n        this.doApiRequest(track_url, function(jsonResponse) {\n            var results = [],\n                tracknr = 1;\n\n            jsonResponse.data.songs.forEach(function (item) {\n                results.push({\n                    artist: artist,\n                    album: album,\n                    track: item.title,\n                    albumpos: tracknr++,\n                    // Addition of /volume1 to path will probably not work for every configuration.\n                    // When we transition to id based stream url's this workaround should go.\n                    url: that.buildStreamUrl(\"/volume1\" + item.path),\n                    source: that.settings.name,\n                    score: 1.0,\n                    mimetype: \"audio/mpeg\"\n                });\n            });\n\n            Tomahawk.addAlbumTrackResults({\n                qid: qid,\n                artist: artist,\n                album: album,\n                results: results\n            });\n        });\n    },\n\n    // Helper methods.\n    apiBaseUrl: function() {\n        return (this.use_tls ? \"https://\" : \"http://\") + this.dsm_url + \":\" + this.dsm_port + \"/webapi/\";\n    },\n    buildApiUrl: function(api, version, method, urlParameters) {\n        if (typeof(this.api_info[api]) === \"undefined\") {\n            Tomahawk.log(\"Requested unknown API[\" + api + \"] request will fail.\");\n        }\n\n        return this.apiBaseUrl() +\n               this.api_info[api].path +\n               \"?api=\" + api +\n               \"&version=\" + version +\n               \"&method=\" + method +\n               this.buildUrlParameters(urlParameters) +\n               \"&sid=\" + this.sid;\n    },\n    buildUrlParameters: function(parameters) {\n        var url = \"\";\n        for (var parameter in parameters) {\n                url += \"&\" + parameter + \"=\" + encodeURIComponent(parameters[parameter]);\n        }\n        return url;\n    },\n    buildStreamUrl: function(resourceLocation) {\n        return this.apiBaseUrl().replace(\"/webapi/\", \"\") +\n               \"/webman/3rdparty/AudioStation/webUI/audio_stream.cgi/0.mp3\" +\n               \"?sid=\" + this.sid +\n               \"&action=streaming\" +\n               \"&songpath=\" + encodeURIComponent(resourceLocation).replace(\"+\", \"%20\").replace(\"&\", \"%26\");\n    },\n    createSessionId: function() {\n        return \"Tomahawk\" + Math.floor((Math.random() * 10000) + 1);\n    },\n    doApiRequest: function(url, onSuccess) {\n        var that = this;\n\n        Tomahawk.asyncRequest(url, function(xhr) {\n            var jsonResponse = JSON.parse(xhr.responseText);\n\n            if (jsonResponse.success) {\n                onSuccess(jsonResponse)\n            } else if (jsonResponse.error) {\n                Tomahawk.log(\"Error occured: \" + that.errors[jsonResponse.error.code]);\n            } else {\n                Tomahawk.log(\"Unknown error occured\");\n            }\n        });\n    },\n    convertTrack: function(synologyTrack) {\n        return {\n            artist: synologyTrack.artist,\n            album: synologyTrack.album,\n            track: synologyTrack.title,\n            year: synologyTrack.year,\n            albumpos: synologyTrack.track,\n            discnumber: synologyTrack.disc,\n            source: this.settings.name,\n            url: this.buildStreamUrl(synologyTrack.res),\n            bitrate: synologyTrack.bitrate / 1000,\n            duration: synologyTrack.duration,\n            size: synologyTrack.size,\n            score: 1.0,\n            mimetype: \"audio/mpeg\"\n        };\n    }\n});\n\nTomahawk.resolver.instance = SynologyResolver;\n"
  },
  {
    "path": "synology-audiostation/content/metadata.json",
    "content": "{\n    \"name\": \"Synology AudioStation\",\n    \"pluginName\": \"synology\",\n    \"author\": \"Ron Jaegers\",\n    \"email\": \"ron.jaegers@gmail.com\",\n    \"version\": \"0.0.5\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Resolves and plays tracks from your Synology AudioStation.\",\n    \"platform\": \"any\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/synology-audiostation.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"resources\": [\n            \"contents/code/config.ui\",\n            \"contents/code/audiostation-icon.png\"\n        ]\n    }\n}"
  },
  {
    "path": "test/buster.js",
    "content": "var config = module.exports;\n\nconfig[\"resolver tests\"] = {\n    rootPath: \"../\",\n    environment: \"node\",\n    sources: [\n    ],\n    tests: [\n        \"beatsmusic/content/contents/code/test.js\",\n        \"soundcloud/content/contents/code/test.js\"\n    ]\n}\n\n// Add more configuration groups as needed\n"
  },
  {
    "path": "test/utils.js",
    "content": "var fs = require('fs');\nvar TomahawkJS = require(\"tomahawkjs\");\n\nmodule.exports.loadAxe = function(path, owner, done, config) {\n    TomahawkJS.loadAxe(path, function(err, axe) {\n        axe.getInstance(function(err, instance_context) {\n            owner.instance = instance_context.instance;\n            owner.context = instance_context.context;\n            owner.instance.init(function (error) {\n                if (error) {\n                    // TODO Loading failed, crash!\n                } else {\n                    // Resolver loaded successfully, start testing.\n                    done();\n                }\n            });\n        }, config);\n    });\n};\n\nmodule.exports.loadResolver = function (name, owner, done, config) {\n    owner.metadata = JSON.parse(fs.readFileSync(name + '/content/metadata.json'))\n    module.exports.loadAxe(name + '/' + name + '-' + owner.metadata.version + '.axe', owner, done, config);\n};\n\n"
  },
  {
    "path": "tidal/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>390</width>\n    <height>120</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>250</width>\n    <height>120</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::ExpandingFieldsGrow</enum>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Email</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"email_edit\"/>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Password</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"password_edit\">\n       <property name=\"echoMode\">\n        <enum>QLineEdit::Password</enum>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_3\">\n       <property name=\"text\">\n        <string>Stream Quality</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"1\">\n      <widget class=\"QComboBox\" name=\"quality\">\n       <item>\n        <property name=\"text\">\n         <string>LOW</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>HIGH</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>LOSSLESS</string>\n        </property>\n       </item>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "tidal/content/contents/code/tidal.js",
    "content": "/* Tidal resolver for Tomahawk.\n *\n * Written in 2015 by Anton Romanov, and Will Stott\n *\n * To the extent possible under law, the author(s) have dedicated all\n * copyright and related and neighboring rights to this software to\n * the public domain worldwide. This software is distributed without\n * any warranty.\n *\n * You should have received a copy of the CC0 Public Domain Dedication\n * along with this software. If not, see:\n * http://creativecommons.org/publicdomain/zero/1.0/\n */\n\nvar TidalResolver = Tomahawk.extend(Tomahawk.Resolver, {\n    apiVersion: 0.9,\n\n    /* This can also be used with WiMP service if you change next 2 lines */\n    api_location: 'https://listen.tidal.com/v1/',\n    api_token: 'P5Xbeo5LFvESeDy6',\n    api_clientVer: '2.2.1--7',\n\n    logged_in: null, // null, = not yet tried, 0 = pending, 1 = success, 2 = failed\n\n    settings: {\n        cacheTime: 300,\n        name: 'TIDAL',\n        icon: '../images/icon.png',\n        weight: 91,\n        timeout: 8\n    },\n\n    strQuality: ['LOW', 'HIGH', 'LOSSLESS'],\n    numQuality: [64, 320, 1411],\n\n    getConfigUi: function () {\n        return {\n            \"widget\": Tomahawk.readBase64(\"config.ui\"),\n            fields: [{\n                name: \"email\",\n                widget: \"email_edit\",\n                property: \"text\"\n            }, {\n                name: \"password\",\n                widget: \"password_edit\",\n                property: \"text\"\n            }, {\n                name: \"quality\",\n                widget: \"quality\",\n                property: \"currentIndex\"\n            }]\n        };\n    },\n\n    /**\n     * Defines this Resolver's config dialog UI.\n     */\n    configUi: [\n        {\n            id: \"email\",\n            type: \"textfield\",\n            label: \"E-Mail\"\n        },\n        {\n            id: \"password\",\n            type: \"textfield\",\n            label: \"Password\",\n            isPassword: true\n        },\n        {\n            id: \"quality\",\n            type: \"dropdown\",\n            label: \"Audio quality\",\n            items: [\"Low\", \"High\", \"Lossless\"],\n            defaultValue: 2\n        }\n    ],\n\n    newConfigSaved: function (newConfig) {\n        var changed =\n            this._email !== newConfig.email ||\n            this._password !== newConfig.password ||\n            this._quality != newConfig.quality;\n\n        if (changed) {\n            this.init();\n        }\n    },\n\n    testConfig: function (config) {\n        return this._getLoginPromise(config).then(function () {\n            return Tomahawk.ConfigTestResultType.Success;\n        }, function (xhr) {\n            if (xhr.status == 401) {\n                return Tomahawk.ConfigTestResultType.InvalidCredentials;\n            } else {\n                return Tomahawk.ConfigTestResultType.CommunicationError;\n            }\n        });\n    },\n\n    init: function () {\n        var config = this.getUserConfig();\n\n        this._email = config.email;\n        this._password = config.password;\n        this._quality = config.quality;\n\n        if (!this._email || !this._password) {\n            Tomahawk.PluginManager.unregisterPlugin(\"linkParser\", this);\n            //This is being called even for disabled ones\n            //throw new Error( \"Invalid configuration.\" );\n            Tomahawk.log(\"Invalid Configuration\");\n            return;\n        }\n\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n\n        this._login(config);\n    },\n\n    _convertTracks: function (entries) {\n        return entries.filter(function (entry) {\n            return entry.allowStreaming;\n        }).map(this._convertTrack, this);\n    },\n\n    _convertTrack: function (entry) {\n        return {\n            type: Tomahawk.UrlType.Track,\n            artist: entry.artist.name,\n            album: entry.album.title,\n            track: entry.title,\n            year: entry.year,\n\n            albumpos: entry.trackNumber,\n            discnumber: entry.volumeNumber,\n\n            duration: entry.duration,\n\n            url: 'tidal://track/' + entry.id,\n            hint: 'tidal://track/' + entry.id,\n            checked: true,\n            bitrate: this.numQuality[this._quality]\n        };\n    },\n\n    _convertAlbum: function (entry) {\n        return {\n            type: Tomahawk.UrlType.Album,\n            artist: entry.artist.name,\n            album: entry.title,\n            url: entry.url\n        };\n    },\n\n    _convertArtist: function (entry) {\n        return {\n            type: Tomahawk.UrlType.Artist,\n            artist: entry.name\n        };\n    },\n\n    _convertPlaylist: function (entry) {\n        return {\n            type: Tomahawk.UrlType.Playlist,\n            title: entry.title,\n            guid: \"tidal-playlist-\" + entry.uuid,\n            info: entry.description + \" (from TidalHiFi)\",\n            creator: \"tidal-user-\" + entry.creator.id,\n            // TODO: Perhaps use tidal://playlist/uuid\n            url: entry.url\n        };\n    },\n\n    search: function (params) {\n        var query = params.query;\n        var limit = params.limit;\n\n        if (!this.logged_in) {\n            return this._defer(this.search, [query], this);\n        } else if (this.logged_in === 2) {\n            throw new Error('Failed login, cannot search.');\n        }\n\n        var that = this;\n        var settings = {\n            data: {\n                limit: limit || 9999,\n                query: query.replace(/[ \\-]+/g, ' ').toLowerCase(),\n\n                sessionId: this._sessionId,\n                countryCode: this._countryCode\n            }\n        };\n        return Tomahawk.get(this.api_location + \"search/tracks\", settings)\n            .then(function (response) {\n                return that._convertTracks(response.items);\n            });\n    },\n\n    resolve: function (params) {\n        var artist = params.artist;\n        var album = params.album;\n        var track = params.track;\n\n        var query = [artist, track].join(' ');\n\n        return this.search({\n            query: query,\n            limit: 5\n        });\n    },\n\n    /**\n     * Splits the given url into 3 parts. see http://www.regexr.com/3ahue\n     * Returns array containing:\n     * [1]: 'tidal' or 'wimpmusic'\n     * [2]: 'artist' or 'album' or 'track' or 'playlist' (removes the s)\n     * [3]: ID of resource (seems to be the same for both services!)\n     */\n    _parseUrlPrefix: function (url) {\n        return url.match(/(?:https?:\\/\\/)?(?:listen|play|www)\\.(tidal|wimpmusic)\\.com\\/(?:v1\\/)?([a-z]{3,}?)s?\\/([\\w\\-]+)[\\/?]?/);\n    },\n\n    canParseUrl: function (params) {\n        var url = params.url;\n        var type = params.type;\n\n        url = this._parseUrlPrefix(url);\n        if (!url) {\n            throw new Error(\"Couldn't parse URL. Invalid format?\");\n        }\n        switch (type) {\n            case Tomahawk.UrlType.Album:\n                return url[2] == 'album';\n            case Tomahawk.UrlType.Artist:\n                return url[2] == 'artist';\n            case Tomahawk.UrlType.Track:\n                return url[2] == 'track';\n            case Tomahawk.UrlType.Playlist:\n                return url[2] == 'playlist';\n        }\n    },\n\n    _debugPrint: function (obj, spaces) {\n        spaces = spaces || '';\n\n        var str = '';\n        for (var key in obj) {\n            if (obj.hasOwnProperty(key)) {\n                var b = [\"{\", \"}\"];\n                if (obj[key].constructor == Array) {\n                    b = [\"[\", \"]\"];\n                }\n                str += spaces + key + \": \" + b[0] + \"\\n\" + this._debugPrint(obj[key],\n                        spaces + '    ') + \"\\n\" + spaces + b[1] + '\\n';\n            } else {\n                str += spaces + key + \": \" + obj[key] + \"\\n\";\n            }\n        }\n        if (spaces != '') {\n            return str;\n        } else {\n            str.split('\\n').map(Tomahawk.log, Tomahawk);\n        }\n    },\n\n    lookupUrl: function (params) {\n        var url = params.url;\n\n        return this._getLookupUrlPromise(url);\n    },\n\n    _getLookupUrlPromise: function (url) {\n        if (!this.logged_in) {\n            return this._defer(this.lookupUrl, [url], this);\n        } else if (this.logged_in === 2) {\n            throw new Error('Failed login, cannot lookupUrl');\n        }\n\n        var match = this._parseUrlPrefix(url);\n\n        Tomahawk.log(url + \" -> \" + match[1] + \" \" + match[2] + \" \" + match[3]);\n\n        if (!match[1]) {\n            throw new Error(\"Couldn't parse given URL: \" + url);\n        }\n\n        var that = this;\n\n        var params = {\n            countryCode: this._countryCode,\n            sessionId: this._sessionId,\n            limit: 9999\n        };\n\n        if (match[2] == 'album') {\n            var rqUrl = this.api_location + 'albums/' + match[3];\n\n            var getInfo = Tomahawk.get(rqUrl, {data: params});\n            var getTracks = Tomahawk.get(rqUrl + \"/tracks\", {data: params});\n\n            Tomahawk.log(rqUrl);\n\n            return RSVP.Promise.all([getInfo, getTracks]).then(function (response) {\n                var result = that._convertAlbum(response[0]);\n                result.tracks = that._convertTracks(response[1].items);\n                return result;\n            });\n\n        } else if (match[2] == 'artist') {\n            var rqUrl = this.api_location + 'artists/' + match[3];\n\n            return Tomahawk.get(rqUrl, {\n                data: params\n            }).then(function (response) {\n                return that._convertArtist(response);\n            });\n\n        } else if (match[2] == 'track') {\n            var rqUrl = this.api_location + 'tracks/' + match[3];\n            // I can't find any link on the site for tracks.\n            return Tomahawk.get(rqUrl, {\n                data: params\n            }).then(function (response) {\n                return that._convertTrack(response);\n            });\n\n        } else if (match[2] == 'playlist') {\n            var rqUrl = this.api_location + 'playlists/' + match[3];\n\n            var getInfo = Tomahawk.get(rqUrl, {data: params});\n            var getTracks = Tomahawk.get(rqUrl + \"/tracks\", {data: params});\n\n            return RSVP.Promise.all([getInfo, getTracks]).then(function (response) {\n                var result = that._convertPlaylist(response[0]);\n                result.tracks = that._convertTracks(response[1].items);\n                return result;\n            });\n        }\n    },\n\n    _parseUrn: function (urn) {\n        // \"tidal://track/18692667\"\n        var match = urn.match(/^tidal:\\/\\/([a-z]+)\\/(.+)$/);\n        if (!match) {\n            return null;\n        }\n\n        return {\n            type: match[1],\n            id: match[2]\n        };\n    },\n\n    getStreamUrl: function (params) {\n        var url = params.url;\n\n        if (!this.logged_in) {\n            return this._defer(this.getStreamUrl, [url], this);\n        } else if (this.logged_in === 2) {\n            throw new Error('Failed login, cannot getStreamUrl.');\n        }\n\n        var parsedUrn = this._parseUrn(url);\n\n        if (!parsedUrn || parsedUrn.type != 'track') {\n            Tomahawk.log(\"Failed to get stream. Couldn't parse '\" + url + \"'\");\n            return;\n        }\n\n        var settings = {\n            data: {\n                token: this.api_token,\n                countryCode: this._countryCode,\n                soundQuality: this.strQuality[this._quality],\n                sessionId: this._sessionId\n            }\n        };\n\n        return Tomahawk.get(this.api_location + \"tracks/\" + parsedUrn.id + \"/streamUrl\", settings)\n            .then(function (response) {\n                return {\n                    url: response.url\n                };\n            });\n    },\n\n    _defer: function (callback, args, scope) {\n        if (typeof this._loginPromise !== 'undefined' && 'then' in this._loginPromise) {\n            args = args || [];\n            scope = scope || this;\n            Tomahawk.log('Deferring action with ' + args.length + ' arguments.');\n            return this._loginPromise.then(function () {\n                Tomahawk.log('Performing deferred action with ' + args.length + ' arguments.');\n                callback.call(scope, args);\n            });\n        }\n    },\n\n    _getLoginPromise: function (config) {\n        var settings = {\n            type: 'POST', // backwards compatibility for old versions of tomahawk.js\n            data: {\n                \"username\": config.email.trim(),\n                \"password\": config.password.trim(),\n                \"clientVersion\": TidalResolver.api_clientVer //clientVersion string, API now checks for this on login\n            },\n            headers: {'Origin': 'http://listen.tidal.com'}\n        };\n        return Tomahawk.post(this.api_location + \"login/username?token=\" + this.api_token,\n            settings);\n    },\n\n    _login: function (config) {\n        // If a login is already in progress don't start another!\n        if (this.logged_in === 0) {\n            return;\n        }\n        this.logged_in = 0;\n\n        var that = this;\n\n        this._loginPromise = this._getLoginPromise(config)\n            .then(function (resp) {\n                Tomahawk.log(that.settings.name + \" successfully logged in.\");\n\n                that._countryCode = resp.countryCode;\n                that._sessionId = resp.sessionId;\n                that._userId = resp.userId;\n\n                that.logged_in = 1;\n            }, function (error) {\n                Tomahawk.log(that.settings.name + \" failed login.\");\n\n                delete that._countryCode;\n                delete that._sessionId;\n                delete that._userId;\n\n                that.logged_in = 2;\n            }\n        );\n        return this._loginPromise;\n    }\n});\n\nTomahawk.resolver.instance = TidalResolver;\n"
  },
  {
    "path": "tidal/content/metadata.json",
    "content": "{\n    \"name\": \"TIDAL\",\n    \"pluginName\": \"tidal\",\n    \"author\": \"Anton Romanov and Will Stott\",\n    \"email\": \"\",\n    \"version\": \"0.0.7\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Streams music from tidal.com (requires subscription)\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/tidal.js\",\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"scripts\": [],\n        \"resources\": [\n            \"contents/code/config.ui\"\n        ]\n    },\n    \"staticCapabilities\": [\n        \"configTestable\"\n    ]\n}\n"
  },
  {
    "path": "tomahawk-metadata/content/contents/code/tomahawk-metadata.js",
    "content": "/* === This file is part of Tomahawk Player - <http://tomahawk-player.org> ===\n *\n *   Copyright 2014, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Tomahawk is free software: you can redistribute it and/or modify\n *   it under the terms of the GNU Lesser General Public License as\n *   published by the Free Software Foundation, version 3.\n *\n *   Tomahawk is distributed in the hope that it will be useful, but\n *   WITHOUT ANY WARRANTY; without even the implied warranty of\n *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n *   Lesser General Public License for more details.\n *\n *   You should have received a copy of the GNU Lesser General Public License\n *   along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nvar TomahawkMetadataResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'Tomahawk Metadata',\n        icon: 'tomahawk-metadata.png',\n        weight: 0, // We cannot resolve, so use minimum weight\n        timeout: 15\n    },\n\n    canParseUrl: function (params) {\n        var url = params.url;\n        var type = params.type;\n\n        switch (type) {\n            case Tomahawk.UrlType.Album:\n                return /^tomahawk:\\/\\/view\\/album\\/?\\?$/.test(url);\n            case Tomahawk.UrlType.Artist:\n                return /^tomahawk:\\/\\/view\\/artist\\/?\\?$/.test(url);\n            case Tomahawk.UrlType.Track:\n                return /^tomahawk:\\/\\/(queue\\/add|play)\\/track\\/?\\?$/.test(url);\n            default:\n                return false;\n        }\n    },\n\n    lookupUrl: function (params) {\n        var url = params.url;\n\n        Tomahawk.log(\"lookupUrl: \" + url);\n        if (/^tomahawk:\\/\\/view\\/album\\/?\\?$/.test(url)) {\n            Tomahawk.log(\"Found an album\");\n            // We have to deal with an Album\n            return {\n                type: Tomahawk.UrlType.Album,\n                artist: this._getQueryVariable(url, 'artist'),\n                album: this._getQueryVariable(url, 'name')\n            };\n        } else if (/^tomahawk:\\/\\/view\\/artist\\/?\\?$/.test(url)) {\n            Tomahawk.log(\"Found an artist\");\n            // We have to deal with an Artist\n            return {\n                type: Tomahawk.UrlType.Artist,\n                artist: this._getQueryVariable(url, 'name')\n            };\n        } else if (/^tomahawk:\\/\\/(queue\\/add|play)\\/track\\/?\\?$/.test(url)) {\n            Tomahawk.log(\"Found a track\");\n            // We have to deal with a Track\n            return {\n                type: Tomahawk.UrlType.Track,\n                artist: this._getQueryVariable(url, 'artist'),\n                track: this._getQueryVariable(url, 'title')\n            };\n        }\n    },\n\n    _getQueryVariable: function (url, variable) {\n        var parts = url.split('?');\n        var vars = parts[parts.length - 1].split('&');\n        for (var i = 0; i < vars.length; i++) {\n            var pair = vars[i].split('=');\n            if (decodeURIComponent(pair[0]) == variable) {\n                return decodeURIComponent(pair[1]);\n            }\n        }\n    }\n});\n\nTomahawk.resolver.instance = TomahawkMetadataResolver;\n\n"
  },
  {
    "path": "tomahawk-metadata/content/metadata.json",
    "content": "{\n\t\"name\": \"tomahawk Metadata\",\n\t\"pluginName\": \"tomahawk-metadata\",\n\t\"author\": \"Enno Gottschalk\",\n\t\"email\": \"mrmaffen@googlemail.com\",\n\t\"version\": \"0.2.0\",\n\t\"website\": \"http://gettomahawk.com\",\n\t\"description\": \"Supports loading/drag'n'drop of tomahawk:// URLs.\",\n\t\"type\": \"resolver/javascript\",\n\t\"manifest\": {\n\t\t\"main\": \"contents/code/tomahawk-metadata.js\",\n\t\t\"scripts\": [],\n\t\t\"icon\": \"contents/images/icon.png\",\n\t\t\"resources\": [\n\t\t\t\"contents/code/tomahawk-metadata.png\"\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "tomahk-metadata/content/contents/code/tomahk-metadata.js",
    "content": "/*\n *   Copyright 2013, Uwe L. Korn <uwelk@xhochy.com>\n *   Copyright 2014, Enno Gottschalk <mrmaffen@googlemail.com>\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n */\n\nvar TomaHKMetadataResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'toma.hk Metadata',\n        icon: 'tomahk-metadata.png',\n        weight: 0, // We cannot resolve, so use minimum weight\n        timeout: 15\n    },\n\n    canParseUrl: function (params) {\n        var url = params.url;\n        var type = params.type;\n\n        switch (type) {\n            case Tomahawk.UrlType.Album:\n                return /https?:\\/\\/(www\\.)?toma.hk\\/album\\//.test(url);\n            case Tomahawk.UrlType.Artist:\n                return /https?:\\/\\/(www\\.)?toma.hk\\/artist\\//.test(url);\n            case Tomahawk.UrlType.Playlist:\n                return /https?:\\/\\/(www\\.)?toma.hk\\/p\\//.test(url);\n            default:\n                return /https?:\\/\\/(www\\.)?toma.hk\\//.test(url);\n        }\n    },\n\n    lookupUrl: function (params) {\n        var url = params.url;\n\n        var urlParts =\n            url.split('/').filter(function (item) {\n                return item.length != 0;\n            }).map(function (s) {\n                return decodeURIComponent(s.replace(/\\+/g, '%20'));\n            });\n        if (/https?:\\/\\/(www\\.)?toma.hk\\/album\\//.test(url)) {\n            // We have to deal with an Album\n            return {\n                type: Tomahawk.UrlType.Album,\n                artist: urlParts[urlParts.length - 2],\n                album: urlParts[urlParts.length - 1]\n            };\n        } else if (/https?:\\/\\/(www\\.)?toma.hk\\/artist\\//.test(url)) {\n            // We have to deal with an Artist\n            return {\n                type: Tomahawk.UrlType.Artist,\n                artist: urlParts[urlParts.length - 1]\n            };\n        } else if (/https?:\\/\\/(www\\.)?toma.hk\\/p\\//.test(url)) {\n            // We have a xspf playlist\n            return {\n                type: Tomahawk.UrlType.XspfPlaylist,\n                url: url.replace('toma.hk/p/', 'toma.hk/xspf/')\n            };\n        } else if (/https?:\\/\\/(www\\.)?toma\\.hk.*(\\?title=)[^&]*(&artist=)/.test(url)\n            || /https?:\\/\\/(www\\.)?toma\\.hk.*(\\?artist=)[^&]*(&title=)/.test(url)) {\n            // We search for a track\n            var artist = url.match(/(?:\\?|&)artist=([^&]*)/)[1];\n            var title = url.match(/(?:\\?|&)title=([^&]*)/)[1];\n            return {\n                type: Tomahawk.UrlType.Track,\n                artist: decodeURIComponent(artist.replace(/\\+/g, '%20')),\n                track: decodeURIComponent(title.replace(/\\+/g, '%20'))\n            };\n        } else {\n            // We most likely have a track\n            var query = url.replace(\"http://toma.hk/\", \"http://toma.hk/api.php?id=\");\n            return Tomahawk.get(query).then(function (res) {\n                if (res.artist.length > 0 && res.title.length > 0) {\n                    return {\n                        type: Tomahawk.UrlType.Track,\n                        artist: res.artist,\n                        track: res.title\n                    };\n                }\n            });\n        }\n    }\n});\n\nTomahawk.resolver.instance = TomaHKMetadataResolver;\n\n"
  },
  {
    "path": "tomahk-metadata/content/metadata.json",
    "content": "{\n\t\"name\": \"toma.hk Metadata\",\n\t\"pluginName\": \"tomahk-metadata\",\n\t\"author\": \"Uwe L. Korn and Enno\",\n\t\"email\": \"uwelk@xhochy.com\",\n\t\"version\": \"0.2.2\",\n\t\"website\": \"http://gettomahawk.com\",\n\t\"description\": \"Supports loading and drag and drop of toma.hk URLs.\",\n\t\"type\": \"resolver/javascript\",\n\t\"manifest\": {\n\t\t\"main\": \"contents/code/tomahk-metadata.js\",\n\t\t\"scripts\": [],\n\t\t\"icon\": \"contents/images/icon.png\",\n\t\t\"resources\": [\n\t\t\t\"contents/code/tomahk-metadata.png\"\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "tools/getstreamurl.js",
    "content": "var argv = require('minimist')(process.argv.slice(2));\nvar utils = require('../test/utils.js');\n\nif (argv._.length < 1) {\n    console.error(\"Please specify a single resolver\");\n    process.exit(1);\n}\n\nif (argv._.length < 3) {\n    console.error(\"You need to specify at least an artist and a track for resolving.\");\n    process.exit(1);\n}\n\n// We use the string argument as the path to the resolver.\nvar resolverPath = argv._[0];\nvar artist = argv._[1];\nvar track = argv._[2];\nvar album = \"\";\n\nif (argv._.length > 3) {\n    album = argv._[3];\n}\n\n// All -/-- arguments will be added to the config.\n// If --config is specified, we will instead load them from the config file.\nvar resolverConfig = argv;\nif (argv.hasOwnProperty(\"config\")) {\n    // FIXME: Add support for absolute paths\n    resolverConfig = require(\"../\" + argv.config);\n} else {\n    delete resolverConfig._;\n}\n\nvar resolver = {};\n\nutils.loadAxe(resolverPath, resolver, function () {\n    // Use once instead of on here to only handle the first result.\n    resolver.context.once('track-result', function (qid, result) {\n        if (resolver.context.Tomahawk.hasCustomUrlHandler) {\n            resolver.context.getStreamUrl(2, result.url);\n        } else {\n            console.log(result.url);\n        }\n    });\n    resolver.context.once('stream-url', function (qid, url) {\n        console.log(url);\n    });\n    resolver.instance.resolve(\"qid\", artist, album, track);\n}, resolverConfig);\n\n"
  },
  {
    "path": "tools/resolve.js",
    "content": "var argv = require('minimist')(process.argv.slice(2));\nvar utils = require('../test/utils.js');\n\nif (argv._.length < 1) {\n    console.error(\"Please specify a single resolver\");\n    process.exit(1);\n}\n\nif (argv._.length < 3) {\n    console.error(\"You need to specify at least an artist and a track for resolving.\");\n    process.exit(1);\n}\n\n// We use the string argument as the path to the resolver.\nvar resolverPath = argv._[0];\nvar artist = argv._[1];\nvar track = argv._[2];\nvar album = \"\";\n\nif (argv._.length > 3) {\n    album = argv._[3];\n}\n\n// All -/-- arguments will be added to the config.\n// If --config is specified, we will instead load them from the config file.\nvar resolverConfig = argv;\nif (argv.hasOwnProperty(\"config\")) {\n    // FIXME: Add support for absolute paths\n    resolverConfig = require(\"../\" + argv.config);\n} else {\n    delete resolverConfig._;\n}\n\nvar resolver = {};\n\nutils.loadAxe(resolverPath, resolver, function () {\n    resolver.context.on('track-result', function (qid, result) {\n        console.dir(result);\n    });\n    resolver.instance.resolve(\"qid\", artist, album, track);\n}, resolverConfig);\n"
  },
  {
    "path": "tools/search.js",
    "content": "var argv = require('minimist')(process.argv.slice(2));\nvar utils = require('../test/utils.js');\n\nif (argv._.length < 1) {\n    console.error(\"Please specify a single resolver\");\n    process.exit(1);\n}\n\nif (argv._.length < 2) {\n    console.error(\"You need to specify at least some characters to search for.\");\n    process.exit(1);\n}\n\n// We use the string argument as the path to the resolver.\nvar resolverPath = argv._.shift();\n// All other arguments are passed as the search query\nvar searchQuery = argv._.join(\" \");\n\n// All -/-- arguments will be added to the config.\n// If --config is specified, we will instead load them from the config file.\nvar resolverConfig = argv;\nif (argv.hasOwnProperty(\"config\")) {\n    // FIXME: Add support for absolute paths\n    resolverConfig = require(\"../\" + argv.config);\n} else {\n    delete resolverConfig._;\n}\n\nvar resolver = {};\n\nutils.loadAxe(resolverPath, resolver, function () {\n    resolver.context.on('track-result', function (qid, result) {\n        console.dir(result);\n    });\n    resolver.instance.search(\"qid\", searchQuery);\n}, resolverConfig);\n"
  },
  {
    "path": "tools/urllookup.js",
    "content": "var argv = require('minimist')(process.argv.slice(2));\nvar utils = require('../test/utils.js');\n\nif (argv._.length < 1) {\n    console.error(\"Please specify a single resolver\");\n    process.exit(1);\n}\n\nif (argv._.length < 2) {\n    console.error(\"You need to specify an URL which shall be looked up.\");\n    process.exit(1);\n}\n\n// We use the string argument as the path to the resolver.\nvar resolverPath = argv._[0];\nvar url = argv._[1];\n\n// All -/-- arguments will be added to the config.\n// TODO: Add an agurment to load the config from a file.\nvar resolverConfig = argv;\nif (argv.hasOwnProperty(\"config\")) {\n    // FIXME: Add support for absolute paths\n    resolverConfig = require(\"../\" + argv.config);\n} else {\n    delete resolverConfig._;\n}\n\nvar resolver = {};\n\nutils.loadAxe(resolverPath, resolver, function () {\n    if (!resolver.context.hasCapability('urllookup')) {\n        console.error(\"Resolver does not support URLLookup.\");\n    } else {\n        resolver.context.on('url-result', function (url, result) {\n            console.dir(result);\n        });\n\n        if (resolver.instance.canParseUrl(url)) {\n            resolver.instance.lookupUrl(url);\n        } else {\n            console.error(\"Resolver cannot lookup URLs of the given type.\");\n        }\n    }\n}, resolverConfig);\n"
  },
  {
    "path": "vibe3/content/contents/code/vibe3.js",
    "content": "/*\n *   Copyright 2014, Lorenz Hübschle-Schneider <lorenz@4z2.de>\n *   Copyright 2014, Thierry Göckel <thierry@strayrayday.lu>\n *\n *   The MIT License (MIT)\n *\n *   Permission is hereby granted, free of charge, to any person obtaining a copy\n *   of this software and associated documentation files (the \"Software\"), to deal\n *   in the Software without restriction, including without limitation the rights\n *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n *   copies of the Software, and to permit persons to whom the Software is\n *   furnished to do so, subject to the following conditions:\n *\n *   The above copyright notice and this permission notice shall be included in\n *   all copies or substantial portions of the Software.\n *\n *   THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n *   FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n *   COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n *   IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n *   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n// DOMParser polyfill, slightly modified version of\n// https://gist.github.com/eligrey/1129031 (public domain)\n(function(DOMParser) {\n    \"use strict\";\n    var DOMParser_proto = DOMParser.prototype,\n        real_parseFromString = DOMParser_proto.parseFromString;\n\n    // Firefox/Opera/IE throw errors on unsupported types\n    try {\n        // WebKit returns null on unsupported types\n        if ((new DOMParser()).parseFromString(\"\", \"text/html\")) {\n            // text/html parsing is natively supported\n            return;\n        }\n    } catch (ex) {}\n\n    DOMParser_proto.parseFromString = function(markup, type) {\n        if (/^\\s*text\\/html\\s*(?:;|$)/i.test(type)) {\n            var doc = document.implementation.createHTMLDocument(\"\"),\n                doc_elt = doc.documentElement,\n                first_elt;\n\n            doc_elt.innerHTML = markup;\n            first_elt = doc_elt.firstElementChild;\n\n            if (doc_elt.childElementCount === 1 &&\n                first_elt.localName.toLowerCase() === \"html\") {\n                doc.replaceChild(first_elt, doc_elt);\n            }\n\n            return doc;\n        } else {\n            return real_parseFromString.apply(this, arguments);\n        }\n    };\n}(DOMParser));\n\n\nvar Vibe3Resolver = Tomahawk.extend(TomahawkResolver, {\n    settings: {\n        name: 'vibe3',\n        icon: '../images/icon.png',\n        weight: 80,\n        timeout: 10\n    },\n    init: function () {\n        // Add URL handler for vibe3:// urls\n        // We need this for adding the \"Referer\" header to the mp3 URL\n        Tomahawk.addCustomUrlHandler(\"vibe3\", \"getStreamUrl\", true);\n    },\n    resolve: function (qid, artist, album, title) {\n        // build query\n        var query = [title, artist].join(\" \").trim(),\n            url = \"http://vibe3.com/searchProxy.php\",\n            that = this;\n\n        // Vibe3 has issues with diacritics, remove them\n        query = Tomahawk.removeDiacritics(query);\n\n        // Send request\n        Tomahawk.asyncRequest(url, function (xhr) {\n            // parse xml\n            var domParser = new DOMParser(),\n                xmlDoc = domParser.parseFromString(xhr.responseText, \"text/html\"),\n                tracks = xmlDoc.getElementsByTagName(\"li\"),\n                track, rawUrl, mp3url, artist, track_title, i,\n                results = [],\n                encodedQuery = encodeURIComponent(query.replace(\" \", \"_\").toLowerCase()),\n                linkUrl = \"http://vibe3.com/mp3/\" + encodedQuery + \".html\";\n\n            // check the response\n            for (i = 0; i < tracks.length; i++) {\n                track = tracks[i];\n                // Need to access the URL via the download button instead of the player because the player\n                // has 'display:none\" and thus isn't available easily from the DOMParser\n                rawUrl = track.getElementsByClassName('downloadButton')[0].getAttribute('onclick');\n                // Return a vibe3:// URL instead of http so we can add the referer\n                mp3url = rawUrl.replace(/.*'http:\\/\\//,'vibe3://').replace(\"?dl=1'\",'');\n                artist = track.getElementsByTagName('a')[0].textContent.trim();\n                track_title = track.getElementsByClassName('songName')[0].textContent;\n                // Trim away the artist-title-separator and extra spaces\n                track_title = track_title.replace(' - ', '').trim();\n\n                if (artist !== \"\" && track_title !== \"\" && mp3url !== \"\") {\n                    results.push({\n                        artist: artist,\n                        track: track_title,\n                        source: that.settings.name,\n                        url: mp3url,\n                        linkUrl: linkUrl,\n                        extension: 'mp3',\n                        bitrate: 128,\n                        score: 0.80\n                    });\n                }\n            }\n            Tomahawk.addTrackResults({\n                qid: qid,\n                results: results\n            });\n        }, {\n            \"Content-Type\": \"application/x-www-form-urlencoded\"\n        }, {\n            method: \"POST\",\n            data: \"search=\" + query\n        });\n    },\n    getStreamUrl: function (qid, url) {\n        // Add a referer header. This is required or vibe3's hotlink protection\n        // will prevent us from retrieving the file\n        url = url.replace(\"vibe3://\", \"http://\");\n        var headers = {\n            \"Referer\": \"http://vibe3.com\"\n        };\n        Tomahawk.reportStreamUrl(qid, url, headers);\n    },\n    search: function (qid, searchString) {\n        this.resolve(qid, searchString);\n    }\n});\n\nTomahawk.resolver.instance = Vibe3Resolver;\n"
  },
  {
    "path": "vibe3/content/metadata.json",
    "content": "{\n    \"name\": \"vibe3\",\n    \"pluginName\": \"vibe3\",\n    \"author\": \"Lorenz Hübschle-Schneider and Thierry Göckel\",\n    \"email\": \"lorenz@4z2.de\",\n    \"version\": \"0.1.2\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Looks for tracks to play from www.vibe3.com.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/vibe3.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"resources\": []\n    }\n}\n"
  },
  {
    "path": "vkontakte/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>390</width>\n    <height>120</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>250</width>\n    <height>120</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::ExpandingFieldsGrow</enum>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Email</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"email_edit\"/>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"text\">\n        <string>Password</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"password_edit\">\n       <property name=\"echoMode\">\n        <enum>QLineEdit::Password</enum>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "vkontakte/content/contents/code/vkontakte.js",
    "content": "/* vk.com resolver for Tomahawk.\n *\n * Written in 2015 by Anton Romanov\n * API documentation: https://vk.com/dev\n *\n * Licensed under the Eiffel Forum License 2.\n */\n\nvar VkontakteResolver = Tomahawk.extend( Tomahawk.Resolver, {\n    apiVersion: 0.9,\n\n    //These are copied from kodi vk.com plugin\n    APP_ID : '2054573',\n    APP_KEY : 'KUPNPTTQGApLFVOVgqdx',\n    APP_SCOPE : 'audio',\n    API_VERSION : '5.34',\n\n    STORAGE_KEY : 'vk.com.access_token',\n\n    logged_in: null, // null, = not yet tried, 0 = pending, 1 = success, 2 = failed\n\n    _queue : Object.create(null), //we'll queue up resolve requests and execute them in batches\n    _batching : false, //did we already started batching?\n\n    settings: {\n        cacheTime: 300,\n        name: 'VK.com',\n        icon: '../images/icon.png',\n        weight: 75,\n        timeout: 8\n    },\n\n    getConfigUi: function() {\n        return {\n            \"widget\": Tomahawk.readBase64( \"config.ui\" ),\n            fields: [{\n                name: \"email\",\n                widget: \"email_edit\",\n                property: \"text\"\n            }, {\n                name: \"password\",\n                widget: \"password_edit\",\n                property: \"text\"\n            }]\n        };\n    },\n\n    /**\n     * Defines this Resolver's config dialog UI.\n     */\n    configUi: [\n        {\n            id: \"email\",\n            type: \"textfield\",\n            label: \"E-Mail\"\n        },\n        {\n            id: \"password\",\n            type: \"textfield\",\n            label: \"Password\",\n            isPassword: true\n        }\n    ],\n\n    newConfigSaved: function(config) {\n\n        var changed = this._email !== config.email || this._password !== config.password;\n\n        if (changed) {\n            this.init();\n        }\n    },\n\n    testConfig: function (config) {\n        return this._getLoginPromise(config).then(function (error) {\n            return Tomahawk.ConfigTestResultType.Success;\n        }, function (error) {\n            return Tomahawk.ConfigTestResultType.InvalidCredentials;\n        });\n    },\n\n    init: function() {\n        var config = this.getUserConfig();\n\n        this._email = config.email;\n        this._password = config.password;\n\n        if (!this._email || !this._password) {\n            //This is being called even for disabled ones\n            //throw new Error( \"Invalid configuration.\" );\n            Tomahawk.log(\"Invalid Configuration\");\n            return;\n        }\n        //Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup);\n\n        return this._login(config);\n    },\n\n    _apiCall: function (api, params) {\n        if (!this.logged_in || this.logged_in === 2) {\n            throw new Error('Not logged in, cannot _apiCall.');\n        }\n\n        params['access_token'] = this._access_token;\n        if(!params.hasOwnProperty('v'))\n            params['v'] = this.API_VERSION;\n\n        return Tomahawk.post(\"https://api.vk.com/method/\" + api, {\n            data: params\n        }).then(function (resp) {\n                if(resp.error)\n                {\n                    Tomahawk.log(JSON.stringify(resp));\n                    //14 is Captcha needed, TODO: Once Tomahawk will support\n                    //   showing this we need to show it to user\n                    //if (resp.error.error_code == 14)\n                    //Captcha error response will contain the following:\n                    //  captcha_sid  - id for captcha\n                    //  captcha_img  - url for captcha image\n                    //\n                    //To validate it you need to add\n                    //  captcha_sid - id of the captcha you presented to user\n                    //  captcha_key - text of captcha image\n                    //to subsequent requests\n                    if(resp.error.error_msg)\n                        throw new Error(\"VK.com api call error: \" + resp.error.error_msg);\n                    else\n                        throw new Error(\"VK.com api call error: \" + JSON.stringify(resp));\n                }\n                return resp;\n            },\n            function (error) {\n                throw new Error(\"VK.com api call error: \" + JSON.stringify(error));\n            }\n        );\n    },\n\n    _parseUrlPrefix: function (url) {\n        var match = url.match( /(?:https?:\\/\\/)?(?:www\\.)?vk\\.com\\/audios(\\d+)\\?album_id=(\\d+)/ );\n        // eg: http://vk.com/audios8178142?album_id=59520611\n        return match;\n    },\n\n    canParseUrl: function (url, type) {\n        url = this._parseUrlPrefix(url);\n        if (!url) return false;\n\n        return true;\n        switch (type) {\n            case TomahawkUrlType.Playlist:\n                return true;\n            default:\n                return false;\n        }\n    },\n\n    lookupUrl: function (url) {\n        this.lookupUrlPromise(url).then(function (result) {\n            Tomahawk.addUrlResult(url, result);\n        }).catch(function (e) {\n            Tomahawk.log(\"Error in lookupUrlPromise! \" + e);\n            Tomahawk.addUrlResult(url, null);\n        });\n    },\n\n    lookupUrlPromise: function (url) {\n        if (!this.logged_in || this.logged_in === 2) {\n            throw new Error('Not logged in, cannot lookupUrl');\n        }\n\n        var match = this._parseUrlPrefix(url);\n        var that = this;\n\n        if (!match[1])\n            throw new Error(\"Couldn't parse given URL: \" + url);\n\n        var owner = match[1];\n        var album = match[2];\n        var code = 'var owner = ' + owner + '; ' + \n                   'var album = ' + album + '; ' +\n                   'var albums = API.audio.getAlbums({owner_id: owner}).items; ' +\n                   'var l = albums.length - 1; ' +\n                   'var title = \"\"; ' +\n                   'while ( l >= 0 ) { ' +\n                   '    if ( albums[l].id == album ) { ' +\n                   '        title = albums[l].title; ' +\n                   '        l = -1; ' +\n                   '    } ' +\n                   '    l = l - 1 ; ' +\n                   '} ' +\n                   'var tracks = API.audio.get({album_id : album, owner_id : owner}).items; ' +\n                   'return { ' +\n                   '   title: title, ' +\n                   '   tracks: tracks, ' +\n                   '   type: \"playlist\" '+\n                   '};';\n\n        return this._apiCall('execute',{code: code}).then( function (response) {\n            response.response.tracks = response.response.tracks.map(that._convertTrack);\n            return response.response;\n        });\n    },\n\n    getStreamUrl : function (params) {\n        if (params.url.indexOf('http:') === 0 || params.url.indexOf('https:') === 0)\n        {\n            return {url: params.url};\n        }\n        var id = params.url.match( /vk:\\/\\/track\\/([_\\-\\d]+)/ )[1];\n        return this._apiCall('audio.getById', {audios : id}).then( function (response) {\n            return {url : response.response[0].url};\n        });\n    },\n\n    _convertTrack: function (entry) {\n        var escapeRegExp = function (string){\n            return string.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, \"\\\\$1\");\n        };\n\n        var artist = entry.artist;\n        var title = entry.title;\n        var album = null;\n    \n        var trackInfo = this;\n        if (trackInfo.title) {\n            //As vk.com doesn't really have an 'album' field,\n            //often tracks on vk.com are named in a similar fashion:\n            //artist: \"Vader - The Ultimate Incantation\"\n            //track: Decapitated Saints\n            //or \n            //track: 'Track Name (\"Album Name\")' etc\n            //this block is to workaround that\n            \n            if (entry.artist.toLowerCase().search(trackInfo.artist.toLowerCase()) != -1 &&\n                    entry.artist.toLowerCase().search(trackInfo.album.toLowerCase()) != -1)\n                //Assuming user put \"Vader - The Ultimate Incantation\" into\n                //artist\n            {\n                artist = trackInfo.artist;\n                album  = trackInfo.album;\n            }\n            else if (entry.title.toLowerCase().search(trackInfo.artist.toLowerCase()) != -1 &&\n                    entry.title.toLowerCase().search(trackInfo.title.toLowerCase()) != -1)\n                //track: 'Track Name (\"Album Name\")' \n            {\n                title = trackInfo.title;\n                album  = trackInfo.album;\n            }\n\n            var regex = new RegExp('[0-9\\ \\-\\.]+' + escapeRegExp(trackInfo.title), 'i');\n            //Track title looks like:\n            //  11. Decapitated Saints\n            if (entry.title.match(regex)) {\n                title = trackInfo.title;\n            }\n        }\n\n        return {\n            artist:     artist,\n            track:      title,\n            title:      title,\n            album:      album,\n            duration:   entry.duration,\n            hint:       'vk://track/' + entry.owner_id + '_' + entry.id,\n            url:        'vk://track/' + entry.owner_id + '_' + entry.id,\n            type:       \"track\",\n            checked:    true\n        };\n    },\n\n    search: function (searchparams) {\n        if (!this.logged_in || this.logged_in ===2) {\n            throw new Error('Not logged in, cannot search.');\n        }\n\n        var that = this;\n\n        var params = {\n            count: searchparams.limit || 300,\n            q: searchparams.query,\n        };\n\n        return this._apiCall('audio.search',params).then( function (response) {\n            return response.response.items.map(that._convertTrack);\n        });\n    },\n\n    _batchResolve: function (that) {\n        var saved_queue_full = that._queue;\n        that._batching = false;\n        that._queue = Object.create(null);\n        var saved_queue_qids = [];\n        for(var qid in saved_queue_full) {\n            saved_queue_qids.push(qid);\n        }\n\n        //Slice queue in chunks of 5 as VK has a bug with > 5 audio.search\n        //calls inside execute call\n        var executeBatchSize = 5;\n        var saved_queue = saved_queue_qids.splice(0, executeBatchSize);\n\n        var queries = [];\n        var count = 0;\n        var searchCount = 0;\n        for(var qid in saved_queue) {\n            qid = saved_queue[qid];\n            if ( searchCount >= executeBatchSize - 1 ) {\n                saved_queue_qids.push(qid);\n            } else {\n                qid = JSON.parse(qid);\n                if (qid[1] === '') {\n                    searchCount++;\n                    //empty album\n                    queries.push('{qid:\"' + encodeURIComponent(JSON.stringify(qid)) +\n                        '\",result:[API.audio.search({count:5,q:' +\n                        JSON.stringify(qid.join(' - ')) + '})]}');\n                } else {\n                    searchCount+=2;\n                    queries.push('{qid:\"' + encodeURIComponent(JSON.stringify(qid)) +\n                        '\",result:[API.audio.search({count:3,q:' +\n                        JSON.stringify(qid.join(' - ')) +\n                        '}),API.audio.search({count:3,q:' +\n                        JSON.stringify([qid[0],qid[2]].join(' - ')) +\n                        '})]}');\n                }\n            }\n            ++count;\n        }\n        Tomahawk.log(\"Sending \" + count + \" of queued resolve requests\");\n        var code = 'return [' + queries.join(',') + '];';\n        Tomahawk.log(\"Prepared 'execute' code:\" + code);\n        that._apiCall('execute', {code:code}).then(function(results) {\n            Tomahawk.log('got result ' + JSON.stringify(results));\n            for (var result in results.response) {\n                result = results.response[result];\n                var tracks = [];\n                tracks = tracks.concat.apply(tracks, result.result.map(function(item) {return item.items;}));\n                //Leave unique only\n                var u = {}, a = [];\n                for(var i = 0, l = tracks.length; i < l; ++i){\n                    if(u.hasOwnProperty(tracks[i].url)) {\n                        continue;\n                    }\n                    a.push(tracks[i]);\n                    u[tracks[i].url] = 1;\n                }\n                var _qid = JSON.parse(decodeURIComponent(result.qid));\n                tracks = a.map(that._convertTrack,\n                    {\n                        artist: _qid[0],\n                        album : _qid[1],\n                        title : _qid[2],\n                    });\n                for(var r in saved_queue_full[decodeURIComponent(result.qid)]) {\n                    Tomahawk.log('resolving' + decodeURIComponent(result.qid) + ' with ' + JSON.stringify(tracks));\n                    saved_queue_full[decodeURIComponent(result.qid)][r](tracks);\n                }\n            }\n        });\n        if (saved_queue_qids.length > 0)\n        {\n            //enqueue the ones we were not able to do back\n            for(var qid in saved_queue_qids) {\n                qid = saved_queue_qids[qid];\n                setTimeout(function(){ that._batchResolve(that); }, 1000);\n                that._batching = true;\n                that._queue[qid] = saved_queue_full[qid];\n            }\n        }\n    },\n\n    resolve: function (params) {\n        var that = this;\n\n        var qid = JSON.stringify([params.artist, params.album, params.track]);\n\n        var promise = new RSVP.Promise(function (resolve, reject) {\n            if(!(qid in that._queue)) {\n                that._queue[qid] = [];\n            }\n            that._queue[qid].push(resolve);\n        });\n\n        if (!(this._batching)) {\n            setTimeout(function(){ that._batchResolve(that); }, 1000);\n            this._batching = true;\n        }\n\n        return promise;\n    },\n\n    _getLoginPromise: function (config) {\n        var params = {\n            grant_type      : 'password',\n            client_id       : this.APP_ID,\n            client_secret   : this.APP_KEY,\n            username        : config.email.trim(),\n            password        : config.password.trim(),\n            scope           : this.APP_SCOPE,\n        };\n        return Tomahawk.get('https://oauth.vk.com/token', {\n                data: params\n            }\n        );\n    },\n\n    _login: function (config) {\n        // If a login is already in progress don't start another!\n        if (this.logged_in === 0) return;\n        this.logged_in = 0;\n\n        var that = this;\n        if (Tomahawk.localStorage) {\n            this._access_token = Tomahawk.localStorage.getItem(this.STORAGE_KEY);\n            if (this._access_token) {\n                this.logged_in = 1;\n                return;\n            }\n        }\n\n        this._loginPromise = this._getLoginPromise(config).then(\n            function (resp) {\n                Tomahawk.log(that.settings.name + \" successfully logged in.\");\n\n                that._access_token = resp.access_token;\n                that.logged_in = 1;\n                if (Tomahawk.localStorage)\n                    Tomahawk.localStorage.setItem(that.STORAGE_KEY, resp.access_token);\n            },\n            function (error) {\n                Tomahawk.log(that.settings.name + \" failed login.\");\n\n                delete that._access_token;\n                delete that._user_id;\n                if (Tomahawk.localStorage)\n                    Tomahawk.localStorage.removeItem(that.STORAGE_KEY);\n\n                that.logged_in = 2;\n            }\n        );\n        return this._loginPromise;\n    }\n});\n\nTomahawk.resolver.instance = VkontakteResolver;\n"
  },
  {
    "path": "vkontakte/content/metadata.json",
    "content": "{\n    \"name\": \"VK.com\",\n    \"pluginName\": \"vkontakte\",\n    \"author\": \"Anton Romanov\",\n    \"email\": \"theli.ua@gmail.com\",\n    \"version\": \"0.2.2\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Searches VKontakte (vk.com) for music to play. Requires free account\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/vkontakte.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"resources\": []\n    }\n}\n"
  },
  {
    "path": "youtube/content/contents/code/config.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>Form</class>\n <widget class=\"QWidget\" name=\"Form\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>301</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>300</width>\n    <height>300</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <widget class=\"QLabel\" name=\"header_image\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"pixmap\">\n      <pixmap>youtube.png</pixmap>\n     </property>\n     <property name=\"scaledContents\">\n      <bool>false</bool>\n     </property>\n     <property name=\"alignment\">\n      <set>Qt::AlignCenter</set>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <property name=\"sizeConstraint\">\n      <enum>QLayout::SetMinimumSize</enum>\n     </property>\n     <property name=\"fieldGrowthPolicy\">\n      <enum>QFormLayout::FieldsStayAtSizeHint</enum>\n     </property>\n     <property name=\"labelAlignment\">\n      <set>Qt::AlignCenter</set>\n     </property>\n     <property name=\"formAlignment\">\n      <set>Qt::AlignCenter</set>\n     </property>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QCheckBox\" name=\"covers\">\n       <property name=\"toolTip\">\n        <string>Check this if you want to include cover versions.</string>\n       </property>\n       <property name=\"text\">\n        <string>Include cover versions</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QCheckBox\" name=\"remixes\">\n       <property name=\"toolTip\">\n        <string>Check this if you want to include remixes.</string>\n       </property>\n       <property name=\"text\">\n        <string>Include remixes</string>\n       </property>\n       <property name=\"checked\">\n        <bool>false</bool>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"0\">\n      <widget class=\"QCheckBox\" name=\"live\">\n       <property name=\"toolTip\">\n        <string>Check this if you want to include live versions.</string>\n       </property>\n       <property name=\"text\">\n        <string>Include live versions</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"3\" column=\"0\">\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>Maximum audio bitrate:</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"3\" column=\"1\">\n      <widget class=\"QComboBox\" name=\"qualityDropdown\">\n       <property name=\"toolTip\">\n        <string>Choose your preferred(and also max) audio bitrate setting</string>\n       </property>\n       <property name=\"currentIndex\">\n        <number>2</number>\n       </property>\n       <item>\n        <property name=\"text\">\n         <string>128</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>192</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>256</string>\n        </property>\n       </item>\n      </widget>\n     </item>\n     <item row=\"4\" column=\"0\">\n      <widget class=\"QCheckBox\" name=\"debug\">\n       <property name=\"toolTip\">\n        <string>Check this to add verbose debug output.</string>\n       </property>\n       <property name=\"text\">\n        <string>Debug</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "youtube/content/contents/code/youtube.js",
    "content": "/*\n * Copyright (C) 2012 Hugo Lindström <hugolm84@gmail.com>\n * Copyright (C) 2011-2015 Thierry Göckel <thierry@strayrayday.lu>\n * Copyright (C) 2012 Leo Franchi <lfranchi@kde.org>\n * Copyright (C) 2015 Anton Romanov <theliua@gmail.com>\n * Copyright (C) 2015 Enno Gottschalk <mrmaffen@gmail.com>\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n * NOTICE: This resolver and its intent, is for demonstrational purposes only\n **/\n\nvar YoutubeResolver = Tomahawk.extend(Tomahawk.Resolver, {\n\n    apiVersion: 0.9,\n\n    settings: {\n        name: 'YouTube',\n        icon: 'youtube-icon.png',\n        weight: 70,\n        timeout: 15\n    },\n\n    hatchet: false,\n\n    bitratesToItags: {\n        // we are not including LIVE itags and the ones with audio bitrate < 64\n        // Of course we will also not include VIDEO-ONLY itags for this\n        // resolver \n        // Each one in order of prefefence\n        \"64\": [\n            //250,//DASH Audio only / Opus\n            5, //FLV 240o/ MP3\n            6 //FLV 270p/ MP3\n        ],\n        \"96\": [\n            83,//240p MP4/ AAC\n            18,//360p MP4/ AAC\n            82//360p MP4/ AAC\n        ],\n        \"128\": [\n            140,//DASH Audio only / AAC\n            171,//DASH Audio only / Vorbis\n            //100,//360p WebM/ Opus\n            34,//360p FLV/ AAC\n            //43,//360p WebM/ Opus\n            35//480p FLV/ AAC\n            //44,//480p WebM/ Opus\n        ],\n        \"160\": [\n            //251,//DASH Audio only / Opus\n        ],\n        \"192\": [\n            172,//DASH Audio only / Vorbis\n            //101,//360p WebM/ Opus\n            22,//720p MP4/ AAC\n            //45,//720p WebM/ Opus\n            //101,//720p WebM/ Opus\n            84,//720p MP4/ AAC\n            37,//1080p MP4/ AAC\n            //46,//1080p WebM/ Opus\n            85,//1080p MP4/ AAC\n            38//3072p MP4/ AAC\n        ],\n        \"256\": [\n            141//DASH Audio only / AAC\n        ]\n    },\n\n    bitrateSelectedIndexToBitrate: [\"128\", \"192\", \"256\"],\n\n    _apiKey: \"AIza\" + \"SyD22x7IqYZp\" + \"f3cn27wL98\" + \"MQg2FWnno_JHA\",\n\n    _apiUrl: \"https://www.googleapis.com/youtube/v3/\",\n\n    init: function () {\n        \"use strict\";\n\n        this.deobfuscateFunctions = {};\n\n        // Set userConfig here\n        var userConfig = this.getUserConfig();\n        if (Object.getOwnPropertyNames(userConfig).length > 0) {\n            this.includeCovers = userConfig.includeCovers;\n            this.includeRemixes = userConfig.includeRemixes;\n            this.includeLive = userConfig.includeLive;\n            this.qualityPreference = userConfig.qualityPreference || 2;\n            this.debugMode = userConfig.debugMode;\n        } else {\n            this.includeCovers = false;\n            this.includeRemixes = false;\n            this.includeLive = false;\n            this.qualityPreference = 2;\n            this.debugMode = 1;\n        }\n\n        // Protos\n        String.prototype.regexIndexOf = function (regex, startpos) {\n            var indexOf = this.substring(startpos || 0).search(regex);\n            return ( indexOf >= 0 ) ? ( indexOf + ( startpos || 0 ) ) : indexOf;\n        };\n        String.prototype.splice = function (idx, rem, s) {\n            return ( this.slice(0, idx) + s + this.slice(idx + Math.abs(rem)) );\n        };\n    },\n\n    getConfigUi: function () {\n        \"use strict\";\n\n        var uiData = Tomahawk.readBase64(\"config.ui\");\n        return {\n            \"widget\": uiData,\n            fields: [{\n                name: \"includeCovers\",\n                widget: \"covers\",\n                property: \"checked\"\n            }, {\n                name: \"includeRemixes\",\n                widget: \"remixes\",\n                property: \"checked\"\n            }, {\n                name: \"includeLive\",\n                widget: \"live\",\n                property: \"checked\"\n            }, {\n                name: \"qualityPreference\",\n                widget: \"qualityDropdown\",\n                property: \"currentIndex\"\n            }, {\n                name: \"debugMode\",\n                widget: \"debug\",\n                property: \"checked\"\n            }],\n            images: [{\n                \"youtube.png\": Tomahawk.readBase64(\"youtube.png\")\n            }]\n        };\n    },\n\n    /**\n     * Defines this Resolver's config dialog UI.\n     */\n    configUi: [\n        {\n            id: \"includeCovers\",\n            type: \"checkbox\",\n            label: \"Include cover versions\"\n        },\n        {\n            id: \"includeRemixes\",\n            type: \"checkbox\",\n            label: \"Include remix versions\"\n        },\n        {\n            id: \"includeLive\",\n            type: \"checkbox\",\n            label: \"Include live versions\"\n        },\n        {\n            id: \"qualityPreference\",\n            type: \"dropdown\",\n            label: \"Maximal audio quality\",\n            items: [\"128\", \"192\", \"256\"],\n            defaultValue: 2\n        },\n        {\n            id: \"debugMode\",\n            type: \"checkbox\",\n            label: \"Debug log output\"\n        }\n    ],\n\n    newConfigSaved: function (newConfig) {\n        \"use strict\";\n\n        this.includeCovers = newConfig.includeCovers;\n        this.includeRemixes = newConfig.includeRemixes;\n        this.includeLive = newConfig.includeLive;\n        this.qualityPreference = newConfig.qualityPreference || 2;\n        this.debugMode = newConfig.debugMode;\n    },\n\n    resolve: function (params) {\n        \"use strict\";\n\n        var artist = params.artist;\n        var album = params.album;\n        var track = params.track;\n\n        var that = this;\n\n        that._debugMsg(\"Resolving query - artist: \" + artist + \", album: \" + album\n            + \", track: \" + track);\n\n        return this._getAutoGeneratedResults(artist, track).then(function (results) {\n            if (results.length == 0) {\n                // We weren't able to find any auto-generated videos, so we now have to search for\n                // manually uploaded videos\n                return that._getManuallyUploadedResults(artist, track);\n            } else {\n                return results;\n            }\n        }).then(function (results) {\n            if (that.hatchet) {\n                // Hatchet doesn't need the track's duration\n                return results;\n            } else {\n                // But other clients do\n                return that._getDurations(results);\n            }\n        }).then(function (results) {\n            that._debugMsg(\"Found \" + results.length + \" results - artist: \" + artist\n                + \", album: \" + album + \", track: \" + track);\n            return results;\n        });\n    },\n\n    /**\n     * YouTube generates some videos automatically. There's a good chance that we will find a\n     * relevant result by explicitly searching for those auto-generated videos. Afterwards we parse\n     * the metadata from the page source.\n     */\n    _getAutoGeneratedResults: function (artist, track) {\n        var that = this;\n\n        that._debugMsg(\"Getting auto-generated results - artist: \" + artist + \", track: \" + track);\n        var url = this._apiUrl + 'search';\n        var q = (artist ? artist + \" \" : \"\") + track;\n        var settings = {\n            data: {\n                key: this._apiKey,\n                part: 'snippet',\n                maxResults: 1,\n                order: 'relevance',\n                type: 'video',\n                q: q + ' Auto-generated by YouTube'\n            }\n        };\n        if (this.hatchet) {\n            settings.data[\"videoEmbeddable\"] = true\n        }\n        return Tomahawk.get(url, settings).then(function (response) {\n            if (!response || !response.items || response.items.length == 0) {\n                that._debugMsg(\"apiCall in _getAutoGeneratedResults returned no results - artist: \"\n                    + artist + \", track: \" + track);\n                return [];\n            }\n            var url = 'https://www.youtube.com/watch';\n            var settings = {\n                data: {\n                    v: response.items[0].id.videoId\n                }\n            };\n            // Get the page source and parse metadata from that.\n            return Tomahawk.get(url, settings).then(function (page) {\n                var r = /\"content watch-info-tag-list\">[\\s]+<li>&quot;(.*?)&quot;\\s+by\\s+(.*?)\\s\\(<a[\\s]+href/mg;\n                var match = r.exec(page);\n                var results = [];\n                if (match) {\n                    var parsedTrackName = match[1];\n                    var parsedArtistName = match[2];\n                    var artistChannelRegExp = /<a[^>]+>([^<]+)/g;\n                    var artistChannelMatch = artistChannelRegExp.exec(parsedArtistName);\n                    if (artistChannelMatch) {\n                        parsedArtistName = artistChannelMatch[1];\n                    }\n                    that._debugMsg(\"Found 1 auto-generated result.\");\n                    results.push({\n                        track: Tomahawk.htmlDecode(parsedTrackName),\n                        artist: Tomahawk.htmlDecode(parsedArtistName),\n                        mimetype: \"video/h264\",\n                        youtubeVideoId: response.items[0].id.videoId,\n                        url: \"youtube://track/\" + response.items[0].id.videoId,\n                        linkUrl: \"https://www.youtube.com/watch?v=\" + response.items[0].id.videoId\n                    });\n                }\n                that._debugMsg(\"Found \" + results.length + \" auto-generated result - artist: \"\n                    + artist + \", track: \" + track);\n                return results;\n            });\n        });\n    },\n\n    /**\n     * This function searches for manually uploaded music videos on YouTube.\n     * We try to guess the track name from looking at the video title. The artist name of the result\n     * will always be the same that has been given as a parameter to this function.\n     */\n    _getManuallyUploadedResults: function (artist, track) {\n        var that = this;\n\n        that._debugMsg(\"Getting manually uploaded results - artist: \" + artist\n            + \", track: \" + track);\n        var url = this._apiUrl + 'search';\n        var q = (artist ? artist + \" \" : \"\") + track;\n        var settings = {\n            data: {\n                key: this._apiKey,\n                part: 'snippet',\n                maxResults: 5,\n                order: 'relevance',\n                type: 'video',\n                q: q\n            }\n        };\n        if (this.hatchet) {\n            settings.data[\"videoEmbeddable\"] = true\n        }\n        return Tomahawk.get(url, settings).then(function (response) {\n            if (!response || !response.items || response.items.length == 0) {\n                that._debugMsg(\n                    \"apiCall in _getManuallyUploadedResults returned no results - artist: \"\n                    + artist + \", track: \" + track);\n                return [];\n            }\n            var results = [];\n            for (var i = 0; i < response.items.length; i++) {\n                var item = response.items[i];\n                // Check if the title-string contains the track name we are looking for. Also check\n                // if the artist name can be found in the title-string. Last but not least we make\n                // sure that we only include covers/remixes and live versions if the user wants us\n                // to.\n                if (!item || !item.snippet.title\n                    || item.snippet.title.toLowerCase().indexOf(artist.toLowerCase()) < 0\n                    || item.snippet.title.toLowerCase().indexOf(track.toLowerCase()) < 0\n                    || !that._isValidTrack(item.snippet.title, track)) {\n                    continue;\n                }\n\n                var guessedMetaData = that._guessMetaData(item.snippet.title);\n                var title = guessedMetaData ? guessedMetaData.track : item.snippet.title;\n\n                var result = {\n                    track: title,\n                    artist: artist,\n                    mimetype: \"video/h264\",\n                    year: item.snippet.publishedAt.slice(0, 4),\n                    youtubeVideoId: item.id.videoId,\n                    url: \"youtube://track/\" + item.id.videoId,\n                    linkUrl: \"https://www.youtube.com/watch?v=\" + response.items[0].id.videoId\n                };\n                results.push(result);\n            }\n            that._debugMsg(\"Found \" + results.length + \" manually uploaded results -  artist: \"\n                + artist + \", track: \" + track);\n            return results;\n        });\n    },\n\n    _guessMetaData: function (title) {\n        var matches = title.match(/\\s*(.+?)\\s*(?:\\s[-\\u2014]|\\s[\"']|:)\\s*[\"']?(.+?)[\"']?\\s*$/);\n        if (matches && matches.length > 2) {\n            return {\n                track: matches[2],\n                artist: matches[1]\n            };\n        }\n        matches = title.match(/\\s*(.+?)\\s*[-\\u2014]+\\s*(.+?)\\s*$/);\n        if (matches && matches.length > 2) {\n            return {\n                track: matches[2],\n                artist: matches[1]\n            };\n        }\n    },\n\n    search: function (params) {\n        \"use strict\";\n        var that = this;\n\n        that._debugMsg(\"Searching with query: '\" + params.query + \"'\");\n\n        var searchString = params.query;\n        var url = this._apiUrl + 'search';\n        var settings = {\n            data: {\n                part: \"snippet\",\n                key: this._apiKey,\n                maxResults: 25,\n                order: \"relevance\",\n                type: \"video\",\n                q: searchString\n            }\n        };\n        if (this.hatchet) {\n            settings.data[\"videoEmbeddable\"] = true\n        }\n        return Tomahawk.get(url, settings).then(function (resp) {\n            var results = [];\n            if (resp.pageInfo.totalResults !== 0) {\n                var total = resp.items.length;\n                for (var i = 0; i < total; i++) {\n                    if (resp.items[i] === undefined) {\n                        continue;\n                    }\n                    if (resp.items[i].id === undefined || resp.items[i].id.videoId === undefined) {\n                        continue;\n                    }\n                    if (resp.items[i].snippet === undefined || resp.items[i].snippet.title\n                        === undefined || resp.items[i].snippet.description === undefined) {\n                        continue;\n                    }\n                    // Dirty check, filters out the most of the unwanted results\n                    var searchFoundItem = resp.items[i].snippet.title.replace(/([^A-Za-z0-9\\s])/gi,\n                        \"\").replace(/(?:(?:^|\\n)\\s+|\\s+(?:$|\\n))/g, '').replace(/\\s+/g, '|');\n                    var searchStringItem = searchString.replace(/([^A-Za-z0-9\\s])/gi, \"\").replace(\n                        /(?:(?:^|\\n)\\s+|\\s+(?:$|\\n))/g, '').replace(/\\s+/g, '|');\n                    var matches = searchFoundItem.match(new RegExp(searchStringItem, \"gi\"));\n                    if (!matches) {\n                        continue;\n                    }\n                    var track = resp.items[i].snippet.title;\n                    var parsedTrack = that._cleanupAndParseTrack(track, searchString);\n\n                    if (!parsedTrack || parsedTrack.artist === undefined || parsedTrack.track\n                        === undefined) {\n                        continue;\n                    }\n                    var result = {};\n                    result.artist = parsedTrack.artist;\n                    result.track = parsedTrack.track;\n                    result.youtubeVideoId = resp.items[i].id.videoId;\n                    result.year = resp.items[i].snippet.publishedAt.slice(0, 4);\n                    result.url = \"youtube://track/\" + resp.items[i].id.videoId;\n                    result.linkUrl = \"https://www.youtube.com/watch?v=\" + result.youtubeVideoId;\n                    result.mimetype = \"video/h264\";\n                    results.push(result);\n                }\n            }\n            that._debugMsg(\"Search with query: '\" + params.query + \"' found \"\n                + results.length + \" results.\");\n            return that._filterOutUnknownTracks(results).then(function (results) {\n                return that._getDurations(results);\n            });\n        });\n    },\n\n    /**\n     * Check the given result candidates by asking audioscrobbler if the result's track is known.\n     */\n    _filterOutUnknownTracks: function (candidates) {\n        \"use strict\";\n\n        var that = this;\n\n        that._debugMsg(\"Filtering out unknown tracks for \" + candidates.length + \" results...\");\n\n        var results = [];\n        return RSVP.Promise.all(candidates.map(function (candidate) {\n            var url = 'http://ws.audioscrobbler.com/2.0/';\n            var settings = {\n                data: {\n                    method: \"track.getInfo\",\n                    api_key: \"b14d61bf2f7968731eb686c7b4a1516e\",\n                    format: \"json\",\n                    limit: 1,\n                    artist: candidate.artist,\n                    track: candidate.track\n                }\n            };\n            return Tomahawk.get(url, settings).then(function (response) {\n                if (response.track) {\n                    results.push(candidate);\n                }\n            });\n        })).then(function () {\n            that._debugMsg(results.length + \" results are left after filtering.\");\n            return results;\n        });\n    },\n\n    getStreamUrl: function (params) {\n        \"use strict\";\n\n        var url = params.url;\n\n        var that = this;\n        that._debugMsg(\"Getting stream url for \" + url);\n\n        var videoId = url.replace(\"youtube://track/\", \"\");\n        var query = \"https://www.youtube.com/watch?v=\" + videoId;\n        var settings = {\n            headers: {\n                'User-Agent': 'Mozilla/6.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0'\n            }\n        };\n        return Tomahawk.get(query, settings).then(function (html) {\n            // Now we can go further down, and check the ytplayer.config map\n            var streamMatch = html.match(/(ytplayer\\.config =)([^\\r\\n]+?});/);\n            if (!streamMatch) {\n                // Todo: Open window for user input?\n                var dasCaptcha = html.match(/www.google.com\\/recaptcha\\/api\\/challenge?/i);\n                if (dasCaptcha) {\n                    that._debugMsg(\n                        \"Failed to parse URL from YouTube page. Captcha limitation in place.\");\n                } else {\n                    that._debugMsg(\"Failed to find stream_map in YouTube page.\");\n                }\n            } else if (streamMatch[2]) {\n                try {\n                    var jsonMap = JSON.parse(streamMatch[2]);\n                    var urlPromise;\n                    if (jsonMap.args.adaptive_fmts) {\n                        urlPromise = that._parseURLS(jsonMap.args.adaptive_fmts, html);\n                        if (!urlPromise && jsonMap.args.url_encoded_fmt_stream_map) {\n                            urlPromise = that._parseURLS(jsonMap.args.url_encoded_fmt_stream_map,\n                                html);\n                        }\n                    } else if (jsonMap.args.dashmpd) {\n                        //Theoretically we could parse manifest, select quality\n                        //we want and then return it. \n                        //But it just doesn't seem to be worth it, unless\n                        //someone really wanna do it\n                        Tomahawk.log(\"Found MPEG-DASH, just letting VLC handle it\");\n                        urlPromise = {url: jsonMap.args.dashmpd};\n                    } else {\n                        Tomahawk.log(\"Couldn't find MPEG-DASH manifest or adaptive_fmts, aborting\");\n                    }\n                    if (urlPromise) {\n                        return RSVP.Promise.resolve(urlPromise).then(function (result) {\n                            that._debugMsg(\"Found stream url for \" + params.url + \": \"\n                                + result.url);\n                            return {\n                                url: result.url\n                            }\n                        });\n                    } else {\n                        that._debugMsg(\"Error: Wasn't able to get streaming URL for \" + params.url);\n                    }\n                } catch (e) {\n                    that._debugMsg(\"Exception in getStreamurl: \" + e);\n                }\n            }\n        });\n    },\n\n    _debugMsg: function (msg) {\n        \"use strict\";\n        if (msg.toLowerCase().indexOf(\"assert\") === 0) {\n            Tomahawk.log(this.settings.name + msg);\n        } else if (this.debugMode) {\n            Tomahawk.log(this.settings.name + \" debug: \" + msg);\n        }\n    },\n\n    _isValidTrack: function (trackTitle, origTitle) {\n        \"use strict\";\n\n        if (!this.includeCovers &&\n            trackTitle.search(/cover/i) >= 0 &&\n            origTitle.search(/cover/i) < 0) {\n            return false;\n        }\n        if (!this.includeRemixes &&\n            trackTitle.search(/mix/i) >= 0 &&\n            origTitle.search(/mix/i) < 0) {\n            return false;\n        }\n        if (!this.includeLive &&\n            trackTitle.search(/live/i) >= 0 &&\n            origTitle.search(/live/i) < 0) {\n            return false;\n        }\n        return true;\n    },\n\n    _cleanupAndParseTrack: function (title, searchString) {\n        \"use strict\";\n\n        var result = {};\n        // For the ease of parsing, remove these\n        // Maybe we could up the score a bit?\n        if (title.regexIndexOf(\n                /(?:[([](?=(official))).*?(?:[)\\]])|(?:(official|video)).*?(?:(video))/i, 0)\n            !== -1) {\n            title = title.replace(/(?:[([](?=(official|video))).*?(?:[)\\]])/gi, \"\");\n            title = title.replace(/(official|video(?:([!:-])))/gi, \"\");\n            result.isOfficial = 1;\n        }\n        result.query = title;\n        // Sometimes users separate titles with quotes :\n        // eg, \"\\\"Young Forever\\\" Jay Z | Mr. Hudson (OFFICIAL VIDEO)\"\n        // this will parse out the that title\n        var inQuote = title.match(/([\"'])(?:(?=(\\\\?))\\2.).*\\1/g);\n        if (inQuote && inQuote !== undefined) {\n            result.track = inQuote[0].substr(1, inQuote[0].length - 2);\n            title = title.replace(inQuote[0], '');\n            result.fromQuote = result.track;\n            result.parsed = this._parseCleanTrack(title);\n            if (result.parsed) {\n                result.parsed.track = result.track;\n                return result.parsed;\n            }\n        } else {\n            result.parsed = this._parseCleanTrack(title);\n            if (result.parsed) {\n                return result.parsed;\n            }\n        }\n\n        // Still no luck, lets go deeper\n        if (!result.parsed) {\n            if (title.toLowerCase().indexOf(searchString.toLowerCase()) !== -1) {\n                result.parsed = this._parseCleanTrack(\n                    title.replace(new RegExp(this._escapeRegExp(searchString), \"gi\"),\n                        searchString.concat(\" :\")));\n            } else {\n                var tryMatch = searchString.replace(/(?:[-–—|:&])/g, \" \");\n                if (title.toLowerCase().indexOf(tryMatch.toLowerCase()) !== -1) {\n                    var replaceWith;\n                    if (title.regexIndexOf(/(?:[-–—|:&])/g, 0) !== -1) {\n                        replaceWith = searchString;\n                    } else {\n                        replaceWith = searchString.concat(\" : \");\n                    }\n                    result.parsed = this._parseCleanTrack(\n                        title.replace(new RegExp(tryMatch, \"gi\"), replaceWith));\n                }\n            }\n        }\n\n        if (result.fromQuote && result.fromQuote !== undefined) {\n            if (result.parsed) {\n                result.artist = result.parsed.artist;\n            }\n            result.track = result.fromQuote;\n        } else if (result.parsed) {\n            if (result.parsed.artist !== undefined) {\n                result.artist = result.parsed.artist;\n            }\n            if (result.parsed.track !== undefined) {\n                result.track = result.parsed.track;\n            }\n        }\n        delete result.parsed;\n        return result;\n    },\n\n    _parseCleanTrack: function (track) {\n        \"use strict\";\n\n        var result = {};\n        result.query = track;\n        result.query.replace(/.*?(?=([-–—:|]\\s))/g, function (param) {\n            if (param.trim() !== \"\") {\n                if (result.artist === undefined) {\n                    result.artist = param;\n                } else {\n                    if (result.track === undefined) {\n                        result.track = param;\n                    }\n                }\n            }\n        });\n\n        result.query.replace(/(?=([-–—:|]\\s)).*/g, function (param) {\n            if (param.trim() !== \"\") {\n                if (param.regexIndexOf(/([-–—|:]\\s)/g, 0) === 0) {\n                    if (result.track === undefined) {\n                        result.track = param.replace(/([-–—|:]\\s)/g, \"\");\n                    }\n                } else {\n                    if (result.artist === undefined) {\n                        result.artist = param;\n                    }\n                    result.track = result.replace(/([-–—|:]\\s)/g, \"\");\n                }\n            }\n        });\n\n        if (result.track !== undefined && result.artist !== undefined) {\n            // Now, lets move featuring to track title, where it belongs\n            var ftmatch = result.artist.match(\n                /(?:(\\s)(?=(feat.|feat|ft.|ft|featuring)(?=(\\s)))).*/gi);\n            if (ftmatch) {\n                result.artist = result.artist.replace(ftmatch, \"\");\n                result.track += \" \" + ftmatch;\n            }\n            // Trim\n            result.track =\n                result.track.replace(/(?:(?:^|\\n)\\s+|\\s+(?:$|\\n))/g, '').replace(/\\s+/g, ' ');\n            result.artist =\n                result.artist.replace(/(?:(?:^|\\n)\\s+|\\s+(?:$|\\n))/g, '').replace(/\\s+/g, ' ');\n            return result;\n        }\n        return null;\n    },\n\n    /**\n     * Fetch the durations for the given results\n     */\n    _getDurations: function (results) {\n        \"use strict\";\n\n        var that = this;\n\n        that._debugMsg(\"Getting durations for \" + results.length + \" results...\");\n        var url = this._apiUrl + 'videos';\n        var settings = {\n            data: {\n                key: this._apiKey,\n                part: 'contentDetails',\n                id: results.map(function (r) {\n                    return r.youtubeVideoId;\n                }).join(',')\n            }\n        };\n        return Tomahawk.get(url, settings).then(function (response) {\n            that._debugMsg(\"Received durations for \" + response.items.length + \" results.\");\n            for (var i = 0; i < response.items.length; i++) {\n                var rawDuration = response.items[i].contentDetails.duration;\n                results[i].duration = that._iso8601toSeconds(rawDuration);\n            }\n            return results;\n        });\n    },\n\n    _iso8601toSeconds: function (iso8601) {\n        \"use strict\";\n\n        var matches = iso8601.match(/[0-9]+[HMS]/g);\n        var seconds = 0;\n        matches.forEach(function (part) {\n            var unit = part.charAt(part.length - 1);\n            var amount = parseInt(part.slice(0, -1), 10);\n            switch (unit) {\n                case 'H':\n                    seconds += amount * 60 * 60;\n                    break;\n                case 'M':\n                    seconds += amount * 60;\n                    break;\n                case 'S':\n                    seconds += amount;\n                    break;\n                default:\n                    Tomahawk.log(\"Erroneous ISO8601 format: \" + iso8601);\n                    break;\n            }\n        });\n        return seconds;\n    },\n\n    _parseURLS: function (rawUrls, html) {\n        \"use strict\";\n\n        var that = this;\n        var urlArray = rawUrls.split(/,/g).map(function (r) {\n            return that._parseQueryString(r);\n        });\n        //Start from the top with the user-preferred/max quality and go down from that\n        that._debugMsg('rawUrls : ' + JSON.stringify(rawUrls));\n        var qualityPref =\n            Math.min(that.qualityPreference, that.bitrateSelectedIndexToBitrate.length - 1);\n        for (var i = qualityPref; i >= 0; --i) {\n            var itags = that.bitratesToItags[that.bitrateSelectedIndexToBitrate[i]];\n            for (var itagI = 0; itagI < itags.length; ++itagI) {\n                var itag = itags[itagI];\n                var params = (function (itag) {\n                    that._debugMsg('trying itag : ' + itag.toString());\n                    var prefUrl = urlArray.filter(function (params) {\n                        return params['itag'] == itag;\n                    });\n                    if (prefUrl.length > 0) {\n                        var params = prefUrl[0];\n                        that._debugMsg(JSON.stringify(params));\n\n                        if (params.sig) {\n                            params.url += '&signature=' + params.sig;\n                            return params;\n                        } else if (params.s) {\n                            //lets try to extract deobfuscation function automatically\n                            //URL list for future testing, please append the new ones so\n                            //that if anything breaks we can make sure our code works on\n                            //all variants we have seen so far\n                            //  s.ytimg.com/yts/jsbin/html5player-new-en_US-vflOWWv0e/html5player-new.js\n                            //  s.ytimg.com/yts/jsbin/html5player-new-en_US-vflCeB3p5/html5player-new.js\n                            //  s.ytimg.com/yts/jsbin/html5player-new-en_US-vfliM_xst/html5player-new.js\n                            //  s.ytimg.com/yts/jsbin/html5player-new-en_US-vflt2Xpp6/html5player-new.js\n                            //  s.ytimg.com/yts/jsbin/player-en_US-vflnrstgx/base.js\n                            //  etc...etc\n                            //\n                            var ASSETS_RE = /\"assets\":.+?\"js\":\\s*(\"[^\"]+\")/;\n                            var assetsMatch = html.match(ASSETS_RE);\n                            if (assetsMatch) {\n                                var js_player_url = JSON.parse(assetsMatch[1]);\n                                if (js_player_url.indexOf('//') === 0) {\n                                    js_player_url = 'https:' + js_player_url;\n                                }\n                                else if (js_player_url.indexOf('//') === -1) {\n                                    js_player_url = 'https://youtube.com' + js_player_url;\n                                }\n                                that._debugMsg('player js: ' + js_player_url);\n                                var dec;\n                                if (js_player_url in that.deobfuscateFunctions) {\n                                    that._debugMsg('Deobfuscation code already available');\n                                    dec = that.deobfuscateFunctions[js_player_url];\n                                } else {\n                                    dec = Tomahawk.get(js_player_url).then(function (code) {\n                                        //Extract top signature deobfuscation function name\n                                        var decrypt_function_REs = [ \n                                            /\\.sig\\|\\|([a-zA-Z0-9$]+)\\(/ ,\n                                            /(?:[\\\"\\'])signature\\1\\s*,\\s*([a-zA-Z0-9$]+)\\(/ ,\n                                            /yt\\.akamaized\\.net\\/\\)\\s*\\|\\|\\s*.*?\\s*c\\s*&&\\s*d\\.set\\([^,]+\\s*,\\s*([a-zA-Z0-9$]+)\\(/,\n                                            /\\bc\\s*&&\\s*d\\.set\\([^,]+\\s*,\\s*\\([^)]*\\)\\s*\\(\\s*([a-zA-Z0-9$]+)\\(/,\n                                            /\\bc\\s*&&\\s*d\\.set\\([^,]+\\s*,\\s*([a-zA-Z0-9$]+)\\(/\n                                        ];\n\n                                        var fname;\n                                        decrypt_function_REs.some(function(re){\n                                            fname = code.match(re);\n\n                                            if (fname) {\n                                                fname = fname[1];\n                                                return true;\n                                            } \n                                            return false;\n                                        });\n\n                                        if (fname) {\n                                            that._debugMsg('Deobfuscate function name: ' + fname);\n                                            var func = that._extractFunction(code, fname);\n                                            that._debugMsg(\n                                                'Extracted deobfuscation code is:' + func);\n                                            that.deobfuscateFunctions[js_player_url] = {\n                                                code: func,\n                                                name: fname\n                                            };\n                                            return that.deobfuscateFunctions[js_player_url];\n                                        } else {\n                                            Tomahawk.log(\"Failed to extract signature function name\");\n                                        }\n                                    });\n                                }\n                                return RSVP.Promise.all([dec, params]).then(function (data) {\n                                    var params = data[1];\n                                    var dec = data[0];\n                                    if (dec) {\n                                        that._debugMsg(\"Will try to eval: '\" +\n                                            dec.code + ';' + dec.name + '(\\\"' + params.s + \"\\\")'\");\n                                        params.url += '&signature=' + eval(\n                                                dec.code + ';' + dec.name + '(\"' + params.s + '\");');\n                                        return params;\n                                    }\n                                });\n                            }\n                        } else {\n                            return params;\n                        }\n                    }\n                })(itag);\n                if (params) {\n                    return params;\n                }\n            }\n        }\n    },\n\n    _parseQueryString: function (queryString) {\n        var params = {}, queries, temp, i, l;\n\n        // Split into key/value pairs\n        queries = queryString.split(\"&\");\n\n        // Convert the array of strings into an object\n        for (i = 0, l = queries.length; i < l; i++) {\n            temp = queries[i].split('=');\n            params[temp[0]] = decodeURIComponent(temp[1]);\n        }\n\n        return params;\n    },\n\n    _extractFunction: function (code, name, known_objects) {\n        this._debugMsg('Extracting function:' + name);\n        var functionCode = '';\n        if (typeof known_objects === 'undefined') {\n            known_objects = {\n                names: [name]\n            };\n        }\n        var f_RE = new RegExp('(?:function\\\\s+' + this._escapeRegExp(name) + '|[{;,]\\\\s*'\n            + this._escapeRegExp(name) + '\\\\s*=\\\\s*function|var\\\\s+' +\n            this._escapeRegExp(name) + '\\\\s*=\\\\s*function)\\\\s*\\\\(([^)]*)\\\\)\\\\s*\\\\{([^}]+)\\\\}');\n        this._debugMsg(f_RE.source);\n        var f_match = code.match(f_RE);\n        if (f_match) {\n            this._debugMsg('Args for function ' + name + ' is: ' + f_match[1]);\n            this._debugMsg('Body for function ' + name + ' is: ' + f_match[2]);\n            var args = f_match[1].split(',');\n            known_objects.names = known_objects.names.concat(args);\n            this._debugMsg(JSON.stringify(known_objects));\n            var statements = f_match[2].split(';');\n            for (var i = 0; i < statements.length; i++) {\n                var stmt = statements[i].trim();\n                var callRE = /(?:^|[=\\+\\s-]+)([a-zA-Z$0-9\\.]+)\\s*\\(/gm;\n                var match;\n                this._debugMsg('Processing stmt:' + stmt);\n                while ((match = callRE.exec(stmt)) !== null) {\n                    this._debugMsg('Processing call:' + match[1]);\n                    var split = match[1].split('.');\n                    if (split.length == 1) {\n                        //function\n                        if (known_objects.names.indexOf(split[0]) == -1) {\n                            functionCode += this._extractFunction(code, split[0], known_objects);\n                            known_objects.names.push(split[0]);\n                        }\n                    } else {\n                        //object\n                        this._debugMsg('see if object is known:' + split[0]);\n                        this._debugMsg(known_objects.names.indexOf(split[0]).toString());\n                        if (known_objects.names.indexOf(split[0]) == -1) {\n                            functionCode += this._extractObject(code, split[0]);\n                            known_objects.names.push(split[0]);\n                        }\n                    }\n                }\n            }\n            return functionCode + 'function ' + name + '(' + f_match[1] + '){' +\n                f_match[2] + ';}';\n        }\n        return null;\n    },\n\n    _extractObject: function (code, name) {\n        //For now objects we need to extract were always self contained so we\n        //just regex-extract it and return\n        this._debugMsg('Extracting object:' + name);\n        var objectRE = new RegExp('(?:var\\\\s+)?' + this._escapeRegExp(name)\n            + '\\\\s*=\\\\s*\\\\{\\\\s*(([a-zA-Z$0-9]+\\\\s*:\\\\s*function\\\\([\\\\S\\\\s]*?\\\\)\\\\s*\\\\{[\\\\S\\\\s]*?\\\\})*)\\\\}\\\\s*;');\n        this._debugMsg(objectRE.source);\n        var obj_M = code.match(objectRE);\n        return obj_M[0];\n    },\n\n    _escapeRegExp: function (str) {\n        return str.replace(/[\\-\\[\\]\\/\\{}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n    }\n});\n\nTomahawk.resolver.instance = YoutubeResolver;\n"
  },
  {
    "path": "youtube/content/metadata.json",
    "content": "{\n    \"name\": \"YouTube\",\n    \"pluginName\": \"youtube\",\n    \"author\": \"Hugo, Leo, Thierry, Anton and Enno\",\n    \"email\": \"lfranchi@kde.org\",\n    \"version\": \"0.9.28\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Searches YouTube for audio content to play.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/youtube.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"resources\": [\n            \"contents/code/config.ui\",\n            \"contents/code/youtube-icon.png\",\n            \"contents/code/youtube.png\"\n        ]\n    }\n}\n"
  },
  {
    "path": "youtube-metadata/content/contents/code/youtube-metadata.js",
    "content": "/*\n* Copyright (C) 2014 Thierry Gckel <thierry@strayrayday.lu>\n*\n* This program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Affero General Public License as published by\n* the Free Software Foundation, either version 3 of the License, or\n* (at your option) any later version.\n*\n* This program is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Affero General Public License for more details.\n*\n* You should have received a copy of the GNU Affero General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n**/\n\nvar YoutubeMetadataResolver = Tomahawk.extend(TomahawkResolver, {\n\n    settings: {\n        name: 'YouTube Metadata',\n        icon: 'youtube-icon.png',\n        weight: 0, // not a resolver\n        timeout: 15\n    },\n\n    init: function (callback) {\n        String.prototype.regexIndexOf = function (regex, startpos) {\n            var indexOf = this.substring(startpos || 0).search(regex);\n            return (indexOf >= 0) ? (indexOf + (startpos || 0 )) : indexOf;\n        };\n        String.prototype.capitalise = function () {\n            return this.toLowerCase().replace(/(?:^|\\s)\\S/g, function(a) { return a.toUpperCase(); });\n        };\n        Tomahawk.PluginManager.registerPlugin(\"linkParser\", this);\n        if (callback){\n            callback(null);\n        }\n    },\n\n    cleanupAndParseTrack: function(title) {\n        var result = {};\n        // For the ease of parsing, remove these\n        if (title.regexIndexOf(/(?:[([](?=(official))).*?(?:[)\\]])|(?:(official|video)).*?(?:(video))/i, 0) !== -1){\n            title = title.replace(/(?:[([](?=(official|video))).*?(?:[)\\]])/gi, \"\");\n            title = title.replace(/(official|video(?:([!:-])))/gi, \"\");\n            result.isOfficial = 1;\n        }\n        result.query = title;\n        // Sometimes users separate titles with quotes :\n        // eg, \"\\\"Young Forever\\\" Jay Z | Mr. Hudson (OFFICIAL VIDEO)\"\n        // this will parse out the that title\n        var inQuote = title.match(/([\"\"'])(?:(?=(\\\\?))\\2.).*\\1/g);\n        if (inQuote && inQuote !== undefined){\n            result.track = inQuote[0].substr(1, inQuote[0].length - 2);\n            title = title.replace(inQuote[0], '');\n            result.fromQuote = result.track;\n            result.parsed = this.parseCleanTrack(title);\n            if (result.parsed){\n                result.parsed.track = result.track;\n                return result.parsed;\n            }\n        } else {\n            result.parsed = this.parseCleanTrack(title);\n            if (result.parsed){\n                return result.parsed;\n            }\n        }\n        return result;\n    },\n\n    parseCleanTrack: function(track) {\n        var result = {};\n        result.query = track;\n        result.query.replace(/.*?(?=([-:|]\\s))/g, function (param) {\n            if (param.trim() !== \"\"){\n                if (result.artist === undefined){\n                    result.artist = param;\n                } else {\n                    if (result.track === undefined){\n                        result.track = param;\n                    }\n                }\n            }\n        });\n        result.query.replace(/(?=([-:|]\\s)).*/g, function (param) {\n            if (param.trim() !== \"\"){\n                if (param.regexIndexOf(/([-|:]\\s)/g, 0) === 0){\n                    if (result.track === undefined){\n                        result.track = param.replace(/([-|:]\\s)/g, \"\");\n                    }\n                } else {\n                    if (result.artist === undefined){\n                        result.artist = param;\n                    }\n                    result.track = result.replace(/([-|:]\\s)/g, \"\");\n                }\n            }\n        });\n        if (result.track !== undefined && result.artist !== undefined){\n            // Now, lets move 'featuring' to track title, where it belongs\n            var ftmatch = result.artist.match( /(?:(\\s)(?=(feat.|feat|ft.|ft|featuring)(?=(\\s)))).*/gi );\n            if (ftmatch){\n                result.artist = result.artist.replace(ftmatch, \"\");\n                result.track += \" \" + ftmatch;\n            }\n            // Trim\n            result.track = result.track.replace(/(?:(?:^|\\n)\\s+|\\s+(?:$|\\n))/g,'').replace(/\\s+/g,' ');\n            result.artist = result.artist.replace(/(?:(?:^|\\n)\\s+|\\s+(?:$|\\n))/g,'').replace(/\\s+/g,' ');\n            delete result.query;\n            return result;\n        }\n        return null;\n    },\n\n    extractPlaylistItems: function (url, query, candidates){\n        var that = this;\n        Tomahawk.asyncRequest(query, function (xhr) {\n            var response = JSON.parse(xhr.responseText);\n            if (response.hasOwnProperty(\"items\") && response.items.length !== 0){\n                var totalResults = response.items.length;\n                for (var i = 0; i < totalResults; i++){\n                    if (!response.items[i].hasOwnProperty(\"snippet\") || !response.items[i].snippet.hasOwnProperty(\"title\")){\n                        continue;\n                    }\n                    var title = response.items[i].snippet.title;\n                    if (title.toLowerCase().match(/\\(full .*?\\)/g)){\n                        continue;\n                    }\n                    var parsedTrack = that.cleanupAndParseTrack(title);\n                    if (parsedTrack && parsedTrack.hasOwnProperty(\"artist\") && parsedTrack.hasOwnProperty(\"track\")){\n                        parsedTrack.position = response.items[i].snippet.position;\n                        candidates.push(parsedTrack);\n                    }\n                }\n                if (response.hasOwnProperty(\"nextPageToken\")){\n                    if (query.indexOf(\"&pageToken\") !== -1){\n                        query = query.substring(0, query.indexOf(\"&pageToken=\")) + \"&pageToken=\" + response.nextPageToken;\n                    } else {\n                        query = query + \"&pageToken=\" + response.nextPageToken;\n                    }\n                    that.extractPlaylistItems(url, query, candidates);\n                } else {\n                    that.verify(url, candidates);\n                }\n            } else {\n                Tomahawk.addUrlResult(url, {});\n            }\n        });\n    },\n\n    verify: function (url, candidates){\n        var stop = candidates.length;\n        var query = \"\";\n        var result = {};\n        result.tracks = [];\n        candidates.forEach(function (candidate){\n            query = \"http://ws.audioscrobbler.com/2.0/?method=track.getCorrection&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&artist=\" + encodeURIComponent(candidate.artist) + \"&track=\" + encodeURIComponent(candidate.track);\n            Tomahawk.asyncRequest(query, function (xhr) {\n                var response = JSON.parse(xhr.responseText);\n                var track = {};\n                if (response.hasOwnProperty(\"corrections\") && response.corrections.hasOwnProperty(\"correction\") && response.corrections.correction.hasOwnProperty(\"track\") && response.corrections.correction.track.hasOwnProperty(\"artist\")){\n                    track.type = \"track\";\n                    track.artist = response.corrections.correction.track.artist.name;\n                    track.title = response.corrections.correction.track.name;\n                    track.position = candidate.position;\n                    result.tracks.push(track);\n                } else if (response.hasOwnProperty(\"corrections\")){\n                    track.type = \"track\";\n                    track.title = candidate.track.capitalise();\n                    track.artist = candidate.artist.capitalise();\n                    track.position = candidate.position;\n                    result.tracks.push(track);\n                }\n                stop--;\n                if (stop === 0){\n                    if (result.tracks.length !== 0){\n                        result.tracks.sort(function(a,b){return (a.position > b.position) ? 1 : ((b.position > a.position) ? -1 : 0);});\n                        result.tracks.forEach(function(v){ delete v.position});\n                        result.type = \"playlist\";\n                        var begin = url.indexOf(\"&list=\") + 6;\n                        var playlistId = (url.indexOf(\"&\", begin) !== -1) ? url.substring(begin, Math.min(url.length, url.indexOf(\"&\", begin))) : (url.indexOf(\"#\", begin) !== -1) ? url.substring(begin, Math.min(url.length, url.indexOf(\"#\", begin))) : url.substring(begin, url.length);\n                        result.guid = \"youtube-playlist-\" + playlistId;\n                        result.title = \"YouTube Mix - \" + result.tracks[0].artist + \" - \" + result.tracks[0].title;\n                        Tomahawk.addUrlResult(url, result);\n                    } else {\n                        Tomahawk.addUrlResult(url, {});\n                    }\n                }\n            });\n        });\n    },\n\n    canParseUrl: function (url, type){\n        if (!(/https?:\\/\\/(www\\.)?youtube.com\\/watch\\?v=.*/).test(url))\n\t    return false;\n\n        switch (type){\n            case TomahawkUrlType.Album:\n                return false;\n            case TomahawkUrlType.Artist:\n                return false;\n            case TomahawkUrlType.Playlist:\n                return true;\n            case TomahawkUrlType.Track:\n                return true;\n            default:\n                return true;\n        }\n    },\n\n    lookupUrl: function (url){\n        var query = \"\";\n        var result = {};\n        var that = this;\n        var begin = -1;\n        if (url.indexOf(\"&list=\") === -1){\n            begin = url.indexOf(\"?v=\") + 3;\n            var videoId = (url.indexOf(\"&\", begin) !== -1) ? url.substring(begin, Math.min(url.length, url.indexOf(\"&\", begin))): url.substring(begin, url.length);\n            query = \"https://www.googleapis.com/youtube/v3/videos?part=snippet&id=\" + videoId + \"&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA\";\n            Tomahawk.asyncRequest(query, function (xhr) {\n                var response = JSON.parse(xhr.responseText);\n                if (response.hasOwnProperty(\"items\") && response.items.length !== 0){\n                    var title = response.items[0].snippet.title;\n                    var parsedTrack = that.cleanupAndParseTrack(title);\n                    if (parsedTrack && parsedTrack.hasOwnProperty(\"artist\") && parsedTrack.hasOwnProperty(\"track\")){\n                        query = \"http://ws.audioscrobbler.com/2.0/?method=track.getCorrection&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&limit=5&artist=\" + encodeURIComponent(parsedTrack.artist) + \"&track=\" + encodeURIComponent(parsedTrack.track);\n                        Tomahawk.asyncRequest(query, function (xhr2) {\n                            var response2 = JSON.parse(xhr2.responseText);\n                            if (response2.hasOwnProperty(\"corrections\")){\n                                if (response2.corrections.hasOwnProperty(\"correction\") && response2.corrections.correction.hasOwnProperty(\"track\") && response2.corrections.correction.track.hasOwnProperty(\"artist\")){\n                                    result.type = \"track\";\n                                    result.artist = response2.corrections.correction.track.artist.name;\n                                    result.title = response2.corrections.correction.track.name;\n                                } else {\n                                    result.type = \"track\";\n                                    result.artist = parsedTrack.artist.capitalise();\n                                    result.title = parsedTrack.track.capitalise();\n                                }\n                            }\n                            Tomahawk.addUrlResult(url, result);\n                        });\n                    } else {\n                        Tomahawk.addUrlResult(url, result);\n                    }\n                }\n            });\n        } else {\n            begin = url.indexOf(\"&list=\") + 6;\n            var playlistId = (url.indexOf(\"&\", begin) !== -1) ? url.substring(begin, Math.min(url.length, url.indexOf(\"&\", begin))) : (url.indexOf(\"#\", begin) !== -1) ? url.substring(begin, Math.min(url.length, url.indexOf(\"#\", begin))) : url.substring(begin, url.length);\n           query = \"https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=\" + playlistId + \"&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA&maxResults=50\";\n            this.extractPlaylistItems(url, query, []);\n        }\n    }\n});\n\nTomahawk.resolver.instance = YoutubeMetadataResolver;\n"
  },
  {
    "path": "youtube-metadata/content/metadata.json",
    "content": "{\n    \"name\": \"YouTube Metadata\",\n    \"pluginName\": \"youtube-metadata\",\n    \"author\": \"Thierry Göckel\",\n    \"email\": \"thierry@strayrayday.lu\",\n    \"version\": \"0.0.3\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Enables dropping YouTube URLs on Tomahawk.\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/youtube-metadata.js\",\n        \"scripts\": [],\n        \"icon\": \"contents/images/icon.png\",\n        \"resources\": [\"contents/code/youtube-icon.png\"]\n    }\n}\n"
  },
  {
    "path": "zaycevnet/content/contents/code/strstr.js",
    "content": "function strtr(str, from, to) {\n  //  discuss at: http://phpjs.org/functions/strtr/\n  // original by: Brett Zamir (http://brett-zamir.me)\n  //    input by: uestla\n  //    input by: Alan C\n  //    input by: Taras Bogach\n  //    input by: jpfle\n  // bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n  // bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n  // bugfixed by: Brett Zamir (http://brett-zamir.me)\n  // bugfixed by: Brett Zamir (http://brett-zamir.me)\n  //  depends on: krsort\n  //  depends on: ini_set\n  //   example 1: $trans = {'hello' : 'hi', 'hi' : 'hello'};\n  //   example 1: strtr('hi all, I said hello', $trans)\n  //   returns 1: 'hello all, I said hi'\n  //   example 2: strtr('äaabaåccasdeöoo', 'äåö','aao');\n  //   returns 2: 'aaabaaccasdeooo'\n  //   example 3: strtr('ääääääää', 'ä', 'a');\n  //   returns 3: 'aaaaaaaa'\n  //   example 4: strtr('http', 'pthxyz','xyzpth');\n  //   returns 4: 'zyyx'\n  //   example 5: strtr('zyyx', 'pthxyz','xyzpth');\n  //   returns 5: 'http'\n  //   example 6: strtr('aa', {'a':1,'aa':2});\n  //   returns 6: '2'\n\n  var fr = '',\n    i = 0,\n    j = 0,\n    lenStr = 0,\n    lenFrom = 0,\n    tmpStrictForIn = false,\n    fromTypeStr = '',\n    toTypeStr = '',\n    istr = '';\n  var tmpFrom = [];\n  var tmpTo = [];\n  var ret = '';\n  var match = false;\n\n  // Received replace_pairs?\n  // Convert to normal from->to chars\n  if (typeof from === 'object') {\n    // Not thread-safe; temporarily set to true\n    tmpStrictForIn = this.ini_set('phpjs.strictForIn', false);\n    from = this.krsort(from);\n    this.ini_set('phpjs.strictForIn', tmpStrictForIn);\n\n    for (fr in from) {\n      if (from.hasOwnProperty(fr)) {\n        tmpFrom.push(fr);\n        tmpTo.push(from[fr]);\n      }\n    }\n\n    from = tmpFrom;\n    to = tmpTo;\n  }\n\n  // Walk through subject and replace chars when needed\n  lenStr = str.length;\n  lenFrom = from.length;\n  fromTypeStr = typeof from === 'string';\n  toTypeStr = typeof to === 'string';\n\n  for (i = 0; i < lenStr; i++) {\n    match = false;\n    if (fromTypeStr) {\n      istr = str.charAt(i);\n      for (j = 0; j < lenFrom; j++) {\n        if (istr == from.charAt(j)) {\n          match = true;\n          break;\n        }\n      }\n    } else {\n      for (j = 0; j < lenFrom; j++) {\n        if (str.substr(i, from[j].length) == from[j]) {\n          match = true;\n          // Fast forward\n          i = (i + from[j].length) - 1;\n          break;\n        }\n      }\n    }\n    if (match) {\n      ret += toTypeStr ? to.charAt(j) : to[j];\n    } else {\n      ret += str.charAt(i);\n    }\n  }\n\n  return ret;\n};\n"
  },
  {
    "path": "zaycevnet/content/contents/code/zaycev.js",
    "content": "/* zaycevnet.info resolver for Tomahawk.\n *\n * Written in 2015 by Anton Romanov\n * Licensed under the Eiffel Forum License 2.\n *\n */\n\nvar ZaycevResolver = Tomahawk.extend( Tomahawk.Resolver, {\n    apiVersion: 0.9,\n\n    settings: {\n        cacheTime: 300,\n        name: 'zaycevnet',\n        weight: 76,\n        icon: '../images/icon.png',\n        timeout: 8\n    },\n\n    decodeSongID: function(song_id) {\n        song_id = decodeURIComponent(song_id).replace(/[\\-_]/gi, '');\n        var alphabet = song_id.substr(0, 16);\n        song_id = song_id.substr(16);\n        song_id = strtr(song_id, alphabet, '0123456789abcdef');\n        //I'm sure there should be less awkward way to get the raw final string\n        //with CryptoJS\n        song_id = CryptoJS.RC4.encrypt(CryptoJS.enc.Hex.parse(song_id), CryptoJS.enc.Latin1.parse(this.keyd));\n        song_id = CryptoJS.enc.Base64.parse(song_id.toString()).toString(CryptoJS.enc.Latin1);\n        return song_id;\n    },\n\n    _convertTrack: function (entry) {\n        return {\n            artist:     Tomahawk.htmlDecode(entry.artist.name),\n            track:      Tomahawk.htmlDecode(entry.name),\n            title:      Tomahawk.htmlDecode(entry.name),\n            duration:   entry.length,\n            url:        'zaycev://' + entry.uid,\n            checked:    true,\n            type:       \"track\",\n        };\n    },\n\n    init: function() {\n        var that = this;\n\n        return Tomahawk.get(\"http://zaycevnet.info/\").then(function (response){\n            var keyRe = /var\\ +keyd\\ *=[^\"]+\"([^\"]+)/gm;\n            var hostRe = /[\\.\\ ]api_host\\ *=[^\"]+\"([^\"]+)/gm;\n            that.keyd = keyRe.exec(response)[1];\n            that.api_location = 'http://' + hostRe.exec(response)[1] + '/';\n        });\n    },\n\n    search: function (params) {\n        var that = this;\n\n        return Tomahawk.get(\"http://zaycevnet.info/term/\" + params.query).then(function (response){\n            if (typeof response == 'string' || response instanceof String)\n                response = JSON.parse(response);\n            return response.map(that._convertTrack, that);\n        });\n    },\n\n    resolve: function (params) {\n        var query = [ params.artist, params.track ].join(' - ');\n        return this.search({query:query});\n    },\n\n    getStreamUrl: function(params) {\n        var that = this;\n        var id = this.decodeSongID(params.url.split('://')[1]);\n        return Tomahawk.get(this.api_location + 'audio.getlinks/', {\n            data: {\n                proxy: '4',\n                id: id,\n                format: 'jsongz',\n                hash: id\n            }\n        }).then(function (response){\n            if (typeof response == 'string' || response instanceof String)\n                response = JSON.parse(response);\n            if(response.status == 'ok')\n                return {url:response.result[0].url};\n            else\n                return {url:null};\n        });\n    }\n});\n\nTomahawk.resolver.instance = ZaycevResolver;\n"
  },
  {
    "path": "zaycevnet/content/metadata.json",
    "content": "{\n    \"name\": \"Zaycevnet\",\n    \"pluginName\": \"zaycevnet\",\n    \"author\": \"Anton Romanov\",\n    \"email\": \"\",\n    \"version\": \"0.0.1\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Streams music from zaycevnet.info\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/zaycev.js\",\n        \"icon\": \"contents/images/icon.png\",\n        \"iconWhite\": \"contents/images/iconWhite.png\",\n        \"iconBackground\": \"contents/images/iconBackground.png\",\n        \"scripts\": [\n            \"contents/code/strstr.js\"\n        ],\n        \"resources\": []\n    },\n    \"staticCapabilities\": []\n}\n"
  },
  {
    "path": "zv.fm/content/contents/code/zv.js",
    "content": "/* Zv.fm resolver for Tomahawk.\n *\n * Written in 2015 by Anton Romanov\n * Licensed under the Eiffel Forum License 2.\n *\n */\n\nvar ZvResolver = Tomahawk.extend( Tomahawk.Resolver, {\n    apiVersion: 0.9,\n\n    settings: {\n        cacheTime: 300,\n        name: 'ZV.fm',\n        weight: 76,\n        icon: '../images/icon.png',\n        timeout: 8\n    },\n\n    init: function() {\n        //To populate Cookies\n        Tomahawk.get(\"https://zv.fm/\");\n    },\n\n    search: function (params) {\n        var that = this;\n\n        var query = params.query.replace(/\\ /g, '+');\n\n        return Tomahawk.get(\"https://zv.fm/mp3/search?keywords=\" + query).then(function (response){\n            var results = [];\n            var trackRe = /href=\"\\/artist[^\"]+\"><span>([^<]+).*?\\/song\\/[^\"]+\"><span>([^<]+)<[\\s\\S]*?data-time=\"([0-9]+)\"\\s+data-sid=\"([0-9]+)\"/gm;\n            var matches;\n            while (matches = trackRe.exec(response)) {\n                results.push({\n                    type:       'track',\n                    artist:     matches[1],\n                    title:      matches[2],\n                    track:      matches[2],\n                    url:        'zvfm://' + matches[4],\n                    duration:   matches[3],\n                });\n            }\n\n            return results;\n        });\n    },\n\n    getStreamUrl: function(params) {\n        return {url: params.url.replace('zvfm://', 'https://zv.fm/download/')};\n    },\n\n    resolve: function (params) {\n        var query = [ params.artist, params.track ].join(' - ');\n        return this.search({query:query});\n    }\n});\n\nTomahawk.resolver.instance = ZvResolver;\n\n"
  },
  {
    "path": "zv.fm/content/metadata.json",
    "content": "{\n    \"name\": \"zv.fm\",\n    \"pluginName\": \"zv\",\n    \"author\": \"Anton Romanov\",\n    \"email\": \"\",\n    \"version\": \"0.0.1\",\n    \"website\": \"http://gettomahawk.com\",\n    \"description\": \"Streams music from zv.fm\",\n    \"type\": \"resolver/javascript\",\n    \"manifest\": {\n        \"main\": \"contents/code/zv.js\",\n        \"icon\": \"contents/images/icon.png\",\n        \"scripts\": [],\n        \"resources\": []\n    },\n    \"staticCapabilities\": []\n}\n"
  }
]